summaryrefslogtreecommitdiff
path: root/subversion
diff options
context:
space:
mode:
Diffstat (limited to 'subversion')
-rw-r--r--subversion/bindings/ctypes-python/csvn/core/__init__.py2
-rw-r--r--subversion/bindings/ctypes-python/csvn/types.py3
-rwxr-xr-xsubversion/bindings/ctypes-python/examples/example.py2
-rwxr-xr-xsubversion/bindings/ctypes-python/test/wc.py6
-rw-r--r--subversion/bindings/cxxhl/include/svncxxhl.hpp2
-rw-r--r--subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp85
-rw-r--r--subversion/bindings/cxxhl/include/svncxxhl/exception.hpp144
-rw-r--r--subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp20
-rw-r--r--subversion/bindings/cxxhl/src/aprwrap.hpp34
-rw-r--r--subversion/bindings/cxxhl/src/aprwrap/array.hpp280
-rw-r--r--subversion/bindings/cxxhl/src/aprwrap/hash.hpp371
-rw-r--r--subversion/bindings/cxxhl/src/aprwrap/impl.cpp110
-rw-r--r--subversion/bindings/cxxhl/src/aprwrap/pool.hpp198
-rw-r--r--subversion/bindings/cxxhl/src/exception.cpp339
-rw-r--r--subversion/bindings/cxxhl/src/private.hpp (renamed from subversion/bindings/javahl/native/libsvnjavahl.la.c)18
-rw-r--r--subversion/bindings/cxxhl/src/private/exception-private.hpp49
-rw-r--r--subversion/bindings/cxxhl/src/tristate.cpp12
-rw-r--r--subversion/bindings/cxxhl/tests/cxxhl-tests.cpp46
-rw-r--r--subversion/bindings/cxxhl/tests/test_aprwrap.cpp435
-rw-r--r--subversion/bindings/cxxhl/tests/test_exception.cpp160
-rw-r--r--subversion/bindings/javahl/README38
-rw-r--r--subversion/bindings/javahl/native/AuthnCallback.cpp365
-rw-r--r--subversion/bindings/javahl/native/AuthnCallback.hpp376
-rw-r--r--subversion/bindings/javahl/native/BlameCallback.cpp10
-rw-r--r--subversion/bindings/javahl/native/ChangelistCallback.cpp2
-rw-r--r--subversion/bindings/javahl/native/ClientContext.cpp289
-rw-r--r--subversion/bindings/javahl/native/ClientContext.h34
-rw-r--r--subversion/bindings/javahl/native/CommitCallback.cpp24
-rw-r--r--subversion/bindings/javahl/native/CommitCallback.h17
-rw-r--r--subversion/bindings/javahl/native/CommitEditor.cpp618
-rw-r--r--subversion/bindings/javahl/native/CommitEditor.h132
-rw-r--r--subversion/bindings/javahl/native/CommitMessage.cpp8
-rw-r--r--subversion/bindings/javahl/native/CopySources.cpp12
-rw-r--r--subversion/bindings/javahl/native/CreateJ.cpp563
-rw-r--r--subversion/bindings/javahl/native/CreateJ.h27
-rw-r--r--subversion/bindings/javahl/native/Credential.cpp85
-rw-r--r--subversion/bindings/javahl/native/Credential.hpp126
-rw-r--r--subversion/bindings/javahl/native/DiffOptions.cpp24
-rw-r--r--subversion/bindings/javahl/native/DiffOptions.h2
-rw-r--r--subversion/bindings/javahl/native/DiffSummaryReceiver.cpp15
-rw-r--r--subversion/bindings/javahl/native/EditorCallbacks.cpp124
-rw-r--r--subversion/bindings/javahl/native/EditorCallbacks.hpp328
-rw-r--r--subversion/bindings/javahl/native/EditorProxy.cpp566
-rw-r--r--subversion/bindings/javahl/native/EditorProxy.h153
-rw-r--r--subversion/bindings/javahl/native/EnumMapper.cpp106
-rw-r--r--subversion/bindings/javahl/native/EnumMapper.h6
-rw-r--r--subversion/bindings/javahl/native/ExternalItem.cpp176
-rw-r--r--subversion/bindings/javahl/native/ExternalItem.hpp139
-rw-r--r--subversion/bindings/javahl/native/GlobalConfig.h38
-rw-r--r--subversion/bindings/javahl/native/ImportFilterCallback.cpp5
-rw-r--r--subversion/bindings/javahl/native/InfoCallback.cpp8
-rw-r--r--subversion/bindings/javahl/native/InfoCallback.h2
-rw-r--r--subversion/bindings/javahl/native/InputStream.cpp6
-rw-r--r--subversion/bindings/javahl/native/Iterator.cpp115
-rw-r--r--subversion/bindings/javahl/native/Iterator.h64
-rw-r--r--subversion/bindings/javahl/native/JNIByteArray.cpp30
-rw-r--r--subversion/bindings/javahl/native/JNIByteArray.h9
-rw-r--r--subversion/bindings/javahl/native/JNICriticalSection.h2
-rw-r--r--subversion/bindings/javahl/native/JNIStackElement.cpp12
-rw-r--r--subversion/bindings/javahl/native/JNIStackElement.h2
-rw-r--r--subversion/bindings/javahl/native/JNIStringHolder.h1
-rw-r--r--subversion/bindings/javahl/native/JNIThreadData.cpp169
-rw-r--r--subversion/bindings/javahl/native/JNIUtil.cpp799
-rw-r--r--subversion/bindings/javahl/native/JNIUtil.h118
-rw-r--r--subversion/bindings/javahl/native/ListCallback.cpp60
-rw-r--r--subversion/bindings/javahl/native/LockTokenTable.cpp114
-rw-r--r--subversion/bindings/javahl/native/LockTokenTable.h50
-rw-r--r--subversion/bindings/javahl/native/LogMessageCallback.cpp12
-rw-r--r--subversion/bindings/javahl/native/MessageReceiver.cpp2
-rw-r--r--subversion/bindings/javahl/native/NativeStream.cpp381
-rw-r--r--subversion/bindings/javahl/native/NativeStream.hpp211
-rw-r--r--subversion/bindings/javahl/native/OperationContext.cpp657
-rw-r--r--subversion/bindings/javahl/native/OperationContext.h128
-rw-r--r--subversion/bindings/javahl/native/PatchCallback.cpp4
-rw-r--r--subversion/bindings/javahl/native/PatchCallback.h2
-rw-r--r--subversion/bindings/javahl/native/Path.cpp81
-rw-r--r--subversion/bindings/javahl/native/Path.h145
-rw-r--r--subversion/bindings/javahl/native/Prompter.cpp912
-rw-r--r--subversion/bindings/javahl/native/Prompter.h274
-rw-r--r--subversion/bindings/javahl/native/PropertyTable.cpp (renamed from subversion/bindings/javahl/native/RevpropTable.cpp)52
-rw-r--r--subversion/bindings/javahl/native/PropertyTable.h (renamed from subversion/bindings/javahl/native/RevpropTable.h)15
-rw-r--r--subversion/bindings/javahl/native/ProplistCallback.cpp12
-rw-r--r--subversion/bindings/javahl/native/RemoteSession.cpp1322
-rw-r--r--subversion/bindings/javahl/native/RemoteSession.h128
-rw-r--r--subversion/bindings/javahl/native/RemoteSessionContext.cpp125
-rw-r--r--subversion/bindings/javahl/native/RemoteSessionContext.h51
-rw-r--r--subversion/bindings/javahl/native/ReposFreezeAction.cpp2
-rw-r--r--subversion/bindings/javahl/native/ReposNotifyCallback.cpp4
-rw-r--r--subversion/bindings/javahl/native/ReposVerifyCallback.cpp88
-rw-r--r--subversion/bindings/javahl/native/ReposVerifyCallback.h75
-rw-r--r--subversion/bindings/javahl/native/Revision.cpp12
-rw-r--r--subversion/bindings/javahl/native/Revision.h1
-rw-r--r--subversion/bindings/javahl/native/RevisionRange.cpp132
-rw-r--r--subversion/bindings/javahl/native/RevisionRange.h8
-rw-r--r--subversion/bindings/javahl/native/RevisionRangeList.cpp128
-rw-r--r--subversion/bindings/javahl/native/RevisionRangeList.h (renamed from subversion/bindings/javahl/native/JNIThreadData.h)53
-rw-r--r--subversion/bindings/javahl/native/SVNBase.cpp26
-rw-r--r--subversion/bindings/javahl/native/SVNBase.h5
-rw-r--r--subversion/bindings/javahl/native/SVNClient.cpp440
-rw-r--r--subversion/bindings/javahl/native/SVNClient.h70
-rw-r--r--subversion/bindings/javahl/native/SVNRepos.cpp94
-rw-r--r--subversion/bindings/javahl/native/SVNRepos.h9
-rw-r--r--subversion/bindings/javahl/native/StateReporter.cpp191
-rw-r--r--subversion/bindings/javahl/native/StateReporter.h74
-rw-r--r--subversion/bindings/javahl/native/StatusCallback.cpp9
-rw-r--r--subversion/bindings/javahl/native/SubversionException.cpp32
-rw-r--r--subversion/bindings/javahl/native/SubversionException.hpp54
-rw-r--r--subversion/bindings/javahl/native/Utility.cpp96
-rw-r--r--subversion/bindings/javahl/native/Utility.hpp90
-rw-r--r--subversion/bindings/javahl/native/VersionExtended.cpp8
-rw-r--r--subversion/bindings/javahl/native/VersionExtended.h2
-rw-r--r--subversion/bindings/javahl/native/deprecated.cpp60
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_array.hpp267
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_base.cpp382
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp257
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp223
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp326
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_env.hpp682
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp364
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp90
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp294
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp281
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp63
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp91
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_list.cpp85
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_list.hpp307
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_object.hpp285
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp220
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_string.hpp251
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp110
-rw-r--r--subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp384
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp5
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp248
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp39
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp205
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp61
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp359
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp117
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp58
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp69
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp13
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp16
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp314
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp492
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp206
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp381
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp219
-rw-r--r--subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp174
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java69
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java118
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java67
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java2
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java541
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java248
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java386
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java836
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java162
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java521
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java42
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java15
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java40
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java46
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java38
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java232
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java50
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java1077
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java12
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java495
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java42
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java36
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java36
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java187
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java60
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java94
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java3
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java174
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java318
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java427
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java57
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java107
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java265
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java174
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java20
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java48
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java108
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java84
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java27
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java64
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java98
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java73
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java225
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java10
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java45
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java175
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java121
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java149
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java90
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java58
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java58
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java113
-rw-r--r--subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java57
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java2
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java8
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java2
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java2
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java37
-rw-r--r--subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java4
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java749
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java354
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java7
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java1444
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java100
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java163
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java807
-rw-r--r--subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java155
-rw-r--r--subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java50
-rw-r--r--subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java11
-rw-r--r--subversion/bindings/swig/INSTALL33
-rw-r--r--subversion/bindings/swig/core.i72
-rw-r--r--subversion/bindings/swig/include/apr.swg14
-rw-r--r--subversion/bindings/swig/include/proxy.py41
-rw-r--r--subversion/bindings/swig/include/proxy.swg48
-rw-r--r--subversion/bindings/swig/include/proxy_apr.swg2
-rw-r--r--subversion/bindings/swig/include/svn_containers.swg53
-rw-r--r--subversion/bindings/swig/include/svn_string.swg11
-rw-r--r--subversion/bindings/swig/include/svn_types.swg98
-rw-r--r--subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c513
-rw-r--r--subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h72
-rw-r--r--subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl__pre_perl.h33
-rw-r--r--subversion/bindings/swig/perl/native/Client.pm110
-rw-r--r--subversion/bindings/swig/perl/native/Makefile.PL.in2
-rw-r--r--subversion/bindings/swig/perl/native/Repos.pm25
-rw-r--r--subversion/bindings/swig/perl/native/core.c4929
-rw-r--r--subversion/bindings/swig/perl/native/svn_client.c3295
-rw-r--r--subversion/bindings/swig/perl/native/svn_delta.c397
-rw-r--r--subversion/bindings/swig/perl/native/svn_diff.c191
-rw-r--r--subversion/bindings/swig/perl/native/svn_fs.c3362
-rw-r--r--subversion/bindings/swig/perl/native/svn_ra.c1186
-rw-r--r--subversion/bindings/swig/perl/native/svn_repos.c3268
-rw-r--r--subversion/bindings/swig/perl/native/svn_wc.c4437
-rw-r--r--subversion/bindings/swig/perl/native/t/1repos.t41
-rw-r--r--subversion/bindings/swig/perl/native/t/3client.t43
-rw-r--r--subversion/bindings/swig/perl/native/t/6ra.t6
-rw-r--r--subversion/bindings/swig/proxy/pyrun.swg49
-rw-r--r--subversion/bindings/swig/proxy/svn_client_h.swg1
-rw-r--r--subversion/bindings/swig/proxy/svn_config_h.swg5
-rw-r--r--subversion/bindings/swig/proxy/svn_diff_h.swg3
-rw-r--r--subversion/bindings/swig/proxy/svn_fs_h.swg34
-rw-r--r--subversion/bindings/swig/proxy/svn_io_h.swg8
-rw-r--r--subversion/bindings/swig/proxy/svn_ra_h.swg27
-rw-r--r--subversion/bindings/swig/proxy/svn_repos_h.swg30
-rw-r--r--subversion/bindings/swig/proxy/svn_sorts_h.swg3
-rw-r--r--subversion/bindings/swig/proxy/svn_x509_h.swg34
-rw-r--r--subversion/bindings/swig/proxy/swig_perl_external_runtime.swg167
-rw-r--r--subversion/bindings/swig/proxy/swig_python_external_runtime.swg216
-rw-r--r--subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg171
-rw-r--r--subversion/bindings/swig/proxy/swigrun.swg125
-rw-r--r--subversion/bindings/swig/python/client.py436
-rw-r--r--subversion/bindings/swig/python/core.c3154
-rw-r--r--subversion/bindings/swig/python/core.py1192
-rw-r--r--subversion/bindings/swig/python/delta.py146
-rw-r--r--subversion/bindings/swig/python/diff.py186
-rw-r--r--subversion/bindings/swig/python/fs.py740
-rw-r--r--subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c572
-rw-r--r--subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h105
-rw-r--r--subversion/bindings/swig/python/ra.py470
-rw-r--r--subversion/bindings/swig/python/repos.py430
-rw-r--r--subversion/bindings/swig/python/svn/core.py67
-rw-r--r--subversion/bindings/swig/python/svn/repos.py53
-rw-r--r--subversion/bindings/swig/python/svn_client.c3412
-rw-r--r--subversion/bindings/swig/python/svn_delta.c662
-rw-r--r--subversion/bindings/swig/python/svn_diff.c1550
-rw-r--r--subversion/bindings/swig/python/svn_fs.c3286
-rw-r--r--subversion/bindings/swig/python/svn_ra.c1764
-rw-r--r--subversion/bindings/swig/python/svn_repos.c3258
-rw-r--r--subversion/bindings/swig/python/svn_wc.c4347
-rw-r--r--subversion/bindings/swig/python/tests/ra.py54
-rw-r--r--subversion/bindings/swig/python/tests/repository.py197
-rw-r--r--subversion/bindings/swig/python/wc.py749
-rw-r--r--subversion/bindings/swig/ruby/core.c2593
-rw-r--r--subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c55
-rw-r--r--subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h125
-rw-r--r--subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h99
-rw-r--r--subversion/bindings/swig/ruby/svn_client.c1476
-rw-r--r--subversion/bindings/swig/ruby/svn_delta.c223
-rw-r--r--subversion/bindings/swig/ruby/svn_diff.c211
-rw-r--r--subversion/bindings/swig/ruby/svn_fs.c3076
-rw-r--r--subversion/bindings/swig/ruby/svn_ra.c940
-rw-r--r--subversion/bindings/swig/ruby/svn_repos.c2500
-rw-r--r--subversion/bindings/swig/ruby/svn_wc.c2176
-rw-r--r--subversion/bindings/swig/ruby/test/my-assertions.rb4
-rw-r--r--subversion/bindings/swig/ruby/test/test_client.rb50
-rw-r--r--subversion/bindings/swig/ruby/test/test_core.rb2
-rw-r--r--subversion/bindings/swig/ruby/test/test_fs.rb9
-rw-r--r--subversion/bindings/swig/ruby/test/test_ra.rb3
-rw-r--r--subversion/bindings/swig/ruby/test/test_repos.rb2
-rw-r--r--subversion/bindings/swig/ruby/test/test_wc.rb7
-rw-r--r--subversion/bindings/swig/ruby/test/util.rb8
-rw-r--r--subversion/bindings/swig/ruby/test/windows_util.rb137
-rw-r--r--subversion/bindings/swig/svn_client.i16
-rw-r--r--subversion/bindings/swig/svn_delta.i17
-rw-r--r--subversion/bindings/swig/svn_fs.i8
-rw-r--r--subversion/bindings/swig/svn_ra.i6
-rw-r--r--subversion/bindings/swig/svn_repos.i10
-rw-r--r--subversion/bindings/swig/svn_wc.i4
-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.h28
-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.h102
-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.h856
-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.c1060
-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.c174
-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.c677
-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.c320
-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.c393
-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.c29
-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.h6
-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.c3502
-rw-r--r--subversion/libsvn_fs_fs/cached_data.h178
-rw-r--r--subversion/libsvn_fs_fs/caching.c356
-rw-r--r--subversion/libsvn_fs_fs/dag.c207
-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.c302
-rw-r--r--subversion/libsvn_fs_fs/fs.h261
-rw-r--r--subversion/libsvn_fs_fs/fs_fs.c11577
-rw-r--r--subversion/libsvn_fs_fs/fs_fs.h500
-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.c1208
-rw-r--r--subversion/libsvn_fs_fs/low_level.h230
-rw-r--r--subversion/libsvn_fs_fs/pack.c2061
-rw-r--r--subversion/libsvn_fs_fs/pack.h70
-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.c161
-rw-r--r--subversion/libsvn_fs_fs/rep-cache.h26
-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.c3964
-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.c429
-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.c1309
-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.c199
-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.c82
-rw-r--r--subversion/libsvn_ra_serf/mergeinfo.c27
-rw-r--r--subversion/libsvn_ra_serf/multistatus.c750
-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.h714
-rw-r--r--subversion/libsvn_ra_serf/replay.c955
-rw-r--r--subversion/libsvn_ra_serf/serf.c883
-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.c1549
-rw-r--r--subversion/libsvn_ra_serf/util_error.c3
-rw-r--r--subversion/libsvn_ra_serf/xml.c556
-rw-r--r--subversion/libsvn_ra_svn/client.c377
-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.c50
-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.c902
-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.c1597
-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.c95
-rw-r--r--subversion/libsvn_repos/repos.c780
-rw-r--r--subversion/libsvn_repos/repos.h5
-rw-r--r--subversion/libsvn_repos/rev_hunt.c289
-rw-r--r--subversion/libsvn_subr/adler32.c22
-rw-r--r--subversion/libsvn_subr/auth.c317
-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.c1916
-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.c201
-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.c241
-rw-r--r--subversion/libsvn_subr/dirent_uri.c94
-rw-r--r--subversion/libsvn_subr/dso.c8
-rw-r--r--subversion/libsvn_subr/eol.c23
-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.c68
-rw-r--r--subversion/libsvn_subr/hash.c291
-rw-r--r--subversion/libsvn_subr/internal_statements.h2
-rw-r--r--subversion/libsvn_subr/io.c942
-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.c17
-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.c515
-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.c357
-rw-r--r--subversion/libsvn_subr/subst.c100
-rw-r--r--subversion/libsvn_subr/sysinfo.c266
-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.c79
-rw-r--r--subversion/libsvn_subr/utf_width.c2
-rw-r--r--subversion/libsvn_subr/version.c10
-rw-r--r--subversion/libsvn_subr/win32_crashrpt.c117
-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.c62
-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.c304
-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.c202
-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.c1205
-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.h22
-rw-r--r--subversion/libsvn_wc/wc-metadata.sql35
-rw-r--r--subversion/libsvn_wc/wc-queries.h1983
-rw-r--r--subversion/libsvn_wc/wc-queries.sql466
-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.c222
-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/mod_authz_svn/INSTALL184
-rw-r--r--subversion/mod_authz_svn/mod_authz_svn.c194
-rw-r--r--subversion/mod_dav_svn/activity.c16
-rw-r--r--subversion/mod_dav_svn/authz.c5
-rw-r--r--subversion/mod_dav_svn/dav_svn.h97
-rw-r--r--subversion/mod_dav_svn/deadprops.c8
-rw-r--r--subversion/mod_dav_svn/liveprops.c73
-rw-r--r--subversion/mod_dav_svn/lock.c96
-rw-r--r--subversion/mod_dav_svn/merge.c95
-rw-r--r--subversion/mod_dav_svn/mirror.c10
-rw-r--r--subversion/mod_dav_svn/mod_dav_svn.c145
-rw-r--r--subversion/mod_dav_svn/posts/create_txn.c4
-rw-r--r--subversion/mod_dav_svn/reports/dated-rev.c12
-rw-r--r--subversion/mod_dav_svn/reports/deleted-rev.c24
-rw-r--r--subversion/mod_dav_svn/reports/file-revs.c34
-rw-r--r--subversion/mod_dav_svn/reports/get-location-segments.c45
-rw-r--r--subversion/mod_dav_svn/reports/get-locations.c57
-rw-r--r--subversion/mod_dav_svn/reports/get-locks.c76
-rw-r--r--subversion/mod_dav_svn/reports/inherited-props.c19
-rw-r--r--subversion/mod_dav_svn/reports/log.c120
-rw-r--r--subversion/mod_dav_svn/reports/mergeinfo.c17
-rw-r--r--subversion/mod_dav_svn/reports/replay.c34
-rw-r--r--subversion/mod_dav_svn/reports/update.c63
-rw-r--r--subversion/mod_dav_svn/repos.c862
-rw-r--r--subversion/mod_dav_svn/status.c115
-rw-r--r--subversion/mod_dav_svn/util.c266
-rw-r--r--subversion/mod_dav_svn/version.c260
-rw-r--r--subversion/po/de.po10796
-rw-r--r--subversion/po/es.po8
-rw-r--r--subversion/po/fr.po9
-rw-r--r--subversion/po/it.po8
-rw-r--r--subversion/po/ja.po8
-rw-r--r--subversion/po/ko.po4
-rw-r--r--subversion/po/nb.po8
-rw-r--r--subversion/po/pl.po8
-rw-r--r--subversion/po/pt_BR.po8
-rw-r--r--subversion/po/subversion.pot8135
-rw-r--r--subversion/po/sv.po4269
-rw-r--r--subversion/po/zh_CN.po10429
-rw-r--r--subversion/po/zh_TW.po8
-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.c513
-rw-r--r--subversion/svn/copy-cmd.c8
-rw-r--r--subversion/svn/diff-cmd.c58
-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.c32
-rw-r--r--subversion/svn/lock-cmd.c39
-rw-r--r--subversion/svn/log-cmd.c158
-rw-r--r--subversion/svn/merge-cmd.c9
-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.c803
-rw-r--r--subversion/svn/unlock-cmd.c40
-rw-r--r--subversion/svn/util.c62
-rw-r--r--subversion/svn_private_config.h.in42
-rw-r--r--subversion/svn_private_config.hw23
-rw-r--r--subversion/svnadmin/svnadmin.c874
-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.c312
-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.c49
-rw-r--r--subversion/svnserve/logger.c161
-rw-r--r--subversion/svnserve/logger.h79
-rw-r--r--subversion/svnserve/serve.c1498
-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
-rw-r--r--subversion/tests/cmdline/README182
-rw-r--r--subversion/tests/cmdline/atomic-ra-revprop-change.c6
-rwxr-xr-xsubversion/tests/cmdline/authz_tests.py402
-rwxr-xr-xsubversion/tests/cmdline/autoprop_tests.py21
-rwxr-xr-xsubversion/tests/cmdline/basic_tests.py541
-rwxr-xr-xsubversion/tests/cmdline/blame_tests.py278
-rwxr-xr-xsubversion/tests/cmdline/cat_tests.py41
-rwxr-xr-xsubversion/tests/cmdline/changelist_tests.py54
-rwxr-xr-xsubversion/tests/cmdline/checkout_tests.py114
-rwxr-xr-xsubversion/tests/cmdline/commit_tests.py384
-rwxr-xr-xsubversion/tests/cmdline/copy_tests.py831
-rwxr-xr-xsubversion/tests/cmdline/dav-mirror-autocheck.sh14
-rwxr-xr-xsubversion/tests/cmdline/davautocheck.sh297
-rwxr-xr-xsubversion/tests/cmdline/depth_tests.py535
-rwxr-xr-xsubversion/tests/cmdline/diff_tests.py1154
-rw-r--r--subversion/tests/cmdline/entries-dump.c38
-rwxr-xr-xsubversion/tests/cmdline/entries_tests.py28
-rwxr-xr-xsubversion/tests/cmdline/export_tests.py45
-rwxr-xr-xsubversion/tests/cmdline/externals_tests.py1414
-rwxr-xr-xsubversion/tests/cmdline/getopt_tests.py29
-rw-r--r--subversion/tests/cmdline/getopt_tests_data/svn--help_stdout3
-rw-r--r--subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout11
-rw-r--r--subversion/tests/cmdline/getopt_tests_data/svn--version_stdout24
-rw-r--r--subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout39
-rw-r--r--subversion/tests/cmdline/getopt_tests_data/svn_help_stdout3
-rwxr-xr-xsubversion/tests/cmdline/history_tests.py36
-rwxr-xr-xsubversion/tests/cmdline/import_tests.py46
-rwxr-xr-xsubversion/tests/cmdline/info_tests.py184
-rwxr-xr-xsubversion/tests/cmdline/input_validation_tests.py12
-rwxr-xr-xsubversion/tests/cmdline/iprop_authz_tests.py2
-rwxr-xr-xsubversion/tests/cmdline/iprop_tests.py64
-rw-r--r--subversion/tests/cmdline/lock-helper.c (renamed from subversion/tests/libsvn_subr/named_atomic-test-proc.c)71
-rwxr-xr-xsubversion/tests/cmdline/lock_tests.py853
-rwxr-xr-xsubversion/tests/cmdline/log_tests.py493
-rwxr-xr-xsubversion/tests/cmdline/merge_authz_tests.py227
-rwxr-xr-xsubversion/tests/cmdline/merge_automatic_tests.py137
-rwxr-xr-xsubversion/tests/cmdline/merge_reintegrate_tests.py389
-rwxr-xr-xsubversion/tests/cmdline/merge_tests.py2805
-rwxr-xr-xsubversion/tests/cmdline/merge_tree_conflict_tests.py536
-rwxr-xr-xsubversion/tests/cmdline/mergeinfo_tests.py268
-rw-r--r--subversion/tests/cmdline/mod_authz_svn_tests.py1073
-rwxr-xr-xsubversion/tests/cmdline/move_tests.py546
-rwxr-xr-xsubversion/tests/cmdline/patch_tests.py629
-rwxr-xr-xsubversion/tests/cmdline/prop_tests.py549
-rwxr-xr-xsubversion/tests/cmdline/redirect_tests.py87
-rwxr-xr-xsubversion/tests/cmdline/relocate_tests.py67
-rwxr-xr-xsubversion/tests/cmdline/resolve_tests.py149
-rwxr-xr-xsubversion/tests/cmdline/revert_tests.py236
-rwxr-xr-xsubversion/tests/cmdline/schedule_tests.py42
-rwxr-xr-xsubversion/tests/cmdline/special_tests.py234
-rwxr-xr-xsubversion/tests/cmdline/stat_tests.py357
-rwxr-xr-xsubversion/tests/cmdline/svnadmin_tests.py1582
-rw-r--r--subversion/tests/cmdline/svnadmin_tests_data/load_txdelta.dump.gzbin0 -> 7077 bytes
-rw-r--r--subversion/tests/cmdline/svnadmin_tests_data/normalization_check.dump259
-rwxr-xr-xsubversion/tests/cmdline/svnauthz_tests.py272
-rwxr-xr-xsubversion/tests/cmdline/svndumpfilter_tests.py52
-rwxr-xr-xsubversion/tests/cmdline/svnfsfs_tests.py200
-rwxr-xr-xsubversion/tests/cmdline/svnlook_tests.py57
-rwxr-xr-xsubversion/tests/cmdline/svnmucc_tests.py206
-rwxr-xr-xsubversion/tests/cmdline/svnrdump_tests.py189
-rw-r--r--subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.dumpbin0 -> 1012 bytes
-rw-r--r--subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.expected.dumpbin0 -> 1001 bytes
-rwxr-xr-xsubversion/tests/cmdline/svnserveautocheck.sh4
-rwxr-xr-xsubversion/tests/cmdline/svnsync_authz_tests.py196
-rwxr-xr-xsubversion/tests/cmdline/svnsync_tests.py163
-rw-r--r--subversion/tests/cmdline/svntest/__init__.py6
-rw-r--r--subversion/tests/cmdline/svntest/actions.py640
-rw-r--r--subversion/tests/cmdline/svntest/deeptrees.py263
-rw-r--r--subversion/tests/cmdline/svntest/factory.py24
-rw-r--r--subversion/tests/cmdline/svntest/main.py492
-rwxr-xr-xsubversion/tests/cmdline/svntest/mergetrees.py506
-rw-r--r--subversion/tests/cmdline/svntest/objects.py26
-rw-r--r--subversion/tests/cmdline/svntest/sandbox.py253
-rw-r--r--subversion/tests/cmdline/svntest/testcase.py35
-rw-r--r--subversion/tests/cmdline/svntest/tree.py5
-rw-r--r--subversion/tests/cmdline/svntest/verify.py349
-rw-r--r--subversion/tests/cmdline/svntest/wc.py76
-rwxr-xr-xsubversion/tests/cmdline/svnversion_tests.py126
-rwxr-xr-xsubversion/tests/cmdline/switch_tests.py734
-rwxr-xr-xsubversion/tests/cmdline/trans_tests.py122
-rwxr-xr-xsubversion/tests/cmdline/tree_conflict_tests.py231
-rwxr-xr-xsubversion/tests/cmdline/update_tests.py1262
-rwxr-xr-xsubversion/tests/cmdline/upgrade_tests.py217
-rw-r--r--subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2bin0 -> 4512 bytes
-rwxr-xr-xsubversion/tests/cmdline/wc_tests.py159
-rw-r--r--subversion/tests/diacritical.txt41
-rw-r--r--subversion/tests/libsvn_client/client-test.c684
-rw-r--r--subversion/tests/libsvn_client/mtcc-test.c817
-rw-r--r--subversion/tests/libsvn_delta/random-test.c35
-rw-r--r--subversion/tests/libsvn_delta/range-index-test.h27
-rw-r--r--subversion/tests/libsvn_delta/window-test.c6
-rw-r--r--subversion/tests/libsvn_diff/diff-diff3-test.c140
-rw-r--r--subversion/tests/libsvn_diff/parse-diff-test.c114
-rw-r--r--subversion/tests/libsvn_fs/fs-test.c2368
-rw-r--r--subversion/tests/libsvn_fs/locks-test.c454
-rw-r--r--subversion/tests/libsvn_fs_base/changes-test.c8
-rw-r--r--subversion/tests/libsvn_fs_base/fs-base-test.c14
-rw-r--r--subversion/tests/libsvn_fs_base/strings-reps-test.c8
-rw-r--r--subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c393
-rw-r--r--subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c1947
-rw-r--r--subversion/tests/libsvn_fs_fs/fs-fs-private-test.c434
-rw-r--r--subversion/tests/libsvn_fs_x/fs-x-pack-test.c (renamed from subversion/tests/libsvn_fs_fs/fs-pack-test.c)346
-rw-r--r--subversion/tests/libsvn_fs_x/string-table-test.c318
-rw-r--r--subversion/tests/libsvn_ra/ra-test.c696
-rw-r--r--subversion/tests/libsvn_ra_local/ra-local-test.c8
-rw-r--r--subversion/tests/libsvn_repos/dir-delta-editor.h13
-rw-r--r--subversion/tests/libsvn_repos/dump-load-test.c289
-rw-r--r--subversion/tests/libsvn_repos/repos-test.c843
-rw-r--r--subversion/tests/libsvn_subr/auth-test.c25
-rw-r--r--subversion/tests/libsvn_subr/bit-array-test.c140
-rw-r--r--subversion/tests/libsvn_subr/cache-test.c122
-rw-r--r--subversion/tests/libsvn_subr/checksum-test.c248
-rw-r--r--subversion/tests/libsvn_subr/compat-test.c7
-rw-r--r--subversion/tests/libsvn_subr/config-test.c193
-rw-r--r--subversion/tests/libsvn_subr/crypto-test.c6
-rw-r--r--subversion/tests/libsvn_subr/dirent_uri-test.c146
-rw-r--r--subversion/tests/libsvn_subr/error-code-test.c6
-rw-r--r--subversion/tests/libsvn_subr/error-test.c12
-rw-r--r--subversion/tests/libsvn_subr/hashdump-test.c11
-rw-r--r--subversion/tests/libsvn_subr/io-test.c370
-rw-r--r--subversion/tests/libsvn_subr/mergeinfo-test.c31
-rw-r--r--subversion/tests/libsvn_subr/named_atomic-test-common.h245
-rw-r--r--subversion/tests/libsvn_subr/named_atomic-test.c761
-rw-r--r--subversion/tests/libsvn_subr/opt-test.c6
-rw-r--r--subversion/tests/libsvn_subr/packed-data-test.c577
-rw-r--r--subversion/tests/libsvn_subr/path-test.c137
-rw-r--r--subversion/tests/libsvn_subr/prefix-string-test.c154
-rw-r--r--subversion/tests/libsvn_subr/priority-queue-test.c240
-rw-r--r--subversion/tests/libsvn_subr/revision-test.c14
-rw-r--r--subversion/tests/libsvn_subr/root-pools-test.c137
-rw-r--r--subversion/tests/libsvn_subr/skel-test.c8
-rw-r--r--subversion/tests/libsvn_subr/spillbuf-test.c243
-rw-r--r--subversion/tests/libsvn_subr/sqlite-test.c186
-rw-r--r--subversion/tests/libsvn_subr/stream-test.c124
-rw-r--r--subversion/tests/libsvn_subr/string-test.c259
-rw-r--r--subversion/tests/libsvn_subr/subst_translate-test.c11
-rw-r--r--subversion/tests/libsvn_subr/time-test.c12
-rw-r--r--subversion/tests/libsvn_subr/translate-test.c189
-rw-r--r--subversion/tests/libsvn_subr/utf-test.c549
-rw-r--r--subversion/tests/libsvn_subr/x509-test.c848
-rw-r--r--subversion/tests/libsvn_wc/conflict-data-test.c178
-rw-r--r--subversion/tests/libsvn_wc/db-test.c634
-rw-r--r--subversion/tests/libsvn_wc/entries-compat.c388
-rw-r--r--subversion/tests/libsvn_wc/op-depth-test.c3547
-rw-r--r--subversion/tests/libsvn_wc/pristine-store-test.c138
-rw-r--r--subversion/tests/libsvn_wc/utils.c265
-rw-r--r--subversion/tests/libsvn_wc/utils.h55
-rw-r--r--subversion/tests/libsvn_wc/wc-lock-tester.c33
-rw-r--r--subversion/tests/libsvn_wc/wc-queries-test.c223
-rw-r--r--subversion/tests/libsvn_wc/wc-test-queries.h112
-rw-r--r--subversion/tests/libsvn_wc/wc-test-queries.sql78
-rw-r--r--subversion/tests/libsvn_wc/wc-test.c143
-rw-r--r--subversion/tests/svn_test.h148
-rw-r--r--subversion/tests/svn_test_fs.c265
-rw-r--r--subversion/tests/svn_test_fs.h24
-rw-r--r--subversion/tests/svn_test_main.c660
-rw-r--r--subversion/tests/templates/empty-fsfs-v4.zipbin0 -> 19638 bytes
-rw-r--r--subversion/tests/templates/empty-fsfs-v6.zipbin0 -> 22422 bytes
-rw-r--r--subversion/tests/templates/greek-fsfs-v4.zipbin0 -> 22771 bytes
-rw-r--r--subversion/tests/templates/greek-fsfs-v6.zipbin0 -> 25498 bytes
-rw-r--r--subversion/tests/templates/greek.dump260
1060 files changed, 283128 insertions, 94995 deletions
diff --git a/subversion/bindings/ctypes-python/csvn/core/__init__.py b/subversion/bindings/ctypes-python/csvn/core/__init__.py
index 46395d9..c098b1e 100644
--- a/subversion/bindings/ctypes-python/csvn/core/__init__.py
+++ b/subversion/bindings/ctypes-python/csvn/core/__init__.py
@@ -107,7 +107,7 @@ class Pool(object):
# Make sure that the parent object is valid
self._parent_pool.assert_valid()
- # Refer to self using a weakrefrence so that we don't
+ # Refer to self using a weakreference so that we don't
# create a reference cycle
weakself = weakref.ref(self)
diff --git a/subversion/bindings/ctypes-python/csvn/types.py b/subversion/bindings/ctypes-python/csvn/types.py
index 97253b1..8a2369e 100644
--- a/subversion/bindings/ctypes-python/csvn/types.py
+++ b/subversion/bindings/ctypes-python/csvn/types.py
@@ -237,7 +237,8 @@ class Stream(object):
self.pool = Pool()
self.buffer = buffer
self.stream = svn_stream_create(c_void_p(), self.pool)
- svn_stream_set_read(self.stream, svn_read_fn_t(self._read))
+ svn_stream_set_read2(self.stream, NULL, # only full read support
+ svn_read_fn_t(self._read))
svn_stream_set_write(self.stream, svn_write_fn_t(self._write))
if not disown:
svn_stream_set_close(self.stream, svn_close_fn_t(self._close))
diff --git a/subversion/bindings/ctypes-python/examples/example.py b/subversion/bindings/ctypes-python/examples/example.py
index 9afdbb5..0a717be 100755
--- a/subversion/bindings/ctypes-python/examples/example.py
+++ b/subversion/bindings/ctypes-python/examples/example.py
@@ -101,7 +101,7 @@ txn.mkdir("blahdir/dj/a/b/c/d/e/f")
txn.mkdir("blahdir/dj/a/b/c/d/e/f/g")
txn.upload("blahdir/dj/a/b/c/d/e/f/g/h.txt", "/tmp/contents.txt")
-rev = txn.commit("create blahdir and descendents")
+rev = txn.commit("create blahdir and descendants")
print("Committed revision %d" % rev)
def ignore(path, kind):
diff --git a/subversion/bindings/ctypes-python/test/wc.py b/subversion/bindings/ctypes-python/test/wc.py
index 6d57902..dee438a 100755
--- a/subversion/bindings/ctypes-python/test/wc.py
+++ b/subversion/bindings/ctypes-python/test/wc.py
@@ -168,7 +168,7 @@ class WCTestCase(unittest.TestCase):
path = "%s/branches/0.x/README.txt" % wc_location
diffstring="""Index: """+path+"""
===================================================================
---- """+path+"""\t(revision 0)
+--- """+path+"""\t(nonexistent)
+++ """+path+"""\t(revision 5)
@@ -0,0 +1,9 @@
+This repository is for test purposes only. Any resemblance to any other
@@ -233,7 +233,7 @@ class WCTestCase(unittest.TestCase):
self.wc.info(path="trunk/README.txt",
info_func=self._info_receiver)
if not self.last_info.lock:
- self.fail("Lock not aquired")
+ self.fail("Lock not acquired")
def test_unlock(self):
path = "%s/trunk/README.txt" % wc_location
@@ -241,7 +241,7 @@ class WCTestCase(unittest.TestCase):
self.wc.info(path=path,
info_func=self._info_receiver)
if not self.last_info.lock:
- self.fail("Lock not aquired")
+ self.fail("Lock not acquired")
self.wc.unlock([path])
self.wc.info(path="trunk/README.txt",
diff --git a/subversion/bindings/cxxhl/include/svncxxhl.hpp b/subversion/bindings/cxxhl/include/svncxxhl.hpp
index 29b618b..0175bdf 100644
--- a/subversion/bindings/cxxhl/include/svncxxhl.hpp
+++ b/subversion/bindings/cxxhl/include/svncxxhl.hpp
@@ -32,6 +32,6 @@
#include "svncxxhl/exception.hpp"
#include "svncxxhl/tristate.hpp"
-namespace svn = ::subversion::cxxhl::version_1_9_dev;
+namespace SVN = ::apache::subversion::cxxhl;
#endif // SVN_CXXHL_HPP
diff --git a/subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp b/subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp
index 264e533..28c99f1 100644
--- a/subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp
+++ b/subversion/bindings/cxxhl/include/svncxxhl/_compat.hpp
@@ -28,64 +28,117 @@
#ifndef SVN_CXXHL_COMPAT_HPP
#define SVN_CXXHL_COMPAT_HPP
-// Configuration test: std::shared_ptr<>
+// Configuration test: std::shared_ptr<> and friends
// Currently detects: clang++, g++, msvc-2010+
-#ifndef SVN_CXXHL_HAVE_STD_SHARED_PTR
+#ifndef SVN_CXXHL_HAVE_STD_SMART_PTRS
# if (defined(__clang__) && __cplusplus >= 201103L) \
|| (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__)) \
|| (defined(_MSC_VER) && _MSC_VER >= 1600)
-# define SVN_CXXHL_HAVE_STD_SHARED_PTR
+# define SVN_CXXHL_HAVE_STD_SMART_PTRS
# endif // config test: std::shared_ptr<>
-#endif // SVN_CXXHL_HAVE_STD_SHARED_PTR
+#endif // SVN_CXXHL_HAVE_STD_SMART_PTRS
-// Configuration test: std::tr1::shared_ptr<>
+// Configuration test: std::tr1::shared_ptr<> and friends
// Currently detects: clang++, g++
-#ifndef SVN_CXXHL_HAVE_STD_SHARED_PTR
-# ifndef SVN_CXXHL_HAVE_STD_TR1_SHARED_PTR
+#ifndef SVN_CXXHL_HAVE_STD_SMART_PTRS
+# ifndef SVN_CXXHL_HAVE_STD_TR1_SMART_PTRS
# if defined(__GNUC__) \
&& (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1)
-# define SVN_CXXHL_HAVE_STD_TR1_SHARED_PTR
+# define SVN_CXXHL_HAVE_STD_TR1_SMART_PTRS
# endif // config test: std::tr1::shared_ptr<>
-# endif // SVN_CXXHL_HAVE_STD_TR1_SHARED_PTR
-#endif // SVN_CXXHL_HAVE_STD_SHARED_PTR
+# endif // SVN_CXXHL_HAVE_STD_TR1_SMART_PTRS
+#endif // SVN_CXXHL_HAVE_STD_SMART_PTRS
-#if defined(SVN_CXXHL_HAVE_STD_SHARED_PTR)
+#if defined(SVN_CXXHL_HAVE_STD_SMART_PTRS)
#include <memory>
+namespace apache {
namespace subversion {
namespace cxxhl {
namespace compat {
+using std::weak_ptr;
using std::shared_ptr;
+using std::enable_shared_from_this;
} // namespace compat
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
-#elif defined(SVN_CXXHL_HAVE_STD_TR1_SHARED_PTR)
+#elif defined(SVN_CXXHL_HAVE_STD_TR1_SMART_PTRS)
#include <tr1/memory>
+namespace apache {
namespace subversion {
namespace cxxhl {
namespace compat {
+using std::tr1::weak_ptr;
using std::tr1::shared_ptr;
+using std::tr1::enable_shared_from_this;
} // namespace compat
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
#else
-// We need shared_ptr<> from somewhere. If we cannot find it in ::std
-// given known compiler characteristics, then try boost as a last
-// resort.
+// We need smart pointers from somewhere. If we cannot find them in
+// ::std given known compiler characteristics, then try Boost as a
+// last resort.
+#define SVN_CXXHL_USING_BOOST
#include <boost/shared_ptr.hpp>
+namespace apache {
namespace subversion {
namespace cxxhl {
namespace compat {
+using boost::weak_ptr;
using boost::shared_ptr;
+using boost::enable_shared_from_this;
} // namespace compat
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
-#endif // SVN_CXXHL_HAVE_STD_SHARED_PTR
+#endif // SVN_CXXHL_HAVE_STD_SMART_PTRS
+
+// Configuration test: noncopyable mixin.
+#ifdef SVN_CXXHL_USING_BOOST
+
+#include <boost/noncopyable.hpp>
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace compat {
+using boost::noncopyable;
+} // namespace compat
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#else // !SVN_CXXHL_USING_BOOST
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace compat {
+namespace noncopyable_
+{
+class noncopyable
+{
+protected:
+ noncopyable() {}
+ ~noncopyable() {}
+private:
+ noncopyable(const noncopyable&);
+ noncopyable& operator=(const noncopyable&);
+};
+} // namespace noncopyable_
+typedef noncopyable_::noncopyable noncopyable;
+} // namespace compat
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#endif // SVN_CXXHL_USING_BOOST
#endif // SVN_CXXHL_COMPAT_HPP
diff --git a/subversion/bindings/cxxhl/include/svncxxhl/exception.hpp b/subversion/bindings/cxxhl/include/svncxxhl/exception.hpp
index 3a1b9a0..13e5fbd 100644
--- a/subversion/bindings/cxxhl/include/svncxxhl/exception.hpp
+++ b/subversion/bindings/cxxhl/include/svncxxhl/exception.hpp
@@ -35,9 +35,7 @@
#include "svncxxhl/_compat.hpp"
-// Forward declaration of implementation-specific structure
-struct svn_error_t;
-
+namespace apache {
namespace subversion {
namespace cxxhl {
@@ -45,56 +43,109 @@ namespace compat {} // Announce the compat namespace for shared_ptr lookup
namespace detail {
// Forward declaration of implementation-specific structure
-class error_description;
+class ErrorDescription;
} // namespace detail
-namespace version_1_9_dev {
-
-class error : public std::exception
+/**
+ * Exceptions generated by the C++HL implementation.
+ */
+class InternalError : public std::exception
{
public:
- typedef compat::shared_ptr<error> shared_ptr;
-
- error(const char* description, int error_code);
- error(const char* description, int error_code, shared_ptr nested_error);
+ explicit InternalError(const char* description);
- error(const error& that) throw();
- error& operator=(const error& that) throw();
- virtual ~error() throw();
+ InternalError(const InternalError& that) throw();
+ InternalError& operator= (const InternalError& that) throw();
+ virtual ~InternalError() throw();
/**
- * Returns the error code associated with the exception.
+ * Returns the message associated with this exception object.
*/
- virtual int code() const throw() { return m_errno; }
+ virtual const char* what() const throw();
+
+protected:
+ typedef compat::shared_ptr<detail::ErrorDescription> description_ptr;
+ explicit InternalError(description_ptr description) throw();
+ description_ptr m_description;
+};
+
+/**
+ * Encapsulate a stack of Subversion error codes and messages.
+ */
+class Error : public InternalError
+{
+public:
+ Error(const Error& that) throw();
+ Error& operator=(const Error& that) throw();
+ virtual ~Error() throw();
/**
- * Returns a shared pointer to the nested exception object, if any.
+ * Returns the error code associated with the top-level error that
+ * caused the exception.
*/
- virtual shared_ptr nested() const throw() { return m_nested; }
-
- /// Returns the message associated with this exception object.
- virtual const char* what() const throw();
+ virtual int code() const throw();
/**
* Error message description.
- *
- * The first element of this pair is the error code, the second the
- * associated error message. If the error code is 0, the message
- * describes the location in the source code where the error was
- * generated from.
*/
- typedef std::pair<int, std::string> message;
+ class Message
+ {
+ public:
+ /**
+ * Create a message object given an error code and error message.
+ */
+ Message(int errval, const std::string& message)
+ : m_errno(errval),
+ m_message(message),
+ m_trace(false)
+ {}
+
+ /**
+ * Create a message object given an error code and error message,
+ * and set the flag that tells if this is a debugging traceback entry.
+ */
+ Message(int errval, const std::string& message, bool trace)
+ : m_errno(errval),
+ m_message(message),
+ m_trace(trace)
+ {}
+
+ /**
+ * Return the error code.
+ */
+ int code() const throw() { return m_errno; }
+
+ /**
+ * Return the error message.
+ */
+ const std::string& message() const throw() { return m_message; }
+
+ /**
+ * Return the generic error message associated with the error code.
+ */
+ const char* generic_message() const;
+
+ /**
+ * Check if this message is in fact a debugging traceback entry.
+ */
+ bool trace() const throw() { return m_trace; }
+
+ private:
+ int m_errno;
+ std::string m_message;
+ bool m_trace;
+ };
/**
* The list of messages associated with an error.
*/
- typedef std::vector<message> message_list;
+ typedef std::vector<Message> MessageList;
/**
* Returns the complete list of error messages, including those from
- * nested exceptions.
+ * nested errors.
*/
- virtual message_list messages() const
+ virtual MessageList messages() const
{
return compile_messages(false);
}
@@ -106,39 +157,32 @@ public:
* Traceback is only available if the Subversion libraries were
* compiled with tracing enabled.
*/
- virtual message_list traced_messages() const
+ virtual MessageList traced_messages() const
{
return compile_messages(true);
}
-public:
- /** Used internally by the implementation. */
- static void throw_svn_error(svn_error_t*);
-
protected:
- error(int error_code, detail::error_description* description) throw();
-
-private:
- std::vector<message> compile_messages(bool show_traces) const;
-
- int m_errno; /**< The (SVN or APR) error code. */
- shared_ptr m_nested; /**< Optional pointer to nessted error. */
- /** Error description and trace location information. */
- detail::error_description* m_description;
+ explicit Error(description_ptr description) throw()
+ : InternalError(description)
+ {}
+ MessageList compile_messages(bool show_traces) const;
};
-class cancelled : public error
+/**
+ * Thrown instead of Error when the error chain contains a
+ * @c SVN_ERR_CANCELLED error code.
+ */
+class Cancelled : public Error
{
- friend void error::throw_svn_error(svn_error_t*);
-
protected:
- cancelled(int error_code, detail::error_description* description) throw()
- : error(error_code, description)
+ explicit Cancelled(description_ptr description) throw()
+ : Error(description)
{}
};
-} // namespace version_1_9_dev
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
#endif // SVN_CXXHL_EXCEPTION_HPP
diff --git a/subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp b/subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp
index 15a60b4..2b52ef1 100644
--- a/subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp
+++ b/subversion/bindings/cxxhl/include/svncxxhl/tristate.hpp
@@ -28,37 +28,37 @@
#ifndef SVN_CXXHL_TRISTATE_HPP
#define SVN_CXXHL_TRISTATE_HPP
+namespace apache {
namespace subversion {
namespace cxxhl {
-namespace version_1_9_dev {
-class tristate
+class Tristate
{
public:
- static const tristate TRUE;
- static const tristate FALSE;
- static const tristate UNKNOWN;
+ static const Tristate TRUE;
+ static const Tristate FALSE;
+ static const Tristate UNKNOWN;
- tristate(const tristate& that) throw()
+ Tristate(const Tristate& that) throw()
: m_value(that.m_value)
{}
- bool operator==(const tristate& that) const throw()
+ bool operator==(const Tristate& that) const throw()
{ return m_value == that.m_value; }
- bool operator!=(const tristate& that) const throw()
+ bool operator!=(const Tristate& that) const throw()
{ return !(*this == that); }
bool known() const throw()
{ return *this != UNKNOWN; }
private:
- explicit tristate(short int value) throw();
+ explicit Tristate(short int value) throw();
short int m_value;
};
-} // namespace version_1_9_dev
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
#endif // SVN_CXXHL_TRISTATE_HPP
diff --git a/subversion/bindings/cxxhl/src/aprwrap.hpp b/subversion/bindings/cxxhl/src/aprwrap.hpp
new file mode 100644
index 0000000..f1525f3
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/aprwrap.hpp
@@ -0,0 +1,34 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_CXXHL_PRIVATE_APRWRAP_H
+#define SVN_CXXHL_PRIVATE_APRWRAP_H
+
+// Expose the whole APR wrapper API and alias the namespace
+#include "aprwrap/pool.hpp"
+#include "aprwrap/hash.hpp"
+#include "aprwrap/array.hpp"
+
+namespace APR = ::apache::subversion::cxxhl::apr;
+
+#endif // SVN_CXXHL_PRIVATE_APRWRAP_H
diff --git a/subversion/bindings/cxxhl/src/aprwrap/array.hpp b/subversion/bindings/cxxhl/src/aprwrap/array.hpp
new file mode 100644
index 0000000..681489e
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/aprwrap/array.hpp
@@ -0,0 +1,280 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_CXXHL_PRIVATE_APRWRAP_ARRAY_H
+#define SVN_CXXHL_PRIVATE_APRWRAP_ARRAY_H
+
+#include <stdexcept>
+
+#include <apr_tables.h>
+#include "pool.hpp"
+
+#include "svn_private_config.h"
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace apr {
+
+/**
+ * Proxy for an APR array.
+ *
+ * This class does not own the array. The array's lifetime is tied to
+ * its pool. The caller is responsible for making sure that the
+ * array's lifetime is longer than this proxy object's.
+ */
+template<typename T> class Array
+{
+public:
+ typedef T value_type;
+ typedef int size_type;
+
+ /**
+ * Create and proxy a new APR array allocated from @a pool.
+ * Reserve space for @a nelts array elements.
+ */
+ explicit Array(const Pool& pool, size_type nelts = 0) throw()
+ : m_array(apr_array_make(pool.get(), nelts, sizeof(value_type)))
+ {}
+
+ /**
+ * Create a new proxy for the APR array @a array.
+ */
+ explicit Array(apr_array_header_t* array)
+ : m_array(array)
+ {
+ if (m_array->elt_size != sizeof(value_type))
+ throw std::invalid_argument(
+ _("APR array element size does not match template parameter"));
+ }
+
+ /**
+ * @return The wrapped APR array.
+ */
+ apr_array_header_t* array() const throw()
+ {
+ return m_array;
+ }
+
+ /**
+ * @return the number of elements in the wrapped APR array.
+ */
+ size_type size() const throw()
+ {
+ return m_array->nelts;
+ }
+
+ /**
+ * @return An immutable reference to the array element at @a index.
+ */
+ const value_type& operator[](size_type index) const throw()
+ {
+ return APR_ARRAY_IDX(m_array, index, value_type);
+ }
+
+ /**
+ * @return An immutable reference to the array element at @a index.
+ * Like operator[] but perfoms a range check on the index.
+ */
+ const value_type& at(size_type index) const
+ {
+ if (index < 0 || index >= size())
+ throw std::out_of_range(_("APR array index is out of range"));
+ return (*this)[index];
+ }
+
+ /**
+ * @return A mutable reference to the array element at @a index.
+ */
+ value_type& operator[](size_type index) throw()
+ {
+ return APR_ARRAY_IDX(m_array, index, value_type);
+ }
+
+ /**
+ * @return A mutable reference to the array element at @a index.
+ * Like operator[] but perfoms a range check on the index.
+ */
+ value_type& at(size_type index)
+ {
+ if (index < 0 || index >= size())
+ throw std::out_of_range(_("APR array index is out of range"));
+ return (*this)[index];
+ }
+
+ /**
+ * Push @a value onto the end of the APR array.
+ */
+ void push(const value_type& value) throw()
+ {
+ APR_ARRAY_PUSH(m_array, value_type) = value;
+ }
+
+ /**
+ * Pop a value from the end of the array.
+ * @return A pointer to the value that was removed, or @c NULL if
+ * the array was empty.
+ */
+ value_type* pop() throw()
+ {
+ return static_cast<value_type*>(apr_array_pop(m_array));
+ }
+
+ /**
+ * Abstract base class for mutable iteration callback functors.
+ */
+ struct Iteration
+ {
+ /**
+ * Called by Array::iterate for every value in the array.
+ * @return @c false to terminate the iteration, @c true otherwise.
+ */
+ virtual bool operator() (value_type& value) = 0;
+ };
+
+ /**
+ * Iterate over all the values pairs in the array, invoking
+ * @a callback for each one.
+ */
+ void iterate(Iteration& callback)
+ {
+ for (size_type n = 0; n < size(); ++n)
+ if (!callback((*this)[n]))
+ break;
+ }
+
+ /**
+ * Abstract base class for immutable iteration callback functors.
+ */
+ struct ConstIteration
+ {
+ /**
+ * Called by Array::iterate for every value in the array.
+ * @return @c false to terminate the iteration, @c true otherwise.
+ */
+ virtual bool operator() (const value_type& value) = 0;
+ };
+
+ /**
+ * Iterate over all the values pairs in the array, invoking
+ * @a callback for each one.
+ */
+ void iterate(ConstIteration& callback) const
+ {
+ for (size_type n = 0; n < size(); ++n)
+ if (!callback((*this)[n]))
+ break;
+ }
+
+private:
+ apr_array_header_t* const m_array; ///< The wrapperd APR array.
+};
+
+
+/**
+ * Proxy for an immutable APR array.
+ */
+template<typename T>
+class ConstArray : private Array<T>
+{
+ typedef Array<T> inherited;
+
+public:
+ typedef typename inherited::value_type value_type;
+ typedef typename inherited::size_type size_type;
+
+ /**
+ * Create a new proxy for the APR array wrapped by @a that.
+ */
+ ConstArray(const ConstArray& that) throw()
+ : inherited(that)
+ {}
+
+ /**
+ * Create a new proxy for the APR array wrapped by @a that.
+ */
+ explicit ConstArray(const inherited& that) throw()
+ : inherited(that)
+ {}
+
+ /**
+ * Create a new proxy for the APR array @a array.
+ */
+ explicit ConstArray(const apr_array_header_t* array)
+ : inherited(const_cast<apr_array_header_t*>(array))
+ {}
+
+ /**
+ * @return The wrapped APR array.
+ */
+ const apr_array_header_t* array() const throw()
+ {
+ return inherited::array();
+ }
+
+ /**
+ * @return The number of elements in the wrapped APR array.
+ */
+ size_type size() const throw()
+ {
+ return inherited::size();
+ }
+
+ /**
+ * @return An immutable reference to the array element at @a index.
+ */
+ const value_type& operator[](size_type index) const throw()
+ {
+ return inherited::operator[](index);
+ }
+
+ /**
+ * @return An immutable reference to the array element at @a index.
+ * Like operator[] but perfoms a range check on the index.
+ */
+ const value_type& at(size_type index) const
+ {
+ return inherited::at(index);
+ }
+
+ /**
+ * Abstract base class for immutable iteration callback functors.
+ */
+ typedef typename inherited::ConstIteration Iteration;
+
+ /**
+ * Iterate over all the values pairs in the array, invoking
+ * @a callback for each one.
+ */
+ void iterate(Iteration& callback) const
+ {
+ inherited::iterate(callback);
+ }
+};
+
+} // namespace apr
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#endif // SVN_CXXHL_PRIVATE_APRWRAP_HASH_H
diff --git a/subversion/bindings/cxxhl/src/aprwrap/hash.hpp b/subversion/bindings/cxxhl/src/aprwrap/hash.hpp
new file mode 100644
index 0000000..d779cb3
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/aprwrap/hash.hpp
@@ -0,0 +1,371 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_CXXHL_PRIVATE_APRWRAP_HASH_H
+#define SVN_CXXHL_PRIVATE_APRWRAP_HASH_H
+
+#include <apr_hash.h>
+#include "pool.hpp"
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace apr {
+
+// Template forward declaration
+template<typename T, typename V, apr_ssize_t KeySize = APR_HASH_KEY_STRING>
+class Hash;
+
+/**
+ * Proxy for an APR hash table.
+ * This is a template specialization for the default hash type.
+ */
+template<>
+class Hash<void, void>
+{
+public:
+ struct Iteration;
+
+ /**
+ * Iterate over all the key-value pairs in the hash table, invoking
+ * @a callback for each pair.
+ * Uses @a scratch_pool for temporary allocations.
+ */
+ void iterate(Iteration& callback, const Pool& scratch_pool);
+
+public:
+ /**
+ * Proxy for a key in an APR hash table.
+ * This is a template specialization for the default hash key type.
+ */
+ class Key
+ {
+ public:
+ typedef const void* key_type;
+ typedef apr_ssize_t size_type;
+
+ /**
+ * Public constructor. Uses the template @a Size parameter.
+ */
+ Key(key_type key) throw()
+ : m_key(key), m_size(APR_HASH_KEY_STRING)
+ {}
+
+ /**
+ * Get the value of the key.
+ */
+ key_type get() const throw() { return m_key; }
+
+ /**
+ * Get the size of the key.
+ */
+ size_type size() const throw() { return m_size; }
+
+ protected:
+ /**
+ * Constructor used by the generic template, specializations and
+ * hash table wrapper. Does not make assumptions about the key size.
+ */
+ Key(key_type key, size_type size) throw()
+ : m_key(key), m_size(size)
+ {}
+
+ /**
+ * The hash table wrapper must be able to call the protected constructor.
+ */
+ friend void Hash::iterate(Hash::Iteration&, const Pool&);
+
+ private:
+ const key_type m_key; ///< Immutable reference to the key
+ const size_type m_size; ///< The size of the key
+ };
+
+public:
+ typedef Key::key_type key_type;
+ typedef void* value_type;
+ typedef unsigned int size_type;
+
+ /**
+ * Create and proxy a new APR hash table in @a pool.
+ */
+ explicit Hash(const Pool& pool) throw()
+ : m_hash(apr_hash_make(pool.get()))
+ {}
+
+ /**
+ * Create and proxy a new APR hash table in @a pool, using @a
+ * hash_func as the hash function.
+ */
+ explicit Hash(const Pool& pool, apr_hashfunc_t hash_func) throw()
+ : m_hash(apr_hash_make_custom(pool.get(), hash_func))
+ {}
+
+ /**
+ * Create a proxy for the APR hash table @a hash.
+ */
+ explicit Hash(apr_hash_t* hash)
+ : m_hash(hash)
+ {}
+
+ /**
+ * Return the wrapped APR hash table.
+ */
+ apr_hash_t* hash() const throw()
+ {
+ return m_hash;
+ }
+
+ /**
+ * Return the number of key-value pairs in the wrapped hash table.
+ */
+ size_type size() const throw()
+ {
+ return apr_hash_count(m_hash);
+ }
+
+ /**
+ * Set @a key = @a value in the wrapped hash table.
+ */
+ void set(const Key& key, value_type value) throw()
+ {
+ apr_hash_set(m_hash, key.get(), key.size(), value);
+ }
+
+ /**
+ * Retrieve the value associated with @a key.
+ */
+ value_type get(const Key& key) const throw()
+ {
+ return apr_hash_get(m_hash, key.get(), key.size());
+ }
+
+ /**
+ * Delete the entry for @a key.
+ */
+ void del(const Key& key) throw()
+ {
+ apr_hash_set(m_hash, key.get(), key.size(), NULL);
+ }
+
+ /**
+ * Abstract base class for iteration callback functors.
+ */
+ struct Iteration
+ {
+ /**
+ * Called by Hash::iterate for every key-value pair in the hash table.
+ * @return @c false to terminate the iteration, @c true otherwise.
+ */
+ virtual bool operator() (const Key& key, value_type value) = 0;
+ };
+
+protected:
+ typedef const void* const_value_type;
+
+ /**
+ * Set @a key = @a value in the wrapped hash table. Overloaded for
+ * deroved template instantiations with constant values; for
+ * example, Hash<char, const char>.
+ */
+ void set(const Key& key, const_value_type const_value) throw()
+ {
+ set(key, const_cast<value_type>(const_value));
+ }
+
+private:
+ apr_hash_t* const m_hash; ///< The wrapped APR hash table.
+};
+
+
+/**
+ * Proxy for an APR hash table: the template.
+ *
+ * This class does not own the hash table. The hash table's lifetime
+ * is tied to its pool. The caller is responsible for making sure that
+ * the hash table's lifetime is longer than this proxy object's.
+ */
+template<typename K, typename V, apr_ssize_t KeySize>
+class Hash : private Hash<void, void>
+{
+ typedef Hash<void, void> inherited;
+
+public:
+ /**
+ * Proxy for a key in an APR hash table.
+ *
+ * This class does not own the key; it is the caller's responsibility
+ * to make sure that the key's lifetime is longer than the proxy
+ * object's.
+ */
+ class Key : private inherited::Key
+ {
+ typedef Hash<void, void>::Key inherited;
+
+ /**
+ * The wrapper must be able to call the private constructor and
+ * convert references to the base class.
+ */
+ friend class Hash;
+
+ public:
+ typedef const K* key_type;
+ typedef inherited::size_type size_type;
+
+ Key(key_type key) throw()
+ : inherited(key, KeySize)
+ {}
+
+ /**
+ * Get the value of the key.
+ */
+ key_type get() const throw()
+ {
+ return static_cast<key_type>(inherited::get());
+ }
+
+ /**
+ * Get the size of the key.
+ */
+ size_type size() const throw()
+ {
+ return inherited::size();
+ }
+
+ private:
+ /**
+ * Conversion constructor used by the derived iteration class.
+ */
+ explicit Key(const inherited& that) throw()
+ : inherited(that)
+ {}
+ };
+
+public:
+ typedef typename Key::key_type key_type;
+ typedef V* value_type;
+
+ /**
+ * Create and proxy a new APR hash table allocated from @a pool.
+ */
+ explicit Hash(const Pool& pool) throw()
+ : inherited(pool)
+ {}
+
+ /**
+ * Create and proxy a new APR hash table allocated from @a pool,
+ * using @a hash_func as the hash function.
+ */
+ explicit Hash(const Pool& pool, apr_hashfunc_t hash_func) throw()
+ : inherited(pool, hash_func)
+ {}
+
+ /**
+ * Create a proxy for the APR hash table @a hash.
+ */
+ explicit Hash(apr_hash_t* hash)
+ : inherited(hash)
+ {}
+
+ /**
+ * @return The wrapped APR hash table.
+ */
+ apr_hash_t* hash() const throw()
+ {
+ return inherited::hash();
+ }
+
+ /**
+ * Return the number of key-value pairs in the wrapped hash table.
+ */
+ size_type size() const throw()
+ {
+ return inherited::size();
+ }
+
+ /**
+ * Set @a key = @a value in the wrapped hash table.
+ */
+ void set(const Key& key, value_type value) throw()
+ {
+ inherited::set(inherited::Key(key), value);
+ }
+
+ /**
+ * Retrieve the value associated with @a key.
+ */
+ value_type get(const Key& key) const throw()
+ {
+ return static_cast<value_type>(inherited::get(inherited::Key(key)));
+ }
+
+ /**
+ * Delete the entry for @a key.
+ */
+ void del(const Key& key) throw()
+ {
+ inherited::del(inherited::Key(key));
+ }
+
+ /**
+ * Abstract base class for iteration callback functors.
+ */
+ struct Iteration : protected inherited::Iteration
+ {
+ /**
+ * Called by Hash::iterate for every key-value pair in the hash table.
+ * @return @c false to terminate the iteration, @c true otherwise.
+ */
+ virtual bool operator() (const Key& key, value_type value) = 0;
+
+ private:
+ friend void Hash::iterate(Iteration& callback, const Pool& scratch_pool);
+
+ /**
+ * Implementation of the derived virtual operator().
+ * Adapts the callback to the instantiated types.
+ */
+ virtual bool operator() (const inherited::Key& raw_key,
+ inherited::value_type raw_value)
+ {
+ return (*this)(Key(raw_key), static_cast<value_type>(raw_value));
+ }
+ };
+
+ /**
+ * Iterate over all the key-value pairs in the hash table, invoking
+ * @a callback for each pair.
+ * Uses @a scratch_pool for temporary allocations.
+ */
+ void iterate(Iteration& callback, const Pool& scratch_pool)
+ {
+ inherited::iterate(callback, scratch_pool);
+ }
+};
+
+
+} // namespace apr
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#endif // SVN_CXXHL_PRIVATE_APRWRAP_HASH_H
diff --git a/subversion/bindings/cxxhl/src/aprwrap/impl.cpp b/subversion/bindings/cxxhl/src/aprwrap/impl.cpp
new file mode 100644
index 0000000..01a4ac0
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/aprwrap/impl.cpp
@@ -0,0 +1,110 @@
+/**
+ * @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
+ */
+
+#include <apr_time.h>
+
+#include "private/svn_atomic.h"
+#include "svn_private_config.h"
+#undef TRUE
+#undef FALSE
+
+#include "pool.hpp"
+#include "hash.hpp"
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace apr {
+
+//
+// Pool implementation
+//
+
+apr_pool_t* Pool::get_root_pool()
+{
+ static const svn_atomic_t NONE = 0;
+ static const svn_atomic_t START = 1;
+ static const svn_atomic_t DONE = 2;
+
+ static volatile svn_atomic_t init_state = NONE;
+ static apr_pool_t* root_pool = NULL;
+
+ svn_atomic_t state = svn_atomic_cas(&init_state, START, NONE);
+
+ switch (state)
+ {
+ case DONE:
+ // The root pool has already been initialized.
+ return root_pool;
+
+ case START:
+ // Another thread is currently initializing the pool; Spin and
+ // wait for it to finish, with exponential backoff, but no
+ // longer than half a second.
+ for (unsigned shift = 0; state == START && shift < 8; ++shift)
+ {
+ apr_sleep((APR_USEC_PER_SEC / 1000) << shift);
+ state = svn_atomic_cas(&init_state, NONE, NONE);
+ }
+ if (state == START)
+ throw cxxhl::InternalError(
+ _("APR pool initialization failed: Timed out"));
+ return root_pool;
+
+ case NONE:
+ // Initialize the root pool and release the lock.
+ // We'll assume that we always need thread-safe allocation.
+ root_pool = svn_pool_create_ex(NULL, svn_pool_create_allocator(true));
+ svn_atomic_cas(&init_state, DONE, START);
+ return root_pool;
+
+ default:
+ throw cxxhl::InternalError(
+ _("APR pool initialization failed: Invalid state"));
+ }
+}
+
+//
+// Hash implementation
+//
+
+void Hash<void, void>::iterate(Hash<void, void>::Iteration& callback,
+ const Pool& scratch_pool)
+{
+ for (apr_hash_index_t* hi = apr_hash_first(scratch_pool.get(), m_hash);
+ hi; hi = apr_hash_next(hi))
+ {
+ key_type key;
+ value_type val;
+ Key::size_type klen;
+
+ apr_hash_this(hi, &key, &klen, &val);
+ if (!callback(Key(key, klen), val))
+ break;
+ }
+}
+
+} // namespace apr
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
diff --git a/subversion/bindings/cxxhl/src/aprwrap/pool.hpp b/subversion/bindings/cxxhl/src/aprwrap/pool.hpp
new file mode 100644
index 0000000..c253a6a
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/aprwrap/pool.hpp
@@ -0,0 +1,198 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_CXXHL_PRIVATE_APRWRAP_POOL_H
+#define SVN_CXXHL_PRIVATE_APRWRAP_POOL_H
+
+#include <cstdlib>
+
+#include "svncxxhl/exception.hpp"
+#include "svncxxhl/_compat.hpp"
+
+#include "svn_pools.h"
+#undef TRUE
+#undef FALSE
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace apr {
+
+// Forward declaration
+class IterationPool;
+
+/**
+ * Encapsulates an APR pool.
+ */
+class Pool : compat::noncopyable
+{
+public:
+ /**
+ * Create a pool as a child of the applications' root pool.
+ */
+ Pool()
+ : m_pool(svn_pool_create(get_root_pool()))
+ {}
+
+ /**
+ * Create a pool as a child of @a parent.
+ */
+ explicit Pool(Pool* parent) throw()
+ : m_pool(svn_pool_create(parent->m_pool))
+ {}
+
+ /**
+ * Destroy the pool.
+ */
+ ~Pool() throw()
+ {
+ svn_pool_destroy(m_pool);
+ }
+
+ /**
+ * Clear the pool.
+ */
+ void clear() throw()
+ {
+ apr_pool_clear(m_pool);
+ }
+
+ /**
+ * Retuurn a pool pointer that can be used by the C APIs.
+ */
+ apr_pool_t* get() const throw()
+ {
+ return m_pool;
+ }
+
+ /**
+ * Allocate space for @a count elements of type @a T from the pool.
+ * The contents of the allocated buffer will contain unspecified data.
+ */
+ template<typename T>
+ T* alloc(std::size_t count) throw()
+ {
+ return static_cast<T*>(apr_palloc(m_pool, count * sizeof(T)));
+ }
+
+ /**
+ * Allocate space for @a count elements of type @a T from the pool.
+ * The contents of the allocated buffer will be initialized to zero.
+ */
+ template<typename T>
+ T* allocz(std::size_t count) throw()
+ {
+ return static_cast<T*>(apr_pcalloc(m_pool, count * sizeof(T)));
+ }
+
+private:
+ static apr_pool_t* get_root_pool();
+ apr_pool_t* const m_pool;
+
+public:
+ /**
+ * Pool proxy used for iteration scratch pools.
+ *
+ * Construct this object inside a loop body in order to clear the
+ * proxied pool on every iteration.
+ */
+ class Iteration : compat::noncopyable
+ {
+ public:
+ /**
+ * The constructor clears the proxied pool.
+ */
+ explicit Iteration(IterationPool& iterbase) throw();
+
+ /**
+ * Returns a reference to the proxied pool.
+ */
+ Pool& pool() const throw()
+ {
+ return m_pool;
+ }
+
+ /**
+ * Proxy method for Pool::get
+ */
+ apr_pool_t* get() const throw()
+ {
+ return m_pool.get();
+ }
+
+ /**
+ * Proxy method for Pool::alloc
+ */
+ template<typename T>
+ T* alloc(std::size_t count) throw()
+ {
+ return m_pool.alloc<T>(count);
+ }
+
+ /**
+ * Proxy method for Pool::allocz
+ */
+ template<typename T>
+ T* allocz(std::size_t count) throw()
+ {
+ return m_pool.allocz<T>(count);
+ }
+
+ private:
+ Pool& m_pool;
+ };
+};
+
+/**
+ * Pool wrapper that hides the pool implementation, except for construction.
+ *
+ * Construct this object outside a loop body, then within the body,
+ * use Pool::Iteration to access the wrapped pool.
+ */
+class IterationPool : compat::noncopyable
+{
+public:
+ IterationPool() {}
+
+ explicit IterationPool(Pool* parent) throw()
+ : m_pool(parent)
+ {}
+
+private:
+ friend class Pool::Iteration;
+ Pool m_pool;
+};
+
+// Pool::Iteration constructor implementation
+inline Pool::Iteration::Iteration(IterationPool& iterbase) throw()
+ : m_pool(iterbase.m_pool)
+{
+ m_pool.clear();
+}
+
+} // namespace apr
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#endif // SVN_CXXHL_PRIVATE_APRWRAP_POOL_H
diff --git a/subversion/bindings/cxxhl/src/exception.cpp b/subversion/bindings/cxxhl/src/exception.cpp
index 6c55792..0f0ee3f 100644
--- a/subversion/bindings/cxxhl/src/exception.cpp
+++ b/subversion/bindings/cxxhl/src/exception.cpp
@@ -28,6 +28,8 @@
#include <sstream>
#include "svncxxhl/exception.hpp"
+#include "private.hpp"
+#include "aprwrap.hpp"
#include "svn_error.h"
#include "svn_utf.h"
@@ -37,103 +39,85 @@
#undef TRUE
#undef FALSE
+namespace apache {
namespace subversion {
namespace cxxhl {
namespace detail {
-class error_description
+class ErrorDescription
{
public:
- static error_description* create(const char* message,
- const char *loc_file, long loc_line,
- bool trace_link)
+ typedef compat::shared_ptr<ErrorDescription> shared_ptr;
+
+ static shared_ptr create(const char* message, int error_code,
+ const char *loc_file, long loc_line,
+ bool trace_link)
{
- bool empty_message = (message == NULL);
+ const bool empty_message = (message == NULL);
const std::size_t length = (empty_message ? 0 : std::strlen(message));
- void *memblock = ::operator new(length + sizeof(error_description));
+ void* memblock = ::operator new(length + sizeof(ErrorDescription));
- error_description* description = new(memblock) error_description(
- loc_file, loc_line, trace_link, empty_message);
+ ErrorDescription* description = new(memblock) ErrorDescription(
+ error_code, loc_file, loc_line, trace_link, empty_message);
if (length)
std::memcpy(description->m_message, message, length);
description->m_message[length] = 0;
- return description;
+ return shared_ptr(description);
}
- static error_description* create(const char* message)
+ static shared_ptr create(const char* message, int error_code)
{
- return create(message, NULL, 0, false);
+ return create(message, error_code, NULL, 0, false);
}
- error_description* reference() throw()
- {
- if (this)
- svn_atomic_inc(&m_refcount);
- return this;
- }
-
- error_description* dereference() throw()
- {
- if (this && 0 == svn_atomic_dec(&m_refcount))
- {
- this->~error_description();
- ::operator delete(this, std::nothrow);
- return NULL;
- }
- return this;
- }
+ ~ErrorDescription() throw() {}
const char* what() const throw() { return (m_empty ? NULL : m_message); }
+ int code() const throw() { return m_errno; }
const char* file() const throw() { return m_loc_file; }
long line() const throw() { return m_loc_line; }
bool trace() const throw() { return m_trace; }
+ shared_ptr& nested() throw() { return m_nested; }
+ const shared_ptr& nested() const throw() { return m_nested; }
private:
- error_description(const char *loc_file, long loc_line,
- bool trace_link, bool empty_message) throw()
+ ErrorDescription(int error_code,
+ const char *loc_file, long loc_line,
+ bool trace_link, bool empty_message) throw()
: m_loc_file(loc_file),
m_loc_line(loc_line),
m_trace(trace_link),
m_empty(empty_message),
- m_refcount(0)
+ m_errno(error_code)
{}
- ~error_description() throw() {}
-
const char* m_loc_file;
long m_loc_line;
bool m_trace;
bool m_empty;
- volatile svn_atomic_t m_refcount;
- char m_message[1];
+ shared_ptr m_nested;
+
+ int m_errno; ///< The (SVN or APR) error code.
+ char m_message[1]; ///< The error message
};
} // namespace detail
+//
+// Class InternalError
+//
-namespace version_1_9_dev {
-
-error::error(const char* description, int error_code)
- : m_errno(error_code),
- m_description(detail::error_description::create(description)->reference())
-{}
-
-error::error(const char* description, int error_code,
- error::shared_ptr nested_error)
- : m_errno(error_code),
- m_nested(nested_error),
- m_description(detail::error_description::create(description)->reference())
+InternalError::InternalError(const char* description)
+ : m_description(detail::ErrorDescription::create(description, 0))
{}
-error::error(const error& that) throw()
- : m_errno(that.m_errno),
- m_nested(that.m_nested),
- m_description(that.m_description->reference())
+InternalError::InternalError(const InternalError& that) throw()
+ : m_description(that.m_description)
{}
-error& error::operator=(const error& that) throw()
+InternalError& InternalError::operator=(const InternalError& that) throw()
{
if (this == &that)
return *this;
@@ -141,89 +125,85 @@ error& error::operator=(const error& that) throw()
// This in-place destroy+copy implementation of the assignment
// operator is safe because both the destructor and the copy
// constructor do not throw exceptions.
- this->~error();
- return *new(this) error(that);
+ this->~InternalError();
+ return *new(this) InternalError(that);
}
-error::~error() throw()
-{
- m_description->dereference();
-}
+InternalError::~InternalError() throw() {}
-const char* error::what() const throw()
+const char* InternalError::what() const throw()
{
return m_description->what();
}
-error::error(int error_code, detail::error_description* description) throw()
- : m_errno(error_code),
- m_description(description)
+InternalError::InternalError(description_ptr description) throw()
+ : m_description(description)
{}
-void error::throw_svn_error(svn_error_t* err)
+//
+// Class Error
+//
+
+Error::Error(const Error& that) throw()
+ : InternalError(that.m_description)
+{}
+
+Error& Error::operator=(const Error& that) throw()
{
- const bool throw_cancelled = (err->apr_err == SVN_ERR_CANCELLED);
- detail::error_description* description = NULL;
- try
- {
- // Be very careful when creating the error descriptions, so that
- // the exception unwinder can free them if an allocation fails.
- // The private constructor does not increment the refcount
- // precisely for this reason.
+ if (this == &that)
+ return *this;
- shared_ptr nested;
- shared_ptr* current = &nested;
+ // This in-place destroy+copy implementation of the assignment
+ // operator is safe because both the destructor and the copy
+ // constructor do not throw exceptions.
+ this->~Error();
+ return *new(this) Error(that);
+}
- for (svn_error_t* next = err->child; next; next = next->child)
- {
- description = detail::error_description::create(
- next->message, next->file, next->line,
- svn_error__is_tracing_link(next));
- description->reference();
- current->reset(new error(next->apr_err, description));
- description = NULL;
- current = &(*current)->m_nested;
- }
+Error::~Error() throw() {}
- const int apr_err = err->apr_err;
- description = detail::error_description::create(
- err->message, err->file, err->line,
- svn_error__is_tracing_link(err));
- description->reference();
- svn_error_clear(err);
- if (throw_cancelled)
- {
- cancelled converted = cancelled(apr_err, description);
- description = NULL;
- converted.m_nested = nested;
- throw converted;
- }
- else
- {
- error converted = error(apr_err, description);
- description = NULL;
- converted.m_nested = nested;
- throw converted;
- }
- }
- catch (...)
+int Error::code() const throw()
+{
+ return m_description->code();
+}
+
+namespace {
+const char* get_generic_message(apr_status_t error_code,
+ const APR::Pool& scratch_pool)
+{
+ char errorbuf[512];
+
+ // Is this a Subversion-specific error code?
+ if (error_code > APR_OS_START_USEERR && error_code <= APR_OS_START_CANONERR)
+ return svn_strerror(error_code, errorbuf, sizeof(errorbuf));
+ // Otherwise, this must be an APR error code.
+ else
{
- description->dereference();
- throw;
+ const char* generic;
+ svn_error_t* err = svn_utf_cstring_to_utf8(
+ &generic,
+ apr_strerror(error_code, errorbuf, sizeof(errorbuf)),
+ scratch_pool.get());
+ if (!err)
+ return generic;
+
+ // Use fuzzy transliteration instead.
+ svn_error_clear(err);
+ return svn_utf_cstring_from_utf8_fuzzy(errorbuf, scratch_pool.get());
}
}
-
-namespace {
-void handle_one_error(error::message_list& ml, bool show_traces,
- int error_code, detail::error_description* descr,
- apr_pool_t* pool)
+void handle_one_error(Error::MessageList& ml, bool show_traces,
+ const detail::ErrorDescription* descr,
+ const APR::Pool& pool)
{
+ const int error_code = descr->code();
+
if (show_traces && descr->file())
{
const char* file_utf8 = NULL;
svn_error_t* err =
- svn_utf_cstring_to_utf8(&file_utf8, descr->file(), pool);
+ svn_utf_cstring_to_utf8(&file_utf8, descr->file(), pool.get());
if (err)
{
svn_error_clear(err);
@@ -234,8 +214,18 @@ void handle_one_error(error::message_list& ml, bool show_traces,
buffer << file_utf8 << ':' << descr->line();
else
buffer << "svn:<undefined>";
- buffer << ": (apr_err=" << error_code << ')';
- ml.push_back(error::message(0, buffer.str()));
+ if (descr->trace())
+ buffer << ',';
+ else
+ {
+#ifdef SVN_DEBUG
+ if (const char* symbolic_name = svn_error_symbolic_name(error_code))
+ buffer << ": (apr_err=" << symbolic_name << ')';
+ else
+#endif
+ buffer << ": (apr_err=" << error_code << ')';
+ }
+ ml.push_back(Error::Message(error_code, buffer.str(), true));
}
if (descr->trace())
@@ -243,43 +233,24 @@ void handle_one_error(error::message_list& ml, bool show_traces,
const char *description = descr->what();
if (!description)
- {
- char errorbuf[512];
-
- // Is this a Subversion-specific error code?
- if (error_code > APR_OS_START_USEERR
- && error_code <= APR_OS_START_CANONERR)
- description = svn_strerror(error_code, errorbuf, sizeof(errorbuf));
- // Otherwise, this must be an APR error code.
- else
- {
- svn_error_t* err = svn_utf_cstring_to_utf8(
- &description,
- apr_strerror(error_code, errorbuf, sizeof(errorbuf)),
- pool);
- if (err)
- {
- svn_error_clear(err);
- description = _("Can't recode error string from APR");
- }
- }
- }
- ml.push_back(error::message(error_code, std::string(description)));
+ description = get_generic_message(error_code, pool);
+ ml.push_back(Error::Message(error_code, std::string(description), false));
}
} // anonymous namespace
-error::message_list error::compile_messages(bool show_traces) const
+Error::MessageList Error::compile_messages(bool show_traces) const
{
// Determine the maximum size of the returned list
- message_list::size_type max_length = 0;
- for (const error* err = this; err; err = err->m_nested.get())
+ MessageList::size_type max_length = 0;
+ for (const detail::ErrorDescription* description = m_description.get();
+ description; description = description->nested().get())
{
- if (show_traces && m_description->file())
+ if (show_traces && description->file())
++max_length; // We will display an error location
- if (!m_description->trace())
+ if (!description->trace())
++max_length; // Traces do not emit a message line
}
- message_list ml;
+ MessageList ml;
ml.reserve(max_length);
// This vector holds a list of all error codes that we've printed
@@ -287,36 +258,74 @@ error::message_list error::compile_messages(bool show_traces) const
std::vector<int> empties;
empties.reserve(max_length);
- apr_pool_t* pool = NULL;
- apr_pool_create(&pool, NULL);
- try
+ APR::IterationPool iterbase;
+ for (const detail::ErrorDescription* description = m_description.get();
+ description; description = description->nested().get())
{
- for (const error* err = this; err; err = err->m_nested.get())
+ APR::Pool::Iteration iterpool(iterbase);
+
+ if (!description->what())
{
- if (!err->m_description->what())
- {
- // Non-specific messages are printed only once.
- std::vector<int>::iterator it = std::find(
- empties.begin(), empties.end(), err->m_errno);
- if (it != empties.end())
- continue;
- empties.push_back(err->m_errno);
- }
- handle_one_error(ml, show_traces,
- err->m_errno, err->m_description,
- pool);
+ // Non-specific messages are printed only once.
+ std::vector<int>::iterator it = std::find(
+ empties.begin(), empties.end(), description->code());
+ if (it != empties.end())
+ continue;
+ empties.push_back(description->code());
}
+ handle_one_error(ml, show_traces, description, iterpool.pool());
}
- catch (...)
+ return ml;
+}
+
+const char* Error::Message::generic_message() const
+{
+ APR::Pool pool;
+ return get_generic_message(m_errno, pool);
+}
+
+namespace detail {
+void checked_call(svn_error_t* err)
+{
+ if (!err)
+ return;
+
+ struct ErrorBuilder : public Error
+ {
+ explicit ErrorBuilder (ErrorDescription::shared_ptr description)
+ : Error(description)
+ {}
+ };
+
+ struct CancelledBuilder : public Cancelled
+ {
+ explicit CancelledBuilder (ErrorDescription::shared_ptr description)
+ : Cancelled(description)
+ {}
+ };
+
+ ErrorDescription::shared_ptr description;
+ ErrorDescription::shared_ptr* current = &description;
+
+ bool cancelled = false;
+ for (svn_error_t* next = err; next; next = next->child)
{
- apr_pool_destroy(pool);
- throw;
+ *current = ErrorDescription::create(next->message, next->apr_err,
+ next->file, next->line,
+ svn_error__is_tracing_link(next));
+ current = &(*current)->nested();
+ if (next->apr_err == SVN_ERR_CANCELLED)
+ cancelled = true;
}
+ svn_error_clear(err);
- apr_pool_destroy(pool);
- return ml;
+ if (cancelled)
+ throw CancelledBuilder(description);
+ else
+ throw ErrorBuilder(description);
}
+} // namespace detail
-} // namespace version_1_9_dev
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
diff --git a/subversion/bindings/javahl/native/libsvnjavahl.la.c b/subversion/bindings/cxxhl/src/private.hpp
index 0cbbd2e..bb61012 100644
--- a/subversion/bindings/javahl/native/libsvnjavahl.la.c
+++ b/subversion/bindings/cxxhl/src/private.hpp
@@ -19,19 +19,11 @@
* under the License.
* ====================================================================
* @endcopyright
- *
- * @file libsvnjavahl.c
- * @brief mandatory file for building with libtool
*/
-#include <jni.h>
-JNIEXPORT jint JNICALL
-JNI_OnLoad(JavaVM *vm, void *reserved)
-{
- return JNI_VERSION_1_2;
-}
+#ifndef SVN_CXXHL_PRIVATE_PRIVATE_H
+#define SVN_CXXHL_PRIVATE_PRIVATE_H
+
+#include "private/exception-private.hpp"
-JNIEXPORT void JNICALL
-JNI_OnUnload(JavaVM *vm, void *reserved)
-{
-}
+#endif // SVN_CXXHL_PRIVATE_PRIVATE_H
diff --git a/subversion/bindings/cxxhl/src/private/exception-private.hpp b/subversion/bindings/cxxhl/src/private/exception-private.hpp
new file mode 100644
index 0000000..34ffdfd
--- /dev/null
+++ b/subversion/bindings/cxxhl/src/private/exception-private.hpp
@@ -0,0 +1,49 @@
+/**
+ * @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
+ */
+
+#ifndef __cplusplus
+#error "This is a C++ header file."
+#endif
+
+#ifndef SVN_CXXHL_PRIVATE_EXCEPTION_HPP
+#define SVN_CXXHL_PRIVATE_EXCEPTION_HPP
+
+#include "svn_error.h"
+
+namespace apache {
+namespace subversion {
+namespace cxxhl {
+namespace detail {
+
+/**
+ * Given a @a err, if it is not @c NULL, convert it to a and throw an
+ * Error exception; otherwise do nothing.
+ */
+void checked_call(svn_error_t* err);
+
+} // namespace detail
+} // namespace cxxhl
+} // namespace subversion
+} // namespace apache
+
+#endif // SVN_CXXHL_PRIVATE_EXCEPTION_HPP
diff --git a/subversion/bindings/cxxhl/src/tristate.cpp b/subversion/bindings/cxxhl/src/tristate.cpp
index 10a2207..75a8142 100644
--- a/subversion/bindings/cxxhl/src/tristate.cpp
+++ b/subversion/bindings/cxxhl/src/tristate.cpp
@@ -27,18 +27,18 @@
#undef TRUE
#undef FALSE
+namespace apache {
namespace subversion {
namespace cxxhl {
-namespace version_1_9_dev {
-tristate::tristate(short value) throw()
+Tristate::Tristate(short value) throw()
: m_value(value)
{}
-const tristate tristate::TRUE = tristate(svn_tristate_true);
-const tristate tristate::FALSE = tristate(svn_tristate_false);
-const tristate tristate::UNKNOWN = tristate(svn_tristate_unknown);
+const Tristate Tristate::TRUE = Tristate(svn_tristate_true);
+const Tristate Tristate::FALSE = Tristate(svn_tristate_false);
+const Tristate Tristate::UNKNOWN = Tristate(svn_tristate_unknown);
-} // namespace version_1_9_dev
} // namespace cxxhl
} // namespace subversion
+} // namespace apache
diff --git a/subversion/bindings/cxxhl/tests/cxxhl-tests.cpp b/subversion/bindings/cxxhl/tests/cxxhl-tests.cpp
new file mode 100644
index 0000000..5589aac
--- /dev/null
+++ b/subversion/bindings/cxxhl/tests/cxxhl-tests.cpp
@@ -0,0 +1,46 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <cstdlib>
+#include <iostream>
+
+#include <apr_errno.h>
+#include <apr_general.h>
+
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+
+int main(int argc, char** argv)
+{
+ apr_status_t status = apr_initialize();
+ if (status)
+ {
+ char errbuf[512];
+ std::cerr << "APR initialization failed: "
+ << apr_strerror(status, errbuf, sizeof(errbuf) - 1)
+ << std::endl;
+ return 7;
+ }
+ std::atexit(apr_terminate);
+
+ testing::InitGoogleMock(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/subversion/bindings/cxxhl/tests/test_aprwrap.cpp b/subversion/bindings/cxxhl/tests/test_aprwrap.cpp
new file mode 100644
index 0000000..bf3f180
--- /dev/null
+++ b/subversion/bindings/cxxhl/tests/test_aprwrap.cpp
@@ -0,0 +1,435 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <algorithm>
+#include <stdexcept>
+
+#include "../src/aprwrap.hpp"
+
+#include <gmock/gmock.h>
+
+//
+// Pools
+//
+
+TEST(Pools, InitializeGlobalPool)
+{
+ APR::Pool pool;
+ EXPECT_THAT(pool.get(), testing::NotNull());
+ EXPECT_THAT(apr_pool_parent_get(pool.get()), testing::NotNull());
+}
+
+TEST(Pools, CreateSubpool)
+{
+ APR::Pool pool;
+ APR::Pool subpool(&pool);
+ EXPECT_EQ(pool.get(), apr_pool_parent_get(subpool.get()));
+}
+
+TEST(Pools, TypedAllocate)
+{
+ APR::Pool pool;
+ const unsigned char* buffer = pool.alloc<unsigned char>(1);
+ EXPECT_THAT(buffer, testing::NotNull());
+}
+
+// N.B.: This test may pass randomly even if zero-filled allocation
+// does not work correctly, since we cannot make assumptions about the
+// values of uninitialized memory.
+TEST(Pools, TypedAllocateZerofill)
+{
+ APR::Pool pool;
+ static const std::size_t size = 32757;
+ const unsigned char* buffer = pool.allocz<unsigned char>(size);
+ ASSERT_THAT(buffer, testing::NotNull());
+ EXPECT_EQ(size, std::count(buffer, buffer + size, 0));
+}
+
+//
+// Array helper functions
+//
+
+namespace {
+// Create a randomly-ordered array of constant strings.
+apr_array_header_t* fill_array(APR::Pool& pool)
+{
+ apr_array_header_t* a = apr_array_make(pool.get(), 0, sizeof(const char*));
+ APR_ARRAY_PUSH(a, const char*) = "primus";
+ APR_ARRAY_PUSH(a, const char*) = "secundus";
+ APR_ARRAY_PUSH(a, const char*) = "tertius";
+ APR_ARRAY_PUSH(a, const char*) = "quartus";
+ APR_ARRAY_PUSH(a, const char*) = "quintus";
+ APR_ARRAY_PUSH(a, const char*) = "sextus";
+ APR_ARRAY_PUSH(a, const char*) = "septimus";
+ std::random_shuffle(&APR_ARRAY_IDX(a, 0, const char*),
+ &APR_ARRAY_IDX(a, a->nelts, const char*));
+ return a;
+}
+} // anonymous namespace
+
+//
+// Arrays
+//
+
+TEST(Arrays, CreateArray)
+{
+ typedef APR::Array<unsigned char> Array;
+
+ APR::Pool pool;
+ Array array(pool);
+
+ EXPECT_THAT(array.array(), testing::NotNull());
+ EXPECT_EQ(0, array.size());
+ EXPECT_EQ(sizeof(unsigned char), sizeof(Array::value_type));
+ EXPECT_EQ(sizeof(Array::value_type), array.array()->elt_size);
+}
+
+TEST(Arrays, WrapArray)
+{
+ typedef APR::Array<unsigned char> Array;
+
+ APR::Pool pool;
+ apr_array_header_t* apr_array =
+ apr_array_make(pool.get(), 0, sizeof(Array::value_type));
+ ASSERT_THAT(apr_array, testing::NotNull());
+
+ Array array(apr_array);
+ EXPECT_EQ(apr_array, array.array());
+ EXPECT_EQ(0, array.size());
+}
+
+TEST(Arrays, RewrapTypeMismatch)
+{
+ typedef APR::Array<unsigned char> ByteArray;
+ typedef APR::Array<int> IntArray;
+
+ APR::Pool pool;
+ EXPECT_THROW(ByteArray array(IntArray(pool).array()),
+ std::invalid_argument);
+}
+
+TEST(Arrays, OutOfBounds)
+{
+ typedef APR::Array<unsigned char> Array;
+
+ APR::Pool pool;
+ Array array(pool);
+
+ EXPECT_THROW(array.at(-1), std::out_of_range);
+ EXPECT_THROW(array.at(array.size()), std::out_of_range);
+}
+
+TEST(Arrays, Indexing)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ EXPECT_STREQ(array[0], APR_ARRAY_IDX(array.array(), 0, Array::value_type));
+ EXPECT_STREQ(array[array.size() - 1], APR_ARRAY_IDX(array.array(),
+ array.array()->nelts - 1,
+ Array::value_type));
+}
+
+TEST(Arrays, CheckedIndexing)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ EXPECT_STREQ(array.at(0), APR_ARRAY_IDX(array.array(), 0, Array::value_type));
+ EXPECT_STREQ(array.at(array.size() - 1),
+ APR_ARRAY_IDX(array.array(), array.array()->nelts - 1,
+ Array::value_type));
+}
+
+TEST(Arrays, Iteration)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ struct Iteration : public Array::Iteration
+ {
+ Iteration(apr_array_header_t* raw_array)
+ : m_index(0), m_raw_array(raw_array)
+ {}
+
+ bool operator()(Array::value_type& value)
+ {
+ EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
+ Array::value_type));
+ ++m_index;
+ return true;
+ }
+
+ private:
+ Array::size_type m_index;
+ apr_array_header_t* m_raw_array;
+ } callback(array.array());
+
+ array.iterate(callback);
+}
+
+TEST(Arrays, ConstIteration)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ struct Iteration : public Array::ConstIteration
+ {
+ Iteration(const apr_array_header_t* raw_array)
+ : m_index(0), m_raw_array(raw_array)
+ {}
+
+ bool operator()(const Array::value_type& value)
+ {
+ EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
+ Array::value_type));
+ ++m_index;
+ return true;
+ }
+
+ private:
+ Array::size_type m_index;
+ const apr_array_header_t* m_raw_array;
+ } callback(array.array());
+
+ array.iterate(callback);
+}
+
+TEST(Arrays, Push)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ const Array::size_type point = array.size();
+ const Array::value_type first = array[0];
+ const Array::value_type last = array[point - 1];
+
+ array.push("octavius");
+ array.push("nonus");
+ array.push("decimus");
+
+ EXPECT_EQ(point + 3, array.size());
+ EXPECT_STREQ(first, array[0]);
+ EXPECT_STREQ(last, array[point - 1]);
+ EXPECT_STREQ("octavius", array[point]);
+ EXPECT_STREQ("decimus", array[array.size() - 1]);
+}
+
+TEST(Arrays, Pop)
+{
+ typedef APR::Array<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ for (Array::size_type i = 0, z = array.size(); i <= z; ++i)
+ {
+ const char** last = (!array.array()->nelts ? NULL
+ : &APR_ARRAY_IDX(array.array(),
+ array.array()->nelts - 1,
+ const char*));
+ EXPECT_EQ(last, array.pop());
+ }
+}
+
+//
+// ConstArrays
+//
+
+TEST(ConstArrays, WrapArray)
+{
+ typedef APR::ConstArray<unsigned char> Array;
+
+ APR::Pool pool;
+ const apr_array_header_t* apr_array =
+ apr_array_make(pool.get(), 0, sizeof(Array::value_type));
+ ASSERT_THAT(apr_array, testing::NotNull());
+
+ Array array(apr_array);
+ EXPECT_EQ(apr_array, array.array());
+ EXPECT_EQ(0, array.size());
+}
+
+TEST(ConstArrays, RewrapTypeMismatch)
+{
+ typedef APR::ConstArray<unsigned char> ByteArray;
+ typedef APR::Array<int> IntArray;
+
+ APR::Pool pool;
+ EXPECT_THROW(ByteArray array(IntArray(pool).array()),
+ std::invalid_argument);
+}
+
+TEST(ConstArrays, OutOfBounds)
+{
+ typedef APR::ConstArray<unsigned char> Array;
+
+ APR::Pool pool;
+ Array array = Array(APR::Array<Array::value_type>(pool));
+
+ EXPECT_THROW(array.at(-1), std::out_of_range);
+ EXPECT_THROW(array.at(array.size()), std::out_of_range);
+}
+
+TEST(ConstArrays, Indexing)
+{
+ typedef APR::ConstArray<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ EXPECT_STREQ(array[0], APR_ARRAY_IDX(array.array(), 0, Array::value_type));
+ EXPECT_STREQ(array[array.size() - 1], APR_ARRAY_IDX(array.array(),
+ array.array()->nelts - 1,
+ Array::value_type));
+}
+
+TEST(ConstArrays, CheckedIndexing)
+{
+ typedef APR::ConstArray<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ EXPECT_STREQ(array.at(0), APR_ARRAY_IDX(array.array(), 0, Array::value_type));
+ EXPECT_STREQ(array.at(array.size() - 1),
+ APR_ARRAY_IDX(array.array(), array.array()->nelts - 1,
+ Array::value_type));
+}
+
+TEST(ConstArrays, Iteration)
+{
+ typedef APR::ConstArray<const char*> Array;
+
+ APR::Pool pool;
+ Array array(fill_array(pool));
+
+ struct Iteration : public Array::Iteration
+ {
+ Iteration(const apr_array_header_t* raw_array)
+ : m_index(0), m_raw_array(raw_array)
+ {}
+
+ bool operator()(const Array::value_type& value)
+ {
+ EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
+ Array::value_type));
+ ++m_index;
+ return true;
+ }
+
+ private:
+ Array::size_type m_index;
+ const apr_array_header_t* m_raw_array;
+ } callback(array.array());
+
+ array.iterate(callback);
+}
+
+//
+// Hash tables
+//
+
+TEST(Hashes, StringHash)
+{
+ typedef APR::Hash<char, const char> H;
+
+ APR::Pool pool;
+ H hash(pool);
+ hash.set("aa", "a");
+ hash.set("bbb", "b");
+ hash.set("cccc", "c");
+
+ EXPECT_EQ(3, hash.size());
+ EXPECT_STREQ("a", hash.get("aa"));
+ EXPECT_STREQ("b", hash.get("bbb"));
+ EXPECT_STREQ("c", hash.get("cccc"));
+}
+
+TEST(Hashes, FixedStringHash)
+{
+ // The point of this test is to verify that the key-length parameter
+ // of the template actually limits the length of the keys.
+ typedef APR::Hash<char, const char, 2> H;
+
+ APR::Pool pool;
+ H hash(pool);
+ hash.set("aa&qux", "a");
+ hash.set("bb#foo", "b");
+ hash.set("cc@bar", "c");
+
+ EXPECT_EQ(3, hash.size());
+ EXPECT_STREQ("a", hash.get("aa%foo"));
+ EXPECT_STREQ("b", hash.get("bb*bar"));
+ EXPECT_STREQ("c", hash.get("cc$qux"));
+}
+
+TEST(Hashes, Delete)
+{
+ typedef APR::Hash<char, const char> H;
+
+ APR::Pool pool;
+ H hash(pool);
+ hash.set("aa", "a");
+ hash.set("bbb", "b");
+ hash.set("cccc", "c");
+
+ hash.del("bbb");
+
+ EXPECT_EQ(2, hash.size());
+ EXPECT_STREQ("a", hash.get("aa"));
+ EXPECT_STREQ("c", hash.get("cccc"));
+}
+
+TEST(Hashes, Iterate)
+{
+ typedef APR::Hash<char, const char> H;
+
+ APR::Pool pool;
+ H hash(pool);
+ hash.set("aa", "a");
+ hash.set("bbb", "b");
+ hash.set("cccc", "c");
+
+ struct C : public H::Iteration
+ {
+ H& m_hash;
+ explicit C(H& hashref) : m_hash(hashref) {}
+
+ bool operator()(const H::Key& key, H::value_type value)
+ {
+ EXPECT_STREQ(value, m_hash.get(key));
+ return true;
+ }
+ } callback(hash);
+
+ hash.iterate(callback, pool);
+}
diff --git a/subversion/bindings/cxxhl/tests/test_exception.cpp b/subversion/bindings/cxxhl/tests/test_exception.cpp
index ccfec6c..7c0637c 100644
--- a/subversion/bindings/cxxhl/tests/test_exception.cpp
+++ b/subversion/bindings/cxxhl/tests/test_exception.cpp
@@ -20,110 +20,114 @@
*/
#include <algorithm>
+#include <cstdio>
#include <iomanip>
#include <ios>
#include <iostream>
#include "svncxxhl.hpp"
+#include "../src/private.hpp"
#include <apr.h>
#include "svn_error.h"
+#undef TRUE
+#undef FALSE
-namespace {
-void trace(const svn::error::message& msg)
-{
- std::cout << " ";
- if (msg.first)
- std::cout << "test_exception: E"
- << std::setw(6) << std::setfill('0') << std::right
- << msg.first << ':' << ' ';
- std::cout << msg.second << std::endl;
-}
+#include <gmock/gmock.h>
-void traceall(const char *message, const svn::error& err)
+namespace {
+svn_error_t* make_error_test_error()
{
- typedef svn::error::message_list message_list;
- std::cout << message << std::endl;
- std::cout << "Traced Messages:" << std::endl;
- message_list ml = err.traced_messages();
- std::for_each(ml.begin(), ml.end(), trace);
- std::cout << "Just Messages:" << std::endl;
- ml = err.messages();
- std::for_each(ml.begin(), ml.end(), trace);
+ svn_error_t* err;
+ err = svn_error_create(SVN_ERR_TEST_FAILED, NULL, "original message");
+ err = svn_error_create(SVN_ERR_BASE, err, "wrapper message");
+ err = svn_error_trace(err);
+ err = svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, err, NULL);
+ err = svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, err, NULL);
+ err = svn_error_trace(err);
+ return err;
}
} // anonymous namespace
-
-bool test_cancel()
+TEST(Exceptions, CatchError)
{
try
{
- svn_error_t* err;
- err = svn_error_create(SVN_ERR_TEST_FAILED, NULL, "original message");
- err = svn_error_create(SVN_ERR_BASE, err, "wrapper message");
- err = svn_error_create(SVN_ERR_CANCELLED, err, NULL);
- err = svn_error_create(SVN_ERR_CANCELLED, err, NULL);
- err = svn_error_trace(err);
- svn::error::throw_svn_error(err);
- }
- catch (const svn::cancelled& err)
- {
- traceall("Caught: CANCEL", err);
- return true;
+ SVN::detail::checked_call(make_error_test_error());
}
- catch (const svn::error& err)
+ catch (const SVN::Error& err)
{
- traceall("Caught: ERROR", err);
- return false;
- }
- catch (...)
- {
- return false;
+ SVN::Error::MessageList ml = err.messages();
+ EXPECT_EQ(3, ml.size());
+ EXPECT_EQ(SVN_ERR_UNSUPPORTED_FEATURE, ml[0].code());
+ EXPECT_EQ(SVN_ERR_BASE, ml[1].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, ml[2].code());
+
+ SVN::Error::MessageList tml = err.traced_messages();
+#ifdef SVN_DEBUG
+ EXPECT_EQ(8, tml.size());
+ EXPECT_EQ(SVN_ERR_UNSUPPORTED_FEATURE, tml[0].code());
+ EXPECT_EQ(SVN_ERR_UNSUPPORTED_FEATURE, tml[1].code());
+ EXPECT_EQ(SVN_ERR_UNSUPPORTED_FEATURE, tml[2].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[3].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[4].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[5].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[6].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[7].code());
+#else // !SVN_DEBUG
+ EXPECT_EQ(3, tml.size());
+ EXPECT_EQ(SVN_ERR_UNSUPPORTED_FEATURE, tml[0].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[1].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[2].code());
+#endif // SVN_DEBUG
}
- return false;
}
-int test_error()
+
+namespace {
+svn_error_t* make_cancel_test_error()
+{
+ svn_error_t* err;
+ err = svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
+ err = svn_error_create(SVN_ERR_CANCELLED, err, NULL);
+ err = svn_error_trace(err);
+ err = svn_error_create(SVN_ERR_TEST_FAILED, err, "original message");
+ err = svn_error_create(SVN_ERR_BASE, err, "wrapper message");
+ err = svn_error_trace(err);
+ return err;
+}
+} // anonymous namespace
+
+TEST(Exceptions, CatchCancelled)
{
try
{
- svn_error_t* err;
- err = svn_error_create(SVN_ERR_TEST_FAILED, NULL, "original message");
- err = svn_error_create(SVN_ERR_BASE, err, "wrapper message");
- err = svn_error_create(SVN_ERR_CANCELLED, err, NULL);
- err = svn_error_create(SVN_ERR_CANCELLED, err, NULL);
- err = svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, err, NULL);
- err = svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, err, NULL);
- err = svn_error_trace(err);
- svn::error::throw_svn_error(err);
- }
- catch (const svn::cancelled& err)
- {
- traceall("Caught: CANCEL", err);
- return false;
+ SVN::detail::checked_call(make_cancel_test_error());
}
- catch (const svn::error& err)
+ catch (const SVN::Cancelled& err)
{
- traceall("Caught: ERROR", err);
- return true;
- }
- catch (...)
- {
- return false;
- }
- return false;
-}
-
-int main()
-{
- apr_initialize();
+ SVN::Error::MessageList ml = err.messages();
+ EXPECT_EQ(3, ml.size());
+ EXPECT_EQ(SVN_ERR_BASE, ml[0].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, ml[1].code());
+ EXPECT_EQ(SVN_ERR_CANCELLED, ml[2].code());
- const char *stat = (test_cancel() ? "OK" : "ERROR");
- std::cerr << "test_cancel .... " << stat << std::endl;
-
- stat = (test_error() ? "OK" : "ERROR");
- std::cerr << "test_error ..... " << stat << std::endl;
-
- apr_terminate();
- return 0;
+ SVN::Error::MessageList tml = err.traced_messages();
+#ifdef SVN_DEBUG
+ EXPECT_EQ(8, tml.size());
+ EXPECT_EQ(SVN_ERR_BASE, tml[0].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[1].code());
+ EXPECT_EQ(SVN_ERR_BASE, tml[2].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[3].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[4].code());
+ EXPECT_EQ(SVN_ERR_CANCELLED, tml[5].code());
+ EXPECT_EQ(SVN_ERR_CANCELLED, tml[6].code());
+ EXPECT_EQ(SVN_ERR_CANCELLED, tml[7].code());
+#else // !SVN_DEBUG
+ EXPECT_EQ(3, tml.size());
+ EXPECT_EQ(SVN_ERR_BASE, tml[0].code());
+ EXPECT_EQ(SVN_ERR_TEST_FAILED, tml[1].code());
+ EXPECT_EQ(SVN_ERR_CANCELLED, tml[2].code());
+#endif // SVN_DEBUG
+ }
}
diff --git a/subversion/bindings/javahl/README b/subversion/bindings/javahl/README
index bcbba3f..ca7b9f4 100644
--- a/subversion/bindings/javahl/README
+++ b/subversion/bindings/javahl/README
@@ -5,7 +5,7 @@ JavaHL provides a (mostly native, using JNI and javah) implementation of
a high level Java API for Subversion, which was originally targeted for
implementors of GUI clients and IDE plug-ins for Subversion. JavaHL
currently provides a minimal-but-complete set of APIs which expose the
-core Subversion C API to Java. It requires a JRE 1.5+ (runtime).
+core Subversion C API to Java. It requires a JRE 1.6+ (runtime).
It is currently quite mature, and can be considered for production use.
@@ -13,8 +13,9 @@ It is currently quite mature, and can be considered for production use.
Build system
------------
-JavaHL should compile and run under Linux, Win32, and Mac OS X with a
-JDK 1.5+.
+JavaHL should compile and run under Linux, Win32, and Mac OS X with
+JDK 1.6+ and a C++ compiler with a complete implementation of
+C++98 (for example, GCC 3.2 and older cannot compile JavaHL 1.9+).
Its build will produce both a native library (libsvnjavahl-1.so on Unix
or libsvnjavahl-1.dll on Win32) and a platform independent archive of
@@ -22,27 +23,29 @@ Java bytecode (svn-javahl.jar).
To build JavaHL on non-Win32 platforms, just add "--enable-javahl" to
the configure script's parameters. "--with-jdk" can be provided to
-specify the path to a jdk. "--with-maintainer-mode" will compile Java
-bytecode with debugging information. Jikes will be the preferred
-compiler if it is auto-detected. If not auto-detected, you can force
-its use via the "--with-jikes=path" flag to configure.
+specify the path to a jdk. "--enable-maintainer-mode" will compile
+Java bytecode with debugging information.
The following make targets are provided:
-javahl build javahl
-install-javahl install javahl
-check-javahl run javahl tests
+javahl build JavaHL
+install-javahl install JavaHL
+check-javahl run JavaHL tests
+check-all-javahl run all JavaHL tests, including tests for
+ deprecated backward-compatibility APIs.
-(In order to run check-javahl, you must have already installed JavaHL,
-and you must have specified a path to a JUnit jar file with
---with-junit when running configure; JUnit version 3.8.1 has been
-tested. JUnit can be downloaded from http://junit.sf.net/ .)
+(In order to run check-javahl, you must have specified a path to a JUnit
+jar file with --with-junit when running configure; JUnit version 4.11
+has been tested. JUnit can be downloaded from http://junit.org/ .)
MacOS X:
-After building libsvnjavahl.dynlib, you must rename it to
-libsvnjavahl.jnilib. Additionally, it should probably be installed in
+After building libsvnjavahl.dylib, you must rename it to
+libsvnjavahl.jnilib. Make install-javahl creates a symbolic
+link with the appropriate name.
+
+Additionally, it should probably be installed in
/Library/Java/Extensions instead of wherever the build system chose to
install it; patches to our build system to do this automatically are
welcome.
@@ -61,6 +64,7 @@ Success stories
---------------
Subclipse, Eclipse IDE plug-in <http://subclipse.tigris.org/>
+SmartSVN, cross-platform Subversion client (http://www.smartsvn.com/)
Why not 100% pure Java?
@@ -87,6 +91,8 @@ as to its compatibility with the official Subversion implementation.
TODO
----
+o Transition all of the implementation to the new-style jniwrapper.
o Expose more of Subversion's core libraries through JNI.
o More JUnit test cases.
+o Refactor the JUnit tests to use the improved features of JUnit 4.
o Improve JavaDoc and coding style.
diff --git a/subversion/bindings/javahl/native/AuthnCallback.cpp b/subversion/bindings/javahl/native/AuthnCallback.cpp
new file mode 100644
index 0000000..3a25e04
--- /dev/null
+++ b/subversion/bindings/javahl/native/AuthnCallback.cpp
@@ -0,0 +1,365 @@
+/**
+ * @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
+ */
+
+#include "svn_base64.h"
+#include "svn_x509.h"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_exception.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_array.hpp"
+#include "jniwrapper/jni_list.hpp"
+
+#include "AuthnCallback.hpp"
+
+#include "svn_private_config.h"
+
+namespace JavaHL {
+
+// Class JavaHL::AuthnCallback
+const char* const AuthnCallback::m_class_name =
+ JAVAHL_CLASS("/callback/AuthnCallback");
+
+AuthnCallback::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_username_prompt(
+ env.GetMethodID(cls, "usernamePrompt",
+ "(Ljava/lang/String;Z)"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$UsernameResult;")),
+ m_mid_user_password_prompt(
+ env.GetMethodID(cls, "userPasswordPrompt",
+ "(Ljava/lang/String;Ljava/lang/String;Z)"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$UserPasswordResult;")),
+ m_mid_ssl_server_trust_prompt(
+ env.GetMethodID(cls, "sslServerTrustPrompt",
+ "(Ljava/lang/String;"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$SSLServerCertFailures;"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$SSLServerCertInfo;"
+ "Z)"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$SSLServerTrustResult;")),
+ m_mid_ssl_client_cert_prompt(
+ env.GetMethodID(cls, "sslClientCertPrompt",
+ "(Ljava/lang/String;Z)"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$SSLClientCertResult;")),
+ m_mid_ssl_client_cert_passphrase_prompt(
+ env.GetMethodID(cls, "sslClientCertPassphrasePrompt",
+ "(Ljava/lang/String;Z)"
+ JAVAHL_ARG("/callback/AuthnCallback")
+ "$SSLClientCertPassphraseResult;")),
+ m_mid_allow_store_plaintext_password(
+ env.GetMethodID(cls, "allowStorePlaintextPassword",
+ "(Ljava/lang/String;)Z")),
+ m_mid_allow_store_plaintext_passphrase(
+ env.GetMethodID(cls, "allowStorePlaintextPassphrase",
+ "(Ljava/lang/String;)Z"))
+{}
+
+AuthnCallback::ClassImpl::~ClassImpl() {}
+
+jobject AuthnCallback::username_prompt(const ::Java::String& realm,
+ bool may_save)
+{
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_username_prompt,
+ realm.get(), jboolean(may_save));
+}
+
+
+jobject AuthnCallback::user_password_prompt(const ::Java::String& realm,
+ const ::Java::String& username,
+ bool may_save)
+{
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_user_password_prompt,
+ realm.get(), username.get(),
+ jboolean(may_save));
+}
+
+jobject AuthnCallback::ssl_server_trust_prompt(
+ const ::Java::String& realm,
+ const SSLServerCertFailures& failures,
+ const SSLServerCertInfo& info,
+ bool may_save)
+{
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_ssl_server_trust_prompt,
+ realm.get(), failures.get(), info.get(),
+ jboolean(may_save));
+}
+
+jobject AuthnCallback::ssl_client_cert_prompt(const ::Java::String&
+ realm, bool may_save)
+{
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_ssl_client_cert_prompt,
+ realm.get(), jboolean(may_save));
+}
+
+jobject AuthnCallback::ssl_client_cert_passphrase_prompt(
+ const ::Java::String& realm,
+ bool may_save)
+{
+ return m_env.CallObjectMethod(m_jthis,
+ impl().m_mid_ssl_client_cert_passphrase_prompt,
+ realm.get(), jboolean(may_save));
+}
+
+bool AuthnCallback::allow_store_plaintext_password(const ::Java::String& realm)
+{
+ return m_env.CallBooleanMethod(m_jthis,
+ impl().m_mid_allow_store_plaintext_password,
+ realm.get());
+}
+
+bool AuthnCallback::allow_store_plaintext_passphrase(const ::Java::String& realm)
+{
+ return m_env.CallBooleanMethod(m_jthis,
+ impl().m_mid_allow_store_plaintext_passphrase,
+ realm.get());
+}
+
+
+// Class JavaHL::AuthnCallback::AuthnResult
+const char* const AuthnCallback::AuthnResult::m_class_name =
+ JAVAHL_CLASS("/callback/AuthnCallback$AuthnResult");
+
+AuthnCallback::AuthnResult::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_fid_save(env.GetFieldID(cls, "save", "Z")),
+ m_fid_trust(env.GetFieldID(cls, "trust", "Z")),
+ m_fid_identity(env.GetFieldID(cls, "identity", "Ljava/lang/String;")),
+ m_fid_secret(env.GetFieldID(cls, "secret", "Ljava/lang/String;"))
+{}
+
+AuthnCallback::AuthnResult::ClassImpl::~ClassImpl() {}
+
+// Class JavaHL::AuthnCallback::SSLServerCertFailures
+const char* const AuthnCallback::SSLServerCertFailures::m_class_name =
+ JAVAHL_CLASS("/callback/AuthnCallback$SSLServerCertFailures");
+
+AuthnCallback::SSLServerCertFailures::ClassImpl::ClassImpl(
+ ::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_ctor(env.GetMethodID(cls, "<init>", "(I)V"))
+{}
+
+AuthnCallback::SSLServerCertFailures::ClassImpl::~ClassImpl() {}
+
+AuthnCallback::SSLServerCertFailures::SSLServerCertFailures(
+ ::Java::Env env, jint failures)
+ : ::Java::Object(env,
+ ::Java::ClassCache::get_authn_ssl_server_cert_failures(env))
+{
+ set_this(env.NewObject(get_class(), impl().m_mid_ctor, failures));
+}
+
+
+// Class JavaHL::AuthnCallback::SSLServerCertInfo
+const char* const AuthnCallback::SSLServerCertInfo::m_class_name =
+ JAVAHL_CLASS("/callback/AuthnCallback$SSLServerCertInfo");
+
+AuthnCallback::SSLServerCertInfo::ClassImpl::ClassImpl(
+ ::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_ctor(env.GetMethodID(cls, "<init>",
+ "(Ljava/lang/String;"
+ "Ljava/lang/String;JJ[B"
+ "Ljava/util/List;"
+ "Ljava/lang/String;)V"))
+{}
+
+AuthnCallback::SSLServerCertInfo::ClassImpl::~ClassImpl() {}
+
+AuthnCallback::SSLServerCertInfo::SSLServerCertInfo(
+ ::Java::Env env, const char* ascii_cert)
+ : ::Java::Object(env,
+ ::Java::ClassCache::get_authn_ssl_server_cert_info(env))
+{
+ SVN::Pool pool;
+
+ /* Convert header-less PEM to DER by undoing base64 encoding. */
+ const svn_string_t cert_string = { ascii_cert, strlen(ascii_cert) };
+ const svn_string_t* der = svn_base64_decode_string(&cert_string,
+ pool.getPool());
+
+ svn_x509_certinfo_t *certinfo;
+ SVN_JAVAHL_CHECK(env, svn_x509_parse_cert(&certinfo, der->data, der->len,
+ pool.getPool(), pool.getPool()));
+
+ const ::Java::String subject(
+ env, svn_x509_certinfo_get_subject(certinfo, pool.getPool()));
+ const ::Java::String issuer(
+ env, svn_x509_certinfo_get_issuer(certinfo, pool.getPool()));
+ const ::Java::String cert(env, ascii_cert);
+ const jlong valid_from =
+ (jlong(svn_x509_certinfo_get_valid_from(certinfo)) + 500) / 1000;
+ const jlong valid_to =
+ (jlong(svn_x509_certinfo_get_valid_to(certinfo)) + 500) / 1000;
+
+ const svn_checksum_t* digest = svn_x509_certinfo_get_digest(certinfo);
+ jsize digest_size;
+ switch (digest->kind)
+ {
+ case svn_checksum_sha1:
+ digest_size = 160 / 8;
+ break;
+
+ case svn_checksum_md5:
+ digest_size = 128 / 8;
+ break;
+
+ default:
+ digest_size = 0; // Initialize this to avoid compiler warnings
+ ::Java::IllegalArgumentException(env).raise(
+ _("Unknown certificate digest type"));
+ }
+ const ::Java::ByteArray fingerprint(env, digest->digest, digest_size);
+
+ jobject jhostnames = NULL;
+ const apr_array_header_t* hostnames =
+ svn_x509_certinfo_get_hostnames(certinfo);
+ if (hostnames)
+ {
+ ::Java::List< ::Java::String> hn(env, hostnames->nelts);
+ for (int i = 0; i < hostnames->nelts; ++i)
+ hn.add(::Java::String(env, APR_ARRAY_IDX(hostnames, i, const char*)));
+ jhostnames = hn.get();
+ }
+
+ set_this(env.NewObject(get_class(), impl().m_mid_ctor,
+ subject.get(), issuer.get(),
+ valid_from, valid_to,
+ fingerprint.get(),
+ jhostnames,
+ cert.get()));
+}
+
+
+// Class JavaHL::UserPasswordCallback
+const char* const UserPasswordCallback::m_class_name =
+ JAVAHL_CLASS("/callback/UserPasswordCallback");
+
+UserPasswordCallback::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_ask_trust_ssl_server(
+ env.GetMethodID(cls, "askTrustSSLServer",
+ "(Ljava/lang/String;Z)I")),
+ m_mid_prompt_2arg(
+ env.GetMethodID(cls, "prompt",
+ "(Ljava/lang/String;Ljava/lang/String;)Z")),
+ m_mid_ask_yes_no(
+ env.GetMethodID(cls, "askYesNo",
+ "(Ljava/lang/String;Ljava/lang/String;Z)Z")),
+ m_mid_ask_question_3arg(
+ env.GetMethodID(cls, "askQuestion",
+ "(Ljava/lang/String;Ljava/lang/String;Z)"
+ "Ljava/lang/String;")),
+ m_mid_get_username(
+ env.GetMethodID(cls, "getUsername",
+ "()Ljava/lang/String;")),
+ m_mid_get_password(
+ env.GetMethodID(cls, "getPassword",
+ "()Ljava/lang/String;")),
+ m_mid_prompt(
+ env.GetMethodID(cls, "prompt",
+ "(Ljava/lang/String;Ljava/lang/String;Z)Z")),
+ m_mid_ask_question(
+ env.GetMethodID(cls, "askQuestion",
+ "(Ljava/lang/String;Ljava/lang/String;ZZ)"
+ "Ljava/lang/String;")),
+ m_mid_user_allowed_save(
+ env.GetMethodID(cls, "userAllowedSave", "()Z"))
+{}
+
+UserPasswordCallback::ClassImpl::~ClassImpl() {}
+
+jint UserPasswordCallback::ask_trust_ssl_server(const ::Java::String& info,
+ bool allow_permanently)
+{
+ return m_env.CallIntMethod(m_jthis, impl().m_mid_ask_trust_ssl_server,
+ info.get(), jboolean(allow_permanently));
+}
+
+bool UserPasswordCallback::prompt(const ::Java::String& realm,
+ const ::Java::String& username)
+{
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_prompt_2arg,
+ realm.get(), username.get());
+}
+
+bool UserPasswordCallback::ask_yes_no(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool yes_is_default)
+{
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_ask_yes_no,
+ realm.get(), question.get(),
+ jboolean(yes_is_default));
+}
+
+jstring UserPasswordCallback::ask_question(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool show_answer)
+{
+ return jstring(m_env.CallObjectMethod(m_jthis,
+ impl().m_mid_ask_question_3arg,
+ realm.get(), question.get(),
+ jboolean(show_answer)));
+}
+
+jstring UserPasswordCallback::get_username()
+{
+ return jstring(m_env.CallObjectMethod(m_jthis, impl().m_mid_get_username));
+}
+
+jstring UserPasswordCallback::get_password()
+{
+ return jstring(m_env.CallObjectMethod(m_jthis, impl().m_mid_get_password));
+}
+
+bool UserPasswordCallback::prompt(const ::Java::String& realm,
+ const ::Java::String& username,
+ bool may_save)
+{
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_prompt,
+ realm.get(), username.get(),
+ jboolean(may_save));
+}
+
+jstring UserPasswordCallback::ask_question(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool show_answer, bool may_save)
+{
+ return jstring(m_env.CallObjectMethod(m_jthis, impl().m_mid_ask_question,
+ realm.get(), question.get(),
+ jboolean(show_answer),
+ jboolean(may_save)));
+}
+
+bool UserPasswordCallback::user_allowed_save()
+{
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_user_allowed_save);
+}
+
+} // namespace JavaHL
diff --git a/subversion/bindings/javahl/native/AuthnCallback.hpp b/subversion/bindings/javahl/native/AuthnCallback.hpp
new file mode 100644
index 0000000..f30d004
--- /dev/null
+++ b/subversion/bindings/javahl/native/AuthnCallback.hpp
@@ -0,0 +1,376 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_AUTHN_CALLBACK_HPP
+#define SVN_JAVAHL_AUTHN_CALLBACK_HPP
+
+#include "svn_auth.h"
+
+#include "Pool.h"
+
+#include "jniwrapper/jni_object.hpp"
+#include "jniwrapper/jni_string.hpp"
+
+namespace JavaHL {
+
+/**
+ * Object wrapper for @c org.apache.subversion.javahl.callback.AuthnCallback.
+ *
+ * @since New in 1.9.
+ */
+class AuthnCallback : public ::Java::Object
+{
+public:
+ /**
+ * Object wrapper for @c ...AuthnCallback$AuthnResult.
+ */
+ class AuthnResult : public ::Java::Object
+ {
+ public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit AuthnResult(::Java::Env env, jobject jthis)
+ : ::Java::Object(env, ::Java::ClassCache::get_authn_result(env), jthis)
+ {}
+
+ bool save() const
+ {
+ return (0 != m_env.GetBooleanField(m_jthis, impl().m_fid_save));
+ }
+
+ bool trust() const
+ {
+ return (0 != m_env.GetBooleanField(m_jthis, impl().m_fid_trust));
+ }
+
+ jstring identity() const
+ {
+ return jstring(m_env.GetObjectField(m_jthis, impl().m_fid_identity));
+ }
+
+ jstring secret() const
+ {
+ return jstring(m_env.GetObjectField(m_jthis, impl().m_fid_secret));
+ }
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::FieldID m_fid_save;
+ const ::Java::FieldID m_fid_trust;
+ const ::Java::FieldID m_fid_identity;
+ const ::Java::FieldID m_fid_secret;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+
+ /**
+ * Object wrapper for @c ...AuthnCallback$SSLServerCertFailures.
+ */
+ class SSLServerCertFailures : public ::Java::Object
+ {
+ public:
+ /**
+ * Creates and initializes a wrapped object;
+ * @a failures is a set of flags.
+ */
+ explicit SSLServerCertFailures(::Java::Env env, jint failures);
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_ctor;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+
+ /**
+ * Object wrapper for @c ...AuthnCallback$SSLServerCertInfo.
+ */
+ class SSLServerCertInfo : public ::Java::Object
+ {
+ public:
+ /**
+ * Creates and initializes a wrapped object;
+ */
+ explicit SSLServerCertInfo(::Java::Env env, const char* ascii_cert);
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_ctor;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit AuthnCallback(::Java::Env env, jobject jthis)
+ : ::Java::Object(env, ::Java::ClassCache::get_authn_cb(env), jthis)
+ {}
+
+ /**
+ * Invokes the Java method AuthnCallback.usernamePrompt().
+ */
+ jobject username_prompt(const ::Java::String& realm, bool may_save);
+
+
+ /**
+ * Invokes the Java method AuthnCallback.userPasswordPrompt().
+ */
+ jobject user_password_prompt(const ::Java::String& realm,
+ const ::Java::String& username,
+ bool may_save);
+
+ /**
+ * Invokes the Java method AuthnCallback.sslServerTrustPrompt().
+ */
+ jobject ssl_server_trust_prompt(const ::Java::String& realm,
+ const SSLServerCertFailures& failures,
+ const SSLServerCertInfo& info,
+ bool may_save);
+
+ /**
+ * Invokes the Java method AuthnCallback.sslClientCertPrompt().
+ */
+ jobject ssl_client_cert_prompt(const ::Java::String& realm, bool may_save);
+
+ /**
+ * Invokes the Java method AuthnCallback.sslClientCertPassphrasePrompt().
+ */
+ jobject ssl_client_cert_passphrase_prompt(const ::Java::String& realm,
+ bool may_save);
+
+ /**
+ * Invokes the Java method AuthnCallback.allowStorePlaintextPassword().
+ */
+ bool allow_store_plaintext_password(const ::Java::String& realm);
+
+ /**
+ * Invokes the Java method AuthnCallback.allowStorePlaintextPassphrase().
+ */
+ bool allow_store_plaintext_passphrase(const ::Java::String& realm);
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_username_prompt;
+ const ::Java::MethodID m_mid_user_password_prompt;
+ const ::Java::MethodID m_mid_ssl_server_trust_prompt;
+ const ::Java::MethodID m_mid_ssl_client_cert_prompt;
+ const ::Java::MethodID m_mid_ssl_client_cert_passphrase_prompt;
+ const ::Java::MethodID m_mid_allow_store_plaintext_password;
+ const ::Java::MethodID m_mid_allow_store_plaintext_passphrase;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+
+/**
+ * Object wrapper for the deprecated interface
+ * @c org.apache.subversion.javahl.callback.UserPasswordCallback.
+ *
+ * @since New in 1.9.
+ */
+class UserPasswordCallback : public ::Java::Object
+{
+public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit UserPasswordCallback(::Java::Env env, jobject jthis)
+ : ::Java::Object(env, ::Java::ClassCache::get_user_passwd_cb(env), jthis)
+ {}
+
+ /**
+ * Invokes the Java method UserPasswordCallback.askTrustSSLServer().
+ */
+ jint ask_trust_ssl_server(const ::Java::String& info,
+ bool allow_permanently);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.prompt().
+ */
+ bool prompt(const ::Java::String& realm,
+ const ::Java::String& username);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.askYesNo().
+ */
+ bool ask_yes_no(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool yes_is_default);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.askQuestion().
+ */
+ jstring ask_question(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool show_answer);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.getUsername().
+ */
+ jstring get_username();
+
+ /**
+ * Invokes the Java method UserPasswordCallback.getPassword().
+ */
+ jstring get_password();
+
+ /**
+ * Invokes the Java method UserPasswordCallback.prompt().
+ */
+ bool prompt(const ::Java::String& realm,
+ const ::Java::String& username,
+ bool may_save);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.askQuestion().
+ */
+ jstring ask_question(const ::Java::String& realm,
+ const ::Java::String& question,
+ bool show_answer, bool may_save);
+
+ /**
+ * Invokes the Java method UserPasswordCallback.userAllowedSave().
+ */
+ bool user_allowed_save();
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_ask_trust_ssl_server;
+ const ::Java::MethodID m_mid_prompt_2arg;
+ const ::Java::MethodID m_mid_ask_yes_no;
+ const ::Java::MethodID m_mid_ask_question_3arg;
+ const ::Java::MethodID m_mid_get_username;
+ const ::Java::MethodID m_mid_get_password;
+ const ::Java::MethodID m_mid_prompt;
+ const ::Java::MethodID m_mid_ask_question;
+ const ::Java::MethodID m_mid_user_allowed_save;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_AUTHN_CALLBACK_HPP
diff --git a/subversion/bindings/javahl/native/BlameCallback.cpp b/subversion/bindings/javahl/native/BlameCallback.cpp
index 5973707..10a8ff7 100644
--- a/subversion/bindings/javahl/native/BlameCallback.cpp
+++ b/subversion/bindings/javahl/native/BlameCallback.cpp
@@ -92,7 +92,7 @@ BlameCallback::singleLine(svn_revnum_t start_revnum, svn_revnum_t end_revnum,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/BlameCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/BlameCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
@@ -104,14 +104,14 @@ BlameCallback::singleLine(svn_revnum_t start_revnum, svn_revnum_t end_revnum,
}
// convert the parameters to their Java relatives
- jobject jrevProps = CreateJ::PropertyMap(revProps);
+ jobject jrevProps = CreateJ::PropertyMap(revProps, pool);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
jobject jmergedRevProps = NULL;
if (mergedRevProps != NULL)
{
- jmergedRevProps = CreateJ::PropertyMap(mergedRevProps);
+ jmergedRevProps = CreateJ::PropertyMap(mergedRevProps, pool);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -128,8 +128,6 @@ BlameCallback::singleLine(svn_revnum_t start_revnum, svn_revnum_t end_revnum,
env->CallVoidMethod(m_callback, mid, (jlong)line_no, (jlong)revision,
jrevProps, (jlong)mergedRevision, jmergedRevProps,
jmergedPath, jline, (jboolean)localChange);
- // No need to check for an exception here, because we return anyway.
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
diff --git a/subversion/bindings/javahl/native/ChangelistCallback.cpp b/subversion/bindings/javahl/native/ChangelistCallback.cpp
index d04ba32..621de3d 100644
--- a/subversion/bindings/javahl/native/ChangelistCallback.cpp
+++ b/subversion/bindings/javahl/native/ChangelistCallback.cpp
@@ -78,7 +78,7 @@ ChangelistCallback::doChangelist(const char *path, const char *changelist,
// it can be cached.
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ChangelistCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ChangelistCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
diff --git a/subversion/bindings/javahl/native/ClientContext.cpp b/subversion/bindings/javahl/native/ClientContext.cpp
index f1babc9..c9f327b 100644
--- a/subversion/bindings/javahl/native/ClientContext.cpp
+++ b/subversion/bindings/javahl/native/ClientContext.cpp
@@ -26,7 +26,6 @@
#include "svn_client.h"
#include "private/svn_wc_private.h"
-#include "svn_private_config.h"
#include "ClientContext.h"
#include "JNIUtil.h"
@@ -37,39 +36,13 @@
#include "EnumMapper.h"
#include "CommitMessage.h"
+#include "svn_private_config.h"
ClientContext::ClientContext(jobject jsvnclient, SVN::Pool &pool)
- : m_prompter(NULL),
- m_cancelOperation(false)
+ : OperationContext(pool)
{
- JNIEnv *env = JNIUtil::getEnv();
-
- /* Grab a global reference to the Java object embedded in the parent Java
- object. */
static jfieldID ctxFieldID = 0;
- if (ctxFieldID == 0)
- {
- jclass clazz = env->GetObjectClass(jsvnclient);
- if (JNIUtil::isJavaExceptionThrown())
- return;
-
- ctxFieldID = env->GetFieldID(clazz, "clientContext",
- "L"JAVA_PACKAGE"/SVNClient$ClientContext;");
- if (JNIUtil::isJavaExceptionThrown() || ctxFieldID == 0)
- return;
-
- env->DeleteLocalRef(clazz);
- }
-
- jobject jctx = env->GetObjectField(jsvnclient, ctxFieldID);
- if (JNIUtil::isJavaExceptionThrown())
- return;
-
- m_jctx = env->NewGlobalRef(jctx);
- if (JNIUtil::isJavaExceptionThrown())
- return;
-
- env->DeleteLocalRef(jctx);
+ attachJavaObject(jsvnclient, JAVAHL_ARG("/SVNClient$ClientContext;"), "clientContext", &ctxFieldID);
SVN_JNI_ERR(svn_client_create_context2(&m_context, NULL,
pool.getPool()),
@@ -96,18 +69,36 @@ ClientContext::ClientContext(jobject jsvnclient, SVN::Pool &pool)
m_context->conflict_func2 = resolve;
m_context->conflict_baton2 = m_jctx;
- m_context->client_name = "javahl";
- m_pool = &pool;
+ m_context->client_name = getClientName();
+
+ if (m_jtunnelcb)
+ {
+ m_context->check_tunnel_func = checkTunnel;
+ m_context->open_tunnel_func = openTunnel;
+ m_context->tunnel_baton = m_jtunnelcb;
+ }
}
ClientContext::~ClientContext()
{
- delete m_prompter;
-
- JNIEnv *env = JNIUtil::getEnv();
- env->DeleteGlobalRef(m_jctx);
}
+void ClientContext::setTunnelCallback(jobject jtunnelcb)
+{
+ OperationContext::setTunnelCallback(jtunnelcb);
+ if (m_jtunnelcb)
+ {
+ m_context->check_tunnel_func = checkTunnel;
+ m_context->open_tunnel_func = openTunnel;
+ m_context->tunnel_baton = m_jtunnelcb;
+ }
+ else
+ {
+ m_context->check_tunnel_func = NULL;
+ m_context->open_tunnel_func = NULL;
+ m_context->tunnel_baton = NULL;
+ }
+}
/* Helper function to make sure that we don't keep dangling pointers in ctx.
Note that this function might be called multiple times if getContext()
@@ -140,7 +131,6 @@ svn_client_ctx_t *
ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool)
{
apr_pool_t *pool = in_pool.getPool();
- svn_auth_baton_t *ab;
svn_client_ctx_t *ctx = m_context;
/* Make a temporary copy of ctx to restore at pool cleanup to avoid
@@ -157,122 +147,17 @@ ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool)
apr_pool_cleanup_register(in_pool.getPool(), bt, clear_ctx_ptrs,
clear_ctx_ptrs);
-
if (!ctx->config)
{
- const char *configDir = m_configDir.c_str();
- if (m_configDir.empty())
- configDir = NULL;
- SVN_JNI_ERR(svn_config_get_config(&(ctx->config), configDir,
- m_pool->getPool()),
- NULL);
+ apr_hash_t * configData = getConfigData();
+ ctx->config = configData;
bt->backup->config = ctx->config;
}
- svn_config_t *config =
- reinterpret_cast<svn_config_t *>(apr_hash_get(ctx->config,
- SVN_CONFIG_CATEGORY_CONFIG,
- APR_HASH_KEY_STRING));
-
-
- /* The whole list of registered providers */
- apr_array_header_t *providers;
-
- /* Populate the registered providers with the platform-specific providers */
- SVN_JNI_ERR(svn_auth_get_platform_specific_client_providers(&providers,
- config,
- pool),
- NULL);
-
- /* Use the prompter (if available) to prompt for password and cert
- * caching. */
- svn_auth_plaintext_prompt_func_t plaintext_prompt_func = NULL;
- void *plaintext_prompt_baton = NULL;
- svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func;
- void *plaintext_passphrase_prompt_baton = NULL;
-
- if (m_prompter != NULL)
- {
- plaintext_prompt_func = Prompter::plaintext_prompt;
- plaintext_prompt_baton = m_prompter;
- plaintext_passphrase_prompt_func = Prompter::plaintext_passphrase_prompt;
- plaintext_passphrase_prompt_baton = m_prompter;
- }
-
- /* The main disk-caching auth providers, for both
- * 'username/password' creds and 'username' creds. */
- svn_auth_provider_object_t *provider;
-
- svn_auth_get_simple_provider2(&provider, plaintext_prompt_func,
- plaintext_prompt_baton, pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- svn_auth_get_username_provider(&provider, pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- /* The server-cert, client-cert, and client-cert-password providers. */
- SVN_JNI_ERR(svn_auth_get_platform_specific_provider(&provider,
- "windows",
- "ssl_server_trust",
- pool),
- NULL);
-
- if (provider)
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- svn_auth_get_ssl_server_trust_file_provider(&provider, pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
- svn_auth_get_ssl_client_cert_file_provider(&provider, pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
- svn_auth_get_ssl_client_cert_pw_file_provider2(&provider,
- plaintext_passphrase_prompt_func,
- plaintext_passphrase_prompt_baton, pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- if (m_prompter != NULL)
- {
- /* Two basic prompt providers: username/password, and just username.*/
- provider = m_prompter->getProviderSimple(in_pool);
-
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- provider = m_prompter->getProviderUsername(in_pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- /* Three ssl prompt providers, for server-certs, client-certs,
- * and client-cert-passphrases. */
- provider = m_prompter->getProviderServerSSLTrust(in_pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- provider = m_prompter->getProviderClientSSL(in_pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- provider = m_prompter->getProviderClientSSLPassword(in_pool);
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
- }
- /* Build an authentication baton to give to libsvn_client. */
- svn_auth_open(&ab, providers, pool);
-
- /* Place any default --username or --password credentials into the
- * auth_baton's run-time parameter hash. ### Same with --no-auth-cache? */
- if (!m_userName.empty())
- svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
- apr_pstrdup(in_pool.getPool(),
- m_userName.c_str()));
- if (!m_passWord.empty())
- svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
- apr_pstrdup(in_pool.getPool(),
- m_passWord.c_str()));
- /* Store where to retrieve authentication data? */
- if (!m_configDir.empty())
- svn_auth_set_parameter(ab, SVN_AUTH_PARAM_CONFIG_DIR,
- apr_pstrdup(in_pool.getPool(),
- m_configDir.c_str()));
-
- ctx->auth_baton = ab;
+ ctx->auth_baton = getAuthBaton(in_pool);
ctx->log_msg_baton3 = message;
- m_cancelOperation = false;
+ resetCancelRequest();
SVN_JNI_ERR(svn_wc_context_create(&ctx->wc_ctx, NULL,
in_pool.getPool(), in_pool.getPool()),
@@ -282,60 +167,6 @@ ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool)
}
void
-ClientContext::username(const char *pi_username)
-{
- m_userName = (pi_username == NULL ? "" : pi_username);
-}
-
-void
-ClientContext::password(const char *pi_password)
-{
- m_passWord = (pi_password == NULL ? "" : pi_password);
-}
-
-void
-ClientContext::setPrompt(Prompter *prompter)
-{
- delete m_prompter;
- m_prompter = prompter;
-}
-
-void
-ClientContext::setConfigDirectory(const char *configDir)
-{
- // A change to the config directory may necessitate creation of
- // the config templates.
- SVN::Pool requestPool;
- SVN_JNI_ERR(svn_config_ensure(configDir, requestPool.getPool()), );
-
- m_configDir = (configDir == NULL ? "" : configDir);
- m_context->config = NULL;
-}
-
-const char *
-ClientContext::getConfigDirectory() const
-{
- return m_configDir.c_str();
-}
-
-void
-ClientContext::cancelOperation()
-{
- m_cancelOperation = true;
-}
-
-svn_error_t *
-ClientContext::checkCancel(void *cancelBaton)
-{
- ClientContext *that = static_cast<ClientContext *>(cancelBaton);
- if (that->m_cancelOperation)
- return svn_error_create(SVN_ERR_CANCELLED, NULL,
- _("Operation cancelled"));
- else
- return SVN_NO_ERROR;
-}
-
-void
ClientContext::notify(void *baton,
const svn_wc_notify_t *notify,
apr_pool_t *pool)
@@ -351,7 +182,7 @@ ClientContext::notify(void *baton,
return;
mid = env->GetMethodID(clazz, "onNotify",
- "(L"JAVA_PACKAGE"/ClientNotifyInformation;)V");
+ "(" JAVAHL_ARG("/ClientNotifyInformation;") ")V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
return;
@@ -369,54 +200,6 @@ ClientContext::notify(void *baton,
env->DeleteLocalRef(jInfo);
}
-void
-ClientContext::progress(apr_off_t progressVal, apr_off_t total,
- void *baton, apr_pool_t *pool)
-{
- jobject jctx = (jobject) baton;
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return;
-
- static jmethodID mid = 0;
- if (mid == 0)
- {
- jclass clazz = env->GetObjectClass(jctx);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
-
- mid = env->GetMethodID(clazz, "onProgress",
- "(L"JAVA_PACKAGE"/ProgressEvent;)V");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN_NOTHING();
- }
-
- static jmethodID midCT = 0;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/ProgressEvent");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
-
- if (midCT == 0)
- {
- midCT = env->GetMethodID(clazz, "<init>", "(JJ)V");
- if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
- POP_AND_RETURN_NOTHING();
- }
-
- // Call the Java method.
- jobject jevent = env->NewObject(clazz, midCT,
- (jlong) progressVal, (jlong) total);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
-
- env->CallVoidMethod(jctx, mid, jevent);
-
- POP_AND_RETURN_NOTHING();
-}
-
svn_error_t *
ClientContext::resolve(svn_wc_conflict_result_t **result,
const svn_wc_conflict_description2_t *desc,
@@ -440,8 +223,8 @@ ClientContext::resolve(svn_wc_conflict_result_t **result,
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "resolve",
- "(L"JAVA_PACKAGE"/ConflictDescriptor;)"
- "L"JAVA_PACKAGE"/ConflictResult;");
+ "(" JAVAHL_ARG("/ConflictDescriptor;") ")"
+ JAVAHL_ARG("/ConflictResult;"));
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -493,7 +276,7 @@ ClientContext::javaResultToC(jobject jresult, apr_pool_t *pool)
jclass clazz = NULL;
if (getChoice == 0 || getMergedPath == 0)
{
- clazz = env->FindClass(JAVA_PACKAGE "/ConflictResult");
+ clazz = env->FindClass(JAVAHL_CLASS("/ConflictResult"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
}
@@ -501,7 +284,7 @@ ClientContext::javaResultToC(jobject jresult, apr_pool_t *pool)
if (getChoice == 0)
{
getChoice = env->GetMethodID(clazz, "getChoice",
- "()L"JAVA_PACKAGE"/ConflictResult$Choice;");
+ "()" JAVAHL_ARG("/ConflictResult$Choice;"));
if (JNIUtil::isJavaExceptionThrown() || getChoice == 0)
POP_AND_RETURN_NULL;
}
diff --git a/subversion/bindings/javahl/native/ClientContext.h b/subversion/bindings/javahl/native/ClientContext.h
index de3ece1..55ae9ff 100644
--- a/subversion/bindings/javahl/native/ClientContext.h
+++ b/subversion/bindings/javahl/native/ClientContext.h
@@ -29,6 +29,8 @@
#include <string>
+#include "OperationContext.h"
+
#include "svn_types.h"
#include "svn_client.h"
@@ -36,7 +38,6 @@
#include "Pool.h"
#include "JNIStringHolder.h"
-class Prompter;
class CommitMessage;
/**
@@ -44,25 +45,14 @@ class CommitMessage;
* and implements the functions read & close of svn_stream_t.
*
*/
-class ClientContext
+class ClientContext : public OperationContext
{
private:
svn_client_ctx_t *m_context;
- const SVN::Pool *m_pool;
- jobject m_jctx;
-
- std::string m_userName;
- std::string m_passWord;
- std::string m_configDir;
-
- Prompter *m_prompter;
- bool m_cancelOperation;
protected:
static void notify(void *baton, const svn_wc_notify_t *notify,
apr_pool_t *pool);
- static void progress(apr_off_t progressVal, apr_off_t total,
- void *baton, apr_pool_t *pool);
static svn_error_t *resolve(svn_wc_conflict_result_t **result,
const svn_wc_conflict_description2_t *desc,
void *baton,
@@ -73,24 +63,10 @@ class ClientContext
public:
ClientContext(jobject jsvnclient, SVN::Pool &pool);
- ~ClientContext();
-
- static svn_error_t *checkCancel(void *cancelBaton);
+ virtual ~ClientContext();
+ virtual void setTunnelCallback(jobject jtunnelcb);
svn_client_ctx_t *getContext(CommitMessage *message, SVN::Pool &in_pool);
-
- void username(const char *pi_username);
- void password(const char *pi_password);
- void setPrompt(Prompter *prompter);
- void cancelOperation();
- const char *getConfigDirectory() const;
-
- /**
- * Set the configuration directory, taking the usual steps to
- * ensure that Subversion's config file templates exist in the
- * specified location.
- */
- void setConfigDirectory(const char *configDir);
};
#endif // CLIENTCONTEXT_H
diff --git a/subversion/bindings/javahl/native/CommitCallback.cpp b/subversion/bindings/javahl/native/CommitCallback.cpp
index 2ffe326..2139312 100644
--- a/subversion/bindings/javahl/native/CommitCallback.cpp
+++ b/subversion/bindings/javahl/native/CommitCallback.cpp
@@ -37,9 +37,8 @@
* @param jcallback the Java callback object.
*/
CommitCallback::CommitCallback(jobject jcallback)
-{
- m_callback = jcallback;
-}
+ : m_callback(jcallback)
+{}
/**
* Destroy a CommitCallback object
@@ -81,13 +80,13 @@ CommitCallback::commitInfo(const svn_commit_info_t *commit_info,
static jmethodID sm_mid = 0;
if (sm_mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/CommitCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/CommitCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
sm_mid = env->GetMethodID(clazz,
"commitInfo",
- "(L"JAVA_PACKAGE"/CommitInfo;)V");
+ "(" JAVAHL_ARG("/CommitInfo;") ")V");
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -97,8 +96,17 @@ CommitCallback::commitInfo(const svn_commit_info_t *commit_info,
POP_AND_RETURN(SVN_NO_ERROR);
env->CallVoidMethod(m_callback, sm_mid, jcommitInfo);
- // No need to check for an exception here, because we return anyway.
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
+}
+
+
+PersistentCommitCallback::PersistentCommitCallback(jobject jcallback)
+ : CommitCallback(JNIUtil::getEnv()->NewGlobalRef(jcallback))
+{}
+
+PersistentCommitCallback::~PersistentCommitCallback()
+{
+ if (m_callback)
+ JNIUtil::getEnv()->DeleteGlobalRef(m_callback);
}
diff --git a/subversion/bindings/javahl/native/CommitCallback.h b/subversion/bindings/javahl/native/CommitCallback.h
index d08219f..0c4fe0f 100644
--- a/subversion/bindings/javahl/native/CommitCallback.h
+++ b/subversion/bindings/javahl/native/CommitCallback.h
@@ -47,11 +47,26 @@ class CommitCallback
svn_error_t *commitInfo(const svn_commit_info_t *commit_info,
apr_pool_t *pool);
- private:
/**
* This a local reference to the Java object.
*/
jobject m_callback;
};
+/**
+ * Like CommitCallback, but maintains a reference to the Java object
+ * across JNI calls.
+ */
+class PersistentCommitCallback : protected CommitCallback
+{
+ public:
+ PersistentCommitCallback(jobject jcallback);
+ ~PersistentCommitCallback();
+ static svn_error_t *callback(const svn_commit_info_t *commit_info,
+ void *baton, apr_pool_t *pool)
+ {
+ return CommitCallback::callback(commit_info, baton, pool);
+ }
+};
+
#endif // COMMITCALLBACK_H
diff --git a/subversion/bindings/javahl/native/CommitEditor.cpp b/subversion/bindings/javahl/native/CommitEditor.cpp
new file mode 100644
index 0000000..0a550d8
--- /dev/null
+++ b/subversion/bindings/javahl/native/CommitEditor.cpp
@@ -0,0 +1,618 @@
+/**
+ * @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 CommitEditor.cpp
+ * @brief Implementation of the class CommitEditor
+ */
+
+#include "CommitEditor.h"
+#include "EnumMapper.h"
+#include "InputStream.h"
+#include "Iterator.h"
+#include "JNIByteArray.h"
+#include "LockTokenTable.h"
+#include "PropertyTable.h"
+#include "RemoteSession.h"
+
+#include <apr_tables.h>
+#include "svn_checksum.h"
+#include "private/svn_editor.h"
+#include "private/svn_ra_private.h"
+#include "svn_private_config.h"
+
+#include "EditorCallbacks.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_stack.hpp"
+
+CommitEditor*
+CommitEditor::getCppObject(jobject jthis)
+{
+ static jfieldID fid = 0;
+ jlong cppAddr = SVNBase::findCppAddrForJObject(
+ jthis, &fid, JAVAHL_CLASS("/remote/CommitEditor"));
+ return (cppAddr == 0 ? NULL : reinterpret_cast<CommitEditor*>(cppAddr));
+}
+
+jlong
+CommitEditor::createInstance(jobject jsession,
+ jobject jrevprops,
+ jobject jcommit_callback,
+ jobject jlock_tokens,
+ jboolean jkeep_locks,
+ jobject jget_base_cb,
+ jobject jget_props_cb,
+ jobject jget_kind_cb)
+{
+ RemoteSession* session = RemoteSession::getCppObject(jsession);
+ CPPADDR_NULL_PTR(session, 0);
+
+ CommitEditor* editor = new CommitEditor(session,
+ jrevprops, jcommit_callback,
+ jlock_tokens, jkeep_locks,
+ jget_base_cb, jget_props_cb,
+ jget_kind_cb);
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ delete editor;
+ return 0;
+ }
+ return editor->getCppAddr();
+}
+
+CommitEditor::CommitEditor(RemoteSession* session,
+ jobject jrevprops, jobject jcommit_callback,
+ jobject jlock_tokens, jboolean jkeep_locks,
+ jobject jget_base_cb, jobject jget_props_cb,
+ jobject jget_kind_cb)
+
+ : m_valid(false),
+ m_callback(jcommit_callback),
+ m_session(session),
+ m_editor(NULL),
+ m_get_base_cb(Java::Env(), jget_base_cb),
+ m_get_props_cb(Java::Env(), jget_props_cb),
+ m_get_kind_cb(Java::Env(), jget_kind_cb),
+ m_callback_session(NULL),
+ m_callback_session_url(NULL),
+ m_callback_session_uuid(NULL)
+{
+ // Store the repository root identity from the current session as we
+ // may need it to open another session in get_copysrc_kind_cb.
+ SVN_JNI_ERR(svn_ra_get_repos_root2(session->m_session,
+ &m_callback_session_url,
+ pool.getPool()),);
+ SVN_JNI_ERR(svn_ra_get_uuid2(session->m_session,
+ &m_callback_session_uuid,
+ pool.getPool()),);
+
+ PropertyTable revprops(jrevprops, true, true);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ LockTokenTable lock_tokens(jlock_tokens);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ SVN_JNI_ERR(svn_ra__get_commit_ev2(
+ &m_editor,
+ session->m_session,
+ revprops.hash(subPool),
+ m_callback.callback, &m_callback,
+ lock_tokens.hash(subPool, true),
+ bool(jkeep_locks),
+ this->provide_base_cb,
+ this->provide_props_cb,
+ this->get_copysrc_kind_cb, this,
+ pool.getPool(), // result pool
+ subPool.getPool()), // scratch pool
+ );
+ m_valid = true;
+}
+
+CommitEditor::~CommitEditor() {}
+
+void CommitEditor::dispose(jobject jthis)
+{
+ if (m_valid)
+ abort();
+
+ static jfieldID fid = 0;
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/remote/CommitEditor"));
+}
+
+namespace {
+void throw_editor_inactive()
+{
+ JNIUtil::raiseThrowable("java/lang/IllegalStateException",
+ _("The editor is not active"));
+}
+
+void throw_not_implemented(const char* fname)
+{
+ std::string msg = _("Not implemented: ");
+ msg += "CommitEditor.";
+ msg += fname;
+ JNIUtil::raiseThrowable("java/lang/RuntimeException", msg.c_str());
+}
+
+const apr_array_header_t*
+build_children(const Iterator& iter, SVN::Pool& pool)
+{
+ apr_pool_t* result_pool = pool.getPool();
+ apr_array_header_t* children = apr_array_make(
+ result_pool, 0, sizeof(const char*));
+ while (iter.hasNext())
+ {
+ JNIStringHolder path((jstring)iter.next());
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ APR_ARRAY_PUSH(children, const char*) = path.pstrdup(result_pool);
+ }
+ return children;
+}
+
+svn_checksum_t
+build_checksum(jobject jchecksum, SVN::Pool& pool)
+{
+ apr_pool_t* result_pool = pool.getPool();
+ svn_checksum_t checksum = { 0 };
+ if (jchecksum)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+
+ static jmethodID digest_mid = 0;
+ static jmethodID kind_mid = 0;
+
+ if (0 == digest_mid || 0 == kind_mid)
+ {
+ jclass cls = env->FindClass(JAVAHL_CLASS("/types/Checksum"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+
+ digest_mid = env->GetMethodID(cls, "getDigest", "()[B");
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+ kind_mid = env->GetMethodID(cls, "getKind", "()L"
+ JAVAHL_CLASS("/types/Checksum$Kind;"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+ }
+
+ jobject jdigest = env->CallObjectMethod(jchecksum, digest_mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+ jobject jkind = env->CallObjectMethod(jchecksum, kind_mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+ JNIByteArray bdigest((jbyteArray)jdigest, true);
+ if (JNIUtil::isJavaExceptionThrown())
+ return checksum;
+
+ void* digest = apr_palloc(result_pool, bdigest.getLength());
+ memcpy(digest, bdigest.getBytes(), bdigest.getLength());
+ checksum.digest = static_cast<const unsigned char*>(digest);
+ checksum.kind = EnumMapper::toChecksumKind(jkind);
+ }
+
+ return checksum;
+}
+} // anonymous namespace
+
+
+void CommitEditor::addDirectory(jstring jrelpath,
+ jobject jchildren, jobject jproperties,
+ jlong jreplaces_revision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ Iterator children(jchildren);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ PropertyTable properties(jproperties, true, true);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_add_directory(m_editor, relpath.c_str(),
+ build_children(children, subPool),
+ properties.hash(subPool),
+ svn_revnum_t(jreplaces_revision)),);
+}
+
+void CommitEditor::addFile(jstring jrelpath,
+ jobject jchecksum, jobject jcontents,
+ jobject jproperties,
+ jlong jreplaces_revision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ InputStream contents(jcontents);
+ PropertyTable properties(jproperties, true, true);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ svn_checksum_t checksum = build_checksum(jchecksum, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ SVN_JNI_ERR(svn_editor_add_file(m_editor, relpath.c_str(),
+ &checksum, contents.getStream(subPool),
+ properties.hash(subPool),
+ svn_revnum_t(jreplaces_revision)),);
+}
+
+void CommitEditor::addSymlink(jstring jrelpath,
+ jstring jtarget, jobject jproperties,
+ jlong jreplaces_revision)
+{
+ throw_not_implemented("addSymlink");
+}
+
+void CommitEditor::addAbsent(jstring jrelpath, jobject jkind,
+ jlong jreplaces_revision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_add_absent(m_editor, relpath.c_str(),
+ EnumMapper::toNodeKind(jkind),
+ svn_revnum_t(jreplaces_revision)),);
+}
+
+void CommitEditor::alterDirectory(jstring jrelpath, jlong jrevision,
+ jobject jchildren, jobject jproperties)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ Iterator children(jchildren);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ PropertyTable properties(jproperties, true, false);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_alter_directory(
+ m_editor, relpath.c_str(), svn_revnum_t(jrevision),
+ (jchildren ? build_children(children, subPool) : NULL),
+ properties.hash(subPool)),);
+}
+
+void CommitEditor::alterFile(jstring jrelpath, jlong jrevision,
+ jobject jchecksum, jobject jcontents,
+ jobject jproperties)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ InputStream contents(jcontents);
+ PropertyTable properties(jproperties, true, false);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ svn_checksum_t checksum = build_checksum(jchecksum, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ SVN_JNI_ERR(svn_editor_alter_file(
+ m_editor, relpath.c_str(), svn_revnum_t(jrevision),
+ (jcontents ? &checksum : NULL),
+ (jcontents ? contents.getStream(subPool) : NULL),
+ properties.hash(subPool)),);
+}
+
+void CommitEditor::alterSymlink(jstring jrelpath, jlong jrevision,
+ jstring jtarget, jobject jproperties)
+{
+ throw_not_implemented("alterSymlink");
+}
+
+void CommitEditor::remove(jstring jrelpath, jlong jrevision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN::Pool subPool(pool);
+ Relpath relpath(jrelpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_delete(m_editor, relpath.c_str(),
+ svn_revnum_t(jrevision)),);
+}
+
+void CommitEditor::copy(jstring jsrc_relpath, jlong jsrc_revision,
+ jstring jdst_relpath, jlong jreplaces_revision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN::Pool subPool(pool);
+ Relpath src_relpath(jsrc_relpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(src_relpath.error_occurred(),);
+ Relpath dst_relpath(jdst_relpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(dst_relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_copy(m_editor,
+ src_relpath.c_str(),
+ svn_revnum_t(jsrc_revision),
+ dst_relpath.c_str(),
+ svn_revnum_t(jreplaces_revision)),);
+}
+
+void CommitEditor::move(jstring jsrc_relpath, jlong jsrc_revision,
+ jstring jdst_relpath, jlong jreplaces_revision)
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN::Pool subPool(pool);
+ Relpath src_relpath(jsrc_relpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(src_relpath.error_occurred(),);
+ Relpath dst_relpath(jdst_relpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(dst_relpath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_editor_move(m_editor,
+ src_relpath.c_str(),
+ svn_revnum_t(jsrc_revision),
+ dst_relpath.c_str(),
+ svn_revnum_t(jreplaces_revision)),);
+}
+
+void CommitEditor::complete()
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN_JNI_ERR(svn_editor_complete(m_editor),);
+ m_valid = false;
+}
+
+void CommitEditor::abort()
+{
+ if (!m_valid) { throw_editor_inactive(); return; }
+ SVN_JNI_ERR(m_session->m_context->checkCancel(m_session->m_context),);
+
+ SVN_JNI_ERR(svn_editor_abort(m_editor),);
+ m_valid = false;
+}
+
+
+namespace {
+svn_error_t* open_callback_session(svn_ra_session_t*& session,
+ const char* url, const char* uuid,
+ RemoteSessionContext* context,
+ SVN::Pool& sessionPool)
+{
+ if (!session)
+ {
+ const char* corrected_url = NULL;
+ SVN_ERR(svn_ra_open4(&session, &corrected_url, url, uuid,
+ context->getCallbacks(),
+ context->getCallbackBaton(),
+ context->getConfigData(),
+ sessionPool.getPool()));
+
+ if (corrected_url)
+ {
+ // This shouldn't happen -- the open session will give us
+ // the final redirected repository URL. There's an edge case
+ // where redirects might change while the session is open;
+ // but we'll just punt handling that to the caller.
+ return svn_error_createf(
+ SVN_ERR_RA_ILLEGAL_URL, NULL,
+ _("Repository URL changed while session was open.\n"
+ "Expected URL: %s\nApparent URL: %s"),
+ url, corrected_url);
+ }
+ }
+ return SVN_NO_ERROR;
+}
+
+void
+invoke_get_base_cb(svn_stream_t **contents, svn_revnum_t *revision,
+ Java::Env env, jobject get_base_cb,
+ const char *repos_relpath, apr_pool_t *result_pool)
+{
+ Java::String relpath(env, repos_relpath);
+ jobject jrv =
+ JavaHL::ProvideBaseCallback(env, get_base_cb)(relpath.get());
+ JavaHL::ProvideBaseCallback::ReturnValue rv(env, jrv);
+ *contents = rv.get_global_stream(result_pool);
+ *revision = svn_revnum_t(rv.get_revision());
+}
+
+void
+invoke_get_props_cb(apr_hash_t **props, svn_revnum_t *revision,
+ Java::Env env, jobject get_props_cb,
+ const char *repos_relpath, apr_pool_t *result_pool)
+{
+ Java::String relpath(env, repos_relpath);
+ jobject jrv =
+ JavaHL::ProvidePropsCallback(env, get_props_cb)(relpath.get());
+ JavaHL::ProvidePropsCallback::ReturnValue rv(env, jrv);
+ *props = rv.get_property_hash(result_pool);
+ *revision = svn_revnum_t(rv.get_revision());
+}
+
+void
+invoke_get_kind_cb(svn_node_kind_t *kind,
+ Java::Env env, jobject get_kind_cb,
+ const char *repos_relpath, svn_revnum_t revision)
+{
+ Java::String relpath(env, repos_relpath);
+ jobject jnode_kind =
+ JavaHL::GetNodeKindCallback(env, get_kind_cb)(relpath.get(),
+ jlong(revision));
+ *kind = EnumMapper::toNodeKind(jnode_kind);
+}
+} // anonymous namespace
+
+
+svn_error_t*
+CommitEditor::provide_base_cb(svn_stream_t **contents,
+ svn_revnum_t *revision,
+ void *baton,
+ const char *repos_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ CommitEditor* editor = static_cast<CommitEditor*>(baton);
+ if (editor->m_get_base_cb.get())
+ {
+ const Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_BASE,
+ invoke_get_base_cb(contents, revision, env,
+ editor->m_get_base_cb.get(),
+ repos_relpath,
+ result_pool));
+ }
+ else
+ {
+ *contents = NULL;
+ *revision = SVN_INVALID_REVNUM;
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+CommitEditor::provide_props_cb(apr_hash_t **props,
+ svn_revnum_t *revision,
+ void *baton,
+ const char *repos_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ CommitEditor* editor = static_cast<CommitEditor*>(baton);
+ if (editor->m_get_props_cb.get())
+ {
+ const Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_BASE,
+ invoke_get_props_cb(props, revision, env,
+ editor->m_get_props_cb.get(),
+ repos_relpath,
+ result_pool));
+ }
+ else
+ {
+ SVN_ERR(open_callback_session(editor->m_callback_session,
+ editor->m_callback_session_url,
+ editor->m_callback_session_uuid,
+ editor->m_session->m_context,
+ editor->pool));
+
+ svn_node_kind_t kind = svn_node_unknown;
+ SVN_ERR(svn_ra_check_path(editor->m_callback_session,
+ repos_relpath, SVN_INVALID_REVNUM, &kind,
+ scratch_pool));
+
+ // FIXME: Getting properties from the youngest revision is in
+ // fact not such a bright idea, as the path may have been moved
+ // or deleted in the repository. On the other hand, if that
+ // happens, the commit would fail due to a conflict anyway.
+ if (kind == svn_node_file)
+ return svn_ra_get_file(editor->m_callback_session,
+ repos_relpath, SVN_INVALID_REVNUM,
+ NULL, revision, props, scratch_pool);
+ else if (kind == svn_node_dir)
+ return svn_ra_get_dir2(editor->m_callback_session, NULL, revision,
+ props, repos_relpath, SVN_INVALID_REVNUM, 0,
+ scratch_pool);
+ else
+ return svn_error_createf(
+ SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Expected node kind '%s' or '%s' but got '%s'"),
+ svn_node_kind_to_word(svn_node_file),
+ svn_node_kind_to_word(svn_node_dir),
+ svn_node_kind_to_word(kind));
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+CommitEditor::get_copysrc_kind_cb(svn_node_kind_t* kind, void* baton,
+ const char* repos_relpath,
+ svn_revnum_t src_revision,
+ apr_pool_t *scratch_pool)
+{
+ CommitEditor* editor = static_cast<CommitEditor*>(baton);
+ if (editor->m_get_kind_cb.get())
+ {
+ const Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_BASE,
+ invoke_get_kind_cb(kind, env,
+ editor->m_get_kind_cb.get(),
+ repos_relpath,
+ src_revision));
+ }
+ else
+ {
+ SVN_ERR(open_callback_session(editor->m_callback_session,
+ editor->m_callback_session_url,
+ editor->m_callback_session_uuid,
+ editor->m_session->m_context,
+ editor->pool));
+
+ return svn_ra_check_path(editor->m_callback_session,
+ repos_relpath, src_revision, kind,
+ scratch_pool);
+ }
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/bindings/javahl/native/CommitEditor.h b/subversion/bindings/javahl/native/CommitEditor.h
new file mode 100644
index 0000000..4160b6c
--- /dev/null
+++ b/subversion/bindings/javahl/native/CommitEditor.h
@@ -0,0 +1,132 @@
+/**
+ * @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 CommitEditor.h
+ * @brief Interface of the class CommitEditor
+ */
+
+#ifndef JAVAHL_COMMIT_EDITOR_H
+#define JAVAHL_COMMIT_EDITOR_H
+
+#include <string>
+#include <jni.h>
+
+#include "svn_ra.h"
+
+#include "JNIUtil.h"
+#include "SVNBase.h"
+#include "CommitCallback.h"
+
+#include "jniwrapper/jni_globalref.hpp"
+
+class RemoteSession;
+
+// Forward-declare the currently private EV2 editor struct.
+struct svn_editor_t;
+
+/*
+ * This class wraps an EV2 commit editor.
+ */
+class CommitEditor : public SVNBase
+{
+public:
+ static CommitEditor* getCppObject(jobject jthis);
+ static jlong createInstance(jobject jsession,
+ jobject jrevprops,
+ jobject jcommit_callback,
+ jobject jlock_tokens,
+ jboolean jkeep_locks,
+ jobject jget_base_cb,
+ jobject jget_props_cb,
+ jobject jget_kind_cb);
+ virtual ~CommitEditor();
+
+ virtual void dispose(jobject jthis);
+
+ void addDirectory(jstring jrelpath,
+ jobject jchildren, jobject jproperties,
+ jlong jreplaces_revision);
+ void addFile(jstring jrelpath,
+ jobject jchecksum, jobject jcontents,
+ jobject jproperties,
+ jlong jreplaces_revision);
+ void addSymlink(jstring jrelpath,
+ jstring jtarget, jobject jproperties,
+ jlong jreplaces_revision);
+ void addAbsent(jstring jrelpath,
+ jobject jkind, jlong jreplaces_revision);
+ void alterDirectory(jstring jrelpath, jlong jrevision,
+ jobject jchildren, jobject jproperties);
+ void alterFile(jstring jrelpath, jlong jrevision,
+ jobject jchecksum, jobject jcontents,
+ jobject jproperties);
+ void alterSymlink(jstring jrelpath, jlong jrevision,
+ jstring jtarget, jobject jproperties);
+ void remove(jstring jrelpath, jlong jrevision);
+ void copy(jstring jsrc_relpath, jlong jsrc_revision,
+ jstring jdst_relpath, jlong jreplaces_revision);
+ void move(jstring jsrc_relpath, jlong jsrc_revision,
+ jstring jdst_relpath, jlong jreplaces_revision);
+ void complete();
+ void abort();
+
+private:
+ CommitEditor(RemoteSession* session,
+ jobject jrevprops, jobject jcommit_callback,
+ jobject jlock_tokens, jboolean jkeep_locks,
+ jobject jget_base_cb, jobject jget_props_cb,
+ jobject jget_kind_cb);
+
+ // This is our private callbacks for the commit editor.
+ static svn_error_t* provide_base_cb(svn_stream_t **contents,
+ svn_revnum_t *revision,
+ void *baton,
+ const char *repos_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* provide_props_cb(apr_hash_t **props,
+ svn_revnum_t *revision,
+ void *baton,
+ const char *repos_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* get_copysrc_kind_cb(svn_node_kind_t* kind, void* baton,
+ const char* repos_relpath,
+ svn_revnum_t src_revision,
+ apr_pool_t *scratch_pool);
+
+ bool m_valid;
+ PersistentCommitCallback m_callback;
+ RemoteSession* m_session;
+ svn_editor_t* m_editor;
+
+ Java::GlobalObject m_get_base_cb;
+ Java::GlobalObject m_get_props_cb;
+ Java::GlobalObject m_get_kind_cb;
+
+ // Temporary, while EV2 shims are in place
+ svn_ra_session_t* m_callback_session;
+ const char* m_callback_session_url;
+ const char* m_callback_session_uuid;
+};
+
+#endif // JAVAHL_COMMIT_EDITOR_H
diff --git a/subversion/bindings/javahl/native/CommitMessage.cpp b/subversion/bindings/javahl/native/CommitMessage.cpp
index a947f97..51bd83d 100644
--- a/subversion/bindings/javahl/native/CommitMessage.cpp
+++ b/subversion/bindings/javahl/native/CommitMessage.cpp
@@ -65,6 +65,7 @@ CommitMessage::getCommitMessage(const char **log_msg,
const apr_array_header_t *commit_items,
apr_pool_t *pool)
{
+ *log_msg = NULL;
*tmp_file = NULL;
JNIEnv *env = JNIUtil::getEnv();
@@ -72,7 +73,7 @@ CommitMessage::getCommitMessage(const char **log_msg,
static jmethodID midCallback = 0;
if (midCallback == 0)
{
- jclass clazz2 = env->FindClass(JAVA_PACKAGE"/callback/CommitMessageCallback");
+ jclass clazz2 = env->FindClass(JAVAHL_CLASS("/callback/CommitMessageCallback"));
if (JNIUtil::isJavaExceptionThrown())
return SVN_NO_ERROR;
@@ -93,6 +94,9 @@ CommitMessage::getCommitMessage(const char **log_msg,
jobject jitem = CreateJ::CommitItem(item);
+ if (!jitem)
+ return SVN_NO_ERROR; /* Exception thrown */
+
// store the Java object into the array
jitems.push_back(jitem);
}
@@ -102,7 +106,7 @@ CommitMessage::getCommitMessage(const char **log_msg,
midCallback,
CreateJ::Set(jitems));
if (JNIUtil::isJavaExceptionThrown())
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
if (jmessage != NULL)
{
diff --git a/subversion/bindings/javahl/native/CopySources.cpp b/subversion/bindings/javahl/native/CopySources.cpp
index 0ae471d..a1d93f4 100644
--- a/subversion/bindings/javahl/native/CopySources.cpp
+++ b/subversion/bindings/javahl/native/CopySources.cpp
@@ -60,7 +60,7 @@ CopySources::makeJCopySource(const char *path, svn_revnum_t rev, SVN::Pool &pool
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/CopySource");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/CopySource"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -69,8 +69,8 @@ CopySources::makeJCopySource(const char *path, svn_revnum_t rev, SVN::Pool &pool
{
ctor = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;"
- "L" JAVA_PACKAGE "/types/Revision;"
- "L" JAVA_PACKAGE "/types/Revision;)V");
+ JAVAHL_ARG("/types/Revision;")
+ JAVAHL_ARG("/types/Revision;") ")V");
if (JNIUtil::isExceptionThrown())
POP_AND_RETURN_NULL;
}
@@ -88,7 +88,7 @@ CopySources::array(SVN::Pool &pool)
apr_pool_t *p = pool.getPool();
JNIEnv *env = JNIUtil::getEnv();
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/CopySource");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/CopySource"));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
@@ -132,7 +132,7 @@ CopySources::array(SVN::Pool &pool)
if (getRevision == 0)
{
getRevision = env->GetMethodID(clazz, "getRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
+ "()" JAVAHL_ARG("/types/Revision;"));
if (JNIUtil::isJavaExceptionThrown() || getRevision == 0)
return NULL;
}
@@ -151,7 +151,7 @@ CopySources::array(SVN::Pool &pool)
if (getPegRevision == 0)
{
getPegRevision = env->GetMethodID(clazz, "getPegRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
+ "()" JAVAHL_ARG("/types/Revision;"));
if (JNIUtil::isJavaExceptionThrown() || getPegRevision == 0)
return NULL;
}
diff --git a/subversion/bindings/javahl/native/CreateJ.cpp b/subversion/bindings/javahl/native/CreateJ.cpp
index 9b40ce7..d9dffa2 100644
--- a/subversion/bindings/javahl/native/CreateJ.cpp
+++ b/subversion/bindings/javahl/native/CreateJ.cpp
@@ -30,12 +30,14 @@
#include "JNIStringHolder.h"
#include "EnumMapper.h"
#include "RevisionRange.h"
+#include "RevisionRangeList.h"
#include "CreateJ.h"
#include "../include/org_apache_subversion_javahl_types_Revision.h"
#include "../include/org_apache_subversion_javahl_CommitItemStateFlags.h"
#include "svn_path.h"
#include "svn_props.h"
+#include "svn_mergeinfo.h"
#include "private/svn_wc_private.h"
jobject
@@ -52,7 +54,7 @@ CreateJ::ConflictDescriptor(const svn_wc_conflict_description2_t *desc)
return NULL;
// Create an instance of the conflict descriptor.
- jclass clazz = env->FindClass(JAVA_PACKAGE "/ConflictDescriptor");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ConflictDescriptor"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -60,16 +62,17 @@ CreateJ::ConflictDescriptor(const svn_wc_conflict_description2_t *desc)
if (ctor == 0)
{
ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/ConflictDescriptor$Kind;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/ConflictDescriptor$Kind;")
+ JAVAHL_ARG("/types/NodeKind;")
"Ljava/lang/String;ZLjava/lang/String;"
- "L"JAVA_PACKAGE"/ConflictDescriptor$Action;"
- "L"JAVA_PACKAGE"/ConflictDescriptor$Reason;"
- "L"JAVA_PACKAGE"/ConflictDescriptor$Operation;"
+ JAVAHL_ARG("/ConflictDescriptor$Action;")
+ JAVAHL_ARG("/ConflictDescriptor$Reason;")
+ JAVAHL_ARG("/ConflictDescriptor$Operation;")
"Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/ConflictVersion;"
- "L"JAVA_PACKAGE"/types/ConflictVersion;)V");
+ JAVAHL_ARG("/types/ConflictVersion;")
+ JAVAHL_ARG("/types/ConflictVersion;")
+ "Ljava/lang/String;[B[B[B[B)V");
if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
POP_AND_RETURN_NULL;
}
@@ -116,6 +119,33 @@ CreateJ::ConflictDescriptor(const svn_wc_conflict_description2_t *desc)
jobject joperation = EnumMapper::mapOperation(desc->operation);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
+ jstring jpropRejectAbspath = JNIUtil::makeJString(desc->prop_reject_abspath);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jbyteArray jpropValueBase = (
+ !desc->prop_value_base ? NULL
+ :JNIUtil::makeJByteArray(desc->prop_value_base->data,
+ int(desc->prop_value_base->len)));
+ if (JNIUtil::isExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jbyteArray jpropValueWorking = (
+ !desc->prop_value_working ? NULL
+ :JNIUtil::makeJByteArray(desc->prop_value_working->data,
+ int(desc->prop_value_working->len)));
+ if (JNIUtil::isExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jbyteArray jpropValueIncomingOld = (
+ !desc->prop_value_incoming_old ? NULL
+ :JNIUtil::makeJByteArray(desc->prop_value_incoming_old->data,
+ int(desc->prop_value_incoming_old->len)));
+ if (JNIUtil::isExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jbyteArray jpropValueIncomingNew = (
+ !desc->prop_value_incoming_new ? NULL
+ :JNIUtil::makeJByteArray(desc->prop_value_incoming_new->data,
+ int(desc->prop_value_incoming_new->len)));
+ if (JNIUtil::isExceptionThrown())
+ POP_AND_RETURN_NULL;
// Instantiate the conflict descriptor.
jobject jdesc = env->NewObject(clazz, ctor, jpath, jconflictKind,
@@ -123,7 +153,10 @@ CreateJ::ConflictDescriptor(const svn_wc_conflict_description2_t *desc)
(jboolean) desc->is_binary, jmimeType,
jconflictAction, jconflictReason, joperation,
jbasePath, jreposPath, juserPath,
- jmergedPath, jsrcLeft, jsrcRight);
+ jmergedPath, jsrcLeft, jsrcRight,
+ jpropRejectAbspath, jpropValueBase,
+ jpropValueWorking, jpropValueIncomingOld,
+ jpropValueIncomingNew);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -144,7 +177,7 @@ CreateJ::ConflictVersion(const svn_wc_conflict_version_t *version)
return NULL;
// Create an instance of the conflict version.
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/ConflictVersion");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/ConflictVersion"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -154,7 +187,7 @@ CreateJ::ConflictVersion(const svn_wc_conflict_version_t *version)
ctor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;"
"Ljava/lang/String;J"
"Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/types/NodeKind;")
")V");
if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
POP_AND_RETURN_NULL;
@@ -195,7 +228,7 @@ CreateJ::Checksum(const svn_checksum_t *checksum)
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/Checksum");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Checksum"));
if (JNIUtil::isExceptionThrown())
POP_AND_RETURN_NULL;
@@ -205,7 +238,7 @@ CreateJ::Checksum(const svn_checksum_t *checksum)
{
midConstructor = env->GetMethodID(clazz, "<init>",
"([B"
- "L"JAVA_PACKAGE"/types/Checksum$Kind;"
+ JAVAHL_ARG("/types/Checksum$Kind;")
")V");
if (JNIUtil::isExceptionThrown())
POP_AND_RETURN_NULL;
@@ -230,6 +263,61 @@ CreateJ::Checksum(const svn_checksum_t *checksum)
}
jobject
+CreateJ::DirEntry(const char *path, const char *absPath,
+ const svn_dirent_t *dirent)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return SVN_NO_ERROR;
+
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/DirEntry"));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ mid = env->GetMethodID(clazz, "<init>",
+ "(Ljava/lang/String;Ljava/lang/String;"
+ JAVAHL_ARG("/types/NodeKind;")
+ "JZJJLjava/lang/String;)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ jstring jPath = JNIUtil::makeJString(path);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jstring jAbsPath = JNIUtil::makeJString(absPath);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jobject jNodeKind = EnumMapper::mapNodeKind(dirent->kind);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jlong jSize = dirent->size;
+ jboolean jHasProps = (dirent->has_props? JNI_TRUE : JNI_FALSE);
+ jlong jLastChangedRevision = dirent->created_rev;
+ jlong jLastChanged = dirent->time;
+ jstring jLastAuthor = JNIUtil::makeJString(dirent->last_author);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jobject ret = env->NewObject(clazz, mid, jPath, jAbsPath, jNodeKind,
+ jSize, jHasProps, jLastChangedRevision,
+ jLastChanged, jLastAuthor);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ return env->PopLocalFrame(ret);
+}
+
+jobject
CreateJ::Info(const char *path, const svn_client_info2_t *info)
{
JNIEnv *env = JNIUtil::getEnv();
@@ -239,7 +327,7 @@ CreateJ::Info(const char *path, const svn_client_info2_t *info)
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/Info");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Info"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -249,15 +337,16 @@ CreateJ::Info(const char *path, const svn_client_info2_t *info)
mid = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;J"
- "L"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/types/NodeKind;")
"Ljava/lang/String;Ljava/lang/String;"
"JJLjava/lang/String;"
- "L"JAVA_PACKAGE"/types/Lock;Z"
- "L"JAVA_PACKAGE"/types/Info$ScheduleKind;"
+ JAVAHL_ARG("/types/Lock;Z")
+ JAVAHL_ARG("/types/Info$ScheduleKind;")
"Ljava/lang/String;JJ"
- "L"JAVA_PACKAGE"/types/Checksum;"
+ JAVAHL_ARG("/types/Checksum;")
"Ljava/lang/String;JJ"
- "L"JAVA_PACKAGE"/types/Depth;Ljava/util/Set;)V");
+ JAVAHL_ARG("/types/Depth;Ljava/util/Set;")
+ ")V");
if (mid == 0 || JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
}
@@ -384,7 +473,7 @@ CreateJ::Lock(const svn_lock_t *lock)
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/Lock");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Lock"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -423,6 +512,72 @@ CreateJ::Lock(const svn_lock_t *lock)
}
jobject
+CreateJ::LockMap(const apr_hash_t *locks, apr_pool_t *pool)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ if (locks == NULL)
+ return NULL;
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jclass clazz = env->FindClass("java/util/HashMap");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ static jmethodID init_mid = 0;
+ if (init_mid == 0)
+ {
+ init_mid = env->GetMethodID(clazz, "<init>", "()V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ static jmethodID put_mid = 0;
+ if (put_mid == 0)
+ {
+ put_mid = env->GetMethodID(clazz, "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;)"
+ "Ljava/lang/Object;");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ jobject map = env->NewObject(clazz, init_mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ apr_hash_index_t *hi;
+ int i = 0;
+ for (hi = apr_hash_first(pool, (apr_hash_t *) locks); hi;
+ hi = apr_hash_next(hi), ++i)
+ {
+ const char *key = (const char *) apr_hash_this_key(hi);
+ const svn_lock_t *lock = (const svn_lock_t *) apr_hash_this_val(hi);
+
+ jstring jpath = JNIUtil::makeJString(key);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jobject jlock = Lock(lock);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->CallObjectMethod(map, put_mid, jpath, jlock);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(jlock);
+ }
+
+ return env->PopLocalFrame(map);
+}
+
+jobject
CreateJ::ChangedPath(const char *path, svn_log_changed_path2_t *log_item)
{
JNIEnv *env = JNIUtil::getEnv();
@@ -432,7 +587,7 @@ CreateJ::ChangedPath(const char *path, svn_log_changed_path2_t *log_item)
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazzCP = env->FindClass(JAVA_PACKAGE"/types/ChangePath");
+ jclass clazzCP = env->FindClass(JAVAHL_CLASS("/types/ChangePath"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -442,10 +597,11 @@ CreateJ::ChangedPath(const char *path, svn_log_changed_path2_t *log_item)
midCP = env->GetMethodID(clazzCP,
"<init>",
"(Ljava/lang/String;JLjava/lang/String;"
- "L"JAVA_PACKAGE"/types/ChangePath$Action;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
- "L"JAVA_PACKAGE"/types/Tristate;"
- "L"JAVA_PACKAGE"/types/Tristate;)V");
+ JAVAHL_ARG("/types/ChangePath$Action;")
+ JAVAHL_ARG("/types/NodeKind;")
+ JAVAHL_ARG("/types/Tristate;")
+ JAVAHL_ARG("/types/Tristate;")
+ ")V");
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
}
@@ -493,7 +649,7 @@ CreateJ::Status(svn_wc_context_t *wc_ctx,
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/Status");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Status"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -502,15 +658,18 @@ CreateJ::Status(svn_wc_context_t *wc_ctx,
{
mid = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/types/NodeKind;")
"JJJLjava/lang/String;"
- "L"JAVA_PACKAGE"/types/Status$Kind;"
- "L"JAVA_PACKAGE"/types/Status$Kind;"
- "L"JAVA_PACKAGE"/types/Status$Kind;"
- "L"JAVA_PACKAGE"/types/Status$Kind;"
- "ZZZZZL"JAVA_PACKAGE"/types/Lock;"
- "L"JAVA_PACKAGE"/types/Lock;"
- "JJL"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/types/Status$Kind;")
+ JAVAHL_ARG("/types/Status$Kind;")
+ JAVAHL_ARG("/types/Status$Kind;")
+ JAVAHL_ARG("/types/Status$Kind;")
+ JAVAHL_ARG("/types/Status$Kind;")
+ JAVAHL_ARG("/types/Status$Kind;")
+ "ZZ" JAVAHL_ARG("/types/Depth;")
+ "ZZZ" JAVAHL_ARG("/types/Lock;")
+ JAVAHL_ARG("/types/Lock;")
+ "JJ" JAVAHL_ARG("/types/NodeKind;")
"Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;)V");
if (JNIUtil::isJavaExceptionThrown())
@@ -534,27 +693,16 @@ CreateJ::Status(svn_wc_context_t *wc_ctx,
jstring jMovedFromAbspath = NULL;
jstring jMovedToAbspath = NULL;
- enum svn_wc_status_kind text_status = status->node_status;
-
- /* Avoid using values that might come from prop changes */
- if (text_status == svn_wc_status_modified
- || text_status == svn_wc_status_conflicted)
- text_status = status->text_status;
-
- enum svn_wc_status_kind repos_text_status = status->repos_node_status;
-
- if (repos_text_status == svn_wc_status_modified
- || repos_text_status == svn_wc_status_conflicted)
- repos_text_status = status->repos_text_status;
-
- jboolean jIsConflicted = (status->conflicted == 1) ? JNI_TRUE : JNI_FALSE;
- jobject jTextType = EnumMapper::mapStatusKind(text_status);
+ jobject jNodeType = EnumMapper::mapStatusKind(status->node_status);
+ jobject jTextType = EnumMapper::mapStatusKind(status->text_status);
jobject jPropType = EnumMapper::mapStatusKind(status->prop_status);
- jobject jRepositoryTextType = EnumMapper::mapStatusKind(repos_text_status);
- jobject jRepositoryPropType = EnumMapper::mapStatusKind(
- status->repos_prop_status);
- jboolean jIsCopied = (status->copied == 1) ? JNI_TRUE: JNI_FALSE;
+ jobject jRpNodeType = EnumMapper::mapStatusKind(status->repos_node_status);
+ jobject jRpTextType = EnumMapper::mapStatusKind(status->repos_text_status);
+ jobject jRpPropType = EnumMapper::mapStatusKind(status->repos_prop_status);
+ jobject jDepth = EnumMapper::mapDepth(status->depth);
jboolean jIsLocked = (status->wc_is_locked == 1) ? JNI_TRUE: JNI_FALSE;
+ jboolean jIsCopied = (status->copied == 1) ? JNI_TRUE: JNI_FALSE;
+ jboolean jIsConflicted = (status->conflicted == 1) ? JNI_TRUE : JNI_FALSE;
jboolean jIsSwitched = (status->switched == 1) ? JNI_TRUE: JNI_FALSE;
jboolean jIsFileExternal = (status->file_external == 1) ? JNI_TRUE
: JNI_FALSE;
@@ -620,9 +768,10 @@ CreateJ::Status(svn_wc_context_t *wc_ctx,
jobject ret = env->NewObject(clazz, mid, jPath, jUrl, jNodeKind, jRevision,
jLastChangedRevision, jLastChangedDate,
- jLastCommitAuthor, jTextType, jPropType,
- jRepositoryTextType, jRepositoryPropType,
- jIsLocked, jIsCopied, jIsConflicted,
+ jLastCommitAuthor,
+ jNodeType, jTextType, jPropType,
+ jRpNodeType, jRpTextType, jRpPropType,
+ jIsLocked, jIsCopied, jDepth, jIsConflicted,
jIsSwitched, jIsFileExternal, jLocalLock,
jReposLock,
jOODLastCmtRevision, jOODLastCmtDate,
@@ -643,7 +792,7 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
return NULL;
static jmethodID midCT = 0;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/ClientNotifyInformation");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ClientNotifyInformation"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -651,16 +800,17 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
{
midCT = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/ClientNotifyInformation$Action;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
- "Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/Lock;"
+ JAVAHL_ARG("/ClientNotifyInformation$Action;")
+ JAVAHL_ARG("/types/NodeKind;")
"Ljava/lang/String;"
- "L"JAVA_PACKAGE"/ClientNotifyInformation$Status;"
- "L"JAVA_PACKAGE"/ClientNotifyInformation$Status;"
- "L"JAVA_PACKAGE"/ClientNotifyInformation$LockStatus;"
+ JAVAHL_ARG("/types/Lock;")
+ "Ljava/lang/String;Ljava/util/List;"
+ JAVAHL_ARG("/ClientNotifyInformation$Status;")
+ JAVAHL_ARG("/ClientNotifyInformation$Status;")
+ JAVAHL_ARG("/ClientNotifyInformation$LockStatus;")
"JLjava/lang/String;"
- "L"JAVA_PACKAGE"/types/RevisionRange;"
+ JAVAHL_ARG("/types/RevisionRange;")
+ "Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;"
"Ljava/util/Map;JJJJJJI)V");
if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
@@ -688,7 +838,9 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jstring jErr = JNIUtil::makeSVNErrorMessage(wcNotify->err);
+ jstring jErr;
+ jobject jErrStack;
+ JNIUtil::makeSVNErrorMessage(wcNotify->err, &jErr, &jErrStack);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -716,6 +868,10 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
POP_AND_RETURN_NULL;
}
+ jstring jUrl = JNIUtil::makeJString(wcNotify->url);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
jstring jpathPrefix = JNIUtil::makeJString(wcNotify->path_prefix);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -735,7 +891,7 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
jlong jhunkModifiedLength = wcNotify->hunk_modified_length;
jlong jhunkMatchedLine = wcNotify->hunk_matched_line;
jint jhunkFuzz = static_cast<jint>(wcNotify->hunk_fuzz);
- if (jhunkFuzz != wcNotify->hunk_fuzz)
+ if (jhunkFuzz < 0 || jhunkFuzz != wcNotify->hunk_fuzz)
{
env->ThrowNew(env->FindClass("java.lang.ArithmeticException"),
"Overflow converting C svn_linenum_t to Java int");
@@ -744,10 +900,10 @@ CreateJ::ClientNotifyInformation(const svn_wc_notify_t *wcNotify)
// call the Java method
jobject jInfo = env->NewObject(clazz, midCT, jPath, jAction,
- jKind, jMimeType, jLock, jErr,
+ jKind, jMimeType, jLock, jErr, jErrStack,
jContentState, jPropState, jLockState,
(jlong) wcNotify->revision, jChangelistName,
- jMergeRange, jpathPrefix, jpropName,
+ jMergeRange, jUrl, jpathPrefix, jpropName,
jrevProps, joldRevision,
jhunkOriginalStart, jhunkOriginalLength,
jhunkModifiedStart, jhunkModifiedLength,
@@ -769,16 +925,16 @@ CreateJ::ReposNotifyInformation(const svn_repos_notify_t *reposNotify)
return NULL;
static jmethodID midCT = 0;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/ReposNotifyInformation");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ReposNotifyInformation"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
if (midCT == 0)
{
midCT = env->GetMethodID(clazz, "<init>",
- "(L"JAVA_PACKAGE"/ReposNotifyInformation$Action;"
+ "(" JAVAHL_ARG("/ReposNotifyInformation$Action;")
"JLjava/lang/String;JJJ"
- "L"JAVA_PACKAGE"/ReposNotifyInformation$NodeAction;"
+ JAVAHL_ARG("/ReposNotifyInformation$NodeAction;")
"Ljava/lang/String;)V");
if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
POP_AND_RETURN_NULL;
@@ -827,7 +983,7 @@ CreateJ::CommitItem(svn_client_commit_item3_t *item)
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/CommitItem");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/CommitItem"));
if (JNIUtil::isExceptionThrown())
POP_AND_RETURN_NULL;
@@ -837,7 +993,7 @@ CreateJ::CommitItem(svn_client_commit_item3_t *item)
{
midConstructor = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
+ JAVAHL_ARG("/types/NodeKind;")
"ILjava/lang/String;"
"Ljava/lang/String;J"
"Ljava/lang/String;)V");
@@ -909,7 +1065,7 @@ CreateJ::CommitInfo(const svn_commit_info_t *commit_info)
return NULL;
static jmethodID midCT = 0;
- jclass clazz = env->FindClass(JAVA_PACKAGE"/CommitInfo");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/CommitInfo"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -951,82 +1107,129 @@ CreateJ::CommitInfo(const svn_commit_info_t *commit_info)
}
jobject
-CreateJ::RevisionRangeList(svn_rangelist_t *ranges)
+CreateJ::StringSet(const apr_array_header_t *strings)
{
+ std::vector<jobject> jstrs;
+
+ for (int i = 0; i < strings->nelts; ++i)
+ {
+ const char *str = APR_ARRAY_IDX(strings, i, const char *);
+ jstring jstr = JNIUtil::makeJString(str);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jstrs.push_back(jstr);
+ }
+
+ return CreateJ::Set(jstrs);
+}
+
+namespace {
+void fill_property_map(jobject map,
+ apr_hash_t* prop_hash, apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool, jmethodID put_mid)
+{
+ SVN_ERR_ASSERT_NO_RETURN(!(prop_hash && prop_diffs));
+
+ if (!map || (prop_hash == NULL && prop_diffs == NULL))
+ return;
+
JNIEnv *env = JNIUtil::getEnv();
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- jclass clazz = env->FindClass("java/util/ArrayList");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ return;
- static jmethodID init_mid = 0;
- if (init_mid == 0)
+ // The caller may not know the concrete class of the map, so
+ // determine the "put" method identifier here.
+ if (put_mid == 0)
{
- init_mid = env->GetMethodID(clazz, "<init>", "()V");
+ put_mid = env->GetMethodID(env->GetObjectClass(map), "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;)"
+ "Ljava/lang/Object;");
if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ POP_AND_RETURN_NOTHING();
}
- static jmethodID add_mid = 0;
- if (add_mid == 0)
+ struct body
+ {
+ void operator()(const char* key, const svn_string_t* val)
+ {
+ jstring jpropName = JNIUtil::makeJString(key);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ jbyteArray jpropVal = (val ? JNIUtil::makeJByteArray(val) : NULL);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ jobject ret = m_env->CallObjectMethod(m_map, m_put_mid,
+ jpropName, jpropVal);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_env->DeleteLocalRef(ret);
+ m_env->DeleteLocalRef(jpropVal);
+ m_env->DeleteLocalRef(jpropName);
+ }
+
+ JNIEnv*& m_env;
+ jmethodID& m_put_mid;
+ jobject& m_map;
+
+ body(JNIEnv*& xenv, jmethodID& xput_mid, jobject& xmap)
+ : m_env(xenv), m_put_mid(xput_mid), m_map(xmap)
+ {}
+ } loop_body(env, put_mid, map);
+
+ if (prop_hash)
{
- add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
- }
+ if (!scratch_pool)
+ scratch_pool = apr_hash_pool_get(prop_hash);
- jobject jranges = env->NewObject(clazz, init_mid);
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(scratch_pool, prop_hash);
+ hi; hi = apr_hash_next(hi))
+ {
+ const char* key;
+ svn_string_t* val;
- for (int i = 0; i < ranges->nelts; ++i)
- {
- // Convert svn_merge_range_t *'s to Java RevisionRange objects.
- svn_merge_range_t *range =
- APR_ARRAY_IDX(ranges, i, svn_merge_range_t *);
+ const void* v_key;
+ void* v_val;
- jobject jrange = RevisionRange::makeJRevisionRange(range);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ apr_hash_this(hi, &v_key, NULL, &v_val);
+ key = static_cast<const char*>(v_key);
+ val = static_cast<svn_string_t*>(v_val);
- env->CallBooleanMethod(jranges, add_mid, jrange);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- env->DeleteLocalRef(jrange);
+ loop_body(key, val);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+ }
}
-
- return env->PopLocalFrame(jranges);
-}
-
-jobject
-CreateJ::StringSet(apr_array_header_t *strings)
-{
- std::vector<jobject> jstrs;
-
- for (int i = 0; i < strings->nelts; ++i)
+ else
{
- const char *str = APR_ARRAY_IDX(strings, i, const char *);
- jstring jstr = JNIUtil::makeJString(str);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- jstrs.push_back(jstr);
+ for (int i = 0; i < prop_diffs->nelts; ++i)
+ {
+ svn_prop_t* prop = &APR_ARRAY_IDX(prop_diffs, i, svn_prop_t);
+ loop_body(prop->name, prop->value);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+ }
}
-
- return CreateJ::Set(jstrs);
+ POP_AND_RETURN_NOTHING();
}
-jobject CreateJ::PropertyMap(apr_hash_t *prop_hash)
+jobject property_map(apr_hash_t *prop_hash, apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool)
{
- JNIEnv *env = JNIUtil::getEnv();
+ SVN_ERR_ASSERT_NO_RETURN(!(prop_hash && prop_diffs));
- if (prop_hash == NULL)
+ if (prop_hash == NULL && prop_diffs == NULL)
return NULL;
+ JNIEnv *env = JNIUtil::getEnv();
+
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
@@ -1058,35 +1261,35 @@ jobject CreateJ::PropertyMap(apr_hash_t *prop_hash)
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- apr_hash_index_t *hi;
- for (hi = apr_hash_first(apr_hash_pool_get(prop_hash), prop_hash);
- hi; hi = apr_hash_next(hi))
- {
- const char *key;
- svn_string_t *val;
-
- apr_hash_this(hi,
- reinterpret_cast<const void **>(&key),
- NULL,
- reinterpret_cast<void **>(&val));
+ fill_property_map(map, prop_hash, prop_diffs, scratch_pool, put_mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jpropName = JNIUtil::makeJString(key);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ return env->PopLocalFrame(map);
+}
+} // anonymous namespace
- jbyteArray jpropVal = JNIUtil::makeJByteArray(val);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+jobject CreateJ::PropertyMap(apr_hash_t *prop_hash, apr_pool_t* scratch_pool)
+{
+ return property_map(prop_hash, NULL, scratch_pool);
+}
- env->CallObjectMethod(map, put_mid, jpropName, jpropVal);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+jobject CreateJ::PropertyMap(apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool)
+{
+ return property_map(NULL, prop_diffs, scratch_pool);
+}
- env->DeleteLocalRef(jpropName);
- env->DeleteLocalRef(jpropVal);
- }
+void CreateJ::FillPropertyMap(jobject map, apr_hash_t* prop_hash,
+ apr_pool_t* scratch_pool, jmethodID put_mid)
+{
+ fill_property_map(map, prop_hash, NULL, scratch_pool, put_mid);
+}
- return env->PopLocalFrame(map);
+void CreateJ::FillPropertyMap(jobject map, apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool, jmethodID put_mid)
+{
+ fill_property_map(map, NULL, prop_diffs, scratch_pool, put_mid);
}
jobject CreateJ::InheritedProps(apr_array_header_t *iprops)
@@ -1123,7 +1326,7 @@ jobject CreateJ::InheritedProps(apr_array_header_t *iprops)
}
jclass item_cls = env->FindClass(
- JAVA_PACKAGE"/callback/InheritedProplistCallback$InheritedItem");
+ JAVAHL_CLASS("/callback/InheritedProplistCallback$InheritedItem"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -1169,6 +1372,64 @@ jobject CreateJ::InheritedProps(apr_array_header_t *iprops)
return env->PopLocalFrame(array);
}
+jobject CreateJ::Mergeinfo(svn_mergeinfo_t mergeinfo, apr_pool_t* scratch_pool)
+{
+ if (mergeinfo == NULL)
+ return NULL;
+
+ // Transform mergeinfo into Java Mergeinfo object.
+ JNIEnv *env = JNIUtil::getEnv();
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Mergeinfo"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ static jmethodID ctor = 0;
+ if (ctor == 0)
+ {
+ ctor = env->GetMethodID(clazz, "<init>", "()V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ }
+
+ static jmethodID addRevisions = 0;
+ if (addRevisions == 0)
+ {
+ addRevisions = env->GetMethodID(clazz, "addRevisions",
+ "(Ljava/lang/String;"
+ "Ljava/util/List;)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ }
+
+ jobject jmergeinfo = env->NewObject(clazz, ctor);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(scratch_pool, mergeinfo);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const void *path;
+ void *val;
+ apr_hash_this(hi, &path, NULL, &val);
+
+ jstring jpath =
+ JNIUtil::makeJString(static_cast<const char*>(path));
+ jobject jranges =
+ RevisionRangeList(static_cast<svn_rangelist_t*>(val)).toList();
+
+ env->CallVoidMethod(jmergeinfo, addRevisions, jpath, jranges);
+
+ env->DeleteLocalRef(jranges);
+ env->DeleteLocalRef(jpath);
+ }
+
+ env->DeleteLocalRef(clazz);
+
+ return jmergeinfo;
+}
+
jobject CreateJ::Set(std::vector<jobject> &objects)
{
diff --git a/subversion/bindings/javahl/native/CreateJ.h b/subversion/bindings/javahl/native/CreateJ.h
index 7fe5363..8f4f36e 100644
--- a/subversion/bindings/javahl/native/CreateJ.h
+++ b/subversion/bindings/javahl/native/CreateJ.h
@@ -31,6 +31,7 @@
#include "svn_wc.h"
#include "svn_repos.h"
#include "svn_client.h"
+#include "svn_mergeinfo.h"
#include <vector>
@@ -49,12 +50,19 @@ class CreateJ
Checksum(const svn_checksum_t *checksum);
static jobject
+ DirEntry(const char *path, const char *absPath,
+ const svn_dirent_t *dirent);
+
+ static jobject
Info(const char *path, const svn_client_info2_t *info);
static jobject
Lock(const svn_lock_t *lock);
static jobject
+ LockMap(const apr_hash_t *locks, apr_pool_t *pool);
+
+ static jobject
ChangedPath(const char *path, svn_log_changed_path2_t *log_item);
static jobject
@@ -74,17 +82,30 @@ class CreateJ
CommitInfo(const svn_commit_info_t *info);
static jobject
- RevisionRangeList(svn_rangelist_t *ranges);
+ StringSet(const apr_array_header_t *strings);
static jobject
- StringSet(apr_array_header_t *strings);
+ PropertyMap(apr_hash_t *prop_hash, apr_pool_t* scratch_pool = NULL);
static jobject
- PropertyMap(apr_hash_t *prop_hash);
+ PropertyMap(apr_array_header_t* prop_diffs, apr_pool_t* scratch_pool = NULL);
+
+ static void
+ FillPropertyMap(jobject map, apr_hash_t* prop_hash,
+ apr_pool_t* scratch_pool,
+ jmethodID put_method_id = 0);
+
+ static void
+ FillPropertyMap(jobject map, apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool,
+ jmethodID put_method_id = 0);
static jobject
InheritedProps(apr_array_header_t *inherited_props);
+ static jobject
+ Mergeinfo(svn_mergeinfo_t mergeinfo, apr_pool_t* scratch_pool);
+
/* This creates a set of Objects. It derefs the members of the vector
* after putting them in the set, so they caller doesn't need to. */
static jobject
diff --git a/subversion/bindings/javahl/native/Credential.cpp b/subversion/bindings/javahl/native/Credential.cpp
new file mode 100644
index 0000000..8791de3
--- /dev/null
+++ b/subversion/bindings/javahl/native/Credential.cpp
@@ -0,0 +1,85 @@
+/**
+ * @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
+ */
+
+#include "Credential.hpp"
+
+#include "JNIUtil.h"
+
+namespace JavaHL {
+
+// Class JavaHL::Credential
+const char* const Credential::m_class_name =
+ JAVAHL_CLASS("/SVNUtil$Credential");
+
+Credential::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_ctor(
+ env.GetMethodID(cls, "<init>",
+ "(" JAVAHL_ARG("/SVNUtil$Credential$Kind;")
+ "Ljava/lang/String;Ljava/lang/String;"
+ "Ljava/lang/String;Ljava/lang/String;"
+ JAVAHL_ARG("/callback/AuthnCallback$SSLServerCertInfo;")
+ JAVAHL_ARG("/callback/AuthnCallback$SSLServerCertFailures;")
+ "Ljava/lang/String;)V"))
+{}
+
+Credential::ClassImpl::~ClassImpl() {}
+
+Credential::Credential(::Java::Env env, jobject kind,
+ const ::Java::String& realm,
+ const ::Java::String& store,
+ const ::Java::String& username,
+ const ::Java::String& password,
+ jobject info, jobject failures,
+ const ::Java::String& passphrase)
+ : ::Java::Object(env, ::Java::ClassCache::get_credential(env))
+{
+ set_this(env.NewObject(get_class(), impl().m_mid_ctor,
+ kind, realm.get(), store.get(),
+ username.get(), password.get(),
+ info, failures, passphrase.get()));
+}
+
+// Enum JavaHL::Credential::Kind
+const char* const Credential::Kind::m_class_name =
+ JAVAHL_CLASS("/SVNUtil$Credential$Kind");
+
+Credential::Kind::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_static_mid_from_string(
+ env.GetStaticMethodID(cls, "fromString",
+ "(Ljava/lang/String;)"
+ JAVAHL_ARG("/SVNUtil$Credential$Kind;")))
+{}
+
+Credential::Kind::ClassImpl::~ClassImpl() {}
+
+Credential::Kind::Kind(::Java::Env env,
+ const ::Java::String& value)
+ : ::Java::Object(env, ::Java::ClassCache::get_credential_kind(env))
+{
+ set_this(env.CallStaticObjectMethod(
+ get_class(), impl().m_static_mid_from_string, value.get()));
+}
+
+} // namespace JavaHL
diff --git a/subversion/bindings/javahl/native/Credential.hpp b/subversion/bindings/javahl/native/Credential.hpp
new file mode 100644
index 0000000..5c0c66d
--- /dev/null
+++ b/subversion/bindings/javahl/native/Credential.hpp
@@ -0,0 +1,126 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_CREDENTIAL_HPP
+#define SVN_JAVAHL_CREDENTIAL_HPP
+
+#include "jniwrapper/jni_object.hpp"
+#include "jniwrapper/jni_string.hpp"
+
+#include "AuthnCallback.hpp"
+
+namespace JavaHL {
+
+/**
+ * Object wrapper for @c org.apache.subversion.javahl.SVNUtil.Credential.
+ *
+ * @since New in 1.9.
+ */
+class Credential : public ::Java::Object
+{
+public:
+ /**
+ * Object wrapper for @c ...Credential$Kind.
+ */
+ class Kind : public ::Java::Object
+ {
+ public:
+ /**
+ * Constructs a and wraps a new Credential$Kind object.
+ */
+ explicit Kind(::Java::Env env, const ::Java::String& value);
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_static_mid_from_string;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit Credential(::Java::Env env, jobject jthis)
+ : ::Java::Object(env, ::Java::ClassCache::get_credential(env), jthis)
+ {}
+
+ /**
+ * Constructs and wraps a new Credential object
+ */
+ explicit Credential(::Java::Env env, jobject kind,
+ const ::Java::String& realm,
+ const ::Java::String& store,
+ const ::Java::String& username,
+ const ::Java::String& password,
+ jobject info, jobject failures,
+ const ::Java::String& passphrase);
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_ctor;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_CREDENTIAL_HPP
diff --git a/subversion/bindings/javahl/native/DiffOptions.cpp b/subversion/bindings/javahl/native/DiffOptions.cpp
index 8d7a8eb..f666f3a 100644
--- a/subversion/bindings/javahl/native/DiffOptions.cpp
+++ b/subversion/bindings/javahl/native/DiffOptions.cpp
@@ -71,5 +71,29 @@ apr_array_header_t *DiffOptions::optionsArray(SVN::Pool &resultPool) const
if (flags & SHOW_C_FUNCTION)
APR_ARRAY_PUSH(opt, const char*) = "--show-c-function";
+ /* TODO: Support -U (context size) */
+
+ return opt;
+}
+
+svn_diff_file_options_t *DiffOptions::fileOptions(SVN::Pool &resultPool) const
+{
+ svn_diff_file_options_t *opt;
+
+ opt = svn_diff_file_options_create(resultPool.getPool());
+
+ if (flags & IGNORE_ALL_SPACE)
+ opt->ignore_space = svn_diff_file_ignore_space_all;
+ else if (flags & IGNORE_SPACE_CHANGE)
+ opt->ignore_eol_style = svn_diff_file_ignore_space_change;
+
+ if (flags & IGNORE_EOL_STYLE)
+ opt->ignore_eol_style = TRUE;
+
+ if (flags & SHOW_C_FUNCTION)
+ opt->show_c_function = TRUE;
+
+ /* TODO: Support context size */
+
return opt;
}
diff --git a/subversion/bindings/javahl/native/DiffOptions.h b/subversion/bindings/javahl/native/DiffOptions.h
index e59b2f9..0dc4d9a 100644
--- a/subversion/bindings/javahl/native/DiffOptions.h
+++ b/subversion/bindings/javahl/native/DiffOptions.h
@@ -29,6 +29,7 @@
#include <apr_tables.h>
#include "svn_types.h"
+#include "svn_diff.h"
#include "Pool.h"
#include "JNIUtil.h"
@@ -38,6 +39,7 @@ class DiffOptions
DiffOptions(jobject joptions);
apr_array_header_t *optionsArray(SVN::Pool &resultPool) const;
+ svn_diff_file_options_t *fileOptions(SVN::Pool &resultPool) const;
svn_boolean_t useGitDiffFormat() const
{
diff --git a/subversion/bindings/javahl/native/DiffSummaryReceiver.cpp b/subversion/bindings/javahl/native/DiffSummaryReceiver.cpp
index f4cf052..8ad3a91 100644
--- a/subversion/bindings/javahl/native/DiffSummaryReceiver.cpp
+++ b/subversion/bindings/javahl/native/DiffSummaryReceiver.cpp
@@ -69,12 +69,12 @@ DiffSummaryReceiver::onSummary(const svn_client_diff_summarize_t *diff,
if (callback == 0)
{
// Initialize the method ID.
- clazz = env->FindClass(JAVA_PACKAGE "/callback/DiffSummaryCallback");
+ clazz = env->FindClass(JAVAHL_CLASS("/callback/DiffSummaryCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
callback = env->GetMethodID(clazz, "onSummary",
- "(L"JAVA_PACKAGE"/DiffSummary;)V");
+ "(" JAVAHL_ARG("/DiffSummary;") ")V");
if (JNIUtil::isJavaExceptionThrown() || callback == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -82,7 +82,7 @@ DiffSummaryReceiver::onSummary(const svn_client_diff_summarize_t *diff,
// Do some prep work for tranforming the DIFF parameter into a
// Java equivalent.
static jmethodID ctor = 0;
- clazz = env->FindClass(JAVA_PACKAGE "/DiffSummary");
+ clazz = env->FindClass(JAVAHL_CLASS("/DiffSummary"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
@@ -90,8 +90,8 @@ DiffSummaryReceiver::onSummary(const svn_client_diff_summarize_t *diff,
{
ctor = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/DiffSummary$DiffKind;Z"
- "L"JAVA_PACKAGE"/types/NodeKind;)V");
+ JAVAHL_ARG("/DiffSummary$DiffKind;") "Z"
+ JAVAHL_ARG("/types/NodeKind;") ")V");
if (JNIUtil::isJavaExceptionThrown() || ctor == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -117,8 +117,5 @@ DiffSummaryReceiver::onSummary(const svn_client_diff_summarize_t *diff,
// Invoke the Java DiffSummaryReceiver callback.
env->CallVoidMethod(m_receiver, callback, jDiffSummary);
- // We return whether an exception was thrown or not.
-
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
diff --git a/subversion/bindings/javahl/native/EditorCallbacks.cpp b/subversion/bindings/javahl/native/EditorCallbacks.cpp
new file mode 100644
index 0000000..703f6bd
--- /dev/null
+++ b/subversion/bindings/javahl/native/EditorCallbacks.cpp
@@ -0,0 +1,124 @@
+/**
+ * @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
+ */
+
+#include "EditorCallbacks.hpp"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_io_stream.hpp"
+
+#include "Utility.hpp"
+
+namespace JavaHL {
+
+// class JavaHL::ProvideBaseCallback
+
+const char* const ProvideBaseCallback::m_class_name =
+ JAVAHL_CLASS("/ISVNEditor$ProvideBaseCallback");
+
+ProvideBaseCallback::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_get_contents(
+ env.GetMethodID(
+ cls, "getContents",
+ "(Ljava/lang/String;)"
+ JAVAHL_ARG("/ISVNEditor$ProvideBaseCallback$ReturnValue;")))
+{}
+
+ProvideBaseCallback::ClassImpl::~ClassImpl() {}
+
+
+const char* const ProvideBaseCallback::ReturnValue::m_class_name =
+ JAVAHL_CLASS("/ISVNEditor$ProvideBaseCallback$ReturnValue");
+
+ProvideBaseCallback::ReturnValue::ClassImpl::ClassImpl(
+ ::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_fid_contents(env.GetFieldID(cls, "contents", "Ljava/io/InputStream;")),
+ m_fid_revision(env.GetFieldID(cls, "revision", "J"))
+{}
+
+ProvideBaseCallback::ReturnValue::ClassImpl::~ClassImpl() {}
+
+
+svn_stream_t*
+ProvideBaseCallback::ReturnValue::get_global_stream(apr_pool_t* pool) const
+{
+ jobject jstream = m_env.GetObjectField(m_jthis, impl().m_fid_contents);
+ return ::Java::InputStream::get_global_stream(m_env, jstream, pool);
+}
+
+
+// class JavaHL::ProvidePropsCallback
+
+const char* const ProvidePropsCallback::m_class_name =
+ JAVAHL_CLASS("/ISVNEditor$ProvidePropsCallback");
+
+ProvidePropsCallback::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_get_props(
+ env.GetMethodID(
+ cls, "getProperties",
+ "(Ljava/lang/String;)"
+ JAVAHL_ARG("/ISVNEditor$ProvidePropsCallback$ReturnValue;")))
+{}
+
+ProvidePropsCallback::ClassImpl::~ClassImpl() {}
+
+
+const char* const ProvidePropsCallback::ReturnValue::m_class_name =
+ JAVAHL_CLASS("/ISVNEditor$ProvidePropsCallback$ReturnValue");
+
+ProvidePropsCallback::ReturnValue::ClassImpl::ClassImpl(
+ ::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_fid_properties(env.GetFieldID(cls, "properties", "Ljava/util/Map;")),
+ m_fid_revision(env.GetFieldID(cls, "revision", "J"))
+{}
+
+ProvidePropsCallback::ReturnValue::ClassImpl::~ClassImpl() {}
+
+apr_hash_t*
+ProvidePropsCallback::ReturnValue::get_property_hash(apr_pool_t* pool) const
+{
+ jobject jproperties = m_env.GetObjectField(m_jthis, impl().m_fid_properties);
+ return Util::make_property_hash(m_env, jproperties, pool);
+}
+
+
+// class JavaHL::GetNodeKindCallback
+
+const char* const GetNodeKindCallback::m_class_name =
+ JAVAHL_CLASS("/ISVNEditor$GetNodeKindCallback");
+
+GetNodeKindCallback::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_get_kind(
+ env.GetMethodID(cls,
+ "getKind",
+ "(Ljava/lang/String;J)"
+ JAVAHL_ARG("/types/NodeKind;")))
+{}
+
+GetNodeKindCallback::ClassImpl::~ClassImpl() {}
+} // namespace JavaHL
diff --git a/subversion/bindings/javahl/native/EditorCallbacks.hpp b/subversion/bindings/javahl/native/EditorCallbacks.hpp
new file mode 100644
index 0000000..8918ee3
--- /dev/null
+++ b/subversion/bindings/javahl/native/EditorCallbacks.hpp
@@ -0,0 +1,328 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_EDITOR_CALLBACKS_HPP
+#define SVN_JAVAHL_EDITOR_CALLBACKS_HPP
+
+#include "svn_io.h"
+
+#include "Pool.h"
+
+#include "jniwrapper/jni_object.hpp"
+
+namespace JavaHL {
+
+/**
+ * Object wrapper for the base contents callback interface in
+ * @c org.apache.subversion.javahl.ISVNEditor.
+ *
+ * @since New in 1.9.
+ */
+class ProvideBaseCallback : public ::Java::Object
+{
+public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit ProvideBaseCallback(::Java::Env env, jobject jthis)
+ : ::Java::Object(env,
+ ::Java::ClassCache::get_editor_provide_base_cb(env),
+ jthis)
+ {}
+
+ /**
+ * Invokes the callback.
+ */
+ jobject operator()(jstring relpath) const
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get_contents,
+ relpath);
+ }
+
+ class ReturnValue : public ::Java::Object
+ {
+ public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit ReturnValue(::Java::Env env, jobject jthis)
+ : Java::Object(env,
+ ::Java::ClassCache::get_editor_provide_base_cb_ret(env),
+ jthis)
+ {}
+
+ /**
+ * Returns an @c svn_stream_t for the contents stream in the
+ * wrapped return value, allocated from @a pool. The wrapped Java
+ * stream will live as long as @a pool.
+ */
+ svn_stream_t* get_global_stream(apr_pool_t* pool) const;
+
+ /**
+ * Returns an @c svn_stream_t for the contents stream in the
+ * wrapped return value, allocated from @a pool. The wrapped Java
+ * stream will live as long as @a pool.
+ */
+ svn_stream_t* get_global_stream(const SVN::Pool& pool) const
+ {
+ return get_global_stream(pool.getPool());
+ }
+
+ /**
+ * Returns the revision in the wrapped return value.
+ */
+ jlong get_revision() const
+ {
+ return m_env.GetLongField(m_jthis, impl().m_fid_revision);
+ }
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::FieldID m_fid_contents;
+ const ::Java::FieldID m_fid_revision;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_get_contents;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+
+/**
+ * Object wrapper for the props callback interface in
+ * @c org.apache.subversion.javahl.ISVNEditor.
+ *
+ * @since New in 1.9.
+ */
+class ProvidePropsCallback : public ::Java::Object
+{
+public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit ProvidePropsCallback(::Java::Env env, jobject jthis)
+ : ::Java::Object(env,
+ ::Java::ClassCache::get_editor_provide_props_cb(env),
+ jthis)
+ {}
+
+ /**
+ * Invokes the callback.
+ */
+ jobject operator()(jstring relpath) const
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get_props, relpath);
+ }
+
+ class ReturnValue : public ::Java::Object
+ {
+ public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit ReturnValue(::Java::Env env, jobject jthis)
+ : Java::Object(env,
+ ::Java::ClassCache::get_editor_provide_props_cb_ret(env),
+ jthis)
+ {}
+
+ /**
+ * Returns an @c apr_hash_t of the node properties in the wrapped
+ * return value, allocated from @a pool.
+ */
+ apr_hash_t* get_property_hash(apr_pool_t* pool) const;
+
+ /**
+ * Returns an @c apr_hash_t of the node properties in the wrapped
+ * return value, allocated from @a pool.
+ */
+ apr_hash_t* get_property_hash(const SVN::Pool& pool) const
+ {
+ return get_property_hash(pool.getPool());
+ }
+
+ /**
+ * Returns the revision in the wrapped return value.
+ */
+ jlong get_revision() const
+ {
+ return m_env.GetLongField(m_jthis, impl().m_fid_revision);
+ }
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::FieldID m_fid_properties;
+ const ::Java::FieldID m_fid_revision;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+ };
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_get_props;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+
+/**
+ * Object wrapper for the kind callback interface in
+ * @c org.apache.subversion.javahl.ISVNEditor.
+ *
+ * @since New in 1.9.
+ */
+class GetNodeKindCallback : public ::Java::Object
+{
+public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit GetNodeKindCallback(::Java::Env env, jobject jthis)
+ : ::Java::Object(env,
+ ::Java::ClassCache::get_editor_get_kind_cb(env),
+ jthis)
+ {}
+
+ /**
+ * Invokes the callback.
+ */
+ jobject operator()(jstring relpath, jlong revision) const
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get_kind,
+ relpath, revision);
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_get_kind;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_EDITOR_CALLBACKS_HPP
diff --git a/subversion/bindings/javahl/native/EditorProxy.cpp b/subversion/bindings/javahl/native/EditorProxy.cpp
new file mode 100644
index 0000000..8d9d65e
--- /dev/null
+++ b/subversion/bindings/javahl/native/EditorProxy.cpp
@@ -0,0 +1,566 @@
+/**
+ * @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 EditorProxy.h
+ * @brief Interface of all editor proxy classes
+ */
+#include <apr_pools.h>
+
+#include "JNIUtil.h"
+#include "JNIStackElement.h"
+#include "EditorProxy.h"
+#include "CreateJ.h"
+#include "EnumMapper.h"
+
+// Newstyle: stream wrapper
+#include <memory>
+#include "NativeStream.hpp"
+#include "jniwrapper/jni_stack.hpp"
+
+#include "svn_error.h"
+#include "svn_private_config.h"
+
+EditorProxy::EditorProxy(jobject jeditor, apr_pool_t* edit_pool,
+ const char* repos_root_url, const char* base_relpath,
+ svn_cancel_func_t cancel_func, void* cancel_baton,
+ const EditorProxyCallbacks& callbacks)
+ : m_valid(false),
+ m_jeditor(JNIUtil::getEnv()->NewGlobalRef(jeditor)),
+ m_edit_pool(edit_pool),
+ m_repos_root_url(NULL),
+ m_base_relpath(NULL),
+ m_found_paths(false),
+ m_editor(NULL),
+ m_delta_editor(NULL),
+ m_delta_baton(NULL),
+ m_proxy_callbacks(callbacks)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::EditorProxy(...)\n");
+
+ static const svn_editor_cb_many_t editor_many_cb = {
+ cb_add_directory, cb_add_file, cb_add_symlink, cb_add_absent,
+ cb_alter_directory, cb_alter_file, cb_alter_symlink,
+ cb_delete, cb_copy, cb_move,
+ cb_complete, cb_abort
+ };
+
+ SVN::Pool scratchPool(edit_pool);
+ apr_pool_t* scratch_pool = scratchPool.getPool();
+
+ svn_error_t* err = svn_editor_create(&m_editor, this,
+ cancel_func, cancel_baton,
+ edit_pool, scratch_pool);
+ if (!err)
+ err = svn_editor_setcb_many(m_editor, &editor_many_cb, scratch_pool);
+ if (!err)
+ {
+ m_repos_root_url =
+ static_cast<const char*>(apr_pstrdup(edit_pool, repos_root_url));
+ m_base_relpath =
+ static_cast<const char*>(apr_pstrdup(edit_pool, base_relpath));
+
+ svn_boolean_t found_paths;
+ err = svn_delta__delta_from_editor(&m_delta_editor,
+ &m_delta_baton,
+ m_editor,
+ m_proxy_callbacks.m_unlock_func,
+ m_proxy_callbacks.m_baton,
+ &found_paths,
+ repos_root_url, base_relpath,
+ m_proxy_callbacks.m_fetch_props_func,
+ m_proxy_callbacks.m_baton,
+ m_proxy_callbacks.m_fetch_base_func,
+ m_proxy_callbacks.m_baton,
+ &m_proxy_callbacks.m_extra_baton,
+ edit_pool);
+ m_found_paths = found_paths;
+ }
+
+ if (err)
+ JNIUtil::handleSVNError(err);
+ else
+ m_valid = true;
+}
+
+EditorProxy::~EditorProxy()
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::~EditorProxy()\n");
+
+ if (m_jeditor)
+ JNIUtil::getEnv()->DeleteGlobalRef(m_jeditor);
+}
+
+namespace {
+inline svn_error_t* invalid_editor()
+{
+ return svn_error_create(SVN_ERR_RA_SVN_EDIT_ABORTED, NULL,
+ _("The editor is not valid"));
+}
+
+svn_error_t*
+get_editor_method(jmethodID& mid, const char* name, const char* sig)
+{
+ if (0 != mid)
+ return SVN_NO_ERROR; // Already known.
+
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->FindClass(JAVAHL_CLASS("/ISVNEditor"));
+ SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
+ SVN_JNI_CATCH(mid = env->GetMethodID(cls, name, sig),
+ SVN_ERR_RA_SVN_EDIT_ABORTED);
+ return SVN_NO_ERROR;
+}
+
+jobject wrap_input_stream(svn_stream_t* stream)
+{
+ std::auto_ptr<JavaHL::NativeInputStream>
+ wrapped(new JavaHL::NativeInputStream());
+ apr_pool_t* const wrapped_pool = wrapped->get_pool().getPool();
+ wrapped->set_stream(svn_stream_disown(stream, wrapped_pool));
+ const jobject jstream = wrapped->create_java_wrapper();
+ wrapped.release();
+ return jstream;
+}
+} // anonymous namespace
+
+svn_error_t*
+EditorProxy::cb_add_directory(void *baton,
+ const char *relpath,
+ const apr_array_header_t *children,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_directory('%s')\n", relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addDirectory",
+ "(Ljava/lang/String;"
+ "Ljava/lang/Iterable;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jchildren, jprops,
+ jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_add_file(void *baton,
+ const char *relpath,
+ const svn_checksum_t *checksum,
+ svn_stream_t *contents,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_file('%s')\n", relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addFile",
+ "(Ljava/lang/String;"
+ JAVAHL_ARG("/types/Checksum;")
+ "Ljava/io/InputStream;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchecksum = CreateJ::Checksum(checksum);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ jobject jcontents = NULL;
+ if (contents != NULL)
+ jcontents = wrap_input_stream(contents);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jchecksum, jcontents,
+ jprops, jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_add_symlink(void *baton,
+ const char *relpath,
+ const char *target,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_symlink('%s')\n", relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addSymlink",
+ "(Ljava/lang/String;"
+ "Ljava/lang/String;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jtarget = JNIUtil::makeJString(target);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jtarget, jprops,
+ jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_add_absent(void *baton,
+ const char *relpath,
+ svn_node_kind_t kind,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_absent('%s')\n", relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addAbsent",
+ "(Ljava/lang/String;"
+ JAVAHL_ARG("/types/NodeKind;")
+ "J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jkind = EnumMapper::mapNodeKind(kind);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jkind,
+ jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_alter_directory(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const apr_array_header_t *children,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_directory('%s', r%lld)\n",
+ //DEBUG: relpath, static_cast<long long>(revision));
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterDirectory",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/Iterable;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jchildren, jprops);
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_alter_file(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const svn_checksum_t *checksum,
+ svn_stream_t *contents,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_file('%s', r%lld)\n",
+ //DEBUG: relpath, static_cast<long long>(revision));
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterFile",
+ "(Ljava/lang/String;J"
+ JAVAHL_ARG("/types/Checksum;")
+ "Ljava/io/InputStream;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchecksum = CreateJ::Checksum(checksum);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ jobject jcontents = NULL;
+ if (contents != NULL)
+ jcontents = wrap_input_stream(contents);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jchecksum, jcontents, jprops);
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_alter_symlink(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const char *target,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_symlink('%s', r%lld)\n",
+ //DEBUG: relpath, static_cast<long long>(revision));
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterSymlink",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jtarget = JNIUtil::makeJString(target);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jtarget, jprops);
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_delete(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_delete('%s', r%lld)\n",
+ //DEBUG: relpath, static_cast<long long>(revision));
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "delete",
+ "(Ljava/lang/String;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid, jrelpath);
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_copy(void *baton,
+ const char *src_relpath,
+ svn_revnum_t src_revision,
+ const char *dst_relpath,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_copy('%s', r%lld, '%s')\n",
+ //DEBUG: src_relpath, static_cast<long long>(src_revision), dst_relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "copy",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;J)V"));
+
+ jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jsrc_relpath, jlong(src_revision),
+ jdst_relpath, jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_move(void *baton,
+ const char *src_relpath,
+ svn_revnum_t src_revision,
+ const char *dst_relpath,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_move('%s', r%lld, '%s')\n",
+ //DEBUG: src_relpath, static_cast<long long>(src_revision), dst_relpath);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "move",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;J)V"));
+
+ jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jsrc_relpath, jlong(src_revision),
+ jdst_relpath, jlong(replaces_rev));
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_complete(void *baton, apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_complete()\n");
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+ ep->m_valid = false;
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "complete", "()V"));
+
+ env.CallVoidMethod(ep->m_jeditor, mid);
+ });
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+EditorProxy::cb_abort(void *baton, apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) EditorProxy::cb_abort()\n");
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+ ep->m_valid = false;
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "abort", "()V"));
+
+ env.CallVoidMethod(ep->m_jeditor, mid);
+ });
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/bindings/javahl/native/EditorProxy.h b/subversion/bindings/javahl/native/EditorProxy.h
new file mode 100644
index 0000000..3ca005c
--- /dev/null
+++ b/subversion/bindings/javahl/native/EditorProxy.h
@@ -0,0 +1,153 @@
+/**
+ * @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 EditorProxy.h
+ * @brief Interface of all editor proxy classes
+ */
+
+#ifndef JAVAHL_EDITOR_PROXY_H
+#define JAVAHL_EDITOR_PROXY_H
+
+#include "svn_delta.h"
+#include "private/svn_editor.h"
+#include "private/svn_delta_private.h"
+
+/**
+ * These callbacks are needed by the delta-to-Ev2 shims.
+ */
+struct EditorProxyCallbacks
+{
+ svn_delta__unlock_func_t m_unlock_func;
+ svn_delta_fetch_props_func_t m_fetch_props_func;
+ svn_delta_fetch_base_func_t m_fetch_base_func;
+ struct svn_delta__extra_baton m_extra_baton;
+ void* m_baton;
+};
+
+/**
+ * This is a proxy object that translates Ev2 operations (possibly
+ * implemented through shims) into calls to a Java editor
+ * implementation.
+ */
+class EditorProxy
+{
+public:
+ EditorProxy(jobject jeditor, apr_pool_t* edit_pool,
+ const char* repos_root_url, const char* base_relpath,
+ svn_cancel_func_t cancel_func, void* cancel_baton,
+ const EditorProxyCallbacks& callbacks);
+ ~EditorProxy();
+
+ const svn_delta_editor_t* delta_editor() const
+ {
+ return m_delta_editor;
+ }
+
+ void* delta_baton() const
+ {
+ return m_delta_baton;
+ }
+
+private:
+ EditorProxy(const EditorProxy&); // noncopyable
+
+ static svn_error_t* cb_add_directory(void *baton,
+ const char *relpath,
+ const apr_array_header_t *children,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_add_file(void *baton,
+ const char *relpath,
+ const svn_checksum_t *checksum,
+ svn_stream_t *contents,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_add_symlink(void *baton,
+ const char *relpath,
+ const char *target,
+ apr_hash_t *props,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_add_absent(void *baton,
+ const char *relpath,
+ svn_node_kind_t kind,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_alter_directory(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const apr_array_header_t *children,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_alter_file(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const svn_checksum_t *checksum,
+ svn_stream_t *contents,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_alter_symlink(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ const char *target,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_delete(void *baton,
+ const char *relpath,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_copy(void *baton,
+ const char *src_relpath,
+ svn_revnum_t src_revision,
+ const char *dst_relpath,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_move(void *baton,
+ const char *src_relpath,
+ svn_revnum_t src_revision,
+ const char *dst_relpath,
+ svn_revnum_t replaces_rev,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_complete(void *baton,
+ apr_pool_t *scratch_pool);
+ static svn_error_t* cb_abort(void *baton,
+ apr_pool_t *scratch_pool);
+
+private:
+ bool m_valid;
+ jobject m_jeditor; ///< Reference to Java editor implementation
+ apr_pool_t* m_edit_pool;
+
+ const char* m_repos_root_url; ///< The root of the repository
+ const char* m_base_relpath; ///< The root of the session within the repo
+ bool m_found_paths; ///< Returned paths are absolute
+
+ svn_editor_t* m_editor;
+ const svn_delta_editor_t* m_delta_editor;
+ void* m_delta_baton;
+ EditorProxyCallbacks m_proxy_callbacks;
+};
+
+
+#endif // JAVAHL_EDITOR_PROXY_H
diff --git a/subversion/bindings/javahl/native/EnumMapper.cpp b/subversion/bindings/javahl/native/EnumMapper.cpp
index 089ef6f..8e8ca50 100644
--- a/subversion/bindings/javahl/native/EnumMapper.cpp
+++ b/subversion/bindings/javahl/native/EnumMapper.cpp
@@ -32,44 +32,18 @@
#include "JNIStringHolder.h"
#include "../include/org_apache_subversion_javahl_CommitItemStateFlags.h"
-/**
- * Map a C commit state flag constant to the Java constant.
- * @param state the C commit state flage constant
- * @returns the Java constant
- */
-jint EnumMapper::mapCommitMessageStateFlags(apr_byte_t flags)
-{
- jint jstateFlags = 0;
- if (flags & SVN_CLIENT_COMMIT_ITEM_ADD)
- jstateFlags |=
- org_apache_subversion_javahl_CommitItemStateFlags_Add;
- if (flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
- jstateFlags |=
- org_apache_subversion_javahl_CommitItemStateFlags_Delete;
- if (flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)
- jstateFlags |=
- org_apache_subversion_javahl_CommitItemStateFlags_TextMods;
- if (flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)
- jstateFlags |=
- org_apache_subversion_javahl_CommitItemStateFlags_PropMods;
- if (flags & SVN_CLIENT_COMMIT_ITEM_IS_COPY)
- jstateFlags |=
- org_apache_subversion_javahl_CommitItemStateFlags_IsCopy;
- return jstateFlags;
-}
-
jobject EnumMapper::mapChangePathAction(const char action)
{
switch (action)
{
case 'A':
- return mapEnum(JAVA_PACKAGE"/types/ChangePath$Action", 0);
+ return mapEnum(JAVAHL_CLASS("/types/ChangePath$Action"), 0);
case 'D':
- return mapEnum(JAVA_PACKAGE"/types/ChangePath$Action", 1);
+ return mapEnum(JAVAHL_CLASS("/types/ChangePath$Action"), 1);
case 'R':
- return mapEnum(JAVA_PACKAGE"/types/ChangePath$Action", 2);
+ return mapEnum(JAVAHL_CLASS("/types/ChangePath$Action"), 2);
case 'M':
- return mapEnum(JAVA_PACKAGE"/types/ChangePath$Action", 3);
+ return mapEnum(JAVAHL_CLASS("/types/ChangePath$Action"), 3);
default:
return NULL;
}
@@ -81,7 +55,7 @@ jobject EnumMapper::mapChangePathAction(const char action)
jobject EnumMapper::mapNotifyState(svn_wc_notify_state_t state)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ClientNotifyInformation$Status",
+ return mapEnum(JAVAHL_CLASS("/ClientNotifyInformation$Status"),
static_cast<int>(state));
}
@@ -91,14 +65,14 @@ jobject EnumMapper::mapNotifyState(svn_wc_notify_state_t state)
jobject EnumMapper::mapNotifyAction(svn_wc_notify_action_t action)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ClientNotifyInformation$Action",
+ return mapEnum(JAVAHL_CLASS("/ClientNotifyInformation$Action"),
static_cast<int>(action));
}
jobject EnumMapper::mapReposNotifyNodeAction(svn_node_action action)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ReposNotifyInformation$NodeAction",
+ return mapEnum(JAVAHL_CLASS("/ReposNotifyInformation$NodeAction"),
static_cast<int>(action));
}
@@ -108,7 +82,7 @@ jobject EnumMapper::mapReposNotifyNodeAction(svn_node_action action)
jobject EnumMapper::mapReposNotifyAction(svn_repos_notify_action_t action)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ReposNotifyInformation$Action",
+ return mapEnum(JAVAHL_CLASS("/ReposNotifyInformation$Action"),
static_cast<int>(action));
}
@@ -118,7 +92,7 @@ jobject EnumMapper::mapReposNotifyAction(svn_repos_notify_action_t action)
jobject EnumMapper::mapNodeKind(svn_node_kind_t nodeKind)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/types/NodeKind",
+ return mapEnum(JAVAHL_CLASS("/types/NodeKind"),
static_cast<int>(nodeKind));
}
@@ -128,7 +102,7 @@ jobject EnumMapper::mapNodeKind(svn_node_kind_t nodeKind)
jobject EnumMapper::mapNotifyLockState(svn_wc_notify_lock_state_t state)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ClientNotifyInformation$LockStatus",
+ return mapEnum(JAVAHL_CLASS("/ClientNotifyInformation$LockStatus"),
static_cast<int>(state));
}
@@ -138,7 +112,7 @@ jobject EnumMapper::mapNotifyLockState(svn_wc_notify_lock_state_t state)
jobject EnumMapper::mapScheduleKind(svn_wc_schedule_t schedule)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/types/Info$ScheduleKind",
+ return mapEnum(JAVAHL_CLASS("/types/Info$ScheduleKind"),
static_cast<int>(schedule));
}
@@ -149,91 +123,121 @@ jobject EnumMapper::mapStatusKind(svn_wc_status_kind svnKind)
{
// We're assuming a valid value for the C enum above
// The offset here is +1
- return mapEnum(JAVA_PACKAGE"/types/Status$Kind",
+ return mapEnum(JAVAHL_CLASS("/types/Status$Kind"),
static_cast<int>(svnKind) - 1);
}
jobject EnumMapper::mapChecksumKind(svn_checksum_kind_t kind)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/types/Checksum$Kind",
+ return mapEnum(JAVAHL_CLASS("/types/Checksum$Kind"),
static_cast<int>(kind));
}
jobject EnumMapper::mapConflictKind(svn_wc_conflict_kind_t kind)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ConflictDescriptor$Kind",
+ return mapEnum(JAVAHL_CLASS("/ConflictDescriptor$Kind"),
static_cast<int>(kind));
}
jobject EnumMapper::mapConflictAction(svn_wc_conflict_action_t action)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ConflictDescriptor$Action",
+ return mapEnum(JAVAHL_CLASS("/ConflictDescriptor$Action"),
static_cast<int>(action));
}
jobject EnumMapper::mapConflictReason(svn_wc_conflict_reason_t reason)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ConflictDescriptor$Reason",
+ return mapEnum(JAVAHL_CLASS("/ConflictDescriptor$Reason"),
static_cast<int>(reason));
}
int EnumMapper::toMergeinfoLogKind(jobject jLogKind)
{
- return getOrdinal(JAVA_PACKAGE"/types/Mergeinfo$LogKind", jLogKind);
+ return getOrdinal(JAVAHL_CLASS("/types/Mergeinfo$LogKind"), jLogKind);
}
int EnumMapper::toLogLevel(jobject jLogLevel)
{
- return getOrdinal(JAVA_PACKAGE"/SVNClient$ClientLogLevel", jLogLevel);
+ return getOrdinal(JAVAHL_CLASS("/SVNClient$ClientLogLevel"), jLogLevel);
+}
+
+svn_node_kind_t EnumMapper::toNodeKind(jobject jNodeKind)
+{
+ return svn_node_kind_t(
+ getOrdinal(JAVAHL_CLASS("/types/NodeKind"), jNodeKind));
+}
+
+svn_checksum_kind_t EnumMapper::toChecksumKind(jobject jChecksumKind)
+{
+ return svn_checksum_kind_t(
+ getOrdinal(JAVAHL_CLASS("/types/Checksum$Kind"), jChecksumKind));
+}
+
+svn_tristate_t EnumMapper::toTristate(jobject jTristate)
+{
+ switch (getOrdinal(JAVAHL_CLASS("/types/Tristate"), jTristate))
+ {
+ case 1: return svn_tristate_false;
+ case 2: return svn_tristate_true;
+ default: return svn_tristate_unknown;
+ }
}
svn_depth_t EnumMapper::toDepth(jobject jdepth)
{
// The offset for depths is -2
- return static_cast<svn_depth_t>(getOrdinal(JAVA_PACKAGE"/types/Depth", jdepth) - 2);
+ return static_cast<svn_depth_t>(getOrdinal(JAVAHL_CLASS("/types/Depth"), jdepth) - 2);
}
+svn_mergeinfo_inheritance_t
+EnumMapper::toMergeinfoInheritance(jobject jInheritance)
+{
+ return static_cast<svn_mergeinfo_inheritance_t>(
+ getOrdinal(JAVAHL_CLASS("/types/Mergeinfo$Inheritance"), jInheritance));
+}
+
+
jobject EnumMapper::mapDepth(svn_depth_t depth)
{
// We're assuming a valid value for the C enum above
// The offset for depths is -2
- return mapEnum(JAVA_PACKAGE"/types/Depth", static_cast<int>(depth) + 2);
+ return mapEnum(JAVAHL_CLASS("/types/Depth"), static_cast<int>(depth) + 2);
}
jobject EnumMapper::mapOperation(svn_wc_operation_t operation)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/ConflictDescriptor$Operation",
+ return mapEnum(JAVAHL_CLASS("/ConflictDescriptor$Operation"),
static_cast<int>(operation));
}
jobject EnumMapper::mapTristate(svn_tristate_t tristate)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/types/Tristate",
+ return mapEnum(JAVAHL_CLASS("/types/Tristate"),
static_cast<int>(tristate - svn_tristate_false));
}
svn_wc_conflict_choice_t EnumMapper::toConflictChoice(jobject jchoice)
{
return static_cast<svn_wc_conflict_choice_t>
- (getOrdinal(JAVA_PACKAGE"/ConflictResult$Choice", jchoice));
+ (getOrdinal(JAVAHL_CLASS("/ConflictResult$Choice"), jchoice));
}
svn_opt_revision_kind EnumMapper::toRevisionKind(jobject jkind)
{
return static_cast<svn_opt_revision_kind>
- (getOrdinal(JAVA_PACKAGE"/types/Revision$Kind", jkind));
+ (getOrdinal(JAVAHL_CLASS("/types/Revision$Kind"), jkind));
}
jobject EnumMapper::mapSummarizeKind(svn_client_diff_summarize_kind_t sKind)
{
// We're assuming a valid value for the C enum above
- return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind",
+ return mapEnum(JAVAHL_CLASS("/DiffSummary$DiffKind"),
static_cast<int>(sKind));
}
diff --git a/subversion/bindings/javahl/native/EnumMapper.h b/subversion/bindings/javahl/native/EnumMapper.h
index cb38bd9..3aa0423 100644
--- a/subversion/bindings/javahl/native/EnumMapper.h
+++ b/subversion/bindings/javahl/native/EnumMapper.h
@@ -48,9 +48,13 @@ class EnumMapper
static svn_wc_conflict_choice_t toConflictChoice(jobject jchoice);
static int toMergeinfoLogKind(jobject jLogKind);
static int toLogLevel(jobject jLogLevel);
+ static svn_node_kind_t toNodeKind(jobject jNodeKind);
+ static svn_checksum_kind_t toChecksumKind(jobject jChecksumKind);
+ static svn_tristate_t toTristate(jobject jTristate);
+ static svn_mergeinfo_inheritance_t
+ toMergeinfoInheritance(jobject jInheritance);
/* Converting from C enum's */
- static jint mapCommitMessageStateFlags(apr_byte_t flags);
static jobject mapChangePathAction(const char action);
static jobject mapNotifyState(svn_wc_notify_state_t state);
static jobject mapNotifyAction(svn_wc_notify_action_t action);
diff --git a/subversion/bindings/javahl/native/ExternalItem.cpp b/subversion/bindings/javahl/native/ExternalItem.cpp
new file mode 100644
index 0000000..acfa1fb
--- /dev/null
+++ b/subversion/bindings/javahl/native/ExternalItem.cpp
@@ -0,0 +1,176 @@
+/**
+ * @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
+ */
+
+#include "jniwrapper/jni_stack.hpp"
+
+#include "ExternalItem.hpp"
+#include "Revision.h"
+
+namespace JavaHL {
+
+const char* const ExternalItem::m_class_name =
+ JAVAHL_CLASS("/types/ExternalItem");
+
+ExternalItem::ClassImpl::ClassImpl(::Java::Env env, jclass cls)
+ : ::Java::Object::ClassImpl(env, cls),
+ m_mid_ctor(
+ env.GetMethodID(cls, "<init>",
+ "(ZLjava/lang/String;Ljava/lang/String;"
+ JAVAHL_ARG("/types/Revision;")
+ JAVAHL_ARG("/types/Revision;")
+ ")V")),
+ m_fid_target_dir(env.GetFieldID(cls, "targetDir", "Ljava/lang/String;")),
+ m_fid_url(env.GetFieldID(cls, "url", "Ljava/lang/String;")),
+ m_fid_revision(env.GetFieldID(cls, "revision",
+ JAVAHL_ARG("/types/Revision;"))),
+ m_fid_peg_revision(env.GetFieldID(cls, "pegRevision",
+ JAVAHL_ARG("/types/Revision;")))
+{}
+
+ExternalItem::ClassImpl::~ClassImpl() {}
+
+namespace {
+inline jstring
+get_string_field(::Java::Env env, jobject jthis,
+ const ::Java::FieldID& fid)
+{
+ return jstring(env.GetObjectField(jthis, fid));
+}
+
+inline svn_opt_revision_t
+get_revision_field(::Java::Env env, jobject jthis,
+ const ::Java::FieldID& fid)
+{
+ const jobject rev = env.GetObjectField(jthis, fid);
+ return *Revision(rev).revision();
+}
+
+inline jobject
+make_external_item(::Java::Env env,
+ jclass cls, const ::Java::MethodID& mid_ctor,
+ const char* target_dir,
+ const char* url,
+ const svn_opt_revision_t* revision,
+ const svn_opt_revision_t* peg_revision)
+{
+ return env.NewObject(cls, mid_ctor,
+ JNI_FALSE,
+ env.NewStringUTF(target_dir),
+ env.NewStringUTF(url),
+ Revision::makeJRevision(*revision),
+ Revision::makeJRevision(*peg_revision));
+}
+} // anonymous namespace
+
+ExternalItem::ExternalItem(::Java::Env env, jobject jthis)
+ : Object(env, ::Java::ClassCache::get_external_item(env), jthis),
+ m_target_dir(env, get_string_field(env, jthis, impl().m_fid_target_dir)),
+ m_url(env, get_string_field(env, jthis, impl().m_fid_url)),
+ m_revision(get_revision_field(env, jthis, impl().m_fid_revision)),
+ m_peg_revision(get_revision_field(env, jthis, impl().m_fid_peg_revision))
+{}
+
+ExternalItem::ExternalItem(::Java::Env env,
+ const char* target_dir,
+ const char* url,
+ const svn_opt_revision_t* revision,
+ const svn_opt_revision_t* peg_revision)
+ : Object(env, ::Java::ClassCache::get_external_item(env)),
+ m_target_dir(env, target_dir),
+ m_url(env, url),
+ m_revision(*revision),
+ m_peg_revision(*peg_revision)
+{
+ set_this(make_external_item(env, get_class(), impl().m_mid_ctor,
+ target_dir, url, revision, peg_revision));
+}
+
+svn_wc_external_item2_t*
+ExternalItem::get_external_item(SVN::Pool& svnpool) const
+{
+ svn_wc_external_item2_t* item;
+ apr_pool_t* const pool = svnpool.getPool();
+ SVN_JAVAHL_CHECK(m_env, svn_wc_external_item2_create(&item, pool));
+
+ item->target_dir = apr_pstrdup(
+ pool, Java::String::Contents(m_target_dir).c_str());
+ item->url = apr_pstrdup(
+ pool, Java::String::Contents(m_url).c_str());
+ item->revision = m_revision;
+ item->peg_revision = m_peg_revision;
+ return item;
+}
+
+} // namespace JavaHL
+
+
+// FIXME: Should be in another source file, but Revision.cpp is
+// old-style, so we'll put this implementation here for now.
+namespace {
+inline jobject get_static_revision(::Java::Env env, jclass cls,
+ const char* field_name)
+{
+ return env.GetStaticObjectField(
+ cls, env.GetStaticFieldID(cls, field_name,
+ JAVAHL_ARG("/types/Revision;")));
+}
+} // anonymous namespace
+
+jobject Revision::makeJRevision(const svn_opt_revision_t& rev)
+{
+ if (rev.kind == svn_opt_revision_number)
+ return Revision::makeJRevision(rev.value.number);
+
+ const ::Java::Env env;
+
+ if (rev.kind == svn_opt_revision_date)
+ {
+ const jclass cls = env.FindClass(
+ JAVAHL_CLASS("/types/Revision$DateSpec"));
+ return env.NewObject(cls, env.GetMethodID(cls, "<init>", "(J)V"),
+ jlong(rev.value.date / 1000));
+ }
+
+ const jclass cls = env.FindClass(JAVAHL_CLASS("/types/Revision"));
+ switch (rev.kind)
+ {
+ case svn_opt_revision_committed:
+ return get_static_revision(env, cls, "COMMITTED");
+
+ case svn_opt_revision_previous:
+ return get_static_revision(env, cls, "PREVIOUS");
+
+ case svn_opt_revision_base:
+ return get_static_revision(env, cls, "BASE");
+
+ case svn_opt_revision_working:
+ return get_static_revision(env, cls, "WORKING");
+
+ case svn_opt_revision_head:
+ return get_static_revision(env, cls, "HEAD");
+
+ case svn_opt_revision_unspecified:
+ default:
+ return get_static_revision(env, cls, "UNSPECIFIED");
+ }
+}
diff --git a/subversion/bindings/javahl/native/ExternalItem.hpp b/subversion/bindings/javahl/native/ExternalItem.hpp
new file mode 100644
index 0000000..75827ff
--- /dev/null
+++ b/subversion/bindings/javahl/native/ExternalItem.hpp
@@ -0,0 +1,139 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_EXTERNAL_ITEM_HPP
+#define SVN_JAVAHL_EXTERNAL_ITEM_HPP
+
+#include <string>
+
+#include "svn_opt.h"
+#include "svn_wc.h"
+
+#include "Pool.h"
+
+#include "jniwrapper/jni_object.hpp"
+#include "jniwrapper/jni_string.hpp"
+
+namespace JavaHL {
+
+/**
+ * Object wrapper for @c org.apache.subversion.javahl.types.ExternalItem.
+ *
+ * @since New in 1.9.
+ */
+class ExternalItem : public ::Java::Object
+{
+public:
+ /**
+ * Constructs a wrapper around @a jthis.
+ * The constructor does not verify the class of the wrapped object.
+ */
+ explicit ExternalItem(::Java::Env env, jobject jthis);
+
+ /**
+ * Constructs a new @c ExternalItem object and wrapper.
+ */
+ explicit ExternalItem(::Java::Env env,
+ const char* target_dir,
+ const char* url,
+ const svn_opt_revision_t* revision,
+ const svn_opt_revision_t* peg_revision);
+
+ /**
+ * Returns the value of the wrapped object's @c targetDir member.
+ */
+ std::string target_dir() const
+ {
+ const ::Java::String::Contents contents(m_target_dir);
+ return std::string(contents.c_str());
+ }
+
+ /**
+ * Returns the value of the wrapped object's @c url member.
+ */
+ std::string url() const
+ {
+ const ::Java::String::Contents contents(m_url);
+ return std::string(contents.c_str());
+ }
+
+ /**
+ * Returns the value of the wrapped object's @c revision member.
+ */
+ const svn_opt_revision_t* revision() const
+ {
+ return &m_revision;
+ }
+
+ /**
+ * Returns the value of the wrapped object's @c pegRevision member.
+ */
+ const svn_opt_revision_t* peg_revision() const
+ {
+ return &m_peg_revision;
+ }
+
+ /**
+ * Returns an @c svn_wc_external_item2_t allocated from @a pool and
+ * filled in with this object's values.
+ */
+ svn_wc_external_item2_t* get_external_item(SVN::Pool& pool) const;
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ::Java::ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(::Java::Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const ::Java::MethodID m_mid_ctor;
+ const ::Java::FieldID m_fid_target_dir;
+ const ::Java::FieldID m_fid_url;
+ const ::Java::FieldID m_fid_revision;
+ const ::Java::FieldID m_fid_peg_revision;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+
+ ::Java::String m_target_dir;
+ ::Java::String m_url;
+ svn_opt_revision_t m_revision;
+ svn_opt_revision_t m_peg_revision;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_EXTERNAL_ITEM_HPP
diff --git a/subversion/bindings/javahl/native/GlobalConfig.h b/subversion/bindings/javahl/native/GlobalConfig.h
new file mode 100644
index 0000000..b7c561d
--- /dev/null
+++ b/subversion/bindings/javahl/native/GlobalConfig.h
@@ -0,0 +1,38 @@
+/**
+ * @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 GlobalConfig.h
+ * @brief Interface of the class GlobalConfig
+ */
+
+#ifndef JAVAHL_GLOBAL_CONFIG_H
+#define JAVAHL_GLOBAL_CONFIG_H
+
+#include "JNIUtil.h"
+
+class GlobalConfig
+{
+ public:
+ static bool useNativeCredentialsStore();
+};
+
+#endif // JAVAHL_GLOBAL_CONFIG_H
diff --git a/subversion/bindings/javahl/native/ImportFilterCallback.cpp b/subversion/bindings/javahl/native/ImportFilterCallback.cpp
index 33d7e8b..3c4a4c5 100644
--- a/subversion/bindings/javahl/native/ImportFilterCallback.cpp
+++ b/subversion/bindings/javahl/native/ImportFilterCallback.cpp
@@ -83,13 +83,14 @@ ImportFilterCallback::doImportFilter(svn_boolean_t *filtered,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ImportFilterCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ImportFilterCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "filter",
"(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;Z)Z");
+ JAVAHL_ARG("/types/NodeKind;")
+ "Z)Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
diff --git a/subversion/bindings/javahl/native/InfoCallback.cpp b/subversion/bindings/javahl/native/InfoCallback.cpp
index 8a9e375..ee8fb69 100644
--- a/subversion/bindings/javahl/native/InfoCallback.cpp
+++ b/subversion/bindings/javahl/native/InfoCallback.cpp
@@ -80,12 +80,12 @@ InfoCallback::singleInfo(const char *path,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/InfoCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/InfoCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "singleInfo",
- "(L"JAVA_PACKAGE"/types/Info;)V");
+ "(" JAVAHL_ARG("/types/Info;") ")V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -95,8 +95,6 @@ InfoCallback::singleInfo(const char *path,
POP_AND_RETURN(SVN_NO_ERROR);
env->CallVoidMethod(m_callback, mid, jinfo2);
- // Return SVN_NO_ERROR here regardless of an exception or not.
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
diff --git a/subversion/bindings/javahl/native/InfoCallback.h b/subversion/bindings/javahl/native/InfoCallback.h
index b65f203..a1975d2 100644
--- a/subversion/bindings/javahl/native/InfoCallback.h
+++ b/subversion/bindings/javahl/native/InfoCallback.h
@@ -30,8 +30,6 @@
#include <jni.h>
#include "svn_client.h"
-struct info_entry;
-
/**
* This class holds a Java callback object, which will receive every line of
* the file for which the callback information is requested.
diff --git a/subversion/bindings/javahl/native/InputStream.cpp b/subversion/bindings/javahl/native/InputStream.cpp
index 1c73ba2..ac10f9e 100644
--- a/subversion/bindings/javahl/native/InputStream.cpp
+++ b/subversion/bindings/javahl/native/InputStream.cpp
@@ -54,7 +54,8 @@ svn_stream_t *InputStream::getStream(const SVN::Pool &pool)
// Create a stream with this as the baton and set the read and
// close functions.
svn_stream_t *ret = svn_stream_create(this, pool.getPool());
- svn_stream_set_read(ret, InputStream::read);
+ svn_stream_set_read2(ret, InputStream::read,
+ NULL /* only partial read support */);
svn_stream_set_close(ret, InputStream::close);
return ret;
}
@@ -68,6 +69,9 @@ svn_stream_t *InputStream::getStream(const SVN::Pool &pool)
*/
svn_error_t *InputStream::read(void *baton, char *buffer, apr_size_t *len)
{
+ if (0 == *len)
+ return SVN_NO_ERROR;
+
JNIEnv *env = JNIUtil::getEnv();
// An object of our class is passed in as the baton.
InputStream *that = static_cast<InputStream *>(baton);
diff --git a/subversion/bindings/javahl/native/Iterator.cpp b/subversion/bindings/javahl/native/Iterator.cpp
new file mode 100644
index 0000000..bd8aee0
--- /dev/null
+++ b/subversion/bindings/javahl/native/Iterator.cpp
@@ -0,0 +1,115 @@
+/**
+ * @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 Iterator.cpp
+ * @brief Implementation of the class Iterator
+ */
+
+#include "Iterator.h"
+
+namespace {
+jobject init_iterator(jobject jiterable, bool persistent)
+{
+ // A null iterable is allowed, we'll leave the iterator null and
+ // nothing will happen in hasNext() and next().
+ if (!jiterable)
+ return NULL;
+
+ JNIEnv* env = JNIUtil::getEnv();
+
+ static jmethodID iterator_mid = 0;
+ if (0 == iterator_mid)
+ {
+ jclass cls = env->FindClass("java/lang/Iterable");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ iterator_mid = env->GetMethodID(cls, "iterator",
+ "()Ljava/util/Iterator;");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ jobject jiterator = env->CallObjectMethod(jiterable, iterator_mid);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ return (persistent ? env->NewGlobalRef(jiterator) : jiterator);
+}
+} // anonymous namespace
+
+
+Iterator::Iterator(jobject jiterable)
+ : m_persistent(false),
+ m_jiterator(init_iterator(jiterable, false))
+{}
+
+Iterator::Iterator(jobject jiterable, bool)
+ : m_persistent(true),
+ m_jiterator(init_iterator(jiterable, true))
+{}
+
+Iterator::~Iterator()
+{
+ if (m_persistent && m_jiterator)
+ JNIUtil::getEnv()->DeleteGlobalRef(m_jiterator);
+}
+
+bool Iterator::hasNext() const
+{
+ if (!m_jiterator)
+ return false;
+
+ JNIEnv* env = JNIUtil::getEnv();
+
+ static jmethodID hasNext_mid = 0;
+ if (0 == hasNext_mid)
+ {
+ jclass cls = env->FindClass("java/util/Iterator");
+ if (JNIUtil::isExceptionThrown())
+ return false;
+ hasNext_mid = env->GetMethodID(cls, "hasNext", "()Z");
+ if (JNIUtil::isExceptionThrown())
+ return false;
+ }
+
+ return bool(env->CallBooleanMethod(m_jiterator, hasNext_mid));
+}
+
+jobject Iterator::next() const
+{
+ if (!m_jiterator)
+ return NULL;
+
+ JNIEnv* env = JNIUtil::getEnv();
+
+ static jmethodID next_mid = 0;
+ if (0 == next_mid)
+ {
+ jclass cls = env->FindClass("java/util/Iterator");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ next_mid = env->GetMethodID(cls, "next", "()Ljava/lang/Object;");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ return env->CallObjectMethod(m_jiterator, next_mid);
+}
diff --git a/subversion/bindings/javahl/native/Iterator.h b/subversion/bindings/javahl/native/Iterator.h
new file mode 100644
index 0000000..c116ab3
--- /dev/null
+++ b/subversion/bindings/javahl/native/Iterator.h
@@ -0,0 +1,64 @@
+/**
+ * @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 Iterator.cpp
+ * @brief Interface of the class Iterator
+ */
+
+#ifndef JAVAHL_ITERATOR_H
+#define JAVAHL_ITERATOR_H
+
+#include "JNIUtil.h"
+
+/**
+ * Encapsulates an immutable java.lang.Iterator implementation.
+ */
+class Iterator
+{
+public:
+ Iterator(jobject jiterable);
+ ~Iterator();
+ bool hasNext() const;
+ jobject next() const;
+
+protected:
+ Iterator(jobject jiterable, bool);
+
+private:
+ bool m_persistent;
+ jobject m_jiterator;
+};
+
+
+/**
+ * Like Iterator, but the implementation will hold a global reference
+ * to the internal iterator object to protect it across JNI calls.
+ */
+class PersistentIterator : protected Iterator
+{
+public:
+ PersistentIterator(jobject jiterable) : Iterator(jiterable, true) {}
+ bool hasNext() const { return Iterator::hasNext(); }
+ jobject next() const { return Iterator::next(); }
+};
+
+#endif // JAVAHL_ITERATOR_H
diff --git a/subversion/bindings/javahl/native/JNIByteArray.cpp b/subversion/bindings/javahl/native/JNIByteArray.cpp
index 34ce96c..cedb1bb 100644
--- a/subversion/bindings/javahl/native/JNIByteArray.cpp
+++ b/subversion/bindings/javahl/native/JNIByteArray.cpp
@@ -32,30 +32,24 @@
* @param flag that the underlying byte array reference should be deleted at
* destruction
*/
-JNIByteArray::JNIByteArray(jbyteArray jba, bool deleteByteArray)
-{
- m_array = jba;
- m_deleteByteArray = deleteByteArray;
- if (jba != NULL)
- {
- // Get the bytes.
- JNIEnv *env = JNIUtil::getEnv();
- m_data = env->GetByteArrayElements(jba, NULL);
- }
- else
- {
- m_data = NULL;
- }
-}
+JNIByteArray::JNIByteArray(jbyteArray jba,
+ bool deleteByteArray,
+ bool abortOnRelease)
+ : m_array(jba),
+ m_data(!jba ? NULL
+ : JNIUtil::getEnv()->GetByteArrayElements(jba, NULL)),
+ m_deleteByteArray(deleteByteArray),
+ m_abortOnRelease(abortOnRelease)
+{}
JNIByteArray::~JNIByteArray()
{
if (m_array != NULL)
{
// Release the bytes
- JNIUtil::getEnv()->ReleaseByteArrayElements(m_array,
- m_data,
- JNI_ABORT);
+ JNIUtil::getEnv()->ReleaseByteArrayElements(
+ m_array, m_data,
+ (m_abortOnRelease ? JNI_ABORT: JNI_COMMIT));
if (m_deleteByteArray)
// And if needed the byte array.
JNIUtil::getEnv()->DeleteLocalRef(m_array);
diff --git a/subversion/bindings/javahl/native/JNIByteArray.h b/subversion/bindings/javahl/native/JNIByteArray.h
index b43673b..e988bda 100644
--- a/subversion/bindings/javahl/native/JNIByteArray.h
+++ b/subversion/bindings/javahl/native/JNIByteArray.h
@@ -51,11 +51,18 @@ class JNIByteArray
* at destruction.
*/
bool m_deleteByteArray;
+
+ /**
+ * False if changes to the array should be committed to the Java VM.
+ */
+ bool m_abortOnRelease;
public:
bool isNull() const;
const signed char *getBytes() const;
int getLength();
- JNIByteArray(jbyteArray jba, bool deleteByteArray = false);
+ JNIByteArray(jbyteArray jba,
+ bool deleteByteArray = false,
+ bool abortOnRelease = true);
~JNIByteArray();
};
diff --git a/subversion/bindings/javahl/native/JNICriticalSection.h b/subversion/bindings/javahl/native/JNICriticalSection.h
index 685b049..d628c7e 100644
--- a/subversion/bindings/javahl/native/JNICriticalSection.h
+++ b/subversion/bindings/javahl/native/JNICriticalSection.h
@@ -32,7 +32,7 @@ class JNIMutex;
/**
* This class holds a mutex which will be locked during the constructor and
* released during the destructor. If the object is created on the stack, this
- * garanties that the mutex will be released all the time if the block is left.
+ * guaranties that the mutex will be released all the time if the block is left.
* Only one thread can enter all the critrical sections secured by the same
* mutex.
*/
diff --git a/subversion/bindings/javahl/native/JNIStackElement.cpp b/subversion/bindings/javahl/native/JNIStackElement.cpp
index 2ca6c6e..df9163d 100644
--- a/subversion/bindings/javahl/native/JNIStackElement.cpp
+++ b/subversion/bindings/javahl/native/JNIStackElement.cpp
@@ -27,7 +27,6 @@
#include "JNIStackElement.h"
#include "JNIUtil.h"
#include "JNIStringHolder.h"
-#include "JNIThreadData.h"
#include <apr_strings.h>
/**
@@ -74,7 +73,7 @@ JNIStackElement::JNIStackElement(JNIEnv *env, const char *clazz,
// Copy the result to a buffer.
JNIStringHolder name(reinterpret_cast<jstring>(oStr));
- strncat(m_objectID, name, JNIUtil::formatBufferSize -1);
+ strncat(m_objectID, name, sizeof(m_objectID) - 1);
env->DeleteLocalRef(oStr);
}
@@ -86,8 +85,8 @@ JNIStackElement::JNIStackElement(JNIEnv *env, const char *clazz,
m_method = method;
// Generate the log message.
- char *buffer = JNIUtil::getFormatBuffer();
- apr_snprintf(buffer, JNIUtil::formatBufferSize,
+ char buffer[2048];
+ apr_snprintf(buffer, sizeof(buffer),
"entry class %s method %s object %s", m_clazz, m_method,
m_objectID);
JNIUtil::logMessage(buffer);
@@ -110,11 +109,10 @@ JNIStackElement::~JNIStackElement()
if (m_clazz != NULL)
{
// Generate a log message.
- char *buffer = JNIUtil::getFormatBuffer();
- apr_snprintf(buffer, JNIUtil::formatBufferSize,
+ char buffer[2048];
+ apr_snprintf(buffer, sizeof(buffer),
"exit class %s method %s object %s", m_clazz,
m_method, m_objectID);
JNIUtil::logMessage(buffer);
}
- JNIThreadData::popThreadData();
}
diff --git a/subversion/bindings/javahl/native/JNIStackElement.h b/subversion/bindings/javahl/native/JNIStackElement.h
index 99dab62..61708c3 100644
--- a/subversion/bindings/javahl/native/JNIStackElement.h
+++ b/subversion/bindings/javahl/native/JNIStackElement.h
@@ -73,7 +73,7 @@ class JNIStackElement
* A buffer for the result for jthis.toString to identify the
* object.
*/
- char m_objectID[JNIUtil::formatBufferSize];
+ char m_objectID[2048];
};
#endif // JNISTACKELEMENT_H
diff --git a/subversion/bindings/javahl/native/JNIStringHolder.h b/subversion/bindings/javahl/native/JNIStringHolder.h
index 7d36bed..c1bbf72 100644
--- a/subversion/bindings/javahl/native/JNIStringHolder.h
+++ b/subversion/bindings/javahl/native/JNIStringHolder.h
@@ -36,6 +36,7 @@ class JNIStringHolder
JNIStringHolder(jstring jtext);
~JNIStringHolder();
operator const char *() { return m_str; }
+ const char* c_str() const { return m_str; }
const char *pstrdup(apr_pool_t *pool);
protected:
diff --git a/subversion/bindings/javahl/native/JNIThreadData.cpp b/subversion/bindings/javahl/native/JNIThreadData.cpp
deleted file mode 100644
index e3ce334..0000000
--- a/subversion/bindings/javahl/native/JNIThreadData.cpp
+++ /dev/null
@@ -1,169 +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 JNIThreadData.cpp
- * @brief Implementation of the class JNIThreadData
- */
-
-#include "JNIThreadData.h"
-#include <apr_strings.h>
-#include <apr_tables.h>
-#include <apr_general.h>
-#include <apr_lib.h>
-#include <apr_thread_proc.h>
-#include "JNIUtil.h"
-
-apr_threadkey_t *JNIThreadData::g_key;
-
-/**
- * Create and initialize a new object.
- */
-JNIThreadData::JNIThreadData()
-{
- m_env = NULL;
- m_exceptionThrown = false;
- m_previous = NULL;
-}
-
-JNIThreadData::~JNIThreadData()
-{
-}
-
-/**
- * Initialize the thread local storage.
- * @return success or failure
- */
-bool JNIThreadData::initThreadData()
-{
- // If already initialized -> nothing to do.
- if (g_key != NULL)
- return false;
-
- // Request a key for the thread local storage from the global pool
- // and register a callback function called when the thread is
- // deleted.
- apr_status_t apr_err = apr_threadkey_private_create(&g_key,
- del,
- JNIUtil::getPool());
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_create");
- return false;
- }
-
- return true;
-}
-
-/**
- * Get the thread local storage for this thread.
- * @return thread local storage
- */
-JNIThreadData *JNIThreadData::getThreadData()
-{
- // We should never be called before initThreadData
- if (g_key == NULL)
- return NULL;
-
- // Retrieve the thread local storage from APR.
- JNIThreadData *data = NULL;
- apr_status_t apr_err = apr_threadkey_private_get
- (reinterpret_cast<void**>(&data), g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");
- return NULL;
- }
-
- // Not already allocated.
- if (data == NULL)
- {
- // Allocate and store to APR.
- data = new JNIThreadData;
- apr_err = apr_threadkey_private_set (data, g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");
- return NULL;
- }
- }
- return data;
-}
-
-/**
- * Allocate a new ThreadData for the current call from Java and push
- * it on the stack
- */
-void JNIThreadData::pushNewThreadData()
-{
- JNIThreadData *data = NULL;
- apr_status_t apr_err = apr_threadkey_private_get
- (reinterpret_cast<void**>(&data), g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");
- return;
- }
- JNIThreadData *newData = new JNIThreadData();
- newData->m_previous =data;
- apr_err = apr_threadkey_private_set(newData, g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");
- return;
- }
-}
-
-/**
- * Pop the current ThreadData from the stack, because the call
- * completed.
- */
-void JNIThreadData::popThreadData()
-{
- JNIThreadData *data = NULL;
- apr_status_t apr_err = apr_threadkey_private_get
- (reinterpret_cast<void**>(&data), g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");
- return;
- }
- if (data == NULL)
- return;
-
- JNIThreadData *oldData = data->m_previous;
- delete data;
- apr_err = apr_threadkey_private_set(oldData, g_key);
- if (apr_err)
- {
- JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");
- return;
- }
-}
-
-/**
- * Callback called by APR when the thread dies. Deletes the thread
- * local storage.
- */
-void JNIThreadData::del(void *p)
-{
- delete reinterpret_cast<JNIThreadData*>(p);
-}
diff --git a/subversion/bindings/javahl/native/JNIUtil.cpp b/subversion/bindings/javahl/native/JNIUtil.cpp
index e52e975..2adcf2f 100644
--- a/subversion/bindings/javahl/native/JNIUtil.cpp
+++ b/subversion/bindings/javahl/native/JNIUtil.cpp
@@ -24,6 +24,13 @@
* @brief Implementation of the class JNIUtil
*/
+/* Include apr.h first, or INT64_C won't be defined properly on some C99
+ compilers, when other headers include <stdint.h> before defining some
+ macros.
+
+ See apr.h for the ugly details */
+#include <apr.h>
+
#include "JNIUtil.h"
#include "Array.h"
@@ -35,8 +42,11 @@
#include <apr_tables.h>
#include <apr_general.h>
#include <apr_lib.h>
+#include <apr_file_info.h>
+#include <apr_time.h>
#include "svn_pools.h"
+#include "svn_error.h"
#include "svn_fs.h"
#include "svn_ra.h"
#include "svn_utf.h"
@@ -44,37 +54,43 @@
#include "svn_dso.h"
#include "svn_path.h"
#include "svn_cache_config.h"
-#include <apr_file_info.h>
+#include "private/svn_atomic.h"
+#include "private/svn_utf_private.h"
#include "svn_private_config.h"
-#ifdef WIN32
-/* FIXME: We're using an internal APR header here, which means we
- have to build Subversion with APR sources. This being Win32-only,
- that should be fine for now, but a better solution must be found in
- combination with issue #850. */
-extern "C" {
-#include <arch/win32/apr_arch_utf8.h>
-};
-#endif
#include "SVNBase.h"
#include "JNIMutex.h"
#include "JNICriticalSection.h"
-#include "JNIThreadData.h"
#include "JNIStringHolder.h"
#include "Pool.h"
+
+#include "jniwrapper/jni_env.hpp"
+
// Static members of JNIUtil are allocated here.
apr_pool_t *JNIUtil::g_pool = NULL;
std::list<SVNBase*> JNIUtil::g_finalizedObjects;
JNIMutex *JNIUtil::g_finalizedObjectsMutex = NULL;
JNIMutex *JNIUtil::g_logMutex = NULL;
+JNIMutex *JNIUtil::g_configMutex = NULL;
bool JNIUtil::g_initException;
-bool JNIUtil::g_inInit;
-JNIEnv *JNIUtil::g_initEnv;
-char JNIUtil::g_initFormatBuffer[formatBufferSize];
int JNIUtil::g_logLevel = JNIUtil::noLog;
std::ofstream JNIUtil::g_logStream;
+/* The error code we will use to signal a Java exception */
+static const apr_status_t
+SVN_ERR_JAVAHL_WRAPPED = SVN_ERR_MALFUNC_CATEGORY_START
+ + SVN_ERR_CATEGORY_SIZE - 10;
+
+/**
+ * Return the JNI environment to use
+ * @return the JNI environment
+ */
+JNIEnv *JNIUtil::getEnv()
+{
+ return Java::Env().get();
+}
+
/**
* Initialize the environment for all requests.
* @param env the JNI environment for this request
@@ -84,9 +100,6 @@ bool JNIUtil::JNIInit(JNIEnv *env)
// Clear all standing exceptions.
env->ExceptionClear();
- // Remember the env parameter for the remainder of the request.
- setEnv(env);
-
// Lock the list of finalized objects.
JNICriticalSection cs(*g_finalizedObjectsMutex) ;
if (isExceptionThrown())
@@ -104,49 +117,48 @@ bool JNIUtil::JNIInit(JNIEnv *env)
return true;
}
+/* Forwarder for calling JNIGlobalInit from JNI_OnLoad(). */
+bool initialize_jni_util(JNIEnv *env)
+{
+ return JNIUtil::JNIGlobalInit(env);
+}
+
+namespace {
+
+volatile svn_atomic_t *gentle_crash_write_loc = NULL;
+
+svn_error_t *
+gently_crash_the_jvm(svn_boolean_t can_return,
+ const char *file, int line, const char *expr)
+{
+ if (!can_return)
+ {
+ // Try not to abort; aborting prevents the JVM from creating
+ // a crash log, which is oh so useful for debugging.
+ // We can't just raise a SEGV signal, either, because it will
+ // be not be caught in the context that we're interested in
+ // getting the stack trace from.
+
+ // Try reading from and writing to the zero page
+ const svn_atomic_t zeropage = svn_atomic_read(gentle_crash_write_loc);
+ svn_atomic_set(gentle_crash_write_loc, zeropage);
+ }
+
+ // Forward to the standard malfunction handler, which does call
+ // abort when !can_return; this will only happen if the write to the
+ // zero page did not cause a SEGV.
+ return svn_error_raise_on_malfunction(can_return, file, line, expr);
+}
+} // Anonymous namespace
+
/**
* Initialize the environment for all requests.
+ * This method must be called in a single-threaded context.
* @param env the JNI environment for this request
*/
bool JNIUtil::JNIGlobalInit(JNIEnv *env)
{
- // This method has to be run only once during the run a program.
- static bool run = false;
svn_error_t *err;
- if (run) // already run
- return true;
-
- run = true;
-
- // Do not run this part more than one time. This leaves a small
- // time window when two threads create their first SVNClient and
- // SVNAdmin at the same time, but I do not see a better option
- // without APR already initialized
- if (g_inInit)
- return false;
-
- g_inInit = true;
- g_initEnv = env;
-
- apr_status_t status;
-
-
-
- /* Initialize the APR subsystem, and register an atexit() function
- * to Uninitialize that subsystem at program exit. */
- status = apr_initialize();
- if (status)
- {
- if (stderr)
- {
- char buf[1024];
- apr_strerror(status, buf, sizeof(buf) - 1);
- fprintf(stderr,
- "%s: error: cannot initialize APR: %s\n",
- "svnjavahl", buf);
- }
- return FALSE;
- }
/* This has to happen before any pools are created. */
if ((err = svn_dso_initialize2()))
@@ -158,16 +170,8 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
return FALSE;
}
- if (0 > atexit(apr_terminate))
- {
- if (stderr)
- fprintf(stderr,
- "%s: error: atexit registration failed\n",
- "svnjavahl");
- return FALSE;
- }
-
- /* Create our top-level pool. */
+ /* Create our top-level pool.
+ N.B.: APR was initialized by JNI_OnLoad. */
g_pool = svn_pool_create(NULL);
apr_allocator_t* allocator = apr_pool_allocator_get(g_pool);
@@ -180,15 +184,25 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
}
svn_utf_initialize2(FALSE, g_pool); /* Optimize character conversions */
- svn_fs_initialize(g_pool); /* Avoid some theoretical issues */
- svn_ra_initialize(g_pool);
- /* We shouldn't fill the JVMs memory with FS cache data unless explictly
- requested. */
+ // Initialize the libraries we use
+ err = svn_fs_initialize(g_pool);
+ if (!err)
+ err = svn_ra_initialize(g_pool);
+ if (err)
+ {
+ if (stderr && err->message)
+ fprintf(stderr, "%s", err->message);
+
+ svn_error_clear(err);
+ return FALSE;
+ }
+
+ /* We shouldn't fill the JVMs memory with FS cache data unless
+ explicitly requested. And we don't either, because the caches get
+ allocated outside the JVM heap. Duh. */
{
svn_cache_config_t settings = *svn_cache_config_get();
- settings.cache_size = 0;
- settings.file_handle_count = 0;
settings.single_threaded = FALSE;
svn_cache_config_set(&settings);
}
@@ -197,32 +211,24 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
#ifdef WIN32
{
WCHAR ucs2_path[MAX_PATH];
- char *utf8_path;
+ const char *utf8_path;
const char *internal_path;
- apr_pool_t *pool;
- apr_status_t apr_err;
- apr_size_t inwords, outbytes;
- unsigned int outlength;
+ svn_error_t *err;
+ apr_pool_t *pool = svn_pool_create(g_pool);
- pool = svn_pool_create(g_pool);
/* get dll name - our locale info will be in '../share/locale' */
- inwords = sizeof(ucs2_path) / sizeof(ucs2_path[0]);
HINSTANCE moduleHandle = GetModuleHandle("libsvnjavahl-1");
- GetModuleFileNameW(moduleHandle, ucs2_path, inwords);
- inwords = lstrlenW(ucs2_path);
- outbytes = outlength = 3 * (inwords + 1);
- utf8_path = reinterpret_cast<char *>(apr_palloc(pool, outlength));
- apr_err = apr_conv_ucs2_to_utf8((const apr_wchar_t *) ucs2_path,
- &inwords, utf8_path, &outbytes);
- if (!apr_err && (inwords > 0 || outbytes == 0))
- apr_err = APR_INCOMPLETE;
- if (apr_err)
+ GetModuleFileNameW(moduleHandle, ucs2_path,
+ sizeof(ucs2_path) / sizeof(ucs2_path[0]));
+ err = svn_utf__win32_utf16_to_utf8(&utf8_path, ucs2_path, NULL, pool);
+ if (err)
{
if (stderr)
- fprintf(stderr, "Can't convert module path to UTF-8");
- return FALSE;
+ svn_handle_error2(err, stderr, false, "svn: ");
+ svn_error_clear(err);
+ return false;
}
- utf8_path[outlength - outbytes] = '\0';
+
internal_path = svn_dirent_internal_style(utf8_path, pool);
/* get base path name */
internal_path = svn_dirent_dirname(internal_path, pool);
@@ -268,16 +274,14 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
if (isExceptionThrown())
return false;
- // initialized the thread local storage
- if (!JNIThreadData::initThreadData())
- return false;
-
- setEnv(env);
+ g_configMutex = new JNIMutex(g_pool);
if (isExceptionThrown())
return false;
- g_initEnv = NULL;
- g_inInit = false;
+ // Set a malfunction handler that tries not to call abort, because
+ // that would prevent the JVM from creating a crash and stack log file.
+ svn_error_set_malfunction_handler(gently_crash_the_jvm);
+
return true;
}
@@ -304,18 +308,6 @@ void JNIUtil::raiseThrowable(const char *name, const char *message)
return;
env->ThrowNew(clazz, message);
- setExceptionThrown();
- env->DeleteLocalRef(clazz);
-}
-
-jstring JNIUtil::makeSVNErrorMessage(svn_error_t *err)
-{
- if (err == NULL)
- return NULL;
- std::string buffer;
- assembleErrorMessage(err, 0, APR_SUCCESS, buffer);
- jstring jmessage = makeJString(buffer.c_str());
- return jmessage;
}
void
@@ -418,10 +410,174 @@ JNIUtil::putErrorsInTrace(svn_error_t *err,
env->DeleteLocalRef(jfileName);
}
-void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
+namespace {
+struct MessageStackItem
{
- std::string msg;
- assembleErrorMessage(svn_error_purge_tracing(err), 0, APR_SUCCESS, msg);
+ apr_status_t m_code;
+ std::string m_message;
+ bool m_generic;
+
+ MessageStackItem(apr_status_t code, const char* message,
+ bool generic = false)
+ : m_code(code),
+ m_message(message),
+ m_generic(generic)
+ {}
+};
+typedef std::vector<MessageStackItem> ErrorMessageStack;
+
+/*
+ * Build the error message from the svn error into buffer. This
+ * method iterates through all the chained errors
+ *
+ * @param err the subversion error
+ * @param buffer the buffer where the formated error message will
+ * be stored
+ * @return An array of error codes and messages
+ */
+ErrorMessageStack assemble_error_message(
+ svn_error_t *err, std::string &result)
+{
+ // buffer for a single error message
+ char errbuf[1024];
+ apr_status_t parent_apr_err = 0;
+ ErrorMessageStack message_stack;
+
+ /* Pretty-print the error */
+ /* Note: we can also log errors here someday. */
+
+ for (int depth = 0; err;
+ ++depth, parent_apr_err = err->apr_err, err = err->child)
+ {
+ /* When we're recursing, don't repeat the top-level message if its
+ * the same as before. */
+ if ((depth == 0 || err->apr_err != parent_apr_err)
+ && err->apr_err != SVN_ERR_JAVAHL_WRAPPED)
+ {
+ const char *message;
+ /* Is this a Subversion-specific error code? */
+ if ((err->apr_err > APR_OS_START_USEERR)
+ && (err->apr_err <= APR_OS_START_CANONERR))
+ message = svn_strerror(err->apr_err, errbuf, sizeof(errbuf));
+ /* Otherwise, this must be an APR error code. */
+ else
+ {
+ /* Messages coming from apr_strerror are in the native
+ encoding, it's a good idea to convert them to UTF-8. */
+ apr_strerror(err->apr_err, errbuf, sizeof(errbuf));
+ svn_error_t* utf8_err =
+ svn_utf_cstring_to_utf8(&message, errbuf, err->pool);
+ if (utf8_err)
+ {
+ /* Use fuzzy transliteration instead. */
+ svn_error_clear(utf8_err);
+ message = svn_utf_cstring_from_utf8_fuzzy(errbuf, err->pool);
+ }
+ }
+
+ message_stack.push_back(
+ MessageStackItem(err->apr_err, message, true));
+ }
+ if (err->message)
+ {
+ message_stack.push_back(
+ MessageStackItem(err->apr_err, err->message));
+ }
+ }
+
+ for (ErrorMessageStack::const_iterator it = message_stack.begin();
+ it != message_stack.end(); ++it)
+ {
+ if (!it->m_generic)
+ result += "svn: ";
+ result += it->m_message;
+ result += '\n';
+ }
+ return message_stack;
+}
+
+jobject construct_Jmessage_stack(const ErrorMessageStack& message_stack)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jclass list_clazz = env->FindClass("java/util/ArrayList");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jmethodID mid = env->GetMethodID(list_clazz, "<init>", "(I)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jmethodID add_mid = env->GetMethodID(list_clazz, "add",
+ "(Ljava/lang/Object;)Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jobject jlist = env->NewObject(list_clazz, mid, jint(message_stack.size()));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ClientException$ErrorMessage"));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ mid = env->GetMethodID(clazz, "<init>",
+ "(ILjava/lang/String;Z)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ for (ErrorMessageStack::const_iterator it = message_stack.begin();
+ it != message_stack.end(); ++it)
+ {
+ jobject jmessage = JNIUtil::makeJString(it->m_message.c_str());
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ jobject jitem = env->NewObject(clazz, mid,
+ jint(it->m_code), jmessage,
+ jboolean(it->m_generic));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ env->CallBooleanMethod(jlist, add_mid, jitem);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->DeleteLocalRef(jmessage);
+ env->DeleteLocalRef(jitem);
+ }
+ return env->PopLocalFrame(jlist);
+}
+} // anonymous namespace
+
+std::string JNIUtil::makeSVNErrorMessage(svn_error_t *err,
+ jstring *jerror_message,
+ jobject *jmessage_stack)
+{
+ if (jerror_message)
+ *jerror_message = NULL;
+ if (jmessage_stack)
+ *jmessage_stack = NULL;
+
+ std::string buffer;
+ err = svn_error_purge_tracing(err);
+ if (err == NULL || err->apr_err == 0
+ || !(jerror_message || jmessage_stack))
+ return buffer;
+
+ ErrorMessageStack message_stack = assemble_error_message(err, buffer);
+ if (jerror_message)
+ *jerror_message = makeJString(buffer.c_str());
+ if (jmessage_stack)
+ *jmessage_stack = construct_Jmessage_stack(message_stack);
+ return buffer;
+}
+
+jthrowable JNIUtil::wrappedCreateClientException(svn_error_t *err, jthrowable jcause)
+{
+ jstring jmessage;
+ jobject jstack;
+ std::string msg = makeSVNErrorMessage(err, &jmessage, &jstack);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
const char *source = NULL;
#ifdef SVN_DEBUG
#ifndef SVN_ERR__TRACING
@@ -436,6 +592,9 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
#endif
#endif
+ if (!jcause)
+ jcause = JNIUtil::unwrapJavaException(err);
+
// Much of the following is stolen from throwNativeException(). As much as
// we'd like to call that function, we need to do some manual stack
// unrolling, so it isn't feasible.
@@ -445,11 +604,11 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
- return;
+ return NULL;
- jclass clazz = env->FindClass(JAVA_PACKAGE "/ClientException");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ClientException"));
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
if (getLogLevel() >= exceptionLog)
{
@@ -463,23 +622,24 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
g_logStream << std::endl;
}
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
- jstring jmessage = makeJString(msg.c_str());
- if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
jstring jsource = makeJString(source);
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
jmethodID mid = env->GetMethodID(clazz, "<init>",
- "(Ljava/lang/String;Ljava/lang/String;I)V");
+ "(Ljava/lang/String;"
+ "Ljava/lang/Throwable;"
+ "Ljava/lang/String;I"
+ "Ljava/util/List;)V");
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
- jobject nativeException = env->NewObject(clazz, mid, jmessage, jsource,
- static_cast<jint>(err->apr_err));
+ POP_AND_RETURN_NULL;
+ jobject nativeException = env->NewObject(clazz, mid, jmessage, jcause,
+ jsource, jint(err->apr_err),
+ jstack);
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
#ifdef SVN_ERR__TRACING
// Add all the C error stack trace information to the Java Exception
@@ -491,7 +651,7 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
mid_gst = env->GetMethodID(clazz, "getStackTrace",
"()[Ljava/lang/StackTraceElement;");
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
}
Array stackTraceArray((jobjectArray) env->CallObjectMethod(nativeException,
mid_gst));
@@ -510,18 +670,18 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
jclass stClazz = env->FindClass("java/lang/StackTraceElement");
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
const jsize stSize = static_cast<jsize>(newStackTrace.size());
- if (stSize != newStackTrace.size())
+ if (stSize < 0 || stSize != newStackTrace.size())
{
env->ThrowNew(env->FindClass("java.lang.ArithmeticException"),
"Overflow converting C size_t to JNI jsize");
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
}
jobjectArray jStackTrace = env->NewObjectArray(stSize, stClazz, NULL);
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
int i = 0;
for (std::vector<jobject>::const_iterator it = newStackTrace.begin();
@@ -538,25 +698,34 @@ void JNIUtil::wrappedHandleSVNError(svn_error_t *err)
mid_sst = env->GetMethodID(clazz, "setStackTrace",
"([Ljava/lang/StackTraceElement;)V");
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
}
env->CallVoidMethod(nativeException, mid_sst, jStackTrace);
if (isJavaExceptionThrown())
- POP_AND_RETURN_NOTHING();
+ POP_AND_RETURN_NULL;
#endif
- env->Throw(static_cast<jthrowable>(env->PopLocalFrame(nativeException)));
+ return static_cast<jthrowable>(env->PopLocalFrame(nativeException));
}
-void JNIUtil::handleSVNError(svn_error_t *err)
+jthrowable JNIUtil::createClientException(svn_error_t *err, jthrowable jcause)
{
+ jthrowable jexc = NULL;
try {
- wrappedHandleSVNError(err);
+ jexc = wrappedCreateClientException(err, jcause);
} catch (...) {
svn_error_clear(err);
throw;
}
svn_error_clear(err);
+ return jexc;
+}
+
+void JNIUtil::handleSVNError(svn_error_t *err, jthrowable jcause)
+{
+ jthrowable jexc = createClientException(err, jcause);
+ if (jexc)
+ getEnv()->Throw(jexc);
}
void JNIUtil::putFinalizedClient(SVNBase *object)
@@ -578,120 +747,82 @@ void JNIUtil::enqueueForDeletion(SVNBase *object)
*/
void JNIUtil::handleAPRError(int error, const char *op)
{
- char *buffer = getFormatBuffer();
- if (buffer == NULL)
- return;
+ char buffer[2048];
- apr_snprintf(buffer, formatBufferSize,
+ apr_snprintf(buffer, sizeof(buffer),
_("an error occurred in function %s with return value %d"),
op, error);
throwError(buffer);
}
-/**
- * Return if an exception has been detected.
- * @return a exception has been detected
- */
-bool JNIUtil::isExceptionThrown()
+namespace {
+const char* known_exception_to_cstring(apr_pool_t* pool)
{
- // During init -> look in the global member.
- if (g_inInit)
- return g_initException;
-
- // Look in the thread local storage.
- JNIThreadData *data = JNIThreadData::getThreadData();
- return data == NULL || data->m_exceptionThrown;
-}
+ JNIEnv *env = JNIUtil::getEnv();
+ jthrowable t = env->ExceptionOccurred();
+ jclass cls = env->GetObjectClass(t);
-/**
- * Store the JNI environment for this request in the thread local
- * storage.
- * @param env the JNI environment
- */
-void JNIUtil::setEnv(JNIEnv *env)
-{
- JNIThreadData::pushNewThreadData();
- JNIThreadData *data = JNIThreadData::getThreadData();
- data->m_env = env;
- data->m_exceptionThrown = false;
-}
+ jstring jclass_name;
+ {
+ jmethodID mid = env->GetMethodID(cls, "getClass", "()Ljava/lang/Class;");
+ jobject clsobj = env->CallObjectMethod(t, mid);
+ jclass basecls = env->GetObjectClass(clsobj);
+ mid = env->GetMethodID(basecls, "getName", "()Ljava/lang/String;");
+ jclass_name = (jstring) env->CallObjectMethod(clsobj, mid);
+ }
-/**
- * Return the JNI environment to use
- * @return the JNI environment
- */
-JNIEnv *JNIUtil::getEnv()
-{
- // During init -> look into the global variable.
- if (g_inInit)
- return g_initEnv;
+ jstring jmessage;
+ {
+ jmethodID mid = env->GetMethodID(cls, "getMessage",
+ "()Ljava/lang/String;");
+ jmessage = (jstring) env->CallObjectMethod(t, mid);
+ }
- // Look in the thread local storage.
- JNIThreadData *data = JNIThreadData::getThreadData();
- return data->m_env;
+ JNIStringHolder class_name(jclass_name);
+ if (jmessage)
+ {
+ JNIStringHolder message(jmessage);
+ return apr_pstrcat(pool, class_name.c_str(), ": ", message.c_str(), NULL);
+ }
+ else
+ return class_name.pstrdup(pool);
+ // ### Conditionally add t.printStackTrace() to msg?
}
-/**
- * Check if a Java exception has been thrown.
- * @return is a Java exception has been thrown
- */
-bool JNIUtil::isJavaExceptionThrown()
+const char* exception_to_cstring(apr_pool_t* pool)
{
- JNIEnv *env = getEnv();
- if (env->ExceptionCheck())
+ const char *msg;
+ if (JNIUtil::getEnv()->ExceptionCheck())
{
- // Retrieving the exception removes it so we rethrow it here.
- jthrowable exp = env->ExceptionOccurred();
- env->ExceptionDescribe();
- env->Throw(exp);
- env->DeleteLocalRef(exp);
- setExceptionThrown();
- return true;
+ msg = known_exception_to_cstring(pool);
}
- return false;
+ else
+ {
+ msg = NULL;
+ }
+ return msg;
}
+} // anonymous namespace
const char *
JNIUtil::thrownExceptionToCString(SVN::Pool &in_pool)
{
- const char *msg = NULL;
- JNIEnv *env = getEnv();
- apr_pool_t *pool = in_pool.getPool();
- if (env->ExceptionCheck())
- {
- jthrowable t = env->ExceptionOccurred();
- jclass cls = env->GetObjectClass(t);
-
- jstring jclass_name;
- {
- jmethodID mid = env->GetMethodID(cls, "getClass", "()Ljava/lang/Class;");
- jobject clsobj = env->CallObjectMethod(t, mid);
- jclass basecls = env->GetObjectClass(clsobj);
- mid = env->GetMethodID(basecls, "getName", "()Ljava/lang/String;");
- jclass_name = (jstring) env->CallObjectMethod(clsobj, mid);
- }
-
- jstring jmessage;
- {
- jmethodID mid = env->GetMethodID(cls, "getMessage",
- "()Ljava/lang/String;");
- jmessage = (jstring) env->CallObjectMethod(t, mid);
- }
+ return exception_to_cstring(in_pool.getPool());
+}
- JNIStringHolder class_name(jclass_name);
- if (jmessage)
- {
- JNIStringHolder message(jmessage);
- msg = apr_pstrcat(pool,
- static_cast<const char*>(class_name), ": ",
- static_cast<const char*>(message), NULL);
- }
- else
- msg = class_name.pstrdup(pool);
- // ### Conditionally add t.printStackTrace() to msg?
- }
- return msg;
+svn_error_t*
+JNIUtil::checkJavaException(apr_status_t errorcode)
+{
+ if (!getEnv()->ExceptionCheck())
+ return SVN_NO_ERROR;
+ svn_error_t* err = svn_error_create(errorcode, NULL, NULL);
+ const char* const msg = known_exception_to_cstring(err->pool);
+ if (msg)
+ err->message = apr_psprintf(err->pool, _("Java exception: %s"), msg);
+ else
+ err->message = _("Java exception");
+ return err;
}
/**
@@ -710,25 +841,6 @@ jstring JNIUtil::makeJString(const char *txt)
return env->NewStringUTF(txt);
}
-void
-JNIUtil::setExceptionThrown(bool flag)
-{
- if (g_inInit)
- {
- // During global initialization, store any errors that occur
- // in a global variable (since thread-local storage may not
- // yet be available).
- g_initException = flag;
- }
- else
- {
- // When global initialization is complete, thread-local
- // storage should be available, so store the error there.
- JNIThreadData *data = JNIThreadData::getThreadData();
- data->m_exceptionThrown = flag;
- }
-}
-
/**
* Initialite the log file.
* @param level the log level
@@ -752,23 +864,6 @@ void JNIUtil::initLogFile(int level, jstring path)
}
/**
- * Returns a buffer to format error messages.
- * @return a buffer for formating error messages
- */
-char *JNIUtil::getFormatBuffer()
-{
- if (g_inInit) // during init -> use the global buffer
- return g_initFormatBuffer;
-
- // use the buffer in the thread local storage
- JNIThreadData *data = JNIThreadData::getThreadData();
- if (data == NULL) // if that does not exists -> use the global buffer
- return g_initFormatBuffer;
-
- return data->m_formatBuffer;
-}
-
-/**
* Returns the current log level.
* @return the log level
*/
@@ -819,6 +914,31 @@ jobject JNIUtil::createDate(apr_time_t time)
return ret;
}
+apr_time_t
+JNIUtil::getDate(jobject jdate)
+{
+ JNIEnv *env = getEnv();
+ jclass clazz = env->FindClass("java/util/Date");
+ if (isJavaExceptionThrown())
+ return 0;
+
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ mid = env->GetMethodID(clazz, "getTime", "()J");
+ if (isJavaExceptionThrown())
+ return 0;
+ }
+
+ jlong jmillis = env->CallLongMethod(jdate, mid);
+ if (isJavaExceptionThrown())
+ return 0;
+
+ env->DeleteLocalRef(clazz);
+
+ return jmillis * 1000;
+}
+
/**
* Create a Java byte array from an array of characters.
* @param data the character array
@@ -826,11 +946,9 @@ jobject JNIUtil::createDate(apr_time_t time)
*/
jbyteArray JNIUtil::makeJByteArray(const void *data, int length)
{
- if (data == NULL)
- {
- // a NULL will create no Java array
- return NULL;
- }
+ // a NULL will create no Java array
+ if (!data)
+ return NULL;
JNIEnv *env = getEnv();
@@ -861,62 +979,11 @@ jbyteArray JNIUtil::makeJByteArray(const void *data, int length)
*/
jbyteArray JNIUtil::makeJByteArray(const svn_string_t *str)
{
- return JNIUtil::makeJByteArray(str->data, static_cast<int>(str->len));
-}
-
-/**
- * Build the error message from the svn error into buffer. This
- * method calls itselft recursively for all the chained errors
- *
- * @param err the subversion error
- * @param depth the depth of the call, used for formating
- * @param parent_apr_err the apr of the previous level, used for formating
- * @param buffer the buffer where the formated error message will
- * be stored
- */
-void JNIUtil::assembleErrorMessage(svn_error_t *err, int depth,
- apr_status_t parent_apr_err,
- std::string &buffer)
-{
- // buffer for a single error message
- char errbuf[256];
-
- /* Pretty-print the error */
- /* Note: we can also log errors here someday. */
-
- /* When we're recursing, don't repeat the top-level message if its
- * the same as before. */
- if (depth == 0 || err->apr_err != parent_apr_err)
- {
- /* Is this a Subversion-specific error code? */
- if ((err->apr_err > APR_OS_START_USEERR)
- && (err->apr_err <= APR_OS_START_CANONERR))
- buffer.append(svn_strerror(err->apr_err, errbuf, sizeof(errbuf)));
- /* Otherwise, this must be an APR error code. */
- else
- {
- /* Messages coming from apr_strerror are in the native
- encoding, it's a good idea to convert them to UTF-8. */
- const char* utf8_message;
- apr_strerror(err->apr_err, errbuf, sizeof(errbuf));
- svn_error_t* utf8_err = svn_utf_cstring_to_utf8(
- &utf8_message, errbuf, err->pool);
- if (utf8_err)
- {
- /* Use fuzzy transliteration instead. */
- svn_error_clear(utf8_err);
- utf8_message = svn_utf_cstring_from_utf8_fuzzy(errbuf, err->pool);
- }
- buffer.append(utf8_message);
- }
- buffer.append("\n");
- }
- if (err->message)
- buffer.append(_("svn: ")).append(err->message).append("\n");
-
- if (err->child)
- assembleErrorMessage(err->child, depth + 1, err->apr_err, buffer);
+ // a NULL will create no Java array
+ if (!str)
+ return NULL;
+ return JNIUtil::makeJByteArray(str->data, static_cast<int>(str->len));
}
/**
@@ -936,8 +1003,6 @@ void JNIUtil::throwNullPointerException(const char *message)
return;
env->ThrowNew(clazz, message);
- setExceptionThrown();
- env->DeleteLocalRef(clazz);
}
svn_error_t *JNIUtil::preprocessPath(const char *&path, apr_pool_t *pool)
@@ -996,3 +1061,91 @@ svn_error_t *JNIUtil::preprocessPath(const char *&path, apr_pool_t *pool)
return NULL;
}
+
+/* Tag to use on the apr_pool_t to store a WrappedException reference */
+static const char *WrapExceptionTag = "org.apache.subversion.JavaHL.svnerror";
+
+class WrappedException
+{
+ JNIEnv *m_env;
+ jthrowable m_exception;
+#ifdef SVN_DEBUG
+ bool m_fetched;
+#endif
+public:
+ WrappedException(JNIEnv *env)
+ {
+ m_env = env;
+
+ // Fetch exception inside local frame
+ jthrowable exceptionObj = env->ExceptionOccurred();
+
+ // Now clear exception status
+ env->ExceptionClear();
+
+ // As adding a reference in exception state fails
+ m_exception = static_cast<jthrowable>(env->NewGlobalRef(exceptionObj));
+
+#ifdef SVN_DEBUG
+ m_fetched = false;
+#endif
+ }
+
+ static jthrowable get_exception(apr_pool_t *pool)
+ {
+ void *data;
+ if (! apr_pool_userdata_get(&data, WrapExceptionTag, pool))
+ {
+ WrappedException *we = reinterpret_cast<WrappedException *>(data);
+
+ if (we)
+ {
+#ifdef SVN_DEBUG
+ we->m_fetched = TRUE;
+#endif
+ // Create reference in local frame, as the pool will be cleared
+ return static_cast<jthrowable>(
+ we->m_env->NewLocalRef(we->m_exception));
+ }
+ }
+ return NULL;
+ }
+
+private:
+ ~WrappedException()
+ {
+#ifdef SVN_DEBUG
+ if (!m_fetched)
+ SVN_DBG(("Cleared svn_error_t * before Java exception was fetched"));
+#endif
+ m_env->DeleteGlobalRef(m_exception);
+ }
+public:
+ static apr_status_t cleanup(void *data)
+ {
+ WrappedException *we = reinterpret_cast<WrappedException *>(data);
+
+ delete we;
+ return APR_SUCCESS;
+ }
+};
+
+svn_error_t* JNIUtil::wrapJavaException()
+{
+ if (!isExceptionThrown())
+ return SVN_NO_ERROR;
+
+ svn_error_t *err = svn_error_create(SVN_ERR_JAVAHL_WRAPPED, NULL,
+ "Wrapped Java Exception");
+ apr_pool_userdata_set(new WrappedException(getEnv()), WrapExceptionTag,
+ WrappedException::cleanup, err->pool);
+ return err;
+}
+
+jthrowable JNIUtil::unwrapJavaException(const svn_error_t *err)
+{
+ if (!err)
+ return NULL;
+ return
+ WrappedException::get_exception(err->pool);
+}
diff --git a/subversion/bindings/javahl/native/JNIUtil.h b/subversion/bindings/javahl/native/JNIUtil.h
index d353984..e05d1ef 100644
--- a/subversion/bindings/javahl/native/JNIUtil.h
+++ b/subversion/bindings/javahl/native/JNIUtil.h
@@ -37,11 +37,29 @@ class SVNBase;
#include <fstream>
#include <apr_time.h>
#include <string>
+#include <vector>
+
struct svn_error_t;
+struct svn_string_t;
-#define JAVA_PACKAGE "org/apache/subversion/javahl"
+#include "svn_error.h"
+
+
+/**
+ * The name of the package in which the JavaHL classes are defined.
+ */
+#define JAVAHL_PACKAGE "org/apache/subversion/javahl"
+
+/**
+ * Construct a JavaHL class name for JNIEnv::FindClass.
+ */
+#define JAVAHL_CLASS(name) JAVAHL_PACKAGE name
+
+/**
+ * Construct a JavaHL class parameter name for JNIEnv::GetMethodID & co.
+ */
+#define JAVAHL_ARG(name) "L" JAVAHL_PACKAGE name
-struct svn_string_t;
/**
* Class to hold a number of JNI related utility methods. No Objects
@@ -67,19 +85,24 @@ class JNIUtil
static jbyteArray makeJByteArray(const void *data, int length);
static jbyteArray makeJByteArray(const svn_string_t *str);
static jobject createDate(apr_time_t time);
+ static apr_time_t getDate(jobject jdate);
static void logMessage(const char *message);
static int getLogLevel();
- static char *getFormatBuffer();
static void initLogFile(int level, jstring path);
static jstring makeJString(const char *txt);
- static bool isJavaExceptionThrown();
static JNIEnv *getEnv();
- static void setEnv(JNIEnv *);
/**
* @return Whether any Throwable has been raised.
*/
- static bool isExceptionThrown();
+ static bool isExceptionThrown() { return isJavaExceptionThrown(); }
+ static bool isJavaExceptionThrown()
+ {
+ return getEnv()->ExceptionCheck();
+ }
+
+ static svn_error_t *wrapJavaException();
+ static jthrowable unwrapJavaException(const svn_error_t *err);
static void handleAPRError(int error, const char *op);
@@ -107,12 +130,27 @@ class JNIUtil
static const char *thrownExceptionToCString(SVN::Pool &in_pool);
/**
+ * Check if a Java exception was thrown and convert it to a
+ * Subversion error, using @a errorcode as the generic error code.
+ */
+ static svn_error_t* checkJavaException(apr_status_t errorcode);
+
+ /**
+ * Create a Java exception corresponding to err, and run
+ * svn_error_clear() on err.
+ */
+ static jthrowable createClientException(svn_error_t *err,
+ jthrowable jcause = NULL);
+
+ /**
* Throw a Java exception corresponding to err, and run
* svn_error_clear() on err.
*/
- static void handleSVNError(svn_error_t *err);
+ static void handleSVNError(svn_error_t *err, jthrowable jcause = NULL);
- static jstring makeSVNErrorMessage(svn_error_t *err);
+ static std::string makeSVNErrorMessage(svn_error_t *err,
+ jstring *jerror_message,
+ jobject *jmessage_stack);
/**
* Create and throw a java.lang.Throwable instance.
@@ -130,28 +168,27 @@ class JNIUtil
*/
static void throwError(const char *message)
{
- raiseThrowable(JAVA_PACKAGE"/JNIError", message);
+ raiseThrowable(JAVAHL_CLASS("/JNIError"), message);
}
static apr_pool_t *getPool();
- static bool JNIGlobalInit(JNIEnv *env);
static bool JNIInit(JNIEnv *env);
static bool initializeJNIRuntime();
- enum { formatBufferSize = 2048 };
enum { noLog, errorLog, exceptionLog, entryLog } LogLevel;
+ /**
+ * Mutex that secures the global configuration object.
+ */
+ static JNIMutex *g_configMutex;
+
private:
- static void wrappedHandleSVNError(svn_error_t *err);
- static void assembleErrorMessage(svn_error_t *err, int depth,
- apr_status_t parent_apr_err,
- std::string &buffer);
+ friend bool initialize_jni_util(JNIEnv *env);
+ static bool JNIGlobalInit(JNIEnv *env);
+
+ static jthrowable wrappedCreateClientException(svn_error_t *err,
+ jthrowable jcause);
static void putErrorsInTrace(svn_error_t *err,
std::vector<jobject> &stackTrace);
- /**
- * Set the appropriate global or thread-local flag that an exception
- * has been thrown to @a flag.
- */
- static void setExceptionThrown(bool flag = true);
/**
* The log level of this module.
@@ -185,22 +222,6 @@ class JNIUtil
static bool g_initException;
/**
- * Flag, that one thread is in the init code. Cannot use mutex
- * here since apr is not initialized yet.
- */
- static bool g_inInit;
-
- /**
- * The JNI environment used during initialization.
- */
- static JNIEnv *g_initEnv;
-
- /**
- * Fuffer the format error messages during initialization.
- */
- static char g_initFormatBuffer[formatBufferSize];
-
- /**
* The stream to write log messages to.
*/
static std::ofstream g_logStream;
@@ -270,6 +291,16 @@ class JNIUtil
} \
while (0)
+#define POP_AND_RETURN_EXCEPTION_AS_SVNERROR() \
+ do \
+ { \
+ svn_error_t *svn__err_for_exception = JNIUtil::wrapJavaException(); \
+ \
+ env->PopLocalFrame(NULL); \
+ return svn__err_for_exception; \
+ } \
+ while (0)
+
/**
* A useful macro.
@@ -284,4 +315,19 @@ class JNIUtil
} \
} while (0)
+#define SVN_JNI_CATCH(statement, errorcode) \
+ do { \
+ do { statement; } while(0); \
+ SVN_ERR(JNIUtil::checkJavaException((errorcode))); \
+ } while(0)
+
+#define SVN_JNI_CATCH_VOID(statement) \
+ do { \
+ do { statement; } while(0); \
+ if (JNIUtil::getEnv()->ExceptionCheck()) { \
+ JNIUtil::getEnv()->ExceptionClear(); \
+ return; \
+ } \
+ } while(0)
+
#endif // JNIUTIL_H
diff --git a/subversion/bindings/javahl/native/ListCallback.cpp b/subversion/bindings/javahl/native/ListCallback.cpp
index 9759ff6..1cd089d 100644
--- a/subversion/bindings/javahl/native/ListCallback.cpp
+++ b/subversion/bindings/javahl/native/ListCallback.cpp
@@ -87,13 +87,13 @@ ListCallback::doList(const char *path,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ListCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ListCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "doEntry",
- "(L"JAVA_PACKAGE"/types/DirEntry;"
- "L"JAVA_PACKAGE"/types/Lock;)V");
+ "(" JAVAHL_ARG("/types/DirEntry;")
+ JAVAHL_ARG("/types/Lock;") ")V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -113,10 +113,8 @@ ListCallback::doList(const char *path,
// call the Java method
env->CallVoidMethod(m_callback, mid, jdirentry, jlock);
- // No need to check for exception here, because we'll just return anyway
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
/**
@@ -126,53 +124,5 @@ jobject
ListCallback::createJavaDirEntry(const char *path, const char *absPath,
const svn_dirent_t *dirent)
{
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return SVN_NO_ERROR;
-
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/DirEntry");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- static jmethodID mid = 0;
- if (mid == 0)
- {
- mid = env->GetMethodID(clazz, "<init>",
- "(Ljava/lang/String;Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
- "JZJJLjava/lang/String;)V");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
- }
-
- jstring jPath = JNIUtil::makeJString(path);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jstring jAbsPath = JNIUtil::makeJString(absPath);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jobject jNodeKind = EnumMapper::mapNodeKind(dirent->kind);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jlong jSize = dirent->size;
- jboolean jHasProps = (dirent->has_props? JNI_TRUE : JNI_FALSE);
- jlong jLastChangedRevision = dirent->created_rev;
- jlong jLastChanged = dirent->time;
- jstring jLastAuthor = JNIUtil::makeJString(dirent->last_author);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jobject ret = env->NewObject(clazz, mid, jPath, jAbsPath, jNodeKind,
- jSize, jHasProps, jLastChangedRevision,
- jLastChanged, jLastAuthor);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- return env->PopLocalFrame(ret);
+ return CreateJ::DirEntry(path, absPath, dirent);
}
diff --git a/subversion/bindings/javahl/native/LockTokenTable.cpp b/subversion/bindings/javahl/native/LockTokenTable.cpp
new file mode 100644
index 0000000..ebf50da
--- /dev/null
+++ b/subversion/bindings/javahl/native/LockTokenTable.cpp
@@ -0,0 +1,114 @@
+/**
+ * @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 LockTokenTable.cpp
+ * @brief Implementation of the class LockTokenTable
+ */
+
+#include "LockTokenTable.h"
+#include "JNIUtil.h"
+#include "JNIStringHolder.h"
+#include "Array.h"
+#include <apr_hash.h>
+
+LockTokenTable::~LockTokenTable()
+{
+ if (m_jlock_tokens)
+ JNIUtil::getEnv()->DeleteLocalRef(m_jlock_tokens);
+}
+
+apr_hash_t*
+LockTokenTable::hash(const SVN::Pool &pool, bool null_if_empty)
+{
+ if (m_lock_tokens.size() == 0 && null_if_empty)
+ return NULL;
+
+ apr_pool_t* result_pool = pool.getPool();
+ apr_hash_t* lock_table = apr_hash_make(result_pool);
+
+ for (lock_tokens_t::const_iterator it = m_lock_tokens.begin();
+ it != m_lock_tokens.end(); ++it)
+ {
+ const char *path = apr_pstrdup(result_pool, it->first.c_str());
+ const char *token = apr_pstrdup(result_pool, it->second.c_str());
+ apr_hash_set(lock_table, path, APR_HASH_KEY_STRING, token);
+ }
+
+ return lock_table;
+}
+
+LockTokenTable::LockTokenTable(jobject jlock_tokens)
+ : m_jlock_tokens(jlock_tokens)
+{
+
+ if (jlock_tokens != NULL)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jclass lock_cls = env->FindClass(JAVAHL_CLASS("/types/Lock"));
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ static jmethodID getPath_mid = 0;
+ if (0 == getPath_mid)
+ {
+ getPath_mid = env->GetMethodID(lock_cls, "getPath",
+ "()Ljava/lang/String;");
+ if (JNIUtil::isExceptionThrown())
+ return;
+ }
+
+ static jmethodID getToken_mid = 0;
+ if (0 == getToken_mid)
+ {
+ getToken_mid = env->GetMethodID(lock_cls, "getToken",
+ "()Ljava/lang/String;");
+ if (JNIUtil::isExceptionThrown())
+ return;
+ }
+
+ std::vector<jobject> locks = Array(jlock_tokens).vector();
+ for (std::vector<jobject>::const_iterator it = locks.begin();
+ it != locks.end(); ++it)
+ {
+ jobject jpath = env->CallObjectMethod(*it, getPath_mid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ jobject jtoken = env->CallObjectMethod(*it, getToken_mid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ JNIStringHolder path((jstring)jpath);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ JNIStringHolder token((jstring)jtoken);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ m_lock_tokens[std::string(static_cast<const char *>(path))] =
+ std::string(static_cast<const char *>(token));
+
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(jtoken);
+ }
+ }
+}
diff --git a/subversion/bindings/javahl/native/LockTokenTable.h b/subversion/bindings/javahl/native/LockTokenTable.h
new file mode 100644
index 0000000..af8b32a
--- /dev/null
+++ b/subversion/bindings/javahl/native/LockTokenTable.h
@@ -0,0 +1,50 @@
+/**
+ * @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 LockTokenTable.h
+ * @brief Interface of the class LockTokenTable
+ */
+
+#ifndef JAVAHL_LOCK_TOKEN_TABLE_H
+#define JAVAHL_LOCK_TOKEN_TABLE_H
+
+#include <jni.h>
+#include "Pool.h"
+
+struct apr_hash_t;
+
+#include <map>
+#include <string>
+
+class LockTokenTable
+{
+ private:
+ typedef std::map<std::string, std::string> lock_tokens_t;
+ lock_tokens_t m_lock_tokens;
+ jobject m_jlock_tokens;
+ public:
+ LockTokenTable(jobject jlock_tokens);
+ ~LockTokenTable();
+ apr_hash_t *hash(const SVN::Pool &pool, bool null_if_empty = true);
+};
+
+#endif // JAVAHL_LOCK_TOKEN_TABLE_H
diff --git a/subversion/bindings/javahl/native/LogMessageCallback.cpp b/subversion/bindings/javahl/native/LogMessageCallback.cpp
index 237aabf..ffda075 100644
--- a/subversion/bindings/javahl/native/LogMessageCallback.cpp
+++ b/subversion/bindings/javahl/native/LogMessageCallback.cpp
@@ -81,7 +81,7 @@ LogMessageCallback::singleMessage(svn_log_entry_t *log_entry, apr_pool_t *pool)
static jmethodID sm_mid = 0;
if (sm_mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/LogMessageCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/LogMessageCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
@@ -103,9 +103,9 @@ LogMessageCallback::singleMessage(svn_log_entry_t *log_entry, apr_pool_t *pool)
hi = apr_hash_next(hi))
{
const char *path =
- reinterpret_cast<const char *>(svn__apr_hash_index_key(hi));
+ reinterpret_cast<const char *>(apr_hash_this_key(hi));
svn_log_changed_path2_t *log_item =
- reinterpret_cast<svn_log_changed_path2_t *>(svn__apr_hash_index_val(hi));
+ reinterpret_cast<svn_log_changed_path2_t *>(apr_hash_this_val(hi));
jobject cp = CreateJ::ChangedPath(path, log_item);
@@ -117,7 +117,7 @@ LogMessageCallback::singleMessage(svn_log_entry_t *log_entry, apr_pool_t *pool)
jobject jrevprops = NULL;
if (log_entry->revprops != NULL && apr_hash_count(log_entry->revprops) > 0)
- jrevprops = CreateJ::PropertyMap(log_entry->revprops);
+ jrevprops = CreateJ::PropertyMap(log_entry->revprops, pool);
env->CallVoidMethod(m_callback,
sm_mid,
@@ -125,8 +125,6 @@ LogMessageCallback::singleMessage(svn_log_entry_t *log_entry, apr_pool_t *pool)
(jlong)log_entry->revision,
jrevprops,
(jboolean)log_entry->has_children);
- // No need to check for an exception here, because we return anyway.
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
diff --git a/subversion/bindings/javahl/native/MessageReceiver.cpp b/subversion/bindings/javahl/native/MessageReceiver.cpp
index 18f695d..330c527 100644
--- a/subversion/bindings/javahl/native/MessageReceiver.cpp
+++ b/subversion/bindings/javahl/native/MessageReceiver.cpp
@@ -58,7 +58,7 @@ void MessageReceiver::receiveMessage(const char *message)
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/ISVNAdmin$MessageReceiver");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ISVNAdmin$MessageReceiver"));
if (JNIUtil::isJavaExceptionThrown())
return;
diff --git a/subversion/bindings/javahl/native/NativeStream.cpp b/subversion/bindings/javahl/native/NativeStream.cpp
new file mode 100644
index 0000000..193c36f
--- /dev/null
+++ b/subversion/bindings/javahl/native/NativeStream.cpp
@@ -0,0 +1,381 @@
+/**
+ * @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
+ */
+
+#include "NativeStream.hpp"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_exception.hpp"
+
+#include "svn_private_config.h"
+
+namespace JavaHL {
+
+// Class JavaHL::NativeInputStream
+
+const char* const NativeInputStream::m_class_name =
+ JAVAHL_CLASS("/types/NativeInputStream");
+
+NativeInputStream::~NativeInputStream() {}
+
+void NativeInputStream::set_stream(svn_stream_t* stream)
+{
+ if (m_stream)
+ throw std::logic_error(_("Native input stream is already bound"));
+ m_stream = stream;
+}
+
+NativeInputStream*
+NativeInputStream::get_self_unsafe(::Java::Env env, jobject jthis)
+{
+ jfieldID fid_cppaddr = NULL;
+ const jlong cppaddr =
+ findCppAddrForJObject(jthis, &fid_cppaddr, m_class_name);
+ return reinterpret_cast<NativeInputStream*>(cppaddr);
+}
+
+NativeInputStream*
+NativeInputStream::get_self(::Java::Env env, jobject jthis)
+{
+ NativeInputStream* self = get_self_unsafe(env, jthis);
+ if (!self)
+ ::Java::NullPointerException(env).raise(_("this [C++]"));
+ return self;
+}
+
+void NativeInputStream::close(::Java::Env env, jobject jthis)
+{
+ SVN_JAVAHL_CHECK(env, svn_stream_close(m_stream));
+ dispose(jthis);
+}
+
+bool NativeInputStream::mark_supported(::Java::Env env) const
+{
+ return svn_stream_supports_mark(m_stream);
+}
+
+void NativeInputStream::mark(::Java::Env env)
+{
+ if (!svn_stream_supports_mark(m_stream))
+ return;
+ SVN_JAVAHL_CHECK(env, svn_stream_mark(m_stream, &m_mark, pool.getPool()));
+}
+
+void NativeInputStream::reset(::Java::Env env)
+{
+ if (!svn_stream_supports_mark(m_stream))
+ return;
+ if (m_mark)
+ SVN_JAVAHL_CHECK(env, svn_stream_seek(m_stream, m_mark));
+ else
+ ::Java::IOException(env).raise(_("Invalid seek on native stream"));
+ }
+
+jint NativeInputStream::read(::Java::Env env)
+{
+ apr_size_t len = 1;
+ char byte;
+ SVN_JAVAHL_CHECK(env, svn_stream_read_full(m_stream, &byte, &len));
+ if (len == 0)
+ return -1; // EOF
+ if (len == 1)
+ return jint(byte & 0xff);
+ ::Java::IOException(env).raise(_("Read from native stream failed"));
+ return -1;
+}
+
+jint NativeInputStream::read(::Java::Env env,
+ ::Java::ByteArray::MutableContents& dst,
+ jint offset, jint length)
+{
+ if (offset < 0 || length < 0 || offset + length > dst.length())
+ ::Java::IndexOutOfBoundsException(env).raise();
+ if (!dst.data())
+ ::Java::NullPointerException(env).raise();
+
+ apr_size_t len = length;
+ if (svn_stream_supports_partial_read(m_stream))
+ SVN_JAVAHL_CHECK(env, svn_stream_read2(m_stream,
+ dst.data() + offset, &len));
+ else
+ SVN_JAVAHL_CHECK(env, svn_stream_read_full(m_stream,
+ dst.data() + offset, &len));
+ if (len == 0)
+ return -1; // EOF
+ if (len <= length)
+ return jint(len);
+ ::Java::IOException(env).raise(_("Read from native stream failed"));
+ return -1;
+}
+
+jlong NativeInputStream::skip(::Java::Env env, jlong count)
+{
+ const apr_size_t len = count;
+ SVN_JAVAHL_CHECK(env, svn_stream_skip(m_stream, len));
+ return count;
+}
+
+void NativeInputStream::dispose(jobject jthis)
+{
+ jfieldID fid_cppaddr = NULL;
+ SVNBase::dispose(jthis, &fid_cppaddr, m_class_name);
+}
+
+
+// Class JavaHL::NativeOutputStream
+
+const char* const NativeOutputStream::m_class_name =
+ JAVAHL_CLASS("/types/NativeOutputStream");
+
+NativeOutputStream::~NativeOutputStream() {}
+
+void NativeOutputStream::set_stream(svn_stream_t* stream)
+{
+ if (m_stream)
+ throw std::logic_error(_("Native output stream is already bound"));
+ m_stream = stream;
+}
+
+NativeOutputStream*
+NativeOutputStream::get_self_unsafe(::Java::Env env, jobject jthis)
+{
+ jfieldID fid_cppaddr = NULL;
+ const jlong cppaddr =
+ findCppAddrForJObject(jthis, &fid_cppaddr, m_class_name);
+ return reinterpret_cast<NativeOutputStream*>(cppaddr);
+}
+
+NativeOutputStream*
+NativeOutputStream::get_self(::Java::Env env, jobject jthis)
+{
+ NativeOutputStream* self = get_self_unsafe(env, jthis);
+ if (!self)
+ ::Java::NullPointerException(env).raise(_("this [C++]"));
+ return self;
+}
+
+void NativeOutputStream::close(::Java::Env env, jobject jthis)
+{
+ SVN_JAVAHL_CHECK(env, svn_stream_close(m_stream));
+ dispose(jthis);
+}
+
+void NativeOutputStream::write(::Java::Env env, jint byte)
+{
+ const char data = char(byte & 0xff);
+ apr_size_t len = 1;
+ SVN_JAVAHL_CHECK(env, svn_stream_write(m_stream, &data, &len));
+ if (len != 1)
+ ::Java::IOException(env).raise(_("Write to native stream failed"));
+}
+
+void NativeOutputStream::write(::Java::Env env,
+ const ::Java::ByteArray::Contents& src,
+ jint offset, jint length)
+{
+ if (offset < 0 || length < 0 || offset + length > src.length())
+ ::Java::IndexOutOfBoundsException(env).raise();
+ if (!src.data())
+ ::Java::NullPointerException(env).raise();
+
+ apr_size_t len = length;
+ SVN_JAVAHL_CHECK(env, svn_stream_write(m_stream, src.data() + offset, &len));
+ if (len != length)
+ ::Java::IOException(env).raise(_("Write to native stream failed"));
+}
+
+void NativeOutputStream::dispose(jobject jthis)
+{
+ jfieldID fid_cppaddr = NULL;
+ SVNBase::dispose(jthis, &fid_cppaddr, m_class_name);
+}
+
+} // namespace JavaHL
+
+
+// Class JavaHL::NativeInputStream native method implementation
+#include "../include/org_apache_subversion_javahl_types_NativeInputStream.h"
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_close(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, close)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ self->close(Java::Env(jenv), jthis);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_markSupported(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, markSupported)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ self->mark_supported(Java::Env(jenv));
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+ return false;
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_mark(
+ JNIEnv* jenv, jobject jthis, jint)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, mark)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ self->mark(Java::Env(jenv));
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_reset(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, reset)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ self->reset(Java::Env(jenv));
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_read__(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, read)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ return self->read(Java::Env(jenv));
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+ return 0;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_read___3BII(
+ JNIEnv* jenv, jobject jthis, jbyteArray jdst, jint joffset, jint jlength)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, read)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+
+ const Java::Env env(jenv);
+ Java::ByteArray dst(env, jdst);
+ Java::ByteArray::MutableContents dst_contents(dst);
+
+ return self->read(env, dst_contents, joffset, jlength);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_skip(
+ JNIEnv* jenv, jobject jthis, jlong jcount)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, skip)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeInputStream, self);
+ return self->skip(Java::Env(jenv), jcount);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_finalize(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, finalize)
+ {
+ JavaHL::NativeInputStream* native =
+ JavaHL::NativeInputStream::get_self_unsafe(Java::Env(jenv), jthis);
+ if (native != NULL)
+ native->finalize();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
+
+
+// Class JavaHL::NativeOutputStream native method implementation
+#include "../include/org_apache_subversion_javahl_types_NativeOutputStream.h"
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeOutputStream_close(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeOutputStream, close)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeOutputStream, self);
+ self->close(Java::Env(jenv), jthis);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeOutputStream_write__I(
+ JNIEnv* jenv, jobject jthis, jint byte)
+{
+ SVN_JAVAHL_JNI_TRY(NativeOutputStream, write)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeOutputStream, self);
+ self->write(Java::Env(jenv), byte);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeOutputStream_write___3BII(
+ JNIEnv* jenv, jobject jthis, jbyteArray jsrc, jint joffset, jint jlength)
+{
+ SVN_JAVAHL_JNI_TRY(NativeOutputStream, write)
+ {
+ SVN_JAVAHL_GET_BOUND_OBJECT(JavaHL::NativeOutputStream, self);
+
+ const Java::Env env(jenv);
+ const Java::ByteArray src(env, jsrc);
+
+ self->write(env, Java::ByteArray::Contents(src), joffset, jlength);
+ }
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeOutputStream_finalize(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeOutputStream, finalize)
+ {
+ JavaHL::NativeOutputStream* native =
+ JavaHL::NativeOutputStream::get_self_unsafe(Java::Env(jenv), jthis);
+ if (native != NULL)
+ native->finalize();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
diff --git a/subversion/bindings/javahl/native/NativeStream.hpp b/subversion/bindings/javahl/native/NativeStream.hpp
new file mode 100644
index 0000000..57fd137
--- /dev/null
+++ b/subversion/bindings/javahl/native/NativeStream.hpp
@@ -0,0 +1,211 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_NATIVE_STREAM_HPP
+#define SVN_JAVAHL_NATIVE_STREAM_HPP
+
+#include <stdexcept>
+
+#include "jniwrapper/jni_array.hpp"
+
+#include "SVNBase.h"
+
+#include "svn_io.h"
+
+namespace JavaHL {
+
+/**
+ * Object wrapper for @c org.apache.subversion.javahl.types.NativeInputStream.
+ *
+ * @since New in 1.9.
+ */
+class NativeInputStream : public ::SVNBase
+{
+public:
+ /**
+ * Construcs the native instance that will be wrapped in a Java obejct.
+ * If @a stream is @c NULL, you must call #set_stream before creating
+ * the Java wrapper.
+ */
+ explicit NativeInputStream(svn_stream_t* stream = NULL)
+ : m_stream(stream),
+ m_mark(NULL)
+ {}
+
+ ~NativeInputStream();
+
+ /**
+ * Returns a reference to the pool owned by this wrapped object.
+ */
+ const SVN::Pool& get_pool() const
+ {
+ return pool;
+ }
+
+ /**
+ * Sets the @a stream that this object will own.
+ * Do not call this function if a stream was passed to the constructor.
+ */
+ void set_stream(svn_stream_t* stream);
+
+ /**
+ * Create the Java object that binds to this native object.
+ */
+ jobject create_java_wrapper()
+ {
+ return createCppBoundObject(m_class_name);
+ }
+
+ /**
+ * Retrieve the address of the native object from the bound Java object.
+ */
+ static NativeInputStream* get_self(::Java::Env env, jobject jthis);
+
+ static NativeInputStream* get_self_unsafe(::Java::Env env, jobject jthis);
+
+public:
+ /**
+ * Implements @c InputStream.close().
+ * Also disposes the native object.
+ */
+ void close(::Java::Env env, jobject jthis);
+
+ /**
+ * Implements @c InputStream.markSupported().
+ */
+ bool mark_supported(::Java::Env env) const;
+
+ /**
+ * Implements @c InputStream.mark(int).
+ * The @c readlimit parameter of the Java method is ignored.
+ */
+ void mark(::Java::Env env);
+
+ /**
+ * Implements @c InputStream.reset().
+ */
+ void reset(::Java::Env env);
+
+ /**
+ * Implements @c InputStream.read().
+ */
+ jint read(::Java::Env env);
+
+ /**
+ * Implements @c InputStream.read(byte[],int,int).
+ */
+ jint read(::Java::Env env,
+ ::Java::ByteArray::MutableContents& dst,
+ jint offset, jint length);
+
+ /**
+ * Implements @c InputStream.skip(long).
+ */
+ jlong skip(::Java::Env env, jlong count);
+
+private:
+ virtual void dispose(jobject jthis);
+
+ static const char* const m_class_name;
+ svn_stream_t* m_stream;
+ svn_stream_mark_t* m_mark;
+};
+
+
+/**
+ * Object wrapper for @c org.apache.subversion.javahl.types.NativeOutputStream.
+ *
+ * @since New in 1.9.
+ */
+class NativeOutputStream : public ::SVNBase
+{
+public:
+ /**
+ * Construcs the native instance that will be wrapped in a Java obejct.
+ * If @a stream is @c NULL, you must call #set_stream before creating
+ * the Java wrapper.
+ */
+ explicit NativeOutputStream(svn_stream_t* stream = NULL)
+ : m_stream(stream)
+ {}
+
+ ~NativeOutputStream();
+
+ /**
+ * Returns a reference to the pool owned by this wrapped object.
+ */
+ const SVN::Pool& get_pool() const
+ {
+ return pool;
+ }
+
+ /**
+ * Sets the @a stream that this object will own.
+ * Do not call this function if a stream was passed to the constructor.
+ */
+ void set_stream(svn_stream_t* stream);
+
+ /**
+ * Create the Java object that binds to this native object.
+ */
+ jobject create_java_wrapper()
+ {
+ return createCppBoundObject(m_class_name);
+ }
+
+ /**
+ * Retrieve the address of the native object from the bound Java object.
+ */
+ static NativeOutputStream* get_self(::Java::Env env, jobject jthis);
+
+ static NativeOutputStream* get_self_unsafe(::Java::Env env, jobject jthis);
+
+public:
+ /**
+ * Implements @c OutputStream.close().
+ * Also disposes the native object.
+ */
+ void close(::Java::Env env, jobject jthis);
+
+ /**
+ * Implements @c OutputStream.write(int).
+ */
+ void write(::Java::Env env, jint byte);
+
+ /**
+ * Implements @c OutputStream.write(byte[],int,int).
+ */
+ void write(::Java::Env env,
+ const ::Java::ByteArray::Contents& src,
+ jint offset, jint length);
+
+private:
+ virtual void dispose(jobject jthis);
+
+ static const char* const m_class_name;
+ svn_stream_t* m_stream;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_NATIVE_STREAM_HPP
diff --git a/subversion/bindings/javahl/native/OperationContext.cpp b/subversion/bindings/javahl/native/OperationContext.cpp
new file mode 100644
index 0000000..b455c36
--- /dev/null
+++ b/subversion/bindings/javahl/native/OperationContext.cpp
@@ -0,0 +1,657 @@
+/**
+ * @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 OperationContext.cpp
+ * @brief Implementation of the class OperationContext
+ */
+
+#include <apr_file_io.h>
+
+#include "GlobalConfig.h"
+#include "OperationContext.h"
+#include "JNIUtil.h"
+#include "JNICriticalSection.h"
+
+#include "Prompter.h"
+#include "CreateJ.h"
+#include "EnumMapper.h"
+#include "CommitMessage.h"
+
+#include "svn_client.h"
+#include "private/svn_wc_private.h"
+#include "private/svn_dep_compat.h"
+#include "svn_private_config.h"
+
+OperationContext::OperationContext(SVN::Pool &pool)
+ : m_config(NULL),
+ m_prompter(NULL),
+ m_cancelOperation(0),
+ m_pool(&pool),
+ m_jctx(NULL),
+ m_jcfgcb(NULL),
+ m_jtunnelcb(NULL)
+{}
+
+void
+OperationContext::attachJavaObject(
+ jobject contextHolder, const char *contextClassType,
+ const char *contextFieldName, jfieldID * ctxFieldID)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ /* Grab a global reference to the Java object embedded in the parent
+ Java object. */
+ if ((*ctxFieldID) == 0)
+ {
+ jclass clazz = env->GetObjectClass(contextHolder);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ (*ctxFieldID) = env->GetFieldID(clazz, contextFieldName, contextClassType);
+ if (JNIUtil::isJavaExceptionThrown() || (*ctxFieldID) == 0)
+ return;
+
+ env->DeleteLocalRef(clazz);
+ }
+
+ jobject jctx = env->GetObjectField(contextHolder, (*ctxFieldID));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_jctx = env->NewGlobalRef(jctx);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ env->DeleteLocalRef(jctx);
+}
+
+OperationContext::~OperationContext()
+{
+ JNIEnv *env = JNIUtil::getEnv();
+ env->DeleteGlobalRef(m_jctx);
+ if (m_jcfgcb)
+ env->DeleteGlobalRef(m_jcfgcb);
+ if (m_jtunnelcb)
+ env->DeleteGlobalRef(m_jtunnelcb);
+}
+
+apr_hash_t *
+OperationContext::getConfigData()
+{
+ if(m_pool->getPool() == NULL)
+ {
+ JNIUtil::throwNullPointerException("pool is null");
+ }
+
+ if (m_config == NULL)
+ {
+ const char *configDir = m_configDir.c_str();
+ if (m_configDir.empty())
+ configDir = NULL;
+ SVN_JNI_ERR(
+ svn_config_get_config(&m_config, configDir, m_pool->getPool()), NULL);
+ notifyConfigLoad();
+ }
+
+ return m_config;
+}
+
+svn_auth_baton_t *
+OperationContext::getAuthBaton(SVN::Pool &in_pool)
+{
+ svn_auth_baton_t *ab;
+ apr_pool_t *pool = in_pool.getPool();
+
+ apr_hash_t * configData = getConfigData();
+
+ if (configData == NULL)
+ {
+ return NULL;
+ }
+
+ svn_config_t *config = static_cast<svn_config_t *>(apr_hash_get(configData,
+ SVN_CONFIG_CATEGORY_CONFIG, APR_HASH_KEY_STRING));
+
+ const bool use_native_store = GlobalConfig::useNativeCredentialsStore();
+
+ /* The whole list of registered providers */
+ apr_array_header_t *providers;
+ svn_auth_provider_object_t *provider;
+
+ if (use_native_store)
+ {
+ /* Populate the registered providers with the platform-specific providers */
+ SVN_JNI_ERR(
+ svn_auth_get_platform_specific_client_providers(
+ &providers, config, pool),
+ NULL);
+
+ /* Use the prompter (if available) to prompt for password and cert
+ * caching. */
+ svn_auth_plaintext_prompt_func_t plaintext_prompt_func;
+ void *plaintext_prompt_baton;
+ svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func;
+ void *plaintext_passphrase_prompt_baton;
+
+ if (m_prompter.get())
+ {
+ plaintext_prompt_func = Prompter::plaintext_prompt;
+ plaintext_prompt_baton = m_prompter.get();
+ plaintext_passphrase_prompt_func = Prompter::plaintext_passphrase_prompt;
+ plaintext_passphrase_prompt_baton = m_prompter.get();
+ }
+ else
+ {
+ plaintext_prompt_func = NULL;
+ plaintext_prompt_baton = NULL;
+ plaintext_passphrase_prompt_func = NULL;
+ plaintext_passphrase_prompt_baton = NULL;
+ }
+
+ /* The main disk-caching auth providers, for both
+ * 'username/password' creds and 'username' creds. */
+
+ svn_auth_get_simple_provider2(&provider, plaintext_prompt_func,
+ plaintext_prompt_baton, pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ svn_auth_get_username_provider(&provider, pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ svn_auth_get_ssl_server_trust_file_provider(&provider, pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+ svn_auth_get_ssl_client_cert_file_provider(&provider, pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+ svn_auth_get_ssl_client_cert_pw_file_provider2(
+ &provider,
+ plaintext_passphrase_prompt_func, plaintext_passphrase_prompt_baton,
+ pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+ }
+ else
+ {
+ // Not using hte native credentials store, start with an empty
+ // providers array.
+ providers = apr_array_make(pool, 0, sizeof(svn_auth_provider_object_t *));
+ }
+
+ if (m_prompter.get())
+ {
+ /* Two basic prompt providers: username/password, and just username.*/
+ provider = m_prompter->get_provider_simple(in_pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ provider = m_prompter->get_provider_username(in_pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ /* Three ssl prompt providers, for server-certs, client-certs,
+ * and client-cert-passphrases. */
+ provider = m_prompter->get_provider_server_ssl_trust(in_pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ provider = m_prompter->get_provider_client_ssl(in_pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ provider = m_prompter->get_provider_client_ssl_password(in_pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+ }
+
+ /* Build an authentication baton to give to libsvn_client. */
+ svn_auth_open(&ab, providers, pool);
+
+ /* Place any default --username or --password credentials into the
+ * auth_baton's run-time parameter hash. ### Same with --no-auth-cache? */
+ if (!m_userName.empty())
+ svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
+ apr_pstrdup(in_pool.getPool(), m_userName.c_str()));
+ if (!m_passWord.empty())
+ svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
+ apr_pstrdup(in_pool.getPool(), m_passWord.c_str()));
+ /* Store where to retrieve authentication data? */
+ if (!m_configDir.empty())
+ svn_auth_set_parameter(ab, SVN_AUTH_PARAM_CONFIG_DIR,
+ apr_pstrdup(in_pool.getPool(), m_configDir.c_str()));
+ return ab;
+}
+
+jobject OperationContext::getSelf() const
+{
+ return m_jctx;
+}
+
+void
+OperationContext::username(const char *pi_username)
+{
+ m_userName = (pi_username == NULL ? "" : pi_username);
+}
+
+void
+OperationContext::password(const char *pi_password)
+{
+ m_passWord = (pi_password == NULL ? "" : pi_password);
+}
+
+void
+OperationContext::setPrompt(Prompter::UniquePtr prompter)
+{
+ m_prompter = prompter;
+}
+
+void
+OperationContext::setConfigDirectory(const char *configDir)
+{
+ // A change to the config directory may necessitate creation of
+ // the config templates.
+ SVN::Pool requestPool;
+ SVN_JNI_ERR(svn_config_ensure(configDir, requestPool.getPool()), );
+
+ m_configDir = (configDir == NULL ? "" : configDir);
+
+ m_config = NULL;
+}
+
+const char *
+OperationContext::getConfigDirectory() const
+{
+ return (m_configDir.empty() ? NULL : m_configDir.c_str());
+}
+
+void OperationContext::setConfigEventHandler(jobject jcfgcb)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+ if (jcfgcb)
+ {
+ jcfgcb = env->NewGlobalRef(jcfgcb);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ if (m_jcfgcb)
+ env->DeleteGlobalRef(m_jcfgcb);
+ m_jcfgcb = jcfgcb;
+}
+
+jobject OperationContext::getConfigEventHandler() const
+{
+ return m_jcfgcb;
+}
+
+const char *
+OperationContext::getUsername() const
+{
+ return (m_userName.empty() ? NULL : m_userName.c_str());
+}
+
+const char *
+OperationContext::getPassword() const
+{
+ return (m_passWord.empty() ? NULL : m_passWord.c_str());
+}
+
+Prompter::UniquePtr OperationContext::clonePrompter() const
+{
+ if (m_prompter.get())
+ return m_prompter->clone();
+ return Prompter::UniquePtr(NULL);
+}
+
+void OperationContext::setTunnelCallback(jobject jtunnelcb)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+ if (jtunnelcb)
+ {
+ jtunnelcb = env->NewGlobalRef(jtunnelcb);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ if (m_jtunnelcb)
+ env->DeleteGlobalRef(m_jtunnelcb);
+ m_jtunnelcb = jtunnelcb;
+}
+
+jobject OperationContext::getTunnelCallback() const
+{
+ return m_jtunnelcb;
+}
+
+void
+OperationContext::cancelOperation()
+{
+ svn_atomic_set(&m_cancelOperation, 1);
+}
+
+void
+OperationContext::resetCancelRequest()
+{
+ svn_atomic_set(&m_cancelOperation, 0);
+}
+
+bool
+OperationContext::isCancelledOperation()
+{
+ return bool(svn_atomic_read(&m_cancelOperation));
+}
+
+svn_error_t *
+OperationContext::checkCancel(void *cancelBaton)
+{
+ OperationContext *that = static_cast<OperationContext *>(cancelBaton);
+ if (that->isCancelledOperation())
+ return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Operation cancelled"));
+ else if (JNIUtil::isJavaExceptionThrown())
+ return svn_error_create(SVN_ERR_CANCELLED, JNIUtil::wrapJavaException(),
+ _("Operation cancelled"));
+ else
+ return SVN_NO_ERROR;
+}
+
+void
+OperationContext::progress(apr_off_t progressVal, apr_off_t total, void *baton,
+ apr_pool_t *pool)
+{
+ jobject jctx = (jobject) baton;
+ if (!jctx)
+ return;
+
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ jclass clazz = env->GetObjectClass(jctx);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ mid = env->GetMethodID(clazz, "onProgress",
+ "(" JAVAHL_ARG("/ProgressEvent;") ")V");
+ if (JNIUtil::isJavaExceptionThrown() || mid == 0)
+ POP_AND_RETURN_NOTHING();
+ }
+
+ static jmethodID midCT = 0;
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/ProgressEvent"));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ if (midCT == 0)
+ {
+ midCT = env->GetMethodID(clazz, "<init>", "(JJ)V");
+ if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
+ POP_AND_RETURN_NOTHING();
+ }
+
+ // Call the Java method.
+ jobject jevent = env->NewObject(clazz, midCT, (jlong) progressVal,
+ (jlong) total);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ env->CallVoidMethod(jctx, mid, jevent);
+
+ POP_AND_RETURN_NOTHING();
+}
+
+const char *
+OperationContext::getClientName() const
+{
+ return "javahl";
+}
+
+svn_error_t *
+OperationContext::clientName(void *baton, const char **name, apr_pool_t *pool)
+{
+ OperationContext *that = (OperationContext *) baton;
+
+ *name = that->getClientName();
+
+ return SVN_NO_ERROR;
+}
+
+void
+OperationContext::notifyConfigLoad()
+{
+ if (!m_jcfgcb)
+ return;
+
+ JNIEnv *env = JNIUtil::getEnv();
+
+ static jmethodID onload_mid = 0;
+ if (0 == onload_mid)
+ {
+ jclass cls = env->FindClass(JAVAHL_CLASS("/callback/ConfigEvent"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ onload_mid = env->GetMethodID(cls, "onLoad",
+ "(" JAVAHL_ARG("/ISVNConfig;") ")V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jclass cfg_cls = env->FindClass(JAVAHL_CLASS("/util/ConfigImpl"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID ctor_mid = 0;
+ if (0 == ctor_mid)
+ {
+ ctor_mid = env->GetMethodID(cfg_cls, "<init>", "(J)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ static jmethodID dispose_mid = 0;
+ if (0 == dispose_mid)
+ {
+ dispose_mid = env->GetMethodID(cfg_cls, "dispose", "()V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject jcbimpl = env->NewObject(cfg_cls, ctor_mid,
+ reinterpret_cast<jlong>(this));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ env->CallVoidMethod(m_jcfgcb, onload_mid, jcbimpl);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ env->CallVoidMethod(jcbimpl, dispose_mid);
+ env->DeleteLocalRef(jcbimpl);
+}
+
+namespace {
+class TunnelContext
+{
+public:
+ explicit TunnelContext(apr_pool_t *pool)
+ : request_in(NULL),
+ request_out(NULL),
+ response_in(NULL),
+ response_out(NULL),
+ jclosecb(NULL)
+ {
+ status = apr_file_pipe_create_ex(&request_in, &request_out,
+ APR_FULL_BLOCK, pool);
+ if (!status)
+ status = apr_file_pipe_create_ex(&response_in, &response_out,
+ APR_FULL_BLOCK, pool);
+ }
+
+ ~TunnelContext()
+ {
+ apr_file_close(request_out);
+ apr_file_close(response_in);
+ }
+
+ apr_file_t *request_in;
+ apr_file_t *request_out;
+ apr_file_t *response_in;
+ apr_file_t *response_out;
+ apr_status_t status;
+ jobject jclosecb;
+};
+
+jobject create_Channel(const char *class_name, JNIEnv *env, apr_file_t *fd)
+{
+ jclass cls = env->FindClass(class_name);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ jmethodID ctor = env->GetMethodID(cls, "<init>", "(J)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ return env->NewObject(cls, ctor, reinterpret_cast<jlong>(fd));
+}
+
+jobject create_RequestChannel(JNIEnv *env, apr_file_t *fd)
+{
+ return create_Channel(JAVAHL_CLASS("/util/RequestChannel"), env, fd);
+}
+jobject create_ResponseChannel(JNIEnv *env, apr_file_t *fd)
+{
+ return create_Channel(JAVAHL_CLASS("/util/ResponseChannel"), env, fd);
+}
+} // anonymous namespace
+
+svn_boolean_t
+OperationContext::checkTunnel(void *tunnel_baton, const char *tunnel_name)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jstring jtunnel_name = JNIUtil::makeJString(tunnel_name);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ static jmethodID mid = 0;
+ if (0 == mid)
+ {
+ jclass cls = env->FindClass(JAVAHL_CLASS("/callback/TunnelAgent"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ mid = env->GetMethodID(cls, "checkTunnel",
+ "(Ljava/lang/String;)Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ }
+
+ jobject jtunnelcb = jobject(tunnel_baton);
+ jboolean check = env->CallBooleanMethod(jtunnelcb, mid, jtunnel_name);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ return svn_boolean_t(check);
+}
+
+svn_error_t *
+OperationContext::openTunnel(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)
+{
+ TunnelContext *tc = new TunnelContext(pool);
+ if (tc->status)
+ {
+ delete tc;
+ return svn_error_trace(
+ svn_error_wrap_apr(tc->status, _("Could not open tunnel streams")));
+ }
+
+ *close_func = closeTunnel;
+ *close_baton = tc;
+ *request = svn_stream_from_aprfile2(tc->request_out, FALSE, pool);
+ *response = svn_stream_from_aprfile2(tc->response_in, FALSE, pool);
+
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jobject jrequest = create_RequestChannel(env, tc->request_in);
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+
+ jobject jresponse = create_ResponseChannel(env, tc->response_out);
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+
+ jstring jtunnel_name = JNIUtil::makeJString(tunnel_name);
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+
+ jstring juser = JNIUtil::makeJString(user);
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+
+ jstring jhostname = JNIUtil::makeJString(hostname);
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+
+ static jmethodID mid = 0;
+ if (0 == mid)
+ {
+ jclass cls = env->FindClass(JAVAHL_CLASS("/callback/TunnelAgent"));
+ SVN_JNI_CATCH(, SVN_ERR_BASE);
+ SVN_JNI_CATCH(
+ mid = env->GetMethodID(
+ cls, "openTunnel",
+ "(Ljava/nio/channels/ReadableByteChannel;"
+ "Ljava/nio/channels/WritableByteChannel;"
+ "Ljava/lang/String;"
+ "Ljava/lang/String;"
+ "Ljava/lang/String;I)"
+ JAVAHL_ARG("/callback/TunnelAgent$CloseTunnelCallback;")),
+ SVN_ERR_BASE);
+ }
+
+ jobject jtunnelcb = jobject(tunnel_baton);
+ SVN_JNI_CATCH(
+ tc->jclosecb = env->CallObjectMethod(
+ jtunnelcb, mid, jrequest, jresponse,
+ jtunnel_name, juser, jhostname, jint(port)),
+ SVN_ERR_BASE);
+
+ return SVN_NO_ERROR;
+}
+
+void
+OperationContext::closeTunnel(void *tunnel_context, void *)
+{
+ TunnelContext* tc = static_cast<TunnelContext*>(tunnel_context);
+ jobject jclosecb = tc->jclosecb;
+ delete tc;
+
+ if (!jclosecb)
+ return;
+
+ JNIEnv *env = JNIUtil::getEnv();
+
+ static jmethodID mid = 0;
+ if (0 == mid)
+ {
+ jclass cls;
+ SVN_JNI_CATCH_VOID(
+ cls= env->FindClass(
+ JAVAHL_CLASS("/callback/TunnelAgent$CloseTunnelCallback")));
+ SVN_JNI_CATCH_VOID(mid = env->GetMethodID(cls, "closeTunnel", "()V"));
+ }
+ SVN_JNI_CATCH_VOID(env->CallVoidMethod(jclosecb, mid));
+}
diff --git a/subversion/bindings/javahl/native/OperationContext.h b/subversion/bindings/javahl/native/OperationContext.h
new file mode 100644
index 0000000..b0d82c2
--- /dev/null
+++ b/subversion/bindings/javahl/native/OperationContext.h
@@ -0,0 +1,128 @@
+/**
+ * @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 OperationContext.h
+ * @brief Interface of the class OperationContext
+ */
+
+#ifndef JAVAHL_OPERATION_CONTEXT_H
+#define JAVAHL_OPERATION_CONTEXT_H
+
+#include <string>
+#include <memory>
+
+#include "svn_types.h"
+#include "svn_client.h"
+#include "private/svn_atomic.h"
+
+#include <jni.h>
+#include "Pool.h"
+#include "JNIStringHolder.h"
+
+class Prompter;
+
+/**
+ * This class contains a Java objects implementing the interface RaSharedContext
+ */
+class OperationContext
+{
+ private:
+ std::string m_userName;
+ std::string m_passWord;
+ std::string m_configDir;
+
+ apr_hash_t * m_config;
+
+ std::auto_ptr<Prompter> m_prompter;
+ svn_atomic_t m_cancelOperation;
+
+ protected:
+ SVN::Pool *m_pool;
+
+ jobject m_jctx;
+ jobject m_jcfgcb;
+ jobject m_jtunnelcb;
+
+ static void progress(apr_off_t progressVal, apr_off_t total,
+ void *baton, apr_pool_t *pool);
+ void notifyConfigLoad();
+
+ static svn_boolean_t checkTunnel(
+ void *tunnel_baton, const char *tunnel_name);
+
+ static svn_error_t *openTunnel(
+ 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);
+
+ static void closeTunnel(
+ void *tunnel_context, void *tunnel_baton);
+
+ public:
+ OperationContext(SVN::Pool &pool);
+ void attachJavaObject(jobject contextHolder, const char *contextClassType, const char *contextFieldName, jfieldID * ctxFieldID);
+ virtual ~OperationContext();
+
+ static svn_error_t *checkCancel(void *cancelBaton);
+
+ virtual void username(const char *pi_username);
+ virtual void password(const char *pi_password);
+ virtual void setPrompt(std::auto_ptr<Prompter> prompter);
+ svn_auth_baton_t *getAuthBaton(SVN::Pool &in_pool);
+
+ void cancelOperation();
+ void resetCancelRequest();
+ virtual bool isCancelledOperation();
+ jobject getSelf() const;
+ const char *getConfigDirectory() const;
+ const char *getUsername() const;
+ const char *getPassword() const;
+ std::auto_ptr<Prompter> clonePrompter() const;
+
+ /**
+ * Set the configuration directory, taking the usual steps to
+ * ensure that Subversion's config file templates exist in the
+ * specified location.
+ */
+ void setConfigDirectory(const char *configDir);
+
+ /**
+ * Return configuration data for the context.
+ * Read it from config directory if necessary
+ */
+ apr_hash_t *getConfigData();
+
+ void setConfigEventHandler(jobject jcfgcb);
+ jobject getConfigEventHandler() const;
+
+ static svn_error_t * clientName(void *baton, const char **name, apr_pool_t *pool);
+ virtual const char * getClientName() const;
+
+ virtual void setTunnelCallback(jobject jtunnelcb);
+ jobject getTunnelCallback() const;
+};
+
+#endif // JAVAHL_OPERATION_CONTEXT_H
diff --git a/subversion/bindings/javahl/native/PatchCallback.cpp b/subversion/bindings/javahl/native/PatchCallback.cpp
index 0cff577..ac1b3d4 100644
--- a/subversion/bindings/javahl/native/PatchCallback.cpp
+++ b/subversion/bindings/javahl/native/PatchCallback.cpp
@@ -80,7 +80,7 @@ PatchCallback::singlePatch(svn_boolean_t *filtered,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/PatchCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/PatchCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
@@ -106,7 +106,7 @@ PatchCallback::singlePatch(svn_boolean_t *filtered,
jboolean jfiltered = env->CallBooleanMethod(m_callback, mid, jcanonPath,
jpatchAbsPath, jrejectAbsPath);
if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(SVN_NO_ERROR);
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
*filtered = (jfiltered ? TRUE : FALSE);
diff --git a/subversion/bindings/javahl/native/PatchCallback.h b/subversion/bindings/javahl/native/PatchCallback.h
index d10a309..61ec883 100644
--- a/subversion/bindings/javahl/native/PatchCallback.h
+++ b/subversion/bindings/javahl/native/PatchCallback.h
@@ -30,8 +30,6 @@
#include <jni.h>
#include "svn_client.h"
-struct info_entry;
-
/**
* This class holds a Java callback object, which will receive every line of
* the file for which the callback information is requested.
diff --git a/subversion/bindings/javahl/native/Path.cpp b/subversion/bindings/javahl/native/Path.cpp
index b9c69ea..c1a1fec 100644
--- a/subversion/bindings/javahl/native/Path.cpp
+++ b/subversion/bindings/javahl/native/Path.cpp
@@ -27,18 +27,24 @@
#include <jni.h>
#include "Path.h"
#include "svn_path.h"
+#include "svn_dirent_uri.h"
#include "JNIUtil.h"
+#include "JNIStringHolder.h"
#include "Pool.h"
+#include "svn_private_config.h"
/**
* Constructor
*
- * @see Path::Path(const std::string &)
+ * @see PathBase::PathBase(const std::string &)
* @param path Path string
*/
-Path::Path(const char *pi_path, SVN::Pool &in_pool)
+PathBase::PathBase(const char *pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool)
+ : m_error_occurred(NULL)
{
- init(pi_path, in_pool);
+ init(pi_path, initfunc, in_pool);
}
/**
@@ -48,19 +54,26 @@ Path::Path(const char *pi_path, SVN::Pool &in_pool)
*
* @param path Path string
*/
-Path::Path(const std::string &pi_path, SVN::Pool &in_pool)
+PathBase::PathBase(const std::string &pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool)
+ : m_error_occurred(NULL)
{
- init(pi_path.c_str(), in_pool);
+ init(pi_path.c_str(), initfunc, in_pool);
}
/**
- * Copy constructor
- *
- * @param path Path to be copied
+ * Constructor from a Java string.
*/
-Path::Path(const Path &pi_path, SVN::Pool &in_pool)
+PathBase::PathBase(jstring jpath,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool)
+ : m_error_occurred(NULL)
{
- init(pi_path.c_str(), in_pool);
+ JNIStringHolder path(jpath);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ init(path, initfunc, in_pool);
}
/**
@@ -69,17 +82,13 @@ Path::Path(const Path &pi_path, SVN::Pool &in_pool)
* @param path Path string
*/
void
-Path::init(const char *pi_path, SVN::Pool &in_pool)
+PathBase::init(const char *pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool)
{
- if (*pi_path == 0)
- {
- m_error_occurred = NULL;
- m_path = "";
- }
- else
+ if (pi_path && *pi_path)
{
- m_error_occurred = JNIUtil::preprocessPath(pi_path, in_pool.getPool());
-
+ m_error_occurred = initfunc(pi_path, in_pool);
m_path = pi_path;
}
}
@@ -88,7 +97,7 @@ Path::init(const char *pi_path, SVN::Pool &in_pool)
* @return Path string
*/
const std::string &
-Path::path() const
+PathBase::path() const
{
return m_path;
}
@@ -97,7 +106,7 @@ Path::path() const
* @return Path string as a C string
*/
const char *
-Path::c_str() const
+PathBase::c_str() const
{
return m_path.c_str();
}
@@ -105,8 +114,8 @@ Path::c_str() const
/**
* Assignment operator
*/
-Path&
-Path::operator=(const Path &pi_path)
+PathBase&
+PathBase::operator=(const PathBase &pi_path)
{
m_error_occurred = NULL;
m_path = pi_path.m_path;
@@ -114,12 +123,12 @@ Path::operator=(const Path &pi_path)
return *this;
}
- svn_error_t *Path::error_occurred() const
+svn_error_t *PathBase::error_occurred() const
{
return m_error_occurred;
}
-jboolean Path::isValid(const char *p)
+jboolean PathBase::isValid(const char *p)
{
if (p == NULL)
return JNI_FALSE;
@@ -136,3 +145,25 @@ jboolean Path::isValid(const char *p)
return JNI_FALSE;
}
}
+
+svn_error_t*
+Path::initfunc(const char*& path, SVN::Pool& pool)
+{
+ return JNIUtil::preprocessPath(path, pool.getPool());
+}
+
+svn_error_t*
+URL::initfunc(const char*& path, SVN::Pool& pool)
+{
+ if (svn_path_is_url(path))
+ return JNIUtil::preprocessPath(path, pool.getPool());
+ return svn_error_createf(SVN_ERR_BAD_URL, NULL,
+ _("Not an URL: %s"), path);
+}
+
+svn_error_t*
+Relpath::initfunc(const char*& path, SVN::Pool& pool)
+{
+ path = svn_relpath__internal_style(path, pool.getPool());
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/bindings/javahl/native/Path.h b/subversion/bindings/javahl/native/Path.h
index d23261e..5684efb 100644
--- a/subversion/bindings/javahl/native/Path.h
+++ b/subversion/bindings/javahl/native/Path.h
@@ -24,18 +24,19 @@
* @brief Interface of the C++ class Path.
*/
-#ifndef PATH_H
-#define PATH_H
+#ifndef JAVAHL_PATH_H
+#define JAVAHL_PATH_H
#include <string>
#include <jni.h>
#include "Pool.h"
struct svn_error_t;
+
/**
* Encapsulation for Subversion Path handling
*/
-class Path
+class PathBase
{
private:
// The path to be stored.
@@ -48,9 +49,11 @@ class Path
*
* @param pi_path Path string
*/
- void init(const char *pi_path, SVN::Pool &in_pool);
+ void init(const char *pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool);
- public:
+ protected:
/**
* Constructor that takes a string as parameter.
* The string is converted to subversion internal
@@ -58,27 +61,31 @@ class Path
*
* @param pi_path Path string
*/
- Path(const std::string &pi_path, SVN::Pool &in_pool);
+ PathBase(const std::string &pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool);
/**
* Constructor
*
- * @see Path::Path (const std::string &)
+ * @see PathBase::PathBase (const std::string &)
* @param pi_path Path string
*/
- Path(const char *pi_path, SVN::Pool &in_pool);
+ PathBase(const char *pi_path,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool);
/**
- * Copy constructor
- *
- * @param pi_path Path to be copied
+ * Constructor from a Java string.
*/
- Path(const Path &pi_path, SVN::Pool &in_pool);
+ PathBase(jstring jpath,
+ svn_error_t* initfunc(const char*&, SVN::Pool&),
+ SVN::Pool &in_pool);
/**
* Assignment operator
*/
- Path &operator=(const Path&);
+ PathBase &operator=(const PathBase&);
/**
* @return Path string
@@ -92,6 +99,7 @@ class Path
svn_error_t *error_occurred() const;
+public:
/**
* Returns whether @a path is non-NULL and passes the @c
* svn_path_check_valid() test.
@@ -101,4 +109,113 @@ class Path
static jboolean isValid(const char *path);
};
-#endif // PATH_H
+
+/**
+ * Dirent or URI
+ */
+class Path : protected PathBase
+{
+ public:
+ Path(const std::string &pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ Path(const char *pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ Path(jstring jpath, SVN::Pool &in_pool)
+ : PathBase(jpath, initfunc, in_pool)
+ {}
+
+ Path& operator=(const Path& that)
+ {
+ PathBase::operator=(that);
+ return *this;
+ }
+
+ const std::string &path() const { return PathBase::path(); }
+ const char *c_str() const { return PathBase::c_str(); }
+
+ svn_error_t *error_occurred() const
+ {
+ return PathBase::error_occurred();
+ }
+
+ private:
+ static svn_error_t* initfunc(const char*&, SVN::Pool&);
+};
+
+/**
+ * URL
+ */
+class URL : protected PathBase
+{
+ public:
+ URL(const std::string &pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ URL(const char *pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ URL(jstring jpath, SVN::Pool &in_pool)
+ : PathBase(jpath, initfunc, in_pool)
+ {}
+
+ URL& operator=(const URL& that)
+ {
+ PathBase::operator=(that);
+ return *this;
+ }
+
+ const std::string &path() const { return PathBase::path(); }
+ const char *c_str() const { return PathBase::c_str(); }
+
+ svn_error_t *error_occurred() const
+ {
+ return PathBase::error_occurred();
+ }
+
+ private:
+ static svn_error_t* initfunc(const char*&, SVN::Pool&);
+};
+
+/**
+ * Relative path
+ */
+class Relpath : protected PathBase
+{
+ public:
+ Relpath(const std::string &pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ Relpath(const char *pi_path, SVN::Pool &in_pool)
+ : PathBase(pi_path, initfunc, in_pool)
+ {}
+
+ Relpath(jstring jpath, SVN::Pool &in_pool)
+ : PathBase(jpath, initfunc, in_pool)
+ {}
+
+ Relpath& operator=(const Relpath& that)
+ {
+ PathBase::operator=(that);
+ return *this;
+ }
+
+ const std::string &path() const { return PathBase::path(); }
+ const char *c_str() const { return PathBase::c_str(); }
+
+ svn_error_t *error_occurred() const
+ {
+ return PathBase::error_occurred();
+ }
+
+ private:
+ static svn_error_t* initfunc(const char*&, SVN::Pool&);
+};
+
+#endif // JAVAHL_PATH_H
diff --git a/subversion/bindings/javahl/native/Prompter.cpp b/subversion/bindings/javahl/native/Prompter.cpp
index 14bd312..bad7467 100644
--- a/subversion/bindings/javahl/native/Prompter.cpp
+++ b/subversion/bindings/javahl/native/Prompter.cpp
@@ -25,468 +25,532 @@
*/
#include "Prompter.h"
-#include "Pool.h"
+#include "AuthnCallback.hpp"
+
#include "JNIUtil.h"
#include "JNIStringHolder.h"
#include "../include/org_apache_subversion_javahl_callback_UserPasswordCallback.h"
+
#include <apr_strings.h>
-#include "svn_auth.h"
#include "svn_error.h"
#include "svn_error_codes.h"
#include "svn_private_config.h"
-/**
- * Constructor
- * @param jprompter a global reference to the Java callback object
- */
-Prompter::Prompter(jobject jprompter)
-{
- m_prompter = jprompter;
-}
-Prompter::~Prompter()
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_string.hpp"
+
+// Class Prompter
+
+Prompter::UniquePtr Prompter::create(jobject jprompter)
{
- if (m_prompter!= NULL)
+ if (!jprompter)
+ return UniquePtr(NULL);
+
+ // Make sure no C++ exceptions are propagated from here.
+ const ::Java::Env jenv;
+ try
{
- // Since the reference to the Java object is a global one, it
- // has to be deleted.
- JNIEnv *env = JNIUtil::getEnv();
- env->DeleteGlobalRef(m_prompter);
+ const jclass cls = ::Java::ClassCache::get_authn_cb(jenv)->get_class();
+ if (!jenv.IsInstanceOf(jprompter, cls))
+ return UniquePtr(NULL);
+
+ return UniquePtr(new Prompter(jenv, jprompter));
}
+ SVN_JAVAHL_JNI_CATCH;
+ return UniquePtr(NULL);
}
-/**
- * Create a C++ peer object for the Java callback object
- *
- * @param jprompter Java callback object
- * @return C++ peer object
- */
-Prompter *Prompter::makeCPrompter(jobject jprompter)
+Prompter::UniquePtr Prompter::clone() const
{
- // If we have no Java object, we need no C++ object.
- if (jprompter == NULL)
- return NULL;
-
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ return create(m_prompter.get());
+}
- // Sanity check that the Java object implements UserPasswordCallback.
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+Prompter::Prompter(::Java::Env env, jobject jprompter)
+ : m_prompter(env, jprompter)
+{}
- if (!env->IsInstanceOf(jprompter, clazz))
- POP_AND_RETURN_NULL;
+Prompter::~Prompter() {}
- // Create a new global ref for the Java object, because it is
- // longer used that this call.
- jobject myPrompt = env->NewGlobalRef(jprompter);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
- env->PopLocalFrame(NULL);
+svn_auth_provider_object_t *
+Prompter::get_provider_simple(SVN::Pool &in_pool)
+{
+ apr_pool_t *pool = in_pool.getPool();
+ svn_auth_provider_object_t *provider;
+ svn_auth_get_simple_prompt_provider(&provider,
+ simple_prompt,
+ this,
+ 2, /* retry limit */
+ pool);
- // Create the C++ peer.
- return new Prompter(myPrompt);
+ return provider;
}
-/**
- * Retrieve the username from the Java object
- * @return Java string for the username or NULL
- */
-jstring Prompter::username()
+svn_auth_provider_object_t *
+Prompter::get_provider_username(SVN::Pool &in_pool)
{
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- // The method id will not change during the time this library is
- // loaded, so it can be cached.
- static jmethodID mid = 0;
-
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ apr_pool_t *pool = in_pool.getPool();
+ svn_auth_provider_object_t *provider;
+ svn_auth_get_username_prompt_provider(&provider,
+ username_prompt,
+ this,
+ 2, /* retry limit */
+ pool);
- mid = env->GetMethodID(clazz, "getUsername", "()Ljava/lang/String;");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN_NULL;
- }
+ return provider;
+}
- jstring ret = static_cast<jstring>(env->CallObjectMethod(m_prompter, mid));
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+svn_auth_provider_object_t *Prompter::
+get_provider_server_ssl_trust(SVN::Pool &in_pool)
+{
+ apr_pool_t *pool = in_pool.getPool();
+ svn_auth_provider_object_t *provider;
+ svn_auth_get_ssl_server_trust_prompt_provider
+ (&provider, ssl_server_trust_prompt, this, pool);
- return (jstring) env->PopLocalFrame(ret);
+ return provider;
}
-/**
- * Retrieve the password from the Java object
- * @return Java string for the password or NULL
- */
-jstring Prompter::password()
+svn_auth_provider_object_t *Prompter::
+get_provider_client_ssl(SVN::Pool &in_pool)
{
- JNIEnv *env = JNIUtil::getEnv();
+ apr_pool_t *pool = in_pool.getPool();
+ svn_auth_provider_object_t *provider;
+ svn_auth_get_ssl_client_cert_prompt_provider(&provider,
+ ssl_client_cert_prompt,
+ this,
+ 2 /* retry limit */,
+ pool);
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ return provider;
+}
- // The method id will not change during the time this library is
- // loaded, so it can be cached.
- static jmethodID mid = 0;
+svn_auth_provider_object_t *
+Prompter::get_provider_client_ssl_password(SVN::Pool &in_pool)
+{
+ apr_pool_t *pool = in_pool.getPool();
+ svn_auth_provider_object_t *provider;
+ svn_auth_get_ssl_client_cert_pw_prompt_provider
+ (&provider, ssl_client_cert_pw_prompt, this, 2 /* retry limit */,
+ pool);
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ return provider;
+}
- mid = env->GetMethodID(clazz, "getPassword", "()Ljava/lang/String;");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN_NULL;
- }
+svn_error_t *Prompter::simple_prompt(
+ svn_auth_cred_simple_t **cred_p,
+ void *baton,
+ const char *realm,
+ const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_simple_prompt(
+ env, cred_p, realm, username, may_save, pool));
+ return err;
+}
- jstring ret = static_cast<jstring>(env->CallObjectMethod(m_prompter, mid));
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+svn_error_t *Prompter::username_prompt(
+ svn_auth_cred_username_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_username_prompt(
+ env, cred_p, realm, may_save, pool));
+ return err;
+}
- return (jstring) env->PopLocalFrame(ret);
+svn_error_t *Prompter::ssl_server_trust_prompt(
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ void *baton,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_ssl_server_trust_prompt(
+ env, cred_p, realm, failures, cert_info, may_save, pool));
+ return err;
}
-/**
- * Ask the user a question, which can be answered by yes/no.
- * @param realm the server realm, for which this question is asked
- * @param question the question to ask the user
- * @param yesIsDefault flag if the yes-button should be the default button
- * @return flag who the user answered the question
- */
-bool Prompter::askYesNo(const char *realm, const char *question,
- bool yesIsDefault)
+
+svn_error_t *Prompter::ssl_client_cert_prompt(
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- JNIEnv *env = JNIUtil::getEnv();
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_ssl_client_cert_prompt(
+ env, cred_p, realm, may_save, pool));
+ return err;
+}
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return false;
+svn_error_t *Prompter::ssl_client_cert_pw_prompt(
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_ssl_client_cert_pw_prompt(
+ env, cred_p, realm, may_save, pool));
+ return err;
+}
- // The method id will not change during the time this library is
- // loaded, so it can be cached.
- static jmethodID mid = 0;
+svn_error_t *Prompter::plaintext_prompt(
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ void *baton,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_plaintext_prompt(
+ env, may_save_plaintext, realmstring, pool));
+ return err;
+}
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
-
- mid = env->GetMethodID(clazz, "askYesNo",
- "(Ljava/lang/String;Ljava/lang/String;Z)Z");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN(false);
- }
+svn_error_t *Prompter::plaintext_passphrase_prompt(
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ void *baton,
+ apr_pool_t *pool)
+{
+ const ::Java::Env env;
+ svn_error_t *err;
+ SVN_JAVAHL_CATCH(
+ env, SVN_ERR_RA_NOT_AUTHORIZED,
+ err = static_cast<Prompter*>(baton)->dispatch_plaintext_passphrase_prompt(
+ env, may_save_plaintext, realmstring, pool));
+ return err;
+}
- // convert the texts to Java strings
- jstring jrealm = JNIUtil::makeJString(realm);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
- jstring jquestion = JNIUtil::makeJString(question);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+svn_error_t *Prompter::dispatch_simple_prompt(
+ ::Java::Env env,
+ svn_auth_cred_simple_t **cred_p,
+ const char *realm,
+ const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
+
+ ::JavaHL::AuthnCallback::AuthnResult result(
+ env,
+ authn.user_password_prompt(::Java::String(env, realm),
+ ::Java::String(env, username),
+ may_save));
+ if (!result.get())
+ return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("User canceled dialog"));
- // execute the callback
- jboolean ret = env->CallBooleanMethod(m_prompter, mid, jrealm, jquestion,
- yesIsDefault ? JNI_TRUE : JNI_FALSE);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+ ::Java::String user(env, result.identity());
+ ::Java::String pass(env, result.secret());
+ svn_auth_cred_simple_t *cred =
+ static_cast<svn_auth_cred_simple_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->username = user.strdup(pool);
+ cred->password = pass.strdup(pool);
+ cred->may_save = result.save();
+ *cred_p = cred;
- env->PopLocalFrame(NULL);
- return ret ? true:false;
+ return SVN_NO_ERROR;
}
-const char *Prompter::askQuestion(const char *realm, const char *question,
- bool showAnswer, bool maySave)
+svn_error_t *Prompter::dispatch_username_prompt(
+ ::Java::Env env,
+ svn_auth_cred_username_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
- static jmethodID mid = 0;
- static jmethodID mid2 = 0;
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- mid = env->GetMethodID(clazz, "askQuestion",
- "(Ljava/lang/String;Ljava/lang/String;"
- "ZZ)Ljava/lang/String;");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN_NULL;
-
- mid2 = env->GetMethodID(clazz, "userAllowedSave", "()Z");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN_NULL;
- }
+ ::JavaHL::AuthnCallback::AuthnResult result(
+ env,
+ authn.username_prompt(::Java::String(env, realm), may_save));
+ if (!result.get())
+ return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("User canceled dialog"));
- jstring jrealm = JNIUtil::makeJString(realm);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ ::Java::String user(env, result.identity());
+ svn_auth_cred_username_t *cred =
+ static_cast<svn_auth_cred_username_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->username = user.strdup(pool);
+ cred->may_save = result.save();
+ *cred_p = cred;
- jstring jquestion = JNIUtil::makeJString(question);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ return SVN_NO_ERROR;
+}
- jstring janswer = static_cast<jstring>(
- env->CallObjectMethod(m_prompter, mid, jrealm,
- jquestion,
- showAnswer ? JNI_TRUE : JNI_FALSE,
- maySave ? JNI_TRUE : JNI_FALSE));
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+svn_error_t *Prompter::dispatch_ssl_server_trust_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
+
+ ::JavaHL::AuthnCallback::AuthnResult result(
+ env,
+ authn.ssl_server_trust_prompt(
+ ::Java::String(env, realm),
+ ::JavaHL::AuthnCallback::SSLServerCertFailures(env, jint(failures)),
+ ::JavaHL::AuthnCallback::SSLServerCertInfo(env, cert_info->ascii_cert),
+ may_save));
+ if (!result.get())
+ return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("User canceled dialog"));
- JNIStringHolder answer(janswer);
- if (answer != NULL)
- {
- m_answer = answer;
- m_maySave = env->CallBooleanMethod(m_prompter, mid2) ? true: false;
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
- }
- else
+ const bool trust = result.trust();
+ if (!trust)
{
- m_answer = "";
- m_maySave = false;
+ *cred_p = NULL;
+ return SVN_NO_ERROR;
}
- env->PopLocalFrame(NULL);
- return m_answer.c_str();
-}
+ const bool save = result.save();
+ svn_auth_cred_ssl_server_trust_t *cred =
+ static_cast<svn_auth_cred_ssl_server_trust_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->may_save = save;
+ if (save)
+ cred->accepted_failures = failures;
+ *cred_p = cred;
-int Prompter::askTrust(const char *question, bool maySave)
-{
- static jmethodID mid = 0;
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return -1;
-
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(-1);
-
- mid = env->GetMethodID(clazz, "askTrustSSLServer",
- "(Ljava/lang/String;Z)I");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN(-1);
- }
- jstring jquestion = JNIUtil::makeJString(question);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(-1);
-
- jint ret = env->CallIntMethod(m_prompter, mid, jquestion,
- maySave ? JNI_TRUE : JNI_FALSE);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(-1);
-
- env->PopLocalFrame(NULL);
- return ret;
+ return SVN_NO_ERROR;
}
-bool Prompter::prompt(const char *realm, const char *pi_username, bool maySave)
+svn_error_t *Prompter::dispatch_ssl_client_cert_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- JNIEnv *env = JNIUtil::getEnv();
- jboolean ret;
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return false;
+ ::JavaHL::AuthnCallback::AuthnResult result(
+ env,
+ authn.ssl_client_cert_prompt(::Java::String(env, realm), may_save));
+ if (!result.get())
+ return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("User canceled dialog"));
- static jmethodID mid = 0;
- static jmethodID mid2 = 0;
- if (mid == 0)
- {
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/UserPasswordCallback");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
-
- mid = env->GetMethodID(clazz, "prompt",
- "(Ljava/lang/String;Ljava/lang/String;Z)Z");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN(false);
-
- mid2 = env->GetMethodID(clazz, "userAllowedSave", "()Z");
- if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- POP_AND_RETURN(false);
- }
+ ::Java::String path(env, result.identity());
+ svn_auth_cred_ssl_client_cert_t *cred =
+ static_cast<svn_auth_cred_ssl_client_cert_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->cert_file = path.strdup(pool);
+ cred->may_save = result.save();
+ *cred_p = cred;
- jstring jrealm = JNIUtil::makeJString(realm);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+ return SVN_NO_ERROR;
+}
- jstring jusername = JNIUtil::makeJString(pi_username);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+svn_error_t *Prompter::dispatch_ssl_client_cert_pw_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
+{
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
- ret = env->CallBooleanMethod(m_prompter, mid, jrealm, jusername,
- maySave ? JNI_TRUE: JNI_FALSE);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+ ::JavaHL::AuthnCallback::AuthnResult result(
+ env,
+ authn.ssl_client_cert_passphrase_prompt(
+ ::Java::String(env, realm), may_save));
+ if (!result.get())
+ return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("User canceled dialog"));
- m_maySave = env->CallBooleanMethod(m_prompter, mid2) ? true : false;
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN(false);
+ ::Java::String passphrase(env, result.secret());
+ svn_auth_cred_ssl_client_cert_pw_t *cred =
+ static_cast<svn_auth_cred_ssl_client_cert_pw_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->password = passphrase.strdup(pool);
+ cred->may_save = result.save();
+ *cred_p = cred;
- env->PopLocalFrame(NULL);
- return ret ? true:false;
+ return SVN_NO_ERROR;
}
-svn_auth_provider_object_t *Prompter::getProviderSimple(SVN::Pool &in_pool)
+svn_error_t *Prompter::dispatch_plaintext_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool)
{
- apr_pool_t *pool = in_pool.getPool();
- svn_auth_provider_object_t *provider;
- svn_auth_get_simple_prompt_provider(&provider,
- simple_prompt,
- this,
- 2, /* retry limit */
- pool);
-
- return provider;
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
+ *may_save_plaintext =
+ authn.allow_store_plaintext_password(::Java::String(env, realmstring));
+ return SVN_NO_ERROR;
}
-svn_auth_provider_object_t *Prompter::getProviderUsername(SVN::Pool &in_pool)
+svn_error_t *Prompter::dispatch_plaintext_passphrase_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool)
{
- apr_pool_t *pool = in_pool.getPool();
- svn_auth_provider_object_t *provider;
- svn_auth_get_username_prompt_provider(&provider,
- username_prompt,
- this,
- 2, /* retry limit */
- pool);
-
- return provider;
+ ::JavaHL::AuthnCallback authn(env, m_prompter.get());
+ *may_save_plaintext =
+ authn.allow_store_plaintext_passphrase(::Java::String(env, realmstring));
+ return SVN_NO_ERROR;
}
-svn_auth_provider_object_t *Prompter::getProviderServerSSLTrust(SVN::Pool &in_pool)
+
+// Class CompatPrompter
+
+Prompter::UniquePtr CompatPrompter::create(jobject jprompter)
{
- apr_pool_t *pool = in_pool.getPool();
- svn_auth_provider_object_t *provider;
- svn_auth_get_ssl_server_trust_prompt_provider
- (&provider, ssl_server_trust_prompt, this, pool);
+ if (!jprompter)
+ return UniquePtr(NULL);
- return provider;
+ // Make sure no C++ exceptions are propagated from here.
+ const ::Java::Env jenv;
+ try
+ {
+ const jclass cls =
+ ::Java::ClassCache::get_user_passwd_cb(jenv)->get_class();
+ if (!jenv.IsInstanceOf(jprompter, cls))
+ return UniquePtr(NULL);
+
+ return UniquePtr(new CompatPrompter(jenv, jprompter));
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return UniquePtr(NULL);
}
-svn_auth_provider_object_t *Prompter::getProviderClientSSL(SVN::Pool &in_pool)
+Prompter::UniquePtr CompatPrompter::clone() const
{
- apr_pool_t *pool = in_pool.getPool();
- svn_auth_provider_object_t *provider;
- svn_auth_get_ssl_client_cert_prompt_provider(&provider,
- ssl_client_cert_prompt,
- this,
- 2 /* retry limit */,
- pool);
-
- return provider;
+ return create(m_prompter.get());
}
-svn_auth_provider_object_t *Prompter::getProviderClientSSLPassword(SVN::Pool &in_pool)
+CompatPrompter::CompatPrompter(::Java::Env env, jobject jprompter)
+ : Prompter(env, jprompter)
+{}
+
+CompatPrompter::~CompatPrompter() {}
+
+namespace {
+jstring compat_ask_question(
+ bool& allowed_save,
+ ::Java::Env env,
+ ::JavaHL::UserPasswordCallback& authn,
+ const char *realm, const char *question,
+ bool show_answer, bool may_save)
{
- apr_pool_t *pool = in_pool.getPool();
- svn_auth_provider_object_t *provider;
- svn_auth_get_ssl_client_cert_pw_prompt_provider
- (&provider, ssl_client_cert_pw_prompt, this, 2 /* retry limit */,
- pool);
+ const jstring janswer =
+ authn.ask_question(::Java::String(env, realm),
+ ::Java::String(env, question),
+ show_answer, may_save);
- return provider;
-}
+ if (janswer)
+ allowed_save = authn.user_allowed_save();
+ else
+ allowed_save = false;
-svn_error_t *Prompter::simple_prompt(svn_auth_cred_simple_t **cred_p,
- void *baton,
- const char *realm, const char *username,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+ return janswer;
+}
+} // anonymous namespace
+
+svn_error_t *CompatPrompter::dispatch_simple_prompt(
+ ::Java::Env env,
+ svn_auth_cred_simple_t **cred_p,
+ const char *realm, const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
- svn_auth_cred_simple_t *ret =
- reinterpret_cast<svn_auth_cred_simple_t*>(apr_pcalloc(pool, sizeof(*ret)));
- if (!that->prompt(realm, username, may_save ? true : false))
- return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
- _("User canceled dialog"));
- jstring juser = that->username();
- JNIStringHolder user(juser);
- if (user == NULL)
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
+
+ if (!authn.prompt(::Java::String(env, realm),
+ ::Java::String(env, username),
+ may_save))
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("User canceled dialog"));
- ret->username = apr_pstrdup(pool,user);
- jstring jpass = that->password();
- JNIStringHolder pass(jpass);
- if (pass == NULL)
+ const ::Java::String user(env, authn.get_username());
+ const ::Java::String pass(env, authn.get_password());
+
+ if (!user.get() || !pass.get())
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("User canceled dialog"));
- else
- {
- ret->password = apr_pstrdup(pool, pass);
- ret->may_save = that->m_maySave;
- }
- *cred_p = ret;
+
+ svn_auth_cred_simple_t *cred =
+ static_cast<svn_auth_cred_simple_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->username = user.strdup(pool);
+ cred->password = pass.strdup(pool);
+ cred->may_save = authn.user_allowed_save();
+ *cred_p = cred;
return SVN_NO_ERROR;
}
-svn_error_t *Prompter::username_prompt(svn_auth_cred_username_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+svn_error_t *CompatPrompter::dispatch_username_prompt(
+ ::Java::Env env,
+ svn_auth_cred_username_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
- svn_auth_cred_username_t *ret =
- reinterpret_cast<svn_auth_cred_username_t*>(apr_pcalloc(pool, sizeof(*ret)));
- const char *user = that->askQuestion(realm, _("Username: "), true,
- may_save ? true : false);
- if (user == NULL)
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
+
+ bool allowed_save;
+ const ::Java::String user(
+ env,
+ compat_ask_question(allowed_save, env, authn,
+ realm, _("Username: "), true, may_save));
+ if (!user.get())
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("User canceled dialog"));
- ret->username = apr_pstrdup(pool,user);
- ret->may_save = that->m_maySave;
- *cred_p = ret;
+
+ svn_auth_cred_username_t *cred =
+ static_cast<svn_auth_cred_username_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->username = user.strdup(pool);
+ cred->may_save = allowed_save;
+ *cred_p = cred;
return SVN_NO_ERROR;
}
svn_error_t *
-Prompter::ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred_p,
- void *baton,
- const char *realm,
- apr_uint32_t failures,
- const svn_auth_ssl_server_cert_info_t *cert_info,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+CompatPrompter::dispatch_ssl_server_trust_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
- svn_auth_cred_ssl_server_trust_t *ret =
- reinterpret_cast<svn_auth_cred_ssl_server_trust_t*>(apr_pcalloc(pool, sizeof(*ret)));
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
std::string question = _("Error validating server certificate for ");
question += realm;
@@ -526,16 +590,20 @@ Prompter::ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred_p,
question += "\n";
}
- switch(that->askTrust(question.c_str(), may_save ? true : false))
+ svn_auth_cred_ssl_server_trust_t *cred =
+ static_cast<svn_auth_cred_ssl_server_trust_t*>(apr_pcalloc(pool, sizeof(*cred)));
+
+ switch (authn.ask_trust_ssl_server(::Java::String(env, question), may_save))
{
case org_apache_subversion_javahl_callback_UserPasswordCallback_AcceptTemporary:
- *cred_p = ret;
- ret->may_save = FALSE;
+ cred->may_save = FALSE;
+ cred->accepted_failures = failures;
+ *cred_p = cred;
break;
case org_apache_subversion_javahl_callback_UserPasswordCallback_AcceptPermanently:
- *cred_p = ret;
- ret->may_save = TRUE;
- ret->accepted_failures = failures;
+ cred->may_save = TRUE;
+ cred->accepted_failures = failures;
+ *cred_p = cred;
break;
default:
*cred_p = NULL;
@@ -544,79 +612,91 @@ Prompter::ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred_p,
}
svn_error_t *
-Prompter::ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+CompatPrompter::dispatch_ssl_client_cert_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
- svn_auth_cred_ssl_client_cert_t *ret =
- reinterpret_cast<svn_auth_cred_ssl_client_cert_t*>(apr_pcalloc(pool, sizeof(*ret)));
- const char *cert_file =
- that->askQuestion(realm, _("client certificate filename: "), true,
- may_save ? true : false);
- if (cert_file == NULL)
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
+
+ bool allowed_save;
+ const ::Java::String path(
+ env,
+ compat_ask_question(allowed_save, env, authn, realm,
+ _("Client certificate filename: "),
+ true, may_save));
+ if (!path.get())
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("User canceled dialog"));
- ret->cert_file = apr_pstrdup(pool, cert_file);
- ret->may_save = that->m_maySave;
- *cred_p = ret;
+
+ svn_auth_cred_ssl_client_cert_t *cred =
+ static_cast<svn_auth_cred_ssl_client_cert_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->cert_file = path.strdup(pool);
+ cred->may_save = allowed_save;
+ *cred_p = cred;
return SVN_NO_ERROR;
}
svn_error_t *
-Prompter::ssl_client_cert_pw_prompt(svn_auth_cred_ssl_client_cert_pw_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+CompatPrompter::dispatch_ssl_client_cert_pw_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
- svn_auth_cred_ssl_client_cert_pw_t *ret =
- reinterpret_cast<svn_auth_cred_ssl_client_cert_pw_t*>(apr_pcalloc(pool, sizeof(*ret)));
- const char *info = that->askQuestion(realm,
- _("client certificate passphrase: "),
- false, may_save ? true : false);
- if (info == NULL)
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
+
+ bool allowed_save;
+ const ::Java::String info(
+ env,
+ compat_ask_question(allowed_save, env, authn, realm,
+ _("Client certificate passphrase: "),
+ false, may_save));
+ if (!info.get())
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("User canceled dialog"));
- ret->password = apr_pstrdup(pool, info);
- ret->may_save = that->m_maySave;
- *cred_p = ret;
+
+ svn_auth_cred_ssl_client_cert_pw_t *cred =
+ static_cast<svn_auth_cred_ssl_client_cert_pw_t*>(apr_pcalloc(pool, sizeof(*cred)));
+ cred->password = info.strdup(pool);
+ cred->may_save = allowed_save;
+ *cred_p = cred;
return SVN_NO_ERROR;
}
svn_error_t *
-Prompter::plaintext_prompt(svn_boolean_t *may_save_plaintext,
- const char *realmstring,
- void *baton,
- apr_pool_t *pool)
+CompatPrompter::dispatch_plaintext_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
- bool result = that->askYesNo(realmstring,
- _("Store password unencrypted?"),
- false);
-
- *may_save_plaintext = (result ? TRUE : FALSE);
+ *may_save_plaintext = authn.ask_yes_no(
+ ::Java::String(env, realmstring),
+ ::Java::String(env, _("Store password unencrypted?")),
+ false);
return SVN_NO_ERROR;
}
svn_error_t *
-Prompter::plaintext_passphrase_prompt(svn_boolean_t *may_save_plaintext,
- const char *realmstring,
- void *baton,
- apr_pool_t *pool)
+CompatPrompter::dispatch_plaintext_passphrase_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool)
{
- Prompter *that = static_cast<Prompter *>(baton);
-
- bool result = that->askYesNo(realmstring,
- _("Store passphrase unencrypted?"),
- false);
+ ::JavaHL::UserPasswordCallback authn(env, m_prompter.get());
- *may_save_plaintext = (result ? TRUE : FALSE);
+ *may_save_plaintext = authn.ask_yes_no(
+ ::Java::String(env, realmstring),
+ ::Java::String(env, _("Store passphrase unencrypted?")),
+ false);
return SVN_NO_ERROR;
}
diff --git a/subversion/bindings/javahl/native/Prompter.h b/subversion/bindings/javahl/native/Prompter.h
index 722abce..06a7f2d 100644
--- a/subversion/bindings/javahl/native/Prompter.h
+++ b/subversion/bindings/javahl/native/Prompter.h
@@ -24,93 +24,219 @@
* @brief Interface of the class Prompter
*/
-#ifndef PROMPTER_H
-#define PROMPTER_H
+#ifndef SVN_JAVAHL_PROMPTER_H
+#define SVN_JAVAHL_PROMPTER_H
+
+#include <memory>
-#include <jni.h>
#include "svn_auth.h"
-#include <string>
+
#include "Pool.h"
-/**
- * This class requests username/password and informations about
- * ssl-certificates from the user.
- */
+
+#include "jniwrapper/jni_globalref.hpp"
+
class Prompter
{
- private:
+public:
+ typedef ::std::auto_ptr<Prompter> UniquePtr;
+
/**
- * The Java callback object.
+ * Factory method; @a prompter is a local reference to the Java
+ * callback object.
*/
- jobject m_prompter;
+ static Prompter::UniquePtr create(jobject jprompter);
/**
- * Tntermediate storage for an answer.
+ * Return a clone of the current object, referring to the same Java
+ * prompter object.
*/
- std::string m_answer;
+ virtual Prompter::UniquePtr clone() const;
+
+ virtual ~Prompter();
+
+ svn_auth_provider_object_t *get_provider_username(SVN::Pool &in_pool);
+ svn_auth_provider_object_t *get_provider_simple(SVN::Pool &in_pool);
+ svn_auth_provider_object_t *get_provider_server_ssl_trust(SVN::Pool &in_pool);
+ svn_auth_provider_object_t *get_provider_client_ssl(SVN::Pool &in_pool);
+ svn_auth_provider_object_t *get_provider_client_ssl_password(SVN::Pool &in_pool);
+
+protected:
+ explicit Prompter(::Java::Env env, jobject jprompter);
/**
- * Flag is the user allowed, that the last answer is stored in the
- * configuration.
+ * The Java callback object.
*/
- bool m_maySave;
-
- Prompter(jobject jprompter);
- bool prompt(const char *realm, const char *pi_username, bool maySave);
- bool askYesNo(const char *realm, const char *question, bool yesIsDefault);
- const char *askQuestion(const char *realm, const char *question,
- bool showAnswer, bool maySave);
- int askTrust(const char *question, bool maySave);
- jstring password();
- jstring username();
- static svn_error_t *simple_prompt(svn_auth_cred_simple_t **cred_p,
- void *baton, const char *realm,
- const char *username,
- svn_boolean_t may_save,
- apr_pool_t *pool);
- static svn_error_t *username_prompt
- (svn_auth_cred_username_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool);
- static svn_error_t *ssl_server_trust_prompt
- (svn_auth_cred_ssl_server_trust_t **cred_p,
- void *baton,
- const char *realm,
- apr_uint32_t failures,
- const svn_auth_ssl_server_cert_info_t *cert_info,
- svn_boolean_t may_save,
- apr_pool_t *pool);
- static svn_error_t *ssl_client_cert_prompt
- (svn_auth_cred_ssl_client_cert_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool);
- static svn_error_t *ssl_client_cert_pw_prompt
- (svn_auth_cred_ssl_client_cert_pw_t **cred_p,
- void *baton,
- const char *realm,
- svn_boolean_t may_save,
- apr_pool_t *pool);
- public:
- static Prompter *makeCPrompter(jobject jprompter);
- ~Prompter();
- svn_auth_provider_object_t *getProviderUsername(SVN::Pool &in_pool);
- svn_auth_provider_object_t *getProviderSimple(SVN::Pool &in_pool);
- svn_auth_provider_object_t *getProviderServerSSLTrust(SVN::Pool &in_pool);
- svn_auth_provider_object_t *getProviderClientSSL(SVN::Pool &in_pool);
- svn_auth_provider_object_t *getProviderClientSSLPassword(SVN::Pool &in_pool);
-
- static svn_error_t *plaintext_prompt(svn_boolean_t *may_save_plaintext,
- const char *realmstring,
- void *baton,
- apr_pool_t *pool);
+ ::Java::GlobalObject m_prompter;
+
+ virtual svn_error_t *dispatch_simple_prompt(
+ ::Java::Env env,
+ svn_auth_cred_simple_t **cred_p,
+ const char *realm,
+ const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ static svn_error_t *simple_prompt(
+ svn_auth_cred_simple_t **cred_p,
+ void *baton,
+ const char *realm,
+ const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_username_prompt(
+ ::Java::Env env,
+ svn_auth_cred_username_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ static svn_error_t *username_prompt(
+ svn_auth_cred_username_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_server_trust_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ static svn_error_t *ssl_server_trust_prompt(
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ void *baton,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_client_cert_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ static svn_error_t *ssl_client_cert_prompt(
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_client_cert_pw_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ static svn_error_t *ssl_client_cert_pw_prompt(
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ void *baton,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+protected:
+ virtual svn_error_t *dispatch_plaintext_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool);
+
+public:
+ static svn_error_t *plaintext_prompt(
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ void *baton,
+ apr_pool_t *pool);
+
+protected:
+ virtual svn_error_t *dispatch_plaintext_passphrase_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool);
+
+public:
static svn_error_t *plaintext_passphrase_prompt(
- svn_boolean_t *may_save_plaintext,
- const char *realmstring,
- void *baton,
- apr_pool_t *pool);
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ void *baton,
+ apr_pool_t *pool);
+};
+
+
+/**
+ * This class requests username/password and informations about
+ * ssl-certificates from the user.
+ */
+class CompatPrompter : public Prompter
+{
+public:
+ static Prompter::UniquePtr create(jobject jprompter);
+ virtual Prompter::UniquePtr clone() const;
+ virtual ~CompatPrompter();
+
+protected:
+ explicit CompatPrompter(::Java::Env env, jobject jprompter);
+
+ virtual svn_error_t *dispatch_simple_prompt(
+ ::Java::Env env,
+ svn_auth_cred_simple_t **cred_p,
+ const char *realm,
+ const char *username,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_username_prompt(
+ ::Java::Env env,
+ svn_auth_cred_username_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_server_trust_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_server_trust_t **cred_p,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_client_cert_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_ssl_client_cert_pw_prompt(
+ ::Java::Env env,
+ svn_auth_cred_ssl_client_cert_pw_t **cred_p,
+ const char *realm,
+ svn_boolean_t may_save,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_plaintext_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool);
+
+ virtual svn_error_t *dispatch_plaintext_passphrase_prompt(
+ ::Java::Env env,
+ svn_boolean_t *may_save_plaintext,
+ const char *realmstring,
+ apr_pool_t *pool);
};
-#endif // PROMPTER_H
+#endif // SVN_JAVAHL_PROMPTER_H
diff --git a/subversion/bindings/javahl/native/RevpropTable.cpp b/subversion/bindings/javahl/native/PropertyTable.cpp
index 5da74dd..0a44f0c 100644
--- a/subversion/bindings/javahl/native/RevpropTable.cpp
+++ b/subversion/bindings/javahl/native/PropertyTable.cpp
@@ -20,13 +20,14 @@
* ====================================================================
* @endcopyright
*
- * @file RevpropTable.cpp
- * @brief Implementation of the class RevpropTable
+ * @file PropertyTable.cpp
+ * @brief Implementation of the class PropertyTable
*/
-#include "RevpropTable.h"
+#include "PropertyTable.h"
#include "JNIUtil.h"
#include "JNIStringHolder.h"
+#include "JNIByteArray.h"
#include "Array.h"
#include <apr_tables.h>
#include <apr_strings.h>
@@ -35,15 +36,15 @@
#include "svn_props.h"
#include <iostream>
-RevpropTable::~RevpropTable()
+PropertyTable::~PropertyTable()
{
if (m_revpropTable != NULL)
JNIUtil::getEnv()->DeleteLocalRef(m_revpropTable);
}
-const apr_hash_t *RevpropTable::hash(const SVN::Pool &pool)
+apr_hash_t *PropertyTable::hash(const SVN::Pool &pool)
{
- if (m_revprops.size() == 0)
+ if (!m_revpropTable && !m_empty_if_null)
return NULL;
apr_hash_t *revprop_table = apr_hash_make(pool.getPool());
@@ -57,13 +58,14 @@ const apr_hash_t *RevpropTable::hash(const SVN::Pool &pool)
const char *msg = apr_psprintf(pool.getPool(),
"Invalid property name: '%s'",
propname);
- JNIUtil::throwNativeException(JAVA_PACKAGE "/ClientException", msg,
+ JNIUtil::throwNativeException(JAVAHL_CLASS("/ClientException"), msg,
NULL, SVN_ERR_CLIENT_PROPERTY_NAME);
return NULL;
}
- svn_string_t *propval = svn_string_create(it->second.c_str(),
- pool.getPool());
+ svn_string_t *propval = svn_string_ncreate(it->second.c_str(),
+ it->second.size(),
+ pool.getPool());
apr_hash_set(revprop_table, propname, APR_HASH_KEY_STRING, propval);
}
@@ -71,7 +73,10 @@ const apr_hash_t *RevpropTable::hash(const SVN::Pool &pool)
return revprop_table;
}
-RevpropTable::RevpropTable(jobject jrevpropTable)
+PropertyTable::PropertyTable(jobject jrevpropTable, bool bytearray_values,
+ bool empty_if_null)
+ : m_revpropTable(jrevpropTable),
+ m_empty_if_null(empty_if_null)
{
m_revpropTable = jrevpropTable;
@@ -116,12 +121,27 @@ RevpropTable::RevpropTable(jobject jrevpropTable)
if (JNIUtil::isExceptionThrown())
return;
- JNIStringHolder propval((jstring)jpropval);
- if (JNIUtil::isExceptionThrown())
- return;
-
- m_revprops[std::string(static_cast<const char *>(propname))]
- = std::string(static_cast<const char *>(propval));
+ std::string pv;
+ if (bytearray_values)
+ {
+ JNIByteArray propval((jbyteArray)jpropval);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ if (!propval.isNull())
+ pv = std::string(
+ reinterpret_cast<const char*>(propval.getBytes()),
+ propval.getLength());
+ }
+ else
+ {
+ JNIStringHolder propval((jstring)jpropval);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ if (NULL != static_cast<const char *>(propval))
+ pv = static_cast<const char *>(propval);
+ }
+
+ m_revprops[std::string(static_cast<const char *>(propname))] = pv;
JNIUtil::getEnv()->DeleteLocalRef(jpropval);
}
diff --git a/subversion/bindings/javahl/native/RevpropTable.h b/subversion/bindings/javahl/native/PropertyTable.h
index ee5f14f..8a9a335 100644
--- a/subversion/bindings/javahl/native/RevpropTable.h
+++ b/subversion/bindings/javahl/native/PropertyTable.h
@@ -20,8 +20,8 @@
* ====================================================================
* @endcopyright
*
- * @file RevpropTable.h
- * @brief Interface of the class RevpropTable
+ * @file PropertyTable.h
+ * @brief Interface of the class PropertyTable
*/
#ifndef REVPROPTABLE_H
@@ -36,15 +36,18 @@ struct apr_hash_t;
#include <map>
#include <string>
-class RevpropTable
+class PropertyTable
{
private:
std::map<std::string, std::string> m_revprops;
jobject m_revpropTable;
+ bool m_empty_if_null;
public:
- RevpropTable(jobject jrevpropTable);
- ~RevpropTable();
- const apr_hash_t *hash(const SVN::Pool &pool);
+ PropertyTable(jobject jrevpropTable,
+ bool bytearray_values,
+ bool empty_if_null);
+ ~PropertyTable();
+ apr_hash_t *hash(const SVN::Pool &pool);
};
#endif // REVPROPTABLE_H
diff --git a/subversion/bindings/javahl/native/ProplistCallback.cpp b/subversion/bindings/javahl/native/ProplistCallback.cpp
index be46cf5..85d28c5 100644
--- a/subversion/bindings/javahl/native/ProplistCallback.cpp
+++ b/subversion/bindings/javahl/native/ProplistCallback.cpp
@@ -89,7 +89,7 @@ svn_error_t *ProplistCallback::singlePath(const char *path,
static volatile jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ProplistCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ProplistCallback"));
if (JNIUtil::isJavaExceptionThrown())
return SVN_NO_ERROR;
@@ -104,7 +104,7 @@ svn_error_t *ProplistCallback::singlePath(const char *path,
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
- jobject jmap = CreateJ::PropertyMap(prop_hash);
+ jobject jmap = CreateJ::PropertyMap(prop_hash, pool);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
@@ -112,9 +112,7 @@ svn_error_t *ProplistCallback::singlePath(const char *path,
env->CallVoidMethod(m_callback, mid, jpath, jmap);
// We return whether an exception was thrown or not.
- env->PopLocalFrame(NULL);
-
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
@@ -144,7 +142,7 @@ svn_error_t *ProplistCallback::singlePath(
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/InheritedProplistCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/InheritedProplistCallback"));
if (JNIUtil::isJavaExceptionThrown())
return SVN_NO_ERROR;
@@ -159,7 +157,7 @@ svn_error_t *ProplistCallback::singlePath(
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
- jobject jmap = CreateJ::PropertyMap(prop_hash);
+ jobject jmap = CreateJ::PropertyMap(prop_hash, pool);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
diff --git a/subversion/bindings/javahl/native/RemoteSession.cpp b/subversion/bindings/javahl/native/RemoteSession.cpp
new file mode 100644
index 0000000..42bfe75
--- /dev/null
+++ b/subversion/bindings/javahl/native/RemoteSession.cpp
@@ -0,0 +1,1322 @@
+/**
+ * @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 RemoteSession.cpp
+ * @brief Implementation of the class RemoteSession
+ */
+
+#include <cstring>
+#include <memory>
+#include <set>
+
+#include "JNIByteArray.h"
+#include "JNIStringHolder.h"
+#include "JNIUtil.h"
+#include "Path.h"
+
+#include "svn_ra.h"
+#include "svn_string.h"
+#include "svn_dirent_uri.h"
+#include "svn_delta.h"
+
+#include "CreateJ.h"
+#include "EnumMapper.h"
+#include "Iterator.h"
+#include "LogMessageCallback.h"
+#include "OutputStream.h"
+#include "Prompter.h"
+#include "Revision.h"
+#include "RemoteSession.h"
+#include "EditorProxy.h"
+#include "StateReporter.h"
+
+#include <apr_strings.h>
+#include "svn_private_config.h"
+
+#define JAVA_CLASS_REMOTE_SESSION JAVAHL_CLASS("/remote/RemoteSession")
+
+RemoteSession *
+RemoteSession::getCppObject(jobject jthis)
+{
+ static jfieldID fid = 0;
+ jlong cppAddr = SVNBase::findCppAddrForJObject(jthis, &fid,
+ JAVA_CLASS_REMOTE_SESSION);
+ return (cppAddr == 0 ? NULL : reinterpret_cast<RemoteSession *>(cppAddr));
+}
+
+jobject
+RemoteSession::open(jint jretryAttempts,
+ jstring jurl, jstring juuid,
+ jstring jconfigDirectory,
+ jstring jusername, jstring jpassword,
+ jobject jprompter, jobject jdeprecatedPrompter,
+ jobject jprogress, jobject jcfgcb, jobject jtunnelcb)
+{
+ SVN_ERR_ASSERT_NO_RETURN(!(jprompter && jdeprecatedPrompter));
+
+ SVN::Pool requestPool;
+ URL url(jurl, requestPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(url.error_occurred(), NULL);
+
+ JNIStringHolder uuid(juuid);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ Path configDirectory(jconfigDirectory, requestPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(configDirectory.error_occurred(), NULL);
+
+ JNIStringHolder usernameStr(jusername);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ JNIStringHolder passwordStr(jpassword);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ Prompter::UniquePtr prompter(jprompter ? Prompter::create(jprompter)
+ : CompatPrompter::create(jdeprecatedPrompter));
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ jobject jremoteSession = open(
+ jretryAttempts, url.c_str(), uuid,
+ (jconfigDirectory ? configDirectory.c_str() : NULL),
+ usernameStr, passwordStr, prompter, jprogress, jcfgcb, jtunnelcb);
+ if (JNIUtil::isExceptionThrown() || !jremoteSession)
+ jremoteSession = NULL;
+ return jremoteSession;
+}
+
+jobject
+RemoteSession::open(jint jretryAttempts,
+ const char* url, const char* uuid,
+ const char* configDirectory,
+ const char* usernameStr, const char* passwordStr,
+ Prompter::UniquePtr prompter, jobject jprogress,
+ jobject jcfgcb, jobject jtunnelcb)
+{
+ RemoteSession* session = new RemoteSession(
+ jretryAttempts, url, uuid, configDirectory,
+ usernameStr, passwordStr, prompter, jcfgcb, jtunnelcb);
+ if (JNIUtil::isJavaExceptionThrown() || !session)
+ {
+ delete session;
+ return NULL;
+ }
+
+ // Create java session object
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jclass clazz = env->FindClass(JAVA_CLASS_REMOTE_SESSION);
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ delete session;
+ return NULL;
+ }
+
+ static jmethodID ctor = 0;
+ if (ctor == 0)
+ {
+ ctor = env->GetMethodID(clazz, "<init>", "(J)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ delete session;
+ return NULL;
+ }
+ }
+
+ jobject jremoteSession = env->NewObject(clazz, ctor, session->getCppAddr());
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ delete session;
+ return NULL;
+ }
+
+ session->m_context->activate(jremoteSession, jprogress);
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ delete session;
+ jremoteSession = NULL;
+ }
+
+ return jremoteSession;
+}
+
+
+namespace{
+ struct compare_c_strings
+ {
+ bool operator()(const char* a, const char* b)
+ {
+ return (0 < std::strcmp(a, b));
+ }
+ };
+ typedef std::set<const char*, compare_c_strings> attempt_set;
+ typedef std::pair<attempt_set::iterator, bool> attempt_insert;
+} // anonymous namespace
+
+RemoteSession::RemoteSession(int retryAttempts,
+ const char* url, const char* uuid,
+ const char* configDirectory,
+ const char* username, const char* password,
+ Prompter::UniquePtr prompter,
+ jobject jcfgcb, jobject jtunnelcb)
+ : m_session(NULL), m_context(NULL)
+{
+ m_context = new RemoteSessionContext(
+ pool, configDirectory, username, password, prompter, jcfgcb, jtunnelcb);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ const char* corrected_url = NULL;
+ bool cycle_detected = false;
+ attempt_set attempted;
+
+ while (retryAttempts-- >= 0)
+ {
+ SVN_JNI_ERR(
+ svn_ra_open4(&m_session, &corrected_url,
+ url, uuid, m_context->getCallbacks(),
+ m_context->getCallbackBaton(),
+ m_context->getConfigData(),
+ pool.getPool()),
+ );
+
+ if (!corrected_url)
+ break;
+
+ attempt_insert result = attempted.insert(corrected_url);
+ if (!result.second)
+ {
+ cycle_detected = true;
+ break;
+ }
+
+ url = corrected_url;
+ corrected_url = NULL;
+ }
+
+ if (cycle_detected)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jstring exmsg = JNIUtil::makeJString(
+ apr_psprintf(pool.getPool(),
+ _("Redirect cycle detected for URL '%s'"),
+ corrected_url));
+
+ jclass excls = env->FindClass(
+ JAVAHL_CLASS("/SubversionException"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID exctor = 0;
+ if (exctor == 0)
+ {
+ exctor = env->GetMethodID(excls, "<init>", "(Ljava/lang/String;)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject ex = env->NewObject(excls, exctor, exmsg);
+ env->Throw(static_cast<jthrowable>(ex));
+ return;
+ }
+
+ if (corrected_url)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jstring exmsg = JNIUtil::makeJString(_("Too many redirects"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ jstring exurl = JNIUtil::makeJString(corrected_url);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ jclass excls = env->FindClass(
+ JAVAHL_CLASS("/remote/RetryOpenSession"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID exctor = 0;
+ if (exctor == 0)
+ {
+ exctor = env->GetMethodID(excls, "<init>", "(JJ)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject ex = env->NewObject(excls, exctor, exmsg, exurl);
+ env->Throw(static_cast<jthrowable>(ex));
+ return;
+ }
+}
+
+RemoteSession::~RemoteSession()
+{
+ delete m_context;
+}
+
+void
+RemoteSession::dispose(jobject jthis)
+{
+ static jfieldID fid = 0;
+ SVNBase::dispose(jthis, &fid, JAVA_CLASS_REMOTE_SESSION);
+}
+
+void RemoteSession::reparent(jstring jurl)
+{
+ SVN::Pool subPool(pool);
+ URL url(jurl, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(url.error_occurred(),);
+
+ SVN_JNI_ERR(svn_ra_reparent(m_session, url.c_str(), subPool.getPool()), );
+}
+
+jstring
+RemoteSession::getSessionUrl()
+{
+ SVN::Pool subPool(pool);
+ const char* url;
+ SVN_JNI_ERR(svn_ra_get_session_url(m_session, &url, subPool.getPool()), NULL);
+
+ jstring jurl = JNIUtil::makeJString(url);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jurl;
+}
+
+jstring
+RemoteSession::getSessionRelativePath(jstring jurl)
+{
+ SVN::Pool subPool(pool);
+ URL url(jurl, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(url.error_occurred(), NULL);
+
+ const char* rel_path;
+ SVN_JNI_ERR(svn_ra_get_path_relative_to_session(
+ m_session, &rel_path, url.c_str(), subPool.getPool()),
+ NULL);
+ jstring jrel_path = JNIUtil::makeJString(rel_path);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jrel_path;
+}
+
+jstring
+RemoteSession::getReposRelativePath(jstring jurl)
+{
+ SVN::Pool subPool(pool);
+ URL url(jurl, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(url.error_occurred(), NULL);
+
+ const char* rel_path;
+ SVN_JNI_ERR(svn_ra_get_path_relative_to_root(m_session, &rel_path,
+ url.c_str(),
+ subPool.getPool()),
+ NULL);
+
+ jstring jrel_path = JNIUtil::makeJString(rel_path);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jrel_path;
+}
+
+jstring
+RemoteSession::getReposUUID()
+{
+ SVN::Pool subPool(pool);
+ const char * uuid;
+ SVN_JNI_ERR(svn_ra_get_uuid2(m_session, &uuid, subPool.getPool()), NULL);
+
+ jstring juuid = JNIUtil::makeJString(uuid);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return juuid;
+}
+
+jstring
+RemoteSession::getReposRootUrl()
+{
+ SVN::Pool subPool(pool);
+ const char* url;
+ SVN_JNI_ERR(svn_ra_get_repos_root2(m_session, &url, subPool.getPool()),
+ NULL);
+
+ jstring jurl = JNIUtil::makeJString(url);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jurl;
+}
+
+jlong
+RemoteSession::getLatestRevision()
+{
+ SVN::Pool subPool(pool);
+ svn_revnum_t rev;
+ SVN_JNI_ERR(svn_ra_get_latest_revnum(m_session, &rev, subPool.getPool()),
+ SVN_INVALID_REVNUM);
+ return rev;
+}
+
+jlong
+RemoteSession::getRevisionByTimestamp(jlong timestamp)
+{
+ SVN::Pool subPool(pool);
+ svn_revnum_t rev;
+ SVN_JNI_ERR(svn_ra_get_dated_revision(m_session, &rev,
+ apr_time_t(timestamp),
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+ return rev;
+}
+
+namespace {
+svn_string_t*
+byte_array_to_svn_string(JNIByteArray& ary, SVN::Pool& scratch_pool)
+{
+ if (ary.isNull())
+ return NULL;
+ return svn_string_ncreate(reinterpret_cast<const char*>(ary.getBytes()),
+ ary.getLength(), scratch_pool.getPool());
+}
+} // anonymous namespace
+
+void
+RemoteSession::changeRevisionProperty(
+ jlong jrevision, jstring jname,
+ jbyteArray jold_value, jbyteArray jvalue)
+{
+ JNIStringHolder name(jname);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ JNIByteArray old_value(jold_value);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ JNIByteArray value(jvalue);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ svn_string_t* const* p_old_value = NULL;
+ svn_string_t* const str_old_value =
+ byte_array_to_svn_string(old_value, subPool);
+ if (str_old_value)
+ p_old_value = &str_old_value;
+
+ SVN_JNI_ERR(svn_ra_change_rev_prop2(m_session,
+ svn_revnum_t(jrevision),
+ name, p_old_value,
+ byte_array_to_svn_string(value, subPool),
+ subPool.getPool()), );
+}
+
+jobject
+RemoteSession::getRevisionProperties(jlong jrevision)
+{
+ SVN::Pool subPool(pool);
+ apr_hash_t *props;
+ SVN_JNI_ERR(svn_ra_rev_proplist(m_session, svn_revnum_t(jrevision),
+ &props, subPool.getPool()),
+ NULL);
+
+ return CreateJ::PropertyMap(props, subPool.getPool());
+}
+
+jbyteArray
+RemoteSession::getRevisionProperty(jlong jrevision, jstring jname)
+{
+ JNIStringHolder name(jname);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ SVN::Pool subPool(pool);
+ svn_string_t *propval;
+ SVN_JNI_ERR(svn_ra_rev_prop(m_session, svn_revnum_t(jrevision),
+ name, &propval, subPool.getPool()),
+ NULL);
+
+ return JNIUtil::makeJByteArray(propval);
+}
+
+jlong
+RemoteSession::getFile(jlong jrevision, jstring jpath,
+ jobject jcontents, jobject jproperties)
+{
+ OutputStream contents_proxy(jcontents);
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+ SVN_JNI_ERR(path.error_occurred(), SVN_INVALID_REVNUM);
+
+ apr_hash_t* props = NULL;
+ svn_revnum_t fetched_rev = svn_revnum_t(jrevision);
+ svn_stream_t* contents = (!jcontents ? NULL
+ : contents_proxy.getStream(subPool));
+
+ SVN_JNI_ERR(svn_ra_get_file(m_session, path.c_str(), fetched_rev,
+ contents, &fetched_rev,
+ (jproperties ? &props : NULL),
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+
+ if (jproperties)
+ {
+ CreateJ::FillPropertyMap(jproperties, props, subPool.getPool());
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+ }
+
+ return fetched_rev;
+}
+
+namespace {
+void fill_dirents(const char* base_url, const char* base_relpath,
+ jobject jdirents, apr_hash_t* dirents,
+ apr_pool_t* scratch_pool)
+{
+ if (!dirents)
+ return;
+
+ base_url = apr_pstrcat(scratch_pool, base_url, "/", base_relpath, NULL);
+ base_url = svn_uri_canonicalize(base_url, scratch_pool);
+ svn_stringbuf_t* abs_path = svn_stringbuf_create(base_url, scratch_pool);
+ svn_stringbuf_appendbyte(abs_path, '/');
+ const apr_size_t base_len = abs_path->len;
+
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ // We have no way of knowing the exact type of `dirents' in advance
+ // so we cannot remember the "put" method ID across calls.
+ jmethodID put_mid =
+ env->GetMethodID(env->GetObjectClass(jdirents), "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;)"
+ "Ljava/lang/Object;");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ static jfieldID path_fid = 0;
+ if (path_fid == 0)
+ {
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/DirEntry"));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ path_fid = env->GetFieldID(clazz, "path", "Ljava/lang/String;");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+ }
+
+ for (apr_hash_index_t* hi = apr_hash_first(scratch_pool, dirents);
+ hi; hi = apr_hash_next(hi))
+ {
+ const char* path;
+ svn_dirent_t* dirent;
+
+ const void *v_key;
+ void *v_val;
+
+ apr_hash_this(hi, &v_key, NULL, &v_val);
+ path = static_cast<const char*>(v_key);
+ dirent = static_cast<svn_dirent_t*>(v_val);
+ abs_path->len = base_len;
+ svn_stringbuf_appendcstr(abs_path, path);
+
+ jobject jdirent = CreateJ::DirEntry(path, abs_path->data, dirent);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ // Use the existing DirEntry.path field as the key
+ jstring jpath = jstring(env->GetObjectField(jdirent, path_fid));
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+
+ env->CallObjectMethod(jdirents, put_mid, jpath, jdirent);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NOTHING();
+ env->DeleteLocalRef(jdirent);
+ }
+
+ POP_AND_RETURN_NOTHING();
+}
+} // anonymous namespace
+
+jlong
+RemoteSession::getDirectory(jlong jrevision, jstring jpath,
+ jint jdirent_fields, jobject jdirents,
+ jobject jproperties)
+{
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+ SVN_JNI_ERR(path.error_occurred(), SVN_INVALID_REVNUM);
+
+ apr_hash_t* props = NULL;
+ apr_hash_t* dirents = NULL;
+ svn_revnum_t fetched_rev = svn_revnum_t(jrevision);
+
+ SVN_JNI_ERR(svn_ra_get_dir2(m_session, (jdirents ? &dirents : NULL),
+ &fetched_rev, (jproperties ? &props : NULL),
+ path.c_str(), fetched_rev,
+ apr_uint32_t(jdirent_fields),
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+
+ if (jdirents)
+ {
+ // We will construct the absolute path in the DirEntry objects
+ // from the session URL and directory relpath.
+ const char* base_url;
+ SVN_JNI_ERR(svn_ra_get_session_url(m_session, &base_url,
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+ fill_dirents(base_url, path.c_str(), jdirents, dirents,
+ subPool.getPool());
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+ }
+
+ if (jproperties)
+ {
+ CreateJ::FillPropertyMap(jproperties, props, subPool.getPool());
+ if (JNIUtil::isExceptionThrown())
+ return SVN_INVALID_REVNUM;
+ }
+
+ return fetched_rev;
+}
+
+namespace {
+const apr_array_header_t*
+build_string_array(const Iterator& iter,
+ bool contains_relpaths, SVN::Pool& pool)
+{
+ apr_pool_t* result_pool = pool.getPool();
+ apr_array_header_t* array = apr_array_make(
+ result_pool, 0, sizeof(const char*));
+ while (iter.hasNext())
+ {
+ const char* element;
+ jstring jitem = (jstring)iter.next();
+ if (contains_relpaths)
+ {
+ Relpath item(jitem, pool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(item.error_occurred(), NULL);
+ element = apr_pstrdup(result_pool, item.c_str());
+ }
+ else
+ {
+ JNIStringHolder item(jitem);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ element = item.pstrdup(result_pool);
+ }
+ APR_ARRAY_PUSH(array, const char*) = element;
+ }
+ return array;
+}
+}
+
+jobject
+RemoteSession::getMergeinfo(jobject jpaths, jlong jrevision, jobject jinherit,
+ jboolean jinclude_descendants)
+{
+ Iterator paths_iter(jpaths);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ SVN::Pool subPool(pool);
+ const apr_array_header_t* paths =
+ build_string_array(paths_iter, true, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ svn_mergeinfo_catalog_t catalog;
+ SVN_JNI_ERR(svn_ra_get_mergeinfo(
+ m_session, &catalog, paths, svn_revnum_t(jrevision),
+ EnumMapper::toMergeinfoInheritance(jinherit),
+ bool(jinclude_descendants),
+ subPool.getPool()),
+ NULL);
+ if (catalog == NULL)
+ return NULL;
+
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->FindClass("java/util/HashMap");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ static jmethodID ctor_mid = 0;
+ if (0 == ctor_mid)
+ {
+ ctor_mid = env->GetMethodID(cls, "<init>", "()V");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ static jmethodID put_mid = 0;
+ if (0 == put_mid)
+ {
+ put_mid = env->GetMethodID(cls, "put",
+ "(Ljava/lang/Object;"
+ "Ljava/lang/Object;)"
+ "Ljava/lang/Object;");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ jobject jcatalog = env->NewObject(cls, ctor_mid);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ for (apr_hash_index_t* hi = apr_hash_first(subPool.getPool(), catalog);
+ hi; hi = apr_hash_next(hi))
+ {
+ const void *v_key;
+ void *v_val;
+ apr_hash_this(hi, &v_key, NULL, &v_val);
+ const char* key = static_cast<const char*>(v_key);
+ svn_mergeinfo_t val = static_cast<svn_mergeinfo_t>(v_val);
+
+ jstring jpath = JNIUtil::makeJString(key);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ jobject jmergeinfo = CreateJ::Mergeinfo(val, subPool.getPool());
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ env->CallObjectMethod(jcatalog, put_mid, jpath, jmergeinfo);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(jmergeinfo);
+ }
+
+ return jcatalog;
+}
+
+// TODO: update
+// TODO: switch
+
+namespace {
+svn_error_t*
+status_unlock_func(void* baton, const char* path, apr_pool_t* scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) status_unlock_func('%s')\n", path);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+status_fetch_props_func(apr_hash_t **props, void *baton,
+ const char *path, svn_revnum_t base_revision,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) status_fetch_props_func('%s', r%lld)\n",
+ //DEBUG: path, static_cast<long long>(base_revision));
+ *props = apr_hash_make(result_pool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+status_fetch_base_func(const char **filename, void *baton,
+ const char *path, svn_revnum_t base_revision,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) status_fetch_base_func('%s', r%lld)\n",
+ //DEBUG: path, static_cast<long long>(base_revision));
+ *filename = NULL;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+status_start_edit_func(void* baton, svn_revnum_t start_revision)
+{
+ //DEBUG:fprintf(stderr, " (n) status_start_edit_func(r%lld)\n",
+ //DEBUG: static_cast<long long>(start_revision));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+status_target_revision_func(void* baton, svn_revnum_t target_revision,
+ apr_pool_t* scratch_pool)
+{
+ //DEBUG:fprintf(stderr, " (n) status_target_revision_func(r%lld)\n",
+ //DEBUG: static_cast<long long>(target_revision));
+ *static_cast<svn_revnum_t*>(baton) = target_revision;
+ return SVN_NO_ERROR;
+}
+
+const EditorProxyCallbacks template_status_editor_callbacks = {
+ status_unlock_func,
+ status_fetch_props_func,
+ status_fetch_base_func,
+ { status_start_edit_func, status_target_revision_func, NULL },
+ NULL
+};
+} // anonymous namespace
+
+void
+RemoteSession::status(jobject jthis, jstring jstatus_target,
+ jlong jrevision, jobject jdepth,
+ jobject jstatus_editor, jobject jreporter)
+{
+ StateReporter *rp = StateReporter::getCppObject(jreporter);
+ CPPADDR_NULL_PTR(rp,);
+
+ SVN::Pool scratchPool(rp->get_report_pool());
+ Relpath status_target(jstatus_target, scratchPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ apr_pool_t* scratch_pool = scratchPool.getPool();
+ const char* repos_root_url;
+ SVN_JNI_ERR(svn_ra_get_repos_root2(m_session, &repos_root_url,
+ scratch_pool),);
+ const char* session_root_url;
+ SVN_JNI_ERR(svn_ra_get_session_url(m_session, &session_root_url,
+ scratch_pool),);
+ const char* base_relpath;
+ SVN_JNI_ERR(svn_ra_get_path_relative_to_root(m_session, &base_relpath,
+ session_root_url,
+ scratch_pool),);
+
+ EditorProxyCallbacks proxy_callbacks =
+ template_status_editor_callbacks;
+ proxy_callbacks.m_extra_baton.baton = &rp->m_target_revision;
+
+ apr_pool_t* report_pool = rp->get_report_pool();
+ std::auto_ptr<EditorProxy> editor(
+ new EditorProxy(jstatus_editor, report_pool,
+ repos_root_url, base_relpath,
+ m_context->checkCancel, m_context,
+ proxy_callbacks));
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ const svn_ra_reporter3_t* raw_reporter;
+ void* report_baton;
+ SVN_JNI_ERR(svn_ra_do_status2(m_session,
+ &raw_reporter, &report_baton,
+ status_target.c_str(),
+ svn_revnum_t(jrevision),
+ EnumMapper::toDepth(jdepth),
+ editor->delta_editor(),
+ editor->delta_baton(),
+ report_pool),);
+ rp->set_reporter_data(raw_reporter, report_baton, editor.release());
+}
+
+// TODO: diff
+
+void
+RemoteSession::getLog(jobject jpaths,
+ jlong jstartrev, jlong jendrev, jint jlimit,
+ jboolean jstrict_node_history,
+ jboolean jdiscover_changed_paths,
+ jboolean jinclude_merged_revisions,
+ jobject jrevprops, jobject jlog_callback)
+{
+ Iterator pathiter(jpaths);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ Iterator revpropiter(jrevprops);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ LogMessageCallback receiver(jlog_callback);
+
+ SVN::Pool subPool(pool);
+ const apr_array_header_t* paths = build_string_array(pathiter,
+ true, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ const apr_array_header_t* revprops = (jrevprops != NULL)
+ ? build_string_array(revpropiter,
+ false, subPool)
+ : NULL;
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(svn_ra_get_log2(m_session, paths,
+ svn_revnum_t(jstartrev), svn_revnum_t(jendrev),
+ int(jlimit),
+ bool(jdiscover_changed_paths),
+ bool(jstrict_node_history),
+ bool(jinclude_merged_revisions),
+ revprops,
+ receiver.callback, &receiver,
+ subPool.getPool()),);
+}
+
+jobject
+RemoteSession::checkPath(jstring jpath, jlong jrevision)
+{
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(path.error_occurred(), NULL);
+
+ svn_node_kind_t kind;
+ SVN_JNI_ERR(svn_ra_check_path(m_session, path.c_str(),
+ svn_revnum_t(jrevision),
+ &kind, subPool.getPool()),
+ NULL);
+
+ return EnumMapper::mapNodeKind(kind);
+}
+
+jobject
+RemoteSession::stat(jstring jpath, jlong jrevision)
+{
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(path.error_occurred(), NULL);
+
+ svn_dirent_t* dirent;
+ SVN_JNI_ERR(svn_ra_stat(m_session, path.c_str(),
+ svn_revnum_t(jrevision),
+ &dirent, subPool.getPool()),
+ NULL);
+
+ if (dirent)
+ return CreateJ::DirEntry(path.c_str(), path.c_str(), dirent);
+ return NULL;
+}
+
+namespace {
+apr_array_header_t*
+long_iterable_to_revnum_array(jobject jlong_iterable, apr_pool_t* pool)
+{
+
+ JNIEnv* env = JNIUtil::getEnv();
+
+ jclass cls = env->FindClass("java/lang/Long");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ static jmethodID mid = 0;
+ if (0 == mid)
+ {
+ mid = env->GetMethodID(cls, "longValue", "()J");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ apr_array_header_t* array = apr_array_make(pool, 0, sizeof(svn_revnum_t));
+ Iterator iter(jlong_iterable);
+ while (iter.hasNext())
+ {
+ const jlong entry = env->CallLongMethod(iter.next(), mid);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ APR_ARRAY_PUSH(array, svn_revnum_t) = svn_revnum_t(entry);
+ }
+ return array;
+}
+
+jobject
+location_hash_to_map(apr_hash_t* locations, apr_pool_t* scratch_pool)
+{
+ JNIEnv* env = JNIUtil::getEnv();
+
+ jclass long_cls = env->FindClass("java/lang/Long");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ static jmethodID long_ctor = 0;
+ if (0 == long_ctor)
+ {
+ long_ctor = env->GetMethodID(long_cls, "<init>", "(J)V");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ jclass hash_cls = env->FindClass("java/util/HashMap");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ static jmethodID hash_ctor = 0;
+ if (0 == hash_ctor)
+ {
+ hash_ctor = env->GetMethodID(hash_cls, "<init>", "()V");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ static jmethodID hash_put = 0;
+ if (0 == hash_put)
+ {
+ hash_put = env->GetMethodID(hash_cls, "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;"
+ ")Ljava/lang/Object;");
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ }
+
+ jobject result = env->NewObject(hash_cls, hash_ctor);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ if (!locations)
+ return result;
+
+ for (apr_hash_index_t* hi = apr_hash_first(scratch_pool, locations);
+ hi; hi = apr_hash_next(hi))
+ {
+ const void* key;
+ void* val;
+
+ apr_hash_this(hi, &key, NULL, &val);
+
+ jobject jkey = env->NewObject(
+ long_cls, long_ctor, jlong(*static_cast<const svn_revnum_t*>(key)));
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ jstring jval = JNIUtil::makeJString(static_cast<const char*>(val));
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ env->CallObjectMethod(result, hash_put, jkey, jval);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ env->DeleteLocalRef(jkey);
+ env->DeleteLocalRef(jval);
+ }
+
+ return result;
+}
+} // anonymous namespace
+
+jobject
+RemoteSession::getLocations(jstring jpath, jlong jpeg_revision,
+ jobject jlocation_revisions)
+{
+ if (!jpath || !jlocation_revisions)
+ return NULL;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(path.error_occurred(), NULL);
+
+ apr_array_header_t* location_revisions =
+ long_iterable_to_revnum_array(jlocation_revisions, subPool.getPool());
+ if (!location_revisions)
+ return NULL;
+
+ apr_hash_t* locations;
+ SVN_JNI_ERR(svn_ra_get_locations(m_session, &locations,
+ path.c_str(), svn_revnum_t(jpeg_revision),
+ location_revisions, subPool.getPool()),
+ NULL);
+ return location_hash_to_map(locations, subPool.getPool());
+}
+
+namespace {
+class LocationSegmentHandler
+{
+public:
+ static svn_error_t* callback(svn_location_segment_t* segment,
+ void* baton, apr_pool_t*)
+ {
+ LocationSegmentHandler* const self =
+ static_cast<LocationSegmentHandler*>(baton);
+ SVN_ERR_ASSERT(self->m_jcallback != NULL);
+ self->call(segment);
+ SVN_ERR(JNIUtil::checkJavaException(SVN_ERR_BASE));
+ return SVN_NO_ERROR;
+ }
+
+ LocationSegmentHandler(jobject jcallback)
+ : m_jcallback(jcallback),
+ m_call_mid(0)
+ {
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->GetObjectClass(jcallback);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_call_mid = env->GetMethodID(
+ cls, "doSegment", "(" JAVAHL_ARG("/ISVNRemote$LocationSegment;") ")V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+private:
+ void call(svn_location_segment_t* segment)
+ {
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->FindClass(JAVAHL_CLASS("/ISVNRemote$LocationSegment"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ mid = env->GetMethodID(cls, "<init>",
+ "(Ljava/lang/String;JJ)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jstring jpath = JNIUtil::makeJString(segment->path);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ env->CallVoidMethod(m_jcallback, m_call_mid,
+ env->NewObject(cls, mid, jpath,
+ jlong(segment->range_start),
+ jlong(segment->range_end)));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ env->DeleteLocalRef(jpath);
+ }
+
+ jobject m_jcallback;
+ jmethodID m_call_mid;
+};
+} // anonymous namespace
+
+void
+RemoteSession::getLocationSegments(jstring jpath, jlong jpeg_revision,
+ jlong jstart_revision, jlong jend_revision,
+ jobject jcallback)
+{
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(path.error_occurred(), );
+
+ LocationSegmentHandler handler(jcallback);
+ if (JNIUtil::isExceptionThrown())
+ return ;
+
+ SVN_JNI_ERR(svn_ra_get_location_segments(m_session, path.c_str(),
+ svn_revnum_t(jpeg_revision),
+ svn_revnum_t(jstart_revision),
+ svn_revnum_t(jend_revision),
+ handler.callback, &handler,
+ subPool.getPool()),);
+}
+
+namespace {
+class FileRevisionHandler
+{
+public:
+ static svn_error_t* callback(void* baton,
+ const char* path, svn_revnum_t revision,
+ apr_hash_t* revision_props,
+ // We ignore the deltas as they're not
+ // exposed in the JavaHL API.
+ svn_boolean_t result_of_merge,
+ svn_txdelta_window_handler_t* delta_handler,
+ void** delta_handler_baton,
+ apr_array_header_t* prop_diffs,
+ apr_pool_t* scratch_pool)
+ {
+ if (delta_handler)
+ *delta_handler = svn_delta_noop_window_handler;
+ if (delta_handler_baton)
+ *delta_handler_baton = NULL;
+
+ FileRevisionHandler* const self =
+ static_cast<FileRevisionHandler*>(baton);
+ SVN_ERR_ASSERT(self->m_jcallback != NULL);
+ self->call(path, revision, revision_props,
+ result_of_merge, prop_diffs,
+ (delta_handler != NULL),
+ scratch_pool);
+ SVN_ERR(JNIUtil::checkJavaException(SVN_ERR_BASE));
+ return SVN_NO_ERROR;
+ }
+
+ FileRevisionHandler(jobject jcallback)
+ : m_jcallback(jcallback),
+ m_call_mid(0)
+ {
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->GetObjectClass(jcallback);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_call_mid = env->GetMethodID(
+ cls, "doRevision", "(" JAVAHL_ARG("/ISVNRemote$FileRevision;") ")V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+private:
+ void call(const char* path, svn_revnum_t revision,
+ apr_hash_t* revision_props,
+ svn_boolean_t result_of_merge,
+ apr_array_header_t* prop_diffs,
+ svn_boolean_t has_text_delta,
+ apr_pool_t* scratch_pool)
+ {
+ JNIEnv* env = JNIUtil::getEnv();
+ jclass cls = env->FindClass(JAVAHL_CLASS("/ISVNRemote$FileRevision"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ mid = env->GetMethodID(cls, "<init>",
+ "(Ljava/lang/String;JZ"
+ "Ljava/util/Map;Ljava/util/Map;Z)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jstring jpath = JNIUtil::makeJString(path);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ jobject jrevprops = CreateJ::PropertyMap(revision_props, scratch_pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ jobject jpropdelta = CreateJ::PropertyMap(prop_diffs, scratch_pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ env->CallVoidMethod(m_jcallback, m_call_mid,
+ env->NewObject(cls, mid, jpath, jlong(revision),
+ jboolean(result_of_merge),
+ jrevprops, jpropdelta,
+ jboolean(has_text_delta)));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(jrevprops);
+ env->DeleteLocalRef(jpropdelta);
+ }
+
+ jobject m_jcallback;
+ jmethodID m_call_mid;
+};
+} // anonymous namespace
+
+void
+RemoteSession::getFileRevisions(jstring jpath,
+ jlong jstart_revision, jlong jend_revision,
+ jboolean jinclude_merged_revisions,
+ jobject jcallback)
+{
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ SVN_JNI_ERR(path.error_occurred(), );
+
+ FileRevisionHandler handler(jcallback);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(svn_ra_get_file_revs2(m_session, path.c_str(),
+ svn_revnum_t(jstart_revision),
+ svn_revnum_t(jend_revision),
+ bool(jinclude_merged_revisions),
+ handler.callback, &handler,
+ subPool.getPool()),);
+}
+
+// TODO: lock
+// TODO: unlock
+// TODO: getLock
+
+jobject
+RemoteSession::getLocks(jstring jpath, jobject jdepth)
+{
+ svn_depth_t depth = EnumMapper::toDepth(jdepth);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+ SVN_JNI_ERR(path.error_occurred(), NULL);
+
+ apr_hash_t *locks;
+ SVN_JNI_ERR(svn_ra_get_locks2(m_session, &locks, path.c_str(), depth,
+ subPool.getPool()),
+ NULL);
+
+ return CreateJ::LockMap(locks, subPool.getPool());
+}
+
+// TODO: replayRange
+// TODO: replay
+// TODO: getDeletedRevision
+// TODO: getInheritedProperties
+
+jboolean
+RemoteSession::hasCapability(jstring jcapability)
+{
+ JNIStringHolder capability(jcapability);
+ if (JNIUtil::isExceptionThrown())
+ return false;
+
+ SVN::Pool subPool(pool);
+ svn_boolean_t has;
+ SVN_JNI_ERR(svn_ra_has_capability(m_session, &has, capability,
+ subPool.getPool()),
+ false);
+
+ return jboolean(has);
+}
diff --git a/subversion/bindings/javahl/native/RemoteSession.h b/subversion/bindings/javahl/native/RemoteSession.h
new file mode 100644
index 0000000..26ca402
--- /dev/null
+++ b/subversion/bindings/javahl/native/RemoteSession.h
@@ -0,0 +1,128 @@
+/**
+ * @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 RemoteSession.h
+ * @brief Interface of the class RemoteSession
+ */
+
+#ifndef JAVAHL_REMOTE_SESSION_H
+#define JAVAHL_REMOTE_SESSION_H
+
+#include <jni.h>
+
+#include "svn_ra.h"
+
+#include "SVNBase.h"
+#include "RemoteSessionContext.h"
+#include "Prompter.h"
+
+class CommitEditor;
+
+/*
+ * This class wraps Ra based operations from svn_ra.h
+ */
+class RemoteSession : public SVNBase
+{
+ public:
+ static RemoteSession* getCppObject(jobject jthis);
+ static jobject open(jint jretryAttempts,
+ jstring jurl, jstring juuid,
+ jstring jconfigDirectory,
+ jstring jusername, jstring jpassword,
+ jobject jprompter, jobject jdeprecatedPrompter,
+ jobject jprogress, jobject jcfgcb, jobject jtunnelcb);
+ static jobject open(jint jretryAttempts,
+ const char* url, const char* uuid,
+ const char* configDirectory,
+ const char* username, const char* password,
+ Prompter::UniquePtr prompter, jobject jprogress,
+ jobject jcfgcb, jobject jtunnelcb);
+ ~RemoteSession();
+
+ void cancelOperation() const { m_context->cancelOperation(); }
+
+ virtual void dispose(jobject jthis);
+
+ void reparent(jstring jurl);
+ jstring getSessionUrl();
+ jstring getSessionRelativePath(jstring jurl);
+ jstring getReposRelativePath(jstring jurl);
+ jstring getReposUUID();
+ jstring getReposRootUrl();
+ jlong getLatestRevision();
+ jlong getRevisionByTimestamp(jlong jtimestamp);
+ void changeRevisionProperty(jlong jrevision, jstring jname,
+ jbyteArray jold_value,
+ jbyteArray jvalue);
+ jobject getRevisionProperties(jlong jrevision);
+ jbyteArray getRevisionProperty(jlong jrevision, jstring jname);
+ jlong getFile(jlong jrevision, jstring jpath,
+ jobject jcontents, jobject jproperties);
+ jlong getDirectory(jlong jrevision, jstring jpath, jint jdirent_fields,
+ jobject jdirents, jobject jproperties);
+ jobject getMergeinfo(jobject jpaths, jlong jrevision, jobject jinherit,
+ jboolean jinclude_descendants);
+ // TODO: update
+ // TODO: switch
+ void status(jobject jthis, jstring jstatus_target,
+ jlong jrevision, jobject jdepth,
+ jobject jstatus_editor, jobject jreporter);
+ // TODO: diff
+ void getLog(jobject jpaths, jlong jstartrev, jlong jendrev, jint jlimit,
+ jboolean jstrict_node_history, jboolean jdiscover_changed_paths,
+ jboolean jinclude_merged_revisions,
+ jobject jrevprops, jobject jlog_callback);
+ jobject checkPath(jstring jpath, jlong jrevision);
+ jobject stat(jstring jpath, jlong jrevision);
+ jobject getLocations(jstring jpath, jlong jpeg_revision,
+ jobject jlocation_revisions);
+ void getLocationSegments(jstring jpath, jlong jpeg_revision,
+ jlong jstart_revision, jlong jend_revision,
+ jobject jcallback);
+ void getFileRevisions(jstring jpath,
+ jlong jstart_revision, jlong jend_revision,
+ jboolean jinclude_merged_revisions,
+ jobject jcallback);
+ // TODO: getFileRevisions
+ // TODO: lock
+ // TODO: unlock
+ // TODO: getLock
+ jobject getLocks(jstring jpath, jobject jdepth);
+ // TODO: replayRange
+ // TODO: replay
+ // TODO: getDeletedRevision
+ // TODO: getInheritedProperties
+ jboolean hasCapability(jstring capability);
+
+ private:
+ friend class CommitEditor;
+ RemoteSession(int retryAttempts,
+ const char* url, const char* uuid,
+ const char* configDirectory,
+ const char* username, const char* password,
+ Prompter::UniquePtr prompter, jobject jcfgcb, jobject jtunnelcb);
+
+ svn_ra_session_t* m_session;
+ RemoteSessionContext* m_context;
+};
+
+#endif // JAVAHL_REMOTE_SESSION_H
diff --git a/subversion/bindings/javahl/native/RemoteSessionContext.cpp b/subversion/bindings/javahl/native/RemoteSessionContext.cpp
new file mode 100644
index 0000000..e4b86e1
--- /dev/null
+++ b/subversion/bindings/javahl/native/RemoteSessionContext.cpp
@@ -0,0 +1,125 @@
+/**
+ * @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 RemoteSessionContext.cpp
+ * @brief Implementation of the class RemoteSessionContext
+ */
+
+
+#include "RemoteSessionContext.h"
+#include "JNIUtil.h"
+#include "Prompter.h"
+
+
+RemoteSessionContext::RemoteSessionContext(
+ SVN::Pool &pool, const char* configDirectory,
+ const char* usernameStr, const char* passwordStr,
+ Prompter::UniquePtr prompter, jobject jcfgcb, jobject jtunnelcb)
+ : OperationContext(pool), m_raCallbacks(NULL)
+{
+ setConfigDirectory(configDirectory);
+ if (usernameStr != NULL)
+ username(usernameStr);
+
+ if (passwordStr != NULL)
+ password(passwordStr);
+
+ setPrompt(prompter);
+ setConfigEventHandler(jcfgcb);
+ setTunnelCallback(jtunnelcb);
+
+ /*
+ * Setup callbacks
+ */
+ SVN_JNI_ERR(svn_ra_create_callbacks(&m_raCallbacks, m_pool->getPool()), );
+
+ m_raCallbacks->auth_baton = getAuthBaton(pool);
+ m_raCallbacks->cancel_func = checkCancel;
+ m_raCallbacks->get_client_string = clientName;
+ m_raCallbacks->progress_baton = NULL;
+ m_raCallbacks->progress_func = progress;
+
+ /*
+ * JNI RA layer does not work with WC so all WC callbacks are set to NULL
+ */
+ m_raCallbacks->get_wc_prop = NULL;
+ m_raCallbacks->invalidate_wc_props = NULL;
+ m_raCallbacks->push_wc_prop = NULL;
+ m_raCallbacks->set_wc_prop = NULL;
+
+ /*
+ * Don't set deprecated callback
+ */
+ m_raCallbacks->open_tmp_file = NULL;
+
+ if (m_jtunnelcb)
+ {
+ m_raCallbacks->check_tunnel_func = checkTunnel;
+ m_raCallbacks->open_tunnel_func = openTunnel;
+ m_raCallbacks->tunnel_baton = m_jtunnelcb;
+ }
+}
+
+RemoteSessionContext::~RemoteSessionContext()
+{
+}
+
+void RemoteSessionContext::activate(jobject jremoteSession, jobject jprogress)
+{
+ /*
+ * Attach session context java object
+ */
+ static jfieldID ctxFieldID = 0;
+ attachJavaObject(jremoteSession,
+ JAVAHL_ARG("/remote/RemoteSession$RemoteSessionContext;"),
+ "sessionContext", &ctxFieldID);
+
+ /*
+ * Set the progress callback
+ */
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jclass clazz = env->GetObjectClass(m_jctx);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ jmethodID mid = env->GetMethodID(
+ clazz, "setProgressCallback",
+ "(" JAVAHL_ARG("/callback/ProgressCallback;") ")V");
+ if (JNIUtil::isJavaExceptionThrown() || mid == 0)
+ return;
+
+ env->CallVoidMethod(m_jctx, mid, jprogress);
+ m_raCallbacks->progress_baton = m_jctx;
+}
+
+void *
+RemoteSessionContext::getCallbackBaton()
+{
+ return this;
+}
+
+svn_ra_callbacks2_t *
+RemoteSessionContext::getCallbacks()
+{
+ return m_raCallbacks;
+}
diff --git a/subversion/bindings/javahl/native/RemoteSessionContext.h b/subversion/bindings/javahl/native/RemoteSessionContext.h
new file mode 100644
index 0000000..8c569a1
--- /dev/null
+++ b/subversion/bindings/javahl/native/RemoteSessionContext.h
@@ -0,0 +1,51 @@
+/**
+ * @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 RemoteSessionContext.h
+ * @brief Interface of the class RemoteSessionContext
+ */
+
+#ifndef JAVAHL_REMOTE_SESSION_CONTEXT_H
+#define JAVAHL_REMOTE_SESSION_CONTEXT_H
+
+#include "svn_ra.h"
+
+#include "OperationContext.h"
+
+class RemoteSessionContext : public OperationContext
+{
+ public:
+ RemoteSessionContext(SVN::Pool &pool,
+ const char* jconfigDirectory,
+ const char* jusername, const char* jpassword,
+ std::auto_ptr<Prompter> prompter,
+ jobject jcfgcb, jobject jtunnelcb);
+ virtual ~RemoteSessionContext();
+ void activate(jobject jremoteSession, jobject jprogress);
+ void * getCallbackBaton();
+ svn_ra_callbacks2_t* getCallbacks();
+
+ private:
+ svn_ra_callbacks2_t* m_raCallbacks;
+};
+
+#endif /* JAVAHL_REMOTE_SESSION_CONTEXT_H */
diff --git a/subversion/bindings/javahl/native/ReposFreezeAction.cpp b/subversion/bindings/javahl/native/ReposFreezeAction.cpp
index 8c1cb7e..78f307f 100644
--- a/subversion/bindings/javahl/native/ReposFreezeAction.cpp
+++ b/subversion/bindings/javahl/native/ReposFreezeAction.cpp
@@ -39,7 +39,7 @@ svn_error_t* ReposFreezeAction::invoke()
static volatile jmethodID mid = 0;
if (!mid)
{
- jclass cls = env->FindClass(JAVA_PACKAGE"/callback/ReposFreezeAction");
+ jclass cls = env->FindClass(JAVAHL_CLASS("/callback/ReposFreezeAction"));
if (!JNIUtil::isJavaExceptionThrown())
mid = env->GetMethodID(cls, "invoke", "()V");
}
diff --git a/subversion/bindings/javahl/native/ReposNotifyCallback.cpp b/subversion/bindings/javahl/native/ReposNotifyCallback.cpp
index a716653..1237d13 100644
--- a/subversion/bindings/javahl/native/ReposNotifyCallback.cpp
+++ b/subversion/bindings/javahl/native/ReposNotifyCallback.cpp
@@ -69,12 +69,12 @@ ReposNotifyCallback::onNotify(const svn_repos_notify_t *wcNotify,
static jmethodID mid = 0;
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ReposNotifyCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ReposNotifyCallback"));
if (JNIUtil::isJavaExceptionThrown())
return;
mid = env->GetMethodID(clazz, "onNotify",
- "(L"JAVA_PACKAGE"/ReposNotifyInformation;)V");
+ "(" JAVAHL_ARG("/ReposNotifyInformation;") ")V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
return;
diff --git a/subversion/bindings/javahl/native/ReposVerifyCallback.cpp b/subversion/bindings/javahl/native/ReposVerifyCallback.cpp
new file mode 100644
index 0000000..1fb6ecd
--- /dev/null
+++ b/subversion/bindings/javahl/native/ReposVerifyCallback.cpp
@@ -0,0 +1,88 @@
+/**
+ * @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 ReposVerifyCallback.cpp
+ * @brief Implementation of the class ReposVerifyCallback
+ */
+
+#include "ReposVerifyCallback.h"
+#include "JNIUtil.h"
+
+ReposVerifyCallback::ReposVerifyCallback(jobject jverify_cb)
+ : m_jverify_cb(jverify_cb)
+{}
+
+ReposVerifyCallback::~ReposVerifyCallback()
+{
+ // Don't need to destroy the reference, since it was given us by Java
+}
+
+svn_error_t *
+ReposVerifyCallback::callback(void *baton,
+ svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool)
+{
+ if (!baton)
+ return SVN_NO_ERROR;
+
+ static_cast<ReposVerifyCallback*>(baton)
+ ->onVerifyError(revision, verify_err, scratch_pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return JNIUtil::wrapJavaException();
+ return SVN_NO_ERROR;
+}
+
+void
+ReposVerifyCallback::onVerifyError(svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Java method id will not change during the time this library is
+ // loaded, so it can be cached.
+ static jmethodID mid = 0;
+ if (mid == 0)
+ {
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/ReposVerifyCallback"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ mid = env->GetMethodID(clazz, "onVerifyError",
+ "(J" JAVAHL_ARG("/ClientException;") ")V");
+ if (JNIUtil::isJavaExceptionThrown() || mid == 0)
+ return;
+
+ env->DeleteLocalRef(clazz);
+ }
+
+ jthrowable jverify_err = NULL;
+ if (verify_err)
+ jverify_err = JNIUtil::createClientException(svn_error_dup(verify_err), NULL);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ env->CallVoidMethod(m_jverify_cb, mid, jlong(revision), jverify_err);
+ if (verify_err)
+ env->DeleteLocalRef(jverify_err);
+}
diff --git a/subversion/bindings/javahl/native/ReposVerifyCallback.h b/subversion/bindings/javahl/native/ReposVerifyCallback.h
new file mode 100644
index 0000000..a89d204
--- /dev/null
+++ b/subversion/bindings/javahl/native/ReposVerifyCallback.h
@@ -0,0 +1,75 @@
+/**
+ * @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 ReposVerifyCallback.h
+ * @brief Interface of the class ReposVerifyCallback
+ */
+
+#ifndef SVN_JAVAHL_REPOS_VERIFY_CALLBACK_H
+#define SVN_JAVAHL_REPOS_VERIFY_CALLBACK_H
+
+#include <jni.h>
+#include "svn_repos.h"
+
+/**
+ * This class passes notification from subversion to a Java object
+ * (1.2 version).
+ */
+class ReposVerifyCallback
+{
+ private:
+ /**
+ * The local reference to the Java object.
+ */
+ jobject m_jverify_cb;
+
+ public:
+ /**
+ * Create a new object and store the Java object.
+ * @param verify_cb global reference to the Java object
+ */
+ ReposVerifyCallback(jobject jverify_cb);
+
+ ~ReposVerifyCallback();
+
+ /**
+ * Implementation of the svn_repos_verify_callback_t API.
+ *
+ * @param baton Notification instance is passed using this parameter
+ * @param revision The revision that the error was emitted for
+ * @param verify_err The emitted error
+ * @param scratch_pool An APR pool from which to allocate memory.
+ */
+ static svn_error_t * callback(void *baton,
+ svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool);
+
+ /**
+ * Handler for Subversion notifications.
+ */
+ void onVerifyError(svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool);
+};
+
+#endif // SVN_JAVAHL_REPOS_VERIFY_CALLBACK_H
diff --git a/subversion/bindings/javahl/native/Revision.cpp b/subversion/bindings/javahl/native/Revision.cpp
index 7ba2094..d9e52f8 100644
--- a/subversion/bindings/javahl/native/Revision.cpp
+++ b/subversion/bindings/javahl/native/Revision.cpp
@@ -57,12 +57,12 @@ Revision::Revision(jobject jthis, bool headIfUnspecified,
static jfieldID fid = 0;
if (fid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/Revision");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Revision"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
fid = env->GetFieldID(clazz, "revKind",
- "L"JAVA_PACKAGE"/types/Revision$Kind;");
+ JAVAHL_ARG("/types/Revision$Kind;"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
}
@@ -81,7 +81,7 @@ Revision::Revision(jobject jthis, bool headIfUnspecified,
if (fidNum == 0)
{
jclass clazz =
- env->FindClass(JAVA_PACKAGE"/types/Revision$Number");
+ env->FindClass(JAVAHL_CLASS("/types/Revision$Number"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
@@ -99,7 +99,7 @@ Revision::Revision(jobject jthis, bool headIfUnspecified,
if (fidDate == 0)
{
jclass clazz =
- env->FindClass(JAVA_PACKAGE"/types/Revision$DateSpec");
+ env->FindClass(JAVAHL_CLASS("/types/Revision$DateSpec"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
@@ -158,7 +158,7 @@ jobject
Revision::makeJRevision(svn_revnum_t rev)
{
JNIEnv *env = JNIUtil::getEnv();
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/Revision");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Revision"));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
@@ -166,7 +166,7 @@ Revision::makeJRevision(svn_revnum_t rev)
if (getInstance == 0)
{
getInstance = env->GetStaticMethodID(clazz, "getInstance",
- "(J)L" JAVA_PACKAGE "/types/Revision;");
+ "(J)" JAVAHL_ARG("/types/Revision;"));
if (JNIUtil::isExceptionThrown())
return NULL;
}
diff --git a/subversion/bindings/javahl/native/Revision.h b/subversion/bindings/javahl/native/Revision.h
index bef87a9..d98a868 100644
--- a/subversion/bindings/javahl/native/Revision.h
+++ b/subversion/bindings/javahl/native/Revision.h
@@ -50,6 +50,7 @@ class Revision
* Make a Revision Java object.
*/
static jobject makeJRevision(svn_revnum_t rev);
+ static jobject makeJRevision(const svn_opt_revision_t& rev);
};
#endif // REVISION_H
diff --git a/subversion/bindings/javahl/native/RevisionRange.cpp b/subversion/bindings/javahl/native/RevisionRange.cpp
index 677c7d5..d1c8c64 100644
--- a/subversion/bindings/javahl/native/RevisionRange.cpp
+++ b/subversion/bindings/javahl/native/RevisionRange.cpp
@@ -44,60 +44,117 @@ RevisionRange::~RevisionRange()
// explicitly destroyed.
}
-const svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+namespace {
+void get_range_info(jobject jrange,
+ svn_opt_revision_t* range_start,
+ svn_opt_revision_t* range_end,
+ svn_boolean_t* range_inheritable)
{
JNIEnv *env = JNIUtil::getEnv();
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/RevisionRange");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/RevisionRange"));
if (JNIUtil::isExceptionThrown())
- return NULL;
+ return;
- static jmethodID fmid = 0;
- if (fmid == 0)
+ if (range_start)
{
- fmid = env->GetMethodID(clazz, "getFromRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+
+ static jmethodID fmid = 0;
+ if (fmid == 0)
+ {
+ fmid = env->GetMethodID(clazz, "getFromRevision",
+ "()" JAVAHL_ARG("/types/Revision;"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject jstartRevision = env->CallObjectMethod(jrange, fmid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ Revision startRevision(jstartRevision);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ *range_start = *startRevision.revision();
+ if (JNIUtil::isExceptionThrown())
+ return;
}
- static jmethodID tmid = 0;
- if (tmid == 0)
+ if (range_end)
{
- tmid = env->GetMethodID(clazz, "getToRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ static jmethodID tmid = 0;
+ if (tmid == 0)
+ {
+ tmid = env->GetMethodID(clazz, "getToRevision",
+ "()" JAVAHL_ARG("/types/Revision;"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject jendRevision = env->CallObjectMethod(jrange, tmid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ Revision endRevision(jendRevision);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ *range_end = *endRevision.revision();
+ if (JNIUtil::isExceptionThrown())
+ return;
}
- jobject jstartRevision = env->CallObjectMethod(m_range, fmid);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ if (range_inheritable)
+ {
+ static jmethodID imid = 0;
+ if (imid == 0 && range_inheritable)
+ {
+ imid = env->GetMethodID(clazz, "isInheritable", "()Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jboolean inheritable = env->CallBooleanMethod(jrange, imid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ *range_inheritable = inheritable;
+ }
+}
+} // anonymous namespace
- Revision startRevision(jstartRevision);
+svn_merge_range_t* RevisionRange::toMergeRange(SVN::Pool &pool) const
+{
+ svn_opt_revision_t range_start, range_end;
+ svn_boolean_t range_inheritable;
+ get_range_info(m_range, &range_start, &range_end, &range_inheritable);
if (JNIUtil::isExceptionThrown())
return NULL;
- jobject jendRevision = env->CallObjectMethod(m_range, tmid);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ if (range_start.kind != svn_opt_revision_number
+ || range_end.kind != svn_opt_revision_number)
+ JNIUtil::raiseThrowable("java.lang.InvalidStateException",
+ "Revsision ranges must contain revision numbers");
- Revision endRevision(jendRevision);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ svn_merge_range_t* range =
+ static_cast<svn_merge_range_t*>
+ (apr_palloc(pool.getPool(), sizeof(*range)));
+
+ range->start = range_start.value.number;
+ range->end = range_end.value.number;
+ range->inheritable = range_inheritable;
+ return range;
+}
+svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+{
svn_opt_revision_range_t *range =
- reinterpret_cast<svn_opt_revision_range_t *>
+ static_cast<svn_opt_revision_range_t *>
(apr_palloc(pool.getPool(), sizeof(*range)));
- range->start = *startRevision.revision();
- if (JNIUtil::isExceptionThrown())
- return NULL;
-
- range->end = *endRevision.revision();
+ get_range_info(m_range, &range->start, &range->end, NULL);
if (JNIUtil::isExceptionThrown())
- return NULL;
-
+ range = NULL;
return range;
}
@@ -106,19 +163,20 @@ RevisionRange::makeJRevisionRange(svn_merge_range_t *range)
{
JNIEnv *env = JNIUtil::getEnv();
- jclass rangeClazz = env->FindClass(JAVA_PACKAGE "/types/RevisionRange");
+ jclass rangeClazz = env->FindClass(JAVAHL_CLASS("/types/RevisionRange"));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
static jmethodID rangeCtor = 0;
if (rangeCtor == 0)
{
- rangeCtor = env->GetMethodID(rangeClazz, "<init>", "(JJ)V");
+ rangeCtor = env->GetMethodID(rangeClazz, "<init>", "(JJZ)V");
if (JNIUtil::isJavaExceptionThrown())
return NULL;
}
jobject jrange = env->NewObject(rangeClazz, rangeCtor,
- (jlong) range->start,
- (jlong) range->end);
+ jlong(range->start),
+ jlong(range->end),
+ jboolean(range->inheritable));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
diff --git a/subversion/bindings/javahl/native/RevisionRange.h b/subversion/bindings/javahl/native/RevisionRange.h
index f932c1b..9934894 100644
--- a/subversion/bindings/javahl/native/RevisionRange.h
+++ b/subversion/bindings/javahl/native/RevisionRange.h
@@ -29,6 +29,7 @@
#include <jni.h>
#include "svn_types.h"
+#include "svn_opt.h"
#include "Pool.h"
@@ -53,7 +54,12 @@ class RevisionRange
/**
* Return an svn_opt_revision_range_t.
*/
- const svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+ svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+
+ /**
+ * Return an svn_merge_range_t.
+ */
+ svn_merge_range_t* toMergeRange(SVN::Pool &pool) const;
/**
* Make a (single) RevisionRange Java object.
diff --git a/subversion/bindings/javahl/native/RevisionRangeList.cpp b/subversion/bindings/javahl/native/RevisionRangeList.cpp
new file mode 100644
index 0000000..3759e5f
--- /dev/null
+++ b/subversion/bindings/javahl/native/RevisionRangeList.cpp
@@ -0,0 +1,128 @@
+/**
+ * @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 RevisionRangeList.cpp
+ * @brief Implementat of the class RevisionRangeList
+ */
+
+#include "JNIUtil.h"
+#include "Iterator.h"
+#include "RevisionRange.h"
+#include "RevisionRangeList.h"
+
+RevisionRangeList::RevisionRangeList(jobject jrangelist, SVN::Pool &pool)
+ : m_rangelist(NULL)
+{
+ if (!jrangelist)
+ return;
+
+ Iterator iter(jrangelist);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_rangelist = apr_array_make(pool.getPool(), 0, sizeof(svn_merge_range_t*));
+ while (iter.hasNext())
+ {
+ svn_merge_range_t* range = RevisionRange(iter.next()).toMergeRange(pool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ APR_ARRAY_PUSH(m_rangelist, svn_merge_range_t*) = range;
+ }
+}
+
+RevisionRangeList RevisionRangeList::create(jobject jthis, SVN::Pool &pool)
+{
+ jobject jrangelist = NULL;
+
+ if (jthis)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+
+ jmethodID mid = 0;
+ if (mid == 0)
+ {
+ jclass cls = env->FindClass(JAVAHL_CLASS("/types/RevisionRangeList"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return RevisionRangeList(NULL, pool);
+
+ mid = env->GetMethodID(cls, "getRanges", "()Ljava/util/List;");
+ if (JNIUtil::isJavaExceptionThrown())
+ return RevisionRangeList(NULL, pool);
+ }
+
+ jrangelist = env->CallObjectMethod(jthis, mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ return RevisionRangeList(NULL, pool);
+ }
+ return RevisionRangeList(jrangelist, pool);
+}
+
+jobject RevisionRangeList::toList() const
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jclass clazz = env->FindClass("java/util/ArrayList");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ static jmethodID init_mid = 0;
+ if (init_mid == 0)
+ {
+ init_mid = env->GetMethodID(clazz, "<init>", "()V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ static jmethodID add_mid = 0;
+ if (add_mid == 0)
+ {
+ add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ jobject jranges = env->NewObject(clazz, init_mid);
+
+ for (int i = 0; i < m_rangelist->nelts; ++i)
+ {
+ // Convert svn_merge_range_t *'s to Java RevisionRange objects.
+ svn_merge_range_t *range =
+ APR_ARRAY_IDX(m_rangelist, i, svn_merge_range_t *);
+
+ jobject jrange = RevisionRange::makeJRevisionRange(range);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->CallBooleanMethod(jranges, add_mid, jrange);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->DeleteLocalRef(jrange);
+ }
+
+ return env->PopLocalFrame(jranges);
+}
diff --git a/subversion/bindings/javahl/native/JNIThreadData.h b/subversion/bindings/javahl/native/RevisionRangeList.h
index 55d4141..116ff0d 100644
--- a/subversion/bindings/javahl/native/JNIThreadData.h
+++ b/subversion/bindings/javahl/native/RevisionRangeList.h
@@ -20,58 +20,53 @@
* ====================================================================
* @endcopyright
*
- * @file JNIThreadData.h
- * @brief Interface of the class JNIThreadData
+ * @file RevisionRangeList.h
+ * @brief Interface of the class RevisionRangeList
*/
-#ifndef JNITHREADDATA_H
-#define JNITHREADDATA_H
+#ifndef REVISION_RANGE_LIST_H
+#define REVISION_RANGE_LIST_H
#include <jni.h>
-#include "JNIUtil.h"
+#include "svn_mergeinfo.h"
-struct apr_threadkey_t;
+#include "Pool.h"
/**
- * This class implements thread local storage for JNIUtil.
+ * A wrapper for svn_rangelist_t
*/
-class JNIThreadData
+class RevisionRangeList
{
public:
- static void del(void *);
- static JNIThreadData *getThreadData();
- static bool initThreadData();
- static void pushNewThreadData();
- static void popThreadData();
- JNIThreadData();
- ~JNIThreadData();
-
/**
- * The current JNI environment.
+ * Create a RevisionRangeList object from a Java list of revision ranges.
*/
- JNIEnv *m_env;
+ RevisionRangeList(jobject jrangelist, SVN::Pool &pool);
/**
- * Flag that a Java execption has been detected.
+ * Create a RevisionRangeList object from a Java RevisionRangeList.
*/
- bool m_exceptionThrown;
+ static RevisionRangeList create(jobject jthis, SVN::Pool &pool);
/**
- * A buffer used for formating messages.
+ * Wrap an svn_rangelist_t.
*/
- char m_formatBuffer[JNIUtil::formatBufferSize];
+ explicit RevisionRangeList(svn_rangelist_t* ranges)
+ : m_rangelist(ranges)
+ {}
- private:
/**
- * Pointer to previous thread information to enable reentrent
- * calls.
+ * Return an svn_rangelist_t.
*/
- JNIThreadData *m_previous;
+ const svn_rangelist_t* get() const { return m_rangelist; }
/**
- * The key to address this thread local storage.
+ * Make a Java list of reivison ranges.
*/
- static apr_threadkey_t *g_key;
+ jobject toList() const;
+
+ private:
+ svn_rangelist_t* m_rangelist;
};
-#endif // JNITHREADDATA_H
+#endif // REVISION_RANGE_LIST_H
diff --git a/subversion/bindings/javahl/native/SVNBase.cpp b/subversion/bindings/javahl/native/SVNBase.cpp
index bbabc11..5e20f93 100644
--- a/subversion/bindings/javahl/native/SVNBase.cpp
+++ b/subversion/bindings/javahl/native/SVNBase.cpp
@@ -97,3 +97,29 @@ inline void SVNBase::findCppAddrFieldID(jfieldID *fid, const char *className,
}
}
}
+
+jobject SVNBase::createCppBoundObject(const char *clazzName)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create java session object
+ jclass clazz = env->FindClass(clazzName);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ static jmethodID ctor = 0;
+ if (ctor == 0)
+ {
+ ctor = env->GetMethodID(clazz, "<init>", "(J)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ }
+
+ jlong cppAddr = this->getCppAddr();
+
+ jobject jself = env->NewObject(clazz, ctor, cppAddr);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jself;
+}
diff --git a/subversion/bindings/javahl/native/SVNBase.h b/subversion/bindings/javahl/native/SVNBase.h
index f47e3c0..9b3d41a 100644
--- a/subversion/bindings/javahl/native/SVNBase.h
+++ b/subversion/bindings/javahl/native/SVNBase.h
@@ -82,6 +82,11 @@ class SVNBase
*/
void dispose(jobject jthis, jfieldID *fid, const char *className);
+ /**
+ * Instantiates java object attached to this base object
+ */
+ jobject createCppBoundObject(const char *clazzName);
+
private:
/**
* If the value pointed to by @a fid is zero, find the @c jfieldID
diff --git a/subversion/bindings/javahl/native/SVNClient.cpp b/subversion/bindings/javahl/native/SVNClient.cpp
index 4945cc7..5bae852 100644
--- a/subversion/bindings/javahl/native/SVNClient.cpp
+++ b/subversion/bindings/javahl/native/SVNClient.cpp
@@ -24,12 +24,18 @@
* @brief: Implementation of the SVNClient class
*/
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <string>
+
#include "SVNClient.h"
#include "JNIUtil.h"
#include "CopySources.h"
#include "DiffSummaryReceiver.h"
#include "ClientContext.h"
#include "Prompter.h"
+#include "RemoteSession.h"
#include "Pool.h"
#include "Targets.h"
#include "Revision.h"
@@ -50,9 +56,11 @@
#include "CommitMessage.h"
#include "EnumMapper.h"
#include "StringArray.h"
-#include "RevpropTable.h"
+#include "PropertyTable.h"
#include "DiffOptions.h"
#include "CreateJ.h"
+#include "JNIStringHolder.h"
+
#include "svn_auth.h"
#include "svn_dso.h"
#include "svn_types.h"
@@ -62,14 +70,17 @@
#include "svn_diff.h"
#include "svn_config.h"
#include "svn_io.h"
+#include "svn_hash.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_utf.h"
+#include "private/svn_subr_private.h"
#include "svn_private_config.h"
-#include "JNIStringHolder.h"
-#include <vector>
-#include <iostream>
-#include <sstream>
+
+#include "ExternalItem.hpp"
+#include "jniwrapper/jni_list.hpp"
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_string_map.hpp"
SVNClient::SVNClient(jobject jthis_in)
@@ -85,21 +96,21 @@ SVNClient *SVNClient::getCppObject(jobject jthis)
{
static jfieldID fid = 0;
jlong cppAddr = SVNBase::findCppAddrForJObject(jthis, &fid,
- JAVA_PACKAGE"/SVNClient");
+ JAVAHL_CLASS("/SVNClient"));
return (cppAddr == 0 ? NULL : reinterpret_cast<SVNClient *>(cppAddr));
}
void SVNClient::dispose(jobject jthis)
{
static jfieldID fid = 0;
- SVNBase::dispose(jthis, &fid, JAVA_PACKAGE"/SVNClient");
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/SVNClient"));
}
jobject SVNClient::getVersionExtended(bool verbose)
{
JNIEnv *const env = JNIUtil::getEnv();
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/VersionExtended");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/VersionExtended"));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
@@ -184,8 +195,9 @@ void SVNClient::list(const char *url, Revision &revision,
void
SVNClient::status(const char *path, svn_depth_t depth,
- bool onServer, bool getAll, bool noIgnore,
- bool ignoreExternals, StringArray &changelists,
+ bool onServer, bool onDisk, bool getAll,
+ bool noIgnore, bool ignoreExternals,
+ bool depthAsSticky, StringArray &changelists,
StatusCallback *callback)
{
SVN::Pool subPool(pool);
@@ -204,11 +216,10 @@ SVNClient::status(const char *path, svn_depth_t depth,
rev.kind = svn_opt_revision_unspecified;
- SVN_JNI_ERR(svn_client_status5(&youngest, ctx, checkedPath.c_str(),
- &rev,
- depth,
- getAll, onServer, noIgnore, ignoreExternals,
- FALSE,
+ SVN_JNI_ERR(svn_client_status6(&youngest, ctx, checkedPath.c_str(),
+ &rev, depth,
+ getAll, onServer, onDisk,
+ noIgnore, ignoreExternals, depthAsSticky,
changelists.array(subPool),
StatusCallback::callback, callback,
subPool.getPool()), );
@@ -227,23 +238,23 @@ rev_range_vector_to_apr_array(std::vector<RevisionRange> &revRanges,
std::vector<RevisionRange>::const_iterator it;
for (it = revRanges.begin(); it != revRanges.end(); ++it)
{
- if (it->toRange(subPool)->start.kind
- == svn_opt_revision_unspecified
- && it->toRange(subPool)->end.kind
- == svn_opt_revision_unspecified)
+ const svn_opt_revision_range_t *range = it->toRange(subPool);
+
+ if (range->start.kind == svn_opt_revision_unspecified
+ && range->end.kind == svn_opt_revision_unspecified)
{
- svn_opt_revision_range_t *range =
+ svn_opt_revision_range_t *full =
reinterpret_cast<svn_opt_revision_range_t *>
(apr_pcalloc(subPool.getPool(), sizeof(*range)));
- range->start.kind = svn_opt_revision_number;
- range->start.value.number = 1;
- range->end.kind = svn_opt_revision_head;
- APR_ARRAY_PUSH(ranges, const svn_opt_revision_range_t *) = range;
+ full->start.kind = svn_opt_revision_number;
+ full->start.value.number = 1;
+ full->end.kind = svn_opt_revision_head;
+ full->end.value.number = 0;
+ APR_ARRAY_PUSH(ranges, const svn_opt_revision_range_t *) = full;
}
else
{
- APR_ARRAY_PUSH(ranges, const svn_opt_revision_range_t *) =
- it->toRange(subPool);
+ APR_ARRAY_PUSH(ranges, const svn_opt_revision_range_t *) = range;
}
if (JNIUtil::isExceptionThrown())
return NULL;
@@ -255,7 +266,7 @@ void SVNClient::logMessages(const char *path, Revision &pegRevision,
std::vector<RevisionRange> &logRanges,
bool stopOnCopy, bool discoverPaths,
bool includeMergedRevisions, StringArray &revProps,
- long limit, LogMessageCallback *callback)
+ int limit, LogMessageCallback *callback)
{
SVN::Pool subPool(pool);
@@ -317,7 +328,7 @@ jlong SVNClient::checkout(const char *moduleName, const char *destPath,
}
void SVNClient::remove(Targets &targets, CommitMessage *message, bool force,
- bool keep_local, RevpropTable &revprops,
+ bool keep_local, PropertyTable &revprops,
CommitCallback *callback)
{
SVN::Pool subPool(pool);
@@ -334,23 +345,24 @@ void SVNClient::remove(Targets &targets, CommitMessage *message, bool force,
ctx, subPool.getPool()), );
}
-void SVNClient::revert(const char *path, svn_depth_t depth,
- StringArray &changelists)
+void SVNClient::revert(StringArray &paths, svn_depth_t depth,
+ StringArray &changelists,
+ bool clear_changelists,
+ bool metadata_only)
{
SVN::Pool subPool(pool);
- SVN_JNI_NULL_PTR_EX(path, "path", );
-
svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
if (ctx == NULL)
return;
- Targets target(path, subPool);
- const apr_array_header_t *targets = target.array(subPool);
- SVN_JNI_ERR(target.error_occurred(), );
- SVN_JNI_ERR(svn_client_revert2(targets, depth,
- changelists.array(subPool), ctx,
- subPool.getPool()), );
+ Targets targets(paths, subPool);
+ SVN_JNI_ERR(targets.error_occurred(), );
+ SVN_JNI_ERR(svn_client_revert3(targets.array(subPool), depth,
+ changelists.array(subPool),
+ clear_changelists,
+ metadata_only,
+ ctx, subPool.getPool()), );
}
void SVNClient::add(const char *path,
@@ -417,7 +429,7 @@ jlongArray SVNClient::update(Targets &targets, Revision &revision,
void SVNClient::commit(Targets &targets, CommitMessage *message,
svn_depth_t depth, bool noUnlock, bool keepChangelist,
- StringArray &changelists, RevpropTable &revprops,
+ StringArray &changelists, PropertyTable &revprops,
CommitCallback *callback)
{
SVN::Pool subPool(pool);
@@ -439,20 +451,82 @@ void SVNClient::commit(Targets &targets, CommitMessage *message,
);
}
+
+namespace {
+typedef Java::ImmutableList<JavaHL::ExternalItem> PinList;
+typedef Java::ImmutableMap<PinList> PinMap;
+
+struct PinListFunctor
+{
+ explicit PinListFunctor(const Java::Env& env, SVN::Pool& pool, int refs_len)
+ : m_pool(pool),
+ m_refs(apr_array_make(pool.getPool(), refs_len,
+ sizeof(svn_wc_external_item2_t*)))
+ {}
+
+ void operator()(const JavaHL::ExternalItem& item)
+ {
+ APR_ARRAY_PUSH(m_refs, svn_wc_external_item2_t*) =
+ item.get_external_item(m_pool);
+ }
+
+ SVN::Pool& m_pool;
+ apr_array_header_t *m_refs;
+};
+
+struct PinMapFunctor
+{
+ explicit PinMapFunctor(const Java::Env& env, SVN::Pool& pool)
+ : m_env(env),
+ m_pool(pool),
+ m_pin_set(svn_hash__make(pool.getPool()))
+ {}
+
+ void operator()(const std::string& path, const PinList& refs)
+ {
+ PinListFunctor lf(m_env, m_pool, refs.length());
+ refs.for_each(lf);
+ const char* key = static_cast<const char*>(
+ apr_pmemdup(m_pool.getPool(), path.c_str(), path.size() + 1));
+ svn_hash_sets(m_pin_set, key, lf.m_refs);
+ }
+
+ const Java::Env& m_env;
+ SVN::Pool& m_pool;
+ apr_hash_t *m_pin_set;
+};
+
+apr_hash_t *get_externals_to_pin(jobject jexternalsToPin, SVN::Pool& pool)
+{
+ if (!jexternalsToPin)
+ return NULL;
+
+ const Java::Env env;
+ JNIEnv *jenv = env.get();
+
+ try
+ {
+ PinMap pin_map(env, jexternalsToPin);
+ PinMapFunctor mf(env, pool);
+ pin_map.for_each(mf);
+ return mf.m_pin_set;
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+} // anonymous namespace
+
void SVNClient::copy(CopySources &copySources, const char *destPath,
CommitMessage *message, bool copyAsChild,
bool makeParents, bool ignoreExternals,
- RevpropTable &revprops, CommitCallback *callback)
+ bool metadataOnly,
+ bool pinExternals, jobject jexternalsToPin,
+ PropertyTable &revprops, CommitCallback *callback)
{
SVN::Pool subPool(pool);
apr_array_header_t *srcs = copySources.array(subPool);
- if (srcs == NULL)
- {
- JNIUtil::throwNativeException(JAVA_PACKAGE "/ClientException",
- "Invalid copy sources");
- return;
- }
+ SVN_JNI_NULL_PTR_EX(srcs, "sources", );
SVN_JNI_NULL_PTR_EX(destPath, "destPath", );
Path destinationPath(destPath, subPool);
SVN_JNI_ERR(destinationPath.error_occurred(), );
@@ -461,17 +535,21 @@ void SVNClient::copy(CopySources &copySources, const char *destPath,
if (ctx == NULL)
return;
- SVN_JNI_ERR(svn_client_copy6(srcs, destinationPath.c_str(),
- copyAsChild, makeParents, ignoreExternals,
- revprops.hash(subPool),
- CommitCallback::callback, callback,
+ apr_hash_t *pin_set = get_externals_to_pin(jexternalsToPin, subPool);
+ if (!JNIUtil::isJavaExceptionThrown())
+ SVN_JNI_ERR(svn_client_copy7(srcs, destinationPath.c_str(),
+ copyAsChild, makeParents, ignoreExternals,
+ metadataOnly,
+ pinExternals, pin_set,
+ revprops.hash(subPool),
+ CommitCallback::callback, callback,
ctx, subPool.getPool()), );
}
void SVNClient::move(Targets &srcPaths, const char *destPath,
CommitMessage *message, bool force, bool moveAsChild,
bool makeParents, bool metadataOnly, bool allowMixRev,
- RevpropTable &revprops, CommitCallback *callback)
+ PropertyTable &revprops, CommitCallback *callback)
{
SVN::Pool subPool(pool);
@@ -496,7 +574,7 @@ void SVNClient::move(Targets &srcPaths, const char *destPath,
}
void SVNClient::mkdir(Targets &targets, CommitMessage *message,
- bool makeParents, RevpropTable &revprops,
+ bool makeParents, PropertyTable &revprops,
CommitCallback *callback)
{
SVN::Pool subPool(pool);
@@ -513,7 +591,12 @@ void SVNClient::mkdir(Targets &targets, CommitMessage *message,
ctx, subPool.getPool()), );
}
-void SVNClient::cleanup(const char *path)
+void SVNClient::cleanup(const char *path,
+ bool break_locks,
+ bool fix_recorded_timestamps,
+ bool clear_dav_cache,
+ bool remove_unused_pristines,
+ bool include_externals)
{
SVN::Pool subPool(pool);
SVN_JNI_NULL_PTR_EX(path, "path", );
@@ -524,7 +607,13 @@ void SVNClient::cleanup(const char *path)
if (ctx == NULL)
return;
- SVN_JNI_ERR(svn_client_cleanup(intPath.c_str(), ctx, subPool.getPool()),);
+ SVN_JNI_ERR(svn_client_cleanup2(intPath.c_str(),
+ break_locks,
+ fix_recorded_timestamps,
+ clear_dav_cache,
+ remove_unused_pristines,
+ include_externals,
+ ctx, subPool.getPool()),);
}
void SVNClient::resolve(const char *path, svn_depth_t depth,
@@ -545,6 +634,7 @@ void SVNClient::resolve(const char *path, svn_depth_t depth,
jlong SVNClient::doExport(const char *srcPath, const char *destPath,
Revision &revision, Revision &pegRevision,
bool force, bool ignoreExternals,
+ bool ignoreKeywords,
svn_depth_t depth, const char *nativeEOL)
{
SVN::Pool subPool(pool);
@@ -563,7 +653,7 @@ jlong SVNClient::doExport(const char *srcPath, const char *destPath,
destinationPath.c_str(),
pegRevision.revision(),
revision.revision(), force,
- ignoreExternals, FALSE,
+ ignoreExternals, ignoreKeywords,
depth,
nativeEOL, ctx,
subPool.getPool()),
@@ -613,7 +703,7 @@ void SVNClient::doImport(const char *path, const char *url,
CommitMessage *message, svn_depth_t depth,
bool noIgnore, bool noAutoProps,
bool ignoreUnknownNodeTypes,
- RevpropTable &revprops,
+ PropertyTable &revprops,
ImportFilterCallback *ifCallback,
CommitCallback *commitCallback)
{
@@ -658,7 +748,7 @@ void SVNClient::merge(const char *path1, Revision &revision1,
const char *path2, Revision &revision2,
const char *localPath, bool forceDelete, svn_depth_t depth,
bool ignoreMergeinfo, bool diffIgnoreAncestry,
- bool dryRun, bool recordOnly)
+ bool dryRun, bool allowMixedRev, bool recordOnly)
{
SVN::Pool subPool(pool);
SVN_JNI_NULL_PTR_EX(path1, "path1", );
@@ -683,14 +773,15 @@ void SVNClient::merge(const char *path1, Revision &revision1,
depth,
ignoreMergeinfo, diffIgnoreAncestry,
forceDelete, recordOnly, dryRun,
- TRUE, NULL, ctx, subPool.getPool()), );
+ allowMixedRev, NULL, ctx,
+ subPool.getPool()), );
}
void SVNClient::merge(const char *path, Revision &pegRevision,
std::vector<RevisionRange> *rangesToMerge,
const char *localPath, bool forceDelete, svn_depth_t depth,
bool ignoreMergeinfo, bool diffIgnoreAncestry,
- bool dryRun, bool recordOnly)
+ bool dryRun, bool allowMixedRev, bool recordOnly)
{
SVN::Pool subPool(pool);
SVN_JNI_NULL_PTR_EX(path, "path", );
@@ -718,39 +809,16 @@ void SVNClient::merge(const char *path, Revision &pegRevision,
depth,
ignoreMergeinfo, diffIgnoreAncestry,
forceDelete, recordOnly,
- dryRun, TRUE, NULL, ctx,
+ dryRun, allowMixedRev, NULL, ctx,
subPool.getPool()), );
}
-void SVNClient::mergeReintegrate(const char *path, Revision &pegRevision,
- const char *localPath, bool dryRun)
-{
- SVN::Pool subPool(pool);
- SVN_JNI_NULL_PTR_EX(path, "path", );
- SVN_JNI_NULL_PTR_EX(localPath, "localPath", );
- Path intLocalPath(localPath, subPool);
- SVN_JNI_ERR(intLocalPath.error_occurred(), );
-
- Path srcPath(path, subPool);
- SVN_JNI_ERR(srcPath.error_occurred(), );
-
- svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
- if (ctx == NULL)
- return;
-
- SVN_JNI_ERR(svn_client_merge_reintegrate(srcPath.c_str(),
- pegRevision.revision(),
- intLocalPath.c_str(),
- dryRun, NULL, ctx,
- subPool.getPool()), );
-}
+/* SVNClient::mergeReintegrate is implemented in deprecated.cpp. */
jobject
SVNClient::getMergeinfo(const char *target, Revision &pegRevision)
{
SVN::Pool subPool(pool);
- JNIEnv *env = JNIUtil::getEnv();
-
svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
if (ctx == NULL)
return NULL;
@@ -765,57 +833,7 @@ SVNClient::getMergeinfo(const char *target, Revision &pegRevision)
NULL);
if (mergeinfo == NULL)
return NULL;
-
- // Transform mergeinfo into Java Mergeinfo object.
- jclass clazz = env->FindClass(JAVA_PACKAGE "/types/Mergeinfo");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- static jmethodID ctor = 0;
- if (ctor == 0)
- {
- ctor = env->GetMethodID(clazz, "<init>", "()V");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
- }
-
- static jmethodID addRevisions = 0;
- if (addRevisions == 0)
- {
- addRevisions = env->GetMethodID(clazz, "addRevisions",
- "(Ljava/lang/String;"
- "Ljava/util/List;)V");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
- }
-
- jobject jmergeinfo = env->NewObject(clazz, ctor);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- apr_hash_index_t *hi;
- for (hi = apr_hash_first(subPool.getPool(), mergeinfo);
- hi;
- hi = apr_hash_next(hi))
- {
- const void *path;
- void *val;
- apr_hash_this(hi, &path, NULL, &val);
-
- jstring jpath =
- JNIUtil::makeJString(reinterpret_cast<const char *>(path));
- jobject jranges =
- CreateJ::RevisionRangeList(reinterpret_cast<svn_rangelist_t *>(val));
-
- env->CallVoidMethod(jmergeinfo, addRevisions, jpath, jranges);
-
- env->DeleteLocalRef(jranges);
- env->DeleteLocalRef(jpath);
- }
-
- env->DeleteLocalRef(clazz);
-
- return jmergeinfo;
+ return CreateJ::Mergeinfo(mergeinfo, subPool.getPool());
}
void SVNClient::getMergeinfoLog(int type, const char *pathOrURL,
@@ -954,7 +972,7 @@ void SVNClient::propertySetRemote(const char *path, long base_rev,
const char *name,
CommitMessage *message,
JNIByteArray &value, bool force,
- RevpropTable &revprops,
+ PropertyTable &revprops,
CommitCallback *callback)
{
SVN::Pool subPool(pool);
@@ -1155,23 +1173,31 @@ SVNClient::diffSummarize(const char *target, Revision &pegRevision,
subPool.getPool()), );
}
-void SVNClient::streamFileContent(const char *path, Revision &revision,
- Revision &pegRevision,
- OutputStream &outputStream)
+apr_hash_t *SVNClient::streamFileContent(const char *path,
+ Revision &revision,
+ Revision &pegRevision,
+ bool expand_keywords,
+ bool return_props,
+ OutputStream &outputStream)
{
SVN::Pool subPool(pool);
- SVN_JNI_NULL_PTR_EX(path, "path", );
+ SVN_JNI_NULL_PTR_EX(path, "path", NULL);
Path intPath(path, subPool);
- SVN_JNI_ERR(intPath.error_occurred(), );
+ SVN_JNI_ERR(intPath.error_occurred(), NULL);
svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
if (ctx == NULL)
- return;
+ return NULL;
- SVN_JNI_ERR(svn_client_cat2(outputStream.getStream(subPool),
- intPath.c_str(), pegRevision.revision(),
- revision.revision(), ctx, subPool.getPool()),
- );
+ apr_hash_t *props = NULL;
+ SVN_JNI_ERR(svn_client_cat3((return_props ? &props : NULL),
+ outputStream.getStream(subPool),
+ intPath.c_str(),
+ pegRevision.revision(), revision.revision(),
+ expand_keywords, ctx,
+ subPool.getPool(), subPool.getPool()),
+ NULL);
+ return props;
}
jbyteArray SVNClient::revProperty(const char *path,
@@ -1239,7 +1265,7 @@ void SVNClient::relocate(const char *from, const char *to, const char *path,
void SVNClient::blame(const char *path, Revision &pegRevision,
Revision &revisionStart, Revision &revisionEnd,
bool ignoreMimeType, bool includeMergedRevisions,
- BlameCallback *callback)
+ BlameCallback *callback, DiffOptions const& options)
{
SVN::Pool subPool(pool);
SVN_JNI_NULL_PTR_EX(path, "path", );
@@ -1253,7 +1279,7 @@ void SVNClient::blame(const char *path, Revision &pegRevision,
SVN_JNI_ERR(svn_client_blame5(
intPath.c_str(), pegRevision.revision(), revisionStart.revision(),
revisionEnd.revision(),
- svn_diff_file_options_create(subPool.getPool()), ignoreMimeType,
+ options.fileOptions(subPool), ignoreMimeType,
includeMergedRevisions, BlameCallback::callback, callback, ctx,
subPool.getPool()),
);
@@ -1288,15 +1314,17 @@ void SVNClient::removeFromChangelists(Targets &srcPaths, svn_depth_t depth,
}
void SVNClient::getChangelists(const char *rootPath,
- StringArray &changelists,
+ StringArray *changelists,
svn_depth_t depth,
ChangelistCallback *callback)
{
SVN::Pool subPool(pool);
svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
- SVN_JNI_ERR(svn_client_get_changelists(rootPath,
- changelists.array(subPool),
+ const apr_array_header_t *cl_array = (!changelists ? NULL
+ : changelists->array(subPool));
+
+ SVN_JNI_ERR(svn_client_get_changelists(rootPath, cl_array,
depth, ChangelistCallback::callback,
callback, ctx, subPool.getPool()),
);
@@ -1392,10 +1420,10 @@ jstring SVNClient::getVersionInfo(const char *path, const char *trailUrl,
}
else
{
- char *message = JNIUtil::getFormatBuffer();
- apr_snprintf(message, JNIUtil::formatBufferSize,
+ char buffer[2048];
+ apr_snprintf(buffer, sizeof(buffer),
_("'%s' not versioned, and not exported\n"), path);
- return JNIUtil::makeJString(message);
+ return JNIUtil::makeJString(buffer);
}
}
@@ -1465,19 +1493,15 @@ jobject SVNClient::revProperties(const char *path, Revision &revision)
&set_rev, ctx, subPool.getPool()),
NULL);
- return CreateJ::PropertyMap(props);
+ return CreateJ::PropertyMap(props, subPool.getPool());
}
-struct info_baton
-{
- std::vector<info_entry> infoVect;
- apr_pool_t *pool;
-};
-
void
-SVNClient::info2(const char *path, Revision &revision, Revision &pegRevision,
- svn_depth_t depth, StringArray &changelists,
- InfoCallback *callback)
+SVNClient::info(const char *path,
+ Revision &revision, Revision &pegRevision, svn_depth_t depth,
+ svn_boolean_t fetchExcluded, svn_boolean_t fetchActualOnly,
+ svn_boolean_t includeExternals,
+ StringArray &changelists, InfoCallback *callback)
{
SVN_JNI_NULL_PTR_EX(path, "path", );
@@ -1489,10 +1513,11 @@ SVNClient::info2(const char *path, Revision &revision, Revision &pegRevision,
Path checkedPath(path, subPool);
SVN_JNI_ERR(checkedPath.error_occurred(), );
- SVN_JNI_ERR(svn_client_info3(checkedPath.c_str(),
+ SVN_JNI_ERR(svn_client_info4(checkedPath.c_str(),
pegRevision.revision(),
- revision.revision(),
- depth, FALSE, TRUE,
+ revision.revision(), depth,
+ fetchExcluded, fetchActualOnly,
+ includeExternals,
changelists.array(subPool),
InfoCallback::callback, callback,
ctx, subPool.getPool()), );
@@ -1525,6 +1550,87 @@ SVNClient::patch(const char *patchPath, const char *targetPath, bool dryRun,
ctx, subPool.getPool()), );
}
+void SVNClient::vacuum(const char *path,
+ bool remove_unversioned_items,
+ bool remove_ignored_items,
+ bool fix_recorded_timestamps,
+ bool remove_unused_pristines,
+ bool include_externals)
+{
+ SVN_JNI_NULL_PTR_EX(path, "path", );
+
+ SVN::Pool subPool(pool);
+ svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
+ if (ctx == NULL)
+ return;
+
+ Path checkedPath(path, subPool);
+ SVN_JNI_ERR(checkedPath.error_occurred(),);
+
+ SVN_JNI_ERR(svn_client_vacuum(checkedPath.c_str(),
+ remove_unversioned_items,
+ remove_ignored_items,
+ fix_recorded_timestamps,
+ remove_unused_pristines,
+ include_externals,
+ ctx, subPool.getPool()), );
+}
+
+jobject
+SVNClient::openRemoteSession(const char* path, int retryAttempts)
+{
+ static const svn_opt_revision_t HEAD = { svn_opt_revision_head, {0}};
+ static const svn_opt_revision_t NONE = { svn_opt_revision_unspecified, {0}};
+
+ SVN_JNI_NULL_PTR_EX(path, "path", NULL);
+
+ SVN::Pool subPool(pool);
+ svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
+ if (ctx == NULL)
+ return NULL;
+
+ Path checkedPath(path, subPool);
+ SVN_JNI_ERR(checkedPath.error_occurred(), NULL);
+
+ struct PathInfo
+ {
+ std::string url;
+ std::string uuid;
+ static svn_error_t *callback(void *baton,
+ const char *,
+ const svn_client_info2_t *info,
+ apr_pool_t *)
+ {
+ PathInfo* const pi = static_cast<PathInfo*>(baton);
+ pi->url = info->URL;
+ pi->uuid = info->repos_UUID;
+ return SVN_NO_ERROR;
+ }
+ } path_info;
+
+ SVN_JNI_ERR(svn_client_info4(
+ checkedPath.c_str(), &NONE,
+ (svn_path_is_url(checkedPath.c_str()) ? &HEAD : &NONE),
+ svn_depth_empty, FALSE, TRUE, FALSE, NULL,
+ PathInfo::callback, &path_info,
+ ctx, subPool.getPool()),
+ NULL);
+
+ /* Decouple the RemoteSession's context from SVNClient's context
+ by creating a copy of the prompter here. */
+
+ jobject jremoteSession = RemoteSession::open(
+ retryAttempts, path_info.url.c_str(), path_info.uuid.c_str(),
+ context.getConfigDirectory(),
+ context.getUsername(), context.getPassword(),
+ context.clonePrompter(), context.getSelf(),
+ context.getConfigEventHandler(), context.getTunnelCallback());
+ if (JNIUtil::isJavaExceptionThrown())
+ jremoteSession = NULL;
+
+ return jremoteSession;
+}
+
ClientContext &
SVNClient::getClientContext()
{
diff --git a/subversion/bindings/javahl/native/SVNClient.h b/subversion/bindings/javahl/native/SVNClient.h
index 8d85d9b..6661bae 100644
--- a/subversion/bindings/javahl/native/SVNClient.h
+++ b/subversion/bindings/javahl/native/SVNClient.h
@@ -53,7 +53,7 @@ class PatchCallback;
class ChangelistCallback;
class CommitMessage;
class StringArray;
-class RevpropTable;
+class PropertyTable;
class DiffOptions;
#include "svn_types.h"
#include "svn_client.h"
@@ -62,12 +62,19 @@ class DiffOptions;
class SVNClient :public SVNBase
{
public:
+ jobject openRemoteSession(const char* path, int);
+ void vacuum(const char *path,
+ bool remove_unversioned_items, bool remove_ignored_items,
+ bool fix_recorded_timestamps, bool remove_unused_pristines,
+ bool include_externals);
void patch(const char *patchPath, const char *targetPath, bool dryRun,
int stripCount, bool reverse, bool ignoreWhitespace,
bool removeTempfiles, PatchCallback *callback);
- void info2(const char *path, Revision &revision, Revision &pegRevision,
- svn_depth_t depth, StringArray &changelists,
- InfoCallback *callback);
+ void info(const char *path,
+ Revision &revision, Revision &pegRevision, svn_depth_t depth,
+ svn_boolean_t fetchExcluded, svn_boolean_t fetchActualOnly,
+ svn_boolean_t includeExternals,
+ StringArray &changelists, InfoCallback *callback);
void unlock(Targets &targets, bool force);
void lock(Targets &targets, const char *comment, bool force);
jobject revProperties(const char *path, Revision &revision);
@@ -75,18 +82,20 @@ class SVNClient :public SVNBase
void blame(const char *path, Revision &pegRevision,
Revision &revisionStart, Revision &revisionEnd,
bool ignoreMimeType, bool includeMergedRevisions,
- BlameCallback *callback);
+ BlameCallback *callback, DiffOptions const& options);
void relocate(const char *from, const char *to, const char *path,
bool ignoreExternals);
- void streamFileContent(const char *path, Revision &revision,
- Revision &pegRevision, OutputStream &outputStream);
+ apr_hash_t *streamFileContent(const char *path,
+ Revision &revision, Revision &pegRevision,
+ bool expand_keywords, bool return_props,
+ OutputStream &outputStream);
void propertySetLocal(Targets &targets, const char *name, JNIByteArray &value,
svn_depth_t depth, StringArray &changelists,
bool force);
void propertySetRemote(const char *path, long base_rev, const char *name,
CommitMessage *message,
JNIByteArray &value, bool force,
- RevpropTable &revprops, CommitCallback *callback);
+ PropertyTable &revprops, CommitCallback *callback);
void properties(const char *path, Revision &revision,
Revision &pegRevision, svn_depth_t depth,
StringArray &changelists, ProplistCallback *callback);
@@ -103,18 +112,18 @@ class SVNClient :public SVNBase
const char *path2, Revision &revision2,
const char *localPath, bool forceDelete, svn_depth_t depth,
bool ignoreMergeinfo, bool diffIgnoreAncestry,
- bool dryRun, bool recordOnly);
+ bool dryRun, bool allowMixedRev, bool recordOnly);
void merge(const char *path, Revision &pegRevision,
std::vector<RevisionRange> *rangesToMerge,
const char *localPath, bool forceDelete, svn_depth_t depth,
bool ignoreMergeinfo, bool diffIgnoreAncestry,
- bool dryRun, bool recordOnly);
+ bool dryRun, bool allowMixedRev, bool recordOnly);
void mergeReintegrate(const char *path, Revision &pegRevision,
const char *localPath, bool dryRun);
void doImport(const char *path, const char *url, CommitMessage *message,
svn_depth_t depth, bool noIgnore, bool noAutoProps,
bool ignoreUnknownNodeTypes,
- RevpropTable &revprops, ImportFilterCallback *ifCallback,
+ PropertyTable &revprops, ImportFilterCallback *ifCallback,
CommitCallback *commitCallback);
jlong doSwitch(const char *path, const char *url, Revision &revision,
Revision &pegRevision, svn_depth_t depth,
@@ -122,33 +131,40 @@ class SVNClient :public SVNBase
bool allowUnverObstructions, bool ignoreAncestry);
jlong doExport(const char *srcPath, const char *destPath,
Revision &revision, Revision &pegRevision, bool force,
- bool ignoreExternals, svn_depth_t depth,
- const char *nativeEOL);
+ bool ignoreExternals, bool ignoreKeywords,
+ svn_depth_t depth, const char *nativeEOL);
void resolve(const char *path, svn_depth_t depth,
svn_wc_conflict_choice_t choice);
- void cleanup(const char *path);
+ void cleanup(const char *path,
+ bool break_locks,
+ bool fix_recorded_timestamps,
+ bool clear_dav_cache,
+ bool remove_unused_pristines,
+ bool include_externals);
void mkdir(Targets &targets, CommitMessage *message, bool makeParents,
- RevpropTable &revprops, CommitCallback *callback);
+ PropertyTable &revprops, CommitCallback *callback);
void move(Targets &srcPaths, const char *destPath,
CommitMessage *message, bool force, bool moveAsChild,
bool makeParents, bool metadataOnly, bool allowMixRev,
- RevpropTable &revprops, CommitCallback *callback);
+ PropertyTable &revprops, CommitCallback *callback);
void copy(CopySources &copySources, const char *destPath,
CommitMessage *message, bool copyAsChild, bool makeParents,
- bool ignoreExternals, RevpropTable &revprops,
- CommitCallback *callback);
+ bool ignoreExternals, bool metaDataOnly, bool pinExternals,
+ jobject jexternalsToPin,
+ PropertyTable &revprops, CommitCallback *callback);
void commit(Targets &targets, CommitMessage *message, svn_depth_t depth,
bool noUnlock, bool keepChangelist,
- StringArray &changelists, RevpropTable &revprops,
+ StringArray &changelists, PropertyTable &revprops,
CommitCallback *callback);
jlongArray update(Targets &targets, Revision &revision, svn_depth_t depth,
bool depthIsSticky, bool makeParents, bool ignoreExternals,
bool allowUnverObstructions);
void add(const char *path, svn_depth_t depth, bool force,
bool no_ignore, bool no_autoprops, bool add_parents);
- void revert(const char *path, svn_depth_t depth, StringArray &changelists);
+ void revert(StringArray &paths, svn_depth_t depth, StringArray &changelists,
+ bool clear_changelists, bool metadata_only);
void remove(Targets &targets, CommitMessage *message, bool force,
- bool keep_local, RevpropTable &revprops,
+ bool keep_local, PropertyTable &revprops,
CommitCallback *callback);
jlong checkout(const char *moduleName, const char *destPath,
Revision &revision, Revision &pegRevsion, svn_depth_t depth,
@@ -157,7 +173,7 @@ class SVNClient :public SVNBase
std::vector<RevisionRange> &ranges, bool stopOnCopy,
bool discoverPaths, bool includeMergedRevisions,
StringArray &revProps,
- long limit, LogMessageCallback *callback);
+ int limit, LogMessageCallback *callback);
jobject getVersionExtended(bool verbose);
jstring getAdminDirectoryName();
jboolean isAdminDirectory(const char *name);
@@ -165,11 +181,13 @@ class SVNClient :public SVNBase
svn_depth_t depth, StringArray &changelists);
void removeFromChangelists(Targets &srcPaths, svn_depth_t depth,
StringArray &changelists);
- void getChangelists(const char *path, StringArray &changelists,
+ void getChangelists(const char *path, StringArray *changelists,
svn_depth_t depth, ChangelistCallback *callback);
- void status(const char *path, svn_depth_t depth, bool onServer,
- bool getAll, bool noIgnore, bool ignoreExternals,
- StringArray &changelists, StatusCallback *callback);
+ void status(const char *path, svn_depth_t depth,
+ bool onServer, bool onDisk, bool getAll,
+ bool noIgnore, bool ignoreExternals,
+ bool depthAsSticky, StringArray &changelists,
+ StatusCallback *callback);
void list(const char *url, Revision &revision, Revision &pegRevision,
svn_depth_t depth, int direntFields, bool fetchLocks,
ListCallback *callback);
diff --git a/subversion/bindings/javahl/native/SVNRepos.cpp b/subversion/bindings/javahl/native/SVNRepos.cpp
index 7fdf63c..0ee87e6 100644
--- a/subversion/bindings/javahl/native/SVNRepos.cpp
+++ b/subversion/bindings/javahl/native/SVNRepos.cpp
@@ -26,7 +26,6 @@
#include "SVNRepos.h"
#include "CreateJ.h"
-#include "ReposNotifyCallback.h"
#include "JNIUtil.h"
#include "svn_error_codes.h"
#include "svn_repos.h"
@@ -50,14 +49,14 @@ SVNRepos *SVNRepos::getCppObject(jobject jthis)
{
static jfieldID fid = 0;
jlong cppAddr = SVNBase::findCppAddrForJObject(jthis, &fid,
- JAVA_PACKAGE"/SVNRepos");
+ JAVAHL_CLASS("/SVNRepos"));
return (cppAddr == 0 ? NULL : reinterpret_cast<SVNRepos *>(cppAddr));
}
void SVNRepos::dispose(jobject jthis)
{
static jfieldID fid = 0;
- SVNBase::dispose(jthis, &fid, JAVA_PACKAGE"/SVNRepos");
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/SVNRepos"));
}
void SVNRepos::cancelOperation()
@@ -124,8 +123,10 @@ void SVNRepos::deltify(File &path, Revision &revStart, Revision &revEnd)
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(),
+ requestPool.getPool()), );
fs = svn_repos_fs(repos);
SVN_JNI_ERR(svn_fs_youngest_rev(&youngest, fs, requestPool.getPool()), );
@@ -193,8 +194,9 @@ void SVNRepos::dump(File &path, OutputStream &dataOut,
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
fs = svn_repos_fs(repos);
SVN_JNI_ERR(svn_fs_youngest_rev(&youngest, fs, requestPool.getPool()), );
@@ -248,7 +250,8 @@ void SVNRepos::dump(File &path, OutputStream &dataOut,
}
void SVNRepos::hotcopy(File &path, File &targetPath,
- bool cleanLogs, bool incremental)
+ bool cleanLogs, bool incremental,
+ ReposNotifyCallback *notifyCallback)
{
SVN::Pool requestPool;
@@ -264,9 +267,13 @@ void SVNRepos::hotcopy(File &path, File &targetPath,
return;
}
- SVN_JNI_ERR(svn_repos_hotcopy2(path.getInternalStyle(requestPool),
+ SVN_JNI_ERR(svn_repos_hotcopy3(path.getInternalStyle(requestPool),
targetPath.getInternalStyle(requestPool),
cleanLogs, incremental,
+ notifyCallback != NULL
+ ? ReposNotifyCallback::notify
+ : NULL,
+ notifyCallback,
checkCancel, this /* cancel callback/baton */,
requestPool.getPool()),
);
@@ -321,6 +328,8 @@ void SVNRepos::load(File &path,
bool forceUUID,
bool usePreCommitHook,
bool usePostCommitHook,
+ bool validateProps,
+ bool ignoreDates,
const char *relativePath,
ReposNotifyCallback *notifyCallback)
{
@@ -353,13 +362,14 @@ void SVNRepos::load(File &path,
_("First revision cannot be higher than second")), );
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
- SVN_JNI_ERR(svn_repos_load_fs4(repos, dataIn.getStream(requestPool),
+ SVN_JNI_ERR(svn_repos_load_fs5(repos, dataIn.getStream(requestPool),
lower, upper, uuid_action, relativePath,
usePreCommitHook, usePostCommitHook,
- FALSE,
+ validateProps, ignoreDates,
notifyCallback != NULL
? ReposNotifyCallback::notify
: NULL,
@@ -380,8 +390,9 @@ void SVNRepos::lstxns(File &path, MessageReceiver &messageReceiver)
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
fs = svn_repos_fs(repos);
SVN_JNI_ERR(svn_fs_list_transactions(&txns, fs, requestPool.getPool()), );
@@ -417,8 +428,9 @@ jlong SVNRepos::recover(File &path, ReposNotifyCallback *notifyCallback)
/* Since db transactions may have been replayed, it's nice to tell
* people what the latest revision is. It also proves that the
* recovery actually worked. */
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), -1);
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), -1);
SVN_JNI_ERR(svn_fs_youngest_rev(&youngest_rev, svn_repos_fs(repos),
requestPool.getPool()),
-1);
@@ -463,8 +475,9 @@ void SVNRepos::rmtxns(File &path, StringArray &transactions)
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
fs = svn_repos_fs(repos);
args = transactions.array(requestPool);
@@ -520,8 +533,9 @@ void SVNRepos::setRevProp(File &path, Revision &revision,
/* Open the filesystem. */
svn_repos_t *repos;
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
/* If we are bypassing the hooks system, we just hit the filesystem
* directly. */
@@ -579,7 +593,9 @@ SVNRepos::getRevnum(svn_revnum_t *revnum, const svn_opt_revision_t *revision,
void
SVNRepos::verify(File &path, Revision &revisionStart, Revision &revisionEnd,
- ReposNotifyCallback *notifyCallback)
+ bool checkNormalization, bool metadataOnly,
+ ReposNotifyCallback *notifyCallback,
+ ReposVerifyCallback *verifyCallback)
{
SVN::Pool requestPool;
svn_repos_t *repos;
@@ -594,8 +610,9 @@ SVNRepos::verify(File &path, Revision &revisionStart, Revision &revisionEnd,
/* This whole process is basically just a dump of the repository
* with no interest in the output. */
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
SVN_JNI_ERR(svn_fs_youngest_rev(&youngest, svn_repos_fs(repos),
requestPool.getPool()), );
@@ -621,11 +638,15 @@ SVNRepos::verify(File &path, Revision &revisionStart, Revision &revisionEnd,
(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Start revision cannot be higher than end revision")), );
- SVN_JNI_ERR(svn_repos_verify_fs2(repos, lower, upper,
- notifyCallback != NULL
- ? ReposNotifyCallback::notify
- : NULL,
+ SVN_JNI_ERR(svn_repos_verify_fs3(repos, lower, upper,
+ checkNormalization,
+ metadataOnly,
+ (!notifyCallback ? NULL
+ : ReposNotifyCallback::notify),
notifyCallback,
+ (!verifyCallback ? NULL
+ : ReposVerifyCallback::callback),
+ verifyCallback,
checkCancel, this /* cancel callback/baton */,
requestPool.getPool()), );
}
@@ -641,8 +662,9 @@ void SVNRepos::pack(File &path, ReposNotifyCallback *notifyCallback)
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
SVN_JNI_ERR(svn_repos_fs_pack2(repos,
notifyCallback != NULL
@@ -686,15 +708,16 @@ jobject SVNRepos::lslocks(File &path, svn_depth_t depth)
return NULL;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), NULL);
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), NULL);
/* Fetch all locks on or below the root directory. */
SVN_JNI_ERR(svn_repos_fs_get_locks2(&locks, repos, "/", depth, NULL, NULL,
requestPool.getPool()),
NULL);
JNIEnv *env = JNIUtil::getEnv();
- jclass clazz = env->FindClass(JAVA_PACKAGE"/types/Lock");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/types/Lock"));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
@@ -730,8 +753,9 @@ void SVNRepos::rmlocks(File &path, StringArray &locks)
return;
}
- SVN_JNI_ERR(svn_repos_open2(&repos, path.getInternalStyle(requestPool),
- NULL, requestPool.getPool()), );
+ SVN_JNI_ERR(svn_repos_open3(&repos,
+ path.getInternalStyle(requestPool), NULL,
+ requestPool.getPool(), requestPool.getPool()), );
fs = svn_repos_fs(repos);
const char *username = NULL;
diff --git a/subversion/bindings/javahl/native/SVNRepos.h b/subversion/bindings/javahl/native/SVNRepos.h
index b22a4c4..4fdc48d 100644
--- a/subversion/bindings/javahl/native/SVNRepos.h
+++ b/subversion/bindings/javahl/native/SVNRepos.h
@@ -35,6 +35,7 @@
#include "InputStream.h"
#include "MessageReceiver.h"
#include "ReposNotifyCallback.h"
+#include "ReposVerifyCallback.h"
#include "ReposFreezeAction.h"
#include "StringArray.h"
#include "File.h"
@@ -45,7 +46,9 @@ class SVNRepos : public SVNBase
void rmlocks(File &path, StringArray &locks);
jobject lslocks(File &path, svn_depth_t depth);
void verify(File &path, Revision &revisionStart, Revision &revisionEnd,
- ReposNotifyCallback *notifyCallback);
+ bool checkNormalization, bool metadataOnly,
+ ReposNotifyCallback *notifyCallback,
+ ReposVerifyCallback *verifyCallback);
void setRevProp(File &path, Revision &revision,
const char *propName, const char *propValue,
bool usePreRevPropChangeHook,
@@ -58,11 +61,13 @@ class SVNRepos : public SVNBase
Revision &revsionStart, Revision &revisionEnd,
bool ignoreUUID, bool forceUUID,
bool usePreCommitHook, bool usePostCommitHook,
+ bool validateProps, bool ignoreDates,
const char *relativePath, ReposNotifyCallback *notifyCallback);
void listUnusedDBLogs(File &path,
MessageReceiver &messageReceiver);
void listDBLogs(File &path, MessageReceiver &messageReceiver);
- void hotcopy(File &path, File &targetPath, bool cleanLogs, bool incremental);
+ void hotcopy(File &path, File &targetPath, bool cleanLogs, bool incremental,
+ ReposNotifyCallback *notifyCallback);
void dump(File &path, OutputStream &dataOut, Revision &revsionStart,
Revision &RevisionEnd, bool incremental, bool useDeltas,
ReposNotifyCallback *notifyCallback);
diff --git a/subversion/bindings/javahl/native/StateReporter.cpp b/subversion/bindings/javahl/native/StateReporter.cpp
new file mode 100644
index 0000000..a0c05ed
--- /dev/null
+++ b/subversion/bindings/javahl/native/StateReporter.cpp
@@ -0,0 +1,191 @@
+/**
+ * @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 StateReporter.cpp
+ * @brief Implementation of the class StateReporter
+ */
+
+#include <jni.h>
+
+#include "JNIUtil.h"
+#include "JNIStringHolder.h"
+#include "StateReporter.h"
+#include "EnumMapper.h"
+#include "Path.h"
+
+#include "svn_private_config.h"
+
+StateReporter::StateReporter()
+ : m_valid(false),
+ m_raw_reporter(NULL),
+ m_report_baton(NULL),
+ m_editor(NULL),
+ m_target_revision(SVN_INVALID_REVNUM)
+{}
+
+StateReporter::~StateReporter()
+{
+ delete m_editor;
+}
+
+StateReporter*
+StateReporter::getCppObject(jobject jthis)
+{
+ static jfieldID fid = 0;
+ jlong cppAddr = SVNBase::findCppAddrForJObject(jthis, &fid,
+ JAVAHL_CLASS("/remote/StateReporter"));
+ return (cppAddr == 0 ? NULL : reinterpret_cast<StateReporter*>(cppAddr));
+}
+
+void
+StateReporter::dispose(jobject jthis)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::dispose()\n");
+
+ if (m_valid)
+ abortReport();
+
+ static jfieldID fid = 0;
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/remote/StateReporter"));
+}
+
+namespace {
+void throw_reporter_inactive()
+{
+ JNIUtil::raiseThrowable("java/lang/IllegalStateException",
+ _("The reporter is not active"));
+}
+} // anonymous namespace
+
+void
+StateReporter::setPath(jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::setPath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ JNIStringHolder lock_token(jlock_token);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ svn_depth_t depth = EnumMapper::toDepth(jdepth);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->set_path(m_report_baton, path.c_str(),
+ svn_revnum_t(jrevision), depth,
+ bool(jstart_empty), lock_token.c_str(),
+ subPool.getPool()),);
+}
+
+void
+StateReporter::deletePath(jstring jpath)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::deletePath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->delete_path(m_report_baton, path.c_str(),
+ subPool.getPool()),);
+}
+
+void
+StateReporter::linkPath(jstring jurl, jstring jpath,
+ jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::linkPath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ JNIStringHolder lock_token(jlock_token);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ URL url(jurl, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ svn_depth_t depth = EnumMapper::toDepth(jdepth);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->link_path(m_report_baton, path.c_str(),
+ url.c_str(), svn_revnum_t(jrevision),
+ depth, bool(jstart_empty),
+ lock_token.c_str(),
+ subPool.getPool()),);
+}
+
+jlong
+StateReporter::finishReport()
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::finishReport()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return SVN_INVALID_REVNUM; }
+
+ SVN::Pool subPool(pool);
+ SVN_JNI_ERR(m_raw_reporter->finish_report(m_report_baton,
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+ m_valid = false;
+ return jlong(m_target_revision);
+}
+
+void
+StateReporter::abortReport()
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::abortReport()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ SVN::Pool subPool(pool);
+ SVN_JNI_ERR(m_raw_reporter->abort_report(m_report_baton,
+ subPool.getPool()),);
+ m_valid = false;
+}
+
+void
+StateReporter::set_reporter_data(const svn_ra_reporter3_t* raw_reporter,
+ void* report_baton,
+ EditorProxy* editor)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::set_reporter_data()\n");
+
+ m_editor = editor;
+ m_raw_reporter = raw_reporter;
+ m_report_baton = report_baton;
+ m_valid = true;
+}
diff --git a/subversion/bindings/javahl/native/StateReporter.h b/subversion/bindings/javahl/native/StateReporter.h
new file mode 100644
index 0000000..f16ddbf
--- /dev/null
+++ b/subversion/bindings/javahl/native/StateReporter.h
@@ -0,0 +1,74 @@
+/**
+ * @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 UpdateReporter.h
+ * @brief Interface of the class UpdateReporter
+ */
+
+#ifndef JAVAHL_UPDATE_REPORTER_H
+#define JAVAHL_UPDATE_REPORTER_H
+
+#include <jni.h>
+
+#include "svn_ra.h"
+#include "SVNBase.h"
+#include "EditorProxy.h"
+
+class RemoteSession;
+
+/*
+ * This class wraps the update/status/switch/diff reporter in svn_ra.h
+ */
+class StateReporter : public SVNBase
+{
+public:
+ StateReporter();
+ virtual ~StateReporter();
+
+ static StateReporter* getCppObject(jobject jreporter);
+
+ virtual void dispose(jobject jthis);
+
+ void setPath(jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token);
+ void deletePath(jstring jpath);
+ void linkPath(jstring jurl, jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token);
+ jlong finishReport();
+ void abortReport();
+
+private:
+
+ bool m_valid;
+ const svn_ra_reporter3_t* m_raw_reporter;
+ void* m_report_baton;
+ EditorProxy* m_editor;
+
+ friend class RemoteSession;
+ apr_pool_t* get_report_pool() const { return pool.getPool(); }
+ void set_reporter_data(const svn_ra_reporter3_t* raw_reporter,
+ void* report_baton,
+ EditorProxy* editor);
+ svn_revnum_t m_target_revision;
+};
+
+#endif // JAVAHL_UPDATE_REPORTER_H
diff --git a/subversion/bindings/javahl/native/StatusCallback.cpp b/subversion/bindings/javahl/native/StatusCallback.cpp
index cc0d67a..94ed676 100644
--- a/subversion/bindings/javahl/native/StatusCallback.cpp
+++ b/subversion/bindings/javahl/native/StatusCallback.cpp
@@ -81,13 +81,13 @@ StatusCallback::doStatus(const char *local_abspath,
// it can be cached.
if (mid == 0)
{
- jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/StatusCallback");
+ jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/StatusCallback"));
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "doStatus",
"(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/Status;)V");
+ JAVAHL_ARG("/types/Status;") ")V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
@@ -101,11 +101,8 @@ StatusCallback::doStatus(const char *local_abspath,
POP_AND_RETURN(SVN_NO_ERROR);
env->CallVoidMethod(m_callback, mid, jPath, jStatus);
- // We return here regardless of whether an exception is thrown or not,
- // so we do not need to explicitly check for one.
- env->PopLocalFrame(NULL);
- return SVN_NO_ERROR;
+ POP_AND_RETURN_EXCEPTION_AS_SVNERROR();
}
void
diff --git a/subversion/bindings/javahl/native/SubversionException.cpp b/subversion/bindings/javahl/native/SubversionException.cpp
new file mode 100644
index 0000000..b0b5286
--- /dev/null
+++ b/subversion/bindings/javahl/native/SubversionException.cpp
@@ -0,0 +1,32 @@
+/**
+ * @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
+ */
+
+#include "SubversionException.hpp"
+#include "JNIUtil.h"
+
+namespace JavaHL {
+
+const char* const SubversionException::m_class_name =
+ JAVAHL_CLASS("/SubversionException");
+
+} // namespace JavaHL
diff --git a/subversion/bindings/javahl/native/SubversionException.hpp b/subversion/bindings/javahl/native/SubversionException.hpp
new file mode 100644
index 0000000..5c71107
--- /dev/null
+++ b/subversion/bindings/javahl/native/SubversionException.hpp
@@ -0,0 +1,54 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_SUBVERSION_EXCEPTION_HPP
+#define SVN_JAVAHL_SUBVERSION_EXCEPTION_HPP
+
+#include "jniwrapper/jni_exception.hpp"
+
+namespace JavaHL {
+
+/**
+ * Generator class for exceptions of type
+ * @c org.apache.subversion.javahl.SubversionException.
+ *
+ * The associated JNI class reference is stored for the lifetime of
+ * the JVM in the global class cache.
+ *
+ * @since New in 1.9.
+ */
+class SubversionException : public ::Java::Exception
+{
+public:
+ explicit SubversionException(::Java::Env env)
+ : Java::Exception(env, ::Java::ClassCache::get_subversion_exception(env))
+ {}
+
+private:
+ friend class ::Java::ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_SUBVERSION_EXCEPTION_HPP
diff --git a/subversion/bindings/javahl/native/Utility.cpp b/subversion/bindings/javahl/native/Utility.cpp
new file mode 100644
index 0000000..9e30386
--- /dev/null
+++ b/subversion/bindings/javahl/native/Utility.cpp
@@ -0,0 +1,96 @@
+/**
+ * @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
+ */
+
+#include <string>
+#include <apr_strings.h>
+
+#include "svn_string.h"
+
+#include "jniwrapper/jni_array.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_string_map.hpp"
+
+#include "Utility.hpp"
+
+
+namespace JavaHL {
+namespace Util {
+
+namespace {
+class MapToHashIteration
+{
+public:
+ explicit MapToHashIteration(const svn_string_t* default_value,
+ apr_pool_t* pool)
+ : m_pool(pool),
+ m_hash(apr_hash_make(pool)),
+ m_default(default_value)
+ {}
+
+ void operator()(const std::string& key, const Java::ByteArray& value)
+ {
+ const char* const safe_key =
+ apr_pstrmemdup(m_pool, key.c_str(), key.size() + 1);
+ if (!value.get())
+ {
+ if (m_default != NULL)
+ apr_hash_set(m_hash, safe_key, key.size(), m_default);
+ }
+ else
+ {
+ Java::ByteArray::Contents val(value);
+ apr_hash_set(m_hash, safe_key, key.size(), val.get_string(m_pool));
+ }
+ }
+
+ apr_hash_t* get() const
+ {
+ return m_hash;
+ }
+
+private:
+ apr_pool_t* const m_pool;
+ apr_hash_t* const m_hash;
+ const svn_string_t* const m_default;
+};
+
+typedef ::Java::ImmutableMap< ::Java::ByteArray, jbyteArray> ImmutableByteArrayMap;
+} // anonymous namespace
+
+apr_hash_t*
+make_keyword_hash(::Java::Env env, jobject jkeywords, apr_pool_t* pool)
+{
+ const svn_string_t* const empty = svn_string_create_empty(pool);
+ const ImmutableByteArrayMap keywords(env, jkeywords);
+ return keywords.for_each(MapToHashIteration(empty, pool)).get();
+}
+
+apr_hash_t*
+make_property_hash(::Java::Env env, jobject jproperties, apr_pool_t* pool)
+{
+ const ImmutableByteArrayMap props(env, jproperties);
+ return props.for_each(MapToHashIteration(NULL, pool)).get();
+}
+
+} // namespace Util
+} // namespace JavaHL
diff --git a/subversion/bindings/javahl/native/Utility.hpp b/subversion/bindings/javahl/native/Utility.hpp
new file mode 100644
index 0000000..7d91c91
--- /dev/null
+++ b/subversion/bindings/javahl/native/Utility.hpp
@@ -0,0 +1,90 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_UTILITY_HPP
+#define SVN_JAVAHL_UTILITY_HPP
+
+#include <apr_hash.h>
+
+#include "Pool.h"
+
+namespace JavaHL {
+namespace Util {
+
+/**
+ * Converts keyword/valuue pairs in the the Java map @a jkeywords to
+ * an APR hash table allocated in @a pool. The keys in the resulting
+ * table are @c const @c char*, the values are @c svn_string_t*. Null
+ * values in the Java map are converted to empty strings.
+ *
+ * @since New in 1.9.
+ */
+apr_hash_t*
+make_keyword_hash(::Java::Env env, jobject jkeywords, apr_pool_t* pool);
+
+/**
+ * Converts keyword/valuue pairs in the the Java map @a jkeywords to
+ * an APR hash table allocated in @a pool. The keys in the resulting
+ * table are @c const @c char*, the values are @c svn_string_t*. Null
+ * values in the Java map are converted to empty strings.
+ *
+ * @since New in 1.9.
+ */
+inline apr_hash_t*
+make_keyword_hash(::Java::Env env, jobject jkeywords,
+ const ::SVN::Pool& pool)
+{
+ return make_keyword_hash(env, jkeywords, pool.getPool());
+}
+
+
+/**
+ * Converts property/value pairs the Java map @a jproperties to an APR
+ * hash table allocated in @a pool. The keys in the resulting table
+ * are @c const @c char*, the values are @c svn_string_t*. Null values
+ * in the Java map will not appear in the converted map.
+ *
+ * @since New in 1.9.
+ */
+apr_hash_t*
+make_property_hash(::Java::Env env, jobject jproperties, apr_pool_t* pool);
+
+/**
+ * Converts property/value pairs the Java map @a jproperties to an APR
+ * hash table allocated in @a pool. The keys in the resulting table
+ * are @c const @c char*, the values are @c svn_string_t*. Null values
+ * in the Java map will not appear in the converted map.
+ *
+ * @since New in 1.9.
+ */
+inline apr_hash_t*
+make_property_hash(::Java::Env env, jobject jproperties,
+ const ::SVN::Pool& pool)
+{
+ return make_property_hash(env, jproperties, pool.getPool());
+}
+
+} // namespace Util
+} // namespace JavaHL
+
+#endif // SVN_JAVAHL_JNI_UTILITY_HPP
diff --git a/subversion/bindings/javahl/native/VersionExtended.cpp b/subversion/bindings/javahl/native/VersionExtended.cpp
index 1dc47db..7202778 100644
--- a/subversion/bindings/javahl/native/VersionExtended.cpp
+++ b/subversion/bindings/javahl/native/VersionExtended.cpp
@@ -27,7 +27,7 @@
#include "JNIUtil.h"
#include "VersionExtended.h"
-const VersionExtended *
+VersionExtended *
VersionExtended::getCppObject(jobject jthis)
{
if (!jthis)
@@ -35,7 +35,7 @@ VersionExtended::getCppObject(jobject jthis)
static jfieldID fid = 0;
jlong cppAddr = SVNBase::findCppAddrForJObject(
- jthis, &fid, JAVA_PACKAGE"/types/VersionExtended");
+ jthis, &fid, JAVAHL_CLASS("/types/VersionExtended"));
return (cppAddr == 0 ? NULL : reinterpret_cast<VersionExtended *>(cppAddr));
}
@@ -46,7 +46,7 @@ static jobject getWrapperAddress(jobject jthat, volatile jfieldID *fid)
if (!*fid)
{
*fid = env->GetFieldID(env->GetObjectClass(jthat), "wrapper",
- "L"JAVA_PACKAGE"/types/VersionExtended;");
+ JAVAHL_ARG("/types/VersionExtended;"));
if (JNIUtil::isJavaExceptionThrown())
{
*fid = 0;
@@ -94,5 +94,5 @@ VersionExtended::~VersionExtended() {}
void VersionExtended::dispose(jobject jthis)
{
static jfieldID fid = 0;
- SVNBase::dispose(jthis, &fid, JAVA_PACKAGE"/types/VersionExtended");
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/types/VersionExtended"));
}
diff --git a/subversion/bindings/javahl/native/VersionExtended.h b/subversion/bindings/javahl/native/VersionExtended.h
index 8df81f3..4b5ff48 100644
--- a/subversion/bindings/javahl/native/VersionExtended.h
+++ b/subversion/bindings/javahl/native/VersionExtended.h
@@ -33,7 +33,7 @@
class VersionExtended : public SVNBase
{
public:
- static const VersionExtended *getCppObject(jobject jthis);
+ static VersionExtended *getCppObject(jobject jthis);
static const VersionExtended *getCppObjectFromLinkedLib(jobject jthat);
static const VersionExtended *getCppObjectFromLoadedLib(jobject jthat);
static const VersionExtended *getCppObjectFromLinkedLibIterator(jobject jthat);
diff --git a/subversion/bindings/javahl/native/deprecated.cpp b/subversion/bindings/javahl/native/deprecated.cpp
new file mode 100644
index 0000000..2ba5e10
--- /dev/null
+++ b/subversion/bindings/javahl/native/deprecated.cpp
@@ -0,0 +1,60 @@
+/**
+ * @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 deprecated.cpp
+ * @brief: Implementation of methods that intentionally use deprecated
+ * Subversion APIs.
+ */
+
+/* We define this here to remove any further warnings about the usage of
+ deprecated functions in this file. */
+#define SVN_DEPRECATED
+
+#include "SVNClient.h"
+#include "JNIUtil.h"
+#include "Path.h"
+#include "Revision.h"
+
+#include "svn_client.h"
+
+void SVNClient::mergeReintegrate(const char *path, Revision &pegRevision,
+ const char *localPath, bool dryRun)
+{
+ SVN::Pool subPool(pool);
+ SVN_JNI_NULL_PTR_EX(path, "path", );
+ SVN_JNI_NULL_PTR_EX(localPath, "localPath", );
+ Path intLocalPath(localPath, subPool);
+ SVN_JNI_ERR(intLocalPath.error_occurred(), );
+
+ Path srcPath(path, subPool);
+ SVN_JNI_ERR(srcPath.error_occurred(), );
+
+ svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
+ if (ctx == NULL)
+ return;
+
+ SVN_JNI_ERR(svn_client_merge_reintegrate(srcPath.c_str(),
+ pegRevision.revision(),
+ intLocalPath.c_str(),
+ dryRun, NULL, ctx,
+ subPool.getPool()), );
+}
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_array.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_array.hpp
new file mode 100644
index 0000000..0c92e7a
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_array.hpp
@@ -0,0 +1,267 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_ARRAY_HPP
+#define SVN_JAVAHL_JNIWRAPPER_ARRAY_HPP
+
+#include <cstring>
+#include <string>
+
+#include "svn_string.h"
+
+#include "jni_env.hpp"
+#include "../Pool.h"
+
+namespace Java {
+
+/**
+ * Wrapper class for Java byte arrays.
+ *
+ * @since New in 1.9.
+ */
+class ByteArray
+{
+public:
+ /**
+ * Constructs a wrapper around an existing @a array.
+ */
+ explicit ByteArray(Env env, jbyteArray array)
+ : m_env(env),
+ m_length(array ? m_env.GetArrayLength(array) : 0),
+ m_array(array)
+ {}
+
+ /**
+ * Constructs a new, uninitialized array of size @a length.
+ */
+ explicit ByteArray(Env env, jsize length)
+ : m_env(env),
+ m_length(length),
+ m_array(m_env.NewByteArray(m_length))
+ {}
+
+ /**
+ * Constructs a new array and wrapper from @a text.
+ */
+ explicit ByteArray(Env env, const char* text)
+ : m_env(env),
+ m_length(jsize(::std::strlen(text))),
+ m_array(m_env.NewByteArray(m_length))
+ {
+ ByteArray::MutableContents contents(*this);
+ ::memcpy(contents.data(), text, m_length);
+ }
+
+ /**
+ * Constructs a new array and wrapper of size @a length
+ * from @a data.
+ */
+ explicit ByteArray(Env env, const void* data, jsize length)
+ : m_env(env),
+ m_length(length),
+ m_array(m_env.NewByteArray(m_length))
+ {
+ ByteArray::MutableContents contents(*this);
+ ::memcpy(contents.data(), data, m_length);
+ }
+
+ /**
+ * Constructs a new array and wrapper from @a text.
+ */
+ explicit ByteArray(Env env, const std::string& text)
+ : m_env(env),
+ m_length(jsize(text.size())),
+ m_array(m_env.NewByteArray(m_length))
+ {
+ ByteArray::MutableContents contents(*this);
+ ::memcpy(contents.data(), text.c_str(), m_length);
+ }
+
+ /**
+ * Returns the wrapped native array reference.
+ */
+ jbyteArray get() const
+ {
+ return m_array;
+ }
+
+ /**
+ * Returns the size of the wrapped array.
+ */
+ jsize length() const
+ {
+ return m_length;
+ }
+
+ /**
+ * Accessor class for the contents of the byte array.
+ *
+ * Objects of this class should be created within the scope where
+ * the raw data stored in the array must be manipulated. They will
+ * create an immutable mirror of the array contents.
+ */
+ class Contents
+ {
+ public:
+ /**
+ * Constructs an immutable array contents accessor.
+ *
+ * Whilst the returned contents are themselves mutable, the
+ * destructor will discard any changes.
+ */
+ explicit Contents(const ByteArray& array)
+ : m_array(array),
+ m_data(!array.m_array ? NULL
+ : array.m_env.GetByteArrayElements(array.m_array, NULL))
+ {}
+
+ /**
+ * Releases the array contents.
+ */
+ ~Contents()
+ {
+ if (m_data)
+ {
+ const Env& env = m_array.m_env;
+ env.ReleaseByteArrayElements(m_array.m_array, m_data, JNI_ABORT);
+ }
+ }
+
+ /**
+ * Returns the address of the immutable array contents.
+ * @note The data will @b not be NUL-terminated!
+ */
+ const char* data() const
+ {
+ return reinterpret_cast<const char*>(m_data);
+ }
+
+ /**
+ * Returns the size of the array contents.
+ */
+ jsize length() const
+ {
+ return m_array.m_length;
+ }
+
+ /**
+ * Copies the array contents to a NUL-terminated string allocated
+ * from @a result_pool.
+ */
+ svn_string_t* get_string(apr_pool_t* result_pool) const
+ {
+ if (m_data)
+ return svn_string_ncreate(data(), m_array.m_length, result_pool);
+ return NULL;
+ }
+
+ /**
+ * Copies the array contents to a NUL-terminated string allocated
+ * from @a result_pool.
+ */
+ svn_string_t* get_string(const ::SVN::Pool& result_pool) const
+ {
+ return get_string(result_pool.getPool());
+ }
+
+ protected:
+ const ByteArray& m_array;
+ jbyte* m_data;
+ };
+
+ /**
+ * Accessor class for the contents of the byte array.
+ *
+ * Behaves like the #Contents class, but the mirrored contents are
+ * considered mutable and any changes made to them will be committed
+ * to the JVM.
+ */
+ class MutableContents : protected Contents
+ {
+ public:
+ /**
+ * Constructs a mutable array contents accessor.
+ */
+ explicit MutableContents(ByteArray& array)
+ : Contents(array)
+ {}
+
+ /**
+ * Releases the array contents, committing changes to the JVM.
+ */
+ ~MutableContents()
+ {
+ if (m_data)
+ {
+ // Prevent double-release by the Contents desctuctor
+ jbyte* const data = m_data;
+ m_data = NULL;
+ m_array.m_env.ReleaseByteArrayElements(m_array.m_array, data, 0);
+ }
+ }
+ /**
+ * Returns the mutable address of the array contents.
+ * @note The data will @b not be NUL-terminated!
+ */
+ char* data()
+ {
+ return const_cast<char*>(Contents::data());
+ }
+
+ /**
+ * Returns the size of the array contents.
+ */
+ jsize length() const
+ {
+ return Contents::length();
+ }
+
+ /**
+ * Copies the array contents to a NUL-terminated string allocated
+ * from @a result_pool.
+ */
+ svn_string_t* get_string(apr_pool_t* result_pool) const
+ {
+ return Contents::get_string(result_pool);
+ }
+
+ /**
+ * Copies the array contents to a NUL-terminated string allocated
+ * from @a result_pool.
+ */
+ svn_string_t* get_string(const ::SVN::Pool& result_pool) const
+ {
+ return Contents::get_string(result_pool.getPool());
+ }
+ };
+
+private:
+ friend class Contents;
+ const Env m_env;
+ const jsize m_length;
+ const jbyteArray m_array;
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_ARRAY_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
new file mode 100644
index 0000000..e3671a2
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
@@ -0,0 +1,382 @@
+/**
+ * @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
+ */
+
+#include <cstring>
+#include <memory>
+#include <apr.h>
+
+#include "jni_env.hpp"
+#include "jni_globalref.hpp"
+#include "jni_exception.hpp"
+#include "jni_object.hpp"
+#include "jni_string.hpp"
+#include "jni_array.hpp"
+#include "jni_stack.hpp"
+
+#include "../JNIUtil.h"
+bool initialize_jni_util(JNIEnv *env);
+
+#include "svn_private_config.h"
+
+
+// Global library initializaiton
+
+/**
+ * Initializer function, called just after the JVM loads the native
+ * library. Stores the global JVM reference and creates the global
+ * class cache.
+ */
+JNIEXPORT jint JNICALL
+JNI_OnLoad(JavaVM* jvm, void*)
+{
+ ::Java::Env::static_init(jvm);
+ const ::Java::Env env;
+
+ const apr_status_t status = apr_initialize();
+ if (!status)
+ ::Java::ClassCache::create();
+ else
+ {
+ char buf[2048];
+ std::strcpy(buf, "Could not initialize APR: ");
+ const std::size_t offset = std::strlen(buf);
+ apr_strerror(status, buf + offset, sizeof(buf) - offset - 1);
+ env.ThrowNew(env.FindClass("java/lang/Error"), buf);
+ }
+
+ // Initialize the old-style JavaHL infrastructure.
+ if (!initialize_jni_util(env.get()) && !env.ExceptionCheck())
+ {
+ env.ThrowNew(env.FindClass("java/lang/LinkageError"),
+ "Native library initialization failed");
+ }
+
+ return JNI_VERSION_1_2;
+}
+
+/**
+ * Cleanup function, called just before the JVM unloads the native
+ * library. Destroys the global class cache.
+ */
+JNIEXPORT void JNICALL
+JNI_OnUnload(JavaVM*, void*)
+{
+ ::Java::ClassCache::destroy();
+ apr_terminate();
+}
+
+
+namespace Java {
+
+// class Java::Env
+
+::JavaVM* Env::m_jvm = NULL;
+void Env::static_init(::JavaVM* jvm)
+{
+ m_jvm = jvm;
+}
+
+const char* Env::error_create_global_reference() throw()
+{
+ return _("Could not create global reference");
+}
+
+const char* Env::error_get_contents_string() throw()
+{
+ return _("Could not get contents of Java String");
+}
+
+const char* Env::error_release_null_string() throw()
+{
+ return _("Could not release contents of a null String");
+}
+
+const char* Env::error_create_object_array() throw()
+{
+ return _("Could not create Object array");
+}
+
+namespace {
+// The typed array error messages are always fatal, so allocating
+// the buffer on the heap and never releasing it does not really
+// constitute a memory leak.
+const char* make_typed_error(const char* fmt, const char* type) throw()
+{
+ const apr_size_t bufsize = 512;
+ char *msg = new(std::nothrow) char[bufsize];
+ apr_snprintf(msg, bufsize, fmt, type);
+ return msg;
+}
+} // anonymous namespace
+
+const char* Env::error_create_array(const char* type) throw()
+{
+ return make_typed_error(_("Could not create %sArray"), type);
+}
+
+const char* Env::error_get_contents_array(const char* type) throw()
+{
+ return make_typed_error(_("Could not get %s array contents"), type);
+}
+
+const char* Env::error_release_null_array(const char* type) throw()
+{
+ return make_typed_error(
+ _("Could not release contents of a null %sArray"), type);
+}
+
+::JNIEnv* Env::env_from_jvm()
+{
+ if (m_jvm)
+ {
+ void *penv;
+ switch (m_jvm->GetEnv(&penv, JNI_VERSION_1_2))
+ {
+ case JNI_OK:
+ return static_cast<JNIEnv*>(penv);
+
+ case JNI_EDETACHED:
+ throw std::runtime_error(
+ _("Native thread is not attached to a Java VM"));
+
+ case JNI_EVERSION:
+ throw std::runtime_error(_("Unsupported JNI version"));
+
+ default:
+ throw std::runtime_error(_("Invalid JNI environment"));
+ }
+ }
+ throw std::logic_error(_("JavaVM instance was not initialized"));
+}
+
+void Env::throw_java_out_of_memory(const char* message) const
+{
+ OutOfMemoryError(*this).raise(message);
+}
+
+// class Java::LocalFrame
+
+const jint LocalFrame::DEFAULT_CAPACITY = 16;
+
+
+// class Java::GlobalObject
+
+GlobalObject& GlobalObject::operator=(jobject that)
+{
+ this->~GlobalObject();
+ return *new(this) GlobalObject(Env(), that);
+}
+
+GlobalObject::~GlobalObject()
+{
+ if (m_obj)
+ Env().DeleteGlobalRef(m_obj);
+}
+
+
+// class Java::GlobalClass
+
+GlobalClass& GlobalClass::operator=(jclass that)
+{
+ this->~GlobalClass();
+ return *new(this) GlobalClass(Env(), that);
+}
+
+
+// Class Java::Object
+
+const char* const Object::m_class_name = "java/lang/Object";
+Object::ClassImpl::~ClassImpl() {}
+
+
+// Class Java::Class
+
+const char* const Class::m_class_name = "java/lang/Class";
+Class::ClassImpl::~ClassImpl() {}
+
+MethodID Class::m_mid_get_class;
+MethodID Class::m_mid_get_name;
+
+void Class::static_init(Env env, jclass cls)
+{
+ m_mid_get_class = env.GetMethodID(
+ ClassCache::get_object(env)->get_class(),
+ "getClass", "()Ljava/lang/Class;");
+ m_mid_get_name = env.GetMethodID(
+ cls, "getName", "()Ljava/lang/String;");
+}
+
+namespace{
+jobject get_class_of_object(Env env, jobject obj, jmethodID mid_get_class)
+{
+ if (!obj)
+ return NULL;
+ return env.CallObjectMethod(obj, mid_get_class);
+}
+} // anonymous namespace
+
+Class::Class(Env env, jobject obj)
+ : m_env(env),
+ m_jthis(get_class_of_object(env, obj, m_mid_get_class))
+{}
+
+Class::Class(const Object& obj)
+ : m_env(obj.get_env()),
+ m_jthis(get_class_of_object(obj.get_env(), obj.get(), m_mid_get_class))
+{}
+
+jstring Class::get_name() const
+{
+ if (!m_jthis)
+ return NULL;
+ return jstring(m_env.CallObjectMethod(m_jthis, m_mid_get_name));
+}
+
+
+// Class Java::String
+
+const char* const String::m_class_name = "java/lang/String";
+String::ClassImpl::~ClassImpl() {}
+
+const char* String::strdup(apr_pool_t* pool) const
+{
+ return apr_pstrdup(pool, String::Contents(*this).c_str());
+}
+
+void String::MutableContents::set_value(const char* new_text)
+{
+ if (!m_new_text)
+ throw std::invalid_argument(
+ _("Cannot set String contents to null"));
+ if (m_text)
+ {
+ m_new_text = new_text;
+ m_length = jsize(::std::strlen(new_text));
+ }
+ else
+ throw std::logic_error(
+ _("Cannot change the contents of a null String"));
+}
+
+// class Java::Exception
+
+void Exception::throw_java_exception() const
+{
+ if (instantiated()
+ ? m_env.Throw(m_jthis)
+ : m_env.ThrowNew(m_class, NULL))
+ throw std::runtime_error(_("Could not throw Java exception"));
+}
+
+void Exception::throw_java_exception(const char* message) const
+{
+ if (m_env.ThrowNew(m_class, message))
+ throw std::runtime_error(_("Could not throw Java exception"));
+}
+
+jstring Exception::get_message() const
+{
+ if (instantiated())
+ return jstring(m_env.CallObjectMethod(m_jthis, m_mid_get_message));
+ throw std::logic_error(_("Could not get exception message:"
+ " Exception instance is not available"));
+}
+
+const char* const Exception::m_class_name = "java/lang/Throwable";
+Exception::ClassImpl::~ClassImpl() {}
+
+MethodID Exception::m_mid_get_message;
+void Exception::static_init(Env env, jclass cls)
+{
+ m_mid_get_message = env.GetMethodID(
+ cls, "getMessage", "()Ljava/lang/String;");
+}
+
+// Other exception class initializers
+
+const char* const RuntimeException::m_class_name =
+ "java/lang/RuntimeException";
+
+const char* const NullPointerException::m_class_name =
+ "java/lang/NullPointerException";
+
+const char* const OutOfMemoryError::m_class_name =
+ "java/lang/OutOfMemoryError";
+
+const char* const IndexOutOfBoundsException::m_class_name =
+ "java/lang/IndexOutOfBoundsException";
+IndexOutOfBoundsException::ClassImpl::~ClassImpl() {}
+
+const char* const IOException::m_class_name =
+ "java/io/IOException";
+
+const char* const IllegalArgumentException::m_class_name =
+ "java/lang/IllegalArgumentException";
+
+const char *const NoSuchElementException::m_class_name =
+ "java/util/NoSuchElementException";
+NoSuchElementException::ClassImpl::~ClassImpl() {}
+
+// Implementation of jni_stack.hpp
+
+void handle_svn_error(Env env, ::svn_error_t* err)
+{
+ jthrowable cause = NULL;
+
+ // If the exception being currently thrown was generated by the
+ // JavaHL bindings, then assume the error was propagated through
+ // native code and do not re-throw it.
+ if (env.ExceptionCheck())
+ {
+ cause = env.ExceptionOccurred();
+ if (env.IsInstanceOf(
+ cause, ClassCache::get_subversion_exception(env)->get_class()))
+ {
+ // XXX FIXME: Should really have a special error code
+ // specifically for propagating Java exceptions from
+ // callbacks through native code.
+ svn_error_clear(err);
+ throw SignalExceptionThrown();
+ }
+ }
+
+ // Make sure there's only a single exception in the environment.
+ if (cause)
+ env.ExceptionClear();
+
+ ::JNIUtil::handleSVNError(err, cause);
+ throw SignalExceptionThrown();
+}
+
+const char* unknown_cxx_exception_message() throw()
+{
+ return _("Caught unknown C++ exception");
+}
+
+svn_error_t* caught_java_exception_error(apr_status_t status) throw()
+{
+ return svn_error_create(status, JNIUtil::wrapJavaException(),
+ _("Java exception"));
+}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
new file mode 100644
index 0000000..a3d41b2
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
@@ -0,0 +1,257 @@
+/**
+ * @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
+ */
+
+#include <stdexcept>
+
+#include "jni_object.hpp"
+#include "jni_array.hpp"
+#include "jni_channel.hpp"
+
+#include "svn_private_config.h"
+
+namespace Java {
+
+namespace {
+// Get the ByteBuffer's internal array.
+jbyteArray get_array(Env env, jobject buffer,
+ const MethodID& mid_has_array,
+ const MethodID& mid_get_array)
+{
+ if (!env.CallBooleanMethod(buffer, mid_has_array))
+ return NULL;
+ return jbyteArray(env.CallObjectMethod(buffer, mid_get_array));
+}
+
+// Get the offset in the ByteBuffer's array. NEVER call this function
+// unless the buffer actually has an accessible array.
+jint get_array_offset(Env env, jobject buffer,
+ const MethodID& mid_get_array_offset)
+{
+ return env.CallIntMethod(buffer, mid_get_array_offset);
+}
+
+// Get the remaining space in a ByteBuffer.
+jint get_remaining(Env env, jobject buffer,
+ const MethodID& mid_get_remaining)
+{
+ return env.CallIntMethod(buffer, mid_get_remaining);
+}
+
+// Get the current position of a ByteBuffer.
+jint get_position(Env env, jobject buffer,
+ const MethodID& mid_get_position)
+{
+ return env.CallIntMethod(buffer, mid_get_position);
+}
+
+// Set the new position of a ByteBuffer.
+void set_position(Env env, jobject buffer,
+ const MethodID& mid_set_position,
+ jint new_position)
+{
+ env.CallObjectMethod(buffer, mid_set_position, new_position);
+}
+
+// Get byte array contents from a ByteBuffer.
+void get_bytearray(Env env, jobject buffer,
+ const MethodID& mid_get_bytearray,
+ ByteArray& array, jint length = -1, jint offset = 0)
+{
+ env.CallObjectMethod(
+ buffer, mid_get_bytearray, array.get(), offset,
+ (length >= 0 ? length : (array.length() - offset)));
+}
+
+// Put byte array contents into a ByteBuffer.
+void put_bytearray(Env env, jobject buffer,
+ const MethodID& mid_put_bytearray,
+ ByteArray& array, jint length = -1, jint offset = 0)
+{
+ env.CallObjectMethod(buffer, mid_put_bytearray,
+ array.get(), offset,
+ (length >= 0 ? length : (array.length() - offset)));
+}
+
+struct BadReaderWriter : public ChannelReader, ChannelWriter
+{
+ BadReaderWriter() {}
+
+ virtual jint operator()(Env, void*, jint)
+ {
+ throw std::logic_error(_("Reading from write-only channel"));
+ }
+
+ virtual jint operator()(Env, const void*, jint)
+ {
+ throw std::logic_error(_("Writing to read-only channel"));
+ }
+} bad_reader_writer;
+
+} // anonymous namespace
+
+
+ChannelReader& ByteChannel::m_null_reader = bad_reader_writer;
+ChannelWriter& ByteChannel::m_null_writer = bad_reader_writer;
+
+const char* const ByteChannel::ByteBuffer::m_class_name =
+ "java/nio/ByteBuffer";
+
+ByteChannel::ByteBuffer::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_has_array(env.GetMethodID(cls, "hasArray", "()Z")),
+ m_mid_get_array(env.GetMethodID(cls, "array", "()[B")),
+ m_mid_get_array_offset(env.GetMethodID(cls, "arrayOffset", "()I")),
+ m_mid_get_remaining(env.GetMethodID(cls, "remaining", "()I")),
+ m_mid_get_position(env.GetMethodID(cls, "position", "()I")),
+ m_mid_set_position(env.GetMethodID(cls, "position",
+ "(I)Ljava/nio/Buffer;")),
+ m_mid_get_bytearray(env.GetMethodID(cls, "get",
+ "([BII)Ljava/nio/ByteBuffer;")),
+ m_mid_put_bytearray(env.GetMethodID(cls, "put",
+ "([BII)Ljava/nio/ByteBuffer;"))
+{}
+
+ByteChannel::ByteBuffer::ClassImpl::~ClassImpl() {}
+
+jint ByteChannel::read(jobject destination)
+{
+ const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl(m_env);
+
+ const jint remaining = get_remaining(m_env, destination,
+ bufimpl.m_mid_get_remaining);
+ if (!remaining)
+ {
+ // No space in the buffer; don't try to read anything.
+ return 0;
+ }
+
+ const jint position = get_position(m_env, destination,
+ bufimpl.m_mid_get_position);
+
+ jint bytes_read = 0;
+ void* data = m_env.GetDirectBufferAddress(destination);
+ if (data)
+ {
+ data = static_cast<char*>(data) + position;
+ bytes_read = m_reader(m_env, data, remaining);
+ }
+ else
+ {
+ // It was not a direct buffer ... see if it has an array.
+ jbyteArray raw_array = get_array(m_env, destination,
+ bufimpl.m_mid_has_array,
+ bufimpl.m_mid_get_array);
+ if (raw_array)
+ {
+ const jint array_offset = get_array_offset(
+ m_env, destination,
+ bufimpl.m_mid_get_array_offset);
+ ByteArray array(m_env, raw_array);
+ ByteArray::MutableContents contents(array);
+ data = contents.data();
+ data = static_cast<char*>(data) + position + array_offset;
+ bytes_read = m_reader(m_env, data, remaining);
+ }
+ }
+ if (data)
+ {
+ if (bytes_read > 0)
+ set_position(m_env, destination,
+ bufimpl.m_mid_set_position,
+ position + bytes_read);
+ return bytes_read;
+ }
+
+ // No accessible array, either. Oh well. Create a byte array and
+ // push it into the buffer.
+ ByteArray array(m_env, remaining);
+ ByteArray::MutableContents contents(array);
+ bytes_read = m_reader(m_env, contents.data(), contents.length());
+ if (bytes_read > 0)
+ put_bytearray(m_env, destination,
+ bufimpl.m_mid_put_bytearray,
+ array, bytes_read);
+ return bytes_read;
+}
+
+jint ByteChannel::write(jobject source)
+{
+ const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl(m_env);
+
+ const jint remaining = get_remaining(m_env, source,
+ bufimpl.m_mid_get_remaining);
+ if (!remaining)
+ {
+ // No data in the buffer; don't try to write anything.
+ return 0;
+ }
+
+ const jint position = get_position(m_env, source,
+ bufimpl.m_mid_get_position);
+
+ jint bytes_written = 0;
+ const void* data = m_env.GetDirectBufferAddress(source);
+ if (data)
+ {
+ data = static_cast<const char*>(data) + position;
+ bytes_written = m_writer(m_env, data, remaining);
+ }
+ else
+ {
+ // It was not a direct buffer ... see if it has an array.
+ jbyteArray raw_array = get_array(m_env, source,
+ bufimpl.m_mid_has_array,
+ bufimpl.m_mid_get_array);
+ if (raw_array)
+ {
+ const jint array_offset = get_array_offset(
+ m_env, source,
+ bufimpl.m_mid_get_array_offset);
+ const ByteArray array(m_env, raw_array);
+ ByteArray::Contents contents(array);
+ data = contents.data();
+ data = static_cast<const char*>(data) + position + array_offset;
+ bytes_written = m_writer(m_env, data, remaining);
+ }
+ }
+ if (data)
+ {
+ if (bytes_written > 0)
+ set_position(m_env, source,
+ bufimpl.m_mid_set_position,
+ position + bytes_written);
+ return bytes_written;
+ }
+
+ // No accessible array, either. Oh well. Get an array from the
+ // buffer and read data from that.
+ ByteArray array(m_env, remaining);
+ get_bytearray(m_env, source,
+ bufimpl.m_mid_get_bytearray,
+ array);
+ ByteArray::Contents contents(array);
+ bytes_written = m_writer(m_env, contents.data(), contents.length());
+ return bytes_written;
+}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
new file mode 100644
index 0000000..7af5783
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
@@ -0,0 +1,223 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_CHANNEL_HPP
+#define SVN_JAVAHL_JNIWRAPPER_CHANNEL_HPP
+
+#include "jni_env.hpp"
+
+namespace Java {
+
+/**
+ * Abstract base class for implementing channel read method internals.
+ *
+ * @since New in 1.9.
+ */
+struct ChannelReader
+{
+ /**
+ * Reads at most @a length bytes into @a buffer, returning the
+ * number of bytes read (which may be zero) or -1 if at
+ * end-of-stream.
+ */
+ virtual jint operator()(Env env, void* buffer, jint length) = 0;
+};
+
+/**
+ * Abstract base class for implementing channel write method internals.
+ *
+ * @since New in 1.9.
+ */
+struct ChannelWriter
+{
+ /**
+ * Writes at exactly @a length bytes from @a buffer, returning the
+ * number of bytes written (which may be zero).
+ */
+ virtual jint operator()(Env env, const void* buffer, jint length) = 0;
+};
+
+
+/**
+ * Wrapper for @c java.nio.channels.ByteChannel. Unlike most wrappers,
+ * this one does not actually represent a ByteChannel object. The
+ * assumption is that the native implementation will want to implement
+ * the read and write methods, not invoke them.
+ *
+ * Also serves as the (protected) base of the Readable- and
+ * WritableByteChannel interfaces; this is for purposes of code
+ * sharing only. We're not interested in replicating Java's class
+ * hierarchy here.
+ *
+ * @since New in 1.9.
+ */
+class ByteChannel
+{
+public:
+ /**
+ * Constructs a wrapper for @a channel with @a reader and @a writer
+ * as the read and write method implementations.
+ */
+ explicit ByteChannel(Env env, ChannelReader& reader, ChannelWriter& writer)
+ : m_env(env),
+ m_reader(reader),
+ m_writer(writer)
+ {}
+
+ /**
+ * Reads bytes into @a destination, which must be a
+ * @c java.nio.ByteBuffer instance, from #m_reader.
+ * @return the number of bytes read, or -1 if at end-of-stream.
+ */
+ jint read(jobject destination);
+
+ /**
+ * Writes bytes from @a source, which must be a
+ * @c java.nio.ByteBuffer instance, to #m_writer.
+ * @return the number of bytes written.
+ */
+ jint write(jobject source);
+
+protected:
+ /**
+ * Constructor used by read-only subclasses.
+ */
+ explicit ByteChannel(Env env, ChannelReader& reader)
+ : m_env(env),
+ m_reader(reader),
+ m_writer(m_null_writer)
+ {}
+
+ /**
+ * Constructor used by write-only subclasses.
+ */
+ explicit ByteChannel(Env env, ChannelWriter& writer)
+ : m_env(env),
+ m_reader(m_null_reader),
+ m_writer(writer)
+ {}
+
+private:
+ Env m_env;
+ ChannelReader& m_reader;
+ ChannelWriter& m_writer;
+
+ static ChannelReader& m_null_reader;
+ static ChannelWriter& m_null_writer;
+
+ friend class ClassCacheImpl;
+
+ // Private references for the java.nio.ByteBuffer class.
+ struct ByteBuffer
+ {
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_has_array;
+ const MethodID m_mid_get_array;
+ const MethodID m_mid_get_array_offset;
+ const MethodID m_mid_get_remaining;
+ const MethodID m_mid_get_position;
+ const MethodID m_mid_set_position;
+ const MethodID m_mid_get_bytearray;
+ const MethodID m_mid_put_bytearray;
+ };
+
+ static const char* const m_class_name;
+ static const ClassImpl& impl(Env env)
+ {
+ return *dynamic_cast<const ClassImpl*>(
+ ClassCache::get_byte_buffer(env));
+ }
+ };
+};
+
+
+/**
+ * Wrapper for @c java.nio.channels.ReadableByteChannel.
+ *
+ * @since New in 1.9.
+ */
+class ReadableByteChannel : protected ByteChannel
+{
+public:
+ /**
+ * Constructs a wrapper for @a channel with @a reader the read
+ * method implementation.
+ */
+ explicit ReadableByteChannel(Env env, ChannelReader& reader)
+ : ByteChannel(env, reader)
+ {}
+
+ /**
+ * Reads bytes into @a destination, which must be a
+ * @c java.nio.ByteBuffer instance, from #m_reader.
+ * @return the number of bytes read, or -1 if at end-of-stream.
+ */
+ jint read(jobject destination)
+ {
+ return ByteChannel::read(destination);
+ }
+};
+
+
+/**
+ * Wrapper @c java.nio.channels.WritableByteChannel.
+ *
+ * @since New in 1.9.
+ */
+class WritableByteChannel : protected ByteChannel
+{
+public:
+ /**
+ * Constructs a wrapper for @a channel with @a writer as the write
+ * method implementation.
+ */
+ explicit WritableByteChannel(Env env, ChannelWriter& writer)
+ : ByteChannel(env, writer)
+ {}
+
+ /**
+ * Writes bytes from @a source, which must be a
+ * @c java.nio.ByteBuffer instance, to #m_writer.
+ * @return the number of bytes written.
+ */
+ jint write(jobject source)
+ {
+ return ByteChannel::write(source);
+ }
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_CHANNEL_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
new file mode 100644
index 0000000..9e533db
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
@@ -0,0 +1,326 @@
+/**
+ * @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
+ */
+
+#include <stdexcept>
+
+#include <apr_atomic.h>
+
+#define SVN_JAVAHL_JNIWRAPPER_LOG(expr)
+#include "jni_env.hpp"
+#include "jni_globalref.hpp"
+#include "jni_exception.hpp"
+#include "jni_object.hpp"
+#include "jni_string.hpp"
+
+#include "jni_channel.hpp"
+#include "jni_io_stream.hpp"
+#include "jni_list.hpp"
+#include "jni_string_map.hpp"
+
+#include "../SubversionException.hpp"
+#include "../AuthnCallback.hpp"
+#include "../Credential.hpp"
+#include "../ExternalItem.hpp"
+#include "../EditorCallbacks.hpp"
+
+namespace
+{
+/* This class behaves like a dumbed-down std:auto_ptr, but it
+ implements atomic access and modification of the wrapped
+ pointer. */
+class ClassImplPtr
+{
+ typedef ::Java::Object::ClassImpl ClassImpl;
+
+ public:
+ /* Default constructor; initializes the wrapped pointer to NULL */
+ explicit ClassImplPtr()
+ : m_ptr(NULL)
+ {}
+
+ /* Initializing constructor; sets the wrapped pointer to PTR */
+ explicit ClassImplPtr(ClassImpl* ptr)
+ : m_ptr(ptr)
+ {}
+
+ /* Destructor deletes the object and resets the wrapped pointer to NULL. */
+ ~ClassImplPtr()
+ {
+ delete static_cast<ClassImpl*>(
+ apr_atomic_casptr(&m_ptr, NULL, get()));
+ }
+
+ /* Sets the wrapped pointer to PTR iff it is NULL, and returns the
+ old value. */
+ ClassImpl* test_and_set(ClassImpl* ptr)
+ {
+ return static_cast<ClassImpl*>(
+ apr_atomic_casptr(&m_ptr, ptr, NULL));
+ }
+
+ /* Returns the current value of the the wrapped pointer. */
+ ClassImpl* get() const
+ {
+ return static_cast<ClassImpl*>(
+ apr_atomic_casptr(&m_ptr, NULL, NULL));
+ }
+
+private:
+ // Non-copyable
+ ClassImplPtr(const ClassImplPtr&);
+ ClassImplPtr& operator=(const ClassImplPtr&);
+
+ mutable volatile void* m_ptr;
+};
+} // anonymous namespace
+
+
+namespace Java {
+
+class ClassCacheImpl
+{
+
+ friend class ClassCache;
+
+ // We only statically initialize a few of the common class wrappers.
+ explicit ClassCacheImpl(Env env) :
+
+#define JNIWRAPPER_INIT_CACHED_CLASS(M, C) \
+ m_impl_##M(new C::ClassImpl(env, env.FindClass(C::m_class_name)))
+
+ JNIWRAPPER_INIT_CACHED_CLASS(object, Object),
+ JNIWRAPPER_INIT_CACHED_CLASS(classtype, Class),
+ JNIWRAPPER_INIT_CACHED_CLASS(throwable, Exception),
+ JNIWRAPPER_INIT_CACHED_CLASS(string, String)
+#undef JNIWRAPPER_INIT_CACHED_CLASS
+ {}
+
+ // We can't do this in the constructor above, because the satic
+ // initializers will expect that ClassCache::m_impl is already set;
+ // that doesn't happen until the constructor returns.
+ void static_init(Env env)
+ {
+#define JNIWRAPPER_STATIC_CACHED_CLASS(M, C) \
+ C::static_init(env, m_impl_##M->get_class())
+
+ // No-op JNIWRAPPER_STATIC_CACHED_CLASS(object, Object);
+ JNIWRAPPER_STATIC_CACHED_CLASS(classtype, Class);
+ JNIWRAPPER_STATIC_CACHED_CLASS(throwable, Exception);
+ // No-op JNIWRAPPER_STATIC_CACHED_CLASS(string, String);
+#undef JNIWRAPPER_STATIC_CACHED_CLASS
+ }
+
+ // The statically initialized calss wrappers are always defined and
+ // therefore do not need atomic access.
+#define JNIWRAPPER_DEFINE_CACHED_CLASS(M, C) \
+ std::auto_ptr<Object::ClassImpl> m_impl_##M; \
+ const Object::ClassImpl* get_##M(Env) \
+ { \
+ return m_impl_##M.get(); \
+ }
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(object, Object)
+ JNIWRAPPER_DEFINE_CACHED_CLASS(classtype, Class)
+ JNIWRAPPER_DEFINE_CACHED_CLASS(throwable, Exception)
+ JNIWRAPPER_DEFINE_CACHED_CLASS(string, String)
+#undef JNIWRAPPER_DEFINE_CACHED_CLASS
+
+ // All other class wrappers must be atomically initialized
+#define JNIWRAPPER_DEFINE_CACHED_CLASS(M, C) \
+ ClassImplPtr m_impl_##M; \
+ const Object::ClassImpl* get_##M(Env env) \
+ { \
+ Object::ClassImpl* pimpl = m_impl_##M.get(); \
+ if (!pimpl) \
+ { \
+ std::auto_ptr<Object::ClassImpl> tmp( \
+ new C::ClassImpl( \
+ env, env.FindClass(C::m_class_name))); \
+ pimpl = m_impl_##M.test_and_set(tmp.get()); \
+ if (!pimpl) \
+ pimpl = tmp.release(); \
+ } \
+ return pimpl; \
+ }
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(exc_index_out_of_bounds,
+ IndexOutOfBoundsException);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(exc_no_such_element,
+ NoSuchElementException);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(iterator, BaseIterator);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(list, BaseImmutableList);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(array_list, BaseList);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(map, BaseImmutableMap);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(set, BaseImmutableMap::Set);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(map_entry, BaseImmutableMap::Entry);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(hash_map, BaseMap);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(input_stream, InputStream);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(output_stream, OutputStream);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(byte_buffer,
+ ByteChannel::ByteBuffer);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(subversion_exception,
+ ::JavaHL::SubversionException);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(authn_cb,
+ ::JavaHL::AuthnCallback);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(authn_result,
+ ::JavaHL::AuthnCallback::AuthnResult);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(authn_ssl_server_cert_failures,
+ ::JavaHL::AuthnCallback::SSLServerCertFailures);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(authn_ssl_server_cert_info,
+ ::JavaHL::AuthnCallback::SSLServerCertInfo);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(user_passwd_cb,
+ ::JavaHL::UserPasswordCallback);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(credential,
+ ::JavaHL::Credential);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(credential_kind,
+ ::JavaHL::Credential::Kind);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(external_item,
+ ::JavaHL::ExternalItem);
+
+ JNIWRAPPER_DEFINE_CACHED_CLASS(editor_provide_base_cb,
+ ::JavaHL::ProvideBaseCallback);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(editor_provide_base_cb_ret,
+ ::JavaHL::ProvideBaseCallback::ReturnValue);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(editor_provide_props_cb,
+ ::JavaHL::ProvidePropsCallback);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(editor_provide_props_cb_ret,
+ ::JavaHL::ProvidePropsCallback::ReturnValue);
+ JNIWRAPPER_DEFINE_CACHED_CLASS(editor_get_kind_cb,
+ ::JavaHL::GetNodeKindCallback);
+#undef JNIWRAPPER_DEFINE_CACHED_CLASS
+};
+
+
+ClassCacheImpl* ClassCache::m_impl = NULL;
+
+void ClassCache::create()
+{
+ const char* exception_message = NULL;
+
+ try
+ {
+ const Env env;
+ m_impl = new ClassCacheImpl(env);
+ m_impl->static_init(env);
+ }
+ catch (const SignalExceptionThrown&)
+ {}
+ catch (const std::exception& ex)
+ {
+ exception_message = ex.what();
+ }
+ catch (...)
+ {
+ exception_message = "Caught unknown C++ exception";
+ }
+
+ // Do not throw any more exceptions from here, so use the raw environment.
+ ::JNIEnv* const jenv = Env().get();
+ if (exception_message || jenv->ExceptionCheck())
+ {
+ jobject cause = jenv->ExceptionOccurred();
+ if (cause)
+ jenv->ExceptionClear();
+
+ const jclass rtx = jenv->FindClass("java/lang/RuntimeException");
+ const jmethodID ctor = jenv->GetMethodID(rtx, "<init>",
+ "(Ljava/lang/String;"
+ "Ljava/lang/Throwable;)V");
+ if (!cause && exception_message)
+ {
+ const jstring msg = jenv->NewStringUTF(exception_message);
+ cause = jenv->NewObject(rtx, ctor, msg, jthrowable(0));
+ }
+ const jstring reason =
+ jenv->NewStringUTF("JavaHL native library initialization failed");
+ const jobject exception = jenv->NewObject(rtx, ctor, reason, cause);
+ jenv->Throw(jthrowable(exception));
+ }
+}
+
+void ClassCache::destroy()
+{
+ ClassCacheImpl* const pimpl = m_impl;
+ m_impl = NULL;
+ delete pimpl;
+}
+
+#define JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(M) \
+const Object::ClassImpl* ClassCache::get_##M(Env env) \
+{ \
+ return m_impl->get_##M(env); \
+}
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(object);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(classtype);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(throwable);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(string);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(exc_index_out_of_bounds);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(exc_no_such_element);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(list);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(array_list);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(map);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(set);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(iterator);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(map_entry);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(hash_map);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(input_stream);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(output_stream);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(byte_buffer);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(subversion_exception);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(authn_cb);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(authn_result);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(authn_ssl_server_cert_failures);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(authn_ssl_server_cert_info);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(user_passwd_cb);
+
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(credential);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(credential_kind);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(external_item);
+
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(editor_provide_base_cb);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(editor_provide_base_cb_ret);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(editor_provide_props_cb);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(editor_provide_props_cb_ret);
+JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(editor_get_kind_cb);
+#undef JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp
new file mode 100644
index 0000000..9d73653
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_env.hpp
@@ -0,0 +1,682 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_ENV_HPP
+#define SVN_JAVAHL_JNIWRAPPER_ENV_HPP
+
+#include <jni.h>
+#include <cstdarg>
+#include <stdexcept>
+
+#ifdef SVN_JAVAHL_DEBUG
+# ifndef SVN_JAVAHL_JNIWRAPPER_LOG
+# include <iostream>
+# define SVN_JAVAHL_JNIWRAPPER_LOG(expr) \
+ (std::cerr << expr << std::endl)
+# endif // SVN_JAVAHL_JNIWRAPPER_LOG
+#else
+# define SVN_JAVAHL_JNIWRAPPER_LOG(expr)
+#endif // SVN_JAVAHL_DEBUG
+
+namespace Java {
+
+/**
+ * A C++ exception object for signalling that a Java exception has
+ * been thrown.
+ *
+ * Thrown to unwind the stack while avoiding code clutter when a Java
+ * exception is detected in the JNI environment.
+ *
+ * @since New in 1.9.
+ */
+class SignalExceptionThrown {};
+
+/**
+ * Auto-initializing proxy for the JNI method ID.
+ *
+ * Behaves like a @c jmethodID but automatically initializes to @c NULL.
+ *
+ * @since New in 1.9.
+ */
+class MethodID
+{
+public:
+ MethodID()
+ : m_mid(NULL)
+ {}
+
+ MethodID(jmethodID mid)
+ : m_mid(mid)
+ {}
+
+ MethodID(const MethodID& that)
+ : m_mid(that.m_mid)
+ {}
+
+ MethodID& operator=(jmethodID mid)
+ {
+ m_mid = mid;
+ return *this;
+ }
+
+ MethodID& operator=(const MethodID& that)
+ {
+ m_mid = that.m_mid;
+ return *this;
+ }
+
+ operator jmethodID() const
+ {
+ return m_mid;
+ }
+
+ operator bool() const
+ {
+ return (NULL != m_mid);
+ }
+
+private:
+ jmethodID m_mid;
+};
+
+
+/**
+ * Auto-initializing proxy for the JNI field ID.
+ *
+ * Behaves like a @c jfieldID but automatically initializes to @c NULL.
+ *
+ * @since New in 1.9.
+ */
+class FieldID
+{
+public:
+ FieldID()
+ : m_fid(NULL)
+ {}
+
+ FieldID(jfieldID mid)
+ : m_fid(mid)
+ {}
+
+ FieldID(const FieldID& that)
+ : m_fid(that.m_fid)
+ {}
+
+ FieldID& operator=(jfieldID fid)
+ {
+ m_fid = fid;
+ return *this;
+ }
+
+ FieldID& operator=(const FieldID& that)
+ {
+ m_fid = that.m_fid;
+ return *this;
+ }
+
+ operator jfieldID() const
+ {
+ return m_fid;
+ }
+
+ operator bool() const
+ {
+ return (NULL != m_fid);
+ }
+
+private:
+ jfieldID m_fid;
+};
+
+/**
+ * Encapsulation of a JNI environment reference.
+ *
+ * This class wraps all (relevant) JNI functions and checks for thrown
+ * exceptions, so that call sites don't have to be cluttered with KNI
+ * exception checks.
+ *
+ * @since New in 1.9.
+ */
+class Env
+{
+public:
+ /**
+ * Constructs an environment object, retrieving the JNI environment
+ * reference from the global JVM reference.
+ */
+ explicit Env()
+ : m_env(env_from_jvm())
+ {}
+
+ /**
+ * Given a JNI renvironment reference, constructs an environment object.
+ */
+ explicit Env(::JNIEnv* env)
+ : m_env(env)
+ {}
+
+ /**
+ * Returns the wrapped JNI environment reference.
+ *
+ * This method is present for compatibility with the old-style
+ * native implmentation that needs the raw pointer, and will be
+ * removed presently. Do not use it in new-style code.
+ */
+ ::JNIEnv* get() const
+ {
+ SVN_JAVAHL_JNIWRAPPER_LOG("Warning: Direct access to JNIEnv at "
+ << __FILE__ << ":" << __LINE__);
+ return m_env;
+ }
+
+ /** Wrapped JNI function. */
+ jobject NewGlobalRef(jobject obj) const
+ {
+ jobject ret = m_env->NewGlobalRef(obj);
+ check_java_exception();
+ if (!ret)
+ throw_java_out_of_memory(error_create_global_reference());
+ return ret;
+ }
+
+ /** Wrapped JNI function. */
+ void DeleteGlobalRef(jobject obj) const throw()
+ {
+ m_env->DeleteGlobalRef(obj);
+ }
+
+ /** Wrapped JNI function. */
+ void PushLocalFrame(jint capacity) const
+ {
+ if (0 > m_env->PushLocalFrame(capacity))
+ throw_java_exception();
+ }
+
+ /** Wrapped JNI function. */
+ void PopLocalFrame() const throw()
+ {
+ m_env->PopLocalFrame(NULL);
+ }
+
+ /** Wrapped JNI function. */
+ jint Throw(jthrowable exc) const throw()
+ {
+ return m_env->Throw(exc);
+ }
+
+ /** Wrapped JNI function. */
+ jint ThrowNew(jclass cls, const char* message) const throw()
+ {
+ return m_env->ThrowNew(cls, message);
+ }
+
+ /** Wrapped JNI function. */
+ jboolean ExceptionCheck() const throw()
+ {
+ return m_env->ExceptionCheck();
+ }
+
+ /** Wrapped JNI function. */
+ jthrowable ExceptionOccurred() const throw()
+ {
+ return m_env->ExceptionOccurred();
+ }
+
+ /** Wrapped JNI function. */
+ void ExceptionClear() const throw()
+ {
+ m_env->ExceptionClear();
+ }
+
+ /** Wrapped JNI function. */
+ jclass FindClass(const char* name) const
+ {
+ jclass cls = m_env->FindClass(name);
+ check_java_exception();
+ return cls;
+ }
+
+ /** Wrapped JNI function. */
+ jobject NewObject(jclass cls, jmethodID ctor, ...) const
+ {
+ std::va_list args;
+ va_start(args, ctor);
+ jobject obj = m_env->NewObjectV(cls, ctor, args);
+ va_end(args);
+ check_java_exception();
+ return obj;
+ }
+
+ /** Wrapped JNI function. */
+ jclass GetObjectClass(jobject obj) const
+ {
+ jclass cls = m_env->GetObjectClass(obj);
+ check_java_exception();
+ return cls;
+ }
+
+ /** Wrapped JNI function. */
+ jboolean IsInstanceOf(jobject obj, jclass cls) const throw()
+ {
+ return m_env->IsInstanceOf(obj, cls);
+ }
+
+ /** Wrapped JNI function. */
+ jmethodID GetMethodID(jclass cls, const char* name, const char* sig) const
+ {
+ jmethodID mid = m_env->GetMethodID(cls, name, sig);
+ check_java_exception();
+ return mid;
+ }
+
+ /** Wrapped JNI function. */
+ jmethodID GetStaticMethodID(jclass cls, const char* name,
+ const char* sig) const
+ {
+ jmethodID mid = m_env->GetStaticMethodID(cls, name, sig);
+ check_java_exception();
+ return mid;
+ }
+
+ /** Wrapped JNI function. */
+ jfieldID GetFieldID(jclass cls, const char* name, const char* sig) const
+ {
+ jfieldID fid = m_env->GetFieldID(cls, name, sig);
+ check_java_exception();
+ return fid;
+ }
+
+ /** Wrapped JNI function. */
+ jfieldID GetStaticFieldID(jclass cls, const char* name,
+ const char* sig) const
+ {
+ jfieldID fid = m_env->GetStaticFieldID(cls, name, sig);
+ check_java_exception();
+ return fid;
+ }
+
+ /** Wrapped JNI function. */
+ jstring NewStringUTF(const char* text) const
+ {
+ if (!text)
+ return NULL;
+
+ jstring str = m_env->NewStringUTF(text);
+ check_java_exception();
+ return str;
+ }
+
+ /** Wrapped JNI function. */
+ jsize GetStringLength(jstring str) const
+ {
+ jsize len = m_env->GetStringLength(str);
+ check_java_exception();
+ return len;
+ }
+
+ /** Wrapped JNI function. */
+ jsize GetStringUTFLength(jstring str) const
+ {
+ jsize len = m_env->GetStringUTFLength(str);
+ check_java_exception();
+ return len;
+ }
+
+ /** Wrapped JNI function. */
+ const char* GetStringUTFChars(jstring str, jboolean* is_copy) const
+ {
+ if (!str)
+ return NULL;
+
+ const char* text = m_env->GetStringUTFChars(str, is_copy);
+ check_java_exception();
+ if (!text)
+ throw_java_out_of_memory(error_get_contents_string());
+ return text;
+ }
+
+ /** Wrapped JNI function. */
+ void ReleaseStringUTFChars(jstring str, const char* new_text) const
+ {
+ if (!str)
+ throw std::logic_error(error_release_null_string());
+ m_env->ReleaseStringUTFChars(str, new_text);
+ }
+
+ /** Wrapped JNI function. */
+ void CallVoidMethod(jobject obj, jmethodID mid, ...) const
+ {
+ std::va_list args;
+ va_start(args, mid);
+ m_env->CallObjectMethodV(obj, mid, args);
+ va_end(args);
+ check_java_exception();
+ }
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(T, N) \
+ T Call##N##Method(jobject obj, jmethodID mid, ...) const \
+ { \
+ std::va_list args; \
+ va_start(args, mid); \
+ T ret = m_env->Call##N##MethodV(obj, mid, args); \
+ va_end(args); \
+ check_java_exception(); \
+ return ret; \
+ }
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_CALL_X_METHOD
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(T, N) \
+ T CallStatic##N##Method(jclass obj, jmethodID mid, ...) const \
+ { \
+ std::va_list args; \
+ va_start(args, mid); \
+ T ret = m_env->CallStatic##N##MethodV(obj, mid, args); \
+ va_end(args); \
+ check_java_exception(); \
+ return ret; \
+ }
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_CALL_STATIC_X_METHOD
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(T, N) \
+ T Get##N##Field(jobject obj, jfieldID fid) const \
+ { \
+ T ret = m_env->Get##N##Field(obj, fid); \
+ check_java_exception(); \
+ return ret; \
+ }
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_GET_X_FIELD
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(T, N) \
+ void Set##N##Field(jobject obj, jfieldID fid, T val) const \
+ { \
+ m_env->Set##N##Field(obj, fid, val); \
+ check_java_exception(); \
+ }
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_SET_X_FIELD
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(T, N) \
+ T GetStatic##N##Field(jclass cls, jfieldID fid) const \
+ { \
+ T ret = m_env->GetStatic##N##Field(cls, fid); \
+ check_java_exception(); \
+ return ret; \
+ }
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_GET_STATIC_X_FIELD
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(T, N) \
+ void SetStatic##N##Field(jclass cls, jfieldID fid, T val) const \
+ { \
+ m_env->SetStatic##N##Field(cls, fid, val); \
+ check_java_exception(); \
+ }
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jobject, Object)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_SET_STATIC_X_FIELD
+
+ /** Wrapped JNI function. */
+ jsize GetArrayLength(jarray array) const
+ {
+ if (!array)
+ return 0;
+ return m_env->GetArrayLength(array);
+ }
+
+ /** Wrapped JNI function. */
+ jobjectArray NewObjectArray(jsize length, jclass cls, jobject init) const
+ {
+ jobjectArray array = m_env->NewObjectArray(length, cls, init);
+ if (!array)
+ throw_java_out_of_memory(error_create_object_array());
+ return array;
+ }
+
+ /** Wrapped JNI function. */
+ jobject GetObjectArrayElement(jobjectArray array, jsize index) const
+ {
+ jobject obj = m_env->GetObjectArrayElement(array, index);
+ check_java_exception();
+ return obj;
+ }
+
+ /** Wrapped JNI function. */
+ void SetObjectArrayElement(jobjectArray array,
+ jsize index, jobject value) const
+ {
+ m_env->SetObjectArrayElement(array, index, value);
+ check_java_exception();
+ }
+
+ /** Boilerplate generator for wrapped JNI functions. */
+#define SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(T, N) \
+ T##Array New##N##Array(jsize length) const \
+ { \
+ T##Array array = m_env->New##N##Array(length); \
+ if (!array) \
+ throw_java_out_of_memory(error_create_array(#T)); \
+ return array; \
+ } \
+ T* Get##N##ArrayElements(T##Array array, jboolean* is_copy) const \
+ { \
+ if (!array) \
+ return NULL; \
+ \
+ T* data = m_env->Get##N##ArrayElements(array, is_copy); \
+ check_java_exception(); \
+ if (!data) \
+ throw_java_out_of_memory(error_get_contents_array(#N)); \
+ return data; \
+ } \
+ void Release##N##ArrayElements(T##Array array, T* data, jint mode) const \
+ { \
+ if (!array) \
+ throw std::logic_error(error_release_null_array(#T)); \
+ m_env->Release##N##ArrayElements(array, data, mode); \
+ }
+
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jboolean, Boolean)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jbyte, Byte)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jchar, Char)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jshort, Short)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jint, Int)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jlong, Long)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jfloat, Float)
+ SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY(jdouble, Double)
+#undef SVN_JAVAHL_JNIWRAPPER_PRIMITIVE_TYPE_ARRAY
+
+ /** Wrapped JNI function. */
+ void* GetDirectBufferAddress(jobject buffer) const
+ {
+ void* const addr = m_env->GetDirectBufferAddress(buffer);
+ check_java_exception();
+ return addr;
+ }
+
+private:
+ ::JNIEnv* m_env;
+ static ::JavaVM* m_jvm;
+ static ::JNIEnv* env_from_jvm();
+
+ void throw_java_exception() const
+ {
+ throw SignalExceptionThrown();
+ }
+
+ void check_java_exception() const
+ {
+ if (m_env->ExceptionCheck())
+ throw SignalExceptionThrown();
+ }
+
+ void throw_java_out_of_memory(const char* message) const;
+
+ // We cannont use svn_private_config.h in a header, so we move the
+ // actual message translations into the implementation file.
+ static const char* error_create_global_reference() throw();
+ static const char* error_get_contents_string() throw();
+ static const char* error_release_null_string() throw();
+
+ static const char* error_create_object_array() throw();
+ static const char* error_create_array(const char* type) throw();
+ static const char* error_get_contents_array(const char* type) throw();
+ static const char* error_release_null_array(const char* type) throw();
+
+public:
+ // This static initializer must only be called by JNI_OnLoad
+ static void static_init(::JavaVM*);
+};
+
+
+/**
+ * Encapsulation of a JNI local frame.
+ *
+ * Used within loop bodies to limit the proliferation of local
+ * references, or anywhere else where such references should be
+ * pre-emptively discarded.
+ *
+ * @since New in 1.9.
+ */
+class LocalFrame
+{
+ static const jint DEFAULT_CAPACITY;
+
+public:
+ /**
+ * Constructs a local frame, retrieving the JNI environment
+ * reference from the global JVM reference.
+ */
+ explicit LocalFrame()
+ : m_env(Env())
+ {
+ m_env.PushLocalFrame(DEFAULT_CAPACITY);
+ }
+
+ /**
+ * Given a JNI renvironment reference, constructs a local frame.
+ */
+ explicit LocalFrame(Env env)
+ : m_env(env)
+ {
+ m_env.PushLocalFrame(DEFAULT_CAPACITY);
+ }
+
+ /**
+ * Constructs a local frame with the given initial @a capacity,
+ * retrieving the JNI environment reference from the global JVM
+ * reference.
+ */
+ explicit LocalFrame(jint capacity)
+ : m_env(Env())
+ {
+ m_env.PushLocalFrame(capacity);
+ }
+
+ /**
+ * Given a JNI renvironment reference, constructs a local frame with
+ * the given initial @a capacity.
+ */
+ explicit LocalFrame(Env env, jint capacity)
+ : m_env(env)
+ {
+ m_env.PushLocalFrame(capacity);
+ }
+
+ ~LocalFrame()
+ {
+ m_env.PopLocalFrame();
+ }
+
+ /**
+ * Returns the stored enviromnent object.
+ */
+ Env get_env() const
+ {
+ return m_env;
+ }
+
+private:
+ const Env m_env;
+ LocalFrame(const LocalFrame&);
+ LocalFrame& operator=(const LocalFrame&);
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_ENV_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp
new file mode 100644
index 0000000..2062275
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_exception.hpp
@@ -0,0 +1,364 @@
+/**
+ * @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
+ */
+
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_EXCEPTION_HPP
+#define SVN_JAVAHL_JNIWRAPPER_EXCEPTION_HPP
+
+#include "jni_env.hpp"
+#include "jni_object.hpp"
+
+namespace Java {
+
+/**
+ * Base class for all exception generators, and generator class for
+ * exceptions of type @c java.lang.Throwable.
+ *
+ * The associated JNI class reference is stored for the lifetime of
+ * the JVM in the global class cache.
+ *
+ * @since New in 1.9.
+ */
+class Exception
+{
+public:
+ /**
+ * Constructs a wrapper for the @c jthrowable object @a exc.
+ */
+ explicit Exception(Env env, jthrowable exc)
+ : m_env(env),
+ m_jthis(exc),
+ m_class(env.GetObjectClass(exc))
+ {}
+
+ /**
+ * Raises a Java exception of the concrete class, and throws a
+ * native exception at the same time.
+ *
+ * It is an error to call this method if an existing @c jthrowable
+ * object was wrapped.
+ */
+ void raise() const
+ {
+ throw_java_exception();
+ throw SignalExceptionThrown();
+ }
+
+ /**
+ * Raises a Java exception of the concrete class with the givem
+ * @a message, and throws a native exception at the same time.
+ *
+ * It is an error to call this method if an existing @c jthrowable
+ * object was wrapped.
+ */
+ void raise(const char* message) const
+ {
+ throw_java_exception(message);
+ throw SignalExceptionThrown();
+ }
+
+ /**
+ * Raises a Java exception of the concrete class, but does not throw
+ * a native exception.
+ *
+ * It is an error to call this method if an existing @c jthrowable
+ * object was wrapped.
+ */
+ void throw_java_exception() const;
+
+ /**
+ * Raises a Java exception of the concrete class with the given
+ * @a message, but does not throw a native exception.
+ *
+ * It is an error to call this method if an existing @c jthrowable
+ * object was wrapped.
+ */
+ void throw_java_exception(const char* message) const;
+
+ /**
+ * Checks if an existing @c jthrowable object was wrapped.
+ */
+ bool instantiated() const
+ {
+ return (m_jthis != NULL);
+ }
+
+ /**
+ * Returns the wrapped @c jthrowable object.
+ */
+ jthrowable throwable() const
+ {
+ return m_jthis;
+ }
+
+ /**
+ * Wrapper for the Java method @c getMessage().
+ * Only valid if an existing @c jthrowable object was wrapped.
+ */
+ jstring get_message() const;
+
+
+ /**
+ * Returns the wrapped exception instance.
+ */
+ jobject get() const
+ {
+ return m_jthis;
+ }
+
+ /**
+ * Returns the wrapped exception class.
+ */
+ jclass get_class() const
+ {
+ return m_class;
+ }
+
+ /**
+ * Returns the wrapped enviromnment reference.
+ */
+ Env get_env() const
+ {
+ return m_env;
+ }
+
+protected:
+ /**
+ * Constructs an exception generator with the concrete class
+ * @a class_name.
+ */
+ explicit Exception(Env env, const char* class_name)
+ : m_env(env),
+ m_jthis(NULL),
+ m_class(env.FindClass(class_name))
+ {}
+
+ /**
+ * Constructs an exception generator with the concrete class @a cls.
+ */
+ explicit Exception(Env env, const Object::ClassImpl* impl)
+ : m_env(env),
+ m_jthis(NULL),
+ m_class(impl->get_class())
+ {}
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls)
+ {}
+
+ public:
+ virtual ~ClassImpl();
+ };
+
+ const Env m_env;
+ jthrowable m_jthis;
+ jclass m_class;
+
+ friend class ClassCacheImpl;
+ static void static_init(Env env, jclass cls);
+ static const char* const m_class_name;
+ static MethodID m_mid_get_message;
+};
+
+/**
+ * Generator class for exceptions of type @c java.lang.RuntimeException.
+ *
+ * @since New in 1.9.
+ */
+class RuntimeException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit RuntimeException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ static const char* const m_class_name;
+};
+
+
+/**
+ * Generator class for exceptions of type @c java.lang.NullPointerException.
+ *
+ * @since New in 1.9.
+ */
+class NullPointerException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit NullPointerException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type @c java.lang.OutOfMemoryError.
+ *
+ * @since New in 1.9.
+ */
+class OutOfMemoryError : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit OutOfMemoryError(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type
+ * @c java.lang.IndexOutOfBoundsException.
+ *
+ * @since New in 1.9.
+ */
+class IndexOutOfBoundsException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit IndexOutOfBoundsException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls)
+ {}
+
+ public:
+ virtual ~ClassImpl();
+ };
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type @c java.io.IOException.
+ *
+ * @since New in 1.9.
+ */
+class IOException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit IOException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type @c java.lang.IllegalArgumentException.
+ *
+ * @since New in 1.9.
+ */
+class IllegalArgumentException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit IllegalArgumentException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ static const char* const m_class_name;
+};
+
+/**
+ * Generator class for exceptions of type
+ * @c java.util.NoSuchElementException.
+ *
+ * @since New in 1.9.
+ */
+class NoSuchElementException : public Exception
+{
+public:
+ /**
+ * Constructs an exception generator object.
+ */
+ explicit NoSuchElementException(Env env)
+ : Exception(env, m_class_name)
+ {}
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls)
+ {}
+
+ public:
+ virtual ~ClassImpl();
+ };
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_EXCEPTION_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp
new file mode 100644
index 0000000..7fe88d0
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp
@@ -0,0 +1,90 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_GLOBALREF_HPP
+#define SVN_JAVAHL_JNIWRAPPER_GLOBALREF_HPP
+
+#include <jni.h>
+
+#include "jni_env.hpp"
+
+namespace Java {
+
+/**
+ * Wrapper for a global object reference. The reference is held until
+ * the wrapper goes out of scope (i.e., until the destructor is called).
+ *
+ * @since New in 1.9.
+ */
+class GlobalObject
+{
+public:
+ explicit GlobalObject(Env env, jobject obj)
+ : m_obj(obj ? env.NewGlobalRef(obj) : NULL)
+ {}
+
+ ~GlobalObject();
+
+ GlobalObject& operator=(jobject that);
+
+ jobject get() const
+ {
+ return m_obj;
+ }
+
+private:
+ GlobalObject(const GlobalObject&);
+ GlobalObject& operator=(const GlobalObject&);
+
+ jobject m_obj;
+};
+
+/**
+ * Wrapper for a global class reference. Behaves just like the object
+ * reference wrapper, but provides a more type-safe interface for
+ * class references.
+ *
+ * @since New in 1.9.
+ */
+class GlobalClass : protected GlobalObject
+{
+public:
+ explicit GlobalClass(Env env, jclass cls)
+ : GlobalObject(env, cls)
+ {}
+
+ GlobalClass& operator=(jclass that);
+
+ jclass get() const
+ {
+ return jclass(GlobalObject::get());
+ }
+
+private:
+ GlobalClass(const GlobalClass&);
+ GlobalClass& operator=(const GlobalClass&);
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_GLOBALREF_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
new file mode 100644
index 0000000..3c055ca
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.cpp
@@ -0,0 +1,294 @@
+/**
+ * @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
+ */
+
+#include "jni_globalref.hpp"
+#include "jni_io_stream.hpp"
+#include "jni_stack.hpp"
+
+#include "svn_private_config.h"
+
+// Stream-wrapper-specific mark object type
+struct svn_stream_mark_t
+{
+ void* m_baton;
+};
+
+namespace Java {
+
+namespace {
+svn_error_t* stream_close_input(void* baton)
+{
+ InputStream* const self = static_cast<InputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_BASE, self->close());
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_mark(void* baton, svn_stream_mark_t** mark,
+ apr_pool_t* result_pool)
+{
+ InputStream* const self = static_cast<InputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_STREAM_SEEK_NOT_SUPPORTED,
+ self->mark(16384)); // FIXME: invent better readlimit
+
+ *mark = static_cast<svn_stream_mark_t*>(
+ apr_palloc(result_pool, sizeof(**mark)));
+ (*mark)->m_baton = baton;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_seek(void* baton, const svn_stream_mark_t* mark)
+{
+ if (mark->m_baton != baton)
+ return svn_error_create(SVN_ERR_STREAM_SEEK_NOT_SUPPORTED,
+ NULL, _("Invalid mark"));
+
+ InputStream* const self = static_cast<InputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_STREAM_SEEK_NOT_SUPPORTED,
+ self->reset());
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_read(void* baton, char* buffer, apr_size_t* len)
+{
+ if (0 == *len)
+ return SVN_NO_ERROR;
+
+ jint length = jint(*len);
+ InputStream* const self = static_cast<InputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_BASE,
+ length = self->read(buffer, length));
+ if (length < 0)
+ *len = 0;
+ else
+ *len = length;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_skip(void* baton, apr_size_t len)
+{
+ InputStream* const self = static_cast<InputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_BASE, self->skip(jlong(len)));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_close_output(void* baton)
+{
+ OutputStream* const self = static_cast<OutputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_BASE, self->close());
+ return SVN_NO_ERROR;
+}
+
+svn_error_t* stream_write(void* baton, const char* data, apr_size_t* len)
+{
+ OutputStream* const self = static_cast<OutputStream*>(baton);
+ SVN_JAVAHL_CATCH(self->get_env(), SVN_ERR_BASE,
+ self->write(data, jint(*len)));
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t*
+global_stream_close_input(void* baton)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ InputStream stream(Env(), ref->get());
+ return stream_close_input(&stream);
+}
+
+svn_error_t*
+global_stream_mark(void* baton, svn_stream_mark_t** mark,
+ apr_pool_t* result_pool)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ InputStream stream(Env(), ref->get());
+ return stream_mark(&stream, mark, result_pool);
+}
+
+svn_error_t*
+global_stream_seek(void* baton, const svn_stream_mark_t* mark)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ InputStream stream(Env(), ref->get());
+ return stream_seek(&stream, mark);
+}
+
+svn_error_t*
+global_stream_read(void* baton, char* buffer, apr_size_t* len)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ InputStream stream(Env(), ref->get());
+ return stream_read(&stream, buffer, len);
+}
+
+svn_error_t*
+global_stream_skip(void* baton, apr_size_t len)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ InputStream stream(Env(), ref->get());
+ return stream_skip(&stream, len);
+}
+
+svn_error_t*
+global_stream_close_output(void* baton)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ OutputStream stream(Env(), ref->get());
+ return stream_close_output(&stream);
+}
+
+svn_error_t*
+global_stream_write(void* baton, const char* data, apr_size_t* len)
+{
+ GlobalObject* ref = static_cast<GlobalObject*>(baton);
+ OutputStream stream(Env(), ref->get());
+ return stream_write(&stream, data, len);
+}
+
+apr_status_t cleanup_global_object(void* baton)
+{
+ delete static_cast<GlobalObject*>(baton);
+ return APR_SUCCESS;
+}
+} // anonymous namespace
+
+
+// Class Java::InputStream
+
+const char* const InputStream::m_class_name = "java/io/InputStream";
+InputStream::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_close(env.GetMethodID(cls, "close", "()V")),
+ m_mid_mark_supported(env.GetMethodID(cls, "markSupported", "()Z")),
+ m_mid_mark(env.GetMethodID(cls, "mark", "(I)V")),
+ m_mid_reset(env.GetMethodID(cls, "reset", "()V")),
+ m_mid_read_byte(env.GetMethodID(cls, "read", "()I")),
+ m_mid_read_bytearray(env.GetMethodID(cls, "read", "([BII)I")),
+ m_mid_skip(env.GetMethodID(cls, "skip", "(J)J"))
+{}
+
+InputStream::ClassImpl::~ClassImpl() {}
+
+svn_stream_t*
+InputStream::get_global_stream(Env env, jobject jstream,
+ const SVN::Pool& pool)
+{
+ if (!jstream)
+ return NULL;
+
+ const bool has_mark = InputStream(env, jstream).mark_supported();
+
+ std::auto_ptr<GlobalObject> baton(new GlobalObject(env, jstream));
+
+ svn_stream_t* const stream = svn_stream_create(baton.get(), pool.getPool());
+ svn_stream_set_read2(stream, global_stream_read,
+ NULL /* only partial read support */);
+ svn_stream_set_skip(stream, global_stream_skip);
+ svn_stream_set_close(stream, global_stream_close_input);
+ if (has_mark)
+ {
+ svn_stream_set_mark(stream, global_stream_mark);
+ svn_stream_set_seek(stream, global_stream_seek);
+ }
+
+ apr_pool_cleanup_register(pool.getPool(), baton.release(),
+ cleanup_global_object,
+ apr_pool_cleanup_null);
+ return stream;
+}
+
+svn_stream_t* InputStream::get_stream(const SVN::Pool& pool)
+{
+ if (!m_jthis)
+ return NULL;
+
+ const bool has_mark = mark_supported();
+
+ svn_stream_t* const stream = svn_stream_create(this, pool.getPool());
+ svn_stream_set_read2(stream, stream_read,
+ NULL /* only partial read support */);
+ svn_stream_set_skip(stream, stream_skip);
+ svn_stream_set_close(stream, stream_close_input);
+ if (has_mark)
+ {
+ svn_stream_set_mark(stream, stream_mark);
+ svn_stream_set_seek(stream, stream_seek);
+ }
+ return stream;
+}
+
+jint InputStream::read(void* data, jint length)
+{
+ ByteArray array(m_env, length);
+ const jint size = read(array);
+ if (size > 0)
+ {
+ ByteArray::Contents contents(array);
+ ::memcpy(static_cast<char*>(data), contents.data(), size);
+ }
+ return size;
+}
+
+// Class Java::OutputStream
+
+const char* const OutputStream::m_class_name = "java/io/OutputStream";
+
+OutputStream::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_close(env.GetMethodID(cls, "close", "()V")),
+ m_mid_write_byte(env.GetMethodID(cls, "write", "(I)V")),
+ m_mid_write_bytearray(env.GetMethodID(cls, "write", "([BII)V"))
+{}
+
+OutputStream::ClassImpl::~ClassImpl() {}
+
+svn_stream_t*
+OutputStream::get_global_stream(Env env, jobject jstream,
+ const SVN::Pool& pool)
+{
+ if (!jstream)
+ return NULL;
+
+ std::auto_ptr<GlobalObject> baton(new GlobalObject(env, jstream));
+
+ svn_stream_t* const stream = svn_stream_create(baton.get(), pool.getPool());
+ svn_stream_set_write(stream, global_stream_write);
+ svn_stream_set_close(stream, global_stream_close_output);
+
+ apr_pool_cleanup_register(pool.getPool(), baton.release(),
+ cleanup_global_object,
+ apr_pool_cleanup_null);
+ return stream;
+}
+
+svn_stream_t* OutputStream::get_stream(const SVN::Pool& pool)
+{
+ if (!m_jthis)
+ return NULL;
+
+ svn_stream_t* const stream = svn_stream_create(this, pool.getPool());
+ svn_stream_set_write(stream, stream_write);
+ svn_stream_set_close(stream, stream_close_output);
+ return stream;
+}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
new file mode 100644
index 0000000..c0ee022
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
@@ -0,0 +1,281 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_IO_STREAM_HPP
+#define SVN_JAVAHL_JNIWRAPPER_IO_STREAM_HPP
+
+#include <cstring>
+#include <string>
+#include <memory>
+
+#include "jni_object.hpp"
+#include "jni_array.hpp"
+
+#include "../Pool.h"
+
+#include "svn_io.h"
+
+namespace Java {
+
+/**
+ * Object wrapper for @c java.io.InputStream.
+ *
+ * @since New in 1.9.
+ */
+class InputStream : public Object
+{
+public:
+ /**
+ * Constructs a wrapper around an existing @c InputStream @a jstream.
+ */
+ explicit InputStream(Env env, jobject jstream)
+ : Object(env, ClassCache::get_input_stream(env), jstream)
+ {}
+
+ /**
+ * Creates a stand-alone @c svn_stream_t allocated from @a pool that
+ * contains a global reference to @a jstream. This stream can safely
+ * be used in long-lived bound objects.
+ */
+ static svn_stream_t*
+ get_global_stream(Env env, jobject jstream, const SVN::Pool& pool);
+
+ /**
+ * Creates an @c svn_stream_t allocated from @a pool.
+ * <b>Do not use the returned stream past the lifetime of the
+ * current JNI native frame.</b>
+ */
+ svn_stream_t* get_stream(const SVN::Pool& pool);
+
+public:
+ /**
+ * Implements @c InputStream.close()
+ */
+ void close()
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_close);
+ }
+
+ /**
+ * Implements @c InputStream.markSupported()
+ */
+ bool mark_supported()
+ {
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_mark_supported);
+ }
+
+ /**
+ * Implements @c InputStream.mark(int)
+ */
+ void mark(jint readlimit)
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_mark, readlimit);
+ }
+
+ /**
+ * Implements @c InputStream.reset()
+ */
+ void reset()
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_reset);
+ }
+
+ /**
+ * Implements @c InputStream.read()
+ */
+ jint read()
+ {
+ return m_env.CallIntMethod(m_jthis, impl().m_mid_read_byte);
+ }
+
+ /**
+ * Implements @c InputStream.read(byte[],int,int)
+ */
+ jint read(ByteArray& dst, jint length = -1, jint offset = 0)
+ {
+ return m_env.CallIntMethod(m_jthis, impl().m_mid_read_bytearray,
+ dst.get(), offset,
+ (length >= 0 ? length
+ : dst.length() - offset));
+ }
+
+ /**
+ * Helper method to read data into a native buffer.
+ */
+ jint read(void* data, jint length);
+
+ /**
+ * Implements @c InputStream.skip(long)
+ */
+ jlong skip(jlong count)
+ {
+ return m_env.CallLongMethod(m_jthis, impl().m_mid_skip, count);
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_close;
+ const MethodID m_mid_mark_supported;
+ const MethodID m_mid_mark;
+ const MethodID m_mid_reset;
+ const MethodID m_mid_read_byte;
+ const MethodID m_mid_read_bytearray;
+ const MethodID m_mid_skip;
+ };
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+};
+
+
+/**
+ * Object wrapper for @c java.io.OutputStream.
+ *
+ * @since New in 1.9.
+ */
+class OutputStream : public Object
+{
+public:
+ /**
+ * Constructs a wrapper around an existing @c OutputStream @a jstream.
+ */
+ explicit OutputStream(Env env, jobject jstream)
+ : Object(env, ClassCache::get_output_stream(env), jstream)
+ {}
+
+ /**
+ * Creates a stand-alone @c svn_stream_t allocated from @a pool that
+ * contains a global reference to @a jstream. This stream can safely
+ * be used in long-lived bound objects.
+ */
+ static svn_stream_t*
+ get_global_stream(Env env, jobject jstream, const SVN::Pool& pool);
+
+ /**
+ * Creates an @c svn_stream_t allocated from @a pool.
+ * <b>Do not use the returned stream past the lifetime of the
+ * current JNI native frame.</b>
+ */
+ svn_stream_t* get_stream(const SVN::Pool& pool);
+
+public:
+ /**
+ * Implements @c OuptutStream.close()
+ */
+ void close()
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_close);
+ }
+
+ /**
+ * Implements @c OuptutStream.write(int)
+ */
+ void write(jint byte)
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_write_byte, byte);
+ }
+
+ /**
+ * Implements @c OuptutStream.write(byte[],int,int)
+ */
+ void write(const ByteArray& src, jint length = -1, jint offset = 0)
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_write_bytearray,
+ src.get(), offset,
+ (length >= 0 ? length
+ : src.length() - offset));
+ }
+
+ /**
+ * Helper method to write data from a native buffer.
+ */
+ void write(const void* data, jint length, jint offset = 0)
+ {
+ write(ByteArray(m_env, data, length));
+ }
+
+ /**
+ * Helper method to write a C string to the stream.
+ */
+ void write(const char* text)
+ {
+ write(ByteArray(m_env, text));
+ }
+
+ /**
+ * Helper method to write a C++ string to the stream.
+ */
+ void write(const std::string& text)
+ {
+ write(ByteArray(m_env, text));
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_close;
+ const MethodID m_mid_write_byte;
+ const MethodID m_mid_write_bytearray;
+ };
+
+ friend class ClassCacheImpl;
+ static void static_init(Env env);
+ static const char* const m_class_name;
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_IO_STREAM_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp
new file mode 100644
index 0000000..a6e3d1c
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_iterator.cpp
@@ -0,0 +1,63 @@
+/**
+ * @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
+ */
+
+#include <stdexcept>
+
+#include "jni_iterator.hpp"
+
+#include "svn_private_config.h"
+
+namespace Java {
+
+// Class Java::BaseIterator
+
+const char* const BaseIterator::m_class_name = "java/util/Iterator";
+
+BaseIterator::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_has_next(env.GetMethodID(cls, "hasNext", "()Z")),
+ m_mid_next(env.GetMethodID(cls, "next", "()Ljava/lang/Object;"))
+{}
+
+BaseIterator::ClassImpl::~ClassImpl() {}
+
+jobject BaseIterator::next()
+{
+ try
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_next);
+ }
+ catch (const SignalExceptionThrown&)
+ {
+ // Just rethrow if it's not a NoSuchElementException.
+ if (!m_env.IsInstanceOf(
+ m_env.ExceptionOccurred(),
+ ClassCache::get_exc_no_such_element(m_env)->get_class()))
+ throw;
+
+ m_env.ExceptionClear();
+ throw std::range_error(_("Iterator out of bounds"));
+ }
+}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp
new file mode 100644
index 0000000..19c7976
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp
@@ -0,0 +1,91 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_ITERATOR_HPP
+#define SVN_JAVAHL_JNIWRAPPER_ITERATOR_HPP
+
+#include "jni_env.hpp"
+#include "jni_object.hpp"
+
+namespace Java {
+
+/**
+ * Non-template base for a Java iterator.
+ *
+ * @since New in 1.9.
+ */
+class BaseIterator : public Object
+{
+protected:
+ /**
+ * Constructs the iterator wrapper.
+ */
+ explicit BaseIterator(Env env, jobject jiterator)
+ : Object(env, ClassCache::get_iterator(env), jiterator)
+ {}
+
+public:
+ /**
+ * Returns @c false at the end of the iteration.
+ */
+ bool has_next() const
+ {
+ return m_env.CallBooleanMethod(m_jthis, impl().m_mid_has_next);
+ }
+
+ /**
+ * Returns the next object in the iteration.
+ * @throw std::range_error if the next object is not available.
+ */
+ jobject next();
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_has_next;
+ const MethodID m_mid_next;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_ITERATOR_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
new file mode 100644
index 0000000..e7b8a41
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
@@ -0,0 +1,85 @@
+/**
+ * @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
+ */
+
+#include <stdexcept>
+#include <string>
+
+#include "jni_list.hpp"
+
+#include "svn_private_config.h"
+
+namespace Java {
+
+// Class Java::BaseImmutableList
+
+const char* const BaseImmutableList::m_class_name = "java/util/List";
+
+BaseImmutableList::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_size(env.GetMethodID(cls, "size", "()I")),
+ m_mid_get(env.GetMethodID(cls, "get", "(I)Ljava/lang/Object;")),
+ m_mid_add(env.GetMethodID(cls, "add", "(Ljava/lang/Object;)Z")),
+ m_mid_clear(env.GetMethodID(cls, "clear", "()V")),
+ m_mid_iter(env.GetMethodID(cls, "listIterator", "()Ljava/util/ListIterator;"))
+{}
+
+BaseImmutableList::ClassImpl::~ClassImpl() {}
+
+jobject BaseImmutableList::operator[](jint index) const
+{
+ try
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, index);
+ }
+ catch (const SignalExceptionThrown&)
+ {
+ // Just rethrow if it's not an IndexOutOfBoundsException.
+ if (!m_env.IsInstanceOf(
+ m_env.ExceptionOccurred(),
+ ClassCache::get_exc_index_out_of_bounds(m_env)->get_class()))
+ throw;
+
+ m_env.ExceptionClear();
+ std::string msg(_("List index out of bounds: "));
+ msg += index;
+ throw std::out_of_range(msg.c_str());
+ }
+}
+
+BaseImmutableList::Iterator BaseImmutableList::get_iterator() const
+{
+ return Iterator(m_env, m_env.CallObjectMethod(m_jthis, impl().m_mid_iter));
+}
+
+// Class Java::BaseList
+
+const char* const BaseList::m_class_name = "java/util/ArrayList";
+
+BaseList::ClassImpl::ClassImpl(Env env, jclass cls)
+ : BaseImmutableList::ClassImpl(env, cls),
+ m_mid_ctor(env.GetMethodID(cls, "<init>", "(I)V"))
+{}
+
+BaseList::ClassImpl::~ClassImpl() {}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
new file mode 100644
index 0000000..9a11fc1
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
@@ -0,0 +1,307 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_LIST_HPP
+#define SVN_JAVAHL_JNIWRAPPER_LIST_HPP
+
+#include "jni_env.hpp"
+#include "jni_object.hpp"
+#include "jni_iterator.hpp"
+
+namespace Java {
+
+/**
+ * Non-template base for an immutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+class BaseImmutableList : public Object
+{
+public:
+ /**
+ * Returns the number of elements in the list.
+ */
+ jint length() const
+ {
+ return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
+ }
+
+ /**
+ * Checks if the list is empty.
+ */
+ bool is_empty() const
+ {
+ return (length() == 0);
+ }
+
+protected:
+ /**
+ * Constructs the list wrapper
+ */
+ explicit BaseImmutableList(Env env, jobject jlist)
+ : Object(env, ClassCache::get_list(env), jlist)
+ {}
+
+ /**
+ * Constructor used by BaseList
+ */
+ explicit BaseImmutableList(Env env, const Object::ClassImpl* pimpl)
+ : Object(env, pimpl)
+ {}
+
+ /**
+ * Clears the contents of the list.
+ */
+ void clear()
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
+ }
+
+ /**
+ * Appends @a obj to the end of the list.
+ */
+ void add(jobject obj)
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_add, obj);
+ }
+
+ /**
+ * Returns the object reference at @a index.
+ * @throw std::out_of_range if the index value is not valid.
+ */
+ jobject operator[](jint index) const;
+
+ /**
+ * Iterator used by subclasses.
+ */
+ class Iterator : public BaseIterator
+ {
+ friend class BaseImmutableList;
+ explicit Iterator(Env env, jobject jiterator)
+ : BaseIterator(env, jiterator)
+ {}
+ };
+
+ /**
+ * Returns an iterator instance.
+ */
+ Iterator get_iterator() const;
+
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_size;
+ const MethodID m_mid_get;
+ const MethodID m_mid_add;
+ const MethodID m_mid_clear;
+ const MethodID m_mid_iter;
+ };
+
+private:
+ friend class Iterator;
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+};
+
+/**
+ * Template wrapper for an immutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+template <typename T, typename NativeT=jobject>
+class ImmutableList : public BaseImmutableList
+{
+public:
+ /**
+ * Constructs the list wrapper.
+ */
+ explicit ImmutableList(Env env, jobject jlist)
+ : BaseImmutableList(env, jlist)
+ {}
+
+ /**
+ * Returns a wrapper object for the object reference at @a index.
+ * @throw std::out_of_range if the index value is not valid.
+ */
+ T operator[](jint index) const
+ {
+ return T(m_env, NativeT(BaseImmutableList::operator[](index)));
+ }
+
+ /**
+ * Iterates over the items in the list, calling @a function for
+ * each item.
+ * @see std::for_each
+ */
+ template<typename F>
+ F for_each(F function) const
+ {
+ Iterator iter(get_iterator());
+ while (iter.has_next())
+ function(T(m_env, NativeT(iter.next())));
+ return function;
+ }
+};
+
+/**
+ * Non-template base for a mutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+class BaseList : public BaseImmutableList
+{
+public:
+ /**
+ * Clears the contents of the list.
+ */
+ void clear()
+ {
+ BaseImmutableList::clear();
+ }
+
+protected:
+ /**
+ * Constructs the list wrapper, treating @a jlist as a @c java.util.List.
+ */
+ explicit BaseList(Env env, jobject jlist)
+ : BaseImmutableList(env, jlist)
+ {}
+
+ /**
+ * Constructs and wraps an empty list of type @c java.util.ArrayList
+ * with initial allocation size @a length.
+ */
+ explicit BaseList(Env env, jint length)
+ : BaseImmutableList(env, ClassCache::get_array_list(env))
+ {
+ set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
+ }
+
+ /**
+ * Appends @a obj to the end of the list.
+ */
+ void add(jobject obj)
+ {
+ BaseImmutableList::add(obj);
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public BaseImmutableList::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_ctor;
+ };
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+};
+
+/**
+ * Template wrapper for a mutable type-safe Java list.
+ *
+ * @since New in 1.9.
+ */
+template <typename T, typename NativeT=jobject>
+class List : public BaseList
+{
+public:
+ /**
+ * Constructs the list wrapper, deriving the class from @a jlist.
+ */
+ explicit List(Env env, jobject jlist)
+ : BaseList(env, jlist)
+ {}
+
+ /**
+ * Constructs and wraps an empty list of type @c java.util.ArrayList
+ * with initial allocation size @a length.
+ */
+ explicit List(Env env, jint length_ = 0)
+ : BaseList(env, length_)
+ {}
+
+ /**
+ * Returns a wrapper object for the object reference at @a index.
+ * @throw std::out_of_range if the index value is not valid.
+ */
+ T operator[](jint index) const
+ {
+ return T(m_env, NativeT(BaseList::operator[](index)));
+ }
+
+ /**
+ * Appends @a obj to the end of the list.
+ */
+ void add(const T& obj)
+ {
+ BaseList::add(obj.get());
+ }
+
+ /**
+ * Iterates over the items in the list, calling @a function for
+ * each item.
+ * @see std::for_each
+ */
+ template<typename F>
+ F for_each(F function) const
+ {
+ Iterator iter(get_iterator());
+ while (iter.has_next())
+ function(T(m_env, NativeT(iter.next())));
+ return function;
+ }
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_LIST_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
new file mode 100644
index 0000000..2e05a06
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
@@ -0,0 +1,285 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_OBJECT_HPP
+#define SVN_JAVAHL_JNIWRAPPER_OBJECT_HPP
+
+#include "jni_env.hpp"
+#include "jni_globalref.hpp"
+
+namespace Java {
+
+/**
+ * An abstract wrapper for a @c java.lang.Object instance.
+ *
+ * This is the base class for all concrete object wrapper classes. It
+ * is self-contained in the sense that it heeps its own JVM
+ * environment, class and object reference; Java object methods are
+ * expected to be exposed as methods of derived classes.
+ *
+ * The associated JNI class reference is stored for the lifetime of
+ * the JVM in the global class cache.
+ *
+ * @since New in 1.9.
+ */
+class Object
+{
+public:
+ /**
+ * Returns the wrapped JNI object reference.
+ */
+ jobject get() const
+ {
+ return m_jthis;
+ }
+
+ /**
+ * Returns the wrapped JNI class reference.
+ */
+ jclass get_class() const
+ {
+ return m_impl->get_class();
+ }
+
+ /**
+ * Returns the wrapped enviromnment reference.
+ */
+ Env get_env() const
+ {
+ return m_env;
+ }
+
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl
+ {
+ public:
+ jclass get_class() const
+ {
+ return m_class.get();
+ }
+
+ virtual ~ClassImpl();
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : m_class(env, cls)
+ {}
+
+ private:
+ friend class ClassCacheImpl;
+
+ GlobalClass m_class; ///< Class reference for this object wrapper
+
+ // Non-copyable
+ ClassImpl(const ClassImpl&);
+ ClassImpl& operator=(const ClassImpl&);
+ };
+
+protected:
+ /**
+ * constructs an object wrapper given the class @a impl and an
+ * object reference @a jthis.
+ */
+ Object(Env env, const ClassImpl* impl, jobject jthis = NULL)
+ : m_env(env),
+ m_impl(impl),
+ m_jthis(jthis)
+ {}
+
+ const Env m_env; ///< JVM environment wrapper
+ const ClassImpl* const m_impl; ///< Class implementation details
+ const jobject m_jthis; ///< @c this object reference
+
+ /**
+ * Certain subclasses need a fully constructed base Object before
+ * they can create the wrapped JNI object. They can use this
+ * function to oveerride the constness of @c m_jthis, but only if
+ * they're changing a @c NULL @c m_jthis to a concrete value.
+ */
+ void set_this(jobject jthis)
+ {
+ if (!m_jthis && jthis)
+ *const_cast<jobject*>(&m_jthis) = jthis;
+ }
+
+private:
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+// Forward declaration
+class ClassCacheImpl;
+
+/**
+ * A singleton cache for global class references.
+ *
+ * The instance is created when the native library is loaded by the
+ * JVM, and destroyed when it is unloaded. It creates global
+ * references for a number of classes and calls said classes'
+ * single-threded static initializers, which usually find and store
+ * method and field IDs (which are usually only valid until the
+ * associated class is garbage-collected).
+ *
+ * Be aware that as long as the global references exist, these classes
+ * cannot be garbage-collected. The number of classes stored in this
+ * cache should therefore be kept to a reasonable minimum.
+ *
+ * @since New in 1.9.
+ */
+class ClassCache
+{
+ // Cannot create instances of this type.
+ ClassCache();
+ ~ClassCache();
+
+ static ClassCacheImpl* m_impl;
+
+public:
+ /* This static initializer must only be called by JNI_OnLoad */
+ static void create();
+
+ /* This static finalizer must only be called by JNI_OnUnload */
+ static void destroy();
+
+#define JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(M) \
+ static const Object::ClassImpl* get_##M(Env env);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(object);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(classtype);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(throwable);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(string);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(exc_index_out_of_bounds);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(exc_no_such_element);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(list);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(array_list);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(map);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(set);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(iterator);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(map_entry);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(hash_map);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(input_stream);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(output_stream);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(byte_buffer);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(subversion_exception);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(authn_cb);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(authn_result);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(authn_ssl_server_cert_failures);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(authn_ssl_server_cert_info);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(user_passwd_cb);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(credential);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(credential_kind);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(external_item);
+
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(editor_provide_base_cb);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(editor_provide_base_cb_ret);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(editor_provide_props_cb);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(editor_provide_props_cb_ret);
+ JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(editor_get_kind_cb);
+#undef JNIWRAPPER_DECLARE_CACHED_CLASS
+};
+
+
+/**
+ * Object wrapper for @c java.lang.Class.
+ *
+ * The associated JNI class reference is stored for the lifetime of
+ * the JVM in the global class cache.
+ *
+ * @since New in 1.9.
+ */
+class Class
+{
+public:
+ /**
+ * Constructs class instance wrapper for @a obj.
+ */
+ explicit Class(Env env, jobject obj);
+
+ /**
+ * Constructs class instance wrapper for @a obj.
+ */
+ explicit Class(const Object& obj);
+
+ /**
+ * Wrapper for the Java @c getName() method.
+ */
+ jstring get_name() const;
+
+ /**
+ * Returns the wrapped class instance.
+ */
+ jobject get() const
+ {
+ return m_jthis;
+ }
+
+ /**
+ * Returns the wrapped enviromnment reference.
+ */
+ Env get_env() const
+ {
+ return m_env;
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls)
+ {}
+
+ public:
+ virtual ~ClassImpl();
+ };
+
+ const Env m_env; ///< JVM environment wrapper
+ const jobject m_jthis; ///< Class instance
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+ static void static_init(Env env, jclass class_type);
+
+ static MethodID m_mid_get_class;
+ static MethodID m_mid_get_name;
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_OBJECT_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp
new file mode 100644
index 0000000..13e35e3
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_stack.hpp
@@ -0,0 +1,220 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_STACK_HPP
+#define SVN_JAVAHL_JNIWRAPPER_STACK_HPP
+
+#ifdef SVN_JAVAHL_DEBUG
+# ifndef SVN_JAVAHL_ASSERT_EXCEPTION_THROWN
+# include <cassert>
+# define SVN_JAVAHL_ASSERT_EXCEPTION_THROWN(E) \
+ assert((E).ExceptionCheck())
+# endif // SVN_JAVAHL_ASSERT_EXCEPTION_THROWN
+#else
+# define SVN_JAVAHL_ASSERT_EXCEPTION_THROWN(E)
+# endif // SVN_JAVAHL_DEBUG
+
+#include "../JNIStackElement.h"
+#include "jni_env.hpp"
+#include "jni_exception.hpp"
+
+#include "svn_error.h"
+
+/**
+ * Boilerplate for the native method implementation entry point.
+ *
+ * Every native method implementation should start by invoking this
+ * macro to initialize the logging stack element and begin the
+ * try/catch block of the function body.
+ *
+ * @param C The name of the Java class that declares this method.
+ * @param M The (Java) name of the method.
+ *
+ * This macro expects two additional parameters to be available
+ * (either as function arguments or local variables):
+ * @c JNIEnv* @a jenv and @c jobject @a jthis.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_JNI_TRY(C, M) \
+ ::JNIStackElement st_ac_ke_le_me_nt_(jenv, #C, #M, jthis); \
+ try
+
+/**
+ * Boilerplate for the native method implementation entry point.
+ *
+ * Initializes local variable named @a V as a pointer to an instance
+ * of the native-bound class @a C.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_GET_BOUND_OBJECT(C, V) \
+ C* const V = C::get_self(::Java::Env(jenv), jthis)
+
+/**
+ * Boilerplate for the native method implementation entry point.
+ *
+ * Like #SVN_JAVAHL_JNI_TRY, but for static methods where the @c jthis
+ * argument is not available.
+ *
+ * This macro expects two additional parameters to be available
+ * (either as function arguments or local variables):
+ * @c JNIEnv* @a jenv and @c jclass @a jclazz.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_JNI_TRY_STATIC(C, M) \
+ ::JNIStackElement st_ac_ke_le_me_nt_(jenv, #C, #M, jclazz); \
+ try
+
+
+/**
+ * Boilerplate for the native method implementation exit point.
+ *
+ * Every native method implementation should end by invoking this
+ * macro to close the try/catch block of the function body and handle
+ * any exceptions thrown by the method implementation.
+ *
+ * This boilerplate variant converts C++ exceptions to the Java
+ * exception type @a X, but retains exceptions that are already in
+ * progress.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(X) \
+ catch (const ::Java::SignalExceptionThrown&) \
+ { \
+ SVN_JAVAHL_ASSERT_EXCEPTION_THROWN(::Java::Env(jenv)); \
+ } \
+ catch (const ::std::exception& ex) \
+ { \
+ X(::Java::Env(jenv)).throw_java_exception(ex.what()); \
+ } \
+ catch (...) \
+ { \
+ const char* const msg = Java::unknown_cxx_exception_message(); \
+ X(::Java::Env(jenv)).throw_java_exception(msg); \
+ }
+
+/**
+ * Boilerplate for the native method implementation exit point.
+ *
+ * Invokes #SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION to throw a
+ * @c RuntimeException.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_JNI_CATCH \
+ SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(::Java::RuntimeException)
+
+/**
+ * Invocation wrapper for functions that return an @c svn_error_t *.
+ *
+ * @param E A wrapped environment (@c Java::Env) instance.
+ * @param S The statement to execute in the checked context.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_CHECK(E, S) \
+ do { \
+ svn_error_t* const ja_va_hl_err_te_mp_ = (S); \
+ if (ja_va_hl_err_te_mp_) \
+ ::Java::handle_svn_error((E), ja_va_hl_err_te_mp_); \
+ } while(0)
+
+/**
+ * Invocation wrapper for calling Java methods that may throw an
+ * exception from within a native callback that is expected to return
+ * an @c svn_error_t*.
+ *
+ * @param E A wrapped environment (@c Java::Env) instance.
+ * @param C A Subversion or APR error code.
+ * @param S The statement to execute in the checked context.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_CATCH(E, C, S) \
+ try \
+ { \
+ S; \
+ } \
+ catch (const ::Java::SignalExceptionThrown&) \
+ { \
+ SVN_JAVAHL_ASSERT_EXCEPTION_THROWN((E)); \
+ return Java::caught_java_exception_error((C)); \
+ } \
+ catch (const ::std::exception& ex) \
+ { \
+ const char* const msg = ex.what(); \
+ ::Java::RuntimeException((E)).throw_java_exception(msg); \
+ return svn_error_create((C), NULL, msg); \
+ } \
+ catch (...) \
+ { \
+ const char* const msg = Java::unknown_cxx_exception_message(); \
+ ::Java::RuntimeException((E)).throw_java_exception(msg); \
+ return svn_error_create((C), NULL, msg); \
+ }
+
+/**
+ * Exception checker for the oldstyle implementation that does not use
+ * the @c Java::Env environment wrapper.
+ *
+ * @param E A wrapped environment (@c Java::Env) instance.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(E) \
+ do { \
+ if ((E).ExceptionCheck()) \
+ throw ::Java::SignalExceptionThrown(); \
+ } while(0)
+
+
+namespace Java {
+
+/**
+ * Handle an error @a err returned from a native function and throws
+ * an appropriate Java exception.
+ *
+ * @since New in 1.9.
+ */
+void handle_svn_error(Env env, svn_error_t* err);
+
+/**
+ * Return a localized error string for an unknown C++ exception.
+ *
+ * @since New in 1.9.
+ */
+const char* unknown_cxx_exception_message() throw();
+
+/**
+ * Create an svn_error_t for a caught Java exception.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t* caught_java_exception_error(apr_status_t status) throw();
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_STACK_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_string.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_string.hpp
new file mode 100644
index 0000000..7b874d0
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_string.hpp
@@ -0,0 +1,251 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_STRING_HPP
+#define SVN_JAVAHL_JNIWRAPPER_STRING_HPP
+
+#include <cstring>
+#include <string>
+
+#include <apr_pools.h>
+
+#include "jni_object.hpp"
+
+namespace Java {
+
+/**
+ * Object wrapper for @c java.lang.String.
+ *
+ * The associated JNI class reference is stored for the lifetime of
+ * the JVM in the global class cache.
+ *
+ * @since New in 1.9.
+ */
+class String
+{
+public:
+ /**
+ * Constructs a wrapper around an existing string @a str.
+ */
+ explicit String(Env env, jstring str)
+ : m_env(env),
+ m_jthis(str)
+ {}
+
+ /**
+ * Constructs a new string and wrapper from @a text.
+ */
+ explicit String(Env env, const char* text)
+ : m_env(env),
+ m_jthis(env.NewStringUTF(text))
+ {}
+
+ /**
+ * Constructs a new string and wrapper from @a text.
+ */
+ explicit String(Env env, const std::string& text)
+ : m_env(env),
+ m_jthis(env.NewStringUTF(text.c_str()))
+ {}
+
+ /**
+ * Returns the wrapped JNI object reference.
+ */
+ jstring get() const
+ {
+ return m_jthis;
+ }
+
+ /**
+ * Returns the wrapped enviromnment reference.
+ */
+ Env get_env() const
+ {
+ return m_env;
+ }
+
+ /**
+ * Returns the number of Unicode characters in the string.
+ */
+ jsize length() const
+ {
+ return m_env.GetStringLength(get());
+ }
+
+ /**
+ * Returns the length of the modified UTF-8 representation of the
+ * string.
+ */
+ jsize utf8_length() const
+ {
+ return m_env.GetStringUTFLength(get());
+ }
+
+ /**
+ * Copies the contents of the modified UTF-8 representation of the
+ * string into @a pool.
+ */
+ const char* strdup(apr_pool_t* pool) const;
+
+ /**
+ * Accessor class for the contents of the string.
+ *
+ * Objects of this class should be created within the scope where
+ * the raw C string is required. They will create an immutable
+ * modified UTF-8 representation of the string contents. The data
+ * will be released by the destructor.
+ */
+ class Contents
+ {
+ public:
+ /**
+ * Constructs an immutable string contents accessor.
+ */
+ explicit Contents(const String& str)
+ : m_str(str),
+ m_text(!str.get() ? NULL
+ : str.m_env.GetStringUTFChars(str.get(), NULL)),
+ m_length(m_text ? jsize(::std::strlen(m_text)) : 0)
+ {}
+
+ /**
+ * Releases the string contents, possibly committing changes to the JVM.
+ */
+ ~Contents()
+ {
+ if (m_text)
+ m_str.m_env.ReleaseStringUTFChars(m_str.get(), NULL);
+ }
+
+ /**
+ * Returns the C representation of the string contents.
+ */
+ const char* c_str() const
+ {
+ return m_text;
+ }
+
+ /**
+ * Returns the length of the C representation of the string.
+ */
+ jsize utf8_length() const
+ {
+ return m_length;
+ }
+
+ protected:
+ const String& m_str;
+ const char* m_text;
+ jsize m_length;
+ };
+
+ /**
+ * Accessor class for the contents of the string.
+ *
+ * Behaves like the #Contents class, but the representation is
+ * considered mutable and can be assigned a new value, which will be
+ * subsequently committed to the JVM.
+ */
+ class MutableContents : protected Contents
+ {
+ public:
+ /**
+ * Constructs a mutable string contents accessor.
+ */
+ explicit MutableContents(String& str)
+ : Contents(str),
+ m_new_text(NULL)
+ {}
+
+ /**
+ * Releases the string contents, possibly committing changes to the JVM.
+ */
+ ~MutableContents()
+ {
+ if (m_new_text)
+ {
+ // Prevent double-release by the Contents destructor.
+ m_text = NULL;
+ m_str.m_env.ReleaseStringUTFChars(m_str.get(), m_new_text);
+ }
+ }
+
+ /**
+ * Returns the C representation of the string contents.
+ */
+ const char* c_str() const
+ {
+ if (m_new_text)
+ return m_new_text;
+ return Contents::c_str();
+ }
+
+ /**
+ * Returns the length of the C representation of the string.
+ */
+ jsize utf8_length() const
+ {
+ return Contents::utf8_length();
+ }
+
+ /**
+ * Sets a new value for the string, to be committed to the JVM
+ * when the accessor object is destroyed.
+ * @throw std::invalid_argument if the @a new_text is @c null
+ * @throw std::logic_error if this is a @c null or immutable string
+ */
+ void set_value(const char* new_text);
+
+ private:
+ const char* m_new_text;
+ };
+
+private:
+ const Env m_env;
+ const jstring m_jthis;
+
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls)
+ {}
+
+ public:
+ virtual ~ClassImpl();
+ };
+
+ friend class Contents;
+ friend class MutableContents;
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_STRING_HPP
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp b/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
new file mode 100644
index 0000000..369d956
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
@@ -0,0 +1,110 @@
+/**
+ * @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
+ */
+
+#include <stdexcept>
+
+#include "jni_string.hpp"
+#include "jni_string_map.hpp"
+
+#include "svn_private_config.h"
+
+namespace Java {
+
+// Class Java::BaseImmutableMap
+
+const char* const BaseImmutableMap::m_class_name = "java/util/Map";
+
+BaseImmutableMap::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_put(env.GetMethodID(cls, "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;)"
+ "Ljava/lang/Object;")),
+ m_mid_clear(env.GetMethodID(cls, "clear", "()V")),
+ m_mid_has_key(env.GetMethodID(cls, "containsKey",
+ "(Ljava/lang/Object;)Z")),
+ m_mid_get(env.GetMethodID(cls, "get",
+ "(Ljava/lang/Object;)Ljava/lang/Object;")),
+ m_mid_size(env.GetMethodID(cls, "size", "()I")),
+ m_mid_entry_set(env.GetMethodID(cls, "entrySet", "()Ljava/util/Set;"))
+{}
+
+BaseImmutableMap::ClassImpl::~ClassImpl() {}
+
+jobject BaseImmutableMap::operator[](const std::string& index) const
+{
+ const String key(m_env, index);
+ if (!m_env.CallBooleanMethod(m_jthis, impl().m_mid_has_key, key.get()))
+ {
+ std::string msg(_("Map does not contain key: "));
+ msg += index;
+ throw std::out_of_range(msg.c_str());
+ }
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get, key.get());
+}
+
+BaseImmutableMap::Iterator BaseImmutableMap::get_iterator() const
+{
+ const jobject jentry_set =
+ m_env.CallObjectMethod(m_jthis, impl().m_mid_entry_set);
+ const jobject jiterator =
+ m_env.CallObjectMethod(jentry_set, Set::impl(m_env).m_mid_iterator);
+ return Iterator(m_env, jiterator);
+}
+
+// Class Java::BaseImmutableMap::Entry
+
+const char* const BaseImmutableMap::Entry::m_class_name = "java/util/Map$Entry";
+
+BaseImmutableMap::Entry::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_get_key(env.GetMethodID(cls, "getKey", "()Ljava/lang/Object;")),
+ m_mid_get_value(env.GetMethodID(cls, "getValue", "()Ljava/lang/Object;"))
+{}
+
+BaseImmutableMap::Entry::ClassImpl::~ClassImpl() {}
+
+// Class Java::BaseImmutableMap::Set
+
+const char* const BaseImmutableMap::Set::m_class_name = "java/util/Set";
+
+BaseImmutableMap::Set::ClassImpl::ClassImpl(Env env, jclass cls)
+ : Object::ClassImpl(env, cls),
+ m_mid_iterator(env.GetMethodID(cls, "iterator",
+ "()Ljava/util/Iterator;"))
+{}
+
+BaseImmutableMap::Set::ClassImpl::~ClassImpl() {}
+
+
+// Class Java::BaseMap
+
+const char* const BaseMap::m_class_name = "java/util/HashMap";
+
+BaseMap::ClassImpl::ClassImpl(Env env, jclass cls)
+ : BaseImmutableMap::ClassImpl(env, cls),
+ m_mid_ctor(env.GetMethodID(cls, "<init>", "(I)V"))
+{}
+
+BaseMap::ClassImpl::~ClassImpl() {}
+
+} // namespace Java
diff --git a/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp b/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
new file mode 100644
index 0000000..db05e28
--- /dev/null
+++ b/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
@@ -0,0 +1,384 @@
+/**
+ * @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
+ */
+
+#ifndef SVN_JAVAHL_JNIWRAPPER_STRING_MAP_HPP
+#define SVN_JAVAHL_JNIWRAPPER_STRING_MAP_HPP
+
+#include <string>
+
+#include "jni_env.hpp"
+#include "jni_object.hpp"
+#include "jni_iterator.hpp"
+
+namespace Java {
+
+/**
+ * Non-template base for an immutable type-safe Java map with String keys.
+ *
+ * @since New in 1.9.
+ */
+class BaseImmutableMap : public Object
+{
+public:
+ /**
+ * Returns the number of elements in the map.
+ */
+ jint length() const
+ {
+ return m_env.CallIntMethod(m_jthis, impl().m_mid_size);
+ }
+
+ /**
+ * Checks if the map is empty.
+ */
+ bool is_empty() const
+ {
+ return (length() == 0);
+ }
+
+protected:
+ /**
+ * Constructs the map wrapper.
+ */
+ explicit BaseImmutableMap(Env env, jobject jmap)
+ : Object(env, ClassCache::get_map(env), jmap)
+ {}
+
+ /**
+ * Constructor used by BaseMap.
+ */
+ explicit BaseImmutableMap(Env env, const Object::ClassImpl* pimpl)
+ : Object(env, pimpl)
+ {}
+
+ /**
+ * Clears the contents of the map.
+ */
+ void clear()
+ {
+ m_env.CallVoidMethod(m_jthis, impl().m_mid_clear);
+ }
+
+ /**
+ * Inserts @a obj identified by @a key into the map.
+ */
+ void put(const std::string& key, jobject obj)
+ {
+ m_env.CallObjectMethod(m_jthis, impl().m_mid_put,
+ String(m_env, key).get(), obj);
+ }
+
+ /**
+ * Returns the object reference identified by @a index.
+ * @throw std::out_of_range if there is no such element.
+ */
+ jobject operator[](const std::string& index) const;
+
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_put;
+ const MethodID m_mid_clear;
+ const MethodID m_mid_has_key;
+ const MethodID m_mid_get;
+ const MethodID m_mid_size;
+ const MethodID m_mid_entry_set;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+
+ class Iterator : public BaseIterator
+ {
+ friend class BaseImmutableMap;
+ explicit Iterator(Env env, jobject jiterator)
+ : BaseIterator(env, jiterator)
+ {}
+ };
+
+ Iterator get_iterator() const;
+
+ class Entry : public Object
+ {
+ public:
+ explicit Entry(Env env, jobject jentry)
+ : Object(env, ClassCache::get_map_entry(env), jentry)
+ {}
+
+ const std::string key() const
+ {
+ const jstring jkey =
+ jstring(m_env.CallObjectMethod(m_jthis, impl().m_mid_get_key));
+ const String::Contents key(String(m_env, jkey));
+ return std::string(key.c_str());
+ }
+
+ jobject value() const
+ {
+ return m_env.CallObjectMethod(m_jthis, impl().m_mid_get_value);
+ }
+
+ private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_get_key;
+ const MethodID m_mid_get_value;
+ };
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+ };
+
+private:
+ struct Set
+ {
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public Object::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_iterator;
+ };
+
+ static const char* const m_class_name;
+ static const ClassImpl& impl(Env env)
+ {
+ return *dynamic_cast<const ClassImpl*>(ClassCache::get_set(env));
+ }
+ };
+};
+
+/**
+ * Template wrapper for an immutable type-safe Java map.
+ *
+ * @since New in 1.9.
+ */
+template <typename T, typename NativeT=jobject>
+class ImmutableMap : public BaseImmutableMap
+{
+public:
+ /**
+ * Constructs the map wrapper, converting the contents to an
+ * @c std::map.
+ */
+ explicit ImmutableMap(Env env, jobject jmap)
+ : BaseImmutableMap(env, jmap)
+ {}
+
+ /**
+ * Returns a wrapper object for the object reference identified by @a index.
+ * @throw std::out_of_range if there is no such element.
+ */
+ T operator[](const std::string& index) const
+ {
+ return T(m_env, NativeT(BaseImmutableMap::operator[](index)));
+ }
+
+ /**
+ * Iterates over the items in the map, calling @a function for
+ * each item.
+ * @see std::for_each
+ * @note Unlike std::for_each, which invokes the functor with a
+ * single @c value_type argument, this iterator calls
+ * @a function with separate @c const references to the key
+ * and value.
+ */
+ template<typename F>
+ F for_each(F function) const
+ {
+ Iterator iter(get_iterator());
+ while (iter.has_next())
+ {
+ Entry entry(m_env, iter.next());
+ const std::string& key(entry.key());
+ function(key, T(m_env, NativeT(entry.value())));
+ }
+ return function;
+ }
+};
+
+/**
+ * Non-template base for a mutable type-safe Java map with String keys.
+ *
+ * @since New in 1.9.
+ */
+class BaseMap : public BaseImmutableMap
+{
+public:
+ /**
+ * Clears the contents of the map.
+ */
+ void clear()
+ {
+ BaseImmutableMap::clear();
+ }
+
+protected:
+ /**
+ * Constructs the map wrapper, treating @a jmap as a @c java.util.Map.
+ */
+ explicit BaseMap(Env env, jobject jmap)
+ : BaseImmutableMap(env, jmap)
+ {}
+
+ /**
+ * Constructs and wraps an empty map of type @c java.util.HashMap
+ * with initial allocation size @a length.
+ */
+ explicit BaseMap(Env env, jint length)
+ : BaseImmutableMap(env, ClassCache::get_hash_map(env))
+ {
+ set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
+ }
+
+private:
+ /**
+ * This object's implementation details.
+ */
+ class ClassImpl : public BaseImmutableMap::ClassImpl
+ {
+ friend class ClassCacheImpl;
+
+ protected:
+ explicit ClassImpl(Env env, jclass cls);
+
+ public:
+ virtual ~ClassImpl();
+
+ const MethodID m_mid_ctor;
+ };
+
+ const ClassImpl& impl() const
+ {
+ return *dynamic_cast<const ClassImpl*>(m_impl);
+ }
+
+ friend class ClassCacheImpl;
+ static const char* const m_class_name;
+};
+
+/**
+ * Template wrapper for a mutable type-safe Java map.
+ *
+ * @since New in 1.9.
+ */
+template <typename T, typename NativeT=jobject>
+class Map : public BaseMap
+{
+public:
+ /**
+ * Constructs the map wrapper, deriving the class from @a jmap.
+ */
+ explicit Map(Env env, jobject jmap)
+ : BaseMap(env, jmap)
+ {}
+
+ /**
+ * Constructs and wraps an empty map of type @c java.util.HashMap
+ * with initial allocation size @a length.
+ */
+ explicit Map(Env env, jint length = 0)
+ : BaseMap(env, length)
+ {}
+
+ /**
+ * Inserts @a obj identified by @a key into the map.
+ */
+ void put(const std::string& key, const T& obj)
+ {
+ BaseMap::put(key, obj.get());
+ }
+
+ /**
+ * Returns a wrapper object for the object reference identified by @a index.
+ * @throw std::out_of_range if there is no such element.
+ */
+ T operator[](const std::string& index) const
+ {
+ return T(m_env, NativeT(BaseMap::operator[](index)));
+ }
+
+ /**
+ * Iterates over the items in the map, calling @a function for
+ * each item.
+ * @see std::for_each
+ * @note Unlike std::for_each, which invokes the functor with a
+ * single @c value_type argument, this iterator calls
+ * @a function with separate @c const references to the key
+ * and value.
+ */
+ template<typename F>
+ F for_each(F function) const
+ {
+ Iterator iter(get_iterator());
+ while (iter.has_next())
+ {
+ Entry entry(m_env, iter.next());
+ const std::string& key(entry.key());
+ function(key, T(m_env, NativeT(entry.value())));
+ }
+ return function;
+ }
+};
+
+} // namespace Java
+
+#endif // SVN_JAVAHL_JNIWRAPPER_STRING_MAP_HPP
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp
index 9705304..a6be60f 100644
--- a/subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp
@@ -25,14 +25,11 @@
* NativeResources.
*/
-#include "JNIUtil.h"
#include "../include/org_apache_subversion_javahl_NativeResources.h"
JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_NativeResources_initNativeLibrary
(JNIEnv *env, jclass jclazz)
{
- // No usual JNIEntry here, as the prerequisite native library
- // initialization is performed here.
- JNIUtil::JNIGlobalInit(env);
+ // No-op; see comment in NativeResources.java
}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
index e4fdd76..5f70a5a 100644
--- a/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
@@ -50,7 +50,8 @@
#include "ImportFilterCallback.h"
#include "ChangelistCallback.h"
#include "StringArray.h"
-#include "RevpropTable.h"
+#include "PropertyTable.h"
+#include "CreateJ.h"
#include "VersionExtended.h"
#include "DiffOptions.h"
#include "svn_version.h"
@@ -184,8 +185,9 @@ Java_org_apache_subversion_javahl_SVNClient_list
JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_status
(JNIEnv *env, jobject jthis, jstring jpath, jobject jdepth,
- jboolean jonServer, jboolean jgetAll, jboolean jnoIgnore,
- jboolean jignoreExternals, jobject jchangelists,
+ jboolean jonServer, jboolean jonDisk, jboolean jgetAll,
+ jboolean jnoIgnore, jboolean jignoreExternals,
+ jboolean jdepthAsSticky, jobject jchangelists,
jobject jstatusCallback)
{
JNIEntry(SVNClient, status);
@@ -203,9 +205,9 @@ Java_org_apache_subversion_javahl_SVNClient_status
StatusCallback callback(jstatusCallback);
cl->status(path, EnumMapper::toDepth(jdepth),
- jonServer ? true:false,
- jgetAll ? true:false, jnoIgnore ? true:false,
- jignoreExternals ? true:false, changelists, &callback);
+ bool(jonServer), bool(jonDisk), bool(jgetAll),
+ bool(jnoIgnore), bool(jignoreExternals),
+ bool(jdepthAsSticky), changelists, &callback);
}
JNIEXPORT void JNICALL
@@ -257,7 +259,7 @@ Java_org_apache_subversion_javahl_SVNClient_password
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_setPrompt
+Java_org_apache_subversion_javahl_SVNClient_setPrompt__Lorg_apache_subversion_javahl_callback_AuthnCallback_2
(JNIEnv *env, jobject jthis, jobject jprompter)
{
JNIEntry(SVNClient, setPrompt);
@@ -267,7 +269,7 @@ Java_org_apache_subversion_javahl_SVNClient_setPrompt
JNIUtil::throwError(_("bad C++ this"));
return;
}
- Prompter *prompter = Prompter::makeCPrompter(jprompter);
+ Prompter::UniquePtr prompter(Prompter::create(jprompter));
if (JNIUtil::isExceptionThrown())
return;
@@ -275,6 +277,39 @@ Java_org_apache_subversion_javahl_SVNClient_setPrompt
}
JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_SVNClient_setPrompt__Lorg_apache_subversion_javahl_callback_UserPasswordCallback_2
+(JNIEnv *env, jobject jthis, jobject jprompter)
+{
+ JNIEntry(SVNClient, setPrompt);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError(_("bad C++ this"));
+ return;
+ }
+ Prompter::UniquePtr prompter(CompatPrompter::create(jprompter));
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ cl->getClientContext().setPrompt(prompter);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_SVNClient_setTunnelAgent
+(JNIEnv *env, jobject jthis, jobject jtunnelcb)
+{
+ JNIEntry(SVNClient, setPrompt);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError(_("bad C++ this"));
+ return;
+ }
+
+ cl->getClientContext().setTunnelCallback(jtunnelcb);
+}
+
+JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_logMessages
(JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision,
jobject jranges, jboolean jstopOnCopy, jboolean jdisoverPaths,
@@ -282,6 +317,14 @@ Java_org_apache_subversion_javahl_SVNClient_logMessages
jobject jlogMessageCallback)
{
JNIEntry(SVNClient, logMessages);
+
+ if (jlong(int(jlimit)) != jlimit)
+ {
+ JNIUtil::raiseThrowable("java/lang/IllegalArgumentException",
+ "The value of 'limit' is too large");
+ return;
+ }
+
SVNClient *cl = SVNClient::getCppObject(jthis);
if (cl == NULL)
{
@@ -323,7 +366,7 @@ Java_org_apache_subversion_javahl_SVNClient_logMessages
cl->logMessages(path, pegRevision, revisionRanges,
jstopOnCopy ? true: false, jdisoverPaths ? true : false,
jincludeMergedRevisions ? true : false,
- revProps, static_cast<long>(jlimit), &callback);
+ revProps, int(jlimit), &callback);
}
JNIEXPORT jlong JNICALL
@@ -384,7 +427,7 @@ Java_org_apache_subversion_javahl_SVNClient_remove
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -395,8 +438,8 @@ Java_org_apache_subversion_javahl_SVNClient_remove
JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_revert
-(JNIEnv *env, jobject jthis, jstring jpath, jobject jdepth,
- jobject jchangelists)
+(JNIEnv *env, jobject jthis, jobject jpaths, jobject jdepth,
+ jobject jchangelists, jboolean jclear_changelists, jboolean jmetadata_only)
{
JNIEntry(SVNClient, revert);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -405,7 +448,9 @@ Java_org_apache_subversion_javahl_SVNClient_revert
JNIUtil::throwError(_("bad C++ this"));
return;
}
- JNIStringHolder path(jpath);
+
+ SVN_JNI_NULL_PTR_EX(jpaths, "paths", );
+ StringArray paths(jpaths);
if (JNIUtil::isExceptionThrown())
return;
@@ -413,7 +458,8 @@ Java_org_apache_subversion_javahl_SVNClient_revert
if (JNIUtil::isExceptionThrown())
return;
- cl->revert(path, EnumMapper::toDepth(jdepth), changelists);
+ cl->revert(paths, EnumMapper::toDepth(jdepth),
+ changelists, bool(jclear_changelists), bool(jmetadata_only));
}
JNIEXPORT void JNICALL
@@ -498,7 +544,7 @@ Java_org_apache_subversion_javahl_SVNClient_commit
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -513,6 +559,7 @@ JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_copy
(JNIEnv *env, jobject jthis, jobject jcopySources, jstring jdestPath,
jboolean jcopyAsChild, jboolean jmakeParents, jboolean jignoreExternals,
+ jboolean jmetadataOnly, jboolean jpinExternals, jobject jexternalsToPin,
jobject jrevpropTable, jobject jmessage, jobject jcallback)
{
JNIEntry(SVNClient, copy);
@@ -539,13 +586,15 @@ Java_org_apache_subversion_javahl_SVNClient_copy
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
CommitCallback callback(jcallback);
- cl->copy(copySources, destPath, &message, jcopyAsChild ? true : false,
- jmakeParents ? true : false, jignoreExternals ? true : false,
+ cl->copy(copySources, destPath, &message,
+ bool(jcopyAsChild), bool(jmakeParents),
+ bool(jignoreExternals), bool(jmetadataOnly),
+ bool(jpinExternals), jexternalsToPin,
revprops, jcallback ? &callback : NULL);
}
@@ -577,7 +626,7 @@ Java_org_apache_subversion_javahl_SVNClient_move
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -610,7 +659,7 @@ Java_org_apache_subversion_javahl_SVNClient_mkdir
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -621,7 +670,10 @@ Java_org_apache_subversion_javahl_SVNClient_mkdir
JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_cleanup
-(JNIEnv *env, jobject jthis, jstring jpath)
+(JNIEnv *env, jobject jthis, jstring jpath,
+ jboolean jbreakLocks, jboolean jfixRecordedTimestamps,
+ jboolean jclearDavCache, jboolean jremoveUnusedPristines,
+ jboolean jincludeExternals)
{
JNIEntry(SVNClient, cleanup);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -634,7 +686,9 @@ Java_org_apache_subversion_javahl_SVNClient_cleanup
if (JNIUtil::isExceptionThrown())
return;
- cl->cleanup(path);
+ cl->cleanup(path, jbreakLocks, jfixRecordedTimestamps,
+ jclearDavCache, jremoveUnusedPristines,
+ jincludeExternals);
}
JNIEXPORT void JNICALL
@@ -660,7 +714,8 @@ JNIEXPORT jlong JNICALL
Java_org_apache_subversion_javahl_SVNClient_doExport
(JNIEnv *env, jobject jthis, jstring jsrcPath, jstring jdestPath,
jobject jrevision, jobject jpegRevision, jboolean jforce,
- jboolean jignoreExternals, jobject jdepth, jstring jnativeEOL)
+ jboolean jignoreExternals, jboolean jignoreKeywords,
+ jobject jdepth, jstring jnativeEOL)
{
JNIEntry(SVNClient, doExport);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -690,7 +745,9 @@ Java_org_apache_subversion_javahl_SVNClient_doExport
return -1;
return cl->doExport(srcPath, destPath, revision, pegRevision,
- jforce ? true : false, jignoreExternals ? true : false,
+ jforce ? true : false,
+ jignoreExternals ? true : false,
+ jignoreKeywords ? true : false,
EnumMapper::toDepth(jdepth), nativeEOL);
}
@@ -758,7 +815,7 @@ Java_org_apache_subversion_javahl_SVNClient_doImport
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -796,11 +853,11 @@ Java_org_apache_subversion_javahl_SVNClient_suggestMergeSources
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2ZLorg_apache_subversion_javahl_types_Depth_2ZZZZ
+Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2ZLorg_apache_subversion_javahl_types_Depth_2ZZZZZ
(JNIEnv *env, jobject jthis, jstring jpath1, jobject jrevision1,
jstring jpath2, jobject jrevision2, jstring jlocalPath, jboolean jforceDelete,
jobject jdepth, jboolean jignoreMergeinfo, jboolean jdiffIgnoreAncestry,
- jboolean jdryRun, jboolean jrecordOnly)
+ jboolean jdryRun, jboolean jallowMixedRev, jboolean jrecordOnly)
{
JNIEntry(SVNClient, merge);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -835,15 +892,16 @@ Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apach
jignoreMergeinfo ? true:false,
jdiffIgnoreAncestry ? true:false,
jdryRun ? true:false,
+ jallowMixedRev ? true:false,
jrecordOnly ? true:false);
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_util_List_2Ljava_lang_String_2ZLorg_apache_subversion_javahl_types_Depth_2ZZZZ
+Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_util_List_2Ljava_lang_String_2ZLorg_apache_subversion_javahl_types_Depth_2ZZZZZ
(JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision,
jobject jranges, jstring jlocalPath, jboolean jforceDelete, jobject jdepth,
jboolean jignoreMergeinfo, jboolean jdiffIgnoreAncestry,
- jboolean jdryRun, jboolean jrecordOnly)
+ jboolean jdryRun, jboolean jallowMixedRev, jboolean jrecordOnly)
{
JNIEntry(SVNClient, merge);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -894,6 +952,7 @@ Java_org_apache_subversion_javahl_SVNClient_merge__Ljava_lang_String_2Lorg_apach
jignoreMergeinfo ? true:false,
jdiffIgnoreAncestry ? true:false,
jdryRun ? true:false,
+ jallowMixedRev ? true:false,
jrecordOnly ? true:false);
}
@@ -1009,7 +1068,7 @@ Java_org_apache_subversion_javahl_SVNClient_propertySetRemote
if (JNIUtil::isExceptionThrown())
return;
- RevpropTable revprops(jrevpropTable);
+ PropertyTable revprops(jrevpropTable, false, false);
if (JNIUtil::isExceptionThrown())
return;
@@ -1439,35 +1498,44 @@ Java_org_apache_subversion_javahl_SVNClient_diffSummarize__Ljava_lang_String_2Lo
jignoreAncestry ? true : false, receiver);
}
-JNIEXPORT void JNICALL
+JNIEXPORT jobject JNICALL
Java_org_apache_subversion_javahl_SVNClient_streamFileContent
-(JNIEnv *env, jobject jthis, jstring jpath, jobject jrevision,
- jobject jpegRevision, jobject jstream)
+(JNIEnv *env, jobject jthis, jstring jpath,
+ jobject jrevision, jobject jpegRevision,
+ jboolean jexpand_keywords, jboolean jreturn_props,
+ jobject jstream)
{
JNIEntry(SVNClient, streamFileContent);
SVNClient *cl = SVNClient::getCppObject(jthis);
if (cl == NULL)
{
JNIUtil::throwError(_("bad C++ this"));
- return;
+ return NULL;
}
JNIStringHolder path(jpath);
if (JNIUtil::isExceptionThrown())
- return;
+ return NULL;
Revision revision(jrevision);
if (JNIUtil::isExceptionThrown())
- return;
+ return NULL;
Revision pegRevision(jpegRevision);
if (JNIUtil::isExceptionThrown())
- return;
+ return NULL;
OutputStream dataOut(jstream);
if (JNIUtil::isExceptionThrown())
- return;
+ return NULL;
- cl->streamFileContent(path, revision, pegRevision, dataOut);
+ apr_hash_t* props =
+ cl->streamFileContent(path, revision, pegRevision,
+ bool(jexpand_keywords), bool(jreturn_props),
+ dataOut);
+ if (!jreturn_props || JNIUtil::isExceptionThrown())
+ return NULL;
+
+ return CreateJ::PropertyMap(props, SVN::Pool().getPool());
}
JNIEXPORT jstring JNICALL
@@ -1581,7 +1649,8 @@ JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_blame
(JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision,
jobject jrevisionStart, jobject jrevisionEnd, jboolean jignoreMimeType,
- jboolean jincludeMergedRevisions, jobject jblameCallback)
+ jboolean jincludeMergedRevisions, jobject jblameCallback,
+ jobject jdiffOptions)
{
JNIEntry(SVNClient, blame);
SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -1606,10 +1675,15 @@ Java_org_apache_subversion_javahl_SVNClient_blame
if (JNIUtil::isExceptionThrown())
return;
+ DiffOptions options(jdiffOptions);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
BlameCallback callback(jblameCallback);
cl->blame(path, pegRevision, revisionStart, revisionEnd,
jignoreMimeType ? true : false,
- jincludeMergedRevisions ? true : false, &callback);
+ jincludeMergedRevisions ? true : false, &callback,
+ options);
}
JNIEXPORT void JNICALL
@@ -1648,6 +1722,36 @@ Java_org_apache_subversion_javahl_SVNClient_getConfigDirectory
}
JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_SVNClient_setConfigEventHandler(
+ JNIEnv* env, jobject jthis, jobject jcallback)
+{
+ JNIEntry(SVNClient, setConfigEventHandler);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError(_("bad C++ this"));
+ return;
+ }
+
+ cl->getClientContext().setConfigEventHandler(jcallback);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_SVNClient_getConfigEventHandler(
+ JNIEnv* env, jobject jthis)
+{
+ JNIEntry(SVNClient, getConfigEventHandler);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError(_("bad C++ this"));
+ return NULL;
+ }
+
+ return cl->getClientContext().getConfigEventHandler();
+}
+
+JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNClient_cancelOperation
(JNIEnv *env, jobject jthis)
{
@@ -1738,8 +1842,9 @@ Java_org_apache_subversion_javahl_SVNClient_getChangelists
return;
ChangelistCallback callback(jchangelistCallback);
- cl->getChangelists(root_path, changelists, EnumMapper::toDepth(jdepth),
- &callback);
+ cl->getChangelists(root_path,
+ (jchangelists ? &changelists : NULL),
+ EnumMapper::toDepth(jdepth), &callback);
}
JNIEXPORT void JNICALL
@@ -1790,12 +1895,14 @@ Java_org_apache_subversion_javahl_SVNClient_unlock
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_info2
+Java_org_apache_subversion_javahl_SVNClient_info
(JNIEnv *env, jobject jthis, jstring jpath, jobject jrevision,
- jobject jpegRevision, jobject jdepth, jobject jchangelists,
- jobject jinfoCallback)
+ jobject jpegRevision, jobject jdepth,
+ jboolean jfetchExcluded, jboolean jfetchActualOnly,
+ jboolean jincludeExternals,
+ jobject jchangelists, jobject jinfoCallback)
{
- JNIEntry(SVNClient, info2);
+ JNIEntry(SVNClient, info);
SVNClient *cl = SVNClient::getCppObject(jthis);
if (cl == NULL)
{
@@ -1819,8 +1926,10 @@ Java_org_apache_subversion_javahl_SVNClient_info2
return;
InfoCallback callback(jinfoCallback);
- cl->info2(path, revision, pegRevision, EnumMapper::toDepth(jdepth),
- changelists, &callback);
+ cl->info(path, revision, pegRevision, EnumMapper::toDepth(jdepth),
+ svn_boolean_t(jfetchExcluded), svn_boolean_t(jfetchActualOnly),
+ svn_boolean_t(jincludeExternals),
+ changelists, &callback);
}
JNIEXPORT void JNICALL
@@ -1851,3 +1960,44 @@ Java_org_apache_subversion_javahl_SVNClient_patch
jreverse ? true : false, jignoreWhitespace ? true : false,
jremoveTempfiles ? true : false, &callback);
}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_SVNClient_vacuum
+(JNIEnv *env, jobject jthis, jstring jpath,
+ jboolean jremoveUnversionedItems, jboolean jremoveIgnoredItems,
+ jboolean jfixRecordedTimestamps, jboolean jremoveUnusedPristines,
+ jboolean jincludeExternals)
+{
+ JNIEntry(SVNClient, patch);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError("bad C++ this");
+ return;
+ }
+
+ JNIStringHolder path(jpath);
+ cl->vacuum(path,
+ jremoveUnversionedItems, jremoveIgnoredItems,
+ jfixRecordedTimestamps, jremoveUnusedPristines,
+ jincludeExternals);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_SVNClient_nativeOpenRemoteSession
+(JNIEnv *env, jobject jthis, jstring jpath, jint jretryAttempts)
+{
+ JNIEntry(SVNClient, openRemoteSession);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if (cl == NULL)
+ {
+ JNIUtil::throwError("bad C++ this");
+ return NULL;
+ }
+
+ JNIStringHolder path(jpath);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return cl->openRemoteSession(path, jretryAttempts);
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp
index ee1c7c1..ae41bb3 100644
--- a/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.cpp
@@ -170,7 +170,7 @@ Java_org_apache_subversion_javahl_SVNRepos_dump
JNIEXPORT void JNICALL
Java_org_apache_subversion_javahl_SVNRepos_hotcopy
(JNIEnv *env, jobject jthis, jobject jpath, jobject jtargetPath,
- jboolean jcleanLogs, jboolean jincremental)
+ jboolean jcleanLogs, jboolean jincremental, jobject jnotifyCallback)
{
JNIEntry(SVNRepos, hotcopy);
SVNRepos *cl = SVNRepos::getCppObject(jthis);
@@ -188,8 +188,11 @@ Java_org_apache_subversion_javahl_SVNRepos_hotcopy
if (JNIUtil::isExceptionThrown())
return;
+ ReposNotifyCallback notifyCallback(jnotifyCallback);
+
cl->hotcopy(path, targetPath, jcleanLogs ? true : false,
- jincremental ? true : false);
+ jincremental ? true : false,
+ jnotifyCallback != NULL ? &notifyCallback : NULL);
}
JNIEXPORT void JNICALL
@@ -239,11 +242,13 @@ Java_org_apache_subversion_javahl_SVNRepos_listUnusedDBLogs
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNRepos_load
-(JNIEnv *env, jobject jthis, jobject jpath, jobject jinputData,
- jobject jrevisionStart, jobject jrevisionEnd,
- jboolean jignoreUUID, jboolean jforceUUID, jboolean jusePreCommitHook,
- jboolean jusePostCommitHook, jstring jrelativePath, jobject jnotifyCallback)
+Java_org_apache_subversion_javahl_SVNRepos_load(
+ JNIEnv *env, jobject jthis, jobject jpath, jobject jinputData,
+ jobject jrevisionStart, jobject jrevisionEnd,
+ jboolean jignoreUUID, jboolean jforceUUID,
+ jboolean jusePreCommitHook, jboolean jusePostCommitHook,
+ jboolean jvalidateProps, jboolean jignoreDates,
+ jstring jrelativePath, jobject jnotifyCallback)
{
JNIEntry(SVNRepos, load);
SVNRepos *cl = SVNRepos::getCppObject(jthis);
@@ -280,6 +285,8 @@ Java_org_apache_subversion_javahl_SVNRepos_load
jforceUUID ? true : false,
jusePreCommitHook ? true : false,
jusePostCommitHook ? true : false,
+ jvalidateProps ? true : false,
+ jignoreDates ? true : false,
relativePath,
(jnotifyCallback != NULL ? &notifyCallback : NULL));
}
@@ -409,9 +416,11 @@ Java_org_apache_subversion_javahl_SVNRepos_setRevProp
}
JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNRepos_verify
-(JNIEnv *env, jobject jthis, jobject jpath, jobject jrevisionStart,
- jobject jrevisionEnd, jobject jcallback)
+Java_org_apache_subversion_javahl_SVNRepos_verify(
+ JNIEnv *env, jobject jthis, jobject jpath,
+ jobject jrevisionStart, jobject jrevisionEnd,
+ jboolean jcheckNormalization, jboolean jmetadataOnly,
+ jobject jnotifyCallback, jobject jverifyCallback)
{
JNIEntry(SVNRepos, verify);
SVNRepos *cl = SVNRepos::getCppObject(jthis);
@@ -433,12 +442,18 @@ Java_org_apache_subversion_javahl_SVNRepos_verify
if (JNIUtil::isExceptionThrown())
return;
- ReposNotifyCallback callback(jcallback);
+ ReposNotifyCallback notify_cb(jnotifyCallback);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ ReposVerifyCallback verify_cb(jverifyCallback);
if (JNIUtil::isExceptionThrown())
return;
cl->verify(path, revisionStart, revisionEnd,
- jcallback != NULL ? &callback : NULL);
+ jcheckNormalization, jmetadataOnly,
+ jnotifyCallback != NULL ? &notify_cb : NULL,
+ jverifyCallback != NULL ? &verify_cb : NULL);
}
JNIEXPORT jobject JNICALL
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp
new file mode 100644
index 0000000..e871b0c
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.cpp
@@ -0,0 +1,205 @@
+/**
+ * @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 org_apache_subversion_javahl_remote_CommitEditor.cpp
+ * @brief Implementation of the native methods in the Java class CommitEditor
+ */
+
+#include "../include/org_apache_subversion_javahl_remote_CommitEditor.h"
+
+#include "JNIStackElement.h"
+#include "JNIUtil.h"
+#include "CommitEditor.h"
+
+#include "svn_private_config.h"
+
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_finalize(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(CommitEditor, finalize);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ if (editor != NULL)
+ editor->finalize();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_nativeDispose(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(CommitEditor, nativeDispose);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ if (editor != NULL)
+ editor->dispose(jthis);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_nativeCreateInstance(
+ JNIEnv *env, jclass thisclass, jobject jsession, jobject jrevprops,
+ jobject jcommit_callback, jobject jlock_tokens, jboolean jkeep_locks,
+ jobject jget_base_cb, jobject jget_props_cb, jobject jget_kind_cb)
+{
+ jobject jthis = NULL; // Placeholder -- this is a static method
+ JNIEntry(CommitEditor, nativeCreateInstance);
+
+ return CommitEditor::createInstance(
+ jsession, jrevprops, jcommit_callback, jlock_tokens, jkeep_locks,
+ jget_base_cb, jget_props_cb, jget_kind_cb);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_addDirectory(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jobject jchildren, jobject jproperties,
+ jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, addDirectory);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->addDirectory(jrelpath, jchildren, jproperties, jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_addFile(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jobject jchecksum, jobject jcontents,
+ jobject jproperties, jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, addFile);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->addFile(jrelpath, jchecksum, jcontents, jproperties,
+ jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_addSymlink(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jstring jtarget, jobject jproperties,
+ jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, addSymlink);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->addSymlink(jrelpath, jtarget, jproperties, jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_addAbsent(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jobject jkind, jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, addAbsent);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->addAbsent(jrelpath, jkind, jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_alterDirectory(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jlong jrevision, jobject jchildren, jobject jproperties)
+{
+ JNIEntry(CommitEditor, alterDirectory);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->alterDirectory(jrelpath, jrevision, jchildren, jproperties);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_alterFile(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jlong jrevision, jobject jchecksum, jobject jcontents,
+ jobject jproperties)
+{
+ JNIEntry(CommitEditor, alterFile);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->alterFile(jrelpath, jrevision, jchecksum, jcontents, jproperties);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_alterSymlink(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jlong jrevision, jstring jtarget, jobject jproperties)
+{
+ JNIEntry(CommitEditor, alterSymlink);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->alterSymlink(jrelpath, jrevision, jtarget, jproperties);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_delete(
+ JNIEnv* env, jobject jthis,
+ jstring jrelpath, jlong jrevision)
+{
+ JNIEntry(CommitEditor, delete);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->remove(jrelpath, jrevision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_copy(
+ JNIEnv* env, jobject jthis,
+ jstring jsrc_relpath, jlong jsrc_revision, jstring jdst_relpath,
+ jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, copy);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->copy(jsrc_relpath, jsrc_revision, jdst_relpath, jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_move(
+ JNIEnv* env, jobject jthis,
+ jstring jsrc_relpath, jlong jsrc_revision, jstring jdst_relpath,
+ jlong jreplaces_revision)
+{
+ JNIEntry(CommitEditor, move);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->move(jsrc_relpath, jsrc_revision, jdst_relpath, jreplaces_revision);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_complete(
+ JNIEnv* env, jobject jthis)
+{
+ JNIEntry(CommitEditor, complete);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->complete();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_CommitEditor_abort(
+ JNIEnv* env, jobject jthis, jobject jsession)
+{
+ JNIEntry(CommitEditor, abort);
+ CommitEditor *editor = CommitEditor::getCppObject(jthis);
+ CPPADDR_NULL_PTR(editor,);
+ editor->abort();
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp
new file mode 100644
index 0000000..80c0c42
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.cpp
@@ -0,0 +1,61 @@
+/**
+ * @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 org_apache_subversion_javahl_remote_RemoteFactory.cpp
+ * @brief Implementation of the native methods in the Java class RemoteFactory
+ */
+
+#include "../include/org_apache_subversion_javahl_remote_RemoteFactory.h"
+
+#include "JNIStackElement.h"
+#include "JNIUtil.h"
+#include "JNIStringHolder.h"
+
+#include "RemoteSession.h"
+
+#include "svn_private_config.h"
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteFactory_open(
+ JNIEnv *env, jclass jclazz, jint jretryAttempts,
+ jstring jurl, jstring juuid,
+ jstring jconfigDirectory,
+ jstring jusername, jstring jpassword,
+ jobject jprompter, jobject jdeprecatedPrompter,
+ jobject jprogress, jobject jcfgcb, jobject jtunnelcb)
+{
+ //JNI macros need jthis but this is a static call
+ JNIEntryStatic(RemoteFactory, open);
+
+ /*
+ * Create RemoteSession C++ object and return its java wrapper to the caller
+ */
+ jobject jremoteSession = RemoteSession::open(
+ jretryAttempts, jurl, juuid,
+ jconfigDirectory, jusername, jpassword,
+ jprompter, jdeprecatedPrompter,
+ jprogress, jcfgcb, jtunnelcb);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ return jremoteSession;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp
new file mode 100644
index 0000000..03079b6
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.cpp
@@ -0,0 +1,359 @@
+/**
+ * @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 org_apache_subversion_javahl_remote_RemoteSession.cpp
+ * @brief Implementation of the native methods in the Java class RemoteSession
+ */
+
+#include "../include/org_apache_subversion_javahl_remote_RemoteSession.h"
+
+#include "JNIStackElement.h"
+#include "JNIUtil.h"
+#include "Prompter.h"
+#include "RemoteSession.h"
+#include "Revision.h"
+#include "EnumMapper.h"
+
+#include "svn_private_config.h"
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_finalize(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, finalize);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ if (ras != NULL)
+ ras->finalize();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeDispose(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, nativeDispose);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ if (ras != NULL)
+ ras->dispose(jthis);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_cancelOperation(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, cancelOperation);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, );
+
+ ras->cancelOperation();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_reparent(
+ JNIEnv *env, jobject jthis, jstring jurl)
+{
+ JNIEntry(RemoteSession, getSessionUrl);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, );
+
+ ras->reparent(jurl);
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getSessionRelativePath(
+ JNIEnv *env, jobject jthis, jstring jurl)
+{
+ JNIEntry(RemoteSession, getSessionUrl);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getSessionRelativePath(jurl);
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getReposRelativePath(
+ JNIEnv *env, jobject jthis, jstring jurl)
+{
+ JNIEntry(RemoteSession, getSessionUrl);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getReposRelativePath(jurl);
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getSessionUrl(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, getSessionUrl);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getSessionUrl();
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getReposUUID(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, geRepostUUID);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getReposUUID();
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getReposRootUrl(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, geRepostUUID);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getReposRootUrl();
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getLatestRevision(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(RemoteSession, getLatestRevision);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, SVN_INVALID_REVNUM);
+
+ return ras->getLatestRevision();
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getRevisionByTimestamp(
+ JNIEnv *env, jobject jthis, jlong timestamp)
+{
+ JNIEntry(RemoteSession, getDatedRevision);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, SVN_INVALID_REVNUM);
+
+ return ras->getRevisionByTimestamp(timestamp);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeChangeRevisionProperty(
+ JNIEnv *env, jobject jthis, jlong jrevision, jstring jname,
+ jbyteArray jold_value, jbyteArray jvalue)
+{
+ JNIEntry(RemoteSession, nativeChangeRevisionProperty);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, );
+
+ return ras->changeRevisionProperty(jrevision, jname, jold_value, jvalue);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getRevisionProperties(
+ JNIEnv *env, jobject jthis, jlong jrevision)
+{
+ JNIEntry(SVNReposAccess, getRevisionProperties);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getRevisionProperties(jrevision);
+}
+
+JNIEXPORT jbyteArray JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getRevisionProperty(
+ JNIEnv *env, jobject jthis, jlong jrevision, jstring jname)
+{
+ JNIEntry(SVNReposAccess, getRevisionProperty);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getRevisionProperty(jrevision, jname);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeGetFile(
+ JNIEnv *env, jobject jthis, jlong jrevision, jstring jpath,
+ jobject jcontents, jobject jproperties)
+{
+ JNIEntry(SVNReposAccess, nativeGetFile);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, SVN_INVALID_REVNUM);
+
+ return ras->getFile(jrevision, jpath, jcontents, jproperties);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeGetDirectory(
+ JNIEnv *env, jobject jthis, jlong jrevision, jstring jpath,
+ jint jdirent_fields, jobject jdirents, jobject jproperties)
+{
+ JNIEntry(SVNReposAccess, nativeGetDirectory);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, SVN_INVALID_REVNUM);
+
+ return ras->getDirectory(jrevision, jpath,
+ jdirent_fields, jdirents, jproperties);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getMergeinfo(
+ JNIEnv *env, jobject jthis, jobject jpaths, jlong jrevision,
+ jobject jinherit, jboolean jinclude_descendants)
+{
+ JNIEntry(SVNReposAccess, getMergeinfo);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getMergeinfo(jpaths, jrevision, jinherit, jinclude_descendants);
+}
+
+// TODO: update
+// TODO: switch
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeStatus(
+ JNIEnv *env, jobject jthis, jstring jstatus_target, jlong jrevision,
+ jobject jdepth, jobject jstatus_editor, jobject jreporter)
+{
+ JNIEntry(SVNReposAccess, nativeStatus);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras,);
+
+ ras->status(jthis, jstatus_target, jrevision, jdepth,
+ jstatus_editor, jreporter);
+}
+
+// TODO: diff
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getLog(
+ JNIEnv *env, jobject jthis, jobject jpaths,
+ jlong jstartrev, jlong jendrev, jint jlimit,
+ jboolean jstrict_node_history, jboolean jdiscover_changed_paths,
+ jboolean jinclude_merged_revisions,
+ jobject jrevprops, jobject jlog_callback)
+{
+ JNIEntry(SVNReposAccess, getLog);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras,);
+
+ ras->getLog(jpaths, jstartrev, jendrev, jlimit,
+ jstrict_node_history, jdiscover_changed_paths,
+ jinclude_merged_revisions,
+ jrevprops, jlog_callback);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_checkPath(
+ JNIEnv *env, jobject jthis, jstring jpath, jlong jrevision)
+{
+ JNIEntry(SVNReposAccess, checkPath);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->checkPath(jpath, jrevision);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_stat(
+ JNIEnv *env, jobject jthis, jstring jpath, jlong jrevision)
+{
+ JNIEntry(SVNReposAccess, stat);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->stat(jpath, jrevision);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getLocations(
+ JNIEnv *env, jobject jthis, jstring jpath, jlong jpeg_revision,
+ jobject jlocation_revisions)
+{
+ JNIEntry(SVNReposAccess, getLocations);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getLocations(jpath, jpeg_revision, jlocation_revisions);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getLocationSegments(
+ JNIEnv *env, jobject jthis, jstring jpath, jlong jpeg_revision,
+ jlong jstart_revision, jlong jend_revision, jobject jcallback)
+{
+ JNIEntry(SVNReposAccess, getLocationSegments);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, );
+
+ if (jcallback == NULL)
+ JNIUtil::throwNullPointerException("handler");
+ ras->getLocationSegments(jpath, jpeg_revision,
+ jstart_revision, jend_revision,
+ jcallback);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getFileRevisions(
+ JNIEnv *env, jobject jthis, jstring jpath,
+ jlong jstart_revision, jlong jend_revision,
+ jboolean jinclude_merged_revisions, jobject jcallback)
+{
+ JNIEntry(SVNReposAccess, getFileRevisions);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, );
+
+ if (jcallback == NULL)
+ JNIUtil::throwNullPointerException("handler");
+ ras->getFileRevisions(jpath, jstart_revision, jend_revision,
+ jinclude_merged_revisions, jcallback);
+}
+
+// TODO: lock
+// TODO: unlock
+// TODO: getLock
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_getLocks(
+ JNIEnv *env, jobject jthis, jstring jpath, jobject jdepth)
+{
+ JNIEntry(RemoteSession, getLocks);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, NULL);
+
+ return ras->getLocks(jpath, jdepth);
+}
+
+// TODO: replayRange
+// TODO: replay
+// TODO: getDeletedRevision
+// TODO: getInheritedProperties
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_remote_RemoteSession_nativeHasCapability(
+ JNIEnv *env, jobject jthis, jstring jcapability)
+{
+ JNIEntry(RemoteSession, nativeHasCapability);
+ RemoteSession *ras = RemoteSession::getCppObject(jthis);
+ CPPADDR_NULL_PTR(ras, false);
+
+ return ras->hasCapability(jcapability);
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp
new file mode 100644
index 0000000..f5c291b
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.cpp
@@ -0,0 +1,117 @@
+/**
+ * @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 org_apache_subversion_javahl_remote_StateReporter.cpp
+ * @brief Implementation of the native methods in the Java class StateReporter
+ */
+
+#include "../include/org_apache_subversion_javahl_remote_StateReporter.h"
+
+#include <jni.h>
+#include "JNIStackElement.h"
+#include "JNIUtil.h"
+#include "StateReporter.h"
+
+#include "svn_private_config.h"
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_finalize(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(StateReporter, finalize);
+ StateReporter *reporter = StateReporter::getCppObject(jthis);
+ if (reporter != NULL)
+ reporter->finalize();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_nativeDispose(
+ JNIEnv* env, jobject jthis)
+{
+ JNIEntry(StateReporter, nativeCreateInstance);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter,);
+ reporter->dispose(jthis);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_setPath(
+ JNIEnv* env, jobject jthis,
+ jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ JNIEntry(StateReporter, setPath);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter,);
+ reporter->setPath(jpath, jrevision, jdepth, jstart_empty, jlock_token);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_deletePath(
+ JNIEnv* env, jobject jthis, jstring jpath)
+{
+ JNIEntry(StateReporter, deletePath);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter,);
+ reporter->deletePath(jpath);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_linkPath(
+ JNIEnv* env, jobject jthis,
+ jstring jurl, jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ JNIEntry(StateReporter, linkPath);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter,);
+ reporter->linkPath(jurl, jpath, jrevision, jdepth, jstart_empty, jlock_token);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_finishReport(
+ JNIEnv* env, jobject jthis)
+{
+ JNIEntry(StateReporter, finishReport);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter, SVN_INVALID_REVNUM);
+ return reporter->finishReport();
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_abortReport(
+ JNIEnv* env, jobject jthis)
+{
+ JNIEntry(StateReporter, abortReport);
+ StateReporter* reporter = StateReporter::getCppObject(jthis);
+ CPPADDR_NULL_PTR(reporter,);
+ reporter->abortReport();
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_remote_StateReporter_nativeCreateInstance(
+ JNIEnv* env, jclass clazz)
+{
+ jobject jthis = NULL;
+ JNIEntry(StateReporter, nativeCreateInstance);
+ return reinterpret_cast<jlong>(new StateReporter);
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp
new file mode 100644
index 0000000..4c54118
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.cpp
@@ -0,0 +1,58 @@
+/**
+ * @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 org_apache_subversion_javahl_types_RevisionRangeList.cpp
+ * @brief Implementation of the native methods in the Java class
+ * RevisionRangeList.
+ */
+
+
+#include "../include/org_apache_subversion_javahl_types_RevisionRangeList.h"
+#include "JNIStackElement.h"
+#include "RevisionRangeList.h"
+#include "Pool.h"
+
+#include "svn_mergeinfo.h"
+#include "svn_private_config.h"
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_types_RevisionRangeList_remove(
+ JNIEnv* env, jobject jthis, jobject jeraser,
+ jboolean jconsider_inheritance)
+{
+ JNIEntry(RevisionRangeList, remove);
+
+ SVN::Pool request_pool;
+
+ RevisionRangeList rangelist = RevisionRangeList::create(jthis, request_pool);
+ CPPADDR_NULL_PTR(rangelist.get(), NULL);
+
+ RevisionRangeList eraser(jeraser, request_pool);
+ CPPADDR_NULL_PTR(eraser.get(), NULL);
+
+ svn_rangelist_t *output;
+ SVN_JNI_ERR(svn_rangelist_remove(&output, eraser.get(), rangelist.get(),
+ bool(jconsider_inheritance),
+ request_pool.getPool()),
+ NULL);
+ return RevisionRangeList(output).toList();
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp
new file mode 100644
index 0000000..ed43fb7
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.cpp
@@ -0,0 +1,69 @@
+/**
+ * @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 org_apache_subversion_javahl_types_RuntimeVersion.cpp
+ * @brief Implementation of the native methods in the Java class RuntimeVersion.
+ */
+
+#include "../include/org_apache_subversion_javahl_types_RuntimeVersion.h"
+#include "svn_client.h"
+#include "svn_version.h"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_string.hpp"
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_types_RuntimeVersion_getMajor(
+ JNIEnv* jenv, jobject jthis)
+{
+ const svn_version_t* const version = svn_client_version();
+ return jint(version->major);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_types_RuntimeVersion_getMinor(
+ JNIEnv* jenv, jobject jthis)
+{
+ const svn_version_t* const version = svn_client_version();
+ return jint(version->minor);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_types_RuntimeVersion_getPatch(
+ JNIEnv* jenv, jobject jthis)
+{
+ const svn_version_t* const version = svn_client_version();
+ return jint(version->patch);
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_types_RuntimeVersion_getNumberTag(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(RuntimeVersion, getNumberTag)
+ {
+ const svn_version_t* const version = svn_client_version();
+ return Java::String(Java::Env(jenv), version->tag).get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
index 8fd8aee..72d52a3 100644
--- a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.cpp
@@ -28,12 +28,19 @@
#include "JNIStackElement.h"
#include "svn_version.h"
+namespace {
+const svn_version_t* javahl_version()
+{
+ SVN_VERSION_BODY;
+}
+} //anonymous namespace
+
JNIEXPORT jint JNICALL
Java_org_apache_subversion_javahl_types_Version_getMajor(JNIEnv *env,
jobject jthis)
{
JNIEntry(Version, getMajor);
- return SVN_VER_MAJOR;
+ return javahl_version()->major;
}
JNIEXPORT jint JNICALL
@@ -41,7 +48,7 @@ Java_org_apache_subversion_javahl_types_Version_getMinor(JNIEnv *env,
jobject jthis)
{
JNIEntry(Version, getMinor);
- return SVN_VER_MINOR;
+ return javahl_version()->minor;
}
JNIEXPORT jint JNICALL
@@ -49,7 +56,7 @@ Java_org_apache_subversion_javahl_types_Version_getPatch(JNIEnv *env,
jobject jthis)
{
JNIEntry(Version, getPatch);
- return SVN_VER_PATCH;
+ return javahl_version()->patch;
}
JNIEXPORT jstring JNICALL
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp
index e24801a..b1ecd72 100644
--- a/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.cpp
@@ -33,8 +33,24 @@
#include "JNIStackElement.h"
#include <string>
+#include "svn_private_config.h"
+
// VersionExtended native methods
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_VersionExtended_dispose(
+ JNIEnv *env, jobject jthis)
+{
+ JNIEntry(VersionExtended, dispose);
+ VersionExtended *const vx = VersionExtended::getCppObject(jthis);
+ if (vx == NULL)
+ {
+ JNIUtil::throwError(_("bad C++ this"));
+ return;
+ }
+ vx->dispose(jthis);
+}
+
JNIEXPORT jstring JNICALL
Java_org_apache_subversion_javahl_types_VersionExtended_getBuildDate(
JNIEnv *env, jobject jthis)
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp
new file mode 100644
index 0000000..5fa5c89
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp
@@ -0,0 +1,314 @@
+/**
+ * @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 org_apache_subversion_javahl_util_ConfigImpl_Category.cpp
+ * @brief Implementation of the native methods in the Java class
+ * util.ConfigImpl.Category.
+ */
+
+#include <string>
+#include <vector>
+
+#include "../include/org_apache_subversion_javahl_util_ConfigImpl_Category.h"
+#include "JNIUtil.h"
+#include "JNIStackElement.h"
+#include "JNIStringHolder.h"
+#include "OperationContext.h"
+#include "CreateJ.h"
+#include "EnumMapper.h"
+
+#include "svn_config.h"
+#include "svn_hash.h"
+#include "svn_private_config.h"
+
+namespace {
+struct ImplContext
+{
+ ImplContext(JNIEnv* env, jobject jthis,
+ jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption) : m_config(NULL)
+ {
+ OperationContext* const context(
+ reinterpret_cast<OperationContext*>(jcontext));
+ CPPADDR_NULL_PTR(context,);
+
+ JNIStringHolder category(jcategory);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ if (category.c_str())
+ {
+ apr_hash_t* cfgdata = context->getConfigData();
+ if (cfgdata)
+ m_config = static_cast<svn_config_t*>(
+ svn_hash_gets(cfgdata, category.c_str()));
+ else
+ JNIUtil::throwNullPointerException("getConfigData");
+ }
+ if (!m_config)
+ JNIUtil::throwNullPointerException("category");
+
+ JNIStringHolder section(jsection);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ if (section.c_str())
+ m_section = section.c_str();
+
+ JNIStringHolder option(joption);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ if (option.c_str())
+ m_option = option.c_str();
+ }
+
+ svn_config_t* m_config;
+ std::string m_section;
+ std::string m_option;
+};
+} // anonymous namespace
+
+
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_get_1str(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jstring jdefault_value)
+{
+ JNIEntry(ConfigImpl$Category, get_str);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ JNIStringHolder default_value(jdefault_value);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ const char* value;
+ svn_config_get(ctx.m_config, &value,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ default_value.c_str());
+ return JNIUtil::makeJString(value);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_get_1bool(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jboolean jdefault_value)
+{
+ JNIEntry(ConfigImpl$Category, get_bool);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ svn_boolean_t value;
+ SVN_JNI_ERR(svn_config_get_bool(ctx.m_config, &value,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ bool(jdefault_value)),
+ jdefault_value);
+ return jboolean(value);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_get_1long(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jlong jdefault_value)
+{
+ JNIEntry(ConfigImpl$Category, get_long);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ apr_int64_t value;
+ SVN_JNI_ERR(svn_config_get_int64(ctx.m_config, &value,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ apr_int64_t(jdefault_value)),
+ jdefault_value);
+ return jlong(value);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_get_1tri(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption,
+ jstring junknown, jobject jdefault_value)
+{
+ JNIEntry(ConfigImpl$Category, get_tri);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ JNIStringHolder unknown(junknown);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ svn_tristate_t value;
+ SVN_JNI_ERR(svn_config_get_tristate(ctx.m_config, &value,
+ ctx.m_section.c_str(),
+ ctx.m_option.c_str(),
+ unknown.c_str(),
+ EnumMapper::toTristate(jdefault_value)),
+ NULL);
+ return EnumMapper::mapTristate(value);
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_get_1yna(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jstring jdefault_value)
+{
+ JNIEntry(ConfigImpl$Category, get_yna);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ JNIStringHolder default_value(jdefault_value);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ const char* value;
+ SVN_JNI_ERR(svn_config_get_yes_no_ask(
+ ctx.m_config, &value,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ default_value.c_str()),
+ NULL);
+ return JNIUtil::makeJString(value);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_set_1str(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jstring jvalue)
+{
+ JNIEntry(ConfigImpl$Category, set_str);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ JNIStringHolder value(jvalue);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ svn_config_set(ctx.m_config,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ value.c_str());
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_set_1bool(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jboolean jvalue)
+{
+ JNIEntry(ConfigImpl$Category, set_bool);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ svn_config_set_bool(ctx.m_config,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ bool(jvalue));
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_set_1long(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jstring joption, jlong jvalue)
+{
+ JNIEntry(ConfigImpl$Category, set_long);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, joption);
+
+ svn_config_set_int64(ctx.m_config,
+ ctx.m_section.c_str(), ctx.m_option.c_str(),
+ apr_int64_t(jvalue));
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_sections(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext)
+{
+ JNIEntry(ConfigImpl$Category, sections);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, NULL, NULL);
+
+ struct enumerator_t
+ {
+ static svn_boolean_t process(const char* name, void* baton,
+ apr_pool_t *pool)
+ {
+ jstring jname = JNIUtil::makeJString(name);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ static_cast<enumerator_t*>(baton)
+ ->m_sections.push_back(jobject(jname));
+ return true;
+ }
+ std::vector<jobject> m_sections;
+ } enumerator;
+
+ SVN::Pool requestPool;
+ svn_config_enumerate_sections2(ctx.m_config, enumerator.process, &enumerator,
+ requestPool.getPool());
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+ return CreateJ::Set(enumerator.m_sections);
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigImpl_00024Category_enumerate(
+ JNIEnv* env, jobject jthis, jstring jcategory, jlong jcontext,
+ jstring jsection, jobject jhandler)
+{
+ JNIEntry(ConfigImpl$Category, sections);
+ const ImplContext ctx(env, jthis, jcategory, jcontext, jsection, NULL);
+
+ struct enumerator_t
+ {
+ static svn_boolean_t process(const char* name, const char* value,
+ void* baton, apr_pool_t *pool)
+ {
+ enumerator_t* enmr = static_cast<enumerator_t*>(baton);
+ JNIEnv* const e = enmr->m_env;
+ const jobject jh = enmr->m_jhandler;;
+
+ static jmethodID mid = 0;
+ if (0 == mid)
+ {
+ jclass cls = e->FindClass(JAVAHL_CLASS("/ISVNConfig$Enumerator"));
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ mid = e->GetMethodID(cls, "option",
+ "(Ljava/lang/String;Ljava/lang/String;)V");
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ }
+
+ jstring jname = JNIUtil::makeJString(name);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ jstring jvalue = JNIUtil::makeJString(value);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ e->CallVoidMethod(jh, mid, jname, jvalue);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ e->DeleteLocalRef(jname);
+ e->DeleteLocalRef(jvalue);
+ return true;
+ }
+
+ JNIEnv* m_env;
+ jobject m_jhandler;
+ } enumerator;
+
+ enumerator.m_env = env;
+ enumerator.m_jhandler = jhandler;
+
+ SVN::Pool requestPool;
+ svn_config_enumerate2(ctx.m_config, ctx.m_section.c_str(),
+ enumerator.process, &enumerator,
+ requestPool.getPool());
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
new file mode 100644
index 0000000..0630098
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.cpp
@@ -0,0 +1,492 @@
+/**
+ * @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 org_apache_subversion_javahl_util_ConfigLib.cpp
+ * @brief Implementation of the native methods in the Java class ConfigLib
+ */
+
+#include "../include/org_apache_subversion_javahl_util_ConfigLib.h"
+
+#include <apr_fnmatch.h>
+#include <apr_strings.h>
+
+#include "jniwrapper/jni_list.hpp"
+#include "jniwrapper/jni_stack.hpp"
+
+#include "AuthnCallback.hpp"
+#include "Credential.hpp"
+#include "SubversionException.hpp"
+
+#include "GlobalConfig.h"
+#include "JNIUtil.h"
+#include "JNICriticalSection.h"
+
+#include "svn_auth.h"
+#include "svn_base64.h"
+#include "svn_config.h"
+#include "svn_hash.h"
+#include "svn_x509.h"
+
+#include "svn_private_config.h"
+
+namespace {
+bool g_ignore_native_credentials = false;
+} // anonymous namespace
+
+bool GlobalConfig::useNativeCredentialsStore()
+{
+ JNICriticalSection lock(*JNIUtil::g_configMutex);
+ return !g_ignore_native_credentials;
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_enableNativeCredentialsStore(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, enableNativeCredentialsStore)
+ {
+ JNICriticalSection lock(*JNIUtil::g_configMutex);
+ g_ignore_native_credentials = false;
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_disableNativeCredentialsStore(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, disableNativeCredentialsStore)
+ {
+ JNICriticalSection lock(*JNIUtil::g_configMutex);
+ g_ignore_native_credentials = true;
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_isNativeCredentialsStoreEnabled(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, isNativeCredentialsStoreEnabled)
+ {
+ return jboolean(GlobalConfig::useNativeCredentialsStore());
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return JNI_FALSE;
+}
+
+
+namespace {
+jobject build_credential(Java::Env env, apr_hash_t* cred,
+ const char* cred_kind, const char* realm,
+ apr_pool_t* scratch_pool)
+{
+ svn_string_t* entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_REALMSTRING_KEY));
+ if (!entry || !realm || 0 != strcmp(realm, entry->data))
+ {
+ JavaHL::SubversionException(env).throw_java_exception(
+ apr_psprintf(scratch_pool,
+ "Unexpected realm; got: [%s], expected: [%s]",
+ (entry ? entry->data : "(null)"),
+ (realm ? realm : "(null)")));
+ }
+
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_PASSTYPE_KEY));
+
+ const char* store = (entry ? entry->data : NULL);
+ const char* username = NULL;
+ const char* password = NULL;
+ jobject info = NULL;
+ jobject failures = NULL;
+ const char* passphrase = NULL;
+
+ if (0 == strcmp(cred_kind, SVN_AUTH_CRED_USERNAME))
+ {
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_USERNAME_KEY));
+ if (entry)
+ username = entry->data;
+ }
+ else if (0 == strcmp(cred_kind, SVN_AUTH_CRED_SIMPLE))
+ {
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_USERNAME_KEY));
+ if (entry)
+ username = entry->data;
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_PASSWORD_KEY));
+ if (entry)
+ password = entry->data;
+ }
+ else if (0 == strcmp(cred_kind, SVN_AUTH_CRED_SSL_SERVER_TRUST))
+ {
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_ASCII_CERT_KEY));
+ const char* ascii_cert = (entry ? entry->data : NULL);
+
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_FAILURES_KEY));
+ jint failflags = (!entry ? 0 : jint(apr_atoi64(entry->data)));
+
+ info = JavaHL::AuthnCallback::SSLServerCertInfo(env, ascii_cert).get();
+ failures = JavaHL::AuthnCallback
+ ::SSLServerCertFailures(env, failflags).get();
+ }
+ else if (0 == strcmp(cred_kind, SVN_AUTH_CRED_SSL_CLIENT_CERT_PW))
+ {
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cred, SVN_CONFIG_AUTHN_PASSPHRASE_KEY));
+ if (entry)
+ passphrase = entry->data;
+ }
+ else
+ {
+ JavaHL::SubversionException(env).throw_java_exception(
+ apr_psprintf(scratch_pool,
+ "Invalid credential type: [%s]",
+ cred_kind));
+ }
+
+ return JavaHL::Credential(
+ env,
+ JavaHL::Credential::Kind(env, Java::String(env, cred_kind)).get(),
+ Java::String(env, realm), Java::String(env, store),
+ Java::String(env, username), Java::String(env, password),
+ info, failures, Java::String(env, passphrase)).get();
+}
+
+class WalkCredentialsCallback
+{
+public:
+ static svn_error_t* walk_func(svn_boolean_t *delete_cred,
+ void *walk_baton,
+ const char *cred_kind,
+ const char *realmstring,
+ apr_hash_t *cred,
+ apr_pool_t *scratch_pool)
+ {
+ WalkCredentialsCallback& self =
+ *static_cast<WalkCredentialsCallback*>(walk_baton);
+ return self(delete_cred, cred_kind, realmstring, cred, scratch_pool);
+ }
+
+ virtual svn_error_t* operator()(svn_boolean_t *delete_cred,
+ const char *cred_kind,
+ const char *realmstring,
+ apr_hash_t *cred_hash,
+ apr_pool_t *scratch_pool) = 0;
+};
+
+class SimpleSearchCallback : public WalkCredentialsCallback
+{
+ const ::Java::Env m_env;
+ const char* const m_cred_kind;
+ const char* const m_realm;
+ const bool m_delete_when_found;
+ jobject m_credential;
+
+public:
+ explicit SimpleSearchCallback(::Java::Env env,
+ const char* cred_kind, const char* realm,
+ bool delete_when_found)
+ : m_env(env),
+ m_cred_kind(cred_kind),
+ m_realm(realm),
+ m_delete_when_found(delete_when_found),
+ m_credential(NULL)
+ {}
+
+ jobject credential() const { return m_credential; }
+
+ virtual svn_error_t* operator()(svn_boolean_t *delete_cred,
+ const char *cred_kind,
+ const char *realmstring,
+ apr_hash_t *cred_hash,
+ apr_pool_t *scratch_pool)
+ {
+ if (0 == strcmp(cred_kind, m_cred_kind)
+ && 0 == strcmp(realmstring, m_realm))
+ {
+ m_credential = build_credential(m_env, cred_hash,
+ cred_kind, realmstring,
+ scratch_pool);
+ *delete_cred = m_delete_when_found;
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, "");
+ }
+
+ *delete_cred = false;
+ return SVN_NO_ERROR;
+ }
+};
+} // anonymous namespace
+
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_nativeGetCredential(
+ JNIEnv* jenv, jobject jthis,
+ jstring jconfig_dir, jstring jcred_kind, jstring jrealm)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, nativeGetCredential)
+ {
+ if (!GlobalConfig::useNativeCredentialsStore())
+ return NULL;
+
+ const Java::Env env(jenv);
+ const Java::String config_dir(env, jconfig_dir);
+ const Java::String cred_kind(env, jcred_kind);
+ const Java::String realm(env, jrealm);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ SimpleSearchCallback cb(env,
+ cred_kind.strdup(pool.getPool()),
+ realm.strdup(pool.getPool()),
+ false);
+
+ SVN_JAVAHL_CHECK(env,
+ svn_config_walk_auth_data(
+ Java::String::Contents(config_dir).c_str(),
+ cb.walk_func, &cb, pool.getPool()));
+ return cb.credential();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_nativeRemoveCredential(
+ JNIEnv* jenv, jobject jthis,
+ jstring jconfig_dir, jstring jcred_kind, jstring jrealm)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, nativeRemoveCredential)
+ {
+ if (!GlobalConfig::useNativeCredentialsStore())
+ return NULL;
+
+ const Java::Env env(jenv);
+ const Java::String config_dir(env, jconfig_dir);
+ const Java::String cred_kind(env, jcred_kind);
+ const Java::String realm(env, jrealm);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ SimpleSearchCallback cb(env,
+ cred_kind.strdup(pool.getPool()),
+ realm.strdup(pool.getPool()),
+ true);
+
+ SVN_JAVAHL_CHECK(env,
+ svn_config_walk_auth_data(
+ Java::String::Contents(config_dir).c_str(),
+ cb.walk_func, &cb, pool.getPool()));
+ return cb.credential();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_ConfigLib_nativeSearchCredentials(
+ JNIEnv* jenv, jobject jthis,
+ jstring jconfig_dir, jstring jcred_kind,
+ jstring jrealm_pattern, jstring jusername_pattern,
+ jstring jhostname_pattern, jstring jtext_pattern)
+{
+ SVN_JAVAHL_JNI_TRY(ConfigLib, iterateCredentials)
+ {
+ if (!GlobalConfig::useNativeCredentialsStore())
+ return NULL;
+
+ const Java::Env env(jenv);
+ const Java::String config_dir(env, jconfig_dir);
+ const Java::String cred_kind(env, jcred_kind);
+ const Java::String realm_pattern(env, jrealm_pattern);
+ const Java::String username_pattern(env, jusername_pattern);
+ const Java::String hostname_pattern(env, jhostname_pattern);
+ const Java::String text_pattern(env, jtext_pattern);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ class Callback : public WalkCredentialsCallback
+ {
+ const char* const m_cred_kind;
+ const char* const m_realm_pattern;
+ const char* const m_username_pattern;
+ const char* const m_hostname_pattern;
+ const char* const m_text_pattern;
+
+ const ::Java::Env m_env;
+ ::Java::List<JavaHL::Credential> m_credentials;
+
+ bool match_array(const char* pattern,
+ const apr_array_header_t* hostnames)
+ {
+ for (int i = 0; i < hostnames->nelts; ++i)
+ {
+ const char* const hostname =
+ APR_ARRAY_IDX(hostnames, i, const char*);
+ if (!apr_fnmatch(pattern, hostname, 0))
+ return true;
+ }
+ return false;
+ }
+
+ public:
+ explicit Callback(::Java::Env ctor_env,
+ const char* ctor_cred_kind,
+ const char* ctor_realm_pattern,
+ const char* ctor_username_pattern,
+ const char* ctor_hostname_pattern,
+ const char* ctor_text_pattern)
+ : m_cred_kind(ctor_cred_kind),
+ m_realm_pattern(ctor_realm_pattern),
+ m_username_pattern(ctor_username_pattern),
+ m_hostname_pattern(ctor_hostname_pattern),
+ m_text_pattern(ctor_text_pattern),
+ m_env(ctor_env),
+ m_credentials(ctor_env)
+ {}
+
+ jobject credentials() const
+ {
+ if (m_credentials.is_empty())
+ return NULL;
+ return m_credentials.get();
+ }
+
+ virtual svn_error_t* operator()(svn_boolean_t *delete_cred,
+ const char *cb_cred_kind,
+ const char *cb_realmstring,
+ apr_hash_t *cb_cred_hash,
+ apr_pool_t *cb_scratch_pool)
+ {
+ *delete_cred = false;
+ if (m_cred_kind && 0 != strcmp(cb_cred_kind, m_cred_kind))
+ return SVN_NO_ERROR;
+
+ svn_string_t* entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_USERNAME_KEY));
+ const char* const username = (entry ? entry->data : NULL);
+
+ entry = static_cast<svn_string_t*>(
+ svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_PASSTYPE_KEY));
+ const char* const store = (entry ? entry->data : NULL);
+
+ const svn_string_t* ascii_cert = static_cast<svn_string_t*>(
+ svn_hash_gets(cb_cred_hash, SVN_CONFIG_AUTHN_ASCII_CERT_KEY));
+
+ /* Parsed certificate data. */
+ const char* subject = NULL;
+ const char* issuer = NULL;
+ const char* fingerprint = NULL;
+ const apr_array_header_t* hostnames = NULL;
+
+ if (ascii_cert)
+ {
+ const svn_string_t* const der =
+ svn_base64_decode_string(ascii_cert, cb_scratch_pool);
+ svn_x509_certinfo_t* certinfo;
+ svn_error_t* err = svn_x509_parse_cert(
+ &certinfo, der->data, der->len,
+ cb_scratch_pool, cb_scratch_pool);
+ if (err)
+ {
+ // Ignore credentials that can't be parsed.
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ subject = svn_x509_certinfo_get_subject(
+ certinfo, cb_scratch_pool);
+ issuer = svn_x509_certinfo_get_issuer(
+ certinfo, cb_scratch_pool);
+ fingerprint = svn_checksum_to_cstring_display(
+ svn_x509_certinfo_get_digest(certinfo),
+ cb_scratch_pool);
+ hostnames = svn_x509_certinfo_get_hostnames(certinfo);
+ }
+ }
+
+ bool match = (m_realm_pattern
+ && !apr_fnmatch(m_realm_pattern, cb_realmstring, 0));
+
+ if (!match && m_username_pattern)
+ match = (match
+ || (username
+ && !apr_fnmatch(m_username_pattern, username, 0)));
+
+ if (!match && m_hostname_pattern)
+ match = (match
+ || (hostnames
+ && match_array(m_hostname_pattern, hostnames)));
+
+ if (!match && m_text_pattern)
+ match = (match
+ || (username
+ && !apr_fnmatch(m_text_pattern, username, 0))
+ || (store
+ && !apr_fnmatch(m_text_pattern, store, 0))
+ || (subject
+ && !apr_fnmatch(m_text_pattern, subject, 0))
+ || (issuer
+ && !apr_fnmatch(m_text_pattern, issuer, 0))
+ || (fingerprint
+ && !apr_fnmatch(m_text_pattern, fingerprint, 0))
+ || (hostnames
+ && match_array(m_text_pattern, hostnames)));
+
+ if (match)
+ m_credentials.add(
+ ::JavaHL::Credential(m_env,
+ build_credential(m_env,
+ cb_cred_hash,
+ cb_cred_kind,
+ cb_realmstring,
+ cb_scratch_pool)));
+
+ return SVN_NO_ERROR;
+ }
+ } cb(env,
+ cred_kind.strdup(pool.getPool()),
+ realm_pattern.strdup(pool.getPool()),
+ username_pattern.strdup(pool.getPool()),
+ hostname_pattern.strdup(pool.getPool()),
+ text_pattern.strdup(pool.getPool()));
+
+ SVN_JAVAHL_CHECK(env,
+ svn_config_walk_auth_data(
+ Java::String::Contents(config_dir).c_str(),
+ cb.walk_func, &cb, pool.getPool()));
+ return cb.credentials();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp
new file mode 100644
index 0000000..c6d3d6e
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp
@@ -0,0 +1,206 @@
+/**
+ * @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 org_apache_subversion_javahl_util_DiffLib.cpp
+ * @brief Implementation of the native methods in the Java class DiffLib
+ */
+
+#include "../include/org_apache_subversion_javahl_util_DiffLib.h"
+
+#include "JNIStackElement.h"
+#include "JNIStringHolder.h"
+#include "JNIUtil.h"
+#include "OutputStream.h"
+#include "Path.h"
+#include "Pool.h"
+
+#include "svn_diff.h"
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_util_DiffLib_nativeFileDiff(
+ JNIEnv* env, jobject jthis,
+ jstring joriginal_file,
+ jstring jmodified_file,
+
+ jint jignore_space_ordinal,
+ jboolean jignore_eol_style,
+ jboolean jshow_c_function,
+ jint jcontext_size,
+
+ jstring joriginal_header,
+ jstring jmodified_header,
+ jstring jheader_encoding,
+ jstring jrelative_to_dir,
+
+ jobject jresult_stream)
+{
+ JNIEntry(DiffLib, nativeFileDiff);
+
+ // Using a "global" request pool since we don't keep a context with
+ // its own pool around for these functions.
+ SVN::Pool pool;
+
+ Path original(joriginal_file, pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ SVN_JNI_ERR(original.error_occurred(), false);
+
+ Path modified(jmodified_file, pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ SVN_JNI_ERR(modified.error_occurred(), false);
+
+ svn_diff_t* diff;
+ svn_diff_file_options_t* diff_options =
+ svn_diff_file_options_create(pool.getPool());
+ diff_options->ignore_space =
+ svn_diff_file_ignore_space_t(jignore_space_ordinal);
+ diff_options->ignore_eol_style = svn_boolean_t(jignore_eol_style);
+ diff_options->show_c_function = svn_boolean_t(jshow_c_function);
+ SVN_JNI_ERR(svn_diff_file_diff_2(&diff,
+ original.c_str(),
+ modified.c_str(),
+ diff_options,
+ pool.getPool()),
+ false);
+
+ const jboolean diffs = svn_diff_contains_diffs(diff);
+
+ JNIStringHolder original_header(joriginal_header);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder modified_header(jmodified_header);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder header_encoding(jheader_encoding);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder relative_to_dir(jrelative_to_dir);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ OutputStream result_stream(jresult_stream);
+
+ SVN_JNI_ERR(svn_diff_file_output_unified4(
+ result_stream.getStream(pool), diff,
+ original.c_str(), modified.c_str(),
+ original_header.c_str(), modified_header.c_str(),
+ header_encoding.c_str(), relative_to_dir.c_str(),
+ diff_options->show_c_function, int(jcontext_size),
+ NULL, NULL, pool.getPool()),
+ false);
+
+ return diffs;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_apache_subversion_javahl_util_DiffLib_nativeFileMerge(
+ JNIEnv* env, jobject jthis,
+ jstring joriginal_file,
+ jstring jmodified_file,
+ jstring jlatest_file,
+
+ jint jignore_space_ordinal,
+ jboolean jignore_eol_style,
+ jboolean jshow_c_function,
+
+ jstring jconflict_original,
+ jstring jconflict_modified,
+ jstring jconflict_latest,
+ jstring jconflict_separator,
+ jint jconflict_style_ordinal,
+
+ jobject jresult_stream)
+{
+ JNIEntry(DiffLib, nativeFileMerge);
+
+ // Using a "global" request pool since we don't keep a context with
+ // its own pool around for these functions.
+ SVN::Pool pool;
+
+ Path original(joriginal_file, pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ SVN_JNI_ERR(original.error_occurred(), false);
+
+ Path modified(jmodified_file, pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ SVN_JNI_ERR(modified.error_occurred(), false);
+
+ Path latest(jlatest_file, pool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+ SVN_JNI_ERR(latest.error_occurred(), false);
+
+ svn_diff_t* diff;
+ svn_diff_file_options_t* diff_options =
+ svn_diff_file_options_create(pool.getPool());
+ diff_options->ignore_space =
+ svn_diff_file_ignore_space_t(jignore_space_ordinal);
+ diff_options->ignore_eol_style = svn_boolean_t(jignore_eol_style);
+ diff_options->show_c_function = svn_boolean_t(jshow_c_function);
+ SVN_JNI_ERR(svn_diff_file_diff3_2(&diff,
+ original.c_str(),
+ modified.c_str(),
+ latest.c_str(),
+ diff_options,
+ pool.getPool()),
+ false);
+
+ const jboolean conflicts = svn_diff_contains_conflicts(diff);
+
+ JNIStringHolder conflict_original(jconflict_original);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder conflict_modified(jconflict_modified);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder conflict_latest(jconflict_latest);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ JNIStringHolder conflict_separator(jconflict_separator);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
+ OutputStream result_stream(jresult_stream);
+
+ SVN_JNI_ERR(svn_diff_file_output_merge3(
+ result_stream.getStream(pool), diff,
+ original.c_str(), modified.c_str(), latest.c_str(),
+ conflict_original.c_str(),
+ conflict_modified.c_str(),
+ conflict_latest.c_str(),
+ conflict_separator.c_str(),
+ svn_diff_conflict_display_style_t(jconflict_style_ordinal),
+ NULL, NULL,
+ pool.getPool()),
+ false);
+
+ return conflicts;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
new file mode 100644
index 0000000..3456dea
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
@@ -0,0 +1,381 @@
+/**
+ * @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 org_apache_subversion_javahl_util_PropLib.cpp
+ * @brief Implementation of the native methods in the Java class PropLib
+ */
+
+#include <iostream>
+#include <sstream>
+
+#include "../include/org_apache_subversion_javahl_util_PropLib.h"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_array.hpp"
+#include "jniwrapper/jni_list.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_io_stream.hpp"
+#include "ExternalItem.hpp"
+#include "SubversionException.hpp"
+
+#include "EnumMapper.h"
+#include "Pool.h"
+
+#include "svn_props.h"
+#include "svn_time.h"
+#include "svn_wc.h"
+
+#include "private/svn_wc_private.h"
+#include "svn_private_config.h"
+
+
+namespace {
+class PropGetter
+{
+public:
+ PropGetter(const char* mime_type, svn_stream_t* contents)
+ : m_mime_type(mime_type),
+ m_contents(contents)
+ {}
+
+ static svn_error_t* callback(const svn_string_t** mime_type,
+ svn_stream_t* stream, void* baton,
+ apr_pool_t* pool)
+ {
+ PropGetter* self = static_cast<PropGetter*>(baton);
+ if (mime_type)
+ {
+ if (self->m_mime_type)
+ *mime_type = svn_string_create(self->m_mime_type, pool);
+ else
+ *mime_type = svn_string_create_empty(pool);
+ }
+
+ if (stream && self->m_contents)
+ {
+ SVN_ERR(svn_stream_copy3(self->m_contents,
+ svn_stream_disown(stream, pool),
+ NULL, NULL, pool));
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+private:
+ const char* m_mime_type;
+ svn_stream_t* m_contents;
+};
+
+struct FormatRevision
+{
+ explicit FormatRevision(const svn_opt_revision_t* const& revarg,
+ const SVN::Pool& poolarg)
+ : rev(revarg), pool(poolarg)
+ {}
+
+ const svn_opt_revision_t* const& rev;
+ const SVN::Pool& pool;
+};
+
+std::ostream& operator<<(std::ostream& os, const FormatRevision& pr)
+{
+ switch (pr.rev->kind)
+ {
+ case svn_opt_revision_number:
+ os << pr.rev->value.number;
+ break;
+ case svn_opt_revision_date:
+ os << '{'
+ << svn_time_to_cstring(pr.rev->value.date, pr.pool.getPool())
+ << '}';
+ break;
+ default:
+ throw std::logic_error(
+ _("Invalid revision tag; must be a number or a date"));
+ }
+ return os;
+}
+
+bool operator==(const svn_opt_revision_t& a,
+ const svn_opt_revision_t& b)
+{
+ if (a.kind != b.kind)
+ return false;
+ if (a.kind == svn_opt_revision_number
+ && a.value.number != b.value.number)
+ return false;
+ if (a.kind == svn_opt_revision_date
+ && a.value.date != b.value.date)
+ return false;
+ return true;
+}
+
+inline bool operator!=(const svn_opt_revision_t& a,
+ const svn_opt_revision_t& b)
+{
+ return !(a == b);
+}
+
+class UnparseFunctor
+{
+public:
+ explicit UnparseFunctor(std::ostringstream& buffer, bool old_format,
+ SVN::Pool& iterpool)
+ : m_buffer(buffer),
+ m_old_format(old_format),
+ m_iterpool(iterpool)
+ {}
+
+ void operator()(const JavaHL::ExternalItem& item)
+ {
+ m_iterpool.clear();
+
+ const Java::Env env(item.get_env());
+ const Java::LocalFrame frame(env);
+
+ if (!m_old_format)
+ {
+ if (item.revision()->kind != svn_opt_revision_head
+ && *item.revision() != *item.peg_revision())
+ {
+ m_buffer << "-r"
+ << FormatRevision(item.revision(), m_iterpool)
+ << ' ';
+ }
+ if (item.peg_revision()->kind == svn_opt_revision_head)
+ m_buffer << item.url() << ' ';
+ else
+ {
+ m_buffer << item.url() << '@'
+ << FormatRevision(item.peg_revision(), m_iterpool)
+ << ' ';
+ }
+ m_buffer << item.target_dir() << '\n';
+ }
+ else
+ {
+ // Sanity check: old format does not support peg revisions
+ if (item.peg_revision()->kind != svn_opt_revision_head
+ && *item.revision() != *item.peg_revision())
+ {
+ JavaHL::SubversionException(env)
+ .raise(_("Clients older than Subversion 1.5"
+ " do not support peg revision syntax"
+ " in the svn:externals property"));
+ }
+
+ // Sanity check: old format does not support relative URLs
+ const std::string url = item.url();
+ if ( (url.size() >= 1 && (url[0] == '.' || url[0] == '/'))
+ || (url.size() >= 2 && (url[0] == '^' && url[1] == '/')))
+ {
+ JavaHL::SubversionException(env)
+ .raise(_("Clients older than Subversion 1.5"
+ " do not support relative URLs"
+ " in the svn:externals property"));
+ }
+
+ m_buffer << item.target_dir() << ' ';
+ if (item.revision()->kind != svn_opt_revision_head)
+ {
+ m_buffer << "-r"
+ << FormatRevision(item.revision(), m_iterpool)
+ << ' ';
+ }
+ m_buffer << url << '\n';
+ }
+ }
+
+private:
+ std::ostringstream& m_buffer;
+ const bool m_old_format;
+ SVN::Pool& m_iterpool;
+};
+} // anoymous namespace
+
+
+JNIEXPORT jbyteArray JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_checkNodeProp(
+ JNIEnv* jenv, jobject jthis,
+ jstring jname, jbyteArray jvalue, jstring jpath, jobject jkind,
+ jstring jmime_type, jobject jfile_contents,
+ jboolean jskip_some_checks)
+{
+ SVN_JAVAHL_JNI_TRY(PropLib, checkLocalProp)
+ {
+ const Java::Env env(jenv);
+
+ const svn_node_kind_t kind = EnumMapper::toNodeKind(jkind);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ const Java::String name_str(env, jname);
+ const Java::ByteArray value(env, jvalue);
+ const Java::String path_str(env, jpath);
+ const Java::String mime_type_str(env, jmime_type);
+ Java::InputStream file_contents(env, jfile_contents);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ const Java::String::Contents name(name_str);
+ const Java::String::Contents path(path_str);
+ const Java::String::Contents mime_type(mime_type_str);
+ PropGetter getter(mime_type.c_str(), file_contents.get_stream(pool));
+
+ const svn_string_t* canonval;
+ SVN_JAVAHL_CHECK(env,
+ svn_wc_canonicalize_svn_prop(
+ &canonval, name.c_str(),
+ Java::ByteArray::Contents(value).get_string(pool),
+ path.c_str(), kind,
+ svn_boolean_t(jskip_some_checks),
+ PropGetter::callback, &getter,
+ pool.getPool()));
+ return Java::ByteArray(env, canonval->data, jint(canonval->len)).get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_parseExternals(
+ JNIEnv* jenv, jobject jthis,
+ jbyteArray jdescription, jstring jparent_dir, jboolean jcanonicalize_url)
+{
+ SVN_JAVAHL_JNI_TRY(PropLib, parseExternals)
+ {
+ const Java::Env env(jenv);
+
+ const Java::ByteArray description(env, jdescription);
+ const Java::String parent_dir(env, jparent_dir);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ apr_array_header_t* externals;
+ {
+ // There is no guarantee that the description contents are
+ // null-terminated. Copy them to an svn_string_t to make sure
+ // that they are.
+ svn_string_t* const description_contents =
+ Java::ByteArray::Contents(description).get_string(pool);
+
+ SVN_JAVAHL_CHECK(env,
+ svn_wc_parse_externals_description3(
+ &externals,
+ Java::String::Contents(parent_dir).c_str(),
+ description_contents->data,
+ svn_boolean_t(jcanonicalize_url),
+ pool.getPool()));
+ }
+
+ Java::List<JavaHL::ExternalItem> items(env, externals->nelts);
+ for (jint i = 0; i < externals->nelts; ++i)
+ {
+ // References to the newly created external items are stored
+ // in the list, so make sure the local reference in this
+ // frame get cleared on each iteration.
+ Java::LocalFrame frame;
+
+ const svn_wc_external_item2_t* const item =
+ APR_ARRAY_IDX(externals, i, svn_wc_external_item2_t*);
+ items.add(JavaHL::ExternalItem(env,
+ item->target_dir,
+ item->url,
+ &item->revision,
+ &item->peg_revision));
+ }
+ return items.get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+
+JNIEXPORT jbyteArray JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_unparseExternals(
+ JNIEnv* jenv, jobject jthis,
+ jobject jitems, jstring jparent_dir, jboolean jold_format)
+{
+ SVN_JAVAHL_JNI_TRY(PropLib, unparseExternals)
+ {
+ const Java::Env env(jenv);
+
+ const Java::ImmutableList<JavaHL::ExternalItem> items(env, jitems);
+ const Java::String parent_dir(env, jparent_dir);
+
+ // Using a "global" iteration pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool iterpool;
+
+ std::ostringstream buffer;
+ items.for_each(UnparseFunctor(buffer, jold_format, iterpool));
+ const std::string description(buffer.str());
+
+ // Validate the result. Even though we generated the string
+ // ourselves, we did not validate the input paths and URLs.
+ SVN_JAVAHL_CHECK(env,
+ svn_wc_parse_externals_description3(
+ NULL,
+ Java::String::Contents(parent_dir).c_str(),
+ description.c_str(),
+ false, iterpool.getPool()));
+ return Java::ByteArray(env, description).get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_resolveExternalsUrl(
+ JNIEnv* jenv, jobject jthis,
+ jobject jitem, jstring jrepos_root_url, jstring jparent_dir_url)
+{
+ SVN_JAVAHL_JNI_TRY(PropLib, unparseExternals)
+ {
+ const Java::Env env(jenv);
+
+ const Java::String repos_root_url(env, jrepos_root_url);
+ const Java::String parent_dir_url(env, jparent_dir_url);
+ const JavaHL::ExternalItem item(env, jitem);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ const char* resolved_url;
+ SVN_JAVAHL_CHECK(env,
+ svn_wc__resolve_relative_external_url(
+ &resolved_url,
+ item.get_external_item(pool),
+ Java::String::Contents(repos_root_url).c_str(),
+ Java::String::Contents(parent_dir_url).c_str(),
+ pool.getPool(), pool.getPool()));
+ return Java::String(env, resolved_url).get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
new file mode 100644
index 0000000..ce507e5
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp
@@ -0,0 +1,219 @@
+/**
+ * @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 org_apache_subversion_javahl_util_SubstLib.cpp
+ * @brief Implementation of the native methods in the Java class SubstLib
+ */
+
+#include <memory>
+
+#include "../include/org_apache_subversion_javahl_util_SubstLib.h"
+
+#include "jniwrapper/jni_stack.hpp"
+#include "jniwrapper/jni_array.hpp"
+#include "jniwrapper/jni_string.hpp"
+#include "jniwrapper/jni_string_map.hpp"
+#include "jniwrapper/jni_io_stream.hpp"
+
+#include "JNIUtil.h"
+#include "NativeStream.hpp"
+#include "Utility.hpp"
+
+#include <apr_hash.h>
+
+#include "svn_subst.h"
+
+#include "svn_private_config.h"
+
+
+namespace {
+apr_hash_t*
+build_keywords_common(Java::Env env, const SVN::Pool& pool,
+ jbyteArray jkeywords_value, jlong jrevision,
+ jstring jurl, jstring jrepos_root_url,
+ jobject jdate, jstring jauthor)
+{
+ const Java::ByteArray keywords_value(env, jkeywords_value);
+ const Java::String url(env, jurl);
+ const Java::String repos_root_url(env, jrepos_root_url);
+ const Java::String author(env, jauthor);
+
+ const Java::ByteArray::Contents keywords_contents(keywords_value);
+ svn_string_t* keywords_string = keywords_contents.get_string(pool);
+ const char* revision = (jrevision < 0 ? NULL
+ : apr_psprintf(pool.getPool(),
+ "%" APR_UINT64_T_FMT,
+ apr_uint64_t(jrevision)));
+ const Java::String::Contents url_contents(url);
+ const Java::String::Contents root_url_contents(repos_root_url);
+ const Java::String::Contents author_contents(author);
+
+ apr_hash_t* kw = NULL;
+ SVN_JAVAHL_CHECK(env,
+ svn_subst_build_keywords3(
+ &kw,
+ keywords_string->data,
+ revision,
+ url_contents.c_str(),
+ root_url_contents.c_str(),
+ (jdate ? JNIUtil::getDate(jdate) : 0),
+ author_contents.c_str(),
+ pool.getPool()));
+ return kw;
+}
+
+svn_stream_t*
+translate_stream_common(Java::Env env, const SVN::Pool& pool,
+ svn_stream_t* stream,
+ jbyteArray jeol_marker, jboolean jrepair_eol,
+ jobject jkeywords, jboolean juse_keywords,
+ jboolean jexpand_keywords,
+ jbyteArray jkeywords_value, jlong jrevision,
+ jstring jurl, jstring jrepos_root_url,
+ jobject jdate, jstring jauthor)
+{
+ apr_hash_t* const keywords =
+ (juse_keywords
+ ? JavaHL::Util::make_keyword_hash(env, jkeywords, pool)
+ : build_keywords_common(
+ env, pool, jkeywords_value, jrevision,
+ jurl, jrepos_root_url, jdate, jauthor));
+
+ const Java::ByteArray eol_marker(env, jeol_marker);
+ svn_string_t* const eol_str =
+ Java::ByteArray::Contents(eol_marker).get_string(pool);
+ return svn_subst_stream_translated(stream,
+ eol_str->data,
+ svn_boolean_t(jrepair_eol),
+ keywords,
+ svn_boolean_t(jexpand_keywords),
+ pool.getPool());
+}
+} // anoymous namespace
+
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_SubstLib_buildKeywords(
+ JNIEnv* jenv, jobject jthis,
+ jbyteArray jkeywords_value, jlong jrevision,
+ jstring jurl, jstring jrepos_root_url,
+ jobject jdate, jstring jauthor)
+{
+ typedef Java::Map<Java::ByteArray, jbyteArray> ByteArrayMap;
+
+ SVN_JAVAHL_JNI_TRY(SubstLib, buildKeywords)
+ {
+ const Java::Env env(jenv);
+
+ // Using a "global" request pool since we don't keep a context with
+ // its own pool around for these functions.
+ SVN::Pool pool;
+
+ apr_hash_t* const kw = build_keywords_common(
+ env, pool, jkeywords_value, jrevision,
+ jurl, jrepos_root_url, jdate, jauthor);
+
+ ByteArrayMap keywords(env, jint(apr_hash_count(kw)));
+ for (apr_hash_index_t* hi = apr_hash_first(pool.getPool(), kw);
+ hi; hi = apr_hash_next(hi))
+ {
+ const void* rkey;
+ void* rval;
+ apr_hash_this(hi, &rkey, NULL, &rval);
+
+ svn_string_t* const val = static_cast<svn_string_t*>(rval);
+ keywords.put(static_cast<const char*>(rkey),
+ Java::ByteArray(env, val->data, jsize(val->len)));
+ }
+ return keywords.get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_SubstLib_translateInputStream(
+ JNIEnv* jenv, jobject jthis,
+ jobject jsource, jbyteArray jeol_marker, jboolean jrepair_eol,
+ jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
+ jbyteArray jkeywords_value, jlong jrevision,
+ jstring jurl, jstring jrepos_root_url,
+ jobject jdate, jstring jauthor)
+{
+ SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
+ {
+ const Java::Env env(jenv);
+
+ // We'll allocate the stream in the bound object's pool.
+ std::auto_ptr<JavaHL::NativeInputStream>
+ translated(new JavaHL::NativeInputStream());
+ svn_stream_t* source = Java::InputStream::get_global_stream(
+ env, jsource, translated->get_pool());
+
+ translated->set_stream(translate_stream_common(
+ env, translated->get_pool(), source,
+ jeol_marker, jrepair_eol,
+ jkeywords, juse_keywords, jexpand_keywords,
+ jkeywords_value, jrevision,
+ jurl, jrepos_root_url, jdate, jauthor));
+ const jobject jtranslated = translated->create_java_wrapper();
+ translated.release();
+ return jtranslated;
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
+
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_util_SubstLib_translateOutputStream(
+ JNIEnv* jenv, jobject jthis,
+ jobject jdestination, jbyteArray jeol_marker, jboolean jrepair_eol,
+ jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
+ jbyteArray jkeywords_value, jlong jrevision,
+ jstring jurl, jstring jrepos_root_url,
+ jobject jdate, jstring jauthor)
+{
+ SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
+ {
+ const Java::Env env(jenv);
+
+ // We'll allocate the stream in the bound object's pool.
+ std::auto_ptr<JavaHL::NativeOutputStream>
+ translated(new JavaHL::NativeOutputStream());
+ svn_stream_t* destination = Java::OutputStream::get_global_stream(
+ env, jdestination, translated->get_pool());
+
+ translated->set_stream(translate_stream_common(
+ env, translated->get_pool(), destination,
+ jeol_marker, jrepair_eol,
+ jkeywords, juse_keywords, jexpand_keywords,
+ jkeywords_value, jrevision,
+ jurl, jrepos_root_url, jdate, jauthor));
+ const jobject jtranslated = translated->create_java_wrapper();
+ translated.release();
+ return jtranslated;
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp
new file mode 100644
index 0000000..b18f3fc
--- /dev/null
+++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.cpp
@@ -0,0 +1,174 @@
+/**
+ * @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 org_apache_subversion_javahl_util_TunnelChannel.cpp
+ * @brief Implementation of the native methods in the Java classes
+ * TunnelChannel, RequestChannel and ResponseChannel
+ */
+
+#include <string>
+
+#include <apr_file_io.h>
+
+#include "../include/org_apache_subversion_javahl_util_TunnelChannel.h"
+#include "../include/org_apache_subversion_javahl_util_RequestChannel.h"
+#include "../include/org_apache_subversion_javahl_util_ResponseChannel.h"
+
+#include "jniwrapper/jni_exception.hpp"
+#include "jniwrapper/jni_channel.hpp"
+#include "jniwrapper/jni_stack.hpp"
+
+#include "svn_private_config.h"
+
+namespace {
+apr_file_t* get_file_descriptor(Java::Env env, jlong jfd)
+{
+ apr_file_t* fd = reinterpret_cast<apr_file_t*>(jfd);
+ if (!fd)
+ Java::NullPointerException(env).raise("nativeChannel");
+ return fd;
+}
+
+void throw_IOException(Java::Env env, const char* message,
+ apr_status_t status)
+{
+ char buf[1024];
+ std::string msg(message);
+ apr_strerror(status, buf, sizeof(buf) - 1);
+ msg += buf;
+ Java::IOException(env).raise(msg.c_str());
+}
+
+class TunnelReader : public Java::ChannelReader
+{
+public:
+ explicit TunnelReader(Java::Env env, jlong jnative_channel)
+ : m_fd(get_file_descriptor(env, jnative_channel))
+ {}
+
+ virtual jint operator()(Java::Env env, void* buffer, jint length)
+ {
+ if (!length)
+ return 0;
+
+ apr_size_t bytes_read = length;
+ const apr_status_t status = apr_file_read(m_fd, buffer, &bytes_read);
+ if (status && !APR_STATUS_IS_EOF(status))
+ {
+ throw_IOException(
+ env, _("Error reading from native file handle: "),
+ status);
+ return -1;
+ }
+ if (APR_STATUS_IS_EOF(status))
+ return -1;
+ return jint(bytes_read);
+ }
+
+private:
+ apr_file_t* const m_fd;
+};
+
+class TunnelWriter : public Java::ChannelWriter
+{
+public:
+ explicit TunnelWriter(Java::Env env, jlong jnative_channel)
+ : m_fd(get_file_descriptor(env, jnative_channel))
+ {}
+
+ virtual jint operator()(Java::Env env, const void* buffer, jint length)
+ {
+ if (!length)
+ return 0;
+
+ apr_size_t bytes_written;
+ const apr_status_t status =
+ apr_file_write_full(m_fd, buffer, length, &bytes_written);
+ if (status)
+ {
+ throw_IOException(
+ env, _("Error writing to native file handle: "),
+ status);
+ return -1;
+ }
+ return jint(bytes_written);
+ }
+
+private:
+ apr_file_t* const m_fd;
+};
+
+} // anonymous namespace
+
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_util_TunnelChannel_nativeClose(
+ JNIEnv* jenv, jclass jclazz, jlong jnative_channel)
+{
+ SVN_JAVAHL_JNI_TRY_STATIC(TunnelChannel, close)
+ {
+ const Java::Env env(jenv);
+
+ apr_file_t* const fd = get_file_descriptor(env, jnative_channel);
+ if (!fd)
+ return;
+
+ const apr_status_t status = apr_file_close(fd);
+ if (status)
+ throw_IOException(
+ env, _("Error closing native file handle: "),
+ status);
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_util_RequestChannel_nativeRead(
+ JNIEnv* jenv, jclass jclazz, jlong jnative_channel, jobject jdst_buffer)
+{
+ SVN_JAVAHL_JNI_TRY_STATIC(RequestChannel, read)
+ {
+ const Java::Env env(jenv);
+
+ TunnelReader reader(env, jnative_channel);
+ Java::ReadableByteChannel channel(env, reader);
+ return channel.read(jdst_buffer);
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return -1;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_apache_subversion_javahl_util_ResponseChannel_nativeWrite(
+ JNIEnv* jenv, jclass jclazz, jlong jnative_channel, jobject jsrc_buffer)
+{
+ SVN_JAVAHL_JNI_TRY_STATIC(ResponseChannel, write)
+ {
+ const Java::Env env(jenv);
+
+ TunnelWriter writer(env, jnative_channel);
+ Java::WritableByteChannel channel(env, writer);
+ return channel.write(jsrc_buffer);
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return -1;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
index e523d5f..627da07 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientException.java
@@ -22,6 +22,7 @@
*/
package org.apache.subversion.javahl;
+import java.util.List;
/**
* This exception is thrown whenever something goes wrong in the
@@ -29,14 +30,57 @@ package org.apache.subversion.javahl;
*/
public class ClientException extends NativeException
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
- private static final long serialVersionUID = 1L;
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 2L;
+
+ /**
+ * Describes a single error message in a stack of messages
+ * associated with this exception.
+ * @since 1.9
+ */
+ public static final class ErrorMessage
+ {
+ ErrorMessage(int code, String message, boolean generic)
+ {
+ this.code = code;
+ this.message = message;
+ this.generic = generic;
+ }
+
+ /** @return The APR error code associated with the message. */
+ public final int getCode() { return code; }
+
+ /** @return The error message text. */
+ public final String getMessage() { return message; }
+
+ /** @return A flag indicating whether this is a generic
+ message for the APR error code, or a more specific message
+ generated by the native libraries. */
+ public final boolean isGeneric() { return generic; }
+
+ private final int code;
+ private final String message;
+ private final boolean generic;
+ };
+
+ /**
+ * This constructor is only used by the native library.
+ *
+ * @param message A description of the problem.
+ * @param source The error's source.
+ * @param aprError Any associated APR error code for a wrapped
+ * <code>svn_error_t</code>.
+ * @param messageStack The whole stack of error messages
+ * @since 1.9
+ */
+ ClientException(String message, Throwable cause, String source,
+ int aprError, List<ErrorMessage> messageStack)
+ {
+ super(message, source, cause, aprError);
+ this.messageStack = messageStack;
+ }
/**
* This constructor is only used by the native library.
@@ -48,7 +92,12 @@ public class ClientException extends NativeException
*/
ClientException(String message, String source, int aprError)
{
- super(message, source, aprError);
+ this(message, null, source, aprError, null);
+ }
+
+ public List<ErrorMessage> getAllMessages()
+ {
+ return messageStack;
}
/**
@@ -68,4 +117,6 @@ public class ClientException extends NativeException
return new ClientException(t.getMessage(), null, -1);
}
}
+
+ private final List<ErrorMessage> messageStack;
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
index 8a59e4d..bd2792f 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ClientNotifyInformation.java
@@ -23,10 +23,12 @@
package org.apache.subversion.javahl;
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.ClientNotifyCallback;
+
+import java.util.List;
import java.util.Map;
import java.util.EventObject;
-import org.apache.subversion.javahl.callback.ClientNotifyCallback;
-import org.apache.subversion.javahl.types.*;
/**
* The event passed to the {@link ClientNotifyCallback#onNotify}
@@ -34,14 +36,18 @@ import org.apache.subversion.javahl.types.*;
*/
public class ClientNotifyInformation extends EventObject
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
- private static final long serialVersionUID = 1L;
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 2L;
+
+ /**
+ * Path, either absolute or relative to the current working
+ * directory (i.e., not relative to an anchor). <code>path</code>
+ * is <code>null</vode> when the real target is an URL that is
+ * available in {@link #url}.
+ */
+ private String path;
/**
* The {@link Action} which triggered this event.
@@ -69,6 +75,12 @@ public class ClientNotifyInformation extends EventObject
private String errMsg;
/**
+ * A detailed stack of error messages for the item.
+ * @see ClientException
+ */
+ private List<ClientException.ErrorMessage> errMsgStack;
+
+ /**
* The {@link Status} of the content of the item.
*/
private Status contentState;
@@ -99,6 +111,12 @@ public class ClientNotifyInformation extends EventObject
private RevisionRange mergeRange;
/**
+ * Similar to {@link #path}, but when not <code>null</code>, the
+ * notification is about a UR>.
+ */
+ private String url;
+
+ /**
* A common absolute path prefix that can be subtracted from .path.
*/
private String pathPrefix;
@@ -139,30 +157,35 @@ public class ClientNotifyInformation extends EventObject
* @param changelistName The name of the changelist.
* @param mergeRange The range of the merge just beginning to occur.
* @param pathPrefix A common path prefix.
+ * @since 1.9
*/
public ClientNotifyInformation(String path, Action action, NodeKind kind,
String mimeType, Lock lock, String errMsg,
+ List<ClientException.ErrorMessage> errMsgStack,
Status contentState, Status propState,
LockStatus lockState, long revision,
String changelistName, RevisionRange mergeRange,
- String pathPrefix, String propName,
+ String url, String pathPrefix, String propName,
Map<String, String> revProps, long oldRevision,
long hunkOriginalStart, long hunkOriginalLength,
long hunkModifiedStart, long hunkModifiedLength,
long hunkMatchedLine, int hunkFuzz)
{
- super(path == null ? "" : path);
+ super(path != null ? path : (url != null ? url : ""));
+ this.path = path;
this.action = action;
this.kind = kind;
this.mimeType = mimeType;
this.lock = lock;
this.errMsg = errMsg;
+ this.errMsgStack = errMsgStack;
this.contentState = contentState;
this.propState = propState;
this.lockState = lockState;
this.revision = revision;
this.changelistName = changelistName;
this.mergeRange = mergeRange;
+ this.url = url;
this.pathPrefix = pathPrefix;
this.propName = propName;
this.revProps = revProps;
@@ -176,7 +199,33 @@ public class ClientNotifyInformation extends EventObject
}
/**
+ * @deprecated Constructor compatible with teh 1.8 API; uses
+ * <code>null</code> URL and errMsgStack values.
+ */
+ @Deprecated
+ public ClientNotifyInformation(String path, Action action, NodeKind kind,
+ String mimeType, Lock lock, String errMsg,
+ Status contentState, Status propState,
+ LockStatus lockState, long revision,
+ String changelistName, RevisionRange mergeRange,
+ String pathPrefix, String propName,
+ Map<String, String> revProps, long oldRevision,
+ long hunkOriginalStart, long hunkOriginalLength,
+ long hunkModifiedStart, long hunkModifiedLength,
+ long hunkMatchedLine, int hunkFuzz)
+ {
+ this(path, action, kind, mimeType, lock, errMsg, null,
+ contentState, propState, lockState, revision,
+ changelistName, mergeRange, null, pathPrefix,
+ propName, revProps, oldRevision,
+ hunkOriginalStart, hunkOriginalLength,
+ hunkModifiedStart, hunkModifiedLength,
+ hunkMatchedLine, hunkFuzz);
+ }
+
+ /**
* @return The path of the item, which is the source of the event.
+ * This may actually be a URL.
*/
public String getPath()
{
@@ -184,6 +233,15 @@ public class ClientNotifyInformation extends EventObject
}
/**
+ * @return {@link #path}, which may be <code>null</code>.
+ * @since 1.9
+ */
+ public String getNotifiedPath()
+ {
+ return this.path;
+ }
+
+ /**
* @return The {@link Action} which triggered this event.
*/
public Action getAction()
@@ -224,6 +282,14 @@ public class ClientNotifyInformation extends EventObject
}
/**
+ * @return Details about the error message for the item.
+ */
+ public List<ClientException.ErrorMessage> getErrMsgDetails()
+ {
+ return errMsgStack;
+ }
+
+ /**
* @return The {@link Status} of the content of the item.
*/
public Status getContentState()
@@ -272,6 +338,15 @@ public class ClientNotifyInformation extends EventObject
}
/**
+ * @return {@link #url}, which may be <code>null</code>
+ * @since 1.9
+ */
+ public String getUrl()
+ {
+ return this.url;
+ }
+
+ /**
* @return The common absolute path prefix.
*/
public String getPathPrefix()
@@ -567,7 +642,24 @@ public class ClientNotifyInformation extends EventObject
/** A move in the working copy has been broken
* @since New in 1.8. */
- move_broken ("move broken");
+ move_broken ("move broken"),
+
+ /** Running cleanup on an external module.
+ * @since New in 1.9. */
+ cleanup_external ("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. */
+ failed_requires_target ("failed requires target"),
+
+ /** Running info on an external module.
+ * @since New in 1.9. */
+ info_external ("info external"),
+
+ /** Finalizing commit.
+ * @since New in 1.9. */
+ commit_finalizing ("commit finalizing");
/**
* The description of the action.
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
index 1053ca6..49b21be 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitInfo.java
@@ -32,13 +32,9 @@ import org.apache.subversion.javahl.types.LogDate;
*/
public class CommitInfo implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/** the revision committed */
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
index 986faf6..d4a2fff 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/CommitItem.java
@@ -30,13 +30,9 @@ import org.apache.subversion.javahl.types.NodeKind;
*/
public class CommitItem implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
index f538c63..d211957 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictDescriptor.java
@@ -71,13 +71,26 @@ public class ConflictDescriptor
*/
private ConflictVersion srcRightVersion;
- /** This constructor should only be called from JNI code. */
- public ConflictDescriptor(String path, Kind conflictKind, NodeKind nodeKind,
+ // Information about property conflicts. New in 1.9
+ private String propRejectAbspath;
+ private byte[] propValueBase;
+ private byte[] propValueWorking;
+ private byte[] propValueIncomingOld;
+ private byte[] propValueIncomingNew;
+
+
+ // Private constructor, only called from the JNI code.
+ private ConflictDescriptor(String path, Kind conflictKind, NodeKind nodeKind,
String propertyName, boolean isBinary, String mimeType,
Action action, Reason reason, Operation operation,
String basePath, String theirPath,
String myPath, String mergedPath,
- ConflictVersion srcLeft, ConflictVersion srcRight)
+ ConflictVersion srcLeft, ConflictVersion srcRight,
+ String propRejectAbspath, byte[] propValueBase,
+ byte[] propValueWorking,
+ byte[] propValueIncomingOld,
+ byte[] propValueIncomingNew)
+
{
this.path = path;
this.conflictKind = conflictKind;
@@ -94,6 +107,28 @@ public class ConflictDescriptor
this.operation = operation;
this.srcLeftVersion = srcLeft;
this.srcRightVersion = srcRight;
+ this.propRejectAbspath = propRejectAbspath;
+ this.propValueBase = propValueBase;
+ this.propValueWorking = propValueWorking;
+ this.propValueIncomingOld = propValueIncomingOld;
+ this.propValueIncomingNew = propValueIncomingNew;
+ }
+
+ /**
+ * This constructor should only be called from JNI code.
+ * @deprecated
+ */
+ @Deprecated
+ public ConflictDescriptor(String path, Kind conflictKind, NodeKind nodeKind,
+ String propertyName, boolean isBinary, String mimeType,
+ Action action, Reason reason, Operation operation,
+ String basePath, String theirPath,
+ String myPath, String mergedPath,
+ ConflictVersion srcLeft, ConflictVersion srcRight)
+ {
+ this(path, conflictKind, nodeKind, propertyName, isBinary, mimeType,
+ action, reason, operation, basePath, theirPath, myPath, mergedPath,
+ srcLeft, srcRight, null, null, null, null, null);
}
public String getPath()
@@ -171,6 +206,32 @@ public class ConflictDescriptor
return srcRightVersion;
}
+ public String getPropRejectAbspath()
+ {
+ return propRejectAbspath;
+ }
+
+ public byte[] getPropValueBase()
+ {
+ return propValueBase;
+ }
+
+ public byte[] getPropValueWorking()
+ {
+ return propValueWorking;
+ }
+
+ public byte[] getPropValueIncomingOld()
+ {
+ return propValueIncomingOld;
+ }
+
+ public byte[] getPropValueIncomingNew()
+ {
+ return propValueIncomingNew;
+ }
+
+
/**
* Rich man's enum for <code>svn_wc_conflict_kind_t</code>.
*/
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java
index c992d49..5e3c9d0 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ConflictResult.java
@@ -42,7 +42,7 @@ public class ConflictResult
private String mergedPath;
/**
- * Create a new conflict result instace.
+ * Create a new conflict result instance.
*/
public ConflictResult(Choice choice, String mergedPath)
{
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
index e767f2f..657368d 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/DiffSummary.java
@@ -33,13 +33,9 @@ import org.apache.subversion.javahl.types.NodeKind;
*/
public class DiffSummary extends EventObject
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
private DiffKind diffKind;
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
index 2ffe446..c1cebc8 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
@@ -51,6 +51,11 @@ public interface ISVNClient
public Version getVersion();
/**
+ * @return Runtime version information about the loaded libsvn_client.
+ */
+ public RuntimeVersion getRuntimeVersion();
+
+ /**
* @return Extended version information about the underlying
* native libraries and operating system.
*/
@@ -74,16 +79,40 @@ public interface ISVNClient
public boolean isAdminDirectory(String name);
/**
- * List a directory or file of the working copy.
+ * Return the status of the working copy and maybe repository.
*
* @param path Path to explore.
* @param depth How deep to recurse into subdirectories.
* @param onServer Request status information from server.
+ * @param onDisk Check the working copy for local modifications.
+ * A value of <code>false</code> only
+ * has effect when <code>onServer</code> is
+ * <code>true</code>.
* @param getAll get status for uninteresting (unchanged) files.
* @param noIgnore get status for normaly ignored files and directories.
* @param ignoreExternals if externals are ignored during status
+ * @param depthAsSticky When set, interpret <code>depth</code> as
+ * the ambient depth of the working copy.
* @param changelists changelists to filter by
+ * @since 1.9
*/
+ void status(String path, Depth depth,
+ boolean onServer, boolean ignoreLocal,
+ boolean getAll, boolean noIgnore,
+ boolean ignoreExternals, boolean depthAsSticky,
+ Collection<String> changelists, StatusCallback callback)
+ throws ClientException;
+
+ /**
+ * Return information about the status of the working copy and
+ * maybe repository.
+ * <p>
+ * Behaves like the 1.9 version with
+ * <code>onDisk = true</code> and
+ * <code>depthAsSticky = false</code>.
+ * @deprecated
+ */
+ @Deprecated
void status(String path, Depth depth, boolean onServer,
boolean getAll, boolean noIgnore, boolean ignoreExternals,
Collection<String> changelists, StatusCallback callback)
@@ -131,9 +160,25 @@ public interface ISVNClient
* accepted by the command-line client.
* @param prompt the callback interface
*/
+ void setPrompt(AuthnCallback prompt);
+
+ /**
+ * Register callback interface to supply username and password on demand.
+ * This callback can also be used to provide theequivalent of the
+ * <code>--no-auth-cache</code> and <code>--non-interactive</code> arguments
+ * accepted by the command-line client.
+ * @param prompt the callback interface
+ */
+ @SuppressWarnings("deprecation")
void setPrompt(UserPasswordCallback prompt);
/**
+ * Set callbacks for ra_svn tunnel handling.
+ * @since 1.9
+ */
+ void setTunnelAgent(TunnelAgent tunnelAgent);
+
+ /**
* Retrieve the log messages for an item.
* @param path path or url to get the log message for.
* @param pegRevision revision to interpret path
@@ -210,6 +255,35 @@ public interface ISVNClient
throws ClientException;
/**
+ * Reverts set of files or directories to a pristine state.
+ * @param path A set of paths to revert.
+ * @param depth the depth to recurse into subdirectories
+ * @param changelists changelists to filter by
+ * @param clearChangelists If set, will clear changelist association
+ * from the reverted paths.
+ * @param metadataOnly Revert just the metadata (including conflict data)
+ * and not the working files/dirs
+ * @throws ClientException
+ * @since 1.9
+ */
+ void revert(Set<String> paths, Depth depth,
+ Collection<String> changelists,
+ boolean clearChangelists,
+ boolean metadataOnly)
+ throws ClientException;
+
+ /**
+ * Reverts set of files or directories to a pristine state.
+ * <p>
+ * Behaves like the 1.9 version with <code>clearChangelists</code>
+ * set to <code>false</code>;
+ */
+ void revert(Set<String> paths, Depth depth,
+ Collection<String> changelists)
+ throws ClientException;
+
+
+ /**
* Reverts a file to a pristine state.
* @param path path of the file.
* @param depth the depth to recurse into subdirectories
@@ -221,6 +295,10 @@ public interface ISVNClient
/**
* Adds a file to the repository.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.8 version with
+ * <code>noAutoProps</code> set to <code>false</code>.
+ *
* @param path path to be added.
* @param depth the depth to recurse into subdirectories
* @param force if adding a directory and recurse true and path is a
@@ -229,7 +307,6 @@ public interface ISVNClient
* ignore patterns
* @param addParents add any intermediate parents to the working copy
* @throws ClientException
- * @note this method behaves like the 1.8 version with noAutoProps=false
*/
void add(String path, Depth depth, boolean force, boolean noIgnores,
boolean addParents)
@@ -299,12 +376,46 @@ public interface ISVNClient
* @param makeParents Whether to create intermediate parents
* @param ignoreExternals Whether or not to process external definitions
* as part of this operation.
+ * @param metadataOnly Copy just the metadata and not the working files/dirs
+ * @param pinExternals Whether or not to pin external definitions as part
+ * of this operation.
+ * @param externalsToPin The set of externals to pin.
+ * Keys are either local absolute paths (when the source of the
+ * copy is the working copy) or URLs within the repository
+ * (when the source is the repository) where an
+ * <code>svn:externals</code> property is defined.
+ * Values are lists of parsed {@link ExternalItem}
+ * objects from each external definitions.
+ * If <code>pinExternals</code> is <code>true</code>, only
+ * the externals in this set will be pinned; if this parameter
+ * is <code>null</code>, all externals will be pinned.
+ * If <code>pinExternals</code> is <code>false</code>,
+ * this parameter will be ignored.
* @param revpropTable A string-to-string mapping of revision properties
* to values which will be set if this operation
* results in a commit.
* @param handler the commit message callback, may be <code>null</code>
* if <code>destPath</code> is not a URL
* @throws ClientException If the copy operation fails.
+ * @throws NullPointerException if the <code>sources</code> list is empty.
+ * @since 1.9
+ */
+ void copy(List<CopySource> sources, String destPath,
+ boolean copyAsChild, boolean makeParents,
+ boolean ignoreExternals, boolean metadataOnly,
+ boolean pinExternals,
+ Map<String, List<ExternalItem>> externalsToPin,
+ Map<String, String> revpropTable,
+ CommitMessageCallback handler, CommitCallback callback)
+ throws ClientException;
+
+ /**
+ * Copy versioned paths with the history preserved.
+ * <p>
+ * Behaves like the 1.9 version with
+ * <code>pinExternals</code> set to <code>false</code> and
+ * <code>externalsToPin</code> set to <code>null</code> and
+ * <code>metadataOnly</code> set to <code>false</code>.
*/
void copy(List<CopySource> sources, String destPath,
boolean copyAsChild, boolean makeParents,
@@ -344,6 +455,7 @@ public interface ISVNClient
* @deprecated Provided for backward compatibility with 1.7. Passes
* metadataOnly false and allowMixRev true.
*/
+ @Deprecated
void move(Set<String> srcPaths, String destPath, boolean force,
boolean moveAsChild, boolean makeParents,
Map<String, String> revpropTable,
@@ -370,6 +482,30 @@ public interface ISVNClient
* Recursively cleans up a local directory, finishing any
* incomplete operations, removing lockfiles, etc.
* @param path a local directory.
+ * @param breakLocks ### FIXME: Missing docstring in svn_client.h
+ * @param clearDavCache ### FIXME: Missing docstring in svn_client.h
+ * @param removeUnusedPristines ### FIXME: Missing docstring in svn_client.h
+ * @param includeExternals Recurse into externals working copies
+ * and clean them up, too.
+ * @throws ClientException
+ * @since 1.9
+ */
+ void cleanup(String path,
+ boolean breakLocks,
+ boolean fixRecordedTimestamps,
+ boolean clearDavCache,
+ boolean removeUnusedPristines,
+ boolean includeExternals)
+ throws ClientException;
+
+ /**
+ * Recursively cleans up a local directory, finishing any
+ * incomplete operations, removing lockfiles, etc.
+ * <p>
+ * Behaves like the 1.9 version with <code>includeExternals</code>
+ * set to <code>false<code>, and the other flags to
+ * <code>true</code>.
+ * @param path a local directory.
* @throws ClientException
*/
void cleanup(String path) throws ClientException;
@@ -399,6 +535,31 @@ public interface ISVNClient
* @param depth how deep to recurse in subdirectories
* @param nativeEOL which EOL characters to use during export
* @throws ClientException
+ * @since 1.9
+ */
+ long doExport(String srcPath, String destPath, Revision revision,
+ Revision pegRevision, boolean force,
+ boolean ignoreExternals, boolean ignoreKeywords,
+ Depth depth, String nativeEOL)
+ throws ClientException;
+
+ /**
+ * Exports the contents of either a subversion repository into a
+ * 'clean' directory (meaning a directory with no administrative
+ * directories).
+ * <p>
+ * <b>Note:</b> Behaves like the 1.9 version with
+ * ignoreKeywords set to false.
+ *
+ * @param srcPath the url of the repository path to be exported
+ * @param destPath a destination path that must not already exist.
+ * @param revision the revsion to be exported
+ * @param pegRevision the revision to interpret srcPath
+ * @param force set if it is ok to overwrite local files
+ * @param ignoreExternals ignore external during export
+ * @param depth how deep to recurse in subdirectories
+ * @param nativeEOL which EOL characters to use during export
+ * @throws ClientException
*/
long doExport(String srcPath, String destPath, Revision revision,
Revision pegRevision, boolean force, boolean ignoreExternals,
@@ -457,6 +618,10 @@ public interface ISVNClient
/**
* Import a file or directory into a repository directory at
* head.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.8 version with noAutoProps
+ * set to false and without the filtering option.
+ *
* @param path the local path
* @param url the target url
* @param depth depth to traverse into subdirectories
@@ -469,8 +634,6 @@ public interface ISVNClient
* @param handler the commit message callback
* @param callback the commit status callback
* @throws ClientException
- * @note this method behaves like the 1.8 version with noAutoProps=false
- * and without the filtering option.
*/
void doImport(String path, String url, Depth depth,
boolean noIgnore, boolean ignoreUnknownNodeTypes,
@@ -501,6 +664,33 @@ public interface ISVNClient
* @param ignoreMergeinfo ignore merge history, treat sources as unrelated
* @param diffIgnoreAncestry always treat source files as related
* @param dryRun do not change anything
+ * @param allowMixedRev allow merging into a mixed-revision working copy
+ * @param recordOnly record mergeinfo but do not run merge
+ * @throws ClientException
+ * @since 1.9
+ */
+ void merge(String path1, Revision revision1, String path2,
+ Revision revision2, String localPath, boolean force, Depth depth,
+ boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
+ boolean dryRun, boolean allowMixedRev, boolean recordOnly)
+ throws ClientException;
+
+ /**
+ * Merge changes from two paths into a new local path.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.9 version with allowMixedRev
+ * always set to <code>true</code>.
+ *
+ * @param path1 first path or url
+ * @param revision1 first revision
+ * @param path2 second path or url
+ * @param revision2 second revision
+ * @param localPath target local path
+ * @param force overwrite local changes
+ * @param depth how deep to traverse into subdirectories
+ * @param ignoreMergeinfo ignore merge history, treat sources as unrelated
+ * @param diffIgnoreAncestry always treat source files as related
+ * @param dryRun do not change anything
* @param recordOnly record mergeinfo but do not run merge
* @throws ClientException
* @since 1.8
@@ -513,6 +703,9 @@ public interface ISVNClient
/**
* Merge changes from two paths into a new local path.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.8 version where ignoreAncestry
+ * maps to both ignoreMergeinfo and diffIgnoreAncestry
*
* @param path1 first path or url
* @param revision1 first revision
@@ -525,8 +718,6 @@ public interface ISVNClient
* @param dryRun do not change anything
* @param recordOnly record mergeinfo but do not run merge
* @throws ClientException
- * @note Behaves like the 1.8 where ignoreAncestry maps to
- * both ignoreMergeinfo and diffIgnoreAncestry
*/
void merge(String path1, Revision revision1, String path2,
Revision revision2, String localPath, boolean force, Depth depth,
@@ -545,6 +736,33 @@ public interface ISVNClient
* @param ignoreMergeinfo ignore merge history, treat sources as unrelated
* @param diffIgnoreAncestry always treat source files as related
* @param dryRun do not change anything
+ * @param allowMixedRev allow merging into a mixed-revision working copy
+ * @param recordOnly record mergeinfo but do not run merge
+ * @throws ClientException
+ * @since 1.9
+ */
+ void merge(String path, Revision pegRevision, List<RevisionRange> revisions,
+ String localPath, boolean force, Depth depth,
+ boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
+ boolean dryRun, boolean allowMixedRev, boolean recordOnly)
+ throws ClientException;
+
+ /**
+ * Merge set of revisions into a new local path.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.9 version with allowMixedRev
+ * always set to <code>true</code>.
+ *
+ * @param path path or url
+ * @param pegRevision revision to interpret path
+ * @param revisions revisions to merge; may be null, indicating that
+ * the optimal range should be determined automatcially
+ * @param localPath target local path
+ * @param force overwrite local changes
+ * @param depth how deep to traverse into subdirectories
+ * @param ignoreMergeinfo ignore merge history, treat sources as unrelated
+ * @param diffIgnoreAncestry always treat source files as related
+ * @param dryRun do not change anything
* @param recordOnly record mergeinfo but do not run merge
* @throws ClientException
* @since 1.8
@@ -557,6 +775,10 @@ public interface ISVNClient
/**
* Merge set of revisions into a new local path.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.8 version where ignoreAncestry
+ * maps to both ignoreMergeinfo and diffIgnoreAncestry.
+ *
* @param path path or url
* @param pegRevision revision to interpret path
* @param revisions revisions to merge;
@@ -569,8 +791,6 @@ public interface ISVNClient
* @param dryRun do not change anything
* @param recordOnly record mergeinfo but do not run merge
* @throws ClientException
- * @note Behaves like the 1.8 where ignoreAncestry maps to
- * both ignoreMergeinfo and diffIgnoreAncestry
*/
void merge(String path, Revision pegRevision, List<RevisionRange> revisions,
String localPath, boolean force, Depth depth,
@@ -594,6 +814,7 @@ public interface ISVNClient
* @throws ClientException
* @deprecated Will be removed in a future release
*/
+ @Deprecated
void mergeReintegrate(String path, Revision pegRevision,
String localPath, boolean dryRun)
throws ClientException;
@@ -616,7 +837,7 @@ public interface ISVNClient
* @param pegRevision peg rev for pathOrUrl
* @param mergeSourceUrl the source of the merge
* @param srcPegRevision peg rev for mergeSourceUrl
- * @param srcStartRevieion lower bound of the source revision range
+ * @param srcStartRevision lower bound of the source revision range
* @param srcEndRevision upper bound of the source revision range
* @param discoverChangedPaths return paths of changed items
* @param depth the depth to recurse to
@@ -635,6 +856,10 @@ public interface ISVNClient
/**
* Retrieve either merged or eligible-to-be-merged revisions.
+ * <p>
+ * <b>Note:</b> Behaves like the 1.8 version, with unspecified
+ * revision range.
+ *
* @param kind kind of revisions to receive
* @param pathOrUrl target of merge
* @param pegRevision peg rev for pathOrUrl
@@ -644,7 +869,6 @@ public interface ISVNClient
* @param depth the depth to recurse to
* @param revProps the revprops to retrieve
* @param callback the object to receive the log messages
- * @note Behaves like the 1.8 version, with unspecified revision range.
*/
void getMergeinfoLog(Mergeinfo.LogKind kind, String pathOrUrl,
Revision pegRevision, String mergeSourceUrl,
@@ -660,7 +884,7 @@ public interface ISVNClient
* @param target2 second path or url
* @param revision2 second revision
* @param relativeToDir index path is relative to this path
- * @param outFileName file name where difference are written
+ * @param outStream the stream to which difference are written
* @param depth how deep to traverse into subdirectories
* @param ignoreAncestry ignore if files are not related
* @param noDiffDeleted no output on deleted files
@@ -681,6 +905,26 @@ public interface ISVNClient
DiffOptions options)
throws ClientException;
+ /**
+ * Display the differences between two paths
+ * @param target1 first path or url
+ * @param revision1 first revision
+ * @param target2 second path or url
+ * @param revision2 second revision
+ * @param relativeToDir index path is relative to this path
+ * @param outFileName file name where difference are written
+ * @param depth how deep to traverse into subdirectories
+ * @param ignoreAncestry ignore if files are not related
+ * @param noDiffDeleted no output on deleted files
+ * @param force diff even on binary files
+ * @param copiesAsAdds if set, copied files will be shown in their
+ * entirety, not as diffs from their sources
+ * @param ignoreProps don't show property diffs
+ * @param propsOnly show property changes only
+ * @param options additional options for controlling the output
+ * @throws ClientException
+ * @since 1.8
+ */
void diff(String target1, Revision revision1, String target2,
Revision revision2, String relativeToDir, String outFileName,
Depth depth, Collection<String> changelists,
@@ -696,7 +940,7 @@ public interface ISVNClient
* @param target2 second path or url
* @param revision2 second revision
* @param relativeToDir index path is relative to this path
- * @param outFileName file name where difference are written
+ * @param outStream the stream to which difference are written
* @param depth how deep to traverse into subdirectories
* @param ignoreAncestry ignore if files are not related
* @param noDiffDeleted no output on deleted files
@@ -714,6 +958,24 @@ public interface ISVNClient
boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly)
throws ClientException;
+ /**
+ * Display the differences between two paths
+ * @param target1 first path or url
+ * @param revision1 first revision
+ * @param target2 second path or url
+ * @param revision2 second revision
+ * @param relativeToDir index path is relative to this path
+ * @param outFileName file name where difference are written
+ * @param depth how deep to traverse into subdirectories
+ * @param ignoreAncestry ignore if files are not related
+ * @param noDiffDeleted no output on deleted files
+ * @param force diff even on binary files
+ * @param copiesAsAdds if set, copied files will be shown in their
+ * entirety, not as diffs from their sources
+ * @param ignoreProps don't show property diffs
+ * @param propsOnly show property changes only
+ * @throws ClientException
+ */
void diff(String target1, Revision revision1, String target2,
Revision revision2, String relativeToDir, String outFileName,
Depth depth, Collection<String> changelists,
@@ -728,7 +990,7 @@ public interface ISVNClient
* @param startRevision first Revision to compare
* @param endRevision second Revision to compare
* @param relativeToDir index path is relative to this path
- * @param outFileName file name where difference are written
+ * @param outStream the stream to which difference are written
* @param depth how deep to traverse into subdirectories
* @param changelists if non-null, filter paths using changelists
* @param ignoreAncestry ignore if files are not related
@@ -750,6 +1012,27 @@ public interface ISVNClient
DiffOptions options)
throws ClientException;
+ /**
+ * Display the differences between two paths.
+ * @param target path or url
+ * @param pegRevision revision tointerpret target
+ * @param startRevision first Revision to compare
+ * @param endRevision second Revision to compare
+ * @param relativeToDir index path is relative to this path
+ * @param outFileName file name where difference are written
+ * @param depth how deep to traverse into subdirectories
+ * @param changelists if non-null, filter paths using changelists
+ * @param ignoreAncestry ignore if files are not related
+ * @param noDiffDeleted no output on deleted files
+ * @param force diff even on binary files
+ * @param copiesAsAdds if set, copied files will be shown in their
+ * entirety, not as diffs from their sources
+ * @param ignoreProps don't show property diffs
+ * @param propsOnly show property changes only
+ * @param options additional options for controlling the output
+ * @throws ClientException
+ * @since 1.8
+ */
void diff(String target, Revision pegRevision, Revision startRevision,
Revision endRevision, String relativeToDir, String outFileName,
Depth depth, Collection<String> changelists,
@@ -765,7 +1048,7 @@ public interface ISVNClient
* @param startRevision first Revision to compare
* @param endRevision second Revision to compare
* @param relativeToDir index path is relative to this path
- * @param outFileName file name where difference are written
+ * @param outStream the stream to which difference are written
* @param depth how deep to traverse into subdirectories
* @param changelists if non-null, filter paths using changelists
* @param ignoreAncestry ignore if files are not related
@@ -785,6 +1068,25 @@ public interface ISVNClient
boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly)
throws ClientException;
+ /**
+ * Display the differences between two paths.
+ * @param target path or url
+ * @param pegRevision revision tointerpret target
+ * @param startRevision first Revision to compare
+ * @param endRevision second Revision to compare
+ * @param relativeToDir index path is relative to this path
+ * @param outFileName file name where difference are written
+ * @param depth how deep to traverse into subdirectories
+ * @param changelists if non-null, filter paths using changelists
+ * @param ignoreAncestry ignore if files are not related
+ * @param noDiffDeleted no output on deleted files
+ * @param force diff even on binary files
+ * @param copiesAsAdds if set, copied files will be shown in their
+ * entirety, not as diffs from their sources
+ * @param ignoreProps don't show property diffs
+ * @param propsOnly show property changes only
+ * @throws ClientException
+ */
void diff(String target, Revision pegRevision, Revision startRevision,
Revision endRevision, String relativeToDir, String outFileName,
Depth depth, Collection<String> changelists,
@@ -824,14 +1126,14 @@ public interface ISVNClient
*
* @param target Path or URL.
* @param pegRevision Revision at which to interpret
- * <code>target</code>. If {@link Revision.Kind#unspecified} or
+ * <code>target</code>. If {@link Revision#UNSPECIFIED} or
* <code>null</code>, behave identically to {@link
* #diffSummarize(String, Revision, String, Revision, Depth,
* Collection, boolean, DiffSummaryCallback)}, using
* <code>path</code> for both of that method's targets.
- * @param startRevision Beginning of range for comparsion of
+ * @param startRevision Beginning of range for comparison of
* <code>target</code>.
- * @param endRevision End of range for comparsion of
+ * @param endRevision End of range for comparison of
* <code>target</code>.
* @param depth how deep to recurse.
* @param changelists if non-null, filter paths using changelists
@@ -889,14 +1191,11 @@ public interface ISVNClient
*
* @param paths paths of the items
* @param name name of the property
- * @param value new value of the property. Set value to <code>
- * null</code> to delete a property
+ * @param value new value of the property. Set value to
+ * <code>null</code> to delete a property
* @param depth the depth to recurse into subdirectories
* @param changelists changelists to filter by
* @param force do not check if the value is valid
- * @param revpropTable A string-to-string mapping of revision properties
- * to values which will be set if this operation
- * results in a commit.
* @throws ClientException
*/
void propertySetLocal(Set<String> paths, String name, byte[] value,
@@ -904,6 +1203,21 @@ public interface ISVNClient
boolean force)
throws ClientException;
+ /**
+ * Sets one property of an item with a String value
+ *
+ * @param paths paths of the items
+ * @param name name of the property
+ * @param value new value of the property. Set value to <code>
+ * null</code> to delete a property
+ * @param depth the depth to recurse into subdirectories
+ * @param changelists changelists to filter by
+ * @param force do not check if the value is valid
+ * @param revpropTable A string-to-string mapping of revision properties
+ * to values which will be set if this operation
+ * results in a commit.
+ * @throws ClientException
+ */
void propertySetRemote(String path, long baseRev, String name,
byte[] value, CommitMessageCallback handler,
boolean force, Map<String, String> revpropTable,
@@ -964,6 +1278,9 @@ public interface ISVNClient
/**
* Retrieve the content of a file
+ *
+ * Always expands keywords and never returns properties.
+ *
* @param path the path of the file
* @param revision the revision to retrieve
* @param pegRevision the revision to interpret path
@@ -982,11 +1299,40 @@ public interface ISVNClient
* @param revision the revision to retrieve
* @param pegRevision the revision at which to interpret the path
* @param stream the stream to write the file's content to
+ * @param returnProps whether to return the file's own (not inherited)
+ * properties dalong with the contents
+ * @return The file's properties if <code>returnProps</code> is
+ * set (which may yield an empty map), otherwise
+ * <code>null</code>.
+ * @throws ClientException
+ * @see java.io.PipedOutputStream
+ * @see java.io.PipedInputStream
+ * @since 1.9
+ */
+ Map<String, byte[]>
+ streamFileContent(String path,
+ Revision revision, Revision pegRevision,
+ boolean expandKeywords, boolean returnProps,
+ OutputStream stream)
+ throws ClientException;
+
+ /**
+ * Write the file's content to the specified output stream. If
+ * you need an InputStream, use a
+ * PipedInputStream/PipedOutputStream combination.
+ *
+ * Always expands keywords and never returns properties.
+ *
+ * @param path the path of the file
+ * @param revision the revision to retrieve
+ * @param pegRevision the revision at which to interpret the path
+ * @param stream the stream to write the file's content to
* @throws ClientException
* @see java.io.PipedOutputStream
* @see java.io.PipedInputStream
*/
- void streamFileContent(String path, Revision revision, Revision pegRevision,
+ void streamFileContent(String path,
+ Revision revision, Revision pegRevision,
OutputStream stream)
throws ClientException;
@@ -1013,12 +1359,28 @@ public interface ISVNClient
* information
* @param callback callback to receive the file content and the other
* information
+ * @param options additional options for controlling the output
* @throws ClientException
+ * @since 1.9
*/
void blame(String path, Revision pegRevision, Revision revisionStart,
Revision revisionEnd, boolean ignoreMimeType,
boolean includeMergedRevisions,
- BlameCallback callback) throws ClientException;
+ BlameCallback callback, DiffOptions options)
+ throws ClientException;
+
+ /**
+ * Retrieve the content together with the author, the revision and the date
+ * of the last change of each line
+ * <p>
+ * Behaves like the 1.9 version with <code>options</code> set to
+ * their default values.
+ */
+ void blame(String path, Revision pegRevision, Revision revisionStart,
+ Revision revisionEnd, boolean ignoreMimeType,
+ boolean includeMergedRevisions,
+ BlameCallback callback)
+ throws ClientException;
/**
* Set directory for the configuration information, taking the
@@ -1040,6 +1402,19 @@ public interface ISVNClient
String getConfigDirectory() throws ClientException;
/**
+ * Set an event handler that will be called every time the
+ * configuration is loaded by this client object.
+ */
+ void setConfigEventHandler(ConfigEvent configHandler)
+ throws ClientException;
+
+ /**
+ * Return a reference to the installed configuration event
+ * handler. The returned value may be <code>null</code>.
+ */
+ ConfigEvent getConfigEventHandler() throws ClientException;
+
+ /**
* cancel the active operation
* @throws ClientException
*/
@@ -1069,7 +1444,8 @@ public interface ISVNClient
/**
* Recursively get the paths which belong to a changelist
* @param rootPath the wc path under which to check
- * @param changelists the changelists to look under
+ * @param changelists the changelists to look under;
+ * if <code>null</code>, all changelists will be considered.
* @param depth the depth to recurse
* @param callback the callback to return the changelists through
*/
@@ -1097,13 +1473,59 @@ public interface ISVNClient
throws ClientException;
/**
- * Retrieve information about repository or working copy items.
+ * Invoke <code>callback</code> to return information
+ * <code>pathOrUrl</code> in <code>revision</code>. The
+ * information returned is system-generated metadata, not the sort
+ * of "property" metadata created by users.
+ * <p>
+ * If both revision arguments are either <code>null</code> or
+ * {@link Revision#START}, then information will be pulled solely
+ * from the working copy; no network connections will be made.
+ * <p>
+ * Otherwise, information will be pulled from a repository. The
+ * actual node revision selected is determined by the
+ * <code>pathOrUrl</code> as it exists in
+ * <code>pegRevision</code>. If <code>pegRevision</code> is
+ * {@link Revision#START}, then it defaults to {@link
+ * Revision#HEAD} for URLs or {@link Revision#WORKING} for WC
+ * targets.
+ * <p>
+ * If <code>pathOrUrl</code> is not a local path, then if
+ * <code>revision</code> is {@link Revision#PREVIOUS} (or some
+ * other kind that requires a local path), an error will be
+ * returned, because the desired revision cannot be determined.
+ * <p>
+ * If <code>pathOrUrl</code> is a file, just invoke the callback on it. If it
+ * is a directory, then descend according to <code>depth</code>.
+ * <p>
* @param pathOrUrl the path or the url of the item
* @param revision the revision of the item to return
* @param pegRevision the revision to interpret pathOrUrl
* @param depth the depth to recurse
+ * @param fetchExcluded when <code>true</code>, retrieve
+ * information about nodes that are excluded from the working copy
+ * @param fetchActualOnly when <code>true</code>, retrieve
+ * information about node that are not versioned, but are still
+ * tree conflicted.
+ * @param includeExternals Recurs into externals directories
* @param changelists if non-null, filter paths using changelists
* @param callback a callback to receive the infos retrieved
+ * @since 1.9
+ */
+ void info(String pathOrUrl,
+ Revision revision, Revision pegRevision, Depth depth,
+ boolean fetchExcluded, boolean fetchActualOnly,
+ boolean includeExternals,
+ Collection<String> changelists, InfoCallback callback)
+ throws ClientException;
+
+ /**
+ * Retrieve information about repository or working copy items.
+ * <p>
+ * Behaves like the 1.9 version, with <code>fetchExcluded</code>
+ * set to <code>false</code>, <code>fetchActualOnly</code> set to
+ * <code>true</code> anf <code>includeExternals</code> set to
+ * <code>false</code>.
*/
void info2(String pathOrUrl, Revision revision, Revision pegRevision,
Depth depth, Collection<String> changelists,
@@ -1145,4 +1567,71 @@ public interface ISVNClient
int stripCount, boolean reverse, boolean ignoreWhitespace,
boolean removeTempfiles, PatchCallback callback)
throws ClientException;
+
+ /**
+ * Recursively vacuum a working copy, removing unnecessary data.
+ * <p>
+ * This method will report an error when
+ * <code>removeUnversionedItems</code> or
+ * <code>removeIgnoredItems</code> are set, and the working copy
+ * is already locked. This prevents accidental corruption of the
+ * working copy if this method is invoked while another client is
+ * performing some other operation on the working copy.
+ * @param path The path of the working copy directory.
+ * @param removeUnversionedItems Remove unversioned items from the
+ * working copy after it has been successfully cleaned up.
+ * @param removeIgnoredItems Remove unversioned items that are
+ * ignored by Subversion, after the working copy has been
+ * successfully cleaned up.
+ * @param fixRecordedTimestamps Update timestamps recorded in the
+ * working copy database to their actual on-disk values.
+ * @param removeUnusedPristines Remove pristine files that are not
+ * referenced by the working copy.
+ * @param includeExternals Recurse into externals working copies
+ * and vacuum them, too.
+ * @since 1.9
+ */
+ void vacuum(String path,
+ boolean removeUnversionedItems,
+ boolean removeIgnoredItems,
+ boolean fixRecordedTimestamps,
+ boolean removeUnusedPristines,
+ boolean includeExternals)
+ throws ClientException;
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param pathOrUrl A path in a working copy from which the
+ * session URL is derived, or the URL itself.
+ * @throws remote.RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ * @since 1.9
+ */
+ ISVNRemote openRemoteSession(String pathOrUrl)
+ throws ClientException, SubversionException;
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param pathOrUrl A path in a working copy from which the
+ * session URL is derived, or the URL itself.
+ * @param retryAttempts The number of times to retry the operation
+ * if the given URL is redirected.
+ * @throws IllegalArgumentException If <code>retryAttempts</code>
+ * is not positive
+ * @throws remote.RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ * @since 1.9
+ */
+ ISVNRemote openRemoteSession(String pathOrUrl, int retryAttempts)
+ throws ClientException, SubversionException;
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java
new file mode 100644
index 0000000..eb4e82f
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNConfig.java
@@ -0,0 +1,248 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.types.Tristate;
+
+/**
+ * Interface for manipulating the in-memory configuration info.
+ * @since 1.9
+ */
+public interface ISVNConfig
+{
+ /**
+ * Returns a reference to the "config" configuration category.
+ */
+ Category config();
+
+ /*
+ * The following constants are section and option names from the
+ * "config" configuration file.
+ */
+ public static final String SECTION_AUTH = "auth";
+ public static final String PASSWORD_STORES = "password-stores";
+ public static final String KWALLET_WALLET = "kwallet-wallet";
+ public static final String KWALLET_SVN_APPLICATION_NAME_WITH_PID = "kwallet-svn-application-name-with-pid";
+ public static final String SSL_CLIENT_CERT_FILE_PROMPT = "ssl-client-cert-file-prompt";
+
+ public static final String SECTION_HELPERS = "helpers";
+ public static final String EDITOR_CMD = "editor-cmd";
+ public static final String DIFF_CMD = "diff-cmd";
+ public static final String DIFF_EXTENSIONS = "diff-extensions";
+ public static final String DIFF3_CMD = "diff3-cmd";
+ public static final String DIFF3_HAS_PROGRAM_ARG = "diff3-has-program-arg";
+ public static final String MERGE_TOOL_CMD = "merge-tool-cmd";
+
+ public static final String SECTION_MISCELLANY = "miscellany";
+ public static final String GLOBAL_IGNORES = "global-ignores";
+ public static final String LOG_ENCODING = "log-encoding";
+ public static final String USE_COMMIT_TIMES = "use-commit-times";
+ public static final String ENABLE_AUTO_PROPS = "enable-auto-props";
+ public static final String ENABLE_MAGIC_FILE = "enable-magic-file";
+ public static final String NO_UNLOCK = "no-unlock";
+ public static final String MIMETYPES_FILE = "mime-types-file";
+ public static final String PRESERVED_CF_EXTS = "preserved-conflict-file-exts";
+ public static final String INTERACTIVE_CONFLICTS = "interactive-conflicts";
+ public static final String MEMORY_CACHE_SIZE = "memory-cache-size";
+ public static final String DIFF_IGNORE_CONTENT_TYPE = "diff-ignore-content-type";
+
+ public static final String SECTION_TUNNELS = "tunnels";
+
+ public static final String SECTION_AUTO_PROPS = "auto-props";
+
+ public static final String SECTION_WORKING_COPY = "working-copy";
+ public static final String SQLITE_EXCLUSIVE = "exclusive-locking";
+ public static final String SQLITE_EXCLUSIVE_CLIENTS = "exclusive-locking-clients";
+ public static final String SQLITE_BUSY_TIMEOUT = "busy-timeout";
+
+ /**
+ * Returns a reference to the "servers" configuration category.
+ */
+ Category servers();
+
+ /*
+ * The following constants are section and option names from the
+ * "servers" configuration file.
+ */
+ public static final String SECTION_GROUPS = "groups";
+ public static final String SECTION_GLOBAL = "global";
+
+ public static final String HTTP_PROXY_HOST = "http-proxy-host";
+ public static final String HTTP_PROXY_PORT = "http-proxy-port";
+ public static final String HTTP_PROXY_USERNAME = "http-proxy-username";
+ public static final String HTTP_PROXY_PASSWORD = "http-proxy-password";
+ public static final String HTTP_PROXY_EXCEPTIONS = "http-proxy-exceptions";
+ public static final String HTTP_TIMEOUT = "http-timeout";
+ public static final String HTTP_COMPRESSION = "http-compression";
+ public static final String NEON_DEBUG_MASK = "neon-debug-mask";
+ public static final String HTTP_AUTH_TYPES = "http-auth-types";
+ public static final String SSL_AUTHORITY_FILES = "ssl-authority-files";
+ public static final String SSL_TRUST_DEFAULT_CA = "ssl-trust-default-ca";
+ public static final String SSL_CLIENT_CERT_FILE = "ssl-client-cert-file";
+ public static final String SSL_CLIENT_CERT_PASSWORD = "ssl-client-cert-password";
+ public static final String SSL_PKCS11_PROVIDER = "ssl-pkcs11-provider";
+ public static final String HTTP_LIBRARY = "http-library";
+ public static final String STORE_PASSWORDS = "store-passwords";
+ public static final String STORE_PLAINTEXT_PASSWORDS = "store-plaintext-passwords";
+ public static final String STORE_AUTH_CREDS = "store-auth-creds";
+ public static final String STORE_SSL_CLIENT_CERT_PP = "store-ssl-client-cert-pp";
+ public static final String STORE_SSL_CLIENT_CERT_PP_PLAINTEXT = "store-ssl-client-cert-pp-plaintext";
+ public static final String USERNAME = "username";
+ public static final String HTTP_BULK_UPDATES = "http-bulk-updates";
+ public static final String HTTP_MAX_CONNECTIONS = "http-max-connections";
+ public static final String HTTP_CHUNKED_REQUESTS = "http-chunked-requests";
+ public static final String SERF_LOG_COMPONENTS = "serf-log-components";
+ public static final String SERF_LOG_LEVEL = "serf-log-level";
+
+ /**
+ * "true" value in configuration. One of the values returned by
+ * {@link Category#getYesNoAsk}.
+ */
+ public static final String TRUE = "TRUE";
+
+ /**
+ * "false" value in configuration. One of the values returned by
+ * {@link Category#getYesNoAsk}.
+ */
+ public static final String FALSE = "FALSE";
+
+ /**
+ * "ask" value in configuration. One of the values returned by
+ * {@link Category#getYesNoAsk}.
+ */
+ public static final String ASK = "ASK";
+
+ /**
+ * Interface for reading and modifying configuration
+ * categories. Returned by {@link #config()} and
+ * {@link #servers()}.
+ */
+ public interface Category
+ {
+ /**
+ * Returns the value of a configuration option.
+ * @param section The section name
+ * @param option The option name
+ * @param defaultValue Return this if the option was not found.
+ */
+ String get(String section,
+ String option,
+ String defaultValue);
+
+ /**
+ * Returns the boolean value of a configuration option. The
+ * recognized representations are 'true'/'false', 'yes'/'no',
+ * 'on'/'off', '1'/'0'; case does not matter.
+ * @throws ClientException if the value cannot be parsed.
+ * @see #get(String,String,String)
+ */
+ boolean get(String section,
+ String option,
+ boolean defaultValue)
+ throws ClientException;
+
+ /**
+ * Returns the long integer value of a configuration option.
+ * @see #get(String,String,boolean)
+ */
+ long get(String section,
+ String option,
+ long defaultValue)
+ throws ClientException;
+
+ /**
+ * Returns the {@link Tristate} value of a configuration option.
+ * @param unknown The value used for {@link Tristate#Unknown}.
+ * @see #get(String,String,boolean)
+ */
+ Tristate get(String section,
+ String option,
+ String unknown,
+ Tristate defaultValue)
+ throws ClientException;
+
+ /**
+ * Check that the configuration option's value is true, false
+ * or "ask". The boolean representations are the same as those
+ * understood by {@link #get(String,String,boolean)}. If the
+ * option is not found, the default value will be parsed
+ * instead.
+ * @return {@link ISVNConfig#TRUE}, {@link ISVNConfig#FALSE}
+ * or {@link ISVNConfig#ASK}
+ * @throws ClientException if the either the value or the
+ * default cannot be parsed.
+ */
+ String getYesNoAsk(String section,
+ String option,
+ String defaultValue)
+ throws ClientException;
+
+ /**
+ * Set the value of a configuration option.
+ * @param section The section name
+ * @param option The option name
+ * @param value The value to set the option to; passing
+ * <code>null</code> will delete the option.
+ */
+ void set(String section,
+ String option,
+ String value);
+
+ /**
+ * Set the value of a configuration option to represent a boolean.
+ * @see #set(String,String,String)
+ */
+ void set(String section,
+ String option,
+ boolean value);
+
+ /**
+ * Set the value of a configuration option to represent a long integer.
+ * @see #set(String,String,String)
+ */
+ void set(String section,
+ String option,
+ long value);
+
+ /**
+ * @return the names of all the sections in the
+ * configuration category.
+ */
+ Iterable<String> sections();
+
+ /**
+ * Call <code>handler</code> once for each option in the
+ * configuration category.
+ */
+ void enumerate(String section, Enumerator handler);
+ }
+
+ /**
+ * Interface for {@link Category#enumerate} callback handlers.
+ */
+ public interface Enumerator
+ {
+ void option(String name, String value);
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java
new file mode 100644
index 0000000..f1daa83
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNEditor.java
@@ -0,0 +1,386 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * Commit/update/status editor interface.
+ * <p>
+ * <b>This interface is EXPERIMENTAL.
+ * It may change or be removed in a future version of JavaHL</b>
+ * @see <a href="http://svn.apache.org/repos/asf/subversion/trunk/subversion/include/private/svn_editor.h">svn_editor.h</a>
+ * for all restrictions on driving an editor.
+ * @since 1.9
+ */
+public interface ISVNEditor
+{
+ /**
+ * Release the native peer (should not depend on finalize),
+ * and abort the edit if it has not been completed yet.
+ */
+ void dispose();
+
+ /**
+ * Create a new directory at <code>relativePath</code>.
+ * The immediate parent of <code>relativePath</code> is expected to exist.
+ * <p>
+ * For descriptions of <code>properties</code> and
+ * <code>replacesRevision</code>, see #addFile().
+ * <p>
+ * A complete listing of the immediate children of
+ * <code>relativePath</code> that will be added subsequently is
+ * given in <code>children</code>. <code>children</code> is a
+ * collection of const strings, each giving the basename of an
+ * immediate child. It is an error to pass <code>null</code> for
+ * <code>children</code>; use an empty collection to indicate that
+ * the new directory will have no children.
+ *
+ * @throws ClientException
+ */
+ void addDirectory(String relativePath,
+ Iterable<String> children,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Create a new file at <code>relativePath</code>.
+ * The immediate parent of <code>relativePath</code> is expected to exist.
+ * <p>
+ * The file's contents are specified in <code>contents</code>
+ * which has a checksum matching <code>checksum</code>. Both
+ * values must be non-<code>null</code>.
+ * <p>
+ * Set the properties of the new file to
+ * <code>properties</code>. If no properties are being set on the
+ * new file, <code>properties</code> must be empty. It is an error
+ * to pass <code>null</code> for <code>properties</code>.
+ * <p>
+ * If this add is expected to replace a previously existing file,
+ * symlink or directory at <code>relativePath</code>, the revision
+ * number of the node to be replaced must be given in
+ * <code>replacesRevision</code>. Otherwise,
+ * <code>replacesRevision</code> must be
+ * Revision.SVN_INVALID_REVNUM.
+ * <p>
+ * <b>Note:</b> It is not allowed to call a "delete" followed by
+ * an "add" on the same path. Instead, an "add" with
+ * <code>replacesRevision</code> set accordingly <em>must</em> be used.
+ * <p>
+ * <b>Note:</b> The <code>contents</code> stream's lifetime must not
+ * extend beyond the scope of this function. An
+ * implementation <b>must</b> close the stream after
+ * consuming its contents.
+ *
+ * @throws ClientException
+ */
+ void addFile(String relativePath,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Create a new symbolic link at <code>relativePath</code>, with a
+ * link target of <code>target</code>. The immediate parent of
+ * <code>relativePath</code> is expected to exist.
+ *
+ * For descriptions of <code>properties</code> and
+ * <code>replacesRevision</code>, see #addFile().
+ *
+ * @throws ClientException
+ */
+ void addSymlink(String relativePath,
+ String target,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Create an "absent" node of kind <code>kind</code> at
+ * <code>relativePath</code>. The immediate parent of
+ * <code>relativePath</code> is expected to exist.
+ *
+ * For a description of <code>replacesRevision</code>, see #addFile().
+ *
+ * @throws ClientException
+ */
+ void addAbsent(String relativePath,
+ NodeKind kind,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Alter the properties of the directory at <code>relativePath</code>.
+ * <p>
+ * <code>revision</code> specifies the revision at which the
+ * receiver should expect to find this node. That is,
+ * <code>relativePath</code> at the start of the whole edit and
+ * <code>relativePath</code> at <code>revision</code> must lie
+ * within the same node-rev (aka location history segment). This
+ * information may be used to catch an attempt to alter and
+ * out-of-date directory. If the directory does not have a
+ * corresponding revision in the repository (e.g. it has not yet
+ * been committed), then <code>revision</code> should be
+ * Revision.SVN_INVALID_REVNUM.
+ * <p>
+ * If any changes to the set of children will be made in the
+ * future of the edit drive, then <code>children</code>
+ * <em>must</em> specify the resulting set of children. See
+ * #addDirectory() for the format of <code>children</code>. If
+ * not changes will be made, then NULL may be specified.
+ * <p>
+ * For a description of <code>properties</code>, see
+ * #addFile(). If no changes to the properties will be made
+ * (ie. only future changes to the set of children), then
+ * <code>properties</code> may be <code>null</code>.
+ *
+ * @throws ClientException
+ */
+ void alterDirectory(String relativePath,
+ long revision,
+ Iterable<String> children,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * Alter the contents and/or the properties of the file at
+ * <code>relativePath</code> with <code>revision</code> as its
+ * expected revision. See #alterDirectory() for more information
+ * about <code>revision</code>.
+ * <p>
+ * If <code>contents</code> is non-<code>null</code>, then the
+ * stream will be copied to the file, and its checksum must match
+ * <code>checksum</code> (which must also be
+ * non-<code>null</code>). If <code>contents</code> is
+ * <code>null</code>, then <code>checksum</code> must also be
+ * <code>null</code>, and no change will be applied to the file's
+ * contents.
+ * <p>
+ * If <code>properties</code> is non-<code>null</code>, then the
+ * properties will be applied.
+ * <p>
+ * For a description of <code>checksum</code> and
+ * <code>contents</code>, see #addFile().
+ * <p>
+ * This function allows <code>properties</code> to be
+ * <code>null</code>, but the parameter is otherwise described by
+ * #addFile().
+ * <p>
+ * <b>Note:</b> The <code>contents</code> stream's lifetime must not
+ * extend beyond the scope of this function. An
+ * implementation <b>must</b> close the stream after
+ * consuming its contents.
+ *
+ * @throws ClientException
+ */
+ void alterFile(String relativePath,
+ long revision,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * Alter the target and/or the properties of the symlink at
+ * <code>relativePath</code> with <code>revision</code> as its
+ * expected revision. See #alterDirectory() for more information
+ * about <code>revision</code>.
+ * <p>
+ * If <code>target</code> is non-<code>null</code>, then the
+ * symlink's target will be updated.
+ * <p>
+ * If <code>properties</code> is non-<code>null</code>, then the
+ * properties will be applied.
+ * <p>
+ * The target and/or the properties must be changed. It is an
+ * error to pass <code>null</code> for both <code>target</code>
+ * and <code>properties</code>.
+ * <p>
+ * This function allows <code>properties</code> to be
+ * <code>null</code>, but the parameter is otherwise described by
+ * #addFile().
+ *
+ * @throws ClientException
+ */
+ void alterSymlink(String relativePath,
+ long revision,
+ String target,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * Delete the existing node at <code>relativePath</code>, expected
+ * to be identical to revision <code>revision</code> of that path.
+ *
+ * @throws ClientException
+ */
+ void delete(String relativePath,
+ long revision)
+ throws ClientException;
+
+ /**
+ * Move the node at <code>sourceRelativePath</code> to
+ * <code>destinationRelativePath</code>.
+ * <p>
+ * For a description of <code>replacesRevision</code>, see #addFile().
+ * <p>
+ * <b>Note:</b> See the general instructions on paths for this API.
+ * Sice the <code>sourceRelativePath</code> argument must generally be
+ * able to reference any node in the repository, the implication
+ * is that the editor's root must be the repository root.
+ *
+ * @throws ClientException
+ */
+ void copy(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Move the node at <code>sourceRelativePath</code> to
+ * <code>destinationRelativePath</code>.
+ * <p>
+ * <code>sourceRevision</code> specifies the revision at which the
+ * receiver should expect to find this node. That is,
+ * <code>sourceRelativePath</code> at the start of the whole edit
+ * and<code>sourceRelativePath</code> at
+ * <code>sourceRevision</code> must lie within the same node-rev
+ * (aka history-segment). This is just like the #delete().
+ * <p>
+ * For a description of <code>replacesRevision</code>, see #addFile().
+ *
+ * @throws ClientException
+ */
+ void move(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * Signal that the edit has been completed successfully.
+ * After this method is called, the editor is considered closed.
+ *
+ * @throws ClientException
+ */
+ void complete() throws ClientException;
+
+ /**
+ * Signal that the edit transmission was not successful.
+ * After this method is called, the editor is considered closed.
+ *
+ * @throws ClientException
+ */
+ void abort() throws ClientException;
+
+
+ /**
+ * Callback interface for providing the base contents of a file
+ * that is being modified.
+ * @see ISVNRemote.getCommitEditor(Map,CommitCallback,Set,boolean,ISVNEditor.ProvideBaseCallback,ISVNEditor.ProvidePropsCallback,ISVNEditor.GetNodeKindCallback)
+ */
+ public interface ProvideBaseCallback
+ {
+ public static class ReturnValue
+ {
+ /**
+ * @param contents The base ({@link Revision#BASE}) contents
+ * of the file.
+ * @param revision The base revision number.
+ */
+ public ReturnValue(InputStream contents, long revision)
+ {
+ this.contents = contents;
+ this.revision = revision;
+ }
+
+ final InputStream contents;
+ final long revision;
+ }
+
+ /**
+ * Returns the base contents and revision number of the file.
+ * @param reposRelpath The repository path of the file,
+ * relative to the session base URL.
+ */
+ ReturnValue getContents(String reposRelpath);
+ }
+
+ /**
+ * Callback interface for providing the base properties of a file
+ * or directory that is being modified.
+ * @see ISVNRemote.getCommitEditor(Map,CommitCallback,Set,boolean,ISVNEditor.ProvideBaseCallback,ISVNEditor.ProvidePropsCallback,ISVNEditor.GetNodeKindCallback)
+ */
+ public interface ProvidePropsCallback
+ {
+ public static class ReturnValue
+ {
+ /**
+ * @param properties The base ({@link Revision#BASE}) properties
+ * of the file or directory.
+ * @param revision The base revision number.
+ */
+ public ReturnValue(Map<String, byte[]> properties, long revision)
+ {
+ this.properties = properties;
+ this.revision = revision;
+ }
+
+ final Map<String, byte[]> properties;
+ final long revision;
+ }
+
+ /**
+ * Returns the base properties and revision number of the file
+ * or directory.
+ * @param reposRelpath The repository path of the file or directory,
+ * relative to the session base URL.
+ */
+ ReturnValue getProperties(String reposRelpath);
+ }
+
+ /**
+ * Callback interface for providing the kind of the node that was
+ * the source of a copy.
+ * @see ISVNRemote.getCommitEditor(Map,CommitCallback,Set,boolean,ISVNEditor.ProvideBaseCallback,ISVNEditor.ProvidePropsCallback,ISVNEditor.GetNodeKindCallback)
+ */
+ public interface GetNodeKindCallback
+ {
+ /**
+ * Returns the kind of the node that was the source of a copy.
+ * @param reposRelpath The repository path of the node,
+ * relative to the session base URL.
+ * @param revision The copy-from revision.
+ */
+ NodeKind getKind(String reposRelpath, long revision);
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
new file mode 100644
index 0000000..69f8bd4
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
@@ -0,0 +1,836 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.io.OutputStream;
+
+/**
+ * Encapsulates an RA session object and related operations.
+ * @see <a href="http://svn.apache.org/repos/asf/subversion/trunk/subversion/include/svn_ra.h">svn_ra.h</a>,
+ * the documentation of the <code>svn_ra_open</code> function.
+ * @since 1.9
+ */
+public interface ISVNRemote
+{
+ /**
+ * Release the native peer (should not depend on finalize).
+ * Also invalidates any existing editors related to this session.
+ */
+ void dispose();
+
+ /**
+ * Cancel the active operation, including any ongoing edits.
+ * @throws ClientException
+ */
+ void cancelOperation() throws ClientException;
+
+ /** Change the URL of the session to point to a new path in the
+ * same repository.
+ *<p>
+ * <b>Note:</b> The operation fails if the URL has a different
+ * repository root than the current session URL.
+ *<p>
+ * @throws ClientException
+ */
+ void reparent(String url) throws ClientException;
+
+ /**
+ * Get the current session URL.
+ * @throws ClientException
+ */
+ String getSessionUrl() throws ClientException;
+
+ /**
+ * Return a path relative to the current session URL.
+ * @param url Must be a child of the current session URL.
+ * @throws ClientException
+ */
+ String getSessionRelativePath(String url) throws ClientException;
+
+ /**
+ * Return a path relative to the repository root URL associated with
+ * current session URL.
+ * @param url Must be a child of the repository root URL.
+ * @throws ClientException
+ */
+ String getReposRelativePath(String url) throws ClientException;
+
+ /**
+ * Get the UUID of the session's repository.
+ * @throws ClientException
+ */
+ String getReposUUID() throws ClientException;
+
+ /**
+ * Get the root URL of the session's repository.
+ * @throws ClientException
+ */
+ String getReposRootUrl() throws ClientException;
+
+ /**
+ * Get the latest revision number from the session's repository.
+ * @throws ClientException
+ */
+ long getLatestRevision() throws ClientException;
+
+ /**
+ * Get the latest revision number at the given time
+ * from the session's repository.
+ * @throws ClientException
+ */
+ long getRevisionByDate(Date date) throws ClientException;
+
+ /**
+ * Get the latest revision number at the given time, expressed as
+ * the number of microseconds since the epoch, from the session's
+ * repository.
+ * @throws ClientException
+ */
+ long getRevisionByTimestamp(long timestamp) throws ClientException;
+
+ /**
+ * Change the value of an unversioned property.
+ *<p>
+ * <b>Note:</b> If the server has Capability.atomic_revprops and
+ * <code>oldValue</code> is not <code>null</code>, and the present
+ * value of the propery is not <code>oldValue</code> (e.g., if
+ * another client changed the property), then the operation will
+ * fail.
+ *<p>
+ * <b>Note:</b> If the server does not adveritse
+ * Capability.atomic_revprops, then <code>oldValue</code>
+ * <em>must</em> be <code>null</code>.
+ *<p>
+ * @param revision The revision to which the propery is attached
+ * @param propertyName The name of the propery
+ * @param oldValue The previous value of the property (see note below)
+ * @param newValue The new value of the property. If <code>newValue</code>
+ * is <code>null</code>, the property will be deleted.
+ * @throws IllegalArgumentException if <code>oldValue</code> is not
+ * <code>null</code> and the server does not advertise the
+ * atomic_revprops capability.
+ * @throws ClientException
+ */
+ void changeRevisionProperty(long revision,
+ String propertyName,
+ byte[] oldValue,
+ byte[] newValue)
+ throws ClientException;
+
+ /**
+ * Return the set of unversioned properties set on <code>revision</code>
+ * in the session's repository.
+ * @throws ClientException
+ */
+ Map<String, byte[]> getRevisionProperties(long revision)
+ throws ClientException;
+
+ /**
+ * Return the value of unversioned property <code>propertyName</code>
+ * in <code>revision</code> in the session's repository.
+ * Returns <code>null</code> if the property does not exist.
+ * @throws ClientException
+ */
+ byte[] getRevisionProperty(long revision, String propertyName)
+ throws ClientException;
+
+ /**
+ * Return an editor for committing changes to the session's
+ * repository, setting the revision properties from
+ * <code>revisionProperties</code>. The revisions being committed
+ * against are passed to the editor functions. The root of the commit
+ * is the session's URL.
+ * <p>
+ * <code>revisionProperties</code> is a hash mapping property names to
+ * property values. The commit log message is expected to be in the
+ * {@link Property#REV_LOG} element. <code>revisionProperties</code>
+ * can not contain either of {@link Property#REV_DATE} or
+ * {@link Property#REV_AUTHOR}.
+ * <p>
+ * Before {@link ISVNEditor#complete()} returns, but after the commit
+ * has succeeded, it will invoke <code>commitCallback</code> (if not
+ * <code>null</code>) with filled-in {@link CommitInfo}. If
+ * <code>commitCallback</code> returns an error, that error will be
+ * returned from {@link ISVNEditor#complete()}, otherwise
+ * {@link ISVNEditor#complete()} will return successfully (unless it
+ * encountered an error before invoking <code>commitCallback</code>).
+ * The callback will not be called if the commit was a no-op
+ * (i.e., nothing was committed).
+ * <p>
+ * <code>lockTokens</code>, if not <code>null</code>, is a hash
+ * mapping paths (relative to the session's URL) to lock tokens. The
+ * server checks that the correct token is provided for each
+ * committed, locked path. <code>lockTokens</code> must live during
+ * the whole commit operation.
+ * <p>
+ * If <cpde>keepLocks</code> is <cpde>true</code>, then do not release
+ * locks on committed objects. Else, automatically release such
+ * locks.
+ * <p>
+ * The callbacks <code>getBase</code>, <code>getProps</code> and
+ * <code>getCopyfromKind</code> are invoked by the editor to fetch
+ * the contents, preoprties and copyfrom kind of an entry during
+ * the commit drive. They may be <code>null</code>; in that case,
+ * the commit may be less efficient because the client will not be
+ * able to delta-compress the data sent to the server, and more
+ * server connections may have to be opened.
+ * <p>
+ * The caller may not perform any remote operations using this session
+ * before finishing the edit.
+ * @throws ClientException
+ */
+ ISVNEditor getCommitEditor(Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks,
+ ISVNEditor.ProvideBaseCallback getBase,
+ ISVNEditor.ProvidePropsCallback getProps,
+ ISVNEditor.GetNodeKindCallback getCopyfromKind)
+ throws ClientException;
+
+ /**
+ * Like {@link #getCommitEditor(Map,CommitCallback<Set,boolean,
+ * ISVNEditor.ProvideBaseCallback,ISVNEditor.ProvidePropsCallback,
+ * ISVNEditor.GetNodeKindCallback)}, but with all callbacks set to
+ * <code>null</code>.
+ */
+ ISVNEditor getCommitEditor(Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks)
+ throws ClientException;
+
+ /**
+ * Fetch the contents and properties of file <code>path</code> at
+ * <code>revision</code>. <code>revision</code> may be
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * indicating that the HEAD revision should be
+ * used. <code>path</code> is interpreted relative to the
+ * session's URL.
+ * <p>
+
+ * If <code>revision</code> is
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}.
+ * returns the actual revision that was retrieved; otherwise
+ * returns <code>revision</code>.
+ * <p>
+ * If <code>contents</code> is not <code>null</code>, push the
+ * contents of the file into the stream.
+ * <p>
+ * If <code>properties</code> is not <code>null</code>, set
+ * <code>properties</code> to contain the properties of the file. This
+ * means <em>all</em> properties: not just ones controlled by the
+ * user and stored in the repository, but immutable ones generated
+ * by the SCM system itself (e.g. 'wcprops', 'entryprops',
+ * etc.). Any existing contents of the <code>properties</code> map
+ * will be discarded by calling {@link java.util.Map#clear()}, if the
+ * map implementation supports that operation.
+ * <p>
+ * The implementations of <code>contents</code> and
+ * <code>properties</code> may not perform any ISVNRemote
+ * operations using this session.
+ * @return The revision of the file that was retrieved.
+ * @throws ClientException
+ */
+ long getFile(long revision, String path,
+ OutputStream contents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * Fetch the contents and properties of directory <code>path</code>
+ * at <code>revision</code>. <code>revision</code> may be
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM},
+ * indicating that the HEAD revision should be
+ * used. <code>path</code> is interpreted relative to the
+ * session's URL.
+ * <p>
+ * If <code>dirents</code> is not <code>null</code>, it will
+ * contain all the entries of the directory; the keys will be the
+ * entry basenames. Any existing contente of the
+ * <code>dirents</code> collection will be discarded by calling
+ * {@link java.util.Map#clear()}, if the collection implementation
+ * supports that operation.
+ * <p>
+ * <code>direntFields</code> controls which portions of the DirEntry
+ * objects are filled in. To have them completely filled in, just pass
+ * DirEntry.Fields.all, othewise pass a bitwise OR of any of the
+ * DirEntry.Fields flags you would like to have.
+ * <p>
+ * If <code>properties</code> is not <code>null</code>, set
+ * <code>properties</code> to contain the properties of the directory.
+ * This means <em>all</em> properties: not just ones controlled by the
+ * user and stored in the repository, but immutable ones generated
+ * by the SCM system itself (e.g. 'wcprops', 'entryprops',
+ * etc.). Any existing contents of the <code>properties</code> map
+ * will be discarded by calling {@link java.util.Map#clear()}, if the
+ * map implementation supports that operation.
+ * <p>
+ * The implementations of <code>dirents</code> and
+ * <code>properties</code> may not perform any ISVNRemote
+ * operations using this session.
+ * @return The revision of the directory that was retrieved.
+ * @throws ClientException
+ */
+ long getDirectory(long revision, String path,
+ int direntFields,
+ Map<String, DirEntry> dirents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * Retrieve the merginfo for <code>paths</code>, whose elements
+ * are relative to the session's URL. The request will fail if any
+ * one of <code>paths</code> does not exist in the given
+ * <code>revision</code>.
+ * <p>
+ * <b>Note:</b> If the server doesn't support retrieval of
+ * mergeinfo (which can happen even for file:// URLs, if the
+ * repository itself hasn't been upgraded), an unsupported feature
+ * exception is thrown in preference to any other error that might
+ * otherwise be returned.
+ *
+ * @param revision The revision to look for <code>paths</code>
+ * in. Defaults to the youngest revision when
+ * {@link Revision#SVN_INVALID_REVNUM}.
+ * @param inherit Indicates whether explicit, explicit or
+ * inherited, or only inherited mergeinfo for
+ * <code>paths</code> is retrieved.
+ * @param includeDescendants When <code>true</code>, additionally
+ * return the mergeinfo for any descendant of any element
+ * of <code>paths</code> which has the mergeinfo explicitly
+ * set on it. (Note that inheritance is only taken into
+ * account for the elements in <code>paths</code>;
+ * descendants of the elements in <code>paths</code> which
+ * get their mergeinfo via inheritance are not included.)
+ *
+ * @return A dictionary of {@link Mergeinfo} objects for the given
+ * <code>paths</code>, or <code>null</code> if no
+ * mergeinfo is available..
+ * @throws ClientException
+ */
+ Map<String, Mergeinfo> getMergeinfo(Iterable<String> paths, long revision,
+ Mergeinfo.Inheritance inherit,
+ boolean includeDescendants)
+ throws ClientException;
+
+ // TODO: update
+ // TODO: switch
+
+ /**
+ * Ask for a description of the status of a working copy with
+ * respect to <code>revision</code> of the session's repository,
+ * or the HEAD revision if <code>revision</code> is
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}.
+ * <p>
+ * The client begins by providing a <code>receiver</code> to
+ * the remote session; this object must contain knowledge of where
+ * the change will begin in the working copy.
+ * <p>
+ * In return, the client receives an {@link ISVNReporter}
+ * instance, which it uses to describe its working copy by making
+ * calls to its methods.
+ * <p>
+ * When finished, the client calls {@link ISVNReporter#finishReport}.
+ * This results in <code>receiver</code> being called once for
+ * every path in the working copy that is different from the
+ * repository. <code>statusTarget</code> is an optional single
+ * path component that restricts the scope of the status report to
+ * an entry in the directory represented by the session's URL, or
+ * empty if the entire directory is meant to be examined.
+ * <p>
+ * Get status as deeply as <code>depth</code> indicates. If
+ * <code>depth</code> is
+ * {@link org.apache.subversion.javahl.types.Depth#unknown},
+ * get the status down to the ambient depth of the working
+ * copy. If <code>depth</code> is deeper than the working copy,
+ * include changes that would be needed to populate the working
+ * copy to that depth.
+ * <p>
+ * The caller may not perform any operations using this session
+ * before finishing the report, and may not perform any operations
+ * using this session from within the implementation of
+ * <code>receiver</code>.
+ * <p>
+ * <b>Note:</b> The reporter provided by this function does
+ * <em>not</em> supply copy-from information to the editor
+ * methods.
+ * <p>
+ * <b>Note:</b> In order to prevent pre-1.5 servers from doing
+ * more work than needed, and sending too much data back, a
+ * pre-1.5 'recurse' directive may be sent to the server, based on
+ * <code>depth</code>.
+ * @throws ClientException
+ */
+ ISVNReporter status(String statusTarget,
+ long revision, Depth depth,
+ RemoteStatus receiver)
+ throws ClientException;
+
+ // TODO: diff
+
+ /**
+ * Invoke <code>callback</code> for each log message from
+ * <code>startRevision</code> to <code>endRevision</code>.
+ * <code>startRevision</code> may be greater or less than
+ * <code>endRevision</code>; this just controls whether the log
+ * messages are processed in descending or ascending revision
+ * number order.
+ * <p>
+ * If <code>startRevision</code> or <code>endRevision</code> is
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM},
+ * the HEAD revision is uses for that argument. If eiter is an
+ * invaild non-existent revision, an error will be returned.
+ * <p>
+ * If <code>paths</code> is not <code>null</code> and has one or
+ * more elements, then only show revisions in which at least one
+ * of <code>paths</code> was changed (i.e., if file, text or props
+ * changed; if dir, props changed or an entry was added or
+ * deleted).
+ * <p>
+ * If <code>limit</code> is non-zero only invoke @a receiver on
+ * the first code>limit</code> logs.
+ * <p>
+ * If <code>discoverPath</code> is set, then each call to
+ * <code>callback</code> contains the list of changed paths in that
+ * revision.
+ * <p>
+ * If <code>strictNodeHistory</code> is set, copy history will not be
+ * traversed (if any exists) when harvesting the revision logs for
+ * each path.
+ * <p>
+ * If <code>includeMergedRevisions</code> is set, log information
+ * for revisions which have been merged to @a targets will also be
+ * returned.
+ * <p>
+ * If <code>revisionProperties</code> is <code>null</code>,
+ * retrieve all revision properties; otherwise, retrieve only the
+ * revision properties contained in the set (i.e. retrieve none if
+ * the set is empty).
+ * <p>
+ * The implementation of <code>callback</code> may not perform any
+ * operations using this session. If the invocation of
+ * <code>callback</code> throws an exception, the operation will
+ * stop.
+ * <p>
+ * <b>Note:</b> If <code>paths</code> is <code>null</code> or
+ * empty, the result depends on the server. Pre-1.5 servers will
+ * send nothing; 1.5 servers will effectively perform the log
+ * operation on the root of the repository. This behavior may be
+ * changed in the future to ensure consistency across all
+ * pedigrees of server.
+ * <p>
+ * <b>Note:</b> Pre-1.5 servers do not support custom revprop
+ * retrieval; <code>revisionProperties</code> is <code>null</code>
+ * or contains a revprop other than svn:author, svn:date, or
+ * svn:log, an not-implemented error is returned.
+ *
+ * @throws ClientException
+ */
+ void getLog(Iterable<String> paths,
+ long startRevision, long endRevision, int limit,
+ boolean strictNodeHistory, boolean discoverPath,
+ boolean includeMergedRevisions,
+ Iterable<String> revisionProperties,
+ LogMessageCallback callback)
+ throws ClientException;
+
+ /**
+ * Return the kind of the node in <code>path</code> at
+ * <code>revision</code>.
+ * @param path A path relative to the sessionn URL
+ * @throws ClientException
+ */
+ NodeKind checkPath(String path, long revision)
+ throws ClientException;
+
+ /**
+ * Return the directory entry object for <code>path</code> at
+ * <code>revision</code>.
+ * @param path A path relative to the sessionn URL
+ * @return A directory entry obeject, or <code>null</code> if
+ * <code>path</code> at <code>revision</code> does not exist.
+ * @throws ClientException
+ */
+ DirEntry stat(String path, long revision)
+ throws ClientException;
+
+ /**
+ * Find the locations of the object identified by
+ * <code>path</code> and <code>pegRevision</code> in the
+ * repository at the given revisions. If the object does not exist
+ * in a given revision, that revision will be ignored.
+ * <p>
+ * <b>Note:</b> None of the parameters may be NULL.
+ * @param path A path relative to the session URL
+ * @param pegRevision The peg revision to use for locating the object
+ * @param locationRevisions The set of revisions to find locations for
+ * @throws ClientException
+ */
+ Map<Long, String> getLocations(String path, long pegRevision,
+ Iterable<Long> locationRevisions)
+ throws ClientException;
+
+ /**
+ * The object returned from {@link #getLocationSegments}.
+ */
+ public static class LocationSegment implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change
+ // made to this class.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Private constructor called by the native implementation.
+ */
+ private LocationSegment(String path,
+ long startRevision,
+ long endRevision)
+ {
+ this.path = path;
+ this.startRevision = startRevision;
+ this.endRevision = endRevision;
+ }
+
+ /**
+ * @return The repository-relative path of the obejct in this
+ * history segment.
+ */
+ public String getPath() { return path; }
+
+ /**
+ * @return The start revision of the history segment.
+ */
+ public long getStartRevision() { return startRevision; }
+
+ /**
+ * @return The end revision of the history segment.
+ */
+ public long getEndRevision() { return endRevision; }
+
+ private String path;
+ private long startRevision;
+ private long endRevision;
+ }
+
+ /**
+ * Call <code>handler</code> for every segment in the location
+ * history of <code>path</code> at <code>pegRevision</code>,
+ * working backwards in time from <code>startRevision</code> to
+ * <code>endRevision</code>.
+ *
+ * @param path A session-relative path.
+ * @param pegRevision The peg revision to find <code>path</code> in.
+ * @param startRevision The upper bound of the revision range. Use
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * to indicate HEAD.
+ * @param endRevision The lower bound of the revision range. Use
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * to trace the history of the object to its origin.
+ * @param handler The callback handler.
+ * @throws ClientException
+ */
+ void getLocationSegments(String path,
+ long pegRevision,
+ long startRevision,
+ long endRevision,
+ RemoteLocationSegmentsCallback handler)
+ throws ClientException;
+
+ /**
+ * Return a list of segments in the location history of <code>path</code>
+ * at <code>pegRevision</code>, working backwards in time from
+ * <code>startRevision</code> to <code>endRevision</code>.
+ *
+ * @param path A session-relative path.
+ * @param pegRevision The peg revision to find <code>path</code> in.
+ * @param startRevision The upper bound of the revision range. Use
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * to indicate HEAD.
+ * @param endRevision The lower bound of the revision range. Use
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * to trace the history of the object to its origin.
+ * @throws ClientException
+ */
+ List<LocationSegment> getLocationSegments(String path,
+ long pegRevision,
+ long startRevision,
+ long endRevision)
+ throws ClientException;
+
+ /**
+ * The object returned by {@link #getFileRevisions}.
+ */
+ public final class FileRevision implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change
+ // made to this class.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Private constructor called by the native implementation.
+ */
+ private FileRevision(String path, long revision,
+ boolean resultOfMerge,
+ Map<String, byte[]> revisionProperties,
+ Map<String, byte[]> propertiesDelta,
+ boolean textDelta)
+ {
+ this.path = path;
+ this.revision = revision;
+ this.resultOfMerge = resultOfMerge;
+ this.revisionProperties = revisionProperties;
+ this.propertiesDelta = propertiesDelta;
+ this.textDelta = textDelta;
+ }
+
+ /**
+ * @return The path of the file in this revision.
+ */
+ public String getPath() { return path; }
+
+ /**
+ * @return The revision associated with the path.
+ */
+ public long getRevision() { return revision; }
+
+ /**
+ * @return A flag indicating that this revision was the result
+ * of a merge.
+ */
+ public boolean isResultOfMerge() { return resultOfMerge; }
+
+ /**
+ * @return The list of revision properties.
+ */
+ public Map<String, byte[]> getRevisionProperties()
+ {
+ return revisionProperties;
+ }
+
+ /**
+ * @return The changes that were made to the file's properties
+ * in this revision. This map will contain only added,
+ * modified and deleted properties. Deleted properties will
+ * have <code>null</code> values.
+ */
+ public Map<String, byte[]> getPropertiesDelta()
+ {
+ return propertiesDelta;
+ }
+
+ /**
+ * @return A flag indicating that this revision has a text delta.
+ */
+ public boolean hasTextDelta() { return textDelta; }
+
+ private String path;
+ private long revision;
+ private boolean resultOfMerge;
+ private Map<String, byte[]> revisionProperties;
+ private Map<String, byte[]> propertiesDelta;
+ private boolean textDelta;
+ }
+
+ /**
+ * Call <code>handler</code> for each of a subset of the
+ * interesting revisions of a file <code>path</code> as seen in
+ * revision <code>endRevision</code>.
+ * <p>
+ * If there is an interesting revision of the file that is less
+ * than or equal to <code>startRevision</code>, the iteration will
+ * begin at that revision. Otherwise the iteration will begin at
+ * the first revision of the file in the repository, which has to
+ * be less than or equal to <code>endRevision</code>. Note that
+ * if the function succeeds, <code>handler</code> will be called
+ * at least once.
+ * <p>
+ * <b>Note:</b> This functionality is not available in pre-1.1
+ * servers. If the server doesn't implement it, an alternative
+ * (but much slower) implementation based on {@link #getLog} is
+ * used.
+ * <p>
+ * <b>Note:</b> With Subversion 1.8 and newer servers this
+ * function supports reversion of the revision range for when
+ * <code>includeMergedRevisions</code> is <code>false</code>.
+ *
+ * @param path A path relative to the session URL.
+ * @param startRevision The lower bound of the revision interval.
+ * @param endRevision the upper bound of the revision interval.
+ * @param includeMergedRevisions When <code>true</code>, revisions that
+ * contributed to a merge are included in the result.
+ * @throws ClientException
+ */
+ void getFileRevisions(String path,
+ long startRevision, long endRevision,
+ boolean includeMergedRevisions,
+ RemoteFileRevisionsCallback handler)
+ throws ClientException;
+
+ /**
+ * Retrieve a subset of the interesting revisions of a file
+ * <code>path</code> as seen in revision <code>endRevision</code>.
+ * <p>
+ * If there is an interesting revision of the file that is less
+ * than or equal to <code>startRevision</code>, the iteration will
+ * begin at that revision. Otherwise the iteration will begin at
+ * the first revision of the file in the repository, which has to
+ * be less than or equal to <code>endRevision</code>. Note that
+ * if the function succeeds, the returned list will contain at
+ * least one element.
+ * <p>
+ * <b>Note:</b> This functionality is not available in pre-1.1
+ * servers. If the server doesn't implement it, an alternative
+ * (but much slower) implementation based on {@link #getLog} is
+ * used.
+ * <p>
+ * <b>Note:</b> With Subversion 1.8 and newer servers this
+ * function supports reversion of the revision range for when
+ * <code>includeMergedRevisions</code> is <code>false</code>.
+ *
+ * @param path A path relative to the session URL.
+ * @param startRevision The lower bound of the revision interval.
+ * @param endRevision the upper bound of the revision interval.
+ * @param includeMergedRevisions When <code>true</code>, revisions that
+ * contributed to a merge are included in the result.
+ * @throws ClientException
+ */
+ List<FileRevision> getFileRevisions(String path,
+ long startRevision, long endRevision,
+ boolean includeMergedRevisions)
+ throws ClientException;
+
+
+ // TODO: lock
+ // TODO: unlock
+ // TODO: getLock
+
+ /**
+ * Return a dictionary containing all locks on or below the given path.
+ * <p>
+ * <b>Note:</b> It is not considered an error if <code>path</code> does
+ * not exist in HEAD. Such a search will simply return no locks.
+ * <p>
+ * <b>Note:</b>This functionality is not available in pre-1.2 servers.
+ * @param path A path relative to the sessionn URL
+ * @param depth The recursion depth
+ * @throws ClientException
+ */
+ Map<String, Lock> getLocks(String path, Depth depth)
+ throws ClientException;
+
+ // TODO: replayRange
+ // TODO: replay
+ // TODO: getDeletedRevision
+ // TODO: getInheritedProperties
+
+ /**
+ * Check if the server associated with this session has
+ * the given <code>capability</code>.
+ * @throws ClientException
+ */
+ boolean hasCapability(Capability capability) throws ClientException;
+
+ /**
+ * Enumeration of known capabilities of the repository and server.
+ */
+ public enum Capability
+ {
+ /**
+ * The capability of understanding operation depth.
+ * @since 1.5
+ */
+ depth ("depth"),
+
+ /**
+ * The capability of doing the right thing with merge-tracking
+ * information.
+ * @since 1.5
+ */
+ mergeinfo ("mergeinfo"),
+
+ /**
+ * The capability of retrieving arbitrary revprops in #getLog().
+ * @since 1.5
+ */
+ log_revprops ("log-revprops"),
+
+ /**
+ * The capability of replaying a directory in the
+ * repository (partial replay).
+ * @since 1.5
+ */
+ partial_replay ("partial-replay"),
+
+ /**
+ * The capability of including revision properties in a commit.
+ * @since 1.5
+ */
+ commit_revprops ("commit-revprops"),
+
+ /**
+ * The capability of specifying (and atomically verifying) expected
+ * preexisting values when modifying revprops.
+ * @since 1.7
+ */
+ atomic_revprops ("atomic-revprops"),
+
+ /**
+ * The capability to get inherited properties.
+ * @since 1.8
+ */
+ inherited_props ("inherited-props"),
+
+ /**
+ * The capability of a server to automatically ephemeral
+ * transaction properties.
+ * @since 1.8
+ */
+ ephemeral_txnprops ("ephemeral-txnprops"),
+
+ /**
+ * The capability of a server to walk revisions backwards in
+ * #getFileRevisions().
+ * @since 1.8
+ */
+ get_file_revs_reversed ("get-file-revs-reversed");
+
+ private Capability(String token)
+ {
+ this.token = token;
+ }
+
+ public String toString()
+ {
+ return token;
+ }
+
+ private String token;
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java
new file mode 100644
index 0000000..533a8fe
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReporter.java
@@ -0,0 +1,162 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+/**
+ * The update Reporter.
+ * <p>
+ * An interface which allows a working copy to describe a subset (or
+ * possibly all) of its working-copy to a remote session, for the
+ * purposes of an update, switch, status, or diff operation.
+ * <p>
+ * Paths for report calls are relative to the target (not the anchor)
+ * of the operation. Report calls must be made in depth-first order:
+ * parents before children, all children of a parent before any
+ * siblings of the parent. The first report call must be a setPath
+ * with an empty <code>path</code> argument and a valid revision. (If
+ * the target of the operation is locally deleted or missing, use the
+ * anchor's revision.) If the target of the operation is deleted or
+ * switched relative to the anchor, follow up the initial setPath call
+ * with a linkPath or deletePath call with an empty <code>path</code>
+ * argument to indicate that. In no other case may there be two
+ * report descriptions for the same path. If the target of the
+ * operation is a locally added file or directory (which previously
+ * did not exist), it may be reported as having revision 0 or as
+ * having the parent directory's revision.
+ *
+ * @since 1.9
+ */
+public interface ISVNReporter
+{
+ /**
+ * Release the native peer (should not depend on finalize),
+ * and abort the report if it has not been completed yet.
+ */
+ void dispose();
+
+ /**
+ * Describe a working copy <code>path</code> as being at a
+ * particular <code>revision</code> and having the given
+ * <code>depth</code>.
+ * <p>
+ * <code>revision</code> may be
+ * {@link org.apache.subversion.javahl.types.Revision#SVN_INVALID_REVNUM}
+ * if (for example) <code>path</code> represents a locally-added
+ * path with no revision number, or <code>depth</code> is
+ * {@link org.apache.subversion.javahl.types.Depth#exclude}.
+ * <p>
+ * <code>path</code> may not be underneath a path on which
+ * setPath() was previously called with
+ * {@link org.apache.subversion.javahl.types.Depth#exclude}
+ * in this report.
+ * <p>
+ * If <code>startEmpty</code> is set and <code>path</code> is a
+ * directory, the implementor should assume the directory has no
+ * entries or properties.
+ * <p>
+ * This will <em>override</em> any previous setPath() calls made
+ * on parent paths. <code>path</code> is relative to the URL of
+ * the remote session that created this reporter instance.
+ * <p>
+ * If <code>lockToken</code> is not <code>null</code>, it is the
+ * lock token for <code>path</code> in the working copy.
+ * @throws ClientException
+ */
+ void setPath(String path,
+ long revision,
+ Depth depth,
+ boolean startEmpty,
+ String lockToken)
+ throws ClientException;
+
+ /**
+ * Describe a working copy <code>path</code> as missing.
+ * <p>
+ * <code>path</code> may not be underneath a path on which
+ * setPath() was previously called with
+ * {@link org.apache.subversion.javahl.types.Depth#exclude}
+ * in this report.
+ * @throws ClientException
+ */
+ void deletePath(String path) throws ClientException;
+
+ /**
+ * Like {@link #setPath setPath()},
+ * but differs in that <code>path</code> in the working copy
+ * (relative to the root of the report driver) isn't a reflection
+ * of <code>path</code> in the repository (relative to the URL
+ * specified when opening the remote session), but is instead a
+ * reflection of a different repository <code>url</code> at
+ * <code>revision</code>, and has depth <code>depth</code>.
+ * <p>
+ * <code>path</code> may not be underneath a path on which
+ * setPath() was previously called with
+ * {@link org.apache.subversion.javahl.types.Depth#exclude}
+ * in this report.
+ * <p>
+ * If <code>startEmpty</code> is set and <code>path</code> is a
+ * directory, the implementor should assume the directory has no
+ * entries or properties.
+ * <p>
+ * If <code>lockToken</code> is not <code>null</code>, it is the
+ * lock token for <code>path</code> in the working copy.
+ * @throws ClientException
+ */
+ void linkPath(String url,
+ String path,
+ long revision,
+ Depth depth,
+ boolean startEmpty,
+ String lockToken)
+ throws ClientException;
+
+ /**
+ * The report driver calls this when the state report is finished.
+ * Any directories or files not explicitly "set" are assumed to be
+ * at the baseline revision originally passed into do_update(). No
+ * other reporting functions, including {@link abortReport()},
+ * should be called after calling this function.
+ *
+ * @return The target revision of the resulting editor drive. In
+ * the case of {@link ISVNRemote#status}, this is the
+ * revision against which the status call was performed;
+ * in the case of {@link ISVNRemote#update}, it is the
+ * revision updated to.
+ *
+ * @throws ClientException
+ */
+ long finishReport() throws ClientException;
+
+ /**
+ * If an error occurs during a report, this routine should cause
+ * the filesystem transaction to be aborted and cleaned up. No
+ * other reporting functions should be called after calling this
+ * function.
+ * @throws ClientException
+ */
+ void abortReport() throws ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java
index 2fc28c2..80c5a33 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java
@@ -29,133 +29,175 @@ import java.io.InputStream;
import java.io.File;
import org.apache.subversion.javahl.callback.ReposNotifyCallback;
+import org.apache.subversion.javahl.callback.ReposVerifyCallback;
import org.apache.subversion.javahl.callback.ReposFreezeAction;
import org.apache.subversion.javahl.types.*;
public interface ISVNRepos {
- /**
- * interface to receive the messages
- */
- public static interface MessageReceiver
- {
- /**
- * receive one message line
- * @param message one line of message
- */
- public void receiveMessageLine(String message);
- }
-
- /**
- * release the native peer (should not depend on finalize)
- */
- public abstract void dispose();
-
- /**
- * Filesystem in a Berkeley DB
- */
- public static final String BDB = "bdb";
- /**
- * Filesystem in the filesystem
- */
- public static final String FSFS = "fsfs";
-
- /**
- * @return Version information about the underlying native libraries.
- */
- public abstract Version getVersion();
-
- /**
- * create a subversion repository.
- * @param path the path where the repository will been
- * created.
- * @param disableFsyncCommit disable to fsync at the commit (BDB).
- * @param keepLog keep the log files (BDB).
- * @param configPath optional path for user configuration files.
- * @param fstype the type of the filesystem (BDB or FSFS)
- * @throws ClientException throw in case of problem
- */
- public abstract void create(File path, boolean disableFsyncCommit,
- boolean keepLog, File configPath, String fstype)
- throws ClientException;
-
- /**
- * deltify the revisions in the repository
- * @param path the path to the repository
- * @param start start revision
- * @param end end revision
- * @throws ClientException throw in case of problem
- */
- public abstract void deltify(File path, Revision start, Revision end)
- throws ClientException;
-
- /**
- * dump the data in a repository
- * @param path the path to the repository
- * @param dataOut the data will be outputed here
- * @param start the first revision to be dumped
- * @param end the last revision to be dumped
- * @param incremental the dump will be incremantal
- * @param useDeltas the dump will contain deltas between nodes
- * @param callback the callback to recieve notifications
- * @throws ClientException throw in case of problem
- */
- public abstract void dump(File path, OutputStream dataOut,
+ /**
+ * interface to receive the messages
+ */
+ public static interface MessageReceiver
+ {
+ /**
+ * receive one message line
+ * @param message one line of message
+ */
+ public void receiveMessageLine(String message);
+ }
+
+ /**
+ * release the native peer (should not depend on finalize)
+ */
+ public abstract void dispose();
+
+ /**
+ * Filesystem in a Berkeley DB
+ */
+ public static final String BDB = "bdb";
+ /**
+ * Filesystem in the filesystem
+ */
+ public static final String FSFS = "fsfs";
+
+ /**
+ * @return Version information about the underlying native libraries.
+ */
+ public abstract Version getVersion();
+
+ /**
+ * create a subversion repository.
+ * @param path the path where the repository will been
+ * created.
+ * @param disableFsyncCommit disable to fsync at the commit (BDB).
+ * @param keepLog keep the log files (BDB).
+ * @param configPath optional path for user configuration files.
+ * @param fstype the type of the filesystem (BDB or FSFS)
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void create(File path, boolean disableFsyncCommit,
+ boolean keepLog, File configPath, String fstype)
+ throws ClientException;
+
+ /**
+ * deltify the revisions in the repository
+ * @param path the path to the repository
+ * @param start start revision
+ * @param end end revision
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void deltify(File path, Revision start, Revision end)
+ throws ClientException;
+
+ /**
+ * dump the data in a repository
+ * @param path the path to the repository
+ * @param dataOut the data will be outputed here
+ * @param start the first revision to be dumped
+ * @param end the last revision to be dumped
+ * @param incremental the dump will be incremantal
+ * @param useDeltas the dump will contain deltas between nodes
+ * @param callback the callback to receive notifications
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void dump(File path, OutputStream dataOut,
Revision start, Revision end, boolean incremental,
boolean useDeltas, ReposNotifyCallback callback)
- throws ClientException;
-
- /**
- * make a hot copy of the repository
- * @param path the path to the source repository
- * @param targetPath the path to the target repository
- * @param cleanLogs clean the unused log files in the source
- * repository
- * @throws ClientException throw in case of problem
- */
- public abstract void hotcopy(File path, File targetPath,
- boolean cleanLogs, boolean incremental) throws ClientException;
-
- public abstract void hotcopy(File path, File targetPath,
- boolean cleanLogs) throws ClientException;
-
- /**
- * list all logfiles (BDB) in use or not)
- * @param path the path to the repository
- * @param receiver interface to receive the logfile names
- * @throws ClientException throw in case of problem
- */
- public abstract void listDBLogs(File path, MessageReceiver receiver)
- throws ClientException;
-
- /**
- * list unused logfiles
- * @param path the path to the repository
- * @param receiver interface to receive the logfile names
- * @throws ClientException throw in case of problem
- */
- public abstract void listUnusedDBLogs(File path, MessageReceiver receiver)
- throws ClientException;
-
-
- /**
- * load the data of a dump into a repository
- * @param path the path to the repository
- * @param dataInput the data input source
+ throws ClientException;
+
+ /**
+ * make a hot copy of the repository
+ * @param path the path to the source repository
+ * @param targetPath the path to the target repository
+ * @param cleanLogs clean the unused log files in the source
+ * repository
+ * @param callback the callback to receive notifications
+ * @throws ClientException throw in case of problem
+ * @since 1.9
+ */
+ public abstract void hotcopy(File path, File targetPath,
+ boolean cleanLogs, boolean incremental,
+ ReposNotifyCallback callback)
+ throws ClientException;
+
+ public abstract void hotcopy(File path, File targetPath,
+ boolean cleanLogs, boolean incremental)
+ throws ClientException;
+
+ public abstract void hotcopy(File path, File targetPath,
+ boolean cleanLogs) throws ClientException;
+
+ /**
+ * list all logfiles (BDB) in use or not)
+ * @param path the path to the repository
+ * @param receiver interface to receive the logfile names
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void listDBLogs(File path, MessageReceiver receiver)
+ throws ClientException;
+
+ /**
+ * list unused logfiles
+ * @param path the path to the repository
+ * @param receiver interface to receive the logfile names
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void listUnusedDBLogs(File path, MessageReceiver receiver)
+ throws ClientException;
+
+
+ /**
+ * load the data of a dump into a repository
+ * @param path the path to the repository
+ * @param dataInput the data input source
* @param start the first revision to load
* @param end the last revision to load
- * @param ignoreUUID ignore any UUID found in the input stream
- * @param forceUUID set the repository UUID to any found in the
- * stream
- * @param usePreCommitHook use the pre-commit hook when processing commits
- * @param usePostCommitHook use the post-commit hook when processing commits
- * @param relativePath the directory in the repository, where the data
- * in put optional.
- * @param callback the target for processing messages
- * @throws ClientException throw in case of problem
+ * @param ignoreUUID ignore any UUID found in the input stream
+ * @param forceUUID set the repository UUID to any found in the
+ * stream
+ * @param usePreCommitHook use the pre-commit hook when processing commits
+ * @param usePostCommitHook use the post-commit hook when processing commits
+ * @param validateProps validate "svn:" revision and node properties
+ * @param ignoreDates ignore revision datestamps in the dump stream
+ * @param relativePath the directory in the repository, where the data
+ * in put optional.
+ * @param callback the target for processing messages
+ * @throws ClientException throw in case of problem
+ * @since 1.9
+ */
+ public abstract void load(File path, InputStream dataInput,
+ Revision start, Revision end,
+ boolean ignoreUUID, boolean forceUUID,
+ boolean usePreCommitHook,
+ boolean usePostCommitHook,
+ boolean validateProps,
+ boolean ignoreDates,
+ String relativePath,
+ ReposNotifyCallback callback)
+ throws ClientException;
+
+ /**
+ * Load the data of a dump into a repository. Sets
+ * <code>validateProps</code> and <code>ignoreDates</code> to
+ * <code>false</code>.
+ *
+ * @param path the path to the repository
+ * @param dataInput the data input source
+ * @param start the first revision to load
+ * @param end the last revision to load
+ * @param ignoreUUID ignore any UUID found in the input stream
+ * @param forceUUID set the repository UUID to any found in the
+ * stream
+ * @param usePreCommitHook use the pre-commit hook when processing commits
+ * @param usePostCommitHook use the post-commit hook when processing commits
+ * @param relativePath the directory in the repository, where the data
+ * in put optional.
+ * @param callback the target for processing messages
+ * @throws ClientException throw in case of problem
* @since 1.8
- */
- public abstract void load(File path, InputStream dataInput,
+ */
+ public abstract void load(File path, InputStream dataInput,
Revision start, Revision end,
boolean ignoreUUID, boolean forceUUID,
boolean usePreCommitHook,
@@ -164,142 +206,175 @@ public interface ISVNRepos {
ReposNotifyCallback callback)
throws ClientException;
- /**
- * load the data of a dump into a repository
- * @param path the path to the repository
- * @param dataInput the data input source
- * @param ignoreUUID ignore any UUID found in the input stream
- * @param forceUUID set the repository UUID to any found in the
- * stream
- * @param usePreCommitHook use the pre-commit hook when processing commits
- * @param usePostCommitHook use the post-commit hook when processing commits
- * @param relativePath the directory in the repository, where the data
- * in put optional.
- * @param callback the target for processing messages
- * @throws ClientException throw in case of problem
+ /**
+ * load the data of a dump into a repository
+ * @param path the path to the repository
+ * @param dataInput the data input source
+ * @param ignoreUUID ignore any UUID found in the input stream
+ * @param forceUUID set the repository UUID to any found in the
+ * stream
+ * @param usePreCommitHook use the pre-commit hook when processing commits
+ * @param usePostCommitHook use the post-commit hook when processing commits
+ * @param relativePath the directory in the repository, where the data
+ * in put optional.
+ * @param callback the target for processing messages
+ * @throws ClientException throw in case of problem
* @note behaves like the 1.8 vesion with the revision
* parameters set to Revision.START and Revision.HEAD.
- */
- public abstract void load(File path, InputStream dataInput,
- boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook,
+ */
+ public abstract void load(File path, InputStream dataInput,
+ boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook,
boolean usePostCommitHook, String relativePath,
ReposNotifyCallback callback)
throws ClientException;
- /**
- * list all open transactions in a repository
- * @param path the path to the repository
- * @param receiver receives one transaction name per call
- * @throws ClientException throw in case of problem
- */
- public abstract void lstxns(File path, MessageReceiver receiver)
- throws ClientException;
-
- /**
- * recover the filesystem backend of a repository
- * @param path the path to the repository
+ /**
+ * list all open transactions in a repository
+ * @param path the path to the repository
+ * @param receiver receives one transaction name per call
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void lstxns(File path, MessageReceiver receiver)
+ throws ClientException;
+
+ /**
+ * recover the filesystem backend of a repository
+ * @param path the path to the repository
* @return youngest revision
- * @throws ClientException throw in case of problem
- */
- public abstract long recover(File path, ReposNotifyCallback callback)
+ * @throws ClientException throw in case of problem
+ */
+ public abstract long recover(File path, ReposNotifyCallback callback)
throws ClientException;
- /**
- * Take an exclusive lock on each of the listed repositories
- * to prevent commits; then, while holding all the locks, call
- * the action.invoke().
- *
- * The repositories may or may not be readable by Subversion
- * while frozen, depending on implementation details of the
- * repository's filesystem backend.
- *
- * Repositories are locked in the listed order.
- * @param action describes the action to perform
- * @param paths the set of repository paths
- * @throws ClientException
+ /**
+ * Take an exclusive lock on each of the listed repositories
+ * to prevent commits; then, while holding all the locks, call
+ * the action.invoke().
+ *
+ * The repositories may or may not be readable by Subversion
+ * while frozen, depending on implementation details of the
+ * repository's filesystem backend.
+ *
+ * Repositories are locked in the listed order.
+ * @param action describes the action to perform
+ * @param paths the set of repository paths
+ * @throws ClientException
* @since 1.8
- */
- public abstract void freeze(ReposFreezeAction action,
- File... paths)
- throws ClientException;
-
- /**
- * remove open transaction in a repository
- * @param path the path to the repository
- * @param transactions the transactions to be removed
- * @throws ClientException throw in case of problem
- */
- public abstract void rmtxns(File path, String[] transactions)
- throws ClientException;
-
- /**
- * Change the value of the revision property <code>propName</code>
- * to <code>propValue</code>. By default, does not run
- * pre-/post-revprop-change hook scripts.
- *
- * @param path The path to the repository.
- * @param rev The revision for which to change a property value.
- * @param propName The name of the property to change.
- * @param propValue The new value to set for the property.
- * @param usePreRevPropChangeHook Whether to run the
- * <i>pre-revprop-change</i> hook script.
- * @param usePostRevPropChangeHook Whether to run the
- * <i>post-revprop-change</i> hook script.
- * @throws SubversionException If a problem occurs.
- */
- public abstract void setRevProp(File path, Revision rev, String propName,
- String propValue, boolean usePreRevPropChangeHook,
- boolean usePostRevPropChangeHook) throws SubversionException;
-
- /**
- * Verify the repository at <code>path</code> between revisions
- * <code>start</code> and <code>end</code>.
- *
- * @param path the path to the repository
- * @param start the first revision
- * @param end the last revision
- * @param callback the callback to recieve notifications
- * @throws ClientException If an error occurred.
- */
- public abstract void verify(File path, Revision start, Revision end,
+ */
+ public abstract void freeze(ReposFreezeAction action,
+ File... paths)
+ throws ClientException;
+
+ /**
+ * remove open transaction in a repository
+ * @param path the path to the repository
+ * @param transactions the transactions to be removed
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void rmtxns(File path, String[] transactions)
+ throws ClientException;
+
+ /**
+ * Change the value of the revision property <code>propName</code>
+ * to <code>propValue</code>. By default, does not run
+ * pre-/post-revprop-change hook scripts.
+ *
+ * @param path The path to the repository.
+ * @param rev The revision for which to change a property value.
+ * @param propName The name of the property to change.
+ * @param propValue The new value to set for the property.
+ * @param usePreRevPropChangeHook Whether to run the
+ * <i>pre-revprop-change</i> hook script.
+ * @param usePostRevPropChangeHook Whether to run the
+ * <i>post-revprop-change</i> hook script.
+ * @throws SubversionException If a problem occurs.
+ */
+ public abstract void setRevProp(File path, Revision rev, String propName,
+ String propValue, boolean usePreRevPropChangeHook,
+ boolean usePostRevPropChangeHook) throws SubversionException;
+
+ /**
+ * Verify the repository at <code>path</code> between revisions
+ * <code>start</code> and <code>end</code>.
+ *<p>
+ * If <code>verifyCallback</code> is <code>null</code>, verification
+ * will stop at the first encountered error. Otherwise, the verification
+ * process may continue, depending on the value returned from the
+ * invocation of <code>verifyCallback</code>.
+ *
+ * @param path the path to the repository
+ * @param start the first revision
+ * @param end the last revision
+ * @param checkNormalization report directory entry and mergeinfo name collisions
+ * caused by denormalized Unicode representations
+ * @param metadataOnly check only metadata, not file contents
+ * @param notifyCallback the callback to receive notifications
+ * @param verifyCallback the callback to receive verification status
+ * @throws ClientException If an error occurred.
+ * @since 1.9
+ */
+ public abstract void verify(File path, Revision start, Revision end,
+ boolean checkNormalization,
+ boolean metadataOnly,
+ ReposNotifyCallback notifyCallback,
+ ReposVerifyCallback verifyCallback)
+ throws ClientException;
+
+ /**
+ * Verify the repository at <code>path</code> between revisions
+ * <code>start</code> and <code>end</code>.
+ *<p>
+ *<b>Note:</b> Behaves like the 1.9 version with
+ * <code>checkNormailzation</code> and
+ * <code>metadataOnly</code> set to <code>false</code>
+ * and <code>verifyCallback</code> set to
+ * <code>null</code>.
+ *
+ * @param path the path to the repository
+ * @param start the first revision
+ * @param end the last revision
+ * @param callback the callback to receive notifications
+ * @throws ClientException If an error occurred.
+ */
+ public abstract void verify(File path, Revision start, Revision end,
ReposNotifyCallback callback)
throws ClientException;
- /**
- * list all locks in the repository
- * @param path the path to the repository
+ /**
+ * list all locks in the repository
+ * @param path the path to the repository
* @param depth the depth to recurse
- * @throws ClientException throw in case of problem
- */
- public abstract Set<Lock> lslocks(File path, Depth depth)
+ * @throws ClientException throw in case of problem
+ */
+ public abstract Set<Lock> lslocks(File path, Depth depth)
throws ClientException;
- /**
- * remove multiple locks from the repository
- * @param path the path to the repository
- * @param locks the name of the locked items
- * @throws ClientException throw in case of problem
- */
- public abstract void rmlocks(File path, String[] locks)
- throws ClientException;
+ /**
+ * remove multiple locks from the repository
+ * @param path the path to the repository
+ * @param locks the name of the locked items
+ * @throws ClientException throw in case of problem
+ */
+ public abstract void rmlocks(File path, String[] locks)
+ throws ClientException;
/**
* upgrade the repository format
* @param path the path to the repository
* @param callback for notification
- * @throws ClientException throw in case of problem
+ * @throws ClientException throw in case of problem
*/
public abstract void upgrade(File path, ReposNotifyCallback callback)
- throws ClientException;
+ throws ClientException;
/**
* pack the repository
* @param path the path to the repository
* @param callback for notification
- * @throws ClientException throw in case of problem
+ * @throws ClientException throw in case of problem
*/
public abstract void pack(File path, ReposNotifyCallback callback)
- throws ClientException;
+ throws ClientException;
/**
* cancel the active operation
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java
index f00b47f..90991c4 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIError.java
@@ -28,13 +28,9 @@ package org.apache.subversion.javahl;
*/
public class JNIError extends Error
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
new file mode 100644
index 0000000..7c55510
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
@@ -0,0 +1,42 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+/**
+ * This class is used internally by the JavaHL implementation and not considered
+ * part part of the public API.
+ */
+public abstract class JNIObject
+{
+ /**
+ * slot for the address of the native peer. The JNI code controls this
+ * field. If it is set to 0 then underlying JNI object has been freed
+ */
+ protected final long cppAddr;
+
+ protected JNIObject(long cppAddr)
+ {
+ this.cppAddr = cppAddr;
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java
index 7f693ae..1744438 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeException.java
@@ -29,13 +29,9 @@ package org.apache.subversion.javahl;
*/
class NativeException extends SubversionException
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
@@ -58,9 +54,10 @@ class NativeException extends SubversionException
* @param aprError Any associated APR error code for a wrapped
* <code>svn_error_t</code>.
*/
- NativeException(String message, String source, int aprError)
+ NativeException(String message, String source, Throwable cause,
+ int aprError)
{
- super(message);
+ super(message, cause);
this.source = source;
this.aprError = aprError;
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
index c140fd1..ca71e4a 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
@@ -24,6 +24,7 @@
package org.apache.subversion.javahl;
import org.apache.subversion.javahl.types.Version;
+import org.apache.subversion.javahl.types.RuntimeVersion;
/**
* Handles activities related to management of native resouces
@@ -35,21 +36,32 @@ import org.apache.subversion.javahl.types.Version;
public class NativeResources
{
/**
- * @return Version information about the underlying native libraries.
+ * Version information about the underlying native libraries.
*/
private static Version version;
/**
- * Returns version information about the underlying native libraries.
- *
- * @return version
- *
+ * Runtime version information about the loaded libsvn_client.
+ */
+ private static RuntimeVersion runtimeVersion;
+
+ /**
+ * @return Version information about the underlying native libraries.
*/
- public static Version getVersion() {
+ public static Version getVersion()
+ {
return version;
}
/**
+ * @return Runtime version information about the loaded libsvn_client.
+ */
+ public static RuntimeVersion getRuntimeVersion()
+ {
+ return runtimeVersion;
+ }
+
+ /**
* Load the required native library whose path is specified by the
* system property <code>subversion.native.library</code> (which
* can be passed to the JVM on start-up using an argument like
@@ -131,15 +143,27 @@ public class NativeResources
{
initNativeLibrary();
version = new Version();
- if (!version.isAtLeast(1, 8, 0))
+ if (!version.isAtLeast(1, 9, 0))
{
throw new LinkageError("Native library version must be at least " +
- "1.8.0, but is only " + version);
+ "1.9.0, but is only " + version);
+ }
+
+ runtimeVersion = new RuntimeVersion();
+ if (runtimeVersion.getMajor() < version.getMajor()
+ || (runtimeVersion.getMajor() == version.getMajor()
+ && runtimeVersion.getMinor() < version.getMinor()))
+ {
+ throw new LinkageError(
+ "Compile-time Native library version is " + version +
+ " but the run-time version is " + runtimeVersion);
}
}
/**
* Initialize the native library layer.
+ * @note This is a no-op in 1.9+, but we need it for ABI
+ * compatibility with older versions of the native library.
*/
private static native void initNativeLibrary();
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java
new file mode 100644
index 0000000..ad56e12
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/OperationContext.java
@@ -0,0 +1,46 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.callback.ProgressCallback;
+
+/**
+ * A private class to hold the contextual information required to
+ * persist in this object, such as notification handlers.
+ */
+public class OperationContext implements ProgressCallback
+{
+ private ProgressCallback progress = null;
+
+ public void onProgress(ProgressEvent event)
+ {
+ if (progress != null)
+ progress.onProgress(event);
+ }
+
+ public void setProgressCallback(ProgressCallback progress)
+ {
+ this.progress = progress;
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java
index 7b46544..5d39515 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ProgressEvent.java
@@ -31,13 +31,9 @@ import org.apache.subversion.javahl.callback.ProgressCallback;
*/
public class ProgressEvent implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java
index 7594d6c..9970052 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/ReposNotifyInformation.java
@@ -32,14 +32,10 @@ import org.apache.subversion.javahl.callback.ReposNotifyCallback;
*/
public class ReposNotifyInformation extends EventObject
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
- private static final long serialVersionUID = 1L;
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 2L;
/**
* The {@link Action} which triggered this event.
@@ -200,7 +196,31 @@ public class ReposNotifyInformation extends EventObject
* The structure of a revision is being verified.
* @since 1.8
*/
- verify_rev_structure;
+ verify_rev_structure,
+
+ /**
+ * A revprop shard got packed. @
+ * @since 1.9
+ */
+ pack_revprops,
+
+ /**
+ * A non-packed revprop shard got removed.
+ * @since 1.9
+ */
+ cleanup_revprops,
+
+ /**
+ * The repository format got bumped.
+ * @since 1.9
+ */
+ format_bumped,
+
+ /**
+ * A revision range was copied.
+ * @since 1.9
+ */
+ hotcopy_rev_range;
}
public enum NodeAction
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
index 1af9102..4a11889 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
@@ -32,6 +32,7 @@ import java.io.FileNotFoundException;
import java.io.ByteArrayOutputStream;
import java.util.Collection;
+import java.util.Collections;
import java.util.Set;
import java.util.List;
import java.util.Map;
@@ -52,7 +53,7 @@ public class SVNClient implements ISVNClient
}
/**
- * Standard empty contructor, builds just the native peer.
+ * Standard empty constructor, builds just the native peer.
*/
public SVNClient()
{
@@ -103,6 +104,11 @@ public class SVNClient implements ISVNClient
return NativeResources.getVersion();
}
+ public RuntimeVersion getRuntimeVersion()
+ {
+ return NativeResources.getRuntimeVersion();
+ }
+
public native VersionExtended getVersionExtended(boolean verbose);
public native String getAdminDirectoryName();
@@ -112,15 +118,29 @@ public class SVNClient implements ISVNClient
/**
* @deprecated
*/
+ @Deprecated
public native String getLastPath();
- public native void status(String path, Depth depth, boolean onServer,
+ public native void status(String path, Depth depth,
+ boolean onServer, boolean onDisk,
boolean getAll, boolean noIgnore,
- boolean ignoreExternals,
+ boolean ignoreExternals, boolean depthAsSticky,
Collection<String> changelists,
StatusCallback callback)
throws ClientException;
+ @Deprecated
+ public void status(String path, Depth depth, boolean onServer,
+ boolean getAll, boolean noIgnore,
+ boolean ignoreExternals,
+ Collection<String> changelists,
+ StatusCallback callback)
+ throws ClientException
+ {
+ status(path, depth, onServer, true, getAll, noIgnore,
+ ignoreExternals, false, changelists, callback);
+ }
+
public native void list(String url, Revision revision,
Revision pegRevision, Depth depth, int direntFields,
boolean fetchLocks, ListCallback callback)
@@ -130,8 +150,13 @@ public class SVNClient implements ISVNClient
public native void password(String password);
+ public native void setPrompt(AuthnCallback prompt);
+
+ @SuppressWarnings("deprecation")
public native void setPrompt(UserPasswordCallback prompt);
+ public native void setTunnelAgent(TunnelAgent tunnelAgent);
+
public native void logMessages(String path, Revision pegRevision,
List<RevisionRange> revisionRanges,
boolean stopOnCopy, boolean discoverPath,
@@ -151,14 +176,14 @@ public class SVNClient implements ISVNClient
clientContext.notify = notify;
}
- public void setConflictResolver(ConflictResolverCallback listener)
+ public void setConflictResolver(ConflictResolverCallback resolver)
{
- clientContext.resolver = listener;
+ clientContext.resolver = resolver;
}
- public void setProgressCallback(ProgressCallback listener)
+ public void setProgressCallback(ProgressCallback progress)
{
- clientContext.listener = listener;
+ clientContext.setProgressCallback(progress);
}
public native void remove(Set<String> paths, boolean force,
@@ -167,10 +192,26 @@ public class SVNClient implements ISVNClient
CommitMessageCallback handler, CommitCallback callback)
throws ClientException;
- public native void revert(String path, Depth depth,
- Collection<String> changelists)
+ public native void revert(Set<String> paths, Depth depth,
+ Collection<String> changelists,
+ boolean clearChangelists,
+ boolean metadataOnly)
throws ClientException;
+ public void revert(Set<String> paths, Depth depth,
+ Collection<String> changelists)
+ throws ClientException
+ {
+ revert(paths, depth, changelists, false, false);
+ }
+
+ public void revert(String path, Depth depth,
+ Collection<String> changelists)
+ throws ClientException
+ {
+ revert(Collections.singleton(path), depth, changelists, false, false);
+ }
+
public native void add(String path, Depth depth, boolean force,
boolean noIgnores, boolean noAutoProps,
boolean addParents)
@@ -199,11 +240,24 @@ public class SVNClient implements ISVNClient
public native void copy(List<CopySource> sources, String destPath,
boolean copyAsChild, boolean makeParents,
- boolean ignoreExternals,
+ boolean ignoreExternals, boolean metadataOnly,
+ boolean pinExternals,
+ Map<String, List<ExternalItem>> externalsToPin,
Map<String, String> revpropTable,
CommitMessageCallback handler, CommitCallback callback)
throws ClientException;
+ public void copy(List<CopySource> sources, String destPath,
+ boolean copyAsChild, boolean makeParents,
+ boolean ignoreExternals,
+ Map<String, String> revpropTable,
+ CommitMessageCallback handler, CommitCallback callback)
+ throws ClientException
+ {
+ copy(sources, destPath, copyAsChild, makeParents, ignoreExternals,
+ false, false, null, revpropTable, handler, callback);
+ }
+
public native void move(Set<String> srcPaths, String destPath,
boolean force, boolean moveAsChild,
boolean makeParents, boolean metadataOnly,
@@ -213,6 +267,7 @@ public class SVNClient implements ISVNClient
throws ClientException;
/** @deprecated */
+ @Deprecated
public void move(Set<String> srcPaths, String destPath,
boolean force, boolean moveAsChild,
boolean makeParents,
@@ -229,8 +284,18 @@ public class SVNClient implements ISVNClient
CommitMessageCallback handler, CommitCallback callback)
throws ClientException;
- public native void cleanup(String path)
- throws ClientException;
+ public native void cleanup(String path,
+ boolean breakLocks,
+ boolean fixRecordedTimestamps,
+ boolean clearDavCache,
+ boolean removeUnusedPristines,
+ boolean includeExternals)
+ throws ClientException;
+
+ public void cleanup(String path) throws ClientException
+ {
+ cleanup(path, true, true, true, true, false);
+ }
public native void resolve(String path, Depth depth,
ConflictResult.Choice conflictResult)
@@ -239,9 +304,20 @@ public class SVNClient implements ISVNClient
public native long doExport(String srcPath, String destPath,
Revision revision, Revision pegRevision,
boolean force, boolean ignoreExternals,
+ boolean ignorKeywords,
Depth depth, String nativeEOL)
throws ClientException;
+ public long doExport(String srcPath, String destPath,
+ Revision revision, Revision pegRevision,
+ boolean force, boolean ignoreExternals,
+ Depth depth, String nativeEOL)
+ throws ClientException
+ {
+ return doExport(srcPath, destPath, revision, pegRevision,
+ force, ignoreExternals, false, depth, nativeEOL);
+ }
+
public native long doSwitch(String path, String url, Revision revision,
Revision pegRevision, Depth depth,
boolean depthIsSticky, boolean ignoreExternals,
@@ -276,11 +352,24 @@ public class SVNClient implements ISVNClient
public native void merge(String path1, Revision revision1, String path2,
Revision revision2, String localPath,
boolean force, Depth depth,
- boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
- boolean dryRun, boolean recordOnly)
+ boolean ignoreMergeinfo,
+ boolean diffIgnoreAncestry,
+ boolean dryRun, boolean allowMixedRev,
+ boolean recordOnly)
throws ClientException;
public void merge(String path1, Revision revision1, String path2,
+ Revision revision2, String localPath,
+ boolean force, Depth depth,
+ boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
+ boolean dryRun, boolean recordOnly)
+ throws ClientException
+ {
+ merge(path1, revision1, path2, revision2, localPath, force, depth,
+ ignoreMergeinfo, diffIgnoreAncestry, dryRun, true, recordOnly);
+ }
+
+ public void merge(String path1, Revision revision1, String path2,
Revision revision2, String localPath,
boolean force, Depth depth,
boolean ignoreAncestry, boolean dryRun,
@@ -294,12 +383,25 @@ public class SVNClient implements ISVNClient
public native void merge(String path, Revision pegRevision,
List<RevisionRange> revisions, String localPath,
boolean force, Depth depth,
- boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
- boolean dryRun, boolean recordOnly)
+ boolean ignoreMergeinfo,
+ boolean diffIgnoreAncestry,
+ boolean dryRun, boolean allowMixedRev,
+ boolean recordOnly)
throws ClientException;
public void merge(String path, Revision pegRevision,
List<RevisionRange> revisions, String localPath,
+ boolean force, Depth depth,
+ boolean ignoreMergeinfo, boolean diffIgnoreAncestry,
+ boolean dryRun, boolean recordOnly)
+ throws ClientException
+ {
+ merge(path, pegRevision, revisions, localPath, force, depth,
+ ignoreMergeinfo, diffIgnoreAncestry, dryRun, true, recordOnly);
+ }
+
+ public void merge(String path, Revision pegRevision,
+ List<RevisionRange> revisions, String localPath,
boolean force, Depth depth, boolean ignoreAncestry,
boolean dryRun, boolean recordOnly)
throws ClientException
@@ -310,6 +412,7 @@ public class SVNClient implements ISVNClient
/** @deprecated */
+ @Deprecated
public native void mergeReintegrate(String path, Revision pegRevision,
String localPath, boolean dryRun)
throws ClientException;
@@ -539,24 +642,46 @@ public class SVNClient implements ISVNClient
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
- streamFileContent(path, revision, pegRevision, stream);
+ streamFileContent(path, revision, pegRevision, true, false, stream);
return stream.toByteArray();
}
- public native void streamFileContent(String path, Revision revision,
- Revision pegRevision,
- OutputStream stream)
+ public native Map<String, byte[]>
+ streamFileContent(String path,
+ Revision revision, Revision pegRevision,
+ boolean expandKeywords, boolean returnProps,
+ OutputStream stream)
throws ClientException;
+ public void streamFileContent(String path, Revision revision,
+ Revision pegRevision,
+ OutputStream stream)
+ throws ClientException
+ {
+ streamFileContent(path, revision, pegRevision, true, false, stream);
+ }
+
public native void relocate(String from, String to, String path,
boolean ignoreExternals)
throws ClientException;
+ public void blame(String path, Revision pegRevision,
+ Revision revisionStart,
+ Revision revisionEnd, boolean ignoreMimeType,
+ boolean includeMergedRevisions,
+ BlameCallback callback)
+ throws ClientException
+ {
+ blame(path, pegRevision, revisionStart, revisionEnd, ignoreMimeType,
+ includeMergedRevisions, callback, null);
+ }
+
public native void blame(String path, Revision pegRevision,
Revision revisionStart,
Revision revisionEnd, boolean ignoreMimeType,
boolean includeMergedRevisions,
- BlameCallback callback)
+ BlameCallback callback,
+ DiffOptions options)
throws ClientException;
public native void setConfigDirectory(String configDir)
@@ -565,6 +690,12 @@ public class SVNClient implements ISVNClient
public native String getConfigDirectory()
throws ClientException;
+ public native void setConfigEventHandler(ConfigEvent configHandler)
+ throws ClientException;
+
+ public native ConfigEvent getConfigEventHandler()
+ throws ClientException;
+
public native void cancelOperation()
throws ClientException;
@@ -649,28 +780,65 @@ public class SVNClient implements ISVNClient
public native void unlock(Set<String> paths, boolean force)
throws ClientException;
- public native void info2(String pathOrUrl, Revision revision,
- Revision pegRevision, Depth depth,
- Collection<String> changelists,
- InfoCallback callback)
+ public native void info(String pathOrUrl, Revision revision,
+ Revision pegRevision, Depth depth,
+ boolean fetchExcluded, boolean fetchActualOnly,
+ boolean includeExternals,
+ Collection<String> changelists,
+ InfoCallback callback)
throws ClientException;
+ public void info2(String pathOrUrl, Revision revision,
+ Revision pegRevision, Depth depth,
+ Collection<String> changelists,
+ InfoCallback callback)
+ throws ClientException
+ {
+ info(pathOrUrl, revision, pegRevision, depth,
+ false, true, false, changelists, callback);
+ }
+
public native void patch(String patchPath, String targetPath,
boolean dryRun, int stripCount, boolean reverse,
boolean ignoreWhitespace, boolean removeTempfiles,
PatchCallback callback)
throws ClientException;
+ public native void vacuum(String wcPath,
+ boolean removeUnversionedItems,
+ boolean removeIgnoredItems,
+ boolean fixRecordedTimestamps,
+ boolean removeUnusedPristines,
+ boolean includeExternals)
+ throws ClientException;
+
+ public ISVNRemote openRemoteSession(String pathOrUrl)
+ throws ClientException, SubversionException
+ {
+ return nativeOpenRemoteSession(pathOrUrl, 1);
+ }
+
+ public ISVNRemote openRemoteSession(String pathOrUrl, int retryAttempts)
+ throws ClientException, SubversionException
+ {
+ if (retryAttempts <= 0)
+ throw new IllegalArgumentException(
+ "retryAttempts must be positive");
+ return nativeOpenRemoteSession(pathOrUrl, retryAttempts);
+ }
+
+ private native ISVNRemote nativeOpenRemoteSession(
+ String pathOrUrl, int retryAttempts)
+ throws ClientException, SubversionException;
+
/**
* A private class to hold the contextual information required to
* persist in this object, such as notification handlers.
*/
- private class ClientContext
- implements ClientNotifyCallback, ProgressCallback,
- ConflictResolverCallback
+ private class ClientContext extends OperationContext
+ implements ClientNotifyCallback, ConflictResolverCallback
{
public ClientNotifyCallback notify = null;
- public ProgressCallback listener = null;
public ConflictResolverCallback resolver = null;
public void onNotify(ClientNotifyInformation notifyInfo)
@@ -679,12 +847,6 @@ public class SVNClient implements ISVNClient
notify.onNotify(notifyInfo);
}
- public void onProgress(ProgressEvent event)
- {
- if (listener != null)
- listener.onProgress(event);
- }
-
public ConflictResult resolve(ConflictDescriptor conflict)
throws SubversionException
{
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java
index 7d967bf..f115c9a 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNRepos.java
@@ -29,6 +29,7 @@ import java.io.InputStream;
import java.io.File;
import org.apache.subversion.javahl.callback.ReposNotifyCallback;
+import org.apache.subversion.javahl.callback.ReposVerifyCallback;
import org.apache.subversion.javahl.callback.ReposFreezeAction;
import org.apache.subversion.javahl.types.*;
@@ -47,7 +48,7 @@ public class SVNRepos implements ISVNRepos
}
/**
- * Standard empty contructor, builds just the native peer.
+ * Standard empty constructor, builds just the native peer.
*/
public SVNRepos()
{
@@ -122,22 +123,22 @@ public class SVNRepos implements ISVNRepos
boolean useDeltas, ReposNotifyCallback callback)
throws ClientException;
- /**
- * make a hot copy of the repository
- * @param path the path to the source repository
- * @param targetPath the path to the target repository
- * @param cleanLogs clean the unused log files in the source
- * repository
- * @throws ClientException throw in case of problem
- */
public native void hotcopy(File path, File targetPath,
- boolean cleanLogs, boolean incremental)
+ boolean cleanLogs, boolean incremental,
+ ReposNotifyCallback callback)
throws ClientException;
public void hotcopy(File path, File targetPath,
+ boolean cleanLogs, boolean incremental)
+ throws ClientException
+ {
+ hotcopy(path, targetPath, cleanLogs, incremental, null);
+ }
+
+ public void hotcopy(File path, File targetPath,
boolean cleanLogs) throws ClientException
{
- hotcopy(path, targetPath, cleanLogs, false);
+ hotcopy(path, targetPath, cleanLogs, false, null);
}
/**
@@ -159,6 +160,18 @@ public class SVNRepos implements ISVNRepos
throws ClientException;
public void load(File path, InputStream dataInput,
+ Revision start, Revision end,
+ boolean ignoreUUID, boolean forceUUID,
+ boolean usePreCommitHook, boolean usePostCommitHook,
+ String relativePath, ReposNotifyCallback callback)
+ throws ClientException
+ {
+ load(path, dataInput, start, end,
+ ignoreUUID, forceUUID, usePreCommitHook, usePostCommitHook,
+ false, false, relativePath, callback);
+ }
+
+ public void load(File path, InputStream dataInput,
boolean ignoreUUID, boolean forceUUID,
boolean usePreCommitHook, boolean usePostCommitHook,
String relativePath, ReposNotifyCallback callback)
@@ -166,13 +179,14 @@ public class SVNRepos implements ISVNRepos
{
load(path, dataInput, Revision.START, Revision.HEAD,
ignoreUUID, forceUUID, usePreCommitHook, usePostCommitHook,
- relativePath, callback);
+ false, false, relativePath, callback);
}
public native void load(File path, InputStream dataInput,
Revision start, Revision end,
boolean ignoreUUID, boolean forceUUID,
boolean usePreCommitHook, boolean usePostCommitHook,
+ boolean validateProps, boolean ignoreDates,
String relativePath, ReposNotifyCallback callback)
throws ClientException;
@@ -221,8 +235,18 @@ public class SVNRepos implements ISVNRepos
boolean usePostRevPropChangeHook)
throws SubversionException;
+ public void verify(File path, Revision start, Revision end,
+ ReposNotifyCallback callback)
+ throws ClientException
+ {
+ verify(path, start, end, false, false, callback, null);
+ }
+
public native void verify(File path, Revision start, Revision end,
- ReposNotifyCallback callback)
+ boolean checkNormalization,
+ boolean metadataOnly,
+ ReposNotifyCallback notifyCallback,
+ ReposVerifyCallback verifyCallback)
throws ClientException;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
new file mode 100644
index 0000000..9dd684d
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
@@ -0,0 +1,1077 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.callback.*;
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.util.*;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class SVNUtil
+{
+ //
+ // Global configuration
+ //
+ private static final ConfigLib configLib = new ConfigLib();
+
+ /**
+ * Enable storing authentication credentials in Subversion's
+ * standard credentials store in the configuration directory and
+ * system-specific secure locations.
+ * <p>
+ * The standard credentials store is enabled by default.
+ * <p>
+ * This setting will be inherited by all ISVNClient and ISVNRemote
+ * objects. Changing the setting will not affect existing such
+ * objects.
+ * @throws ClientException
+ */
+ public static void enableNativeCredentialsStore()
+ throws ClientException
+ {
+ configLib.enableNativeCredentialsStore();
+ }
+
+ /**
+ * Disable storing authentication credentials in Subversion's
+ * standard credentials store in the configuration directory and
+ * system-specific secure locations. In this mode, the
+ * authentication (see {@link ISVNClient#setPrompt} and {@link
+ * remote.RemoteFactory#setPrompt}) will be called every time the
+ * underlying library needs access to the credentials.
+ * <p>
+ * This mode is intented to support client implementations that
+ * use their own credentials store.
+ * <p>
+ * The standard credentials store is enabled by default.
+ * <p>
+ * This setting will be inherited by all ISVNClient and ISVNRemote
+ * objects. Changing the setting will not affect existing such
+ * objects.
+ * @throws ClientException
+ */
+ public static void disableNativeCredentialsStore()
+ throws ClientException
+ {
+ configLib.disableNativeCredentialsStore();
+ }
+
+ /**
+ * Find out if the standard credentials store is enabled.
+ */
+ public static boolean isNativeCredentialsStoreEnabled()
+ throws ClientException
+ {
+ return configLib.isNativeCredentialsStoreEnabled();
+ }
+
+ //
+ // Credentials management
+ //
+
+ /**
+ * Exception used by calling the wrong accessor on Credential for
+ * the given credential type.
+ */
+ public static class CredentialTypeMismatch extends SubversionException
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ public CredentialTypeMismatch(Credential.Kind kind, String attribute)
+ {
+ super("Credential type '" + kind.toString()
+ + "' does not have the attribute '" + attribute + "'");
+ }
+ }
+
+ /**
+ * Generic credential description. Provides default accessors for
+ * concrete implementations.
+ */
+ public static class Credential implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Describes the kind of the credential.
+ */
+ public static enum Kind
+ {
+ /** The username for a realm. */
+ username ("svn.username"),
+
+ /** The username and password for a realm. */
+ simple ("svn.simple"),
+
+ /** The trusted SSL server certificate for a realm. */
+ sslServer ("svn.ssl.server"),
+
+ /** The client certificate passphrase for a realm. */
+ sslClientPassphrase ("svn.ssl.client-passphrase");
+
+ private String token;
+
+ Kind(String token)
+ {
+ this.token = token;
+ }
+
+ /** @return the string representation of the enumeration. */
+ public String toString()
+ {
+ return this.token;
+ }
+
+ /* Factory used by the native implementation */
+ private static Kind fromString(String stringrep)
+ {
+ for (Kind kind : Kind.values()) {
+ if (kind.toString().equals(stringrep))
+ return kind;
+ }
+ return null;
+ }
+ }
+
+ /** @return the kind of the credential. */
+ public Kind getKind()
+ {
+ return kind;
+ }
+
+ /** @return the realm that the credential is valid for. */
+ public String getRealm()
+ {
+ return realm;
+ }
+
+ /**
+ * @return the type of the secure store used for the secret
+ * parts of this credential; may be <code>null</code> if the
+ * credential does not contain any secrets bits.
+ */
+ public String getSecureStore()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.simple && kind != Kind.sslClientPassphrase)
+ throw new CredentialTypeMismatch(kind, "secure store");
+
+ return store;
+ }
+
+ /**
+ * @return the username associated with the credential, or
+ * <code>null</code>, if there is no username in the concrete
+ * credential type.
+ */
+ public String getUsername()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.username && kind != Kind.simple)
+ throw new CredentialTypeMismatch(kind, "username");
+
+ return username;
+ }
+
+ /**
+ * @return the password associated with the credential, or
+ * <code>null</code>, if there is no password in the concrete
+ * credential type.
+ */
+ public String getPassword()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.simple && kind != Kind.sslClientPassphrase)
+ throw new CredentialTypeMismatch(kind, "password");
+
+ return password;
+ }
+
+ /**
+ * @return the server certificate info associated with the
+ * credential, or <code>null</code>, if there is no server
+ * certificate in the concrete credential type.
+ */
+ public AuthnCallback.SSLServerCertInfo getServerCertInfo()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.sslServer)
+ throw new CredentialTypeMismatch(kind, "server cert info");
+
+ return info;
+ }
+
+ /**
+ * @return the accepted server certificate failures associated
+ * with the credential, or <code>null</code>, if there is no
+ * server certificate in the concrete credential type.
+ */
+ public AuthnCallback.SSLServerCertFailures getServerCertFailures()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.sslServer)
+ throw new CredentialTypeMismatch(kind, "server cert failures");
+
+ return failures;
+ }
+
+ /**
+ * @return the client certificate passphrase associated with
+ * the credential, or <code>null</code>, if there is no client
+ * certificate in the concrete credential type.
+ */
+ public String getClientCertPassphrase()
+ throws CredentialTypeMismatch
+ {
+ if (kind != Kind.sslClientPassphrase)
+ throw new CredentialTypeMismatch(kind, "passphrase");
+
+ return passphrase;
+ }
+
+ // ### TODO: There are currently no proper APIs in Subversion
+ // for adding credentials. These factory methods are
+ // placeholders.
+ //
+ ///**
+ // * Creates an "svn.username" credential.
+ // * @param realm The realm string.
+ // * @param username The username for <code>realm</code>.
+ // */
+ //public static Credential
+ // createUsername(String realm, String username)
+ //{
+ // return new Credential(Kind.username, realm, null,
+ // username, null, null, null, null);
+ //}
+ //
+ ///**
+ // * Creates an "svn.simple" credential.
+ // * @param realm The realm string.
+ // * @param username The username for <code>realm</code>.
+ // * @param password The password for <code>username</code>.
+ // */
+ //public static Credential
+ // createSimple(String realm, String username, String password)
+ //{
+ // return new Credential(Kind.simple, realm, null,
+ // username, password, null, null, null);
+ //}
+ //
+ ///** Creates an "svn.ssl.server" credential. */
+ //public static Credential
+ // createSSLServerCertTrust(String realm,
+ // AuthnCallback.SSLServerCertInfo info,
+ // AuthnCallback.SSLServerCertFailures failures)
+ //{
+ // return new Credential(Kind.sslServer, realm, null,
+ // null, null, info, failures, null);
+ //}
+ //
+ ///**
+ // * Creates an "svn.ssl.client-passphrase" credential.
+ // * @param realm The realm string.
+ // * @param passphrase The passphrase for for the client certificate
+ // * used for <code>realm</code>.
+ // */
+ //public static Credential
+ // createSSLClientCertPassphrase(String realm, String passphrase)
+ //{
+ // return new Credential(Kind.simple, realm, null,
+ // null, null, null, null, passphrase);
+ //}
+
+ private Credential(Kind kind, String realm, String store,
+ String username, String password,
+ AuthnCallback.SSLServerCertInfo info,
+ AuthnCallback.SSLServerCertFailures failures,
+ String passphrase)
+ {
+ assert(kind != null && realm != null);
+ switch (kind) {
+ case username:
+ assert(username != null && password == null
+ && info == null && failures == null
+ && passphrase == null);
+ break;
+ case simple:
+ assert(username != null && password != null
+ && info == null && failures == null
+ && passphrase == null);
+ break;
+ case sslServer:
+ assert(username == null && password == null
+ && info != null && failures != null
+ && passphrase == null);
+ break;
+ case sslClientPassphrase:
+ assert(username == null && password == null
+ && info == null && failures == null
+ && passphrase != null);
+ break;
+ default:
+ assert(kind == Kind.username
+ || kind == Kind.simple
+ || kind == Kind.sslServer
+ || kind == Kind.sslClientPassphrase);
+ }
+
+ this.kind = kind;
+ this.realm = realm;
+ this.store = store;
+ this.username = username;
+ this.password = password;
+ this.info = info;
+ this.failures = failures;
+ this.passphrase = passphrase;
+ }
+
+ private Kind kind;
+ private String realm;
+ private String store;
+ private String username;
+ private String password;
+ private AuthnCallback.SSLServerCertInfo info;
+ private AuthnCallback.SSLServerCertFailures failures;
+ private String passphrase;
+ }
+
+ /**
+ * Find a stored credential.
+ * Unlike {@link #searchCredentials}, the the realm name is not
+ * a glob pattern.
+ * <p>
+ * <b>Note:</b> If the native credentials store is disabled, this
+ * method will always return <code>null</code>.
+ *
+ * @param configDir The path to the configuration directory; if
+ * <code>null</code>, the default (system-specific) user
+ * configuration path will be used.
+ * @param kind The kind of the credential; may not be <code>null</code>.
+ * @param realm The realm name; may not be <code>null</code>.
+ * @return the matching credential, or <code>null</code> if not found.
+ */
+ public static Credential getCredential(String configDir,
+ Credential.Kind kind,
+ String realm)
+ throws ClientException, SubversionException
+ {
+ return configLib.getCredential(configDir, kind, realm);
+ }
+
+ /**
+ * Remove a stored credential.
+ * Unlike {@link #deleteCredentials}, the the realm name is not
+ * a glob pattern.
+ * <p>
+ * <b>Note:</b> If the native credentials store is disabled, this
+ * method will always return <code>null</code>.
+ *
+ * @param configDir The path to the configuration directory; if
+ * <code>null</code>, the default (system-specific) user
+ * configuration path will be used.
+ * @param kind The kind of the credential; may not be <code>null</code>.
+ * @param realm The realm name; may not be <code>null</code>.
+ * @return the deleted credential, or <code>null</code> if not found.
+ */
+ public static Credential removeCredential(String configDir,
+ Credential.Kind kind,
+ String realm)
+ throws ClientException, SubversionException
+ {
+ return configLib.removeCredential(configDir, kind, realm);
+ }
+
+ // ### TODO: There are currently no proper APIs in Subversion for
+ // adding credentials. This method is a placeholder.
+ //
+ ///**
+ // * Store a new credential, or replace an existing credential.
+ // * <p>
+ // * <b>Note:</b> If the native credentials store is disabled, this
+ // * method will always return <code>null</code>.
+ // *
+ // * @param configDir The path to the configuration directory; if
+ // * <code>null</code>, the default (system-specific) user
+ // * configuration path will be used.
+ // * @param credential The credential to store.
+ // * @param replace If <code>true</code>, any existing matching
+ // * credential will be replaced.
+ // *
+ // * @return the stored credential. If <code>replace</code> was
+ // * <code>false</code>, and a credential with the same kind and
+ // * for the same realm exists, it will be returned. If the given
+ // * credential was successfully added, the same object reference
+ // * will be returned (the calling code can compare reference values
+ // * to determine this). Will return <code>null</code> if the
+ // * credential could not be stored for any reason.
+ // */
+ //public static Credential addCredential(String configDir,
+ // Credential credential,
+ // boolean replace)
+ // throws ClientException, SubversionException
+ //{
+ // return configLib.addCredential(configDir, credential, replace);
+ //}
+
+ /**
+ * Find stored credentials that match the given search criteria.
+ * <p>
+ * <b>Note:</b> If the native credentials store is disabled, this
+ * method will always return <code>null</code>.
+ *
+ * @param configDir The path to the configuration directory; if
+ * <code>null</code>, the default (system-specific) user
+ * configuration path will be used.
+ * @param kind The kind of the credential; if <code>null</code>,
+ * all matching credential types will be returned.
+ * @param realmPattern A glob pattern for the realm string;
+ * if <code>null</code>, all realms will be considered;
+ * otherwise, only those credentials whose realm matches
+ * the pattern will be returned.
+ * @param usernamePattern A glob pattern for the username;
+ * if <code>null</code>, all credentials will be considered;
+ * otherwise, only those credentials that have a username,
+ * and where the username matches the pattern, will be
+ * returned.
+ * @param hostnamePattern A glob pattern for the hostnames of a
+ * server certificate; if <code>null</code>, all
+ * credntials will be considered; otherwise, only
+ * those credentials that have a server certificate
+ * with a hostname that matches the pattern will be
+ * returned.
+ * @param textPattern A glob pattern that must match any textual
+ * information in a credential, for example, a realm,
+ * username, certificate details, etc; passwords, passphrases
+ * and other info considered secret will not be matched;
+ * @return the list of matching credentials.
+ */
+ public static List<Credential>
+ searchCredentials(String configDir,
+ Credential.Kind kind,
+ String realmPattern,
+ String usernamePattern,
+ String hostnamePattern,
+ String textPattern)
+ throws ClientException, SubversionException
+ {
+ return configLib.searchCredentials(configDir, kind, realmPattern,
+ usernamePattern, hostnamePattern,
+ textPattern);
+ }
+
+ //
+ // Diff and Merge
+ //
+ private static final DiffLib diffLib = new DiffLib();
+
+ /**
+ * Options to control the behaviour of the file diff routines.
+ */
+ public static class DiffOptions
+ {
+ /**
+ * To what extent whitespace should be ignored when comparing lines.
+ */
+ public enum IgnoreSpace
+ {
+ /** Do not ignore whitespace */
+ none,
+
+ /**
+ * Ignore changes in sequences of whitespace characters,
+ * treating each sequence of whitespace characters as a
+ * single space.
+ */
+ change,
+
+ /** Ignore all whitespace characters. */
+ all
+ }
+
+ /**
+ * @param ignoreSpace Whether and how to ignore space differences
+ * in the files. The default is {@link IgnoreSpace#none}.
+ * @param ignoreEolStyle Whether to treat all end-of-line
+ * markers the same when comparing lines. The default
+ * is <code>false</code>.
+ * @param showCFunction Whether the "@@" lines of the unified
+ * diff output should include a prefix of the nearest
+ * preceding line that starts with a character that
+ * might be the initial character of a C language
+ * identifier. The default is <code>false</code>.
+ */
+ public DiffOptions(IgnoreSpace ignoreSpace,
+ boolean ignoreEolStyle,
+ boolean showCFunction)
+ {
+ this.ignoreSpace = ignoreSpace;
+ this.ignoreEolStyle = ignoreEolStyle;
+ this.showCFunction = showCFunction;
+ this.contextSize = -1;
+ }
+
+ /**
+ * Like the {@see #DiffOptions(IgnoreSpace,boolean,boolean)},
+ * but with an additional parameter.
+ * @param contextSize If this is greater than 0, then this
+ * number of context lines will be used in the generated diff
+ * output. Otherwise the legacy compile time default will be
+ * used.
+ */
+ public DiffOptions(IgnoreSpace ignoreSpace,
+ boolean ignoreEolStyle,
+ boolean showCFunction,
+ int contextSize)
+ {
+ this.ignoreSpace = ignoreSpace;
+ this.ignoreEolStyle = ignoreEolStyle;
+ this.showCFunction = showCFunction;
+ this.contextSize = contextSize;
+ }
+
+ public final IgnoreSpace ignoreSpace;
+ public final boolean ignoreEolStyle;
+ public final boolean showCFunction;
+ public final int contextSize;
+ }
+
+ /** Style for displaying conflicts in merge output. */
+ public enum ConflictDisplayStyle
+ {
+ /** Display modified and latest, with conflict markers. */
+ modified_latest,
+
+ /**
+ * Like <code>modified_latest</code>, but with an extra effort
+ * to identify common sequences between modified and latest.
+ */
+ resolved_modified_latest,
+
+ /** Display modified, original, and latest, with conflict markers. */
+ modified_original_latest,
+
+ /** Just display modified, with no markers. */
+ modified,
+
+ /** Just display latest, with no markers. */
+ latest,
+
+ /**
+ * Like <code>modified_original_latest</code>, but
+ * <em>only<em> showing conflicts.
+ */
+ only_conflicts
+ }
+
+ /**
+ * Given two versions of a file, base (<code>originalFile</code>)
+ * and current (<code>modifiedFile</code>), show differences between
+ * them in unified diff format.
+ *
+ * @param originalFile The base file version (unmodified)
+ * @param modifiedFile The incoming file version (locally modified)
+ * @param diffOptions Options controlling how files are compared.
+ * May be <code>null</code>.
+ * @param originalHeader The header to display for the base file
+ * in the unidiff index block. If it is <code>null</code>,
+ * the <code>originalFile</code> path and its modification
+ * time will be used instead.
+ * @param modifiedHeader The header to display for the current
+ * file in the unidiff index block. If it is <code>null</code>,
+ * the <code>currentFile</code> path and its modification
+ * time will be used instead.
+ * @param headerEncoding The character encoding of the unidiff headers.
+ * @param relativeToDir If this parameter is not <null>, it must
+ * be the path of a (possibly non-immediate) parent of both
+ * <code>originalFile</code> and <code>modifiedFile</code>.
+ * This path will be stripped from the beginning of those
+ * file names if they are used in the unidiff index header.
+ * @param resultStream The stream that receives the merged output.
+ * @return <code>true</code> if there were differences between the files.
+ * @throws ClientException
+ */
+ public static boolean fileDiff(String originalFile,
+ String modifiedFile,
+ SVNUtil.DiffOptions diffOptions,
+
+ String originalHeader,
+ String modifiedHeader,
+ String headerEncoding,
+ String relativeToDir,
+
+ OutputStream resultStream)
+ throws ClientException
+ {
+ // ### TODO: Support cancellation as in svn_diff_file_output_unified3.
+ return diffLib.fileDiff(originalFile, modifiedFile, diffOptions,
+ originalHeader, modifiedHeader,
+ headerEncoding,
+ relativeToDir, resultStream);
+ }
+
+
+ /**
+ * Given three versions of a file, base (<code>originalFile</code>),
+ * incoming (<code>modifiedFile</code>) and current
+ * (<code>latestFile</code>, produce a merged result, possibly
+ * displaying conflict markers.
+ *
+ * @param originalFile The base file version (common ancestor)
+ * @param modifiedFile The incoming file version (modified elsewhere)
+ * @param latestFile The current file version (locally modified)
+ * @param diffOptions Options controlling how files are compared.
+ * May be <code>null</code>.
+ * @param conflictOriginal Optional custom conflict marker for
+ * the <code>originalFile</code> contents.
+ * @param conflictModified Optional custom conflict marker for
+ * the <code>modifiedFile</code> contents.
+ * @param conflictLatest Optional custom conflict marker for
+ * the <code>latestFile</code> contents.
+ * @param conflictSeparator Optional custom conflict separator.
+ * @param conflictStyle Determines how conflicts are displayed.
+ * @param resultStream The stream that receives the merged output.
+ * @return <code>true</code> if there were any conflicts.
+ * @throws ClientException
+ */
+ public static boolean fileMerge(String originalFile,
+ String modifiedFile,
+ String latestFile,
+ DiffOptions diffOptions,
+
+ String conflictOriginal,
+ String conflictModified,
+ String conflictLatest,
+ String conflictSeparator,
+ ConflictDisplayStyle conflictStyle,
+
+ OutputStream resultStream)
+ throws ClientException
+ {
+ return diffLib.fileMerge(originalFile, modifiedFile, latestFile,
+ diffOptions,
+ conflictOriginal, conflictModified,
+ conflictLatest, conflictSeparator,
+ conflictStyle, resultStream);
+ }
+
+ //
+ // Property validation and parsing
+ //
+ private static final PropLib propLib = new PropLib();
+
+ /**
+ * Validate the value of an <code>svn:</code> property on file or
+ * directory and return a canonical representation of its value.
+ * @param name The name of the property (must be a valid svn: property)
+ * @param value The property's value
+ * @param path The path or URL of the file or directory that
+ * owns the property; only used for error messages
+ * @param kind The node kind of the file or dir that owns the property
+ * @param mimeType If <code>kind</code> is {@link NodeKind.file}, this is
+ * tye file's mime-type, used for extra validation for the
+ * <code>svn:eol-style</code> property. If it is <code>null</code>,
+ * the extra validation will be skipped.
+ * @return a canonicalized representation of the property value
+ * @see http://subversion.apache.org/docs/api/latest/group__svn__wc__properties.html#ga83296313ec59cc825176224ac8282ec2
+ */
+ public static byte[] canonicalizeNodeProperty(
+ String name, byte[] value, String path, NodeKind kind,
+ String mimeType)
+ throws ClientException
+ {
+ return propLib.canonicalizeNodeProperty(
+ name, value, path, kind, mimeType, null);
+ }
+
+ /**
+ * Validate the value of an <code>svn:</code> property on file or
+ * directory and return a canonical representation of its value.
+ * @param name The name of the property (must be a valid svn: property)
+ * @param value The property's value
+ * @param path The path or URL of the file or directory that
+ * owns the property; only used for error messages
+ * @param kind The node kind of the file or dir that owns the property
+ * @param mimeType If <code>kind</code> is {@link NodeKind.file}, this is
+ * tye file's mime-type, used for extra validation for the
+ * <code>svn:eol-style</code> property. If it is <code>null</code>,
+ * the extra validation will be skipped.
+ * @param fileContents A stream with the file's contents. Only used
+ * to check for line-ending consistency when validating the
+ * <code>svn:eol-style</code> property, and only when
+ * <code>kind</code> is {@link NodeKind.file} and
+ * <code>mimeType</code> is not <code>null</code>.
+ * @return a canonicalized representation of the property value
+ * @see http://subversion.apache.org/docs/api/latest/group__svn__wc__properties.html#ga83296313ec59cc825176224ac8282ec2
+ */
+ public static byte[] canonicalizeNodeProperty(
+ String name, byte[] value, String path, NodeKind kind,
+ String mimeType, InputStream fileContents)
+ throws ClientException
+ {
+ return propLib.canonicalizeNodeProperty(
+ name, value, path, kind, mimeType, fileContents);
+ }
+
+ /**
+ * Parse <code>description</code>, assuming it is an externals
+ * specification in the format required for the
+ * <code>svn:externals</code> property, and return a list of
+ * parsed external items.
+ * @param description The externals description.
+ * @param parentDirectory Used to construct error messages.
+ * @param canonicalizeUrl Whe <code>true</code>, canonicalize the
+ * <code>url</code> member of the returned objects. If the
+ * <code>url</code> member refers to an absolute URL, it will
+ * be canonicalized as URL consistent with the way URLs are
+ * canonicalized throughout the Subversion API. If, however,
+ * the <code>url</code> member makes use of the recognized
+ * (SVN-specific) relative URL syntax for
+ * <code>svn:externals</code>, "canonicalization" is an
+ * ill-defined concept which may even result in munging the
+ * relative URL syntax beyond recognition. You've been warned.
+ * @return a list of {@link ExternalItem}s
+ */
+ public static List<ExternalItem> parseExternals(byte[] description,
+ String parentDirectory,
+ boolean canonicalizeUrl)
+ throws ClientException
+ {
+ return propLib.parseExternals(description, parentDirectory,
+ canonicalizeUrl);
+ }
+
+ /**
+ * Unparse and list of external items into a format suitable for
+ * the value of the <code>svn:externals</code> property and
+ * validate the result.
+ * @param items The list of {@link ExternalItem}s
+ * @param parentDirectory Used to construct error messages.
+ * @param compatibleWithSvn1_5 When <code>true</code>, the format
+ * of the returned property value will be compatible with
+ * clients older than Subversion 1.5.
+ */
+ public static byte[] unparseExternals(List<ExternalItem> items,
+ String parentDirectory)
+ throws SubversionException
+ {
+ return propLib.unparseExternals(items, parentDirectory, false);
+ }
+
+ /**
+ * Unparse and list of external items into a format suitable for
+ * the value of the <code>svn:externals</code> property compatible
+ * with Subversion clients older than release 1.5, and validate
+ * the result.
+ * @param items The list of {@link ExternalItem}s
+ * @param parentDirectory Used to construct error messages.
+ */
+ public static byte[] unparseExternalsForAncientUnsupportedClients(
+ List<ExternalItem> items, String parentDirectory)
+ throws SubversionException
+ {
+ return propLib.unparseExternals(items, parentDirectory, true);
+ }
+
+ /**
+ * If the URL in <code>external</code> is relative, resolve it to
+ * an absolute URL, using <code>reposRootUrl</code> and
+ * <code>parentDirUrl</code> to provide contest.
+ *<p>
+ * Regardless if the URL is absolute or not, if there are no
+ * errors, the returned URL will be canonicalized.
+ *<p>
+ * The following relative URL formats are supported:
+ * <dl>
+ * <dt><code>../</code></dt>
+ * <dd>relative to the parent directory of the external</dd>
+ * <dt><code>^/</code></dt>
+ * <dd>relative to the repository root</dd>
+ * <dt><code>//</code></dt>
+ * <dd>relative to the scheme</dd>
+ * <dt><code>/</code></dt>
+ * <dd>relative to the server's hostname</dd>
+ * </dl>
+ *<p>
+ * The <code>../<code> and ^/ relative URLs may use <code>..</code>
+ * to remove path elements up to the server root.
+ *<p>
+ * The external URL should not be canonicalized before calling
+ * this function, as otherwise the scheme relative URL
+ * '<code>//host/some/path</code>' would have been canonicalized
+ * to '<code>/host/some/path</code>' and we would not be able to
+ * match on the leading '<code>//</code>'.
+ */
+ public static String resolveExternalsUrl(ExternalItem external,
+ String reposRootUrl,
+ String parentDirUrl)
+ throws ClientException
+ {
+ return propLib.resolveExternalsUrl(
+ external, reposRootUrl, parentDirUrl);
+ }
+
+ //
+ // Newline translation and keyword expansion
+ //
+ private static final SubstLib substLib = new SubstLib();
+
+ /**
+ * Use the linefeed code point ('<code>\x0a</code>')
+ * for the newline separator.
+ * @see translateStream
+ * @see untranslateStream
+ */
+ public static final byte[] EOL_LF = SubstLib.EOL_LF;
+
+ /**
+ * Use the carraige-return code point ('<code>\x0d</code>')
+ * for the newline separator.
+ * @see translateStream
+ * @see untranslateStream
+ */
+ public static final byte[] EOL_CR = SubstLib.EOL_CR;
+
+ /**
+ * Use carriage-return/linefeed sequence ('<code>\x0d\x0a</code>')
+ * for the newline separator.
+ * @see translateStream
+ * @see untranslateStream
+ */
+ public static final byte[] EOL_CRLF = SubstLib.EOL_CRLF;
+
+
+ /**
+ * Build a dictionary of expanded keyword values, given the
+ * contents of a file's <code>svn:keywords</code> property, its
+ * revision, URL, the date it was committed on, the author of the
+ * commit and teh URL of the repository root.
+ *<p>
+ * Custom keywords defined in <code>svn:keywords</code> properties
+ * are expanded using the provided parameters and in accordance
+ * with the following format substitutions in the
+ * <code>keywordsValue</code>:
+ * <dl>
+ * <dt><code>%a</dt></code>
+ * <dd>The author.</dd>
+ * <dt><code>%b</dt></code>
+ * <dd>The basename of the URL.</dd>
+ * <dt><code>%d</dt></code>
+ * <dd>Short format of the date.</dd>
+ * <dt><code>%D</dt></code>
+ * <dd>Long format of the date.</dd>
+ * <dt><code>%P</dt></code>
+ * <dd>The file's path, relative to the repository root URL.</dd>
+ * <dt><code>%r</dt></code>
+ * <dd>The revision.</dd>
+ * <dt><code>%R</dt></code>
+ * <dd>The URL to the root of the repository.</dd>
+ * <dt><code>%u</dt></code>
+ * <dd>The URL of the file.</dd>
+ * <dt><code>%_</dt></code>
+ * <dd>A space (keyword definitions cannot contain a literal space).</dd>
+ * <dt><code>%%</dt></code>
+ * <dd>A literal '%'.</dd>
+ * <dt><code>%H</dt></code>
+ * <dd>Equivalent to <code>%P%_%r%_%d%_%a</code>.</dd>
+ * <dt><code>%I</dt></code>
+ * <dd>Equivalent to <code>%b%_%r%_%d%_%a</code>.</dd>
+ * </dl>
+ *<p>
+ * Custom keywords are defined by appending '=' to the keyword
+ * name, followed by a string containing any combination of the
+ * format substitutions.
+ *<p>
+ * Any of the <code>revision</code>, <code>url</code>,
+ * <code>reposRootUrl</code>, <code>date</code> and
+ * <code>author</code> parameters may be <code>null</code>, or
+ * {@link Revision#SVN_INVALID_REVNUM} for <code>revision</code>,
+ * to indicate that the information is not present. Each piece of
+ * information that is not present expands to the empty string
+ * wherever it appears in an expanded keyword value. (This can
+ * result in multiple adjacent spaces in the expansion of a
+ * multi-valued keyword such as "<code>Id</code>".)
+ */
+ public static Map<String, byte[]> buildKeywords(byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException
+ {
+ return substLib.buildKeywords(keywordsValue, revision,
+ url, reposRootUrl, date, author);
+ }
+
+ /**
+ * Return a stream which performs end-of-line translation and
+ * keyword expansion when read from.
+ *<p>
+ * <b>Important:</b> Make sure you close the returned stream to
+ * ensure all data are flushed and cleaned up (this will also
+ * close the provided stream and dispose the related netive
+ * object).
+ *<p>
+ * If <code>eolMarker</code> is not <code>null</code>, replace
+ * whatever any end-of-line sequences in the input with
+ * <code>eolMarker</code>. If the input has an inconsistent line
+ * ending style, then:
+ * <ul>
+ * <li>if <code>repairEol</code> is <code>false</code>, then a
+ * subsequent read or other operation on the stream will
+ * generate an error when the inconsistency is detected;</li>
+ * <li>if <code>repaorEol</code> is <code>true</code>, convert any
+ * line ending to <code>eolMarker</code>.<br/>
+ * Recognized line endings are: "<code>\n</code>",
+ * "<code>\r</code>", and "<code>\r\n</code>".</li>
+ * </ul>
+ *<p>
+ * Expand or contract keywords using the contents of
+ * <code>keywords</code> as the new values. If
+ * <code>expandKeywords</code> is <code>true</code>, expand
+ * contracted keywords and re-expand expanded keywords; otherwise,
+ * contract expanded keywords and ignore contracted ones.
+ * Keywords not found in the dictionary are ignored (not
+ * contracted or expanded). If the <code>keywords</code> itself
+ * is <code>null</code>, keyword substitution will be altogether
+ * ignored.
+ *<p>
+ * Detect only keywords that are no longer than
+ * <code>SVN_KEYWORD_MAX_LEN</code> bytes (currently: 255),
+ * including the delimiters and the keyword itself.
+ *<p>
+ * Recommendation: if <code>expandKeywords</code> is
+ * <code>false</code>, then you don't care about the keyword
+ * values, so just put <code>null</code> values into the
+ * <code>keywords</code> dictionary.
+ *<p>
+ * If the inner stream implements marking and seeking via
+ * {@link InputStream#mark} and {@link InputStream#reset}, the
+ * translated stream will too.
+ *
+ * @param source the source (untranslated) stream.
+ * @param eolMarker the byte sequence to use as the end-of-line marker;
+ * must be one of {@link #EOL_LF}, {@link #EOL_CR}
+ * or {@link #EOL_CRLF}.
+ * @param repairEol flag to repair end-of-lines; see above
+ * @param keywords the keyword dictionary; see {@link buildKeywords}
+ * @param expandKeywords flag to expand keywords
+ */
+ public static InputStream translateStream(InputStream source,
+ byte[] eolMarker,
+ boolean repairEol,
+ Map<String, byte[]> keywords,
+ boolean expandKeywords)
+ throws SubversionException, ClientException
+ {
+ return substLib.translateInputStream(
+ source, eolMarker, repairEol,
+ keywords, true, expandKeywords,
+ null, Revision.SVN_INVALID_REVNUM,
+ null, null, null, null);
+ }
+
+ /**
+ * Expand keywords and return a stream which performs end-of-line
+ * translation and keyword expansion when read from.
+ * @see buildKeywords
+ * @see translateStream(InputStream,byte[],boolean,Map,boolean)
+ */
+ public static InputStream translateStream(InputStream source,
+ byte[] eolMarker,
+ boolean repairEol,
+ boolean expandKeywords,
+ byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException
+ {
+ return substLib.translateInputStream(
+ source, eolMarker, repairEol,
+ null, false, expandKeywords,
+ keywordsValue, revision,
+ url, reposRootUrl, date, author);
+ }
+
+ /**
+ * Return a stream which performs end-of-line translation and
+ * keyword expansion when written to. Behaves like
+ * {@link #translateStream(InputStream,byte[],boolean,Map,boolean)},
+ * except that it translates an <code>OutputStream</code> and never
+ * supports marking and seeking.
+ */
+ public static OutputStream translateStream(OutputStream destination,
+ byte[] eolMarker,
+ boolean repairEol,
+ Map<String, byte[]> keywords,
+ boolean expandKeywords)
+ throws SubversionException, ClientException
+ {
+ return substLib.translateOutputStream(
+ destination, eolMarker, repairEol,
+ keywords, true, expandKeywords,
+ null, Revision.SVN_INVALID_REVNUM,
+ null, null, null, null);
+ }
+
+ /**
+ * Expand keywords and return a stream which performs end-of-line
+ * translation and keyword expansion when written to.
+ * @see buildKeywords
+ * @see translateStream(OutputStream,byte[],boolean,Map,boolean)
+ */
+ public static OutputStream translateStream(OutputStream destination,
+ byte[] eolMarker,
+ boolean repairEol,
+ boolean expandKeywords,
+ byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException
+ {
+ return substLib.translateOutputStream(
+ destination, eolMarker, repairEol,
+ null, false, expandKeywords,
+ keywordsValue, revision,
+ url, reposRootUrl, date, author);
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java
index 9eba3b0..c0436fd 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/SubversionException.java
@@ -47,4 +47,16 @@ public class SubversionException extends Exception
{
super(message);
}
+
+ /**
+ * This constructor is only used by sub-classes and the native
+ * implementation.
+ *
+ * @param message A description of the problem.
+ * @param cause The root cause of the exception.
+ */
+ protected SubversionException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
new file mode 100644
index 0000000..d4a4f4e
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/AuthnCallback.java
@@ -0,0 +1,495 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Logger;
+
+/**
+ * <p>The interface for requesting authentication credentials from the
+ * user. Should the javahl bindings need the matching information,
+ * these methodes will be called.</p>
+ *
+ * <p>This callback can also be used to provide the equivalent of the
+ * <code>--no-auth-cache</code> and <code>--non-interactive</code>
+ * arguments accepted by the command-line client.</p>
+ *
+ * @since 1.9
+ */
+public interface AuthnCallback
+{
+ /**
+ * Abstract base class for callback results.
+ */
+ public abstract class AuthnResult
+ {
+ protected boolean save = false; // Allow saving the credentials
+ protected boolean trust = false; // SSL server cert trust
+ protected String identity = null; // Username or client cert filename
+ protected String secret = null; // Password or client cert passphrase
+ }
+
+ /**
+ * The result type used by {@see #usernamePrompt}.
+ */
+ public static final class UsernameResult
+ extends AuthnResult
+ implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Set the username in the result.
+ * Assumes the result may not be stored permanently.
+ * @param username The username.
+ */
+ public UsernameResult(String username)
+ {
+ identity = username;
+ }
+
+ /**
+ * Set the username in the result.
+ * @param username The username.
+ * @param maySave Set if the result may be stored permanently.
+ */
+ public UsernameResult(String username, boolean maySave)
+ {
+ save = maySave;
+ identity = username;
+ }
+ }
+
+ /**
+ * Ask for a username.
+ * @param realm The realm from which the question originates.
+ * @param maySave Indiceates whether saving credentials is allowed;
+ * if <code>false</code>, the <code>maySave</code> flag
+ * in the return value will be ignored.
+ * @return The result, or <code>null</code> if cancelled.
+ */
+ public UsernameResult usernamePrompt(String realm, boolean maySave);
+
+
+ /**
+ * The result type used by {@see #userPasswordPrompt}.
+ */
+ public static final class UserPasswordResult
+ extends AuthnResult
+ implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Set the username and password in the result.
+ * Assumes the result may not be stored permanently.
+ * @param username The username.
+ * @param password The password.
+ */
+ public UserPasswordResult(String username, String password)
+ {
+ identity = username;
+ secret = password;
+ }
+
+ /**
+ * Set the username and password in the result.
+ * @param username The user name.
+ * @param password The password.
+ * @param maySave Set if the result may be stored permanently.
+ */
+ public UserPasswordResult(String username, String password,
+ boolean maySave)
+ {
+ save = maySave;
+ identity = username;
+ secret = password;
+ }
+ }
+
+ /**
+ * Ask for a username and password.
+ * @param realm The realm from which the question originates.
+ * @param username The username for the realm, if known; may be <code>null</code>.
+ * @param maySave Indiceates whether saving credentials is allowed;
+ * if <code>false</code>, the <code>maySave</code> flag
+ * in the return value will be ignored.
+ * @return The result, or <code>null</code> if cancelled.
+ */
+ public UserPasswordResult userPasswordPrompt(String realm, String username,
+ boolean maySave);
+
+
+ /**
+ * Information about why parsing a server SSL certificate failed.
+ */
+ public static class SSLServerCertFailures implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * The certificate is not yet valid.
+ */
+ public boolean notYetValid()
+ {
+ return ((failures & NOT_YET_VALID) != 0);
+ }
+
+ /**
+ * The certificate has expired.
+ */
+ public boolean expired()
+ {
+ return ((failures & EXPIRED) != 0);
+ }
+
+ /**
+ * Certificate's CN (hostname) does not match the remote hostname.
+ */
+ public boolean cnMismatch()
+ {
+ return ((failures & CN_MISMATCH) != 0);
+ }
+
+ /**
+ * Certificate authority is unknown (i.e., not trusted).
+ */
+ public boolean unknownCA()
+ {
+ return ((failures & UNKNOWN_CA) != 0);
+ }
+
+ /**
+ * Other failure. This can happen if an unknown failure occurs
+ * that we do not handle yet.
+ */
+ public boolean other()
+ {
+ return ((failures & OTHER) != 0 || (failures & ~ALL_KNOWN) != 0);
+ }
+
+ /** @return the internal bitfield representation of the failures. */
+ public int getFailures()
+ {
+ return failures;
+ }
+
+ private static final int NOT_YET_VALID = 0x00000001;
+ private static final int EXPIRED = 0x00000002;
+ private static final int CN_MISMATCH = 0x00000004;
+ private static final int UNKNOWN_CA = 0x00000008;
+ private static final int OTHER = 0x40000000;
+
+ private static final int ALL_KNOWN = (NOT_YET_VALID | EXPIRED
+ | CN_MISMATCH | UNKNOWN_CA
+ | OTHER);
+
+ /* This private constructor is used by the native implementation. */
+ private SSLServerCertFailures(int failures)
+ {
+ /* Double-check that we did not forget to map any of the
+ failure flags, and flag an "other" failure. */
+ final int missing = (failures & ~ALL_KNOWN);
+
+ if (missing != 0) {
+ Logger log = Logger.getLogger("org.apache.subversion.javahl");
+ log.warning(String.format("Unknown SSL certificate parsing "
+ + "failure flags: %1$x", missing));
+ }
+
+ this.failures = failures;
+ }
+
+ private int failures;
+ }
+
+ /**
+ * Detailed information about the parsed server SSL certificate.
+ */
+ public static class SSLServerCertInfo implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @return The subject of the certificate.
+ */
+ public String getSubject()
+ {
+ return subject;
+ }
+
+ /**
+ * @return The certificate issuer.
+ */
+ public String getIssuer()
+ {
+ return issuer;
+ }
+
+ /**
+ * @return The from which the certificate is valid.
+ */
+ public Date getValidFrom()
+ {
+ return validFrom;
+ }
+
+ /**
+ * @return The date after which the certificate is no longer valid.
+ */
+ public Date getValidTo()
+ {
+ return validTo;
+ }
+
+ /**
+ * @return The certificate fingerprint.
+ */
+ public byte[] getFingerprint()
+ {
+ return fingerprint;
+ }
+
+ /**
+ * @return A list of host names that the certificate represents.
+ */
+ public List<String> getHostnames()
+ {
+ return hostnames;
+ }
+
+ /**
+ * @return the Base64-encoded raw certificate data.
+ */
+ public String getCert()
+ {
+ return asciiCert;
+ }
+
+ /* This private constructor is used by the native implementation. */
+ private SSLServerCertInfo(String subject, String issuer,
+ long validFrom, long validTo,
+ byte[] fingerprint,
+ List<String> hostnames,
+ String asciiCert)
+ {
+ this.subject = subject;
+ this.issuer = issuer;
+ this.validFrom = new Date(validFrom);
+ this.validTo = new Date(validTo);
+ this.fingerprint = fingerprint;
+ this.hostnames = hostnames;
+ this.asciiCert = asciiCert;
+ }
+
+ private String subject;
+ private String issuer;
+ private Date validFrom;
+ private Date validTo;
+ private byte[] fingerprint;
+ private List<String> hostnames;
+ private String asciiCert;
+ }
+
+ /**
+ * The result type used by {@see #sslServerTrustPrompt}.
+ */
+ public static final class SSLServerTrustResult
+ extends AuthnResult
+ implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Create a result that rejects the certificate.
+ */
+ public static SSLServerTrustResult reject()
+ {
+ return new SSLServerTrustResult(false, false);
+ }
+
+ /**
+ * Create a result that temporarily accepts the certificate,
+ * for the duration of the current connection.
+ */
+ public static SSLServerTrustResult acceptTemporarily()
+ {
+ return new SSLServerTrustResult(true, false);
+ }
+
+ /**
+ * Create a result that permanently accepts the certificate.
+ */
+ public static SSLServerTrustResult acceptPermanently()
+ {
+ return new SSLServerTrustResult(true, true);
+ }
+
+ private SSLServerTrustResult(boolean accept, boolean maySave)
+ {
+ save = maySave;
+ trust = accept;
+ }
+ }
+
+ /**
+ * Ask if we trust the server certificate.
+ * @param realm The realm from which the question originates.
+ * @param failures The result of parsing the certificate;
+ * if <code>null</code>, there were no failures.
+ * @param info Information extracted from the certificate.
+ * @param maySave Indiceates whether saving credentials is allowed;
+ * if <code>false</code>, the <code>maySave</code> flag
+ * in the return value will be ignored.
+ * @return The result, or <code>null</code> if cancelled.
+ */
+ public SSLServerTrustResult
+ sslServerTrustPrompt(String realm,
+ SSLServerCertFailures failures,
+ SSLServerCertInfo info,
+ boolean maySave);
+
+
+ /**
+ * The result type used by {@see #sslClientCertPrompt}.
+ */
+ public static final class SSLClientCertResult
+ extends AuthnResult
+ implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Set the absolute path of the cerfiticate file in the result.
+ * Assumes the result may not be stored permanently.
+ * @param path The absolute path of the certificate.
+ */
+ public SSLClientCertResult(String path)
+ {
+ identity = path;
+ }
+
+ /**
+ * Set the absolute path of the cerfiticate file in the result.
+ * @param path The absolute path of the certificate.
+ * @param maySave Set if the result may be stored permanently.
+ */
+ public SSLClientCertResult(String path, boolean maySave)
+ {
+ save = maySave;
+ identity = path;
+ }
+ }
+
+ /**
+ * Ask for the (local) file name of a client SSL certificate.
+ * @param realm The realm from which the question originates.
+ * @param maySave Indiceates whether saving credentials is allowed;
+ * if <code>false</code>, the <code>maySave</code> flag
+ * in the return value will be ignored.
+ * @return The result, or <code>null</code> if cancelled.
+ */
+ public SSLClientCertResult
+ sslClientCertPrompt(String realm, boolean maySave);
+
+
+ /**
+ * The result type used by {@see #sslClientCertPassphrasePrompt}.
+ */
+ public static final class SSLClientCertPassphraseResult
+ extends AuthnResult
+ implements java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Set the cerfiticate passphrase in the result.
+ * Assumes the result may not be stored permanently.
+ * @param passphrase The passphrase for decrypting the certificate.
+ */
+ public SSLClientCertPassphraseResult(String passphrase)
+ {
+ secret = passphrase;
+ }
+
+ /**
+ * Set the cerfiticate passphrase in the result.
+ * @param passphrase The passphrase for decrypting the certificate.
+ * @param maySave Set if the result may be stored permanently.
+ */
+ public SSLClientCertPassphraseResult(String passphrase, boolean maySave)
+ {
+ save = maySave;
+ secret = passphrase;
+ }
+ }
+
+ /**
+ * Ask for passphrase for decrypting a client SSL certificate.
+ * @param realm The realm from which the question originates.
+ * @param maySave Indiceates whether saving credentials is allowed;
+ * if <code>false</code>, the <code>maySave</code> flag
+ * in the return value will be ignored.
+ * @return The result, or <code>null</code> if cancelled.
+ */
+ public SSLClientCertPassphraseResult
+ sslClientCertPassphrasePrompt(String realm, boolean maySave);
+
+
+ /**
+ * Ask if a password may be stored on disk in plaintext.
+ * @param realm The realm from which the question originates.
+ * @return <code>true</code> if the password may be stored in plaintext.
+ */
+ public boolean allowStorePlaintextPassword(String realm);
+
+ /**
+ * Ask if a certificate passphrase may be stored on disk in plaintext.
+ * @param realm The realm from which the question originates.
+ * @return <code>true</code> if the passphrase may be stored in plaintext.
+ */
+ public boolean allowStorePlaintextPassphrase(String realm);
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java
new file mode 100644
index 0000000..6901714
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ConfigEvent.java
@@ -0,0 +1,42 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ISVNConfig;
+
+/**
+ * Interface for configuration-change hooks.
+ * @since 1.9
+ */
+public interface ConfigEvent
+{
+ /**
+ * Called by the native configuration loader every time the
+ * configuration is parsed into memory.
+ * @params configuration A reference to the in-memory configuration
+ * data. This object is only valid during the
+ * call and must not be accessed otherwise.
+ */
+ void onLoad(ISVNConfig configuration);
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java
new file mode 100644
index 0000000..accebca
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteFileRevisionsCallback.java
@@ -0,0 +1,36 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ISVNRemote;
+
+/**
+ * Called for each location segment returned from
+ * {@link ISVNRemote#getFileRevisions}.
+ */
+
+public interface RemoteFileRevisionsCallback
+{
+ void doRevision(ISVNRemote.FileRevision fileRevision);
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java
new file mode 100644
index 0000000..7430a69
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteLocationSegmentsCallback.java
@@ -0,0 +1,36 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ISVNRemote;
+
+/**
+ * Called for each location segment returned from
+ * {@link ISVNRemote#getLocationSegments}.
+ */
+
+public interface RemoteLocationSegmentsCallback
+{
+ void doSegment(ISVNRemote.LocationSegment locationSegment);
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java
new file mode 100644
index 0000000..60b956d
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/RemoteStatus.java
@@ -0,0 +1,187 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ISVNRemote;
+
+/**
+ * Called for each affected element in a remote status driave.
+ * <p>
+ * <b>Note:</b> All paths sent to the callback methods are relative to
+ * the {@link ISVNRemtoe} session's URL.
+ * @see ISVNRemote#status
+ * @since 1.9
+ */
+public interface RemoteStatus
+{
+ /**
+ * A directory was added.
+ * @param relativePath The session-relative path of the new directory.
+ */
+ void addedDirectory(String relativePath);
+
+ /**
+ * A file was added.
+ * @param relativePath The session-relative path of the new file.
+ */
+ void addedFile(String relativePath);
+
+ /**
+ * A symbolic link was added.
+ * @param relativePath The session-relative path of the new symbolic link.
+ */
+ void addedSymlink(String relativePath);
+
+ /**
+ * A directory was modified.
+ * @param relativePath The session-relative path of the directory.
+ * @param childrenModified The directory contents changed.
+ * @param propsModified The directory's properties changed.
+ * @param nodeInfo Additional information about the modified directory.
+ */
+ void modifiedDirectory(String relativePath,
+ boolean childrenModified,
+ boolean propsModified,
+ Entry nodeInfo);
+
+ /**
+ * A file was modified.
+ * @param relativePath The session-relative path of the directory.
+ * @param textModified The file contents changed.
+ * @param propsModified The file's properties changed.
+ * @param nodeInfo Additional information about the modified file.
+ */
+ void modifiedFile(String relativePath,
+ boolean textModified,
+ boolean propsModified,
+ Entry nodeInfo);
+
+ /**
+ * A symbolic link was modified.
+ * @param relativePath The session-relative path of the symlink.
+ * @param textModified The link target changed.
+ * @param propsModified The symlink's properties changed.
+ * @param nodeInfo Additional information about the modified symlink.
+ */
+ void modifiedSymlink(String relativePath,
+ boolean targetModified,
+ boolean propsModified,
+ Entry nodeInfo);
+
+
+ /**
+ * An entry was deleted.
+ * @param relativePath The session-relative path of the entry.
+ */
+ void deleted(String relativePath);
+
+
+ /**
+ * Contains additional information related to a modification or
+ * deletion event.
+ */
+ public static class Entry
+ implements Comparable<Entry>, java.io.Serializable
+ {
+ // Update the serialVersionUID when there is a incompatible
+ // change made to this class.
+ private static final long serialVersionUID = 1L;
+
+ private String uuid; // The UUID of the repository
+ private String author; // The author of the last change
+ private long revision; // Committed revision number
+ private long timestamp; // Commit timestamp (milliseconds from epoch)
+
+ public Entry(String uuid, String author, long revision, long timestamp)
+ {
+ this.uuid = uuid;
+ this.author = author;
+ this.revision = revision;
+ this.timestamp = timestamp;
+ }
+
+ /** @return The UUID of the repository that the node belongs to. */
+ public String getUuid() { return uuid; }
+
+ /** @return The author (committer) of the change. */
+ public String getLastAuthor() { return author; }
+
+ /** @return The revision number in with the change was committed. */
+ public long getCommittedRevision() { return revision; }
+
+ /**
+ * @return The timestamp, in milliseconds from the epoch, of
+ * the committed revision.
+ */
+ public long getCommittedTimestamp() { return timestamp; }
+
+ /** Implementation of interface {@link java.lang.Comparable}. */
+ public int compareTo(Entry that)
+ {
+ if (this == that)
+ return 0;
+
+ int cmp = uuid.compareTo(that.uuid);
+ if (cmp == 0) {
+ cmp = author.compareTo(that.author);
+ if (cmp == 0) {
+ cmp = (revision < that.revision ? 1
+ : (revision > that.revision ? -1 : 0));
+ if (cmp == 0)
+ cmp = (timestamp < that.timestamp ? 1
+ : (timestamp > that.timestamp ? -1 : 0));
+ }
+ }
+ return cmp;
+ }
+
+ @Override
+ public boolean equals(Object entry)
+ {
+ if (this == entry)
+ return true;
+ if (!super.equals(entry) || getClass() != entry.getClass())
+ return false;
+
+ final Entry that = (Entry)entry;
+ return (this.uuid == that.uuid
+ && this.author == that.author
+ && this.revision == that.revision
+ && this.timestamp == that.timestamp);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int factor = 33;
+ int hash = ((uuid == null) ? 0 : uuid.hashCode());
+ hash = factor * hash + ((author == null) ? 0 : author.hashCode());
+ hash = factor * hash + (int)(revision >> 32) & 0xffffffff;
+ hash = factor * hash + (int)revision & 0xffffffff;
+ hash = factor * hash + (int)(timestamp >> 32) & 0xffffffff;
+ hash = factor * hash + (int)timestamp & 0xffffffff;
+ return hash;
+ }
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java
new file mode 100644
index 0000000..4d47b80
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ReposVerifyCallback.java
@@ -0,0 +1,60 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.types.Revision;
+import org.apache.subversion.javahl.callback.ReposNotifyCallback;
+import org.apache.subversion.javahl.callback.ReposVerifyCallback;
+
+import java.util.EventListener;
+
+/**
+ * Error notifications from
+ * {@link ISVNRepos#verify(File,Revision,Revision,boolean,boolean,ReposNotifyCallback,ReposVerifyCallback)}.
+ *
+ * @since 1.9
+ */
+public interface ReposVerifyCallback extends EventListener
+{
+ /**
+ * This callback method is invoked every time {@link ISVNRepos#verify}
+ * encounters an error.
+ *<p>
+ * The implementation can either consume <code>verifyError</code>
+ * and return normally to continue verifying the repository after
+ * an error, or throw <code>verifyError</code> (or some other
+ * exception) to indicate that verification should stop. In the
+ * second case, the thrown exception will propagate to the caller
+ * of {@link ISVNRepos#verify}.
+ *
+ * @param revision The revision that caused the error.
+ * If <code>revision</code> is {@link Revision#SVN_INVALID_REVNUM},
+ * the error occurred during metadata verification.
+ * @param verifyError The verification error.
+ * @throws ClientException
+ */
+ void onVerifyError(long revision, ClientException verifyError)
+ throws ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java
new file mode 100644
index 0000000..b23161d
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/TunnelAgent.java
@@ -0,0 +1,94 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.callback;
+
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
+
+/**
+ * Callback interface for creating and managing tunnels for ra_svn
+ * connections.
+ *
+ * Note that tunnel agent implementations should run in a separate
+ * thread of control than the one that invokes an ISVNClient or
+ * RemoteSession method that requires a tunnel, otherwise the method
+ * will deadlock.
+ *
+ * @since 1.9
+ */
+public interface TunnelAgent
+{
+ /**
+ * This callback method is called before a tunnel is created, to
+ * determine whether to use this tunnel implementation, or revert
+ * to the default (native) tunnel implementation.
+ * @param name the name of the tunnel, as in
+ * <tt>svn+</tt><em>name</em><tt>://...</tt>
+ * @return <code>false</code> to defer to the default implementation.
+ */
+ boolean checkTunnel(String name);
+
+ /**
+ * Callback interface returned from {@link #openTunnel()}.
+ */
+ public static interface CloseTunnelCallback
+ {
+ /**
+ * This callback method is called when a tunnel needs to be closed
+ * and the request and response streams detached from it.
+ * <p>
+ * <b>Note:</b> Errors on connection-close are not propagated
+ * to the implementation, therefore this method cannot throw
+ * any exceptions.
+ */
+ void closeTunnel();
+ }
+
+ /**
+ * This callback method is called when a tunnel needs to be
+ * created and the request and response streams attached to it.
+ * @param request The request stream of the tunnel. The tunnel
+ * agent implementation will read requests from this channel
+ * and send them to the tunnel process.
+ * @param response The request stream of the tunnel. The tunnel
+ * agent implementation will read requests from this channel
+ * and send them to the tunnel process.
+ * @param name the name of the tunnel, as in
+ * <tt>svn+</tt><em>name</em><tt>://...</tt>
+ * @param user the tunnel username
+ * @param hostname the host part of the svn+tunnel:// URL
+ * @param port the port part of the svn+tunnel:// URL
+ *
+ * @return an instance od {@link CloseTunnelCallback}, which will
+ * be invoked when the connection is closed, or
+ * <code>null</code>.
+ *
+ * @throws any exception will abort the connection
+ */
+ CloseTunnelCallback openTunnel(ReadableByteChannel request,
+ WritableByteChannel response,
+ String name, String user,
+ String hostname, int port)
+ throws Throwable;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java
index f8e3775..a89f219 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/UserPasswordCallback.java
@@ -31,7 +31,10 @@ package org.apache.subversion.javahl.callback;
* <p>This callback can also be used to provide the equivalent of the
* <code>--no-auth-cache</code> and <code>--non-interactive</code>
* arguments accepted by the command-line client.</p>
+ *
+ * @deprecated Use {@see AuthnCallback}.
*/
+@Deprecated
public interface UserPasswordCallback
{
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java
new file mode 100644
index 0000000..a6f8638
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/CommitEditor.java
@@ -0,0 +1,174 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import org.apache.subversion.javahl.ISVNEditor;
+import org.apache.subversion.javahl.JNIObject;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Implementation of ISVNEditor that drives commits.
+ * @since 1.9
+ */
+public class CommitEditor extends JNIObject implements ISVNEditor
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ public void dispose()
+ {
+ session.disposeEditor(this);
+ nativeDispose();
+ }
+
+ public native void addDirectory(String relativePath,
+ Iterable<String> children,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ public native void addFile(String relativePath,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ /**
+ * <b>Note:</b> Not implemented.
+ */
+ public native void addSymlink(String relativePath,
+ String target,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ throws ClientException;
+
+ public native void addAbsent(String relativePath,
+ NodeKind kind,
+ long replacesRevision)
+ throws ClientException;
+
+ public native void alterDirectory(String relativePath,
+ long revision,
+ Iterable<String> children,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ public native void alterFile(String relativePath,
+ long revision,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ /**
+ * <b>Note:</b> Not implemented.
+ */
+ public native void alterSymlink(String relativePath,
+ long revision,
+ String target,
+ Map<String, byte[]> properties)
+ throws ClientException;
+
+ public native void delete(String relativePath,
+ long revision)
+ throws ClientException;
+
+ public native void copy(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ throws ClientException;
+
+ public native void move(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ throws ClientException;
+
+ public native void complete() throws ClientException;
+
+ public native void abort() throws ClientException;
+
+ /**
+ * This factory method called from RemoteSession.getCommitEditor.
+ */
+ static final
+ CommitEditor createInstance(RemoteSession session,
+ Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks,
+ ISVNEditor.ProvideBaseCallback baseCB,
+ ISVNEditor.ProvidePropsCallback propsCB,
+ ISVNEditor.GetNodeKindCallback kindCB)
+ throws ClientException
+ {
+ long cppAddr = nativeCreateInstance(
+ session, revisionProperties, commitCallback,
+ lockTokens, keepLocks, baseCB, propsCB, kindCB);
+ return new CommitEditor(cppAddr, session);
+ }
+
+ /**
+ * This constructor is called from the factory to get an instance.
+ */
+ protected CommitEditor(long cppAddr, RemoteSession session)
+ {
+ super(cppAddr);
+ this.session = session;
+ }
+
+ /** Stores a reference to the session that created this editor. */
+ protected RemoteSession session;
+
+ @Override
+ public native void finalize() throws Throwable;
+
+ /*
+ * Wrapped private native implementation declarations.
+ */
+ private native void nativeDispose();
+ private static final native
+ long nativeCreateInstance(RemoteSession session,
+ Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks,
+ ISVNEditor.ProvideBaseCallback baseCB,
+ ISVNEditor.ProvidePropsCallback propsCB,
+ ISVNEditor.GetNodeKindCallback kindCB)
+ throws ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java
new file mode 100644
index 0000000..16b4cd7
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteFactory.java
@@ -0,0 +1,318 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.callback.*;
+import org.apache.subversion.javahl.types.*;
+
+import org.apache.subversion.javahl.ISVNRemote;
+import org.apache.subversion.javahl.NativeResources;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.SubversionException;
+
+import java.util.HashSet;
+
+
+/**
+ * Factory class for creating ISVNRemote instances.
+ * @since 1.9
+ */
+public class RemoteFactory
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
+ * Default constructor.
+ */
+ public RemoteFactory() {}
+
+ /**
+ * Initializing constructor. Any or all of its arguments may be null.
+ */
+ public RemoteFactory(String configDirectory,
+ String username, String password,
+ AuthnCallback prompt,
+ ProgressCallback progress,
+ ConfigEvent configHandler,
+ TunnelAgent tunnelAgent)
+ {
+ setConfigDirectory(configDirectory);
+ setUsername(username);
+ setPassword(password);
+ setPrompt(prompt);
+ setProgressCallback(progress);
+ setConfigEventHandler(configHandler);
+ setTunnelAgent(tunnelAgent);
+ }
+
+ /**
+ * Initializing constructor. Any or all of its arguments may be null.
+ */
+ @SuppressWarnings("deprecation")
+ public RemoteFactory(String configDirectory,
+ String username, String password,
+ UserPasswordCallback prompt,
+ ProgressCallback progress,
+ ConfigEvent configHandler,
+ TunnelAgent tunnelAgent)
+ {
+ setConfigDirectory(configDirectory);
+ setUsername(username);
+ setPassword(password);
+ setPrompt(prompt);
+ setProgressCallback(progress);
+ setConfigEventHandler(configHandler);
+ setTunnelAgent(tunnelAgent);
+ }
+
+ /**
+ * Sets the username used for authentication.
+ * @param username The username; Set to the <code>null</code> to clear it.
+ * @throws IllegalArgumentException If <code>username</code> is empty.
+ * @see #password(String)
+ */
+ public void setUsername(String username)
+ {
+ if (username != null && username.isEmpty())
+ throw new IllegalArgumentException("username must not be empty");
+ this.username = username;
+ }
+
+ /**
+ * Sets the password used for authentication.
+ * @param password The passwordp Set <code>null</code> to clear it.
+ * @throws IllegalArgumentException If <code>password</code> is empty.
+ * @see #username(String)
+ */
+ public void setPassword(String password)
+ {
+ if (password != null && password.isEmpty())
+ throw new IllegalArgumentException("password must not be empty");
+ this.password = password;
+ }
+
+ /**
+ * Register callback interface to supply username and password on demand.
+ * This callback can also be used to provide theequivalent of the
+ * <code>--no-auth-cache</code> and <code>--non-interactive</code>
+ * arguments accepted by the command-line client.
+ * @param prompt the callback interface
+ */
+ public void setPrompt(AuthnCallback prompt)
+ {
+ assert(this.deprecatedPrompt == null);
+ this.prompt = prompt;
+ }
+
+ /**
+ * Register callback interface to supply username and password on demand.
+ * This callback can also be used to provide theequivalent of the
+ * <code>--no-auth-cache</code> and <code>--non-interactive</code>
+ * arguments accepted by the command-line client.
+ * @param prompt the callback interface
+ */
+ @SuppressWarnings("deprecation")
+ public void setPrompt(UserPasswordCallback prompt)
+ {
+ assert(this.prompt == null);
+ this.deprecatedPrompt = prompt;
+ }
+
+ /**
+ * Set the progress callback for new sessions.
+ *
+ * @param progress The progress callback.
+ */
+ public void setProgressCallback(ProgressCallback progress)
+ {
+ this.progress = progress;
+ }
+
+ /**
+ * Set directory for the configuration information.
+ */
+ public void setConfigDirectory(String configDirectory)
+ {
+ this.configDirectory = configDirectory;
+ }
+
+ /**
+ * Set an event handler that will be called every time the
+ * configuration is loaded by the ISVNRemote objects created by
+ * this factory.
+ */
+ public void setConfigEventHandler(ConfigEvent configHandler)
+ {
+ this.configHandler = configHandler;
+ }
+
+ /**
+ * Set callbacks for ra_svn tunnel handling.
+ */
+ public void setTunnelAgent(TunnelAgent tunnelAgent)
+ {
+ this.tunnelAgent = tunnelAgent;
+ }
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The URL can point to a subtree of the repository.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param url The initial session root URL.
+ * @throws RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ */
+ public ISVNRemote openRemoteSession(String url)
+ throws ClientException, SubversionException
+ {
+ return open(1, url, null, configDirectory,
+ username, password, prompt, deprecatedPrompt, progress,
+ configHandler, tunnelAgent);
+ }
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The URL can point to a subtree of the repository.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param url The initial session root URL.
+ * @param retryAttempts The number of times to retry the operation
+ * if the given URL is redirected.
+ * @throws IllegalArgumentException If <code>retryAttempts</code>
+ * is not positive
+ * @throws RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ */
+ public ISVNRemote openRemoteSession(String url, int retryAttempts)
+ throws ClientException, SubversionException
+ {
+ if (retryAttempts <= 0)
+ throw new IllegalArgumentException(
+ "retryAttempts must be positive");
+ return open(retryAttempts, url, null, configDirectory,
+ username, password, prompt, deprecatedPrompt, progress,
+ configHandler, tunnelAgent);
+ }
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The URL can point to a subtree of the repository.
+ * <p>
+ * <b>Note:</b> If the UUID does not match the repository,
+ * this function fails.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param url The initial session root URL.
+ * @param reposUUID The expected repository UUID; may not be null..
+ * @throws IllegalArgumentException If <code>reposUUID</code> is null.
+ * @throws RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ */
+ public ISVNRemote openRemoteSession(String url, String reposUUID)
+ throws ClientException, SubversionException
+ {
+ if (reposUUID == null)
+ throw new IllegalArgumentException("reposUUID may not be null");
+ return open(1, url, reposUUID, configDirectory,
+ username, password, prompt, deprecatedPrompt, progress,
+ configHandler, tunnelAgent);
+ }
+
+ /**
+ * Open a persistent session to a repository.
+ * <p>
+ * <b>Note:</b> The URL can point to a subtree of the repository.
+ * <p>
+ * <b>Note:</b> If the UUID does not match the repository,
+ * this function fails.
+ * <p>
+ * <b>Note:</b> The session object inherits the progress callback,
+ * configuration directory and authentication info.
+ *
+ * @param url The initial session root URL.
+ * @param reposUUID The expected repository UUID; may not be null..
+ * @param retryAttempts The number of times to retry the operation
+ * if the given URL is redirected.
+ * @throws IllegalArgumentException If <code>reposUUID</code> is null
+ * or <code>retryAttempts</code> is not positive
+ * @throws RetryOpenSession If the session URL was redirected
+ * @throws SubversionException If an URL redirect cycle was detected
+ * @throws ClientException
+ */
+ public ISVNRemote openRemoteSession(String url, String reposUUID,
+ int retryAttempts)
+ throws ClientException, SubversionException
+ {
+ if (reposUUID == null)
+ throw new IllegalArgumentException("reposUUID may not be null");
+ if (retryAttempts <= 0)
+ throw new IllegalArgumentException(
+ "retryAttempts must be positive");
+ return open(retryAttempts, url, reposUUID, configDirectory,
+ username, password, prompt, deprecatedPrompt, progress,
+ configHandler, tunnelAgent);
+ }
+
+ private String configDirectory;
+ private String username;
+ private String password;
+ private AuthnCallback prompt;
+ @SuppressWarnings("deprecation")
+ private UserPasswordCallback deprecatedPrompt;
+ private ProgressCallback progress;
+ private ConfigEvent configHandler;
+ private TunnelAgent tunnelAgent;
+
+ /* Native factory implementation. */
+ @SuppressWarnings("deprecation")
+ private static native ISVNRemote open(int retryAttempts,
+ String url, String reposUUID,
+ String configDirectory,
+ String username, String password,
+ AuthnCallback prompt,
+ UserPasswordCallback deprecatedPompt,
+ ProgressCallback progress,
+ ConfigEvent configHandler,
+ TunnelAgent tunnelAgent)
+ throws ClientException, SubversionException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java
new file mode 100644
index 0000000..f921e79
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java
@@ -0,0 +1,427 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import org.apache.subversion.javahl.ISVNRemote;
+import org.apache.subversion.javahl.ISVNEditor;
+import org.apache.subversion.javahl.ISVNReporter;
+import org.apache.subversion.javahl.JNIObject;
+import org.apache.subversion.javahl.OperationContext;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.io.OutputStream;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+
+public class RemoteSession extends JNIObject implements ISVNRemote
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ public void dispose()
+ {
+ if (editorReference != null)
+ {
+ // Deactivate the open editor
+ ISVNEditor ed = editorReference.get();
+ if (ed != null)
+ {
+ ed.dispose();
+ editorReference.clear();
+ }
+ editorReference = null;
+ }
+ if (reporterReference != null)
+ {
+ // Deactivate the open reporter
+ ISVNReporter rp = reporterReference.get();
+ if (rp != null)
+ {
+ rp.dispose();
+ reporterReference.clear();
+ }
+ reporterReference = null;
+ }
+ nativeDispose();
+ }
+
+ public native void cancelOperation() throws ClientException;
+
+ public native void reparent(String url) throws ClientException;
+
+ public native String getSessionUrl() throws ClientException;
+
+ public native String getSessionRelativePath(String url)
+ throws ClientException;
+
+ public native String getReposRelativePath(String url)
+ throws ClientException;
+
+ public native String getReposUUID() throws ClientException;
+
+ public native String getReposRootUrl() throws ClientException;
+
+ public native long getLatestRevision() throws ClientException;
+
+ public long getRevisionByDate(Date date) throws ClientException
+ {
+ long timestamp = MICROSECONDS.convert(date.getTime(), MILLISECONDS);
+ return getRevisionByTimestamp(timestamp);
+ }
+
+ public native long getRevisionByTimestamp(long timestamp)
+ throws ClientException;
+
+ public void changeRevisionProperty(long revision,
+ String propertyName,
+ byte[] oldValue,
+ byte[] newValue)
+ throws ClientException
+ {
+ if (oldValue != null && !hasCapability(Capability.atomic_revprops))
+ throw new IllegalArgumentException(
+ "oldValue must be null;\n" +
+ "The server does not support" +
+ " atomic revision property changes");
+ nativeChangeRevisionProperty(revision, propertyName,
+ oldValue, newValue);
+ }
+
+ public native Map<String, byte[]> getRevisionProperties(long revision)
+ throws ClientException;
+
+ public native byte[] getRevisionProperty(long revision, String propertyName)
+ throws ClientException;
+
+ public ISVNEditor getCommitEditor(Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks,
+ ISVNEditor.ProvideBaseCallback getBase,
+ ISVNEditor.ProvidePropsCallback getProps,
+ ISVNEditor.GetNodeKindCallback getCopyfromKind)
+ throws ClientException
+ {
+ check_inactive(editorReference, reporterReference);
+ ISVNEditor ed =
+ CommitEditor.createInstance(this, revisionProperties,
+ commitCallback, lockTokens, keepLocks,
+ getBase, getProps, getCopyfromKind);
+ if (editorReference != null)
+ editorReference.clear();
+ editorReference = new WeakReference<ISVNEditor>(ed);
+ return ed;
+ }
+
+ public ISVNEditor getCommitEditor(Map<String, byte[]> revisionProperties,
+ CommitCallback commitCallback,
+ Set<Lock> lockTokens, boolean keepLocks)
+ throws ClientException
+ {
+ return getCommitEditor(revisionProperties, commitCallback,
+ lockTokens, keepLocks, null, null, null);
+ }
+
+ public long getFile(long revision, String path,
+ OutputStream contents,
+ Map<String, byte[]> properties)
+ throws ClientException
+ {
+ maybe_clear(properties);
+ return nativeGetFile(revision, path, contents, properties);
+ }
+
+ public long getDirectory(long revision, String path,
+ int direntFields,
+ Map<String, DirEntry> dirents,
+ Map<String, byte[]> properties)
+ throws ClientException
+ {
+ maybe_clear(dirents);
+ maybe_clear(properties);
+ return nativeGetDirectory(revision, path,
+ direntFields, dirents, properties);
+ }
+
+ public native Map<String, Mergeinfo>
+ getMergeinfo(Iterable<String> paths, long revision,
+ Mergeinfo.Inheritance inherit,
+ boolean includeDescendants)
+ throws ClientException;
+
+ // TODO: update
+ // TODO: switch
+
+ public ISVNReporter status(String statusTarget,
+ long revision, Depth depth,
+ RemoteStatus receiver)
+ throws ClientException
+ {
+ check_inactive(editorReference, reporterReference);
+ StateReporter rp = StateReporter.createInstance(this);
+
+ // At this point, the reporter is not active/valid.
+ StatusEditor editor = new StatusEditor(receiver);
+ nativeStatus(statusTarget, revision, depth, editor, rp);
+ // Now it should be valid.
+
+ if (reporterReference != null)
+ reporterReference.clear();
+ reporterReference = new WeakReference<ISVNReporter>(rp);
+ return rp;
+ }
+
+ // TODO: diff
+
+ public native void getLog(Iterable<String> paths,
+ long startRevision, long endRevision, int limit,
+ boolean strictNodeHistory, boolean discoverPath,
+ boolean includeMergedRevisions,
+ Iterable<String> revisionProperties,
+ LogMessageCallback callback)
+ throws ClientException;
+
+ public native NodeKind checkPath(String path, long revision)
+ throws ClientException;
+
+ public native DirEntry stat(String path, long revision)
+ throws ClientException;
+
+ public native Map<Long, String>
+ getLocations(String path, long pegRevision,
+ Iterable<Long> locationRevisions)
+ throws ClientException;
+
+ public native
+ void getLocationSegments(String path,
+ long pegRevision,
+ long startRevision,
+ long endRevision,
+ RemoteLocationSegmentsCallback handler)
+ throws ClientException;
+
+ private static class GetLocationSegmentsHandler
+ implements RemoteLocationSegmentsCallback
+ {
+ public List<LocationSegment> locationSegments = null;
+ public void doSegment(LocationSegment locationSegment)
+ {
+ if (locationSegments == null)
+ locationSegments = new ArrayList<LocationSegment>();
+ locationSegments.add(locationSegment);
+ }
+ }
+
+ public List<LocationSegment> getLocationSegments(String path,
+ long pegRevision,
+ long startRevision,
+ long endRevision)
+ throws ClientException
+ {
+ final GetLocationSegmentsHandler handler = new GetLocationSegmentsHandler();
+ getLocationSegments(path, pegRevision, startRevision, endRevision, handler);
+ return handler.locationSegments;
+ }
+
+ public native
+ void getFileRevisions(String path,
+ long startRevision,
+ long endRevision,
+ boolean includeMergedRevisions,
+ RemoteFileRevisionsCallback handler)
+ throws ClientException;
+
+ private static class GetFileRevisionsHandler
+ implements RemoteFileRevisionsCallback
+ {
+ public List<FileRevision> fileRevisions = null;
+ public void doRevision(FileRevision fileRevision)
+ {
+ if (fileRevisions == null)
+ fileRevisions = new ArrayList<FileRevision>();
+ fileRevisions.add(fileRevision);
+ }
+ }
+
+ public List<FileRevision> getFileRevisions(String path,
+ long startRevision,
+ long endRevision,
+ boolean includeMergedRevisions)
+ throws ClientException
+ {
+ final GetFileRevisionsHandler handler = new GetFileRevisionsHandler();
+ getFileRevisions(path, startRevision, endRevision,
+ includeMergedRevisions, handler);
+ return handler.fileRevisions;
+ }
+
+ // TODO: lock
+ // TODO: unlock
+ // TODO: getLock
+
+ public native Map<String, Lock> getLocks(String path, Depth depth)
+ throws ClientException;
+
+ // TODO: replayRange
+ // TODO: replay
+ // TODO: getDeletedRevision
+ // TODO: getInheritedProperties
+
+ public boolean hasCapability(Capability capability)
+ throws ClientException
+ {
+ return nativeHasCapability(capability.toString());
+ }
+
+ @Override
+ public native void finalize() throws Throwable;
+
+ /**
+ * This constructor is called from JNI to get an instance.
+ */
+ protected RemoteSession(long cppAddr)
+ {
+ super(cppAddr);
+ }
+
+ /*
+ * Wrapped private native implementation declarations.
+ */
+ private native void nativeDispose();
+ private native void nativeChangeRevisionProperty(long revision,
+ String propertyName,
+ byte[] oldValue,
+ byte[] newValue)
+ throws ClientException;
+ private native long nativeGetFile(long revision, String path,
+ OutputStream contents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+ private native long nativeGetDirectory(long revision, String path,
+ int direntFields,
+ Map<String, DirEntry> dirents,
+ Map<String, byte[]> properties)
+ throws ClientException;
+ private native void nativeStatus(String statusTarget,
+ long revision, Depth depth,
+ ISVNEditor statusEditor,
+ ISVNReporter reporter)
+ throws ClientException;
+ private native boolean nativeHasCapability(String capability)
+ throws ClientException;
+
+ /*
+ * NOTE: This field is accessed from native code for callbacks.
+ */
+ private RemoteSessionContext sessionContext = new RemoteSessionContext();
+ private class RemoteSessionContext extends OperationContext {}
+
+ /*
+ * A reference to the current active editor. We need this in order
+ * to dispose/abort the editor when the session is disposed. And
+ * furthermore, there can be only one editor or reporter active at
+ * any time.
+ */
+ private WeakReference<ISVNEditor> editorReference;
+
+ /*
+ * The commit editor calls this when disposed to clear the
+ * reference. Note that this function will be called during our
+ * dispose, so make sure they don't step on each others' toes.
+ */
+ void disposeEditor(ISVNEditor editor)
+ {
+ if (editorReference == null)
+ return;
+ ISVNEditor ed = editorReference.get();
+ if (ed == null)
+ return;
+ if (ed != editor)
+ throw new IllegalStateException("Disposing unknown editor");
+ editorReference.clear();
+ }
+
+ /*
+ * A reference to the current active reporter. We need this in
+ * order to dispose/abort the report when the session is
+ * disposed. And furthermore, there can be only one reporter or
+ * editor active at any time.
+ */
+ private WeakReference<ISVNReporter> reporterReference;
+
+ /*
+ * The update reporter calls this when disposed to clear the
+ * reference. Note that this function will be called during our
+ * dispose, so make sure they don't step on each others' toes.
+ */
+ void disposeReporter(ISVNReporter reporter)
+ {
+ if (reporterReference == null)
+ return;
+ ISVNReporter rp = reporterReference.get();
+ if (rp == null)
+ return;
+ if (rp != reporter)
+ throw new IllegalStateException("Disposing unknown reporter");
+ reporterReference.clear();
+ }
+
+ /*
+ * Private helper methods.
+ */
+ private final static<K,V> void maybe_clear(Map<K,V> clearable)
+ {
+ if (clearable != null && !clearable.isEmpty())
+ try {
+ clearable.clear();
+ } catch (UnsupportedOperationException ex) {
+ // ignored
+ }
+ }
+
+ private final static
+ void check_inactive(WeakReference<ISVNEditor> editorReference,
+ WeakReference<ISVNReporter> reporterReference)
+ {
+ if (editorReference != null && editorReference.get() != null)
+ throw new IllegalStateException("An editor is already active");
+ if (reporterReference != null && reporterReference.get() != null)
+ throw new IllegalStateException("A reporter is already active");
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java
new file mode 100644
index 0000000..cc23256
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RetryOpenSession.java
@@ -0,0 +1,57 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.SubversionException;
+
+/**
+ * This checked exception is thrown only from ISVNClient.openRemoteSession
+ * or RemoteFactory.openRemoteSession if a session could not be opened
+ * due to a redirect.
+ */
+public class RetryOpenSession extends SubversionException
+{
+ // Update the serialVersionUID when there is a incompatible change
+ // made to this class.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * This constructor is only called from native code.
+ */
+ protected RetryOpenSession(String message, String correctedUrl)
+ {
+ super(message);
+ this.correctedUrl = correctedUrl;
+ }
+
+ /**
+ * @return the corrected URL for the session.
+ */
+ public String getCorrectedUrl()
+ {
+ return correctedUrl;
+ }
+
+ private final String correctedUrl;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java
new file mode 100644
index 0000000..e83e4fa
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StateReporter.java
@@ -0,0 +1,107 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import org.apache.subversion.javahl.JNIObject;
+import org.apache.subversion.javahl.ISVNReporter;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+/**
+ * Implementation of ISVNReporter.
+ * @since 1.9
+ */
+public class StateReporter extends JNIObject implements ISVNReporter
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ public void dispose()
+ {
+ session.disposeReporter(this);
+ nativeDispose();
+ }
+
+ public native void setPath(String path,
+ long revision,
+ Depth depth,
+ boolean startEmpty,
+ String lockToken)
+ throws ClientException;
+
+ public native void deletePath(String path) throws ClientException;
+
+ public native void linkPath(String url,
+ String path,
+ long revision,
+ Depth depth,
+ boolean startEmpty,
+ String lockToken)
+ throws ClientException;
+
+ public native long finishReport() throws ClientException;
+
+ public native void abortReport() throws ClientException;
+
+ /**
+ * This factory method called from RemoteSession.status and friends.
+ */
+ static final
+ StateReporter createInstance(RemoteSession session)
+ throws ClientException
+ {
+ long cppAddr = nativeCreateInstance();
+ return new StateReporter(cppAddr, session);
+ }
+
+ @Override
+ public native void finalize() throws Throwable;
+
+ /*
+ * Wrapped private native implementation declarations.
+ */
+ private native void nativeDispose();
+ private static final native long nativeCreateInstance()
+ throws ClientException;
+
+ /**
+ * This constructor is called from the factory method.
+ */
+ protected StateReporter(long cppAddr, RemoteSession session)
+ {
+ super(cppAddr);
+ this.session = session;
+ }
+
+ /** Stores a reference to the session that created this reporter. */
+ protected RemoteSession session;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
new file mode 100644
index 0000000..00632f0
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
@@ -0,0 +1,265 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.remote;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+import org.apache.subversion.javahl.ISVNEditor;
+
+import java.util.Map;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+import java.util.SimpleTimeZone;
+import java.io.InputStream;
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+/**
+ * Package-private editor implementation that converts an editor drive
+ * to {@link RemoteStatus} callbacks.
+ * @since 1.9
+ */
+class StatusEditor implements ISVNEditor
+{
+ StatusEditor(RemoteStatus receiver)
+ {
+ this.receiver = receiver;
+ }
+ protected RemoteStatus receiver = null;
+
+ protected void checkState()
+ {
+ if (receiver == null)
+ throw new IllegalStateException("Status editor is not active");
+ }
+
+ public void dispose()
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.dispose");
+ if (this.receiver != null)
+ abort();
+ }
+
+ public void addDirectory(String relativePath,
+ Iterable<String> children,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.addDirectory");
+ checkState();
+ receiver.addedDirectory(relativePath);
+ }
+
+ public void addFile(String relativePath,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.addFile");
+ if (contents != null) {
+ try {
+ contents.close();
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ checkState();
+ receiver.addedFile(relativePath);
+ }
+
+ public void addSymlink(String relativePath,
+ String target,
+ Map<String, byte[]> properties,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.addSymlink");
+ checkState();
+ receiver.addedSymlink(relativePath);
+ }
+
+ public void addAbsent(String relativePath,
+ NodeKind kind,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.addAbsent");
+ checkState();
+ // ignore this callback, as svn status -u does
+ }
+
+ public void alterDirectory(String relativePath,
+ long revision,
+ Iterable<String> children,
+ Map<String, byte[]> properties)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.alterDirectory");
+ checkState();
+ receiver.modifiedDirectory(relativePath, (children != null),
+ props_changed(properties),
+ make_entry(properties));
+ }
+
+ public void alterFile(String relativePath,
+ long revision,
+ Checksum checksum,
+ InputStream contents,
+ Map<String, byte[]> properties)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.alterFile");
+ if (contents != null) {
+ try {
+ contents.close();
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ checkState();
+ receiver.modifiedFile(relativePath,
+ (checksum != null && contents != null),
+ props_changed(properties),
+ make_entry(properties));
+ }
+
+ public void alterSymlink(String relativePath,
+ long revision,
+ String target,
+ Map<String, byte[]> properties)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.alterSymlink");
+ checkState();
+ receiver.modifiedSymlink(relativePath, (target != null),
+ props_changed(properties),
+ make_entry(properties));
+ }
+
+ public void delete(String relativePath, long revision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.delete");
+ checkState();
+ receiver.deleted(relativePath);
+ }
+
+ public void copy(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.copy");
+ checkState();
+ throw new RuntimeException("Not implemented: StatusEditor.copy");
+ }
+
+ public void move(String sourceRelativePath,
+ long sourceRevision,
+ String destinationRelativePath,
+ long replacesRevision)
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.move");
+ checkState();
+ throw new RuntimeException("Not implemented: StatusEditor.move");
+ }
+
+ public void complete()
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.complete");
+ abort();
+ }
+
+ public void abort()
+ {
+ //DEBUG:System.err.println(" [J] StatusEditor.abort");
+ checkState();
+ receiver = null;
+ }
+
+ /*
+ * Construct a RemoteStatus.Entry record from the given properties.
+ */
+ private static final Charset UTF8 = Charset.forName("UTF-8");
+ private static final SimpleTimeZone UTC =
+ new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC");
+ private static final String entryprop_uuid = "svn:entry:uuid";
+ private static final String entryprop_author = "svn:entry:last-author";
+ private static final String entryprop_revision = "svn:entry:committed-rev";
+ private static final String entryprop_timestamp = "svn:entry:committed-date";
+ private final GregorianCalendar entry_calendar =
+ new GregorianCalendar(UTC, Locale.ROOT);
+
+ // FIXME: Room for improvement here. There are likely to be a lot
+ // of duplicate entries and we should be able to avoid parsing the
+ // duplicates all over again. Need a map <raw data> -> Entry to
+ // just look up the entries instead of parsing them.
+ private final RemoteStatus.Entry make_entry(Map<String, byte[]> properties)
+ {
+ final byte[] raw_uuid = properties.get(entryprop_uuid);
+ final byte[] raw_author = properties.get(entryprop_author);
+ final byte[] raw_revision = properties.get(entryprop_revision);
+ final byte[] raw_timestamp = properties.get(entryprop_timestamp);
+
+ long parsed_timestamp = -1;
+ if (raw_timestamp != null)
+ {
+ // Parse: 2013-07-04T23:17:59.128366Z
+ final String isodate = new String(raw_timestamp, UTF8);
+
+ final int year = Integer.valueOf(isodate.substring(0,4), 10);
+ final int month = Integer.valueOf(isodate.substring(5,7), 10);
+ final int day = Integer.valueOf(isodate.substring(8,10), 10);
+ final int hour = Integer.valueOf(isodate.substring(11,13), 10);
+ final int minute = Integer.valueOf(isodate.substring(14,16), 10);
+ final int second = Integer.valueOf(isodate.substring(17,19), 10);
+ final int micro = Integer.valueOf(isodate.substring(20,26), 10);
+ entry_calendar.set(year, month, day, hour, minute, second);
+
+ // Use integer rounding to add milliseconds
+ parsed_timestamp =
+ (1000 * entry_calendar.getTimeInMillis() + micro + 500) / 1000;
+ }
+
+ return new RemoteStatus.Entry(
+ (raw_uuid == null ? null : new String(raw_uuid, UTF8)),
+ (raw_author == null ? null : new String(raw_author, UTF8)),
+ (raw_revision == null ? Revision.SVN_INVALID_REVNUM
+ : Long.valueOf(new String(raw_revision, UTF8), 10)),
+ parsed_timestamp);
+ }
+
+ /*
+ * Filter entry props from the incoming properties
+ */
+ private static final String wcprop_prefix = "svn:wc:";
+ private static final String entryprop_prefix = "svn:entry:";
+ private static final boolean props_changed(Map<String, byte[]> properties)
+ {
+ if (properties != null)
+ for (String name : properties.keySet())
+ if (!name.startsWith(wcprop_prefix)
+ && !name.startsWith(entryprop_prefix))
+ return true;
+ return false;
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java
index 50374d4..6047e1e 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ChangePath.java
@@ -25,13 +25,9 @@ package org.apache.subversion.javahl.types;
public class ChangePath implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 2L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java
index 512cbf7..7aeb10a 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Checksum.java
@@ -25,13 +25,9 @@ package org.apache.subversion.javahl.types;
public class Checksum implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java
index fc46ab8..6f3658f 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/CopySource.java
@@ -29,13 +29,9 @@ package org.apache.subversion.javahl.types;
*/
public class CopySource implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java
index c006ab7..1debc29 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/DirEntry.java
@@ -32,13 +32,9 @@ import org.apache.subversion.javahl.ISVNClient;
*/
public class DirEntry implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java
new file mode 100644
index 0000000..eed7db2
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/ExternalItem.java
@@ -0,0 +1,174 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.SubversionException;
+
+/**
+ * Describes one external item declaration
+ * @since 1.9
+ */
+public class ExternalItem implements java.io.Serializable
+{
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Create a new external item declaration.
+ * <p>
+ * <b>Note:</b> If both <code>revision</code> and
+ * <code>pegRevision</code> are <code>null</code>, they will be
+ * interpreted as {@link Revision#HEAD}. If only one of them is
+ * <code>null</code>, it will get the same value as the other
+ * revision.
+ *
+ * @param targetDir See {@link #getTargetDir}
+ * @param url See {@link #getUrl}
+ * @param revision See {@link #getRevision};
+ * <code>null</code> will be interpreted as <code>pegRevision</code>
+ * @param pegRevision See {@link #getPegRevision};
+ * <code>null</code> will be interpreted as {@link Revision#HEAD}
+ */
+ public ExternalItem(String targetDir, String url,
+ Revision revision, Revision pegRevision)
+ throws SubversionException
+ {
+ this(false, targetDir, url, revision, pegRevision);
+ validateRevision(revision, "revision");
+ validateRevision(pegRevision, "pegRevision");
+ }
+
+ /* This constructor is called directly by the native implementation */
+ private ExternalItem(boolean dummy_parameter_to_discriminate_constructors,
+ String targetDir, String url,
+ Revision revision, Revision pegRevision)
+ {
+ this.targetDir = targetDir;
+ this.url = url;
+ this.pegRevision = (pegRevision != null ? pegRevision : Revision.HEAD);
+ this.revision = (revision != null ? revision : this.pegRevision);
+ }
+
+ /**
+ * The name of the subdirectory into which this external should be
+ * checked out. This is relative to the parent directory that
+ * holds this external item.
+ */
+ public String getTargetDir()
+ {
+ return targetDir;
+ }
+
+ /**
+ * Where to check out from. This is possibly a relative external
+ * URL, as allowed in externals definitions, but without the peg
+ * revision.
+ */
+ public String getUrl()
+ {
+ return url;
+ }
+
+ /**
+ * What revision to check out. The only valid kinds for this are a
+ * numered revision {@link Revision.Number}, a date
+ * {@link Revision.DateSpec}, or {@link Revision#HEAD}.
+ */
+ public Revision getRevision()
+ {
+ return revision;
+ }
+
+ /**
+ * The peg revision to use when checking out. The only valid kinds
+ * for this are a numered revision {@link Revision.Number}, a date
+ * {@link Revision.DateSpec}, or {@link Revision#HEAD}.
+ */
+ public Revision getPegRevision()
+ {
+ return pegRevision;
+ }
+
+ /**
+ * Compare to another external item.
+ */
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof ExternalItem))
+ return false;
+
+ final ExternalItem that = (ExternalItem)obj;
+ return (this.targetDir.equals(that.targetDir)
+ && this.url.equals(that.url)
+ && this.revision.equals(that.revision)
+ && this.pegRevision.equals(that.pegRevision));
+ }
+
+ /**
+ * Return a hash code for this object.
+ */
+ public int hashCode()
+ {
+ int hash = 17;
+ hash = hash * 33 + (null != targetDir ? targetDir.hashCode() : 0);
+ hash = hash * 33 + (null != url ? url.hashCode() : 0);
+ hash = hash * 33 + (null != revision ? revision.hashCode() : 0);
+ hash = hash * 33 + (null != pegRevision ? pegRevision.hashCode() : 0);
+ return hash;
+ }
+
+ /* Exception class for failed revision kind validation. */
+ private static class BadRevisionKindException extends SubversionException
+ {
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 1L;
+
+ public BadRevisionKindException(String param)
+ {
+ super("the '" + param + "' constructor argument" +
+ " must be a date, a number, or Revision.HEAD");
+ }
+ }
+
+ /* Validates the revision and pegRevision parameters of the ctor. */
+ private static void validateRevision(Revision revision, String param)
+ throws SubversionException
+ {
+ if (revision != null
+ && revision.getKind() != Revision.Kind.number
+ && revision.getKind() != Revision.Kind.date
+ && revision.getKind() != Revision.Kind.head)
+ throw new BadRevisionKindException(param);
+ }
+
+ private String targetDir;
+ private String url;
+ private Revision revision;
+ private Revision pegRevision;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
index f2e5893..c1752ea 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
@@ -35,13 +35,9 @@ import org.apache.subversion.javahl.ISVNClient;
*/
public class Info implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
@@ -290,6 +286,16 @@ public class Info implements java.io.Serializable
}
/**
+ * Returns the last date the item was changed measured in the
+ * number of microseconds since 00:00:00 January 1, 1970 UTC.
+ * @return the last time the item was changed.
+ */
+ public long getLastChangedDateMicros()
+ {
+ return lastChangedDate;
+ }
+
+ /**
* return the author of the last change
*/
public String getLastChangedAuthor()
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java
index 1040d51..0492556 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Lock.java
@@ -31,13 +31,9 @@ import java.util.Date;
*/
public class Lock implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
index 70af3d0..e2eb268 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
@@ -37,13 +37,9 @@ import org.apache.subversion.javahl.SubversionException;
*/
public class Mergeinfo implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
@@ -69,6 +65,31 @@ public class Mergeinfo implements java.io.Serializable
}
/**
+ * The three ways to request mergeinfo affecting a given path
+ * in {@link org.apache.subversion.javahl.ISVNRemote#getMergeinfo}.
+ * @since 1.9
+ */
+ public static enum Inheritance
+ {
+ /** Explicit mergeinfo only. */
+ explicit,
+
+ /**
+ * Explicit mergeinfo, or if that doesn't exist, the inherited
+ * mergeinfo from a target's nearest (path-wise, not history-wise)
+ * ancestor.
+ */
+ inherited,
+
+ /**
+ * Mergeinfo inherited from a target's nearest (path-wise,
+ * not history-wise) ancestor, regardless of whether target
+ * has explicit mergeinfo.
+ */
+ nearest_ancestor;
+ }
+
+ /**
* Add one or more RevisionRange objects to merge info. If the
* merge source is already stored, the list of revisions is
* replaced.
@@ -83,6 +104,11 @@ public class Mergeinfo implements java.io.Serializable
addRevisionRange(mergeSrc, range);
}
+ public void addRevisions(String mergeSrc, RevisionRangeList ranges)
+ {
+ addRevisions(mergeSrc, ranges.getRanges());
+ }
+
/**
* Add a revision range to the merged revisions for a path. If
* the merge source already has associated revision ranges, add
@@ -131,6 +157,14 @@ public class Mergeinfo implements java.io.Serializable
}
/**
+ * Like {@link #getReivsionRange}, but returns a {@link RevisionRangeList}.
+ */
+ public RevisionRangeList getRevisionRangeList(String mergeSrc)
+ {
+ return new RevisionRangeList(getRevisionRange(mergeSrc));
+ }
+
+ /**
* Parse the <code>svn:mergeinfo</code> property to populate the
* merge source URLs and revision ranges of this instance.
* @param mergeinfo <code>svn:mergeinfo</code> property value.
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java
new file mode 100644
index 0000000..b81cc0c
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeInputStream.java
@@ -0,0 +1,108 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.NativeResources;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Implementation class for {@link InputStream} objects returned from
+ * JavaHL methods.
+ *
+ * @since 1.9
+ */
+public class NativeInputStream extends InputStream
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
+ * Flushes buffers, closes the underlying native stream, and
+ * releases the native object.
+ * @see InputStream.close()
+ */
+ @Override
+ public native void close() throws IOException;
+
+ /**
+ * @see InputStream.markSupported()
+ */
+ @Override
+ public native boolean markSupported();
+
+ /**
+ * @see InputStream.mark(int)
+ */
+ @Override
+ public native void mark(int readlimit);
+
+ /**
+ * @see InputStream.reset()
+ */
+ @Override
+ public native void reset() throws IOException;
+
+ /**
+ * Reads a single byte from the underyling native stream.
+ * @see InputStream.read()
+ */
+ @Override
+ public native int read() throws IOException;
+
+ /**
+ * Reads <code>len</code> bytes to offset <code>off</code> in
+ * <code>b</code> from the underyling native stream.
+ * @see InputStream.read(byte[],int,int)
+ */
+ @Override
+ public native int read(byte[] b, int off, int len) throws IOException;
+
+ /**
+ * @see InputStream.skip(long)
+ */
+ @Override
+ public native long skip(long count) throws IOException;
+
+
+ private long cppAddr;
+
+ private NativeInputStream(long cppAddr)
+ {
+ this.cppAddr = cppAddr;
+ }
+
+ private long getCppAddr()
+ {
+ return cppAddr;
+ }
+
+ public native void finalize();
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java
new file mode 100644
index 0000000..3dafaf6
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/NativeOutputStream.java
@@ -0,0 +1,84 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.NativeResources;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Implementation class for {@link OutputStream} objects returned from
+ * JavaHL methods.
+ *
+ * @since 1.9
+ */
+public class NativeOutputStream extends OutputStream
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
+ * Flushes buffers, closes the underlying native stream, and
+ * releases the native object.
+ * @see OutputStream.close()
+ */
+ @Override
+ public native void close() throws IOException;
+
+ /**
+ * Writes a single byte to the underyling native stream.
+ * @see OutputStream.write(int)
+ */
+ @Override
+ public native void write(int b) throws IOException;
+
+ /**
+ * Writes <code>len</code> bytes at offset <code>off</code> from
+ * <code>b</code> to the underyling native stream.
+ * @see OutputStream.write(byte[],int,int)
+ */
+ @Override
+ public native void write(byte[] b, int off, int len) throws IOException;
+
+
+ private long cppAddr;
+
+ private NativeOutputStream(long cppAddr)
+ {
+ this.cppAddr = cppAddr;
+ }
+
+ private long getCppAddr()
+ {
+ return cppAddr;
+ }
+
+ public native void finalize();
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java
index a3d63fa..a7ac7f5 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Property.java
@@ -92,4 +92,14 @@ public class Property
* flag property if a lock is needed to modify this node
*/
public static final String NEEDS_LOCK = "svn:needs-lock";
+
+ /**
+ * server-side inherited configuration for auto-props
+ */
+ public static final String INHERITABLE_AUTO_PROPS = "svn:auto-props";
+
+ /**
+ * server-side inherited configuration for global ignore patterns
+ */
+ public static final String INHERITABLE_IGNORES = "svn:global-ignores";
}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java
index b07e39e..675737d 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Revision.java
@@ -32,13 +32,9 @@ import java.util.Locale;
*/
public class Revision implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
private static final long serialVersionUID = 1L;
/**
@@ -81,6 +77,7 @@ public class Revision implements java.io.Serializable
case head : return "HEAD";
case previous : return "PREV";
case working : return "WORKING";
+ case unspecified: return "UNSPECIFIED";
}
return super.toString();
}
@@ -155,6 +152,11 @@ public class Revision implements java.io.Serializable
public static final Revision START = new Revision(Kind.unspecified);
/**
+ * unspecified revision
+ */
+ public static final Revision UNSPECIFIED = START;
+
+ /**
* last committed revision, needs working copy
*/
public static final Revision COMMITTED = new Revision(Kind.committed);
@@ -271,6 +273,16 @@ public class Revision implements java.io.Serializable
throw new IllegalArgumentException("a date must be specified");
revDate = date;
}
+
+ /**
+ * Create a revision from a timestamp in milliseconds.
+ * Used by the native implementaiton.
+ */
+ private DateSpec(long milliseconds)
+ {
+ this(new Date(milliseconds));
+ }
+
/**
* Returns the date of the revision
* @return the date
@@ -310,7 +322,6 @@ public class Revision implements java.io.Serializable
{
return revDate.hashCode();
}
-
}
/**
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java
index d906008..ae9ecd1 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRange.java
@@ -29,32 +29,38 @@ package org.apache.subversion.javahl.types;
*/
public class RevisionRange implements Comparable<RevisionRange>, java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
- private static final long serialVersionUID = 1L;
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 2L;
private Revision from;
private Revision to;
+ private boolean inheritable;
/**
* Creates a new instance. Called by native library.
*/
- @SuppressWarnings("unused")
- private RevisionRange(long from, long to)
+ protected RevisionRange(long from, long to, boolean inheritable)
{
this.from = Revision.getInstance(from);
this.to = Revision.getInstance(to);
+ this.inheritable = inheritable;
+ }
+
+ /** @since 1.9 */
+ public RevisionRange(Revision from, Revision to, boolean inheritable)
+ {
+ this.from = from;
+ this.to = to;
+ this.inheritable = inheritable;
}
public RevisionRange(Revision from, Revision to)
{
this.from = from;
this.to = to;
+ this.inheritable = true;
}
/**
@@ -70,6 +76,11 @@ public class RevisionRange implements Comparable<RevisionRange>, java.io.Seriali
return;
}
+ this.inheritable = !revisionElement.endsWith("*");
+ if (!this.inheritable)
+ revisionElement =
+ revisionElement.substring(0, revisionElement.length() - 1);
+
int hyphen = revisionElement.indexOf('-');
if (hyphen > 0)
{
@@ -93,8 +104,10 @@ public class RevisionRange implements Comparable<RevisionRange>, java.io.Seriali
try
{
long revNum = Long.parseLong(revisionElement.trim());
- this.from = new Revision.Number(revNum);
- this.to = this.from;
+ if (revNum <= 0)
+ return;
+ this.to = new Revision.Number(revNum);
+ this.from = new Revision.Number(revNum - 1);
}
catch (NumberFormatException e)
{
@@ -113,14 +126,29 @@ public class RevisionRange implements Comparable<RevisionRange>, java.io.Seriali
return to;
}
+ public boolean isInheritable()
+ {
+ return inheritable;
+ }
+
public String toString()
{
if (from != null && to != null)
{
- if (from.equals(to))
- return from.toString();
+ String rep;
+
+ if (from.getKind() == Revision.Kind.number
+ && to.getKind() == Revision.Kind.number
+ && (((Revision.Number)from).getNumber() + 1
+ == ((Revision.Number)to).getNumber()))
+ rep = to.toString();
+ else if (from.equals(to)) // Such ranges should never happen
+ rep = from.toString();
else
- return from.toString() + '-' + to.toString();
+ rep = from.toString() + '-' + to.toString();
+ if (!inheritable)
+ return rep + '*';
+ return rep;
}
return super.toString();
}
@@ -138,7 +166,7 @@ public class RevisionRange implements Comparable<RevisionRange>, java.io.Seriali
public int hashCode()
{
final int prime = 31;
- int result = 1;
+ int result = (inheritable ? 1 : 2);
result = prime * result + ((from == null) ? 0 : from.hashCode());
result = prime * result + ((to == null) ? 0 : to.hashCode());
return result;
@@ -178,10 +206,12 @@ public class RevisionRange implements Comparable<RevisionRange>, java.io.Seriali
return false;
}
- return true;
+ return (inheritable == other.inheritable);
}
/**
+ * <b>Note:</b> Explicitly ignores inheritable state.
+ *
* @param range The RevisionRange to compare this object to.
*/
public int compareTo(RevisionRange range)
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
new file mode 100644
index 0000000..8b4a3af
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
@@ -0,0 +1,98 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+import java.util.List;
+
+/**
+ * Object that describes a revision range list, including operations on it.
+ * Returned from new accessors in {@link Mergeinfo}.
+ * @since 1.9
+ */
+public class RevisionRangeList implements java.io.Serializable
+{
+ // Update the serialVersionUID when there is a incompatible change
+ // made to this class. See any of the following, depending upon
+ // the Java release.
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ private List<RevisionRange> ranges;
+
+ /**
+ * Wrap a list of revision ranges.
+ */
+ public RevisionRangeList(List<RevisionRange> ranges)
+ {
+ this.ranges = ranges;
+ }
+
+ /**
+ * @return The wrapped list of revision ranges.
+ */
+ public List<RevisionRange> getRanges()
+ {
+ return ranges;
+ }
+
+ /**
+ * Remove revisions in <code>eraser</code> from the current object
+ * and return the resulting difference.
+ * @param eraser The list of revisions to remoove.
+ * @param considerInheritance Determines how to account for the
+ * {@link RevisionRange#isInherited} property when comparing
+ * revision ranges for equality.
+ */
+ public native List<RevisionRange> remove(List<RevisionRange> eraser,
+ boolean considerInheritance)
+ throws ClientException;
+
+ /**
+ * Remove revisions in <code>eraser</code> from the current object
+ * and return the resulting difference.
+ * @param eraser The list of revisions to remoove.
+ * @param considerInheritance Determines how to account for the
+ * {@link RevisionRange#isInherited} property when comparing
+ * revision ranges for equality.
+ */
+ public RevisionRangeList remove(RevisionRangeList eraser,
+ boolean considerInheritance)
+ throws ClientException
+ {
+ return new RevisionRangeList
+ (remove(eraser.ranges, considerInheritance));
+ }
+
+ // TODO: More svn_rangelist_t operations
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java
new file mode 100644
index 0000000..818aa06
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RuntimeVersion.java
@@ -0,0 +1,73 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.types;
+
+/**
+ * Encapsulates the run-time version of the
+ * <code>libsvn_clinent</code> library that was loaded by the current
+ * process. The result may be different from that provided by {@link
+ * Version}, because the latter returns compile-time, not run-time
+ * information.
+ */
+public class RuntimeVersion extends Version
+{
+ /**
+ * @return The full version string for the loaded library,
+ * as defined by <code>MAJOR.MINOR.PATCH-NUMTAG</code>.
+ */
+ public String toString()
+ {
+ StringBuffer version = new StringBuffer();
+ version.append(getMajor())
+ .append('.').append(getMinor())
+ .append('.').append(getPatch())
+ .append(getNumberTag());
+ return version.toString();
+ }
+
+ /**
+ * @return The major version number for the loaded JavaHL library.
+ */
+ @Override
+ public native int getMajor();
+
+ /**
+ * @return The minor version number for the loaded JavaHL library.
+ */
+ @Override
+ public native int getMinor();
+
+ /**
+ * @return The patch-level version number for the loaded JavaHL
+ * library.
+ */
+ @Override
+ public native int getPatch();
+
+ /**
+ * @return Some text further describing the library version
+ * (e.g. "r1234", "Alpha 1", "dev build", etc.).
+ */
+ private native String getNumberTag();
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java
index 4e628c1..0a42fac 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Status.java
@@ -35,14 +35,10 @@ import org.apache.subversion.javahl.ConflictDescriptor;
*/
public class Status implements java.io.Serializable
{
- // Update the serialVersionUID when there is a incompatible change
- // made to this class. See any of the following, depending upon
- // the Java release.
- // http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/version.doc7.html
- // http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
- // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/version.html#6678
- // http://java.sun.com/javase/6/docs/platform/serialization/spec/version.html#6678
- private static final long serialVersionUID = 2L;
+ // Update the serialVersionUID when there is a incompatible change made to
+ // this class. See the java documentation for when a change is incompatible.
+ // http://java.sun.com/javase/7/docs/platform/serialization/spec/version.html#6678
+ private static final long serialVersionUID = 3L;
/**
* the url for accessing the item
@@ -81,12 +77,19 @@ public class Status implements java.io.Serializable
private String lastCommitAuthor;
/**
- * the file or directory status (See StatusKind)
+ * The status of the node, based on restructuring changes; if the node
+ * has no restructuring changes, it's based on textStatus and propStatus.
+ * @since 1.9
+ */
+ private Kind nodeStatus;
+
+ /**
+ * The file or directory status, not including restructuring changes.
*/
private Kind textStatus;
/**
- * the status of the properties (See StatusKind)
+ * The status of the properties.
*/
private Kind propStatus;
@@ -112,11 +115,24 @@ public class Status implements java.io.Serializable
private boolean fileExternal;
/**
+ * The depth of the node as recorded in the working copy.
+ * @since 1.9
+ */
+ private Depth depth;
+
+ /**
* is this item in a conflicted state
*/
private boolean isConflicted;
/**
+ * The status of the node, based on text and property status, unless the
+ * node has restructuring changes.
+ * @since 1.9
+ */
+ private Kind repositoryNodeStatus;
+
+ /**
* the file or directory status of base (See StatusKind)
*/
private Kind repositoryTextStatus;
@@ -168,7 +184,6 @@ public class Status implements java.io.Serializable
private String movedFromAbspath;
private String movedToAbspath;
-
/**
* this constructor should only called from JNI code
* @param path the file system path of item
@@ -178,22 +193,17 @@ public class Status implements java.io.Serializable
* @param lastChangedRevision the last revision this item was changed
* @param lastChangedDate the last date this item was changed
* @param lastCommitAuthor the author of the last change
- * @param textStatus the file or directory status (See
- * StatusKind)
- * @param propStatus the property status (See StatusKind)
- * @param repositoryTextStatus the file or directory status of the base
+ * @param nodeStatus the status of the node
+ * @param textStatus the file or directory contents status
+ * @param propStatus the property status
+ * @param repositoryNodeStatus the status of the base node
+ * @param repositoryTextStatus the file or directory contents status of the base
* @param repositoryPropStatus the property status of the base
* @param locked if the item is locked (running or aborted
* operation)
* @param copied if the item is copy
+ * @param depth the inherent depth of the node in the working copy
* @param isConflicted if the item is part of a conflict
- * @param conflictDescriptor the description of the tree conflict
- * @param conflictOld in case of conflict, the file name of the
- * the common base version
- * @param conflictNew in case of conflict, the file name of new
- * repository version
- * @param conflictWorking in case of conflict, the file name of the
- * former working copy version
* @param switched flag if the node has been switched in the
* path
* @param fileExternal flag if the node is a file external
@@ -209,12 +219,16 @@ public class Status implements java.io.Serializable
* @param changelist the changelist the item is a member of
* @param movedFromAbspath path moved from
* @param movedToAbspath path moved from
+ * @since 1.9
*/
public Status(String path, String url, NodeKind nodeKind, long revision,
long lastChangedRevision, long lastChangedDate,
- String lastCommitAuthor, Kind textStatus, Kind propStatus,
+ String lastCommitAuthor,
+ Kind nodeStatus, Kind textStatus, Kind propStatus,
+ Kind repositoryNodeStatus,
Kind repositoryTextStatus, Kind repositoryPropStatus,
- boolean locked, boolean copied, boolean isConflicted,
+ boolean locked, boolean copied, Depth depth,
+ boolean isConflicted,
boolean switched, boolean fileExternal, Lock localLock,
Lock reposLock, long reposLastCmtRevision,
long reposLastCmtDate, NodeKind reposKind,
@@ -228,13 +242,16 @@ public class Status implements java.io.Serializable
this.lastChangedRevision = lastChangedRevision;
this.lastChangedDate = lastChangedDate;
this.lastCommitAuthor = lastCommitAuthor;
+ this.nodeStatus = nodeStatus;
this.textStatus = textStatus;
this.propStatus = propStatus;
+ this.repositoryNodeStatus = repositoryNodeStatus;
+ this.repositoryTextStatus = repositoryTextStatus;
+ this.repositoryPropStatus = repositoryPropStatus;
this.locked = locked;
this.copied = copied;
+ this.depth = depth;
this.isConflicted = isConflicted;
- this.repositoryTextStatus = repositoryTextStatus;
- this.repositoryPropStatus = repositoryPropStatus;
this.switched = switched;
this.fileExternal = fileExternal;
this.localLock = localLock;
@@ -249,6 +266,64 @@ public class Status implements java.io.Serializable
}
/**
+ * this constructor should only called from JNI code
+ * @param path the file system path of item
+ * @param url the url of the item
+ * @param nodeKind kind of item (directory, file or unknown
+ * @param revision the revision number of the base
+ * @param lastChangedRevision the last revision this item was changed
+ * @param lastChangedDate the last date this item was changed
+ * @param lastCommitAuthor the author of the last change
+ * @param textStatus the file or directory status (See
+ * StatusKind)
+ * @param propStatus the property status (See StatusKind)
+ * @param repositoryTextStatus the file or directory status of the base
+ * @param repositoryPropStatus the property status of the base
+ * @param locked if the item is locked (running or aborted
+ * operation)
+ * @param copied if the item is copy
+ * @param isConflicted if the item is part of a conflict
+ * @param switched flag if the node has been switched in the
+ * path
+ * @param fileExternal flag if the node is a file external
+ * @param localLock the current lock
+ * @param reposLock the lock as stored in the repository if
+ * any
+ * @param reposLastCmtRevision the youngest revision, if out of date
+ * @param reposLastCmtDate the last commit date, if out of date
+ * @param reposKind the kind of the youngest revision, if
+ * out of date
+ * @param reposLastCmtAuthor the author of the last commit, if out of
+ * date
+ * @param changelist the changelist the item is a member of
+ * @param movedFromAbspath path moved from
+ * @param movedToAbspath path moved from
+ * @deprecated
+ */
+ @Deprecated
+ public Status(String path, String url, NodeKind nodeKind, long revision,
+ long lastChangedRevision, long lastChangedDate,
+ String lastCommitAuthor, Kind textStatus, Kind propStatus,
+ Kind repositoryTextStatus, Kind repositoryPropStatus,
+ boolean locked, boolean copied, boolean isConflicted,
+ boolean switched, boolean fileExternal, Lock localLock,
+ Lock reposLock, long reposLastCmtRevision,
+ long reposLastCmtDate, NodeKind reposKind,
+ String reposLastCmtAuthor, String changelist,
+ String movedFromAbspath, String movedToAbspath)
+ {
+ this(path, url, nodeKind, revision,
+ lastChangedRevision, lastChangedDate, lastCommitAuthor,
+ Kind.none, textStatus, propStatus,
+ Kind.none, repositoryTextStatus, repositoryPropStatus,
+ locked, copied, Depth.unknown, isConflicted,
+ switched, fileExternal, localLock, reposLock,
+ reposLastCmtRevision, reposLastCmtDate, reposKind,
+ reposLastCmtAuthor, changelist,
+ movedFromAbspath, movedToAbspath);
+ }
+
+ /**
* Returns the file system path of the item
* @return path of status entry
*/
@@ -305,25 +380,64 @@ public class Status implements java.io.Serializable
}
/**
- * Returns the status of the item (See StatusKind)
+ * Returns the status of the node.
+ * @since 1.9
+ */
+ public Kind getNodeStatus()
+ {
+ return nodeStatus;
+ }
+
+ /**
+ * Returns the status of the node as text.
+ * @since 1.9
+ */
+ public String getNodeStatusDescription()
+ {
+ return nodeStatus.toString();
+ }
+
+ /**
+ * Returns the real status of the item's contents.
+ * @since 1.9
+ */
+ public Kind getRawTextStatus()
+ {
+ return textStatus;
+ }
+
+ /**
+ * Returns the real status of the item's contents as a string.
+ * @since 1.9
+ */
+ public String getRawTextStatusDescription()
+ {
+ return textStatus.toString();
+ }
+
+ /**
+ * Returns the adjusted status of the item's contents, as
+ * compatible with JavaHL 1.8 and older verions.
* @return file status property enum of the "textual" component.
*/
public Kind getTextStatus()
{
- return textStatus;
+ if (nodeStatus == Kind.modified || nodeStatus == Kind.conflicted)
+ return textStatus;
+ return nodeStatus;
}
/**
- * Returns the status of the item as text.
+ * Returns the adjusted status of the item's contents as text.
* @return english text
*/
public String getTextStatusDescription()
{
- return textStatus.toString();
+ return getTextStatus().toString();
}
/**
- * Returns the status of the properties (See Status Kind)
+ * Returns the status of the properties.
* @return file status property enum of the "property" component.
*/
public Kind getPropStatus()
@@ -341,17 +455,39 @@ public class Status implements java.io.Serializable
}
/**
- * Returns the status of the item in the repository (See StatusKind)
+ * Returns the status of the node in the repository.
+ * @since 1.9
+ */
+ public Kind getRepositoryNodeStatus()
+ {
+ return repositoryNodeStatus;
+ }
+
+ /**
+ * Returns the real status of the item's contents in the repository.
+ * @since 1.9
+ */
+ public Kind getRawRepositoryTextStatus()
+ {
+ return repositoryTextStatus;
+ }
+
+ /**
+ * Returns the adjusted status of the item's contents in the
+ * repository, as compatible with JavaHL 1.8 and older verions.
* @return file status property enum of the "textual" component in the
* repository.
*/
public Kind getRepositoryTextStatus()
{
- return repositoryTextStatus;
+ if (repositoryNodeStatus == Kind.modified
+ || repositoryNodeStatus == Kind.conflicted)
+ return repositoryTextStatus;
+ return repositoryNodeStatus;
}
/**
- * Returns test status of the properties in the repository (See StatusKind)
+ * Returns test status of the properties in the repository.
* @return file status property enum of the "property" component im the
* repository.
*/
@@ -444,7 +580,7 @@ public class Status implements java.io.Serializable
*/
public boolean isManaged()
{
- Kind status = getTextStatus();
+ Kind status = getNodeStatus();
return (status != Status.Kind.unversioned &&
status != Status.Kind.none &&
status != Status.Kind.ignored);
@@ -456,7 +592,7 @@ public class Status implements java.io.Serializable
*/
public boolean hasRemote()
{
- return (isManaged() && getTextStatus() != Status.Kind.added);
+ return (isManaged() && !isAdded());
}
/**
@@ -465,7 +601,7 @@ public class Status implements java.io.Serializable
*/
public boolean isAdded()
{
- return getTextStatus() == Status.Kind.added;
+ return getNodeStatus() == Status.Kind.added;
}
/**
@@ -474,7 +610,7 @@ public class Status implements java.io.Serializable
*/
public boolean isDeleted()
{
- return getTextStatus() == Status.Kind.deleted;
+ return getNodeStatus() == Status.Kind.deleted;
}
/**
@@ -483,7 +619,7 @@ public class Status implements java.io.Serializable
*/
public boolean isMerged()
{
- return getTextStatus() == Status.Kind.merged;
+ return getNodeStatus() == Status.Kind.merged;
}
/**
@@ -493,7 +629,7 @@ public class Status implements java.io.Serializable
*/
public boolean isIgnored()
{
- return getTextStatus() == Status.Kind.ignored;
+ return getNodeStatus() == Status.Kind.ignored;
}
/**
@@ -605,6 +741,15 @@ public class Status implements java.io.Serializable
}
/**
+ * Returns the inherent depth of the node, as recorded in the working copy.
+ * @since 1.9
+ */
+ public Depth getDepth()
+ {
+ return depth;
+ }
+
+ /**
* Converts microseconds since the epoch to a Date object.
*
* @param micros Microseconds since the epoch.
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java
index c142c81..7793582 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Version.java
@@ -23,6 +23,8 @@
package org.apache.subversion.javahl.types;
+import org.apache.subversion.javahl.NativeResources;
+
/**
* Encapsulates version information about the underlying native
* libraries. Basically a wrapper for <a
@@ -31,6 +33,14 @@ package org.apache.subversion.javahl.types;
public class Version
{
/**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
* @return The full version string for the loaded JavaHL library,
* as defined by <code>MAJOR.MINOR.PATCH INFO</code>.
*/
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java
index 06d0976..6cd7e80 100644
--- a/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java
@@ -23,6 +23,8 @@
package org.apache.subversion.javahl.types;
+import org.apache.subversion.javahl.NativeResources;
+
/**
* Encapsulates information about the compile-time and run-time
* properties of the Subversion libraries.
@@ -31,6 +33,29 @@ package org.apache.subversion.javahl.types;
public class VersionExtended
{
/**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
+ * Release the native peer. This method must be called to release
+ * the native resources held by this object.
+ * <p>
+ * Once this method is called, all object references obtained from
+ * the iterators returned by {@link #getLinkedLibs()} and
+ * {@link #getLoadedLibs()} become invalid and should no longer be used.
+ */
+ public native void dispose();
+
+ /**
+ * release the native peer (should use dispose instead)
+ */
+ public native void finalize();
+
+ /**
* @return The date when the libsvn_subr library was compiled, in
* the format defined by the C standard macro #__DATE__.
*/
@@ -45,9 +70,9 @@ public class VersionExtended
/**
* @return The canonical host triplet (arch-vendor-osname) of the
* system where libsvn_subr was compiled.
- *
- * @note On Unix-like systems (includng Mac OS X), this string is
- * the same as the output of the config.guess script for the
+ * <p>
+ * <b>Note:</b> On Unix-like systems (includng Mac OS X), this string
+ * is the same as the output of the config.guess script for the
* underlying Subversion libraries.
*/
public native String getBuildHost();
@@ -60,8 +85,8 @@ public class VersionExtended
/**
* @return The canonical host triplet (arch-vendor-osname) of the
* system where the current process is running.
- *
- * @note This string may not be the same as the output of
+ * <p>
+ * <b>Note:</b> This string may not be the same as the output of
* config.guess on the same system.
*/
public native String getRuntimeHost();
@@ -139,8 +164,8 @@ public class VersionExtended
/**
* @return Iterator for an immutable internal list of #LoadedLib
* describing loaded shared libraries. The the list may be empty.
- *
- * @note On Mac OS X, the loaded frameworks, private frameworks
+ * <p>
+ * <b>Note:</b> On Mac OS X, the loaded frameworks, private frameworks
* and system libraries will not be listed.
*/
public java.util.Iterator<LoadedLib> getLoadedLibs()
@@ -178,7 +203,8 @@ public class VersionExtended
/**
* Implementation of java.util.Iterator#remove().
- * @note Not implemented, all sequences are immutable.
+ * <p>
+ * <b>Note:</b> Not implemented, all sequences are immutable.
*/
public void remove()
{
@@ -219,7 +245,8 @@ public class VersionExtended
/**
* Implementation of java.util.Iterator#remove().
- * @note Not implemented, all sequences are immutable.
+ * <p>
+ * <b>Note:</b> Not implemented, all sequences are immutable.
*/
public void remove()
{
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java
new file mode 100644
index 0000000..b50acc9
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigImpl.java
@@ -0,0 +1,175 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import org.apache.subversion.javahl.ISVNConfig;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+import org.apache.subversion.javahl.types.*;
+import org.apache.subversion.javahl.callback.*;
+
+
+/**
+ * Implementation of ISVNConfig.
+ */
+class ConfigImpl implements ISVNConfig
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ public Category config() { return this.configref; }
+ public Category servers() { return this.serversref; }
+
+ protected ConfigImpl(long context)
+ {
+ this.configref = new Category("config", context);
+ this.serversref = new Category("servers", context);
+ }
+ protected Category configref;
+ protected Category serversref;
+
+ /** Called from JNI when the object is no longer live. */
+ void dispose()
+ {
+ configref.dispose();
+ configref = null;
+ serversref.dispose();
+ serversref = null;
+ }
+
+ static class Category implements ISVNConfig.Category
+ {
+ public String get(String section, String option, String defaultValue)
+ {
+ return get_str(category, context, section, option, defaultValue);
+ }
+
+ public boolean get(String section, String option, boolean defaultValue)
+ throws ClientException
+ {
+ return get_bool(category, context, section, option, defaultValue);
+ }
+
+ public long get(String section, String option, long defaultValue)
+ throws ClientException
+ {
+ return get_long(category, context, section, option, defaultValue);
+ }
+
+ public Tristate get(String section, String option,
+ String unknown, Tristate defaultValue)
+ throws ClientException
+ {
+ return get_tri(category, context, section, option,
+ unknown, defaultValue);
+ }
+
+ public String getYesNoAsk(String section, String option,
+ String defaultValue)
+ throws ClientException
+ {
+ return get_yna(category, context, section, option, defaultValue);
+ }
+
+ public void set(String section, String option, String value)
+ {
+ set_str(category, context, section, option, value);
+ }
+
+ public void set(String section, String option, boolean value)
+ {
+ set_bool(category, context, section, option, value);
+ }
+
+ public void set(String section, String option, long value)
+ {
+ set_long(category, context, section, option, value);
+ }
+
+ public Iterable<String> sections()
+ {
+ return sections(category, context);
+ }
+
+ public void enumerate(String section, Enumerator handler)
+ {
+ enumerate(category, context, section, handler);
+ }
+
+ Category(String category, long context)
+ {
+ this.category = category;
+ this.context = context;
+ }
+ protected String category;
+ protected long context;
+
+ /** Called when the object is no longer live. */
+ void dispose()
+ {
+ category = null;
+ context = 0;
+ }
+
+ private native String get_str(String category, long context,
+ String secton, String option,
+ String defaultValue);
+ private native boolean get_bool(String category, long context,
+ String secton, String option,
+ boolean defaultValue)
+ throws ClientException;
+ private native long get_long(String category, long context,
+ String secton, String option,
+ long defaultValue)
+ throws ClientException;
+ private native Tristate get_tri(String category, long context,
+ String secton, String option,
+ String unknown, Tristate defaultValue)
+ throws ClientException;
+ private native String get_yna(String category, long context,
+ String secton, String option,
+ String defaultValue)
+ throws ClientException;
+ private native void set_str(String category, long context,
+ String section, String option,
+ String value);
+ private native void set_bool(String category, long context,
+ String section, String option,
+ boolean value);
+ private native void set_long(String category, long context,
+ String section, String option,
+ long value);
+ private native Iterable<String> sections(String category,
+ long context);
+ private native void enumerate(String category, long context,
+ String section, Enumerator handler);
+
+ }
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
new file mode 100644
index 0000000..c54533b
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ConfigLib.java
@@ -0,0 +1,121 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import org.apache.subversion.javahl.callback.*;
+
+import org.apache.subversion.javahl.SVNUtil;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+import org.apache.subversion.javahl.SubversionException;
+
+import java.util.List;
+
+/**
+ * Provides global configuration knobs and
+ * Encapsulates utility functions for authentication credentials management.
+ * @since 1.9
+ */
+public class ConfigLib
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /** @see SVNUtil.enableNativeCredentialsStore */
+ public native void enableNativeCredentialsStore()
+ throws ClientException;
+
+ /** @see SVNUtil.disableNativeCredentialsStore */
+ public native void disableNativeCredentialsStore()
+ throws ClientException;
+
+ /** @see SVNUtil.isNativeCredentialsStoreEnabled */
+ public native boolean isNativeCredentialsStoreEnabled()
+ throws ClientException;
+
+ //
+ // Credentials management
+ //
+
+ /** @see SVNUtil.getCredential */
+ public SVNUtil.Credential getCredential(String configDir,
+ SVNUtil.Credential.Kind kind,
+ String realm)
+ throws ClientException, SubversionException
+ {
+ return nativeGetCredential(configDir, kind.toString(), realm);
+ }
+
+ /** @see SVNUtil.removeCredential */
+ public SVNUtil.Credential removeCredential(String configDir,
+ SVNUtil.Credential.Kind kind,
+ String realm)
+ throws ClientException, SubversionException
+ {
+ return nativeRemoveCredential(configDir, kind.toString(), realm);
+ }
+
+ /** @see SVNUtil.searchCredentials */
+ public List<SVNUtil.Credential>
+ searchCredentials(String configDir,
+ SVNUtil.Credential.Kind kind,
+ String realmPattern,
+ String usernamePattern,
+ String hostnamePattern,
+ String textPattern)
+ throws ClientException, SubversionException
+ {
+ return nativeSearchCredentials(
+ configDir,
+ (kind != null ? kind.toString() : null),
+ realmPattern, usernamePattern, hostnamePattern, textPattern);
+ }
+
+ private native SVNUtil.Credential
+ nativeGetCredential(String configDir,
+ String kind,
+ String realm)
+ throws ClientException, SubversionException;
+
+ private native SVNUtil.Credential
+ nativeRemoveCredential(String configDir,
+ String kind,
+ String realm)
+ throws ClientException, SubversionException;
+
+ private native List<SVNUtil.Credential>
+ nativeSearchCredentials(String configDir,
+ String kind,
+ String realmPattern,
+ String usernamePattern,
+ String hostnamePattern,
+ String textPattern)
+ throws ClientException, SubversionException;
+}
+
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java
new file mode 100644
index 0000000..36912dd
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/DiffLib.java
@@ -0,0 +1,149 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import org.apache.subversion.javahl.SVNUtil;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.NativeResources;
+
+import java.io.OutputStream;
+
+/**
+ * Encapsulates utility functions provided by libsvn_diff.
+ * @since 1.9
+ */
+public class DiffLib
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /** @see SVNUtil.fileDiff */
+ public boolean fileDiff(String originalFile,
+ String modifiedFile,
+ SVNUtil.DiffOptions diffOptions,
+
+ String originalHeader,
+ String modifiedHeader,
+ String headerEncoding,
+ String relativeToDir,
+
+ OutputStream resultStream)
+ throws ClientException
+ {
+ return nativeFileDiff(originalFile, modifiedFile,
+
+ // Interpret the diff options
+ (diffOptions == null
+ ? SVNUtil.DiffOptions.IgnoreSpace.none.ordinal()
+ : diffOptions.ignoreSpace.ordinal()),
+ (diffOptions == null ? false
+ : diffOptions.ignoreEolStyle),
+ (diffOptions == null ? false
+ : diffOptions.showCFunction),
+ (diffOptions == null ? -1
+ : diffOptions.contextSize),
+
+ originalHeader, modifiedHeader, headerEncoding,
+ relativeToDir, resultStream);
+ }
+
+ private native
+ boolean nativeFileDiff(String originalFile,
+ String modifiedFile,
+
+ // Interpreted diff options
+ int ignoreSpace,
+ boolean ignoreEolStyle,
+ boolean showCFunction,
+ int contextSize,
+
+ String originalHeader,
+ String modifiedHeader,
+ String headerEncoding,
+ String relativeToDir,
+
+ OutputStream resultStream)
+ throws ClientException;
+
+ /** @see SVNUtil.fileMerge */
+ public boolean fileMerge(String originalFile,
+ String modifiedFile,
+ String latestFile,
+ SVNUtil.DiffOptions diffOptions,
+
+ String conflictOriginal,
+ String conflictModified,
+ String conflictLatest,
+ String conflistSeparator,
+ SVNUtil.ConflictDisplayStyle conflictStyle,
+
+ OutputStream resultStream)
+ throws ClientException
+ {
+ return nativeFileMerge(originalFile, modifiedFile, latestFile,
+
+ // Interpret the diff options
+ (diffOptions == null
+ ? SVNUtil.DiffOptions.IgnoreSpace.none.ordinal()
+ : diffOptions.ignoreSpace.ordinal()),
+ (diffOptions == null ? false
+ : diffOptions.ignoreEolStyle),
+ (diffOptions == null ? false
+ : diffOptions.showCFunction),
+
+ conflictOriginal, conflictModified,
+ conflictLatest, conflistSeparator,
+
+ // Interpret the conflict style
+ conflictStyle.ordinal(),
+
+ resultStream);
+ }
+
+ private native
+ boolean nativeFileMerge(String originalFile,
+ String modifiedFile,
+ String latestFile,
+
+ // Interpreted diff options
+ int ignoreSpace,
+ boolean ignoreEolStyle,
+ boolean showCFunction,
+
+ String conflictOriginal,
+ String conflictModified,
+ String conflictLatest,
+ String conflistSeparator,
+
+ // Interpreted conflict display style
+ int conflictStyle,
+
+ OutputStream resultStream)
+ throws ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
new file mode 100644
index 0000000..44d1302
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
@@ -0,0 +1,90 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import org.apache.subversion.javahl.SVNUtil;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.SubversionException;
+import org.apache.subversion.javahl.NativeResources;
+import org.apache.subversion.javahl.types.ExternalItem;
+import org.apache.subversion.javahl.types.NodeKind;
+import org.apache.subversion.javahl.types.Revision;
+
+import java.util.List;
+import java.io.InputStream;
+
+/**
+ * Encapsulates utility functions for properties provided by libsvn_wc.
+ * @since 1.9
+ */
+public class PropLib
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /** @see SVNUtil#canonicalizeSvnProperty */
+ public byte[] canonicalizeNodeProperty(String name, byte[] value,
+ String path, NodeKind kind,
+ String mimeType,
+ InputStream fileContents)
+ throws ClientException
+ {
+ if (!name.startsWith("svn:"))
+ throw new IllegalArgumentException("Property name: " + name);
+ return checkNodeProp(name, value, path, kind, mimeType, fileContents,
+ (kind != NodeKind.file || mimeType == null));
+ }
+
+ private native byte[] checkNodeProp(String name, byte[] value,
+ String path, NodeKind kind,
+ String mimeType,
+ InputStream fileContents,
+ boolean skipSomeChecks)
+ throws ClientException;
+
+
+ /** @see SVNUtil.parseExternals */
+ public native List<ExternalItem> parseExternals(byte[] description,
+ String parentDirectory,
+ boolean canonicalizeUrl)
+ throws ClientException;
+
+ /** @see SVNUtil#unparseExternals */
+ public native byte[] unparseExternals(List<ExternalItem> items,
+ String parentDirectory,
+ boolean old_format)
+ throws SubversionException;
+
+
+ /** @see SVNUtil#resolveExternalsUrl */
+ public native String resolveExternalsUrl(ExternalItem external,
+ String reposRootUrl,
+ String parentDirUrl)
+ throws ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java
new file mode 100644
index 0000000..3040536
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/RequestChannel.java
@@ -0,0 +1,58 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.ClosedChannelException;
+
+/* The following channel subclasses are used by the native
+ implementation of the tunnel management code. */
+
+class RequestChannel
+ extends TunnelChannel
+ implements ReadableByteChannel
+{
+ private RequestChannel(long nativeChannel)
+ {
+ super(nativeChannel);
+ }
+
+ public int read(ByteBuffer dst) throws IOException
+ {
+ long channel = nativeChannel.get();
+ if (channel != 0)
+ try {
+ return nativeRead(channel, dst);
+ } catch (IOException ex) {
+ nativeChannel.set(0); // Close the channel
+ throw ex;
+ }
+ throw new ClosedChannelException();
+ }
+
+ private static native int nativeRead(long nativeChannel, ByteBuffer dst)
+ throws IOException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java
new file mode 100644
index 0000000..5a94842
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/ResponseChannel.java
@@ -0,0 +1,58 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.nio.channels.ClosedChannelException;
+
+/* The following channel subclasses are used by the native
+ implementation of the tunnel management code. */
+
+class ResponseChannel
+ extends TunnelChannel
+ implements WritableByteChannel
+{
+ private ResponseChannel(long nativeChannel)
+ {
+ super(nativeChannel);
+ }
+
+ public int write(ByteBuffer src) throws IOException
+ {
+ long channel = this.nativeChannel.get();
+ if (channel != 0)
+ try {
+ return nativeWrite(channel, src);
+ } catch (IOException ex) {
+ nativeChannel.set(0); // Close the channel
+ throw ex;
+ }
+ throw new ClosedChannelException();
+ }
+
+ private static native int nativeWrite(long nativeChannel, ByteBuffer src)
+ throws IOException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java
new file mode 100644
index 0000000..723a525
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/SubstLib.java
@@ -0,0 +1,113 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import org.apache.subversion.javahl.SVNUtil;
+import org.apache.subversion.javahl.ClientException;
+import org.apache.subversion.javahl.SubversionException;
+import org.apache.subversion.javahl.NativeResources;
+
+import java.util.Date;
+import java.util.Map;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Encapsulates utility functions for substitution and translation
+ * provided by the <code>svn_subst</code> module of
+ * <code>libsvn_subr</code>.
+ * @since 1.9
+ */
+public class SubstLib
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+ }
+
+ /**
+ * @see SVNUtil.EOL_LF
+ */
+ public static final byte[] EOL_LF = new byte[]{ (byte)10 };
+
+ /**
+ * @see SVNUtil.EOL_CR
+ */
+ public static final byte[] EOL_CR = new byte[]{ (byte)13 };
+
+ /**
+ * @see SVNUtil.EOL_CRLF
+ */
+ public static final byte[] EOL_CRLF = new byte[]{ EOL_CR[0], EOL_LF[0] };
+
+ /**
+ * @see SVNUtil.buildKeywords
+ */
+ public native Map<String, byte[]> buildKeywords(byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException;
+
+ /**
+ * @see SVNUtil.translateStream
+ */
+ public native InputStream translateInputStream(
+ InputStream source,
+ byte[] eolMarker,
+ boolean repairEol,
+ Map<String, byte[]> keywords,
+ boolean useKeywordsMap,
+ boolean expandKeywords,
+ byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException;
+
+ /**
+ * @see SVNUtil.translateStream
+ */
+ public native OutputStream translateOutputStream(
+ OutputStream destination,
+ byte[] eolMarker,
+ boolean repairEol,
+ Map<String, byte[]> keywords,
+ boolean useKeywordsMap,
+ boolean expandKeywords,
+ byte[] keywordsValue,
+ long revision,
+ String url,
+ String reposRootUrl,
+ Date date,
+ String author)
+ throws SubversionException, ClientException;
+}
diff --git a/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java
new file mode 100644
index 0000000..933d883
--- /dev/null
+++ b/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/TunnelChannel.java
@@ -0,0 +1,57 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channel;
+import java.util.concurrent.atomic.AtomicLong;
+
+/* The following channel subclasses are used by the native
+ implementation of the tunnel management code. */
+
+abstract class TunnelChannel implements Channel
+{
+ protected TunnelChannel(long nativeChannel)
+ {
+ this.nativeChannel = new AtomicLong(nativeChannel);
+ }
+
+ public boolean isOpen()
+ {
+ return (nativeChannel.get() != 0);
+ }
+
+ public void close() throws IOException
+ {
+ long channel = nativeChannel.getAndSet(0);
+ if (channel != 0)
+ nativeClose(channel);
+ }
+
+ private native static void nativeClose(long nativeChannel)
+ throws IOException;
+
+ protected AtomicLong nativeChannel;
+}
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java
index 07fd64d..07fa469 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResult.java
@@ -84,7 +84,7 @@ public class ConflictResult
private String mergedPath;
/**
- * Create a new conflict result instace.
+ * Create a new conflict result instance.
*/
public ConflictResult(int choice, String mergedPath)
{
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java
index 3ad9eba..8e335f9 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Path.java
@@ -31,14 +31,6 @@ package org.tigris.subversion.javahl;
public class Path
{
/**
- * Load the required native library.
- */
- static
- {
- org.apache.subversion.javahl.NativeResources.loadNativeLibrary();
- }
-
- /**
* A valid path is a UTF-8 string without any control characters.
*
* @return Whether Subversion can store the path in a repository.
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java
index 68bf797..eb50a2a 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/PropertyData.java
@@ -138,7 +138,7 @@ public class PropertyData
}
/**
- * this contructor is used when building a thin wrapper around other
+ * this constructor is used when building a thin wrapper around other
* property retrieval methods
* @param p the path of the item owning this property
* @param n the name of the property
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
index 02122a4..337fee0 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
@@ -38,7 +38,7 @@ public class SVNAdmin
private org.apache.subversion.javahl.SVNRepos aSVNAdmin;
/**
- * Standard empty contructor, builds just the native peer.
+ * Standard empty constructor, builds just the native peer.
*/
public SVNAdmin()
{
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
index b8582c5..36c37e5 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
@@ -47,7 +47,7 @@ public class SVNClient implements SVNClientInterface
private org.apache.subversion.javahl.SVNClient aSVNClient;
/**
- * Standard empty contructor, builds just the native peer.
+ * Standard empty constructor, builds just the native peer.
*/
public SVNClient()
{
@@ -377,7 +377,10 @@ public class SVNClient implements SVNClientInterface
public boolean userAllowedSave()
{
- return false;
+ if (oldPrompt3 != null)
+ return oldPrompt3.userAllowedSave();
+ else
+ return false;
}
public String askQuestion(String realm, String question,
@@ -756,14 +759,14 @@ public class SVNClient implements SVNClientInterface
}
public String getLogMessage(
- Set<org.apache.subversion.javahl.CommitItem> elementsToBeCommited)
+ Set<org.apache.subversion.javahl.CommitItem> elementsToBeCommitted)
{
CommitItem[] aElements =
- new CommitItem[elementsToBeCommited.size()];
+ new CommitItem[elementsToBeCommitted.size()];
int i = 0;
for (org.apache.subversion.javahl.CommitItem item
- : elementsToBeCommited)
+ : elementsToBeCommitted)
{
aElements[i] = new CommitItem(item);
i++;
@@ -2415,18 +2418,18 @@ public class SVNClient implements SVNClientInterface
{
try
{
- final List<org.apache.subversion.javahl.types.Info> infos =
- new ArrayList<org.apache.subversion.javahl.types.Info>();
- aSVNClient.info2(path,
- org.apache.subversion.javahl.types.Revision.HEAD,
- org.apache.subversion.javahl.types.Revision.HEAD,
- org.apache.subversion.javahl.types.Depth.empty,
- null, new org.apache.subversion.javahl.callback.InfoCallback()
- {
- public void singleInfo(org.apache.subversion.javahl.types.Info info) {
- infos.add(info);
- }
- });
+ final List<org.apache.subversion.javahl.types.Info> infos =
+ new ArrayList<org.apache.subversion.javahl.types.Info>();
+ aSVNClient.info2(path,
+ org.apache.subversion.javahl.types.Revision.HEAD,
+ org.apache.subversion.javahl.types.Revision.HEAD,
+ org.apache.subversion.javahl.types.Depth.empty,
+ null, new org.apache.subversion.javahl.callback.InfoCallback()
+ {
+ public void singleInfo(org.apache.subversion.javahl.types.Info info) {
+ infos.add(info);
+ }
+ });
return new Info(infos.get(0));
}
catch (org.apache.subversion.javahl.ClientException ex)
diff --git a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java
index 2584079..830713c 100644
--- a/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java
+++ b/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java
@@ -1330,9 +1330,9 @@ public interface SVNClientInterface
* #diffSummarize(String, Revision, String, Revision, int,
* boolean, DiffSummaryReceiver)}, using <code>path</code> for
* both of that method's targets.
- * @param startRevision Beginning of range for comparsion of
+ * @param startRevision Beginning of range for comparison of
* <code>target</code>.
- * @param endRevision End of range for comparsion of
+ * @param endRevision End of range for comparison of
* <code>target</code>.
* @param depth how deep to recurse.
* @param changelists if non-null, filter paths using changelists
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
index 5ed2229..8ca2b1f 100644
--- a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
@@ -33,6 +33,9 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
import java.text.ParseException;
import java.util.Collection;
import java.util.Arrays;
@@ -136,9 +139,10 @@ public class BasicTests extends SVNTests
*/
public void testVersionExtendedQuiet() throws Throwable
{
+ VersionExtended vx = null;
try
{
- VersionExtended vx = client.getVersionExtended(false);
+ vx = client.getVersionExtended(false);
String result = vx.getBuildDate();
if (result == null || result.trim().length() == 0)
throw new Exception("Build date empty");
@@ -157,6 +161,11 @@ public class BasicTests extends SVNTests
fail("VersionExtended should always be available unless the " +
"native libraries failed to initialize: " + e);
}
+ finally
+ {
+ if (vx != null)
+ vx.dispose();
+ }
}
/**
@@ -165,9 +174,10 @@ public class BasicTests extends SVNTests
*/
public void testVersionExtendedVerbose() throws Throwable
{
+ VersionExtended vx = null;
try
{
- VersionExtended vx = client.getVersionExtended(true);
+ vx = client.getVersionExtended(true);
String result = vx.getRuntimeHost();
if (result == null || result.trim().length() == 0)
throw new Exception("Runtime host empty");
@@ -213,6 +223,38 @@ public class BasicTests extends SVNTests
fail("VersionExtended should always be available unless the " +
"native libraries failed to initialize: " + e);
}
+ finally
+ {
+ if (vx != null)
+ vx.dispose();
+ }
+ }
+
+ /**
+ * Test RuntimeVersion
+ */
+ public void testRuntimeVersion() throws Throwable
+ {
+ try
+ {
+ RuntimeVersion runtimeVersion = client.getRuntimeVersion();
+ String versionString = runtimeVersion.toString();
+ if (versionString == null || versionString.trim().length() == 0)
+ {
+ throw new Exception("Version string empty");
+ }
+ }
+ catch (Exception e)
+ {
+ fail("RuntimeVersion should always be available unless the " +
+ "native libraries failed to initialize: " + e);
+ }
+
+ RuntimeVersion runtimeVersion = client.getRuntimeVersion();
+ Version version = client.getVersion();
+ assertTrue(runtimeVersion.getMajor() > version.getMajor()
+ || (runtimeVersion.getMajor() == version.getMajor()
+ && runtimeVersion.getMinor() >= version.getMinor()));
}
/**
@@ -229,7 +271,7 @@ public class BasicTests extends SVNTests
tempclient.dispose();
// create Y and Y/Z directories in the repository
- addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", NodeKind.none,
+ addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", NodeKind.dir,
CommitItemStateFlags.Add);
Set<String> urls = new HashSet<String>(1);
urls.add(thisTest.getUrl() + "/Y");
@@ -239,7 +281,7 @@ public class BasicTests extends SVNTests
}
catch(JNIError e)
{
- return; // Test passes!
+ return; // Test passes!
}
fail("A JNIError should have been thrown here.");
}
@@ -251,16 +293,17 @@ public class BasicTests extends SVNTests
public void testMergeinfoParser() throws Throwable
{
String mergeInfoPropertyValue =
- "/trunk:1-300,305,307,400-405\n/branches/branch:308-400";
+ "/trunk:1-300,305*,307,400-405*\n" +
+ "/branches/branch:308-400";
Mergeinfo info = new Mergeinfo(mergeInfoPropertyValue);
Set<String> paths = info.getPaths();
assertEquals(2, paths.size());
List<RevisionRange> trunkRange = info.getRevisionRange("/trunk");
assertEquals(4, trunkRange.size());
assertEquals("1-300", trunkRange.get(0).toString());
- assertEquals("305", trunkRange.get(1).toString());
+ assertEquals("305*", trunkRange.get(1).toString());
assertEquals("307", trunkRange.get(2).toString());
- assertEquals("400-405", trunkRange.get(3).toString());
+ assertEquals("400-405*", trunkRange.get(3).toString());
List<RevisionRange> branchRange =
info.getRevisionRange("/branches/branch");
assertEquals(1, branchRange.size());
@@ -276,17 +319,31 @@ public class BasicTests extends SVNTests
OneTest thisTest = new OneTest();
// check the status of the working copy
+ thisTest.getWc().setItemDepth("", Depth.infinity);
+ thisTest.getWc().setItemDepth("iota", Depth.unknown);
thisTest.checkStatus();
// Test status of non-existent file
File fileC = new File(thisTest.getWorkingCopy() + "/A", "foo.c");
MyStatusCallback statusCallback = new MyStatusCallback();
- client.status(fileToSVNPath(fileC, false), Depth.unknown, false, true,
- false, false, null, statusCallback);
- if (statusCallback.getStatusArray().length > 0)
- fail("File foo.c should not return a status.");
+ client.status(fileToSVNPath(fileC, false), Depth.unknown,
+ false, true, true, false, false, false,
+ null, statusCallback);
+ final int statusCount = statusCallback.getStatusArray().length;
+ if (statusCount == 1)
+ {
+ Status st = statusCallback.getStatusArray()[0];
+ if (st.isConflicted()
+ || st.getNodeStatus() != Status.Kind.none
+ || st.getRepositoryNodeStatus() != Status.Kind.none)
+ fail("File foo.c should return empty status.");
+ }
+ else if (statusCount > 1)
+ fail("File foo.c should not return more than one status.");
+ else
+ fail("File foo.c should return exactly one empty status.");
}
/**
@@ -357,7 +414,8 @@ public class BasicTests extends SVNTests
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/D/G/rho", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long rhoCommitDate = status.getLastChangedDate().getTime();
long rhoCommitRev = rev;
@@ -394,7 +452,8 @@ public class BasicTests extends SVNTests
+ "modification to tau");
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/D/G/tau", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long tauCommitDate = status.getLastChangedDate().getTime();
long tauCommitRev = rev;
@@ -423,7 +482,8 @@ public class BasicTests extends SVNTests
thisTest.getWc().addItem("A/B/I", null);
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/B/I", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long ICommitDate = status.getLastChangedDate().getTime();
long ICommitRev = rev;
@@ -458,7 +518,8 @@ public class BasicTests extends SVNTests
thisTest.getWc().addItem("A/D/H/nu", "This is the file 'nu'.");
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/D/H/nu", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long nuCommitDate = status.getLastChangedDate().getTime();
long nuCommitRev = rev;
@@ -475,7 +536,8 @@ public class BasicTests extends SVNTests
thisTest.getWc().setItemWorkingCopyRevision("A/B/F", rev);
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/B/F", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long FCommitDate = status.getLastChangedDate().getTime();
long FCommitRev = rev;
@@ -506,7 +568,8 @@ public class BasicTests extends SVNTests
"This is the replacement file 'chi'.");
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/D/H/chi", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long chiCommitDate = status.getLastChangedDate().getTime();
long chiCommitRev = rev;
@@ -557,7 +620,8 @@ public class BasicTests extends SVNTests
assertEquals("wrong revision number from commit", rev, expectedRev++);
statusCallback = new MyStatusCallback();
client.status(thisTest.getWCPath() + "/A/D/H/psi", Depth.immediates,
- false, true, false, false, null, statusCallback);
+ false, true, true, false, false, false,
+ null, statusCallback);
status = statusCallback.getStatusArray()[0];
long psiCommitDate = status.getLastChangedDate().getTime();
long psiCommitRev = rev;
@@ -649,6 +713,47 @@ public class BasicTests extends SVNTests
}
/**
+ * Test SVNClient.status on externals.
+ * @throws Throwable
+ */
+ public void testExternalStatus() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+
+ // Add an externals reference to the working copy.
+ client.propertySetLocal(thisTest.getWCPathSet(), "svn:externals",
+ "^/A/D/H ADHext".getBytes(),
+ Depth.empty, null, false);
+
+ // Update the working copy to bring in the external subtree.
+ client.update(thisTest.getWCPathSet(), Revision.HEAD,
+ Depth.unknown, false, false, false, false);
+
+ // Test status of an external file
+ File psi = new File(thisTest.getWorkingCopy() + "/ADHext", "psi");
+
+ MyStatusCallback statusCallback = new MyStatusCallback();
+ client.status(fileToSVNPath(psi, false), Depth.unknown,
+ false, true, true, false, false, false,
+ null, statusCallback);
+
+ final int statusCount = statusCallback.getStatusArray().length;
+ if (statusCount == 1)
+ {
+ Status st = statusCallback.getStatusArray()[0];
+ assertFalse(st.isConflicted());
+ assertEquals(Status.Kind.normal, st.getNodeStatus());
+ assertEquals(NodeKind.file, st.getNodeKind());
+ }
+ else if (statusCount > 1)
+ fail("File psi should not return more than one status.");
+ else
+ fail("File psi should return exactly one status.");
+ }
+
+ /**
* Test the basic SVNClient.checkout functionality.
* @throws Throwable
*/
@@ -911,9 +1016,9 @@ public class BasicTests extends SVNTests
OneTest thisTest = new OneTest();
// create Y and Y/Z directories in the repository
- addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", NodeKind.none,
+ addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y", NodeKind.dir,
CommitItemStateFlags.Add);
- addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y/Z", NodeKind.none,
+ addExpectedCommitItem(null, thisTest.getUrl().toString(), "Y/Z", NodeKind.dir,
CommitItemStateFlags.Add);
Set<String> urls = new HashSet<String>(2);
urls.add(thisTest.getUrl() + "/Y");
@@ -967,7 +1072,7 @@ public class BasicTests extends SVNTests
}
client.copy(sources,
new File(thisTest.getWorkingCopy(), "A/B/F").getPath(),
- true, false, false, null, null, null);
+ true, false, false, false, false, null, null, null, null);
// Commit the changes, and check the state of the WC.
checkCommitRevision(thisTest,
@@ -984,7 +1089,7 @@ public class BasicTests extends SVNTests
"A/B").getPath(), Revision.WORKING,
Revision.WORKING));
client.copy(wcSource, thisTest.getUrl() + "/parent/A/B",
- true, true, false, null,
+ true, true, false, false, false, null, null,
new ConstMsg("Copy WC to URL"), null);
// update the WC to get new folder and confirm the copy
@@ -992,6 +1097,221 @@ public class BasicTests extends SVNTests
update(thisTest), 3);
}
+
+ // Set up externals references in the working copy for the
+ // pin-externals tests.
+ private void setupPinExternalsTest(OneTest thisTest) throws Throwable
+ {
+ byte[] extref = ("^/A/D/H ADHext\n" +
+ "^/A/D/H ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H revvedADHext\n").getBytes();
+ Set<String> paths = new HashSet<String>();
+ paths.add(thisTest.getWCPath() + "/A/B");
+
+ // Add an externals reference to the working copy.
+ client.propertySetLocal(paths, "svn:externals", extref,
+ Depth.empty, null, false);
+
+ // Commit the externals definition
+ client.commit(thisTest.getWCPathSet(), Depth.infinity,
+ false, false, null, null,
+ new ConstMsg("Set svn:externals"), null);
+
+ // Update the working copy to bring in the external subtree.
+ client.update(thisTest.getWCPathSet(), Revision.HEAD,
+ Depth.unknown, false, false, false, false);
+ }
+
+ /**
+ * Test WC-to-WC copy with implicit pinned externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_wc2wc() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(thisTest.getWCPath() + "/A/B", null, null));
+ String target = thisTest.getWCPath() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ null, // externalsToPin
+ null, null, null);
+
+ // Verification
+ String expected = ("^/A/D/H@2 ADHext\n" +
+ "^/A/D/H@2 ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H@2 revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
+ /**
+ * Test WC-to-REPO copy with implicit pinned externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_wc2repo() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(thisTest.getWCPath() + "/A/B", null, null));
+ String target = thisTest.getUrl() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ null, // externalsToPin
+ null, new ConstMsg("Copy WC to REPO"), null);
+
+ // Verification
+ String expected = ("^/A/D/H@2 ADHext\n" +
+ "^/A/D/H@2 ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H@2 revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
+ /**
+ * Test REPO-to-WC copy with implicit pinned externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_repo2wc() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(thisTest.getUrl() + "/A/B", null, null));
+ String target = thisTest.getWCPath() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ null, // externalsToPin
+ null, null, null);
+
+ // Verification
+ String expected = ("^/A/D/H@2 ADHext\n" +
+ "^/A/D/H@2 ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H@2 revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
+ /**
+ * Test REPO-to-REPO copy with implicit pinned externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_repo2repo() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(thisTest.getUrl() + "/A/B", null, null));
+ String target = thisTest.getUrl() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ null, // externalsToPin
+ null, new ConstMsg("Copy WC to REPO"), null);
+
+ // Verification
+ String expected = ("^/A/D/H@2 ADHext\n" +
+ "^/A/D/H@2 ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H@2 revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
+ /**
+ * Test REPO-to-REPO copy with eplicit pinned externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_repo2repo_explicit() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ String sourceUrl = thisTest.getUrl() + "/A/B";
+ Map<String, List<ExternalItem>> externalsToPin =
+ new HashMap<String, List<ExternalItem>>();
+ List<ExternalItem> items = new ArrayList<ExternalItem>(1);
+ items.add(new ExternalItem("ADHext", "^/A/D/H", null, null));
+ externalsToPin.put(sourceUrl, items);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(sourceUrl, null, null));
+ String target = thisTest.getUrl() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ externalsToPin,
+ null, new ConstMsg("Copy WC to REPO"), null);
+
+ // Verification
+ String expected = ("^/A/D/H@2 ADHext\n" +
+ "^/A/D/H ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
+ /**
+ * Test REPO-to-REPO copy with explicit pinned externals that
+ * don't correspond to actual externals
+ * @throws Throwable
+ */
+ public void testCopyPinExternals_repo2repo_corkscrew() throws Throwable
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+ setupPinExternalsTest(thisTest);
+
+ String sourceUrl = thisTest.getUrl() + "/A/B";
+ Map<String, List<ExternalItem>> externalsToPin =
+ new HashMap<String, List<ExternalItem>>();
+ List<ExternalItem> items = new ArrayList<ExternalItem>(1);
+ items.add(new ExternalItem("ADHext", "^/A/D/H", null, null));
+ externalsToPin.put(sourceUrl + "/A", items);
+
+ List<CopySource> sources = new ArrayList<CopySource>(1);
+ sources.add(new CopySource(sourceUrl, null, null));
+ String target = thisTest.getUrl() + "/A/Bcopy";
+ client.copy(sources, target, true, false, false, false,
+ true, // pinExternals
+ externalsToPin,
+ null, new ConstMsg("Copy WC to REPO"), null);
+
+ // Verification
+ String expected = ("^/A/D/H ADHext\n" +
+ "^/A/D/H ADHext2\n" +
+ "^/A/D/H@1 peggedADHext\n" +
+ "-r1 ^/A/D/H revvedADHext\n");
+ String actual =
+ new String(client.propertyGet(target, "svn:externals", null, null));
+
+ assertEquals(expected, actual);
+ }
+
/**
* Test the {@link SVNClientInterface.move()} API.
* @since 1.5
@@ -1031,7 +1351,8 @@ public class BasicTests extends SVNTests
MyStatusCallback statusCallback = new MyStatusCallback();
String statusPath = fileToSVNPath(new File(thisTest.getWCPath() + "/A/B"), true);
- client.status(statusPath, Depth.infinity, false, false, false, true,
+ client.status(statusPath, Depth.infinity,
+ false, true, false, false, true, false,
null, statusCallback);
Status[] statusList = statusCallback.getStatusArray();
assertEquals(statusPath + "/F/alpha",
@@ -1054,6 +1375,37 @@ public class BasicTests extends SVNTests
}
/**
+ * Check that half a move cannot be committed.
+ * @since 1.9
+ */
+ public void testCommitPartialMove() throws Throwable
+ {
+ OneTest thisTest = new OneTest();
+ String root = thisTest.getWorkingCopy().getAbsolutePath();
+ ClientException caught = null;
+
+ Set<String> srcPaths = new HashSet<String>(1);
+ srcPaths.add(root + "/A/B/E/alpha");
+ client.move(srcPaths, root + "/moved-alpha",
+ false, false, false, false, false, null, null, null);
+
+ try {
+ client.commit(srcPaths, Depth.infinity, false, false, null, null,
+ new ConstMsg("Commit half of a move"), null);
+ } catch (ClientException ex) {
+ caught = ex;
+ }
+
+ assertNotNull("Commit of partial move did not fail", caught);
+
+ List<ClientException.ErrorMessage> msgs = caught.getAllMessages();
+ assertTrue(msgs.size() >= 3);
+ assertTrue(msgs.get(0).getMessage().startsWith("Illegal target"));
+ assertTrue(msgs.get(1).getMessage().startsWith("Commit failed"));
+ assertTrue(msgs.get(2).getMessage().startsWith("Cannot commit"));
+ }
+
+ /**
* Assert that the first merge source suggested for
* <code>destPath</code> at {@link Revision#WORKING} and {@link
* Revision#HEAD} is equivalent to <code>expectedSrc</code>.
@@ -1368,7 +1720,7 @@ public class BasicTests extends SVNTests
/**
* Test the basic SVNClient.cleanup functionality.
* Without a way to force a lock, this test just verifies
- * the method can be called succesfully.
+ * the method can be called successfully.
* @throws Throwable
*/
public void testBasicCleanup() throws Throwable
@@ -1770,7 +2122,7 @@ public class BasicTests extends SVNTests
// check the status of the working copy
thisTest.checkStatus();
- // confirm that the file are realy deleted
+ // confirm that the file are really deleted
assertFalse("failed to remove text modified file",
new File(thisTest.getWorkingCopy(), "A/D/G/rho").exists());
assertFalse("failed to remove prop modified file",
@@ -1798,7 +2150,7 @@ public class BasicTests extends SVNTests
try
{
- // delete non-existant file foo
+ // delete non-existent file foo
Set<String> paths = new HashSet<String>(1);
paths.add(file.getAbsolutePath());
client.remove(paths, true, false, null, null, null);
@@ -2194,7 +2546,7 @@ public class BasicTests extends SVNTests
}
/**
- * Test the basic SVNClient.info2 functionality.
+ * Test the basic SVNClient.info functionality.
* @throws Throwable
* @since 1.2
*/
@@ -2270,8 +2622,9 @@ public class BasicTests extends SVNTests
assertTrue(changelists.equals(cl));
// Does status report this changelist?
MyStatusCallback statusCallback = new MyStatusCallback();
- client.status(path, Depth.immediates, false, false, false, false,
- null, statusCallback);
+ client.status(path, Depth.immediates,
+ false, true, false, false, false, false,
+ null, statusCallback);
Status[] status = statusCallback.getStatusArray();
assertEquals(status[0].getChangelist(), changelistName);
@@ -2284,6 +2637,33 @@ public class BasicTests extends SVNTests
assertTrue(clCallback.isEmpty());
}
+ public void testGetAllChangelists() throws Throwable
+ {
+ OneTest thisTest = new OneTest();
+ final String cl1 = "changelist_one";
+ final String cl2 = "changelist_too";
+ MyChangelistCallback clCallback = new MyChangelistCallback();
+
+ String path = fileToSVNPath(new File(thisTest.getWCPath(), "iota"),
+ true);
+ Set<String> paths = new HashSet<String>(1);
+ paths.add(path);
+ client.addToChangelist(paths, cl1, Depth.infinity, null);
+ paths.remove(path);
+
+ path = fileToSVNPath(new File(thisTest.getWCPath(), "A/B/lambda"),
+ true);
+ paths.add(path);
+ client.addToChangelist(paths, cl2, Depth.infinity, null);
+
+ client.getChangelists(thisTest.getWCPath(), null,
+ Depth.infinity, clCallback);
+ Collection<String> changelists = clCallback.getChangelists();
+ assertEquals(2, changelists.size());
+ assertTrue("Contains " + cl1, changelists.contains(cl1));
+ assertTrue("Contains " + cl2, changelists.contains(cl2));
+ }
+
/**
* Helper method for testing mergeinfo retrieval. Assumes
* that <code>targetPath</code> has both merge history and
@@ -2315,7 +2695,7 @@ public class BasicTests extends SVNTests
List<RevisionRange> ranges = mergeInfo.getRevisions(mergeSrc);
assertTrue("Missing merge info for source '" + mergeSrc + "' on '" +
targetPath + '\'', ranges != null && !ranges.isEmpty());
- RevisionRange range = (RevisionRange) ranges.get(0);
+ RevisionRange range = ranges.get(0);
String expectedMergedRevs = expectedMergeStart + "-" + expectedMergeEnd;
assertEquals("Unexpected first merged revision range for '" +
mergeSrc + "' on '" + targetPath + '\'',
@@ -2578,6 +2958,7 @@ public class BasicTests extends SVNTests
* @throws Throwable
* @since 1.5
*/
+ @SuppressWarnings("deprecation")
public void testMergeReintegrate() throws Throwable
{
OneTest thisTest = setupAndPerformMerge();
@@ -2649,6 +3030,74 @@ public class BasicTests extends SVNTests
}
+
+ /**
+ * Test reintegrating a branch with trunk, using automatic reintegrate.
+ */
+ public void testMergeAutoReintegrate() throws Throwable
+ {
+ OneTest thisTest = setupAndPerformMerge();
+
+ // Test that getMergeinfo() returns null.
+ assertNull(client.getMergeinfo(new File(thisTest.getWCPath(), "A")
+ .toString(), Revision.HEAD));
+
+ // Merge and commit some changes to main (r4).
+ appendText(thisTest, "A/mu", "xxx", 4);
+ checkCommitRevision(thisTest,
+ "wrong revision number from main commit", 4,
+ thisTest.getWCPathSet(), "log msg", Depth.infinity,
+ false, false, null, null);
+ // Merge and commit some changes to branch (r5).
+ appendText(thisTest, "branches/A/D/G/rho", "yyy", -1);
+ checkCommitRevision(thisTest,
+ "wrong revision number from branch commit", 5,
+ thisTest.getWCPathSet(), "log msg", Depth.infinity,
+ false, false, null, null);
+
+ // update the branch WC (to r5) before merge
+ update(thisTest, "/branches");
+
+ String branchPath = thisTest.getWCPath() + "/branches/A";
+ String modUrl = thisTest.getUrl() + "/A";
+ Revision unspec = new Revision(Revision.Kind.unspecified);
+ List<RevisionRange> ranges = new ArrayList<RevisionRange>(1);
+ ranges.add(new RevisionRange(unspec, unspec));
+ client.merge(modUrl, Revision.HEAD, ranges,
+ branchPath, true, Depth.infinity, false, false, false);
+
+ // commit the changes so that we can verify merge
+ addExpectedCommitItem(thisTest.getWCPath(), thisTest.getUrl().toString(),
+ "branches/A", NodeKind.dir,
+ CommitItemStateFlags.PropMods);
+ addExpectedCommitItem(thisTest.getWCPath(), thisTest.getUrl().toString(),
+ "branches/A/mu", NodeKind.file,
+ CommitItemStateFlags.TextMods);
+ checkCommitRevision(thisTest, "wrong revision number from commit", 6,
+ thisTest.getWCPathSet(), "log msg", Depth.infinity,
+ false, false, null, null);
+
+ // now we reintegrate the branch with main
+ String branchUrl = thisTest.getUrl() + "/branches/A";
+ client.merge(branchUrl, Revision.HEAD, null,
+ thisTest.getWCPath() + "/A", false,
+ Depth.unknown, false, false, false, false);
+
+ // make the working copy up-to-date, so that mergeinfo can be committed
+ update(thisTest);
+ // commit the changes so that we can verify merge
+ addExpectedCommitItem(thisTest.getWCPath(),
+ thisTest.getUrl().toString(), "A", NodeKind.dir,
+ CommitItemStateFlags.PropMods);
+ addExpectedCommitItem(thisTest.getWCPath(),
+ thisTest.getUrl().toString(), "A/D/G/rho",
+ NodeKind.file, CommitItemStateFlags.TextMods);
+ checkCommitRevision(thisTest, "wrong revision number from commit", 7,
+ thisTest.getWCPathSet(), "log msg", Depth.infinity,
+ false, false, null, null);
+
+ }
+
/**
* Test automatic merge conflict resolution.
* @throws Throwable
@@ -2781,7 +3230,7 @@ public class BasicTests extends SVNTests
srcs.add(new CopySource(thisTest.getUrl() + "/A", Revision.HEAD,
Revision.HEAD));
client.copy(srcs, thisTest.getUrl() + "/branches/A",
- true, false, false, null,
+ true, false, false, false, false, null, null,
new ConstMsg("create A branch"), null);
// update the WC (to r3) so that it has the branches folder
@@ -2824,7 +3273,7 @@ public class BasicTests extends SVNTests
// Do nothing, right now.
return false;
}
- });
+ });
}
/**
@@ -2885,7 +3334,7 @@ public class BasicTests extends SVNTests
thisTest.getUrl().toString(), diffOutput.getPath(),
Depth.infinity, null, true, true, false, false);
- fail("This test should fail becaus the relativeToDir parameter " +
+ fail("This test should fail because the relativeToDir parameter " +
"does not work with URLs");
}
catch (Exception ignored)
@@ -3234,7 +3683,7 @@ public class BasicTests extends SVNTests
// Rigorously inspect one of our DiffSummary notifications.
final String BETA_PATH = "A/B/E/beta";
- DiffSummary betaDiff = (DiffSummary) summaries.get(BETA_PATH);
+ DiffSummary betaDiff = summaries.get(BETA_PATH);
assertNotNull("No diff summary for " + BETA_PATH, betaDiff);
assertEquals("Incorrect path for " + BETA_PATH, BETA_PATH,
betaDiff.getPath());
@@ -3299,6 +3748,16 @@ public class BasicTests extends SVNTests
}
}
+ private static class CountingProgressListener implements ProgressCallback
+ {
+ public void onProgress(ProgressEvent event)
+ {
+ // TODO: Examine the byte counts from "event".
+ gotProgress = true;
+ }
+ public boolean gotProgress = false;
+ }
+
public void testDataTransferProgressReport() throws Throwable
{
// ### FIXME: This isn't working over ra_local, because
@@ -3308,25 +3767,13 @@ public class BasicTests extends SVNTests
// build the test setup
OneTest thisTest = new OneTest();
- ProgressCallback listener = new ProgressCallback()
- {
- public void onProgress(ProgressEvent event)
- {
- // TODO: Examine the byte counts from "event".
- throw new RuntimeException("Progress reported as expected");
- }
- };
+ CountingProgressListener listener = new CountingProgressListener();
client.setProgressCallback(listener);
// Perform an update to exercise the progress notification.
- try
- {
- update(thisTest);
+ update(thisTest);
+ if (!listener.gotProgress)
fail("No progress reported");
- }
- catch (RuntimeException progressReported)
- {
- }
}
/**
@@ -3665,11 +4112,46 @@ public class BasicTests extends SVNTests
false, false, callback);
assertEquals(1, callback.numberOfLines());
BlameCallbackImpl.BlameLine line = callback.getBlameLine(0);
- if (line != null)
- {
- assertEquals(1, line.getRevision());
- assertEquals("jrandom", line.getAuthor());
+ assertNotNull(line);
+ assertEquals(1, line.getRevision());
+ assertEquals("jrandom", line.getAuthor());
+ assertEquals("This is the file 'iota'.", line.getLine());
+ }
+
+ /**
+ * Test blame with diff options.
+ * @since 1.9
+ */
+ public void testBlameWithDiffOptions() throws Throwable
+ {
+ OneTest thisTest = new OneTest();
+ // Modify the file iota, making only whitespace changes.
+ File iota = new File(thisTest.getWorkingCopy(), "iota");
+ FileOutputStream stream = new FileOutputStream(iota, false);
+ stream.write("This is the file 'iota'.\t".getBytes());
+ stream.close();
+ Set<String> srcPaths = new HashSet<String>(1);
+ srcPaths.add(thisTest.getWCPath());
+ try {
+ client.username("rayjandom");
+ client.commit(srcPaths, Depth.infinity, false, false, null, null,
+ new ConstMsg("Whitespace-only change in /iota"), null);
+ } finally {
+ client.username("jrandom");
}
+
+ // Run blame on the result
+ BlameCallbackImpl callback = new BlameCallbackImpl();
+ client.blame(thisTest.getWCPath() + "/iota", Revision.HEAD,
+ Revision.getInstance(1), Revision.HEAD,
+ false, false, callback,
+ new DiffOptions(DiffOptions.Flag.IgnoreWhitespace));
+ assertEquals(1, callback.numberOfLines());
+ BlameCallbackImpl.BlameLine line = callback.getBlameLine(0);
+ assertNotNull(line);
+ assertEquals(1, line.getRevision());
+ assertEquals("jrandom", line.getAuthor());
+ assertEquals("This is the file 'iota'.\t", line.getLine());
}
/**
@@ -3745,6 +4227,149 @@ public class BasicTests extends SVNTests
}
/**
+ * Test RevisionRangeList.remove
+ */
+ public void testRevisionRangeListRemove() throws Throwable
+ {
+ RevisionRangeList ranges =
+ new RevisionRangeList(new ArrayList<RevisionRange>());
+ ranges.getRanges()
+ .add(new RevisionRange(Revision.getInstance(1),
+ Revision.getInstance(5),
+ true));
+ ranges.getRanges()
+ .add(new RevisionRange(Revision.getInstance(7),
+ Revision.getInstance(9),
+ false));
+ RevisionRangeList eraser =
+ new RevisionRangeList(new ArrayList<RevisionRange>());
+ eraser.getRanges()
+ .add(new RevisionRange(Revision.getInstance(7),
+ Revision.getInstance(9),
+ true));
+
+ List<RevisionRange> result = ranges.remove(eraser, true).getRanges();
+ assertEquals(2, ranges.getRanges().size());
+ assertEquals(1, eraser.getRanges().size());
+ assertEquals(2, result.size());
+
+ result = ranges.remove(eraser.getRanges(), false);
+ assertEquals(2, ranges.getRanges().size());
+ assertEquals(1, eraser.getRanges().size());
+ assertEquals(1, result.size());
+ }
+
+ private class Tunnel extends Thread
+ implements TunnelAgent, TunnelAgent.CloseTunnelCallback
+ {
+ public boolean checkTunnel(String name)
+ {
+ return name.equals("test");
+ }
+
+ public TunnelAgent.CloseTunnelCallback
+ openTunnel(ReadableByteChannel request,
+ WritableByteChannel response,
+ String name, String user,
+ String hostname, int port)
+ {
+ this.request = request;
+ this.response = response;
+ start();
+ return this;
+ }
+
+ public void closeTunnel()
+ {
+ Throwable t = null;
+ try {
+ request.close();
+ join();
+ response.close();
+ } catch (Throwable ex) {
+ t = ex;
+ }
+ assertEquals("No exception thrown", null, t);
+ }
+
+ private ReadableByteChannel request;
+ private WritableByteChannel response;
+
+ public void run()
+ {
+
+ int index = 0;
+ byte[] raw_data = new byte[1024];
+ ByteBuffer data = ByteBuffer.wrap(raw_data);
+ while(index < commands.length && request.isOpen()) {
+ try {
+ byte[] command = commands[index++];
+ response.write(ByteBuffer.wrap(command));
+ } catch (IOException ex) {
+ break;
+ }
+
+ try {
+ data.clear();
+ request.read(data);
+ } catch (Throwable ex) {}
+ }
+
+ try {
+ response.close();
+ request.close();
+ } catch (Throwable t) {}
+ }
+
+ private final byte[][] commands = new byte[][]{
+ // Initial capabilities negotiation
+ ("( success ( 2 2 ( ) " +
+ "( edit-pipeline svndiff1 absent-entries commit-revprops " +
+ "depth log-revprops atomic-revprops partial-replay " +
+ "inherited-props ephemeral-txnprops file-revs-reverse " +
+ ") ) ) ").getBytes(),
+
+ // Response for successful connection
+ ("( success ( ( ANONYMOUS EXTERNAL ) " +
+ "36:e3c8c113-03ba-4ec5-a8e6-8fc555e57b91 ) ) ").getBytes(),
+
+ // Response to authentication request
+ ("( success ( ) ) ( success ( " +
+ "36:e3c8c113-03ba-4ec5-a8e6-8fc555e57b91 " +
+ "24:svn+test://localhost/foo ( mergeinfo ) ) ) ").getBytes(),
+
+ // Response to revprop request
+ ("( success ( ( ) 0: ) ) ( success ( ( 4:fake ) ) ) ").getBytes()
+ };
+ }
+
+ /**
+ * Test tunnel handling.
+ */
+ public void testTunnelAgent() throws Throwable
+ {
+ byte[] revprop;
+ SVNClient cl = new SVNClient();
+ try {
+ cl.notification2(new MyNotifier());
+ if (DefaultAuthn.useDeprecated())
+ cl.setPrompt(DefaultAuthn.getDeprecated());
+ else
+ cl.setPrompt(DefaultAuthn.getDefault());
+ cl.username(USERNAME);
+ cl.setProgressCallback(new DefaultProgressListener());
+ cl.setConfigDirectory(conf.getAbsolutePath());
+
+ cl.setTunnelAgent(new Tunnel());
+ revprop = cl.revProperty("svn+test://localhost/foo", "svn:log",
+ Revision.getInstance(0L));
+ } finally {
+ cl.dispose();
+ }
+ assertEquals("fake", new String(revprop));
+ }
+
+ /**
* @return <code>file</code> converted into a -- possibly
* <code>canonical</code>-ized -- Subversion-internal path
* representation.
@@ -3797,8 +4422,16 @@ public class BasicTests extends SVNTests
extends HashMap<String, Collection<String>>
implements ChangelistCallback
{
+ private static final long serialVersionUID = 1L;
+
+ private HashSet<String> allChangelists = new HashSet<String>();
+
public void doChangelist(String path, String changelist)
{
+ if (changelist != null)
+ allChangelists.add(changelist);
+
+ path = fileToSVNPath(new File(path), true);
if (super.containsKey(path))
{
// Append the changelist to the existing list
@@ -3818,6 +4451,11 @@ public class BasicTests extends SVNTests
{
return super.get(path);
}
+
+ public Collection<String> getChangelists()
+ {
+ return allChangelists;
+ }
}
private class MyInfoCallback implements InfoCallback {
@@ -3970,8 +4608,9 @@ public class BasicTests extends SVNTests
{
final List<Info> infos = new ArrayList<Info>();
- client.info2(pathOrUrl, revision, pegRevision, depth, changelists,
- new InfoCallback () {
+ client.info(pathOrUrl, revision, pegRevision, depth,
+ true, true, false,
+ changelists, new InfoCallback () {
public void singleInfo(Info info)
{ infos.add(info); }
});
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
new file mode 100644
index 0000000..d1ccf35
--- /dev/null
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java
@@ -0,0 +1,354 @@
+/**
+ * @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
+ */
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.callback.*;
+import org.apache.subversion.javahl.types.*;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
+import java.text.ParseException;
+import java.util.Collection;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Map;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+
+/**
+ * Tests the basic functionality of javahl binding (inspired by the
+ * tests in subversion/tests/cmdline/basic_tests.py).
+ */
+public class ExceptionTests extends SVNTests
+{
+ /**
+ * Base name of all our tests.
+ */
+ public final static String testName = "exception_test";
+
+ public ExceptionTests()
+ {
+ init();
+ }
+
+ public ExceptionTests(String name)
+ {
+ super(name);
+ init();
+ }
+
+ /**
+ * Initialize the testBaseName and the testCounter, if this is the
+ * first test of this class.
+ */
+ private void init()
+ {
+ if (!testName.equals(testBaseName))
+ {
+ testCounter = 0;
+ testBaseName = testName;
+ }
+ }
+
+ /**
+ * Specific exception class to verify if the marshalling of errors
+ * through Subversion is handled properly.
+ */
+ final class TestException extends RuntimeException
+ {
+ private static final long serialVersionUID = 1L;
+
+ public TestException(String message)
+ {
+ super(message);
+ }
+
+ public TestException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+ }
+
+ public void testStatusCallback() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ client.status(thisTest.getWorkingCopy() + "/A", Depth.immediates,
+ false, true, true, false, false, false, null,
+ new StatusCallback()
+ {
+ public void doStatus(String path, Status status)
+ {
+ throw new TestException("inner", theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testInfoCallback() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ client.info(thisTest.getWorkingCopy() + "/A", null, null, Depth.immediates,
+ true, true, false, null,
+ new InfoCallback()
+ {
+ public void singleInfo(Info info)
+ {
+ throw new TestException("inner", theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testListCallback() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ client.list(thisTest.getWorkingCopy() + "/A", null, null, Depth.immediates,
+ 7, false,
+ new ListCallback()
+ {
+ public void doEntry(DirEntry dirent, Lock lock)
+ {
+ throw new TestException("inner", theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testBlameCallback() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ client.blame(thisTest.getWorkingCopy() + "/iota",
+ Revision.getInstance(1), Revision.getInstance(1),
+ Revision.getInstance(1), false, false,
+ new BlameCallback()
+ {
+ public void singleLine(long lineNum, long revision,
+ Map<String, byte[]> revProps, long mergedRevision,
+ Map<String, byte[]> mergedRevProps,
+ String mergedPath, String line,
+ boolean localChange)
+ {
+ throw new TestException("inner", theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testLogMessageCallback() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ List<RevisionRange> ranges = new ArrayList<RevisionRange>(1);
+ ranges.add(new RevisionRange(null, null));
+ client.logMessages(thisTest.getWorkingCopy() + "/iota",
+ Revision.getInstance(1), ranges,
+ false, false, false,
+ null, 2,
+ new LogMessageCallback()
+ {
+ public void singleMessage(
+ Set<ChangePath> changedPaths,
+ long revision,
+ Map<String, byte[]> revprops,
+ boolean hasChildren)
+ {
+ throw new TestException("inner",
+ theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testDiffSummaryReceiver() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ List<RevisionRange> ranges = new ArrayList<RevisionRange>(1);
+ ranges.add(new RevisionRange(null, null));
+ client.diffSummarize(thisTest.getUrl() + "/A",
+ Revision.getInstance(1),
+ thisTest.getUrl() + "/A",
+ Revision.getInstance(0),
+ Depth.infinity, null, true,
+ new DiffSummaryCallback()
+ {
+ public void onSummary(
+ DiffSummary descriptor)
+ {
+ throw new TestException("inner",
+ theException);
+ }
+ });
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ public void testNotify() throws Exception
+ {
+ // build the test setup
+ OneTest thisTest = new OneTest();
+
+ final TestException theException = new TestException("The Exception");
+ boolean handled = false;
+ // Test status of non-existent file
+ try
+ {
+ client.notification2(new ClientNotifyCallback()
+ {
+ public void onNotify(ClientNotifyInformation info)
+ {
+ throw new TestException("inner",
+ theException);
+ }
+ });
+
+ client.remove(thisTest.getWCPathSet("/A"), false, false,
+ null, null, null);
+ }
+ catch (ClientException e)
+ {
+ if (VerifyCause(e, theException))
+ handled = true;
+ else
+ throw e;
+ }
+ assertTrue(handled);
+ }
+
+ /**
+ * Verifies if a specific throwable instance is recorded in the exception chain
+ */
+ private boolean VerifyCause(Throwable caught, Throwable needle)
+ {
+ if (caught == needle)
+ return true;
+
+ Throwable cause = caught.getCause();
+ if (cause == null)
+ return false;
+
+ return VerifyCause(cause, needle);
+ }
+}
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java
index 7779a60..ba7e228 100644
--- a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java
@@ -71,7 +71,7 @@ public class RunTests
try
{
Class<?> clazz = Class.forName(className);
- final Class<?>[] argTypes = new Class[] { String.class };
+ final Class<?>[] argTypes = new Class<?>[] { String.class };
Constructor<?> ctor =
clazz.getDeclaredConstructor(argTypes);
methodName = methodName.substring(i + 1);
@@ -91,8 +91,11 @@ public class RunTests
if (testCases == null || testCases.length == 0)
{
// Add default test suites.
- suite.addTestSuite(SVNReposTests.class);
suite.addTestSuite(BasicTests.class);
+ suite.addTestSuite(UtilTests.class);
+ suite.addTestSuite(SVNRemoteTests.class);
+ suite.addTestSuite(SVNReposTests.class);
+ suite.addTestSuite(ExceptionTests.class);
}
else
{
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
new file mode 100644
index 0000000..b557416
--- /dev/null
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
@@ -0,0 +1,1444 @@
+/**
+ * @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
+ */
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.*;
+import org.apache.subversion.javahl.remote.*;
+import org.apache.subversion.javahl.callback.*;
+import org.apache.subversion.javahl.types.*;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * This class is used for testing the SVNReposAccess class
+ *
+ * More methodes for testing are still needed
+ */
+public class SVNRemoteTests extends SVNTests
+{
+ protected OneTest thisTest;
+
+ public SVNRemoteTests()
+ {
+ }
+
+ public SVNRemoteTests(String name)
+ {
+ super(name);
+ }
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ thisTest = new OneTest();
+ }
+
+ public static ISVNRemote getSession(String url, String configDirectory)
+ {
+ try
+ {
+ RemoteFactory factory = new RemoteFactory();
+ factory.setConfigDirectory(configDirectory);
+ factory.setUsername(USERNAME);
+ // Do not set default password, exercise prompter instead.
+ if (DefaultAuthn.useDeprecated())
+ factory.setPrompt(DefaultAuthn.getDeprecated());
+ else
+ factory.setPrompt(DefaultAuthn.getDefault());
+
+ ISVNRemote raSession = factory.openRemoteSession(url);
+ assertNotNull("Null session was returned by factory", raSession);
+ return raSession;
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private ISVNRemote getSession()
+ {
+ return getSession(getTestRepoUrl(), super.conf.getAbsolutePath());
+ }
+
+ /**
+ * Test the basic SVNAdmin.create functionality
+ * @throws SubversionException
+ */
+ public void testCreate()
+ throws SubversionException, IOException
+ {
+ assertTrue("repository exists", thisTest.getRepository().exists());
+ }
+
+ public void testGetSession_ConfigConstructor() throws Exception
+ {
+ ISVNRemote session;
+ try
+ {
+ if (DefaultAuthn.useDeprecated())
+ session = new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDeprecated(),
+ null, null, null)
+ .openRemoteSession(getTestRepoUrl());
+ else
+ session = new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDefault(),
+ null, null, null)
+ .openRemoteSession(getTestRepoUrl());
+ }
+ catch (ClientException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ assertNotNull("Null session was returned by factory", session);
+ assertEquals(getTestRepoUrl(), session.getSessionUrl());
+ }
+
+ public void testDispose() throws Exception
+ {
+ ISVNRemote session = getSession();
+ session.dispose();
+ }
+
+ public void testSessionGC() throws Exception
+ {
+ int svnErrorCode = 0;
+ try {
+ try {
+ String prefix = getTestRepoUrl().substring(
+ 0, 1 + getTestRepoUrl().lastIndexOf("/"));
+
+ if (DefaultAuthn.useDeprecated())
+ new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDeprecated(),
+ null, null, null)
+ .openRemoteSession(prefix + "repositorydoesnotexisthere");
+ else
+ new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDefault(),
+ null, null, null)
+ .openRemoteSession(prefix + "repositorydoesnotexisthere");
+ }
+ finally
+ {
+ for(int i = 0; i < 100; i++)
+ {
+ Runtime.getRuntime().gc(); // GC should run finalize
+
+ // Do something
+ byte[] memEater = new byte[1024 * 1024];
+ Arrays.fill(memEater, (byte) i);
+
+ // Do some more javahl activity (this url is OK)
+ final ISVNRemote session = getSession();
+ session.getLatestRevision();
+ session.dispose();
+ }
+ }
+ }
+ catch (ClientException ex)
+ {
+ List<ClientException.ErrorMessage> msgs = ex.getAllMessages();
+ svnErrorCode = msgs.get(msgs.size() - 1).getCode();
+ }
+
+ assertTrue(svnErrorCode == 180001 // file:
+ || svnErrorCode == 210005 // svn:
+ || svnErrorCode == 2); // http:
+ }
+
+ public void testDatedRev() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ long revision = session.getRevisionByDate(new Date());
+ assertEquals(revision, 1);
+ }
+
+ public void testGetLocks() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ Set<String> iotaPathSet = new HashSet<String>(1);
+ String iotaPath = thisTest.getWCPath() + "/iota";
+ iotaPathSet.add(iotaPath);
+
+ client.lock(iotaPathSet, "foo", false);
+
+ Map<String, Lock> locks = session.getLocks("iota", Depth.infinity);
+
+ assertEquals(locks.size(), 1);
+ Lock lock = locks.get("/iota");
+ assertNotNull(lock);
+ assertEquals(lock.getOwner(), "jrandom");
+ }
+
+ public void testCheckPath() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ NodeKind kind = session.checkPath("iota", 1);
+ assertEquals(NodeKind.file, kind);
+
+ kind = session.checkPath("iota", 0);
+ assertEquals(NodeKind.none, kind);
+
+ kind = session.checkPath("A", 1);
+ assertEquals(NodeKind.dir, kind);
+ }
+
+ public void testStat() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ DirEntry dirent = session.stat("iota", 1);
+ assertEquals(NodeKind.file, dirent.getNodeKind());
+
+ dirent = session.stat("iota", 0);
+ assertNull(dirent);
+
+ dirent = session.stat("A", 1);
+ assertEquals(NodeKind.dir, dirent.getNodeKind());
+ }
+
+ private String getTestRepoUrl()
+ {
+ return thisTest.getUrl().toASCIIString();
+ }
+
+ public void testGetLatestRevision() throws Exception
+ {
+ ISVNRemote session = getSession();
+ long revision = session.getLatestRevision();
+ assertEquals(revision, 1);
+ }
+
+ public void testGetUUID() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ /*
+ * Test UUID
+ * TODO: Test for actual UUID once test dump file has
+ * fixed UUID
+ */
+ assertNotNull(session.getReposUUID());
+ }
+
+ public void testGetUrl() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ assertEquals(getTestRepoUrl(), session.getSessionUrl());
+ }
+
+ public void testGetRootUrl() throws Exception
+ {
+ ISVNRemote session = getSession();
+ session.reparent(session.getSessionUrl() + "/A/B/E");
+ assertEquals(getTestRepoUrl(), session.getReposRootUrl());
+ }
+
+ public void testGetUrl_viaSVNClient() throws Exception
+ {
+ ISVNRemote session = client.openRemoteSession(getTestRepoUrl());
+
+ assertEquals(getTestRepoUrl(), session.getSessionUrl());
+ }
+
+ public void testGetUrl_viaSVNClientWorkingCopy() throws Exception
+ {
+ ISVNRemote session = client.openRemoteSession(thisTest.getWCPath());
+
+ assertEquals(getTestRepoUrl(), session.getSessionUrl());
+ }
+
+ public void testReparent() throws Exception
+ {
+ ISVNRemote session = getSession();
+ String newUrl = session.getSessionUrl() + "/A/B/E";
+ session.reparent(newUrl);
+ assertEquals(newUrl, session.getSessionUrl());
+ }
+
+ public void testGetRelativePath() throws Exception
+ {
+ ISVNRemote session = getSession();
+ String baseUrl = session.getSessionUrl() + "/A/B/E";
+ session.reparent(baseUrl);
+
+ String relPath = session.getSessionRelativePath(baseUrl + "/alpha");
+ assertEquals("alpha", relPath);
+
+ relPath = session.getReposRelativePath(baseUrl + "/beta");
+ assertEquals("A/B/E/beta", relPath);
+ }
+
+ public void testGetCommitEditor() throws Exception
+ {
+ ISVNRemote session = getSession();
+ session.getCommitEditor(null, null, null, false);
+ }
+
+ public void testDisposeCommitEditor() throws Exception
+ {
+ ISVNRemote session = getSession();
+ session.getCommitEditor(null, null, null, false);
+ session.dispose();
+ }
+
+ public void testHasCapability() throws Exception
+ {
+ ISVNRemote session = getSession();
+ assert(session.hasCapability(ISVNRemote.Capability.depth));
+ }
+
+ public void testChangeRevpropNoAtomic() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ boolean atomic =
+ session.hasCapability(ISVNRemote.Capability.atomic_revprops);
+
+ if (atomic)
+ return;
+
+ boolean exceptioned = false;
+ try
+ {
+ byte[] oldValue = "bumble".getBytes(UTF8);
+ byte[] newValue = "bee".getBytes(UTF8);
+ session.changeRevisionProperty(1, "svn:author",
+ oldValue, newValue);
+ }
+ catch (IllegalArgumentException ex)
+ {
+ exceptioned = true;
+ }
+ assert(exceptioned);
+ }
+
+ public void testChangeRevpropAtomic() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ boolean atomic =
+ session.hasCapability(ISVNRemote.Capability.atomic_revprops);
+
+ if (!atomic)
+ return;
+
+ byte[] oldValue = client.revProperty(getTestRepoUrl(), "svn:author",
+ Revision.getInstance(1));
+ byte[] newValue = "rayjandom".getBytes(UTF8);
+ try
+ {
+ session.changeRevisionProperty(1, "svn:author",
+ oldValue, newValue);
+ }
+ catch (ClientException ex)
+ {
+ ClientException.ErrorMessage error = null;
+ for (ClientException.ErrorMessage m : ex.getAllMessages())
+ if (!m.isGeneric()) {
+ error = m;
+ break;
+ }
+
+ if (error == null)
+ fail("Failed with no error message");
+
+ if (error.getCode() != 175002 && // SVN_ERR_RA_DAV_REQUEST_FAILED
+ error.getCode() != 165006) // SVN_ERR_REPOS_DISABLED_FEATURE
+ fail(error.getMessage());
+
+ return;
+ }
+
+ byte[] check = client.revProperty(getTestRepoUrl(), "svn:author",
+ Revision.getInstance(1));
+ assertTrue(Arrays.equals(check, newValue));
+ }
+
+ public void testGetRevpropList() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ Map<String, byte[]> proplist = session.getRevisionProperties(1);
+ assertTrue(Arrays.equals(proplist.get("svn:author"),
+ USERNAME.getBytes(UTF8)));
+ }
+
+ public void testGetRevprop() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ byte[] propval = session.getRevisionProperty(1, "svn:author");
+ assertTrue(Arrays.equals(propval, USERNAME.getBytes(UTF8)));
+ }
+
+ public void testGetFile() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ ByteArrayOutputStream contents = new ByteArrayOutputStream();
+ HashMap<String, byte[]> properties = new HashMap<String, byte[]>();
+ properties.put("fakename", "fakecontents".getBytes(UTF8));
+ long fetched_rev =
+ session.getFile(Revision.SVN_INVALID_REVNUM, "A/B/lambda",
+ contents, properties);
+ assertEquals(fetched_rev, 1);
+ assertEquals(contents.toString("UTF-8"),
+ "This is the file 'lambda'.");
+ for (Map.Entry<String, byte[]> e : properties.entrySet()) {
+ final String key = e.getKey();
+ assertTrue(key.startsWith("svn:entry:")
+ || key.startsWith("svn:wc:"));
+ }
+ }
+
+ public void testGetDirectory() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ HashMap<String, DirEntry> dirents = new HashMap<String, DirEntry>();
+ dirents.put("E", null);
+ dirents.put("F", null);
+ dirents.put("lambda", null);
+ HashMap<String, byte[]> properties = new HashMap<String, byte[]>();
+ properties.put("fakename", "fakecontents".getBytes(UTF8));
+ long fetched_rev =
+ session.getDirectory(Revision.SVN_INVALID_REVNUM, "A/B",
+ DirEntry.Fields.all, dirents, properties);
+ assertEquals(fetched_rev, 1);
+ assertEquals(dirents.get("E").getPath(), "E");
+ assertEquals(dirents.get("F").getPath(), "F");
+ assertEquals(dirents.get("lambda").getPath(), "lambda");
+ for (Map.Entry<String, byte[]> e : properties.entrySet()) {
+ final String key = e.getKey();
+ assertTrue(key.startsWith("svn:entry:")
+ || key.startsWith("svn:wc:"));
+ }
+ }
+
+ private static final class CommitContext implements CommitCallback
+ {
+ public final ISVNEditor editor;
+ public CommitContext(ISVNRemote session, String logstr,
+ ISVNEditor.ProvideBaseCallback getBase,
+ ISVNEditor.ProvidePropsCallback getProps,
+ ISVNEditor.GetNodeKindCallback getKind)
+ throws ClientException
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ byte[] log = (logstr == null
+ ? new byte[0]
+ : logstr.getBytes(UTF8));
+ HashMap<String, byte[]> revprops = new HashMap<String, byte[]>();
+ revprops.put("svn:log", log);
+
+ // Run the getCommitEditor overloads through their paces, too.
+ if (getBase == null && getProps == null && getKind == null)
+ editor = session.getCommitEditor(revprops, this, null, false);
+ else
+ editor = session.getCommitEditor(revprops, this, null, false,
+ getBase, getProps, getKind);
+ }
+
+ public CommitContext(ISVNRemote session, String logstr)
+ throws ClientException
+ {
+ this(session, logstr, null, null, null);
+ }
+
+ public void commitInfo(CommitInfo info) { this.info = info; }
+ public long getRevision() { return info.getRevision(); }
+
+ private CommitInfo info;
+ }
+
+ private static final class EditorCallbacks
+ {
+ private final String wcpath;
+ private final long revision;
+ private final Map<String, byte[]> props;
+ private final NodeKind kind;
+
+ public EditorCallbacks(String wcpath, long revision,
+ Map<String, byte[]> props,
+ NodeKind kind)
+ {
+ this.wcpath = wcpath;
+ this.revision = revision;
+ this.props = props;
+ this.kind = kind;
+ }
+
+ public final ISVNEditor.ProvideBaseCallback getBase =
+ new ISVNEditor.ProvideBaseCallback()
+ {
+ public ISVNEditor.ProvideBaseCallback.ReturnValue
+ getContents(String relpath)
+ {
+ try {
+ return new ISVNEditor.ProvideBaseCallback.ReturnValue(
+ new FileInputStream(wcpath + relpath), revision);
+ } catch (java.io.FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+
+ public final ISVNEditor.ProvidePropsCallback getProps =
+ new ISVNEditor.ProvidePropsCallback()
+ {
+ public ISVNEditor.ProvidePropsCallback.ReturnValue
+ getProperties(String relpath)
+ {
+ return new ISVNEditor.ProvidePropsCallback.ReturnValue(
+ props, revision);
+ }
+ };
+
+ public final ISVNEditor.GetNodeKindCallback getKind =
+ new ISVNEditor.GetNodeKindCallback()
+ {
+ public NodeKind getKind(String relpath, long revision)
+ {
+ return kind;
+ }
+ };
+ };
+
+ private void testEditorCopy(EditorCallbacks cb) throws Exception
+ {
+ ISVNRemote session = getSession();
+ CommitContext cc =
+ (cb != null
+ ? new CommitContext(session, "Copy A/B/lambda -> A/B/omega",
+ cb.getBase, cb.getProps, cb.getKind)
+ : new CommitContext(session, "Copy A/B/lambda -> A/B/omega"));
+
+ try {
+ // FIXME: alter dir A/B first
+ cc.editor.copy("A/B/lambda", 1, "A/B/omega",
+ Revision.SVN_INVALID_REVNUM);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ assertEquals(NodeKind.file,
+ session.checkPath("A/B/lambda",
+ Revision.SVN_INVALID_REVNUM));
+ assertEquals(NodeKind.file,
+ session.checkPath("A/B/omega",
+ Revision.SVN_INVALID_REVNUM));
+ }
+
+ public void testEditorCopy() throws Exception
+ {
+ testEditorCopy(null);
+ }
+
+ public void testEditorCopy_WithCallbacks() throws Exception
+ {
+ testEditorCopy(new EditorCallbacks(thisTest.getWCPath(), 1L,
+ new HashMap<String, byte[]>(),
+ NodeKind.file));
+ }
+
+ public void testEditorMove() throws Exception
+ {
+ ISVNRemote session = getSession();
+ CommitContext cc =
+ new CommitContext(session, "Move A/B/lambda -> A/B/omega");
+
+ try {
+ // FIXME: alter dir A/B first
+ cc.editor.move("A/B/lambda", 1, "A/B/omega",
+ Revision.SVN_INVALID_REVNUM);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ assertEquals(NodeKind.none,
+ session.checkPath("A/B/lambda",
+ Revision.SVN_INVALID_REVNUM));
+ assertEquals(NodeKind.file,
+ session.checkPath("A/B/omega",
+ Revision.SVN_INVALID_REVNUM));
+ }
+
+ public void testEditorDelete() throws Exception
+ {
+ ISVNRemote session = getSession();
+ CommitContext cc =
+ new CommitContext(session, "Delete all greek files");
+
+ String[] filePaths = { "iota",
+ "A/mu",
+ "A/B/lambda",
+ "A/B/E/alpha",
+ "A/B/E/beta",
+ "A/D/gamma",
+ "A/D/G/pi",
+ "A/D/G/rho",
+ "A/D/G/tau",
+ "A/D/H/chi",
+ "A/D/H/omega",
+ "A/D/H/psi" };
+
+ try {
+ // FIXME: alter a bunch of dirs first
+ for (String path : filePaths)
+ cc.editor.delete(path, 1);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ for (String path : filePaths)
+ assertEquals(NodeKind.none,
+ session.checkPath(path, Revision.SVN_INVALID_REVNUM));
+ }
+
+ public void testEditorMkdir() throws Exception
+ {
+ ISVNRemote session = getSession();
+ CommitContext cc = new CommitContext(session, "Make hebrew dir");
+
+ try {
+ // FIXME: alter dir . first
+ cc.editor.addDirectory("ALEPH",
+ new ArrayList<String>(),
+ new HashMap<String, byte[]>(),
+ Revision.SVN_INVALID_REVNUM);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ assertEquals(NodeKind.dir,
+ session.checkPath("ALEPH",
+ Revision.SVN_INVALID_REVNUM));
+ }
+
+ private void testEditorSetDirProps(EditorCallbacks cb) throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ byte[] ignoreval = "*.pyc\n.gitignore\n".getBytes(UTF8);
+ byte[] binaryval = new byte[]{(byte)0, (byte)13, (byte)255, (byte)8,
+ (byte)127, (byte)128, (byte)129};
+ HashMap<String, byte[]> props = new HashMap<String, byte[]>();
+ props.put("svn:ignore", ignoreval);
+ props.put("binaryprop", binaryval);
+
+ CommitContext cc =
+ (cb != null
+ ? new CommitContext(session, "Add svn:ignore and binaryprop",
+ cb.getBase, cb.getProps, cb.getKind)
+ : new CommitContext(session, "Add svn:ignore and binaryprop"));
+ try {
+ cc.editor.alterDirectory("", 1, null, props);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ assertTrue(Arrays.equals(ignoreval,
+ client.propertyGet(session.getSessionUrl(),
+ "svn:ignore",
+ Revision.HEAD,
+ Revision.HEAD)));
+ assertTrue(Arrays.equals(binaryval,
+ client.propertyGet(session.getSessionUrl(),
+ "binaryprop",
+ Revision.HEAD,
+ Revision.HEAD)));
+ }
+
+ public void testEditorSetDirProps() throws Exception
+ {
+ testEditorSetDirProps(null);
+ }
+
+ public void testEditorSetDirProps_WithCallbacks() throws Exception
+ {
+ testEditorSetDirProps(new EditorCallbacks(thisTest.getWCPath(), 1L,
+ new HashMap<String, byte[]>(),
+ NodeKind.dir));
+ }
+
+ private static byte[] SHA1(byte[] text) throws NoSuchAlgorithmException
+ {
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ return md.digest(text);
+ }
+
+ public void testEditorAddFile() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ byte[] eolstyle = "native".getBytes(UTF8);
+ HashMap<String, byte[]> props = new HashMap<String, byte[]>();
+ props.put("svn:eol-style", eolstyle);
+
+ byte[] contents = "This is file 'xi'.".getBytes(UTF8);
+ Checksum hash = new Checksum(SHA1(contents), Checksum.Kind.SHA1);
+ ByteArrayInputStream stream = new ByteArrayInputStream(contents);
+
+ CommitContext cc = new CommitContext(session, "Add A/xi");
+ try {
+ // FIXME: alter dir A first
+ cc.editor.addFile("A/xi", hash, stream, props,
+ Revision.SVN_INVALID_REVNUM);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ assertEquals(NodeKind.file,
+ session.checkPath("A/xi",
+ Revision.SVN_INVALID_REVNUM));
+
+ byte[] propval = client.propertyGet(session.getSessionUrl() + "/A/xi",
+ "svn:eol-style",
+ Revision.HEAD,
+ Revision.HEAD);
+ assertTrue(Arrays.equals(eolstyle, propval));
+ }
+
+ public void testEditorDeleteFileProps() throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ client.propertySetRemote(
+ thisTest.getUrl() + "/iota", 1L,
+ "name", "value".getBytes(UTF8),
+ new CommitMessageCallback() {
+ public String getLogMessage(Set<CommitItem> elements) {
+ return "Set property 'name' to 'value'";
+ }
+ }, false, null, null);
+
+ ISVNRemote session = getSession();
+ HashMap<String, byte[]> props = new HashMap<String, byte[]>();
+ assertEquals(2L, session.getFile(Revision.SVN_INVALID_REVNUM, "iota",
+ null, props));
+
+ int propcount = 0;
+ for (Map.Entry<String, byte[]> e : props.entrySet()) {
+ final String key = e.getKey();
+ if (key.startsWith("svn:entry:") || key.startsWith("svn:wc:"))
+ continue;
+ ++propcount;
+ }
+ assertEquals(1, propcount);
+
+ CommitContext cc = new CommitContext(session, "Remove all props");
+ try {
+ props.clear();
+ cc.editor.alterFile("iota", 2L, null, null, props);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(3L, session.getFile(Revision.SVN_INVALID_REVNUM, "iota",
+ null, props));
+ propcount = 0;
+ for (Map.Entry<String, byte[]> e : props.entrySet()) {
+ final String key = e.getKey();
+ if (key.startsWith("svn:entry:") || key.startsWith("svn:wc:"))
+ continue;
+ ++propcount;
+ }
+ assertEquals(0, propcount);
+ }
+
+ private void testEditorSetFileContents(EditorCallbacks cb) throws Exception
+ {
+ Charset UTF8 = Charset.forName("UTF-8");
+ ISVNRemote session = getSession();
+
+ byte[] contents = "This is modified file 'alpha'.".getBytes(UTF8);
+ Checksum hash = new Checksum(SHA1(contents), Checksum.Kind.SHA1);
+ ByteArrayInputStream stream = new ByteArrayInputStream(contents);
+
+ CommitContext cc =
+ (cb != null
+ ? new CommitContext(session, "Change contents of A/B/E/alpha",
+ cb.getBase, cb.getProps, cb.getKind)
+ : new CommitContext(session, "Change contents of A/B/E/alpha"));
+ try {
+ cc.editor.alterFile("A/B/E/alpha", 1, hash, stream, null);
+ cc.editor.complete();
+ } finally {
+ cc.editor.dispose();
+ }
+
+ assertEquals(2, cc.getRevision());
+ assertEquals(2, session.getLatestRevision());
+ ByteArrayOutputStream checkcontents = new ByteArrayOutputStream();
+ client.streamFileContent(session.getSessionUrl() + "/A/B/E/alpha",
+ Revision.HEAD, Revision.HEAD, checkcontents);
+ assertTrue(Arrays.equals(contents, checkcontents.toByteArray()));
+ }
+
+ public void testEditorSetFileContents() throws Exception
+ {
+ testEditorSetFileContents(null);
+ }
+
+ public void testEditorSetFileContents_WithCallbacks() throws Exception
+ {
+ testEditorSetFileContents(new EditorCallbacks(thisTest.getWCPath(), 1L,
+ new HashMap<String, byte[]>(),
+ NodeKind.file));
+ }
+
+ // Sanity check so that we don't forget about unimplemented methods.
+ public void testEditorNotImplemented() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ HashMap<String, byte[]> props = new HashMap<String, byte[]>();
+ // ArrayList<ISVNEditor.RotatePair> rotation =
+ // new ArrayList<ISVNEditor.RotatePair>();
+
+ CommitContext cc = new CommitContext(session, "not implemented");
+ try {
+ String exmsg;
+
+ try {
+ exmsg = "";
+ cc.editor.addSymlink("", "", props, 1);
+ } catch (RuntimeException ex) {
+ exmsg = ex.getMessage();
+ }
+ assertEquals("Not implemented: CommitEditor.addSymlink", exmsg);
+
+ try {
+ exmsg = "";
+ cc.editor.alterSymlink("", 1, "", null);
+ } catch (RuntimeException ex) {
+ exmsg = ex.getMessage();
+ }
+ assertEquals("Not implemented: CommitEditor.alterSymlink", exmsg);
+
+ } finally {
+ cc.editor.dispose();
+ }
+ }
+
+ private static final class LogMsg
+ {
+ public Set<ChangePath> changedPaths;
+ public long revision;
+ public Map<String, byte[]> revprops;
+ public boolean hasChildren;
+ }
+
+ private static final class LogReceiver implements LogMessageCallback
+ {
+ public final ArrayList<LogMsg> logs = new ArrayList<LogMsg>();
+
+ public void singleMessage(Set<ChangePath> changedPaths,
+ long revision,
+ Map<String, byte[]> revprops,
+ boolean hasChildren)
+ {
+ LogMsg msg = new LogMsg();
+ msg.changedPaths = changedPaths;
+ msg.revision = revision;
+ msg.revprops = revprops;
+ msg.hasChildren = hasChildren;
+ logs.add(msg);
+ }
+ }
+
+ public void testGetLog() throws Exception
+ {
+ ISVNRemote session = getSession();
+ LogReceiver receiver = new LogReceiver();
+
+ session.getLog(null,
+ Revision.SVN_INVALID_REVNUM,
+ Revision.SVN_INVALID_REVNUM,
+ 0, false, false, false, null,
+ receiver);
+ assertEquals(1, receiver.logs.size());
+ assertTrue(receiver.logs.get(0).revprops.size() > 0);
+
+ receiver.logs.clear();
+ session.reparent(getTestRepoUrl() + "/A");
+ session.getLog(null,
+ Revision.SVN_INVALID_REVNUM,
+ 0, 0, false, false, false, null,
+ receiver);
+ assertEquals(2, receiver.logs.size());
+ assertTrue(receiver.logs.get(0).revprops.size() > 0);
+ }
+
+ public void testGetLogMissing() throws Exception
+ {
+ ISVNRemote session = getSession();
+ LogReceiver receiver = new LogReceiver();
+
+ ArrayList<String> paths = new ArrayList<String>(1);
+ paths.add("X");
+
+ boolean exception = false;
+ try {
+ session.getLog(paths,
+ Revision.SVN_INVALID_REVNUM,
+ Revision.SVN_INVALID_REVNUM,
+ 0, false, false, false, null,
+ receiver);
+ } catch (ClientException ex) {
+ assertEquals("Filesystem has no item",
+ ex.getAllMessages().get(0).getMessage());
+ exception = true;
+ }
+
+ assertEquals(0, receiver.logs.size());
+ assertTrue(exception);
+ }
+
+ public void testConfigHandler() throws Exception
+ {
+ ConfigEvent handler = new ConfigEvent()
+ {
+ public void onLoad(ISVNConfig cfg)
+ {
+ //System.out.println("config:");
+ onecat(cfg.config());
+ //System.out.println("servers:");
+ onecat(cfg.servers());
+ }
+
+ private void onecat(ISVNConfig.Category cat)
+ {
+ for (String sec : cat.sections()) {
+ //System.out.println(" [" + sec + "]");
+ ISVNConfig.Enumerator en = new ISVNConfig.Enumerator()
+ {
+ public void option(String name, String value)
+ {
+ //System.out.println(" " + name
+ // + " = " + value);
+ }
+ };
+ cat.enumerate(sec, en);
+ }
+ }
+
+ };
+
+ ISVNRemote session;
+ try
+ {
+ if (DefaultAuthn.useDeprecated())
+ session = new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDeprecated(),
+ null, handler, null)
+ .openRemoteSession(getTestRepoUrl());
+ else
+ session = new RemoteFactory(
+ super.conf.getAbsolutePath(),
+ USERNAME, null, // Do not set default password.
+ DefaultAuthn.getDefault(),
+ null, handler, null)
+ .openRemoteSession(getTestRepoUrl());
+ }
+ catch (ClientException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ session.getLatestRevision();
+ }
+
+ private static class RemoteStatusReceiver implements RemoteStatus
+ {
+ static class StatInfo implements Comparable<StatInfo>
+ {
+ public String relpath = null;
+ public char kind = ' '; // F, D, L
+ public boolean textChanged = false;
+ public boolean propsChanged = false;
+ public boolean deleted = false;
+ public Entry info = null;
+
+ StatInfo(String relpath, char kind, boolean added)
+ {
+ this.relpath = relpath;
+ this.kind = kind;
+ this.deleted = !added;
+ }
+
+ StatInfo(String relpath, char kind,
+ boolean textChanged, boolean propsChanged,
+ Entry info)
+ {
+ this.relpath = relpath;
+ this.kind = kind;
+ this.textChanged = textChanged;
+ this.propsChanged = propsChanged;
+ this.info = info;
+ }
+
+ @Override
+ public boolean equals(Object statinfo)
+ {
+ final StatInfo that = (StatInfo)statinfo;
+ return this.relpath.equals(that.relpath);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return this.relpath.hashCode();
+ }
+
+ @Override
+ public int compareTo(StatInfo that)
+ {
+ return this.relpath.compareTo(that.relpath);
+ }
+ }
+
+ private boolean debug;
+
+ public RemoteStatusReceiver()
+ {
+ this.debug = false;
+ }
+
+ public RemoteStatusReceiver(boolean debug)
+ {
+ this.debug = debug;
+ }
+
+ public ArrayList<StatInfo> status = new ArrayList<StatInfo>();
+
+ public void addedDirectory(String relativePath)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: A (dir) " +
+ relativePath);
+ status.add(new StatInfo(relativePath, 'D', true));
+ }
+
+ public void addedFile(String relativePath)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: A (file) "
+ + relativePath);
+ status.add(new StatInfo(relativePath, 'F', true));
+ }
+
+ public void addedSymlink(String relativePath)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: A (link) "
+ + relativePath);
+ status.add(new StatInfo(relativePath, 'L', true));
+ }
+
+ public void modifiedDirectory(String relativePath,
+ boolean childrenModified,
+ boolean propsModified,
+ Entry nodeInfo)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: " +
+ (childrenModified ? 'M' : '_') +
+ (propsModified ? 'M' : '_') +
+ " (dir) " + relativePath);
+ status.add(new StatInfo(relativePath, 'D',
+ childrenModified, propsModified,
+ nodeInfo));
+ }
+
+ public void modifiedFile(String relativePath,
+ boolean textModified,
+ boolean propsModified,
+ Entry nodeInfo)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: " +
+ (textModified ? 'M' : '_') +
+ (propsModified ? 'M' : '_') +
+ " (file) " + relativePath);
+ status.add(new StatInfo(relativePath, 'F',
+ textModified, propsModified,
+ nodeInfo));
+ }
+
+ public void modifiedSymlink(String relativePath,
+ boolean targetModified,
+ boolean propsModified,
+ Entry nodeInfo)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: " +
+ (targetModified ? 'M' : '_') +
+ (propsModified ? 'M' : '_') +
+ " (link) " + relativePath);
+ status.add(new StatInfo(relativePath, 'L',
+ targetModified, propsModified,
+ nodeInfo));
+
+ }
+
+ public void deleted(String relativePath)
+ {
+ if (debug)
+ System.err.println("RemoteStatus: D "
+ + relativePath);
+ status.add(new StatInfo(relativePath, ' ', false));
+ }
+ }
+
+ public void testSimpleStatus() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ RemoteStatusReceiver receiver = new RemoteStatusReceiver();
+ ISVNReporter rp = session.status(null, Revision.SVN_INVALID_REVNUM,
+ Depth.infinity, receiver);
+ try {
+ rp.setPath("", 0, Depth.infinity, true, null);
+ assertEquals(1, rp.finishReport());
+ } finally {
+ rp.dispose();
+ }
+ assertEquals(21, receiver.status.size());
+ session.checkPath("", Revision.SVN_INVALID_REVNUM);
+ }
+
+ public void testTextchangeStatus() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ CommitMessageCallback cmcb = new CommitMessageCallback() {
+ public String getLogMessage(Set<CommitItem> x) {
+ return "Content change on A/B/E/alpha";
+ }
+ };
+
+ File alpha = new File(thisTest.getWorkingCopy(), "A/B/E/alpha");
+ FileOutputStream writer = new FileOutputStream(alpha);
+ writer.write("changed alpha text".getBytes());
+ writer.close();
+ client.commit(thisTest.getWCPathSet(), Depth.infinity, false, false,
+ null, null, cmcb, null);
+
+ RemoteStatusReceiver receiver = new RemoteStatusReceiver();
+ ISVNReporter rp = session.status(null, Revision.SVN_INVALID_REVNUM,
+ Depth.infinity, receiver);
+ try {
+ rp.setPath("", 1, Depth.infinity, false, null);
+ assertEquals(2, rp.finishReport());
+ } finally {
+ rp.dispose();
+ }
+
+ assertEquals(5, receiver.status.size());
+
+ // ra_serf returns the entries in inverted order compared to ra_local.
+ Collections.sort(receiver.status);
+ RemoteStatusReceiver.StatInfo mod = receiver.status.get(4);
+ assertEquals("A/B/E/alpha", mod.relpath);
+ assertEquals('F', mod.kind);
+ assertEquals("Text Changed", true, mod.textChanged);
+ assertEquals("Props Changed", false, mod.propsChanged);
+ assertEquals("Node Deleted", false, mod.deleted);
+ assertEquals(2, mod.info.getCommittedRevision());
+ }
+
+ public void testPropchangeStatus() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ CommitMessageCallback cmcb = new CommitMessageCallback() {
+ public String getLogMessage(Set<CommitItem> x) {
+ return "Property change on A/D/gamma";
+ }
+ };
+ client.propertySetRemote(getTestRepoUrl() + "/A/D/gamma",
+ 1L, "foo", "bar".getBytes(), cmcb,
+ false, null, null);
+
+ RemoteStatusReceiver receiver = new RemoteStatusReceiver();
+ ISVNReporter rp = session.status(null, Revision.SVN_INVALID_REVNUM,
+ Depth.infinity, receiver);
+ try {
+ rp.setPath("", 1, Depth.infinity, false, null);
+ assertEquals(2, rp.finishReport());
+ } finally {
+ rp.dispose();
+ }
+
+ assertEquals(4, receiver.status.size());
+
+ // ra_serf returns the entries in inverted order compared to ra_local.
+ Collections.sort(receiver.status);
+ RemoteStatusReceiver.StatInfo mod = receiver.status.get(3);
+ assertEquals("A/D/gamma", mod.relpath);
+ assertEquals('F', mod.kind);
+ assertEquals("TextChanged", false, mod.textChanged);
+ assertEquals("Props Changed", true, mod.propsChanged);
+ assertEquals("Node Deleted", false, mod.deleted);
+ assertEquals(2, mod.info.getCommittedRevision());
+ }
+
+ public void testDeletedStatus() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ CommitMessageCallback cmcb = new CommitMessageCallback() {
+ public String getLogMessage(Set<CommitItem> x) {
+ return "Delete A/mu";
+ }
+ };
+ HashSet<String> paths = new HashSet<String>(1);
+ paths.add(getTestRepoUrl() + "/A/mu");
+ client.remove(paths, false, false, null, cmcb, null);
+
+ RemoteStatusReceiver receiver = new RemoteStatusReceiver();
+ ISVNReporter rp = session.status(null, Revision.SVN_INVALID_REVNUM,
+ Depth.infinity, receiver);
+ try {
+ rp.setPath("", 1, Depth.infinity, false, null);
+ assertEquals(2, rp.finishReport());
+ } finally {
+ rp.dispose();
+ }
+ assertEquals(3, receiver.status.size());
+
+ // ra_serf returns the entries in inverted order compared to ra_local.
+ Collections.sort(receiver.status);
+ RemoteStatusReceiver.StatInfo mod = receiver.status.get(2);
+ assertEquals("A/mu", mod.relpath);
+ assertEquals(' ', mod.kind);
+ assertEquals(false, mod.textChanged);
+ assertEquals(false, mod.propsChanged);
+ assertEquals(true, mod.deleted);
+ }
+
+ public void testTrivialMergeinfo() throws Exception
+ {
+ ISVNRemote session = getSession();
+ ArrayList<String> paths = new ArrayList<String>(1);
+ paths.add("");
+
+ Map<String, Mergeinfo> catalog =
+ session.getMergeinfo(paths, 1L, Mergeinfo.Inheritance.explicit,
+ false);
+ assertEquals(null, catalog);
+ }
+
+ public void testBranchMergeinfo() throws Exception
+ {
+ CommitMessageCallback cmcb = new CommitMessageCallback() {
+ public String getLogMessage(Set<CommitItem> x) {
+ return "testBranchMergeinfo";
+ }
+ };
+
+ ISVNRemote session = getSession();
+
+ // Create a branch
+ ArrayList<CopySource> dirA = new ArrayList<CopySource>(1);
+ dirA.add(new CopySource(getTestRepoUrl() + "/A",
+ Revision.HEAD, Revision.HEAD));
+ client.copy(dirA, getTestRepoUrl() + "/Abranch",
+ false, false, true, null, cmcb, null);
+
+ // Check mergeinfo on new branch
+ ArrayList<String> paths = new ArrayList<String>(1);
+ paths.add("Abranch");
+ Map<String, Mergeinfo> catalog =
+ session.getMergeinfo(paths, 2L, Mergeinfo.Inheritance.explicit,
+ false);
+ assertEquals(null, catalog);
+
+ // Modify source and merge to branch
+ client.propertySetRemote(getTestRepoUrl() + "/A/D/gamma",
+ 2L, "foo", "bar".getBytes(), cmcb,
+ false, null, null);
+ client.update(thisTest.getWCPathSet(), Revision.HEAD, Depth.infinity,
+ false, false, true, false);
+ client.merge(getTestRepoUrl() + "/A", Revision.HEAD, null,
+ thisTest.getWCPath() + "/Abranch", false, Depth.infinity,
+ false, false, false, false);
+ client.commit(thisTest.getWCPathSet(), Depth.infinity, false, false,
+ null, null, cmcb, null);
+
+ // Check inherited mergeinfo on updated branch
+ paths.set(0, "Abranch/mu");
+ catalog = session.getMergeinfo(paths, 4L,
+ Mergeinfo.Inheritance.nearest_ancestor,
+ false);
+ assertEquals(1, catalog.size());
+ List<RevisionRange> ranges =
+ catalog.get("Abranch/mu").getRevisions("/A/mu");
+ assertEquals(1, ranges.size());
+ assertEquals("1-3", ranges.get(0).toString());
+ }
+
+ public void testGetLocations() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ Long expected = new Long(1L);
+ ArrayList<Long> revs = new ArrayList<Long>(3);
+ revs.add(new Long(0L));
+ revs.add(expected);
+
+ Map<Long, String> locs = session.getLocations("A", 1, revs);
+
+ assertEquals(1, locs.size());
+ assertTrue(locs.containsKey(expected));
+ assertEquals("/A", locs.get(expected));
+ }
+
+ public void testGetLocationSegments() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ List<ISVNRemote.LocationSegment> result =
+ session.getLocationSegments("A", 1,
+ Revision.SVN_INVALID_REVNUM,
+ Revision.SVN_INVALID_REVNUM);
+ assertEquals(1, result.size());
+ ISVNRemote.LocationSegment seg = result.get(0);
+ assertEquals("A", seg.getPath());
+ assertEquals(1, seg.getStartRevision());
+ assertEquals(1, seg.getEndRevision());
+ }
+
+ public void testGetFileRevisions() throws Exception
+ {
+ ISVNRemote session = getSession();
+
+ List<ISVNRemote.FileRevision> result =
+ session.getFileRevisions("iota", 0, 1, true);
+ assertEquals(1, result.size());
+ ISVNRemote.FileRevision rev = result.get(0);
+ assertEquals("/iota", rev.getPath());
+ assertFalse(rev.isResultOfMerge());
+ assertTrue(rev.hasTextDelta());
+ }
+
+ // This test is a result of a threading bug that was identified in
+ // serf-1.3.2 and earlier. The net result was that opening two RA
+ // sessions to an https:// URL in two parallel threads would cause
+ // a crash in serf, due to the OpenSSL library not being
+ // initialized in a single-threaded context.
+ //
+ // The problem does not appear to exist with other RA methods, but
+ // the test is here just in case someone is actually pedantic
+ // enough to test JavaHL with an HTTPS setup.
+ public void testParallelOpen() throws Exception
+ {
+ final Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ ISVNRemote session = null;
+ try {
+ session = getSession();
+ assertEquals(1, session.getLatestRevision());
+ }
+ catch (ClientException ex) {
+ throw new RuntimeException(ex);
+ }
+ finally {
+ if (session != null)
+ session.dispose();
+ }
+ }
+ };
+
+ Thread thread1 = new Thread(runnable);
+ Thread thread2 = new Thread(runnable);
+
+ thread1.start();
+ thread2.start();
+
+ thread1.join();
+ thread2.join();
+ }
+}
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java
index 5171218..dcee0ff 100644
--- a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java
@@ -26,6 +26,7 @@ import org.apache.subversion.javahl.callback.*;
import org.apache.subversion.javahl.types.*;
import java.io.File;
+import java.io.FileWriter;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.InputStream;
@@ -79,12 +80,107 @@ public class SVNReposTests extends SVNTests
public void testVerify()
throws SubversionException, IOException
{
- OneTest thisTest = new OneTest(false);
+ OneTest thisTest = new OneTest(false, true);
admin.verify(thisTest.getRepository(), Revision.getInstance(0),
Revision.HEAD, null);
}
- /* This test only tests the call down to the C++ layer. */
+ private class VerifyCallback implements ReposVerifyCallback
+ {
+ public int mderr = 0;
+ public int reverr = 0;
+ public boolean keepGoing = false;
+
+ public void onVerifyError(long revision, ClientException verifyError)
+ throws ClientException
+ {
+ if (revision == Revision.SVN_INVALID_REVNUM) {
+ ++mderr;
+ }
+ else {
+ ++reverr;
+ }
+ if (keepGoing) {
+ return;
+ }
+ else {
+ throw verifyError;
+ }
+ }
+
+ }
+
+ private boolean tryToBreakRepo(OneTest test) throws IOException
+ {
+ File repo = test.getRepository();
+
+ // Check for a sharded repo first
+ File rev1 = new File(repo, "db/revs/0/1");
+ if (!rev1.exists() || !rev1.setWritable(true))
+ {
+ // Try non-sharded
+ rev1 = new File(repo, "db/revs/1");
+ }
+ if (!rev1.exists() || !rev1.setWritable(true))
+ return false;
+
+ FileWriter fd = new FileWriter(rev1);
+ fd.write("inserting junk to corrupt the rev");
+ fd.close();
+ return true;
+ }
+
+ public void testVerifyBrokenRepo() throws Throwable
+ {
+ OneTest thisTest = new OneTest(false, true);
+
+ if (!tryToBreakRepo(thisTest)) {
+ // We don't support the repos format
+ System.err.print("Cannot break repository for verify test.");
+ return;
+ }
+
+ VerifyCallback cb = new VerifyCallback();
+ cb.keepGoing = false;
+
+ try {
+ admin.verify(thisTest.getRepository(),
+ Revision.getInstance(0),
+ Revision.HEAD,
+ false, false, null, cb);
+ }
+ catch(ClientException ex) {
+ assertEquals(cb.mderr, 1);
+ assertEquals(cb.reverr, 0);
+ return;
+ }
+
+ assert("Verify did not catch repository corruption." == "");
+ }
+
+ public void testVerifyBrokenRepo_KeepGoing() throws Throwable
+ {
+ OneTest thisTest = new OneTest(false, true);
+
+ if (!tryToBreakRepo(thisTest)) {
+ // We don't support the repos format
+ System.err.print("Cannot break repository for verify test.");
+ return;
+ }
+
+ VerifyCallback cb = new VerifyCallback();
+ cb.keepGoing = true;
+
+ admin.verify(thisTest.getRepository(),
+ Revision.getInstance(0),
+ Revision.HEAD,
+ false, false, null, cb);
+
+ assertEquals(cb.mderr, 1);
+ assertEquals(cb.reverr, 1);
+ }
+
+ /* this test only tests the call down to the C++ layer. */
public void testUpgrade()
throws SubversionException, IOException
{
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
index dd79925..885c6c5 100644
--- a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
@@ -173,7 +173,18 @@ class SVNTests extends TestCase
private void init()
{
- // if not already set, get a usefull value for rootDir
+ String disableCredStore = System.getProperty("test.disablecredstore");
+ if (disableCredStore != null)
+ {
+ try {
+ SVNUtil.disableNativeCredentialsStore();
+ } catch(Throwable ex) {
+ System.err.println("*** ERROR: Could not disable" +
+ " the native credentials store");
+ }
+ }
+
+ // if not already set, get a useful value for rootDir
if (rootDirectoryName == null)
rootDirectoryName = System.getProperty("test.rootdir");
if (rootDirectoryName == null)
@@ -246,10 +257,11 @@ class SVNTests extends TestCase
greekRepos = new File(localTmp, "repos");
greekDump = new File(localTmp, "greek_dump");
admin.create(greekRepos, true,false, null, this.fsType);
- addExpectedCommitItem(greekFiles.getAbsolutePath(), null, null,
- NodeKind.none, CommitItemStateFlags.Add);
+ addExpectedCommitItem(greekFiles.getAbsolutePath(),
+ makeReposUrl(greekRepos).toString(), null,
+ NodeKind.dir, CommitItemStateFlags.Add);
client.doImport(greekFiles.getAbsolutePath(),
- makeReposUrl(greekRepos).toString(),
+ makeReposUrl(greekRepos).toString(),
Depth.infinity, false, false, null,
new MyCommitMessage(), null);
admin.dump(greekRepos, new FileOutputStream(greekDump),
@@ -285,66 +297,140 @@ class SVNTests extends TestCase
{
this.client = new SVNClient();
this.client.notification2(new MyNotifier());
- this.client.setPrompt(new DefaultPromptUserPassword());
+ if (DefaultAuthn.useDeprecated())
+ this.client.setPrompt(DefaultAuthn.getDeprecated());
+ else
+ this.client.setPrompt(DefaultAuthn.getDefault());
this.client.username(USERNAME);
this.client.setProgressCallback(new DefaultProgressListener());
this.client.setConfigDirectory(this.conf.getAbsolutePath());
this.expectedCommitItems = new HashMap<String, MyCommitItem>();
}
/**
- * the default prompt : never prompts the user, provides defaults answers
+ * the default prompts : never prompt the user, provide default answers
*/
- protected static class DefaultPromptUserPassword implements UserPasswordCallback
+ protected static class DefaultAuthn
{
-
- public int askTrustSSLServer(String info, boolean allowPermanently)
+ public static boolean useDeprecated()
{
- return UserPasswordCallback.AcceptTemporary;
+ String prop = System.getProperty("test.authn.deprecated");
+ return (prop != null && !prop.isEmpty());
}
- public String askQuestion(String realm, String question, boolean showAnswer)
+ public static AuthnCallback getDefault()
{
- return "";
+ return new DefaultAuthnCallback();
}
- public boolean askYesNo(String realm, String question, boolean yesIsDefault)
+ @SuppressWarnings("deprecation")
+ public static UserPasswordCallback getDeprecated()
{
- return yesIsDefault;
+ return new DeprecatedAuthnCallback();
}
- public String getPassword()
+ private static class DefaultAuthnCallback
+ implements AuthnCallback
{
- return PASSWORD;
- }
+ public UsernameResult
+ usernamePrompt(String realm, boolean maySave)
+ {
+ return new UsernameResult(USERNAME);
+ }
- public String getUsername()
- {
- return USERNAME;
- }
+ public UserPasswordResult
+ userPasswordPrompt(String realm, String username,
+ boolean maySave)
+ {
+ return new UserPasswordResult(USERNAME, PASSWORD);
+ }
- public boolean prompt(String realm, String username)
- {
- return false;
- }
+ public SSLServerTrustResult
+ sslServerTrustPrompt(String realm,
+ SSLServerCertFailures failures,
+ SSLServerCertInfo info,
+ boolean maySave)
+ {
+ return SSLServerTrustResult.acceptTemporarily();
+ }
- public boolean prompt(String realm, String username, boolean maySave)
- {
- return false;
- }
+ public SSLClientCertResult
+ sslClientCertPrompt(String realm, boolean maySave)
+ {
+ return null;
+ }
- public String askQuestion(String realm, String question,
- boolean showAnswer, boolean maySave)
- {
- return "";
+ public SSLClientCertPassphraseResult
+ sslClientCertPassphrasePrompt(String realm, boolean maySave)
+ {
+ return null;
+ }
+
+ public boolean allowStorePlaintextPassword(String realm)
+ {
+ return false;
+ }
+
+ public boolean allowStorePlaintextPassphrase(String realm)
+ {
+ return false;
+ }
}
- public boolean userAllowedSave()
+ @SuppressWarnings("deprecation")
+ private static class DeprecatedAuthnCallback
+ implements UserPasswordCallback
{
- return false;
+ public int askTrustSSLServer(String info, boolean allowPermanently)
+ {
+ return UserPasswordCallback.AcceptTemporary;
+ }
+
+ public String askQuestion(String realm, String question,
+ boolean showAnswer)
+ {
+ return "";
+ }
+
+ public boolean askYesNo(String realm, String question,
+ boolean yesIsDefault)
+ {
+ return yesIsDefault;
+ }
+
+ public String getPassword()
+ {
+ return PASSWORD;
+ }
+
+ public String getUsername()
+ {
+ return USERNAME;
+ }
+
+ public boolean prompt(String realm, String username)
+ {
+ return true;
+ }
+
+ public boolean prompt(String realm, String username, boolean maySave)
+ {
+ return true;
+ }
+
+ public String askQuestion(String realm, String question,
+ boolean showAnswer, boolean maySave)
+ {
+ return "";
+ }
+
+ public boolean userAllowedSave()
+ {
+ return false;
+ }
}
}
- private static class DefaultProgressListener implements ProgressCallback
+ protected static class DefaultProgressListener implements ProgressCallback
{
public void onProgress(ProgressEvent event)
@@ -782,7 +868,8 @@ class SVNTests extends TestCase
{
MyStatusCallback statusCallback = new MyStatusCallback();
client.status(workingCopy.getAbsolutePath(), Depth.unknown,
- checkRepos, true, true, false, null, statusCallback);
+ checkRepos, false, true, true, false, false,
+ null, statusCallback);
wc.check(statusCallback.getStatusArray(),
workingCopy.getAbsolutePath(), checkRepos);
}
@@ -916,7 +1003,7 @@ class SVNTests extends TestCase
public Status[] getStatusArray()
{
- return (Status[]) statuses.toArray(new Status[statuses.size()]);
+ return statuses.toArray(new Status[statuses.size()]);
}
}
}
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
new file mode 100644
index 0000000..6ddba91
--- /dev/null
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
@@ -0,0 +1,807 @@
+/**
+ * @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
+ */
+
+package org.apache.subversion.javahl;
+
+import org.apache.subversion.javahl.types.ExternalItem;
+import org.apache.subversion.javahl.types.NodeKind;
+import org.apache.subversion.javahl.types.Revision;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Tests the JavaHL SVNUtil APIs.
+ */
+public class UtilTests extends SVNTests
+{
+ private final static String NL = System.getProperty("line.separator");
+
+ /**
+ * Base name of all our tests.
+ */
+ public final static String testName = "util_test";
+
+ public UtilTests()
+ {
+ init();
+ }
+
+ public UtilTests(String name)
+ {
+ super(name);
+ init();
+ }
+
+ /**
+ * Initialize the testBaseName and the testCounter, if this is the
+ * first test of this class.
+ */
+ private void init()
+ {
+ if (!testName.equals(testBaseName))
+ {
+ testCounter = 0;
+ testBaseName = testName;
+ }
+ }
+
+ private final byte[] fileContentsPrefix = "1\n2\n3\n4\n".getBytes();
+ private final byte[] fileContentsSuffix = "N-3\nN-2\nN-1\nN\n".getBytes();
+
+ private void writeFileContents(File file, String contents) throws Throwable
+ {
+ FileOutputStream out = new FileOutputStream(file);
+ out.write(fileContentsPrefix);
+ out.write(contents.getBytes());
+ out.write(fileContentsSuffix);
+ out.close();
+ }
+
+ public void testFileDiff() throws Throwable
+ {
+ File original = File.createTempFile("merge", ".original", localTmp);
+ File modified = File.createTempFile("merge", ".modified", localTmp);
+
+ writeFileContents(original, "\noriginal\n\n");
+ writeFileContents(modified, "\nmodified\n\n");
+
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ boolean diffs = SVNUtil.fileDiff(original.getAbsolutePath(),
+ modified.getAbsolutePath(),
+ null, "original", "modified", "UTF-8",
+ null, result);
+ assertTrue(diffs);
+
+ final byte[] expected = ("--- original" + NL +
+ "+++ modified" + NL +
+ "@@ -3,7 +3,7 @@" + NL +
+ " 3\n 4\n \n" +
+ "-original\n" +
+ "+modified\n" +
+ " \n N-3\n N-2\n").getBytes();
+ assertTrue(Arrays.equals(expected, result.toByteArray()));
+ }
+
+ public void testFileMerge() throws Throwable
+ {
+ File original = File.createTempFile("merge", ".original", localTmp);
+ File modified = File.createTempFile("merge", ".modified", localTmp);
+ File latest = File.createTempFile("merge", ".latest", localTmp);
+
+ writeFileContents(original, "\noriginal\n\n");
+ writeFileContents(modified, "\nmodified\n\n");
+ writeFileContents(latest, "\nlatest\n\n");
+
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ boolean conflicts = SVNUtil.fileMerge(original.getAbsolutePath(),
+ modified.getAbsolutePath(),
+ latest.getAbsolutePath(),
+ null,
+ "||||||| base",
+ "<<<<<<< branch",
+ ">>>>>>> local",
+ "=======",
+ SVNUtil.ConflictDisplayStyle.modified_original_latest,
+ result);
+ assertTrue(conflicts);
+
+ final byte[] expected = ("1\n2\n3\n4\n\n" +
+ "<<<<<<< branch\n" +
+ "modified\n" +
+ "||||||| base\n" +
+ "original\n" +
+ "=======\n" +
+ "latest\n" +
+ ">>>>>>> local\n" +
+ "\nN-3\nN-2\nN-1\nN\n").getBytes();
+ assertTrue(Arrays.equals(expected, result.toByteArray()));
+ }
+
+ public void testValidateProp() throws Throwable
+ {
+ File temp = File.createTempFile("propcheck", ".file", localTmp);
+ FileOutputStream out = new FileOutputStream(temp);
+ out.write("normal text\n".getBytes());
+ out.close();
+
+ byte[] prop = SVNUtil.canonicalizeNodeProperty(
+ "svn:eol-style", " native".getBytes(),
+ "propcheck.file", NodeKind.file,
+ "text/plain");
+ assertEquals("native", new String(prop));
+
+ prop = SVNUtil.canonicalizeNodeProperty(
+ "svn:eol-style", " native ".getBytes(),
+ "propcheck.file", NodeKind.file,
+ "text/plain", new FileInputStream(temp));
+ assertEquals("native", new String(prop));
+
+ boolean caught_exception = false;
+ try {
+ prop = SVNUtil.canonicalizeNodeProperty(
+ "svn:eol-style", " weird ".getBytes(),
+ "propcheck.file", NodeKind.file,
+ "text/plain");
+ } catch (ClientException ex) {
+ assertEquals("Unrecognized line ending style",
+ ex.getAllMessages().get(0).getMessage());
+ caught_exception = true;
+ }
+ assertTrue(caught_exception);
+
+ out = new FileOutputStream(temp);
+ out.write("inconsistent\r\ntext\n".getBytes());
+ out.close();
+
+ caught_exception = false;
+ try {
+ prop = SVNUtil.canonicalizeNodeProperty(
+ "svn:eol-style", " native ".getBytes(),
+ "propcheck.file", NodeKind.file,
+ "text/plain", new FileInputStream(temp));
+ } catch (ClientException ex) {
+ assertEquals("Inconsistent line ending style",
+ ex.getAllMessages().get(2).getMessage());
+ caught_exception = true;
+ }
+ assertTrue(caught_exception);
+ }
+
+
+ private static List<ExternalItem> externals = null;
+ static {
+ try {
+ externals = new ArrayList<ExternalItem>(25);
+ externals.add(new ExternalItem("a", "http://server/repo/path",
+ null, null));
+ externals.add(new ExternalItem("b", "//server/repo/path",
+ null, null));
+ externals.add(new ExternalItem("c", "/repo/path",
+ null, null));
+ externals.add(new ExternalItem("d", "^/path",
+ null, null));
+ externals.add(new ExternalItem("e", "^/../oper/path",
+ null, null));
+
+ externals.add(new ExternalItem("f", "http://server/repo/path",
+ Revision.getInstance(42), null));
+ externals.add(new ExternalItem("g", "//server/repo/path",
+ Revision.getInstance(42), null));
+ externals.add(new ExternalItem("h", "/repo/path",
+ Revision.getInstance(42), null));
+ externals.add(new ExternalItem("j", "^/path",
+ Revision.getInstance(42), null));
+ externals.add(new ExternalItem("j", "^/../oper/path",
+ Revision.getInstance(42), null));
+
+ externals.add(new ExternalItem("k", "http://server/repo/path",
+ null, Revision.getInstance(42)));
+ externals.add(new ExternalItem("l", "//server/repo/path",
+ null, Revision.getInstance(42)));
+ externals.add(new ExternalItem("m", "/repo/path",
+ null, Revision.getInstance(42)));
+ externals.add(new ExternalItem("n", "^/path",
+ null, Revision.getInstance(42)));
+ externals.add(new ExternalItem("o", "^/../oper/path",
+ null, Revision.getInstance(42)));
+
+ externals.add(new ExternalItem("p", "http://server/repo/path",
+ Revision.getInstance(69),
+ Revision.getInstance(71)));
+ externals.add(new ExternalItem("q", "//server/repo/path",
+ Revision.getInstance(69),
+ Revision.getInstance(71)));
+ externals.add(new ExternalItem("r", "/repo/path",
+ Revision.getInstance(69),
+ Revision.getInstance(71)));
+ externals.add(new ExternalItem("s", "^/path",
+ Revision.getInstance(69),
+ Revision.getInstance(71)));
+ externals.add(new ExternalItem("t", "^/../oper/path",
+ Revision.getInstance(69),
+ Revision.getInstance(71)));
+
+ externals.add(new ExternalItem("u", "http://server/repo/path",
+ Revision.getInstance(42),
+ Revision.getInstance(42)));
+ externals.add(new ExternalItem("v", "//server/repo/path",
+ Revision.getInstance(42),
+ Revision.getInstance(42)));
+ externals.add(new ExternalItem("w", "/repo/path",
+ Revision.getInstance(42),
+ Revision.getInstance(42)));
+ externals.add(new ExternalItem("x", "^/path",
+ Revision.getInstance(42),
+ Revision.getInstance(42)));
+ externals.add(new ExternalItem("y", "^/../oper/path",
+ Revision.getInstance(42),
+ Revision.getInstance(42)));
+ } catch (SubversionException ex) {
+ externals = null;
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private static final byte[] externals_propval =
+ ("http://server/repo/path a\n" +
+ "//server/repo/path b\n" +
+ "/repo/path c\n" +
+ "^/path d\n" +
+ "^/../oper/path e\n" +
+ "-r42 http://server/repo/path f\n" +
+ "-r42 //server/repo/path g\n" +
+ "-r42 /repo/path h\n" +
+ "-r42 ^/path j\n" +
+ "-r42 ^/../oper/path j\n" +
+ "http://server/repo/path@42 k\n" +
+ "//server/repo/path@42 l\n" +
+ "/repo/path@42 m\n" +
+ "^/path@42 n\n" +
+ "^/../oper/path@42 o\n" +
+ "-r69 http://server/repo/path@71 p\n" +
+ "-r69 //server/repo/path@71 q\n" +
+ "-r69 /repo/path@71 r\n" +
+ "-r69 ^/path@71 s\n" +
+ "-r69 ^/../oper/path@71 t\n" +
+ "http://server/repo/path@42 u\n" +
+ "//server/repo/path@42 v\n" +
+ "/repo/path@42 w\n" +
+ "^/path@42 x\n" +
+ "^/../oper/path@42 y\n").getBytes();
+
+ private static List<ExternalItem> old_externals = null;
+ static {
+ try {
+ old_externals = new ArrayList<ExternalItem>(3);
+ old_externals.add(new ExternalItem("X", "http://server/repo/path",
+ null, null));
+ old_externals.add(new ExternalItem("Y", "http://server/repo/path",
+ null, Revision.getInstance(42)));
+
+ old_externals.add(new ExternalItem("Z", "http://server/repo/path",
+ null, Revision.getInstance(new Date(0L))));
+ } catch (SubversionException ex) {
+ old_externals = null;
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private static final byte[] old_externals_propval =
+ ("X http://server/repo/path\n" +
+ "Y -r42 http://server/repo/path\n" +
+ "Z -r{1970-01-01T00:00:00.000000Z} http://server/repo/path\n").getBytes();
+
+ private static void compare_item_lists(List<ExternalItem> a,
+ List<ExternalItem> b,
+ String list_name)
+ {
+ final int length = a.size();
+ assertEquals(length, b.size());
+ for (int i = 0; i < length; ++i)
+ assertTrue("Items in " + list_name + " at index " + i + " differ",
+ a.get(i).equals(b.get(i)));
+ }
+
+ public void testParseExternals() throws Throwable
+ {
+ List<ExternalItem> items;
+
+ items = SVNUtil.parseExternals(externals_propval, "dirname", false);
+ compare_item_lists(items, externals, "externals");
+
+ items = SVNUtil.parseExternals(old_externals_propval, "dirname", false);
+ compare_item_lists(items, old_externals, "old_externals");
+ }
+
+ public void testUnparseExternals() throws Throwable
+ {
+ byte[] props = SVNUtil.unparseExternals(externals, "dirname");
+ assertTrue(Arrays.equals(externals_propval, props));
+ }
+
+ public void testUnparseExternalsOldstyle() throws Throwable
+ {
+ byte[] props;
+
+ props = SVNUtil.unparseExternalsForAncientUnsupportedClients(
+ old_externals, "dirname");
+ assertTrue(Arrays.equals(old_externals_propval, props));
+
+ // The fancy new features are not supported in the old format
+ boolean caught_exception = false;
+ try {
+ props = SVNUtil.unparseExternalsForAncientUnsupportedClients(
+ externals, "dirname");
+ } catch (SubversionException ex) {
+ caught_exception = true;
+ }
+ assertTrue(caught_exception);
+ }
+
+ public void testResolveExternalsUrl() throws Throwable
+ {
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "http://a/b/c/", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "^/b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "../b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "/b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "//a/b/c", null, null),
+ "http://a", "http://a/b"));
+ }
+
+ public void testBuildKeywords() throws Throwable
+ {
+ final byte[] kwval = "Id TEST=%H%_%b%_%u".getBytes();
+
+ Map<String, byte[]> result;
+
+ result = SVNUtil.buildKeywords(kwval, Revision.SVN_INVALID_REVNUM,
+ null, null, null, null);
+ assertEquals(" ", new String(result.get("Id")));
+ assertEquals(" ", new String(result.get("TEST")));
+
+ result = SVNUtil.buildKeywords(kwval, 42, "http://a/b/c",
+ "http://a", new Date(1), "X");
+ assertEquals("c 42 1970-01-01 00:00:00Z X",
+ new String(result.get("Id")));
+ assertEquals("b/c 42 1970-01-01 00:00:00Z X c http://a/b/c",
+ new String(result.get("TEST")));
+ }
+
+ public void testTranslateStream() throws Throwable
+ {
+ final byte[] keywordsValue = "Id TEST=%H%_%b%_%u".getBytes();
+ final byte[] contentsContracted = "$Id$\n$TEST$\n".getBytes();
+ final byte[] contentsExpanded =
+ ("$Id: c 42 1970-01-01 00:00:00Z X $\r" +
+ "$TEST: b/c 42 1970-01-01 00:00:00Z X c http://a/b/c $\r"
+ ) .getBytes();
+ final Map<String, byte[]> keywords =
+ SVNUtil.buildKeywords(keywordsValue, 42, "http://a/b/c",
+ "http://a", new Date(1), "X");
+ final Map<String, byte[]> null_keywords = new HashMap<String, byte[]>();
+ byte[] buffer = new byte[1024];
+
+ for (Map.Entry<String, byte[]> e : keywords.entrySet())
+ null_keywords.put(e.getKey(), null);
+
+ // InputStream; expand
+ InputStream testin = null;
+ try {
+ testin = SVNUtil.translateStream(
+ new ByteArrayInputStream(contentsContracted),
+ SVNUtil.EOL_CR, true, keywords, true);
+ final int size = testin.read(buffer);
+ testin.close();
+ testin = null;
+
+ assertEquals("expand InputStream with concrete keywords",
+ new String(contentsExpanded),
+ new String(buffer, 0, size));
+ } finally {
+ if (testin != null) {
+ testin.close();
+ testin = null;
+ }
+ }
+
+ try {
+ testin = SVNUtil.translateStream(
+ new ByteArrayInputStream(contentsContracted),
+ SVNUtil.EOL_CR, true, true,
+ keywordsValue, 42, "http://a/b/c",
+ "http://a", new Date(1), "X");
+ final int size = testin.read(buffer);
+ testin.close();
+ testin = null;
+
+ assertEquals("expand InputStream with implied keywords",
+ new String(contentsExpanded),
+ new String(buffer, 0, size));
+ } finally {
+ if (testin != null) {
+ testin.close();
+ testin = null;
+ }
+ }
+
+ // InputStream; contract
+ try {
+ testin = SVNUtil.translateStream(
+ new ByteArrayInputStream(contentsExpanded),
+ SVNUtil.EOL_LF, true, null_keywords, false);
+ final int size = testin.read(buffer);
+ testin.close();
+ testin = null;
+
+ assertEquals("contract InputStream with concrete keywords",
+ new String(contentsContracted),
+ new String(buffer, 0, size));
+ } finally {
+ if (testin != null) {
+ testin.close();
+ testin = null;
+ }
+ }
+
+ try {
+ testin = SVNUtil.translateStream(
+ new ByteArrayInputStream(contentsExpanded),
+ SVNUtil.EOL_LF, true, false,
+ keywordsValue, 0, "", "", new Date(1), "");
+ final int size = testin.read(buffer);
+ testin.close();
+ testin = null;
+
+ assertEquals("contract InputStream with implied keywords",
+ new String(contentsContracted),
+ new String(buffer, 0, size));
+ } finally {
+ if (testin != null) {
+ testin.close();
+ testin = null;
+ }
+ }
+
+
+ // OutputStream; expand
+ OutputStream testout = null;
+ try {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ testout = SVNUtil.translateStream(
+ result, SVNUtil.EOL_CR, true, keywords, true);
+ testout.write(contentsContracted);
+ testout.close();
+ testout = null;
+
+ assertEquals("expand OutputStream with concrete keywords",
+ new String(contentsExpanded), result.toString());
+ } finally {
+ if (testout != null) {
+ testout.close();
+ testout = null;
+ }
+ }
+
+ try {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ testout = SVNUtil.translateStream(
+ result, SVNUtil.EOL_CR, true, true,
+ keywordsValue, 42, "http://a/b/c",
+ "http://a", new Date(1), "X");
+ testout.write(contentsContracted);
+ testout.close();
+ testout = null;
+
+ assertEquals("expand OutputStream with implied keywords",
+ new String(contentsExpanded), result.toString());
+ } finally {
+ if (testout != null) {
+ testout.close();
+ testout = null;
+ }
+ }
+
+ // OutputStream; contract
+ try {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ testout = SVNUtil.translateStream(
+ result, SVNUtil.EOL_LF, true, null_keywords, false);
+ testout.write(contentsExpanded);
+ testout.close();
+ testout = null;
+
+ assertEquals("contract OutputStream with concrete keywords",
+ new String(contentsContracted), result.toString());
+ } finally {
+ if (testout != null) {
+ testout.close();
+ testout = null;
+ }
+ }
+
+ try {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ testout = SVNUtil.translateStream(
+ result, SVNUtil.EOL_LF, true, false,
+ keywordsValue, 0, "", "", new Date(1), "");
+ testout.write(contentsExpanded);
+ testout.close();
+ testout = null;
+
+ assertEquals("contract OutputStream with implied keywords",
+ new String(contentsContracted), result.toString());
+ } finally {
+ if (testout != null) {
+ testout.close();
+ testout = null;
+ }
+ }
+ }
+
+
+ // Credentials definitions for testing the credentials utilities
+ private static final String util_cred_hash =
+ "4d7de6b1e103fbfc5e61565223ca23be";
+
+ private static final String util_cred_username =
+ "K 8\n" +
+ "username\n" +
+ "V 5\n" +
+ "mungo\n" +
+ "K 15\n" +
+ "svn:realmstring\n" +
+ "V 27\n" +
+ "https://svn.example.com:443\n" +
+ "END\n";
+
+ private static final String util_cred_simple =
+ "K 8\n" +
+ "passtype\n" +
+ "V 10\n" +
+ "javahltest\n" +
+ "K 8\n" +
+ "username\n" +
+ "V 5\n" +
+ "mungo\n" +
+ "K 8\n" +
+ "password\n" +
+ "V 6\n" +
+ "secret\n" +
+ "K 15\n" +
+ "svn:realmstring\n" +
+ "V 27\n" +
+ "https://svn.example.com:443\n" +
+ "END\n";
+
+ private static final String util_cred_ssl_server =
+ "K 10\n" +
+ "ascii_cert\n" +
+ "V 1616\n" +
+ "MIIEtzCCA5+gAwIBAgIQWGBOrapkezd+BWVsAtmtmTANBgkqhkiG9w0BAQsFADA8" +
+ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMuMRYwFAYDVQQDEw1U" +
+ "aGF3dGUgU1NMIENBMB4XDTE0MDQxMTAwMDAwMFoXDTE2MDQwNzIzNTk1OVowgYsx" +
+ "CzAJBgNVBAYTAlVTMREwDwYDVQQIEwhNYXJ5bGFuZDEUMBIGA1UEBxQLRm9yZXN0" +
+ "IEhpbGwxIzAhBgNVBAoUGkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uMRcwFQYD" +
+ "VQQLFA5JbmZyYXN0cnVjdHVyZTEVMBMGA1UEAxQMKi5hcGFjaGUub3JnMIIBIjAN" +
+ "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Tq4mH+stRoxe4xth8tUCgLt+P4L" +
+ "D/JWZz4a2IecaaAk57vIlTxEyP16fUShUfxVJnD0KV11zv2qaEUXNaA6hKd4H/oB" +
+ "u2OyGev+quRM+aFCjWqASkXt7fLGsIkHAwP3XwBVBpARbcXJeCjCBxqaYrQqS8LT" +
+ "wfPUD9eYncGlQ+ixb3Bosy7TmkWKeLsRdS90cAO/rdgQ8OI7kLT/1tr5GpF9RmXo" +
+ "RnVqMP+U0zGd/BNNSneg7emb7TxLzxeMKZ7QbF4MZi8RRN11spvx8/f92CiYrGGu" +
+ "y67VdOGPaomYc+VZ2syLwduHGK40ADrEK3+MQpsRFB0dM08j9bhpr5A44wIDAQAB" +
+ "o4IBYzCCAV8wFwYDVR0RBBAwDoIMKi5hcGFjaGUub3JnMAkGA1UdEwQCMAAwQgYD" +
+ "VR0gBDswOTA3BgpghkgBhvhFAQc2MCkwJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3" +
+ "LnRoYXd0ZS5jb20vY3BzLzAOBgNVHQ8BAf8EBAMCBaAwHwYDVR0jBBgwFoAUp6KD" +
+ "uzRFQD381TBPErk+oQGf9tswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL3N2ci1v" +
+ "di1jcmwudGhhd3RlLmNvbS9UaGF3dGVPVi5jcmwwHQYDVR0lBBYwFAYIKwYBBQUH" +
+ "AwEGCCsGAQUFBwMCMGkGCCsGAQUFBwEBBF0wWzAiBggrBgEFBQcwAYYWaHR0cDov" +
+ "L29jc3AudGhhd3RlLmNvbTA1BggrBgEFBQcwAoYpaHR0cDovL3N2ci1vdi1haWEu" +
+ "dGhhd3RlLmNvbS9UaGF3dGVPVi5jZXIwDQYJKoZIhvcNAQELBQADggEBAF52BLvl" +
+ "x5or9/aO7+cPhxuPxwiNRgbvHdCakD7n8vzjNyct9fKp6/XxB6GQiTZ0nZPJOyIu" +
+ "Pi1QDLKOXvaPeLKDBilL/+mrn/ev3s/aRQSrUsieKDoQnqtmlxEHc/T3+Ni/RZob" +
+ "PD4GzPuNKpK3BIc0fk/95T8R1DjBSQ5/clvkzOKtcl3VffAwnHiE9TZx9js7kZwO" +
+ "b9nOKX8DFao3EpQcS7qn63Ibzbq5A6ry8ZNRQSIJK/xlCAWoyUd1uxnqGFnus8wb" +
+ "9RVZJQe8YvyytBjgbE3QjnfPOxoEJA3twupnPmH+OCTM6V3TZqpRZj/sZ5rtIQ++" +
+ "hI5FdJWUWVSgnSw=\n" +
+ "K 8\n" +
+ "failures\n" +
+ "V 1\n" +
+ "8\n" +
+ "K 15\n" +
+ "svn:realmstring\n" +
+ "V 26\n" +
+ "https://svn.apache.org:443\n" +
+ "END\n";
+
+ private static final String util_cred_ssl_client_passphrase =
+ "K 8\n" +
+ "passtype\n" +
+ "V 10\n" +
+ "javahltest\n" +
+ "K 10\n" +
+ "passphrase\n" +
+ "V 24\n" +
+ "secret with spaces in it\n" +
+ "K 15\n" +
+ "svn:realmstring\n" +
+ "V 27\n" +
+ "https://svn.example.com:443\n" +
+ "END\n";
+
+ // Initialize credentials used for testing credentials utilities
+ private void initCredentials() throws Throwable
+ {
+ File auth = new File(this.conf, "auth");
+ if (auth.exists())
+ removeDirOrFile(auth);
+ auth.mkdirs();
+
+ File store = new File(auth, "svn.username");
+ store.mkdir();
+ FileWriter cred = new FileWriter(new File(store, util_cred_hash));
+ cred.write(util_cred_username);
+ cred.close();
+
+ store = new File(auth, "svn.simple");
+ store.mkdir();
+ cred = new FileWriter(new File(store, util_cred_hash));
+ cred.write(util_cred_simple);
+ cred.close();
+
+ store = new File(auth, "svn.ssl.server");
+ store.mkdir();
+ cred = new FileWriter(new File(store, util_cred_hash));
+ cred.write(util_cred_ssl_server);
+ cred.close();
+
+ store = new File(auth, "svn.ssl.client-passphrase");
+ store.mkdir();
+ cred = new FileWriter(new File(store, util_cred_hash));
+ cred.write(util_cred_ssl_client_passphrase);
+ cred.close();
+ }
+
+ /**
+ * Test credentials search.
+ */
+ public void testCredentials() throws Throwable
+ {
+ initCredentials();
+
+ final String configDir = this.conf.getAbsolutePath();
+ SVNUtil.Credential cred;
+ List<SVNUtil.Credential> creds;
+
+ /* one username credential */
+ cred = SVNUtil.getCredential(configDir,
+ SVNUtil.Credential.Kind.username,
+ "https://svn.example.com:443");
+ assertNotNull(cred);
+ assertEquals(cred.getUsername(), "mungo");
+
+ /* one simple credential */
+ cred = SVNUtil.getCredential(configDir,
+ SVNUtil.Credential.Kind.simple,
+ "https://svn.example.com:443");
+ assertNotNull(cred);
+ assertEquals(cred.getUsername(), "mungo");
+ assertEquals(cred.getPassword(), "secret");
+ assertEquals(cred.getSecureStore(), "javahltest");
+
+ /* one SSL server trust credential */
+ cred = SVNUtil.getCredential(configDir,
+ SVNUtil.Credential.Kind.sslServer,
+ "https://svn.apache.org:443");
+ assertNotNull(cred);
+ assertEquals(cred.getServerCertInfo().getSubject(),
+ "C=US, ST=Maryland, L=Forest Hill, " +
+ "O=Apache Software Foundation, OU=Infrastructure, " +
+ "CN=*.apache.org");
+
+ /* one SSL client passphrase credential */
+ cred = SVNUtil.getCredential(configDir,
+ SVNUtil.Credential.Kind.sslClientPassphrase,
+ "https://svn.example.com:443");
+ assertNotNull(cred);
+ assertEquals(cred.getClientCertPassphrase(), "secret with spaces in it");
+ assertEquals(cred.getSecureStore(), "javahltest");
+
+ /* search with no parameters (empty return) */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ null, null, null, null);
+ assertNull(creds);
+
+ /* search with unmatched parameters */
+ creds = SVNUtil.searchCredentials(configDir,
+ SVNUtil.Credential.Kind.sslServer,
+ null, null, null, "*java*");
+ assertNull(creds);
+
+ /* search with unmatched parameters */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ null, "*java*", null, null);
+ assertNull(creds);
+
+ /* search with match on kind */
+ creds = SVNUtil.searchCredentials(configDir,
+ SVNUtil.Credential.Kind.sslServer,
+ "*", null, null, null);
+ assertNotNull(creds);
+ assertEquals(creds.size(), 1);
+
+ /* search with match on passtype */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ null, null, null, "*java*");
+ assertNotNull(creds);
+ assertEquals(creds.size(), 2);
+
+ /* search with match on username */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ null, "mungo", null, null);
+ assertNotNull(creds);
+ assertEquals(creds.size(), 2);
+
+ /* search with match on subvject */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ null, null, "\\*.apache.org", null);
+ assertNotNull(creds);
+ assertEquals(creds.size(), 1);
+
+ /* search with match on realm */
+ creds = SVNUtil.searchCredentials(configDir, null,
+ "*example*", null, null, null);
+ assertNotNull(creds);
+ assertEquals(creds.size(), 3);
+ }
+}
diff --git a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
index 8190616..20f38f3 100644
--- a/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
+++ b/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
@@ -34,11 +34,12 @@ import java.util.Date;
import org.apache.subversion.javahl.types.*;
-import junit.framework.Assert;
+import junit.framework.TestCase;
+
/**
* This class describe the expected state of the working copy
*/
-public class WC
+public class WC extends TestCase
{
/**
* the map of the items of the working copy. The relative path is the key
@@ -127,6 +128,16 @@ public class WC
}
/**
+ * Set the depth of the item at a path
+ * @param path the path, where the status is set
+ * @param depth the new depth
+ */
+ public void setItemDepth(String path, Depth depth)
+ {
+ items.get(path).depth = depth;
+ }
+
+ /**
* Set the revision number of the item at a path
* @param path the path, where the revision number is set
* @param revision the new revision number
@@ -169,9 +180,9 @@ public class WC
// since having no content signals a directory, changes of removing the
// content or setting a former not set content is not allowed. That
// would change the type of the item.
- Assert.assertNotNull("cannot unset content", content);
+ assertNotNull("cannot unset content", content);
Item i = items.get(path);
- Assert.assertNotNull("cannot set content on directory", i.myContent);
+ assertNotNull("cannot set content on directory", i.myContent);
i.myContent = content;
}
@@ -304,13 +315,13 @@ public class WC
*/
void check(DirEntry[] tested, String singleFilePath)
{
- Assert.assertEquals("not a single dir entry", 1, tested.length);
+ assertEquals("not a single dir entry", 1, tested.length);
Item item = items.get(singleFilePath);
- Assert.assertNotNull("not found in working copy", item);
- Assert.assertNotNull("not a file", item.myContent);
- Assert.assertEquals("state says file, working copy not",
- tested[0].getNodeKind(),
- item.nodeKind == null ? NodeKind.file : item.nodeKind);
+ assertNotNull("not found in working copy", item);
+ assertNotNull("not a file", item.myContent);
+ assertEquals("state says file, working copy not",
+ tested[0].getNodeKind(),
+ item.nodeKind == null ? NodeKind.file : item.nodeKind);
}
/**
@@ -342,19 +353,18 @@ public class WC
{
String name = basePath + entry.getPath();
Item item = items.get(name);
- Assert.assertNotNull("null paths won't be found in working copy",
- item);
+ assertNotNull("null paths won't be found in working copy", item);
if (item.myContent != null)
{
- Assert.assertEquals("Expected '" + entry + "' to be file",
- entry.getNodeKind(),
- item.nodeKind == null ? NodeKind.file : item.nodeKind);
+ assertEquals("Expected '" + entry + "' to be file",
+ entry.getNodeKind(),
+ item.nodeKind == null ? NodeKind.file : item.nodeKind);
}
else
{
- Assert.assertEquals("Expected '" + entry + "' to be dir",
- entry.getNodeKind(),
- item.nodeKind == null ? NodeKind.dir : item.nodeKind);
+ assertEquals("Expected '" + entry + "' to be dir",
+ entry.getNodeKind(),
+ item.nodeKind == null ? NodeKind.dir : item.nodeKind);
}
item.touched = true;
}
@@ -369,9 +379,9 @@ public class WC
!item.myPath.equals(basePath))
{
// Non-recursive checks will fail here.
- Assert.assertFalse("Expected path '" + item.myPath +
- "' not found in dir entries",
- recursive);
+ assertFalse("Expected path '" + item.myPath +
+ "' not found in dir entries",
+ recursive);
// Look deeper under the tree.
boolean found = false;
@@ -387,8 +397,8 @@ public class WC
}
}
}
- Assert.assertTrue("Expected path '" + item.myPath +
- "' not found in dir entries", found);
+ assertTrue("Expected path '" + item.myPath +
+ "' not found in dir entries", found);
}
}
}
@@ -436,14 +446,14 @@ public class WC
for (Status status : tested)
{
String path = status.getPath();
- Assert.assertTrue("status path starts not with working copy path",
- path.startsWith(normalizeWCPath));
+ assertTrue("status path starts not with working copy path",
+ path.startsWith(normalizeWCPath));
// we calculate the relative path to the working copy root
if (path.length() > workingCopyPath.length() + 1)
{
- Assert.assertEquals("missing '/' in status path",
- path.charAt(workingCopyPath.length()), '/');
+ assertEquals("missing '/' in status path",
+ path.charAt(workingCopyPath.length()), '/');
path = path.substring(workingCopyPath.length() + 1);
}
else
@@ -451,25 +461,26 @@ public class WC
path = "";
Item item = items.get(path);
- Assert.assertNotNull("status not found in working copy: " + path,
- item);
- Assert.assertEquals("wrong text status in working copy: " + path,
- item.textStatus, status.getTextStatus());
+ assertNotNull("status not found in working copy: " + path, item);
+ assertEquals("wrong text status in working copy: " + path,
+ item.textStatus, status.getTextStatus());
if (item.workingCopyRev != -1)
- Assert.assertEquals("wrong revision number in working copy: "
- + path,
- item.workingCopyRev, status.getRevisionNumber());
- Assert.assertEquals("lock status wrong: " + path,
- item.isLocked, status.isLocked());
- Assert.assertEquals("switch status wrong: " + path,
- item.isSwitched, status.isSwitched());
- Assert.assertEquals("wrong prop status in working copy: " + path,
- item.propStatus, status.getPropStatus());
+ assertEquals("wrong revision number in working copy: " + path,
+ item.workingCopyRev, status.getRevisionNumber());
+ assertEquals("lock status wrong: " + path,
+ item.isLocked, status.isLocked());
+ assertEquals("switch status wrong: " + path,
+ item.isSwitched, status.isSwitched());
+ assertEquals("wrong prop status in working copy: " + path,
+ item.propStatus, status.getPropStatus());
+ if (item.depth != null)
+ assertEquals("wrong ambient depth in working copy: " + path,
+ item.depth, status.getDepth());
if (item.myContent != null)
{
- Assert.assertEquals("state says file, working copy not: " + path,
- status.getNodeKind(),
- item.nodeKind == null ? NodeKind.file : item.nodeKind);
+ assertEquals("state says file, working copy not: " + path,
+ status.getNodeKind(),
+ item.nodeKind == null ? NodeKind.file : item.nodeKind);
if (status.getTextStatus() == Status.Kind.normal ||
item.checkContent)
{
@@ -483,26 +494,26 @@ public class WC
buffer.append((char) ch);
}
rd.close();
- Assert.assertEquals("content mismatch: " + path,
- buffer.toString(), item.myContent);
+ assertEquals("content mismatch: " + path,
+ buffer.toString(), item.myContent);
}
}
else
{
- Assert.assertEquals("state says dir, working copy not: " + path,
- status.getNodeKind(),
- item.nodeKind == null ? NodeKind.dir : item.nodeKind);
+ assertEquals("state says dir, working copy not: " + path,
+ status.getNodeKind(),
+ item.nodeKind == null ? NodeKind.dir : item.nodeKind);
}
if (checkRepos)
{
- Assert.assertEquals("Last commit revisions for OOD path '"
- + item.myPath + "' don't match:",
- item.reposLastCmtRevision,
- status.getReposLastCmtRevisionNumber());
- Assert.assertEquals("Last commit kinds for OOD path '"
- + item.myPath + "' don't match:",
- item.reposKind, status.getReposKind());
+ assertEquals("Last commit revisions for OOD path '"
+ + item.myPath + "' don't match:",
+ item.reposLastCmtRevision,
+ status.getReposLastCmtRevisionNumber());
+ assertEquals("Last commit kinds for OOD path '"
+ + item.myPath + "' don't match:",
+ item.reposKind, status.getReposKind());
// Only the last committed rev and kind is available for
// paths deleted in the repos.
@@ -511,17 +522,17 @@ public class WC
long lastCmtTime =
(status.getReposLastCmtDate() == null ?
0 : status.getReposLastCmtDate().getTime());
- Assert.assertEquals("Last commit dates for OOD path '" +
- item.myPath + "' don't match:",
- new Date(item.reposLastCmtDate),
- new Date(lastCmtTime));
- Assert.assertEquals("Last commit authors for OOD path '"
- + item.myPath + "' don't match:",
- item.reposLastCmtAuthor,
- status.getReposLastCmtAuthor());
- Assert.assertNotNull("URL for path " + item.myPath
- + " should not be null",
- status.getUrl());
+ assertEquals("Last commit dates for OOD path '" +
+ item.myPath + "' don't match:",
+ new Date(item.reposLastCmtDate),
+ new Date(lastCmtTime));
+ assertEquals("Last commit authors for OOD path '"
+ + item.myPath + "' don't match:",
+ item.reposLastCmtAuthor,
+ status.getReposLastCmtAuthor());
+ assertNotNull("URL for path " + item.myPath
+ + " should not be null",
+ status.getUrl());
}
}
item.touched = true;
@@ -531,9 +542,9 @@ public class WC
// result array
for (Item item : items.values())
{
- Assert.assertTrue("item '" + item.myPath +
- "' in working copy not found in status",
- item.touched);
+ assertTrue("item '" + item.myPath +
+ "' in working copy not found in status",
+ item.touched);
}
}
@@ -563,6 +574,11 @@ public class WC
Status.Kind propStatus = Status.Kind.none;
/**
+ * the ambient depth of the item.
+ */
+ Depth depth = null;
+
+ /**
* the expected revision number. -1 means do not check.
*/
long workingCopyRev = -1;
@@ -635,6 +651,7 @@ public class WC
myContent = source.myContent;
textStatus = source.textStatus;
propStatus = source.propStatus;
+ depth = source.depth;
owner.items.put(myPath, this);
}
diff --git a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
index 3407b96..5d5e022 100644
--- a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
+++ b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
@@ -213,7 +213,16 @@ public class BasicTests extends SVNTests
Status s = client.singleStatus(fileToSVNPath(fileC, false), false);
if (s != null)
- fail("File foo.c should not return a status.");
+ {
+ if (s.hasTreeConflict()
+ || s.getTextStatus() != Status.Kind.none
+ || s.getPropStatus() != Status.Kind.none
+ || s.getRepositoryTextStatus() != Status.Kind.none
+ || s.getRepositoryPropStatus() != Status.Kind.none)
+ {
+ fail("File foo.c should not return a status.");
+ }
+ }
}
@@ -1250,7 +1259,7 @@ public class BasicTests extends SVNTests
/**
* Test the basic SVNClient.cleanup functionality.
* Without a way to force a lock, this test just verifies
- * the method can be called succesfully.
+ * the method can be called successfully.
* @throws Throwable
*/
public void testBasicCleanup() throws Throwable
@@ -1630,7 +1639,7 @@ public class BasicTests extends SVNTests
// check the status of the working copy
thisTest.checkStatus();
- // confirm that the file are realy deleted
+ // confirm that the file are really deleted
assertFalse("failed to remove text modified file",
new File(thisTest.getWorkingCopy(), "A/D/G/rho").exists());
assertFalse("failed to remove prop modified file",
@@ -1656,7 +1665,7 @@ public class BasicTests extends SVNTests
try
{
- // delete non-existant file foo
+ // delete non-existent file foo
client.remove(new String[] {file.getAbsolutePath()}, null, true);
fail("missing exception");
}
@@ -2644,7 +2653,7 @@ public class BasicTests extends SVNTests
thisTest.getUrl(), diffOutput.getPath(),
Depth.infinity, null, true, true, false);
- fail("This test should fail becaus the relativeToDir parameter " +
+ fail("This test should fail because the relativeToDir parameter " +
"does not work with URLs");
}
catch (Exception ignored)
@@ -2929,6 +2938,16 @@ public class BasicTests extends SVNTests
}
}
+ private static class CountingProgressListener implements ProgressListener
+ {
+ public void onProgress(ProgressEvent event)
+ {
+ // TODO: Examine the byte counts from "event".
+ gotProgress = true;
+ }
+ public boolean gotProgress = false;
+ }
+
public void testDataTransferProgressReport() throws Throwable
{
// ### FIXME: This isn't working over ra_local, because
@@ -2938,25 +2957,13 @@ public class BasicTests extends SVNTests
// build the test setup
OneTest thisTest = new OneTest();
- ProgressListener listener = new ProgressListener()
- {
- public void onProgress(ProgressEvent event)
- {
- // TODO: Examine the byte counts from "event".
- throw new RuntimeException("Progress reported as expected");
- }
- };
+ CountingProgressListener listener = new CountingProgressListener();
client.setProgressListener(listener);
// Perform an update to exercise the progress notification.
- try
- {
- client.update(thisTest.getWCPath(), null, true);
+ client.update(thisTest.getWCPath(), null, true);
+ if (!listener.gotProgress)
fail("No progress reported");
- }
- catch (RuntimeException progressReported)
- {
- }
}
/**
@@ -3360,9 +3367,12 @@ public class BasicTests extends SVNTests
private class MyChangelistCallback extends HashMap
implements ChangelistCallback
{
+ private static final long serialVersionUID = 1L;
+
@SuppressWarnings("unchecked")
public void doChangelist(String path, String changelist)
{
+ path = fileToSVNPath(new File(path), true);
if (super.containsKey(path))
{
// Append the changelist to the existing list
diff --git a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java
index 1e858c8..2cc4234 100644
--- a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java
+++ b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNTests.java
@@ -158,7 +158,7 @@ class SVNTests extends TestCase
private void init()
{
- // if not already set, get a usefull value for rootDir
+ // if not already set, get a useful value for rootDir
if (rootDirectoryName == null)
rootDirectoryName = System.getProperty("test.rootdir");
if (rootDirectoryName == null)
@@ -232,8 +232,9 @@ class SVNTests extends TestCase
greekDump = new File(localTmp, "greek_dump");
admin.create(greekRepos.getAbsolutePath(), true,false, null,
this.fsType);
- addExpectedCommitItem(greekFiles.getAbsolutePath(), null, null,
- NodeKind.none, CommitItemStateFlags.Add);
+ addExpectedCommitItem(greekFiles.getAbsolutePath(),
+ makeReposUrl(greekRepos).toString(), null,
+ NodeKind.dir, CommitItemStateFlags.Add);
client.doImport(greekFiles.getAbsolutePath(), makeReposUrl(greekRepos),
null, true );
admin.dump(greekRepos.getAbsolutePath(), new FileOutputer(greekDump),
@@ -309,12 +310,12 @@ class SVNTests extends TestCase
public boolean prompt(String realm, String username)
{
- return false;
+ return true;
}
public boolean prompt(String realm, String username, boolean maySave)
{
- return false;
+ return true;
}
public String askQuestion(String realm, String question,
diff --git a/subversion/bindings/swig/INSTALL b/subversion/bindings/swig/INSTALL
index 0a66105..751a5c4 100644
--- a/subversion/bindings/swig/INSTALL
+++ b/subversion/bindings/swig/INSTALL
@@ -80,7 +80,7 @@ Step 1: Install a suitable version of SWIG (which is
--with-python=/path/to/correct/python/binary
- to the configure script. You need Python 2.5 or above.
+ to the configure script. You need Python 2.7 or above.
If you plan to build the Perl bindings, and have a system
with more than one version of perl installed, you may need
@@ -109,7 +109,7 @@ Step 2: Build and Install Subversion.
python executable you used to configure SWIG as above. If it does not then
you can specify the correct path by adding PYTHON=/path/to/python or
PERL=/path/to/perl onto the command line for configure. For example:
- ./configure PYTHON=/usr/bin/python2.5 PERL=/usr/bin/perl5.8.0
+ ./configure PYTHON=/usr/bin/python2.7 PERL=/usr/bin/perl5.8.0
If Subversion's ./configure finds a SWIG that it's happy with, then
it will build special glue libraries to link svn to the swig bindings:
@@ -232,35 +232,15 @@ BUILDING SWIG BINDINGS FOR SVN ON WINDOWS
compile in Release mode. (This is due to pyconfig.h using the
_DEBUG flag too and setting a #pragma comment(lib) value.)
- For Perl support, you also need to add the paths into Visual Studio.
-
- In Visual C++ 6, go to Tools -> Options -> Directories.
-
- In Visual C++ .NET, go to Tools -> Options -> Projects
- -> VC++ Directories.
-
- Add the following paths:
-
- Executable Directories:
-
- For Perl, path to perl.exe
- (for example, C:\Program Files\Perl\bin)
-
- Library Directories:
-
- For Perl, path to perl##.lib
- (for example, C:\Program Files\Perl\lib\CORE)
-
- Include Directories:
-
- For Perl, path to perl.h
- (for example, C:\Program Files\Perl\lib\CORE)
+ Our project generator detects Perl, Ruby and Python installs and will
+ generate the swig projects for these languages if both swig and the
+ language is found.
3. Create the Visual Studio project files via gen-make.py, adding in
the --with-swig parameter to the installed location for SWIG.
Example:
- > gen-make.py -t vcproj --with-swig="C:\Program Files\SWIG-2.0.2"
+ > gen-make.py <other options> --with-swig="C:\Program Files\SWIG-2.0.2"
4. If you haven't already built Subversion, you should do so now.
Instructions are in the main INSTALL file.
@@ -271,6 +251,7 @@ BUILDING SWIG BINDINGS FOR SVN ON WINDOWS
__SWIG_PYTHON__
__SWIG_PERL__
+ __SWIG_RUBY__
6. Install the bindings. The procedure varies depending on the language.
diff --git a/subversion/bindings/swig/core.i b/subversion/bindings/swig/core.i
index 64a3d05..a0a4267 100644
--- a/subversion/bindings/swig/core.i
+++ b/subversion/bindings/swig/core.i
@@ -379,21 +379,21 @@
#ifdef SWIGPYTHON
%typemap(in) (char *buffer, apr_size_t *len) ($*2_type temp) {
if (PyLong_Check($input)) {
- temp = PyLong_AsLong($input);
+ temp = PyLong_AsUnsignedLong($input);
}
else if (PyInt_Check($input)) {
- temp = PyInt_AsLong($input);
+ /* wish there was a PyInt_AsUnsignedLong but there isn't
+ the mask version doesn't do bounds checking for us.
+ I can't see a good way to do the bounds checking ourselves
+ so just stick our head in the sand. With Python3 this
+ problem goes away because PyInt is gone anyway. */
+ temp = PyInt_AsUnsignedLongMask($input);
}
else {
PyErr_SetString(PyExc_TypeError,
"expecting an integer for the buffer size");
SWIG_fail;
}
- if (temp < 0) {
- PyErr_SetString(PyExc_ValueError,
- "buffer size must be a positive integer");
- SWIG_fail;
- }
$1 = malloc(temp);
$2 = ($2_ltype)&temp;
}
@@ -514,7 +514,8 @@
else if ($input == Py_None) {
$1 = NULL;
}
- else if (svn_swig_ConvertPtr($input, (void **)&$1, $descriptor(svn_auth_ssl_server_cert_info_t *)) == 0) {
+ else if (svn_swig_py_convert_ptr($input, (void **)&$1,
+ $descriptor(svn_auth_ssl_server_cert_info_t *)) == 0) {
}
else {
PyErr_SetString(PyExc_TypeError, "not a known type");
@@ -523,6 +524,26 @@
}
#endif
+#ifdef SWIGPERL
+%typemap(in) const void *value
+ (apr_pool_t *_global_pool = NULL)
+{
+ if (!SvOK($input) || $input == &PL_sv_undef) {
+ $1 = NULL;
+ }
+ else if (SvPOK($input)) {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ $1 = apr_pstrdup(_global_pool, SvPV_nolen($input));
+ }
+ else {
+ croak("Value is not a string (or undef)");
+ }
+}
+#endif
+
/*
- all values are converted to char*
- assume the first argument is Ruby object for svn_auth_baton_t*
@@ -644,28 +665,20 @@ typedef int apr_status_t;
#ifdef SWIGPERL
apr_pool_t *current_pool;
-#if SWIG_VERSION <= 0x010324
-%{
-#define SVN_SWIGEXPORT(t) SWIGEXPORT(t)
-%}
-#else
-%{
-#define SVN_SWIGEXPORT(t) SWIGEXPORT t
-%}
-#endif
-
%{
+/* ### Eventually this should go away. This is not thread safe and a very
+ ### good example on HOW NOT TO USE pools */
static apr_pool_t *current_pool = 0;
-SVN_SWIGEXPORT(apr_pool_t *)
-svn_swig_pl_get_current_pool (void)
+static apr_pool_t *
+core_get_current_pool (void)
{
return current_pool;
}
-SVN_SWIGEXPORT(void)
-svn_swig_pl_set_current_pool (apr_pool_t *pool)
+static void
+core_set_current_pool (apr_pool_t *pool)
{
current_pool = pool;
}
@@ -789,10 +802,11 @@ svn_swig_pl_set_current_pool (apr_pool_t *pool)
#endif
#ifdef SWIGPYTHON
-# The auth baton depends on the providers, so we preserve a
-# reference to them inside the wrapper. This way, if all external
-# references to the providers are gone, they will still be alive,
-# keeping the baton valid.
+/* The auth baton depends on the providers, so we preserve a
+ reference to them inside the wrapper. This way, if all external
+ references to the providers are gone, they will still be alive,
+ keeping the baton valid.
+ */
%feature("pythonappend") svn_auth_open %{
val.__dict__["_deps"] = list(args[0])
%}
@@ -867,10 +881,8 @@ static void svn_auth_set_gnome_keyring_unlock_prompt_func(svn_auth_baton_t *ab,
#include "svn_private_config.h"
%}
%init %{
-#if defined(SVN_AVOID_CIRCULAR_LINKAGE_AT_ALL_COSTS_HACK)
- svn_swig_pl_bind_current_pool_fns (&svn_swig_pl_get_current_pool,
- &svn_swig_pl_set_current_pool);
-#endif
+ svn_swig_pl__bind_current_pool_fns(&core_get_current_pool,
+ &core_set_current_pool);
%}
#endif
diff --git a/subversion/bindings/swig/include/apr.swg b/subversion/bindings/swig/include/apr.swg
index 282483c..3eeece4 100644
--- a/subversion/bindings/swig/include/apr.swg
+++ b/subversion/bindings/swig/include/apr.swg
@@ -31,23 +31,21 @@
*/
#ifdef SWIGPERL
%typemap(out) long long {
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) $1);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ %append_output(sv_2mortal(newSVpv(temp, 0)));
}
%typemap(out) unsigned long long {
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t) $1);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ %append_output(sv_2mortal(newSVpv(temp, 0)));
}
%typemap(in, numinputs=0) long long *OUTPUT (apr_int64_t temp)
"$1 = &temp;";
%typemap(argout) long long *OUTPUT {
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*($1));
%append_output(sv_2mortal(newSVpv(temp, 0)));
}
@@ -55,7 +53,7 @@
%typemap(in, numinputs=0) unsigned long long *OUTPUT (apr_uint64_t temp)
"$1 = &temp;";
%typemap(argout) unsigned long long *OUTPUT {
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t)*($1));
%append_output(sv_2mortal(newSVpv(temp, 0)));
}
diff --git a/subversion/bindings/swig/include/proxy.py b/subversion/bindings/swig/include/proxy.py
new file mode 100644
index 0000000..ca4a64d
--- /dev/null
+++ b/subversion/bindings/swig/include/proxy.py
@@ -0,0 +1,41 @@
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/include/proxy.swg b/subversion/bindings/swig/include/proxy.swg
index d16afc2..701ba77 100644
--- a/subversion/bindings/swig/include/proxy.swg
+++ b/subversion/bindings/swig/include/proxy.swg
@@ -60,51 +60,11 @@
value.assert_valid()
%}
-/* Default code for all wrapped proxy classes in Python */
+/* Default code for all wrapped proxy classes in Python.
+ * Inline the code from a separate file to avoid issues with
+ * SWIG mis-parsing the comments as preprocessor directives. */
%define %proxy_pythoncode(TYPE)
-%pythoncode {
- def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for TYPE"""
- import libsvn.core, weakref
- self.__dict__["_parent_pool"] = \
- parent_pool or libsvn.core.application_pool;
- if self.__dict__["_parent_pool"]:
- self.__dict__["_is_valid"] = weakref.ref(
- self.__dict__["_parent_pool"]._is_valid)
-
- def assert_valid(self):
- """Assert that this object is using valid pool memory"""
- if "_is_valid" in self.__dict__:
- assert self.__dict__["_is_valid"](), "Variable has already been deleted"
-
- def __getattr__(self, name):
- """Get an attribute from this object"""
- self.assert_valid()
-
- value = _swig_getattr(self, self.__class__, name)
-
- # If we got back a different object than we have, we need to copy all our
- # metadata into it, so that it looks identical
- members = self.__dict__.get("_members")
- if members is not None:
- _copy_metadata_deep(value, members.get(name))
-
- # Verify that the new object is good
- _assert_valid_deep(value)
-
- return value
-
- def __setattr__(self, name, value):
- """Set an attribute on this object"""
- self.assert_valid()
-
- # Save a copy of the object, so that the garbage
- # collector won't kill the object while it's in
- # SWIG-land
- self.__dict__.setdefault("_members",{})[name] = value
-
- return _swig_setattr(self, self.__class__, name, value)
-}
+%pythoncode "proxy.py"
%enddef
/* Define a proxy for wrapping an existing struct */
diff --git a/subversion/bindings/swig/include/proxy_apr.swg b/subversion/bindings/swig/include/proxy_apr.swg
index 2fa77a8..60a8523 100644
--- a/subversion/bindings/swig/include/proxy_apr.swg
+++ b/subversion/bindings/swig/include/proxy_apr.swg
@@ -185,7 +185,7 @@ struct apr_pool_t {
# Make sure that the parent object is valid
self._parent_pool.assert_valid()
- # Refer to self using a weakrefrence so that we don't
+ # Refer to self using a weakreference so that we don't
# create a reference cycle
weakself = weakref.ref(self)
diff --git a/subversion/bindings/swig/include/svn_containers.swg b/subversion/bindings/swig/include/svn_containers.swg
index b783fdf..e2eeaa9 100644
--- a/subversion/bindings/swig/include/svn_containers.swg
+++ b/subversion/bindings/swig/include/svn_containers.swg
@@ -269,8 +269,10 @@
%typemap(in) apr_hash_t *PROPHASH
(apr_pool_t *_global_pool = NULL)
{
- if (_global_pool == NULL)
+ if (_global_pool == NULL) {
_global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
$1 = svn_swig_pl_hash_to_prophash($input, _global_pool);
}
%typemap(out) apr_hash_t *PROPHASH
@@ -426,6 +428,25 @@
{
$1 = svn_swig_py_path_revs_hash_from_dict($input, _global_pool);
}
+%typemap(in) apr_hash_t *unlock_targets
+{
+ $1 = svn_swig_py_stringhash_from_dict($input, _global_pool);
+}
+%typemap(in) apr_hash_t *lock_targets
+ (apr_pool_t *_global_pool, PyObject *_global_pool = NULL)
+{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, $descriptor(apr_pool_t *),
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+ $1 = svn_swig_py_struct_ptr_hash_from_dict($input,
+ $descriptor(svn_fs_lock_target_t *), _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+}
#endif
#ifdef SWIGPERL
@@ -600,11 +621,11 @@
#endif
#ifdef SWIGPERL
%typemap(in) const apr_array_header_t *STRINGLIST {
- $1 = (apr_array_header_t *) svn_swig_pl_strings_to_array($input,
+ $1 = svn_swig_pl_strings_to_array($input,
_global_pool);
}
%typemap(in) const apr_array_header_t *STRINGLIST_MAY_BE_NULL {
- $1 = SvOK($input) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ $1 = SvOK($input) ? svn_swig_pl_strings_to_array(
$input, _global_pool) : NULL;
}
#endif
@@ -646,7 +667,7 @@
*/
#ifdef SWIGPERL
%typemap(in) apr_array_header_t *providers {
- $1 = (apr_array_header_t *) svn_swig_pl_objs_to_array($input,
+ $1 = svn_swig_pl_objs_to_array($input,
$descriptor(svn_auth_provider_object_t *), _global_pool);
}
#endif
@@ -801,7 +822,16 @@
apr_hash_t * <const char *, apr_array_header_t * <svn_merge_range_t *>>
*/
#ifdef SWIGPYTHON
-%typemap(in) apr_hash_t *MERGEINFO {
+%typemap(in) apr_hash_t *MERGEINFO
+ (apr_pool_t *_global_pool = NULL, PyObject *_global_py_pool = NULL)
+{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, $descriptor(apr_pool_t *),
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
$1 = svn_swig_py_mergeinfo_from_dict($input, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -954,3 +984,16 @@
%append_output(svn_swig_rb_apr_array_to_array_auth_provider_object(*$1));
}
#endif
+
+/* -----------------------------------------------------------------------
+ Output of apr_array_header_t * <svn_diff_hunk_t *>
+*/
+#ifdef SWIGPYTHON
+%typemap(out) apr_array_header_t *hunks {
+ %append_output(svn_swig_py_pointerlist_to_list($1, $descriptor(svn_diff_hunk_t *),
+ _global_py_pool));
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+}
+#endif
diff --git a/subversion/bindings/swig/include/svn_string.swg b/subversion/bindings/swig/include/svn_string.swg
index 2a04672..9fb2dac 100644
--- a/subversion/bindings/swig/include/svn_string.swg
+++ b/subversion/bindings/swig/include/svn_string.swg
@@ -90,6 +90,7 @@ typedef struct svn_string_t svn_string_t;
%typemap(in) svn_stringbuf_t * {
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK($input)) {
$1 = NULL;
@@ -97,8 +98,9 @@ typedef struct svn_string_t svn_string_t;
buf = SvPV($input, len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- $1 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ $1 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -208,11 +210,6 @@ typedef struct svn_string_t svn_string_t;
/* when storing an svn_string_t* into a structure, we must allocate the
svn_string_t structure on the heap. */
-#ifdef SWIGPYTHON
-%typemap(memberin) const svn_string_t * {
- $1 = svn_string_dup($input, _global_pool);
-}
-#endif
#ifdef SWIGPERL
%typemap(memberin) const svn_string_t * {
$1 = svn_string_dup($input, _global_pool);
diff --git a/subversion/bindings/swig/include/svn_types.swg b/subversion/bindings/swig/include/svn_types.swg
index b2c7fb5..e6f5bb1 100644
--- a/subversion/bindings/swig/include/svn_types.swg
+++ b/subversion/bindings/swig/include/svn_types.swg
@@ -71,8 +71,8 @@
#ifdef SWIGPYTHON
%typemap(argout) SWIGTYPE **OUTPARAM {
- %append_output(svn_swig_NewPointerObj(*$1, $*1_descriptor,
- _global_py_pool, args));
+ %append_output(svn_swig_py_new_pointer_obj(*$1, $*1_descriptor,
+ _global_py_pool, args));
}
#else
%typemap(argout) SWIGTYPE **OUTPARAM {
@@ -146,7 +146,8 @@
/* svn_repos */
svn_authz_t **,
svn_repos_t **,
- const svn_repos_parse_fns2_t **,
+ const svn_repos_parse_fns3_t **,
+ const svn_repos_parser_fns2_t **,
const svn_repos_parser_fns_t **,
void **parse_baton,
void **revision_baton,
@@ -262,7 +263,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%define %callback_typemap(CallbackFunction, CallbackBaton,
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
- $1 = PythonThunk;
+ $1 = ($1_ltype) PythonThunk;
$2 = $input;
}
%enddef
@@ -270,7 +271,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
/* FIXME: Handle the NULL case. */
- $1 = PythonThunk;
+ $1 = ($1_ltype) PythonThunk;
$2 = $input;
}
%enddef
@@ -280,7 +281,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%define %callback_typemap(CallbackFunction, CallbackBaton,
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
- $1 = PerlThunk;
+ $1 = ($1_ltype) PerlThunk;
$2 = $input;
}
%enddef
@@ -288,10 +289,10 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
if (SvOK($input)) {
- $1 = PerlThunk;
+ $1 = ($1_ltype) PerlThunk;
$2 = $input;
} else {
- $1 = NULL;
+ $1 = ($1_ltype) NULL;
$2 = NULL;
}
}
@@ -302,7 +303,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%define %callback_typemap(CallbackFunction, CallbackBaton,
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
- $1 = RubyThunk;
+ $1 = ($1_ltype) RubyThunk;
$2 = (void *)svn_swig_rb_make_baton($input, _global_svn_swig_rb_pool);
}
%enddef
@@ -310,10 +311,10 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
PythonThunk, PerlThunk, RubyThunk)
%typemap(in) (CallbackFunction, CallbackBaton) {
if (NIL_P($input)) {
- $1 = NULL;
+ $1 = ($1_ltype) NULL;
$2 = NULL;
} else {
- $1 = RubyThunk;
+ $1 = ($1_ltype) RubyThunk;
$2 = (void *)svn_swig_rb_make_baton($input, _global_svn_swig_rb_pool);
}
}
@@ -508,15 +509,15 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%typemap(in) POINTER_TYPES
{
- $1 = ($1_ltype)svn_swig_MustGetPtr($input, $descriptor, $svn_argnum);
+ $1 = ($1_ltype)svn_swig_py_must_get_ptr($input, $descriptor, $svn_argnum);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
%typemap(out) POINTER_TYPES
- "$result = svn_swig_NewPointerObj((void*)($1), $descriptor,
- _global_py_pool, args);";
+ "$result = svn_swig_py_new_pointer_obj((void*)($1), $descriptor,
+ _global_py_pool, args);";
%apply POINTER_TYPES { void *, SWIGTYPE *, SWIGTYPE [] };
@@ -547,6 +548,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%typemap(in) apr_pool_t *pool "";
%typemap(default) apr_pool_t *pool(apr_pool_t *_global_pool) {
_global_pool = $1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
#endif
#ifdef SWIGRUBY
@@ -635,8 +637,8 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
*/
%typemap(argout) CALLABLE_CALLBACK * {
- %append_output(svn_swig_NewPointerObj($1, $descriptor,
- _global_py_pool, args));
+ %append_output(svn_swig_py_new_pointer_obj($1, $descriptor,
+ _global_py_pool, args));
}
/* Convert the pointer to a function pointer back into a regular
@@ -645,7 +647,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
%typemap(in) CALLABLE_CALLBACK {
$&ltype tmp =
- svn_swig_MustGetPtr($input, $&descriptor, $svn_argnum);
+ svn_swig_py_must_get_ptr($input, $&descriptor, $svn_argnum);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -675,8 +677,8 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
SWIG_fail;
}
*tmp = ($ltype) $1;
- $result = svn_swig_NewPointerObj(tmp, $&1_descriptor,
- py_pool, args);
+ $result = svn_swig_py_new_pointer_obj(tmp, $&1_descriptor,
+ py_pool, args);
}
}
@@ -694,7 +696,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
*tmp = ($ltype) $value;
%set_constant("$symname",
- svn_swig_NewPointerObj(tmp, $&descriptor, NULL, NULL)
+ svn_swig_py_new_pointer_obj(tmp, $&descriptor, NULL, NULL)
);
}
@@ -806,20 +808,12 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
Callback: svn_cancel_func_t
*/
-#ifdef SWIGPYTHON
-%typemap(in) (svn_cancel_func_t cancel_func, void *cancel_baton) {
- $1 = svn_swig_py_cancel_func;
- $2 = $input; /* our function is the baton. */
-}
-#endif
+%callback_typemap(svn_cancel_func_t cancel_func, void *cancel_baton,
+ svn_swig_py_cancel_func,
+ svn_swig_pl_cancel_func,
+ svn_swig_rb_cancel_func)
#ifdef SWIGRUBY
-%typemap(in) (svn_cancel_func_t cancel_func, void *cancel_baton)
-{
- $1 = svn_swig_rb_cancel_func;
- $2 = (void *)svn_swig_rb_make_baton($input, _global_svn_swig_rb_pool);
-}
-
%typemap(argout) (svn_cancel_func_t cancel_func, void *cancel_baton)
{
svn_swig_rb_set_baton($result, (VALUE)$2);
@@ -942,15 +936,24 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
#ifdef SWIGPERL
%typemap(in) svn_stream_t * {
svn_swig_pl_make_stream (&$1, $input);
+ SPAGAIN;
}
%typemap(out) svn_stream_t * {
- $result = svn_swig_pl_from_stream ($1);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream ($1);
+ SPAGAIN;
+ $result = tmp;
argvi++;
}
%typemap(argout) svn_stream_t ** {
- %append_output(svn_swig_pl_from_stream(*$1));
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*$1);
+ SPAGAIN;
+ %append_output(tmp);
}
#endif
@@ -1003,8 +1006,8 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- $result = svn_swig_NewPointerObj($1, $descriptor,
- _global_py_pool, args);
+ $result = svn_swig_py_new_pointer_obj($1, $descriptor,
+ _global_py_pool, args);
}
}
@@ -1123,11 +1126,11 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
}
%typemap(argout) unsigned char *result_digest {
- /* FIXME: This code is clearly buggy. The return value of sv_newmortal()
- is immediately overwritten by the return value
- of svn_swig_pl_from_md5(). */
- ST(argvi) = sv_newmortal();
- ST(argvi++) = svn_swig_pl_from_md5($1);
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_md5($1);
+ SPAGAIN;
+ %append_output(tmp);
}
#endif
@@ -1147,6 +1150,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
#endif
#ifdef SWIGPYTHON
+/* ### Verify if this should use '[]' like perl and ruby */
%typemap(in) const unsigned char *digest {
if ($input == Py_None) {
$1 = NULL;
@@ -1158,7 +1162,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
#endif
#ifdef SWIGRUBY
-%typemap(in) const unsigned char *digest
+%typemap(in) const unsigned char digest[]
{
if (NIL_P($input)) {
$1 = NULL;
@@ -1178,8 +1182,14 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE self)
useful convertors for svn_opt_revision_t
*/
#ifdef SWIGPERL
-%typemap(in) svn_opt_revision_t * (svn_opt_revision_t rev) {
- $1 = svn_swig_pl_set_revision(&rev, $input, TRUE);
+%typemap(in) svn_opt_revision_t *
+ (svn_opt_revision_t rev, apr_pool_t *_global_pool = NULL)
+{
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ $1 = svn_swig_pl_set_revision(&rev, $input, TRUE, _global_pool);
}
#endif
diff --git a/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
index 609fc9f..69b7754 100644
--- a/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
+++ b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
@@ -25,6 +25,9 @@
#include <apr_general.h>
#include <apr_portable.h>
+/* Windows hack: Allow overriding some <perl.h> defaults */
+#include "swigutil_pl__pre_perl.h"
+
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
@@ -54,7 +57,7 @@ static HV *type_cache = NULL;
#define _SWIG_TYPE(name) _swig_perl_type_query(name, 0)
#define POOLINFO _SWIG_TYPE("apr_pool_t *")
-static swig_type_info *_swig_perl_type_query(const char *typename, U32 klen)
+static swig_type_info *_swig_perl_type_query(const char *type_name, U32 klen)
{
SV **type_info;
swig_type_info *tinfo;
@@ -63,13 +66,13 @@ static swig_type_info *_swig_perl_type_query(const char *typename, U32 klen)
type_cache = newHV();
if (klen == 0)
- klen = strlen(typename);
+ klen = strlen(type_name);
- if ((type_info = hv_fetch(type_cache, typename, klen, 0)))
+ if ((type_info = hv_fetch(type_cache, type_name, klen, 0)))
return (swig_type_info *) (SvIV(*type_info));
- tinfo = SWIG_TypeQuery(typename);
- hv_store(type_cache, typename, klen, newSViv((IV)tinfo), 0);
+ tinfo = SWIG_TypeQuery(type_name);
+ hv_store(type_cache, type_name, klen, newSViv((IV)tinfo), 0);
return tinfo;
}
@@ -127,11 +130,11 @@ static void *convert_pl_revision_range(SV *value, void *ctx, apr_pool_t *pool)
/* this will assign to range */
SWIG_ConvertPtr(value, (void **)&range, _SWIG_TYPE("svn_opt_revision_range_t *"), 0);
return range;
- }
+ }
- if (SvROK(value)
+ if (SvROK(value)
&& SvTYPE(SvRV(value)) == SVt_PVAV
- && av_len((AV *)SvRV(value)) == 1) {
+ && av_len((AV *)SvRV(value)) == 1) {
/* value is a two-element ARRAY */
AV* array = (AV *)SvRV(value);
svn_opt_revision_t temp_start, temp_end;
@@ -140,16 +143,18 @@ static void *convert_pl_revision_range(SV *value, void *ctx, apr_pool_t *pool)
/* Note: Due to how svn_swig_pl_set_revision works,
* either the passed in svn_opt_revision_t is modified
- * (and the original pointer returned) or a different pointer
+ * (and the original pointer returned) or a different pointer
* is returned. svn_swig_pl_set_revision may return NULL
* only if croak_on_error is FALSE.
*/
- start = svn_swig_pl_set_revision(&temp_start,
- *av_fetch(array, 0, 0), croak_on_error);
+ start = svn_swig_pl_set_revision(&temp_start,
+ *av_fetch(array, 0, 0),
+ croak_on_error, pool);
if (start == NULL)
return NULL;
- end = svn_swig_pl_set_revision(&temp_end,
- *av_fetch(array, 1, 0), croak_on_error);
+ end = svn_swig_pl_set_revision(&temp_end,
+ *av_fetch(array, 1, 0),
+ croak_on_error, pool);
if (end == NULL)
return NULL;
@@ -158,7 +163,7 @@ static void *convert_pl_revision_range(SV *value, void *ctx, apr_pool_t *pool)
range->start = *start;
range->end = *end;
return range;
- }
+ }
if (croak_on_error)
croak("unknown revision range: "
@@ -178,7 +183,7 @@ static apr_hash_t *svn_swig_pl_to_hash(SV *source,
I32 cnt, retlen;
if (!(source && SvROK(source) && SvTYPE(SvRV(source)) == SVt_PVHV)) {
- return NULL;
+ return NULL;
}
hash = apr_hash_make(pool);
@@ -231,10 +236,9 @@ apr_hash_t *svn_swig_pl_hash_to_prophash(SV *source, apr_pool_t *pool)
}
/* perl -> c array convertors */
-static const
-apr_array_header_t *svn_swig_pl_to_array(SV *source,
- pl_element_converter_t cv,
- void *ctx, apr_pool_t *pool)
+static apr_array_header_t *svn_swig_pl_to_array(SV *source,
+ pl_element_converter_t cv,
+ void *ctx, apr_pool_t *pool)
{
int targlen;
apr_array_header_t *temp;
@@ -263,15 +267,15 @@ apr_array_header_t *svn_swig_pl_to_array(SV *source,
return temp;
}
-const apr_array_header_t *svn_swig_pl_strings_to_array(SV *source,
+apr_array_header_t *svn_swig_pl_strings_to_array(SV *source,
apr_pool_t *pool)
{
return svn_swig_pl_to_array(source, convert_pl_string, NULL, pool);
}
-const apr_array_header_t *svn_swig_pl_objs_to_array(SV *source,
- swig_type_info *tinfo,
- apr_pool_t *pool)
+apr_array_header_t *svn_swig_pl_objs_to_array(SV *source,
+ swig_type_info *tinfo,
+ apr_pool_t *pool)
{
return svn_swig_pl_to_array(source,
(pl_element_converter_t)convert_pl_obj,
@@ -279,21 +283,21 @@ const apr_array_header_t *svn_swig_pl_objs_to_array(SV *source,
}
/* Convert a single revision range or an array of revisions ranges
- * Note: We can't simply use svn_swig_pl_to_array() as is, since
+ * Note: We can't simply use svn_swig_pl_to_array() as is, since
* it immediatley checks whether source is an array reference and then
* proceeds to treat this as the "array of ..." case. But a revision range
* may be specified as a (two-element) array. Hence we first try to
* convert source as a single revision range. Failing that and if it's
* an array we then call svn_swig_pl_to_array(). Otherwise we croak().
*/
-const apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
+apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
SV *source, apr_pool_t *pool)
{
svn_boolean_t croak_on_error = FALSE;
svn_opt_revision_range_t *range;
- if (range = convert_pl_revision_range(source, &croak_on_error, pool)) {
- apr_array_header_t *temp = apr_array_make(pool, 1,
+ if ((range = convert_pl_revision_range(source, &croak_on_error, pool))) {
+ apr_array_header_t *temp = apr_array_make(pool, 1,
sizeof(svn_opt_revision_range_t *));
temp->nelts = 1;
APR_ARRAY_IDX(temp, 0, svn_opt_revision_range_t *) = range;
@@ -302,7 +306,7 @@ const apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
if (SvROK(source) && SvTYPE(SvRV(source)) == SVt_PVAV) {
croak_on_error = TRUE;
- return svn_swig_pl_to_array(source, convert_pl_revision_range,
+ return svn_swig_pl_to_array(source, convert_pl_revision_range,
&croak_on_error, pool);
}
@@ -310,7 +314,7 @@ const apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
/* This return is actually unreachable because of the croak above,
* however, Visual Studio's compiler doesn't like if all paths don't have
- * a return and errors out otherwise. */
+ * a return and errors out otherwise. */
return NULL;
}
@@ -356,17 +360,17 @@ static SV *convert_hash(apr_hash_t *hash, element_converter_t converter_func,
hv = newHV();
for (hi = apr_hash_first(NULL, hash); hi; hi = apr_hash_next(hi)) {
- const char *key;
- void *val;
- int klen;
- SV *obj;
+ const char *key;
+ void *val;
+ int klen;
+ SV *obj;
- apr_hash_this(hi, (void *)&key, NULL, &val);
- klen = strlen(key);
+ apr_hash_this(hi, (void *)&key, NULL, &val);
+ klen = strlen(key);
- obj = converter_func(val, ctx);
- hv_store(hv, (const char *)key, klen, obj, 0);
- SvREFCNT_inc(obj);
+ obj = converter_func(val, ctx);
+ hv_store(hv, (const char *)key, klen, obj, 0);
+ SvREFCNT_inc(obj);
}
return sv_2mortal(newRV_noinc((SV*)hv));
@@ -386,16 +390,16 @@ SV *svn_swig_pl_convert_hash(apr_hash_t *hash, swig_type_info *tinfo)
/* c -> perl array convertors */
static SV *convert_array(const apr_array_header_t *array,
- element_converter_t converter_func, void *ctx)
+ element_converter_t converter_func, void *ctx)
{
AV *list = newAV();
int i;
for (i = 0; i < array->nelts; ++i) {
- void *element = APR_ARRAY_IDX(array, i, void *);
- SV *item = converter_func(element, ctx);
- av_push(list, item);
- SvREFCNT_inc(item);
+ void *element = APR_ARRAY_IDX(array, i, void *);
+ SV *item = converter_func(element, ctx);
+ av_push(list, item);
+ SvREFCNT_inc(item);
}
return sv_2mortal(newRV_noinc((SV*)list));
}
@@ -426,9 +430,10 @@ SV *svn_swig_pl_revnums_to_list(const apr_array_header_t *array)
}
/* perl -> c svn_opt_revision_t conversion */
-svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev,
- SV *source,
- svn_boolean_t croak_on_error)
+svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev,
+ SV *source,
+ svn_boolean_t croak_on_error,
+ apr_pool_t *pool)
{
#define maybe_croak(argv) do { if (croak_on_error) croak argv; \
else return NULL; } while (0)
@@ -462,20 +467,23 @@ svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev,
svn_error_t *err;
char *end = strchr(input,'}');
+ char saved_end;
if (!end)
maybe_croak(("unknown opt_revision_t string \"%s\": "
"missing closing brace for \"{DATE}\"", input));
+ saved_end = *end;
*end = '\0';
- err = svn_parse_date (&matched, &tm, input + 1, apr_time_now(),
- svn_swig_pl_make_pool ((SV *)NULL));
+ err = svn_parse_date (&matched, &tm,
+ input + 1, apr_time_now(), pool);
+ *end = saved_end;
if (err) {
svn_error_clear (err);
- maybe_croak(("unknown opt_revision_t string \"{%s}\": "
- "internal svn_parse_date error", input + 1));
+ maybe_croak(("unknown opt_revision_t string \"%s\": "
+ "internal svn_parse_date error", input));
}
if (!matched)
- maybe_croak(("unknown opt_revision_t string \"{%s}\": "
- "svn_parse_date failed to parse it", input + 1));
+ maybe_croak(("unknown opt_revision_t string \"%s\": "
+ "svn_parse_date failed to parse it", input));
rev->kind = svn_opt_revision_date;
rev->value.date = tm;
@@ -533,85 +541,85 @@ svn_error_t *svn_swig_pl_callback_thunk(perl_func_invoker_t caller_func,
va_start(ap, fmt);
while (*fp) {
- char *c;
- void *o;
- SV *obj;
- swig_type_info *t;
- svn_string_t *str;
-
- switch (*fp++) {
- case 'O':
+ char *c;
+ void *o;
+ SV *obj;
+ swig_type_info *t;
+ svn_string_t *str;
+
+ switch (*fp++) {
+ case 'O':
XPUSHs(va_arg(ap, SV *));
- break;
- case 'S': /* swig object */
+ break;
+ case 'S': /* swig object */
o = va_arg(ap, void *);
t = va_arg(ap, swig_type_info *);
obj = sv_newmortal();
SWIG_MakePtr(obj, o, t, 0);
- XPUSHs(obj);
- break;
+ XPUSHs(obj);
+ break;
- case 's': /* string */
+ case 's': /* string */
c = va_arg(ap, char *);
- XPUSHs(c ? sv_2mortal(newSVpv(c, 0)) : &PL_sv_undef);
- break;
+ XPUSHs(c ? sv_2mortal(newSVpv(c, 0)) : &PL_sv_undef);
+ break;
- case 'i': /* apr_int32_t */
- XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_int32_t))));
- break;
+ case 'i': /* apr_int32_t */
+ XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_int32_t))));
+ break;
- case 'u': /* apr_uint32_t */
+ case 'u': /* apr_uint32_t */
XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_uint32_t))));
- break;
-
- case 'r': /* svn_revnum_t */
- XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_revnum_t))));
- break;
-
- case 'b': /* svn_boolean_t */
- XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_boolean_t))));
- break;
-
- case 't': /* svn_string_t */
- str = va_arg(ap, svn_string_t *);
- XPUSHs(str ? sv_2mortal(newSVpv(str->data, str->len))
- : &PL_sv_undef);
- break;
-
- case 'L': /* apr_int64_t */
- /* Pass into perl as a string because some implementations may
- * not be able to handle a 64-bit int. If it's too long to
- * fit in Perl's interal IV size then perl will only make
- * it available as a string. If not then perl will convert
- * it to an IV for us. So this handles the problem gracefully */
- c = malloc(30);
- snprintf(c,30,"%" APR_INT64_T_FMT,va_arg(ap, apr_int64_t));
- XPUSHs(sv_2mortal(newSVpv(c, 0)));
- free(c);
- break;
-
- case 'U': /* apr_uint64_t */
- c = malloc(30);
- snprintf(c,30,"%" APR_UINT64_T_FMT,va_arg(ap, apr_uint64_t));
- XPUSHs(sv_2mortal(newSVpv(c, 0)));
- free(c);
- break;
-
- case 'z': /* apr_size_t */
- if (sizeof(apr_size_t) >= 8)
- {
- c = malloc(30);
- snprintf(c,30,"%" APR_SIZE_T_FMT,va_arg(ap, apr_size_t));
- XPUSHs(sv_2mortal(newSVpv(c, 0)));
- free(c);
- }
- else
- {
- XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_size_t))));
- }
- break;
- }
+ break;
+
+ case 'r': /* svn_revnum_t */
+ XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_revnum_t))));
+ break;
+
+ case 'b': /* svn_boolean_t */
+ XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_boolean_t))));
+ break;
+
+ case 't': /* svn_string_t */
+ str = va_arg(ap, svn_string_t *);
+ XPUSHs(str ? sv_2mortal(newSVpv(str->data, str->len))
+ : &PL_sv_undef);
+ break;
+
+ case 'L': /* apr_int64_t */
+ /* Pass into perl as a string because some implementations may
+ * not be able to handle a 64-bit int. If it's too long to
+ * fit in Perl's interal IV size then perl will only make
+ * it available as a string. If not then perl will convert
+ * it to an IV for us. So this handles the problem gracefully */
+ c = malloc(30);
+ snprintf(c,30,"%" APR_INT64_T_FMT,va_arg(ap, apr_int64_t));
+ XPUSHs(sv_2mortal(newSVpv(c, 0)));
+ free(c);
+ break;
+
+ case 'U': /* apr_uint64_t */
+ c = malloc(30);
+ snprintf(c,30,"%" APR_UINT64_T_FMT,va_arg(ap, apr_uint64_t));
+ XPUSHs(sv_2mortal(newSVpv(c, 0)));
+ free(c);
+ break;
+
+ case 'z': /* apr_size_t */
+ if (sizeof(apr_size_t) >= 8)
+ {
+ c = malloc(30);
+ snprintf(c,30,"%" APR_SIZE_T_FMT,va_arg(ap, apr_size_t));
+ XPUSHs(sv_2mortal(newSVpv(c, 0)));
+ free(c);
+ }
+ else
+ {
+ XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_size_t))));
+ }
+ break;
+ }
}
va_end(ap);
@@ -620,23 +628,23 @@ svn_error_t *svn_swig_pl_callback_thunk(perl_func_invoker_t caller_func,
switch (caller_func) {
case CALL_SV:
count = call_sv(func, call_flags );
- break;
+ break;
case CALL_METHOD:
count = call_method(func, call_flags );
- break;
+ break;
default:
croak("unkonwn calling type");
- break;
+ break;
}
SPAGAIN ;
if (((call_flags & G_SCALAR) && count != 1) ||
- ((call_flags & G_VOID) && count != 0))
+ ((call_flags & G_VOID) && count != 0))
croak("Wrong number of returns");
if (result) {
- *result = POPs;
- SvREFCNT_inc(*result);
+ *result = POPs;
+ SvREFCNT_inc(*result);
}
PUTBACK;
@@ -789,8 +797,8 @@ static svn_error_t * thunk_close_directory(void *dir_baton,
}
static svn_error_t * thunk_absent_directory(const char *path,
- void *parent_baton,
- apr_pool_t *pool)
+ void *parent_baton,
+ apr_pool_t *pool)
{
item_baton *ib = parent_baton;
@@ -852,8 +860,8 @@ static svn_error_t * thunk_window_handler(svn_txdelta_window_t *window,
SvREFCNT_dec(handler);
}
else {
- swig_type_info *tinfo = _SWIG_TYPE("svn_txdelta_window_t *");
- SVN_ERR(svn_swig_pl_callback_thunk(CALL_SV, handler,
+ swig_type_info *tinfo = _SWIG_TYPE("svn_txdelta_window_t *");
+ SVN_ERR(svn_swig_pl_callback_thunk(CALL_SV, handler,
NULL, "S", window, tinfo));
}
@@ -875,30 +883,30 @@ thunk_apply_textdelta(void *file_baton,
"OOsS", ib->editor, ib->baton,
base_checksum, pool, POOLINFO));
if (SvOK(result)) {
- if (SvROK(result) && SvTYPE(SvRV(result)) == SVt_PVAV) {
- swig_type_info *handler_info =
+ if (SvROK(result) && SvTYPE(SvRV(result)) == SVt_PVAV) {
+ swig_type_info *handler_info =
_SWIG_TYPE("svn_txdelta_window_handler_t");
swig_type_info *void_info = _SWIG_TYPE("void *");
- AV *array = (AV *)SvRV(result);
-
- if (SWIG_ConvertPtr(*av_fetch(array, 0, 0),
- (void **)handler, handler_info,0) < 0) {
- croak("Unable to convert from SWIG Type");
- }
- if (SWIG_ConvertPtr(*av_fetch(array, 1, 0),
- h_baton, void_info,0) < 0) {
- croak("Unable to convert from SWIG Type ");
- }
+ AV *array = (AV *)SvRV(result);
+
+ if (SWIG_ConvertPtr(*av_fetch(array, 0, 0),
+ (void **)handler, handler_info,0) < 0) {
+ croak("Unable to convert from SWIG Type");
+ }
+ if (SWIG_ConvertPtr(*av_fetch(array, 1, 0),
+ h_baton, void_info,0) < 0) {
+ croak("Unable to convert from SWIG Type ");
+ }
SvREFCNT_dec(result);
- }
- else {
- *handler = thunk_window_handler;
- *h_baton = result;
- }
+ }
+ else {
+ *handler = thunk_window_handler;
+ *h_baton = result;
+ }
}
else {
- *handler = svn_delta_noop_window_handler;
- *h_baton = NULL;
+ *handler = svn_delta_noop_window_handler;
+ *h_baton = NULL;
}
return SVN_NO_ERROR;
@@ -936,8 +944,8 @@ static svn_error_t * thunk_close_file(void *file_baton,
}
static svn_error_t * thunk_absent_file(const char *path,
- void *parent_baton,
- apr_pool_t *pool)
+ void *parent_baton,
+ apr_pool_t *pool)
{
item_baton *ib = parent_baton;
@@ -963,10 +971,10 @@ static svn_error_t * thunk_abort_edit(void *edit_baton,
void
-svn_delta_wrap_window_handler(svn_txdelta_window_handler_t *handler,
- void **h_baton,
- SV *callback,
- apr_pool_t *pool)
+svn_swig_pl_wrap_window_handler(svn_txdelta_window_handler_t *handler,
+ void **h_baton,
+ SV *callback,
+ apr_pool_t *pool)
{
*handler = thunk_window_handler;
*h_baton = callback;
@@ -974,10 +982,10 @@ svn_delta_wrap_window_handler(svn_txdelta_window_handler_t *handler,
svn_swig_pl_hold_ref_in_pool(pool, callback);
}
-void svn_delta_make_editor(svn_delta_editor_t **editor,
- void **edit_baton,
- SV *perl_editor,
- apr_pool_t *pool)
+void svn_swig_pl_make_editor(svn_delta_editor_t **editor,
+ void **edit_baton,
+ SV *perl_editor,
+ apr_pool_t *pool)
{
svn_delta_editor_t *thunk_editor = svn_delta_default_editor(pool);
@@ -1004,18 +1012,18 @@ void svn_delta_make_editor(svn_delta_editor_t **editor,
}
svn_error_t *svn_swig_pl_thunk_log_receiver(void *baton,
- apr_hash_t *changed_paths,
- svn_revnum_t rev,
- const char *author,
- const char *date,
- const char *msg,
- apr_pool_t *pool)
+ apr_hash_t *changed_paths,
+ svn_revnum_t rev,
+ const char *author,
+ const char *date,
+ const char *msg,
+ apr_pool_t *pool)
{
SV *receiver = baton;
swig_type_info *tinfo = _SWIG_TYPE("svn_log_changed_path_t *");
if (!SvOK(receiver))
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
svn_swig_pl_callback_thunk(CALL_SV,
receiver, NULL,
@@ -1034,11 +1042,11 @@ svn_error_t *svn_swig_pl_thunk_log_entry_receiver(void *baton,
SV *receiver = baton;
if (!SvOK(receiver))
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
svn_swig_pl_callback_thunk(CALL_SV,
receiver, NULL,
- "SS",
+ "SS",
log_entry, _SWIG_TYPE("svn_log_entry_t *"),
pool, POOLINFO);
@@ -1072,7 +1080,7 @@ svn_error_t *svn_swig_pl_thunk_history_func(void *baton,
SV *func = baton;
if (!SvOK(func))
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
svn_swig_pl_callback_thunk(CALL_SV,
func, NULL,
@@ -1090,7 +1098,7 @@ svn_error_t *svn_swig_pl_thunk_authz_func(svn_boolean_t *allowed,
SV *func = baton, *result;
if (!SvOK(func))
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
svn_swig_pl_callback_thunk(CALL_SV,
func, &result,
@@ -1104,12 +1112,12 @@ svn_error_t *svn_swig_pl_thunk_authz_func(svn_boolean_t *allowed,
}
svn_error_t *svn_swig_pl_thunk_commit_callback(svn_revnum_t new_revision,
- const char *date,
- const char *author,
- void *baton)
+ const char *date,
+ const char *author,
+ void *baton)
{
if (!SvOK((SV *)baton))
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
svn_swig_pl_callback_thunk(CALL_SV, baton, NULL,
"rss", new_revision, date, author);
@@ -1136,8 +1144,8 @@ svn_error_t *svn_swig_pl_thunk_commit_callback2(const svn_commit_info_t *commit_
/* Wrap RA */
static svn_error_t * thunk_open_tmp_file(apr_file_t **fp,
- void *callback_baton,
- apr_pool_t *pool)
+ void *callback_baton,
+ apr_pool_t *pool)
{
SV *result;
swig_type_info *tinfo = _SWIG_TYPE("apr_file_t *");
@@ -1146,7 +1154,7 @@ static svn_error_t * thunk_open_tmp_file(apr_file_t **fp,
&result, "OS", callback_baton, pool, POOLINFO);
if (SWIG_ConvertPtr(result, (void *)fp, tinfo,0) < 0) {
- croak("Unable to convert from SWIG Type");
+ croak("Unable to convert from SWIG Type");
}
SvREFCNT_dec(result);
@@ -1169,15 +1177,15 @@ svn_error_t *thunk_get_wc_prop(void *baton,
/* this is svn_string_t * typemap in */
if (!SvOK(result) || result == &PL_sv_undef) {
- *value = NULL;
+ *value = NULL;
}
else if (SvPOK(result)) {
data = SvPV(result, len);
*value = svn_string_ncreate(data, len, pool);
}
else {
- SvREFCNT_dec(result);
- croak("not a string");
+ SvREFCNT_dec(result);
+ croak("not a string");
}
SvREFCNT_dec(result);
@@ -1185,10 +1193,10 @@ svn_error_t *thunk_get_wc_prop(void *baton,
}
-svn_error_t *svn_ra_make_callbacks(svn_ra_callbacks_t **cb,
- void **c_baton,
- SV *perl_callbacks,
- apr_pool_t *pool)
+svn_error_t *svn_swig_pl_make_callbacks(svn_ra_callbacks_t **cb,
+ void **c_baton,
+ SV *perl_callbacks,
+ apr_pool_t *pool)
{
SV *auth_baton;
@@ -1203,7 +1211,7 @@ svn_error_t *svn_ra_make_callbacks(svn_ra_callbacks_t **cb,
if (SWIG_ConvertPtr(auth_baton,
(void **)&(*cb)->auth_baton, _SWIG_TYPE("svn_auth_baton_t *"),0) < 0) {
- croak("Unable to convert from SWIG Type");
+ croak("Unable to convert from SWIG Type");
}
*c_baton = perl_callbacks;
svn_swig_pl_hold_ref_in_pool(pool, perl_callbacks);
@@ -1357,13 +1365,13 @@ svn_error_t *svn_swig_pl_thunk_ssl_client_cert_pw_prompt(
/* Thunked version of svn_wc_notify_func_t callback type */
void svn_swig_pl_notify_func(void * baton,
- const char *path,
- svn_wc_notify_action_t action,
- svn_node_kind_t kind,
- const char *mime_type,
- svn_wc_notify_state_t content_state,
- svn_wc_notify_state_t prop_state,
- svn_revnum_t revision)
+ const char *path,
+ svn_wc_notify_action_t action,
+ svn_node_kind_t kind,
+ const char *mime_type,
+ svn_wc_notify_state_t content_state,
+ svn_wc_notify_state_t prop_state,
+ svn_revnum_t revision)
{
if (!SvOK((SV *)baton)) {
return;
@@ -1392,7 +1400,7 @@ svn_error_t *svn_swig_pl_get_commit_log_func(const char **log_msg,
if (!SvOK((SV *)baton)) {
*log_msg = apr_pstrdup(pool, "");
- *tmp_file = NULL;
+ *tmp_file = NULL;
return SVN_NO_ERROR;
}
@@ -1410,17 +1418,17 @@ svn_error_t *svn_swig_pl_get_commit_log_func(const char **log_msg,
/* client returned undef to us */
*log_msg = NULL;
} else if (SvPOK(SvRV(log_msg_sv))) {
- /* client returned string so get the string and then duplicate
- * it using pool memory */
+ /* client returned string so get the string and then duplicate
+ * it using pool memory */
*log_msg = apr_pstrdup(pool, SvPV_nolen(SvRV(log_msg_sv)));
} else {
croak("Invalid value in log_msg reference, must be undef or a string");
}
if (!SvOK(SvRV(tmp_file_sv))) {
- *tmp_file = NULL;
+ *tmp_file = NULL;
} else if (SvPOK(SvRV(tmp_file_sv))) {
- *tmp_file = apr_pstrdup(pool, SvPV_nolen(SvRV(tmp_file_sv)));
+ *tmp_file = apr_pstrdup(pool, SvPV_nolen(SvRV(tmp_file_sv)));
} else {
croak("Invalid value in tmp_file reference, "
"must be undef or a string");
@@ -1428,9 +1436,9 @@ svn_error_t *svn_swig_pl_get_commit_log_func(const char **log_msg,
if (sv_derived_from(result, "_p_svn_error_t")) {
swig_type_info *errorinfo = _SWIG_TYPE("svn_error_t *");
- if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
+ if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
SvREFCNT_dec(result);
- croak("Unable to convert from SWIG Type");
+ croak("Unable to convert from SWIG Type");
}
}
@@ -1481,10 +1489,10 @@ svn_error_t *svn_swig_pl_cancel_func(void *cancel_baton) {
if (sv_derived_from(result,"_p_svn_error_t")) {
swig_type_info *errorinfo = _SWIG_TYPE("svn_error_t *");
- if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
- SvREFCNT_dec(result);
- croak("Unable to convert from SWIG Type");
- }
+ if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
+ SvREFCNT_dec(result);
+ croak("Unable to convert from SWIG Type");
+ }
} else if (SvIOK(result) && SvIV(result)) {
ret_val = svn_error_create(SVN_ERR_CANCELLED, NULL,
"By cancel callback");
@@ -1580,9 +1588,9 @@ svn_error_t *svn_swig_pl_blame_func(void *baton,
if (sv_derived_from(result, "_p_svn_error_t")) {
swig_type_info *errorinfo = _SWIG_TYPE("svn_error_t *");
- if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
+ if (SWIG_ConvertPtr(result, (void *)&ret_val, errorinfo, 0) < 0) {
SvREFCNT_dec(result);
- croak("Unable to convert from SWIG Type");
+ croak("Unable to convert from SWIG Type");
}
}
@@ -1595,7 +1603,7 @@ svn_boolean_t svn_swig_pl_thunk_config_enumerator(const char *name, const char *
{
SV *result;
if (!SvOK((SV *)baton))
- return 0;
+ return 0;
svn_swig_pl_callback_thunk(CALL_SV, baton, &result,
"ss", name, value);
@@ -1606,21 +1614,33 @@ svn_boolean_t svn_swig_pl_thunk_config_enumerator(const char *name, const char *
/* default pool support */
-#if defined(SVN_AVOID_CIRCULAR_LINKAGE_AT_ALL_COSTS_HACK)
-static svn_swig_pl_get_current_pool_t svn_swig_pl_get_current_pool = NULL;
-static svn_swig_pl_set_current_pool_t svn_swig_pl_set_current_pool = NULL;
+static svn_swig_pl_get_current_pool_func_t get_current_pool_cb = NULL;
+static svn_swig_pl_set_current_pool_func_t set_current_pool_cb = NULL;
-void svn_swig_pl_bind_current_pool_fns(svn_swig_pl_get_current_pool_t get,
- svn_swig_pl_set_current_pool_t set)
+void
+svn_swig_pl__bind_current_pool_fns(svn_swig_pl_get_current_pool_func_t get,
+ svn_swig_pl_set_current_pool_func_t set)
{
- svn_swig_pl_get_current_pool = get;
- svn_swig_pl_set_current_pool = set;
+ /* This function should only be called ONCE, otherwise there are two
+ global variables CURRENT_POOL */
+ SVN_ERR_ASSERT_NO_RETURN(get_current_pool_cb == NULL
+ && set_current_pool_cb == NULL);
+
+ get_current_pool_cb = get;
+ set_current_pool_cb = set;
}
-#else
-apr_pool_t *svn_swig_pl_get_current_pool(void);
-void svn_swig_pl_set_current_pool(apr_pool_t *pool);
-#endif
+apr_pool_t * svn_swig_pl_get_current_pool()
+{
+ SVN_ERR_ASSERT_NO_RETURN(get_current_pool_cb != NULL);
+ return get_current_pool_cb();
+}
+
+void svn_swig_pl_set_current_pool(apr_pool_t *pool)
+{
+ SVN_ERR_ASSERT_NO_RETURN(set_current_pool_cb != NULL);
+ set_current_pool_cb(pool);
+}
apr_pool_t *svn_swig_pl_make_pool(SV *obj)
{
@@ -1628,12 +1648,12 @@ apr_pool_t *svn_swig_pl_make_pool(SV *obj)
if (obj && sv_isobject(obj)) {
if (sv_derived_from(obj, "SVN::Pool")) {
- obj = SvRV(obj);
- }
- if (sv_derived_from(obj, "_p_apr_pool_t")) {
- SWIG_ConvertPtr(obj, (void **)&pool, POOLINFO, 0);
- return pool;
- }
+ obj = SvRV(obj);
+ }
+ if (sv_derived_from(obj, "_p_apr_pool_t")) {
+ SWIG_ConvertPtr(obj, (void **)&pool, POOLINFO, 0);
+ return pool;
+ }
}
if (!svn_swig_pl_get_current_pool())
@@ -1658,15 +1678,15 @@ static svn_error_t *io_handle_read(void *baton,
MAGIC *mg;
if ((mg = SvTIED_mg((SV*)io->io, PERL_MAGIC_tiedscalar))) {
- SV *ret;
- SV *buf = sv_newmortal();
+ SV *ret;
+ SV *buf = sv_newmortal();
- svn_swig_pl_callback_thunk(CALL_METHOD, (void *)"READ", &ret, "OOz",
+ svn_swig_pl_callback_thunk(CALL_METHOD, (void *)"READ", &ret, "OOz",
SvTIED_obj((SV*)io->io, mg),
buf, *len);
- *len = SvIV(ret);
- SvREFCNT_dec(ret);
- memmove(buffer, SvPV_nolen(buf), *len);
+ *len = SvIV(ret);
+ SvREFCNT_dec(ret);
+ memmove(buffer, SvPV_nolen(buf), *len);
}
else
*len = PerlIO_read(IoIFP(io->io), buffer, *len);
@@ -1681,12 +1701,12 @@ static svn_error_t *io_handle_write(void *baton,
MAGIC *mg;
if ((mg = SvTIED_mg((SV*)io->io, PERL_MAGIC_tiedscalar))) {
- SV *ret, *pv;
+ SV *ret, *pv;
pv = sv_2mortal(newSVpvn(data, *len));
- svn_swig_pl_callback_thunk(CALL_METHOD, (void *)"WRITE", &ret, "OOz",
+ svn_swig_pl_callback_thunk(CALL_METHOD, (void *)"WRITE", &ret, "OOz",
SvTIED_obj((SV*)io->io, mg), pv, *len);
- *len = SvIV(ret);
- SvREFCNT_dec(ret);
+ *len = SvIV(ret);
+ SvREFCNT_dec(ret);
}
else
*len = PerlIO_write(IoIFP(io->io), data, *len);
@@ -1730,7 +1750,7 @@ svn_error_t *svn_swig_pl_make_stream(svn_stream_t **stream, SV *obj)
if (sv_derived_from(obj, "SVN::Stream"))
svn_swig_pl_callback_thunk(CALL_METHOD, (void *)"svn_stream",
&obj, "O", obj);
- else if (!sv_derived_from(obj, "_p_svn_stream_t"))
+ else if (!sv_derived_from(obj, "_p_svn_stream_t"))
simple_type = 0;
if (simple_type) {
@@ -1740,17 +1760,18 @@ svn_error_t *svn_swig_pl_make_stream(svn_stream_t **stream, SV *obj)
}
if (obj && SvROK(obj) && SvTYPE(SvRV(obj)) == SVt_PVGV &&
- (io = GvIO(SvRV(obj)))) {
- apr_pool_t *pool = svn_swig_pl_get_current_pool();
- io_baton_t *iob = apr_palloc(pool, sizeof(io_baton_t));
- SvREFCNT_inc(obj);
- iob->obj = obj;
- iob->io = io;
- *stream = svn_stream_create(iob, pool);
- svn_stream_set_read(*stream, io_handle_read);
- svn_stream_set_write(*stream, io_handle_write);
- svn_stream_set_close(*stream, io_handle_close);
- apr_pool_cleanup_register(pool, iob, io_handle_cleanup,
+ (io = GvIO(SvRV(obj)))) {
+ apr_pool_t *pool = svn_swig_pl_get_current_pool();
+ io_baton_t *iob = apr_palloc(pool, sizeof(io_baton_t));
+ SvREFCNT_inc(obj);
+ iob->obj = obj;
+ iob->io = io;
+ *stream = svn_stream_create(iob, pool);
+ svn_stream_set_read2(*stream, NULL /* only full read support */,
+ io_handle_read);
+ svn_stream_set_write(*stream, io_handle_write);
+ svn_stream_set_close(*stream, io_handle_close);
+ apr_pool_cleanup_register(pool, iob, io_handle_cleanup,
io_handle_cleanup);
}
@@ -1794,7 +1815,7 @@ apr_file_t *svn_swig_pl_make_file(SV *file, apr_pool_t *pool)
apr_file_t *apr_file = NULL;
if (!SvOK(file) || file == &PL_sv_undef)
- return NULL;
+ return NULL;
if (SvPOKp(file)) {
apr_file_open(&apr_file, SvPV_nolen(file),
diff --git a/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
index 3eae82e..f6db304 100644
--- a/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
+++ b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
@@ -59,14 +59,14 @@ extern "C" {
#endif
+typedef apr_pool_t *(*svn_swig_pl_get_current_pool_func_t)(void);
+typedef void (*svn_swig_pl_set_current_pool_func_t)(apr_pool_t *pool);
-#if defined(SVN_AVOID_CIRCULAR_LINKAGE_AT_ALL_COSTS_HACK)
-typedef apr_pool_t *(*svn_swig_pl_get_current_pool_t)(void);
-typedef void (*svn_swig_pl_set_current_pool_t)(apr_pool_t *pool);
+void svn_swig_pl__bind_current_pool_fns(svn_swig_pl_get_current_pool_func_t get,
+ svn_swig_pl_set_current_pool_func_t set);
-void svn_swig_pl_bind_current_pool_fns(svn_swig_pl_get_current_pool_t get,
- svn_swig_pl_set_current_pool_t set);
-#endif
+apr_pool_t * svn_swig_pl_get_current_pool();
+void svn_swig_pl_set_current_pool(apr_pool_t *pool);
apr_pool_t *svn_swig_pl_make_pool(SV *obj);
@@ -83,9 +83,7 @@ svn_error_t *svn_swig_pl_callback_thunk(perl_func_invoker_t caller_func,
SV *svn_swig_pl_prophash_to_hash(apr_hash_t *hash);
SV *svn_swig_pl_convert_hash(apr_hash_t *hash, swig_type_info *tinfo);
-SV *svn_swig_pl_convert_hash_of_revnum_t(apr_hash_t *hash);
-
-const apr_array_header_t *svn_swig_pl_strings_to_array(SV *source,
+apr_array_header_t *svn_swig_pl_strings_to_array(SV *source,
apr_pool_t *pool);
apr_hash_t *svn_swig_pl_strings_to_hash(SV *source,
@@ -98,24 +96,22 @@ apr_hash_t *svn_swig_pl_objs_to_hash_by_name(SV *source,
apr_hash_t *svn_swig_pl_objs_to_hash_of_revnum_t(SV *source,
apr_pool_t *pool);
apr_hash_t *svn_swig_pl_hash_to_prophash(SV *source, apr_pool_t *pool);
-const apr_array_header_t *svn_swig_pl_objs_to_array(SV *source,
+apr_array_header_t *svn_swig_pl_objs_to_array(SV *source,
swig_type_info *tinfo,
apr_pool_t *pool);
-const apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
+apr_array_header_t *svn_swig_pl_array_to_apr_array_revision_range(
SV *source, apr_pool_t *pool);
SV *svn_swig_pl_array_to_list(const apr_array_header_t *array);
-/* Formerly used by pre-1.0 APIs. Now unused
-SV *svn_swig_pl_ints_to_list(const apr_array_header_t *array);
-*/
SV *svn_swig_pl_convert_array(const apr_array_header_t *array,
swig_type_info *tinfo);
SV *svn_swig_pl_revnums_to_list(const apr_array_header_t *array);
-svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev,
+svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev,
SV *source,
- svn_boolean_t croak_on_error);
+ svn_boolean_t croak_on_error,
+ apr_pool_t *pool);
/* thunked log_message receiver function. */
svn_error_t * svn_swig_pl_thunk_log_receiver(void *baton,
@@ -139,9 +135,9 @@ svn_error_t * svn_swig_pl_thunk_client_diff_summarize_func(
/* thunked commit editor callback. */
svn_error_t *svn_swig_pl_thunk_commit_callback(svn_revnum_t new_revision,
- const char *date,
- const char *author,
- void *baton);
+ const char *date,
+ const char *author,
+ void *baton);
/* thunked commit editor callback2. */
svn_error_t *svn_swig_pl_thunk_commit_callback2(const svn_commit_info_t *commit_info,
@@ -162,10 +158,10 @@ svn_error_t *svn_swig_pl_thunk_authz_func(svn_boolean_t *allowed,
apr_pool_t *pool);
/* ra callbacks. */
-svn_error_t *svn_ra_make_callbacks(svn_ra_callbacks_t **cb,
- void **c_baton,
- SV *perl_callbacks,
- apr_pool_t *pool);
+svn_error_t *svn_swig_pl_make_callbacks(svn_ra_callbacks_t **cb,
+ void **c_baton,
+ SV *perl_callbacks,
+ apr_pool_t *pool);
/* thunked gnome_keyring_unlock_prompt callback function */
svn_error_t *svn_swig_pl_thunk_gnome_keyring_unlock_prompt(char **keyring_password,
@@ -223,12 +219,12 @@ svn_error_t *thunk_get_wc_prop(void *baton,
/* Thunked version of svn_wc_notify_func_t callback type */
void svn_swig_pl_notify_func(void * baton,
const char *path,
- svn_wc_notify_action_t action,
- svn_node_kind_t kind,
- const char *mime_type,
- svn_wc_notify_state_t content_state,
- svn_wc_notify_state_t prop_state,
- svn_revnum_t revision);
+ svn_wc_notify_action_t action,
+ svn_node_kind_t kind,
+ const char *mime_type,
+ svn_wc_notify_state_t content_state,
+ svn_wc_notify_state_t prop_state,
+ svn_revnum_t revision);
/* Thunked version of svn_client_get_commit_log3_t callback type. */
@@ -277,15 +273,15 @@ svn_error_t *svn_swig_pl_blame_func(void *baton,
svn_boolean_t svn_swig_pl_thunk_config_enumerator(const char *name, const char *value, void *baton);
/* helper for making the editor */
-void svn_delta_make_editor(svn_delta_editor_t **editor,
- void **edit_baton,
- SV *perl_editor,
- apr_pool_t *pool);
-
-void svn_delta_wrap_window_handler(svn_txdelta_window_handler_t *handler,
- void **h_baton,
- SV *callback,
- apr_pool_t *pool);
+void svn_swig_pl_make_editor(svn_delta_editor_t **editor,
+ void **edit_baton,
+ SV *perl_editor,
+ apr_pool_t *pool);
+
+void svn_swig_pl_wrap_window_handler(svn_txdelta_window_handler_t *handler,
+ void **h_baton,
+ SV *callback,
+ apr_pool_t *pool);
/* svn_stream_t helpers */
svn_error_t *svn_swig_pl_make_stream(svn_stream_t **stream, SV *obj);
diff --git a/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl__pre_perl.h b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl__pre_perl.h
new file mode 100644
index 0000000..fadf490
--- /dev/null
+++ b/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl__pre_perl.h
@@ -0,0 +1,33 @@
+/*
+ *
+ * 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_SWIG_SWIGUTIL_PL__PRE_PERL_H
+#define SVN_SWIG_SWIGUTIL_PL__PRE_PERL_H
+
+/* Ruby 5.8 somehow expects Visual C++ to be gcc compatible for __inline__.
+ Add a #define to make the default headers happy and avoid an insane
+ number of warnings */
+
+#ifdef _MSC_VER
+#define __inline__ __inline
+#endif
+
+#endif
diff --git a/subversion/bindings/swig/perl/native/Client.pm b/subversion/bindings/swig/perl/native/Client.pm
index 10da064..f4b1f06 100644
--- a/subversion/bindings/swig/perl/native/Client.pm
+++ b/subversion/bindings/swig/perl/native/Client.pm
@@ -41,30 +41,35 @@ SVN::Client - Subversion client functions
=head1 SYNOPSIS
use SVN::Client;
- my $client = new SVN::Client(
- auth => [
- SVN::Client::get_simple_provider(),
- SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),
- SVN::Client::get_username_provider()
- ]);
-
- $client->cat(\*STDOUT,
- 'http://svn.apache.org/repos/asf/subversion/trunk/README', 'HEAD');
-
- sub simple_prompt {
- my ($cred, $realm, $default_username, $may_save, $pool) = @_;
-
- print "Enter authentication info for realm: $realm\n";
- print "Username: ";
- my $username = <>;
- chomp($username);
- $cred->username($username);
- print "Password: ";
- my $password = <>;
- chomp($password);
- $cred->password($password);
+ my $client = new SVN::Client();
+
+ # setup to handle authentication the same as the command line client
+ my $config_dir = undef; # use default location
+ my $config = SVN:Core::config_get_config($config_dir);
+ my $config_category = $cfg->{SVN::Core::CONFIG_CATEGORY_CONFIG};
+ $client->auth(
+ SVN::Core::cmdline_create_auth_baton(0, #non_interactive
+ undef, #username
+ undef, #password
+ $config_dir,
+ 0, #no_auth_cache
+ 0, #trust_server_cert
+ $config_category,
+ undef) #cancel_callback
+ );
+
+ # Use first argument as target and canonicalize it before using
+ my $target;
+ if (SVN::Core::path_is_url($ARGV[0])) {
+ $target = SVN::Core::uri_canonicalize($ARGV[0]);
+ } else {
+ $target = SVN::Core::dirent_canonicalize($ARGV[0]);
}
+ # fetch the head revision of the target
+ $client->cat(\*STDOUT, $target, 'HEAD');
+
+
=head1 DESCRIPTION
SVN::Client wraps the highest level of functions provided by
@@ -111,18 +116,24 @@ This is a URL to a subversion repository.
=item $path
-This is a path to a file or directory on the local file system.
+This is a path to a file or directory on the local file system. Paths need
+to be canonicalized before being passed into the Subversion APIs. Paths on
+the local file system are called dirents and can be canonicalized by calling
+C<SVN::Core::dirent_canonicalize>.
=item $paths
-This argument can either be a single path to a file or directory on the local
-file system, or it can be a reference to an array of files or directories on
-the local file system.
+This argument can either be a single $path (as defined above) or a reference
+to an array of them.
=item $target
This is a path to a file or directory in a working copy or a URL to a file or
-directory in a subversion repository.
+directory in a subversion repository. Both paths and URLs need to be
+canonicalized before being passed into the Subversion APIs. Paths on the local
+file system are called dirents and can be canonicalized by calling
+C<SVN::Core::dirent_canonicalize>. URLs can be canonicalized by calling
+C<SVN::Core::uri_canonicalize>.
=item $targets
@@ -748,7 +759,7 @@ object.
Else, create the directories on disk, and attempt to schedule them for addition.
In this case returns undef.
-If $make_parents is TRUE, create any non-existant parent directories also.
+If $make_parents is TRUE, create any non-existent parent directories also.
If not undef, $revprop_hash is a reference to a hash table holding additional
custom revision properites (property names mapped to strings) to be set on the
@@ -958,10 +969,10 @@ $path, $status, $pool
$path is the pathname of the file or directory which status is being
reported. $status is a svn_wc_status2_t object. $pool is an apr_pool_t
-object which is cleaned beteween invocations to the callback.
+object which is cleaned between invocations to the callback.
The return of the status_func subroutine can be a svn_error_t object created by
-SVN::Error::create in order to propogate an error up.
+SVN::Error::create in order to propagate an error up.
=item $client-E<gt>switch($path, $url, $revision, $recursive, $pool);
@@ -1274,24 +1285,8 @@ sub log_msg {
=item $client-E<gt>cancel(\&cancel)
Sets the cancellation callback for the client context to a code reference that you
-pass. It always returns the current codereference set.
-
-The subroutine pointed to by this value will be called to see if the operation
-should be canceled. If the operation should be canceled, the function may
-return one of the following values:
-
-An svn_error_t object made with SVN::Error::create.
-
-Any true value, in which case the bindings will generate an svn_error_t object
-for you with the error code of SVN_ERR_CANCELLED and the string set to "By
-cancel callback".
-
-A string, in which case the bindings will generate an svn_error_t object for you
-with the error code of SVN_ERR_CANCELLED and the string set to the string you
-returned.
-
-Any other value will be interpreted as wanting to continue the operation.
-Generally, it's best to return 0 to continue the operation.
+pass. See L<"CANCELLATION CALLBACK"> below for details.
+It always returns the current codereference set.
=cut
@@ -1477,6 +1472,25 @@ may_save.
=back
+=head1 CANCELLATION CALLBACK
+
+This callback will be called periodically to see if the operation
+should be canceled. If the operation should be canceled, the function may
+return one of the following values:
+
+An svn_error_t object made with SVN::Error::create.
+
+Any true value, in which case the bindings will generate an svn_error_t object
+for you with the error code of SVN_ERR_CANCELLED and the string set to "By
+cancel callback".
+
+A string, in which case the bindings will generate an svn_error_t object for you
+with the error code of SVN_ERR_CANCELLED and the string set to the string you
+returned.
+
+Any other value will be interpreted as wanting to continue the operation.
+Generally, it's best to return 0 to continue the operation.
+
=head1 OBJECTS
These are some of the object types that are returned from the methods
diff --git a/subversion/bindings/swig/perl/native/Makefile.PL.in b/subversion/bindings/swig/perl/native/Makefile.PL.in
index a60430b..a303d30 100644
--- a/subversion/bindings/swig/perl/native/Makefile.PL.in
+++ b/subversion/bindings/swig/perl/native/Makefile.PL.in
@@ -40,7 +40,7 @@ my @modules = qw/client delta fs ra repos wc/;
my @ldpaths = (abs_path($swig_builddir) . "/perl/libsvn_swig_perl/.libs",
map { abs_path($svnlib_builddir) . "/libsvn_$_/.libs" }
@modules, qw/diff subr ra_local ra_svn ra_serf
- fs_base fs_util fs_fs/);
+ fs_base fs_util fs_fs fs_x/);
my @ldmodules = map {"-lsvn_$_-1"} (@modules, qw/diff subr/);
diff --git a/subversion/bindings/swig/perl/native/Repos.pm b/subversion/bindings/swig/perl/native/Repos.pm
index 02d37fc..bd6d7bc 100644
--- a/subversion/bindings/swig/perl/native/Repos.pm
+++ b/subversion/bindings/swig/perl/native/Repos.pm
@@ -42,9 +42,9 @@ object.
=over
-=item $repos-E<gt>dump_fs($dump_fh, $feedback_fh, $start_rev, $end_rev, $incremental, $cancel_func, $cancel_baton)
+=item $repos-E<gt>dump_fs($dump_fh, $feedback_fh, $start_rev, $end_rev, $incremental, $cancel_callback)
-=item $repos-E<gt>dump_fs2($dump_fh, $feedback_fh, $start_rev, $end_rev, $incremental, $deltify, $cancel_func, $cancel_baton)
+=item $repos-E<gt>dump_fs2($dump_fh, $feedback_fh, $start_rev, $end_rev, $incremental, $deltify, $cancel_callback)
Create a dump file of the repository from revision C<$start_rev> to C<$end_rev>
, store it into the filehandle C<$dump_fh>, and write feedback on the progress
@@ -61,10 +61,9 @@ this flag is set, the first revision of a non-incremental dump will
be done with full plain text. A dump with @a use_deltas set cannot
be loaded by Subversion 1.0.x.
-According to svn_repos.h, the C<$cancel_func> is a function that is called
-periodically and given C<$cancel_baton> as a parameter to determine whether
-the client wishes to cancel the dump. You must supply C<undef> at the very
-least.
+If C<$cancel_callback> is not C<undef>, it must be a code reference
+that is called periodically to determine whether the client wishes
+to cancel the dump. See L<SVN::Client/"CANCELLATION CALLBACK"> for details.
Example:
@@ -83,13 +82,13 @@ Example:
$repos->dump_fs2($fh, \*STDOUT, # Dump file => $fh, Feedback => STDOUT
$start_rev, $end_rev, # Revision Range
$incremental, $deltify, # Options
- undef, undef); # Cancel Function
+ undef); # Cancel Callback
close $fh;
-=item $repos-E<gt>load_fs($dumpfile_fh, $feedback_fh, $uuid_action, $parent_dir, $cancel_func, $cancel_baton);
+=item $repos-E<gt>load_fs($dumpfile_fh, $feedback_fh, $uuid_action, $parent_dir, $cancel_callback);
-=item $repos-E<gt>load_fs2($dumpfile_fh, $feedback_fh, $uuid_action, $parent_dir, $use_pre_commit_hook, $use_post_commit_hook, $cancel_func, $cancel_baton);
+=item $repos-E<gt>load_fs2($dumpfile_fh, $feedback_fh, $uuid_action, $parent_dir, $use_pre_commit_hook, $use_post_commit_hook, $cancel_callback);
Loads a dumpfile specified by the C<$dumpfile_fh> filehandle into the repository.
If the dumpstream contains copy history that is unavailable in the repository,
@@ -113,11 +112,11 @@ hook before committing each loaded revision.
If C<$use_post_commit_hook> is set, call the repository's
post-commit hook after committing each loaded revision.
-If C<$cancel_func> is not NULL, it is called periodically with
-C<$cancel_baton> as argument to see if the client wishes to cancel
-the load.
+If C<$cancel_callback> is not C<undef>, it must be a code reference
+that is called periodically to determine whether the client wishes
+to cancel the load. See L<SVN::Client/"CANCELLATION CALLBACK"> for details.
-You must at least provide undef for these parameters for the method call
+You must at least provide C<undef> for these parameters for the method call
to work.
Example:
diff --git a/subversion/bindings/swig/perl/native/core.c b/subversion/bindings/swig/perl/native/core.c
index 5078f5c..96304a2 100644
--- a/subversion/bindings/swig/perl/native/core.c
+++ b/subversion/bindings/swig/perl/native/core.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1501,32 +1490,32 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_apr_finfo_t swig_types[5]
#define SWIGTYPE_p_apr_getopt_option_t swig_types[6]
#define SWIGTYPE_p_apr_getopt_t swig_types[7]
-#define SWIGTYPE_p_apr_hash_index_t swig_types[8]
-#define SWIGTYPE_p_apr_hash_t swig_types[9]
-#define SWIGTYPE_p_apr_int32_t swig_types[10]
-#define SWIGTYPE_p_apr_int64_t swig_types[11]
-#define SWIGTYPE_p_apr_off_t swig_types[12]
-#define SWIGTYPE_p_apr_pool_t swig_types[13]
-#define SWIGTYPE_p_apr_proc_t swig_types[14]
-#define SWIGTYPE_p_apr_size_t swig_types[15]
-#define SWIGTYPE_p_apr_uint32_t swig_types[16]
-#define SWIGTYPE_p_char swig_types[17]
-#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[21]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[30]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[31]
-#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[32]
-#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[33]
+#define SWIGTYPE_p_apr_hash_t swig_types[8]
+#define SWIGTYPE_p_apr_int32_t swig_types[9]
+#define SWIGTYPE_p_apr_int64_t swig_types[10]
+#define SWIGTYPE_p_apr_off_t swig_types[11]
+#define SWIGTYPE_p_apr_pool_t swig_types[12]
+#define SWIGTYPE_p_apr_proc_t swig_types[13]
+#define SWIGTYPE_p_apr_size_t swig_types[14]
+#define SWIGTYPE_p_apr_uint32_t swig_types[15]
+#define SWIGTYPE_p_char swig_types[16]
+#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[20]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[29]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[30]
+#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[31]
+#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[32]
+#define SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int swig_types[33]
#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[34]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[35]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[36]
@@ -1544,106 +1533,107 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t swig_types[48]
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t swig_types[49]
#define SWIGTYPE_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t swig_types[50]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_f_p_void_p_void__void swig_types[52]
-#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[54]
-#define SWIGTYPE_p_f_svn_boolean_t_p_q_const__char_int_p_q_const__char__p_svn_error_t swig_types[55]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[56]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[57]
-#define SWIGTYPE_p_int swig_types[58]
-#define SWIGTYPE_p_long swig_types[59]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[60]
-#define SWIGTYPE_p_p_apr_file_t swig_types[61]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[62]
-#define SWIGTYPE_p_p_char swig_types[63]
-#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[64]
-#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[65]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[66]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[67]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[68]
-#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[69]
-#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[70]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[71]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[72]
-#define SWIGTYPE_p_p_svn_config_t swig_types[73]
-#define SWIGTYPE_p_p_svn_diff_t swig_types[74]
-#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[75]
-#define SWIGTYPE_p_p_svn_patch_file_t swig_types[76]
-#define SWIGTYPE_p_p_svn_patch_t swig_types[77]
-#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[78]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[79]
-#define SWIGTYPE_p_p_svn_string_t swig_types[80]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[81]
-#define SWIGTYPE_p_p_void swig_types[82]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[83]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[84]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[85]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[86]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[87]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[88]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[89]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[90]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[91]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[92]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[93]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[94]
-#define SWIGTYPE_p_svn_checksum_t swig_types[95]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[96]
-#define SWIGTYPE_p_svn_config_t swig_types[97]
-#define SWIGTYPE_p_svn_depth_t swig_types[98]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[99]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[100]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[101]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[102]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[103]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[104]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[105]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[106]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[107]
-#define SWIGTYPE_p_svn_diff_t swig_types[108]
-#define SWIGTYPE_p_svn_dirent_t swig_types[109]
-#define SWIGTYPE_p_svn_errno_t swig_types[110]
-#define SWIGTYPE_p_svn_error_t swig_types[111]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[112]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[113]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[114]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[115]
-#define SWIGTYPE_p_svn_lock_t swig_types[116]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[117]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[118]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[119]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[120]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[121]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[122]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[123]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[124]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[125]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[126]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[127]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[128]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[129]
-#define SWIGTYPE_p_svn_patch_t swig_types[130]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[131]
-#define SWIGTYPE_p_svn_prop_kind swig_types[132]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[133]
-#define SWIGTYPE_p_svn_prop_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[135]
-#define SWIGTYPE_p_svn_stream_t swig_types[136]
-#define SWIGTYPE_p_svn_string_t swig_types[137]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[138]
-#define SWIGTYPE_p_svn_tristate_t swig_types[139]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[140]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[141]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[142]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[143]
-#define SWIGTYPE_p_svn_version_t swig_types[144]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[145]
-#define SWIGTYPE_p_unsigned_char swig_types[146]
-#define SWIGTYPE_p_unsigned_long swig_types[147]
-#define SWIGTYPE_p_void swig_types[148]
-static swig_type_info *swig_types[150];
-static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t swig_types[51]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[53]
+#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_f_svn_boolean_t_p_q_const__char_int_p_q_const__char__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[57]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[58]
+#define SWIGTYPE_p_int swig_types[59]
+#define SWIGTYPE_p_long swig_types[60]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[61]
+#define SWIGTYPE_p_p_apr_file_t swig_types[62]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[63]
+#define SWIGTYPE_p_p_char swig_types[64]
+#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[65]
+#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[66]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[67]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[68]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[69]
+#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[70]
+#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[71]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[72]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[73]
+#define SWIGTYPE_p_p_svn_config_t swig_types[74]
+#define SWIGTYPE_p_p_svn_diff_t swig_types[75]
+#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[76]
+#define SWIGTYPE_p_p_svn_patch_file_t swig_types[77]
+#define SWIGTYPE_p_p_svn_patch_t swig_types[78]
+#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[79]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[80]
+#define SWIGTYPE_p_p_svn_string_t swig_types[81]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[82]
+#define SWIGTYPE_p_p_void swig_types[83]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[84]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[85]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[86]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[87]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[88]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[89]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[90]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[91]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[92]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[93]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[94]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[95]
+#define SWIGTYPE_p_svn_checksum_t swig_types[96]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[97]
+#define SWIGTYPE_p_svn_config_t swig_types[98]
+#define SWIGTYPE_p_svn_depth_t swig_types[99]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[100]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[101]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[102]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[103]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[104]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[105]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[106]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[107]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[108]
+#define SWIGTYPE_p_svn_diff_t swig_types[109]
+#define SWIGTYPE_p_svn_dirent_t swig_types[110]
+#define SWIGTYPE_p_svn_errno_t swig_types[111]
+#define SWIGTYPE_p_svn_error_t swig_types[112]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[113]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[114]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[115]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[116]
+#define SWIGTYPE_p_svn_lock_t swig_types[117]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[118]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[119]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[120]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[121]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[122]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[123]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[124]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[125]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[126]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[127]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[128]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[129]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[130]
+#define SWIGTYPE_p_svn_patch_t swig_types[131]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[132]
+#define SWIGTYPE_p_svn_prop_kind swig_types[133]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[134]
+#define SWIGTYPE_p_svn_prop_t swig_types[135]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[136]
+#define SWIGTYPE_p_svn_stream_t swig_types[137]
+#define SWIGTYPE_p_svn_string_t swig_types[138]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[139]
+#define SWIGTYPE_p_svn_tristate_t swig_types[140]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[141]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[142]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[143]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[144]
+#define SWIGTYPE_p_svn_version_t swig_types[145]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[146]
+#define SWIGTYPE_p_unsigned_char swig_types[147]
+#define SWIGTYPE_p_unsigned_long swig_types[148]
+#define SWIGTYPE_p_void swig_types[149]
+static swig_type_info *swig_types[151];
+static swig_module_info swig_module = {swig_types, 150, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1654,7 +1644,7 @@ static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
#define SWIG_name "SVN::_Core::boot_SVN___Core"
#define SWIG_prefix "SVN::_Core::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -1825,20 +1815,19 @@ SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val)
}
-#define SVN_SWIGEXPORT(t) SWIGEXPORT t
-
-
+/* ### Eventually this should go away. This is not thread safe and a very
+ ### good example on HOW NOT TO USE pools */
static apr_pool_t *current_pool = 0;
-SVN_SWIGEXPORT(apr_pool_t *)
-svn_swig_pl_get_current_pool (void)
+static apr_pool_t *
+core_get_current_pool (void)
{
return current_pool;
}
-SVN_SWIGEXPORT(void)
-svn_swig_pl_set_current_pool (apr_pool_t *pool)
+static void
+core_set_current_pool (apr_pool_t *pool)
{
current_pool = pool;
}
@@ -2293,8 +2282,8 @@ static svn_boolean_t svn_config_invoke_enumerator2(
}
static svn_error_t * svn_config_invoke_auth_walk_func(
- svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *cleanup_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
- return _obj(delete_cred, cleanup_baton, cred_kind, realmstring, hash, scratch_pool);
+ svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *walk_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
+ return _obj(delete_cred, walk_baton, cred_kind, realmstring, hash, scratch_pool);
}
@@ -2357,6 +2346,11 @@ static svn_error_t * svn_stream_invoke_seek_fn(
return _obj(baton, mark);
}
+static svn_error_t * svn_stream_invoke_data_available_fn(
+ svn_stream_data_available_fn_t _obj, void *baton, svn_boolean_t *data_available) {
+ return _obj(baton, data_available);
+}
+
static svn_error_t * svn_stream_invoke_lazyopen_func(
svn_stream_lazyopen_func_t _obj, svn_stream_t **stream, void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) {
return _obj(stream, baton, result_pool, scratch_pool);
@@ -2628,7 +2622,7 @@ XS(_wrap_apr_time_ansi_put) {
}
ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg1));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -2719,6 +2713,7 @@ XS(_wrap_apr_file_open_stdout) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2760,6 +2755,7 @@ XS(_wrap_apr_file_open_stderr) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2802,6 +2798,7 @@ XS(_wrap_svn_time_to_cstring) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_time_to_cstring(when,pool);");
@@ -2848,6 +2845,7 @@ XS(_wrap_svn_time_from_cstring) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -2884,7 +2882,7 @@ XS(_wrap_svn_time_from_cstring) {
}
}
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg1));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -2914,6 +2912,7 @@ XS(_wrap_svn_time_to_human_cstring) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_time_to_human_cstring(when,pool);");
@@ -2966,6 +2965,7 @@ XS(_wrap_svn_parse_date) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -3014,7 +3014,7 @@ XS(_wrap_svn_parse_date) {
if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
}
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg2));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -3227,6 +3227,7 @@ XS(_wrap_svn_error_t_pool_set) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_error_t_pool_set(self,pool);");
@@ -3428,105 +3429,6 @@ XS(_wrap_delete_svn_error_t) {
}
-XS(_wrap_svn__apr_hash_index_key) {
- {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- void *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn__apr_hash_index_key(hi);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn__apr_hash_index_key" "', argument " "1"" of type '" "apr_hash_index_t const *""'");
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = (void *)svn__apr_hash_index_key((apr_hash_index_t const *)arg1);
-
-
-
- }
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn__apr_hash_index_klen) {
- {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- apr_ssize_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn__apr_hash_index_klen(hi);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn__apr_hash_index_klen" "', argument " "1"" of type '" "apr_hash_index_t const *""'");
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = svn__apr_hash_index_klen((apr_hash_index_t const *)arg1);
-
-
-
- }
- ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn__apr_hash_index_val) {
- {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- void *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn__apr_hash_index_val(hi);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn__apr_hash_index_val" "', argument " "1"" of type '" "apr_hash_index_t const *""'");
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = (void *)svn__apr_hash_index_val((apr_hash_index_t const *)arg1);
-
-
-
- }
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
XS(_wrap_svn_node_kind_to_word) {
{
svn_node_kind_t arg1 ;
@@ -3922,10 +3824,9 @@ XS(_wrap_svn_dirent_t_size_get) {
arg1 = (struct svn_dirent_t *)(argp1);
result = ((arg1)->size);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -4122,10 +4023,9 @@ XS(_wrap_svn_dirent_t_time_get) {
arg1 = (struct svn_dirent_t *)(argp1);
result = ((arg1)->time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -4232,6 +4132,7 @@ XS(_wrap_svn_dirent_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_dup(dirent,pool);");
@@ -4272,6 +4173,7 @@ XS(_wrap_svn_dirent_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_dirent_create(result_pool);");
@@ -4717,6 +4619,7 @@ XS(_wrap_svn_create_commit_info) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_create_commit_info(pool);");
@@ -4753,6 +4656,7 @@ XS(_wrap_svn_commit_info_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_commit_info_dup(src_commit_info,pool);");
@@ -5246,6 +5150,7 @@ XS(_wrap_svn_log_changed_path2_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_log_changed_path2_create(pool);");
@@ -5282,6 +5187,7 @@ XS(_wrap_svn_log_changed_path2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_log_changed_path2_dup(changed_path,pool);");
@@ -5538,6 +5444,7 @@ XS(_wrap_svn_log_changed_path_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_log_changed_path_dup(changed_path,pool);");
@@ -5717,8 +5624,10 @@ XS(_wrap_svn_log_entry_t_revprops_set) {
}
arg1 = (struct svn_log_entry_t *)(argp1);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg2 = svn_swig_pl_hash_to_prophash(ST(1), _global_pool);
}
if (arg1) (arg1)->revprops = arg2;
@@ -5885,7 +5794,7 @@ XS(_wrap_svn_log_entry_t_changed_paths2_get) {
arg1 = (struct svn_log_entry_t *)(argp1);
result = (apr_hash_t *) ((arg1)->changed_paths2);
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = (result) ? svn_swig_pl_convert_hash(result, SWIGTYPE_p_svn_log_changed_path2_t)
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = (result) ? svn_swig_pl_convert_hash(result, SWIGTYPE_p_svn_log_changed_path2_t)
:&PL_sv_undef; argvi++ /*@SWIG@*/
/*@SWIG@*/
@@ -6095,6 +6004,7 @@ XS(_wrap_svn_log_entry_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_log_entry_create(pool);");
@@ -6131,6 +6041,7 @@ XS(_wrap_svn_log_entry_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_log_entry_dup(log_entry,pool);");
@@ -6175,6 +6086,7 @@ XS(_wrap_svn_mime_type_validate) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_mime_type_validate(mime_type,pool);");
@@ -6667,10 +6579,9 @@ XS(_wrap_svn_lock_t_creation_date_get) {
arg1 = (struct svn_lock_t *)(argp1);
result = ((arg1)->creation_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -6737,10 +6648,9 @@ XS(_wrap_svn_lock_t_expiration_date_get) {
arg1 = (struct svn_lock_t *)(argp1);
result = ((arg1)->expiration_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -6816,6 +6726,7 @@ XS(_wrap_svn_lock_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_lock_create(pool);");
@@ -6852,6 +6763,7 @@ XS(_wrap_svn_lock_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_lock_dup(lock,pool);");
@@ -6892,6 +6804,7 @@ XS(_wrap_svn_uuid_generate) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_uuid_generate(pool);");
@@ -7178,6 +7091,7 @@ XS(_wrap_svn_merge_range_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_merge_range_dup(range,pool);");
@@ -7522,6 +7436,7 @@ XS(_wrap_svn_location_segment_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_location_segment_dup(segment,pool);");
@@ -7568,6 +7483,7 @@ XS(_wrap_svn_log_invoke_entry_receiver) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_log_invoke_entry_receiver(_obj,baton,log_entry,pool);");
@@ -7658,6 +7574,7 @@ XS(_wrap_svn_log_invoke_message_receiver) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_log_invoke_message_receiver(_obj,baton,changed_paths,revision,author,date,message,pool);");
@@ -7761,6 +7678,7 @@ XS(_wrap_svn_commit_invoke_callback2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_commit_invoke_callback2(_obj,commit_info,baton,pool);");
@@ -7978,6 +7896,7 @@ XS(_wrap_svn_location_invoke_segment_receiver) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_location_invoke_segment_receiver(_obj,segment,baton,pool);");
@@ -8719,6 +8638,73 @@ XS(_wrap_delete_svn_version_checklist_t) {
}
+XS(_wrap_svn_ver_check_list2) {
+ {
+ svn_version_t *arg1 = (svn_version_t *) 0 ;
+ svn_version_checklist_t *arg2 = (svn_version_checklist_t *) 0 ;
+ svn_boolean_t (*arg3)(svn_version_t const *,svn_version_t const *) = (svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if ((items < 3) || (items > 3)) {
+ SWIG_croak("Usage: svn_ver_check_list2(my_version,checklist,comparator);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_version_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ver_check_list2" "', argument " "1"" of type '" "svn_version_t const *""'");
+ }
+ arg1 = (svn_version_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_version_checklist_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_ver_check_list2" "', argument " "2"" of type '" "svn_version_checklist_t const *""'");
+ }
+ arg2 = (svn_version_checklist_t *)(argp2);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ver_check_list2" "', argument " "3"" of type '" "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)""'");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_ver_check_list2((struct svn_version_t const *)arg1,(struct svn_version_checklist_t const *)arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_ver_check_list) {
{
svn_version_t *arg1 = (svn_version_t *) 0 ;
@@ -8813,6 +8799,7 @@ XS(_wrap_svn_version_extended) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_version_extended(verbose,pool);");
@@ -9660,6 +9647,7 @@ XS(_wrap_svn_prop_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_prop_dup(prop,pool);");
@@ -9703,6 +9691,7 @@ XS(_wrap_svn_prop_array_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_prop_array_dup(array,pool);");
@@ -9937,13 +9926,16 @@ XS(_wrap_svn_prop_hash_to_array) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_prop_hash_to_array(hash,pool);");
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg1 = svn_swig_pl_hash_to_prophash(ST(0), _global_pool);
}
if (items > 1) {
@@ -10021,13 +10013,16 @@ XS(_wrap_svn_prop_hash_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_prop_hash_dup(hash,pool);");
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg1 = svn_swig_pl_hash_to_prophash(ST(0), _global_pool);
}
if (items > 1) {
@@ -10220,13 +10215,16 @@ XS(_wrap_svn_prop_has_svn_prop) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_prop_has_svn_prop(props,pool);");
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg1 = svn_swig_pl_hash_to_prophash(ST(0), _global_pool);
}
if (items > 1) {
@@ -10473,6 +10471,7 @@ XS(_wrap_svn_categorize_props) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -10568,19 +10567,24 @@ XS(_wrap_svn_prop_diffs) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_prop_diffs(target_props,source_props,pool);");
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg2 = svn_swig_pl_hash_to_prophash(ST(0), _global_pool);
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg3 = svn_swig_pl_hash_to_prophash(ST(1), _global_pool);
}
if (items > 2) {
@@ -11812,6 +11816,7 @@ XS(_wrap_svn_opt_get_option_from_code2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_opt_get_option_from_code2(code,option_table,command,pool);");
@@ -12064,6 +12069,7 @@ XS(_wrap_svn_opt_print_generic_help2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 6)) {
SWIG_croak("Usage: svn_opt_print_generic_help2(header,cmd_table,opt_table,footer,pool,stream);");
@@ -12139,6 +12145,7 @@ XS(_wrap_svn_opt_format_option) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -12208,6 +12215,7 @@ XS(_wrap_svn_opt_subcommand_help3) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 3) || (items > 4)) {
@@ -12280,6 +12288,7 @@ XS(_wrap_svn_opt_subcommand_help2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_opt_subcommand_help2(subcommand,table,options_table,pool);");
@@ -12343,6 +12352,7 @@ XS(_wrap_svn_opt_subcommand_help) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_opt_subcommand_help(subcommand,table,options_table,pool);");
@@ -12508,10 +12518,9 @@ XS(_wrap_svn_opt_revision_value_t_date_get) {
arg1 = (union svn_opt_revision_value_t *)(argp1);
result = ((arg1)->date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -12769,6 +12778,7 @@ XS(_wrap_svn_opt_revision_range_t_start_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -12781,7 +12791,11 @@ XS(_wrap_svn_opt_revision_range_t_start_set) {
}
arg1 = (struct svn_opt_revision_range_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->start = *arg2;
ST(argvi) = sv_newmortal();
@@ -12831,6 +12845,7 @@ XS(_wrap_svn_opt_revision_range_t_end_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -12843,7 +12858,11 @@ XS(_wrap_svn_opt_revision_range_t_end_set) {
}
arg1 = (struct svn_opt_revision_range_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->end = *arg2;
ST(argvi) = sv_newmortal();
@@ -12959,15 +12978,24 @@ XS(_wrap_svn_opt_parse_revision) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_opt_parse_revision(start_revision,end_revision,arg,pool);");
}
{
- arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE, _global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -13016,6 +13044,7 @@ XS(_wrap_svn_opt_parse_revision_to_range) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_opt_parse_revision_to_range(opt_ranges,arg,pool);");
@@ -13073,15 +13102,24 @@ XS(_wrap_svn_opt_resolve_revisions) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_opt_resolve_revisions(peg_rev,op_rev,is_url,notice_local_mods,pool);");
}
{
- arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE, _global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -13153,6 +13191,7 @@ XS(_wrap_svn_opt_args_to_target_array3) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -13229,6 +13268,7 @@ XS(_wrap_svn_opt_args_to_target_array2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -13303,6 +13343,7 @@ XS(_wrap_svn_opt_parse_revprop) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -13366,6 +13407,7 @@ XS(_wrap_svn_opt_push_implicit_dot_target) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_opt_push_implicit_dot_target(targets,pool);");
@@ -13414,6 +13456,7 @@ XS(_wrap_svn_opt_parse_num_args) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -13487,6 +13530,7 @@ XS(_wrap_svn_opt_parse_all_args) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -13556,13 +13600,18 @@ XS(_wrap_svn_opt_parse_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_opt_parse_path(rev,path,pool);");
}
{
- arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg1 = svn_swig_pl_set_revision(&rev1, ST(0), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -13663,6 +13712,7 @@ XS(_wrap_svn_opt_print_help4) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg10 = &temp10;
if ((items < 10) || (items > 11)) {
@@ -13824,6 +13874,7 @@ XS(_wrap_svn_opt_print_help3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg9 = &temp9;
if ((items < 9) || (items > 10)) {
@@ -13975,6 +14026,7 @@ XS(_wrap_svn_opt_print_help2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_opt_print_help2(os,pgm_name,print_version,quiet,version_footer,header,cmd_table,option_table,footer,pool);");
@@ -14117,6 +14169,7 @@ XS(_wrap_svn_opt_print_help) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_opt_print_help(os,pgm_name,print_version,quiet,version_footer,header,cmd_table,option_table,footer,pool);");
@@ -14258,6 +14311,182 @@ XS(_wrap_svn_cmdline_init) {
}
+XS(_wrap_svn_cmdline_create_auth_baton2) {
+ {
+ svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
+ svn_boolean_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_config_t *arg12 = (svn_config_t *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_auth_baton_t *temp1 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ int val9 ;
+ int ecode9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int val11 ;
+ int ecode11 = 0 ;
+ void *argp12 = 0 ;
+ int res12 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 12) || (items > 13)) {
+ SWIG_croak("Usage: svn_cmdline_create_auth_baton2(non_interactive,username,password,config_dir,no_auth_cache,trust_server_cert_unknown_ca,trust_server_cert_cn_mismatch,trust_server_cert_expired,trust_server_cert_not_yet_valid,trust_server_cert_other_failure,cfg,cancel_func,cancel_baton,pool);");
+ }
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "2"" of type '" "svn_boolean_t""'");
+ }
+ arg2 = (svn_boolean_t)(val2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(ST(3), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "8"" of type '" "svn_boolean_t""'");
+ }
+ arg8 = (svn_boolean_t)(val8);
+ ecode9 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(7), &val9);
+ if (!SWIG_IsOK(ecode9)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "9"" of type '" "svn_boolean_t""'");
+ }
+ arg9 = (svn_boolean_t)(val9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "10"" of type '" "svn_boolean_t""'");
+ }
+ arg10 = (svn_boolean_t)(val10);
+ ecode11 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val11);
+ if (!SWIG_IsOK(ecode11)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "11"" of type '" "svn_boolean_t""'");
+ }
+ arg11 = (svn_boolean_t)(val11);
+ res12 = SWIG_ConvertPtr(ST(10), &argp12,SWIGTYPE_p_svn_config_t, 0 | 0 );
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_cmdline_create_auth_baton2" "', argument " "12"" of type '" "svn_config_t *""'");
+ }
+ arg12 = (svn_config_t *)(argp12);
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg14 = ST(11);
+ }
+ if (items > 12) {
+
+ }
+ {
+ result = (svn_error_t *)svn_cmdline_create_auth_baton2(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_baton_t, 0); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_cmdline_create_auth_baton) {
{
svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
@@ -14290,16 +14519,16 @@ XS(_wrap_svn_cmdline_create_auth_baton) {
int ecode7 = 0 ;
void *argp8 = 0 ;
int res8 = 0 ;
- int res10 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_cmdline_create_auth_baton(non_interactive,username,password,config_dir,no_auth_cache,trust_server_cert,cfg,cancel_func,cancel_baton,pool);");
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val2);
@@ -14338,16 +14567,10 @@ XS(_wrap_svn_cmdline_create_auth_baton) {
}
arg8 = (svn_config_t *)(argp8);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_cmdline_create_auth_baton" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(7);
}
- res10 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_cmdline_create_auth_baton" "', argument " "10"" of type '" "void *""'");
- }
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -14384,8 +14607,6 @@ XS(_wrap_svn_cmdline_create_auth_baton) {
-
-
XSRETURN(argvi);
fail:
@@ -14397,8 +14618,6 @@ XS(_wrap_svn_cmdline_create_auth_baton) {
-
-
SWIG_croak_null();
}
}
@@ -16250,6 +16469,7 @@ XS(_wrap_svn_auth_ssl_server_cert_info_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_auth_ssl_server_cert_info_dup(info,pool);");
@@ -16477,13 +16697,14 @@ XS(_wrap_svn_auth_open) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_auth_open(providers,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_objs_to_array(ST(0),
+ arg2 = svn_swig_pl_objs_to_array(ST(0),
SWIGTYPE_p_svn_auth_provider_object_t, _global_pool);
}
if (items > 1) {
@@ -16522,7 +16743,7 @@ XS(_wrap_svn_auth_set_parameter) {
int res2 ;
char *buf2 = 0 ;
int alloc2 = 0 ;
- int res3 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -16539,9 +16760,20 @@ XS(_wrap_svn_auth_set_parameter) {
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_auth_set_parameter" "', argument " "2"" of type '" "char const *""'");
}
arg2 = (char *)(buf2);
- res3 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg3), 0, 0);
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_auth_set_parameter" "', argument " "3"" of type '" "void const *""'");
+ {
+ if (!SvOK(ST(2)) || ST(2) == &PL_sv_undef) {
+ arg3 = NULL;
+ }
+ else if (SvPOK(ST(2))) {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = apr_pstrdup(_global_pool, SvPV_nolen(ST(2)));
+ }
+ else {
+ croak("Value is not a string (or undef)");
+ }
}
{
svn_auth_set_parameter(arg1,(char const *)arg2,(void const *)arg3);
@@ -16588,6 +16820,7 @@ XS(_wrap_svn_auth_first_credentials) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -16674,6 +16907,7 @@ XS(_wrap_svn_auth_next_credentials) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -16738,6 +16972,7 @@ XS(_wrap_svn_auth_save_credentials) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_auth_save_credentials(state,pool);");
@@ -16804,6 +17039,7 @@ XS(_wrap_svn_auth_forget_credentials) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_auth_forget_credentials(auth_baton,cred_kind,realmstring,pool);");
@@ -16880,6 +17116,7 @@ XS(_wrap_svn_auth_get_simple_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -16942,6 +17179,7 @@ XS(_wrap_svn_auth_get_username_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17002,6 +17240,7 @@ XS(_wrap_svn_auth_get_simple_provider2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17061,6 +17300,7 @@ XS(_wrap_svn_auth_get_simple_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -17110,6 +17350,7 @@ XS(_wrap_svn_auth_get_platform_specific_provider) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17183,6 +17424,7 @@ XS(_wrap_svn_auth_get_platform_specific_client_providers) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -17219,7 +17461,7 @@ XS(_wrap_svn_auth_get_platform_specific_client_providers) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
SWIGTYPE_p_svn_auth_provider_object_t); argvi++ /*@SWIG@*/
/*@SWIG@*/
;
@@ -17248,6 +17490,7 @@ XS(_wrap_svn_auth_get_username_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -17288,6 +17531,7 @@ XS(_wrap_svn_auth_get_ssl_server_trust_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -17328,6 +17572,7 @@ XS(_wrap_svn_auth_get_ssl_client_cert_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -17372,6 +17617,7 @@ XS(_wrap_svn_auth_get_ssl_client_cert_pw_file_provider2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17431,6 +17677,7 @@ XS(_wrap_svn_auth_get_ssl_client_cert_pw_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -17474,6 +17721,7 @@ XS(_wrap_svn_auth_get_ssl_server_trust_prompt_provider) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -17529,6 +17777,7 @@ XS(_wrap_svn_auth_get_ssl_client_cert_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17591,6 +17840,7 @@ XS(_wrap_svn_auth_get_ssl_client_cert_pw_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -17662,6 +17912,7 @@ XS(_wrap_svn_auth_provider_invoke_first_credentials) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -17765,6 +18016,7 @@ XS(_wrap_svn_auth_provider_invoke_next_credentials) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
@@ -17869,6 +18121,7 @@ XS(_wrap_svn_auth_provider_invoke_save_credentials) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
@@ -17961,6 +18214,7 @@ XS(_wrap_svn_auth_invoke_simple_provider_func) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -18010,6 +18264,7 @@ XS(_wrap_svn_auth_invoke_ssl_client_cert_pw_provider_func) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -18073,6 +18328,7 @@ XS(_wrap_svn_auth_invoke_simple_prompt_func) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
@@ -18174,6 +18430,7 @@ XS(_wrap_svn_auth_invoke_username_prompt_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -18274,6 +18531,7 @@ XS(_wrap_svn_auth_invoke_ssl_server_trust_prompt_func) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 6) || (items > 7)) {
@@ -18382,6 +18640,7 @@ XS(_wrap_svn_auth_invoke_ssl_client_cert_prompt_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -18476,6 +18735,7 @@ XS(_wrap_svn_auth_invoke_ssl_client_cert_pw_prompt_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -18568,6 +18828,7 @@ XS(_wrap_svn_auth_invoke_plaintext_prompt_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -18656,6 +18917,7 @@ XS(_wrap_svn_auth_invoke_plaintext_passphrase_prompt_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -18740,6 +19002,7 @@ XS(_wrap_svn_config_get_config) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -18809,6 +19072,7 @@ XS(_wrap_svn_config_create2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -18882,6 +19146,7 @@ XS(_wrap_svn_config_create) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -18958,6 +19223,7 @@ XS(_wrap_svn_config_read3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -19052,6 +19318,7 @@ XS(_wrap_svn_config_read2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -19136,6 +19403,7 @@ XS(_wrap_svn_config_read) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -19213,6 +19481,7 @@ XS(_wrap_svn_config_parse) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -19220,6 +19489,7 @@ XS(_wrap_svn_config_parse) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -19712,7 +19982,7 @@ XS(_wrap_svn_config_get_int64) {
}
}
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg2));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -20057,6 +20327,7 @@ XS(_wrap_svn_config_enumerate_sections2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_config_enumerate_sections2(cfg,callback,baton,pool);");
@@ -20130,7 +20401,7 @@ XS(_wrap_svn_config_enumerate) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_thunk_config_enumerator;
+ arg3 = (svn_config_enumerator_t) svn_swig_pl_thunk_config_enumerator;
arg4 = ST(2);
}
{
@@ -20171,6 +20442,7 @@ XS(_wrap_svn_config_enumerate2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_config_enumerate2(cfg,section,callback,baton,pool);");
@@ -20287,6 +20559,7 @@ XS(_wrap_svn_config_find_group) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_config_find_group(cfg,key,master_section,pool);");
@@ -20423,6 +20696,7 @@ XS(_wrap_svn_config_get_server_setting_int) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -20474,7 +20748,7 @@ XS(_wrap_svn_config_get_server_setting_int) {
}
}
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg5));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -20603,6 +20877,7 @@ XS(_wrap_svn_config_ensure) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_config_ensure(config_dir,pool);");
@@ -20672,6 +20947,7 @@ XS(_wrap_svn_config_read_auth_data) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -20760,13 +21036,16 @@ XS(_wrap_svn_config_write_auth_data) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_config_write_auth_data(hash,cred_kind,realmstring,config_dir,pool);");
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg1 = svn_swig_pl_hash_to_prophash(ST(0), _global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -20843,6 +21122,7 @@ XS(_wrap_svn_config_walk_auth_data) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_config_walk_auth_data(config_dir,walk_func,walk_baton,scratch_pool);");
@@ -20922,6 +21202,7 @@ XS(_wrap_svn_config_get_user_config_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -20999,6 +21280,7 @@ XS(_wrap_svn_config_dup) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21006,14 +21288,14 @@ XS(_wrap_svn_config_dup) {
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_config_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_config_dup" "', argument " "2"" of type '" "svn_config_t *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_config_dup" "', argument " "2"" of type '" "svn_config_t const *""'");
}
arg2 = (svn_config_t *)(argp2);
if (items > 1) {
}
{
- result = (svn_error_t *)svn_config_dup(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_config_dup(arg1,(struct svn_config_t const *)arg2,arg3);
@@ -21065,6 +21347,7 @@ XS(_wrap_svn_config_copy_config) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21184,6 +21467,7 @@ XS(_wrap_svn_config_invoke_section_enumerator2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_config_invoke_section_enumerator2(_obj,name,baton,pool);");
@@ -21311,6 +21595,7 @@ XS(_wrap_svn_config_invoke_enumerator2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_config_invoke_enumerator2(_obj,name,value,baton,pool);");
@@ -21387,10 +21672,11 @@ XS(_wrap_svn_config_invoke_auth_walk_func) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
- SWIG_croak("Usage: svn_config_invoke_auth_walk_func(_obj,cleanup_baton,cred_kind,realmstring,hash,scratch_pool);");
+ SWIG_croak("Usage: svn_config_invoke_auth_walk_func(_obj,walk_baton,cred_kind,realmstring,hash,scratch_pool);");
}
{
int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t);
@@ -21413,8 +21699,10 @@ XS(_wrap_svn_config_invoke_auth_walk_func) {
}
arg5 = (char *)(buf5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
if (items > 5) {
@@ -21481,6 +21769,7 @@ XS(_wrap_svn_utf_initialize2) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_utf_initialize2(assume_native_utf8,pool);");
@@ -21520,6 +21809,7 @@ XS(_wrap_svn_utf_initialize) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_utf_initialize(pool);");
@@ -21556,6 +21846,7 @@ XS(_wrap_svn_utf_stringbuf_to_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21564,6 +21855,7 @@ XS(_wrap_svn_utf_stringbuf_to_utf8) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg2 = NULL;
@@ -21571,8 +21863,9 @@ XS(_wrap_svn_utf_stringbuf_to_utf8) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg2 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg2 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -21636,6 +21929,7 @@ XS(_wrap_svn_utf_string_to_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21711,6 +22005,7 @@ XS(_wrap_svn_utf_cstring_to_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21786,6 +22081,7 @@ XS(_wrap_svn_utf_cstring_to_utf8_ex2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -21872,6 +22168,7 @@ XS(_wrap_svn_utf_cstring_to_utf8_ex) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -21954,6 +22251,7 @@ XS(_wrap_svn_utf_stringbuf_from_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -21962,6 +22260,7 @@ XS(_wrap_svn_utf_stringbuf_from_utf8) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg2 = NULL;
@@ -21969,8 +22268,9 @@ XS(_wrap_svn_utf_stringbuf_from_utf8) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg2 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg2 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -22034,6 +22334,7 @@ XS(_wrap_svn_utf_string_from_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -22109,6 +22410,7 @@ XS(_wrap_svn_utf_cstring_from_utf8) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -22184,6 +22486,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_ex2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -22270,6 +22573,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_ex) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -22353,6 +22657,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_fuzzy) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_utf_cstring_from_utf8_fuzzy(src,pool);");
@@ -22396,6 +22701,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_stringbuf) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -22404,6 +22710,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_stringbuf) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg2 = NULL;
@@ -22411,8 +22718,9 @@ XS(_wrap_svn_utf_cstring_from_utf8_stringbuf) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg2 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg2 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -22476,6 +22784,7 @@ XS(_wrap_svn_utf_cstring_from_utf8_string) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -22621,6 +22930,7 @@ XS(_wrap_svn_path_internal_style) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_path_internal_style(path,pool);");
@@ -22665,6 +22975,7 @@ XS(_wrap_svn_path_local_style) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_path_local_style(path,pool);");
@@ -22712,6 +23023,7 @@ XS(_wrap_svn_path_splitext) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -22854,6 +23166,7 @@ XS(_wrap_svn_path_canonicalize) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_path_canonicalize(path,pool);");
@@ -22898,6 +23211,7 @@ XS(_wrap_svn_path_is_canonical) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_path_is_canonical(path,pool);");
@@ -22991,6 +23305,7 @@ XS(_wrap_svn_path_get_longest_ancestor) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_path_get_longest_ancestor(path1,path2,pool);");
@@ -23148,6 +23463,7 @@ XS(_wrap_svn_path_url_add_component2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_path_url_add_component2(url,component,pool);");
@@ -23239,6 +23555,7 @@ XS(_wrap_svn_path_resolve_repos_relative_url) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -23315,6 +23632,7 @@ XS(_wrap_svn_path_illegal_path_escape) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_path_illegal_path_escape(path,pool);");
@@ -23359,6 +23677,7 @@ XS(_wrap_svn_dirent_internal_style) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_internal_style(dirent,result_pool);");
@@ -23403,6 +23722,7 @@ XS(_wrap_svn_dirent_local_style) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_local_style(dirent,result_pool);");
@@ -23447,6 +23767,7 @@ XS(_wrap_svn_relpath__internal_style) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_relpath__internal_style(relpath,result_pool);");
@@ -23495,6 +23816,7 @@ XS(_wrap_svn_dirent_join) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_dirent_join(base,component,result_pool);");
@@ -23550,6 +23872,7 @@ XS(_wrap_svn_relpath_join) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_relpath_join(base,component,result_pool);");
@@ -23601,6 +23924,7 @@ XS(_wrap_svn_dirent_basename) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_basename(dirent,result_pool);");
@@ -23645,6 +23969,7 @@ XS(_wrap_svn_dirent_dirname) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_dirname(dirent,result_pool);");
@@ -23692,6 +24017,7 @@ XS(_wrap_svn_dirent_split) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -23759,6 +24085,7 @@ XS(_wrap_svn_relpath_split) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -23823,6 +24150,7 @@ XS(_wrap_svn_relpath_basename) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_relpath_basename(relpath,result_pool);");
@@ -23867,6 +24195,7 @@ XS(_wrap_svn_relpath_dirname) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_relpath_dirname(relpath,result_pool);");
@@ -23897,6 +24226,61 @@ XS(_wrap_svn_relpath_dirname) {
}
+XS(_wrap_svn_relpath_prefix) {
+ {
+ char *arg1 = (char *) 0 ;
+ int arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ char *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 2) || (items > 3)) {
+ SWIG_croak("Usage: svn_relpath_prefix(relpath,max_components,result_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_relpath_prefix" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_relpath_prefix" "', argument " "2"" of type '" "int""'");
+ }
+ arg2 = (int)(val2);
+ if (items > 2) {
+
+ }
+ {
+ result = (char *)svn_relpath_prefix((char const *)arg1,arg2,arg3);
+
+
+
+ }
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_uri_split) {
{
char **arg1 = (char **) 0 ;
@@ -23914,6 +24298,7 @@ XS(_wrap_svn_uri_split) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -23978,6 +24363,7 @@ XS(_wrap_svn_uri_basename) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_uri_basename(uri,result_pool);");
@@ -24022,6 +24408,7 @@ XS(_wrap_svn_uri_dirname) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_uri_dirname(uri,result_pool);");
@@ -24144,6 +24531,7 @@ XS(_wrap_svn_dirent_canonicalize) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_canonicalize(dirent,result_pool);");
@@ -24188,6 +24576,7 @@ XS(_wrap_svn_relpath_canonicalize) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_relpath_canonicalize(relpath,result_pool);");
@@ -24232,6 +24621,7 @@ XS(_wrap_svn_uri_canonicalize) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_uri_canonicalize(uri,result_pool);");
@@ -24276,6 +24666,7 @@ XS(_wrap_svn_dirent_is_canonical) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_dirent_is_canonical(dirent,scratch_pool);");
@@ -24354,6 +24745,7 @@ XS(_wrap_svn_uri_is_canonical) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_uri_is_canonical(uri,scratch_pool);");
@@ -24402,6 +24794,7 @@ XS(_wrap_svn_dirent_get_longest_ancestor) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_dirent_get_longest_ancestor(dirent1,dirent2,result_pool);");
@@ -24457,6 +24850,7 @@ XS(_wrap_svn_relpath_get_longest_ancestor) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_relpath_get_longest_ancestor(relpath1,relpath2,result_pool);");
@@ -24512,6 +24906,7 @@ XS(_wrap_svn_uri_get_longest_ancestor) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_uri_get_longest_ancestor(uri1,uri2,result_pool);");
@@ -24565,6 +24960,7 @@ XS(_wrap_svn_dirent_get_absolute) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -24638,6 +25034,7 @@ XS(_wrap_svn_dirent_is_child) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_dirent_is_child(parent_dirent,child_dirent,result_pool);");
@@ -24873,6 +25270,7 @@ XS(_wrap_svn_uri_skip_ancestor) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_uri_skip_ancestor(parent_uri,child_uri,result_pool);");
@@ -24926,6 +25324,7 @@ XS(_wrap_svn_uri_get_dirent_from_file_url) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -24997,6 +25396,7 @@ XS(_wrap_svn_uri_get_file_url_from_dirent) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -25068,6 +25468,7 @@ XS(_wrap_svn_mergeinfo_parse) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -25149,9 +25550,11 @@ XS(_wrap_svn_mergeinfo_diff2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -25263,6 +25666,7 @@ XS(_wrap_svn_mergeinfo_diff) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -25363,9 +25767,11 @@ XS(_wrap_svn_mergeinfo_merge2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 4)) {
SWIG_croak("Usage: svn_mergeinfo_merge2(mergeinfo,changes,result_pool,scratch_pool);");
@@ -25440,9 +25846,11 @@ XS(_wrap_svn_mergeinfo_catalog_merge) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 4)) {
SWIG_croak("Usage: svn_mergeinfo_catalog_merge(mergeinfo_catalog,changes_catalog,result_pool,scratch_pool);");
@@ -25518,6 +25926,7 @@ XS(_wrap_svn_mergeinfo_remove) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -25604,9 +26013,11 @@ XS(_wrap_svn_mergeinfo_remove2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -25706,6 +26117,7 @@ XS(_wrap_svn_rangelist_diff) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -25806,9 +26218,11 @@ XS(_wrap_svn_rangelist_merge2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 4)) {
SWIG_croak("Usage: svn_rangelist_merge2(rangelist,changes,result_pool,scratch_pool);");
@@ -25887,6 +26301,7 @@ XS(_wrap_svn_rangelist_remove) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -25980,9 +26395,11 @@ XS(_wrap_svn_mergeinfo_intersect2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -26077,6 +26494,7 @@ XS(_wrap_svn_mergeinfo_intersect) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -26162,6 +26580,7 @@ XS(_wrap_svn_rangelist_intersect) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -26248,6 +26667,7 @@ XS(_wrap_svn_rangelist_to_string) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -26328,9 +26748,11 @@ XS(_wrap_svn_rangelist_inheritable2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 6)) {
@@ -26435,6 +26857,7 @@ XS(_wrap_svn_rangelist_inheritable) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -26535,9 +26958,11 @@ XS(_wrap_svn_mergeinfo_inheritable2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 7)) {
@@ -26653,6 +27078,7 @@ XS(_wrap_svn_mergeinfo_inheritable) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -26746,6 +27172,7 @@ XS(_wrap_svn_mergeinfo_to_string) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -26814,6 +27241,7 @@ XS(_wrap_svn_mergeinfo_catalog_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_mergeinfo_catalog_dup(mergeinfo_catalog,pool);");
@@ -26857,6 +27285,7 @@ XS(_wrap_svn_mergeinfo_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_mergeinfo_dup(mergeinfo,pool);");
@@ -26900,6 +27329,7 @@ XS(_wrap_svn_rangelist_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_rangelist_dup(rangelist,pool);");
@@ -27183,10 +27613,9 @@ XS(_wrap_svn_io_dirent2_t_filesize_get) {
arg1 = (struct svn_io_dirent2_t *)(argp1);
result = ((arg1)->filesize);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -27253,10 +27682,9 @@ XS(_wrap_svn_io_dirent2_t_mtime_get) {
arg1 = (struct svn_io_dirent2_t *)(argp1);
result = ((arg1)->mtime);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -27332,6 +27760,7 @@ XS(_wrap_svn_io_dirent2_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_io_dirent2_create(result_pool);");
@@ -27368,6 +27797,7 @@ XS(_wrap_svn_io_dirent2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_io_dirent2_dup(item,result_pool);");
@@ -27613,9 +28043,11 @@ XS(_wrap_svn_io_open_uniquely_named) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -27725,9 +28157,11 @@ XS(_wrap_svn_io_open_unique_file3) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -27826,6 +28260,7 @@ XS(_wrap_svn_io_open_unique_file2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -27926,6 +28361,7 @@ XS(_wrap_svn_io_open_unique_file) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -28019,6 +28455,7 @@ XS(_wrap_svn_io_copy_perms) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_io_copy_perms(src,dst,pool);");
@@ -28084,6 +28521,7 @@ XS(_wrap_svn_io_sleep_for_timestamps) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_io_sleep_for_timestamps(path,pool);");
@@ -28145,6 +28583,7 @@ XS(_wrap_svn_io_filesizes_three_different_p) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -28250,6 +28689,7 @@ XS(_wrap_svn_io_file_checksum2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -28330,6 +28770,7 @@ XS(_wrap_svn_io_file_checksum) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = temp1;
if ((items < 1) || (items > 2)) {
@@ -28366,7 +28807,7 @@ XS(_wrap_svn_io_file_checksum) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg1,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg1,
_global_pool),
0)); argvi++ /*@SWIG@*/
@@ -28408,6 +28849,7 @@ XS(_wrap_svn_io_files_contents_same_p) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -28500,6 +28942,7 @@ XS(_wrap_svn_io_files_contents_three_same_p) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -28586,6 +29029,144 @@ XS(_wrap_svn_io_files_contents_three_same_p) {
}
+XS(_wrap_svn_io_file_create_bytes) {
+ {
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 3) || (items > 4)) {
+ SWIG_croak("Usage: svn_io_file_create_bytes(file,contents,length,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_io_file_create_bytes" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_io_file_create_bytes" "', argument " "2"" of type '" "void const *""'");
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_io_file_create_bytes" "', argument " "3"" of type '" "apr_size_t""'");
+ }
+ arg3 = (apr_size_t)(val3);
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_create_bytes((char const *)arg1,(void const *)arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_io_file_create_empty) {
+ {
+ char *arg1 = (char *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 1) || (items > 2)) {
+ SWIG_croak("Usage: svn_io_file_create_empty(file,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_io_file_create_empty" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ if (items > 1) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_create_empty((char const *)arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_io_lock_open_file) {
{
apr_file_t *arg1 = (apr_file_t *) 0 ;
@@ -28603,6 +29184,7 @@ XS(_wrap_svn_io_lock_open_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_io_lock_open_file(lockfile_handle,exclusive,nonblocking,pool);");
@@ -28671,6 +29253,7 @@ XS(_wrap_svn_io_unlock_open_file) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_io_unlock_open_file(lockfile_handle,pool);");
@@ -28714,6 +29297,53 @@ XS(_wrap_svn_io_unlock_open_file) {
}
+XS(_wrap_svn_stream_set_read2) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_read_fn_t arg2 = (svn_read_fn_t) 0 ;
+ svn_read_fn_t arg3 = (svn_read_fn_t) 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 3) || (items > 3)) {
+ SWIG_croak("Usage: svn_stream_set_read2(stream,read_fn,read_full_fn);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_set_read2" "', argument " "2"" of type '" "svn_read_fn_t""'");
+ }
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_set_read2" "', argument " "3"" of type '" "svn_read_fn_t""'");
+ }
+ }
+ {
+ svn_stream_set_read2(arg1,arg2,arg3);
+
+
+
+ }
+ ST(argvi) = sv_newmortal();
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_stream_set_skip) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -28726,6 +29356,7 @@ XS(_wrap_svn_stream_set_skip) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_apr_size_t__p_svn_error_t);
@@ -28763,6 +29394,7 @@ XS(_wrap_svn_stream_set_mark) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t);
@@ -28800,6 +29432,7 @@ XS(_wrap_svn_stream_set_seek) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t);
@@ -28825,6 +29458,44 @@ XS(_wrap_svn_stream_set_seek) {
}
+XS(_wrap_svn_stream_set_data_available) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_data_available_fn_t arg2 = (svn_stream_data_available_fn_t) 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_stream_set_data_available(stream,data_available);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_set_data_available" "', argument " "2"" of type '" "svn_stream_data_available_fn_t""'");
+ }
+ }
+ {
+ svn_stream_set_data_available(arg1,arg2);
+
+
+
+ }
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_stream_empty) {
{
apr_pool_t *arg1 = (apr_pool_t *) 0 ;
@@ -28835,6 +29506,7 @@ XS(_wrap_svn_stream_empty) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_stream_empty(pool);");
@@ -28849,7 +29521,11 @@ XS(_wrap_svn_stream_empty) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -28872,12 +29548,14 @@ XS(_wrap_svn_stream_disown) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_stream_disown(stream,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
if (items > 1) {
@@ -28889,7 +29567,11 @@ XS(_wrap_svn_stream_disown) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -28920,9 +29602,11 @@ XS(_wrap_svn_stream_open_readonly) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -28962,7 +29646,11 @@ XS(_wrap_svn_stream_open_readonly) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -28996,9 +29684,11 @@ XS(_wrap_svn_stream_open_writable) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -29038,7 +29728,11 @@ XS(_wrap_svn_stream_open_writable) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -29077,9 +29771,11 @@ XS(_wrap_svn_stream_open_unique) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -29125,7 +29821,11 @@ XS(_wrap_svn_stream_open_unique) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
{
if (*arg2 == NULL) {
@@ -29167,6 +29867,7 @@ XS(_wrap_svn_stream_from_aprfile2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_stream_from_aprfile2(file,disown,pool);");
@@ -29189,7 +29890,11 @@ XS(_wrap_svn_stream_from_aprfile2) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29216,6 +29921,7 @@ XS(_wrap_svn_stream_from_aprfile) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_stream_from_aprfile(file,pool);");
@@ -29233,7 +29939,11 @@ XS(_wrap_svn_stream_from_aprfile) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29259,6 +29969,7 @@ XS(_wrap_svn_stream_for_stdin) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -29290,7 +30001,11 @@ XS(_wrap_svn_stream_for_stdin) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -29315,6 +30030,7 @@ XS(_wrap_svn_stream_for_stderr) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -29346,7 +30062,11 @@ XS(_wrap_svn_stream_for_stderr) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -29371,6 +30091,7 @@ XS(_wrap_svn_stream_for_stdout) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -29402,14 +30123,96 @@ XS(_wrap_svn_stream_for_stdout) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_stringbuf_from_stream) {
+ {
+ svn_stringbuf_t **arg1 = (svn_stringbuf_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_stringbuf_t *temp1 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 3)) {
+ SWIG_croak("Usage: svn_stringbuf_from_stream(stream,len_hint,result_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_stringbuf_from_stream" "', argument " "3"" of type '" "apr_size_t""'");
+ }
+ arg3 = (apr_size_t)(val3);
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_stringbuf_from_stream(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (*arg1) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpvn((*arg1)->data, (*arg1)->len)); argvi++ ;
+ } else {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = &PL_sv_undef; argvi++ ;
+ }
}
+
+
XSRETURN(argvi);
fail:
+
+
SWIG_croak_null();
}
}
@@ -29426,6 +30229,7 @@ XS(_wrap_svn_stream_from_stringbuf) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_stream_from_stringbuf(str,pool);");
@@ -29433,6 +30237,7 @@ XS(_wrap_svn_stream_from_stringbuf) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg1 = NULL;
@@ -29440,8 +30245,9 @@ XS(_wrap_svn_stream_from_stringbuf) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg1 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg1 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -29456,7 +30262,11 @@ XS(_wrap_svn_stream_from_stringbuf) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29482,6 +30292,7 @@ XS(_wrap_svn_stream_from_string) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_stream_from_string(str,pool);");
@@ -29505,7 +30316,11 @@ XS(_wrap_svn_stream_from_string) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29529,6 +30344,7 @@ XS(_wrap_svn_stream_buffered) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_stream_buffered(result_pool);");
@@ -29543,7 +30359,11 @@ XS(_wrap_svn_stream_buffered) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29566,12 +30386,14 @@ XS(_wrap_svn_stream_compressed) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_stream_compressed(stream,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
if (items > 1) {
@@ -29583,7 +30405,11 @@ XS(_wrap_svn_stream_compressed) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -29618,6 +30444,7 @@ XS(_wrap_svn_stream_checksummed2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -29626,6 +30453,7 @@ XS(_wrap_svn_stream_checksummed2) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -29647,7 +30475,11 @@ XS(_wrap_svn_stream_checksummed2) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
{
@@ -29687,6 +30519,158 @@ XS(_wrap_svn_stream_checksummed2) {
}
+XS(_wrap_svn_stream_read_full) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ int argvi = 0;
+ SV * _saved[1] ;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_stream_read_full(stream,buffer,len);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ temp2 = SvIV(ST(1));
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ _saved[0] = ST(1);
+ {
+ result = (svn_error_t *)svn_stream_read_full(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpvn(arg2, *arg3)); argvi++ ;
+ free(arg2);
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_stream_supports_partial_read) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ int argvi = 0;
+ svn_boolean_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_stream_supports_partial_read(stream);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ result = (svn_boolean_t)svn_stream_supports_partial_read(arg1);
+
+
+
+ }
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_stream_read2) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ int argvi = 0;
+ SV * _saved[1] ;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_stream_read2(stream,buffer,len);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ temp2 = SvIV(ST(1));
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ _saved[0] = ST(1);
+ {
+ result = (svn_error_t *)svn_stream_read2(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpvn(arg2, *arg3)); argvi++ ;
+ free(arg2);
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_stream_read) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -29703,6 +30687,7 @@ XS(_wrap_svn_stream_read) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
temp2 = SvIV(ST(1));
@@ -29762,6 +30747,7 @@ XS(_wrap_svn_stream_skip) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
ecode2 = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
if (!SWIG_IsOK(ecode2)) {
@@ -29817,6 +30803,7 @@ XS(_wrap_svn_stream_write) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
arg2 = SvPV(ST(1), temp2);
@@ -29871,6 +30858,7 @@ XS(_wrap_svn_stream_close) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
result = (svn_error_t *)svn_stream_close(arg1);
@@ -29915,6 +30903,7 @@ XS(_wrap_svn_stream_reset) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
result = (svn_error_t *)svn_stream_reset(arg1);
@@ -29959,6 +30948,7 @@ XS(_wrap_svn_stream_supports_mark) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
result = (svn_boolean_t)svn_stream_supports_mark(arg1);
@@ -29989,6 +30979,7 @@ XS(_wrap_svn_stream_mark) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -29996,6 +30987,7 @@ XS(_wrap_svn_stream_mark) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
if (items > 1) {
@@ -30059,6 +31051,7 @@ XS(_wrap_svn_stream_seek) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_stream_mark_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -30098,6 +31091,63 @@ XS(_wrap_svn_stream_seek) {
}
+XS(_wrap_svn_stream_data_available) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_boolean_t *arg2 = (svn_boolean_t *) 0 ;
+ svn_boolean_t temp2 ;
+ int res2 = SWIG_TMPOBJ ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ arg2 = &temp2;
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_stream_data_available(stream);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ result = (svn_error_t *)svn_stream_data_available(arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res2)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg2)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_stream_tee) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -30110,15 +31160,18 @@ XS(_wrap_svn_stream_tee) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_stream_tee(out1,out2,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -30130,7 +31183,11 @@ XS(_wrap_svn_stream_tee) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -30162,6 +31219,7 @@ XS(_wrap_svn_stream_puts) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
@@ -30221,6 +31279,7 @@ XS(_wrap_svn_stream_readline) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg4 = &temp4;
@@ -30229,6 +31288,7 @@ XS(_wrap_svn_stream_readline) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -30298,34 +31358,30 @@ XS(_wrap_svn_stream_copy3) {
void *arg4 = (void *) 0 ;
apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
- int res4 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_stream_copy3(from,to,cancel_func,cancel_baton,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_copy3" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_stream_copy3" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -30353,15 +31409,11 @@ XS(_wrap_svn_stream_copy3) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -30375,34 +31427,30 @@ XS(_wrap_svn_stream_copy2) {
void *arg4 = (void *) 0 ;
apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
- int res4 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_stream_copy2(from,to,cancel_func,cancel_baton,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_copy2" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_stream_copy2" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -30430,15 +31478,11 @@ XS(_wrap_svn_stream_copy2) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -30456,15 +31500,18 @@ XS(_wrap_svn_stream_copy) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_stream_copy(from,to,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -30519,6 +31566,7 @@ XS(_wrap_svn_stream_contents_same2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -30526,9 +31574,11 @@ XS(_wrap_svn_stream_contents_same2) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -30591,6 +31641,7 @@ XS(_wrap_svn_stream_contents_same) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -30598,9 +31649,11 @@ XS(_wrap_svn_stream_contents_same) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -30662,9 +31715,11 @@ XS(_wrap_svn_string_from_stream) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -30672,6 +31727,7 @@ XS(_wrap_svn_string_from_stream) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
if (items > 1) {
@@ -30739,6 +31795,7 @@ XS(_wrap_svn_stream_lazyopen_create) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_stream_lazyopen_create(open_func,open_baton,open_on_close,result_pool);");
@@ -30768,7 +31825,11 @@ XS(_wrap_svn_stream_lazyopen_create) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -30802,6 +31863,7 @@ XS(_wrap_svn_stringbuf_from_file2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -30873,6 +31935,7 @@ XS(_wrap_svn_stringbuf_from_file) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -30941,6 +32004,7 @@ XS(_wrap_svn_stringbuf_from_aprfile) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -31011,6 +32075,7 @@ XS(_wrap_svn_io_remove_file2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_io_remove_file2(path,ignore_enoent,scratch_pool);");
@@ -31076,15 +32141,15 @@ XS(_wrap_svn_io_remove_dir2) {
int alloc1 = 0 ;
int val2 ;
int ecode2 = 0 ;
- int res4 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_io_remove_dir2(path,ignore_enoent,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -31098,16 +32163,10 @@ XS(_wrap_svn_io_remove_dir2) {
}
arg2 = (svn_boolean_t)(val2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_io_remove_dir2" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_io_remove_dir2" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -31135,15 +32194,11 @@ XS(_wrap_svn_io_remove_dir2) {
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
-
-
SWIG_croak_null();
}
}
@@ -31169,9 +32224,11 @@ XS(_wrap_svn_io_get_dirents3) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31258,9 +32315,11 @@ XS(_wrap_svn_io_stat_dirent2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -31357,9 +32416,11 @@ XS(_wrap_svn_io_stat_dirent) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31449,6 +32510,7 @@ XS(_wrap_svn_io_dir_walk2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_io_dir_walk2(dirname,wanted,walk_func,walk_baton,pool);");
@@ -31557,6 +32619,7 @@ XS(_wrap_svn_io_start_cmd3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_io_start_cmd3(cmd_proc,path,cmd,args,env,inherit,infile_pipe,infile,outfile_pipe,outfile,errfile_pipe,errfile,pool);");
@@ -31712,6 +32775,7 @@ XS(_wrap_svn_io_start_cmd2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_io_start_cmd2(cmd_proc,path,cmd,args,inherit,infile_pipe,infile,outfile_pipe,outfile,errfile_pipe,errfile,pool);");
@@ -31866,6 +32930,7 @@ XS(_wrap_svn_io_run_diff2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg8 = &temp8;
if ((items < 10) || (items > 11)) {
@@ -32028,6 +33093,7 @@ XS(_wrap_svn_io_run_diff3_3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -32159,6 +33225,7 @@ XS(_wrap_svn_io_parse_mimetypes_file) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -32233,6 +33300,7 @@ XS(_wrap_svn_io_detect_mimetype2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -32309,6 +33377,7 @@ XS(_wrap_svn_io_detect_mimetype) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -32419,6 +33488,7 @@ XS(_wrap_svn_io_file_putc) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_io_file_putc(ch,file,pool);");
@@ -32491,6 +33561,7 @@ XS(_wrap_svn_io_file_read_full2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
arg5 = &temp5;
@@ -32565,6 +33636,235 @@ XS(_wrap_svn_io_file_read_full2) {
}
+XS(_wrap_svn_io_file_aligned_seek) {
+ {
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_off_t arg2 ;
+ apr_off_t *arg3 = (apr_off_t *) 0 ;
+ apr_off_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ long long val2 ;
+ int ecode2 = 0 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ long long val4 ;
+ int ecode4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_io_file_aligned_seek(file,block_size,buffer_start,offset,scratch_pool);");
+ }
+ {
+ arg1 = svn_swig_pl_make_file(ST(0), _global_pool);
+ }
+ ecode2 = SWIG_AsVal_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_io_file_aligned_seek" "', argument " "2"" of type '" "apr_off_t""'");
+ }
+ arg2 = (apr_off_t)(val2);
+ res3 = SWIG_ConvertPtr(ST(2), &argp3,SWIGTYPE_p_apr_off_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_io_file_aligned_seek" "', argument " "3"" of type '" "apr_off_t *""'");
+ }
+ arg3 = (apr_off_t *)(argp3);
+ ecode4 = SWIG_AsVal_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_io_file_aligned_seek" "', argument " "4"" of type '" "apr_off_t""'");
+ }
+ arg4 = (apr_off_t)(val4);
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_aligned_seek(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_io_file_flush) {
+ {
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 1) || (items > 2)) {
+ SWIG_croak("Usage: svn_io_file_flush(file,scratch_pool);");
+ }
+ {
+ arg1 = svn_swig_pl_make_file(ST(0), _global_pool);
+ }
+ if (items > 1) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_flush(arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_io_write_atomic) {
+ {
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_io_write_atomic(final_path,buf,nbytes,copy_perms_path,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_io_write_atomic" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_io_write_atomic" "', argument " "2"" of type '" "void const *""'");
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_io_write_atomic" "', argument " "3"" of type '" "apr_size_t""'");
+ }
+ arg3 = (apr_size_t)(val3);
+ res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_io_write_atomic" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_write_atomic((char const *)arg1,(void const *)arg2,arg3,(char const *)arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_io_write_unique) {
{
char **arg1 = (char **) 0 ;
@@ -32589,6 +33889,7 @@ XS(_wrap_svn_io_write_unique) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -32678,6 +33979,7 @@ XS(_wrap_svn_io_file_trunc) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_io_file_trunc(file,offset,pool);");
@@ -32789,6 +34091,7 @@ XS(_wrap_svn_io_file_name_get) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -32864,9 +34167,11 @@ XS(_wrap_svn_io_file_readline) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -33226,6 +34531,7 @@ XS(_wrap_svn_stream_invoke_mark_fn) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -33355,6 +34661,73 @@ XS(_wrap_svn_stream_invoke_seek_fn) {
}
+XS(_wrap_svn_stream_invoke_data_available_fn) {
+ {
+ svn_stream_data_available_fn_t arg1 = (svn_stream_data_available_fn_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_boolean_t *arg3 = (svn_boolean_t *) 0 ;
+ int res2 ;
+ svn_boolean_t temp3 ;
+ int res3 = SWIG_TMPOBJ ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ arg3 = &temp3;
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_stream_invoke_data_available_fn(_obj,baton);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_stream_invoke_data_available_fn" "', argument " "1"" of type '" "svn_stream_data_available_fn_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_stream_invoke_data_available_fn" "', argument " "2"" of type '" "void *""'");
+ }
+ {
+ result = (svn_error_t *)svn_stream_invoke_data_available_fn(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res3)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg3)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_stream_invoke_lazyopen_func) {
{
svn_stream_lazyopen_func_t arg1 = (svn_stream_lazyopen_func_t) 0 ;
@@ -33371,9 +34744,11 @@ XS(_wrap_svn_stream_invoke_lazyopen_func) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 4)) {
@@ -33418,7 +34793,11 @@ XS(_wrap_svn_stream_invoke_lazyopen_func) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg2); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg2);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -33457,6 +34836,7 @@ XS(_wrap_svn_io_invoke_walk_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_io_invoke_walk_func(_obj,baton,path,finfo,pool);");
@@ -33718,6 +35098,7 @@ XS(_wrap_svn_checksum_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_create(kind,pool);");
@@ -33852,6 +35233,7 @@ XS(_wrap_svn_checksum_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_dup(checksum,pool);");
@@ -33895,6 +35277,7 @@ XS(_wrap_svn_checksum_to_cstring_display) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_to_cstring_display(checksum,pool);");
@@ -33938,6 +35321,7 @@ XS(_wrap_svn_checksum_to_cstring) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_to_cstring(checksum,pool);");
@@ -33982,9 +35366,11 @@ XS(_wrap_svn_checksum_serialize) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 3)) {
SWIG_croak("Usage: svn_checksum_serialize(checksum,result_pool,scratch_pool);");
@@ -34037,9 +35423,11 @@ XS(_wrap_svn_checksum_deserialize) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -34121,6 +35509,7 @@ XS(_wrap_svn_checksum_parse_hex) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -34205,6 +35594,7 @@ XS(_wrap_svn_checksum) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -34288,6 +35678,7 @@ XS(_wrap_svn_checksum_empty_checksum) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_empty_checksum(kind,pool);");
@@ -34331,6 +35722,7 @@ XS(_wrap_svn_checksum_ctx_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_checksum_ctx_create(kind,pool);");
@@ -34442,6 +35834,7 @@ XS(_wrap_svn_checksum_final) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -34586,6 +35979,7 @@ XS(_wrap_svn_checksum_mismatch_err) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if (items < 2) {
SWIG_croak("Usage: svn_checksum_mismatch_err(expected,actual,scratch_pool,fmt,...);");
@@ -34726,6 +36120,7 @@ XS(_wrap_svn_md5_digest_to_cstring_display) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_md5_digest_to_cstring_display(digest,pool);");
@@ -34768,6 +36163,7 @@ XS(_wrap_svn_md5_digest_to_cstring) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_md5_digest_to_cstring(digest,pool);");
@@ -35759,6 +37155,7 @@ XS(_wrap_svn_diff_diff_2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -35833,6 +37230,7 @@ XS(_wrap_svn_diff_diff) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -35907,6 +37305,7 @@ XS(_wrap_svn_diff_diff3_2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -35981,6 +37380,7 @@ XS(_wrap_svn_diff_diff3) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -36055,6 +37455,7 @@ XS(_wrap_svn_diff_diff4_2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -36129,6 +37530,7 @@ XS(_wrap_svn_diff_diff4) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -36627,6 +38029,78 @@ XS(_wrap_delete_svn_diff_output_fns_t) {
}
+XS(_wrap_svn_diff_output2) {
+ {
+ svn_diff_t *arg1 = (svn_diff_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_diff_output_fns_t *arg3 = (svn_diff_output_fns_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if ((items < 4) || (items > 4)) {
+ SWIG_croak("Usage: svn_diff_output2(diff,output_baton,output_fns,cancel_func,cancel_baton);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_diff_output2" "', argument " "1"" of type '" "svn_diff_t *""'");
+ }
+ arg1 = (svn_diff_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_diff_output2" "', argument " "2"" of type '" "void *""'");
+ }
+ res3 = SWIG_ConvertPtr(ST(2), &argp3,SWIGTYPE_p_svn_diff_output_fns_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_diff_output2" "', argument " "3"" of type '" "svn_diff_output_fns_t const *""'");
+ }
+ arg3 = (svn_diff_output_fns_t *)(argp3);
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
+ }
+ {
+ result = (svn_error_t *)svn_diff_output2(arg1,arg2,(struct svn_diff_output_fns_t const *)arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_output) {
{
svn_diff_t *arg1 = (svn_diff_t *) 0 ;
@@ -36888,6 +38362,71 @@ XS(_wrap_svn_diff_file_options_t_show_c_function_get) {
}
+XS(_wrap_svn_diff_file_options_t_context_size_set) {
+ {
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_diff_file_options_t_context_size_set(self,context_size);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_diff_file_options_t_context_size_set" "', argument " "1"" of type '" "struct svn_diff_file_options_t *""'");
+ }
+ arg1 = (struct svn_diff_file_options_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_diff_file_options_t_context_size_set" "', argument " "2"" of type '" "int""'");
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->context_size = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_diff_file_options_t_context_size_get) {
+ {
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ int result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_diff_file_options_t_context_size_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_diff_file_options_t_context_size_get" "', argument " "1"" of type '" "struct svn_diff_file_options_t *""'");
+ }
+ arg1 = (struct svn_diff_file_options_t *)(argp1);
+ result = (int) ((arg1)->context_size);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_new_svn_diff_file_options_t) {
{
int argvi = 0;
@@ -36953,6 +38492,7 @@ XS(_wrap_svn_diff_file_options_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_diff_file_options_create(pool);");
@@ -36990,6 +38530,7 @@ XS(_wrap_svn_diff_file_options_parse) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_diff_file_options_parse(options,args,pool);");
@@ -37000,7 +38541,7 @@ XS(_wrap_svn_diff_file_options_parse) {
}
arg1 = (svn_diff_file_options_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
if (items > 2) {
@@ -37064,6 +38605,7 @@ XS(_wrap_svn_diff_file_diff_2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -37149,6 +38691,7 @@ XS(_wrap_svn_diff_file_diff) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -37234,6 +38777,7 @@ XS(_wrap_svn_diff_file_diff3_2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -37330,6 +38874,7 @@ XS(_wrap_svn_diff_file_diff3) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -37426,6 +38971,7 @@ XS(_wrap_svn_diff_file_diff4_2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -37533,6 +39079,7 @@ XS(_wrap_svn_diff_file_diff4) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -37605,6 +39152,164 @@ XS(_wrap_svn_diff_file_diff4) {
}
+XS(_wrap_svn_diff_file_output_unified4) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ svn_boolean_t arg9 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int val9 ;
+ int ecode9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_diff_file_output_unified4(output_stream,diff,original_path,modified_path,original_header,modified_header,header_encoding,relative_to_dir,show_c_function,context_size,cancel_func,cancel_baton,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_diff_file_output_unified4" "', argument " "2"" of type '" "svn_diff_t *""'");
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_diff_file_output_unified4" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_diff_file_output_unified4" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_diff_file_output_unified4" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_diff_file_output_unified4" "', argument " "6"" of type '" "char const *""'");
+ }
+ arg6 = (char *)(buf6);
+ res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_diff_file_output_unified4" "', argument " "7"" of type '" "char const *""'");
+ }
+ arg7 = (char *)(buf7);
+ res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_diff_file_output_unified4" "', argument " "8"" of type '" "char const *""'");
+ }
+ arg8 = (char *)(buf8);
+ ecode9 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val9);
+ if (!SWIG_IsOK(ecode9)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "svn_diff_file_output_unified4" "', argument " "9"" of type '" "svn_boolean_t""'");
+ }
+ arg9 = (svn_boolean_t)(val9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_diff_file_output_unified4" "', argument " "10"" of type '" "int""'");
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(10);
+ }
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_file_output_unified4(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_file_output_unified3) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -37646,12 +39351,14 @@ XS(_wrap_svn_diff_file_output_unified3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_diff_file_output_unified3(output_stream,diff,original_path,modified_path,original_header,modified_header,header_encoding,relative_to_dir,show_c_function,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -37779,12 +39486,14 @@ XS(_wrap_svn_diff_file_output_unified2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_diff_file_output_unified2(output_stream,diff,original_path,modified_path,original_header,modified_header,header_encoding,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -37894,12 +39603,14 @@ XS(_wrap_svn_diff_file_output_unified) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_diff_file_output_unified(output_stream,diff,original_path,modified_path,original_header,modified_header,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -37972,6 +39683,165 @@ XS(_wrap_svn_diff_file_output_unified) {
}
+XS(_wrap_svn_diff_file_output_merge3) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int res9 ;
+ char *buf9 = 0 ;
+ int alloc9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_diff_file_output_merge3(output_stream,diff,original_path,modified_path,latest_path,conflict_original,conflict_modified,conflict_latest,conflict_separator,conflict_style,cancel_func,cancel_baton,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_diff_file_output_merge3" "', argument " "2"" of type '" "svn_diff_t *""'");
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_diff_file_output_merge3" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_diff_file_output_merge3" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_diff_file_output_merge3" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_diff_file_output_merge3" "', argument " "6"" of type '" "char const *""'");
+ }
+ arg6 = (char *)(buf6);
+ res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_diff_file_output_merge3" "', argument " "7"" of type '" "char const *""'");
+ }
+ arg7 = (char *)(buf7);
+ res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_diff_file_output_merge3" "', argument " "8"" of type '" "char const *""'");
+ }
+ arg8 = (char *)(buf8);
+ res9 = SWIG_AsCharPtrAndSize(ST(8), &buf9, NULL, &alloc9);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_diff_file_output_merge3" "', argument " "9"" of type '" "char const *""'");
+ }
+ arg9 = (char *)(buf9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_diff_file_output_merge3" "', argument " "10"" of type '" "svn_diff_conflict_display_style_t""'");
+ }
+ arg10 = (svn_diff_conflict_display_style_t)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(10);
+ }
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_file_output_merge3(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_file_output_merge2) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -38017,12 +39887,14 @@ XS(_wrap_svn_diff_file_output_merge2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_diff_file_output_merge2(output_stream,diff,original_path,modified_path,latest_path,conflict_original,conflict_modified,conflict_latest,conflict_separator,conflict_style,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -38171,12 +40043,14 @@ XS(_wrap_svn_diff_file_output_merge) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_diff_file_output_merge(output_stream,diff,original_path,modified_path,latest_path,conflict_original,conflict_modified,conflict_latest,conflict_separator,display_original_in_conflict,display_resolved_conflicts,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -38284,6 +40158,82 @@ XS(_wrap_svn_diff_file_output_merge) {
}
+XS(_wrap_svn_diff_output_binary) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg3 = (svn_stream_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_diff_output_binary(output_stream,original,latest,cancel_func,cancel_baton,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ {
+ svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
+ }
+ {
+ svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
+ }
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_output_binary(arg1,arg2,arg3,arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_mem_string_diff) {
{
svn_diff_t **arg1 = (svn_diff_t **) 0 ;
@@ -38303,6 +40253,7 @@ XS(_wrap_svn_diff_mem_string_diff) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -38397,6 +40348,7 @@ XS(_wrap_svn_diff_mem_string_diff3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -38504,6 +40456,7 @@ XS(_wrap_svn_diff_mem_string_diff4) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -38599,6 +40552,168 @@ XS(_wrap_svn_diff_mem_string_diff4) {
}
+XS(_wrap_svn_diff_mem_string_output_unified3) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_boolean_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ svn_string_t *arg8 = (svn_string_t *) 0 ;
+ svn_string_t *arg9 = (svn_string_t *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ svn_string_t value8 ;
+ svn_string_t value9 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_diff_mem_string_output_unified3(output_stream,diff,with_diff_header,hunk_delimiter,original_header,modified_header,header_encoding,original,modified,context_size,cancel_func,cancel_baton,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "2"" of type '" "svn_diff_t *""'");
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "6"" of type '" "char const *""'");
+ }
+ arg6 = (char *)(buf6);
+ res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "7"" of type '" "char const *""'");
+ }
+ arg7 = (char *)(buf7);
+ {
+ if (SvOK(ST(7))) {
+ value8.data = SvPV(ST(7), value8.len);
+ arg8 = &value8;
+ }
+ else {
+ arg8 = NULL;
+ }
+ }
+ {
+ if (SvOK(ST(8))) {
+ value9.data = SvPV(ST(8), value9.len);
+ arg9 = &value9;
+ }
+ else {
+ arg9 = NULL;
+ }
+ }
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_diff_mem_string_output_unified3" "', argument " "10"" of type '" "int""'");
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(10);
+ }
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_mem_string_output_unified3(arg1,arg2,arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(struct svn_string_t const *)arg8,(struct svn_string_t const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_mem_string_output_unified2) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -38636,12 +40751,14 @@ XS(_wrap_svn_diff_mem_string_output_unified2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_diff_mem_string_output_unified2(output_stream,diff,with_diff_header,hunk_delimiter,original_header,modified_header,header_encoding,original,modified,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -38773,12 +40890,14 @@ XS(_wrap_svn_diff_mem_string_output_unified) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_diff_mem_string_output_unified(output_stream,diff,original_header,modified_header,header_encoding,original,modified,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -38866,6 +40985,171 @@ XS(_wrap_svn_diff_mem_string_output_unified) {
}
+XS(_wrap_svn_diff_mem_string_output_merge3) {
+ {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_string_t *arg3 = (svn_string_t *) 0 ;
+ svn_string_t *arg4 = (svn_string_t *) 0 ;
+ svn_string_t *arg5 = (svn_string_t *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_string_t value3 ;
+ svn_string_t value4 ;
+ svn_string_t value5 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int res9 ;
+ char *buf9 = 0 ;
+ int alloc9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_diff_mem_string_output_merge3(output_stream,diff,original,modified,latest,conflict_original,conflict_modified,conflict_latest,conflict_separator,style,cancel_func,cancel_baton,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
+ }
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "2"" of type '" "svn_diff_t *""'");
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ {
+ if (SvOK(ST(2))) {
+ value3.data = SvPV(ST(2), value3.len);
+ arg3 = &value3;
+ }
+ else {
+ arg3 = NULL;
+ }
+ }
+ {
+ if (SvOK(ST(3))) {
+ value4.data = SvPV(ST(3), value4.len);
+ arg4 = &value4;
+ }
+ else {
+ arg4 = NULL;
+ }
+ }
+ {
+ if (SvOK(ST(4))) {
+ value5.data = SvPV(ST(4), value5.len);
+ arg5 = &value5;
+ }
+ else {
+ arg5 = NULL;
+ }
+ }
+ res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "6"" of type '" "char const *""'");
+ }
+ arg6 = (char *)(buf6);
+ res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "7"" of type '" "char const *""'");
+ }
+ arg7 = (char *)(buf7);
+ res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "8"" of type '" "char const *""'");
+ }
+ arg8 = (char *)(buf8);
+ res9 = SWIG_AsCharPtrAndSize(ST(8), &buf9, NULL, &alloc9);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "9"" of type '" "char const *""'");
+ }
+ arg9 = (char *)(buf9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_diff_mem_string_output_merge3" "', argument " "10"" of type '" "svn_diff_conflict_display_style_t""'");
+ }
+ arg10 = (svn_diff_conflict_display_style_t)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(10);
+ }
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_mem_string_output_merge3(arg1,arg2,(struct svn_string_t const *)arg3,(struct svn_string_t const *)arg4,(struct svn_string_t const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_diff_mem_string_output_merge2) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -38905,12 +41189,14 @@ XS(_wrap_svn_diff_mem_string_output_merge2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_diff_mem_string_output_merge2(output_stream,diff,original,modified,latest,conflict_original,conflict_modified,conflict_latest,conflict_separator,style,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -39065,12 +41351,14 @@ XS(_wrap_svn_diff_mem_string_output_merge) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_diff_mem_string_output_merge(output_stream,diff,original,modified,latest,conflict_original,conflict_modified,conflict_latest,conflict_separator,display_original_in_conflict,display_resolved_conflicts,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -39211,9 +41499,11 @@ XS(_wrap_svn_diff_hunk_readline_diff_text) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -39314,9 +41604,11 @@ XS(_wrap_svn_diff_hunk_readline_original_text) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -39417,9 +41709,11 @@ XS(_wrap_svn_diff_hunk_readline_modified_text) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -40457,6 +42751,136 @@ XS(_wrap_svn_patch_t_reverse_get) {
}
+XS(_wrap_svn_patch_t_mergeinfo_set) {
+ {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_patch_t_mergeinfo_set(self,mergeinfo);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_patch_t_mergeinfo_set" "', argument " "1"" of type '" "struct svn_patch_t *""'");
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, SWIG_POINTER_DISOWN | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_patch_t_mergeinfo_set" "', argument " "2"" of type '" "svn_mergeinfo_t""'");
+ }
+ arg2 = (svn_mergeinfo_t)(argp2);
+ if (arg1) (arg1)->mergeinfo = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_patch_t_mergeinfo_get) {
+ {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_mergeinfo_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_patch_t_mergeinfo_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_patch_t_mergeinfo_get" "', argument " "1"" of type '" "struct svn_patch_t *""'");
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ result = (svn_mergeinfo_t) ((arg1)->mergeinfo);
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_apr_hash_t, 0 | 0); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_patch_t_reverse_mergeinfo_set) {
+ {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_patch_t_reverse_mergeinfo_set(self,reverse_mergeinfo);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_patch_t_reverse_mergeinfo_set" "', argument " "1"" of type '" "struct svn_patch_t *""'");
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, SWIG_POINTER_DISOWN | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_patch_t_reverse_mergeinfo_set" "', argument " "2"" of type '" "svn_mergeinfo_t""'");
+ }
+ arg2 = (svn_mergeinfo_t)(argp2);
+ if (arg1) (arg1)->reverse_mergeinfo = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_patch_t_reverse_mergeinfo_get) {
+ {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_mergeinfo_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_patch_t_reverse_mergeinfo_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_patch_t_reverse_mergeinfo_get" "', argument " "1"" of type '" "struct svn_patch_t *""'");
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ result = (svn_mergeinfo_t) ((arg1)->reverse_mergeinfo);
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_apr_hash_t, 0 | 0); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_new_svn_patch_t) {
{
int argvi = 0;
@@ -40528,6 +42952,7 @@ XS(_wrap_svn_diff_open_patch_file) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -40601,9 +43026,11 @@ XS(_wrap_svn_diff_parse_next_patch) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -40687,6 +43114,7 @@ XS(_wrap_svn_diff_close_patch_file) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_diff_close_patch_file(patch_file,scratch_pool);");
@@ -42230,11 +44658,11 @@ XS(_wrap_svn_err_best_message) {
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_error_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_err_best_message" "', argument " "1"" of type '" "svn_error_t *""'");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_err_best_message" "', argument " "1"" of type '" "svn_error_t const *""'");
}
arg1 = (svn_error_t *)(argp1);
{
- result = (char *)svn_err_best_message(arg1,arg2,arg3);
+ result = (char *)svn_err_best_message((struct svn_error_t const *)arg1,arg2,arg3);
@@ -42509,6 +44937,66 @@ XS(_wrap_svn_error_quick_wrap) {
}
+XS(_wrap_svn_error_quick_wrapf) {
+ {
+ svn_error_t *arg1 = (svn_error_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *arg3 = 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if (items < 2) {
+ SWIG_croak("Usage: svn_error_quick_wrapf(child,fmt,...);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_error_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_error_quick_wrapf" "', argument " "1"" of type '" "svn_error_t *""'");
+ }
+ arg1 = (svn_error_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_error_quick_wrapf" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ result = (svn_error_t *)svn_error_quick_wrapf(arg1,(char const *)arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_error_compose_create) {
{
svn_error_t *arg1 = (svn_error_t *) 0 ;
@@ -42729,11 +45217,11 @@ XS(_wrap_svn_error_dup) {
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_error_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_error_dup" "', argument " "1"" of type '" "svn_error_t *""'");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_error_dup" "', argument " "1"" of type '" "svn_error_t const *""'");
}
arg1 = (svn_error_t *)(argp1);
{
- result = (svn_error_t *)svn_error_dup(arg1);
+ result = (svn_error_t *)svn_error_dup((struct svn_error_t const *)arg1);
@@ -42923,7 +45411,7 @@ XS(_wrap_svn_handle_warning2) {
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_error_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_handle_warning2" "', argument " "2"" of type '" "svn_error_t *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_handle_warning2" "', argument " "2"" of type '" "svn_error_t const *""'");
}
arg2 = (svn_error_t *)(argp2);
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
@@ -42932,7 +45420,7 @@ XS(_wrap_svn_handle_warning2) {
}
arg3 = (char *)(buf3);
{
- svn_handle_warning2(arg1,arg2,(char const *)arg3);
+ svn_handle_warning2(arg1,(struct svn_error_t const *)arg2,(char const *)arg3);
@@ -43149,6 +45637,29 @@ XS(_wrap_svn_error_set_malfunction_handler) {
}
+XS(_wrap_svn_error_get_malfunction_handler) {
+ {
+ int argvi = 0;
+ svn_error_malfunction_handler_t result;
+ dXSARGS;
+
+ if ((items < 0) || (items > 0)) {
+ SWIG_croak("Usage: svn_error_get_malfunction_handler();");
+ }
+ {
+ result = (svn_error_malfunction_handler_t)svn_error_get_malfunction_handler();
+
+
+
+ }
+ ST(argvi) = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_svn_boolean_t_p_q_const__char_int_p_q_const__char__p_svn_error_t); argvi++ ;
+ XSRETURN(argvi);
+ fail:
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_error_raise_on_malfunction) {
{
svn_boolean_t arg1 ;
@@ -43409,7 +45920,6 @@ static swig_type_info _swigt__p_apr_file_t = {"_p_apr_file_t", "apr_file_t *", 0
static swig_type_info _swigt__p_apr_finfo_t = {"_p_apr_finfo_t", "apr_finfo_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_option_t = {"_p_apr_getopt_option_t", "apr_getopt_option_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_t = {"_p_apr_getopt_t", "apr_getopt_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_apr_hash_index_t = {"_p_apr_hash_index_t", "apr_hash_index_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "svn_mergeinfo_catalog_t|svn_mergeinfo_t|apr_hash_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
@@ -43435,6 +45945,7 @@ static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void__int =
static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int", "svn_config_enumerator2_t|int (*)(char const *,char const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void__int = {"_p_f_p_q_const__char_p_void__int", "svn_config_section_enumerator_t|int (*)(char const *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_void_p_apr_pool_t__int", "int (*)(char const *,void *,apr_pool_t *)|svn_config_section_enumerator2_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int = {"_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int", "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)|int (*)(struct svn_version_t const *,struct svn_version_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,char const *,void *,apr_pool_t *)|svn_auth_plaintext_prompt_func_t|svn_auth_plaintext_passphrase_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,void *,char const *,char const *,apr_hash_t *,apr_pool_t *)|svn_config_auth_walk_func_t", 0, 0, (void*)0, 0};
@@ -43452,6 +45963,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_size_t *)|svn_write_fn_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_finfo_t const *,apr_pool_t *)|svn_io_walk_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t = {"_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t", "svn_stream_seek_fn_t|struct svn_error_t *(*)(void *,svn_stream_mark_t const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t = {"_p_f_p_void_p_svn_boolean_t__p_svn_error_t", "svn_stream_data_available_fn_t|struct svn_error_t *(*)(void *,svn_boolean_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_void__void = {"_p_f_p_void_p_void__void", "void (*)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t = {"_p_f_p_void_p_void_p_void_p_int__p_svn_error_t", "svn_error_t *(*)(void *,void *,void *,int *)|struct svn_error_t *(*)(void *,void *,void *,int *)", 0, 0, (void*)0, 0};
@@ -43560,7 +46072,6 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_apr_finfo_t,
&_swigt__p_apr_getopt_option_t,
&_swigt__p_apr_getopt_t,
- &_swigt__p_apr_hash_index_t,
&_swigt__p_apr_hash_t,
&_swigt__p_apr_int32_t,
&_swigt__p_apr_int64_t,
@@ -43586,6 +46097,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
&_swigt__p_f_p_q_const__char_p_void__int,
&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ &_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -43603,6 +46115,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_void__void,
&_swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t,
@@ -43711,7 +46224,6 @@ static swig_cast_info _swigc__p_apr_file_t[] = { {&_swigt__p_apr_file_t, 0, 0,
static swig_cast_info _swigc__p_apr_finfo_t[] = { {&_swigt__p_apr_finfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_option_t[] = { {&_swigt__p_apr_getopt_option_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_t[] = { {&_swigt__p_apr_getopt_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_apr_hash_index_t[] = { {&_swigt__p_apr_hash_index_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_hash_t[] = { {&_swigt__p_apr_hash_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int32_t[] = { {&_swigt__p_apr_int32_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int64_t[] = { {&_swigt__p_apr_int64_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -43737,6 +46249,7 @@ static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void__int[]
static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void__int[] = { {&_swigt__p_f_p_q_const__char_p_void__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int[] = { {&_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -43754,6 +46267,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_void__void[] = { {&_swigt__p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_void_p_void_p_int__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -43862,7 +46376,6 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_apr_finfo_t,
_swigc__p_apr_getopt_option_t,
_swigc__p_apr_getopt_t,
- _swigc__p_apr_hash_index_t,
_swigc__p_apr_hash_t,
_swigc__p_apr_int32_t,
_swigc__p_apr_int64_t,
@@ -43888,6 +46401,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
_swigc__p_f_p_q_const__char_p_void__int,
_swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -43905,6 +46419,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_void__void,
_swigc__p_f_p_void_p_void_p_void_p_int__p_svn_error_t,
@@ -44043,9 +46558,6 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_error_t_line_get", _wrap_svn_error_t_line_get},
{"SVN::_Core::new_svn_error_t", _wrap_new_svn_error_t},
{"SVN::_Core::delete_svn_error_t", _wrap_delete_svn_error_t},
-{"SVN::_Core::svn__apr_hash_index_key", _wrap_svn__apr_hash_index_key},
-{"SVN::_Core::svn__apr_hash_index_klen", _wrap_svn__apr_hash_index_klen},
-{"SVN::_Core::svn__apr_hash_index_val", _wrap_svn__apr_hash_index_val},
{"SVN::_Core::svn_node_kind_to_word", _wrap_svn_node_kind_to_word},
{"SVN::_Core::svn_node_kind_from_word", _wrap_svn_node_kind_from_word},
{"SVN::_Core::svn_tristate__to_word", _wrap_svn_tristate__to_word},
@@ -44190,6 +46702,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_version_checklist_t_version_query_get", _wrap_svn_version_checklist_t_version_query_get},
{"SVN::_Core::new_svn_version_checklist_t", _wrap_new_svn_version_checklist_t},
{"SVN::_Core::delete_svn_version_checklist_t", _wrap_delete_svn_version_checklist_t},
+{"SVN::_Core::svn_ver_check_list2", _wrap_svn_ver_check_list2},
{"SVN::_Core::svn_ver_check_list", _wrap_svn_ver_check_list},
{"SVN::_Core::svn_subr_version", _wrap_svn_subr_version},
{"SVN::_Core::svn_version_extended", _wrap_svn_version_extended},
@@ -44318,6 +46831,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_opt_print_help2", _wrap_svn_opt_print_help2},
{"SVN::_Core::svn_opt_print_help", _wrap_svn_opt_print_help},
{"SVN::_Core::svn_cmdline_init", _wrap_svn_cmdline_init},
+{"SVN::_Core::svn_cmdline_create_auth_baton2", _wrap_svn_cmdline_create_auth_baton2},
{"SVN::_Core::svn_cmdline_create_auth_baton", _wrap_svn_cmdline_create_auth_baton},
{"SVN::_Core::svn_auth_provider_t_cred_kind_set", _wrap_svn_auth_provider_t_cred_kind_set},
{"SVN::_Core::svn_auth_provider_t_cred_kind_get", _wrap_svn_auth_provider_t_cred_kind_get},
@@ -44495,6 +47009,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_relpath_split", _wrap_svn_relpath_split},
{"SVN::_Core::svn_relpath_basename", _wrap_svn_relpath_basename},
{"SVN::_Core::svn_relpath_dirname", _wrap_svn_relpath_dirname},
+{"SVN::_Core::svn_relpath_prefix", _wrap_svn_relpath_prefix},
{"SVN::_Core::svn_uri_split", _wrap_svn_uri_split},
{"SVN::_Core::svn_uri_basename", _wrap_svn_uri_basename},
{"SVN::_Core::svn_uri_dirname", _wrap_svn_uri_dirname},
@@ -44571,11 +47086,15 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_io_file_checksum", _wrap_svn_io_file_checksum},
{"SVN::_Core::svn_io_files_contents_same_p", _wrap_svn_io_files_contents_same_p},
{"SVN::_Core::svn_io_files_contents_three_same_p", _wrap_svn_io_files_contents_three_same_p},
+{"SVN::_Core::svn_io_file_create_bytes", _wrap_svn_io_file_create_bytes},
+{"SVN::_Core::svn_io_file_create_empty", _wrap_svn_io_file_create_empty},
{"SVN::_Core::svn_io_lock_open_file", _wrap_svn_io_lock_open_file},
{"SVN::_Core::svn_io_unlock_open_file", _wrap_svn_io_unlock_open_file},
+{"SVN::_Core::svn_stream_set_read2", _wrap_svn_stream_set_read2},
{"SVN::_Core::svn_stream_set_skip", _wrap_svn_stream_set_skip},
{"SVN::_Core::svn_stream_set_mark", _wrap_svn_stream_set_mark},
{"SVN::_Core::svn_stream_set_seek", _wrap_svn_stream_set_seek},
+{"SVN::_Core::svn_stream_set_data_available", _wrap_svn_stream_set_data_available},
{"SVN::_Core::svn_stream_empty", _wrap_svn_stream_empty},
{"SVN::_Core::svn_stream_disown", _wrap_svn_stream_disown},
{"SVN::_Core::svn_stream_open_readonly", _wrap_svn_stream_open_readonly},
@@ -44586,11 +47105,15 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_stream_for_stdin", _wrap_svn_stream_for_stdin},
{"SVN::_Core::svn_stream_for_stderr", _wrap_svn_stream_for_stderr},
{"SVN::_Core::svn_stream_for_stdout", _wrap_svn_stream_for_stdout},
+{"SVN::_Core::svn_stringbuf_from_stream", _wrap_svn_stringbuf_from_stream},
{"SVN::_Core::svn_stream_from_stringbuf", _wrap_svn_stream_from_stringbuf},
{"SVN::_Core::svn_stream_from_string", _wrap_svn_stream_from_string},
{"SVN::_Core::svn_stream_buffered", _wrap_svn_stream_buffered},
{"SVN::_Core::svn_stream_compressed", _wrap_svn_stream_compressed},
{"SVN::_Core::svn_stream_checksummed2", _wrap_svn_stream_checksummed2},
+{"SVN::_Core::svn_stream_read_full", _wrap_svn_stream_read_full},
+{"SVN::_Core::svn_stream_supports_partial_read", _wrap_svn_stream_supports_partial_read},
+{"SVN::_Core::svn_stream_read2", _wrap_svn_stream_read2},
{"SVN::_Core::svn_stream_read", _wrap_svn_stream_read},
{"SVN::_Core::svn_stream_skip", _wrap_svn_stream_skip},
{"SVN::_Core::svn_stream_write", _wrap_svn_stream_write},
@@ -44599,6 +47122,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_stream_supports_mark", _wrap_svn_stream_supports_mark},
{"SVN::_Core::svn_stream_mark", _wrap_svn_stream_mark},
{"SVN::_Core::svn_stream_seek", _wrap_svn_stream_seek},
+{"SVN::_Core::svn_stream_data_available", _wrap_svn_stream_data_available},
{"SVN::_Core::svn_stream_tee", _wrap_svn_stream_tee},
{"SVN::_Core::svn_stream_puts", _wrap_svn_stream_puts},
{"SVN::_Core::svn_stream_readline", _wrap_svn_stream_readline},
@@ -44628,6 +47152,9 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_io_is_binary_data", _wrap_svn_io_is_binary_data},
{"SVN::_Core::svn_io_file_putc", _wrap_svn_io_file_putc},
{"SVN::_Core::svn_io_file_read_full2", _wrap_svn_io_file_read_full2},
+{"SVN::_Core::svn_io_file_aligned_seek", _wrap_svn_io_file_aligned_seek},
+{"SVN::_Core::svn_io_file_flush", _wrap_svn_io_file_flush},
+{"SVN::_Core::svn_io_write_atomic", _wrap_svn_io_write_atomic},
{"SVN::_Core::svn_io_write_unique", _wrap_svn_io_write_unique},
{"SVN::_Core::svn_io_file_trunc", _wrap_svn_io_file_trunc},
{"SVN::_Core::svn_io_dir_close", _wrap_svn_io_dir_close},
@@ -44639,6 +47166,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_close_invoke_fn", _wrap_svn_close_invoke_fn},
{"SVN::_Core::svn_stream_invoke_mark_fn", _wrap_svn_stream_invoke_mark_fn},
{"SVN::_Core::svn_stream_invoke_seek_fn", _wrap_svn_stream_invoke_seek_fn},
+{"SVN::_Core::svn_stream_invoke_data_available_fn", _wrap_svn_stream_invoke_data_available_fn},
{"SVN::_Core::svn_stream_invoke_lazyopen_func", _wrap_svn_stream_invoke_lazyopen_func},
{"SVN::_Core::svn_io_invoke_walk_func", _wrap_svn_io_invoke_walk_func},
{"SVN::_Core::svn_checksum_t_digest_set", _wrap_svn_checksum_t_digest_set},
@@ -44718,6 +47246,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_diff_output_fns_t_output_conflict_get", _wrap_svn_diff_output_fns_t_output_conflict_get},
{"SVN::_Core::new_svn_diff_output_fns_t", _wrap_new_svn_diff_output_fns_t},
{"SVN::_Core::delete_svn_diff_output_fns_t", _wrap_delete_svn_diff_output_fns_t},
+{"SVN::_Core::svn_diff_output2", _wrap_svn_diff_output2},
{"SVN::_Core::svn_diff_output", _wrap_svn_diff_output},
{"SVN::_Core::svn_diff_file_options_t_ignore_space_set", _wrap_svn_diff_file_options_t_ignore_space_set},
{"SVN::_Core::svn_diff_file_options_t_ignore_space_get", _wrap_svn_diff_file_options_t_ignore_space_get},
@@ -44725,6 +47254,8 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_diff_file_options_t_ignore_eol_style_get", _wrap_svn_diff_file_options_t_ignore_eol_style_get},
{"SVN::_Core::svn_diff_file_options_t_show_c_function_set", _wrap_svn_diff_file_options_t_show_c_function_set},
{"SVN::_Core::svn_diff_file_options_t_show_c_function_get", _wrap_svn_diff_file_options_t_show_c_function_get},
+{"SVN::_Core::svn_diff_file_options_t_context_size_set", _wrap_svn_diff_file_options_t_context_size_set},
+{"SVN::_Core::svn_diff_file_options_t_context_size_get", _wrap_svn_diff_file_options_t_context_size_get},
{"SVN::_Core::new_svn_diff_file_options_t", _wrap_new_svn_diff_file_options_t},
{"SVN::_Core::delete_svn_diff_file_options_t", _wrap_delete_svn_diff_file_options_t},
{"SVN::_Core::svn_diff_file_options_create", _wrap_svn_diff_file_options_create},
@@ -44735,16 +47266,21 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_diff_file_diff3", _wrap_svn_diff_file_diff3},
{"SVN::_Core::svn_diff_file_diff4_2", _wrap_svn_diff_file_diff4_2},
{"SVN::_Core::svn_diff_file_diff4", _wrap_svn_diff_file_diff4},
+{"SVN::_Core::svn_diff_file_output_unified4", _wrap_svn_diff_file_output_unified4},
{"SVN::_Core::svn_diff_file_output_unified3", _wrap_svn_diff_file_output_unified3},
{"SVN::_Core::svn_diff_file_output_unified2", _wrap_svn_diff_file_output_unified2},
{"SVN::_Core::svn_diff_file_output_unified", _wrap_svn_diff_file_output_unified},
+{"SVN::_Core::svn_diff_file_output_merge3", _wrap_svn_diff_file_output_merge3},
{"SVN::_Core::svn_diff_file_output_merge2", _wrap_svn_diff_file_output_merge2},
{"SVN::_Core::svn_diff_file_output_merge", _wrap_svn_diff_file_output_merge},
+{"SVN::_Core::svn_diff_output_binary", _wrap_svn_diff_output_binary},
{"SVN::_Core::svn_diff_mem_string_diff", _wrap_svn_diff_mem_string_diff},
{"SVN::_Core::svn_diff_mem_string_diff3", _wrap_svn_diff_mem_string_diff3},
{"SVN::_Core::svn_diff_mem_string_diff4", _wrap_svn_diff_mem_string_diff4},
+{"SVN::_Core::svn_diff_mem_string_output_unified3", _wrap_svn_diff_mem_string_output_unified3},
{"SVN::_Core::svn_diff_mem_string_output_unified2", _wrap_svn_diff_mem_string_output_unified2},
{"SVN::_Core::svn_diff_mem_string_output_unified", _wrap_svn_diff_mem_string_output_unified},
+{"SVN::_Core::svn_diff_mem_string_output_merge3", _wrap_svn_diff_mem_string_output_merge3},
{"SVN::_Core::svn_diff_mem_string_output_merge2", _wrap_svn_diff_mem_string_output_merge2},
{"SVN::_Core::svn_diff_mem_string_output_merge", _wrap_svn_diff_mem_string_output_merge},
{"SVN::_Core::svn_diff_hunk_readline_diff_text", _wrap_svn_diff_hunk_readline_diff_text},
@@ -44779,6 +47315,10 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_patch_t_operation_get", _wrap_svn_patch_t_operation_get},
{"SVN::_Core::svn_patch_t_reverse_set", _wrap_svn_patch_t_reverse_set},
{"SVN::_Core::svn_patch_t_reverse_get", _wrap_svn_patch_t_reverse_get},
+{"SVN::_Core::svn_patch_t_mergeinfo_set", _wrap_svn_patch_t_mergeinfo_set},
+{"SVN::_Core::svn_patch_t_mergeinfo_get", _wrap_svn_patch_t_mergeinfo_get},
+{"SVN::_Core::svn_patch_t_reverse_mergeinfo_set", _wrap_svn_patch_t_reverse_mergeinfo_set},
+{"SVN::_Core::svn_patch_t_reverse_mergeinfo_get", _wrap_svn_patch_t_reverse_mergeinfo_get},
{"SVN::_Core::new_svn_patch_t", _wrap_new_svn_patch_t},
{"SVN::_Core::delete_svn_patch_t", _wrap_delete_svn_patch_t},
{"SVN::_Core::svn_diff_open_patch_file", _wrap_svn_diff_open_patch_file},
@@ -44808,6 +47348,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_error_createf", _wrap_svn_error_createf},
{"SVN::_Core::svn_error_wrap_apr", _wrap_svn_error_wrap_apr},
{"SVN::_Core::svn_error_quick_wrap", _wrap_svn_error_quick_wrap},
+{"SVN::_Core::svn_error_quick_wrapf", _wrap_svn_error_quick_wrapf},
{"SVN::_Core::svn_error_compose_create", _wrap_svn_error_compose_create},
{"SVN::_Core::svn_error_compose", _wrap_svn_error_compose},
{"SVN::_Core::svn_error_root_cause", _wrap_svn_error_root_cause},
@@ -44821,6 +47362,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Core::svn_error_purge_tracing", _wrap_svn_error_purge_tracing},
{"SVN::_Core::svn_error__malfunction", _wrap_svn_error__malfunction},
{"SVN::_Core::svn_error_set_malfunction_handler", _wrap_svn_error_set_malfunction_handler},
+{"SVN::_Core::svn_error_get_malfunction_handler", _wrap_svn_error_get_malfunction_handler},
{"SVN::_Core::svn_error_raise_on_malfunction", _wrap_svn_error_raise_on_malfunction},
{"SVN::_Core::svn_error_abort_on_malfunction", _wrap_svn_error_abort_on_malfunction},
{"SVN::_Core::svn_error_invoke_malfunction_handler", _wrap_svn_error_invoke_malfunction_handler},
@@ -44828,18 +47370,18 @@ static swig_command_info swig_commands[] = {
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -44849,17 +47391,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -44922,7 +47464,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -45121,2721 +47663,3004 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SWIG_SVN_INVALID_REVNUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(-1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SWIG_SVN_IGNORED_REVNUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(-1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CATEGORY_SIZE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(5000)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WARNING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_WARNING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_CONTAINING_POOL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_CONTAINING_POOL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_FILENAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_FILENAME)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_URL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_URL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_DATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_MIME_TYPE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_MIME_TYPE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_PROPERTY_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_PROPERTY_VALUE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_VERSION_FILE_FORMAT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_VERSION_FILE_FORMAT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_RELATIVE_PATH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_RELATIVE_PATH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_UUID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_UUID)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_CONFIG_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_CONFIG_VALUE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_SERVER_SPECIFICATION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_SERVER_SPECIFICATION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_CHECKSUM_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_CHECKSUM_KIND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_CHECKSUM_PARSE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_CHECKSUM_PARSE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_TOKEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_CHANGELIST_NAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_CHANGELIST_NAME)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_ATOMIC", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_ATOMIC)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_COMPRESSION_METHOD", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_COMPRESSION_METHOD)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_ATTRIB_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_ATTRIB_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_MISSING_ANCESTRY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_MISSING_ANCESTRY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_UNKNOWN_ENCODING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_UNKNOWN_ENCODING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_MALFORMED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_MALFORMED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_UNESCAPABLE_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_UNESCAPABLE_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_XML_UNEXPECTED_ELEMENT", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_XML_UNEXPECTED_ELEMENT)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_INCONSISTENT_EOL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_INCONSISTENT_EOL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_UNKNOWN_EOL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_UNKNOWN_EOL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_CORRUPT_EOL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_CORRUPT_EOL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_PIPE_FRAME_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_PIPE_FRAME_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_PIPE_READ_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_PIPE_READ_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_WRITE_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_WRITE_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_IO_PIPE_WRITE_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_IO_PIPE_WRITE_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_STREAM_UNEXPECTED_EOF", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_STREAM_UNEXPECTED_EOF)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_STREAM_MALFORMED_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_STREAM_MALFORMED_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_STREAM_UNRECOGNIZED_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_STREAM_UNRECOGNIZED_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_STREAM_SEEK_NOT_SUPPORTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_STREAM_SEEK_NOT_SUPPORTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_STREAM_NOT_SUPPORTED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_STREAM_NOT_SUPPORTED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_NODE_UNKNOWN_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_NODE_UNKNOWN_KIND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_NODE_UNEXPECTED_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_NODE_UNEXPECTED_KIND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_EXISTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_EXISTS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_MISSING_REVISION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_MISSING_REVISION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_MISSING_URL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_MISSING_URL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_ATTRIBUTE_INVALID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_ATTRIBUTE_INVALID)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ENTRY_FORBIDDEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ENTRY_FORBIDDEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_OBSTRUCTED_UPDATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_OBSTRUCTED_UPDATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_UNWIND_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_UNWIND_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_UNWIND_EMPTY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_UNWIND_EMPTY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_UNWIND_NOT_EMPTY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_UNWIND_NOT_EMPTY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_LOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_LOCK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_WORKING_COPY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_WORKING_COPY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_DIRECTORY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_DIRECTORY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_FILE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_BAD_ADM_LOG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_BAD_ADM_LOG)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_PATH_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_PATH_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_UP_TO_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_UP_TO_DATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_LEFT_LOCAL_MOD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_LEFT_LOCAL_MOD)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_SCHEDULE_CONFLICT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_SCHEDULE_CONFLICT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_PATH_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_PATH_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_FOUND_CONFLICT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_FOUND_CONFLICT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CORRUPT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CORRUPT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CORRUPT_TEXT_BASE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CORRUPT_TEXT_BASE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NODE_KIND_CHANGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NODE_KIND_CHANGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_OP_ON_CWD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_OP_ON_CWD)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_BAD_ADM_LOG_START", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_BAD_ADM_LOG_START)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_UNSUPPORTED_FORMAT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_UNSUPPORTED_FORMAT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_BAD_PATH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_BAD_PATH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_SCHEDULE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_SCHEDULE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_RELOCATION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_RELOCATION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_SWITCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_SWITCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_MISMATCHED_CHANGELIST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_MISMATCHED_CHANGELIST)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_COPYFROM_PATH_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_COPYFROM_PATH_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CHANGELIST_MOVE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CHANGELIST_MOVE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CANNOT_DELETE_FILE_EXTERNAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CANNOT_DELETE_FILE_EXTERNAL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CANNOT_MOVE_FILE_EXTERNAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CANNOT_MOVE_FILE_EXTERNAL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_DB_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_DB_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_MISSING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_MISSING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_NOT_SYMLINK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_NOT_SYMLINK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_PATH_UNEXPECTED_STATUS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_PATH_UNEXPECTED_STATUS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_UPGRADE_REQUIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_UPGRADE_REQUIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_CLEANUP_REQUIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_CLEANUP_REQUIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_INVALID_OPERATION_DEPTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_INVALID_OPERATION_DEPTH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_PATH_ACCESS_DENIED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_PATH_ACCESS_DENIED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_MIXED_REVISIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_MIXED_REVISIONS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_WC_DUPLICATE_EXTERNALS_TARGET", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_WC_DUPLICATE_EXTERNALS_TARGET)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_GENERAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_GENERAL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_CLEANUP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_CLEANUP)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_ALREADY_OPEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_ALREADY_OPEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_OPEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_OPEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_CORRUPT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_CORRUPT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_PATH_SYNTAX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_PATH_SYNTAX)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_REVISION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_REVISION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_TRANSACTION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_TRANSACTION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_ENTRY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_ENTRY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_REPRESENTATION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_REPRESENTATION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_STRING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_STRING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_COPY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_COPY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_TRANSACTION_NOT_MUTABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_TRANSACTION_NOT_MUTABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_ID_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_ID_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_ID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_ID)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_DIRECTORY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_DIRECTORY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_FILE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_MUTABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_MUTABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_ALREADY_EXISTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_ALREADY_EXISTS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_ROOT_DIR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_ROOT_DIR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_TXN_ROOT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_TXN_ROOT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NOT_REVISION_ROOT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NOT_REVISION_ROOT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_CONFLICT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_CONFLICT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_REP_CHANGED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_REP_CHANGED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_REP_NOT_MUTABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_REP_NOT_MUTABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_MALFORMED_SKEL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_MALFORMED_SKEL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_TXN_OUT_OF_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_TXN_OUT_OF_DATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_BERKELEY_DB", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_BERKELEY_DB)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_BERKELEY_DB_DEADLOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_BERKELEY_DB_DEADLOCK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_TRANSACTION_DEAD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_TRANSACTION_DEAD)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_TRANSACTION_NOT_DEAD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_TRANSACTION_NOT_DEAD)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_UNKNOWN_FS_TYPE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_UNKNOWN_FS_TYPE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_USER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_USER)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_PATH_ALREADY_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_PATH_ALREADY_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_PATH_NOT_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_PATH_NOT_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_BAD_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_BAD_LOCK_TOKEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_LOCK_TOKEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_LOCK_OWNER_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_LOCK_OWNER_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_LOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_LOCK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_LOCK_EXPIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_LOCK_EXPIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_OUT_OF_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_OUT_OF_DATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_UNSUPPORTED_FORMAT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_UNSUPPORTED_FORMAT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_REP_BEING_WRITTEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_REP_BEING_WRITTEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_TXN_NAME_TOO_LONG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_TXN_NAME_TOO_LONG)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_NODE_ORIGIN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_NODE_ORIGIN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_UNSUPPORTED_UPGRADE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_UNSUPPORTED_UPGRADE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_NO_SUCH_CHECKSUM_REP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_NO_SUCH_CHECKSUM_REP)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_PROP_BASEVALUE_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_PROP_BASEVALUE_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_MALFORMED_TXN_ID", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_MALFORMED_TXN_ID)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INDEX_CORRUPTION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INDEX_CORRUPTION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INDEX_REVISION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INDEX_REVISION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INDEX_OVERFLOW", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INDEX_OVERFLOW)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_CONTAINER_INDEX", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_CONTAINER_INDEX)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INDEX_INCONSISTENT", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INDEX_INCONSISTENT)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_LOCK_OPERATION_FAILED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_LOCK_OPERATION_FAILED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_UNSUPPORTED_TYPE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_UNSUPPORTED_TYPE)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_CONTAINER_SIZE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_CONTAINER_SIZE)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_MALFORMED_NODEREV_ID", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_MALFORMED_NODEREV_ID)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_FS_INVALID_GENERATION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_FS_INVALID_GENERATION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_HOOK_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_HOOK_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_BAD_ARGS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_BAD_ARGS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_NO_DATA_FOR_REPORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_NO_DATA_FOR_REPORT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_BAD_REVISION_REPORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_BAD_REVISION_REPORT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_UNSUPPORTED_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_UNSUPPORTED_VERSION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_DISABLED_FEATURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_DISABLED_FEATURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REPOS_UNSUPPORTED_UPGRADE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REPOS_UNSUPPORTED_UPGRADE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_ILLEGAL_URL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_ILLEGAL_URL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_NOT_AUTHORIZED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_NOT_AUTHORIZED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_UNKNOWN_AUTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_UNKNOWN_AUTH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_NOT_IMPLEMENTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_NOT_IMPLEMENTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_OUT_OF_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_OUT_OF_DATE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_NO_REPOS_UUID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_NO_REPOS_UUID)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_UNSUPPORTED_ABI_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_UNSUPPORTED_ABI_VERSION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_NOT_LOCKED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_NOT_LOCKED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_PARTIAL_REPLAY_NOT_SUPPORTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_UUID_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_UUID_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SESSION_URL_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SESSION_URL_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_CANNOT_CREATE_TUNNEL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_CANNOT_CREATE_TUNNEL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_CANNOT_CREATE_SESSION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_CANNOT_CREATE_SESSION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_SOCK_INIT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_SOCK_INIT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_CREATING_REQUEST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_CREATING_REQUEST)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_REQUEST_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_REQUEST_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_PROPS_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_PROPS_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_ALREADY_EXISTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_ALREADY_EXISTS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_INVALID_CONFIG_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_INVALID_CONFIG_VALUE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_PATH_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_PATH_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_PROPPATCH_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_PROPPATCH_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_MALFORMED_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_MALFORMED_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_RELOCATED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_RELOCATED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_CONN_TIMEOUT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_CONN_TIMEOUT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_FORBIDDEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_FORBIDDEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_PRECONDITION_FAILED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_PRECONDITION_FAILED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_INVALID_HEADER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_INVALID_HEADER)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_CORRUPT_WINDOW", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_CORRUPT_WINDOW)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_BACKWARD_VIEW", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_BACKWARD_VIEW)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_INVALID_OPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_INVALID_OPS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_UNEXPECTED_END", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_UNEXPECTED_END)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_APMOD_MISSING_PATH_TO_FS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_APMOD_MISSING_PATH_TO_FS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_APMOD_MALFORMED_URI", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_APMOD_MALFORMED_URI)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_APMOD_ACTIVITY_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_APMOD_ACTIVITY_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_APMOD_BAD_BASELINE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_APMOD_BAD_BASELINE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_APMOD_CONNECTION_ABORTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_APMOD_CONNECTION_ABORTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_VERSIONED_PATH_REQUIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_VERSIONED_PATH_REQUIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_RA_ACCESS_REQUIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_RA_ACCESS_REQUIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_BAD_REVISION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_BAD_REVISION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_DUPLICATE_COMMIT_URL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_DUPLICATE_COMMIT_URL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_IS_BINARY_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_IS_BINARY_FILE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_MODIFIED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_MODIFIED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_IS_DIRECTORY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_IS_DIRECTORY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_REVISION_RANGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_REVISION_RANGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_INVALID_RELOCATION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_INVALID_RELOCATION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_REVISION_AUTHOR_CONTAINS_NEWLINE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_REVISION_AUTHOR_CONTAINS_NEWLINE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_PROPERTY_NAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_PROPERTY_NAME)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_UNRELATED_RESOURCES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_UNRELATED_RESOURCES)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_MISSING_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_MISSING_LOCK_TOKEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_NO_VERSIONED_PARENT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_NO_VERSIONED_PARENT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_NOT_READY_TO_MERGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_NOT_READY_TO_MERGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_FILE_EXTERNAL_OVERWRITE_VERSIONED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_FILE_EXTERNAL_OVERWRITE_VERSIONED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_PATCH_BAD_STRIP_COUNT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_PATCH_BAD_STRIP_COUNT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_CYCLE_DETECTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_CYCLE_DETECTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_MERGE_UPDATE_REQUIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_MERGE_UPDATE_REQUIRED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_INVALID_MERGEINFO_NO_MERGETRACKING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_NO_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_NO_LOCK_TOKEN)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CLIENT_FORBIDDEN_BY_SERVER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CLIENT_FORBIDDEN_BY_SERVER)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BASE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BASE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_PLUGIN_LOAD_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_PLUGIN_LOAD_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_MALFORMED_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_MALFORMED_FILE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_INCOMPLETE_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_INCOMPLETE_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_INCORRECT_PARAMS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_INCORRECT_PARAMS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UNVERSIONED_RESOURCE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UNVERSIONED_RESOURCE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_TEST_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_TEST_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UNSUPPORTED_FEATURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UNSUPPORTED_FEATURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_BAD_PROP_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_BAD_PROP_KIND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ILLEGAL_TARGET", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ILLEGAL_TARGET)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_DELTA_MD5_CHECKSUM_ABSENT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_DELTA_MD5_CHECKSUM_ABSENT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_DIR_NOT_EMPTY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_DIR_NOT_EMPTY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_EXTERNAL_PROGRAM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_EXTERNAL_PROGRAM)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SWIG_PY_EXCEPTION_SET", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SWIG_PY_EXCEPTION_SET)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CHECKSUM_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CHECKSUM_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CANCELLED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CANCELLED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_INVALID_DIFF_OPTION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_INVALID_DIFF_OPTION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_PROPERTY_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_PROPERTY_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_NO_AUTH_FILE_PATH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_NO_AUTH_FILE_PATH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_VERSION_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_VERSION_MISMATCH)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_MERGEINFO_PARSE_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_MERGEINFO_PARSE_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CEASE_INVOCATION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CEASE_INVOCATION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_REVNUM_PARSE_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_REVNUM_PARSE_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ITER_BREAK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ITER_BREAK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UNKNOWN_CHANGELIST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UNKNOWN_CHANGELIST)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RESERVED_FILENAME_SPECIFIED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RESERVED_FILENAME_SPECIFIED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UNKNOWN_CAPABILITY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UNKNOWN_CAPABILITY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_TEST_SKIPPED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_TEST_SKIPPED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_NO_APR_MEMCACHE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_NO_APR_MEMCACHE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ATOMIC_INIT_FAILURE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ATOMIC_INIT_FAILURE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_READONLY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_READONLY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_UNSUPPORTED_SCHEMA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_UNSUPPORTED_SCHEMA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_BUSY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_BUSY)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_RESETTING_FOR_ROLLBACK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_RESETTING_FOR_ROLLBACK)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_SQLITE_CONSTRAINT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_SQLITE_CONSTRAINT)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_TOO_MANY_MEMCACHED_SERVERS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_TOO_MANY_MEMCACHED_SERVERS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_MALFORMED_VERSION_STRING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_MALFORMED_VERSION_STRING)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CORRUPTED_ATOMIC_STORAGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CORRUPTED_ATOMIC_STORAGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UTF8PROC_ERROR", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UTF8PROC_ERROR)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_UTF8_GLOB", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_UTF8_GLOB)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CORRUPT_PACKED_DATA", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CORRUPT_PACKED_DATA)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_COMPOSED_ERROR", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_COMPOSED_ERROR)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_INVALID_INPUT", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_INVALID_INPUT)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_ARG_PARSING_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_ARG_PARSING_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_INSUFFICIENT_ARGS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_INSUFFICIENT_ARGS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_ADM_DIR_RESERVED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_ADM_DIR_RESERVED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_LOG_MESSAGE_IS_VERSIONED_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_LOG_MESSAGE_IS_VERSIONED_FILE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_LOG_MESSAGE_IS_PATHNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_LOG_MESSAGE_IS_PATHNAME)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_COMMIT_IN_ADDED_DIR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_COMMIT_IN_ADDED_DIR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_NO_EXTERNAL_EDITOR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_NO_EXTERNAL_EDITOR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_BAD_LOG_MESSAGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_BAD_LOG_MESSAGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_CL_REPOS_VERIFY_FAILED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_CL_REPOS_VERIFY_FAILED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_CMD_ERR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_CMD_ERR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_UNKNOWN_CMD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_UNKNOWN_CMD)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_CONNECTION_CLOSED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_CONNECTION_CLOSED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_IO_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_IO_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_MALFORMED_DATA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_MALFORMED_DATA)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_REPOS_NOT_FOUND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_REPOS_NOT_FOUND)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_BAD_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_BAD_VERSION)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_NO_MECHANISMS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_NO_MECHANISMS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SVN_EDIT_ABORTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SVN_EDIT_ABORTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHN_CREDS_UNAVAILABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHN_CREDS_UNAVAILABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHN_NO_PROVIDER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHN_NO_PROVIDER)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHN_PROVIDERS_EXHAUSTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHN_PROVIDERS_EXHAUSTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHN_CREDS_NOT_SAVED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHN_CREDS_NOT_SAVED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHN_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHN_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHZ_ROOT_UNREADABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHZ_ROOT_UNREADABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHZ_UNREADABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHZ_UNREADABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHZ_PARTIALLY_READABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHZ_PARTIALLY_READABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHZ_INVALID_CONFIG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHZ_INVALID_CONFIG)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_AUTHZ_UNWRITABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_AUTHZ_UNWRITABLE)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_DIFF_DATASOURCE_MODIFIED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_DIFF_DATASOURCE_MODIFIED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SERF_SSPI_INITIALISATION_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SERF_SSPI_INITIALISATION_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SERF_GSSAPI_INITIALISATION_FAILED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SERF_GSSAPI_INITIALISATION_FAILED)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_RA_SERF_WRAPPED_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_RA_SERF_WRAPPED_ERROR)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASSERTION_FAIL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASSERTION_FAIL)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASSERTION_ONLY_TRACING_LINKS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASSERTION_ONLY_TRACING_LINKS)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASN1_OUT_OF_DATA", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASN1_OUT_OF_DATA)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASN1_UNEXPECTED_TAG", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASN1_UNEXPECTED_TAG)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASN1_INVALID_LENGTH", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASN1_INVALID_LENGTH)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASN1_LENGTH_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASN1_LENGTH_MISMATCH)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_ASN1_INVALID_DATA", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_ASN1_INVALID_DATA)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_FEATURE_UNAVAILABLE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_FEATURE_UNAVAILABLE)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_PEM", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_PEM)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_FORMAT", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_FORMAT)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_VERSION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_VERSION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_SERIAL", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_SERIAL)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_ALG", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_ALG)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_NAME", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_NAME)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_DATE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_DATE)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_PUBKEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_PUBKEY)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_SIGNATURE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_SIGNATURE)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_INVALID_EXTENSIONS", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_INVALID_EXTENSIONS)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_UNKNOWN_VERSION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_UNKNOWN_VERSION)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_UNKNOWN_PK_ALG", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_UNKNOWN_PK_ALG)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_SIG_MISMATCH", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_SIG_MISMATCH)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_X509_CERT_VERIFY_FAILED", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_X509_CERT_VERIFY_FAILED)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ERR_LAST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(SVN_ERR_LAST)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_UNALIGNED_ACCESS_IS_OK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "TRUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "FALSE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_file", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_file)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_dir", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_dir)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_unknown", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_unknown)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_symlink", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_symlink)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_tristate_false", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_tristate_false)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_tristate_true", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_tristate_true)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_tristate_unknown", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_tristate_unknown)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REVNUM_T_FMT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ld"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_nonrecursive", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_nonrecursive)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_recursive", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_recursive)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_unknown", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_unknown)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_exclude", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_exclude)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_empty", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_empty)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_files", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_files)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_immediates", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_immediates)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_depth_infinity", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_depth_infinity)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00001)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_SIZE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00002)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_HAS_PROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00004)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_CREATED_REV", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00008)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_TIME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00010)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DIRENT_LAST_AUTHOR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00020)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_MAX_LEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(255)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_REVISION_LONG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("LastChangedRevision"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_REVISION_SHORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Rev"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_REVISION_MEDIUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Revision"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_DATE_LONG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("LastChangedDate"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_DATE_SHORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Date"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_AUTHOR_LONG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("LastChangedBy"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_AUTHOR_SHORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Author"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_URL_LONG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("HeadURL"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_URL_SHORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("URL"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_ID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Id"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_KEYWORD_HEADER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Header"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_STREAM_CHUNK_SIZE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(102400)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN__STREAM_CHUNK_SIZE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(16384)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_ALLOCATOR_RECOMMENDED_MAX_FREE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)((4096*1024))));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_MAJOR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_MINOR", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(8)));
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(9)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_PATCH", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(13)));
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(7)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_MICRO", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(13)));
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(7)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_LIBRARY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_TAG", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr(" (r1667537)"));
+ sv_setsv(sv, SWIG_FromCharPtr(" (r1800392)"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_NUMTAG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr(""));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_REVISION", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1667537)));
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1800392)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_NUM", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("1.8.13"));
+ sv_setsv(sv, SWIG_FromCharPtr("1.9.7"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VER_NUMBER", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("1.8.13"));
+ sv_setsv(sv, SWIG_FromCharPtr("1.9.7"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_VERSION", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("1.8.13 (r1667537)"));
+ sv_setsv(sv, SWIG_FromCharPtr("1.9.7 (r1800392)"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_prop_entry_kind", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_prop_entry_kind)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_prop_wc_kind", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_prop_wc_kind)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_prop_regular_kind", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_prop_regular_kind)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_BOOLEAN_TRUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_MIME_TYPE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:mime-type"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_IGNORE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:ignore"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_EOL_STYLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:eol-style"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_KEYWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:keywords"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_EXECUTABLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:executable"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_EXECUTABLE_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_NEEDS_LOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:needs-lock"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_NEEDS_LOCK_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_SPECIAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:special"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_SPECIAL_VALUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_EXTERNALS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:externals"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_MERGEINFO", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:mergeinfo"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_INHERITABLE_AUTO_PROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auto-props"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_INHERITABLE_IGNORES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:global-ignores"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_TEXT_TIME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:text-time"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_OWNER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:owner"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_GROUP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:group"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_UNIX_MODE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:unix-mode"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_WC_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:wc:"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_COMMITTED_REV", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:committed-rev"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_COMMITTED_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:committed-date"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_LAST_AUTHOR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:last-author"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_UUID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:uuid"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_ENTRY_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:entry:lock-token"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_CUSTOM_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:custom:"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_AUTHOR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:author"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_LOG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:log"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:date"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_ORIG_DATE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:original-date"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_AUTOVERSIONED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:autoversioned"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_LOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-lock"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_FROM_URL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-from-url"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_FROM_UUID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-from-uuid"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_LAST_MERGED_REV", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-last-merged-rev"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVNSYNC_PROP_CURRENTLY_COPYING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:sync-currently-copying"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_TXN_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:txn-"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_TXN_CLIENT_COMPAT_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:txn-client-compat-version"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_TXN_USER_AGENT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:txn-user-agent"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_PROP_REVISION_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:revision-"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_OPT_MAX_ALIASES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(3)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_OPT_MAX_OPTIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(50)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_OPT_FIRST_LONGOPT_ID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(256)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_unspecified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_unspecified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_number", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_number)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_date", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_date)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_committed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_committed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_previous", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_previous)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_base", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_base)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_working", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_working)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_opt_revision_head", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_opt_revision_head)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_CRED_SIMPLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn.simple"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_CRED_USERNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn.username"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_CRED_SSL_CLIENT_CERT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn.ssl.client-cert"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_CRED_SSL_CLIENT_CERT_PW", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn.ssl.client-passphrase"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_CRED_SSL_SERVER_TRUST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn.ssl.server"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_SSL_NOTYETVALID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000001)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_SSL_EXPIRED", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000002)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_SSL_CNMISMATCH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000004)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_SSL_UNKNOWNCA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000008)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_SSL_OTHER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x40000000)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_PREFIX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_DEFAULT_USERNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:username"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_DEFAULT_PASSWORD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:password"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_NON_INTERACTIVE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:non-interactive"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_DONT_STORE_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:dont-store-passwords"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:store-plaintext-passwords"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:dont-store-ssl-client-cert-pp"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:store-ssl-client-cert-pp-plaintext"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_NO_AUTH_CACHE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:no-auth-cache"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_SSL_SERVER_FAILURES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:ssl:failures"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:ssl:cert-info"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:config-category-config"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:config-category-servers"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_CONFIG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:config-category-servers"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_SERVER_GROUP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:server-group"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_CONFIG_DIR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:auth:config-dir"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("gnome-keyring-unlock-prompt-func"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("gnome-keyring-unlock-prompt-baton"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_CATEGORY_SERVERS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("servers"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_GROUPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("groups"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_GLOBAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("global"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_PROXY_HOST", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-proxy-host"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_PROXY_PORT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-proxy-port"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_PROXY_USERNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-proxy-username"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_PROXY_PASSWORD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-proxy-password"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_PROXY_EXCEPTIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-proxy-exceptions"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_TIMEOUT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-timeout"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_COMPRESSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-compression"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_NEON_DEBUG_MASK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("neon-debug-mask"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_AUTH_TYPES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-auth-types"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_AUTHORITY_FILES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-authority-files"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_TRUST_DEFAULT_CA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-trust-default-ca"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-client-cert-file"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_CLIENT_CERT_PASSWORD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-client-cert-password"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_PKCS11_PROVIDER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-pkcs11-provider"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_LIBRARY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-library"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_STORE_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("store-passwords"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("store-plaintext-passwords"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_STORE_AUTH_CREDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("store-auth-creds"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("store-ssl-client-cert-pp"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("store-ssl-client-cert-pp-plaintext"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_USERNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("username"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_BULK_UPDATES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-bulk-updates"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("http-max-connections"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("http-chunked-requests"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("serf-log-components"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SERF_LOG_LEVEL", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("serf-log-level"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_CATEGORY_CONFIG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("config"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_AUTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("auth"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_PASSWORD_STORES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("password-stores"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_KWALLET_WALLET", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("kwallet-wallet"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_KWALLET_SVN_APPLICATION_NAME_WITH_PID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("kwallet-svn-application-name-with-pid"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE_PROMPT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ssl-client-cert-file-prompt"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_HELPERS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("helpers"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_EDITOR_CMD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("editor-cmd"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_DIFF_CMD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("diff-cmd"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_DIFF_EXTENSIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("diff-extensions"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_DIFF3_CMD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("diff3-cmd"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_DIFF3_HAS_PROGRAM_ARG", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("diff3-has-program-arg"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_MERGE_TOOL_CMD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("merge-tool-cmd"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_MISCELLANY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("miscellany"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_GLOBAL_IGNORES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("global-ignores"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_LOG_ENCODING", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("log-encoding"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_USE_COMMIT_TIMES", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("use-commit-times"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_TEMPLATE_ROOT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("template-root"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("enable-auto-props"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("enable-magic-file"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_NO_UNLOCK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("no-unlock"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_MIMETYPES_FILE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("mime-types-file"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_PRESERVED_CF_EXTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("preserved-conflict-file-exts"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("interactive-conflicts"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("memory-cache-size"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("diff-ignore-content-type"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_TUNNELS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("tunnels"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_AUTO_PROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("auto-props"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_WORKING_COPY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("working-copy"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("exclusive-locking"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("exclusive-locking-clients"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("busy-timeout"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_GENERAL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("general"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_ANON_ACCESS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("anon-access"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_AUTH_ACCESS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("auth-access"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_PASSWORD_DB", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("password-db"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_REALM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("realm"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_AUTHZ_DB", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("authz-db"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_GROUPS_DB", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("groups-db"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_FORCE_USERNAME_CASE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("force-username-case"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_HOOKS_ENV", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("hooks-env"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_SASL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("sasl"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_USE_SASL", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("use-sasl"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_MIN_SSF", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("min-encryption"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_OPTION_MAX_SSF", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("max-encryption"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_SECTION_USERS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("users"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store"));
+ sv_setsv(sv, SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_GLOBAL_IGNORES", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store"));
+ sv_setsv(sv, SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_TRUE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("TRUE"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_FALSE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("FALSE"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_ASK", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ASK"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ASK"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ASK"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_DEFAULT_OPTION_HTTP_MAX_CONNECTIONS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(4)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_REALMSTRING_KEY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("svn:realmstring"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_USERNAME_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("username"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_PASSWORD_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("password"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_PASSPHRASE_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("passphrase"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_PASSTYPE_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("passtype"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_ASCII_CERT_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("ascii_cert"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_CONFIG_AUTHN_FAILURES_KEY", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("failures"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_MERGEINFO_NONINHERITABLE_STR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("*"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_mergeinfo_explicit", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_mergeinfo_explicit)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_mergeinfo_inherited", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_mergeinfo_inherited)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_mergeinfo_nearest_ancestor", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_mergeinfo_nearest_ancestor)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_io_file_del_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_io_file_del_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_io_file_del_on_close", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_io_file_del_on_close)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_io_file_del_on_pool_cleanup", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_io_file_del_on_pool_cleanup)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_checksum_md5", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_checksum_md5)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_checksum_sha1", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_checksum_sha1)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_checksum_fnv1a_32", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_checksum_fnv1a_32)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_checksum_fnv1a_32x4", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_checksum_fnv1a_32x4)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_datasource_original", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_datasource_original)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_datasource_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_datasource_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_datasource_latest", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_datasource_latest)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_datasource_ancestor", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_datasource_ancestor)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_modified_latest", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_modified_latest)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_resolved_modified_latest", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_resolved_modified_latest)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_modified_original_latest", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_modified_original_latest)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_latest", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_latest)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_conflict_display_only_conflicts", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_conflict_display_only_conflicts)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_file_ignore_space_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_file_ignore_space_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_file_ignore_space_change", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_file_ignore_space_change)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_file_ignore_space_all", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_file_ignore_space_all)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_unchanged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_unchanged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_copied", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_copied)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_moved", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_moved)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_diff_op_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_diff_op_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_NO_ERROR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
-#if defined(SVN_AVOID_CIRCULAR_LINKAGE_AT_ALL_COSTS_HACK)
- svn_swig_pl_bind_current_pool_fns (&svn_swig_pl_get_current_pool,
- &svn_swig_pl_set_current_pool);
-#endif
+ svn_swig_pl__bind_current_pool_fns(&core_get_current_pool,
+ &core_set_current_pool);
ST(0) = &PL_sv_yes;
XSRETURN(1);
diff --git a/subversion/bindings/swig/perl/native/svn_client.c b/subversion/bindings/swig/perl/native/svn_client.c
index 69d3b7a..4e4dbd0 100644
--- a/subversion/bindings/swig/perl/native/svn_client.c
+++ b/subversion/bindings/swig/perl/native/svn_client.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1510,136 +1499,136 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[14]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[15]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_int swig_types[42]
-#define SWIGTYPE_p_long swig_types[43]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[44]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[45]
-#define SWIGTYPE_p_p_char swig_types[46]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[47]
-#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[48]
-#define SWIGTYPE_p_p_svn_client_commit_item3_t swig_types[49]
-#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[50]
-#define SWIGTYPE_p_p_svn_commit_info_t swig_types[51]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[52]
-#define SWIGTYPE_p_p_svn_string_t swig_types[53]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[54]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[55]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[56]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[57]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[58]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[59]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[60]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[61]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[62]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[63]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[64]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[65]
-#define SWIGTYPE_p_svn_checksum_t swig_types[66]
-#define SWIGTYPE_p_svn_client_commit_info_t swig_types[67]
-#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[68]
-#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[69]
-#define SWIGTYPE_p_svn_client_commit_item_t swig_types[70]
-#define SWIGTYPE_p_svn_client_copy_source_t swig_types[71]
-#define SWIGTYPE_p_svn_client_ctx_t swig_types[72]
-#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[73]
-#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[74]
-#define SWIGTYPE_p_svn_client_info2_t swig_types[75]
-#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[76]
-#define SWIGTYPE_p_svn_client_status_t swig_types[77]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[78]
-#define SWIGTYPE_p_svn_config_t swig_types[79]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[80]
-#define SWIGTYPE_p_svn_depth_t swig_types[81]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[82]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[83]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[84]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[85]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[86]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[87]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[88]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[89]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[90]
-#define SWIGTYPE_p_svn_diff_t swig_types[91]
-#define SWIGTYPE_p_svn_dirent_t swig_types[92]
-#define SWIGTYPE_p_svn_errno_t swig_types[93]
-#define SWIGTYPE_p_svn_error_t swig_types[94]
-#define SWIGTYPE_p_svn_info_t swig_types[95]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[96]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[97]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[98]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[99]
-#define SWIGTYPE_p_svn_lock_t swig_types[100]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[101]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[102]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[103]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[104]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[105]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[106]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[107]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[108]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[109]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[110]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[111]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[112]
-#define SWIGTYPE_p_svn_patch_t swig_types[113]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[114]
-#define SWIGTYPE_p_svn_prop_kind swig_types[115]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[116]
-#define SWIGTYPE_p_svn_prop_t swig_types[117]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[118]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[119]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[120]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[121]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[122]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[123]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[124]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[125]
-#define SWIGTYPE_p_svn_stream_t swig_types[126]
-#define SWIGTYPE_p_svn_string_t swig_types[127]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[128]
-#define SWIGTYPE_p_svn_tristate_t swig_types[129]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[130]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[131]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[132]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[133]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[134]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[135]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[136]
-#define SWIGTYPE_p_svn_version_t swig_types[137]
-#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[138]
-#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[139]
-#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[140]
-#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[141]
-#define SWIGTYPE_p_svn_wc_conflict_description2_t swig_types[142]
-#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[143]
-#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[144]
-#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[145]
-#define SWIGTYPE_p_svn_wc_conflict_result_t swig_types[146]
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_int swig_types[44]
+#define SWIGTYPE_p_long swig_types[45]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[46]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[47]
+#define SWIGTYPE_p_p_char swig_types[48]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[49]
+#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[50]
+#define SWIGTYPE_p_p_svn_client_commit_item3_t swig_types[51]
+#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[52]
+#define SWIGTYPE_p_p_svn_commit_info_t swig_types[53]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[54]
+#define SWIGTYPE_p_p_svn_string_t swig_types[55]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[56]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[57]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[58]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[59]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[60]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[61]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[62]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[63]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[64]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[65]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[66]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[67]
+#define SWIGTYPE_p_svn_checksum_t swig_types[68]
+#define SWIGTYPE_p_svn_client_commit_info_t swig_types[69]
+#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[70]
+#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[71]
+#define SWIGTYPE_p_svn_client_commit_item_t swig_types[72]
+#define SWIGTYPE_p_svn_client_copy_source_t swig_types[73]
+#define SWIGTYPE_p_svn_client_ctx_t swig_types[74]
+#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[75]
+#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[76]
+#define SWIGTYPE_p_svn_client_info2_t swig_types[77]
+#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[78]
+#define SWIGTYPE_p_svn_client_status_t swig_types[79]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[80]
+#define SWIGTYPE_p_svn_config_t swig_types[81]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[82]
+#define SWIGTYPE_p_svn_depth_t swig_types[83]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[84]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[85]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[86]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[87]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[88]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[89]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[90]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[91]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[92]
+#define SWIGTYPE_p_svn_diff_t swig_types[93]
+#define SWIGTYPE_p_svn_dirent_t swig_types[94]
+#define SWIGTYPE_p_svn_errno_t swig_types[95]
+#define SWIGTYPE_p_svn_error_t swig_types[96]
+#define SWIGTYPE_p_svn_info_t swig_types[97]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[98]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[99]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[100]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[101]
+#define SWIGTYPE_p_svn_lock_t swig_types[102]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[103]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[104]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[105]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[106]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[107]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[108]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[109]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[110]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[111]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[112]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[113]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[114]
+#define SWIGTYPE_p_svn_patch_t swig_types[115]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[116]
+#define SWIGTYPE_p_svn_prop_kind swig_types[117]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[118]
+#define SWIGTYPE_p_svn_prop_t swig_types[119]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[120]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[121]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[122]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[123]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[124]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[125]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[126]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[127]
+#define SWIGTYPE_p_svn_stream_t swig_types[128]
+#define SWIGTYPE_p_svn_string_t swig_types[129]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[130]
+#define SWIGTYPE_p_svn_tristate_t swig_types[131]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[132]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[133]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[134]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[135]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[136]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[137]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[138]
+#define SWIGTYPE_p_svn_version_t swig_types[139]
+#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[140]
+#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[141]
+#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[142]
+#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[143]
+#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[144]
+#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[145]
+#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[146]
#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[147]
#define SWIGTYPE_p_svn_wc_context_t swig_types[148]
#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[149]
@@ -1678,7 +1667,7 @@ static swig_module_info swig_module = {swig_types, 173, 0, 0, 0, 0};
#define SWIG_name "SVN::_Client::boot_SVN___Client"
#define SWIG_prefix "SVN::_Client::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2218,6 +2207,7 @@ XS(_wrap_svn_client_get_simple_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2280,6 +2270,7 @@ XS(_wrap_svn_client_get_username_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2336,6 +2327,7 @@ XS(_wrap_svn_client_get_simple_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2376,6 +2368,7 @@ XS(_wrap_svn_client_get_username_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2416,6 +2409,7 @@ XS(_wrap_svn_client_get_ssl_server_trust_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2456,6 +2450,7 @@ XS(_wrap_svn_client_get_ssl_client_cert_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2496,6 +2491,7 @@ XS(_wrap_svn_client_get_ssl_client_cert_pw_file_provider) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -2539,6 +2535,7 @@ XS(_wrap_svn_client_get_ssl_server_trust_prompt_provider) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -2594,6 +2591,7 @@ XS(_wrap_svn_client_get_ssl_client_cert_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2656,6 +2654,7 @@ XS(_wrap_svn_client_get_ssl_client_cert_pw_prompt_provider) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2721,6 +2720,7 @@ XS(_wrap_svn_client_proplist_item_t_node_name_set) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(1))) {
arg2 = NULL;
@@ -2728,8 +2728,9 @@ XS(_wrap_svn_client_proplist_item_t_node_name_set) {
buf = SvPV(ST(1), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg2 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg2 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -2916,6 +2917,7 @@ XS(_wrap_svn_client_proplist_item_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_proplist_item_dup(item,pool);");
@@ -5169,6 +5171,7 @@ XS(_wrap_svn_client_commit_item3_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_client_commit_item3_create(pool);");
@@ -5204,6 +5207,7 @@ XS(_wrap_svn_client_commit_item_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -5261,6 +5265,7 @@ XS(_wrap_svn_client_commit_item3_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_commit_item3_dup(item,pool);");
@@ -5304,6 +5309,7 @@ XS(_wrap_svn_client_commit_item2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_commit_item2_dup(item,pool);");
@@ -5670,6 +5676,7 @@ XS(_wrap_svn_client_diff_summarize_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_diff_summarize_dup(diff,pool);");
@@ -6043,8 +6050,9 @@ XS(_wrap_svn_client_ctx_t_config_set) {
}
arg1 = (struct svn_client_ctx_t *)(argp1);
{
- arg2 = svn_swig_pl_objs_to_hash_by_name (ST(1), "svn_config_t *",
- svn_swig_pl_make_pool ((SV *)NULL));
+ apr_pool_t *pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg2 = svn_swig_pl_objs_to_hash_by_name (ST(1), "svn_config_t *", pool);
}
if (arg1) (arg1)->config = arg2;
ST(argvi) = sv_newmortal();
@@ -7195,6 +7203,197 @@ XS(_wrap_svn_client_ctx_t_wc_ctx_get) {
}
+XS(_wrap_svn_client_ctx_t_check_tunnel_func_set) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_client_ctx_t_check_tunnel_func_set(self,check_tunnel_func);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_check_tunnel_func_set" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_client_ctx_t_check_tunnel_func_set" "', argument " "2"" of type '" "svn_ra_check_tunnel_func_t""'");
+ }
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_ctx_t_check_tunnel_func_get) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_ra_check_tunnel_func_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_client_ctx_t_check_tunnel_func_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_check_tunnel_func_get" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ ST(argvi) = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_void_p_q_const__char__int); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_ctx_t_open_tunnel_func_set) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_client_ctx_t_open_tunnel_func_set(self,open_tunnel_func);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_open_tunnel_func_set" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_client_ctx_t_open_tunnel_func_set" "', argument " "2"" of type '" "svn_ra_open_tunnel_func_t""'");
+ }
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_ctx_t_open_tunnel_func_get) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_ra_open_tunnel_func_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_client_ctx_t_open_tunnel_func_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_open_tunnel_func_get" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ ST(argvi) = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_ctx_t_tunnel_baton_set) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_client_ctx_t_tunnel_baton_set(self,tunnel_baton);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_tunnel_baton_set" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_client_ctx_t_tunnel_baton_set" "', argument " "2"" of type '" "void *""'");
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_ctx_t_tunnel_baton_get) {
+ {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ void *result = 0 ;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_client_ctx_t_tunnel_baton_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_ctx_t_tunnel_baton_get" "', argument " "1"" of type '" "struct svn_client_ctx_t *""'");
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (void *) ((arg1)->tunnel_baton);
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_new_svn_client_ctx_t) {
{
int argvi = 0;
@@ -7265,6 +7464,7 @@ XS(_wrap_svn_client_create_context2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -7334,6 +7534,7 @@ XS(_wrap_svn_client_create_context) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -7408,6 +7609,7 @@ XS(_wrap_svn_client_args_to_target_array2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -7501,6 +7703,7 @@ XS(_wrap_svn_client_args_to_target_array) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -7603,6 +7806,7 @@ XS(_wrap_svn_client_checkout3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 8) || (items > 9)) {
@@ -7619,10 +7823,18 @@ XS(_wrap_svn_client_checkout3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -7746,6 +7958,7 @@ XS(_wrap_svn_client_checkout2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
@@ -7762,10 +7975,18 @@ XS(_wrap_svn_client_checkout2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -7877,6 +8098,7 @@ XS(_wrap_svn_client_checkout) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -7893,7 +8115,11 @@ XS(_wrap_svn_client_checkout) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -7998,17 +8224,22 @@ XS(_wrap_svn_client_update4) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_update4(paths,revision,depth,depth_is_sticky,ignore_externals,allow_unver_obstructions,adds_as_modification,make_parents,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -8137,17 +8368,22 @@ XS(_wrap_svn_client_update3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_update3(paths,revision,depth,depth_is_sticky,ignore_externals,allow_unver_obstructions,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -8256,17 +8492,22 @@ XS(_wrap_svn_client_update2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_update2(paths,revision,recurse,ignore_externals,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -8362,6 +8603,7 @@ XS(_wrap_svn_client_update) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -8373,7 +8615,11 @@ XS(_wrap_svn_client_update) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -8483,6 +8729,7 @@ XS(_wrap_svn_client_switch3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -8499,10 +8746,18 @@ XS(_wrap_svn_client_switch3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -8646,6 +8901,7 @@ XS(_wrap_svn_client_switch2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
@@ -8662,10 +8918,18 @@ XS(_wrap_svn_client_switch2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -8791,6 +9055,7 @@ XS(_wrap_svn_client_switch) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -8807,7 +9072,11 @@ XS(_wrap_svn_client_switch) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -8908,6 +9177,7 @@ XS(_wrap_svn_client_add5) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_add5(path,depth,force,no_ignore,no_autoprops,add_parents,ctx,scratch_pool);");
@@ -9024,6 +9294,7 @@ XS(_wrap_svn_client_add4) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_add4(path,depth,force,no_ignore,add_parents,ctx,pool);");
@@ -9130,6 +9401,7 @@ XS(_wrap_svn_client_add3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_add3(path,recursive,force,no_ignore,ctx,pool);");
@@ -9226,6 +9498,7 @@ XS(_wrap_svn_client_add2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_add2(path,recursive,force,ctx,pool);");
@@ -9312,6 +9585,7 @@ XS(_wrap_svn_client_add) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_add(path,recursive,ctx,pool);");
@@ -9391,12 +9665,13 @@ XS(_wrap_svn_client_mkdir4) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_mkdir4(paths,make_parents,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -9405,8 +9680,10 @@ XS(_wrap_svn_client_mkdir4) {
}
arg2 = (svn_boolean_t)(val2);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg3 = svn_swig_pl_hash_to_prophash(ST(2), _global_pool);
}
{
@@ -9481,13 +9758,14 @@ XS(_wrap_svn_client_mkdir3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_mkdir3(paths,make_parents,revprop_table,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -9496,8 +9774,10 @@ XS(_wrap_svn_client_mkdir3) {
}
arg3 = (svn_boolean_t)(val3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(2), _global_pool);
}
res5 = SWIG_ConvertPtr(ST(3), &argp5,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -9568,13 +9848,14 @@ XS(_wrap_svn_client_mkdir2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_client_mkdir2(paths,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res3 = SWIG_ConvertPtr(ST(1), &argp3,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -9641,13 +9922,14 @@ XS(_wrap_svn_client_mkdir) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_client_mkdir(paths,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res3 = SWIG_ConvertPtr(ST(1), &argp3,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -9725,12 +10007,13 @@ XS(_wrap_svn_client_delete4) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_delete4(paths,force,keep_local,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -9744,8 +10027,10 @@ XS(_wrap_svn_client_delete4) {
}
arg3 = (svn_boolean_t)(val3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
{
@@ -9825,13 +10110,14 @@ XS(_wrap_svn_client_delete3) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_delete3(paths,force,keep_local,revprop_table,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -9845,8 +10131,10 @@ XS(_wrap_svn_client_delete3) {
}
arg4 = (svn_boolean_t)(val4);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg5 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
res6 = SWIG_ConvertPtr(ST(4), &argp6,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -9922,13 +10210,14 @@ XS(_wrap_svn_client_delete2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_delete2(paths,force,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -10005,13 +10294,14 @@ XS(_wrap_svn_client_delete) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_delete(paths,force,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -10112,6 +10402,7 @@ XS(_wrap_svn_client_import5) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_import5(path,url,depth,no_ignore,no_autoprops,ignore_unknown_node_types,revprop_table,filter_callback,filter_baton,commit_callback,commit_baton,ctx,scratch_pool);");
@@ -10147,8 +10438,10 @@ XS(_wrap_svn_client_import5) {
}
arg6 = (svn_boolean_t)(val6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(6), _global_pool);
}
{
@@ -10258,6 +10551,7 @@ XS(_wrap_svn_client_import4) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_import4(path,url,depth,no_ignore,ignore_unknown_node_types,revprop_table,commit_callback,commit_baton,ctx,pool);");
@@ -10288,8 +10582,10 @@ XS(_wrap_svn_client_import4) {
}
arg5 = (svn_boolean_t)(val5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
{
@@ -10383,6 +10679,7 @@ XS(_wrap_svn_client_import3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
@@ -10414,8 +10711,10 @@ XS(_wrap_svn_client_import3) {
}
arg6 = (svn_boolean_t)(val6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -10505,6 +10804,7 @@ XS(_wrap_svn_client_import2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -10610,6 +10910,7 @@ XS(_wrap_svn_client_import) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -10722,12 +11023,13 @@ XS(_wrap_svn_client_commit6) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_commit6(targets,depth,keep_locks,keep_changelists,commit_as_operations,include_file_externals,include_dir_externals,changelists,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -10761,12 +11063,14 @@ XS(_wrap_svn_client_commit6) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = SvOK(ST(7)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(7)) ? svn_swig_pl_strings_to_array(
ST(7), _global_pool) : NULL;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg9 = svn_swig_pl_hash_to_prophash(ST(8), _global_pool);
}
{
@@ -10863,12 +11167,13 @@ XS(_wrap_svn_client_commit5) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_commit5(targets,depth,keep_locks,keep_changelists,commit_as_operations,changelists,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -10892,12 +11197,14 @@ XS(_wrap_svn_client_commit5) {
}
arg5 = (svn_boolean_t)(val5);
{
- arg6 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg6 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(6), _global_pool);
}
{
@@ -10987,13 +11294,14 @@ XS(_wrap_svn_client_commit4) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_commit4(targets,depth,keep_locks,keep_changelists,changelists,revprop_table,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -11012,12 +11320,14 @@ XS(_wrap_svn_client_commit4) {
}
arg5 = (svn_boolean_t)(val5);
{
- arg6 = SvOK(ST(4)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg6 = SvOK(ST(4)) ? svn_swig_pl_strings_to_array(
ST(4), _global_pool) : NULL;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -11100,13 +11410,14 @@ XS(_wrap_svn_client_commit3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_commit3(targets,recurse,keep_locks,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -11193,13 +11504,14 @@ XS(_wrap_svn_client_commit2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_commit2(targets,recurse,keep_locks,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -11287,13 +11599,14 @@ XS(_wrap_svn_client_commit) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_commit(targets,nonrecursive,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
@@ -11549,10 +11862,9 @@ XS(_wrap_svn_client_status_t_filesize_get) {
arg1 = (struct svn_client_status_t *)(argp1);
result = ((arg1)->filesize);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -12423,10 +12735,9 @@ XS(_wrap_svn_client_status_t_changed_date_get) {
arg1 = (struct svn_client_status_t *)(argp1);
result = ((arg1)->changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -13289,10 +13600,9 @@ XS(_wrap_svn_client_status_t_ood_changed_date_get) {
arg1 = (struct svn_client_status_t *)(argp1);
result = ((arg1)->ood_changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -13653,6 +13963,7 @@ XS(_wrap_svn_client_status_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_status_dup(status,result_pool);");
@@ -13683,6 +13994,198 @@ XS(_wrap_svn_client_status_dup) {
}
+XS(_wrap_svn_client_status6) {
+ {
+ svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
+ svn_client_ctx_t *arg2 = (svn_client_ctx_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ apr_array_header_t *arg12 = (apr_array_header_t *) 0 ;
+ svn_client_status_func_t arg13 = (svn_client_status_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_revnum_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_opt_revision_t rev4 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ int val9 ;
+ int ecode9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int val11 ;
+ int ecode11 = 0 ;
+ int res14 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 13) || (items > 14)) {
+ SWIG_croak("Usage: svn_client_status6(ctx,path,revision,depth,get_all,check_out_of_date,check_working_copy,no_ignore,ignore_externals,depth_as_sticky,changelists,status_func,status_baton,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_client_status6" "', argument " "2"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg2 = (svn_client_ctx_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_client_status6" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
+ }
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_status6" "', argument " "5"" of type '" "svn_depth_t""'");
+ }
+ arg5 = (svn_depth_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_status6" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_client_status6" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "svn_client_status6" "', argument " "8"" of type '" "svn_boolean_t""'");
+ }
+ arg8 = (svn_boolean_t)(val8);
+ ecode9 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(7), &val9);
+ if (!SWIG_IsOK(ecode9)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "svn_client_status6" "', argument " "9"" of type '" "svn_boolean_t""'");
+ }
+ arg9 = (svn_boolean_t)(val9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_client_status6" "', argument " "10"" of type '" "svn_boolean_t""'");
+ }
+ arg10 = (svn_boolean_t)(val10);
+ ecode11 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val11);
+ if (!SWIG_IsOK(ecode11)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "svn_client_status6" "', argument " "11"" of type '" "svn_boolean_t""'");
+ }
+ arg11 = (svn_boolean_t)(val11);
+ {
+ arg12 = SvOK(ST(10)) ? svn_swig_pl_strings_to_array(
+ ST(10), _global_pool) : NULL;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg13), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_client_status6" "', argument " "13"" of type '" "svn_client_status_func_t""'");
+ }
+ }
+ res14 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg14), 0, 0);
+ if (!SWIG_IsOK(res14)) {
+ SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_client_status6" "', argument " "14"" of type '" "void *""'");
+ }
+ if (items > 13) {
+
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_status6(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,(apr_array_header_t const *)arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_status5) {
{
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
@@ -13727,6 +14230,7 @@ XS(_wrap_svn_client_status5) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 12) || (items > 13)) {
@@ -13743,7 +14247,11 @@ XS(_wrap_svn_client_status5) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -13776,7 +14284,7 @@ XS(_wrap_svn_client_status5) {
}
arg10 = (svn_boolean_t)(val10);
{
- arg11 = SvOK(ST(9)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg11 = SvOK(ST(9)) ? svn_swig_pl_strings_to_array(
ST(9), _global_pool) : NULL;
}
{
@@ -13900,6 +14408,7 @@ XS(_wrap_svn_client_status4) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -13911,10 +14420,14 @@ XS(_wrap_svn_client_status4) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_status_func3;
+ arg4 = (svn_wc_status_func3_t) svn_swig_pl_status_func3;
arg5 = ST(2);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
@@ -13943,7 +14456,7 @@ XS(_wrap_svn_client_status4) {
}
arg10 = (svn_boolean_t)(val10);
{
- arg11 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg11 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
res12 = SWIG_ConvertPtr(ST(9), &argp12,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -14056,6 +14569,7 @@ XS(_wrap_svn_client_status3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -14067,10 +14581,14 @@ XS(_wrap_svn_client_status3) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_status_func2;
+ arg4 = (svn_wc_status_func2_t) svn_swig_pl_status_func2;
arg5 = ST(2);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
@@ -14099,7 +14617,7 @@ XS(_wrap_svn_client_status3) {
}
arg10 = (svn_boolean_t)(val10);
{
- arg11 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg11 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
res12 = SWIG_ConvertPtr(ST(9), &argp12,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -14211,6 +14729,7 @@ XS(_wrap_svn_client_status2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
@@ -14222,10 +14741,14 @@ XS(_wrap_svn_client_status2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_status_func2;
+ arg4 = (svn_wc_status_func2_t) svn_swig_pl_status_func2;
arg5 = ST(2);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
@@ -14357,6 +14880,7 @@ XS(_wrap_svn_client_status) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 8) || (items > 9)) {
@@ -14368,10 +14892,14 @@ XS(_wrap_svn_client_status) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_status_func;
+ arg4 = (svn_wc_status_func_t) svn_swig_pl_status_func;
arg5 = ST(2);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
@@ -14487,16 +15015,21 @@ XS(_wrap_svn_client_log5) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_log5(targets,peg_revision,revision_ranges,limit,discover_changed_paths,strict_node_history,include_merged_revisions,revprops,receiver,receiver_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
arg3 = svn_swig_pl_array_to_apr_array_revision_range(ST(2), _global_pool);
@@ -14522,11 +15055,11 @@ XS(_wrap_svn_client_log5) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = SvOK(ST(7)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(7)) ? svn_swig_pl_strings_to_array(
ST(7), _global_pool) : NULL;
}
{
- arg9 = svn_swig_pl_thunk_log_entry_receiver;
+ arg9 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg10 = ST(8);
}
res11 = SWIG_ConvertPtr(ST(9), &argp11,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -14626,22 +15159,35 @@ XS(_wrap_svn_client_log4) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_log4(targets,peg_revision,start,end,limit,discover_changed_paths,strict_node_history,include_merged_revisions,revprops,receiver,receiver_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -14664,11 +15210,11 @@ XS(_wrap_svn_client_log4) {
}
arg8 = (svn_boolean_t)(val8);
{
- arg9 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg9 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
{
- arg10 = svn_swig_pl_thunk_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg11 = ST(9);
}
res12 = SWIG_ConvertPtr(ST(10), &argp12,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -14766,22 +15312,35 @@ XS(_wrap_svn_client_log3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_log3(targets,peg_revision,start,end,limit,discover_changed_paths,strict_node_history,receiver,receiver_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -14799,7 +15358,7 @@ XS(_wrap_svn_client_log3) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = svn_swig_pl_thunk_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg9 = ST(7);
}
res10 = SWIG_ConvertPtr(ST(8), &argp10,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -14891,19 +15450,28 @@ XS(_wrap_svn_client_log2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_log2(targets,start,end,limit,discover_changed_paths,strict_node_history,receiver,receiver_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -14921,7 +15489,7 @@ XS(_wrap_svn_client_log2) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = svn_swig_pl_thunk_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg8 = ST(6);
}
res9 = SWIG_ConvertPtr(ST(7), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15003,19 +15571,28 @@ XS(_wrap_svn_client_log) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_log(targets,start,end,discover_changed_paths,strict_node_history,receiver,receiver_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -15028,7 +15605,7 @@ XS(_wrap_svn_client_log) {
}
arg5 = (svn_boolean_t)(val5);
{
- arg6 = svn_swig_pl_thunk_log_receiver;
+ arg6 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg7 = ST(5);
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15117,6 +15694,7 @@ XS(_wrap_svn_client_blame5) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_blame5(path_or_url,peg_revision,start,end,diff_options,ignore_mime_type,include_merged_revisions,receiver,receiver_baton,ctx,pool);");
@@ -15127,13 +15705,25 @@ XS(_wrap_svn_client_blame5) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
if (!SWIG_IsOK(res5)) {
@@ -15259,6 +15849,7 @@ XS(_wrap_svn_client_blame4) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_blame4(path_or_url,peg_revision,start,end,diff_options,ignore_mime_type,include_merged_revisions,receiver,receiver_baton,ctx,pool);");
@@ -15269,13 +15860,25 @@ XS(_wrap_svn_client_blame4) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
if (!SWIG_IsOK(res5)) {
@@ -15397,6 +16000,7 @@ XS(_wrap_svn_client_blame3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_blame3(path_or_url,peg_revision,start,end,diff_options,ignore_mime_type,receiver,receiver_baton,ctx,pool);");
@@ -15407,13 +16011,25 @@ XS(_wrap_svn_client_blame3) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
if (!SWIG_IsOK(res5)) {
@@ -15426,7 +16042,7 @@ XS(_wrap_svn_client_blame3) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = svn_swig_pl_blame_func;
+ arg7 = (svn_client_blame_receiver_t) svn_swig_pl_blame_func;
arg8 = ST(6);
}
res9 = SWIG_ConvertPtr(ST(7), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15512,6 +16128,7 @@ XS(_wrap_svn_client_blame2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_blame2(path_or_url,peg_revision,start,end,receiver,receiver_baton,ctx,pool);");
@@ -15522,16 +16139,28 @@ XS(_wrap_svn_client_blame2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_blame_func;
+ arg5 = (svn_client_blame_receiver_t) svn_swig_pl_blame_func;
arg6 = ST(4);
}
res7 = SWIG_ConvertPtr(ST(5), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15611,6 +16240,7 @@ XS(_wrap_svn_client_blame) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_blame(path_or_url,start,end,receiver,receiver_baton,ctx,pool);");
@@ -15621,13 +16251,21 @@ XS(_wrap_svn_client_blame) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_blame_func;
+ arg4 = (svn_client_blame_receiver_t) svn_swig_pl_blame_func;
arg5 = ST(3);
}
res6 = SWIG_ConvertPtr(ST(4), &argp6,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15741,12 +16379,13 @@ XS(_wrap_svn_client_diff6) {
{
_global_pool = arg21 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 20) || (items > 21)) {
SWIG_croak("Usage: svn_client_diff6(diff_options,path_or_url1,revision1,path_or_url2,revision2,relative_to_dir,depth,ignore_ancestry,no_diff_added,no_diff_deleted,show_copies_as_adds,ignore_content_type,ignore_properties,properties_only,use_git_diff_format,header_encoding,outstream,errstream,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -15755,7 +16394,11 @@ XS(_wrap_svn_client_diff6) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -15763,7 +16406,11 @@ XS(_wrap_svn_client_diff6) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -15822,12 +16469,14 @@ XS(_wrap_svn_client_diff6) {
arg16 = (char *)(buf16);
{
svn_swig_pl_make_stream (&arg17, ST(16));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg18, ST(17));
+ SPAGAIN;
}
{
- arg19 = SvOK(ST(18)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg19 = SvOK(ST(18)) ? svn_swig_pl_strings_to_array(
ST(18), _global_pool) : NULL;
}
res20 = SWIG_ConvertPtr(ST(19), &argp20,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -15964,12 +16613,13 @@ XS(_wrap_svn_client_diff5) {
{
_global_pool = arg18 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 17) || (items > 18)) {
SWIG_croak("Usage: svn_client_diff5(diff_options,path1,revision1,path2,revision2,relative_to_dir,depth,ignore_ancestry,no_diff_deleted,show_copies_as_adds,ignore_content_type,use_git_diff_format,header_encoding,outfile,errfile,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -15978,7 +16628,11 @@ XS(_wrap_svn_client_diff5) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -15986,7 +16640,11 @@ XS(_wrap_svn_client_diff5) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -16035,7 +16693,7 @@ XS(_wrap_svn_client_diff5) {
arg15 = svn_swig_pl_make_file(ST(14), _global_pool);
}
{
- arg16 = SvOK(ST(15)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg16 = SvOK(ST(15)) ? svn_swig_pl_strings_to_array(
ST(15), _global_pool) : NULL;
}
res17 = SWIG_ConvertPtr(ST(16), &argp17,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -16160,12 +16818,13 @@ XS(_wrap_svn_client_diff4) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 15) || (items > 16)) {
SWIG_croak("Usage: svn_client_diff4(diff_options,path1,revision1,path2,revision2,relative_to_dir,depth,ignore_ancestry,no_diff_deleted,ignore_content_type,header_encoding,outfile,errfile,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -16174,7 +16833,11 @@ XS(_wrap_svn_client_diff4) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -16182,7 +16845,11 @@ XS(_wrap_svn_client_diff4) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -16221,7 +16888,7 @@ XS(_wrap_svn_client_diff4) {
arg13 = svn_swig_pl_make_file(ST(12), _global_pool);
}
{
- arg14 = SvOK(ST(13)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg14 = SvOK(ST(13)) ? svn_swig_pl_strings_to_array(
ST(13), _global_pool) : NULL;
}
res15 = SWIG_ConvertPtr(ST(14), &argp15,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -16337,12 +17004,13 @@ XS(_wrap_svn_client_diff3) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 13) || (items > 14)) {
SWIG_croak("Usage: svn_client_diff3(diff_options,path1,revision1,path2,revision2,recurse,ignore_ancestry,no_diff_deleted,ignore_content_type,header_encoding,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -16351,7 +17019,11 @@ XS(_wrap_svn_client_diff3) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -16359,7 +17031,11 @@ XS(_wrap_svn_client_diff3) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -16497,12 +17173,13 @@ XS(_wrap_svn_client_diff2) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_diff2(diff_options,path1,revision1,path2,revision2,recurse,ignore_ancestry,no_diff_deleted,ignore_content_type,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -16511,7 +17188,11 @@ XS(_wrap_svn_client_diff2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -16519,7 +17200,11 @@ XS(_wrap_svn_client_diff2) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -16647,12 +17332,13 @@ XS(_wrap_svn_client_diff) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_diff(diff_options,path1,revision1,path2,revision2,recurse,ignore_ancestry,no_diff_deleted,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -16661,7 +17347,11 @@ XS(_wrap_svn_client_diff) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -16669,7 +17359,11 @@ XS(_wrap_svn_client_diff) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -16815,12 +17509,13 @@ XS(_wrap_svn_client_diff_peg6) {
{
_global_pool = arg21 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 20) || (items > 21)) {
SWIG_croak("Usage: svn_client_diff_peg6(diff_options,path_or_url,peg_revision,start_revision,end_revision,relative_to_dir,depth,ignore_ancestry,no_diff_added,no_diff_deleted,show_copies_as_adds,ignore_content_type,ignore_properties,properties_only,use_git_diff_format,header_encoding,outstream,errstream,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -16829,13 +17524,25 @@ XS(_wrap_svn_client_diff_peg6) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -16894,12 +17601,14 @@ XS(_wrap_svn_client_diff_peg6) {
arg16 = (char *)(buf16);
{
svn_swig_pl_make_stream (&arg17, ST(16));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg18, ST(17));
+ SPAGAIN;
}
{
- arg19 = SvOK(ST(18)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg19 = SvOK(ST(18)) ? svn_swig_pl_strings_to_array(
ST(18), _global_pool) : NULL;
}
res20 = SWIG_ConvertPtr(ST(19), &argp20,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -17039,12 +17748,13 @@ XS(_wrap_svn_client_diff_peg5) {
{
_global_pool = arg18 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 17) || (items > 18)) {
SWIG_croak("Usage: svn_client_diff_peg5(diff_options,path,peg_revision,start_revision,end_revision,relative_to_dir,depth,ignore_ancestry,no_diff_deleted,show_copies_as_adds,ignore_content_type,use_git_diff_format,header_encoding,outfile,errfile,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -17053,13 +17763,25 @@ XS(_wrap_svn_client_diff_peg5) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -17108,7 +17830,7 @@ XS(_wrap_svn_client_diff_peg5) {
arg15 = svn_swig_pl_make_file(ST(14), _global_pool);
}
{
- arg16 = SvOK(ST(15)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg16 = SvOK(ST(15)) ? svn_swig_pl_strings_to_array(
ST(15), _global_pool) : NULL;
}
res17 = SWIG_ConvertPtr(ST(16), &argp17,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -17236,12 +17958,13 @@ XS(_wrap_svn_client_diff_peg4) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 15) || (items > 16)) {
SWIG_croak("Usage: svn_client_diff_peg4(diff_options,path,peg_revision,start_revision,end_revision,relative_to_dir,depth,ignore_ancestry,no_diff_deleted,ignore_content_type,header_encoding,outfile,errfile,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -17250,13 +17973,25 @@ XS(_wrap_svn_client_diff_peg4) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
if (!SWIG_IsOK(res6)) {
@@ -17295,7 +18030,7 @@ XS(_wrap_svn_client_diff_peg4) {
arg13 = svn_swig_pl_make_file(ST(12), _global_pool);
}
{
- arg14 = SvOK(ST(13)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg14 = SvOK(ST(13)) ? svn_swig_pl_strings_to_array(
ST(13), _global_pool) : NULL;
}
res15 = SWIG_ConvertPtr(ST(14), &argp15,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -17414,12 +18149,13 @@ XS(_wrap_svn_client_diff_peg3) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 13) || (items > 14)) {
SWIG_croak("Usage: svn_client_diff_peg3(diff_options,path,peg_revision,start_revision,end_revision,recurse,ignore_ancestry,no_diff_deleted,ignore_content_type,header_encoding,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -17428,13 +18164,25 @@ XS(_wrap_svn_client_diff_peg3) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -17575,12 +18323,13 @@ XS(_wrap_svn_client_diff_peg2) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_diff_peg2(diff_options,path,peg_revision,start_revision,end_revision,recurse,ignore_ancestry,no_diff_deleted,ignore_content_type,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -17589,13 +18338,25 @@ XS(_wrap_svn_client_diff_peg2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -17726,12 +18487,13 @@ XS(_wrap_svn_client_diff_peg) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_diff_peg(diff_options,path,peg_revision,start_revision,end_revision,recurse,ignore_ancestry,no_diff_deleted,outfile,errfile,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -17740,13 +18502,25 @@ XS(_wrap_svn_client_diff_peg) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -17869,6 +18643,7 @@ XS(_wrap_svn_client_diff_summarize2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_diff_summarize2(path_or_url1,revision1,path_or_url2,revision2,depth,ignore_ancestry,changelists,summarize_func,summarize_baton,ctx,pool);");
@@ -17879,7 +18654,11 @@ XS(_wrap_svn_client_diff_summarize2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -17887,7 +18666,11 @@ XS(_wrap_svn_client_diff_summarize2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -17900,7 +18683,7 @@ XS(_wrap_svn_client_diff_summarize2) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg7 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
{
@@ -17995,6 +18778,7 @@ XS(_wrap_svn_client_diff_summarize) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_diff_summarize(path1,revision1,path2,revision2,recurse,ignore_ancestry,summarize_func,summarize_baton,ctx,pool);");
@@ -18005,7 +18789,11 @@ XS(_wrap_svn_client_diff_summarize) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -18013,7 +18801,11 @@ XS(_wrap_svn_client_diff_summarize) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -18114,6 +18906,7 @@ XS(_wrap_svn_client_diff_summarize_peg2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_diff_summarize_peg2(path_or_url,peg_revision,start_revision,end_revision,depth,ignore_ancestry,changelists,summarize_func,summarize_baton,ctx,pool);");
@@ -18124,13 +18917,25 @@ XS(_wrap_svn_client_diff_summarize_peg2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -18143,7 +18948,7 @@ XS(_wrap_svn_client_diff_summarize_peg2) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg7 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
{
@@ -18241,6 +19046,7 @@ XS(_wrap_svn_client_diff_summarize_peg) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_diff_summarize_peg(path,peg_revision,start_revision,end_revision,recurse,ignore_ancestry,summarize_func,summarize_baton,ctx,pool);");
@@ -18251,13 +19057,25 @@ XS(_wrap_svn_client_diff_summarize_peg) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -18382,9 +19200,11 @@ XS(_wrap_svn_client_get_merging_summary) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg17 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -18405,7 +19225,11 @@ XS(_wrap_svn_client_get_merging_summary) {
}
arg11 = (char *)(buf11);
{
- arg12 = svn_swig_pl_set_revision(&rev12, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg12 = svn_swig_pl_set_revision(&rev12, ST(1), TRUE, _global_pool);
}
res13 = SWIG_AsCharPtrAndSize(ST(2), &buf13, NULL, &alloc13);
if (!SWIG_IsOK(res13)) {
@@ -18413,7 +19237,11 @@ XS(_wrap_svn_client_get_merging_summary) {
}
arg13 = (char *)(buf13);
{
- arg14 = svn_swig_pl_set_revision(&rev14, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg14 = svn_swig_pl_set_revision(&rev14, ST(3), TRUE, _global_pool);
}
res15 = SWIG_ConvertPtr(ST(4), &argp15,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res15)) {
@@ -18607,6 +19435,7 @@ XS(_wrap_svn_client_merge5) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 14) || (items > 15)) {
SWIG_croak("Usage: svn_client_merge5(source1,revision1,source2,revision2,target_wcpath,depth,ignore_mergeinfo,diff_ignore_ancestry,force_delete,record_only,dry_run,allow_mixed_rev,merge_options,ctx,pool);");
@@ -18617,7 +19446,11 @@ XS(_wrap_svn_client_merge5) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -18625,7 +19458,11 @@ XS(_wrap_svn_client_merge5) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -18789,6 +19626,7 @@ XS(_wrap_svn_client_merge4) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 13) || (items > 14)) {
SWIG_croak("Usage: svn_client_merge4(source1,revision1,source2,revision2,target_wcpath,depth,ignore_ancestry,force_delete,record_only,dry_run,allow_mixed_rev,merge_options,ctx,pool);");
@@ -18799,7 +19637,11 @@ XS(_wrap_svn_client_merge4) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -18807,7 +19649,11 @@ XS(_wrap_svn_client_merge4) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -18961,6 +19807,7 @@ XS(_wrap_svn_client_merge3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_merge3(source1,revision1,source2,revision2,target_wcpath,depth,ignore_ancestry,force,record_only,dry_run,merge_options,ctx,pool);");
@@ -18971,7 +19818,11 @@ XS(_wrap_svn_client_merge3) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -18979,7 +19830,11 @@ XS(_wrap_svn_client_merge3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -19123,6 +19978,7 @@ XS(_wrap_svn_client_merge2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_merge2(source1,revision1,source2,revision2,target_wcpath,recurse,ignore_ancestry,force,dry_run,merge_options,ctx,pool);");
@@ -19133,7 +19989,11 @@ XS(_wrap_svn_client_merge2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -19141,7 +20001,11 @@ XS(_wrap_svn_client_merge2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -19275,6 +20139,7 @@ XS(_wrap_svn_client_merge) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_merge(source1,revision1,source2,revision2,target_wcpath,recurse,ignore_ancestry,force,dry_run,ctx,pool);");
@@ -19285,7 +20150,11 @@ XS(_wrap_svn_client_merge) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -19293,7 +20162,11 @@ XS(_wrap_svn_client_merge) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -19408,6 +20281,7 @@ XS(_wrap_svn_client_merge_reintegrate) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_merge_reintegrate(source_path_or_url,source_peg_revision,target_wcpath,dry_run,merge_options,ctx,pool);");
@@ -19418,7 +20292,11 @@ XS(_wrap_svn_client_merge_reintegrate) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -19534,6 +20412,7 @@ XS(_wrap_svn_client_merge_peg5) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 13) || (items > 14)) {
SWIG_croak("Usage: svn_client_merge_peg5(source_path_or_url,ranges_to_merge,source_peg_revision,target_wcpath,depth,ignore_mergeinfo,diff_ignore_ancestry,force_delete,record_only,dry_run,allow_mixed_rev,merge_options,ctx,pool);");
@@ -19547,7 +20426,11 @@ XS(_wrap_svn_client_merge_peg5) {
arg2 = svn_swig_pl_array_to_apr_array_revision_range(ST(1), _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -19704,6 +20587,7 @@ XS(_wrap_svn_client_merge_peg4) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_merge_peg4(source_path_or_url,ranges_to_merge,source_peg_revision,target_wcpath,depth,ignore_ancestry,force_delete,record_only,dry_run,allow_mixed_rev,merge_options,ctx,pool);");
@@ -19717,7 +20601,11 @@ XS(_wrap_svn_client_merge_peg4) {
arg2 = svn_swig_pl_array_to_apr_array_revision_range(ST(1), _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -19864,6 +20752,7 @@ XS(_wrap_svn_client_merge_peg3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_merge_peg3(source,ranges_to_merge,peg_revision,target_wcpath,depth,ignore_ancestry,force,record_only,dry_run,merge_options,ctx,pool);");
@@ -19877,7 +20766,11 @@ XS(_wrap_svn_client_merge_peg3) {
arg2 = svn_swig_pl_array_to_apr_array_revision_range(ST(1), _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -20022,6 +20915,7 @@ XS(_wrap_svn_client_merge_peg2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_merge_peg2(source,revision1,revision2,peg_revision,target_wcpath,recurse,ignore_ancestry,force,dry_run,merge_options,ctx,pool);");
@@ -20032,13 +20926,25 @@ XS(_wrap_svn_client_merge_peg2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -20175,6 +21081,7 @@ XS(_wrap_svn_client_merge_peg) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_merge_peg(source,revision1,revision2,peg_revision,target_wcpath,recurse,ignore_ancestry,force,dry_run,ctx,pool);");
@@ -20185,13 +21092,25 @@ XS(_wrap_svn_client_merge_peg) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
if (!SWIG_IsOK(res5)) {
@@ -20303,6 +21222,7 @@ XS(_wrap_svn_client_suggest_merge_sources) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -20314,7 +21234,11 @@ XS(_wrap_svn_client_suggest_merge_sources) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_ConvertPtr(ST(2), &argp4,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res4)) {
@@ -20392,6 +21316,7 @@ XS(_wrap_svn_client_mergeinfo_get_merged) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -20403,7 +21328,11 @@ XS(_wrap_svn_client_mergeinfo_get_merged) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_ConvertPtr(ST(2), &argp4,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res4)) {
@@ -20507,6 +21436,7 @@ XS(_wrap_svn_client_mergeinfo_log2) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_mergeinfo_log2(finding_merged,target_path_or_url,target_peg_revision,source_path_or_url,source_peg_revision,source_start_revision,source_end_revision,receiver,receiver_baton,discover_changed_paths,depth,revprops,ctx,scratch_pool);");
@@ -20522,7 +21452,11 @@ XS(_wrap_svn_client_mergeinfo_log2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -20530,16 +21464,28 @@ XS(_wrap_svn_client_mergeinfo_log2) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
{
- arg6 = svn_swig_pl_set_revision(&rev6, ST(5), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg6 = svn_swig_pl_set_revision(&rev6, ST(5), TRUE, _global_pool);
}
{
- arg7 = svn_swig_pl_set_revision(&rev7, ST(6), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg7 = svn_swig_pl_set_revision(&rev7, ST(6), TRUE, _global_pool);
}
{
- arg8 = svn_swig_pl_thunk_log_entry_receiver;
+ arg8 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg9 = ST(7);
}
ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val10);
@@ -20553,7 +21499,7 @@ XS(_wrap_svn_client_mergeinfo_log2) {
}
arg11 = (svn_depth_t)(val11);
{
- arg12 = SvOK(ST(10)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg12 = SvOK(ST(10)) ? svn_swig_pl_strings_to_array(
ST(10), _global_pool) : NULL;
}
res13 = SWIG_ConvertPtr(ST(11), &argp13,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -20654,6 +21600,7 @@ XS(_wrap_svn_client_mergeinfo_log) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_mergeinfo_log(finding_merged,target_path_or_url,target_peg_revision,source_path_or_url,source_peg_revision,receiver,receiver_baton,discover_changed_paths,depth,revprops,ctx,scratch_pool);");
@@ -20669,7 +21616,11 @@ XS(_wrap_svn_client_mergeinfo_log) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -20677,10 +21628,14 @@ XS(_wrap_svn_client_mergeinfo_log) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
{
- arg6 = svn_swig_pl_thunk_log_entry_receiver;
+ arg6 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg7 = ST(5);
}
ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val8);
@@ -20694,7 +21649,7 @@ XS(_wrap_svn_client_mergeinfo_log) {
}
arg9 = (svn_depth_t)(val9);
{
- arg10 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg10 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
res11 = SWIG_ConvertPtr(ST(9), &argp11,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -20785,6 +21740,7 @@ XS(_wrap_svn_client_mergeinfo_log_merged) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_mergeinfo_log_merged(path_or_url,peg_revision,merge_source_path_or_url,src_peg_revision,receiver,receiver_baton,discover_changed_paths,revprops,ctx,pool);");
@@ -20795,7 +21751,11 @@ XS(_wrap_svn_client_mergeinfo_log_merged) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -20803,10 +21763,14 @@ XS(_wrap_svn_client_mergeinfo_log_merged) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_thunk_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg6 = ST(4);
}
ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
@@ -20815,7 +21779,7 @@ XS(_wrap_svn_client_mergeinfo_log_merged) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
res9 = SWIG_ConvertPtr(ST(7), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -20907,6 +21871,7 @@ XS(_wrap_svn_client_mergeinfo_log_eligible) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_mergeinfo_log_eligible(path_or_url,peg_revision,merge_source_path_or_url,src_peg_revision,receiver,receiver_baton,discover_changed_paths,revprops,ctx,pool);");
@@ -20917,7 +21882,11 @@ XS(_wrap_svn_client_mergeinfo_log_eligible) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
@@ -20925,10 +21894,14 @@ XS(_wrap_svn_client_mergeinfo_log_eligible) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_thunk_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg6 = ST(4);
}
ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
@@ -20937,7 +21910,7 @@ XS(_wrap_svn_client_mergeinfo_log_eligible) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
res9 = SWIG_ConvertPtr(ST(7), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -20998,6 +21971,246 @@ XS(_wrap_svn_client_mergeinfo_log_eligible) {
}
+XS(_wrap_svn_client_vacuum) {
+ {
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 7) || (items > 8)) {
+ SWIG_croak("Usage: svn_client_vacuum(dir_abspath,remove_unversioned_items,remove_ignored_items,fix_recorded_timestamps,vacuum_pristines,include_externals,ctx,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_vacuum" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_client_vacuum" "', argument " "2"" of type '" "svn_boolean_t""'");
+ }
+ arg2 = (svn_boolean_t)(val2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_client_vacuum" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_client_vacuum" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_vacuum" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_vacuum" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ res7 = SWIG_ConvertPtr(ST(6), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_client_vacuum" "', argument " "7"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (items > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_vacuum((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_client_cleanup2) {
+ {
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 7) || (items > 8)) {
+ SWIG_croak("Usage: svn_client_cleanup2(dir_abspath,break_locks,fix_recorded_timestamps,clear_dav_cache,vacuum_pristines,include_externals,ctx,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_cleanup2" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_client_cleanup2" "', argument " "2"" of type '" "svn_boolean_t""'");
+ }
+ arg2 = (svn_boolean_t)(val2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_client_cleanup2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_client_cleanup2" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_cleanup2" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_cleanup2" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ res7 = SWIG_ConvertPtr(ST(6), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_client_cleanup2" "', argument " "7"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (items > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_cleanup2((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_cleanup) {
{
char *arg1 = (char *) 0 ;
@@ -21015,6 +22228,7 @@ XS(_wrap_svn_client_cleanup) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_client_cleanup(dir,ctx,scratch_pool);");
@@ -21084,6 +22298,7 @@ XS(_wrap_svn_client_upgrade) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_client_upgrade(wcroot_dir,ctx,scratch_pool);");
@@ -21164,6 +22379,7 @@ XS(_wrap_svn_client_relocate2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_relocate2(wcroot_dir,from_prefix,to_prefix,ignore_externals,ctx,pool);");
@@ -21265,6 +22481,7 @@ XS(_wrap_svn_client_relocate) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_relocate(dir,from_prefix,to_prefix,recurse,ctx,pool);");
@@ -21338,6 +22555,109 @@ XS(_wrap_svn_client_relocate) {
}
+XS(_wrap_svn_client_revert3) {
+ {
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ svn_depth_t arg2 ;
+ apr_array_header_t *arg3 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_client_ctx_t *arg6 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ void *argp6 = 0 ;
+ int res6 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 6) || (items > 7)) {
+ SWIG_croak("Usage: svn_client_revert3(paths,depth,changelists,clear_changelists,metadata_only,ctx,pool);");
+ }
+ {
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
+ _global_pool);
+ }
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_client_revert3" "', argument " "2"" of type '" "svn_depth_t""'");
+ }
+ arg2 = (svn_depth_t)(val2);
+ {
+ arg3 = SvOK(ST(2)) ? svn_swig_pl_strings_to_array(
+ ST(2), _global_pool) : NULL;
+ }
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_client_revert3" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_revert3" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ res6 = SWIG_ConvertPtr(ST(5), &argp6,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_client_revert3" "', argument " "6"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg6 = (svn_client_ctx_t *)(argp6);
+ if (items > 6) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_revert3((apr_array_header_t const *)arg1,arg2,(apr_array_header_t const *)arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_revert2) {
{
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
@@ -21356,12 +22676,13 @@ XS(_wrap_svn_client_revert2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_revert2(paths,depth,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -21370,7 +22691,7 @@ XS(_wrap_svn_client_revert2) {
}
arg2 = (svn_depth_t)(val2);
{
- arg3 = SvOK(ST(2)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg3 = SvOK(ST(2)) ? svn_swig_pl_strings_to_array(
ST(2), _global_pool) : NULL;
}
res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -21437,12 +22758,13 @@ XS(_wrap_svn_client_revert) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_revert(paths,recursive,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -21515,6 +22837,7 @@ XS(_wrap_svn_client_resolved) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_resolved(path,recursive,ctx,pool);");
@@ -21597,6 +22920,7 @@ XS(_wrap_svn_client_resolve) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_resolve(path,depth,conflict_choice,ctx,pool);");
@@ -21743,6 +23067,7 @@ XS(_wrap_svn_client_copy_source_t_revision_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -21755,7 +23080,11 @@ XS(_wrap_svn_client_copy_source_t_revision_set) {
}
arg1 = (struct svn_client_copy_source_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
if (!arg2) {
@@ -21810,6 +23139,7 @@ XS(_wrap_svn_client_copy_source_t_peg_revision_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -21822,7 +23152,11 @@ XS(_wrap_svn_client_copy_source_t_peg_revision_set) {
}
arg1 = (struct svn_client_copy_source_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
if (!arg2) {
@@ -21925,6 +23259,163 @@ XS(_wrap_delete_svn_client_copy_source_t) {
}
+XS(_wrap_svn_client_copy7) {
+ {
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_hash_t *arg8 = (apr_hash_t *) 0 ;
+ apr_hash_t *arg9 = (apr_hash_t *) 0 ;
+ svn_commit_callback2_t arg10 = (svn_commit_callback2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ svn_client_ctx_t *arg12 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ void *argp8 = 0 ;
+ int res8 = 0 ;
+ void *argp12 = 0 ;
+ int res12 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_client_copy7(sources,dst_path,copy_as_child,make_parents,ignore_externals,metadata_only,pin_externals,externals_to_pin,revprop_table,commit_callback,commit_baton,ctx,pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_copy7" "', argument " "1"" of type '" "apr_array_header_t const *""'");
+ }
+ arg1 = (apr_array_header_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_client_copy7" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_client_copy7" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_client_copy7" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_copy7" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_copy7" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_client_copy7" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ res8 = SWIG_ConvertPtr(ST(7), &argp8,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_client_copy7" "', argument " "8"" of type '" "apr_hash_t const *""'");
+ }
+ arg8 = (apr_hash_t *)(argp8);
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg9 = svn_swig_pl_hash_to_prophash(ST(8), _global_pool);
+ }
+ {
+ arg10 = svn_swig_pl_thunk_commit_callback2;
+ arg11 = (void *)ST(9);
+ svn_swig_pl_hold_ref_in_pool (_global_pool, ST(9));
+ }
+ res12 = SWIG_ConvertPtr(ST(10), &argp12,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_client_copy7" "', argument " "12"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg12 = (svn_client_ctx_t *)(argp12);
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_copy7((apr_array_header_t const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,(apr_hash_t const *)arg8,(apr_hash_t const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_copy6) {
{
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
@@ -21957,6 +23448,7 @@ XS(_wrap_svn_client_copy6) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_copy6(sources,dst_path,copy_as_child,make_parents,ignore_externals,revprop_table,commit_callback,commit_baton,ctx,pool);");
@@ -21987,8 +23479,10 @@ XS(_wrap_svn_client_copy6) {
}
arg5 = (svn_boolean_t)(val5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
{
@@ -22081,6 +23575,7 @@ XS(_wrap_svn_client_copy5) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
@@ -22112,8 +23607,10 @@ XS(_wrap_svn_client_copy5) {
}
arg6 = (svn_boolean_t)(val6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -22203,6 +23700,7 @@ XS(_wrap_svn_client_copy4) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 6) || (items > 7)) {
@@ -22229,8 +23727,10 @@ XS(_wrap_svn_client_copy4) {
}
arg5 = (svn_boolean_t)(val5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
res7 = SWIG_ConvertPtr(ST(5), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -22314,6 +23814,7 @@ XS(_wrap_svn_client_copy3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -22325,7 +23826,11 @@ XS(_wrap_svn_client_copy3) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -22409,6 +23914,7 @@ XS(_wrap_svn_client_copy2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -22420,7 +23926,11 @@ XS(_wrap_svn_client_copy2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -22504,6 +24014,7 @@ XS(_wrap_svn_client_copy) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -22515,7 +24026,11 @@ XS(_wrap_svn_client_copy) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -22611,12 +24126,13 @@ XS(_wrap_svn_client_move7) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_move7(src_paths,dst_path,move_as_child,make_parents,allow_mixed_revisions,metadata_only,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -22645,8 +24161,10 @@ XS(_wrap_svn_client_move7) {
}
arg6 = (svn_boolean_t)(val6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(6), _global_pool);
}
{
@@ -22736,12 +24254,13 @@ XS(_wrap_svn_client_move6) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_move6(src_paths,dst_path,move_as_child,make_parents,revprop_table,commit_callback,commit_baton,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -22760,8 +24279,10 @@ XS(_wrap_svn_client_move6) {
}
arg4 = (svn_boolean_t)(val4);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg5 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
{
@@ -22850,13 +24371,14 @@ XS(_wrap_svn_client_move5) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_move5(src_paths,dst_path,force,move_as_child,make_parents,revprop_table,ctx,pool);");
}
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg2 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
@@ -22880,8 +24402,10 @@ XS(_wrap_svn_client_move5) {
}
arg6 = (svn_boolean_t)(val6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -22968,6 +24492,7 @@ XS(_wrap_svn_client_move4) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -23066,6 +24591,7 @@ XS(_wrap_svn_client_move3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -23164,6 +24690,7 @@ XS(_wrap_svn_client_move2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -23268,6 +24795,7 @@ XS(_wrap_svn_client_move) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -23279,7 +24807,11 @@ XS(_wrap_svn_client_move) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -23381,6 +24913,7 @@ XS(_wrap_svn_client_propset_remote) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_propset_remote(propname,propval,url,skip_checks,base_revision_for_url,revprop_table,commit_callback,commit_baton,ctx,scratch_pool);");
@@ -23415,8 +24948,10 @@ XS(_wrap_svn_client_propset_remote) {
}
arg5 = (svn_revnum_t)(val5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
{
@@ -23504,6 +25039,7 @@ XS(_wrap_svn_client_propset_local) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_propset_local(propname,propval,targets,depth,skip_checks,changelists,ctx,scratch_pool);");
@@ -23523,7 +25059,7 @@ XS(_wrap_svn_client_propset_local) {
}
}
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(2),
+ arg3 = svn_swig_pl_strings_to_array(ST(2),
_global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
@@ -23537,7 +25073,7 @@ XS(_wrap_svn_client_propset_local) {
}
arg5 = (svn_boolean_t)(val5);
{
- arg6 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg6 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
res7 = SWIG_ConvertPtr(ST(6), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -23629,6 +25165,7 @@ XS(_wrap_svn_client_propset3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
@@ -23669,12 +25206,14 @@ XS(_wrap_svn_client_propset3) {
}
arg7 = (svn_revnum_t)(val7);
{
- arg8 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg9 = svn_swig_pl_hash_to_prophash(ST(7), _global_pool);
}
res10 = SWIG_ConvertPtr(ST(8), &argp10,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -23768,6 +25307,7 @@ XS(_wrap_svn_client_propset2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_propset2(propname,propval,target,recurse,skip_checks,ctx,pool);");
@@ -23875,6 +25415,7 @@ XS(_wrap_svn_client_propset) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_propset(propname,propval,target,recurse,pool);");
@@ -23978,6 +25519,7 @@ XS(_wrap_svn_client_revprop_set2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 7) || (items > 8)) {
@@ -24012,7 +25554,11 @@ XS(_wrap_svn_client_revprop_set2) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(4), TRUE, _global_pool);
}
ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
if (!SWIG_IsOK(ecode7)) {
@@ -24116,6 +25662,7 @@ XS(_wrap_svn_client_revprop_set) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 6) || (items > 7)) {
@@ -24141,7 +25688,11 @@ XS(_wrap_svn_client_revprop_set) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -24249,9 +25800,11 @@ XS(_wrap_svn_client_propget5) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -24270,10 +25823,18 @@ XS(_wrap_svn_client_propget5) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(2), TRUE, _global_pool);
}
{
- arg6 = svn_swig_pl_set_revision(&rev6, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg6 = svn_swig_pl_set_revision(&rev6, ST(3), TRUE, _global_pool);
}
ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val8);
if (!SWIG_IsOK(ecode8)) {
@@ -24281,7 +25842,7 @@ XS(_wrap_svn_client_propget5) {
}
arg8 = (svn_depth_t)(val8);
{
- arg9 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg9 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
res10 = SWIG_ConvertPtr(ST(6), &argp10,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -24411,9 +25972,11 @@ XS(_wrap_svn_client_propget4) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg6 = &temp6;
@@ -24431,10 +25994,18 @@ XS(_wrap_svn_client_propget4) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val7);
if (!SWIG_IsOK(ecode7)) {
@@ -24442,7 +26013,7 @@ XS(_wrap_svn_client_propget4) {
}
arg7 = (svn_depth_t)(val7);
{
- arg8 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
res9 = SWIG_ConvertPtr(ST(6), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -24560,6 +26131,7 @@ XS(_wrap_svn_client_propget3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg6 = &temp6;
@@ -24577,10 +26149,18 @@ XS(_wrap_svn_client_propget3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val7);
if (!SWIG_IsOK(ecode7)) {
@@ -24588,7 +26168,7 @@ XS(_wrap_svn_client_propget3) {
}
arg7 = (svn_depth_t)(val7);
{
- arg8 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg8 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
res9 = SWIG_ConvertPtr(ST(6), &argp9,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -24697,6 +26277,7 @@ XS(_wrap_svn_client_propget2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 6) || (items > 7)) {
@@ -24713,10 +26294,18 @@ XS(_wrap_svn_client_propget2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -24817,6 +26406,7 @@ XS(_wrap_svn_client_propget) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -24833,7 +26423,11 @@ XS(_wrap_svn_client_propget) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -24927,6 +26521,7 @@ XS(_wrap_svn_client_revprop_get) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg5 = &temp5;
@@ -24944,7 +26539,11 @@ XS(_wrap_svn_client_revprop_get) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
res6 = SWIG_ConvertPtr(ST(3), &argp6,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res6)) {
@@ -25046,6 +26645,7 @@ XS(_wrap_svn_client_proplist4) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_proplist4(target,peg_revision,revision,depth,changelists,get_target_inherited_props,receiver,receiver_baton,ctx,scratch_pool);");
@@ -25056,10 +26656,18 @@ XS(_wrap_svn_client_proplist4) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -25067,7 +26675,7 @@ XS(_wrap_svn_client_proplist4) {
}
arg4 = (svn_depth_t)(val4);
{
- arg5 = SvOK(ST(4)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg5 = SvOK(ST(4)) ? svn_swig_pl_strings_to_array(
ST(4), _global_pool) : NULL;
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
@@ -25180,6 +26788,7 @@ XS(_wrap_svn_client_proplist3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_proplist3(target,peg_revision,revision,depth,changelists,receiver,receiver_baton,ctx,pool);");
@@ -25190,10 +26799,18 @@ XS(_wrap_svn_client_proplist3) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -25201,7 +26818,7 @@ XS(_wrap_svn_client_proplist3) {
}
arg4 = (svn_depth_t)(val4);
{
- arg5 = SvOK(ST(4)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg5 = SvOK(ST(4)) ? svn_swig_pl_strings_to_array(
ST(4), _global_pool) : NULL;
}
{
@@ -25305,6 +26922,7 @@ XS(_wrap_svn_client_proplist2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -25316,10 +26934,18 @@ XS(_wrap_svn_client_proplist2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -25367,7 +26993,7 @@ XS(_wrap_svn_client_proplist2) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
SWIGTYPE_p_svn_client_proplist_item_t); argvi++ /*@SWIG@*/
/*@SWIG@*/
;
@@ -25417,6 +27043,7 @@ XS(_wrap_svn_client_proplist) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -25428,7 +27055,11 @@ XS(_wrap_svn_client_proplist) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -25471,7 +27102,7 @@ XS(_wrap_svn_client_proplist) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = svn_swig_pl_convert_array(*arg1,
SWIGTYPE_p_svn_client_proplist_item_t); argvi++ /*@SWIG@*/
/*@SWIG@*/
;
@@ -25519,6 +27150,7 @@ XS(_wrap_svn_client_revprop_list) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg4 = &temp4;
@@ -25531,7 +27163,11 @@ XS(_wrap_svn_client_revprop_list) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
res5 = SWIG_ConvertPtr(ST(2), &argp5,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res5)) {
@@ -25640,6 +27276,7 @@ XS(_wrap_svn_client_export5) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -25656,10 +27293,18 @@ XS(_wrap_svn_client_export5) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -25804,6 +27449,7 @@ XS(_wrap_svn_client_export4) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
@@ -25820,10 +27466,18 @@ XS(_wrap_svn_client_export4) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -25961,6 +27615,7 @@ XS(_wrap_svn_client_export3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 9) || (items > 10)) {
@@ -25977,10 +27632,18 @@ XS(_wrap_svn_client_export3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -26110,6 +27773,7 @@ XS(_wrap_svn_client_export2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 6) || (items > 7)) {
@@ -26126,7 +27790,11 @@ XS(_wrap_svn_client_export2) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -26226,6 +27894,7 @@ XS(_wrap_svn_client_export) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -26242,7 +27911,11 @@ XS(_wrap_svn_client_export) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -26342,6 +28015,7 @@ XS(_wrap_svn_client_list3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_list3(path_or_url,peg_revision,revision,depth,dirent_fields,fetch_locks,include_externals,list_func,baton,ctx,pool);");
@@ -26352,10 +28026,18 @@ XS(_wrap_svn_client_list3) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -26489,6 +28171,7 @@ XS(_wrap_svn_client_list2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_list2(path_or_url,peg_revision,revision,depth,dirent_fields,fetch_locks,list_func,baton,ctx,pool);");
@@ -26499,10 +28182,18 @@ XS(_wrap_svn_client_list2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -26629,6 +28320,7 @@ XS(_wrap_svn_client_list) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_client_list(path_or_url,peg_revision,revision,recurse,dirent_fields,fetch_locks,list_func,baton,ctx,pool);");
@@ -26639,10 +28331,18 @@ XS(_wrap_svn_client_list) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -26764,6 +28464,7 @@ XS(_wrap_svn_client_ls3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -26776,10 +28477,18 @@ XS(_wrap_svn_client_ls3) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(1), TRUE, _global_pool);
}
{
- arg5 = svn_swig_pl_set_revision(&rev5, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(2), TRUE, _global_pool);
}
ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
if (!SWIG_IsOK(ecode6)) {
@@ -26881,6 +28590,7 @@ XS(_wrap_svn_client_ls2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -26892,10 +28602,18 @@ XS(_wrap_svn_client_ls2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
}
ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
if (!SWIG_IsOK(ecode5)) {
@@ -26990,6 +28708,7 @@ XS(_wrap_svn_client_ls) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -27001,7 +28720,11 @@ XS(_wrap_svn_client_ls) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(1), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -27060,6 +28783,143 @@ XS(_wrap_svn_client_ls) {
}
+XS(_wrap_svn_client_cat3) {
+ {
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg5 = (svn_opt_revision_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ apr_hash_t *temp1 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_opt_revision_t rev4 ;
+ svn_opt_revision_t rev5 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 6) || (items > 8)) {
+ SWIG_croak("Usage: svn_client_cat3(out,path_or_url,peg_revision,revision,expand_keywords,ctx,result_pool,scratch_pool);");
+ }
+ {
+ svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
+ }
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_client_cat3" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(2), TRUE, _global_pool);
+ }
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg5 = svn_swig_pl_set_revision(&rev5, ST(3), TRUE, _global_pool);
+ }
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_cat3" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ res7 = SWIG_ConvertPtr(ST(5), &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_client_cat3" "', argument " "7"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (items > 6) {
+
+ }
+ if (items > 7) {
+
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg5) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_cat3(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,(struct svn_opt_revision_t const *)arg5,arg6,arg7,arg8,arg9);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_prophash_to_hash(*arg1); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_cat2) {
{
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -27082,12 +28942,14 @@ XS(_wrap_svn_client_cat2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_cat2(out,path_or_url,peg_revision,revision,ctx,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
@@ -27095,10 +28957,18 @@ XS(_wrap_svn_client_cat2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
- arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg4 = svn_swig_pl_set_revision(&rev4, ST(3), TRUE, _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res5)) {
@@ -27179,12 +29049,14 @@ XS(_wrap_svn_client_cat) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_cat(out,path_or_url,revision,ctx,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
@@ -27192,7 +29064,11 @@ XS(_wrap_svn_client_cat) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
if (!SWIG_IsOK(res4)) {
@@ -27268,12 +29144,13 @@ XS(_wrap_svn_client_add_to_changelist) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_client_add_to_changelist(paths,changelist,depth,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -27287,7 +29164,7 @@ XS(_wrap_svn_client_add_to_changelist) {
}
arg3 = (svn_depth_t)(val3);
{
- arg4 = SvOK(ST(3)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg4 = SvOK(ST(3)) ? svn_swig_pl_strings_to_array(
ST(3), _global_pool) : NULL;
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -27357,12 +29234,13 @@ XS(_wrap_svn_client_remove_from_changelists) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_remove_from_changelists(paths,depth,changelists,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -27371,7 +29249,7 @@ XS(_wrap_svn_client_remove_from_changelists) {
}
arg2 = (svn_depth_t)(val2);
{
- arg3 = SvOK(ST(2)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg3 = SvOK(ST(2)) ? svn_swig_pl_strings_to_array(
ST(2), _global_pool) : NULL;
}
res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -27445,6 +29323,7 @@ XS(_wrap_svn_client_get_changelists) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_get_changelists(path,changelists,depth,callback_func,callback_baton,ctx,pool);");
@@ -27455,7 +29334,7 @@ XS(_wrap_svn_client_get_changelists) {
}
arg1 = (char *)(buf1);
{
- arg2 = SvOK(ST(1)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg2 = SvOK(ST(1)) ? svn_swig_pl_strings_to_array(
ST(1), _global_pool) : NULL;
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -27545,12 +29424,13 @@ XS(_wrap_svn_client_lock) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_lock(targets,comment,steal_lock,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
@@ -27627,12 +29507,13 @@ XS(_wrap_svn_client_unlock) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_unlock(targets,break_lock,ctx,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
@@ -28155,10 +30036,9 @@ XS(_wrap_svn_info_t_last_changed_date_get) {
arg1 = (struct svn_info_t *)(argp1);
result = ((arg1)->last_changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -28629,10 +30509,9 @@ XS(_wrap_svn_info_t_text_time_get) {
arg1 = (struct svn_info_t *)(argp1);
result = ((arg1)->text_time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -28699,10 +30578,9 @@ XS(_wrap_svn_info_t_prop_time_get) {
arg1 = (struct svn_info_t *)(argp1);
result = ((arg1)->prop_time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -29402,10 +31280,9 @@ XS(_wrap_svn_info_t_size64_get) {
arg1 = (struct svn_info_t *)(argp1);
result = ((arg1)->size64);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -29472,10 +31349,9 @@ XS(_wrap_svn_info_t_working_size64_get) {
arg1 = (struct svn_info_t *)(argp1);
result = ((arg1)->working_size64);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -29619,6 +31495,7 @@ XS(_wrap_svn_info_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_info_dup(info,pool);");
@@ -30054,10 +31931,9 @@ XS(_wrap_svn_client_info2_t_size_get) {
arg1 = (struct svn_client_info2_t *)(argp1);
result = ((arg1)->size);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -30189,10 +32065,9 @@ XS(_wrap_svn_client_info2_t_last_changed_date_get) {
arg1 = (struct svn_client_info2_t *)(argp1);
result = ((arg1)->last_changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -30474,6 +32349,7 @@ XS(_wrap_svn_client_info2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_client_info2_dup(info,pool);");
@@ -30504,6 +32380,172 @@ XS(_wrap_svn_client_info2_dup) {
}
+XS(_wrap_svn_client_info4) {
+ {
+ char *arg1 = (char *) 0 ;
+ svn_opt_revision_t *arg2 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg3 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ svn_client_info_receiver2_t arg9 = (svn_client_info_receiver2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ svn_client_ctx_t *arg11 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ svn_opt_revision_t rev2 ;
+ svn_opt_revision_t rev3 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int res10 ;
+ void *argp11 = 0 ;
+ int res11 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_client_info4(abspath_or_url,peg_revision,revision,depth,fetch_excluded,fetch_actual_only,include_externals,changelists,receiver,receiver_baton,ctx,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_client_info4" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
+ }
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
+ }
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_client_info4" "', argument " "4"" of type '" "svn_depth_t""'");
+ }
+ arg4 = (svn_depth_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_client_info4" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_client_info4" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_client_info4" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ {
+ arg8 = SvOK(ST(7)) ? svn_swig_pl_strings_to_array(
+ ST(7), _global_pool) : NULL;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_client_info4" "', argument " "9"" of type '" "svn_client_info_receiver2_t""'");
+ }
+ }
+ res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
+ if (!SWIG_IsOK(res10)) {
+ SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_client_info4" "', argument " "10"" of type '" "void *""'");
+ }
+ res11 = SWIG_ConvertPtr(ST(10), &argp11,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res11)) {
+ SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_client_info4" "', argument " "11"" of type '" "svn_client_ctx_t *""'");
+ }
+ arg11 = (svn_client_ctx_t *)(argp11);
+ if (items > 11) {
+
+ }
+ {
+ if (!arg2) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg3) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_info4((char const *)arg1,(struct svn_opt_revision_t const *)arg2,(struct svn_opt_revision_t const *)arg3,arg4,arg5,arg6,arg7,(apr_array_header_t const *)arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_client_info3) {
{
char *arg1 = (char *) 0 ;
@@ -30538,6 +32580,7 @@ XS(_wrap_svn_client_info3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_info3(abspath_or_url,peg_revision,revision,depth,fetch_excluded,fetch_actual_only,changelists,receiver,receiver_baton,ctx,scratch_pool);");
@@ -30548,10 +32591,18 @@ XS(_wrap_svn_client_info3) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -30569,7 +32620,7 @@ XS(_wrap_svn_client_info3) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = SvOK(ST(6)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg7 = SvOK(ST(6)) ? svn_swig_pl_strings_to_array(
ST(6), _global_pool) : NULL;
}
{
@@ -30678,6 +32729,7 @@ XS(_wrap_svn_client_info2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_info2(path_or_url,peg_revision,revision,receiver,receiver_baton,depth,changelists,ctx,pool);");
@@ -30688,10 +32740,18 @@ XS(_wrap_svn_client_info2) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
arg4 = svn_swig_pl_info_receiver;
@@ -30703,7 +32763,7 @@ XS(_wrap_svn_client_info2) {
}
arg6 = (svn_depth_t)(val6);
{
- arg7 = SvOK(ST(5)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg7 = SvOK(ST(5)) ? svn_swig_pl_strings_to_array(
ST(5), _global_pool) : NULL;
}
res8 = SWIG_ConvertPtr(ST(6), &argp8,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
@@ -30793,6 +32853,7 @@ XS(_wrap_svn_client_info) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_info(path_or_url,peg_revision,revision,receiver,receiver_baton,recurse,ctx,pool);");
@@ -30803,10 +32864,18 @@ XS(_wrap_svn_client_info) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
{
- arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_set_revision(&rev3, ST(2), TRUE, _global_pool);
}
{
arg4 = svn_swig_pl_info_receiver;
@@ -30896,9 +32965,11 @@ XS(_wrap_svn_client_get_wc_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -30992,6 +33063,7 @@ XS(_wrap_svn_client_min_max_revisions) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -31108,6 +33180,7 @@ XS(_wrap_svn_client_patch) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_client_patch(patch_abspath,wc_dir_abspath,dry_run,strip_count,reverse,ignore_whitespace,remove_tempfiles,patch_func,patch_baton,ctx,scratch_pool);");
@@ -31236,9 +33309,11 @@ XS(_wrap_svn_client_url_from_path2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31322,6 +33397,7 @@ XS(_wrap_svn_client_url_from_path) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -31399,9 +33475,11 @@ XS(_wrap_svn_client_get_repos_root) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -31498,6 +33576,7 @@ XS(_wrap_svn_client_root_url_from_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -31579,6 +33658,7 @@ XS(_wrap_svn_client_uuid_from_url) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -31661,9 +33741,11 @@ XS(_wrap_svn_client_uuid_from_path2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31753,6 +33835,7 @@ XS(_wrap_svn_client_uuid_from_path) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -31846,9 +33929,11 @@ XS(_wrap_svn_client_open_ra_session2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -31938,6 +34023,7 @@ XS(_wrap_svn_client_open_ra_session) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -32019,6 +34105,7 @@ XS(_wrap_svn_proplist_invoke_receiver2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_proplist_invoke_receiver2(_obj,baton,path,prop_hash,inherited_props,scratch_pool);");
@@ -32112,6 +34199,7 @@ XS(_wrap_svn_proplist_invoke_receiver) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_proplist_invoke_receiver(_obj,baton,path,prop_hash,pool);");
@@ -32198,6 +34286,7 @@ XS(_wrap_svn_client_invoke_get_commit_log3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -32297,6 +34386,7 @@ XS(_wrap_svn_client_invoke_get_commit_log2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -32396,6 +34486,7 @@ XS(_wrap_svn_client_invoke_get_commit_log) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -32520,6 +34611,7 @@ XS(_wrap_svn_client_invoke_blame_receiver3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_client_invoke_blame_receiver3(_obj,baton,start_revnum,end_revnum,line_no,revision,rev_props,merged_revision,merged_rev_props,merged_path,line,local_change,pool);");
@@ -32688,6 +34780,7 @@ XS(_wrap_svn_client_invoke_blame_receiver2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_client_invoke_blame_receiver2(_obj,baton,line_no,revision,author,date,merged_revision,merged_author,merged_date,merged_path,line,pool);");
@@ -32834,6 +34927,7 @@ XS(_wrap_svn_client_invoke_blame_receiver) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_client_invoke_blame_receiver(_obj,baton,line_no,revision,author,date,line,pool);");
@@ -32937,6 +35031,7 @@ XS(_wrap_svn_client_invoke_diff_summarize_func) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_client_invoke_diff_summarize_func(_obj,diff,baton,pool);");
@@ -33019,6 +35114,7 @@ XS(_wrap_svn_client_invoke_import_filter_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 4) || (items > 5)) {
@@ -33114,6 +35210,7 @@ XS(_wrap_svn_client_invoke_status_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_invoke_status_func(_obj,baton,path,status,scratch_pool);");
@@ -33215,6 +35312,7 @@ XS(_wrap_svn_client_invoke_list_func2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_client_invoke_list_func2(_obj,baton,path,dirent,lock,abs_path,external_parent_url,external_target,scratch_pool);");
@@ -33336,6 +35434,7 @@ XS(_wrap_svn_client_invoke_list_func) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_client_invoke_list_func(_obj,baton,path,dirent,lock,abs_path,pool);");
@@ -33436,6 +35535,7 @@ XS(_wrap_svn_info_invoke_receiver) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_info_invoke_receiver(_obj,baton,path,info,pool);");
@@ -33522,6 +35622,7 @@ XS(_wrap_svn_client_invoke_info_receiver2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_client_invoke_info_receiver2(_obj,baton,abspath_or_url,info,scratch_pool);");
@@ -33616,6 +35717,7 @@ XS(_wrap_svn_client_invoke_patch_func) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 5) || (items > 6)) {
@@ -33718,6 +35820,7 @@ static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "svn_auth_ssl_client_cert_prompt_func_t|struct svn_error_t *(*)(svn_auth_cred_ssl_client_cert_t **,void *,char const *,svn_boolean_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_ssl_server_trust_t **,void *,char const *,apr_uint32_t,svn_auth_ssl_server_cert_info_t const *,svn_boolean_t,apr_pool_t *)|svn_auth_ssl_server_trust_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_username_t **,void *,char const *,svn_boolean_t,apr_pool_t *)|svn_auth_username_prompt_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func2_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description2_t const *,void *,apr_pool_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_client_diff_summarize_func_t|struct svn_error_t *(*)(svn_client_diff_summarize_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -33726,6 +35829,7 @@ static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_e
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_client_blame_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_client_blame_receiver2_t|struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,svn_revnum_t,char const *,char const *,char const *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void = {"_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void", "void (*)(void *,char const *,enum svn_wc_notify_action_t,enum svn_node_kind_t,char const *,enum svn_wc_notify_state_t,enum svn_wc_notify_state_t,long)|svn_wc_notify_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_array_header_t *,apr_pool_t *)|svn_proplist_receiver2_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_pool_t *)|svn_proplist_receiver_t", 0, 0, (void*)0, 0};
@@ -33843,11 +35947,9 @@ static swig_type_info _swigt__p_svn_wc_adm_access_t = {"_p_svn_wc_adm_access_t",
static swig_type_info _swigt__p_svn_wc_committed_queue_t = {"_p_svn_wc_committed_queue_t", "struct svn_wc_committed_queue_t *|svn_wc_committed_queue_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_action_t = {"_p_svn_wc_conflict_action_t", "enum svn_wc_conflict_action_t *|svn_wc_conflict_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_choice_t = {"_p_svn_wc_conflict_choice_t", "enum svn_wc_conflict_choice_t *|svn_wc_conflict_choice_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_description2_t = {"_p_svn_wc_conflict_description2_t", "struct svn_wc_conflict_description2_t *|svn_wc_conflict_description2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_description_t = {"_p_svn_wc_conflict_description_t", "struct svn_wc_conflict_description_t *|svn_wc_conflict_description_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_kind_t = {"_p_svn_wc_conflict_kind_t", "enum svn_wc_conflict_kind_t *|svn_wc_conflict_kind_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_reason_t = {"_p_svn_wc_conflict_reason_t", "enum svn_wc_conflict_reason_t *|svn_wc_conflict_reason_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_result_t = {"_p_svn_wc_conflict_result_t", "struct svn_wc_conflict_result_t *|svn_wc_conflict_result_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_version_t = {"_p_svn_wc_conflict_version_t", "struct svn_wc_conflict_version_t *|svn_wc_conflict_version_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_context_t = {"_p_svn_wc_context_t", "struct svn_wc_context_t *|svn_wc_context_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_diff_callbacks2_t = {"_p_svn_wc_diff_callbacks2_t", "struct svn_wc_diff_callbacks2_t *|svn_wc_diff_callbacks2_t *", 0, 0, (void*)0, 0};
@@ -33893,6 +35995,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -33901,6 +36004,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -34018,11 +36122,9 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_wc_committed_queue_t,
&_swigt__p_svn_wc_conflict_action_t,
&_swigt__p_svn_wc_conflict_choice_t,
- &_swigt__p_svn_wc_conflict_description2_t,
&_swigt__p_svn_wc_conflict_description_t,
&_swigt__p_svn_wc_conflict_kind_t,
&_swigt__p_svn_wc_conflict_reason_t,
- &_swigt__p_svn_wc_conflict_result_t,
&_swigt__p_svn_wc_conflict_version_t,
&_swigt__p_svn_wc_context_t,
&_swigt__p_svn_wc_diff_callbacks2_t,
@@ -34068,6 +36170,7 @@ static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34076,6 +36179,7 @@ static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_v
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void[] = { {&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34193,11 +36297,9 @@ static swig_cast_info _swigc__p_svn_wc_adm_access_t[] = { {&_swigt__p_svn_wc_ad
static swig_cast_info _swigc__p_svn_wc_committed_queue_t[] = { {&_swigt__p_svn_wc_committed_queue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_action_t[] = { {&_swigt__p_svn_wc_conflict_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_choice_t[] = { {&_swigt__p_svn_wc_conflict_choice_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_description2_t[] = { {&_swigt__p_svn_wc_conflict_description2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_description_t[] = { {&_swigt__p_svn_wc_conflict_description_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_kind_t[] = { {&_swigt__p_svn_wc_conflict_kind_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_reason_t[] = { {&_swigt__p_svn_wc_conflict_reason_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_result_t[] = { {&_swigt__p_svn_wc_conflict_result_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_version_t[] = { {&_swigt__p_svn_wc_conflict_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_context_t[] = { {&_swigt__p_svn_wc_context_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_diff_callbacks2_t[] = { {&_swigt__p_svn_wc_diff_callbacks2_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34243,6 +36345,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -34251,6 +36354,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -34368,11 +36472,9 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_wc_committed_queue_t,
_swigc__p_svn_wc_conflict_action_t,
_swigc__p_svn_wc_conflict_choice_t,
- _swigc__p_svn_wc_conflict_description2_t,
_swigc__p_svn_wc_conflict_description_t,
_swigc__p_svn_wc_conflict_kind_t,
_swigc__p_svn_wc_conflict_reason_t,
- _swigc__p_svn_wc_conflict_result_t,
_swigc__p_svn_wc_conflict_version_t,
_swigc__p_svn_wc_context_t,
_swigc__p_svn_wc_diff_callbacks2_t,
@@ -34559,6 +36661,12 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::svn_client_ctx_t_conflict_baton2_get", _wrap_svn_client_ctx_t_conflict_baton2_get},
{"SVN::_Client::svn_client_ctx_t_wc_ctx_set", _wrap_svn_client_ctx_t_wc_ctx_set},
{"SVN::_Client::svn_client_ctx_t_wc_ctx_get", _wrap_svn_client_ctx_t_wc_ctx_get},
+{"SVN::_Client::svn_client_ctx_t_check_tunnel_func_set", _wrap_svn_client_ctx_t_check_tunnel_func_set},
+{"SVN::_Client::svn_client_ctx_t_check_tunnel_func_get", _wrap_svn_client_ctx_t_check_tunnel_func_get},
+{"SVN::_Client::svn_client_ctx_t_open_tunnel_func_set", _wrap_svn_client_ctx_t_open_tunnel_func_set},
+{"SVN::_Client::svn_client_ctx_t_open_tunnel_func_get", _wrap_svn_client_ctx_t_open_tunnel_func_get},
+{"SVN::_Client::svn_client_ctx_t_tunnel_baton_set", _wrap_svn_client_ctx_t_tunnel_baton_set},
+{"SVN::_Client::svn_client_ctx_t_tunnel_baton_get", _wrap_svn_client_ctx_t_tunnel_baton_get},
{"SVN::_Client::new_svn_client_ctx_t", _wrap_new_svn_client_ctx_t},
{"SVN::_Client::delete_svn_client_ctx_t", _wrap_delete_svn_client_ctx_t},
{"SVN::_Client::svn_client_create_context2", _wrap_svn_client_create_context2},
@@ -34668,6 +36776,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::new_svn_client_status_t", _wrap_new_svn_client_status_t},
{"SVN::_Client::delete_svn_client_status_t", _wrap_delete_svn_client_status_t},
{"SVN::_Client::svn_client_status_dup", _wrap_svn_client_status_dup},
+{"SVN::_Client::svn_client_status6", _wrap_svn_client_status6},
{"SVN::_Client::svn_client_status5", _wrap_svn_client_status5},
{"SVN::_Client::svn_client_status4", _wrap_svn_client_status4},
{"SVN::_Client::svn_client_status3", _wrap_svn_client_status3},
@@ -34717,10 +36826,13 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::svn_client_mergeinfo_log", _wrap_svn_client_mergeinfo_log},
{"SVN::_Client::svn_client_mergeinfo_log_merged", _wrap_svn_client_mergeinfo_log_merged},
{"SVN::_Client::svn_client_mergeinfo_log_eligible", _wrap_svn_client_mergeinfo_log_eligible},
+{"SVN::_Client::svn_client_vacuum", _wrap_svn_client_vacuum},
+{"SVN::_Client::svn_client_cleanup2", _wrap_svn_client_cleanup2},
{"SVN::_Client::svn_client_cleanup", _wrap_svn_client_cleanup},
{"SVN::_Client::svn_client_upgrade", _wrap_svn_client_upgrade},
{"SVN::_Client::svn_client_relocate2", _wrap_svn_client_relocate2},
{"SVN::_Client::svn_client_relocate", _wrap_svn_client_relocate},
+{"SVN::_Client::svn_client_revert3", _wrap_svn_client_revert3},
{"SVN::_Client::svn_client_revert2", _wrap_svn_client_revert2},
{"SVN::_Client::svn_client_revert", _wrap_svn_client_revert},
{"SVN::_Client::svn_client_resolved", _wrap_svn_client_resolved},
@@ -34733,6 +36845,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::svn_client_copy_source_t_peg_revision_get", _wrap_svn_client_copy_source_t_peg_revision_get},
{"SVN::_Client::new_svn_client_copy_source_t", _wrap_new_svn_client_copy_source_t},
{"SVN::_Client::delete_svn_client_copy_source_t", _wrap_delete_svn_client_copy_source_t},
+{"SVN::_Client::svn_client_copy7", _wrap_svn_client_copy7},
{"SVN::_Client::svn_client_copy6", _wrap_svn_client_copy6},
{"SVN::_Client::svn_client_copy5", _wrap_svn_client_copy5},
{"SVN::_Client::svn_client_copy4", _wrap_svn_client_copy4},
@@ -34775,6 +36888,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::svn_client_ls3", _wrap_svn_client_ls3},
{"SVN::_Client::svn_client_ls2", _wrap_svn_client_ls2},
{"SVN::_Client::svn_client_ls", _wrap_svn_client_ls},
+{"SVN::_Client::svn_client_cat3", _wrap_svn_client_cat3},
{"SVN::_Client::svn_client_cat2", _wrap_svn_client_cat2},
{"SVN::_Client::svn_client_cat", _wrap_svn_client_cat},
{"SVN::_Client::svn_client_add_to_changelist", _wrap_svn_client_add_to_changelist},
@@ -34864,6 +36978,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Client::new_svn_client_info2_t", _wrap_new_svn_client_info2_t},
{"SVN::_Client::delete_svn_client_info2_t", _wrap_delete_svn_client_info2_t},
{"SVN::_Client::svn_client_info2_dup", _wrap_svn_client_info2_dup},
+{"SVN::_Client::svn_client_info4", _wrap_svn_client_info4},
{"SVN::_Client::svn_client_info3", _wrap_svn_client_info3},
{"SVN::_Client::svn_client_info2", _wrap_svn_client_info2},
{"SVN::_Client::svn_client_info", _wrap_svn_client_info},
@@ -34899,18 +37014,18 @@ static swig_command_info swig_commands[] = {
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -34920,17 +37035,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -34993,7 +37108,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -35192,72 +37307,72 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_ADD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x01)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_DELETE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x02)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_TEXT_MODS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x04)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_PROP_MODS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x08)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_IS_COPY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x10)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x20)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_COMMIT_ITEM_MOVED_HERE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x40)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_client_diff_summarize_kind_normal", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_client_diff_summarize_kind_normal)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_client_diff_summarize_kind_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_client_diff_summarize_kind_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_client_diff_summarize_kind_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_client_diff_summarize_kind_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_client_diff_summarize_kind_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_client_diff_summarize_kind_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_AUTH_USERNAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("username"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_CLIENT_AUTH_PASSWORD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("password"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SWIG_SVN_INFO_SIZE_UNKNOWN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_unsigned_SS_long SWIG_PERL_CALL_ARGS_1((unsigned long)(-1)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/svn_delta.c b/subversion/bindings/swig/perl/native/svn_delta.c
index 9bbeabf..2dea9c9 100644
--- a/subversion/bindings/swig/perl/native/svn_delta.c
+++ b/subversion/bindings/swig/perl/native/svn_delta.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1608,7 +1597,7 @@ static swig_module_info swig_module = {swig_types, 103, 0, 0, 0, 0};
#define SWIG_name "SVN::_Delta::boot_SVN___Delta"
#define SWIG_prefix "SVN::_Delta::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2122,58 +2111,6 @@ SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SW
#ifdef __cplusplus
extern "C" {
#endif
-XS(_wrap_svn_delta_wrap_window_handler) {
- {
- svn_txdelta_window_handler_t *arg1 = (svn_txdelta_window_handler_t *) 0 ;
- void **arg2 = (void **) 0 ;
- SV *arg3 = (SV *) 0 ;
- apr_pool_t *arg4 = (apr_pool_t *) 0 ;
- apr_pool_t *_global_pool ;
- svn_txdelta_window_handler_t temp1 ;
- void *temp2 ;
- int argvi = 0;
- dXSARGS;
-
- {
- _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
- }
- arg1 = &temp1;
- arg2 = &temp2;
- if ((items < 1) || (items > 2)) {
- SWIG_croak("Usage: svn_delta_wrap_window_handler(callback,pool);");
- }
- arg3 = ST(0);
- if (items > 1) {
-
- }
- {
- svn_delta_wrap_window_handler(arg1,arg2,arg3,arg4);
-
-
-
- }
- ST(argvi) = sv_newmortal();
- {
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0); argvi++ ;
- }
- {
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0); argvi++ ;
- }
-
-
-
-
- XSRETURN(argvi);
- fail:
-
-
-
-
- SWIG_croak_null();
- }
-}
-
-
XS(_wrap_svn_delta_version) {
{
int argvi = 0;
@@ -2503,10 +2440,9 @@ XS(_wrap_svn_txdelta_window_t_sview_offset_get) {
arg1 = (struct svn_txdelta_window_t *)(argp1);
result = ((arg1)->sview_offset);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -2941,6 +2877,7 @@ XS(_wrap_svn_txdelta_window_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_txdelta_window_dup(window,pool);");
@@ -2987,6 +2924,7 @@ XS(_wrap_svn_txdelta_compose_windows) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_txdelta_compose_windows(window_A,window_B,pool);");
@@ -3107,26 +3045,29 @@ XS(_wrap_svn_txdelta_run) {
int val5 ;
int ecode5 = 0 ;
svn_checksum_t *temp6 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
- if ((items < 7) || (items > 9)) {
+ if ((items < 6) || (items > 8)) {
SWIG_croak("Usage: svn_txdelta_run(source,target,handler,handler_baton,checksum_kind,cancel_func,cancel_baton,result_pool,scratch_pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t);
@@ -3144,19 +3085,13 @@ XS(_wrap_svn_txdelta_run) {
}
arg5 = (svn_checksum_kind_t)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_txdelta_run" "', argument " "7"" of type '" "svn_cancel_func_t""'");
- }
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(5);
}
- res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_txdelta_run" "', argument " "8"" of type '" "void *""'");
- }
- if (items > 7) {
+ if (items > 6) {
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -3198,8 +3133,6 @@ XS(_wrap_svn_txdelta_run) {
-
-
XSRETURN(argvi);
fail:
@@ -3210,8 +3143,6 @@ XS(_wrap_svn_txdelta_run) {
-
-
SWIG_croak_null();
}
}
@@ -3231,6 +3162,7 @@ XS(_wrap_svn_txdelta_stream_create) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_txdelta_stream_create(baton,next_window,md5_digest,pool);");
@@ -3291,6 +3223,7 @@ XS(_wrap_svn_txdelta_next_window) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -3391,6 +3324,7 @@ XS(_wrap_svn_txdelta2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -3398,9 +3332,11 @@ XS(_wrap_svn_txdelta2) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -3450,6 +3386,7 @@ XS(_wrap_svn_txdelta) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -3457,9 +3394,11 @@ XS(_wrap_svn_txdelta) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -3503,6 +3442,7 @@ XS(_wrap_svn_txdelta_target_push) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_txdelta_target_push(handler,handler_baton,source,pool);");
@@ -3519,6 +3459,7 @@ XS(_wrap_svn_txdelta_target_push) {
}
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
if (items > 3) {
@@ -3530,7 +3471,11 @@ XS(_wrap_svn_txdelta_target_push) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -3563,6 +3508,7 @@ XS(_wrap_svn_txdelta_send_string) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_txdelta_send_string(string,handler,handler_baton,pool);");
@@ -3642,6 +3588,7 @@ XS(_wrap_svn_txdelta_send_stream) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = temp4;
if ((items < 3) || (items > 4)) {
@@ -3649,6 +3596,7 @@ XS(_wrap_svn_txdelta_send_stream) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t);
@@ -3686,7 +3634,7 @@ XS(_wrap_svn_txdelta_send_stream) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg4,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg4,
_global_pool),
0)); argvi++ /*@SWIG@*/
@@ -3727,6 +3675,7 @@ XS(_wrap_svn_txdelta_send_txstream) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_txdelta_send_txstream(txstream,handler,handler_baton,pool);");
@@ -3805,6 +3754,7 @@ XS(_wrap_svn_txdelta_send_contents) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_txdelta_send_contents(contents,len,handler,handler_baton,pool);");
@@ -3891,6 +3841,7 @@ XS(_wrap_svn_txdelta_apply) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
arg3 = (unsigned char *)apr_palloc(_global_pool, APR_MD5_DIGESTSIZE);
@@ -3902,9 +3853,11 @@ XS(_wrap_svn_txdelta_apply) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
if (!SWIG_IsOK(res4)) {
@@ -3922,11 +3875,11 @@ XS(_wrap_svn_txdelta_apply) {
}
ST(argvi) = sv_newmortal();
{
- /* FIXME: This code is clearly buggy. The return value of sv_newmortal()
- is immediately overwritten by the return value
- of svn_swig_pl_from_md5(). */
- ST(argvi) = sv_newmortal();
- ST(argvi++) = svn_swig_pl_from_md5(arg3);
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_md5(arg3);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
{
if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg6, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0); argvi++ ;
@@ -3975,6 +3928,7 @@ XS(_wrap_svn_txdelta_to_svndiff3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -3983,6 +3937,7 @@ XS(_wrap_svn_txdelta_to_svndiff3) {
}
{
svn_swig_pl_make_stream (&arg3, ST(0));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -4046,6 +4001,7 @@ XS(_wrap_svn_txdelta_to_svndiff2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -4054,6 +4010,7 @@ XS(_wrap_svn_txdelta_to_svndiff2) {
}
{
svn_swig_pl_make_stream (&arg3, ST(0));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -4107,6 +4064,7 @@ XS(_wrap_svn_txdelta_to_svndiff) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -4115,6 +4073,7 @@ XS(_wrap_svn_txdelta_to_svndiff) {
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
if (items > 1) {
@@ -4163,6 +4122,7 @@ XS(_wrap_svn_txdelta_parse_svndiff) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_txdelta_parse_svndiff(handler,handler_baton,error_on_early_close,pool);");
@@ -4192,7 +4152,11 @@ XS(_wrap_svn_txdelta_parse_svndiff) {
}
{
- ST(argvi) = svn_swig_pl_from_stream (result);
+ SV* tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream (result);
+ SPAGAIN;
+ ST(argvi) = tmp;
argvi++;
}
@@ -4226,6 +4190,7 @@ XS(_wrap_svn_txdelta_read_svndiff_window) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4233,6 +4198,7 @@ XS(_wrap_svn_txdelta_read_svndiff_window) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -4296,6 +4262,7 @@ XS(_wrap_svn_txdelta_skip_svndiff_window) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_txdelta_skip_svndiff_window(file,svndiff_version,pool);");
@@ -5435,6 +5402,7 @@ XS(_wrap_svn_delta_default_editor) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_delta_default_editor(pool);");
@@ -5524,7 +5492,6 @@ XS(_wrap_svn_delta_get_cancellation_editor) {
void **arg6 = (void **) 0 ;
apr_pool_t *arg7 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
- int res2 ;
void *argp3 = 0 ;
int res3 = 0 ;
int res4 ;
@@ -5536,32 +5503,27 @@ XS(_wrap_svn_delta_get_cancellation_editor) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
arg6 = &temp6;
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_delta_get_cancellation_editor(cancel_func,cancel_baton,wrapped_editor,wrapped_baton,pool);");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_delta_get_cancellation_editor" "', argument " "1"" of type '" "svn_cancel_func_t""'");
- }
- }
- res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_delta_get_cancellation_editor" "', argument " "2"" of type '" "void *""'");
+ arg1 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg2 = ST(0);
}
- res3 = SWIG_ConvertPtr(ST(2), &argp3,SWIGTYPE_p_svn_delta_editor_t, 0 | 0 );
+ res3 = SWIG_ConvertPtr(ST(1), &argp3,SWIGTYPE_p_svn_delta_editor_t, 0 | 0 );
if (!SWIG_IsOK(res3)) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_delta_get_cancellation_editor" "', argument " "3"" of type '" "svn_delta_editor_t const *""'");
}
arg3 = (svn_delta_editor_t *)(argp3);
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
+ res4 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg4), 0, 0);
if (!SWIG_IsOK(res4)) {
SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_delta_get_cancellation_editor" "', argument " "4"" of type '" "void *""'");
}
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -5597,8 +5559,6 @@ XS(_wrap_svn_delta_get_cancellation_editor) {
-
-
XSRETURN(argvi);
fail:
@@ -5606,8 +5566,6 @@ XS(_wrap_svn_delta_get_cancellation_editor) {
-
-
SWIG_croak_null();
}
}
@@ -5638,6 +5596,7 @@ XS(_wrap_svn_delta_depth_filter_editor) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -5734,15 +5693,16 @@ XS(_wrap_svn_delta_path_driver2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_delta_path_driver2(editor,edit_baton,paths,sort_paths,callback_func,callback_baton,scratch_pool);");
}
{
- svn_delta_make_editor(&arg1, &arg2, ST(0), _global_pool);
+ svn_swig_pl_make_editor(&arg1, &arg2, ST(0), _global_pool);
}
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg3 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
@@ -5821,12 +5781,13 @@ XS(_wrap_svn_delta_path_driver) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_delta_path_driver(editor,edit_baton,revision,paths,callback_func,callback_baton,scratch_pool);");
}
{
- svn_delta_make_editor(&arg1, &arg2, ST(0), _global_pool);
+ svn_swig_pl_make_editor(&arg1, &arg2, ST(0), _global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -5834,7 +5795,7 @@ XS(_wrap_svn_delta_path_driver) {
}
arg3 = (svn_revnum_t)(val3);
{
- arg4 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(2),
+ arg4 = svn_swig_pl_strings_to_array(ST(2),
_global_pool);
}
{
@@ -5905,6 +5866,7 @@ XS(_wrap_svn_compat_wrap_file_rev_handler) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -5984,6 +5946,7 @@ XS(_wrap_svn_delta_editor_invoke_set_target_revision) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_delta_editor_invoke_set_target_revision(_obj,edit_baton,target_revision,scratch_pool);");
@@ -6062,6 +6025,7 @@ XS(_wrap_svn_delta_editor_invoke_open_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 3) || (items > 4)) {
@@ -6148,6 +6112,7 @@ XS(_wrap_svn_delta_editor_invoke_delete_entry) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_delta_editor_invoke_delete_entry(_obj,path,revision,parent_baton,scratch_pool);");
@@ -6241,6 +6206,7 @@ XS(_wrap_svn_delta_editor_invoke_add_directory) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg7 = &temp7;
if ((items < 5) || (items > 6)) {
@@ -6343,6 +6309,7 @@ XS(_wrap_svn_delta_editor_invoke_open_directory) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 4) || (items > 5)) {
@@ -6435,6 +6402,7 @@ XS(_wrap_svn_delta_editor_invoke_change_dir_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_delta_editor_invoke_change_dir_prop(_obj,dir_baton,name,value,scratch_pool);");
@@ -6519,6 +6487,7 @@ XS(_wrap_svn_delta_editor_invoke_close_directory) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_delta_editor_invoke_close_directory(_obj,dir_baton,scratch_pool);");
@@ -6589,6 +6558,7 @@ XS(_wrap_svn_delta_editor_invoke_absent_directory) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_delta_editor_invoke_absent_directory(_obj,path,parent_baton,scratch_pool);");
@@ -6675,6 +6645,7 @@ XS(_wrap_svn_delta_editor_invoke_add_file) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg7 = &temp7;
if ((items < 5) || (items > 6)) {
@@ -6777,6 +6748,7 @@ XS(_wrap_svn_delta_editor_invoke_open_file) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 4) || (items > 5)) {
@@ -6871,6 +6843,7 @@ XS(_wrap_svn_delta_editor_invoke_apply_textdelta) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
arg6 = &temp6;
@@ -6962,6 +6935,7 @@ XS(_wrap_svn_delta_editor_invoke_change_file_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_delta_editor_invoke_change_file_prop(_obj,file_baton,name,value,scratch_pool);");
@@ -7050,6 +7024,7 @@ XS(_wrap_svn_delta_editor_invoke_close_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_delta_editor_invoke_close_file(_obj,file_baton,text_checksum,scratch_pool);");
@@ -7127,6 +7102,7 @@ XS(_wrap_svn_delta_editor_invoke_absent_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_delta_editor_invoke_absent_file(_obj,path,parent_baton,scratch_pool);");
@@ -7200,6 +7176,7 @@ XS(_wrap_svn_delta_editor_invoke_close_edit) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_delta_editor_invoke_close_edit(_obj,edit_baton,scratch_pool);");
@@ -7266,6 +7243,7 @@ XS(_wrap_svn_delta_editor_invoke_abort_edit) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_delta_editor_invoke_abort_edit(_obj,edit_baton,scratch_pool);");
@@ -7397,6 +7375,7 @@ XS(_wrap_svn_txdelta_invoke_next_window_fn) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -7516,6 +7495,7 @@ XS(_wrap_svn_delta_invoke_path_driver_cb_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -7620,6 +7600,7 @@ XS(_wrap_svn_file_invoke_rev_handler) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg7 = &temp7;
arg8 = &temp8;
@@ -7749,6 +7730,7 @@ XS(_wrap_svn_file_invoke_rev_handler_old) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
arg7 = &temp7;
@@ -8277,7 +8259,6 @@ static swig_variable_info swig_variables[] = {
{0,0,0,0}
};
static swig_command_info swig_commands[] = {
-{"SVN::_Delta::svn_delta_wrap_window_handler", _wrap_svn_delta_wrap_window_handler},
{"SVN::_Delta::svn_delta_version", _wrap_svn_delta_version},
{"SVN::_Delta::svn_txdelta_op_t_action_code_set", _wrap_svn_txdelta_op_t_action_code_set},
{"SVN::_Delta::svn_txdelta_op_t_action_code_get", _wrap_svn_txdelta_op_t_action_code_get},
@@ -8390,18 +8371,18 @@ static swig_command_info swig_commands[] = {
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -8411,17 +8392,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -8484,7 +8465,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -8683,32 +8664,32 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DELTA_COMPRESSION_LEVEL_NONE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DELTA_COMPRESSION_LEVEL_MAX", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(9)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_DELTA_COMPRESSION_LEVEL_DEFAULT", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(5)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_txdelta_source", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_txdelta_source)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_txdelta_target", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_txdelta_target)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_txdelta_new", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_txdelta_new)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/svn_diff.c b/subversion/bindings/swig/perl/native/svn_diff.c
index 0e75a59..24bfd01 100644
--- a/subversion/bindings/swig/perl/native/svn_diff.c
+++ b/subversion/bindings/swig/perl/native/svn_diff.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1574,7 +1563,7 @@ static swig_module_info swig_module = {swig_types, 69, 0, 0, 0, 0};
#define SWIG_name "SVN::_Diff::boot_SVN___Diff"
#define SWIG_prefix "SVN::_Diff::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -1935,18 +1924,18 @@ static swig_command_info swig_commands[] = {
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -1956,17 +1945,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -2029,7 +2018,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
diff --git a/subversion/bindings/swig/perl/native/svn_fs.c b/subversion/bindings/swig/perl/native/svn_fs.c
index 0c456c6..634bfc2 100644
--- a/subversion/bindings/swig/perl/native/svn_fs.c
+++ b/subversion/bindings/swig/perl/native/svn_fs.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1505,108 +1494,119 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[9]
#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[10]
#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[13]
-#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[14]
-#define SWIGTYPE_p_int swig_types[15]
-#define SWIGTYPE_p_long swig_types[16]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[17]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[18]
-#define SWIGTYPE_p_p_char swig_types[19]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[21]
-#define SWIGTYPE_p_p_svn_fs_access_t swig_types[22]
-#define SWIGTYPE_p_p_svn_fs_history_t swig_types[23]
-#define SWIGTYPE_p_p_svn_fs_id_t swig_types[24]
-#define SWIGTYPE_p_p_svn_fs_root_t swig_types[25]
-#define SWIGTYPE_p_p_svn_fs_t swig_types[26]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[27]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[28]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[29]
-#define SWIGTYPE_p_p_svn_string_t swig_types[30]
-#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[31]
-#define SWIGTYPE_p_p_void swig_types[32]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[33]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[34]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[35]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[36]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[37]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[38]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[39]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[40]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[41]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[42]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[43]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[44]
-#define SWIGTYPE_p_svn_checksum_t swig_types[45]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[46]
-#define SWIGTYPE_p_svn_config_t swig_types[47]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[48]
-#define SWIGTYPE_p_svn_depth_t swig_types[49]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[50]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[51]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[52]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[53]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[54]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[55]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[56]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[57]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[58]
-#define SWIGTYPE_p_svn_diff_t swig_types[59]
-#define SWIGTYPE_p_svn_dirent_t swig_types[60]
-#define SWIGTYPE_p_svn_errno_t swig_types[61]
-#define SWIGTYPE_p_svn_error_t swig_types[62]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[63]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[64]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[65]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[66]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[67]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[68]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[69]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[70]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[71]
-#define SWIGTYPE_p_svn_fs_t swig_types[72]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[73]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[74]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[75]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[76]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[77]
-#define SWIGTYPE_p_svn_lock_t swig_types[78]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[79]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[80]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[81]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[82]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[83]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[84]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[85]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[86]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[87]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[88]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[89]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[90]
-#define SWIGTYPE_p_svn_patch_t swig_types[91]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[92]
-#define SWIGTYPE_p_svn_prop_kind swig_types[93]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[94]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[95]
-#define SWIGTYPE_p_svn_stream_t swig_types[96]
-#define SWIGTYPE_p_svn_string_t swig_types[97]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[98]
-#define SWIGTYPE_p_svn_tristate_t swig_types[99]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[100]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[101]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[102]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[103]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[104]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[105]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[106]
-#define SWIGTYPE_p_svn_version_t swig_types[107]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[108]
-#define SWIGTYPE_p_unsigned_char swig_types[109]
-#define SWIGTYPE_p_unsigned_long swig_types[110]
-#define SWIGTYPE_p_void swig_types[111]
-static swig_type_info *swig_types[113];
-static swig_module_info swig_module = {swig_types, 112, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void swig_types[13]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[16]
+#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_int swig_types[18]
+#define SWIGTYPE_p_long swig_types[19]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[20]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[21]
+#define SWIGTYPE_p_p_char swig_types[22]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[24]
+#define SWIGTYPE_p_p_svn_fs_access_t swig_types[25]
+#define SWIGTYPE_p_p_svn_fs_history_t swig_types[26]
+#define SWIGTYPE_p_p_svn_fs_id_t swig_types[27]
+#define SWIGTYPE_p_p_svn_fs_info_placeholder_t swig_types[28]
+#define SWIGTYPE_p_p_svn_fs_root_t swig_types[29]
+#define SWIGTYPE_p_p_svn_fs_t swig_types[30]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[31]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[32]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[33]
+#define SWIGTYPE_p_p_svn_string_t swig_types[34]
+#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[35]
+#define SWIGTYPE_p_p_svn_version_t swig_types[36]
+#define SWIGTYPE_p_p_void swig_types[37]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[38]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[39]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[40]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[41]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[42]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[43]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[44]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[45]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[46]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[47]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[48]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[49]
+#define SWIGTYPE_p_svn_checksum_t swig_types[50]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[51]
+#define SWIGTYPE_p_svn_config_t swig_types[52]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[53]
+#define SWIGTYPE_p_svn_depth_t swig_types[54]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[55]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[56]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[57]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[58]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[59]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[60]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[61]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[62]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[63]
+#define SWIGTYPE_p_svn_diff_t swig_types[64]
+#define SWIGTYPE_p_svn_dirent_t swig_types[65]
+#define SWIGTYPE_p_svn_errno_t swig_types[66]
+#define SWIGTYPE_p_svn_error_t swig_types[67]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[68]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[69]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[70]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[71]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[72]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[73]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[74]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[75]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[76]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[77]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[78]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[79]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[84]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[85]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[86]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[87]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[88]
+#define SWIGTYPE_p_svn_lock_t swig_types[89]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[90]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[91]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[92]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[93]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[94]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[95]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[96]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[97]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[98]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[99]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[100]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[101]
+#define SWIGTYPE_p_svn_patch_t swig_types[102]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[103]
+#define SWIGTYPE_p_svn_prop_kind swig_types[104]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[105]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[106]
+#define SWIGTYPE_p_svn_stream_t swig_types[107]
+#define SWIGTYPE_p_svn_string_t swig_types[108]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[109]
+#define SWIGTYPE_p_svn_tristate_t swig_types[110]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[111]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[112]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[113]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[114]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[115]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[116]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[117]
+#define SWIGTYPE_p_svn_version_t swig_types[118]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[119]
+#define SWIGTYPE_p_unsigned_char swig_types[120]
+#define SWIGTYPE_p_unsigned_long swig_types[121]
+#define SWIGTYPE_p_void swig_types[122]
+static swig_type_info *swig_types[124];
+static swig_module_info swig_module = {swig_types, 123, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1617,7 +1617,7 @@ static swig_module_info swig_module = {swig_types, 112, 0, 0, 0, 0};
#define SWIG_name "SVN::_Fs::boot_SVN___Fs"
#define SWIG_prefix "SVN::_Fs::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -1729,6 +1729,25 @@ SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc)
+SWIGINTERNINLINE SV *
+SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value)
+{
+ SV *sv;
+ if (value >= IV_MIN && value <= IV_MAX)
+ sv = newSViv(value);
+ else
+ sv = newSVpvf("%ld", value);
+ return sv_2mortal(sv);
+}
+
+
+SWIGINTERNINLINE SV *
+SWIG_From_int SWIG_PERL_DECL_ARGS_1(int value)
+{
+ return SWIG_From_long SWIG_PERL_CALL_ARGS_1(value);
+}
+
+
#include <limits.h>
#if !defined(SWIG_NO_LLONG_MAX)
# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
@@ -1870,25 +1889,6 @@ SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val)
}
-SWIGINTERNINLINE SV *
-SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value)
-{
- SV *sv;
- if (value >= IV_MIN && value <= IV_MAX)
- sv = newSViv(value);
- else
- sv = newSVpvf("%ld", value);
- return sv_2mortal(sv);
-}
-
-
-SWIGINTERNINLINE SV *
-SWIG_From_int SWIG_PERL_DECL_ARGS_1(int value)
-{
- return SWIG_From_long SWIG_PERL_CALL_ARGS_1(value);
-}
-
-
SWIGINTERN int
SWIG_AsVal_unsigned_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, unsigned long *val)
{
@@ -2004,11 +2004,21 @@ static void svn_fs_invoke_warning_callback(
_obj(baton, err);
}
+static svn_error_t * svn_fs_invoke_upgrade_notify(
+ svn_fs_upgrade_notify_t _obj, void *baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action, apr_pool_t *scratch_pool) {
+ return _obj(baton, number, action, scratch_pool);
+}
+
static void svn_fs_invoke_progress_notify_func(
svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void *baton, apr_pool_t *pool) {
_obj(revision, baton, pool);
}
+static void svn_fs_invoke_hotcopy_notify(
+ svn_fs_hotcopy_notify_t _obj, void *baton, svn_revnum_t start_revision, svn_revnum_t end_revision, apr_pool_t *scratch_pool) {
+ _obj(baton, start_revision, end_revision, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_freeze_func(
svn_fs_freeze_func_t _obj, void *baton, apr_pool_t *pool) {
return _obj(baton, pool);
@@ -2019,6 +2029,11 @@ static svn_error_t * svn_fs_invoke_process_contents_func(
return _obj(contents, len, baton, scratch_pool);
}
+static svn_error_t * svn_fs_invoke_lock_callback(
+ svn_fs_lock_callback_t _obj, void *baton, const char *path, const svn_lock_t *lock, svn_error_t *fs_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, path, lock, fs_err, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_get_locks_callback(
svn_fs_get_locks_callback_t _obj, void *baton, svn_lock_t *lock, apr_pool_t *pool) {
return _obj(baton, lock, pool);
@@ -2030,6 +2045,52 @@ static svn_error_t * svn_fs_invoke_pack_notify(
}
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, unsigned long long *val)
+{
+ if (SvUOK(obj)) {
+ if (val) *val = SvUV(obj);
+ return SWIG_OK;
+ } else if (SvIOK(obj)) {
+ IV v = SvIV(obj);
+ if (v >= 0 && v <= ULLONG_MAX) {
+ if (val) *val = v;
+ return SWIG_OK;
+ } else {
+ return SWIG_OverflowError;
+ }
+ } else {
+ int dispatch = 0;
+ const char *nptr = SvPV_nolen(obj);
+ if (nptr) {
+ char *endptr;
+ unsigned long long v;
+ errno = 0;
+ v = strtoull(nptr, &endptr,0);
+ if (errno == ERANGE) {
+ errno = 0;
+ return SWIG_OverflowError;
+ } else {
+ if (*endptr == '\0') {
+ if (val) *val = v;
+ return SWIG_Str2NumCast(SWIG_OK);
+ }
+ }
+ }
+ if (!dispatch) {
+ const double mant_max = 1LL << DBL_MANT_DIG;
+ double d;
+ int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d));
+ if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
+ if (val) *val = (unsigned long long)(d);
+ return res;
+ }
+ }
+ }
+ return SWIG_TypeError;
+}
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -2092,6 +2153,7 @@ XS(_wrap_svn_fs_initialize) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_fs_initialize(pool);");
@@ -2147,6 +2209,7 @@ XS(_wrap_svn_fs_create) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2204,6 +2267,91 @@ XS(_wrap_svn_fs_create) {
}
+XS(_wrap_svn_fs_open2) {
+ {
+ svn_fs_t **arg1 = (svn_fs_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_fs_t *temp1 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 4)) {
+ SWIG_croak("Usage: svn_fs_open2(path,fs_config,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_AsCharPtrAndSize(ST(0), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_open2" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ /* PERL-FIXME: Handle undef -> NULL. */
+ arg3 = svn_swig_pl_strings_to_hash(ST(1), _global_pool);
+ }
+ if (items > 2) {
+
+ }
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_open2(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_t, 0); argvi++ ;
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_open) {
{
svn_fs_t **arg1 = (svn_fs_t **) 0 ;
@@ -2221,6 +2369,7 @@ XS(_wrap_svn_fs_open) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2278,6 +2427,89 @@ XS(_wrap_svn_fs_open) {
}
+XS(_wrap_svn_fs_upgrade2) {
+ {
+ char *arg1 = (char *) 0 ;
+ svn_fs_upgrade_notify_t arg2 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg3 = (void *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res3 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_fs_upgrade2(path,notify_func,notify_baton,cancel_func,cancel_baton,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_upgrade2" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_upgrade2" "', argument " "2"" of type '" "svn_fs_upgrade_notify_t""'");
+ }
+ }
+ res3 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg3), 0, 0);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_upgrade2" "', argument " "3"" of type '" "void *""'");
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
+ }
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_upgrade2((char const *)arg1,arg2,arg3,arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_upgrade) {
{
char *arg1 = (char *) 0 ;
@@ -2292,6 +2524,7 @@ XS(_wrap_svn_fs_upgrade) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_upgrade(path,pool);");
@@ -2353,6 +2586,7 @@ XS(_wrap_svn_fs_type) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -2421,6 +2655,7 @@ XS(_wrap_svn_fs_path) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_path(fs,pool);");
@@ -2464,6 +2699,7 @@ XS(_wrap_svn_fs_config) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_config(fs,pool);");
@@ -2508,6 +2744,7 @@ XS(_wrap_svn_fs_delete_fs) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_delete_fs(path,pool);");
@@ -2553,15 +2790,17 @@ XS(_wrap_svn_fs_delete_fs) {
}
-XS(_wrap_svn_fs_hotcopy2) {
+XS(_wrap_svn_fs_hotcopy3) {
{
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
svn_boolean_t arg3 ;
svn_boolean_t arg4 ;
- svn_cancel_func_t arg5 = (svn_cancel_func_t) 0 ;
+ svn_fs_hotcopy_notify_t arg5 = (svn_fs_hotcopy_notify_t) 0 ;
void *arg6 = (void *) 0 ;
- apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res1 ;
char *buf1 = 0 ;
@@ -2579,46 +2818,51 @@ XS(_wrap_svn_fs_hotcopy2) {
dXSARGS;
{
- _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
- SWIG_croak("Usage: svn_fs_hotcopy2(src_path,dest_path,clean,incremental,cancel_func,cancel_baton,scratch_pool);");
+ if ((items < 7) || (items > 8)) {
+ SWIG_croak("Usage: svn_fs_hotcopy3(src_path,dest_path,clean,incremental,notify_func,notify_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_hotcopy2" "', argument " "1"" of type '" "char const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_hotcopy3" "', argument " "1"" of type '" "char const *""'");
}
arg1 = (char *)(buf1);
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_hotcopy2" "', argument " "2"" of type '" "char const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_hotcopy3" "', argument " "2"" of type '" "char const *""'");
}
arg2 = (char *)(buf2);
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
- SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_hotcopy2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_hotcopy3" "', argument " "3"" of type '" "svn_boolean_t""'");
}
arg3 = (svn_boolean_t)(val3);
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_hotcopy2" "', argument " "4"" of type '" "svn_boolean_t""'");
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_hotcopy3" "', argument " "4"" of type '" "svn_boolean_t""'");
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_hotcopy2" "', argument " "5"" of type '" "svn_cancel_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_hotcopy3" "', argument " "5"" of type '" "svn_fs_hotcopy_notify_t""'");
}
}
res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_fs_hotcopy2" "', argument " "6"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_fs_hotcopy3" "', argument " "6"" of type '" "void *""'");
}
- if (items > 6) {
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
+ }
+ if (items > 7) {
}
{
- result = (svn_error_t *)svn_fs_hotcopy2((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7);
+ result = (svn_error_t *)svn_fs_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
@@ -2660,6 +2904,103 @@ XS(_wrap_svn_fs_hotcopy2) {
}
+XS(_wrap_svn_fs_hotcopy2) {
+ {
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_cancel_func_t arg5 = (svn_cancel_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 6)) {
+ SWIG_croak("Usage: svn_fs_hotcopy2(src_path,dest_path,clean,incremental,cancel_func,cancel_baton,scratch_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_hotcopy2" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_hotcopy2" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_hotcopy2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_hotcopy2" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ {
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
+ }
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_hotcopy2((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_hotcopy) {
{
char *arg1 = (char *) 0 ;
@@ -2681,6 +3022,7 @@ XS(_wrap_svn_fs_hotcopy) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_hotcopy(src_path,dest_path,clean,pool);");
@@ -2750,15 +3092,15 @@ XS(_wrap_svn_fs_recover) {
int res1 ;
char *buf1 = 0 ;
int alloc1 = 0 ;
- int res3 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 3) || (items > 4)) {
+ if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_recover(path,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -2767,16 +3109,10 @@ XS(_wrap_svn_fs_recover) {
}
arg1 = (char *)(buf1);
{
- int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_recover" "', argument " "2"" of type '" "svn_cancel_func_t""'");
- }
+ arg2 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg3 = ST(1);
}
- res3 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg3), 0, 0);
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_recover" "', argument " "3"" of type '" "void *""'");
- }
- if (items > 3) {
+ if (items > 2) {
}
{
@@ -2803,14 +3139,10 @@ XS(_wrap_svn_fs_recover) {
}
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
-
-
SWIG_croak_null();
}
}
@@ -2832,6 +3164,7 @@ XS(_wrap_svn_fs_freeze) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_freeze(fs,freeze_func,freeze_baton,pool);");
@@ -2910,6 +3243,7 @@ XS(_wrap_svn_fs_berkeley_logfiles) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -2979,6 +3313,7 @@ XS(_wrap_svn_fs_new) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_new(fs_config,pool);");
@@ -3139,6 +3474,7 @@ XS(_wrap_svn_fs_berkeley_path) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_berkeley_path(fs,pool);");
@@ -3183,6 +3519,7 @@ XS(_wrap_svn_fs_delete_berkeley) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_delete_berkeley(path,pool);");
@@ -3249,6 +3586,7 @@ XS(_wrap_svn_fs_hotcopy_berkeley) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_hotcopy_berkeley(src_path,dest_path,clean_logs,pool);");
@@ -3322,6 +3660,7 @@ XS(_wrap_svn_fs_berkeley_recover) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_berkeley_recover(path,pool);");
@@ -3383,6 +3722,7 @@ XS(_wrap_svn_fs_create_access) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -3835,6 +4175,7 @@ XS(_wrap_svn_fs_parse_id) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_parse_id(data,len,pool);");
@@ -3883,6 +4224,7 @@ XS(_wrap_svn_fs_unparse_id) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_unparse_id(id,pool);");
@@ -3937,6 +4279,7 @@ XS(_wrap_svn_fs_begin_txn2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -4020,6 +4363,7 @@ XS(_wrap_svn_fs_begin_txn) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4096,6 +4440,7 @@ XS(_wrap_svn_fs_commit_txn) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -4173,6 +4518,7 @@ XS(_wrap_svn_fs_abort_txn) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_abort_txn(txn,pool);");
@@ -4235,6 +4581,7 @@ XS(_wrap_svn_fs_purge_txn) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_purge_txn(fs,txn_id,pool);");
@@ -4302,6 +4649,7 @@ XS(_wrap_svn_fs_txn_name) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -4409,6 +4757,7 @@ XS(_wrap_svn_fs_open_txn) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4482,6 +4831,7 @@ XS(_wrap_svn_fs_list_transactions) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -4552,6 +4902,7 @@ XS(_wrap_svn_fs_txn_prop) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4629,6 +4980,7 @@ XS(_wrap_svn_fs_txn_proplist) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -4699,6 +5051,7 @@ XS(_wrap_svn_fs_change_txn_prop) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_change_txn_prop(txn,name,value,pool);");
@@ -4778,6 +5131,7 @@ XS(_wrap_svn_fs_change_txn_props) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_change_txn_props(txn,props,pool);");
@@ -4848,6 +5202,7 @@ XS(_wrap_svn_fs_revision_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4921,6 +5276,7 @@ XS(_wrap_svn_fs_txn_root) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -5116,6 +5472,7 @@ XS(_wrap_svn_fs_txn_root_name) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_txn_root_name(root,pool);");
@@ -5738,6 +6095,71 @@ XS(_wrap_svn_fs_path_change2_t_copyfrom_path_get) {
}
+XS(_wrap_svn_fs_path_change2_t_mergeinfo_mod_set) {
+ {
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ svn_tristate_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_path_change2_t_mergeinfo_mod_set(self,mergeinfo_mod);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_path_change2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_path_change2_t_mergeinfo_mod_set" "', argument " "1"" of type '" "struct svn_fs_path_change2_t *""'");
+ }
+ arg1 = (struct svn_fs_path_change2_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_path_change2_t_mergeinfo_mod_set" "', argument " "2"" of type '" "svn_tristate_t""'");
+ }
+ arg2 = (svn_tristate_t)(val2);
+ if (arg1) (arg1)->mergeinfo_mod = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_path_change2_t_mergeinfo_mod_get) {
+ {
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_tristate_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_path_change2_t_mergeinfo_mod_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_path_change2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_path_change2_t_mergeinfo_mod_get" "', argument " "1"" of type '" "struct svn_fs_path_change2_t *""'");
+ }
+ arg1 = (struct svn_fs_path_change2_t *)(argp1);
+ result = (svn_tristate_t) ((arg1)->mergeinfo_mod);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_path_change_t_node_rev_id_set) {
{
struct svn_fs_path_change_t *arg1 = (struct svn_fs_path_change_t *) 0 ;
@@ -6014,6 +6436,7 @@ XS(_wrap_svn_fs_path_change2_create) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_path_change2_create(node_rev_id,change_kind,pool);");
@@ -6066,6 +6489,7 @@ XS(_wrap_svn_fs_paths_changed2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -6132,6 +6556,7 @@ XS(_wrap_svn_fs_paths_changed) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -6203,6 +6628,7 @@ XS(_wrap_svn_fs_check_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6264,6 +6690,94 @@ XS(_wrap_svn_fs_check_path) {
}
+XS(_wrap_svn_fs_node_history2) {
+ {
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_fs_history_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 4)) {
+ SWIG_croak("Usage: svn_fs_node_history2(root,path,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_node_history2" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_node_history2" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ if (items > 2) {
+
+ }
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_history2(arg1,arg2,(char const *)arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t, 0); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_node_history) {
{
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
@@ -6283,6 +6797,7 @@ XS(_wrap_svn_fs_node_history) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6341,6 +6856,93 @@ XS(_wrap_svn_fs_node_history) {
}
+XS(_wrap_svn_fs_history_prev2) {
+ {
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_history_t *arg2 = (svn_fs_history_t *) 0 ;
+ svn_boolean_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_fs_history_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 4)) {
+ SWIG_croak("Usage: svn_fs_history_prev2(history,cross_copies,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_history_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_history_prev2" "', argument " "2"" of type '" "svn_fs_history_t *""'");
+ }
+ arg2 = (svn_fs_history_t *)(argp2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_history_prev2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ if (items > 2) {
+
+ }
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_history_prev2(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t, 0); argvi++ ;
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_history_prev) {
{
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
@@ -6359,6 +6961,7 @@ XS(_wrap_svn_fs_history_prev) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6435,6 +7038,7 @@ XS(_wrap_svn_fs_history_location) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -6519,6 +7123,7 @@ XS(_wrap_svn_fs_is_dir) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6600,6 +7205,7 @@ XS(_wrap_svn_fs_is_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6680,6 +7286,7 @@ XS(_wrap_svn_fs_node_id) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6738,6 +7345,107 @@ XS(_wrap_svn_fs_node_id) {
}
+XS(_wrap_svn_fs_node_relation) {
+ {
+ svn_fs_node_relation_t *arg1 = (svn_fs_node_relation_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 6)) {
+ SWIG_croak("Usage: svn_fs_node_relation(relation,root_a,path_a,root_b,path_b,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_node_relation_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_node_relation" "', argument " "1"" of type '" "svn_fs_node_relation_t *""'");
+ }
+ arg1 = (svn_fs_node_relation_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_node_relation" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_node_relation" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_fs_node_relation" "', argument " "4"" of type '" "svn_fs_root_t *""'");
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_node_relation" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_relation(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_node_created_rev) {
{
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
@@ -6758,6 +7466,7 @@ XS(_wrap_svn_fs_node_created_rev) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6839,6 +7548,7 @@ XS(_wrap_svn_fs_node_origin_rev) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -6919,6 +7629,7 @@ XS(_wrap_svn_fs_node_created_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -7004,6 +7715,7 @@ XS(_wrap_svn_fs_node_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -7092,6 +7804,7 @@ XS(_wrap_svn_fs_node_proplist) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -7150,6 +7863,88 @@ XS(_wrap_svn_fs_node_proplist) {
}
+XS(_wrap_svn_fs_node_has_props) {
+ {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_node_has_props(root,path,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_node_has_props" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_node_has_props" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_has_props(arg1,arg2,(char const *)arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_change_node_prop) {
{
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
@@ -7173,6 +7968,7 @@ XS(_wrap_svn_fs_change_node_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_change_node_prop(root,path,name,value,pool);");
@@ -7243,6 +8039,109 @@ XS(_wrap_svn_fs_change_node_prop) {
}
+XS(_wrap_svn_fs_props_different) {
+ {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_fs_props_different(root1,path1,root2,path2,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_props_different" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_props_different" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(ST(2), &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_fs_props_different" "', argument " "4"" of type '" "svn_fs_root_t *""'");
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(ST(3), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_props_different" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_props_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_props_changed) {
{
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
@@ -7270,6 +8169,7 @@ XS(_wrap_svn_fs_props_changed) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -7367,6 +8267,7 @@ XS(_wrap_svn_fs_copied_from) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7459,6 +8360,7 @@ XS(_wrap_svn_fs_closest_copy) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7553,9 +8455,11 @@ XS(_wrap_svn_fs_get_mergeinfo2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 7)) {
@@ -7567,7 +8471,7 @@ XS(_wrap_svn_fs_get_mergeinfo2) {
}
arg2 = (svn_fs_root_t *)(argp2);
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg3 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
@@ -7667,6 +8571,7 @@ XS(_wrap_svn_fs_get_mergeinfo) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -7678,7 +8583,7 @@ XS(_wrap_svn_fs_get_mergeinfo) {
}
arg2 = (svn_fs_root_t *)(argp2);
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg3 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
@@ -7777,6 +8682,7 @@ XS(_wrap_svn_fs_merge) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 6) || (items > 7)) {
@@ -8089,6 +8995,7 @@ XS(_wrap_svn_fs_dir_entries) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -8147,6 +9054,99 @@ XS(_wrap_svn_fs_dir_entries) {
}
+XS(_wrap_svn_fs_dir_optimal_order) {
+ {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 4)) {
+ SWIG_croak("Usage: svn_fs_dir_optimal_order(root,entries,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_dir_optimal_order" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_ConvertPtr(ST(1), &argp3,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_dir_optimal_order" "', argument " "3"" of type '" "apr_hash_t *""'");
+ }
+ arg3 = (apr_hash_t *)(argp3);
+ if (items > 2) {
+
+ }
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_dir_optimal_order(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_dir_optimal_order arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_dir_optimal_order is not implemented yet");
+
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_make_dir) {
{
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
@@ -8164,6 +9164,7 @@ XS(_wrap_svn_fs_make_dir) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_make_dir(root,path,pool);");
@@ -8233,6 +9234,7 @@ XS(_wrap_svn_fs_delete) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_delete(root,path,pool);");
@@ -8309,6 +9311,7 @@ XS(_wrap_svn_fs_copy) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_copy(from_root,from_path,to_root,to_path,pool);");
@@ -8395,6 +9398,7 @@ XS(_wrap_svn_fs_revision_link) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_revision_link(from_root,to_root,path,pool);");
@@ -8473,6 +9477,7 @@ XS(_wrap_svn_fs_file_length) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -8514,7 +9519,7 @@ XS(_wrap_svn_fs_file_length) {
}
}
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*(arg1));
if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
@@ -8558,6 +9563,7 @@ XS(_wrap_svn_fs_file_checksum) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -8655,6 +9661,7 @@ XS(_wrap_svn_fs_file_md5_checksum) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = temp1;
if ((items < 2) || (items > 3)) {
@@ -8696,7 +9703,7 @@ XS(_wrap_svn_fs_file_md5_checksum) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg1,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg1,
_global_pool),
0)); argvi++ /*@SWIG@*/
@@ -8738,6 +9745,7 @@ XS(_wrap_svn_fs_file_contents) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -8779,7 +9787,11 @@ XS(_wrap_svn_fs_file_contents) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -8819,6 +9831,7 @@ XS(_wrap_svn_fs_try_process_file_contents) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -8911,6 +9924,7 @@ XS(_wrap_svn_fs_make_file) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_make_file(root,path,pool);");
@@ -8992,6 +10006,7 @@ XS(_wrap_svn_fs_apply_textdelta) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -9093,6 +10108,7 @@ XS(_wrap_svn_fs_apply_text) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -9139,7 +10155,11 @@ XS(_wrap_svn_fs_apply_text) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -9158,6 +10178,109 @@ XS(_wrap_svn_fs_apply_text) {
}
+XS(_wrap_svn_fs_contents_different) {
+ {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_fs_contents_different(root1,path1,root2,path2,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_contents_different" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_contents_different" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(ST(2), &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_fs_contents_different" "', argument " "4"" of type '" "svn_fs_root_t *""'");
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(ST(3), &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_contents_different" "', argument " "5"" of type '" "char const *""'");
+ }
+ arg5 = (char *)(buf5);
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_contents_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_contents_changed) {
{
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
@@ -9185,6 +10308,7 @@ XS(_wrap_svn_fs_contents_changed) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -9276,6 +10400,7 @@ XS(_wrap_svn_fs_youngest_rev) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -9330,6 +10455,184 @@ XS(_wrap_svn_fs_youngest_rev) {
}
+XS(_wrap_svn_fs_info_format) {
+ {
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_fs_t *arg3 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_info_format(fs,result_pool,scratch_pool);");
+ }
+ res3 = SWIG_ConvertPtr(ST(0), &argp3,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_info_format" "', argument " "3"" of type '" "svn_fs_t *""'");
+ }
+ arg3 = (svn_fs_t *)(argp3);
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_info_format(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_format is not implemented yet");
+
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_info_config_files) {
+ {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_info_config_files(fs,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_info_config_files" "', argument " "2"" of type '" "svn_fs_t *""'");
+ }
+ arg2 = (svn_fs_t *)(argp2);
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_info_config_files(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_config_files arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_config_files is not implemented yet");
+
+ }
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_deltify_revision) {
{
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
@@ -9346,6 +10649,7 @@ XS(_wrap_svn_fs_deltify_revision) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_deltify_revision(fs,revision,pool);");
@@ -9420,6 +10724,7 @@ XS(_wrap_svn_fs_revision_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -9507,6 +10812,7 @@ XS(_wrap_svn_fs_revision_proplist) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -9591,6 +10897,7 @@ XS(_wrap_svn_fs_change_rev_prop2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_fs_change_rev_prop2(fs,rev,name,old_value_p,value,pool);");
@@ -9698,6 +11005,7 @@ XS(_wrap_svn_fs_change_rev_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_change_rev_prop(fs,rev,name,value,pool);");
@@ -9794,6 +11102,7 @@ XS(_wrap_svn_fs_get_file_delta_stream) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -9881,6 +11190,7 @@ XS(_wrap_svn_fs_get_uuid) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -9953,6 +11263,7 @@ XS(_wrap_svn_fs_set_uuid) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_set_uuid(fs,uuid,pool);");
@@ -10005,6 +11316,241 @@ XS(_wrap_svn_fs_set_uuid) {
}
+XS(_wrap_svn_fs_lock_target_create) {
+ {
+ char *arg1 = (char *) 0 ;
+ svn_revnum_t arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ svn_fs_lock_target_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 2) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_lock_target_create(token,current_rev,result_pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_lock_target_create" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_lock_target_create" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_fs_lock_target_t *)svn_fs_lock_target_create((char const *)arg1,arg2,arg3);
+
+
+
+ }
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_fs_lock_target_t, 0 | 0); argvi++ ;
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_lock_target_set_token) {
+ {
+ svn_fs_lock_target_t *arg1 = (svn_fs_lock_target_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_lock_target_set_token(target,token);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_lock_target_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_lock_target_set_token" "', argument " "1"" of type '" "svn_fs_lock_target_t *""'");
+ }
+ arg1 = (svn_fs_lock_target_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_lock_target_set_token" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ svn_fs_lock_target_set_token(arg1,(char const *)arg2);
+
+
+
+ }
+ ST(argvi) = sv_newmortal();
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_lock_many) {
+ {
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ long long val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int res8 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 8) || (items > 10)) {
+ SWIG_croak("Usage: svn_fs_lock_many(fs,lock_targets,comment,is_dav_comment,expiration_date,steal_lock,lock_callback,lock_baton,result_pool,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_lock_many" "', argument " "1"" of type '" "svn_fs_t *""'");
+ }
+ arg1 = (svn_fs_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_lock_many" "', argument " "2"" of type '" "apr_hash_t *""'");
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_lock_many" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_lock_many" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_fs_lock_many" "', argument " "5"" of type '" "apr_time_t""'");
+ }
+ arg5 = (apr_time_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_fs_lock_many" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_lock_many" "', argument " "7"" of type '" "svn_fs_lock_callback_t""'");
+ }
+ }
+ res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_fs_lock_many" "', argument " "8"" of type '" "void *""'");
+ }
+ if (items > 8) {
+
+ }
+ if (items > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_lock) {
{
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
@@ -10044,6 +11590,7 @@ XS(_wrap_svn_fs_lock) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 8) || (items > 9)) {
@@ -10159,6 +11706,7 @@ XS(_wrap_svn_fs_generate_lock_token) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -10214,6 +11762,112 @@ XS(_wrap_svn_fs_generate_lock_token) {
}
+XS(_wrap_svn_fs_unlock_many) {
+ {
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int res5 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 7)) {
+ SWIG_croak("Usage: svn_fs_unlock_many(fs,unlock_targets,break_lock,lock_callback,lock_baton,result_pool,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_unlock_many" "', argument " "1"" of type '" "svn_fs_t *""'");
+ }
+ arg1 = (svn_fs_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_unlock_many" "', argument " "2"" of type '" "apr_hash_t *""'");
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_unlock_many" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_unlock_many" "', argument " "4"" of type '" "svn_fs_lock_callback_t""'");
+ }
+ }
+ res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_unlock_many" "', argument " "5"" of type '" "void *""'");
+ }
+ if (items > 5) {
+
+ }
+ if (items > 6) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_unlock) {
{
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
@@ -10238,6 +11892,7 @@ XS(_wrap_svn_fs_unlock) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_unlock(fs,path,token,break_lock,pool);");
@@ -10323,6 +11978,7 @@ XS(_wrap_svn_fs_get_lock) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -10404,6 +12060,7 @@ XS(_wrap_svn_fs_get_locks2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_fs_get_locks2(fs,path,depth,get_locks_func,get_locks_baton,pool);");
@@ -10497,6 +12154,7 @@ XS(_wrap_svn_fs_get_locks) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_get_locks(fs,path,get_locks_func,get_locks_baton,pool);");
@@ -10574,6 +12232,7 @@ XS(_wrap_svn_fs_print_modules) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_print_modules(output,pool);");
@@ -10581,6 +12240,7 @@ XS(_wrap_svn_fs_print_modules) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg1 = NULL;
@@ -10588,8 +12248,9 @@ XS(_wrap_svn_fs_print_modules) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg1 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg1 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -10643,15 +12304,15 @@ XS(_wrap_svn_fs_pack) {
char *buf1 = 0 ;
int alloc1 = 0 ;
int res3 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_pack(db_path,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -10670,16 +12331,10 @@ XS(_wrap_svn_fs_pack) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_pack" "', argument " "3"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_pack" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_pack" "', argument " "5"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -10708,16 +12363,12 @@ XS(_wrap_svn_fs_pack) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
-
-
SWIG_croak_null();
}
}
@@ -10743,15 +12394,15 @@ XS(_wrap_svn_fs_verify) {
long val4 ;
int ecode4 = 0 ;
int res6 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_fs_verify(path,fs_config,start,end,notify_func,notify_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -10784,16 +12435,10 @@ XS(_wrap_svn_fs_verify) {
SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_fs_verify" "', argument " "6"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_verify" "', argument " "7"" of type '" "svn_cancel_func_t""'");
- }
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_fs_verify" "', argument " "8"" of type '" "void *""'");
- }
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -10825,8 +12470,6 @@ XS(_wrap_svn_fs_verify) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -10836,8 +12479,6 @@ XS(_wrap_svn_fs_verify) {
-
-
SWIG_croak_null();
}
}
@@ -10856,6 +12497,7 @@ XS(_wrap_svn_fs_verify_root) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_fs_verify_root(root,scratch_pool);");
@@ -10901,6 +12543,685 @@ XS(_wrap_svn_fs_verify_root) {
}
+XS(_wrap_svn_fs_fsfs_info_t_fs_type_set) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_fs_type_set(self,fs_type);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_fs_type_set" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_fsfs_info_t_fs_type_set" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ ST(argvi) = sv_newmortal();
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_fs_type_get) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ char *result = 0 ;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_fs_type_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_fs_type_get" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_shard_size_set) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_shard_size_set(self,shard_size);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_shard_size_set" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_fsfs_info_t_shard_size_set" "', argument " "2"" of type '" "int""'");
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->shard_size = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_shard_size_get) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ int result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_shard_size_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_shard_size_get" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (int) ((arg1)->shard_size);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_min_unpacked_rev_set(self,min_unpacked_rev);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_min_unpacked_rev_set" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_fsfs_info_t_min_unpacked_rev_set" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_revnum_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_min_unpacked_rev_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_min_unpacked_rev_get" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_log_addressing_set) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_boolean_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_log_addressing_set(self,log_addressing);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_log_addressing_set" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_fsfs_info_t_log_addressing_set" "', argument " "2"" of type '" "svn_boolean_t""'");
+ }
+ arg2 = (svn_boolean_t)(val2);
+ if (arg1) (arg1)->log_addressing = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsfs_info_t_log_addressing_get) {
+ {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_boolean_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsfs_info_t_log_addressing_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsfs_info_t_log_addressing_get" "', argument " "1"" of type '" "struct svn_fs_fsfs_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (svn_boolean_t) ((arg1)->log_addressing);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_fs_type_set) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_fs_type_set(self,fs_type);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_fs_type_set" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_fsx_info_t_fs_type_set" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ ST(argvi) = sv_newmortal();
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_fs_type_get) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ char *result = 0 ;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_fs_type_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_fs_type_get" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_shard_size_set) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_shard_size_set(self,shard_size);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_shard_size_set" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_fsx_info_t_shard_size_set" "', argument " "2"" of type '" "int""'");
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->shard_size = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_shard_size_get) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ int result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_shard_size_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_shard_size_get" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (int) ((arg1)->shard_size);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_min_unpacked_rev_set) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_min_unpacked_rev_set(self,min_unpacked_rev);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_min_unpacked_rev_set" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_fs_fsx_info_t_min_unpacked_rev_set" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_fsx_info_t_min_unpacked_rev_get) {
+ {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_revnum_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_fsx_info_t_min_unpacked_rev_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_fsx_info_t_min_unpacked_rev_get" "', argument " "1"" of type '" "struct svn_fs_fsx_info_t *""'");
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_info_placeholder_t_fs_type_set) {
+ {
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_fs_info_placeholder_t_fs_type_set(self,fs_type);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_info_placeholder_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_info_placeholder_t_fs_type_set" "', argument " "1"" of type '" "struct svn_fs_info_placeholder_t *""'");
+ }
+ arg1 = (struct svn_fs_info_placeholder_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_info_placeholder_t_fs_type_set" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ ST(argvi) = sv_newmortal();
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_info_placeholder_t_fs_type_get) {
+ {
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ char *result = 0 ;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_fs_info_placeholder_t_fs_type_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_fs_info_placeholder_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_info_placeholder_t_fs_type_get" "', argument " "1"" of type '" "struct svn_fs_info_placeholder_t *""'");
+ }
+ arg1 = (struct svn_fs_info_placeholder_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_info) {
+ {
+ svn_fs_info_placeholder_t **arg1 = (svn_fs_info_placeholder_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_fs_info_placeholder_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_info(fs,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_info" "', argument " "2"" of type '" "svn_fs_t *""'");
+ }
+ arg2 = (svn_fs_t *)(argp2);
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_info((struct svn_fs_info_placeholder_t const **)arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info arg 1 (svn_fs_info_placeholder_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info is not implemented yet");
+
+ }
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_fs_info_dup) {
+ {
+ void *arg1 = (void *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ int argvi = 0;
+ void *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_fs_info_dup(info,result_pool,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0),SWIG_as_voidptrptr(&arg1), 0, 0);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_fs_info_dup" "', argument " "1"" of type '" "void const *""'");
+ }
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (void *)svn_fs_info_dup((void const *)arg1,arg2,arg3);
+
+
+
+ }
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0); argvi++ ;
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_invoke_warning_callback) {
{
svn_fs_warning_callback_t arg1 = (svn_fs_warning_callback_t) 0 ;
@@ -10950,6 +13271,92 @@ XS(_wrap_svn_fs_invoke_warning_callback) {
}
+XS(_wrap_svn_fs_invoke_upgrade_notify) {
+ {
+ svn_fs_upgrade_notify_t arg1 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_uint64_t arg3 ;
+ svn_fs_upgrade_notify_action_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ unsigned long long val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_fs_invoke_upgrade_notify(_obj,baton,number,action,scratch_pool);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_invoke_upgrade_notify" "', argument " "1"" of type '" "svn_fs_upgrade_notify_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_invoke_upgrade_notify" "', argument " "2"" of type '" "void *""'");
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_invoke_upgrade_notify" "', argument " "3"" of type '" "apr_uint64_t""'");
+ }
+ arg3 = (apr_uint64_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_invoke_upgrade_notify" "', argument " "4"" of type '" "svn_fs_upgrade_notify_action_t""'");
+ }
+ arg4 = (svn_fs_upgrade_notify_action_t)(val4);
+ if (items > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_invoke_upgrade_notify(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_invoke_progress_notify_func) {
{
svn_fs_progress_notify_func_t arg1 = (svn_fs_progress_notify_func_t) 0 ;
@@ -10965,6 +13372,7 @@ XS(_wrap_svn_fs_invoke_progress_notify_func) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_invoke_progress_notify_func(_obj,revision,baton,pool);");
@@ -11009,6 +13417,76 @@ XS(_wrap_svn_fs_invoke_progress_notify_func) {
}
+XS(_wrap_svn_fs_invoke_hotcopy_notify) {
+ {
+ svn_fs_hotcopy_notify_t arg1 = (svn_fs_hotcopy_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_fs_invoke_hotcopy_notify(_obj,baton,start_revision,end_revision,scratch_pool);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_invoke_hotcopy_notify" "', argument " "1"" of type '" "svn_fs_hotcopy_notify_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_invoke_hotcopy_notify" "', argument " "2"" of type '" "void *""'");
+ }
+ ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_fs_invoke_hotcopy_notify" "', argument " "3"" of type '" "svn_revnum_t""'");
+ }
+ arg3 = (svn_revnum_t)(val3);
+ ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_fs_invoke_hotcopy_notify" "', argument " "4"" of type '" "svn_revnum_t""'");
+ }
+ arg4 = (svn_revnum_t)(val4);
+ if (items > 4) {
+
+ }
+ {
+ svn_fs_invoke_hotcopy_notify(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ ST(argvi) = sv_newmortal();
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_invoke_freeze_func) {
{
svn_fs_freeze_func_t arg1 = (svn_fs_freeze_func_t) 0 ;
@@ -11022,6 +13500,7 @@ XS(_wrap_svn_fs_invoke_freeze_func) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_fs_invoke_freeze_func(_obj,baton,pool);");
@@ -11093,6 +13572,7 @@ XS(_wrap_svn_fs_invoke_process_contents_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_invoke_process_contents_func(_obj,contents,len,baton,scratch_pool);");
@@ -11159,6 +13639,103 @@ XS(_wrap_svn_fs_invoke_process_contents_func) {
}
+XS(_wrap_svn_fs_invoke_lock_callback) {
+ {
+ svn_fs_lock_callback_t arg1 = (svn_fs_lock_callback_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_lock_t *arg4 = (svn_lock_t *) 0 ;
+ svn_error_t *arg5 = (svn_error_t *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 6)) {
+ SWIG_croak("Usage: svn_fs_invoke_lock_callback(_obj,baton,path,lock,fs_err,scratch_pool);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_fs_invoke_lock_callback" "', argument " "1"" of type '" "svn_fs_lock_callback_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_fs_invoke_lock_callback" "', argument " "2"" of type '" "void *""'");
+ }
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_fs_invoke_lock_callback" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_lock_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_fs_invoke_lock_callback" "', argument " "4"" of type '" "svn_lock_t const *""'");
+ }
+ arg4 = (svn_lock_t *)(argp4);
+ res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_svn_error_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_fs_invoke_lock_callback" "', argument " "5"" of type '" "svn_error_t *""'");
+ }
+ arg5 = (svn_error_t *)(argp5);
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_invoke_lock_callback(arg1,arg2,(char const *)arg3,(struct svn_lock_t const *)arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_fs_invoke_get_locks_callback) {
{
svn_fs_get_locks_callback_t arg1 = (svn_fs_get_locks_callback_t) 0 ;
@@ -11175,6 +13752,7 @@ XS(_wrap_svn_fs_invoke_get_locks_callback) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_fs_invoke_get_locks_callback(_obj,baton,lock,pool);");
@@ -11253,6 +13831,7 @@ XS(_wrap_svn_fs_invoke_pack_notify) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_fs_invoke_pack_notify(_obj,baton,shard,action,pool);");
@@ -11334,7 +13913,10 @@ static swig_type_info _swigt__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_a
static swig_type_info _swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_txdelta_window_t *,void *)|svn_txdelta_window_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_error_t", "svn_cancel_func_t|struct svn_error_t *(*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_fs_pack_notify_action_t,apr_pool_t *)|svn_fs_pack_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_uint64_t,svn_fs_upgrade_notify_action_t,apr_pool_t *)|svn_fs_upgrade_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_long_long_p_apr_pool_t__void = {"_p_f_p_void_long_long_p_apr_pool_t__void", "void (*)(void *,long,long,apr_pool_t *)|svn_fs_hotcopy_notify_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_fs_freeze_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_struct_svn_error_t__void = {"_p_f_p_void_p_struct_svn_error_t__void", "void (*)(void *,struct svn_error_t *)|svn_fs_warning_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_lock_t *,apr_pool_t *)|svn_fs_get_locks_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -11347,6 +13929,7 @@ static swig_type_info _swigt__p_p_svn_checksum_t = {"_p_p_svn_checksum_t", "stru
static swig_type_info _swigt__p_p_svn_fs_access_t = {"_p_p_svn_fs_access_t", "struct svn_fs_access_t **|svn_fs_access_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_history_t = {"_p_p_svn_fs_history_t", "struct svn_fs_history_t **|svn_fs_history_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_id_t = {"_p_p_svn_fs_id_t", "struct svn_fs_id_t **|svn_fs_id_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_fs_info_placeholder_t = {"_p_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t **|svn_fs_info_placeholder_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_root_t = {"_p_p_svn_fs_root_t", "struct svn_fs_root_t **|svn_fs_root_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_t = {"_p_p_svn_fs_t", "struct svn_fs_t **|svn_fs_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_txn_t = {"_p_p_svn_fs_txn_t", "struct svn_fs_txn_t **|svn_fs_txn_t **", 0, 0, (void*)0, 0};
@@ -11354,6 +13937,7 @@ static swig_type_info _swigt__p_p_svn_lock_t = {"_p_p_svn_lock_t", "struct svn_l
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_txdelta_stream_t = {"_p_p_svn_txdelta_stream_t", "struct svn_txdelta_stream_t **|svn_txdelta_stream_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -11387,8 +13971,13 @@ static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -11396,6 +13985,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -11448,7 +14038,10 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
&_swigt__p_f_p_void__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_long_long_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_struct_svn_error_t__void,
&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_int,
@@ -11461,6 +14054,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_fs_access_t,
&_swigt__p_p_svn_fs_history_t,
&_swigt__p_p_svn_fs_id_t,
+ &_swigt__p_p_svn_fs_info_placeholder_t,
&_swigt__p_p_svn_fs_root_t,
&_swigt__p_p_svn_fs_t,
&_swigt__p_p_svn_fs_txn_t,
@@ -11468,6 +14062,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
&_swigt__p_p_svn_txdelta_stream_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -11501,8 +14096,13 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -11510,6 +14110,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -11562,7 +14163,10 @@ static swig_cast_info _swigc__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_a
static swig_cast_info _swigc__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_long_long_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_long_long_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_struct_svn_error_t__void[] = { {&_swigt__p_f_p_void_p_struct_svn_error_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -11575,6 +14179,7 @@ static swig_cast_info _swigc__p_p_svn_checksum_t[] = { {&_swigt__p_p_svn_checks
static swig_cast_info _swigc__p_p_svn_fs_access_t[] = { {&_swigt__p_p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_history_t[] = { {&_swigt__p_p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_id_t[] = { {&_swigt__p_p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_fs_info_placeholder_t[] = { {&_swigt__p_p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_root_t[] = { {&_swigt__p_p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_t[] = { {&_swigt__p_p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_txn_t[] = { {&_swigt__p_p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11582,6 +14187,7 @@ static swig_cast_info _swigc__p_p_svn_lock_t[] = { {&_swigt__p_p_svn_lock_t, 0,
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_txdelta_stream_t[] = { {&_swigt__p_p_svn_txdelta_stream_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11615,8 +14221,13 @@ static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11624,6 +14235,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11676,7 +14288,10 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_swigc__p_f_p_void__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_long_long_p_apr_pool_t__void,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_struct_svn_error_t__void,
_swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_int,
@@ -11689,6 +14304,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_fs_access_t,
_swigc__p_p_svn_fs_history_t,
_swigc__p_p_svn_fs_id_t,
+ _swigc__p_p_svn_fs_info_placeholder_t,
_swigc__p_p_svn_fs_root_t,
_swigc__p_p_svn_fs_t,
_swigc__p_p_svn_fs_txn_t,
@@ -11696,6 +14312,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
_swigc__p_p_svn_txdelta_stream_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -11729,8 +14346,13 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -11738,6 +14360,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -11794,12 +14417,15 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_version", _wrap_svn_fs_version},
{"SVN::_Fs::svn_fs_initialize", _wrap_svn_fs_initialize},
{"SVN::_Fs::svn_fs_create", _wrap_svn_fs_create},
+{"SVN::_Fs::svn_fs_open2", _wrap_svn_fs_open2},
{"SVN::_Fs::svn_fs_open", _wrap_svn_fs_open},
+{"SVN::_Fs::svn_fs_upgrade2", _wrap_svn_fs_upgrade2},
{"SVN::_Fs::svn_fs_upgrade", _wrap_svn_fs_upgrade},
{"SVN::_Fs::svn_fs_type", _wrap_svn_fs_type},
{"SVN::_Fs::svn_fs_path", _wrap_svn_fs_path},
{"SVN::_Fs::svn_fs_config", _wrap_svn_fs_config},
{"SVN::_Fs::svn_fs_delete_fs", _wrap_svn_fs_delete_fs},
+{"SVN::_Fs::svn_fs_hotcopy3", _wrap_svn_fs_hotcopy3},
{"SVN::_Fs::svn_fs_hotcopy2", _wrap_svn_fs_hotcopy2},
{"SVN::_Fs::svn_fs_hotcopy", _wrap_svn_fs_hotcopy},
{"SVN::_Fs::svn_fs_recover", _wrap_svn_fs_recover},
@@ -11860,6 +14486,8 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_path_change2_t_copyfrom_rev_get", _wrap_svn_fs_path_change2_t_copyfrom_rev_get},
{"SVN::_Fs::svn_fs_path_change2_t_copyfrom_path_set", _wrap_svn_fs_path_change2_t_copyfrom_path_set},
{"SVN::_Fs::svn_fs_path_change2_t_copyfrom_path_get", _wrap_svn_fs_path_change2_t_copyfrom_path_get},
+{"SVN::_Fs::svn_fs_path_change2_t_mergeinfo_mod_set", _wrap_svn_fs_path_change2_t_mergeinfo_mod_set},
+{"SVN::_Fs::svn_fs_path_change2_t_mergeinfo_mod_get", _wrap_svn_fs_path_change2_t_mergeinfo_mod_get},
{"SVN::_Fs::svn_fs_path_change_t_node_rev_id_set", _wrap_svn_fs_path_change_t_node_rev_id_set},
{"SVN::_Fs::svn_fs_path_change_t_node_rev_id_get", _wrap_svn_fs_path_change_t_node_rev_id_get},
{"SVN::_Fs::svn_fs_path_change_t_change_kind_set", _wrap_svn_fs_path_change_t_change_kind_set},
@@ -11872,18 +14500,23 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_paths_changed2", _wrap_svn_fs_paths_changed2},
{"SVN::_Fs::svn_fs_paths_changed", _wrap_svn_fs_paths_changed},
{"SVN::_Fs::svn_fs_check_path", _wrap_svn_fs_check_path},
+{"SVN::_Fs::svn_fs_node_history2", _wrap_svn_fs_node_history2},
{"SVN::_Fs::svn_fs_node_history", _wrap_svn_fs_node_history},
+{"SVN::_Fs::svn_fs_history_prev2", _wrap_svn_fs_history_prev2},
{"SVN::_Fs::svn_fs_history_prev", _wrap_svn_fs_history_prev},
{"SVN::_Fs::svn_fs_history_location", _wrap_svn_fs_history_location},
{"SVN::_Fs::svn_fs_is_dir", _wrap_svn_fs_is_dir},
{"SVN::_Fs::svn_fs_is_file", _wrap_svn_fs_is_file},
{"SVN::_Fs::svn_fs_node_id", _wrap_svn_fs_node_id},
+{"SVN::_Fs::svn_fs_node_relation", _wrap_svn_fs_node_relation},
{"SVN::_Fs::svn_fs_node_created_rev", _wrap_svn_fs_node_created_rev},
{"SVN::_Fs::svn_fs_node_origin_rev", _wrap_svn_fs_node_origin_rev},
{"SVN::_Fs::svn_fs_node_created_path", _wrap_svn_fs_node_created_path},
{"SVN::_Fs::svn_fs_node_prop", _wrap_svn_fs_node_prop},
{"SVN::_Fs::svn_fs_node_proplist", _wrap_svn_fs_node_proplist},
+{"SVN::_Fs::svn_fs_node_has_props", _wrap_svn_fs_node_has_props},
{"SVN::_Fs::svn_fs_change_node_prop", _wrap_svn_fs_change_node_prop},
+{"SVN::_Fs::svn_fs_props_different", _wrap_svn_fs_props_different},
{"SVN::_Fs::svn_fs_props_changed", _wrap_svn_fs_props_changed},
{"SVN::_Fs::svn_fs_copied_from", _wrap_svn_fs_copied_from},
{"SVN::_Fs::svn_fs_closest_copy", _wrap_svn_fs_closest_copy},
@@ -11897,6 +14530,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_dirent_t_kind_set", _wrap_svn_fs_dirent_t_kind_set},
{"SVN::_Fs::svn_fs_dirent_t_kind_get", _wrap_svn_fs_dirent_t_kind_get},
{"SVN::_Fs::svn_fs_dir_entries", _wrap_svn_fs_dir_entries},
+{"SVN::_Fs::svn_fs_dir_optimal_order", _wrap_svn_fs_dir_optimal_order},
{"SVN::_Fs::svn_fs_make_dir", _wrap_svn_fs_make_dir},
{"SVN::_Fs::svn_fs_delete", _wrap_svn_fs_delete},
{"SVN::_Fs::svn_fs_copy", _wrap_svn_fs_copy},
@@ -11909,8 +14543,11 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_make_file", _wrap_svn_fs_make_file},
{"SVN::_Fs::svn_fs_apply_textdelta", _wrap_svn_fs_apply_textdelta},
{"SVN::_Fs::svn_fs_apply_text", _wrap_svn_fs_apply_text},
+{"SVN::_Fs::svn_fs_contents_different", _wrap_svn_fs_contents_different},
{"SVN::_Fs::svn_fs_contents_changed", _wrap_svn_fs_contents_changed},
{"SVN::_Fs::svn_fs_youngest_rev", _wrap_svn_fs_youngest_rev},
+{"SVN::_Fs::svn_fs_info_format", _wrap_svn_fs_info_format},
+{"SVN::_Fs::svn_fs_info_config_files", _wrap_svn_fs_info_config_files},
{"SVN::_Fs::svn_fs_deltify_revision", _wrap_svn_fs_deltify_revision},
{"SVN::_Fs::svn_fs_revision_prop", _wrap_svn_fs_revision_prop},
{"SVN::_Fs::svn_fs_revision_proplist", _wrap_svn_fs_revision_proplist},
@@ -11919,8 +14556,12 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_get_file_delta_stream", _wrap_svn_fs_get_file_delta_stream},
{"SVN::_Fs::svn_fs_get_uuid", _wrap_svn_fs_get_uuid},
{"SVN::_Fs::svn_fs_set_uuid", _wrap_svn_fs_set_uuid},
+{"SVN::_Fs::svn_fs_lock_target_create", _wrap_svn_fs_lock_target_create},
+{"SVN::_Fs::svn_fs_lock_target_set_token", _wrap_svn_fs_lock_target_set_token},
+{"SVN::_Fs::svn_fs_lock_many", _wrap_svn_fs_lock_many},
{"SVN::_Fs::svn_fs_lock", _wrap_svn_fs_lock},
{"SVN::_Fs::svn_fs_generate_lock_token", _wrap_svn_fs_generate_lock_token},
+{"SVN::_Fs::svn_fs_unlock_many", _wrap_svn_fs_unlock_many},
{"SVN::_Fs::svn_fs_unlock", _wrap_svn_fs_unlock},
{"SVN::_Fs::svn_fs_get_lock", _wrap_svn_fs_get_lock},
{"SVN::_Fs::svn_fs_get_locks2", _wrap_svn_fs_get_locks2},
@@ -11929,28 +14570,49 @@ static swig_command_info swig_commands[] = {
{"SVN::_Fs::svn_fs_pack", _wrap_svn_fs_pack},
{"SVN::_Fs::svn_fs_verify", _wrap_svn_fs_verify},
{"SVN::_Fs::svn_fs_verify_root", _wrap_svn_fs_verify_root},
+{"SVN::_Fs::svn_fs_fsfs_info_t_fs_type_set", _wrap_svn_fs_fsfs_info_t_fs_type_set},
+{"SVN::_Fs::svn_fs_fsfs_info_t_fs_type_get", _wrap_svn_fs_fsfs_info_t_fs_type_get},
+{"SVN::_Fs::svn_fs_fsfs_info_t_shard_size_set", _wrap_svn_fs_fsfs_info_t_shard_size_set},
+{"SVN::_Fs::svn_fs_fsfs_info_t_shard_size_get", _wrap_svn_fs_fsfs_info_t_shard_size_get},
+{"SVN::_Fs::svn_fs_fsfs_info_t_min_unpacked_rev_set", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set},
+{"SVN::_Fs::svn_fs_fsfs_info_t_min_unpacked_rev_get", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get},
+{"SVN::_Fs::svn_fs_fsfs_info_t_log_addressing_set", _wrap_svn_fs_fsfs_info_t_log_addressing_set},
+{"SVN::_Fs::svn_fs_fsfs_info_t_log_addressing_get", _wrap_svn_fs_fsfs_info_t_log_addressing_get},
+{"SVN::_Fs::svn_fs_fsx_info_t_fs_type_set", _wrap_svn_fs_fsx_info_t_fs_type_set},
+{"SVN::_Fs::svn_fs_fsx_info_t_fs_type_get", _wrap_svn_fs_fsx_info_t_fs_type_get},
+{"SVN::_Fs::svn_fs_fsx_info_t_shard_size_set", _wrap_svn_fs_fsx_info_t_shard_size_set},
+{"SVN::_Fs::svn_fs_fsx_info_t_shard_size_get", _wrap_svn_fs_fsx_info_t_shard_size_get},
+{"SVN::_Fs::svn_fs_fsx_info_t_min_unpacked_rev_set", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_set},
+{"SVN::_Fs::svn_fs_fsx_info_t_min_unpacked_rev_get", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_get},
+{"SVN::_Fs::svn_fs_info_placeholder_t_fs_type_set", _wrap_svn_fs_info_placeholder_t_fs_type_set},
+{"SVN::_Fs::svn_fs_info_placeholder_t_fs_type_get", _wrap_svn_fs_info_placeholder_t_fs_type_get},
+{"SVN::_Fs::svn_fs_info", _wrap_svn_fs_info},
+{"SVN::_Fs::svn_fs_info_dup", _wrap_svn_fs_info_dup},
{"SVN::_Fs::svn_fs_invoke_warning_callback", _wrap_svn_fs_invoke_warning_callback},
+{"SVN::_Fs::svn_fs_invoke_upgrade_notify", _wrap_svn_fs_invoke_upgrade_notify},
{"SVN::_Fs::svn_fs_invoke_progress_notify_func", _wrap_svn_fs_invoke_progress_notify_func},
+{"SVN::_Fs::svn_fs_invoke_hotcopy_notify", _wrap_svn_fs_invoke_hotcopy_notify},
{"SVN::_Fs::svn_fs_invoke_freeze_func", _wrap_svn_fs_invoke_freeze_func},
{"SVN::_Fs::svn_fs_invoke_process_contents_func", _wrap_svn_fs_invoke_process_contents_func},
+{"SVN::_Fs::svn_fs_invoke_lock_callback", _wrap_svn_fs_invoke_lock_callback},
{"SVN::_Fs::svn_fs_invoke_get_locks_callback", _wrap_svn_fs_invoke_get_locks_callback},
{"SVN::_Fs::svn_fs_invoke_pack_notify", _wrap_svn_fs_invoke_pack_notify},
{0,0}
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -11960,17 +14622,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -12033,7 +14695,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -12232,122 +14894,182 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TYPE_BDB", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("bdb"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TYPE_FSFS", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fsfs"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TYPE_FSX", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fsx"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_BDB_TXN_NOSYNC", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("bdb-txn-nosync"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("bdb-log-autoremove"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_CACHE_DELTAS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("fsfs-cache-deltas"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("fsfs-cache-fulltexts"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_CACHE_REVPROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("fsfs-cache-revprops"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_CACHE_NS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("fsfs-cache-namespace"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FS_TYPE", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("fs-type"));
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_BLOCK_READ", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fsfs-block-read"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TYPE_BDB", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("bdb"));
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_SHARD_SIZE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fsfs-shard-size"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TYPE_FSFS", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_FromCharPtr("fsfs"));
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FSFS_LOG_ADDRESSING", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fsfs-log-addressing"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_FS_TYPE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("fs-type"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_PRE_1_4_COMPATIBLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("pre-1.4-compatible"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_PRE_1_5_COMPATIBLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("pre-1.5-compatible"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_PRE_1_6_COMPATIBLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("pre-1.6-compatible"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_PRE_1_8_COMPATIBLE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("pre-1.8-compatible"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_CONFIG_COMPATIBLE_VERSION", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_FromCharPtr("compatible-version"));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_upgrade_pack_revprops", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_upgrade_pack_revprops)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_upgrade_cleanup_revprops", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_upgrade_cleanup_revprops)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_upgrade_format_bumped", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_upgrade_format_bumped)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_node_unrelated", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_node_unrelated)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_node_unchanged", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_node_unchanged)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_fs_node_common_ancestor", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_node_common_ancestor)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TXN_CHECK_OOD", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00001)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TXN_CHECK_LOCKS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00002)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "SVN_FS_TXN_CLIENT_DATE", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00004)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_path_change_modify", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_path_change_modify)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_path_change_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_path_change_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_path_change_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_path_change_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_path_change_replace", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_path_change_replace)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_path_change_reset", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_path_change_reset)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_pack_notify_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_pack_notify_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_pack_notify_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_pack_notify_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_pack_notify_start_revprop", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_pack_notify_start_revprop)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_fs_pack_notify_end_revprop", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_fs_pack_notify_end_revprop)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/svn_ra.c b/subversion/bindings/swig/perl/native/svn_ra.c
index 3dd93ea..677a0fc 100644
--- a/subversion/bindings/swig/perl/native/svn_ra.c
+++ b/subversion/bindings/swig/perl/native/svn_ra.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1504,146 +1493,150 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t swig_types[8]
#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[9]
#define SWIGTYPE_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[10]
-#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[13]
-#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[14]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[15]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[42]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[43]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[44]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[45]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[46]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[47]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[48]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[49]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[50]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[52]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[54]
-#define SWIGTYPE_p_int swig_types[55]
-#define SWIGTYPE_p_long swig_types[56]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[57]
-#define SWIGTYPE_p_p_apr_file_t swig_types[58]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[59]
-#define SWIGTYPE_p_p_char swig_types[60]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[61]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[62]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[63]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[64]
-#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[65]
-#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[66]
-#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[67]
-#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[68]
-#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[69]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[70]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[71]
-#define SWIGTYPE_p_p_svn_string_t swig_types[72]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[73]
-#define SWIGTYPE_p_p_void swig_types[74]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[75]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[76]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[77]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[78]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[79]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[80]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[81]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[82]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[83]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[84]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[85]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[86]
-#define SWIGTYPE_p_svn_checksum_t swig_types[87]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[88]
-#define SWIGTYPE_p_svn_config_t swig_types[89]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[90]
-#define SWIGTYPE_p_svn_depth_t swig_types[91]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[92]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[93]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[94]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[95]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[96]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[97]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[98]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[99]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[100]
-#define SWIGTYPE_p_svn_diff_t swig_types[101]
-#define SWIGTYPE_p_svn_dirent_t swig_types[102]
-#define SWIGTYPE_p_svn_errno_t swig_types[103]
-#define SWIGTYPE_p_svn_error_t swig_types[104]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[105]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[106]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[107]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[108]
-#define SWIGTYPE_p_svn_lock_t swig_types[109]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[110]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[111]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[112]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[113]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[114]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[115]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[116]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[117]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[118]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[119]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[120]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[121]
-#define SWIGTYPE_p_svn_patch_t swig_types[122]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[123]
-#define SWIGTYPE_p_svn_prop_kind swig_types[124]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[125]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[126]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[127]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[128]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[129]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[130]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[131]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[132]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[133]
-#define SWIGTYPE_p_svn_stream_t swig_types[134]
-#define SWIGTYPE_p_svn_string_t swig_types[135]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[136]
-#define SWIGTYPE_p_svn_tristate_t swig_types[137]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[138]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[139]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[140]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[141]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[142]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[143]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[144]
-#define SWIGTYPE_p_svn_version_t swig_types[145]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[146]
-#define SWIGTYPE_p_unsigned_long swig_types[147]
-#define SWIGTYPE_p_void swig_types[148]
-static swig_type_info *swig_types[150];
-static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[11]
+#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[13]
+#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[44]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[45]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[46]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[47]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[48]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[49]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[50]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[51]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[53]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[57]
+#define SWIGTYPE_p_int swig_types[58]
+#define SWIGTYPE_p_long swig_types[59]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[60]
+#define SWIGTYPE_p_p_apr_file_t swig_types[61]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[62]
+#define SWIGTYPE_p_p_char swig_types[63]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[64]
+#define SWIGTYPE_p_p_f_p_void_p_void__void swig_types[65]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[66]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[67]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[68]
+#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[69]
+#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[70]
+#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[71]
+#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[72]
+#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[73]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[74]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[75]
+#define SWIGTYPE_p_p_svn_string_t swig_types[76]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[77]
+#define SWIGTYPE_p_p_void swig_types[78]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[79]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[80]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[81]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[82]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[83]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[84]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[85]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[86]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[87]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[88]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[89]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[90]
+#define SWIGTYPE_p_svn_checksum_t swig_types[91]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[92]
+#define SWIGTYPE_p_svn_config_t swig_types[93]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[94]
+#define SWIGTYPE_p_svn_depth_t swig_types[95]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[96]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[97]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[98]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[99]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[100]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[101]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[102]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[103]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[104]
+#define SWIGTYPE_p_svn_diff_t swig_types[105]
+#define SWIGTYPE_p_svn_dirent_t swig_types[106]
+#define SWIGTYPE_p_svn_errno_t swig_types[107]
+#define SWIGTYPE_p_svn_error_t swig_types[108]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[109]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[110]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[111]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[112]
+#define SWIGTYPE_p_svn_lock_t swig_types[113]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[114]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[115]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[116]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[117]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[118]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[119]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[120]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[121]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[122]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[123]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[124]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[125]
+#define SWIGTYPE_p_svn_patch_t swig_types[126]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[127]
+#define SWIGTYPE_p_svn_prop_kind swig_types[128]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[129]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[130]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[131]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[132]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[133]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[134]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[135]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[136]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[137]
+#define SWIGTYPE_p_svn_stream_t swig_types[138]
+#define SWIGTYPE_p_svn_string_t swig_types[139]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[140]
+#define SWIGTYPE_p_svn_tristate_t swig_types[141]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[142]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[143]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[144]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[145]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[146]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[147]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[148]
+#define SWIGTYPE_p_svn_version_t swig_types[149]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[150]
+#define SWIGTYPE_p_unsigned_long swig_types[151]
+#define SWIGTYPE_p_void swig_types[152]
+static swig_type_info *swig_types[154];
+static swig_module_info swig_module = {swig_types, 153, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1654,7 +1647,7 @@ static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
#define SWIG_name "SVN::_Ra::boot_SVN___Ra"
#define SWIG_prefix "SVN::_Ra::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2277,6 +2270,21 @@ static svn_error_t * svn_ra_invoke_replay_revfinish_callback(
return _obj(revision, replay_baton, editor, edit_baton, rev_props, pool);
}
+static svn_boolean_t svn_ra_invoke_check_tunnel_func(
+ svn_ra_check_tunnel_func_t _obj, void *tunnel_baton, const char *tunnel_name) {
+ return _obj(tunnel_baton, tunnel_name);
+}
+
+static void svn_ra_invoke_close_tunnel_func(
+ svn_ra_close_tunnel_func_t _obj, void *close_baton, void *tunnel_baton) {
+ _obj(close_baton, tunnel_baton);
+}
+
+static svn_error_t * svn_ra_invoke_open_tunnel_func(
+ svn_ra_open_tunnel_func_t _obj, 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) {
+ return _obj(request, response, close_func, close_baton, tunnel_baton, tunnel_name, user, hostname, port, cancel_func, cancel_baton, pool);
+}
+
static svn_error_t * svn_ra_invoke_init_func(
svn_ra_init_func_t _obj, int abi_version, apr_pool_t *pool, apr_hash_t *hash) {
return _obj(abi_version, pool, hash);
@@ -4164,6 +4172,197 @@ XS(_wrap_svn_ra_callbacks2_t_get_wc_contents_get) {
}
+XS(_wrap_svn_ra_callbacks2_t_check_tunnel_func_set) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_check_tunnel_func_set(self,check_tunnel_func);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_check_tunnel_func_set" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ra_callbacks2_t_check_tunnel_func_set" "', argument " "2"" of type '" "svn_ra_check_tunnel_func_t""'");
+ }
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_callbacks2_t_check_tunnel_func_get) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_ra_check_tunnel_func_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_check_tunnel_func_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_check_tunnel_func_get" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ ST(argvi) = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_void_p_q_const__char__int); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_callbacks2_t_open_tunnel_func_set) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_open_tunnel_func_set(self,open_tunnel_func);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_open_tunnel_func_set" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(1), (void**)(&arg2), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ra_callbacks2_t_open_tunnel_func_set" "', argument " "2"" of type '" "svn_ra_open_tunnel_func_t""'");
+ }
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_callbacks2_t_open_tunnel_func_get) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_ra_open_tunnel_func_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_open_tunnel_func_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_open_tunnel_func_get" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ ST(argvi) = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_callbacks2_t_tunnel_baton_set) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_tunnel_baton_set(self,tunnel_baton);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_tunnel_baton_set" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_ra_callbacks2_t_tunnel_baton_set" "', argument " "2"" of type '" "void *""'");
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_callbacks2_t_tunnel_baton_get) {
+ {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ void *result = 0 ;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_ra_callbacks2_t_tunnel_baton_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_ra_callbacks2_t_tunnel_baton_get" "', argument " "1"" of type '" "struct svn_ra_callbacks2_t *""'");
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (void *) ((arg1)->tunnel_baton);
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_new_svn_ra_callbacks2_t) {
{
int argvi = 0;
@@ -4669,6 +4868,7 @@ XS(_wrap_svn_ra_initialize) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_ra_initialize(pool);");
@@ -4719,6 +4919,7 @@ XS(_wrap_svn_ra_create_callbacks) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -4791,6 +4992,7 @@ XS(_wrap_svn_ra_open4) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -4909,6 +5111,7 @@ XS(_wrap_svn_ra_open3) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -5013,6 +5216,7 @@ XS(_wrap_svn_ra_open2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -5107,6 +5311,7 @@ XS(_wrap_svn_ra_open) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -5118,7 +5323,7 @@ XS(_wrap_svn_ra_open) {
}
arg2 = (char *)(buf2);
{
- svn_ra_make_callbacks(&arg3, &arg4, ST(1), _global_pool);
+ svn_swig_pl_make_callbacks(&arg3, &arg4, ST(1), _global_pool);
}
{
arg5 = svn_swig_pl_objs_to_hash_by_name (ST(2), "svn_config_t *",
@@ -5184,6 +5389,7 @@ XS(_wrap_svn_ra_reparent) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reparent(ra_session,url,pool);");
@@ -5251,6 +5457,7 @@ XS(_wrap_svn_ra_get_session_url) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -5325,6 +5532,7 @@ XS(_wrap_svn_ra_get_path_relative_to_session) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -5406,6 +5614,7 @@ XS(_wrap_svn_ra_get_path_relative_to_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -5484,6 +5693,7 @@ XS(_wrap_svn_ra_get_latest_revnum) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -5557,6 +5767,7 @@ XS(_wrap_svn_ra_get_dated_revision) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -5644,6 +5855,7 @@ XS(_wrap_svn_ra_change_rev_prop2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_change_rev_prop2(session,rev,name,old_value_p,value,pool);");
@@ -5751,6 +5963,7 @@ XS(_wrap_svn_ra_change_rev_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_ra_change_rev_prop(session,rev,name,value,pool);");
@@ -5839,6 +6052,7 @@ XS(_wrap_svn_ra_rev_proplist) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -5919,6 +6133,7 @@ XS(_wrap_svn_ra_rev_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 3) || (items > 4)) {
@@ -6012,6 +6227,7 @@ XS(_wrap_svn_ra_get_commit_editor3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6024,8 +6240,10 @@ XS(_wrap_svn_ra_get_commit_editor3) {
}
arg1 = (svn_ra_session_t *)(argp1);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(1), _global_pool);
}
{
@@ -6121,6 +6339,7 @@ XS(_wrap_svn_ra_get_commit_editor2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6230,6 +6449,7 @@ XS(_wrap_svn_ra_get_commit_editor) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6338,6 +6558,7 @@ XS(_wrap_svn_ra_get_file) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
arg6 = &temp6;
@@ -6361,6 +6582,7 @@ XS(_wrap_svn_ra_get_file) {
arg3 = (svn_revnum_t)(val3);
{
svn_swig_pl_make_stream (&arg4, ST(3));
+ SPAGAIN;
}
if (items > 4) {
@@ -6447,6 +6669,7 @@ XS(_wrap_svn_ra_get_dir2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6561,6 +6784,7 @@ XS(_wrap_svn_ra_get_dir) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
arg5 = &temp5;
@@ -6666,6 +6890,7 @@ XS(_wrap_svn_ra_get_mergeinfo) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
@@ -6677,7 +6902,7 @@ XS(_wrap_svn_ra_get_mergeinfo) {
}
arg1 = (svn_ra_session_t *)(argp1);
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg3 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
@@ -6786,9 +7011,11 @@ XS(_wrap_svn_ra_do_update3) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6826,7 +7053,7 @@ XS(_wrap_svn_ra_do_update3) {
}
arg8 = (svn_boolean_t)(val8);
{
- svn_delta_make_editor(&arg9, &arg10, ST(6), _global_pool);
+ svn_swig_pl_make_editor(&arg9, &arg10, ST(6), _global_pool);
}
if (items > 7) {
@@ -6921,6 +7148,7 @@ XS(_wrap_svn_ra_do_update2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -6953,7 +7181,7 @@ XS(_wrap_svn_ra_do_update2) {
}
arg7 = (svn_boolean_t)(val7);
{
- svn_delta_make_editor(&arg8, &arg9, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg8, &arg9, ST(5), _global_pool);
}
if (items > 6) {
@@ -7038,6 +7266,7 @@ XS(_wrap_svn_ra_do_update) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7065,7 +7294,7 @@ XS(_wrap_svn_ra_do_update) {
}
arg6 = (svn_boolean_t)(val6);
{
- svn_delta_make_editor(&arg7, &arg8, ST(4), _global_pool);
+ svn_swig_pl_make_editor(&arg7, &arg8, ST(4), _global_pool);
}
if (items > 5) {
@@ -7159,9 +7388,11 @@ XS(_wrap_svn_ra_do_switch3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7204,7 +7435,7 @@ XS(_wrap_svn_ra_do_switch3) {
}
arg9 = (svn_boolean_t)(val9);
{
- svn_delta_make_editor(&arg10, &arg11, ST(7), _global_pool);
+ svn_swig_pl_make_editor(&arg10, &arg11, ST(7), _global_pool);
}
if (items > 8) {
@@ -7302,6 +7533,7 @@ XS(_wrap_svn_ra_do_switch2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7334,7 +7566,7 @@ XS(_wrap_svn_ra_do_switch2) {
}
arg7 = (char *)(buf7);
{
- svn_delta_make_editor(&arg8, &arg9, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg8, &arg9, ST(5), _global_pool);
}
if (items > 6) {
@@ -7423,6 +7655,7 @@ XS(_wrap_svn_ra_do_switch) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7455,7 +7688,7 @@ XS(_wrap_svn_ra_do_switch) {
}
arg7 = (char *)(buf7);
{
- svn_delta_make_editor(&arg8, &arg9, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg8, &arg9, ST(5), _global_pool);
}
if (items > 6) {
@@ -7540,6 +7773,7 @@ XS(_wrap_svn_ra_do_status2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7567,7 +7801,7 @@ XS(_wrap_svn_ra_do_status2) {
}
arg6 = (svn_depth_t)(val6);
{
- svn_delta_make_editor(&arg7, &arg8, ST(4), _global_pool);
+ svn_swig_pl_make_editor(&arg7, &arg8, ST(4), _global_pool);
}
if (items > 5) {
@@ -7650,6 +7884,7 @@ XS(_wrap_svn_ra_do_status) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7677,7 +7912,7 @@ XS(_wrap_svn_ra_do_status) {
}
arg6 = (svn_boolean_t)(val6);
{
- svn_delta_make_editor(&arg7, &arg8, ST(4), _global_pool);
+ svn_swig_pl_make_editor(&arg7, &arg8, ST(4), _global_pool);
}
if (items > 5) {
@@ -7770,6 +8005,7 @@ XS(_wrap_svn_ra_do_diff3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7812,7 +8048,7 @@ XS(_wrap_svn_ra_do_diff3) {
}
arg9 = (char *)(buf9);
{
- svn_delta_make_editor(&arg10, &arg11, ST(7), _global_pool);
+ svn_swig_pl_make_editor(&arg10, &arg11, ST(7), _global_pool);
}
if (items > 8) {
@@ -7911,6 +8147,7 @@ XS(_wrap_svn_ra_do_diff2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -7953,7 +8190,7 @@ XS(_wrap_svn_ra_do_diff2) {
}
arg9 = (char *)(buf9);
{
- svn_delta_make_editor(&arg10, &arg11, ST(7), _global_pool);
+ svn_swig_pl_make_editor(&arg10, &arg11, ST(7), _global_pool);
}
if (items > 8) {
@@ -8049,6 +8286,7 @@ XS(_wrap_svn_ra_do_diff) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -8086,7 +8324,7 @@ XS(_wrap_svn_ra_do_diff) {
}
arg8 = (char *)(buf8);
{
- svn_delta_make_editor(&arg9, &arg10, ST(6), _global_pool);
+ svn_swig_pl_make_editor(&arg9, &arg10, ST(6), _global_pool);
}
if (items > 7) {
@@ -8179,6 +8417,7 @@ XS(_wrap_svn_ra_get_log2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_ra_get_log2(session,paths,start,end,limit,discover_changed_paths,strict_node_history,include_merged_revisions,revprops,receiver,receiver_baton,pool);");
@@ -8189,7 +8428,7 @@ XS(_wrap_svn_ra_get_log2) {
}
arg1 = (svn_ra_session_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8223,11 +8462,11 @@ XS(_wrap_svn_ra_get_log2) {
}
arg8 = (svn_boolean_t)(val8);
{
- arg9 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg9 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
{
- arg10 = svn_swig_pl_thunk_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg11 = ST(9);
}
if (items > 10) {
@@ -8313,6 +8552,7 @@ XS(_wrap_svn_ra_get_log) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_ra_get_log(session,paths,start,end,limit,discover_changed_paths,strict_node_history,receiver,receiver_baton,pool);");
@@ -8323,7 +8563,7 @@ XS(_wrap_svn_ra_get_log) {
}
arg1 = (svn_ra_session_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8352,7 +8592,7 @@ XS(_wrap_svn_ra_get_log) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = svn_swig_pl_thunk_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg9 = ST(7);
}
if (items > 8) {
@@ -8426,6 +8666,7 @@ XS(_wrap_svn_ra_check_path) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 3) || (items > 4)) {
@@ -8516,6 +8757,7 @@ XS(_wrap_svn_ra_stat) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 3) || (items > 4)) {
@@ -8596,6 +8838,7 @@ XS(_wrap_svn_ra_get_uuid2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -8666,6 +8909,7 @@ XS(_wrap_svn_ra_get_uuid) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -8736,6 +8980,7 @@ XS(_wrap_svn_ra_get_repos_root2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -8806,6 +9051,7 @@ XS(_wrap_svn_ra_get_repos_root) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -8886,6 +9132,7 @@ XS(_wrap_svn_ra_get_locations) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -8993,6 +9240,7 @@ XS(_wrap_svn_ra_get_location_segments) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_ra_get_location_segments(session,path,peg_revision,start_rev,end_rev,receiver,receiver_baton,pool);");
@@ -9109,6 +9357,7 @@ XS(_wrap_svn_ra_get_file_revs2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_ra_get_file_revs2(session,path,start,end,include_merged_revisions,handler,handler_baton,pool);");
@@ -9222,6 +9471,7 @@ XS(_wrap_svn_ra_get_file_revs) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_ra_get_file_revs(session,path,start,end,handler,handler_baton,pool);");
@@ -9325,6 +9575,7 @@ XS(_wrap_svn_ra_lock) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_lock(session,path_revs,comment,steal_lock,lock_func,lock_baton,pool);");
@@ -9348,7 +9599,7 @@ XS(_wrap_svn_ra_lock) {
}
arg4 = (svn_boolean_t)(val4);
{
- arg5 = svn_swig_pl_ra_lock_callback;
+ arg5 = (svn_ra_lock_callback_t) svn_swig_pl_ra_lock_callback;
arg6 = ST(4);
}
if (items > 5) {
@@ -9412,6 +9663,7 @@ XS(_wrap_svn_ra_unlock) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_ra_unlock(session,path_tokens,break_lock,lock_func,lock_baton,pool);");
@@ -9430,7 +9682,7 @@ XS(_wrap_svn_ra_unlock) {
}
arg3 = (svn_boolean_t)(val3);
{
- arg4 = svn_swig_pl_ra_lock_callback;
+ arg4 = (svn_ra_lock_callback_t) svn_swig_pl_ra_lock_callback;
arg5 = ST(3);
}
if (items > 4) {
@@ -9492,6 +9744,7 @@ XS(_wrap_svn_ra_get_lock) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -9572,6 +9825,7 @@ XS(_wrap_svn_ra_get_locks2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -9656,6 +9910,7 @@ XS(_wrap_svn_ra_get_locks) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -9743,6 +9998,7 @@ XS(_wrap_svn_ra_replay_range) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_ra_replay_range(session,start_revision,end_revision,low_water_mark,send_deltas,revstart_func,revfinish_func,replay_baton,pool);");
@@ -9862,6 +10118,7 @@ XS(_wrap_svn_ra_replay) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_replay(session,revision,low_water_mark,send_deltas,editor,edit_baton,pool);");
@@ -9887,7 +10144,7 @@ XS(_wrap_svn_ra_replay) {
}
arg4 = (svn_boolean_t)(val4);
{
- svn_delta_make_editor(&arg5, &arg6, ST(4), _global_pool);
+ svn_swig_pl_make_editor(&arg5, &arg6, ST(4), _global_pool);
}
if (items > 5) {
@@ -9957,6 +10214,7 @@ XS(_wrap_svn_ra_get_deleted_rev) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -10055,9 +10313,11 @@ XS(_wrap_svn_ra_get_inherited_props) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 5)) {
@@ -10154,6 +10414,7 @@ XS(_wrap_svn_ra_has_capability) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -10226,6 +10487,7 @@ XS(_wrap_svn_ra_print_modules) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_ra_print_modules(output,pool);");
@@ -10233,6 +10495,7 @@ XS(_wrap_svn_ra_print_modules) {
{
apr_size_t len;
char *buf;
+ apr_pool_t *pool;
if (!SvOK(ST(0))) {
arg1 = NULL;
@@ -10240,8 +10503,9 @@ XS(_wrap_svn_ra_print_modules) {
buf = SvPV(ST(0), len);
/* Another case of ugly pool handling, this should use the current
default pool, or make a new one if it doesn't exist yet */
- arg1 = svn_stringbuf_ncreate(buf,len,
- svn_swig_pl_make_pool ((SV *)NULL));
+ pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ arg1 = svn_stringbuf_ncreate(buf,len, pool);
} else {
croak("Not a string");
}
@@ -10296,6 +10560,7 @@ XS(_wrap_svn_ra_print_ra_libraries) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -11843,6 +12108,7 @@ XS(_wrap_svn_ra_init_ra_libs) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -11905,6 +12171,7 @@ XS(_wrap_svn_ra_get_ra_library) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -11994,6 +12261,7 @@ XS(_wrap_svn_ra_reporter3_invoke_set_path) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_ra_reporter3_invoke_set_path(_obj,report_baton,path,revision,depth,start_empty,lock_token,pool);");
@@ -12099,6 +12367,7 @@ XS(_wrap_svn_ra_reporter3_invoke_delete_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_ra_reporter3_invoke_delete_path(_obj,report_baton,path,pool);");
@@ -12193,6 +12462,7 @@ XS(_wrap_svn_ra_reporter3_invoke_link_path) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_ra_reporter3_invoke_link_path(_obj,report_baton,path,url,revision,depth,start_empty,lock_token,pool);");
@@ -12301,6 +12571,7 @@ XS(_wrap_svn_ra_reporter3_invoke_finish_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter3_invoke_finish_report(_obj,report_baton,pool);");
@@ -12367,6 +12638,7 @@ XS(_wrap_svn_ra_reporter3_invoke_abort_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter3_invoke_abort_report(_obj,report_baton,pool);");
@@ -12447,6 +12719,7 @@ XS(_wrap_svn_ra_reporter2_invoke_set_path) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_ra_reporter2_invoke_set_path(_obj,report_baton,path,revision,start_empty,lock_token,pool);");
@@ -12545,6 +12818,7 @@ XS(_wrap_svn_ra_reporter2_invoke_delete_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_ra_reporter2_invoke_delete_path(_obj,report_baton,path,pool);");
@@ -12636,6 +12910,7 @@ XS(_wrap_svn_ra_reporter2_invoke_link_path) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_ra_reporter2_invoke_link_path(_obj,report_baton,path,url,revision,start_empty,lock_token,pool);");
@@ -12737,6 +13012,7 @@ XS(_wrap_svn_ra_reporter2_invoke_finish_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter2_invoke_finish_report(_obj,report_baton,pool);");
@@ -12803,6 +13079,7 @@ XS(_wrap_svn_ra_reporter2_invoke_abort_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter2_invoke_abort_report(_obj,report_baton,pool);");
@@ -12879,6 +13156,7 @@ XS(_wrap_svn_ra_reporter_invoke_set_path) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_reporter_invoke_set_path(_obj,report_baton,path,revision,start_empty,pool);");
@@ -12970,6 +13248,7 @@ XS(_wrap_svn_ra_reporter_invoke_delete_path) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_ra_reporter_invoke_delete_path(_obj,report_baton,path,pool);");
@@ -13057,6 +13336,7 @@ XS(_wrap_svn_ra_reporter_invoke_link_path) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_ra_reporter_invoke_link_path(_obj,report_baton,path,url,revision,start_empty,pool);");
@@ -13151,6 +13431,7 @@ XS(_wrap_svn_ra_reporter_invoke_finish_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter_invoke_finish_report(_obj,report_baton,pool);");
@@ -13217,6 +13498,7 @@ XS(_wrap_svn_ra_reporter_invoke_abort_report) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_ra_reporter_invoke_abort_report(_obj,report_baton,pool);");
@@ -13285,6 +13567,7 @@ XS(_wrap_svn_ra_callbacks2_invoke_open_tmp_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -13359,6 +13642,7 @@ XS(_wrap_svn_ra_callbacks_invoke_open_tmp_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -13438,6 +13722,7 @@ XS(_wrap_svn_ra_plugin_invoke_open) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -13454,7 +13739,7 @@ XS(_wrap_svn_ra_plugin_invoke_open) {
}
arg3 = (char *)(buf3);
{
- svn_ra_make_callbacks(&arg4, &arg5, ST(2), _global_pool);
+ svn_swig_pl_make_callbacks(&arg4, &arg5, ST(2), _global_pool);
}
{
arg6 = svn_swig_pl_objs_to_hash_by_name (ST(3), "svn_config_t *",
@@ -13523,6 +13808,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_latest_revnum) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -13604,6 +13890,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_dated_revision) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 3) || (items > 4)) {
@@ -13695,6 +13982,7 @@ XS(_wrap_svn_ra_plugin_invoke_change_rev_prop) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_plugin_invoke_change_rev_prop(_obj,session_baton,rev,name,value,pool);");
@@ -13791,6 +14079,7 @@ XS(_wrap_svn_ra_plugin_invoke_rev_proplist) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 3) || (items > 4)) {
@@ -13879,6 +14168,7 @@ XS(_wrap_svn_ra_plugin_invoke_rev_prop) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -13979,6 +14269,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_commit_editor) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -14082,6 +14373,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_file) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
arg7 = &temp7;
@@ -14109,6 +14401,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_file) {
arg4 = (svn_revnum_t)(val4);
{
svn_swig_pl_make_stream (&arg5, ST(4));
+ SPAGAIN;
}
if (items > 5) {
@@ -14196,6 +14489,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_dir) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
arg6 = &temp6;
@@ -14313,6 +14607,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_update) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -14344,7 +14639,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_update) {
}
arg7 = (svn_boolean_t)(val7);
{
- svn_delta_make_editor(&arg8, &arg9, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg8, &arg9, ST(5), _global_pool);
}
if (items > 6) {
@@ -14435,6 +14730,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_switch) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -14471,7 +14767,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_switch) {
}
arg8 = (char *)(buf8);
{
- svn_delta_make_editor(&arg9, &arg10, ST(6), _global_pool);
+ svn_swig_pl_make_editor(&arg9, &arg10, ST(6), _global_pool);
}
if (items > 7) {
@@ -14560,6 +14856,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_status) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -14591,7 +14888,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_status) {
}
arg7 = (svn_boolean_t)(val7);
{
- svn_delta_make_editor(&arg8, &arg9, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg8, &arg9, ST(5), _global_pool);
}
if (items > 6) {
@@ -14685,6 +14982,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_diff) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -14726,7 +15024,7 @@ XS(_wrap_svn_ra_plugin_invoke_do_diff) {
}
arg9 = (char *)(buf9);
{
- svn_delta_make_editor(&arg10, &arg11, ST(7), _global_pool);
+ svn_swig_pl_make_editor(&arg10, &arg11, ST(7), _global_pool);
}
if (items > 8) {
@@ -14816,6 +15114,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_log) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_ra_plugin_invoke_get_log(_obj,session_baton,paths,start,end,discover_changed_paths,strict_node_history,receiver,receiver_baton,pool);");
@@ -14830,7 +15129,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_log) {
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_ra_plugin_invoke_get_log" "', argument " "2"" of type '" "void *""'");
}
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(2),
+ arg3 = svn_swig_pl_strings_to_array(ST(2),
_global_pool);
}
ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
@@ -14854,7 +15153,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_log) {
}
arg7 = (svn_boolean_t)(val7);
{
- arg8 = svn_swig_pl_thunk_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg9 = ST(7);
}
if (items > 8) {
@@ -14930,6 +15229,7 @@ XS(_wrap_svn_ra_plugin_invoke_check_path) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -15021,6 +15321,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_uuid) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -15099,6 +15400,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_repos_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -15187,6 +15489,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_locations) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 5) || (items > 6)) {
@@ -15299,6 +15602,7 @@ XS(_wrap_svn_ra_plugin_invoke_get_file_revs) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_ra_plugin_invoke_get_file_revs(_obj,session_baton,path,start,end,handler,handler_baton,pool);");
@@ -15441,6 +15745,7 @@ XS(_wrap_svn_ra_invoke_get_wc_prop_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -15540,6 +15845,7 @@ XS(_wrap_svn_ra_invoke_set_wc_prop_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_invoke_set_wc_prop_func(_obj,baton,path,name,value,pool);");
@@ -15640,6 +15946,7 @@ XS(_wrap_svn_ra_invoke_push_wc_prop_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_invoke_push_wc_prop_func(_obj,baton,path,name,value,pool);");
@@ -15738,6 +16045,7 @@ XS(_wrap_svn_ra_invoke_invalidate_wc_props_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_ra_invoke_invalidate_wc_props_func(_obj,baton,path,name,pool);");
@@ -15822,6 +16130,7 @@ XS(_wrap_svn_ra_invoke_get_wc_contents_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 3) || (items > 4)) {
@@ -15868,7 +16177,11 @@ XS(_wrap_svn_ra_invoke_get_wc_contents_func) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg3); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg3);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -15969,6 +16282,7 @@ XS(_wrap_svn_ra_invoke_get_client_string_func) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 2) || (items > 3)) {
@@ -16061,6 +16375,7 @@ XS(_wrap_svn_ra_invoke_file_rev_handler) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
arg7 = &temp7;
@@ -16179,6 +16494,7 @@ XS(_wrap_svn_ra_invoke_lock_callback) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_ra_invoke_lock_callback(_obj,baton,path,do_lock,lock,ra_err,pool);");
@@ -16277,6 +16593,7 @@ XS(_wrap_svn_ra_invoke_progress_notify_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_ra_invoke_progress_notify_func(_obj,progress,total,baton,pool);");
@@ -16351,6 +16668,7 @@ XS(_wrap_svn_ra_invoke_replay_revstart_callback) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
arg5 = &temp5;
@@ -16450,6 +16768,7 @@ XS(_wrap_svn_ra_invoke_replay_revfinish_callback) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_ra_invoke_replay_revfinish_callback(_obj,revision,replay_baton,editor,edit_baton,rev_props,pool);");
@@ -16470,7 +16789,7 @@ XS(_wrap_svn_ra_invoke_replay_revfinish_callback) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_ra_invoke_replay_revfinish_callback" "', argument " "3"" of type '" "void *""'");
}
{
- svn_delta_make_editor(&arg4, &arg5, ST(3), _global_pool);
+ svn_swig_pl_make_editor(&arg4, &arg5, ST(3), _global_pool);
}
res6 = SWIG_ConvertPtr(ST(4), &argp6,SWIGTYPE_p_apr_hash_t, 0 | 0 );
if (!SWIG_IsOK(res6)) {
@@ -16519,6 +16838,271 @@ XS(_wrap_svn_ra_invoke_replay_revfinish_callback) {
}
+XS(_wrap_svn_ra_invoke_check_tunnel_func) {
+ {
+ svn_ra_check_tunnel_func_t arg1 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ int res2 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int argvi = 0;
+ svn_boolean_t result;
+ dXSARGS;
+
+ if ((items < 3) || (items > 3)) {
+ SWIG_croak("Usage: svn_ra_invoke_check_tunnel_func(_obj,tunnel_baton,tunnel_name);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ra_invoke_check_tunnel_func" "', argument " "1"" of type '" "svn_ra_check_tunnel_func_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_ra_invoke_check_tunnel_func" "', argument " "2"" of type '" "void *""'");
+ }
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_ra_invoke_check_tunnel_func" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ {
+ result = (svn_boolean_t)svn_ra_invoke_check_tunnel_func(arg1,arg2,(char const *)arg3);
+
+
+
+ }
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_invoke_close_tunnel_func) {
+ {
+ svn_ra_close_tunnel_func_t arg1 = (svn_ra_close_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *arg3 = (void *) 0 ;
+ int res2 ;
+ int res3 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 3) || (items > 3)) {
+ SWIG_croak("Usage: svn_ra_invoke_close_tunnel_func(_obj,close_baton,tunnel_baton);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_void__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ra_invoke_close_tunnel_func" "', argument " "1"" of type '" "svn_ra_close_tunnel_func_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_ra_invoke_close_tunnel_func" "', argument " "2"" of type '" "void *""'");
+ }
+ res3 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg3), 0, 0);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_ra_invoke_close_tunnel_func" "', argument " "3"" of type '" "void *""'");
+ }
+ {
+ svn_ra_invoke_close_tunnel_func(arg1,arg2,arg3);
+
+
+
+ }
+ ST(argvi) = sv_newmortal();
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_ra_invoke_open_tunnel_func) {
+ {
+ svn_ra_open_tunnel_func_t arg1 = (svn_ra_open_tunnel_func_t) 0 ;
+ svn_stream_t **arg2 = (svn_stream_t **) 0 ;
+ svn_stream_t **arg3 = (svn_stream_t **) 0 ;
+ svn_ra_close_tunnel_func_t *arg4 = (svn_ra_close_tunnel_func_t *) 0 ;
+ void **arg5 = (void **) 0 ;
+ void *arg6 = (void *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_stream_t *temp2 ;
+ svn_stream_t *temp3 ;
+ svn_ra_close_tunnel_func_t temp4 ;
+ void *temp5 ;
+ int res6 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int res9 ;
+ char *buf9 = 0 ;
+ int alloc9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg2 = &temp2;
+ arg3 = &temp3;
+ arg4 = &temp4;
+ arg5 = &temp5;
+ if ((items < 7) || (items > 8)) {
+ SWIG_croak("Usage: svn_ra_invoke_open_tunnel_func(_obj,tunnel_baton,tunnel_name,user,hostname,port,cancel_func,cancel_baton,pool);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "1"" of type '" "svn_ra_open_tunnel_func_t""'");
+ }
+ }
+ res6 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg6), 0, 0);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "6"" of type '" "void *""'");
+ }
+ res7 = SWIG_AsCharPtrAndSize(ST(2), &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "7"" of type '" "char const *""'");
+ }
+ arg7 = (char *)(buf7);
+ res8 = SWIG_AsCharPtrAndSize(ST(3), &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "8"" of type '" "char const *""'");
+ }
+ arg8 = (char *)(buf8);
+ res9 = SWIG_AsCharPtrAndSize(ST(4), &buf9, NULL, &alloc9);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "9"" of type '" "char const *""'");
+ }
+ arg9 = (char *)(buf9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_ra_invoke_open_tunnel_func" "', argument " "10"" of type '" "int""'");
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(6);
+ }
+ if (items > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_ra_invoke_open_tunnel_func(arg1,arg2,arg3,arg4,arg5,arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg2);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
+ }
+ {
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg3);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_ra_invoke_open_tunnel_func arg 4 (svn_ra_close_tunnel_func_t *) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_ra_invoke_open_tunnel_func is not implemented yet");
+
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_ra_invoke_open_tunnel_func arg 5 (void **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_ra_invoke_open_tunnel_func is not implemented yet");
+
+ }
+
+
+
+
+
+
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_ra_invoke_init_func) {
{
svn_ra_init_func_t arg1 = (svn_ra_init_func_t) 0 ;
@@ -16534,6 +17118,7 @@ XS(_wrap_svn_ra_invoke_init_func) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 4)) {
SWIG_croak("Usage: svn_ra_invoke_init_func(_obj,abi_version,pool,hash);");
@@ -16554,8 +17139,10 @@ XS(_wrap_svn_ra_invoke_init_func) {
}
if (items > 3) {
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
}
@@ -16610,6 +17197,7 @@ static swig_type_info _swigt__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void
static swig_type_info _swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t = {"_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t", "struct svn_error_t *(*)(int,apr_pool_t *,apr_hash_t *)|svn_ra_init_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)|struct svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)|svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_location_segment_t *,void *,apr_pool_t *)|svn_location_segment_receiver_t", 0, 0, (void*)0, 0};
@@ -16626,6 +17214,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_stream_t **,svn_checksum_t const *,apr_pool_t *)|svn_ra_get_wc_contents_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,char const *,apr_pool_t *)|struct svn_error_t *(*)(void *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,apr_pool_t *)|svn_ra_invalidate_wc_props_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,svn_string_t const **,apr_pool_t *)|svn_ra_get_wc_prop_func_t", 0, 0, (void*)0, 0};
@@ -16647,6 +17236,7 @@ static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t__p_svn_error_t", "svn_ra_get_latest_revnum_func_t|struct svn_error_t *(*)(void *,svn_revnum_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_void__void = {"_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t|void (*)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -16661,6 +17251,7 @@ static swig_type_info _swigt__p_p_apr_file_t = {"_p_p_apr_file_t", "apr_file_t *
static swig_type_info _swigt__p_p_apr_hash_t = {"_p_p_apr_hash_t", "apr_hash_t **|svn_mergeinfo_catalog_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "svn_txdelta_window_handler_t *|struct svn_error_t *(**)(svn_txdelta_window_t *,void *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_void__void = {"_p_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t *|void (**)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_delta_editor_t = {"_p_p_svn_delta_editor_t", "struct svn_delta_editor_t **|svn_delta_editor_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_dirent_t = {"_p_p_svn_dirent_t", "struct svn_dirent_t **|svn_dirent_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_lock_t = {"_p_p_svn_lock_t", "struct svn_lock_t **|svn_lock_t **", 0, 0, (void*)0, 0};
@@ -16761,6 +17352,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -16777,6 +17369,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -16798,6 +17391,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_void__void,
&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -16812,6 +17406,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_apr_hash_t,
&_swigt__p_p_char,
&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_void__void,
&_swigt__p_p_svn_delta_editor_t,
&_swigt__p_p_svn_dirent_t,
&_swigt__p_p_svn_lock_t,
@@ -16912,6 +17507,7 @@ static swig_cast_info _swigc__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void[
static swig_cast_info _swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t[] = { {&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -16928,6 +17524,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -16949,6 +17546,7 @@ static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_void__void[] = { {&_swigt__p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -16963,6 +17561,7 @@ static swig_cast_info _swigc__p_p_apr_file_t[] = { {&_swigt__p_p_apr_file_t, 0,
static swig_cast_info _swigc__p_p_apr_hash_t[] = { {&_swigt__p_p_apr_hash_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_void__void[] = { {&_swigt__p_p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_delta_editor_t[] = { {&_swigt__p_p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_dirent_t[] = { {&_swigt__p_p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_lock_t[] = { {&_swigt__p_p_svn_lock_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17063,6 +17662,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -17079,6 +17679,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -17100,6 +17701,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_void__void,
_swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -17114,6 +17716,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_apr_hash_t,
_swigc__p_p_char,
_swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_void__void,
_swigc__p_p_svn_delta_editor_t,
_swigc__p_p_svn_dirent_t,
_swigc__p_p_svn_lock_t,
@@ -17275,6 +17878,12 @@ static swig_command_info swig_commands[] = {
{"SVN::_Ra::svn_ra_callbacks2_t_get_client_string_get", _wrap_svn_ra_callbacks2_t_get_client_string_get},
{"SVN::_Ra::svn_ra_callbacks2_t_get_wc_contents_set", _wrap_svn_ra_callbacks2_t_get_wc_contents_set},
{"SVN::_Ra::svn_ra_callbacks2_t_get_wc_contents_get", _wrap_svn_ra_callbacks2_t_get_wc_contents_get},
+{"SVN::_Ra::svn_ra_callbacks2_t_check_tunnel_func_set", _wrap_svn_ra_callbacks2_t_check_tunnel_func_set},
+{"SVN::_Ra::svn_ra_callbacks2_t_check_tunnel_func_get", _wrap_svn_ra_callbacks2_t_check_tunnel_func_get},
+{"SVN::_Ra::svn_ra_callbacks2_t_open_tunnel_func_set", _wrap_svn_ra_callbacks2_t_open_tunnel_func_set},
+{"SVN::_Ra::svn_ra_callbacks2_t_open_tunnel_func_get", _wrap_svn_ra_callbacks2_t_open_tunnel_func_get},
+{"SVN::_Ra::svn_ra_callbacks2_t_tunnel_baton_set", _wrap_svn_ra_callbacks2_t_tunnel_baton_set},
+{"SVN::_Ra::svn_ra_callbacks2_t_tunnel_baton_get", _wrap_svn_ra_callbacks2_t_tunnel_baton_get},
{"SVN::_Ra::new_svn_ra_callbacks2_t", _wrap_new_svn_ra_callbacks2_t},
{"SVN::_Ra::delete_svn_ra_callbacks2_t", _wrap_delete_svn_ra_callbacks2_t},
{"SVN::_Ra::svn_ra_callbacks_t_open_tmp_file_set", _wrap_svn_ra_callbacks_t_open_tmp_file_set},
@@ -17446,23 +18055,26 @@ static swig_command_info swig_commands[] = {
{"SVN::_Ra::svn_ra_invoke_progress_notify_func", _wrap_svn_ra_invoke_progress_notify_func},
{"SVN::_Ra::svn_ra_invoke_replay_revstart_callback", _wrap_svn_ra_invoke_replay_revstart_callback},
{"SVN::_Ra::svn_ra_invoke_replay_revfinish_callback", _wrap_svn_ra_invoke_replay_revfinish_callback},
+{"SVN::_Ra::svn_ra_invoke_check_tunnel_func", _wrap_svn_ra_invoke_check_tunnel_func},
+{"SVN::_Ra::svn_ra_invoke_close_tunnel_func", _wrap_svn_ra_invoke_close_tunnel_func},
+{"SVN::_Ra::svn_ra_invoke_open_tunnel_func", _wrap_svn_ra_invoke_open_tunnel_func},
{"SVN::_Ra::svn_ra_invoke_init_func", _wrap_svn_ra_invoke_init_func},
{0,0}
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -17472,17 +18084,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -17545,7 +18157,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -17744,52 +18356,52 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_DEPTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("depth"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_MERGEINFO", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("mergeinfo"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_LOG_REVPROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("log-revprops"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_PARTIAL_REPLAY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("partial-replay"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_COMMIT_REVPROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("commit-revprops"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_ATOMIC_REVPROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("atomic-revprops"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_INHERITED_PROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("inherited-props"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_EPHEMERAL_TXNPROPS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("ephemeral-txnprops"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("get-file-revs-reversed"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_RA_ABI_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(2)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/svn_repos.c b/subversion/bindings/swig/perl/native/svn_repos.c
index 08a8d95..8eb2cc0 100644
--- a/subversion/bindings/swig/perl/native/svn_repos.c
+++ b/subversion/bindings/swig/perl/native/svn_repos.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1514,123 +1503,132 @@ SWIG_Perl_SetModule(swig_module_info *module) {
#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[18]
#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
#define SWIGTYPE_p_f_p_void_p_q_const__char__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_int swig_types[29]
-#define SWIGTYPE_p_long swig_types[30]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[31]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[32]
-#define SWIGTYPE_p_p_char swig_types[33]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_p_svn_authz_t swig_types[35]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[36]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[37]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[38]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[39]
-#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[40]
-#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[41]
-#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[42]
-#define SWIGTYPE_p_p_svn_repos_t swig_types[43]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[44]
-#define SWIGTYPE_p_p_svn_string_t swig_types[45]
-#define SWIGTYPE_p_p_void swig_types[46]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[47]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[48]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[49]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[50]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[51]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[52]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[53]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[54]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[55]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[56]
-#define SWIGTYPE_p_svn_authz_t swig_types[57]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[58]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[59]
-#define SWIGTYPE_p_svn_checksum_t swig_types[60]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[61]
-#define SWIGTYPE_p_svn_config_t swig_types[62]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[63]
-#define SWIGTYPE_p_svn_depth_t swig_types[64]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[65]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[66]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[67]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[68]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[69]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[70]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[71]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[72]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[73]
-#define SWIGTYPE_p_svn_diff_t swig_types[74]
-#define SWIGTYPE_p_svn_dirent_t swig_types[75]
-#define SWIGTYPE_p_svn_errno_t swig_types[76]
-#define SWIGTYPE_p_svn_error_t swig_types[77]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[78]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[79]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[80]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[81]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[82]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[83]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[84]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[85]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[86]
-#define SWIGTYPE_p_svn_fs_t swig_types[87]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[88]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[89]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[90]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[91]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[92]
-#define SWIGTYPE_p_svn_lock_t swig_types[93]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[94]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[95]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[96]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[97]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[98]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[99]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[100]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[101]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[102]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[103]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[104]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[105]
-#define SWIGTYPE_p_svn_patch_t swig_types[106]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[107]
-#define SWIGTYPE_p_svn_prop_kind swig_types[108]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[109]
-#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[110]
-#define SWIGTYPE_p_svn_repos_node_t swig_types[111]
-#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[112]
-#define SWIGTYPE_p_svn_repos_notify_t swig_types[113]
-#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[114]
-#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[115]
-#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[116]
-#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[117]
-#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[118]
-#define SWIGTYPE_p_svn_repos_t swig_types[119]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[120]
-#define SWIGTYPE_p_svn_stream_t swig_types[121]
-#define SWIGTYPE_p_svn_string_t swig_types[122]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[123]
-#define SWIGTYPE_p_svn_tristate_t swig_types[124]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[125]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[126]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[127]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[128]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[129]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[130]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[131]
-#define SWIGTYPE_p_svn_version_t swig_types[132]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[133]
-#define SWIGTYPE_p_unsigned_long swig_types[134]
-#define SWIGTYPE_p_void swig_types[135]
-static swig_type_info *swig_types[137];
-static swig_module_info swig_module = {swig_types, 136, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_int swig_types[31]
+#define SWIGTYPE_p_long swig_types[32]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[33]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[34]
+#define SWIGTYPE_p_p_char swig_types[35]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_p_svn_authz_t swig_types[37]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[38]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[39]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[40]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[41]
+#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[42]
+#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[43]
+#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[44]
+#define SWIGTYPE_p_p_svn_repos_t swig_types[45]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[46]
+#define SWIGTYPE_p_p_svn_string_t swig_types[47]
+#define SWIGTYPE_p_p_svn_version_t swig_types[48]
+#define SWIGTYPE_p_p_void swig_types[49]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[50]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[51]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[52]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[53]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[54]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[55]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[56]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[57]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[58]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[59]
+#define SWIGTYPE_p_svn_authz_t swig_types[60]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[61]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[62]
+#define SWIGTYPE_p_svn_checksum_t swig_types[63]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[64]
+#define SWIGTYPE_p_svn_config_t swig_types[65]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[66]
+#define SWIGTYPE_p_svn_depth_t swig_types[67]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[68]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[69]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[70]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[71]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[72]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[73]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[74]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[75]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[76]
+#define SWIGTYPE_p_svn_diff_t swig_types[77]
+#define SWIGTYPE_p_svn_dirent_t swig_types[78]
+#define SWIGTYPE_p_svn_errno_t swig_types[79]
+#define SWIGTYPE_p_svn_error_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[84]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[85]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[86]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[87]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[88]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[89]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[90]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[91]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[92]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[93]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[94]
+#define SWIGTYPE_p_svn_fs_t swig_types[95]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[96]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[97]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[98]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[99]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[100]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[101]
+#define SWIGTYPE_p_svn_lock_t swig_types[102]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[103]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[104]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[105]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[106]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[107]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[108]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[109]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[110]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[111]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[112]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[113]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[114]
+#define SWIGTYPE_p_svn_patch_t swig_types[115]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[116]
+#define SWIGTYPE_p_svn_prop_kind swig_types[117]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[118]
+#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[119]
+#define SWIGTYPE_p_svn_repos_node_t swig_types[120]
+#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[121]
+#define SWIGTYPE_p_svn_repos_notify_t swig_types[122]
+#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[123]
+#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[124]
+#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[125]
+#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[126]
+#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[127]
+#define SWIGTYPE_p_svn_repos_t swig_types[128]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[129]
+#define SWIGTYPE_p_svn_stream_t swig_types[130]
+#define SWIGTYPE_p_svn_string_t swig_types[131]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[132]
+#define SWIGTYPE_p_svn_tristate_t swig_types[133]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[134]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[135]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[136]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[137]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[138]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[139]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[140]
+#define SWIGTYPE_p_svn_version_t swig_types[141]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[142]
+#define SWIGTYPE_p_unsigned_long swig_types[143]
+#define SWIGTYPE_p_void swig_types[144]
+static swig_type_info *swig_types[146];
+static swig_module_info swig_module = {swig_types, 145, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1641,7 +1639,7 @@ static swig_module_info swig_module = {swig_types, 136, 0, 0, 0, 0};
#define SWIG_name "SVN::_Repos::boot_SVN___Repos"
#define SWIG_prefix "SVN::_Repos::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2194,11 +2192,6 @@ static svn_error_t * svn_repos_invoke_authz_callback(
return _obj(required, allowed, root, path, baton, pool);
}
-static svn_error_t * svn_repos_invoke_file_rev_handler(
- svn_repos_file_rev_handler_t _obj, 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) {
- return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
-}
-
static void svn_repos_invoke_notify_func(
svn_repos_notify_func_t _obj, void *baton, const svn_repos_notify_t *notify, apr_pool_t *scratch_pool) {
_obj(baton, notify, scratch_pool);
@@ -2214,6 +2207,16 @@ static svn_error_t * svn_repos_invoke_history_func(
return _obj(baton, path, revision, pool);
}
+static svn_error_t * svn_repos_invoke_file_rev_handler(
+ svn_repos_file_rev_handler_t _obj, 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) {
+ return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
+}
+
+static svn_error_t * svn_repos_invoke_verify_callback(
+ svn_repos_verify_callback_t _obj, void *baton, svn_revnum_t revision, svn_error_t *verify_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, revision, verify_err, scratch_pool);
+}
+
#ifdef __cplusplus
extern "C" {
@@ -2591,10 +2594,9 @@ XS(_wrap_svn_repos_notify_t_shard_get) {
arg1 = (struct svn_repos_notify_t *)(argp1);
result = ((arg1)->shard);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -2873,6 +2875,136 @@ XS(_wrap_svn_repos_notify_t_path_get) {
}
+XS(_wrap_svn_repos_notify_t_start_revision_set) {
+ {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_repos_notify_t_start_revision_set(self,start_revision);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_notify_t_start_revision_set" "', argument " "1"" of type '" "struct svn_repos_notify_t *""'");
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_repos_notify_t_start_revision_set" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->start_revision = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_notify_t_start_revision_get) {
+ {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_revnum_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_repos_notify_t_start_revision_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_notify_t_start_revision_get" "', argument " "1"" of type '" "struct svn_repos_notify_t *""'");
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->start_revision);
+ ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_notify_t_end_revision_set) {
+ {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_repos_notify_t_end_revision_set(self,end_revision);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_notify_t_end_revision_set" "', argument " "1"" of type '" "struct svn_repos_notify_t *""'");
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_repos_notify_t_end_revision_set" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->end_revision = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_notify_t_end_revision_get) {
+ {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_revnum_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_repos_notify_t_end_revision_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_notify_t_end_revision_get" "', argument " "1"" of type '" "struct svn_repos_notify_t *""'");
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->end_revision);
+ ST(argvi) = SWIG_From_long SWIG_PERL_CALL_ARGS_1((long)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_notify_create) {
{
svn_repos_notify_action_t arg1 ;
@@ -2886,6 +3018,7 @@ XS(_wrap_svn_repos_notify_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_notify_create(action,result_pool);");
@@ -2930,6 +3063,7 @@ XS(_wrap_svn_repos_find_root_path) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_find_root_path(path,pool);");
@@ -2960,6 +3094,91 @@ XS(_wrap_svn_repos_find_root_path) {
}
+XS(_wrap_svn_repos_open3) {
+ {
+ svn_repos_t **arg1 = (svn_repos_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_repos_t *temp1 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 2) || (items > 4)) {
+ SWIG_croak("Usage: svn_repos_open3(path,fs_config,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_AsCharPtrAndSize(ST(0), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_open3" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ {
+ /* PERL-FIXME: Handle undef -> NULL. */
+ arg3 = svn_swig_pl_strings_to_hash(ST(1), _global_pool);
+ }
+ if (items > 2) {
+
+ }
+ if (items > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_open3(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_t, 0); argvi++ ;
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_open2) {
{
svn_repos_t **arg1 = (svn_repos_t **) 0 ;
@@ -2977,6 +3196,7 @@ XS(_wrap_svn_repos_open2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -3050,6 +3270,7 @@ XS(_wrap_svn_repos_open) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -3127,6 +3348,7 @@ XS(_wrap_svn_repos_create) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 5) || (items > 6)) {
@@ -3224,6 +3446,7 @@ XS(_wrap_svn_repos_upgrade2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_upgrade2(path,nonblocking,notify_func,notify_baton,pool);");
@@ -3310,6 +3533,7 @@ XS(_wrap_svn_repos_upgrade) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_upgrade(path,nonblocking,start_callback,start_callback_baton,pool);");
@@ -3390,6 +3614,7 @@ XS(_wrap_svn_repos_delete) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_delete(path,pool);");
@@ -3455,6 +3680,7 @@ XS(_wrap_svn_repos_has_capability) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 2) || (items > 3)) {
@@ -3516,6 +3742,147 @@ XS(_wrap_svn_repos_has_capability) {
}
+XS(_wrap_svn_repos_capabilities) {
+ {
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_repos_t *arg2 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ apr_hash_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_repos_capabilities(repos,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_capabilities" "', argument " "2"" of type '" "svn_repos_t *""'");
+ }
+ arg2 = (svn_repos_t *)(argp2);
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_capabilities(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_capabilities arg 1 (apr_hash_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_capabilities is not implemented yet");
+
+ }
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_remember_client_capabilities) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_repos_remember_client_capabilities(repos,capabilities);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_remember_client_capabilities" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_remember_client_capabilities" "', argument " "2"" of type '" "apr_array_header_t const *""'");
+ }
+ arg2 = (apr_array_header_t *)(argp2);
+ {
+ result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_fs) {
{
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -3549,15 +3916,61 @@ XS(_wrap_svn_repos_fs) {
}
-XS(_wrap_svn_repos_hotcopy2) {
+XS(_wrap_svn_repos_fs_type) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ char *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 1) || (items > 2)) {
+ SWIG_croak("Usage: svn_repos_fs_type(repos,result_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_fs_type" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ if (items > 1) {
+
+ }
+ {
+ result = (char *)svn_repos_fs_type(arg1,arg2);
+
+
+
+ }
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_hotcopy3) {
{
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
svn_boolean_t arg3 ;
svn_boolean_t arg4 ;
- svn_cancel_func_t arg5 = (svn_cancel_func_t) 0 ;
+ svn_repos_notify_func_t arg5 = (svn_repos_notify_func_t) 0 ;
void *arg6 = (void *) 0 ;
- apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res1 ;
char *buf1 = 0 ;
@@ -3575,46 +3988,51 @@ XS(_wrap_svn_repos_hotcopy2) {
dXSARGS;
{
- _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
- SWIG_croak("Usage: svn_repos_hotcopy2(src_path,dst_path,clean_logs,incremental,cancel_func,cancel_baton,pool);");
+ if ((items < 7) || (items > 8)) {
+ SWIG_croak("Usage: svn_repos_hotcopy3(src_path,dst_path,clean_logs,incremental,notify_func,notify_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_hotcopy2" "', argument " "1"" of type '" "char const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_hotcopy3" "', argument " "1"" of type '" "char const *""'");
}
arg1 = (char *)(buf1);
res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_hotcopy2" "', argument " "2"" of type '" "char const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_hotcopy3" "', argument " "2"" of type '" "char const *""'");
}
arg2 = (char *)(buf2);
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
- SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_hotcopy2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_hotcopy3" "', argument " "3"" of type '" "svn_boolean_t""'");
}
arg3 = (svn_boolean_t)(val3);
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_hotcopy2" "', argument " "4"" of type '" "svn_boolean_t""'");
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_hotcopy3" "', argument " "4"" of type '" "svn_boolean_t""'");
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_hotcopy2" "', argument " "5"" of type '" "svn_cancel_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_hotcopy3" "', argument " "5"" of type '" "svn_repos_notify_func_t""'");
}
}
res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_hotcopy2" "', argument " "6"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_hotcopy3" "', argument " "6"" of type '" "void *""'");
}
- if (items > 6) {
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
+ }
+ if (items > 7) {
}
{
- result = (svn_error_t *)svn_repos_hotcopy2((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7);
+ result = (svn_error_t *)svn_repos_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
@@ -3656,6 +4074,103 @@ XS(_wrap_svn_repos_hotcopy2) {
}
+XS(_wrap_svn_repos_hotcopy2) {
+ {
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_cancel_func_t arg5 = (svn_cancel_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 6)) {
+ SWIG_croak("Usage: svn_repos_hotcopy2(src_path,dst_path,clean_logs,incremental,cancel_func,cancel_baton,pool);");
+ }
+ res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_hotcopy2" "', argument " "1"" of type '" "char const *""'");
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_hotcopy2" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_hotcopy2" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_hotcopy2" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ {
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
+ }
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_hotcopy2((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_hotcopy) {
{
char *arg1 = (char *) 0 ;
@@ -3677,6 +4192,7 @@ XS(_wrap_svn_repos_hotcopy) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_hotcopy(src_path,dst_path,clean_logs,pool);");
@@ -3748,15 +4264,15 @@ XS(_wrap_svn_repos_fs_pack2) {
void *argp1 = 0 ;
int res1 = 0 ;
int res3 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_fs_pack2(repos,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -3775,16 +4291,10 @@ XS(_wrap_svn_repos_fs_pack2) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_fs_pack2" "', argument " "3"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_fs_pack2" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_fs_pack2" "', argument " "5"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -3813,16 +4323,12 @@ XS(_wrap_svn_repos_fs_pack2) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -3840,15 +4346,15 @@ XS(_wrap_svn_repos_fs_pack) {
void *argp1 = 0 ;
int res1 = 0 ;
int res3 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_fs_pack(repos,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -3867,16 +4373,10 @@ XS(_wrap_svn_repos_fs_pack) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_fs_pack" "', argument " "3"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_fs_pack" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_fs_pack" "', argument " "5"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -3905,16 +4405,12 @@ XS(_wrap_svn_repos_fs_pack) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -3936,15 +4432,15 @@ XS(_wrap_svn_repos_recover4) {
int val2 ;
int ecode2 = 0 ;
int res4 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_recover4(path,nonblocking,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -3968,16 +4464,10 @@ XS(_wrap_svn_repos_recover4) {
SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_repos_recover4" "', argument " "4"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_recover4" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_recover4" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -4007,8 +4497,6 @@ XS(_wrap_svn_repos_recover4) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -4016,8 +4504,6 @@ XS(_wrap_svn_repos_recover4) {
-
-
SWIG_croak_null();
}
}
@@ -4039,15 +4525,15 @@ XS(_wrap_svn_repos_recover3) {
int val2 ;
int ecode2 = 0 ;
int res4 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_recover3(path,nonblocking,start_callback,start_callback_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -4071,16 +4557,10 @@ XS(_wrap_svn_repos_recover3) {
SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_repos_recover3" "', argument " "4"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_recover3" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_recover3" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -4110,8 +4590,6 @@ XS(_wrap_svn_repos_recover3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -4119,8 +4597,6 @@ XS(_wrap_svn_repos_recover3) {
-
-
SWIG_croak_null();
}
}
@@ -4146,6 +4622,7 @@ XS(_wrap_svn_repos_recover2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_recover2(path,nonblocking,start_callback,start_callback_baton,pool);");
@@ -4226,6 +4703,7 @@ XS(_wrap_svn_repos_recover) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_recover(path,pool);");
@@ -4285,12 +4763,13 @@ XS(_wrap_svn_repos_freeze) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_freeze(paths,freeze_func,freeze_baton,pool);");
}
{
- arg1 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(0),
+ arg1 = svn_swig_pl_strings_to_array(ST(0),
_global_pool);
}
{
@@ -4362,6 +4841,7 @@ XS(_wrap_svn_repos_db_logfiles) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -4433,6 +4913,7 @@ XS(_wrap_svn_repos_path) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_path(repos,pool);");
@@ -4476,6 +4957,7 @@ XS(_wrap_svn_repos_db_env) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_db_env(repos,pool);");
@@ -4519,6 +5001,7 @@ XS(_wrap_svn_repos_conf_dir) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_conf_dir(repos,pool);");
@@ -4562,6 +5045,7 @@ XS(_wrap_svn_repos_svnserve_conf) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_svnserve_conf(repos,pool);");
@@ -4605,6 +5089,7 @@ XS(_wrap_svn_repos_lock_dir) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_lock_dir(repos,pool);");
@@ -4648,6 +5133,7 @@ XS(_wrap_svn_repos_db_lockfile) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_db_lockfile(repos,pool);");
@@ -4691,6 +5177,7 @@ XS(_wrap_svn_repos_db_logs_lockfile) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_db_logs_lockfile(repos,pool);");
@@ -4734,6 +5221,7 @@ XS(_wrap_svn_repos_hook_dir) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_hook_dir(repos,pool);");
@@ -4777,6 +5265,7 @@ XS(_wrap_svn_repos_start_commit_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_start_commit_hook(repos,pool);");
@@ -4820,6 +5309,7 @@ XS(_wrap_svn_repos_pre_commit_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_pre_commit_hook(repos,pool);");
@@ -4863,6 +5353,7 @@ XS(_wrap_svn_repos_post_commit_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_post_commit_hook(repos,pool);");
@@ -4906,6 +5397,7 @@ XS(_wrap_svn_repos_pre_revprop_change_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_pre_revprop_change_hook(repos,pool);");
@@ -4949,6 +5441,7 @@ XS(_wrap_svn_repos_post_revprop_change_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_post_revprop_change_hook(repos,pool);");
@@ -4992,6 +5485,7 @@ XS(_wrap_svn_repos_pre_lock_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_pre_lock_hook(repos,pool);");
@@ -5035,6 +5529,7 @@ XS(_wrap_svn_repos_post_lock_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_post_lock_hook(repos,pool);");
@@ -5078,6 +5573,7 @@ XS(_wrap_svn_repos_pre_unlock_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_pre_unlock_hook(repos,pool);");
@@ -5121,6 +5617,7 @@ XS(_wrap_svn_repos_post_unlock_hook) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_post_unlock_hook(repos,pool);");
@@ -5168,6 +5665,7 @@ XS(_wrap_svn_repos_hooks_setenv) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_repos_hooks_setenv(repos,hooks_env_path,scratch_pool);");
@@ -5269,6 +5767,7 @@ XS(_wrap_svn_repos_begin_report3) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 12) || (items > 13)) {
@@ -5320,14 +5819,14 @@ XS(_wrap_svn_repos_begin_report3) {
}
arg10 = (svn_boolean_t)(val10);
{
- svn_delta_make_editor(&arg11, &arg12, ST(9), _global_pool);
+ svn_swig_pl_make_editor(&arg11, &arg12, ST(9), _global_pool);
}
{
if (SvOK(ST(10))) {
- arg13 = svn_swig_pl_thunk_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg14 = ST(10);
} else {
- arg13 = NULL;
+ arg13 = (svn_repos_authz_func_t) NULL;
arg14 = NULL;
}
}
@@ -5441,6 +5940,7 @@ XS(_wrap_svn_repos_begin_report2) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 11) || (items > 12)) {
@@ -5492,14 +5992,14 @@ XS(_wrap_svn_repos_begin_report2) {
}
arg10 = (svn_boolean_t)(val10);
{
- svn_delta_make_editor(&arg11, &arg12, ST(9), _global_pool);
+ svn_swig_pl_make_editor(&arg11, &arg12, ST(9), _global_pool);
}
{
if (SvOK(ST(10))) {
- arg13 = svn_swig_pl_thunk_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg14 = ST(10);
} else {
- arg13 = NULL;
+ arg13 = (svn_repos_authz_func_t) NULL;
arg14 = NULL;
}
}
@@ -5607,6 +6107,7 @@ XS(_wrap_svn_repos_begin_report) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 11) || (items > 12)) {
@@ -5658,14 +6159,14 @@ XS(_wrap_svn_repos_begin_report) {
}
arg10 = (svn_boolean_t)(val10);
{
- svn_delta_make_editor(&arg11, &arg12, ST(9), _global_pool);
+ svn_swig_pl_make_editor(&arg11, &arg12, ST(9), _global_pool);
}
{
if (SvOK(ST(10))) {
- arg13 = svn_swig_pl_thunk_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg14 = ST(10);
} else {
- arg13 = NULL;
+ arg13 = (svn_repos_authz_func_t) NULL;
arg14 = NULL;
}
}
@@ -5755,6 +6256,7 @@ XS(_wrap_svn_repos_set_path3) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_set_path3(report_baton,path,revision,depth,start_empty,lock_token,pool);");
@@ -5860,6 +6362,7 @@ XS(_wrap_svn_repos_set_path2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_set_path2(report_baton,path,revision,start_empty,lock_token,pool);");
@@ -5954,6 +6457,7 @@ XS(_wrap_svn_repos_set_path) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_set_path(report_baton,path,revision,start_empty,pool);");
@@ -6052,6 +6556,7 @@ XS(_wrap_svn_repos_link_path3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_link_path3(report_baton,path,link_path,revision,depth,start_empty,lock_token,pool);");
@@ -6168,6 +6673,7 @@ XS(_wrap_svn_repos_link_path2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_link_path2(report_baton,path,link_path,revision,start_empty,lock_token,pool);");
@@ -6273,6 +6779,7 @@ XS(_wrap_svn_repos_link_path) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_link_path(report_baton,path,link_path,revision,start_empty,pool);");
@@ -6361,6 +6868,7 @@ XS(_wrap_svn_repos_delete_path) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_repos_delete_path(report_baton,path,pool);");
@@ -6424,6 +6932,7 @@ XS(_wrap_svn_repos_finish_report) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_finish_report(report_baton,pool);");
@@ -6480,6 +6989,7 @@ XS(_wrap_svn_repos_abort_report) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_repos_abort_report(report_baton,pool);");
@@ -6568,6 +7078,7 @@ XS(_wrap_svn_repos_dir_delta2) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_repos_dir_delta2(src_root,src_parent_dir,src_entry,tgt_root,tgt_path,editor,edit_baton,authz_read_func,authz_read_baton,text_deltas,depth,entry_props,ignore_ancestry,pool);");
@@ -6598,14 +7109,14 @@ XS(_wrap_svn_repos_dir_delta2) {
}
arg5 = (char *)(buf5);
{
- svn_delta_make_editor(&arg6, &arg7, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg6, &arg7, ST(5), _global_pool);
}
{
if (SvOK(ST(6))) {
- arg8 = svn_swig_pl_thunk_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg9 = ST(6);
} else {
- arg8 = NULL;
+ arg8 = (svn_repos_authz_func_t) NULL;
arg9 = NULL;
}
}
@@ -6725,6 +7236,7 @@ XS(_wrap_svn_repos_dir_delta) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_repos_dir_delta(src_root,src_parent_dir,src_entry,tgt_root,tgt_path,editor,edit_baton,authz_read_func,authz_read_baton,text_deltas,recurse,entry_props,ignore_ancestry,pool);");
@@ -6755,14 +7267,14 @@ XS(_wrap_svn_repos_dir_delta) {
}
arg5 = (char *)(buf5);
{
- svn_delta_make_editor(&arg6, &arg7, ST(5), _global_pool);
+ svn_swig_pl_make_editor(&arg6, &arg7, ST(5), _global_pool);
}
{
if (SvOK(ST(6))) {
- arg8 = svn_swig_pl_thunk_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg9 = ST(6);
} else {
- arg8 = NULL;
+ arg8 = (svn_repos_authz_func_t) NULL;
arg9 = NULL;
}
}
@@ -6865,6 +7377,7 @@ XS(_wrap_svn_repos_replay2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_replay2(root,base_dir,low_water_mark,send_deltas,editor,edit_baton,authz_read_func,authz_read_baton,pool);");
@@ -6890,14 +7403,14 @@ XS(_wrap_svn_repos_replay2) {
}
arg4 = (svn_boolean_t)(val4);
{
- svn_delta_make_editor(&arg5, &arg6, ST(4), _global_pool);
+ svn_swig_pl_make_editor(&arg5, &arg6, ST(4), _global_pool);
}
{
if (SvOK(ST(5))) {
- arg7 = svn_swig_pl_thunk_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg8 = ST(5);
} else {
- arg7 = NULL;
+ arg7 = (svn_repos_authz_func_t) NULL;
arg8 = NULL;
}
}
@@ -6958,6 +7471,7 @@ XS(_wrap_svn_repos_replay) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_repos_replay(root,editor,edit_baton,pool);");
@@ -6968,7 +7482,7 @@ XS(_wrap_svn_repos_replay) {
}
arg1 = (svn_fs_root_t *)(argp1);
{
- svn_delta_make_editor(&arg2, &arg3, ST(1), _global_pool);
+ svn_swig_pl_make_editor(&arg2, &arg3, ST(1), _global_pool);
}
if (items > 2) {
@@ -7040,11 +7554,12 @@ XS(_wrap_svn_repos_get_commit_editor5) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
if ((items < 8) || (items > 9)) {
- SWIG_croak("Usage: svn_repos_get_commit_editor5(repos,txn,repos_url,base_path,revprop_table,commit_callback,commit_baton,authz_callback,authz_baton,pool);");
+ SWIG_croak("Usage: svn_repos_get_commit_editor5(repos,txn,repos_url_decoded,base_path,revprop_table,commit_callback,commit_baton,authz_callback,authz_baton,pool);");
}
res3 = SWIG_ConvertPtr(ST(0), &argp3,SWIGTYPE_p_svn_repos_t, 0 | 0 );
if (!SWIG_IsOK(res3)) {
@@ -7067,8 +7582,10 @@ XS(_wrap_svn_repos_get_commit_editor5) {
}
arg6 = (char *)(buf6);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg7 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
{
@@ -7185,6 +7702,7 @@ XS(_wrap_svn_repos_get_commit_editor4) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7337,6 +7855,7 @@ XS(_wrap_svn_repos_get_commit_editor3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7486,6 +8005,7 @@ XS(_wrap_svn_repos_get_commit_editor2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7618,6 +8138,7 @@ XS(_wrap_svn_repos_get_commit_editor) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7727,6 +8248,7 @@ XS(_wrap_svn_repos_dated_revision) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -7812,6 +8334,7 @@ XS(_wrap_svn_repos_get_committed_info) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -7912,6 +8435,7 @@ XS(_wrap_svn_repos_stat) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -7996,6 +8520,7 @@ XS(_wrap_svn_repos_deleted_rev) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg5 = &temp5;
if ((items < 4) || (items > 5)) {
@@ -8101,6 +8626,7 @@ XS(_wrap_svn_repos_history2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_history2(fs,path,history_func,history_baton,authz_read_func,authz_read_baton,start,end,cross_copies,pool);");
@@ -8116,15 +8642,15 @@ XS(_wrap_svn_repos_history2) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_thunk_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_pl_thunk_history_func;
arg4 = ST(2);
}
{
if (SvOK(ST(3))) {
- arg5 = svn_swig_pl_thunk_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg6 = ST(3);
} else {
- arg5 = NULL;
+ arg5 = (svn_repos_authz_func_t) NULL;
arg6 = NULL;
}
}
@@ -8215,6 +8741,7 @@ XS(_wrap_svn_repos_history) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_history(fs,path,history_func,history_baton,start,end,cross_copies,pool);");
@@ -8230,7 +8757,7 @@ XS(_wrap_svn_repos_history) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_pl_thunk_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_pl_thunk_history_func;
arg4 = ST(2);
}
ecode5 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val5);
@@ -8319,6 +8846,7 @@ XS(_wrap_svn_repos_trace_node_locations) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 5) || (items > 6)) {
@@ -8346,10 +8874,10 @@ XS(_wrap_svn_repos_trace_node_locations) {
arg5 = (apr_array_header_t *)(argp5);
{
if (SvOK(ST(4))) {
- arg6 = svn_swig_pl_thunk_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg7 = ST(4);
} else {
- arg6 = NULL;
+ arg6 = (svn_repos_authz_func_t) NULL;
arg7 = NULL;
}
}
@@ -8437,6 +8965,7 @@ XS(_wrap_svn_repos_node_location_segments) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_node_location_segments(repos,path,peg_revision,start_rev,end_rev,receiver,receiver_baton,authz_read_func,authz_read_baton,pool);");
@@ -8478,10 +9007,10 @@ XS(_wrap_svn_repos_node_location_segments) {
}
{
if (SvOK(ST(7))) {
- arg8 = svn_swig_pl_thunk_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg9 = ST(7);
} else {
- arg8 = NULL;
+ arg8 = (svn_repos_authz_func_t) NULL;
arg9 = NULL;
}
}
@@ -8570,6 +9099,7 @@ XS(_wrap_svn_repos_get_logs4) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_repos_get_logs4(repos,paths,start,end,limit,discover_changed_paths,strict_node_history,include_merged_revisions,revprops,authz_read_func,authz_read_baton,receiver,receiver_baton,pool);");
@@ -8580,7 +9110,7 @@ XS(_wrap_svn_repos_get_logs4) {
}
arg1 = (svn_repos_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8614,20 +9144,20 @@ XS(_wrap_svn_repos_get_logs4) {
}
arg8 = (svn_boolean_t)(val8);
{
- arg9 = SvOK(ST(8)) ? (apr_array_header_t *) svn_swig_pl_strings_to_array(
+ arg9 = SvOK(ST(8)) ? svn_swig_pl_strings_to_array(
ST(8), _global_pool) : NULL;
}
{
if (SvOK(ST(9))) {
- arg10 = svn_swig_pl_thunk_authz_func;
+ arg10 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg11 = ST(9);
} else {
- arg10 = NULL;
+ arg10 = (svn_repos_authz_func_t) NULL;
arg11 = NULL;
}
}
{
- arg12 = svn_swig_pl_thunk_log_entry_receiver;
+ arg12 = (svn_log_entry_receiver_t) svn_swig_pl_thunk_log_entry_receiver;
arg13 = ST(10);
}
if (items > 11) {
@@ -8715,6 +9245,7 @@ XS(_wrap_svn_repos_get_logs3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_repos_get_logs3(repos,paths,start,end,limit,discover_changed_paths,strict_node_history,authz_read_func,authz_read_baton,receiver,receiver_baton,pool);");
@@ -8725,7 +9256,7 @@ XS(_wrap_svn_repos_get_logs3) {
}
arg1 = (svn_repos_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8755,15 +9286,15 @@ XS(_wrap_svn_repos_get_logs3) {
arg7 = (svn_boolean_t)(val7);
{
if (SvOK(ST(7))) {
- arg8 = svn_swig_pl_thunk_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg9 = ST(7);
} else {
- arg8 = NULL;
+ arg8 = (svn_repos_authz_func_t) NULL;
arg9 = NULL;
}
}
{
- arg10 = svn_swig_pl_thunk_log_receiver;
+ arg10 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg11 = ST(8);
}
if (items > 9) {
@@ -8844,6 +9375,7 @@ XS(_wrap_svn_repos_get_logs2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_get_logs2(repos,paths,start,end,discover_changed_paths,strict_node_history,authz_read_func,authz_read_baton,receiver,receiver_baton,pool);");
@@ -8854,7 +9386,7 @@ XS(_wrap_svn_repos_get_logs2) {
}
arg1 = (svn_repos_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8879,15 +9411,15 @@ XS(_wrap_svn_repos_get_logs2) {
arg6 = (svn_boolean_t)(val6);
{
if (SvOK(ST(6))) {
- arg7 = svn_swig_pl_thunk_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg8 = ST(6);
} else {
- arg7 = NULL;
+ arg7 = (svn_repos_authz_func_t) NULL;
arg8 = NULL;
}
}
{
- arg9 = svn_swig_pl_thunk_log_receiver;
+ arg9 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg10 = ST(7);
}
if (items > 8) {
@@ -8964,6 +9496,7 @@ XS(_wrap_svn_repos_get_logs) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_get_logs(repos,paths,start,end,discover_changed_paths,strict_node_history,receiver,receiver_baton,pool);");
@@ -8974,7 +9507,7 @@ XS(_wrap_svn_repos_get_logs) {
}
arg1 = (svn_repos_t *)(argp1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
@@ -8998,7 +9531,7 @@ XS(_wrap_svn_repos_get_logs) {
}
arg6 = (svn_boolean_t)(val6);
{
- arg7 = svn_swig_pl_thunk_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_pl_thunk_log_receiver;
arg8 = ST(6);
}
if (items > 7) {
@@ -9074,6 +9607,7 @@ XS(_wrap_svn_repos_fs_get_mergeinfo) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 6) || (items > 7)) {
@@ -9085,7 +9619,7 @@ XS(_wrap_svn_repos_fs_get_mergeinfo) {
}
arg2 = (svn_repos_t *)(argp2);
{
- arg3 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg3 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val4);
@@ -9105,10 +9639,10 @@ XS(_wrap_svn_repos_fs_get_mergeinfo) {
arg6 = (svn_boolean_t)(val6);
{
if (SvOK(ST(5))) {
- arg7 = svn_swig_pl_thunk_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg8 = ST(5);
} else {
- arg7 = NULL;
+ arg7 = (svn_repos_authz_func_t) NULL;
arg8 = NULL;
}
}
@@ -9198,6 +9732,7 @@ XS(_wrap_svn_repos_get_file_revs2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_get_file_revs2(repos,path,start,end,include_merged_revisions,authz_read_func,authz_read_baton,handler,handler_baton,pool);");
@@ -9229,10 +9764,10 @@ XS(_wrap_svn_repos_get_file_revs2) {
arg5 = (svn_boolean_t)(val5);
{
if (SvOK(ST(5))) {
- arg6 = svn_swig_pl_thunk_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg7 = ST(5);
} else {
- arg6 = NULL;
+ arg6 = (svn_repos_authz_func_t) NULL;
arg7 = NULL;
}
}
@@ -9322,6 +9857,7 @@ XS(_wrap_svn_repos_get_file_revs) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_get_file_revs(repos,path,start,end,authz_read_func,authz_read_baton,handler,handler_baton,pool);");
@@ -9348,10 +9884,10 @@ XS(_wrap_svn_repos_get_file_revs) {
arg4 = (svn_revnum_t)(val4);
{
if (SvOK(ST(4))) {
- arg5 = svn_swig_pl_thunk_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg6 = ST(4);
} else {
- arg5 = NULL;
+ arg5 = (svn_repos_authz_func_t) NULL;
arg6 = NULL;
}
}
@@ -9432,6 +9968,7 @@ XS(_wrap_svn_repos_fs_commit_txn) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg3 = &temp3;
@@ -9522,6 +10059,7 @@ XS(_wrap_svn_repos_fs_begin_txn_for_commit2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -9538,8 +10076,10 @@ XS(_wrap_svn_repos_fs_begin_txn_for_commit2) {
}
arg3 = (svn_revnum_t)(val3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(2), _global_pool);
}
if (items > 3) {
@@ -9613,6 +10153,7 @@ XS(_wrap_svn_repos_fs_begin_txn_for_commit) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -9707,6 +10248,7 @@ XS(_wrap_svn_repos_fs_begin_txn_for_update) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -9772,6 +10314,143 @@ XS(_wrap_svn_repos_fs_begin_txn_for_update) {
}
+XS(_wrap_svn_repos_fs_lock_many) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ long long val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int res8 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 8) || (items > 10)) {
+ SWIG_croak("Usage: svn_repos_fs_lock_many(repos,lock_targets,comment,is_dav_comment,expiration_date,steal_lock,lock_callback,lock_baton,result_pool,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_fs_lock_many" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_fs_lock_many" "', argument " "2"" of type '" "apr_hash_t *""'");
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_fs_lock_many" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_fs_lock_many" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_repos_fs_lock_many" "', argument " "5"" of type '" "apr_time_t""'");
+ }
+ arg5 = (apr_time_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_repos_fs_lock_many" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_fs_lock_many" "', argument " "7"" of type '" "svn_fs_lock_callback_t""'");
+ }
+ }
+ res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_repos_fs_lock_many" "', argument " "8"" of type '" "void *""'");
+ }
+ if (items > 8) {
+
+ }
+ if (items > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_fs_lock) {
{
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
@@ -9811,6 +10490,7 @@ XS(_wrap_svn_repos_fs_lock) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 8) || (items > 9)) {
@@ -9911,6 +10591,112 @@ XS(_wrap_svn_repos_fs_lock) {
}
+XS(_wrap_svn_repos_fs_unlock_many) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int res5 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 5) || (items > 7)) {
+ SWIG_croak("Usage: svn_repos_fs_unlock_many(repos,unlock_targets,break_lock,lock_callback,lock_baton,result_pool,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_fs_unlock_many" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_fs_unlock_many" "', argument " "2"" of type '" "apr_hash_t *""'");
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_fs_unlock_many" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_fs_unlock_many" "', argument " "4"" of type '" "svn_fs_lock_callback_t""'");
+ }
+ }
+ res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_fs_unlock_many" "', argument " "5"" of type '" "void *""'");
+ }
+ if (items > 5) {
+
+ }
+ if (items > 6) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_fs_unlock) {
{
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -9935,6 +10721,7 @@ XS(_wrap_svn_repos_fs_unlock) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_fs_unlock(repos,path,token,break_lock,pool);");
@@ -10025,6 +10812,7 @@ XS(_wrap_svn_repos_fs_get_locks2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -10047,10 +10835,10 @@ XS(_wrap_svn_repos_fs_get_locks2) {
arg4 = (svn_depth_t)(val4);
{
if (SvOK(ST(3))) {
- arg5 = svn_swig_pl_thunk_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg6 = ST(3);
} else {
- arg5 = NULL;
+ arg5 = (svn_repos_authz_func_t) NULL;
arg6 = NULL;
}
}
@@ -10120,6 +10908,7 @@ XS(_wrap_svn_repos_fs_get_locks) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -10137,10 +10926,10 @@ XS(_wrap_svn_repos_fs_get_locks) {
arg3 = (char *)(buf3);
{
if (SvOK(ST(2))) {
- arg4 = svn_swig_pl_thunk_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg5 = ST(2);
} else {
- arg4 = NULL;
+ arg4 = (svn_repos_authz_func_t) NULL;
arg5 = NULL;
}
}
@@ -10225,6 +11014,7 @@ XS(_wrap_svn_repos_fs_change_rev_prop4) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_repos_fs_change_rev_prop4(repos,rev,author,name,old_value_p,new_value,use_pre_revprop_change_hook,use_post_revprop_change_hook,authz_read_func,authz_read_baton,pool);");
@@ -10275,10 +11065,10 @@ XS(_wrap_svn_repos_fs_change_rev_prop4) {
arg8 = (svn_boolean_t)(val8);
{
if (SvOK(ST(8))) {
- arg9 = svn_swig_pl_thunk_authz_func;
+ arg9 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg10 = ST(8);
} else {
- arg9 = NULL;
+ arg9 = (svn_repos_authz_func_t) NULL;
arg10 = NULL;
}
}
@@ -10374,6 +11164,7 @@ XS(_wrap_svn_repos_fs_change_rev_prop3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_fs_change_rev_prop3(repos,rev,author,name,new_value,use_pre_revprop_change_hook,use_post_revprop_change_hook,authz_read_func,authz_read_baton,pool);");
@@ -10419,10 +11210,10 @@ XS(_wrap_svn_repos_fs_change_rev_prop3) {
arg7 = (svn_boolean_t)(val7);
{
if (SvOK(ST(7))) {
- arg8 = svn_swig_pl_thunk_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg9 = ST(7);
} else {
- arg8 = NULL;
+ arg8 = (svn_repos_authz_func_t) NULL;
arg9 = NULL;
}
}
@@ -10502,6 +11293,7 @@ XS(_wrap_svn_repos_fs_change_rev_prop2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_fs_change_rev_prop2(repos,rev,author,name,new_value,authz_read_func,authz_read_baton,pool);");
@@ -10537,10 +11329,10 @@ XS(_wrap_svn_repos_fs_change_rev_prop2) {
}
{
if (SvOK(ST(5))) {
- arg6 = svn_swig_pl_thunk_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg7 = ST(5);
} else {
- arg6 = NULL;
+ arg6 = (svn_repos_authz_func_t) NULL;
arg7 = NULL;
}
}
@@ -10614,6 +11406,7 @@ XS(_wrap_svn_repos_fs_change_rev_prop) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_fs_change_rev_prop(repos,rev,author,name,new_value,pool);");
@@ -10715,6 +11508,7 @@ XS(_wrap_svn_repos_fs_revision_prop) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -10737,10 +11531,10 @@ XS(_wrap_svn_repos_fs_revision_prop) {
arg4 = (char *)(buf4);
{
if (SvOK(ST(3))) {
- arg5 = svn_swig_pl_thunk_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg6 = ST(3);
} else {
- arg5 = NULL;
+ arg5 = (svn_repos_authz_func_t) NULL;
arg6 = NULL;
}
}
@@ -10813,6 +11607,7 @@ XS(_wrap_svn_repos_fs_revision_proplist) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -10830,10 +11625,10 @@ XS(_wrap_svn_repos_fs_revision_proplist) {
arg3 = (svn_revnum_t)(val3);
{
if (SvOK(ST(2))) {
- arg4 = svn_swig_pl_thunk_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg5 = ST(2);
} else {
- arg4 = NULL;
+ arg4 = (svn_repos_authz_func_t) NULL;
arg5 = NULL;
}
}
@@ -10903,6 +11698,7 @@ XS(_wrap_svn_repos_fs_change_node_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_fs_change_node_prop(root,path,name,value,pool);");
@@ -10973,6 +11769,122 @@ XS(_wrap_svn_repos_fs_change_node_prop) {
}
+XS(_wrap_svn_repos_fs_get_inherited_props) {
+ {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ if ((items < 4) || (items > 6)) {
+ SWIG_croak("Usage: svn_repos_fs_get_inherited_props(root,path,propname,authz_read_func,authz_read_baton,result_pool,scratch_pool);");
+ }
+ res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "2"" of type '" "svn_fs_root_t *""'");
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "4"" of type '" "char const *""'");
+ }
+ arg4 = (char *)(buf4);
+ {
+ if (SvOK(ST(3))) {
+ arg5 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
+ arg6 = ST(3);
+ } else {
+ arg5 = (svn_repos_authz_func_t) NULL;
+ arg6 = NULL;
+ }
+ }
+ if (items > 4) {
+
+ }
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_fs_get_inherited_props arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_fs_get_inherited_props is not implemented yet");
+
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_fs_change_txn_prop) {
{
svn_fs_txn_t *arg1 = (svn_fs_txn_t *) 0 ;
@@ -10992,6 +11904,7 @@ XS(_wrap_svn_repos_fs_change_txn_prop) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_fs_change_txn_prop(txn,name,value,pool);");
@@ -11071,6 +11984,7 @@ XS(_wrap_svn_repos_fs_change_txn_props) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_repos_fs_change_txn_props(txn,props,pool);");
@@ -11811,9 +12725,11 @@ XS(_wrap_svn_repos_node_editor) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -11921,6 +12837,251 @@ XS(_wrap_svn_repos_node_from_baton) {
}
+XS(_wrap_svn_repos_info_format) {
+ {
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ {
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((items < 1) || (items > 3)) {
+ SWIG_croak("Usage: svn_repos_info_format(repos,result_pool,scratch_pool);");
+ }
+ res3 = SWIG_ConvertPtr(ST(0), &argp3,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_info_format" "', argument " "3"" of type '" "svn_repos_t *""'");
+ }
+ arg3 = (svn_repos_t *)(argp3);
+ if (items > 1) {
+
+ }
+ if (items > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_info_format(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((*arg1)); argvi++ ;
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags); argvi++ ;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_info_format is not implemented yet");
+
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_verify_fs3) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg2 ;
+ svn_revnum_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_repos_notify_func_t arg6 = (svn_repos_notify_func_t) 0 ;
+ void *arg7 = (void *) 0 ;
+ svn_repos_verify_callback_t arg8 = (svn_repos_verify_callback_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_cancel_func_t arg10 = (svn_cancel_func_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int res7 ;
+ int res9 ;
+ int res11 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 11) || (items > 12)) {
+ SWIG_croak("Usage: svn_repos_verify_fs3(repos,start_rev,end_rev,check_normalization,metadata_only,notify_func,notify_baton,verify_callback,verify_baton,cancel,cancel_baton,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_verify_fs3" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ ecode2 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_repos_verify_fs3" "', argument " "2"" of type '" "svn_revnum_t""'");
+ }
+ arg2 = (svn_revnum_t)(val2);
+ ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_verify_fs3" "', argument " "3"" of type '" "svn_revnum_t""'");
+ }
+ arg3 = (svn_revnum_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_verify_fs3" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_repos_verify_fs3" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_verify_fs3" "', argument " "6"" of type '" "svn_repos_notify_func_t""'");
+ }
+ }
+ res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_repos_verify_fs3" "', argument " "7"" of type '" "void *""'");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_verify_fs3" "', argument " "8"" of type '" "svn_repos_verify_callback_t""'");
+ }
+ }
+ res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_repos_verify_fs3" "', argument " "9"" of type '" "void *""'");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_verify_fs3" "', argument " "10"" of type '" "svn_cancel_func_t""'");
+ }
+ }
+ res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
+ if (!SWIG_IsOK(res11)) {
+ SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_repos_verify_fs3" "', argument " "11"" of type '" "void *""'");
+ }
+ if (items > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_verify_fs3(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_repos_verify_fs2) {
{
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -11946,6 +13107,7 @@ XS(_wrap_svn_repos_verify_fs2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_verify_fs2(repos,start_rev,end_rev,notify_func,notify_baton,cancel,cancel_baton,scratch_pool);");
@@ -12049,15 +13211,15 @@ XS(_wrap_svn_repos_verify_fs) {
int ecode3 = 0 ;
long val4 ;
int ecode4 = 0 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_verify_fs(repos,feedback_stream,start_rev,end_rev,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12067,6 +13229,7 @@ XS(_wrap_svn_repos_verify_fs) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -12079,16 +13242,10 @@ XS(_wrap_svn_repos_verify_fs) {
}
arg4 = (svn_revnum_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_verify_fs" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_verify_fs" "', argument " "6"" of type '" "void *""'");
- }
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -12118,8 +13275,6 @@ XS(_wrap_svn_repos_verify_fs) {
-
-
XSRETURN(argvi);
fail:
@@ -12127,8 +13282,6 @@ XS(_wrap_svn_repos_verify_fs) {
-
-
SWIG_croak_null();
}
}
@@ -12159,15 +13312,15 @@ XS(_wrap_svn_repos_dump_fs3) {
int val6 ;
int ecode6 = 0 ;
int res8 ;
- int res10 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_repos_dump_fs3(repos,dumpstream,start_rev,end_rev,incremental,use_deltas,notify_func,notify_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12177,6 +13330,7 @@ XS(_wrap_svn_repos_dump_fs3) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -12209,16 +13363,10 @@ XS(_wrap_svn_repos_dump_fs3) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_repos_dump_fs3" "', argument " "8"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_dump_fs3" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_repos_dump_fs3" "', argument " "10"" of type '" "void *""'");
- }
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -12252,8 +13400,6 @@ XS(_wrap_svn_repos_dump_fs3) {
-
-
XSRETURN(argvi);
fail:
@@ -12265,8 +13411,6 @@ XS(_wrap_svn_repos_dump_fs3) {
-
-
SWIG_croak_null();
}
}
@@ -12295,15 +13439,15 @@ XS(_wrap_svn_repos_dump_fs2) {
int ecode6 = 0 ;
int val7 ;
int ecode7 = 0 ;
- int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_dump_fs2(repos,dumpstream,feedback_stream,start_rev,end_rev,incremental,use_deltas,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12313,9 +13457,11 @@ XS(_wrap_svn_repos_dump_fs2) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -12338,16 +13484,10 @@ XS(_wrap_svn_repos_dump_fs2) {
}
arg7 = (svn_boolean_t)(val7);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_dump_fs2" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_repos_dump_fs2" "', argument " "9"" of type '" "void *""'");
- }
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -12380,8 +13520,6 @@ XS(_wrap_svn_repos_dump_fs2) {
-
-
XSRETURN(argvi);
fail:
@@ -12392,8 +13530,6 @@ XS(_wrap_svn_repos_dump_fs2) {
-
-
SWIG_croak_null();
}
}
@@ -12419,15 +13555,15 @@ XS(_wrap_svn_repos_dump_fs) {
int ecode5 = 0 ;
int val6 ;
int ecode6 = 0 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_repos_dump_fs(repos,dumpstream,feedback_stream,start_rev,end_rev,incremental,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12437,9 +13573,11 @@ XS(_wrap_svn_repos_dump_fs) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -12457,20 +13595,172 @@ XS(_wrap_svn_repos_dump_fs) {
}
arg6 = (svn_boolean_t)(val6);
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
+ }
+ if (items > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_dump_fs(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_load_fs5) {
+ {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ enum svn_repos_load_uuid arg5 ;
+ char *arg6 = (char *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_repos_notify_func_t arg11 = (svn_repos_notify_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ int val9 ;
+ int ecode9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int res12 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 13) || (items > 14)) {
+ SWIG_croak("Usage: svn_repos_load_fs5(repos,dumpstream,start_rev,end_rev,uuid_action,parent_dir,use_pre_commit_hook,use_post_commit_hook,validate_props,ignore_dates,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_load_fs5" "', argument " "1"" of type '" "svn_repos_t *""'");
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ {
+ svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
+ }
+ ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_load_fs5" "', argument " "3"" of type '" "svn_revnum_t""'");
+ }
+ arg3 = (svn_revnum_t)(val3);
+ ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_load_fs5" "', argument " "4"" of type '" "svn_revnum_t""'");
+ }
+ arg4 = (svn_revnum_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_repos_load_fs5" "', argument " "5"" of type '" "enum svn_repos_load_uuid""'");
+ }
+ arg5 = (enum svn_repos_load_uuid)(val5);
+ res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_load_fs5" "', argument " "6"" of type '" "char const *""'");
+ }
+ arg6 = (char *)(buf6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_repos_load_fs5" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(7), &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "svn_repos_load_fs5" "', argument " "8"" of type '" "svn_boolean_t""'");
+ }
+ arg8 = (svn_boolean_t)(val8);
+ ecode9 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val9);
+ if (!SWIG_IsOK(ecode9)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "svn_repos_load_fs5" "', argument " "9"" of type '" "svn_boolean_t""'");
+ }
+ arg9 = (svn_boolean_t)(val9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_repos_load_fs5" "', argument " "10"" of type '" "svn_boolean_t""'");
+ }
+ arg10 = (svn_boolean_t)(val10);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg11), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_dump_fs" "', argument " "7"" of type '" "svn_cancel_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_load_fs5" "', argument " "11"" of type '" "svn_repos_notify_func_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_repos_dump_fs" "', argument " "8"" of type '" "void *""'");
+ res12 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg12), 0, 0);
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_repos_load_fs5" "', argument " "12"" of type '" "void *""'");
}
- if (items > 8) {
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg14 = ST(12);
+ }
+ if (items > 13) {
}
{
- result = (svn_error_t *)svn_repos_dump_fs(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ result = (svn_error_t *)svn_repos_load_fs5(arg1,arg2,arg3,arg4,arg5,(char const *)arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
@@ -12496,6 +13786,10 @@ XS(_wrap_svn_repos_dump_fs) {
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+
+
+
@@ -12507,6 +13801,10 @@ XS(_wrap_svn_repos_dump_fs) {
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+
+
+
@@ -12551,15 +13849,15 @@ XS(_wrap_svn_repos_load_fs4) {
int val9 ;
int ecode9 = 0 ;
int res11 ;
- int res13 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 13) || (items > 14)) {
+ if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_repos_load_fs4(repos,dumpstream,start_rev,end_rev,uuid_action,parent_dir,use_pre_commit_hook,use_post_commit_hook,validate_props,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12569,6 +13867,7 @@ XS(_wrap_svn_repos_load_fs4) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -12616,16 +13915,10 @@ XS(_wrap_svn_repos_load_fs4) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_repos_load_fs4" "', argument " "11"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg12), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_load_fs4" "', argument " "12"" of type '" "svn_cancel_func_t""'");
- }
- }
- res13 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg13), 0, 0);
- if (!SWIG_IsOK(res13)) {
- SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_repos_load_fs4" "', argument " "13"" of type '" "void *""'");
+ arg12 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg13 = ST(11);
}
- if (items > 13) {
+ if (items > 12) {
}
{
@@ -12662,8 +13955,6 @@ XS(_wrap_svn_repos_load_fs4) {
-
-
XSRETURN(argvi);
fail:
@@ -12678,8 +13969,6 @@ XS(_wrap_svn_repos_load_fs4) {
-
-
SWIG_croak_null();
}
}
@@ -12714,15 +14003,15 @@ XS(_wrap_svn_repos_load_fs3) {
int val7 ;
int ecode7 = 0 ;
int res9 ;
- int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_repos_load_fs3(repos,dumpstream,uuid_action,parent_dir,use_pre_commit_hook,use_post_commit_hook,validate_props,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12732,6 +14021,7 @@ XS(_wrap_svn_repos_load_fs3) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
if (!SWIG_IsOK(ecode3)) {
@@ -12769,16 +14059,10 @@ XS(_wrap_svn_repos_load_fs3) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_repos_load_fs3" "', argument " "9"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_load_fs3" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
- }
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_repos_load_fs3" "', argument " "11"" of type '" "void *""'");
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(9);
}
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -12813,8 +14097,6 @@ XS(_wrap_svn_repos_load_fs3) {
-
-
XSRETURN(argvi);
fail:
@@ -12827,8 +14109,6 @@ XS(_wrap_svn_repos_load_fs3) {
-
-
SWIG_croak_null();
}
}
@@ -12858,15 +14138,15 @@ XS(_wrap_svn_repos_load_fs2) {
int ecode6 = 0 ;
int val7 ;
int ecode7 = 0 ;
- int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_repos_load_fs2(repos,dumpstream,feedback_stream,uuid_action,parent_dir,use_pre_commit_hook,use_post_commit_hook,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12876,9 +14156,11 @@ XS(_wrap_svn_repos_load_fs2) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -12901,16 +14183,10 @@ XS(_wrap_svn_repos_load_fs2) {
}
arg7 = (svn_boolean_t)(val7);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_load_fs2" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_repos_load_fs2" "', argument " "9"" of type '" "void *""'");
- }
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -12943,8 +14219,6 @@ XS(_wrap_svn_repos_load_fs2) {
-
-
XSRETURN(argvi);
fail:
@@ -12955,8 +14229,6 @@ XS(_wrap_svn_repos_load_fs2) {
-
-
SWIG_croak_null();
}
}
@@ -12980,15 +14252,15 @@ XS(_wrap_svn_repos_load_fs) {
int res5 ;
char *buf5 = 0 ;
int alloc5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_repos_load_fs(repos,dumpstream,feedback_stream,uuid_action,parent_dir,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
@@ -12998,9 +14270,11 @@ XS(_wrap_svn_repos_load_fs) {
arg1 = (svn_repos_t *)(argp1);
{
svn_swig_pl_make_stream (&arg2, ST(1));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
if (!SWIG_IsOK(ecode4)) {
@@ -13013,16 +14287,10 @@ XS(_wrap_svn_repos_load_fs) {
}
arg5 = (char *)(buf5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_load_fs" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_repos_load_fs" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -13053,8 +14321,6 @@ XS(_wrap_svn_repos_load_fs) {
if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
-
-
XSRETURN(argvi);
fail:
@@ -13063,8 +14329,6 @@ XS(_wrap_svn_repos_load_fs) {
if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
-
-
SWIG_croak_null();
}
}
@@ -13853,19 +15117,20 @@ XS(_wrap_svn_repos_parse_dumpstream3) {
int res3 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_repos_parse_dumpstream3(stream,parse_fns,parse_baton,deltas_are_text,cancel_func,cancel_baton,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_repos_parse_fns3_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -13882,20 +15147,171 @@ XS(_wrap_svn_repos_parse_dumpstream3) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
+ }
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_parse_dumpstream3(arg1,(struct svn_repos_parse_fns3_t const *)arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_get_fs_build_parser5) {
+ {
+ svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
+ void **arg2 = (void **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg4 ;
+ svn_revnum_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ enum svn_repos_load_uuid arg8 ;
+ char *arg9 = (char *) 0 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_boolean_t arg12 ;
+ svn_repos_notify_func_t arg13 = (svn_repos_notify_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ svn_repos_parse_fns3_t *temp1 ;
+ void *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ long val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ int res9 ;
+ char *buf9 = 0 ;
+ int alloc9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ int val11 ;
+ int ecode11 = 0 ;
+ int val12 ;
+ int ecode12 = 0 ;
+ int res14 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((items < 12) || (items > 13)) {
+ SWIG_croak("Usage: svn_repos_get_fs_build_parser5(repos,start_rev,end_rev,use_history,validate_props,uuid_action,parent_dir,use_pre_commit_hook,use_post_commit_hook,ignore_dates,notify_func,notify_baton,pool);");
+ }
+ res3 = SWIG_ConvertPtr(ST(0), &argp3,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "3"" of type '" "svn_repos_t *""'");
+ }
+ arg3 = (svn_repos_t *)(argp3);
+ ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(1), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "4"" of type '" "svn_revnum_t""'");
+ }
+ arg4 = (svn_revnum_t)(val4);
+ ecode5 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "5"" of type '" "svn_revnum_t""'");
+ }
+ arg5 = (svn_revnum_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "8"" of type '" "enum svn_repos_load_uuid""'");
+ }
+ arg8 = (enum svn_repos_load_uuid)(val8);
+ res9 = SWIG_AsCharPtrAndSize(ST(6), &buf9, NULL, &alloc9);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "9"" of type '" "char const *""'");
+ }
+ arg9 = (char *)(buf9);
+ ecode10 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(7), &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "10"" of type '" "svn_boolean_t""'");
+ }
+ arg10 = (svn_boolean_t)(val10);
+ ecode11 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(8), &val11);
+ if (!SWIG_IsOK(ecode11)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "11"" of type '" "svn_boolean_t""'");
+ }
+ arg11 = (svn_boolean_t)(val11);
+ ecode12 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(9), &val12);
+ if (!SWIG_IsOK(ecode12)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "12"" of type '" "svn_boolean_t""'");
+ }
+ arg12 = (svn_boolean_t)(val12);
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg13), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_parse_dumpstream3" "', argument " "5"" of type '" "svn_cancel_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "13"" of type '" "svn_repos_notify_func_t""'");
}
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_repos_parse_dumpstream3" "', argument " "6"" of type '" "void *""'");
+ res14 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg14), 0, 0);
+ if (!SWIG_IsOK(res14)) {
+ SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_repos_get_fs_build_parser5" "', argument " "14"" of type '" "void *""'");
}
- if (items > 6) {
+ if (items > 12) {
}
{
- result = (svn_error_t *)svn_repos_parse_dumpstream3(arg1,(struct svn_repos_parse_fns3_t const *)arg2,arg3,arg4,arg5,arg6,arg7);
+ result = (svn_error_t *)svn_repos_get_fs_build_parser5((struct svn_repos_parse_fns3_t const **)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,(char const *)arg9,arg10,arg11,arg12,arg13,arg14,arg15);
@@ -13916,6 +15332,13 @@ XS(_wrap_svn_repos_parse_dumpstream3) {
}
}
}
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t, 0); argvi++ ;
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0); argvi++ ;
+ }
+
@@ -13923,6 +15346,13 @@ XS(_wrap_svn_repos_parse_dumpstream3) {
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+
+
+
+
XSRETURN(argvi);
fail:
@@ -13932,6 +15362,14 @@ XS(_wrap_svn_repos_parse_dumpstream3) {
+
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+
+
+
+
+
+
SWIG_croak_null();
}
}
@@ -13976,6 +15414,7 @@ XS(_wrap_svn_repos_get_fs_build_parser4) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -14053,13 +15492,7 @@ XS(_wrap_svn_repos_get_fs_build_parser4) {
}
}
{
- /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser4 arg 1 (svn_repos_parse_fns3_t const **) */
-
-
-
-
- SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser4 is not implemented yet");
-
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t, 0); argvi++ ;
}
{
if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0); argvi++ ;
@@ -15387,19 +16820,20 @@ XS(_wrap_svn_repos_parse_dumpstream2) {
void *argp2 = 0 ;
int res2 = 0 ;
int res3 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_parse_dumpstream2(stream,parse_fns,parse_baton,cancel_func,cancel_baton,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_repos_parse_fns2_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -15411,16 +16845,10 @@ XS(_wrap_svn_repos_parse_dumpstream2) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_parse_dumpstream2" "', argument " "3"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_parse_dumpstream2" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_parse_dumpstream2" "', argument " "5"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -15449,16 +16877,12 @@ XS(_wrap_svn_repos_parse_dumpstream2) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -15476,19 +16900,20 @@ XS(_wrap_svn_repos_parse_dumpstream) {
void *argp2 = 0 ;
int res2 = 0 ;
int res3 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_parse_dumpstream(stream,parse_fns,parse_baton,cancel_func,cancel_baton,pool);");
}
{
svn_swig_pl_make_stream (&arg1, ST(0));
+ SPAGAIN;
}
res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_repos_parse_fns_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
@@ -15500,16 +16925,10 @@ XS(_wrap_svn_repos_parse_dumpstream) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_parse_dumpstream" "', argument " "3"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_parse_dumpstream" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
- }
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_parse_dumpstream" "', argument " "5"" of type '" "void *""'");
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -15538,16 +16957,12 @@ XS(_wrap_svn_repos_parse_dumpstream) {
-
-
XSRETURN(argvi);
fail:
-
-
SWIG_croak_null();
}
}
@@ -15586,6 +17001,7 @@ XS(_wrap_svn_repos_get_fs_build_parser3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -15653,7 +17069,13 @@ XS(_wrap_svn_repos_get_fs_build_parser3) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t, 0); argvi++ ;
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser3 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser3 is not implemented yet");
+
}
{
if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0); argvi++ ;
@@ -15713,6 +17135,7 @@ XS(_wrap_svn_repos_get_fs_build_parser2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -15736,6 +17159,7 @@ XS(_wrap_svn_repos_get_fs_build_parser2) {
arg5 = (enum svn_repos_load_uuid)(val5);
{
svn_swig_pl_make_stream (&arg6, ST(3));
+ SPAGAIN;
}
res7 = SWIG_AsCharPtrAndSize(ST(4), &buf7, NULL, &alloc7);
if (!SWIG_IsOK(res7)) {
@@ -15768,7 +17192,13 @@ XS(_wrap_svn_repos_get_fs_build_parser2) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t, 0); argvi++ ;
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser2 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser2 is not implemented yet");
+
}
{
if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0); argvi++ ;
@@ -15824,6 +17254,7 @@ XS(_wrap_svn_repos_get_fs_build_parser) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -15847,6 +17278,7 @@ XS(_wrap_svn_repos_get_fs_build_parser) {
arg5 = (enum svn_repos_load_uuid)(val5);
{
svn_swig_pl_make_stream (&arg6, ST(3));
+ SPAGAIN;
}
res7 = SWIG_AsCharPtrAndSize(ST(4), &buf7, NULL, &alloc7);
if (!SWIG_IsOK(res7)) {
@@ -15930,6 +17362,7 @@ XS(_wrap_svn_repos_authz_read2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -16014,6 +17447,7 @@ XS(_wrap_svn_repos_authz_read) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -16086,6 +17520,7 @@ XS(_wrap_svn_repos_authz_parse) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -16093,9 +17528,11 @@ XS(_wrap_svn_repos_authz_parse) {
}
{
svn_swig_pl_make_stream (&arg2, ST(0));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
if (items > 2) {
@@ -16171,6 +17608,7 @@ XS(_wrap_svn_repos_authz_check_access) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 5) || (items > 6)) {
@@ -16274,6 +17712,7 @@ XS(_wrap_svn_repos_check_revision_access) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_repos_check_revision_access(access_level,repos,revision,authz_read_func,authz_read_baton,pool);");
@@ -16295,10 +17734,10 @@ XS(_wrap_svn_repos_check_revision_access) {
arg3 = (svn_revnum_t)(val3);
{
if (SvOK(ST(3))) {
- arg4 = svn_swig_pl_thunk_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_pl_thunk_authz_func;
arg5 = ST(3);
} else {
- arg4 = NULL;
+ arg4 = (svn_repos_authz_func_t) NULL;
arg5 = NULL;
}
}
@@ -16342,178 +17781,6 @@ XS(_wrap_svn_repos_check_revision_access) {
}
-XS(_wrap_svn_repos_fs_get_inherited_props) {
- {
- apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
- svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
- char *arg3 = (char *) 0 ;
- char *arg4 = (char *) 0 ;
- svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
- void *arg6 = (void *) 0 ;
- apr_pool_t *arg7 = (apr_pool_t *) 0 ;
- apr_pool_t *arg8 = (apr_pool_t *) 0 ;
- apr_pool_t *_global_pool ;
- apr_array_header_t *temp1 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- int res3 ;
- char *buf3 = 0 ;
- int alloc3 = 0 ;
- int res4 ;
- char *buf4 = 0 ;
- int alloc4 = 0 ;
- int argvi = 0;
- svn_error_t *result = 0 ;
- dXSARGS;
-
- {
- _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
- }
- {
- _global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
- }
- arg1 = &temp1;
- if ((items < 4) || (items > 6)) {
- SWIG_croak("Usage: svn_repos_fs_get_inherited_props(root,path,propname,authz_read_func,authz_read_baton,result_pool,scratch_pool);");
- }
- res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "2"" of type '" "svn_fs_root_t *""'");
- }
- arg2 = (svn_fs_root_t *)(argp2);
- res3 = SWIG_AsCharPtrAndSize(ST(1), &buf3, NULL, &alloc3);
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "3"" of type '" "char const *""'");
- }
- arg3 = (char *)(buf3);
- res4 = SWIG_AsCharPtrAndSize(ST(2), &buf4, NULL, &alloc4);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_repos_fs_get_inherited_props" "', argument " "4"" of type '" "char const *""'");
- }
- arg4 = (char *)(buf4);
- {
- if (SvOK(ST(3))) {
- arg5 = svn_swig_pl_thunk_authz_func;
- arg6 = ST(3);
- } else {
- arg5 = NULL;
- arg6 = NULL;
- }
- }
- if (items > 4) {
-
- }
- if (items > 5) {
-
- }
- {
- result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
-
-
-
- }
- {
- if (result) {
- SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
-
- if (SvOK(exception_handler)) {
- SV *callback_result;
-
- svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
- &callback_result, "S", result,
- SWIGTYPE_p_svn_error_t);
- } else {
- ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
- argvi++;
- }
- }
- }
- {
- /* FIXME: Missing argout typemap: svn_repos_fs_get_inherited_props arg 1 (apr_array_header_t **) */
-
-
-
-
- SWIG_exception(SWIG_ValueError, "svn_repos_fs_get_inherited_props is not implemented yet");
-
- }
-
-
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
- if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
-
-
- XSRETURN(argvi);
- fail:
-
-
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
- if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_repos_remember_client_capabilities) {
- {
- svn_repos_t *arg1 = (svn_repos_t *) 0 ;
- apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- int argvi = 0;
- svn_error_t *result = 0 ;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_repos_remember_client_capabilities(repos,capabilities);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_repos_remember_client_capabilities" "', argument " "1"" of type '" "svn_repos_t *""'");
- }
- arg1 = (svn_repos_t *)(argp1);
- res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_remember_client_capabilities" "', argument " "2"" of type '" "apr_array_header_t const *""'");
- }
- arg2 = (apr_array_header_t *)(argp2);
- {
- result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
-
-
-
- }
- {
- if (result) {
- SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
-
- if (SvOK(exception_handler)) {
- SV *callback_result;
-
- svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
- &callback_result, "S", result,
- SWIGTYPE_p_svn_error_t);
- } else {
- ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
- argvi++;
- }
- }
- }
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
XS(_wrap_svn_repos_parse_fns3_invoke_magic_header_record) {
{
svn_repos_parse_fns3_t *arg1 = (svn_repos_parse_fns3_t *) 0 ;
@@ -16532,6 +17799,7 @@ XS(_wrap_svn_repos_parse_fns3_invoke_magic_header_record) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_parse_fns3_invoke_magic_header_record(_obj,version,parse_baton,pool);");
@@ -16609,6 +17877,7 @@ XS(_wrap_svn_repos_parse_fns3_invoke_uuid_record) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_parse_fns3_invoke_uuid_record(_obj,uuid,parse_baton,pool);");
@@ -16687,6 +17956,7 @@ XS(_wrap_svn_repos_parse_fns3_invoke_new_revision_record) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -16771,6 +18041,7 @@ XS(_wrap_svn_repos_parse_fns3_invoke_new_node_record) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -17167,7 +18438,11 @@ XS(_wrap_svn_repos_parse_fns3_invoke_set_fulltext) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg2); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg2);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -17386,6 +18661,7 @@ XS(_wrap_svn_repos_parse_fns2_invoke_new_revision_record) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -17469,6 +18745,7 @@ XS(_wrap_svn_repos_parse_fns2_invoke_uuid_record) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_repos_parse_fns2_invoke_uuid_record(_obj,uuid,parse_baton,pool);");
@@ -17547,6 +18824,7 @@ XS(_wrap_svn_repos_parse_fns2_invoke_new_node_record) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -17943,7 +19221,11 @@ XS(_wrap_svn_repos_parse_fns2_invoke_set_fulltext) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg2); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg2);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -18165,6 +19447,7 @@ XS(_wrap_svn_repos_invoke_authz_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 4) || (items > 5)) {
@@ -18266,6 +19549,7 @@ XS(_wrap_svn_repos_invoke_authz_callback) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 5) || (items > 6)) {
@@ -18348,77 +19632,99 @@ XS(_wrap_svn_repos_invoke_authz_callback) {
}
-XS(_wrap_svn_repos_invoke_file_rev_handler) {
+XS(_wrap_svn_repos_invoke_notify_func) {
{
- svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
+ svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
- apr_hash_t *arg5 = (apr_hash_t *) 0 ;
- svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
- void **arg7 = (void **) 0 ;
- apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
- apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res2 ;
- int res3 ;
- char *buf3 = 0 ;
- int alloc3 = 0 ;
- long val4 ;
- int ecode4 = 0 ;
- void *argp5 = 0 ;
- int res5 = 0 ;
- svn_txdelta_window_handler_t temp6 ;
- void *temp7 ;
- void *argp8 = 0 ;
- int res8 = 0 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
int argvi = 0;
- svn_error_t *result = 0 ;
dXSARGS;
{
- _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- arg6 = &temp6;
- arg7 = &temp7;
- if ((items < 6) || (items > 7)) {
- SWIG_croak("Usage: svn_repos_invoke_file_rev_handler(_obj,baton,path,rev,rev_props,prop_diffs,pool);");
+ if ((items < 3) || (items > 4)) {
+ SWIG_croak("Usage: svn_repos_invoke_notify_func(_obj,baton,notify,scratch_pool);");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "1"" of type '" "svn_repos_file_rev_handler_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_notify_func" "', argument " "1"" of type '" "svn_repos_notify_func_t""'");
}
}
res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "2"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_notify_func" "', argument " "2"" of type '" "void *""'");
}
- res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ res3 = SWIG_ConvertPtr(ST(2), &argp3,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "3"" of type '" "char const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_notify_func" "', argument " "3"" of type '" "svn_repos_notify_t const *""'");
}
- arg3 = (char *)(buf3);
- ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
- if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "4"" of type '" "svn_revnum_t""'");
- }
- arg4 = (svn_revnum_t)(val4);
- res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_apr_hash_t, 0 | 0 );
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "5"" of type '" "apr_hash_t *""'");
+ arg3 = (svn_repos_notify_t *)(argp3);
+ if (items > 3) {
+
}
- arg5 = (apr_hash_t *)(argp5);
- res8 = SWIG_ConvertPtr(ST(5), &argp8,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "8"" of type '" "apr_array_header_t *""'");
+ {
+ svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+
+
+
}
- arg8 = (apr_array_header_t *)(argp8);
- if (items > 6) {
+ ST(argvi) = sv_newmortal();
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_repos_invoke_freeze_func) {
+ {
+ svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 2) || (items > 3)) {
+ SWIG_croak("Usage: svn_repos_invoke_freeze_func(_obj,baton,pool);");
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_freeze_func" "', argument " "1"" of type '" "svn_repos_freeze_func_t""'");
+ }
+ }
+ res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_freeze_func" "', argument " "2"" of type '" "void *""'");
+ }
+ if (items > 2) {
}
{
- result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
@@ -18439,18 +19745,6 @@ XS(_wrap_svn_repos_invoke_file_rev_handler) {
}
}
}
- {
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg6, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0); argvi++ ;
- }
- {
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg7, SWIGTYPE_p_void, 0); argvi++ ;
- }
-
-
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
-
@@ -18458,70 +19752,92 @@ XS(_wrap_svn_repos_invoke_file_rev_handler) {
fail:
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
-
-
-
SWIG_croak_null();
}
}
-XS(_wrap_svn_repos_invoke_notify_func) {
+XS(_wrap_svn_repos_invoke_history_func) {
{
- svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
+ svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
void *arg2 = (void *) 0 ;
- svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
- apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res2 ;
- void *argp3 = 0 ;
- int res3 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
int argvi = 0;
+ svn_error_t *result = 0 ;
dXSARGS;
{
- _global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ _global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 3) || (items > 4)) {
- SWIG_croak("Usage: svn_repos_invoke_notify_func(_obj,baton,notify,scratch_pool);");
+ if ((items < 4) || (items > 5)) {
+ SWIG_croak("Usage: svn_repos_invoke_history_func(_obj,baton,path,revision,pool);");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_notify_func" "', argument " "1"" of type '" "svn_repos_notify_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_history_func" "', argument " "1"" of type '" "svn_repos_history_func_t""'");
}
}
res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_notify_func" "', argument " "2"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_history_func" "', argument " "2"" of type '" "void *""'");
}
- res3 = SWIG_ConvertPtr(ST(2), &argp3,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_notify_func" "', argument " "3"" of type '" "svn_repos_notify_t const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_history_func" "', argument " "3"" of type '" "char const *""'");
}
- arg3 = (svn_repos_notify_t *)(argp3);
- if (items > 3) {
+ arg3 = (char *)(buf3);
+ ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_invoke_history_func" "', argument " "4"" of type '" "svn_revnum_t""'");
+ }
+ arg4 = (svn_revnum_t)(val4);
+ if (items > 4) {
}
{
- svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+ result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
}
- ST(argvi) = sv_newmortal();
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
XSRETURN(argvi);
fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
SWIG_croak_null();
@@ -18529,38 +19845,78 @@ XS(_wrap_svn_repos_invoke_notify_func) {
}
-XS(_wrap_svn_repos_invoke_freeze_func) {
+XS(_wrap_svn_repos_invoke_file_rev_handler) {
{
- svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+ svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
void *arg2 = (void *) 0 ;
- apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_hash_t *arg5 = (apr_hash_t *) 0 ;
+ svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
+ void **arg7 = (void **) 0 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res2 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ svn_txdelta_window_handler_t temp6 ;
+ void *temp7 ;
+ void *argp8 = 0 ;
+ int res8 = 0 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
- _global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ _global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 2) || (items > 3)) {
- SWIG_croak("Usage: svn_repos_invoke_freeze_func(_obj,baton,pool);");
+ arg6 = &temp6;
+ arg7 = &temp7;
+ if ((items < 6) || (items > 7)) {
+ SWIG_croak("Usage: svn_repos_invoke_file_rev_handler(_obj,baton,path,rev,rev_props,prop_diffs,pool);");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_freeze_func" "', argument " "1"" of type '" "svn_repos_freeze_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "1"" of type '" "svn_repos_file_rev_handler_t""'");
}
}
res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_freeze_func" "', argument " "2"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "2"" of type '" "void *""'");
}
- if (items > 2) {
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "4"" of type '" "svn_revnum_t""'");
+ }
+ arg4 = (svn_revnum_t)(val4);
+ res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "5"" of type '" "apr_hash_t *""'");
+ }
+ arg5 = (apr_hash_t *)(argp5);
+ res8 = SWIG_ConvertPtr(ST(5), &argp8,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_repos_invoke_file_rev_handler" "', argument " "8"" of type '" "apr_array_header_t *""'");
+ }
+ arg8 = (apr_array_header_t *)(argp8);
+ if (items > 6) {
}
{
- result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
@@ -18581,6 +19937,18 @@ XS(_wrap_svn_repos_invoke_freeze_func) {
}
}
}
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg6, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0); argvi++ ;
+ }
+ {
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj(*arg7, SWIGTYPE_p_void, 0); argvi++ ;
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
@@ -18588,61 +19956,67 @@ XS(_wrap_svn_repos_invoke_freeze_func) {
fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
SWIG_croak_null();
}
}
-XS(_wrap_svn_repos_invoke_history_func) {
+XS(_wrap_svn_repos_invoke_verify_callback) {
{
- svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
+ svn_repos_verify_callback_t arg1 = (svn_repos_verify_callback_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
+ svn_revnum_t arg3 ;
+ svn_error_t *arg4 = (svn_error_t *) 0 ;
apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool ;
int res2 ;
- int res3 ;
- char *buf3 = 0 ;
- int alloc3 = 0 ;
- long val4 ;
- int ecode4 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
- SWIG_croak("Usage: svn_repos_invoke_history_func(_obj,baton,path,revision,pool);");
+ SWIG_croak("Usage: svn_repos_invoke_verify_callback(_obj,baton,revision,verify_err,scratch_pool);");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(0), (void**)(&arg1), SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_history_func" "', argument " "1"" of type '" "svn_repos_history_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_repos_invoke_verify_callback" "', argument " "1"" of type '" "svn_repos_verify_callback_t""'");
}
}
res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_history_func" "', argument " "2"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_repos_invoke_verify_callback" "', argument " "2"" of type '" "void *""'");
}
- res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_repos_invoke_history_func" "', argument " "3"" of type '" "char const *""'");
- }
- arg3 = (char *)(buf3);
- ecode4 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
- if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_repos_invoke_history_func" "', argument " "4"" of type '" "svn_revnum_t""'");
+ ecode3 = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_repos_invoke_verify_callback" "', argument " "3"" of type '" "svn_revnum_t""'");
}
- arg4 = (svn_revnum_t)(val4);
+ arg3 = (svn_revnum_t)(val3);
+ res4 = SWIG_ConvertPtr(ST(3), &argp4,SWIGTYPE_p_svn_error_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_repos_invoke_verify_callback" "', argument " "4"" of type '" "svn_error_t *""'");
+ }
+ arg4 = (svn_error_t *)(argp4);
if (items > 4) {
}
{
- result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
+ result = (svn_error_t *)svn_repos_invoke_verify_callback(arg1,arg2,arg3,arg4,arg5);
@@ -18665,14 +20039,14 @@ XS(_wrap_svn_repos_invoke_history_func) {
}
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
XSRETURN(argvi);
fail:
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
SWIG_croak_null();
@@ -18704,12 +20078,14 @@ static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_repos_freeze_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char__p_svn_error_t = {"_p_f_p_void_p_q_const__char__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *)|svn_error_t *(*)(void *,char const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_string_t const *)|svn_error_t *(*)(void *,char const *,svn_string_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_repos_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_boolean_t,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_pool_t *)|svn_repos_history_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void = {"_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void", "svn_repos_notify_func_t|void (*)(void *,struct svn_repos_notify_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "svn_repos_verify_callback_t|struct svn_error_t *(*)(void *,svn_revnum_t,svn_error_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_repos_authz_access_t,svn_boolean_t *,svn_fs_root_t *,char const *,void *,apr_pool_t *)|svn_repos_authz_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t = {"_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_revnum_t,char const *,char const *,void *)|svn_commit_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -18729,6 +20105,7 @@ static swig_type_info _swigt__p_p_svn_repos_parse_fns_t = {"_p_p_svn_repos_parse
static swig_type_info _swigt__p_p_svn_repos_t = {"_p_p_svn_repos_t", "struct svn_repos_t **|svn_repos_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -18763,8 +20140,13 @@ static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -18772,6 +20154,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -18842,12 +20225,14 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
&_swigt__p_int,
@@ -18867,6 +20252,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_repos_t,
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -18901,8 +20287,13 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -18910,6 +20301,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -18980,12 +20372,14 @@ static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t[] = { {&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -19005,6 +20399,7 @@ static swig_cast_info _swigc__p_p_svn_repos_parse_fns_t[] = { {&_swigt__p_p_svn
static swig_cast_info _swigc__p_p_svn_repos_t[] = { {&_swigt__p_p_svn_repos_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -19039,8 +20434,13 @@ static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -19048,6 +20448,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -19118,12 +20519,14 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
_swigc__p_int,
@@ -19143,6 +20546,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_repos_t,
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -19177,8 +20581,13 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -19186,6 +20595,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -19267,8 +20677,13 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_notify_t_node_action_get", _wrap_svn_repos_notify_t_node_action_get},
{"SVN::_Repos::svn_repos_notify_t_path_set", _wrap_svn_repos_notify_t_path_set},
{"SVN::_Repos::svn_repos_notify_t_path_get", _wrap_svn_repos_notify_t_path_get},
+{"SVN::_Repos::svn_repos_notify_t_start_revision_set", _wrap_svn_repos_notify_t_start_revision_set},
+{"SVN::_Repos::svn_repos_notify_t_start_revision_get", _wrap_svn_repos_notify_t_start_revision_get},
+{"SVN::_Repos::svn_repos_notify_t_end_revision_set", _wrap_svn_repos_notify_t_end_revision_set},
+{"SVN::_Repos::svn_repos_notify_t_end_revision_get", _wrap_svn_repos_notify_t_end_revision_get},
{"SVN::_Repos::svn_repos_notify_create", _wrap_svn_repos_notify_create},
{"SVN::_Repos::svn_repos_find_root_path", _wrap_svn_repos_find_root_path},
+{"SVN::_Repos::svn_repos_open3", _wrap_svn_repos_open3},
{"SVN::_Repos::svn_repos_open2", _wrap_svn_repos_open2},
{"SVN::_Repos::svn_repos_open", _wrap_svn_repos_open},
{"SVN::_Repos::svn_repos_create", _wrap_svn_repos_create},
@@ -19276,7 +20691,11 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_upgrade", _wrap_svn_repos_upgrade},
{"SVN::_Repos::svn_repos_delete", _wrap_svn_repos_delete},
{"SVN::_Repos::svn_repos_has_capability", _wrap_svn_repos_has_capability},
+{"SVN::_Repos::svn_repos_capabilities", _wrap_svn_repos_capabilities},
+{"SVN::_Repos::svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities},
{"SVN::_Repos::svn_repos_fs", _wrap_svn_repos_fs},
+{"SVN::_Repos::svn_repos_fs_type", _wrap_svn_repos_fs_type},
+{"SVN::_Repos::svn_repos_hotcopy3", _wrap_svn_repos_hotcopy3},
{"SVN::_Repos::svn_repos_hotcopy2", _wrap_svn_repos_hotcopy2},
{"SVN::_Repos::svn_repos_hotcopy", _wrap_svn_repos_hotcopy},
{"SVN::_Repos::svn_repos_fs_pack2", _wrap_svn_repos_fs_pack2},
@@ -19345,7 +20764,9 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_fs_begin_txn_for_commit2", _wrap_svn_repos_fs_begin_txn_for_commit2},
{"SVN::_Repos::svn_repos_fs_begin_txn_for_commit", _wrap_svn_repos_fs_begin_txn_for_commit},
{"SVN::_Repos::svn_repos_fs_begin_txn_for_update", _wrap_svn_repos_fs_begin_txn_for_update},
+{"SVN::_Repos::svn_repos_fs_lock_many", _wrap_svn_repos_fs_lock_many},
{"SVN::_Repos::svn_repos_fs_lock", _wrap_svn_repos_fs_lock},
+{"SVN::_Repos::svn_repos_fs_unlock_many", _wrap_svn_repos_fs_unlock_many},
{"SVN::_Repos::svn_repos_fs_unlock", _wrap_svn_repos_fs_unlock},
{"SVN::_Repos::svn_repos_fs_get_locks2", _wrap_svn_repos_fs_get_locks2},
{"SVN::_Repos::svn_repos_fs_get_locks", _wrap_svn_repos_fs_get_locks},
@@ -19356,6 +20777,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_fs_revision_prop", _wrap_svn_repos_fs_revision_prop},
{"SVN::_Repos::svn_repos_fs_revision_proplist", _wrap_svn_repos_fs_revision_proplist},
{"SVN::_Repos::svn_repos_fs_change_node_prop", _wrap_svn_repos_fs_change_node_prop},
+{"SVN::_Repos::svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props},
{"SVN::_Repos::svn_repos_fs_change_txn_prop", _wrap_svn_repos_fs_change_txn_prop},
{"SVN::_Repos::svn_repos_fs_change_txn_props", _wrap_svn_repos_fs_change_txn_props},
{"SVN::_Repos::svn_repos_node_t_kind_set", _wrap_svn_repos_node_t_kind_set},
@@ -19380,11 +20802,14 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_node_t_parent_get", _wrap_svn_repos_node_t_parent_get},
{"SVN::_Repos::svn_repos_node_editor", _wrap_svn_repos_node_editor},
{"SVN::_Repos::svn_repos_node_from_baton", _wrap_svn_repos_node_from_baton},
+{"SVN::_Repos::svn_repos_info_format", _wrap_svn_repos_info_format},
+{"SVN::_Repos::svn_repos_verify_fs3", _wrap_svn_repos_verify_fs3},
{"SVN::_Repos::svn_repos_verify_fs2", _wrap_svn_repos_verify_fs2},
{"SVN::_Repos::svn_repos_verify_fs", _wrap_svn_repos_verify_fs},
{"SVN::_Repos::svn_repos_dump_fs3", _wrap_svn_repos_dump_fs3},
{"SVN::_Repos::svn_repos_dump_fs2", _wrap_svn_repos_dump_fs2},
{"SVN::_Repos::svn_repos_dump_fs", _wrap_svn_repos_dump_fs},
+{"SVN::_Repos::svn_repos_load_fs5", _wrap_svn_repos_load_fs5},
{"SVN::_Repos::svn_repos_load_fs4", _wrap_svn_repos_load_fs4},
{"SVN::_Repos::svn_repos_load_fs3", _wrap_svn_repos_load_fs3},
{"SVN::_Repos::svn_repos_load_fs2", _wrap_svn_repos_load_fs2},
@@ -19414,6 +20839,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_parse_fns3_t_close_revision_set", _wrap_svn_repos_parse_fns3_t_close_revision_set},
{"SVN::_Repos::svn_repos_parse_fns3_t_close_revision_get", _wrap_svn_repos_parse_fns3_t_close_revision_get},
{"SVN::_Repos::svn_repos_parse_dumpstream3", _wrap_svn_repos_parse_dumpstream3},
+{"SVN::_Repos::svn_repos_get_fs_build_parser5", _wrap_svn_repos_get_fs_build_parser5},
{"SVN::_Repos::svn_repos_get_fs_build_parser4", _wrap_svn_repos_get_fs_build_parser4},
{"SVN::_Repos::svn_repos_parse_fns2_t_new_revision_record_set", _wrap_svn_repos_parse_fns2_t_new_revision_record_set},
{"SVN::_Repos::svn_repos_parse_fns2_t_new_revision_record_get", _wrap_svn_repos_parse_fns2_t_new_revision_record_get},
@@ -19465,8 +20891,6 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_authz_parse", _wrap_svn_repos_authz_parse},
{"SVN::_Repos::svn_repos_authz_check_access", _wrap_svn_repos_authz_check_access},
{"SVN::_Repos::svn_repos_check_revision_access", _wrap_svn_repos_check_revision_access},
-{"SVN::_Repos::svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props},
-{"SVN::_Repos::svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities},
{"SVN::_Repos::svn_repos_parse_fns3_invoke_magic_header_record", _wrap_svn_repos_parse_fns3_invoke_magic_header_record},
{"SVN::_Repos::svn_repos_parse_fns3_invoke_uuid_record", _wrap_svn_repos_parse_fns3_invoke_uuid_record},
{"SVN::_Repos::svn_repos_parse_fns3_invoke_new_revision_record", _wrap_svn_repos_parse_fns3_invoke_new_revision_record},
@@ -19492,26 +20916,27 @@ static swig_command_info swig_commands[] = {
{"SVN::_Repos::svn_repos_parse_fns2_invoke_close_revision", _wrap_svn_repos_parse_fns2_invoke_close_revision},
{"SVN::_Repos::svn_repos_invoke_authz_func", _wrap_svn_repos_invoke_authz_func},
{"SVN::_Repos::svn_repos_invoke_authz_callback", _wrap_svn_repos_invoke_authz_callback},
-{"SVN::_Repos::svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler},
{"SVN::_Repos::svn_repos_invoke_notify_func", _wrap_svn_repos_invoke_notify_func},
{"SVN::_Repos::svn_repos_invoke_freeze_func", _wrap_svn_repos_invoke_freeze_func},
{"SVN::_Repos::svn_repos_invoke_history_func", _wrap_svn_repos_invoke_history_func},
+{"SVN::_Repos::svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler},
+{"SVN::_Repos::svn_repos_invoke_verify_callback", _wrap_svn_repos_invoke_verify_callback},
{0,0}
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -19521,17 +20946,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -19594,7 +21019,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -19793,312 +21218,347 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_action_change", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_action_change)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_action_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_action_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_action_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_action_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_node_action_replace", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_node_action_replace)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_default", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_default)));
- SvREADONLY_on(sv);
- } while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_ignore", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_ignore)));
- SvREADONLY_on(sv);
- } while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
- SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_force", TRUE | 0x2 | GV_ADDMULTI);
- sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_force)));
- SvREADONLY_on(sv);
- } while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_authz_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_authz_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_authz_read", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_authz_read)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_authz_write", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_authz_write)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_authz_recursive", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_authz_recursive)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_dump_rev_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_dump_rev_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_verify_rev_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_verify_rev_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_dump_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_dump_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_verify_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_verify_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_pack_shard_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_pack_shard_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_pack_shard_end", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_pack_shard_end)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_pack_shard_start_revprop", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_pack_shard_start_revprop)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_pack_shard_end_revprop", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_pack_shard_end_revprop)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_txn_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_txn_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_txn_committed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_txn_committed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_node_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_node_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_node_done", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_node_done)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_copied_node", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_copied_node)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_normalized_mergeinfo", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_normalized_mergeinfo)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_mutex_acquired", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_mutex_acquired)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_recover_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_recover_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_upgrade_start", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_upgrade_start)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_load_skipped_rev", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_load_skipped_rev)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_verify_rev_structure", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_verify_rev_structure)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_pack_revprops", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_pack_revprops)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_cleanup_revprops", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_cleanup_revprops)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_format_bumped", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_format_bumped)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_hotcopy_rev_range", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_hotcopy_rev_range)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_found_old_reference", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_found_old_reference)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_found_old_mergeinfo", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_found_old_mergeinfo)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_invalid_fspath", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_invalid_fspath)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_name_collision", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_name_collision)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_mergeinfo_collision", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_mergeinfo_collision)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_notify_warning_invalid_mergeinfo", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_notify_warning_invalid_mergeinfo)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_CAPABILITY_MERGEINFO", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("mergeinfo"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_MAGIC_HEADER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("SVN-fs-dump-format-version"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_FORMAT_VERSION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(3)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_FORMAT_VERSION_DELTAS", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(3)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_UUID", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("UUID"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_CONTENT_LENGTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Content-length"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_REVISION_NUMBER", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Revision-number"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_NODE_PATH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Node-path"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_NODE_KIND", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Node-kind"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_NODE_ACTION", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Node-action"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Node-copyfrom-path"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Node-copyfrom-rev"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-copy-source-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_SHA1", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-copy-source-sha1"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_CHECKSUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-copy-source-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-content-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_CONTENT_SHA1", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-content-sha1"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_CONTENT_CHECKSUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-content-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Prop-content-length"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-content-length"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_PROP_DELTA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Prop-delta"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_DELTA", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-delta"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-delta-base-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-delta-base-sha1"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr("Text-delta-base-md5"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_default", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_default)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_ignore", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_ignore)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_repos_load_uuid_force", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_load_uuid_force)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_revision_access_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_revision_access_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_revision_access_partial", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_revision_access_partial)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_repos_revision_access_full", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_repos_revision_access_full)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/svn_wc.c b/subversion/bindings/swig/perl/native/svn_wc.c
index c7e723b..d5ea25f 100644
--- a/subversion/bindings/swig/perl/native/svn_wc.c
+++ b/subversion/bindings/swig/perl/native/svn_wc.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPERL
@@ -42,28 +42,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -106,7 +106,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -144,7 +144,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -170,16 +170,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -212,23 +212,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -242,17 +242,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -283,14 +283,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -334,7 +334,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -354,18 +354,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -373,24 +373,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -418,7 +407,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -453,7 +442,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -497,7 +486,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -505,14 +494,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -521,18 +510,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -541,11 +530,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -570,14 +559,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -596,12 +585,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -617,7 +606,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -631,21 +620,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -705,18 +694,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1684,7 +1673,7 @@ static swig_module_info swig_module = {swig_types, 179, 0, 0, 0, 0};
#define SWIG_name "SVN::_Wc::boot_SVN___Wc"
#define SWIG_prefix "SVN::_Wc::"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2403,9 +2392,11 @@ XS(_wrap_svn_wc_context_create) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -2537,16 +2528,16 @@ XS(_wrap_svn_wc_adm_open3) {
int ecode4 = 0 ;
int val5 ;
int ecode5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_adm_open3(associated,path,write_lock,levels_to_lock,cancel_func,cancel_baton,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -2570,16 +2561,10 @@ XS(_wrap_svn_wc_adm_open3) {
}
arg5 = (int)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_adm_open3" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(4);
}
- res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_adm_open3" "', argument " "7"" of type '" "void *""'");
- }
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -2613,8 +2598,6 @@ XS(_wrap_svn_wc_adm_open3) {
-
-
XSRETURN(argvi);
fail:
@@ -2623,8 +2606,6 @@ XS(_wrap_svn_wc_adm_open3) {
-
-
SWIG_croak_null();
}
}
@@ -2655,6 +2636,7 @@ XS(_wrap_svn_wc_adm_open2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -2752,6 +2734,7 @@ XS(_wrap_svn_wc_adm_open) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -2845,16 +2828,16 @@ XS(_wrap_svn_wc_adm_probe_open3) {
int ecode4 = 0 ;
int val5 ;
int ecode5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_adm_probe_open3(associated,path,write_lock,levels_to_lock,cancel_func,cancel_baton,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -2878,16 +2861,10 @@ XS(_wrap_svn_wc_adm_probe_open3) {
}
arg5 = (int)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_adm_probe_open3" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_adm_probe_open3" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(4);
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -2921,8 +2898,6 @@ XS(_wrap_svn_wc_adm_probe_open3) {
-
-
XSRETURN(argvi);
fail:
@@ -2931,8 +2906,6 @@ XS(_wrap_svn_wc_adm_probe_open3) {
-
-
SWIG_croak_null();
}
}
@@ -2963,6 +2936,7 @@ XS(_wrap_svn_wc_adm_probe_open2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -3060,6 +3034,7 @@ XS(_wrap_svn_wc_adm_probe_open) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -3154,18 +3129,18 @@ XS(_wrap_svn_wc_adm_open_anchor) {
int ecode5 = 0 ;
int val6 ;
int ecode6 = 0 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_adm_open_anchor(path,write_lock,levels_to_lock,cancel_func,cancel_baton,pool);");
}
res4 = SWIG_AsCharPtrAndSize(ST(0), &buf4, NULL, &alloc4);
@@ -3184,16 +3159,10 @@ XS(_wrap_svn_wc_adm_open_anchor) {
}
arg6 = (int)(val6);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_adm_open_anchor" "', argument " "7"" of type '" "svn_cancel_func_t""'");
- }
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(3);
}
- res8 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_adm_open_anchor" "', argument " "8"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -3238,8 +3207,6 @@ XS(_wrap_svn_wc_adm_open_anchor) {
-
-
XSRETURN(argvi);
fail:
@@ -3249,8 +3216,6 @@ XS(_wrap_svn_wc_adm_open_anchor) {
-
-
SWIG_croak_null();
}
}
@@ -3275,6 +3240,7 @@ XS(_wrap_svn_wc_adm_retrieve) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -3352,6 +3318,7 @@ XS(_wrap_svn_wc_adm_probe_retrieve) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -3431,16 +3398,16 @@ XS(_wrap_svn_wc_adm_probe_try3) {
int ecode4 = 0 ;
int val5 ;
int ecode5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_adm_probe_try3(associated,path,write_lock,levels_to_lock,cancel_func,cancel_baton,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -3464,16 +3431,10 @@ XS(_wrap_svn_wc_adm_probe_try3) {
}
arg5 = (int)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_adm_probe_try3" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_adm_probe_try3" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(4);
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -3507,8 +3468,6 @@ XS(_wrap_svn_wc_adm_probe_try3) {
-
-
XSRETURN(argvi);
fail:
@@ -3517,8 +3476,6 @@ XS(_wrap_svn_wc_adm_probe_try3) {
-
-
SWIG_croak_null();
}
}
@@ -3549,6 +3506,7 @@ XS(_wrap_svn_wc_adm_probe_try2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -3646,6 +3604,7 @@ XS(_wrap_svn_wc_adm_probe_try) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -3731,6 +3690,7 @@ XS(_wrap_svn_wc_adm_close2) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_adm_close2(adm_access,scratch_pool);");
@@ -3946,6 +3906,7 @@ XS(_wrap_svn_wc_locked2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -4033,6 +3994,7 @@ XS(_wrap_svn_wc_locked) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -4101,6 +4063,7 @@ XS(_wrap_svn_wc_is_adm_dir) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_is_adm_dir(name,pool);");
@@ -4141,6 +4104,7 @@ XS(_wrap_svn_wc_get_adm_dir) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_wc_get_adm_dir(pool);");
@@ -4178,6 +4142,7 @@ XS(_wrap_svn_wc_set_adm_dir) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_set_adm_dir(name,pool);");
@@ -4233,6 +4198,7 @@ XS(_wrap_svn_wc_init_traversal_info) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_wc_init_traversal_info(pool);");
@@ -4515,6 +4481,7 @@ XS(_wrap_svn_wc_external_item2_t_revision_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -4527,7 +4494,11 @@ XS(_wrap_svn_wc_external_item2_t_revision_set) {
}
arg1 = (struct svn_wc_external_item2_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->revision = *arg2;
ST(argvi) = sv_newmortal();
@@ -4577,6 +4548,7 @@ XS(_wrap_svn_wc_external_item2_t_peg_revision_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -4589,7 +4561,11 @@ XS(_wrap_svn_wc_external_item2_t_peg_revision_set) {
}
arg1 = (struct svn_wc_external_item2_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->peg_revision = *arg2;
ST(argvi) = sv_newmortal();
@@ -4699,6 +4675,7 @@ XS(_wrap_svn_wc_external_item2_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -4755,6 +4732,7 @@ XS(_wrap_svn_wc_external_item_create) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 0) || (items > 1)) {
@@ -4812,6 +4790,7 @@ XS(_wrap_svn_wc_external_item2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_external_item2_dup(item,pool);");
@@ -4995,6 +4974,7 @@ XS(_wrap_svn_wc_external_item_t_revision_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -5007,7 +4987,11 @@ XS(_wrap_svn_wc_external_item_t_revision_set) {
}
arg1 = (struct svn_wc_external_item_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->revision = *arg2;
ST(argvi) = sv_newmortal();
@@ -5118,6 +5102,7 @@ XS(_wrap_svn_wc_external_item_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_external_item_dup(item,pool);");
@@ -5171,10 +5156,11 @@ XS(_wrap_svn_wc_parse_externals_description3) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
- SWIG_croak("Usage: svn_wc_parse_externals_description3(parent_directory,desc,canonicalize_url,pool);");
+ SWIG_croak("Usage: svn_wc_parse_externals_description3(defining_directory,desc,canonicalize_url,pool);");
}
res2 = SWIG_AsCharPtrAndSize(ST(0), &buf2, NULL, &alloc2);
if (!SWIG_IsOK(res2)) {
@@ -5257,6 +5243,7 @@ XS(_wrap_svn_wc_parse_externals_description2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -5336,6 +5323,7 @@ XS(_wrap_svn_wc_parse_externals_description) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -7024,6 +7012,7 @@ XS(_wrap_svn_wc_create_notify) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_create_notify(path,action,pool);");
@@ -7078,6 +7067,7 @@ XS(_wrap_svn_wc_create_notify_url) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_create_notify_url(url,action,pool);");
@@ -7128,6 +7118,7 @@ XS(_wrap_svn_wc_dup_notify) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_dup_notify(notify,pool);");
@@ -7590,6 +7581,7 @@ XS(_wrap_svn_wc_conflict_version_create2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_conflict_version_create2(repos_root_url,repos_uuid,repos_relpath,revision,kind,result_pool);");
@@ -7672,6 +7664,7 @@ XS(_wrap_svn_wc_conflict_version_create) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_conflict_version_create(repos_url,path_in_repos,peg_rev,node_kind,pool);");
@@ -7736,6 +7729,7 @@ XS(_wrap_svn_wc_conflict_version_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_conflict_version_dup(version,pool);");
@@ -7766,1092 +7760,6 @@ XS(_wrap_svn_wc_conflict_version_dup) {
}
-XS(_wrap_svn_wc_conflict_description2_t_local_abspath_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_local_abspath_set(self,local_abspath);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_local_abspath_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_local_abspath_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->local_abspath) free((char *)arg1->local_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->local_abspath = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_local_abspath_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_local_abspath_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_local_abspath_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->local_abspath);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_node_kind_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_node_kind_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_node_kind_set(self,node_kind);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_node_kind_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_node_kind_set" "', argument " "2"" of type '" "svn_node_kind_t""'");
- }
- arg2 = (svn_node_kind_t)(val2);
- if (arg1) (arg1)->node_kind = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_node_kind_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_node_kind_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_node_kind_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_node_kind_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_node_kind_t) ((arg1)->node_kind);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_kind_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_kind_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_kind_set(self,kind);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_kind_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_kind_set" "', argument " "2"" of type '" "svn_wc_conflict_kind_t""'");
- }
- arg2 = (svn_wc_conflict_kind_t)(val2);
- if (arg1) (arg1)->kind = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_kind_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_kind_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_kind_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_kind_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_kind_t) ((arg1)->kind);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_property_name_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_property_name_set(self,property_name);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_property_name_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_property_name_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->property_name) free((char *)arg1->property_name);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->property_name = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_property_name_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_property_name_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_property_name_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->property_name);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_is_binary_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_boolean_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_is_binary_set(self,is_binary);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_is_binary_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_is_binary_set" "', argument " "2"" of type '" "svn_boolean_t""'");
- }
- arg2 = (svn_boolean_t)(val2);
- if (arg1) (arg1)->is_binary = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_is_binary_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_boolean_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_is_binary_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_is_binary_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_boolean_t) ((arg1)->is_binary);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_mime_type_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_mime_type_set(self,mime_type);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_mime_type_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_mime_type_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->mime_type) free((char *)arg1->mime_type);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->mime_type = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_mime_type_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_mime_type_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_mime_type_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->mime_type);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_action_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_action_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_action_set(self,action);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_action_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_action_set" "', argument " "2"" of type '" "svn_wc_conflict_action_t""'");
- }
- arg2 = (svn_wc_conflict_action_t)(val2);
- if (arg1) (arg1)->action = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_action_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_action_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_action_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_action_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_action_t) ((arg1)->action);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_reason_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_reason_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_reason_set(self,reason);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_reason_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_reason_set" "', argument " "2"" of type '" "svn_wc_conflict_reason_t""'");
- }
- arg2 = (svn_wc_conflict_reason_t)(val2);
- if (arg1) (arg1)->reason = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_reason_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_reason_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_reason_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_reason_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_reason_t) ((arg1)->reason);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_base_abspath_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_base_abspath_set(self,base_abspath);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_base_abspath_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_base_abspath_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->base_abspath) free((char *)arg1->base_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->base_abspath = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_base_abspath_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_base_abspath_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_base_abspath_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->base_abspath);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_their_abspath_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_their_abspath_set(self,their_abspath);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_their_abspath_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_their_abspath_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->their_abspath) free((char *)arg1->their_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->their_abspath = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_their_abspath_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_their_abspath_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_their_abspath_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->their_abspath);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_my_abspath_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_my_abspath_set(self,my_abspath);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_my_abspath_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_my_abspath_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->my_abspath) free((char *)arg1->my_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->my_abspath = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_my_abspath_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_my_abspath_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_my_abspath_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->my_abspath);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_merged_file_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_merged_file_set(self,merged_file);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_merged_file_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_merged_file_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_merged_file_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_merged_file_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_merged_file_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->merged_file);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_operation_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_operation_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_operation_set(self,operation);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_operation_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_description2_t_operation_set" "', argument " "2"" of type '" "svn_wc_operation_t""'");
- }
- arg2 = (svn_wc_operation_t)(val2);
- if (arg1) (arg1)->operation = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_operation_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_operation_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_operation_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_operation_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_operation_t) ((arg1)->operation);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_src_left_version_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_src_left_version_set(self,src_left_version);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_src_left_version_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_wc_conflict_version_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_src_left_version_set" "', argument " "2"" of type '" "svn_wc_conflict_version_t const *""'");
- }
- arg2 = (svn_wc_conflict_version_t *)(argp2);
- if (arg1) (arg1)->src_left_version = (svn_wc_conflict_version_t const *)arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_src_left_version_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_version_t *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_src_left_version_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_src_left_version_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_version_t *) ((arg1)->src_left_version);
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_version_t, 0 | SWIG_SHADOW); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_src_right_version_set) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_src_right_version_set(self,src_right_version);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_src_right_version_set" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_wc_conflict_version_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_description2_t_src_right_version_set" "', argument " "2"" of type '" "svn_wc_conflict_version_t const *""'");
- }
- arg2 = (svn_wc_conflict_version_t *)(argp2);
- if (arg1) (arg1)->src_right_version = (svn_wc_conflict_version_t const *)arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_description2_t_src_right_version_get) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_version_t *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_description2_t_src_right_version_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_t_src_right_version_get" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_version_t *) ((arg1)->src_right_version);
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_version_t, 0 | SWIG_SHADOW); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_new_svn_wc_conflict_description2_t) {
- {
- int argvi = 0;
- struct svn_wc_conflict_description2_t *result = 0 ;
- dXSARGS;
-
- if ((items < 0) || (items > 0)) {
- SWIG_croak("Usage: new_svn_wc_conflict_description2_t();");
- }
- {
- result = (struct svn_wc_conflict_description2_t *)calloc(1, sizeof(struct svn_wc_conflict_description2_t));
-
-
-
- }
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, SWIG_OWNER | SWIG_SHADOW); argvi++ ;
- XSRETURN(argvi);
- fail:
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_delete_svn_wc_conflict_description2_t) {
- {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: delete_svn_wc_conflict_description2_t(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_svn_wc_conflict_description2_t" "', argument " "1"" of type '" "struct svn_wc_conflict_description2_t *""'");
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- {
- free((char *) arg1);
-
-
-
- }
- ST(argvi) = sv_newmortal();
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
XS(_wrap_svn_wc_conflict_description_t_path_set) {
{
struct svn_wc_conflict_description_t *arg1 = (struct svn_wc_conflict_description_t *) 0 ;
@@ -10017,6 +8925,7 @@ XS(_wrap_svn_wc_conflict_description_create_text2) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_text2(local_abspath,result_pool);");
@@ -10035,7 +8944,7 @@ XS(_wrap_svn_wc_conflict_description_create_text2) {
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | SWIG_SHADOW); argvi++ ;
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0); argvi++ ;
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
XSRETURN(argvi);
@@ -10064,6 +8973,7 @@ XS(_wrap_svn_wc_conflict_description_create_text) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_text(path,adm_access,pool);");
@@ -10122,6 +9032,7 @@ XS(_wrap_svn_wc_conflict_description_create_prop2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_prop2(local_abspath,node_kind,property_name,result_pool);");
@@ -10150,7 +9061,7 @@ XS(_wrap_svn_wc_conflict_description_create_prop2) {
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | SWIG_SHADOW); argvi++ ;
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0); argvi++ ;
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
@@ -10190,6 +9101,7 @@ XS(_wrap_svn_wc_conflict_description_create_prop) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_prop(path,adm_access,node_kind,property_name,pool);");
@@ -10267,6 +9179,7 @@ XS(_wrap_svn_wc_conflict_description_create_tree2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_tree2(local_abspath,node_kind,operation,src_left_version,src_right_version,result_pool);");
@@ -10305,7 +9218,7 @@ XS(_wrap_svn_wc_conflict_description_create_tree2) {
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | SWIG_SHADOW); argvi++ ;
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0); argvi++ ;
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -10354,6 +9267,7 @@ XS(_wrap_svn_wc_conflict_description_create_tree) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_conflict_description_create_tree(path,adm_access,node_kind,operation,src_left_version,src_right_version,pool);");
@@ -10419,7 +9333,7 @@ XS(_wrap_svn_wc_conflict_description_create_tree) {
}
-XS(_wrap_svn_wc__conflict_description2_dup) {
+XS(_wrap_svn_wc_conflict_description2_dup) {
{
svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
@@ -10432,62 +9346,26 @@ XS(_wrap_svn_wc__conflict_description2_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
- SWIG_croak("Usage: svn_wc__conflict_description2_dup(conflict,result_pool);");
+ SWIG_croak("Usage: svn_wc_conflict_description2_dup(conflict,result_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc__conflict_description2_dup" "', argument " "1"" of type '" "svn_wc_conflict_description2_t const *""'");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_description2_dup" "', argument " "1"" of type '" "svn_wc_conflict_description2_t const *""'");
}
arg1 = (svn_wc_conflict_description2_t *)(argp1);
if (items > 1) {
}
{
- result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
+ result = (svn_wc_conflict_description2_t *)svn_wc_conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | SWIG_SHADOW); argvi++ ;
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_result_t_choice_set) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_wc_conflict_choice_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_choice_set(self,choice);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_choice_set" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_result_t_choice_set" "', argument " "2"" of type '" "svn_wc_conflict_choice_t""'");
- }
- arg2 = (svn_wc_conflict_choice_t)(val2);
- if (arg1) (arg1)->choice = arg2;
- ST(argvi) = sv_newmortal();
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0); argvi++ ;
XSRETURN(argvi);
@@ -10499,222 +9377,45 @@ XS(_wrap_svn_wc_conflict_result_t_choice_set) {
}
-XS(_wrap_svn_wc_conflict_result_t_choice_get) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_wc_conflict_choice_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_choice_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_choice_get" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (svn_wc_conflict_choice_t) ((arg1)->choice);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_result_t_merged_file_set) {
+XS(_wrap_svn_wc__conflict_description2_dup) {
{
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- char *arg2 = (char *) 0 ;
+ svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
void *argp1 = 0 ;
int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
int argvi = 0;
+ svn_wc_conflict_description2_t *result = 0 ;
dXSARGS;
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_merged_file_set(self,merged_file);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_merged_file_set" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_conflict_result_t_merged_file_set" "', argument " "2"" of type '" "char const *""'");
- }
- arg2 = (char *)(buf2);
{
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- ST(argvi) = sv_newmortal();
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- XSRETURN(argvi);
- fail:
-
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_result_t_merged_file_get) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- char *result = 0 ;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_merged_file_get(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_merged_file_get" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (char *) ((arg1)->merged_file);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_result_t_save_merged_set) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_boolean_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_save_merged_set(self,save_merged);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_save_merged_set" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
+ _global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_conflict_result_t_save_merged_set" "', argument " "2"" of type '" "svn_boolean_t""'");
- }
- arg2 = (svn_boolean_t)(val2);
- if (arg1) (arg1)->save_merged = arg2;
- ST(argvi) = sv_newmortal();
-
-
- XSRETURN(argvi);
- fail:
-
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_svn_wc_conflict_result_t_save_merged_get) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- svn_boolean_t result;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: svn_wc_conflict_result_t_save_merged_get(self);");
+ if ((items < 1) || (items > 2)) {
+ SWIG_croak("Usage: svn_wc__conflict_description2_dup(conflict,result_pool);");
}
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_conflict_result_t_save_merged_get" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (svn_boolean_t) ((arg1)->save_merged);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
-
- XSRETURN(argvi);
- fail:
-
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_new_svn_wc_conflict_result_t) {
- {
- int argvi = 0;
- struct svn_wc_conflict_result_t *result = 0 ;
- dXSARGS;
-
- if ((items < 0) || (items > 0)) {
- SWIG_croak("Usage: new_svn_wc_conflict_result_t();");
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc__conflict_description2_dup" "', argument " "1"" of type '" "svn_wc_conflict_description2_t const *""'");
}
- {
- result = (struct svn_wc_conflict_result_t *)calloc(1, sizeof(struct svn_wc_conflict_result_t));
-
-
+ arg1 = (svn_wc_conflict_description2_t *)(argp1);
+ if (items > 1) {
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_result_t, SWIG_OWNER | SWIG_SHADOW); argvi++ ;
- XSRETURN(argvi);
- fail:
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_delete_svn_wc_conflict_result_t) {
- {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: delete_svn_wc_conflict_result_t(self);");
- }
- res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_svn_wc_conflict_result_t" "', argument " "1"" of type '" "struct svn_wc_conflict_result_t *""'");
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
{
- free((char *) arg1);
+ result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
}
- ST(argvi) = sv_newmortal();
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0); argvi++ ;
+
XSRETURN(argvi);
fail:
+
SWIG_croak_null();
}
}
@@ -10737,6 +9438,7 @@ XS(_wrap_svn_wc_create_conflict_result) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_create_conflict_result(choice,merged_file,pool);");
@@ -10760,7 +9462,7 @@ XS(_wrap_svn_wc_create_conflict_result) {
}
- ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_result_t, 0 | SWIG_SHADOW); argvi++ ;
+ ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0); argvi++ ;
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -12870,6 +11572,7 @@ XS(_wrap_svn_wc_check_wc2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -12948,6 +11651,7 @@ XS(_wrap_svn_wc_check_wc) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -13022,6 +11726,7 @@ XS(_wrap_svn_wc_has_binary_prop) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -13106,6 +11811,7 @@ XS(_wrap_svn_wc_text_modified_p2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -13197,6 +11903,7 @@ XS(_wrap_svn_wc_text_modified_p) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -13285,6 +11992,7 @@ XS(_wrap_svn_wc_props_modified_p2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -13366,6 +12074,7 @@ XS(_wrap_svn_wc_props_modified_p) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -14654,10 +13363,9 @@ XS(_wrap_svn_wc_entry_t_text_time_get) {
arg1 = (struct svn_wc_entry_t *)(argp1);
result = ((arg1)->text_time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -14724,10 +13432,9 @@ XS(_wrap_svn_wc_entry_t_prop_time_get) {
arg1 = (struct svn_wc_entry_t *)(argp1);
result = ((arg1)->prop_time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -14932,10 +13639,9 @@ XS(_wrap_svn_wc_entry_t_cmt_date_get) {
arg1 = (struct svn_wc_entry_t *)(argp1);
result = ((arg1)->cmt_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -15292,10 +13998,9 @@ XS(_wrap_svn_wc_entry_t_lock_creation_date_get) {
arg1 = (struct svn_wc_entry_t *)(argp1);
result = ((arg1)->lock_creation_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -15711,10 +14416,9 @@ XS(_wrap_svn_wc_entry_t_working_size_get) {
arg1 = (struct svn_wc_entry_t *)(argp1);
result = ((arg1)->working_size);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -16008,6 +14712,7 @@ XS(_wrap_svn_wc_entry_t_file_external_peg_rev_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -16020,7 +14725,11 @@ XS(_wrap_svn_wc_entry_t_file_external_peg_rev_set) {
}
arg1 = (struct svn_wc_entry_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->file_external_peg_rev = *arg2;
ST(argvi) = sv_newmortal();
@@ -16070,6 +14779,7 @@ XS(_wrap_svn_wc_entry_t_file_external_rev_set) {
void *argp1 = 0 ;
int res1 = 0 ;
svn_opt_revision_t rev2 ;
+ apr_pool_t *_global_pool = NULL ;
int argvi = 0;
dXSARGS;
@@ -16082,7 +14792,11 @@ XS(_wrap_svn_wc_entry_t_file_external_rev_set) {
}
arg1 = (struct svn_wc_entry_t *)(argp1);
{
- arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg2 = svn_swig_pl_set_revision(&rev2, ST(1), TRUE, _global_pool);
}
if (arg1) (arg1)->file_external_rev = *arg2;
ST(argvi) = sv_newmortal();
@@ -16202,6 +14916,7 @@ XS(_wrap_svn_wc_entry) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -16285,6 +15000,7 @@ XS(_wrap_svn_wc_entries_read) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -16356,6 +15072,7 @@ XS(_wrap_svn_wc_entry_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_entry_dup(entry,pool);");
@@ -16846,10 +15563,9 @@ XS(_wrap_svn_wc_info_t_recorded_size_get) {
arg1 = (struct svn_wc_info_t *)(argp1);
result = ((arg1)->recorded_size);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -16916,10 +15632,9 @@ XS(_wrap_svn_wc_info_t_recorded_time_get) {
arg1 = (struct svn_wc_info_t *)(argp1);
result = ((arg1)->recorded_time);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -17282,6 +15997,7 @@ XS(_wrap_svn_wc_info_dup) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_info_dup(info,pool);");
@@ -17338,6 +16054,7 @@ XS(_wrap_svn_wc_conflicted_p3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -17443,6 +16160,7 @@ XS(_wrap_svn_wc_conflicted_p2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -17545,6 +16263,7 @@ XS(_wrap_svn_wc_conflicted_p) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -17637,6 +16356,7 @@ XS(_wrap_svn_wc_get_ancestry) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -18034,15 +16754,15 @@ XS(_wrap_svn_wc_walk_entries3) {
int ecode5 = 0 ;
int val6 ;
int ecode6 = 0 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_walk_entries3(path,adm_access,walk_callbacks,walk_baton,depth,show_hidden,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -18075,16 +16795,10 @@ XS(_wrap_svn_wc_walk_entries3) {
}
arg6 = (svn_boolean_t)(val6);
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_walk_entries3" "', argument " "7"" of type '" "svn_cancel_func_t""'");
- }
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_walk_entries3" "', argument " "8"" of type '" "void *""'");
- }
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -18116,8 +16830,6 @@ XS(_wrap_svn_wc_walk_entries3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -18127,8 +16839,6 @@ XS(_wrap_svn_wc_walk_entries3) {
-
-
SWIG_croak_null();
}
}
@@ -18155,15 +16865,15 @@ XS(_wrap_svn_wc_walk_entries2) {
int res4 ;
int val5 ;
int ecode5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_walk_entries2(path,adm_access,walk_callbacks,walk_baton,show_hidden,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -18191,16 +16901,10 @@ XS(_wrap_svn_wc_walk_entries2) {
}
arg5 = (svn_boolean_t)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_walk_entries2" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_walk_entries2" "', argument " "7"" of type '" "void *""'");
- }
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -18231,8 +16935,6 @@ XS(_wrap_svn_wc_walk_entries2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -18241,8 +16943,6 @@ XS(_wrap_svn_wc_walk_entries2) {
-
-
SWIG_croak_null();
}
}
@@ -18273,6 +16973,7 @@ XS(_wrap_svn_wc_walk_entries) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_walk_entries(path,adm_access,walk_callbacks,walk_baton,show_hidden,pool);");
@@ -18362,6 +17063,7 @@ XS(_wrap_svn_wc_mark_missing_deleted) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_mark_missing_deleted(path,parent,pool);");
@@ -18449,6 +17151,7 @@ XS(_wrap_svn_wc_ensure_adm4) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_ensure_adm4(wc_ctx,local_abspath,url,repos_root_url,repos_uuid,revision,depth,scratch_pool);");
@@ -18568,6 +17271,7 @@ XS(_wrap_svn_wc_ensure_adm3) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_ensure_adm3(path,uuid,url,repos,revision,depth,pool);");
@@ -18677,6 +17381,7 @@ XS(_wrap_svn_wc_ensure_adm2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_ensure_adm2(path,uuid,url,repos,revision,pool);");
@@ -18775,6 +17480,7 @@ XS(_wrap_svn_wc_ensure_adm) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_ensure_adm(path,uuid,url,revision,pool);");
@@ -18862,6 +17568,7 @@ XS(_wrap_svn_wc_maybe_set_repos_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_maybe_set_repos_root(adm_access,path,repos,pool);");
@@ -19107,10 +17814,9 @@ XS(_wrap_svn_wc_status3_t_filesize_get) {
arg1 = (struct svn_wc_status3_t *)(argp1);
result = ((arg1)->filesize);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -19697,10 +18403,9 @@ XS(_wrap_svn_wc_status3_t_changed_date_get) {
arg1 = (struct svn_wc_status3_t *)(argp1);
result = ((arg1)->changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -20717,10 +19422,9 @@ XS(_wrap_svn_wc_status3_t_ood_changed_date_get) {
arg1 = (struct svn_wc_status3_t *)(argp1);
result = ((arg1)->ood_changed_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -21015,6 +19719,71 @@ XS(_wrap_svn_wc_status3_t_file_external_get) {
}
+XS(_wrap_svn_wc_status3_t_actual_kind_set) {
+ {
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ svn_node_kind_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ int argvi = 0;
+ dXSARGS;
+
+ if ((items < 2) || (items > 2)) {
+ SWIG_croak("Usage: svn_wc_status3_t_actual_kind_set(self,actual_kind);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_status3_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_status3_t_actual_kind_set" "', argument " "1"" of type '" "struct svn_wc_status3_t *""'");
+ }
+ arg1 = (struct svn_wc_status3_t *)(argp1);
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "svn_wc_status3_t_actual_kind_set" "', argument " "2"" of type '" "svn_node_kind_t""'");
+ }
+ arg2 = (svn_node_kind_t)(val2);
+ if (arg1) (arg1)->actual_kind = arg2;
+ ST(argvi) = sv_newmortal();
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_wc_status3_t_actual_kind_get) {
+ {
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int argvi = 0;
+ svn_node_kind_t result;
+ dXSARGS;
+
+ if ((items < 1) || (items > 1)) {
+ SWIG_croak("Usage: svn_wc_status3_t_actual_kind_get(self);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_status3_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_status3_t_actual_kind_get" "', argument " "1"" of type '" "struct svn_wc_status3_t *""'");
+ }
+ arg1 = (struct svn_wc_status3_t *)(argp1);
+ result = (svn_node_kind_t) ((arg1)->actual_kind);
+ ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;
+
+ XSRETURN(argvi);
+ fail:
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_new_svn_wc_status3_t) {
{
int argvi = 0;
@@ -21849,10 +20618,9 @@ XS(_wrap_svn_wc_status2_t_ood_last_cmt_date_get) {
arg1 = (struct svn_wc_status2_t *)(argp1);
result = ((arg1)->ood_last_cmt_date);
{
- char temp[256];
+ char temp[30];
sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) result);
- ST(argvi) = sv_newmortal();
- sv_setpv((SV*)ST(argvi++), temp);
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = sv_2mortal(newSVpv(temp, 0)); argvi++ ;
}
XSRETURN(argvi);
@@ -22904,6 +21672,7 @@ XS(_wrap_svn_wc_dup_status3) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_dup_status3(orig_stat,pool);");
@@ -22947,6 +21716,7 @@ XS(_wrap_svn_wc_dup_status2) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_dup_status2(orig_stat,pool);");
@@ -22990,6 +21760,7 @@ XS(_wrap_svn_wc_dup_status) {
{
_global_pool = arg2 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 1) || (items > 2)) {
SWIG_croak("Usage: svn_wc_dup_status(orig_stat,pool);");
@@ -23040,9 +21811,11 @@ XS(_wrap_svn_wc_status3) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -23131,6 +21904,7 @@ XS(_wrap_svn_wc_status2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -23208,6 +21982,7 @@ XS(_wrap_svn_wc_status) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -23297,15 +22072,15 @@ XS(_wrap_svn_wc_walk_status) {
void *argp7 = 0 ;
int res7 = 0 ;
int res9 ;
- int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_walk_status(wc_ctx,local_abspath,depth,get_all,no_ignore,ignore_text_mods,ignore_patterns,status_func,status_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -23354,16 +22129,10 @@ XS(_wrap_svn_wc_walk_status) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_walk_status" "', argument " "9"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_walk_status" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(9);
}
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_walk_status" "', argument " "11"" of type '" "void *""'");
- }
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -23398,8 +22167,6 @@ XS(_wrap_svn_wc_walk_status) {
-
-
XSRETURN(argvi);
fail:
@@ -23412,8 +22179,6 @@ XS(_wrap_svn_wc_walk_status) {
-
-
SWIG_croak_null();
}
}
@@ -23467,22 +22232,23 @@ XS(_wrap_svn_wc_get_status_editor5) {
void *argp13 = 0 ;
int res13 = 0 ;
int res15 ;
- int res17 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg18 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg19 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
arg4 = &temp4;
- if ((items < 13) || (items > 15)) {
+ if ((items < 12) || (items > 14)) {
SWIG_croak("Usage: svn_wc_get_status_editor5(wc_ctx,anchor_abspath,target_basename,depth,get_all,no_ignore,depth_as_sticky,server_performs_filtering,ignore_patterns,status_func,status_baton,cancel_func,cancel_baton,result_pool,scratch_pool);");
}
res5 = SWIG_ConvertPtr(ST(0), &argp5,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -23541,19 +22307,13 @@ XS(_wrap_svn_wc_get_status_editor5) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_status_editor5" "', argument " "15"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg16), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_status_editor5" "', argument " "16"" of type '" "svn_cancel_func_t""'");
- }
- }
- res17 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg17), 0, 0);
- if (!SWIG_IsOK(res17)) {
- SWIG_exception_fail(SWIG_ArgError(res17), "in method '" "svn_wc_get_status_editor5" "', argument " "17"" of type '" "void *""'");
+ arg16 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg17 = ST(11);
}
- if (items > 13) {
+ if (items > 12) {
}
- if (items > 14) {
+ if (items > 13) {
}
{
@@ -23610,8 +22370,6 @@ XS(_wrap_svn_wc_get_status_editor5) {
-
-
XSRETURN(argvi);
fail:
@@ -23631,8 +22389,6 @@ XS(_wrap_svn_wc_get_status_editor5) {
-
-
SWIG_croak_null();
}
}
@@ -23675,7 +22431,6 @@ XS(_wrap_svn_wc_get_status_editor4) {
int ecode9 = 0 ;
void *argp10 = 0 ;
int res10 = 0 ;
- int res14 ;
void *argp15 = 0 ;
int res15 = 0 ;
int argvi = 0;
@@ -23684,12 +22439,13 @@ XS(_wrap_svn_wc_get_status_editor4) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
arg4 = &temp4;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_status_editor4(anchor,target,depth,get_all,no_ignore,ignore_patterns,status_func,status_baton,cancel_func,cancel_baton,traversal_info,pool);");
}
res5 = SWIG_ConvertPtr(ST(0), &argp5,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -23723,25 +22479,19 @@ XS(_wrap_svn_wc_get_status_editor4) {
}
arg10 = (apr_array_header_t *)(argp10);
{
- arg11 = svn_swig_pl_status_func3;
+ arg11 = (svn_wc_status_func3_t) svn_swig_pl_status_func3;
arg12 = ST(6);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg13), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_status_editor4" "', argument " "13"" of type '" "svn_cancel_func_t""'");
- }
- }
- res14 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg14), 0, 0);
- if (!SWIG_IsOK(res14)) {
- SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_status_editor4" "', argument " "14"" of type '" "void *""'");
+ arg13 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg14 = ST(7);
}
- res15 = SWIG_ConvertPtr(ST(9), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res15 = SWIG_ConvertPtr(ST(8), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res15)) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_status_editor4" "', argument " "15"" of type '" "svn_wc_traversal_info_t *""'");
}
arg15 = (svn_wc_traversal_info_t *)(argp15);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -23793,8 +22543,6 @@ XS(_wrap_svn_wc_get_status_editor4) {
-
-
XSRETURN(argvi);
fail:
@@ -23809,8 +22557,6 @@ XS(_wrap_svn_wc_get_status_editor4) {
-
-
SWIG_croak_null();
}
}
@@ -23853,7 +22599,6 @@ XS(_wrap_svn_wc_get_status_editor3) {
int ecode9 = 0 ;
void *argp10 = 0 ;
int res10 = 0 ;
- int res14 ;
void *argp15 = 0 ;
int res15 = 0 ;
int argvi = 0;
@@ -23862,12 +22607,13 @@ XS(_wrap_svn_wc_get_status_editor3) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
arg4 = &temp4;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_status_editor3(anchor,target,depth,get_all,no_ignore,ignore_patterns,status_func,status_baton,cancel_func,cancel_baton,traversal_info,pool);");
}
res5 = SWIG_ConvertPtr(ST(0), &argp5,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -23901,25 +22647,19 @@ XS(_wrap_svn_wc_get_status_editor3) {
}
arg10 = (apr_array_header_t *)(argp10);
{
- arg11 = svn_swig_pl_status_func2;
+ arg11 = (svn_wc_status_func2_t) svn_swig_pl_status_func2;
arg12 = ST(6);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg13), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_status_editor3" "', argument " "13"" of type '" "svn_cancel_func_t""'");
- }
- }
- res14 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg14), 0, 0);
- if (!SWIG_IsOK(res14)) {
- SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_status_editor3" "', argument " "14"" of type '" "void *""'");
+ arg13 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg14 = ST(7);
}
- res15 = SWIG_ConvertPtr(ST(9), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res15 = SWIG_ConvertPtr(ST(8), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res15)) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_status_editor3" "', argument " "15"" of type '" "svn_wc_traversal_info_t *""'");
}
arg15 = (svn_wc_traversal_info_t *)(argp15);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -23971,8 +22711,6 @@ XS(_wrap_svn_wc_get_status_editor3) {
-
-
XSRETURN(argvi);
fail:
@@ -23987,8 +22725,6 @@ XS(_wrap_svn_wc_get_status_editor3) {
-
-
SWIG_croak_null();
}
}
@@ -24029,7 +22765,6 @@ XS(_wrap_svn_wc_get_status_editor2) {
int ecode9 = 0 ;
int val10 ;
int ecode10 = 0 ;
- int res14 ;
void *argp15 = 0 ;
int res15 = 0 ;
int argvi = 0;
@@ -24038,12 +22773,13 @@ XS(_wrap_svn_wc_get_status_editor2) {
{
_global_pool = arg16 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
arg4 = &temp4;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_status_editor2(anchor,target,config,recurse,get_all,no_ignore,status_func,status_baton,cancel_func,cancel_baton,traversal_info,pool);");
}
res5 = SWIG_ConvertPtr(ST(0), &argp5,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -24076,25 +22812,19 @@ XS(_wrap_svn_wc_get_status_editor2) {
}
arg10 = (svn_boolean_t)(val10);
{
- arg11 = svn_swig_pl_status_func2;
+ arg11 = (svn_wc_status_func2_t) svn_swig_pl_status_func2;
arg12 = ST(6);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg13), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_status_editor2" "', argument " "13"" of type '" "svn_cancel_func_t""'");
- }
+ arg13 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg14 = ST(7);
}
- res14 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg14), 0, 0);
- if (!SWIG_IsOK(res14)) {
- SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_status_editor2" "', argument " "14"" of type '" "void *""'");
- }
- res15 = SWIG_ConvertPtr(ST(9), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res15 = SWIG_ConvertPtr(ST(8), &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res15)) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_status_editor2" "', argument " "15"" of type '" "svn_wc_traversal_info_t *""'");
}
arg15 = (svn_wc_traversal_info_t *)(argp15);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -24146,8 +22876,6 @@ XS(_wrap_svn_wc_get_status_editor2) {
-
-
XSRETURN(argvi);
fail:
@@ -24162,8 +22890,6 @@ XS(_wrap_svn_wc_get_status_editor2) {
-
-
SWIG_croak_null();
}
}
@@ -24202,7 +22928,6 @@ XS(_wrap_svn_wc_get_status_editor) {
int ecode8 = 0 ;
int val9 ;
int ecode9 = 0 ;
- int res13 ;
void *argp14 = 0 ;
int res14 = 0 ;
int argvi = 0;
@@ -24211,11 +22936,12 @@ XS(_wrap_svn_wc_get_status_editor) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_status_editor(anchor,target,config,recurse,get_all,no_ignore,status_func,status_baton,cancel_func,cancel_baton,traversal_info,pool);");
}
res4 = SWIG_ConvertPtr(ST(0), &argp4,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -24248,25 +22974,19 @@ XS(_wrap_svn_wc_get_status_editor) {
}
arg9 = (svn_boolean_t)(val9);
{
- arg10 = svn_swig_pl_status_func;
+ arg10 = (svn_wc_status_func_t) svn_swig_pl_status_func;
arg11 = ST(6);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg12), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_status_editor" "', argument " "12"" of type '" "svn_cancel_func_t""'");
- }
- }
- res13 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg13), 0, 0);
- if (!SWIG_IsOK(res13)) {
- SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_wc_get_status_editor" "', argument " "13"" of type '" "void *""'");
+ arg12 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg13 = ST(7);
}
- res14 = SWIG_ConvertPtr(ST(9), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res14 = SWIG_ConvertPtr(ST(8), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res14)) {
SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_status_editor" "', argument " "14"" of type '" "svn_wc_traversal_info_t *""'");
}
arg14 = (svn_wc_traversal_info_t *)(argp14);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -24314,8 +23034,6 @@ XS(_wrap_svn_wc_get_status_editor) {
-
-
XSRETURN(argvi);
fail:
@@ -24329,8 +23047,6 @@ XS(_wrap_svn_wc_get_status_editor) {
-
-
SWIG_croak_null();
}
}
@@ -24355,6 +23071,7 @@ XS(_wrap_svn_wc_status_set_repos_locks) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_status_set_repos_locks(set_locks_baton,locks,repos_root,pool);");
@@ -24435,7 +23152,6 @@ XS(_wrap_svn_wc_copy3) {
int alloc3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -24443,8 +23159,9 @@ XS(_wrap_svn_wc_copy3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_copy3(wc_ctx,src_abspath,dst_abspath,metadata_only,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -24468,26 +23185,20 @@ XS(_wrap_svn_wc_copy3) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy3" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_copy3" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy3" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_copy3" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -24519,8 +23230,6 @@ XS(_wrap_svn_wc_copy3) {
-
-
XSRETURN(argvi);
fail:
@@ -24530,8 +23239,6 @@ XS(_wrap_svn_wc_copy3) {
-
-
SWIG_croak_null();
}
}
@@ -24556,7 +23263,6 @@ XS(_wrap_svn_wc_copy2) {
int res3 ;
char *buf3 = 0 ;
int alloc3 = 0 ;
- int res5 ;
int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -24564,8 +23270,9 @@ XS(_wrap_svn_wc_copy2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_copy2(src,dst_parent,dst_basename,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -24584,26 +23291,20 @@ XS(_wrap_svn_wc_copy2) {
}
arg3 = (char *)(buf3);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy2" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
- }
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_copy2" "', argument " "5"" of type '" "void *""'");
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy2" "', argument " "6"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
+ res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
if (!SWIG_IsOK(res7)) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_copy2" "', argument " "7"" of type '" "void *""'");
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -24634,8 +23335,6 @@ XS(_wrap_svn_wc_copy2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -24644,8 +23343,6 @@ XS(_wrap_svn_wc_copy2) {
-
-
SWIG_croak_null();
}
}
@@ -24670,7 +23367,6 @@ XS(_wrap_svn_wc_copy) {
int res3 ;
char *buf3 = 0 ;
int alloc3 = 0 ;
- int res5 ;
int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -24678,8 +23374,9 @@ XS(_wrap_svn_wc_copy) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_copy(src,dst_parent,dst_basename,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -24698,26 +23395,20 @@ XS(_wrap_svn_wc_copy) {
}
arg3 = (char *)(buf3);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
- }
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_copy" "', argument " "5"" of type '" "void *""'");
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_copy" "', argument " "6"" of type '" "svn_wc_notify_func_t""'");
}
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
+ res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
if (!SWIG_IsOK(res7)) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_copy" "', argument " "7"" of type '" "void *""'");
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -24748,8 +23439,6 @@ XS(_wrap_svn_wc_copy) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -24758,8 +23447,6 @@ XS(_wrap_svn_wc_copy) {
-
-
SWIG_croak_null();
}
}
@@ -24787,7 +23474,6 @@ XS(_wrap_svn_wc_move) {
int alloc3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -24795,8 +23481,9 @@ XS(_wrap_svn_wc_move) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_move(wc_ctx,src_abspath,dst_abspath,metadata_only,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -24820,26 +23507,20 @@ XS(_wrap_svn_wc_move) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_move" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_move" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_move" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_move" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -24871,8 +23552,6 @@ XS(_wrap_svn_wc_move) {
-
-
XSRETURN(argvi);
fail:
@@ -24882,8 +23561,6 @@ XS(_wrap_svn_wc_move) {
-
-
SWIG_croak_null();
}
}
@@ -24910,7 +23587,6 @@ XS(_wrap_svn_wc_delete4) {
int ecode3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -24918,8 +23594,9 @@ XS(_wrap_svn_wc_delete4) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_delete4(wc_ctx,local_abspath,keep_local,delete_unversioned_target,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -24943,26 +23620,20 @@ XS(_wrap_svn_wc_delete4) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete4" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_delete4" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete4" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_delete4" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -24994,8 +23665,6 @@ XS(_wrap_svn_wc_delete4) {
-
-
XSRETURN(argvi);
fail:
@@ -25005,8 +23674,6 @@ XS(_wrap_svn_wc_delete4) {
-
-
SWIG_croak_null();
}
}
@@ -25028,7 +23695,6 @@ XS(_wrap_svn_wc_delete3) {
int alloc1 = 0 ;
void *argp2 = 0 ;
int res2 = 0 ;
- int res4 ;
int res6 ;
int val7 ;
int ecode7 = 0 ;
@@ -25038,8 +23704,9 @@ XS(_wrap_svn_wc_delete3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_delete3(path,adm_access,cancel_func,cancel_baton,notify_func,notify_baton,keep_local,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25053,31 +23720,25 @@ XS(_wrap_svn_wc_delete3) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete3" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_delete3" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete3" "', argument " "5"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
+ res6 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_delete3" "', argument " "6"" of type '" "void *""'");
}
- ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val7);
if (!SWIG_IsOK(ecode7)) {
SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_wc_delete3" "', argument " "7"" of type '" "svn_boolean_t""'");
}
arg7 = (svn_boolean_t)(val7);
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -25108,8 +23769,6 @@ XS(_wrap_svn_wc_delete3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -25118,8 +23777,6 @@ XS(_wrap_svn_wc_delete3) {
-
-
SWIG_croak_null();
}
}
@@ -25140,7 +23797,6 @@ XS(_wrap_svn_wc_delete2) {
int alloc1 = 0 ;
void *argp2 = 0 ;
int res2 = 0 ;
- int res4 ;
int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25148,8 +23804,9 @@ XS(_wrap_svn_wc_delete2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_delete2(path,adm_access,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25163,26 +23820,20 @@ XS(_wrap_svn_wc_delete2) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete2" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_delete2" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete2" "', argument " "5"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
+ res6 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_delete2" "', argument " "6"" of type '" "void *""'");
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -25212,8 +23863,6 @@ XS(_wrap_svn_wc_delete2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -25221,8 +23870,6 @@ XS(_wrap_svn_wc_delete2) {
-
-
SWIG_croak_null();
}
}
@@ -25243,7 +23890,6 @@ XS(_wrap_svn_wc_delete) {
int alloc1 = 0 ;
void *argp2 = 0 ;
int res2 = 0 ;
- int res4 ;
int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25251,8 +23897,9 @@ XS(_wrap_svn_wc_delete) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_delete(path,adm_access,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25266,30 +23913,127 @@ XS(_wrap_svn_wc_delete) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete" "', argument " "3"" of type '" "svn_cancel_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete" "', argument " "5"" of type '" "svn_wc_notify_func_t""'");
}
}
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_delete" "', argument " "4"" of type '" "void *""'");
+ res6 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg6), 0, 0);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_delete" "', argument " "6"" of type '" "void *""'");
+ }
+ if (items > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_delete((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
+XS(_wrap_svn_wc_add_from_disk3) {
+ {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_wc_notify_func2_t arg5 = (svn_wc_notify_func2_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int res6 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 6) || (items > 7)) {
+ SWIG_croak("Usage: svn_wc_add_from_disk3(wc_ctx,local_abspath,props,skip_checks,notify_func,notify_baton,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_add_from_disk3" "', argument " "1"" of type '" "svn_wc_context_t *""'");
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_add_from_disk3" "', argument " "2"" of type '" "char const *""'");
}
+ arg2 = (char *)(buf2);
+ {
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
+ arg3 = svn_swig_pl_hash_to_prophash(ST(2), _global_pool);
+ }
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_wc_add_from_disk3" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_delete" "', argument " "5"" of type '" "svn_wc_notify_func_t""'");
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add_from_disk3" "', argument " "5"" of type '" "svn_wc_notify_func2_t""'");
}
}
res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_delete" "', argument " "6"" of type '" "void *""'");
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_add_from_disk3" "', argument " "6"" of type '" "void *""'");
}
if (items > 6) {
}
{
- result = (svn_error_t *)svn_wc_delete((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+ result = (svn_error_t *)svn_wc_add_from_disk3(arg1,(char const *)arg2,(apr_hash_t const *)arg3,arg4,arg5,arg6,arg7);
@@ -25310,8 +24054,8 @@ XS(_wrap_svn_wc_delete) {
}
}
}
- if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -25319,8 +24063,8 @@ XS(_wrap_svn_wc_delete) {
XSRETURN(argvi);
fail:
- if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -25352,6 +24096,7 @@ XS(_wrap_svn_wc_add_from_disk2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_add_from_disk2(wc_ctx,local_abspath,props,notify_func,notify_baton,scratch_pool);");
@@ -25367,8 +24112,10 @@ XS(_wrap_svn_wc_add_from_disk2) {
}
arg2 = (char *)(buf2);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg3 = svn_swig_pl_hash_to_prophash(ST(2), _global_pool);
}
{
@@ -25445,6 +24192,7 @@ XS(_wrap_svn_wc_add_from_disk) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_add_from_disk(wc_ctx,local_abspath,notify_func,notify_baton,scratch_pool);");
@@ -25536,7 +24284,6 @@ XS(_wrap_svn_wc_add4) {
int alloc4 = 0 ;
long val5 ;
int ecode5 = 0 ;
- int res7 ;
int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25544,8 +24291,9 @@ XS(_wrap_svn_wc_add4) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_add4(wc_ctx,local_abspath,depth,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -25574,26 +24322,20 @@ XS(_wrap_svn_wc_add4) {
}
arg5 = (svn_revnum_t)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add4" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_add4" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add4" "', argument " "8"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
if (!SWIG_IsOK(res9)) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_add4" "', argument " "9"" of type '" "void *""'");
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -25626,8 +24368,6 @@ XS(_wrap_svn_wc_add4) {
-
-
XSRETURN(argvi);
fail:
@@ -25638,8 +24378,6 @@ XS(_wrap_svn_wc_add4) {
-
-
SWIG_croak_null();
}
}
@@ -25670,7 +24408,6 @@ XS(_wrap_svn_wc_add3) {
int alloc4 = 0 ;
long val5 ;
int ecode5 = 0 ;
- int res7 ;
int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25678,8 +24415,9 @@ XS(_wrap_svn_wc_add3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_add3(path,parent_access,depth,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25708,26 +24446,20 @@ XS(_wrap_svn_wc_add3) {
}
arg5 = (svn_revnum_t)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add3" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_add3" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add3" "', argument " "8"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
if (!SWIG_IsOK(res9)) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_add3" "', argument " "9"" of type '" "void *""'");
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -25760,8 +24492,6 @@ XS(_wrap_svn_wc_add3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -25772,8 +24502,6 @@ XS(_wrap_svn_wc_add3) {
-
-
SWIG_croak_null();
}
}
@@ -25801,7 +24529,6 @@ XS(_wrap_svn_wc_add2) {
int alloc3 = 0 ;
long val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25809,8 +24536,9 @@ XS(_wrap_svn_wc_add2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_add2(path,parent_access,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25834,26 +24562,20 @@ XS(_wrap_svn_wc_add2) {
}
arg4 = (svn_revnum_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add2" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_add2" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add2" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_add2" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -25885,8 +24607,6 @@ XS(_wrap_svn_wc_add2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -25896,8 +24616,6 @@ XS(_wrap_svn_wc_add2) {
-
-
SWIG_croak_null();
}
}
@@ -25925,7 +24643,6 @@ XS(_wrap_svn_wc_add) {
int alloc3 = 0 ;
long val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -25933,8 +24650,9 @@ XS(_wrap_svn_wc_add) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_add(path,parent_access,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -25958,26 +24676,20 @@ XS(_wrap_svn_wc_add) {
}
arg4 = (svn_revnum_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_add" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add" "', argument " "7"" of type '" "svn_wc_notify_func_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_add" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -26009,8 +24721,6 @@ XS(_wrap_svn_wc_add) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -26020,8 +24730,6 @@ XS(_wrap_svn_wc_add) {
-
-
SWIG_croak_null();
}
}
@@ -26051,15 +24759,15 @@ XS(_wrap_svn_wc_add_repos_file4) {
int alloc7 = 0 ;
long val8 ;
int ecode8 = 0 ;
- int res10 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_add_repos_file4(wc_ctx,local_abspath,new_base_contents,new_contents,new_base_props,new_props,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -26074,18 +24782,24 @@ XS(_wrap_svn_wc_add_repos_file4) {
arg2 = (char *)(buf2);
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg4, ST(3));
+ SPAGAIN;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg5 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
@@ -26099,16 +24813,10 @@ XS(_wrap_svn_wc_add_repos_file4) {
}
arg8 = (svn_revnum_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add_repos_file4" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
- }
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_add_repos_file4" "', argument " "10"" of type '" "void *""'");
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -26142,8 +24850,6 @@ XS(_wrap_svn_wc_add_repos_file4) {
if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
-
-
XSRETURN(argvi);
fail:
@@ -26155,8 +24861,6 @@ XS(_wrap_svn_wc_add_repos_file4) {
if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
-
-
SWIG_croak_null();
}
}
@@ -26188,7 +24892,6 @@ XS(_wrap_svn_wc_add_repos_file3) {
int alloc7 = 0 ;
long val8 ;
int ecode8 = 0 ;
- int res10 ;
int res12 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -26196,8 +24899,9 @@ XS(_wrap_svn_wc_add_repos_file3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 12) || (items > 13)) {
+ if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_wc_add_repos_file3(dst_path,adm_access,new_base_contents,new_contents,new_base_props,new_props,copyfrom_url,copyfrom_rev,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -26212,18 +24916,24 @@ XS(_wrap_svn_wc_add_repos_file3) {
arg2 = (svn_wc_adm_access_t *)(argp2);
{
svn_swig_pl_make_stream (&arg3, ST(2));
+ SPAGAIN;
}
{
svn_swig_pl_make_stream (&arg4, ST(3));
+ SPAGAIN;
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg5 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
@@ -26237,26 +24947,20 @@ XS(_wrap_svn_wc_add_repos_file3) {
}
arg8 = (svn_revnum_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add_repos_file3" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
- }
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_add_repos_file3" "', argument " "10"" of type '" "void *""'");
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg11), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg11), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_add_repos_file3" "', argument " "11"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res12 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg12), 0, 0);
+ res12 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg12), 0, 0);
if (!SWIG_IsOK(res12)) {
SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_wc_add_repos_file3" "', argument " "12"" of type '" "void *""'");
}
- if (items > 12) {
+ if (items > 11) {
}
{
@@ -26292,8 +24996,6 @@ XS(_wrap_svn_wc_add_repos_file3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -26307,8 +25009,6 @@ XS(_wrap_svn_wc_add_repos_file3) {
-
-
SWIG_croak_null();
}
}
@@ -26348,6 +25048,7 @@ XS(_wrap_svn_wc_add_repos_file2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_add_repos_file2(dst_path,adm_access,new_text_base_path,new_text_path,new_base_props,new_props,copyfrom_url,copyfrom_rev,pool);");
@@ -26373,13 +25074,17 @@ XS(_wrap_svn_wc_add_repos_file2) {
}
arg4 = (char *)(buf4);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg5 = svn_swig_pl_hash_to_prophash(ST(4), _global_pool);
}
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7);
@@ -26471,6 +25176,7 @@ XS(_wrap_svn_wc_add_repos_file) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_add_repos_file(dst_path,adm_access,new_text_path,new_props,copyfrom_url,copyfrom_rev,pool);");
@@ -26491,8 +25197,10 @@ XS(_wrap_svn_wc_add_repos_file) {
}
arg3 = (char *)(buf3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
@@ -26570,15 +25278,15 @@ XS(_wrap_svn_wc_remove_from_revision_control2) {
int ecode3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_remove_from_revision_control2(wc_ctx,local_abspath,destroy_wf,instant_error,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -26602,16 +25310,10 @@ XS(_wrap_svn_wc_remove_from_revision_control2) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_remove_from_revision_control2" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_remove_from_revision_control2" "', argument " "6"" of type '" "void *""'");
- }
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -26641,8 +25343,6 @@ XS(_wrap_svn_wc_remove_from_revision_control2) {
-
-
XSRETURN(argvi);
fail:
@@ -26650,8 +25350,6 @@ XS(_wrap_svn_wc_remove_from_revision_control2) {
-
-
SWIG_croak_null();
}
}
@@ -26676,15 +25374,15 @@ XS(_wrap_svn_wc_remove_from_revision_control) {
int ecode3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_remove_from_revision_control(adm_access,name,destroy_wf,instant_error,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -26708,16 +25406,10 @@ XS(_wrap_svn_wc_remove_from_revision_control) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_remove_from_revision_control" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_remove_from_revision_control" "', argument " "6"" of type '" "void *""'");
- }
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -26747,8 +25439,6 @@ XS(_wrap_svn_wc_remove_from_revision_control) {
-
-
XSRETURN(argvi);
fail:
@@ -26756,8 +25446,6 @@ XS(_wrap_svn_wc_remove_from_revision_control) {
-
-
SWIG_croak_null();
}
}
@@ -26794,7 +25482,6 @@ XS(_wrap_svn_wc_resolved_conflict5) {
int ecode6 = 0 ;
int val7 ;
int ecode7 = 0 ;
- int res9 ;
int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -26802,8 +25489,9 @@ XS(_wrap_svn_wc_resolved_conflict5) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_resolved_conflict5(wc_ctx,local_abspath,depth,resolve_text,resolve_prop,resolve_tree,conflict_choice,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -26842,26 +25530,20 @@ XS(_wrap_svn_wc_resolved_conflict5) {
}
arg7 = (svn_wc_conflict_choice_t)(val7);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_resolved_conflict5" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
- }
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_resolved_conflict5" "', argument " "9"" of type '" "void *""'");
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg10), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_resolved_conflict5" "', argument " "10"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
+ res11 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg11), 0, 0);
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_resolved_conflict5" "', argument " "11"" of type '" "void *""'");
}
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -26896,8 +25578,6 @@ XS(_wrap_svn_wc_resolved_conflict5) {
-
-
XSRETURN(argvi);
fail:
@@ -26910,8 +25590,6 @@ XS(_wrap_svn_wc_resolved_conflict5) {
-
-
SWIG_croak_null();
}
}
@@ -26948,15 +25626,15 @@ XS(_wrap_svn_wc_resolved_conflict4) {
int val7 ;
int ecode7 = 0 ;
int res9 ;
- int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_resolved_conflict4(path,adm_access,resolve_text,resolve_props,resolve_tree,depth,conflict_choice,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -27005,16 +25683,10 @@ XS(_wrap_svn_wc_resolved_conflict4) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_resolved_conflict4" "', argument " "9"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_resolved_conflict4" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
- }
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_resolved_conflict4" "', argument " "11"" of type '" "void *""'");
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(9);
}
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -27049,8 +25721,6 @@ XS(_wrap_svn_wc_resolved_conflict4) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -27063,8 +25733,6 @@ XS(_wrap_svn_wc_resolved_conflict4) {
-
-
SWIG_croak_null();
}
}
@@ -27098,15 +25766,15 @@ XS(_wrap_svn_wc_resolved_conflict3) {
int val6 ;
int ecode6 = 0 ;
int res8 ;
- int res10 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_resolved_conflict3(path,adm_access,resolve_text,resolve_props,depth,conflict_choice,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -27150,16 +25818,10 @@ XS(_wrap_svn_wc_resolved_conflict3) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_resolved_conflict3" "', argument " "8"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_resolved_conflict3" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
- }
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_resolved_conflict3" "', argument " "10"" of type '" "void *""'");
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -27193,8 +25855,6 @@ XS(_wrap_svn_wc_resolved_conflict3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -27206,8 +25866,6 @@ XS(_wrap_svn_wc_resolved_conflict3) {
-
-
SWIG_croak_null();
}
}
@@ -27238,15 +25896,15 @@ XS(_wrap_svn_wc_resolved_conflict2) {
int val5 ;
int ecode5 = 0 ;
int res7 ;
- int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_resolved_conflict2(path,adm_access,resolve_text,resolve_props,recurse,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -27285,16 +25943,10 @@ XS(_wrap_svn_wc_resolved_conflict2) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_resolved_conflict2" "', argument " "7"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_resolved_conflict2" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
- }
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_resolved_conflict2" "', argument " "9"" of type '" "void *""'");
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -27327,8 +25979,6 @@ XS(_wrap_svn_wc_resolved_conflict2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -27339,8 +25989,6 @@ XS(_wrap_svn_wc_resolved_conflict2) {
-
-
SWIG_croak_null();
}
}
@@ -27375,6 +26023,7 @@ XS(_wrap_svn_wc_resolved_conflict) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_resolved_conflict(path,adm_access,resolve_text,resolve_props,recurse,notify_func,notify_baton,pool);");
@@ -27472,6 +26121,7 @@ XS(_wrap_svn_wc_committed_queue_create) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_wc_committed_queue_create(pool);");
@@ -27495,6 +26145,146 @@ XS(_wrap_svn_wc_committed_queue_create) {
}
+XS(_wrap_svn_wc_queue_committed4) {
+ {
+ svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
+ svn_wc_context_t *arg2 = (svn_wc_context_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ apr_array_header_t *arg6 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_checksum_t *arg9 = (svn_checksum_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ void *argp6 = 0 ;
+ int res6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ void *argp9 = 0 ;
+ int res9 = 0 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 9) || (items > 10)) {
+ SWIG_croak("Usage: svn_wc_queue_committed4(queue,wc_ctx,local_abspath,recurse,is_committed,wcprop_changes,remove_lock,remove_changelist,sha1_checksum,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_committed_queue_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_queue_committed4" "', argument " "1"" of type '" "svn_wc_committed_queue_t *""'");
+ }
+ arg1 = (svn_wc_committed_queue_t *)(argp1);
+ res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_queue_committed4" "', argument " "2"" of type '" "svn_wc_context_t *""'");
+ }
+ arg2 = (svn_wc_context_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "svn_wc_queue_committed4" "', argument " "3"" of type '" "char const *""'");
+ }
+ arg3 = (char *)(buf3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_wc_queue_committed4" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_wc_queue_committed4" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ res6 = SWIG_ConvertPtr(ST(5), &argp6,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_queue_committed4" "', argument " "6"" of type '" "apr_array_header_t const *""'");
+ }
+ arg6 = (apr_array_header_t *)(argp6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_wc_queue_committed4" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ ecode8 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(7), &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "svn_wc_queue_committed4" "', argument " "8"" of type '" "svn_boolean_t""'");
+ }
+ arg8 = (svn_boolean_t)(val8);
+ res9 = SWIG_ConvertPtr(ST(8), &argp9,SWIGTYPE_p_svn_checksum_t, 0 | 0 );
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_queue_committed4" "', argument " "9"" of type '" "svn_checksum_t const *""'");
+ }
+ arg9 = (svn_checksum_t *)(argp9);
+ if (items > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_queue_committed4(arg1,arg2,(char const *)arg3,arg4,arg5,(apr_array_header_t const *)arg6,arg7,arg8,(struct svn_checksum_t const *)arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_wc_queue_committed3) {
{
svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
@@ -27530,6 +26320,7 @@ XS(_wrap_svn_wc_queue_committed3) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_queue_committed3(queue,wc_ctx,local_abspath,recurse,wcprop_changes,remove_lock,remove_changelist,sha1_checksum,scratch_pool);");
@@ -27659,6 +26450,7 @@ XS(_wrap_svn_wc_queue_committed2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_queue_committed2(queue,path,adm_access,recurse,wcprop_changes,remove_lock,remove_changelist,md5_checksum,scratch_pool);");
@@ -27786,6 +26578,7 @@ XS(_wrap_svn_wc_queue_committed) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
@@ -27900,15 +26693,15 @@ XS(_wrap_svn_wc_process_committed_queue2) {
int res5 ;
char *buf5 = 0 ;
int alloc5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_process_committed_queue2(queue,wc_ctx,new_revnum,rev_date,rev_author,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_committed_queue_t, 0 | 0 );
@@ -27937,16 +26730,10 @@ XS(_wrap_svn_wc_process_committed_queue2) {
}
arg5 = (char *)(buf5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_process_committed_queue2" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_process_committed_queue2" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -27977,8 +26764,6 @@ XS(_wrap_svn_wc_process_committed_queue2) {
if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
-
-
XSRETURN(argvi);
fail:
@@ -27987,8 +26772,6 @@ XS(_wrap_svn_wc_process_committed_queue2) {
if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
-
-
SWIG_croak_null();
}
}
@@ -28021,6 +26804,7 @@ XS(_wrap_svn_wc_process_committed_queue) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_process_committed_queue(queue,adm_access,new_revnum,rev_date,rev_author,pool);");
@@ -28136,6 +26920,7 @@ XS(_wrap_svn_wc_process_committed4) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_process_committed4(path,adm_access,recurse,new_revnum,rev_date,rev_author,wcprop_changes,remove_lock,remove_changelist,digest,pool);");
@@ -28281,6 +27066,7 @@ XS(_wrap_svn_wc_process_committed3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_process_committed3(path,adm_access,recurse,new_revnum,rev_date,rev_author,wcprop_changes,remove_lock,digest,pool);");
@@ -28417,6 +27203,7 @@ XS(_wrap_svn_wc_process_committed2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_process_committed2(path,adm_access,recurse,new_revnum,rev_date,rev_author,wcprop_changes,remove_lock,pool);");
@@ -28545,6 +27332,7 @@ XS(_wrap_svn_wc_process_committed) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_process_committed(path,adm_access,recurse,new_revnum,rev_date,rev_author,wcprop_changes,pool);");
@@ -28667,7 +27455,6 @@ XS(_wrap_svn_wc_crawl_revisions5) {
int ecode8 = 0 ;
int val9 ;
int ecode9 = 0 ;
- int res11 ;
int res13 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -28675,8 +27462,9 @@ XS(_wrap_svn_wc_crawl_revisions5) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 13) || (items > 14)) {
+ if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_wc_crawl_revisions5(wc_ctx,local_abspath,reporter,report_baton,restore_files,depth,honor_depth_exclude,depth_compatibility_trick,use_commit_times,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -28724,26 +27512,20 @@ XS(_wrap_svn_wc_crawl_revisions5) {
}
arg9 = (svn_boolean_t)(val9);
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_crawl_revisions5" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
- }
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_crawl_revisions5" "', argument " "11"" of type '" "void *""'");
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(9);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg12), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg12), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_crawl_revisions5" "', argument " "12"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res13 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg13), 0, 0);
+ res13 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg13), 0, 0);
if (!SWIG_IsOK(res13)) {
SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_wc_crawl_revisions5" "', argument " "13"" of type '" "void *""'");
}
- if (items > 13) {
+ if (items > 12) {
}
{
@@ -28780,8 +27562,6 @@ XS(_wrap_svn_wc_crawl_revisions5) {
-
-
XSRETURN(argvi);
fail:
@@ -28796,8 +27576,6 @@ XS(_wrap_svn_wc_crawl_revisions5) {
-
-
SWIG_croak_null();
}
}
@@ -28846,6 +27624,7 @@ XS(_wrap_svn_wc_crawl_revisions4) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 12) || (items > 13)) {
SWIG_croak("Usage: svn_wc_crawl_revisions4(path,adm_access,reporter,report_baton,restore_files,depth,honor_depth_exclude,depth_compatibility_trick,use_commit_times,notify_func,notify_baton,traversal_info,pool);");
@@ -29007,6 +27786,7 @@ XS(_wrap_svn_wc_crawl_revisions3) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_wc_crawl_revisions3(path,adm_access,reporter,report_baton,restore_files,depth,depth_compatibility_trick,use_commit_times,notify_func,notify_baton,traversal_info,pool);");
@@ -29158,6 +27938,7 @@ XS(_wrap_svn_wc_crawl_revisions2) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_crawl_revisions2(path,adm_access,reporter,report_baton,restore_files,recurse,use_commit_times,notify_func,notify_baton,traversal_info,pool);");
@@ -29302,6 +28083,7 @@ XS(_wrap_svn_wc_crawl_revisions) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_crawl_revisions(path,adm_access,reporter,report_baton,restore_files,recurse,use_commit_times,notify_func,notify_baton,traversal_info,pool);");
@@ -29435,6 +28217,7 @@ XS(_wrap_svn_wc_check_root) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -29534,6 +28317,7 @@ XS(_wrap_svn_wc_is_wc_root2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -29615,6 +28399,7 @@ XS(_wrap_svn_wc_is_wc_root) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -29698,9 +28483,11 @@ XS(_wrap_svn_wc_get_actual_target2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -29796,6 +28583,7 @@ XS(_wrap_svn_wc_get_actual_target) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -29923,7 +28711,6 @@ XS(_wrap_svn_wc_get_update_editor4) {
int res17 ;
int res19 ;
int res21 ;
- int res23 ;
int res25 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -29931,14 +28718,16 @@ XS(_wrap_svn_wc_get_update_editor4) {
{
_global_pool = arg26 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg27 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
- if ((items < 22) || (items > 24)) {
+ if ((items < 21) || (items > 23)) {
SWIG_croak("Usage: svn_wc_get_update_editor4(wc_ctx,anchor_abspath,target_basename,use_commit_times,depth,depth_is_sticky,allow_unver_obstructions,adds_as_modification,server_performs_filtering,clean_checkout,diff3_cmd,preserved_exts,fetch_dirents_func,fetch_dirents_baton,conflict_func,conflict_baton,external_func,external_baton,cancel_func,cancel_baton,notify_func,notify_baton,result_pool,scratch_pool);");
}
res4 = SWIG_ConvertPtr(ST(0), &argp4,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -29997,7 +28786,7 @@ XS(_wrap_svn_wc_get_update_editor4) {
}
arg14 = (char *)(buf14);
{
- arg15 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(11),
+ arg15 = svn_swig_pl_strings_to_array(ST(11),
_global_pool);
}
{
@@ -30031,29 +28820,23 @@ XS(_wrap_svn_wc_get_update_editor4) {
SWIG_exception_fail(SWIG_ArgError(res21), "in method '" "svn_wc_get_update_editor4" "', argument " "21"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(18), (void**)(&arg22), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor4" "', argument " "22"" of type '" "svn_cancel_func_t""'");
- }
- }
- res23 = SWIG_ConvertPtr(ST(19),SWIG_as_voidptrptr(&arg23), 0, 0);
- if (!SWIG_IsOK(res23)) {
- SWIG_exception_fail(SWIG_ArgError(res23), "in method '" "svn_wc_get_update_editor4" "', argument " "23"" of type '" "void *""'");
+ arg22 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg23 = ST(18);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(20), (void**)(&arg24), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(19), (void**)(&arg24), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor4" "', argument " "24"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res25 = SWIG_ConvertPtr(ST(21),SWIG_as_voidptrptr(&arg25), 0, 0);
+ res25 = SWIG_ConvertPtr(ST(20),SWIG_as_voidptrptr(&arg25), 0, 0);
if (!SWIG_IsOK(res25)) {
SWIG_exception_fail(SWIG_ArgError(res25), "in method '" "svn_wc_get_update_editor4" "', argument " "25"" of type '" "void *""'");
}
- if (items > 22) {
+ if (items > 21) {
}
- if (items > 23) {
+ if (items > 22) {
}
{
@@ -30115,8 +28898,6 @@ XS(_wrap_svn_wc_get_update_editor4) {
-
-
XSRETURN(argvi);
fail:
@@ -30144,8 +28925,6 @@ XS(_wrap_svn_wc_get_update_editor4) {
-
-
SWIG_croak_null();
}
}
@@ -30191,7 +28970,6 @@ XS(_wrap_svn_wc_get_update_editor3) {
int val7 ;
int ecode7 = 0 ;
int res9 ;
- int res11 ;
int res13 ;
int res15 ;
int res16 ;
@@ -30207,11 +28985,12 @@ XS(_wrap_svn_wc_get_update_editor3) {
{
_global_pool = arg21 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg18 = &temp18;
arg19 = &temp19;
- if ((items < 17) || (items > 18)) {
+ if ((items < 16) || (items > 17)) {
SWIG_croak("Usage: svn_wc_get_update_editor3(anchor,target,use_commit_times,depth,depth_is_sticky,allow_unver_obstructions,notify_func,notify_baton,cancel_func,cancel_baton,conflict_func,conflict_baton,fetch_func,fetch_baton,diff3_cmd,preserved_exts,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -30255,50 +29034,44 @@ XS(_wrap_svn_wc_get_update_editor3) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_get_update_editor3" "', argument " "9"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor3" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
- }
- res11 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_get_update_editor3" "', argument " "11"" of type '" "void *""'");
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(8);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg12), SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg12), SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor3" "', argument " "12"" of type '" "svn_wc_conflict_resolver_func_t""'");
}
}
- res13 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg13), 0, 0);
+ res13 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg13), 0, 0);
if (!SWIG_IsOK(res13)) {
SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_wc_get_update_editor3" "', argument " "13"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(12), (void**)(&arg14), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg14), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor3" "', argument " "14"" of type '" "svn_wc_get_file_t""'");
}
}
- res15 = SWIG_ConvertPtr(ST(13),SWIG_as_voidptrptr(&arg15), 0, 0);
+ res15 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg15), 0, 0);
if (!SWIG_IsOK(res15)) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_update_editor3" "', argument " "15"" of type '" "void *""'");
}
- res16 = SWIG_AsCharPtrAndSize(ST(14), &buf16, NULL, &alloc16);
+ res16 = SWIG_AsCharPtrAndSize(ST(13), &buf16, NULL, &alloc16);
if (!SWIG_IsOK(res16)) {
SWIG_exception_fail(SWIG_ArgError(res16), "in method '" "svn_wc_get_update_editor3" "', argument " "16"" of type '" "char const *""'");
}
arg16 = (char *)(buf16);
{
- arg17 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(15),
+ arg17 = svn_swig_pl_strings_to_array(ST(14),
_global_pool);
}
- res20 = SWIG_ConvertPtr(ST(16), &argp20,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res20 = SWIG_ConvertPtr(ST(15), &argp20,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res20)) {
SWIG_exception_fail(SWIG_ArgError(res20), "in method '" "svn_wc_get_update_editor3" "', argument " "20"" of type '" "svn_wc_traversal_info_t *""'");
}
arg20 = (svn_wc_traversal_info_t *)(argp20);
- if (items > 17) {
+ if (items > 16) {
}
{
@@ -30348,8 +29121,6 @@ XS(_wrap_svn_wc_get_update_editor3) {
-
-
if (alloc16 == SWIG_NEWOBJ) free((char*)buf16);
@@ -30371,8 +29142,6 @@ XS(_wrap_svn_wc_get_update_editor3) {
-
-
if (alloc16 == SWIG_NEWOBJ) free((char*)buf16);
@@ -30413,7 +29182,6 @@ XS(_wrap_svn_wc_get_update_editor2) {
int val5 ;
int ecode5 = 0 ;
int res7 ;
- int res9 ;
int res10 ;
char *buf10 = 0 ;
int alloc10 = 0 ;
@@ -30427,11 +29195,12 @@ XS(_wrap_svn_wc_get_update_editor2) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg11 = &temp11;
arg12 = &temp12;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_update_editor2(anchor,target,use_commit_times,recurse,notify_func,notify_baton,cancel_func,cancel_baton,diff3_cmd,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -30465,26 +29234,20 @@ XS(_wrap_svn_wc_get_update_editor2) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_get_update_editor2" "', argument " "7"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor2" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(6);
}
- res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_get_update_editor2" "', argument " "9"" of type '" "void *""'");
- }
- res10 = SWIG_AsCharPtrAndSize(ST(8), &buf10, NULL, &alloc10);
+ res10 = SWIG_AsCharPtrAndSize(ST(7), &buf10, NULL, &alloc10);
if (!SWIG_IsOK(res10)) {
SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_update_editor2" "', argument " "10"" of type '" "char const *""'");
}
arg10 = (char *)(buf10);
- res13 = SWIG_ConvertPtr(ST(9), &argp13,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res13 = SWIG_ConvertPtr(ST(8), &argp13,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res13)) {
SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_wc_get_update_editor2" "', argument " "13"" of type '" "svn_wc_traversal_info_t *""'");
}
arg13 = (svn_wc_traversal_info_t *)(argp13);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -30528,8 +29291,6 @@ XS(_wrap_svn_wc_get_update_editor2) {
-
-
if (alloc10 == SWIG_NEWOBJ) free((char*)buf10);
@@ -30544,8 +29305,6 @@ XS(_wrap_svn_wc_get_update_editor2) {
-
-
if (alloc10 == SWIG_NEWOBJ) free((char*)buf10);
@@ -30585,7 +29344,6 @@ XS(_wrap_svn_wc_get_update_editor) {
int val5 ;
int ecode5 = 0 ;
int res7 ;
- int res9 ;
int res10 ;
char *buf10 = 0 ;
int alloc10 = 0 ;
@@ -30599,11 +29357,12 @@ XS(_wrap_svn_wc_get_update_editor) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg11 = &temp11;
arg12 = &temp12;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_update_editor(anchor,target,use_commit_times,recurse,notify_func,notify_baton,cancel_func,cancel_baton,diff3_cmd,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -30637,26 +29396,20 @@ XS(_wrap_svn_wc_get_update_editor) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_get_update_editor" "', argument " "7"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_update_editor" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(6);
}
- res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_get_update_editor" "', argument " "9"" of type '" "void *""'");
- }
- res10 = SWIG_AsCharPtrAndSize(ST(8), &buf10, NULL, &alloc10);
+ res10 = SWIG_AsCharPtrAndSize(ST(7), &buf10, NULL, &alloc10);
if (!SWIG_IsOK(res10)) {
SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_update_editor" "', argument " "10"" of type '" "char const *""'");
}
arg10 = (char *)(buf10);
- res13 = SWIG_ConvertPtr(ST(9), &argp13,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res13 = SWIG_ConvertPtr(ST(8), &argp13,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res13)) {
SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "svn_wc_get_update_editor" "', argument " "13"" of type '" "svn_wc_traversal_info_t *""'");
}
arg13 = (svn_wc_traversal_info_t *)(argp13);
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -30700,8 +29453,6 @@ XS(_wrap_svn_wc_get_update_editor) {
-
-
if (alloc10 == SWIG_NEWOBJ) free((char*)buf10);
@@ -30716,8 +29467,6 @@ XS(_wrap_svn_wc_get_update_editor) {
-
-
if (alloc10 == SWIG_NEWOBJ) free((char*)buf10);
@@ -30788,7 +29537,6 @@ XS(_wrap_svn_wc_get_switch_editor4) {
int res16 ;
int res18 ;
int res20 ;
- int res22 ;
int res24 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -30796,14 +29544,16 @@ XS(_wrap_svn_wc_get_switch_editor4) {
{
_global_pool = arg25 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg26 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
arg3 = &temp3;
- if ((items < 21) || (items > 23)) {
+ if ((items < 20) || (items > 22)) {
SWIG_croak("Usage: svn_wc_get_switch_editor4(wc_ctx,anchor_abspath,target_basename,switch_url,use_commit_times,depth,depth_is_sticky,allow_unver_obstructions,server_performs_filtering,diff3_cmd,preserved_exts,fetch_dirents_func,fetch_dirents_baton,conflict_func,conflict_baton,external_func,external_baton,cancel_func,cancel_baton,notify_func,notify_baton,result_pool,scratch_pool);");
}
res4 = SWIG_ConvertPtr(ST(0), &argp4,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -30857,7 +29607,7 @@ XS(_wrap_svn_wc_get_switch_editor4) {
}
arg13 = (char *)(buf13);
{
- arg14 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(10),
+ arg14 = svn_swig_pl_strings_to_array(ST(10),
_global_pool);
}
{
@@ -30891,29 +29641,23 @@ XS(_wrap_svn_wc_get_switch_editor4) {
SWIG_exception_fail(SWIG_ArgError(res20), "in method '" "svn_wc_get_switch_editor4" "', argument " "20"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(17), (void**)(&arg21), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor4" "', argument " "21"" of type '" "svn_cancel_func_t""'");
- }
- }
- res22 = SWIG_ConvertPtr(ST(18),SWIG_as_voidptrptr(&arg22), 0, 0);
- if (!SWIG_IsOK(res22)) {
- SWIG_exception_fail(SWIG_ArgError(res22), "in method '" "svn_wc_get_switch_editor4" "', argument " "22"" of type '" "void *""'");
+ arg21 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg22 = ST(17);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(19), (void**)(&arg23), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(18), (void**)(&arg23), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor4" "', argument " "23"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res24 = SWIG_ConvertPtr(ST(20),SWIG_as_voidptrptr(&arg24), 0, 0);
+ res24 = SWIG_ConvertPtr(ST(19),SWIG_as_voidptrptr(&arg24), 0, 0);
if (!SWIG_IsOK(res24)) {
SWIG_exception_fail(SWIG_ArgError(res24), "in method '" "svn_wc_get_switch_editor4" "', argument " "24"" of type '" "void *""'");
}
- if (items > 21) {
+ if (items > 20) {
}
- if (items > 22) {
+ if (items > 21) {
}
{
@@ -30974,8 +29718,6 @@ XS(_wrap_svn_wc_get_switch_editor4) {
-
-
XSRETURN(argvi);
fail:
@@ -31002,8 +29744,6 @@ XS(_wrap_svn_wc_get_switch_editor4) {
-
-
SWIG_croak_null();
}
}
@@ -31051,7 +29791,6 @@ XS(_wrap_svn_wc_get_switch_editor3) {
int val8 ;
int ecode8 = 0 ;
int res10 ;
- int res12 ;
int res14 ;
int res15 ;
char *buf15 = 0 ;
@@ -31066,11 +29805,12 @@ XS(_wrap_svn_wc_get_switch_editor3) {
{
_global_pool = arg20 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg17 = &temp17;
arg18 = &temp18;
- if ((items < 16) || (items > 17)) {
+ if ((items < 15) || (items > 16)) {
SWIG_croak("Usage: svn_wc_get_switch_editor3(anchor,target,switch_url,use_commit_times,depth,depth_is_sticky,allow_unver_obstructions,notify_func,notify_baton,cancel_func,cancel_baton,conflict_func,conflict_baton,diff3_cmd,preserved_exts,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -31119,40 +29859,34 @@ XS(_wrap_svn_wc_get_switch_editor3) {
SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_switch_editor3" "', argument " "10"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg11), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor3" "', argument " "11"" of type '" "svn_cancel_func_t""'");
- }
- }
- res12 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg12), 0, 0);
- if (!SWIG_IsOK(res12)) {
- SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_wc_get_switch_editor3" "', argument " "12"" of type '" "void *""'");
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(9);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(11), (void**)(&arg13), SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg13), SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor3" "', argument " "13"" of type '" "svn_wc_conflict_resolver_func_t""'");
}
}
- res14 = SWIG_ConvertPtr(ST(12),SWIG_as_voidptrptr(&arg14), 0, 0);
+ res14 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg14), 0, 0);
if (!SWIG_IsOK(res14)) {
SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_switch_editor3" "', argument " "14"" of type '" "void *""'");
}
- res15 = SWIG_AsCharPtrAndSize(ST(13), &buf15, NULL, &alloc15);
+ res15 = SWIG_AsCharPtrAndSize(ST(12), &buf15, NULL, &alloc15);
if (!SWIG_IsOK(res15)) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_switch_editor3" "', argument " "15"" of type '" "char const *""'");
}
arg15 = (char *)(buf15);
{
- arg16 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(14),
+ arg16 = svn_swig_pl_strings_to_array(ST(13),
_global_pool);
}
- res19 = SWIG_ConvertPtr(ST(15), &argp19,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res19 = SWIG_ConvertPtr(ST(14), &argp19,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res19)) {
SWIG_exception_fail(SWIG_ArgError(res19), "in method '" "svn_wc_get_switch_editor3" "', argument " "19"" of type '" "svn_wc_traversal_info_t *""'");
}
arg19 = (svn_wc_traversal_info_t *)(argp19);
- if (items > 16) {
+ if (items > 15) {
}
{
@@ -31201,8 +29935,6 @@ XS(_wrap_svn_wc_get_switch_editor3) {
-
-
if (alloc15 == SWIG_NEWOBJ) free((char*)buf15);
@@ -31223,8 +29955,6 @@ XS(_wrap_svn_wc_get_switch_editor3) {
-
-
if (alloc15 == SWIG_NEWOBJ) free((char*)buf15);
@@ -31269,7 +29999,6 @@ XS(_wrap_svn_wc_get_switch_editor2) {
int val6 ;
int ecode6 = 0 ;
int res8 ;
- int res10 ;
int res11 ;
char *buf11 = 0 ;
int alloc11 = 0 ;
@@ -31283,11 +30012,12 @@ XS(_wrap_svn_wc_get_switch_editor2) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg12 = &temp12;
arg13 = &temp13;
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_get_switch_editor2(anchor,target,switch_url,use_commit_times,recurse,notify_func,notify_baton,cancel_func,cancel_baton,diff3_cmd,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -31326,26 +30056,20 @@ XS(_wrap_svn_wc_get_switch_editor2) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_get_switch_editor2" "', argument " "8"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor2" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(7);
}
- res10 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_switch_editor2" "', argument " "10"" of type '" "void *""'");
- }
- res11 = SWIG_AsCharPtrAndSize(ST(9), &buf11, NULL, &alloc11);
+ res11 = SWIG_AsCharPtrAndSize(ST(8), &buf11, NULL, &alloc11);
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_get_switch_editor2" "', argument " "11"" of type '" "char const *""'");
}
arg11 = (char *)(buf11);
- res14 = SWIG_ConvertPtr(ST(10), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res14 = SWIG_ConvertPtr(ST(9), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res14)) {
SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_switch_editor2" "', argument " "14"" of type '" "svn_wc_traversal_info_t *""'");
}
arg14 = (svn_wc_traversal_info_t *)(argp14);
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -31390,8 +30114,6 @@ XS(_wrap_svn_wc_get_switch_editor2) {
-
-
if (alloc11 == SWIG_NEWOBJ) free((char*)buf11);
@@ -31407,8 +30129,6 @@ XS(_wrap_svn_wc_get_switch_editor2) {
-
-
if (alloc11 == SWIG_NEWOBJ) free((char*)buf11);
@@ -31452,7 +30172,6 @@ XS(_wrap_svn_wc_get_switch_editor) {
int val6 ;
int ecode6 = 0 ;
int res8 ;
- int res10 ;
int res11 ;
char *buf11 = 0 ;
int alloc11 = 0 ;
@@ -31466,11 +30185,12 @@ XS(_wrap_svn_wc_get_switch_editor) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg12 = &temp12;
arg13 = &temp13;
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_get_switch_editor(anchor,target,switch_url,use_commit_times,recurse,notify_func,notify_baton,cancel_func,cancel_baton,diff3_cmd,ti,pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -31509,26 +30229,20 @@ XS(_wrap_svn_wc_get_switch_editor) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_get_switch_editor" "', argument " "8"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_switch_editor" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(7);
}
- res10 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_switch_editor" "', argument " "10"" of type '" "void *""'");
- }
- res11 = SWIG_AsCharPtrAndSize(ST(9), &buf11, NULL, &alloc11);
+ res11 = SWIG_AsCharPtrAndSize(ST(8), &buf11, NULL, &alloc11);
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_get_switch_editor" "', argument " "11"" of type '" "char const *""'");
}
arg11 = (char *)(buf11);
- res14 = SWIG_ConvertPtr(ST(10), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
+ res14 = SWIG_ConvertPtr(ST(9), &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
if (!SWIG_IsOK(res14)) {
SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "svn_wc_get_switch_editor" "', argument " "14"" of type '" "svn_wc_traversal_info_t *""'");
}
arg14 = (svn_wc_traversal_info_t *)(argp14);
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -31573,8 +30287,6 @@ XS(_wrap_svn_wc_get_switch_editor) {
-
-
if (alloc11 == SWIG_NEWOBJ) free((char*)buf11);
@@ -31590,8 +30302,6 @@ XS(_wrap_svn_wc_get_switch_editor) {
-
-
if (alloc11 == SWIG_NEWOBJ) free((char*)buf11);
@@ -31622,9 +30332,11 @@ XS(_wrap_svn_wc_prop_list2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31707,6 +30419,7 @@ XS(_wrap_svn_wc_prop_list) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -31785,9 +30498,11 @@ XS(_wrap_svn_wc_get_pristine_props) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -31875,9 +30590,11 @@ XS(_wrap_svn_wc_prop_get2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -31975,6 +30692,7 @@ XS(_wrap_svn_wc_prop_get) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -32074,7 +30792,6 @@ XS(_wrap_svn_wc_prop_set4) {
int ecode6 = 0 ;
void *argp7 = 0 ;
int res7 = 0 ;
- int res9 ;
int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -32082,8 +30799,9 @@ XS(_wrap_svn_wc_prop_set4) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_prop_set4(wc_ctx,local_abspath,name,value,depth,skip_checks,changelist_filter,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -32126,26 +30844,20 @@ XS(_wrap_svn_wc_prop_set4) {
}
arg7 = (apr_array_header_t *)(argp7);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_prop_set4" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
- }
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_prop_set4" "', argument " "9"" of type '" "void *""'");
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg10), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_prop_set4" "', argument " "10"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
+ res11 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg11), 0, 0);
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_prop_set4" "', argument " "11"" of type '" "void *""'");
}
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -32180,8 +30892,6 @@ XS(_wrap_svn_wc_prop_set4) {
-
-
XSRETURN(argvi);
fail:
@@ -32194,8 +30904,6 @@ XS(_wrap_svn_wc_prop_set4) {
-
-
SWIG_croak_null();
}
}
@@ -32230,6 +30938,7 @@ XS(_wrap_svn_wc_prop_set3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_prop_set3(name,value,path,adm_access,skip_checks,notify_func,notify_baton,pool);");
@@ -32347,6 +31056,7 @@ XS(_wrap_svn_wc_prop_set2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_prop_set2(name,value,path,adm_access,skip_checks,pool);");
@@ -32447,6 +31157,7 @@ XS(_wrap_svn_wc_prop_set) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_prop_set(name,value,path,adm_access,pool);");
@@ -32650,6 +31361,7 @@ XS(_wrap_svn_wc_canonicalize_svn_prop) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 7) || (items > 8)) {
@@ -32802,20 +31514,21 @@ XS(_wrap_svn_wc_get_diff_editor6) {
void *argp14 = 0 ;
int res14 = 0 ;
int res15 ;
- int res17 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg18 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg19 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
- if ((items < 15) || (items > 17)) {
+ if ((items < 14) || (items > 16)) {
SWIG_croak("Usage: svn_wc_get_diff_editor6(wc_ctx,anchor_abspath,target,depth,ignore_ancestry,show_copies_as_adds,use_git_diff_format,use_text_base,reverse_order,server_performs_filtering,changelist_filter,callbacks,callback_baton,cancel_func,cancel_baton,result_pool,scratch_pool);");
}
res3 = SWIG_ConvertPtr(ST(0), &argp3,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -32883,19 +31596,13 @@ XS(_wrap_svn_wc_get_diff_editor6) {
SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "svn_wc_get_diff_editor6" "', argument " "15"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(13), (void**)(&arg16), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor6" "', argument " "16"" of type '" "svn_cancel_func_t""'");
- }
+ arg16 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg17 = ST(13);
}
- res17 = SWIG_ConvertPtr(ST(14),SWIG_as_voidptrptr(&arg17), 0, 0);
- if (!SWIG_IsOK(res17)) {
- SWIG_exception_fail(SWIG_ArgError(res17), "in method '" "svn_wc_get_diff_editor6" "', argument " "17"" of type '" "void *""'");
- }
- if (items > 15) {
+ if (items > 14) {
}
- if (items > 16) {
+ if (items > 15) {
}
{
@@ -32943,8 +31650,6 @@ XS(_wrap_svn_wc_get_diff_editor6) {
-
-
XSRETURN(argvi);
fail:
@@ -32964,8 +31669,6 @@ XS(_wrap_svn_wc_get_diff_editor6) {
-
-
SWIG_croak_null();
}
}
@@ -33004,7 +31707,6 @@ XS(_wrap_svn_wc_get_diff_editor5) {
int ecode7 = 0 ;
int val8 ;
int ecode8 = 0 ;
- int res10 ;
void *argp11 = 0 ;
int res11 = 0 ;
svn_delta_editor_t *temp12 ;
@@ -33015,10 +31717,11 @@ XS(_wrap_svn_wc_get_diff_editor5) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg12 = &temp12;
arg13 = &temp13;
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_get_diff_editor5(anchor,target,callbacks,callback_baton,depth,ignore_ancestry,use_text_base,reverse_order,cancel_func,cancel_baton,changelist_filter,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -33061,21 +31764,15 @@ XS(_wrap_svn_wc_get_diff_editor5) {
}
arg8 = (svn_boolean_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor5" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_diff_editor5" "', argument " "10"" of type '" "void *""'");
- }
- res11 = SWIG_ConvertPtr(ST(10), &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ res11 = SWIG_ConvertPtr(ST(9), &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_get_diff_editor5" "', argument " "11"" of type '" "apr_array_header_t const *""'");
}
arg11 = (apr_array_header_t *)(argp11);
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -33118,8 +31815,6 @@ XS(_wrap_svn_wc_get_diff_editor5) {
-
-
XSRETURN(argvi);
fail:
@@ -33134,8 +31829,6 @@ XS(_wrap_svn_wc_get_diff_editor5) {
-
-
SWIG_croak_null();
}
}
@@ -33174,7 +31867,6 @@ XS(_wrap_svn_wc_get_diff_editor4) {
int ecode7 = 0 ;
int val8 ;
int ecode8 = 0 ;
- int res10 ;
void *argp11 = 0 ;
int res11 = 0 ;
svn_delta_editor_t *temp12 ;
@@ -33185,10 +31877,11 @@ XS(_wrap_svn_wc_get_diff_editor4) {
{
_global_pool = arg14 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg12 = &temp12;
arg13 = &temp13;
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_get_diff_editor4(anchor,target,callbacks,callback_baton,depth,ignore_ancestry,use_text_base,reverse_order,cancel_func,cancel_baton,changelist_filter,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -33231,21 +31924,15 @@ XS(_wrap_svn_wc_get_diff_editor4) {
}
arg8 = (svn_boolean_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor4" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_diff_editor4" "', argument " "10"" of type '" "void *""'");
- }
- res11 = SWIG_ConvertPtr(ST(10), &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ res11 = SWIG_ConvertPtr(ST(9), &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
if (!SWIG_IsOK(res11)) {
SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_get_diff_editor4" "', argument " "11"" of type '" "apr_array_header_t const *""'");
}
arg11 = (apr_array_header_t *)(argp11);
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -33288,8 +31975,6 @@ XS(_wrap_svn_wc_get_diff_editor4) {
-
-
XSRETURN(argvi);
fail:
@@ -33304,8 +31989,6 @@ XS(_wrap_svn_wc_get_diff_editor4) {
-
-
SWIG_croak_null();
}
}
@@ -33343,7 +32026,6 @@ XS(_wrap_svn_wc_get_diff_editor3) {
int ecode7 = 0 ;
int val8 ;
int ecode8 = 0 ;
- int res10 ;
svn_delta_editor_t *temp11 ;
void *temp12 ;
int argvi = 0;
@@ -33352,10 +32034,11 @@ XS(_wrap_svn_wc_get_diff_editor3) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg11 = &temp11;
arg12 = &temp12;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_diff_editor3(anchor,target,callbacks,callback_baton,recurse,ignore_ancestry,use_text_base,reverse_order,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -33398,16 +32081,10 @@ XS(_wrap_svn_wc_get_diff_editor3) {
}
arg8 = (svn_boolean_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor3" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
- }
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_diff_editor3" "', argument " "10"" of type '" "void *""'");
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -33449,8 +32126,6 @@ XS(_wrap_svn_wc_get_diff_editor3) {
-
-
XSRETURN(argvi);
fail:
@@ -33464,8 +32139,6 @@ XS(_wrap_svn_wc_get_diff_editor3) {
-
-
SWIG_croak_null();
}
}
@@ -33503,7 +32176,6 @@ XS(_wrap_svn_wc_get_diff_editor2) {
int ecode7 = 0 ;
int val8 ;
int ecode8 = 0 ;
- int res10 ;
svn_delta_editor_t *temp11 ;
void *temp12 ;
int argvi = 0;
@@ -33512,10 +32184,11 @@ XS(_wrap_svn_wc_get_diff_editor2) {
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg11 = &temp11;
arg12 = &temp12;
- if ((items < 10) || (items > 11)) {
+ if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_get_diff_editor2(anchor,target,callbacks,callback_baton,recurse,ignore_ancestry,use_text_base,reverse_order,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -33558,16 +32231,10 @@ XS(_wrap_svn_wc_get_diff_editor2) {
}
arg8 = (svn_boolean_t)(val8);
{
- int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg9), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor2" "', argument " "9"" of type '" "svn_cancel_func_t""'");
- }
- }
- res10 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg10), 0, 0);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_get_diff_editor2" "', argument " "10"" of type '" "void *""'");
+ arg9 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg10 = ST(8);
}
- if (items > 10) {
+ if (items > 9) {
}
{
@@ -33609,8 +32276,6 @@ XS(_wrap_svn_wc_get_diff_editor2) {
-
-
XSRETURN(argvi);
fail:
@@ -33624,8 +32289,6 @@ XS(_wrap_svn_wc_get_diff_editor2) {
-
-
SWIG_croak_null();
}
}
@@ -33660,7 +32323,6 @@ XS(_wrap_svn_wc_get_diff_editor) {
int ecode6 = 0 ;
int val7 ;
int ecode7 = 0 ;
- int res9 ;
svn_delta_editor_t *temp10 ;
void *temp11 ;
int argvi = 0;
@@ -33669,10 +32331,11 @@ XS(_wrap_svn_wc_get_diff_editor) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg10 = &temp10;
arg11 = &temp11;
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_get_diff_editor(anchor,target,callbacks,callback_baton,recurse,use_text_base,reverse_order,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -33710,16 +32373,10 @@ XS(_wrap_svn_wc_get_diff_editor) {
}
arg7 = (svn_boolean_t)(val7);
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_diff_editor" "', argument " "8"" of type '" "svn_cancel_func_t""'");
- }
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
- if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_get_diff_editor" "', argument " "9"" of type '" "void *""'");
- }
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -33760,8 +32417,6 @@ XS(_wrap_svn_wc_get_diff_editor) {
-
-
XSRETURN(argvi);
fail:
@@ -33774,8 +32429,6 @@ XS(_wrap_svn_wc_get_diff_editor) {
-
-
SWIG_croak_null();
}
}
@@ -33814,15 +32467,15 @@ XS(_wrap_svn_wc_diff6) {
int ecode8 = 0 ;
void *argp9 = 0 ;
int res9 = 0 ;
- int res11 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 11) || (items > 12)) {
+ if ((items < 10) || (items > 11)) {
SWIG_croak("Usage: svn_wc_diff6(wc_ctx,target_abspath,callbacks,callback_baton,depth,ignore_ancestry,show_copies_as_adds,use_git_diff_format,changelist_filter,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -33870,16 +32523,10 @@ XS(_wrap_svn_wc_diff6) {
}
arg9 = (apr_array_header_t *)(argp9);
{
- int res = SWIG_ConvertFunctionPtr(ST(9), (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_diff6" "', argument " "10"" of type '" "svn_cancel_func_t""'");
- }
- }
- res11 = SWIG_ConvertPtr(ST(10),SWIG_as_voidptrptr(&arg11), 0, 0);
- if (!SWIG_IsOK(res11)) {
- SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_diff6" "', argument " "11"" of type '" "void *""'");
+ arg10 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg11 = ST(9);
}
- if (items > 11) {
+ if (items > 10) {
}
{
@@ -33914,8 +32561,6 @@ XS(_wrap_svn_wc_diff6) {
-
-
XSRETURN(argvi);
fail:
@@ -33928,8 +32573,6 @@ XS(_wrap_svn_wc_diff6) {
-
-
SWIG_croak_null();
}
}
@@ -33966,6 +32609,7 @@ XS(_wrap_svn_wc_diff5) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_diff5(anchor,target,callbacks,callback_baton,depth,ignore_ancestry,changelist_filter,pool);");
@@ -34083,6 +32727,7 @@ XS(_wrap_svn_wc_diff4) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_diff4(anchor,target,callbacks,callback_baton,depth,ignore_ancestry,changelist_filter,pool);");
@@ -34197,6 +32842,7 @@ XS(_wrap_svn_wc_diff3) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_diff3(anchor,target,callbacks,callback_baton,recurse,ignore_ancestry,pool);");
@@ -34304,6 +32950,7 @@ XS(_wrap_svn_wc_diff2) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_diff2(anchor,target,callbacks,callback_baton,recurse,ignore_ancestry,pool);");
@@ -34408,6 +33055,7 @@ XS(_wrap_svn_wc_diff) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_diff(anchor,target,callbacks,callback_baton,recurse,pool);");
@@ -34502,9 +33150,11 @@ XS(_wrap_svn_wc_get_prop_diffs2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -34601,6 +33251,7 @@ XS(_wrap_svn_wc_get_prop_diffs) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -34735,16 +33386,16 @@ XS(_wrap_svn_wc_merge5) {
void *argp16 = 0 ;
int res16 = 0 ;
int res18 ;
- int res20 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg21 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 19) || (items > 20)) {
+ if ((items < 18) || (items > 19)) {
SWIG_croak("Usage: svn_wc_merge5(merge_props_state,wc_ctx,left_abspath,right_abspath,target_abspath,left_label,right_label,target_label,left_version,right_version,dry_run,diff3_cmd,merge_options,original_props,prop_diff,conflict_func,conflict_baton,cancel_func,cancel_baton,scratch_pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_notify_state_t, 0 | 0 );
@@ -34833,16 +33484,10 @@ XS(_wrap_svn_wc_merge5) {
SWIG_exception_fail(SWIG_ArgError(res18), "in method '" "svn_wc_merge5" "', argument " "18"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(17), (void**)(&arg19), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_merge5" "', argument " "19"" of type '" "svn_cancel_func_t""'");
- }
+ arg19 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg20 = ST(17);
}
- res20 = SWIG_ConvertPtr(ST(18),SWIG_as_voidptrptr(&arg20), 0, 0);
- if (!SWIG_IsOK(res20)) {
- SWIG_exception_fail(SWIG_ArgError(res20), "in method '" "svn_wc_merge5" "', argument " "20"" of type '" "void *""'");
- }
- if (items > 19) {
+ if (items > 18) {
}
{
@@ -34892,8 +33537,6 @@ XS(_wrap_svn_wc_merge5) {
-
-
XSRETURN(argvi);
fail:
@@ -34915,8 +33558,6 @@ XS(_wrap_svn_wc_merge5) {
-
-
SWIG_croak_null();
}
}
@@ -34980,16 +33621,16 @@ XS(_wrap_svn_wc_merge4) {
void *argp14 = 0 ;
int res14 = 0 ;
int res16 ;
- int res18 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg19 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 17) || (items > 18)) {
+ if ((items < 16) || (items > 17)) {
SWIG_croak("Usage: svn_wc_merge4(wc_ctx,left_abspath,right_abspath,target_abspath,left_label,right_label,target_label,left_version,right_version,dry_run,diff3_cmd,merge_options,prop_diff,conflict_func,conflict_baton,cancel_func,cancel_baton,scratch_pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -35068,16 +33709,10 @@ XS(_wrap_svn_wc_merge4) {
SWIG_exception_fail(SWIG_ArgError(res16), "in method '" "svn_wc_merge4" "', argument " "16"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(15), (void**)(&arg17), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_merge4" "', argument " "17"" of type '" "svn_cancel_func_t""'");
- }
- }
- res18 = SWIG_ConvertPtr(ST(16),SWIG_as_voidptrptr(&arg18), 0, 0);
- if (!SWIG_IsOK(res18)) {
- SWIG_exception_fail(SWIG_ArgError(res18), "in method '" "svn_wc_merge4" "', argument " "18"" of type '" "void *""'");
+ arg17 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg18 = ST(15);
}
- if (items > 17) {
+ if (items > 16) {
}
{
@@ -35125,8 +33760,6 @@ XS(_wrap_svn_wc_merge4) {
-
-
XSRETURN(argvi);
fail:
@@ -35146,8 +33779,6 @@ XS(_wrap_svn_wc_merge4) {
-
-
SWIG_croak_null();
}
}
@@ -35209,6 +33840,7 @@ XS(_wrap_svn_wc_merge3) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 13) || (items > 14)) {
@@ -35397,6 +34029,7 @@ XS(_wrap_svn_wc_merge2) {
{
_global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 10) || (items > 11)) {
@@ -35561,6 +34194,7 @@ XS(_wrap_svn_wc_merge) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg9 = &temp9;
if ((items < 9) || (items > 10)) {
@@ -35703,15 +34337,15 @@ XS(_wrap_svn_wc_merge_props3) {
int val8 ;
int ecode8 = 0 ;
int res10 ;
- int res12 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg13 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 12) || (items > 13)) {
+ if ((items < 11) || (items > 12)) {
SWIG_croak("Usage: svn_wc_merge_props3(state,wc_ctx,local_abspath,left_version,right_version,baseprops,propchanges,dry_run,conflict_func,conflict_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_notify_state_t, 0 | 0 );
@@ -35740,8 +34374,10 @@ XS(_wrap_svn_wc_merge_props3) {
}
arg5 = (svn_wc_conflict_version_t *)(argp5);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg6 = svn_swig_pl_hash_to_prophash(ST(5), _global_pool);
}
res7 = SWIG_ConvertPtr(ST(6), &argp7,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
@@ -35765,16 +34401,10 @@ XS(_wrap_svn_wc_merge_props3) {
SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_merge_props3" "', argument " "10"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(10), (void**)(&arg11), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_merge_props3" "', argument " "11"" of type '" "svn_cancel_func_t""'");
- }
+ arg11 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg12 = ST(10);
}
- res12 = SWIG_ConvertPtr(ST(11),SWIG_as_voidptrptr(&arg12), 0, 0);
- if (!SWIG_IsOK(res12)) {
- SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "svn_wc_merge_props3" "', argument " "12"" of type '" "void *""'");
- }
- if (items > 12) {
+ if (items > 11) {
}
{
@@ -35810,8 +34440,6 @@ XS(_wrap_svn_wc_merge_props3) {
-
-
XSRETURN(argvi);
fail:
@@ -35825,8 +34453,6 @@ XS(_wrap_svn_wc_merge_props3) {
-
-
SWIG_croak_null();
}
}
@@ -35865,6 +34491,7 @@ XS(_wrap_svn_wc_merge_props2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 9) || (items > 10)) {
SWIG_croak("Usage: svn_wc_merge_props2(state,path,adm_access,baseprops,propchanges,base_merge,dry_run,conflict_func,conflict_baton,pool);");
@@ -35885,8 +34512,10 @@ XS(_wrap_svn_wc_merge_props2) {
}
arg3 = (svn_wc_adm_access_t *)(argp3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
@@ -35996,6 +34625,7 @@ XS(_wrap_svn_wc_merge_props) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_merge_props(state,path,adm_access,baseprops,propchanges,base_merge,dry_run,pool);");
@@ -36016,8 +34646,10 @@ XS(_wrap_svn_wc_merge_props) {
}
arg3 = (svn_wc_adm_access_t *)(argp3);
{
- if (_global_pool == NULL)
- _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ if (_global_pool == NULL) {
+ _global_pool = svn_swig_pl_make_pool((SV *)NULL);
+ SPAGAIN;
+ }
arg4 = svn_swig_pl_hash_to_prophash(ST(3), _global_pool);
}
res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
@@ -36112,6 +34744,7 @@ XS(_wrap_svn_wc_merge_prop_diffs) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_merge_prop_diffs(state,path,adm_access,propchanges,base_merge,dry_run,pool);");
@@ -36212,9 +34845,11 @@ XS(_wrap_svn_wc_get_pristine_contents2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 4)) {
@@ -36259,7 +34894,11 @@ XS(_wrap_svn_wc_get_pristine_contents2) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
@@ -36295,9 +34934,11 @@ XS(_wrap_svn_wc_get_pristine_contents) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 3)) {
@@ -36337,7 +34978,11 @@ XS(_wrap_svn_wc_get_pristine_contents) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -36370,6 +35015,7 @@ XS(_wrap_svn_wc_get_pristine_copy_path) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 1) || (items > 2)) {
@@ -36425,6 +35071,139 @@ XS(_wrap_svn_wc_get_pristine_copy_path) {
}
+XS(_wrap_svn_wc_cleanup4) {
+ {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ svn_wc_notify_func2_t arg9 = (svn_wc_notify_func2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ apr_pool_t *arg11 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int res10 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 9) || (items > 10)) {
+ SWIG_croak("Usage: svn_wc_cleanup4(wc_ctx,local_abspath,break_locks,fix_recorded_timestamps,clear_dav_cache,vacuum_pristines,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_cleanup4" "', argument " "1"" of type '" "svn_wc_context_t *""'");
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_cleanup4" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_wc_cleanup4" "', argument " "3"" of type '" "svn_boolean_t""'");
+ }
+ arg3 = (svn_boolean_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_wc_cleanup4" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "svn_wc_cleanup4" "', argument " "5"" of type '" "svn_boolean_t""'");
+ }
+ arg5 = (svn_boolean_t)(val5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_wc_cleanup4" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg9), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_cleanup4" "', argument " "9"" of type '" "svn_wc_notify_func2_t""'");
+ }
+ }
+ res10 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg10), 0, 0);
+ if (!SWIG_IsOK(res10)) {
+ SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "svn_wc_cleanup4" "', argument " "10"" of type '" "void *""'");
+ }
+ if (items > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_cleanup4(arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_wc_cleanup3) {
{
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
@@ -36438,15 +35217,15 @@ XS(_wrap_svn_wc_cleanup3) {
int res2 ;
char *buf2 = 0 ;
int alloc2 = 0 ;
- int res4 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_cleanup3(wc_ctx,local_abspath,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -36460,16 +35239,10 @@ XS(_wrap_svn_wc_cleanup3) {
}
arg2 = (char *)(buf2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_cleanup3" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_cleanup3" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -36497,15 +35270,11 @@ XS(_wrap_svn_wc_cleanup3) {
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
-
-
XSRETURN(argvi);
fail:
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
-
-
SWIG_croak_null();
}
}
@@ -36525,15 +35294,15 @@ XS(_wrap_svn_wc_cleanup2) {
int res2 ;
char *buf2 = 0 ;
int alloc2 = 0 ;
- int res4 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 4) || (items > 5)) {
+ if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_cleanup2(path,diff3_cmd,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -36547,16 +35316,10 @@ XS(_wrap_svn_wc_cleanup2) {
}
arg2 = (char *)(buf2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_cleanup2" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_cleanup2" "', argument " "4"" of type '" "void *""'");
- }
- if (items > 4) {
+ if (items > 3) {
}
{
@@ -36584,15 +35347,11 @@ XS(_wrap_svn_wc_cleanup2) {
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
-
-
SWIG_croak_null();
}
}
@@ -36615,15 +35374,15 @@ XS(_wrap_svn_wc_cleanup) {
int res3 ;
char *buf3 = 0 ;
int alloc3 = 0 ;
- int res5 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_cleanup(path,optional_adm_access,diff3_cmd,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -36642,16 +35401,10 @@ XS(_wrap_svn_wc_cleanup) {
}
arg3 = (char *)(buf3);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_cleanup" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_cleanup" "', argument " "5"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -36680,16 +35433,12 @@ XS(_wrap_svn_wc_cleanup) {
if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
SWIG_croak_null();
}
}
@@ -36713,7 +35462,6 @@ XS(_wrap_svn_wc_upgrade) {
char *buf2 = 0 ;
int alloc2 = 0 ;
int res4 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -36721,8 +35469,9 @@ XS(_wrap_svn_wc_upgrade) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_upgrade(wc_ctx,local_abspath,repos_info_func,repos_info_baton,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -36746,26 +35495,20 @@ XS(_wrap_svn_wc_upgrade) {
SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_upgrade" "', argument " "4"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_upgrade" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_upgrade" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_upgrade" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_upgrade" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -36797,8 +35540,6 @@ XS(_wrap_svn_wc_upgrade) {
-
-
XSRETURN(argvi);
fail:
@@ -36808,8 +35549,6 @@ XS(_wrap_svn_wc_upgrade) {
-
-
SWIG_croak_null();
}
}
@@ -36843,6 +35582,7 @@ XS(_wrap_svn_wc_relocate4) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_relocate4(wc_ctx,wcroot_abspath,from,to,validator,validator_baton,scratch_pool);");
@@ -36954,6 +35694,7 @@ XS(_wrap_svn_wc_relocate3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_relocate3(path,adm_access,from,to,recurse,validator,validator_baton,pool);");
@@ -37072,6 +35813,7 @@ XS(_wrap_svn_wc_relocate2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_relocate2(path,adm_access,from,to,recurse,validator,validator_baton,pool);");
@@ -37190,6 +35932,7 @@ XS(_wrap_svn_wc_relocate) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_relocate(path,adm_access,from,to,recurse,validator,validator_baton,pool);");
@@ -37277,6 +36020,149 @@ XS(_wrap_svn_wc_relocate) {
}
+XS(_wrap_svn_wc_revert5) {
+ {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_depth_t arg3 ;
+ svn_boolean_t arg4 ;
+ apr_array_header_t *arg5 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_cancel_func_t arg8 = (svn_cancel_func_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_wc_notify_func2_t arg10 = (svn_wc_notify_func2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int val3 ;
+ int ecode3 = 0 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ int val6 ;
+ int ecode6 = 0 ;
+ int val7 ;
+ int ecode7 = 0 ;
+ int res11 ;
+ int argvi = 0;
+ svn_error_t *result = 0 ;
+ dXSARGS;
+
+ {
+ _global_pool = arg12 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
+ }
+ if ((items < 10) || (items > 11)) {
+ SWIG_croak("Usage: svn_wc_revert5(wc_ctx,local_abspath,depth,use_commit_times,changelist_filter,clear_changelists,metadata_only,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
+ }
+ res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "svn_wc_revert5" "', argument " "1"" of type '" "svn_wc_context_t *""'");
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "svn_wc_revert5" "', argument " "2"" of type '" "char const *""'");
+ }
+ arg2 = (char *)(buf2);
+ ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "svn_wc_revert5" "', argument " "3"" of type '" "svn_depth_t""'");
+ }
+ arg3 = (svn_depth_t)(val3);
+ ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "svn_wc_revert5" "', argument " "4"" of type '" "svn_boolean_t""'");
+ }
+ arg4 = (svn_boolean_t)(val4);
+ res5 = SWIG_ConvertPtr(ST(4), &argp5,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_revert5" "', argument " "5"" of type '" "apr_array_header_t const *""'");
+ }
+ arg5 = (apr_array_header_t *)(argp5);
+ ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6);
+ if (!SWIG_IsOK(ecode6)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "svn_wc_revert5" "', argument " "6"" of type '" "svn_boolean_t""'");
+ }
+ arg6 = (svn_boolean_t)(val6);
+ ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
+ if (!SWIG_IsOK(ecode7)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "svn_wc_revert5" "', argument " "7"" of type '" "svn_boolean_t""'");
+ }
+ arg7 = (svn_boolean_t)(val7);
+ {
+ arg8 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg9 = ST(7);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(ST(8), (void**)(&arg10), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert5" "', argument " "10"" of type '" "svn_wc_notify_func2_t""'");
+ }
+ }
+ res11 = SWIG_ConvertPtr(ST(9),SWIG_as_voidptrptr(&arg11), 0, 0);
+ if (!SWIG_IsOK(res11)) {
+ SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "svn_wc_revert5" "', argument " "11"" of type '" "void *""'");
+ }
+ if (items > 10) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_revert5(arg1,(char const *)arg2,arg3,arg4,(apr_array_header_t const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ SV *exception_handler = perl_get_sv ("SVN::Error::handler", FALSE);
+
+ if (SvOK(exception_handler)) {
+ SV *callback_result;
+
+ svn_swig_pl_callback_thunk (CALL_SV, exception_handler,
+ &callback_result, "S", result,
+ SWIGTYPE_p_svn_error_t);
+ } else {
+ ST(argvi) = SWIG_NewPointerObj(result, SWIGTYPE_p_svn_error_t, 0);
+ argvi++;
+ }
+ }
+ }
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+
+ XSRETURN(argvi);
+ fail:
+
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+
+
+
+
+
+
+
+
+ SWIG_croak_null();
+ }
+}
+
+
XS(_wrap_svn_wc_revert4) {
{
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
@@ -37301,7 +36187,6 @@ XS(_wrap_svn_wc_revert4) {
int ecode4 = 0 ;
void *argp5 = 0 ;
int res5 = 0 ;
- int res7 ;
int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -37309,8 +36194,9 @@ XS(_wrap_svn_wc_revert4) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_revert4(wc_ctx,local_abspath,depth,use_commit_times,changelist_filter,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -37339,26 +36225,20 @@ XS(_wrap_svn_wc_revert4) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert4" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_revert4" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert4" "', argument " "8"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
if (!SWIG_IsOK(res9)) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_revert4" "', argument " "9"" of type '" "void *""'");
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -37391,8 +36271,6 @@ XS(_wrap_svn_wc_revert4) {
-
-
XSRETURN(argvi);
fail:
@@ -37403,8 +36281,6 @@ XS(_wrap_svn_wc_revert4) {
-
-
SWIG_croak_null();
}
}
@@ -37434,7 +36310,6 @@ XS(_wrap_svn_wc_revert3) {
int ecode4 = 0 ;
void *argp5 = 0 ;
int res5 = 0 ;
- int res7 ;
int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -37442,8 +36317,9 @@ XS(_wrap_svn_wc_revert3) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_revert3(path,parent_access,depth,use_commit_times,changelist_filter,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -37472,26 +36348,20 @@ XS(_wrap_svn_wc_revert3) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert3" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_revert3" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert3" "', argument " "8"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
if (!SWIG_IsOK(res9)) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_revert3" "', argument " "9"" of type '" "void *""'");
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -37524,8 +36394,6 @@ XS(_wrap_svn_wc_revert3) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -37536,8 +36404,6 @@ XS(_wrap_svn_wc_revert3) {
-
-
SWIG_croak_null();
}
}
@@ -37564,7 +36430,6 @@ XS(_wrap_svn_wc_revert2) {
int ecode3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -37572,8 +36437,9 @@ XS(_wrap_svn_wc_revert2) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_revert2(path,parent_access,recursive,use_commit_times,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -37597,26 +36463,20 @@ XS(_wrap_svn_wc_revert2) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert2" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_revert2" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert2" "', argument " "7"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_revert2" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -37648,8 +36508,6 @@ XS(_wrap_svn_wc_revert2) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -37659,8 +36517,6 @@ XS(_wrap_svn_wc_revert2) {
-
-
SWIG_croak_null();
}
}
@@ -37687,7 +36543,6 @@ XS(_wrap_svn_wc_revert) {
int ecode3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -37695,8 +36550,9 @@ XS(_wrap_svn_wc_revert) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_revert(path,parent_access,recursive,use_commit_times,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -37720,26 +36576,20 @@ XS(_wrap_svn_wc_revert) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
- }
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_revert" "', argument " "6"" of type '" "void *""'");
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(4);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
+ int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revert" "', argument " "7"" of type '" "svn_wc_notify_func_t""'");
}
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
+ res8 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg8), 0, 0);
if (!SWIG_IsOK(res8)) {
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_revert" "', argument " "8"" of type '" "void *""'");
}
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -37771,8 +36621,6 @@ XS(_wrap_svn_wc_revert) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -37782,8 +36630,6 @@ XS(_wrap_svn_wc_revert) {
-
-
SWIG_croak_null();
}
}
@@ -37809,6 +36655,7 @@ XS(_wrap_svn_wc_restore) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_restore(wc_ctx,local_abspath,use_commit_times,scratch_pool);");
@@ -37889,6 +36736,7 @@ XS(_wrap_svn_wc_create_tmp_file2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -37976,6 +36824,7 @@ XS(_wrap_svn_wc_create_tmp_file) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -38060,6 +36909,7 @@ XS(_wrap_svn_wc_translated_file2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -38158,6 +37008,7 @@ XS(_wrap_svn_wc_translated_file) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -38253,6 +37104,7 @@ XS(_wrap_svn_wc_translated_stream) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -38304,7 +37156,11 @@ XS(_wrap_svn_wc_translated_stream) {
}
}
{
- if (argvi >= items) EXTEND(sp,1); ST(argvi) = svn_swig_pl_from_stream(*arg1); argvi++ ;
+ SV *tmp;
+ PUTBACK;
+ tmp = svn_swig_pl_from_stream(*arg1);
+ SPAGAIN;
+ if (argvi >= items) EXTEND(sp,1); ST(argvi) = tmp; argvi++ ;
}
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
@@ -38352,9 +37208,11 @@ XS(_wrap_svn_wc_transmit_text_deltas3) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = &temp2;
@@ -38377,7 +37235,7 @@ XS(_wrap_svn_wc_transmit_text_deltas3) {
}
arg5 = (svn_boolean_t)(val5);
{
- svn_delta_make_editor(&arg6, &arg7, ST(3), _global_pool);
+ svn_swig_pl_make_editor(&arg6, &arg7, ST(3), _global_pool);
}
if (items > 4) {
@@ -38472,6 +37330,7 @@ XS(_wrap_svn_wc_transmit_text_deltas2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
arg2 = temp2;
@@ -38494,7 +37353,7 @@ XS(_wrap_svn_wc_transmit_text_deltas2) {
}
arg5 = (svn_boolean_t)(val5);
{
- svn_delta_make_editor(&arg6, &arg7, ST(3), _global_pool);
+ svn_swig_pl_make_editor(&arg6, &arg7, ST(3), _global_pool);
}
if (items > 4) {
@@ -38529,7 +37388,7 @@ XS(_wrap_svn_wc_transmit_text_deltas2) {
}
}
{
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg2,
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,59,%append_output@*/ if (argvi >= items) EXTEND(sp,1); /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,56,%set_output@*/ ST(argvi) = sv_2mortal(newSVpv(svn_md5_digest_to_cstring(arg2,
_global_pool),
0)); argvi++ /*@SWIG@*/
@@ -38580,6 +37439,7 @@ XS(_wrap_svn_wc_transmit_text_deltas) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 4) || (items > 5)) {
@@ -38601,7 +37461,7 @@ XS(_wrap_svn_wc_transmit_text_deltas) {
}
arg3 = (svn_boolean_t)(val3);
{
- svn_delta_make_editor(&arg4, &arg5, ST(3), _global_pool);
+ svn_swig_pl_make_editor(&arg4, &arg5, ST(3), _global_pool);
}
if (items > 4) {
@@ -38671,6 +37531,7 @@ XS(_wrap_svn_wc_transmit_prop_deltas2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_transmit_prop_deltas2(wc_ctx,local_abspath,editor,baton,scratch_pool);");
@@ -38686,7 +37547,7 @@ XS(_wrap_svn_wc_transmit_prop_deltas2) {
}
arg2 = (char *)(buf2);
{
- svn_delta_make_editor(&arg3, &arg4, ST(2), _global_pool);
+ svn_swig_pl_make_editor(&arg3, &arg4, ST(2), _global_pool);
}
if (items > 3) {
@@ -38750,6 +37611,7 @@ XS(_wrap_svn_wc_transmit_prop_deltas) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
if ((items < 4) || (items > 5)) {
@@ -38771,7 +37633,7 @@ XS(_wrap_svn_wc_transmit_prop_deltas) {
}
arg3 = (svn_wc_entry_t *)(argp3);
{
- svn_delta_make_editor(&arg4, &arg5, ST(3), _global_pool);
+ svn_swig_pl_make_editor(&arg4, &arg5, ST(3), _global_pool);
}
if (items > 4) {
@@ -38835,6 +37697,7 @@ XS(_wrap_svn_wc_get_default_ignores) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 1) || (items > 2)) {
@@ -38906,9 +37769,11 @@ XS(_wrap_svn_wc_get_ignores2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 5)) {
@@ -38994,6 +37859,7 @@ XS(_wrap_svn_wc_get_ignores) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 2) || (items > 3)) {
@@ -39066,6 +37932,7 @@ XS(_wrap_svn_wc_match_ignore_list) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_match_ignore_list(str,list,pool);");
@@ -39076,7 +37943,7 @@ XS(_wrap_svn_wc_match_ignore_list) {
}
arg1 = (char *)(buf1);
{
- arg2 = (apr_array_header_t *) svn_swig_pl_strings_to_array(ST(1),
+ arg2 = svn_swig_pl_strings_to_array(ST(1),
_global_pool);
}
if (items > 2) {
@@ -39122,6 +37989,7 @@ XS(_wrap_svn_wc_add_lock2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_add_lock2(wc_ctx,abspath,lock,scratch_pool);");
@@ -39201,6 +38069,7 @@ XS(_wrap_svn_wc_add_lock) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_add_lock(path,lock,adm_access,pool);");
@@ -39277,6 +38146,7 @@ XS(_wrap_svn_wc_remove_lock2) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_remove_lock2(wc_ctx,local_abspath,scratch_pool);");
@@ -39346,6 +38216,7 @@ XS(_wrap_svn_wc_remove_lock) {
{
_global_pool = arg3 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 2) || (items > 3)) {
SWIG_croak("Usage: svn_wc_remove_lock(path,adm_access,pool);");
@@ -39801,19 +38672,20 @@ XS(_wrap_svn_wc_revision_status2) {
int alloc4 = 0 ;
int val5 ;
int ecode5 = 0 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 6) || (items > 8)) {
+ if ((items < 5) || (items > 7)) {
SWIG_croak("Usage: svn_wc_revision_status2(wc_ctx,local_abspath,trail_url,committed,cancel_func,cancel_baton,result_pool,scratch_pool);");
}
res2 = SWIG_ConvertPtr(ST(0), &argp2,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -39837,19 +38709,13 @@ XS(_wrap_svn_wc_revision_status2) {
}
arg5 = (svn_boolean_t)(val5);
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revision_status2" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_revision_status2" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(4);
}
- if (items > 6) {
+ if (items > 5) {
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -39884,8 +38750,6 @@ XS(_wrap_svn_wc_revision_status2) {
-
-
XSRETURN(argvi);
fail:
@@ -39895,8 +38759,6 @@ XS(_wrap_svn_wc_revision_status2) {
-
-
SWIG_croak_null();
}
}
@@ -39921,16 +38783,16 @@ XS(_wrap_svn_wc_revision_status) {
int alloc3 = 0 ;
int val4 ;
int ecode4 = 0 ;
- int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
- if ((items < 5) || (items > 6)) {
+ if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_revision_status(wc_path,trail_url,committed,cancel_func,cancel_baton,pool);");
}
res2 = SWIG_AsCharPtrAndSize(ST(0), &buf2, NULL, &alloc2);
@@ -39949,16 +38811,10 @@ XS(_wrap_svn_wc_revision_status) {
}
arg4 = (svn_boolean_t)(val4);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg5), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_revision_status" "', argument " "5"" of type '" "svn_cancel_func_t""'");
- }
+ arg5 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg6 = ST(3);
}
- res6 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg6), 0, 0);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_revision_status" "', argument " "6"" of type '" "void *""'");
- }
- if (items > 5) {
+ if (items > 4) {
}
{
@@ -39991,8 +38847,6 @@ XS(_wrap_svn_wc_revision_status) {
if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
XSRETURN(argvi);
fail:
@@ -40000,8 +38854,6 @@ XS(_wrap_svn_wc_revision_status) {
if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-
-
SWIG_croak_null();
}
}
@@ -40032,7 +38884,6 @@ XS(_wrap_svn_wc_set_changelist2) {
int ecode4 = 0 ;
void *argp5 = 0 ;
int res5 = 0 ;
- int res7 ;
int res9 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -40040,8 +38891,9 @@ XS(_wrap_svn_wc_set_changelist2) {
{
_global_pool = arg10 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 9) || (items > 10)) {
+ if ((items < 8) || (items > 9)) {
SWIG_croak("Usage: svn_wc_set_changelist2(wc_ctx,local_abspath,changelist,depth,changelist_filter,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -40070,26 +38922,20 @@ XS(_wrap_svn_wc_set_changelist2) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_set_changelist2" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
- }
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_set_changelist2" "', argument " "7"" of type '" "void *""'");
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(7), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg8), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_set_changelist2" "', argument " "8"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res9 = SWIG_ConvertPtr(ST(8),SWIG_as_voidptrptr(&arg9), 0, 0);
+ res9 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg9), 0, 0);
if (!SWIG_IsOK(res9)) {
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "svn_wc_set_changelist2" "', argument " "9"" of type '" "void *""'");
}
- if (items > 9) {
+ if (items > 8) {
}
{
@@ -40122,8 +38968,6 @@ XS(_wrap_svn_wc_set_changelist2) {
-
-
XSRETURN(argvi);
fail:
@@ -40134,8 +38978,6 @@ XS(_wrap_svn_wc_set_changelist2) {
-
-
SWIG_croak_null();
}
}
@@ -40160,7 +39002,6 @@ XS(_wrap_svn_wc_set_changelist) {
int alloc2 = 0 ;
void *argp3 = 0 ;
int res3 = 0 ;
- int res5 ;
int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -40168,8 +39009,9 @@ XS(_wrap_svn_wc_set_changelist) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_set_changelist(path,changelist,adm_access,cancel_func,cancel_baton,notify_func,notify_baton,pool);");
}
res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
@@ -40188,26 +39030,20 @@ XS(_wrap_svn_wc_set_changelist) {
}
arg3 = (svn_wc_adm_access_t *)(argp3);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_set_changelist" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
- }
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_set_changelist" "', argument " "5"" of type '" "void *""'");
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_set_changelist" "', argument " "6"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
+ res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
if (!SWIG_IsOK(res7)) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_set_changelist" "', argument " "7"" of type '" "void *""'");
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -40238,8 +39074,6 @@ XS(_wrap_svn_wc_set_changelist) {
-
-
XSRETURN(argvi);
fail:
if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
@@ -40248,8 +39082,6 @@ XS(_wrap_svn_wc_set_changelist) {
-
-
SWIG_croak_null();
}
}
@@ -40277,15 +39109,15 @@ XS(_wrap_svn_wc_get_changelists) {
void *argp4 = 0 ;
int res4 = 0 ;
int res6 ;
- int res8 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 8) || (items > 9)) {
+ if ((items < 7) || (items > 8)) {
SWIG_croak("Usage: svn_wc_get_changelists(wc_ctx,local_abspath,depth,changelist_filter,callback_func,callback_baton,cancel_func,cancel_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -40319,16 +39151,10 @@ XS(_wrap_svn_wc_get_changelists) {
SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_get_changelists" "', argument " "6"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(6), (void**)(&arg7), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_get_changelists" "', argument " "7"" of type '" "svn_cancel_func_t""'");
- }
+ arg7 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg8 = ST(6);
}
- res8 = SWIG_ConvertPtr(ST(7),SWIG_as_voidptrptr(&arg8), 0, 0);
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "svn_wc_get_changelists" "', argument " "8"" of type '" "void *""'");
- }
- if (items > 8) {
+ if (items > 7) {
}
{
@@ -40360,8 +39186,6 @@ XS(_wrap_svn_wc_get_changelists) {
-
-
XSRETURN(argvi);
fail:
@@ -40371,8 +39195,6 @@ XS(_wrap_svn_wc_get_changelists) {
-
-
SWIG_croak_null();
}
}
@@ -40396,7 +39218,6 @@ XS(_wrap_svn_wc_crop_tree2) {
int alloc2 = 0 ;
int val3 ;
int ecode3 = 0 ;
- int res5 ;
int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -40404,8 +39225,9 @@ XS(_wrap_svn_wc_crop_tree2) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_crop_tree2(wc_ctx,local_abspath,depth,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -40424,26 +39246,20 @@ XS(_wrap_svn_wc_crop_tree2) {
}
arg3 = (svn_depth_t)(val3);
{
- int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg4), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_crop_tree2" "', argument " "4"" of type '" "svn_cancel_func_t""'");
- }
- }
- res5 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg5), 0, 0);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_crop_tree2" "', argument " "5"" of type '" "void *""'");
+ arg4 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg5 = ST(3);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_crop_tree2" "', argument " "6"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
+ res7 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg7), 0, 0);
if (!SWIG_IsOK(res7)) {
SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_crop_tree2" "', argument " "7"" of type '" "void *""'");
}
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -40474,8 +39290,6 @@ XS(_wrap_svn_wc_crop_tree2) {
-
-
XSRETURN(argvi);
fail:
@@ -40484,8 +39298,6 @@ XS(_wrap_svn_wc_crop_tree2) {
-
-
SWIG_croak_null();
}
}
@@ -40510,15 +39322,15 @@ XS(_wrap_svn_wc_crop_tree) {
int val3 ;
int ecode3 = 0 ;
int res5 ;
- int res7 ;
int argvi = 0;
svn_error_t *result = 0 ;
dXSARGS;
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 7) || (items > 8)) {
+ if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_crop_tree(anchor,target,depth,notify_func,notify_baton,cancel_func,cancel_baton,pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_adm_access_t, 0 | 0 );
@@ -40547,16 +39359,10 @@ XS(_wrap_svn_wc_crop_tree) {
SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "svn_wc_crop_tree" "', argument " "5"" of type '" "void *""'");
}
{
- int res = SWIG_ConvertFunctionPtr(ST(5), (void**)(&arg6), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_crop_tree" "', argument " "6"" of type '" "svn_cancel_func_t""'");
- }
+ arg6 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg7 = ST(5);
}
- res7 = SWIG_ConvertPtr(ST(6),SWIG_as_voidptrptr(&arg7), 0, 0);
- if (!SWIG_IsOK(res7)) {
- SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "svn_wc_crop_tree" "', argument " "7"" of type '" "void *""'");
- }
- if (items > 7) {
+ if (items > 6) {
}
{
@@ -40587,8 +39393,6 @@ XS(_wrap_svn_wc_crop_tree) {
-
-
XSRETURN(argvi);
fail:
@@ -40597,8 +39401,6 @@ XS(_wrap_svn_wc_crop_tree) {
-
-
SWIG_croak_null();
}
}
@@ -40619,7 +39421,6 @@ XS(_wrap_svn_wc_exclude) {
int res2 ;
char *buf2 = 0 ;
int alloc2 = 0 ;
- int res4 ;
int res6 ;
int argvi = 0;
svn_error_t *result = 0 ;
@@ -40627,8 +39428,9 @@ XS(_wrap_svn_wc_exclude) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
- if ((items < 6) || (items > 7)) {
+ if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_exclude(wc_ctx,local_abspath,cancel_func,cancel_baton,notify_func,notify_baton,scratch_pool);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
@@ -40642,26 +39444,20 @@ XS(_wrap_svn_wc_exclude) {
}
arg2 = (char *)(buf2);
{
- int res = SWIG_ConvertFunctionPtr(ST(2), (void**)(&arg3), SWIGTYPE_p_f_p_void__p_svn_error_t);
- if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_exclude" "', argument " "3"" of type '" "svn_cancel_func_t""'");
- }
- }
- res4 = SWIG_ConvertPtr(ST(3),SWIG_as_voidptrptr(&arg4), 0, 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "svn_wc_exclude" "', argument " "4"" of type '" "void *""'");
+ arg3 = (svn_cancel_func_t) svn_swig_pl_cancel_func;
+ arg4 = ST(2);
}
{
- int res = SWIG_ConvertFunctionPtr(ST(4), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(ST(3), (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_wc_exclude" "', argument " "5"" of type '" "svn_wc_notify_func2_t""'");
}
}
- res6 = SWIG_ConvertPtr(ST(5),SWIG_as_voidptrptr(&arg6), 0, 0);
+ res6 = SWIG_ConvertPtr(ST(4),SWIG_as_voidptrptr(&arg6), 0, 0);
if (!SWIG_IsOK(res6)) {
SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "svn_wc_exclude" "', argument " "6"" of type '" "void *""'");
}
- if (items > 6) {
+ if (items > 5) {
}
{
@@ -40691,8 +39487,6 @@ XS(_wrap_svn_wc_exclude) {
-
-
XSRETURN(argvi);
fail:
@@ -40700,8 +39494,6 @@ XS(_wrap_svn_wc_exclude) {
-
-
SWIG_croak_null();
}
}
@@ -40733,6 +39525,7 @@ XS(_wrap_svn_wc_read_kind2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 4) || (items > 5)) {
@@ -40831,6 +39624,7 @@ XS(_wrap_svn_wc_read_kind) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg1 = &temp1;
if ((items < 3) || (items > 4)) {
@@ -40927,6 +39721,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_file_opened) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -41066,6 +39861,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_file_changed) {
{
_global_pool = arg15 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 13) || (items > 14)) {
@@ -41266,6 +40062,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_file_added) {
{
_global_pool = arg17 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 15) || (items > 16)) {
@@ -41461,6 +40258,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_file_deleted) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 9) || (items > 10)) {
@@ -41595,6 +40393,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_dir_deleted) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 4) || (items > 5)) {
@@ -41700,6 +40499,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_dir_opened) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -41833,6 +40633,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_dir_added) {
{
_global_pool = arg11 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
arg4 = &temp4;
@@ -41980,6 +40781,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_dir_props_changed) {
{
_global_pool = arg9 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 7) || (items > 8)) {
@@ -42106,6 +40908,7 @@ XS(_wrap_svn_wc_diff_callbacks4_invoke_dir_closed) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg4 = &temp4;
if ((items < 6) || (items > 7)) {
@@ -44808,6 +43611,7 @@ XS(_wrap_svn_wc_entry_callbacks2_invoke_found_entry) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_entry_callbacks2_invoke_found_entry(_obj,path,entry,walk_baton,pool);");
@@ -44895,6 +43699,7 @@ XS(_wrap_svn_wc_entry_callbacks2_invoke_handle_error) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_entry_callbacks2_invoke_handle_error(_obj,path,err,walk_baton,pool);");
@@ -44982,6 +43787,7 @@ XS(_wrap_svn_wc_entry_callbacks_invoke_found_entry) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_entry_callbacks_invoke_found_entry(_obj,path,entry,walk_baton,pool);");
@@ -45071,6 +43877,7 @@ XS(_wrap_svn_wc_invoke_external_update) {
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 6) || (items > 7)) {
SWIG_croak("Usage: svn_wc_invoke_external_update(_obj,baton,local_abspath,old_val,new_val,depth,scratch_pool);");
@@ -45174,6 +43981,7 @@ XS(_wrap_svn_wc_invoke_notify_func2) {
{
_global_pool = arg4 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 3) || (items > 4)) {
SWIG_croak("Usage: svn_wc_invoke_notify_func2(_obj,baton,notify,pool);");
@@ -45348,9 +44156,11 @@ XS(_wrap_svn_wc_invoke_conflict_resolver_func2) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 5)) {
@@ -45445,6 +44255,7 @@ XS(_wrap_svn_wc_invoke_conflict_resolver_func) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -45536,6 +44347,7 @@ XS(_wrap_svn_wc_invoke_status_func4) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_invoke_status_func4(_obj,baton,local_abspath,status,scratch_pool);");
@@ -45622,6 +44434,7 @@ XS(_wrap_svn_wc_invoke_status_func3) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_wc_invoke_status_func3(_obj,baton,path,status,pool);");
@@ -45834,6 +44647,7 @@ XS(_wrap_svn_wc_invoke_get_file) {
{
_global_pool = arg8 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg6 = &temp6;
arg7 = &temp7;
@@ -45862,6 +44676,7 @@ XS(_wrap_svn_wc_invoke_get_file) {
arg4 = (svn_revnum_t)(val4);
{
svn_swig_pl_make_stream (&arg5, ST(4));
+ SPAGAIN;
}
if (items > 5) {
@@ -45944,9 +44759,11 @@ XS(_wrap_svn_wc_invoke_dirents_func) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg3 = &temp3;
if ((items < 4) || (items > 6)) {
@@ -46040,6 +44857,7 @@ XS(_wrap_svn_wc_invoke_canonicalize_svn_prop_get_file) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
if ((items < 3) || (items > 4)) {
@@ -46053,6 +44871,7 @@ XS(_wrap_svn_wc_invoke_canonicalize_svn_prop_get_file) {
}
{
svn_swig_pl_make_stream (&arg3, ST(1));
+ SPAGAIN;
}
res4 = SWIG_ConvertPtr(ST(2),SWIG_as_voidptrptr(&arg4), 0, 0);
if (!SWIG_IsOK(res4)) {
@@ -46129,9 +44948,11 @@ XS(_wrap_svn_wc_invoke_upgrade_get_repos_info) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
{
_global_pool = arg7 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
arg2 = &temp2;
arg3 = &temp3;
@@ -46241,6 +45062,7 @@ XS(_wrap_svn_wc_invoke_relocation_validator3) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_invoke_relocation_validator3(_obj,baton,uuid,url,root_url,pool);");
@@ -46338,6 +45160,7 @@ XS(_wrap_svn_wc_invoke_relocation_validator2) {
{
_global_pool = arg6 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 5) || (items > 6)) {
SWIG_croak("Usage: svn_wc_invoke_relocation_validator2(_obj,baton,uuid,url,root,pool);");
@@ -46509,6 +45332,7 @@ XS(_wrap_svn_changelist_invoke_receiver) {
{
_global_pool = arg5 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 4) || (items > 5)) {
SWIG_croak("Usage: svn_changelist_invoke_receiver(_obj,baton,path,changelist,pool);");
@@ -46585,6 +45409,7 @@ XS(_wrap_svn_wc_swig_init_asp_dot_net_hack) {
{
_global_pool = arg1 = svn_swig_pl_make_pool (ST(items-1));
+ SPAGAIN;
}
if ((items < 0) || (items > 1)) {
SWIG_croak("Usage: svn_wc_swig_init_asp_dot_net_hack(pool);");
@@ -47482,38 +46307,6 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_conflict_version_create2", _wrap_svn_wc_conflict_version_create2},
{"SVN::_Wc::svn_wc_conflict_version_create", _wrap_svn_wc_conflict_version_create},
{"SVN::_Wc::svn_wc_conflict_version_dup", _wrap_svn_wc_conflict_version_dup},
-{"SVN::_Wc::svn_wc_conflict_description2_t_local_abspath_set", _wrap_svn_wc_conflict_description2_t_local_abspath_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_local_abspath_get", _wrap_svn_wc_conflict_description2_t_local_abspath_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_node_kind_set", _wrap_svn_wc_conflict_description2_t_node_kind_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_node_kind_get", _wrap_svn_wc_conflict_description2_t_node_kind_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_kind_set", _wrap_svn_wc_conflict_description2_t_kind_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_kind_get", _wrap_svn_wc_conflict_description2_t_kind_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_property_name_set", _wrap_svn_wc_conflict_description2_t_property_name_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_property_name_get", _wrap_svn_wc_conflict_description2_t_property_name_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_is_binary_set", _wrap_svn_wc_conflict_description2_t_is_binary_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_is_binary_get", _wrap_svn_wc_conflict_description2_t_is_binary_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_mime_type_set", _wrap_svn_wc_conflict_description2_t_mime_type_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_mime_type_get", _wrap_svn_wc_conflict_description2_t_mime_type_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_action_set", _wrap_svn_wc_conflict_description2_t_action_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_action_get", _wrap_svn_wc_conflict_description2_t_action_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_reason_set", _wrap_svn_wc_conflict_description2_t_reason_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_reason_get", _wrap_svn_wc_conflict_description2_t_reason_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_base_abspath_set", _wrap_svn_wc_conflict_description2_t_base_abspath_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_base_abspath_get", _wrap_svn_wc_conflict_description2_t_base_abspath_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_their_abspath_set", _wrap_svn_wc_conflict_description2_t_their_abspath_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_their_abspath_get", _wrap_svn_wc_conflict_description2_t_their_abspath_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_my_abspath_set", _wrap_svn_wc_conflict_description2_t_my_abspath_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_my_abspath_get", _wrap_svn_wc_conflict_description2_t_my_abspath_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_merged_file_set", _wrap_svn_wc_conflict_description2_t_merged_file_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_merged_file_get", _wrap_svn_wc_conflict_description2_t_merged_file_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_operation_set", _wrap_svn_wc_conflict_description2_t_operation_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_operation_get", _wrap_svn_wc_conflict_description2_t_operation_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_src_left_version_set", _wrap_svn_wc_conflict_description2_t_src_left_version_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_src_left_version_get", _wrap_svn_wc_conflict_description2_t_src_left_version_get},
-{"SVN::_Wc::svn_wc_conflict_description2_t_src_right_version_set", _wrap_svn_wc_conflict_description2_t_src_right_version_set},
-{"SVN::_Wc::svn_wc_conflict_description2_t_src_right_version_get", _wrap_svn_wc_conflict_description2_t_src_right_version_get},
-{"SVN::_Wc::new_svn_wc_conflict_description2_t", _wrap_new_svn_wc_conflict_description2_t},
-{"SVN::_Wc::delete_svn_wc_conflict_description2_t", _wrap_delete_svn_wc_conflict_description2_t},
{"SVN::_Wc::svn_wc_conflict_description_t_path_set", _wrap_svn_wc_conflict_description_t_path_set},
{"SVN::_Wc::svn_wc_conflict_description_t_path_get", _wrap_svn_wc_conflict_description_t_path_get},
{"SVN::_Wc::svn_wc_conflict_description_t_node_kind_set", _wrap_svn_wc_conflict_description_t_node_kind_set},
@@ -47554,15 +46347,8 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_conflict_description_create_prop", _wrap_svn_wc_conflict_description_create_prop},
{"SVN::_Wc::svn_wc_conflict_description_create_tree2", _wrap_svn_wc_conflict_description_create_tree2},
{"SVN::_Wc::svn_wc_conflict_description_create_tree", _wrap_svn_wc_conflict_description_create_tree},
+{"SVN::_Wc::svn_wc_conflict_description2_dup", _wrap_svn_wc_conflict_description2_dup},
{"SVN::_Wc::svn_wc__conflict_description2_dup", _wrap_svn_wc__conflict_description2_dup},
-{"SVN::_Wc::svn_wc_conflict_result_t_choice_set", _wrap_svn_wc_conflict_result_t_choice_set},
-{"SVN::_Wc::svn_wc_conflict_result_t_choice_get", _wrap_svn_wc_conflict_result_t_choice_get},
-{"SVN::_Wc::svn_wc_conflict_result_t_merged_file_set", _wrap_svn_wc_conflict_result_t_merged_file_set},
-{"SVN::_Wc::svn_wc_conflict_result_t_merged_file_get", _wrap_svn_wc_conflict_result_t_merged_file_get},
-{"SVN::_Wc::svn_wc_conflict_result_t_save_merged_set", _wrap_svn_wc_conflict_result_t_save_merged_set},
-{"SVN::_Wc::svn_wc_conflict_result_t_save_merged_get", _wrap_svn_wc_conflict_result_t_save_merged_get},
-{"SVN::_Wc::new_svn_wc_conflict_result_t", _wrap_new_svn_wc_conflict_result_t},
-{"SVN::_Wc::delete_svn_wc_conflict_result_t", _wrap_delete_svn_wc_conflict_result_t},
{"SVN::_Wc::svn_wc_create_conflict_result", _wrap_svn_wc_create_conflict_result},
{"SVN::_Wc::svn_wc_diff_callbacks4_t_file_opened_set", _wrap_svn_wc_diff_callbacks4_t_file_opened_set},
{"SVN::_Wc::svn_wc_diff_callbacks4_t_file_opened_get", _wrap_svn_wc_diff_callbacks4_t_file_opened_get},
@@ -47832,6 +46618,8 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_status3_t_moved_to_abspath_get", _wrap_svn_wc_status3_t_moved_to_abspath_get},
{"SVN::_Wc::svn_wc_status3_t_file_external_set", _wrap_svn_wc_status3_t_file_external_set},
{"SVN::_Wc::svn_wc_status3_t_file_external_get", _wrap_svn_wc_status3_t_file_external_get},
+{"SVN::_Wc::svn_wc_status3_t_actual_kind_set", _wrap_svn_wc_status3_t_actual_kind_set},
+{"SVN::_Wc::svn_wc_status3_t_actual_kind_get", _wrap_svn_wc_status3_t_actual_kind_get},
{"SVN::_Wc::new_svn_wc_status3_t", _wrap_new_svn_wc_status3_t},
{"SVN::_Wc::delete_svn_wc_status3_t", _wrap_delete_svn_wc_status3_t},
{"SVN::_Wc::svn_wc_status2_t_entry_set", _wrap_svn_wc_status2_t_entry_set},
@@ -47911,6 +46699,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_delete3", _wrap_svn_wc_delete3},
{"SVN::_Wc::svn_wc_delete2", _wrap_svn_wc_delete2},
{"SVN::_Wc::svn_wc_delete", _wrap_svn_wc_delete},
+{"SVN::_Wc::svn_wc_add_from_disk3", _wrap_svn_wc_add_from_disk3},
{"SVN::_Wc::svn_wc_add_from_disk2", _wrap_svn_wc_add_from_disk2},
{"SVN::_Wc::svn_wc_add_from_disk", _wrap_svn_wc_add_from_disk},
{"SVN::_Wc::svn_wc_add4", _wrap_svn_wc_add4},
@@ -47929,6 +46718,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_resolved_conflict2", _wrap_svn_wc_resolved_conflict2},
{"SVN::_Wc::svn_wc_resolved_conflict", _wrap_svn_wc_resolved_conflict},
{"SVN::_Wc::svn_wc_committed_queue_create", _wrap_svn_wc_committed_queue_create},
+{"SVN::_Wc::svn_wc_queue_committed4", _wrap_svn_wc_queue_committed4},
{"SVN::_Wc::svn_wc_queue_committed3", _wrap_svn_wc_queue_committed3},
{"SVN::_Wc::svn_wc_queue_committed2", _wrap_svn_wc_queue_committed2},
{"SVN::_Wc::svn_wc_queue_committed", _wrap_svn_wc_queue_committed},
@@ -47995,6 +46785,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_get_pristine_contents2", _wrap_svn_wc_get_pristine_contents2},
{"SVN::_Wc::svn_wc_get_pristine_contents", _wrap_svn_wc_get_pristine_contents},
{"SVN::_Wc::svn_wc_get_pristine_copy_path", _wrap_svn_wc_get_pristine_copy_path},
+{"SVN::_Wc::svn_wc_cleanup4", _wrap_svn_wc_cleanup4},
{"SVN::_Wc::svn_wc_cleanup3", _wrap_svn_wc_cleanup3},
{"SVN::_Wc::svn_wc_cleanup2", _wrap_svn_wc_cleanup2},
{"SVN::_Wc::svn_wc_cleanup", _wrap_svn_wc_cleanup},
@@ -48003,6 +46794,7 @@ static swig_command_info swig_commands[] = {
{"SVN::_Wc::svn_wc_relocate3", _wrap_svn_wc_relocate3},
{"SVN::_Wc::svn_wc_relocate2", _wrap_svn_wc_relocate2},
{"SVN::_Wc::svn_wc_relocate", _wrap_svn_wc_relocate},
+{"SVN::_Wc::svn_wc_revert5", _wrap_svn_wc_revert5},
{"SVN::_Wc::svn_wc_revert4", _wrap_svn_wc_revert4},
{"SVN::_Wc::svn_wc_revert3", _wrap_svn_wc_revert3},
{"SVN::_Wc::svn_wc_revert2", _wrap_svn_wc_revert2},
@@ -48102,18 +46894,18 @@ static swig_command_info swig_commands[] = {
};
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -48123,17 +46915,17 @@ static swig_command_info swig_commands[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -48196,7 +46988,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -48395,747 +47187,772 @@ XS(SWIG_init) {
SvREADONLY_on(sv);
}
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_FROM_NF", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000000)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_TO_NF", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000001)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_FORCE_EOL_REPAIR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000002)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_NO_OUTPUT_CLEANUP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000004)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_FORCE_COPY", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000008)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_TRANSLATE_USE_GLOBAL_TMP", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(0x00000010)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_ADM_DIR_NAME", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr(".svn"));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_copy", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_copy)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_restore", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_restore)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_revert", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_revert)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_revert", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_revert)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_resolved", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_resolved)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_skip", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_skip)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_update", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_update)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_completed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_completed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_external", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_external)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_status_completed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_status_completed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_status_external", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_status_external)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_replaced", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_replaced)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_postfix_txdelta", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_postfix_txdelta)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_blame_revision", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_blame_revision)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_locked", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_locked)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_unlocked", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_unlocked)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_lock", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_lock)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_unlock", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_unlock)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_exists", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_exists)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_changelist_set", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_changelist_set)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_changelist_clear", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_changelist_clear)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_changelist_moved", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_changelist_moved)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_merge_begin", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_merge_begin)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_foreign_merge_begin", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_foreign_merge_begin)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_replace", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_replace)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_property_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_property_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_property_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_property_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_property_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_property_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_property_deleted_nonexistent", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_property_deleted_nonexistent)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_revprop_set", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_revprop_set)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_revprop_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_revprop_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_merge_completed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_merge_completed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_tree_conflict", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_tree_conflict)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_external", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_external)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_started", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_started)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_skip_obstruction", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_skip_obstruction)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_skip_working_only", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_skip_working_only)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_skip_access_denied", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_skip_access_denied)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_external_removed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_external_removed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_shadowed_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_shadowed_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_shadowed_update", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_shadowed_update)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_shadowed_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_shadowed_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_merge_record_info", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_merge_record_info)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_upgraded_path", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_upgraded_path)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_merge_record_info_begin", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_merge_record_info_begin)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_merge_elide_info", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_merge_elide_info)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_patch", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_patch)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_patch_applied_hunk", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_patch_applied_hunk)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_patch_rejected_hunk", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_patch_rejected_hunk)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_patch_hunk_already_applied", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_patch_hunk_already_applied)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_copied", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_copied)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_copied_replaced", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_copied_replaced)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_url_redirect", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_url_redirect)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_path_nonexistent", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_path_nonexistent)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_exclude", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_exclude)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_conflict", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_conflict)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_missing", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_missing)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_out_of_date", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_out_of_date)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_no_parent", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_no_parent)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_locked", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_locked)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_forbidden_by_server", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_forbidden_by_server)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_skip_conflicted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_skip_conflicted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_update_broken_lock", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_update_broken_lock)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_obstruction", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_obstruction)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_conflict_resolver_starting", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_conflict_resolver_starting)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_conflict_resolver_done", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_conflict_resolver_done)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_left_local_modifications", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_left_local_modifications)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_foreign_copy_begin", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_foreign_copy_begin)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_move_broken", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_move_broken)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_cleanup_external", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_cleanup_external)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_failed_requires_target", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_failed_requires_target)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_info_external", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_info_external)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_commit_finalizing", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_commit_finalizing)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_inapplicable", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_inapplicable)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_unknown", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_unknown)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_unchanged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_unchanged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_missing", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_missing)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_obstructed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_obstructed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_changed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_changed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_merged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_merged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_conflicted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_conflicted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_state_source_missing", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_state_source_missing)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_lock_state_inapplicable", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_lock_state_inapplicable)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_lock_state_unknown", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_lock_state_unknown)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_lock_state_unchanged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_lock_state_unchanged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_lock_state_locked", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_lock_state_locked)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_notify_lock_state_unlocked", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_notify_lock_state_unlocked)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_action_edit", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_action_edit)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_action_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_action_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_action_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_action_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_action_replace", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_action_replace)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_edited", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_edited)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_obstructed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_obstructed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_missing", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_missing)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_unversioned", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_unversioned)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_replaced", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_replaced)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_moved_away", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_moved_away)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_reason_moved_here", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_reason_moved_here)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_kind_text", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_kind_text)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_kind_property", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_kind_property)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_kind_tree", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_kind_tree)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_operation_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_operation_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_operation_update", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_operation_update)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_operation_switch", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_operation_switch)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_operation_merge", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_operation_merge)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_undefined", TRUE | 0x2 | GV_ADDMULTI);
+ sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_undefined)));
+ SvREADONLY_on(sv);
+ } while(0) /*@SWIG@*/;
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_postpone", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_postpone)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_base", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_base)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_theirs_full", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_theirs_full)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_mine_full", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_mine_full)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_theirs_conflict", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_theirs_conflict)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_mine_conflict", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_mine_conflict)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_merged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_merged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_conflict_choose_unspecified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_conflict_choose_unspecified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_schedule_normal", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_schedule_normal)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_schedule_add", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_schedule_add)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_schedule_delete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_schedule_delete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_schedule_replace", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_schedule_replace)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_ENTRY_WORKING_SIZE_UNKNOWN", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)((-1))));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "SVN_WC_ENTRY_THIS_DIR", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_FromCharPtr(""));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_none", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_none)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_unversioned", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_unversioned)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_normal", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_normal)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_added", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_added)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_missing", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_missing)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_deleted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_deleted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_replaced", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_replaced)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_modified", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_modified)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_merged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_merged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_conflicted", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_conflicted)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_ignored", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_ignored)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_obstructed", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_obstructed)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_external", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_external)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_status_incomplete", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_status_incomplete)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_merge_unchanged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_merge_unchanged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_merge_merged", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_merge_merged)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_merge_conflict", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_merge_conflict)));
SvREADONLY_on(sv);
} while(0) /*@SWIG@*/;
- /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/perl5/perltypemaps.swg,65,%set_constant@*/ do {
+ /*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/perl5/perltypemaps.swg,65,%set_constant@*/ do {
SV *sv = get_sv((char*) SWIG_prefix "svn_wc_merge_no_merge", TRUE | 0x2 | GV_ADDMULTI);
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1((int)(svn_wc_merge_no_merge)));
SvREADONLY_on(sv);
diff --git a/subversion/bindings/swig/perl/native/t/1repos.t b/subversion/bindings/swig/perl/native/t/1repos.t
index 85abd2c..0375d7e 100644
--- a/subversion/bindings/swig/perl/native/t/1repos.t
+++ b/subversion/bindings/swig/perl/native/t/1repos.t
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
#
#
# Licensed to the Apache Software Foundation (ASF) under one
@@ -20,16 +20,21 @@
#
#
-use Test::More tests => 6;
+use strict;
+use warnings;
+
+use Test::More tests => 8;
use File::Temp qw(tempdir);
use File::Path qw(rmtree);
-use strict;
+use File::Spec;
+use POSIX qw(locale_h);
-require SVN::Core;
-require SVN::Repos;
-require SVN::Fs;
-require SVN::Delta;
-use File::Path;
+use SVN::Core;
+use SVN::Repos;
+use SVN::Fs;
+use SVN::Delta;
+
+setlocale(LC_ALL, "C");
my $repospath = tempdir('svn-perl-test-XXXXXX', TMPDIR => 1, CLEANUP => 1);
@@ -107,6 +112,26 @@ ok($main::something_destroyed, 'callback properly destroyed');
# TEST
cmp_ok($fs->youngest_rev, '==', 3);
+open my $dump_fh, ">", File::Spec->devnull or die "open file sink: $!";
+
+my $feedback;
+open my $feedback_fh, ">", \$feedback or die "open string: $!";
+
+my $cancel_cb_called = 0;
+$repos->dump_fs2($dump_fh, $feedback_fh,
+ 0, $SVN::Core::INVALID_REVNUM, # start_rev, end_rev
+ 0, 0, # incremental, deltify
+ sub { $cancel_cb_called++; 0 });
+# TEST
+ok($cancel_cb_called, 'cancel callback was called');
+# TEST
+is($feedback, <<'...', 'dump feedback');
+* Dumped revision 0.
+* Dumped revision 1.
+* Dumped revision 2.
+* Dumped revision 3.
+...
+
END {
diag "cleanup";
rmtree($repospath);
diff --git a/subversion/bindings/swig/perl/native/t/3client.t b/subversion/bindings/swig/perl/native/t/3client.t
index 4a97f38..5d5c64f 100644
--- a/subversion/bindings/swig/perl/native/t/3client.t
+++ b/subversion/bindings/swig/perl/native/t/3client.t
@@ -20,7 +20,7 @@
#
#
-use Test::More tests => 297;
+use Test::More tests => 302;
use strict;
# shut up about variables that are only used once.
@@ -1119,6 +1119,45 @@ isa_ok($ph2,'HASH','propget returns HASH');
is(scalar(keys %$ph2),0,
'No properties after deleting a property');
+# test cancel callback
+my $cancel_cb_called = 0;
+$ctx->cancel(sub { $cancel_cb_called++; 0 });
+my $log_entries_received = 0;
+$ctx->log5($reposurl,
+ 'HEAD',['HEAD',1],0, # peg rev, rev ranges, limit
+ 1,1,0, # discover_changed_paths, strict_node_history, include_merged_revisions
+ undef, # revprops
+ sub { $log_entries_received++ });
+# TEST
+ok($cancel_cb_called, 'cancel callback was called');
+# TEST
+is($log_entries_received, $current_rev, 'log entries received');
+
+my $cancel_msg = "stop the presses";
+$ctx->cancel(sub { $cancel_msg });
+$svn_error = $ctx->log5($reposurl,
+ 'HEAD',['HEAD',1],0, # peg rev, rev ranges, limit
+ 1,1,0, # discover_changed_paths, strict_node_history, include_merged_revisions
+ undef, # revprops
+ sub { });
+# TEST
+isa_ok($svn_error, '_p_svn_error_t', 'return of a cancelled operation');
+# TEST
+is($svn_error->apr_err, $SVN::Error::CANCELLED, "SVN_ERR_CANCELLED");
+{
+ # If we're running a debug build, $svn_error may be the top of a
+ # chain of svn_error_t's (all with message "traced call"), we need
+ # to get to the bottom svn_error_t to check for the original message.
+ my $chained = $svn_error;
+ $chained = $chained->child while $chained->child;
+ # TEST
+ is($chained->message, $cancel_msg, 'cancellation message');
+}
+
+$svn_error->clear(); # don't leak this
+$ctx->cancel(undef); # reset cancel callback
+
+
SKIP: {
# This is ugly. It is included here as an aide to understand how
# to test this and because it makes my life easier as I only have
@@ -1236,7 +1275,7 @@ SKIP: {
my $result = SVN::Core::auth_set_gnome_keyring_unlock_prompt_func(
$ctx->auth(), $callback);
# TEST
- is(${$result}, $callback, 'auth_set_gnome_keyring_unlock_prompt_func result equals paramter');
+ is(${$result}, $callback, 'auth_set_gnome_keyring_unlock_prompt_func result equals parameter');
}
END {
diff --git a/subversion/bindings/swig/perl/native/t/6ra.t b/subversion/bindings/swig/perl/native/t/6ra.t
index 083ea86..26bbf55 100644
--- a/subversion/bindings/swig/perl/native/t/6ra.t
+++ b/subversion/bindings/swig/perl/native/t/6ra.t
@@ -202,12 +202,6 @@ is($ed->{trunk}{props}{'dir-prop'}, 'frob', 'replay: dir-prop');
is($ed->{'trunk/filea'}{props}{'binary-prop'}, $BINARY_DATA,
'replay: binary-prop');
-END {
-diag "cleanup";
-rmtree($repospath);
-}
-
-
package MockEditor;
sub new { bless {}, shift }
diff --git a/subversion/bindings/swig/proxy/pyrun.swg b/subversion/bindings/swig/proxy/pyrun.swg
index 3585e7a..b077fad 100644
--- a/subversion/bindings/swig/proxy/pyrun.swg
+++ b/subversion/bindings/swig/proxy/pyrun.swg
@@ -449,34 +449,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -668,7 +640,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -761,7 +733,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -779,7 +751,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -1156,10 +1128,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -1208,7 +1181,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -1243,6 +1216,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -1742,7 +1722,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -1765,7 +1745,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
diff --git a/subversion/bindings/swig/proxy/svn_client_h.swg b/subversion/bindings/swig/proxy/svn_client_h.swg
index a11cccc..2fe2715 100644
--- a/subversion/bindings/swig/proxy/svn_client_h.swg
+++ b/subversion/bindings/swig/proxy/svn_client_h.swg
@@ -60,6 +60,7 @@
void *log_msg_baton3,
void *conflict_baton,
void *conflict_baton2,
+ void *tunnel_baton,
void *commit_baton,
void *filter_baton,
void *backwards_compatibility_baton,
diff --git a/subversion/bindings/swig/proxy/svn_config_h.swg b/subversion/bindings/swig/proxy/svn_config_h.swg
index 7b4b50f..63db12a 100644
--- a/subversion/bindings/swig/proxy/svn_config_h.swg
+++ b/subversion/bindings/swig/proxy/svn_config_h.swg
@@ -29,7 +29,6 @@
#ifdef SWIGPYTHON
%apply void *PY_AS_VOID {
void *baton,
- void *cleanup_baton,
void *walk_baton
};
#endif
@@ -69,8 +68,8 @@ static svn_boolean_t svn_config_invoke_enumerator2(
}
static svn_error_t * svn_config_invoke_auth_walk_func(
- svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *cleanup_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
- return _obj(delete_cred, cleanup_baton, cred_kind, realmstring, hash, scratch_pool);
+ svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *walk_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
+ return _obj(delete_cred, walk_baton, cred_kind, realmstring, hash, scratch_pool);
}
%}
diff --git a/subversion/bindings/swig/proxy/svn_diff_h.swg b/subversion/bindings/swig/proxy/svn_diff_h.swg
index f4eab90..dc80678 100644
--- a/subversion/bindings/swig/proxy/svn_diff_h.swg
+++ b/subversion/bindings/swig/proxy/svn_diff_h.swg
@@ -15,7 +15,8 @@
#ifdef SWIGPYTHON
%apply void *PY_AS_VOID {
void *diff_baton,
- void *output_baton
+ void *output_baton,
+ void *cancel_baton
};
#endif
diff --git a/subversion/bindings/swig/proxy/svn_fs_h.swg b/subversion/bindings/swig/proxy/svn_fs_h.swg
index 0775f98..effabf8 100644
--- a/subversion/bindings/swig/proxy/svn_fs_h.swg
+++ b/subversion/bindings/swig/proxy/svn_fs_h.swg
@@ -10,23 +10,30 @@
%nodefault svn_fs_txn_t;
%nodefault svn_fs_root_t;
%nodefault svn_fs_history_t;
+%nodefault svn_fs_lock_target_t;
#endif
/* Callback typemaps */
#ifdef SWIGPYTHON
%apply CALLABLE_CALLBACK {
svn_fs_warning_callback_t,
+ svn_fs_upgrade_notify_t,
svn_fs_progress_notify_func_t,
+ svn_fs_hotcopy_notify_t,
svn_fs_freeze_func_t,
svn_fs_process_contents_func_t,
+ svn_fs_lock_callback_t,
svn_fs_get_locks_callback_t,
svn_fs_pack_notify_t
};
%apply CALLABLE_CALLBACK * {
svn_fs_warning_callback_t *,
+ svn_fs_upgrade_notify_t *,
svn_fs_progress_notify_func_t *,
+ svn_fs_hotcopy_notify_t *,
svn_fs_freeze_func_t *,
svn_fs_process_contents_func_t *,
+ svn_fs_lock_callback_t *,
svn_fs_get_locks_callback_t *,
svn_fs_pack_notify_t *
};
@@ -37,10 +44,11 @@
%apply void *PY_AS_VOID {
void *baton,
void *warning_baton,
+ void *notify_baton,
void *cancel_baton,
void *freeze_baton,
- void *get_locks_baton,
- void *notify_baton
+ void *lock_baton,
+ void *get_locks_baton
};
#endif
@@ -61,6 +69,10 @@
%proxy(svn_fs_path_change_t);
%opaque_proxy(svn_fs_history_t);
%proxy(svn_fs_dirent_t);
+%opaque_proxy(svn_fs_lock_target_t);
+%proxy(svn_fs_fsfs_info_t);
+%proxy(svn_fs_fsx_info_t);
+%proxy(svn_fs_info_placeholder_t);
#endif
/* Callbacks */
@@ -71,11 +83,21 @@ static void svn_fs_invoke_warning_callback(
_obj(baton, err);
}
+static svn_error_t * svn_fs_invoke_upgrade_notify(
+ svn_fs_upgrade_notify_t _obj, void *baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action, apr_pool_t *scratch_pool) {
+ return _obj(baton, number, action, scratch_pool);
+}
+
static void svn_fs_invoke_progress_notify_func(
svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void *baton, apr_pool_t *pool) {
_obj(revision, baton, pool);
}
+static void svn_fs_invoke_hotcopy_notify(
+ svn_fs_hotcopy_notify_t _obj, void *baton, svn_revnum_t start_revision, svn_revnum_t end_revision, apr_pool_t *scratch_pool) {
+ _obj(baton, start_revision, end_revision, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_freeze_func(
svn_fs_freeze_func_t _obj, void *baton, apr_pool_t *pool) {
return _obj(baton, pool);
@@ -86,6 +108,11 @@ static svn_error_t * svn_fs_invoke_process_contents_func(
return _obj(contents, len, baton, scratch_pool);
}
+static svn_error_t * svn_fs_invoke_lock_callback(
+ svn_fs_lock_callback_t _obj, void *baton, const char *path, const svn_lock_t *lock, svn_error_t *fs_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, path, lock, fs_err, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_get_locks_callback(
svn_fs_get_locks_callback_t _obj, void *baton, svn_lock_t *lock, apr_pool_t *pool) {
return _obj(baton, lock, pool);
@@ -100,9 +127,12 @@ static svn_error_t * svn_fs_invoke_pack_notify(
#ifdef SWIGPYTHON
%funcptr_proxy(svn_fs_warning_callback_t, svn_fs_invoke_warning_callback);
+%funcptr_proxy(svn_fs_upgrade_notify_t, svn_fs_invoke_upgrade_notify);
%funcptr_proxy(svn_fs_progress_notify_func_t, svn_fs_invoke_progress_notify_func);
+%funcptr_proxy(svn_fs_hotcopy_notify_t, svn_fs_invoke_hotcopy_notify);
%funcptr_proxy(svn_fs_freeze_func_t, svn_fs_invoke_freeze_func);
%funcptr_proxy(svn_fs_process_contents_func_t, svn_fs_invoke_process_contents_func);
+%funcptr_proxy(svn_fs_lock_callback_t, svn_fs_invoke_lock_callback);
%funcptr_proxy(svn_fs_get_locks_callback_t, svn_fs_invoke_get_locks_callback);
%funcptr_proxy(svn_fs_pack_notify_t, svn_fs_invoke_pack_notify);
diff --git a/subversion/bindings/swig/proxy/svn_io_h.swg b/subversion/bindings/swig/proxy/svn_io_h.swg
index 961104c..1fc2a5a 100644
--- a/subversion/bindings/swig/proxy/svn_io_h.swg
+++ b/subversion/bindings/swig/proxy/svn_io_h.swg
@@ -17,6 +17,7 @@
svn_close_fn_t,
svn_stream_mark_fn_t,
svn_stream_seek_fn_t,
+ svn_stream_data_available_fn_t,
svn_stream_lazyopen_func_t,
svn_io_walk_func_t
};
@@ -27,6 +28,7 @@
svn_close_fn_t *,
svn_stream_mark_fn_t *,
svn_stream_seek_fn_t *,
+ svn_stream_data_available_fn_t *,
svn_stream_lazyopen_func_t *,
svn_io_walk_func_t *
};
@@ -89,6 +91,11 @@ static svn_error_t * svn_stream_invoke_seek_fn(
return _obj(baton, mark);
}
+static svn_error_t * svn_stream_invoke_data_available_fn(
+ svn_stream_data_available_fn_t _obj, void *baton, svn_boolean_t *data_available) {
+ return _obj(baton, data_available);
+}
+
static svn_error_t * svn_stream_invoke_lazyopen_func(
svn_stream_lazyopen_func_t _obj, svn_stream_t **stream, void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) {
return _obj(stream, baton, result_pool, scratch_pool);
@@ -108,6 +115,7 @@ static svn_error_t * svn_io_invoke_walk_func(
%funcptr_proxy(svn_close_fn_t, svn_close_invoke_fn);
%funcptr_proxy(svn_stream_mark_fn_t, svn_stream_invoke_mark_fn);
%funcptr_proxy(svn_stream_seek_fn_t, svn_stream_invoke_seek_fn);
+%funcptr_proxy(svn_stream_data_available_fn_t, svn_stream_invoke_data_available_fn);
%funcptr_proxy(svn_stream_lazyopen_func_t, svn_stream_invoke_lazyopen_func);
%funcptr_proxy(svn_io_walk_func_t, svn_io_invoke_walk_func);
diff --git a/subversion/bindings/swig/proxy/svn_ra_h.swg b/subversion/bindings/swig/proxy/svn_ra_h.swg
index f4dbd63..fdb59ce 100644
--- a/subversion/bindings/swig/proxy/svn_ra_h.swg
+++ b/subversion/bindings/swig/proxy/svn_ra_h.swg
@@ -22,6 +22,9 @@
svn_ra_progress_notify_func_t,
svn_ra_replay_revstart_callback_t,
svn_ra_replay_revfinish_callback_t,
+ svn_ra_check_tunnel_func_t,
+ svn_ra_close_tunnel_func_t,
+ svn_ra_open_tunnel_func_t,
svn_ra_init_func_t
};
%apply CALLABLE_CALLBACK * {
@@ -37,6 +40,9 @@
svn_ra_progress_notify_func_t *,
svn_ra_replay_revstart_callback_t *,
svn_ra_replay_revfinish_callback_t *,
+ svn_ra_check_tunnel_func_t *,
+ svn_ra_close_tunnel_func_t *,
+ svn_ra_open_tunnel_func_t *,
svn_ra_init_func_t *
};
#endif
@@ -48,6 +54,9 @@
void *session_baton,
void *replay_baton,
void *edit_baton,
+ void *tunnel_baton,
+ void *close_baton,
+ void *cancel_baton,
void *report_baton,
void *callback_baton,
void *progress_baton,
@@ -328,6 +337,21 @@ static svn_error_t * svn_ra_invoke_replay_revfinish_callback(
return _obj(revision, replay_baton, editor, edit_baton, rev_props, pool);
}
+static svn_boolean_t svn_ra_invoke_check_tunnel_func(
+ svn_ra_check_tunnel_func_t _obj, void *tunnel_baton, const char *tunnel_name) {
+ return _obj(tunnel_baton, tunnel_name);
+}
+
+static void svn_ra_invoke_close_tunnel_func(
+ svn_ra_close_tunnel_func_t _obj, void *close_baton, void *tunnel_baton) {
+ _obj(close_baton, tunnel_baton);
+}
+
+static svn_error_t * svn_ra_invoke_open_tunnel_func(
+ svn_ra_open_tunnel_func_t _obj, 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) {
+ return _obj(request, response, close_func, close_baton, tunnel_baton, tunnel_name, user, hostname, port, cancel_func, cancel_baton, pool);
+}
+
static svn_error_t * svn_ra_invoke_init_func(
svn_ra_init_func_t _obj, int abi_version, apr_pool_t *pool, apr_hash_t *hash) {
return _obj(abi_version, pool, hash);
@@ -385,6 +409,9 @@ static svn_error_t * svn_ra_invoke_init_func(
%funcptr_proxy(svn_ra_progress_notify_func_t, svn_ra_invoke_progress_notify_func);
%funcptr_proxy(svn_ra_replay_revstart_callback_t, svn_ra_invoke_replay_revstart_callback);
%funcptr_proxy(svn_ra_replay_revfinish_callback_t, svn_ra_invoke_replay_revfinish_callback);
+%funcptr_proxy(svn_ra_check_tunnel_func_t, svn_ra_invoke_check_tunnel_func);
+%funcptr_proxy(svn_ra_close_tunnel_func_t, svn_ra_invoke_close_tunnel_func);
+%funcptr_proxy(svn_ra_open_tunnel_func_t, svn_ra_invoke_open_tunnel_func);
%funcptr_proxy(svn_ra_init_func_t, svn_ra_invoke_init_func);
#endif
diff --git a/subversion/bindings/swig/proxy/svn_repos_h.swg b/subversion/bindings/swig/proxy/svn_repos_h.swg
index 22aea45..067eb55 100644
--- a/subversion/bindings/swig/proxy/svn_repos_h.swg
+++ b/subversion/bindings/swig/proxy/svn_repos_h.swg
@@ -13,18 +13,20 @@
%apply CALLABLE_CALLBACK {
svn_repos_authz_func_t,
svn_repos_authz_callback_t,
- svn_repos_file_rev_handler_t,
svn_repos_notify_func_t,
svn_repos_freeze_func_t,
- svn_repos_history_func_t
+ svn_repos_history_func_t,
+ svn_repos_file_rev_handler_t,
+ svn_repos_verify_callback_t
};
%apply CALLABLE_CALLBACK * {
svn_repos_authz_func_t *,
svn_repos_authz_callback_t *,
- svn_repos_file_rev_handler_t *,
svn_repos_notify_func_t *,
svn_repos_freeze_func_t *,
- svn_repos_history_func_t *
+ svn_repos_history_func_t *,
+ svn_repos_file_rev_handler_t *,
+ svn_repos_verify_callback_t *
};
#endif
@@ -45,6 +47,8 @@
void *history_baton,
void *receiver_baton,
void *handler_baton,
+ void *lock_baton,
+ void *verify_baton,
void *parse_baton,
void *revision_baton,
void *node_baton
@@ -196,11 +200,6 @@ static svn_error_t * svn_repos_invoke_authz_callback(
return _obj(required, allowed, root, path, baton, pool);
}
-static svn_error_t * svn_repos_invoke_file_rev_handler(
- svn_repos_file_rev_handler_t _obj, 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) {
- return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
-}
-
static void svn_repos_invoke_notify_func(
svn_repos_notify_func_t _obj, void *baton, const svn_repos_notify_t *notify, apr_pool_t *scratch_pool) {
_obj(baton, notify, scratch_pool);
@@ -216,6 +215,16 @@ static svn_error_t * svn_repos_invoke_history_func(
return _obj(baton, path, revision, pool);
}
+static svn_error_t * svn_repos_invoke_file_rev_handler(
+ svn_repos_file_rev_handler_t _obj, 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) {
+ return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
+}
+
+static svn_error_t * svn_repos_invoke_verify_callback(
+ svn_repos_verify_callback_t _obj, void *baton, svn_revnum_t revision, svn_error_t *verify_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, revision, verify_err, scratch_pool);
+}
+
%}
#ifdef SWIGPYTHON
@@ -244,9 +253,10 @@ static svn_error_t * svn_repos_invoke_history_func(
%funcptr_member_proxy(svn_repos_parse_fns2_t, close_revision, svn_repos_parse_fns2_invoke_close_revision);
%funcptr_proxy(svn_repos_authz_func_t, svn_repos_invoke_authz_func);
%funcptr_proxy(svn_repos_authz_callback_t, svn_repos_invoke_authz_callback);
-%funcptr_proxy(svn_repos_file_rev_handler_t, svn_repos_invoke_file_rev_handler);
%funcptr_proxy(svn_repos_notify_func_t, svn_repos_invoke_notify_func);
%funcptr_proxy(svn_repos_freeze_func_t, svn_repos_invoke_freeze_func);
%funcptr_proxy(svn_repos_history_func_t, svn_repos_invoke_history_func);
+%funcptr_proxy(svn_repos_file_rev_handler_t, svn_repos_invoke_file_rev_handler);
+%funcptr_proxy(svn_repos_verify_callback_t, svn_repos_invoke_verify_callback);
#endif
diff --git a/subversion/bindings/swig/proxy/svn_sorts_h.swg b/subversion/bindings/swig/proxy/svn_sorts_h.swg
index d398b11..82aca37 100644
--- a/subversion/bindings/swig/proxy/svn_sorts_h.swg
+++ b/subversion/bindings/swig/proxy/svn_sorts_h.swg
@@ -4,6 +4,7 @@
/* No default constructors for opaque structs */
#ifdef SWIGPYTHON
+%nodefault svn_sort__item_t;
#endif
/* Callback typemaps */
@@ -18,7 +19,7 @@
/* Structure definitions */
#ifdef SWIGPYTHON
-%proxy(svn_sort__item_t);
+%opaque_proxy(svn_sort__item_t);
#endif
/* Callbacks */
diff --git a/subversion/bindings/swig/proxy/svn_x509_h.swg b/subversion/bindings/swig/proxy/svn_x509_h.swg
new file mode 100644
index 0000000..febe1fe
--- /dev/null
+++ b/subversion/bindings/swig/proxy/svn_x509_h.swg
@@ -0,0 +1,34 @@
+/* Proxy classes for svn_x509.h
+ * DO NOT EDIT -- AUTOMATICALLY GENERATED
+ * BY build/generator/swig/header_wrappers.py */
+
+/* No default constructors for opaque structs */
+#ifdef SWIGPYTHON
+%nodefault svn_x509_certinfo_t;
+%nodefault svn_x509_name_attr_t;
+#endif
+
+/* Callback typemaps */
+
+/* Baton typemaps */
+
+/* Includes */
+%{
+#include "svn_x509.h"
+%}
+%include svn_x509.h
+
+/* Structure definitions */
+#ifdef SWIGPYTHON
+%opaque_proxy(svn_x509_certinfo_t);
+%opaque_proxy(svn_x509_name_attr_t);
+#endif
+
+/* Callbacks */
+
+%inline %{
+%}
+
+#ifdef SWIGPYTHON
+
+#endif
diff --git a/subversion/bindings/swig/proxy/swig_perl_external_runtime.swg b/subversion/bindings/swig/proxy/swig_perl_external_runtime.swg
index 4822bae..f17c123 100644
--- a/subversion/bindings/swig/proxy/swig_perl_external_runtime.swg
+++ b/subversion/bindings/swig/proxy/swig_perl_external_runtime.swg
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
/* -----------------------------------------------------------------------------
@@ -39,28 +39,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -103,7 +103,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -117,18 +117,18 @@
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -156,7 +156,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -182,16 +182,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -224,23 +224,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -254,17 +254,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -295,14 +295,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -346,7 +346,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -366,18 +366,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -385,24 +385,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -430,7 +419,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -465,7 +454,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -509,7 +498,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -517,14 +506,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -533,18 +522,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -553,11 +542,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -582,14 +571,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -608,12 +597,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -629,7 +618,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -643,21 +632,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
diff --git a/subversion/bindings/swig/proxy/swig_python_external_runtime.swg b/subversion/bindings/swig/proxy/swig_python_external_runtime.swg
index 23ee4fb..b0cf143 100644
--- a/subversion/bindings/swig/proxy/swig_python_external_runtime.swg
+++ b/subversion/bindings/swig/proxy/swig_python_external_runtime.swg
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
/* -----------------------------------------------------------------------------
@@ -39,28 +39,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -103,7 +103,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -117,18 +117,18 @@
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -156,7 +156,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -182,16 +182,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -224,23 +224,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -254,17 +254,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -295,14 +295,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -346,7 +346,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -366,18 +366,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -385,24 +385,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -430,7 +419,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -465,7 +454,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -509,7 +498,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -517,14 +506,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -533,18 +522,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -553,11 +542,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -582,14 +571,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -608,12 +597,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -629,7 +618,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -643,21 +632,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -1567,34 +1556,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1786,7 +1747,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1879,7 +1840,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1897,7 +1858,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2274,10 +2235,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2326,7 +2288,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2361,6 +2323,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2860,7 +2829,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2883,7 +2852,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
diff --git a/subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg b/subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg
index 1bb5159..787f2ad 100644
--- a/subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg
+++ b/subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
/* -----------------------------------------------------------------------------
@@ -39,28 +39,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -103,7 +103,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -117,18 +117,18 @@
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -156,7 +156,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -182,16 +182,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -224,23 +224,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -254,17 +254,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -295,14 +295,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -346,7 +346,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -366,18 +366,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -385,24 +385,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -430,7 +419,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -465,7 +454,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -509,7 +498,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -517,14 +506,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -533,18 +522,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -553,11 +542,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -582,14 +571,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -608,12 +597,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -629,7 +618,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -643,21 +632,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -1632,7 +1621,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1645,7 +1634,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
diff --git a/subversion/bindings/swig/proxy/swigrun.swg b/subversion/bindings/swig/proxy/swigrun.swg
index e5afb62..7066e67 100644
--- a/subversion/bindings/swig/proxy/swigrun.swg
+++ b/subversion/bindings/swig/proxy/swigrun.swg
@@ -22,7 +22,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -48,16 +48,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -90,23 +90,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -120,17 +120,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -161,14 +161,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -212,7 +212,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -232,18 +232,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -251,24 +251,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -296,7 +285,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -331,7 +320,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -375,7 +364,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -383,14 +372,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -399,18 +388,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -419,11 +408,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -448,14 +437,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -474,12 +463,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -495,7 +484,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -509,21 +498,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
diff --git a/subversion/bindings/swig/python/client.py b/subversion/bindings/swig/python/client.py
index c62d460..065247c 100644
--- a/subversion/bindings/swig/python/client.py
+++ b/subversion/bindings/swig/python/client.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -150,7 +152,7 @@ class svn_client_commit_info_t:
__swig_setmethods__["author"] = _client.svn_client_commit_info_t_author_set
__swig_getmethods__["author"] = _client.svn_client_commit_info_t_author_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_commit_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -169,13 +171,13 @@ class svn_client_commit_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -184,9 +186,9 @@ class svn_client_commit_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -238,7 +240,7 @@ class svn_client_commit_item3_t:
__swig_setmethods__["moved_from_abspath"] = _client.svn_client_commit_item3_t_moved_from_abspath_set
__swig_getmethods__["moved_from_abspath"] = _client.svn_client_commit_item3_t_moved_from_abspath_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_commit_item3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -257,13 +259,13 @@ class svn_client_commit_item3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -272,9 +274,9 @@ class svn_client_commit_item3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -313,7 +315,7 @@ class svn_client_commit_item2_t:
__swig_setmethods__["wcprop_changes"] = _client.svn_client_commit_item2_t_wcprop_changes_set
__swig_getmethods__["wcprop_changes"] = _client.svn_client_commit_item2_t_wcprop_changes_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_commit_item2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -332,13 +334,13 @@ class svn_client_commit_item2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -347,9 +349,9 @@ class svn_client_commit_item2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -386,7 +388,7 @@ class svn_client_commit_item_t:
__swig_setmethods__["wcprop_changes"] = _client.svn_client_commit_item_t_wcprop_changes_set
__swig_getmethods__["wcprop_changes"] = _client.svn_client_commit_item_t_wcprop_changes_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_commit_item_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -405,13 +407,13 @@ class svn_client_commit_item_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -420,9 +422,9 @@ class svn_client_commit_item_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -473,7 +475,7 @@ class svn_client_diff_summarize_t:
__swig_setmethods__["node_kind"] = _client.svn_client_diff_summarize_t_node_kind_set
__swig_getmethods__["node_kind"] = _client.svn_client_diff_summarize_t_node_kind_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_diff_summarize_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -492,13 +494,13 @@ class svn_client_diff_summarize_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -507,9 +509,9 @@ class svn_client_diff_summarize_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -581,8 +583,14 @@ class svn_client_ctx_t:
__swig_getmethods__["conflict_baton2"] = _client.svn_client_ctx_t_conflict_baton2_get
__swig_setmethods__["wc_ctx"] = _client.svn_client_ctx_t_wc_ctx_set
__swig_getmethods__["wc_ctx"] = _client.svn_client_ctx_t_wc_ctx_get
+ __swig_setmethods__["check_tunnel_func"] = _client.svn_client_ctx_t_check_tunnel_func_set
+ __swig_getmethods__["check_tunnel_func"] = _client.svn_client_ctx_t_check_tunnel_func_get
+ __swig_setmethods__["open_tunnel_func"] = _client.svn_client_ctx_t_open_tunnel_func_set
+ __swig_getmethods__["open_tunnel_func"] = _client.svn_client_ctx_t_open_tunnel_func_get
+ __swig_setmethods__["tunnel_baton"] = _client.svn_client_ctx_t_tunnel_baton_set
+ __swig_getmethods__["tunnel_baton"] = _client.svn_client_ctx_t_tunnel_baton_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_ctx_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -601,13 +609,13 @@ class svn_client_ctx_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -616,9 +624,9 @@ class svn_client_ctx_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -970,7 +978,7 @@ class svn_client_status_t:
__swig_setmethods__["moved_to_abspath"] = _client.svn_client_status_t_moved_to_abspath_set
__swig_getmethods__["moved_to_abspath"] = _client.svn_client_status_t_moved_to_abspath_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_status_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -989,13 +997,13 @@ class svn_client_status_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1004,9 +1012,9 @@ class svn_client_status_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1026,6 +1034,16 @@ def svn_client_status_dup(*args):
"""svn_client_status_dup(svn_client_status_t status, apr_pool_t result_pool) -> svn_client_status_t"""
return _client.svn_client_status_dup(*args)
+def svn_client_status6(*args):
+ """
+ svn_client_status6(svn_client_ctx_t ctx, char const * path, 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, apr_array_header_t changelists, svn_client_status_func_t status_func,
+ void * status_baton, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _client.svn_client_status6(*args)
+
def svn_client_status5(*args):
"""
svn_client_status5(svn_client_ctx_t ctx, char const * path, svn_opt_revision_t revision, svn_depth_t depth,
@@ -1491,6 +1509,22 @@ def svn_client_mergeinfo_log_eligible(*args):
"""
return _client.svn_client_mergeinfo_log_eligible(*args)
+def svn_client_vacuum(*args):
+ """
+ svn_client_vacuum(char const * 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) -> svn_error_t
+ """
+ return _client.svn_client_vacuum(*args)
+
+def svn_client_cleanup2(*args):
+ """
+ svn_client_cleanup2(char const * 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) -> svn_error_t
+ """
+ return _client.svn_client_cleanup2(*args)
+
def svn_client_cleanup(*args):
"""svn_client_cleanup(char const * dir, svn_client_ctx_t ctx, apr_pool_t scratch_pool) -> svn_error_t"""
return _client.svn_client_cleanup(*args)
@@ -1513,6 +1547,14 @@ def svn_client_relocate(*args):
"""
return _client.svn_client_relocate(*args)
+def svn_client_revert3(*args):
+ """
+ svn_client_revert3(apr_array_header_t paths, svn_depth_t depth, apr_array_header_t changelists, svn_boolean_t clear_changelists,
+ svn_boolean_t metadata_only, svn_client_ctx_t ctx,
+ apr_pool_t pool) -> svn_error_t
+ """
+ return _client.svn_client_revert3(*args)
+
def svn_client_revert2(*args):
"""
svn_client_revert2(apr_array_header_t paths, svn_depth_t depth, apr_array_header_t changelists, svn_client_ctx_t ctx,
@@ -1548,7 +1590,7 @@ class svn_client_copy_source_t:
__swig_setmethods__["peg_revision"] = _client.svn_client_copy_source_t_peg_revision_set
__swig_getmethods__["peg_revision"] = _client.svn_client_copy_source_t_peg_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_copy_source_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1567,13 +1609,13 @@ class svn_client_copy_source_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1582,9 +1624,9 @@ class svn_client_copy_source_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1600,6 +1642,16 @@ svn_client_copy_source_t_swigregister = _client.svn_client_copy_source_t_swigreg
svn_client_copy_source_t_swigregister(svn_client_copy_source_t)
+def svn_client_copy7(*args):
+ """
+ svn_client_copy7(apr_array_header_t sources, char const * 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, apr_hash_t externals_to_pin, apr_hash_t revprop_table,
+ svn_commit_callback2_t commit_callback, svn_client_ctx_t ctx,
+ apr_pool_t pool) -> svn_error_t
+ """
+ return _client.svn_client_copy7(*args)
+
def svn_client_copy6(*args):
"""
svn_client_copy6(apr_array_header_t sources, char const * dst_path, svn_boolean_t copy_as_child, svn_boolean_t make_parents,
@@ -1921,6 +1973,14 @@ def svn_client_ls(*args):
"""
return _client.svn_client_ls(*args)
+def svn_client_cat3(*args):
+ """
+ svn_client_cat3(svn_stream_t * out, char const * path_or_url, svn_opt_revision_t peg_revision, 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) -> svn_error_t
+ """
+ return _client.svn_client_cat3(*args)
+
def svn_client_cat2(*args):
"""
svn_client_cat2(svn_stream_t * out, char const * path_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision,
@@ -2028,7 +2088,7 @@ class svn_info_t:
__swig_setmethods__["tree_conflict"] = _client.svn_info_t_tree_conflict_set
__swig_getmethods__["tree_conflict"] = _client.svn_info_t_tree_conflict_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2047,13 +2107,13 @@ class svn_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2062,9 +2122,9 @@ class svn_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2113,7 +2173,7 @@ class svn_client_info2_t:
__swig_setmethods__["wc_info"] = _client.svn_client_info2_t_wc_info_set
__swig_getmethods__["wc_info"] = _client.svn_client_info2_t_wc_info_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_info2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2132,13 +2192,13 @@ class svn_client_info2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2147,9 +2207,9 @@ class svn_client_info2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2169,6 +2229,16 @@ def svn_client_info2_dup(*args):
"""svn_client_info2_dup(svn_client_info2_t info, apr_pool_t pool) -> svn_client_info2_t"""
return _client.svn_client_info2_dup(*args)
+def svn_client_info4(*args):
+ """
+ svn_client_info4(char const * abspath_or_url, svn_opt_revision_t peg_revision, 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, apr_array_header_t changelists,
+ svn_client_info_receiver2_t receiver, void * receiver_baton, svn_client_ctx_t ctx,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _client.svn_client_info4(*args)
+
def svn_client_info3(*args):
"""
svn_client_info3(char const * abspath_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision,
@@ -2372,7 +2442,7 @@ class svn_proplist_receiver2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_proplist_receiver2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2391,13 +2461,13 @@ class svn_proplist_receiver2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2406,9 +2476,9 @@ class svn_proplist_receiver2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2428,7 +2498,7 @@ class svn_proplist_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_proplist_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2447,13 +2517,13 @@ class svn_proplist_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2462,9 +2532,9 @@ class svn_proplist_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2484,7 +2554,7 @@ class svn_client_get_commit_log3_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_get_commit_log3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2503,13 +2573,13 @@ class svn_client_get_commit_log3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2518,9 +2588,9 @@ class svn_client_get_commit_log3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2540,7 +2610,7 @@ class svn_client_get_commit_log2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_get_commit_log2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2559,13 +2629,13 @@ class svn_client_get_commit_log2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2574,9 +2644,9 @@ class svn_client_get_commit_log2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2596,7 +2666,7 @@ class svn_client_get_commit_log_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_get_commit_log_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2615,13 +2685,13 @@ class svn_client_get_commit_log_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2630,9 +2700,9 @@ class svn_client_get_commit_log_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2652,7 +2722,7 @@ class svn_client_blame_receiver3_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_blame_receiver3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2671,13 +2741,13 @@ class svn_client_blame_receiver3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2686,9 +2756,9 @@ class svn_client_blame_receiver3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2708,7 +2778,7 @@ class svn_client_blame_receiver2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_blame_receiver2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2727,13 +2797,13 @@ class svn_client_blame_receiver2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2742,9 +2812,9 @@ class svn_client_blame_receiver2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2764,7 +2834,7 @@ class svn_client_blame_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_blame_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2783,13 +2853,13 @@ class svn_client_blame_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2798,9 +2868,9 @@ class svn_client_blame_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2820,7 +2890,7 @@ class svn_client_diff_summarize_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_diff_summarize_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2839,13 +2909,13 @@ class svn_client_diff_summarize_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2854,9 +2924,9 @@ class svn_client_diff_summarize_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2876,7 +2946,7 @@ class svn_client_import_filter_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_import_filter_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2895,13 +2965,13 @@ class svn_client_import_filter_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2910,9 +2980,9 @@ class svn_client_import_filter_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2932,7 +3002,7 @@ class svn_client_status_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_status_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2951,13 +3021,13 @@ class svn_client_status_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2966,9 +3036,9 @@ class svn_client_status_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2988,7 +3058,7 @@ class svn_client_list_func2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_list_func2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3007,13 +3077,13 @@ class svn_client_list_func2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3022,9 +3092,9 @@ class svn_client_list_func2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3044,7 +3114,7 @@ class svn_client_list_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_list_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3063,13 +3133,13 @@ class svn_client_list_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3078,9 +3148,9 @@ class svn_client_list_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3100,7 +3170,7 @@ class svn_info_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_info_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3119,13 +3189,13 @@ class svn_info_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3134,9 +3204,9 @@ class svn_info_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3156,7 +3226,7 @@ class svn_client_info_receiver2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_info_receiver2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3175,13 +3245,13 @@ class svn_client_info_receiver2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3190,9 +3260,9 @@ class svn_client_info_receiver2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3212,7 +3282,7 @@ class svn_client_patch_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_client_patch_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3231,13 +3301,13 @@ class svn_client_patch_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3246,9 +3316,9 @@ class svn_client_patch_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/python/core.c b/subversion/bindings/swig/python/core.c
index 8c95dbd..29e5fc1 100644
--- a/subversion/bindings/swig/python/core.c
+++ b/subversion/bindings/swig/python/core.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2948,30 +2922,30 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_apr_finfo_t swig_types[5]
#define SWIGTYPE_p_apr_getopt_option_t swig_types[6]
#define SWIGTYPE_p_apr_getopt_t swig_types[7]
-#define SWIGTYPE_p_apr_hash_index_t swig_types[8]
-#define SWIGTYPE_p_apr_hash_t swig_types[9]
-#define SWIGTYPE_p_apr_int32_t swig_types[10]
-#define SWIGTYPE_p_apr_int64_t swig_types[11]
-#define SWIGTYPE_p_apr_off_t swig_types[12]
-#define SWIGTYPE_p_apr_pool_t swig_types[13]
-#define SWIGTYPE_p_apr_proc_t swig_types[14]
-#define SWIGTYPE_p_apr_size_t swig_types[15]
-#define SWIGTYPE_p_char swig_types[16]
-#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[19]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[28]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[29]
-#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[30]
-#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[31]
+#define SWIGTYPE_p_apr_hash_t swig_types[8]
+#define SWIGTYPE_p_apr_int32_t swig_types[9]
+#define SWIGTYPE_p_apr_int64_t swig_types[10]
+#define SWIGTYPE_p_apr_off_t swig_types[11]
+#define SWIGTYPE_p_apr_pool_t swig_types[12]
+#define SWIGTYPE_p_apr_proc_t swig_types[13]
+#define SWIGTYPE_p_apr_size_t swig_types[14]
+#define SWIGTYPE_p_char swig_types[15]
+#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[18]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[27]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[28]
+#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[29]
+#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[30]
+#define SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int swig_types[31]
#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[32]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[33]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[34]
@@ -2985,113 +2959,117 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t swig_types[42]
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t swig_types[43]
#define SWIGTYPE_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t swig_types[44]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[45]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[46]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[47]
-#define SWIGTYPE_p_int swig_types[48]
-#define SWIGTYPE_p_long swig_types[49]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[50]
-#define SWIGTYPE_p_p_apr_file_t swig_types[51]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[52]
-#define SWIGTYPE_p_p_char swig_types[53]
-#define SWIGTYPE_p_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[54]
-#define SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[55]
-#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[56]
-#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[57]
-#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[58]
-#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[59]
-#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[60]
-#define SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[61]
-#define SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[62]
-#define SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[63]
-#define SWIGTYPE_p_p_f_p_q_const__char_p_void__int swig_types[64]
-#define SWIGTYPE_p_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[65]
-#define SWIGTYPE_p_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[66]
-#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[67]
-#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[68]
-#define SWIGTYPE_p_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[69]
-#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[70]
-#define SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t swig_types[71]
-#define SWIGTYPE_p_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[72]
-#define SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t swig_types[73]
-#define SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t swig_types[74]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t swig_types[75]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t swig_types[76]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t swig_types[77]
-#define SWIGTYPE_p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[78]
-#define SWIGTYPE_p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[79]
-#define SWIGTYPE_p_p_f_void__p_svn_version_t swig_types[80]
-#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[81]
-#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[82]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[83]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[84]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[85]
-#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[86]
-#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[87]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[88]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[89]
-#define SWIGTYPE_p_p_svn_config_t swig_types[90]
-#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[91]
-#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[92]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[93]
-#define SWIGTYPE_p_p_svn_string_t swig_types[94]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[95]
-#define SWIGTYPE_p_p_void swig_types[96]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[97]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[98]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[99]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[100]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[101]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[102]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[103]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[104]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[105]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[106]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[107]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[108]
-#define SWIGTYPE_p_svn_checksum_t swig_types[109]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[110]
-#define SWIGTYPE_p_svn_config_t swig_types[111]
-#define SWIGTYPE_p_svn_depth_t swig_types[112]
-#define SWIGTYPE_p_svn_dirent_t swig_types[113]
-#define SWIGTYPE_p_svn_errno_t swig_types[114]
-#define SWIGTYPE_p_svn_error_t swig_types[115]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[116]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[117]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[118]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[119]
-#define SWIGTYPE_p_svn_lock_t swig_types[120]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[121]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[122]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[123]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[124]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[125]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[126]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[127]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[128]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[129]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[130]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[131]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[132]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[133]
-#define SWIGTYPE_p_svn_prop_kind swig_types[134]
-#define SWIGTYPE_p_svn_prop_t swig_types[135]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[136]
-#define SWIGTYPE_p_svn_stream_t swig_types[137]
-#define SWIGTYPE_p_svn_string_t swig_types[138]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[139]
-#define SWIGTYPE_p_svn_tristate_t swig_types[140]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[141]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[142]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[143]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[144]
-#define SWIGTYPE_p_svn_version_t swig_types[145]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[146]
-#define SWIGTYPE_p_unsigned_char swig_types[147]
-#define SWIGTYPE_p_unsigned_long swig_types[148]
-#define SWIGTYPE_p_void swig_types[149]
-static swig_type_info *swig_types[151];
-static swig_module_info swig_module = {swig_types, 150, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t swig_types[45]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[46]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[47]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[48]
+#define SWIGTYPE_p_int swig_types[49]
+#define SWIGTYPE_p_long swig_types[50]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[51]
+#define SWIGTYPE_p_p_apr_file_t swig_types[52]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[53]
+#define SWIGTYPE_p_p_char swig_types[54]
+#define SWIGTYPE_p_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[56]
+#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[57]
+#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[58]
+#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[59]
+#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[60]
+#define SWIGTYPE_p_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[61]
+#define SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[62]
+#define SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[63]
+#define SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[64]
+#define SWIGTYPE_p_p_f_p_q_const__char_p_void__int swig_types[65]
+#define SWIGTYPE_p_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[66]
+#define SWIGTYPE_p_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[67]
+#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[68]
+#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[69]
+#define SWIGTYPE_p_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[70]
+#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[71]
+#define SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t swig_types[72]
+#define SWIGTYPE_p_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[73]
+#define SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t swig_types[74]
+#define SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t swig_types[75]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t swig_types[76]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t swig_types[77]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t swig_types[78]
+#define SWIGTYPE_p_p_f_p_void_p_svn_boolean_t__p_svn_error_t swig_types[79]
+#define SWIGTYPE_p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[80]
+#define SWIGTYPE_p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[81]
+#define SWIGTYPE_p_p_f_void__p_svn_version_t swig_types[82]
+#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[83]
+#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[84]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[85]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[86]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[87]
+#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[88]
+#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[89]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[90]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[91]
+#define SWIGTYPE_p_p_svn_config_t swig_types[92]
+#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[93]
+#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[94]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[95]
+#define SWIGTYPE_p_p_svn_string_t swig_types[96]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[97]
+#define SWIGTYPE_p_p_void swig_types[98]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[99]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[100]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[101]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[102]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[103]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[104]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[105]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[106]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[107]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[108]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[109]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[110]
+#define SWIGTYPE_p_svn_checksum_t swig_types[111]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[112]
+#define SWIGTYPE_p_svn_config_t swig_types[113]
+#define SWIGTYPE_p_svn_depth_t swig_types[114]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[115]
+#define SWIGTYPE_p_svn_dirent_t swig_types[116]
+#define SWIGTYPE_p_svn_errno_t swig_types[117]
+#define SWIGTYPE_p_svn_error_t swig_types[118]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[119]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[120]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[121]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[122]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[123]
+#define SWIGTYPE_p_svn_lock_t swig_types[124]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[125]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[126]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[127]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[128]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[129]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[130]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[131]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[132]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[133]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[134]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[135]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[136]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[137]
+#define SWIGTYPE_p_svn_prop_kind swig_types[138]
+#define SWIGTYPE_p_svn_prop_t swig_types[139]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[140]
+#define SWIGTYPE_p_svn_stream_t swig_types[141]
+#define SWIGTYPE_p_svn_string_t swig_types[142]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[143]
+#define SWIGTYPE_p_svn_tristate_t swig_types[144]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[145]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[146]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[147]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[148]
+#define SWIGTYPE_p_svn_version_t swig_types[149]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[150]
+#define SWIGTYPE_p_unsigned_char swig_types[151]
+#define SWIGTYPE_p_unsigned_long swig_types[152]
+#define SWIGTYPE_p_void swig_types[153]
+static swig_type_info *swig_types[155];
+static swig_module_info swig_module = {swig_types, 154, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3115,7 +3093,7 @@ static swig_module_info swig_module = {swig_types, 150, 0, 0, 0, 0};
#endif
#define SWIG_name "_core"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3617,6 +3595,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3753,8 +3743,8 @@ static svn_boolean_t svn_config_invoke_enumerator2(
}
static svn_error_t * svn_config_invoke_auth_walk_func(
- svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *cleanup_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
- return _obj(delete_cred, cleanup_baton, cred_kind, realmstring, hash, scratch_pool);
+ svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *walk_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
+ return _obj(delete_cred, walk_baton, cred_kind, realmstring, hash, scratch_pool);
}
@@ -3817,6 +3807,11 @@ static svn_error_t * svn_stream_invoke_seek_fn(
return _obj(baton, mark);
}
+static svn_error_t * svn_stream_invoke_data_available_fn(
+ svn_stream_data_available_fn_t _obj, void *baton, svn_boolean_t *data_available) {
+ return _obj(baton, data_available);
+}
+
static svn_error_t * svn_stream_invoke_lazyopen_func(
svn_stream_lazyopen_func_t _obj, svn_stream_t **stream, void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) {
return _obj(stream, baton, result_pool, scratch_pool);
@@ -4078,7 +4073,7 @@ SWIGINTERN PyObject *_wrap_apr_file_open_stdout(PyObject *SWIGUNUSEDPARM(self),
}
resultobj = SWIG_From_long((long)(result));
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -4129,7 +4124,7 @@ SWIGINTERN PyObject *_wrap_apr_file_open_stderr(PyObject *SWIGUNUSEDPARM(self),
}
resultobj = SWIG_From_long((long)(result));
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -4395,7 +4390,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_apr_err_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_error_t_apr_err_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4422,7 +4417,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_apr_err_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_apr_err_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4443,7 +4438,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_message_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_message_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4465,13 +4460,13 @@ SWIGINTERN PyObject *_wrap_svn_error_t_child_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_error_t_child_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (struct svn_error_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_error_t, svn_argnum_obj1);
+ arg2 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_error_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4492,13 +4487,13 @@ SWIGINTERN PyObject *_wrap_svn_error_t_child_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_child_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (struct svn_error_t *) ((arg1)->child);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_error_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4521,7 +4516,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_pool_set(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_error_t_pool_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4556,13 +4551,13 @@ SWIGINTERN PyObject *_wrap_svn_error_t_pool_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_pool_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_pool_t *) ((arg1)->pool);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_pool_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_pool_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4578,7 +4573,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_file_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4600,7 +4595,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_line_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_error_t_line_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4627,7 +4622,7 @@ SWIGINTERN PyObject *_wrap_svn_error_t_line_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_error_t_line_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4653,7 +4648,7 @@ SWIGINTERN PyObject *_wrap_new_svn_error_t(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_error_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4668,7 +4663,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_error_t(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_error_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_error_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
+ arg1 = (struct svn_error_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_error_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4695,92 +4690,6 @@ SWIGINTERN PyObject *svn_error_t_swigregister(PyObject *SWIGUNUSEDPARM(self), Py
return SWIG_Py_Void();
}
-SWIGINTERN PyObject *_wrap_svn__apr_hash_index_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- PyObject * obj0 = 0 ;
- void *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn__apr_hash_index_key",&obj0)) SWIG_fail;
- {
- arg1 = (apr_hash_index_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_index_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- result = (void *)svn__apr_hash_index_key((apr_hash_index_t const *)arg1);
-
- svn_swig_py_acquire_py_lock();
-
- }
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_void,
- _global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn__apr_hash_index_klen(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- PyObject * obj0 = 0 ;
- apr_ssize_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn__apr_hash_index_klen",&obj0)) SWIG_fail;
- {
- arg1 = (apr_hash_index_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_index_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- result = svn__apr_hash_index_klen((apr_hash_index_t const *)arg1);
-
- svn_swig_py_acquire_py_lock();
-
- }
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn__apr_hash_index_val(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- PyObject * obj0 = 0 ;
- void *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn__apr_hash_index_val",&obj0)) SWIG_fail;
- {
- arg1 = (apr_hash_index_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_index_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- result = (void *)svn__apr_hash_index_val((apr_hash_index_t const *)arg1);
-
- svn_swig_py_acquire_py_lock();
-
- }
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_void,
- _global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
SWIGINTERN PyObject *_wrap_svn_node_kind_to_word(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_node_kind_t arg1 ;
@@ -4994,7 +4903,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_kind_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_dirent_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5021,7 +4930,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_kind_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5043,7 +4952,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_size_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_dirent_t_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5065,7 +4974,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_size_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5087,7 +4996,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_has_props_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_dirent_t_has_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5114,7 +5023,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_has_props_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_has_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5136,7 +5045,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_created_rev_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_dirent_t_created_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5163,7 +5072,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_created_rev_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_created_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5185,7 +5094,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_time_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_dirent_t_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5207,7 +5116,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_time_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5228,7 +5137,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_t_last_author_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_dirent_t_last_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5254,7 +5163,7 @@ SWIGINTERN PyObject *_wrap_new_svn_dirent_t(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_dirent_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_dirent_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5269,7 +5178,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_dirent_t(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_dirent_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5312,7 +5221,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_dup(PyObject *SWIGUNUSEDPARM(self), PyObje
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_dirent_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
+ arg1 = (svn_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5333,7 +5242,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_dup(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_dirent_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_dirent_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5376,7 +5285,7 @@ SWIGINTERN PyObject *_wrap_svn_dirent_create(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_dirent_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_dirent_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5399,7 +5308,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_revision_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_commit_info_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5426,7 +5335,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_revision_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_commit_info_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5447,7 +5356,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_date_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"Os:svn_commit_info_t_date_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5475,7 +5384,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_date_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_commit_info_t_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5496,7 +5405,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_author_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"Os:svn_commit_info_t_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5524,7 +5433,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_author_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_commit_info_t_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5545,7 +5454,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_post_commit_err_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_commit_info_t_post_commit_err_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5573,7 +5482,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_post_commit_err_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_commit_info_t_post_commit_err_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5594,7 +5503,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_repos_root_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_commit_info_t_repos_root_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5622,7 +5531,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_t_repos_root_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_commit_info_t_repos_root_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5648,7 +5557,7 @@ SWIGINTERN PyObject *_wrap_new_svn_commit_info_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5663,7 +5572,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_commit_info_t(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_commit_info_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5719,7 +5628,7 @@ SWIGINTERN PyObject *_wrap_svn_create_commit_info(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5749,7 +5658,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_dup(PyObject *SWIGUNUSEDPARM(self), P
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_commit_info_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
+ arg1 = (svn_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5770,7 +5679,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_info_dup(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5792,7 +5701,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_action_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Oc:svn_log_changed_path2_t_action_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5813,7 +5722,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_action_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5834,7 +5743,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_copyfrom_path_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"Os:svn_log_changed_path2_t_copyfrom_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5862,7 +5771,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_copyfrom_path_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_copyfrom_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5884,7 +5793,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_copyfrom_rev_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_changed_path2_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5911,7 +5820,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_copyfrom_rev_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5933,7 +5842,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_node_kind_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_changed_path2_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5960,7 +5869,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_node_kind_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_node_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5982,7 +5891,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_text_modified_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_changed_path2_t_text_modified_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6009,7 +5918,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_text_modified_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_text_modified_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6031,7 +5940,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_props_modified_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_changed_path2_t_props_modified_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6058,7 +5967,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_t_props_modified_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path2_t_props_modified_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6084,7 +5993,7 @@ SWIGINTERN PyObject *_wrap_new_svn_log_changed_path2_t(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6099,7 +6008,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_log_changed_path2_t(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_log_changed_path2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6155,7 +6064,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_create(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6185,7 +6094,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_dup(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_log_changed_path2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_log_changed_path2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
+ arg1 = (svn_log_changed_path2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6206,7 +6115,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path2_dup(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_changed_path2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6228,7 +6137,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_t_action_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Oc:svn_log_changed_path_t_action_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6249,7 +6158,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_t_action_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6270,7 +6179,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_t_copyfrom_path_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path_t_copyfrom_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6292,7 +6201,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_t_copyfrom_rev_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_changed_path_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6319,7 +6228,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_t_copyfrom_rev_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_changed_path_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6345,7 +6254,7 @@ SWIGINTERN PyObject *_wrap_new_svn_log_changed_path_t(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_changed_path_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_changed_path_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6360,7 +6269,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_log_changed_path_t(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_log_changed_path_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6403,7 +6312,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_dup(PyObject *SWIGUNUSEDPARM(sel
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_log_changed_path_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_log_changed_path_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
+ arg1 = (svn_log_changed_path_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_changed_path_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6424,7 +6333,7 @@ SWIGINTERN PyObject *_wrap_svn_log_changed_path_dup(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_changed_path_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_changed_path_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6449,7 +6358,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_changed_paths_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_changed_paths_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6484,7 +6393,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_changed_paths_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_changed_paths_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6508,7 +6417,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_revision_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6535,7 +6444,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_revision_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6559,7 +6468,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_revprops_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_revprops_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6593,7 +6502,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_revprops_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_revprops_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6617,7 +6526,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_has_children_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_has_children_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6644,7 +6553,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_has_children_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_has_children_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6668,7 +6577,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_changed_paths2_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_changed_paths2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6703,7 +6612,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_changed_paths2_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_changed_paths2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6727,7 +6636,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_non_inheritable_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_non_inheritable_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6754,7 +6663,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_non_inheritable_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_non_inheritable_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6776,7 +6685,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_subtractive_merge_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_log_entry_t_subtractive_merge_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6803,7 +6712,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_t_subtractive_merge_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_log_entry_t_subtractive_merge_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6829,7 +6738,7 @@ SWIGINTERN PyObject *_wrap_new_svn_log_entry_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6844,7 +6753,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_log_entry_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_log_entry_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6900,7 +6809,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_create(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6930,7 +6839,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_dup(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_log_entry_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_log_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
+ arg1 = (svn_log_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6951,7 +6860,7 @@ SWIGINTERN PyObject *_wrap_svn_log_entry_dup(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_log_entry_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7047,7 +6956,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_path_set(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"Os:svn_lock_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7075,7 +6984,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_path_get(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7096,7 +7005,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_token_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"Os:svn_lock_t_token_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7124,7 +7033,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_token_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_token_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7145,7 +7054,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_owner_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"Os:svn_lock_t_owner_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7173,7 +7082,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_owner_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_owner_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7194,7 +7103,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_comment_set(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"Os:svn_lock_t_comment_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7222,7 +7131,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_comment_get(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_comment_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7244,7 +7153,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_is_dav_comment_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_lock_t_is_dav_comment_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7271,7 +7180,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_is_dav_comment_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_is_dav_comment_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7293,7 +7202,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_creation_date_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_lock_t_creation_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7315,7 +7224,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_creation_date_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_creation_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7337,7 +7246,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_expiration_date_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_lock_t_expiration_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7359,7 +7268,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_t_expiration_date_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_lock_t_expiration_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7385,7 +7294,7 @@ SWIGINTERN PyObject *_wrap_new_svn_lock_t(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7400,7 +7309,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_lock_t(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_lock_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (struct svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7456,7 +7365,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_create(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7486,7 +7395,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_lock_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_lock_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
+ arg1 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_lock_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7507,7 +7416,7 @@ SWIGINTERN PyObject *_wrap_svn_lock_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7572,7 +7481,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_start_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_merge_range_t_start_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7599,7 +7508,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_start_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_merge_range_t_start_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7621,7 +7530,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_end_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_merge_range_t_end_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7648,7 +7557,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_end_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_merge_range_t_end_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7670,7 +7579,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_inheritable_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_merge_range_t_inheritable_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7697,7 +7606,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_t_inheritable_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_merge_range_t_inheritable_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7723,7 +7632,7 @@ SWIGINTERN PyObject *_wrap_new_svn_merge_range_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7738,7 +7647,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_merge_range_t(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_merge_range_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7781,7 +7690,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_dup(PyObject *SWIGUNUSEDPARM(self), P
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_merge_range_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7802,7 +7711,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_dup(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7826,7 +7735,7 @@ SWIGINTERN PyObject *_wrap_svn_merge_range_contains_rev(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_merge_range_contains_rev",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_merge_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
+ arg1 = (svn_merge_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7861,7 +7770,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_range_start_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_location_segment_t_range_start_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7888,7 +7797,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_range_start_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_location_segment_t_range_start_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7910,7 +7819,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_range_end_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_location_segment_t_range_end_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7937,7 +7846,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_range_end_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_location_segment_t_range_end_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7958,7 +7867,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_path_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_location_segment_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7986,7 +7895,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_t_path_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_location_segment_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8012,7 +7921,7 @@ SWIGINTERN PyObject *_wrap_new_svn_location_segment_t(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_location_segment_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_location_segment_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8027,7 +7936,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_location_segment_t(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_location_segment_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (struct svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8070,7 +7979,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_dup(PyObject *SWIGUNUSEDPARM(sel
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_location_segment_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_location_segment_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
+ arg1 = (svn_location_segment_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8091,7 +8000,7 @@ SWIGINTERN PyObject *_wrap_svn_location_segment_dup(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_location_segment_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_location_segment_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -8133,7 +8042,7 @@ SWIGINTERN PyObject *_wrap_svn_log_invoke_entry_receiver(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_log_invoke_entry_receiver",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_log_entry_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8148,7 +8057,7 @@ SWIGINTERN PyObject *_wrap_svn_log_invoke_entry_receiver(PyObject *SWIGUNUSEDPAR
}
}
{
- arg3 = (svn_log_entry_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj2);
+ arg3 = (svn_log_entry_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_log_entry_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8218,7 +8127,7 @@ SWIGINTERN PyObject *_wrap_svn_log_invoke_message_receiver(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OOOOsss|O:svn_log_invoke_message_receiver",&obj0,&obj1,&obj2,&obj3,&arg5,&arg6,&arg7,&obj7)) SWIG_fail;
{
svn_log_message_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8312,14 +8221,14 @@ SWIGINTERN PyObject *_wrap_svn_commit_invoke_callback2(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_commit_invoke_callback2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_commit_callback2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg2 = (svn_commit_info_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj1);
+ arg2 = (svn_commit_info_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_commit_info_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8386,7 +8295,7 @@ SWIGINTERN PyObject *_wrap_svn_commit_invoke_callback(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOssO:svn_commit_invoke_callback",&obj0,&obj1,&arg3,&arg4,&obj4)) SWIG_fail;
{
svn_commit_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8442,7 +8351,7 @@ SWIGINTERN PyObject *_wrap_svn_cancel_invoke_func(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"OO:svn_cancel_invoke_func",&obj0,&obj1)) SWIG_fail;
{
svn_cancel_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8502,14 +8411,14 @@ SWIGINTERN PyObject *_wrap_svn_location_invoke_segment_receiver(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_location_invoke_segment_receiver",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_location_segment_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg2 = (svn_location_segment_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj1);
+ arg2 = (svn_location_segment_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_location_segment_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8631,7 +8540,7 @@ SWIGINTERN PyObject *_wrap_svn_pool_create(PyObject *SWIGUNUSEDPARM(self), PyObj
}
if (obj1) {
{
- arg2 = (apr_allocator_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_allocator_t, svn_argnum_obj1);
+ arg2 = (apr_allocator_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_allocator_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8645,7 +8554,7 @@ SWIGINTERN PyObject *_wrap_svn_pool_create(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_pool_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_pool_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -8680,7 +8589,7 @@ SWIGINTERN PyObject *_wrap_svn_pool_create_allocator(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_allocator_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_allocator_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8698,13 +8607,13 @@ SWIGINTERN PyObject *_wrap_svn_ver_compatible(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ver_compatible",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
+ arg1 = (svn_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_version_t, svn_argnum_obj1);
+ arg2 = (svn_version_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_version_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8734,13 +8643,13 @@ SWIGINTERN PyObject *_wrap_svn_ver_equal(PyObject *SWIGUNUSEDPARM(self), PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ver_equal",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
+ arg1 = (svn_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_version_t, svn_argnum_obj1);
+ arg2 = (svn_version_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_version_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8768,7 +8677,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_t_label_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_checklist_t_label_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8796,7 +8705,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_t_label_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_checklist_t_label_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8818,7 +8727,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_t_version_query_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_version_checklist_t_version_query_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8845,7 +8754,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_t_version_query_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_checklist_t_version_query_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8871,7 +8780,7 @@ SWIGINTERN PyObject *_wrap_new_svn_version_checklist_t(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_checklist_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_checklist_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8886,7 +8795,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_version_checklist_t(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_version_checklist_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8913,6 +8822,60 @@ SWIGINTERN PyObject *svn_version_checklist_t_swigregister(PyObject *SWIGUNUSEDPA
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *_wrap_svn_ver_check_list2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_version_t *arg1 = (svn_version_t *) 0 ;
+ svn_version_checklist_t *arg2 = (svn_version_checklist_t *) 0 ;
+ svn_boolean_t (*arg3)(svn_version_t const *,svn_version_t const *) = (svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OOO:svn_ver_check_list2",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg1 = (svn_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(obj2, (void**)(&arg3), SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), "in method '" "svn_ver_check_list2" "', argument " "3"" of type '" "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)""'");
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_ver_check_list2((struct svn_version_t const *)arg1,(struct svn_version_checklist_t const *)arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_ver_check_list(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_version_t *arg1 = (svn_version_t *) 0 ;
@@ -8923,13 +8886,13 @@ SWIGINTERN PyObject *_wrap_svn_ver_check_list(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ver_check_list",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
+ arg1 = (svn_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_version_checklist_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj1);
+ arg2 = (svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8972,7 +8935,7 @@ SWIGINTERN PyObject *_wrap_svn_subr_version(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9017,7 +8980,7 @@ SWIGINTERN PyObject *_wrap_svn_version_extended(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_extended_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_extended_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -9039,7 +9002,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_build_date(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_build_date",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9067,7 +9030,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_build_time(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_build_time",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9095,7 +9058,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_build_host(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_build_host",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9123,7 +9086,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_copyright(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_copyright",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9151,7 +9114,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_runtime_host(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_runtime_host",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9179,7 +9142,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_runtime_osname(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_runtime_osname",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9207,7 +9170,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_name_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_ext_linked_lib_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9235,7 +9198,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_name_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_linked_lib_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9256,7 +9219,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_compiled_version_set(PyO
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_ext_linked_lib_t_compiled_version_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9284,7 +9247,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_compiled_version_get(PyO
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_linked_lib_t_compiled_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9305,7 +9268,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_runtime_version_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_ext_linked_lib_t_runtime_version_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9333,7 +9296,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_lib_t_runtime_version_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_linked_lib_t_runtime_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9359,7 +9322,7 @@ SWIGINTERN PyObject *_wrap_new_svn_version_ext_linked_lib_t(PyObject *SWIGUNUSED
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_ext_linked_lib_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_ext_linked_lib_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9374,7 +9337,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_version_ext_linked_lib_t(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_version_ext_linked_lib_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_linked_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_linked_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9409,7 +9372,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_libs(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_linked_libs",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9422,7 +9385,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_linked_libs(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9438,7 +9401,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_lib_t_name_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_ext_loaded_lib_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9466,7 +9429,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_lib_t_name_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_loaded_lib_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9487,7 +9450,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_lib_t_version_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"Os:svn_version_ext_loaded_lib_t_version_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9515,7 +9478,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_lib_t_version_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_loaded_lib_t_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9541,7 +9504,7 @@ SWIGINTERN PyObject *_wrap_new_svn_version_ext_loaded_lib_t(PyObject *SWIGUNUSED
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_ext_loaded_lib_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_ext_loaded_lib_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9556,7 +9519,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_version_ext_loaded_lib_t(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_version_ext_loaded_lib_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
+ arg1 = (struct svn_version_ext_loaded_lib_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_ext_loaded_lib_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9591,7 +9554,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_libs(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_ext_loaded_libs",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_extended_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
+ arg1 = (svn_version_extended_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_extended_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9604,7 +9567,7 @@ SWIGINTERN PyObject *_wrap_svn_version_ext_loaded_libs(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9627,7 +9590,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_invoke_version_query(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_checklist_invoke_version_query",&obj0)) SWIG_fail;
{
- arg1 = (svn_version_checklist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
+ arg1 = (svn_version_checklist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_version_checklist_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9640,7 +9603,7 @@ SWIGINTERN PyObject *_wrap_svn_version_checklist_invoke_version_query(PyObject *
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9657,7 +9620,7 @@ SWIGINTERN PyObject *_wrap_svn_version_invoke_func(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_version_invoke_func",&obj0)) SWIG_fail;
{
svn_version_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_void__p_svn_version_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_void__p_svn_version_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -9671,7 +9634,7 @@ SWIGINTERN PyObject *_wrap_svn_version_invoke_func(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9702,7 +9665,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_prop_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_prop_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_t, svn_argnum_obj0);
+ arg1 = (svn_prop_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9723,7 +9686,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_prop_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_prop_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -9753,7 +9716,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_array_dup(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_prop_array_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9774,7 +9737,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_array_dup(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -9796,7 +9759,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_inherited_item_t_path_or_url_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"Os:svn_prop_inherited_item_t_path_or_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_prop_inherited_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_inherited_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9824,7 +9787,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_inherited_item_t_path_or_url_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_prop_inherited_item_t_path_or_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_inherited_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_inherited_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9846,13 +9809,13 @@ SWIGINTERN PyObject *_wrap_svn_prop_inherited_item_t_prop_hash_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_prop_inherited_item_t_prop_hash_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_prop_inherited_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_inherited_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9873,13 +9836,13 @@ SWIGINTERN PyObject *_wrap_svn_prop_inherited_item_t_prop_hash_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_prop_inherited_item_t_prop_hash_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_inherited_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_inherited_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_hash_t *) ((arg1)->prop_hash);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9900,7 +9863,7 @@ SWIGINTERN PyObject *_wrap_new_svn_prop_inherited_item_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_prop_inherited_item_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_prop_inherited_item_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9915,7 +9878,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_prop_inherited_item_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_prop_inherited_item_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_inherited_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_inherited_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_inherited_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9986,7 +9949,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_hash_to_array(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10016,7 +9979,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_array_to_hash(PyObject *SWIGUNUSEDPARM(self)
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_prop_array_to_hash",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10037,7 +10000,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_array_to_hash(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10095,7 +10058,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_hash_dup(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10118,7 +10081,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_get_value(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"Os:svn_prop_get_value",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (apr_hash_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg1 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10419,7 +10382,7 @@ SWIGINTERN PyObject *_wrap_svn_categorize_props(PyObject *SWIGUNUSEDPARM(self),
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_categorize_props",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10589,7 +10552,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_name_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_subcommand_desc2_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10617,7 +10580,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_name_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10639,7 +10602,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_cmd_func_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc2_t_cmd_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10666,7 +10629,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_cmd_func_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_cmd_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10688,13 +10651,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_aliases_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc2_t_aliases_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (char **)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
+ arg2 = (char **)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10722,13 +10685,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_aliases_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_aliases_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (char **)(char **) ((arg1)->aliases);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_p_char,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_p_char,
_global_py_pool, args);
return resultobj;
fail:
@@ -10744,7 +10707,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_help_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_subcommand_desc2_t_help_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10772,7 +10735,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_help_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_help_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10794,13 +10757,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_valid_options_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc2_t_valid_options_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (int *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_int, svn_argnum_obj1);
+ arg2 = (int *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_int, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10828,13 +10791,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_valid_options_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_valid_options_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (int *)(int *) ((arg1)->valid_options);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_int,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_int,
_global_py_pool, args);
return resultobj;
fail:
@@ -10850,13 +10813,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_desc_overrides_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_desc_overrides_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_subcommand_desc2_t_desc_overrides *)(svn_opt_subcommand_desc2_t_desc_overrides *) ((arg1)->desc_overrides);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides,
_global_py_pool, args);
return resultobj;
fail:
@@ -10877,7 +10840,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_subcommand_desc2_t(PyObject *SWIGUNUSEDPA
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -10892,7 +10855,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_subcommand_desc2_t(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_subcommand_desc2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10928,7 +10891,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_desc_overrides_optch_set(P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc2_t_desc_overrides_optch_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10955,7 +10918,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_desc_overrides_optch_get(P
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_desc_overrides_optch_get",&obj0)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10976,7 +10939,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_desc_overrides_desc_set(Py
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_subcommand_desc2_t_desc_overrides_desc_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11004,7 +10967,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc2_t_desc_overrides_desc_get(Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc2_t_desc_overrides_desc_get",&obj0)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11030,7 +10993,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_subcommand_desc2_t_desc_overrides(PyObjec
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides,
_global_py_pool, args);
return resultobj;
fail:
@@ -11045,7 +11008,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_subcommand_desc2_t_desc_overrides(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_subcommand_desc2_t_desc_overrides",&obj0)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t_desc_overrides *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11080,7 +11043,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_name_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_subcommand_desc_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11108,7 +11071,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_name_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11130,7 +11093,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_cmd_func_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc_t_cmd_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11157,7 +11120,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_cmd_func_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc_t_cmd_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11179,13 +11142,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_aliases_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc_t_aliases_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (char **)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
+ arg2 = (char **)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11213,13 +11176,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_aliases_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc_t_aliases_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (char **)(char **) ((arg1)->aliases);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_p_char,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_p_char,
_global_py_pool, args);
return resultobj;
fail:
@@ -11235,7 +11198,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_help_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_subcommand_desc_t_help_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11263,7 +11226,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_help_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc_t_help_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11285,13 +11248,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_valid_options_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_desc_t_valid_options_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (int *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_int, svn_argnum_obj1);
+ arg2 = (int *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_int, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11319,13 +11282,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_desc_t_valid_options_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_subcommand_desc_t_valid_options_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (int *)(int *) ((arg1)->valid_options);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_int,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_int,
_global_py_pool, args);
return resultobj;
fail:
@@ -11346,7 +11309,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_subcommand_desc_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11361,7 +11324,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_subcommand_desc_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_subcommand_desc_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11397,7 +11360,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_canonical_subcommand2(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_get_canonical_subcommand2",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11410,7 +11373,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_canonical_subcommand2(PyObject *SWIGUNUSE
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11427,7 +11390,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_canonical_subcommand(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_opt_get_canonical_subcommand",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11440,7 +11403,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_canonical_subcommand(PyObject *SWIGUNUSED
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_subcommand_desc_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11474,13 +11437,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_option_from_code2(PyObject *SWIGUNUSEDPAR
}
}
{
- arg2 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj1);
+ arg2 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj2);
+ arg3 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11501,7 +11464,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_option_from_code2(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_getopt_option_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_getopt_option_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -11531,7 +11494,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_option_from_code(PyObject *SWIGUNUSEDPARM
}
}
{
- arg2 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj1);
+ arg2 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11544,7 +11507,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_get_option_from_code(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_getopt_option_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_getopt_option_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11566,7 +11529,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_takes_option3(PyObject *SWIGUNUSED
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_takes_option3",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11608,7 +11571,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_takes_option2(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_takes_option2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11644,7 +11607,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_takes_option(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_subcommand_takes_option",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
+ arg1 = (svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11691,13 +11654,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_generic_help2(PyObject *SWIGUNUSEDPARM(
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOs|OO:svn_opt_print_generic_help2",&arg1,&obj1,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
+ arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
+ arg3 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11760,7 +11723,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_format_option(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_opt_format_option",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11835,13 +11798,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_help3(PyObject *SWIGUNUSEDPARM(sel
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_opt_subcommand_help3",&arg1,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
+ arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
+ arg3 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11899,13 +11862,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_help2(PyObject *SWIGUNUSEDPARM(sel
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_opt_subcommand_help2",&arg1,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
+ arg2 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
+ arg3 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11957,13 +11920,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_subcommand_help(PyObject *SWIGUNUSEDPARM(self
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_opt_subcommand_help",&arg1,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj1);
+ arg2 = (svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
+ arg3 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12006,7 +11969,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_value_t_number_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_value_t_number_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (union svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
+ arg1 = (union svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12033,7 +11996,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_value_t_number_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_value_t_number_get",&obj0)) SWIG_fail;
{
- arg1 = (union svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
+ arg1 = (union svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12055,7 +12018,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_value_t_date_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_value_t_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (union svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
+ arg1 = (union svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12077,7 +12040,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_value_t_date_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_value_t_date_get",&obj0)) SWIG_fail;
{
- arg1 = (union svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
+ arg1 = (union svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12103,7 +12066,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_revision_value_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_value_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_value_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12118,7 +12081,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_revision_value_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_revision_value_t",&obj0)) SWIG_fail;
{
- arg1 = (union svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
+ arg1 = (union svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12154,7 +12117,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_t_kind_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12181,7 +12144,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_t_kind_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12203,13 +12166,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_t_value_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_t_value_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_value_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_value_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_value_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12230,13 +12193,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_t_value_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_t_value_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_value_t *)& ((arg1)->value);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_value_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_value_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12257,7 +12220,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_revision_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12272,7 +12235,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_revision_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_revision_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12308,13 +12271,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_range_t_start_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_range_t_start_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12335,13 +12298,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_range_t_start_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_range_t_start_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->start);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12358,13 +12321,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_range_t_end_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_opt_revision_range_t_end_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12385,13 +12348,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_revision_range_t_end_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_opt_revision_range_t_end_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->end);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12412,7 +12375,7 @@ SWIGINTERN PyObject *_wrap_new_svn_opt_revision_range_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_range_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_range_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12427,7 +12390,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_opt_revision_range_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_opt_revision_range_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_opt_revision_range_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
+ arg1 = (struct svn_opt_revision_range_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_range_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12473,13 +12436,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_parse_revision(PyObject *SWIGUNUSEDPARM(self)
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_opt_parse_revision",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12530,7 +12493,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_parse_revision_to_range(PyObject *SWIGUNUSEDP
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_opt_parse_revision_to_range",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12586,13 +12549,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_resolve_revisions(PyObject *SWIGUNUSEDPARM(se
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_opt_resolve_revisions",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12669,13 +12632,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_args_to_target_array3(PyObject *SWIGUNUSEDPAR
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_opt_args_to_target_array3",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg3 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12743,13 +12706,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_args_to_target_array2(PyObject *SWIGUNUSEDPAR
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_opt_args_to_target_array2",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg3 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12870,7 +12833,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_push_implicit_dot_target(PyObject *SWIGUNUSED
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_opt_push_implicit_dot_target",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12925,7 +12888,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_parse_num_args(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_opt_parse_num_args",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12997,7 +12960,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_parse_all_args(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_opt_parse_all_args",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13064,7 +13027,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_parse_path(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_opt_parse_path",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
+ arg1 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13155,7 +13118,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help4(PyObject *SWIGUNUSEDPARM(self), P
arg10 = &temp10;
if (!PyArg_ParseTuple(args,(char *)"OsOOOssOOs|O:svn_opt_print_help4",&obj0,&arg2,&obj2,&obj3,&obj4,&arg6,&arg7,&obj7,&obj8,&arg11,&obj10)) SWIG_fail;
{
- arg1 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg1 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13179,13 +13142,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help4(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg8 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj7);
+ arg8 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg9 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj8);
+ arg9 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13267,7 +13230,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help3(PyObject *SWIGUNUSEDPARM(self), P
arg9 = &temp9;
if (!PyArg_ParseTuple(args,(char *)"OsOOssOOs|O:svn_opt_print_help3",&obj0,&arg2,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&arg10,&obj9)) SWIG_fail;
{
- arg1 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg1 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13285,13 +13248,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help3(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg7 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj6);
+ arg7 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
+ arg8 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13369,7 +13332,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help2(PyObject *SWIGUNUSEDPARM(self), P
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOssOOs|O:svn_opt_print_help2",&obj0,&arg2,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&arg9,&obj9)) SWIG_fail;
{
- arg1 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg1 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13387,13 +13350,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help2(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg7 = (svn_opt_subcommand_desc2_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj6);
+ arg7 = (svn_opt_subcommand_desc2_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc2_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
+ arg8 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13465,7 +13428,7 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help(PyObject *SWIGUNUSEDPARM(self), Py
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOssOOs|O:svn_opt_print_help",&obj0,&arg2,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&arg9,&obj9)) SWIG_fail;
{
- arg1 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg1 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13483,13 +13446,13 @@ SWIGINTERN PyObject *_wrap_svn_opt_print_help(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg7 = (svn_opt_subcommand_desc_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj6);
+ arg7 = (svn_opt_subcommand_desc_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_opt_subcommand_desc_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = (apr_getopt_option_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
+ arg8 = (apr_getopt_option_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_apr_getopt_option_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13563,6 +13526,141 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_cmdline_create_auth_baton2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
+ svn_boolean_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_config_t *arg12 = (svn_config_t *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_auth_baton_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ PyObject * obj12 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg15 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OzzzOOOOOOOO|O:svn_cmdline_create_auth_baton2",&obj0,&arg3,&arg4,&arg5,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
+ {
+ arg2 = (svn_boolean_t)SWIG_As_long (obj0);
+ if (SWIG_arg_fail(svn_argnum_obj0)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg9 = (svn_boolean_t)SWIG_As_long (obj7);
+ if (SWIG_arg_fail(svn_argnum_obj7)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (svn_boolean_t)SWIG_As_long (obj8);
+ if (SWIG_arg_fail(svn_argnum_obj8)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_boolean_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg12 = (svn_config_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_config_t, svn_argnum_obj10);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg14 = obj11;
+ }
+ if (obj12) {
+ /* Verify that the user supplied a valid pool */
+ if (obj12 != Py_None && obj12 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj12);
+ SWIG_arg_fail(svn_argnum_obj12);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_cmdline_create_auth_baton2(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_baton_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_cmdline_create_auth_baton(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
@@ -13612,14 +13710,14 @@ SWIGINTERN PyObject *_wrap_svn_cmdline_create_auth_baton(PyObject *SWIGUNUSEDPAR
}
}
{
- arg8 = (svn_config_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_config_t, svn_argnum_obj6);
+ arg8 = (svn_config_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_config_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj7; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -13649,7 +13747,7 @@ SWIGINTERN PyObject *_wrap_svn_cmdline_create_auth_baton(PyObject *SWIGUNUSEDPAR
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_baton_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_baton_t,
_global_py_pool, args))
;
@@ -13674,7 +13772,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_cred_kind_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_provider_t_cred_kind_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13702,7 +13800,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_cred_kind_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_t_cred_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13724,7 +13822,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_first_credentials_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_provider_t_first_credentials_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13751,7 +13849,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_first_credentials_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_t_first_credentials_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13773,7 +13871,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_next_credentials_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_provider_t_next_credentials_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13800,7 +13898,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_next_credentials_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_t_next_credentials_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13822,7 +13920,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_save_credentials_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_provider_t_save_credentials_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13849,7 +13947,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_t_save_credentials_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_t_save_credentials_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13875,7 +13973,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_provider_t(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_provider_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_provider_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -13890,7 +13988,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_provider_t(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_provider_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13926,13 +14024,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_object_t_vtable_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_provider_object_t_vtable_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_object_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_object_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_auth_provider_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj1);
+ arg2 = (svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13953,13 +14051,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_object_t_vtable_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_object_t_vtable_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_object_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_object_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_auth_provider_t *) ((arg1)->vtable);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_provider_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_provider_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -13976,7 +14074,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_object_t_provider_baton_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_provider_object_t_provider_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_object_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_object_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14005,7 +14103,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_object_t_provider_baton_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_provider_object_t_provider_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_object_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_object_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14030,7 +14128,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_object_t_provider_baton_get(PyObjec
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -14055,7 +14153,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_provider_object_t(PyObject *SWIGUNUSEDPA
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14070,7 +14168,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_provider_object_t(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_provider_object_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_provider_object_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_provider_object_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_object_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14105,7 +14203,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_username_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_auth_cred_simple_t_username_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14133,7 +14231,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_username_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_simple_t_username_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14154,7 +14252,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_password_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_auth_cred_simple_t_password_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14182,7 +14280,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_password_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_simple_t_password_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14204,7 +14302,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_may_save_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_simple_t_may_save_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14231,7 +14329,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_simple_t_may_save_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_simple_t_may_save_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14257,7 +14355,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_cred_simple_t(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_cred_simple_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_cred_simple_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14272,7 +14370,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_cred_simple_t(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_cred_simple_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_simple_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_simple_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_simple_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14307,7 +14405,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_username_t_username_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_auth_cred_username_t_username_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_username_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_username_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14335,7 +14433,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_username_t_username_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_username_t_username_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_username_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_username_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14357,7 +14455,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_username_t_may_save_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_username_t_may_save_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_username_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_username_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14384,7 +14482,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_username_t_may_save_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_username_t_may_save_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_username_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_username_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14410,7 +14508,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_cred_username_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_cred_username_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_cred_username_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14425,7 +14523,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_cred_username_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_cred_username_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_username_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_username_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_username_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14460,7 +14558,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_t_cert_file_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_cred_ssl_client_cert_t_cert_file_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14488,7 +14586,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_t_cert_file_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_client_cert_t_cert_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14510,7 +14608,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_t_may_save_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_ssl_client_cert_t_may_save_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14537,7 +14635,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_t_may_save_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_client_cert_t_may_save_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14563,7 +14661,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_cred_ssl_client_cert_t(PyObject *SWIGUNU
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14578,7 +14676,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_cred_ssl_client_cert_t(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_cred_ssl_client_cert_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14613,7 +14711,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_pw_t_password_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_auth_cred_ssl_client_cert_pw_t_password_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14641,7 +14739,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_pw_t_password_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_client_cert_pw_t_password_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14663,7 +14761,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_pw_t_may_save_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_ssl_client_cert_pw_t_may_save_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14690,7 +14788,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_client_cert_pw_t_may_save_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_client_cert_pw_t_may_save_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14716,7 +14814,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_cred_ssl_client_cert_pw_t(PyObject *SWIG
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14731,7 +14829,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_cred_ssl_client_cert_pw_t(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_cred_ssl_client_cert_pw_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_client_cert_pw_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14766,7 +14864,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_hostname_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_hostname_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14794,7 +14892,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_hostname_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_hostname_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14815,7 +14913,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_fingerprint_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_fingerprint_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14843,7 +14941,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_fingerprint_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_fingerprint_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14864,7 +14962,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_valid_from_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_valid_from_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14892,7 +14990,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_valid_from_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_valid_from_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14913,7 +15011,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_valid_until_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_valid_until_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14941,7 +15039,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_valid_until_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_valid_until_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14962,7 +15060,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_issuer_dname_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_issuer_dname_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14990,7 +15088,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_issuer_dname_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_issuer_dname_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15011,7 +15109,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_ascii_cert_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"Os:svn_auth_ssl_server_cert_info_t_ascii_cert_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15039,7 +15137,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_t_ascii_cert_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_ssl_server_cert_info_t_ascii_cert_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15065,7 +15163,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_ssl_server_cert_info_t(PyObject *SWIGUNU
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_ssl_server_cert_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_ssl_server_cert_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15080,7 +15178,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_ssl_server_cert_info_t(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_ssl_server_cert_info_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15123,7 +15221,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_dup(PyObject *SWIGUNUSE
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_ssl_server_cert_info_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
+ arg1 = (svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15144,7 +15242,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_ssl_server_cert_info_dup(PyObject *SWIGUNUSE
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_ssl_server_cert_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_ssl_server_cert_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -15167,7 +15265,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_server_trust_t_may_save_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_ssl_server_trust_t_may_save_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15194,7 +15292,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_server_trust_t_may_save_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_server_trust_t_may_save_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15216,7 +15314,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_server_trust_t_accepted_failures_se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_cred_ssl_server_trust_t_accepted_failures_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15243,7 +15341,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_cred_ssl_server_trust_t_accepted_failures_ge
if (!PyArg_ParseTuple(args,(char *)"O:svn_auth_cred_ssl_server_trust_t_accepted_failures_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15269,7 +15367,7 @@ SWIGINTERN PyObject *_wrap_new_svn_auth_cred_ssl_server_trust_t(PyObject *SWIGUN
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15284,7 +15382,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_auth_cred_ssl_server_trust_t(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_auth_cred_ssl_server_trust_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
+ arg1 = (struct svn_auth_cred_ssl_server_trust_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15355,7 +15453,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_open(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_baton_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_baton_t,
_global_py_pool, args))
;
@@ -15384,7 +15482,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_set_parameter(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"OsO:svn_auth_set_parameter",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
+ arg1 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15412,7 +15510,8 @@ SWIGINTERN PyObject *_wrap_svn_auth_set_parameter(PyObject *SWIGUNUSEDPARM(self)
else if (obj2 == Py_None) {
arg3 = NULL;
}
- else if (svn_swig_ConvertPtr(obj2, (void **)&arg3, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t) == 0) {
+ else if (svn_swig_py_convert_ptr(obj2, (void **)&arg3,
+ SWIGTYPE_p_svn_auth_ssl_server_cert_info_t) == 0) {
}
else {
@@ -15459,7 +15558,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_first_credentials(PyObject *SWIGUNUSEDPARM(s
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"ssO|O:svn_auth_first_credentials",&arg3,&arg4,&obj2,&obj3)) SWIG_fail;
{
- arg5 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj2);
+ arg5 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15492,13 +15591,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_first_credentials(PyObject *SWIGUNUSEDPARM(s
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_iterstate_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_iterstate_t,
_global_py_pool, args))
;
@@ -15534,7 +15633,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_next_credentials(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_next_credentials",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_auth_iterstate_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_iterstate_t, svn_argnum_obj0);
+ arg2 = (svn_auth_iterstate_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_iterstate_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15567,7 +15666,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_next_credentials(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15600,7 +15699,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_save_credentials(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_save_credentials",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_auth_iterstate_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_iterstate_t, svn_argnum_obj0);
+ arg1 = (svn_auth_iterstate_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_iterstate_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15662,7 +15761,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_forget_credentials(PyObject *SWIGUNUSEDPARM(
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Oss|O:svn_auth_forget_credentials",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
+ arg1 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15727,7 +15826,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_simple_prompt_provider(PyObject *SWIGUNU
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_simple_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_simple_prompt_func;
+ arg2 = (svn_auth_simple_prompt_func_t) svn_swig_py_auth_simple_prompt_func;
arg3 = obj0;
}
{
@@ -15754,7 +15853,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_simple_prompt_provider(PyObject *SWIGUNU
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -15792,7 +15891,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_username_prompt_provider(PyObject *SWIGU
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_username_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_username_prompt_func;
+ arg2 = (svn_auth_username_prompt_func_t) svn_swig_py_auth_username_prompt_func;
arg3 = obj0;
}
{
@@ -15819,7 +15918,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_username_prompt_provider(PyObject *SWIGU
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -15857,7 +15956,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_simple_provider2(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_simple_provider2",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_auth_plaintext_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -15889,7 +15988,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_simple_provider2(PyObject *SWIGUNUSEDPAR
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -15939,7 +16038,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_simple_provider(PyObject *SWIGUNUSEDPARM
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16002,7 +16101,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_platform_specific_provider(PyObject *SWI
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16038,7 +16137,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_platform_specific_client_providers(PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_get_platform_specific_client_providers",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg2 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16125,7 +16224,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_username_provider(PyObject *SWIGUNUSEDPA
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16175,7 +16274,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_server_trust_file_provider(PyObject
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16225,7 +16324,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_file_provider(PyObject *
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16263,7 +16362,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_pw_file_provider2(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_ssl_client_cert_pw_file_provider2",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_auth_plaintext_passphrase_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16295,7 +16394,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_pw_file_provider2(PyObje
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16345,7 +16444,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_pw_file_provider(PyObjec
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16381,7 +16480,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_server_trust_prompt_provider(PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_get_ssl_server_trust_prompt_provider",&obj0,&obj1)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_server_trust_prompt_func;
+ arg2 = (svn_auth_ssl_server_trust_prompt_func_t) svn_swig_py_auth_ssl_server_trust_prompt_func;
arg3 = obj0;
}
if (obj1) {
@@ -16402,7 +16501,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_server_trust_prompt_provider(PyObjec
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16440,7 +16539,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_prompt_provider(PyObject
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_ssl_client_cert_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_client_cert_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_prompt_func_t) svn_swig_py_auth_ssl_client_cert_prompt_func;
arg3 = obj0;
}
{
@@ -16467,7 +16566,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_prompt_provider(PyObject
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16505,7 +16604,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_pw_prompt_provider(PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_auth_get_ssl_client_cert_pw_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_client_cert_pw_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_pw_prompt_func_t) svn_swig_py_auth_ssl_client_cert_pw_prompt_func;
arg3 = obj0;
}
{
@@ -16532,7 +16631,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_get_ssl_client_cert_pw_prompt_provider(PyObj
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16590,7 +16689,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_first_credentials(PyObject *
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOOs|O:svn_auth_provider_invoke_first_credentials",&obj0,&obj1,&obj2,&arg6,&obj4)) SWIG_fail;
{
- arg1 = (svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16604,7 +16703,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_first_credentials(PyObject *
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_hash_t, svn_argnum_obj2);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_hash_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16637,13 +16736,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_first_credentials(PyObject *
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16686,7 +16785,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_next_credentials(PyObject *S
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOs|O:svn_auth_provider_invoke_next_credentials",&obj0,&obj1,&obj2,&obj3,&arg6,&obj5)) SWIG_fail;
{
- arg1 = (svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16708,7 +16807,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_next_credentials(PyObject *S
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16741,7 +16840,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_next_credentials(PyObject *S
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16785,13 +16884,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_save_credentials(PyObject *S
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOs|O:svn_auth_provider_invoke_save_credentials",&obj0,&obj1,&obj2,&obj3,&arg6,&obj5)) SWIG_fail;
{
- arg1 = (svn_auth_provider_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
+ arg1 = (svn_auth_provider_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_provider_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16805,7 +16904,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_provider_invoke_save_credentials(PyObject *S
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16874,7 +16973,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_simple_provider_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_invoke_simple_provider_func",&obj0,&obj1)) SWIG_fail;
{
svn_auth_simple_provider_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16898,7 +16997,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_simple_provider_func(PyObject *SWIGUN
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -16934,7 +17033,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_pw_provider_func(PyOb
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_auth_invoke_ssl_client_cert_pw_provider_func",&obj0,&obj1)) SWIG_fail;
{
svn_auth_ssl_client_cert_pw_provider_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16958,7 +17057,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_pw_provider_func(PyOb
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -17001,7 +17100,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_simple_prompt_func(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOszO|O:svn_auth_invoke_simple_prompt_func",&obj0,&obj1,&arg4,&arg5,&obj4,&obj5)) SWIG_fail;
{
svn_auth_simple_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17049,7 +17148,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_simple_prompt_func(PyObject *SWIGUNUS
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_cred_simple_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_cred_simple_t,
_global_py_pool, args))
;
@@ -17091,7 +17190,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_username_prompt_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_auth_invoke_username_prompt_func",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
svn_auth_username_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17139,7 +17238,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_username_prompt_func(PyObject *SWIGUN
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_cred_username_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_cred_username_t,
_global_py_pool, args))
;
@@ -17185,7 +17284,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_server_trust_prompt_func(PyObject
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_auth_invoke_ssl_server_trust_prompt_func",&obj0,&obj1,&arg4,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_auth_ssl_server_trust_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17206,7 +17305,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_server_trust_prompt_func(PyObject
}
}
{
- arg6 = (svn_auth_ssl_server_cert_info_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj4);
+ arg6 = (svn_auth_ssl_server_cert_info_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_auth_ssl_server_cert_info_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17245,7 +17344,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_server_trust_prompt_func(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t,
_global_py_pool, args))
;
@@ -17287,7 +17386,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_prompt_func(PyObject
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_auth_invoke_ssl_client_cert_prompt_func",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
svn_auth_ssl_client_cert_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17335,7 +17434,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_prompt_func(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t,
_global_py_pool, args))
;
@@ -17377,7 +17476,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_pw_prompt_func(PyObje
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_auth_invoke_ssl_client_cert_pw_prompt_func",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
svn_auth_ssl_client_cert_pw_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17425,7 +17524,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_ssl_client_cert_pw_prompt_func(PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t,
_global_py_pool, args))
;
@@ -17466,7 +17565,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_plaintext_prompt_func(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_auth_invoke_plaintext_prompt_func",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
svn_auth_plaintext_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17549,7 +17648,7 @@ SWIGINTERN PyObject *_wrap_svn_auth_invoke_plaintext_passphrase_prompt_func(PyOb
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_auth_invoke_plaintext_passphrase_prompt_func",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
svn_auth_plaintext_passphrase_prompt_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17803,7 +17902,7 @@ SWIGINTERN PyObject *_wrap_svn_config_create2(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -17872,7 +17971,7 @@ SWIGINTERN PyObject *_wrap_svn_config_create(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -17958,7 +18057,7 @@ SWIGINTERN PyObject *_wrap_svn_config_read3(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -18036,7 +18135,7 @@ SWIGINTERN PyObject *_wrap_svn_config_read2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -18106,7 +18205,7 @@ SWIGINTERN PyObject *_wrap_svn_config_read(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -18146,7 +18245,7 @@ SWIGINTERN PyObject *_wrap_svn_config_parse(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_config_parse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18191,7 +18290,7 @@ SWIGINTERN PyObject *_wrap_svn_config_parse(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -18219,7 +18318,7 @@ SWIGINTERN PyObject *_wrap_svn_config_merge(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"OsO:svn_config_merge",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18268,7 +18367,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get(PyObject *SWIGUNUSEDPARM(self), PyObje
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Ossz:svn_config_get",&obj0,&arg3,&arg4,&arg5)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18311,7 +18410,7 @@ SWIGINTERN PyObject *_wrap_svn_config_set(PyObject *SWIGUNUSEDPARM(self), PyObje
if (!PyArg_ParseTuple(args,(char *)"Osss:svn_config_set",&obj0,&arg2,&arg3,&arg4)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18347,7 +18446,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_bool(PyObject *SWIGUNUSEDPARM(self), P
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_get_bool",&obj0,&arg3,&arg4,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18400,7 +18499,7 @@ SWIGINTERN PyObject *_wrap_svn_config_set_bool(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_set_bool",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18441,7 +18540,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_int64(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_get_int64",&obj0,&arg3,&arg4,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18486,7 +18585,7 @@ SWIGINTERN PyObject *_wrap_svn_config_set_int64(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_set_int64",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18521,7 +18620,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_yes_no_ask(PyObject *SWIGUNUSEDPARM(se
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Ossz:svn_config_get_yes_no_ask",&obj0,&arg3,&arg4,&arg5)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18579,13 +18678,13 @@ SWIGINTERN PyObject *_wrap_svn_config_get_tristate(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OOsssO:svn_config_get_tristate",&obj0,&obj1,&arg3,&arg4,&arg5,&obj5)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_tristate_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_tristate_t, svn_argnum_obj1);
+ arg2 = (svn_tristate_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_tristate_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18633,14 +18732,14 @@ SWIGINTERN PyObject *_wrap_svn_config_enumerate_sections(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_config_enumerate_sections",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_config_section_enumerator_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_q_const__char_p_void__int, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_q_const__char_p_void__int, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -18688,13 +18787,13 @@ SWIGINTERN PyObject *_wrap_svn_config_enumerate_sections2(PyObject *SWIGUNUSEDPA
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_config_enumerate_sections2",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = svn_swig_py_config_section_enumerator2;
+ arg2 = (svn_config_section_enumerator2_t) svn_swig_py_config_section_enumerator2;
arg3 = obj1;
}
if (obj2) {
@@ -18739,14 +18838,14 @@ SWIGINTERN PyObject *_wrap_svn_config_enumerate(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OsOO:svn_config_enumerate",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_config_enumerator_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -18795,13 +18894,13 @@ SWIGINTERN PyObject *_wrap_svn_config_enumerate2(PyObject *SWIGUNUSEDPARM(self),
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_config_enumerate2",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_config_enumerator2;
+ arg3 = (svn_config_enumerator2_t) svn_swig_py_config_enumerator2;
arg4 = obj2;
}
if (obj3) {
@@ -18842,7 +18941,7 @@ SWIGINTERN PyObject *_wrap_svn_config_has_section(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"Os:svn_config_has_section",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18880,7 +18979,7 @@ SWIGINTERN PyObject *_wrap_svn_config_find_group(PyObject *SWIGUNUSEDPARM(self),
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Oss|O:svn_config_find_group",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18925,7 +19024,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_server_setting(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Ossz:svn_config_get_server_setting",&obj0,&arg2,&arg3,&arg4)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18968,7 +19067,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_server_setting_int(PyObject *SWIGUNUSE
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OssO|O:svn_config_get_server_setting_int",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19032,7 +19131,7 @@ SWIGINTERN PyObject *_wrap_svn_config_get_server_setting_bool(PyObject *SWIGUNUS
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_get_server_setting_bool",&obj0,&arg3,&arg4,&obj3)) SWIG_fail;
{
- arg1 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg1 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19277,7 +19376,7 @@ SWIGINTERN PyObject *_wrap_svn_config_walk_auth_data(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"zO|O:svn_config_walk_auth_data",&arg1,&obj1,&obj2)) SWIG_fail;
{
/* FIXME: Handle the NULL case. */
- arg2 = svn_swig_py_config_auth_walk_func;
+ arg2 = (svn_config_auth_walk_func_t) svn_swig_py_config_auth_walk_func;
arg3 = obj1;
}
if (obj2) {
@@ -19408,7 +19507,7 @@ SWIGINTERN PyObject *_wrap_svn_config_dup(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_config_dup",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg2 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19424,7 +19523,7 @@ SWIGINTERN PyObject *_wrap_svn_config_dup(PyObject *SWIGUNUSEDPARM(self), PyObje
{
svn_swig_py_release_py_lock();
- result = (svn_error_t *)svn_config_dup(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_config_dup(arg1,(struct svn_config_t const *)arg2,arg3);
svn_swig_py_acquire_py_lock();
@@ -19441,7 +19540,7 @@ SWIGINTERN PyObject *_wrap_svn_config_dup(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_config_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_config_t,
_global_py_pool, args))
;
@@ -19477,7 +19576,7 @@ SWIGINTERN PyObject *_wrap_svn_config_copy_config(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_config_copy_config",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19549,7 +19648,7 @@ SWIGINTERN PyObject *_wrap_svn_config_invoke_section_enumerator(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OsO:svn_config_invoke_section_enumerator",&obj0,&arg2,&obj2)) SWIG_fail;
{
svn_config_section_enumerator_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_void__int, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_void__int, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -19598,7 +19697,7 @@ SWIGINTERN PyObject *_wrap_svn_config_invoke_section_enumerator2(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_config_invoke_section_enumerator2",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
svn_config_section_enumerator2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_void_p_apr_pool_t__int, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_void_p_apr_pool_t__int, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -19654,7 +19753,7 @@ SWIGINTERN PyObject *_wrap_svn_config_invoke_enumerator(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OssO:svn_config_invoke_enumerator",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
svn_config_enumerator_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void__int, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -19704,7 +19803,7 @@ SWIGINTERN PyObject *_wrap_svn_config_invoke_enumerator2(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OssO|O:svn_config_invoke_enumerator2",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_config_enumerator2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -19774,7 +19873,7 @@ SWIGINTERN PyObject *_wrap_svn_config_invoke_auth_walk_func(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OOssO|O:svn_config_invoke_auth_walk_func",&obj0,&obj1,&arg4,&arg5,&obj4,&obj5)) SWIG_fail;
{
svn_config_auth_walk_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -22117,6 +22216,57 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_relpath_prefix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ int arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ char *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_relpath_prefix",&arg1,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (int)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (char *)svn_relpath_prefix((char const *)arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_uri_split(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char **arg1 = (char **) 0 ;
@@ -23177,12 +23327,26 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_diff2(PyObject *SWIGUNUSEDPARM(self), P
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_mergeinfo_diff2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg3 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg4 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -23295,12 +23459,26 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_diff(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_mergeinfo_diff",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg3 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg4 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -23397,12 +23575,26 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_merge2(PyObject *SWIGUNUSEDPARM(self),
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_mergeinfo_merge2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg1 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -23485,13 +23677,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_catalog_merge(PyObject *SWIGUNUSEDPARM(
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_mergeinfo_catalog_merge",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_mergeinfo_catalog_t)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg1 = (svn_mergeinfo_catalog_t)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_mergeinfo_catalog_t)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (svn_mergeinfo_catalog_t)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23570,12 +23762,26 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_remove(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_mergeinfo_remove",&obj0,&obj1,&obj2)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg3 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -23660,12 +23866,26 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_remove2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_mergeinfo_remove2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg3 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -23875,7 +24095,7 @@ SWIGINTERN PyObject *_wrap_svn_rangelist_merge2(PyObject *SWIGUNUSEDPARM(self),
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_rangelist_merge2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_rangelist_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (svn_rangelist_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24069,13 +24289,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_intersect2(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_mergeinfo_intersect2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_mergeinfo_t)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg2 = (svn_mergeinfo_t)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_mergeinfo_t)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (svn_mergeinfo_t)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24171,13 +24391,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_intersect(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_mergeinfo_intersect",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_mergeinfo_t)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg2 = (svn_mergeinfo_t)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_mergeinfo_t)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (svn_mergeinfo_t)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24655,6 +24875,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_inheritable2(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|OO:svn_mergeinfo_inheritable2",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -24766,6 +24993,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_inheritable(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_mergeinfo_inheritable",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -24852,6 +25086,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_to_string(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_mergeinfo_to_string",&obj0,&obj1)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -24925,7 +25166,7 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_catalog_dup(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_mergeinfo_catalog_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_mergeinfo_catalog_t)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg1 = (svn_mergeinfo_catalog_t)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24946,7 +25187,7 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_catalog_dup(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -24976,6 +25217,13 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_dup(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_mergeinfo_dup",&obj0,&obj1)) SWIG_fail;
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg1 = svn_swig_py_mergeinfo_from_dict(obj0, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -24997,7 +25245,7 @@ SWIGINTERN PyObject *_wrap_svn_mergeinfo_dup(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -25052,7 +25300,7 @@ SWIGINTERN PyObject *_wrap_svn_rangelist_dup(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -25124,7 +25372,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_kind_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent2_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25151,7 +25399,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_kind_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent2_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25173,7 +25421,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_special_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent2_t_special_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25200,7 +25448,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_special_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent2_t_special_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25222,7 +25470,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_filesize_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent2_t_filesize_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25244,7 +25492,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_filesize_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent2_t_filesize_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25266,7 +25514,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_mtime_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent2_t_mtime_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25288,7 +25536,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_t_mtime_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent2_t_mtime_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25314,7 +25562,7 @@ SWIGINTERN PyObject *_wrap_new_svn_io_dirent2_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -25329,7 +25577,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_io_dirent2_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_io_dirent2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25385,7 +25633,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_create(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -25415,7 +25663,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_dup(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_io_dirent2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_io_dirent2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
+ arg1 = (svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25436,7 +25684,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent2_dup(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_io_dirent2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -25459,7 +25707,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent_t_kind_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25486,7 +25734,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent_t_kind_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25508,7 +25756,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent_t_special_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_dirent_t_special_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25535,7 +25783,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dirent_t_special_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dirent_t_special_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25561,7 +25809,7 @@ SWIGINTERN PyObject *_wrap_new_svn_io_dirent_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_io_dirent_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_io_dirent_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -25576,7 +25824,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_io_dirent_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_io_dirent_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_io_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_io_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_io_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25675,7 +25923,7 @@ SWIGINTERN PyObject *_wrap_svn_io_open_uniquely_named(PyObject *SWIGUNUSEDPARM(s
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -25781,7 +26029,7 @@ SWIGINTERN PyObject *_wrap_svn_io_open_unique_file3(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -25874,7 +26122,7 @@ SWIGINTERN PyObject *_wrap_svn_io_open_unique_file2(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -25961,7 +26209,7 @@ SWIGINTERN PyObject *_wrap_svn_io_open_unique_file(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -26453,6 +26701,128 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_io_file_create_bytes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_io_file_create_bytes",&arg1,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ arg2 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (apr_size_t)SWIG_As_unsigned_SS_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_io_file_create_bytes((char const *)arg1,(void const *)arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_io_file_create_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg2 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"s|O:svn_io_file_create_empty",&arg1,&obj1)) SWIG_fail;
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_io_file_create_empty((char const *)arg1,arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_io_lock_open_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
apr_file_t *arg1 = (apr_file_t *) 0 ;
@@ -26585,6 +26955,53 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_stream_set_read2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_read_fn_t arg2 = (svn_read_fn_t) 0 ;
+ svn_read_fn_t arg3 = (svn_read_fn_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OOO:svn_stream_set_read2",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_read_fn_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ {
+ svn_read_fn_t * tmp =
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t, svn_argnum_obj2);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg3 = *tmp;
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_stream_set_read2(arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_stream_set_skip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -26594,14 +27011,14 @@ SWIGINTERN PyObject *_wrap_svn_stream_set_skip(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_set_skip",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_stream_skip_fn_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26631,14 +27048,14 @@ SWIGINTERN PyObject *_wrap_svn_stream_set_mark(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_set_mark",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_stream_mark_fn_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26668,14 +27085,14 @@ SWIGINTERN PyObject *_wrap_svn_stream_set_seek(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_set_seek",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_stream_seek_fn_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26696,6 +27113,43 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_stream_set_data_available(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_data_available_fn_t arg2 = (svn_stream_data_available_fn_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_set_data_available",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_stream_data_available_fn_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t__p_svn_error_t, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_stream_set_data_available(arg1,arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_stream_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
apr_pool_t *arg1 = (apr_pool_t *) 0 ;
@@ -26725,7 +27179,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_empty(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -26755,7 +27209,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_disown(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_stream_disown",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26776,7 +27230,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_disown(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -26849,7 +27303,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_open_readonly(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -26931,7 +27385,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_open_writable(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -27024,7 +27478,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_open_unique(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -27103,7 +27557,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_from_aprfile2(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27152,7 +27606,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_from_aprfile(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27210,7 +27664,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_for_stdin(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -27271,7 +27725,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_for_stderr(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -27332,7 +27786,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_for_stdout(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -27349,6 +27803,90 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_stringbuf_from_stream(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stringbuf_t **arg1 = (svn_stringbuf_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_stringbuf_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stringbuf_from_stream",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (apr_size_t)SWIG_As_unsigned_SS_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_stringbuf_from_stream(arg1,arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ PyObject *s;
+ if (*arg1 == NULL) {
+ Py_INCREF(Py_None);
+ s = Py_None;
+ }
+ else {
+ s = PyString_FromStringAndSize((*arg1)->data, (*arg1)->len);
+ if (s == NULL)
+ SWIG_fail;
+ }
+ resultobj = SWIG_Python_AppendOutput(resultobj, s);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_stream_from_stringbuf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stringbuf_t *arg1 = (svn_stringbuf_t *) 0 ;
@@ -27390,7 +27928,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_from_stringbuf(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27449,7 +27987,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_from_string(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27492,7 +28030,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_buffered(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27522,7 +28060,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_compressed(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_stream_compressed",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27543,7 +28081,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_compressed(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27583,7 +28121,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_checksummed2(PyObject *SWIGUNUSEDPARM(self
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_stream_checksummed2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27616,7 +28154,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_checksummed2(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
/* FIXME: Missing argout typemap: svn_stream_checksummed2 arg 2 (svn_checksum_t **) */
@@ -27648,7 +28186,7 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_stream_read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_stream_read_full(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -27658,28 +28196,188 @@ SWIGINTERN PyObject *_wrap_svn_stream_read(PyObject *SWIGUNUSEDPARM(self), PyObj
PyObject * obj1 = 0 ;
svn_error_t *result = 0 ;
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_read",&obj0,&obj1)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_read_full",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (PyLong_Check(obj1)) {
+ temp2 = PyLong_AsUnsignedLong(obj1);
+ }
+ else if (PyInt_Check(obj1)) {
+ /* wish there was a PyInt_AsUnsignedLong but there isn't
+ the mask version doesn't do bounds checking for us.
+ I can't see a good way to do the bounds checking ourselves
+ so just stick our head in the sand. With Python3 this
+ problem goes away because PyInt is gone anyway. */
+ temp2 = PyInt_AsUnsignedLongMask(obj1);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "expecting an integer for the buffer size");
+ SWIG_fail;
+ }
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_stream_read_full(arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, PyString_FromStringAndSize(arg2, *arg3));
+ free(arg2);
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_stream_supports_partial_read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_boolean_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_stream_supports_partial_read",&obj0)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_boolean_t)svn_stream_supports_partial_read(arg1);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_stream_read2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_read2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
if (PyLong_Check(obj1)) {
- temp2 = PyLong_AsLong(obj1);
+ temp2 = PyLong_AsUnsignedLong(obj1);
}
else if (PyInt_Check(obj1)) {
- temp2 = PyInt_AsLong(obj1);
+ /* wish there was a PyInt_AsUnsignedLong but there isn't
+ the mask version doesn't do bounds checking for us.
+ I can't see a good way to do the bounds checking ourselves
+ so just stick our head in the sand. With Python3 this
+ problem goes away because PyInt is gone anyway. */
+ temp2 = PyInt_AsUnsignedLongMask(obj1);
}
else {
PyErr_SetString(PyExc_TypeError,
"expecting an integer for the buffer size");
SWIG_fail;
}
- if (temp2 < 0) {
- PyErr_SetString(PyExc_ValueError,
- "buffer size must be a positive integer");
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_stream_read2(arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, PyString_FromStringAndSize(arg2, *arg3));
+ free(arg2);
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_stream_read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_read",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (PyLong_Check(obj1)) {
+ temp2 = PyLong_AsUnsignedLong(obj1);
+ }
+ else if (PyInt_Check(obj1)) {
+ /* wish there was a PyInt_AsUnsignedLong but there isn't
+ the mask version doesn't do bounds checking for us.
+ I can't see a good way to do the bounds checking ourselves
+ so just stick our head in the sand. With Python3 this
+ problem goes away because PyInt is gone anyway. */
+ temp2 = PyInt_AsUnsignedLongMask(obj1);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "expecting an integer for the buffer size");
SWIG_fail;
}
arg2 = malloc(temp2);
@@ -27724,7 +28422,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_skip(PyObject *SWIGUNUSEDPARM(self), PyObj
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_skip",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27772,7 +28470,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_write(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_write",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27823,7 +28521,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_close(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_stream_close",&obj0)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27861,7 +28559,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_reset(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_stream_reset",&obj0)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27899,7 +28597,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_supports_mark(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_stream_supports_mark",&obj0)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27938,7 +28636,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_mark(PyObject *SWIGUNUSEDPARM(self), PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_stream_mark",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28001,13 +28699,13 @@ SWIGINTERN PyObject *_wrap_svn_stream_seek(PyObject *SWIGUNUSEDPARM(self), PyObj
if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_seek",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_stream_mark_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_mark_t, svn_argnum_obj1);
+ arg2 = (svn_stream_mark_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_mark_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28037,6 +28735,54 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_stream_data_available(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_boolean_t *arg2 = (svn_boolean_t *) 0 ;
+ svn_boolean_t temp2 ;
+ int res2 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ svn_error_t *result = 0 ;
+
+ arg2 = &temp2;
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_stream_data_available",&obj0)) SWIG_fail;
+ {
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_stream_data_available(arg1,arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res2)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg2)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_int, new_flags));
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_stream_tee(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -28055,13 +28801,13 @@ SWIGINTERN PyObject *_wrap_svn_stream_tee(PyObject *SWIGUNUSEDPARM(self), PyObje
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stream_tee",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28082,7 +28828,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_tee(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -28105,7 +28851,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_puts(PyObject *SWIGUNUSEDPARM(self), PyObj
if (!PyArg_ParseTuple(args,(char *)"Os:svn_stream_puts",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28159,7 +28905,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_readline(PyObject *SWIGUNUSEDPARM(self), P
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_stream_readline",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28243,20 +28989,20 @@ SWIGINTERN PyObject *_wrap_svn_stream_copy3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_stream_copy3",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
if (obj3) {
/* Verify that the user supplied a valid pool */
@@ -28318,20 +29064,20 @@ SWIGINTERN PyObject *_wrap_svn_stream_copy2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_stream_copy2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
if (obj3) {
/* Verify that the user supplied a valid pool */
@@ -28390,13 +29136,13 @@ SWIGINTERN PyObject *_wrap_svn_stream_copy(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stream_copy",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg1 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28462,13 +29208,13 @@ SWIGINTERN PyObject *_wrap_svn_stream_contents_same2(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stream_contents_same2",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg3 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28540,13 +29286,13 @@ SWIGINTERN PyObject *_wrap_svn_stream_contents_same(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stream_contents_same",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_stream_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
+ arg3 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_stream_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28621,7 +29367,7 @@ SWIGINTERN PyObject *_wrap_svn_string_from_stream(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_string_from_stream",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
+ arg2 = (svn_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28713,7 +29459,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_lazyopen_create(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_stream_lazyopen_create",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_stream_lazyopen_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -28749,7 +29495,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_lazyopen_create(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -29115,8 +29861,8 @@ SWIGINTERN PyObject *_wrap_svn_io_remove_dir2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
if (obj3) {
/* Verify that the user supplied a valid pool */
@@ -29525,7 +30271,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dir_walk2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_io_walk_func_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29614,19 +30360,19 @@ SWIGINTERN PyObject *_wrap_svn_io_start_cmd3(PyObject *SWIGUNUSEDPARM(self), PyO
arg13 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOOO|O:svn_io_start_cmd3",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg1 = (apr_proc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_proc_t, svn_argnum_obj0);
+ arg1 = (apr_proc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_proc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (char **)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_p_char, svn_argnum_obj3);
+ arg4 = (char **)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_p_char, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (char **)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_p_char, svn_argnum_obj4);
+ arg5 = (char **)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_char, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29740,13 +30486,13 @@ SWIGINTERN PyObject *_wrap_svn_io_start_cmd2(PyObject *SWIGUNUSEDPARM(self), PyO
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOO|O:svn_io_start_cmd2",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg1 = (apr_proc_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_proc_t, svn_argnum_obj0);
+ arg1 = (apr_proc_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_proc_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (char **)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_p_char, svn_argnum_obj3);
+ arg4 = (char **)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_p_char, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29858,7 +30604,7 @@ SWIGINTERN PyObject *_wrap_svn_io_run_diff2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg8 = &temp8;
if (!PyArg_ParseTuple(args,(char *)"sOOssssOOs|O:svn_io_run_diff2",&arg1,&obj1,&obj2,&arg4,&arg5,&arg6,&arg7,&obj7,&obj8,&arg11,&obj10)) SWIG_fail;
{
- arg2 = (char **)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
+ arg2 = (char **)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_char, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29956,7 +30702,7 @@ SWIGINTERN PyObject *_wrap_svn_io_run_diff3_3(PyObject *SWIGUNUSEDPARM(self), Py
if (!arg9) SWIG_fail;
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30218,7 +30964,7 @@ SWIGINTERN PyObject *_wrap_svn_io_is_binary_data(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_io_is_binary_data",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (void *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_void, svn_argnum_obj0);
+ arg1 = (void *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_void, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30335,7 +31081,7 @@ SWIGINTERN PyObject *_wrap_svn_io_file_read_full2(PyObject *SWIGUNUSEDPARM(self)
if (!arg1) SWIG_fail;
}
{
- arg2 = (void *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ arg2 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30397,6 +31143,206 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_io_file_aligned_seek(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_off_t arg2 ;
+ apr_off_t *arg3 = (apr_off_t *) 0 ;
+ apr_off_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_io_file_aligned_seek",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_file(obj0, _global_pool);
+ if (!arg1) SWIG_fail;
+ }
+ arg2 = (apr_off_t) PyLong_AsLongLong(obj1);
+ {
+ arg3 = (apr_off_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_off_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ arg4 = (apr_off_t) PyLong_AsLongLong(obj3);
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_io_file_aligned_seek(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_io_file_flush(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg2 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"O|O:svn_io_file_flush",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_file(obj0, _global_pool);
+ if (!arg1) SWIG_fail;
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_io_file_flush(arg1,arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_io_write_atomic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOOs|O:svn_io_write_atomic",&arg1,&obj1,&obj2,&arg4,&obj4)) SWIG_fail;
+ {
+ arg2 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (apr_size_t)SWIG_As_unsigned_SS_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_io_write_atomic((char const *)arg1,(void const *)arg2,arg3,(char const *)arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_io_write_unique(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char **arg1 = (char **) 0 ;
@@ -30421,7 +31367,7 @@ SWIGINTERN PyObject *_wrap_svn_io_write_unique(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_io_write_unique",&arg2,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (void *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30559,7 +31505,7 @@ SWIGINTERN PyObject *_wrap_svn_io_dir_close(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_io_dir_close",&obj0)) SWIG_fail;
{
- arg1 = (apr_dir_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_dir_t, svn_argnum_obj0);
+ arg1 = (apr_dir_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_dir_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30820,7 +31766,7 @@ SWIGINTERN PyObject *_wrap_svn_read_invoke_fn(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_read_invoke_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_read_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30836,21 +31782,21 @@ SWIGINTERN PyObject *_wrap_svn_read_invoke_fn(PyObject *SWIGUNUSEDPARM(self), Py
}
{
if (PyLong_Check(obj2)) {
- temp3 = PyLong_AsLong(obj2);
+ temp3 = PyLong_AsUnsignedLong(obj2);
}
else if (PyInt_Check(obj2)) {
- temp3 = PyInt_AsLong(obj2);
+ /* wish there was a PyInt_AsUnsignedLong but there isn't
+ the mask version doesn't do bounds checking for us.
+ I can't see a good way to do the bounds checking ourselves
+ so just stick our head in the sand. With Python3 this
+ problem goes away because PyInt is gone anyway. */
+ temp3 = PyInt_AsUnsignedLongMask(obj2);
}
else {
PyErr_SetString(PyExc_TypeError,
"expecting an integer for the buffer size");
SWIG_fail;
}
- if (temp3 < 0) {
- PyErr_SetString(PyExc_ValueError,
- "buffer size must be a positive integer");
- SWIG_fail;
- }
arg3 = malloc(temp3);
arg4 = (apr_size_t *)&temp3;
}
@@ -30896,7 +31842,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_skip_fn(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_stream_invoke_skip_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_stream_skip_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_apr_size_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30956,7 +31902,7 @@ SWIGINTERN PyObject *_wrap_svn_write_invoke_fn(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_write_invoke_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_write_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31019,7 +31965,7 @@ SWIGINTERN PyObject *_wrap_svn_close_invoke_fn(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_close_invoke_fn",&obj0,&obj1)) SWIG_fail;
{
svn_close_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31080,7 +32026,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_mark_fn(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_stream_invoke_mark_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_stream_mark_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31155,7 +32101,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_seek_fn(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_stream_invoke_seek_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_stream_seek_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31170,7 +32116,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_seek_fn(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg3 = (svn_stream_mark_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_stream_mark_t, svn_argnum_obj2);
+ arg3 = (svn_stream_mark_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_stream_mark_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31200,6 +32146,66 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_stream_invoke_data_available_fn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_data_available_fn_t arg1 = (svn_stream_data_available_fn_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_boolean_t *arg3 = (svn_boolean_t *) 0 ;
+ svn_boolean_t temp3 ;
+ int res3 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ arg3 = &temp3;
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_stream_invoke_data_available_fn",&obj0,&obj1)) SWIG_fail;
+ {
+ svn_stream_data_available_fn_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t__p_svn_error_t, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_stream_invoke_data_available_fn(arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res3)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags));
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_stream_invoke_lazyopen_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_lazyopen_func_t arg1 = (svn_stream_lazyopen_func_t) 0 ;
@@ -31228,7 +32234,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_lazyopen_func(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_stream_invoke_lazyopen_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_stream_lazyopen_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31278,7 +32284,7 @@ SWIGINTERN PyObject *_wrap_svn_stream_invoke_lazyopen_func(PyObject *SWIGUNUSEDP
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -31323,7 +32329,7 @@ SWIGINTERN PyObject *_wrap_svn_io_invoke_walk_func(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_io_invoke_walk_func",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_io_walk_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31338,7 +32344,7 @@ SWIGINTERN PyObject *_wrap_svn_io_invoke_walk_func(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg4 = (apr_finfo_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_finfo_t, svn_argnum_obj3);
+ arg4 = (apr_finfo_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_finfo_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31424,6 +32430,13 @@ SWIGINTERN PyObject *svn_stream_seek_fn_t_swigregister(PyObject *SWIGUNUSEDPARM(
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_stream_data_available_fn_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_svn_boolean_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *svn_stream_lazyopen_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -31447,7 +32460,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_t_digest_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_checksum_t_digest_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (struct svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31477,13 +32490,13 @@ SWIGINTERN PyObject *_wrap_svn_checksum_t_digest_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_checksum_t_digest_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (struct svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (unsigned char *) ((arg1)->digest);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_unsigned_char,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_unsigned_char,
_global_py_pool, args);
return resultobj;
fail:
@@ -31500,7 +32513,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_t_kind_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_checksum_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (struct svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31527,7 +32540,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_t_kind_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_checksum_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (struct svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31553,7 +32566,7 @@ SWIGINTERN PyObject *_wrap_new_svn_checksum_t(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -31568,7 +32581,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_checksum_t(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_checksum_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (struct svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31632,7 +32645,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_create(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -31654,7 +32667,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_clear(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_checksum_clear",&obj0)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31694,13 +32707,13 @@ SWIGINTERN PyObject *_wrap_svn_checksum_match(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_checksum_match",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_checksum_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
+ arg2 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31736,7 +32749,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_dup(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_checksum_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31757,7 +32770,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_dup(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -31787,7 +32800,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_to_cstring_display(PyObject *SWIGUNUSEDP
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_checksum_to_cstring_display",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31837,7 +32850,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_to_cstring(PyObject *SWIGUNUSEDPARM(self
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_checksum_to_cstring",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31893,7 +32906,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_serialize(PyObject *SWIGUNUSEDPARM(self)
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_checksum_serialize",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32128,7 +33141,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32224,7 +33237,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_empty_checksum(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -32275,7 +33288,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_ctx_create(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_ctx_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_ctx_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -32301,13 +33314,13 @@ SWIGINTERN PyObject *_wrap_svn_checksum_update(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_checksum_update",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_checksum_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_ctx_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (void *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
+ arg2 = (void *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_void, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32362,7 +33375,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_final(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_checksum_final",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_checksum_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_ctx_t, svn_argnum_obj0);
+ arg2 = (svn_checksum_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32423,7 +33436,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_size(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"O:svn_checksum_size",&obj0)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32451,7 +33464,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_is_empty_checksum(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_checksum_is_empty_checksum",&obj0)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32491,13 +33504,13 @@ SWIGINTERN PyObject *_wrap_svn_checksum_mismatch_err__varargs__(PyObject *SWIGUN
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|Os:svn_checksum_mismatch_err",&obj0,&obj1,&obj2,&arg4)) SWIG_fail;
{
- arg1 = (svn_checksum_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
+ arg1 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_checksum_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
+ arg2 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32547,7 +33560,7 @@ SWIGINTERN PyObject *_wrap_svn_checksum_mismatch_err(PyObject *SWIGUNUSEDPARM(se
PyObject *newargs;
newargs = PyTuple_GetSlice(args,0,2);
- varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args)+1);
+ varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args));
resultobj = _wrap_svn_checksum_mismatch_err__varargs__(NULL,newargs,varargs);
Py_XDECREF(newargs);
Py_XDECREF(varargs);
@@ -32572,13 +33585,13 @@ SWIGINTERN PyObject *_wrap_svn_auth_set_gnome_keyring_unlock_prompt_func(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_auth_set_gnome_keyring_unlock_prompt_func",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
+ arg1 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = svn_swig_py_auth_gnome_keyring_unlock_prompt_func;
+ arg2 = (svn_auth_gnome_keyring_unlock_prompt_func_t) svn_swig_py_auth_gnome_keyring_unlock_prompt_func;
arg3 = obj1;
}
{
@@ -32713,6 +33726,13 @@ SWIGINTERN PyObject *_wrap_svn_swig_mergeinfo_merge(PyObject *SWIGUNUSEDPARM(sel
}
}
{
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
arg2 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
if (PyErr_Occurred()) {
SWIG_fail;
@@ -33034,9 +34054,6 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"new_svn_error_t", _wrap_new_svn_error_t, METH_VARARGS, (char *)"new_svn_error_t() -> svn_error_t"},
{ (char *)"delete_svn_error_t", _wrap_delete_svn_error_t, METH_VARARGS, (char *)"delete_svn_error_t(svn_error_t self)"},
{ (char *)"svn_error_t_swigregister", svn_error_t_swigregister, METH_VARARGS, NULL},
- { (char *)"svn__apr_hash_index_key", _wrap_svn__apr_hash_index_key, METH_VARARGS, (char *)"svn__apr_hash_index_key(apr_hash_index_t const * hi) -> void const *"},
- { (char *)"svn__apr_hash_index_klen", _wrap_svn__apr_hash_index_klen, METH_VARARGS, (char *)"svn__apr_hash_index_klen(apr_hash_index_t const * hi) -> apr_ssize_t"},
- { (char *)"svn__apr_hash_index_val", _wrap_svn__apr_hash_index_val, METH_VARARGS, (char *)"svn__apr_hash_index_val(apr_hash_index_t const * hi) -> void *"},
{ (char *)"svn_node_kind_to_word", _wrap_svn_node_kind_to_word, METH_VARARGS, (char *)"svn_node_kind_to_word(svn_node_kind_t kind) -> char const *"},
{ (char *)"svn_node_kind_from_word", _wrap_svn_node_kind_from_word, METH_VARARGS, (char *)"svn_node_kind_from_word(char const * word) -> svn_node_kind_t"},
{ (char *)"svn_tristate__to_word", _wrap_svn_tristate__to_word, METH_VARARGS, (char *)"svn_tristate__to_word(svn_tristate_t tristate) -> char const *"},
@@ -33197,6 +34214,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"new_svn_version_checklist_t", _wrap_new_svn_version_checklist_t, METH_VARARGS, (char *)"new_svn_version_checklist_t() -> svn_version_checklist_t"},
{ (char *)"delete_svn_version_checklist_t", _wrap_delete_svn_version_checklist_t, METH_VARARGS, (char *)"delete_svn_version_checklist_t(svn_version_checklist_t self)"},
{ (char *)"svn_version_checklist_t_swigregister", svn_version_checklist_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_ver_check_list2", _wrap_svn_ver_check_list2, METH_VARARGS, (char *)"svn_ver_check_list2(svn_version_t const * my_version, svn_version_checklist_t checklist, svn_boolean_t (*)(svn_version_t const *,svn_version_t const *) comparator) -> svn_error_t"},
{ (char *)"svn_ver_check_list", _wrap_svn_ver_check_list, METH_VARARGS, (char *)"svn_ver_check_list(svn_version_t const * my_version, svn_version_checklist_t checklist) -> svn_error_t"},
{ (char *)"svn_subr_version", _wrap_svn_subr_version, METH_VARARGS, (char *)"svn_subr_version() -> svn_version_t const *"},
{ (char *)"svn_version_extended", _wrap_svn_version_extended, METH_VARARGS, (char *)"svn_version_extended(svn_boolean_t verbose, apr_pool_t pool) -> svn_version_extended_t const *"},
@@ -33377,6 +34395,14 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_cmdline_init", _wrap_svn_cmdline_init, METH_VARARGS, (char *)"svn_cmdline_init(char const * progname, FILE * error_stream) -> int"},
+ { (char *)"svn_cmdline_create_auth_baton2", _wrap_svn_cmdline_create_auth_baton2, METH_VARARGS, (char *)"\n"
+ "svn_cmdline_create_auth_baton2(svn_boolean_t non_interactive, char const * username, char const * password, char const * config_dir, \n"
+ " svn_boolean_t no_auth_cache, svn_boolean_t trust_server_cert_unknown_ca, \n"
+ " svn_boolean_t trust_server_cert_cn_mismatch, svn_boolean_t trust_server_cert_expired, \n"
+ " svn_boolean_t trust_server_cert_not_yet_valid, \n"
+ " svn_boolean_t trust_server_cert_other_failure, svn_config_t * cfg, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_cmdline_create_auth_baton", _wrap_svn_cmdline_create_auth_baton, METH_VARARGS, (char *)"\n"
"svn_cmdline_create_auth_baton(svn_boolean_t non_interactive, char const * username, char const * password, char const * config_dir, \n"
" svn_boolean_t no_auth_cache, svn_boolean_t trust_server_cert, \n"
@@ -33585,7 +34611,7 @@ static PyMethodDef SwigMethods[] = {
""},
{ (char *)"svn_config_walk_auth_data", _wrap_svn_config_walk_auth_data, METH_VARARGS, (char *)"svn_config_walk_auth_data(char const * config_dir, svn_config_auth_walk_func_t walk_func, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_config_get_user_config_path", _wrap_svn_config_get_user_config_path, METH_VARARGS, (char *)"svn_config_get_user_config_path(char const * config_dir, char const * fname, apr_pool_t pool) -> svn_error_t"},
- { (char *)"svn_config_dup", _wrap_svn_config_dup, METH_VARARGS, (char *)"svn_config_dup(svn_config_t * src, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_config_dup", _wrap_svn_config_dup, METH_VARARGS, (char *)"svn_config_dup(svn_config_t const * src, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_config_copy_config", _wrap_svn_config_copy_config, METH_VARARGS, (char *)"svn_config_copy_config(apr_hash_t src_hash, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_config_t_swigregister", svn_config_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_config_invoke_section_enumerator", _wrap_svn_config_invoke_section_enumerator, METH_VARARGS, (char *)"svn_config_invoke_section_enumerator(svn_config_section_enumerator_t _obj, char const * name, void * baton) -> svn_boolean_t"},
@@ -33596,7 +34622,7 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_boolean_t\n"
""},
{ (char *)"svn_config_invoke_auth_walk_func", _wrap_svn_config_invoke_auth_walk_func, METH_VARARGS, (char *)"\n"
- "svn_config_invoke_auth_walk_func(svn_config_auth_walk_func_t _obj, void * cleanup_baton, char const * cred_kind, char const * realmstring, \n"
+ "svn_config_invoke_auth_walk_func(svn_config_auth_walk_func_t _obj, void * walk_baton, char const * cred_kind, char const * realmstring, \n"
" apr_hash_t hash, apr_pool_t scratch_pool) -> svn_error_t\n"
""},
{ (char *)"svn_config_section_enumerator_t_swigregister", svn_config_section_enumerator_t_swigregister, METH_VARARGS, NULL},
@@ -33648,6 +34674,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_relpath_split", _wrap_svn_relpath_split, METH_VARARGS, (char *)"svn_relpath_split(char const * relpath, apr_pool_t result_pool)"},
{ (char *)"svn_relpath_basename", _wrap_svn_relpath_basename, METH_VARARGS, (char *)"svn_relpath_basename(char const * relpath, apr_pool_t result_pool) -> char const *"},
{ (char *)"svn_relpath_dirname", _wrap_svn_relpath_dirname, METH_VARARGS, (char *)"svn_relpath_dirname(char const * relpath, apr_pool_t result_pool) -> char *"},
+ { (char *)"svn_relpath_prefix", _wrap_svn_relpath_prefix, METH_VARARGS, (char *)"svn_relpath_prefix(char const * relpath, int max_components, apr_pool_t result_pool) -> char const *"},
{ (char *)"svn_uri_split", _wrap_svn_uri_split, METH_VARARGS, (char *)"svn_uri_split(char const * uri, apr_pool_t result_pool)"},
{ (char *)"svn_uri_basename", _wrap_svn_uri_basename, METH_VARARGS, (char *)"svn_uri_basename(char const * uri, apr_pool_t result_pool) -> char const *"},
{ (char *)"svn_uri_dirname", _wrap_svn_uri_dirname, METH_VARARGS, (char *)"svn_uri_dirname(char const * uri, apr_pool_t result_pool) -> char *"},
@@ -33759,11 +34786,15 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_io_file_checksum", _wrap_svn_io_file_checksum, METH_VARARGS, (char *)"svn_io_file_checksum(char const * file, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_io_files_contents_same_p", _wrap_svn_io_files_contents_same_p, METH_VARARGS, (char *)"svn_io_files_contents_same_p(char const * file1, char const * file2, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_io_files_contents_three_same_p", _wrap_svn_io_files_contents_three_same_p, METH_VARARGS, (char *)"svn_io_files_contents_three_same_p(char const * file1, char const * file2, char const * file3, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_io_file_create_bytes", _wrap_svn_io_file_create_bytes, METH_VARARGS, (char *)"svn_io_file_create_bytes(char const * file, void const * contents, apr_size_t length, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_io_file_create_empty", _wrap_svn_io_file_create_empty, METH_VARARGS, (char *)"svn_io_file_create_empty(char const * file, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_io_lock_open_file", _wrap_svn_io_lock_open_file, METH_VARARGS, (char *)"svn_io_lock_open_file(apr_file_t lockfile_handle, svn_boolean_t exclusive, svn_boolean_t nonblocking, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_io_unlock_open_file", _wrap_svn_io_unlock_open_file, METH_VARARGS, (char *)"svn_io_unlock_open_file(apr_file_t lockfile_handle, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_stream_set_read2", _wrap_svn_stream_set_read2, METH_VARARGS, (char *)"svn_stream_set_read2(svn_stream_t * stream, svn_read_fn_t read_fn, svn_read_fn_t read_full_fn)"},
{ (char *)"svn_stream_set_skip", _wrap_svn_stream_set_skip, METH_VARARGS, (char *)"svn_stream_set_skip(svn_stream_t * stream, svn_stream_skip_fn_t skip_fn)"},
{ (char *)"svn_stream_set_mark", _wrap_svn_stream_set_mark, METH_VARARGS, (char *)"svn_stream_set_mark(svn_stream_t * stream, svn_stream_mark_fn_t mark_fn)"},
{ (char *)"svn_stream_set_seek", _wrap_svn_stream_set_seek, METH_VARARGS, (char *)"svn_stream_set_seek(svn_stream_t * stream, svn_stream_seek_fn_t seek_fn)"},
+ { (char *)"svn_stream_set_data_available", _wrap_svn_stream_set_data_available, METH_VARARGS, (char *)"svn_stream_set_data_available(svn_stream_t * stream, svn_stream_data_available_fn_t data_available)"},
{ (char *)"svn_stream_empty", _wrap_svn_stream_empty, METH_VARARGS, (char *)"svn_stream_empty(apr_pool_t pool) -> svn_stream_t *"},
{ (char *)"svn_stream_disown", _wrap_svn_stream_disown, METH_VARARGS, (char *)"svn_stream_disown(svn_stream_t * stream, apr_pool_t pool) -> svn_stream_t *"},
{ (char *)"svn_stream_open_readonly", _wrap_svn_stream_open_readonly, METH_VARARGS, (char *)"svn_stream_open_readonly(char const * path, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
@@ -33774,6 +34805,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_stream_for_stdin", _wrap_svn_stream_for_stdin, METH_VARARGS, (char *)"svn_stream_for_stdin(apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_stream_for_stderr", _wrap_svn_stream_for_stderr, METH_VARARGS, (char *)"svn_stream_for_stderr(apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_stream_for_stdout", _wrap_svn_stream_for_stdout, METH_VARARGS, (char *)"svn_stream_for_stdout(apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_stringbuf_from_stream", _wrap_svn_stringbuf_from_stream, METH_VARARGS, (char *)"svn_stringbuf_from_stream(svn_stream_t * stream, apr_size_t len_hint, apr_pool_t result_pool) -> svn_error_t"},
{ (char *)"svn_stream_from_stringbuf", _wrap_svn_stream_from_stringbuf, METH_VARARGS, (char *)"svn_stream_from_stringbuf(svn_stringbuf_t * str, apr_pool_t pool) -> svn_stream_t *"},
{ (char *)"svn_stream_from_string", _wrap_svn_stream_from_string, METH_VARARGS, (char *)"svn_stream_from_string(svn_string_t const * str, apr_pool_t pool) -> svn_stream_t *"},
{ (char *)"svn_stream_buffered", _wrap_svn_stream_buffered, METH_VARARGS, (char *)"svn_stream_buffered(apr_pool_t result_pool) -> svn_stream_t *"},
@@ -33782,6 +34814,9 @@ static PyMethodDef SwigMethods[] = {
"svn_stream_checksummed2(svn_stream_t * stream, svn_checksum_kind_t checksum_kind, svn_boolean_t read_all, \n"
" apr_pool_t pool) -> svn_stream_t *\n"
""},
+ { (char *)"svn_stream_read_full", _wrap_svn_stream_read_full, METH_VARARGS, (char *)"svn_stream_read_full(svn_stream_t * stream, char * buffer) -> svn_error_t"},
+ { (char *)"svn_stream_supports_partial_read", _wrap_svn_stream_supports_partial_read, METH_VARARGS, (char *)"svn_stream_supports_partial_read(svn_stream_t * stream) -> svn_boolean_t"},
+ { (char *)"svn_stream_read2", _wrap_svn_stream_read2, METH_VARARGS, (char *)"svn_stream_read2(svn_stream_t * stream, char * buffer) -> svn_error_t"},
{ (char *)"svn_stream_read", _wrap_svn_stream_read, METH_VARARGS, (char *)"svn_stream_read(svn_stream_t * stream, char * buffer) -> svn_error_t"},
{ (char *)"svn_stream_skip", _wrap_svn_stream_skip, METH_VARARGS, (char *)"svn_stream_skip(svn_stream_t * stream, apr_size_t len) -> svn_error_t"},
{ (char *)"svn_stream_write", _wrap_svn_stream_write, METH_VARARGS, (char *)"svn_stream_write(svn_stream_t * stream, char const * data) -> svn_error_t"},
@@ -33790,6 +34825,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_stream_supports_mark", _wrap_svn_stream_supports_mark, METH_VARARGS, (char *)"svn_stream_supports_mark(svn_stream_t * stream) -> svn_boolean_t"},
{ (char *)"svn_stream_mark", _wrap_svn_stream_mark, METH_VARARGS, (char *)"svn_stream_mark(svn_stream_t * stream, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_stream_seek", _wrap_svn_stream_seek, METH_VARARGS, (char *)"svn_stream_seek(svn_stream_t * stream, svn_stream_mark_t const * mark) -> svn_error_t"},
+ { (char *)"svn_stream_data_available", _wrap_svn_stream_data_available, METH_VARARGS, (char *)"svn_stream_data_available(svn_stream_t * stream) -> svn_error_t"},
{ (char *)"svn_stream_tee", _wrap_svn_stream_tee, METH_VARARGS, (char *)"svn_stream_tee(svn_stream_t * out1, svn_stream_t * out2, apr_pool_t pool) -> svn_stream_t *"},
{ (char *)"svn_stream_puts", _wrap_svn_stream_puts, METH_VARARGS, (char *)"svn_stream_puts(svn_stream_t * stream, char const * str) -> svn_error_t"},
{ (char *)"svn_stream_readline", _wrap_svn_stream_readline, METH_VARARGS, (char *)"svn_stream_readline(svn_stream_t * stream, char const * eol, apr_pool_t pool) -> svn_error_t"},
@@ -33848,6 +34884,15 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_io_is_binary_data", _wrap_svn_io_is_binary_data, METH_VARARGS, (char *)"svn_io_is_binary_data(void const * buf, apr_size_t len) -> svn_boolean_t"},
{ (char *)"svn_io_file_putc", _wrap_svn_io_file_putc, METH_VARARGS, (char *)"svn_io_file_putc(char ch, apr_file_t file, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_io_file_read_full2", _wrap_svn_io_file_read_full2, METH_VARARGS, (char *)"svn_io_file_read_full2(apr_file_t file, void * buf, apr_size_t nbytes, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_io_file_aligned_seek", _wrap_svn_io_file_aligned_seek, METH_VARARGS, (char *)"\n"
+ "svn_io_file_aligned_seek(apr_file_t file, apr_off_t block_size, apr_off_t * buffer_start, apr_off_t offset, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
+ { (char *)"svn_io_file_flush", _wrap_svn_io_file_flush, METH_VARARGS, (char *)"svn_io_file_flush(apr_file_t file, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_io_write_atomic", _wrap_svn_io_write_atomic, METH_VARARGS, (char *)"\n"
+ "svn_io_write_atomic(char const * final_path, void const * buf, apr_size_t nbytes, char const * copy_perms_path, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_io_write_unique", _wrap_svn_io_write_unique, METH_VARARGS, (char *)"\n"
"svn_io_write_unique(char const * dirpath, void const * buf, apr_size_t nbytes, svn_io_file_del_t delete_when, \n"
" apr_pool_t pool) -> svn_error_t\n"
@@ -33864,6 +34909,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_close_invoke_fn", _wrap_svn_close_invoke_fn, METH_VARARGS, (char *)"svn_close_invoke_fn(svn_close_fn_t _obj, void * baton) -> svn_error_t"},
{ (char *)"svn_stream_invoke_mark_fn", _wrap_svn_stream_invoke_mark_fn, METH_VARARGS, (char *)"svn_stream_invoke_mark_fn(svn_stream_mark_fn_t _obj, void * baton, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_stream_invoke_seek_fn", _wrap_svn_stream_invoke_seek_fn, METH_VARARGS, (char *)"svn_stream_invoke_seek_fn(svn_stream_seek_fn_t _obj, void * baton, svn_stream_mark_t const * mark) -> svn_error_t"},
+ { (char *)"svn_stream_invoke_data_available_fn", _wrap_svn_stream_invoke_data_available_fn, METH_VARARGS, (char *)"svn_stream_invoke_data_available_fn(svn_stream_data_available_fn_t _obj, void * baton) -> svn_error_t"},
{ (char *)"svn_stream_invoke_lazyopen_func", _wrap_svn_stream_invoke_lazyopen_func, METH_VARARGS, (char *)"svn_stream_invoke_lazyopen_func(svn_stream_lazyopen_func_t _obj, void * baton, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_io_invoke_walk_func", _wrap_svn_io_invoke_walk_func, METH_VARARGS, (char *)"\n"
"svn_io_invoke_walk_func(svn_io_walk_func_t _obj, void * baton, char const * path, apr_finfo_t const * finfo, \n"
@@ -33875,6 +34921,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_close_fn_t_swigregister", svn_close_fn_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_stream_mark_fn_t_swigregister", svn_stream_mark_fn_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_stream_seek_fn_t_swigregister", svn_stream_seek_fn_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_stream_data_available_fn_t_swigregister", svn_stream_data_available_fn_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_stream_lazyopen_func_t_swigregister", svn_stream_lazyopen_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_io_walk_func_t_swigregister", svn_io_walk_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_checksum_t_digest_set", _wrap_svn_checksum_t_digest_set, METH_VARARGS, (char *)"svn_checksum_t_digest_set(svn_checksum_t self, unsigned char const * digest)"},
@@ -33927,7 +34974,6 @@ static swig_type_info _swigt__p_apr_file_t = {"_p_apr_file_t", "apr_file_t *", 0
static swig_type_info _swigt__p_apr_finfo_t = {"_p_apr_finfo_t", "apr_finfo_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_option_t = {"_p_apr_getopt_option_t", "apr_getopt_option_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_t = {"_p_apr_getopt_t", "apr_getopt_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_apr_hash_index_t = {"_p_apr_hash_index_t", "apr_hash_index_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "svn_mergeinfo_catalog_t|svn_mergeinfo_t|apr_hash_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
@@ -33951,6 +34997,7 @@ static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void__int =
static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int", "svn_config_enumerator2_t|int (*)(char const *,char const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void__int = {"_p_f_p_q_const__char_p_void__int", "svn_config_section_enumerator_t|int (*)(char const *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_void_p_apr_pool_t__int", "int (*)(char const *,void *,apr_pool_t *)|svn_config_section_enumerator2_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int = {"_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int", "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)|int (*)(struct svn_version_t const *,struct svn_version_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,char const *,void *,apr_pool_t *)|svn_auth_plaintext_prompt_func_t|svn_auth_plaintext_passphrase_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,void *,char const *,char const *,apr_hash_t *,apr_pool_t *)|svn_config_auth_walk_func_t", 0, 0, (void*)0, 0};
@@ -33964,6 +35011,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_size_t *)|svn_write_fn_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_finfo_t const *,apr_pool_t *)|svn_io_walk_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t = {"_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t", "svn_stream_seek_fn_t|struct svn_error_t *(*)(void *,svn_stream_mark_t const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t = {"_p_f_p_void_p_svn_boolean_t__p_svn_error_t", "svn_stream_data_available_fn_t|struct svn_error_t *(*)(void *,svn_boolean_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t = {"_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_revnum_t,char const *,char const *,void *)|svn_commit_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_void__p_svn_version_t = {"_p_f_void__p_svn_version_t", "svn_version_func_t|struct svn_version_t *(*)(void)|svn_version_t *(*)(void)", 0, 0, (void*)0, 0};
@@ -33997,6 +35045,7 @@ static swig_type_info _swigt__p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,apr_size_t *)|svn_write_fn_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,apr_finfo_t const *,apr_pool_t *)|svn_io_walk_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t", "svn_stream_seek_fn_t *|struct svn_error_t *(**)(void *,svn_stream_mark_t const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_svn_boolean_t__p_svn_error_t = {"_p_p_f_p_void_p_svn_boolean_t__p_svn_error_t", "svn_stream_data_available_fn_t *|struct svn_error_t *(**)(void *,svn_boolean_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t = {"_p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t", "struct svn_error_t *(**)(svn_revnum_t,char const *,char const *,void *)|svn_commit_callback_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_void__p_svn_version_t = {"_p_p_f_void__p_svn_version_t", "struct svn_version_t *(**)(void)|svn_version_func_t *", 0, 0, (void*)0, 0};
@@ -34032,9 +35081,11 @@ static swig_type_info _swigt__p_svn_checksum_t = {"_p_svn_checksum_t", "struct s
static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "struct svn_commit_info_t *|svn_commit_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -34079,7 +35130,6 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_apr_finfo_t,
&_swigt__p_apr_getopt_option_t,
&_swigt__p_apr_getopt_t,
- &_swigt__p_apr_hash_index_t,
&_swigt__p_apr_hash_t,
&_swigt__p_apr_int32_t,
&_swigt__p_apr_int64_t,
@@ -34103,6 +35153,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
&_swigt__p_f_p_q_const__char_p_void__int,
&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ &_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -34116,6 +35167,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
&_swigt__p_f_void__p_svn_version_t,
@@ -34149,6 +35201,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_svn_boolean_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
&_swigt__p_p_f_void__p_svn_version_t,
@@ -34184,9 +35237,11 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_commit_info_t,
&_swigt__p_svn_config_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -34231,7 +35286,6 @@ static swig_cast_info _swigc__p_apr_file_t[] = { {&_swigt__p_apr_file_t, 0, 0,
static swig_cast_info _swigc__p_apr_finfo_t[] = { {&_swigt__p_apr_finfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_option_t[] = { {&_swigt__p_apr_getopt_option_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_t[] = { {&_swigt__p_apr_getopt_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_apr_hash_index_t[] = { {&_swigt__p_apr_hash_index_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_hash_t[] = { {&_swigt__p_apr_hash_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int32_t[] = { {&_swigt__p_apr_int32_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int64_t[] = { {&_swigt__p_apr_int64_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34255,6 +35309,7 @@ static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void__int[]
static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void__int[] = { {&_swigt__p_f_p_q_const__char_p_void__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int[] = { {&_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34268,6 +35323,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t[] = { {&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_void__p_svn_version_t[] = { {&_swigt__p_f_void__p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34301,6 +35357,7 @@ static swig_cast_info _swigc__p_p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_svn_boolean_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_svn_boolean_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_void__p_svn_version_t[] = { {&_swigt__p_p_f_void__p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34336,9 +35393,11 @@ static swig_cast_info _swigc__p_svn_checksum_t[] = { {&_swigt__p_svn_checksum_t
static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -34383,7 +35442,6 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_apr_finfo_t,
_swigc__p_apr_getopt_option_t,
_swigc__p_apr_getopt_t,
- _swigc__p_apr_hash_index_t,
_swigc__p_apr_hash_t,
_swigc__p_apr_int32_t,
_swigc__p_apr_int64_t,
@@ -34407,6 +35465,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
_swigc__p_f_p_q_const__char_p_void__int,
_swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -34420,6 +35479,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
_swigc__p_f_void__p_svn_version_t,
@@ -34453,6 +35513,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_svn_boolean_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
_swigc__p_p_f_void__p_svn_version_t,
@@ -34488,9 +35549,11 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_commit_info_t,
_swigc__p_svn_config_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -34538,18 +35601,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -34559,17 +35622,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -34632,7 +35695,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -35229,11 +36292,13 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_BAD_TOKEN",SWIG_From_long((long)(SVN_ERR_BAD_TOKEN)));
SWIG_Python_SetConstant(d, "SVN_ERR_BAD_CHANGELIST_NAME",SWIG_From_long((long)(SVN_ERR_BAD_CHANGELIST_NAME)));
SWIG_Python_SetConstant(d, "SVN_ERR_BAD_ATOMIC",SWIG_From_long((long)(SVN_ERR_BAD_ATOMIC)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_BAD_COMPRESSION_METHOD",SWIG_From_long((long)(SVN_ERR_BAD_COMPRESSION_METHOD)));
SWIG_Python_SetConstant(d, "SVN_ERR_XML_ATTRIB_NOT_FOUND",SWIG_From_long((long)(SVN_ERR_XML_ATTRIB_NOT_FOUND)));
SWIG_Python_SetConstant(d, "SVN_ERR_XML_MISSING_ANCESTRY",SWIG_From_long((long)(SVN_ERR_XML_MISSING_ANCESTRY)));
SWIG_Python_SetConstant(d, "SVN_ERR_XML_UNKNOWN_ENCODING",SWIG_From_long((long)(SVN_ERR_XML_UNKNOWN_ENCODING)));
SWIG_Python_SetConstant(d, "SVN_ERR_XML_MALFORMED",SWIG_From_long((long)(SVN_ERR_XML_MALFORMED)));
SWIG_Python_SetConstant(d, "SVN_ERR_XML_UNESCAPABLE_DATA",SWIG_From_long((long)(SVN_ERR_XML_UNESCAPABLE_DATA)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_XML_UNEXPECTED_ELEMENT",SWIG_From_long((long)(SVN_ERR_XML_UNEXPECTED_ELEMENT)));
SWIG_Python_SetConstant(d, "SVN_ERR_IO_INCONSISTENT_EOL",SWIG_From_long((long)(SVN_ERR_IO_INCONSISTENT_EOL)));
SWIG_Python_SetConstant(d, "SVN_ERR_IO_UNKNOWN_EOL",SWIG_From_long((long)(SVN_ERR_IO_UNKNOWN_EOL)));
SWIG_Python_SetConstant(d, "SVN_ERR_IO_CORRUPT_EOL",SWIG_From_long((long)(SVN_ERR_IO_CORRUPT_EOL)));
@@ -35246,6 +36311,7 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_STREAM_MALFORMED_DATA",SWIG_From_long((long)(SVN_ERR_STREAM_MALFORMED_DATA)));
SWIG_Python_SetConstant(d, "SVN_ERR_STREAM_UNRECOGNIZED_DATA",SWIG_From_long((long)(SVN_ERR_STREAM_UNRECOGNIZED_DATA)));
SWIG_Python_SetConstant(d, "SVN_ERR_STREAM_SEEK_NOT_SUPPORTED",SWIG_From_long((long)(SVN_ERR_STREAM_SEEK_NOT_SUPPORTED)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_STREAM_NOT_SUPPORTED",SWIG_From_long((long)(SVN_ERR_STREAM_NOT_SUPPORTED)));
SWIG_Python_SetConstant(d, "SVN_ERR_NODE_UNKNOWN_KIND",SWIG_From_long((long)(SVN_ERR_NODE_UNKNOWN_KIND)));
SWIG_Python_SetConstant(d, "SVN_ERR_NODE_UNEXPECTED_KIND",SWIG_From_long((long)(SVN_ERR_NODE_UNEXPECTED_KIND)));
SWIG_Python_SetConstant(d, "SVN_ERR_ENTRY_NOT_FOUND",SWIG_From_long((long)(SVN_ERR_ENTRY_NOT_FOUND)));
@@ -35350,6 +36416,17 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION",SWIG_From_long((long)(SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION)));
SWIG_Python_SetConstant(d, "SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE",SWIG_From_long((long)(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE)));
SWIG_Python_SetConstant(d, "SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE",SWIG_From_long((long)(SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_MALFORMED_TXN_ID",SWIG_From_long((long)(SVN_ERR_FS_MALFORMED_TXN_ID)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_INDEX_CORRUPTION",SWIG_From_long((long)(SVN_ERR_FS_INDEX_CORRUPTION)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_INDEX_REVISION",SWIG_From_long((long)(SVN_ERR_FS_INDEX_REVISION)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_INDEX_OVERFLOW",SWIG_From_long((long)(SVN_ERR_FS_INDEX_OVERFLOW)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_CONTAINER_INDEX",SWIG_From_long((long)(SVN_ERR_FS_CONTAINER_INDEX)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_INDEX_INCONSISTENT",SWIG_From_long((long)(SVN_ERR_FS_INDEX_INCONSISTENT)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_LOCK_OPERATION_FAILED",SWIG_From_long((long)(SVN_ERR_FS_LOCK_OPERATION_FAILED)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_UNSUPPORTED_TYPE",SWIG_From_long((long)(SVN_ERR_FS_UNSUPPORTED_TYPE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_CONTAINER_SIZE",SWIG_From_long((long)(SVN_ERR_FS_CONTAINER_SIZE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_MALFORMED_NODEREV_ID",SWIG_From_long((long)(SVN_ERR_FS_MALFORMED_NODEREV_ID)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_FS_INVALID_GENERATION",SWIG_From_long((long)(SVN_ERR_FS_INVALID_GENERATION)));
SWIG_Python_SetConstant(d, "SVN_ERR_REPOS_LOCKED",SWIG_From_long((long)(SVN_ERR_REPOS_LOCKED)));
SWIG_Python_SetConstant(d, "SVN_ERR_REPOS_HOOK_FAILURE",SWIG_From_long((long)(SVN_ERR_REPOS_HOOK_FAILURE)));
SWIG_Python_SetConstant(d, "SVN_ERR_REPOS_BAD_ARGS",SWIG_From_long((long)(SVN_ERR_REPOS_BAD_ARGS)));
@@ -35374,6 +36451,7 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH",SWIG_From_long((long)(SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_SESSION_URL_MISMATCH",SWIG_From_long((long)(SVN_ERR_RA_SESSION_URL_MISMATCH)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_CANNOT_CREATE_TUNNEL",SWIG_From_long((long)(SVN_ERR_RA_CANNOT_CREATE_TUNNEL)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_RA_CANNOT_CREATE_SESSION",SWIG_From_long((long)(SVN_ERR_RA_CANNOT_CREATE_SESSION)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_SOCK_INIT",SWIG_From_long((long)(SVN_ERR_RA_DAV_SOCK_INIT)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_CREATING_REQUEST",SWIG_From_long((long)(SVN_ERR_RA_DAV_CREATING_REQUEST)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_REQUEST_FAILED",SWIG_From_long((long)(SVN_ERR_RA_DAV_REQUEST_FAILED)));
@@ -35388,6 +36466,8 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_RELOCATED",SWIG_From_long((long)(SVN_ERR_RA_DAV_RELOCATED)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_CONN_TIMEOUT",SWIG_From_long((long)(SVN_ERR_RA_DAV_CONN_TIMEOUT)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_FORBIDDEN",SWIG_From_long((long)(SVN_ERR_RA_DAV_FORBIDDEN)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_PRECONDITION_FAILED",SWIG_From_long((long)(SVN_ERR_RA_DAV_PRECONDITION_FAILED)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED",SWIG_From_long((long)(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND",SWIG_From_long((long)(SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED",SWIG_From_long((long)(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED)));
SWIG_Python_SetConstant(d, "SVN_ERR_SVNDIFF_INVALID_HEADER",SWIG_From_long((long)(SVN_ERR_SVNDIFF_INVALID_HEADER)));
@@ -35464,6 +36544,11 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_TOO_MANY_MEMCACHED_SERVERS",SWIG_From_long((long)(SVN_ERR_TOO_MANY_MEMCACHED_SERVERS)));
SWIG_Python_SetConstant(d, "SVN_ERR_MALFORMED_VERSION_STRING",SWIG_From_long((long)(SVN_ERR_MALFORMED_VERSION_STRING)));
SWIG_Python_SetConstant(d, "SVN_ERR_CORRUPTED_ATOMIC_STORAGE",SWIG_From_long((long)(SVN_ERR_CORRUPTED_ATOMIC_STORAGE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_UTF8PROC_ERROR",SWIG_From_long((long)(SVN_ERR_UTF8PROC_ERROR)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_UTF8_GLOB",SWIG_From_long((long)(SVN_ERR_UTF8_GLOB)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_CORRUPT_PACKED_DATA",SWIG_From_long((long)(SVN_ERR_CORRUPT_PACKED_DATA)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_COMPOSED_ERROR",SWIG_From_long((long)(SVN_ERR_COMPOSED_ERROR)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_INVALID_INPUT",SWIG_From_long((long)(SVN_ERR_INVALID_INPUT)));
SWIG_Python_SetConstant(d, "SVN_ERR_CL_ARG_PARSING_ERROR",SWIG_From_long((long)(SVN_ERR_CL_ARG_PARSING_ERROR)));
SWIG_Python_SetConstant(d, "SVN_ERR_CL_INSUFFICIENT_ARGS",SWIG_From_long((long)(SVN_ERR_CL_INSUFFICIENT_ARGS)));
SWIG_Python_SetConstant(d, "SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS",SWIG_From_long((long)(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS)));
@@ -35476,6 +36561,7 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE",SWIG_From_long((long)(SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE)));
SWIG_Python_SetConstant(d, "SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL",SWIG_From_long((long)(SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)));
SWIG_Python_SetConstant(d, "SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS",SWIG_From_long((long)(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_CL_REPOS_VERIFY_FAILED",SWIG_From_long((long)(SVN_ERR_CL_REPOS_VERIFY_FAILED)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_SVN_CMD_ERR",SWIG_From_long((long)(SVN_ERR_RA_SVN_CMD_ERR)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_SVN_UNKNOWN_CMD",SWIG_From_long((long)(SVN_ERR_RA_SVN_UNKNOWN_CMD)));
SWIG_Python_SetConstant(d, "SVN_ERR_RA_SVN_CONNECTION_CLOSED",SWIG_From_long((long)(SVN_ERR_RA_SVN_CONNECTION_CLOSED)));
@@ -35502,6 +36588,26 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_ERR_RA_SERF_WRAPPED_ERROR",SWIG_From_long((long)(SVN_ERR_RA_SERF_WRAPPED_ERROR)));
SWIG_Python_SetConstant(d, "SVN_ERR_ASSERTION_FAIL",SWIG_From_long((long)(SVN_ERR_ASSERTION_FAIL)));
SWIG_Python_SetConstant(d, "SVN_ERR_ASSERTION_ONLY_TRACING_LINKS",SWIG_From_long((long)(SVN_ERR_ASSERTION_ONLY_TRACING_LINKS)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_ASN1_OUT_OF_DATA",SWIG_From_long((long)(SVN_ERR_ASN1_OUT_OF_DATA)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_ASN1_UNEXPECTED_TAG",SWIG_From_long((long)(SVN_ERR_ASN1_UNEXPECTED_TAG)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_ASN1_INVALID_LENGTH",SWIG_From_long((long)(SVN_ERR_ASN1_INVALID_LENGTH)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_ASN1_LENGTH_MISMATCH",SWIG_From_long((long)(SVN_ERR_ASN1_LENGTH_MISMATCH)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_ASN1_INVALID_DATA",SWIG_From_long((long)(SVN_ERR_ASN1_INVALID_DATA)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_FEATURE_UNAVAILABLE",SWIG_From_long((long)(SVN_ERR_X509_FEATURE_UNAVAILABLE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_PEM",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_PEM)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_FORMAT",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_FORMAT)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_VERSION",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_VERSION)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_SERIAL",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_SERIAL)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_ALG",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_ALG)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_NAME",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_NAME)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_DATE",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_DATE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_PUBKEY",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_PUBKEY)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_SIGNATURE",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_SIGNATURE)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_INVALID_EXTENSIONS",SWIG_From_long((long)(SVN_ERR_X509_CERT_INVALID_EXTENSIONS)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_UNKNOWN_VERSION",SWIG_From_long((long)(SVN_ERR_X509_CERT_UNKNOWN_VERSION)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_UNKNOWN_PK_ALG",SWIG_From_long((long)(SVN_ERR_X509_CERT_UNKNOWN_PK_ALG)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_SIG_MISMATCH",SWIG_From_long((long)(SVN_ERR_X509_CERT_SIG_MISMATCH)));
+ SWIG_Python_SetConstant(d, "SVN_ERR_X509_CERT_VERIFY_FAILED",SWIG_From_long((long)(SVN_ERR_X509_CERT_VERIFY_FAILED)));
SWIG_Python_SetConstant(d, "SVN_ERR_LAST",SWIG_From_long((long)(SVN_ERR_LAST)));
SWIG_Python_SetConstant(d, "SVN_UNALIGNED_ACCESS_IS_OK",SWIG_From_long((long)(0)));
SWIG_Python_SetConstant(d, "TRUE",SWIG_From_long((long)(1)));
@@ -35545,16 +36651,16 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN__STREAM_CHUNK_SIZE",SWIG_From_long((long)(16384)));
SWIG_Python_SetConstant(d, "SVN_ALLOCATOR_RECOMMENDED_MAX_FREE",SWIG_From_long((long)((4096*1024))));
SWIG_Python_SetConstant(d, "SVN_VER_MAJOR",SWIG_From_long((long)(1)));
- SWIG_Python_SetConstant(d, "SVN_VER_MINOR",SWIG_From_long((long)(8)));
- SWIG_Python_SetConstant(d, "SVN_VER_PATCH",SWIG_From_long((long)(13)));
- SWIG_Python_SetConstant(d, "SVN_VER_MICRO",SWIG_From_long((long)(13)));
+ SWIG_Python_SetConstant(d, "SVN_VER_MINOR",SWIG_From_long((long)(9)));
+ SWIG_Python_SetConstant(d, "SVN_VER_PATCH",SWIG_From_long((long)(7)));
+ SWIG_Python_SetConstant(d, "SVN_VER_MICRO",SWIG_From_long((long)(7)));
SWIG_Python_SetConstant(d, "SVN_VER_LIBRARY",SWIG_From_long((long)(1)));
- SWIG_Python_SetConstant(d, "SVN_VER_TAG",SWIG_FromCharPtr(" (r1667537)"));
+ SWIG_Python_SetConstant(d, "SVN_VER_TAG",SWIG_FromCharPtr(" (r1800392)"));
SWIG_Python_SetConstant(d, "SVN_VER_NUMTAG",SWIG_FromCharPtr(""));
- SWIG_Python_SetConstant(d, "SVN_VER_REVISION",SWIG_From_long((long)(1667537)));
- SWIG_Python_SetConstant(d, "SVN_VER_NUM",SWIG_FromCharPtr("1.8.13"));
- SWIG_Python_SetConstant(d, "SVN_VER_NUMBER",SWIG_FromCharPtr("1.8.13"));
- SWIG_Python_SetConstant(d, "SVN_VERSION",SWIG_FromCharPtr("1.8.13 (r1667537)"));
+ SWIG_Python_SetConstant(d, "SVN_VER_REVISION",SWIG_From_long((long)(1800392)));
+ SWIG_Python_SetConstant(d, "SVN_VER_NUM",SWIG_FromCharPtr("1.9.7"));
+ SWIG_Python_SetConstant(d, "SVN_VER_NUMBER",SWIG_FromCharPtr("1.9.7"));
+ SWIG_Python_SetConstant(d, "SVN_VERSION",SWIG_FromCharPtr("1.9.7 (r1800392)"));
SWIG_Python_SetConstant(d, "svn_prop_entry_kind",SWIG_From_long((long)(svn_prop_entry_kind)));
SWIG_Python_SetConstant(d, "svn_prop_wc_kind",SWIG_From_long((long)(svn_prop_wc_kind)));
SWIG_Python_SetConstant(d, "svn_prop_regular_kind",SWIG_From_long((long)(svn_prop_regular_kind)));
@@ -35666,6 +36772,9 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_USERNAME",SWIG_FromCharPtr("username"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_HTTP_BULK_UPDATES",SWIG_FromCharPtr("http-bulk-updates"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS",SWIG_FromCharPtr("http-max-connections"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS",SWIG_FromCharPtr("http-chunked-requests"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS",SWIG_FromCharPtr("serf-log-components"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_SERF_LOG_LEVEL",SWIG_FromCharPtr("serf-log-level"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_CATEGORY_CONFIG",SWIG_FromCharPtr("config"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_AUTH",SWIG_FromCharPtr("auth"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_PASSWORD_STORES",SWIG_FromCharPtr("password-stores"));
@@ -35685,16 +36794,19 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_USE_COMMIT_TIMES",SWIG_FromCharPtr("use-commit-times"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_TEMPLATE_ROOT",SWIG_FromCharPtr("template-root"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS",SWIG_FromCharPtr("enable-auto-props"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE",SWIG_FromCharPtr("enable-magic-file"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_NO_UNLOCK",SWIG_FromCharPtr("no-unlock"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_MIMETYPES_FILE",SWIG_FromCharPtr("mime-types-file"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_PRESERVED_CF_EXTS",SWIG_FromCharPtr("preserved-conflict-file-exts"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS",SWIG_FromCharPtr("interactive-conflicts"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE",SWIG_FromCharPtr("memory-cache-size"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE",SWIG_FromCharPtr("diff-ignore-content-type"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_TUNNELS",SWIG_FromCharPtr("tunnels"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_AUTO_PROPS",SWIG_FromCharPtr("auto-props"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_WORKING_COPY",SWIG_FromCharPtr("working-copy"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE",SWIG_FromCharPtr("exclusive-locking"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS",SWIG_FromCharPtr("exclusive-locking-clients"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT",SWIG_FromCharPtr("busy-timeout"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_GENERAL",SWIG_FromCharPtr("general"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_ANON_ACCESS",SWIG_FromCharPtr("anon-access"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_AUTH_ACCESS",SWIG_FromCharPtr("auth-access"));
@@ -35710,8 +36822,8 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_CONFIG_OPTION_MAX_SSF",SWIG_FromCharPtr("max-encryption"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_SECTION_USERS",SWIG_FromCharPtr("users"));
SWIG_Python_SetConstant(d, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1",SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__"));
- SWIG_Python_SetConstant(d, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2",SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store"));
- SWIG_Python_SetConstant(d, "SVN_CONFIG_DEFAULT_GLOBAL_IGNORES",SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2",SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_DEFAULT_GLOBAL_IGNORES",SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_TRUE",SWIG_FromCharPtr("TRUE"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_FALSE",SWIG_FromCharPtr("FALSE"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_ASK",SWIG_FromCharPtr("ASK"));
@@ -35722,6 +36834,12 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT",SWIG_FromCharPtr("ASK"));
SWIG_Python_SetConstant(d, "SVN_CONFIG_DEFAULT_OPTION_HTTP_MAX_CONNECTIONS",SWIG_From_long((long)(4)));
SWIG_Python_SetConstant(d, "SVN_CONFIG_REALMSTRING_KEY",SWIG_FromCharPtr("svn:realmstring"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_USERNAME_KEY",SWIG_FromCharPtr("username"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_PASSWORD_KEY",SWIG_FromCharPtr("password"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_PASSPHRASE_KEY",SWIG_FromCharPtr("passphrase"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_PASSTYPE_KEY",SWIG_FromCharPtr("passtype"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_ASCII_CERT_KEY",SWIG_FromCharPtr("ascii_cert"));
+ SWIG_Python_SetConstant(d, "SVN_CONFIG_AUTHN_FAILURES_KEY",SWIG_FromCharPtr("failures"));
SWIG_Python_SetConstant(d, "SVN_MERGEINFO_NONINHERITABLE_STR",SWIG_FromCharPtr("*"));
SWIG_Python_SetConstant(d, "svn_mergeinfo_explicit",SWIG_From_long((long)(svn_mergeinfo_explicit)));
SWIG_Python_SetConstant(d, "svn_mergeinfo_inherited",SWIG_From_long((long)(svn_mergeinfo_inherited)));
@@ -35731,6 +36849,8 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "svn_io_file_del_on_pool_cleanup",SWIG_From_long((long)(svn_io_file_del_on_pool_cleanup)));
SWIG_Python_SetConstant(d, "svn_checksum_md5",SWIG_From_long((long)(svn_checksum_md5)));
SWIG_Python_SetConstant(d, "svn_checksum_sha1",SWIG_From_long((long)(svn_checksum_sha1)));
+ SWIG_Python_SetConstant(d, "svn_checksum_fnv1a_32",SWIG_From_long((long)(svn_checksum_fnv1a_32)));
+ SWIG_Python_SetConstant(d, "svn_checksum_fnv1a_32x4",SWIG_From_long((long)(svn_checksum_fnv1a_32x4)));
/* Theoretically, we should be checking for errors here,
but I do not know of any useful way to signal an error to Python
diff --git a/subversion/bindings/swig/python/core.py b/subversion/bindings/swig/python/core.py
index 19a2b17..6f46fce 100644
--- a/subversion/bindings/swig/python/core.py
+++ b/subversion/bindings/swig/python/core.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -132,11 +134,13 @@ SVN_ERR_BAD_CHECKSUM_PARSE = _core.SVN_ERR_BAD_CHECKSUM_PARSE
SVN_ERR_BAD_TOKEN = _core.SVN_ERR_BAD_TOKEN
SVN_ERR_BAD_CHANGELIST_NAME = _core.SVN_ERR_BAD_CHANGELIST_NAME
SVN_ERR_BAD_ATOMIC = _core.SVN_ERR_BAD_ATOMIC
+SVN_ERR_BAD_COMPRESSION_METHOD = _core.SVN_ERR_BAD_COMPRESSION_METHOD
SVN_ERR_XML_ATTRIB_NOT_FOUND = _core.SVN_ERR_XML_ATTRIB_NOT_FOUND
SVN_ERR_XML_MISSING_ANCESTRY = _core.SVN_ERR_XML_MISSING_ANCESTRY
SVN_ERR_XML_UNKNOWN_ENCODING = _core.SVN_ERR_XML_UNKNOWN_ENCODING
SVN_ERR_XML_MALFORMED = _core.SVN_ERR_XML_MALFORMED
SVN_ERR_XML_UNESCAPABLE_DATA = _core.SVN_ERR_XML_UNESCAPABLE_DATA
+SVN_ERR_XML_UNEXPECTED_ELEMENT = _core.SVN_ERR_XML_UNEXPECTED_ELEMENT
SVN_ERR_IO_INCONSISTENT_EOL = _core.SVN_ERR_IO_INCONSISTENT_EOL
SVN_ERR_IO_UNKNOWN_EOL = _core.SVN_ERR_IO_UNKNOWN_EOL
SVN_ERR_IO_CORRUPT_EOL = _core.SVN_ERR_IO_CORRUPT_EOL
@@ -149,6 +153,7 @@ SVN_ERR_STREAM_UNEXPECTED_EOF = _core.SVN_ERR_STREAM_UNEXPECTED_EOF
SVN_ERR_STREAM_MALFORMED_DATA = _core.SVN_ERR_STREAM_MALFORMED_DATA
SVN_ERR_STREAM_UNRECOGNIZED_DATA = _core.SVN_ERR_STREAM_UNRECOGNIZED_DATA
SVN_ERR_STREAM_SEEK_NOT_SUPPORTED = _core.SVN_ERR_STREAM_SEEK_NOT_SUPPORTED
+SVN_ERR_STREAM_NOT_SUPPORTED = _core.SVN_ERR_STREAM_NOT_SUPPORTED
SVN_ERR_NODE_UNKNOWN_KIND = _core.SVN_ERR_NODE_UNKNOWN_KIND
SVN_ERR_NODE_UNEXPECTED_KIND = _core.SVN_ERR_NODE_UNEXPECTED_KIND
SVN_ERR_ENTRY_NOT_FOUND = _core.SVN_ERR_ENTRY_NOT_FOUND
@@ -253,6 +258,17 @@ SVN_ERR_FS_PROP_BASEVALUE_MISMATCH = _core.SVN_ERR_FS_PROP_BASEVALUE_MISMATCH
SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION = _core.SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION
SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE = _core.SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE
SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE = _core.SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE
+SVN_ERR_FS_MALFORMED_TXN_ID = _core.SVN_ERR_FS_MALFORMED_TXN_ID
+SVN_ERR_FS_INDEX_CORRUPTION = _core.SVN_ERR_FS_INDEX_CORRUPTION
+SVN_ERR_FS_INDEX_REVISION = _core.SVN_ERR_FS_INDEX_REVISION
+SVN_ERR_FS_INDEX_OVERFLOW = _core.SVN_ERR_FS_INDEX_OVERFLOW
+SVN_ERR_FS_CONTAINER_INDEX = _core.SVN_ERR_FS_CONTAINER_INDEX
+SVN_ERR_FS_INDEX_INCONSISTENT = _core.SVN_ERR_FS_INDEX_INCONSISTENT
+SVN_ERR_FS_LOCK_OPERATION_FAILED = _core.SVN_ERR_FS_LOCK_OPERATION_FAILED
+SVN_ERR_FS_UNSUPPORTED_TYPE = _core.SVN_ERR_FS_UNSUPPORTED_TYPE
+SVN_ERR_FS_CONTAINER_SIZE = _core.SVN_ERR_FS_CONTAINER_SIZE
+SVN_ERR_FS_MALFORMED_NODEREV_ID = _core.SVN_ERR_FS_MALFORMED_NODEREV_ID
+SVN_ERR_FS_INVALID_GENERATION = _core.SVN_ERR_FS_INVALID_GENERATION
SVN_ERR_REPOS_LOCKED = _core.SVN_ERR_REPOS_LOCKED
SVN_ERR_REPOS_HOOK_FAILURE = _core.SVN_ERR_REPOS_HOOK_FAILURE
SVN_ERR_REPOS_BAD_ARGS = _core.SVN_ERR_REPOS_BAD_ARGS
@@ -277,6 +293,7 @@ SVN_ERR_RA_UUID_MISMATCH = _core.SVN_ERR_RA_UUID_MISMATCH
SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH = _core.SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH
SVN_ERR_RA_SESSION_URL_MISMATCH = _core.SVN_ERR_RA_SESSION_URL_MISMATCH
SVN_ERR_RA_CANNOT_CREATE_TUNNEL = _core.SVN_ERR_RA_CANNOT_CREATE_TUNNEL
+SVN_ERR_RA_CANNOT_CREATE_SESSION = _core.SVN_ERR_RA_CANNOT_CREATE_SESSION
SVN_ERR_RA_DAV_SOCK_INIT = _core.SVN_ERR_RA_DAV_SOCK_INIT
SVN_ERR_RA_DAV_CREATING_REQUEST = _core.SVN_ERR_RA_DAV_CREATING_REQUEST
SVN_ERR_RA_DAV_REQUEST_FAILED = _core.SVN_ERR_RA_DAV_REQUEST_FAILED
@@ -291,6 +308,8 @@ SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS = _core.SVN_ERR_RA_DAV_RESPONSE_HEADER_BA
SVN_ERR_RA_DAV_RELOCATED = _core.SVN_ERR_RA_DAV_RELOCATED
SVN_ERR_RA_DAV_CONN_TIMEOUT = _core.SVN_ERR_RA_DAV_CONN_TIMEOUT
SVN_ERR_RA_DAV_FORBIDDEN = _core.SVN_ERR_RA_DAV_FORBIDDEN
+SVN_ERR_RA_DAV_PRECONDITION_FAILED = _core.SVN_ERR_RA_DAV_PRECONDITION_FAILED
+SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED = _core.SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED
SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND = _core.SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND
SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED = _core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED
SVN_ERR_SVNDIFF_INVALID_HEADER = _core.SVN_ERR_SVNDIFF_INVALID_HEADER
@@ -367,6 +386,11 @@ SVN_ERR_SQLITE_CONSTRAINT = _core.SVN_ERR_SQLITE_CONSTRAINT
SVN_ERR_TOO_MANY_MEMCACHED_SERVERS = _core.SVN_ERR_TOO_MANY_MEMCACHED_SERVERS
SVN_ERR_MALFORMED_VERSION_STRING = _core.SVN_ERR_MALFORMED_VERSION_STRING
SVN_ERR_CORRUPTED_ATOMIC_STORAGE = _core.SVN_ERR_CORRUPTED_ATOMIC_STORAGE
+SVN_ERR_UTF8PROC_ERROR = _core.SVN_ERR_UTF8PROC_ERROR
+SVN_ERR_UTF8_GLOB = _core.SVN_ERR_UTF8_GLOB
+SVN_ERR_CORRUPT_PACKED_DATA = _core.SVN_ERR_CORRUPT_PACKED_DATA
+SVN_ERR_COMPOSED_ERROR = _core.SVN_ERR_COMPOSED_ERROR
+SVN_ERR_INVALID_INPUT = _core.SVN_ERR_INVALID_INPUT
SVN_ERR_CL_ARG_PARSING_ERROR = _core.SVN_ERR_CL_ARG_PARSING_ERROR
SVN_ERR_CL_INSUFFICIENT_ARGS = _core.SVN_ERR_CL_INSUFFICIENT_ARGS
SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS = _core.SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS
@@ -379,6 +403,7 @@ SVN_ERR_CL_BAD_LOG_MESSAGE = _core.SVN_ERR_CL_BAD_LOG_MESSAGE
SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE = _core.SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE
SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL = _core.SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL
SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS = _core.SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS
+SVN_ERR_CL_REPOS_VERIFY_FAILED = _core.SVN_ERR_CL_REPOS_VERIFY_FAILED
SVN_ERR_RA_SVN_CMD_ERR = _core.SVN_ERR_RA_SVN_CMD_ERR
SVN_ERR_RA_SVN_UNKNOWN_CMD = _core.SVN_ERR_RA_SVN_UNKNOWN_CMD
SVN_ERR_RA_SVN_CONNECTION_CLOSED = _core.SVN_ERR_RA_SVN_CONNECTION_CLOSED
@@ -405,6 +430,26 @@ SVN_ERR_RA_SERF_GSSAPI_INITIALISATION_FAILED = _core.SVN_ERR_RA_SERF_GSSAPI_INIT
SVN_ERR_RA_SERF_WRAPPED_ERROR = _core.SVN_ERR_RA_SERF_WRAPPED_ERROR
SVN_ERR_ASSERTION_FAIL = _core.SVN_ERR_ASSERTION_FAIL
SVN_ERR_ASSERTION_ONLY_TRACING_LINKS = _core.SVN_ERR_ASSERTION_ONLY_TRACING_LINKS
+SVN_ERR_ASN1_OUT_OF_DATA = _core.SVN_ERR_ASN1_OUT_OF_DATA
+SVN_ERR_ASN1_UNEXPECTED_TAG = _core.SVN_ERR_ASN1_UNEXPECTED_TAG
+SVN_ERR_ASN1_INVALID_LENGTH = _core.SVN_ERR_ASN1_INVALID_LENGTH
+SVN_ERR_ASN1_LENGTH_MISMATCH = _core.SVN_ERR_ASN1_LENGTH_MISMATCH
+SVN_ERR_ASN1_INVALID_DATA = _core.SVN_ERR_ASN1_INVALID_DATA
+SVN_ERR_X509_FEATURE_UNAVAILABLE = _core.SVN_ERR_X509_FEATURE_UNAVAILABLE
+SVN_ERR_X509_CERT_INVALID_PEM = _core.SVN_ERR_X509_CERT_INVALID_PEM
+SVN_ERR_X509_CERT_INVALID_FORMAT = _core.SVN_ERR_X509_CERT_INVALID_FORMAT
+SVN_ERR_X509_CERT_INVALID_VERSION = _core.SVN_ERR_X509_CERT_INVALID_VERSION
+SVN_ERR_X509_CERT_INVALID_SERIAL = _core.SVN_ERR_X509_CERT_INVALID_SERIAL
+SVN_ERR_X509_CERT_INVALID_ALG = _core.SVN_ERR_X509_CERT_INVALID_ALG
+SVN_ERR_X509_CERT_INVALID_NAME = _core.SVN_ERR_X509_CERT_INVALID_NAME
+SVN_ERR_X509_CERT_INVALID_DATE = _core.SVN_ERR_X509_CERT_INVALID_DATE
+SVN_ERR_X509_CERT_INVALID_PUBKEY = _core.SVN_ERR_X509_CERT_INVALID_PUBKEY
+SVN_ERR_X509_CERT_INVALID_SIGNATURE = _core.SVN_ERR_X509_CERT_INVALID_SIGNATURE
+SVN_ERR_X509_CERT_INVALID_EXTENSIONS = _core.SVN_ERR_X509_CERT_INVALID_EXTENSIONS
+SVN_ERR_X509_CERT_UNKNOWN_VERSION = _core.SVN_ERR_X509_CERT_UNKNOWN_VERSION
+SVN_ERR_X509_CERT_UNKNOWN_PK_ALG = _core.SVN_ERR_X509_CERT_UNKNOWN_PK_ALG
+SVN_ERR_X509_CERT_SIG_MISMATCH = _core.SVN_ERR_X509_CERT_SIG_MISMATCH
+SVN_ERR_X509_CERT_VERIFY_FAILED = _core.SVN_ERR_X509_CERT_VERIFY_FAILED
SVN_ERR_LAST = _core.SVN_ERR_LAST
def svn_time_to_cstring(*args):
@@ -447,7 +492,7 @@ class svn_error_t:
__swig_setmethods__["line"] = _core.svn_error_t_line_set
__swig_getmethods__["line"] = _core.svn_error_t_line_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_error_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -466,13 +511,13 @@ class svn_error_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -481,9 +526,9 @@ class svn_error_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -498,18 +543,6 @@ class svn_error_t:
svn_error_t_swigregister = _core.svn_error_t_swigregister
svn_error_t_swigregister(svn_error_t)
-
-def svn__apr_hash_index_key(*args):
- """svn__apr_hash_index_key(apr_hash_index_t const * hi) -> void const *"""
- return _core.svn__apr_hash_index_key(*args)
-
-def svn__apr_hash_index_klen(*args):
- """svn__apr_hash_index_klen(apr_hash_index_t const * hi) -> apr_ssize_t"""
- return _core.svn__apr_hash_index_klen(*args)
-
-def svn__apr_hash_index_val(*args):
- """svn__apr_hash_index_val(apr_hash_index_t const * hi) -> void *"""
- return _core.svn__apr_hash_index_val(*args)
svn_node_none = _core.svn_node_none
svn_node_file = _core.svn_node_file
svn_node_dir = _core.svn_node_dir
@@ -580,7 +613,7 @@ class svn_dirent_t:
__swig_getmethods__["time"] = _core.svn_dirent_t_time_get
__swig_getmethods__["last_author"] = _core.svn_dirent_t_last_author_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_dirent_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -599,13 +632,13 @@ class svn_dirent_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -614,9 +647,9 @@ class svn_dirent_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -669,7 +702,7 @@ class svn_commit_info_t:
__swig_setmethods__["repos_root"] = _core.svn_commit_info_t_repos_root_set
__swig_getmethods__["repos_root"] = _core.svn_commit_info_t_repos_root_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_commit_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -688,13 +721,13 @@ class svn_commit_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -703,9 +736,9 @@ class svn_commit_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -748,7 +781,7 @@ class svn_log_changed_path2_t:
__swig_setmethods__["props_modified"] = _core.svn_log_changed_path2_t_props_modified_set
__swig_getmethods__["props_modified"] = _core.svn_log_changed_path2_t_props_modified_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_log_changed_path2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -767,13 +800,13 @@ class svn_log_changed_path2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -782,9 +815,9 @@ class svn_log_changed_path2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -820,7 +853,7 @@ class svn_log_changed_path_t:
__swig_setmethods__["copyfrom_rev"] = _core.svn_log_changed_path_t_copyfrom_rev_set
__swig_getmethods__["copyfrom_rev"] = _core.svn_log_changed_path_t_copyfrom_rev_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_log_changed_path_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -839,13 +872,13 @@ class svn_log_changed_path_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -854,9 +887,9 @@ class svn_log_changed_path_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -897,7 +930,7 @@ class svn_log_entry_t:
__swig_setmethods__["subtractive_merge"] = _core.svn_log_entry_t_subtractive_merge_set
__swig_getmethods__["subtractive_merge"] = _core.svn_log_entry_t_subtractive_merge_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_log_entry_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -916,13 +949,13 @@ class svn_log_entry_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -931,9 +964,9 @@ class svn_log_entry_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -988,7 +1021,7 @@ class svn_lock_t:
__swig_setmethods__["expiration_date"] = _core.svn_lock_t_expiration_date_set
__swig_getmethods__["expiration_date"] = _core.svn_lock_t_expiration_date_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_lock_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1007,13 +1040,13 @@ class svn_lock_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1022,9 +1055,9 @@ class svn_lock_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1065,7 +1098,7 @@ class svn_merge_range_t:
__swig_setmethods__["inheritable"] = _core.svn_merge_range_t_inheritable_set
__swig_getmethods__["inheritable"] = _core.svn_merge_range_t_inheritable_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_merge_range_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1084,13 +1117,13 @@ class svn_merge_range_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1099,9 +1132,9 @@ class svn_merge_range_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1138,7 +1171,7 @@ class svn_location_segment_t:
__swig_setmethods__["path"] = _core.svn_location_segment_t_path_set
__swig_getmethods__["path"] = _core.svn_location_segment_t_path_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_location_segment_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1157,13 +1190,13 @@ class svn_location_segment_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1172,9 +1205,9 @@ class svn_location_segment_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1202,7 +1235,7 @@ class svn_version_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1221,13 +1254,13 @@ class svn_version_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1236,9 +1269,9 @@ class svn_version_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1289,7 +1322,7 @@ class svn_log_entry_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_log_entry_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1308,13 +1341,13 @@ class svn_log_entry_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1323,9 +1356,9 @@ class svn_log_entry_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1345,7 +1378,7 @@ class svn_log_message_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_log_message_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1364,13 +1397,13 @@ class svn_log_message_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1379,9 +1412,9 @@ class svn_log_message_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1401,7 +1434,7 @@ class svn_commit_callback2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_commit_callback2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1420,13 +1453,13 @@ class svn_commit_callback2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1435,9 +1468,9 @@ class svn_commit_callback2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1457,7 +1490,7 @@ class svn_commit_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_commit_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1476,13 +1509,13 @@ class svn_commit_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1491,9 +1524,9 @@ class svn_commit_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1513,7 +1546,7 @@ class svn_cancel_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_cancel_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1532,13 +1565,13 @@ class svn_cancel_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1547,9 +1580,9 @@ class svn_cancel_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1569,7 +1602,7 @@ class svn_location_segment_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_location_segment_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1588,13 +1621,13 @@ class svn_location_segment_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1603,9 +1636,9 @@ class svn_location_segment_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1656,7 +1689,7 @@ class svn_version_checklist_t:
__swig_setmethods__["version_query"] = _core.svn_version_checklist_t_version_query_set
__swig_getmethods__["version_query"] = _core.svn_version_checklist_t_version_query_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_checklist_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1675,13 +1708,13 @@ class svn_version_checklist_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1690,9 +1723,9 @@ class svn_version_checklist_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1711,6 +1744,10 @@ svn_version_checklist_t_swigregister = _core.svn_version_checklist_t_swigregiste
svn_version_checklist_t_swigregister(svn_version_checklist_t)
+def svn_ver_check_list2(*args):
+ """svn_ver_check_list2(svn_version_t const * my_version, svn_version_checklist_t checklist, svn_boolean_t (*)(svn_version_t const *,svn_version_t const *) comparator) -> svn_error_t"""
+ return _core.svn_ver_check_list2(*args)
+
def svn_ver_check_list(*args):
"""svn_ver_check_list(svn_version_t const * my_version, svn_version_checklist_t checklist) -> svn_error_t"""
return _core.svn_ver_check_list(*args)
@@ -1760,7 +1797,7 @@ class svn_version_ext_linked_lib_t:
__swig_setmethods__["runtime_version"] = _core.svn_version_ext_linked_lib_t_runtime_version_set
__swig_getmethods__["runtime_version"] = _core.svn_version_ext_linked_lib_t_runtime_version_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_ext_linked_lib_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1779,13 +1816,13 @@ class svn_version_ext_linked_lib_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1794,9 +1831,9 @@ class svn_version_ext_linked_lib_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1827,7 +1864,7 @@ class svn_version_ext_loaded_lib_t:
__swig_setmethods__["version"] = _core.svn_version_ext_loaded_lib_t_version_set
__swig_getmethods__["version"] = _core.svn_version_ext_loaded_lib_t_version_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_ext_loaded_lib_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1846,13 +1883,13 @@ class svn_version_ext_loaded_lib_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1861,9 +1898,9 @@ class svn_version_ext_loaded_lib_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1891,7 +1928,7 @@ class svn_version_extended_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_extended_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1910,13 +1947,13 @@ class svn_version_extended_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1925,9 +1962,9 @@ class svn_version_extended_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1952,7 +1989,7 @@ class svn_version_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_version_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1971,13 +2008,13 @@ class svn_version_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1986,9 +2023,9 @@ class svn_version_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2019,7 +2056,7 @@ class svn_prop_inherited_item_t:
__swig_setmethods__["prop_hash"] = _core.svn_prop_inherited_item_t_prop_hash_set
__swig_getmethods__["prop_hash"] = _core.svn_prop_inherited_item_t_prop_hash_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_prop_inherited_item_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2038,13 +2075,13 @@ class svn_prop_inherited_item_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2053,9 +2090,9 @@ class svn_prop_inherited_item_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2206,7 +2243,7 @@ class svn_opt_subcommand_desc2_t:
__swig_getmethods__["valid_options"] = _core.svn_opt_subcommand_desc2_t_valid_options_get
__swig_getmethods__["desc_overrides"] = _core.svn_opt_subcommand_desc2_t_desc_overrides_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_opt_subcommand_desc2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2225,13 +2262,13 @@ class svn_opt_subcommand_desc2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2240,9 +2277,9 @@ class svn_opt_subcommand_desc2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2296,7 +2333,7 @@ class svn_opt_subcommand_desc_t:
__swig_setmethods__["valid_options"] = _core.svn_opt_subcommand_desc_t_valid_options_set
__swig_getmethods__["valid_options"] = _core.svn_opt_subcommand_desc_t_valid_options_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_opt_subcommand_desc_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2315,13 +2352,13 @@ class svn_opt_subcommand_desc_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2330,9 +2367,9 @@ class svn_opt_subcommand_desc_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2430,7 +2467,7 @@ class svn_opt_revision_value_t:
__swig_setmethods__["date"] = _core.svn_opt_revision_value_t_date_set
__swig_getmethods__["date"] = _core.svn_opt_revision_value_t_date_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_opt_revision_value_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2449,13 +2486,13 @@ class svn_opt_revision_value_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2464,9 +2501,9 @@ class svn_opt_revision_value_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2493,7 +2530,7 @@ class svn_opt_revision_t:
__swig_setmethods__["value"] = _core.svn_opt_revision_t_value_set
__swig_getmethods__["value"] = _core.svn_opt_revision_t_value_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_opt_revision_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2512,13 +2549,13 @@ class svn_opt_revision_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2527,9 +2564,9 @@ class svn_opt_revision_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2556,7 +2593,7 @@ class svn_opt_revision_range_t:
__swig_setmethods__["end"] = _core.svn_opt_revision_range_t_end_set
__swig_getmethods__["end"] = _core.svn_opt_revision_range_t_end_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_opt_revision_range_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2575,13 +2612,13 @@ class svn_opt_revision_range_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2590,9 +2627,9 @@ class svn_opt_revision_range_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2694,6 +2731,17 @@ def svn_cmdline_init(*args):
"""svn_cmdline_init(char const * progname, FILE * error_stream) -> int"""
return _core.svn_cmdline_init(*args)
+def svn_cmdline_create_auth_baton2(*args):
+ """
+ svn_cmdline_create_auth_baton2(svn_boolean_t non_interactive, char const * username, char const * password, char const * 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,
+ apr_pool_t pool) -> svn_error_t
+ """
+ return _core.svn_cmdline_create_auth_baton2(*args)
+
def svn_cmdline_create_auth_baton(*args):
"""
svn_cmdline_create_auth_baton(svn_boolean_t non_interactive, char const * username, char const * password, char const * config_dir,
@@ -2717,7 +2765,7 @@ class svn_auth_provider_t:
__swig_setmethods__["save_credentials"] = _core.svn_auth_provider_t_save_credentials_set
__swig_getmethods__["save_credentials"] = _core.svn_auth_provider_t_save_credentials_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_provider_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2736,13 +2784,13 @@ class svn_auth_provider_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2751,9 +2799,9 @@ class svn_auth_provider_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2789,7 +2837,7 @@ class svn_auth_provider_object_t:
__swig_setmethods__["provider_baton"] = _core.svn_auth_provider_object_t_provider_baton_set
__swig_getmethods__["provider_baton"] = _core.svn_auth_provider_object_t_provider_baton_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_provider_object_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2808,13 +2856,13 @@ class svn_auth_provider_object_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2823,9 +2871,9 @@ class svn_auth_provider_object_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2855,7 +2903,7 @@ class svn_auth_cred_simple_t:
__swig_setmethods__["may_save"] = _core.svn_auth_cred_simple_t_may_save_set
__swig_getmethods__["may_save"] = _core.svn_auth_cred_simple_t_may_save_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_cred_simple_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2874,13 +2922,13 @@ class svn_auth_cred_simple_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2889,9 +2937,9 @@ class svn_auth_cred_simple_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2919,7 +2967,7 @@ class svn_auth_cred_username_t:
__swig_setmethods__["may_save"] = _core.svn_auth_cred_username_t_may_save_set
__swig_getmethods__["may_save"] = _core.svn_auth_cred_username_t_may_save_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_cred_username_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2938,13 +2986,13 @@ class svn_auth_cred_username_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2953,9 +3001,9 @@ class svn_auth_cred_username_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2983,7 +3031,7 @@ class svn_auth_cred_ssl_client_cert_t:
__swig_setmethods__["may_save"] = _core.svn_auth_cred_ssl_client_cert_t_may_save_set
__swig_getmethods__["may_save"] = _core.svn_auth_cred_ssl_client_cert_t_may_save_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_cred_ssl_client_cert_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3002,13 +3050,13 @@ class svn_auth_cred_ssl_client_cert_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3017,9 +3065,9 @@ class svn_auth_cred_ssl_client_cert_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3047,7 +3095,7 @@ class svn_auth_cred_ssl_client_cert_pw_t:
__swig_setmethods__["may_save"] = _core.svn_auth_cred_ssl_client_cert_pw_t_may_save_set
__swig_getmethods__["may_save"] = _core.svn_auth_cred_ssl_client_cert_pw_t_may_save_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_cred_ssl_client_cert_pw_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3066,13 +3114,13 @@ class svn_auth_cred_ssl_client_cert_pw_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3081,9 +3129,9 @@ class svn_auth_cred_ssl_client_cert_pw_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3119,7 +3167,7 @@ class svn_auth_ssl_server_cert_info_t:
__swig_setmethods__["ascii_cert"] = _core.svn_auth_ssl_server_cert_info_t_ascii_cert_set
__swig_getmethods__["ascii_cert"] = _core.svn_auth_ssl_server_cert_info_t_ascii_cert_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_ssl_server_cert_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3138,13 +3186,13 @@ class svn_auth_ssl_server_cert_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3153,9 +3201,9 @@ class svn_auth_ssl_server_cert_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3186,7 +3234,7 @@ class svn_auth_cred_ssl_server_trust_t:
__swig_setmethods__["accepted_failures"] = _core.svn_auth_cred_ssl_server_trust_t_accepted_failures_set
__swig_getmethods__["accepted_failures"] = _core.svn_auth_cred_ssl_server_trust_t_accepted_failures_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_cred_ssl_server_trust_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3205,13 +3253,13 @@ class svn_auth_cred_ssl_server_trust_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3220,9 +3268,9 @@ class svn_auth_cred_ssl_server_trust_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3362,7 +3410,7 @@ class svn_auth_baton_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_baton_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3381,13 +3429,13 @@ class svn_auth_baton_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3396,9 +3444,9 @@ class svn_auth_baton_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3415,7 +3463,7 @@ class svn_auth_iterstate_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_iterstate_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3434,13 +3482,13 @@ class svn_auth_iterstate_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3449,9 +3497,9 @@ class svn_auth_iterstate_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3544,7 +3592,7 @@ class svn_auth_simple_provider_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_simple_provider_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3563,13 +3611,13 @@ class svn_auth_simple_provider_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3578,9 +3626,9 @@ class svn_auth_simple_provider_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3600,7 +3648,7 @@ class svn_auth_ssl_client_cert_pw_provider_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_ssl_client_cert_pw_provider_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3619,13 +3667,13 @@ class svn_auth_ssl_client_cert_pw_provider_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3634,9 +3682,9 @@ class svn_auth_ssl_client_cert_pw_provider_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3656,7 +3704,7 @@ class svn_auth_simple_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_simple_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3675,13 +3723,13 @@ class svn_auth_simple_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3690,9 +3738,9 @@ class svn_auth_simple_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3712,7 +3760,7 @@ class svn_auth_username_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_username_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3731,13 +3779,13 @@ class svn_auth_username_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3746,9 +3794,9 @@ class svn_auth_username_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3768,7 +3816,7 @@ class svn_auth_ssl_server_trust_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_ssl_server_trust_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3787,13 +3835,13 @@ class svn_auth_ssl_server_trust_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3802,9 +3850,9 @@ class svn_auth_ssl_server_trust_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3824,7 +3872,7 @@ class svn_auth_ssl_client_cert_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_ssl_client_cert_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3843,13 +3891,13 @@ class svn_auth_ssl_client_cert_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3858,9 +3906,9 @@ class svn_auth_ssl_client_cert_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3880,7 +3928,7 @@ class svn_auth_ssl_client_cert_pw_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_ssl_client_cert_pw_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3899,13 +3947,13 @@ class svn_auth_ssl_client_cert_pw_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3914,9 +3962,9 @@ class svn_auth_ssl_client_cert_pw_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3936,7 +3984,7 @@ class svn_auth_plaintext_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_plaintext_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3955,13 +4003,13 @@ class svn_auth_plaintext_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3970,9 +4018,9 @@ class svn_auth_plaintext_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3992,7 +4040,7 @@ class svn_auth_plaintext_passphrase_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_plaintext_passphrase_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4011,13 +4059,13 @@ class svn_auth_plaintext_passphrase_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4026,9 +4074,9 @@ class svn_auth_plaintext_passphrase_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4048,7 +4096,7 @@ class svn_auth_gnome_keyring_unlock_prompt_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_auth_gnome_keyring_unlock_prompt_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4067,13 +4115,13 @@ class svn_auth_gnome_keyring_unlock_prompt_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4082,9 +4130,9 @@ class svn_auth_gnome_keyring_unlock_prompt_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4121,6 +4169,9 @@ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT = _core.SVN_CONFIG_OPTION_S
SVN_CONFIG_OPTION_USERNAME = _core.SVN_CONFIG_OPTION_USERNAME
SVN_CONFIG_OPTION_HTTP_BULK_UPDATES = _core.SVN_CONFIG_OPTION_HTTP_BULK_UPDATES
SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS = _core.SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS
+SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS = _core.SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS
+SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS = _core.SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS
+SVN_CONFIG_OPTION_SERF_LOG_LEVEL = _core.SVN_CONFIG_OPTION_SERF_LOG_LEVEL
SVN_CONFIG_CATEGORY_CONFIG = _core.SVN_CONFIG_CATEGORY_CONFIG
SVN_CONFIG_SECTION_AUTH = _core.SVN_CONFIG_SECTION_AUTH
SVN_CONFIG_OPTION_PASSWORD_STORES = _core.SVN_CONFIG_OPTION_PASSWORD_STORES
@@ -4140,16 +4191,19 @@ SVN_CONFIG_OPTION_LOG_ENCODING = _core.SVN_CONFIG_OPTION_LOG_ENCODING
SVN_CONFIG_OPTION_USE_COMMIT_TIMES = _core.SVN_CONFIG_OPTION_USE_COMMIT_TIMES
SVN_CONFIG_OPTION_TEMPLATE_ROOT = _core.SVN_CONFIG_OPTION_TEMPLATE_ROOT
SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS = _core.SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS
+SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE = _core.SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE
SVN_CONFIG_OPTION_NO_UNLOCK = _core.SVN_CONFIG_OPTION_NO_UNLOCK
SVN_CONFIG_OPTION_MIMETYPES_FILE = _core.SVN_CONFIG_OPTION_MIMETYPES_FILE
SVN_CONFIG_OPTION_PRESERVED_CF_EXTS = _core.SVN_CONFIG_OPTION_PRESERVED_CF_EXTS
SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS = _core.SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS
SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE = _core.SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE
+SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE = _core.SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE
SVN_CONFIG_SECTION_TUNNELS = _core.SVN_CONFIG_SECTION_TUNNELS
SVN_CONFIG_SECTION_AUTO_PROPS = _core.SVN_CONFIG_SECTION_AUTO_PROPS
SVN_CONFIG_SECTION_WORKING_COPY = _core.SVN_CONFIG_SECTION_WORKING_COPY
SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE = _core.SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE
SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS = _core.SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS
+SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT = _core.SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT
SVN_CONFIG_SECTION_GENERAL = _core.SVN_CONFIG_SECTION_GENERAL
SVN_CONFIG_OPTION_ANON_ACCESS = _core.SVN_CONFIG_OPTION_ANON_ACCESS
SVN_CONFIG_OPTION_AUTH_ACCESS = _core.SVN_CONFIG_OPTION_AUTH_ACCESS
@@ -4299,6 +4353,12 @@ def svn_config_ensure(*args):
"""svn_config_ensure(char const * config_dir, apr_pool_t pool) -> svn_error_t"""
return _core.svn_config_ensure(*args)
SVN_CONFIG_REALMSTRING_KEY = _core.SVN_CONFIG_REALMSTRING_KEY
+SVN_CONFIG_AUTHN_USERNAME_KEY = _core.SVN_CONFIG_AUTHN_USERNAME_KEY
+SVN_CONFIG_AUTHN_PASSWORD_KEY = _core.SVN_CONFIG_AUTHN_PASSWORD_KEY
+SVN_CONFIG_AUTHN_PASSPHRASE_KEY = _core.SVN_CONFIG_AUTHN_PASSPHRASE_KEY
+SVN_CONFIG_AUTHN_PASSTYPE_KEY = _core.SVN_CONFIG_AUTHN_PASSTYPE_KEY
+SVN_CONFIG_AUTHN_ASCII_CERT_KEY = _core.SVN_CONFIG_AUTHN_ASCII_CERT_KEY
+SVN_CONFIG_AUTHN_FAILURES_KEY = _core.SVN_CONFIG_AUTHN_FAILURES_KEY
def svn_config_read_auth_data(*args):
"""svn_config_read_auth_data(char const * cred_kind, char const * realmstring, char const * config_dir, apr_pool_t pool) -> svn_error_t"""
@@ -4320,7 +4380,7 @@ def svn_config_get_user_config_path(*args):
return _core.svn_config_get_user_config_path(*args)
def svn_config_dup(*args):
- """svn_config_dup(svn_config_t * src, apr_pool_t pool) -> svn_error_t"""
+ """svn_config_dup(svn_config_t const * src, apr_pool_t pool) -> svn_error_t"""
return _core.svn_config_dup(*args)
def svn_config_copy_config(*args):
@@ -4335,7 +4395,7 @@ class svn_config_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4354,13 +4414,13 @@ class svn_config_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4369,9 +4429,9 @@ class svn_config_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4401,7 +4461,7 @@ def svn_config_invoke_enumerator2(*args):
def svn_config_invoke_auth_walk_func(*args):
"""
- svn_config_invoke_auth_walk_func(svn_config_auth_walk_func_t _obj, void * cleanup_baton, char const * cred_kind, char const * realmstring,
+ svn_config_invoke_auth_walk_func(svn_config_auth_walk_func_t _obj, void * walk_baton, char const * cred_kind, char const * realmstring,
apr_hash_t hash, apr_pool_t scratch_pool) -> svn_error_t
"""
return _core.svn_config_invoke_auth_walk_func(*args)
@@ -4414,7 +4474,7 @@ class svn_config_section_enumerator_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_section_enumerator_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4433,13 +4493,13 @@ class svn_config_section_enumerator_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4448,9 +4508,9 @@ class svn_config_section_enumerator_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4470,7 +4530,7 @@ class svn_config_section_enumerator2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_section_enumerator2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4489,13 +4549,13 @@ class svn_config_section_enumerator2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4504,9 +4564,9 @@ class svn_config_section_enumerator2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4526,7 +4586,7 @@ class svn_config_enumerator_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_enumerator_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4545,13 +4605,13 @@ class svn_config_enumerator_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4560,9 +4620,9 @@ class svn_config_enumerator_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4582,7 +4642,7 @@ class svn_config_enumerator2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_enumerator2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4601,13 +4661,13 @@ class svn_config_enumerator2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4616,9 +4676,9 @@ class svn_config_enumerator2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4638,7 +4698,7 @@ class svn_config_auth_walk_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_config_auth_walk_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4657,13 +4717,13 @@ class svn_config_auth_walk_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4672,9 +4732,9 @@ class svn_config_auth_walk_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4862,6 +4922,10 @@ def svn_relpath_dirname(*args):
"""svn_relpath_dirname(char const * relpath, apr_pool_t result_pool) -> char *"""
return _core.svn_relpath_dirname(*args)
+def svn_relpath_prefix(*args):
+ """svn_relpath_prefix(char const * relpath, int max_components, apr_pool_t result_pool) -> char const *"""
+ return _core.svn_relpath_prefix(*args)
+
def svn_uri_split(*args):
"""svn_uri_split(char const * uri, apr_pool_t result_pool)"""
return _core.svn_uri_split(*args)
@@ -5102,7 +5166,7 @@ class svn_io_dirent2_t:
__swig_setmethods__["mtime"] = _core.svn_io_dirent2_t_mtime_set
__swig_getmethods__["mtime"] = _core.svn_io_dirent2_t_mtime_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_io_dirent2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5121,13 +5185,13 @@ class svn_io_dirent2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5136,9 +5200,9 @@ class svn_io_dirent2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5173,7 +5237,7 @@ class svn_io_dirent_t:
__swig_setmethods__["special"] = _core.svn_io_dirent_t_special_set
__swig_getmethods__["special"] = _core.svn_io_dirent_t_special_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_io_dirent_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5192,13 +5256,13 @@ class svn_io_dirent_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5207,9 +5271,9 @@ class svn_io_dirent_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5272,6 +5336,14 @@ def svn_io_files_contents_three_same_p(*args):
"""svn_io_files_contents_three_same_p(char const * file1, char const * file2, char const * file3, apr_pool_t scratch_pool) -> svn_error_t"""
return _core.svn_io_files_contents_three_same_p(*args)
+def svn_io_file_create_bytes(*args):
+ """svn_io_file_create_bytes(char const * file, void const * contents, apr_size_t length, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _core.svn_io_file_create_bytes(*args)
+
+def svn_io_file_create_empty(*args):
+ """svn_io_file_create_empty(char const * file, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _core.svn_io_file_create_empty(*args)
+
def svn_io_lock_open_file(*args):
"""svn_io_lock_open_file(apr_file_t lockfile_handle, svn_boolean_t exclusive, svn_boolean_t nonblocking, apr_pool_t pool) -> svn_error_t"""
return _core.svn_io_lock_open_file(*args)
@@ -5280,6 +5352,10 @@ def svn_io_unlock_open_file(*args):
"""svn_io_unlock_open_file(apr_file_t lockfile_handle, apr_pool_t pool) -> svn_error_t"""
return _core.svn_io_unlock_open_file(*args)
+def svn_stream_set_read2(*args):
+ """svn_stream_set_read2(svn_stream_t * stream, svn_read_fn_t read_fn, svn_read_fn_t read_full_fn)"""
+ return _core.svn_stream_set_read2(*args)
+
def svn_stream_set_skip(*args):
"""svn_stream_set_skip(svn_stream_t * stream, svn_stream_skip_fn_t skip_fn)"""
return _core.svn_stream_set_skip(*args)
@@ -5292,6 +5368,10 @@ def svn_stream_set_seek(*args):
"""svn_stream_set_seek(svn_stream_t * stream, svn_stream_seek_fn_t seek_fn)"""
return _core.svn_stream_set_seek(*args)
+def svn_stream_set_data_available(*args):
+ """svn_stream_set_data_available(svn_stream_t * stream, svn_stream_data_available_fn_t data_available)"""
+ return _core.svn_stream_set_data_available(*args)
+
def svn_stream_empty(*args):
"""svn_stream_empty(apr_pool_t pool) -> svn_stream_t *"""
return _core.svn_stream_empty(*args)
@@ -5332,6 +5412,10 @@ def svn_stream_for_stdout(*args):
"""svn_stream_for_stdout(apr_pool_t pool) -> svn_error_t"""
return _core.svn_stream_for_stdout(*args)
+def svn_stringbuf_from_stream(*args):
+ """svn_stringbuf_from_stream(svn_stream_t * stream, apr_size_t len_hint, apr_pool_t result_pool) -> svn_error_t"""
+ return _core.svn_stringbuf_from_stream(*args)
+
def svn_stream_from_stringbuf(*args):
"""svn_stream_from_stringbuf(svn_stringbuf_t * str, apr_pool_t pool) -> svn_stream_t *"""
return _core.svn_stream_from_stringbuf(*args)
@@ -5355,6 +5439,18 @@ def svn_stream_checksummed2(*args):
"""
return _core.svn_stream_checksummed2(*args)
+def svn_stream_read_full(*args):
+ """svn_stream_read_full(svn_stream_t * stream, char * buffer) -> svn_error_t"""
+ return _core.svn_stream_read_full(*args)
+
+def svn_stream_supports_partial_read(*args):
+ """svn_stream_supports_partial_read(svn_stream_t * stream) -> svn_boolean_t"""
+ return _core.svn_stream_supports_partial_read(*args)
+
+def svn_stream_read2(*args):
+ """svn_stream_read2(svn_stream_t * stream, char * buffer) -> svn_error_t"""
+ return _core.svn_stream_read2(*args)
+
def svn_stream_read(*args):
"""svn_stream_read(svn_stream_t * stream, char * buffer) -> svn_error_t"""
return _core.svn_stream_read(*args)
@@ -5387,6 +5483,10 @@ def svn_stream_seek(*args):
"""svn_stream_seek(svn_stream_t * stream, svn_stream_mark_t const * mark) -> svn_error_t"""
return _core.svn_stream_seek(*args)
+def svn_stream_data_available(*args):
+ """svn_stream_data_available(svn_stream_t * stream) -> svn_error_t"""
+ return _core.svn_stream_data_available(*args)
+
def svn_stream_tee(*args):
"""svn_stream_tee(svn_stream_t * out1, svn_stream_t * out2, apr_pool_t pool) -> svn_stream_t *"""
return _core.svn_stream_tee(*args)
@@ -5538,6 +5638,24 @@ def svn_io_file_read_full2(*args):
"""svn_io_file_read_full2(apr_file_t file, void * buf, apr_size_t nbytes, apr_pool_t pool) -> svn_error_t"""
return _core.svn_io_file_read_full2(*args)
+def svn_io_file_aligned_seek(*args):
+ """
+ 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) -> svn_error_t
+ """
+ return _core.svn_io_file_aligned_seek(*args)
+
+def svn_io_file_flush(*args):
+ """svn_io_file_flush(apr_file_t file, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _core.svn_io_file_flush(*args)
+
+def svn_io_write_atomic(*args):
+ """
+ svn_io_write_atomic(char const * final_path, void const * buf, apr_size_t nbytes, char const * copy_perms_path,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _core.svn_io_write_atomic(*args)
+
def svn_io_write_unique(*args):
"""
svn_io_write_unique(char const * dirpath, void const * buf, apr_size_t nbytes, svn_io_file_del_t delete_when,
@@ -5569,7 +5687,7 @@ class svn_stream_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5588,13 +5706,13 @@ class svn_stream_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5603,9 +5721,9 @@ class svn_stream_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5622,7 +5740,7 @@ class svn_stream_mark_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_mark_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5641,13 +5759,13 @@ class svn_stream_mark_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5656,9 +5774,9 @@ class svn_stream_mark_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5691,6 +5809,10 @@ def svn_stream_invoke_seek_fn(*args):
"""svn_stream_invoke_seek_fn(svn_stream_seek_fn_t _obj, void * baton, svn_stream_mark_t const * mark) -> svn_error_t"""
return _core.svn_stream_invoke_seek_fn(*args)
+def svn_stream_invoke_data_available_fn(*args):
+ """svn_stream_invoke_data_available_fn(svn_stream_data_available_fn_t _obj, void * baton) -> svn_error_t"""
+ return _core.svn_stream_invoke_data_available_fn(*args)
+
def svn_stream_invoke_lazyopen_func(*args):
"""svn_stream_invoke_lazyopen_func(svn_stream_lazyopen_func_t _obj, void * baton, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
return _core.svn_stream_invoke_lazyopen_func(*args)
@@ -5710,7 +5832,7 @@ class svn_read_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_read_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5729,13 +5851,13 @@ class svn_read_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5744,9 +5866,9 @@ class svn_read_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5766,7 +5888,7 @@ class svn_stream_skip_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_skip_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5785,13 +5907,13 @@ class svn_stream_skip_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5800,9 +5922,9 @@ class svn_stream_skip_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5822,7 +5944,7 @@ class svn_write_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_write_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5841,13 +5963,13 @@ class svn_write_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5856,9 +5978,9 @@ class svn_write_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5878,7 +6000,7 @@ class svn_close_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_close_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5897,13 +6019,13 @@ class svn_close_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5912,9 +6034,9 @@ class svn_close_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5934,7 +6056,7 @@ class svn_stream_mark_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_mark_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -5953,13 +6075,13 @@ class svn_stream_mark_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -5968,9 +6090,9 @@ class svn_stream_mark_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -5990,7 +6112,7 @@ class svn_stream_seek_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_seek_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6009,13 +6131,13 @@ class svn_stream_seek_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6024,9 +6146,9 @@ class svn_stream_seek_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6037,6 +6159,62 @@ class svn_stream_seek_fn_t:
svn_stream_seek_fn_t_swigregister = _core.svn_stream_seek_fn_t_swigregister
svn_stream_seek_fn_t_swigregister(svn_stream_seek_fn_t)
+class svn_stream_data_available_fn_t:
+ """Proxy of C svn_stream_data_available_fn_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_stream_data_available_fn_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_stream_data_available_fn_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_stream_invoke_data_available_fn(self, *args)
+
+svn_stream_data_available_fn_t_swigregister = _core.svn_stream_data_available_fn_t_swigregister
+svn_stream_data_available_fn_t_swigregister(svn_stream_data_available_fn_t)
+
class svn_stream_lazyopen_func_t:
"""Proxy of C svn_stream_lazyopen_func_t struct"""
__swig_setmethods__ = {}
@@ -6046,7 +6224,7 @@ class svn_stream_lazyopen_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_stream_lazyopen_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6065,13 +6243,13 @@ class svn_stream_lazyopen_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6080,9 +6258,9 @@ class svn_stream_lazyopen_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6102,7 +6280,7 @@ class svn_io_walk_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_io_walk_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6121,13 +6299,13 @@ class svn_io_walk_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6136,9 +6314,9 @@ class svn_io_walk_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6151,6 +6329,8 @@ svn_io_walk_func_t_swigregister(svn_io_walk_func_t)
svn_checksum_md5 = _core.svn_checksum_md5
svn_checksum_sha1 = _core.svn_checksum_sha1
+svn_checksum_fnv1a_32 = _core.svn_checksum_fnv1a_32
+svn_checksum_fnv1a_32x4 = _core.svn_checksum_fnv1a_32x4
class svn_checksum_t:
"""Proxy of C svn_checksum_t struct"""
__swig_setmethods__ = {}
@@ -6163,7 +6343,7 @@ class svn_checksum_t:
__swig_setmethods__["kind"] = _core.svn_checksum_t_kind_set
__swig_getmethods__["kind"] = _core.svn_checksum_t_kind_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_checksum_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6182,13 +6362,13 @@ class svn_checksum_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6197,9 +6377,9 @@ class svn_checksum_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6291,7 +6471,7 @@ class svn_checksum_ctx_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_checksum_ctx_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6310,13 +6490,13 @@ class svn_checksum_ctx_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6325,9 +6505,9 @@ class svn_checksum_ctx_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6356,7 +6536,7 @@ class apr_array_header_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for apr_array_header_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6375,13 +6555,13 @@ class apr_array_header_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6390,9 +6570,9 @@ class apr_array_header_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6409,7 +6589,7 @@ class apr_file_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for apr_file_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6428,13 +6608,13 @@ class apr_file_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6443,9 +6623,9 @@ class apr_file_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6462,7 +6642,7 @@ class apr_hash_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for apr_hash_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -6481,13 +6661,13 @@ class apr_hash_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -6496,9 +6676,9 @@ class apr_hash_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -6626,7 +6806,7 @@ class apr_pool_t:
# Make sure that the parent object is valid
self._parent_pool.assert_valid()
- # Refer to self using a weakrefrence so that we don't
+ # Refer to self using a weakreference so that we don't
# create a reference cycle
weakself = weakref.ref(self)
diff --git a/subversion/bindings/swig/python/delta.py b/subversion/bindings/swig/python/delta.py
index 7504bcd..5a02c56 100644
--- a/subversion/bindings/swig/python/delta.py
+++ b/subversion/bindings/swig/python/delta.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -113,7 +115,7 @@ class svn_txdelta_op_t:
__swig_setmethods__["length"] = _delta.svn_txdelta_op_t_length_set
__swig_getmethods__["length"] = _delta.svn_txdelta_op_t_length_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_op_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -132,13 +134,13 @@ class svn_txdelta_op_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -147,9 +149,9 @@ class svn_txdelta_op_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -189,7 +191,7 @@ class svn_txdelta_window_t:
ops = property(_ops_get)
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_window_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -208,13 +210,13 @@ class svn_txdelta_window_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -223,9 +225,9 @@ class svn_txdelta_window_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -389,7 +391,7 @@ class svn_delta_editor_t:
__swig_setmethods__["abort_edit"] = _delta.svn_delta_editor_t_abort_edit_set
__swig_getmethods__["abort_edit"] = _delta.svn_delta_editor_t_abort_edit_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_delta_editor_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -408,13 +410,13 @@ class svn_delta_editor_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -423,9 +425,9 @@ class svn_delta_editor_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -537,7 +539,7 @@ class svn_txdelta_stream_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_stream_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -556,13 +558,13 @@ class svn_txdelta_stream_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -571,9 +573,9 @@ class svn_txdelta_stream_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -709,7 +711,7 @@ class svn_txdelta_window_handler_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_window_handler_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -728,13 +730,13 @@ class svn_txdelta_window_handler_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -743,9 +745,9 @@ class svn_txdelta_window_handler_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -765,7 +767,7 @@ class svn_txdelta_next_window_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_next_window_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -784,13 +786,13 @@ class svn_txdelta_next_window_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -799,9 +801,9 @@ class svn_txdelta_next_window_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -821,7 +823,7 @@ class svn_txdelta_md5_digest_fn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_txdelta_md5_digest_fn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -840,13 +842,13 @@ class svn_txdelta_md5_digest_fn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -855,9 +857,9 @@ class svn_txdelta_md5_digest_fn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -877,7 +879,7 @@ class svn_delta_path_driver_cb_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_delta_path_driver_cb_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -896,13 +898,13 @@ class svn_delta_path_driver_cb_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -911,9 +913,9 @@ class svn_delta_path_driver_cb_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -933,7 +935,7 @@ class svn_file_rev_handler_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_file_rev_handler_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -952,13 +954,13 @@ class svn_file_rev_handler_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -967,9 +969,9 @@ class svn_file_rev_handler_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -989,7 +991,7 @@ class svn_file_rev_handler_old_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_file_rev_handler_old_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1008,13 +1010,13 @@ class svn_file_rev_handler_old_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1023,9 +1025,9 @@ class svn_file_rev_handler_old_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1036,6 +1038,8 @@ class svn_file_rev_handler_old_t:
svn_file_rev_handler_old_t_swigregister = _delta.svn_file_rev_handler_old_t_swigregister
svn_file_rev_handler_old_t_swigregister(svn_file_rev_handler_old_t)
+# This function is for backwards compatibility only.
+# Use svn_txdelta_window_t.ops instead.
svn_txdelta_window_t_ops_get = svn_txdelta_window_t._ops_get
# This file is compatible with both classic and new-style classes.
diff --git a/subversion/bindings/swig/python/diff.py b/subversion/bindings/swig/python/diff.py
index 476236d..24d8142 100644
--- a/subversion/bindings/swig/python/diff.py
+++ b/subversion/bindings/swig/python/diff.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -113,7 +115,7 @@ class svn_diff_fns2_t:
__swig_setmethods__["token_discard_all"] = _diff.svn_diff_fns2_t_token_discard_all_set
__swig_getmethods__["token_discard_all"] = _diff.svn_diff_fns2_t_token_discard_all_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_fns2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -132,13 +134,13 @@ class svn_diff_fns2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -147,9 +149,9 @@ class svn_diff_fns2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -202,7 +204,7 @@ class svn_diff_fns_t:
__swig_setmethods__["token_discard_all"] = _diff.svn_diff_fns_t_token_discard_all_set
__swig_getmethods__["token_discard_all"] = _diff.svn_diff_fns_t_token_discard_all_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_fns_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -221,13 +223,13 @@ class svn_diff_fns_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -236,9 +238,9 @@ class svn_diff_fns_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -321,7 +323,7 @@ class svn_diff_output_fns_t:
__swig_setmethods__["output_conflict"] = _diff.svn_diff_output_fns_t_output_conflict_set
__swig_getmethods__["output_conflict"] = _diff.svn_diff_output_fns_t_output_conflict_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_output_fns_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -340,13 +342,13 @@ class svn_diff_output_fns_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -355,9 +357,9 @@ class svn_diff_output_fns_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -394,6 +396,10 @@ svn_diff_conflict_display_modified = _diff.svn_diff_conflict_display_modified
svn_diff_conflict_display_latest = _diff.svn_diff_conflict_display_latest
svn_diff_conflict_display_only_conflicts = _diff.svn_diff_conflict_display_only_conflicts
+def svn_diff_output2(*args):
+ """svn_diff_output2(svn_diff_t * diff, void * output_baton, svn_diff_output_fns_t output_fns, svn_cancel_func_t cancel_func) -> svn_error_t"""
+ return _diff.svn_diff_output2(*args)
+
def svn_diff_output(*args):
"""svn_diff_output(svn_diff_t * diff, void * output_baton, svn_diff_output_fns_t output_fns) -> svn_error_t"""
return _diff.svn_diff_output(*args)
@@ -413,8 +419,10 @@ class svn_diff_file_options_t:
__swig_getmethods__["ignore_eol_style"] = _diff.svn_diff_file_options_t_ignore_eol_style_get
__swig_setmethods__["show_c_function"] = _diff.svn_diff_file_options_t_show_c_function_set
__swig_getmethods__["show_c_function"] = _diff.svn_diff_file_options_t_show_c_function_get
+ __swig_setmethods__["context_size"] = _diff.svn_diff_file_options_t_context_size_set
+ __swig_getmethods__["context_size"] = _diff.svn_diff_file_options_t_context_size_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_file_options_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -433,13 +441,13 @@ class svn_diff_file_options_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -448,9 +456,9 @@ class svn_diff_file_options_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -507,6 +515,15 @@ def svn_diff_file_diff4(*args):
"""
return _diff.svn_diff_file_diff4(*args)
+def svn_diff_file_output_unified4(*args):
+ """
+ svn_diff_file_output_unified4(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path,
+ char const * original_header, char const * modified_header,
+ char const * header_encoding, char const * relative_to_dir, svn_boolean_t show_c_function,
+ int context_size, svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _diff.svn_diff_file_output_unified4(*args)
+
def svn_diff_file_output_unified3(*args):
"""
svn_diff_file_output_unified3(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path,
@@ -532,6 +549,16 @@ def svn_diff_file_output_unified(*args):
"""
return _diff.svn_diff_file_output_unified(*args)
+def svn_diff_file_output_merge3(*args):
+ """
+ svn_diff_file_output_merge3(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path,
+ char const * latest_path, char const * conflict_original,
+ char const * conflict_modified, char const * conflict_latest, char const * conflict_separator,
+ svn_diff_conflict_display_style_t conflict_style,
+ svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _diff.svn_diff_file_output_merge3(*args)
+
def svn_diff_file_output_merge2(*args):
"""
svn_diff_file_output_merge2(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path,
@@ -552,6 +579,13 @@ def svn_diff_file_output_merge(*args):
"""
return _diff.svn_diff_file_output_merge(*args)
+def svn_diff_output_binary(*args):
+ """
+ svn_diff_output_binary(svn_stream_t * output_stream, svn_stream_t * original, svn_stream_t * latest, svn_cancel_func_t cancel_func,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _diff.svn_diff_output_binary(*args)
+
def svn_diff_mem_string_diff(*args):
"""
svn_diff_mem_string_diff(svn_string_t const * original, svn_string_t const * modified, svn_diff_file_options_t options,
@@ -573,6 +607,16 @@ def svn_diff_mem_string_diff4(*args):
"""
return _diff.svn_diff_mem_string_diff4(*args)
+def svn_diff_mem_string_output_unified3(*args):
+ """
+ svn_diff_mem_string_output_unified3(svn_stream_t * output_stream, svn_diff_t * diff, svn_boolean_t with_diff_header,
+ char const * hunk_delimiter, char const * original_header, char const * modified_header,
+ char const * header_encoding, svn_string_t const * original,
+ svn_string_t const * modified, int context_size, svn_cancel_func_t cancel_func,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _diff.svn_diff_mem_string_output_unified3(*args)
+
def svn_diff_mem_string_output_unified2(*args):
"""
svn_diff_mem_string_output_unified2(svn_stream_t * output_stream, svn_diff_t * diff, svn_boolean_t with_diff_header,
@@ -590,6 +634,16 @@ def svn_diff_mem_string_output_unified(*args):
"""
return _diff.svn_diff_mem_string_output_unified(*args)
+def svn_diff_mem_string_output_merge3(*args):
+ """
+ svn_diff_mem_string_output_merge3(svn_stream_t * output_stream, svn_diff_t * diff, svn_string_t const * original, svn_string_t const * modified,
+ svn_string_t const * latest, char const * conflict_original,
+ char const * conflict_modified, char const * conflict_latest,
+ char const * conflict_separator, svn_diff_conflict_display_style_t style,
+ svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _diff.svn_diff_mem_string_output_merge3(*args)
+
def svn_diff_mem_string_output_merge2(*args):
"""
svn_diff_mem_string_output_merge2(svn_stream_t * output_stream, svn_diff_t * diff, svn_string_t const * original, svn_string_t const * modified,
@@ -677,7 +731,7 @@ class svn_prop_patch_t:
__swig_setmethods__["hunks"] = _diff.svn_prop_patch_t_hunks_set
__swig_getmethods__["hunks"] = _diff.svn_prop_patch_t_hunks_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_prop_patch_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -696,13 +750,13 @@ class svn_prop_patch_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -711,9 +765,9 @@ class svn_prop_patch_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -747,8 +801,12 @@ class svn_patch_t:
__swig_getmethods__["operation"] = _diff.svn_patch_t_operation_get
__swig_setmethods__["reverse"] = _diff.svn_patch_t_reverse_set
__swig_getmethods__["reverse"] = _diff.svn_patch_t_reverse_get
+ __swig_setmethods__["mergeinfo"] = _diff.svn_patch_t_mergeinfo_set
+ __swig_getmethods__["mergeinfo"] = _diff.svn_patch_t_mergeinfo_get
+ __swig_setmethods__["reverse_mergeinfo"] = _diff.svn_patch_t_reverse_mergeinfo_set
+ __swig_getmethods__["reverse_mergeinfo"] = _diff.svn_patch_t_reverse_mergeinfo_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_patch_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -767,13 +825,13 @@ class svn_patch_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -782,9 +840,9 @@ class svn_patch_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -823,7 +881,7 @@ class svn_diff_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -842,13 +900,13 @@ class svn_diff_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -857,9 +915,9 @@ class svn_diff_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -876,7 +934,7 @@ class svn_diff_hunk_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_diff_hunk_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -895,13 +953,13 @@ class svn_diff_hunk_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -910,9 +968,9 @@ class svn_diff_hunk_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -929,7 +987,7 @@ class svn_patch_file_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_patch_file_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -948,13 +1006,13 @@ class svn_patch_file_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -963,9 +1021,9 @@ class svn_patch_file_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/python/fs.py b/subversion/bindings/swig/python/fs.py
index 6d3b4cd..2b830bb 100644
--- a/subversion/bindings/swig/python/fs.py
+++ b/subversion/bindings/swig/python/fs.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -90,19 +92,24 @@ import libsvn.delta
def svn_fs_version():
"""svn_fs_version() -> svn_version_t const *"""
return _fs.svn_fs_version()
+SVN_FS_TYPE_BDB = _fs.SVN_FS_TYPE_BDB
+SVN_FS_TYPE_FSFS = _fs.SVN_FS_TYPE_FSFS
+SVN_FS_TYPE_FSX = _fs.SVN_FS_TYPE_FSX
SVN_FS_CONFIG_BDB_TXN_NOSYNC = _fs.SVN_FS_CONFIG_BDB_TXN_NOSYNC
SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE = _fs.SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE
SVN_FS_CONFIG_FSFS_CACHE_DELTAS = _fs.SVN_FS_CONFIG_FSFS_CACHE_DELTAS
SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS = _fs.SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS
SVN_FS_CONFIG_FSFS_CACHE_REVPROPS = _fs.SVN_FS_CONFIG_FSFS_CACHE_REVPROPS
SVN_FS_CONFIG_FSFS_CACHE_NS = _fs.SVN_FS_CONFIG_FSFS_CACHE_NS
+SVN_FS_CONFIG_FSFS_BLOCK_READ = _fs.SVN_FS_CONFIG_FSFS_BLOCK_READ
+SVN_FS_CONFIG_FSFS_SHARD_SIZE = _fs.SVN_FS_CONFIG_FSFS_SHARD_SIZE
+SVN_FS_CONFIG_FSFS_LOG_ADDRESSING = _fs.SVN_FS_CONFIG_FSFS_LOG_ADDRESSING
SVN_FS_CONFIG_FS_TYPE = _fs.SVN_FS_CONFIG_FS_TYPE
-SVN_FS_TYPE_BDB = _fs.SVN_FS_TYPE_BDB
-SVN_FS_TYPE_FSFS = _fs.SVN_FS_TYPE_FSFS
SVN_FS_CONFIG_PRE_1_4_COMPATIBLE = _fs.SVN_FS_CONFIG_PRE_1_4_COMPATIBLE
SVN_FS_CONFIG_PRE_1_5_COMPATIBLE = _fs.SVN_FS_CONFIG_PRE_1_5_COMPATIBLE
SVN_FS_CONFIG_PRE_1_6_COMPATIBLE = _fs.SVN_FS_CONFIG_PRE_1_6_COMPATIBLE
SVN_FS_CONFIG_PRE_1_8_COMPATIBLE = _fs.SVN_FS_CONFIG_PRE_1_8_COMPATIBLE
+SVN_FS_CONFIG_COMPATIBLE_VERSION = _fs.SVN_FS_CONFIG_COMPATIBLE_VERSION
def svn_fs_initialize(*args):
"""svn_fs_initialize(apr_pool_t pool) -> svn_error_t"""
@@ -112,9 +119,23 @@ def svn_fs_create(*args):
"""svn_fs_create(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_create(*args)
+def svn_fs_open2(*args):
+ """svn_fs_open2(char const * path, apr_hash_t fs_config, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_open2(*args)
+
def svn_fs_open(*args):
"""svn_fs_open(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_open(*args)
+svn_fs_upgrade_pack_revprops = _fs.svn_fs_upgrade_pack_revprops
+svn_fs_upgrade_cleanup_revprops = _fs.svn_fs_upgrade_cleanup_revprops
+svn_fs_upgrade_format_bumped = _fs.svn_fs_upgrade_format_bumped
+
+def svn_fs_upgrade2(*args):
+ """
+ svn_fs_upgrade2(char const * path, svn_fs_upgrade_notify_t notify_func, void * notify_baton, svn_cancel_func_t cancel_func,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_upgrade2(*args)
def svn_fs_upgrade(*args):
"""svn_fs_upgrade(char const * path, apr_pool_t pool) -> svn_error_t"""
@@ -136,6 +157,14 @@ def svn_fs_delete_fs(*args):
"""svn_fs_delete_fs(char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_delete_fs(*args)
+def svn_fs_hotcopy3(*args):
+ """
+ svn_fs_hotcopy3(char const * src_path, char const * 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,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_hotcopy3(*args)
+
def svn_fs_hotcopy2(*args):
"""
svn_fs_hotcopy2(char const * src_path, char const * dest_path, svn_boolean_t clean, svn_boolean_t incremental,
@@ -210,6 +239,9 @@ def svn_fs_access_add_lock_token2(*args):
def svn_fs_access_add_lock_token(*args):
"""svn_fs_access_add_lock_token(svn_fs_access_t * access_ctx, char const * token) -> svn_error_t"""
return _fs.svn_fs_access_add_lock_token(*args)
+svn_fs_node_unrelated = _fs.svn_fs_node_unrelated
+svn_fs_node_unchanged = _fs.svn_fs_node_unchanged
+svn_fs_node_common_ancestor = _fs.svn_fs_node_common_ancestor
def svn_fs_compare_ids(*args):
"""svn_fs_compare_ids(svn_fs_id_t const * a, svn_fs_id_t const * b) -> int"""
@@ -228,6 +260,7 @@ def svn_fs_unparse_id(*args):
return _fs.svn_fs_unparse_id(*args)
SVN_FS_TXN_CHECK_OOD = _fs.SVN_FS_TXN_CHECK_OOD
SVN_FS_TXN_CHECK_LOCKS = _fs.SVN_FS_TXN_CHECK_LOCKS
+SVN_FS_TXN_CLIENT_DATE = _fs.SVN_FS_TXN_CLIENT_DATE
def svn_fs_begin_txn2(*args):
"""svn_fs_begin_txn2(svn_fs_t * fs, svn_revnum_t rev, apr_uint32_t flags, apr_pool_t pool) -> svn_error_t"""
@@ -345,8 +378,10 @@ class svn_fs_path_change2_t:
__swig_getmethods__["copyfrom_rev"] = _fs.svn_fs_path_change2_t_copyfrom_rev_get
__swig_setmethods__["copyfrom_path"] = _fs.svn_fs_path_change2_t_copyfrom_path_set
__swig_getmethods__["copyfrom_path"] = _fs.svn_fs_path_change2_t_copyfrom_path_get
+ __swig_setmethods__["mergeinfo_mod"] = _fs.svn_fs_path_change2_t_mergeinfo_mod_set
+ __swig_getmethods__["mergeinfo_mod"] = _fs.svn_fs_path_change2_t_mergeinfo_mod_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_path_change2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -365,13 +400,13 @@ class svn_fs_path_change2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -380,9 +415,9 @@ class svn_fs_path_change2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -407,7 +442,7 @@ class svn_fs_path_change_t:
__swig_setmethods__["prop_mod"] = _fs.svn_fs_path_change_t_prop_mod_set
__swig_getmethods__["prop_mod"] = _fs.svn_fs_path_change_t_prop_mod_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_path_change_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -426,13 +461,13 @@ class svn_fs_path_change_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -441,9 +476,9 @@ class svn_fs_path_change_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -468,10 +503,18 @@ def svn_fs_check_path(*args):
"""svn_fs_check_path(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_check_path(*args)
+def svn_fs_node_history2(*args):
+ """svn_fs_node_history2(svn_fs_root_t * root, char const * path, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_node_history2(*args)
+
def svn_fs_node_history(*args):
"""svn_fs_node_history(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_node_history(*args)
+def svn_fs_history_prev2(*args):
+ """svn_fs_history_prev2(svn_fs_history_t * history, svn_boolean_t cross_copies, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_history_prev2(*args)
+
def svn_fs_history_prev(*args):
"""svn_fs_history_prev(svn_fs_history_t * history, svn_boolean_t cross_copies, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_history_prev(*args)
@@ -492,6 +535,13 @@ def svn_fs_node_id(*args):
"""svn_fs_node_id(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_node_id(*args)
+def svn_fs_node_relation(*args):
+ """
+ svn_fs_node_relation(svn_fs_node_relation_t * relation, svn_fs_root_t * root_a, char const * path_a, svn_fs_root_t * root_b,
+ char const * path_b, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_node_relation(*args)
+
def svn_fs_node_created_rev(*args):
"""svn_fs_node_created_rev(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_node_created_rev(*args)
@@ -512,6 +562,10 @@ def svn_fs_node_proplist(*args):
"""svn_fs_node_proplist(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_node_proplist(*args)
+def svn_fs_node_has_props(*args):
+ """svn_fs_node_has_props(svn_fs_root_t * root, char const * path, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_node_has_props(*args)
+
def svn_fs_change_node_prop(*args):
"""
svn_fs_change_node_prop(svn_fs_root_t * root, char const * path, char const * name, svn_string_t const * value,
@@ -519,6 +573,13 @@ def svn_fs_change_node_prop(*args):
"""
return _fs.svn_fs_change_node_prop(*args)
+def svn_fs_props_different(*args):
+ """
+ svn_fs_props_different(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_props_different(*args)
+
def svn_fs_props_changed(*args):
"""
svn_fs_props_changed(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2,
@@ -571,7 +632,7 @@ class svn_fs_dirent_t:
__swig_setmethods__["kind"] = _fs.svn_fs_dirent_t_kind_set
__swig_getmethods__["kind"] = _fs.svn_fs_dirent_t_kind_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_dirent_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -590,13 +651,13 @@ class svn_fs_dirent_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -605,9 +666,9 @@ class svn_fs_dirent_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -620,6 +681,10 @@ def svn_fs_dir_entries(*args):
"""svn_fs_dir_entries(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_dir_entries(*args)
+def svn_fs_dir_optimal_order(*args):
+ """svn_fs_dir_optimal_order(svn_fs_root_t * root, apr_hash_t entries, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_dir_optimal_order(*args)
+
def svn_fs_make_dir(*args):
"""svn_fs_make_dir(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_make_dir(*args)
@@ -680,6 +745,13 @@ def svn_fs_apply_text(*args):
"""svn_fs_apply_text(svn_fs_root_t * root, char const * path, char const * result_checksum, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_apply_text(*args)
+def svn_fs_contents_different(*args):
+ """
+ svn_fs_contents_different(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_contents_different(*args)
+
def svn_fs_contents_changed(*args):
"""
svn_fs_contents_changed(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2,
@@ -691,6 +763,14 @@ def svn_fs_youngest_rev(*args):
"""svn_fs_youngest_rev(svn_fs_t * fs, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_youngest_rev(*args)
+def svn_fs_info_format(*args):
+ """svn_fs_info_format(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_info_format(*args)
+
+def svn_fs_info_config_files(*args):
+ """svn_fs_info_config_files(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_info_config_files(*args)
+
def svn_fs_deltify_revision(*args):
"""svn_fs_deltify_revision(svn_fs_t * fs, svn_revnum_t revision, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_deltify_revision(*args)
@@ -729,6 +809,22 @@ def svn_fs_set_uuid(*args):
"""svn_fs_set_uuid(svn_fs_t * fs, char const * uuid, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_set_uuid(*args)
+def svn_fs_lock_target_create(*args):
+ """svn_fs_lock_target_create(char const * token, svn_revnum_t current_rev, apr_pool_t result_pool) -> svn_fs_lock_target_t *"""
+ return _fs.svn_fs_lock_target_create(*args)
+
+def svn_fs_lock_target_set_token(*args):
+ """svn_fs_lock_target_set_token(svn_fs_lock_target_t * target, char const * token)"""
+ return _fs.svn_fs_lock_target_set_token(*args)
+
+def svn_fs_lock_many(*args):
+ """
+ svn_fs_lock_many(svn_fs_t * fs, apr_hash_t lock_targets, char const * comment, svn_boolean_t is_dav_comment,
+ apr_time_t expiration_date, svn_boolean_t steal_lock, svn_fs_lock_callback_t lock_callback,
+ apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_lock_many(*args)
+
def svn_fs_lock(*args):
"""
svn_fs_lock(svn_fs_t * fs, char const * path, char const * token, char const * comment, svn_boolean_t is_dav_comment,
@@ -741,6 +837,13 @@ def svn_fs_generate_lock_token(*args):
"""svn_fs_generate_lock_token(svn_fs_t * fs, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_generate_lock_token(*args)
+def svn_fs_unlock_many(*args):
+ """
+ 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,
+ apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_unlock_many(*args)
+
def svn_fs_unlock(*args):
"""svn_fs_unlock(svn_fs_t * fs, char const * path, char const * token, svn_boolean_t break_lock, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_unlock(*args)
@@ -786,16 +889,24 @@ def svn_fs_verify(*args):
def svn_fs_verify_root(*args):
"""svn_fs_verify_root(svn_fs_root_t * root, apr_pool_t scratch_pool) -> svn_error_t"""
return _fs.svn_fs_verify_root(*args)
-class svn_fs_t:
- """Proxy of C svn_fs_t struct"""
+class svn_fs_fsfs_info_t:
+ """Proxy of C svn_fs_fsfs_info_t struct"""
__swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_t, name, value)
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_fsfs_info_t, name, value)
__swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_t, name)
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_fsfs_info_t, name)
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
+ __swig_setmethods__["fs_type"] = _fs.svn_fs_fsfs_info_t_fs_type_set
+ __swig_getmethods__["fs_type"] = _fs.svn_fs_fsfs_info_t_fs_type_get
+ __swig_setmethods__["shard_size"] = _fs.svn_fs_fsfs_info_t_shard_size_set
+ __swig_getmethods__["shard_size"] = _fs.svn_fs_fsfs_info_t_shard_size_get
+ __swig_setmethods__["min_unpacked_rev"] = _fs.svn_fs_fsfs_info_t_min_unpacked_rev_set
+ __swig_getmethods__["min_unpacked_rev"] = _fs.svn_fs_fsfs_info_t_min_unpacked_rev_get
+ __swig_setmethods__["log_addressing"] = _fs.svn_fs_fsfs_info_t_log_addressing_set
+ __swig_getmethods__["log_addressing"] = _fs.svn_fs_fsfs_info_t_log_addressing_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -814,13 +925,127 @@ class svn_fs_t:
value = _swig_getattr(self, self.__class__, name)
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+svn_fs_fsfs_info_t_swigregister = _fs.svn_fs_fsfs_info_t_swigregister
+svn_fs_fsfs_info_t_swigregister(svn_fs_fsfs_info_t)
+
+class svn_fs_fsx_info_t:
+ """Proxy of C svn_fs_fsx_info_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_fsx_info_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_fsx_info_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ __swig_setmethods__["fs_type"] = _fs.svn_fs_fsx_info_t_fs_type_set
+ __swig_getmethods__["fs_type"] = _fs.svn_fs_fsx_info_t_fs_type_get
+ __swig_setmethods__["shard_size"] = _fs.svn_fs_fsx_info_t_shard_size_set
+ __swig_getmethods__["shard_size"] = _fs.svn_fs_fsx_info_t_shard_size_get
+ __swig_setmethods__["min_unpacked_rev"] = _fs.svn_fs_fsx_info_t_min_unpacked_rev_set
+ __swig_getmethods__["min_unpacked_rev"] = _fs.svn_fs_fsx_info_t_min_unpacked_rev_get
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+svn_fs_fsx_info_t_swigregister = _fs.svn_fs_fsx_info_t_swigregister
+svn_fs_fsx_info_t_swigregister(svn_fs_fsx_info_t)
+
+class svn_fs_info_placeholder_t:
+ """Proxy of C svn_fs_info_placeholder_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_info_placeholder_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_info_placeholder_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ __swig_setmethods__["fs_type"] = _fs.svn_fs_info_placeholder_t_fs_type_set
+ __swig_getmethods__["fs_type"] = _fs.svn_fs_info_placeholder_t_fs_type_get
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -829,9 +1054,70 @@ class svn_fs_t:
"""Set an attribute on this object"""
self.assert_valid()
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+svn_fs_info_placeholder_t_swigregister = _fs.svn_fs_info_placeholder_t_swigregister
+svn_fs_info_placeholder_t_swigregister(svn_fs_info_placeholder_t)
+def svn_fs_info(*args):
+ """svn_fs_info(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _fs.svn_fs_info(*args)
+def svn_fs_info_dup(*args):
+ """svn_fs_info_dup(void const * info, apr_pool_t result_pool, apr_pool_t scratch_pool) -> void *"""
+ return _fs.svn_fs_info_dup(*args)
+class svn_fs_t:
+ """Proxy of C svn_fs_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -848,7 +1134,7 @@ class svn_fs_access_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_access_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -867,13 +1153,13 @@ class svn_fs_access_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -882,9 +1168,9 @@ class svn_fs_access_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -901,7 +1187,7 @@ class svn_fs_id_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_id_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -920,13 +1206,13 @@ class svn_fs_id_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -935,9 +1221,9 @@ class svn_fs_id_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -954,7 +1240,7 @@ class svn_fs_txn_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_txn_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -973,13 +1259,13 @@ class svn_fs_txn_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -988,9 +1274,9 @@ class svn_fs_txn_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1007,7 +1293,7 @@ class svn_fs_root_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_root_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1026,13 +1312,13 @@ class svn_fs_root_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1041,9 +1327,9 @@ class svn_fs_root_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1060,7 +1346,7 @@ class svn_fs_history_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_history_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1079,13 +1365,13 @@ class svn_fs_history_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1094,25 +1380,92 @@ class svn_fs_history_t:
"""Set an attribute on this object"""
self.assert_valid()
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+svn_fs_history_t_swigregister = _fs.svn_fs_history_t_swigregister
+svn_fs_history_t_swigregister(svn_fs_history_t)
+
+class svn_fs_lock_target_t:
+ """Proxy of C svn_fs_lock_target_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_lock_target_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_lock_target_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
-svn_fs_history_t_swigregister = _fs.svn_fs_history_t_swigregister
-svn_fs_history_t_swigregister(svn_fs_history_t)
+svn_fs_lock_target_t_swigregister = _fs.svn_fs_lock_target_t_swigregister
+svn_fs_lock_target_t_swigregister(svn_fs_lock_target_t)
def svn_fs_invoke_warning_callback(*args):
"""svn_fs_invoke_warning_callback(svn_fs_warning_callback_t _obj, void * baton, svn_error_t err)"""
return _fs.svn_fs_invoke_warning_callback(*args)
+def svn_fs_invoke_upgrade_notify(*args):
+ """
+ svn_fs_invoke_upgrade_notify(svn_fs_upgrade_notify_t _obj, void * baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_invoke_upgrade_notify(*args)
+
def svn_fs_invoke_progress_notify_func(*args):
"""svn_fs_invoke_progress_notify_func(svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void * baton, apr_pool_t pool)"""
return _fs.svn_fs_invoke_progress_notify_func(*args)
+def svn_fs_invoke_hotcopy_notify(*args):
+ """
+ svn_fs_invoke_hotcopy_notify(svn_fs_hotcopy_notify_t _obj, void * baton, svn_revnum_t start_revision, svn_revnum_t end_revision,
+ apr_pool_t scratch_pool)
+ """
+ return _fs.svn_fs_invoke_hotcopy_notify(*args)
+
def svn_fs_invoke_freeze_func(*args):
"""svn_fs_invoke_freeze_func(svn_fs_freeze_func_t _obj, void * baton, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_invoke_freeze_func(*args)
@@ -1124,6 +1477,13 @@ def svn_fs_invoke_process_contents_func(*args):
"""
return _fs.svn_fs_invoke_process_contents_func(*args)
+def svn_fs_invoke_lock_callback(*args):
+ """
+ svn_fs_invoke_lock_callback(svn_fs_lock_callback_t _obj, void * baton, char const * path, svn_lock_t lock, svn_error_t fs_err,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _fs.svn_fs_invoke_lock_callback(*args)
+
def svn_fs_invoke_get_locks_callback(*args):
"""svn_fs_invoke_get_locks_callback(svn_fs_get_locks_callback_t _obj, void * baton, svn_lock_t lock, apr_pool_t pool) -> svn_error_t"""
return _fs.svn_fs_invoke_get_locks_callback(*args)
@@ -1143,7 +1503,7 @@ class svn_fs_warning_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_warning_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1162,13 +1522,13 @@ class svn_fs_warning_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1177,9 +1537,9 @@ class svn_fs_warning_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1190,6 +1550,62 @@ class svn_fs_warning_callback_t:
svn_fs_warning_callback_t_swigregister = _fs.svn_fs_warning_callback_t_swigregister
svn_fs_warning_callback_t_swigregister(svn_fs_warning_callback_t)
+class svn_fs_upgrade_notify_t:
+ """Proxy of C svn_fs_upgrade_notify_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_upgrade_notify_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_upgrade_notify_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_fs_invoke_upgrade_notify(self, *args)
+
+svn_fs_upgrade_notify_t_swigregister = _fs.svn_fs_upgrade_notify_t_swigregister
+svn_fs_upgrade_notify_t_swigregister(svn_fs_upgrade_notify_t)
+
class svn_fs_progress_notify_func_t:
"""Proxy of C svn_fs_progress_notify_func_t struct"""
__swig_setmethods__ = {}
@@ -1199,7 +1615,7 @@ class svn_fs_progress_notify_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_progress_notify_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1218,13 +1634,13 @@ class svn_fs_progress_notify_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1233,9 +1649,9 @@ class svn_fs_progress_notify_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1246,6 +1662,62 @@ class svn_fs_progress_notify_func_t:
svn_fs_progress_notify_func_t_swigregister = _fs.svn_fs_progress_notify_func_t_swigregister
svn_fs_progress_notify_func_t_swigregister(svn_fs_progress_notify_func_t)
+class svn_fs_hotcopy_notify_t:
+ """Proxy of C svn_fs_hotcopy_notify_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_hotcopy_notify_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_hotcopy_notify_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_fs_invoke_hotcopy_notify(self, *args)
+
+svn_fs_hotcopy_notify_t_swigregister = _fs.svn_fs_hotcopy_notify_t_swigregister
+svn_fs_hotcopy_notify_t_swigregister(svn_fs_hotcopy_notify_t)
+
class svn_fs_freeze_func_t:
"""Proxy of C svn_fs_freeze_func_t struct"""
__swig_setmethods__ = {}
@@ -1255,7 +1727,7 @@ class svn_fs_freeze_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_freeze_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1274,13 +1746,13 @@ class svn_fs_freeze_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1289,9 +1761,9 @@ class svn_fs_freeze_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1311,7 +1783,7 @@ class svn_fs_process_contents_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_process_contents_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1330,13 +1802,13 @@ class svn_fs_process_contents_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1345,9 +1817,9 @@ class svn_fs_process_contents_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1358,6 +1830,62 @@ class svn_fs_process_contents_func_t:
svn_fs_process_contents_func_t_swigregister = _fs.svn_fs_process_contents_func_t_swigregister
svn_fs_process_contents_func_t_swigregister(svn_fs_process_contents_func_t)
+class svn_fs_lock_callback_t:
+ """Proxy of C svn_fs_lock_callback_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_fs_lock_callback_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_fs_lock_callback_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_fs_invoke_lock_callback(self, *args)
+
+svn_fs_lock_callback_t_swigregister = _fs.svn_fs_lock_callback_t_swigregister
+svn_fs_lock_callback_t_swigregister(svn_fs_lock_callback_t)
+
class svn_fs_get_locks_callback_t:
"""Proxy of C svn_fs_get_locks_callback_t struct"""
__swig_setmethods__ = {}
@@ -1367,7 +1895,7 @@ class svn_fs_get_locks_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_get_locks_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1386,13 +1914,13 @@ class svn_fs_get_locks_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1401,9 +1929,9 @@ class svn_fs_get_locks_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1423,7 +1951,7 @@ class svn_fs_pack_notify_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_fs_pack_notify_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1442,13 +1970,13 @@ class svn_fs_pack_notify_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1457,9 +1985,9 @@ class svn_fs_pack_notify_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c b/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
index 1dbdc1b..af22424 100644
--- a/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
+++ b/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
@@ -93,7 +93,7 @@ void svn_swig_py_release_py_lock(void)
if (_saved_thread_key == NULL)
{
/* Obviously, creating a top-level pool for this is pretty stupid. */
- apr_pool_create(&_saved_thread_pool, NULL);
+ _saved_thread_pool = svn_pool_create(NULL);
apr_threadkey_private_create(&_saved_thread_key, NULL,
_saved_thread_pool);
}
@@ -152,7 +152,7 @@ int svn_swig_py_get_pool_arg(PyObject *args, swig_type_info *type,
PyObject *input = PyTuple_GET_ITEM(args, argnum);
if (input != Py_None && PyObject_HasAttrString(input, markValid))
{
- *pool = svn_swig_MustGetPtr(input, type, argnum+1);
+ *pool = svn_swig_py_must_get_ptr(input, type, argnum+1);
if (*pool == NULL)
return 1;
*py_pool = input;
@@ -163,7 +163,7 @@ int svn_swig_py_get_pool_arg(PyObject *args, swig_type_info *type,
/* We couldn't find a pool argument, so we'll create a subpool */
*pool = svn_pool_create(application_pool);
- *py_pool = svn_swig_NewPointerObj(*pool, type, application_py_pool,
+ *py_pool = svn_swig_py_new_pointer_obj(*pool, type, application_py_pool,
NULL);
if (*py_pool == NULL)
return 1;
@@ -190,7 +190,7 @@ int svn_swig_py_get_parent_pool(PyObject *args, swig_type_info *type,
Py_DECREF(*py_pool);
- *pool = svn_swig_MustGetPtr(*py_pool, type, 1);
+ *pool = svn_swig_py_must_get_ptr(*py_pool, type, 1);
if (*pool == NULL)
return 1;
@@ -245,8 +245,8 @@ static int proxy_set_pool(PyObject **proxy, PyObject *pool)
#define svn_swig_TypeQuery(x) SWIG_TypeQuery(x)
/** Wrapper for SWIG_NewPointerObj */
-PyObject *svn_swig_NewPointerObj(void *obj, swig_type_info *type,
- PyObject *pool, PyObject *args)
+PyObject *svn_swig_py_new_pointer_obj(void *obj, swig_type_info *type,
+ PyObject *pool, PyObject *args)
{
PyObject *proxy = SWIG_NewPointerObj(obj, type, 0);
@@ -270,7 +270,7 @@ PyObject *svn_swig_NewPointerObj(void *obj, swig_type_info *type,
return proxy;
}
-/** svn_swig_NewPointerObj, except a string is used to describe the type */
+/** svn_swig_py_new_pointer_obj, except a string is used to describe the type */
static PyObject *svn_swig_NewPointerObjString(void *ptr, const char *type,
PyObject *py_pool)
{
@@ -282,11 +282,11 @@ static PyObject *svn_swig_NewPointerObjString(void *ptr, const char *type,
}
/* ### cache the swig_type_info at some point? */
- return svn_swig_NewPointerObj(ptr, typeinfo, py_pool, NULL);
+ return svn_swig_py_new_pointer_obj(ptr, typeinfo, py_pool, NULL);
}
/** Wrapper for SWIG_ConvertPtr */
-int svn_swig_ConvertPtr(PyObject *input, void **obj, swig_type_info *type)
+int svn_swig_py_convert_ptr(PyObject *input, void **obj, swig_type_info *type)
{
if (PyObject_HasAttrString(input, assertValid))
{
@@ -310,11 +310,11 @@ int svn_swig_ConvertPtr(PyObject *input, void **obj, swig_type_info *type)
static int svn_swig_ConvertPtrString(PyObject *input,
void **obj, const char *type)
{
- return svn_swig_ConvertPtr(input, obj, svn_swig_TypeQuery(type));
+ return svn_swig_py_convert_ptr(input, obj, svn_swig_TypeQuery(type));
}
/** Wrapper for SWIG_MustGetPtr */
-void *svn_swig_MustGetPtr(void *input, swig_type_info *type, int argnum)
+void *svn_swig_py_must_get_ptr(void *input, swig_type_info *type, int argnum)
{
if (PyObject_HasAttrString(input, assertValid))
{
@@ -443,9 +443,9 @@ static PyObject *make_ob_pool(void *pool)
* normally used for anything. It's just here for compatibility
* with Subversion 1.2. */
apr_pool_t *new_pool = svn_pool_create(application_pool);
- PyObject *new_py_pool = svn_swig_NewPointerObj(new_pool,
+ PyObject *new_py_pool = svn_swig_py_new_pointer_obj(new_pool,
svn_swig_TypeQuery("apr_pool_t *"), application_py_pool, NULL);
- (void) pool; /* Silence compiler warnings about unused parameter. */
+ SVN_UNUSED(pool);
return new_py_pool;
}
static PyObject *make_ob_fs_root(svn_fs_root_t *ptr, PyObject *py_pool)
@@ -459,12 +459,20 @@ static PyObject *make_ob_wc_adm_access(void *adm_access)
NULL);
}
+static PyObject *make_ob_error(svn_error_t *err)
+{
+ if (err)
+ return svn_swig_NewPointerObjString(err, "svn_error_t *", NULL);
+ else
+ Py_RETURN_NONE;
+}
+
/***/
/* Conversion from Python single objects (not hashes/lists/etc.) to
Subversion types. */
-static const char *make_string_from_ob(PyObject *ob, apr_pool_t *pool)
+static char *make_string_from_ob(PyObject *ob, apr_pool_t *pool)
{
if (ob == Py_None)
return NULL;
@@ -534,7 +542,7 @@ static PyObject *convert_hash(apr_hash_t *hash,
static PyObject *convert_to_swigtype(void *value, void *ctx, PyObject *py_pool)
{
/* ctx is a 'swig_type_info *' */
- return svn_swig_NewPointerObj(value, ctx, py_pool, NULL);
+ return svn_swig_py_new_pointer_obj(value, ctx, py_pool, NULL);
}
static PyObject *convert_svn_string_t(void *value, void *ctx,
@@ -853,7 +861,7 @@ PyObject *svn_swig_py_convert_hash(apr_hash_t *hash, swig_type_info *type,
static PyObject *make_ob_##type(void *value) \
{ \
apr_pool_t *new_pool = svn_pool_create(application_pool); \
- PyObject *new_py_pool = svn_swig_NewPointerObj(new_pool, \
+ PyObject *new_py_pool = svn_swig_py_new_pointer_obj(new_pool, \
svn_swig_TypeQuery("apr_pool_t *"), application_py_pool, NULL); \
svn_##type##_t *new_value = dup(value, new_pool); \
PyObject *obj = svn_swig_NewPointerObjString(new_value, "svn_" #type "_t *", \
@@ -1224,7 +1232,7 @@ apr_hash_t *svn_swig_py_struct_ptr_hash_from_dict(PyObject *dict,
Py_DECREF(keys);
return NULL;
}
- status = svn_swig_ConvertPtr(value, &struct_ptr, type);
+ status = svn_swig_py_convert_ptr(value, &struct_ptr, type);
if (status != 0)
{
PyErr_SetString(PyExc_TypeError,
@@ -1284,7 +1292,7 @@ svn_swig_py_unwrap_struct_ptr(PyObject *source,
void **ptr_dest = destination;
swig_type_info *type_descriptor = baton;
- int status = svn_swig_ConvertPtr(source, ptr_dest, type_descriptor);
+ int status = svn_swig_py_convert_ptr(source, ptr_dest, type_descriptor);
if (status != 0)
{
@@ -1417,62 +1425,62 @@ commit_item_array_to_list(const apr_array_header_t *array)
}
-
+
/*** Errors ***/
/* Convert a given SubversionException to an svn_error_t. On failure returns
NULL and sets a Python exception. */
static svn_error_t *exception_to_error(PyObject * exc)
{
- const char *message, *file = NULL;
- apr_status_t apr_err;
- long line = 0;
- PyObject *apr_err_ob = NULL, *child_ob = NULL, *message_ob = NULL;
- PyObject *file_ob = NULL, *line_ob = NULL;
+ const char *message, *file = NULL;
+ apr_status_t apr_err;
+ long line = 0;
+ PyObject *apr_err_ob = NULL, *child_ob = NULL, *message_ob = NULL;
+ PyObject *file_ob = NULL, *line_ob = NULL;
svn_error_t *rv = NULL, *child = NULL;
- if ((apr_err_ob = PyObject_GetAttrString(exc, "apr_err")) == NULL)
- goto finished;
- apr_err = (apr_status_t) PyInt_AsLong(apr_err_ob);
- if (PyErr_Occurred()) goto finished;
-
- if ((message_ob = PyObject_GetAttrString(exc, "message")) == NULL)
- goto finished;
- message = PyString_AsString(message_ob);
- if (PyErr_Occurred()) goto finished;
-
- if ((file_ob = PyObject_GetAttrString(exc, "file")) == NULL)
- goto finished;
- if (file_ob != Py_None)
- file = PyString_AsString(file_ob);
- if (PyErr_Occurred()) goto finished;
-
- if ((line_ob = PyObject_GetAttrString(exc, "line")) == NULL)
- goto finished;
- if (line_ob != Py_None)
- line = PyInt_AsLong(line_ob);
- if (PyErr_Occurred()) goto finished;
-
- if ((child_ob = PyObject_GetAttrString(exc, "child")) == NULL)
- goto finished;
- /* We could check if the child is a Subversion exception too,
- but let's just apply duck typing. */
- if (child_ob != Py_None)
- child = exception_to_error(child_ob);
- if (PyErr_Occurred()) goto finished;
-
- rv = svn_error_create(apr_err, child, message);
- /* Somewhat hacky, but we need to preserve original file/line info. */
- rv->file = file ? apr_pstrdup(rv->pool, file) : NULL;
- rv->line = line;
+ if ((apr_err_ob = PyObject_GetAttrString(exc, "apr_err")) == NULL)
+ goto finished;
+ apr_err = (apr_status_t) PyInt_AsLong(apr_err_ob);
+ if (PyErr_Occurred()) goto finished;
+
+ if ((message_ob = PyObject_GetAttrString(exc, "message")) == NULL)
+ goto finished;
+ message = PyString_AsString(message_ob);
+ if (PyErr_Occurred()) goto finished;
+
+ if ((file_ob = PyObject_GetAttrString(exc, "file")) == NULL)
+ goto finished;
+ if (file_ob != Py_None)
+ file = PyString_AsString(file_ob);
+ if (PyErr_Occurred()) goto finished;
+
+ if ((line_ob = PyObject_GetAttrString(exc, "line")) == NULL)
+ goto finished;
+ if (line_ob != Py_None)
+ line = PyInt_AsLong(line_ob);
+ if (PyErr_Occurred()) goto finished;
+
+ if ((child_ob = PyObject_GetAttrString(exc, "child")) == NULL)
+ goto finished;
+ /* We could check if the child is a Subversion exception too,
+ but let's just apply duck typing. */
+ if (child_ob != Py_None)
+ child = exception_to_error(child_ob);
+ if (PyErr_Occurred()) goto finished;
+
+ rv = svn_error_create(apr_err, child, message);
+ /* Somewhat hacky, but we need to preserve original file/line info. */
+ rv->file = file ? apr_pstrdup(rv->pool, file) : NULL;
+ rv->line = line;
finished:
- Py_XDECREF(child_ob);
- Py_XDECREF(line_ob);
- Py_XDECREF(file_ob);
- Py_XDECREF(message_ob);
- Py_XDECREF(apr_err_ob);
- return rv;
+ Py_XDECREF(child_ob);
+ Py_XDECREF(line_ob);
+ Py_XDECREF(file_ob);
+ Py_XDECREF(message_ob);
+ Py_XDECREF(apr_err_ob);
+ return rv;
}
/* If the currently set Python exception is a valid SubversionException,
@@ -1540,6 +1548,7 @@ static svn_error_t *type_conversion_error(const char *datatype)
typedef struct item_baton {
PyObject *editor; /* the editor handling the callbacks */
PyObject *baton; /* the dir/file baton (or NULL for edit baton) */
+ apr_pool_t *pool; /* top-level pool */
} item_baton;
static item_baton *make_baton(apr_pool_t *pool,
@@ -1548,13 +1557,11 @@ static item_baton *make_baton(apr_pool_t *pool,
{
item_baton *newb = apr_palloc(pool, sizeof(*newb));
- /* Note: We steal the caller's reference to 'baton'. Also, to avoid
- memory leaks, we borrow the caller's reference to 'editor'. In this
- case, borrowing the reference to 'editor' is safe because the contents
- of an item_baton struct are only used by functino calls which operate on
- the editor itself. */
+ /* Note: We steal the caller's reference to 'baton'. */
+ Py_INCREF(editor);
newb->editor = editor;
newb->baton = baton;
+ newb->pool = pool;
return newb;
}
@@ -1583,6 +1590,9 @@ static svn_error_t *close_baton(void *baton,
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
+ /* Release the editor object */
+ Py_DECREF(ib->editor);
+
/* We're now done with the baton. Since there isn't really a free, all
we need to do is note that its objects are no longer referenced by
the baton. */
@@ -2044,6 +2054,373 @@ void svn_swig_py_make_editor(const svn_delta_editor_t **editor,
*edit_baton = make_baton(pool, py_editor, NULL);
}
+
+/* Wrappers for dump stream parser */
+
+static svn_error_t *parse_fn3_magic_header_record(int version,
+ void *parse_baton,
+ apr_pool_t *pool)
+{
+ item_baton *ib = parse_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"magic_header_record",
+ (char *)"lO&", version,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_uuid_record(const char *uuid,
+ void *parse_baton,
+ apr_pool_t *pool)
+{
+ item_baton *ib = parse_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"uuid_record",
+ (char *)"sO&", uuid,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_new_revision_record(void **revision_baton,
+ apr_hash_t *headers,
+ void *parse_baton,
+ apr_pool_t *pool)
+{
+ item_baton *ib = parse_baton;
+ PyObject *result;
+ PyObject *tmp;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"new_revision_record",
+ (char *)"O&O&",
+ svn_swig_py_stringhash_to_dict, headers,
+ make_ob_pool, pool)) == NULL) {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* make_baton takes our 'result' reference */
+ *revision_baton = make_baton(pool, ib->editor, result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_new_node_record(void **node_baton,
+ apr_hash_t *headers,
+ void *revision_baton,
+ apr_pool_t *pool)
+{
+ item_baton *ib = revision_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"new_node_record",
+ (char *)"O&OO&",
+ svn_swig_py_stringhash_to_dict, headers,
+ ib->baton,
+ make_ob_pool, pool)) == NULL) {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* make_baton takes our 'result' reference */
+ *node_baton = make_baton(pool, ib->editor, result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_set_revision_property(void *revision_baton,
+ const char *name,
+ const svn_string_t *value)
+{
+ item_baton *ib = revision_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"set_revision_property",
+ (char *)"Oss#", ib->baton, name,
+ value ? value->data : NULL,
+ value ? value->len : 0)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_set_node_property(void *node_baton,
+ const char *name,
+ const svn_string_t *value)
+{
+ item_baton *ib = node_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"set_node_property",
+ (char *)"Oss#", ib->baton, name,
+ value ? value->data : NULL,
+ value ? value->len : 0)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_delete_node_property(void *node_baton,
+ const char *name)
+{
+ item_baton *ib = node_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"delete_node_property",
+ (char *)"Os", ib->baton, name)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_remove_node_props(void *node_baton)
+{
+ item_baton *ib = node_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"remove_node_props",
+ (char *)"(O)", ib->baton)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* there is no return value, so just toss this object (probably Py_None) */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_set_fulltext(svn_stream_t **stream,
+ void *node_baton)
+{
+ item_baton *ib = node_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"set_fulltext",
+ (char *)"(O)", ib->baton)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* Interpret None to mean NULL - no text is desired */
+ if (result == Py_None)
+ {
+ *stream = NULL;
+ }
+ else
+ {
+ /* create a stream from the IO object. it will increment the
+ reference on the 'result'. */
+ *stream = svn_swig_py_make_stream(result, ib->pool);
+ }
+
+ /* if the handler returned an IO object, svn_swig_py_make_stream() has
+ incremented its reference counter. If it was None, it is discarded. */
+ Py_DECREF(result);
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_apply_textdelta(svn_txdelta_window_handler_t *handler,
+ void **handler_baton,
+ void *node_baton)
+{
+ item_baton *ib = node_baton;
+ PyObject *result;
+ svn_error_t *err;
+
+ svn_swig_py_acquire_py_lock();
+
+ /* ### python doesn't have 'const' on the method name and format */
+ if ((result = PyObject_CallMethod(ib->editor, (char *)"apply_textdelta",
+ (char *)"(O)", ib->baton)) == NULL)
+ {
+ err = callback_exception_error();
+ goto finished;
+ }
+
+ /* Interpret None to mean svn_delta_noop_window_handler. This is much
+ easier/faster than making code always have to write a NOOP handler
+ in Python. */
+ if (result == Py_None)
+ {
+ Py_DECREF(result);
+
+ *handler = svn_delta_noop_window_handler;
+ *handler_baton = NULL;
+ }
+ else
+ {
+ /* return the thunk for invoking the handler. the baton takes our
+ 'result' reference, which is the handler. */
+ *handler = window_handler;
+ *handler_baton = result;
+ }
+
+ err = SVN_NO_ERROR;
+
+ finished:
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
+static svn_error_t *parse_fn3_close_node(void *node_baton)
+{
+ return close_baton(node_baton, "close_node");
+}
+
+
+static svn_error_t *parse_fn3_close_revision(void *revision_baton)
+{
+ return close_baton(revision_baton, "close_revision");
+}
+
+
+static const svn_repos_parse_fns3_t thunk_parse_fns3_vtable =
+ {
+ parse_fn3_magic_header_record,
+ parse_fn3_uuid_record,
+ parse_fn3_new_revision_record,
+ parse_fn3_new_node_record,
+ parse_fn3_set_revision_property,
+ parse_fn3_set_node_property,
+ parse_fn3_delete_node_property,
+ parse_fn3_remove_node_props,
+ parse_fn3_set_fulltext,
+ parse_fn3_apply_textdelta,
+ parse_fn3_close_node,
+ parse_fn3_close_revision
+ };
+
+static apr_status_t
+svn_swig_py_parse_fns3_destroy(void *parse_baton)
+{
+ close_baton(parse_baton, "_close_dumpstream");
+ return APR_SUCCESS;
+}
+
+void svn_swig_py_make_parse_fns3(const svn_repos_parse_fns3_t **parse_fns3,
+ void **parse_baton,
+ PyObject *py_parse_fns3,
+ apr_pool_t *pool)
+{
+ *parse_fns3 = &thunk_parse_fns3_vtable;
+ *parse_baton = make_baton(pool, py_parse_fns3, NULL);
+
+ /* Dump stream vtable does not provide a method which is called right before
+ the end of the parsing (similar to close_edit/abort_edit in delta editor).
+ Thus, register a pool clean-up routine to release this parse baton. */
+ apr_pool_cleanup_register(pool, *parse_baton, svn_swig_py_parse_fns3_destroy,
+ apr_pool_cleanup_null);
+}
/*** Other Wrappers for SVN Functions ***/
@@ -2200,7 +2577,8 @@ svn_swig_py_make_stream(PyObject *py_io, apr_pool_t *pool)
svn_stream_t *stream;
stream = svn_stream_create(py_io, pool);
- svn_stream_set_read(stream, read_handler_pyio);
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_handler_pyio);
svn_stream_set_write(stream, write_handler_pyio);
svn_stream_set_close(stream, close_handler_pyio);
apr_pool_cleanup_register(pool, py_io, svn_swig_py_stream_destroy,
@@ -2223,7 +2601,7 @@ svn_swig_py_convert_txdelta_op_c_array(int num_ops,
for (i = 0; i < num_ops; ++i)
PyList_SET_ITEM(result, i,
- svn_swig_NewPointerObj(ops + i, op_type_info,
+ svn_swig_py_new_pointer_obj(ops + i, op_type_info,
parent_pool, NULL));
return result;
@@ -2483,6 +2861,42 @@ svn_error_t *svn_swig_py_fs_get_locks_func(void *baton,
return err;
}
+svn_error_t *svn_swig_py_fs_lock_callback(
+ void *baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+ PyObject *py_callback = baton, *result;
+
+ if (py_callback == NULL || py_callback == Py_None)
+ return SVN_NO_ERROR;
+
+ svn_swig_py_acquire_py_lock();
+
+ if ((result = PyObject_CallFunction(py_callback,
+ (char *)"sO&O&O&",
+ path,
+ make_ob_lock, lock,
+ make_ob_error, fs_err,
+ make_ob_pool, pool)) == NULL)
+ {
+ err = callback_exception_error();
+ }
+ else if (result != Py_None)
+ {
+ err = callback_bad_return_error("Not None");
+ }
+
+ Py_XDECREF(result);
+
+ svn_swig_py_release_py_lock();
+ return err;
+}
+
+
svn_error_t *svn_swig_py_get_commit_log_func(const char **log_msg,
const char **tmp_file,
const apr_array_header_t *
@@ -3391,7 +3805,7 @@ ra_callbacks_open_tmp_file(apr_file_t **fp,
*fp = svn_swig_py_make_file(result, pool);
if (*fp == NULL)
{
- err = callback_exception_error();
+ err = callback_exception_error();
}
}
@@ -3441,7 +3855,7 @@ ra_callbacks_get_wc_prop(void *baton,
Py_ssize_t len;
if (PyString_AsStringAndSize(result, &buf, &len) == -1)
{
- err = callback_exception_error();
+ err = callback_exception_error();
}
else
{
@@ -3683,7 +4097,7 @@ ra_callbacks_get_client_string(void *baton,
{
if ((*name = PyString_AsString(result)) == NULL)
{
- err = callback_exception_error();
+ err = callback_exception_error();
}
}
@@ -3882,9 +4296,10 @@ svn_error_t *svn_swig_py_ra_lock_callback(
svn_swig_py_acquire_py_lock();
if ((result = PyObject_CallFunction(py_callback,
- (char *)"sbO&O&",
+ (char *)"sbO&O&O&",
path, do_lock,
make_ob_lock, lock,
+ make_ob_error, ra_err,
make_ob_pool, pool)) == NULL)
{
err = callback_exception_error();
@@ -4068,7 +4483,7 @@ static svn_error_t *reporter_abort_report(void *report_baton,
return err;
}
-const svn_ra_reporter2_t swig_py_ra_reporter2 = {
+static const svn_ra_reporter2_t swig_py_ra_reporter2 = {
reporter_set_path,
reporter_delete_path,
reporter_link_path,
@@ -4076,6 +4491,11 @@ const svn_ra_reporter2_t swig_py_ra_reporter2 = {
reporter_abort_report
};
+const svn_ra_reporter2_t *svn_swig_py_get_ra_reporter2()
+{
+ return &swig_py_ra_reporter2;
+}
+
/* svn_wc_diff_callbacks2_t */
static svn_error_t *
wc_diff_callbacks2_file_changed_or_added(const char *callback,
diff --git a/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h b/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h
index 60931c2..512da28 100644
--- a/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h
+++ b/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.h
@@ -40,16 +40,6 @@
#include "svn_repos.h"
/* Define DLL export magic on Windows. */
-#ifdef WIN32
-# ifdef SVN_SWIG_SWIGUTIL_PY_C
-# define SVN_SWIG_SWIGUTIL_EXPORT __declspec(dllexport)
-# else
-# define SVN_SWIG_SWIGUTIL_EXPORT __declspec(dllimport)
-# endif
-#else
-# define SVN_SWIG_SWIGUTIL_EXPORT
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -57,27 +47,22 @@ extern "C" {
/* Initialize the libsvn_swig_py library. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_status_t svn_swig_py_initialize(void);
/* Functions to manage python's global interpreter lock */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_release_py_lock(void);
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_acquire_py_lock(void);
/*** Automatic Pool Management Functions ***/
/* Set the application pool */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_set_application_pool(PyObject *py_pool, apr_pool_t *pool);
/* Clear the application pool */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_clear_application_pool(void);
/* Get the pool argument from the last element of tuple args.
@@ -85,7 +70,6 @@ void svn_swig_py_clear_application_pool(void);
* subpool. Return 0 if successful. Return 1 if an error
* occurs.
*/
-SVN_SWIG_SWIGUTIL_EXPORT
int svn_swig_py_get_pool_arg(PyObject *args, swig_type_info *type,
PyObject **py_pool, apr_pool_t **pool);
@@ -93,7 +77,6 @@ int svn_swig_py_get_pool_arg(PyObject *args, swig_type_info *type,
* argument list. Return 0 if successful. Return 1 if an error
* occurs.
*/
-SVN_SWIG_SWIGUTIL_EXPORT
int svn_swig_py_get_parent_pool(PyObject *args, swig_type_info *type,
PyObject **py_pool, apr_pool_t **pool);
@@ -101,54 +84,45 @@ int svn_swig_py_get_parent_pool(PyObject *args, swig_type_info *type,
/*** SWIG Wrappers ***/
/* Wrapper for SWIG_NewPointerObj */
-SVN_SWIG_SWIGUTIL_EXPORT
-PyObject *svn_swig_NewPointerObj(void *obj, swig_type_info *type,
+PyObject *svn_swig_py_new_pointer_obj(void *obj, swig_type_info *type,
PyObject *pool, PyObject *args);
/* Wrapper for SWIG_ConvertPtr */
-SVN_SWIG_SWIGUTIL_EXPORT
-int svn_swig_ConvertPtr(PyObject *input, void **obj, swig_type_info *type);
+int svn_swig_py_convert_ptr(PyObject *input, void **obj, swig_type_info *type);
/* Wrapper for SWIG_MustGetPtr */
-SVN_SWIG_SWIGUTIL_EXPORT
-void *svn_swig_MustGetPtr(void *input, swig_type_info *type, int argnum);
+void *svn_swig_py_must_get_ptr(void *input, swig_type_info *type, int argnum);
/*** Functions to expose a custom SubversionException ***/
/* raise a subversion exception, created from a normal subversion
error. consume the error. */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_svn_exception(svn_error_t *err);
/* helper function to convert an apr_hash_t* (char* -> svnstring_t*) to
a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_prophash_to_dict(apr_hash_t *hash);
/* helper function to convert an apr_hash_t* (svn_revnum_t* -> const
char *) to a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_locationhash_to_dict(apr_hash_t *hash);
/* helper function to convert an apr_array_header_t* (of
svn_merge_range_t *) to a Python list */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_pointerlist_to_list(apr_array_header_t *list,
swig_type_info *type,
PyObject *py_pool);
/* helper function to convert an apr_hash_t* (const char *->array of
svn_merge_range_t *) to a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_mergeinfo_to_dict(apr_hash_t *hash,
swig_type_info *type,
PyObject *py_pool);
/* helper function to convert an apr_hash_t* (const char *->hash of
mergeinfo hashes) to a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_mergeinfo_catalog_to_dict(apr_hash_t *hash,
swig_type_info *type,
PyObject *py_pool);
@@ -156,90 +130,75 @@ PyObject *svn_swig_py_mergeinfo_catalog_to_dict(apr_hash_t *hash,
/* helper function to convert an apr_hash_t *(const char *->const char
*) to a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_stringhash_to_dict(apr_hash_t *hash);
/* convert a hash of 'const char *' -> TYPE into a Python dict */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_convert_hash(apr_hash_t *hash, swig_type_info *type,
PyObject *py_pool);
/* helper function to convert a 'char **' into a Python list of string
objects */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_c_strings_to_list(char **strings);
/* helper function to convert an array of 'const char *' to a Python list
of string objects */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_array_to_list(const apr_array_header_t *strings);
/* helper function to convert a hash mapping char * to
* svn_log_changed_path_t * to a Python dict mapping str to str. */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_changed_path_hash_to_dict(apr_hash_t *hash);
/* helper function to convert a hash mapping char * to
* svn_log_changed_path2_t * to a Python dict mapping str to str. */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_changed_path2_hash_to_dict(apr_hash_t *hash);
/* helper function to convert an array of 'svn_revnum_t' to a Python list
of int objects */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_revarray_to_list(const apr_array_header_t *revs);
/* helper function to convert a Python dictionary mapping strings to
strings into an apr_hash_t mapping const char *'s to const char *'s,
allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_py_stringhash_from_dict(PyObject *dict,
apr_pool_t *pool);
/* helper function to convert a Python dictionary mapping strings to
rangelists into an apr_hash_t mapping const char *'s to rangelists,
allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_py_mergeinfo_from_dict(PyObject *dict,
apr_pool_t *pool);
/* helper function to convert a Python dictionary mapping strings to
strings into an 'apr_array_header_t *' of svn_prop_t *
allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_py_proparray_from_dict(PyObject *dict,
apr_pool_t *pool);
/* helper function to convert a 'apr_array_header_t *' of 'svn_prop_t
to a Python dictionary mapping strings to strings. */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *svn_swig_py_proparray_to_dict(const apr_array_header_t *array);
/* helper function to convert a 'apr_array_header_t *' of
'svn_prop_inherited_item_t' to a Python dictionary mapping strings
to dictionary. */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *
svn_swig_py_propinheriteditemarray_to_dict(const apr_array_header_t *array);
/* helper function to convert a Python dictionary mapping strings to
strings into an apr_hash_t mapping const char *'s to svn_string_t's,
allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_py_prophash_from_dict(PyObject *dict,
apr_pool_t *pool);
/* helper function to convert a Python dictionary mapping strings to
integers into an apr_hash_t mapping const char *'s to revnums,
allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_py_path_revs_hash_from_dict(PyObject *dict,
apr_pool_t *pool);
/* helper function to convert a Python dictionary mapping strings to
SWIG wrappers described by type into an apr_hash_t mapping const char *'s to
struct pointers, allocated in POOL. */
-SVN_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_py_struct_ptr_hash_from_dict(PyObject *dict,
swig_type_info *type,
apr_pool_t *pool);
@@ -259,7 +218,6 @@ typedef int (*svn_swig_py_object_unwrap_t)(PyObject *source,
In case of failure, raises a Python exception, presuming that seq was the
function argument #argnum.
pool is used to allocate the array. */
-SVN_SWIG_SWIGUTIL_EXPORT
const apr_array_header_t *
svn_swig_py_seq_to_array(PyObject *seq,
int element_size,
@@ -269,7 +227,6 @@ svn_swig_py_seq_to_array(PyObject *seq,
/* An svn_swig_py_object_unwrap_t that extracts a char pointer from a Python
string. */
-SVN_SWIG_SWIGUTIL_EXPORT
int
svn_swig_py_unwrap_string(PyObject *source,
void *destination,
@@ -277,7 +234,6 @@ svn_swig_py_unwrap_string(PyObject *source,
/* An svn_swig_py_object_unwrap_t that extracts an svn_revnum_t from a Python
integer. */
-SVN_SWIG_SWIGUTIL_EXPORT
int
svn_swig_py_unwrap_revnum(PyObject *source,
void *destination,
@@ -285,30 +241,31 @@ svn_swig_py_unwrap_revnum(PyObject *source,
/* An svn_swig_py_object_unwrap_t that extracts a struct pointer from a SWIG
wrapper. baton is expected to be a swig_type_info* describing the struct. */
-SVN_SWIG_SWIGUTIL_EXPORT
int
svn_swig_py_unwrap_struct_ptr(PyObject *source,
void *destination,
void *baton);
/* make an editor that "thunks" from C callbacks up to Python */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_make_editor(const svn_delta_editor_t **editor,
void **edit_baton,
PyObject *py_editor,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
+/* make a parse vtable that "thunks" from C callbacks up to Python */
+void svn_swig_py_make_parse_fns3(const svn_repos_parse_fns3_t **parse_fns3,
+ void **parse_baton,
+ PyObject *py_parse_fns3,
+ apr_pool_t *pool);
+
apr_file_t *svn_swig_py_make_file(PyObject *py_file,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_stream_t *svn_swig_py_make_stream(PyObject *py_io,
apr_pool_t *pool);
/* Convert ops, a C array of num_ops elements, to a Python list of SWIG
objects with descriptor op_type_info and pool set to parent_pool. */
-SVN_SWIG_SWIGUTIL_EXPORT
PyObject *
svn_swig_py_convert_txdelta_op_c_array(int num_ops,
svn_txdelta_op_t *ops,
@@ -317,7 +274,6 @@ svn_swig_py_convert_txdelta_op_c_array(int num_ops,
/* a notify function that executes a Python function that is passed in
via the baton argument */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_notify_func(void *baton,
const char *path,
svn_wc_notify_action_t action,
@@ -327,21 +283,18 @@ void svn_swig_py_notify_func(void *baton,
svn_wc_notify_state_t prop_state,
svn_revnum_t revision);
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_notify_func2(void *baton,
const svn_wc_notify_t *notify,
apr_pool_t *pool);
/* a status function that executes a Python function that is passed in
via the baton argument */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_status_func(void *baton,
const char *path,
svn_wc_status_t *status);
/* a svn_delta_path_driver callback that executes a Python function
that is passed in via the baton argument */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_delta_path_driver_cb_func(void **dir_baton,
void *parent_baton,
void *callback_baton,
@@ -350,24 +303,27 @@ svn_error_t *svn_swig_py_delta_path_driver_cb_func(void **dir_baton,
/* a status function that executes a Python function that is passed in
via the baton argument */
-SVN_SWIG_SWIGUTIL_EXPORT
void svn_swig_py_status_func2(void *baton,
const char *path,
svn_wc_status2_t *status);
/* a cancel function that executes a Python function passed in via the
cancel_baton argument. */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_cancel_func(void *cancel_baton);
/* thunked fs get_locks function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_fs_get_locks_func(void *baton,
svn_lock_t *lock,
apr_pool_t *pool);
+svn_error_t *svn_swig_py_fs_lock_callback(
+ void *baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *ra_err,
+ apr_pool_t *pool);
+
/* thunked commit log fetcher */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_get_commit_log_func(const char **log_msg,
const char **tmp_file,
const apr_array_header_t *
@@ -376,7 +332,6 @@ svn_error_t *svn_swig_py_get_commit_log_func(const char **log_msg,
apr_pool_t *pool);
/* thunked repos authz callback function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_repos_authz_func(svn_boolean_t *allowed,
svn_fs_root_t *root,
const char *path,
@@ -384,14 +339,12 @@ svn_error_t *svn_swig_py_repos_authz_func(svn_boolean_t *allowed,
apr_pool_t *pool);
/* thunked history callback function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_repos_history_func(void *baton,
const char *path,
svn_revnum_t revision,
apr_pool_t *pool);
/* thunked log receiver function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_log_receiver(void *py_receiver,
apr_hash_t *changed_paths,
svn_revnum_t rev,
@@ -401,23 +354,19 @@ svn_error_t *svn_swig_py_log_receiver(void *py_receiver,
apr_pool_t *pool);
/* thunked log receiver2 function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_log_entry_receiver(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool);
/* thunked repos freeze function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_repos_freeze_func(void *baton,
apr_pool_t *pool);
/* thunked fs freeze function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_fs_freeze_func(void *baton,
apr_pool_t *pool);
/* thunked proplist receiver2 function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_proplist_receiver2(void *baton,
const char *path,
apr_hash_t *prop_hash,
@@ -425,21 +374,18 @@ svn_error_t *svn_swig_py_proplist_receiver2(void *baton,
apr_pool_t *pool);
/* thunked info receiver function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_info_receiver_func(void *py_receiver,
const char *path,
const svn_info_t *info,
apr_pool_t *pool);
/* thunked location segments receiver function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *
svn_swig_py_location_segment_receiver_func(svn_location_segment_t *segment,
void *baton,
apr_pool_t *pool);
/* thunked blame receiver function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_client_blame_receiver_func(void *baton,
apr_int64_t line_no,
svn_revnum_t revision,
@@ -449,21 +395,18 @@ svn_error_t *svn_swig_py_client_blame_receiver_func(void *baton,
apr_pool_t *pool);
/* thunked changelist receiver function */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_changelist_receiver_func(void *baton,
const char *path,
const char *changelist,
apr_pool_t *pool);
/* auth provider callbacks */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t * svn_swig_py_auth_gnome_keyring_unlock_prompt_func(
char **keyring_passwd,
const char *keyring_name,
void *baton,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_auth_simple_prompt_func(
svn_auth_cred_simple_t **cred,
void *baton,
@@ -472,7 +415,6 @@ svn_error_t *svn_swig_py_auth_simple_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_auth_username_prompt_func(
svn_auth_cred_username_t **cred,
void *baton,
@@ -480,7 +422,6 @@ svn_error_t *svn_swig_py_auth_username_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_auth_ssl_server_trust_prompt_func(
svn_auth_cred_ssl_server_trust_t **cred,
void *baton,
@@ -490,7 +431,6 @@ svn_error_t *svn_swig_py_auth_ssl_server_trust_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_auth_ssl_client_cert_prompt_func(
svn_auth_cred_ssl_client_cert_t **cred,
void *baton,
@@ -498,7 +438,6 @@ svn_error_t *svn_swig_py_auth_ssl_client_cert_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_auth_ssl_client_cert_pw_prompt_func(
svn_auth_cred_ssl_client_cert_pw_t **cred,
void *baton,
@@ -507,7 +446,6 @@ svn_error_t *svn_swig_py_auth_ssl_client_cert_pw_prompt_func(
apr_pool_t *pool);
/* auth cleanup callback */
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_config_auth_walk_func(svn_boolean_t *delete_cred,
void *walk_baton,
const char *cred_kind,
@@ -515,32 +453,27 @@ svn_error_t *svn_swig_py_config_auth_walk_func(svn_boolean_t *delete_cred,
apr_hash_t *hash,
apr_pool_t *scratch_pool);
-SVN_SWIG_SWIGUTIL_EXPORT
void
svn_swig_py_setup_ra_callbacks(svn_ra_callbacks2_t **callbacks,
void **baton,
PyObject *py_callbacks,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_wc_diff_callbacks2_t *
svn_swig_py_setup_wc_diff_callbacks2(void **baton,
PyObject *py_callbacks,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_commit_callback2(const svn_commit_info_t *commit_info,
void *baton,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_commit_callback(svn_revnum_t new_revision,
const char *date,
const char *author,
void *baton);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_ra_file_rev_handler_func(
void *baton,
const char *path,
@@ -551,7 +484,6 @@ svn_error_t *svn_swig_py_ra_file_rev_handler_func(
apr_array_header_t *prop_diffs,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_py_ra_lock_callback(
void *baton,
const char *path,
@@ -560,17 +492,14 @@ svn_error_t *svn_swig_py_ra_lock_callback(
svn_error_t *ra_err,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
-extern const svn_ra_reporter2_t swig_py_ra_reporter2;
+const svn_ra_reporter2_t *svn_swig_py_get_ra_reporter2(void);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_boolean_t
svn_swig_py_config_enumerator2(const char *name,
const char *value,
void *baton,
apr_pool_t *pool);
-SVN_SWIG_SWIGUTIL_EXPORT
svn_boolean_t
svn_swig_py_config_section_enumerator2(const char *name,
void *baton,
diff --git a/subversion/bindings/swig/python/ra.py b/subversion/bindings/swig/python/ra.py
index d43ae5e..6fa76da 100644
--- a/subversion/bindings/swig/python/ra.py
+++ b/subversion/bindings/swig/python/ra.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -108,7 +110,7 @@ class svn_ra_reporter3_t:
__swig_setmethods__["abort_report"] = _ra.svn_ra_reporter3_t_abort_report_set
__swig_getmethods__["abort_report"] = _ra.svn_ra_reporter3_t_abort_report_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_reporter3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -127,13 +129,13 @@ class svn_ra_reporter3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -142,9 +144,9 @@ class svn_ra_reporter3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -192,7 +194,7 @@ class svn_ra_reporter2_t:
__swig_setmethods__["abort_report"] = _ra.svn_ra_reporter2_t_abort_report_set
__swig_getmethods__["abort_report"] = _ra.svn_ra_reporter2_t_abort_report_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_reporter2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -211,13 +213,13 @@ class svn_ra_reporter2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -226,9 +228,9 @@ class svn_ra_reporter2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -276,7 +278,7 @@ class svn_ra_reporter_t:
__swig_setmethods__["abort_report"] = _ra.svn_ra_reporter_t_abort_report_set
__swig_getmethods__["abort_report"] = _ra.svn_ra_reporter_t_abort_report_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_reporter_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -295,13 +297,13 @@ class svn_ra_reporter_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -310,9 +312,9 @@ class svn_ra_reporter_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -371,8 +373,14 @@ class svn_ra_callbacks2_t:
__swig_getmethods__["get_client_string"] = _ra.svn_ra_callbacks2_t_get_client_string_get
__swig_setmethods__["get_wc_contents"] = _ra.svn_ra_callbacks2_t_get_wc_contents_set
__swig_getmethods__["get_wc_contents"] = _ra.svn_ra_callbacks2_t_get_wc_contents_get
+ __swig_setmethods__["check_tunnel_func"] = _ra.svn_ra_callbacks2_t_check_tunnel_func_set
+ __swig_getmethods__["check_tunnel_func"] = _ra.svn_ra_callbacks2_t_check_tunnel_func_get
+ __swig_setmethods__["open_tunnel_func"] = _ra.svn_ra_callbacks2_t_open_tunnel_func_set
+ __swig_getmethods__["open_tunnel_func"] = _ra.svn_ra_callbacks2_t_open_tunnel_func_get
+ __swig_setmethods__["tunnel_baton"] = _ra.svn_ra_callbacks2_t_tunnel_baton_set
+ __swig_getmethods__["tunnel_baton"] = _ra.svn_ra_callbacks2_t_tunnel_baton_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_callbacks2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -391,13 +399,13 @@ class svn_ra_callbacks2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -406,9 +414,9 @@ class svn_ra_callbacks2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -446,7 +454,7 @@ class svn_ra_callbacks_t:
__swig_setmethods__["invalidate_wc_props"] = _ra.svn_ra_callbacks_t_invalidate_wc_props_set
__swig_getmethods__["invalidate_wc_props"] = _ra.svn_ra_callbacks_t_invalidate_wc_props_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_callbacks_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -465,13 +473,13 @@ class svn_ra_callbacks_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -480,9 +488,9 @@ class svn_ra_callbacks_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -915,7 +923,7 @@ class svn_ra_plugin_t:
__swig_setmethods__["get_version"] = _ra.svn_ra_plugin_t_get_version_set
__swig_getmethods__["get_version"] = _ra.svn_ra_plugin_t_get_version_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_plugin_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -934,13 +942,13 @@ class svn_ra_plugin_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -949,9 +957,9 @@ class svn_ra_plugin_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1044,7 +1052,7 @@ class svn_ra_session_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_session_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1063,13 +1071,13 @@ class svn_ra_session_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1078,9 +1086,9 @@ class svn_ra_session_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1380,6 +1388,22 @@ def svn_ra_invoke_replay_revfinish_callback(*args):
"""
return _ra.svn_ra_invoke_replay_revfinish_callback(*args)
+def svn_ra_invoke_check_tunnel_func(*args):
+ """svn_ra_invoke_check_tunnel_func(svn_ra_check_tunnel_func_t _obj, void * tunnel_baton, char const * tunnel_name) -> svn_boolean_t"""
+ return _ra.svn_ra_invoke_check_tunnel_func(*args)
+
+def svn_ra_invoke_close_tunnel_func(*args):
+ """svn_ra_invoke_close_tunnel_func(svn_ra_close_tunnel_func_t _obj, void * close_baton, void * tunnel_baton)"""
+ return _ra.svn_ra_invoke_close_tunnel_func(*args)
+
+def svn_ra_invoke_open_tunnel_func(*args):
+ """
+ svn_ra_invoke_open_tunnel_func(svn_ra_open_tunnel_func_t _obj, void * tunnel_baton, char const * tunnel_name, char const * user,
+ char const * hostname, int port, svn_cancel_func_t cancel_func,
+ apr_pool_t pool) -> svn_error_t
+ """
+ return _ra.svn_ra_invoke_open_tunnel_func(*args)
+
def svn_ra_invoke_init_func(*args):
"""svn_ra_invoke_init_func(svn_ra_init_func_t _obj, int abi_version, apr_pool_t pool, apr_hash_t hash) -> svn_error_t"""
return _ra.svn_ra_invoke_init_func(*args)
@@ -1392,7 +1416,7 @@ class svn_ra_get_wc_prop_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_get_wc_prop_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1411,13 +1435,13 @@ class svn_ra_get_wc_prop_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1426,9 +1450,9 @@ class svn_ra_get_wc_prop_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1448,7 +1472,7 @@ class svn_ra_set_wc_prop_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_set_wc_prop_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1467,13 +1491,13 @@ class svn_ra_set_wc_prop_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1482,9 +1506,9 @@ class svn_ra_set_wc_prop_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1504,7 +1528,7 @@ class svn_ra_push_wc_prop_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_push_wc_prop_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1523,13 +1547,13 @@ class svn_ra_push_wc_prop_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1538,9 +1562,9 @@ class svn_ra_push_wc_prop_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1560,7 +1584,7 @@ class svn_ra_invalidate_wc_props_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_invalidate_wc_props_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1579,13 +1603,13 @@ class svn_ra_invalidate_wc_props_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1594,9 +1618,9 @@ class svn_ra_invalidate_wc_props_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1616,7 +1640,7 @@ class svn_ra_get_wc_contents_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_get_wc_contents_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1635,13 +1659,13 @@ class svn_ra_get_wc_contents_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1650,9 +1674,9 @@ class svn_ra_get_wc_contents_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1672,7 +1696,7 @@ class svn_ra_get_latest_revnum_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_get_latest_revnum_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1691,13 +1715,13 @@ class svn_ra_get_latest_revnum_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1706,9 +1730,9 @@ class svn_ra_get_latest_revnum_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1728,7 +1752,7 @@ class svn_ra_get_client_string_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_get_client_string_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1747,13 +1771,13 @@ class svn_ra_get_client_string_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1762,9 +1786,9 @@ class svn_ra_get_client_string_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1784,7 +1808,7 @@ class svn_ra_file_rev_handler_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_file_rev_handler_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1803,13 +1827,13 @@ class svn_ra_file_rev_handler_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1818,9 +1842,9 @@ class svn_ra_file_rev_handler_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1840,7 +1864,7 @@ class svn_ra_lock_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_lock_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1859,13 +1883,13 @@ class svn_ra_lock_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1874,9 +1898,9 @@ class svn_ra_lock_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1896,7 +1920,7 @@ class svn_ra_progress_notify_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_progress_notify_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1915,13 +1939,13 @@ class svn_ra_progress_notify_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1930,9 +1954,9 @@ class svn_ra_progress_notify_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1952,7 +1976,7 @@ class svn_ra_replay_revstart_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_replay_revstart_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1971,13 +1995,13 @@ class svn_ra_replay_revstart_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1986,9 +2010,9 @@ class svn_ra_replay_revstart_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2008,7 +2032,63 @@ class svn_ra_replay_revfinish_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_replay_revfinish_callback_t"""
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_ra_invoke_replay_revfinish_callback(self, *args)
+
+svn_ra_replay_revfinish_callback_t_swigregister = _ra.svn_ra_replay_revfinish_callback_t_swigregister
+svn_ra_replay_revfinish_callback_t_swigregister(svn_ra_replay_revfinish_callback_t)
+
+class svn_ra_check_tunnel_func_t:
+ """Proxy of C svn_ra_check_tunnel_func_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_ra_check_tunnel_func_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_ra_check_tunnel_func_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2027,13 +2107,69 @@ class svn_ra_replay_revfinish_callback_t:
value = _swig_getattr(self, self.__class__, name)
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+
+ def __call__(self, *args):
+ return svn_ra_invoke_check_tunnel_func(self, *args)
+svn_ra_check_tunnel_func_t_swigregister = _ra.svn_ra_check_tunnel_func_t_swigregister
+svn_ra_check_tunnel_func_t_swigregister(svn_ra_check_tunnel_func_t)
+
+class svn_ra_close_tunnel_func_t:
+ """Proxy of C svn_ra_close_tunnel_func_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_ra_close_tunnel_func_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_ra_close_tunnel_func_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2042,18 +2178,74 @@ class svn_ra_replay_revfinish_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+ return _swig_setattr(self, self.__class__, name, value)
+ def __call__(self, *args):
+ return svn_ra_invoke_close_tunnel_func(self, *args)
+
+svn_ra_close_tunnel_func_t_swigregister = _ra.svn_ra_close_tunnel_func_t_swigregister
+svn_ra_close_tunnel_func_t_swigregister(svn_ra_close_tunnel_func_t)
+class svn_ra_open_tunnel_func_t:
+ """Proxy of C svn_ra_open_tunnel_func_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_ra_open_tunnel_func_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_ra_open_tunnel_func_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
def __call__(self, *args):
- return svn_ra_invoke_replay_revfinish_callback(self, *args)
+ return svn_ra_invoke_open_tunnel_func(self, *args)
-svn_ra_replay_revfinish_callback_t_swigregister = _ra.svn_ra_replay_revfinish_callback_t_swigregister
-svn_ra_replay_revfinish_callback_t_swigregister(svn_ra_replay_revfinish_callback_t)
+svn_ra_open_tunnel_func_t_swigregister = _ra.svn_ra_open_tunnel_func_t_swigregister
+svn_ra_open_tunnel_func_t_swigregister(svn_ra_open_tunnel_func_t)
class svn_ra_init_func_t:
"""Proxy of C svn_ra_init_func_t struct"""
@@ -2064,7 +2256,7 @@ class svn_ra_init_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_ra_init_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2083,13 +2275,13 @@ class svn_ra_init_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2098,9 +2290,9 @@ class svn_ra_init_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/python/repos.py b/subversion/bindings/swig/python/repos.py
index aa9a5c5..fad1e58 100644
--- a/subversion/bindings/swig/python/repos.py
+++ b/subversion/bindings/swig/python/repos.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -88,6 +90,10 @@ import libsvn.core
import libsvn.delta
import libsvn.fs
+def svn_swig_py_make_parse_fns3(*args):
+ """svn_swig_py_make_parse_fns3(PyObject * py_parse_fns3, apr_pool_t pool)"""
+ return _repos.svn_swig_py_make_parse_fns3(*args)
+
def svn_repos_version():
"""svn_repos_version() -> svn_version_t const *"""
return _repos.svn_repos_version()
@@ -95,9 +101,6 @@ svn_node_action_change = _repos.svn_node_action_change
svn_node_action_add = _repos.svn_node_action_add
svn_node_action_delete = _repos.svn_node_action_delete
svn_node_action_replace = _repos.svn_node_action_replace
-svn_repos_load_uuid_default = _repos.svn_repos_load_uuid_default
-svn_repos_load_uuid_ignore = _repos.svn_repos_load_uuid_ignore
-svn_repos_load_uuid_force = _repos.svn_repos_load_uuid_force
svn_authz_none = _repos.svn_authz_none
svn_authz_read = _repos.svn_authz_read
svn_authz_write = _repos.svn_authz_write
@@ -122,9 +125,16 @@ svn_repos_notify_recover_start = _repos.svn_repos_notify_recover_start
svn_repos_notify_upgrade_start = _repos.svn_repos_notify_upgrade_start
svn_repos_notify_load_skipped_rev = _repos.svn_repos_notify_load_skipped_rev
svn_repos_notify_verify_rev_structure = _repos.svn_repos_notify_verify_rev_structure
+svn_repos_notify_pack_revprops = _repos.svn_repos_notify_pack_revprops
+svn_repos_notify_cleanup_revprops = _repos.svn_repos_notify_cleanup_revprops
+svn_repos_notify_format_bumped = _repos.svn_repos_notify_format_bumped
+svn_repos_notify_hotcopy_rev_range = _repos.svn_repos_notify_hotcopy_rev_range
svn_repos_notify_warning_found_old_reference = _repos.svn_repos_notify_warning_found_old_reference
svn_repos_notify_warning_found_old_mergeinfo = _repos.svn_repos_notify_warning_found_old_mergeinfo
svn_repos_notify_warning_invalid_fspath = _repos.svn_repos_notify_warning_invalid_fspath
+svn_repos_notify_warning_name_collision = _repos.svn_repos_notify_warning_name_collision
+svn_repos_notify_warning_mergeinfo_collision = _repos.svn_repos_notify_warning_mergeinfo_collision
+svn_repos_notify_warning_invalid_mergeinfo = _repos.svn_repos_notify_warning_invalid_mergeinfo
class svn_repos_notify_t:
"""Proxy of C svn_repos_notify_t struct"""
__swig_setmethods__ = {}
@@ -151,8 +161,12 @@ class svn_repos_notify_t:
__swig_getmethods__["node_action"] = _repos.svn_repos_notify_t_node_action_get
__swig_setmethods__["path"] = _repos.svn_repos_notify_t_path_set
__swig_getmethods__["path"] = _repos.svn_repos_notify_t_path_get
+ __swig_setmethods__["start_revision"] = _repos.svn_repos_notify_t_start_revision_set
+ __swig_getmethods__["start_revision"] = _repos.svn_repos_notify_t_start_revision_get
+ __swig_setmethods__["end_revision"] = _repos.svn_repos_notify_t_end_revision_set
+ __swig_getmethods__["end_revision"] = _repos.svn_repos_notify_t_end_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_notify_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -171,13 +185,13 @@ class svn_repos_notify_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -186,9 +200,9 @@ class svn_repos_notify_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -205,6 +219,10 @@ def svn_repos_find_root_path(*args):
"""svn_repos_find_root_path(char const * path, apr_pool_t pool) -> char const *"""
return _repos.svn_repos_find_root_path(*args)
+def svn_repos_open3(*args):
+ """svn_repos_open3(char const * path, apr_hash_t fs_config, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _repos.svn_repos_open3(*args)
+
def svn_repos_open2(*args):
"""svn_repos_open2(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"""
return _repos.svn_repos_open2(*args)
@@ -241,12 +259,32 @@ def svn_repos_delete(*args):
def svn_repos_has_capability(*args):
"""svn_repos_has_capability(svn_repos_t * repos, char const * capability, apr_pool_t pool) -> svn_error_t"""
return _repos.svn_repos_has_capability(*args)
+
+def svn_repos_capabilities(*args):
+ """svn_repos_capabilities(svn_repos_t * repos, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _repos.svn_repos_capabilities(*args)
SVN_REPOS_CAPABILITY_MERGEINFO = _repos.SVN_REPOS_CAPABILITY_MERGEINFO
+def svn_repos_remember_client_capabilities(*args):
+ """svn_repos_remember_client_capabilities(svn_repos_t * repos, apr_array_header_t capabilities) -> svn_error_t"""
+ return _repos.svn_repos_remember_client_capabilities(*args)
+
def svn_repos_fs(*args):
"""svn_repos_fs(svn_repos_t * repos) -> svn_fs_t *"""
return _repos.svn_repos_fs(*args)
+def svn_repos_fs_type(*args):
+ """svn_repos_fs_type(svn_repos_t * repos, apr_pool_t result_pool) -> char const *"""
+ return _repos.svn_repos_fs_type(*args)
+
+def svn_repos_hotcopy3(*args):
+ """
+ svn_repos_hotcopy3(char const * src_path, char const * 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, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _repos.svn_repos_hotcopy3(*args)
+
def svn_repos_hotcopy2(*args):
"""
svn_repos_hotcopy2(char const * src_path, char const * dst_path, svn_boolean_t clean_logs, svn_boolean_t incremental,
@@ -494,9 +532,9 @@ def svn_repos_replay(*args):
def svn_repos_get_commit_editor5(*args):
"""
- svn_repos_get_commit_editor5(svn_repos_t * repos, svn_fs_txn_t * txn, char const * repos_url, char const * base_path,
- apr_hash_t revprop_table, svn_commit_callback2_t commit_callback, svn_repos_authz_callback_t authz_callback,
- void * authz_baton, apr_pool_t pool) -> svn_error_t
+ svn_repos_get_commit_editor5(svn_repos_t * repos, svn_fs_txn_t * txn, char const * repos_url_decoded, char const * base_path,
+ apr_hash_t revprop_table, svn_commit_callback2_t commit_callback,
+ svn_repos_authz_callback_t authz_callback, void * authz_baton, apr_pool_t pool) -> svn_error_t
"""
return _repos.svn_repos_get_commit_editor5(*args)
@@ -657,6 +695,14 @@ def svn_repos_fs_begin_txn_for_update(*args):
"""svn_repos_fs_begin_txn_for_update(svn_repos_t * repos, svn_revnum_t rev, char const * author, apr_pool_t pool) -> svn_error_t"""
return _repos.svn_repos_fs_begin_txn_for_update(*args)
+def svn_repos_fs_lock_many(*args):
+ """
+ svn_repos_fs_lock_many(svn_repos_t * repos, apr_hash_t lock_targets, char const * comment, svn_boolean_t is_dav_comment,
+ apr_time_t expiration_date, svn_boolean_t steal_lock, svn_fs_lock_callback_t lock_callback,
+ apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _repos.svn_repos_fs_lock_many(*args)
+
def svn_repos_fs_lock(*args):
"""
svn_repos_fs_lock(svn_repos_t * repos, char const * path, char const * token, char const * comment,
@@ -665,6 +711,13 @@ def svn_repos_fs_lock(*args):
"""
return _repos.svn_repos_fs_lock(*args)
+def svn_repos_fs_unlock_many(*args):
+ """
+ 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,
+ apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _repos.svn_repos_fs_unlock_many(*args)
+
def svn_repos_fs_unlock(*args):
"""
svn_repos_fs_unlock(svn_repos_t * repos, char const * path, char const * token, svn_boolean_t break_lock,
@@ -733,6 +786,13 @@ def svn_repos_fs_change_node_prop(*args):
"""
return _repos.svn_repos_fs_change_node_prop(*args)
+def svn_repos_fs_get_inherited_props(*args):
+ """
+ svn_repos_fs_get_inherited_props(svn_fs_root_t * root, char const * path, char const * propname, svn_repos_authz_func_t authz_read_func,
+ apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _repos.svn_repos_fs_get_inherited_props(*args)
+
def svn_repos_fs_change_txn_prop(*args):
"""svn_repos_fs_change_txn_prop(svn_fs_txn_t * txn, char const * name, svn_string_t const * value, apr_pool_t pool) -> svn_error_t"""
return _repos.svn_repos_fs_change_txn_prop(*args)
@@ -769,7 +829,7 @@ class svn_repos_node_t:
__swig_setmethods__["parent"] = _repos.svn_repos_node_t_parent_set
__swig_getmethods__["parent"] = _repos.svn_repos_node_t_parent_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_node_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -788,13 +848,13 @@ class svn_repos_node_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -803,9 +863,9 @@ class svn_repos_node_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -824,6 +884,10 @@ def svn_repos_node_editor(*args):
def svn_repos_node_from_baton(*args):
"""svn_repos_node_from_baton(void * edit_baton) -> svn_repos_node_t"""
return _repos.svn_repos_node_from_baton(*args)
+
+def svn_repos_info_format(*args):
+ """svn_repos_info_format(svn_repos_t * repos, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"""
+ return _repos.svn_repos_info_format(*args)
SVN_REPOS_DUMPFILE_MAGIC_HEADER = _repos.SVN_REPOS_DUMPFILE_MAGIC_HEADER
SVN_REPOS_DUMPFILE_FORMAT_VERSION = _repos.SVN_REPOS_DUMPFILE_FORMAT_VERSION
SVN_REPOS_DUMPFILE_FORMAT_VERSION_DELTAS = _repos.SVN_REPOS_DUMPFILE_FORMAT_VERSION_DELTAS
@@ -848,6 +912,18 @@ SVN_REPOS_DUMPFILE_TEXT_DELTA = _repos.SVN_REPOS_DUMPFILE_TEXT_DELTA
SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5 = _repos.SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5
SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1 = _repos.SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1
SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM = _repos.SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM
+svn_repos_load_uuid_default = _repos.svn_repos_load_uuid_default
+svn_repos_load_uuid_ignore = _repos.svn_repos_load_uuid_ignore
+svn_repos_load_uuid_force = _repos.svn_repos_load_uuid_force
+
+def svn_repos_verify_fs3(*args):
+ """
+ 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) -> svn_error_t
+ """
+ return _repos.svn_repos_verify_fs3(*args)
def svn_repos_verify_fs2(*args):
"""
@@ -889,6 +965,16 @@ def svn_repos_dump_fs(*args):
"""
return _repos.svn_repos_dump_fs(*args)
+def svn_repos_load_fs5(*args):
+ """
+ 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, char const * 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, apr_pool_t pool) -> svn_error_t
+ """
+ return _repos.svn_repos_load_fs5(*args)
+
def svn_repos_load_fs4(*args):
"""
svn_repos_load_fs4(svn_repos_t * repos, svn_stream_t * dumpstream, svn_revnum_t start_rev, svn_revnum_t end_rev,
@@ -957,7 +1043,7 @@ class svn_repos_parse_fns3_t:
__swig_setmethods__["close_revision"] = _repos.svn_repos_parse_fns3_t_close_revision_set
__swig_getmethods__["close_revision"] = _repos.svn_repos_parse_fns3_t_close_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_parse_fns3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -976,13 +1062,13 @@ class svn_repos_parse_fns3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -991,9 +1077,9 @@ class svn_repos_parse_fns3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1045,6 +1131,16 @@ def svn_repos_parse_dumpstream3(*args):
"""
return _repos.svn_repos_parse_dumpstream3(*args)
+def svn_repos_get_fs_build_parser5(*args):
+ """
+ svn_repos_get_fs_build_parser5(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,
+ char const * 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) -> svn_error_t
+ """
+ return _repos.svn_repos_get_fs_build_parser5(*args)
+
def svn_repos_get_fs_build_parser4(*args):
"""
svn_repos_get_fs_build_parser4(svn_repos_t * repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t use_history,
@@ -1084,7 +1180,7 @@ class svn_repos_parse_fns2_t:
__swig_setmethods__["close_revision"] = _repos.svn_repos_parse_fns2_t_close_revision_set
__swig_getmethods__["close_revision"] = _repos.svn_repos_parse_fns2_t_close_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_parse_fns2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1103,13 +1199,13 @@ class svn_repos_parse_fns2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1118,9 +1214,9 @@ class svn_repos_parse_fns2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1188,7 +1284,7 @@ class svn_repos_parser_fns_t:
__swig_setmethods__["close_revision"] = _repos.svn_repos_parser_fns_t_close_revision_set
__swig_getmethods__["close_revision"] = _repos.svn_repos_parser_fns_t_close_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_parse_fns_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1207,13 +1303,13 @@ class svn_repos_parser_fns_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1222,9 +1318,9 @@ class svn_repos_parser_fns_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1297,17 +1393,6 @@ def svn_repos_check_revision_access(*args):
svn_repos_authz_func_t authz_read_func, apr_pool_t pool) -> svn_error_t
"""
return _repos.svn_repos_check_revision_access(*args)
-
-def svn_repos_fs_get_inherited_props(*args):
- """
- svn_repos_fs_get_inherited_props(svn_fs_root_t * root, char const * path, char const * propname, svn_repos_authz_func_t authz_read_func,
- apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
- """
- return _repos.svn_repos_fs_get_inherited_props(*args)
-
-def svn_repos_remember_client_capabilities(*args):
- """svn_repos_remember_client_capabilities(svn_repos_t * repos, apr_array_header_t capabilities) -> svn_error_t"""
- return _repos.svn_repos_remember_client_capabilities(*args)
class svn_repos_t:
"""Proxy of C svn_repos_t struct"""
__swig_setmethods__ = {}
@@ -1317,7 +1402,7 @@ class svn_repos_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1336,13 +1421,13 @@ class svn_repos_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1351,9 +1436,9 @@ class svn_repos_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1370,7 +1455,7 @@ class svn_authz_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_authz_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1389,13 +1474,13 @@ class svn_authz_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1404,9 +1489,9 @@ class svn_authz_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1521,13 +1606,6 @@ def svn_repos_invoke_authz_callback(*args):
"""
return _repos.svn_repos_invoke_authz_callback(*args)
-def svn_repos_invoke_file_rev_handler(*args):
- """
- svn_repos_invoke_file_rev_handler(svn_repos_file_rev_handler_t _obj, void * baton, char const * path, svn_revnum_t rev,
- apr_hash_t rev_props, apr_array_header_t prop_diffs, apr_pool_t pool) -> svn_error_t
- """
- return _repos.svn_repos_invoke_file_rev_handler(*args)
-
def svn_repos_invoke_notify_func(*args):
"""svn_repos_invoke_notify_func(svn_repos_notify_func_t _obj, void * baton, svn_repos_notify_t notify, apr_pool_t scratch_pool)"""
return _repos.svn_repos_invoke_notify_func(*args)
@@ -1542,6 +1620,20 @@ def svn_repos_invoke_history_func(*args):
apr_pool_t pool) -> svn_error_t
"""
return _repos.svn_repos_invoke_history_func(*args)
+
+def svn_repos_invoke_file_rev_handler(*args):
+ """
+ svn_repos_invoke_file_rev_handler(svn_repos_file_rev_handler_t _obj, void * baton, char const * path, svn_revnum_t rev,
+ apr_hash_t rev_props, apr_array_header_t prop_diffs, apr_pool_t pool) -> svn_error_t
+ """
+ return _repos.svn_repos_invoke_file_rev_handler(*args)
+
+def svn_repos_invoke_verify_callback(*args):
+ """
+ svn_repos_invoke_verify_callback(svn_repos_verify_callback_t _obj, void * baton, svn_revnum_t revision, svn_error_t verify_err,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _repos.svn_repos_invoke_verify_callback(*args)
class svn_repos_authz_func_t:
"""Proxy of C svn_repos_authz_func_t struct"""
__swig_setmethods__ = {}
@@ -1551,7 +1643,7 @@ class svn_repos_authz_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_authz_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1570,13 +1662,13 @@ class svn_repos_authz_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1585,9 +1677,9 @@ class svn_repos_authz_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1607,7 +1699,7 @@ class svn_repos_authz_callback_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_authz_callback_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1626,13 +1718,13 @@ class svn_repos_authz_callback_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1641,9 +1733,9 @@ class svn_repos_authz_callback_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1654,16 +1746,16 @@ class svn_repos_authz_callback_t:
svn_repos_authz_callback_t_swigregister = _repos.svn_repos_authz_callback_t_swigregister
svn_repos_authz_callback_t_swigregister(svn_repos_authz_callback_t)
-class svn_repos_file_rev_handler_t:
- """Proxy of C svn_repos_file_rev_handler_t struct"""
+class svn_repos_notify_func_t:
+ """Proxy of C svn_repos_notify_func_t struct"""
__swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_file_rev_handler_t, name, value)
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_notify_func_t, name, value)
__swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_file_rev_handler_t, name)
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_notify_func_t, name)
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_file_rev_handler_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1682,13 +1774,13 @@ class svn_repos_file_rev_handler_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1697,29 +1789,29 @@ class svn_repos_file_rev_handler_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
def __call__(self, *args):
- return svn_repos_invoke_file_rev_handler(self, *args)
+ return svn_repos_invoke_notify_func(self, *args)
-svn_repos_file_rev_handler_t_swigregister = _repos.svn_repos_file_rev_handler_t_swigregister
-svn_repos_file_rev_handler_t_swigregister(svn_repos_file_rev_handler_t)
+svn_repos_notify_func_t_swigregister = _repos.svn_repos_notify_func_t_swigregister
+svn_repos_notify_func_t_swigregister(svn_repos_notify_func_t)
-class svn_repos_notify_func_t:
- """Proxy of C svn_repos_notify_func_t struct"""
+class svn_repos_freeze_func_t:
+ """Proxy of C svn_repos_freeze_func_t struct"""
__swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_notify_func_t, name, value)
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_freeze_func_t, name, value)
__swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_notify_func_t, name)
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_freeze_func_t, name)
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_notify_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1738,13 +1830,13 @@ class svn_repos_notify_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1753,29 +1845,29 @@ class svn_repos_notify_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
def __call__(self, *args):
- return svn_repos_invoke_notify_func(self, *args)
+ return svn_repos_invoke_freeze_func(self, *args)
-svn_repos_notify_func_t_swigregister = _repos.svn_repos_notify_func_t_swigregister
-svn_repos_notify_func_t_swigregister(svn_repos_notify_func_t)
+svn_repos_freeze_func_t_swigregister = _repos.svn_repos_freeze_func_t_swigregister
+svn_repos_freeze_func_t_swigregister(svn_repos_freeze_func_t)
-class svn_repos_freeze_func_t:
- """Proxy of C svn_repos_freeze_func_t struct"""
+class svn_repos_history_func_t:
+ """Proxy of C svn_repos_history_func_t struct"""
__swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_freeze_func_t, name, value)
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_history_func_t, name, value)
__swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_freeze_func_t, name)
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_history_func_t, name)
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_freeze_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1794,13 +1886,13 @@ class svn_repos_freeze_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1809,29 +1901,29 @@ class svn_repos_freeze_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
def __call__(self, *args):
- return svn_repos_invoke_freeze_func(self, *args)
+ return svn_repos_invoke_history_func(self, *args)
-svn_repos_freeze_func_t_swigregister = _repos.svn_repos_freeze_func_t_swigregister
-svn_repos_freeze_func_t_swigregister(svn_repos_freeze_func_t)
+svn_repos_history_func_t_swigregister = _repos.svn_repos_history_func_t_swigregister
+svn_repos_history_func_t_swigregister(svn_repos_history_func_t)
-class svn_repos_history_func_t:
- """Proxy of C svn_repos_history_func_t struct"""
+class svn_repos_file_rev_handler_t:
+ """Proxy of C svn_repos_file_rev_handler_t struct"""
__swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_history_func_t, name, value)
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_file_rev_handler_t, name, value)
__swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_history_func_t, name)
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_file_rev_handler_t, name)
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_repos_history_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1850,13 +1942,13 @@ class svn_repos_history_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1865,18 +1957,74 @@ class svn_repos_history_func_t:
"""Set an attribute on this object"""
self.assert_valid()
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
+ self.__dict__.setdefault("_members",{})[name] = value
+
+ return _swig_setattr(self, self.__class__, name, value)
+ def __call__(self, *args):
+ return svn_repos_invoke_file_rev_handler(self, *args)
+svn_repos_file_rev_handler_t_swigregister = _repos.svn_repos_file_rev_handler_t_swigregister
+svn_repos_file_rev_handler_t_swigregister(svn_repos_file_rev_handler_t)
+class svn_repos_verify_callback_t:
+ """Proxy of C svn_repos_verify_callback_t struct"""
+ __swig_setmethods__ = {}
+ __setattr__ = lambda self, name, value: _swig_setattr(self, svn_repos_verify_callback_t, name, value)
+ __swig_getmethods__ = {}
+ __getattr__ = lambda self, name: _swig_getattr(self, svn_repos_verify_callback_t, name)
+ def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
+ __repr__ = _swig_repr
+ def set_parent_pool(self, parent_pool=None):
+ """Create a new proxy object for TYPE"""
+ import libsvn.core, weakref
+ self.__dict__["_parent_pool"] = \
+ parent_pool or libsvn.core.application_pool;
+ if self.__dict__["_parent_pool"]:
+ self.__dict__["_is_valid"] = weakref.ref(
+ self.__dict__["_parent_pool"]._is_valid)
+
+ def assert_valid(self):
+ """Assert that this object is using valid pool memory"""
+ if "_is_valid" in self.__dict__:
+ assert self.__dict__["_is_valid"](), "Variable has already been deleted"
+
+ def __getattr__(self, name):
+ """Get an attribute from this object"""
+ self.assert_valid()
+
+ value = _swig_getattr(self, self.__class__, name)
+
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
+ members = self.__dict__.get("_members")
+ if members is not None:
+ _copy_metadata_deep(value, members.get(name))
+
+ # Verify that the new object is good
+ _assert_valid_deep(value)
+
+ return value
+
+ def __setattr__(self, name, value):
+ """Set an attribute on this object"""
+ self.assert_valid()
+
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
def __call__(self, *args):
- return svn_repos_invoke_history_func(self, *args)
+ return svn_repos_invoke_verify_callback(self, *args)
-svn_repos_history_func_t_swigregister = _repos.svn_repos_history_func_t_swigregister
-svn_repos_history_func_t_swigregister(svn_repos_history_func_t)
+svn_repos_verify_callback_t_swigregister = _repos.svn_repos_verify_callback_t_swigregister
+svn_repos_verify_callback_t_swigregister(svn_repos_verify_callback_t)
# This file is compatible with both classic and new-style classes.
diff --git a/subversion/bindings/swig/python/svn/core.py b/subversion/bindings/swig/python/svn/core.py
index 386581c..bed78c1 100644
--- a/subversion/bindings/swig/python/svn/core.py
+++ b/subversion/bindings/swig/python/svn/core.py
@@ -27,44 +27,8 @@ from libsvn.core import *
import libsvn.core as _libsvncore
import atexit as _atexit
import sys
-__all__ = [
- # Symbols that 'import *' used to pull (in 1.7)
- 'Pool',
- 'SVNSYNC_PROP_CURRENTLY_COPYING',
- 'SVNSYNC_PROP_FROM_URL',
- 'SVNSYNC_PROP_FROM_UUID',
- 'SVNSYNC_PROP_LAST_MERGED_REV',
- 'SVNSYNC_PROP_LOCK',
- 'SVNSYNC_PROP_PREFIX',
- 'SubversionException',
- # 'apr_array_header_t',
- # 'apr_file_open_stderr',
- # 'apr_file_open_stdout',
- # 'apr_file_t',
- # 'apr_hash_t',
- # 'apr_initialize',
- # 'apr_pool_clear',
- # 'apr_pool_destroy',
- # 'apr_pool_t',
- # 'apr_terminate',
- # 'apr_time_ansi_put',
- # 'run_app',
-
- # Symbols defined explicitly below.
- 'SVN_IGNORED_REVNUM',
- 'SVN_INVALID_REVNUM',
- 'svn_path_compare_paths',
- 'svn_mergeinfo_merge',
- 'svn_mergeinfo_sort',
- 'svn_rangelist_merge',
- 'svn_rangelist_reverse',
- # 'Stream',
- # 'apr_initialize',
- # 'apr_terminate',
- 'svn_pool_create',
- 'svn_pool_destroy',
- 'svn_pool_clear',
-]
+# __all__ is defined later, since some svn_* functions are implemented below.
+
class SubversionException(Exception):
@@ -205,6 +169,8 @@ class Stream:
self._stream = stream
def read(self, amt=None):
+ if self._stream is None:
+ raise ValueError
if amt is None:
# read the rest of the stream
chunks = [ ]
@@ -219,9 +185,16 @@ class Stream:
return svn_stream_read(self._stream, int(amt))
def write(self, buf):
+ if self._stream is None:
+ raise ValueError
### what to do with the amount written? (the result value)
svn_stream_write(self._stream, buf)
+ def close(self):
+ if self._stream is not None:
+ svn_stream_close(self._stream)
+ self._stream = None
+
def secs_from_timestr(svn_datetime, pool=None):
"""Convert a Subversion datetime string into seconds since the Epoch."""
aprtime = svn_time_from_cstring(svn_datetime, pool)
@@ -343,3 +316,21 @@ def run_app(func, *args, **kw):
performed as the function exits (normally or via an exception).
'''
return func(application_pool, *args, **kw)
+
+# Currently, this excludes:
+# 'FALSE' 'TRUE'
+# 'apr_array_header_t' 'apr_file_t' 'apr_hash_t'
+# 'apr_file_open_stderr' 'apr_file_open_stdout'
+# 'apr_initialize' 'apr_terminate'
+# 'apr_pool_clear' 'apr_pool_destroy' 'apr_pool_t'
+# 'apr_time_ansi_put'
+# 'run_app'
+# 'svn_relpath__internal_style' 'svn_uri__is_ancestor'
+# 'svn_tristate__from_word' 'svn_tristate__to_word'
+__all__ = filter(lambda s: (s.startswith('svn_')
+ or s.startswith('SVN_')
+ or s.startswith('SVNSYNC_')
+ or s in ('Pool', 'SubversionException'))
+ and '__' not in s,
+ locals())
+
diff --git a/subversion/bindings/swig/python/svn/repos.py b/subversion/bindings/swig/python/svn/repos.py
index f5e5944..1951aed 100644
--- a/subversion/bindings/swig/python/svn/repos.py
+++ b/subversion/bindings/swig/python/svn/repos.py
@@ -285,3 +285,56 @@ class RevisionChangeCollector(ChangeCollector):
if idx == -1:
return parent_path + '/' + path
return parent_path + path[idx:]
+
+
+class ParseFns3:
+ def __init__(self):
+ pass
+
+ def __del__(self):
+ pass
+
+ def _close_dumpstream(self):
+ # Does not correspond to a C method - called before finishing the
+ # parsing of the dump stream.
+ pass
+
+ def magic_header_record(self, version, pool=None):
+ pass
+
+ def uuid_record(self, uuid, pool=None):
+ pass
+
+ def new_revision_record(self, headers, pool=None):
+ return None # Returns revision_baton
+
+ def new_node_record(self, headers, revision_baton, pool=None):
+ return None # Returns node_baton
+
+ def set_revision_property(self, revision_baton, name, value):
+ pass
+
+ def set_node_property(self, node_baton, name, value):
+ pass
+
+ def delete_node_property(self, node_baton, name):
+ pass
+
+ def remove_node_props(self, node_baton):
+ pass
+
+ def set_fulltext(self, node_baton):
+ return None # Returns a writable stream
+
+ def apply_textdelta(self, node_baton):
+ return None # Returns delta window handler
+
+ def close_node(self, node_baton):
+ pass
+
+ def close_revision(self, revision_baton):
+ pass
+
+
+def make_parse_fns3(parse_fns3, pool=None):
+ return svn_swig_py_make_parse_fns3(parse_fns3, pool)
diff --git a/subversion/bindings/swig/python/svn_client.c b/subversion/bindings/swig/python/svn_client.c
index b823730..eb959f8 100644
--- a/subversion/bindings/swig/python/svn_client.c
+++ b/subversion/bindings/swig/python/svn_client.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2957,173 +2931,177 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[14]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[15]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_int swig_types[42]
-#define SWIGTYPE_p_long swig_types[43]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[44]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[45]
-#define SWIGTYPE_p_p_char swig_types[46]
-#define SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void swig_types[47]
-#define SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[48]
-#define SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[49]
-#define SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[50]
-#define SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[52]
-#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[54]
-#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[55]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[56]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[57]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[58]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[59]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[60]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[61]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[62]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[63]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[64]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[65]
-#define SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[66]
-#define SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[67]
-#define SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[68]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[69]
-#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[70]
-#define SWIGTYPE_p_p_svn_client_commit_item3_t swig_types[71]
-#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[72]
-#define SWIGTYPE_p_p_svn_commit_info_t swig_types[73]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[74]
-#define SWIGTYPE_p_p_svn_string_t swig_types[75]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[76]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[77]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[78]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[79]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[80]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[81]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[82]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[83]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[84]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[85]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[86]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[87]
-#define SWIGTYPE_p_svn_checksum_t swig_types[88]
-#define SWIGTYPE_p_svn_client_commit_info_t swig_types[89]
-#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[90]
-#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[91]
-#define SWIGTYPE_p_svn_client_commit_item_t swig_types[92]
-#define SWIGTYPE_p_svn_client_copy_source_t swig_types[93]
-#define SWIGTYPE_p_svn_client_ctx_t swig_types[94]
-#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[95]
-#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[96]
-#define SWIGTYPE_p_svn_client_info2_t swig_types[97]
-#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[98]
-#define SWIGTYPE_p_svn_client_status_t swig_types[99]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[100]
-#define SWIGTYPE_p_svn_config_t swig_types[101]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[102]
-#define SWIGTYPE_p_svn_depth_t swig_types[103]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[104]
-#define SWIGTYPE_p_svn_dirent_t swig_types[105]
-#define SWIGTYPE_p_svn_errno_t swig_types[106]
-#define SWIGTYPE_p_svn_error_t swig_types[107]
-#define SWIGTYPE_p_svn_info_t swig_types[108]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[109]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[110]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[111]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[112]
-#define SWIGTYPE_p_svn_lock_t swig_types[113]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[114]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[115]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[116]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[117]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[118]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[119]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[120]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[121]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[122]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[123]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[124]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[125]
-#define SWIGTYPE_p_svn_prop_kind swig_types[126]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[127]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[128]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[129]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[130]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[131]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[132]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[133]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_t swig_types[135]
-#define SWIGTYPE_p_svn_string_t swig_types[136]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[137]
-#define SWIGTYPE_p_svn_tristate_t swig_types[138]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[139]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[140]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[141]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[142]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[143]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[144]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[145]
-#define SWIGTYPE_p_svn_version_t swig_types[146]
-#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[147]
-#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[148]
-#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[149]
-#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[150]
-#define SWIGTYPE_p_svn_wc_conflict_description2_t swig_types[151]
-#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[152]
-#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[153]
-#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[154]
-#define SWIGTYPE_p_svn_wc_conflict_result_t swig_types[155]
-#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[156]
-#define SWIGTYPE_p_svn_wc_context_t swig_types[157]
-#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[158]
-#define SWIGTYPE_p_svn_wc_diff_callbacks3_t swig_types[159]
-#define SWIGTYPE_p_svn_wc_diff_callbacks4_t swig_types[160]
-#define SWIGTYPE_p_svn_wc_diff_callbacks_t swig_types[161]
-#define SWIGTYPE_p_svn_wc_entry_callbacks2_t swig_types[162]
-#define SWIGTYPE_p_svn_wc_entry_callbacks_t swig_types[163]
-#define SWIGTYPE_p_svn_wc_entry_t swig_types[164]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[165]
-#define SWIGTYPE_p_svn_wc_external_item_t swig_types[166]
-#define SWIGTYPE_p_svn_wc_info_t swig_types[167]
-#define SWIGTYPE_p_svn_wc_merge_outcome_t swig_types[168]
-#define SWIGTYPE_p_svn_wc_notify_action_t swig_types[169]
-#define SWIGTYPE_p_svn_wc_notify_lock_state_t swig_types[170]
-#define SWIGTYPE_p_svn_wc_notify_state_t swig_types[171]
-#define SWIGTYPE_p_svn_wc_notify_t swig_types[172]
-#define SWIGTYPE_p_svn_wc_operation_t swig_types[173]
-#define SWIGTYPE_p_svn_wc_revision_status_t swig_types[174]
-#define SWIGTYPE_p_svn_wc_schedule_t swig_types[175]
-#define SWIGTYPE_p_svn_wc_status2_t swig_types[176]
-#define SWIGTYPE_p_svn_wc_status3_t swig_types[177]
-#define SWIGTYPE_p_svn_wc_status_t swig_types[178]
-#define SWIGTYPE_p_svn_wc_traversal_info_t swig_types[179]
-#define SWIGTYPE_p_unsigned_long swig_types[180]
-#define SWIGTYPE_p_void swig_types[181]
-static swig_type_info *swig_types[183];
-static swig_module_info swig_module = {swig_types, 182, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_int swig_types[44]
+#define SWIGTYPE_p_long swig_types[45]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[46]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[47]
+#define SWIGTYPE_p_p_char swig_types[48]
+#define SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void swig_types[49]
+#define SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[50]
+#define SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[51]
+#define SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[53]
+#define SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[57]
+#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[58]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char__int swig_types[59]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[60]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[61]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[62]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[63]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[64]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[65]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[66]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[67]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[68]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[69]
+#define SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[70]
+#define SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[71]
+#define SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[72]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[73]
+#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[74]
+#define SWIGTYPE_p_p_svn_client_commit_item3_t swig_types[75]
+#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[76]
+#define SWIGTYPE_p_p_svn_commit_info_t swig_types[77]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[78]
+#define SWIGTYPE_p_p_svn_string_t swig_types[79]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[80]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[81]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[82]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[83]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[84]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[85]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[86]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[87]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[88]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[89]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[90]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[91]
+#define SWIGTYPE_p_svn_checksum_t swig_types[92]
+#define SWIGTYPE_p_svn_client_commit_info_t swig_types[93]
+#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[94]
+#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[95]
+#define SWIGTYPE_p_svn_client_commit_item_t swig_types[96]
+#define SWIGTYPE_p_svn_client_copy_source_t swig_types[97]
+#define SWIGTYPE_p_svn_client_ctx_t swig_types[98]
+#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[99]
+#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[100]
+#define SWIGTYPE_p_svn_client_info2_t swig_types[101]
+#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[102]
+#define SWIGTYPE_p_svn_client_status_t swig_types[103]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[104]
+#define SWIGTYPE_p_svn_config_t swig_types[105]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[106]
+#define SWIGTYPE_p_svn_depth_t swig_types[107]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[108]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[109]
+#define SWIGTYPE_p_svn_dirent_t swig_types[110]
+#define SWIGTYPE_p_svn_errno_t swig_types[111]
+#define SWIGTYPE_p_svn_error_t swig_types[112]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[113]
+#define SWIGTYPE_p_svn_info_t swig_types[114]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[115]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[116]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[117]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[118]
+#define SWIGTYPE_p_svn_lock_t swig_types[119]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[120]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[121]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[122]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[123]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[124]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[125]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[126]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[127]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[128]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[129]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[130]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[131]
+#define SWIGTYPE_p_svn_prop_kind swig_types[132]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[133]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[134]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[135]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[136]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[137]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[138]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[139]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[140]
+#define SWIGTYPE_p_svn_stream_t swig_types[141]
+#define SWIGTYPE_p_svn_string_t swig_types[142]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[143]
+#define SWIGTYPE_p_svn_tristate_t swig_types[144]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[145]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[146]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[147]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[148]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[149]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[150]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[151]
+#define SWIGTYPE_p_svn_version_t swig_types[152]
+#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[153]
+#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[154]
+#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[155]
+#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[156]
+#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[157]
+#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[158]
+#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[159]
+#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[160]
+#define SWIGTYPE_p_svn_wc_context_t swig_types[161]
+#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[162]
+#define SWIGTYPE_p_svn_wc_diff_callbacks3_t swig_types[163]
+#define SWIGTYPE_p_svn_wc_diff_callbacks4_t swig_types[164]
+#define SWIGTYPE_p_svn_wc_diff_callbacks_t swig_types[165]
+#define SWIGTYPE_p_svn_wc_entry_callbacks2_t swig_types[166]
+#define SWIGTYPE_p_svn_wc_entry_callbacks_t swig_types[167]
+#define SWIGTYPE_p_svn_wc_entry_t swig_types[168]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[169]
+#define SWIGTYPE_p_svn_wc_external_item_t swig_types[170]
+#define SWIGTYPE_p_svn_wc_info_t swig_types[171]
+#define SWIGTYPE_p_svn_wc_merge_outcome_t swig_types[172]
+#define SWIGTYPE_p_svn_wc_notify_action_t swig_types[173]
+#define SWIGTYPE_p_svn_wc_notify_lock_state_t swig_types[174]
+#define SWIGTYPE_p_svn_wc_notify_state_t swig_types[175]
+#define SWIGTYPE_p_svn_wc_notify_t swig_types[176]
+#define SWIGTYPE_p_svn_wc_operation_t swig_types[177]
+#define SWIGTYPE_p_svn_wc_revision_status_t swig_types[178]
+#define SWIGTYPE_p_svn_wc_schedule_t swig_types[179]
+#define SWIGTYPE_p_svn_wc_status2_t swig_types[180]
+#define SWIGTYPE_p_svn_wc_status3_t swig_types[181]
+#define SWIGTYPE_p_svn_wc_status_t swig_types[182]
+#define SWIGTYPE_p_svn_wc_traversal_info_t swig_types[183]
+#define SWIGTYPE_p_unsigned_long swig_types[184]
+#define SWIGTYPE_p_void swig_types[185]
+static swig_type_info *swig_types[187];
+static swig_module_info swig_module = {swig_types, 186, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3147,7 +3125,7 @@ static swig_module_info swig_module = {swig_types, 182, 0, 0, 0, 0};
#endif
#define SWIG_name "_client"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3489,6 +3467,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3643,7 +3633,7 @@ SWIGINTERN PyObject *_wrap_svn_client_version(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3672,7 +3662,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_simple_prompt_provider(PyObject *SWIGU
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_client_get_simple_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_simple_prompt_func;
+ arg2 = (svn_auth_simple_prompt_func_t) svn_swig_py_auth_simple_prompt_func;
arg3 = obj0;
}
{
@@ -3699,7 +3689,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_simple_prompt_provider(PyObject *SWIGU
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -3737,7 +3727,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_username_prompt_provider(PyObject *SWI
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_client_get_username_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_username_prompt_func;
+ arg2 = (svn_auth_username_prompt_func_t) svn_swig_py_auth_username_prompt_func;
arg3 = obj0;
}
{
@@ -3764,7 +3754,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_username_prompt_provider(PyObject *SWI
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -3814,7 +3804,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_simple_provider(PyObject *SWIGUNUSEDPA
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -3864,7 +3854,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_username_provider(PyObject *SWIGUNUSED
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -3914,7 +3904,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_server_trust_file_provider(PyObjec
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -3964,7 +3954,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_file_provider(PyObject
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -4014,7 +4004,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_pw_file_provider(PyObj
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -4050,7 +4040,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_server_trust_prompt_provider(PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_get_ssl_server_trust_prompt_provider",&obj0,&obj1)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_server_trust_prompt_func;
+ arg2 = (svn_auth_ssl_server_trust_prompt_func_t) svn_swig_py_auth_ssl_server_trust_prompt_func;
arg3 = obj0;
}
if (obj1) {
@@ -4071,7 +4061,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_server_trust_prompt_provider(PyObj
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -4109,7 +4099,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_prompt_provider(PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_client_get_ssl_client_cert_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_client_cert_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_prompt_func_t) svn_swig_py_auth_ssl_client_cert_prompt_func;
arg3 = obj0;
}
{
@@ -4136,7 +4126,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_prompt_provider(PyObje
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -4174,7 +4164,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_pw_prompt_provider(PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_client_get_ssl_client_cert_pw_prompt_provider",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_auth_ssl_client_cert_pw_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_pw_prompt_func_t) svn_swig_py_auth_ssl_client_cert_pw_prompt_func;
arg3 = obj0;
}
{
@@ -4201,7 +4191,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_ssl_client_cert_pw_prompt_provider(PyO
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_auth_provider_object_t,
_global_py_pool, args))
;
@@ -4234,7 +4224,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist_item_dup(PyObject *SWIGUNUSEDPARM
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_proplist_item_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_proplist_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_proplist_item_t, svn_argnum_obj0);
+ arg1 = (svn_client_proplist_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_proplist_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4255,7 +4245,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist_item_dup(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_proplist_item_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_proplist_item_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4278,7 +4268,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_revision_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_info_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4305,7 +4295,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_revision_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_info_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4326,7 +4316,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_date_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_info_t_date_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4354,7 +4344,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_date_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_info_t_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4375,7 +4365,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_author_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_info_t_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4403,7 +4393,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_info_t_author_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_info_t_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4429,7 +4419,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_commit_info_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4444,7 +4434,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_commit_info_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_commit_info_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4479,7 +4469,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_path_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item3_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4507,7 +4497,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_path_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4529,7 +4519,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_kind_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4556,7 +4546,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_kind_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4577,7 +4567,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_url_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item3_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4605,7 +4595,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_url_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4627,7 +4617,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_revision_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4654,7 +4644,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_revision_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4675,7 +4665,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_copyfrom_url_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_client_commit_item3_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4703,7 +4693,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_copyfrom_url_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4725,7 +4715,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_copyfrom_rev_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4752,7 +4742,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_copyfrom_rev_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4774,7 +4764,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_state_flags_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_state_flags_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4801,7 +4791,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_state_flags_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_state_flags_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4823,13 +4813,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_incoming_prop_changes_set(P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_incoming_prop_changes_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4850,13 +4840,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_incoming_prop_changes_get(P
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_incoming_prop_changes_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->incoming_prop_changes);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4873,13 +4863,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_outgoing_prop_changes_set(P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item3_t_outgoing_prop_changes_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4900,13 +4890,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_outgoing_prop_changes_get(P
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_outgoing_prop_changes_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->outgoing_prop_changes);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4922,7 +4912,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_session_relpath_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item3_t_session_relpath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4950,7 +4940,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_session_relpath_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_session_relpath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4971,7 +4961,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_moved_from_abspath_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item3_t_moved_from_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4999,7 +4989,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_t_moved_from_abspath_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item3_t_moved_from_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5025,7 +5015,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_commit_item3_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5040,7 +5030,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_commit_item3_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_commit_item3_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5075,7 +5065,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_path_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item2_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5103,7 +5093,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_path_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5125,7 +5115,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_kind_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item2_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5152,7 +5142,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_kind_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5173,7 +5163,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_url_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item2_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5201,7 +5191,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_url_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5223,7 +5213,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_revision_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item2_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5250,7 +5240,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_revision_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5271,7 +5261,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_copyfrom_url_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_client_commit_item2_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5299,7 +5289,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_copyfrom_url_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5321,7 +5311,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_copyfrom_rev_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item2_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5348,7 +5338,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_copyfrom_rev_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5370,7 +5360,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_state_flags_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item2_t_state_flags_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5397,7 +5387,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_state_flags_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_state_flags_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5421,7 +5411,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_wcprop_changes_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item2_t_wcprop_changes_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5455,13 +5445,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_t_wcprop_changes_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item2_t_wcprop_changes_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->wcprop_changes);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5482,7 +5472,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_commit_item2_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5497,7 +5487,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_commit_item2_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_commit_item2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5532,7 +5522,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_path_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5560,7 +5550,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_path_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5582,7 +5572,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_kind_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5609,7 +5599,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_kind_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5630,7 +5620,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_url_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_commit_item_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5658,7 +5648,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_url_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5680,7 +5670,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_revision_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5707,7 +5697,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_revision_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5728,7 +5718,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_copyfrom_url_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_client_commit_item_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5756,7 +5746,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_copyfrom_url_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5778,7 +5768,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_state_flags_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item_t_state_flags_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5805,7 +5795,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_state_flags_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_state_flags_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5829,7 +5819,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_wcprop_changes_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_commit_item_t_wcprop_changes_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5863,13 +5853,13 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_t_wcprop_changes_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_commit_item_t_wcprop_changes_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->wcprop_changes);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5890,7 +5880,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_commit_item_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5905,7 +5895,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_commit_item_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_commit_item_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_commit_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_commit_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5961,7 +5951,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_create(PyObject *SWIGUNUSEDPA
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6019,7 +6009,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item_create(PyObject *SWIGUNUSEDPAR
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_item3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_item3_t,
_global_py_pool, args))
;
@@ -6052,7 +6042,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_dup(PyObject *SWIGUNUSEDPARM(
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_commit_item3_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_commit_item3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
+ arg1 = (svn_client_commit_item3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6073,7 +6063,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item3_dup(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item3_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6103,7 +6093,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_dup(PyObject *SWIGUNUSEDPARM(
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_commit_item2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_commit_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
+ arg1 = (svn_client_commit_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_commit_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6124,7 +6114,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit_item2_dup(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_commit_item2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_commit_item2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6146,7 +6136,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_path_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_diff_summarize_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6174,7 +6164,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_path_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_diff_summarize_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6196,7 +6186,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_summarize_kind_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_diff_summarize_t_summarize_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6223,7 +6213,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_summarize_kind_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_diff_summarize_t_summarize_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6245,7 +6235,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_prop_changed_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_diff_summarize_t_prop_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6272,7 +6262,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_prop_changed_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_diff_summarize_t_prop_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6294,7 +6284,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_node_kind_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_diff_summarize_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6321,7 +6311,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_t_node_kind_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_diff_summarize_t_node_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6347,7 +6337,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_diff_summarize_t(PyObject *SWIGUNUSEDP
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_diff_summarize_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_diff_summarize_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6362,7 +6352,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_diff_summarize_t(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_diff_summarize_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6405,7 +6395,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_dup(PyObject *SWIGUNUSEDPAR
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_diff_summarize_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
+ arg1 = (svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6426,7 +6416,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_dup(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_diff_summarize_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_diff_summarize_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6449,13 +6439,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_auth_baton_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_auth_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
+ arg2 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6476,13 +6466,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_auth_baton_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_auth_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_auth_baton_t *) ((arg1)->auth_baton);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6499,14 +6489,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_notify_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -6528,7 +6518,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_notify_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6550,7 +6540,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func_get(PyObject *SWIGUNUSED
SWIG_fail;
}
*tmp = (svn_wc_notify_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
py_pool, args);
}
}
@@ -6569,7 +6559,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_notify_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6598,7 +6588,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_notify_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6623,7 +6613,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton_get(PyObject *SWIGUNUSE
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -6644,14 +6634,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_client_get_commit_log_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -6673,7 +6663,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6695,7 +6685,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func_get(PyObject *SWIGUNUSE
SWIG_fail;
}
*tmp = (svn_client_get_commit_log_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -6714,7 +6704,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6743,7 +6733,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6768,7 +6758,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton_get(PyObject *SWIGUNUS
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -6791,7 +6781,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_config_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_config_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6825,7 +6815,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_config_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_config_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6866,14 +6856,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_func_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_cancel_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_cancel_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -6895,7 +6885,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_func_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_cancel_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6917,7 +6907,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_func_get(PyObject *SWIGUNUSED
SWIG_fail;
}
*tmp = (svn_cancel_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t,
py_pool, args);
}
}
@@ -6936,7 +6926,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_baton_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_cancel_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6965,7 +6955,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_baton_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_cancel_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6990,7 +6980,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_cancel_baton_get(PyObject *SWIGUNUSE
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7011,14 +7001,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func2_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_notify_func2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_notify_func2_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7040,7 +7030,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func2_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_notify_func2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7062,7 +7052,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_func2_get(PyObject *SWIGUNUSE
SWIG_fail;
}
*tmp = (svn_wc_notify_func2_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void,
py_pool, args);
}
}
@@ -7081,7 +7071,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton2_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_notify_baton2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7110,7 +7100,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton2_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_notify_baton2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7135,7 +7125,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_notify_baton2_get(PyObject *SWIGUNUS
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7156,14 +7146,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func2_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_func2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_client_get_commit_log2_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7185,7 +7175,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func2_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_func2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7207,7 +7197,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func2_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_client_get_commit_log2_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -7226,7 +7216,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton2_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_baton2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7255,7 +7245,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton2_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_baton2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7280,7 +7270,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton2_get(PyObject *SWIGUNU
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7301,14 +7291,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_func_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_progress_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_progress_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7330,7 +7320,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_func_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_progress_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7352,7 +7342,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_func_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_ra_progress_notify_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
py_pool, args);
}
}
@@ -7371,7 +7361,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_baton_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_progress_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7400,7 +7390,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_baton_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_progress_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7425,7 +7415,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_progress_baton_get(PyObject *SWIGUNU
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7446,14 +7436,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func3_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_func3_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_client_get_commit_log3_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7475,7 +7465,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func3_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_func3_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7497,7 +7487,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_func3_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_client_get_commit_log3_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -7516,7 +7506,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton3_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_log_msg_baton3_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7545,7 +7535,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton3_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_log_msg_baton3_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7570,7 +7560,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_log_msg_baton3_get(PyObject *SWIGUNU
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7591,13 +7581,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_mimetypes_map_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_mimetypes_map_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7618,13 +7608,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_mimetypes_map_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_mimetypes_map_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_hash_t *) ((arg1)->mimetypes_map);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7641,14 +7631,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_conflict_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7670,7 +7660,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_conflict_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7692,7 +7682,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_wc_conflict_resolver_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -7711,7 +7701,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_conflict_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7740,7 +7730,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_conflict_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7765,7 +7755,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton_get(PyObject *SWIGUNU
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7785,7 +7775,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_client_name_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_ctx_t_client_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7813,7 +7803,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_client_name_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_client_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7835,14 +7825,14 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func2_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_conflict_func2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7864,7 +7854,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func2_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_conflict_func2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7886,7 +7876,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_func2_get(PyObject *SWIGUNU
SWIG_fail;
}
*tmp = (svn_wc_conflict_resolver_func2_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -7905,7 +7895,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton2_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_conflict_baton2_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7934,7 +7924,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton2_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_conflict_baton2_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7959,7 +7949,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_conflict_baton2_get(PyObject *SWIGUN
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -7980,13 +7970,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_wc_ctx_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_wc_ctx_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8007,13 +7997,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ctx_t_wc_ctx_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_wc_ctx_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_context_t *) ((arg1)->wc_ctx);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_context_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_context_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8021,6 +8011,221 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_check_tunnel_func_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_check_tunnel_func_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_ra_check_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char__int, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_check_tunnel_func_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_ra_check_tunnel_func_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_check_tunnel_func_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ {
+ PyObject *py_pool = NULL;
+ apr_pool_t *pool = NULL;
+
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &py_pool, &pool))
+ SWIG_fail;
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ svn_ra_check_tunnel_func_t * tmp = apr_palloc(pool, sizeof(svn_ra_check_tunnel_func_t));
+ if (tmp == NULL) {
+ SWIG_fail;
+ }
+ *tmp = (svn_ra_check_tunnel_func_t) result;
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char__int,
+ py_pool, args);
+ }
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_open_tunnel_func_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_open_tunnel_func_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_ra_open_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_open_tunnel_func_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_ra_open_tunnel_func_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_open_tunnel_func_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ {
+ PyObject *py_pool = NULL;
+ apr_pool_t *pool = NULL;
+
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &py_pool, &pool))
+ SWIG_fail;
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ svn_ra_open_tunnel_func_t * tmp = apr_palloc(pool, sizeof(svn_ra_open_tunnel_func_t));
+ if (tmp == NULL) {
+ SWIG_fail;
+ }
+ *tmp = (svn_ra_open_tunnel_func_t) result;
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
+ py_pool, args);
+ }
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_tunnel_baton_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_ctx_t_tunnel_baton_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_ctx_t_tunnel_baton_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ void *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_client_ctx_t_tunnel_baton_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (void *) ((arg1)->tunnel_baton);
+ {
+ PyObject *ownerObj = obj0;
+ PyObject *members = PyObject_GetAttrString(ownerObj, "_members");
+
+ resultobj = NULL;
+ if (members != NULL) {
+ resultobj = PyDict_GetItemString(members, "tunnel_baton");
+ Py_XINCREF(resultobj);
+ Py_DECREF(members);
+ }
+
+ if (resultobj == NULL) {
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ /* We don't know the type of this reference, so we'll have to
+ * treat it as an opaque void pointer.
+ */
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
+ _global_py_pool, args);
+ }
+ }
+
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_new_svn_client_ctx_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_client_ctx_t *result = 0 ;
@@ -8034,7 +8239,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_ctx_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_ctx_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_ctx_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8049,7 +8254,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_ctx_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_ctx_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8095,7 +8300,7 @@ SWIGINTERN PyObject *_wrap_svn_client_create_context2(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_create_context2",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_hash_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8128,7 +8333,7 @@ SWIGINTERN PyObject *_wrap_svn_client_create_context2(PyObject *SWIGUNUSEDPARM(s
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_ctx_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_ctx_t,
_global_py_pool, args))
;
@@ -8189,7 +8394,7 @@ SWIGINTERN PyObject *_wrap_svn_client_create_context(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_ctx_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_ctx_t,
_global_py_pool, args))
;
@@ -8231,19 +8436,19 @@ SWIGINTERN PyObject *_wrap_svn_client_args_to_target_array2(PyObject *SWIGUNUSED
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_client_args_to_target_array2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg3 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8319,19 +8524,19 @@ SWIGINTERN PyObject *_wrap_svn_client_args_to_target_array(PyObject *SWIGUNUSEDP
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_client_args_to_target_array",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (apr_getopt_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
+ arg2 = (apr_getopt_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_getopt_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg3 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8410,13 +8615,13 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout3(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOO|O:svn_client_checkout3",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8440,7 +8645,7 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8530,13 +8735,13 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|O:svn_client_checkout2",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8554,7 +8759,7 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8640,7 +8845,7 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOO|O:svn_client_checkout",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8652,7 +8857,7 @@ SWIGINTERN PyObject *_wrap_svn_client_checkout(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8751,7 +8956,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update4(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8793,7 +8998,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update4(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8888,7 +9093,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update3(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8918,7 +9123,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9009,7 +9214,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update2(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9027,7 +9232,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9107,7 +9312,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_client_update",&arg2,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9119,7 +9324,7 @@ SWIGINTERN PyObject *_wrap_svn_client_update(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9210,13 +9415,13 @@ SWIGINTERN PyObject *_wrap_svn_client_switch3(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOOOO|O:svn_client_switch3",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9252,7 +9457,7 @@ SWIGINTERN PyObject *_wrap_svn_client_switch3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9346,13 +9551,13 @@ SWIGINTERN PyObject *_wrap_svn_client_switch2(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOOO|O:svn_client_switch2",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9382,7 +9587,7 @@ SWIGINTERN PyObject *_wrap_svn_client_switch2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9468,7 +9673,7 @@ SWIGINTERN PyObject *_wrap_svn_client_switch(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOO|O:svn_client_switch",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9480,7 +9685,7 @@ SWIGINTERN PyObject *_wrap_svn_client_switch(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9592,7 +9797,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add5(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9685,7 +9890,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add4(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9770,7 +9975,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add3(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9847,7 +10052,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add2(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9916,7 +10121,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10017,7 +10222,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir4(PyObject *SWIGUNUSEDPARM(self), PyO
arg5 = (void *)obj3;
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10114,7 +10319,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir3(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10147,7 +10352,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir3(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -10194,7 +10399,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir2(PyObject *SWIGUNUSEDPARM(self), PyO
SWIG_fail;
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10227,7 +10432,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir2(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -10274,7 +10479,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10307,7 +10512,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mkdir(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -10389,7 +10594,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete4(PyObject *SWIGUNUSEDPARM(self), Py
arg6 = (void *)obj4;
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10494,7 +10699,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10527,7 +10732,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete3(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -10582,7 +10787,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10615,7 +10820,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete2(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -10670,7 +10875,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10703,7 +10908,7 @@ SWIGINTERN PyObject *_wrap_svn_client_delete(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -10793,7 +10998,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import5(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_client_import_filter_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10812,7 +11017,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import5(PyObject *SWIGUNUSEDPARM(self), Py
arg11 = (void *)obj9;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10920,7 +11125,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import4(PyObject *SWIGUNUSEDPARM(self), Py
arg8 = (void *)obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11024,7 +11229,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11057,7 +11262,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import3(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -11111,7 +11316,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11144,7 +11349,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import2(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -11190,7 +11395,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11223,7 +11428,7 @@ SWIGINTERN PyObject *_wrap_svn_client_import(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -11348,7 +11553,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit6(PyObject *SWIGUNUSEDPARM(self), Py
arg11 = (void *)obj9;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11484,7 +11689,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit5(PyObject *SWIGUNUSEDPARM(self), Py
arg9 = (void *)obj7;
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11608,7 +11813,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit4(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11641,7 +11846,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit4(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -11704,7 +11909,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11737,7 +11942,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit3(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -11800,7 +12005,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11833,7 +12038,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit2(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -11888,7 +12093,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11921,7 +12126,7 @@ SWIGINTERN PyObject *_wrap_svn_client_commit(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -11947,7 +12152,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_kind_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11974,7 +12179,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_kind_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11995,7 +12200,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_local_abspath_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_local_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12023,7 +12228,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_local_abspath_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_local_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12045,7 +12250,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_filesize_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_filesize_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12067,7 +12272,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_filesize_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_filesize_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12089,7 +12294,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_versioned_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_versioned_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12116,7 +12321,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_versioned_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_versioned_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12138,7 +12343,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_conflicted_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_conflicted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12165,7 +12370,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_conflicted_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_conflicted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12187,7 +12392,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_node_status_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_node_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12214,7 +12419,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_node_status_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_node_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12236,7 +12441,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_text_status_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12263,7 +12468,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_text_status_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12285,7 +12490,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_prop_status_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12312,7 +12517,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_prop_status_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12334,7 +12539,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_wc_is_locked_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_wc_is_locked_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12361,7 +12566,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_wc_is_locked_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_wc_is_locked_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12383,7 +12588,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_copied_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_copied_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12410,7 +12615,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_copied_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_copied_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12431,7 +12636,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_root_url_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_repos_root_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12459,7 +12664,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_root_url_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_root_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12480,7 +12685,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_uuid_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_repos_uuid_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12508,7 +12713,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_uuid_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_uuid_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12529,7 +12734,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_relpath_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_repos_relpath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12557,7 +12762,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_relpath_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_relpath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12579,7 +12784,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_revision_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12606,7 +12811,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_revision_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12628,7 +12833,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_rev_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12655,7 +12860,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_rev_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12677,7 +12882,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_date_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12699,7 +12904,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_date_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12720,7 +12925,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_author_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12748,7 +12953,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changed_author_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12770,7 +12975,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_switched_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_switched_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12797,7 +13002,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_switched_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_switched_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12819,7 +13024,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_file_external_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_file_external_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12846,7 +13051,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_file_external_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_file_external_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12868,13 +13073,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_lock_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12895,13 +13100,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_lock_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12917,7 +13122,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changelist_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_changelist_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12945,7 +13150,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_changelist_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_changelist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12967,7 +13172,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_depth_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_depth_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12994,7 +13199,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_depth_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_depth_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13016,7 +13221,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_kind_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_ood_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13043,7 +13248,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_kind_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_ood_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13065,7 +13270,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_node_status_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_repos_node_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13092,7 +13297,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_node_status_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_node_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13114,7 +13319,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_text_status_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_repos_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13141,7 +13346,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_text_status_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13163,7 +13368,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_prop_status_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_repos_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13190,7 +13395,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_prop_status_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13212,13 +13417,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_lock_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_repos_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13239,13 +13444,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_repos_lock_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_repos_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->repos_lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -13262,7 +13467,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_rev_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_ood_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13289,7 +13494,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_rev_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_ood_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13311,7 +13516,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_date_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_ood_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13333,7 +13538,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_date_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_ood_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13354,7 +13559,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_author_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_ood_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13382,7 +13587,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_ood_changed_author_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_ood_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13404,7 +13609,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_backwards_compatibility_baton_set
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_status_t_backwards_compatibility_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13433,7 +13638,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_backwards_compatibility_baton_get
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_backwards_compatibility_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13458,7 +13663,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_backwards_compatibility_baton_get
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -13478,7 +13683,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_moved_from_abspath_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_moved_from_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13506,7 +13711,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_moved_from_abspath_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_moved_from_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13527,7 +13732,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_moved_to_abspath_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_status_t_moved_to_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13555,7 +13760,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_t_moved_to_abspath_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_status_t_moved_to_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13581,7 +13786,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_status_t(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_status_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_status_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -13596,7 +13801,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_status_t(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_status_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13639,7 +13844,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_dup(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_status_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
+ arg1 = (svn_client_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13660,7 +13865,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status_dup(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_status_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_status_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -13674,6 +13879,177 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_status6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
+ svn_client_ctx_t *arg2 = (svn_client_ctx_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ apr_array_header_t *arg12 = (apr_array_header_t *) 0 ;
+ svn_client_status_func_t arg13 = (svn_client_status_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_revnum_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ PyObject * obj12 = 0 ;
+ PyObject * obj13 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg15 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOOOOO|O:svn_client_status6",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
+ {
+ arg2 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_depth_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg9 = (svn_boolean_t)SWIG_As_long (obj7);
+ if (SWIG_arg_fail(svn_argnum_obj7)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (svn_boolean_t)SWIG_As_long (obj8);
+ if (SWIG_arg_fail(svn_argnum_obj8)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_boolean_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg12 = (apr_array_header_t *) svn_swig_py_seq_to_array(obj10,
+ sizeof(const char *),
+ svn_swig_py_unwrap_string,
+ NULL,
+ _global_pool);
+ if (PyErr_Occurred())
+ SWIG_fail;
+ }
+ {
+ svn_client_status_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj11);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg13 = *tmp;
+ }
+ {
+ if (obj12 == Py_None) {
+ arg14 = NULL;
+ } else if (SWIG_ConvertPtr(obj12, (void **) &arg14, 0, 0) == -1) {
+ arg14 = (void *) obj12;
+ PyErr_Clear();
+ }
+ }
+ if (obj13) {
+ /* Verify that the user supplied a valid pool */
+ if (obj13 != Py_None && obj13 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj13);
+ SWIG_arg_fail(svn_argnum_obj13);
+ SWIG_fail;
+ }
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_status6(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,(apr_array_header_t const *)arg12,arg13,arg14,arg15);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_long((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_status5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
@@ -13715,13 +14091,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status5(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOOOO|O:svn_client_status5",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg2 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
+ arg2 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13773,7 +14149,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status5(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_client_status_func_t * tmp =
- svn_swig_MustGetPtr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj10);
+ svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj10);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -13876,14 +14252,14 @@ SWIGINTERN PyObject *_wrap_svn_client_status4(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOOO|O:svn_client_status4",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_status_func3_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -13937,7 +14313,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status4(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14030,13 +14406,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status3(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_status3",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_status_func2;
+ arg4 = (svn_wc_status_func2_t) svn_swig_py_status_func2;
arg5 = obj2;
}
{
@@ -14079,7 +14455,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status3(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14170,13 +14546,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status2(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_client_status2",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_status_func2;
+ arg4 = (svn_wc_status_func2_t) svn_swig_py_status_func2;
arg5 = obj2;
}
{
@@ -14210,7 +14586,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14299,13 +14675,13 @@ SWIGINTERN PyObject *_wrap_svn_client_status(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_client_status",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_status_func;
+ arg4 = (svn_wc_status_func_t) svn_swig_py_status_func;
arg5 = obj2;
}
{
@@ -14333,7 +14709,7 @@ SWIGINTERN PyObject *_wrap_svn_client_status(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14427,7 +14803,7 @@ SWIGINTERN PyObject *_wrap_svn_client_log5(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14476,11 +14852,11 @@ SWIGINTERN PyObject *_wrap_svn_client_log5(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg9 = svn_swig_py_log_entry_receiver;
+ arg9 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg10 = obj8;
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14575,19 +14951,19 @@ SWIGINTERN PyObject *_wrap_svn_client_log4(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14626,11 +15002,11 @@ SWIGINTERN PyObject *_wrap_svn_client_log4(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg10 = svn_swig_py_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg11 = obj9;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14721,19 +15097,19 @@ SWIGINTERN PyObject *_wrap_svn_client_log3(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14757,11 +15133,11 @@ SWIGINTERN PyObject *_wrap_svn_client_log3(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg8 = svn_swig_py_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg9 = obj7;
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14850,13 +15226,13 @@ SWIGINTERN PyObject *_wrap_svn_client_log2(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14880,11 +15256,11 @@ SWIGINTERN PyObject *_wrap_svn_client_log2(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg7 = svn_swig_py_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg8 = obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14966,13 +15342,13 @@ SWIGINTERN PyObject *_wrap_svn_client_log(PyObject *SWIGUNUSEDPARM(self), PyObje
SWIG_fail;
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14990,11 +15366,11 @@ SWIGINTERN PyObject *_wrap_svn_client_log(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg6 = svn_swig_py_log_receiver;
+ arg6 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg7 = obj5;
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15071,25 +15447,25 @@ SWIGINTERN PyObject *_wrap_svn_client_blame5(PyObject *SWIGUNUSEDPARM(self), PyO
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_blame5",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
+ arg5 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15108,7 +15484,7 @@ SWIGINTERN PyObject *_wrap_svn_client_blame5(PyObject *SWIGUNUSEDPARM(self), PyO
}
{
svn_client_blame_receiver3_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -15123,7 +15499,7 @@ SWIGINTERN PyObject *_wrap_svn_client_blame5(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15205,25 +15581,25 @@ SWIGINTERN PyObject *_wrap_svn_client_blame4(PyObject *SWIGUNUSEDPARM(self), PyO
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_blame4",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
+ arg5 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15242,7 +15618,7 @@ SWIGINTERN PyObject *_wrap_svn_client_blame4(PyObject *SWIGUNUSEDPARM(self), PyO
}
{
svn_client_blame_receiver2_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -15257,7 +15633,7 @@ SWIGINTERN PyObject *_wrap_svn_client_blame4(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15336,25 +15712,25 @@ SWIGINTERN PyObject *_wrap_svn_client_blame3(PyObject *SWIGUNUSEDPARM(self), PyO
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_client_blame3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
+ arg5 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15366,11 +15742,11 @@ SWIGINTERN PyObject *_wrap_svn_client_blame3(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg7 = svn_swig_py_client_blame_receiver_func;
+ arg7 = (svn_client_blame_receiver_t) svn_swig_py_client_blame_receiver_func;
arg8 = obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15445,29 +15821,29 @@ SWIGINTERN PyObject *_wrap_svn_client_blame2(PyObject *SWIGUNUSEDPARM(self), PyO
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_client_blame2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = svn_swig_py_client_blame_receiver_func;
+ arg5 = (svn_client_blame_receiver_t) svn_swig_py_client_blame_receiver_func;
arg6 = obj4;
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15540,23 +15916,23 @@ SWIGINTERN PyObject *_wrap_svn_client_blame(PyObject *SWIGUNUSEDPARM(self), PyOb
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_client_blame",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_client_blame_receiver_func;
+ arg4 = (svn_client_blame_receiver_t) svn_swig_py_client_blame_receiver_func;
arg5 = obj3;
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15659,13 +16035,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff6(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15740,7 +16116,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff6(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg20 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj19, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj19);
+ arg20 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj19, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj19);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15837,13 +16213,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff5(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15902,7 +16278,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff5(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg17 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj16, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj16);
+ arg17 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj16, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj16);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15995,13 +16371,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff4(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16048,7 +16424,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff4(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg15 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj14, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj14);
+ arg15 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj14, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj14);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16138,13 +16514,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff3(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16182,7 +16558,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff3(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!arg12) SWIG_fail;
}
{
- arg13 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
+ arg13 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16271,13 +16647,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff2(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16315,7 +16691,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff2(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!arg11) SWIG_fail;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16402,13 +16778,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16440,7 +16816,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff(PyObject *SWIGUNUSEDPARM(self), PyObj
if (!arg10) SWIG_fail;
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16544,19 +16920,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg6(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16631,7 +17007,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg6(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg20 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj19, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj19);
+ arg20 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj19, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj19);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16734,19 +17110,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg5(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16805,7 +17181,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg5(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg17 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj16, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj16);
+ arg17 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj16, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj16);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16904,19 +17280,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg4(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16963,7 +17339,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg4(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg15 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj14, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj14);
+ arg15 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj14, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj14);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17059,19 +17435,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg3(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17109,7 +17485,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg3(PyObject *SWIGUNUSEDPARM(self),
if (!arg12) SWIG_fail;
}
{
- arg13 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
+ arg13 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17204,19 +17580,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg2(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17254,7 +17630,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg2(PyObject *SWIGUNUSEDPARM(self),
if (!arg11) SWIG_fail;
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17347,19 +17723,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg(PyObject *SWIGUNUSEDPARM(self), P
SWIG_fail;
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17391,7 +17767,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_peg(PyObject *SWIGUNUSEDPARM(self), P
if (!arg10) SWIG_fail;
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17472,13 +17848,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize2(PyObject *SWIGUNUSEDPARM(s
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOOOOOOO|O:svn_client_diff_summarize2",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17506,7 +17882,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize2(PyObject *SWIGUNUSEDPARM(s
}
{
svn_client_diff_summarize_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17521,7 +17897,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize2(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17595,13 +17971,13 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize(PyObject *SWIGUNUSEDPARM(se
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOOOOOO|O:svn_client_diff_summarize",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17620,7 +17996,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize(PyObject *SWIGUNUSEDPARM(se
}
{
svn_client_diff_summarize_func_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17635,7 +18011,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17712,19 +18088,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg2(PyObject *SWIGUNUSEDPA
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_diff_summarize_peg2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17752,7 +18128,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg2(PyObject *SWIGUNUSEDPA
}
{
svn_client_diff_summarize_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17767,7 +18143,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg2(PyObject *SWIGUNUSEDPA
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17847,19 +18223,19 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg(PyObject *SWIGUNUSEDPAR
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_client_diff_summarize_peg",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17878,7 +18254,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg(PyObject *SWIGUNUSEDPAR
}
{
svn_client_diff_summarize_func_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17893,7 +18269,7 @@ SWIGINTERN PyObject *_wrap_svn_client_diff_summarize_peg(PyObject *SWIGUNUSEDPAR
}
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18005,19 +18381,19 @@ SWIGINTERN PyObject *_wrap_svn_client_get_merging_summary(PyObject *SWIGUNUSEDPA
arg10 = &temp10;
if (!PyArg_ParseTuple(args,(char *)"sOsOO|OO:svn_client_get_merging_summary",&arg11,&obj1,&arg13,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg12 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg12 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg14 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg15 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg15 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18209,13 +18585,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge5(PyObject *SWIGUNUSEDPARM(self), PyO
arg15 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOsOOOOOOOOO|O:svn_client_merge5",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13,&obj14)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18263,13 +18639,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge5(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj13, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj13);
+ arg14 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj13);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18350,13 +18726,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge4(PyObject *SWIGUNUSEDPARM(self), PyO
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOsOOOOOOOO|O:svn_client_merge4",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18398,13 +18774,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge4(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg13 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
+ arg13 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18483,13 +18859,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge3(PyObject *SWIGUNUSEDPARM(self), PyO
arg13 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOsOOOOOOO|O:svn_client_merge3",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18525,13 +18901,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge3(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18608,13 +18984,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge2(PyObject *SWIGUNUSEDPARM(self), PyO
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOsOOOOOO|O:svn_client_merge2",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18644,13 +19020,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg10 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg10 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18725,13 +19101,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge(PyObject *SWIGUNUSEDPARM(self), PyOb
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOsOOOOO|O:svn_client_merge",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18761,7 +19137,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18829,7 +19205,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_reintegrate(PyObject *SWIGUNUSEDPARM
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOOO|O:svn_client_merge_reintegrate",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18841,13 +19217,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_reintegrate(PyObject *SWIGUNUSEDPARM
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18939,7 +19315,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg5(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18987,13 +19363,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg5(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg13 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
+ arg13 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19083,7 +19459,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg4(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19125,13 +19501,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg4(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg12 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19219,7 +19595,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19255,13 +19631,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg10 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg10 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19344,19 +19720,19 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg2(PyObject *SWIGUNUSEDPARM(self),
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOsOOOOOO|O:svn_client_merge_peg2",&arg1,&obj1,&obj2,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19386,13 +19762,13 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg10 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg10 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19473,19 +19849,19 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg(PyObject *SWIGUNUSEDPARM(self),
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOsOOOOO|O:svn_client_merge_peg",&arg1,&obj1,&obj2,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19515,7 +19891,7 @@ SWIGINTERN PyObject *_wrap_svn_client_merge_peg(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19586,13 +19962,13 @@ SWIGINTERN PyObject *_wrap_svn_client_suggest_merge_sources(PyObject *SWIGUNUSED
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_client_suggest_merge_sources",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19666,13 +20042,13 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_get_merged(PyObject *SWIGUNUSEDP
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_client_mergeinfo_get_merged",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19775,31 +20151,31 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log2(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj5);
+ arg6 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg7 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj6);
+ arg7 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = svn_swig_py_log_entry_receiver;
+ arg8 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg9 = obj7;
}
{
@@ -19824,7 +20200,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log2(PyObject *SWIGUNUSEDPARM(se
SWIG_fail;
}
{
- arg13 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
+ arg13 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19907,19 +20283,19 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = svn_swig_py_log_entry_receiver;
+ arg6 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg7 = obj5;
}
{
@@ -19944,7 +20320,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log(PyObject *SWIGUNUSEDPARM(sel
SWIG_fail;
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20017,19 +20393,19 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log_merged(PyObject *SWIGUNUSEDP
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOOOOO|O:svn_client_mergeinfo_log_merged",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = svn_swig_py_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg6 = obj4;
}
{
@@ -20048,7 +20424,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log_merged(PyObject *SWIGUNUSEDP
SWIG_fail;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20126,19 +20502,19 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log_eligible(PyObject *SWIGUNUSE
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOOOOO|O:svn_client_mergeinfo_log_eligible",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = svn_swig_py_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg6 = obj4;
}
{
@@ -20157,7 +20533,7 @@ SWIGINTERN PyObject *_wrap_svn_client_mergeinfo_log_eligible(PyObject *SWIGUNUSE
SWIG_fail;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20206,6 +20582,208 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_vacuum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg8 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_client_vacuum",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ arg2 = (svn_boolean_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_vacuum((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_client_cleanup2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg8 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_client_cleanup2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ arg2 = (svn_boolean_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_cleanup2((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_cleanup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char *arg1 = (char *) 0 ;
@@ -20223,7 +20801,7 @@ SWIGINTERN PyObject *_wrap_svn_client_cleanup(PyObject *SWIGUNUSEDPARM(self), Py
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_client_cleanup",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg2 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20284,7 +20862,7 @@ SWIGINTERN PyObject *_wrap_svn_client_upgrade(PyObject *SWIGUNUSEDPARM(self), Py
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_client_upgrade",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg2 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20355,7 +20933,7 @@ SWIGINTERN PyObject *_wrap_svn_client_relocate2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20426,7 +21004,7 @@ SWIGINTERN PyObject *_wrap_svn_client_relocate(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20470,6 +21048,112 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_revert3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ svn_depth_t arg2 ;
+ apr_array_header_t *arg3 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_client_ctx_t *arg6 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg7 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOO|O:svn_client_revert3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+ {
+ arg1 = (apr_array_header_t *) svn_swig_py_seq_to_array(obj0,
+ sizeof(const char *),
+ svn_swig_py_unwrap_string,
+ NULL,
+ _global_pool);
+ if (PyErr_Occurred())
+ SWIG_fail;
+ }
+ {
+ arg2 = (svn_depth_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (apr_array_header_t *) svn_swig_py_seq_to_array(obj2,
+ sizeof(const char *),
+ svn_swig_py_unwrap_string,
+ NULL,
+ _global_pool);
+ if (PyErr_Occurred())
+ SWIG_fail;
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj6) {
+ /* Verify that the user supplied a valid pool */
+ if (obj6 != Py_None && obj6 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj6);
+ SWIG_arg_fail(svn_argnum_obj6);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_revert3((apr_array_header_t const *)arg1,arg2,(apr_array_header_t const *)arg3,arg4,arg5,arg6,arg7);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_revert2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
@@ -20516,7 +21200,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revert2(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20595,7 +21279,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revert(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20664,7 +21348,7 @@ SWIGINTERN PyObject *_wrap_svn_client_resolved(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20741,7 +21425,7 @@ SWIGINTERN PyObject *_wrap_svn_client_resolve(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20793,7 +21477,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_path_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_copy_source_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20821,7 +21505,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_path_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_copy_source_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20843,13 +21527,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_revision_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_copy_source_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20875,13 +21559,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_revision_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_copy_source_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *) ((arg1)->revision);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -20898,13 +21582,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_peg_revision_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_copy_source_t_peg_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20930,13 +21614,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy_source_t_peg_revision_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_copy_source_t_peg_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *) ((arg1)->peg_revision);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -20957,7 +21641,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_copy_source_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_copy_source_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_copy_source_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -20972,7 +21656,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_copy_source_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_copy_source_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_copy_source_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_copy_source_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_copy_source_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20999,6 +21683,145 @@ SWIGINTERN PyObject *svn_client_copy_source_t_swigregister(PyObject *SWIGUNUSEDP
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *_wrap_svn_client_copy7(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_hash_t *arg8 = (apr_hash_t *) 0 ;
+ apr_hash_t *arg9 = (apr_hash_t *) 0 ;
+ svn_commit_callback2_t arg10 = (svn_commit_callback2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ svn_client_ctx_t *arg12 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOOO|O:svn_client_copy7",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_apr_hash_t, svn_argnum_obj7);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
+ arg9 = svn_swig_py_prophash_from_dict(obj8, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = svn_swig_py_commit_callback2;
+ arg11 = (void *)obj9;
+ }
+ {
+ arg12 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_copy7((apr_array_header_t const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,(apr_hash_t const *)arg8,(apr_hash_t const *)arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_copy6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
@@ -21029,7 +21852,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy6(PyObject *SWIGUNUSEDPARM(self), PyOb
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_client_copy6",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg1 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21070,7 +21893,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy6(PyObject *SWIGUNUSEDPARM(self), PyOb
arg8 = (void *)obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21144,7 +21967,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy5(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_client_copy5",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21181,7 +22004,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy5(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21214,7 +22037,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy5(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -21259,7 +22082,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy4(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_client_copy4",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21290,7 +22113,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy4(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21323,7 +22146,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy4(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -21363,13 +22186,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOsO|O:svn_client_copy3",&arg2,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21402,7 +22225,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy3(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -21442,13 +22265,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOsO|O:svn_client_copy2",&arg2,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21481,7 +22304,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -21521,13 +22344,13 @@ SWIGINTERN PyObject *_wrap_svn_client_copy(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOsO|O:svn_client_copy",&arg2,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21560,7 +22383,7 @@ SWIGINTERN PyObject *_wrap_svn_client_copy(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -21659,7 +22482,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move7(PyObject *SWIGUNUSEDPARM(self), PyOb
arg9 = (void *)obj7;
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21769,7 +22592,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move6(PyObject *SWIGUNUSEDPARM(self), PyOb
arg7 = (void *)obj5;
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21883,7 +22706,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move5(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21916,7 +22739,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move5(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -21962,7 +22785,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move4(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21995,7 +22818,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move4(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -22041,7 +22864,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22074,7 +22897,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move3(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -22120,7 +22943,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22153,7 +22976,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -22195,7 +23018,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOsOO|O:svn_client_move",&arg2,&obj1,&arg4,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22207,7 +23030,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22240,7 +23063,7 @@ SWIGINTERN PyObject *_wrap_svn_client_move(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_client_commit_info_t,
_global_py_pool, args))
;
@@ -22329,7 +23152,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propset_remote(PyObject *SWIGUNUSEDPARM(se
arg8 = (void *)obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22444,7 +23267,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propset_local(PyObject *SWIGUNUSEDPARM(sel
SWIG_fail;
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22575,7 +23398,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propset3(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22608,7 +23431,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propset3(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_commit_info_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_commit_info_t,
_global_py_pool, args))
;
@@ -22675,7 +23498,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propset2(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22855,7 +23678,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_set2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22867,7 +23690,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_set2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22964,7 +23787,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_set(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22976,7 +23799,7 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_set(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23073,13 +23896,13 @@ SWIGINTERN PyObject *_wrap_svn_client_propget5(PyObject *SWIGUNUSEDPARM(self), P
arg7 = &temp7;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|OO:svn_client_propget5",&arg3,&arg4,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg6 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23100,7 +23923,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget5(PyObject *SWIGUNUSEDPARM(self), P
SWIG_fail;
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23219,13 +24042,13 @@ SWIGINTERN PyObject *_wrap_svn_client_propget4(PyObject *SWIGUNUSEDPARM(self), P
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|OO:svn_client_propget4",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23246,7 +24069,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget4(PyObject *SWIGUNUSEDPARM(self), P
SWIG_fail;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23356,13 +24179,13 @@ SWIGINTERN PyObject *_wrap_svn_client_propget3(PyObject *SWIGUNUSEDPARM(self), P
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|O:svn_client_propget3",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23383,7 +24206,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget3(PyObject *SWIGUNUSEDPARM(self), P
SWIG_fail;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23473,13 +24296,13 @@ SWIGINTERN PyObject *_wrap_svn_client_propget2(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOO|O:svn_client_propget2",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23491,7 +24314,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget2(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23573,7 +24396,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOO|O:svn_client_propget",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23585,7 +24408,7 @@ SWIGINTERN PyObject *_wrap_svn_client_propget(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23664,13 +24487,13 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_get(PyObject *SWIGUNUSEDPARM(self)
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"ssOO|O:svn_client_revprop_get",&arg1,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23768,13 +24591,13 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist4(PyObject *SWIGUNUSEDPARM(self),
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_client_proplist4",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23805,7 +24628,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist4(PyObject *SWIGUNUSEDPARM(self),
arg8 = (void *)obj6;
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23888,13 +24711,13 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist3(PyObject *SWIGUNUSEDPARM(self),
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_client_proplist3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23916,7 +24739,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist3(PyObject *SWIGUNUSEDPARM(self),
}
{
svn_proplist_receiver_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -23931,7 +24754,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24011,13 +24834,13 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_client_proplist2",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24029,7 +24852,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24135,7 +24958,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_client_proplist",&arg2,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24147,7 +24970,7 @@ SWIGINTERN PyObject *_wrap_svn_client_proplist(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24250,13 +25073,13 @@ SWIGINTERN PyObject *_wrap_svn_client_revprop_list(PyObject *SWIGUNUSEDPARM(self
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_client_revprop_list",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24349,13 +25172,13 @@ SWIGINTERN PyObject *_wrap_svn_client_export5(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOOzO|O:svn_client_export5",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&arg10,&obj9,&obj10)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24385,7 +25208,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export5(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg11 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24478,13 +25301,13 @@ SWIGINTERN PyObject *_wrap_svn_client_export4(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOzO|O:svn_client_export4",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&arg9,&obj8,&obj9)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24508,7 +25331,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export4(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24601,13 +25424,13 @@ SWIGINTERN PyObject *_wrap_svn_client_export3(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOOOOzO|O:svn_client_export3",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&arg9,&obj8,&obj9)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24631,7 +25454,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24718,7 +25541,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export2(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOzO|O:svn_client_export2",&arg2,&arg3,&obj2,&obj3,&arg6,&obj5,&obj6)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24730,7 +25553,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24806,7 +25629,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOOO|O:svn_client_export",&arg2,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24818,7 +25641,7 @@ SWIGINTERN PyObject *_wrap_svn_client_export(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24901,13 +25724,13 @@ SWIGINTERN PyObject *_wrap_svn_client_list3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_list3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24938,7 +25761,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_client_list_func2_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -24953,7 +25776,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25038,13 +25861,13 @@ SWIGINTERN PyObject *_wrap_svn_client_list2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_client_list2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25069,7 +25892,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_client_list_func_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25084,7 +25907,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25169,13 +25992,13 @@ SWIGINTERN PyObject *_wrap_svn_client_list(PyObject *SWIGUNUSEDPARM(self), PyObj
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_client_list",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25200,7 +26023,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list(PyObject *SWIGUNUSEDPARM(self), PyObj
}
{
svn_client_list_func_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25215,7 +26038,7 @@ SWIGINTERN PyObject *_wrap_svn_client_list(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg9 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
+ arg9 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25298,13 +26121,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ls3(PyObject *SWIGUNUSEDPARM(self), PyObje
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_client_ls3",&arg3,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25316,7 +26139,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ls3(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25414,13 +26237,13 @@ SWIGINTERN PyObject *_wrap_svn_client_ls2(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_client_ls2",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25432,7 +26255,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ls2(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25519,7 +26342,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ls(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_client_ls",&arg2,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25531,7 +26354,7 @@ SWIGINTERN PyObject *_wrap_svn_client_ls(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25584,6 +26407,132 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_cat3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg5 = (svn_opt_revision_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ apr_hash_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg8 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg9 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOOO|OO:svn_client_cat3",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ arg2 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj6) {
+ /* Verify that the user supplied a valid pool */
+ if (obj6 != Py_None && obj6 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj6);
+ SWIG_arg_fail(svn_argnum_obj6);
+ SWIG_fail;
+ }
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg5) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_cat3(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,(struct svn_opt_revision_t const *)arg5,arg6,arg7,arg8,arg9);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_prophash_to_dict(*arg1));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_cat2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -25610,19 +26559,19 @@ SWIGINTERN PyObject *_wrap_svn_client_cat2(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
+ arg4 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25700,13 +26649,13 @@ SWIGINTERN PyObject *_wrap_svn_client_cat(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25802,7 +26751,7 @@ SWIGINTERN PyObject *_wrap_svn_client_add_to_changelist(PyObject *SWIGUNUSEDPARM
SWIG_fail;
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25892,7 +26841,7 @@ SWIGINTERN PyObject *_wrap_svn_client_remove_from_changelists(PyObject *SWIGUNUS
SWIG_fail;
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25975,11 +26924,11 @@ SWIGINTERN PyObject *_wrap_svn_client_get_changelists(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg4 = svn_swig_py_changelist_receiver_func;
+ arg4 = (svn_changelist_receiver_t) svn_swig_py_changelist_receiver_func;
arg5 = obj3;
}
{
- arg6 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
+ arg6 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26059,7 +27008,7 @@ SWIGINTERN PyObject *_wrap_svn_client_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26138,7 +27087,7 @@ SWIGINTERN PyObject *_wrap_svn_client_unlock(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26190,7 +27139,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_URL_set(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_URL_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26218,7 +27167,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_URL_get(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_URL_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26240,7 +27189,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_rev_set(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26267,7 +27216,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_rev_get(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26289,7 +27238,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_kind_set(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26316,7 +27265,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_kind_get(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26337,7 +27286,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_repos_root_URL_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_repos_root_URL_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26365,7 +27314,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_repos_root_URL_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_repos_root_URL_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26386,7 +27335,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_repos_UUID_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_repos_UUID_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26414,7 +27363,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_repos_UUID_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_repos_UUID_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26436,7 +27385,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_rev_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_last_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26463,7 +27412,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_rev_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_last_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26485,7 +27434,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_date_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_last_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26507,7 +27456,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_date_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_last_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26528,7 +27477,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_author_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_last_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26556,7 +27505,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_last_changed_author_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_last_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26578,13 +27527,13 @@ SWIGINTERN PyObject *_wrap_svn_info_t_lock_set(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26605,13 +27554,13 @@ SWIGINTERN PyObject *_wrap_svn_info_t_lock_get(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -26628,7 +27577,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_has_wc_info_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_has_wc_info_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26655,7 +27604,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_has_wc_info_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_has_wc_info_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26677,7 +27626,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_schedule_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_schedule_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26704,7 +27653,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_schedule_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_schedule_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26725,7 +27674,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_copyfrom_url_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_info_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26753,7 +27702,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_copyfrom_url_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26775,7 +27724,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_copyfrom_rev_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26802,7 +27751,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_copyfrom_rev_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26824,7 +27773,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_text_time_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_text_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26846,7 +27795,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_text_time_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_text_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26868,7 +27817,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_prop_time_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_prop_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26890,7 +27839,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_prop_time_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_prop_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26911,7 +27860,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_checksum_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_checksum_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26939,7 +27888,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_checksum_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_checksum_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26960,7 +27909,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_old_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_conflict_old_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26988,7 +27937,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_old_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_conflict_old_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27009,7 +27958,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_new_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_conflict_new_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27037,7 +27986,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_new_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_conflict_new_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27058,7 +28007,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_wrk_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_conflict_wrk_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27086,7 +28035,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_conflict_wrk_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_conflict_wrk_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27107,7 +28056,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_prejfile_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_prejfile_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27135,7 +28084,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_prejfile_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_prejfile_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27156,7 +28105,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_changelist_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"Os:svn_info_t_changelist_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27184,7 +28133,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_changelist_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_changelist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27206,7 +28155,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_depth_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_depth_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27233,7 +28182,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_depth_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_depth_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27255,7 +28204,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_working_size_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_working_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27282,7 +28231,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_working_size_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_working_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27304,7 +28253,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_size_set(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27331,7 +28280,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_size_get(PyObject *SWIGUNUSEDPARM(self), P
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27353,7 +28302,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_size64_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_size64_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27375,7 +28324,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_size64_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_size64_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27397,7 +28346,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_working_size64_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_working_size64_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27419,7 +28368,7 @@ SWIGINTERN PyObject *_wrap_svn_info_t_working_size64_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_working_size64_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27441,13 +28390,13 @@ SWIGINTERN PyObject *_wrap_svn_info_t_tree_conflict_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_info_t_tree_conflict_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
+ arg2 = (svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27468,13 +28417,13 @@ SWIGINTERN PyObject *_wrap_svn_info_t_tree_conflict_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_info_t_tree_conflict_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_conflict_description_t *) ((arg1)->tree_conflict);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -27495,7 +28444,7 @@ SWIGINTERN PyObject *_wrap_new_svn_info_t(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -27510,7 +28459,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_info_t(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_info_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27553,7 +28502,7 @@ SWIGINTERN PyObject *_wrap_svn_info_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_info_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
+ arg1 = (svn_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27574,7 +28523,7 @@ SWIGINTERN PyObject *_wrap_svn_info_dup(PyObject *SWIGUNUSEDPARM(self), PyObject
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -27596,7 +28545,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_URL_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_info2_t_URL_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27624,7 +28573,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_URL_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_URL_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27646,7 +28595,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_rev_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27673,7 +28622,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_rev_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27694,7 +28643,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_repos_root_URL_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_info2_t_repos_root_URL_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27722,7 +28671,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_repos_root_URL_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_repos_root_URL_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27743,7 +28692,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_repos_UUID_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_info2_t_repos_UUID_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27771,7 +28720,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_repos_UUID_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_repos_UUID_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27793,7 +28742,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_kind_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27820,7 +28769,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_kind_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27842,7 +28791,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_size_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27864,7 +28813,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_size_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27886,7 +28835,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_rev_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_last_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27913,7 +28862,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_rev_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_last_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27935,7 +28884,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_date_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_last_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27957,7 +28906,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_date_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_last_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27978,7 +28927,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_author_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"Os:svn_client_info2_t_last_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28006,7 +28955,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_last_changed_author_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_last_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28028,13 +28977,13 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_lock_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28055,13 +29004,13 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_lock_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -28078,13 +29027,13 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_wc_info_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_client_info2_t_wc_info_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_info_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj1);
+ arg2 = (svn_wc_info_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28105,13 +29054,13 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_t_wc_info_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_client_info2_t_wc_info_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_info_t *) ((arg1)->wc_info);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -28132,7 +29081,7 @@ SWIGINTERN PyObject *_wrap_new_svn_client_info2_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_info2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_info2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -28147,7 +29096,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_client_info2_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_client_info2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (struct svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28190,7 +29139,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_dup(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_client_info2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_client_info2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
+ arg1 = (svn_client_info2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28211,7 +29160,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2_dup(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_client_info2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_client_info2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -28225,6 +29174,156 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_client_info4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ svn_opt_revision_t *arg2 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg3 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ svn_client_info_receiver2_t arg9 = (svn_client_info_receiver2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ svn_client_ctx_t *arg11 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg12 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOOO|O:svn_client_info4",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_depth_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (apr_array_header_t *) svn_swig_py_seq_to_array(obj7,
+ sizeof(const char *),
+ svn_swig_py_unwrap_string,
+ NULL,
+ _global_pool);
+ if (PyErr_Occurred())
+ SWIG_fail;
+ }
+ {
+ svn_client_info_receiver2_t * tmp =
+ svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj8);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg9 = *tmp;
+ }
+ {
+ if (obj9 == Py_None) {
+ arg10 = NULL;
+ } else if (SWIG_ConvertPtr(obj9, (void **) &arg10, 0, 0) == -1) {
+ arg10 = (void *) obj9;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg11 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj10);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ if (!arg2) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg3) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_client_info4((char const *)arg1,(struct svn_opt_revision_t const *)arg2,(struct svn_opt_revision_t const *)arg3,arg4,arg5,arg6,arg7,(apr_array_header_t const *)arg8,arg9,arg10,arg11,arg12);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_client_info3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char *arg1 = (char *) 0 ;
@@ -28258,13 +29357,13 @@ SWIGINTERN PyObject *_wrap_svn_client_info3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_client_info3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28298,7 +29397,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_client_info_receiver2_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -28313,7 +29412,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28395,19 +29494,19 @@ SWIGINTERN PyObject *_wrap_svn_client_info2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_client_info2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_info_receiver_func;
+ arg4 = (svn_info_receiver_t) svn_swig_py_info_receiver_func;
arg5 = obj3;
}
{
@@ -28426,7 +29525,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info2(PyObject *SWIGUNUSEDPARM(self), PyOb
SWIG_fail;
}
{
- arg8 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
+ arg8 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28506,19 +29605,19 @@ SWIGINTERN PyObject *_wrap_svn_client_info(PyObject *SWIGUNUSEDPARM(self), PyObj
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_client_info",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
+ arg3 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_info_receiver_func;
+ arg4 = (svn_info_receiver_t) svn_swig_py_info_receiver_func;
arg5 = obj3;
}
{
@@ -28528,7 +29627,7 @@ SWIGINTERN PyObject *_wrap_svn_client_info(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg7 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
+ arg7 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28608,7 +29707,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_wc_root(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_client_get_wc_root",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28712,7 +29811,7 @@ SWIGINTERN PyObject *_wrap_svn_client_min_max_revisions(PyObject *SWIGUNUSEDPARM
}
}
{
- arg5 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg5 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28831,7 +29930,7 @@ SWIGINTERN PyObject *_wrap_svn_client_patch(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_client_patch_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -28846,7 +29945,7 @@ SWIGINTERN PyObject *_wrap_svn_client_patch(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg10 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
+ arg10 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28916,7 +30015,7 @@ SWIGINTERN PyObject *_wrap_svn_client_url_from_path2(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_client_url_from_path2",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29085,7 +30184,7 @@ SWIGINTERN PyObject *_wrap_svn_client_get_repos_root(PyObject *SWIGUNUSEDPARM(se
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_client_get_repos_root",&arg3,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29189,7 +30288,7 @@ SWIGINTERN PyObject *_wrap_svn_client_root_url_from_path(PyObject *SWIGUNUSEDPAR
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_client_root_url_from_path",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29266,7 +30365,7 @@ SWIGINTERN PyObject *_wrap_svn_client_uuid_from_url(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_client_uuid_from_url",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29349,7 +30448,7 @@ SWIGINTERN PyObject *_wrap_svn_client_uuid_from_path2(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_client_uuid_from_path2",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29442,13 +30541,13 @@ SWIGINTERN PyObject *_wrap_svn_client_uuid_from_path(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_client_uuid_from_path",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29532,7 +30631,7 @@ SWIGINTERN PyObject *_wrap_svn_client_open_ra_session2(PyObject *SWIGUNUSEDPARM(
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssO|OO:svn_client_open_ra_session2",&arg2,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg4 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
+ arg4 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29573,7 +30672,7 @@ SWIGINTERN PyObject *_wrap_svn_client_open_ra_session2(PyObject *SWIGUNUSEDPARM(
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -29616,7 +30715,7 @@ SWIGINTERN PyObject *_wrap_svn_client_open_ra_session(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_client_open_ra_session",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_client_ctx_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
+ arg3 = (svn_client_ctx_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_ctx_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29649,7 +30748,7 @@ SWIGINTERN PyObject *_wrap_svn_client_open_ra_session(PyObject *SWIGUNUSEDPARM(s
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -29690,7 +30789,7 @@ SWIGINTERN PyObject *_wrap_svn_proplist_invoke_receiver2(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_proplist_invoke_receiver2",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
svn_proplist_receiver2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29705,13 +30804,13 @@ SWIGINTERN PyObject *_wrap_svn_proplist_invoke_receiver2(PyObject *SWIGUNUSEDPAR
}
}
{
- arg4 = (apr_hash_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
+ arg4 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29777,7 +30876,7 @@ SWIGINTERN PyObject *_wrap_svn_proplist_invoke_receiver(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_proplist_invoke_receiver",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_proplist_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29792,7 +30891,7 @@ SWIGINTERN PyObject *_wrap_svn_proplist_invoke_receiver(PyObject *SWIGUNUSEDPARM
}
}
{
- arg4 = (apr_hash_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
+ arg4 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29863,14 +30962,14 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_get_commit_log3(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_client_invoke_get_commit_log3",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_client_get_commit_log3_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg4 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg4 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29975,14 +31074,14 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_get_commit_log2(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_client_invoke_get_commit_log2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_client_get_commit_log2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg4 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg4 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30087,14 +31186,14 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_get_commit_log(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_client_invoke_get_commit_log",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_client_get_commit_log_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg4 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg4 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30209,7 +31308,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_blame_receiver3(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOssO|O:svn_client_invoke_blame_receiver3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&arg10,&arg11,&obj11,&obj12)) SWIG_fail;
{
svn_client_blame_receiver3_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30243,7 +31342,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_blame_receiver3(PyObject *SWIGUNUSE
}
}
{
- arg7 = (apr_hash_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_hash_t, svn_argnum_obj6);
+ arg7 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_hash_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30255,7 +31354,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_blame_receiver3(PyObject *SWIGUNUSE
}
}
{
- arg9 = (apr_hash_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
+ arg9 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30336,7 +31435,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_blame_receiver2(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOOOssOssss|O:svn_client_invoke_blame_receiver2",&obj0,&obj1,&obj2,&obj3,&arg5,&arg6,&obj6,&arg8,&arg9,&arg10,&arg11,&obj11)) SWIG_fail;
{
svn_client_blame_receiver2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30428,7 +31527,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_blame_receiver(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OOOOsss|O:svn_client_invoke_blame_receiver",&obj0,&obj1,&obj2,&obj3,&arg5,&arg6,&arg7,&obj7)) SWIG_fail;
{
svn_client_blame_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30509,14 +31608,14 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_diff_summarize_func(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_client_invoke_diff_summarize_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_client_diff_summarize_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg2 = (svn_client_diff_summarize_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj1);
+ arg2 = (svn_client_diff_summarize_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_client_diff_summarize_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30594,7 +31693,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_import_filter_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_client_invoke_import_filter_func",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
svn_client_import_filter_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30609,7 +31708,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_import_filter_func(PyObject *SWIGUN
}
}
{
- arg5 = (svn_io_dirent2_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj3);
+ arg5 = (svn_io_dirent2_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_io_dirent2_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30681,7 +31780,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_status_func(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_client_invoke_status_func",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_client_status_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30696,7 +31795,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_status_func(PyObject *SWIGUNUSEDPAR
}
}
{
- arg4 = (svn_client_status_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj3);
+ arg4 = (svn_client_status_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_status_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30767,7 +31866,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_list_func2(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OOsOOsss|O:svn_client_invoke_list_func2",&obj0,&obj1,&arg3,&obj3,&obj4,&arg6,&arg7,&arg8,&obj8)) SWIG_fail;
{
svn_client_list_func2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30782,13 +31881,13 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_list_func2(PyObject *SWIGUNUSEDPARM
}
}
{
- arg4 = (svn_dirent_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj3);
+ arg4 = (svn_dirent_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_lock_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
+ arg5 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30857,7 +31956,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_list_func(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OOsOOs|O:svn_client_invoke_list_func",&obj0,&obj1,&arg3,&obj3,&obj4,&arg6,&obj6)) SWIG_fail;
{
svn_client_list_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30872,13 +31971,13 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_list_func(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg4 = (svn_dirent_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj3);
+ arg4 = (svn_dirent_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_dirent_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_lock_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
+ arg5 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30944,7 +32043,7 @@ SWIGINTERN PyObject *_wrap_svn_info_invoke_receiver(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_info_invoke_receiver",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_info_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30959,7 +32058,7 @@ SWIGINTERN PyObject *_wrap_svn_info_invoke_receiver(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg4 = (svn_info_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_info_t, svn_argnum_obj3);
+ arg4 = (svn_info_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_info_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31025,7 +32124,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_info_receiver2(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_client_invoke_info_receiver2",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_client_info_receiver2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31040,7 +32139,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_info_receiver2(PyObject *SWIGUNUSED
}
}
{
- arg4 = (svn_client_info2_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj3);
+ arg4 = (svn_client_info2_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_client_info2_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31110,7 +32209,7 @@ SWIGINTERN PyObject *_wrap_svn_client_invoke_patch_func(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OOsss|O:svn_client_invoke_patch_func",&obj0,&obj1,&arg4,&arg5,&arg6,&obj5)) SWIG_fail;
{
svn_client_patch_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31427,6 +32526,12 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_client_ctx_t_conflict_baton2_get", _wrap_svn_client_ctx_t_conflict_baton2_get, METH_VARARGS, (char *)"svn_client_ctx_t_conflict_baton2_get(svn_client_ctx_t self) -> void *"},
{ (char *)"svn_client_ctx_t_wc_ctx_set", _wrap_svn_client_ctx_t_wc_ctx_set, METH_VARARGS, (char *)"svn_client_ctx_t_wc_ctx_set(svn_client_ctx_t self, svn_wc_context_t * wc_ctx)"},
{ (char *)"svn_client_ctx_t_wc_ctx_get", _wrap_svn_client_ctx_t_wc_ctx_get, METH_VARARGS, (char *)"svn_client_ctx_t_wc_ctx_get(svn_client_ctx_t self) -> svn_wc_context_t *"},
+ { (char *)"svn_client_ctx_t_check_tunnel_func_set", _wrap_svn_client_ctx_t_check_tunnel_func_set, METH_VARARGS, (char *)"svn_client_ctx_t_check_tunnel_func_set(svn_client_ctx_t self, svn_ra_check_tunnel_func_t check_tunnel_func)"},
+ { (char *)"svn_client_ctx_t_check_tunnel_func_get", _wrap_svn_client_ctx_t_check_tunnel_func_get, METH_VARARGS, (char *)"svn_client_ctx_t_check_tunnel_func_get(svn_client_ctx_t self) -> svn_ra_check_tunnel_func_t"},
+ { (char *)"svn_client_ctx_t_open_tunnel_func_set", _wrap_svn_client_ctx_t_open_tunnel_func_set, METH_VARARGS, (char *)"svn_client_ctx_t_open_tunnel_func_set(svn_client_ctx_t self, svn_ra_open_tunnel_func_t open_tunnel_func)"},
+ { (char *)"svn_client_ctx_t_open_tunnel_func_get", _wrap_svn_client_ctx_t_open_tunnel_func_get, METH_VARARGS, (char *)"svn_client_ctx_t_open_tunnel_func_get(svn_client_ctx_t self) -> svn_ra_open_tunnel_func_t"},
+ { (char *)"svn_client_ctx_t_tunnel_baton_set", _wrap_svn_client_ctx_t_tunnel_baton_set, METH_VARARGS, (char *)"svn_client_ctx_t_tunnel_baton_set(svn_client_ctx_t self, void * tunnel_baton)"},
+ { (char *)"svn_client_ctx_t_tunnel_baton_get", _wrap_svn_client_ctx_t_tunnel_baton_get, METH_VARARGS, (char *)"svn_client_ctx_t_tunnel_baton_get(svn_client_ctx_t self) -> void *"},
{ (char *)"new_svn_client_ctx_t", _wrap_new_svn_client_ctx_t, METH_VARARGS, (char *)"new_svn_client_ctx_t() -> svn_client_ctx_t"},
{ (char *)"delete_svn_client_ctx_t", _wrap_delete_svn_client_ctx_t, METH_VARARGS, (char *)"delete_svn_client_ctx_t(svn_client_ctx_t self)"},
{ (char *)"svn_client_ctx_t_swigregister", svn_client_ctx_t_swigregister, METH_VARARGS, NULL},
@@ -31647,6 +32752,13 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"delete_svn_client_status_t", _wrap_delete_svn_client_status_t, METH_VARARGS, (char *)"delete_svn_client_status_t(svn_client_status_t self)"},
{ (char *)"svn_client_status_t_swigregister", svn_client_status_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_client_status_dup", _wrap_svn_client_status_dup, METH_VARARGS, (char *)"svn_client_status_dup(svn_client_status_t status, apr_pool_t result_pool) -> svn_client_status_t"},
+ { (char *)"svn_client_status6", _wrap_svn_client_status6, METH_VARARGS, (char *)"\n"
+ "svn_client_status6(svn_client_ctx_t ctx, char const * path, svn_opt_revision_t revision, svn_depth_t depth, \n"
+ " svn_boolean_t get_all, svn_boolean_t check_out_of_date, svn_boolean_t check_working_copy, \n"
+ " svn_boolean_t no_ignore, svn_boolean_t ignore_externals, \n"
+ " svn_boolean_t depth_as_sticky, apr_array_header_t changelists, svn_client_status_func_t status_func, \n"
+ " void * status_baton, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_status5", _wrap_svn_client_status5, METH_VARARGS, (char *)"\n"
"svn_client_status5(svn_client_ctx_t ctx, char const * path, svn_opt_revision_t revision, svn_depth_t depth, \n"
" svn_boolean_t get_all, svn_boolean_t update, svn_boolean_t no_ignore, \n"
@@ -31965,6 +33077,16 @@ static PyMethodDef SwigMethods[] = {
" svn_boolean_t discover_changed_paths, apr_array_header_t revprops, \n"
" svn_client_ctx_t ctx, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_client_vacuum", _wrap_svn_client_vacuum, METH_VARARGS, (char *)"\n"
+ "svn_client_vacuum(char const * dir_abspath, svn_boolean_t remove_unversioned_items, svn_boolean_t remove_ignored_items, \n"
+ " svn_boolean_t fix_recorded_timestamps, svn_boolean_t vacuum_pristines, \n"
+ " svn_boolean_t include_externals, svn_client_ctx_t ctx, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
+ { (char *)"svn_client_cleanup2", _wrap_svn_client_cleanup2, METH_VARARGS, (char *)"\n"
+ "svn_client_cleanup2(char const * dir_abspath, svn_boolean_t break_locks, svn_boolean_t fix_recorded_timestamps, \n"
+ " svn_boolean_t clear_dav_cache, svn_boolean_t vacuum_pristines, svn_boolean_t include_externals, \n"
+ " svn_client_ctx_t ctx, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_cleanup", _wrap_svn_client_cleanup, METH_VARARGS, (char *)"svn_client_cleanup(char const * dir, svn_client_ctx_t ctx, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_client_upgrade", _wrap_svn_client_upgrade, METH_VARARGS, (char *)"svn_client_upgrade(char const * wcroot_dir, svn_client_ctx_t ctx, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_client_relocate2", _wrap_svn_client_relocate2, METH_VARARGS, (char *)"\n"
@@ -31975,6 +33097,11 @@ static PyMethodDef SwigMethods[] = {
"svn_client_relocate(char const * dir, char const * from_prefix, char const * to_prefix, svn_boolean_t recurse, \n"
" svn_client_ctx_t ctx, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_client_revert3", _wrap_svn_client_revert3, METH_VARARGS, (char *)"\n"
+ "svn_client_revert3(apr_array_header_t paths, svn_depth_t depth, apr_array_header_t changelists, svn_boolean_t clear_changelists, \n"
+ " svn_boolean_t metadata_only, svn_client_ctx_t ctx, \n"
+ " apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_revert2", _wrap_svn_client_revert2, METH_VARARGS, (char *)"\n"
"svn_client_revert2(apr_array_header_t paths, svn_depth_t depth, apr_array_header_t changelists, svn_client_ctx_t ctx, \n"
" apr_pool_t pool) -> svn_error_t\n"
@@ -31994,6 +33121,13 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"new_svn_client_copy_source_t", _wrap_new_svn_client_copy_source_t, METH_VARARGS, (char *)"new_svn_client_copy_source_t() -> svn_client_copy_source_t"},
{ (char *)"delete_svn_client_copy_source_t", _wrap_delete_svn_client_copy_source_t, METH_VARARGS, (char *)"delete_svn_client_copy_source_t(svn_client_copy_source_t self)"},
{ (char *)"svn_client_copy_source_t_swigregister", svn_client_copy_source_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_client_copy7", _wrap_svn_client_copy7, METH_VARARGS, (char *)"\n"
+ "svn_client_copy7(apr_array_header_t sources, char const * dst_path, svn_boolean_t copy_as_child, svn_boolean_t make_parents, \n"
+ " svn_boolean_t ignore_externals, svn_boolean_t metadata_only, \n"
+ " svn_boolean_t pin_externals, apr_hash_t externals_to_pin, apr_hash_t revprop_table, \n"
+ " svn_commit_callback2_t commit_callback, svn_client_ctx_t ctx, \n"
+ " apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_copy6", _wrap_svn_client_copy6, METH_VARARGS, (char *)"\n"
"svn_client_copy6(apr_array_header_t sources, char const * dst_path, svn_boolean_t copy_as_child, svn_boolean_t make_parents, \n"
" svn_boolean_t ignore_externals, apr_hash_t revprop_table, \n"
@@ -32189,6 +33323,11 @@ static PyMethodDef SwigMethods[] = {
"svn_client_ls(char const * path_or_url, svn_opt_revision_t revision, svn_boolean_t recurse, svn_client_ctx_t ctx, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_client_cat3", _wrap_svn_client_cat3, METH_VARARGS, (char *)"\n"
+ "svn_client_cat3(svn_stream_t * out, char const * path_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision, \n"
+ " svn_boolean_t expand_keywords, svn_client_ctx_t ctx, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_cat2", _wrap_svn_client_cat2, METH_VARARGS, (char *)"\n"
"svn_client_cat2(svn_stream_t * out, char const * path_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision, \n"
" svn_client_ctx_t ctx, apr_pool_t pool) -> svn_error_t\n"
@@ -32298,6 +33437,13 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"delete_svn_client_info2_t", _wrap_delete_svn_client_info2_t, METH_VARARGS, (char *)"delete_svn_client_info2_t(svn_client_info2_t self)"},
{ (char *)"svn_client_info2_t_swigregister", svn_client_info2_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_client_info2_dup", _wrap_svn_client_info2_dup, METH_VARARGS, (char *)"svn_client_info2_dup(svn_client_info2_t info, apr_pool_t pool) -> svn_client_info2_t"},
+ { (char *)"svn_client_info4", _wrap_svn_client_info4, METH_VARARGS, (char *)"\n"
+ "svn_client_info4(char const * abspath_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision, \n"
+ " svn_depth_t depth, svn_boolean_t fetch_excluded, svn_boolean_t fetch_actual_only, \n"
+ " svn_boolean_t include_externals, apr_array_header_t changelists, \n"
+ " svn_client_info_receiver2_t receiver, void * receiver_baton, svn_client_ctx_t ctx, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_client_info3", _wrap_svn_client_info3, METH_VARARGS, (char *)"\n"
"svn_client_info3(char const * abspath_or_url, svn_opt_revision_t peg_revision, svn_opt_revision_t revision, \n"
" svn_depth_t depth, svn_boolean_t fetch_excluded, svn_boolean_t fetch_actual_only, \n"
@@ -32439,6 +33585,7 @@ static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "svn_auth_ssl_client_cert_prompt_func_t|struct svn_error_t *(*)(svn_auth_cred_ssl_client_cert_t **,void *,char const *,svn_boolean_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_ssl_server_trust_t **,void *,char const *,apr_uint32_t,svn_auth_ssl_server_cert_info_t const *,svn_boolean_t,apr_pool_t *)|svn_auth_ssl_server_trust_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_username_t **,void *,char const *,svn_boolean_t,apr_pool_t *)|svn_auth_username_prompt_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func2_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description2_t const *,void *,apr_pool_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_client_diff_summarize_func_t|struct svn_error_t *(*)(svn_client_diff_summarize_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -32447,6 +33594,7 @@ static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_e
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_client_blame_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_client_blame_receiver2_t|struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,svn_revnum_t,char const *,char const *,char const *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void = {"_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void", "void (*)(void *,char const *,enum svn_wc_notify_action_t,enum svn_node_kind_t,char const *,enum svn_wc_notify_state_t,enum svn_wc_notify_state_t,long)|svn_wc_notify_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_array_header_t *,apr_pool_t *)|svn_proplist_receiver2_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_pool_t *)|svn_proplist_receiver_t", 0, 0, (void*)0, 0};
@@ -32472,12 +33620,14 @@ static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0
static swig_type_info _swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void = {"_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void", "void (**)(apr_off_t,apr_off_t,void *,apr_pool_t *)|svn_ra_progress_notify_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_client_get_commit_log_t *|struct svn_error_t *(**)(char const **,char const **,apr_array_header_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_client_get_commit_log3_t *|svn_client_get_commit_log2_t *|struct svn_error_t *(**)(char const **,char const **,apr_array_header_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)|svn_ra_open_tunnel_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(svn_wc_conflict_result_t **,svn_wc_conflict_description2_t const *,void *,apr_pool_t *,apr_pool_t *)|svn_wc_conflict_resolver_func2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(svn_wc_conflict_result_t **,svn_wc_conflict_description_t const *,void *,apr_pool_t *)|svn_wc_conflict_resolver_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(svn_client_diff_summarize_t const *,void *,apr_pool_t *)|svn_client_diff_summarize_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void__p_svn_error_t = {"_p_p_f_p_void__p_svn_error_t", "svn_cancel_func_t *|struct svn_error_t *(**)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_client_blame_receiver_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,svn_revnum_t,char const *,char const *,char const *,char const *,apr_pool_t *)|svn_client_blame_receiver2_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_q_const__char__int = {"_p_p_f_p_void_p_q_const__char__int", "int (**)(void *,char const *)|svn_ra_check_tunnel_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void = {"_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void", "void (**)(void *,char const *,enum svn_wc_notify_action_t,enum svn_node_kind_t,char const *,enum svn_wc_notify_state_t,enum svn_wc_notify_state_t,long)|svn_wc_notify_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,apr_hash_t *,apr_array_header_t *,apr_pool_t *)|svn_proplist_receiver2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,apr_hash_t *,apr_pool_t *)|svn_proplist_receiver_t *", 0, 0, (void*)0, 0};
@@ -32527,9 +33677,11 @@ static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_c
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_diff_file_options_t = {"_p_svn_diff_file_options_t", "svn_diff_file_options_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_info_t = {"_p_svn_info_t", "struct svn_info_t *|svn_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
@@ -32573,11 +33725,9 @@ static swig_type_info _swigt__p_svn_wc_adm_access_t = {"_p_svn_wc_adm_access_t",
static swig_type_info _swigt__p_svn_wc_committed_queue_t = {"_p_svn_wc_committed_queue_t", "struct svn_wc_committed_queue_t *|svn_wc_committed_queue_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_action_t = {"_p_svn_wc_conflict_action_t", "enum svn_wc_conflict_action_t *|svn_wc_conflict_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_choice_t = {"_p_svn_wc_conflict_choice_t", "enum svn_wc_conflict_choice_t *|svn_wc_conflict_choice_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_description2_t = {"_p_svn_wc_conflict_description2_t", "struct svn_wc_conflict_description2_t *|svn_wc_conflict_description2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_description_t = {"_p_svn_wc_conflict_description_t", "struct svn_wc_conflict_description_t *|svn_wc_conflict_description_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_kind_t = {"_p_svn_wc_conflict_kind_t", "enum svn_wc_conflict_kind_t *|svn_wc_conflict_kind_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_reason_t = {"_p_svn_wc_conflict_reason_t", "enum svn_wc_conflict_reason_t *|svn_wc_conflict_reason_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_result_t = {"_p_svn_wc_conflict_result_t", "struct svn_wc_conflict_result_t *|svn_wc_conflict_result_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_version_t = {"_p_svn_wc_conflict_version_t", "struct svn_wc_conflict_version_t *|svn_wc_conflict_version_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_context_t = {"_p_svn_wc_context_t", "struct svn_wc_context_t *|svn_wc_context_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_diff_callbacks2_t = {"_p_svn_wc_diff_callbacks2_t", "struct svn_wc_diff_callbacks2_t *|svn_wc_diff_callbacks2_t *", 0, 0, (void*)0, 0};
@@ -32623,6 +33773,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -32631,6 +33782,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -32656,12 +33808,14 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
&_swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void__p_svn_error_t,
&_swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_q_const__char__int,
&_swigt__p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
&_swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -32711,9 +33865,11 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
&_swigt__p_svn_diff_file_options_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_info_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
@@ -32757,11 +33913,9 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_wc_committed_queue_t,
&_swigt__p_svn_wc_conflict_action_t,
&_swigt__p_svn_wc_conflict_choice_t,
- &_swigt__p_svn_wc_conflict_description2_t,
&_swigt__p_svn_wc_conflict_description_t,
&_swigt__p_svn_wc_conflict_kind_t,
&_swigt__p_svn_wc_conflict_reason_t,
- &_swigt__p_svn_wc_conflict_result_t,
&_swigt__p_svn_wc_conflict_version_t,
&_swigt__p_svn_wc_context_t,
&_swigt__p_svn_wc_diff_callbacks2_t,
@@ -32807,6 +33961,7 @@ static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -32815,6 +33970,7 @@ static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_v
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void[] = { {&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -32840,12 +33996,14 @@ static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0
static swig_cast_info _swigc__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void[] = { {&_swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void[] = { {&_swigt__p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -32895,9 +34053,11 @@ static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0,
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_diff_file_options_t[] = { {&_swigt__p_svn_diff_file_options_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_info_t[] = { {&_swigt__p_svn_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -32941,11 +34101,9 @@ static swig_cast_info _swigc__p_svn_wc_adm_access_t[] = { {&_swigt__p_svn_wc_ad
static swig_cast_info _swigc__p_svn_wc_committed_queue_t[] = { {&_swigt__p_svn_wc_committed_queue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_action_t[] = { {&_swigt__p_svn_wc_conflict_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_choice_t[] = { {&_swigt__p_svn_wc_conflict_choice_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_description2_t[] = { {&_swigt__p_svn_wc_conflict_description2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_description_t[] = { {&_swigt__p_svn_wc_conflict_description_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_kind_t[] = { {&_swigt__p_svn_wc_conflict_kind_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_reason_t[] = { {&_swigt__p_svn_wc_conflict_reason_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_result_t[] = { {&_swigt__p_svn_wc_conflict_result_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_version_t[] = { {&_swigt__p_svn_wc_conflict_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_context_t[] = { {&_swigt__p_svn_wc_context_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_diff_callbacks2_t[] = { {&_swigt__p_svn_wc_diff_callbacks2_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -32991,6 +34149,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -32999,6 +34158,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -33024,12 +34184,14 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
_swigc__p_p_f_p_p_q_const__char_p_p_q_const__char_p_apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void__p_svn_error_t,
_swigc__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_q_const__char__int,
_swigc__p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
_swigc__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -33079,9 +34241,11 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
_swigc__p_svn_diff_file_options_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_info_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
@@ -33125,11 +34289,9 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_wc_committed_queue_t,
_swigc__p_svn_wc_conflict_action_t,
_swigc__p_svn_wc_conflict_choice_t,
- _swigc__p_svn_wc_conflict_description2_t,
_swigc__p_svn_wc_conflict_description_t,
_swigc__p_svn_wc_conflict_kind_t,
_swigc__p_svn_wc_conflict_reason_t,
- _swigc__p_svn_wc_conflict_result_t,
_swigc__p_svn_wc_conflict_version_t,
_swigc__p_svn_wc_context_t,
_swigc__p_svn_wc_diff_callbacks2_t,
@@ -33173,18 +34335,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -33194,17 +34356,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -33267,7 +34429,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -33862,7 +35024,7 @@ SWIG_init(void) {
svn_cancel_func_t * tmp = malloc(sizeof(svn_cancel_func_t));
*tmp = (svn_cancel_func_t) svn_swig_py_cancel_func;
- SWIG_Python_SetConstant(d, "svn_swig_py_cancel_func",svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t, NULL, NULL))
+ SWIG_Python_SetConstant(d, "svn_swig_py_cancel_func",svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t, NULL, NULL))
;
@@ -33871,7 +35033,7 @@ SWIG_init(void) {
svn_client_get_commit_log3_t * tmp = malloc(sizeof(svn_client_get_commit_log3_t));
*tmp = (svn_client_get_commit_log3_t) svn_swig_py_get_commit_log_func;
- SWIG_Python_SetConstant(d, "svn_swig_py_get_commit_log_func",svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, NULL, NULL))
+ SWIG_Python_SetConstant(d, "svn_swig_py_get_commit_log_func",svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_q_const__apr_array_header_t_p_void_p_apr_pool_t__p_svn_error_t, NULL, NULL))
;
@@ -33880,7 +35042,7 @@ SWIG_init(void) {
svn_wc_notify_func_t * tmp = malloc(sizeof(svn_wc_notify_func_t));
*tmp = (svn_wc_notify_func_t) svn_swig_py_notify_func;
- SWIG_Python_SetConstant(d, "svn_swig_py_notify_func",svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, NULL, NULL))
+ SWIG_Python_SetConstant(d, "svn_swig_py_notify_func",svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, NULL, NULL))
;
@@ -33889,7 +35051,7 @@ SWIG_init(void) {
svn_wc_notify_func2_t * tmp = malloc(sizeof(svn_wc_notify_func2_t));
*tmp = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
- SWIG_Python_SetConstant(d, "svn_swig_py_notify_func2",svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, NULL, NULL))
+ SWIG_Python_SetConstant(d, "svn_swig_py_notify_func2",svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, NULL, NULL))
;
diff --git a/subversion/bindings/swig/python/svn_delta.c b/subversion/bindings/swig/python/svn_delta.c
index 2c66025..0ed9050 100644
--- a/subversion/bindings/swig/python/svn_delta.c
+++ b/subversion/bindings/swig/python/svn_delta.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2997,46 +2971,48 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_svn_config_t swig_types[54]
#define SWIGTYPE_p_svn_delta_editor_t swig_types[55]
#define SWIGTYPE_p_svn_depth_t swig_types[56]
-#define SWIGTYPE_p_svn_dirent_t swig_types[57]
-#define SWIGTYPE_p_svn_errno_t swig_types[58]
-#define SWIGTYPE_p_svn_error_t swig_types[59]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[60]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[61]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[62]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[63]
-#define SWIGTYPE_p_svn_lock_t swig_types[64]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[65]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[66]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[67]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[68]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[69]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[70]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[71]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[72]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[73]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[74]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[75]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[76]
-#define SWIGTYPE_p_svn_prop_kind swig_types[77]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[78]
-#define SWIGTYPE_p_svn_stream_t swig_types[79]
-#define SWIGTYPE_p_svn_string_t swig_types[80]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[81]
-#define SWIGTYPE_p_svn_tristate_t swig_types[82]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[83]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[84]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[85]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[86]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[87]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[88]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[89]
-#define SWIGTYPE_p_svn_version_t swig_types[90]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[91]
-#define SWIGTYPE_p_unsigned_char swig_types[92]
-#define SWIGTYPE_p_unsigned_long swig_types[93]
-#define SWIGTYPE_p_void swig_types[94]
-static swig_type_info *swig_types[96];
-static swig_module_info swig_module = {swig_types, 95, 0, 0, 0, 0};
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[57]
+#define SWIGTYPE_p_svn_dirent_t swig_types[58]
+#define SWIGTYPE_p_svn_errno_t swig_types[59]
+#define SWIGTYPE_p_svn_error_t swig_types[60]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[61]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[62]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[63]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[64]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[65]
+#define SWIGTYPE_p_svn_lock_t swig_types[66]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[67]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[68]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[69]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[70]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[71]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[72]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[73]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[74]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[75]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[76]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[77]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[78]
+#define SWIGTYPE_p_svn_prop_kind swig_types[79]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[80]
+#define SWIGTYPE_p_svn_stream_t swig_types[81]
+#define SWIGTYPE_p_svn_string_t swig_types[82]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[83]
+#define SWIGTYPE_p_svn_tristate_t swig_types[84]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[85]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[86]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[87]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[88]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[89]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[90]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[91]
+#define SWIGTYPE_p_svn_version_t swig_types[92]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[93]
+#define SWIGTYPE_p_unsigned_char swig_types[94]
+#define SWIGTYPE_p_unsigned_long swig_types[95]
+#define SWIGTYPE_p_void swig_types[96]
+static swig_type_info *swig_types[98];
+static swig_module_info swig_module = {swig_types, 97, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3060,7 +3036,7 @@ static swig_module_info swig_module = {swig_types, 95, 0, 0, 0, 0};
#endif
#define SWIG_name "_delta"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3286,6 +3262,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3335,7 +3323,7 @@ SWIG_From_unsigned_SS_long (unsigned long value)
PyLong_FromUnsignedLong(value) : PyLong_FromLong((long)(value));
}
-SWIGINTERN void svn_txdelta_window_t__ops_get(struct svn_txdelta_window_t *self,int *num_ops,svn_txdelta_op_t **ops){
+SWIGINTERN void svn_txdelta_window_t__ops_get(struct svn_txdelta_window_t *self,int *num_ops,svn_txdelta_op_t const **ops){
*num_ops = self->num_ops;
*ops = self->ops;
}
@@ -3585,13 +3573,13 @@ SWIGINTERN PyObject *_wrap_svn_swig_py_make_editor(PyObject *SWIGUNUSEDPARM(self
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -3621,7 +3609,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_version(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3638,7 +3626,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_action_code_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_op_t_action_code_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3665,7 +3653,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_action_code_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_op_t_action_code_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3687,7 +3675,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_offset_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_op_t_offset_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3714,7 +3702,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_offset_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_op_t_offset_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3736,7 +3724,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_length_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_op_t_length_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3763,7 +3751,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_op_t_length_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_op_t_length_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3789,7 +3777,7 @@ SWIGINTERN PyObject *_wrap_new_svn_txdelta_op_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_txdelta_op_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_txdelta_op_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3804,7 +3792,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_txdelta_op_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_txdelta_op_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_op_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_op_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_op_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3840,7 +3828,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_sview_offset_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_window_t_sview_offset_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3862,7 +3850,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_sview_offset_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_sview_offset_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3884,7 +3872,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_sview_len_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_window_t_sview_len_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3911,7 +3899,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_sview_len_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_sview_len_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3933,7 +3921,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_tview_len_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_window_t_tview_len_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3960,7 +3948,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_tview_len_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_tview_len_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3982,7 +3970,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_num_ops_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_window_t_num_ops_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4009,7 +3997,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_num_ops_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_num_ops_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4031,7 +4019,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_src_ops_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_window_t_src_ops_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4058,7 +4046,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_src_ops_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_src_ops_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4079,7 +4067,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t_new_data_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t_new_data_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4108,7 +4096,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t__ops_get(PyObject *SWIGUNUSEDPAR
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_window_t__ops_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4116,7 +4104,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_t__ops_get(PyObject *SWIGUNUSEDPAR
{
svn_swig_py_release_py_lock();
- svn_txdelta_window_t__ops_get(arg1,arg2,arg3);
+ svn_txdelta_window_t__ops_get(arg1,arg2,(struct svn_txdelta_op_t const **)arg3);
svn_swig_py_acquire_py_lock();
@@ -4157,7 +4145,7 @@ SWIGINTERN PyObject *_wrap_new_svn_txdelta_window_t(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4172,7 +4160,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_txdelta_window_t(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_txdelta_window_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (struct svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4215,7 +4203,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_dup(PyObject *SWIGUNUSEDPARM(self)
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_txdelta_window_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4236,7 +4224,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_window_dup(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4268,13 +4256,13 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_compose_windows(PyObject *SWIGUNUSEDPARM(
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_txdelta_compose_windows",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj1);
+ arg2 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4295,7 +4283,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_compose_windows(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4322,7 +4310,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_apply_instructions(PyObject *SWIGUNUSEDPA
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"Oss:svn_txdelta_apply_instructions",&obj0,&arg2,&arg3)) SWIG_fail;
{
- arg1 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4391,7 +4379,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_run(PyObject *SWIGUNUSEDPARM(self), PyObj
}
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4412,8 +4400,8 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_run(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj5; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj5;
}
if (obj6) {
/* Verify that the user supplied a valid pool */
@@ -4506,7 +4494,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_stream_create(PyObject *SWIGUNUSEDPARM(se
}
{
svn_txdelta_next_window_fn_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_p_svn_txdelta_window_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_svn_txdelta_window_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4514,7 +4502,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_stream_create(PyObject *SWIGUNUSEDPARM(se
}
{
svn_txdelta_md5_digest_fn_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_void__p_unsigned_char, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void__p_unsigned_char, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4536,7 +4524,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_stream_create(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_txdelta_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_txdelta_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4569,7 +4557,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_next_window(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_txdelta_next_window",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_txdelta_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
+ arg2 = (svn_txdelta_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4602,7 +4590,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_next_window(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args))
;
@@ -4627,7 +4615,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_md5_digest(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_txdelta_md5_digest",&obj0)) SWIG_fail;
{
- arg1 = (svn_txdelta_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4640,7 +4628,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_md5_digest(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_unsigned_char,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_unsigned_char,
_global_py_pool, args);
return resultobj;
fail:
@@ -4699,7 +4687,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta2(PyObject *SWIGUNUSEDPARM(self), PyObject
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
_global_py_pool, args))
;
@@ -4759,7 +4747,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta(PyObject *SWIGUNUSEDPARM(self), PyObject
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
_global_py_pool, args))
;
@@ -4797,7 +4785,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_target_push(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_txdelta_target_push",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4830,7 +4818,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_target_push(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4879,7 +4867,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_send_string(PyObject *SWIGUNUSEDPARM(self
}
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4959,7 +4947,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_send_stream(PyObject *SWIGUNUSEDPARM(self
}
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5035,14 +5023,14 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_send_txstream(PyObject *SWIGUNUSEDPARM(se
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_txdelta_send_txstream",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_txdelta_stream_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_stream_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_stream_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5117,7 +5105,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_send_contents(PyObject *SWIGUNUSEDPARM(se
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_txdelta_send_contents",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (unsigned char *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_unsigned_char, svn_argnum_obj0);
+ arg1 = (unsigned char *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_unsigned_char, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5130,7 +5118,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_send_contents(PyObject *SWIGUNUSEDPARM(se
}
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5241,13 +5229,13 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_apply(PyObject *SWIGUNUSEDPARM(self), PyO
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -5329,13 +5317,13 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_to_svndiff3(PyObject *SWIGUNUSEDPARM(self
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -5409,13 +5397,13 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_to_svndiff2(PyObject *SWIGUNUSEDPARM(self
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -5481,13 +5469,13 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_to_svndiff(PyObject *SWIGUNUSEDPARM(self)
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg3, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg3, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -5525,7 +5513,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_parse_svndiff(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_txdelta_parse_svndiff",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5561,7 +5549,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_parse_svndiff(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_stream_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_stream_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5632,7 +5620,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_read_svndiff_window(PyObject *SWIGUNUSEDP
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args))
;
@@ -5724,7 +5712,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_set_target_revision_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_set_target_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5751,7 +5739,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_set_target_revision_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_set_target_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5773,7 +5761,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_root_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_open_root_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5800,7 +5788,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_root_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_open_root_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5822,7 +5810,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_delete_entry_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_delete_entry_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5849,7 +5837,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_delete_entry_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_delete_entry_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5871,7 +5859,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_add_directory_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_add_directory_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5898,7 +5886,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_add_directory_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_add_directory_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5920,7 +5908,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_directory_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_open_directory_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5947,7 +5935,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_directory_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_open_directory_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5969,7 +5957,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_change_dir_prop_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_change_dir_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5996,7 +5984,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_change_dir_prop_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_change_dir_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6018,7 +6006,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_directory_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_close_directory_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6045,7 +6033,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_directory_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_close_directory_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6067,7 +6055,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_absent_directory_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_absent_directory_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6094,7 +6082,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_absent_directory_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_absent_directory_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6116,7 +6104,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_add_file_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_add_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6143,7 +6131,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_add_file_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_add_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6165,7 +6153,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_file_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_open_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6192,7 +6180,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_open_file_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_open_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6214,7 +6202,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_apply_textdelta_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_apply_textdelta_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6241,7 +6229,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_apply_textdelta_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_apply_textdelta_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6263,7 +6251,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_change_file_prop_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_change_file_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6290,7 +6278,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_change_file_prop_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_change_file_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6312,7 +6300,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_file_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_close_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6339,7 +6327,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_file_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_close_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6361,7 +6349,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_absent_file_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_absent_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6388,7 +6376,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_absent_file_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_absent_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6410,7 +6398,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_edit_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_close_edit_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6437,7 +6425,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_close_edit_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_close_edit_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6459,7 +6447,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_abort_edit_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_editor_t_abort_edit_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6486,7 +6474,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_t_abort_edit_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_delta_editor_t_abort_edit_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6512,7 +6500,7 @@ SWIGINTERN PyObject *_wrap_new_svn_delta_editor_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6527,7 +6515,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_delta_editor_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_delta_editor_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (struct svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6583,7 +6571,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_default_editor(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6607,7 +6595,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_noop_window_handler(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_delta_noop_window_handler",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
+ arg1 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6672,11 +6660,11 @@ SWIGINTERN PyObject *_wrap_svn_delta_get_cancellation_editor(PyObject *SWIGUNUSE
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_delta_get_cancellation_editor",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = svn_swig_py_cancel_func;
- arg2 = obj0; /* our function is the baton. */
+ arg1 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg2 = obj0;
}
{
- arg3 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj1);
+ arg3 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6717,13 +6705,13 @@ SWIGINTERN PyObject *_wrap_svn_delta_get_cancellation_editor(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg5, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg5, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg6, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg6, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -6768,7 +6756,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_depth_filter_editor(PyObject *SWIGUNUSEDPAR
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_delta_depth_filter_editor",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg3 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6821,13 +6809,13 @@ SWIGINTERN PyObject *_wrap_svn_delta_depth_filter_editor(PyObject *SWIGUNUSEDPAR
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -6869,7 +6857,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_path_driver2(PyObject *SWIGUNUSEDPARM(self)
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|O:svn_delta_path_driver2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6898,7 +6886,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_path_driver2(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg5 = svn_swig_py_delta_path_driver_cb_func;
+ arg5 = (svn_delta_path_driver_cb_func_t) svn_swig_py_delta_path_driver_cb_func;
arg6 = obj4;
}
if (obj5) {
@@ -6965,7 +6953,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_path_driver(PyObject *SWIGUNUSEDPARM(self),
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|O:svn_delta_path_driver",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6994,7 +6982,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_path_driver(PyObject *SWIGUNUSEDPARM(self),
SWIG_fail;
}
{
- arg5 = svn_swig_py_delta_path_driver_cb_func;
+ arg5 = (svn_delta_path_driver_cb_func_t) svn_swig_py_delta_path_driver_cb_func;
arg6 = obj4;
}
if (obj5) {
@@ -7068,7 +7056,7 @@ SWIGINTERN PyObject *_wrap_svn_compat_wrap_file_rev_handler(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_compat_wrap_file_rev_handler",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_file_rev_handler_old_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -7100,7 +7088,7 @@ SWIGINTERN PyObject *_wrap_svn_compat_wrap_file_rev_handler(PyObject *SWIGUNUSED
}
resultobj = SWIG_Py_Void();
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg1, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg1, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_global_py_pool, args))
;
@@ -7153,7 +7141,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_set_target_revision(PyObject
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_delta_editor_invoke_set_target_revision",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7234,7 +7222,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_root(PyObject *SWIGUNUSE
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_delta_editor_invoke_open_root",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7281,7 +7269,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_root(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg5, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg5, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7319,7 +7307,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_delete_entry(PyObject *SWIGUN
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_delta_editor_invoke_delete_entry",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7402,7 +7390,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_add_directory(PyObject *SWIGU
arg7 = &temp7;
if (!PyArg_ParseTuple(args,(char *)"OsOzO|O:svn_delta_editor_invoke_add_directory",&obj0,&arg2,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7449,7 +7437,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_add_directory(PyObject *SWIGU
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7490,7 +7478,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_directory(PyObject *SWIG
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_delta_editor_invoke_open_directory",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7537,7 +7525,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_directory(PyObject *SWIG
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg6, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg6, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7576,7 +7564,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_change_dir_prop(PyObject *SWI
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_delta_editor_invoke_change_dir_prop",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7659,7 +7647,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_close_directory(PyObject *SWI
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_delta_editor_invoke_close_directory",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7730,7 +7718,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_absent_directory(PyObject *SW
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_delta_editor_invoke_absent_directory",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7807,7 +7795,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_add_file(PyObject *SWIGUNUSED
arg7 = &temp7;
if (!PyArg_ParseTuple(args,(char *)"OsOzO|O:svn_delta_editor_invoke_add_file",&obj0,&arg2,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7854,7 +7842,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_add_file(PyObject *SWIGUNUSED
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7895,7 +7883,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_file(PyObject *SWIGUNUSE
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_delta_editor_invoke_open_file",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7942,7 +7930,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_open_file(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg6, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg6, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7992,7 +7980,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_apply_textdelta(PyObject *SWI
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OOz|O:svn_delta_editor_invoke_apply_textdelta",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8033,13 +8021,13 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_apply_textdelta(PyObject *SWI
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg5, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg5, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg6, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg6, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8078,7 +8066,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_change_file_prop(PyObject *SW
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_delta_editor_invoke_change_file_prop",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8162,7 +8150,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_close_file(PyObject *SWIGUNUS
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOz|O:svn_delta_editor_invoke_close_file",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8233,7 +8221,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_absent_file(PyObject *SWIGUNU
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_delta_editor_invoke_absent_file",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8303,7 +8291,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_close_edit(PyObject *SWIGUNUS
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_delta_editor_invoke_close_edit",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8373,7 +8361,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_editor_invoke_abort_edit(PyObject *SWIGUNUS
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_delta_editor_invoke_abort_edit",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
+ arg1 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8438,14 +8426,14 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_invoke_window_handler(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_txdelta_invoke_window_handler",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_txdelta_window_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg2 = (svn_txdelta_window_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj1);
+ arg2 = (svn_txdelta_window_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_txdelta_window_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8505,7 +8493,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_invoke_next_window_fn(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_txdelta_invoke_next_window_fn",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_txdelta_next_window_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_txdelta_window_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_txdelta_window_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8547,7 +8535,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_invoke_next_window_fn(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_txdelta_window_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_txdelta_window_t,
_global_py_pool, args))
;
@@ -8575,7 +8563,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_invoke_md5_digest_fn(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_txdelta_invoke_md5_digest_fn",&obj0,&obj1)) SWIG_fail;
{
svn_txdelta_md5_digest_fn_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void__p_unsigned_char, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void__p_unsigned_char, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8597,7 +8585,7 @@ SWIGINTERN PyObject *_wrap_svn_txdelta_invoke_md5_digest_fn(PyObject *SWIGUNUSED
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_unsigned_char,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_unsigned_char,
_global_py_pool, args);
return resultobj;
fail:
@@ -8630,7 +8618,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_invoke_path_driver_cb_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOOs|O:svn_delta_invoke_path_driver_cb_func",&obj0,&obj1,&obj2,&arg5,&obj4)) SWIG_fail;
{
svn_delta_path_driver_cb_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_void_p_void_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_void_p_void_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8680,7 +8668,7 @@ SWIGINTERN PyObject *_wrap_svn_delta_invoke_path_driver_cb_func(PyObject *SWIGUN
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8739,7 +8727,7 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OOsOOOO|O:svn_file_invoke_rev_handler",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
svn_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8760,7 +8748,7 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8772,7 +8760,7 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg9 = (apr_array_header_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
+ arg9 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8805,13 +8793,13 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler(PyObject *SWIGUNUSEDPARM(
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg7, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg7, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg8, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg8, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8868,7 +8856,7 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler_old(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_file_invoke_rev_handler_old",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_file_rev_handler_old_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8889,13 +8877,13 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler_old(PyObject *SWIGUNUSEDP
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ arg8 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8928,13 +8916,13 @@ SWIGINTERN PyObject *_wrap_svn_file_invoke_rev_handler_old(PyObject *SWIGUNUSEDP
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9244,9 +9232,11 @@ static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "st
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -9341,9 +9331,11 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_config_t,
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -9438,9 +9430,11 @@ static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -9535,9 +9529,11 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_config_t,
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -9586,18 +9582,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -9607,17 +9603,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -9680,7 +9676,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
diff --git a/subversion/bindings/swig/python/svn_diff.c b/subversion/bindings/swig/python/svn_diff.c
index 044eef8..b22c66b 100644
--- a/subversion/bindings/swig/python/svn_diff.c
+++ b/subversion/bindings/swig/python/svn_diff.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2950,86 +2924,88 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_char swig_types[7]
#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[8]
#define SWIGTYPE_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[9]
-#define SWIGTYPE_p_f_p_void__void swig_types[10]
-#define SWIGTYPE_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_void_p_apr_off_t_p_apr_off_t_p_q_const__svn_diff_datasource_e_apr_size_t__p_svn_error_t swig_types[13]
-#define SWIGTYPE_p_f_p_void_p_void__void swig_types[14]
-#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[15]
-#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_int swig_types[17]
-#define SWIGTYPE_p_long swig_types[18]
-#define SWIGTYPE_p_p_char swig_types[19]
-#define SWIGTYPE_p_p_svn_diff_t swig_types[20]
-#define SWIGTYPE_p_p_svn_patch_file_t swig_types[21]
-#define SWIGTYPE_p_p_svn_patch_t swig_types[22]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[23]
-#define SWIGTYPE_p_p_void swig_types[24]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[25]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[26]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[27]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[28]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[29]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[30]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[31]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[32]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[33]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[34]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[35]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[36]
-#define SWIGTYPE_p_svn_checksum_t swig_types[37]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[38]
-#define SWIGTYPE_p_svn_config_t swig_types[39]
-#define SWIGTYPE_p_svn_depth_t swig_types[40]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[41]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[42]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[43]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[44]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[45]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[46]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[47]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[48]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[49]
-#define SWIGTYPE_p_svn_diff_t swig_types[50]
-#define SWIGTYPE_p_svn_dirent_t swig_types[51]
-#define SWIGTYPE_p_svn_errno_t swig_types[52]
-#define SWIGTYPE_p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[54]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[55]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[56]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[57]
-#define SWIGTYPE_p_svn_lock_t swig_types[58]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[59]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[60]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[61]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[62]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[63]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[64]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[65]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[66]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[67]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[68]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[69]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[70]
-#define SWIGTYPE_p_svn_patch_t swig_types[71]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[72]
-#define SWIGTYPE_p_svn_prop_kind swig_types[73]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[74]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[75]
-#define SWIGTYPE_p_svn_stream_t swig_types[76]
-#define SWIGTYPE_p_svn_string_t swig_types[77]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[78]
-#define SWIGTYPE_p_svn_tristate_t swig_types[79]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[80]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[81]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[82]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[83]
-#define SWIGTYPE_p_svn_version_t swig_types[84]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[85]
-#define SWIGTYPE_p_unsigned_long swig_types[86]
-#define SWIGTYPE_p_void swig_types[87]
-static swig_type_info *swig_types[89];
-static swig_module_info swig_module = {swig_types, 88, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[10]
+#define SWIGTYPE_p_f_p_void__void swig_types[11]
+#define SWIGTYPE_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t swig_types[13]
+#define SWIGTYPE_p_f_p_void_p_apr_off_t_p_apr_off_t_p_q_const__svn_diff_datasource_e_apr_size_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[15]
+#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_int swig_types[18]
+#define SWIGTYPE_p_long swig_types[19]
+#define SWIGTYPE_p_p_char swig_types[20]
+#define SWIGTYPE_p_p_svn_diff_t swig_types[21]
+#define SWIGTYPE_p_p_svn_patch_file_t swig_types[22]
+#define SWIGTYPE_p_p_svn_patch_t swig_types[23]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[24]
+#define SWIGTYPE_p_p_void swig_types[25]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[26]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[27]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[28]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[29]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[30]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[31]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[32]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[33]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[34]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[35]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[36]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[37]
+#define SWIGTYPE_p_svn_checksum_t swig_types[38]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[39]
+#define SWIGTYPE_p_svn_config_t swig_types[40]
+#define SWIGTYPE_p_svn_depth_t swig_types[41]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[42]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[43]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[44]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[45]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[46]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[47]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[48]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[49]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[50]
+#define SWIGTYPE_p_svn_diff_t swig_types[51]
+#define SWIGTYPE_p_svn_dirent_t swig_types[52]
+#define SWIGTYPE_p_svn_errno_t swig_types[53]
+#define SWIGTYPE_p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[55]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[56]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[57]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[58]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[59]
+#define SWIGTYPE_p_svn_lock_t swig_types[60]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[61]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[62]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[63]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[64]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[65]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[66]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[67]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[68]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[69]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[70]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[71]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[72]
+#define SWIGTYPE_p_svn_patch_t swig_types[73]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[74]
+#define SWIGTYPE_p_svn_prop_kind swig_types[75]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[76]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[77]
+#define SWIGTYPE_p_svn_stream_t swig_types[78]
+#define SWIGTYPE_p_svn_string_t swig_types[79]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[80]
+#define SWIGTYPE_p_svn_tristate_t swig_types[81]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[82]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[83]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[84]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[85]
+#define SWIGTYPE_p_svn_version_t swig_types[86]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[87]
+#define SWIGTYPE_p_unsigned_long swig_types[88]
+#define SWIGTYPE_p_void swig_types[89]
+static swig_type_info *swig_types[91];
+static swig_module_info swig_module = {swig_types, 90, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3053,7 +3029,7 @@ static swig_module_info swig_module = {swig_types, 88, 0, 0, 0, 0};
#endif
#define SWIG_name "_diff"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3497,6 +3473,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3554,7 +3542,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_version(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3571,7 +3559,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasources_open_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_datasources_open_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3598,7 +3586,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasources_open_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_datasources_open_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3620,7 +3608,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasource_close_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_datasource_close_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3647,7 +3635,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasource_close_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_datasource_close_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3669,7 +3657,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasource_get_next_token_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_datasource_get_next_token_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3696,7 +3684,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_datasource_get_next_token_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_datasource_get_next_token_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3718,7 +3706,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_compare_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_token_compare_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3745,7 +3733,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_compare_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_token_compare_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3767,7 +3755,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_discard_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_token_discard_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3794,7 +3782,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_discard_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_token_discard_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3816,7 +3804,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_discard_all_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_t_token_discard_all_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3843,7 +3831,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_t_token_discard_all_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns2_t_token_discard_all_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3869,7 +3857,7 @@ SWIGINTERN PyObject *_wrap_new_svn_diff_fns2_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_diff_fns2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_diff_fns2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3884,7 +3872,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_diff_fns2_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_diff_fns2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3920,7 +3908,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_open_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_datasource_open_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3947,7 +3935,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_open_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_datasource_open_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3969,7 +3957,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_close_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_datasource_close_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3996,7 +3984,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_close_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_datasource_close_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4018,7 +4006,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_get_next_token_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_datasource_get_next_token_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4045,7 +4033,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_datasource_get_next_token_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_datasource_get_next_token_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4067,7 +4055,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_compare_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_token_compare_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4094,7 +4082,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_compare_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_token_compare_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4116,7 +4104,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_discard_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_token_discard_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4143,7 +4131,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_discard_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_token_discard_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4165,7 +4153,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_discard_all_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_t_token_discard_all_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4192,7 +4180,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_t_token_discard_all_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_fns_t_token_discard_all_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4218,7 +4206,7 @@ SWIGINTERN PyObject *_wrap_new_svn_diff_fns_t(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_diff_fns_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_diff_fns_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4233,7 +4221,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_diff_fns_t(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_diff_fns_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4289,7 +4277,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff_2(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg3 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4322,7 +4310,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff_2(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4368,7 +4356,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg3 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4401,7 +4389,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff(PyObject *SWIGUNUSEDPARM(self), PyObjec
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4447,7 +4435,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff3_2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg3 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4480,7 +4468,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff3_2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4526,7 +4514,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff3(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg3 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4559,7 +4547,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff3(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4605,7 +4593,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff4_2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg3 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4638,7 +4626,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff4_2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4684,7 +4672,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff4(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg3 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
+ arg3 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4717,7 +4705,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_diff4(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -4742,7 +4730,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_contains_conflicts(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_contains_conflicts",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
+ arg1 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4770,7 +4758,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_contains_diffs(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_contains_diffs",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
+ arg1 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4799,7 +4787,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_common_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_output_fns_t_output_common_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4826,7 +4814,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_common_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_output_fns_t_output_common_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4848,7 +4836,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_modified_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_output_fns_t_output_diff_modified_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4875,7 +4863,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_modified_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_output_fns_t_output_diff_modified_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4897,7 +4885,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_latest_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_output_fns_t_output_diff_latest_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4924,7 +4912,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_latest_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_output_fns_t_output_diff_latest_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4946,7 +4934,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_common_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_output_fns_t_output_diff_common_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4973,7 +4961,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_diff_common_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_output_fns_t_output_diff_common_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4995,7 +4983,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_conflict_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_output_fns_t_output_conflict_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5022,7 +5010,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_t_output_conflict_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_output_fns_t_output_conflict_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5048,7 +5036,7 @@ SWIGINTERN PyObject *_wrap_new_svn_diff_output_fns_t(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_diff_output_fns_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_diff_output_fns_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5063,7 +5051,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_diff_output_fns_t(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_diff_output_fns_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5090,6 +5078,69 @@ SWIGINTERN PyObject *svn_diff_output_fns_t_swigregister(PyObject *SWIGUNUSEDPARM
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *_wrap_svn_diff_output2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_diff_t *arg1 = (svn_diff_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_diff_output_fns_t *arg3 = (svn_diff_output_fns_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OOOO:svn_diff_output2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ arg1 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg3 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_output2(arg1,arg2,(struct svn_diff_output_fns_t const *)arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_output(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_diff_t *arg1 = (svn_diff_t *) 0 ;
@@ -5102,7 +5153,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output(PyObject *SWIGUNUSEDPARM(self), PyObj
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_output",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
+ arg1 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5116,7 +5167,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg3 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj2);
+ arg3 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5155,7 +5206,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_ignore_space_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_file_options_t_ignore_space_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5182,7 +5233,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_ignore_space_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_file_options_t_ignore_space_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5204,7 +5255,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_ignore_eol_style_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_file_options_t_ignore_eol_style_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5231,7 +5282,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_ignore_eol_style_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_file_options_t_ignore_eol_style_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5253,7 +5304,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_show_c_function_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_file_options_t_show_c_function_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5280,7 +5331,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_show_c_function_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_file_options_t_show_c_function_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5293,6 +5344,55 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_context_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ int arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_file_options_t_context_size_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (int)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->context_size = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_diff_file_options_t_context_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ int result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_file_options_t_context_size_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (int) ((arg1)->context_size);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_new_svn_diff_file_options_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_diff_file_options_t *result = 0 ;
@@ -5306,7 +5406,7 @@ SWIGINTERN PyObject *_wrap_new_svn_diff_file_options_t(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_diff_file_options_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_diff_file_options_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5321,7 +5421,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_diff_file_options_t(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_diff_file_options_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (struct svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5377,7 +5477,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_create(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_diff_file_options_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_diff_file_options_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5409,7 +5509,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_options_parse(PyObject *SWIGUNUSEDPARM(
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_diff_file_options_parse",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
+ arg1 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5483,7 +5583,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff_2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssO|O:svn_diff_file_diff_2",&arg2,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg4 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj2);
+ arg4 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5516,7 +5616,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff_2(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5579,7 +5679,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff(PyObject *SWIGUNUSEDPARM(self), Py
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5618,7 +5718,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff3_2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sssO|O:svn_diff_file_diff3_2",&arg2,&arg3,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg5 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj3);
+ arg5 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5651,7 +5751,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff3_2(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5715,7 +5815,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff3(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5755,7 +5855,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff4_2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssssO|O:svn_diff_file_diff4_2",&arg2,&arg3,&arg4,&arg5,&obj4,&obj5)) SWIG_fail;
{
- arg6 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
+ arg6 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5788,7 +5888,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff4_2(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5853,7 +5953,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_diff4(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -5870,6 +5970,100 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_file_output_unified4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ svn_boolean_t arg9 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOsszzzzOOO|O:svn_diff_file_output_unified4",&obj0,&obj1,&arg3,&arg4,&arg5,&arg6,&arg7,&arg8,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg9 = (svn_boolean_t)SWIG_As_long (obj8);
+ if (SWIG_arg_fail(svn_argnum_obj8)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (int)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj10;
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_file_output_unified4(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_file_output_unified3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -5899,7 +6093,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_output_unified3(PyObject *SWIGUNUSEDPAR
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5975,7 +6169,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_output_unified2(PyObject *SWIGUNUSEDPAR
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6044,7 +6238,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_output_unified(PyObject *SWIGUNUSEDPARM
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6088,6 +6282,93 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_file_output_merge3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOssszzzzOO|O:svn_diff_file_output_merge3",&obj0,&obj1,&arg3,&arg4,&arg5,&arg6,&arg7,&arg8,&arg9,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (svn_diff_conflict_display_style_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj10;
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_file_output_merge3(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_file_output_merge2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -6118,7 +6399,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_output_merge2(PyObject *SWIGUNUSEDPARM(
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6200,7 +6481,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_file_output_merge(PyObject *SWIGUNUSEDPARM(s
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6256,6 +6537,80 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_output_binary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg3 = (svn_stream_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_diff_output_binary",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg2 = svn_swig_py_make_stream (obj1, _global_pool);
+ }
+ {
+ arg3 = svn_swig_py_make_stream (obj2, _global_pool);
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_output_binary(arg1,arg2,arg3,arg4,arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_diff_t **arg1 = (svn_diff_t **) 0 ;
@@ -6307,7 +6662,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg4 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj2);
+ arg4 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6340,7 +6695,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -6424,7 +6779,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff3(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg5 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj3);
+ arg5 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6457,7 +6812,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff3(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -6557,7 +6912,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg6 = (svn_diff_file_options_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
+ arg6 = (svn_diff_file_options_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_file_options_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6590,7 +6945,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_diff4(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_diff_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_diff_t,
_global_py_pool, args))
;
@@ -6607,6 +6962,130 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_unified3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_boolean_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ svn_string_t *arg8 = (svn_string_t *) 0 ;
+ svn_string_t *arg9 = (svn_string_t *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_string_t value8 ;
+ svn_string_t value9 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOszzzOOOO|O:svn_diff_mem_string_output_unified3",&obj0,&obj1,&obj2,&arg4,&arg5,&arg6,&arg7,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (obj7 == Py_None)
+ arg8 = NULL;
+ else {
+ if (!PyString_Check(obj7)) {
+ PyErr_SetString(PyExc_TypeError, "not a string");
+ SWIG_fail;
+ }
+ value8.data = PyString_AS_STRING(obj7);
+ value8.len = PyString_GET_SIZE(obj7);
+ arg8 = &value8;
+ }
+ }
+ {
+ if (obj8 == Py_None)
+ arg9 = NULL;
+ else {
+ if (!PyString_Check(obj8)) {
+ PyErr_SetString(PyExc_TypeError, "not a string");
+ SWIG_fail;
+ }
+ value9.data = PyString_AS_STRING(obj8);
+ value9.len = PyString_GET_SIZE(obj8);
+ arg9 = &value9;
+ }
+ }
+ {
+ arg10 = (int)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj10;
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_mem_string_output_unified3(arg1,arg2,arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(struct svn_string_t const *)arg8,(struct svn_string_t const *)arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_unified2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -6640,7 +7119,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_unified2(PyObject *SWIGUNU
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6746,7 +7225,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_unified(PyObject *SWIGUNUS
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6816,6 +7295,138 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_merge3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_string_t *arg3 = (svn_string_t *) 0 ;
+ svn_string_t *arg4 = (svn_string_t *) 0 ;
+ svn_string_t *arg5 = (svn_string_t *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_string_t value3 ;
+ svn_string_t value4 ;
+ svn_string_t value5 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOzzzzOO|O:svn_diff_mem_string_output_merge3",&obj0,&obj1,&obj2,&obj3,&obj4,&arg6,&arg7,&arg8,&arg9,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = svn_swig_py_make_stream (obj0, _global_pool);
+ }
+ {
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (obj2 == Py_None)
+ arg3 = NULL;
+ else {
+ if (!PyString_Check(obj2)) {
+ PyErr_SetString(PyExc_TypeError, "not a string");
+ SWIG_fail;
+ }
+ value3.data = PyString_AS_STRING(obj2);
+ value3.len = PyString_GET_SIZE(obj2);
+ arg3 = &value3;
+ }
+ }
+ {
+ if (obj3 == Py_None)
+ arg4 = NULL;
+ else {
+ if (!PyString_Check(obj3)) {
+ PyErr_SetString(PyExc_TypeError, "not a string");
+ SWIG_fail;
+ }
+ value4.data = PyString_AS_STRING(obj3);
+ value4.len = PyString_GET_SIZE(obj3);
+ arg4 = &value4;
+ }
+ }
+ {
+ if (obj4 == Py_None)
+ arg5 = NULL;
+ else {
+ if (!PyString_Check(obj4)) {
+ PyErr_SetString(PyExc_TypeError, "not a string");
+ SWIG_fail;
+ }
+ value5.data = PyString_AS_STRING(obj4);
+ value5.len = PyString_GET_SIZE(obj4);
+ arg5 = &value5;
+ }
+ }
+ {
+ arg10 = (svn_diff_conflict_display_style_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj10;
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_diff_mem_string_output_merge3(arg1,arg2,(struct svn_string_t const *)arg3,(struct svn_string_t const *)arg4,(struct svn_string_t const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_merge2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
@@ -6852,7 +7463,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_merge2(PyObject *SWIGUNUSE
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6979,7 +7590,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_mem_string_output_merge(PyObject *SWIGUNUSED
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_diff_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
+ arg2 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_diff_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7106,7 +7717,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_readline_diff_text(PyObject *SWIGUNUSED
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_diff_hunk_readline_diff_text",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7228,7 +7839,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_readline_original_text(PyObject *SWIGUN
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_diff_hunk_readline_original_text",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7350,7 +7961,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_readline_modified_text(PyObject *SWIGUN
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_diff_hunk_readline_modified_text",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7447,7 +8058,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_reset_diff_text(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_reset_diff_text",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7474,7 +8085,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_reset_original_text(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_reset_original_text",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7501,7 +8112,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_reset_modified_text(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_reset_modified_text",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7529,7 +8140,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_original_start(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_original_start",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7557,7 +8168,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_original_length(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_original_length",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7585,7 +8196,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_modified_start(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_modified_start",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7613,7 +8224,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_modified_length(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_modified_length",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7641,7 +8252,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_leading_context(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_leading_context",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7669,7 +8280,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_hunk_get_trailing_context(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_diff_hunk_get_trailing_context",&obj0)) SWIG_fail;
{
- arg1 = (svn_diff_hunk_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
+ arg1 = (svn_diff_hunk_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_hunk_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7697,7 +8308,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_name_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"Os:svn_prop_patch_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7725,7 +8336,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_name_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_prop_patch_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7747,7 +8358,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_operation_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_prop_patch_t_operation_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7774,7 +8385,7 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_operation_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_prop_patch_t_operation_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7796,13 +8407,13 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_hunks_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_prop_patch_t_hunks_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7823,14 +8434,21 @@ SWIGINTERN PyObject *_wrap_svn_prop_patch_t_hunks_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_prop_patch_t_hunks_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->hunks);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
- _global_py_pool, args);
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_pointerlist_to_list(result, SWIGTYPE_p_svn_diff_hunk_t,
+ _global_py_pool))
+
+ ;
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
return resultobj;
fail:
return NULL;
@@ -7850,7 +8468,7 @@ SWIGINTERN PyObject *_wrap_new_svn_prop_patch_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_prop_patch_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_prop_patch_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7865,7 +8483,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_prop_patch_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_prop_patch_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_prop_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_prop_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_prop_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7900,7 +8518,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_old_filename_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"Os:svn_patch_t_old_filename_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7928,7 +8546,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_old_filename_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_old_filename_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7949,7 +8567,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_new_filename_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"Os:svn_patch_t_new_filename_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7977,7 +8595,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_new_filename_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_new_filename_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7999,13 +8617,13 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_hunks_set(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_hunks_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8026,14 +8644,21 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_hunks_get(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_hunks_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->hunks);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
- _global_py_pool, args);
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_pointerlist_to_list(result, SWIGTYPE_p_svn_diff_hunk_t,
+ _global_py_pool))
+
+ ;
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
return resultobj;
fail:
return NULL;
@@ -8049,13 +8674,13 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_prop_patches_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_prop_patches_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8076,13 +8701,13 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_prop_patches_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_prop_patches_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_hash_t *) ((arg1)->prop_patches);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8099,7 +8724,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_operation_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_operation_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8126,7 +8751,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_operation_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_operation_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8148,7 +8773,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_reverse_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_reverse_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8175,7 +8800,7 @@ SWIGINTERN PyObject *_wrap_svn_patch_t_reverse_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_reverse_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8188,6 +8813,115 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_patch_t_mergeinfo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_mergeinfo_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
+ arg2 = svn_swig_py_mergeinfo_from_dict(obj1, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->mergeinfo = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_patch_t_mergeinfo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_mergeinfo_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_mergeinfo_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_mergeinfo_t) ((arg1)->mergeinfo);
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ _global_py_pool, args);
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_patch_t_reverse_mergeinfo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_patch_t_reverse_mergeinfo_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_mergeinfo_t)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->reverse_mergeinfo = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_patch_t_reverse_mergeinfo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_mergeinfo_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_patch_t_reverse_mergeinfo_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_mergeinfo_t) ((arg1)->reverse_mergeinfo);
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ _global_py_pool, args);
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_new_svn_patch_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_patch_t *result = 0 ;
@@ -8201,7 +8935,7 @@ SWIGINTERN PyObject *_wrap_new_svn_patch_t(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_patch_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_patch_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8216,7 +8950,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_patch_t(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_patch_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_patch_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
+ arg1 = (struct svn_patch_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8288,7 +9022,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_open_patch_file(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_patch_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_patch_file_t,
_global_py_pool, args))
;
@@ -8334,7 +9068,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_parse_next_patch(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_diff_parse_next_patch",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_patch_file_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_file_t, svn_argnum_obj0);
+ arg2 = (svn_patch_file_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_file_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8387,7 +9121,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_parse_next_patch(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_patch_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_patch_t,
_global_py_pool, args))
;
@@ -8426,7 +9160,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_close_patch_file(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_diff_close_patch_file",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_patch_file_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_patch_file_t, svn_argnum_obj0);
+ arg1 = (svn_patch_file_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_patch_file_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8509,7 +9243,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_datasources_open(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OOOOOO:svn_diff_fns2_invoke_datasources_open",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8523,19 +9257,19 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_datasources_open(PyObject *SWIGU
}
}
{
- arg3 = (apr_off_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_apr_off_t, svn_argnum_obj2);
+ arg3 = (apr_off_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_apr_off_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (apr_off_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_off_t, svn_argnum_obj3);
+ arg4 = (apr_off_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_off_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_diff_datasource_e *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_diff_datasource_e, svn_argnum_obj4);
+ arg5 = (svn_diff_datasource_e *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_diff_datasource_e, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8583,7 +9317,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_datasource_close(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns2_invoke_datasource_close",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8646,7 +9380,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_datasource_get_next_token(PyObje
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns2_invoke_datasource_get_next_token",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8691,7 +9425,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_datasource_get_next_token(PyObje
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_apr_uint32_t, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8720,7 +9454,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_token_compare(PyObject *SWIGUNUS
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOO:svn_diff_fns2_invoke_token_compare",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8734,13 +9468,13 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_token_compare(PyObject *SWIGUNUS
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (void *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_void, svn_argnum_obj3);
+ arg4 = (void *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_void, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8787,7 +9521,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_token_discard(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns2_invoke_token_discard",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8801,7 +9535,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_token_discard(PyObject *SWIGUNUS
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8830,7 +9564,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns2_invoke_token_discard_all(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns2_invoke_token_discard_all",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_diff_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8870,7 +9604,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_datasource_open(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns_invoke_datasource_open",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8926,7 +9660,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_datasource_close(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns_invoke_datasource_close",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8989,7 +9723,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_datasource_get_next_token(PyObjec
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns_invoke_datasource_get_next_token",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9034,7 +9768,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_datasource_get_next_token(PyObjec
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_apr_uint32_t, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9063,7 +9797,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_token_compare(PyObject *SWIGUNUSE
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOO:svn_diff_fns_invoke_token_compare",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9077,13 +9811,13 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_token_compare(PyObject *SWIGUNUSE
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (void *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_void, svn_argnum_obj3);
+ arg4 = (void *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_void, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9130,7 +9864,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_token_discard(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_diff_fns_invoke_token_discard",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9144,7 +9878,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_token_discard(PyObject *SWIGUNUSE
}
}
{
- arg3 = (void *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
+ arg3 = (void *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_void, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9173,7 +9907,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_fns_invoke_token_discard_all(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_diff_fns_invoke_token_discard_all",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_diff_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9223,7 +9957,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_common(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:svn_diff_output_fns_invoke_output_common",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9289,7 +10023,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_diff_modified(PyObj
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:svn_diff_output_fns_invoke_output_diff_modified",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9355,7 +10089,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_diff_latest(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:svn_diff_output_fns_invoke_output_diff_latest",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9421,7 +10155,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_diff_common(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:svn_diff_output_fns_invoke_output_diff_common",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9489,7 +10223,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_conflict(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:svn_diff_output_fns_invoke_output_conflict",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_diff_output_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
+ arg1 = (svn_diff_output_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_diff_output_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9509,7 +10243,7 @@ SWIGINTERN PyObject *_wrap_svn_diff_output_fns_invoke_output_conflict(PyObject *
arg7 = (apr_off_t) PyLong_AsLongLong(obj6);
arg8 = (apr_off_t) PyLong_AsLongLong(obj7);
{
- arg9 = (svn_diff_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_diff_t, svn_argnum_obj8);
+ arg9 = (svn_diff_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_diff_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9593,6 +10327,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"new_svn_diff_output_fns_t", _wrap_new_svn_diff_output_fns_t, METH_VARARGS, (char *)"new_svn_diff_output_fns_t() -> svn_diff_output_fns_t"},
{ (char *)"delete_svn_diff_output_fns_t", _wrap_delete_svn_diff_output_fns_t, METH_VARARGS, (char *)"delete_svn_diff_output_fns_t(svn_diff_output_fns_t self)"},
{ (char *)"svn_diff_output_fns_t_swigregister", svn_diff_output_fns_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_diff_output2", _wrap_svn_diff_output2, METH_VARARGS, (char *)"svn_diff_output2(svn_diff_t * diff, void * output_baton, svn_diff_output_fns_t output_fns, svn_cancel_func_t cancel_func) -> svn_error_t"},
{ (char *)"svn_diff_output", _wrap_svn_diff_output, METH_VARARGS, (char *)"svn_diff_output(svn_diff_t * diff, void * output_baton, svn_diff_output_fns_t output_fns) -> svn_error_t"},
{ (char *)"svn_diff_file_options_t_ignore_space_set", _wrap_svn_diff_file_options_t_ignore_space_set, METH_VARARGS, (char *)"svn_diff_file_options_t_ignore_space_set(svn_diff_file_options_t self, svn_diff_file_ignore_space_t ignore_space)"},
{ (char *)"svn_diff_file_options_t_ignore_space_get", _wrap_svn_diff_file_options_t_ignore_space_get, METH_VARARGS, (char *)"svn_diff_file_options_t_ignore_space_get(svn_diff_file_options_t self) -> svn_diff_file_ignore_space_t"},
@@ -9600,6 +10335,8 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_diff_file_options_t_ignore_eol_style_get", _wrap_svn_diff_file_options_t_ignore_eol_style_get, METH_VARARGS, (char *)"svn_diff_file_options_t_ignore_eol_style_get(svn_diff_file_options_t self) -> svn_boolean_t"},
{ (char *)"svn_diff_file_options_t_show_c_function_set", _wrap_svn_diff_file_options_t_show_c_function_set, METH_VARARGS, (char *)"svn_diff_file_options_t_show_c_function_set(svn_diff_file_options_t self, svn_boolean_t show_c_function)"},
{ (char *)"svn_diff_file_options_t_show_c_function_get", _wrap_svn_diff_file_options_t_show_c_function_get, METH_VARARGS, (char *)"svn_diff_file_options_t_show_c_function_get(svn_diff_file_options_t self) -> svn_boolean_t"},
+ { (char *)"svn_diff_file_options_t_context_size_set", _wrap_svn_diff_file_options_t_context_size_set, METH_VARARGS, (char *)"svn_diff_file_options_t_context_size_set(svn_diff_file_options_t self, int context_size)"},
+ { (char *)"svn_diff_file_options_t_context_size_get", _wrap_svn_diff_file_options_t_context_size_get, METH_VARARGS, (char *)"svn_diff_file_options_t_context_size_get(svn_diff_file_options_t self) -> int"},
{ (char *)"new_svn_diff_file_options_t", _wrap_new_svn_diff_file_options_t, METH_VARARGS, (char *)"new_svn_diff_file_options_t() -> svn_diff_file_options_t"},
{ (char *)"delete_svn_diff_file_options_t", _wrap_delete_svn_diff_file_options_t, METH_VARARGS, (char *)"delete_svn_diff_file_options_t(svn_diff_file_options_t self)"},
{ (char *)"svn_diff_file_options_t_swigregister", svn_diff_file_options_t_swigregister, METH_VARARGS, NULL},
@@ -9620,6 +10357,12 @@ static PyMethodDef SwigMethods[] = {
"svn_diff_file_diff4(char const * original, char const * modified, char const * latest, char const * ancestor, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_diff_file_output_unified4", _wrap_svn_diff_file_output_unified4, METH_VARARGS, (char *)"\n"
+ "svn_diff_file_output_unified4(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path, \n"
+ " char const * original_header, char const * modified_header, \n"
+ " char const * header_encoding, char const * relative_to_dir, svn_boolean_t show_c_function, \n"
+ " int context_size, svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_diff_file_output_unified3", _wrap_svn_diff_file_output_unified3, METH_VARARGS, (char *)"\n"
"svn_diff_file_output_unified3(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path, \n"
" char const * original_header, char const * modified_header, \n"
@@ -9636,6 +10379,13 @@ static PyMethodDef SwigMethods[] = {
" char const * original_header, char const * modified_header, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_diff_file_output_merge3", _wrap_svn_diff_file_output_merge3, METH_VARARGS, (char *)"\n"
+ "svn_diff_file_output_merge3(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path, \n"
+ " char const * latest_path, char const * conflict_original, \n"
+ " char const * conflict_modified, char const * conflict_latest, char const * conflict_separator, \n"
+ " svn_diff_conflict_display_style_t conflict_style, \n"
+ " svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_diff_file_output_merge2", _wrap_svn_diff_file_output_merge2, METH_VARARGS, (char *)"\n"
"svn_diff_file_output_merge2(svn_stream_t * output_stream, svn_diff_t * diff, char const * original_path, char const * modified_path, \n"
" char const * latest_path, char const * conflict_original, \n"
@@ -9650,6 +10400,10 @@ static PyMethodDef SwigMethods[] = {
" svn_boolean_t display_original_in_conflict, svn_boolean_t display_resolved_conflicts, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_diff_output_binary", _wrap_svn_diff_output_binary, METH_VARARGS, (char *)"\n"
+ "svn_diff_output_binary(svn_stream_t * output_stream, svn_stream_t * original, svn_stream_t * latest, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_diff_mem_string_diff", _wrap_svn_diff_mem_string_diff, METH_VARARGS, (char *)"\n"
"svn_diff_mem_string_diff(svn_string_t const * original, svn_string_t const * modified, svn_diff_file_options_t options, \n"
" apr_pool_t pool) -> svn_error_t\n"
@@ -9662,6 +10416,13 @@ static PyMethodDef SwigMethods[] = {
"svn_diff_mem_string_diff4(svn_string_t const * original, svn_string_t const * modified, svn_string_t const * latest, \n"
" svn_string_t const * ancestor, svn_diff_file_options_t options, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_diff_mem_string_output_unified3", _wrap_svn_diff_mem_string_output_unified3, METH_VARARGS, (char *)"\n"
+ "svn_diff_mem_string_output_unified3(svn_stream_t * output_stream, svn_diff_t * diff, svn_boolean_t with_diff_header, \n"
+ " char const * hunk_delimiter, char const * original_header, char const * modified_header, \n"
+ " char const * header_encoding, svn_string_t const * original, \n"
+ " svn_string_t const * modified, int context_size, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_diff_mem_string_output_unified2", _wrap_svn_diff_mem_string_output_unified2, METH_VARARGS, (char *)"\n"
"svn_diff_mem_string_output_unified2(svn_stream_t * output_stream, svn_diff_t * diff, svn_boolean_t with_diff_header, \n"
" char const * hunk_delimiter, char const * original_header, char const * modified_header, \n"
@@ -9673,6 +10434,13 @@ static PyMethodDef SwigMethods[] = {
" char const * header_encoding, svn_string_t const * original, \n"
" svn_string_t const * modified, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_diff_mem_string_output_merge3", _wrap_svn_diff_mem_string_output_merge3, METH_VARARGS, (char *)"\n"
+ "svn_diff_mem_string_output_merge3(svn_stream_t * output_stream, svn_diff_t * diff, svn_string_t const * original, svn_string_t const * modified, \n"
+ " svn_string_t const * latest, char const * conflict_original, \n"
+ " char const * conflict_modified, char const * conflict_latest, \n"
+ " char const * conflict_separator, svn_diff_conflict_display_style_t style, \n"
+ " svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_diff_mem_string_output_merge2", _wrap_svn_diff_mem_string_output_merge2, METH_VARARGS, (char *)"\n"
"svn_diff_mem_string_output_merge2(svn_stream_t * output_stream, svn_diff_t * diff, svn_string_t const * original, svn_string_t const * modified, \n"
" svn_string_t const * latest, char const * conflict_original, \n"
@@ -9720,6 +10488,10 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_patch_t_operation_get", _wrap_svn_patch_t_operation_get, METH_VARARGS, (char *)"svn_patch_t_operation_get(svn_patch_t self) -> svn_diff_operation_kind_t"},
{ (char *)"svn_patch_t_reverse_set", _wrap_svn_patch_t_reverse_set, METH_VARARGS, (char *)"svn_patch_t_reverse_set(svn_patch_t self, svn_boolean_t reverse)"},
{ (char *)"svn_patch_t_reverse_get", _wrap_svn_patch_t_reverse_get, METH_VARARGS, (char *)"svn_patch_t_reverse_get(svn_patch_t self) -> svn_boolean_t"},
+ { (char *)"svn_patch_t_mergeinfo_set", _wrap_svn_patch_t_mergeinfo_set, METH_VARARGS, (char *)"svn_patch_t_mergeinfo_set(svn_patch_t self, apr_hash_t mergeinfo)"},
+ { (char *)"svn_patch_t_mergeinfo_get", _wrap_svn_patch_t_mergeinfo_get, METH_VARARGS, (char *)"svn_patch_t_mergeinfo_get(svn_patch_t self) -> apr_hash_t"},
+ { (char *)"svn_patch_t_reverse_mergeinfo_set", _wrap_svn_patch_t_reverse_mergeinfo_set, METH_VARARGS, (char *)"svn_patch_t_reverse_mergeinfo_set(svn_patch_t self, apr_hash_t reverse_mergeinfo)"},
+ { (char *)"svn_patch_t_reverse_mergeinfo_get", _wrap_svn_patch_t_reverse_mergeinfo_get, METH_VARARGS, (char *)"svn_patch_t_reverse_mergeinfo_get(svn_patch_t self) -> apr_hash_t"},
{ (char *)"new_svn_patch_t", _wrap_new_svn_patch_t, METH_VARARGS, (char *)"new_svn_patch_t() -> svn_patch_t"},
{ (char *)"delete_svn_patch_t", _wrap_delete_svn_patch_t, METH_VARARGS, (char *)"delete_svn_patch_t(svn_patch_t self)"},
{ (char *)"svn_patch_t_swigregister", svn_patch_t_swigregister, METH_VARARGS, NULL},
@@ -9779,7 +10551,7 @@ static PyMethodDef SwigMethods[] = {
/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
static swig_type_info _swigt__p_apr_array_header_t = {"_p_apr_array_header_t", "apr_array_header_t *|svn_rangelist_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "apr_hash_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "svn_mergeinfo_t|apr_hash_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_off_t = {"_p_apr_off_t", "apr_off_t *", 0, 0, (void*)0, 0};
@@ -9788,6 +10560,7 @@ static swig_type_info _swigt__p_apr_uint32_t = {"_p_apr_uint32_t", "apr_uint32_t
static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t = {"_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t", "struct svn_error_t *(*)(apr_uint32_t *,void **,void *,svn_diff_datasource_e)|svn_error_t *(*)(apr_uint32_t *,void **,void *,svn_diff_datasource_e)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_error_t", "svn_cancel_func_t|struct svn_error_t *(*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void__void = {"_p_f_p_void__void", "void (*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t = {"_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t)|svn_error_t *(*)(void *,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t = {"_p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,svn_diff_t *)|svn_error_t *(*)(void *,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,apr_off_t,svn_diff_t *)", 0, 0, (void*)0, 0};
@@ -9832,6 +10605,7 @@ static swig_type_info _swigt__p_svn_diff_t = {"_p_svn_diff_t", "struct svn_diff_
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -9878,6 +10652,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_char,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t,
+ &_swigt__p_f_p_void__p_svn_error_t,
&_swigt__p_f_p_void__void,
&_swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t,
&_swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t,
@@ -9922,6 +10697,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -9968,6 +10744,7 @@ static swig_cast_info _swigc__p_apr_uint32_t[] = { {&_swigt__p_apr_uint32_t, 0,
static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t[] = { {&_swigt__p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void__void[] = { {&_swigt__p_f_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -10012,6 +10789,7 @@ static swig_cast_info _swigc__p_svn_diff_t[] = { {&_swigt__p_svn_diff_t, 0, 0,
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -10058,6 +10836,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_char,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t,
+ _swigc__p_f_p_void__p_svn_error_t,
_swigc__p_f_p_void__void,
_swigc__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t__p_svn_error_t,
_swigc__p_f_p_void_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_apr_off_t_p_svn_diff_t__p_svn_error_t,
@@ -10102,6 +10881,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -10149,18 +10929,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -10170,17 +10950,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -10243,7 +11023,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
diff --git a/subversion/bindings/swig/python/svn_fs.c b/subversion/bindings/swig/python/svn_fs.c
index 1667fb0..3d1db1a 100644
--- a/subversion/bindings/swig/python/svn_fs.c
+++ b/subversion/bindings/swig/python/svn_fs.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2945,107 +2919,123 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_apr_int32_t swig_types[2]
#define SWIGTYPE_p_apr_int64_t swig_types[3]
#define SWIGTYPE_p_apr_pool_t swig_types[4]
-#define SWIGTYPE_p_char swig_types[5]
-#define SWIGTYPE_p_f_long_p_void_p_apr_pool_t__void swig_types[6]
-#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[7]
-#define SWIGTYPE_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[8]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[9]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[10]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[12]
-#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[13]
-#define SWIGTYPE_p_int swig_types[14]
-#define SWIGTYPE_p_long swig_types[15]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[16]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[17]
-#define SWIGTYPE_p_p_char swig_types[18]
-#define SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void swig_types[19]
-#define SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_p_f_p_void_p_struct_svn_error_t__void swig_types[24]
-#define SWIGTYPE_p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[26]
-#define SWIGTYPE_p_p_svn_fs_access_t swig_types[27]
-#define SWIGTYPE_p_p_svn_fs_history_t swig_types[28]
-#define SWIGTYPE_p_p_svn_fs_id_t swig_types[29]
-#define SWIGTYPE_p_p_svn_fs_root_t swig_types[30]
-#define SWIGTYPE_p_p_svn_fs_t swig_types[31]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[32]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[33]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[34]
-#define SWIGTYPE_p_p_svn_string_t swig_types[35]
-#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[36]
-#define SWIGTYPE_p_p_void swig_types[37]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[38]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[39]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[40]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[41]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[42]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[43]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[44]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[45]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[46]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[47]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[48]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[49]
-#define SWIGTYPE_p_svn_checksum_t swig_types[50]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[51]
-#define SWIGTYPE_p_svn_config_t swig_types[52]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[53]
-#define SWIGTYPE_p_svn_depth_t swig_types[54]
-#define SWIGTYPE_p_svn_dirent_t swig_types[55]
-#define SWIGTYPE_p_svn_errno_t swig_types[56]
-#define SWIGTYPE_p_svn_error_t swig_types[57]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[58]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[59]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[60]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[61]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[62]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[63]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[64]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[65]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[66]
-#define SWIGTYPE_p_svn_fs_t swig_types[67]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[68]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[69]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[70]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[71]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[72]
-#define SWIGTYPE_p_svn_lock_t swig_types[73]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[74]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[75]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[76]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[77]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[78]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[79]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[80]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[81]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[82]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[83]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[84]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[85]
-#define SWIGTYPE_p_svn_prop_kind swig_types[86]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[87]
-#define SWIGTYPE_p_svn_stream_t swig_types[88]
-#define SWIGTYPE_p_svn_string_t swig_types[89]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[90]
-#define SWIGTYPE_p_svn_tristate_t swig_types[91]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[92]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[93]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[94]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[95]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[96]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[97]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[98]
-#define SWIGTYPE_p_svn_version_t swig_types[99]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[100]
-#define SWIGTYPE_p_unsigned_char swig_types[101]
-#define SWIGTYPE_p_unsigned_long swig_types[102]
-#define SWIGTYPE_p_void swig_types[103]
-static swig_type_info *swig_types[105];
-static swig_module_info swig_module = {swig_types, 104, 0, 0, 0, 0};
+#define SWIGTYPE_p_apr_uint64_t swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_f_long_p_void_p_apr_pool_t__void swig_types[7]
+#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[8]
+#define SWIGTYPE_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[9]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[10]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[11]
+#define SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void swig_types[13]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[16]
+#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_int swig_types[18]
+#define SWIGTYPE_p_long swig_types[19]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[20]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[21]
+#define SWIGTYPE_p_p_char swig_types[22]
+#define SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void swig_types[23]
+#define SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_p_f_p_void_long_long_p_apr_pool_t__void swig_types[28]
+#define SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_p_f_p_void_p_struct_svn_error_t__void swig_types[31]
+#define SWIGTYPE_p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[33]
+#define SWIGTYPE_p_p_svn_fs_access_t swig_types[34]
+#define SWIGTYPE_p_p_svn_fs_history_t swig_types[35]
+#define SWIGTYPE_p_p_svn_fs_id_t swig_types[36]
+#define SWIGTYPE_p_p_svn_fs_info_placeholder_t swig_types[37]
+#define SWIGTYPE_p_p_svn_fs_root_t swig_types[38]
+#define SWIGTYPE_p_p_svn_fs_t swig_types[39]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[40]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[41]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[42]
+#define SWIGTYPE_p_p_svn_string_t swig_types[43]
+#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[44]
+#define SWIGTYPE_p_p_svn_version_t swig_types[45]
+#define SWIGTYPE_p_p_void swig_types[46]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[47]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[48]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[49]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[50]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[51]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[52]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[53]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[54]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[55]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[56]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[57]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[58]
+#define SWIGTYPE_p_svn_checksum_t swig_types[59]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[60]
+#define SWIGTYPE_p_svn_config_t swig_types[61]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[62]
+#define SWIGTYPE_p_svn_depth_t swig_types[63]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[64]
+#define SWIGTYPE_p_svn_dirent_t swig_types[65]
+#define SWIGTYPE_p_svn_errno_t swig_types[66]
+#define SWIGTYPE_p_svn_error_t swig_types[67]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[68]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[69]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[70]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[71]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[72]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[73]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[74]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[75]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[76]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[77]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[78]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[79]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[84]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[85]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[86]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[87]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[88]
+#define SWIGTYPE_p_svn_lock_t swig_types[89]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[90]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[91]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[92]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[93]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[94]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[95]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[96]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[97]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[98]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[99]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[100]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[101]
+#define SWIGTYPE_p_svn_prop_kind swig_types[102]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[103]
+#define SWIGTYPE_p_svn_stream_t swig_types[104]
+#define SWIGTYPE_p_svn_string_t swig_types[105]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[106]
+#define SWIGTYPE_p_svn_tristate_t swig_types[107]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[108]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[109]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[110]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[111]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[112]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[113]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[114]
+#define SWIGTYPE_p_svn_version_t swig_types[115]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[116]
+#define SWIGTYPE_p_unsigned_char swig_types[117]
+#define SWIGTYPE_p_unsigned_long swig_types[118]
+#define SWIGTYPE_p_void swig_types[119]
+static swig_type_info *swig_types[121];
+static swig_module_info swig_module = {swig_types, 120, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3069,7 +3059,7 @@ static swig_module_info swig_module = {swig_types, 104, 0, 0, 0, 0};
#endif
#define SWIG_name "_fs"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3256,6 +3246,9 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ #define SWIG_From_long PyLong_FromLong
+
+
SWIGINTERN int
SWIG_AsVal_double (PyObject *obj, double *val)
{
@@ -3391,9 +3384,6 @@ SWIG_As_long (PyObject* obj)
}
- #define SWIG_From_long PyLong_FromLong
-
-
SWIGINTERN int
SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
{
@@ -3415,6 +3405,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3469,11 +3471,21 @@ static void svn_fs_invoke_warning_callback(
_obj(baton, err);
}
+static svn_error_t * svn_fs_invoke_upgrade_notify(
+ svn_fs_upgrade_notify_t _obj, void *baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action, apr_pool_t *scratch_pool) {
+ return _obj(baton, number, action, scratch_pool);
+}
+
static void svn_fs_invoke_progress_notify_func(
svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void *baton, apr_pool_t *pool) {
_obj(revision, baton, pool);
}
+static void svn_fs_invoke_hotcopy_notify(
+ svn_fs_hotcopy_notify_t _obj, void *baton, svn_revnum_t start_revision, svn_revnum_t end_revision, apr_pool_t *scratch_pool) {
+ _obj(baton, start_revision, end_revision, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_freeze_func(
svn_fs_freeze_func_t _obj, void *baton, apr_pool_t *pool) {
return _obj(baton, pool);
@@ -3484,6 +3496,11 @@ static svn_error_t * svn_fs_invoke_process_contents_func(
return _obj(contents, len, baton, scratch_pool);
}
+static svn_error_t * svn_fs_invoke_lock_callback(
+ svn_fs_lock_callback_t _obj, void *baton, const char *path, const svn_lock_t *lock, svn_error_t *fs_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, path, lock, fs_err, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_get_locks_callback(
svn_fs_get_locks_callback_t _obj, void *baton, svn_lock_t *lock, apr_pool_t *pool) {
return _obj(baton, lock, pool);
@@ -3511,7 +3528,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_version(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3622,7 +3639,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_create(PyObject *SWIGUNUSEDPARM(self), PyObjec
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_t,
_global_py_pool, args))
;
@@ -3639,6 +3656,94 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_open2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_t **arg1 = (svn_fs_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_fs_t *temp1 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_fs_open2",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ /* PYTHON-FIXME: Handle None -> NULL. */
+ arg3 = svn_swig_py_stringhash_from_dict(obj1, _global_pool);
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_open2(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_open(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_t **arg1 = (svn_fs_t **) 0 ;
@@ -3690,7 +3795,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_open(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_t,
_global_py_pool, args))
;
@@ -3707,6 +3812,86 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_upgrade2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ svn_fs_upgrade_notify_t arg2 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg3 = (void *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_fs_upgrade2",&arg1,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+ {
+ svn_fs_upgrade_notify_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ {
+ if (obj2 == Py_None) {
+ arg3 = NULL;
+ } else if (SWIG_ConvertPtr(obj2, (void **) &arg3, 0, 0) == -1) {
+ arg3 = (void *) obj2;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_upgrade2((char const *)arg1,arg2,arg3,arg4,arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_upgrade(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char *arg1 = (char *) 0 ;
@@ -3845,7 +4030,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path(PyObject *SWIGUNUSEDPARM(self), PyObject
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_path",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3895,7 +4080,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_config(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_config",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3916,7 +4101,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_config(PyObject *SWIGUNUSEDPARM(self), PyObjec
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -3983,6 +4168,103 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_hotcopy3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_fs_hotcopy_notify_t arg5 = (svn_fs_hotcopy_notify_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg9 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|O:svn_fs_hotcopy3",&arg1,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_fs_hotcopy_notify_t * tmp =
+ svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_f_p_void_long_long_p_apr_pool_t__void, svn_argnum_obj4);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg5 = *tmp;
+ }
+ {
+ if (obj5 == Py_None) {
+ arg6 = NULL;
+ } else if (SWIG_ConvertPtr(obj5, (void **) &arg6, 0, 0) == -1) {
+ arg6 = (void *) obj5;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_hotcopy2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char *arg1 = (char *) 0 ;
@@ -4018,8 +4300,8 @@ SWIGINTERN PyObject *_wrap_svn_fs_hotcopy2(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -4140,8 +4422,8 @@ SWIGINTERN PyObject *_wrap_svn_fs_recover(PyObject *SWIGUNUSEDPARM(self), PyObje
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_fs_recover",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = svn_swig_py_cancel_func;
- arg3 = obj1; /* our function is the baton. */
+ arg2 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg3 = obj1;
}
if (obj2) {
/* Verify that the user supplied a valid pool */
@@ -4201,7 +4483,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_freeze(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_freeze",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4351,7 +4633,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_new(PyObject *SWIGUNUSEDPARM(self), PyObject *
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4374,7 +4656,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_create_berkeley(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_create_berkeley",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4413,7 +4695,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_open_berkeley(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_open_berkeley",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4459,7 +4741,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_berkeley_path(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_berkeley_path",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4706,7 +4988,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_create_access(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_access_t,
_global_py_pool, args))
;
@@ -4733,13 +5015,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_set_access(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_set_access",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj1);
+ arg2 = (svn_fs_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4780,7 +5062,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_access(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_get_access",&obj0)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4805,7 +5087,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_access(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_access_t,
_global_py_pool, args))
;
@@ -4827,7 +5109,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_access_get_username(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_access_get_username",&obj0)) SWIG_fail;
{
- arg2 = (svn_fs_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
+ arg2 = (svn_fs_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4880,7 +5162,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_access_add_lock_token2(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Osz:svn_fs_access_add_lock_token2",&obj0,&arg2,&arg3)) SWIG_fail;
{
- arg1 = (svn_fs_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
+ arg1 = (svn_fs_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4919,7 +5201,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_access_add_lock_token(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_fs_access_add_lock_token",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (svn_fs_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
+ arg1 = (svn_fs_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4959,13 +5241,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_compare_ids(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_compare_ids",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
+ arg1 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
+ arg2 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4995,13 +5277,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_check_related(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_check_related",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
+ arg1 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
+ arg2 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5061,7 +5343,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_parse_id(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5091,7 +5373,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_unparse_id(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_unparse_id",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
+ arg1 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5150,7 +5432,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_begin_txn2(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_fs_begin_txn2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5195,7 +5477,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_begin_txn2(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -5233,7 +5515,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_begin_txn(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_begin_txn",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5272,7 +5554,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_begin_txn(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -5312,7 +5594,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_commit_txn(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_commit_txn",&obj0,&obj1)) SWIG_fail;
{
- arg3 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg3 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5378,7 +5660,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_abort_txn(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_abort_txn",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5439,7 +5721,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_purge_txn(PyObject *SWIGUNUSEDPARM(self), PyOb
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_purge_txn",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5502,7 +5784,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_name(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_txn_name",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg2 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5567,7 +5849,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_base_revision(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_txn_base_revision",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5607,7 +5889,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_open_txn(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_open_txn",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5640,7 +5922,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_open_txn(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -5676,7 +5958,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_list_transactions(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_list_transactions",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5743,7 +6025,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_prop(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_txn_prop",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg2 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5819,7 +6101,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_proplist(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_txn_proplist",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg2 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5886,7 +6168,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_txn_prop(PyObject *SWIGUNUSEDPARM(self)
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_fs_change_txn_prop",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5961,13 +6243,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_txn_props(PyObject *SWIGUNUSEDPARM(self
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_change_txn_props",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6032,7 +6314,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_root(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_revision_root",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6071,7 +6353,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_root(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_root_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_root_t,
_global_py_pool, args))
;
@@ -6107,7 +6389,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_root(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_txn_root",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg2 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6140,7 +6422,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_root(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_root_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_root_t,
_global_py_pool, args))
;
@@ -6164,7 +6446,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_close_root(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_close_root",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6192,7 +6474,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_root_fs(PyObject *SWIGUNUSEDPARM(self), PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_root_fs",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6205,7 +6487,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_root_fs(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6221,7 +6503,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_is_txn_root(PyObject *SWIGUNUSEDPARM(self), Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_is_txn_root",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6249,7 +6531,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_is_revision_root(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_is_revision_root",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6285,7 +6567,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_root_name(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_txn_root_name",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6327,7 +6609,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_txn_root_base_revision(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_txn_root_base_revision",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6355,7 +6637,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_root_revision(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_revision_root_revision",&obj0)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6384,13 +6666,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_node_rev_id_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_node_rev_id_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
+ arg2 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6411,13 +6693,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_node_rev_id_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_node_rev_id_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_fs_id_t *) ((arg1)->node_rev_id);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6434,7 +6716,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_change_kind_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_change_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6461,7 +6743,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_change_kind_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_change_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6483,7 +6765,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_text_mod_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_text_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6510,7 +6792,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_text_mod_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_text_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6532,7 +6814,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_prop_mod_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_prop_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6559,7 +6841,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_prop_mod_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_prop_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6581,7 +6863,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_node_kind_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6608,7 +6890,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_node_kind_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_node_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6630,7 +6912,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_known_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_copyfrom_known_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6657,7 +6939,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_known_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_copyfrom_known_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6679,7 +6961,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_rev_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6706,7 +6988,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_rev_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6727,7 +7009,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_path_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_fs_path_change2_t_copyfrom_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6755,7 +7037,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_copyfrom_path_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_copyfrom_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6768,6 +7050,55 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_mergeinfo_mod_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ svn_tristate_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change2_t_mergeinfo_mod_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_tristate_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->mergeinfo_mod = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_path_change2_t_mergeinfo_mod_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_tristate_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change2_t_mergeinfo_mod_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_path_change2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_tristate_t) ((arg1)->mergeinfo_mod);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *svn_fs_path_change2_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -6784,13 +7115,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_node_rev_id_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change_t_node_rev_id_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
+ arg2 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6811,13 +7142,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_node_rev_id_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change_t_node_rev_id_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_fs_id_t *) ((arg1)->node_rev_id);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6834,7 +7165,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_change_kind_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change_t_change_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6861,7 +7192,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_change_kind_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change_t_change_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6883,7 +7214,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_text_mod_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change_t_text_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6910,7 +7241,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_text_mod_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change_t_text_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6932,7 +7263,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_prop_mod_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_path_change_t_prop_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6959,7 +7290,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change_t_prop_mod_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_path_change_t_prop_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_path_change_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_path_change_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_path_change_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6997,7 +7328,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_create(PyObject *SWIGUNUSEDPARM(s
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_path_change2_create",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
+ arg1 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7024,7 +7355,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_path_change2_create(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_path_change2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_path_change2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7057,7 +7388,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_paths_changed2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_paths_changed2",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7129,7 +7460,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_paths_changed(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_paths_changed",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7203,7 +7534,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_check_path(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_check_path",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7253,6 +7584,96 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_node_history2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_fs_history_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_fs_node_history2",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_node_history2(arg1,arg2,(char const *)arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_history_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_node_history(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
@@ -7273,7 +7694,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_history(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_history",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7306,7 +7727,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_history(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_history_t,
_global_py_pool, args))
;
@@ -7323,6 +7744,103 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_history_prev2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_history_t *arg2 = (svn_fs_history_t *) 0 ;
+ svn_boolean_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_fs_history_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_fs_history_prev2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ arg2 = (svn_fs_history_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_history_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_history_prev2(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_history_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_history_prev(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
@@ -7344,7 +7862,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_history_prev(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_history_prev",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_history_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_history_t, svn_argnum_obj0);
+ arg2 = (svn_fs_history_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_history_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7383,7 +7901,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_history_prev(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_history_t,
_global_py_pool, args))
;
@@ -7423,7 +7941,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_history_location(PyObject *SWIGUNUSEDPARM(self
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_history_location",&obj0,&obj1)) SWIG_fail;
{
- arg3 = (svn_fs_history_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_history_t, svn_argnum_obj0);
+ arg3 = (svn_fs_history_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_history_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7507,7 +8025,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_is_dir(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_is_dir",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7578,7 +8096,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_is_file(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_is_file",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7648,7 +8166,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_id(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_id",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7681,7 +8199,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_id(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_id_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_id_t,
_global_py_pool, args))
;
@@ -7698,6 +8216,84 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_node_relation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_node_relation_t *arg1 = (svn_fs_node_relation_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOsOs|O:svn_fs_node_relation",&obj0,&obj1,&arg3,&obj3,&arg5,&obj5)) SWIG_fail;
+ {
+ arg1 = (svn_fs_node_relation_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_node_relation_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj3);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_node_relation(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_node_created_rev(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
@@ -7719,7 +8315,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_created_rev(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_created_rev",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7790,7 +8386,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_origin_rev(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_origin_rev",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7860,7 +8456,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_created_path(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_created_path",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7938,7 +8534,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_prop(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Oss|O:svn_fs_node_prop",&obj0,&arg3,&arg4,&obj3)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8015,7 +8611,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_node_proplist(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_proplist",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8062,6 +8658,77 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_node_has_props(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_node_has_props",&obj0,&arg3,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_node_has_props(arg1,arg2,(char const *)arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_change_node_prop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
@@ -8083,7 +8750,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_node_prop(PyObject *SWIGUNUSEDPARM(self
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssO|O:svn_fs_change_node_prop",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8140,6 +8807,86 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_props_different(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_props_different",&obj0,&arg3,&obj2,&arg5,&obj4)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_props_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_props_changed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
@@ -8164,13 +8911,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_props_changed(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_props_changed",&obj0,&arg3,&obj2,&arg5,&obj4)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8244,7 +8991,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_copied_from(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_copied_from",&obj0,&arg4,&obj2)) SWIG_fail;
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8330,7 +9077,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_closest_copy(PyObject *SWIGUNUSEDPARM(self), P
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_closest_copy",&obj0,&arg4,&obj2)) SWIG_fail;
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8363,7 +9110,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_closest_copy(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_root_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_root_t,
_global_py_pool, args))
;
@@ -8426,7 +9173,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_mergeinfo2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|OO:svn_fs_get_mergeinfo2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8548,7 +9295,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_mergeinfo(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_fs_get_mergeinfo",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8651,19 +9398,19 @@ SWIGINTERN PyObject *_wrap_svn_fs_merge(PyObject *SWIGUNUSEDPARM(self), PyObject
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOsOs|O:svn_fs_merge",&obj0,&arg3,&obj2,&arg5,&obj4,&arg7,&obj6)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj4);
+ arg6 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8728,7 +9475,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_name_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_dirent_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8756,7 +9503,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_name_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_dirent_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8778,13 +9525,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_id_set(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_dirent_t_id_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_id_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
+ arg2 = (svn_fs_id_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_id_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8805,13 +9552,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_id_get(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_dirent_t_id_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_fs_id_t *) ((arg1)->id);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_id_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8828,7 +9575,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_kind_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_dirent_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8855,7 +9602,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_dirent_t_kind_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_dirent_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_fs_dirent_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
+ arg1 = (struct svn_fs_dirent_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_dirent_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8895,7 +9642,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_dir_entries(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_dir_entries",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8948,6 +9695,106 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_dir_optimal_order(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ apr_array_header_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_fs_dir_optimal_order",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_dir_optimal_order(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_dir_optimal_order arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_dir_optimal_order is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_make_dir(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
@@ -8965,7 +9812,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_make_dir(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_make_dir",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9026,7 +9873,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_delete(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_delete",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9090,13 +9937,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_copy(PyObject *SWIGUNUSEDPARM(self), PyObject
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_copy",&obj0,&arg2,&obj2,&arg4,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9159,13 +10006,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_link(PyObject *SWIGUNUSEDPARM(self),
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_fs_revision_link",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9229,7 +10076,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_file_length(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_file_length",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9306,7 +10153,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_file_checksum(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9385,7 +10232,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_file_md5_checksum(PyObject *SWIGUNUSEDPARM(sel
arg1 = temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_file_md5_checksum",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9452,7 +10299,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_file_contents(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_file_contents",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9485,7 +10332,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_file_contents(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -9527,14 +10374,14 @@ SWIGINTERN PyObject *_wrap_svn_fs_try_process_file_contents(PyObject *SWIGUNUSED
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_fs_try_process_file_contents",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_fs_process_contents_func_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -9610,7 +10457,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_make_file(PyObject *SWIGUNUSEDPARM(self), PyOb
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_make_file",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9687,7 +10534,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_apply_textdelta(PyObject *SWIGUNUSEDPARM(self)
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Oszz|O:svn_fs_apply_textdelta",&obj0,&arg4,&arg5,&arg6,&obj4)) SWIG_fail;
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9720,13 +10567,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_apply_textdelta(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg1, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9764,7 +10611,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_apply_text(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Osz|O:svn_fs_apply_text",&obj0,&arg3,&arg4,&obj3)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9797,7 +10644,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_apply_text(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -9814,6 +10661,86 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_contents_different(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_boolean_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_contents_different",&obj0,&arg3,&obj2,&arg5,&obj4)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_contents_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_contents_changed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
@@ -9838,13 +10765,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_contents_changed(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_contents_changed",&obj0,&arg3,&obj2,&arg5,&obj4)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9914,7 +10841,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_youngest_rev(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_youngest_rev",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9964,6 +10891,200 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_info_format(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_fs_t *arg3 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_fs_info_format",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg3 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_info_format(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_format is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_info_config_files(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ apr_array_header_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_fs_info_config_files",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_info_config_files(arg1,arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_config_files arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_config_files is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_deltify_revision(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
@@ -9982,7 +11103,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_deltify_revision(PyObject *SWIGUNUSEDPARM(self
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_deltify_revision",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10054,7 +11175,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_prop(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_fs_revision_prop",&obj0,&obj1,&arg4,&obj3)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10138,7 +11259,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_revision_proplist(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_revision_proplist",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10215,7 +11336,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_rev_prop2(PyObject *SWIGUNUSEDPARM(self
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_fs_change_rev_prop2",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10227,7 +11348,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_rev_prop2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg4 = (svn_string_t **)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj3);
+ arg4 = (svn_string_t **)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10319,7 +11440,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_change_rev_prop(PyObject *SWIGUNUSEDPARM(self)
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_fs_change_rev_prop",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10405,13 +11526,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_file_delta_stream(PyObject *SWIGUNUSEDPARM
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOs|O:svn_fs_get_file_delta_stream",&obj0,&arg3,&obj2,&arg5,&obj4)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10444,7 +11565,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_file_delta_stream(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_txdelta_stream_t,
_global_py_pool, args))
;
@@ -10480,7 +11601,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_uuid(PyObject *SWIGUNUSEDPARM(self), PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_get_uuid",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10554,7 +11675,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_set_uuid(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Oz|O:svn_fs_set_uuid",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10598,6 +11719,208 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_lock_target_create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ svn_revnum_t arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_fs_lock_target_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"zO|O:svn_fs_lock_target_create",&arg1,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_fs_lock_target_t *)svn_fs_lock_target_create((char const *)arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_lock_target_t,
+ _global_py_pool, args);
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_lock_target_set_token(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_lock_target_t *arg1 = (svn_fs_lock_target_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ PyObject * obj0 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"Oz:svn_fs_lock_target_set_token",&obj0,&arg2)) SWIG_fail;
+ {
+ arg1 = (svn_fs_lock_target_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_lock_target_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_fs_lock_target_set_token(arg1,(char const *)arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_lock_many(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg9 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg10 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOzOOOO|OO:svn_fs_lock_many",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
+ {
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+ arg2 = svn_swig_py_struct_ptr_hash_from_dict(obj1,
+ SWIGTYPE_p_svn_fs_lock_target_t, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ arg5 = (apr_time_t) PyLong_AsLongLong(obj4);
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_fs_lock_callback_t) svn_swig_py_fs_lock_callback;
+ arg8 = obj6;
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ if (obj8) {
+ /* Verify that the user supplied a valid pool */
+ if (obj8 != Py_None && obj8 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj8);
+ SWIG_arg_fail(svn_argnum_obj8);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
@@ -10628,7 +11951,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyObject
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OszzOOOO|O:svn_fs_lock",&obj0,&arg3,&arg4,&arg5,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10680,7 +12003,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_lock_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_lock_t,
_global_py_pool, args))
;
@@ -10716,7 +12039,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_generate_lock_token(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_generate_lock_token",&obj0,&obj1)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10773,6 +12096,106 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_unlock_many(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg7 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|OO:svn_fs_unlock_many",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+ {
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = svn_swig_py_stringhash_from_dict(obj1, _global_pool);
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_fs_lock_callback_t) svn_swig_py_fs_lock_callback;
+ arg5 = obj3;
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_unlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
@@ -10793,7 +12216,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_unlock(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OszO|O:svn_fs_unlock",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10863,7 +12286,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_fs_get_lock",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10896,7 +12319,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_lock_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_lock_t,
_global_py_pool, args))
;
@@ -10935,7 +12358,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_locks2(PyObject *SWIGUNUSEDPARM(self), PyO
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_fs_get_locks2",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10947,7 +12370,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_locks2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg4 = svn_swig_py_fs_get_locks_func;
+ arg4 = (svn_fs_get_locks_callback_t) svn_swig_py_fs_get_locks_func;
arg5 = obj3;
}
if (obj4) {
@@ -11009,13 +12432,13 @@ SWIGINTERN PyObject *_wrap_svn_fs_get_locks(PyObject *SWIGUNUSEDPARM(self), PyOb
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_fs_get_locks",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_fs_get_locks_func;
+ arg3 = (svn_fs_get_locks_callback_t) svn_swig_py_fs_get_locks_func;
arg4 = obj2;
}
if (obj3) {
@@ -11144,7 +12567,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_pack(PyObject *SWIGUNUSEDPARM(self), PyObject
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_fs_pack",&arg1,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_fs_pack_notify_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11159,8 +12582,8 @@ SWIGINTERN PyObject *_wrap_svn_fs_pack(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -11246,7 +12669,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_verify(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
{
svn_fs_progress_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj4, SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void, svn_argnum_obj4);
+ svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void, svn_argnum_obj4);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11261,8 +12684,8 @@ SWIGINTERN PyObject *_wrap_svn_fs_verify(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj6; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
}
if (obj7) {
/* Verify that the user supplied a valid pool */
@@ -11319,7 +12742,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_verify_root(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_fs_verify_root",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11363,6 +12786,582 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_fs_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ PyObject * obj0 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_fsfs_info_t_fs_type_set",&obj0,&arg2)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_fs_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ char *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsfs_info_t_fs_type_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (char *) ((arg1)->fs_type);
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_shard_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ int arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_fsfs_info_t_shard_size_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (int)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->shard_size = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_shard_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ int result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsfs_info_t_shard_size_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (int) ((arg1)->shard_size);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_fsfs_info_t_min_unpacked_rev_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_revnum_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsfs_info_t_min_unpacked_rev_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_log_addressing_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_boolean_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_fsfs_info_t_log_addressing_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_boolean_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->log_addressing = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsfs_info_t_log_addressing_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_boolean_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsfs_info_t_log_addressing_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsfs_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsfs_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_boolean_t) ((arg1)->log_addressing);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *svn_fs_fsfs_info_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_svn_fs_fsfs_info_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_fs_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ PyObject * obj0 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_fsx_info_t_fs_type_set",&obj0,&arg2)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_fs_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ char *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsx_info_t_fs_type_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (char *) ((arg1)->fs_type);
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_shard_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ int arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_fsx_info_t_shard_size_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (int)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->shard_size = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_shard_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ int result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsx_info_t_shard_size_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (int) ((arg1)->shard_size);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_min_unpacked_rev_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_fs_fsx_info_t_min_unpacked_rev_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_fsx_info_t_min_unpacked_rev_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_revnum_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_fsx_info_t_min_unpacked_rev_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_fsx_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_fsx_info_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *svn_fs_fsx_info_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_svn_fs_fsx_info_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_svn_fs_info_placeholder_t_fs_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ PyObject * obj0 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"Os:svn_fs_info_placeholder_t_fs_type_set",&obj0,&arg2)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_info_placeholder_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_info_placeholder_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_info_placeholder_t_fs_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ char *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_fs_info_placeholder_t_fs_type_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_fs_info_placeholder_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_info_placeholder_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (char *) ((arg1)->fs_type);
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *svn_fs_info_placeholder_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_svn_fs_info_placeholder_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_svn_fs_info(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_info_placeholder_t **arg1 = (svn_fs_info_placeholder_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_fs_info_placeholder_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_fs_info",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_info((struct svn_fs_info_placeholder_t const **)arg1,arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info arg 1 (svn_fs_info_placeholder_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_fs_info_dup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ void *arg1 = (void *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ void *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg2 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_fs_info_dup",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg1 = (void *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_void, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (void *)svn_fs_info_dup((void const *)arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_void,
+ _global_py_pool, args);
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *svn_fs_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -11405,6 +13404,13 @@ SWIGINTERN PyObject *svn_fs_history_t_swigregister(PyObject *SWIGUNUSEDPARM(self
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_fs_lock_target_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_svn_fs_lock_target_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *_wrap_svn_fs_invoke_warning_callback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_warning_callback_t arg1 = (svn_fs_warning_callback_t) 0 ;
@@ -11417,7 +13423,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_warning_callback(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OOO:svn_fs_invoke_warning_callback",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_fs_warning_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_struct_svn_error_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_struct_svn_error_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11432,7 +13438,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_warning_callback(PyObject *SWIGUNUSEDPA
}
}
{
- arg3 = (svn_error_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_error_t, svn_argnum_obj2);
+ arg3 = (svn_error_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_error_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11452,6 +13458,89 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_invoke_upgrade_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_upgrade_notify_t arg1 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_uint64_t arg3 ;
+ svn_fs_upgrade_notify_action_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_fs_invoke_upgrade_notify",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+ {
+ svn_fs_upgrade_notify_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ arg3 = (apr_uint64_t) PyLong_AsUnsignedLongLong(obj2);
+ {
+ arg4 = (svn_fs_upgrade_notify_action_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_invoke_upgrade_notify(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_invoke_progress_notify_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_progress_notify_func_t arg1 = (svn_fs_progress_notify_func_t) 0 ;
@@ -11472,7 +13561,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_progress_notify_func(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_fs_invoke_progress_notify_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_fs_progress_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_long_p_void_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11521,6 +13610,83 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_invoke_hotcopy_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_hotcopy_notify_t arg1 = (svn_fs_hotcopy_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_fs_invoke_hotcopy_notify",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+ {
+ svn_fs_hotcopy_notify_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_long_long_p_apr_pool_t__void, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg3 = (svn_revnum_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_revnum_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_fs_invoke_hotcopy_notify(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_invoke_freeze_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_freeze_func_t arg1 = (svn_fs_freeze_func_t) 0 ;
@@ -11540,7 +13706,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_freeze_func(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_fs_invoke_freeze_func",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_fs_freeze_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11616,14 +13782,14 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_process_contents_func(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_fs_invoke_process_contents_func",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_fs_process_contents_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg2 = (unsigned char *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_unsigned_char, svn_argnum_obj1);
+ arg2 = (unsigned char *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_unsigned_char, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11681,6 +13847,95 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_fs_invoke_lock_callback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_fs_lock_callback_t arg1 = (svn_fs_lock_callback_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_lock_t *arg4 = (svn_lock_t *) 0 ;
+ svn_error_t *arg5 = (svn_error_t *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_fs_invoke_lock_callback",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
+ {
+ svn_fs_lock_callback_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg4 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_lock_t, svn_argnum_obj3);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_error_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_error_t, svn_argnum_obj4);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_fs_invoke_lock_callback(arg1,arg2,(char const *)arg3,(struct svn_lock_t const *)arg4,arg5,arg6);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_fs_invoke_get_locks_callback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_get_locks_callback_t arg1 = (svn_fs_get_locks_callback_t) 0 ;
@@ -11702,7 +13957,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_get_locks_callback(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_fs_invoke_get_locks_callback",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_fs_get_locks_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11717,7 +13972,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_get_locks_callback(PyObject *SWIGUNUSED
}
}
{
- arg3 = (svn_lock_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_lock_t, svn_argnum_obj2);
+ arg3 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_lock_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11784,7 +14039,7 @@ SWIGINTERN PyObject *_wrap_svn_fs_invoke_pack_notify(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_fs_invoke_pack_notify",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_fs_pack_notify_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -11851,6 +14106,13 @@ SWIGINTERN PyObject *svn_fs_warning_callback_t_swigregister(PyObject *SWIGUNUSED
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_fs_upgrade_notify_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *svn_fs_progress_notify_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -11858,6 +14120,13 @@ SWIGINTERN PyObject *svn_fs_progress_notify_func_t_swigregister(PyObject *SWIGUN
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_fs_hotcopy_notify_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_long_long_p_apr_pool_t__void, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *svn_fs_freeze_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -11872,6 +14141,13 @@ SWIGINTERN PyObject *svn_fs_process_contents_func_t_swigregister(PyObject *SWIGU
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_fs_lock_callback_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *svn_fs_get_locks_callback_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -11891,12 +14167,22 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_fs_version", _wrap_svn_fs_version, METH_VARARGS, (char *)"svn_fs_version() -> svn_version_t const *"},
{ (char *)"svn_fs_initialize", _wrap_svn_fs_initialize, METH_VARARGS, (char *)"svn_fs_initialize(apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_create", _wrap_svn_fs_create, METH_VARARGS, (char *)"svn_fs_create(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_open2", _wrap_svn_fs_open2, METH_VARARGS, (char *)"svn_fs_open2(char const * path, apr_hash_t fs_config, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_open", _wrap_svn_fs_open, METH_VARARGS, (char *)"svn_fs_open(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_upgrade2", _wrap_svn_fs_upgrade2, METH_VARARGS, (char *)"\n"
+ "svn_fs_upgrade2(char const * path, svn_fs_upgrade_notify_t notify_func, void * notify_baton, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_upgrade", _wrap_svn_fs_upgrade, METH_VARARGS, (char *)"svn_fs_upgrade(char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_type", _wrap_svn_fs_type, METH_VARARGS, (char *)"svn_fs_type(char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_path", _wrap_svn_fs_path, METH_VARARGS, (char *)"svn_fs_path(svn_fs_t * fs, apr_pool_t pool) -> char const *"},
{ (char *)"svn_fs_config", _wrap_svn_fs_config, METH_VARARGS, (char *)"svn_fs_config(svn_fs_t * fs, apr_pool_t pool) -> apr_hash_t"},
{ (char *)"svn_fs_delete_fs", _wrap_svn_fs_delete_fs, METH_VARARGS, (char *)"svn_fs_delete_fs(char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_hotcopy3", _wrap_svn_fs_hotcopy3, METH_VARARGS, (char *)"\n"
+ "svn_fs_hotcopy3(char const * src_path, char const * dest_path, svn_boolean_t clean, svn_boolean_t incremental, \n"
+ " svn_fs_hotcopy_notify_t notify_func, void * notify_baton, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_hotcopy2", _wrap_svn_fs_hotcopy2, METH_VARARGS, (char *)"\n"
"svn_fs_hotcopy2(char const * src_path, char const * dest_path, svn_boolean_t clean, svn_boolean_t incremental, \n"
" svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t\n"
@@ -11960,6 +14246,8 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_fs_path_change2_t_copyfrom_rev_get", _wrap_svn_fs_path_change2_t_copyfrom_rev_get, METH_VARARGS, (char *)"svn_fs_path_change2_t_copyfrom_rev_get(svn_fs_path_change2_t self) -> svn_revnum_t"},
{ (char *)"svn_fs_path_change2_t_copyfrom_path_set", _wrap_svn_fs_path_change2_t_copyfrom_path_set, METH_VARARGS, (char *)"svn_fs_path_change2_t_copyfrom_path_set(svn_fs_path_change2_t self, char const * copyfrom_path)"},
{ (char *)"svn_fs_path_change2_t_copyfrom_path_get", _wrap_svn_fs_path_change2_t_copyfrom_path_get, METH_VARARGS, (char *)"svn_fs_path_change2_t_copyfrom_path_get(svn_fs_path_change2_t self) -> char const *"},
+ { (char *)"svn_fs_path_change2_t_mergeinfo_mod_set", _wrap_svn_fs_path_change2_t_mergeinfo_mod_set, METH_VARARGS, (char *)"svn_fs_path_change2_t_mergeinfo_mod_set(svn_fs_path_change2_t self, svn_tristate_t mergeinfo_mod)"},
+ { (char *)"svn_fs_path_change2_t_mergeinfo_mod_get", _wrap_svn_fs_path_change2_t_mergeinfo_mod_get, METH_VARARGS, (char *)"svn_fs_path_change2_t_mergeinfo_mod_get(svn_fs_path_change2_t self) -> svn_tristate_t"},
{ (char *)"svn_fs_path_change2_t_swigregister", svn_fs_path_change2_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_path_change_t_node_rev_id_set", _wrap_svn_fs_path_change_t_node_rev_id_set, METH_VARARGS, (char *)"svn_fs_path_change_t_node_rev_id_set(svn_fs_path_change_t self, svn_fs_id_t const * node_rev_id)"},
{ (char *)"svn_fs_path_change_t_node_rev_id_get", _wrap_svn_fs_path_change_t_node_rev_id_get, METH_VARARGS, (char *)"svn_fs_path_change_t_node_rev_id_get(svn_fs_path_change_t self) -> svn_fs_id_t const *"},
@@ -11974,21 +14262,32 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_fs_paths_changed2", _wrap_svn_fs_paths_changed2, METH_VARARGS, (char *)"svn_fs_paths_changed2(svn_fs_root_t * root, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_paths_changed", _wrap_svn_fs_paths_changed, METH_VARARGS, (char *)"svn_fs_paths_changed(svn_fs_root_t * root, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_check_path", _wrap_svn_fs_check_path, METH_VARARGS, (char *)"svn_fs_check_path(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_node_history2", _wrap_svn_fs_node_history2, METH_VARARGS, (char *)"svn_fs_node_history2(svn_fs_root_t * root, char const * path, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_node_history", _wrap_svn_fs_node_history, METH_VARARGS, (char *)"svn_fs_node_history(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_history_prev2", _wrap_svn_fs_history_prev2, METH_VARARGS, (char *)"svn_fs_history_prev2(svn_fs_history_t * history, svn_boolean_t cross_copies, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_history_prev", _wrap_svn_fs_history_prev, METH_VARARGS, (char *)"svn_fs_history_prev(svn_fs_history_t * history, svn_boolean_t cross_copies, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_history_location", _wrap_svn_fs_history_location, METH_VARARGS, (char *)"svn_fs_history_location(svn_fs_history_t * history, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_is_dir", _wrap_svn_fs_is_dir, METH_VARARGS, (char *)"svn_fs_is_dir(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_is_file", _wrap_svn_fs_is_file, METH_VARARGS, (char *)"svn_fs_is_file(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_node_id", _wrap_svn_fs_node_id, METH_VARARGS, (char *)"svn_fs_node_id(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_node_relation", _wrap_svn_fs_node_relation, METH_VARARGS, (char *)"\n"
+ "svn_fs_node_relation(svn_fs_node_relation_t * relation, svn_fs_root_t * root_a, char const * path_a, svn_fs_root_t * root_b, \n"
+ " char const * path_b, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_node_created_rev", _wrap_svn_fs_node_created_rev, METH_VARARGS, (char *)"svn_fs_node_created_rev(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_node_origin_rev", _wrap_svn_fs_node_origin_rev, METH_VARARGS, (char *)"svn_fs_node_origin_rev(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_node_created_path", _wrap_svn_fs_node_created_path, METH_VARARGS, (char *)"svn_fs_node_created_path(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_node_prop", _wrap_svn_fs_node_prop, METH_VARARGS, (char *)"svn_fs_node_prop(svn_fs_root_t * root, char const * path, char const * propname, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_node_proplist", _wrap_svn_fs_node_proplist, METH_VARARGS, (char *)"svn_fs_node_proplist(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_node_has_props", _wrap_svn_fs_node_has_props, METH_VARARGS, (char *)"svn_fs_node_has_props(svn_fs_root_t * root, char const * path, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_change_node_prop", _wrap_svn_fs_change_node_prop, METH_VARARGS, (char *)"\n"
"svn_fs_change_node_prop(svn_fs_root_t * root, char const * path, char const * name, svn_string_t const * value, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_fs_props_different", _wrap_svn_fs_props_different, METH_VARARGS, (char *)"\n"
+ "svn_fs_props_different(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_props_changed", _wrap_svn_fs_props_changed, METH_VARARGS, (char *)"\n"
"svn_fs_props_changed(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2, \n"
" apr_pool_t pool) -> svn_error_t\n"
@@ -12017,6 +14316,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_fs_dirent_t_kind_get", _wrap_svn_fs_dirent_t_kind_get, METH_VARARGS, (char *)"svn_fs_dirent_t_kind_get(svn_fs_dirent_t self) -> svn_node_kind_t"},
{ (char *)"svn_fs_dirent_t_swigregister", svn_fs_dirent_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_dir_entries", _wrap_svn_fs_dir_entries, METH_VARARGS, (char *)"svn_fs_dir_entries(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_dir_optimal_order", _wrap_svn_fs_dir_optimal_order, METH_VARARGS, (char *)"svn_fs_dir_optimal_order(svn_fs_root_t * root, apr_hash_t entries, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_make_dir", _wrap_svn_fs_make_dir, METH_VARARGS, (char *)"svn_fs_make_dir(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_delete", _wrap_svn_fs_delete, METH_VARARGS, (char *)"svn_fs_delete(svn_fs_root_t * root, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_copy", _wrap_svn_fs_copy, METH_VARARGS, (char *)"\n"
@@ -12041,11 +14341,17 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_fs_apply_text", _wrap_svn_fs_apply_text, METH_VARARGS, (char *)"svn_fs_apply_text(svn_fs_root_t * root, char const * path, char const * result_checksum, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_contents_different", _wrap_svn_fs_contents_different, METH_VARARGS, (char *)"\n"
+ "svn_fs_contents_different(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_contents_changed", _wrap_svn_fs_contents_changed, METH_VARARGS, (char *)"\n"
"svn_fs_contents_changed(svn_fs_root_t * root1, char const * path1, svn_fs_root_t * root2, char const * path2, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_fs_youngest_rev", _wrap_svn_fs_youngest_rev, METH_VARARGS, (char *)"svn_fs_youngest_rev(svn_fs_t * fs, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_info_format", _wrap_svn_fs_info_format, METH_VARARGS, (char *)"svn_fs_info_format(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_fs_info_config_files", _wrap_svn_fs_info_config_files, METH_VARARGS, (char *)"svn_fs_info_config_files(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_fs_deltify_revision", _wrap_svn_fs_deltify_revision, METH_VARARGS, (char *)"svn_fs_deltify_revision(svn_fs_t * fs, svn_revnum_t revision, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_revision_prop", _wrap_svn_fs_revision_prop, METH_VARARGS, (char *)"svn_fs_revision_prop(svn_fs_t * fs, svn_revnum_t rev, char const * propname, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_revision_proplist", _wrap_svn_fs_revision_proplist, METH_VARARGS, (char *)"svn_fs_revision_proplist(svn_fs_t * fs, svn_revnum_t rev, apr_pool_t pool) -> svn_error_t"},
@@ -12060,12 +14366,23 @@ static PyMethodDef SwigMethods[] = {
""},
{ (char *)"svn_fs_get_uuid", _wrap_svn_fs_get_uuid, METH_VARARGS, (char *)"svn_fs_get_uuid(svn_fs_t * fs, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_set_uuid", _wrap_svn_fs_set_uuid, METH_VARARGS, (char *)"svn_fs_set_uuid(svn_fs_t * fs, char const * uuid, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_lock_target_create", _wrap_svn_fs_lock_target_create, METH_VARARGS, (char *)"svn_fs_lock_target_create(char const * token, svn_revnum_t current_rev, apr_pool_t result_pool) -> svn_fs_lock_target_t *"},
+ { (char *)"svn_fs_lock_target_set_token", _wrap_svn_fs_lock_target_set_token, METH_VARARGS, (char *)"svn_fs_lock_target_set_token(svn_fs_lock_target_t * target, char const * token)"},
+ { (char *)"svn_fs_lock_many", _wrap_svn_fs_lock_many, METH_VARARGS, (char *)"\n"
+ "svn_fs_lock_many(svn_fs_t * fs, apr_hash_t lock_targets, char const * comment, svn_boolean_t is_dav_comment, \n"
+ " apr_time_t expiration_date, svn_boolean_t steal_lock, svn_fs_lock_callback_t lock_callback, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_lock", _wrap_svn_fs_lock, METH_VARARGS, (char *)"\n"
"svn_fs_lock(svn_fs_t * fs, char const * path, char const * token, char const * comment, svn_boolean_t is_dav_comment, \n"
" apr_time_t expiration_date, svn_revnum_t current_rev, \n"
" svn_boolean_t steal_lock, apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_fs_generate_lock_token", _wrap_svn_fs_generate_lock_token, METH_VARARGS, (char *)"svn_fs_generate_lock_token(svn_fs_t * fs, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_fs_unlock_many", _wrap_svn_fs_unlock_many, METH_VARARGS, (char *)"\n"
+ "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, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_unlock", _wrap_svn_fs_unlock, METH_VARARGS, (char *)"svn_fs_unlock(svn_fs_t * fs, char const * path, char const * token, svn_boolean_t break_lock, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_get_lock", _wrap_svn_fs_get_lock, METH_VARARGS, (char *)"svn_fs_get_lock(svn_fs_t * fs, char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_get_locks2", _wrap_svn_fs_get_locks2, METH_VARARGS, (char *)"\n"
@@ -12084,28 +14401,65 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t scratch_pool) -> svn_error_t\n"
""},
{ (char *)"svn_fs_verify_root", _wrap_svn_fs_verify_root, METH_VARARGS, (char *)"svn_fs_verify_root(svn_fs_root_t * root, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_fs_fsfs_info_t_fs_type_set", _wrap_svn_fs_fsfs_info_t_fs_type_set, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_fs_type_set(svn_fs_fsfs_info_t self, char const * fs_type)"},
+ { (char *)"svn_fs_fsfs_info_t_fs_type_get", _wrap_svn_fs_fsfs_info_t_fs_type_get, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_fs_type_get(svn_fs_fsfs_info_t self) -> char const *"},
+ { (char *)"svn_fs_fsfs_info_t_shard_size_set", _wrap_svn_fs_fsfs_info_t_shard_size_set, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_shard_size_set(svn_fs_fsfs_info_t self, int shard_size)"},
+ { (char *)"svn_fs_fsfs_info_t_shard_size_get", _wrap_svn_fs_fsfs_info_t_shard_size_get, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_shard_size_get(svn_fs_fsfs_info_t self) -> int"},
+ { (char *)"svn_fs_fsfs_info_t_min_unpacked_rev_set", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_min_unpacked_rev_set(svn_fs_fsfs_info_t self, svn_revnum_t min_unpacked_rev)"},
+ { (char *)"svn_fs_fsfs_info_t_min_unpacked_rev_get", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_min_unpacked_rev_get(svn_fs_fsfs_info_t self) -> svn_revnum_t"},
+ { (char *)"svn_fs_fsfs_info_t_log_addressing_set", _wrap_svn_fs_fsfs_info_t_log_addressing_set, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_log_addressing_set(svn_fs_fsfs_info_t self, svn_boolean_t log_addressing)"},
+ { (char *)"svn_fs_fsfs_info_t_log_addressing_get", _wrap_svn_fs_fsfs_info_t_log_addressing_get, METH_VARARGS, (char *)"svn_fs_fsfs_info_t_log_addressing_get(svn_fs_fsfs_info_t self) -> svn_boolean_t"},
+ { (char *)"svn_fs_fsfs_info_t_swigregister", svn_fs_fsfs_info_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_fsx_info_t_fs_type_set", _wrap_svn_fs_fsx_info_t_fs_type_set, METH_VARARGS, (char *)"svn_fs_fsx_info_t_fs_type_set(svn_fs_fsx_info_t self, char const * fs_type)"},
+ { (char *)"svn_fs_fsx_info_t_fs_type_get", _wrap_svn_fs_fsx_info_t_fs_type_get, METH_VARARGS, (char *)"svn_fs_fsx_info_t_fs_type_get(svn_fs_fsx_info_t self) -> char const *"},
+ { (char *)"svn_fs_fsx_info_t_shard_size_set", _wrap_svn_fs_fsx_info_t_shard_size_set, METH_VARARGS, (char *)"svn_fs_fsx_info_t_shard_size_set(svn_fs_fsx_info_t self, int shard_size)"},
+ { (char *)"svn_fs_fsx_info_t_shard_size_get", _wrap_svn_fs_fsx_info_t_shard_size_get, METH_VARARGS, (char *)"svn_fs_fsx_info_t_shard_size_get(svn_fs_fsx_info_t self) -> int"},
+ { (char *)"svn_fs_fsx_info_t_min_unpacked_rev_set", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_set, METH_VARARGS, (char *)"svn_fs_fsx_info_t_min_unpacked_rev_set(svn_fs_fsx_info_t self, svn_revnum_t min_unpacked_rev)"},
+ { (char *)"svn_fs_fsx_info_t_min_unpacked_rev_get", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_get, METH_VARARGS, (char *)"svn_fs_fsx_info_t_min_unpacked_rev_get(svn_fs_fsx_info_t self) -> svn_revnum_t"},
+ { (char *)"svn_fs_fsx_info_t_swigregister", svn_fs_fsx_info_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_info_placeholder_t_fs_type_set", _wrap_svn_fs_info_placeholder_t_fs_type_set, METH_VARARGS, (char *)"svn_fs_info_placeholder_t_fs_type_set(svn_fs_info_placeholder_t self, char const * fs_type)"},
+ { (char *)"svn_fs_info_placeholder_t_fs_type_get", _wrap_svn_fs_info_placeholder_t_fs_type_get, METH_VARARGS, (char *)"svn_fs_info_placeholder_t_fs_type_get(svn_fs_info_placeholder_t self) -> char const *"},
+ { (char *)"svn_fs_info_placeholder_t_swigregister", svn_fs_info_placeholder_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_info", _wrap_svn_fs_info, METH_VARARGS, (char *)"svn_fs_info(svn_fs_t * fs, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_fs_info_dup", _wrap_svn_fs_info_dup, METH_VARARGS, (char *)"svn_fs_info_dup(void const * info, apr_pool_t result_pool, apr_pool_t scratch_pool) -> void *"},
{ (char *)"svn_fs_t_swigregister", svn_fs_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_access_t_swigregister", svn_fs_access_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_id_t_swigregister", svn_fs_id_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_txn_t_swigregister", svn_fs_txn_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_root_t_swigregister", svn_fs_root_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_history_t_swigregister", svn_fs_history_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_lock_target_t_swigregister", svn_fs_lock_target_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_invoke_warning_callback", _wrap_svn_fs_invoke_warning_callback, METH_VARARGS, (char *)"svn_fs_invoke_warning_callback(svn_fs_warning_callback_t _obj, void * baton, svn_error_t err)"},
+ { (char *)"svn_fs_invoke_upgrade_notify", _wrap_svn_fs_invoke_upgrade_notify, METH_VARARGS, (char *)"\n"
+ "svn_fs_invoke_upgrade_notify(svn_fs_upgrade_notify_t _obj, void * baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_invoke_progress_notify_func", _wrap_svn_fs_invoke_progress_notify_func, METH_VARARGS, (char *)"svn_fs_invoke_progress_notify_func(svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void * baton, apr_pool_t pool)"},
+ { (char *)"svn_fs_invoke_hotcopy_notify", _wrap_svn_fs_invoke_hotcopy_notify, METH_VARARGS, (char *)"\n"
+ "svn_fs_invoke_hotcopy_notify(svn_fs_hotcopy_notify_t _obj, void * baton, svn_revnum_t start_revision, svn_revnum_t end_revision, \n"
+ " apr_pool_t scratch_pool)\n"
+ ""},
{ (char *)"svn_fs_invoke_freeze_func", _wrap_svn_fs_invoke_freeze_func, METH_VARARGS, (char *)"svn_fs_invoke_freeze_func(svn_fs_freeze_func_t _obj, void * baton, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_invoke_process_contents_func", _wrap_svn_fs_invoke_process_contents_func, METH_VARARGS, (char *)"\n"
"svn_fs_invoke_process_contents_func(svn_fs_process_contents_func_t _obj, unsigned char const * contents, apr_size_t len, \n"
" void * baton, apr_pool_t scratch_pool) -> svn_error_t\n"
""},
+ { (char *)"svn_fs_invoke_lock_callback", _wrap_svn_fs_invoke_lock_callback, METH_VARARGS, (char *)"\n"
+ "svn_fs_invoke_lock_callback(svn_fs_lock_callback_t _obj, void * baton, char const * path, svn_lock_t lock, svn_error_t fs_err, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_fs_invoke_get_locks_callback", _wrap_svn_fs_invoke_get_locks_callback, METH_VARARGS, (char *)"svn_fs_invoke_get_locks_callback(svn_fs_get_locks_callback_t _obj, void * baton, svn_lock_t lock, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_fs_invoke_pack_notify", _wrap_svn_fs_invoke_pack_notify, METH_VARARGS, (char *)"\n"
"svn_fs_invoke_pack_notify(svn_fs_pack_notify_t _obj, void * baton, apr_int64_t shard, svn_fs_pack_notify_action_t action, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_fs_warning_callback_t_swigregister", svn_fs_warning_callback_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_upgrade_notify_t_swigregister", svn_fs_upgrade_notify_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_progress_notify_func_t_swigregister", svn_fs_progress_notify_func_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_hotcopy_notify_t_swigregister", svn_fs_hotcopy_notify_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_freeze_func_t_swigregister", svn_fs_freeze_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_process_contents_func_t_swigregister", svn_fs_process_contents_func_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_fs_lock_callback_t_swigregister", svn_fs_lock_callback_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_get_locks_callback_t_swigregister", svn_fs_get_locks_callback_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_fs_pack_notify_t_swigregister", svn_fs_pack_notify_t_swigregister, METH_VARARGS, NULL},
{ NULL, NULL, 0, NULL }
@@ -12119,13 +14473,17 @@ static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "apr_hash_t *", 0
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_pool_t = {"_p_apr_pool_t", "apr_pool_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_apr_uint64_t = {"_p_apr_uint64_t", "apr_uint64_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_long_p_void_p_apr_pool_t__void = {"_p_f_long_p_void_p_apr_pool_t__void", "void (*)(long,void *,apr_pool_t *)|svn_fs_progress_notify_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_fs_process_contents_func_t|struct svn_error_t *(*)(unsigned char const *,apr_size_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_error_t", "svn_cancel_func_t|struct svn_error_t *(*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_fs_pack_notify_action_t,apr_pool_t *)|svn_fs_pack_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_uint64_t,svn_fs_upgrade_notify_action_t,apr_pool_t *)|svn_fs_upgrade_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_long_long_p_apr_pool_t__void = {"_p_f_p_void_long_long_p_apr_pool_t__void", "void (*)(void *,long,long,apr_pool_t *)|svn_fs_hotcopy_notify_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_fs_freeze_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_struct_svn_error_t__void = {"_p_f_p_void_p_struct_svn_error_t__void", "void (*)(void *,struct svn_error_t *)|svn_fs_warning_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_lock_t *,apr_pool_t *)|svn_fs_get_locks_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -12137,13 +14495,17 @@ static swig_type_info _swigt__p_p_f_long_p_void_p_apr_pool_t__void = {"_p_p_f_lo
static swig_type_info _swigt__p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(unsigned char const *,apr_size_t,void *,apr_pool_t *)|svn_fs_process_contents_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "svn_txdelta_window_handler_t *|struct svn_error_t *(**)(svn_txdelta_window_t *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,apr_int64_t,svn_fs_pack_notify_action_t,apr_pool_t *)|svn_fs_pack_notify_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,apr_uint64_t,svn_fs_upgrade_notify_action_t,apr_pool_t *)|svn_fs_upgrade_notify_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_long_long_p_apr_pool_t__void = {"_p_p_f_p_void_long_long_p_apr_pool_t__void", "void (**)(void *,long,long,apr_pool_t *)|svn_fs_hotcopy_notify_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,apr_pool_t *)|svn_fs_freeze_func_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "svn_fs_lock_callback_t *|struct svn_error_t *(**)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_struct_svn_error_t__void = {"_p_p_f_p_void_p_struct_svn_error_t__void", "void (**)(void *,struct svn_error_t *)|svn_fs_warning_callback_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t", "svn_fs_get_locks_callback_t *|struct svn_error_t *(**)(void *,svn_lock_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_checksum_t = {"_p_p_svn_checksum_t", "struct svn_checksum_t **|svn_checksum_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_access_t = {"_p_p_svn_fs_access_t", "struct svn_fs_access_t **|svn_fs_access_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_history_t = {"_p_p_svn_fs_history_t", "struct svn_fs_history_t **|svn_fs_history_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_id_t = {"_p_p_svn_fs_id_t", "struct svn_fs_id_t **|svn_fs_id_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_fs_info_placeholder_t = {"_p_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t **|svn_fs_info_placeholder_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_root_t = {"_p_p_svn_fs_root_t", "struct svn_fs_root_t **|svn_fs_root_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_t = {"_p_p_svn_fs_t", "struct svn_fs_t **|svn_fs_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_txn_t = {"_p_p_svn_fs_txn_t", "struct svn_fs_txn_t **|svn_fs_txn_t **", 0, 0, (void*)0, 0};
@@ -12151,6 +14513,7 @@ static swig_type_info _swigt__p_p_svn_lock_t = {"_p_p_svn_lock_t", "struct svn_l
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_txdelta_stream_t = {"_p_p_svn_txdelta_stream_t", "struct svn_txdelta_stream_t **|svn_txdelta_stream_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -12169,13 +14532,19 @@ static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "st
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -12183,6 +14552,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -12225,13 +14595,17 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_apr_int32_t,
&_swigt__p_apr_int64_t,
&_swigt__p_apr_pool_t,
+ &_swigt__p_apr_uint64_t,
&_swigt__p_char,
&_swigt__p_f_long_p_void_p_apr_pool_t__void,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_long_long_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_struct_svn_error_t__void,
&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_int,
@@ -12243,13 +14617,17 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
&_swigt__p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_long_long_p_apr_pool_t__void,
&_swigt__p_p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_struct_svn_error_t__void,
&_swigt__p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_svn_checksum_t,
&_swigt__p_p_svn_fs_access_t,
&_swigt__p_p_svn_fs_history_t,
&_swigt__p_p_svn_fs_id_t,
+ &_swigt__p_p_svn_fs_info_placeholder_t,
&_swigt__p_p_svn_fs_root_t,
&_swigt__p_p_svn_fs_t,
&_swigt__p_p_svn_fs_txn_t,
@@ -12257,6 +14635,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
&_swigt__p_p_svn_txdelta_stream_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -12275,13 +14654,19 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_config_t,
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -12289,6 +14674,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -12331,13 +14717,17 @@ static swig_cast_info _swigc__p_apr_hash_t[] = { {&_swigt__p_apr_hash_t, 0, 0,
static swig_cast_info _swigc__p_apr_int32_t[] = { {&_swigt__p_apr_int32_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int64_t[] = { {&_swigt__p_apr_int64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_pool_t[] = { {&_swigt__p_apr_pool_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_apr_uint64_t[] = { {&_swigt__p_apr_uint64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_long_p_void_p_apr_pool_t__void[] = { {&_swigt__p_f_long_p_void_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_long_long_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_long_long_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_struct_svn_error_t__void[] = { {&_swigt__p_f_p_void_p_struct_svn_error_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -12349,13 +14739,17 @@ static swig_cast_info _swigc__p_p_f_long_p_void_p_apr_pool_t__void[] = { {&_swi
static swig_cast_info _swigc__p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_long_long_p_apr_pool_t__void[] = { {&_swigt__p_p_f_p_void_long_long_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_struct_svn_error_t__void[] = { {&_swigt__p_p_f_p_void_p_struct_svn_error_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_checksum_t[] = { {&_swigt__p_p_svn_checksum_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_access_t[] = { {&_swigt__p_p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_history_t[] = { {&_swigt__p_p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_id_t[] = { {&_swigt__p_p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_fs_info_placeholder_t[] = { {&_swigt__p_p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_root_t[] = { {&_swigt__p_p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_t[] = { {&_swigt__p_p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_txn_t[] = { {&_swigt__p_p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -12363,6 +14757,7 @@ static swig_cast_info _swigc__p_p_svn_lock_t[] = { {&_swigt__p_p_svn_lock_t, 0,
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_txdelta_stream_t[] = { {&_swigt__p_p_svn_txdelta_stream_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -12381,13 +14776,19 @@ static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -12395,6 +14796,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -12437,13 +14839,17 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_apr_int32_t,
_swigc__p_apr_int64_t,
_swigc__p_apr_pool_t,
+ _swigc__p_apr_uint64_t,
_swigc__p_char,
_swigc__p_f_long_p_void_p_apr_pool_t__void,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_long_long_p_apr_pool_t__void,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_struct_svn_error_t__void,
_swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_int,
@@ -12455,13 +14861,17 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_swigc__p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_long_long_p_apr_pool_t__void,
_swigc__p_p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_struct_svn_error_t__void,
_swigc__p_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_svn_checksum_t,
_swigc__p_p_svn_fs_access_t,
_swigc__p_p_svn_fs_history_t,
_swigc__p_p_svn_fs_id_t,
+ _swigc__p_p_svn_fs_info_placeholder_t,
_swigc__p_p_svn_fs_root_t,
_swigc__p_p_svn_fs_t,
_swigc__p_p_svn_fs_txn_t,
@@ -12469,6 +14879,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
_swigc__p_p_svn_txdelta_stream_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -12487,13 +14898,19 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_config_t,
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -12501,6 +14918,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -12549,18 +14967,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -12570,17 +14988,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -12643,7 +15061,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -13220,21 +15638,33 @@ SWIG_init(void) {
SWIG_InstallConstants(d,swig_const_table);
+ SWIG_Python_SetConstant(d, "SVN_FS_TYPE_BDB",SWIG_FromCharPtr("bdb"));
+ SWIG_Python_SetConstant(d, "SVN_FS_TYPE_FSFS",SWIG_FromCharPtr("fsfs"));
+ SWIG_Python_SetConstant(d, "SVN_FS_TYPE_FSX",SWIG_FromCharPtr("fsx"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_BDB_TXN_NOSYNC",SWIG_FromCharPtr("bdb-txn-nosync"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE",SWIG_FromCharPtr("bdb-log-autoremove"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_CACHE_DELTAS",SWIG_FromCharPtr("fsfs-cache-deltas"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS",SWIG_FromCharPtr("fsfs-cache-fulltexts"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_CACHE_REVPROPS",SWIG_FromCharPtr("fsfs-cache-revprops"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_CACHE_NS",SWIG_FromCharPtr("fsfs-cache-namespace"));
+ SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_BLOCK_READ",SWIG_FromCharPtr("fsfs-block-read"));
+ SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_SHARD_SIZE",SWIG_FromCharPtr("fsfs-shard-size"));
+ SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FSFS_LOG_ADDRESSING",SWIG_FromCharPtr("fsfs-log-addressing"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_FS_TYPE",SWIG_FromCharPtr("fs-type"));
- SWIG_Python_SetConstant(d, "SVN_FS_TYPE_BDB",SWIG_FromCharPtr("bdb"));
- SWIG_Python_SetConstant(d, "SVN_FS_TYPE_FSFS",SWIG_FromCharPtr("fsfs"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_PRE_1_4_COMPATIBLE",SWIG_FromCharPtr("pre-1.4-compatible"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_PRE_1_5_COMPATIBLE",SWIG_FromCharPtr("pre-1.5-compatible"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_PRE_1_6_COMPATIBLE",SWIG_FromCharPtr("pre-1.6-compatible"));
SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_PRE_1_8_COMPATIBLE",SWIG_FromCharPtr("pre-1.8-compatible"));
+ SWIG_Python_SetConstant(d, "SVN_FS_CONFIG_COMPATIBLE_VERSION",SWIG_FromCharPtr("compatible-version"));
+ SWIG_Python_SetConstant(d, "svn_fs_upgrade_pack_revprops",SWIG_From_long((long)(svn_fs_upgrade_pack_revprops)));
+ SWIG_Python_SetConstant(d, "svn_fs_upgrade_cleanup_revprops",SWIG_From_long((long)(svn_fs_upgrade_cleanup_revprops)));
+ SWIG_Python_SetConstant(d, "svn_fs_upgrade_format_bumped",SWIG_From_long((long)(svn_fs_upgrade_format_bumped)));
+ SWIG_Python_SetConstant(d, "svn_fs_node_unrelated",SWIG_From_long((long)(svn_fs_node_unrelated)));
+ SWIG_Python_SetConstant(d, "svn_fs_node_unchanged",SWIG_From_long((long)(svn_fs_node_unchanged)));
+ SWIG_Python_SetConstant(d, "svn_fs_node_common_ancestor",SWIG_From_long((long)(svn_fs_node_common_ancestor)));
SWIG_Python_SetConstant(d, "SVN_FS_TXN_CHECK_OOD",SWIG_From_long((long)(0x00001)));
SWIG_Python_SetConstant(d, "SVN_FS_TXN_CHECK_LOCKS",SWIG_From_long((long)(0x00002)));
+ SWIG_Python_SetConstant(d, "SVN_FS_TXN_CLIENT_DATE",SWIG_From_long((long)(0x00004)));
SWIG_Python_SetConstant(d, "svn_fs_path_change_modify",SWIG_From_long((long)(svn_fs_path_change_modify)));
SWIG_Python_SetConstant(d, "svn_fs_path_change_add",SWIG_From_long((long)(svn_fs_path_change_add)));
SWIG_Python_SetConstant(d, "svn_fs_path_change_delete",SWIG_From_long((long)(svn_fs_path_change_delete)));
diff --git a/subversion/bindings/swig/python/svn_ra.c b/subversion/bindings/swig/python/svn_ra.c
index 153741c..8b0e32e 100644
--- a/subversion/bindings/swig/python/svn_ra.c
+++ b/subversion/bindings/swig/python/svn_ra.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2952,146 +2926,154 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t swig_types[9]
#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[10]
#define SWIGTYPE_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[13]
-#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[15]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[42]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[43]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[44]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[45]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[46]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[47]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[48]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[49]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[50]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[52]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[54]
-#define SWIGTYPE_p_int swig_types[55]
-#define SWIGTYPE_p_long swig_types[56]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[57]
-#define SWIGTYPE_p_p_apr_file_t swig_types[58]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[59]
-#define SWIGTYPE_p_p_char swig_types[60]
-#define SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void swig_types[61]
-#define SWIGTYPE_p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t swig_types[62]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[63]
-#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[64]
-#define SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[65]
-#define SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[66]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[67]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[68]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[69]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[70]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[71]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[72]
-#define SWIGTYPE_p_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[73]
-#define SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[74]
-#define SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[75]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[76]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[77]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[78]
-#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[79]
-#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[80]
-#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[81]
-#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[82]
-#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[83]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[84]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[85]
-#define SWIGTYPE_p_p_svn_string_t swig_types[86]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[87]
-#define SWIGTYPE_p_p_void swig_types[88]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[89]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[90]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[91]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[92]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[93]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[94]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[95]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[96]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[97]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[98]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[99]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[100]
-#define SWIGTYPE_p_svn_checksum_t swig_types[101]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[102]
-#define SWIGTYPE_p_svn_config_t swig_types[103]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[104]
-#define SWIGTYPE_p_svn_depth_t swig_types[105]
-#define SWIGTYPE_p_svn_dirent_t swig_types[106]
-#define SWIGTYPE_p_svn_errno_t swig_types[107]
-#define SWIGTYPE_p_svn_error_t swig_types[108]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[109]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[110]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[111]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[112]
-#define SWIGTYPE_p_svn_lock_t swig_types[113]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[114]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[115]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[116]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[117]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[118]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[119]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[120]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[121]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[122]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[123]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[124]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[125]
-#define SWIGTYPE_p_svn_prop_kind swig_types[126]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[127]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[128]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[129]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[130]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[131]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[132]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[133]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_t swig_types[135]
-#define SWIGTYPE_p_svn_string_t swig_types[136]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[137]
-#define SWIGTYPE_p_svn_tristate_t swig_types[138]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[139]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[140]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[141]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[142]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[143]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[144]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[145]
-#define SWIGTYPE_p_svn_version_t swig_types[146]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[147]
-#define SWIGTYPE_p_unsigned_long swig_types[148]
-#define SWIGTYPE_p_void swig_types[149]
-static swig_type_info *swig_types[151];
-static swig_module_info swig_module = {swig_types, 150, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[13]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[44]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[45]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[46]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[47]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[48]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[49]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[50]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[51]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[53]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[57]
+#define SWIGTYPE_p_int swig_types[58]
+#define SWIGTYPE_p_long swig_types[59]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[60]
+#define SWIGTYPE_p_p_apr_file_t swig_types[61]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[62]
+#define SWIGTYPE_p_p_char swig_types[63]
+#define SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void swig_types[64]
+#define SWIGTYPE_p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t swig_types[65]
+#define SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[66]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[67]
+#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[68]
+#define SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[69]
+#define SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[70]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char__int swig_types[71]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[72]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[73]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[74]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[75]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[76]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[77]
+#define SWIGTYPE_p_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[78]
+#define SWIGTYPE_p_p_f_p_void_p_void__void swig_types[79]
+#define SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[80]
+#define SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[81]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[82]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[83]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[84]
+#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[85]
+#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[86]
+#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[87]
+#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[88]
+#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[89]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[90]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[91]
+#define SWIGTYPE_p_p_svn_string_t swig_types[92]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[93]
+#define SWIGTYPE_p_p_void swig_types[94]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[95]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[96]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[97]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[98]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[99]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[100]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[101]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[102]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[103]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[104]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[105]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[106]
+#define SWIGTYPE_p_svn_checksum_t swig_types[107]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[108]
+#define SWIGTYPE_p_svn_config_t swig_types[109]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[110]
+#define SWIGTYPE_p_svn_depth_t swig_types[111]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[112]
+#define SWIGTYPE_p_svn_dirent_t swig_types[113]
+#define SWIGTYPE_p_svn_errno_t swig_types[114]
+#define SWIGTYPE_p_svn_error_t swig_types[115]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[116]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[117]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[118]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[119]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[120]
+#define SWIGTYPE_p_svn_lock_t swig_types[121]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[122]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[123]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[124]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[125]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[126]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[127]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[128]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[129]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[130]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[131]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[132]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[133]
+#define SWIGTYPE_p_svn_prop_kind swig_types[134]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[135]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[136]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[137]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[138]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[139]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[140]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[141]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[142]
+#define SWIGTYPE_p_svn_stream_t swig_types[143]
+#define SWIGTYPE_p_svn_string_t swig_types[144]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[145]
+#define SWIGTYPE_p_svn_tristate_t swig_types[146]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[147]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[148]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[149]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[150]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[151]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[152]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[153]
+#define SWIGTYPE_p_svn_version_t swig_types[154]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[155]
+#define SWIGTYPE_p_unsigned_long swig_types[156]
+#define SWIGTYPE_p_void swig_types[157]
+static swig_type_info *swig_types[159];
+static swig_module_info swig_module = {swig_types, 158, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3115,7 +3097,7 @@ static swig_module_info swig_module = {swig_types, 150, 0, 0, 0, 0};
#endif
#define SWIG_name "_ra"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3429,6 +3411,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3751,6 +3745,21 @@ static svn_error_t * svn_ra_invoke_replay_revfinish_callback(
return _obj(revision, replay_baton, editor, edit_baton, rev_props, pool);
}
+static svn_boolean_t svn_ra_invoke_check_tunnel_func(
+ svn_ra_check_tunnel_func_t _obj, void *tunnel_baton, const char *tunnel_name) {
+ return _obj(tunnel_baton, tunnel_name);
+}
+
+static void svn_ra_invoke_close_tunnel_func(
+ svn_ra_close_tunnel_func_t _obj, void *close_baton, void *tunnel_baton) {
+ _obj(close_baton, tunnel_baton);
+}
+
+static svn_error_t * svn_ra_invoke_open_tunnel_func(
+ svn_ra_open_tunnel_func_t _obj, 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) {
+ return _obj(request, response, close_func, close_baton, tunnel_baton, tunnel_name, user, hostname, port, cancel_func, cancel_baton, pool);
+}
+
static svn_error_t * svn_ra_invoke_init_func(
svn_ra_init_func_t _obj, int abi_version, apr_pool_t *pool, apr_hash_t *hash) {
return _obj(abi_version, pool, hash);
@@ -3773,7 +3782,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_version(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3790,7 +3799,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_set_path_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter3_t_set_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3817,7 +3826,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_set_path_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter3_t_set_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3839,7 +3848,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_delete_path_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter3_t_delete_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3866,7 +3875,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_delete_path_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter3_t_delete_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3888,7 +3897,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_link_path_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter3_t_link_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3915,7 +3924,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_link_path_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter3_t_link_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3937,7 +3946,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_finish_report_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter3_t_finish_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3964,7 +3973,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_finish_report_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter3_t_finish_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3986,7 +3995,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_abort_report_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter3_t_abort_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4013,7 +4022,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_t_abort_report_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter3_t_abort_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4039,7 +4048,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_reporter3_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4054,7 +4063,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_reporter3_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_reporter3_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4090,7 +4099,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_set_path_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter2_t_set_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4117,7 +4126,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_set_path_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter2_t_set_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4139,7 +4148,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_delete_path_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter2_t_delete_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4166,7 +4175,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_delete_path_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter2_t_delete_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4188,7 +4197,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_link_path_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter2_t_link_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4215,7 +4224,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_link_path_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter2_t_link_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4237,7 +4246,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_finish_report_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter2_t_finish_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4264,7 +4273,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_finish_report_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter2_t_finish_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4286,7 +4295,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_abort_report_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter2_t_abort_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4313,7 +4322,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_t_abort_report_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter2_t_abort_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4339,7 +4348,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_reporter2_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4354,7 +4363,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_reporter2_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_reporter2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4390,7 +4399,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_set_path_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter_t_set_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4417,7 +4426,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_set_path_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter_t_set_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4439,7 +4448,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_delete_path_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter_t_delete_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4466,7 +4475,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_delete_path_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter_t_delete_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4488,7 +4497,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_link_path_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter_t_link_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4515,7 +4524,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_link_path_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter_t_link_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4537,7 +4546,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_finish_report_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter_t_finish_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4564,7 +4573,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_finish_report_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter_t_finish_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4586,7 +4595,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_abort_report_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_reporter_t_abort_report_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4613,7 +4622,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_t_abort_report_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_reporter_t_abort_report_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4639,7 +4648,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_reporter_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_reporter_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_reporter_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4654,7 +4663,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_reporter_t(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_reporter_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4690,7 +4699,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_open_tmp_file_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_open_tmp_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4717,7 +4726,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_open_tmp_file_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_open_tmp_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4739,13 +4748,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_auth_baton_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_auth_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
+ arg2 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4766,13 +4775,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_auth_baton_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_auth_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_auth_baton_t *) ((arg1)->auth_baton);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4789,14 +4798,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_prop_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_get_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_get_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4818,7 +4827,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_prop_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_get_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4840,7 +4849,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_prop_get(PyObject *SWIGUNU
SWIG_fail;
}
*tmp = (svn_ra_get_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -4859,14 +4868,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_set_wc_prop_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_set_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_set_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4888,7 +4897,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_set_wc_prop_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_set_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4910,7 +4919,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_set_wc_prop_get(PyObject *SWIGUNU
SWIG_fail;
}
*tmp = (svn_ra_set_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -4929,14 +4938,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_push_wc_prop_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_push_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_push_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4958,7 +4967,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_push_wc_prop_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_push_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4980,7 +4989,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_push_wc_prop_get(PyObject *SWIGUN
SWIG_fail;
}
*tmp = (svn_ra_push_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -4999,14 +5008,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_invalidate_wc_props_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_invalidate_wc_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_invalidate_wc_props_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5028,7 +5037,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_invalidate_wc_props_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_invalidate_wc_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5050,7 +5059,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_invalidate_wc_props_get(PyObject
SWIG_fail;
}
*tmp = (svn_ra_invalidate_wc_props_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5069,14 +5078,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_func_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_progress_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_progress_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5098,7 +5107,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_func_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_progress_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5120,7 +5129,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_func_get(PyObject *SWIGU
SWIG_fail;
}
*tmp = (svn_ra_progress_notify_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
py_pool, args);
}
}
@@ -5139,7 +5148,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_baton_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_progress_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5168,7 +5177,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_baton_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_progress_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5193,7 +5202,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_progress_baton_get(PyObject *SWIG
/* We don't know the type of this reference, so we'll have to
* treat it as an opaque void pointer.
*/
- resultobj = svn_swig_NewPointerObj(result, SWIGTYPE_p_void,
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
_global_py_pool, args);
}
}
@@ -5214,14 +5223,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_cancel_func_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_cancel_func_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_cancel_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5243,7 +5252,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_cancel_func_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_cancel_func_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5265,7 +5274,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_cancel_func_get(PyObject *SWIGUNU
SWIG_fail;
}
*tmp = (svn_cancel_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void__p_svn_error_t,
py_pool, args);
}
}
@@ -5284,14 +5293,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_client_string_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_get_client_string_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_get_client_string_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5313,7 +5322,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_client_string_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_get_client_string_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5335,7 +5344,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_client_string_get(PyObject *S
SWIG_fail;
}
*tmp = (svn_ra_get_client_string_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5354,14 +5363,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_contents_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_get_wc_contents_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_get_wc_contents_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5383,7 +5392,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_contents_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_get_wc_contents_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5405,7 +5414,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_get_wc_contents_get(PyObject *SWI
SWIG_fail;
}
*tmp = (svn_ra_get_wc_contents_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5415,6 +5424,221 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_check_tunnel_func_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_check_tunnel_func_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_ra_check_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char__int, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_check_tunnel_func_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_ra_check_tunnel_func_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_check_tunnel_func_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ {
+ PyObject *py_pool = NULL;
+ apr_pool_t *pool = NULL;
+
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &py_pool, &pool))
+ SWIG_fail;
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ svn_ra_check_tunnel_func_t * tmp = apr_palloc(pool, sizeof(svn_ra_check_tunnel_func_t));
+ if (tmp == NULL) {
+ SWIG_fail;
+ }
+ *tmp = (svn_ra_check_tunnel_func_t) result;
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char__int,
+ py_pool, args);
+ }
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_open_tunnel_func_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_open_tunnel_func_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_ra_open_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg2 = *tmp;
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_open_tunnel_func_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_ra_open_tunnel_func_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_open_tunnel_func_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ {
+ PyObject *py_pool = NULL;
+ apr_pool_t *pool = NULL;
+
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &py_pool, &pool))
+ SWIG_fail;
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ svn_ra_open_tunnel_func_t * tmp = apr_palloc(pool, sizeof(svn_ra_open_tunnel_func_t));
+ if (tmp == NULL) {
+ SWIG_fail;
+ }
+ *tmp = (svn_ra_open_tunnel_func_t) result;
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
+ py_pool, args);
+ }
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_tunnel_baton_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks2_t_tunnel_baton_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_t_tunnel_baton_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ void *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks2_t_tunnel_baton_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (void *) ((arg1)->tunnel_baton);
+ {
+ PyObject *ownerObj = obj0;
+ PyObject *members = PyObject_GetAttrString(ownerObj, "_members");
+
+ resultobj = NULL;
+ if (members != NULL) {
+ resultobj = PyDict_GetItemString(members, "tunnel_baton");
+ Py_XINCREF(resultobj);
+ Py_DECREF(members);
+ }
+
+ if (resultobj == NULL) {
+ if (result == NULL) {
+ resultobj = Py_None;
+ Py_INCREF(resultobj);
+ } else {
+ /* We don't know the type of this reference, so we'll have to
+ * treat it as an opaque void pointer.
+ */
+ resultobj = svn_swig_py_new_pointer_obj(result, SWIGTYPE_p_void,
+ _global_py_pool, args);
+ }
+ }
+
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_new_svn_ra_callbacks2_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_ra_callbacks2_t *result = 0 ;
@@ -5428,7 +5652,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_callbacks2_t(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_callbacks2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_callbacks2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5443,7 +5667,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_callbacks2_t(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_callbacks2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5479,7 +5703,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_open_tmp_file_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_open_tmp_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5506,7 +5730,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_open_tmp_file_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_open_tmp_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5528,13 +5752,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_auth_baton_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_auth_baton_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_auth_baton_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
+ arg2 = (svn_auth_baton_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_auth_baton_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5555,13 +5779,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_auth_baton_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_auth_baton_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_auth_baton_t *) ((arg1)->auth_baton);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_auth_baton_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5578,14 +5802,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_get_wc_prop_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_get_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_get_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5607,7 +5831,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_get_wc_prop_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_get_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5629,7 +5853,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_get_wc_prop_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_ra_get_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5648,14 +5872,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_set_wc_prop_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_set_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_set_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5677,7 +5901,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_set_wc_prop_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_set_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5699,7 +5923,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_set_wc_prop_get(PyObject *SWIGUNUS
SWIG_fail;
}
*tmp = (svn_ra_set_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5718,14 +5942,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_push_wc_prop_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_push_wc_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_push_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5747,7 +5971,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_push_wc_prop_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_push_wc_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5769,7 +5993,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_push_wc_prop_get(PyObject *SWIGUNU
SWIG_fail;
}
*tmp = (svn_ra_push_wc_prop_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5788,14 +6012,14 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_invalidate_wc_props_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_callbacks_t_invalidate_wc_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_ra_invalidate_wc_props_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5817,7 +6041,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_invalidate_wc_props_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_callbacks_t_invalidate_wc_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5839,7 +6063,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_t_invalidate_wc_props_get(PyObject *
SWIG_fail;
}
*tmp = (svn_ra_invalidate_wc_props_func_t) result;
- resultobj = svn_swig_NewPointerObj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ resultobj = svn_swig_py_new_pointer_obj(tmp, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
py_pool, args);
}
}
@@ -5862,7 +6086,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_callbacks_t(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_callbacks_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_callbacks_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5877,7 +6101,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_callbacks_t(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_callbacks_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6000,7 +6224,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_create_callbacks(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_callbacks2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_callbacks2_t,
_global_py_pool, args))
;
@@ -6092,7 +6316,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_open4(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -6194,7 +6418,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_open3(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -6282,7 +6506,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_open2(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -6323,7 +6547,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_open(PyObject *SWIGUNUSEDPARM(self), PyObject
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_ra_open",&arg2,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj1);
+ arg3 = (svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6377,7 +6601,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_open(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_session_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_session_t,
_global_py_pool, args))
;
@@ -6411,7 +6635,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reparent(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_reparent",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6474,7 +6698,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_session_url(PyObject *SWIGUNUSEDPARM(self)
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_session_url",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6551,7 +6775,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_path_relative_to_session(PyObject *SWIGUNU
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_get_path_relative_to_session",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6628,7 +6852,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_path_relative_to_root(PyObject *SWIGUNUSED
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_get_path_relative_to_root",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6705,7 +6929,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_latest_revnum(PyObject *SWIGUNUSEDPARM(sel
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_latest_revnum",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6777,7 +7001,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_dated_revision(PyObject *SWIGUNUSEDPARM(se
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_get_dated_revision",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6852,7 +7076,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_change_rev_prop2(PyObject *SWIGUNUSEDPARM(self
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_ra_change_rev_prop2",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6864,7 +7088,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_change_rev_prop2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg4 = (svn_string_t **)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj3);
+ arg4 = (svn_string_t **)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6956,7 +7180,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_change_rev_prop(PyObject *SWIGUNUSEDPARM(self)
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_ra_change_rev_prop",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7040,7 +7264,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_rev_proplist(PyObject *SWIGUNUSEDPARM(self), P
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_rev_proplist",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7115,7 +7339,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_rev_prop(PyObject *SWIGUNUSEDPARM(self), PyObj
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_ra_rev_prop",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7209,7 +7433,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor3(PyObject *SWIGUNUSEDPARM(se
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|O:svn_ra_get_commit_editor3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7269,13 +7493,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor3(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7322,7 +7546,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor2(PyObject *SWIGUNUSEDPARM(se
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_ra_get_commit_editor2",&obj0,&arg4,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7369,13 +7593,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor2(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7422,7 +7646,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor(PyObject *SWIGUNUSEDPARM(sel
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_ra_get_commit_editor",&obj0,&arg4,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7469,13 +7693,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_commit_editor(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7520,7 +7744,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_file(PyObject *SWIGUNUSEDPARM(self), PyObj
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_ra_get_file",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7613,7 +7837,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_dir2(PyObject *SWIGUNUSEDPARM(self), PyObj
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_ra_get_dir2",&obj0,&arg5,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7716,7 +7940,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_dir(PyObject *SWIGUNUSEDPARM(self), PyObje
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_ra_get_dir",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7811,7 +8035,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_mergeinfo(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|O:svn_ra_get_mergeinfo",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7935,7 +8159,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update3(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOOO|OO:svn_ra_do_update3",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7965,7 +8189,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update3(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg9 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
+ arg9 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8014,13 +8238,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update3(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8076,7 +8300,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update2(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOO|O:svn_ra_do_update2",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8100,7 +8324,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg8 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg8 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8141,13 +8365,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update2(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8195,7 +8419,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update(PyObject *SWIGUNUSEDPARM(self), PyOb
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_ra_do_update",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8213,7 +8437,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg7 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
+ arg7 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8254,13 +8478,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_update(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8319,7 +8543,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch3(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOsOOOO|OO:svn_ra_do_switch3",&obj0,&obj1,&arg5,&obj3,&arg7,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8349,7 +8573,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch3(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg10 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
+ arg10 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8398,13 +8622,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch3(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8459,7 +8683,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch2(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOsOO|O:svn_ra_do_switch2",&obj0,&obj1,&arg5,&obj3,&arg7,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8477,7 +8701,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg8 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg8 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8518,13 +8742,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch2(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8573,7 +8797,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch(PyObject *SWIGUNUSEDPARM(self), PyOb
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOsOO|O:svn_ra_do_switch",&obj0,&obj1,&arg5,&obj3,&arg7,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8591,7 +8815,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg8 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg8 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8632,13 +8856,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_switch(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8686,7 +8910,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status2(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_ra_do_status2",&obj0,&arg4,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8704,7 +8928,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg7 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
+ arg7 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8745,13 +8969,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status2(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8799,7 +9023,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status(PyObject *SWIGUNUSEDPARM(self), PyOb
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_ra_do_status",&obj0,&arg4,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8817,7 +9041,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg7 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
+ arg7 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8858,13 +9082,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_status(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8917,7 +9141,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff3(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOsOO|O:svn_ra_do_diff3",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&arg9,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8947,7 +9171,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff3(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg10 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
+ arg10 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8988,13 +9212,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff3(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter3_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9047,7 +9271,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff2(PyObject *SWIGUNUSEDPARM(self), PyObj
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOsOO|O:svn_ra_do_diff2",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&arg9,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9077,7 +9301,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff2(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg10 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
+ arg10 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9118,13 +9342,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff2(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9175,7 +9399,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff(PyObject *SWIGUNUSEDPARM(self), PyObje
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOsOO|O:svn_ra_do_diff",&obj0,&obj1,&arg5,&obj3,&obj4,&arg8,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9199,7 +9423,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg9 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
+ arg9 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9240,13 +9464,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_do_diff(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_ra_reporter2_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -9298,7 +9522,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_log2(PyObject *SWIGUNUSEDPARM(self), PyObj
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOO|O:svn_ra_get_log2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9358,7 +9582,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_log2(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_fail;
}
{
- arg10 = svn_swig_py_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg11 = obj9;
}
if (obj10) {
@@ -9431,7 +9655,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_log(PyObject *SWIGUNUSEDPARM(self), PyObje
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO|O:svn_ra_get_log",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9476,7 +9700,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_log(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg8 = svn_swig_py_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg9 = obj7;
}
if (obj8) {
@@ -9541,7 +9765,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_check_path(PyObject *SWIGUNUSEDPARM(self), PyO
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_ra_check_path",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9619,7 +9843,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_stat(PyObject *SWIGUNUSEDPARM(self), PyObject
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_ra_stat",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9658,7 +9882,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_stat(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_svn_dirent_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_svn_dirent_t,
_global_py_pool, args))
;
@@ -9694,7 +9918,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_uuid2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_uuid2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9770,7 +9994,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_uuid(PyObject *SWIGUNUSEDPARM(self), PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_uuid",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9846,7 +10070,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_repos_root2(PyObject *SWIGUNUSEDPARM(self)
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_repos_root2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9922,7 +10146,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_repos_root(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_ra_get_repos_root",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10003,7 +10227,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_locations(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_ra_get_locations",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10091,7 +10315,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_location_segments(PyObject *SWIGUNUSEDPARM
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_ra_get_location_segments",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10115,7 +10339,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_location_segments(PyObject *SWIGUNUSEDPARM
}
}
{
- arg6 = svn_swig_py_location_segment_receiver_func;
+ arg6 = (svn_location_segment_receiver_t) svn_swig_py_location_segment_receiver_func;
arg7 = obj5;
}
if (obj6) {
@@ -10184,7 +10408,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_file_revs2(PyObject *SWIGUNUSEDPARM(self),
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_ra_get_file_revs2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10209,7 +10433,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_file_revs2(PyObject *SWIGUNUSEDPARM(self),
}
{
svn_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10286,7 +10510,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_file_revs(PyObject *SWIGUNUSEDPARM(self),
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_ra_get_file_revs",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10304,7 +10528,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_file_revs(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg5 = svn_swig_py_ra_file_rev_handler_func;
+ arg5 = (svn_ra_file_rev_handler_t) svn_swig_py_ra_file_rev_handler_func;
arg6 = obj4;
}
if (obj5) {
@@ -10370,7 +10594,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_lock(PyObject *SWIGUNUSEDPARM(self), PyObject
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOzOO|O:svn_ra_lock",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10385,7 +10609,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_lock(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg5 = svn_swig_py_ra_lock_callback;
+ arg5 = (svn_ra_lock_callback_t) svn_swig_py_ra_lock_callback;
arg6 = obj4;
}
if (obj5) {
@@ -10450,7 +10674,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_unlock(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_ra_unlock",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10465,7 +10689,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_unlock(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg4 = svn_swig_py_ra_lock_callback;
+ arg4 = (svn_ra_lock_callback_t) svn_swig_py_ra_lock_callback;
arg5 = obj3;
}
if (obj4) {
@@ -10527,7 +10751,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_get_lock",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10560,7 +10784,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_lock_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_lock_t,
_global_py_pool, args))
;
@@ -10599,7 +10823,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_locks2(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_ra_get_locks2",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10678,7 +10902,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_locks(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_get_locks",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10761,7 +10985,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_replay_range(PyObject *SWIGUNUSEDPARM(self), P
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO|O:svn_ra_replay_range",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10792,7 +11016,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_replay_range(PyObject *SWIGUNUSEDPARM(self), P
}
{
svn_ra_replay_revstart_callback_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10800,7 +11024,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_replay_range(PyObject *SWIGUNUSEDPARM(self), P
}
{
svn_ra_replay_revfinish_callback_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10879,7 +11103,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_replay(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOO|O:svn_ra_replay",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10903,7 +11127,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_replay(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg5 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
+ arg5 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10980,7 +11204,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_deleted_rev(PyObject *SWIGUNUSEDPARM(self)
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_ra_get_deleted_rev",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11070,7 +11294,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_inherited_props(PyObject *SWIGUNUSEDPARM(s
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsO|OO:svn_ra_get_inherited_props",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11158,7 +11382,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_has_capability(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_ra_has_capability",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_session_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
+ arg1 = (svn_ra_session_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_session_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11358,7 +11582,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_name_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"Os:svn_ra_plugin_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11386,7 +11610,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_name_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11407,7 +11631,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_description_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_ra_plugin_t_description_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11435,7 +11659,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_description_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_description_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11457,7 +11681,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_open_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_open_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11484,7 +11708,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_open_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_open_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11506,7 +11730,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_latest_revnum_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_latest_revnum_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11533,7 +11757,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_latest_revnum_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_latest_revnum_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11555,7 +11779,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_dated_revision_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_dated_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11582,7 +11806,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_dated_revision_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_dated_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11604,7 +11828,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_change_rev_prop_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_change_rev_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11631,7 +11855,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_change_rev_prop_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_change_rev_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11653,7 +11877,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_rev_proplist_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_rev_proplist_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11680,7 +11904,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_rev_proplist_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_rev_proplist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11702,7 +11926,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_rev_prop_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_rev_prop_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11729,7 +11953,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_rev_prop_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_rev_prop_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11751,7 +11975,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_commit_editor_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_commit_editor_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11778,7 +12002,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_commit_editor_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_commit_editor_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11800,7 +12024,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_file_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_file_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11827,7 +12051,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_file_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11849,7 +12073,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_dir_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_dir_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11876,7 +12100,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_dir_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_dir_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11898,7 +12122,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_update_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_do_update_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11925,7 +12149,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_update_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_do_update_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11947,7 +12171,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_switch_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_do_switch_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11974,7 +12198,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_switch_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_do_switch_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11996,7 +12220,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_status_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_do_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12023,7 +12247,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_status_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_do_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12045,7 +12269,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_diff_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_do_diff_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12072,7 +12296,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_do_diff_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_do_diff_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12094,7 +12318,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_log_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_log_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12121,7 +12345,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_log_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_log_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12143,7 +12367,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_check_path_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_check_path_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12170,7 +12394,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_check_path_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_check_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12192,7 +12416,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_uuid_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_uuid_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12219,7 +12443,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_uuid_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_uuid_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12241,7 +12465,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_repos_root_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_repos_root_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12268,7 +12492,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_repos_root_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_repos_root_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12290,7 +12514,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_locations_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_locations_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12317,7 +12541,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_locations_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_locations_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12339,7 +12563,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_file_revs_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_file_revs_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12366,7 +12590,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_file_revs_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_file_revs_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12388,7 +12612,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_version_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_plugin_t_get_version_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12415,7 +12639,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_t_get_version_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_t_get_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12441,7 +12665,7 @@ SWIGINTERN PyObject *_wrap_new_svn_ra_plugin_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_ra_plugin_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_ra_plugin_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12456,7 +12680,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_ra_plugin_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_ra_plugin_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (struct svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12527,7 +12751,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_init_ra_libs(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -12599,7 +12823,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_get_ra_library(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_ra_plugin_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_ra_plugin_t,
_global_py_pool, args))
;
@@ -12649,7 +12873,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_invoke_set_path(PyObject *SWIGUNUSED
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOz|O:svn_ra_reporter3_invoke_set_path",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&arg7,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12738,7 +12962,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_invoke_delete_path(PyObject *SWIGUNU
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_ra_reporter3_invoke_delete_path",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12817,7 +13041,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_invoke_link_path(PyObject *SWIGUNUSE
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOOOz|O:svn_ra_reporter3_invoke_link_path",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&arg8,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12905,7 +13129,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_invoke_finish_report(PyObject *SWIGU
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter3_invoke_finish_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12975,7 +13199,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter3_invoke_abort_report(PyObject *SWIGUN
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter3_invoke_abort_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13051,7 +13275,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_invoke_set_path(PyObject *SWIGUNUSED
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOOz|O:svn_ra_reporter2_invoke_set_path",&obj0,&obj1,&arg3,&obj3,&obj4,&arg6,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13134,7 +13358,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_invoke_delete_path(PyObject *SWIGUNU
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_ra_reporter2_invoke_delete_path",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13211,7 +13435,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_invoke_link_path(PyObject *SWIGUNUSE
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOOz|O:svn_ra_reporter2_invoke_link_path",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&arg7,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13293,7 +13517,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_invoke_finish_report(PyObject *SWIGU
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter2_invoke_finish_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13363,7 +13587,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter2_invoke_abort_report(PyObject *SWIGUN
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter2_invoke_abort_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13438,7 +13662,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_invoke_set_path(PyObject *SWIGUNUSEDP
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_ra_reporter_invoke_set_path",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13521,7 +13745,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_invoke_delete_path(PyObject *SWIGUNUS
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_ra_reporter_invoke_delete_path",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13597,7 +13821,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_invoke_link_path(PyObject *SWIGUNUSED
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOO|O:svn_ra_reporter_invoke_link_path",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13679,7 +13903,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_invoke_finish_report(PyObject *SWIGUN
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter_invoke_finish_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13749,7 +13973,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_reporter_invoke_abort_report(PyObject *SWIGUNU
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_reporter_invoke_abort_report",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
+ arg1 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13822,7 +14046,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_invoke_open_tmp_file(PyObject *SWIG
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_callbacks2_invoke_open_tmp_file",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_ra_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13863,7 +14087,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks2_invoke_open_tmp_file(PyObject *SWIG
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -13901,7 +14125,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_invoke_open_tmp_file(PyObject *SWIGU
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_callbacks_invoke_open_tmp_file",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13942,7 +14166,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_callbacks_invoke_open_tmp_file(PyObject *SWIGU
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -13985,13 +14209,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_open(PyObject *SWIGUNUSEDPARM(se
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_ra_plugin_invoke_open",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_ra_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj2);
+ arg4 = (svn_ra_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_ra_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14045,7 +14269,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_open(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -14084,7 +14308,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_latest_revnum(PyObject *SWIG
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_plugin_invoke_get_latest_revnum",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14166,7 +14390,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_dated_revision(PyObject *SWI
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_ra_plugin_invoke_get_dated_revision",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14249,7 +14473,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_change_rev_prop(PyObject *SWIGUN
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOsO|O:svn_ra_plugin_invoke_change_rev_prop",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14343,7 +14567,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_rev_proplist(PyObject *SWIGUNUSE
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_ra_plugin_invoke_rev_proplist",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14428,7 +14652,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_rev_prop(PyObject *SWIGUNUSEDPAR
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOs|O:svn_ra_plugin_invoke_rev_prop",&obj0,&obj1,&obj2,&arg4,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14527,7 +14751,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_commit_editor(PyObject *SWIG
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_ra_plugin_invoke_get_commit_editor",&obj0,&obj1,&arg5,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14572,13 +14796,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_commit_editor(PyObject *SWIG
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -14625,7 +14849,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_file(PyObject *SWIGUNUSEDPAR
arg7 = &temp7;
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_ra_plugin_invoke_get_file",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14726,7 +14950,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_dir(PyObject *SWIGUNUSEDPARM
arg7 = &temp7;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_ra_plugin_invoke_get_dir",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14835,7 +15059,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_update(PyObject *SWIGUNUSEDPA
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOOO|O:svn_ra_plugin_invoke_do_update",&obj0,&obj1,&obj2,&arg6,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14861,7 +15085,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_update(PyObject *SWIGUNUSEDPA
}
}
{
- arg8 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg8 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14902,13 +15126,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_update(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -14959,7 +15183,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_switch(PyObject *SWIGUNUSEDPA
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOsOO|O:svn_ra_plugin_invoke_do_switch",&obj0,&obj1,&obj2,&arg6,&obj4,&arg8,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14985,7 +15209,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_switch(PyObject *SWIGUNUSEDPA
}
}
{
- arg9 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
+ arg9 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15026,13 +15250,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_switch(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15082,7 +15306,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_status(PyObject *SWIGUNUSEDPA
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOO|O:svn_ra_plugin_invoke_do_status",&obj0,&obj1,&arg5,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15108,7 +15332,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_status(PyObject *SWIGUNUSEDPA
}
}
{
- arg8 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg8 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15149,13 +15373,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_status(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15208,7 +15432,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_diff(PyObject *SWIGUNUSEDPARM
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOOsOO|O:svn_ra_plugin_invoke_do_diff",&obj0,&obj1,&obj2,&arg6,&obj4,&obj5,&arg9,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15240,7 +15464,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_diff(PyObject *SWIGUNUSEDPARM
}
}
{
- arg10 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
+ arg10 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15281,13 +15505,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_do_diff(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_ra_reporter_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15335,7 +15559,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_log(PyObject *SWIGUNUSEDPARM
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO|O:svn_ra_plugin_invoke_get_log",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15382,7 +15606,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_log(PyObject *SWIGUNUSEDPARM
}
}
{
- arg8 = svn_swig_py_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg9 = obj7;
}
if (obj8) {
@@ -15449,7 +15673,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_check_path(PyObject *SWIGUNUSEDP
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_ra_plugin_invoke_check_path",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15534,7 +15758,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_uuid(PyObject *SWIGUNUSEDPAR
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_plugin_invoke_get_uuid",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15620,7 +15844,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_repos_root(PyObject *SWIGUNU
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_plugin_invoke_get_repos_root",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15711,7 +15935,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_locations(PyObject *SWIGUNUS
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_ra_plugin_invoke_get_locations",&obj0,&obj1,&arg4,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15807,7 +16031,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_file_revs(PyObject *SWIGUNUS
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_ra_plugin_invoke_get_file_revs",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15833,7 +16057,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_file_revs(PyObject *SWIGUNUS
}
}
{
- arg6 = svn_swig_py_ra_file_rev_handler_func;
+ arg6 = (svn_ra_file_rev_handler_t) svn_swig_py_ra_file_rev_handler_func;
arg7 = obj5;
}
if (obj6) {
@@ -15883,7 +16107,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_version(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_ra_plugin_invoke_get_version",&obj0)) SWIG_fail;
{
- arg1 = (svn_ra_plugin_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
+ arg1 = (svn_ra_plugin_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_ra_plugin_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15896,7 +16120,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_plugin_invoke_get_version(PyObject *SWIGUNUSED
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15928,7 +16152,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_wc_prop_func(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OOss|O:svn_ra_invoke_get_wc_prop_func",&obj0,&obj1,&arg3,&arg4,&obj4)) SWIG_fail;
{
svn_ra_get_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16018,7 +16242,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_set_wc_prop_func(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OOssO|O:svn_ra_invoke_set_wc_prop_func",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5)) SWIG_fail;
{
svn_ra_set_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16108,7 +16332,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_push_wc_prop_func(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OOssO|O:svn_ra_invoke_push_wc_prop_func",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5)) SWIG_fail;
{
svn_ra_push_wc_prop_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16195,7 +16419,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_invalidate_wc_props_func(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OOss|O:svn_ra_invoke_invalidate_wc_props_func",&obj0,&obj1,&arg3,&arg4,&obj4)) SWIG_fail;
{
svn_ra_invalidate_wc_props_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16272,7 +16496,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_wc_contents_func(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_ra_invoke_get_wc_contents_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_ra_get_wc_contents_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16287,7 +16511,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_wc_contents_func(PyObject *SWIGUNUS
}
}
{
- arg4 = (svn_checksum_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj2);
+ arg4 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16320,7 +16544,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_wc_contents_func(PyObject *SWIGUNUS
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -16352,7 +16576,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_latest_revnum_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_ra_invoke_get_latest_revnum_func",&obj0,&obj1)) SWIG_fail;
{
svn_ra_get_latest_revnum_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_revnum_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_svn_revnum_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16419,7 +16643,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_get_client_string_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_ra_invoke_get_client_string_func",&obj0,&obj1,&obj2)) SWIG_fail;
{
svn_ra_get_client_string_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16525,7 +16749,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_file_rev_handler(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_ra_invoke_file_rev_handler",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_ra_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16546,13 +16770,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_file_rev_handler(PyObject *SWIGUNUSEDPA
}
}
{
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ arg8 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16585,13 +16809,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_file_rev_handler(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16634,7 +16858,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_lock_callback(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_ra_invoke_lock_callback",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_ra_lock_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16655,13 +16879,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_lock_callback(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg5 = (svn_lock_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
+ arg5 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_lock_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_error_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_error_t, svn_argnum_obj5);
+ arg6 = (svn_error_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_error_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16727,7 +16951,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_progress_notify_func(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_ra_invoke_progress_notify_func",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_ra_progress_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16801,7 +17025,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revstart_callback(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_ra_invoke_replay_revstart_callback",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_ra_replay_revstart_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16822,7 +17046,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revstart_callback(PyObject *SWIG
}
}
{
- arg6 = (apr_hash_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
+ arg6 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_hash_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16855,13 +17079,13 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revstart_callback(PyObject *SWIG
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg4, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg4, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg5, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg5, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16905,7 +17129,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revfinish_callback(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OOOOOO|O:svn_ra_invoke_replay_revfinish_callback",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_ra_replay_revfinish_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -16926,7 +17150,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revfinish_callback(PyObject *SWI
}
}
{
- arg4 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
+ arg4 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16940,7 +17164,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_replay_revfinish_callback(PyObject *SWI
}
}
{
- arg6 = (apr_hash_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
+ arg6 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16984,6 +17208,233 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_ra_invoke_check_tunnel_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_ra_check_tunnel_func_t arg1 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_boolean_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"OOs:svn_ra_invoke_check_tunnel_func",&obj0,&obj1,&arg3)) SWIG_fail;
+ {
+ svn_ra_check_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char__int, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_boolean_t)svn_ra_invoke_check_tunnel_func(arg1,arg2,(char const *)arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_invoke_close_tunnel_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_ra_close_tunnel_func_t arg1 = (svn_ra_close_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *arg3 = (void *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OOO:svn_ra_invoke_close_tunnel_func",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ svn_ra_close_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_void__void, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ if (obj2 == Py_None) {
+ arg3 = NULL;
+ } else if (SWIG_ConvertPtr(obj2, (void **) &arg3, 0, 0) == -1) {
+ arg3 = (void *) obj2;
+ PyErr_Clear();
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_ra_invoke_close_tunnel_func(arg1,arg2,arg3);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_ra_invoke_open_tunnel_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_ra_open_tunnel_func_t arg1 = (svn_ra_open_tunnel_func_t) 0 ;
+ svn_stream_t **arg2 = (svn_stream_t **) 0 ;
+ svn_stream_t **arg3 = (svn_stream_t **) 0 ;
+ svn_ra_close_tunnel_func_t *arg4 = (svn_ra_close_tunnel_func_t *) 0 ;
+ void **arg5 = (void **) 0 ;
+ void *arg6 = (void *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_stream_t *temp2 ;
+ svn_stream_t *temp3 ;
+ void *temp5 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg13 = _global_pool;
+ arg2 = &temp2;
+ arg3 = &temp3;
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+ arg4 = (svn_ra_close_tunnel_func_t *) apr_pcalloc(_global_pool, sizeof(svn_ra_close_tunnel_func_t));
+ if (arg4 == NULL) SWIG_fail;
+ }
+ arg5 = &temp5;
+ if (!PyArg_ParseTuple(args,(char *)"OOsssOO|O:svn_ra_invoke_open_tunnel_func",&obj0,&obj1,&arg7,&arg8,&arg9,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ svn_ra_open_tunnel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg1 = *tmp;
+ }
+ {
+ if (obj1 == Py_None) {
+ arg6 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg6, 0, 0) == -1) {
+ arg6 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg10 = (int)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj6;
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_ra_invoke_open_tunnel_func(arg1,arg2,arg3,arg4,arg5,arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_stream_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_svn_stream_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg4, SWIGTYPE_p_p_f_p_void_p_void__void,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_ra_invoke_open_tunnel_func arg 5 (void **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_ra_invoke_open_tunnel_func is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_ra_invoke_init_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_ra_init_func_t arg1 = (svn_ra_init_func_t) 0 ;
@@ -17005,7 +17456,7 @@ SWIGINTERN PyObject *_wrap_svn_ra_invoke_init_func(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO|OO:svn_ra_invoke_init_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_ra_init_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17155,6 +17606,27 @@ SWIGINTERN PyObject *svn_ra_replay_revfinish_callback_t_swigregister(PyObject *S
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_ra_check_tunnel_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_q_const__char__int, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *svn_ra_close_tunnel_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_void__void, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *svn_ra_open_tunnel_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
SWIGINTERN PyObject *svn_ra_init_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -17226,6 +17698,12 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_ra_callbacks2_t_get_client_string_get", _wrap_svn_ra_callbacks2_t_get_client_string_get, METH_VARARGS, (char *)"svn_ra_callbacks2_t_get_client_string_get(svn_ra_callbacks2_t self) -> svn_ra_get_client_string_func_t"},
{ (char *)"svn_ra_callbacks2_t_get_wc_contents_set", _wrap_svn_ra_callbacks2_t_get_wc_contents_set, METH_VARARGS, (char *)"svn_ra_callbacks2_t_get_wc_contents_set(svn_ra_callbacks2_t self, svn_ra_get_wc_contents_func_t get_wc_contents)"},
{ (char *)"svn_ra_callbacks2_t_get_wc_contents_get", _wrap_svn_ra_callbacks2_t_get_wc_contents_get, METH_VARARGS, (char *)"svn_ra_callbacks2_t_get_wc_contents_get(svn_ra_callbacks2_t self) -> svn_ra_get_wc_contents_func_t"},
+ { (char *)"svn_ra_callbacks2_t_check_tunnel_func_set", _wrap_svn_ra_callbacks2_t_check_tunnel_func_set, METH_VARARGS, (char *)"svn_ra_callbacks2_t_check_tunnel_func_set(svn_ra_callbacks2_t self, svn_ra_check_tunnel_func_t check_tunnel_func)"},
+ { (char *)"svn_ra_callbacks2_t_check_tunnel_func_get", _wrap_svn_ra_callbacks2_t_check_tunnel_func_get, METH_VARARGS, (char *)"svn_ra_callbacks2_t_check_tunnel_func_get(svn_ra_callbacks2_t self) -> svn_ra_check_tunnel_func_t"},
+ { (char *)"svn_ra_callbacks2_t_open_tunnel_func_set", _wrap_svn_ra_callbacks2_t_open_tunnel_func_set, METH_VARARGS, (char *)"svn_ra_callbacks2_t_open_tunnel_func_set(svn_ra_callbacks2_t self, svn_ra_open_tunnel_func_t open_tunnel_func)"},
+ { (char *)"svn_ra_callbacks2_t_open_tunnel_func_get", _wrap_svn_ra_callbacks2_t_open_tunnel_func_get, METH_VARARGS, (char *)"svn_ra_callbacks2_t_open_tunnel_func_get(svn_ra_callbacks2_t self) -> svn_ra_open_tunnel_func_t"},
+ { (char *)"svn_ra_callbacks2_t_tunnel_baton_set", _wrap_svn_ra_callbacks2_t_tunnel_baton_set, METH_VARARGS, (char *)"svn_ra_callbacks2_t_tunnel_baton_set(svn_ra_callbacks2_t self, void * tunnel_baton)"},
+ { (char *)"svn_ra_callbacks2_t_tunnel_baton_get", _wrap_svn_ra_callbacks2_t_tunnel_baton_get, METH_VARARGS, (char *)"svn_ra_callbacks2_t_tunnel_baton_get(svn_ra_callbacks2_t self) -> void *"},
{ (char *)"new_svn_ra_callbacks2_t", _wrap_new_svn_ra_callbacks2_t, METH_VARARGS, (char *)"new_svn_ra_callbacks2_t() -> svn_ra_callbacks2_t"},
{ (char *)"delete_svn_ra_callbacks2_t", _wrap_delete_svn_ra_callbacks2_t, METH_VARARGS, (char *)"delete_svn_ra_callbacks2_t(svn_ra_callbacks2_t self)"},
{ (char *)"svn_ra_callbacks2_t_swigregister", svn_ra_callbacks2_t_swigregister, METH_VARARGS, NULL},
@@ -17618,6 +18096,13 @@ static PyMethodDef SwigMethods[] = {
"svn_ra_invoke_replay_revfinish_callback(svn_ra_replay_revfinish_callback_t _obj, svn_revnum_t revision, void * replay_baton, \n"
" svn_delta_editor_t editor, void * edit_baton, apr_hash_t rev_props, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_ra_invoke_check_tunnel_func", _wrap_svn_ra_invoke_check_tunnel_func, METH_VARARGS, (char *)"svn_ra_invoke_check_tunnel_func(svn_ra_check_tunnel_func_t _obj, void * tunnel_baton, char const * tunnel_name) -> svn_boolean_t"},
+ { (char *)"svn_ra_invoke_close_tunnel_func", _wrap_svn_ra_invoke_close_tunnel_func, METH_VARARGS, (char *)"svn_ra_invoke_close_tunnel_func(svn_ra_close_tunnel_func_t _obj, void * close_baton, void * tunnel_baton)"},
+ { (char *)"svn_ra_invoke_open_tunnel_func", _wrap_svn_ra_invoke_open_tunnel_func, METH_VARARGS, (char *)"\n"
+ "svn_ra_invoke_open_tunnel_func(svn_ra_open_tunnel_func_t _obj, void * tunnel_baton, char const * tunnel_name, char const * user, \n"
+ " char const * hostname, int port, svn_cancel_func_t cancel_func, \n"
+ " apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_ra_invoke_init_func", _wrap_svn_ra_invoke_init_func, METH_VARARGS, (char *)"svn_ra_invoke_init_func(svn_ra_init_func_t _obj, int abi_version, apr_pool_t pool, apr_hash_t hash) -> svn_error_t"},
{ (char *)"svn_ra_get_wc_prop_func_t_swigregister", svn_ra_get_wc_prop_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_ra_set_wc_prop_func_t_swigregister", svn_ra_set_wc_prop_func_t_swigregister, METH_VARARGS, NULL},
@@ -17631,6 +18116,9 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_ra_progress_notify_func_t_swigregister", svn_ra_progress_notify_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_ra_replay_revstart_callback_t_swigregister", svn_ra_replay_revstart_callback_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_ra_replay_revfinish_callback_t_swigregister", svn_ra_replay_revfinish_callback_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_ra_check_tunnel_func_t_swigregister", svn_ra_check_tunnel_func_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_ra_close_tunnel_func_t_swigregister", svn_ra_close_tunnel_func_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_ra_open_tunnel_func_t_swigregister", svn_ra_open_tunnel_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_ra_init_func_t_swigregister", svn_ra_init_func_t_swigregister, METH_VARARGS, NULL},
{ NULL, NULL, 0, NULL }
};
@@ -17650,6 +18138,7 @@ static swig_type_info _swigt__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void
static swig_type_info _swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t = {"_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t", "struct svn_error_t *(*)(int,apr_pool_t *,apr_hash_t *)|svn_ra_init_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)|struct svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)|svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_location_segment_t *,void *,apr_pool_t *)|svn_location_segment_receiver_t", 0, 0, (void*)0, 0};
@@ -17665,6 +18154,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_stream_t **,svn_checksum_t const *,apr_pool_t *)|svn_ra_get_wc_contents_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,char const *,apr_pool_t *)|struct svn_error_t *(*)(void *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,apr_pool_t *)|svn_ra_invalidate_wc_props_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,svn_string_t const **,apr_pool_t *)|svn_ra_get_wc_prop_func_t", 0, 0, (void*)0, 0};
@@ -17686,6 +18176,7 @@ static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t__p_svn_error_t", "svn_ra_get_latest_revnum_func_t|struct svn_error_t *(*)(void *,svn_revnum_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_void__void = {"_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t|void (*)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -17701,10 +18192,12 @@ static swig_type_info _swigt__p_p_apr_hash_t = {"_p_p_apr_hash_t", "apr_hash_t *
static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void = {"_p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void", "void (**)(apr_off_t,apr_off_t,void *,apr_pool_t *)|svn_ra_progress_notify_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t = {"_p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t", "svn_ra_init_func_t *|struct svn_error_t *(**)(int,apr_pool_t *,apr_hash_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)|svn_ra_open_tunnel_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "svn_txdelta_window_handler_t *|struct svn_error_t *(**)(svn_txdelta_window_t *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void__p_svn_error_t = {"_p_p_f_p_void__p_svn_error_t", "svn_cancel_func_t *|struct svn_error_t *(**)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_ra_get_client_string_func_t *|struct svn_error_t *(**)(void *,char const **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,svn_stream_t **,svn_checksum_t const *,apr_pool_t *)|svn_ra_get_wc_contents_func_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_q_const__char__int = {"_p_p_f_p_void_p_q_const__char__int", "int (**)(void *,char const *)|svn_ra_check_tunnel_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,char const *,apr_pool_t *)|svn_ra_invalidate_wc_props_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,char const *,svn_string_t const **,apr_pool_t *)|svn_ra_get_wc_prop_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,char const *,svn_string_t const *,apr_pool_t *)|svn_ra_set_wc_prop_func_t *|svn_ra_push_wc_prop_func_t *", 0, 0, (void*)0, 0};
@@ -17712,6 +18205,7 @@ static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_con
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_ra_file_rev_handler_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_boolean_t,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_file_rev_handler_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_svn_revnum_t__p_svn_error_t = {"_p_p_f_p_void_p_svn_revnum_t__p_svn_error_t", "struct svn_error_t *(**)(void *,svn_revnum_t *)|svn_ra_get_latest_revnum_func_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_void__void = {"_p_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t *|void (**)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "svn_ra_replay_revstart_callback_t *|struct svn_error_t *(**)(svn_revnum_t,void *,svn_delta_editor_t const **,void **,apr_hash_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "svn_ra_replay_revfinish_callback_t *|struct svn_error_t *(**)(svn_revnum_t,void *,svn_delta_editor_t const *,void *,apr_hash_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_delta_editor_t = {"_p_p_svn_delta_editor_t", "struct svn_delta_editor_t **|svn_delta_editor_t **", 0, 0, (void*)0, 0};
@@ -17744,9 +18238,11 @@ static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "st
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -17802,6 +18298,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -17817,6 +18314,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -17838,6 +18336,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_void__void,
&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -17853,10 +18352,12 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_char,
&_swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
&_swigt__p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
+ &_swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
&_swigt__p_p_f_p_void__p_svn_error_t,
&_swigt__p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_q_const__char__int,
&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -17864,6 +18365,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_svn_revnum_t__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_void__void,
&_swigt__p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_svn_delta_editor_t,
@@ -17896,9 +18398,11 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_config_t,
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -17954,6 +18458,7 @@ static swig_cast_info _swigc__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void[
static swig_cast_info _swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t[] = { {&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17969,6 +18474,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17990,6 +18496,7 @@ static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_void__void[] = { {&_swigt__p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18005,10 +18512,12 @@ static swig_cast_info _swigc__p_p_apr_hash_t[] = { {&_swigt__p_p_apr_hash_t, 0,
static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void[] = { {&_swigt__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t[] = { {&_swigt__p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18016,6 +18525,7 @@ static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_con
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_svn_revnum_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_svn_revnum_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_void__void[] = { {&_swigt__p_p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_delta_editor_t[] = { {&_swigt__p_p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18048,9 +18558,11 @@ static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18106,6 +18618,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -18121,6 +18634,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -18142,6 +18656,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_void__void,
_swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -18157,10 +18672,12 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_char,
_swigc__p_p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void,
_swigc__p_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
+ _swigc__p_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_swigc__p_p_f_p_void__p_svn_error_t,
_swigc__p_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_q_const__char__int,
_swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -18168,6 +18685,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_svn_revnum_t__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_void__void,
_swigc__p_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_svn_delta_editor_t,
@@ -18200,9 +18718,11 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_config_t,
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -18257,18 +18777,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -18278,17 +18798,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -18351,7 +18871,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
diff --git a/subversion/bindings/swig/python/svn_repos.c b/subversion/bindings/swig/python/svn_repos.c
index 68d4278..9ff6c64 100644
--- a/subversion/bindings/swig/python/svn_repos.c
+++ b/subversion/bindings/swig/python/svn_repos.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -2960,119 +2934,130 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[17]
#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
#define SWIGTYPE_p_f_p_void_p_q_const__char__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_int swig_types[28]
-#define SWIGTYPE_p_long swig_types[29]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[30]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[31]
-#define SWIGTYPE_p_p_char swig_types[32]
-#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[35]
-#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[37]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[41]
-#define SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[42]
-#define SWIGTYPE_p_p_svn_authz_t swig_types[43]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[44]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[45]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[46]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[47]
-#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[48]
-#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[49]
-#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[50]
-#define SWIGTYPE_p_p_svn_repos_t swig_types[51]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[52]
-#define SWIGTYPE_p_p_svn_string_t swig_types[53]
-#define SWIGTYPE_p_p_void swig_types[54]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[55]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[56]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[57]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[58]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[59]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[60]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[61]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[62]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[63]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[64]
-#define SWIGTYPE_p_svn_authz_t swig_types[65]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[66]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[67]
-#define SWIGTYPE_p_svn_checksum_t swig_types[68]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[69]
-#define SWIGTYPE_p_svn_config_t swig_types[70]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[71]
-#define SWIGTYPE_p_svn_depth_t swig_types[72]
-#define SWIGTYPE_p_svn_dirent_t swig_types[73]
-#define SWIGTYPE_p_svn_errno_t swig_types[74]
-#define SWIGTYPE_p_svn_error_t swig_types[75]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[76]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[77]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[78]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[79]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[80]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[81]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[82]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[83]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[84]
-#define SWIGTYPE_p_svn_fs_t swig_types[85]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[86]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[87]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[88]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[89]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[90]
-#define SWIGTYPE_p_svn_lock_t swig_types[91]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[92]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[93]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[94]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[95]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[96]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[97]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[98]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[99]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[100]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[101]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[102]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[103]
-#define SWIGTYPE_p_svn_prop_kind swig_types[104]
-#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[105]
-#define SWIGTYPE_p_svn_repos_node_t swig_types[106]
-#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[107]
-#define SWIGTYPE_p_svn_repos_notify_t swig_types[108]
-#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[109]
-#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[110]
-#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[111]
-#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[112]
-#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[113]
-#define SWIGTYPE_p_svn_repos_t swig_types[114]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[115]
-#define SWIGTYPE_p_svn_stream_t swig_types[116]
-#define SWIGTYPE_p_svn_string_t swig_types[117]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[118]
-#define SWIGTYPE_p_svn_tristate_t swig_types[119]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[120]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[121]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[122]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[123]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[124]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[125]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[126]
-#define SWIGTYPE_p_svn_version_t swig_types[127]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[128]
-#define SWIGTYPE_p_unsigned_long swig_types[129]
-#define SWIGTYPE_p_void swig_types[130]
-static swig_type_info *swig_types[132];
-static swig_module_info swig_module = {swig_types, 131, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_int swig_types[30]
+#define SWIGTYPE_p_long swig_types[31]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[32]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[33]
+#define SWIGTYPE_p_p_char swig_types[34]
+#define SWIGTYPE_p_p_f_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_p_f_p_void__p_svn_error_t swig_types[37]
+#define SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[39]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[43]
+#define SWIGTYPE_p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[44]
+#define SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[45]
+#define SWIGTYPE_p_p_svn_authz_t swig_types[46]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[47]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[48]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[49]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[50]
+#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[51]
+#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[52]
+#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[53]
+#define SWIGTYPE_p_p_svn_repos_t swig_types[54]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[55]
+#define SWIGTYPE_p_p_svn_string_t swig_types[56]
+#define SWIGTYPE_p_p_svn_version_t swig_types[57]
+#define SWIGTYPE_p_p_void swig_types[58]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[59]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[60]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[61]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[62]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[63]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[64]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[65]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[66]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[67]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[68]
+#define SWIGTYPE_p_svn_authz_t swig_types[69]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[70]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[71]
+#define SWIGTYPE_p_svn_checksum_t swig_types[72]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[73]
+#define SWIGTYPE_p_svn_config_t swig_types[74]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[75]
+#define SWIGTYPE_p_svn_depth_t swig_types[76]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[77]
+#define SWIGTYPE_p_svn_dirent_t swig_types[78]
+#define SWIGTYPE_p_svn_errno_t swig_types[79]
+#define SWIGTYPE_p_svn_error_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[84]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[85]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[86]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[87]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[88]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[89]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[90]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[91]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[92]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[93]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[94]
+#define SWIGTYPE_p_svn_fs_t swig_types[95]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[96]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[97]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[98]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[99]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[100]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[101]
+#define SWIGTYPE_p_svn_lock_t swig_types[102]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[103]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[104]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[105]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[106]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[107]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[108]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[109]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[110]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[111]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[112]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[113]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[114]
+#define SWIGTYPE_p_svn_prop_kind swig_types[115]
+#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[116]
+#define SWIGTYPE_p_svn_repos_node_t swig_types[117]
+#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[118]
+#define SWIGTYPE_p_svn_repos_notify_t swig_types[119]
+#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[120]
+#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[121]
+#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[122]
+#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[123]
+#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[124]
+#define SWIGTYPE_p_svn_repos_t swig_types[125]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[126]
+#define SWIGTYPE_p_svn_stream_t swig_types[127]
+#define SWIGTYPE_p_svn_string_t swig_types[128]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[129]
+#define SWIGTYPE_p_svn_tristate_t swig_types[130]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[131]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[132]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[133]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[134]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[135]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[136]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[137]
+#define SWIGTYPE_p_svn_version_t swig_types[138]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[139]
+#define SWIGTYPE_p_unsigned_long swig_types[140]
+#define SWIGTYPE_p_void swig_types[141]
+static swig_type_info *swig_types[143];
+static swig_module_info swig_module = {swig_types, 142, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3096,7 +3081,7 @@ static swig_module_info swig_module = {swig_types, 131, 0, 0, 0, 0};
#endif
#define SWIG_name "_repos"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3445,6 +3430,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3672,11 +3669,6 @@ static svn_error_t * svn_repos_invoke_authz_callback(
return _obj(required, allowed, root, path, baton, pool);
}
-static svn_error_t * svn_repos_invoke_file_rev_handler(
- svn_repos_file_rev_handler_t _obj, 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) {
- return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
-}
-
static void svn_repos_invoke_notify_func(
svn_repos_notify_func_t _obj, void *baton, const svn_repos_notify_t *notify, apr_pool_t *scratch_pool) {
_obj(baton, notify, scratch_pool);
@@ -3692,10 +3684,82 @@ static svn_error_t * svn_repos_invoke_history_func(
return _obj(baton, path, revision, pool);
}
+static svn_error_t * svn_repos_invoke_file_rev_handler(
+ svn_repos_file_rev_handler_t _obj, 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) {
+ return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
+}
+
+static svn_error_t * svn_repos_invoke_verify_callback(
+ svn_repos_verify_callback_t _obj, void *baton, svn_revnum_t revision, svn_error_t *verify_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, revision, verify_err, scratch_pool);
+}
+
#ifdef __cplusplus
extern "C" {
#endif
+SWIGINTERN PyObject *_wrap_svn_swig_py_make_parse_fns3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
+ void **arg2 = (void **) 0 ;
+ PyObject *arg3 = (PyObject *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_repos_parse_fns3_t *temp1 ;
+ void *temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if (!PyArg_ParseTuple(args,(char *)"O|O:svn_swig_py_make_parse_fns3",&obj0,&obj1)) SWIG_fail;
+ arg3 = obj0;
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ svn_swig_py_make_parse_fns3((struct svn_repos_parse_fns3_t const **)arg1,arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_version(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_version_t *result = 0 ;
@@ -3709,7 +3773,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_version(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3726,7 +3790,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_action_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_action_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3753,7 +3817,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_action_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3775,7 +3839,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_revision_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3802,7 +3866,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_revision_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3823,7 +3887,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_warning_str_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_repos_notify_t_warning_str_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3851,7 +3915,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_warning_str_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_warning_str_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3873,7 +3937,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_warning_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_warning_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3900,7 +3964,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_warning_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_warning_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3922,7 +3986,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_shard_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_shard_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3944,7 +4008,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_shard_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_shard_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3966,7 +4030,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_new_revision_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_new_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3993,7 +4057,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_new_revision_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_new_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4015,7 +4079,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_old_revision_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_old_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4042,7 +4106,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_old_revision_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_old_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4064,7 +4128,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_node_action_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_node_action_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4091,7 +4155,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_node_action_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_node_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4112,7 +4176,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_path_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_repos_notify_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4140,7 +4204,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_t_path_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4153,6 +4217,104 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_notify_t_start_revision_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_start_revision_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->start_revision = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_notify_t_start_revision_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_revnum_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_start_revision_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_revnum_t) ((arg1)->start_revision);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_notify_t_end_revision_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_notify_t_end_revision_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->end_revision = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_notify_t_end_revision_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_revnum_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_notify_t_end_revision_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_revnum_t) ((arg1)->end_revision);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *svn_repos_notify_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -4197,7 +4359,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_notify_create(PyObject *SWIGUNUSEDPARM(self
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_repos_notify_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_repos_notify_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -4254,6 +4416,94 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_open3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t **arg1 = (svn_repos_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_repos_t *temp1 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"sO|OO:svn_repos_open3",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
+ {
+ /* PYTHON-FIXME: Handle None -> NULL. */
+ arg3 = svn_swig_py_stringhash_from_dict(obj1, _global_pool);
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_open3(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_open2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_t **arg1 = (svn_repos_t **) 0 ;
@@ -4305,7 +4555,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_open2(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_t,
_global_py_pool, args))
;
@@ -4367,7 +4617,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_open(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_t,
_global_py_pool, args))
;
@@ -4452,7 +4702,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_create(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_t,
_global_py_pool, args))
;
@@ -4497,7 +4747,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_upgrade2(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4703,7 +4953,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_has_capability(PyObject *SWIGUNUSEDPARM(sel
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_repos_has_capability",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4753,6 +5003,144 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_capabilities(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_repos_t *arg2 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ apr_hash_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_repos_capabilities",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_capabilities(arg1,arg2,arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_capabilities arg 1 (apr_hash_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_capabilities is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_remember_client_capabilities(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_remember_client_capabilities",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_fs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -4761,7 +5149,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs(PyObject *SWIGUNUSEDPARM(self), PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_fs",&obj0)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4774,7 +5162,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs(PyObject *SWIGUNUSEDPARM(self), PyObject
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_fs_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_fs_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -4782,6 +5170,153 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_fs_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ char *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg2 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_fs_type",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (char *)svn_repos_fs_type(arg1,arg2);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_hotcopy3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_repos_notify_func_t arg5 = (svn_repos_notify_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg9 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"ssOOOOO|O:svn_repos_hotcopy3",&arg1,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_repos_notify_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj4);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg5 = *tmp;
+ }
+ {
+ if (obj5 == Py_None) {
+ arg6 = NULL;
+ } else if (SWIG_ConvertPtr(obj5, (void **) &arg6, 0, 0) == -1) {
+ arg6 = (void *) obj5;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_hotcopy2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
char *arg1 = (char *) 0 ;
@@ -4817,8 +5352,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_hotcopy2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -4944,14 +5479,14 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_pack2(PyObject *SWIGUNUSEDPARM(self), Py
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_repos_fs_pack2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -4966,8 +5501,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_pack2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -5031,14 +5566,14 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_pack(PyObject *SWIGUNUSEDPARM(self), PyO
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_repos_fs_pack",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_fs_pack_notify_t * tmp =
- svn_swig_MustGetPtr(obj1, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
+ svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj1);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5053,8 +5588,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_pack(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -5126,7 +5661,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_recover4(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -5141,8 +5676,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_recover4(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -5227,8 +5762,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_recover3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -5554,7 +6089,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_path(PyObject *SWIGUNUSEDPARM(self), PyObje
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_path",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5604,7 +6139,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_db_env(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_db_env",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5654,7 +6189,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_conf_dir(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_conf_dir",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5704,7 +6239,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_svnserve_conf(PyObject *SWIGUNUSEDPARM(self
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_svnserve_conf",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5754,7 +6289,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_lock_dir(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_lock_dir",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5804,7 +6339,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_db_lockfile(PyObject *SWIGUNUSEDPARM(self),
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_db_lockfile",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5854,7 +6389,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_db_logs_lockfile(PyObject *SWIGUNUSEDPARM(s
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_db_logs_lockfile",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5904,7 +6439,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_hook_dir(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_hook_dir",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5954,7 +6489,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_start_commit_hook(PyObject *SWIGUNUSEDPARM(
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_start_commit_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6004,7 +6539,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_pre_commit_hook(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_pre_commit_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6054,7 +6589,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_post_commit_hook(PyObject *SWIGUNUSEDPARM(s
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_post_commit_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6104,7 +6639,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_pre_revprop_change_hook(PyObject *SWIGUNUSE
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_pre_revprop_change_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6154,7 +6689,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_post_revprop_change_hook(PyObject *SWIGUNUS
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_post_revprop_change_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6204,7 +6739,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_pre_lock_hook(PyObject *SWIGUNUSEDPARM(self
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_pre_lock_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6254,7 +6789,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_post_lock_hook(PyObject *SWIGUNUSEDPARM(sel
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_post_lock_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6304,7 +6839,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_pre_unlock_hook(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_pre_unlock_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6354,7 +6889,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_post_unlock_hook(PyObject *SWIGUNUSEDPARM(s
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_repos_post_unlock_hook",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6405,7 +6940,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_hooks_setenv(PyObject *SWIGUNUSEDPARM(self)
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_repos_hooks_setenv",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6496,7 +7031,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report3(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6526,7 +7061,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report3(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg11 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
+ arg11 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6541,7 +7076,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report3(PyObject *SWIGUNUSEDPARM(self
}
{
/* FIXME: Handle the NULL case. */
- arg13 = svn_swig_py_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg14 = obj11;
}
{
@@ -6578,7 +7113,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report3(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -6640,7 +7175,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6670,7 +7205,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg11 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
+ arg11 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6685,7 +7220,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report2(PyObject *SWIGUNUSEDPARM(self
}
{
/* FIXME: Handle the NULL case. */
- arg13 = svn_swig_py_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg14 = obj11;
}
if (obj12) {
@@ -6716,7 +7251,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report2(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -6777,7 +7312,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg4 = (svn_repos_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_repos_t, svn_argnum_obj2);
+ arg4 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_repos_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6801,7 +7336,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg11 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
+ arg11 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6816,7 +7351,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report(PyObject *SWIGUNUSEDPARM(self)
}
{
/* FIXME: Handle the NULL case. */
- arg13 = svn_swig_py_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg14 = obj11;
}
if (obj12) {
@@ -6847,7 +7382,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_begin_report(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -7584,19 +8119,19 @@ SWIGINTERN PyObject *_wrap_svn_repos_dir_delta2(PyObject *SWIGUNUSEDPARM(self),
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OszOzOOOOOOO|O:svn_repos_dir_delta2",&obj0,&arg2,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj3);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg6 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7611,7 +8146,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dir_delta2(PyObject *SWIGUNUSEDPARM(self),
}
{
/* FIXME: Handle the NULL case. */
- arg8 = svn_swig_py_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg9 = obj7;
}
{
@@ -7713,19 +8248,19 @@ SWIGINTERN PyObject *_wrap_svn_repos_dir_delta(PyObject *SWIGUNUSEDPARM(self), P
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OszOzOOOOOOO|O:svn_repos_dir_delta",&obj0,&arg2,&arg3,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj3);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
+ arg6 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7740,7 +8275,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dir_delta(PyObject *SWIGUNUSEDPARM(self), P
}
{
/* FIXME: Handle the NULL case. */
- arg8 = svn_swig_py_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg9 = obj7;
}
{
@@ -7834,7 +8369,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_replay2(PyObject *SWIGUNUSEDPARM(self), PyO
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_repos_replay2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7852,7 +8387,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_replay2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg5 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
+ arg5 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7867,7 +8402,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_replay2(PyObject *SWIGUNUSEDPARM(self), PyO
}
{
/* FIXME: Handle the NULL case. */
- arg7 = svn_swig_py_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg8 = obj6;
}
if (obj7) {
@@ -7929,13 +8464,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_replay(PyObject *SWIGUNUSEDPARM(self), PyOb
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_replay",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj1);
+ arg2 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8022,13 +8557,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor5(PyObject *SWIGUNUSEDPARM
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOssOOOO|O:svn_repos_get_commit_editor5",&obj0,&obj1,&arg5,&arg6,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
+ arg4 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8052,7 +8587,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor5(PyObject *SWIGUNUSEDPARM
}
{
svn_repos_authz_callback_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8094,13 +8629,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor5(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8152,13 +8687,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor4(PyObject *SWIGUNUSEDPARM
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOsszzOOO|O:svn_repos_get_commit_editor4",&obj0,&obj1,&arg5,&arg6,&arg7,&arg8,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
+ arg4 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8169,7 +8704,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor4(PyObject *SWIGUNUSEDPARM
}
{
svn_repos_authz_callback_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8211,13 +8746,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor4(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8269,13 +8804,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor3(PyObject *SWIGUNUSEDPARM
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOsszzOOO|O:svn_repos_get_commit_editor3",&obj0,&obj1,&arg5,&arg6,&arg7,&arg8,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
+ arg4 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8286,7 +8821,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor3(PyObject *SWIGUNUSEDPARM
}
{
svn_repos_authz_callback_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -8328,13 +8863,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor3(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8382,13 +8917,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor2(PyObject *SWIGUNUSEDPARM
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOsszzO|O:svn_repos_get_commit_editor2",&obj0,&obj1,&arg5,&arg6,&arg7,&arg8,&obj6,&obj7)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
+ arg4 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8425,13 +8960,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor2(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8477,7 +9012,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor(PyObject *SWIGUNUSEDPARM(
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsszzO|O:svn_repos_get_commit_editor",&obj0,&arg4,&arg5,&arg6,&arg7,&obj5,&obj6)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8514,13 +9049,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_commit_editor(PyObject *SWIGUNUSEDPARM(
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -8559,7 +9094,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dated_revision(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_repos_dated_revision",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8637,7 +9172,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_committed_info(PyObject *SWIGUNUSEDPARM
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_repos_get_committed_info",&obj0,&arg5,&obj2)) SWIG_fail;
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8733,7 +9268,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_stat(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_repos_stat",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8766,7 +9301,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_stat(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_dirent_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_dirent_t,
_global_py_pool, args))
;
@@ -8808,7 +9343,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_deleted_rev(PyObject *SWIGUNUSEDPARM(self),
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_repos_deleted_rev",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8899,18 +9434,18 @@ SWIGINTERN PyObject *_wrap_svn_repos_history2(PyObject *SWIGUNUSEDPARM(self), Py
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_repos_history2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_repos_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_py_repos_history_func;
arg4 = obj2;
}
{
/* FIXME: Handle the NULL case. */
- arg5 = svn_swig_py_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg6 = obj3;
}
{
@@ -8996,13 +9531,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_history(PyObject *SWIGUNUSEDPARM(self), PyO
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_repos_history",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_repos_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_py_repos_history_func;
arg4 = obj2;
}
{
@@ -9089,7 +9624,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_trace_node_locations(PyObject *SWIGUNUSEDPA
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_repos_trace_node_locations",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_fs_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
+ arg1 = (svn_fs_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9111,7 +9646,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_trace_node_locations(PyObject *SWIGUNUSEDPA
}
{
/* FIXME: Handle the NULL case. */
- arg6 = svn_swig_py_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg7 = obj4;
}
if (obj5) {
@@ -9185,7 +9720,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_location_segments(PyObject *SWIGUNUSED
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_repos_node_location_segments",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9209,12 +9744,12 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_location_segments(PyObject *SWIGUNUSED
}
}
{
- arg6 = svn_swig_py_location_segment_receiver_func;
+ arg6 = (svn_location_segment_receiver_t) svn_swig_py_location_segment_receiver_func;
arg7 = obj5;
}
{
/* FIXME: Handle the NULL case. */
- arg8 = svn_swig_py_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg9 = obj6;
}
if (obj7) {
@@ -9294,7 +9829,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs4(PyObject *SWIGUNUSEDPARM(self), P
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO|O:svn_repos_get_logs4",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9355,11 +9890,11 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs4(PyObject *SWIGUNUSEDPARM(self), P
}
{
/* FIXME: Handle the NULL case. */
- arg10 = svn_swig_py_repos_authz_func;
+ arg10 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg11 = obj9;
}
{
- arg12 = svn_swig_py_log_entry_receiver;
+ arg12 = (svn_log_entry_receiver_t) svn_swig_py_log_entry_receiver;
arg13 = obj10;
}
if (obj11) {
@@ -9435,7 +9970,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs3(PyObject *SWIGUNUSEDPARM(self), P
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO|O:svn_repos_get_logs3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9481,11 +10016,11 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs3(PyObject *SWIGUNUSEDPARM(self), P
}
{
/* FIXME: Handle the NULL case. */
- arg8 = svn_swig_py_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg9 = obj7;
}
{
- arg10 = svn_swig_py_log_receiver;
+ arg10 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg11 = obj8;
}
if (obj9) {
@@ -9559,7 +10094,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs2(PyObject *SWIGUNUSEDPARM(self), P
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO|O:svn_repos_get_logs2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9599,11 +10134,11 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs2(PyObject *SWIGUNUSEDPARM(self), P
}
{
/* FIXME: Handle the NULL case. */
- arg7 = svn_swig_py_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg8 = obj6;
}
{
- arg9 = svn_swig_py_log_receiver;
+ arg9 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg10 = obj7;
}
if (obj8) {
@@ -9674,7 +10209,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs(PyObject *SWIGUNUSEDPARM(self), Py
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOO|O:svn_repos_get_logs",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9713,7 +10248,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_logs(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg7 = svn_swig_py_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_py_log_receiver;
arg8 = obj6;
}
if (obj7) {
@@ -9785,7 +10320,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_get_mergeinfo(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOOOOO|O:svn_repos_fs_get_mergeinfo",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9819,7 +10354,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_get_mergeinfo(PyObject *SWIGUNUSEDPARM(s
}
{
/* FIXME: Handle the NULL case. */
- arg7 = svn_swig_py_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg8 = obj5;
}
if (obj6) {
@@ -9903,7 +10438,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_file_revs2(PyObject *SWIGUNUSEDPARM(sel
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_repos_get_file_revs2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9928,12 +10463,12 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_file_revs2(PyObject *SWIGUNUSEDPARM(sel
}
{
/* FIXME: Handle the NULL case. */
- arg6 = svn_swig_py_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg7 = obj5;
}
{
svn_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10014,7 +10549,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_file_revs(PyObject *SWIGUNUSEDPARM(self
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_repos_get_file_revs",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10033,12 +10568,12 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_file_revs(PyObject *SWIGUNUSEDPARM(self
}
{
/* FIXME: Handle the NULL case. */
- arg5 = svn_swig_py_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg6 = obj4;
}
{
svn_repos_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -10116,13 +10651,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_commit_txn(PyObject *SWIGUNUSEDPARM(self
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_repos_fs_commit_txn",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
+ arg4 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10208,7 +10743,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_commit2(PyObject *SWIGUNUS
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_fs_begin_txn_for_commit2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10260,7 +10795,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_commit2(PyObject *SWIGUNUS
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -10300,7 +10835,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_commit(PyObject *SWIGUNUSE
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOsz|O:svn_repos_fs_begin_txn_for_commit",&obj0,&obj1,&arg4,&arg5,&obj4)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10339,7 +10874,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_commit(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -10378,7 +10913,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_update(PyObject *SWIGUNUSE
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOs|O:svn_repos_fs_begin_txn_for_update",&obj0,&obj1,&arg4,&obj3)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10417,7 +10952,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_begin_txn_for_update(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_fs_txn_t,
_global_py_pool, args))
;
@@ -10434,6 +10969,128 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_fs_lock_many(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg9 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg10 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOzOOOO|OO:svn_repos_fs_lock_many",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+ arg2 = svn_swig_py_struct_ptr_hash_from_dict(obj1,
+ SWIGTYPE_p_svn_fs_lock_target_t, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ arg5 = (apr_time_t) PyLong_AsLongLong(obj4);
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_fs_lock_callback_t) svn_swig_py_fs_lock_callback;
+ arg8 = obj6;
+ }
+ if (obj7) {
+ /* Verify that the user supplied a valid pool */
+ if (obj7 != Py_None && obj7 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj7);
+ SWIG_arg_fail(svn_argnum_obj7);
+ SWIG_fail;
+ }
+ }
+ if (obj8) {
+ /* Verify that the user supplied a valid pool */
+ if (obj8 != Py_None && obj8 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj8);
+ SWIG_arg_fail(svn_argnum_obj8);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
@@ -10464,7 +11121,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OszzOOOO|O:svn_repos_fs_lock",&obj0,&arg3,&arg4,&arg5,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10516,7 +11173,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_lock(PyObject *SWIGUNUSEDPARM(self), PyO
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_lock_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_lock_t,
_global_py_pool, args))
;
@@ -10533,6 +11190,106 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_fs_unlock_many(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg6 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg7 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|OO:svn_repos_fs_unlock_many",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = svn_swig_py_stringhash_from_dict(obj1, _global_pool);
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_fs_lock_callback_t) svn_swig_py_fs_lock_callback;
+ arg5 = obj3;
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_fs_unlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -10553,7 +11310,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_unlock(PyObject *SWIGUNUSEDPARM(self), P
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OszO|O:svn_repos_fs_unlock",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10628,7 +11385,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_get_locks2(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_repos_fs_get_locks2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10641,7 +11398,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_get_locks2(PyObject *SWIGUNUSEDPARM(self
}
{
/* FIXME: Handle the NULL case. */
- arg5 = svn_swig_py_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg6 = obj3;
}
if (obj4) {
@@ -10715,14 +11472,14 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_get_locks(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_repos_fs_get_locks",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
/* FIXME: Handle the NULL case. */
- arg4 = svn_swig_py_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg5 = obj2;
}
if (obj3) {
@@ -10805,7 +11562,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop4(PyObject *SWIGUNUSEDPAR
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOOOOO|O:svn_repos_fs_change_rev_prop4",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10817,7 +11574,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop4(PyObject *SWIGUNUSEDPAR
}
}
{
- arg5 = (svn_string_t **)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj4);
+ arg5 = (svn_string_t **)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_svn_string_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10849,7 +11606,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop4(PyObject *SWIGUNUSEDPAR
}
{
/* FIXME: Handle the NULL case. */
- arg9 = svn_swig_py_repos_authz_func;
+ arg9 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg10 = obj8;
}
if (obj9) {
@@ -10934,7 +11691,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop3(PyObject *SWIGUNUSEDPAR
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOOOO|O:svn_repos_fs_change_rev_prop3",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10972,7 +11729,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop3(PyObject *SWIGUNUSEDPAR
}
{
/* FIXME: Handle the NULL case. */
- arg8 = svn_swig_py_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg9 = obj7;
}
if (obj8) {
@@ -11040,7 +11797,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop2(PyObject *SWIGUNUSEDPAR
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssOO|O:svn_repos_fs_change_rev_prop2",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11066,7 +11823,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop2(PyObject *SWIGUNUSEDPAR
}
{
/* FIXME: Handle the NULL case. */
- arg6 = svn_swig_py_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg7 = obj5;
}
if (obj6) {
@@ -11131,7 +11888,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_rev_prop(PyObject *SWIGUNUSEDPARM
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOssO|O:svn_repos_fs_change_rev_prop",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11219,7 +11976,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_revision_prop(PyObject *SWIGUNUSEDPARM(s
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_repos_fs_revision_prop",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11232,7 +11989,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_revision_prop(PyObject *SWIGUNUSEDPARM(s
}
{
/* FIXME: Handle the NULL case. */
- arg5 = svn_swig_py_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg6 = obj3;
}
if (obj4) {
@@ -11311,7 +12068,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_revision_proplist(PyObject *SWIGUNUSEDPA
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_fs_revision_proplist",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11324,7 +12081,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_revision_proplist(PyObject *SWIGUNUSEDPA
}
{
/* FIXME: Handle the NULL case. */
- arg4 = svn_swig_py_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg5 = obj2;
}
if (obj3) {
@@ -11390,7 +12147,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_node_prop(PyObject *SWIGUNUSEDPAR
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssO|O:svn_repos_fs_change_node_prop",&obj0,&arg2,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ arg1 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11447,6 +12204,102 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_fs_get_inherited_props(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ apr_array_header_t *temp1 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg7 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg8 = _global_pool;
+ arg1 = &temp1;
+ if (!PyArg_ParseTuple(args,(char *)"OssO|OO:svn_repos_fs_get_inherited_props",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5)) SWIG_fail;
+ {
+ arg2 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ /* FIXME: Handle the NULL case. */
+ arg5 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
+ arg6 = obj3;
+ }
+ if (obj4) {
+ /* Verify that the user supplied a valid pool */
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
+ SWIG_fail;
+ }
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_propinheriteditemarray_to_dict(*arg1));
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_fs_change_txn_prop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_fs_txn_t *arg1 = (svn_fs_txn_t *) 0 ;
@@ -11467,7 +12320,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_txn_prop(PyObject *SWIGUNUSEDPARM
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_repos_fs_change_txn_prop",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11542,13 +12395,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_fs_change_txn_props(PyObject *SWIGUNUSEDPAR
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_repos_fs_change_txn_props",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg1 = (svn_fs_txn_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
+ arg1 = (svn_fs_txn_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_fs_txn_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11601,7 +12454,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_kind_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11628,7 +12481,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_kind_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11649,7 +12502,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_action_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Oc:svn_repos_node_t_action_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11670,7 +12523,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_action_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11692,7 +12545,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_text_mod_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_text_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11719,7 +12572,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_text_mod_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_text_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11741,7 +12594,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_prop_mod_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_prop_mod_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11768,7 +12621,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_prop_mod_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_prop_mod_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11789,7 +12642,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_name_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"Os:svn_repos_node_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11817,7 +12670,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_name_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11839,7 +12692,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_copyfrom_rev_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11866,7 +12719,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_copyfrom_rev_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11887,7 +12740,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_copyfrom_path_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_repos_node_t_copyfrom_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11915,7 +12768,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_copyfrom_path_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_copyfrom_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11937,13 +12790,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_sibling_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_sibling_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
+ arg2 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11964,13 +12817,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_sibling_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_sibling_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (struct svn_repos_node_t *) ((arg1)->sibling);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11987,13 +12840,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_child_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_child_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
+ arg2 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12014,13 +12867,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_child_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_child_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (struct svn_repos_node_t *) ((arg1)->child);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12037,13 +12890,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_parent_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_node_t_parent_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
+ arg2 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12064,13 +12917,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_t_parent_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_node_t_parent_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_node_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_node_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_node_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (struct svn_repos_node_t *) ((arg1)->parent);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12117,19 +12970,19 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_editor(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_repos_node_editor",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg5 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12170,13 +13023,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_editor(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -12222,7 +13075,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_node_from_baton(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_repos_node_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12230,6 +13083,260 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_info_format(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg4 = _global_pool;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg5 = _global_pool;
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_repos_info_format",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
+ SWIG_fail;
+ }
+ }
+ if (obj2) {
+ /* Verify that the user supplied a valid pool */
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_info_format(arg1,arg2,arg3,arg4,arg5);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_info_format is not implemented yet");
+
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_verify_fs3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg2 ;
+ svn_revnum_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_repos_notify_func_t arg6 = (svn_repos_notify_func_t) 0 ;
+ void *arg7 = (void *) 0 ;
+ svn_repos_verify_callback_t arg8 = (svn_repos_verify_callback_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_cancel_func_t arg10 = (svn_cancel_func_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg12 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO|O:svn_repos_verify_fs3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_revnum_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_repos_notify_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj5);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg6 = *tmp;
+ }
+ {
+ if (obj6 == Py_None) {
+ arg7 = NULL;
+ } else if (SWIG_ConvertPtr(obj6, (void **) &arg7, 0, 0) == -1) {
+ arg7 = (void *) obj6;
+ PyErr_Clear();
+ }
+ }
+ {
+ svn_repos_verify_callback_t * tmp =
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg8 = *tmp;
+ }
+ {
+ if (obj8 == Py_None) {
+ arg9 = NULL;
+ } else if (SWIG_ConvertPtr(obj8, (void **) &arg9, 0, 0) == -1) {
+ arg9 = (void *) obj8;
+ PyErr_Clear();
+ }
+ }
+ {
+ svn_cancel_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj9);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg10 = *tmp;
+ }
+ {
+ if (obj10 == Py_None) {
+ arg11 = NULL;
+ } else if (SWIG_ConvertPtr(obj10, (void **) &arg11, 0, 0) == -1) {
+ arg11 = (void *) obj10;
+ PyErr_Clear();
+ }
+ }
+ if (obj11) {
+ /* Verify that the user supplied a valid pool */
+ if (obj11 != Py_None && obj11 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj11);
+ SWIG_arg_fail(svn_argnum_obj11);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_verify_fs3(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_verify_fs2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -12258,7 +13365,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_verify_fs2(PyObject *SWIGUNUSEDPARM(self),
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOO|O:svn_repos_verify_fs2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12277,7 +13384,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_verify_fs2(PyObject *SWIGUNUSEDPARM(self),
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj3, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj3);
+ svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj3);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -12293,7 +13400,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_verify_fs2(PyObject *SWIGUNUSEDPARM(self),
}
{
svn_cancel_func_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -12371,7 +13478,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_verify_fs(PyObject *SWIGUNUSEDPARM(self), P
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOO|O:svn_repos_verify_fs",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12392,8 +13499,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_verify_fs(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -12467,7 +13574,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs3(PyObject *SWIGUNUSEDPARM(self), Py
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO|O:svn_repos_dump_fs3",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12501,7 +13608,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs3(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -12516,8 +13623,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj8; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj8;
}
if (obj9) {
/* Verify that the user supplied a valid pool */
@@ -12589,7 +13696,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs2(PyObject *SWIGUNUSEDPARM(self), Py
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO|O:svn_repos_dump_fs2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12625,8 +13732,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj7; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -12696,7 +13803,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs(PyObject *SWIGUNUSEDPARM(self), PyO
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOO|O:svn_repos_dump_fs",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12726,8 +13833,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_dump_fs(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj6; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
}
if (obj7) {
/* Verify that the user supplied a valid pool */
@@ -12768,6 +13875,155 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_load_fs5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ enum svn_repos_load_uuid arg5 ;
+ char *arg6 = (char *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_repos_notify_func_t arg11 = (svn_repos_notify_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ PyObject * obj12 = 0 ;
+ PyObject * obj13 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg15 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOzOOOOOOO|O:svn_repos_load_fs5",&obj0,&obj1,&obj2,&obj3,&obj4,&arg6,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
+ {
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = svn_swig_py_make_stream (obj1, _global_pool);
+ }
+ {
+ arg3 = (svn_revnum_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_revnum_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (enum svn_repos_load_uuid)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (svn_boolean_t)SWIG_As_long (obj7);
+ if (SWIG_arg_fail(svn_argnum_obj7)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg9 = (svn_boolean_t)SWIG_As_long (obj8);
+ if (SWIG_arg_fail(svn_argnum_obj8)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (svn_boolean_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_repos_notify_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj10);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg11 = *tmp;
+ }
+ {
+ if (obj11 == Py_None) {
+ arg12 = NULL;
+ } else if (SWIG_ConvertPtr(obj11, (void **) &arg12, 0, 0) == -1) {
+ arg12 = (void *) obj11;
+ PyErr_Clear();
+ }
+ }
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg14 = obj12;
+ }
+ if (obj13) {
+ /* Verify that the user supplied a valid pool */
+ if (obj13 != Py_None && obj13 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj13);
+ SWIG_arg_fail(svn_argnum_obj13);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_load_fs5(arg1,arg2,arg3,arg4,arg5,(char const *)arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_load_fs4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
@@ -12806,7 +14062,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs4(PyObject *SWIGUNUSEDPARM(self), Py
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOOzOOOOOO|O:svn_repos_load_fs4",&obj0,&obj1,&obj2,&obj3,&obj4,&arg6,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12852,7 +14108,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs4(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj9, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj9);
+ svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj9);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -12867,8 +14123,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs4(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg12 = svn_swig_py_cancel_func;
- arg13 = obj11; /* our function is the baton. */
+ arg12 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg13 = obj11;
}
if (obj12) {
/* Verify that the user supplied a valid pool */
@@ -12943,7 +14199,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs3(PyObject *SWIGUNUSEDPARM(self), Py
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOzOOOOOO|O:svn_repos_load_fs3",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12977,7 +14233,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs3(PyObject *SWIGUNUSEDPARM(self), Py
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -12992,8 +14248,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs3(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj9; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj9;
}
if (obj10) {
/* Verify that the user supplied a valid pool */
@@ -13064,7 +14320,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs2(PyObject *SWIGUNUSEDPARM(self), Py
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOzOOO|O:svn_repos_load_fs2",&obj0,&obj1,&obj2,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13094,8 +14350,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs2(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj7; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -13162,7 +14418,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs(PyObject *SWIGUNUSEDPARM(self), PyO
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOOzO|O:svn_repos_load_fs",&obj0,&obj1,&obj2,&obj3,&arg5,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg1 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13180,8 +14436,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_load_fs(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
if (obj6) {
/* Verify that the user supplied a valid pool */
@@ -13231,7 +14487,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_magic_header_record_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_magic_header_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13258,7 +14514,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_magic_header_record_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_magic_header_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13280,7 +14536,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_uuid_record_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_uuid_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13307,7 +14563,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_uuid_record_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_uuid_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13329,7 +14585,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_new_revision_record_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_new_revision_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13356,7 +14612,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_new_revision_record_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_new_revision_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13378,7 +14634,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_new_node_record_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_new_node_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13405,7 +14661,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_new_node_record_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_new_node_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13427,7 +14683,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_revision_property_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_set_revision_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13454,7 +14710,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_revision_property_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_set_revision_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13476,7 +14732,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_node_property_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_set_node_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13503,7 +14759,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_node_property_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_set_node_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13525,7 +14781,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_delete_node_property_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_delete_node_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13552,7 +14808,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_delete_node_property_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_delete_node_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13574,7 +14830,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_remove_node_props_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_remove_node_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13601,7 +14857,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_remove_node_props_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_remove_node_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13623,7 +14879,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_fulltext_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_set_fulltext_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13650,7 +14906,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_set_fulltext_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_set_fulltext_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13672,7 +14928,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_apply_textdelta_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_apply_textdelta_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13699,7 +14955,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_apply_textdelta_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_apply_textdelta_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13721,7 +14977,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_close_node_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_close_node_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13748,7 +15004,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_close_node_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_close_node_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13770,7 +15026,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_close_revision_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_t_close_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13797,7 +15053,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_t_close_revision_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns3_t_close_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13845,7 +15101,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream3(PyObject *SWIGUNUSEDPARM(
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj1);
+ arg2 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13865,8 +15121,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream3(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -13907,6 +15163,169 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
+ void **arg2 = (void **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg4 ;
+ svn_revnum_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ enum svn_repos_load_uuid arg8 ;
+ char *arg9 = (char *) 0 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_boolean_t arg12 ;
+ svn_repos_notify_func_t arg13 = (svn_repos_notify_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ svn_repos_parse_fns3_t *temp1 ;
+ void *temp2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ PyObject * obj10 = 0 ;
+ PyObject * obj11 = 0 ;
+ PyObject * obj12 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg15 = _global_pool;
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOOzOOOOO|O:svn_repos_get_fs_build_parser5",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&arg9,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail;
+ {
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_revnum_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_revnum_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (enum svn_repos_load_uuid)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg10 = (svn_boolean_t)SWIG_As_long (obj7);
+ if (SWIG_arg_fail(svn_argnum_obj7)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg11 = (svn_boolean_t)SWIG_As_long (obj8);
+ if (SWIG_arg_fail(svn_argnum_obj8)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg12 = (svn_boolean_t)SWIG_As_long (obj9);
+ if (SWIG_arg_fail(svn_argnum_obj9)) {
+ SWIG_fail;
+ }
+ }
+ {
+ svn_repos_notify_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj10);
+ if (tmp == NULL || PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ arg13 = *tmp;
+ }
+ {
+ if (obj11 == Py_None) {
+ arg14 = NULL;
+ } else if (SWIG_ConvertPtr(obj11, (void **) &arg14, 0, 0) == -1) {
+ arg14 = (void *) obj11;
+ PyErr_Clear();
+ }
+ }
+ if (obj12) {
+ /* Verify that the user supplied a valid pool */
+ if (obj12 != Py_None && obj12 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj12);
+ SWIG_arg_fail(svn_argnum_obj12);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_repos_get_fs_build_parser5((struct svn_repos_parse_fns3_t const **)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,(char const *)arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
@@ -13944,7 +15363,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser4(PyObject *SWIGUNUSEDPA
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOOOzOO|O:svn_repos_get_fs_build_parser4",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&arg9,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13981,7 +15400,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser4(PyObject *SWIGUNUSEDPA
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -14023,16 +15442,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser4(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser4 arg 1 (svn_repos_parse_fns3_t const **) */
-
-
-
-
- SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser4 is not implemented yet");
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t,
+ _global_py_pool, args))
+ ;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -14058,7 +15474,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_new_revision_record_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_new_revision_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14085,7 +15501,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_new_revision_record_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_new_revision_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14107,7 +15523,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_uuid_record_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_uuid_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14134,7 +15550,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_uuid_record_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_uuid_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14156,7 +15572,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_new_node_record_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_new_node_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14183,7 +15599,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_new_node_record_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_new_node_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14205,7 +15621,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_revision_property_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_set_revision_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14232,7 +15648,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_revision_property_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_set_revision_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14254,7 +15670,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_node_property_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_set_node_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14281,7 +15697,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_node_property_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_set_node_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14303,7 +15719,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_delete_node_property_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_delete_node_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14330,7 +15746,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_delete_node_property_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_delete_node_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14352,7 +15768,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_remove_node_props_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_remove_node_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14379,7 +15795,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_remove_node_props_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_remove_node_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14401,7 +15817,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_fulltext_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_set_fulltext_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14428,7 +15844,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_set_fulltext_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_set_fulltext_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14450,7 +15866,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_apply_textdelta_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_apply_textdelta_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14477,7 +15893,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_apply_textdelta_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_apply_textdelta_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14499,7 +15915,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_close_node_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_close_node_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14526,7 +15942,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_close_node_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_close_node_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14548,7 +15964,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_close_revision_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_t_close_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14575,7 +15991,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_t_close_revision_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parse_fns2_t_close_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14604,7 +16020,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_new_revision_record_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_new_revision_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14631,7 +16047,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_new_revision_record_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_new_revision_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14653,7 +16069,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_uuid_record_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_uuid_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14680,7 +16096,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_uuid_record_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_uuid_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14702,7 +16118,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_new_node_record_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_new_node_record_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14729,7 +16145,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_new_node_record_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_new_node_record_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14751,7 +16167,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_revision_property_set(PyOb
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_set_revision_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14778,7 +16194,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_revision_property_get(PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_set_revision_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14800,7 +16216,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_node_property_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_set_node_property_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14827,7 +16243,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_node_property_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_set_node_property_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14849,7 +16265,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_remove_node_props_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_remove_node_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14876,7 +16292,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_remove_node_props_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_remove_node_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14898,7 +16314,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_fulltext_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_set_fulltext_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14925,7 +16341,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_set_fulltext_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_set_fulltext_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14947,7 +16363,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_close_node_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_close_node_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14974,7 +16390,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_close_node_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_close_node_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14996,7 +16412,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_close_revision_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parser_fns_t_close_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15023,7 +16439,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parser_fns_t_close_revision_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_repos_parser_fns_t_close_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_repos_parse_fns_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
+ arg1 = (struct svn_repos_parse_fns_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15069,7 +16485,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream2(PyObject *SWIGUNUSEDPARM(
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_repos_parser_fns2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj1);
+ arg2 = (svn_repos_parser_fns2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15083,8 +16499,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream2(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -15151,7 +16567,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream(PyObject *SWIGUNUSEDPARM(s
arg1 = svn_swig_py_make_stream (obj0, _global_pool);
}
{
- arg2 = (svn_repos_parser_fns_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj1);
+ arg2 = (svn_repos_parser_fns_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_parse_fns_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15165,8 +16581,8 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_dumpstream(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -15240,7 +16656,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser3(PyObject *SWIGUNUSEDPA
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOzOO|O:svn_repos_get_fs_build_parser3",&obj0,&obj1,&obj2,&obj3,&arg7,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15265,7 +16681,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser3(PyObject *SWIGUNUSEDPA
}
{
svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -15307,13 +16723,16 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser3(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t,
- _global_py_pool, args))
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser3 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser3 is not implemented yet");
- ;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15359,7 +16778,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser2(PyObject *SWIGUNUSEDPA
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOz|O:svn_repos_get_fs_build_parser2",&obj0,&obj1,&obj2,&obj3,&arg7,&obj5)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15407,13 +16826,16 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser2(PyObject *SWIGUNUSEDPA
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t,
- _global_py_pool, args))
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser2 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser2 is not implemented yet");
- ;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15459,7 +16881,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser(PyObject *SWIGUNUSEDPAR
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOOOz|O:svn_repos_get_fs_build_parser",&obj0,&obj1,&obj2,&obj3,&arg7,&obj5)) SWIG_fail;
{
- arg3 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
+ arg3 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15507,13 +16929,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_get_fs_build_parser(PyObject *SWIGUNUSEDPAR
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_repos_parse_fns_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -15584,7 +17006,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_authz_read2(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_authz_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_authz_t,
_global_py_pool, args))
;
@@ -15654,7 +17076,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_authz_read(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_authz_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_authz_t,
_global_py_pool, args))
;
@@ -15725,7 +17147,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_authz_parse(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_authz_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_authz_t,
_global_py_pool, args))
;
@@ -15767,7 +17189,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_authz_check_access(PyObject *SWIGUNUSEDPARM
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"OsszO|O:svn_repos_authz_check_access",&obj0,&arg2,&arg3,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_authz_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_authz_t, svn_argnum_obj0);
+ arg1 = (svn_authz_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_authz_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15846,13 +17268,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_check_revision_access(PyObject *SWIGUNUSEDP
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_repos_check_revision_access",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_repos_revision_access_level_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_revision_access_level_t, svn_argnum_obj0);
+ arg1 = (svn_repos_revision_access_level_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_revision_access_level_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_repos_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
+ arg2 = (svn_repos_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_repos_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15865,7 +17287,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_check_revision_access(PyObject *SWIGUNUSEDP
}
{
/* FIXME: Handle the NULL case. */
- arg4 = svn_swig_py_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_py_repos_authz_func;
arg5 = obj3;
}
if (obj4) {
@@ -15907,148 +17329,6 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_repos_fs_get_inherited_props(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
- svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
- char *arg3 = (char *) 0 ;
- char *arg4 = (char *) 0 ;
- svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
- void *arg6 = (void *) 0 ;
- apr_pool_t *arg7 = (apr_pool_t *) 0 ;
- apr_pool_t *arg8 = (apr_pool_t *) 0 ;
- apr_pool_t *_global_pool = NULL ;
- PyObject *_global_py_pool = NULL ;
- apr_array_header_t *temp1 ;
- PyObject * obj0 = 0 ;
- PyObject * obj3 = 0 ;
- PyObject * obj4 = 0 ;
- PyObject * obj5 = 0 ;
- svn_error_t *result = 0 ;
-
- if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
- &_global_py_pool, &_global_pool))
- SWIG_fail;
- arg7 = _global_pool;
- if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
- &_global_py_pool, &_global_pool))
- SWIG_fail;
- arg8 = _global_pool;
- arg1 = &temp1;
- if (!PyArg_ParseTuple(args,(char *)"OssO|OO:svn_repos_fs_get_inherited_props",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5)) SWIG_fail;
- {
- arg2 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- /* FIXME: Handle the NULL case. */
- arg5 = svn_swig_py_repos_authz_func;
- arg6 = obj3;
- }
- if (obj4) {
- /* Verify that the user supplied a valid pool */
- if (obj4 != Py_None && obj4 != _global_py_pool) {
- SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
- SWIG_arg_fail(svn_argnum_obj4);
- SWIG_fail;
- }
- }
- if (obj5) {
- /* Verify that the user supplied a valid pool */
- if (obj5 != Py_None && obj5 != _global_py_pool) {
- SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
- SWIG_arg_fail(svn_argnum_obj5);
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
-
- svn_swig_py_acquire_py_lock();
-
- }
- {
- if (result != NULL) {
- if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
- svn_swig_py_svn_exception(result);
- else
- svn_error_clear(result);
- SWIG_fail;
- }
- Py_INCREF(Py_None);
- resultobj = Py_None;
- }
- {
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_propinheriteditemarray_to_dict(*arg1));
- }
- {
- Py_XDECREF(_global_py_pool);
- }
- {
- Py_XDECREF(_global_py_pool);
- }
- return resultobj;
-fail:
- {
- Py_XDECREF(_global_py_pool);
- }
- {
- Py_XDECREF(_global_py_pool);
- }
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_repos_remember_client_capabilities(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- svn_repos_t *arg1 = (svn_repos_t *) 0 ;
- apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
- svn_error_t *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_remember_client_capabilities",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (svn_repos_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
-
- svn_swig_py_acquire_py_lock();
-
- }
- {
- if (result != NULL) {
- if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
- svn_swig_py_svn_exception(result);
- else
- svn_error_clear(result);
- SWIG_fail;
- }
- Py_INCREF(Py_None);
- resultobj = Py_None;
- }
- return resultobj;
-fail:
- return NULL;
-}
-
-
SWIGINTERN PyObject *svn_repos_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -16083,7 +17363,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_magic_header_record(PyObj
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_parse_fns3_invoke_magic_header_record",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16160,7 +17440,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_uuid_record(PyObject *SWI
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OzO|O:svn_repos_parse_fns3_invoke_uuid_record",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16235,13 +17515,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_new_revision_record(PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_parse_fns3_invoke_new_revision_record",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16282,7 +17562,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_new_revision_record(PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16322,13 +17602,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_new_node_record(PyObject
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_parse_fns3_invoke_new_node_record",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16369,7 +17649,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_new_node_record(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16400,7 +17680,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_set_revision_property(PyO
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_repos_parse_fns3_invoke_set_revision_property",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16465,7 +17745,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_set_node_property(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_repos_parse_fns3_invoke_set_node_property",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16527,7 +17807,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_delete_node_property(PyOb
if (!PyArg_ParseTuple(args,(char *)"OOs:svn_repos_parse_fns3_invoke_delete_node_property",&obj0,&obj1,&arg3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16575,7 +17855,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_remove_node_props(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_invoke_remove_node_props",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16626,7 +17906,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_set_fulltext(PyObject *SW
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_invoke_set_fulltext",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16659,7 +17939,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_set_fulltext(PyObject *SW
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -16696,7 +17976,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_apply_textdelta(PyObject
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_invoke_apply_textdelta",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16729,13 +18009,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_apply_textdelta(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16756,7 +18036,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_close_node(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_invoke_close_node",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16804,7 +18084,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns3_invoke_close_revision(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns3_invoke_close_revision",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16865,13 +18145,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_new_revision_record(PyObj
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_parse_fns2_invoke_new_revision_record",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16912,7 +18192,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_new_revision_record(PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -16948,7 +18228,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_uuid_record(PyObject *SWI
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OzO|O:svn_repos_parse_fns2_invoke_uuid_record",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17023,13 +18303,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_new_node_record(PyObject
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_parse_fns2_invoke_new_node_record",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg3 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17070,7 +18350,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_new_node_record(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -17101,7 +18381,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_set_revision_property(PyO
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_repos_parse_fns2_invoke_set_revision_property",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17166,7 +18446,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_set_node_property(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_repos_parse_fns2_invoke_set_node_property",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17228,7 +18508,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_delete_node_property(PyOb
if (!PyArg_ParseTuple(args,(char *)"OOs:svn_repos_parse_fns2_invoke_delete_node_property",&obj0,&obj1,&arg3)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17276,7 +18556,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_remove_node_props(PyObjec
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_invoke_remove_node_props",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17327,7 +18607,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_set_fulltext(PyObject *SW
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_invoke_set_fulltext",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17360,7 +18640,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_set_fulltext(PyObject *SW
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -17397,7 +18677,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_apply_textdelta(PyObject
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_invoke_apply_textdelta",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17430,13 +18710,13 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_apply_textdelta(PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg2, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -17457,7 +18737,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_close_node(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_invoke_close_node",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17505,7 +18785,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_parse_fns2_invoke_close_revision(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_repos_parse_fns2_invoke_close_revision",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_repos_parse_fns2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
+ arg1 = (svn_repos_parse_fns2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_repos_parse_fns2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17569,14 +18849,14 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_authz_func(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_repos_invoke_authz_func",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
svn_repos_authz_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg3 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
+ arg3 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17662,7 +18942,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_authz_callback(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OOOsO|O:svn_repos_invoke_authz_callback",&obj0,&obj1,&obj2,&arg5,&obj4,&obj5)) SWIG_fail;
{
svn_repos_authz_callback_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17675,7 +18955,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_authz_callback(PyObject *SWIGUNUSEDP
}
}
{
- arg4 = (svn_fs_root_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
+ arg4 = (svn_fs_root_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_fs_root_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17733,47 +19013,27 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_repos_invoke_file_rev_handler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_repos_invoke_notify_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
- svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
+ svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
- apr_hash_t *arg5 = (apr_hash_t *) 0 ;
- svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
- void **arg7 = (void **) 0 ;
- apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
- apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool = NULL ;
PyObject *_global_py_pool = NULL ;
- void *temp7 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
PyObject * obj3 = 0 ;
- PyObject * obj4 = 0 ;
- PyObject * obj5 = 0 ;
- PyObject * obj6 = 0 ;
- svn_error_t *result = 0 ;
if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
&_global_py_pool, &_global_pool))
SWIG_fail;
- arg9 = _global_pool;
- {
- if (_global_pool == NULL)
- {
- if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
- &_global_py_pool, &_global_pool))
- SWIG_fail;
- }
- arg6 = (svn_txdelta_window_handler_t *) apr_pcalloc(_global_pool, sizeof(svn_txdelta_window_handler_t));
- if (arg6 == NULL) SWIG_fail;
- }
- arg7 = &temp7;
- if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_repos_invoke_file_rev_handler",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+ arg4 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_invoke_notify_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
- svn_repos_file_rev_handler_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_repos_notify_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17788,35 +19048,85 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_file_rev_handler(PyObject *SWIGUNUSE
}
}
{
- arg4 = (svn_revnum_t)SWIG_As_long (obj3);
- if (SWIG_arg_fail(svn_argnum_obj3)) {
+ arg3 = (svn_repos_notify_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj2);
+ if (PyErr_Occurred()) {
SWIG_fail;
}
}
- {
- arg5 = (apr_hash_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
- if (PyErr_Occurred()) {
+ if (obj3) {
+ /* Verify that the user supplied a valid pool */
+ if (obj3 != Py_None && obj3 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
+ SWIG_arg_fail(svn_argnum_obj3);
SWIG_fail;
}
}
{
- arg8 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
- if (PyErr_Occurred()) {
+ svn_swig_py_release_py_lock();
+
+ svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ resultobj = SWIG_Py_Void();
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_repos_invoke_freeze_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg3 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_repos_invoke_freeze_func",&obj0,&obj1,&obj2)) SWIG_fail;
+ {
+ svn_repos_freeze_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
+ arg1 = *tmp;
}
- if (obj6) {
+ {
+ if (obj1 == Py_None) {
+ arg2 = NULL;
+ } else if (SWIG_ConvertPtr(obj1, (void **) &arg2, 0, 0) == -1) {
+ arg2 = (void *) obj1;
+ PyErr_Clear();
+ }
+ }
+ if (obj2) {
/* Verify that the user supplied a valid pool */
- if (obj6 != Py_None && obj6 != _global_py_pool) {
- SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj6);
- SWIG_arg_fail(svn_argnum_obj6);
+ if (obj2 != Py_None && obj2 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
+ SWIG_arg_fail(svn_argnum_obj2);
SWIG_fail;
}
}
{
svn_swig_py_release_py_lock();
- result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
svn_swig_py_acquire_py_lock();
@@ -17833,18 +19143,6 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_file_rev_handler(PyObject *SWIGUNUSE
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
- _global_py_pool, args))
-
- ;
- }
- {
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg7, SWIGTYPE_p_void,
- _global_py_pool, args))
-
- ;
- }
- {
Py_XDECREF(_global_py_pool);
}
return resultobj;
@@ -17856,27 +19154,29 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_repos_invoke_notify_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_repos_invoke_history_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
- svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
+ svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
void *arg2 = (void *) 0 ;
- svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
- apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool = NULL ;
PyObject *_global_py_pool = NULL ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
- PyObject * obj2 = 0 ;
PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ svn_error_t *result = 0 ;
if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
&_global_py_pool, &_global_pool))
SWIG_fail;
- arg4 = _global_pool;
- if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_repos_invoke_notify_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+ arg5 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_repos_invoke_history_func",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- svn_repos_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_repos_history_func_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17891,28 +19191,38 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_notify_func(PyObject *SWIGUNUSEDPARM
}
}
{
- arg3 = (svn_repos_notify_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_repos_notify_t, svn_argnum_obj2);
- if (PyErr_Occurred()) {
+ arg4 = (svn_revnum_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
SWIG_fail;
}
}
- if (obj3) {
+ if (obj4) {
/* Verify that the user supplied a valid pool */
- if (obj3 != Py_None && obj3 != _global_py_pool) {
- SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj3);
- SWIG_arg_fail(svn_argnum_obj3);
+ if (obj4 != Py_None && obj4 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj4);
+ SWIG_arg_fail(svn_argnum_obj4);
SWIG_fail;
}
}
{
svn_swig_py_release_py_lock();
- svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+ result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
svn_swig_py_acquire_py_lock();
}
- resultobj = SWIG_Py_Void();
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
{
Py_XDECREF(_global_py_pool);
}
@@ -17925,26 +19235,47 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_repos_invoke_freeze_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_repos_invoke_file_rev_handler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
- svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+ svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
void *arg2 = (void *) 0 ;
- apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_hash_t *arg5 = (apr_hash_t *) 0 ;
+ svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
+ void **arg7 = (void **) 0 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool = NULL ;
PyObject *_global_py_pool = NULL ;
+ void *temp7 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
- PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
svn_error_t *result = 0 ;
if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
&_global_py_pool, &_global_pool))
SWIG_fail;
- arg3 = _global_pool;
- if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_repos_invoke_freeze_func",&obj0,&obj1,&obj2)) SWIG_fail;
+ arg9 = _global_pool;
{
- svn_repos_freeze_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+ arg6 = (svn_txdelta_window_handler_t *) apr_pcalloc(_global_pool, sizeof(svn_txdelta_window_handler_t));
+ if (arg6 == NULL) SWIG_fail;
+ }
+ arg7 = &temp7;
+ if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_repos_invoke_file_rev_handler",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+ {
+ svn_repos_file_rev_handler_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -17958,18 +19289,36 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_freeze_func(PyObject *SWIGUNUSEDPARM
PyErr_Clear();
}
}
- if (obj2) {
+ {
+ arg4 = (svn_revnum_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_hash_t, svn_argnum_obj4);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj6) {
/* Verify that the user supplied a valid pool */
- if (obj2 != Py_None && obj2 != _global_py_pool) {
- SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj2);
- SWIG_arg_fail(svn_argnum_obj2);
+ if (obj6 != Py_None && obj6 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj6);
+ SWIG_arg_fail(svn_argnum_obj6);
SWIG_fail;
}
}
{
svn_swig_py_release_py_lock();
- result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
svn_swig_py_acquire_py_lock();
@@ -17986,6 +19335,18 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_freeze_func(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(arg6, SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg7, SWIGTYPE_p_void,
+ _global_py_pool, args))
+
+ ;
+ }
+ {
Py_XDECREF(_global_py_pool);
}
return resultobj;
@@ -17997,17 +19358,18 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_repos_invoke_history_func(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_repos_invoke_verify_callback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
- svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
+ svn_repos_verify_callback_t arg1 = (svn_repos_verify_callback_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
+ svn_revnum_t arg3 ;
+ svn_error_t *arg4 = (svn_error_t *) 0 ;
apr_pool_t *arg5 = (apr_pool_t *) 0 ;
apr_pool_t *_global_pool = NULL ;
PyObject *_global_py_pool = NULL ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
+ PyObject * obj2 = 0 ;
PyObject * obj3 = 0 ;
PyObject * obj4 = 0 ;
svn_error_t *result = 0 ;
@@ -18016,10 +19378,10 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_history_func(PyObject *SWIGUNUSEDPAR
&_global_py_pool, &_global_pool))
SWIG_fail;
arg5 = _global_pool;
- if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_repos_invoke_history_func",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"OOOO|O:svn_repos_invoke_verify_callback",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- svn_repos_history_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_repos_verify_callback_t * tmp =
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -18034,8 +19396,14 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_history_func(PyObject *SWIGUNUSEDPAR
}
}
{
- arg4 = (svn_revnum_t)SWIG_As_long (obj3);
- if (SWIG_arg_fail(svn_argnum_obj3)) {
+ arg3 = (svn_revnum_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_error_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_error_t, svn_argnum_obj3);
+ if (PyErr_Occurred()) {
SWIG_fail;
}
}
@@ -18050,7 +19418,7 @@ SWIGINTERN PyObject *_wrap_svn_repos_invoke_history_func(PyObject *SWIGUNUSEDPAR
{
svn_swig_py_release_py_lock();
- result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
+ result = (svn_error_t *)svn_repos_invoke_verify_callback(arg1,arg2,arg3,arg4,arg5);
svn_swig_py_acquire_py_lock();
@@ -18092,13 +19460,6 @@ SWIGINTERN PyObject *svn_repos_authz_callback_t_swigregister(PyObject *SWIGUNUSE
return SWIG_Py_Void();
}
-SWIGINTERN PyObject *svn_repos_file_rev_handler_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *obj;
- if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
- SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
- return SWIG_Py_Void();
-}
-
SWIGINTERN PyObject *svn_repos_notify_func_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
@@ -18120,8 +19481,23 @@ SWIGINTERN PyObject *svn_repos_history_func_t_swigregister(PyObject *SWIGUNUSEDP
return SWIG_Py_Void();
}
+SWIGINTERN PyObject *svn_repos_file_rev_handler_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *svn_repos_verify_callback_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *obj;
+ if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+ SWIG_TypeNewClientData(SWIGTYPE_p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, SWIG_NewClientData(obj));
+ return SWIG_Py_Void();
+}
+
static PyMethodDef SwigMethods[] = {
{ (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
+ { (char *)"svn_swig_py_make_parse_fns3", _wrap_svn_swig_py_make_parse_fns3, METH_VARARGS, (char *)"svn_swig_py_make_parse_fns3(PyObject * py_parse_fns3, apr_pool_t pool)"},
{ (char *)"svn_repos_version", _wrap_svn_repos_version, METH_VARARGS, (char *)"svn_repos_version() -> svn_version_t const *"},
{ (char *)"svn_repos_notify_t_action_set", _wrap_svn_repos_notify_t_action_set, METH_VARARGS, (char *)"svn_repos_notify_t_action_set(svn_repos_notify_t self, svn_repos_notify_action_t action)"},
{ (char *)"svn_repos_notify_t_action_get", _wrap_svn_repos_notify_t_action_get, METH_VARARGS, (char *)"svn_repos_notify_t_action_get(svn_repos_notify_t self) -> svn_repos_notify_action_t"},
@@ -18141,9 +19517,14 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_repos_notify_t_node_action_get", _wrap_svn_repos_notify_t_node_action_get, METH_VARARGS, (char *)"svn_repos_notify_t_node_action_get(svn_repos_notify_t self) -> enum svn_node_action"},
{ (char *)"svn_repos_notify_t_path_set", _wrap_svn_repos_notify_t_path_set, METH_VARARGS, (char *)"svn_repos_notify_t_path_set(svn_repos_notify_t self, char const * path)"},
{ (char *)"svn_repos_notify_t_path_get", _wrap_svn_repos_notify_t_path_get, METH_VARARGS, (char *)"svn_repos_notify_t_path_get(svn_repos_notify_t self) -> char const *"},
+ { (char *)"svn_repos_notify_t_start_revision_set", _wrap_svn_repos_notify_t_start_revision_set, METH_VARARGS, (char *)"svn_repos_notify_t_start_revision_set(svn_repos_notify_t self, svn_revnum_t start_revision)"},
+ { (char *)"svn_repos_notify_t_start_revision_get", _wrap_svn_repos_notify_t_start_revision_get, METH_VARARGS, (char *)"svn_repos_notify_t_start_revision_get(svn_repos_notify_t self) -> svn_revnum_t"},
+ { (char *)"svn_repos_notify_t_end_revision_set", _wrap_svn_repos_notify_t_end_revision_set, METH_VARARGS, (char *)"svn_repos_notify_t_end_revision_set(svn_repos_notify_t self, svn_revnum_t end_revision)"},
+ { (char *)"svn_repos_notify_t_end_revision_get", _wrap_svn_repos_notify_t_end_revision_get, METH_VARARGS, (char *)"svn_repos_notify_t_end_revision_get(svn_repos_notify_t self) -> svn_revnum_t"},
{ (char *)"svn_repos_notify_t_swigregister", svn_repos_notify_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_notify_create", _wrap_svn_repos_notify_create, METH_VARARGS, (char *)"svn_repos_notify_create(svn_repos_notify_action_t action, apr_pool_t result_pool) -> svn_repos_notify_t"},
{ (char *)"svn_repos_find_root_path", _wrap_svn_repos_find_root_path, METH_VARARGS, (char *)"svn_repos_find_root_path(char const * path, apr_pool_t pool) -> char const *"},
+ { (char *)"svn_repos_open3", _wrap_svn_repos_open3, METH_VARARGS, (char *)"svn_repos_open3(char const * path, apr_hash_t fs_config, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_repos_open2", _wrap_svn_repos_open2, METH_VARARGS, (char *)"svn_repos_open2(char const * path, apr_hash_t fs_config, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_open", _wrap_svn_repos_open, METH_VARARGS, (char *)"svn_repos_open(char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_create", _wrap_svn_repos_create, METH_VARARGS, (char *)"\n"
@@ -18160,7 +19541,15 @@ static PyMethodDef SwigMethods[] = {
""},
{ (char *)"svn_repos_delete", _wrap_svn_repos_delete, METH_VARARGS, (char *)"svn_repos_delete(char const * path, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_has_capability", _wrap_svn_repos_has_capability, METH_VARARGS, (char *)"svn_repos_has_capability(svn_repos_t * repos, char const * capability, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_repos_capabilities", _wrap_svn_repos_capabilities, METH_VARARGS, (char *)"svn_repos_capabilities(svn_repos_t * repos, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities, METH_VARARGS, (char *)"svn_repos_remember_client_capabilities(svn_repos_t * repos, apr_array_header_t capabilities) -> svn_error_t"},
{ (char *)"svn_repos_fs", _wrap_svn_repos_fs, METH_VARARGS, (char *)"svn_repos_fs(svn_repos_t * repos) -> svn_fs_t *"},
+ { (char *)"svn_repos_fs_type", _wrap_svn_repos_fs_type, METH_VARARGS, (char *)"svn_repos_fs_type(svn_repos_t * repos, apr_pool_t result_pool) -> char const *"},
+ { (char *)"svn_repos_hotcopy3", _wrap_svn_repos_hotcopy3, METH_VARARGS, (char *)"\n"
+ "svn_repos_hotcopy3(char const * src_path, char const * dst_path, svn_boolean_t clean_logs, svn_boolean_t incremental, \n"
+ " svn_repos_notify_func_t notify_func, void * notify_baton, \n"
+ " svn_cancel_func_t cancel_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_hotcopy2", _wrap_svn_repos_hotcopy2, METH_VARARGS, (char *)"\n"
"svn_repos_hotcopy2(char const * src_path, char const * dst_path, svn_boolean_t clean_logs, svn_boolean_t incremental, \n"
" svn_cancel_func_t cancel_func, apr_pool_t pool) -> svn_error_t\n"
@@ -18275,9 +19664,9 @@ static PyMethodDef SwigMethods[] = {
""},
{ (char *)"svn_repos_replay", _wrap_svn_repos_replay, METH_VARARGS, (char *)"svn_repos_replay(svn_fs_root_t * root, svn_delta_editor_t editor, void * edit_baton, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_get_commit_editor5", _wrap_svn_repos_get_commit_editor5, METH_VARARGS, (char *)"\n"
- "svn_repos_get_commit_editor5(svn_repos_t * repos, svn_fs_txn_t * txn, char const * repos_url, char const * base_path, \n"
- " apr_hash_t revprop_table, svn_commit_callback2_t commit_callback, svn_repos_authz_callback_t authz_callback, \n"
- " void * authz_baton, apr_pool_t pool) -> svn_error_t\n"
+ "svn_repos_get_commit_editor5(svn_repos_t * repos, svn_fs_txn_t * txn, char const * repos_url_decoded, char const * base_path, \n"
+ " apr_hash_t revprop_table, svn_commit_callback2_t commit_callback, \n"
+ " svn_repos_authz_callback_t authz_callback, void * authz_baton, apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_repos_get_commit_editor4", _wrap_svn_repos_get_commit_editor4, METH_VARARGS, (char *)"\n"
"svn_repos_get_commit_editor4(svn_repos_t * repos, svn_fs_txn_t * txn, char const * repos_url, char const * base_path, \n"
@@ -18367,11 +19756,20 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_repos_fs_begin_txn_for_update", _wrap_svn_repos_fs_begin_txn_for_update, METH_VARARGS, (char *)"svn_repos_fs_begin_txn_for_update(svn_repos_t * repos, svn_revnum_t rev, char const * author, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_repos_fs_lock_many", _wrap_svn_repos_fs_lock_many, METH_VARARGS, (char *)"\n"
+ "svn_repos_fs_lock_many(svn_repos_t * repos, apr_hash_t lock_targets, char const * comment, svn_boolean_t is_dav_comment, \n"
+ " apr_time_t expiration_date, svn_boolean_t steal_lock, svn_fs_lock_callback_t lock_callback, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_fs_lock", _wrap_svn_repos_fs_lock, METH_VARARGS, (char *)"\n"
"svn_repos_fs_lock(svn_repos_t * repos, char const * path, char const * token, char const * comment, \n"
" svn_boolean_t is_dav_comment, apr_time_t expiration_date, svn_revnum_t current_rev, \n"
" svn_boolean_t steal_lock, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_repos_fs_unlock_many", _wrap_svn_repos_fs_unlock_many, METH_VARARGS, (char *)"\n"
+ "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, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_fs_unlock", _wrap_svn_repos_fs_unlock, METH_VARARGS, (char *)"\n"
"svn_repos_fs_unlock(svn_repos_t * repos, char const * path, char const * token, svn_boolean_t break_lock, \n"
" apr_pool_t pool) -> svn_error_t\n"
@@ -18410,6 +19808,10 @@ static PyMethodDef SwigMethods[] = {
"svn_repos_fs_change_node_prop(svn_fs_root_t * root, char const * path, char const * name, svn_string_t const * value, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props, METH_VARARGS, (char *)"\n"
+ "svn_repos_fs_get_inherited_props(svn_fs_root_t * root, char const * path, char const * propname, svn_repos_authz_func_t authz_read_func, \n"
+ " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_fs_change_txn_prop", _wrap_svn_repos_fs_change_txn_prop, METH_VARARGS, (char *)"svn_repos_fs_change_txn_prop(svn_fs_txn_t * txn, char const * name, svn_string_t const * value, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_fs_change_txn_props", _wrap_svn_repos_fs_change_txn_props, METH_VARARGS, (char *)"svn_repos_fs_change_txn_props(svn_fs_txn_t * txn, apr_array_header_t props, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_node_t_kind_set", _wrap_svn_repos_node_t_kind_set, METH_VARARGS, (char *)"svn_repos_node_t_kind_set(svn_repos_node_t self, svn_node_kind_t kind)"},
@@ -18438,6 +19840,13 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_repos_node_from_baton", _wrap_svn_repos_node_from_baton, METH_VARARGS, (char *)"svn_repos_node_from_baton(void * edit_baton) -> svn_repos_node_t"},
+ { (char *)"svn_repos_info_format", _wrap_svn_repos_info_format, METH_VARARGS, (char *)"svn_repos_info_format(svn_repos_t * repos, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
+ { (char *)"svn_repos_verify_fs3", _wrap_svn_repos_verify_fs3, METH_VARARGS, (char *)"\n"
+ "svn_repos_verify_fs3(svn_repos_t * repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t check_normalization, \n"
+ " svn_boolean_t metadata_only, svn_repos_notify_func_t notify_func, \n"
+ " void * notify_baton, svn_repos_verify_callback_t verify_callback, \n"
+ " void * verify_baton, svn_cancel_func_t cancel, void * cancel_baton, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_verify_fs2", _wrap_svn_repos_verify_fs2, METH_VARARGS, (char *)"\n"
"svn_repos_verify_fs2(svn_repos_t * repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_repos_notify_func_t notify_func, \n"
" void * notify_baton, svn_cancel_func_t cancel, void * cancel_baton, \n"
@@ -18463,6 +19872,13 @@ static PyMethodDef SwigMethods[] = {
" svn_revnum_t end_rev, svn_boolean_t incremental, svn_cancel_func_t cancel_func, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_repos_load_fs5", _wrap_svn_repos_load_fs5, METH_VARARGS, (char *)"\n"
+ "svn_repos_load_fs5(svn_repos_t * repos, svn_stream_t * dumpstream, svn_revnum_t start_rev, svn_revnum_t end_rev, \n"
+ " enum svn_repos_load_uuid uuid_action, char const * parent_dir, \n"
+ " svn_boolean_t use_pre_commit_hook, svn_boolean_t use_post_commit_hook, svn_boolean_t validate_props, \n"
+ " svn_boolean_t ignore_dates, svn_repos_notify_func_t notify_func, \n"
+ " void * notify_baton, svn_cancel_func_t cancel_func, apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_load_fs4", _wrap_svn_repos_load_fs4, METH_VARARGS, (char *)"\n"
"svn_repos_load_fs4(svn_repos_t * repos, svn_stream_t * dumpstream, svn_revnum_t start_rev, svn_revnum_t end_rev, \n"
" enum svn_repos_load_uuid uuid_action, char const * parent_dir, \n"
@@ -18516,6 +19932,13 @@ static PyMethodDef SwigMethods[] = {
"svn_repos_parse_dumpstream3(svn_stream_t * stream, svn_repos_parse_fns3_t parse_fns, void * parse_baton, svn_boolean_t deltas_are_text, \n"
" svn_cancel_func_t cancel_func, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_repos_get_fs_build_parser5", _wrap_svn_repos_get_fs_build_parser5, METH_VARARGS, (char *)"\n"
+ "svn_repos_get_fs_build_parser5(svn_repos_t * repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t use_history, \n"
+ " svn_boolean_t validate_props, enum svn_repos_load_uuid uuid_action, \n"
+ " char const * parent_dir, svn_boolean_t use_pre_commit_hook, svn_boolean_t use_post_commit_hook, \n"
+ " svn_boolean_t ignore_dates, svn_repos_notify_func_t notify_func, \n"
+ " void * notify_baton, apr_pool_t pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_get_fs_build_parser4", _wrap_svn_repos_get_fs_build_parser4, METH_VARARGS, (char *)"\n"
"svn_repos_get_fs_build_parser4(svn_repos_t * repos, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_boolean_t use_history, \n"
" svn_boolean_t validate_props, enum svn_repos_load_uuid uuid_action, \n"
@@ -18596,11 +20019,6 @@ static PyMethodDef SwigMethods[] = {
"svn_repos_check_revision_access(svn_repos_revision_access_level_t * access_level, svn_repos_t * repos, svn_revnum_t revision, \n"
" svn_repos_authz_func_t authz_read_func, apr_pool_t pool) -> svn_error_t\n"
""},
- { (char *)"svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props, METH_VARARGS, (char *)"\n"
- "svn_repos_fs_get_inherited_props(svn_fs_root_t * root, char const * path, char const * propname, svn_repos_authz_func_t authz_read_func, \n"
- " apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
- ""},
- { (char *)"svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities, METH_VARARGS, (char *)"svn_repos_remember_client_capabilities(svn_repos_t * repos, apr_array_header_t capabilities) -> svn_error_t"},
{ (char *)"svn_repos_t_swigregister", svn_repos_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_authz_t_swigregister", svn_authz_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_parse_fns3_invoke_magic_header_record", _wrap_svn_repos_parse_fns3_invoke_magic_header_record, METH_VARARGS, (char *)"svn_repos_parse_fns3_invoke_magic_header_record(svn_repos_parse_fns3_t _obj, int version, void * parse_baton, apr_pool_t pool) -> svn_error_t"},
@@ -18634,22 +20052,27 @@ static PyMethodDef SwigMethods[] = {
"svn_repos_invoke_authz_callback(svn_repos_authz_callback_t _obj, svn_repos_authz_access_t required, svn_fs_root_t * root, \n"
" char const * path, void * baton, apr_pool_t pool) -> svn_error_t\n"
""},
- { (char *)"svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler, METH_VARARGS, (char *)"\n"
- "svn_repos_invoke_file_rev_handler(svn_repos_file_rev_handler_t _obj, void * baton, char const * path, svn_revnum_t rev, \n"
- " apr_hash_t rev_props, apr_array_header_t prop_diffs, apr_pool_t pool) -> svn_error_t\n"
- ""},
{ (char *)"svn_repos_invoke_notify_func", _wrap_svn_repos_invoke_notify_func, METH_VARARGS, (char *)"svn_repos_invoke_notify_func(svn_repos_notify_func_t _obj, void * baton, svn_repos_notify_t notify, apr_pool_t scratch_pool)"},
{ (char *)"svn_repos_invoke_freeze_func", _wrap_svn_repos_invoke_freeze_func, METH_VARARGS, (char *)"svn_repos_invoke_freeze_func(svn_repos_freeze_func_t _obj, void * baton, apr_pool_t pool) -> svn_error_t"},
{ (char *)"svn_repos_invoke_history_func", _wrap_svn_repos_invoke_history_func, METH_VARARGS, (char *)"\n"
"svn_repos_invoke_history_func(svn_repos_history_func_t _obj, void * baton, char const * path, svn_revnum_t revision, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler, METH_VARARGS, (char *)"\n"
+ "svn_repos_invoke_file_rev_handler(svn_repos_file_rev_handler_t _obj, void * baton, char const * path, svn_revnum_t rev, \n"
+ " apr_hash_t rev_props, apr_array_header_t prop_diffs, apr_pool_t pool) -> svn_error_t\n"
+ ""},
+ { (char *)"svn_repos_invoke_verify_callback", _wrap_svn_repos_invoke_verify_callback, METH_VARARGS, (char *)"\n"
+ "svn_repos_invoke_verify_callback(svn_repos_verify_callback_t _obj, void * baton, svn_revnum_t revision, svn_error_t verify_err, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_repos_authz_func_t_swigregister", svn_repos_authz_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_authz_callback_t_swigregister", svn_repos_authz_callback_t_swigregister, METH_VARARGS, NULL},
- { (char *)"svn_repos_file_rev_handler_t_swigregister", svn_repos_file_rev_handler_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_notify_func_t_swigregister", svn_repos_notify_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_freeze_func_t_swigregister", svn_repos_freeze_func_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_repos_history_func_t_swigregister", svn_repos_history_func_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_repos_file_rev_handler_t_swigregister", svn_repos_file_rev_handler_t_swigregister, METH_VARARGS, NULL},
+ { (char *)"svn_repos_verify_callback_t_swigregister", svn_repos_verify_callback_t_swigregister, METH_VARARGS, NULL},
{ NULL, NULL, 0, NULL }
};
@@ -18676,12 +20099,14 @@ static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_repos_freeze_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char__p_svn_error_t = {"_p_f_p_void_p_q_const__char__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *)|svn_error_t *(*)(void *,char const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_string_t const *)|svn_error_t *(*)(void *,char const *,svn_string_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_repos_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_boolean_t,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_pool_t *)|svn_repos_history_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void = {"_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void", "svn_repos_notify_func_t|void (*)(void *,struct svn_repos_notify_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "svn_repos_verify_callback_t|struct svn_error_t *(*)(void *,svn_revnum_t,svn_error_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_repos_authz_access_t,svn_boolean_t *,svn_fs_root_t *,char const *,void *,apr_pool_t *)|svn_repos_authz_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t = {"_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_revnum_t,char const *,char const *,void *)|svn_commit_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -18698,6 +20123,7 @@ static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_ha
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_boolean_t,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_file_rev_handler_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(**)(void *,char const *,svn_revnum_t,apr_pool_t *)|svn_repos_history_func_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void = {"_p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void", "void (**)(void *,struct svn_repos_notify_t const *,apr_pool_t *)|svn_repos_notify_func_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "svn_repos_verify_callback_t *|struct svn_error_t *(**)(void *,svn_revnum_t,svn_error_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "svn_repos_authz_callback_t *|struct svn_error_t *(**)(svn_repos_authz_access_t,svn_boolean_t *,svn_fs_root_t *,char const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_authz_t = {"_p_p_svn_authz_t", "struct svn_authz_t **|svn_authz_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_delta_editor_t = {"_p_p_svn_delta_editor_t", "struct svn_delta_editor_t **|svn_delta_editor_t **", 0, 0, (void*)0, 0};
@@ -18710,6 +20136,7 @@ static swig_type_info _swigt__p_p_svn_repos_parse_fns_t = {"_p_p_svn_repos_parse
static swig_type_info _swigt__p_p_svn_repos_t = {"_p_p_svn_repos_t", "struct svn_repos_t **|svn_repos_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -18729,13 +20156,19 @@ static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "st
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -18743,6 +20176,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -18809,12 +20243,14 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
&_swigt__p_int,
@@ -18831,6 +20267,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
+ &_swigt__p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_p_svn_authz_t,
&_swigt__p_p_svn_delta_editor_t,
@@ -18843,6 +20280,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_repos_t,
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -18862,13 +20300,19 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_config_t,
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -18876,6 +20320,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -18942,12 +20387,14 @@ static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t[] = { {&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -18964,6 +20411,7 @@ static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_ha
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void[] = { {&_swigt__p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_authz_t[] = { {&_swigt__p_p_svn_authz_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_delta_editor_t[] = { {&_swigt__p_p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18976,6 +20424,7 @@ static swig_cast_info _swigc__p_p_svn_repos_parse_fns_t[] = { {&_swigt__p_p_svn
static swig_cast_info _swigc__p_p_svn_repos_t[] = { {&_swigt__p_p_svn_repos_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -18995,13 +20444,19 @@ static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -19009,6 +20464,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -19075,12 +20531,14 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
_swigc__p_int,
@@ -19097,6 +20555,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
+ _swigc__p_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_p_svn_authz_t,
_swigc__p_p_svn_delta_editor_t,
@@ -19109,6 +20568,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_repos_t,
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -19128,13 +20588,19 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_config_t,
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -19142,6 +20608,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -19199,18 +20666,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -19220,17 +20687,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -19293,7 +20760,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -19874,9 +21341,6 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "svn_node_action_add",SWIG_From_long((long)(svn_node_action_add)));
SWIG_Python_SetConstant(d, "svn_node_action_delete",SWIG_From_long((long)(svn_node_action_delete)));
SWIG_Python_SetConstant(d, "svn_node_action_replace",SWIG_From_long((long)(svn_node_action_replace)));
- SWIG_Python_SetConstant(d, "svn_repos_load_uuid_default",SWIG_From_long((long)(svn_repos_load_uuid_default)));
- SWIG_Python_SetConstant(d, "svn_repos_load_uuid_ignore",SWIG_From_long((long)(svn_repos_load_uuid_ignore)));
- SWIG_Python_SetConstant(d, "svn_repos_load_uuid_force",SWIG_From_long((long)(svn_repos_load_uuid_force)));
SWIG_Python_SetConstant(d, "svn_authz_none",SWIG_From_long((long)(svn_authz_none)));
SWIG_Python_SetConstant(d, "svn_authz_read",SWIG_From_long((long)(svn_authz_read)));
SWIG_Python_SetConstant(d, "svn_authz_write",SWIG_From_long((long)(svn_authz_write)));
@@ -19901,9 +21365,16 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "svn_repos_notify_upgrade_start",SWIG_From_long((long)(svn_repos_notify_upgrade_start)));
SWIG_Python_SetConstant(d, "svn_repos_notify_load_skipped_rev",SWIG_From_long((long)(svn_repos_notify_load_skipped_rev)));
SWIG_Python_SetConstant(d, "svn_repos_notify_verify_rev_structure",SWIG_From_long((long)(svn_repos_notify_verify_rev_structure)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_pack_revprops",SWIG_From_long((long)(svn_repos_notify_pack_revprops)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_cleanup_revprops",SWIG_From_long((long)(svn_repos_notify_cleanup_revprops)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_format_bumped",SWIG_From_long((long)(svn_repos_notify_format_bumped)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_hotcopy_rev_range",SWIG_From_long((long)(svn_repos_notify_hotcopy_rev_range)));
SWIG_Python_SetConstant(d, "svn_repos_notify_warning_found_old_reference",SWIG_From_long((long)(svn_repos_notify_warning_found_old_reference)));
SWIG_Python_SetConstant(d, "svn_repos_notify_warning_found_old_mergeinfo",SWIG_From_long((long)(svn_repos_notify_warning_found_old_mergeinfo)));
SWIG_Python_SetConstant(d, "svn_repos_notify_warning_invalid_fspath",SWIG_From_long((long)(svn_repos_notify_warning_invalid_fspath)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_warning_name_collision",SWIG_From_long((long)(svn_repos_notify_warning_name_collision)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_warning_mergeinfo_collision",SWIG_From_long((long)(svn_repos_notify_warning_mergeinfo_collision)));
+ SWIG_Python_SetConstant(d, "svn_repos_notify_warning_invalid_mergeinfo",SWIG_From_long((long)(svn_repos_notify_warning_invalid_mergeinfo)));
SWIG_Python_SetConstant(d, "SVN_REPOS_CAPABILITY_MERGEINFO",SWIG_FromCharPtr("mergeinfo"));
SWIG_Python_SetConstant(d, "SVN_REPOS_DUMPFILE_MAGIC_HEADER",SWIG_FromCharPtr("SVN-fs-dump-format-version"));
SWIG_Python_SetConstant(d, "SVN_REPOS_DUMPFILE_FORMAT_VERSION",SWIG_From_long((long)(3)));
@@ -19929,6 +21400,9 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5",SWIG_FromCharPtr("Text-delta-base-md5"));
SWIG_Python_SetConstant(d, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1",SWIG_FromCharPtr("Text-delta-base-sha1"));
SWIG_Python_SetConstant(d, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM",SWIG_FromCharPtr("Text-delta-base-md5"));
+ SWIG_Python_SetConstant(d, "svn_repos_load_uuid_default",SWIG_From_long((long)(svn_repos_load_uuid_default)));
+ SWIG_Python_SetConstant(d, "svn_repos_load_uuid_ignore",SWIG_From_long((long)(svn_repos_load_uuid_ignore)));
+ SWIG_Python_SetConstant(d, "svn_repos_load_uuid_force",SWIG_From_long((long)(svn_repos_load_uuid_force)));
SWIG_Python_SetConstant(d, "svn_repos_revision_access_none",SWIG_From_long((long)(svn_repos_revision_access_none)));
SWIG_Python_SetConstant(d, "svn_repos_revision_access_partial",SWIG_From_long((long)(svn_repos_revision_access_partial)));
SWIG_Python_SetConstant(d, "svn_repos_revision_access_full",SWIG_From_long((long)(svn_repos_revision_access_full)));
diff --git a/subversion/bindings/swig/python/svn_wc.c b/subversion/bindings/swig/python/svn_wc.c
index 818dcf5..344d681 100644
--- a/subversion/bindings/swig/python/svn_wc.c
+++ b/subversion/bindings/swig/python/svn_wc.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGPYTHON
@@ -43,28 +43,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -107,7 +107,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -122,8 +122,14 @@
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
/* -----------------------------------------------------------------------------
* swigrun.swg
@@ -149,7 +155,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -175,16 +181,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -217,23 +223,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -247,17 +253,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -288,14 +294,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -339,7 +345,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -359,18 +365,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -378,24 +384,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -423,7 +418,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -458,7 +453,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -502,7 +497,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -510,14 +505,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -526,18 +521,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -546,11 +541,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -575,14 +570,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -601,12 +596,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -622,7 +617,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -636,21 +631,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -710,18 +705,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1582,34 +1577,6 @@ SwigPyObject_repr(SwigPyObject *v, PyObject *args)
}
SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
- char *str;
-#ifdef METH_NOARGS
- PyObject *repr = SwigPyObject_repr(v);
-#else
- PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
- if (repr) {
- str = SWIG_Python_str_AsChar(repr);
- fputs(str, fp);
- SWIG_Python_str_DelForPy3(str);
- Py_DECREF(repr);
- return 0;
- } else {
- return 1;
- }
-}
-
-SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
-{
- char result[SWIG_BUFFER_SIZE];
- return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
- SWIG_Python_str_FromChar(result) : 0;
-}
-
-SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
void *i = v->ptr;
@@ -1801,7 +1768,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
static PyMethodDef
swigobject_methods[] = {
{(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
- {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
+ {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"},
{(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
{(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"},
{(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
@@ -1894,7 +1861,7 @@ SwigPyObject_TypeOnce(void) {
sizeof(SwigPyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)SwigPyObject_dealloc, /* tp_dealloc */
- (printfunc)SwigPyObject_print, /* tp_print */
+ 0, /* tp_print */
#if PY_VERSION_HEX < 0x02020000
(getattrfunc)SwigPyObject_getattr, /* tp_getattr */
#else
@@ -1912,7 +1879,7 @@ SwigPyObject_TypeOnce(void) {
0, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
- (reprfunc)SwigPyObject_str, /* tp_str */
+ 0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -2289,10 +2256,11 @@ SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
int res;
SwigPyObject *sobj;
+ int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
if (!obj)
return SWIG_ERROR;
- if (obj == Py_None) {
+ if (obj == Py_None && !implicit_conv) {
if (ptr)
*ptr = 0;
return SWIG_OK;
@@ -2341,7 +2309,7 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
res = SWIG_OK;
} else {
- if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+ if (implicit_conv) {
SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
if (data && !data->implicitconv) {
PyObject *klass = data->klass;
@@ -2376,6 +2344,13 @@ SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int
}
}
}
+ if (!SWIG_IsOK(res) && obj == Py_None) {
+ if (ptr)
+ *ptr = 0;
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ res = SWIG_OK;
+ }
}
return res;
}
@@ -2875,7 +2850,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
PyObject *descr;
PyObject *encoded_name;
descrsetfunc f;
- int res;
+ int res = -1;
# ifdef Py_USING_UNICODE
if (PyString_Check(name)) {
@@ -2898,7 +2873,6 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
goto done;
}
- res = -1;
descr = _PyType_Lookup(tp, name);
f = NULL;
if (descr != NULL)
@@ -3047,85 +3021,87 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
#define SWIGTYPE_p_svn_config_t swig_types[104]
#define SWIGTYPE_p_svn_delta_editor_t swig_types[105]
#define SWIGTYPE_p_svn_depth_t swig_types[106]
-#define SWIGTYPE_p_svn_dirent_t swig_types[107]
-#define SWIGTYPE_p_svn_errno_t swig_types[108]
-#define SWIGTYPE_p_svn_error_t swig_types[109]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[110]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[111]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[112]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[113]
-#define SWIGTYPE_p_svn_lock_t swig_types[114]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[115]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[116]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[117]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[118]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[119]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[120]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[121]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[122]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[123]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[124]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[125]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[126]
-#define SWIGTYPE_p_svn_prop_kind swig_types[127]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[128]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[129]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[130]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[131]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[132]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[133]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[135]
-#define SWIGTYPE_p_svn_stream_t swig_types[136]
-#define SWIGTYPE_p_svn_string_t swig_types[137]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[138]
-#define SWIGTYPE_p_svn_tristate_t swig_types[139]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[140]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[141]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[142]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[143]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[144]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[145]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[146]
-#define SWIGTYPE_p_svn_version_t swig_types[147]
-#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[148]
-#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[149]
-#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[150]
-#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[151]
-#define SWIGTYPE_p_svn_wc_conflict_description2_t swig_types[152]
-#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[153]
-#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[154]
-#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[155]
-#define SWIGTYPE_p_svn_wc_conflict_result_t swig_types[156]
-#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[157]
-#define SWIGTYPE_p_svn_wc_context_t swig_types[158]
-#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[159]
-#define SWIGTYPE_p_svn_wc_diff_callbacks3_t swig_types[160]
-#define SWIGTYPE_p_svn_wc_diff_callbacks4_t swig_types[161]
-#define SWIGTYPE_p_svn_wc_diff_callbacks_t swig_types[162]
-#define SWIGTYPE_p_svn_wc_entry_callbacks2_t swig_types[163]
-#define SWIGTYPE_p_svn_wc_entry_callbacks_t swig_types[164]
-#define SWIGTYPE_p_svn_wc_entry_t swig_types[165]
-#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[166]
-#define SWIGTYPE_p_svn_wc_external_item_t swig_types[167]
-#define SWIGTYPE_p_svn_wc_info_t swig_types[168]
-#define SWIGTYPE_p_svn_wc_merge_outcome_t swig_types[169]
-#define SWIGTYPE_p_svn_wc_notify_action_t swig_types[170]
-#define SWIGTYPE_p_svn_wc_notify_lock_state_t swig_types[171]
-#define SWIGTYPE_p_svn_wc_notify_state_t swig_types[172]
-#define SWIGTYPE_p_svn_wc_notify_t swig_types[173]
-#define SWIGTYPE_p_svn_wc_operation_t swig_types[174]
-#define SWIGTYPE_p_svn_wc_revision_status_t swig_types[175]
-#define SWIGTYPE_p_svn_wc_schedule_t swig_types[176]
-#define SWIGTYPE_p_svn_wc_status2_t swig_types[177]
-#define SWIGTYPE_p_svn_wc_status3_t swig_types[178]
-#define SWIGTYPE_p_svn_wc_status_t swig_types[179]
-#define SWIGTYPE_p_svn_wc_traversal_info_t swig_types[180]
-#define SWIGTYPE_p_unsigned_char swig_types[181]
-#define SWIGTYPE_p_unsigned_long swig_types[182]
-#define SWIGTYPE_p_void swig_types[183]
-static swig_type_info *swig_types[185];
-static swig_module_info swig_module = {swig_types, 184, 0, 0, 0, 0};
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[107]
+#define SWIGTYPE_p_svn_dirent_t swig_types[108]
+#define SWIGTYPE_p_svn_errno_t swig_types[109]
+#define SWIGTYPE_p_svn_error_t swig_types[110]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[111]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[112]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[113]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[114]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[115]
+#define SWIGTYPE_p_svn_lock_t swig_types[116]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[117]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[118]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[119]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[120]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[121]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[122]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[123]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[124]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[125]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[126]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[127]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[128]
+#define SWIGTYPE_p_svn_prop_kind swig_types[129]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[130]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[131]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[132]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[133]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[134]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[135]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[136]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[137]
+#define SWIGTYPE_p_svn_stream_t swig_types[138]
+#define SWIGTYPE_p_svn_string_t swig_types[139]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[140]
+#define SWIGTYPE_p_svn_tristate_t swig_types[141]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[142]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[143]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[144]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[145]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[146]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[147]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[148]
+#define SWIGTYPE_p_svn_version_t swig_types[149]
+#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[150]
+#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[151]
+#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[152]
+#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[153]
+#define SWIGTYPE_p_svn_wc_conflict_description2_t swig_types[154]
+#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[155]
+#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[156]
+#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[157]
+#define SWIGTYPE_p_svn_wc_conflict_result_t swig_types[158]
+#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[159]
+#define SWIGTYPE_p_svn_wc_context_t swig_types[160]
+#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[161]
+#define SWIGTYPE_p_svn_wc_diff_callbacks3_t swig_types[162]
+#define SWIGTYPE_p_svn_wc_diff_callbacks4_t swig_types[163]
+#define SWIGTYPE_p_svn_wc_diff_callbacks_t swig_types[164]
+#define SWIGTYPE_p_svn_wc_entry_callbacks2_t swig_types[165]
+#define SWIGTYPE_p_svn_wc_entry_callbacks_t swig_types[166]
+#define SWIGTYPE_p_svn_wc_entry_t swig_types[167]
+#define SWIGTYPE_p_svn_wc_external_item2_t swig_types[168]
+#define SWIGTYPE_p_svn_wc_external_item_t swig_types[169]
+#define SWIGTYPE_p_svn_wc_info_t swig_types[170]
+#define SWIGTYPE_p_svn_wc_merge_outcome_t swig_types[171]
+#define SWIGTYPE_p_svn_wc_notify_action_t swig_types[172]
+#define SWIGTYPE_p_svn_wc_notify_lock_state_t swig_types[173]
+#define SWIGTYPE_p_svn_wc_notify_state_t swig_types[174]
+#define SWIGTYPE_p_svn_wc_notify_t swig_types[175]
+#define SWIGTYPE_p_svn_wc_operation_t swig_types[176]
+#define SWIGTYPE_p_svn_wc_revision_status_t swig_types[177]
+#define SWIGTYPE_p_svn_wc_schedule_t swig_types[178]
+#define SWIGTYPE_p_svn_wc_status2_t swig_types[179]
+#define SWIGTYPE_p_svn_wc_status3_t swig_types[180]
+#define SWIGTYPE_p_svn_wc_status_t swig_types[181]
+#define SWIGTYPE_p_svn_wc_traversal_info_t swig_types[182]
+#define SWIGTYPE_p_unsigned_char swig_types[183]
+#define SWIGTYPE_p_unsigned_long swig_types[184]
+#define SWIGTYPE_p_void swig_types[185]
+static swig_type_info *swig_types[187];
+static swig_module_info swig_module = {swig_types, 186, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -3149,7 +3125,7 @@ static swig_module_info swig_module = {swig_types, 184, 0, 0, 0, 0};
#endif
#define SWIG_name "_wc"
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -3502,6 +3478,18 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
return SWIG_OK;
} else {
PyErr_Clear();
+#if PY_VERSION_HEX >= 0x03000000
+ {
+ long v = PyLong_AsLong(obj);
+ if (!PyErr_Occurred()) {
+ if (v < 0) {
+ return SWIG_OverflowError;
+ }
+ } else {
+ PyErr_Clear();
+ }
+ }
+#endif
}
}
#ifdef SWIG_PYTHON_CAST_MODE
@@ -3825,7 +3813,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_version(PyObject *SWIGUNUSEDPARM(self), PyObje
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -3858,7 +3846,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_context_create(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O|OO:svn_wc_context_create",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_config_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
+ arg2 = (svn_config_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_config_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3933,7 +3921,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_context_destroy(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_context_destroy",&obj0)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -3990,7 +3978,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_adm_open3",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4008,8 +3996,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj4; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -4039,7 +4027,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open3(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4080,7 +4068,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_open2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4125,7 +4113,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open2(PyObject *SWIGUNUSEDPARM(self), PyOb
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4166,7 +4154,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_open",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4211,7 +4199,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open(PyObject *SWIGUNUSEDPARM(self), PyObj
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4255,7 +4243,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open3(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_adm_probe_open3",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4273,8 +4261,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open3(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj4; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -4304,7 +4292,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open3(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4345,7 +4333,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open2(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_probe_open2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4390,7 +4378,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open2(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4431,7 +4419,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_probe_open",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4476,7 +4464,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_open(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4536,8 +4524,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open_anchor(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj3; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -4567,13 +4555,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_open_anchor(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4623,7 +4611,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_retrieve(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_adm_retrieve",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4656,7 +4644,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_retrieve(PyObject *SWIGUNUSEDPARM(self), P
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4693,7 +4681,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_retrieve(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_adm_probe_retrieve",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4726,7 +4714,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_retrieve(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4770,7 +4758,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try3(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_adm_probe_try3",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4788,8 +4776,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj4; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -4819,7 +4807,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try3(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4860,7 +4848,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try2(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_probe_try2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4905,7 +4893,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try2(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -4946,7 +4934,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try(PyObject *SWIGUNUSEDPARM(self),
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_adm_probe_try",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -4991,7 +4979,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_probe_try(PyObject *SWIGUNUSEDPARM(self),
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args))
;
@@ -5024,7 +5012,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_close2(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_adm_close2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5076,7 +5064,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_close(PyObject *SWIGUNUSEDPARM(self), PyOb
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_adm_close",&obj0)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5114,7 +5102,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_access_path(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_adm_access_path",&obj0)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5142,7 +5130,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_access_pool(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_adm_access_pool",&obj0)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5155,7 +5143,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_access_pool(PyObject *SWIGUNUSEDPARM(self)
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_pool_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_pool_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5171,7 +5159,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_adm_locked(PyObject *SWIGUNUSEDPARM(self), PyO
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_adm_locked",&obj0)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5216,7 +5204,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_locked2(PyObject *SWIGUNUSEDPARM(self), PyObje
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_locked2",&obj0,&arg4,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5502,7 +5490,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_init_traversal_info(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_traversal_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_traversal_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -5529,7 +5517,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_edited_externals(PyObject *SWIGUNUSEDPARM(self
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_edited_externals",&obj0)) SWIG_fail;
{
- arg3 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj0);
+ arg3 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5565,7 +5553,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_traversed_depths(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_traversed_depths",&obj0)) SWIG_fail;
{
- arg2 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj0);
+ arg2 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5596,7 +5584,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_target_dir_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_external_item2_t_target_dir_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5624,7 +5612,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_target_dir_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item2_t_target_dir_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5645,7 +5633,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_url_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_external_item2_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5673,7 +5661,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_url_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item2_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5695,13 +5683,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_revision_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_external_item2_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5722,13 +5710,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_revision_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item2_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->revision);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5745,13 +5733,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_peg_revision_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_external_item2_t_peg_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5772,13 +5760,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_t_peg_revision_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item2_t_peg_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->peg_revision);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5799,7 +5787,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_external_item2_t(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_external_item2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_external_item2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -5814,7 +5802,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_external_item2_t(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_external_item2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -5885,7 +5873,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_create(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_external_item2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_external_item2_t,
_global_py_pool, args))
;
@@ -5946,7 +5934,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_create(PyObject *SWIGUNUSEDPARM(
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_external_item2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_external_item2_t,
_global_py_pool, args))
;
@@ -5979,7 +5967,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_dup(PyObject *SWIGUNUSEDPARM(se
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_external_item2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_external_item2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_external_item2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6000,7 +5988,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item2_dup(PyObject *SWIGUNUSEDPARM(se
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_external_item2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_external_item2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6022,7 +6010,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_target_dir_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_external_item_t_target_dir_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6050,7 +6038,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_target_dir_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item_t_target_dir_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6071,7 +6059,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_url_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_external_item_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6099,7 +6087,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_url_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6121,13 +6109,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_revision_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_external_item_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6148,13 +6136,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_t_revision_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_external_item_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->revision);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6175,7 +6163,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_external_item_t(PyObject *SWIGUNUSEDPARM(s
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_external_item_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_external_item_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6190,7 +6178,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_external_item_t(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_external_item_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6233,7 +6221,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_dup(PyObject *SWIGUNUSEDPARM(sel
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_external_item_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_external_item_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
+ arg1 = (svn_wc_external_item_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_external_item_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6254,7 +6242,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_external_item_dup(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_external_item_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_external_item_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -6484,7 +6472,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_path_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6512,7 +6500,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_path_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6534,7 +6522,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_action_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_action_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6561,7 +6549,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_action_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6583,7 +6571,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_kind_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6610,7 +6598,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_kind_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6631,7 +6619,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_mime_type_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_mime_type_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6659,7 +6647,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_mime_type_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_mime_type_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6681,13 +6669,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_lock_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6708,13 +6696,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_lock_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -6731,13 +6719,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_err_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_err_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_error_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_error_t, svn_argnum_obj1);
+ arg2 = (svn_error_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_error_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6758,7 +6746,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_err_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_err_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6790,7 +6778,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_content_state_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_content_state_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6817,7 +6805,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_content_state_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_content_state_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6839,7 +6827,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_prop_state_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_prop_state_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6866,7 +6854,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_prop_state_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_prop_state_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6888,7 +6876,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_lock_state_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_lock_state_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6915,7 +6903,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_lock_state_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_lock_state_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6937,7 +6925,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_revision_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6964,7 +6952,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_revision_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -6985,7 +6973,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_changelist_name_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_changelist_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7013,7 +7001,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_changelist_name_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_changelist_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7035,13 +7023,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_merge_range_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_merge_range_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_merge_range_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj1);
+ arg2 = (svn_merge_range_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_merge_range_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7062,13 +7050,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_merge_range_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_merge_range_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_merge_range_t *) ((arg1)->merge_range);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_merge_range_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7084,7 +7072,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_url_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7112,7 +7100,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_url_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7133,7 +7121,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_path_prefix_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_path_prefix_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7161,7 +7149,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_path_prefix_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_path_prefix_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7182,7 +7170,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_prop_name_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_notify_t_prop_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7210,7 +7198,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_prop_name_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_prop_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7232,13 +7220,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_rev_props_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_rev_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7259,13 +7247,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_rev_props_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_rev_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_hash_t *) ((arg1)->rev_props);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_hash_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_hash_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7282,7 +7270,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_old_revision_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_old_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7309,7 +7297,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_old_revision_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_old_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7331,7 +7319,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_original_start_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_original_start_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7358,7 +7346,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_original_start_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_original_start_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7380,7 +7368,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_original_length_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_original_length_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7407,7 +7395,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_original_length_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_original_length_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7429,7 +7417,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_modified_start_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_modified_start_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7456,7 +7444,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_modified_start_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_modified_start_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7478,7 +7466,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_modified_length_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_modified_length_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7505,7 +7493,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_modified_length_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_modified_length_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7527,7 +7515,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_matched_line_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_matched_line_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7554,7 +7542,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_matched_line_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_matched_line_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7576,7 +7564,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_fuzz_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_notify_t_hunk_fuzz_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7603,7 +7591,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_notify_t_hunk_fuzz_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_notify_t_hunk_fuzz_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7629,7 +7617,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_notify_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -7644,7 +7632,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_notify_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_notify_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7709,7 +7697,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_create_notify(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7761,7 +7749,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_create_notify_url(PyObject *SWIGUNUSEDPARM(sel
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7791,7 +7779,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_notify(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_dup_notify",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_notify_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
+ arg1 = (svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7812,7 +7800,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_notify(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_notify_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -7834,7 +7822,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_repos_url_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_version_t_repos_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7862,7 +7850,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_repos_url_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_version_t_repos_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7884,7 +7872,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_peg_rev_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_version_t_peg_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7911,7 +7899,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_peg_rev_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_version_t_peg_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7932,7 +7920,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_path_in_repos_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_version_t_path_in_repos_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7960,7 +7948,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_path_in_repos_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_version_t_path_in_repos_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -7982,7 +7970,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_node_kind_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_version_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8009,7 +7997,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_node_kind_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_version_t_node_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8030,7 +8018,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_repos_uuid_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_version_t_repos_uuid_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8058,7 +8046,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_t_repos_uuid_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_version_t_repos_uuid_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8084,7 +8072,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_conflict_version_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -8099,7 +8087,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_conflict_version_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_conflict_version_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8174,7 +8162,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_create2(PyObject *SWIGUNUSEDP
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -8235,7 +8223,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_create(PyObject *SWIGUNUSEDPA
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -8265,7 +8253,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_dup(PyObject *SWIGUNUSEDPARM(
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_conflict_version_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
+ arg1 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -8286,7 +8274,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_version_dup(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -8300,798 +8288,6 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_local_abspath_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_local_abspath_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->local_abspath) free((char *)arg1->local_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->local_abspath = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_local_abspath_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_local_abspath_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->local_abspath);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_node_kind_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_node_kind_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_node_kind_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->node_kind = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_node_kind_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_node_kind_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_node_kind_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_node_kind_t) ((arg1)->node_kind);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_kind_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_kind_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_kind_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_kind_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->kind = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_kind_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_kind_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_kind_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_kind_t) ((arg1)->kind);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_property_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_property_name_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->property_name) free((char *)arg1->property_name);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->property_name = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_property_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_property_name_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->property_name);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_is_binary_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_boolean_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_is_binary_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_boolean_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->is_binary = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_is_binary_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_boolean_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_is_binary_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_boolean_t) ((arg1)->is_binary);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_mime_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_mime_type_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->mime_type) free((char *)arg1->mime_type);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->mime_type = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_mime_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_mime_type_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->mime_type);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_action_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_action_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_action_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_action_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->action = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_action_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_action_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_action_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_action_t) ((arg1)->action);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_reason_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_reason_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_reason_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_reason_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->reason = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_reason_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_reason_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_reason_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_reason_t) ((arg1)->reason);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_base_abspath_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_base_abspath_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->base_abspath) free((char *)arg1->base_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->base_abspath = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_base_abspath_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_base_abspath_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->base_abspath);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_their_abspath_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_their_abspath_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->their_abspath) free((char *)arg1->their_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->their_abspath = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_their_abspath_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_their_abspath_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->their_abspath);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_my_abspath_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_my_abspath_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->my_abspath) free((char *)arg1->my_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->my_abspath = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_my_abspath_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_my_abspath_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->my_abspath);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_merged_file_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description2_t_merged_file_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_merged_file_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_merged_file_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->merged_file);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_operation_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_operation_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_operation_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_operation_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->operation = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_operation_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_operation_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_operation_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_operation_t) ((arg1)->operation);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_src_left_version_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_src_left_version_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->src_left_version = (svn_wc_conflict_version_t const *)arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_src_left_version_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_version_t *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_src_left_version_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_version_t *) ((arg1)->src_left_version);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
- _global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_src_right_version_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description2_t_src_right_version_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->src_right_version = (svn_wc_conflict_version_t const *)arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_t_src_right_version_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_version_t *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description2_t_src_right_version_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_version_t *) ((arg1)->src_right_version);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
- _global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_svn_wc_conflict_description2_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)":new_svn_wc_conflict_description2_t")) SWIG_fail;
- {
- svn_swig_py_release_py_lock();
-
- result = (struct svn_wc_conflict_description2_t *)calloc(1, sizeof(struct svn_wc_conflict_description2_t));
-
- svn_swig_py_acquire_py_lock();
-
- }
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
- _global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_svn_wc_conflict_description2_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_conflict_description2_t",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- free((char *) arg1);
-
- svn_swig_py_acquire_py_lock();
-
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *svn_wc_conflict_description2_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *obj;
- if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
- SWIG_TypeNewClientData(SWIGTYPE_p_svn_wc_conflict_description2_t, SWIG_NewClientData(obj));
- return SWIG_Py_Void();
-}
-
SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_path_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_wc_conflict_description_t *arg1 = (struct svn_wc_conflict_description_t *) 0 ;
@@ -9100,7 +8296,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_path_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9128,7 +8324,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_path_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9150,7 +8346,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_node_kind_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_node_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9177,7 +8373,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_node_kind_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_node_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9199,7 +8395,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_kind_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9226,7 +8422,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_kind_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9247,7 +8443,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_property_name_set(PyObj
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_property_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9275,7 +8471,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_property_name_get(PyObj
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_property_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9297,7 +8493,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_is_binary_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_is_binary_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9324,7 +8520,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_is_binary_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_is_binary_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9345,7 +8541,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_mime_type_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_mime_type_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9373,7 +8569,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_mime_type_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_mime_type_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9395,13 +8591,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_access_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_access_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9422,13 +8618,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_access_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_access_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_adm_access_t *) ((arg1)->access);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_adm_access_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_adm_access_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9445,7 +8641,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_action_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_action_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9472,7 +8668,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_action_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_action_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9494,7 +8690,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_reason_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_reason_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9521,7 +8717,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_reason_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_reason_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9542,7 +8738,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_base_file_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_base_file_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9570,7 +8766,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_base_file_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_base_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9591,7 +8787,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_their_file_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_their_file_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9619,7 +8815,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_their_file_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_their_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9640,7 +8836,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_my_file_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_my_file_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9668,7 +8864,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_my_file_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_my_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9689,7 +8885,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_merged_file_set(PyObjec
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_description_t_merged_file_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9717,7 +8913,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_merged_file_get(PyObjec
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_merged_file_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9739,7 +8935,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_operation_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_operation_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9766,7 +8962,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_operation_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_operation_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9788,13 +8984,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_src_left_version_set(Py
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_src_left_version_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
+ arg2 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9815,13 +9011,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_src_left_version_get(Py
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_src_left_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_conflict_version_t *) ((arg1)->src_left_version);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9838,13 +9034,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_src_right_version_set(P
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_description_t_src_right_version_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
+ arg2 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9865,13 +9061,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_t_src_right_version_get(P
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_description_t_src_right_version_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_conflict_version_t *) ((arg1)->src_right_version);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_version_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9892,7 +9088,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_conflict_description_t(PyObject *SWIGUNUSE
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -9907,7 +9103,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_conflict_description_t(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_conflict_description_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -9964,7 +9160,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_text2(PyObject *SW
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -9995,7 +9191,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_text(PyObject *SWI
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_conflict_description_create_text",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10016,7 +9212,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_text(PyObject *SWI
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10069,7 +9265,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_prop2(PyObject *SW
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10103,7 +9299,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_prop(PyObject *SWI
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOs|O:svn_wc_conflict_description_create_prop",&arg1,&obj1,&obj2,&arg4,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10130,7 +9326,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_prop(PyObject *SWI
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10179,13 +9375,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_tree2(PyObject *SW
}
}
{
- arg4 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj3);
+ arg4 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
+ arg5 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10206,7 +9402,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_tree2(PyObject *SW
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10245,7 +9441,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_tree(PyObject *SWI
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_wc_conflict_description_create_tree",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10263,13 +9459,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_tree(PyObject *SWI
}
}
{
- arg5 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
+ arg5 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj5);
+ arg6 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10290,7 +9486,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflict_description_create_tree(PyObject *SWI
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10304,7 +9500,7 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_wc__conflict_description2_dup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_wc_conflict_description2_dup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
@@ -10318,9 +9514,9 @@ SWIGINTERN PyObject *_wrap_svn_wc__conflict_description2_dup(PyObject *SWIGUNUSE
&_global_py_pool, &_global_pool))
SWIG_fail;
arg2 = _global_pool;
- if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc__conflict_description2_dup",&obj0,&obj1)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_conflict_description2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_conflict_description2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10336,12 +9532,12 @@ SWIGINTERN PyObject *_wrap_svn_wc__conflict_description2_dup(PyObject *SWIGUNUSE
{
svn_swig_py_release_py_lock();
- result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
+ result = (svn_wc_conflict_description2_t *)svn_wc_conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10355,208 +9551,57 @@ fail:
}
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_choice_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_wc_conflict_choice_t arg2 ;
- PyObject * obj0 = 0 ;
- PyObject * obj1 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_result_t_choice_set",&obj0,&obj1)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- arg2 = (svn_wc_conflict_choice_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->choice = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_choice_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_wc_conflict_choice_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_result_t_choice_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (svn_wc_conflict_choice_t) ((arg1)->choice);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_merged_file_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- char *arg2 = (char *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_conflict_result_t_merged_file_set",&obj0,&arg2)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_merged_file_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- PyObject * obj0 = 0 ;
- char *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_result_t_merged_file_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- result = (char *) ((arg1)->merged_file);
- resultobj = SWIG_FromCharPtr((const char *)result);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_save_merged_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_svn_wc__conflict_description2_dup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_boolean_t arg2 ;
+ svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
+ svn_wc_conflict_description2_t *result = 0 ;
- if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_conflict_result_t_save_merged_set",&obj0,&obj1)) SWIG_fail;
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg2 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc__conflict_description2_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
+ arg1 = (svn_wc_conflict_description2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
- {
- arg2 = (svn_boolean_t)SWIG_As_long (obj1);
- if (SWIG_arg_fail(svn_argnum_obj1)) {
- SWIG_fail;
- }
- }
- if (arg1) (arg1)->save_merged = arg2;
- resultobj = SWIG_Py_Void();
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_svn_wc_conflict_result_t_save_merged_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- PyObject * obj0 = 0 ;
- svn_boolean_t result;
-
- if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_conflict_result_t_save_merged_get",&obj0)) SWIG_fail;
- {
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
+ if (obj1) {
+ /* Verify that the user supplied a valid pool */
+ if (obj1 != Py_None && obj1 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj1);
+ SWIG_arg_fail(svn_argnum_obj1);
SWIG_fail;
}
}
- result = (svn_boolean_t) ((arg1)->save_merged);
- resultobj = SWIG_From_long((long)(result));
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_svn_wc_conflict_result_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *result = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)":new_svn_wc_conflict_result_t")) SWIG_fail;
{
svn_swig_py_release_py_lock();
- result = (struct svn_wc_conflict_result_t *)calloc(1, sizeof(struct svn_wc_conflict_result_t));
+ result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_result_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description2_t,
_global_py_pool, args);
- return resultobj;
-fail:
- return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_svn_wc_conflict_result_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *resultobj = 0;
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- PyObject * obj0 = 0 ;
-
- if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_conflict_result_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_conflict_result_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_conflict_result_t, svn_argnum_obj0);
- if (PyErr_Occurred()) {
- SWIG_fail;
- }
- }
- {
- svn_swig_py_release_py_lock();
-
- free((char *) arg1);
-
- svn_swig_py_acquire_py_lock();
-
+ Py_XDECREF(_global_py_pool);
}
- resultobj = SWIG_Py_Void();
return resultobj;
fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
return NULL;
}
-SWIGINTERN PyObject *svn_wc_conflict_result_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
- PyObject *obj;
- if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
- SWIG_TypeNewClientData(SWIGTYPE_p_svn_wc_conflict_result_t, SWIG_NewClientData(obj));
- return SWIG_Py_Void();
-}
-
SWIGINTERN PyObject *_wrap_svn_wc_create_conflict_result(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_conflict_choice_t arg1 ;
@@ -10595,7 +9640,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_create_conflict_result(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_result_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_result_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -10618,7 +9663,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_opened_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_file_opened_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10645,7 +9690,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_opened_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_file_opened_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10667,7 +9712,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_changed_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_file_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10694,7 +9739,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_changed_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_file_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10716,7 +9761,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_added_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_file_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10743,7 +9788,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_added_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_file_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10765,7 +9810,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_deleted_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_file_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10792,7 +9837,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_file_deleted_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_file_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10814,7 +9859,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_deleted_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_dir_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10841,7 +9886,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_deleted_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_dir_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10863,7 +9908,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_opened_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_dir_opened_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10890,7 +9935,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_opened_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_dir_opened_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10912,7 +9957,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_added_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_dir_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10939,7 +9984,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_added_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_dir_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10961,7 +10006,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_props_changed_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_dir_props_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -10988,7 +10033,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_props_changed_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_dir_props_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11010,7 +10055,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_closed_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks4_t_dir_closed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11037,7 +10082,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_t_dir_closed_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks4_t_dir_closed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11063,7 +10108,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_diff_callbacks4_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks4_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks4_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11078,7 +10123,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_diff_callbacks4_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_diff_callbacks4_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11114,7 +10159,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_changed_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_file_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11141,7 +10186,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_changed_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_file_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11163,7 +10208,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_added_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_file_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11190,7 +10235,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_added_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_file_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11212,7 +10257,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_deleted_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_file_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11239,7 +10284,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_file_deleted_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_file_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11261,7 +10306,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_added_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_dir_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11288,7 +10333,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_added_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_dir_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11310,7 +10355,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_deleted_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_dir_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11337,7 +10382,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_deleted_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_dir_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11359,7 +10404,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_props_changed_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_dir_props_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11386,7 +10431,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_props_changed_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_dir_props_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11408,7 +10453,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_opened_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_dir_opened_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11435,7 +10480,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_opened_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_dir_opened_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11457,7 +10502,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_closed_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks3_t_dir_closed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11484,7 +10529,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_t_dir_closed_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks3_t_dir_closed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11510,7 +10555,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_diff_callbacks3_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks3_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11525,7 +10570,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_diff_callbacks3_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_diff_callbacks3_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11561,7 +10606,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_changed_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_file_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11588,7 +10633,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_changed_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_file_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11610,7 +10655,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_added_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_file_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11637,7 +10682,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_added_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_file_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11659,7 +10704,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_deleted_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_file_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11686,7 +10731,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_file_deleted_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_file_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11708,7 +10753,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_added_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_dir_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11735,7 +10780,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_added_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_dir_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11757,7 +10802,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_deleted_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_dir_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11784,7 +10829,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_deleted_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_dir_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11806,7 +10851,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_props_changed_set(PyObje
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks2_t_dir_props_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11833,7 +10878,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_t_dir_props_changed_get(PyObje
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks2_t_dir_props_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11859,7 +10904,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_diff_callbacks2_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -11874,7 +10919,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_diff_callbacks2_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_diff_callbacks2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11910,7 +10955,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_changed_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_file_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11937,7 +10982,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_changed_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_file_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11959,7 +11004,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_added_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_file_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -11986,7 +11031,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_added_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_file_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12008,7 +11053,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_deleted_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_file_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12035,7 +11080,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_file_deleted_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_file_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12057,7 +11102,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_dir_added_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_dir_added_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12084,7 +11129,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_dir_added_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_dir_added_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12106,7 +11151,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_dir_deleted_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_dir_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12133,7 +11178,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_dir_deleted_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_dir_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12155,7 +11200,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_props_changed_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_diff_callbacks_t_props_changed_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12182,7 +11227,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_t_props_changed_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_diff_callbacks_t_props_changed_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12208,7 +11253,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_diff_callbacks_t(PyObject *SWIGUNUSEDPARM(
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_diff_callbacks_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -12223,7 +11268,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_diff_callbacks_t(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_diff_callbacks_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12271,7 +11316,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_check_wc2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_check_wc2",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12405,7 +11450,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_has_binary_prop(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_has_binary_prop",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12478,7 +11523,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_text_modified_p2(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_text_modified_p2",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12563,7 +11608,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_text_modified_p(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12634,7 +11679,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_props_modified_p2(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_props_modified_p2",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12705,7 +11750,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_props_modified_p(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_props_modified_p",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12763,7 +11808,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_name_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_name_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12791,7 +11836,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_name_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_name_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12813,7 +11858,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_revision_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12840,7 +11885,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_revision_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12861,7 +11906,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_url_set(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12889,7 +11934,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_url_get(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12910,7 +11955,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_repos_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_wc_entry_t_repos_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12938,7 +11983,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_repos_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_repos_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12959,7 +12004,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_uuid_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_wc_entry_t_uuid_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -12987,7 +12032,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_uuid_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_uuid_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13009,7 +12054,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_kind_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13036,7 +12081,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_kind_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13058,7 +12103,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_schedule_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_schedule_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13085,7 +12130,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_schedule_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_schedule_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13107,7 +12152,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copied_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_copied_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13134,7 +12179,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copied_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_copied_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13156,7 +12201,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_deleted_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_deleted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13183,7 +12228,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_deleted_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_deleted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13205,7 +12250,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_absent_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_absent_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13232,7 +12277,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_absent_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_absent_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13254,7 +12299,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_incomplete_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_incomplete_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13281,7 +12326,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_incomplete_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_incomplete_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13302,7 +12347,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copyfrom_url_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_wc_entry_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13330,7 +12375,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copyfrom_url_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13352,7 +12397,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copyfrom_rev_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13379,7 +12424,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_copyfrom_rev_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13400,7 +12445,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_old_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_conflict_old_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13428,7 +12473,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_old_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_conflict_old_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13449,7 +12494,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_new_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_conflict_new_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13477,7 +12522,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_new_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_conflict_new_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13498,7 +12543,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_wrk_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_conflict_wrk_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13526,7 +12571,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_conflict_wrk_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_conflict_wrk_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13547,7 +12592,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_prejfile_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_prejfile_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13575,7 +12620,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_prejfile_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_prejfile_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13597,7 +12642,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_text_time_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_text_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13619,7 +12664,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_text_time_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_text_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13641,7 +12686,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_prop_time_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_prop_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13663,7 +12708,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_prop_time_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_prop_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13684,7 +12729,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_checksum_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_checksum_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13712,7 +12757,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_checksum_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_checksum_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13734,7 +12779,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_rev_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_cmt_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13761,7 +12806,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_rev_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_cmt_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13783,7 +12828,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_date_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_cmt_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13805,7 +12850,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_date_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_cmt_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13826,7 +12871,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_author_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_cmt_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13854,7 +12899,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cmt_author_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_cmt_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13875,7 +12920,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_token_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_wc_entry_t_lock_token_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13903,7 +12948,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_token_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_lock_token_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13924,7 +12969,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_owner_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_lock_owner_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13952,7 +12997,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_owner_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_lock_owner_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -13973,7 +13018,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_comment_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_lock_comment_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14001,7 +13046,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_comment_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_lock_comment_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14023,7 +13068,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_creation_date_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_lock_creation_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14045,7 +13090,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_lock_creation_date_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_lock_creation_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14067,7 +13112,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_has_props_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_has_props_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14094,7 +13139,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_has_props_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_has_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14116,7 +13161,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_has_prop_mods_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_has_prop_mods_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14143,7 +13188,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_has_prop_mods_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_has_prop_mods_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14164,7 +13209,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cachable_props_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_cachable_props_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14192,7 +13237,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_cachable_props_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_cachable_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14213,7 +13258,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_present_props_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_present_props_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14241,7 +13286,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_present_props_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_present_props_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14262,7 +13307,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_changelist_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_changelist_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14290,7 +13335,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_changelist_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_changelist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14312,7 +13357,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_working_size_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_working_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14334,7 +13379,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_working_size_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_working_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14356,7 +13401,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_keep_local_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_keep_local_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14383,7 +13428,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_keep_local_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_keep_local_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14405,7 +13450,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_depth_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_depth_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14432,7 +13477,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_depth_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_depth_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14453,7 +13498,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_tree_conflict_data_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_tree_conflict_data_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14481,7 +13526,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_tree_conflict_data_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_tree_conflict_data_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14502,7 +13547,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_path_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_entry_t_file_external_path_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14530,7 +13575,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_path_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_file_external_path_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14552,13 +13597,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_peg_rev_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_file_external_peg_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14579,13 +13624,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_peg_rev_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_file_external_peg_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->file_external_peg_rev);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14602,13 +13647,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_rev_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_t_file_external_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_opt_revision_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
+ arg2 = (svn_opt_revision_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_opt_revision_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14629,13 +13674,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_t_file_external_rev_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_t_file_external_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_opt_revision_t *)& ((arg1)->file_external_rev);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_opt_revision_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14656,7 +13701,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_entry_t(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -14671,7 +13716,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_entry_t(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_entry_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14720,7 +13765,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry(PyObject *SWIGUNUSEDPARM(self), PyObject
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_wc_entry",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14759,7 +13804,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry(PyObject *SWIGUNUSEDPARM(self), PyObject
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_entry_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_entry_t,
_global_py_pool, args))
;
@@ -14797,7 +13842,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entries_read(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OO|O:svn_wc_entries_read",&obj0,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14872,7 +13917,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_dup(PyObject *SWIGUNUSEDPARM(self), PyOb
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_entry_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
+ arg1 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14893,7 +13938,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_dup(PyObject *SWIGUNUSEDPARM(self), PyOb
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -14916,7 +13961,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_schedule_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_schedule_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14943,7 +13988,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_schedule_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_schedule_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14964,7 +14009,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_copyfrom_url_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"Oz:svn_wc_info_t_copyfrom_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -14992,7 +14037,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_copyfrom_url_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_copyfrom_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15014,7 +14059,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_copyfrom_rev_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_copyfrom_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15041,7 +14086,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_copyfrom_rev_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_copyfrom_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15063,13 +14108,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_checksum_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_checksum_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_checksum_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
+ arg2 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15090,13 +14135,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_checksum_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_checksum_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_checksum_t *) ((arg1)->checksum);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_checksum_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_checksum_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15112,7 +14157,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_changelist_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_info_t_changelist_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15140,7 +14185,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_changelist_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_changelist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15162,7 +14207,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_depth_set(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_depth_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15189,7 +14234,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_depth_get(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_depth_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15211,7 +14256,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_recorded_size_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_recorded_size_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15233,7 +14278,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_recorded_size_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_recorded_size_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15255,7 +14300,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_recorded_time_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_recorded_time_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15277,7 +14322,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_recorded_time_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_recorded_time_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15299,13 +14344,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_conflicts_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_info_t_conflicts_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (apr_array_header_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
+ arg2 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15326,13 +14371,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_conflicts_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_conflicts_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (apr_array_header_t *) ((arg1)->conflicts);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_apr_array_header_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_apr_array_header_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15348,7 +14393,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_wcroot_abspath_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_info_t_wcroot_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15376,7 +14421,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_wcroot_abspath_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_wcroot_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15397,7 +14442,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_moved_from_abspath_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_info_t_moved_from_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15425,7 +14470,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_moved_from_abspath_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_moved_from_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15446,7 +14491,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_moved_to_abspath_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_info_t_moved_to_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15474,7 +14519,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_t_moved_to_abspath_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_info_t_moved_to_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15500,7 +14545,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_info_t(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -15515,7 +14560,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_info_t(PyObject *SWIGUNUSEDPARM(self),
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_info_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15558,7 +14603,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_dup(PyObject *SWIGUNUSEDPARM(self), PyObj
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_info_dup",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_info_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
+ arg1 = (svn_wc_info_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_info_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15579,7 +14624,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_info_dup(PyObject *SWIGUNUSEDPARM(self), PyObj
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_info_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -15622,7 +14667,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflicted_p3(PyObject *SWIGUNUSEDPARM(self),
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_conflicted_p3",&obj0,&arg5,&obj2)) SWIG_fail;
{
- arg4 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg4 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15713,7 +14758,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflicted_p2(PyObject *SWIGUNUSEDPARM(self),
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_conflicted_p2",&arg4,&obj1,&obj2)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15800,7 +14845,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_conflicted_p(PyObject *SWIGUNUSEDPARM(self), P
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_conflicted_p",&arg3,&obj1,&obj2)) SWIG_fail;
{
- arg4 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
+ arg4 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15880,7 +14925,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_ancestry(PyObject *SWIGUNUSEDPARM(self), P
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_get_ancestry",&arg3,&obj1,&obj2)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15952,7 +14997,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_t_found_entry_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_callbacks2_t_found_entry_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -15979,7 +15024,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_t_found_entry_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_callbacks2_t_found_entry_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16001,7 +15046,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_t_handle_error_set(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_callbacks2_t_handle_error_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16028,7 +15073,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_t_handle_error_get(PyObject *
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_callbacks2_t_handle_error_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16054,7 +15099,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_entry_callbacks2_t(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_callbacks2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_callbacks2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -16069,7 +15114,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_entry_callbacks2_t(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_entry_callbacks2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16105,7 +15150,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks_t_found_entry_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_entry_callbacks_t_found_entry_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16132,7 +15177,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks_t_found_entry_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_entry_callbacks_t_found_entry_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16158,7 +15203,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_entry_callbacks_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_callbacks_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_callbacks_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -16173,7 +15218,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_entry_callbacks_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_entry_callbacks_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16228,13 +15273,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_entries3(PyObject *SWIGUNUSEDPARM(self),
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_wc_walk_entries3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16260,8 +15305,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_entries3(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj6; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
}
if (obj7) {
/* Verify that the user supplied a valid pool */
@@ -16328,13 +15373,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_entries2(PyObject *SWIGUNUSEDPARM(self),
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_wc_walk_entries2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16354,8 +15399,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_entries2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
if (obj6) {
/* Verify that the user supplied a valid pool */
@@ -16419,13 +15464,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_entries(PyObject *SWIGUNUSEDPARM(self), P
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_wc_walk_entries",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16500,7 +15545,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_mark_missing_deleted(PyObject *SWIGUNUSEDPARM(
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_mark_missing_deleted",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16568,7 +15613,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_ensure_adm4(PyObject *SWIGUNUSEDPARM(self), Py
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssssOO|O:svn_wc_ensure_adm4",&obj0,&arg2,&arg3,&arg4,&arg5,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16841,7 +15886,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_maybe_set_repos_root(PyObject *SWIGUNUSEDPARM(
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Osz|O:svn_wc_maybe_set_repos_root",&obj0,&arg2,&arg3,&obj3)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16894,7 +15939,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_kind_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16921,7 +15966,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_kind_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16943,7 +15988,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_depth_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_depth_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16970,7 +16015,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_depth_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_depth_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -16992,7 +16037,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_filesize_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_filesize_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17014,7 +16059,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_filesize_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_filesize_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17036,7 +16081,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_versioned_set(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_versioned_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17063,7 +16108,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_versioned_get(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_versioned_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17085,7 +16130,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_conflicted_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_conflicted_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17112,7 +16157,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_conflicted_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_conflicted_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17134,7 +16179,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_node_status_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_node_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17161,7 +16206,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_node_status_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_node_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17183,7 +16228,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_text_status_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17210,7 +16255,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_text_status_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17232,7 +16277,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_prop_status_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17259,7 +16304,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_prop_status_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17281,7 +16326,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_copied_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_copied_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17308,7 +16353,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_copied_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_copied_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17330,7 +16375,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_revision_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_revision_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17357,7 +16402,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_revision_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_revision_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17379,7 +16424,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_rev_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17406,7 +16451,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_rev_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17428,7 +16473,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_date_set(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17450,7 +16495,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_date_get(PyObject *SWIGUNUSE
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17471,7 +16516,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_author_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17499,7 +16544,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changed_author_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17520,7 +16565,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_root_url_set(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_repos_root_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17548,7 +16593,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_root_url_get(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_root_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17569,7 +16614,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_uuid_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_repos_uuid_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17597,7 +16642,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_uuid_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_uuid_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17618,7 +16663,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_relpath_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_repos_relpath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17646,7 +16691,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_relpath_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_relpath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17668,7 +16713,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_switched_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_switched_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17695,7 +16740,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_switched_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_switched_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17717,7 +16762,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_locked_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_locked_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17744,7 +16789,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_locked_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_locked_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17766,13 +16811,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_lock_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17793,13 +16838,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_lock_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -17815,7 +16860,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changelist_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_changelist_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17843,7 +16888,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_changelist_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_changelist_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17865,7 +16910,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_kind_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_ood_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17892,7 +16937,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_kind_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_ood_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17914,7 +16959,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_node_status_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_repos_node_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17941,7 +16986,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_node_status_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_node_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17963,7 +17008,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_text_status_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_repos_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -17990,7 +17035,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_text_status_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18012,7 +17057,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_prop_status_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_repos_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18039,7 +17084,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_prop_status_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18061,13 +17106,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_lock_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_repos_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18088,13 +17133,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_repos_lock_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_repos_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->repos_lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -18111,7 +17156,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_rev_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_ood_changed_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18138,7 +17183,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_rev_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_ood_changed_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18160,7 +17205,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_date_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_ood_changed_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18182,7 +17227,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_date_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_ood_changed_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18203,7 +17248,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_author_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_ood_changed_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18231,7 +17276,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_ood_changed_author_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_ood_changed_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18252,7 +17297,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_moved_from_abspath_set(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_moved_from_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18280,7 +17325,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_moved_from_abspath_get(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_moved_from_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18301,7 +17346,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_moved_to_abspath_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status3_t_moved_to_abspath_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18329,7 +17374,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_moved_to_abspath_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_moved_to_abspath_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18351,7 +17396,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_file_external_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_file_external_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18378,7 +17423,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3_t_file_external_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_file_external_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18391,6 +17436,55 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_wc_status3_t_actual_kind_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ svn_node_kind_t arg2 ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+
+ if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status3_t_actual_kind_set",&obj0,&obj1)) SWIG_fail;
+ {
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_node_kind_t)SWIG_As_long (obj1);
+ if (SWIG_arg_fail(svn_argnum_obj1)) {
+ SWIG_fail;
+ }
+ }
+ if (arg1) (arg1)->actual_kind = arg2;
+ resultobj = SWIG_Py_Void();
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_svn_wc_status3_t_actual_kind_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ PyObject * obj0 = 0 ;
+ svn_node_kind_t result;
+
+ if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status3_t_actual_kind_get",&obj0)) SWIG_fail;
+ {
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ result = (svn_node_kind_t) ((arg1)->actual_kind);
+ resultobj = SWIG_From_long((long)(result));
+ return resultobj;
+fail:
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_new_svn_wc_status3_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct svn_wc_status3_t *result = 0 ;
@@ -18404,7 +17498,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_status3_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status3_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -18419,7 +17513,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_status3_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_status3_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18455,13 +17549,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_entry_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_entry_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
+ arg2 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18482,13 +17576,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_entry_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_entry_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_entry_t *) ((arg1)->entry);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -18505,7 +17599,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_text_status_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18532,7 +17626,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_text_status_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18554,7 +17648,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_prop_status_set(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18581,7 +17675,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_prop_status_get(PyObject *SWIGUNUSED
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18603,7 +17697,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_locked_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_locked_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18630,7 +17724,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_locked_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_locked_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18652,7 +17746,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_copied_set(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_copied_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18679,7 +17773,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_copied_get(PyObject *SWIGUNUSEDPARM(
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_copied_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18701,7 +17795,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_switched_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_switched_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18728,7 +17822,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_switched_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_switched_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18750,7 +17844,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_text_status_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_repos_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18777,7 +17871,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_text_status_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_repos_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18799,7 +17893,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_prop_status_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_repos_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18826,7 +17920,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_prop_status_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_repos_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18848,13 +17942,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_lock_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_repos_lock_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18875,13 +17969,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_repos_lock_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_repos_lock_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_lock_t *) ((arg1)->repos_lock);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_lock_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_lock_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -18897,7 +17991,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_url_set(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status2_t_url_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18925,7 +18019,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_url_get(PyObject *SWIGUNUSEDPARM(sel
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_url_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18947,7 +18041,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_rev_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_ood_last_cmt_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18974,7 +18068,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_rev_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_ood_last_cmt_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -18996,7 +18090,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_date_set(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_ood_last_cmt_date_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19018,7 +18112,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_date_get(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_ood_last_cmt_date_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19040,7 +18134,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_kind_set(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_ood_kind_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19067,7 +18161,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_kind_get(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_ood_kind_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19088,7 +18182,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_author_set(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"Os:svn_wc_status2_t_ood_last_cmt_author_set",&obj0,&arg2)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19116,7 +18210,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_ood_last_cmt_author_get(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_ood_last_cmt_author_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19138,13 +18232,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_tree_conflict_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_tree_conflict_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
+ arg2 = (svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19165,13 +18259,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_tree_conflict_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_tree_conflict_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_conflict_description_t *) ((arg1)->tree_conflict);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_conflict_description_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -19188,7 +18282,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_file_external_set(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_file_external_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19215,7 +18309,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_file_external_get(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_file_external_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19237,7 +18331,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_pristine_text_status_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_pristine_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19264,7 +18358,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_pristine_text_status_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_pristine_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19286,7 +18380,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_pristine_prop_status_set(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status2_t_pristine_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19313,7 +18407,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2_t_pristine_prop_status_get(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status2_t_pristine_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19339,7 +18433,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_status2_t(PyObject *SWIGUNUSEDPARM(self),
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status2_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -19354,7 +18448,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_status2_t(PyObject *SWIGUNUSEDPARM(self
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_status2_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19390,13 +18484,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_entry_set(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_entry_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
+ arg2 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19417,13 +18511,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_entry_get(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_entry_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
result = (svn_wc_entry_t *) ((arg1)->entry);
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_entry_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -19440,7 +18534,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_text_status_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19467,7 +18561,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_text_status_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19489,7 +18583,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_prop_status_set(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19516,7 +18610,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_prop_status_get(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19538,7 +18632,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_locked_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_locked_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19565,7 +18659,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_locked_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_locked_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19587,7 +18681,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_copied_set(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_copied_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19614,7 +18708,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_copied_get(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_copied_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19636,7 +18730,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_switched_set(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_switched_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19663,7 +18757,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_switched_get(PyObject *SWIGUNUSEDPARM
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_switched_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19685,7 +18779,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_repos_text_status_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_repos_text_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19712,7 +18806,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_repos_text_status_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_repos_text_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19734,7 +18828,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_repos_prop_status_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_status_t_repos_prop_status_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19761,7 +18855,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_t_repos_prop_status_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_status_t_repos_prop_status_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19787,7 +18881,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_status_t(PyObject *SWIGUNUSEDPARM(self), P
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -19802,7 +18896,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_status_t(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_status_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19845,7 +18939,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status3(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_dup_status3",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_status3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19866,7 +18960,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status3(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status3_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status3_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -19896,7 +18990,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status2(PyObject *SWIGUNUSEDPARM(self), Py
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_dup_status2",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_status2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19917,7 +19011,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status2(PyObject *SWIGUNUSEDPARM(self), Py
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status2_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status2_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -19947,7 +19041,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status(PyObject *SWIGUNUSEDPARM(self), PyO
arg2 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"O|O:svn_wc_dup_status",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (svn_wc_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
+ arg1 = (svn_wc_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -19968,7 +19062,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_dup_status(PyObject *SWIGUNUSEDPARM(self), PyO
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_status_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_status_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -20008,7 +19102,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status3(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_status3",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20095,7 +19189,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2(PyObject *SWIGUNUSEDPARM(self), PyObje
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_status2",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20128,7 +19222,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status2(PyObject *SWIGUNUSEDPARM(self), PyObje
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_status2_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_status2_t,
_global_py_pool, args))
;
@@ -20165,7 +19259,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_status",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20198,7 +19292,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status(PyObject *SWIGUNUSEDPARM(self), PyObjec
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_status_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_status_t,
_global_py_pool, args))
;
@@ -20249,7 +19343,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_status(PyObject *SWIGUNUSEDPARM(self), Py
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOO|O:svn_wc_walk_status",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20279,14 +19373,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_status(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg7 = (apr_array_header_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
+ arg7 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_status_func4_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -20301,8 +19395,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_walk_status(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj9; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj9;
}
if (obj10) {
/* Verify that the user supplied a valid pool */
@@ -20399,7 +19493,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor5(PyObject *SWIGUNUSEDPARM(se
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOOO|OO:svn_wc_get_status_editor5",&obj0,&arg6,&arg7,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg5 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg5 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20435,14 +19529,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor5(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_status_func4_t * tmp =
- svn_swig_MustGetPtr(obj9, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj9);
+ svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj9);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -20457,8 +19551,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor5(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg16 = svn_swig_py_cancel_func;
- arg17 = obj11; /* our function is the baton. */
+ arg16 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg17 = obj11;
}
if (obj12) {
/* Verify that the user supplied a valid pool */
@@ -20496,19 +19590,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor5(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -20584,7 +19678,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor4(PyObject *SWIGUNUSEDPARM(se
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOO|O:svn_wc_get_status_editor4",&obj0,&arg6,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20608,14 +19702,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg10 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ arg10 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_status_func3_t * tmp =
- svn_swig_MustGetPtr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
+ svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj6);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -20630,11 +19724,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg13 = svn_swig_py_cancel_func;
- arg14 = obj8; /* our function is the baton. */
+ arg13 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg14 = obj8;
}
{
- arg15 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj9);
+ arg15 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20667,19 +19761,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor4(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -20748,7 +19842,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor3(PyObject *SWIGUNUSEDPARM(se
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_get_status_editor3",&obj0,&arg6,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20772,21 +19866,21 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor3(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg10 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ arg10 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg11 = svn_swig_py_status_func2;
+ arg11 = (svn_wc_status_func2_t) svn_swig_py_status_func2;
arg12 = obj6;
}
{
- arg13 = svn_swig_py_cancel_func;
- arg14 = obj7; /* our function is the baton. */
+ arg13 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg14 = obj7;
}
{
- arg15 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg15 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20819,19 +19913,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor3(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -20900,7 +19994,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor2(PyObject *SWIGUNUSEDPARM(se
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_get_status_editor2",&obj0,&arg6,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20937,15 +20031,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor2(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg11 = svn_swig_py_status_func2;
+ arg11 = (svn_wc_status_func2_t) svn_swig_py_status_func2;
arg12 = obj6;
}
{
- arg13 = svn_swig_py_cancel_func;
- arg14 = obj7; /* our function is the baton. */
+ arg13 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg14 = obj7;
}
{
- arg15 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg15 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -20978,19 +20072,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor2(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg3, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg3, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -21056,7 +20150,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor(PyObject *SWIGUNUSEDPARM(sel
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_get_status_editor",&obj0,&arg5,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21093,15 +20187,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg10 = svn_swig_py_status_func;
+ arg10 = (svn_wc_status_func_t) svn_swig_py_status_func;
arg11 = obj6;
}
{
- arg12 = svn_swig_py_cancel_func;
- arg13 = obj7; /* our function is the baton. */
+ arg12 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg13 = obj7;
}
{
- arg14 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg14 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21134,13 +20228,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_status_editor(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -21190,7 +20284,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_status_set_repos_locks(PyObject *SWIGUNUSEDPAR
}
}
{
- arg2 = (apr_hash_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
+ arg2 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_apr_hash_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21260,7 +20354,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_copy3(PyObject *SWIGUNUSEDPARM(self), PyObject
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOO|O:svn_wc_copy3",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21272,11 +20366,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_copy3(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -21342,17 +20436,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_copy2(PyObject *SWIGUNUSEDPARM(self), PyObject
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOO|O:svn_wc_copy2",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj4;
}
if (obj5) {
@@ -21418,17 +20512,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_copy(PyObject *SWIGUNUSEDPARM(self), PyObject
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOsOO|O:svn_wc_copy",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
{
- arg6 = svn_swig_py_notify_func;
+ arg6 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg7 = obj4;
}
if (obj5) {
@@ -21496,7 +20590,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_move(PyObject *SWIGUNUSEDPARM(self), PyObject
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOO|O:svn_wc_move",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21508,11 +20602,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_move(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -21581,7 +20675,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_delete4(PyObject *SWIGUNUSEDPARM(self), PyObje
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_wc_delete4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21599,11 +20693,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_delete4(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -21670,17 +20764,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_delete3(PyObject *SWIGUNUSEDPARM(self), PyObje
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_wc_delete3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
{
- arg5 = svn_swig_py_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg6 = obj3;
}
{
@@ -21751,17 +20845,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_delete2(PyObject *SWIGUNUSEDPARM(self), PyObje
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_wc_delete2",&arg1,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
{
- arg5 = svn_swig_py_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg6 = obj3;
}
if (obj4) {
@@ -21826,17 +20920,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_delete(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOO|O:svn_wc_delete",&arg1,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
{
- arg5 = svn_swig_py_notify_func;
+ arg5 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg6 = obj3;
}
if (obj4) {
@@ -21878,6 +20972,97 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_wc_add_from_disk3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_wc_notify_func2_t arg5 = (svn_wc_notify_func2_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg7 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_add_from_disk3",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+ {
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
+ arg3 = svn_swig_py_prophash_from_dict(obj2, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
+ arg6 = obj4;
+ }
+ if (obj5) {
+ /* Verify that the user supplied a valid pool */
+ if (obj5 != Py_None && obj5 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj5);
+ SWIG_arg_fail(svn_argnum_obj5);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_wc_add_from_disk3(arg1,(char const *)arg2,(apr_hash_t const *)arg3,arg4,arg5,arg6,arg7);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_wc_add_from_disk2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
@@ -21900,7 +21085,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_from_disk2(PyObject *SWIGUNUSEDPARM(self),
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_add_from_disk2",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -21919,7 +21104,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_from_disk2(PyObject *SWIGUNUSEDPARM(self),
}
}
{
- arg4 = svn_swig_py_notify_func2;
+ arg4 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg5 = obj3;
}
if (obj4) {
@@ -21981,13 +21166,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_from_disk(PyObject *SWIGUNUSEDPARM(self),
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_add_from_disk",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_notify_func2;
+ arg3 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg4 = obj2;
}
if (obj3) {
@@ -22057,7 +21242,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add4(PyObject *SWIGUNUSEDPARM(self), PyObject
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOzOOO|O:svn_wc_add4",&obj0,&arg2,&obj2,&arg4,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22075,11 +21260,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_add4(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
if (obj7) {
@@ -22149,7 +21334,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add3(PyObject *SWIGUNUSEDPARM(self), PyObject
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOzOOO|O:svn_wc_add3",&arg1,&obj1,&obj2,&arg4,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22167,11 +21352,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_add3(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
if (obj7) {
@@ -22239,7 +21424,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add2(PyObject *SWIGUNUSEDPARM(self), PyObject
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOzOOO|O:svn_wc_add2",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22251,11 +21436,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_add2(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -22323,7 +21508,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add(PyObject *SWIGUNUSEDPARM(self), PyObject *
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOzOOO|O:svn_wc_add",&arg1,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22335,11 +21520,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_add(PyObject *SWIGUNUSEDPARM(self), PyObject *
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func;
+ arg7 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg8 = obj5;
}
if (obj6) {
@@ -22412,7 +21597,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file4(PyObject *SWIGUNUSEDPARM(self)
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOzOO|O:svn_wc_add_repos_file4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&arg7,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22456,8 +21641,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file4(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj8; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj8;
}
if (obj9) {
/* Verify that the user supplied a valid pool */
@@ -22532,7 +21717,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file3(PyObject *SWIGUNUSEDPARM(self)
arg13 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOzOOO|O:svn_wc_add_repos_file3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&arg7,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22576,11 +21761,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file3(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj8; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj8;
}
{
- arg11 = svn_swig_py_notify_func2;
+ arg11 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg12 = obj9;
}
if (obj10) {
@@ -22648,7 +21833,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file2(PyObject *SWIGUNUSEDPARM(self)
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOszOOzO|O:svn_wc_add_repos_file2",&arg1,&obj1,&arg3,&arg4,&obj4,&obj5,&arg7,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22747,7 +21932,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_repos_file(PyObject *SWIGUNUSEDPARM(self),
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOzOzO|O:svn_wc_add_repos_file",&arg1,&obj1,&arg3,&obj3,&arg5,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22834,7 +22019,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_from_revision_control2(PyObject *SWIGUN
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_remove_from_revision_control2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22852,8 +22037,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_from_revision_control2(PyObject *SWIGUN
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -22918,7 +22103,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_from_revision_control(PyObject *SWIGUNU
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_remove_from_revision_control",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -22936,8 +22121,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_from_revision_control(PyObject *SWIGUNU
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -23010,7 +22195,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict5(PyObject *SWIGUNUSEDPARM(se
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOsOOOO|O:svn_wc_resolved_conflict5",&obj0,&arg2,&obj2,&obj3,&arg5,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23040,11 +22225,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict5(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj7; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
}
{
- arg10 = svn_swig_py_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg11 = obj8;
}
if (obj9) {
@@ -23119,7 +22304,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict4(PyObject *SWIGUNUSEDPARM(se
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_wc_resolved_conflict4",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23155,12 +22340,12 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj7;
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj8; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj8;
}
if (obj9) {
/* Verify that the user supplied a valid pool */
@@ -23232,7 +22417,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict3(PyObject *SWIGUNUSEDPARM(se
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_wc_resolved_conflict3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23262,12 +22447,12 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict3(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj6;
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj7; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -23337,7 +22522,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict2(PyObject *SWIGUNUSEDPARM(se
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_wc_resolved_conflict2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23361,12 +22546,12 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict2(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj5;
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj6; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj6;
}
if (obj7) {
/* Verify that the user supplied a valid pool */
@@ -23433,7 +22618,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict(PyObject *SWIGUNUSEDPARM(sel
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_wc_resolved_conflict",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23457,7 +22642,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_resolved_conflict(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg6 = svn_swig_py_notify_func;
+ arg6 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg7 = obj5;
}
if (obj6) {
@@ -23528,7 +22713,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_committed_queue_create(PyObject *SWIGUNUSEDPAR
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_committed_queue_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_committed_queue_t,
_global_py_pool, args);
{
Py_XDECREF(_global_py_pool);
@@ -23542,6 +22727,130 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_wc_queue_committed4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
+ svn_wc_context_t *arg2 = (svn_wc_context_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ apr_array_header_t *arg6 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_checksum_t *arg9 = (svn_checksum_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj1 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg10 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OOsOOOOOO|O:svn_wc_queue_committed4",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
+ {
+ arg1 = (svn_wc_committed_queue_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ if (_global_pool == NULL)
+ {
+ if (svn_swig_py_get_parent_pool(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ }
+
+ arg6 = svn_swig_py_proparray_from_dict(obj5, _global_pool);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (svn_boolean_t)SWIG_As_long (obj7);
+ if (SWIG_arg_fail(svn_argnum_obj7)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg9 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj8);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ if (obj9) {
+ /* Verify that the user supplied a valid pool */
+ if (obj9 != Py_None && obj9 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj9);
+ SWIG_arg_fail(svn_argnum_obj9);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_wc_queue_committed4(arg1,arg2,(char const *)arg3,arg4,arg5,(apr_array_header_t const *)arg6,arg7,arg8,(struct svn_checksum_t const *)arg9,arg10);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_wc_queue_committed3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
@@ -23571,13 +22880,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed3(PyObject *SWIGUNUSEDPARM(self
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOOO|O:svn_wc_queue_committed3",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_wc_committed_queue_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
+ arg1 = (svn_wc_committed_queue_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23614,7 +22923,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed3(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg8 = (svn_checksum_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj7);
+ arg8 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23687,13 +22996,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed2(PyObject *SWIGUNUSEDPARM(self
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_wc_queue_committed2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_wc_committed_queue_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
+ arg1 = (svn_wc_committed_queue_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23730,7 +23039,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg8 = (svn_checksum_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj7);
+ arg8 = (svn_checksum_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_checksum_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23804,7 +23113,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_wc_queue_committed",&arg2,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23876,7 +23185,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_queue_committed(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_committed_queue_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_committed_queue_t,
_global_py_pool, args))
;
@@ -23919,13 +23228,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed_queue2(PyObject *SWIGUNUSEDP
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOzzO|O:svn_wc_process_committed_queue2",&obj0,&obj1,&obj2,&arg4,&arg5,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_committed_queue_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
+ arg1 = (svn_wc_committed_queue_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -23937,8 +23246,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed_queue2(PyObject *SWIGUNUSEDP
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
if (obj6) {
/* Verify that the user supplied a valid pool */
@@ -24001,13 +23310,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed_queue(PyObject *SWIGUNUSEDPA
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOOzz|O:svn_wc_process_committed_queue",&obj0,&obj1,&obj2,&arg4,&arg5,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_committed_queue_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
+ arg1 = (svn_wc_committed_queue_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_committed_queue_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24088,7 +23397,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed4(PyObject *SWIGUNUSEDPARM(se
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOzzOOOO|O:svn_wc_process_committed4",&arg1,&obj1,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24207,7 +23516,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed3(PyObject *SWIGUNUSEDPARM(se
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOzzOOO|O:svn_wc_process_committed3",&arg1,&obj1,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24318,7 +23627,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed2(PyObject *SWIGUNUSEDPARM(se
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOzzOO|O:svn_wc_process_committed2",&arg1,&obj1,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24418,7 +23727,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_process_committed(PyObject *SWIGUNUSEDPARM(sel
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOzzO|O:svn_wc_process_committed",&arg1,&obj1,&obj2,&obj3,&arg5,&arg6,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24524,13 +23833,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions5(PyObject *SWIGUNUSEDPARM(self
arg14 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOOO|O:svn_wc_crawl_revisions5",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
+ arg3 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24574,11 +23883,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions5(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj9; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj9;
}
{
- arg12 = svn_swig_py_notify_func2;
+ arg12 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg13 = obj10;
}
if (obj11) {
@@ -24656,13 +23965,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions4(PyObject *SWIGUNUSEDPARM(self
arg13 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOOO|O:svn_wc_crawl_revisions4",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
+ arg3 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24706,11 +24015,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions4(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg10 = svn_swig_py_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg11 = obj9;
}
{
- arg12 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj10);
+ arg12 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24788,13 +24097,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions3(PyObject *SWIGUNUSEDPARM(self
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOOO|O:svn_wc_crawl_revisions3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_ra_reporter3_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
+ arg3 = (svn_ra_reporter3_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_ra_reporter3_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24832,11 +24141,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions3(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg9 = svn_swig_py_notify_func2;
+ arg9 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg10 = obj8;
}
{
- arg11 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj9);
+ arg11 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -24911,13 +24220,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions2(PyObject *SWIGUNUSEDPARM(self
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOO|O:svn_wc_crawl_revisions2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_ra_reporter2_t *)&swig_py_ra_reporter2;
+ arg3 = (svn_ra_reporter2_t *) svn_swig_py_get_ra_reporter2();
arg4 = obj2;
}
{
@@ -24939,11 +24248,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
{
- arg10 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
+ arg10 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25019,13 +24328,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions(PyObject *SWIGUNUSEDPARM(self)
arg11 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOOOO|O:svn_wc_crawl_revisions",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_ra_reporter_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj2);
+ arg3 = (svn_ra_reporter_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_ra_reporter_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25057,11 +24366,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crawl_revisions(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg8 = svn_swig_py_notify_func;
+ arg8 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg9 = obj7;
}
{
- arg10 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg10 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25134,7 +24443,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_check_root(PyObject *SWIGUNUSEDPARM(self), PyO
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_check_root",&obj0,&arg5,&obj2)) SWIG_fail;
{
- arg4 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg4 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25217,7 +24526,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_is_wc_root2(PyObject *SWIGUNUSEDPARM(self), Py
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_is_wc_root2",&obj0,&arg3,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25288,7 +24597,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_is_wc_root(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_is_wc_root",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25367,7 +24676,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_actual_target2(PyObject *SWIGUNUSEDPARM(se
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_get_actual_target2",&obj0,&arg4,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25605,7 +24914,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOzOOOOOOOOO|OO:svn_wc_get_update_editor4",&obj0,&arg5,&arg6,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&arg14,&obj11,&obj12,&obj13,&obj14,&obj15,&obj16,&obj17,&obj18,&obj19,&obj20,&obj21)) SWIG_fail;
{
- arg4 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg4 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25663,7 +24972,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_dirents_func_t * tmp =
- svn_swig_MustGetPtr(obj12, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj12);
+ svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj12);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25679,7 +24988,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj14, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj14);
+ svn_swig_py_must_get_ptr(obj14, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj14);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25695,7 +25004,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_external_update_t * tmp =
- svn_swig_MustGetPtr(obj16, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj16);
+ svn_swig_py_must_get_ptr(obj16, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj16);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25710,11 +25019,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg22 = svn_swig_py_cancel_func;
- arg23 = obj18; /* our function is the baton. */
+ arg22 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg23 = obj18;
}
{
- arg24 = svn_swig_py_notify_func2;
+ arg24 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg25 = obj19;
}
if (obj20) {
@@ -25753,13 +25062,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor4(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -25842,7 +25151,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor3(PyObject *SWIGUNUSEDPARM(se
arg19 = &temp19;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOOOOzOO|O:svn_wc_get_update_editor3",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&arg16,&obj13,&obj14,&obj15)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25872,16 +25181,16 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor3(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj7; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj7;
}
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj8, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj8);
+ svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj8);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25897,7 +25206,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor3(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_get_file_t * tmp =
- svn_swig_MustGetPtr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj10);
+ svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj10);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -25921,7 +25230,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor3(PyObject *SWIGUNUSEDPARM(se
SWIG_fail;
}
{
- arg20 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj14, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj14);
+ arg20 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj14, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj14);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -25960,13 +25269,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor3(PyObject *SWIGUNUSEDPARM(se
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg18, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg18, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg19, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg19, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26023,7 +25332,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor2(PyObject *SWIGUNUSEDPARM(se
arg12 = &temp12;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOzO|O:svn_wc_get_update_editor2",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&arg10,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26041,15 +25350,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor2(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj4;
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj5; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj5;
}
{
- arg13 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
+ arg13 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26088,13 +25397,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor2(PyObject *SWIGUNUSEDPARM(se
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26151,7 +25460,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor(PyObject *SWIGUNUSEDPARM(sel
arg12 = &temp12;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOzO|O:svn_wc_get_update_editor",&obj0,&arg3,&obj2,&obj3,&obj4,&obj5,&arg10,&obj7,&obj8)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26169,15 +25478,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg6 = svn_swig_py_notify_func;
+ arg6 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg7 = obj4;
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj5; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj5;
}
{
- arg13 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
+ arg13 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26216,13 +25525,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_update_editor(PyObject *SWIGUNUSEDPARM(sel
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26305,7 +25614,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsssOOOOOzOOOOOOOOO|OO:svn_wc_get_switch_editor4",&obj0,&arg5,&arg6,&arg7,&obj4,&obj5,&obj6,&obj7,&obj8,&arg13,&obj10,&obj11,&obj12,&obj13,&obj14,&obj15,&obj16,&obj17,&obj18,&obj19,&obj20)) SWIG_fail;
{
- arg4 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg4 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26351,7 +25660,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_dirents_func_t * tmp =
- svn_swig_MustGetPtr(obj11, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj11);
+ svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj11);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26367,7 +25676,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj13, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj13);
+ svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj13);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26383,7 +25692,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
}
{
svn_wc_external_update_t * tmp =
- svn_swig_MustGetPtr(obj15, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj15);
+ svn_swig_py_must_get_ptr(obj15, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj15);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26398,11 +25707,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg21 = svn_swig_py_cancel_func;
- arg22 = obj17; /* our function is the baton. */
+ arg21 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg22 = obj17;
}
{
- arg23 = svn_swig_py_notify_func2;
+ arg23 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg24 = obj18;
}
if (obj19) {
@@ -26441,13 +25750,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor4(PyObject *SWIGUNUSEDPARM(se
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26527,7 +25836,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor3(PyObject *SWIGUNUSEDPARM(se
arg18 = &temp18;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOOzOO|O:svn_wc_get_switch_editor3",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&arg15,&obj12,&obj13,&obj14)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26557,16 +25866,16 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor3(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg9 = svn_swig_py_notify_func2;
+ arg9 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg10 = obj7;
}
{
- arg11 = svn_swig_py_cancel_func;
- arg12 = obj8; /* our function is the baton. */
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj8;
}
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj9, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj9);
+ svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj9);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -26590,7 +25899,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor3(PyObject *SWIGUNUSEDPARM(se
SWIG_fail;
}
{
- arg19 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj13, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj13);
+ arg19 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj13);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26629,13 +25938,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor3(PyObject *SWIGUNUSEDPARM(se
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg17, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg17, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg18, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg18, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26693,7 +26002,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor2(PyObject *SWIGUNUSEDPARM(se
arg13 = &temp13;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOzO|O:svn_wc_get_switch_editor2",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5,&obj6,&arg11,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26711,15 +26020,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor2(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj6; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj6;
}
{
- arg14 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg14 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26758,13 +26067,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor2(PyObject *SWIGUNUSEDPARM(se
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg13, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg13, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26822,7 +26131,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor(PyObject *SWIGUNUSEDPARM(sel
arg13 = &temp13;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOzO|O:svn_wc_get_switch_editor",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5,&obj6,&arg11,&obj8,&obj9)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26840,15 +26149,15 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor(PyObject *SWIGUNUSEDPARM(sel
}
}
{
- arg7 = svn_swig_py_notify_func;
+ arg7 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg8 = obj5;
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj6; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj6;
}
{
- arg14 = (svn_wc_traversal_info_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
+ arg14 = (svn_wc_traversal_info_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_traversal_info_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -26887,13 +26196,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_switch_editor(PyObject *SWIGUNUSEDPARM(sel
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg13, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg13, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -26936,7 +26245,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_list2(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_prop_list2",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27017,7 +26326,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_list(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_prop_list",&arg2,&obj1,&obj2)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27090,7 +26399,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_pristine_props(PyObject *SWIGUNUSEDPARM(se
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_get_pristine_props",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27178,7 +26487,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_get2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Oss|OO:svn_wc_prop_get2",&obj0,&arg3,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27270,7 +26579,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_get(PyObject *SWIGUNUSEDPARM(self), PyObj
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssO|O:svn_wc_prop_get",&arg2,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27360,7 +26669,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set4(PyObject *SWIGUNUSEDPARM(self), PyOb
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOO|O:svn_wc_prop_set4",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27391,17 +26700,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set4(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg7 = (apr_array_header_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
+ arg7 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj7; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
}
{
- arg10 = svn_swig_py_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg11 = obj8;
}
if (obj9) {
@@ -27482,7 +26791,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27494,7 +26803,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj5;
}
if (obj6) {
@@ -27572,7 +26881,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27656,7 +26965,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_prop_set(PyObject *SWIGUNUSEDPARM(self), PyObj
}
}
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27819,7 +27128,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_canonicalize_svn_prop(PyObject *SWIGUNUSEDPARM
}
{
svn_wc_canonicalize_svn_prop_get_file_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_p_q_const__svn_string_t_p_svn_stream_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_p_q_const__svn_string_t_p_svn_stream_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -27938,7 +27247,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor6(PyObject *SWIGUNUSEDPARM(self
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OssOOOOOOOOOOO|OO:svn_wc_get_diff_editor6",&obj0,&arg4,&arg5,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13,&obj14,&obj15)) SWIG_fail;
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -27986,13 +27295,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor6(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj11);
+ arg14 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28006,8 +27315,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor6(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg16 = svn_swig_py_cancel_func;
- arg17 = obj13; /* our function is the baton. */
+ arg16 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg17 = obj13;
}
if (obj14) {
/* Verify that the user supplied a valid pool */
@@ -28045,13 +27354,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor6(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg2, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg2, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28114,13 +27423,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor5(PyObject *SWIGUNUSEDPARM(self
arg13 = &temp13;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOO|O:svn_wc_get_diff_editor5",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28158,11 +27467,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor5(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj8; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj8;
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28195,13 +27504,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor5(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg13, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg13, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28257,13 +27566,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor4(PyObject *SWIGUNUSEDPARM(self
arg13 = &temp13;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_get_diff_editor4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
_global_pool);
arg4 = obj2;
}
@@ -28292,11 +27601,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor4(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj7; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj7;
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28329,13 +27638,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor4(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg13, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg13, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28389,13 +27698,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor3(PyObject *SWIGUNUSEDPARM(self
arg12 = &temp12;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_wc_get_diff_editor3",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
_global_pool);
arg4 = obj2;
}
@@ -28424,8 +27733,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor3(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj7; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -28455,13 +27764,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor3(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28516,13 +27825,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor2(PyObject *SWIGUNUSEDPARM(self
arg12 = &temp12;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_get_diff_editor2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28560,8 +27869,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg9 = svn_swig_py_cancel_func;
- arg10 = obj8; /* our function is the baton. */
+ arg9 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg10 = obj8;
}
if (obj9) {
/* Verify that the user supplied a valid pool */
@@ -28591,13 +27900,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor2(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg11, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg12, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg12, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28650,13 +27959,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor(PyObject *SWIGUNUSEDPARM(self)
arg11 = &temp11;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_wc_get_diff_editor",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28688,8 +27997,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg8 = svn_swig_py_cancel_func;
- arg9 = obj7; /* our function is the baton. */
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
}
if (obj8) {
/* Verify that the user supplied a valid pool */
@@ -28719,13 +28028,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_diff_editor(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg10, SWIGTYPE_p_svn_delta_editor_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg10, SWIGTYPE_p_svn_delta_editor_t,
_global_py_pool, args))
;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg11, SWIGTYPE_p_void,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg11, SWIGTYPE_p_void,
_global_py_pool, args))
;
@@ -28776,13 +28085,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff6(PyObject *SWIGUNUSEDPARM(self), PyObject
arg12 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOOO|O:svn_wc_diff6",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28820,14 +28129,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff6(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg9 = (apr_array_header_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
+ arg9 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg10 = svn_swig_py_cancel_func;
- arg11 = obj9; /* our function is the baton. */
+ arg10 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg11 = obj9;
}
if (obj10) {
/* Verify that the user supplied a valid pool */
@@ -28895,13 +28204,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff5(PyObject *SWIGUNUSEDPARM(self), PyObject
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_wc_diff5",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28927,7 +28236,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff5(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg7 = (apr_array_header_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
+ arg7 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -28997,13 +28306,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff4(PyObject *SWIGUNUSEDPARM(self), PyObject
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_wc_diff4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
_global_pool);
arg4 = obj2;
}
@@ -29020,7 +28329,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff4(PyObject *SWIGUNUSEDPARM(self), PyObject
}
}
{
- arg7 = (apr_array_header_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
+ arg7 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29088,13 +28397,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff3(PyObject *SWIGUNUSEDPARM(self), PyObject
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_diff3",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_py_setup_wc_diff_callbacks2(&arg4, obj2,
_global_pool);
arg4 = obj2;
}
@@ -29174,13 +28483,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff2(PyObject *SWIGUNUSEDPARM(self), PyObject
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_wc_diff2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29267,13 +28576,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff(PyObject *SWIGUNUSEDPARM(self), PyObject
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_diff",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
+ arg3 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29360,7 +28669,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_prop_diffs2(PyObject *SWIGUNUSEDPARM(self)
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_get_prop_diffs2",&obj0,&arg4,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29447,7 +28756,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_prop_diffs(PyObject *SWIGUNUSEDPARM(self),
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_get_prop_diffs",&arg3,&obj1,&obj2)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29545,25 +28854,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge5(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OOssssssOOOzOOOOOO|O:svn_wc_merge5",&obj0,&obj1,&arg4,&arg5,&arg6,&arg7,&arg8,&arg9,&obj8,&obj9,&obj10,&arg13,&obj12,&obj13,&obj14,&obj15,&obj16,&obj17,&obj18)) SWIG_fail;
{
- arg2 = (enum svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
+ arg2 = (enum svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg10 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj8);
+ arg10 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg11 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj9);
+ arg11 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29575,26 +28884,26 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge5(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg14 = (apr_array_header_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
+ arg14 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg15 = (apr_hash_t *)svn_swig_MustGetPtr(obj13, SWIGTYPE_p_apr_hash_t, svn_argnum_obj13);
+ arg15 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_apr_hash_t, svn_argnum_obj13);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg16 = (apr_array_header_t *)svn_swig_MustGetPtr(obj14, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj14);
+ arg16 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj14, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj14);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj15, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj15);
+ svn_swig_py_must_get_ptr(obj15, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj15);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29609,8 +28918,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge5(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg19 = svn_swig_py_cancel_func;
- arg20 = obj17; /* our function is the baton. */
+ arg19 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg20 = obj17;
}
if (obj18) {
/* Verify that the user supplied a valid pool */
@@ -29701,19 +29010,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge4(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OssssssOOOzOOOOO|O:svn_wc_merge4",&obj0,&arg3,&arg4,&arg5,&arg6,&arg7,&arg8,&obj7,&obj8,&obj9,&arg12,&obj11,&obj12,&obj13,&obj14,&obj15,&obj16)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg9 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj7);
+ arg9 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg10 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj8);
+ arg10 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29725,20 +29034,20 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge4(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (apr_array_header_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
+ arg14 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj13, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj13);
+ svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj13);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29753,8 +29062,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge4(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg17 = svn_swig_py_cancel_func;
- arg18 = obj15; /* our function is the baton. */
+ arg17 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg18 = obj15;
}
if (obj16) {
/* Verify that the user supplied a valid pool */
@@ -29838,7 +29147,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge3(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sssOsssOzOOOO|O:svn_wc_merge3",&arg2,&arg3,&arg4,&obj3,&arg6,&arg7,&arg8,&obj7,&arg10,&obj9,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29850,20 +29159,20 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge3(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj11, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj11);
+ svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj11);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -29953,7 +29262,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge2(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sssOsssOzO|O:svn_wc_merge2",&arg2,&arg3,&arg4,&obj3,&arg6,&arg7,&arg8,&obj7,&arg10,&obj9,&obj10)) SWIG_fail;
{
- arg5 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg5 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -29965,7 +29274,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge2(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg11 = (apr_array_header_t *)svn_swig_MustGetPtr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
+ arg11 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj9, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj9);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30044,7 +29353,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge(PyObject *SWIGUNUSEDPARM(self), PyObject
arg9 = &temp9;
if (!PyArg_ParseTuple(args,(char *)"sssOsssOz|O:svn_wc_merge",&arg1,&arg2,&arg3,&obj3,&arg5,&arg6,&arg7,&obj7,&arg10,&obj9)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30136,25 +29445,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props3(PyObject *SWIGUNUSEDPARM(self), P
arg13 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOOOOOO|O:svn_wc_merge_props3",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail;
{
- arg1 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
+ arg1 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj3);
+ arg4 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (svn_wc_conflict_version_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
+ arg5 = (svn_wc_conflict_version_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_svn_wc_conflict_version_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30173,7 +29482,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props3(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg7 = (apr_array_header_t *)svn_swig_MustGetPtr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
+ arg7 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj6, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj6);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30186,7 +29495,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props3(PyObject *SWIGUNUSEDPARM(self), P
}
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj8, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj8);
+ svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj8);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30201,8 +29510,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props3(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg11 = svn_swig_py_cancel_func;
- arg12 = obj10; /* our function is the baton. */
+ arg11 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg12 = obj10;
}
if (obj11) {
/* Verify that the user supplied a valid pool */
@@ -30274,13 +29583,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props2(PyObject *SWIGUNUSEDPARM(self), P
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_merge_props2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
+ arg1 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30299,7 +29608,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props2(PyObject *SWIGUNUSEDPARM(self), P
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30318,7 +29627,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props2(PyObject *SWIGUNUSEDPARM(self), P
}
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj7, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
+ svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj7);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -30398,13 +29707,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props(PyObject *SWIGUNUSEDPARM(self), Py
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_wc_merge_props",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
+ arg1 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30423,7 +29732,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_props(PyObject *SWIGUNUSEDPARM(self), Py
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30504,19 +29813,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_merge_prop_diffs(PyObject *SWIGUNUSEDPARM(self
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_wc_merge_prop_diffs",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
+ arg1 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (apr_array_header_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj3);
+ arg4 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30598,7 +29907,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_pristine_contents2(PyObject *SWIGUNUSEDPAR
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"Os|OO:svn_wc_get_pristine_contents2",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -30639,7 +29948,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_pristine_contents2(PyObject *SWIGUNUSEDPAR
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -30721,7 +30030,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_pristine_contents(PyObject *SWIGUNUSEDPARM
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -30813,6 +30122,113 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_wc_cleanup4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ svn_wc_notify_func2_t arg9 = (svn_wc_notify_func2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ apr_pool_t *arg11 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg11 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOOOOO|O:svn_wc_cleanup4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
+ {
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_boolean_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (svn_boolean_t)SWIG_As_long (obj4);
+ if (SWIG_arg_fail(svn_argnum_obj4)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
+ }
+ {
+ arg9 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
+ arg10 = obj7;
+ }
+ if (obj8) {
+ /* Verify that the user supplied a valid pool */
+ if (obj8 != Py_None && obj8 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj8);
+ SWIG_arg_fail(svn_argnum_obj8);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_wc_cleanup4(arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_wc_cleanup3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
@@ -30833,14 +30249,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_cleanup3(PyObject *SWIGUNUSEDPARM(self), PyObj
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_cleanup3",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
if (obj3) {
/* Verify that the user supplied a valid pool */
@@ -30900,8 +30316,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_cleanup2(PyObject *SWIGUNUSEDPARM(self), PyObj
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"szO|O:svn_wc_cleanup2",&arg1,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
if (obj3) {
/* Verify that the user supplied a valid pool */
@@ -30963,14 +30379,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_cleanup(PyObject *SWIGUNUSEDPARM(self), PyObje
arg6 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOzO|O:svn_wc_cleanup",&arg1,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -31038,14 +30454,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_upgrade(PyObject *SWIGUNUSEDPARM(self), PyObje
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOO|O:svn_wc_upgrade",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_upgrade_get_repos_info_t * tmp =
- svn_swig_MustGetPtr(obj2, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_void_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
+ svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_void_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj2);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31060,11 +30476,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_upgrade(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -31129,14 +30545,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate4(PyObject *SWIGUNUSEDPARM(self), PyOb
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsssOO|O:svn_wc_relocate4",&obj0,&arg2,&arg3,&arg4,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_wc_relocation_validator3_t * tmp =
- svn_swig_MustGetPtr(obj4, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj4);
+ svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj4);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31214,7 +30630,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate3(PyObject *SWIGUNUSEDPARM(self), PyOb
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOssOOO|O:svn_wc_relocate3",&arg1,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31227,7 +30643,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate3(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_wc_relocation_validator3_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31305,7 +30721,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOssOOO|O:svn_wc_relocate2",&arg1,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31318,7 +30734,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate2(PyObject *SWIGUNUSEDPARM(self), PyOb
}
{
svn_wc_relocation_validator2_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31396,7 +30812,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate(PyObject *SWIGUNUSEDPARM(self), PyObj
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOssOOO|O:svn_wc_relocate",&arg1,&obj1,&arg3,&arg4,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31409,7 +30825,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_relocate(PyObject *SWIGUNUSEDPARM(self), PyObj
}
{
svn_wc_relocation_validator_t * tmp =
- svn_swig_MustGetPtr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char__p_svn_error_t, svn_argnum_obj5);
+ svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char__p_svn_error_t, svn_argnum_obj5);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -31462,6 +30878,121 @@ fail:
}
+SWIGINTERN PyObject *_wrap_svn_wc_revert5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+ PyObject *resultobj = 0;
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_depth_t arg3 ;
+ svn_boolean_t arg4 ;
+ apr_array_header_t *arg5 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_cancel_func_t arg8 = (svn_cancel_func_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_wc_notify_func2_t arg10 = (svn_wc_notify_func2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ apr_pool_t *_global_pool = NULL ;
+ PyObject *_global_py_pool = NULL ;
+ PyObject * obj0 = 0 ;
+ PyObject * obj2 = 0 ;
+ PyObject * obj3 = 0 ;
+ PyObject * obj4 = 0 ;
+ PyObject * obj5 = 0 ;
+ PyObject * obj6 = 0 ;
+ PyObject * obj7 = 0 ;
+ PyObject * obj8 = 0 ;
+ PyObject * obj9 = 0 ;
+ svn_error_t *result = 0 ;
+
+ if (svn_swig_py_get_pool_arg(args, SWIGTYPE_p_apr_pool_t,
+ &_global_py_pool, &_global_pool))
+ SWIG_fail;
+ arg12 = _global_pool;
+ if (!PyArg_ParseTuple(args,(char *)"OsOOOOOOO|O:svn_wc_revert5",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
+ {
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg3 = (svn_depth_t)SWIG_As_long (obj2);
+ if (SWIG_arg_fail(svn_argnum_obj2)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg4 = (svn_boolean_t)SWIG_As_long (obj3);
+ if (SWIG_arg_fail(svn_argnum_obj3)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ if (PyErr_Occurred()) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg6 = (svn_boolean_t)SWIG_As_long (obj5);
+ if (SWIG_arg_fail(svn_argnum_obj5)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg7 = (svn_boolean_t)SWIG_As_long (obj6);
+ if (SWIG_arg_fail(svn_argnum_obj6)) {
+ SWIG_fail;
+ }
+ }
+ {
+ arg8 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg9 = obj7;
+ }
+ {
+ arg10 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
+ arg11 = obj8;
+ }
+ if (obj9) {
+ /* Verify that the user supplied a valid pool */
+ if (obj9 != Py_None && obj9 != _global_py_pool) {
+ SWIG_Python_TypeError(SWIG_TypePrettyName(SWIGTYPE_p_apr_pool_t), obj9);
+ SWIG_arg_fail(svn_argnum_obj9);
+ SWIG_fail;
+ }
+ }
+ {
+ svn_swig_py_release_py_lock();
+
+ result = (svn_error_t *)svn_wc_revert5(arg1,(char const *)arg2,arg3,arg4,(apr_array_header_t const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+ svn_swig_py_acquire_py_lock();
+
+ }
+ {
+ if (result != NULL) {
+ if (result->apr_err != SVN_ERR_SWIG_PY_EXCEPTION_SET)
+ svn_swig_py_svn_exception(result);
+ else
+ svn_error_clear(result);
+ SWIG_fail;
+ }
+ Py_INCREF(Py_None);
+ resultobj = Py_None;
+ }
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return resultobj;
+fail:
+ {
+ Py_XDECREF(_global_py_pool);
+ }
+ return NULL;
+}
+
+
SWIGINTERN PyObject *_wrap_svn_wc_revert4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
@@ -31491,7 +31022,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert4(PyObject *SWIGUNUSEDPARM(self), PyObje
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_wc_revert4",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31509,17 +31040,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert4(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
if (obj7) {
@@ -31590,7 +31121,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert3(PyObject *SWIGUNUSEDPARM(self), PyObje
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOOO|O:svn_wc_revert3",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31608,17 +31139,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert3(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
if (obj7) {
@@ -31687,7 +31218,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert2(PyObject *SWIGUNUSEDPARM(self), PyObje
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_wc_revert2",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31705,11 +31236,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert2(PyObject *SWIGUNUSEDPARM(self), PyObje
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg8 = obj5;
}
if (obj6) {
@@ -31778,7 +31309,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert(PyObject *SWIGUNUSEDPARM(self), PyObjec
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOOOOO|O:svn_wc_revert",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31796,11 +31327,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_revert(PyObject *SWIGUNUSEDPARM(self), PyObjec
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj4; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj4;
}
{
- arg7 = svn_swig_py_notify_func;
+ arg7 = (svn_wc_notify_func_t) svn_swig_py_notify_func;
arg8 = obj5;
}
if (obj6) {
@@ -31861,7 +31392,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_restore(PyObject *SWIGUNUSEDPARM(self), PyObje
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_restore",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -31967,7 +31498,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_create_tmp_file2(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -32050,7 +31581,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_create_tmp_file(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_apr_file_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_apr_file_t,
_global_py_pool, args))
;
@@ -32090,7 +31621,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_translated_file2(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOO|O:svn_wc_translated_file2",&arg2,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32175,7 +31706,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_translated_file(PyObject *SWIGUNUSEDPARM(self)
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_wc_translated_file",&arg2,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32261,7 +31792,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_translated_stream(PyObject *SWIGUNUSEDPARM(sel
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"ssOO|O:svn_wc_translated_stream",&arg2,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32300,7 +31831,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_translated_stream(PyObject *SWIGUNUSEDPARM(sel
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_stream_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_stream_t,
_global_py_pool, args))
;
@@ -32352,7 +31883,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas3(PyObject *SWIGUNUSEDPARM
arg2 = &temp2;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|OO:svn_wc_transmit_text_deltas3",&obj0,&arg4,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg3 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg3 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32364,7 +31895,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas3(PyObject *SWIGUNUSEDPARM
}
}
{
- arg6 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
+ arg6 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32477,7 +32008,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas2(PyObject *SWIGUNUSEDPARM
arg2 = temp2;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_wc_transmit_text_deltas2",&arg3,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg4 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg4 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32489,7 +32020,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas2(PyObject *SWIGUNUSEDPARM
}
}
{
- arg6 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
+ arg6 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32583,7 +32114,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas(PyObject *SWIGUNUSEDPARM(
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_wc_transmit_text_deltas",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32595,7 +32126,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_text_deltas(PyObject *SWIGUNUSEDPARM(
}
}
{
- arg4 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
+ arg4 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32681,13 +32212,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_prop_deltas2(PyObject *SWIGUNUSEDPARM
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_transmit_prop_deltas2",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj2);
+ arg3 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32765,19 +32296,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_transmit_prop_deltas(PyObject *SWIGUNUSEDPARM(
arg6 = &temp6;
if (!PyArg_ParseTuple(args,(char *)"sOOOO|O:svn_wc_transmit_prop_deltas",&arg1,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_delta_editor_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
+ arg4 = (svn_delta_editor_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_delta_editor_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -32943,7 +32474,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_ignores2(PyObject *SWIGUNUSEDPARM(self), P
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsO|OO:svn_wc_get_ignores2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33051,7 +32582,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_ignores(PyObject *SWIGUNUSEDPARM(self), Py
SWIG_fail;
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33171,13 +32702,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_lock2(PyObject *SWIGUNUSEDPARM(self), PyOb
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_add_lock2",&obj0,&arg2,&obj2,&obj3)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_lock_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_lock_t, svn_argnum_obj2);
+ arg3 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_lock_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33240,13 +32771,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_add_lock(PyObject *SWIGUNUSEDPARM(self), PyObj
arg4 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sOO|O:svn_wc_add_lock",&arg1,&obj1,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_lock_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
+ arg2 = (svn_lock_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_lock_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33307,7 +32838,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_lock2(PyObject *SWIGUNUSEDPARM(self), P
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"Os|O:svn_wc_remove_lock2",&obj0,&arg2,&obj2)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33368,7 +32899,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_remove_lock(PyObject *SWIGUNUSEDPARM(self), Py
arg3 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"sO|O:svn_wc_remove_lock",&arg1,&obj1,&obj2)) SWIG_fail;
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33421,7 +32952,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_min_rev_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_revision_status_t_min_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33448,7 +32979,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_min_rev_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_revision_status_t_min_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33470,7 +33001,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_max_rev_set(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_revision_status_t_max_rev_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33497,7 +33028,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_max_rev_get(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_revision_status_t_max_rev_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33519,7 +33050,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_switched_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_revision_status_t_switched_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33546,7 +33077,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_switched_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_revision_status_t_switched_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33568,7 +33099,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_modified_set(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_revision_status_t_modified_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33595,7 +33126,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_modified_get(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_revision_status_t_modified_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33617,7 +33148,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_sparse_checkout_set(PyObject
if (!PyArg_ParseTuple(args,(char *)"OO:svn_wc_revision_status_t_sparse_checkout_set",&obj0,&obj1)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33644,7 +33175,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status_t_sparse_checkout_get(PyObject
if (!PyArg_ParseTuple(args,(char *)"O:svn_wc_revision_status_t_sparse_checkout_get",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33670,7 +33201,7 @@ SWIGINTERN PyObject *_wrap_new_svn_wc_revision_status_t(PyObject *SWIGUNUSEDPARM
svn_swig_py_acquire_py_lock();
}
- resultobj = svn_swig_NewPointerObj((void*)(result), SWIGTYPE_p_svn_wc_revision_status_t,
+ resultobj = svn_swig_py_new_pointer_obj((void*)(result), SWIGTYPE_p_svn_wc_revision_status_t,
_global_py_pool, args);
return resultobj;
fail:
@@ -33685,7 +33216,7 @@ SWIGINTERN PyObject *_wrap_delete_svn_wc_revision_status_t(PyObject *SWIGUNUSEDP
if (!PyArg_ParseTuple(args,(char *)"O:delete_svn_wc_revision_status_t",&obj0)) SWIG_fail;
{
- arg1 = (struct svn_wc_revision_status_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
+ arg1 = (struct svn_wc_revision_status_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_revision_status_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33744,7 +33275,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status2(PyObject *SWIGUNUSEDPARM(self
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OszOO|OO:svn_wc_revision_status2",&obj0,&arg3,&arg4,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33756,8 +33287,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status2(PyObject *SWIGUNUSEDPARM(self
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj4; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -33795,7 +33326,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status2(PyObject *SWIGUNUSEDPARM(self
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_revision_status_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_revision_status_t,
_global_py_pool, args))
;
@@ -33848,8 +33379,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg5 = svn_swig_py_cancel_func;
- arg6 = obj3; /* our function is the baton. */
+ arg5 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg6 = obj3;
}
if (obj4) {
/* Verify that the user supplied a valid pool */
@@ -33879,7 +33410,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_revision_status(PyObject *SWIGUNUSEDPARM(self)
resultobj = Py_None;
}
{
- resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_NewPointerObj(*arg1, SWIGTYPE_p_svn_wc_revision_status_t,
+ resultobj = SWIG_Python_AppendOutput(resultobj, svn_swig_py_new_pointer_obj(*arg1, SWIGTYPE_p_svn_wc_revision_status_t,
_global_py_pool, args))
;
@@ -33924,7 +33455,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_set_changelist2(PyObject *SWIGUNUSEDPARM(self)
arg10 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OssOOOO|O:svn_wc_set_changelist2",&obj0,&arg2,&arg3,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -33936,17 +33467,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_set_changelist2(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj5; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj5;
}
{
- arg8 = svn_swig_py_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg9 = obj6;
}
if (obj7) {
@@ -34012,17 +33543,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_set_changelist(PyObject *SWIGUNUSEDPARM(self),
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"ssOOO|O:svn_wc_set_changelist",&arg1,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg3 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
+ arg3 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj4;
}
if (obj5) {
@@ -34092,7 +33623,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_changelists(PyObject *SWIGUNUSEDPARM(self)
arg9 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOOOO|O:svn_wc_get_changelists",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34104,14 +33635,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_changelists(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg4 = (apr_array_header_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj3);
+ arg4 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
svn_changelist_receiver_t * tmp =
- svn_swig_MustGetPtr(obj4, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj4);
+ svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj4);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -34126,8 +33657,8 @@ SWIGINTERN PyObject *_wrap_svn_wc_get_changelists(PyObject *SWIGUNUSEDPARM(self)
}
}
{
- arg7 = svn_swig_py_cancel_func;
- arg8 = obj6; /* our function is the baton. */
+ arg7 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg8 = obj6;
}
if (obj7) {
/* Verify that the user supplied a valid pool */
@@ -34193,7 +33724,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_crop_tree2(PyObject *SWIGUNUSEDPARM(self), PyO
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_crop_tree2",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34205,11 +33736,11 @@ SWIGINTERN PyObject *_wrap_svn_wc_crop_tree2(PyObject *SWIGUNUSEDPARM(self), PyO
}
}
{
- arg4 = svn_swig_py_cancel_func;
- arg5 = obj3; /* our function is the baton. */
+ arg4 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg5 = obj3;
}
{
- arg6 = svn_swig_py_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg7 = obj4;
}
if (obj5) {
@@ -34276,7 +33807,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_crop_tree(PyObject *SWIGUNUSEDPARM(self), PyOb
arg8 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOOO|O:svn_wc_crop_tree",&obj0,&arg2,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
+ arg1 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34288,12 +33819,12 @@ SWIGINTERN PyObject *_wrap_svn_wc_crop_tree(PyObject *SWIGUNUSEDPARM(self), PyOb
}
}
{
- arg4 = svn_swig_py_notify_func2;
+ arg4 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg5 = obj3;
}
{
- arg6 = svn_swig_py_cancel_func;
- arg7 = obj4; /* our function is the baton. */
+ arg6 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg7 = obj4;
}
if (obj5) {
/* Verify that the user supplied a valid pool */
@@ -34357,17 +33888,17 @@ SWIGINTERN PyObject *_wrap_svn_wc_exclude(PyObject *SWIGUNUSEDPARM(self), PyObje
arg7 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_exclude",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg1 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = svn_swig_py_cancel_func;
- arg4 = obj2; /* our function is the baton. */
+ arg3 = (svn_cancel_func_t) svn_swig_py_cancel_func;
+ arg4 = obj2;
}
{
- arg5 = svn_swig_py_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_py_notify_func2;
arg6 = obj3;
}
if (obj4) {
@@ -34434,7 +33965,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_read_kind2(PyObject *SWIGUNUSEDPARM(self), PyO
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_read_kind2",&obj0,&arg3,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34519,7 +34050,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_read_kind(PyObject *SWIGUNUSEDPARM(self), PyOb
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)"OsO|O:svn_wc_read_kind",&obj0,&arg3,&obj2,&obj3)) SWIG_fail;
{
- arg2 = (svn_wc_context_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
+ arg2 = (svn_wc_context_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_context_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34632,7 +34163,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_opened(PyObject *S
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_diff_callbacks4_invoke_file_opened",&obj0,&arg4,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34741,19 +34272,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_changed(PyObject *
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsssOOssOOO|O:svn_wc_diff_callbacks4_invoke_file_changed",&obj0,&obj1,&obj2,&arg5,&arg6,&arg7,&obj6,&obj7,&arg10,&arg11,&obj10,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34771,13 +34302,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_changed(PyObject *
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj10, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj10);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg13 = (apr_hash_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_hash_t, svn_argnum_obj11);
+ arg13 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_hash_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34877,19 +34408,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_added(PyObject *SW
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsssOOsszOOOO|O:svn_wc_diff_callbacks4_invoke_file_added",&obj0,&obj1,&obj2,&arg5,&arg6,&arg7,&obj6,&obj7,&arg10,&arg11,&arg12,&obj11,&obj12,&obj13,&obj14,&obj15)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -34913,13 +34444,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_added(PyObject *SW
}
}
{
- arg14 = (apr_array_header_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
+ arg14 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg15 = (apr_hash_t *)svn_swig_MustGetPtr(obj13, SWIGTYPE_p_apr_hash_t, svn_argnum_obj13);
+ arg15 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj13, SWIGTYPE_p_apr_hash_t, svn_argnum_obj13);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35008,19 +34539,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_file_deleted(PyObject *
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsssssOO|O:svn_wc_diff_callbacks4_invoke_file_deleted",&obj0,&obj1,&arg4,&arg5,&arg6,&arg7,&arg8,&obj7,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg9 = (apr_hash_t *)svn_swig_MustGetPtr(obj7, SWIGTYPE_p_apr_hash_t, svn_argnum_obj7);
+ arg9 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj7, SWIGTYPE_p_apr_hash_t, svn_argnum_obj7);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35103,13 +34634,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_deleted(PyObject *S
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_wc_diff_callbacks4_invoke_dir_deleted",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35200,7 +34731,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_opened(PyObject *SW
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_diff_callbacks4_invoke_dir_opened",&obj0,&arg5,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35314,13 +34845,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_added(PyObject *SWI
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOsOzOO|O:svn_wc_diff_callbacks4_invoke_dir_added",&obj0,&obj1,&arg6,&obj3,&arg8,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35433,13 +34964,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_props_changed(PyObj
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOOOO|O:svn_wc_diff_callbacks4_invoke_dir_props_changed",&obj0,&obj1,&arg4,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35451,13 +34982,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_props_changed(PyObj
}
}
{
- arg6 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg6 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg7 = (apr_hash_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
+ arg7 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35544,19 +35075,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks4_invoke_dir_closed(PyObject *SW
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOO|O:svn_wc_diff_callbacks4_invoke_dir_closed",&obj0,&obj1,&obj2,&arg5,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks4_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks4_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
+ arg2 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35653,25 +35184,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_file_changed(PyObject *
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOOsssOOssOOO:svn_wc_diff_callbacks3_invoke_file_changed",&obj0,&obj1,&obj2,&obj3,&arg6,&arg7,&arg8,&obj7,&obj8,&arg11,&arg12,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
+ arg4 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35689,13 +35220,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_file_changed(PyObject *
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (apr_hash_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
+ arg14 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35772,25 +35303,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_file_added(PyObject *SW
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOOsssOOssOOO:svn_wc_diff_callbacks3_invoke_file_added",&obj0,&obj1,&obj2,&obj3,&arg6,&arg7,&arg8,&obj7,&obj8,&arg11,&arg12,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
+ arg4 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35808,13 +35339,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_file_added(PyObject *SW
}
}
{
- arg13 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg13 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg14 = (apr_hash_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
+ arg14 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35883,25 +35414,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_file_deleted(PyObject *
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsssssOO:svn_wc_diff_callbacks3_invoke_file_deleted",&obj0,&obj1,&obj2,&arg5,&arg6,&arg7,&arg8,&arg9,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg10 = (apr_hash_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
+ arg10 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -35966,19 +35497,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_dir_added(PyObject *SWI
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOO:svn_wc_diff_callbacks3_invoke_dir_added",&obj0,&obj1,&obj2,&arg5,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36047,19 +35578,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_dir_deleted(PyObject *S
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsO:svn_wc_diff_callbacks3_invoke_dir_deleted",&obj0,&obj1,&obj2,&arg5,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36126,31 +35657,31 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_dir_props_changed(PyObj
arg4 = &temp4;
if (!PyArg_ParseTuple(args,(char *)"OOOsOOO:svn_wc_diff_callbacks3_invoke_dir_props_changed",&obj0,&obj1,&obj2,&arg5,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg6 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg7 = (apr_hash_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
+ arg7 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36213,13 +35744,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_dir_opened(PyObject *SW
arg3 = &temp3;
if (!PyArg_ParseTuple(args,(char *)"OOsOO:svn_wc_diff_callbacks3_invoke_dir_opened",&obj0,&obj1,&arg4,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36290,25 +35821,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks3_invoke_dir_closed(PyObject *SW
arg5 = &temp5;
if (!PyArg_ParseTuple(args,(char *)"OOOOsO:svn_wc_diff_callbacks3_invoke_dir_closed",&obj0,&obj1,&obj2,&obj3,&arg6,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks3_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks3_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
+ arg4 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36381,25 +35912,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_file_changed(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OOOOsssOOssOOO:svn_wc_diff_callbacks2_invoke_file_changed",&obj0,&obj1,&obj2,&obj3,&arg5,&arg6,&arg7,&obj7,&obj8,&arg10,&arg11,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
+ arg4 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36417,13 +35948,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_file_changed(PyObject *
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg13 = (apr_hash_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
+ arg13 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36490,25 +36021,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_file_added(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OOOOsssOOssOOO:svn_wc_diff_callbacks2_invoke_file_added",&obj0,&obj1,&obj2,&obj3,&arg5,&arg6,&arg7,&obj7,&obj8,&arg10,&arg11,&obj11,&obj12,&obj13)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg4 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
+ arg4 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36526,13 +36057,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_file_added(PyObject *SW
}
}
{
- arg12 = (apr_array_header_t *)svn_swig_MustGetPtr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
+ arg12 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj11, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj11);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg13 = (apr_hash_t *)svn_swig_MustGetPtr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
+ arg13 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj12, SWIGTYPE_p_apr_hash_t, svn_argnum_obj12);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36591,25 +36122,25 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_file_deleted(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OOOsssssOO:svn_wc_diff_callbacks2_invoke_file_deleted",&obj0,&obj1,&obj2,&arg4,&arg5,&arg6,&arg7,&arg8,&obj8,&obj9)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg9 = (apr_hash_t *)svn_swig_MustGetPtr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
+ arg9 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj8, SWIGTYPE_p_apr_hash_t, svn_argnum_obj8);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36664,19 +36195,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_dir_added(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OOOsOO:svn_wc_diff_callbacks2_invoke_dir_added",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36735,19 +36266,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_dir_deleted(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OOOsO:svn_wc_diff_callbacks2_invoke_dir_deleted",&obj0,&obj1,&obj2,&arg4,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36804,31 +36335,31 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks2_invoke_dir_props_changed(PyObj
if (!PyArg_ParseTuple(args,(char *)"OOOsOOO:svn_wc_diff_callbacks2_invoke_dir_props_changed",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (apr_hash_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
+ arg6 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36889,19 +36420,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_file_changed(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OOOsssOOssO:svn_wc_diff_callbacks_invoke_file_changed",&obj0,&obj1,&obj2,&arg4,&arg5,&arg6,&obj6,&obj7,&arg9,&arg10,&obj10)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -36974,19 +36505,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_file_added(PyObject *SWI
if (!PyArg_ParseTuple(args,(char *)"OOOsssOOssO:svn_wc_diff_callbacks_invoke_file_added",&obj0,&obj1,&obj2,&arg4,&arg5,&arg6,&obj6,&obj7,&arg9,&arg10,&obj10)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37055,19 +36586,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_file_deleted(PyObject *S
if (!PyArg_ParseTuple(args,(char *)"OOOsssssO:svn_wc_diff_callbacks_invoke_file_deleted",&obj0,&obj1,&obj2,&arg4,&arg5,&arg6,&arg7,&arg8,&obj8)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37122,19 +36653,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_dir_added(PyObject *SWIG
if (!PyArg_ParseTuple(args,(char *)"OOOsOO:svn_wc_diff_callbacks_invoke_dir_added",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37193,19 +36724,19 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_dir_deleted(PyObject *SW
if (!PyArg_ParseTuple(args,(char *)"OOOsO:svn_wc_diff_callbacks_invoke_dir_deleted",&obj0,&obj1,&obj2,&arg4,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37262,31 +36793,31 @@ SWIGINTERN PyObject *_wrap_svn_wc_diff_callbacks_invoke_props_changed(PyObject *
if (!PyArg_ParseTuple(args,(char *)"OOOsOOO:svn_wc_diff_callbacks_invoke_props_changed",&obj0,&obj1,&obj2,&arg4,&obj4,&obj5,&obj6)) SWIG_fail;
{
- arg1 = (svn_wc_diff_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_diff_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_diff_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg2 = (svn_wc_adm_access_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
+ arg2 = (svn_wc_adm_access_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_adm_access_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_notify_state_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_state_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_state_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg5 = (apr_array_header_t *)svn_swig_MustGetPtr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
+ arg5 = (apr_array_header_t *)svn_swig_py_must_get_ptr(obj4, SWIGTYPE_p_apr_array_header_t, svn_argnum_obj4);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg6 = (apr_hash_t *)svn_swig_MustGetPtr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
+ arg6 = (apr_hash_t *)svn_swig_py_must_get_ptr(obj5, SWIGTYPE_p_apr_hash_t, svn_argnum_obj5);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37345,13 +36876,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_invoke_found_entry(PyObject *
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_entry_callbacks2_invoke_found_entry",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37424,13 +36955,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks2_invoke_handle_error(PyObject
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_entry_callbacks2_invoke_handle_error",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_entry_callbacks2_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
+ arg1 = (svn_wc_entry_callbacks2_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks2_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_error_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_error_t, svn_argnum_obj2);
+ arg3 = (svn_error_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_error_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37503,13 +37034,13 @@ SWIGINTERN PyObject *_wrap_svn_wc_entry_callbacks_invoke_found_entry(PyObject *S
arg5 = _global_pool;
if (!PyArg_ParseTuple(args,(char *)"OsOO|O:svn_wc_entry_callbacks_invoke_found_entry",&obj0,&arg2,&obj2,&obj3,&obj4)) SWIG_fail;
{
- arg1 = (svn_wc_entry_callbacks_t *)svn_swig_MustGetPtr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
+ arg1 = (svn_wc_entry_callbacks_t *)svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_svn_wc_entry_callbacks_t, svn_argnum_obj0);
if (PyErr_Occurred()) {
SWIG_fail;
}
}
{
- arg3 = (svn_wc_entry_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
+ arg3 = (svn_wc_entry_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_entry_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37589,7 +37120,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_external_update(PyObject *SWIGUNUSEDPAR
if (!PyArg_ParseTuple(args,(char *)"OOsOOO|O:svn_wc_invoke_external_update",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
{
svn_wc_external_update_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_string_t_p_q_const__svn_string_t_svn_depth_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -37694,7 +37225,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_notify_func2(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_wc_invoke_notify_func2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_wc_notify_func2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -37709,7 +37240,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_notify_func2(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg3 = (svn_wc_notify_t *)svn_swig_MustGetPtr(obj2, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj2);
+ arg3 = (svn_wc_notify_t *)svn_swig_py_must_get_ptr(obj2, SWIGTYPE_p_svn_wc_notify_t, svn_argnum_obj2);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37765,7 +37296,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_notify_func(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOsOOsOOO:svn_wc_invoke_notify_func",&obj0,&obj1,&arg3,&obj3,&obj4,&arg6,&obj6,&obj7,&obj8)) SWIG_fail;
{
svn_wc_notify_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -37854,14 +37385,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_conflict_resolver_func2(PyObject *SWIGU
if (!PyArg_ParseTuple(args,(char *)"OOO|OO:svn_wc_invoke_conflict_resolver_func2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
{
svn_wc_conflict_resolver_func2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg3 = (svn_wc_conflict_description2_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj1);
+ arg3 = (svn_wc_conflict_description2_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_description2_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -37960,14 +37491,14 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_conflict_resolver_func(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_wc_invoke_conflict_resolver_func",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_wc_conflict_resolver_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
arg1 = *tmp;
}
{
- arg3 = (svn_wc_conflict_description_t *)svn_swig_MustGetPtr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
+ arg3 = (svn_wc_conflict_description_t *)svn_swig_py_must_get_ptr(obj1, SWIGTYPE_p_svn_wc_conflict_description_t, svn_argnum_obj1);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -38050,7 +37581,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func4(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_wc_invoke_status_func4",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_wc_status_func4_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__svn_wc_status3_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38065,7 +37596,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func4(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg4 = (svn_wc_status3_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj3);
+ arg4 = (svn_wc_status3_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_status3_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -38131,7 +37662,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func3(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOsO|O:svn_wc_invoke_status_func3",&obj0,&obj1,&arg3,&obj3,&obj4)) SWIG_fail;
{
svn_wc_status_func3_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38146,7 +37677,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func3(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg4 = (svn_wc_status2_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj3);
+ arg4 = (svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -38203,7 +37734,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func2(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_wc_invoke_status_func2",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
svn_wc_status_func2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38218,7 +37749,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func2(PyObject *SWIGUNUSEDPARM(s
}
}
{
- arg4 = (svn_wc_status2_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj3);
+ arg4 = (svn_wc_status2_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_status2_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -38251,7 +37782,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func(PyObject *SWIGUNUSEDPARM(se
if (!PyArg_ParseTuple(args,(char *)"OOsO:svn_wc_invoke_status_func",&obj0,&obj1,&arg3,&obj3)) SWIG_fail;
{
svn_wc_status_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38266,7 +37797,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_status_func(PyObject *SWIGUNUSEDPARM(se
}
}
{
- arg4 = (svn_wc_status_t *)svn_swig_MustGetPtr(obj3, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj3);
+ arg4 = (svn_wc_status_t *)svn_swig_py_must_get_ptr(obj3, SWIGTYPE_p_svn_wc_status_t, svn_argnum_obj3);
if (PyErr_Occurred()) {
SWIG_fail;
}
@@ -38317,7 +37848,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_get_file(PyObject *SWIGUNUSEDPARM(self)
if (!PyArg_ParseTuple(args,(char *)"OOsOO|O:svn_wc_invoke_get_file",&obj0,&obj1,&arg3,&obj3,&obj4,&obj5)) SWIG_fail;
{
svn_wc_get_file_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38418,7 +37949,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_dirents_func(PyObject *SWIGUNUSEDPARM(s
if (!PyArg_ParseTuple(args,(char *)"OOss|OO:svn_wc_invoke_dirents_func",&obj0,&obj1,&arg4,&arg5,&obj4,&obj5)) SWIG_fail;
{
svn_wc_dirents_func_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_p_apr_hash_t_p_q_const__char_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38518,7 +38049,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_canonicalize_svn_prop_get_file(PyObject
if (!PyArg_ParseTuple(args,(char *)"OOO|O:svn_wc_invoke_canonicalize_svn_prop_get_file",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
{
svn_wc_canonicalize_svn_prop_get_file_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_q_const__svn_string_t_p_svn_stream_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_q_const__svn_string_t_p_svn_stream_t_p_void_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38619,7 +38150,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_upgrade_get_repos_info(PyObject *SWIGUN
if (!PyArg_ParseTuple(args,(char *)"OOs|OO:svn_wc_invoke_upgrade_get_repos_info",&obj0,&obj1,&arg5,&obj3,&obj4)) SWIG_fail;
{
svn_wc_upgrade_get_repos_info_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_void_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_p_q_const__char_p_p_q_const__char_p_void_p_q_const__char_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38734,7 +38265,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_relocation_validator3(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OOzss|O:svn_wc_invoke_relocation_validator3",&obj0,&obj1,&arg3,&arg4,&arg5,&obj5)) SWIG_fail;
{
svn_wc_relocation_validator3_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38810,7 +38341,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_relocation_validator2(PyObject *SWIGUNU
if (!PyArg_ParseTuple(args,(char *)"OOzsO|O:svn_wc_invoke_relocation_validator2",&obj0,&obj1,&arg3,&arg4,&obj4,&obj5)) SWIG_fail;
{
svn_wc_relocation_validator2_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38882,7 +38413,7 @@ SWIGINTERN PyObject *_wrap_svn_wc_invoke_relocation_validator(PyObject *SWIGUNUS
if (!PyArg_ParseTuple(args,(char *)"OOzs:svn_wc_invoke_relocation_validator",&obj0,&obj1,&arg3,&arg4)) SWIG_fail;
{
svn_wc_relocation_validator_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -38942,7 +38473,7 @@ SWIGINTERN PyObject *_wrap_svn_changelist_invoke_receiver(PyObject *SWIGUNUSEDPA
if (!PyArg_ParseTuple(args,(char *)"OOss|O:svn_changelist_invoke_receiver",&obj0,&obj1,&arg3,&arg4,&obj4)) SWIG_fail;
{
svn_changelist_receiver_t * tmp =
- svn_swig_MustGetPtr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
+ svn_swig_py_must_get_ptr(obj0, SWIGTYPE_p_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, svn_argnum_obj0);
if (tmp == NULL || PyErr_Occurred()) {
SWIG_fail;
}
@@ -39251,7 +38782,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_wc_external_item_t_swigregister", svn_wc_external_item_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_wc_external_item_dup", _wrap_svn_wc_external_item_dup, METH_VARARGS, (char *)"svn_wc_external_item_dup(svn_wc_external_item_t item, apr_pool_t pool) -> svn_wc_external_item_t"},
{ (char *)"svn_wc_parse_externals_description3", _wrap_svn_wc_parse_externals_description3, METH_VARARGS, (char *)"\n"
- "svn_wc_parse_externals_description3(char const * parent_directory, char const * desc, svn_boolean_t canonicalize_url, \n"
+ "svn_wc_parse_externals_description3(char const * defining_directory, char const * desc, svn_boolean_t canonicalize_url, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_wc_parse_externals_description2", _wrap_svn_wc_parse_externals_description2, METH_VARARGS, (char *)"svn_wc_parse_externals_description2(char const * parent_directory, char const * desc, apr_pool_t pool) -> svn_error_t"},
@@ -39330,39 +38861,6 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_wc_conflict_version_t\n"
""},
{ (char *)"svn_wc_conflict_version_dup", _wrap_svn_wc_conflict_version_dup, METH_VARARGS, (char *)"svn_wc_conflict_version_dup(svn_wc_conflict_version_t version, apr_pool_t pool) -> svn_wc_conflict_version_t"},
- { (char *)"svn_wc_conflict_description2_t_local_abspath_set", _wrap_svn_wc_conflict_description2_t_local_abspath_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_local_abspath_set(svn_wc_conflict_description2_t self, char const * local_abspath)"},
- { (char *)"svn_wc_conflict_description2_t_local_abspath_get", _wrap_svn_wc_conflict_description2_t_local_abspath_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_local_abspath_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_node_kind_set", _wrap_svn_wc_conflict_description2_t_node_kind_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_node_kind_set(svn_wc_conflict_description2_t self, svn_node_kind_t node_kind)"},
- { (char *)"svn_wc_conflict_description2_t_node_kind_get", _wrap_svn_wc_conflict_description2_t_node_kind_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_node_kind_get(svn_wc_conflict_description2_t self) -> svn_node_kind_t"},
- { (char *)"svn_wc_conflict_description2_t_kind_set", _wrap_svn_wc_conflict_description2_t_kind_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_kind_set(svn_wc_conflict_description2_t self, svn_wc_conflict_kind_t kind)"},
- { (char *)"svn_wc_conflict_description2_t_kind_get", _wrap_svn_wc_conflict_description2_t_kind_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_kind_get(svn_wc_conflict_description2_t self) -> svn_wc_conflict_kind_t"},
- { (char *)"svn_wc_conflict_description2_t_property_name_set", _wrap_svn_wc_conflict_description2_t_property_name_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_property_name_set(svn_wc_conflict_description2_t self, char const * property_name)"},
- { (char *)"svn_wc_conflict_description2_t_property_name_get", _wrap_svn_wc_conflict_description2_t_property_name_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_property_name_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_is_binary_set", _wrap_svn_wc_conflict_description2_t_is_binary_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_is_binary_set(svn_wc_conflict_description2_t self, svn_boolean_t is_binary)"},
- { (char *)"svn_wc_conflict_description2_t_is_binary_get", _wrap_svn_wc_conflict_description2_t_is_binary_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_is_binary_get(svn_wc_conflict_description2_t self) -> svn_boolean_t"},
- { (char *)"svn_wc_conflict_description2_t_mime_type_set", _wrap_svn_wc_conflict_description2_t_mime_type_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_mime_type_set(svn_wc_conflict_description2_t self, char const * mime_type)"},
- { (char *)"svn_wc_conflict_description2_t_mime_type_get", _wrap_svn_wc_conflict_description2_t_mime_type_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_mime_type_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_action_set", _wrap_svn_wc_conflict_description2_t_action_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_action_set(svn_wc_conflict_description2_t self, svn_wc_conflict_action_t action)"},
- { (char *)"svn_wc_conflict_description2_t_action_get", _wrap_svn_wc_conflict_description2_t_action_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_action_get(svn_wc_conflict_description2_t self) -> svn_wc_conflict_action_t"},
- { (char *)"svn_wc_conflict_description2_t_reason_set", _wrap_svn_wc_conflict_description2_t_reason_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_reason_set(svn_wc_conflict_description2_t self, svn_wc_conflict_reason_t reason)"},
- { (char *)"svn_wc_conflict_description2_t_reason_get", _wrap_svn_wc_conflict_description2_t_reason_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_reason_get(svn_wc_conflict_description2_t self) -> svn_wc_conflict_reason_t"},
- { (char *)"svn_wc_conflict_description2_t_base_abspath_set", _wrap_svn_wc_conflict_description2_t_base_abspath_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_base_abspath_set(svn_wc_conflict_description2_t self, char const * base_abspath)"},
- { (char *)"svn_wc_conflict_description2_t_base_abspath_get", _wrap_svn_wc_conflict_description2_t_base_abspath_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_base_abspath_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_their_abspath_set", _wrap_svn_wc_conflict_description2_t_their_abspath_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_their_abspath_set(svn_wc_conflict_description2_t self, char const * their_abspath)"},
- { (char *)"svn_wc_conflict_description2_t_their_abspath_get", _wrap_svn_wc_conflict_description2_t_their_abspath_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_their_abspath_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_my_abspath_set", _wrap_svn_wc_conflict_description2_t_my_abspath_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_my_abspath_set(svn_wc_conflict_description2_t self, char const * my_abspath)"},
- { (char *)"svn_wc_conflict_description2_t_my_abspath_get", _wrap_svn_wc_conflict_description2_t_my_abspath_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_my_abspath_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_merged_file_set", _wrap_svn_wc_conflict_description2_t_merged_file_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_merged_file_set(svn_wc_conflict_description2_t self, char const * merged_file)"},
- { (char *)"svn_wc_conflict_description2_t_merged_file_get", _wrap_svn_wc_conflict_description2_t_merged_file_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_merged_file_get(svn_wc_conflict_description2_t self) -> char const *"},
- { (char *)"svn_wc_conflict_description2_t_operation_set", _wrap_svn_wc_conflict_description2_t_operation_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_operation_set(svn_wc_conflict_description2_t self, svn_wc_operation_t operation)"},
- { (char *)"svn_wc_conflict_description2_t_operation_get", _wrap_svn_wc_conflict_description2_t_operation_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_operation_get(svn_wc_conflict_description2_t self) -> svn_wc_operation_t"},
- { (char *)"svn_wc_conflict_description2_t_src_left_version_set", _wrap_svn_wc_conflict_description2_t_src_left_version_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_src_left_version_set(svn_wc_conflict_description2_t self, svn_wc_conflict_version_t src_left_version)"},
- { (char *)"svn_wc_conflict_description2_t_src_left_version_get", _wrap_svn_wc_conflict_description2_t_src_left_version_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_src_left_version_get(svn_wc_conflict_description2_t self) -> svn_wc_conflict_version_t"},
- { (char *)"svn_wc_conflict_description2_t_src_right_version_set", _wrap_svn_wc_conflict_description2_t_src_right_version_set, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_src_right_version_set(svn_wc_conflict_description2_t self, svn_wc_conflict_version_t src_right_version)"},
- { (char *)"svn_wc_conflict_description2_t_src_right_version_get", _wrap_svn_wc_conflict_description2_t_src_right_version_get, METH_VARARGS, (char *)"svn_wc_conflict_description2_t_src_right_version_get(svn_wc_conflict_description2_t self) -> svn_wc_conflict_version_t"},
- { (char *)"new_svn_wc_conflict_description2_t", _wrap_new_svn_wc_conflict_description2_t, METH_VARARGS, (char *)"new_svn_wc_conflict_description2_t() -> svn_wc_conflict_description2_t"},
- { (char *)"delete_svn_wc_conflict_description2_t", _wrap_delete_svn_wc_conflict_description2_t, METH_VARARGS, (char *)"delete_svn_wc_conflict_description2_t(svn_wc_conflict_description2_t self)"},
- { (char *)"svn_wc_conflict_description2_t_swigregister", svn_wc_conflict_description2_t_swigregister, METH_VARARGS, NULL},
{ (char *)"svn_wc_conflict_description_t_path_set", _wrap_svn_wc_conflict_description_t_path_set, METH_VARARGS, (char *)"svn_wc_conflict_description_t_path_set(svn_wc_conflict_description_t self, char const * path)"},
{ (char *)"svn_wc_conflict_description_t_path_get", _wrap_svn_wc_conflict_description_t_path_get, METH_VARARGS, (char *)"svn_wc_conflict_description_t_path_get(svn_wc_conflict_description_t self) -> char const *"},
{ (char *)"svn_wc_conflict_description_t_node_kind_set", _wrap_svn_wc_conflict_description_t_node_kind_set, METH_VARARGS, (char *)"svn_wc_conflict_description_t_node_kind_set(svn_wc_conflict_description_t self, svn_node_kind_t node_kind)"},
@@ -39398,11 +38896,11 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"new_svn_wc_conflict_description_t", _wrap_new_svn_wc_conflict_description_t, METH_VARARGS, (char *)"new_svn_wc_conflict_description_t() -> svn_wc_conflict_description_t"},
{ (char *)"delete_svn_wc_conflict_description_t", _wrap_delete_svn_wc_conflict_description_t, METH_VARARGS, (char *)"delete_svn_wc_conflict_description_t(svn_wc_conflict_description_t self)"},
{ (char *)"svn_wc_conflict_description_t_swigregister", svn_wc_conflict_description_t_swigregister, METH_VARARGS, NULL},
- { (char *)"svn_wc_conflict_description_create_text2", _wrap_svn_wc_conflict_description_create_text2, METH_VARARGS, (char *)"svn_wc_conflict_description_create_text2(char const * local_abspath, apr_pool_t result_pool) -> svn_wc_conflict_description2_t"},
+ { (char *)"svn_wc_conflict_description_create_text2", _wrap_svn_wc_conflict_description_create_text2, METH_VARARGS, (char *)"svn_wc_conflict_description_create_text2(char const * local_abspath, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"},
{ (char *)"svn_wc_conflict_description_create_text", _wrap_svn_wc_conflict_description_create_text, METH_VARARGS, (char *)"svn_wc_conflict_description_create_text(char const * path, svn_wc_adm_access_t * adm_access, apr_pool_t pool) -> svn_wc_conflict_description_t"},
{ (char *)"svn_wc_conflict_description_create_prop2", _wrap_svn_wc_conflict_description_create_prop2, METH_VARARGS, (char *)"\n"
"svn_wc_conflict_description_create_prop2(char const * local_abspath, svn_node_kind_t node_kind, char const * property_name, \n"
- " apr_pool_t result_pool) -> svn_wc_conflict_description2_t\n"
+ " apr_pool_t result_pool) -> svn_wc_conflict_description2_t *\n"
""},
{ (char *)"svn_wc_conflict_description_create_prop", _wrap_svn_wc_conflict_description_create_prop, METH_VARARGS, (char *)"\n"
"svn_wc_conflict_description_create_prop(char const * path, svn_wc_adm_access_t * adm_access, svn_node_kind_t node_kind, char const * property_name, \n"
@@ -39411,24 +38909,16 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_wc_conflict_description_create_tree2", _wrap_svn_wc_conflict_description_create_tree2, METH_VARARGS, (char *)"\n"
"svn_wc_conflict_description_create_tree2(char const * local_abspath, svn_node_kind_t node_kind, svn_wc_operation_t operation, \n"
" svn_wc_conflict_version_t src_left_version, svn_wc_conflict_version_t src_right_version, \n"
- " apr_pool_t result_pool) -> svn_wc_conflict_description2_t\n"
+ " apr_pool_t result_pool) -> svn_wc_conflict_description2_t *\n"
""},
{ (char *)"svn_wc_conflict_description_create_tree", _wrap_svn_wc_conflict_description_create_tree, METH_VARARGS, (char *)"\n"
"svn_wc_conflict_description_create_tree(char const * path, svn_wc_adm_access_t * adm_access, svn_node_kind_t node_kind, svn_wc_operation_t operation, \n"
" svn_wc_conflict_version_t src_left_version, svn_wc_conflict_version_t src_right_version, \n"
" apr_pool_t pool) -> svn_wc_conflict_description_t\n"
""},
- { (char *)"svn_wc__conflict_description2_dup", _wrap_svn_wc__conflict_description2_dup, METH_VARARGS, (char *)"svn_wc__conflict_description2_dup(svn_wc_conflict_description2_t conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t"},
- { (char *)"svn_wc_conflict_result_t_choice_set", _wrap_svn_wc_conflict_result_t_choice_set, METH_VARARGS, (char *)"svn_wc_conflict_result_t_choice_set(svn_wc_conflict_result_t self, svn_wc_conflict_choice_t choice)"},
- { (char *)"svn_wc_conflict_result_t_choice_get", _wrap_svn_wc_conflict_result_t_choice_get, METH_VARARGS, (char *)"svn_wc_conflict_result_t_choice_get(svn_wc_conflict_result_t self) -> svn_wc_conflict_choice_t"},
- { (char *)"svn_wc_conflict_result_t_merged_file_set", _wrap_svn_wc_conflict_result_t_merged_file_set, METH_VARARGS, (char *)"svn_wc_conflict_result_t_merged_file_set(svn_wc_conflict_result_t self, char const * merged_file)"},
- { (char *)"svn_wc_conflict_result_t_merged_file_get", _wrap_svn_wc_conflict_result_t_merged_file_get, METH_VARARGS, (char *)"svn_wc_conflict_result_t_merged_file_get(svn_wc_conflict_result_t self) -> char const *"},
- { (char *)"svn_wc_conflict_result_t_save_merged_set", _wrap_svn_wc_conflict_result_t_save_merged_set, METH_VARARGS, (char *)"svn_wc_conflict_result_t_save_merged_set(svn_wc_conflict_result_t self, svn_boolean_t save_merged)"},
- { (char *)"svn_wc_conflict_result_t_save_merged_get", _wrap_svn_wc_conflict_result_t_save_merged_get, METH_VARARGS, (char *)"svn_wc_conflict_result_t_save_merged_get(svn_wc_conflict_result_t self) -> svn_boolean_t"},
- { (char *)"new_svn_wc_conflict_result_t", _wrap_new_svn_wc_conflict_result_t, METH_VARARGS, (char *)"new_svn_wc_conflict_result_t() -> svn_wc_conflict_result_t"},
- { (char *)"delete_svn_wc_conflict_result_t", _wrap_delete_svn_wc_conflict_result_t, METH_VARARGS, (char *)"delete_svn_wc_conflict_result_t(svn_wc_conflict_result_t self)"},
- { (char *)"svn_wc_conflict_result_t_swigregister", svn_wc_conflict_result_t_swigregister, METH_VARARGS, NULL},
- { (char *)"svn_wc_create_conflict_result", _wrap_svn_wc_create_conflict_result, METH_VARARGS, (char *)"svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice, char const * merged_file, apr_pool_t pool) -> svn_wc_conflict_result_t"},
+ { (char *)"svn_wc_conflict_description2_dup", _wrap_svn_wc_conflict_description2_dup, METH_VARARGS, (char *)"svn_wc_conflict_description2_dup(svn_wc_conflict_description2_t const * conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"},
+ { (char *)"svn_wc__conflict_description2_dup", _wrap_svn_wc__conflict_description2_dup, METH_VARARGS, (char *)"svn_wc__conflict_description2_dup(svn_wc_conflict_description2_t const * conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"},
+ { (char *)"svn_wc_create_conflict_result", _wrap_svn_wc_create_conflict_result, METH_VARARGS, (char *)"svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice, char const * merged_file, apr_pool_t pool) -> svn_wc_conflict_result_t *"},
{ (char *)"svn_wc_diff_callbacks4_t_file_opened_set", _wrap_svn_wc_diff_callbacks4_t_file_opened_set, METH_VARARGS, (char *)"svn_wc_diff_callbacks4_t_file_opened_set(svn_wc_diff_callbacks4_t self, svn_error_t *(*)(svn_boolean_t *,svn_boolean_t *,char const *,svn_revnum_t,void *,apr_pool_t *) file_opened)"},
{ (char *)"svn_wc_diff_callbacks4_t_file_opened_get", _wrap_svn_wc_diff_callbacks4_t_file_opened_get, METH_VARARGS, (char *)"svn_wc_diff_callbacks4_t_file_opened_get(svn_wc_diff_callbacks4_t self) -> svn_error_t *(*)(svn_boolean_t *,svn_boolean_t *,char const *,svn_revnum_t,void *,apr_pool_t *)"},
{ (char *)"svn_wc_diff_callbacks4_t_file_changed_set", _wrap_svn_wc_diff_callbacks4_t_file_changed_set, METH_VARARGS, (char *)"svn_wc_diff_callbacks4_t_file_changed_set(svn_wc_diff_callbacks4_t self, svn_error_t *(*)(svn_wc_notify_state_t *,svn_wc_notify_state_t *,svn_boolean_t *,char const *,char const *,char const *,svn_revnum_t,svn_revnum_t,char const *,char const *,apr_array_header_t const *,apr_hash_t *,void *,apr_pool_t *) file_changed)"},
@@ -39729,6 +39219,8 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_wc_status3_t_moved_to_abspath_get", _wrap_svn_wc_status3_t_moved_to_abspath_get, METH_VARARGS, (char *)"svn_wc_status3_t_moved_to_abspath_get(svn_wc_status3_t self) -> char const *"},
{ (char *)"svn_wc_status3_t_file_external_set", _wrap_svn_wc_status3_t_file_external_set, METH_VARARGS, (char *)"svn_wc_status3_t_file_external_set(svn_wc_status3_t self, svn_boolean_t file_external)"},
{ (char *)"svn_wc_status3_t_file_external_get", _wrap_svn_wc_status3_t_file_external_get, METH_VARARGS, (char *)"svn_wc_status3_t_file_external_get(svn_wc_status3_t self) -> svn_boolean_t"},
+ { (char *)"svn_wc_status3_t_actual_kind_set", _wrap_svn_wc_status3_t_actual_kind_set, METH_VARARGS, (char *)"svn_wc_status3_t_actual_kind_set(svn_wc_status3_t self, svn_node_kind_t actual_kind)"},
+ { (char *)"svn_wc_status3_t_actual_kind_get", _wrap_svn_wc_status3_t_actual_kind_get, METH_VARARGS, (char *)"svn_wc_status3_t_actual_kind_get(svn_wc_status3_t self) -> svn_node_kind_t"},
{ (char *)"new_svn_wc_status3_t", _wrap_new_svn_wc_status3_t, METH_VARARGS, (char *)"new_svn_wc_status3_t() -> svn_wc_status3_t"},
{ (char *)"delete_svn_wc_status3_t", _wrap_delete_svn_wc_status3_t, METH_VARARGS, (char *)"delete_svn_wc_status3_t(svn_wc_status3_t self)"},
{ (char *)"svn_wc_status3_t_swigregister", svn_wc_status3_t_swigregister, METH_VARARGS, NULL},
@@ -39869,6 +39361,10 @@ static PyMethodDef SwigMethods[] = {
"svn_wc_delete(char const * path, svn_wc_adm_access_t * adm_access, svn_cancel_func_t cancel_func, \n"
" svn_wc_notify_func_t notify_func, apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_wc_add_from_disk3", _wrap_svn_wc_add_from_disk3, METH_VARARGS, (char *)"\n"
+ "svn_wc_add_from_disk3(svn_wc_context_t * wc_ctx, char const * local_abspath, apr_hash_t props, svn_boolean_t skip_checks, \n"
+ " svn_wc_notify_func2_t notify_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_wc_add_from_disk2", _wrap_svn_wc_add_from_disk2, METH_VARARGS, (char *)"\n"
"svn_wc_add_from_disk2(svn_wc_context_t * wc_ctx, char const * local_abspath, apr_hash_t props, svn_wc_notify_func2_t notify_func, \n"
" apr_pool_t scratch_pool) -> svn_error_t\n"
@@ -39956,6 +39452,12 @@ static PyMethodDef SwigMethods[] = {
" apr_pool_t pool) -> svn_error_t\n"
""},
{ (char *)"svn_wc_committed_queue_create", _wrap_svn_wc_committed_queue_create, METH_VARARGS, (char *)"svn_wc_committed_queue_create(apr_pool_t pool) -> svn_wc_committed_queue_t *"},
+ { (char *)"svn_wc_queue_committed4", _wrap_svn_wc_queue_committed4, METH_VARARGS, (char *)"\n"
+ "svn_wc_queue_committed4(svn_wc_committed_queue_t * queue, svn_wc_context_t * wc_ctx, char const * local_abspath, \n"
+ " svn_boolean_t recurse, svn_boolean_t is_committed, apr_array_header_t wcprop_changes, \n"
+ " svn_boolean_t remove_lock, svn_boolean_t remove_changelist, \n"
+ " svn_checksum_t sha1_checksum, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_wc_queue_committed3", _wrap_svn_wc_queue_committed3, METH_VARARGS, (char *)"\n"
"svn_wc_queue_committed3(svn_wc_committed_queue_t * queue, svn_wc_context_t * wc_ctx, char const * local_abspath, \n"
" svn_boolean_t recurse, apr_array_header_t wcprop_changes, svn_boolean_t remove_lock, \n"
@@ -40266,6 +39768,12 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"svn_wc_get_pristine_contents2", _wrap_svn_wc_get_pristine_contents2, METH_VARARGS, (char *)"svn_wc_get_pristine_contents2(svn_wc_context_t * wc_ctx, char const * local_abspath, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_wc_get_pristine_contents", _wrap_svn_wc_get_pristine_contents, METH_VARARGS, (char *)"svn_wc_get_pristine_contents(char const * path, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t"},
{ (char *)"svn_wc_get_pristine_copy_path", _wrap_svn_wc_get_pristine_copy_path, METH_VARARGS, (char *)"svn_wc_get_pristine_copy_path(char const * path, apr_pool_t pool) -> svn_error_t"},
+ { (char *)"svn_wc_cleanup4", _wrap_svn_wc_cleanup4, METH_VARARGS, (char *)"\n"
+ "svn_wc_cleanup4(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_boolean_t break_locks, \n"
+ " svn_boolean_t fix_recorded_timestamps, svn_boolean_t clear_dav_cache, svn_boolean_t vacuum_pristines, \n"
+ " svn_cancel_func_t cancel_func, svn_wc_notify_func2_t notify_func, \n"
+ " apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_wc_cleanup3", _wrap_svn_wc_cleanup3, METH_VARARGS, (char *)"\n"
"svn_wc_cleanup3(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_cancel_func_t cancel_func, \n"
" apr_pool_t scratch_pool) -> svn_error_t\n"
@@ -40300,6 +39808,12 @@ static PyMethodDef SwigMethods[] = {
" svn_boolean_t recurse, svn_wc_relocation_validator_t validator, void * validator_baton, \n"
" apr_pool_t pool) -> svn_error_t\n"
""},
+ { (char *)"svn_wc_revert5", _wrap_svn_wc_revert5, METH_VARARGS, (char *)"\n"
+ "svn_wc_revert5(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_depth_t depth, svn_boolean_t use_commit_times, \n"
+ " apr_array_header_t changelist_filter, svn_boolean_t clear_changelists, \n"
+ " svn_boolean_t metadata_only, svn_cancel_func_t cancel_func, \n"
+ " svn_wc_notify_func2_t notify_func, apr_pool_t scratch_pool) -> svn_error_t\n"
+ ""},
{ (char *)"svn_wc_revert4", _wrap_svn_wc_revert4, METH_VARARGS, (char *)"\n"
"svn_wc_revert4(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_depth_t depth, svn_boolean_t use_commit_times, \n"
" apr_array_header_t changelist_filter, svn_cancel_func_t cancel_func, \n"
@@ -40601,7 +40115,7 @@ static PyMethodDef SwigMethods[] = {
" svn_wc_notify_state_t prop_state, svn_revnum_t revision)\n"
""},
{ (char *)"svn_wc_invoke_conflict_resolver_func2", _wrap_svn_wc_invoke_conflict_resolver_func2, METH_VARARGS, (char *)"\n"
- "svn_wc_invoke_conflict_resolver_func2(svn_wc_conflict_resolver_func2_t _obj, svn_wc_conflict_description2_t description, \n"
+ "svn_wc_invoke_conflict_resolver_func2(svn_wc_conflict_resolver_func2_t _obj, svn_wc_conflict_description2_t const * description, \n"
" void * baton, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t\n"
""},
{ (char *)"svn_wc_invoke_conflict_resolver_func", _wrap_svn_wc_invoke_conflict_resolver_func, METH_VARARGS, (char *)"\n"
@@ -40778,9 +40292,11 @@ static swig_type_info _swigt__p_svn_commit_info_t = {"_p_svn_commit_info_t", "st
static swig_type_info _swigt__p_svn_config_t = {"_p_svn_config_t", "struct svn_config_t *|svn_config_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_delta_editor_t = {"_p_svn_delta_editor_t", "struct svn_delta_editor_t *|svn_delta_editor_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_depth_t = {"_p_svn_depth_t", "enum svn_depth_t *|svn_depth_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_diff_hunk_t = {"_p_svn_diff_hunk_t", "svn_diff_hunk_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_dirent_t = {"_p_svn_dirent_t", "struct svn_dirent_t *|svn_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno_t *|svn_errno_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -40964,9 +40480,11 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_config_t,
&_swigt__p_svn_delta_editor_t,
&_swigt__p_svn_depth_t,
+ &_swigt__p_svn_diff_hunk_t,
&_swigt__p_svn_dirent_t,
&_swigt__p_svn_errno_t,
&_swigt__p_svn_error_t,
+ &_swigt__p_svn_fs_lock_target_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -41150,9 +40668,11 @@ static swig_cast_info _swigc__p_svn_commit_info_t[] = { {&_swigt__p_svn_commit_
static swig_cast_info _swigc__p_svn_config_t[] = { {&_swigt__p_svn_config_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_delta_editor_t[] = { {&_swigt__p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_depth_t[] = { {&_swigt__p_svn_depth_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_diff_hunk_t[] = { {&_swigt__p_svn_diff_hunk_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_dirent_t[] = { {&_swigt__p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -41336,9 +40856,11 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_config_t,
_swigc__p_svn_delta_editor_t,
_swigc__p_svn_depth_t,
+ _swigc__p_svn_diff_hunk_t,
_swigc__p_svn_dirent_t,
_swigc__p_svn_errno_t,
_swigc__p_svn_error_t,
+ _swigc__p_svn_fs_lock_target_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -41426,18 +40948,18 @@ static swig_const_info swig_const_table[] = {
#endif
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -41447,17 +40969,17 @@ static swig_const_info swig_const_table[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -41520,7 +41042,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -42180,6 +41702,10 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "svn_wc_notify_left_local_modifications",SWIG_From_long((long)(svn_wc_notify_left_local_modifications)));
SWIG_Python_SetConstant(d, "svn_wc_notify_foreign_copy_begin",SWIG_From_long((long)(svn_wc_notify_foreign_copy_begin)));
SWIG_Python_SetConstant(d, "svn_wc_notify_move_broken",SWIG_From_long((long)(svn_wc_notify_move_broken)));
+ SWIG_Python_SetConstant(d, "svn_wc_notify_cleanup_external",SWIG_From_long((long)(svn_wc_notify_cleanup_external)));
+ SWIG_Python_SetConstant(d, "svn_wc_notify_failed_requires_target",SWIG_From_long((long)(svn_wc_notify_failed_requires_target)));
+ SWIG_Python_SetConstant(d, "svn_wc_notify_info_external",SWIG_From_long((long)(svn_wc_notify_info_external)));
+ SWIG_Python_SetConstant(d, "svn_wc_notify_commit_finalizing",SWIG_From_long((long)(svn_wc_notify_commit_finalizing)));
SWIG_Python_SetConstant(d, "svn_wc_notify_state_inapplicable",SWIG_From_long((long)(svn_wc_notify_state_inapplicable)));
SWIG_Python_SetConstant(d, "svn_wc_notify_state_unknown",SWIG_From_long((long)(svn_wc_notify_state_unknown)));
SWIG_Python_SetConstant(d, "svn_wc_notify_state_unchanged",SWIG_From_long((long)(svn_wc_notify_state_unchanged)));
@@ -42214,6 +41740,7 @@ SWIG_init(void) {
SWIG_Python_SetConstant(d, "svn_wc_operation_update",SWIG_From_long((long)(svn_wc_operation_update)));
SWIG_Python_SetConstant(d, "svn_wc_operation_switch",SWIG_From_long((long)(svn_wc_operation_switch)));
SWIG_Python_SetConstant(d, "svn_wc_operation_merge",SWIG_From_long((long)(svn_wc_operation_merge)));
+ SWIG_Python_SetConstant(d, "svn_wc_conflict_choose_undefined",SWIG_From_long((long)(svn_wc_conflict_choose_undefined)));
SWIG_Python_SetConstant(d, "svn_wc_conflict_choose_postpone",SWIG_From_long((long)(svn_wc_conflict_choose_postpone)));
SWIG_Python_SetConstant(d, "svn_wc_conflict_choose_base",SWIG_From_long((long)(svn_wc_conflict_choose_base)));
SWIG_Python_SetConstant(d, "svn_wc_conflict_choose_theirs_full",SWIG_From_long((long)(svn_wc_conflict_choose_theirs_full)));
diff --git a/subversion/bindings/swig/python/tests/ra.py b/subversion/bindings/swig/python/tests/ra.py
index d38bbb8..47917ca 100644
--- a/subversion/bindings/swig/python/tests/ra.py
+++ b/subversion/bindings/swig/python/tests/ra.py
@@ -298,13 +298,53 @@ class SubversionRepositoryAccessTestCase(unittest.TestCase):
ra.get_file_revs(self.ra_ctx, "trunk/README.txt", 0, 10, rev_handler)
def test_lock(self):
- def callback(baton, path, do_lock, lock, ra_err, pool):
- pass
- # This test merely makes sure that the arguments can be wrapped
- # properly. svn.ra.lock() currently fails because it is not possible
- # to retrieve the username from the auth_baton yet.
- self.assertRaises(core.SubversionException,
- lambda: ra.lock(self.ra_ctx, {"": 0}, "sleutel", False, callback))
+
+ self.calls = 0
+ self.locks = 0
+ self.errors = 0
+ def callback(path, do_lock, lock, ra_err, pool):
+ self.calls += 1
+ self.assertEqual(path, "trunk/README2.txt")
+ if lock:
+ self.assertEqual(lock.owner, "jrandom")
+ self.locks += 1
+ if ra_err:
+ self.assert_(ra_err.apr_err == core.SVN_ERR_FS_PATH_ALREADY_LOCKED
+ or ra_err.apr_err == core.SVN_ERR_FS_NO_SUCH_LOCK)
+ self.errors += 1
+
+ providers = [core.svn_auth_get_username_provider()]
+ self.callbacks.auth_baton = core.svn_auth_open(providers)
+ core.svn_auth_set_parameter(self.callbacks.auth_baton,
+ core.SVN_AUTH_PARAM_DEFAULT_USERNAME,
+ "jrandom")
+ self.ra_ctx = ra.open2(self.repos_uri, self.callbacks, {})
+ rev = fs.youngest_rev(self.fs)
+ ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 1)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ self.locks = 0
+ ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 0)
+ self.assertEqual(self.errors, 1)
+
+ self.calls = 0
+ self.errors = 0
+ the_lock = fs.get_lock(self.fs, "/trunk/README2.txt")
+ ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 0)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 0)
+ self.assertEqual(self.errors, 1)
def test_get_log2(self):
# Get an interesting commmit.
diff --git a/subversion/bindings/swig/python/tests/repository.py b/subversion/bindings/swig/python/tests/repository.py
index 68e6c91..6bfc812 100644
--- a/subversion/bindings/swig/python/tests/repository.py
+++ b/subversion/bindings/swig/python/tests/repository.py
@@ -18,7 +18,7 @@
# under the License.
#
#
-import unittest, setup_path
+import unittest, setup_path, os, sys
from sys import version_info # For Python version check
if version_info[0] >= 3:
# Python >=3.0
@@ -44,6 +44,42 @@ class ChangeReceiver(delta.Editor):
self.textdeltas.append(textdelta)
return textdelta_handler
+class DumpStreamParser(repos.ParseFns3):
+ def __init__(self):
+ repos.ParseFns3.__init__(self)
+ self.ops = []
+ def magic_header_record(self, version, pool=None):
+ self.ops.append(("magic-header", version))
+ def uuid_record(self, uuid, pool=None):
+ self.ops.append(("uuid", uuid))
+ def new_revision_record(self, headers, pool=None):
+ rev = int(headers[repos.DUMPFILE_REVISION_NUMBER])
+ self.ops.append(("new-revision", rev))
+ return rev
+ def close_revision(self, revision_baton):
+ self.ops.append(("close-revision", revision_baton))
+ def new_node_record(self, headers, revision_baton, pool=None):
+ node = headers[repos.DUMPFILE_NODE_PATH]
+ self.ops.append(("new-node", revision_baton, node))
+ return (revision_baton, node)
+ def close_node(self, node_baton):
+ self.ops.append(("close-node", node_baton[0], node_baton[1]))
+ def set_revision_property(self, revision_baton, name, value):
+ self.ops.append(("set-revision-prop", revision_baton, name, value))
+ def set_node_property(self, node_baton, name, value):
+ self.ops.append(("set-node-prop", node_baton[0], node_baton[1], name, value))
+ def remove_node_props(self, node_baton):
+ self.ops.append(("remove-node-props", node_baton[0], node_baton[1]))
+ def delete_node_property(self, node_baton, name):
+ self.ops.append(("delete-node-prop", node_baton[0], node_baton[1], name))
+ def apply_textdelta(self, node_baton):
+ self.ops.append(("apply-textdelta", node_baton[0], node_baton[1]))
+ return None
+ def set_fulltext(self, node_baton):
+ self.ops.append(("set-fulltext", node_baton[0], node_baton[1]))
+ return None
+
+
def _authz_callback(root, path, pool):
"A dummy authz callback which always returns success."
return 1
@@ -139,6 +175,62 @@ class SubversionRepositoryTestCase(unittest.TestCase):
# svn_repos_t objects, so the following call segfaults
#repos.dump_fs2(None, None, None, 0, self.rev, 0, 0, None)
+ def test_parse_fns3(self):
+ self.cancel_calls = 0
+ def is_cancelled():
+ self.cancel_calls += 1
+ return None
+ dump_path = os.path.join(os.path.dirname(sys.argv[0]),
+ "trac/versioncontrol/tests/svnrepos.dump")
+ stream = open(dump_path)
+ dsp = DumpStreamParser()
+ ptr, baton = repos.make_parse_fns3(dsp)
+ repos.parse_dumpstream3(stream, ptr, baton, False, is_cancelled)
+ stream.close()
+ self.assertEqual(self.cancel_calls, 76)
+ expected_list = [
+ ("magic-header", 2),
+ ('uuid', '92ea810a-adf3-0310-b540-bef912dcf5ba'),
+ ('new-revision', 0),
+ ('set-revision-prop', 0, 'svn:date', '2005-04-01T09:57:41.312767Z'),
+ ('close-revision', 0),
+ ('new-revision', 1),
+ ('set-revision-prop', 1, 'svn:log', 'Initial directory layout.'),
+ ('set-revision-prop', 1, 'svn:author', 'john'),
+ ('set-revision-prop', 1, 'svn:date', '2005-04-01T10:00:52.353248Z'),
+ ('new-node', 1, 'branches'),
+ ('remove-node-props', 1, 'branches'),
+ ('close-node', 1, 'branches'),
+ ('new-node', 1, 'tags'),
+ ('remove-node-props', 1, 'tags'),
+ ('close-node', 1, 'tags'),
+ ('new-node', 1, 'trunk'),
+ ('remove-node-props', 1, 'trunk'),
+ ('close-node', 1, 'trunk'),
+ ('close-revision', 1),
+ ('new-revision', 2),
+ ('set-revision-prop', 2, 'svn:log', 'Added README.'),
+ ('set-revision-prop', 2, 'svn:author', 'john'),
+ ('set-revision-prop', 2, 'svn:date', '2005-04-01T13:12:18.216267Z'),
+ ('new-node', 2, 'trunk/README.txt'),
+ ('remove-node-props', 2, 'trunk/README.txt'),
+ ('set-fulltext', 2, 'trunk/README.txt'),
+ ('close-node', 2, 'trunk/README.txt'),
+ ('close-revision', 2), ('new-revision', 3),
+ ('set-revision-prop', 3, 'svn:log', 'Fixed README.\n'),
+ ('set-revision-prop', 3, 'svn:author', 'kate'),
+ ('set-revision-prop', 3, 'svn:date', '2005-04-01T13:24:58.234643Z'),
+ ('new-node', 3, 'trunk/README.txt'),
+ ('remove-node-props', 3, 'trunk/README.txt'),
+ ('set-node-prop', 3, 'trunk/README.txt', 'svn:mime-type', 'text/plain'),
+ ('set-node-prop', 3, 'trunk/README.txt', 'svn:eol-style', 'native'),
+ ('set-fulltext', 3, 'trunk/README.txt'),
+ ('close-node', 3, 'trunk/README.txt'), ('close-revision', 3),
+ ]
+ # Compare only the first X nodes described in the expected list - otherwise
+ # the comparison list gets too long.
+ self.assertEqual(dsp.ops[:len(expected_list)], expected_list)
+
def test_get_logs(self):
"""Test scope of get_logs callbacks"""
logs = []
@@ -177,6 +269,17 @@ class SubversionRepositoryTestCase(unittest.TestCase):
set(["This is a test.\n", "A test.\n"]))
self.assertEqual(len(editor.textdeltas), 2)
+ def test_unnamed_editor(self):
+ """Test editor object without reference from interpreter"""
+ # Check that the delta.Editor object has proper lifetime. Without
+ # increment of the refcount in make_baton, the object was destroyed
+ # immediately because the interpreter does not hold a reference to it.
+ this_root = fs.revision_root(self.fs, self.rev)
+ prev_root = fs.revision_root(self.fs, self.rev-1)
+ e_ptr, e_baton = delta.make_editor(ChangeReceiver(this_root, prev_root))
+ repos.dir_delta(prev_root, '', '', this_root, '', e_ptr, e_baton,
+ _authz_callback, 1, 1, 0, 0)
+
def test_retrieve_and_change_rev_prop(self):
"""Test playing with revprops"""
self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
@@ -208,6 +311,98 @@ class SubversionRepositoryTestCase(unittest.TestCase):
repos.freeze([self.repos_path], self.freeze_body)
self.assertEqual(self.freeze_invoked, 1)
+ def test_lock_unlock(self):
+ """Basic lock/unlock"""
+
+ access = fs.create_access('jrandom')
+ fs.set_access(self.fs, access)
+ fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, False)
+ try:
+ fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, False)
+ except core.SubversionException, exc:
+ self.assertEqual(exc.apr_err, core.SVN_ERR_FS_PATH_ALREADY_LOCKED)
+ fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, True)
+
+ self.calls = 0
+ self.errors = 0
+ def unlock_callback(path, lock, err, pool):
+ self.assertEqual(path, '/trunk/README.txt')
+ self.assertEqual(lock, None)
+ self.calls += 1
+ if err != None:
+ self.assertEqual(err.apr_err, core.SVN_ERR_FS_NO_SUCH_LOCK)
+ self.errors += 1
+
+ the_lock = fs.get_lock(self.fs, '/trunk/README.txt')
+ fs.unlock_many(self.fs, {'/trunk/README.txt':the_lock.token}, False,
+ unlock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ fs.unlock_many(self.fs, {'/trunk/README.txt':the_lock.token}, False,
+ unlock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.errors, 1)
+
+ self.locks = 0
+ def lock_callback(path, lock, err, pool):
+ self.assertEqual(path, '/trunk/README.txt')
+ if lock != None:
+ self.assertEqual(lock.owner, 'jrandom')
+ self.locks += 1
+ self.calls += 1
+ if err != None:
+ self.assertEqual(err.apr_err, core.SVN_ERR_FS_PATH_ALREADY_LOCKED)
+ self.errors += 1
+
+ self.calls = 0
+ self.errors = 0
+ target = fs.lock_target_create(None, self.rev)
+ fs.lock_many(self.fs, {'trunk/README.txt':target},
+ None, False, 0, False, lock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 1)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ self.locks = 0
+ fs.lock_many(self.fs, {'trunk/README.txt':target},
+ None, False, 0, False, lock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 0)
+ self.assertEqual(self.errors, 1)
+
+ self.calls = 0
+ self.errors = 0
+ the_lock = fs.get_lock(self.fs, '/trunk/README.txt')
+ repos.fs_unlock_many(self.repos, {'trunk/README.txt':the_lock.token},
+ False, unlock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ repos.fs_unlock_many(self.repos, {'trunk/README.txt':the_lock.token},
+ False, unlock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.errors, 1)
+
+ self.calls = 0
+ self.errors = 0
+ repos.fs_lock_many(self.repos, {'trunk/README.txt':target},
+ None, False, 0, False, lock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 1)
+ self.assertEqual(self.errors, 0)
+
+ self.calls = 0
+ self.locks = 0
+ repos.fs_lock_many(self.repos, {'trunk/README.txt':target},
+ None, False, 0, False, lock_callback)
+ self.assertEqual(self.calls, 1)
+ self.assertEqual(self.locks, 0)
+ self.assertEqual(self.errors, 1)
+
def suite():
return unittest.defaultTestLoader.loadTestsFromTestCase(
SubversionRepositoryTestCase)
diff --git a/subversion/bindings/swig/python/wc.py b/subversion/bindings/swig/python/wc.py
index 54dc5ad..2b94135 100644
--- a/subversion/bindings/swig/python/wc.py
+++ b/subversion/bindings/swig/python/wc.py
@@ -1,11 +1,13 @@
# This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.9
+# Version 2.0.12
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
+
+
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
@@ -252,7 +254,7 @@ class svn_wc_external_item2_t:
__swig_setmethods__["peg_revision"] = _wc.svn_wc_external_item2_t_peg_revision_set
__swig_getmethods__["peg_revision"] = _wc.svn_wc_external_item2_t_peg_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_external_item2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -271,13 +273,13 @@ class svn_wc_external_item2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -286,9 +288,9 @@ class svn_wc_external_item2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -329,7 +331,7 @@ class svn_wc_external_item_t:
__swig_setmethods__["revision"] = _wc.svn_wc_external_item_t_revision_set
__swig_getmethods__["revision"] = _wc.svn_wc_external_item_t_revision_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_external_item_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -348,13 +350,13 @@ class svn_wc_external_item_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -363,9 +365,9 @@ class svn_wc_external_item_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -387,7 +389,7 @@ def svn_wc_external_item_dup(*args):
def svn_wc_parse_externals_description3(*args):
"""
- svn_wc_parse_externals_description3(char const * parent_directory, char const * desc, svn_boolean_t canonicalize_url,
+ svn_wc_parse_externals_description3(char const * defining_directory, char const * desc, svn_boolean_t canonicalize_url,
apr_pool_t pool) -> svn_error_t
"""
return _wc.svn_wc_parse_externals_description3(*args)
@@ -475,6 +477,10 @@ svn_wc_notify_conflict_resolver_done = _wc.svn_wc_notify_conflict_resolver_done
svn_wc_notify_left_local_modifications = _wc.svn_wc_notify_left_local_modifications
svn_wc_notify_foreign_copy_begin = _wc.svn_wc_notify_foreign_copy_begin
svn_wc_notify_move_broken = _wc.svn_wc_notify_move_broken
+svn_wc_notify_cleanup_external = _wc.svn_wc_notify_cleanup_external
+svn_wc_notify_failed_requires_target = _wc.svn_wc_notify_failed_requires_target
+svn_wc_notify_info_external = _wc.svn_wc_notify_info_external
+svn_wc_notify_commit_finalizing = _wc.svn_wc_notify_commit_finalizing
svn_wc_notify_state_inapplicable = _wc.svn_wc_notify_state_inapplicable
svn_wc_notify_state_unknown = _wc.svn_wc_notify_state_unknown
svn_wc_notify_state_unchanged = _wc.svn_wc_notify_state_unchanged
@@ -543,7 +549,7 @@ class svn_wc_notify_t:
__swig_setmethods__["hunk_fuzz"] = _wc.svn_wc_notify_t_hunk_fuzz_set
__swig_getmethods__["hunk_fuzz"] = _wc.svn_wc_notify_t_hunk_fuzz_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_notify_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -562,13 +568,13 @@ class svn_wc_notify_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -577,9 +583,9 @@ class svn_wc_notify_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -644,7 +650,7 @@ class svn_wc_conflict_version_t:
__swig_setmethods__["repos_uuid"] = _wc.svn_wc_conflict_version_t_repos_uuid_set
__swig_getmethods__["repos_uuid"] = _wc.svn_wc_conflict_version_t_repos_uuid_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_version_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -663,13 +669,13 @@ class svn_wc_conflict_version_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -678,9 +684,9 @@ class svn_wc_conflict_version_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -713,95 +719,6 @@ def svn_wc_conflict_version_create(*args):
def svn_wc_conflict_version_dup(*args):
"""svn_wc_conflict_version_dup(svn_wc_conflict_version_t version, apr_pool_t pool) -> svn_wc_conflict_version_t"""
return _wc.svn_wc_conflict_version_dup(*args)
-class svn_wc_conflict_description2_t:
- """Proxy of C svn_wc_conflict_description2_t struct"""
- __swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_wc_conflict_description2_t, name, value)
- __swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_wc_conflict_description2_t, name)
- __repr__ = _swig_repr
- __swig_setmethods__["local_abspath"] = _wc.svn_wc_conflict_description2_t_local_abspath_set
- __swig_getmethods__["local_abspath"] = _wc.svn_wc_conflict_description2_t_local_abspath_get
- __swig_setmethods__["node_kind"] = _wc.svn_wc_conflict_description2_t_node_kind_set
- __swig_getmethods__["node_kind"] = _wc.svn_wc_conflict_description2_t_node_kind_get
- __swig_setmethods__["kind"] = _wc.svn_wc_conflict_description2_t_kind_set
- __swig_getmethods__["kind"] = _wc.svn_wc_conflict_description2_t_kind_get
- __swig_setmethods__["property_name"] = _wc.svn_wc_conflict_description2_t_property_name_set
- __swig_getmethods__["property_name"] = _wc.svn_wc_conflict_description2_t_property_name_get
- __swig_setmethods__["is_binary"] = _wc.svn_wc_conflict_description2_t_is_binary_set
- __swig_getmethods__["is_binary"] = _wc.svn_wc_conflict_description2_t_is_binary_get
- __swig_setmethods__["mime_type"] = _wc.svn_wc_conflict_description2_t_mime_type_set
- __swig_getmethods__["mime_type"] = _wc.svn_wc_conflict_description2_t_mime_type_get
- __swig_setmethods__["action"] = _wc.svn_wc_conflict_description2_t_action_set
- __swig_getmethods__["action"] = _wc.svn_wc_conflict_description2_t_action_get
- __swig_setmethods__["reason"] = _wc.svn_wc_conflict_description2_t_reason_set
- __swig_getmethods__["reason"] = _wc.svn_wc_conflict_description2_t_reason_get
- __swig_setmethods__["base_abspath"] = _wc.svn_wc_conflict_description2_t_base_abspath_set
- __swig_getmethods__["base_abspath"] = _wc.svn_wc_conflict_description2_t_base_abspath_get
- __swig_setmethods__["their_abspath"] = _wc.svn_wc_conflict_description2_t_their_abspath_set
- __swig_getmethods__["their_abspath"] = _wc.svn_wc_conflict_description2_t_their_abspath_get
- __swig_setmethods__["my_abspath"] = _wc.svn_wc_conflict_description2_t_my_abspath_set
- __swig_getmethods__["my_abspath"] = _wc.svn_wc_conflict_description2_t_my_abspath_get
- __swig_setmethods__["merged_file"] = _wc.svn_wc_conflict_description2_t_merged_file_set
- __swig_getmethods__["merged_file"] = _wc.svn_wc_conflict_description2_t_merged_file_get
- __swig_setmethods__["operation"] = _wc.svn_wc_conflict_description2_t_operation_set
- __swig_getmethods__["operation"] = _wc.svn_wc_conflict_description2_t_operation_get
- __swig_setmethods__["src_left_version"] = _wc.svn_wc_conflict_description2_t_src_left_version_set
- __swig_getmethods__["src_left_version"] = _wc.svn_wc_conflict_description2_t_src_left_version_get
- __swig_setmethods__["src_right_version"] = _wc.svn_wc_conflict_description2_t_src_right_version_set
- __swig_getmethods__["src_right_version"] = _wc.svn_wc_conflict_description2_t_src_right_version_get
- def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_description2_t"""
- import libsvn.core, weakref
- self.__dict__["_parent_pool"] = \
- parent_pool or libsvn.core.application_pool;
- if self.__dict__["_parent_pool"]:
- self.__dict__["_is_valid"] = weakref.ref(
- self.__dict__["_parent_pool"]._is_valid)
-
- def assert_valid(self):
- """Assert that this object is using valid pool memory"""
- if "_is_valid" in self.__dict__:
- assert self.__dict__["_is_valid"](), "Variable has already been deleted"
-
- def __getattr__(self, name):
- """Get an attribute from this object"""
- self.assert_valid()
-
- value = _swig_getattr(self, self.__class__, name)
-
-
-
- members = self.__dict__.get("_members")
- if members is not None:
- _copy_metadata_deep(value, members.get(name))
-
-
- _assert_valid_deep(value)
-
- return value
-
- def __setattr__(self, name, value):
- """Set an attribute on this object"""
- self.assert_valid()
-
-
-
-
- self.__dict__.setdefault("_members",{})[name] = value
-
- return _swig_setattr(self, self.__class__, name, value)
-
- def __init__(self):
- """__init__(svn_wc_conflict_description2_t self) -> svn_wc_conflict_description2_t"""
- this = _wc.new_svn_wc_conflict_description2_t()
- try: self.this.append(this)
- except: self.this = this
- __swig_destroy__ = _wc.delete_svn_wc_conflict_description2_t
- __del__ = lambda self : None;
-svn_wc_conflict_description2_t_swigregister = _wc.svn_wc_conflict_description2_t_swigregister
-svn_wc_conflict_description2_t_swigregister(svn_wc_conflict_description2_t)
-
class svn_wc_conflict_description_t:
"""Proxy of C svn_wc_conflict_description_t struct"""
__swig_setmethods__ = {}
@@ -842,7 +759,7 @@ class svn_wc_conflict_description_t:
__swig_setmethods__["src_right_version"] = _wc.svn_wc_conflict_description_t_src_right_version_set
__swig_getmethods__["src_right_version"] = _wc.svn_wc_conflict_description_t_src_right_version_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_description_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -861,13 +778,13 @@ class svn_wc_conflict_description_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -876,9 +793,9 @@ class svn_wc_conflict_description_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -895,7 +812,7 @@ svn_wc_conflict_description_t_swigregister(svn_wc_conflict_description_t)
def svn_wc_conflict_description_create_text2(*args):
- """svn_wc_conflict_description_create_text2(char const * local_abspath, apr_pool_t result_pool) -> svn_wc_conflict_description2_t"""
+ """svn_wc_conflict_description_create_text2(char const * local_abspath, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"""
return _wc.svn_wc_conflict_description_create_text2(*args)
def svn_wc_conflict_description_create_text(*args):
@@ -905,7 +822,7 @@ def svn_wc_conflict_description_create_text(*args):
def svn_wc_conflict_description_create_prop2(*args):
"""
svn_wc_conflict_description_create_prop2(char const * local_abspath, svn_node_kind_t node_kind, char const * property_name,
- apr_pool_t result_pool) -> svn_wc_conflict_description2_t
+ apr_pool_t result_pool) -> svn_wc_conflict_description2_t *
"""
return _wc.svn_wc_conflict_description_create_prop2(*args)
@@ -920,7 +837,7 @@ def svn_wc_conflict_description_create_tree2(*args):
"""
svn_wc_conflict_description_create_tree2(char const * local_abspath, svn_node_kind_t node_kind, svn_wc_operation_t operation,
svn_wc_conflict_version_t src_left_version, svn_wc_conflict_version_t src_right_version,
- apr_pool_t result_pool) -> svn_wc_conflict_description2_t
+ apr_pool_t result_pool) -> svn_wc_conflict_description2_t *
"""
return _wc.svn_wc_conflict_description_create_tree2(*args)
@@ -932,9 +849,14 @@ def svn_wc_conflict_description_create_tree(*args):
"""
return _wc.svn_wc_conflict_description_create_tree(*args)
+def svn_wc_conflict_description2_dup(*args):
+ """svn_wc_conflict_description2_dup(svn_wc_conflict_description2_t const * conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"""
+ return _wc.svn_wc_conflict_description2_dup(*args)
+
def svn_wc__conflict_description2_dup(*args):
- """svn_wc__conflict_description2_dup(svn_wc_conflict_description2_t conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t"""
+ """svn_wc__conflict_description2_dup(svn_wc_conflict_description2_t const * conflict, apr_pool_t result_pool) -> svn_wc_conflict_description2_t *"""
return _wc.svn_wc__conflict_description2_dup(*args)
+svn_wc_conflict_choose_undefined = _wc.svn_wc_conflict_choose_undefined
svn_wc_conflict_choose_postpone = _wc.svn_wc_conflict_choose_postpone
svn_wc_conflict_choose_base = _wc.svn_wc_conflict_choose_base
svn_wc_conflict_choose_theirs_full = _wc.svn_wc_conflict_choose_theirs_full
@@ -943,74 +865,9 @@ svn_wc_conflict_choose_theirs_conflict = _wc.svn_wc_conflict_choose_theirs_confl
svn_wc_conflict_choose_mine_conflict = _wc.svn_wc_conflict_choose_mine_conflict
svn_wc_conflict_choose_merged = _wc.svn_wc_conflict_choose_merged
svn_wc_conflict_choose_unspecified = _wc.svn_wc_conflict_choose_unspecified
-class svn_wc_conflict_result_t:
- """Proxy of C svn_wc_conflict_result_t struct"""
- __swig_setmethods__ = {}
- __setattr__ = lambda self, name, value: _swig_setattr(self, svn_wc_conflict_result_t, name, value)
- __swig_getmethods__ = {}
- __getattr__ = lambda self, name: _swig_getattr(self, svn_wc_conflict_result_t, name)
- __repr__ = _swig_repr
- __swig_setmethods__["choice"] = _wc.svn_wc_conflict_result_t_choice_set
- __swig_getmethods__["choice"] = _wc.svn_wc_conflict_result_t_choice_get
- __swig_setmethods__["merged_file"] = _wc.svn_wc_conflict_result_t_merged_file_set
- __swig_getmethods__["merged_file"] = _wc.svn_wc_conflict_result_t_merged_file_get
- __swig_setmethods__["save_merged"] = _wc.svn_wc_conflict_result_t_save_merged_set
- __swig_getmethods__["save_merged"] = _wc.svn_wc_conflict_result_t_save_merged_get
- def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_result_t"""
- import libsvn.core, weakref
- self.__dict__["_parent_pool"] = \
- parent_pool or libsvn.core.application_pool;
- if self.__dict__["_parent_pool"]:
- self.__dict__["_is_valid"] = weakref.ref(
- self.__dict__["_parent_pool"]._is_valid)
-
- def assert_valid(self):
- """Assert that this object is using valid pool memory"""
- if "_is_valid" in self.__dict__:
- assert self.__dict__["_is_valid"](), "Variable has already been deleted"
-
- def __getattr__(self, name):
- """Get an attribute from this object"""
- self.assert_valid()
-
- value = _swig_getattr(self, self.__class__, name)
-
-
-
- members = self.__dict__.get("_members")
- if members is not None:
- _copy_metadata_deep(value, members.get(name))
-
-
- _assert_valid_deep(value)
-
- return value
-
- def __setattr__(self, name, value):
- """Set an attribute on this object"""
- self.assert_valid()
-
-
-
-
- self.__dict__.setdefault("_members",{})[name] = value
-
- return _swig_setattr(self, self.__class__, name, value)
-
- def __init__(self):
- """__init__(svn_wc_conflict_result_t self) -> svn_wc_conflict_result_t"""
- this = _wc.new_svn_wc_conflict_result_t()
- try: self.this.append(this)
- except: self.this = this
- __swig_destroy__ = _wc.delete_svn_wc_conflict_result_t
- __del__ = lambda self : None;
-svn_wc_conflict_result_t_swigregister = _wc.svn_wc_conflict_result_t_swigregister
-svn_wc_conflict_result_t_swigregister(svn_wc_conflict_result_t)
-
def svn_wc_create_conflict_result(*args):
- """svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice, char const * merged_file, apr_pool_t pool) -> svn_wc_conflict_result_t"""
+ """svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice, char const * merged_file, apr_pool_t pool) -> svn_wc_conflict_result_t *"""
return _wc.svn_wc_create_conflict_result(*args)
class svn_wc_diff_callbacks4_t:
"""Proxy of C svn_wc_diff_callbacks4_t struct"""
@@ -1038,7 +895,7 @@ class svn_wc_diff_callbacks4_t:
__swig_setmethods__["dir_closed"] = _wc.svn_wc_diff_callbacks4_t_dir_closed_set
__swig_getmethods__["dir_closed"] = _wc.svn_wc_diff_callbacks4_t_dir_closed_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_diff_callbacks4_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1057,13 +914,13 @@ class svn_wc_diff_callbacks4_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1072,9 +929,9 @@ class svn_wc_diff_callbacks4_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1140,7 +997,7 @@ class svn_wc_diff_callbacks3_t:
__swig_setmethods__["dir_closed"] = _wc.svn_wc_diff_callbacks3_t_dir_closed_set
__swig_getmethods__["dir_closed"] = _wc.svn_wc_diff_callbacks3_t_dir_closed_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_diff_callbacks3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1159,13 +1016,13 @@ class svn_wc_diff_callbacks3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1174,9 +1031,9 @@ class svn_wc_diff_callbacks3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1235,7 +1092,7 @@ class svn_wc_diff_callbacks2_t:
__swig_setmethods__["dir_props_changed"] = _wc.svn_wc_diff_callbacks2_t_dir_props_changed_set
__swig_getmethods__["dir_props_changed"] = _wc.svn_wc_diff_callbacks2_t_dir_props_changed_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_diff_callbacks2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1254,13 +1111,13 @@ class svn_wc_diff_callbacks2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1269,9 +1126,9 @@ class svn_wc_diff_callbacks2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1324,7 +1181,7 @@ class svn_wc_diff_callbacks_t:
__swig_setmethods__["props_changed"] = _wc.svn_wc_diff_callbacks_t_props_changed_set
__swig_getmethods__["props_changed"] = _wc.svn_wc_diff_callbacks_t_props_changed_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_diff_callbacks_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1343,13 +1200,13 @@ class svn_wc_diff_callbacks_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1358,9 +1215,9 @@ class svn_wc_diff_callbacks_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1515,7 +1372,7 @@ class svn_wc_entry_t:
__swig_setmethods__["file_external_rev"] = _wc.svn_wc_entry_t_file_external_rev_set
__swig_getmethods__["file_external_rev"] = _wc.svn_wc_entry_t_file_external_rev_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_entry_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1534,13 +1391,13 @@ class svn_wc_entry_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1549,9 +1406,9 @@ class svn_wc_entry_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1611,7 +1468,7 @@ class svn_wc_info_t:
__swig_setmethods__["moved_to_abspath"] = _wc.svn_wc_info_t_moved_to_abspath_set
__swig_getmethods__["moved_to_abspath"] = _wc.svn_wc_info_t_moved_to_abspath_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1630,13 +1487,13 @@ class svn_wc_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1645,9 +1502,9 @@ class svn_wc_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1694,7 +1551,7 @@ class svn_wc_entry_callbacks2_t:
__swig_setmethods__["handle_error"] = _wc.svn_wc_entry_callbacks2_t_handle_error_set
__swig_getmethods__["handle_error"] = _wc.svn_wc_entry_callbacks2_t_handle_error_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_entry_callbacks2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1713,13 +1570,13 @@ class svn_wc_entry_callbacks2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1728,9 +1585,9 @@ class svn_wc_entry_callbacks2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1761,7 +1618,7 @@ class svn_wc_entry_callbacks_t:
__swig_setmethods__["found_entry"] = _wc.svn_wc_entry_callbacks_t_found_entry_set
__swig_getmethods__["found_entry"] = _wc.svn_wc_entry_callbacks_t_found_entry_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_entry_callbacks_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1780,13 +1637,13 @@ class svn_wc_entry_callbacks_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1795,9 +1652,9 @@ class svn_wc_entry_callbacks_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -1955,8 +1812,10 @@ class svn_wc_status3_t:
__swig_getmethods__["moved_to_abspath"] = _wc.svn_wc_status3_t_moved_to_abspath_get
__swig_setmethods__["file_external"] = _wc.svn_wc_status3_t_file_external_set
__swig_getmethods__["file_external"] = _wc.svn_wc_status3_t_file_external_get
+ __swig_setmethods__["actual_kind"] = _wc.svn_wc_status3_t_actual_kind_set
+ __swig_getmethods__["actual_kind"] = _wc.svn_wc_status3_t_actual_kind_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -1975,13 +1834,13 @@ class svn_wc_status3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -1990,9 +1849,9 @@ class svn_wc_status3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2051,7 +1910,7 @@ class svn_wc_status2_t:
__swig_setmethods__["pristine_prop_status"] = _wc.svn_wc_status2_t_pristine_prop_status_set
__swig_getmethods__["pristine_prop_status"] = _wc.svn_wc_status2_t_pristine_prop_status_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2070,13 +1929,13 @@ class svn_wc_status2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2085,9 +1944,9 @@ class svn_wc_status2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2126,7 +1985,7 @@ class svn_wc_status_t:
__swig_setmethods__["repos_prop_status"] = _wc.svn_wc_status_t_repos_prop_status_set
__swig_getmethods__["repos_prop_status"] = _wc.svn_wc_status_t_repos_prop_status_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -2145,13 +2004,13 @@ class svn_wc_status_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -2160,9 +2019,9 @@ class svn_wc_status_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -2320,6 +2179,13 @@ def svn_wc_delete(*args):
"""
return _wc.svn_wc_delete(*args)
+def svn_wc_add_from_disk3(*args):
+ """
+ svn_wc_add_from_disk3(svn_wc_context_t * wc_ctx, char const * local_abspath, apr_hash_t props, svn_boolean_t skip_checks,
+ svn_wc_notify_func2_t notify_func, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _wc.svn_wc_add_from_disk3(*args)
+
def svn_wc_add_from_disk2(*args):
"""
svn_wc_add_from_disk2(svn_wc_context_t * wc_ctx, char const * local_abspath, apr_hash_t props, svn_wc_notify_func2_t notify_func,
@@ -2461,6 +2327,15 @@ def svn_wc_committed_queue_create(*args):
"""svn_wc_committed_queue_create(apr_pool_t pool) -> svn_wc_committed_queue_t *"""
return _wc.svn_wc_committed_queue_create(*args)
+def svn_wc_queue_committed4(*args):
+ """
+ svn_wc_queue_committed4(svn_wc_committed_queue_t * queue, svn_wc_context_t * wc_ctx, char const * local_abspath,
+ svn_boolean_t recurse, svn_boolean_t is_committed, apr_array_header_t wcprop_changes,
+ svn_boolean_t remove_lock, svn_boolean_t remove_changelist,
+ svn_checksum_t sha1_checksum, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _wc.svn_wc_queue_committed4(*args)
+
def svn_wc_queue_committed3(*args):
"""
svn_wc_queue_committed3(svn_wc_committed_queue_t * queue, svn_wc_context_t * wc_ctx, char const * local_abspath,
@@ -2973,6 +2848,15 @@ def svn_wc_get_pristine_copy_path(*args):
"""svn_wc_get_pristine_copy_path(char const * path, apr_pool_t pool) -> svn_error_t"""
return _wc.svn_wc_get_pristine_copy_path(*args)
+def svn_wc_cleanup4(*args):
+ """
+ svn_wc_cleanup4(svn_wc_context_t * wc_ctx, char const * 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, svn_wc_notify_func2_t notify_func,
+ apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _wc.svn_wc_cleanup4(*args)
+
def svn_wc_cleanup3(*args):
"""
svn_wc_cleanup3(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_cancel_func_t cancel_func,
@@ -3031,6 +2915,15 @@ def svn_wc_relocate(*args):
"""
return _wc.svn_wc_relocate(*args)
+def svn_wc_revert5(*args):
+ """
+ svn_wc_revert5(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_depth_t depth, svn_boolean_t use_commit_times,
+ apr_array_header_t changelist_filter, svn_boolean_t clear_changelists,
+ svn_boolean_t metadata_only, svn_cancel_func_t cancel_func,
+ svn_wc_notify_func2_t notify_func, apr_pool_t scratch_pool) -> svn_error_t
+ """
+ return _wc.svn_wc_revert5(*args)
+
def svn_wc_revert4(*args):
"""
svn_wc_revert4(svn_wc_context_t * wc_ctx, char const * local_abspath, svn_depth_t depth, svn_boolean_t use_commit_times,
@@ -3186,7 +3079,7 @@ class svn_wc_revision_status_t:
__swig_setmethods__["sparse_checkout"] = _wc.svn_wc_revision_status_t_sparse_checkout_set
__swig_getmethods__["sparse_checkout"] = _wc.svn_wc_revision_status_t_sparse_checkout_get
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_revision_status_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3205,13 +3098,13 @@ class svn_wc_revision_status_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3220,9 +3113,9 @@ class svn_wc_revision_status_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3316,7 +3209,7 @@ class svn_wc_context_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_context_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3335,13 +3228,13 @@ class svn_wc_context_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3350,9 +3243,9 @@ class svn_wc_context_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3369,7 +3262,7 @@ class svn_wc_adm_access_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_adm_access_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3388,13 +3281,13 @@ class svn_wc_adm_access_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3403,9 +3296,9 @@ class svn_wc_adm_access_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3422,7 +3315,7 @@ class svn_wc_traversal_info_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_traversal_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3441,13 +3334,13 @@ class svn_wc_traversal_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3456,9 +3349,9 @@ class svn_wc_traversal_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3475,7 +3368,7 @@ class svn_wc_committed_queue_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_committed_queue_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3494,13 +3387,13 @@ class svn_wc_committed_queue_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3509,9 +3402,9 @@ class svn_wc_committed_queue_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3801,7 +3694,7 @@ def svn_wc_invoke_notify_func(*args):
def svn_wc_invoke_conflict_resolver_func2(*args):
"""
- svn_wc_invoke_conflict_resolver_func2(svn_wc_conflict_resolver_func2_t _obj, svn_wc_conflict_description2_t description,
+ svn_wc_invoke_conflict_resolver_func2(svn_wc_conflict_resolver_func2_t _obj, svn_wc_conflict_description2_t const * description,
void * baton, apr_pool_t result_pool, apr_pool_t scratch_pool) -> svn_error_t
"""
return _wc.svn_wc_invoke_conflict_resolver_func2(*args)
@@ -3896,7 +3789,7 @@ class svn_wc_external_update_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_external_update_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3915,13 +3808,13 @@ class svn_wc_external_update_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3930,9 +3823,9 @@ class svn_wc_external_update_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -3952,7 +3845,7 @@ class svn_wc_notify_func2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_notify_func2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -3971,13 +3864,13 @@ class svn_wc_notify_func2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -3986,9 +3879,9 @@ class svn_wc_notify_func2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4008,7 +3901,7 @@ class svn_wc_notify_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_notify_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4027,13 +3920,13 @@ class svn_wc_notify_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4042,9 +3935,9 @@ class svn_wc_notify_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4064,7 +3957,7 @@ class svn_wc_conflict_resolver_func2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_resolver_func2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4083,13 +3976,13 @@ class svn_wc_conflict_resolver_func2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4098,9 +3991,9 @@ class svn_wc_conflict_resolver_func2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4120,7 +4013,7 @@ class svn_wc_conflict_resolver_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_conflict_resolver_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4139,13 +4032,13 @@ class svn_wc_conflict_resolver_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4154,9 +4047,9 @@ class svn_wc_conflict_resolver_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4176,7 +4069,7 @@ class svn_wc_status_func4_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status_func4_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4195,13 +4088,13 @@ class svn_wc_status_func4_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4210,9 +4103,9 @@ class svn_wc_status_func4_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4232,7 +4125,7 @@ class svn_wc_status_func3_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status_func3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4251,13 +4144,13 @@ class svn_wc_status_func3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4266,9 +4159,9 @@ class svn_wc_status_func3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4288,7 +4181,7 @@ class svn_wc_status_func2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status_func2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4307,13 +4200,13 @@ class svn_wc_status_func2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4322,9 +4215,9 @@ class svn_wc_status_func2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4344,7 +4237,7 @@ class svn_wc_status_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_status_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4363,13 +4256,13 @@ class svn_wc_status_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4378,9 +4271,9 @@ class svn_wc_status_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4400,7 +4293,7 @@ class svn_wc_get_file_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_get_file_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4419,13 +4312,13 @@ class svn_wc_get_file_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4434,9 +4327,9 @@ class svn_wc_get_file_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4456,7 +4349,7 @@ class svn_wc_dirents_func_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_dirents_func_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4475,13 +4368,13 @@ class svn_wc_dirents_func_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4490,9 +4383,9 @@ class svn_wc_dirents_func_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4512,7 +4405,7 @@ class svn_wc_canonicalize_svn_prop_get_file_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_canonicalize_svn_prop_get_file_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4531,13 +4424,13 @@ class svn_wc_canonicalize_svn_prop_get_file_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4546,9 +4439,9 @@ class svn_wc_canonicalize_svn_prop_get_file_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4568,7 +4461,7 @@ class svn_wc_upgrade_get_repos_info_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_upgrade_get_repos_info_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4587,13 +4480,13 @@ class svn_wc_upgrade_get_repos_info_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4602,9 +4495,9 @@ class svn_wc_upgrade_get_repos_info_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4624,7 +4517,7 @@ class svn_wc_relocation_validator3_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_relocation_validator3_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4643,13 +4536,13 @@ class svn_wc_relocation_validator3_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4658,9 +4551,9 @@ class svn_wc_relocation_validator3_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4680,7 +4573,7 @@ class svn_wc_relocation_validator2_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_relocation_validator2_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4699,13 +4592,13 @@ class svn_wc_relocation_validator2_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4714,9 +4607,9 @@ class svn_wc_relocation_validator2_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4736,7 +4629,7 @@ class svn_wc_relocation_validator_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_wc_relocation_validator_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4755,13 +4648,13 @@ class svn_wc_relocation_validator_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4770,9 +4663,9 @@ class svn_wc_relocation_validator_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
@@ -4792,7 +4685,7 @@ class svn_changelist_receiver_t:
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
def set_parent_pool(self, parent_pool=None):
- """Create a new proxy object for svn_changelist_receiver_t"""
+ """Create a new proxy object for TYPE"""
import libsvn.core, weakref
self.__dict__["_parent_pool"] = \
parent_pool or libsvn.core.application_pool;
@@ -4811,13 +4704,13 @@ class svn_changelist_receiver_t:
value = _swig_getattr(self, self.__class__, name)
-
-
+ # If we got back a different object than we have, we need to copy all our
+ # metadata into it, so that it looks identical
members = self.__dict__.get("_members")
if members is not None:
_copy_metadata_deep(value, members.get(name))
-
+ # Verify that the new object is good
_assert_valid_deep(value)
return value
@@ -4826,9 +4719,9 @@ class svn_changelist_receiver_t:
"""Set an attribute on this object"""
self.assert_valid()
-
-
-
+ # Save a copy of the object, so that the garbage
+ # collector won't kill the object while it's in
+ # SWIG-land
self.__dict__.setdefault("_members",{})[name] = value
return _swig_setattr(self, self.__class__, name, value)
diff --git a/subversion/bindings/swig/ruby/core.c b/subversion/bindings/swig/ruby/core.c
index 69fd53d..f3d293f 100644
--- a/subversion/bindings/swig/ruby/core.c
+++ b/subversion/bindings/swig/ruby/core.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1800,33 +1789,33 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_apr_finfo_t swig_types[5]
#define SWIGTYPE_p_apr_getopt_option_t swig_types[6]
#define SWIGTYPE_p_apr_getopt_t swig_types[7]
-#define SWIGTYPE_p_apr_hash_index_t swig_types[8]
-#define SWIGTYPE_p_apr_hash_t swig_types[9]
-#define SWIGTYPE_p_apr_int32_t swig_types[10]
-#define SWIGTYPE_p_apr_int64_t swig_types[11]
-#define SWIGTYPE_p_apr_off_t swig_types[12]
-#define SWIGTYPE_p_apr_pool_t swig_types[13]
-#define SWIGTYPE_p_apr_pool_wrapper_t swig_types[14]
-#define SWIGTYPE_p_apr_proc_t swig_types[15]
-#define SWIGTYPE_p_apr_size_t swig_types[16]
-#define SWIGTYPE_p_apr_uint32_t swig_types[17]
-#define SWIGTYPE_p_char swig_types[18]
-#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[22]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[31]
-#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[32]
-#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[33]
-#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[34]
+#define SWIGTYPE_p_apr_hash_t swig_types[8]
+#define SWIGTYPE_p_apr_int32_t swig_types[9]
+#define SWIGTYPE_p_apr_int64_t swig_types[10]
+#define SWIGTYPE_p_apr_off_t swig_types[11]
+#define SWIGTYPE_p_apr_pool_t swig_types[12]
+#define SWIGTYPE_p_apr_pool_wrapper_t swig_types[13]
+#define SWIGTYPE_p_apr_proc_t swig_types[14]
+#define SWIGTYPE_p_apr_size_t swig_types[15]
+#define SWIGTYPE_p_apr_uint32_t swig_types[16]
+#define SWIGTYPE_p_char swig_types[17]
+#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_apr_uint32_t_p_p_void_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_p_char_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_p_struct_svn_auth_provider_object_t_p_apr_pool_t__void swig_types[21]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_simple_t_p_void_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_p_void_p_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_p_void_p_void_p_void_p_apr_hash_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__int swig_types[30]
+#define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int swig_types[31]
+#define SWIGTYPE_p_f_p_q_const__char_p_void__int swig_types[32]
+#define SWIGTYPE_p_f_p_q_const__char_p_void_p_apr_pool_t__int swig_types[33]
+#define SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int swig_types[34]
#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[35]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[36]
#define SWIGTYPE_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[37]
@@ -1844,104 +1833,105 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t swig_types[49]
#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t swig_types[50]
#define SWIGTYPE_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[52]
-#define SWIGTYPE_p_f_p_void_p_void__void swig_types[53]
-#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[54]
-#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[55]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[56]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[57]
-#define SWIGTYPE_p_int swig_types[58]
-#define SWIGTYPE_p_long swig_types[59]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[60]
-#define SWIGTYPE_p_p_apr_file_t swig_types[61]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[62]
-#define SWIGTYPE_p_p_char swig_types[63]
-#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[64]
-#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[65]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[66]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[67]
-#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[68]
-#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[69]
-#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[70]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[71]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[72]
-#define SWIGTYPE_p_p_svn_config_t swig_types[73]
-#define SWIGTYPE_p_p_svn_diff_t swig_types[74]
-#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[75]
-#define SWIGTYPE_p_p_svn_patch_file_t swig_types[76]
-#define SWIGTYPE_p_p_svn_patch_t swig_types[77]
-#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[78]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[79]
-#define SWIGTYPE_p_p_svn_string_t swig_types[80]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[81]
-#define SWIGTYPE_p_p_void swig_types[82]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[83]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[84]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[85]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[86]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[87]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[88]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[89]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[90]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[91]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[92]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[93]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[94]
-#define SWIGTYPE_p_svn_checksum_t swig_types[95]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[96]
-#define SWIGTYPE_p_svn_config_t swig_types[97]
-#define SWIGTYPE_p_svn_depth_t swig_types[98]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[99]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[100]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[101]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[102]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[103]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[104]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[105]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[106]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[107]
-#define SWIGTYPE_p_svn_diff_t swig_types[108]
-#define SWIGTYPE_p_svn_dirent_t swig_types[109]
-#define SWIGTYPE_p_svn_errno_t swig_types[110]
-#define SWIGTYPE_p_svn_error_t swig_types[111]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[112]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[113]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[114]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[115]
-#define SWIGTYPE_p_svn_lock_t swig_types[116]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[117]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[118]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[119]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[120]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[121]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[122]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[123]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[124]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[125]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[126]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[127]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[128]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[129]
-#define SWIGTYPE_p_svn_patch_t swig_types[130]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[131]
-#define SWIGTYPE_p_svn_prop_kind swig_types[132]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[133]
-#define SWIGTYPE_p_svn_prop_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[135]
-#define SWIGTYPE_p_svn_stream_t swig_types[136]
-#define SWIGTYPE_p_svn_string_t swig_types[137]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[138]
-#define SWIGTYPE_p_svn_tristate_t swig_types[139]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[140]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[141]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[142]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[143]
-#define SWIGTYPE_p_svn_version_t swig_types[144]
-#define SWIGTYPE_p_unsigned_char swig_types[145]
-#define SWIGTYPE_p_unsigned_long swig_types[146]
-#define SWIGTYPE_p_void swig_types[147]
-static swig_type_info *swig_types[149];
-static swig_module_info swig_module = {swig_types, 148, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[53]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[54]
+#define SWIGTYPE_p_f_p_void_p_void_p_void_p_int__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_f_p_void_svn_diff_datasource_e__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[57]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[58]
+#define SWIGTYPE_p_int swig_types[59]
+#define SWIGTYPE_p_long swig_types[60]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[61]
+#define SWIGTYPE_p_p_apr_file_t swig_types[62]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[63]
+#define SWIGTYPE_p_p_char swig_types[64]
+#define SWIGTYPE_p_p_svn_auth_baton_t swig_types[65]
+#define SWIGTYPE_p_p_svn_auth_cred_simple_t swig_types[66]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[67]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_client_cert_t swig_types[68]
+#define SWIGTYPE_p_p_svn_auth_cred_ssl_server_trust_t swig_types[69]
+#define SWIGTYPE_p_p_svn_auth_cred_username_t swig_types[70]
+#define SWIGTYPE_p_p_svn_auth_iterstate_t swig_types[71]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[72]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[73]
+#define SWIGTYPE_p_p_svn_config_t swig_types[74]
+#define SWIGTYPE_p_p_svn_diff_t swig_types[75]
+#define SWIGTYPE_p_p_svn_io_dirent2_t swig_types[76]
+#define SWIGTYPE_p_p_svn_patch_file_t swig_types[77]
+#define SWIGTYPE_p_p_svn_patch_t swig_types[78]
+#define SWIGTYPE_p_p_svn_stream_mark_t swig_types[79]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[80]
+#define SWIGTYPE_p_p_svn_string_t swig_types[81]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[82]
+#define SWIGTYPE_p_p_void swig_types[83]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[84]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[85]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[86]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[87]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[88]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[89]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[90]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[91]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[92]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[93]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[94]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[95]
+#define SWIGTYPE_p_svn_checksum_t swig_types[96]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[97]
+#define SWIGTYPE_p_svn_config_t swig_types[98]
+#define SWIGTYPE_p_svn_depth_t swig_types[99]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[100]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[101]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[102]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[103]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[104]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[105]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[106]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[107]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[108]
+#define SWIGTYPE_p_svn_diff_t swig_types[109]
+#define SWIGTYPE_p_svn_dirent_t swig_types[110]
+#define SWIGTYPE_p_svn_errno_t swig_types[111]
+#define SWIGTYPE_p_svn_error_t swig_types[112]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[113]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[114]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[115]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[116]
+#define SWIGTYPE_p_svn_lock_t swig_types[117]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[118]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[119]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[120]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[121]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[122]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[123]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[124]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[125]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[126]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[127]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t_desc_overrides swig_types[128]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[129]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[130]
+#define SWIGTYPE_p_svn_patch_t swig_types[131]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[132]
+#define SWIGTYPE_p_svn_prop_kind swig_types[133]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[134]
+#define SWIGTYPE_p_svn_prop_t swig_types[135]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[136]
+#define SWIGTYPE_p_svn_stream_t swig_types[137]
+#define SWIGTYPE_p_svn_string_t swig_types[138]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[139]
+#define SWIGTYPE_p_svn_tristate_t swig_types[140]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[141]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[142]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[143]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[144]
+#define SWIGTYPE_p_svn_version_t swig_types[145]
+#define SWIGTYPE_p_unsigned_char swig_types[146]
+#define SWIGTYPE_p_unsigned_long swig_types[147]
+#define SWIGTYPE_p_void swig_types[148]
+static swig_type_info *swig_types[150];
+static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1956,7 +1946,7 @@ static VALUE mCore;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2107,7 +2097,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2318,7 +2308,7 @@ typedef struct {
#include "svn_auth.h"
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2440,8 +2430,8 @@ static svn_boolean_t svn_config_invoke_enumerator2(
}
static svn_error_t * svn_config_invoke_auth_walk_func(
- svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *cleanup_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
- return _obj(delete_cred, cleanup_baton, cred_kind, realmstring, hash, scratch_pool);
+ svn_config_auth_walk_func_t _obj, svn_boolean_t *delete_cred, void *walk_baton, const char *cred_kind, const char *realmstring, apr_hash_t *hash, apr_pool_t *scratch_pool) {
+ return _obj(delete_cred, walk_baton, cred_kind, realmstring, hash, scratch_pool);
}
@@ -2504,6 +2494,11 @@ static svn_error_t * svn_stream_invoke_seek_fn(
return _obj(baton, mark);
}
+static svn_error_t * svn_stream_invoke_data_available_fn(
+ svn_stream_data_available_fn_t _obj, void *baton, svn_boolean_t *data_available) {
+ return _obj(baton, data_available);
+}
+
static svn_error_t * svn_stream_invoke_lazyopen_func(
svn_stream_lazyopen_func_t _obj, svn_stream_t **stream, void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool) {
return _obj(stream, baton, result_pool, scratch_pool);
@@ -3684,100 +3679,6 @@ free_svn_error_t(struct svn_error_t *arg1) {
}
SWIGINTERN VALUE
-_wrap_svn__apr_hash_index_key(int argc, VALUE *argv, VALUE self) {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "apr_hash_index_t const *","svn__apr_hash_index_key", 1, argv[0] ));
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = (void *)svn__apr_hash_index_key((apr_hash_index_t const *)arg1);
-
-
-
- }
- {
- char *value = result;
- if (value) {
- vresult = rb_str_new2(value);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn__apr_hash_index_klen(int argc, VALUE *argv, VALUE self) {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- apr_ssize_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "apr_hash_index_t const *","svn__apr_hash_index_klen", 1, argv[0] ));
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = svn__apr_hash_index_klen((apr_hash_index_t const *)arg1);
-
-
-
- }
- vresult = SWIG_From_long((long)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn__apr_hash_index_val(int argc, VALUE *argv, VALUE self) {
- apr_hash_index_t *arg1 = (apr_hash_index_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_apr_hash_index_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "apr_hash_index_t const *","svn__apr_hash_index_val", 1, argv[0] ));
- }
- arg1 = (apr_hash_index_t *)(argp1);
- {
- result = (void *)svn__apr_hash_index_val((apr_hash_index_t const *)arg1);
-
-
-
- }
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 );
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
_wrap_svn_node_kind_to_word(int argc, VALUE *argv, VALUE self) {
svn_node_kind_t arg1 ;
int val1 ;
@@ -8581,6 +8482,57 @@ free_svn_version_checklist_t(struct svn_version_checklist_t *arg1) {
}
SWIGINTERN VALUE
+_wrap_svn_ver_check_list2(int argc, VALUE *argv, VALUE self) {
+ svn_version_t *arg1 = (svn_version_t *) 0 ;
+ svn_version_checklist_t *arg2 = (svn_version_checklist_t *) 0 ;
+ svn_boolean_t (*arg3)(svn_version_t const *,svn_version_t const *) = (svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 3) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_version_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_version_t const *","svn_ver_check_list2", 1, argv[0] ));
+ }
+ arg1 = (svn_version_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_version_checklist_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_version_checklist_t const *","svn_ver_check_list2", 2, argv[1] ));
+ }
+ arg2 = (svn_version_checklist_t *)(argp2);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[2], (void**)(&arg3), SWIGTYPE_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)","svn_ver_check_list2", 3, argv[2] ));
+ }
+ }
+ {
+ result = (svn_error_t *)svn_ver_check_list2((struct svn_version_t const *)arg1,(struct svn_version_checklist_t const *)arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_ver_check_list(int argc, VALUE *argv, VALUE self) {
svn_version_t *arg1 = (svn_version_t *) 0 ;
svn_version_checklist_t *arg2 = (svn_version_checklist_t *) 0 ;
@@ -13493,6 +13445,120 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_cmdline_create_auth_baton2(int argc, VALUE *argv, VALUE self) {
+ svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
+ svn_boolean_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_config_t *arg12 = (svn_config_t *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_auth_baton_t *temp1 ;
+ void *argp12 = 0 ;
+ int res12 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg15);
+ _global_pool = arg15;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 12) || (argc > 13)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 12)",argc); SWIG_fail;
+ }
+ arg2 = RTEST(argv[0]);
+ {
+ if (NIL_P(argv[1])) {
+ arg3 = NULL;
+ } else {
+ arg3 = StringValuePtr(argv[1]);
+ }
+ }
+ {
+ if (NIL_P(argv[2])) {
+ arg4 = NULL;
+ } else {
+ arg4 = StringValuePtr(argv[2]);
+ }
+ }
+ {
+ if (NIL_P(argv[3])) {
+ arg5 = NULL;
+ } else {
+ arg5 = StringValuePtr(argv[3]);
+ }
+ }
+ arg6 = RTEST(argv[4]);
+ arg7 = RTEST(argv[5]);
+ arg8 = RTEST(argv[6]);
+ arg9 = RTEST(argv[7]);
+ arg10 = RTEST(argv[8]);
+ arg11 = RTEST(argv[9]);
+ res12 = SWIG_ConvertPtr(argv[10], &argp12,SWIGTYPE_p_svn_config_t, 0 | 0 );
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), Ruby_Format_TypeError( "", "svn_config_t *","svn_cmdline_create_auth_baton2", 12, argv[10] ));
+ }
+ arg12 = (svn_config_t *)(argp12);
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg14 = (void *)svn_swig_rb_make_baton(argv[11], _global_svn_swig_rb_pool);
+ }
+ if (argc > 12) {
+
+ }
+ {
+ result = (svn_error_t *)svn_cmdline_create_auth_baton2(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_auth_baton_t, 0));
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg14);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_cmdline_create_auth_baton(int argc, VALUE *argv, VALUE self) {
svn_auth_baton_t **arg1 = (svn_auth_baton_t **) 0 ;
svn_boolean_t arg2 ;
@@ -13552,7 +13618,7 @@ _wrap_svn_cmdline_create_auth_baton(int argc, VALUE *argv, VALUE self) {
}
arg8 = (svn_config_t *)(argp8);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -15795,7 +15861,7 @@ _wrap_svn_auth_get_simple_prompt_provider(int argc, VALUE *argv, VALUE self) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_simple_prompt_func;
+ arg2 = (svn_auth_simple_prompt_func_t) svn_swig_rb_auth_simple_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -15859,7 +15925,7 @@ _wrap_svn_auth_get_username_prompt_provider(int argc, VALUE *argv, VALUE self) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_username_prompt_func;
+ arg2 = (svn_auth_username_prompt_func_t) svn_swig_rb_auth_username_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -16444,7 +16510,7 @@ _wrap_svn_auth_get_ssl_server_trust_prompt_provider(int argc, VALUE *argv, VALUE
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_server_trust_prompt_func;
+ arg2 = (svn_auth_ssl_server_trust_prompt_func_t) svn_swig_rb_auth_ssl_server_trust_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
if (argc > 1) {
@@ -16503,7 +16569,7 @@ _wrap_svn_auth_get_ssl_client_cert_prompt_provider(int argc, VALUE *argv, VALUE
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -16567,7 +16633,7 @@ _wrap_svn_auth_get_ssl_client_cert_pw_prompt_provider(int argc, VALUE *argv, VAL
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_pw_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -18755,7 +18821,7 @@ _wrap_svn_config_enumerate_sections2(int argc, VALUE *argv, VALUE self) {
}
arg1 = (svn_config_t *)(argp1);
{
- arg2 = svn_swig_rb_config_section_enumerator;
+ arg2 = (svn_config_section_enumerator2_t) svn_swig_rb_config_section_enumerator;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
if (argc > 2) {
@@ -18877,7 +18943,7 @@ _wrap_svn_config_enumerate2(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_config_enumerator;
+ arg3 = (svn_config_enumerator2_t) svn_swig_rb_config_enumerator;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -19690,14 +19756,14 @@ _wrap_svn_config_dup(int argc, VALUE *argv, VALUE self) {
}
res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_config_t, 0 | 0 );
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_config_t *","svn_config_dup", 2, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_config_t const *","svn_config_dup", 2, argv[0] ));
}
arg2 = (svn_config_t *)(argp2);
if (argc > 1) {
}
{
- result = (svn_error_t *)svn_config_dup(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_config_dup(arg1,(struct svn_config_t const *)arg2,arg3);
@@ -22902,6 +22968,77 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_relpath_prefix(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ int arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+ char *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 2) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_relpath_prefix", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ ecode2 = SWIG_AsVal_int(argv[1], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","svn_relpath_prefix", 2, argv[1] ));
+ }
+ arg2 = (int)(val2);
+ if (argc > 2) {
+
+ }
+ {
+ result = (char *)svn_relpath_prefix((char const *)arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ vresult = rb_str_new2(result);
+ } else {
+ vresult = Qnil;
+ }
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_uri_split(int argc, VALUE *argv, VALUE self) {
char **arg1 = (char **) 0 ;
char **arg2 = (char **) 0 ;
@@ -27555,6 +27692,148 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_io_file_create_bytes(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 3) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_io_file_create_bytes", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void const *","svn_io_file_create_bytes", 2, argv[1] ));
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "apr_size_t","svn_io_file_create_bytes", 3, argv[2] ));
+ }
+ arg3 = (apr_size_t)(val3);
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_create_bytes((char const *)arg1,(void const *)arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_io_file_create_empty(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg2);
+ _global_pool = arg2;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 1) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_io_file_create_empty", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ if (argc > 1) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_create_empty((char const *)arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_io_lock_open_file(int argc, VALUE *argv, VALUE self) {
apr_file_t *arg1 = (apr_file_t *) 0 ;
svn_boolean_t arg2 ;
@@ -27673,6 +27952,42 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stream_set_read2(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_read_fn_t arg2 = (svn_read_fn_t) 0 ;
+ svn_read_fn_t arg3 = (svn_read_fn_t) 0 ;
+
+ if ((argc < 3) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[1], (void**)(&arg2), SWIGTYPE_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_read_fn_t","svn_stream_set_read2", 2, argv[1] ));
+ }
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[2], (void**)(&arg3), SWIGTYPE_p_f_p_void_p_char_p_apr_size_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_read_fn_t","svn_stream_set_read2", 3, argv[2] ));
+ }
+ }
+ {
+ svn_stream_set_read2(arg1,arg2,arg3);
+
+
+
+ }
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_set_skip(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_stream_skip_fn_t arg2 = (svn_stream_skip_fn_t) 0 ;
@@ -27760,6 +28075,35 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stream_set_data_available(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_data_available_fn_t arg2 = (svn_stream_data_available_fn_t) 0 ;
+
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[1], (void**)(&arg2), SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_stream_data_available_fn_t","svn_stream_set_data_available", 2, argv[1] ));
+ }
+ }
+ {
+ svn_stream_set_data_available(arg1,arg2);
+
+
+
+ }
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_empty(int argc, VALUE *argv, VALUE self) {
apr_pool_t *arg1 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
@@ -28432,6 +28776,81 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stringbuf_from_stream(int argc, VALUE *argv, VALUE self) {
+ svn_stringbuf_t **arg1 = (svn_stringbuf_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ apr_size_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_stringbuf_t *temp1 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ arg2 = svn_swig_rb_make_stream(argv[0]);
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long(argv[1], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "apr_size_t","svn_stringbuf_from_stream", 3, argv[1] ));
+ }
+ arg3 = (apr_size_t)(val3);
+ if (argc > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_stringbuf_from_stream(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ if (*arg1) {
+ vresult = SWIG_Ruby_AppendOutput(vresult, rb_str_new((*arg1)->data, (*arg1)->len));
+ } else {
+ vresult = SWIG_Ruby_AppendOutput(vresult, Qnil);
+ }
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_from_stringbuf(int argc, VALUE *argv, VALUE self) {
svn_stringbuf_t *arg1 = (svn_stringbuf_t *) 0 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
@@ -28725,6 +29144,119 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stream_read_full(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ temp2 = NUM2LONG(argv[1]);
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ {
+ result = (svn_error_t *)svn_stream_read_full(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg3 == 0 ? Qnil : rb_str_new(arg2, *arg3));
+ free(arg2);
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_stream_supports_partial_read(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_boolean_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ result = (svn_boolean_t)svn_stream_supports_partial_read(arg1);
+
+
+
+ }
+ vresult = result ? Qtrue : Qfalse;
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_stream_read2(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_size_t *arg3 = (apr_size_t *) 0 ;
+ apr_size_t temp2 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ temp2 = NUM2LONG(argv[1]);
+ arg2 = malloc(temp2);
+ arg3 = (apr_size_t *)&temp2;
+ }
+ {
+ result = (svn_error_t *)svn_stream_read2(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg3 == 0 ? Qnil : rb_str_new(arg2, *arg3));
+ free(arg2);
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_read(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -29050,6 +29582,44 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stream_data_available(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_boolean_t *arg2 = (svn_boolean_t *) 0 ;
+ svn_boolean_t temp2 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ arg2 = &temp2;
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ result = (svn_error_t *)svn_stream_data_available(arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg2 ? Qtrue : Qfalse);
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_tee(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_stream_t *arg2 = (svn_stream_t *) 0 ;
@@ -29257,7 +29827,7 @@ _wrap_svn_stream_copy3(int argc, VALUE *argv, VALUE self) {
arg2 = svn_swig_rb_make_stream(argv[1]);
}
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -29327,7 +29897,7 @@ _wrap_svn_stream_copy2(int argc, VALUE *argv, VALUE self) {
arg2 = svn_swig_rb_make_stream(argv[1]);
}
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -30027,7 +30597,7 @@ _wrap_svn_io_remove_dir2(int argc, VALUE *argv, VALUE self) {
arg1 = (char *)(buf1);
arg2 = RTEST(argv[1]);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -31415,6 +31985,225 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_io_file_aligned_seek(int argc, VALUE *argv, VALUE self) {
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_off_t arg2 ;
+ apr_off_t *arg3 = (apr_off_t *) 0 ;
+ apr_off_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_file(argv[0], _global_pool);
+ }
+ {
+ arg2 = (apr_off_t)NUM2LL(argv[1]);
+ }
+ res3 = SWIG_ConvertPtr(argv[2], &argp3,SWIGTYPE_p_apr_off_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "apr_off_t *","svn_io_file_aligned_seek", 3, argv[2] ));
+ }
+ arg3 = (apr_off_t *)(argp3);
+ {
+ arg4 = (apr_off_t)NUM2LL(argv[3]);
+ }
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_aligned_seek(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_io_file_flush(int argc, VALUE *argv, VALUE self) {
+ apr_file_t *arg1 = (apr_file_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg2);
+ _global_pool = arg2;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 1) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_file(argv[0], _global_pool);
+ }
+ if (argc > 1) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_file_flush(arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_io_write_atomic(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_size_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ unsigned long val3 ;
+ int ecode3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_io_write_atomic", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void const *","svn_io_write_atomic", 2, argv[1] ));
+ }
+ ecode3 = SWIG_AsVal_unsigned_SS_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "apr_size_t","svn_io_write_atomic", 3, argv[2] ));
+ }
+ arg3 = (apr_size_t)(val3);
+ res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_io_write_atomic", 4, argv[3] ));
+ }
+ arg4 = (char *)(buf4);
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_io_write_atomic((char const *)arg1,(void const *)arg2,arg3,(char const *)arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_io_write_unique(int argc, VALUE *argv, VALUE self) {
char **arg1 = (char **) 0 ;
char *arg2 = (char *) 0 ;
@@ -32111,6 +32900,53 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_stream_invoke_data_available_fn(int argc, VALUE *argv, VALUE self) {
+ svn_stream_data_available_fn_t arg1 = (svn_stream_data_available_fn_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_boolean_t *arg3 = (svn_boolean_t *) 0 ;
+ int res2 ;
+ svn_boolean_t temp3 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ arg3 = &temp3;
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_svn_boolean_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_stream_data_available_fn_t","svn_stream_invoke_data_available_fn", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_stream_invoke_data_available_fn", 2, argv[1] ));
+ }
+ {
+ result = (svn_error_t *)svn_stream_invoke_data_available_fn(arg1,arg2,arg3);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg3 ? Qtrue : Qfalse);
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_stream_invoke_lazyopen_func(int argc, VALUE *argv, VALUE self) {
svn_stream_lazyopen_func_t arg1 = (svn_stream_lazyopen_func_t) 0 ;
svn_stream_t **arg2 = (svn_stream_t **) 0 ;
@@ -32308,16 +33144,7 @@ _wrap_svn_checksum_t_digest_set(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_checksum_t *","digest", 1, self ));
}
arg1 = (struct svn_checksum_t *)(argp1);
- {
- if (NIL_P(argv[0])) {
- arg2 = NULL;
- } else if (RSTRING_LEN(argv[0]) != APR_MD5_DIGESTSIZE) {
- rb_raise(rb_eArgError, "digest size (%d) must be %d",
- RSTRING_LEN(argv[0]), APR_MD5_DIGESTSIZE);
- } else {
- arg2 = (unsigned char *)StringValuePtr(argv[0]);
- }
- }
+
if (arg1) (arg1)->digest = (unsigned char const *)arg2;
return vresult;
@@ -33488,7 +34315,7 @@ _wrap_svn_auth_set_gnome_keyring_unlock_prompt_func(int argc, VALUE *argv, VALUE
}
arg1 = (svn_auth_baton_t *)(argp1);
{
- arg2 = svn_swig_rb_auth_gnome_keyring_unlock_prompt_func;
+ arg2 = (svn_auth_gnome_keyring_unlock_prompt_func_t) svn_swig_rb_auth_gnome_keyring_unlock_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
{
@@ -33541,7 +34368,16 @@ _wrap_svn_md5_digest_to_cstring_display(int argc, VALUE *argv, VALUE self) {
if ((argc < 1) || (argc > 2)) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
-
+ {
+ if (NIL_P(argv[0])) {
+ arg1 = NULL;
+ } else if (RSTRING_LEN(argv[0]) != APR_MD5_DIGESTSIZE) {
+ rb_raise(rb_eArgError, "digest size (%d) must be %d",
+ RSTRING_LEN(argv[0]), APR_MD5_DIGESTSIZE);
+ } else {
+ arg1 = (unsigned char *)StringValuePtr(argv[0]);
+ }
+ }
if (argc > 1) {
}
@@ -33596,7 +34432,16 @@ _wrap_svn_md5_digest_to_cstring(int argc, VALUE *argv, VALUE self) {
if ((argc < 1) || (argc > 2)) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
-
+ {
+ if (NIL_P(argv[0])) {
+ arg1 = NULL;
+ } else if (RSTRING_LEN(argv[0]) != APR_MD5_DIGESTSIZE) {
+ rb_raise(rb_eArgError, "digest size (%d) must be %d",
+ RSTRING_LEN(argv[0]), APR_MD5_DIGESTSIZE);
+ } else {
+ arg1 = (unsigned char *)StringValuePtr(argv[0]);
+ }
+ }
if (argc > 1) {
}
@@ -35490,6 +36335,65 @@ free_svn_diff_output_fns_t(struct svn_diff_output_fns_t *arg1) {
}
SWIGINTERN VALUE
+_wrap_svn_diff_output2(int argc, VALUE *argv, VALUE self) {
+ svn_diff_t *arg1 = (svn_diff_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_diff_output_fns_t *arg3 = (svn_diff_output_fns_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 4) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_diff_t *","svn_diff_output2", 1, argv[0] ));
+ }
+ arg1 = (svn_diff_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_diff_output2", 2, argv[1] ));
+ }
+ res3 = SWIG_ConvertPtr(argv[2], &argp3,SWIGTYPE_p_svn_diff_output_fns_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_diff_output_fns_t const *","svn_diff_output2", 3, argv[2] ));
+ }
+ arg3 = (svn_diff_output_fns_t *)(argp3);
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
+ }
+ {
+ result = (svn_error_t *)svn_diff_output2(arg1,arg2,(struct svn_diff_output_fns_t const *)arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg5);
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_output(int argc, VALUE *argv, VALUE self) {
svn_diff_t *arg1 = (svn_diff_t *) 0 ;
void *arg2 = (void *) 0 ;
@@ -35688,6 +36592,59 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_diff_file_options_t_context_size_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_diff_file_options_t *","context_size", 1, self ));
+ }
+ arg1 = (struct svn_diff_file_options_t *)(argp1);
+ ecode2 = SWIG_AsVal_int(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","context_size", 2, argv[0] ));
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->context_size = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_diff_file_options_t_context_size_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_diff_file_options_t *arg1 = (struct svn_diff_file_options_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_diff_file_options_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_diff_file_options_t *","context_size", 1, self ));
+ }
+ arg1 = (struct svn_diff_file_options_t *)(argp1);
+ result = (int) ((arg1)->context_size);
+ vresult = SWIG_From_int((int)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
SWIGINTERN VALUE
_wrap_svn_diff_file_options_t_allocate(VALUE self) {
@@ -36399,6 +37356,164 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_diff_file_output_unified4(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ svn_boolean_t arg9 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_diff_t *","svn_diff_file_output_unified4", 2, argv[1] ));
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_unified4", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_unified4", 4, argv[3] ));
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_unified4", 5, argv[4] ));
+ }
+ arg5 = (char *)(buf5);
+ res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_unified4", 6, argv[5] ));
+ }
+ arg6 = (char *)(buf6);
+ {
+ arg7 = NULL;
+
+ if (NIL_P(argv[6])) {
+
+ } else if (TYPE(argv[6]) == T_FIXNUM) {
+ arg7 = (char *)NUM2INT(argv[6]);
+ if (!(arg7 == APR_LOCALE_CHARSET || arg7 == APR_DEFAULT_CHARSET)) {
+ arg7 = NULL;
+ }
+ } else {
+ arg7 = StringValuePtr(argv[6]);
+ }
+
+ if (!arg7) {
+ arg7 = (char *)APR_LOCALE_CHARSET;
+ }
+ }
+ res8 = SWIG_AsCharPtrAndSize(argv[7], &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_unified4", 8, argv[7] ));
+ }
+ arg8 = (char *)(buf8);
+ arg9 = RTEST(argv[8]);
+ ecode10 = SWIG_AsVal_int(argv[9], &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), Ruby_Format_TypeError( "", "int","svn_diff_file_output_unified4", 10, argv[9] ));
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg12 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
+ }
+ if (argc > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_file_output_unified4(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg12);
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_file_output_unified3(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_diff_t *arg2 = (svn_diff_t *) 0 ;
@@ -36777,6 +37892,153 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_diff_file_output_merge3(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_diff_t *","svn_diff_file_output_merge3", 2, argv[1] ));
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_merge3", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_merge3", 4, argv[3] ));
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_diff_file_output_merge3", 5, argv[4] ));
+ }
+ arg5 = (char *)(buf5);
+ {
+ if (NIL_P(argv[5])) {
+ arg6 = NULL;
+ } else {
+ arg6 = StringValuePtr(argv[5]);
+ }
+ }
+ {
+ if (NIL_P(argv[6])) {
+ arg7 = NULL;
+ } else {
+ arg7 = StringValuePtr(argv[6]);
+ }
+ }
+ {
+ if (NIL_P(argv[7])) {
+ arg8 = NULL;
+ } else {
+ arg8 = StringValuePtr(argv[7]);
+ }
+ }
+ {
+ if (NIL_P(argv[8])) {
+ arg9 = NULL;
+ } else {
+ arg9 = StringValuePtr(argv[8]);
+ }
+ }
+ ecode10 = SWIG_AsVal_int(argv[9], &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), Ruby_Format_TypeError( "", "svn_diff_conflict_display_style_t","svn_diff_file_output_merge3", 10, argv[9] ));
+ }
+ arg10 = (svn_diff_conflict_display_style_t)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg12 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
+ }
+ if (argc > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_file_output_merge3(arg1,arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg12);
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_file_output_merge2(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_diff_t *arg2 = (svn_diff_t *) 0 ;
@@ -37049,6 +38311,80 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_diff_output_binary(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_stream_t *arg3 = (svn_stream_t *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ {
+ arg2 = svn_swig_rb_make_stream(argv[1]);
+ }
+ {
+ arg3 = svn_swig_rb_make_stream(argv[2]);
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
+ }
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_output_binary(arg1,arg2,arg3,arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg5);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_mem_string_diff(int argc, VALUE *argv, VALUE self) {
svn_diff_t **arg1 = (svn_diff_t **) 0 ;
svn_string_t *arg2 = (svn_string_t *) 0 ;
@@ -37349,6 +38685,164 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_diff_mem_string_output_unified3(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_boolean_t arg3 ;
+ char *arg4 = (char *) 0 ;
+ char *arg5 = (char *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ svn_string_t *arg8 = (svn_string_t *) 0 ;
+ svn_string_t *arg9 = (svn_string_t *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ int res6 ;
+ char *buf6 = 0 ;
+ int alloc6 = 0 ;
+ svn_string_t value8 ;
+ svn_string_t value9 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_diff_t *","svn_diff_mem_string_output_unified3", 2, argv[1] ));
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ arg3 = RTEST(argv[2]);
+ res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_diff_mem_string_output_unified3", 4, argv[3] ));
+ }
+ arg4 = (char *)(buf4);
+ res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_diff_mem_string_output_unified3", 5, argv[4] ));
+ }
+ arg5 = (char *)(buf5);
+ res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","svn_diff_mem_string_output_unified3", 6, argv[5] ));
+ }
+ arg6 = (char *)(buf6);
+ {
+ arg7 = NULL;
+
+ if (NIL_P(argv[6])) {
+
+ } else if (TYPE(argv[6]) == T_FIXNUM) {
+ arg7 = (char *)NUM2INT(argv[6]);
+ if (!(arg7 == APR_LOCALE_CHARSET || arg7 == APR_DEFAULT_CHARSET)) {
+ arg7 = NULL;
+ }
+ } else {
+ arg7 = StringValuePtr(argv[6]);
+ }
+
+ if (!arg7) {
+ arg7 = (char *)APR_LOCALE_CHARSET;
+ }
+ }
+ {
+ if (NIL_P(argv[7])) {
+ arg8 = NULL;
+ } else {
+ value8.data = StringValuePtr(argv[7]);
+ value8.len = RSTRING_LEN(argv[7]);
+ arg8 = &value8;
+ }
+ }
+ {
+ if (NIL_P(argv[8])) {
+ arg9 = NULL;
+ } else {
+ value9.data = StringValuePtr(argv[8]);
+ value9.len = RSTRING_LEN(argv[8]);
+ arg9 = &value9;
+ }
+ }
+ ecode10 = SWIG_AsVal_int(argv[9], &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), Ruby_Format_TypeError( "", "int","svn_diff_mem_string_output_unified3", 10, argv[9] ));
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg12 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
+ }
+ if (argc > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_mem_string_output_unified3(arg1,arg2,arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(struct svn_string_t const *)arg8,(struct svn_string_t const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg12);
+ }
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ if (alloc6 == SWIG_NEWOBJ) free((char*)buf6);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_mem_string_output_unified2(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_diff_t *arg2 = (svn_diff_t *) 0 ;
@@ -37618,6 +39112,153 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_diff_mem_string_output_merge3(int argc, VALUE *argv, VALUE self) {
+ svn_stream_t *arg1 = (svn_stream_t *) 0 ;
+ svn_diff_t *arg2 = (svn_diff_t *) 0 ;
+ svn_string_t *arg3 = (svn_string_t *) 0 ;
+ svn_string_t *arg4 = (svn_string_t *) 0 ;
+ svn_string_t *arg5 = (svn_string_t *) 0 ;
+ char *arg6 = (char *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ svn_diff_conflict_display_style_t arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_string_t value3 ;
+ svn_string_t value4 ;
+ svn_string_t value5 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_make_stream(argv[0]);
+ }
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_diff_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_diff_t *","svn_diff_mem_string_output_merge3", 2, argv[1] ));
+ }
+ arg2 = (svn_diff_t *)(argp2);
+ {
+ if (NIL_P(argv[2])) {
+ arg3 = NULL;
+ } else {
+ value3.data = StringValuePtr(argv[2]);
+ value3.len = RSTRING_LEN(argv[2]);
+ arg3 = &value3;
+ }
+ }
+ {
+ if (NIL_P(argv[3])) {
+ arg4 = NULL;
+ } else {
+ value4.data = StringValuePtr(argv[3]);
+ value4.len = RSTRING_LEN(argv[3]);
+ arg4 = &value4;
+ }
+ }
+ {
+ if (NIL_P(argv[4])) {
+ arg5 = NULL;
+ } else {
+ value5.data = StringValuePtr(argv[4]);
+ value5.len = RSTRING_LEN(argv[4]);
+ arg5 = &value5;
+ }
+ }
+ {
+ if (NIL_P(argv[5])) {
+ arg6 = NULL;
+ } else {
+ arg6 = StringValuePtr(argv[5]);
+ }
+ }
+ {
+ if (NIL_P(argv[6])) {
+ arg7 = NULL;
+ } else {
+ arg7 = StringValuePtr(argv[6]);
+ }
+ }
+ {
+ if (NIL_P(argv[7])) {
+ arg8 = NULL;
+ } else {
+ arg8 = StringValuePtr(argv[7]);
+ }
+ }
+ {
+ if (NIL_P(argv[8])) {
+ arg9 = NULL;
+ } else {
+ arg9 = StringValuePtr(argv[8]);
+ }
+ }
+ ecode10 = SWIG_AsVal_int(argv[9], &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), Ruby_Format_TypeError( "", "svn_diff_conflict_display_style_t","svn_diff_mem_string_output_merge3", 10, argv[9] ));
+ }
+ arg10 = (svn_diff_conflict_display_style_t)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg12 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
+ }
+ if (argc > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_diff_mem_string_output_merge3(arg1,arg2,(struct svn_string_t const *)arg3,(struct svn_string_t const *)arg4,(struct svn_string_t const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg12);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_diff_mem_string_output_merge2(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
svn_diff_t *arg2 = (svn_diff_t *) 0 ;
@@ -39036,6 +40677,108 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_patch_t_mergeinfo_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_patch_t *","mergeinfo", 1, self ));
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ {
+ arg2 = svn_swig_rb_hash_to_apr_hash_merge_range(argv[0], _global_pool);
+ }
+ if (arg1) (arg1)->mergeinfo = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_patch_t_mergeinfo_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_mergeinfo_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_patch_t *","mergeinfo", 1, self ));
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ result = (svn_mergeinfo_t) ((arg1)->mergeinfo);
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_patch_t_reverse_mergeinfo_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ svn_mergeinfo_t arg2 = (svn_mergeinfo_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_patch_t *","reverse_mergeinfo", 1, self ));
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_apr_hash_t, SWIG_POINTER_DISOWN | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_mergeinfo_t","reverse_mergeinfo", 2, argv[0] ));
+ }
+ arg2 = (svn_mergeinfo_t)(argp2);
+ if (arg1) (arg1)->reverse_mergeinfo = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_patch_t_reverse_mergeinfo_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_patch_t *arg1 = (struct svn_patch_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_mergeinfo_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_patch_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_patch_t *","reverse_mergeinfo", 1, self ));
+ }
+ arg1 = (struct svn_patch_t *)(argp1);
+ result = (svn_mergeinfo_t) ((arg1)->reverse_mergeinfo);
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
SWIGINTERN VALUE
_wrap_svn_patch_t_allocate(VALUE self) {
@@ -40332,7 +42075,7 @@ _wrap_svn_swig_rb_auth_get_simple_prompt_provider(int argc, VALUE *argv, VALUE s
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_simple_prompt_func;
+ arg2 = (svn_auth_simple_prompt_func_t) svn_swig_rb_auth_simple_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -40398,7 +42141,7 @@ _wrap_svn_swig_rb_auth_get_ssl_client_cert_prompt_provider(int argc, VALUE *argv
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -40464,7 +42207,7 @@ _wrap_svn_swig_rb_auth_get_ssl_client_cert_pw_prompt_provider(int argc, VALUE *a
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_pw_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -40527,7 +42270,7 @@ _wrap_svn_swig_rb_auth_get_ssl_server_trust_prompt_provider(int argc, VALUE *arg
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_server_trust_prompt_func;
+ arg2 = (svn_auth_ssl_server_trust_prompt_func_t) svn_swig_rb_auth_ssl_server_trust_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
if (argc > 1) {
@@ -40588,7 +42331,7 @@ _wrap_svn_swig_rb_auth_get_username_prompt_provider(int argc, VALUE *argv, VALUE
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_username_prompt_func;
+ arg2 = (svn_auth_username_prompt_func_t) svn_swig_rb_auth_username_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -40896,7 +42639,6 @@ static swig_type_info _swigt__p_apr_file_t = {"_p_apr_file_t", "apr_file_t *", 0
static swig_type_info _swigt__p_apr_finfo_t = {"_p_apr_finfo_t", "apr_finfo_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_option_t = {"_p_apr_getopt_option_t", "apr_getopt_option_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_getopt_t = {"_p_apr_getopt_t", "apr_getopt_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_apr_hash_index_t = {"_p_apr_hash_index_t", "apr_hash_index_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "svn_mergeinfo_catalog_t|svn_mergeinfo_t|apr_hash_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
@@ -40923,6 +42665,7 @@ static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void__int =
static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int", "svn_config_enumerator2_t|int (*)(char const *,char const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void__int = {"_p_f_p_q_const__char_p_void__int", "svn_config_section_enumerator_t|int (*)(char const *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int = {"_p_f_p_q_const__char_p_void_p_apr_pool_t__int", "int (*)(char const *,void *,apr_pool_t *)|svn_config_section_enumerator2_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int = {"_p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int", "svn_boolean_t (*)(svn_version_t const *,svn_version_t const *)|int (*)(struct svn_version_t const *,struct svn_version_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,char const *,void *,apr_pool_t *)|svn_auth_plaintext_prompt_func_t|svn_auth_plaintext_passphrase_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_boolean_t *,void *,char const *,char const *,apr_hash_t *,apr_pool_t *)|svn_config_auth_walk_func_t", 0, 0, (void*)0, 0};
@@ -40940,6 +42683,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_size_t *)|svn_write_fn_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_finfo_t const *,apr_pool_t *)|svn_io_walk_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t = {"_p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t", "svn_stream_seek_fn_t|struct svn_error_t *(*)(void *,svn_stream_mark_t const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t = {"_p_f_p_void_p_svn_boolean_t__p_svn_error_t", "svn_stream_data_available_fn_t|struct svn_error_t *(*)(void *,svn_boolean_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_void__void = {"_p_f_p_void_p_void__void", "void (*)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t = {"_p_f_p_void_p_void_p_void_p_int__p_svn_error_t", "svn_error_t *(*)(void *,void *,void *,int *)|struct svn_error_t *(*)(void *,void *,void *,int *)", 0, 0, (void*)0, 0};
@@ -41046,7 +42790,6 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_apr_finfo_t,
&_swigt__p_apr_getopt_option_t,
&_swigt__p_apr_getopt_t,
- &_swigt__p_apr_hash_index_t,
&_swigt__p_apr_hash_t,
&_swigt__p_apr_int32_t,
&_swigt__p_apr_int64_t,
@@ -41073,6 +42816,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
&_swigt__p_f_p_q_const__char_p_void__int,
&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ &_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -41090,6 +42834,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_void__void,
&_swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t,
@@ -41196,7 +42941,6 @@ static swig_cast_info _swigc__p_apr_file_t[] = { {&_swigt__p_apr_file_t, 0, 0,
static swig_cast_info _swigc__p_apr_finfo_t[] = { {&_swigt__p_apr_finfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_option_t[] = { {&_swigt__p_apr_getopt_option_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_getopt_t[] = { {&_swigt__p_apr_getopt_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_apr_hash_index_t[] = { {&_swigt__p_apr_hash_index_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_hash_t[] = { {&_swigt__p_apr_hash_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int32_t[] = { {&_swigt__p_apr_int32_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int64_t[] = { {&_swigt__p_apr_int64_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -41223,6 +42967,7 @@ static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void__int[]
static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void__int[] = { {&_swigt__p_f_p_q_const__char_p_void__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int[] = { {&_swigt__p_f_p_q_const__char_p_void_p_apr_pool_t__int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int[] = { {&_swigt__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -41240,6 +42985,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_mark_t_p_apr_pool_t__p_s
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_boolean_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_void__void[] = { {&_swigt__p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_void_p_void_p_int__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_void_p_void_p_int__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -41346,7 +43092,6 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_apr_finfo_t,
_swigc__p_apr_getopt_option_t,
_swigc__p_apr_getopt_t,
- _swigc__p_apr_hash_index_t,
_swigc__p_apr_hash_t,
_swigc__p_apr_int32_t,
_swigc__p_apr_int64_t,
@@ -41373,6 +43118,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_q_const__char_p_q_const__char_p_void_p_apr_pool_t__int,
_swigc__p_f_p_q_const__char_p_void__int,
_swigc__p_f_p_q_const__char_p_void_p_apr_pool_t__int,
+ _swigc__p_f_p_q_const__struct_svn_version_t_p_q_const__struct_svn_version_t__int,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_boolean_t_p_void_p_q_const__char_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -41390,6 +43136,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_q_const__char_p_apr_size_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__apr_finfo_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__svn_stream_mark_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_svn_boolean_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_void__void,
_swigc__p_f_p_void_p_void_p_void_p_int__p_svn_error_t,
@@ -41493,18 +43240,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -41514,17 +43261,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -41587,7 +43334,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -41601,7 +43348,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -41628,7 +43375,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -41773,11 +43520,13 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_BAD_TOKEN", SWIG_From_int((int)(SVN_ERR_BAD_TOKEN)));
rb_define_const(mCore, "SVN_ERR_BAD_CHANGELIST_NAME", SWIG_From_int((int)(SVN_ERR_BAD_CHANGELIST_NAME)));
rb_define_const(mCore, "SVN_ERR_BAD_ATOMIC", SWIG_From_int((int)(SVN_ERR_BAD_ATOMIC)));
+ rb_define_const(mCore, "SVN_ERR_BAD_COMPRESSION_METHOD", SWIG_From_int((int)(SVN_ERR_BAD_COMPRESSION_METHOD)));
rb_define_const(mCore, "SVN_ERR_XML_ATTRIB_NOT_FOUND", SWIG_From_int((int)(SVN_ERR_XML_ATTRIB_NOT_FOUND)));
rb_define_const(mCore, "SVN_ERR_XML_MISSING_ANCESTRY", SWIG_From_int((int)(SVN_ERR_XML_MISSING_ANCESTRY)));
rb_define_const(mCore, "SVN_ERR_XML_UNKNOWN_ENCODING", SWIG_From_int((int)(SVN_ERR_XML_UNKNOWN_ENCODING)));
rb_define_const(mCore, "SVN_ERR_XML_MALFORMED", SWIG_From_int((int)(SVN_ERR_XML_MALFORMED)));
rb_define_const(mCore, "SVN_ERR_XML_UNESCAPABLE_DATA", SWIG_From_int((int)(SVN_ERR_XML_UNESCAPABLE_DATA)));
+ rb_define_const(mCore, "SVN_ERR_XML_UNEXPECTED_ELEMENT", SWIG_From_int((int)(SVN_ERR_XML_UNEXPECTED_ELEMENT)));
rb_define_const(mCore, "SVN_ERR_IO_INCONSISTENT_EOL", SWIG_From_int((int)(SVN_ERR_IO_INCONSISTENT_EOL)));
rb_define_const(mCore, "SVN_ERR_IO_UNKNOWN_EOL", SWIG_From_int((int)(SVN_ERR_IO_UNKNOWN_EOL)));
rb_define_const(mCore, "SVN_ERR_IO_CORRUPT_EOL", SWIG_From_int((int)(SVN_ERR_IO_CORRUPT_EOL)));
@@ -41790,6 +43539,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_STREAM_MALFORMED_DATA", SWIG_From_int((int)(SVN_ERR_STREAM_MALFORMED_DATA)));
rb_define_const(mCore, "SVN_ERR_STREAM_UNRECOGNIZED_DATA", SWIG_From_int((int)(SVN_ERR_STREAM_UNRECOGNIZED_DATA)));
rb_define_const(mCore, "SVN_ERR_STREAM_SEEK_NOT_SUPPORTED", SWIG_From_int((int)(SVN_ERR_STREAM_SEEK_NOT_SUPPORTED)));
+ rb_define_const(mCore, "SVN_ERR_STREAM_NOT_SUPPORTED", SWIG_From_int((int)(SVN_ERR_STREAM_NOT_SUPPORTED)));
rb_define_const(mCore, "SVN_ERR_NODE_UNKNOWN_KIND", SWIG_From_int((int)(SVN_ERR_NODE_UNKNOWN_KIND)));
rb_define_const(mCore, "SVN_ERR_NODE_UNEXPECTED_KIND", SWIG_From_int((int)(SVN_ERR_NODE_UNEXPECTED_KIND)));
rb_define_const(mCore, "SVN_ERR_ENTRY_NOT_FOUND", SWIG_From_int((int)(SVN_ERR_ENTRY_NOT_FOUND)));
@@ -41894,6 +43644,17 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION", SWIG_From_int((int)(SVN_ERR_FS_INCORRECT_EDITOR_COMPLETION)));
rb_define_const(mCore, "SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE", SWIG_From_int((int)(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE)));
rb_define_const(mCore, "SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE", SWIG_From_int((int)(SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE)));
+ rb_define_const(mCore, "SVN_ERR_FS_MALFORMED_TXN_ID", SWIG_From_int((int)(SVN_ERR_FS_MALFORMED_TXN_ID)));
+ rb_define_const(mCore, "SVN_ERR_FS_INDEX_CORRUPTION", SWIG_From_int((int)(SVN_ERR_FS_INDEX_CORRUPTION)));
+ rb_define_const(mCore, "SVN_ERR_FS_INDEX_REVISION", SWIG_From_int((int)(SVN_ERR_FS_INDEX_REVISION)));
+ rb_define_const(mCore, "SVN_ERR_FS_INDEX_OVERFLOW", SWIG_From_int((int)(SVN_ERR_FS_INDEX_OVERFLOW)));
+ rb_define_const(mCore, "SVN_ERR_FS_CONTAINER_INDEX", SWIG_From_int((int)(SVN_ERR_FS_CONTAINER_INDEX)));
+ rb_define_const(mCore, "SVN_ERR_FS_INDEX_INCONSISTENT", SWIG_From_int((int)(SVN_ERR_FS_INDEX_INCONSISTENT)));
+ rb_define_const(mCore, "SVN_ERR_FS_LOCK_OPERATION_FAILED", SWIG_From_int((int)(SVN_ERR_FS_LOCK_OPERATION_FAILED)));
+ rb_define_const(mCore, "SVN_ERR_FS_UNSUPPORTED_TYPE", SWIG_From_int((int)(SVN_ERR_FS_UNSUPPORTED_TYPE)));
+ rb_define_const(mCore, "SVN_ERR_FS_CONTAINER_SIZE", SWIG_From_int((int)(SVN_ERR_FS_CONTAINER_SIZE)));
+ rb_define_const(mCore, "SVN_ERR_FS_MALFORMED_NODEREV_ID", SWIG_From_int((int)(SVN_ERR_FS_MALFORMED_NODEREV_ID)));
+ rb_define_const(mCore, "SVN_ERR_FS_INVALID_GENERATION", SWIG_From_int((int)(SVN_ERR_FS_INVALID_GENERATION)));
rb_define_const(mCore, "SVN_ERR_REPOS_LOCKED", SWIG_From_int((int)(SVN_ERR_REPOS_LOCKED)));
rb_define_const(mCore, "SVN_ERR_REPOS_HOOK_FAILURE", SWIG_From_int((int)(SVN_ERR_REPOS_HOOK_FAILURE)));
rb_define_const(mCore, "SVN_ERR_REPOS_BAD_ARGS", SWIG_From_int((int)(SVN_ERR_REPOS_BAD_ARGS)));
@@ -41918,6 +43679,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH", SWIG_From_int((int)(SVN_ERR_RA_REPOS_ROOT_URL_MISMATCH)));
rb_define_const(mCore, "SVN_ERR_RA_SESSION_URL_MISMATCH", SWIG_From_int((int)(SVN_ERR_RA_SESSION_URL_MISMATCH)));
rb_define_const(mCore, "SVN_ERR_RA_CANNOT_CREATE_TUNNEL", SWIG_From_int((int)(SVN_ERR_RA_CANNOT_CREATE_TUNNEL)));
+ rb_define_const(mCore, "SVN_ERR_RA_CANNOT_CREATE_SESSION", SWIG_From_int((int)(SVN_ERR_RA_CANNOT_CREATE_SESSION)));
rb_define_const(mCore, "SVN_ERR_RA_DAV_SOCK_INIT", SWIG_From_int((int)(SVN_ERR_RA_DAV_SOCK_INIT)));
rb_define_const(mCore, "SVN_ERR_RA_DAV_CREATING_REQUEST", SWIG_From_int((int)(SVN_ERR_RA_DAV_CREATING_REQUEST)));
rb_define_const(mCore, "SVN_ERR_RA_DAV_REQUEST_FAILED", SWIG_From_int((int)(SVN_ERR_RA_DAV_REQUEST_FAILED)));
@@ -41932,6 +43694,8 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_RA_DAV_RELOCATED", SWIG_From_int((int)(SVN_ERR_RA_DAV_RELOCATED)));
rb_define_const(mCore, "SVN_ERR_RA_DAV_CONN_TIMEOUT", SWIG_From_int((int)(SVN_ERR_RA_DAV_CONN_TIMEOUT)));
rb_define_const(mCore, "SVN_ERR_RA_DAV_FORBIDDEN", SWIG_From_int((int)(SVN_ERR_RA_DAV_FORBIDDEN)));
+ rb_define_const(mCore, "SVN_ERR_RA_DAV_PRECONDITION_FAILED", SWIG_From_int((int)(SVN_ERR_RA_DAV_PRECONDITION_FAILED)));
+ rb_define_const(mCore, "SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED", SWIG_From_int((int)(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED)));
rb_define_const(mCore, "SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND", SWIG_From_int((int)(SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND)));
rb_define_const(mCore, "SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED", SWIG_From_int((int)(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED)));
rb_define_const(mCore, "SVN_ERR_SVNDIFF_INVALID_HEADER", SWIG_From_int((int)(SVN_ERR_SVNDIFF_INVALID_HEADER)));
@@ -42008,6 +43772,11 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_TOO_MANY_MEMCACHED_SERVERS", SWIG_From_int((int)(SVN_ERR_TOO_MANY_MEMCACHED_SERVERS)));
rb_define_const(mCore, "SVN_ERR_MALFORMED_VERSION_STRING", SWIG_From_int((int)(SVN_ERR_MALFORMED_VERSION_STRING)));
rb_define_const(mCore, "SVN_ERR_CORRUPTED_ATOMIC_STORAGE", SWIG_From_int((int)(SVN_ERR_CORRUPTED_ATOMIC_STORAGE)));
+ rb_define_const(mCore, "SVN_ERR_UTF8PROC_ERROR", SWIG_From_int((int)(SVN_ERR_UTF8PROC_ERROR)));
+ rb_define_const(mCore, "SVN_ERR_UTF8_GLOB", SWIG_From_int((int)(SVN_ERR_UTF8_GLOB)));
+ rb_define_const(mCore, "SVN_ERR_CORRUPT_PACKED_DATA", SWIG_From_int((int)(SVN_ERR_CORRUPT_PACKED_DATA)));
+ rb_define_const(mCore, "SVN_ERR_COMPOSED_ERROR", SWIG_From_int((int)(SVN_ERR_COMPOSED_ERROR)));
+ rb_define_const(mCore, "SVN_ERR_INVALID_INPUT", SWIG_From_int((int)(SVN_ERR_INVALID_INPUT)));
rb_define_const(mCore, "SVN_ERR_CL_ARG_PARSING_ERROR", SWIG_From_int((int)(SVN_ERR_CL_ARG_PARSING_ERROR)));
rb_define_const(mCore, "SVN_ERR_CL_INSUFFICIENT_ARGS", SWIG_From_int((int)(SVN_ERR_CL_INSUFFICIENT_ARGS)));
rb_define_const(mCore, "SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS", SWIG_From_int((int)(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS)));
@@ -42020,6 +43789,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE", SWIG_From_int((int)(SVN_ERR_CL_UNNECESSARY_LOG_MESSAGE)));
rb_define_const(mCore, "SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL", SWIG_From_int((int)(SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)));
rb_define_const(mCore, "SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS", SWIG_From_int((int)(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS)));
+ rb_define_const(mCore, "SVN_ERR_CL_REPOS_VERIFY_FAILED", SWIG_From_int((int)(SVN_ERR_CL_REPOS_VERIFY_FAILED)));
rb_define_const(mCore, "SVN_ERR_RA_SVN_CMD_ERR", SWIG_From_int((int)(SVN_ERR_RA_SVN_CMD_ERR)));
rb_define_const(mCore, "SVN_ERR_RA_SVN_UNKNOWN_CMD", SWIG_From_int((int)(SVN_ERR_RA_SVN_UNKNOWN_CMD)));
rb_define_const(mCore, "SVN_ERR_RA_SVN_CONNECTION_CLOSED", SWIG_From_int((int)(SVN_ERR_RA_SVN_CONNECTION_CLOSED)));
@@ -42046,6 +43816,26 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_ERR_RA_SERF_WRAPPED_ERROR", SWIG_From_int((int)(SVN_ERR_RA_SERF_WRAPPED_ERROR)));
rb_define_const(mCore, "SVN_ERR_ASSERTION_FAIL", SWIG_From_int((int)(SVN_ERR_ASSERTION_FAIL)));
rb_define_const(mCore, "SVN_ERR_ASSERTION_ONLY_TRACING_LINKS", SWIG_From_int((int)(SVN_ERR_ASSERTION_ONLY_TRACING_LINKS)));
+ rb_define_const(mCore, "SVN_ERR_ASN1_OUT_OF_DATA", SWIG_From_int((int)(SVN_ERR_ASN1_OUT_OF_DATA)));
+ rb_define_const(mCore, "SVN_ERR_ASN1_UNEXPECTED_TAG", SWIG_From_int((int)(SVN_ERR_ASN1_UNEXPECTED_TAG)));
+ rb_define_const(mCore, "SVN_ERR_ASN1_INVALID_LENGTH", SWIG_From_int((int)(SVN_ERR_ASN1_INVALID_LENGTH)));
+ rb_define_const(mCore, "SVN_ERR_ASN1_LENGTH_MISMATCH", SWIG_From_int((int)(SVN_ERR_ASN1_LENGTH_MISMATCH)));
+ rb_define_const(mCore, "SVN_ERR_ASN1_INVALID_DATA", SWIG_From_int((int)(SVN_ERR_ASN1_INVALID_DATA)));
+ rb_define_const(mCore, "SVN_ERR_X509_FEATURE_UNAVAILABLE", SWIG_From_int((int)(SVN_ERR_X509_FEATURE_UNAVAILABLE)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_PEM", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_PEM)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_FORMAT", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_FORMAT)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_VERSION", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_VERSION)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_SERIAL", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_SERIAL)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_ALG", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_ALG)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_NAME", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_NAME)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_DATE", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_DATE)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_PUBKEY", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_PUBKEY)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_SIGNATURE", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_SIGNATURE)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_INVALID_EXTENSIONS", SWIG_From_int((int)(SVN_ERR_X509_CERT_INVALID_EXTENSIONS)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_UNKNOWN_VERSION", SWIG_From_int((int)(SVN_ERR_X509_CERT_UNKNOWN_VERSION)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_UNKNOWN_PK_ALG", SWIG_From_int((int)(SVN_ERR_X509_CERT_UNKNOWN_PK_ALG)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_SIG_MISMATCH", SWIG_From_int((int)(SVN_ERR_X509_CERT_SIG_MISMATCH)));
+ rb_define_const(mCore, "SVN_ERR_X509_CERT_VERIFY_FAILED", SWIG_From_int((int)(SVN_ERR_X509_CERT_VERIFY_FAILED)));
rb_define_const(mCore, "SVN_ERR_LAST", SWIG_From_int((int)(SVN_ERR_LAST)));
rb_define_module_function(mCore, "svn_time_to_cstring", _wrap_svn_time_to_cstring, -1);
rb_define_module_function(mCore, "svn_time_from_cstring", _wrap_svn_time_from_cstring, -1);
@@ -42073,9 +43863,6 @@ SWIGEXPORT void Init_core(void) {
SwigClassSvn_error_t.mark = 0;
SwigClassSvn_error_t.destroy = (void (*)(void *)) free_svn_error_t;
SwigClassSvn_error_t.trackObjects = 0;
- rb_define_module_function(mCore, "svn__apr_hash_index_key", _wrap_svn__apr_hash_index_key, -1);
- rb_define_module_function(mCore, "svn__apr_hash_index_klen", _wrap_svn__apr_hash_index_klen, -1);
- rb_define_module_function(mCore, "svn__apr_hash_index_val", _wrap_svn__apr_hash_index_val, -1);
rb_define_const(mCore, "Svn_node_none", SWIG_From_int((int)(svn_node_none)));
rb_define_const(mCore, "Svn_node_file", SWIG_From_int((int)(svn_node_file)));
rb_define_const(mCore, "Svn_node_dir", SWIG_From_int((int)(svn_node_dir)));
@@ -42289,16 +44076,16 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_pool_create", _wrap_svn_pool_create, -1);
rb_define_module_function(mCore, "svn_pool_create_allocator", _wrap_svn_pool_create_allocator, -1);
rb_define_const(mCore, "SVN_VER_MAJOR", SWIG_From_int((int)(1)));
- rb_define_const(mCore, "SVN_VER_MINOR", SWIG_From_int((int)(8)));
- rb_define_const(mCore, "SVN_VER_PATCH", SWIG_From_int((int)(13)));
- rb_define_const(mCore, "SVN_VER_MICRO", SWIG_From_int((int)(13)));
+ rb_define_const(mCore, "SVN_VER_MINOR", SWIG_From_int((int)(9)));
+ rb_define_const(mCore, "SVN_VER_PATCH", SWIG_From_int((int)(7)));
+ rb_define_const(mCore, "SVN_VER_MICRO", SWIG_From_int((int)(7)));
rb_define_const(mCore, "SVN_VER_LIBRARY", SWIG_From_int((int)(1)));
- rb_define_const(mCore, "SVN_VER_TAG", SWIG_FromCharPtr(" (r1667537)"));
+ rb_define_const(mCore, "SVN_VER_TAG", SWIG_FromCharPtr(" (r1800392)"));
rb_define_const(mCore, "SVN_VER_NUMTAG", SWIG_FromCharPtr(""));
- rb_define_const(mCore, "SVN_VER_REVISION", SWIG_From_int((int)(1667537)));
- rb_define_const(mCore, "SVN_VER_NUM", SWIG_FromCharPtr("1.8.13"));
- rb_define_const(mCore, "SVN_VER_NUMBER", SWIG_FromCharPtr("1.8.13"));
- rb_define_const(mCore, "SVN_VERSION", SWIG_FromCharPtr("1.8.13 (r1667537)"));
+ rb_define_const(mCore, "SVN_VER_REVISION", SWIG_From_int((int)(1800392)));
+ rb_define_const(mCore, "SVN_VER_NUM", SWIG_FromCharPtr("1.9.7"));
+ rb_define_const(mCore, "SVN_VER_NUMBER", SWIG_FromCharPtr("1.9.7"));
+ rb_define_const(mCore, "SVN_VERSION", SWIG_FromCharPtr("1.9.7 (r1800392)"));
SwigClassSvn_version_t.klass = rb_define_class_under(mCore, "Svn_version_t", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p_svn_version_t, (void *) &SwigClassSvn_version_t);
@@ -42329,6 +44116,7 @@ SWIGEXPORT void Init_core(void) {
SwigClassSvn_version_checklist_t.mark = 0;
SwigClassSvn_version_checklist_t.destroy = (void (*)(void *)) free_svn_version_checklist_t;
SwigClassSvn_version_checklist_t.trackObjects = 0;
+ rb_define_module_function(mCore, "svn_ver_check_list2", _wrap_svn_ver_check_list2, -1);
rb_define_module_function(mCore, "svn_ver_check_list", _wrap_svn_ver_check_list, -1);
rb_define_module_function(mCore, "svn_subr_version", _wrap_svn_subr_version, -1);
rb_define_module_function(mCore, "svn_version_extended", _wrap_svn_version_extended, -1);
@@ -42564,6 +44352,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_opt_print_help2", _wrap_svn_opt_print_help2, -1);
rb_define_module_function(mCore, "svn_opt_print_help", _wrap_svn_opt_print_help, -1);
rb_define_module_function(mCore, "svn_cmdline_init", _wrap_svn_cmdline_init, -1);
+ rb_define_module_function(mCore, "svn_cmdline_create_auth_baton2", _wrap_svn_cmdline_create_auth_baton2, -1);
rb_define_module_function(mCore, "svn_cmdline_create_auth_baton", _wrap_svn_cmdline_create_auth_baton, -1);
SwigClassSvn_auth_provider_t.klass = rb_define_class_under(mCore, "Svn_auth_provider_t", rb_cObject);
@@ -42762,6 +44551,9 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_CONFIG_OPTION_USERNAME", SWIG_FromCharPtr("username"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_HTTP_BULK_UPDATES", SWIG_FromCharPtr("http-bulk-updates"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS", SWIG_FromCharPtr("http-max-connections"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS", SWIG_FromCharPtr("http-chunked-requests"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS", SWIG_FromCharPtr("serf-log-components"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_SERF_LOG_LEVEL", SWIG_FromCharPtr("serf-log-level"));
rb_define_const(mCore, "SVN_CONFIG_CATEGORY_CONFIG", SWIG_FromCharPtr("config"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_AUTH", SWIG_FromCharPtr("auth"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_PASSWORD_STORES", SWIG_FromCharPtr("password-stores"));
@@ -42781,16 +44573,19 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_CONFIG_OPTION_USE_COMMIT_TIMES", SWIG_FromCharPtr("use-commit-times"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_TEMPLATE_ROOT", SWIG_FromCharPtr("template-root"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS", SWIG_FromCharPtr("enable-auto-props"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE", SWIG_FromCharPtr("enable-magic-file"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_NO_UNLOCK", SWIG_FromCharPtr("no-unlock"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_MIMETYPES_FILE", SWIG_FromCharPtr("mime-types-file"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_PRESERVED_CF_EXTS", SWIG_FromCharPtr("preserved-conflict-file-exts"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS", SWIG_FromCharPtr("interactive-conflicts"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE", SWIG_FromCharPtr("memory-cache-size"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE", SWIG_FromCharPtr("diff-ignore-content-type"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_TUNNELS", SWIG_FromCharPtr("tunnels"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_AUTO_PROPS", SWIG_FromCharPtr("auto-props"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_WORKING_COPY", SWIG_FromCharPtr("working-copy"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE", SWIG_FromCharPtr("exclusive-locking"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS", SWIG_FromCharPtr("exclusive-locking-clients"));
+ rb_define_const(mCore, "SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT", SWIG_FromCharPtr("busy-timeout"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_GENERAL", SWIG_FromCharPtr("general"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_ANON_ACCESS", SWIG_FromCharPtr("anon-access"));
rb_define_const(mCore, "SVN_CONFIG_OPTION_AUTH_ACCESS", SWIG_FromCharPtr("auth-access"));
@@ -42806,8 +44601,8 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "SVN_CONFIG_OPTION_MAX_SSF", SWIG_FromCharPtr("max-encryption"));
rb_define_const(mCore, "SVN_CONFIG_SECTION_USERS", SWIG_FromCharPtr("users"));
rb_define_const(mCore, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1", SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__"));
- rb_define_const(mCore, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2", SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store"));
- rb_define_const(mCore, "SVN_CONFIG_DEFAULT_GLOBAL_IGNORES", SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store"));
+ rb_define_const(mCore, "SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2", SWIG_FromCharPtr("*.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
+ rb_define_const(mCore, "SVN_CONFIG_DEFAULT_GLOBAL_IGNORES", SWIG_FromCharPtr("*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"));
rb_define_const(mCore, "SVN_CONFIG_TRUE", SWIG_FromCharPtr("TRUE"));
rb_define_const(mCore, "SVN_CONFIG_FALSE", SWIG_FromCharPtr("FALSE"));
rb_define_const(mCore, "SVN_CONFIG_ASK", SWIG_FromCharPtr("ASK"));
@@ -42844,6 +44639,12 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_config_get_server_setting_bool", _wrap_svn_config_get_server_setting_bool, -1);
rb_define_module_function(mCore, "svn_config_ensure", _wrap_svn_config_ensure, -1);
rb_define_const(mCore, "SVN_CONFIG_REALMSTRING_KEY", SWIG_FromCharPtr("svn:realmstring"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_USERNAME_KEY", SWIG_FromCharPtr("username"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_PASSWORD_KEY", SWIG_FromCharPtr("password"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_PASSPHRASE_KEY", SWIG_FromCharPtr("passphrase"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_PASSTYPE_KEY", SWIG_FromCharPtr("passtype"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_ASCII_CERT_KEY", SWIG_FromCharPtr("ascii_cert"));
+ rb_define_const(mCore, "SVN_CONFIG_AUTHN_FAILURES_KEY", SWIG_FromCharPtr("failures"));
rb_define_module_function(mCore, "svn_config_read_auth_data", _wrap_svn_config_read_auth_data, -1);
rb_define_module_function(mCore, "svn_config_write_auth_data", _wrap_svn_config_write_auth_data, -1);
rb_define_module_function(mCore, "svn_config_walk_auth_data", _wrap_svn_config_walk_auth_data, -1);
@@ -42899,6 +44700,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_relpath_split", _wrap_svn_relpath_split, -1);
rb_define_module_function(mCore, "svn_relpath_basename", _wrap_svn_relpath_basename, -1);
rb_define_module_function(mCore, "svn_relpath_dirname", _wrap_svn_relpath_dirname, -1);
+ rb_define_module_function(mCore, "svn_relpath_prefix", _wrap_svn_relpath_prefix, -1);
rb_define_module_function(mCore, "svn_uri_split", _wrap_svn_uri_split, -1);
rb_define_module_function(mCore, "svn_uri_basename", _wrap_svn_uri_basename, -1);
rb_define_module_function(mCore, "svn_uri_dirname", _wrap_svn_uri_dirname, -1);
@@ -42994,11 +44796,15 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_io_file_checksum", _wrap_svn_io_file_checksum, -1);
rb_define_module_function(mCore, "svn_io_files_contents_same_p", _wrap_svn_io_files_contents_same_p, -1);
rb_define_module_function(mCore, "svn_io_files_contents_three_same_p", _wrap_svn_io_files_contents_three_same_p, -1);
+ rb_define_module_function(mCore, "svn_io_file_create_bytes", _wrap_svn_io_file_create_bytes, -1);
+ rb_define_module_function(mCore, "svn_io_file_create_empty", _wrap_svn_io_file_create_empty, -1);
rb_define_module_function(mCore, "svn_io_lock_open_file", _wrap_svn_io_lock_open_file, -1);
rb_define_module_function(mCore, "svn_io_unlock_open_file", _wrap_svn_io_unlock_open_file, -1);
+ rb_define_module_function(mCore, "svn_stream_set_read2", _wrap_svn_stream_set_read2, -1);
rb_define_module_function(mCore, "svn_stream_set_skip", _wrap_svn_stream_set_skip, -1);
rb_define_module_function(mCore, "svn_stream_set_mark", _wrap_svn_stream_set_mark, -1);
rb_define_module_function(mCore, "svn_stream_set_seek", _wrap_svn_stream_set_seek, -1);
+ rb_define_module_function(mCore, "svn_stream_set_data_available", _wrap_svn_stream_set_data_available, -1);
rb_define_module_function(mCore, "svn_stream_empty", _wrap_svn_stream_empty, -1);
rb_define_module_function(mCore, "svn_stream_disown", _wrap_svn_stream_disown, -1);
rb_define_module_function(mCore, "svn_stream_open_readonly", _wrap_svn_stream_open_readonly, -1);
@@ -43009,11 +44815,15 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_stream_for_stdin", _wrap_svn_stream_for_stdin, -1);
rb_define_module_function(mCore, "svn_stream_for_stderr", _wrap_svn_stream_for_stderr, -1);
rb_define_module_function(mCore, "svn_stream_for_stdout", _wrap_svn_stream_for_stdout, -1);
+ rb_define_module_function(mCore, "svn_stringbuf_from_stream", _wrap_svn_stringbuf_from_stream, -1);
rb_define_module_function(mCore, "svn_stream_from_stringbuf", _wrap_svn_stream_from_stringbuf, -1);
rb_define_module_function(mCore, "svn_stream_from_string", _wrap_svn_stream_from_string, -1);
rb_define_module_function(mCore, "svn_stream_buffered", _wrap_svn_stream_buffered, -1);
rb_define_module_function(mCore, "svn_stream_compressed", _wrap_svn_stream_compressed, -1);
rb_define_module_function(mCore, "svn_stream_checksummed2", _wrap_svn_stream_checksummed2, -1);
+ rb_define_module_function(mCore, "svn_stream_read_full", _wrap_svn_stream_read_full, -1);
+ rb_define_module_function(mCore, "svn_stream_supports_partial_read", _wrap_svn_stream_supports_partial_read, -1);
+ rb_define_module_function(mCore, "svn_stream_read2", _wrap_svn_stream_read2, -1);
rb_define_module_function(mCore, "svn_stream_read", _wrap_svn_stream_read, -1);
rb_define_module_function(mCore, "svn_stream_skip", _wrap_svn_stream_skip, -1);
rb_define_module_function(mCore, "svn_stream_write", _wrap_svn_stream_write, -1);
@@ -43022,6 +44832,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_stream_supports_mark", _wrap_svn_stream_supports_mark, -1);
rb_define_module_function(mCore, "svn_stream_mark", _wrap_svn_stream_mark, -1);
rb_define_module_function(mCore, "svn_stream_seek", _wrap_svn_stream_seek, -1);
+ rb_define_module_function(mCore, "svn_stream_data_available", _wrap_svn_stream_data_available, -1);
rb_define_module_function(mCore, "svn_stream_tee", _wrap_svn_stream_tee, -1);
rb_define_module_function(mCore, "svn_stream_puts", _wrap_svn_stream_puts, -1);
rb_define_module_function(mCore, "svn_stream_readline", _wrap_svn_stream_readline, -1);
@@ -43051,6 +44862,9 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_io_is_binary_data", _wrap_svn_io_is_binary_data, -1);
rb_define_module_function(mCore, "svn_io_file_putc", _wrap_svn_io_file_putc, -1);
rb_define_module_function(mCore, "svn_io_file_read_full2", _wrap_svn_io_file_read_full2, -1);
+ rb_define_module_function(mCore, "svn_io_file_aligned_seek", _wrap_svn_io_file_aligned_seek, -1);
+ rb_define_module_function(mCore, "svn_io_file_flush", _wrap_svn_io_file_flush, -1);
+ rb_define_module_function(mCore, "svn_io_write_atomic", _wrap_svn_io_write_atomic, -1);
rb_define_module_function(mCore, "svn_io_write_unique", _wrap_svn_io_write_unique, -1);
rb_define_module_function(mCore, "svn_io_file_trunc", _wrap_svn_io_file_trunc, -1);
rb_define_module_function(mCore, "svn_io_dir_close", _wrap_svn_io_dir_close, -1);
@@ -43062,10 +44876,13 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_close_invoke_fn", _wrap_svn_close_invoke_fn, -1);
rb_define_module_function(mCore, "svn_stream_invoke_mark_fn", _wrap_svn_stream_invoke_mark_fn, -1);
rb_define_module_function(mCore, "svn_stream_invoke_seek_fn", _wrap_svn_stream_invoke_seek_fn, -1);
+ rb_define_module_function(mCore, "svn_stream_invoke_data_available_fn", _wrap_svn_stream_invoke_data_available_fn, -1);
rb_define_module_function(mCore, "svn_stream_invoke_lazyopen_func", _wrap_svn_stream_invoke_lazyopen_func, -1);
rb_define_module_function(mCore, "svn_io_invoke_walk_func", _wrap_svn_io_invoke_walk_func, -1);
rb_define_const(mCore, "Svn_checksum_md5", SWIG_From_int((int)(svn_checksum_md5)));
rb_define_const(mCore, "Svn_checksum_sha1", SWIG_From_int((int)(svn_checksum_sha1)));
+ rb_define_const(mCore, "Svn_checksum_fnv1a_32", SWIG_From_int((int)(svn_checksum_fnv1a_32)));
+ rb_define_const(mCore, "Svn_checksum_fnv1a_32x4", SWIG_From_int((int)(svn_checksum_fnv1a_32x4)));
SwigClassSvn_checksum_t.klass = rb_define_class_under(mCore, "Svn_checksum_t", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p_svn_checksum_t, (void *) &SwigClassSvn_checksum_t);
@@ -43211,6 +45028,7 @@ SWIGEXPORT void Init_core(void) {
rb_define_const(mCore, "Svn_diff_conflict_display_modified", SWIG_From_int((int)(svn_diff_conflict_display_modified)));
rb_define_const(mCore, "Svn_diff_conflict_display_latest", SWIG_From_int((int)(svn_diff_conflict_display_latest)));
rb_define_const(mCore, "Svn_diff_conflict_display_only_conflicts", SWIG_From_int((int)(svn_diff_conflict_display_only_conflicts)));
+ rb_define_module_function(mCore, "svn_diff_output2", _wrap_svn_diff_output2, -1);
rb_define_module_function(mCore, "svn_diff_output", _wrap_svn_diff_output, -1);
rb_define_const(mCore, "Svn_diff_file_ignore_space_none", SWIG_From_int((int)(svn_diff_file_ignore_space_none)));
rb_define_const(mCore, "Svn_diff_file_ignore_space_change", SWIG_From_int((int)(svn_diff_file_ignore_space_change)));
@@ -43226,6 +45044,8 @@ SWIGEXPORT void Init_core(void) {
rb_define_method(SwigClassSvn_diff_file_options_t.klass, "ignore_eol_style", _wrap_svn_diff_file_options_t_ignore_eol_style_get, -1);
rb_define_method(SwigClassSvn_diff_file_options_t.klass, "show_c_function=", _wrap_svn_diff_file_options_t_show_c_function_set, -1);
rb_define_method(SwigClassSvn_diff_file_options_t.klass, "show_c_function", _wrap_svn_diff_file_options_t_show_c_function_get, -1);
+ rb_define_method(SwigClassSvn_diff_file_options_t.klass, "context_size=", _wrap_svn_diff_file_options_t_context_size_set, -1);
+ rb_define_method(SwigClassSvn_diff_file_options_t.klass, "context_size", _wrap_svn_diff_file_options_t_context_size_get, -1);
SwigClassSvn_diff_file_options_t.mark = 0;
SwigClassSvn_diff_file_options_t.destroy = (void (*)(void *)) free_svn_diff_file_options_t;
SwigClassSvn_diff_file_options_t.trackObjects = 0;
@@ -43236,16 +45056,21 @@ SWIGEXPORT void Init_core(void) {
rb_define_module_function(mCore, "svn_diff_file_diff3", _wrap_svn_diff_file_diff3, -1);
rb_define_module_function(mCore, "svn_diff_file_diff4_2", _wrap_svn_diff_file_diff4_2, -1);
rb_define_module_function(mCore, "svn_diff_file_diff4", _wrap_svn_diff_file_diff4, -1);
+ rb_define_module_function(mCore, "svn_diff_file_output_unified4", _wrap_svn_diff_file_output_unified4, -1);
rb_define_module_function(mCore, "svn_diff_file_output_unified3", _wrap_svn_diff_file_output_unified3, -1);
rb_define_module_function(mCore, "svn_diff_file_output_unified2", _wrap_svn_diff_file_output_unified2, -1);
rb_define_module_function(mCore, "svn_diff_file_output_unified", _wrap_svn_diff_file_output_unified, -1);
+ rb_define_module_function(mCore, "svn_diff_file_output_merge3", _wrap_svn_diff_file_output_merge3, -1);
rb_define_module_function(mCore, "svn_diff_file_output_merge2", _wrap_svn_diff_file_output_merge2, -1);
rb_define_module_function(mCore, "svn_diff_file_output_merge", _wrap_svn_diff_file_output_merge, -1);
+ rb_define_module_function(mCore, "svn_diff_output_binary", _wrap_svn_diff_output_binary, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_diff", _wrap_svn_diff_mem_string_diff, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_diff3", _wrap_svn_diff_mem_string_diff3, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_diff4", _wrap_svn_diff_mem_string_diff4, -1);
+ rb_define_module_function(mCore, "svn_diff_mem_string_output_unified3", _wrap_svn_diff_mem_string_output_unified3, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_output_unified2", _wrap_svn_diff_mem_string_output_unified2, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_output_unified", _wrap_svn_diff_mem_string_output_unified, -1);
+ rb_define_module_function(mCore, "svn_diff_mem_string_output_merge3", _wrap_svn_diff_mem_string_output_merge3, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_output_merge2", _wrap_svn_diff_mem_string_output_merge2, -1);
rb_define_module_function(mCore, "svn_diff_mem_string_output_merge", _wrap_svn_diff_mem_string_output_merge, -1);
rb_define_const(mCore, "Svn_diff_op_unchanged", SWIG_From_int((int)(svn_diff_op_unchanged)));
@@ -43297,6 +45122,10 @@ SWIGEXPORT void Init_core(void) {
rb_define_method(SwigClassSvn_patch_t.klass, "operation", _wrap_svn_patch_t_operation_get, -1);
rb_define_method(SwigClassSvn_patch_t.klass, "reverse=", _wrap_svn_patch_t_reverse_set, -1);
rb_define_method(SwigClassSvn_patch_t.klass, "reverse", _wrap_svn_patch_t_reverse_get, -1);
+ rb_define_method(SwigClassSvn_patch_t.klass, "mergeinfo=", _wrap_svn_patch_t_mergeinfo_set, -1);
+ rb_define_method(SwigClassSvn_patch_t.klass, "mergeinfo", _wrap_svn_patch_t_mergeinfo_get, -1);
+ rb_define_method(SwigClassSvn_patch_t.klass, "reverse_mergeinfo=", _wrap_svn_patch_t_reverse_mergeinfo_set, -1);
+ rb_define_method(SwigClassSvn_patch_t.klass, "reverse_mergeinfo", _wrap_svn_patch_t_reverse_mergeinfo_get, -1);
SwigClassSvn_patch_t.mark = 0;
SwigClassSvn_patch_t.destroy = (void (*)(void *)) free_svn_patch_t;
SwigClassSvn_patch_t.trackObjects = 0;
diff --git a/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
index 136d35c..a25ec5a 100644
--- a/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
+++ b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
@@ -23,9 +23,16 @@
/* Tell swigutil_rb.h that we're inside the implementation */
#define SVN_SWIG_SWIGUTIL_RB_C
+/* Windows hack: Allow overriding some <ruby.h> defaults */
+#include "swigutil_rb__pre_ruby.h"
#include "swig_ruby_external_runtime.swg"
#include "swigutil_rb.h"
+
+#ifdef HAVE_RUBY_ST_H
+#include <ruby/st.h>
+#else
#include <st.h>
+#endif
#undef PACKAGE_BUGREPORT
#undef PACKAGE_NAME
@@ -474,9 +481,9 @@ static void
check_apr_status(apr_status_t status, VALUE exception_class, const char *format)
{
if (status != APR_SUCCESS) {
- char buffer[1024];
- apr_strerror(status, buffer, sizeof(buffer) - 1);
- rb_raise(exception_class, format, buffer);
+ char buffer[1024];
+ apr_strerror(status, buffer, sizeof(buffer) - 1);
+ rb_raise(exception_class, format, buffer);
}
}
@@ -519,8 +526,8 @@ svn_swig_rb_destroyer_destroy(VALUE self, VALUE target)
objects[0] = target;
if (find_swig_type_object(1, objects) && DATA_PTR(target)) {
- svn_swig_rb_destroy_internal_pool(target);
- DATA_PTR(target) = NULL;
+ svn_swig_rb_destroy_internal_pool(target);
+ DATA_PTR(target) = NULL;
}
return Qnil;
@@ -538,9 +545,9 @@ svn_swig_rb_initialize(void)
}
check_apr_status(apr_allocator_create(&swig_rb_allocator),
- rb_eLoadError, "failed to create allocator: %s");
+ rb_eLoadError, "failed to create allocator: %s");
apr_allocator_max_free_set(swig_rb_allocator,
- SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
+ SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
swig_rb_pool = svn_pool_create_ex(NULL, swig_rb_allocator);
apr_pool_tag(swig_rb_pool, "svn-ruby-pool");
@@ -549,8 +556,8 @@ svn_swig_rb_initialize(void)
apr_thread_mutex_t *mutex;
check_apr_status(apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT,
- swig_rb_pool),
- rb_eLoadError, "failed to create allocator: %s");
+ swig_rb_pool),
+ rb_eLoadError, "failed to create allocator: %s");
apr_allocator_mutex_set(swig_rb_allocator, mutex);
}
#endif
@@ -583,7 +590,7 @@ svn_swig_rb_initialize(void)
mSvnDestroyer = rb_define_module_under(rb_svn(), "Destroyer");
rb_define_module_function(mSvnDestroyer, "destroy",
- svn_swig_rb_destroyer_destroy, 1);
+ svn_swig_rb_destroyer_destroy, 1);
}
apr_pool_t *
@@ -736,7 +743,7 @@ static svn_boolean_t
rb_set_pool_if_swig_type_object(VALUE target, VALUE pool)
{
VALUE targets[1];
-
+
targets[0] = target;
if (!NIL_P(find_swig_type_object(1, targets))) {
@@ -862,7 +869,7 @@ svn_swig_rb_raise_svn_repos_already_close(void)
VALUE
svn_swig_rb_svn_error_new(VALUE code, VALUE message, VALUE file, VALUE line,
- VALUE child)
+ VALUE child)
{
return rb_funcall(rb_svn_error_svn_error(),
id_new_corresponding_error,
@@ -1598,7 +1605,7 @@ typedef struct callback_handle_error_baton_t {
} callback_handle_error_baton_t;
static VALUE
-callback(VALUE baton)
+callback(VALUE baton, ...)
{
callback_baton_t *cbb = (callback_baton_t *)baton;
VALUE result;
@@ -1610,7 +1617,7 @@ callback(VALUE baton)
}
static VALUE
-callback_rescue(VALUE baton)
+callback_rescue(VALUE baton, ...)
{
callback_rescue_baton_t *rescue_baton = (callback_rescue_baton_t*)baton;
@@ -1627,7 +1634,7 @@ callback_rescue(VALUE baton)
}
static VALUE
-callback_ensure(VALUE pool)
+callback_ensure(VALUE pool, ...)
{
svn_swig_rb_pop_pool(pool);
@@ -1638,17 +1645,17 @@ static VALUE
invoke_callback(VALUE baton, VALUE pool)
{
callback_baton_t *cbb = (callback_baton_t *)baton;
- VALUE sub_pool;
+ VALUE subpool;
VALUE argv[1];
argv[0] = pool;
- svn_swig_rb_get_pool(1, argv, Qnil, &sub_pool, NULL);
- cbb->pool = sub_pool;
- return rb_ensure(callback, baton, callback_ensure, sub_pool);
+ svn_swig_rb_get_pool(1, argv, Qnil, &subpool, NULL);
+ cbb->pool = subpool;
+ return rb_ensure(callback, baton, callback_ensure, subpool);
}
static VALUE
-callback_handle_error(VALUE baton)
+callback_handle_error(VALUE baton, ...)
{
callback_handle_error_baton_t *handle_error_baton;
handle_error_baton = (callback_handle_error_baton_t *)baton;
@@ -3231,7 +3238,8 @@ svn_swig_rb_make_stream(VALUE io)
pool_wrapper_p = &pool_wrapper;
r2c_swig_type2(rb_pool, "apr_pool_wrapper_t *", (void **)pool_wrapper_p);
stream = svn_stream_create((void *)io, pool_wrapper->pool);
- svn_stream_set_read(stream, read_handler_rbio);
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_handler_rbio);
svn_stream_set_write(stream, write_handler_rbio);
}
@@ -4025,4 +4033,7 @@ static svn_ra_reporter3_t rb_ra_reporter3 = {
svn_swig_rb_ra_reporter_abort_report
};
-svn_ra_reporter3_t *svn_swig_rb_ra_reporter3 = &rb_ra_reporter3;
+svn_ra_reporter3_t *svn_swig_rb_get_ra_reporter3()
+{
+ return &rb_ra_reporter3;
+}
diff --git a/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h
index 1098c80..3dbc3ec 100644
--- a/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h
+++ b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h
@@ -22,8 +22,14 @@
#ifndef SVN_SWIG_SWIGUTIL_RB_H
#define SVN_SWIG_SWIGUTIL_RB_H
+/* Windows hack: Allow overriding some <ruby.h> defaults */
+#include "swigutil_rb__pre_ruby.h"
#include <ruby.h>
+#ifdef HAVE_RUBY_REGEX_H
+#include <ruby/regex.h>
+#else
#include <regex.h>
+#endif
#if SIZEOF_VOIDP == SIZEOF_LONG
# define PTR2NUM(x) (ULONG2NUM((unsigned long)(x)))
@@ -45,17 +51,6 @@
#include "svn_client.h"
#include "svn_repos.h"
-/* Define DLL export magic on Windows. */
-#ifdef WIN32
-# ifdef SVN_SWIG_SWIGUTIL_RB_C
-# define SVN_RB_SWIG_SWIGUTIL_EXPORT __declspec(dllexport)
-# else
-# define SVN_RB_SWIG_SWIGUTIL_EXPORT __declspec(dllimport)
-# endif
-#else
-# define SVN_RB_SWIG_SWIGUTIL_EXPORT
-#endif
-
/* Ruby <=1.8.5 compatibility */
#ifndef RARRAY_LEN
#define RARRAY_LEN(x) RARRAY(x)->len
@@ -89,152 +84,98 @@ typedef struct apr_pool_wrapper_t
apr_array_header_t *children;
} apr_pool_wrapper_t;
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_initialize(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_pool_t *svn_swig_rb_pool(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_allocator_t *svn_swig_rb_allocator(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_svn_delta_editor(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_svn_delta_text_delta_window_handler(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_raise_svn_fs_already_close(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_raise_svn_repos_already_close(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_svn_error_new(VALUE code, VALUE message,
VALUE file, VALUE line, VALUE child);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_svn_error_to_rb_error(svn_error_t *error);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_handle_svn_error(svn_error_t *error);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void *svn_swig_rb_to_swig_type(VALUE value, const void *ctx, apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_from_swig_type(void *value, void *ctx);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_depth_t svn_swig_rb_to_depth(VALUE value);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_mergeinfo_inheritance_t svn_swig_rb_to_mergeinfo_inheritance(VALUE value);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_svn_date_string_to_time(const char *date);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_hash_to_hash_string(apr_hash_t *hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_hash_to_hash_svn_string(apr_hash_t *hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_hash_to_hash_swig_type(apr_hash_t *hash,
const char *type_name);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_hash_to_hash_merge_range(apr_hash_t *hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_hash_to_hash_merge_range_hash(apr_hash_t *hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_prop_hash_to_hash(apr_hash_t *prop_hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_revnum_key_hash_to_hash_string(apr_hash_t *hash);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_string(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_svn_string(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_svn_rev(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_proplist_item(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_external_item2(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_merge_range(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_apr_array_to_array_auth_provider_object(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_prop_apr_array_to_hash_prop(const apr_array_header_t *ary);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_rb_hash_to_apr_hash_string(VALUE hash, apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_rb_hash_to_apr_hash_svn_string(VALUE hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_rb_hash_to_apr_hash_swig_type(VALUE hash,
const char *typename,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_rb_hash_to_apr_hash_revnum(VALUE hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_hash_t *svn_swig_rb_hash_to_apr_hash_merge_range(VALUE hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_strings_to_apr_array(VALUE strings,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *
svn_swig_rb_array_to_auth_provider_object_apr_array(VALUE array,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_array_to_apr_array_revnum(VALUE array,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_array_to_apr_array_merge_range(VALUE array,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_array_to_apr_array_copy_source(VALUE array,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_array_to_apr_array_revision_range(VALUE array,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_to_apr_array_prop(VALUE array_or_hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_array_header_t *svn_swig_rb_to_apr_array_row_prop(VALUE array_or_hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_get_pool(int argc, VALUE *argv, VALUE self, VALUE *rb_pool, apr_pool_t **pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_boolean_t svn_swig_rb_set_pool(VALUE target, VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_set_pool_for_no_swig_type(VALUE target, VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_push_pool(VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_pop_pool(VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_destroy_pool(VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_destroy_internal_pool(VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_make_delta_editor(svn_delta_editor_t **editor,
void **edit_baton,
VALUE rb_editor,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_make_baton(VALUE proc, VALUE pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_set_baton(VALUE target, VALUE baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_log_receiver(void *baton,
apr_hash_t *changed_paths,
svn_revnum_t revision,
@@ -243,19 +184,16 @@ svn_error_t *svn_swig_rb_log_receiver(void *baton,
const char *message,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_log_entry_receiver(void *baton,
svn_log_entry_t *entry,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_repos_authz_func(svn_boolean_t *allowed,
svn_fs_root_t *root,
const char *path,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_repos_authz_callback(svn_repos_authz_access_t required,
svn_boolean_t *allowed,
svn_fs_root_t *root,
@@ -264,7 +202,6 @@ svn_error_t *svn_swig_rb_repos_authz_callback(svn_repos_authz_access_t required,
apr_pool_t *pool);
/* Implements the svn_client_get_commit_log3_t API. */
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_get_commit_log_func(const char **log_msg,
const char **tmp_file,
const apr_array_header_t *
@@ -272,76 +209,60 @@ svn_error_t *svn_swig_rb_get_commit_log_func(const char **log_msg,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_notify_func2(void *baton,
const svn_wc_notify_t *notify,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_conflict_resolver_func
(svn_wc_conflict_result_t **result,
const svn_wc_conflict_description_t *description,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_commit_callback(svn_revnum_t new_revision,
const char *date,
const char *author,
void *baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_commit_callback2(const svn_commit_info_t *commit_info,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_cancel_func(void *cancel_baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_info_receiver(void *baton,
const char *path,
const svn_info_t *info,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_boolean_t svn_swig_rb_config_enumerator(const char *name,
const char *value,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_boolean_t svn_swig_rb_config_section_enumerator(const char *name,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_delta_path_driver_cb_func(void **dir_baton,
void *parent_baton,
void *callback_baton,
const char *path,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_txdelta_window_handler(svn_txdelta_window_t *window,
void *baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_fs_warning_callback(void *baton, svn_error_t *err);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_fs_warning_callback_baton_register(VALUE baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_fs_get_locks_callback(void *baton,
svn_lock_t *lock,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_just_call(void *baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_setup_ra_callbacks(svn_ra_callbacks2_t **callbacks,
void **baton,
VALUE rb_callbacks,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_ra_lock_callback(void *baton,
const char *path,
svn_boolean_t do_lock,
@@ -349,7 +270,6 @@ svn_error_t *svn_swig_rb_ra_lock_callback(void *baton,
svn_error_t *ra_err,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_ra_file_rev_handler(void *baton,
const char *path,
svn_revnum_t rev,
@@ -359,13 +279,11 @@ svn_error_t *svn_swig_rb_ra_file_rev_handler(void *baton,
apr_array_header_t *prop_diffs,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_repos_history_func(void *baton,
const char *path,
svn_revnum_t revision,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_repos_file_rev_handler(void *baton,
const char *path,
svn_revnum_t rev,
@@ -375,7 +293,6 @@ svn_error_t *svn_swig_rb_repos_file_rev_handler(void *baton,
apr_array_header_t *prop_diffs,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_wc_relocation_validator3(void *baton,
const char *uuid,
const char *url,
@@ -384,14 +301,12 @@ svn_error_t *svn_swig_rb_wc_relocation_validator3(void *baton,
/* auth provider callbacks */
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t * svn_swig_rb_auth_gnome_keyring_unlock_prompt_func(
char **keyring_passwd,
const char *keyring_name,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_auth_simple_prompt_func(
svn_auth_cred_simple_t **cred,
void *baton,
@@ -400,7 +315,6 @@ svn_error_t *svn_swig_rb_auth_simple_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_auth_username_prompt_func(
svn_auth_cred_username_t **cred,
void *baton,
@@ -408,7 +322,6 @@ svn_error_t *svn_swig_rb_auth_username_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_auth_ssl_server_trust_prompt_func(
svn_auth_cred_ssl_server_trust_t **cred,
void *baton,
@@ -418,7 +331,6 @@ svn_error_t *svn_swig_rb_auth_ssl_server_trust_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_auth_ssl_client_cert_prompt_func(
svn_auth_cred_ssl_client_cert_t **cred,
void *baton,
@@ -426,7 +338,6 @@ svn_error_t *svn_swig_rb_auth_ssl_client_cert_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_auth_ssl_client_cert_pw_prompt_func(
svn_auth_cred_ssl_client_cert_pw_t **cred,
void *baton,
@@ -434,27 +345,20 @@ svn_error_t *svn_swig_rb_auth_ssl_client_cert_pw_prompt_func(
svn_boolean_t may_save,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
apr_file_t *svn_swig_rb_make_file(VALUE file, apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_stream_t *svn_swig_rb_make_stream(VALUE io);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_filename_to_temp_file(const char *file_name);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_set_revision(svn_opt_revision_t *rev, VALUE value);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_adjust_arg_for_client_ctx_and_pool(int *argc, VALUE **argv);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
void svn_swig_rb_wc_status_func(void *baton,
const char *path,
svn_wc_status2_t *status);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_client_blame_receiver_func(void *baton,
apr_int64_t line_no,
svn_revnum_t revision,
@@ -464,39 +368,27 @@ svn_error_t *svn_swig_rb_client_blame_receiver_func(void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_wc_entry_callbacks2_t *svn_swig_rb_wc_entry_callbacks2(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_wc_diff_callbacks2_t *svn_swig_rb_wc_diff_callbacks2(void);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_make_txdelta_window_handler_wrapper(VALUE *rb_handler_pool,
apr_pool_t **handler_pool,
svn_txdelta_window_handler_t **handler,
void ***handler_baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_setup_txdelta_window_handler_wrapper(VALUE obj,
svn_txdelta_window_handler_t handler,
void *handler_baton);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
-svn_error_t *svn_swig_rb_invoke_txdelta_window_handler(VALUE window_handler,
- svn_txdelta_window_t *window,
- apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_invoke_txdelta_window_handler_wrapper(VALUE obj,
svn_txdelta_window_t *window,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
VALUE svn_swig_rb_txdelta_window_t_ops_get(svn_txdelta_window_t *window);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_client_diff_summarize_func(const svn_client_diff_summarize_t *diff,
void *baton,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_client_list_func(void *baton,
const char *path,
const svn_dirent_t *dirent,
@@ -504,20 +396,17 @@ svn_error_t *svn_swig_rb_client_list_func(void *baton,
const char *abs_path,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_proplist_receiver(void *baton,
const char *path,
apr_hash_t *prop_hash,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
svn_error_t *svn_swig_rb_changelist_receiver(void *baton,
const char *path,
const char *changelist,
apr_pool_t *pool);
-SVN_RB_SWIG_SWIGUTIL_EXPORT
-extern svn_ra_reporter3_t *svn_swig_rb_ra_reporter3;
+svn_ra_reporter3_t *svn_swig_rb_get_ra_reporter3();
#ifdef __cplusplus
}
diff --git a/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h
new file mode 100644
index 0000000..bc8eb6e
--- /dev/null
+++ b/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h
@@ -0,0 +1,99 @@
+/*
+ *
+ * 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_SWIG_SWIGUTIL_RB__PRE_RUBY_H
+#define SVN_SWIG_SWIGUTIL_RB__PRE_RUBY_H
+
+#if defined(SVN_SWIG_RUBY__CUSTOM_RUBY_CONFIG) && defined(_MSC_VER)
+/* The standard install of Ruby on Windows 1.9 expects to be build with MINGW,
+ a gcc compatible toolchain. Since 1.8 they removed much of the compatibility
+ with Visual C++, but we can't build with MingW as that would break APR
+ binary compatibility.
+ */
+
+#include <ruby/config.h>
+
+#undef NORETURN
+#undef DEPRECATED
+#undef FUNC_STDCALL
+#undef FUNC_CDECL
+#undef FUNC_FASTCALL
+#undef RUBY_ALIAS_FUNCTION_TYPE
+#undef RUBY_ALIAS_FUNCTION_VOID
+#undef HAVE_GCC_ATOMIC_BUILTINS
+#undef RUBY_FUNC_EXPORTED
+#undef RUBY_FUNC_EXPORTED
+#undef RUBY_EXTERN
+
+#define NORETURN(x) __declspec(noreturn) x
+#define RUBY_EXTERN extern __declspec(dllimport)
+
+/* Yuck. But this makes ruby happy */
+#undef pid_t
+#undef uid_t
+#undef gid_t
+typedef int pid_t;
+typedef int uid_t;
+typedef int gid_t;
+
+#if !defined(__cplusplus) && !defined(inline)
+#define inline __inline
+#endif
+typedef long ssize_t;
+
+/* Don't define iovec when including APR */
+#define APR_IOVEC_DEFINED
+
+/* Undefine headers that aren't available in Visual C++, but config.h says
+ are available. */
+#undef HAVE_UNISTD_H
+
+/* Visual C++ >= 2010 has <stdint.h> */
+#if _MSC_VER < 1600
+#undef HAVE_STDINT_H
+
+typedef signed __int8 int8_t;
+typedef signed __int16 int16_t;
+typedef signed __int32 int32_t;
+typedef signed __int64 int64_t;
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+#endif
+
+/* Visual C++ >= 2013 has <inttypes.h> */
+#if _MSC_VER < 1800
+#undef HAVE_INTTYPES_H
+#endif
+
+/* Visual Studio >= 2015 has timespec defined */
+#if _MSC_VER >= 1900
+#define HAVE_STRUCT_TIMESPEC
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4702) /* warning C4702: unreachable code */
+#endif
+
+#endif /* defined(SVN_SWIG_RUBY__CUSTOM_RUBY_CONFIG) && defined(_MSC_VER) */
+
+#endif /* SVN_SWIG_SWIGUTIL_RB__PRE_RUBY_H */
diff --git a/subversion/bindings/swig/ruby/svn_client.c b/subversion/bindings/swig/ruby/svn_client.c
index f9ac920..8c7043b 100644
--- a/subversion/bindings/swig/ruby/svn_client.c
+++ b/subversion/bindings/swig/ruby/svn_client.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1809,134 +1798,134 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[14]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[15]
#define SWIGTYPE_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_int swig_types[42]
-#define SWIGTYPE_p_long swig_types[43]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[44]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[45]
-#define SWIGTYPE_p_p_char swig_types[46]
-#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[47]
-#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[48]
-#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[49]
-#define SWIGTYPE_p_p_svn_commit_info_t swig_types[50]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[51]
-#define SWIGTYPE_p_p_svn_string_t swig_types[52]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[53]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[54]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[55]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[56]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[57]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[58]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[59]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[60]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[61]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[62]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[63]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[64]
-#define SWIGTYPE_p_svn_checksum_t swig_types[65]
-#define SWIGTYPE_p_svn_client_commit_info_t swig_types[66]
-#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[67]
-#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[68]
-#define SWIGTYPE_p_svn_client_commit_item_t swig_types[69]
-#define SWIGTYPE_p_svn_client_copy_source_t swig_types[70]
-#define SWIGTYPE_p_svn_client_ctx_t swig_types[71]
-#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[72]
-#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[73]
-#define SWIGTYPE_p_svn_client_info2_t swig_types[74]
-#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[75]
-#define SWIGTYPE_p_svn_client_status_t swig_types[76]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[77]
-#define SWIGTYPE_p_svn_config_t swig_types[78]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[79]
-#define SWIGTYPE_p_svn_depth_t swig_types[80]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[81]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[82]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[83]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[84]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[85]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[86]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[87]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[88]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[89]
-#define SWIGTYPE_p_svn_diff_t swig_types[90]
-#define SWIGTYPE_p_svn_dirent_t swig_types[91]
-#define SWIGTYPE_p_svn_errno_t swig_types[92]
-#define SWIGTYPE_p_svn_error_t swig_types[93]
-#define SWIGTYPE_p_svn_info_t swig_types[94]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[95]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[96]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[97]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[98]
-#define SWIGTYPE_p_svn_lock_t swig_types[99]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[100]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[101]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[102]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[103]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[104]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[105]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[106]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[107]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[108]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[109]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[110]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[111]
-#define SWIGTYPE_p_svn_patch_t swig_types[112]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[113]
-#define SWIGTYPE_p_svn_prop_kind swig_types[114]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[115]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[116]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[117]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[118]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[119]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[120]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[121]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[122]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[123]
-#define SWIGTYPE_p_svn_stream_t swig_types[124]
-#define SWIGTYPE_p_svn_string_t swig_types[125]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[126]
-#define SWIGTYPE_p_svn_tristate_t swig_types[127]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[128]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[129]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[130]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[131]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[132]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[133]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[134]
-#define SWIGTYPE_p_svn_version_t swig_types[135]
-#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[136]
-#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[137]
-#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[138]
-#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[139]
-#define SWIGTYPE_p_svn_wc_conflict_description2_t swig_types[140]
-#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[141]
-#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[142]
-#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[143]
-#define SWIGTYPE_p_svn_wc_conflict_result_t swig_types[144]
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_dirent_t_p_q_const__svn_lock_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_info_t_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status2_t__void swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_struct_svn_wc_status_t__void swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_svn_wc_status2_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_wc_notify_t_p_apr_pool_t__void swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_svn_boolean_t_p_q_const__char_p_q_const__svn_io_dirent2_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_svn_revnum_t_apr_int64_t_svn_revnum_t_p_apr_hash_t_svn_revnum_t_p_apr_hash_t_p_q_const__char_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_int swig_types[44]
+#define SWIGTYPE_p_long swig_types[45]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[46]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[47]
+#define SWIGTYPE_p_p_char swig_types[48]
+#define SWIGTYPE_p_p_svn_auth_provider_object_t swig_types[49]
+#define SWIGTYPE_p_p_svn_client_commit_info_t swig_types[50]
+#define SWIGTYPE_p_p_svn_client_ctx_t swig_types[51]
+#define SWIGTYPE_p_p_svn_commit_info_t swig_types[52]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[53]
+#define SWIGTYPE_p_p_svn_string_t swig_types[54]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[55]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[56]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[57]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[58]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[59]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[60]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[61]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[62]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[63]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[64]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[65]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[66]
+#define SWIGTYPE_p_svn_checksum_t swig_types[67]
+#define SWIGTYPE_p_svn_client_commit_info_t swig_types[68]
+#define SWIGTYPE_p_svn_client_commit_item2_t swig_types[69]
+#define SWIGTYPE_p_svn_client_commit_item3_t swig_types[70]
+#define SWIGTYPE_p_svn_client_commit_item_t swig_types[71]
+#define SWIGTYPE_p_svn_client_copy_source_t swig_types[72]
+#define SWIGTYPE_p_svn_client_ctx_t swig_types[73]
+#define SWIGTYPE_p_svn_client_diff_summarize_kind_t swig_types[74]
+#define SWIGTYPE_p_svn_client_diff_summarize_t swig_types[75]
+#define SWIGTYPE_p_svn_client_info2_t swig_types[76]
+#define SWIGTYPE_p_svn_client_proplist_item_t swig_types[77]
+#define SWIGTYPE_p_svn_client_status_t swig_types[78]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[79]
+#define SWIGTYPE_p_svn_config_t swig_types[80]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[81]
+#define SWIGTYPE_p_svn_depth_t swig_types[82]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[83]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[84]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[85]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[86]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[87]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[88]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[89]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[90]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[91]
+#define SWIGTYPE_p_svn_diff_t swig_types[92]
+#define SWIGTYPE_p_svn_dirent_t swig_types[93]
+#define SWIGTYPE_p_svn_errno_t swig_types[94]
+#define SWIGTYPE_p_svn_error_t swig_types[95]
+#define SWIGTYPE_p_svn_info_t swig_types[96]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[97]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[98]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[99]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[100]
+#define SWIGTYPE_p_svn_lock_t swig_types[101]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[102]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[103]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[104]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[105]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[106]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[107]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[108]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[109]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[110]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[111]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[112]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[113]
+#define SWIGTYPE_p_svn_patch_t swig_types[114]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[115]
+#define SWIGTYPE_p_svn_prop_kind swig_types[116]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[117]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[118]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[119]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[120]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[121]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[122]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[123]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[124]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[125]
+#define SWIGTYPE_p_svn_stream_t swig_types[126]
+#define SWIGTYPE_p_svn_string_t swig_types[127]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[128]
+#define SWIGTYPE_p_svn_tristate_t swig_types[129]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[130]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[131]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[132]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[133]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[134]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[135]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[136]
+#define SWIGTYPE_p_svn_version_t swig_types[137]
+#define SWIGTYPE_p_svn_wc_adm_access_t swig_types[138]
+#define SWIGTYPE_p_svn_wc_committed_queue_t swig_types[139]
+#define SWIGTYPE_p_svn_wc_conflict_action_t swig_types[140]
+#define SWIGTYPE_p_svn_wc_conflict_choice_t swig_types[141]
+#define SWIGTYPE_p_svn_wc_conflict_description_t swig_types[142]
+#define SWIGTYPE_p_svn_wc_conflict_kind_t swig_types[143]
+#define SWIGTYPE_p_svn_wc_conflict_reason_t swig_types[144]
#define SWIGTYPE_p_svn_wc_conflict_version_t swig_types[145]
#define SWIGTYPE_p_svn_wc_context_t swig_types[146]
#define SWIGTYPE_p_svn_wc_diff_callbacks2_t swig_types[147]
@@ -1979,7 +1968,7 @@ static VALUE mClient;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2052,7 +2041,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2157,7 +2146,7 @@ SWIG_From_int (int value)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2249,13 +2238,13 @@ SWIGINTERN struct svn_client_copy_source_t *new_svn_client_copy_source_t(char co
self = apr_palloc(pool, sizeof(*self));
self->path = path ? apr_pstrdup(pool, path) : NULL;
- revision = apr_palloc(pool, sizeof(revision));
+ revision = apr_palloc(pool, sizeof(*revision));
revision->kind = rev->kind;
revision->value.number = rev->value.number;
revision->value.date = rev->value.date;
self->revision = revision;
- peg_revision = apr_palloc(pool, sizeof(peg_revision));
+ peg_revision = apr_palloc(pool, sizeof(*peg_revision));
peg_revision->kind = peg_rev->kind;
peg_revision->value.number = peg_rev->value.number;
peg_revision->value.date = peg_rev->value.date;
@@ -2458,7 +2447,7 @@ _wrap_svn_client_get_simple_prompt_provider(int argc, VALUE *argv, VALUE self) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_simple_prompt_func;
+ arg2 = (svn_auth_simple_prompt_func_t) svn_swig_rb_auth_simple_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -2522,7 +2511,7 @@ _wrap_svn_client_get_username_prompt_provider(int argc, VALUE *argv, VALUE self)
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_username_prompt_func;
+ arg2 = (svn_auth_username_prompt_func_t) svn_swig_rb_auth_username_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -2833,7 +2822,7 @@ _wrap_svn_client_get_ssl_server_trust_prompt_provider(int argc, VALUE *argv, VAL
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_server_trust_prompt_func;
+ arg2 = (svn_auth_ssl_server_trust_prompt_func_t) svn_swig_rb_auth_ssl_server_trust_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
if (argc > 1) {
@@ -2892,7 +2881,7 @@ _wrap_svn_client_get_ssl_client_cert_prompt_provider(int argc, VALUE *argv, VALU
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -2956,7 +2945,7 @@ _wrap_svn_client_get_ssl_client_cert_pw_prompt_provider(int argc, VALUE *argv, V
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
{
- arg2 = svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
+ arg2 = (svn_auth_ssl_client_cert_pw_prompt_func_t) svn_swig_rb_auth_ssl_client_cert_pw_prompt_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
ecode4 = SWIG_AsVal_int(argv[1], &val4);
@@ -6761,6 +6750,161 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_check_tunnel_func_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","check_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_check_tunnel_func_t","check_tunnel_func", 2, argv[0] ));
+ }
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_check_tunnel_func_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_ra_check_tunnel_func_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","check_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ vresult = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_open_tunnel_func_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","open_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg2), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_open_tunnel_func_t","open_tunnel_func", 2, argv[0] ));
+ }
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_open_tunnel_func_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_ra_open_tunnel_func_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","open_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ vresult = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_tunnel_baton_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","tunnel_baton", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[0],SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","tunnel_baton", 2, argv[0] ));
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_ctx_t_tunnel_baton_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_client_ctx_t *arg1 = (struct svn_client_ctx_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_client_ctx_t *","tunnel_baton", 1, self ));
+ }
+ arg1 = (struct svn_client_ctx_t *)(argp1);
+ result = (void *) ((arg1)->tunnel_baton);
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 );
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
SWIGINTERN VALUE
_wrap_svn_client_ctx_t_allocate(VALUE self) {
@@ -12497,6 +12641,133 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_status6(int argc, VALUE *argv, VALUE self) {
+ svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
+ svn_client_ctx_t *arg2 = (svn_client_ctx_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ apr_array_header_t *arg12 = (apr_array_header_t *) 0 ;
+ svn_client_status_func_t arg13 = (svn_client_status_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_revnum_t temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_opt_revision_t rev4 ;
+ int res14 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg15);
+ _global_pool = arg15;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 13) || (argc > 14)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 13)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_status6", 2, argv[0] ));
+ }
+ arg2 = (svn_client_ctx_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_client_status6", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ {
+ arg4 = &rev4;
+ svn_swig_rb_set_revision(&rev4, argv[2]);
+ }
+ {
+ arg5 = svn_swig_rb_to_depth(argv[3]);
+ }
+ arg6 = RTEST(argv[4]);
+ arg7 = RTEST(argv[5]);
+ arg8 = RTEST(argv[6]);
+ arg9 = RTEST(argv[7]);
+ arg10 = RTEST(argv[8]);
+ arg11 = RTEST(argv[9]);
+ {
+ arg12 = (NIL_P(argv[10])) ? NULL :
+ svn_swig_rb_strings_to_apr_array(argv[10], _global_pool);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[11], (void**)(&arg13), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_status_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_client_status_func_t","svn_client_status6", 13, argv[11] ));
+ }
+ }
+ res14 = SWIG_ConvertPtr(argv[12],SWIG_as_voidptrptr(&arg14), 0, 0);
+ if (!SWIG_IsOK(res14)) {
+ SWIG_exception_fail(SWIG_ArgError(res14), Ruby_Format_TypeError( "", "void *","svn_client_status6", 14, argv[12] ));
+ }
+ if (argc > 13) {
+
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_status6(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,(apr_array_header_t const *)arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_long((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_long, new_flags));
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_status5(int argc, VALUE *argv, VALUE self) {
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
svn_client_ctx_t *arg2 = (svn_client_ctx_t *) 0 ;
@@ -12805,7 +13076,7 @@ _wrap_svn_client_status3(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev3, argv[1]);
}
{
- arg4 = svn_swig_rb_wc_status_func;
+ arg4 = (svn_wc_status_func2_t) svn_swig_rb_wc_status_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
@@ -12928,7 +13199,7 @@ _wrap_svn_client_status2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev3, argv[1]);
}
{
- arg4 = svn_swig_rb_wc_status_func;
+ arg4 = (svn_wc_status_func2_t) svn_swig_rb_wc_status_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg6 = RTEST(argv[3]);
@@ -13171,7 +13442,7 @@ _wrap_svn_client_log5(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[7], _global_pool);
}
{
- arg9 = svn_swig_rb_log_entry_receiver;
+ arg9 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -13292,7 +13563,7 @@ _wrap_svn_client_log4(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[8], _global_pool);
}
{
- arg10 = svn_swig_rb_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -13406,7 +13677,7 @@ _wrap_svn_client_log3(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -13514,7 +13785,7 @@ _wrap_svn_client_log2(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -13609,7 +13880,7 @@ _wrap_svn_client_log(int argc, VALUE *argv, VALUE self) {
arg4 = RTEST(argv[3]);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_log_receiver;
+ arg6 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -13977,7 +14248,7 @@ _wrap_svn_client_blame3(int argc, VALUE *argv, VALUE self) {
arg5 = (svn_diff_file_options_t *)(argp5);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_client_blame_receiver_func;
+ arg7 = (svn_client_blame_receiver_t) svn_swig_rb_client_blame_receiver_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -14086,7 +14357,7 @@ _wrap_svn_client_blame2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev4, argv[3]);
}
{
- arg5 = svn_swig_rb_client_blame_receiver_func;
+ arg5 = (svn_client_blame_receiver_t) svn_swig_rb_client_blame_receiver_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -14189,7 +14460,7 @@ _wrap_svn_client_blame(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev3, argv[2]);
}
{
- arg4 = svn_swig_rb_client_blame_receiver_func;
+ arg4 = (svn_client_blame_receiver_t) svn_swig_rb_client_blame_receiver_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -16049,7 +16320,7 @@ _wrap_svn_client_diff_summarize2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[6], _global_pool);
}
{
- arg8 = svn_swig_rb_client_diff_summarize_func;
+ arg8 = (svn_client_diff_summarize_func_t) svn_swig_rb_client_diff_summarize_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -16162,7 +16433,7 @@ _wrap_svn_client_diff_summarize(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_client_diff_summarize_func;
+ arg7 = (svn_client_diff_summarize_func_t) svn_swig_rb_client_diff_summarize_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -16279,7 +16550,7 @@ _wrap_svn_client_diff_summarize_peg2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[6], _global_pool);
}
{
- arg8 = svn_swig_rb_client_diff_summarize_func;
+ arg8 = (svn_client_diff_summarize_func_t) svn_swig_rb_client_diff_summarize_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -16392,7 +16663,7 @@ _wrap_svn_client_diff_summarize_peg(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_client_diff_summarize_func;
+ arg7 = (svn_client_diff_summarize_func_t) svn_swig_rb_client_diff_summarize_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -18352,7 +18623,7 @@ _wrap_svn_client_mergeinfo_log2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev7, argv[6]);
}
{
- arg8 = svn_swig_rb_log_entry_receiver;
+ arg8 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
arg10 = RTEST(argv[8]);
@@ -18466,7 +18737,7 @@ _wrap_svn_client_mergeinfo_log(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev5, argv[4]);
}
{
- arg6 = svn_swig_rb_log_entry_receiver;
+ arg6 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
arg8 = RTEST(argv[6]);
@@ -18583,7 +18854,7 @@ _wrap_svn_client_mergeinfo_log_merged(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev4, argv[3]);
}
{
- arg5 = svn_swig_rb_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
arg7 = RTEST(argv[5]);
@@ -18704,7 +18975,7 @@ _wrap_svn_client_mergeinfo_log_eligible(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_set_revision(&rev4, argv[3]);
}
{
- arg5 = svn_swig_rb_log_entry_receiver;
+ arg5 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
arg7 = RTEST(argv[5]);
@@ -18766,6 +19037,170 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_vacuum(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg8);
+ _global_pool = arg8;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 7) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_client_vacuum", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ arg2 = RTEST(argv[1]);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ arg6 = RTEST(argv[5]);
+ res7 = SWIG_ConvertPtr(argv[6], &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_vacuum", 7, argv[6] ));
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (argc > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_vacuum((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_client_cleanup2(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ svn_boolean_t arg2 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg8);
+ _global_pool = arg8;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 7) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_client_cleanup2", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ arg2 = RTEST(argv[1]);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ arg6 = RTEST(argv[5]);
+ res7 = SWIG_ConvertPtr(argv[6], &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_cleanup2", 7, argv[6] ));
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (argc > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_cleanup2((char const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_cleanup(int argc, VALUE *argv, VALUE self) {
char *arg1 = (char *) 0 ;
svn_client_ctx_t *arg2 = (svn_client_ctx_t *) 0 ;
@@ -19118,6 +19553,92 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_revert3(int argc, VALUE *argv, VALUE self) {
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ svn_depth_t arg2 ;
+ apr_array_header_t *arg3 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_client_ctx_t *arg6 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp6 = 0 ;
+ int res6 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ int adjusted_argc = argc;
+ VALUE *adjusted_argv = argv;
+
+ svn_swig_rb_adjust_arg_for_client_ctx_and_pool(&adjusted_argc,
+ &adjusted_argv);
+ svn_swig_rb_get_pool(adjusted_argc, adjusted_argv, self,
+ &_global_svn_swig_rb_pool, &arg7);
+ _global_pool = arg7;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 7)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_strings_to_apr_array(argv[0], _global_pool);
+ }
+ {
+ arg2 = svn_swig_rb_to_depth(argv[1]);
+ }
+ {
+ arg3 = (NIL_P(argv[2])) ? NULL :
+ svn_swig_rb_strings_to_apr_array(argv[2], _global_pool);
+ }
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ if (argc > 5) {
+ res6 = SWIG_ConvertPtr(argv[5], &argp6,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_revert3", 6, argv[5] ));
+ }
+ arg6 = (svn_client_ctx_t *)(argp6);
+ }
+ if (argc > 6) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_revert3((apr_array_header_t const *)arg1,arg2,(apr_array_header_t const *)arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_revert2(int argc, VALUE *argv, VALUE self) {
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
svn_depth_t arg2 ;
@@ -19636,6 +20157,135 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_copy7(int argc, VALUE *argv, VALUE self) {
+ apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_hash_t *arg8 = (apr_hash_t *) 0 ;
+ apr_hash_t *arg9 = (apr_hash_t *) 0 ;
+ svn_commit_callback2_t arg10 = (svn_commit_callback2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ svn_client_ctx_t *arg12 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ void *argp8 = 0 ;
+ int res8 = 0 ;
+ void *argp12 = 0 ;
+ int res12 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ int adjusted_argc = argc;
+ VALUE *adjusted_argv = argv;
+
+ svn_swig_rb_adjust_arg_for_client_ctx_and_pool(&adjusted_argc,
+ &adjusted_argv);
+ svn_swig_rb_get_pool(adjusted_argc, adjusted_argv, self,
+ &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 10) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 10)",argc); SWIG_fail;
+ }
+ {
+ arg1 = svn_swig_rb_array_to_apr_array_copy_source(argv[0], _global_pool);
+ }
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_client_copy7", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ arg6 = RTEST(argv[5]);
+ arg7 = RTEST(argv[6]);
+ res8 = SWIG_ConvertPtr(argv[7], &argp8,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "apr_hash_t const *","svn_client_copy7", 8, argv[7] ));
+ }
+ arg8 = (apr_hash_t *)(argp8);
+ {
+ VALUE rb_pool = Qnil;
+ if (!_global_pool) {
+ svn_swig_rb_get_pool(argc, argv, self, &rb_pool, &_global_pool);
+ svn_swig_rb_push_pool(rb_pool);
+ }
+ arg9 = svn_swig_rb_hash_to_apr_hash_svn_string(argv[8], _global_pool);
+ _global_pool = NULL;
+ if (!NIL_P(rb_pool)) {
+ if (NIL_P(arg9)) {
+ svn_swig_rb_destroy_pool(rb_pool);
+ } else {
+ svn_swig_rb_set_pool_for_no_swig_type(argv[8], rb_pool);
+ }
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ }
+ {
+ arg10 = svn_swig_rb_commit_callback2;
+ arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
+ }
+ if (argc > 10) {
+ res12 = SWIG_ConvertPtr(argv[10], &argp12,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_copy7", 12, argv[10] ));
+ }
+ arg12 = (svn_client_ctx_t *)(argp12);
+ }
+ if (argc > 11) {
+
+ }
+ {
+ result = (svn_error_t *)svn_client_copy7((apr_array_header_t const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,(apr_hash_t const *)arg8,(apr_hash_t const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg11);
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_copy6(int argc, VALUE *argv, VALUE self) {
apr_array_header_t *arg1 = (apr_array_header_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -22851,7 +23501,7 @@ _wrap_svn_client_proplist3(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[4], _global_pool);
}
{
- arg6 = svn_swig_rb_proplist_receiver;
+ arg6 = (svn_proplist_receiver_t) svn_swig_rb_proplist_receiver;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -24063,7 +24713,7 @@ _wrap_svn_client_list2(int argc, VALUE *argv, VALUE self) {
arg5 = (apr_uint32_t)(val5);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_client_list_func;
+ arg7 = (svn_client_list_func_t) svn_swig_rb_client_list_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -24183,7 +24833,7 @@ _wrap_svn_client_list(int argc, VALUE *argv, VALUE self) {
arg5 = (apr_uint32_t)(val5);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_client_list_func;
+ arg7 = (svn_client_list_func_t) svn_swig_rb_client_list_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -24575,6 +25225,135 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_cat3(int argc, VALUE *argv, VALUE self) {
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_opt_revision_t *arg4 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg5 = (svn_opt_revision_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_client_ctx_t *arg7 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ apr_hash_t *temp1 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_opt_revision_t rev4 ;
+ svn_opt_revision_t rev5 ;
+ void *argp7 = 0 ;
+ int res7 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg8);
+ _global_pool = arg8;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 6) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail;
+ }
+ {
+ arg2 = svn_swig_rb_make_stream(argv[0]);
+ }
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_client_cat3", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ {
+ arg4 = &rev4;
+ svn_swig_rb_set_revision(&rev4, argv[2]);
+ }
+ {
+ arg5 = &rev5;
+ svn_swig_rb_set_revision(&rev5, argv[3]);
+ }
+ arg6 = RTEST(argv[4]);
+ res7 = SWIG_ConvertPtr(argv[5], &argp7,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_cat3", 7, argv[5] ));
+ }
+ arg7 = (svn_client_ctx_t *)(argp7);
+ if (argc > 6) {
+
+ }
+ if (argc > 7) {
+
+ }
+ {
+ if (!arg4) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg5) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_cat3(arg1,arg2,(char const *)arg3,(struct svn_opt_revision_t const *)arg4,(struct svn_opt_revision_t const *)arg5,arg6,arg7,arg8,arg9);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, svn_swig_rb_apr_hash_to_hash_svn_string(*arg1));
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_cat2(int argc, VALUE *argv, VALUE self) {
svn_stream_t *arg1 = (svn_stream_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -24989,7 +25768,7 @@ _wrap_svn_client_get_changelists(int argc, VALUE *argv, VALUE self) {
arg3 = svn_swig_rb_to_depth(argv[2]);
}
{
- arg4 = svn_swig_rb_changelist_receiver;
+ arg4 = (svn_changelist_receiver_t) svn_swig_rb_changelist_receiver;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -27649,6 +28428,128 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_client_info4(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ svn_opt_revision_t *arg2 = (svn_opt_revision_t *) 0 ;
+ svn_opt_revision_t *arg3 = (svn_opt_revision_t *) 0 ;
+ svn_depth_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ svn_client_info_receiver2_t arg9 = (svn_client_info_receiver2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ svn_client_ctx_t *arg11 = (svn_client_ctx_t *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ svn_opt_revision_t rev2 ;
+ svn_opt_revision_t rev3 ;
+ int res10 ;
+ void *argp11 = 0 ;
+ int res11 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg12);
+ _global_pool = arg12;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_client_info4", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ {
+ arg2 = &rev2;
+ svn_swig_rb_set_revision(&rev2, argv[1]);
+ }
+ {
+ arg3 = &rev3;
+ svn_swig_rb_set_revision(&rev3, argv[2]);
+ }
+ {
+ arg4 = svn_swig_rb_to_depth(argv[3]);
+ }
+ arg5 = RTEST(argv[4]);
+ arg6 = RTEST(argv[5]);
+ arg7 = RTEST(argv[6]);
+ {
+ arg8 = (NIL_P(argv[7])) ? NULL :
+ svn_swig_rb_strings_to_apr_array(argv[7], _global_pool);
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[8], (void**)(&arg9), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_client_info2_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_client_info_receiver2_t","svn_client_info4", 9, argv[8] ));
+ }
+ }
+ res10 = SWIG_ConvertPtr(argv[9],SWIG_as_voidptrptr(&arg10), 0, 0);
+ if (!SWIG_IsOK(res10)) {
+ SWIG_exception_fail(SWIG_ArgError(res10), Ruby_Format_TypeError( "", "void *","svn_client_info4", 10, argv[9] ));
+ }
+ res11 = SWIG_ConvertPtr(argv[10], &argp11,SWIGTYPE_p_svn_client_ctx_t, 0 | 0 );
+ if (!SWIG_IsOK(res11)) {
+ SWIG_exception_fail(SWIG_ArgError(res11), Ruby_Format_TypeError( "", "svn_client_ctx_t *","svn_client_info4", 11, argv[10] ));
+ }
+ arg11 = (svn_client_ctx_t *)(argp11);
+ if (argc > 11) {
+
+ }
+ {
+ if (!arg2) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ if (!arg3) {
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer.");
+ }
+ }
+ {
+ result = (svn_error_t *)svn_client_info4((char const *)arg1,(struct svn_opt_revision_t const *)arg2,(struct svn_opt_revision_t const *)arg3,arg4,arg5,arg6,arg7,(apr_array_header_t const *)arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_client_info3(int argc, VALUE *argv, VALUE self) {
char *arg1 = (char *) 0 ;
svn_opt_revision_t *arg2 = (svn_opt_revision_t *) 0 ;
@@ -30828,7 +31729,7 @@ _wrap_svn_client_set_log_msg_func3(int argc, VALUE *argv, VALUE self) {
}
arg1 = (svn_client_ctx_t *)(argp1);
{
- arg2 = svn_swig_rb_get_commit_log_func;
+ arg2 = (svn_client_get_commit_log3_t) svn_swig_rb_get_commit_log_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
if (argc > 2) {
@@ -30888,7 +31789,7 @@ _wrap_svn_client_set_notify_func2(int argc, VALUE *argv, VALUE self) {
}
arg1 = (svn_client_ctx_t *)(argp1);
{
- arg2 = svn_swig_rb_notify_func2;
+ arg2 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
if (argc > 2) {
@@ -30948,7 +31849,7 @@ _wrap_svn_client_set_cancel_func(int argc, VALUE *argv, VALUE self) {
}
arg1 = (svn_client_ctx_t *)(argp1);
{
- arg2 = svn_swig_rb_cancel_func;
+ arg2 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
if (argc > 2) {
@@ -31136,6 +32037,7 @@ static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "svn_auth_ssl_client_cert_prompt_func_t|struct svn_error_t *(*)(svn_auth_cred_ssl_client_cert_t **,void *,char const *,svn_boolean_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_ssl_server_trust_t **,void *,char const *,apr_uint32_t,svn_auth_ssl_server_cert_info_t const *,svn_boolean_t,apr_pool_t *)|svn_auth_ssl_server_trust_prompt_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_auth_cred_username_t **,void *,char const *,svn_boolean_t,apr_pool_t *)|svn_auth_username_prompt_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func2_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description2_t const *,void *,apr_pool_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_wc_conflict_resolver_func_t|struct svn_error_t *(*)(svn_wc_conflict_result_t **,svn_wc_conflict_description_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_client_diff_summarize_func_t|struct svn_error_t *(*)(svn_client_diff_summarize_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -31144,6 +32046,7 @@ static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_e
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_client_blame_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_client_blame_receiver2_t|struct svn_error_t *(*)(void *,apr_int64_t,svn_revnum_t,char const *,char const *,svn_revnum_t,char const *,char const *,char const *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void = {"_p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void", "void (*)(void *,char const *,enum svn_wc_notify_action_t,enum svn_node_kind_t,char const *,enum svn_wc_notify_state_t,enum svn_wc_notify_state_t,long)|svn_wc_notify_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_array_header_t *,apr_pool_t *)|svn_proplist_receiver2_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,apr_hash_t *,apr_pool_t *)|svn_proplist_receiver_t", 0, 0, (void*)0, 0};
@@ -31259,11 +32162,9 @@ static swig_type_info _swigt__p_svn_wc_adm_access_t = {"_p_svn_wc_adm_access_t",
static swig_type_info _swigt__p_svn_wc_committed_queue_t = {"_p_svn_wc_committed_queue_t", "struct svn_wc_committed_queue_t *|svn_wc_committed_queue_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_action_t = {"_p_svn_wc_conflict_action_t", "enum svn_wc_conflict_action_t *|svn_wc_conflict_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_choice_t = {"_p_svn_wc_conflict_choice_t", "enum svn_wc_conflict_choice_t *|svn_wc_conflict_choice_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_description2_t = {"_p_svn_wc_conflict_description2_t", "struct svn_wc_conflict_description2_t *|svn_wc_conflict_description2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_description_t = {"_p_svn_wc_conflict_description_t", "struct svn_wc_conflict_description_t *|svn_wc_conflict_description_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_kind_t = {"_p_svn_wc_conflict_kind_t", "enum svn_wc_conflict_kind_t *|svn_wc_conflict_kind_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_reason_t = {"_p_svn_wc_conflict_reason_t", "enum svn_wc_conflict_reason_t *|svn_wc_conflict_reason_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_svn_wc_conflict_result_t = {"_p_svn_wc_conflict_result_t", "struct svn_wc_conflict_result_t *|svn_wc_conflict_result_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_conflict_version_t = {"_p_svn_wc_conflict_version_t", "struct svn_wc_conflict_version_t *|svn_wc_conflict_version_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_context_t = {"_p_svn_wc_context_t", "struct svn_wc_context_t *|svn_wc_context_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_wc_diff_callbacks2_t = {"_p_svn_wc_diff_callbacks2_t", "struct svn_wc_diff_callbacks2_t *|svn_wc_diff_callbacks2_t *", 0, 0, (void*)0, 0};
@@ -31309,6 +32210,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -31317,6 +32219,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -31432,11 +32335,9 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_wc_committed_queue_t,
&_swigt__p_svn_wc_conflict_action_t,
&_swigt__p_svn_wc_conflict_choice_t,
- &_swigt__p_svn_wc_conflict_description2_t,
&_swigt__p_svn_wc_conflict_description_t,
&_swigt__p_svn_wc_conflict_kind_t,
&_swigt__p_svn_wc_conflict_reason_t,
- &_swigt__p_svn_wc_conflict_result_t,
&_swigt__p_svn_wc_conflict_version_t,
&_swigt__p_svn_wc_context_t,
&_swigt__p_svn_wc_diff_callbacks2_t,
@@ -31482,6 +32383,7 @@ static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_pw_t_p_void_
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -31490,6 +32392,7 @@ static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_v
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void[] = { {&_swigt__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -31605,11 +32508,9 @@ static swig_cast_info _swigc__p_svn_wc_adm_access_t[] = { {&_swigt__p_svn_wc_ad
static swig_cast_info _swigc__p_svn_wc_committed_queue_t[] = { {&_swigt__p_svn_wc_committed_queue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_action_t[] = { {&_swigt__p_svn_wc_conflict_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_choice_t[] = { {&_swigt__p_svn_wc_conflict_choice_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_description2_t[] = { {&_swigt__p_svn_wc_conflict_description2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_description_t[] = { {&_swigt__p_svn_wc_conflict_description_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_kind_t[] = { {&_swigt__p_svn_wc_conflict_kind_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_reason_t[] = { {&_swigt__p_svn_wc_conflict_reason_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_svn_wc_conflict_result_t[] = { {&_swigt__p_svn_wc_conflict_result_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_conflict_version_t[] = { {&_swigt__p_svn_wc_conflict_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_context_t[] = { {&_swigt__p_svn_wc_context_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_wc_diff_callbacks2_t[] = { {&_swigt__p_svn_wc_diff_callbacks2_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -31655,6 +32556,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_p_svn_auth_cred_ssl_client_cert_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_ssl_server_trust_t_p_void_p_q_const__char_apr_uint32_t_p_q_const__svn_auth_ssl_server_cert_info_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_auth_cred_username_t_p_void_p_q_const__char_svn_boolean_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description2_t_p_void_p_apr_pool_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_svn_wc_conflict_result_t_p_q_const__svn_wc_conflict_description_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_client_diff_summarize_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -31663,6 +32565,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_revnum_t_p_q_const__char_p_q_const__char_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_enum_svn_wc_notify_action_t_enum_svn_node_kind_t_p_q_const__char_enum_svn_wc_notify_state_t_enum_svn_wc_notify_state_t_long__void,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
@@ -31778,11 +32681,9 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_wc_committed_queue_t,
_swigc__p_svn_wc_conflict_action_t,
_swigc__p_svn_wc_conflict_choice_t,
- _swigc__p_svn_wc_conflict_description2_t,
_swigc__p_svn_wc_conflict_description_t,
_swigc__p_svn_wc_conflict_kind_t,
_swigc__p_svn_wc_conflict_reason_t,
- _swigc__p_svn_wc_conflict_result_t,
_swigc__p_svn_wc_conflict_version_t,
_swigc__p_svn_wc_context_t,
_swigc__p_svn_wc_diff_callbacks2_t,
@@ -31816,18 +32717,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -31837,17 +32738,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -31910,7 +32811,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -31924,7 +32825,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -31951,7 +32852,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -32266,6 +33167,12 @@ SWIGEXPORT void Init_client(void) {
rb_define_method(SwigClassSvn_client_ctx_t.klass, "conflict_baton2", _wrap_svn_client_ctx_t_conflict_baton2_get, -1);
rb_define_method(SwigClassSvn_client_ctx_t.klass, "wc_ctx=", _wrap_svn_client_ctx_t_wc_ctx_set, -1);
rb_define_method(SwigClassSvn_client_ctx_t.klass, "wc_ctx", _wrap_svn_client_ctx_t_wc_ctx_get, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "check_tunnel_func=", _wrap_svn_client_ctx_t_check_tunnel_func_set, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "check_tunnel_func", _wrap_svn_client_ctx_t_check_tunnel_func_get, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "open_tunnel_func=", _wrap_svn_client_ctx_t_open_tunnel_func_set, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "open_tunnel_func", _wrap_svn_client_ctx_t_open_tunnel_func_get, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "tunnel_baton=", _wrap_svn_client_ctx_t_tunnel_baton_set, -1);
+ rb_define_method(SwigClassSvn_client_ctx_t.klass, "tunnel_baton", _wrap_svn_client_ctx_t_tunnel_baton_get, -1);
SwigClassSvn_client_ctx_t.mark = 0;
SwigClassSvn_client_ctx_t.destroy = (void (*)(void *)) free_svn_client_ctx_t;
SwigClassSvn_client_ctx_t.trackObjects = 0;
@@ -32383,6 +33290,7 @@ SWIGEXPORT void Init_client(void) {
SwigClassSvn_client_status_t.destroy = (void (*)(void *)) free_svn_client_status_t;
SwigClassSvn_client_status_t.trackObjects = 0;
rb_define_module_function(mClient, "svn_client_status_dup", _wrap_svn_client_status_dup, -1);
+ rb_define_module_function(mClient, "svn_client_status6", _wrap_svn_client_status6, -1);
rb_define_module_function(mClient, "svn_client_status5", _wrap_svn_client_status5, -1);
rb_define_module_function(mClient, "svn_client_status4", _wrap_svn_client_status4, -1);
rb_define_module_function(mClient, "svn_client_status3", _wrap_svn_client_status3, -1);
@@ -32432,10 +33340,13 @@ SWIGEXPORT void Init_client(void) {
rb_define_module_function(mClient, "svn_client_mergeinfo_log", _wrap_svn_client_mergeinfo_log, -1);
rb_define_module_function(mClient, "svn_client_mergeinfo_log_merged", _wrap_svn_client_mergeinfo_log_merged, -1);
rb_define_module_function(mClient, "svn_client_mergeinfo_log_eligible", _wrap_svn_client_mergeinfo_log_eligible, -1);
+ rb_define_module_function(mClient, "svn_client_vacuum", _wrap_svn_client_vacuum, -1);
+ rb_define_module_function(mClient, "svn_client_cleanup2", _wrap_svn_client_cleanup2, -1);
rb_define_module_function(mClient, "svn_client_cleanup", _wrap_svn_client_cleanup, -1);
rb_define_module_function(mClient, "svn_client_upgrade", _wrap_svn_client_upgrade, -1);
rb_define_module_function(mClient, "svn_client_relocate2", _wrap_svn_client_relocate2, -1);
rb_define_module_function(mClient, "svn_client_relocate", _wrap_svn_client_relocate, -1);
+ rb_define_module_function(mClient, "svn_client_revert3", _wrap_svn_client_revert3, -1);
rb_define_module_function(mClient, "svn_client_revert2", _wrap_svn_client_revert2, -1);
rb_define_module_function(mClient, "svn_client_revert", _wrap_svn_client_revert, -1);
rb_define_module_function(mClient, "svn_client_resolved", _wrap_svn_client_resolved, -1);
@@ -32451,6 +33362,7 @@ SWIGEXPORT void Init_client(void) {
SwigClassSvn_client_copy_source_t.mark = 0;
SwigClassSvn_client_copy_source_t.destroy = (void (*)(void *)) free_svn_client_copy_source_t;
SwigClassSvn_client_copy_source_t.trackObjects = 0;
+ rb_define_module_function(mClient, "svn_client_copy7", _wrap_svn_client_copy7, -1);
rb_define_module_function(mClient, "svn_client_copy6", _wrap_svn_client_copy6, -1);
rb_define_module_function(mClient, "svn_client_copy5", _wrap_svn_client_copy5, -1);
rb_define_module_function(mClient, "svn_client_copy4", _wrap_svn_client_copy4, -1);
@@ -32493,6 +33405,7 @@ SWIGEXPORT void Init_client(void) {
rb_define_module_function(mClient, "svn_client_ls3", _wrap_svn_client_ls3, -1);
rb_define_module_function(mClient, "svn_client_ls2", _wrap_svn_client_ls2, -1);
rb_define_module_function(mClient, "svn_client_ls", _wrap_svn_client_ls, -1);
+ rb_define_module_function(mClient, "svn_client_cat3", _wrap_svn_client_cat3, -1);
rb_define_module_function(mClient, "svn_client_cat2", _wrap_svn_client_cat2, -1);
rb_define_module_function(mClient, "svn_client_cat", _wrap_svn_client_cat, -1);
rb_define_module_function(mClient, "svn_client_add_to_changelist", _wrap_svn_client_add_to_changelist, -1);
@@ -32594,6 +33507,7 @@ SWIGEXPORT void Init_client(void) {
SwigClassSvn_client_info2_t.destroy = (void (*)(void *)) free_svn_client_info2_t;
SwigClassSvn_client_info2_t.trackObjects = 0;
rb_define_module_function(mClient, "svn_client_info2_dup", _wrap_svn_client_info2_dup, -1);
+ rb_define_module_function(mClient, "svn_client_info4", _wrap_svn_client_info4, -1);
rb_define_module_function(mClient, "svn_client_info3", _wrap_svn_client_info3, -1);
rb_define_module_function(mClient, "svn_client_info2", _wrap_svn_client_info2, -1);
rb_define_module_function(mClient, "svn_client_info", _wrap_svn_client_info, -1);
diff --git a/subversion/bindings/swig/ruby/svn_delta.c b/subversion/bindings/swig/ruby/svn_delta.c
index ba4a469..bf33b52 100644
--- a/subversion/bindings/swig/ruby/svn_delta.c
+++ b/subversion/bindings/swig/ruby/svn_delta.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1909,7 +1898,7 @@ static VALUE mDelta;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -1999,7 +1988,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2044,7 +2033,7 @@ SWIG_AsVal_int (VALUE obj, int *val)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -3230,7 +3219,7 @@ _wrap_svn_txdelta_run(int argc, VALUE *argv, VALUE self) {
}
arg5 = (svn_checksum_kind_t)(val5);
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -5437,7 +5426,7 @@ _wrap_svn_delta_get_cancellation_editor(int argc, VALUE *argv, VALUE self) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
}
{
- arg1 = svn_swig_rb_cancel_func;
+ arg1 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg2 = (void *)svn_swig_rb_make_baton(argv[0], _global_svn_swig_rb_pool);
}
res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_svn_delta_editor_t, 0 | 0 );
@@ -5619,7 +5608,7 @@ _wrap_svn_delta_path_driver2(int argc, VALUE *argv, VALUE self) {
}
arg4 = RTEST(argv[2]);
{
- arg5 = svn_swig_rb_delta_path_driver_cb_func;
+ arg5 = (svn_delta_path_driver_cb_func_t) svn_swig_rb_delta_path_driver_cb_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -5704,7 +5693,7 @@ _wrap_svn_delta_path_driver(int argc, VALUE *argv, VALUE self) {
arg4 = svn_swig_rb_strings_to_apr_array(argv[2], _global_pool);
}
{
- arg5 = svn_swig_rb_delta_path_driver_cb_func;
+ arg5 = (svn_delta_path_driver_cb_func_t) svn_swig_rb_delta_path_driver_cb_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -8835,18 +8824,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -8856,17 +8845,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -8929,7 +8918,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -8943,7 +8932,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -8970,7 +8959,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
diff --git a/subversion/bindings/swig/ruby/svn_diff.c b/subversion/bindings/swig/ruby/svn_diff.c
index c1876e6..29d59ff 100644
--- a/subversion/bindings/swig/ruby/svn_diff.c
+++ b/subversion/bindings/swig/ruby/svn_diff.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1876,7 +1865,7 @@ static VALUE mDiff;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2212,18 +2201,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -2233,17 +2222,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -2306,7 +2295,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -2320,7 +2309,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -2347,7 +2336,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
diff --git a/subversion/bindings/swig/ruby/svn_fs.c b/subversion/bindings/swig/ruby/svn_fs.c
index 6fd03dc..37bb6fa 100644
--- a/subversion/bindings/swig/ruby/svn_fs.c
+++ b/subversion/bindings/swig/ruby/svn_fs.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1797,114 +1786,126 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_apr_int32_t swig_types[2]
#define SWIGTYPE_p_apr_int64_t swig_types[3]
#define SWIGTYPE_p_apr_pool_t swig_types[4]
-#define SWIGTYPE_p_char swig_types[5]
-#define SWIGTYPE_p_f_long_p_void_p_apr_pool_t__void swig_types[6]
-#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[7]
-#define SWIGTYPE_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[8]
-#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[9]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[10]
-#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[13]
-#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[14]
-#define SWIGTYPE_p_int swig_types[15]
-#define SWIGTYPE_p_long swig_types[16]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[17]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[18]
-#define SWIGTYPE_p_p_char swig_types[19]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_p_svn_checksum_t swig_types[21]
-#define SWIGTYPE_p_p_svn_fs_access_t swig_types[22]
-#define SWIGTYPE_p_p_svn_fs_history_t swig_types[23]
-#define SWIGTYPE_p_p_svn_fs_id_t swig_types[24]
-#define SWIGTYPE_p_p_svn_fs_root_t swig_types[25]
-#define SWIGTYPE_p_p_svn_fs_t swig_types[26]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[27]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[28]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[29]
-#define SWIGTYPE_p_p_svn_string_t swig_types[30]
-#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[31]
-#define SWIGTYPE_p_p_void swig_types[32]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[33]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[34]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[35]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[36]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[37]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[38]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[39]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[40]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[41]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[42]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[43]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[44]
-#define SWIGTYPE_p_svn_checksum_t swig_types[45]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[46]
-#define SWIGTYPE_p_svn_config_t swig_types[47]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[48]
-#define SWIGTYPE_p_svn_depth_t swig_types[49]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[50]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[51]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[52]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[53]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[54]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[55]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[56]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[57]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[58]
-#define SWIGTYPE_p_svn_diff_t swig_types[59]
-#define SWIGTYPE_p_svn_dirent_t swig_types[60]
-#define SWIGTYPE_p_svn_errno_t swig_types[61]
-#define SWIGTYPE_p_svn_error_t swig_types[62]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[63]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[64]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[65]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[66]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[67]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[68]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[69]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[70]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[71]
-#define SWIGTYPE_p_svn_fs_t swig_types[72]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[73]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[74]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[75]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[76]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[77]
-#define SWIGTYPE_p_svn_lock_t swig_types[78]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[79]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[80]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[81]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[82]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[83]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[84]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[85]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[86]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[87]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[88]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[89]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[90]
-#define SWIGTYPE_p_svn_patch_t swig_types[91]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[92]
-#define SWIGTYPE_p_svn_prop_kind swig_types[93]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[94]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[95]
-#define SWIGTYPE_p_svn_stream_t swig_types[96]
-#define SWIGTYPE_p_svn_string_t swig_types[97]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[98]
-#define SWIGTYPE_p_svn_tristate_t swig_types[99]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[100]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[101]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[102]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[103]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[104]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[105]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[106]
-#define SWIGTYPE_p_svn_version_t swig_types[107]
-#define SWIGTYPE_p_unsigned_char swig_types[108]
-#define SWIGTYPE_p_unsigned_long swig_types[109]
-#define SWIGTYPE_p_void swig_types[110]
-static swig_type_info *swig_types[112];
-static swig_module_info swig_module = {swig_types, 111, 0, 0, 0, 0};
+#define SWIGTYPE_p_apr_uint64_t swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_f_long_p_void_p_apr_pool_t__void swig_types[7]
+#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[8]
+#define SWIGTYPE_p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[9]
+#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[10]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[11]
+#define SWIGTYPE_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t swig_types[13]
+#define SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void swig_types[14]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_void_p_struct_svn_error_t__void swig_types[17]
+#define SWIGTYPE_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_int swig_types[19]
+#define SWIGTYPE_p_long swig_types[20]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[21]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[22]
+#define SWIGTYPE_p_p_char swig_types[23]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_p_svn_checksum_t swig_types[25]
+#define SWIGTYPE_p_p_svn_fs_access_t swig_types[26]
+#define SWIGTYPE_p_p_svn_fs_history_t swig_types[27]
+#define SWIGTYPE_p_p_svn_fs_id_t swig_types[28]
+#define SWIGTYPE_p_p_svn_fs_info_placeholder_t swig_types[29]
+#define SWIGTYPE_p_p_svn_fs_root_t swig_types[30]
+#define SWIGTYPE_p_p_svn_fs_t swig_types[31]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[32]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[33]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[34]
+#define SWIGTYPE_p_p_svn_string_t swig_types[35]
+#define SWIGTYPE_p_p_svn_txdelta_stream_t swig_types[36]
+#define SWIGTYPE_p_p_svn_version_t swig_types[37]
+#define SWIGTYPE_p_p_void swig_types[38]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[39]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[40]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[41]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[42]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[43]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[44]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[45]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[46]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[47]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[48]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[49]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[50]
+#define SWIGTYPE_p_svn_checksum_t swig_types[51]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[52]
+#define SWIGTYPE_p_svn_config_t swig_types[53]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[54]
+#define SWIGTYPE_p_svn_depth_t swig_types[55]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[56]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[57]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[58]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[59]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[60]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[61]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[62]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[63]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[64]
+#define SWIGTYPE_p_svn_diff_t swig_types[65]
+#define SWIGTYPE_p_svn_dirent_t swig_types[66]
+#define SWIGTYPE_p_svn_errno_t swig_types[67]
+#define SWIGTYPE_p_svn_error_t swig_types[68]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[69]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[70]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[71]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[72]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[73]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[74]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[75]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[76]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[77]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[78]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[79]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[84]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[85]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[86]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[87]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[88]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[89]
+#define SWIGTYPE_p_svn_lock_t swig_types[90]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[91]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[92]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[93]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[94]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[95]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[96]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[97]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[98]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[99]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[100]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[101]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[102]
+#define SWIGTYPE_p_svn_patch_t swig_types[103]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[104]
+#define SWIGTYPE_p_svn_prop_kind swig_types[105]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[106]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[107]
+#define SWIGTYPE_p_svn_stream_t swig_types[108]
+#define SWIGTYPE_p_svn_string_t swig_types[109]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[110]
+#define SWIGTYPE_p_svn_tristate_t swig_types[111]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[112]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[113]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[114]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[115]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[116]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[117]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[118]
+#define SWIGTYPE_p_svn_version_t swig_types[119]
+#define SWIGTYPE_p_unsigned_char swig_types[120]
+#define SWIGTYPE_p_unsigned_long swig_types[121]
+#define SWIGTYPE_p_void swig_types[122]
+static swig_type_info *swig_types[124];
+static swig_module_info swig_module = {swig_types, 123, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1919,7 +1920,7 @@ static VALUE mFs;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2075,6 +2076,16 @@ SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc)
#endif
+ #define SWIG_From_long LONG2NUM
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_int (int value)
+{
+ return SWIG_From_long (value);
+}
+
+
SWIGINTERN VALUE
SWIG_ruby_failed(void)
{
@@ -2082,7 +2093,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2127,17 +2138,7 @@ SWIG_AsVal_int (VALUE obj, int *val)
}
- #define SWIG_From_long LONG2NUM
-
-
-SWIGINTERNINLINE VALUE
-SWIG_From_int (int value)
-{
- return SWIG_From_long (value);
-}
-
-
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2171,11 +2172,21 @@ static void svn_fs_invoke_warning_callback(
_obj(baton, err);
}
+static svn_error_t * svn_fs_invoke_upgrade_notify(
+ svn_fs_upgrade_notify_t _obj, void *baton, apr_uint64_t number, svn_fs_upgrade_notify_action_t action, apr_pool_t *scratch_pool) {
+ return _obj(baton, number, action, scratch_pool);
+}
+
static void svn_fs_invoke_progress_notify_func(
svn_fs_progress_notify_func_t _obj, svn_revnum_t revision, void *baton, apr_pool_t *pool) {
_obj(revision, baton, pool);
}
+static void svn_fs_invoke_hotcopy_notify(
+ svn_fs_hotcopy_notify_t _obj, void *baton, svn_revnum_t start_revision, svn_revnum_t end_revision, apr_pool_t *scratch_pool) {
+ _obj(baton, start_revision, end_revision, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_freeze_func(
svn_fs_freeze_func_t _obj, void *baton, apr_pool_t *pool) {
return _obj(baton, pool);
@@ -2186,6 +2197,11 @@ static svn_error_t * svn_fs_invoke_process_contents_func(
return _obj(contents, len, baton, scratch_pool);
}
+static svn_error_t * svn_fs_invoke_lock_callback(
+ svn_fs_lock_callback_t _obj, void *baton, const char *path, const svn_lock_t *lock, svn_error_t *fs_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, path, lock, fs_err, scratch_pool);
+}
+
static svn_error_t * svn_fs_invoke_get_locks_callback(
svn_fs_get_locks_callback_t _obj, void *baton, svn_lock_t *lock, apr_pool_t *pool) {
return _obj(baton, lock, pool);
@@ -2507,6 +2523,126 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_open2(int argc, VALUE *argv, VALUE self) {
+ svn_fs_t **arg1 = (svn_fs_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_fs_t *temp1 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_fs_open2", 2, argv[0] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ VALUE rb_pool = Qnil;
+ if (!_global_pool) {
+ svn_swig_rb_get_pool(argc, argv, self, &rb_pool, &_global_pool);
+ svn_swig_rb_push_pool(rb_pool);
+ }
+ arg3 = (NIL_P(argv[1])) ? NULL :
+ svn_swig_rb_hash_to_apr_hash_string(argv[1], _global_pool);
+ _global_pool = NULL;
+ if (!NIL_P(rb_pool)) {
+ if (NIL_P(arg3)) {
+ svn_swig_rb_destroy_pool(rb_pool);
+ } else {
+ svn_swig_rb_set_pool_for_no_swig_type(argv[1], rb_pool);
+ }
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ }
+ if (argc > 2) {
+
+ }
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_open2(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE tmp;
+ tmp = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_t, 0);
+ if (rb_block_given_p()) {
+ rb_yield(tmp);
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ DATA_PTR(tmp) = NULL;
+ } else {
+ vresult = SWIG_Ruby_AppendOutput(vresult, tmp);
+ }
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_open(int argc, VALUE *argv, VALUE self) {
svn_fs_t **arg1 = (svn_fs_t **) 0 ;
char *arg2 = (char *) 0 ;
@@ -2604,6 +2740,92 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_upgrade2(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ svn_fs_upgrade_notify_t arg2 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg3 = (void *) 0 ;
+ svn_cancel_func_t arg4 = (svn_cancel_func_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res3 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_fs_upgrade2", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[1], (void**)(&arg2), SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_upgrade_notify_t","svn_fs_upgrade2", 2, argv[1] ));
+ }
+ }
+ res3 = SWIG_ConvertPtr(argv[2],SWIG_as_voidptrptr(&arg3), 0, 0);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_fs_upgrade2", 3, argv[2] ));
+ }
+ {
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
+ }
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_upgrade2((char const *)arg1,arg2,arg3,arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg5);
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_upgrade(int argc, VALUE *argv, VALUE self) {
char *arg1 = (char *) 0 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
@@ -2930,6 +3152,107 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_hotcopy3(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_fs_hotcopy_notify_t arg5 = (svn_fs_hotcopy_notify_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int res6 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 7) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_fs_hotcopy3", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_fs_hotcopy3", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[4], (void**)(&arg5), SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_hotcopy_notify_t","svn_fs_hotcopy3", 5, argv[4] ));
+ }
+ }
+ res6 = SWIG_ConvertPtr(argv[5],SWIG_as_voidptrptr(&arg6), 0, 0);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "void *","svn_fs_hotcopy3", 6, argv[5] ));
+ }
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
+ }
+ if (argc > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg8);
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_hotcopy2(int argc, VALUE *argv, VALUE self) {
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
@@ -2970,7 +3293,7 @@ _wrap_svn_fs_hotcopy2(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -3122,7 +3445,7 @@ _wrap_svn_fs_recover(int argc, VALUE *argv, VALUE self) {
}
arg1 = (char *)(buf1);
{
- arg2 = svn_swig_rb_cancel_func;
+ arg2 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg3 = (void *)svn_swig_rb_make_baton(argv[1], _global_svn_swig_rb_pool);
}
if (argc > 2) {
@@ -5967,6 +6290,59 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_fs_path_change2_t_mergeinfo_mod_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ svn_tristate_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_path_change2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_path_change2_t *","mergeinfo_mod", 1, self ));
+ }
+ arg1 = (struct svn_fs_path_change2_t *)(argp1);
+ ecode2 = SWIG_AsVal_int(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_tristate_t","mergeinfo_mod", 2, argv[0] ));
+ }
+ arg2 = (svn_tristate_t)(val2);
+ if (arg1) (arg1)->mergeinfo_mod = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_path_change2_t_mergeinfo_mod_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_path_change2_t *arg1 = (struct svn_fs_path_change2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_tristate_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_path_change2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_path_change2_t *","mergeinfo_mod", 1, self ));
+ }
+ arg1 = (struct svn_fs_path_change2_t *)(argp1);
+ result = (svn_tristate_t) ((arg1)->mergeinfo_mod);
+ vresult = SWIG_From_int((int)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
static swig_class SwigClassSvn_fs_path_change_t;
SWIGINTERN VALUE
@@ -6454,6 +6830,107 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_node_history2(int argc, VALUE *argv, VALUE self) {
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_fs_history_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_node_history2", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_node_history2", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ if (argc > 2) {
+
+ }
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_history2(arg1,arg2,(char const *)arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t, 0));
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_node_history(int argc, VALUE *argv, VALUE self) {
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
@@ -6532,6 +7009,98 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_history_prev2(int argc, VALUE *argv, VALUE self) {
+ svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
+ svn_fs_history_t *arg2 = (svn_fs_history_t *) 0 ;
+ svn_boolean_t arg3 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_fs_history_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_history_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_history_t *","svn_fs_history_prev2", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_history_t *)(argp2);
+ arg3 = RTEST(argv[1]);
+ if (argc > 2) {
+
+ }
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_history_prev2(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_fs_history_t, 0));
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_history_prev(int argc, VALUE *argv, VALUE self) {
svn_fs_history_t **arg1 = (svn_fs_history_t **) 0 ;
svn_fs_history_t *arg2 = (svn_fs_history_t *) 0 ;
@@ -6916,6 +7485,105 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_node_relation(int argc, VALUE *argv, VALUE self) {
+ svn_fs_node_relation_t *arg1 = (svn_fs_node_relation_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 6)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_fs_node_relation_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_fs_node_relation_t *","svn_fs_node_relation", 1, argv[0] ));
+ }
+ arg1 = (svn_fs_node_relation_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_node_relation", 2, argv[1] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_node_relation", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(argv[3], &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_node_relation", 4, argv[3] ));
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_fs_node_relation", 5, argv[4] ));
+ }
+ arg5 = (char *)(buf5);
+ if (argc > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_relation(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_node_created_rev(int argc, VALUE *argv, VALUE self) {
svn_revnum_t *arg1 = (svn_revnum_t *) 0 ;
svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
@@ -7333,6 +8001,84 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_node_has_props(int argc, VALUE *argv, VALUE self) {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_node_has_props", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_node_has_props", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ if (argc > 2) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_node_has_props(arg1,arg2,(char const *)arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg1 ? Qtrue : Qfalse);
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_change_node_prop(int argc, VALUE *argv, VALUE self) {
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -7427,6 +8173,103 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_props_different(int argc, VALUE *argv, VALUE self) {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_props_different", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_props_different", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(argv[2], &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_props_different", 4, argv[2] ));
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(argv[3], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_fs_props_different", 5, argv[3] ));
+ }
+ arg5 = (char *)(buf5);
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_props_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg1 ? Qtrue : Qfalse);
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_props_changed(int argc, VALUE *argv, VALUE self) {
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
@@ -8261,6 +9104,110 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_dir_optimal_order(int argc, VALUE *argv, VALUE self) {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_dir_optimal_order", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "apr_hash_t *","svn_fs_dir_optimal_order", 3, argv[1] ));
+ }
+ arg3 = (apr_hash_t *)(argp3);
+ if (argc > 2) {
+
+ }
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_dir_optimal_order(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_dir_optimal_order arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_dir_optimal_order is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_make_dir(int argc, VALUE *argv, VALUE self) {
svn_fs_root_t *arg1 = (svn_fs_root_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -9255,6 +10202,103 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_contents_different(int argc, VALUE *argv, VALUE self) {
+ svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_fs_root_t *arg4 = (svn_fs_root_t *) 0 ;
+ char *arg5 = (char *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_boolean_t temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ int res5 ;
+ char *buf5 = 0 ;
+ int alloc5 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_contents_different", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[1], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_contents_different", 3, argv[1] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(argv[2], &argp4,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_fs_contents_different", 4, argv[2] ));
+ }
+ arg4 = (svn_fs_root_t *)(argp4);
+ res5 = SWIG_AsCharPtrAndSize(argv[3], &buf5, NULL, &alloc5);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","svn_fs_contents_different", 5, argv[3] ));
+ }
+ arg5 = (char *)(buf5);
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_contents_different(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, *arg1 ? Qtrue : Qfalse);
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ if (alloc5 == SWIG_NEWOBJ) free((char*)buf5);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_contents_changed(int argc, VALUE *argv, VALUE self) {
svn_boolean_t *arg1 = (svn_boolean_t *) 0 ;
svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
@@ -9428,6 +10472,218 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_info_format(int argc, VALUE *argv, VALUE self) {
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_fs_t *arg3 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res3 = SWIG_ConvertPtr(argv[0], &argp3,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_fs_t *","svn_fs_info_format", 3, argv[0] ));
+ }
+ arg3 = (svn_fs_t *)(argp3);
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ if (!arg3) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_fs_info_format(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_format is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_info_config_files(int argc, VALUE *argv, VALUE self) {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_t *","svn_fs_info_config_files", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_t *)(argp2);
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ if (!arg2) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_fs_info_config_files(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info_config_files arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info_config_files is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_deltify_revision(int argc, VALUE *argv, VALUE self) {
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
svn_revnum_t arg2 ;
@@ -10131,6 +11387,228 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_lock_target_create(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ svn_revnum_t arg2 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ long val2 ;
+ int ecode2 = 0 ;
+ svn_fs_lock_target_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 2) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ if (NIL_P(argv[0])) {
+ arg1 = NULL;
+ } else {
+ arg1 = StringValuePtr(argv[0]);
+ }
+ }
+ ecode2 = SWIG_AsVal_long(argv[1], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","svn_fs_lock_target_create", 2, argv[1] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (argc > 2) {
+
+ }
+ {
+ result = (svn_fs_lock_target_t *)svn_fs_lock_target_create((char const *)arg1,arg2,arg3);
+
+
+
+ }
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_fs_lock_target_t, 0 | 0 );
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_lock_target_set_token(int argc, VALUE *argv, VALUE self) {
+ svn_fs_lock_target_t *arg1 = (svn_fs_lock_target_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_fs_lock_target_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_fs_lock_target_t *","svn_fs_lock_target_set_token", 1, argv[0] ));
+ }
+ arg1 = (svn_fs_lock_target_t *)(argp1);
+ {
+ if (NIL_P(argv[1])) {
+ arg2 = NULL;
+ } else {
+ arg2 = StringValuePtr(argv[1]);
+ }
+ }
+ {
+ svn_fs_lock_target_set_token(arg1,(char const *)arg2);
+
+
+
+ }
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_lock_many(int argc, VALUE *argv, VALUE self) {
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res8 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg10);
+ _global_pool = arg10;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 8) || (argc > 10)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 8)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_fs_t *","svn_fs_lock_many", 1, argv[0] ));
+ }
+ arg1 = (svn_fs_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_hash_t *","svn_fs_lock_many", 2, argv[1] ));
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ {
+ if (NIL_P(argv[2])) {
+ arg3 = NULL;
+ } else {
+ arg3 = StringValuePtr(argv[2]);
+ }
+ }
+ arg4 = RTEST(argv[3]);
+ {
+ arg5 = (apr_time_t)NUM2LL(argv[4]);
+ }
+ arg6 = RTEST(argv[5]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[6], (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_lock_callback_t","svn_fs_lock_many", 7, argv[6] ));
+ }
+ }
+ res8 = SWIG_ConvertPtr(argv[7],SWIG_as_voidptrptr(&arg8), 0, 0);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "void *","svn_fs_lock_many", 8, argv[7] ));
+ }
+ if (argc > 8) {
+
+ }
+ if (argc > 9) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_lock(int argc, VALUE *argv, VALUE self) {
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
svn_fs_t *arg2 = (svn_fs_t *) 0 ;
@@ -10322,6 +11800,118 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_unlock_many(int argc, VALUE *argv, VALUE self) {
+ svn_fs_t *arg1 = (svn_fs_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res5 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg7);
+ _global_pool = arg7;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 7)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_fs_t *","svn_fs_unlock_many", 1, argv[0] ));
+ }
+ arg1 = (svn_fs_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_hash_t *","svn_fs_unlock_many", 2, argv[1] ));
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ arg3 = RTEST(argv[2]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[3], (void**)(&arg4), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_lock_callback_t","svn_fs_unlock_many", 4, argv[3] ));
+ }
+ }
+ res5 = SWIG_ConvertPtr(argv[4],SWIG_as_voidptrptr(&arg5), 0, 0);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "void *","svn_fs_unlock_many", 5, argv[4] ));
+ }
+ if (argc > 5) {
+
+ }
+ if (argc > 6) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_unlock(int argc, VALUE *argv, VALUE self) {
svn_fs_t *arg1 = (svn_fs_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -10531,7 +12121,7 @@ _wrap_svn_fs_get_locks2(int argc, VALUE *argv, VALUE self) {
arg3 = svn_swig_rb_to_depth(argv[2]);
}
{
- arg4 = svn_swig_rb_fs_get_locks_callback;
+ arg4 = (svn_fs_get_locks_callback_t) svn_swig_rb_fs_get_locks_callback;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -10614,7 +12204,7 @@ _wrap_svn_fs_get_locks(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_fs_get_locks_callback;
+ arg3 = (svn_fs_get_locks_callback_t) svn_swig_rb_fs_get_locks_callback;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -10768,7 +12358,7 @@ _wrap_svn_fs_pack(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_fs_pack", 3, argv[2] ));
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -10889,7 +12479,7 @@ _wrap_svn_fs_verify(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "void *","svn_fs_verify", 6, argv[5] ));
}
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -10995,6 +12585,654 @@ fail:
}
+static swig_class SwigClassSvn_fs_fsfs_info_t;
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_fs_type_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","fs_type", 2, argv[0] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_fs_type_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ char *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ {
+ if (result) {
+ vresult = rb_str_new2(result);
+ } else {
+ vresult = Qnil;
+ }
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_shard_size_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","shard_size", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_int(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","shard_size", 2, argv[0] ));
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->shard_size = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_shard_size_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","shard_size", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (int) ((arg1)->shard_size);
+ vresult = SWIG_From_int((int)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","min_unpacked_rev", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_long(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","min_unpacked_rev", 2, argv[0] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_revnum_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","min_unpacked_rev", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ vresult = SWIG_From_long((long)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_log_addressing_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ svn_boolean_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","log_addressing", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ arg2 = RTEST(argv[0]);
+ if (arg1) (arg1)->log_addressing = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsfs_info_t_log_addressing_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsfs_info_t *arg1 = (struct svn_fs_fsfs_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_boolean_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsfs_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsfs_info_t *","log_addressing", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsfs_info_t *)(argp1);
+ result = (svn_boolean_t) ((arg1)->log_addressing);
+ vresult = result ? Qtrue : Qfalse;
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+static swig_class SwigClassSvn_fs_fsx_info_t;
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_fs_type_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","fs_type", 2, argv[0] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_fs_type_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ char *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ {
+ if (result) {
+ vresult = rb_str_new2(result);
+ } else {
+ vresult = Qnil;
+ }
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_shard_size_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ int arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","shard_size", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_int(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","shard_size", 2, argv[0] ));
+ }
+ arg2 = (int)(val2);
+ if (arg1) (arg1)->shard_size = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_shard_size_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","shard_size", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (int) ((arg1)->shard_size);
+ vresult = SWIG_From_int((int)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_min_unpacked_rev_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","min_unpacked_rev", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ ecode2 = SWIG_AsVal_long(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","min_unpacked_rev", 2, argv[0] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->min_unpacked_rev = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_fsx_info_t_min_unpacked_rev_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_fsx_info_t *arg1 = (struct svn_fs_fsx_info_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_revnum_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_fsx_info_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_fsx_info_t *","min_unpacked_rev", 1, self ));
+ }
+ arg1 = (struct svn_fs_fsx_info_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->min_unpacked_rev);
+ vresult = SWIG_From_long((long)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+static swig_class SwigClassSvn_fs_info_placeholder_t;
+
+SWIGINTERN VALUE
+_wrap_svn_fs_info_placeholder_t_fs_type_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_info_placeholder_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_info_placeholder_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_info_placeholder_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","fs_type", 2, argv[0] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ apr_size_t len = strlen(arg2) + 1;
+ char *copied;
+ if (arg1->fs_type) free((char *)arg1->fs_type);
+ copied = malloc(len);
+ memcpy(copied, arg2, len);
+ arg1->fs_type = copied;
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_info_placeholder_t_fs_type_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_fs_info_placeholder_t *arg1 = (struct svn_fs_info_placeholder_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ char *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_fs_info_placeholder_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_fs_info_placeholder_t *","fs_type", 1, self ));
+ }
+ arg1 = (struct svn_fs_info_placeholder_t *)(argp1);
+ result = (char *) ((arg1)->fs_type);
+ {
+ if (result) {
+ vresult = rb_str_new2(result);
+ } else {
+ vresult = Qnil;
+ }
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_info(int argc, VALUE *argv, VALUE self) {
+ svn_fs_info_placeholder_t **arg1 = (svn_fs_info_placeholder_t **) 0 ;
+ svn_fs_t *arg2 = (svn_fs_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_fs_info_placeholder_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_t *","svn_fs_info", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_t *)(argp2);
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ if (!arg2) {
+ svn_swig_rb_raise_svn_fs_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_fs_info((struct svn_fs_info_placeholder_t const **)arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_fs_info arg 1 (svn_fs_info_placeholder_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_fs_info is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_fs_info_dup(int argc, VALUE *argv, VALUE self) {
+ void *arg1 = (void *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ void *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg2);
+ _global_pool = arg2;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0],SWIG_as_voidptrptr(&arg1), 0, 0);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "void const *","svn_fs_info_dup", 1, argv[0] ));
+ }
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ result = (void *)svn_fs_info_dup((void const *)arg1,arg2,arg3);
+
+
+
+ }
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 );
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
SWIGINTERN VALUE
_wrap_svn_fs_invoke_warning_callback(int argc, VALUE *argv, VALUE self) {
svn_fs_warning_callback_t arg1 = (svn_fs_warning_callback_t) 0 ;
@@ -11035,6 +13273,84 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_invoke_upgrade_notify(int argc, VALUE *argv, VALUE self) {
+ svn_fs_upgrade_notify_t arg1 = (svn_fs_upgrade_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_uint64_t arg3 ;
+ svn_fs_upgrade_notify_action_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ int val4 ;
+ int ecode4 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_upgrade_notify_t","svn_fs_invoke_upgrade_notify", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_fs_invoke_upgrade_notify", 2, argv[1] ));
+ }
+ {
+ arg3 = (apr_uint64_t)NUM2ULL(argv[2]);
+ }
+ ecode4 = SWIG_AsVal_int(argv[3], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_fs_upgrade_notify_action_t","svn_fs_invoke_upgrade_notify", 4, argv[3] ));
+ }
+ arg4 = (svn_fs_upgrade_notify_action_t)(val4);
+ if (argc > 4) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_invoke_upgrade_notify(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_invoke_progress_notify_func(int argc, VALUE *argv, VALUE self) {
svn_fs_progress_notify_func_t arg1 = (svn_fs_progress_notify_func_t) 0 ;
svn_revnum_t arg2 ;
@@ -11099,6 +13415,78 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_invoke_hotcopy_notify(int argc, VALUE *argv, VALUE self) {
+ svn_fs_hotcopy_notify_t arg1 = (svn_fs_hotcopy_notify_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_long_long_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_hotcopy_notify_t","svn_fs_invoke_hotcopy_notify", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_fs_invoke_hotcopy_notify", 2, argv[1] ));
+ }
+ ecode3 = SWIG_AsVal_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "svn_revnum_t","svn_fs_invoke_hotcopy_notify", 3, argv[2] ));
+ }
+ arg3 = (svn_revnum_t)(val3);
+ ecode4 = SWIG_AsVal_long(argv[3], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_fs_invoke_hotcopy_notify", 4, argv[3] ));
+ }
+ arg4 = (svn_revnum_t)(val4);
+ if (argc > 4) {
+
+ }
+ {
+ svn_fs_invoke_hotcopy_notify(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_invoke_freeze_func(int argc, VALUE *argv, VALUE self) {
svn_fs_freeze_func_t arg1 = (svn_fs_freeze_func_t) 0 ;
void *arg2 = (void *) 0 ;
@@ -11247,6 +13635,99 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_fs_invoke_lock_callback(int argc, VALUE *argv, VALUE self) {
+ svn_fs_lock_callback_t arg1 = (svn_fs_lock_callback_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_lock_t *arg4 = (svn_lock_t *) 0 ;
+ svn_error_t *arg5 = (svn_error_t *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 6)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_lock_callback_t","svn_fs_invoke_lock_callback", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_fs_invoke_lock_callback", 2, argv[1] ));
+ }
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_fs_invoke_lock_callback", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ res4 = SWIG_ConvertPtr(argv[3], &argp4,SWIGTYPE_p_svn_lock_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "svn_lock_t const *","svn_fs_invoke_lock_callback", 4, argv[3] ));
+ }
+ arg4 = (svn_lock_t *)(argp4);
+ res5 = SWIG_ConvertPtr(argv[4], &argp5,SWIGTYPE_p_svn_error_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "svn_error_t *","svn_fs_invoke_lock_callback", 5, argv[4] ));
+ }
+ arg5 = (svn_error_t *)(argp5);
+ if (argc > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_fs_invoke_lock_callback(arg1,arg2,(char const *)arg3,(struct svn_lock_t const *)arg4,arg5,arg6);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_fs_invoke_get_locks_callback(int argc, VALUE *argv, VALUE self) {
svn_fs_get_locks_callback_t arg1 = (svn_fs_get_locks_callback_t) 0 ;
void *arg2 = (void *) 0 ;
@@ -11406,6 +13887,7 @@ static swig_type_info _swigt__p_apr_hash_t = {"_p_apr_hash_t", "apr_hash_t *", 0
static swig_type_info _swigt__p_apr_int32_t = {"_p_apr_int32_t", "apr_int32_t *|time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_int64_t = {"_p_apr_int64_t", "apr_int64_t *|svn_filesize_t *|apr_time_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_apr_pool_t = {"_p_apr_pool_t", "apr_pool_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_apr_uint64_t = {"_p_apr_uint64_t", "apr_uint64_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_long_p_void_p_apr_pool_t__void = {"_p_f_long_p_void_p_apr_pool_t__void", "void (*)(long,void *,apr_pool_t *)|svn_fs_progress_notify_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -11413,7 +13895,10 @@ static swig_type_info _swigt__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_a
static swig_type_info _swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_txdelta_window_t *,void *)|svn_txdelta_window_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void__p_svn_error_t = {"_p_f_p_void__p_svn_error_t", "svn_cancel_func_t|struct svn_error_t *(*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_int64_t,svn_fs_pack_notify_action_t,apr_pool_t *)|svn_fs_pack_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_uint64_t,svn_fs_upgrade_notify_action_t,apr_pool_t *)|svn_fs_upgrade_notify_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_long_long_p_apr_pool_t__void = {"_p_f_p_void_long_long_p_apr_pool_t__void", "void (*)(void *,long,long,apr_pool_t *)|svn_fs_hotcopy_notify_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_fs_freeze_func_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_struct_svn_error_t__void = {"_p_f_p_void_p_struct_svn_error_t__void", "void (*)(void *,struct svn_error_t *)|svn_fs_warning_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_lock_t *,apr_pool_t *)|svn_fs_get_locks_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -11426,6 +13911,7 @@ static swig_type_info _swigt__p_p_svn_checksum_t = {"_p_p_svn_checksum_t", "stru
static swig_type_info _swigt__p_p_svn_fs_access_t = {"_p_p_svn_fs_access_t", "struct svn_fs_access_t **|svn_fs_access_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_history_t = {"_p_p_svn_fs_history_t", "struct svn_fs_history_t **|svn_fs_history_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_id_t = {"_p_p_svn_fs_id_t", "struct svn_fs_id_t **|svn_fs_id_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_fs_info_placeholder_t = {"_p_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t **|svn_fs_info_placeholder_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_root_t = {"_p_p_svn_fs_root_t", "struct svn_fs_root_t **|svn_fs_root_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_t = {"_p_p_svn_fs_t", "struct svn_fs_t **|svn_fs_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_fs_txn_t = {"_p_p_svn_fs_txn_t", "struct svn_fs_txn_t **|svn_fs_txn_t **", 0, 0, (void*)0, 0};
@@ -11433,6 +13919,7 @@ static swig_type_info _swigt__p_p_svn_lock_t = {"_p_p_svn_lock_t", "struct svn_l
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_txdelta_stream_t = {"_p_p_svn_txdelta_stream_t", "struct svn_txdelta_stream_t **|svn_txdelta_stream_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -11466,8 +13953,13 @@ static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -11475,6 +13967,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -11519,6 +14012,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_apr_int32_t,
&_swigt__p_apr_int64_t,
&_swigt__p_apr_pool_t,
+ &_swigt__p_apr_uint64_t,
&_swigt__p_char,
&_swigt__p_f_long_p_void_p_apr_pool_t__void,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -11526,7 +14020,10 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
&_swigt__p_f_p_void__p_svn_error_t,
&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_long_long_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_struct_svn_error_t__void,
&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_int,
@@ -11539,6 +14036,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_fs_access_t,
&_swigt__p_p_svn_fs_history_t,
&_swigt__p_p_svn_fs_id_t,
+ &_swigt__p_p_svn_fs_info_placeholder_t,
&_swigt__p_p_svn_fs_root_t,
&_swigt__p_p_svn_fs_t,
&_swigt__p_p_svn_fs_txn_t,
@@ -11546,6 +14044,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
&_swigt__p_p_svn_txdelta_stream_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -11579,8 +14078,13 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -11588,6 +14092,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -11632,6 +14137,7 @@ static swig_cast_info _swigc__p_apr_hash_t[] = { {&_swigt__p_apr_hash_t, 0, 0,
static swig_cast_info _swigc__p_apr_int32_t[] = { {&_swigt__p_apr_int32_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_int64_t[] = { {&_swigt__p_apr_int64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_apr_pool_t[] = { {&_swigt__p_apr_pool_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_apr_uint64_t[] = { {&_swigt__p_apr_uint64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_long_p_void_p_apr_pool_t__void[] = { {&_swigt__p_f_long_p_void_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11639,7 +14145,10 @@ static swig_cast_info _swigc__p_f_p_q_const__unsigned_char_apr_size_t_p_void_p_a
static swig_cast_info _swigc__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void__p_svn_error_t[] = { {&_swigt__p_f_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_long_long_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_long_long_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_struct_svn_error_t__void[] = { {&_swigt__p_f_p_void_p_struct_svn_error_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -11652,6 +14161,7 @@ static swig_cast_info _swigc__p_p_svn_checksum_t[] = { {&_swigt__p_p_svn_checks
static swig_cast_info _swigc__p_p_svn_fs_access_t[] = { {&_swigt__p_p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_history_t[] = { {&_swigt__p_p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_id_t[] = { {&_swigt__p_p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_fs_info_placeholder_t[] = { {&_swigt__p_p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_root_t[] = { {&_swigt__p_p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_t[] = { {&_swigt__p_p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_fs_txn_t[] = { {&_swigt__p_p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11659,6 +14169,7 @@ static swig_cast_info _swigc__p_p_svn_lock_t[] = { {&_swigt__p_p_svn_lock_t, 0,
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_txdelta_stream_t[] = { {&_swigt__p_p_svn_txdelta_stream_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11692,8 +14203,13 @@ static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11701,6 +14217,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -11745,6 +14262,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_apr_int32_t,
_swigc__p_apr_int64_t,
_swigc__p_apr_pool_t,
+ _swigc__p_apr_uint64_t,
_swigc__p_char,
_swigc__p_f_long_p_void_p_apr_pool_t__void,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -11752,7 +14270,10 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
_swigc__p_f_p_void__p_svn_error_t,
_swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_apr_uint64_t_svn_fs_upgrade_notify_action_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_long_long_p_apr_pool_t__void,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_struct_svn_error_t__void,
_swigc__p_f_p_void_p_svn_lock_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_int,
@@ -11765,6 +14286,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_fs_access_t,
_swigc__p_p_svn_fs_history_t,
_swigc__p_p_svn_fs_id_t,
+ _swigc__p_p_svn_fs_info_placeholder_t,
_swigc__p_p_svn_fs_root_t,
_swigc__p_p_svn_fs_t,
_swigc__p_p_svn_fs_txn_t,
@@ -11772,6 +14294,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
_swigc__p_p_svn_txdelta_stream_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -11805,8 +14328,13 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -11814,6 +14342,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -11858,18 +14387,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -11879,17 +14408,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -11952,7 +14481,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -11966,7 +14495,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -11993,7 +14522,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -12116,27 +14645,38 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_set_warning_func_wrapper", _wrap_svn_fs_set_warning_func_wrapper, -1);
rb_define_module_function(mFs, "svn_fs_root_fs_wrapper", _wrap_svn_fs_root_fs_wrapper, -1);
rb_define_module_function(mFs, "svn_fs_version", _wrap_svn_fs_version, -1);
+ rb_define_const(mFs, "SVN_FS_TYPE_BDB", SWIG_FromCharPtr("bdb"));
+ rb_define_const(mFs, "SVN_FS_TYPE_FSFS", SWIG_FromCharPtr("fsfs"));
+ rb_define_const(mFs, "SVN_FS_TYPE_FSX", SWIG_FromCharPtr("fsx"));
rb_define_const(mFs, "SVN_FS_CONFIG_BDB_TXN_NOSYNC", SWIG_FromCharPtr("bdb-txn-nosync"));
rb_define_const(mFs, "SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE", SWIG_FromCharPtr("bdb-log-autoremove"));
rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_CACHE_DELTAS", SWIG_FromCharPtr("fsfs-cache-deltas"));
rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS", SWIG_FromCharPtr("fsfs-cache-fulltexts"));
rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_CACHE_REVPROPS", SWIG_FromCharPtr("fsfs-cache-revprops"));
rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_CACHE_NS", SWIG_FromCharPtr("fsfs-cache-namespace"));
+ rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_BLOCK_READ", SWIG_FromCharPtr("fsfs-block-read"));
+ rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_SHARD_SIZE", SWIG_FromCharPtr("fsfs-shard-size"));
+ rb_define_const(mFs, "SVN_FS_CONFIG_FSFS_LOG_ADDRESSING", SWIG_FromCharPtr("fsfs-log-addressing"));
rb_define_const(mFs, "SVN_FS_CONFIG_FS_TYPE", SWIG_FromCharPtr("fs-type"));
- rb_define_const(mFs, "SVN_FS_TYPE_BDB", SWIG_FromCharPtr("bdb"));
- rb_define_const(mFs, "SVN_FS_TYPE_FSFS", SWIG_FromCharPtr("fsfs"));
rb_define_const(mFs, "SVN_FS_CONFIG_PRE_1_4_COMPATIBLE", SWIG_FromCharPtr("pre-1.4-compatible"));
rb_define_const(mFs, "SVN_FS_CONFIG_PRE_1_5_COMPATIBLE", SWIG_FromCharPtr("pre-1.5-compatible"));
rb_define_const(mFs, "SVN_FS_CONFIG_PRE_1_6_COMPATIBLE", SWIG_FromCharPtr("pre-1.6-compatible"));
rb_define_const(mFs, "SVN_FS_CONFIG_PRE_1_8_COMPATIBLE", SWIG_FromCharPtr("pre-1.8-compatible"));
+ rb_define_const(mFs, "SVN_FS_CONFIG_COMPATIBLE_VERSION", SWIG_FromCharPtr("compatible-version"));
rb_define_module_function(mFs, "svn_fs_initialize", _wrap_svn_fs_initialize, -1);
rb_define_module_function(mFs, "svn_fs_create", _wrap_svn_fs_create, -1);
+ rb_define_module_function(mFs, "svn_fs_open2", _wrap_svn_fs_open2, -1);
rb_define_module_function(mFs, "svn_fs_open", _wrap_svn_fs_open, -1);
+ rb_define_const(mFs, "Svn_fs_upgrade_pack_revprops", SWIG_From_int((int)(svn_fs_upgrade_pack_revprops)));
+ rb_define_const(mFs, "Svn_fs_upgrade_cleanup_revprops", SWIG_From_int((int)(svn_fs_upgrade_cleanup_revprops)));
+ rb_define_const(mFs, "Svn_fs_upgrade_format_bumped", SWIG_From_int((int)(svn_fs_upgrade_format_bumped)));
+ rb_define_module_function(mFs, "svn_fs_upgrade2", _wrap_svn_fs_upgrade2, -1);
rb_define_module_function(mFs, "svn_fs_upgrade", _wrap_svn_fs_upgrade, -1);
rb_define_module_function(mFs, "svn_fs_type", _wrap_svn_fs_type, -1);
rb_define_module_function(mFs, "svn_fs_path", _wrap_svn_fs_path, -1);
rb_define_module_function(mFs, "svn_fs_config", _wrap_svn_fs_config, -1);
rb_define_module_function(mFs, "svn_fs_delete_fs", _wrap_svn_fs_delete_fs, -1);
+ rb_define_module_function(mFs, "svn_fs_hotcopy3", _wrap_svn_fs_hotcopy3, -1);
rb_define_module_function(mFs, "svn_fs_hotcopy2", _wrap_svn_fs_hotcopy2, -1);
rb_define_module_function(mFs, "svn_fs_hotcopy", _wrap_svn_fs_hotcopy, -1);
rb_define_module_function(mFs, "svn_fs_recover", _wrap_svn_fs_recover, -1);
@@ -12155,12 +14695,16 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_access_get_username", _wrap_svn_fs_access_get_username, -1);
rb_define_module_function(mFs, "svn_fs_access_add_lock_token2", _wrap_svn_fs_access_add_lock_token2, -1);
rb_define_module_function(mFs, "svn_fs_access_add_lock_token", _wrap_svn_fs_access_add_lock_token, -1);
+ rb_define_const(mFs, "Svn_fs_node_unrelated", SWIG_From_int((int)(svn_fs_node_unrelated)));
+ rb_define_const(mFs, "Svn_fs_node_unchanged", SWIG_From_int((int)(svn_fs_node_unchanged)));
+ rb_define_const(mFs, "Svn_fs_node_common_ancestor", SWIG_From_int((int)(svn_fs_node_common_ancestor)));
rb_define_module_function(mFs, "svn_fs_compare_ids", _wrap_svn_fs_compare_ids, -1);
rb_define_module_function(mFs, "svn_fs_check_related", _wrap_svn_fs_check_related, -1);
rb_define_module_function(mFs, "svn_fs_parse_id", _wrap_svn_fs_parse_id, -1);
rb_define_module_function(mFs, "svn_fs_unparse_id", _wrap_svn_fs_unparse_id, -1);
rb_define_const(mFs, "SVN_FS_TXN_CHECK_OOD", SWIG_From_int((int)(0x00001)));
rb_define_const(mFs, "SVN_FS_TXN_CHECK_LOCKS", SWIG_From_int((int)(0x00002)));
+ rb_define_const(mFs, "SVN_FS_TXN_CLIENT_DATE", SWIG_From_int((int)(0x00004)));
rb_define_module_function(mFs, "svn_fs_begin_txn2", _wrap_svn_fs_begin_txn2, -1);
rb_define_module_function(mFs, "svn_fs_begin_txn", _wrap_svn_fs_begin_txn, -1);
rb_define_module_function(mFs, "svn_fs_commit_txn", _wrap_svn_fs_commit_txn, -1);
@@ -12207,6 +14751,8 @@ SWIGEXPORT void Init_fs(void) {
rb_define_method(SwigClassSvn_fs_path_change2_t.klass, "copyfrom_rev", _wrap_svn_fs_path_change2_t_copyfrom_rev_get, -1);
rb_define_method(SwigClassSvn_fs_path_change2_t.klass, "copyfrom_path=", _wrap_svn_fs_path_change2_t_copyfrom_path_set, -1);
rb_define_method(SwigClassSvn_fs_path_change2_t.klass, "copyfrom_path", _wrap_svn_fs_path_change2_t_copyfrom_path_get, -1);
+ rb_define_method(SwigClassSvn_fs_path_change2_t.klass, "mergeinfo_mod=", _wrap_svn_fs_path_change2_t_mergeinfo_mod_set, -1);
+ rb_define_method(SwigClassSvn_fs_path_change2_t.klass, "mergeinfo_mod", _wrap_svn_fs_path_change2_t_mergeinfo_mod_get, -1);
SwigClassSvn_fs_path_change2_t.mark = 0;
SwigClassSvn_fs_path_change2_t.trackObjects = 0;
@@ -12227,18 +14773,23 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_paths_changed2", _wrap_svn_fs_paths_changed2, -1);
rb_define_module_function(mFs, "svn_fs_paths_changed", _wrap_svn_fs_paths_changed, -1);
rb_define_module_function(mFs, "svn_fs_check_path", _wrap_svn_fs_check_path, -1);
+ rb_define_module_function(mFs, "svn_fs_node_history2", _wrap_svn_fs_node_history2, -1);
rb_define_module_function(mFs, "svn_fs_node_history", _wrap_svn_fs_node_history, -1);
+ rb_define_module_function(mFs, "svn_fs_history_prev2", _wrap_svn_fs_history_prev2, -1);
rb_define_module_function(mFs, "svn_fs_history_prev", _wrap_svn_fs_history_prev, -1);
rb_define_module_function(mFs, "svn_fs_history_location", _wrap_svn_fs_history_location, -1);
rb_define_module_function(mFs, "svn_fs_is_dir", _wrap_svn_fs_is_dir, -1);
rb_define_module_function(mFs, "svn_fs_is_file", _wrap_svn_fs_is_file, -1);
rb_define_module_function(mFs, "svn_fs_node_id", _wrap_svn_fs_node_id, -1);
+ rb_define_module_function(mFs, "svn_fs_node_relation", _wrap_svn_fs_node_relation, -1);
rb_define_module_function(mFs, "svn_fs_node_created_rev", _wrap_svn_fs_node_created_rev, -1);
rb_define_module_function(mFs, "svn_fs_node_origin_rev", _wrap_svn_fs_node_origin_rev, -1);
rb_define_module_function(mFs, "svn_fs_node_created_path", _wrap_svn_fs_node_created_path, -1);
rb_define_module_function(mFs, "svn_fs_node_prop", _wrap_svn_fs_node_prop, -1);
rb_define_module_function(mFs, "svn_fs_node_proplist", _wrap_svn_fs_node_proplist, -1);
+ rb_define_module_function(mFs, "svn_fs_node_has_props", _wrap_svn_fs_node_has_props, -1);
rb_define_module_function(mFs, "svn_fs_change_node_prop", _wrap_svn_fs_change_node_prop, -1);
+ rb_define_module_function(mFs, "svn_fs_props_different", _wrap_svn_fs_props_different, -1);
rb_define_module_function(mFs, "svn_fs_props_changed", _wrap_svn_fs_props_changed, -1);
rb_define_module_function(mFs, "svn_fs_copied_from", _wrap_svn_fs_copied_from, -1);
rb_define_module_function(mFs, "svn_fs_closest_copy", _wrap_svn_fs_closest_copy, -1);
@@ -12258,6 +14809,7 @@ SWIGEXPORT void Init_fs(void) {
SwigClassSvn_fs_dirent_t.mark = 0;
SwigClassSvn_fs_dirent_t.trackObjects = 0;
rb_define_module_function(mFs, "svn_fs_dir_entries", _wrap_svn_fs_dir_entries, -1);
+ rb_define_module_function(mFs, "svn_fs_dir_optimal_order", _wrap_svn_fs_dir_optimal_order, -1);
rb_define_module_function(mFs, "svn_fs_make_dir", _wrap_svn_fs_make_dir, -1);
rb_define_module_function(mFs, "svn_fs_delete", _wrap_svn_fs_delete, -1);
rb_define_module_function(mFs, "svn_fs_copy", _wrap_svn_fs_copy, -1);
@@ -12270,8 +14822,11 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_make_file", _wrap_svn_fs_make_file, -1);
rb_define_module_function(mFs, "svn_fs_apply_textdelta", _wrap_svn_fs_apply_textdelta, -1);
rb_define_module_function(mFs, "svn_fs_apply_text", _wrap_svn_fs_apply_text, -1);
+ rb_define_module_function(mFs, "svn_fs_contents_different", _wrap_svn_fs_contents_different, -1);
rb_define_module_function(mFs, "svn_fs_contents_changed", _wrap_svn_fs_contents_changed, -1);
rb_define_module_function(mFs, "svn_fs_youngest_rev", _wrap_svn_fs_youngest_rev, -1);
+ rb_define_module_function(mFs, "svn_fs_info_format", _wrap_svn_fs_info_format, -1);
+ rb_define_module_function(mFs, "svn_fs_info_config_files", _wrap_svn_fs_info_config_files, -1);
rb_define_module_function(mFs, "svn_fs_deltify_revision", _wrap_svn_fs_deltify_revision, -1);
rb_define_module_function(mFs, "svn_fs_revision_prop", _wrap_svn_fs_revision_prop, -1);
rb_define_module_function(mFs, "svn_fs_revision_proplist", _wrap_svn_fs_revision_proplist, -1);
@@ -12280,8 +14835,12 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_get_file_delta_stream", _wrap_svn_fs_get_file_delta_stream, -1);
rb_define_module_function(mFs, "svn_fs_get_uuid", _wrap_svn_fs_get_uuid, -1);
rb_define_module_function(mFs, "svn_fs_set_uuid", _wrap_svn_fs_set_uuid, -1);
+ rb_define_module_function(mFs, "svn_fs_lock_target_create", _wrap_svn_fs_lock_target_create, -1);
+ rb_define_module_function(mFs, "svn_fs_lock_target_set_token", _wrap_svn_fs_lock_target_set_token, -1);
+ rb_define_module_function(mFs, "svn_fs_lock_many", _wrap_svn_fs_lock_many, -1);
rb_define_module_function(mFs, "svn_fs_lock", _wrap_svn_fs_lock, -1);
rb_define_module_function(mFs, "svn_fs_generate_lock_token", _wrap_svn_fs_generate_lock_token, -1);
+ rb_define_module_function(mFs, "svn_fs_unlock_many", _wrap_svn_fs_unlock_many, -1);
rb_define_module_function(mFs, "svn_fs_unlock", _wrap_svn_fs_unlock, -1);
rb_define_module_function(mFs, "svn_fs_get_lock", _wrap_svn_fs_get_lock, -1);
rb_define_module_function(mFs, "svn_fs_get_locks2", _wrap_svn_fs_get_locks2, -1);
@@ -12294,10 +14853,49 @@ SWIGEXPORT void Init_fs(void) {
rb_define_module_function(mFs, "svn_fs_pack", _wrap_svn_fs_pack, -1);
rb_define_module_function(mFs, "svn_fs_verify", _wrap_svn_fs_verify, -1);
rb_define_module_function(mFs, "svn_fs_verify_root", _wrap_svn_fs_verify_root, -1);
+
+ SwigClassSvn_fs_fsfs_info_t.klass = rb_define_class_under(mFs, "Svn_fs_fsfs_info_t", rb_cObject);
+ SWIG_TypeClientData(SWIGTYPE_p_svn_fs_fsfs_info_t, (void *) &SwigClassSvn_fs_fsfs_info_t);
+ rb_undef_alloc_func(SwigClassSvn_fs_fsfs_info_t.klass);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "fs_type=", _wrap_svn_fs_fsfs_info_t_fs_type_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "fs_type", _wrap_svn_fs_fsfs_info_t_fs_type_get, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "shard_size=", _wrap_svn_fs_fsfs_info_t_shard_size_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "shard_size", _wrap_svn_fs_fsfs_info_t_shard_size_get, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "min_unpacked_rev=", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "min_unpacked_rev", _wrap_svn_fs_fsfs_info_t_min_unpacked_rev_get, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "log_addressing=", _wrap_svn_fs_fsfs_info_t_log_addressing_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsfs_info_t.klass, "log_addressing", _wrap_svn_fs_fsfs_info_t_log_addressing_get, -1);
+ SwigClassSvn_fs_fsfs_info_t.mark = 0;
+ SwigClassSvn_fs_fsfs_info_t.trackObjects = 0;
+
+ SwigClassSvn_fs_fsx_info_t.klass = rb_define_class_under(mFs, "Svn_fs_fsx_info_t", rb_cObject);
+ SWIG_TypeClientData(SWIGTYPE_p_svn_fs_fsx_info_t, (void *) &SwigClassSvn_fs_fsx_info_t);
+ rb_undef_alloc_func(SwigClassSvn_fs_fsx_info_t.klass);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "fs_type=", _wrap_svn_fs_fsx_info_t_fs_type_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "fs_type", _wrap_svn_fs_fsx_info_t_fs_type_get, -1);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "shard_size=", _wrap_svn_fs_fsx_info_t_shard_size_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "shard_size", _wrap_svn_fs_fsx_info_t_shard_size_get, -1);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "min_unpacked_rev=", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_set, -1);
+ rb_define_method(SwigClassSvn_fs_fsx_info_t.klass, "min_unpacked_rev", _wrap_svn_fs_fsx_info_t_min_unpacked_rev_get, -1);
+ SwigClassSvn_fs_fsx_info_t.mark = 0;
+ SwigClassSvn_fs_fsx_info_t.trackObjects = 0;
+
+ SwigClassSvn_fs_info_placeholder_t.klass = rb_define_class_under(mFs, "Svn_fs_info_placeholder_t", rb_cObject);
+ SWIG_TypeClientData(SWIGTYPE_p_svn_fs_info_placeholder_t, (void *) &SwigClassSvn_fs_info_placeholder_t);
+ rb_undef_alloc_func(SwigClassSvn_fs_info_placeholder_t.klass);
+ rb_define_method(SwigClassSvn_fs_info_placeholder_t.klass, "fs_type=", _wrap_svn_fs_info_placeholder_t_fs_type_set, -1);
+ rb_define_method(SwigClassSvn_fs_info_placeholder_t.klass, "fs_type", _wrap_svn_fs_info_placeholder_t_fs_type_get, -1);
+ SwigClassSvn_fs_info_placeholder_t.mark = 0;
+ SwigClassSvn_fs_info_placeholder_t.trackObjects = 0;
+ rb_define_module_function(mFs, "svn_fs_info", _wrap_svn_fs_info, -1);
+ rb_define_module_function(mFs, "svn_fs_info_dup", _wrap_svn_fs_info_dup, -1);
rb_define_module_function(mFs, "svn_fs_invoke_warning_callback", _wrap_svn_fs_invoke_warning_callback, -1);
+ rb_define_module_function(mFs, "svn_fs_invoke_upgrade_notify", _wrap_svn_fs_invoke_upgrade_notify, -1);
rb_define_module_function(mFs, "svn_fs_invoke_progress_notify_func", _wrap_svn_fs_invoke_progress_notify_func, -1);
+ rb_define_module_function(mFs, "svn_fs_invoke_hotcopy_notify", _wrap_svn_fs_invoke_hotcopy_notify, -1);
rb_define_module_function(mFs, "svn_fs_invoke_freeze_func", _wrap_svn_fs_invoke_freeze_func, -1);
rb_define_module_function(mFs, "svn_fs_invoke_process_contents_func", _wrap_svn_fs_invoke_process_contents_func, -1);
+ rb_define_module_function(mFs, "svn_fs_invoke_lock_callback", _wrap_svn_fs_invoke_lock_callback, -1);
rb_define_module_function(mFs, "svn_fs_invoke_get_locks_callback", _wrap_svn_fs_invoke_get_locks_callback, -1);
rb_define_module_function(mFs, "svn_fs_invoke_pack_notify", _wrap_svn_fs_invoke_pack_notify, -1);
diff --git a/subversion/bindings/swig/ruby/svn_ra.c b/subversion/bindings/swig/ruby/svn_ra.c
index 5d953ff..90a0229 100644
--- a/subversion/bindings/swig/ruby/svn_ra.c
+++ b/subversion/bindings/swig/ruby/svn_ra.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1804,145 +1793,149 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t swig_types[9]
#define SWIGTYPE_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[10]
#define SWIGTYPE_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[11]
-#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[12]
-#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[13]
-#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
-#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[15]
-#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[16]
-#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[17]
-#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[18]
-#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[19]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[29]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[30]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[31]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[32]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[33]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[35]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[36]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[37]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[38]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[39]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[40]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[41]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[42]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[43]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[44]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[45]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[46]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[47]
-#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[48]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[49]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[50]
-#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[51]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[52]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[53]
-#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[54]
-#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[55]
-#define SWIGTYPE_p_int swig_types[56]
-#define SWIGTYPE_p_long swig_types[57]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[58]
-#define SWIGTYPE_p_p_apr_file_t swig_types[59]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[60]
-#define SWIGTYPE_p_p_char swig_types[61]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[62]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[63]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[64]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[65]
-#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[66]
-#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[67]
-#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[68]
-#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[69]
-#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[70]
-#define SWIGTYPE_p_p_svn_ra_session_t swig_types[71]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[72]
-#define SWIGTYPE_p_p_svn_string_t swig_types[73]
-#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[74]
-#define SWIGTYPE_p_p_void swig_types[75]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[76]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[77]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[78]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[79]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[80]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[81]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[82]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[83]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[84]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[85]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[86]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[87]
-#define SWIGTYPE_p_svn_checksum_t swig_types[88]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[89]
-#define SWIGTYPE_p_svn_config_t swig_types[90]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[91]
-#define SWIGTYPE_p_svn_depth_t swig_types[92]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[93]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[94]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[95]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[96]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[97]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[98]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[99]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[100]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[101]
-#define SWIGTYPE_p_svn_diff_t swig_types[102]
-#define SWIGTYPE_p_svn_dirent_t swig_types[103]
-#define SWIGTYPE_p_svn_errno_t swig_types[104]
-#define SWIGTYPE_p_svn_error_t swig_types[105]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[106]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[107]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[108]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[109]
-#define SWIGTYPE_p_svn_lock_t swig_types[110]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[111]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[112]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[113]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[114]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[115]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[116]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[117]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[118]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[119]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[120]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[121]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[122]
-#define SWIGTYPE_p_svn_patch_t swig_types[123]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[124]
-#define SWIGTYPE_p_svn_prop_kind swig_types[125]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[126]
-#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[127]
-#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[128]
-#define SWIGTYPE_p_svn_ra_plugin_t swig_types[129]
-#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[130]
-#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[131]
-#define SWIGTYPE_p_svn_ra_reporter_t swig_types[132]
-#define SWIGTYPE_p_svn_ra_session_t swig_types[133]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[134]
-#define SWIGTYPE_p_svn_stream_t swig_types[135]
-#define SWIGTYPE_p_svn_string_t swig_types[136]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[137]
-#define SWIGTYPE_p_svn_tristate_t swig_types[138]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[139]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[140]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[141]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[142]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[143]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[144]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[145]
-#define SWIGTYPE_p_svn_version_t swig_types[146]
-#define SWIGTYPE_p_unsigned_long swig_types[147]
-#define SWIGTYPE_p_void swig_types[148]
-static swig_type_info *swig_types[150];
-static swig_module_info swig_module = {swig_types, 149, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[12]
+#define SWIGTYPE_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[13]
+#define SWIGTYPE_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[14]
+#define SWIGTYPE_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[15]
+#define SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[16]
+#define SWIGTYPE_p_f_p_void__p_svn_error_t swig_types[17]
+#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[18]
+#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
+#define SWIGTYPE_p_f_p_void_p_p_apr_hash_t_p_q_const__char_svn_revnum_t_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[20]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_q_const__char_svn_commit_callback_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_p_void_p_q_const__char__int swig_types[29]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[31]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[32]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[33]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[34]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[35]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_boolean_t_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[37]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[38]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[39]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_p_apr_hash_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[40]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_node_kind_t_p_apr_pool_t__p_svn_error_t swig_types[41]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_svn_stream_t_p_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[42]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_apr_pool_t__p_svn_error_t swig_types[43]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[44]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_depth_t_svn_boolean_t_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[45]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_svn_revnum_t_svn_ra_file_rev_handler_t_p_void_p_apr_pool_t__p_svn_error_t swig_types[46]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[47]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t__p_svn_error_t swig_types[48]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t swig_types[49]
+#define SWIGTYPE_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[50]
+#define SWIGTYPE_p_f_p_void_p_void__void swig_types[51]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[52]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[53]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t swig_types[54]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[55]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_p_q_const__svn_delta_editor_t_p_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[56]
+#define SWIGTYPE_p_f_svn_revnum_t_p_void_p_q_const__svn_delta_editor_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t swig_types[57]
+#define SWIGTYPE_p_f_void__p_svn_version_t swig_types[58]
+#define SWIGTYPE_p_int swig_types[59]
+#define SWIGTYPE_p_long swig_types[60]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[61]
+#define SWIGTYPE_p_p_apr_file_t swig_types[62]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[63]
+#define SWIGTYPE_p_p_char swig_types[64]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[65]
+#define SWIGTYPE_p_p_f_p_void_p_void__void swig_types[66]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[67]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[68]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[69]
+#define SWIGTYPE_p_p_svn_ra_callbacks2_t swig_types[70]
+#define SWIGTYPE_p_p_svn_ra_plugin_t swig_types[71]
+#define SWIGTYPE_p_p_svn_ra_reporter2_t swig_types[72]
+#define SWIGTYPE_p_p_svn_ra_reporter3_t swig_types[73]
+#define SWIGTYPE_p_p_svn_ra_reporter_t swig_types[74]
+#define SWIGTYPE_p_p_svn_ra_session_t swig_types[75]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[76]
+#define SWIGTYPE_p_p_svn_string_t swig_types[77]
+#define SWIGTYPE_p_p_svn_stringbuf_t swig_types[78]
+#define SWIGTYPE_p_p_void swig_types[79]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[80]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[81]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[82]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[83]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[84]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[85]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[86]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[87]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[88]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[89]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[90]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[91]
+#define SWIGTYPE_p_svn_checksum_t swig_types[92]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[93]
+#define SWIGTYPE_p_svn_config_t swig_types[94]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[95]
+#define SWIGTYPE_p_svn_depth_t swig_types[96]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[97]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[98]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[99]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[100]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[101]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[102]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[103]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[104]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[105]
+#define SWIGTYPE_p_svn_diff_t swig_types[106]
+#define SWIGTYPE_p_svn_dirent_t swig_types[107]
+#define SWIGTYPE_p_svn_errno_t swig_types[108]
+#define SWIGTYPE_p_svn_error_t swig_types[109]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[110]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[111]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[112]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[113]
+#define SWIGTYPE_p_svn_lock_t swig_types[114]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[115]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[116]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[117]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[118]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[119]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[120]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[121]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[122]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[123]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[124]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[125]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[126]
+#define SWIGTYPE_p_svn_patch_t swig_types[127]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[128]
+#define SWIGTYPE_p_svn_prop_kind swig_types[129]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[130]
+#define SWIGTYPE_p_svn_ra_callbacks2_t swig_types[131]
+#define SWIGTYPE_p_svn_ra_callbacks_t swig_types[132]
+#define SWIGTYPE_p_svn_ra_plugin_t swig_types[133]
+#define SWIGTYPE_p_svn_ra_reporter2_t swig_types[134]
+#define SWIGTYPE_p_svn_ra_reporter3_t swig_types[135]
+#define SWIGTYPE_p_svn_ra_reporter_t swig_types[136]
+#define SWIGTYPE_p_svn_ra_session_t swig_types[137]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[138]
+#define SWIGTYPE_p_svn_stream_t swig_types[139]
+#define SWIGTYPE_p_svn_string_t swig_types[140]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[141]
+#define SWIGTYPE_p_svn_tristate_t swig_types[142]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[143]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[144]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[145]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[146]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[147]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[148]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[149]
+#define SWIGTYPE_p_svn_version_t swig_types[150]
+#define SWIGTYPE_p_unsigned_long swig_types[151]
+#define SWIGTYPE_p_void swig_types[152]
+static swig_type_info *swig_types[154];
+static swig_module_info swig_module = {swig_types, 153, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1957,7 +1950,7 @@ static VALUE mRa;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2079,7 +2072,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2124,7 +2117,7 @@ SWIG_AsVal_int (VALUE obj, int *val)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2429,6 +2422,21 @@ static svn_error_t * svn_ra_invoke_replay_revfinish_callback(
return _obj(revision, replay_baton, editor, edit_baton, rev_props, pool);
}
+static svn_boolean_t svn_ra_invoke_check_tunnel_func(
+ svn_ra_check_tunnel_func_t _obj, void *tunnel_baton, const char *tunnel_name) {
+ return _obj(tunnel_baton, tunnel_name);
+}
+
+static void svn_ra_invoke_close_tunnel_func(
+ svn_ra_close_tunnel_func_t _obj, void *close_baton, void *tunnel_baton) {
+ _obj(close_baton, tunnel_baton);
+}
+
+static svn_error_t * svn_ra_invoke_open_tunnel_func(
+ svn_ra_open_tunnel_func_t _obj, 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) {
+ return _obj(request, response, close_func, close_baton, tunnel_baton, tunnel_name, user, hostname, port, cancel_func, cancel_baton, pool);
+}
+
static svn_error_t * svn_ra_invoke_init_func(
svn_ra_init_func_t _obj, int abi_version, apr_pool_t *pool, apr_hash_t *hash) {
return _obj(abi_version, pool, hash);
@@ -3942,6 +3950,161 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_check_tunnel_func_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_check_tunnel_func_t arg2 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","check_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_check_tunnel_func_t","check_tunnel_func", 2, argv[0] ));
+ }
+ }
+ if (arg1) (arg1)->check_tunnel_func = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_check_tunnel_func_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_ra_check_tunnel_func_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","check_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (svn_ra_check_tunnel_func_t) ((arg1)->check_tunnel_func);
+ vresult = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_open_tunnel_func_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ svn_ra_open_tunnel_func_t arg2 = (svn_ra_open_tunnel_func_t) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","open_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg2), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_open_tunnel_func_t","open_tunnel_func", 2, argv[0] ));
+ }
+ }
+ if (arg1) (arg1)->open_tunnel_func = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_open_tunnel_func_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_ra_open_tunnel_func_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","open_tunnel_func", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (svn_ra_open_tunnel_func_t) ((arg1)->open_tunnel_func);
+ vresult = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_tunnel_baton_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","tunnel_baton", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[0],SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","tunnel_baton", 2, argv[0] ));
+ }
+ if (arg1) (arg1)->tunnel_baton = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_callbacks2_t_tunnel_baton_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_ra_callbacks2_t *arg1 = (struct svn_ra_callbacks2_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_ra_callbacks2_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_ra_callbacks2_t *","tunnel_baton", 1, self ));
+ }
+ arg1 = (struct svn_ra_callbacks2_t *)(argp1);
+ result = (void *) ((arg1)->tunnel_baton);
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 );
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
SWIGINTERN VALUE
_wrap_svn_ra_callbacks2_t_allocate(VALUE self) {
@@ -7806,7 +7969,7 @@ _wrap_svn_ra_get_log2(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[8], _global_pool);
}
{
- arg10 = svn_swig_rb_log_entry_receiver;
+ arg10 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -7905,7 +8068,7 @@ _wrap_svn_ra_get_log(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -8759,7 +8922,7 @@ _wrap_svn_ra_get_file_revs(int argc, VALUE *argv, VALUE self) {
}
arg4 = (svn_revnum_t)(val4);
{
- arg5 = svn_swig_rb_ra_file_rev_handler;
+ arg5 = (svn_ra_file_rev_handler_t) svn_swig_rb_ra_file_rev_handler;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -8842,7 +9005,7 @@ _wrap_svn_ra_lock(int argc, VALUE *argv, VALUE self) {
}
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_ra_lock_callback;
+ arg5 = (svn_ra_lock_callback_t) svn_swig_rb_ra_lock_callback;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -8915,7 +9078,7 @@ _wrap_svn_ra_unlock(int argc, VALUE *argv, VALUE self) {
}
arg3 = RTEST(argv[2]);
{
- arg4 = svn_swig_rb_ra_lock_callback;
+ arg4 = (svn_ra_lock_callback_t) svn_swig_rb_ra_lock_callback;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -13950,7 +14113,7 @@ _wrap_svn_ra_plugin_invoke_get_log(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_log_receiver;
+ arg8 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -14394,7 +14557,7 @@ _wrap_svn_ra_plugin_invoke_get_file_revs(int argc, VALUE *argv, VALUE self) {
}
arg5 = (svn_revnum_t)(val5);
{
- arg6 = svn_swig_rb_ra_file_rev_handler;
+ arg6 = (svn_ra_file_rev_handler_t) svn_swig_rb_ra_file_rev_handler;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -15519,6 +15682,240 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_ra_invoke_check_tunnel_func(int argc, VALUE *argv, VALUE self) {
+ svn_ra_check_tunnel_func_t arg1 = (svn_ra_check_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ char *arg3 = (char *) 0 ;
+ int res2 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ svn_boolean_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 3) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char__int);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_check_tunnel_func_t","svn_ra_invoke_check_tunnel_func", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_ra_invoke_check_tunnel_func", 2, argv[1] ));
+ }
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_ra_invoke_check_tunnel_func", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ {
+ result = (svn_boolean_t)svn_ra_invoke_check_tunnel_func(arg1,arg2,(char const *)arg3);
+
+
+
+ }
+ vresult = result ? Qtrue : Qfalse;
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_invoke_close_tunnel_func(int argc, VALUE *argv, VALUE self) {
+ svn_ra_close_tunnel_func_t arg1 = (svn_ra_close_tunnel_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ void *arg3 = (void *) 0 ;
+ int res2 ;
+ int res3 ;
+
+ if ((argc < 3) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_void__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_close_tunnel_func_t","svn_ra_invoke_close_tunnel_func", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_ra_invoke_close_tunnel_func", 2, argv[1] ));
+ }
+ res3 = SWIG_ConvertPtr(argv[2],SWIG_as_voidptrptr(&arg3), 0, 0);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_ra_invoke_close_tunnel_func", 3, argv[2] ));
+ }
+ {
+ svn_ra_invoke_close_tunnel_func(arg1,arg2,arg3);
+
+
+
+ }
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_ra_invoke_open_tunnel_func(int argc, VALUE *argv, VALUE self) {
+ svn_ra_open_tunnel_func_t arg1 = (svn_ra_open_tunnel_func_t) 0 ;
+ svn_stream_t **arg2 = (svn_stream_t **) 0 ;
+ svn_stream_t **arg3 = (svn_stream_t **) 0 ;
+ svn_ra_close_tunnel_func_t *arg4 = (svn_ra_close_tunnel_func_t *) 0 ;
+ void **arg5 = (void **) 0 ;
+ void *arg6 = (void *) 0 ;
+ char *arg7 = (char *) 0 ;
+ char *arg8 = (char *) 0 ;
+ char *arg9 = (char *) 0 ;
+ int arg10 ;
+ svn_cancel_func_t arg11 = (svn_cancel_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ apr_pool_t *arg13 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_stream_t *temp2 ;
+ svn_stream_t *temp3 ;
+ svn_ra_close_tunnel_func_t temp4 ;
+ void *temp5 ;
+ int res6 ;
+ int res7 ;
+ char *buf7 = 0 ;
+ int alloc7 = 0 ;
+ int res8 ;
+ char *buf8 = 0 ;
+ int alloc8 = 0 ;
+ int res9 ;
+ char *buf9 = 0 ;
+ int alloc9 = 0 ;
+ int val10 ;
+ int ecode10 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg13);
+ _global_pool = arg13;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg2 = &temp2;
+ arg3 = &temp3;
+ arg4 = &temp4;
+ arg5 = &temp5;
+ if ((argc < 7) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_ra_open_tunnel_func_t","svn_ra_invoke_open_tunnel_func", 1, argv[0] ));
+ }
+ }
+ res6 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg6), 0, 0);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "void *","svn_ra_invoke_open_tunnel_func", 6, argv[1] ));
+ }
+ res7 = SWIG_AsCharPtrAndSize(argv[2], &buf7, NULL, &alloc7);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "char const *","svn_ra_invoke_open_tunnel_func", 7, argv[2] ));
+ }
+ arg7 = (char *)(buf7);
+ res8 = SWIG_AsCharPtrAndSize(argv[3], &buf8, NULL, &alloc8);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "char const *","svn_ra_invoke_open_tunnel_func", 8, argv[3] ));
+ }
+ arg8 = (char *)(buf8);
+ res9 = SWIG_AsCharPtrAndSize(argv[4], &buf9, NULL, &alloc9);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "char const *","svn_ra_invoke_open_tunnel_func", 9, argv[4] ));
+ }
+ arg9 = (char *)(buf9);
+ ecode10 = SWIG_AsVal_int(argv[5], &val10);
+ if (!SWIG_IsOK(ecode10)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode10), Ruby_Format_TypeError( "", "int","svn_ra_invoke_open_tunnel_func", 10, argv[5] ));
+ }
+ arg10 = (int)(val10);
+ {
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg12 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
+ }
+ if (argc > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_ra_invoke_open_tunnel_func(arg1,arg2,arg3,arg4,arg5,arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,arg10,arg11,arg12,arg13);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg2, SWIGTYPE_p_svn_stream_t, 0));
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg3, SWIGTYPE_p_svn_stream_t, 0));
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_ra_invoke_open_tunnel_func arg 4 (svn_ra_close_tunnel_func_t *) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_ra_invoke_open_tunnel_func is not implemented yet");
+
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_ra_invoke_open_tunnel_func arg 5 (void **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_ra_invoke_open_tunnel_func is not implemented yet");
+
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg12);
+ }
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc7 == SWIG_NEWOBJ) free((char*)buf7);
+ if (alloc8 == SWIG_NEWOBJ) free((char*)buf8);
+ if (alloc9 == SWIG_NEWOBJ) free((char*)buf9);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_ra_invoke_init_func(int argc, VALUE *argv, VALUE self) {
svn_ra_init_func_t arg1 = (svn_ra_init_func_t) 0 ;
int arg2 ;
@@ -15621,6 +16018,7 @@ static swig_type_info _swigt__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void
static swig_type_info _swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t = {"_p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t", "struct svn_error_t *(*)(int,apr_pool_t *,apr_hash_t *)|svn_ra_init_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_opt_subcommand_t *|struct svn_error_t *(*)(apr_getopt_t *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)|struct svn_error_t *(*)(apr_file_t **,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_ra_open_tunnel_func_t|struct svn_error_t *(*)(svn_stream_t **,svn_stream_t **,svn_ra_close_tunnel_func_t *,void **,void *,char const *,char const *,char const *,int,svn_cancel_func_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)|svn_error_t *(*)(void **,char const *,svn_ra_callbacks_t const *,void *,apr_hash_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_commit_callback2_t|struct svn_error_t *(*)(svn_commit_info_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_location_segment_t *,void *,apr_pool_t *)|svn_location_segment_receiver_t", 0, 0, (void*)0, 0};
@@ -15637,6 +16035,7 @@ static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_type_info _swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_ra_reporter_t const **,void **,svn_revnum_t,char const *,svn_boolean_t,svn_boolean_t,char const *,svn_delta_editor_t const *,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_stream_t **,svn_checksum_t const *,apr_pool_t *)|svn_ra_get_wc_contents_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)|struct svn_error_t *(*)(void *,apr_array_header_t const *,svn_revnum_t,svn_revnum_t,svn_boolean_t,svn_boolean_t,svn_log_message_receiver_t,void *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char__int = {"_p_f_p_void_p_q_const__char__int", "int (*)(void *,char const *)|svn_ra_check_tunnel_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,char const *,apr_pool_t *)|struct svn_error_t *(*)(void *,char const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,apr_pool_t *)|svn_ra_invalidate_wc_props_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,char const *,svn_string_t const **,apr_pool_t *)|svn_ra_get_wc_prop_func_t", 0, 0, (void*)0, 0};
@@ -15658,6 +16057,7 @@ static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t__p_svn_error_t", "svn_ra_get_latest_revnum_func_t|struct svn_error_t *(*)(void *,svn_revnum_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_time_t,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)|struct svn_error_t *(*)(void *,svn_revnum_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_void__void = {"_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t|void (*)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,apr_hash_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t **,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)|svn_error_t *(*)(void *,svn_revnum_t,char const *,svn_string_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
@@ -15672,6 +16072,7 @@ static swig_type_info _swigt__p_p_apr_file_t = {"_p_p_apr_file_t", "apr_file_t *
static swig_type_info _swigt__p_p_apr_hash_t = {"_p_p_apr_hash_t", "apr_hash_t **|svn_mergeinfo_catalog_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t = {"_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t", "svn_txdelta_window_handler_t *|struct svn_error_t *(**)(svn_txdelta_window_t *,void *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_f_p_void_p_void__void = {"_p_p_f_p_void_p_void__void", "svn_ra_close_tunnel_func_t *|void (**)(void *,void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_delta_editor_t = {"_p_p_svn_delta_editor_t", "struct svn_delta_editor_t **|svn_delta_editor_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_dirent_t = {"_p_p_svn_dirent_t", "struct svn_dirent_t **|svn_dirent_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_lock_t = {"_p_p_svn_lock_t", "struct svn_lock_t **|svn_lock_t **", 0, 0, (void*)0, 0};
@@ -15772,6 +16173,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -15788,6 +16190,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char__int,
&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -15809,6 +16212,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_p_void__void,
&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -15823,6 +16227,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_apr_hash_t,
&_swigt__p_p_char,
&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ &_swigt__p_p_f_p_void_p_void__void,
&_swigt__p_p_svn_delta_editor_t,
&_swigt__p_p_svn_dirent_t,
&_swigt__p_p_svn_lock_t,
@@ -15923,6 +16328,7 @@ static swig_cast_info _swigc__p_f_apr_off_t_apr_off_t_p_void_p_apr_pool_t__void[
static swig_cast_info _swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t[] = { {&_swigt__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -15939,6 +16345,7 @@ static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void
static swig_cast_info _swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char__int[] = { {&_swigt__p_f_p_void_p_q_const__char__int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -15960,6 +16367,7 @@ static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_e
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_void__void[] = { {&_swigt__p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -15974,6 +16382,7 @@ static swig_cast_info _swigc__p_p_apr_file_t[] = { {&_swigt__p_p_apr_file_t, 0,
static swig_cast_info _swigc__p_p_apr_hash_t[] = { {&_swigt__p_p_apr_hash_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t[] = { {&_swigt__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_f_p_void_p_void__void[] = { {&_swigt__p_p_f_p_void_p_void__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_delta_editor_t[] = { {&_swigt__p_p_svn_delta_editor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_dirent_t[] = { {&_swigt__p_p_svn_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_lock_t[] = { {&_swigt__p_p_svn_lock_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -16074,6 +16483,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_int_p_apr_pool_t_p_apr_hash_t__p_svn_error_t,
_swigc__p_f_p_apr_getopt_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_apr_file_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_p_svn_stream_t_p_p_svn_stream_t_p_svn_ra_close_tunnel_func_t_p_p_void_p_void_p_q_const__char_p_q_const__char_p_q_const__char_int_svn_cancel_func_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_p_void_p_q_const__char_p_q_const__svn_ra_callbacks_t_p_void_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_q_const__svn_commit_info_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_svn_location_segment_t_p_void_p_apr_pool_t__p_svn_error_t,
@@ -16090,6 +16500,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_p_q_const__svn_ra_reporter_t_p_p_void_svn_revnum_t_p_q_const__char_svn_boolean_t_svn_boolean_t_p_q_const__char_p_q_const__svn_delta_editor_t_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_p_svn_stream_t_p_q_const__svn_checksum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__apr_array_header_t_svn_revnum_t_svn_revnum_t_svn_boolean_t_svn_boolean_t_svn_log_message_receiver_t_p_void_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char__int,
_swigc__p_f_p_void_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__char_p_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -16111,6 +16522,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_svn_revnum_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_apr_time_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_p_void__void,
_swigc__p_f_p_void_svn_revnum_t_p_p_apr_hash_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_p_svn_string_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_svn_revnum_t_p_q_const__char_p_q_const__svn_string_t_p_apr_pool_t__p_svn_error_t,
@@ -16125,6 +16537,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_apr_hash_t,
_swigc__p_p_char,
_swigc__p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t,
+ _swigc__p_p_f_p_void_p_void__void,
_swigc__p_p_svn_delta_editor_t,
_swigc__p_p_svn_dirent_t,
_swigc__p_p_svn_lock_t,
@@ -16218,18 +16631,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -16239,17 +16652,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -16312,7 +16725,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -16326,7 +16739,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -16353,7 +16766,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -16555,6 +16968,12 @@ SWIGEXPORT void Init_ra(void) {
rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "get_client_string", _wrap_svn_ra_callbacks2_t_get_client_string_get, -1);
rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "get_wc_contents=", _wrap_svn_ra_callbacks2_t_get_wc_contents_set, -1);
rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "get_wc_contents", _wrap_svn_ra_callbacks2_t_get_wc_contents_get, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "check_tunnel_func=", _wrap_svn_ra_callbacks2_t_check_tunnel_func_set, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "check_tunnel_func", _wrap_svn_ra_callbacks2_t_check_tunnel_func_get, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "open_tunnel_func=", _wrap_svn_ra_callbacks2_t_open_tunnel_func_set, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "open_tunnel_func", _wrap_svn_ra_callbacks2_t_open_tunnel_func_get, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "tunnel_baton=", _wrap_svn_ra_callbacks2_t_tunnel_baton_set, -1);
+ rb_define_method(SwigClassSvn_ra_callbacks2_t.klass, "tunnel_baton", _wrap_svn_ra_callbacks2_t_tunnel_baton_get, -1);
SwigClassSvn_ra_callbacks2_t.mark = 0;
SwigClassSvn_ra_callbacks2_t.destroy = (void (*)(void *)) free_svn_ra_callbacks2_t;
SwigClassSvn_ra_callbacks2_t.trackObjects = 0;
@@ -16749,6 +17168,9 @@ SWIGEXPORT void Init_ra(void) {
rb_define_module_function(mRa, "svn_ra_invoke_progress_notify_func", _wrap_svn_ra_invoke_progress_notify_func, -1);
rb_define_module_function(mRa, "svn_ra_invoke_replay_revstart_callback", _wrap_svn_ra_invoke_replay_revstart_callback, -1);
rb_define_module_function(mRa, "svn_ra_invoke_replay_revfinish_callback", _wrap_svn_ra_invoke_replay_revfinish_callback, -1);
+ rb_define_module_function(mRa, "svn_ra_invoke_check_tunnel_func", _wrap_svn_ra_invoke_check_tunnel_func, -1);
+ rb_define_module_function(mRa, "svn_ra_invoke_close_tunnel_func", _wrap_svn_ra_invoke_close_tunnel_func, -1);
+ rb_define_module_function(mRa, "svn_ra_invoke_open_tunnel_func", _wrap_svn_ra_invoke_open_tunnel_func, -1);
rb_define_module_function(mRa, "svn_ra_invoke_init_func", _wrap_svn_ra_invoke_init_func, -1);
}
diff --git a/subversion/bindings/swig/ruby/svn_repos.c b/subversion/bindings/swig/ruby/svn_repos.c
index 98c70af..d5e69a1 100644
--- a/subversion/bindings/swig/ruby/svn_repos.c
+++ b/subversion/bindings/swig/ruby/svn_repos.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1813,122 +1802,131 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
#define SWIGTYPE_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t swig_types[18]
#define SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t swig_types[19]
#define SWIGTYPE_p_f_p_void_p_q_const__char__p_svn_error_t swig_types[20]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[21]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[22]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[23]
-#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[24]
-#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[25]
-#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[26]
-#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[27]
-#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[28]
-#define SWIGTYPE_p_int swig_types[29]
-#define SWIGTYPE_p_long swig_types[30]
-#define SWIGTYPE_p_p_apr_array_header_t swig_types[31]
-#define SWIGTYPE_p_p_apr_hash_t swig_types[32]
-#define SWIGTYPE_p_p_char swig_types[33]
-#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[34]
-#define SWIGTYPE_p_p_svn_authz_t swig_types[35]
-#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[36]
-#define SWIGTYPE_p_p_svn_dirent_t swig_types[37]
-#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[38]
-#define SWIGTYPE_p_p_svn_lock_t swig_types[39]
-#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[40]
-#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[41]
-#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[42]
-#define SWIGTYPE_p_p_svn_repos_t swig_types[43]
-#define SWIGTYPE_p_p_svn_stream_t swig_types[44]
-#define SWIGTYPE_p_p_svn_string_t swig_types[45]
-#define SWIGTYPE_p_p_void swig_types[46]
-#define SWIGTYPE_p_svn_auth_baton_t swig_types[47]
-#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[48]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[49]
-#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[50]
-#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[51]
-#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[52]
-#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[53]
-#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[54]
-#define SWIGTYPE_p_svn_auth_provider_t swig_types[55]
-#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[56]
-#define SWIGTYPE_p_svn_authz_t swig_types[57]
-#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[58]
-#define SWIGTYPE_p_svn_checksum_kind_t swig_types[59]
-#define SWIGTYPE_p_svn_checksum_t swig_types[60]
-#define SWIGTYPE_p_svn_commit_info_t swig_types[61]
-#define SWIGTYPE_p_svn_config_t swig_types[62]
-#define SWIGTYPE_p_svn_delta_editor_t swig_types[63]
-#define SWIGTYPE_p_svn_depth_t swig_types[64]
-#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[65]
-#define SWIGTYPE_p_svn_diff_datasource_e swig_types[66]
-#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[67]
-#define SWIGTYPE_p_svn_diff_file_options_t swig_types[68]
-#define SWIGTYPE_p_svn_diff_fns2_t swig_types[69]
-#define SWIGTYPE_p_svn_diff_fns_t swig_types[70]
-#define SWIGTYPE_p_svn_diff_hunk_t swig_types[71]
-#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[72]
-#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[73]
-#define SWIGTYPE_p_svn_diff_t swig_types[74]
-#define SWIGTYPE_p_svn_dirent_t swig_types[75]
-#define SWIGTYPE_p_svn_errno_t swig_types[76]
-#define SWIGTYPE_p_svn_error_t swig_types[77]
-#define SWIGTYPE_p_svn_fs_access_t swig_types[78]
-#define SWIGTYPE_p_svn_fs_dirent_t swig_types[79]
-#define SWIGTYPE_p_svn_fs_history_t swig_types[80]
-#define SWIGTYPE_p_svn_fs_id_t swig_types[81]
-#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[82]
-#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[83]
-#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[84]
-#define SWIGTYPE_p_svn_fs_path_change_t swig_types[85]
-#define SWIGTYPE_p_svn_fs_root_t swig_types[86]
-#define SWIGTYPE_p_svn_fs_t swig_types[87]
-#define SWIGTYPE_p_svn_fs_txn_t swig_types[88]
-#define SWIGTYPE_p_svn_io_dirent2_t swig_types[89]
-#define SWIGTYPE_p_svn_io_dirent_t swig_types[90]
-#define SWIGTYPE_p_svn_io_file_del_t swig_types[91]
-#define SWIGTYPE_p_svn_location_segment_t swig_types[92]
-#define SWIGTYPE_p_svn_lock_t swig_types[93]
-#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[94]
-#define SWIGTYPE_p_svn_log_changed_path_t swig_types[95]
-#define SWIGTYPE_p_svn_log_entry_t swig_types[96]
-#define SWIGTYPE_p_svn_merge_range_t swig_types[97]
-#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[98]
-#define SWIGTYPE_p_svn_node_kind_t swig_types[99]
-#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[100]
-#define SWIGTYPE_p_svn_opt_revision_t swig_types[101]
-#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[102]
-#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[103]
-#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[104]
-#define SWIGTYPE_p_svn_patch_file_t swig_types[105]
-#define SWIGTYPE_p_svn_patch_t swig_types[106]
-#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[107]
-#define SWIGTYPE_p_svn_prop_kind swig_types[108]
-#define SWIGTYPE_p_svn_prop_patch_t swig_types[109]
-#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[110]
-#define SWIGTYPE_p_svn_repos_node_t swig_types[111]
-#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[112]
-#define SWIGTYPE_p_svn_repos_notify_t swig_types[113]
-#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[114]
-#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[115]
-#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[116]
-#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[117]
-#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[118]
-#define SWIGTYPE_p_svn_repos_t swig_types[119]
-#define SWIGTYPE_p_svn_stream_mark_t swig_types[120]
-#define SWIGTYPE_p_svn_stream_t swig_types[121]
-#define SWIGTYPE_p_svn_string_t swig_types[122]
-#define SWIGTYPE_p_svn_stringbuf_t swig_types[123]
-#define SWIGTYPE_p_svn_tristate_t swig_types[124]
-#define SWIGTYPE_p_svn_txdelta_op_t swig_types[125]
-#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[126]
-#define SWIGTYPE_p_svn_txdelta_window_t swig_types[127]
-#define SWIGTYPE_p_svn_version_checklist_t swig_types[128]
-#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[129]
-#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[130]
-#define SWIGTYPE_p_svn_version_extended_t swig_types[131]
-#define SWIGTYPE_p_svn_version_t swig_types[132]
-#define SWIGTYPE_p_unsigned_long swig_types[133]
-#define SWIGTYPE_p_void swig_types[134]
-static swig_type_info *swig_types[136];
-static swig_module_info swig_module = {swig_types, 135, 0, 0, 0, 0};
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[21]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t swig_types[22]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[23]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t swig_types[24]
+#define SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t swig_types[25]
+#define SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void swig_types[26]
+#define SWIGTYPE_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t swig_types[27]
+#define SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t swig_types[28]
+#define SWIGTYPE_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t swig_types[29]
+#define SWIGTYPE_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t swig_types[30]
+#define SWIGTYPE_p_int swig_types[31]
+#define SWIGTYPE_p_long swig_types[32]
+#define SWIGTYPE_p_p_apr_array_header_t swig_types[33]
+#define SWIGTYPE_p_p_apr_hash_t swig_types[34]
+#define SWIGTYPE_p_p_char swig_types[35]
+#define SWIGTYPE_p_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t swig_types[36]
+#define SWIGTYPE_p_p_svn_authz_t swig_types[37]
+#define SWIGTYPE_p_p_svn_delta_editor_t swig_types[38]
+#define SWIGTYPE_p_p_svn_dirent_t swig_types[39]
+#define SWIGTYPE_p_p_svn_fs_txn_t swig_types[40]
+#define SWIGTYPE_p_p_svn_lock_t swig_types[41]
+#define SWIGTYPE_p_p_svn_repos_parse_fns2_t swig_types[42]
+#define SWIGTYPE_p_p_svn_repos_parse_fns3_t swig_types[43]
+#define SWIGTYPE_p_p_svn_repos_parse_fns_t swig_types[44]
+#define SWIGTYPE_p_p_svn_repos_t swig_types[45]
+#define SWIGTYPE_p_p_svn_stream_t swig_types[46]
+#define SWIGTYPE_p_p_svn_string_t swig_types[47]
+#define SWIGTYPE_p_p_svn_version_t swig_types[48]
+#define SWIGTYPE_p_p_void swig_types[49]
+#define SWIGTYPE_p_svn_auth_baton_t swig_types[50]
+#define SWIGTYPE_p_svn_auth_cred_simple_t swig_types[51]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_pw_t swig_types[52]
+#define SWIGTYPE_p_svn_auth_cred_ssl_client_cert_t swig_types[53]
+#define SWIGTYPE_p_svn_auth_cred_ssl_server_trust_t swig_types[54]
+#define SWIGTYPE_p_svn_auth_cred_username_t swig_types[55]
+#define SWIGTYPE_p_svn_auth_iterstate_t swig_types[56]
+#define SWIGTYPE_p_svn_auth_provider_object_t swig_types[57]
+#define SWIGTYPE_p_svn_auth_provider_t swig_types[58]
+#define SWIGTYPE_p_svn_auth_ssl_server_cert_info_t swig_types[59]
+#define SWIGTYPE_p_svn_authz_t swig_types[60]
+#define SWIGTYPE_p_svn_checksum_ctx_t swig_types[61]
+#define SWIGTYPE_p_svn_checksum_kind_t swig_types[62]
+#define SWIGTYPE_p_svn_checksum_t swig_types[63]
+#define SWIGTYPE_p_svn_commit_info_t swig_types[64]
+#define SWIGTYPE_p_svn_config_t swig_types[65]
+#define SWIGTYPE_p_svn_delta_editor_t swig_types[66]
+#define SWIGTYPE_p_svn_depth_t swig_types[67]
+#define SWIGTYPE_p_svn_diff_conflict_display_style_t swig_types[68]
+#define SWIGTYPE_p_svn_diff_datasource_e swig_types[69]
+#define SWIGTYPE_p_svn_diff_file_ignore_space_t swig_types[70]
+#define SWIGTYPE_p_svn_diff_file_options_t swig_types[71]
+#define SWIGTYPE_p_svn_diff_fns2_t swig_types[72]
+#define SWIGTYPE_p_svn_diff_fns_t swig_types[73]
+#define SWIGTYPE_p_svn_diff_hunk_t swig_types[74]
+#define SWIGTYPE_p_svn_diff_operation_kind_e swig_types[75]
+#define SWIGTYPE_p_svn_diff_output_fns_t swig_types[76]
+#define SWIGTYPE_p_svn_diff_t swig_types[77]
+#define SWIGTYPE_p_svn_dirent_t swig_types[78]
+#define SWIGTYPE_p_svn_errno_t swig_types[79]
+#define SWIGTYPE_p_svn_error_t swig_types[80]
+#define SWIGTYPE_p_svn_fs_access_t swig_types[81]
+#define SWIGTYPE_p_svn_fs_dirent_t swig_types[82]
+#define SWIGTYPE_p_svn_fs_fsfs_info_t swig_types[83]
+#define SWIGTYPE_p_svn_fs_fsx_info_t swig_types[84]
+#define SWIGTYPE_p_svn_fs_history_t swig_types[85]
+#define SWIGTYPE_p_svn_fs_id_t swig_types[86]
+#define SWIGTYPE_p_svn_fs_info_placeholder_t swig_types[87]
+#define SWIGTYPE_p_svn_fs_lock_target_t swig_types[88]
+#define SWIGTYPE_p_svn_fs_node_relation_t swig_types[89]
+#define SWIGTYPE_p_svn_fs_pack_notify_action_t swig_types[90]
+#define SWIGTYPE_p_svn_fs_path_change2_t swig_types[91]
+#define SWIGTYPE_p_svn_fs_path_change_kind_t swig_types[92]
+#define SWIGTYPE_p_svn_fs_path_change_t swig_types[93]
+#define SWIGTYPE_p_svn_fs_root_t swig_types[94]
+#define SWIGTYPE_p_svn_fs_t swig_types[95]
+#define SWIGTYPE_p_svn_fs_txn_t swig_types[96]
+#define SWIGTYPE_p_svn_fs_upgrade_notify_action_t swig_types[97]
+#define SWIGTYPE_p_svn_io_dirent2_t swig_types[98]
+#define SWIGTYPE_p_svn_io_dirent_t swig_types[99]
+#define SWIGTYPE_p_svn_io_file_del_t swig_types[100]
+#define SWIGTYPE_p_svn_location_segment_t swig_types[101]
+#define SWIGTYPE_p_svn_lock_t swig_types[102]
+#define SWIGTYPE_p_svn_log_changed_path2_t swig_types[103]
+#define SWIGTYPE_p_svn_log_changed_path_t swig_types[104]
+#define SWIGTYPE_p_svn_log_entry_t swig_types[105]
+#define SWIGTYPE_p_svn_merge_range_t swig_types[106]
+#define SWIGTYPE_p_svn_mergeinfo_inheritance_t swig_types[107]
+#define SWIGTYPE_p_svn_node_kind_t swig_types[108]
+#define SWIGTYPE_p_svn_opt_revision_range_t swig_types[109]
+#define SWIGTYPE_p_svn_opt_revision_t swig_types[110]
+#define SWIGTYPE_p_svn_opt_revision_value_t swig_types[111]
+#define SWIGTYPE_p_svn_opt_subcommand_desc2_t swig_types[112]
+#define SWIGTYPE_p_svn_opt_subcommand_desc_t swig_types[113]
+#define SWIGTYPE_p_svn_patch_file_t swig_types[114]
+#define SWIGTYPE_p_svn_patch_t swig_types[115]
+#define SWIGTYPE_p_svn_prop_inherited_item_t swig_types[116]
+#define SWIGTYPE_p_svn_prop_kind swig_types[117]
+#define SWIGTYPE_p_svn_prop_patch_t swig_types[118]
+#define SWIGTYPE_p_svn_repos_authz_access_t swig_types[119]
+#define SWIGTYPE_p_svn_repos_node_t swig_types[120]
+#define SWIGTYPE_p_svn_repos_notify_action_t swig_types[121]
+#define SWIGTYPE_p_svn_repos_notify_t swig_types[122]
+#define SWIGTYPE_p_svn_repos_notify_warning_t swig_types[123]
+#define SWIGTYPE_p_svn_repos_parse_fns2_t swig_types[124]
+#define SWIGTYPE_p_svn_repos_parse_fns3_t swig_types[125]
+#define SWIGTYPE_p_svn_repos_parse_fns_t swig_types[126]
+#define SWIGTYPE_p_svn_repos_revision_access_level_t swig_types[127]
+#define SWIGTYPE_p_svn_repos_t swig_types[128]
+#define SWIGTYPE_p_svn_stream_mark_t swig_types[129]
+#define SWIGTYPE_p_svn_stream_t swig_types[130]
+#define SWIGTYPE_p_svn_string_t swig_types[131]
+#define SWIGTYPE_p_svn_stringbuf_t swig_types[132]
+#define SWIGTYPE_p_svn_tristate_t swig_types[133]
+#define SWIGTYPE_p_svn_txdelta_op_t swig_types[134]
+#define SWIGTYPE_p_svn_txdelta_stream_t swig_types[135]
+#define SWIGTYPE_p_svn_txdelta_window_t swig_types[136]
+#define SWIGTYPE_p_svn_version_checklist_t swig_types[137]
+#define SWIGTYPE_p_svn_version_ext_linked_lib_t swig_types[138]
+#define SWIGTYPE_p_svn_version_ext_loaded_lib_t swig_types[139]
+#define SWIGTYPE_p_svn_version_extended_t swig_types[140]
+#define SWIGTYPE_p_svn_version_t swig_types[141]
+#define SWIGTYPE_p_unsigned_long swig_types[142]
+#define SWIGTYPE_p_void swig_types[143]
+static swig_type_info *swig_types[145];
+static swig_module_info swig_module = {swig_types, 144, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -1943,7 +1941,7 @@ static VALUE mRepos;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2006,7 +2004,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2148,7 +2146,7 @@ SWIG_FromCharPtr(const char *cptr)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2352,11 +2350,6 @@ static svn_error_t * svn_repos_invoke_authz_callback(
return _obj(required, allowed, root, path, baton, pool);
}
-static svn_error_t * svn_repos_invoke_file_rev_handler(
- svn_repos_file_rev_handler_t _obj, 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) {
- return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
-}
-
static void svn_repos_invoke_notify_func(
svn_repos_notify_func_t _obj, void *baton, const svn_repos_notify_t *notify, apr_pool_t *scratch_pool) {
_obj(baton, notify, scratch_pool);
@@ -2372,6 +2365,16 @@ static svn_error_t * svn_repos_invoke_history_func(
return _obj(baton, path, revision, pool);
}
+static svn_error_t * svn_repos_invoke_file_rev_handler(
+ svn_repos_file_rev_handler_t _obj, 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) {
+ return _obj(baton, path, rev, rev_props, delta_handler, delta_baton, prop_diffs, pool);
+}
+
+static svn_error_t * svn_repos_invoke_verify_callback(
+ svn_repos_verify_callback_t _obj, void *baton, svn_revnum_t revision, svn_error_t *verify_err, apr_pool_t *scratch_pool) {
+ return _obj(baton, revision, verify_err, scratch_pool);
+}
+
static VALUE
@@ -2515,7 +2518,7 @@ _wrap_svn_repos_dump_fs2(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -3087,6 +3090,112 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_notify_t_start_revision_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_repos_notify_t *","start_revision", 1, self ));
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ ecode2 = SWIG_AsVal_long(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","start_revision", 2, argv[0] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->start_revision = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_notify_t_start_revision_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_revnum_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_repos_notify_t *","start_revision", 1, self ));
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->start_revision);
+ vresult = SWIG_From_long((long)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_notify_t_end_revision_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ svn_revnum_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_repos_notify_t *","end_revision", 1, self ));
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ ecode2 = SWIG_AsVal_long(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","end_revision", 2, argv[0] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ if (arg1) (arg1)->end_revision = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_notify_t_end_revision_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_repos_notify_t *arg1 = (struct svn_repos_notify_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_revnum_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_repos_notify_t *","end_revision", 1, self ));
+ }
+ arg1 = (struct svn_repos_notify_t *)(argp1);
+ result = (svn_revnum_t) ((arg1)->end_revision);
+ vresult = SWIG_From_long((long)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_notify_create(int argc, VALUE *argv, VALUE self) {
svn_repos_notify_action_t arg1 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
@@ -3197,6 +3306,119 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_open3(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t **arg1 = (svn_repos_t **) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_repos_t *temp1 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 2) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ arg2 = StringValueCStr(argv[0]);
+ }
+ {
+ VALUE rb_pool = Qnil;
+ if (!_global_pool) {
+ svn_swig_rb_get_pool(argc, argv, self, &rb_pool, &_global_pool);
+ svn_swig_rb_push_pool(rb_pool);
+ }
+ arg3 = (NIL_P(argv[1])) ? NULL :
+ svn_swig_rb_hash_to_apr_hash_string(argv[1], _global_pool);
+ _global_pool = NULL;
+ if (!NIL_P(rb_pool)) {
+ if (NIL_P(arg3)) {
+ svn_swig_rb_destroy_pool(rb_pool);
+ } else {
+ svn_swig_rb_set_pool_for_no_swig_type(argv[1], rb_pool);
+ }
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ }
+ if (argc > 2) {
+
+ }
+ if (argc > 3) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_open3(arg1,(char const *)arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE tmp;
+ tmp = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_t, 0);
+ if (rb_block_given_p()) {
+ rb_yield(tmp);
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ DATA_PTR(tmp) = NULL;
+ } else {
+ vresult = SWIG_Ruby_AppendOutput(vresult, tmp);
+ }
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_open2(int argc, VALUE *argv, VALUE self) {
svn_repos_t **arg1 = (svn_repos_t **) 0 ;
char *arg2 = (char *) 0 ;
@@ -3749,6 +3971,322 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_capabilities(int argc, VALUE *argv, VALUE self) {
+ apr_hash_t **arg1 = (apr_hash_t **) 0 ;
+ svn_repos_t *arg2 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ apr_hash_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_capabilities", 2, argv[0] ));
+ }
+ arg2 = (svn_repos_t *)(argp2);
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ if (!arg2) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_capabilities(arg1,arg2,arg3,arg4);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_capabilities arg 1 (apr_hash_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_capabilities is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_remember_client_capabilities(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ if ((argc < 2) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_remember_client_capabilities", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_array_header_t const *","svn_repos_remember_client_capabilities", 2, argv[1] ));
+ }
+ arg2 = (apr_array_header_t *)(argp2);
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_fs_type(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ char *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg2);
+ _global_pool = arg2;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 1) || (argc > 2)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_fs_type", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ if (argc > 1) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (char *)svn_repos_fs_type(arg1,arg2);
+
+
+
+ }
+ {
+ if (result) {
+ vresult = rb_str_new2(result);
+ } else {
+ vresult = Qnil;
+ }
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_hotcopy3(int argc, VALUE *argv, VALUE self) {
+ char *arg1 = (char *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_repos_notify_func_t arg5 = (svn_repos_notify_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res1 ;
+ char *buf1 = 0 ;
+ int alloc1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ int res6 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 7) || (argc > 8)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail;
+ }
+ res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","svn_repos_hotcopy3", 1, argv[0] ));
+ }
+ arg1 = (char *)(buf1);
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_repos_hotcopy3", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[4], (void**)(&arg5), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_hotcopy3", 5, argv[4] ));
+ }
+ }
+ res6 = SWIG_ConvertPtr(argv[5],SWIG_as_voidptrptr(&arg6), 0, 0);
+ if (!SWIG_IsOK(res6)) {
+ SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "void *","svn_repos_hotcopy3", 6, argv[5] ));
+ }
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
+ }
+ if (argc > 7) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_hotcopy3((char const *)arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg8);
+ }
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc1 == SWIG_NEWOBJ) free((char*)buf1);
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_hotcopy2(int argc, VALUE *argv, VALUE self) {
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
@@ -3789,7 +4327,7 @@ _wrap_svn_repos_hotcopy2(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -3953,7 +4491,7 @@ _wrap_svn_repos_fs_pack2(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_repos_fs_pack2", 3, argv[2] ));
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -4041,7 +4579,7 @@ _wrap_svn_repos_fs_pack(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_repos_fs_pack", 3, argv[2] ));
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -4127,7 +4665,7 @@ _wrap_svn_repos_recover4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "void *","svn_repos_recover4", 4, argv[3] ));
}
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -4201,7 +4739,7 @@ _wrap_svn_repos_recover3(int argc, VALUE *argv, VALUE self) {
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -5774,7 +6312,7 @@ _wrap_svn_repos_begin_report3(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg13 = svn_swig_rb_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
}
ecode15 = SWIG_AsVal_unsigned_SS_long(argv[11], &val15);
@@ -5919,7 +6457,7 @@ _wrap_svn_repos_begin_report2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg13 = svn_swig_rb_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
}
if (argc > 11) {
@@ -6063,7 +6601,7 @@ _wrap_svn_repos_begin_report(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg13 = svn_swig_rb_repos_authz_func;
+ arg13 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
}
if (argc > 11) {
@@ -6885,7 +7423,7 @@ _wrap_svn_repos_dir_delta2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg8 = svn_swig_rb_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
arg10 = RTEST(argv[7]);
@@ -7011,7 +7549,7 @@ _wrap_svn_repos_dir_delta(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg8 = svn_swig_rb_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
arg10 = RTEST(argv[7]);
@@ -7117,7 +7655,7 @@ _wrap_svn_repos_replay2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg7 = svn_swig_rb_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -7317,7 +7855,7 @@ _wrap_svn_repos_get_commit_editor5(int argc, VALUE *argv, VALUE self) {
arg9 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_repos_authz_callback;
+ arg10 = (svn_repos_authz_callback_t) svn_swig_rb_repos_authz_callback;
arg11 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -7456,7 +7994,7 @@ _wrap_svn_repos_get_commit_editor4(int argc, VALUE *argv, VALUE self) {
arg10 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg11 = svn_swig_rb_repos_authz_callback;
+ arg11 = (svn_repos_authz_callback_t) svn_swig_rb_repos_authz_callback;
arg12 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -7595,7 +8133,7 @@ _wrap_svn_repos_get_commit_editor3(int argc, VALUE *argv, VALUE self) {
arg10 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg11 = svn_swig_rb_repos_authz_callback;
+ arg11 = (svn_repos_authz_callback_t) svn_swig_rb_repos_authz_callback;
arg12 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -8289,11 +8827,11 @@ _wrap_svn_repos_history2(int argc, VALUE *argv, VALUE self) {
arg2 = StringValueCStr(argv[1]);
}
{
- arg3 = svn_swig_rb_repos_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_rb_repos_history_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
- arg5 = svn_swig_rb_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
ecode7 = SWIG_AsVal_long(argv[4], &val7);
@@ -8387,7 +8925,7 @@ _wrap_svn_repos_history(int argc, VALUE *argv, VALUE self) {
arg2 = StringValueCStr(argv[1]);
}
{
- arg3 = svn_swig_rb_repos_history_func;
+ arg3 = (svn_repos_history_func_t) svn_swig_rb_repos_history_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
ecode5 = SWIG_AsVal_long(argv[3], &val5);
@@ -8494,7 +9032,7 @@ _wrap_svn_repos_trace_node_locations(int argc, VALUE *argv, VALUE self) {
arg5 = svn_swig_rb_array_to_apr_array_revnum(argv[3], _global_pool);
}
{
- arg6 = svn_swig_rb_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -8612,7 +9150,7 @@ _wrap_svn_repos_node_location_segments(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "void *","svn_repos_node_location_segments", 7, argv[6] ));
}
{
- arg8 = svn_swig_rb_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -8725,11 +9263,11 @@ _wrap_svn_repos_get_logs4(int argc, VALUE *argv, VALUE self) {
svn_swig_rb_strings_to_apr_array(argv[8], _global_pool);
}
{
- arg10 = svn_swig_rb_repos_authz_func;
+ arg10 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
{
- arg12 = svn_swig_rb_log_entry_receiver;
+ arg12 = (svn_log_entry_receiver_t) svn_swig_rb_log_entry_receiver;
arg13 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
}
if (argc > 11) {
@@ -8835,11 +9373,11 @@ _wrap_svn_repos_get_logs3(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_log_receiver;
+ arg10 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -8937,11 +9475,11 @@ _wrap_svn_repos_get_logs2(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg9 = svn_swig_rb_log_receiver;
+ arg9 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -9037,7 +9575,7 @@ _wrap_svn_repos_get_logs(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_log_receiver;
+ arg7 = (svn_log_message_receiver_t) svn_swig_rb_log_receiver;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -9130,7 +9668,7 @@ _wrap_svn_repos_fs_get_mergeinfo(int argc, VALUE *argv, VALUE self) {
}
arg6 = RTEST(argv[4]);
{
- arg7 = svn_swig_rb_repos_authz_func;
+ arg7 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -9230,7 +9768,7 @@ _wrap_svn_repos_get_file_revs2(int argc, VALUE *argv, VALUE self) {
arg4 = (svn_revnum_t)(val4);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
@@ -9334,11 +9872,11 @@ _wrap_svn_repos_get_file_revs(int argc, VALUE *argv, VALUE self) {
}
arg4 = (svn_revnum_t)(val4);
{
- arg5 = svn_swig_rb_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_repos_file_rev_handler;
+ arg7 = (svn_repos_file_rev_handler_t) svn_swig_rb_repos_file_rev_handler;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -9766,6 +10304,132 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_fs_lock_many(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ apr_time_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_fs_lock_callback_t arg7 = (svn_fs_lock_callback_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res8 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg10);
+ _global_pool = arg10;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 8) || (argc > 10)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 8)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_fs_lock_many", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_hash_t *","svn_repos_fs_lock_many", 2, argv[1] ));
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ {
+ if (NIL_P(argv[2])) {
+ arg3 = NULL;
+ } else {
+ arg3 = StringValuePtr(argv[2]);
+ }
+ }
+ arg4 = RTEST(argv[3]);
+ {
+ arg5 = (apr_time_t)NUM2LL(argv[4]);
+ }
+ arg6 = RTEST(argv[5]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[6], (void**)(&arg7), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_lock_callback_t","svn_repos_fs_lock_many", 7, argv[6] ));
+ }
+ }
+ res8 = SWIG_ConvertPtr(argv[7],SWIG_as_voidptrptr(&arg8), 0, 0);
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "void *","svn_repos_fs_lock_many", 8, argv[7] ));
+ }
+ if (argc > 8) {
+
+ }
+ if (argc > 9) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_lock_many(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_fs_lock(int argc, VALUE *argv, VALUE self) {
svn_lock_t **arg1 = (svn_lock_t **) 0 ;
svn_repos_t *arg2 = (svn_repos_t *) 0 ;
@@ -9874,6 +10538,118 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_fs_unlock_many(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ apr_hash_t *arg2 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_fs_lock_callback_t arg4 = (svn_fs_lock_callback_t) 0 ;
+ void *arg5 = (void *) 0 ;
+ apr_pool_t *arg6 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res5 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg6);
+ _global_pool = arg6;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg7);
+ _global_pool = arg7;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 7)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_fs_unlock_many", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_hash_t *","svn_repos_fs_unlock_many", 2, argv[1] ));
+ }
+ arg2 = (apr_hash_t *)(argp2);
+ arg3 = RTEST(argv[2]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[3], (void**)(&arg4), SWIGTYPE_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_fs_lock_callback_t","svn_repos_fs_unlock_many", 4, argv[3] ));
+ }
+ }
+ res5 = SWIG_ConvertPtr(argv[4],SWIG_as_voidptrptr(&arg5), 0, 0);
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "void *","svn_repos_fs_unlock_many", 5, argv[4] ));
+ }
+ if (argc > 5) {
+
+ }
+ if (argc > 6) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_unlock_many(arg1,arg2,arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_fs_unlock(int argc, VALUE *argv, VALUE self) {
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -9991,7 +10767,7 @@ _wrap_svn_repos_fs_get_locks2(int argc, VALUE *argv, VALUE self) {
arg4 = svn_swig_rb_to_depth(argv[2]);
}
{
- arg5 = svn_swig_rb_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -10076,7 +10852,7 @@ _wrap_svn_repos_fs_get_locks(int argc, VALUE *argv, VALUE self) {
arg3 = StringValueCStr(argv[1]);
}
{
- arg4 = svn_swig_rb_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -10203,7 +10979,7 @@ _wrap_svn_repos_fs_change_rev_prop4(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[6]);
arg8 = RTEST(argv[7]);
{
- arg9 = svn_swig_rb_repos_authz_func;
+ arg9 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -10327,7 +11103,7 @@ _wrap_svn_repos_fs_change_rev_prop3(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_repos_authz_func;
+ arg8 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -10440,7 +11216,7 @@ _wrap_svn_repos_fs_change_rev_prop2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg6 = svn_swig_rb_repos_authz_func;
+ arg6 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -10643,7 +11419,7 @@ _wrap_svn_repos_fs_revision_prop(int argc, VALUE *argv, VALUE self) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_rb_repos_authz_func;
+ arg5 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -10735,7 +11511,7 @@ _wrap_svn_repos_fs_revision_proplist(int argc, VALUE *argv, VALUE self) {
}
arg3 = (svn_revnum_t)(val3);
{
- arg4 = svn_swig_rb_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -10871,6 +11647,123 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_fs_get_inherited_props(int argc, VALUE *argv, VALUE self) {
+ apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
+ svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg8 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ apr_array_header_t *temp1 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg7);
+ _global_pool = arg7;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg8);
+ _global_pool = arg8;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ if ((argc < 4) || (argc > 6)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
+ }
+ res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_repos_fs_get_inherited_props", 2, argv[0] ));
+ }
+ arg2 = (svn_fs_root_t *)(argp2);
+ {
+ arg3 = StringValueCStr(argv[1]);
+ }
+ res4 = SWIG_AsCharPtrAndSize(argv[2], &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_repos_fs_get_inherited_props", 4, argv[2] ));
+ }
+ arg4 = (char *)(buf4);
+ {
+ arg5 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
+ arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
+ }
+ if (argc > 4) {
+
+ }
+ if (argc > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_fs_get_inherited_props arg 1 (apr_array_header_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_fs_get_inherited_props is not implemented yet");
+
+ }
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_fs_change_txn_prop(int argc, VALUE *argv, VALUE self) {
svn_fs_txn_t *arg1 = (svn_fs_txn_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -11716,6 +12609,242 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_info_format(int argc, VALUE *argv, VALUE self) {
+ int *arg1 = (int *) 0 ;
+ svn_version_t **arg2 = (svn_version_t **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int temp1 ;
+ int res1 = SWIG_TMPOBJ ;
+ svn_version_t *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((argc < 1) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res3 = SWIG_ConvertPtr(argv[0], &argp3,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_info_format", 3, argv[0] ));
+ }
+ arg3 = (svn_repos_t *)(argp3);
+ if (argc > 1) {
+
+ }
+ if (argc > 2) {
+
+ }
+ {
+ if (!arg3) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_info_format(arg1,arg2,arg3,arg4,arg5);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (SWIG_IsTmpObj(res1)) {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_int((*arg1)));
+ } else {
+ int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_int, new_flags));
+ }
+ {
+ /* FIXME: Missing argout typemap: svn_repos_info_format arg 2 (svn_version_t **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_info_format is not implemented yet");
+
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_verify_fs3(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg2 ;
+ svn_revnum_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_repos_notify_func_t arg6 = (svn_repos_notify_func_t) 0 ;
+ void *arg7 = (void *) 0 ;
+ svn_repos_verify_callback_t arg8 = (svn_repos_verify_callback_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_cancel_func_t arg10 = (svn_cancel_func_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val2 ;
+ int ecode2 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ int res7 ;
+ int res9 ;
+ int res11 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg12);
+ _global_pool = arg12;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 11) || (argc > 12)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_verify_fs3", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ ecode2 = SWIG_AsVal_long(argv[1], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_verify_fs3", 2, argv[1] ));
+ }
+ arg2 = (svn_revnum_t)(val2);
+ ecode3 = SWIG_AsVal_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_verify_fs3", 3, argv[2] ));
+ }
+ arg3 = (svn_revnum_t)(val3);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[5], (void**)(&arg6), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_verify_fs3", 6, argv[5] ));
+ }
+ }
+ res7 = SWIG_ConvertPtr(argv[6],SWIG_as_voidptrptr(&arg7), 0, 0);
+ if (!SWIG_IsOK(res7)) {
+ SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "void *","svn_repos_verify_fs3", 7, argv[6] ));
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[7], (void**)(&arg8), SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_verify_callback_t","svn_repos_verify_fs3", 8, argv[7] ));
+ }
+ }
+ res9 = SWIG_ConvertPtr(argv[8],SWIG_as_voidptrptr(&arg9), 0, 0);
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "void *","svn_repos_verify_fs3", 9, argv[8] ));
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[9], (void**)(&arg10), SWIGTYPE_p_f_p_void__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_cancel_func_t","svn_repos_verify_fs3", 10, argv[9] ));
+ }
+ }
+ res11 = SWIG_ConvertPtr(argv[10],SWIG_as_voidptrptr(&arg11), 0, 0);
+ if (!SWIG_IsOK(res11)) {
+ SWIG_exception_fail(SWIG_ArgError(res11), Ruby_Format_TypeError( "", "void *","svn_repos_verify_fs3", 11, argv[10] ));
+ }
+ if (argc > 11) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_verify_fs3(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_verify_fs2(int argc, VALUE *argv, VALUE self) {
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
svn_revnum_t arg2 ;
@@ -11874,7 +13003,7 @@ _wrap_svn_repos_verify_fs(int argc, VALUE *argv, VALUE self) {
}
arg4 = (svn_revnum_t)(val4);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -11986,7 +13115,7 @@ _wrap_svn_repos_dump_fs3(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "void *","svn_repos_dump_fs3", 8, argv[7] ));
}
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -12091,7 +13220,7 @@ _wrap_svn_repos_dump_fs(int argc, VALUE *argv, VALUE self) {
arg5 = (svn_revnum_t)(val5);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -12140,6 +13269,138 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_load_fs5(int argc, VALUE *argv, VALUE self) {
+ svn_repos_t *arg1 = (svn_repos_t *) 0 ;
+ svn_stream_t *arg2 = (svn_stream_t *) 0 ;
+ svn_revnum_t arg3 ;
+ svn_revnum_t arg4 ;
+ enum svn_repos_load_uuid arg5 ;
+ char *arg6 = (char *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_boolean_t arg9 ;
+ svn_boolean_t arg10 ;
+ svn_repos_notify_func_t arg11 = (svn_repos_notify_func_t) 0 ;
+ void *arg12 = (void *) 0 ;
+ svn_cancel_func_t arg13 = (svn_cancel_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
+ int res12 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg15);
+ _global_pool = arg15;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 13) || (argc > 14)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 13)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_load_fs5", 1, argv[0] ));
+ }
+ arg1 = (svn_repos_t *)(argp1);
+ {
+ arg2 = svn_swig_rb_make_stream(argv[1]);
+ }
+ ecode3 = SWIG_AsVal_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_load_fs5", 3, argv[2] ));
+ }
+ arg3 = (svn_revnum_t)(val3);
+ ecode4 = SWIG_AsVal_long(argv[3], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_load_fs5", 4, argv[3] ));
+ }
+ arg4 = (svn_revnum_t)(val4);
+ ecode5 = SWIG_AsVal_int(argv[4], &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "enum svn_repos_load_uuid","svn_repos_load_fs5", 5, argv[4] ));
+ }
+ arg5 = (enum svn_repos_load_uuid)(val5);
+ {
+ if (NIL_P(argv[5])) {
+ arg6 = NULL;
+ } else {
+ arg6 = StringValuePtr(argv[5]);
+ }
+ }
+ arg7 = RTEST(argv[6]);
+ arg8 = RTEST(argv[7]);
+ arg9 = RTEST(argv[8]);
+ arg10 = RTEST(argv[9]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[10], (void**)(&arg11), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_load_fs5", 11, argv[10] ));
+ }
+ }
+ res12 = SWIG_ConvertPtr(argv[11],SWIG_as_voidptrptr(&arg12), 0, 0);
+ if (!SWIG_IsOK(res12)) {
+ SWIG_exception_fail(SWIG_ArgError(res12), Ruby_Format_TypeError( "", "void *","svn_repos_load_fs5", 12, argv[11] ));
+ }
+ {
+ arg13 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg14 = (void *)svn_swig_rb_make_baton(argv[12], _global_svn_swig_rb_pool);
+ }
+ if (argc > 13) {
+
+ }
+ {
+ if (!arg1) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_load_fs5(arg1,arg2,arg3,arg4,arg5,(char const *)arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg14);
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_load_fs4(int argc, VALUE *argv, VALUE self) {
svn_repos_t *arg1 = (svn_repos_t *) 0 ;
svn_stream_t *arg2 = (svn_stream_t *) 0 ;
@@ -12221,7 +13482,7 @@ _wrap_svn_repos_load_fs4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res11), Ruby_Format_TypeError( "", "void *","svn_repos_load_fs4", 11, argv[10] ));
}
{
- arg12 = svn_swig_rb_cancel_func;
+ arg12 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg13 = (void *)svn_swig_rb_make_baton(argv[11], _global_svn_swig_rb_pool);
}
if (argc > 12) {
@@ -12335,7 +13596,7 @@ _wrap_svn_repos_load_fs3(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "void *","svn_repos_load_fs3", 9, argv[8] ));
}
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -12442,7 +13703,7 @@ _wrap_svn_repos_load_fs2(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -12545,7 +13806,7 @@ _wrap_svn_repos_load_fs(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -13258,7 +14519,7 @@ _wrap_svn_repos_parse_dumpstream3(int argc, VALUE *argv, VALUE self) {
}
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -13302,6 +14563,139 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_repos_get_fs_build_parser5(int argc, VALUE *argv, VALUE self) {
+ svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
+ void **arg2 = (void **) 0 ;
+ svn_repos_t *arg3 = (svn_repos_t *) 0 ;
+ svn_revnum_t arg4 ;
+ svn_revnum_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ enum svn_repos_load_uuid arg8 ;
+ char *arg9 = (char *) 0 ;
+ svn_boolean_t arg10 ;
+ svn_boolean_t arg11 ;
+ svn_boolean_t arg12 ;
+ svn_repos_notify_func_t arg13 = (svn_repos_notify_func_t) 0 ;
+ void *arg14 = (void *) 0 ;
+ apr_pool_t *arg15 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ svn_repos_parse_fns3_t *temp1 ;
+ void *temp2 ;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ long val5 ;
+ int ecode5 = 0 ;
+ int val8 ;
+ int ecode8 = 0 ;
+ int res14 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg15);
+ _global_pool = arg15;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ arg1 = &temp1;
+ arg2 = &temp2;
+ if ((argc < 12) || (argc > 13)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 12)",argc); SWIG_fail;
+ }
+ res3 = SWIG_ConvertPtr(argv[0], &argp3,SWIGTYPE_p_svn_repos_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_get_fs_build_parser5", 3, argv[0] ));
+ }
+ arg3 = (svn_repos_t *)(argp3);
+ ecode4 = SWIG_AsVal_long(argv[1], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_get_fs_build_parser5", 4, argv[1] ));
+ }
+ arg4 = (svn_revnum_t)(val4);
+ ecode5 = SWIG_AsVal_long(argv[2], &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_get_fs_build_parser5", 5, argv[2] ));
+ }
+ arg5 = (svn_revnum_t)(val5);
+ arg6 = RTEST(argv[3]);
+ arg7 = RTEST(argv[4]);
+ ecode8 = SWIG_AsVal_int(argv[5], &val8);
+ if (!SWIG_IsOK(ecode8)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode8), Ruby_Format_TypeError( "", "enum svn_repos_load_uuid","svn_repos_get_fs_build_parser5", 8, argv[5] ));
+ }
+ arg8 = (enum svn_repos_load_uuid)(val8);
+ {
+ if (NIL_P(argv[6])) {
+ arg9 = NULL;
+ } else {
+ arg9 = StringValuePtr(argv[6]);
+ }
+ }
+ arg10 = RTEST(argv[7]);
+ arg11 = RTEST(argv[8]);
+ arg12 = RTEST(argv[9]);
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[10], (void**)(&arg13), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_get_fs_build_parser5", 13, argv[10] ));
+ }
+ }
+ res14 = SWIG_ConvertPtr(argv[11],SWIG_as_voidptrptr(&arg14), 0, 0);
+ if (!SWIG_IsOK(res14)) {
+ SWIG_exception_fail(SWIG_ArgError(res14), Ruby_Format_TypeError( "", "void *","svn_repos_get_fs_build_parser5", 14, argv[11] ));
+ }
+ if (argc > 12) {
+
+ }
+ {
+ if (!arg3) {
+ svn_swig_rb_raise_svn_repos_already_close();
+ }
+ }
+ {
+ result = (svn_error_t *)svn_repos_get_fs_build_parser5((struct svn_repos_parse_fns3_t const **)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,(char const *)arg9,arg10,arg11,arg12,arg13,arg14,arg15);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t, 0));
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0));
+ }
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_repos_get_fs_build_parser4(int argc, VALUE *argv, VALUE self) {
svn_repos_parse_fns3_t **arg1 = (svn_repos_parse_fns3_t **) 0 ;
void **arg2 = (void **) 0 ;
@@ -13403,13 +14797,7 @@ _wrap_svn_repos_get_fs_build_parser4(int argc, VALUE *argv, VALUE self) {
vresult = Qnil;
}
{
- /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser4 arg 1 (svn_repos_parse_fns3_t const **) */
-
-
-
-
- SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser4 is not implemented yet");
-
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns3_t, 0));
}
{
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0));
@@ -14515,7 +15903,7 @@ _wrap_svn_repos_parse_dumpstream2(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_repos_parse_dumpstream2", 3, argv[2] ));
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -14595,7 +15983,7 @@ _wrap_svn_repos_parse_dumpstream(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "void *","svn_repos_parse_dumpstream", 3, argv[2] ));
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -14724,7 +16112,13 @@ _wrap_svn_repos_get_fs_build_parser3(int argc, VALUE *argv, VALUE self) {
vresult = Qnil;
}
{
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t, 0));
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser3 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser3 is not implemented yet");
+
}
{
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0));
@@ -14824,7 +16218,13 @@ _wrap_svn_repos_get_fs_build_parser2(int argc, VALUE *argv, VALUE self) {
vresult = Qnil;
}
{
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg1, SWIGTYPE_p_svn_repos_parse_fns2_t, 0));
+ /* FIXME: Missing argout typemap: svn_repos_get_fs_build_parser2 arg 1 (svn_repos_parse_fns2_t const **) */
+
+
+
+
+ SWIG_exception(SWIG_ValueError, "svn_repos_get_fs_build_parser2 is not implemented yet");
+
}
{
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg2, SWIGTYPE_p_void, 0));
@@ -15305,7 +16705,7 @@ _wrap_svn_repos_check_revision_access(int argc, VALUE *argv, VALUE self) {
}
arg3 = (svn_revnum_t)(val3);
{
- arg4 = svn_swig_rb_repos_authz_func;
+ arg4 = (svn_repos_authz_func_t) svn_swig_rb_repos_authz_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -15351,172 +16751,6 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_repos_fs_get_inherited_props(int argc, VALUE *argv, VALUE self) {
- apr_array_header_t **arg1 = (apr_array_header_t **) 0 ;
- svn_fs_root_t *arg2 = (svn_fs_root_t *) 0 ;
- char *arg3 = (char *) 0 ;
- char *arg4 = (char *) 0 ;
- svn_repos_authz_func_t arg5 = (svn_repos_authz_func_t) 0 ;
- void *arg6 = (void *) 0 ;
- apr_pool_t *arg7 = (apr_pool_t *) 0 ;
- apr_pool_t *arg8 = (apr_pool_t *) 0 ;
- VALUE _global_svn_swig_rb_pool ;
- apr_pool_t *_global_pool ;
- apr_array_header_t *temp1 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- int res4 ;
- char *buf4 = 0 ;
- int alloc4 = 0 ;
- svn_error_t *result = 0 ;
- VALUE vresult = Qnil;
-
- {
- svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg7);
- _global_pool = arg7;
- svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
- }
- {
- svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg8);
- _global_pool = arg8;
- svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
- }
- arg1 = &temp1;
- if ((argc < 4) || (argc > 6)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
- }
- res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_fs_root_t, 0 | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_fs_root_t *","svn_repos_fs_get_inherited_props", 2, argv[0] ));
- }
- arg2 = (svn_fs_root_t *)(argp2);
- {
- arg3 = StringValueCStr(argv[1]);
- }
- res4 = SWIG_AsCharPtrAndSize(argv[2], &buf4, NULL, &alloc4);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","svn_repos_fs_get_inherited_props", 4, argv[2] ));
- }
- arg4 = (char *)(buf4);
- {
- arg5 = svn_swig_rb_repos_authz_func;
- arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
- }
- if (argc > 4) {
-
- }
- if (argc > 5) {
-
- }
- {
- result = (svn_error_t *)svn_repos_fs_get_inherited_props(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7,arg8);
-
-
-
- }
- {
- if (result) {
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_handle_svn_error(result);
- }
- vresult = Qnil;
- }
- {
- /* FIXME: Missing argout typemap: svn_repos_fs_get_inherited_props arg 1 (apr_array_header_t **) */
-
-
-
-
- SWIG_exception(SWIG_ValueError, "svn_repos_fs_get_inherited_props is not implemented yet");
-
- }
- if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
- {
- VALUE target;
- target = _global_vresult_address == &vresult ? self : vresult;
- if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- }
- {
- VALUE target;
- target = _global_vresult_address == &vresult ? self : vresult;
- if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- }
- return vresult;
-fail:
- if (alloc4 == SWIG_NEWOBJ) free((char*)buf4);
- {
- VALUE target;
- target = _global_vresult_address == &vresult ? self : vresult;
- if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- }
- {
- VALUE target;
- target = _global_vresult_address == &vresult ? self : vresult;
- if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- }
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_repos_remember_client_capabilities(int argc, VALUE *argv, VALUE self) {
- svn_repos_t *arg1 = (svn_repos_t *) 0 ;
- apr_array_header_t *arg2 = (apr_array_header_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
- svn_error_t *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 2) || (argc > 2)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_repos_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_repos_t *","svn_repos_remember_client_capabilities", 1, argv[0] ));
- }
- arg1 = (svn_repos_t *)(argp1);
- res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "apr_array_header_t const *","svn_repos_remember_client_capabilities", 2, argv[1] ));
- }
- arg2 = (apr_array_header_t *)(argp2);
- {
- if (!arg1) {
- svn_swig_rb_raise_svn_repos_already_close();
- }
- }
- {
- result = (svn_error_t *)svn_repos_remember_client_capabilities(arg1,(apr_array_header_t const *)arg2);
-
-
-
- }
- {
- if (result) {
- svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
- svn_swig_rb_handle_svn_error(result);
- }
- vresult = Qnil;
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
_wrap_svn_repos_parse_fns3_invoke_magic_header_record(int argc, VALUE *argv, VALUE self) {
svn_repos_parse_fns3_t *arg1 = (svn_repos_parse_fns3_t *) 0 ;
int arg2 ;
@@ -17060,73 +18294,103 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_repos_invoke_file_rev_handler(int argc, VALUE *argv, VALUE self) {
- svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
+_wrap_svn_repos_invoke_notify_func(int argc, VALUE *argv, VALUE self) {
+ svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
- apr_hash_t *arg5 = (apr_hash_t *) 0 ;
- svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
- void **arg7 = (void **) 0 ;
- apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
- apr_pool_t *arg9 = (apr_pool_t *) 0 ;
+ svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
+ apr_pool_t *arg4 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
apr_pool_t *_global_pool ;
int res2 ;
- long val4 ;
- int ecode4 = 0 ;
- void *argp5 = 0 ;
- int res5 = 0 ;
- svn_txdelta_window_handler_t temp6 ;
- void *temp7 ;
- void *argp8 = 0 ;
- int res8 = 0 ;
- svn_error_t *result = 0 ;
- VALUE vresult = Qnil;
+ void *argp3 = 0 ;
+ int res3 = 0 ;
{
- svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
- _global_pool = arg9;
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
+ _global_pool = arg4;
svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
}
- arg6 = &temp6;
- arg7 = &temp7;
- if ((argc < 6) || (argc > 7)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail;
+ if ((argc < 3) || (argc > 4)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
}
{
- int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_file_rev_handler_t","svn_repos_invoke_file_rev_handler", 1, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_invoke_notify_func", 1, argv[0] ));
}
}
res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_file_rev_handler", 2, argv[1] ));
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_notify_func", 2, argv[1] ));
+ }
+ res3 = SWIG_ConvertPtr(argv[2], &argp3,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_repos_notify_t const *","svn_repos_invoke_notify_func", 3, argv[2] ));
+ }
+ arg3 = (svn_repos_notify_t *)(argp3);
+ if (argc > 3) {
+
}
{
- arg3 = StringValueCStr(argv[2]);
+ svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+
+
+
}
- ecode4 = SWIG_AsVal_long(argv[3], &val4);
- if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_invoke_file_rev_handler", 4, argv[3] ));
- }
- arg4 = (svn_revnum_t)(val4);
- res5 = SWIG_ConvertPtr(argv[4], &argp5,SWIGTYPE_p_apr_hash_t, 0 | 0 );
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "apr_hash_t *","svn_repos_invoke_file_rev_handler", 5, argv[4] ));
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
}
- arg5 = (apr_hash_t *)(argp5);
- res8 = SWIG_ConvertPtr(argv[5], &argp8,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
- if (!SWIG_IsOK(res8)) {
- SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "apr_array_header_t *","svn_repos_invoke_file_rev_handler", 8, argv[5] ));
+ return Qnil;
+fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
}
- arg8 = (apr_array_header_t *)(argp8);
- if (argc > 6) {
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_repos_invoke_freeze_func(int argc, VALUE *argv, VALUE self) {
+ svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+ void *arg2 = (void *) 0 ;
+ apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ int res2 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
+ _global_pool = arg3;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 2) || (argc > 3)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ }
+ {
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t);
+ if (!SWIG_IsOK(res)) {
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_freeze_func_t","svn_repos_invoke_freeze_func", 1, argv[0] ));
+ }
+ }
+ res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_freeze_func", 2, argv[1] ));
+ }
+ if (argc > 2) {
}
{
- result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
@@ -17140,12 +18404,6 @@ _wrap_svn_repos_invoke_file_rev_handler(int argc, VALUE *argv, VALUE self) {
vresult = Qnil;
}
{
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg6, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0));
- }
- {
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg7, SWIGTYPE_p_void, 0));
- }
- {
VALUE target;
target = _global_vresult_address == &vresult ? self : vresult;
if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
@@ -17166,57 +18424,71 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_repos_invoke_notify_func(int argc, VALUE *argv, VALUE self) {
- svn_repos_notify_func_t arg1 = (svn_repos_notify_func_t) 0 ;
+_wrap_svn_repos_invoke_history_func(int argc, VALUE *argv, VALUE self) {
+ svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
void *arg2 = (void *) 0 ;
- svn_repos_notify_t *arg3 = (svn_repos_notify_t *) 0 ;
- apr_pool_t *arg4 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_pool_t *arg5 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
apr_pool_t *_global_pool ;
int res2 ;
- void *argp3 = 0 ;
- int res3 = 0 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
{
- svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg4);
- _global_pool = arg4;
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg5);
+ _global_pool = arg5;
svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
}
- if ((argc < 3) || (argc > 4)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+ if ((argc < 4) || (argc > 5)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
}
{
- int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void);
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_notify_func_t","svn_repos_invoke_notify_func", 1, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_history_func_t","svn_repos_invoke_history_func", 1, argv[0] ));
}
}
res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_notify_func", 2, argv[1] ));
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_history_func", 2, argv[1] ));
}
- res3 = SWIG_ConvertPtr(argv[2], &argp3,SWIGTYPE_p_svn_repos_notify_t, 0 | 0 );
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "svn_repos_notify_t const *","svn_repos_invoke_notify_func", 3, argv[2] ));
+ {
+ arg3 = StringValueCStr(argv[2]);
}
- arg3 = (svn_repos_notify_t *)(argp3);
- if (argc > 3) {
+ ecode4 = SWIG_AsVal_long(argv[3], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_invoke_history_func", 4, argv[3] ));
+ }
+ arg4 = (svn_revnum_t)(val4);
+ if (argc > 4) {
}
{
- svn_repos_invoke_notify_func(arg1,arg2,(struct svn_repos_notify_t const *)arg3,arg4);
+ result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
}
{
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
VALUE target;
target = _global_vresult_address == &vresult ? self : vresult;
if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
}
- return Qnil;
+ return vresult;
fail:
{
VALUE target;
@@ -17230,39 +18502,73 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_repos_invoke_freeze_func(int argc, VALUE *argv, VALUE self) {
- svn_repos_freeze_func_t arg1 = (svn_repos_freeze_func_t) 0 ;
+_wrap_svn_repos_invoke_file_rev_handler(int argc, VALUE *argv, VALUE self) {
+ svn_repos_file_rev_handler_t arg1 = (svn_repos_file_rev_handler_t) 0 ;
void *arg2 = (void *) 0 ;
- apr_pool_t *arg3 = (apr_pool_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_revnum_t arg4 ;
+ apr_hash_t *arg5 = (apr_hash_t *) 0 ;
+ svn_txdelta_window_handler_t *arg6 = (svn_txdelta_window_handler_t *) 0 ;
+ void **arg7 = (void **) 0 ;
+ apr_array_header_t *arg8 = (apr_array_header_t *) 0 ;
+ apr_pool_t *arg9 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
apr_pool_t *_global_pool ;
int res2 ;
+ long val4 ;
+ int ecode4 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ svn_txdelta_window_handler_t temp6 ;
+ void *temp7 ;
+ void *argp8 = 0 ;
+ int res8 = 0 ;
svn_error_t *result = 0 ;
VALUE vresult = Qnil;
{
- svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg3);
- _global_pool = arg3;
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg9);
+ _global_pool = arg9;
svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
}
- if ((argc < 2) || (argc > 3)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+ arg6 = &temp6;
+ arg7 = &temp7;
+ if ((argc < 6) || (argc > 7)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail;
}
{
- int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_freeze_func_t","svn_repos_invoke_freeze_func", 1, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_file_rev_handler_t","svn_repos_invoke_file_rev_handler", 1, argv[0] ));
}
}
res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_freeze_func", 2, argv[1] ));
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_file_rev_handler", 2, argv[1] ));
}
- if (argc > 2) {
+ {
+ arg3 = StringValueCStr(argv[2]);
+ }
+ ecode4 = SWIG_AsVal_long(argv[3], &val4);
+ if (!SWIG_IsOK(ecode4)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_invoke_file_rev_handler", 4, argv[3] ));
+ }
+ arg4 = (svn_revnum_t)(val4);
+ res5 = SWIG_ConvertPtr(argv[4], &argp5,SWIGTYPE_p_apr_hash_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "apr_hash_t *","svn_repos_invoke_file_rev_handler", 5, argv[4] ));
+ }
+ arg5 = (apr_hash_t *)(argp5);
+ res8 = SWIG_ConvertPtr(argv[5], &argp8,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res8)) {
+ SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "apr_array_header_t *","svn_repos_invoke_file_rev_handler", 8, argv[5] ));
+ }
+ arg8 = (apr_array_header_t *)(argp8);
+ if (argc > 6) {
}
{
- result = (svn_error_t *)svn_repos_invoke_freeze_func(arg1,arg2,arg3);
+ result = (svn_error_t *)svn_repos_invoke_file_rev_handler(arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9);
@@ -17276,6 +18582,12 @@ _wrap_svn_repos_invoke_freeze_func(int argc, VALUE *argv, VALUE self) {
vresult = Qnil;
}
{
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg6, SWIGTYPE_p_f_p_svn_txdelta_window_t_p_void__p_svn_error_t, 0));
+ }
+ {
+ vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj(*arg7, SWIGTYPE_p_void, 0));
+ }
+ {
VALUE target;
target = _global_vresult_address == &vresult ? self : vresult;
if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
@@ -17296,17 +18608,19 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_repos_invoke_history_func(int argc, VALUE *argv, VALUE self) {
- svn_repos_history_func_t arg1 = (svn_repos_history_func_t) 0 ;
+_wrap_svn_repos_invoke_verify_callback(int argc, VALUE *argv, VALUE self) {
+ svn_repos_verify_callback_t arg1 = (svn_repos_verify_callback_t) 0 ;
void *arg2 = (void *) 0 ;
- char *arg3 = (char *) 0 ;
- svn_revnum_t arg4 ;
+ svn_revnum_t arg3 ;
+ svn_error_t *arg4 = (svn_error_t *) 0 ;
apr_pool_t *arg5 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
apr_pool_t *_global_pool ;
int res2 ;
- long val4 ;
- int ecode4 = 0 ;
+ long val3 ;
+ int ecode3 = 0 ;
+ void *argp4 = 0 ;
+ int res4 = 0 ;
svn_error_t *result = 0 ;
VALUE vresult = Qnil;
@@ -17319,28 +18633,30 @@ _wrap_svn_repos_invoke_history_func(int argc, VALUE *argv, VALUE self) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
}
{
- int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t);
+ int res = SWIG_ConvertFunctionPtr(argv[0], (void**)(&arg1), SWIGTYPE_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t);
if (!SWIG_IsOK(res)) {
- SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_history_func_t","svn_repos_invoke_history_func", 1, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res), Ruby_Format_TypeError( "", "svn_repos_verify_callback_t","svn_repos_invoke_verify_callback", 1, argv[0] ));
}
}
res2 = SWIG_ConvertPtr(argv[1],SWIG_as_voidptrptr(&arg2), 0, 0);
if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_history_func", 2, argv[1] ));
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "void *","svn_repos_invoke_verify_callback", 2, argv[1] ));
}
- {
- arg3 = StringValueCStr(argv[2]);
- }
- ecode4 = SWIG_AsVal_long(argv[3], &val4);
- if (!SWIG_IsOK(ecode4)) {
- SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_invoke_history_func", 4, argv[3] ));
+ ecode3 = SWIG_AsVal_long(argv[2], &val3);
+ if (!SWIG_IsOK(ecode3)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "svn_revnum_t","svn_repos_invoke_verify_callback", 3, argv[2] ));
}
- arg4 = (svn_revnum_t)(val4);
+ arg3 = (svn_revnum_t)(val3);
+ res4 = SWIG_ConvertPtr(argv[3], &argp4,SWIGTYPE_p_svn_error_t, 0 | 0 );
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "svn_error_t *","svn_repos_invoke_verify_callback", 4, argv[3] ));
+ }
+ arg4 = (svn_error_t *)(argp4);
if (argc > 4) {
}
{
- result = (svn_error_t *)svn_repos_invoke_history_func(arg1,arg2,(char const *)arg3,arg4,arg5);
+ result = (svn_error_t *)svn_repos_invoke_verify_callback(arg1,arg2,arg3,arg4,arg5);
@@ -17397,12 +18713,14 @@ static swig_type_info _swigt__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_type_info _swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_hash_t *,svn_revnum_t,char const *,char const *,char const *,apr_pool_t *)|svn_log_message_receiver_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,apr_pool_t *)|svn_repos_freeze_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char__p_svn_error_t = {"_p_f_p_void_p_q_const__char__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *)|svn_error_t *(*)(void *,char const *)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_lock_t const *,svn_error_t *,apr_pool_t *)|svn_fs_lock_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_string_t const *)|svn_error_t *(*)(void *,char const *,svn_string_t const *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_repos_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_hash_t *,svn_boolean_t,svn_txdelta_window_handler_t *,void **,apr_array_header_t *,apr_pool_t *)|svn_file_rev_handler_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,char const *,svn_revnum_t,apr_pool_t *)|svn_repos_history_func_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void = {"_p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void", "svn_repos_notify_func_t|void (*)(void *,struct svn_repos_notify_t const *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(void *,svn_log_entry_t *,apr_pool_t *)|svn_log_entry_receiver_t", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t = {"_p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t", "svn_repos_verify_callback_t|struct svn_error_t *(*)(void *,svn_revnum_t,svn_error_t *,apr_pool_t *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t = {"_p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t", "struct svn_error_t *(*)(svn_repos_authz_access_t,svn_boolean_t *,svn_fs_root_t *,char const *,void *,apr_pool_t *)|svn_repos_authz_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t = {"_p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t", "struct svn_error_t *(*)(svn_revnum_t,char const *,char const *,void *)|svn_commit_callback_t", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "int *|svn_boolean_t *|apr_status_t *", 0, 0, (void*)0, 0};
@@ -17422,6 +18740,7 @@ static swig_type_info _swigt__p_p_svn_repos_parse_fns_t = {"_p_p_svn_repos_parse
static swig_type_info _swigt__p_p_svn_repos_t = {"_p_p_svn_repos_t", "struct svn_repos_t **|svn_repos_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_stream_t = {"_p_p_svn_stream_t", "struct svn_stream_t **|svn_stream_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_svn_string_t = {"_p_p_svn_string_t", "struct svn_string_t **|svn_string_t **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_svn_version_t = {"_p_p_svn_version_t", "struct svn_version_t **|svn_version_t **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_baton_t = {"_p_svn_auth_baton_t", "struct svn_auth_baton_t *|svn_auth_baton_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_auth_cred_simple_t = {"_p_svn_auth_cred_simple_t", "struct svn_auth_cred_simple_t *|svn_auth_cred_simple_t *", 0, 0, (void*)0, 0};
@@ -17456,8 +18775,13 @@ static swig_type_info _swigt__p_svn_errno_t = {"_p_svn_errno_t", "enum svn_errno
static swig_type_info _swigt__p_svn_error_t = {"_p_svn_error_t", "struct svn_error_t *|svn_error_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_access_t = {"_p_svn_fs_access_t", "struct svn_fs_access_t *|svn_fs_access_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_dirent_t = {"_p_svn_fs_dirent_t", "struct svn_fs_dirent_t *|svn_fs_dirent_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsfs_info_t = {"_p_svn_fs_fsfs_info_t", "struct svn_fs_fsfs_info_t *|svn_fs_fsfs_info_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_fsx_info_t = {"_p_svn_fs_fsx_info_t", "struct svn_fs_fsx_info_t *|svn_fs_fsx_info_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_history_t = {"_p_svn_fs_history_t", "struct svn_fs_history_t *|svn_fs_history_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_id_t = {"_p_svn_fs_id_t", "struct svn_fs_id_t *|svn_fs_id_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_info_placeholder_t = {"_p_svn_fs_info_placeholder_t", "struct svn_fs_info_placeholder_t *|svn_fs_info_placeholder_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_lock_target_t = {"_p_svn_fs_lock_target_t", "struct svn_fs_lock_target_t *|svn_fs_lock_target_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_node_relation_t = {"_p_svn_fs_node_relation_t", "enum svn_fs_node_relation_t *|svn_fs_node_relation_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_pack_notify_action_t = {"_p_svn_fs_pack_notify_action_t", "enum svn_fs_pack_notify_action_t *|svn_fs_pack_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change2_t = {"_p_svn_fs_path_change2_t", "struct svn_fs_path_change2_t *|svn_fs_path_change2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_path_change_kind_t = {"_p_svn_fs_path_change_kind_t", "enum svn_fs_path_change_kind_t *|svn_fs_path_change_kind_t *", 0, 0, (void*)0, 0};
@@ -17465,6 +18789,7 @@ static swig_type_info _swigt__p_svn_fs_path_change_t = {"_p_svn_fs_path_change_t
static swig_type_info _swigt__p_svn_fs_root_t = {"_p_svn_fs_root_t", "struct svn_fs_root_t *|svn_fs_root_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_t = {"_p_svn_fs_t", "struct svn_fs_t *|svn_fs_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_fs_txn_t = {"_p_svn_fs_txn_t", "struct svn_fs_txn_t *|svn_fs_txn_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_svn_fs_upgrade_notify_action_t = {"_p_svn_fs_upgrade_notify_action_t", "enum svn_fs_upgrade_notify_action_t *|svn_fs_upgrade_notify_action_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent2_t = {"_p_svn_io_dirent2_t", "struct svn_io_dirent2_t *|svn_io_dirent2_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_dirent_t = {"_p_svn_io_dirent_t", "struct svn_io_dirent_t *|svn_io_dirent_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_svn_io_file_del_t = {"_p_svn_io_file_del_t", "enum svn_io_file_del_t *|svn_io_file_del_t *", 0, 0, (void*)0, 0};
@@ -17534,12 +18859,14 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t,
+ &_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ &_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
&_swigt__p_int,
@@ -17559,6 +18886,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_p_svn_repos_t,
&_swigt__p_p_svn_stream_t,
&_swigt__p_p_svn_string_t,
+ &_swigt__p_p_svn_version_t,
&_swigt__p_p_void,
&_swigt__p_svn_auth_baton_t,
&_swigt__p_svn_auth_cred_simple_t,
@@ -17593,8 +18921,13 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_error_t,
&_swigt__p_svn_fs_access_t,
&_swigt__p_svn_fs_dirent_t,
+ &_swigt__p_svn_fs_fsfs_info_t,
+ &_swigt__p_svn_fs_fsx_info_t,
&_swigt__p_svn_fs_history_t,
&_swigt__p_svn_fs_id_t,
+ &_swigt__p_svn_fs_info_placeholder_t,
+ &_swigt__p_svn_fs_lock_target_t,
+ &_swigt__p_svn_fs_node_relation_t,
&_swigt__p_svn_fs_pack_notify_action_t,
&_swigt__p_svn_fs_path_change2_t,
&_swigt__p_svn_fs_path_change_kind_t,
@@ -17602,6 +18935,7 @@ static swig_type_info *swig_type_initial[] = {
&_swigt__p_svn_fs_root_t,
&_swigt__p_svn_fs_t,
&_swigt__p_svn_fs_txn_t,
+ &_swigt__p_svn_fs_upgrade_notify_action_t,
&_swigt__p_svn_io_dirent2_t,
&_swigt__p_svn_io_dirent_t,
&_swigt__p_svn_io_file_del_t,
@@ -17671,12 +19005,14 @@ static swig_cast_info _swigc__p_f_p_void_apr_int64_t_svn_fs_pack_notify_action_t
static swig_cast_info _swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void[] = { {&_swigt__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t[] = { {&_swigt__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t[] = { {&_swigt__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
@@ -17696,6 +19032,7 @@ static swig_cast_info _swigc__p_p_svn_repos_parse_fns_t[] = { {&_swigt__p_p_svn
static swig_cast_info _swigc__p_p_svn_repos_t[] = { {&_swigt__p_p_svn_repos_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_stream_t[] = { {&_swigt__p_p_svn_stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_svn_string_t[] = { {&_swigt__p_p_svn_string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_svn_version_t[] = { {&_swigt__p_p_svn_version_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_baton_t[] = { {&_swigt__p_svn_auth_baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_auth_cred_simple_t[] = { {&_swigt__p_svn_auth_cred_simple_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17730,8 +19067,13 @@ static swig_cast_info _swigc__p_svn_errno_t[] = { {&_swigt__p_svn_errno_t, 0, 0
static swig_cast_info _swigc__p_svn_error_t[] = { {&_swigt__p_svn_error_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_access_t[] = { {&_swigt__p_svn_fs_access_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_dirent_t[] = { {&_swigt__p_svn_fs_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsfs_info_t[] = { {&_swigt__p_svn_fs_fsfs_info_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_fsx_info_t[] = { {&_swigt__p_svn_fs_fsx_info_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_history_t[] = { {&_swigt__p_svn_fs_history_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_id_t[] = { {&_swigt__p_svn_fs_id_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_info_placeholder_t[] = { {&_swigt__p_svn_fs_info_placeholder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_lock_target_t[] = { {&_swigt__p_svn_fs_lock_target_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_node_relation_t[] = { {&_swigt__p_svn_fs_node_relation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_pack_notify_action_t[] = { {&_swigt__p_svn_fs_pack_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change2_t[] = { {&_swigt__p_svn_fs_path_change2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_path_change_kind_t[] = { {&_swigt__p_svn_fs_path_change_kind_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17739,6 +19081,7 @@ static swig_cast_info _swigc__p_svn_fs_path_change_t[] = { {&_swigt__p_svn_fs_p
static swig_cast_info _swigc__p_svn_fs_root_t[] = { {&_swigt__p_svn_fs_root_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_t[] = { {&_swigt__p_svn_fs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_fs_txn_t[] = { {&_swigt__p_svn_fs_txn_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_svn_fs_upgrade_notify_action_t[] = { {&_swigt__p_svn_fs_upgrade_notify_action_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent2_t[] = { {&_swigt__p_svn_io_dirent2_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_dirent_t[] = { {&_swigt__p_svn_io_dirent_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_svn_io_file_del_t[] = { {&_swigt__p_svn_io_file_del_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17808,12 +19151,14 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_f_p_void_p_apr_hash_t_svn_revnum_t_p_q_const__char_p_q_const__char_p_q_const__char_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char__p_svn_error_t,
+ _swigc__p_f_p_void_p_q_const__char_p_q_const__svn_lock_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_p_q_const__svn_string_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_hash_t_svn_boolean_t_p_svn_txdelta_window_handler_t_p_p_void_p_apr_array_header_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__char_svn_revnum_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_p_void_p_q_const__struct_svn_repos_notify_t_p_apr_pool_t__void,
_swigc__p_f_p_void_p_svn_log_entry_t_p_apr_pool_t__p_svn_error_t,
+ _swigc__p_f_p_void_svn_revnum_t_p_svn_error_t_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_repos_authz_access_t_p_svn_boolean_t_p_svn_fs_root_t_p_q_const__char_p_void_p_apr_pool_t__p_svn_error_t,
_swigc__p_f_svn_revnum_t_p_q_const__char_p_q_const__char_p_void__p_svn_error_t,
_swigc__p_int,
@@ -17833,6 +19178,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_p_svn_repos_t,
_swigc__p_p_svn_stream_t,
_swigc__p_p_svn_string_t,
+ _swigc__p_p_svn_version_t,
_swigc__p_p_void,
_swigc__p_svn_auth_baton_t,
_swigc__p_svn_auth_cred_simple_t,
@@ -17867,8 +19213,13 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_error_t,
_swigc__p_svn_fs_access_t,
_swigc__p_svn_fs_dirent_t,
+ _swigc__p_svn_fs_fsfs_info_t,
+ _swigc__p_svn_fs_fsx_info_t,
_swigc__p_svn_fs_history_t,
_swigc__p_svn_fs_id_t,
+ _swigc__p_svn_fs_info_placeholder_t,
+ _swigc__p_svn_fs_lock_target_t,
+ _swigc__p_svn_fs_node_relation_t,
_swigc__p_svn_fs_pack_notify_action_t,
_swigc__p_svn_fs_path_change2_t,
_swigc__p_svn_fs_path_change_kind_t,
@@ -17876,6 +19227,7 @@ static swig_cast_info *swig_cast_initial[] = {
_swigc__p_svn_fs_root_t,
_swigc__p_svn_fs_t,
_swigc__p_svn_fs_txn_t,
+ _swigc__p_svn_fs_upgrade_notify_action_t,
_swigc__p_svn_io_dirent2_t,
_swigc__p_svn_io_dirent_t,
_swigc__p_svn_io_file_del_t,
@@ -17929,18 +19281,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -17950,17 +19302,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -18023,7 +19375,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -18037,7 +19389,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -18064,7 +19416,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -18192,9 +19544,6 @@ SWIGEXPORT void Init_repos(void) {
rb_define_const(mRepos, "Svn_node_action_add", SWIG_From_int((int)(svn_node_action_add)));
rb_define_const(mRepos, "Svn_node_action_delete", SWIG_From_int((int)(svn_node_action_delete)));
rb_define_const(mRepos, "Svn_node_action_replace", SWIG_From_int((int)(svn_node_action_replace)));
- rb_define_const(mRepos, "Svn_repos_load_uuid_default", SWIG_From_int((int)(svn_repos_load_uuid_default)));
- rb_define_const(mRepos, "Svn_repos_load_uuid_ignore", SWIG_From_int((int)(svn_repos_load_uuid_ignore)));
- rb_define_const(mRepos, "Svn_repos_load_uuid_force", SWIG_From_int((int)(svn_repos_load_uuid_force)));
rb_define_const(mRepos, "Svn_authz_none", SWIG_From_int((int)(svn_authz_none)));
rb_define_const(mRepos, "Svn_authz_read", SWIG_From_int((int)(svn_authz_read)));
rb_define_const(mRepos, "Svn_authz_write", SWIG_From_int((int)(svn_authz_write)));
@@ -18219,9 +19568,16 @@ SWIGEXPORT void Init_repos(void) {
rb_define_const(mRepos, "Svn_repos_notify_upgrade_start", SWIG_From_int((int)(svn_repos_notify_upgrade_start)));
rb_define_const(mRepos, "Svn_repos_notify_load_skipped_rev", SWIG_From_int((int)(svn_repos_notify_load_skipped_rev)));
rb_define_const(mRepos, "Svn_repos_notify_verify_rev_structure", SWIG_From_int((int)(svn_repos_notify_verify_rev_structure)));
+ rb_define_const(mRepos, "Svn_repos_notify_pack_revprops", SWIG_From_int((int)(svn_repos_notify_pack_revprops)));
+ rb_define_const(mRepos, "Svn_repos_notify_cleanup_revprops", SWIG_From_int((int)(svn_repos_notify_cleanup_revprops)));
+ rb_define_const(mRepos, "Svn_repos_notify_format_bumped", SWIG_From_int((int)(svn_repos_notify_format_bumped)));
+ rb_define_const(mRepos, "Svn_repos_notify_hotcopy_rev_range", SWIG_From_int((int)(svn_repos_notify_hotcopy_rev_range)));
rb_define_const(mRepos, "Svn_repos_notify_warning_found_old_reference", SWIG_From_int((int)(svn_repos_notify_warning_found_old_reference)));
rb_define_const(mRepos, "Svn_repos_notify_warning_found_old_mergeinfo", SWIG_From_int((int)(svn_repos_notify_warning_found_old_mergeinfo)));
rb_define_const(mRepos, "Svn_repos_notify_warning_invalid_fspath", SWIG_From_int((int)(svn_repos_notify_warning_invalid_fspath)));
+ rb_define_const(mRepos, "Svn_repos_notify_warning_name_collision", SWIG_From_int((int)(svn_repos_notify_warning_name_collision)));
+ rb_define_const(mRepos, "Svn_repos_notify_warning_mergeinfo_collision", SWIG_From_int((int)(svn_repos_notify_warning_mergeinfo_collision)));
+ rb_define_const(mRepos, "Svn_repos_notify_warning_invalid_mergeinfo", SWIG_From_int((int)(svn_repos_notify_warning_invalid_mergeinfo)));
SwigClassSvn_repos_notify_t.klass = rb_define_class_under(mRepos, "Svn_repos_notify_t", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p_svn_repos_notify_t, (void *) &SwigClassSvn_repos_notify_t);
@@ -18244,10 +19600,15 @@ SWIGEXPORT void Init_repos(void) {
rb_define_method(SwigClassSvn_repos_notify_t.klass, "node_action", _wrap_svn_repos_notify_t_node_action_get, -1);
rb_define_method(SwigClassSvn_repos_notify_t.klass, "path=", _wrap_svn_repos_notify_t_path_set, -1);
rb_define_method(SwigClassSvn_repos_notify_t.klass, "path", _wrap_svn_repos_notify_t_path_get, -1);
+ rb_define_method(SwigClassSvn_repos_notify_t.klass, "start_revision=", _wrap_svn_repos_notify_t_start_revision_set, -1);
+ rb_define_method(SwigClassSvn_repos_notify_t.klass, "start_revision", _wrap_svn_repos_notify_t_start_revision_get, -1);
+ rb_define_method(SwigClassSvn_repos_notify_t.klass, "end_revision=", _wrap_svn_repos_notify_t_end_revision_set, -1);
+ rb_define_method(SwigClassSvn_repos_notify_t.klass, "end_revision", _wrap_svn_repos_notify_t_end_revision_get, -1);
SwigClassSvn_repos_notify_t.mark = 0;
SwigClassSvn_repos_notify_t.trackObjects = 0;
rb_define_module_function(mRepos, "svn_repos_notify_create", _wrap_svn_repos_notify_create, -1);
rb_define_module_function(mRepos, "svn_repos_find_root_path", _wrap_svn_repos_find_root_path, -1);
+ rb_define_module_function(mRepos, "svn_repos_open3", _wrap_svn_repos_open3, -1);
rb_define_module_function(mRepos, "svn_repos_open2", _wrap_svn_repos_open2, -1);
rb_define_module_function(mRepos, "svn_repos_open", _wrap_svn_repos_open, -1);
rb_define_module_function(mRepos, "svn_repos_create", _wrap_svn_repos_create, -1);
@@ -18255,7 +19616,11 @@ SWIGEXPORT void Init_repos(void) {
rb_define_module_function(mRepos, "svn_repos_upgrade", _wrap_svn_repos_upgrade, -1);
rb_define_module_function(mRepos, "svn_repos_delete", _wrap_svn_repos_delete, -1);
rb_define_module_function(mRepos, "svn_repos_has_capability", _wrap_svn_repos_has_capability, -1);
+ rb_define_module_function(mRepos, "svn_repos_capabilities", _wrap_svn_repos_capabilities, -1);
rb_define_const(mRepos, "SVN_REPOS_CAPABILITY_MERGEINFO", SWIG_FromCharPtr("mergeinfo"));
+ rb_define_module_function(mRepos, "svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities, -1);
+ rb_define_module_function(mRepos, "svn_repos_fs_type", _wrap_svn_repos_fs_type, -1);
+ rb_define_module_function(mRepos, "svn_repos_hotcopy3", _wrap_svn_repos_hotcopy3, -1);
rb_define_module_function(mRepos, "svn_repos_hotcopy2", _wrap_svn_repos_hotcopy2, -1);
rb_define_module_function(mRepos, "svn_repos_hotcopy", _wrap_svn_repos_hotcopy, -1);
rb_define_module_function(mRepos, "svn_repos_fs_pack2", _wrap_svn_repos_fs_pack2, -1);
@@ -18324,7 +19689,9 @@ SWIGEXPORT void Init_repos(void) {
rb_define_module_function(mRepos, "svn_repos_fs_begin_txn_for_commit2", _wrap_svn_repos_fs_begin_txn_for_commit2, -1);
rb_define_module_function(mRepos, "svn_repos_fs_begin_txn_for_commit", _wrap_svn_repos_fs_begin_txn_for_commit, -1);
rb_define_module_function(mRepos, "svn_repos_fs_begin_txn_for_update", _wrap_svn_repos_fs_begin_txn_for_update, -1);
+ rb_define_module_function(mRepos, "svn_repos_fs_lock_many", _wrap_svn_repos_fs_lock_many, -1);
rb_define_module_function(mRepos, "svn_repos_fs_lock", _wrap_svn_repos_fs_lock, -1);
+ rb_define_module_function(mRepos, "svn_repos_fs_unlock_many", _wrap_svn_repos_fs_unlock_many, -1);
rb_define_module_function(mRepos, "svn_repos_fs_unlock", _wrap_svn_repos_fs_unlock, -1);
rb_define_module_function(mRepos, "svn_repos_fs_get_locks2", _wrap_svn_repos_fs_get_locks2, -1);
rb_define_module_function(mRepos, "svn_repos_fs_get_locks", _wrap_svn_repos_fs_get_locks, -1);
@@ -18335,6 +19702,7 @@ SWIGEXPORT void Init_repos(void) {
rb_define_module_function(mRepos, "svn_repos_fs_revision_prop", _wrap_svn_repos_fs_revision_prop, -1);
rb_define_module_function(mRepos, "svn_repos_fs_revision_proplist", _wrap_svn_repos_fs_revision_proplist, -1);
rb_define_module_function(mRepos, "svn_repos_fs_change_node_prop", _wrap_svn_repos_fs_change_node_prop, -1);
+ rb_define_module_function(mRepos, "svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props, -1);
rb_define_module_function(mRepos, "svn_repos_fs_change_txn_prop", _wrap_svn_repos_fs_change_txn_prop, -1);
rb_define_module_function(mRepos, "svn_repos_fs_change_txn_props", _wrap_svn_repos_fs_change_txn_props, -1);
@@ -18365,6 +19733,7 @@ SWIGEXPORT void Init_repos(void) {
SwigClassSvn_repos_node_t.trackObjects = 0;
rb_define_module_function(mRepos, "svn_repos_node_editor", _wrap_svn_repos_node_editor, -1);
rb_define_module_function(mRepos, "svn_repos_node_from_baton", _wrap_svn_repos_node_from_baton, -1);
+ rb_define_module_function(mRepos, "svn_repos_info_format", _wrap_svn_repos_info_format, -1);
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_MAGIC_HEADER", SWIG_FromCharPtr("SVN-fs-dump-format-version"));
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_FORMAT_VERSION", SWIG_From_int((int)(3)));
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_FORMAT_VERSION_DELTAS", SWIG_From_int((int)(3)));
@@ -18389,10 +19758,15 @@ SWIGEXPORT void Init_repos(void) {
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5", SWIG_FromCharPtr("Text-delta-base-md5"));
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1", SWIG_FromCharPtr("Text-delta-base-sha1"));
rb_define_const(mRepos, "SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM", SWIG_FromCharPtr("Text-delta-base-md5"));
+ rb_define_const(mRepos, "Svn_repos_load_uuid_default", SWIG_From_int((int)(svn_repos_load_uuid_default)));
+ rb_define_const(mRepos, "Svn_repos_load_uuid_ignore", SWIG_From_int((int)(svn_repos_load_uuid_ignore)));
+ rb_define_const(mRepos, "Svn_repos_load_uuid_force", SWIG_From_int((int)(svn_repos_load_uuid_force)));
+ rb_define_module_function(mRepos, "svn_repos_verify_fs3", _wrap_svn_repos_verify_fs3, -1);
rb_define_module_function(mRepos, "svn_repos_verify_fs2", _wrap_svn_repos_verify_fs2, -1);
rb_define_module_function(mRepos, "svn_repos_verify_fs", _wrap_svn_repos_verify_fs, -1);
rb_define_module_function(mRepos, "svn_repos_dump_fs3", _wrap_svn_repos_dump_fs3, -1);
rb_define_module_function(mRepos, "svn_repos_dump_fs", _wrap_svn_repos_dump_fs, -1);
+ rb_define_module_function(mRepos, "svn_repos_load_fs5", _wrap_svn_repos_load_fs5, -1);
rb_define_module_function(mRepos, "svn_repos_load_fs4", _wrap_svn_repos_load_fs4, -1);
rb_define_module_function(mRepos, "svn_repos_load_fs3", _wrap_svn_repos_load_fs3, -1);
rb_define_module_function(mRepos, "svn_repos_load_fs2", _wrap_svn_repos_load_fs2, -1);
@@ -18428,6 +19802,7 @@ SWIGEXPORT void Init_repos(void) {
SwigClassSvn_repos_parse_fns3_t.mark = 0;
SwigClassSvn_repos_parse_fns3_t.trackObjects = 0;
rb_define_module_function(mRepos, "svn_repos_parse_dumpstream3", _wrap_svn_repos_parse_dumpstream3, -1);
+ rb_define_module_function(mRepos, "svn_repos_get_fs_build_parser5", _wrap_svn_repos_get_fs_build_parser5, -1);
rb_define_module_function(mRepos, "svn_repos_get_fs_build_parser4", _wrap_svn_repos_get_fs_build_parser4, -1);
SwigClassSvn_repos_parse_fns2_t.klass = rb_define_class_under(mRepos, "Svn_repos_parse_fns2_t", rb_cObject);
@@ -18494,8 +19869,6 @@ SWIGEXPORT void Init_repos(void) {
rb_define_const(mRepos, "Svn_repos_revision_access_partial", SWIG_From_int((int)(svn_repos_revision_access_partial)));
rb_define_const(mRepos, "Svn_repos_revision_access_full", SWIG_From_int((int)(svn_repos_revision_access_full)));
rb_define_module_function(mRepos, "svn_repos_check_revision_access", _wrap_svn_repos_check_revision_access, -1);
- rb_define_module_function(mRepos, "svn_repos_fs_get_inherited_props", _wrap_svn_repos_fs_get_inherited_props, -1);
- rb_define_module_function(mRepos, "svn_repos_remember_client_capabilities", _wrap_svn_repos_remember_client_capabilities, -1);
rb_define_module_function(mRepos, "svn_repos_parse_fns3_invoke_magic_header_record", _wrap_svn_repos_parse_fns3_invoke_magic_header_record, -1);
rb_define_module_function(mRepos, "svn_repos_parse_fns3_invoke_uuid_record", _wrap_svn_repos_parse_fns3_invoke_uuid_record, -1);
rb_define_module_function(mRepos, "svn_repos_parse_fns3_invoke_new_revision_record", _wrap_svn_repos_parse_fns3_invoke_new_revision_record, -1);
@@ -18521,10 +19894,11 @@ SWIGEXPORT void Init_repos(void) {
rb_define_module_function(mRepos, "svn_repos_parse_fns2_invoke_close_revision", _wrap_svn_repos_parse_fns2_invoke_close_revision, -1);
rb_define_module_function(mRepos, "svn_repos_invoke_authz_func", _wrap_svn_repos_invoke_authz_func, -1);
rb_define_module_function(mRepos, "svn_repos_invoke_authz_callback", _wrap_svn_repos_invoke_authz_callback, -1);
- rb_define_module_function(mRepos, "svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler, -1);
rb_define_module_function(mRepos, "svn_repos_invoke_notify_func", _wrap_svn_repos_invoke_notify_func, -1);
rb_define_module_function(mRepos, "svn_repos_invoke_freeze_func", _wrap_svn_repos_invoke_freeze_func, -1);
rb_define_module_function(mRepos, "svn_repos_invoke_history_func", _wrap_svn_repos_invoke_history_func, -1);
+ rb_define_module_function(mRepos, "svn_repos_invoke_file_rev_handler", _wrap_svn_repos_invoke_file_rev_handler, -1);
+ rb_define_module_function(mRepos, "svn_repos_invoke_verify_callback", _wrap_svn_repos_invoke_verify_callback, -1);
{
VALUE cSvnrepos;
diff --git a/subversion/bindings/swig/ruby/svn_wc.c b/subversion/bindings/swig/ruby/svn_wc.c
index beb2ad8..1b45f52 100644
--- a/subversion/bindings/swig/ruby/svn_wc.c
+++ b/subversion/bindings/swig/ruby/svn_wc.c
@@ -1,11 +1,11 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.9
- *
- * This file is not intended to be easily readable and contains a number of
+ * Version 2.0.12
+ *
+ * This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
- * changes to this file unless you know what you are doing--modify the SWIG
- * interface file instead.
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
* ----------------------------------------------------------------------------- */
#define SWIGRUBY
@@ -41,28 +41,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -105,7 +105,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
#ifndef SWIGUNUSED
# if defined(__GNUC__)
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
# define SWIGUNUSED
# endif
# elif defined(__ICC)
-# define SWIGUNUSED __attribute__ ((__unused__))
+# define SWIGUNUSED __attribute__ ((__unused__))
# else
-# define SWIGUNUSED
+# define SWIGUNUSED
# endif
#endif
#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
# pragma warning(disable : 4505) /* unreferenced local function has been removed */
-# endif
+# endif
#endif
#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
# define SWIGUNUSEDPARM(p)
# else
-# define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# define SWIGUNUSEDPARM(p) p SWIGUNUSED
# endif
#endif
@@ -214,7 +214,7 @@
# define SWIGSTDCALL __stdcall
# else
# define SWIGSTDCALL
-# endif
+# endif
#endif
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
creating a static or dynamic library from the SWIG runtime code.
In 99.9% of the cases, SWIG just needs to declare them as 'static'.
-
+
But only do this if strictly necessary, ie, if you have problems
with your compiler or suchlike.
*/
@@ -278,16 +278,16 @@
#define SWIG_POINTER_OWN 0x1
-/*
+/*
Flags/methods for returning states.
-
- The SWIG conversion methods, as ConvertPtr, return an integer
+
+ The SWIG conversion methods, as ConvertPtr, return an integer
that tells if the conversion was successful or not. And if not,
an error code can be returned (see swigerrors.swg for the codes).
-
+
Use the following macros/flags to set or process the returning
states.
-
+
In old versions of SWIG, code such as the following was usually written:
if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
} else {
// fail code
}
-
+
I.e., now SWIG_ConvertPtr can return new objects and you can
identify the case and take care of the deallocation. Of course that
also requires SWIG_ConvertPtr to return new result values, such as
- int SWIG_ConvertPtr(obj, ptr,...) {
- if (<obj is ok>) {
- if (<need new object>) {
- *ptr = <ptr to new allocated object>;
- return SWIG_NEWOBJ;
- } else {
- *ptr = <ptr to old object>;
- return SWIG_OLDOBJ;
- }
- } else {
- return SWIG_BADOBJ;
- }
+ int SWIG_ConvertPtr(obj, ptr,...) {
+ if (<obj is ok>) {
+ if (<need new object>) {
+ *ptr = <ptr to new allocated object>;
+ return SWIG_NEWOBJ;
+ } else {
+ *ptr = <ptr to old object>;
+ return SWIG_OLDOBJ;
+ }
+ } else {
+ return SWIG_BADOBJ;
+ }
}
Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
int fooi(int);
and you call
-
+
food(1) // cast rank '1' (1 -> 1.0)
fooi(1) // cast rank '0'
just use the SWIG_AddCast()/SWIG_CheckState()
*/
-#define SWIG_OK (0)
+#define SWIG_OK (0)
#define SWIG_ERROR (-1)
#define SWIG_IsOK(r) (r >= 0)
-#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
# endif
# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
-SWIGINTERNINLINE int SWIG_AddCast(int r) {
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
-SWIGINTERNINLINE int SWIG_CheckState(int r) {
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
}
#else /* no cast-rank mode */
-# define SWIG_AddCast
+# define SWIG_AddCast(r) (r)
# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
void *clientdata; /* Language specific module data */
} swig_module_info;
-/*
+/*
Compare two type names skipping the space characters, therefore
"char*" == "char *" and "Class<int>" == "Class<int >", etc.
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if not equal, 1 if equal
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
- int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+ int equiv = 1;
const char* te = tb + strlen(tb);
const char* ne = nb;
- while (!equiv && *ne) {
+ while (equiv != 0 && *ne) {
for (nb = ne; *ne; ++ne) {
if (*ne == '|') break;
}
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
if (*ne) ++ne;
}
return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(const char *nb, const char *tb) {
/*
Check type equivalence in a name list like <name1>|<name2>|...
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+ Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
- int equiv = 0;
- const char* te = tb + strlen(tb);
- const char* ne = nb;
- while (!equiv && *ne) {
- for (nb = ne; *ne; ++ne) {
- if (*ne == '|') break;
- }
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
- if (*ne) ++ne;
- }
- return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
}
-
/*
Check the typename
*/
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
return 0;
}
-/*
+/*
Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}
-/*
+/*
Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
return type->name;
}
-/*
+/*
Set the clientdata field for a type
*/
SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
swig_cast_info *cast = ti->cast;
/* if (ti->clientdata == clientdata) return; */
ti->clientdata = clientdata;
-
+
while (cast) {
if (!cast->converter) {
swig_type_info *tc = cast->type;
if (!tc->clientdata) {
SWIG_TypeClientData(tc, clientdata);
}
- }
+ }
cast = cast->next;
}
}
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
SWIG_TypeClientData(ti, clientdata);
ti->owndata = 1;
}
-
+
/*
Search for a swig_type_info structure only by mangled name
Search is a O(log #types)
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_MangledTypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
swig_module_info *iter = start;
do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
register size_t r = iter->size - 1;
do {
/* since l+r >= 0, we can (>> 1) instead (/ 2) */
- register size_t i = (l + r) >> 1;
+ register size_t i = (l + r) >> 1;
const char *iname = iter->types[i]->name;
if (iname) {
register int compare = strcmp(name, iname);
- if (compare == 0) {
+ if (compare == 0) {
return iter->types[i];
} else if (compare < 0) {
if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
Search for a swig_type_info structure for either a mangled name or a human readable name.
It first searches the mangled names of the types, which is a O(log #types)
If a type is not found it then searches the human readable names, which is O(#types).
-
- We start searching at module start, and finish searching when start == end.
+
+ We start searching at module start, and finish searching when start == end.
Note: if start == end at the beginning of the function, we go all the way around
the circular list.
*/
SWIGRUNTIME swig_type_info *
-SWIG_TypeQueryModule(swig_module_info *start,
- swig_module_info *end,
+SWIG_TypeQueryModule(swig_module_info *start,
+ swig_module_info *end,
const char *name) {
/* STEP 1: Search the name field using binary search */
swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
iter = iter->next;
} while (iter != end);
}
-
+
/* neither found a match */
return 0;
}
-/*
+/*
Pack binary data into a string
*/
SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
return c;
}
-/*
+/*
Unpack binary data from a string
*/
SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
- else
+ else
return (char *) 0;
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
- else
+ else
return (char *) 0;
*u = uu;
}
return c;
}
-/*
+/*
Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
#endif
/* Errors in SWIG */
-#define SWIG_UnknownError -1
-#define SWIG_IOError -2
-#define SWIG_RuntimeError -3
-#define SWIG_IndexError -4
-#define SWIG_TypeError -5
-#define SWIG_DivisionByZero -6
-#define SWIG_OverflowError -7
-#define SWIG_SyntaxError -8
-#define SWIG_ValueError -9
+#define SWIG_UnknownError -1
+#define SWIG_IOError -2
+#define SWIG_RuntimeError -3
+#define SWIG_IndexError -4
+#define SWIG_TypeError -5
+#define SWIG_DivisionByZero -6
+#define SWIG_OverflowError -7
+#define SWIG_SyntaxError -8
+#define SWIG_ValueError -9
#define SWIG_SystemError -10
#define SWIG_AttributeError -11
-#define SWIG_MemoryError -12
+#define SWIG_MemoryError -12
#define SWIG_NullReferenceError -13
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
SWIGINTERN
int SWIG_Ruby_isCallable( VALUE proc )
{
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_call_id ) )
return 1;
return 0;
}
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
SWIGINTERN
int SWIG_Ruby_arity( VALUE proc, int minimal )
{
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
+ if ( rb_respond_to( proc, swig_arity_id ) )
{
VALUE num = rb_funcall( proc, swig_arity_id, 0 );
int arity = NUM2INT(num);
@@ -1986,7 +1975,7 @@ static VALUE mWc;
#define SWIG_RUBY_THREAD_END_BLOCK
-#define SWIGVERSION 0x020009
+#define SWIGVERSION 0x020012
#define SWIG_VERSION SWIGVERSION
@@ -2119,7 +2108,7 @@ SWIG_ruby_failed(void)
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2199,7 +2188,7 @@ SWIGINTERN svn_wc_external_item2_t *svn_wc_external_item2_t_dup(struct svn_wc_ex
return svn_wc_external_item2_dup(self, pool);
}
-/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.9/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+/*@SWIG:/tmp/svnrm/prefix/share/swig/2.0.12/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args)
{
VALUE obj = args[0];
@@ -2711,7 +2700,7 @@ _wrap_svn_wc_adm_open3(int argc, VALUE *argv, VALUE self) {
}
arg5 = (int)(val5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -2978,7 +2967,7 @@ _wrap_svn_wc_adm_probe_open3(int argc, VALUE *argv, VALUE self) {
}
arg5 = (int)(val5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -3243,7 +3232,7 @@ _wrap_svn_wc_adm_open_anchor(int argc, VALUE *argv, VALUE self) {
}
arg6 = (int)(val6);
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -3506,7 +3495,7 @@ _wrap_svn_wc_adm_probe_try3(int argc, VALUE *argv, VALUE self) {
}
arg5 = (int)(val5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -7350,951 +7339,6 @@ fail:
}
-static swig_class SwigClassSvn_wc_conflict_description2_t;
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_local_abspath_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","local_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","local_abspath", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->local_abspath) free((char *)arg1->local_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->local_abspath = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_local_abspath_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","local_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->local_abspath);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_node_kind_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_node_kind_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","node_kind", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_node_kind_t","node_kind", 2, argv[0] ));
- }
- arg2 = (svn_node_kind_t)(val2);
- if (arg1) (arg1)->node_kind = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_node_kind_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_node_kind_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","node_kind", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_node_kind_t) ((arg1)->node_kind);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_kind_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_kind_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","kind", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_wc_conflict_kind_t","kind", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_kind_t)(val2);
- if (arg1) (arg1)->kind = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_kind_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_kind_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","kind", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_kind_t) ((arg1)->kind);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_property_name_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","property_name", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","property_name", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->property_name) free((char *)arg1->property_name);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->property_name = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_property_name_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","property_name", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->property_name);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_is_binary_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_boolean_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","is_binary", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- arg2 = RTEST(argv[0]);
- if (arg1) (arg1)->is_binary = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_is_binary_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_boolean_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","is_binary", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_boolean_t) ((arg1)->is_binary);
- vresult = result ? Qtrue : Qfalse;
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_mime_type_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","mime_type", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","mime_type", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->mime_type) free((char *)arg1->mime_type);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->mime_type = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_mime_type_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","mime_type", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->mime_type);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_action_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_action_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","action", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_wc_conflict_action_t","action", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_action_t)(val2);
- if (arg1) (arg1)->action = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_action_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_action_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","action", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_action_t) ((arg1)->action);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_reason_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_reason_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","reason", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_wc_conflict_reason_t","reason", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_reason_t)(val2);
- if (arg1) (arg1)->reason = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_reason_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_reason_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","reason", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_reason_t) ((arg1)->reason);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_base_abspath_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","base_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","base_abspath", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->base_abspath) free((char *)arg1->base_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->base_abspath = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_base_abspath_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","base_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->base_abspath);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_their_abspath_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","their_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","their_abspath", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->their_abspath) free((char *)arg1->their_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->their_abspath = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_their_abspath_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","their_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->their_abspath);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_my_abspath_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","my_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","my_abspath", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->my_abspath) free((char *)arg1->my_abspath);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->my_abspath = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_my_abspath_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","my_abspath", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->my_abspath);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_merged_file_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","merged_file", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","merged_file", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_merged_file_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- char *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","merged_file", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (char *) ((arg1)->merged_file);
- {
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
- }
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_operation_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_operation_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","operation", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_wc_operation_t","operation", 2, argv[0] ));
- }
- arg2 = (svn_wc_operation_t)(val2);
- if (arg1) (arg1)->operation = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_operation_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_operation_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","operation", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_operation_t) ((arg1)->operation);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_src_left_version_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","src_left_version", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_wc_conflict_version_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_wc_conflict_version_t const *","src_left_version", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_version_t *)(argp2);
- if (arg1) (arg1)->src_left_version = (svn_wc_conflict_version_t const *)arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_src_left_version_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_version_t *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","src_left_version", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_version_t *) ((arg1)->src_left_version);
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_version_t, 0 | 0 );
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_src_right_version_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- svn_wc_conflict_version_t *arg2 = (svn_wc_conflict_version_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- void *argp2 = 0 ;
- int res2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","src_right_version", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_svn_wc_conflict_version_t, SWIG_POINTER_DISOWN | 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_wc_conflict_version_t const *","src_right_version", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_version_t *)(argp2);
- if (arg1) (arg1)->src_right_version = (svn_wc_conflict_version_t const *)arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_src_right_version_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *arg1 = (struct svn_wc_conflict_description2_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_version_t *result = 0 ;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_description2_t *","src_right_version", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_description2_t *)(argp1);
- result = (svn_wc_conflict_version_t *) ((arg1)->src_right_version);
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_version_t, 0 | 0 );
- return vresult;
-fail:
- return Qnil;
-}
-
-
-#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_description2_t_allocate(VALUE self) {
-#else
- SWIGINTERN VALUE
- _wrap_svn_wc_conflict_description2_t_allocate(int argc, VALUE *argv, VALUE self) {
-#endif
-
-
- VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_svn_wc_conflict_description2_t);
-#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
- rb_obj_call_init(vresult, argc, argv);
-#endif
- return vresult;
- }
-
-
-SWIGINTERN VALUE
-_wrap_new_svn_wc_conflict_description2_t(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_description2_t *result = 0 ;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- {
- result = (struct svn_wc_conflict_description2_t *)calloc(1, sizeof(struct svn_wc_conflict_description2_t));
- DATA_PTR(self) = result;
-
-
-
- }
- return self;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN void
-free_svn_wc_conflict_description2_t(struct svn_wc_conflict_description2_t *arg1) {
- free((char *) arg1);
-}
-
static swig_class SwigClassSvn_wc_conflict_description_t;
SWIGINTERN VALUE
@@ -9762,7 +8806,7 @@ fail:
SWIGINTERN VALUE
-_wrap_svn_wc__conflict_description2_dup(int argc, VALUE *argv, VALUE self) {
+_wrap_svn_wc_conflict_description2_dup(int argc, VALUE *argv, VALUE self) {
svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
apr_pool_t *arg2 = (apr_pool_t *) 0 ;
VALUE _global_svn_swig_rb_pool ;
@@ -9782,14 +8826,14 @@ _wrap_svn_wc__conflict_description2_dup(int argc, VALUE *argv, VALUE self) {
}
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_conflict_description2_t const *","svn_wc__conflict_description2_dup", 1, argv[0] ));
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_conflict_description2_t const *","svn_wc_conflict_description2_dup", 1, argv[0] ));
}
arg1 = (svn_wc_conflict_description2_t *)(argp1);
if (argc > 1) {
}
{
- result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
+ result = (svn_wc_conflict_description2_t *)svn_wc_conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
@@ -9815,219 +8859,60 @@ fail:
}
-static swig_class SwigClassSvn_wc_conflict_result_t;
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_choice_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_wc_conflict_choice_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int val2 ;
- int ecode2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","choice", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- ecode2 = SWIG_AsVal_int(argv[0], &val2);
- if (!SWIG_IsOK(ecode2)) {
- SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_wc_conflict_choice_t","choice", 2, argv[0] ));
- }
- arg2 = (svn_wc_conflict_choice_t)(val2);
- if (arg1) (arg1)->choice = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_choice_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_wc_conflict_choice_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","choice", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (svn_wc_conflict_choice_t) ((arg1)->choice);
- vresult = SWIG_From_int((int)(result));
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_merged_file_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- char *arg2 = (char *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","merged_file", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","merged_file", 2, argv[0] ));
- }
- arg2 = (char *)(buf2);
- {
- apr_size_t len = strlen(arg2) + 1;
- char *copied;
- if (arg1->merged_file) free((char *)arg1->merged_file);
- copied = malloc(len);
- memcpy(copied, arg2, len);
- arg1->merged_file = copied;
- }
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-fail:
- if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
- return Qnil;
-}
-
-
SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_merged_file_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
+_wrap_svn_wc__conflict_description2_dup(int argc, VALUE *argv, VALUE self) {
+ svn_wc_conflict_description2_t *arg1 = (svn_wc_conflict_description2_t *) 0 ;
+ apr_pool_t *arg2 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
void *argp1 = 0 ;
int res1 = 0 ;
- char *result = 0 ;
+ svn_wc_conflict_description2_t *result = 0 ;
VALUE vresult = Qnil;
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","merged_file", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (char *) ((arg1)->merged_file);
{
- if (result) {
- vresult = rb_str_new2(result);
- } else {
- vresult = Qnil;
- }
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg2);
+ _global_pool = arg2;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
}
- return vresult;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_save_merged_set(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- svn_boolean_t arg2 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
-
- if ((argc < 1) || (argc > 1)) {
+ if ((argc < 1) || (argc > 2)) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
}
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","save_merged", 1, self ));
- }
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- arg2 = RTEST(argv[0]);
- if (arg1) (arg1)->save_merged = arg2;
- return Qnil;
-fail:
- return Qnil;
-}
-
-
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_save_merged_get(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *arg1 = (struct svn_wc_conflict_result_t *) 0 ;
- void *argp1 = 0 ;
- int res1 = 0 ;
- svn_boolean_t result;
- VALUE vresult = Qnil;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
- }
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_conflict_result_t, 0 | 0 );
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_conflict_result_t *","save_merged", 1, self ));
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_conflict_description2_t const *","svn_wc__conflict_description2_dup", 1, argv[0] ));
}
- arg1 = (struct svn_wc_conflict_result_t *)(argp1);
- result = (svn_boolean_t) ((arg1)->save_merged);
- vresult = result ? Qtrue : Qfalse;
- return vresult;
-fail:
- return Qnil;
-}
-
-
-#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
-SWIGINTERN VALUE
-_wrap_svn_wc_conflict_result_t_allocate(VALUE self) {
-#else
- SWIGINTERN VALUE
- _wrap_svn_wc_conflict_result_t_allocate(int argc, VALUE *argv, VALUE self) {
-#endif
-
+ arg1 = (svn_wc_conflict_description2_t *)(argp1);
+ if (argc > 1) {
- VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_svn_wc_conflict_result_t);
-#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
- rb_obj_call_init(vresult, argc, argv);
-#endif
- return vresult;
- }
-
-
-SWIGINTERN VALUE
-_wrap_new_svn_wc_conflict_result_t(int argc, VALUE *argv, VALUE self) {
- struct svn_wc_conflict_result_t *result = 0 ;
-
- if ((argc < 0) || (argc > 0)) {
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
}
{
- result = (struct svn_wc_conflict_result_t *)calloc(1, sizeof(struct svn_wc_conflict_result_t));
- DATA_PTR(self) = result;
+ result = (svn_wc_conflict_description2_t *)svn_wc__conflict_description2_dup((struct svn_wc_conflict_description2_t const *)arg1,arg2);
}
- return self;
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_svn_wc_conflict_description2_t, 0 | 0 );
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
fail:
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
return Qnil;
}
-SWIGINTERN void
-free_svn_wc_conflict_result_t(struct svn_wc_conflict_result_t *arg1) {
- free((char *) arg1);
-}
-
SWIGINTERN VALUE
_wrap_svn_wc_create_conflict_result(int argc, VALUE *argv, VALUE self) {
svn_wc_conflict_choice_t arg1 ;
@@ -16273,7 +15158,7 @@ _wrap_svn_wc_walk_entries3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_wc_entry_callbacks2();
+ arg3 = (svn_wc_entry_callbacks2_t *) svn_swig_rb_wc_entry_callbacks2();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
@@ -16281,7 +15166,7 @@ _wrap_svn_wc_walk_entries3(int argc, VALUE *argv, VALUE self) {
}
arg6 = RTEST(argv[4]);
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -16378,7 +15263,7 @@ _wrap_svn_wc_walk_entries2(int argc, VALUE *argv, VALUE self) {
}
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -18793,6 +17678,59 @@ fail:
}
+SWIGINTERN VALUE
+_wrap_svn_wc_status3_t_actual_kind_set(int argc, VALUE *argv, VALUE self) {
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ svn_node_kind_t arg2 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
+
+ if ((argc < 1) || (argc > 1)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_status3_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_status3_t *","actual_kind", 1, self ));
+ }
+ arg1 = (struct svn_wc_status3_t *)(argp1);
+ ecode2 = SWIG_AsVal_int(argv[0], &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "svn_node_kind_t","actual_kind", 2, argv[0] ));
+ }
+ arg2 = (svn_node_kind_t)(val2);
+ if (arg1) (arg1)->actual_kind = arg2;
+ return Qnil;
+fail:
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_svn_wc_status3_t_actual_kind_get(int argc, VALUE *argv, VALUE self) {
+ struct svn_wc_status3_t *arg1 = (struct svn_wc_status3_t *) 0 ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ svn_node_kind_t result;
+ VALUE vresult = Qnil;
+
+ if ((argc < 0) || (argc > 0)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_svn_wc_status3_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct svn_wc_status3_t *","actual_kind", 1, self ));
+ }
+ arg1 = (struct svn_wc_status3_t *)(argp1);
+ result = (svn_node_kind_t) ((arg1)->actual_kind);
+ vresult = SWIG_From_int((int)(result));
+ return vresult;
+fail:
+ return Qnil;
+}
+
+
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
SWIGINTERN VALUE
_wrap_svn_wc_status3_t_allocate(VALUE self) {
@@ -20781,7 +19719,7 @@ _wrap_svn_wc_walk_status(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "void *","svn_wc_walk_status", 9, argv[8] ));
}
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -20923,7 +19861,7 @@ _wrap_svn_wc_get_status_editor5(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res15), Ruby_Format_TypeError( "", "void *","svn_wc_get_status_editor5", 15, argv[10] ));
}
{
- arg16 = svn_swig_rb_cancel_func;
+ arg16 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg17 = (void *)svn_swig_rb_make_baton(argv[11], _global_svn_swig_rb_pool);
}
if (argc > 12) {
@@ -21083,7 +20021,7 @@ _wrap_svn_wc_get_status_editor4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res12), Ruby_Format_TypeError( "", "void *","svn_wc_get_status_editor4", 12, argv[7] ));
}
{
- arg13 = svn_swig_rb_cancel_func;
+ arg13 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
res15 = SWIG_ConvertPtr(argv[9], &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -21218,11 +20156,11 @@ _wrap_svn_wc_get_status_editor3(int argc, VALUE *argv, VALUE self) {
}
arg10 = (apr_array_header_t *)(argp10);
{
- arg11 = svn_swig_rb_wc_status_func;
+ arg11 = (svn_wc_status_func2_t) svn_swig_rb_wc_status_func;
arg12 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg13 = svn_swig_rb_cancel_func;
+ arg13 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
res15 = SWIG_ConvertPtr(argv[8], &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -21355,11 +20293,11 @@ _wrap_svn_wc_get_status_editor2(int argc, VALUE *argv, VALUE self) {
arg9 = RTEST(argv[4]);
arg10 = RTEST(argv[5]);
{
- arg11 = svn_swig_rb_wc_status_func;
+ arg11 = (svn_wc_status_func2_t) svn_swig_rb_wc_status_func;
arg12 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg13 = svn_swig_rb_cancel_func;
+ arg13 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg14 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
res15 = SWIG_ConvertPtr(argv[8], &argp15,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -21500,7 +20438,7 @@ _wrap_svn_wc_get_status_editor(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res11), Ruby_Format_TypeError( "", "void *","svn_wc_get_status_editor", 11, argv[7] ));
}
{
- arg12 = svn_swig_rb_cancel_func;
+ arg12 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg13 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
res14 = SWIG_ConvertPtr(argv[9], &argp14,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -21689,11 +20627,11 @@ _wrap_svn_wc_copy3(int argc, VALUE *argv, VALUE self) {
arg3 = (char *)(buf3);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -21787,11 +20725,11 @@ _wrap_svn_wc_copy2(int argc, VALUE *argv, VALUE self) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -21886,7 +20824,7 @@ _wrap_svn_wc_copy(int argc, VALUE *argv, VALUE self) {
}
arg3 = (char *)(buf3);
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
{
@@ -21992,11 +20930,11 @@ _wrap_svn_wc_move(int argc, VALUE *argv, VALUE self) {
arg3 = (char *)(buf3);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -22085,11 +21023,11 @@ _wrap_svn_wc_delete4(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -22173,11 +21111,11 @@ _wrap_svn_wc_delete3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
- arg5 = svn_swig_rb_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
arg7 = RTEST(argv[4]);
@@ -22261,11 +21199,11 @@ _wrap_svn_wc_delete2(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
- arg5 = svn_swig_rb_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -22349,7 +21287,7 @@ _wrap_svn_wc_delete(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
@@ -22405,6 +21343,104 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_wc_add_from_disk3(int argc, VALUE *argv, VALUE self) {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ apr_hash_t *arg3 = (apr_hash_t *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_wc_notify_func2_t arg5 = (svn_wc_notify_func2_t) 0 ;
+ void *arg6 = (void *) 0 ;
+ apr_pool_t *arg7 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg7);
+ _global_pool = arg7;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 5) || (argc > 6)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_context_t *","svn_wc_add_from_disk3", 1, argv[0] ));
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_wc_add_from_disk3", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ VALUE rb_pool = Qnil;
+ if (!_global_pool) {
+ svn_swig_rb_get_pool(argc, argv, self, &rb_pool, &_global_pool);
+ svn_swig_rb_push_pool(rb_pool);
+ }
+ arg3 = svn_swig_rb_hash_to_apr_hash_svn_string(argv[2], _global_pool);
+ _global_pool = NULL;
+ if (!NIL_P(rb_pool)) {
+ if (NIL_P(arg3)) {
+ svn_swig_rb_destroy_pool(rb_pool);
+ } else {
+ svn_swig_rb_set_pool_for_no_swig_type(argv[2], rb_pool);
+ }
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ }
+ arg4 = RTEST(argv[3]);
+ {
+ arg5 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
+ arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
+ }
+ if (argc > 5) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_add_from_disk3(arg1,(char const *)arg2,(apr_hash_t const *)arg3,arg4,arg5,arg6,arg7);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_wc_add_from_disk2(int argc, VALUE *argv, VALUE self) {
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -22458,7 +21494,7 @@ _wrap_svn_wc_add_from_disk2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg4 = svn_swig_rb_notify_func2;
+ arg4 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -22536,7 +21572,7 @@ _wrap_svn_wc_add_from_disk(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_notify_func2;
+ arg3 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -22636,11 +21672,11 @@ _wrap_svn_wc_add4(int argc, VALUE *argv, VALUE self) {
}
arg5 = (svn_revnum_t)(val5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -22743,11 +21779,11 @@ _wrap_svn_wc_add3(int argc, VALUE *argv, VALUE self) {
}
arg5 = (svn_revnum_t)(val5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -22846,11 +21882,11 @@ _wrap_svn_wc_add2(int argc, VALUE *argv, VALUE self) {
}
arg4 = (svn_revnum_t)(val4);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -22950,7 +21986,7 @@ _wrap_svn_wc_add(int argc, VALUE *argv, VALUE self) {
}
arg4 = (svn_revnum_t)(val4);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
@@ -23101,7 +22137,7 @@ _wrap_svn_wc_add_repos_file4(int argc, VALUE *argv, VALUE self) {
}
arg8 = (svn_revnum_t)(val8);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -23244,11 +22280,11 @@ _wrap_svn_wc_add_repos_file3(int argc, VALUE *argv, VALUE self) {
}
arg8 = (svn_revnum_t)(val8);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
{
- arg11 = svn_swig_rb_notify_func2;
+ arg11 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg12 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -23590,7 +22626,7 @@ _wrap_svn_wc_remove_from_revision_control2(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -23675,7 +22711,7 @@ _wrap_svn_wc_remove_from_revision_control(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -23783,11 +22819,11 @@ _wrap_svn_wc_resolved_conflict5(int argc, VALUE *argv, VALUE self) {
}
arg7 = (svn_wc_conflict_choice_t)(val7);
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -23890,11 +22926,11 @@ _wrap_svn_wc_resolved_conflict4(int argc, VALUE *argv, VALUE self) {
}
arg7 = (svn_wc_conflict_choice_t)(val7);
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -23993,11 +23029,11 @@ _wrap_svn_wc_resolved_conflict3(int argc, VALUE *argv, VALUE self) {
}
arg6 = (svn_wc_conflict_choice_t)(val6);
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -24086,11 +23122,11 @@ _wrap_svn_wc_resolved_conflict2(int argc, VALUE *argv, VALUE self) {
arg4 = RTEST(argv[3]);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -24227,6 +23263,111 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_wc_queue_committed4(int argc, VALUE *argv, VALUE self) {
+ svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
+ svn_wc_context_t *arg2 = (svn_wc_context_t *) 0 ;
+ char *arg3 = (char *) 0 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ apr_array_header_t *arg6 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg7 ;
+ svn_boolean_t arg8 ;
+ svn_checksum_t *arg9 = (svn_checksum_t *) 0 ;
+ apr_pool_t *arg10 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ void *argp2 = 0 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ void *argp9 = 0 ;
+ int res9 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg10);
+ _global_pool = arg10;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 9) || (argc > 10)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 9)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_committed_queue_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_committed_queue_t *","svn_wc_queue_committed4", 1, argv[0] ));
+ }
+ arg1 = (svn_wc_committed_queue_t *)(argp1);
+ res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "svn_wc_context_t *","svn_wc_queue_committed4", 2, argv[1] ));
+ }
+ arg2 = (svn_wc_context_t *)(argp2);
+ res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","svn_wc_queue_committed4", 3, argv[2] ));
+ }
+ arg3 = (char *)(buf3);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ {
+ VALUE rb_pool;
+ apr_pool_t *pool;
+
+ svn_swig_rb_get_pool(argc, argv, self, &rb_pool, &pool);
+
+ arg6 = svn_swig_rb_to_apr_array_prop(argv[5], pool);
+ }
+ arg7 = RTEST(argv[6]);
+ arg8 = RTEST(argv[7]);
+ res9 = SWIG_ConvertPtr(argv[8], &argp9,SWIGTYPE_p_svn_checksum_t, 0 | 0 );
+ if (!SWIG_IsOK(res9)) {
+ SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "svn_checksum_t const *","svn_wc_queue_committed4", 9, argv[8] ));
+ }
+ arg9 = (svn_checksum_t *)(argp9);
+ if (argc > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_queue_committed4(arg1,arg2,(char const *)arg3,arg4,arg5,(apr_array_header_t const *)arg6,arg7,arg8,(struct svn_checksum_t const *)arg9,arg10);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_wc_queue_committed3(int argc, VALUE *argv, VALUE self) {
svn_wc_committed_queue_t *arg1 = (svn_wc_committed_queue_t *) 0 ;
svn_wc_context_t *arg2 = (svn_wc_context_t *) 0 ;
@@ -24487,16 +23628,7 @@ _wrap_svn_wc_queue_committed(int argc, VALUE *argv, VALUE self) {
}
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
- {
- if (NIL_P(argv[7])) {
- arg8 = NULL;
- } else if (RSTRING_LEN(argv[7]) != APR_MD5_DIGESTSIZE) {
- rb_raise(rb_eArgError, "digest size (%d) must be %d",
- RSTRING_LEN(argv[7]), APR_MD5_DIGESTSIZE);
- } else {
- arg8 = (unsigned char *)StringValuePtr(argv[7]);
- }
- }
+
if (argc > 8) {
}
@@ -24599,7 +23731,7 @@ _wrap_svn_wc_process_committed_queue2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -24808,16 +23940,7 @@ _wrap_svn_wc_process_committed4(int argc, VALUE *argv, VALUE self) {
}
arg8 = RTEST(argv[7]);
arg9 = RTEST(argv[8]);
- {
- if (NIL_P(argv[9])) {
- arg10 = NULL;
- } else if (RSTRING_LEN(argv[9]) != APR_MD5_DIGESTSIZE) {
- rb_raise(rb_eArgError, "digest size (%d) must be %d",
- RSTRING_LEN(argv[9]), APR_MD5_DIGESTSIZE);
- } else {
- arg10 = (unsigned char *)StringValuePtr(argv[9]);
- }
- }
+
if (argc > 10) {
}
@@ -24929,16 +24052,7 @@ _wrap_svn_wc_process_committed3(int argc, VALUE *argv, VALUE self) {
arg7 = svn_swig_rb_to_apr_array_prop(argv[6], pool);
}
arg8 = RTEST(argv[7]);
- {
- if (NIL_P(argv[8])) {
- arg9 = NULL;
- } else if (RSTRING_LEN(argv[8]) != APR_MD5_DIGESTSIZE) {
- rb_raise(rb_eArgError, "digest size (%d) must be %d",
- RSTRING_LEN(argv[8]), APR_MD5_DIGESTSIZE);
- } else {
- arg9 = (unsigned char *)StringValuePtr(argv[8]);
- }
- }
+
if (argc > 9) {
}
@@ -25240,7 +24354,7 @@ _wrap_svn_wc_crawl_revisions5(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_ra_reporter3;
+ arg3 = (svn_ra_reporter3_t *) svn_swig_rb_get_ra_reporter3();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg5 = RTEST(argv[3]);
@@ -25251,11 +24365,11 @@ _wrap_svn_wc_crawl_revisions5(int argc, VALUE *argv, VALUE self) {
arg8 = RTEST(argv[6]);
arg9 = RTEST(argv[7]);
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
{
- arg12 = svn_swig_rb_notify_func2;
+ arg12 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg13 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -25346,7 +24460,7 @@ _wrap_svn_wc_crawl_revisions4(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_ra_reporter3;
+ arg3 = (svn_ra_reporter3_t *) svn_swig_rb_get_ra_reporter3();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg5 = RTEST(argv[3]);
@@ -25357,7 +24471,7 @@ _wrap_svn_wc_crawl_revisions4(int argc, VALUE *argv, VALUE self) {
arg8 = RTEST(argv[6]);
arg9 = RTEST(argv[7]);
{
- arg10 = svn_swig_rb_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
res12 = SWIG_ConvertPtr(argv[9], &argp12,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -25449,7 +24563,7 @@ _wrap_svn_wc_crawl_revisions3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (svn_wc_adm_access_t *)(argp2);
{
- arg3 = svn_swig_rb_ra_reporter3;
+ arg3 = (svn_ra_reporter3_t *) svn_swig_rb_get_ra_reporter3();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg5 = RTEST(argv[3]);
@@ -25459,7 +24573,7 @@ _wrap_svn_wc_crawl_revisions3(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[5]);
arg8 = RTEST(argv[6]);
{
- arg9 = svn_swig_rb_notify_func2;
+ arg9 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
res11 = SWIG_ConvertPtr(argv[8], &argp11,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -25565,7 +24679,7 @@ _wrap_svn_wc_crawl_revisions2(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
res10 = SWIG_ConvertPtr(argv[8], &argp10,SWIGTYPE_p_svn_wc_traversal_info_t, 0 | 0 );
@@ -26309,11 +25423,11 @@ _wrap_svn_wc_get_update_editor4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res21), Ruby_Format_TypeError( "", "void *","svn_wc_get_update_editor4", 21, argv[18] ));
}
{
- arg22 = svn_swig_rb_cancel_func;
+ arg22 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg23 = (void *)svn_swig_rb_make_baton(argv[19], _global_svn_swig_rb_pool);
}
{
- arg24 = svn_swig_rb_notify_func2;
+ arg24 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg25 = (void *)svn_swig_rb_make_baton(argv[20], _global_svn_swig_rb_pool);
}
if (argc > 21) {
@@ -26458,11 +25572,11 @@ _wrap_svn_wc_get_update_editor3(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
{
@@ -26610,11 +25724,11 @@ _wrap_svn_wc_get_update_editor2(int argc, VALUE *argv, VALUE self) {
arg4 = RTEST(argv[3]);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
@@ -26752,7 +25866,7 @@ _wrap_svn_wc_get_update_editor(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "void *","svn_wc_get_update_editor", 7, argv[6] ));
}
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
@@ -26958,11 +26072,11 @@ _wrap_svn_wc_get_switch_editor4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res20), Ruby_Format_TypeError( "", "void *","svn_wc_get_switch_editor4", 20, argv[17] ));
}
{
- arg21 = svn_swig_rb_cancel_func;
+ arg21 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg22 = (void *)svn_swig_rb_make_baton(argv[18], _global_svn_swig_rb_pool);
}
{
- arg23 = svn_swig_rb_notify_func2;
+ arg23 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg24 = (void *)svn_swig_rb_make_baton(argv[19], _global_svn_swig_rb_pool);
}
if (argc > 20) {
@@ -27116,11 +26230,11 @@ _wrap_svn_wc_get_switch_editor3(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[6]);
arg8 = RTEST(argv[7]);
{
- arg9 = svn_swig_rb_notify_func2;
+ arg9 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
{
- arg11 = svn_swig_rb_cancel_func;
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg12 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
{
@@ -27268,11 +26382,11 @@ _wrap_svn_wc_get_switch_editor2(int argc, VALUE *argv, VALUE self) {
arg5 = RTEST(argv[4]);
arg6 = RTEST(argv[5]);
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
@@ -27421,7 +26535,7 @@ _wrap_svn_wc_get_switch_editor(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "void *","svn_wc_get_switch_editor", 8, argv[7] ));
}
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
{
@@ -28050,11 +27164,11 @@ _wrap_svn_wc_prop_set4(int argc, VALUE *argv, VALUE self) {
}
arg7 = (apr_array_header_t *)(argp7);
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
{
- arg10 = svn_swig_rb_notify_func2;
+ arg10 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -28159,7 +27273,7 @@ _wrap_svn_wc_prop_set3(int argc, VALUE *argv, VALUE self) {
arg4 = (svn_wc_adm_access_t *)(argp4);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -28703,7 +27817,7 @@ _wrap_svn_wc_get_diff_editor6(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res15), Ruby_Format_TypeError( "", "void *","svn_wc_get_diff_editor6", 15, argv[12] ));
}
{
- arg16 = svn_swig_rb_cancel_func;
+ arg16 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg17 = (void *)svn_swig_rb_make_baton(argv[13], _global_svn_swig_rb_pool);
}
if (argc > 14) {
@@ -28842,7 +27956,7 @@ _wrap_svn_wc_get_diff_editor5(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[6]);
arg8 = RTEST(argv[7]);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
res11 = SWIG_ConvertPtr(argv[9], &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
@@ -28949,7 +28063,7 @@ _wrap_svn_wc_get_diff_editor4(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_wc_diff_callbacks2();
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_rb_wc_diff_callbacks2();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
@@ -28959,7 +28073,7 @@ _wrap_svn_wc_get_diff_editor4(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[5]);
arg8 = RTEST(argv[6]);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
res11 = SWIG_ConvertPtr(argv[8], &argp11,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
@@ -29063,7 +28177,7 @@ _wrap_svn_wc_get_diff_editor3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_wc_diff_callbacks2();
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_rb_wc_diff_callbacks2();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg5 = RTEST(argv[3]);
@@ -29071,7 +28185,7 @@ _wrap_svn_wc_get_diff_editor3(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[5]);
arg8 = RTEST(argv[6]);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -29186,7 +28300,7 @@ _wrap_svn_wc_get_diff_editor2(int argc, VALUE *argv, VALUE self) {
arg7 = RTEST(argv[6]);
arg8 = RTEST(argv[7]);
{
- arg9 = svn_swig_rb_cancel_func;
+ arg9 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg10 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
}
if (argc > 9) {
@@ -29299,7 +28413,7 @@ _wrap_svn_wc_get_diff_editor(int argc, VALUE *argv, VALUE self) {
arg6 = RTEST(argv[5]);
arg7 = RTEST(argv[6]);
{
- arg8 = svn_swig_rb_cancel_func;
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
}
if (argc > 8) {
@@ -29418,7 +28532,7 @@ _wrap_svn_wc_diff6(int argc, VALUE *argv, VALUE self) {
}
arg9 = (apr_array_header_t *)(argp9);
{
- arg10 = svn_swig_rb_cancel_func;
+ arg10 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg11 = (void *)svn_swig_rb_make_baton(argv[9], _global_svn_swig_rb_pool);
}
if (argc > 10) {
@@ -29604,7 +28718,7 @@ _wrap_svn_wc_diff4(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_wc_diff_callbacks2();
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_rb_wc_diff_callbacks2();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
@@ -29693,7 +28807,7 @@ _wrap_svn_wc_diff3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_wc_diff_callbacks2();
+ arg3 = (svn_wc_diff_callbacks2_t *) svn_swig_rb_wc_diff_callbacks2();
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
arg5 = RTEST(argv[3]);
@@ -30266,7 +29380,7 @@ _wrap_svn_wc_merge5(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res18), Ruby_Format_TypeError( "", "void *","svn_wc_merge5", 18, argv[16] ));
}
{
- arg19 = svn_swig_rb_cancel_func;
+ arg19 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg20 = (void *)svn_swig_rb_make_baton(argv[17], _global_svn_swig_rb_pool);
}
if (argc > 18) {
@@ -30471,7 +29585,7 @@ _wrap_svn_wc_merge4(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res16), Ruby_Format_TypeError( "", "void *","svn_wc_merge4", 16, argv[14] ));
}
{
- arg17 = svn_swig_rb_cancel_func;
+ arg17 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg18 = (void *)svn_swig_rb_make_baton(argv[15], _global_svn_swig_rb_pool);
}
if (argc > 16) {
@@ -31116,7 +30230,7 @@ _wrap_svn_wc_merge_props3(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res10), Ruby_Format_TypeError( "", "void *","svn_wc_merge_props3", 10, argv[9] ));
}
{
- arg11 = svn_swig_rb_cancel_func;
+ arg11 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg12 = (void *)svn_swig_rb_make_baton(argv[10], _global_svn_swig_rb_pool);
}
if (argc > 11) {
@@ -31754,6 +30868,101 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_wc_cleanup4(int argc, VALUE *argv, VALUE self) {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_boolean_t arg3 ;
+ svn_boolean_t arg4 ;
+ svn_boolean_t arg5 ;
+ svn_boolean_t arg6 ;
+ svn_cancel_func_t arg7 = (svn_cancel_func_t) 0 ;
+ void *arg8 = (void *) 0 ;
+ svn_wc_notify_func2_t arg9 = (svn_wc_notify_func2_t) 0 ;
+ void *arg10 = (void *) 0 ;
+ apr_pool_t *arg11 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg11);
+ _global_pool = arg11;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 8) || (argc > 9)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 8)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_context_t *","svn_wc_cleanup4", 1, argv[0] ));
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_wc_cleanup4", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ arg3 = RTEST(argv[2]);
+ arg4 = RTEST(argv[3]);
+ arg5 = RTEST(argv[4]);
+ arg6 = RTEST(argv[5]);
+ {
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
+ }
+ {
+ arg9 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
+ arg10 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
+ }
+ if (argc > 8) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_cleanup4(arg1,(char const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg8);
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_wc_cleanup3(int argc, VALUE *argv, VALUE self) {
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -31789,7 +30998,7 @@ _wrap_svn_wc_cleanup3(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -31870,7 +31079,7 @@ _wrap_svn_wc_cleanup2(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
if (argc > 3) {
@@ -31959,7 +31168,7 @@ _wrap_svn_wc_cleanup(int argc, VALUE *argv, VALUE self) {
}
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -32055,11 +31264,11 @@ _wrap_svn_wc_upgrade(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "void *","svn_wc_upgrade", 4, argv[3] ));
}
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -32158,7 +31367,7 @@ _wrap_svn_wc_relocate4(int argc, VALUE *argv, VALUE self) {
}
arg4 = (char *)(buf4);
{
- arg5 = svn_swig_rb_wc_relocation_validator3;
+ arg5 = (svn_wc_relocation_validator3_t) svn_swig_rb_wc_relocation_validator3;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -32260,7 +31469,7 @@ _wrap_svn_wc_relocate3(int argc, VALUE *argv, VALUE self) {
arg4 = (char *)(buf4);
arg5 = RTEST(argv[4]);
{
- arg6 = svn_swig_rb_wc_relocation_validator3;
+ arg6 = (svn_wc_relocation_validator3_t) svn_swig_rb_wc_relocation_validator3;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -32525,6 +31734,111 @@ fail:
SWIGINTERN VALUE
+_wrap_svn_wc_revert5(int argc, VALUE *argv, VALUE self) {
+ svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ svn_depth_t arg3 ;
+ svn_boolean_t arg4 ;
+ apr_array_header_t *arg5 = (apr_array_header_t *) 0 ;
+ svn_boolean_t arg6 ;
+ svn_boolean_t arg7 ;
+ svn_cancel_func_t arg8 = (svn_cancel_func_t) 0 ;
+ void *arg9 = (void *) 0 ;
+ svn_wc_notify_func2_t arg10 = (svn_wc_notify_func2_t) 0 ;
+ void *arg11 = (void *) 0 ;
+ apr_pool_t *arg12 = (apr_pool_t *) 0 ;
+ VALUE _global_svn_swig_rb_pool ;
+ apr_pool_t *_global_pool ;
+ void *argp1 = 0 ;
+ int res1 = 0 ;
+ int res2 ;
+ char *buf2 = 0 ;
+ int alloc2 = 0 ;
+ void *argp5 = 0 ;
+ int res5 = 0 ;
+ svn_error_t *result = 0 ;
+ VALUE vresult = Qnil;
+
+ {
+ svn_swig_rb_get_pool(argc, argv, self, &_global_svn_swig_rb_pool, &arg12);
+ _global_pool = arg12;
+ svn_swig_rb_push_pool(_global_svn_swig_rb_pool);
+ }
+ if ((argc < 9) || (argc > 10)) {
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 9)",argc); SWIG_fail;
+ }
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_svn_wc_context_t, 0 | 0 );
+ if (!SWIG_IsOK(res1)) {
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "svn_wc_context_t *","svn_wc_revert5", 1, argv[0] ));
+ }
+ arg1 = (svn_wc_context_t *)(argp1);
+ res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","svn_wc_revert5", 2, argv[1] ));
+ }
+ arg2 = (char *)(buf2);
+ {
+ arg3 = svn_swig_rb_to_depth(argv[2]);
+ }
+ arg4 = RTEST(argv[3]);
+ res5 = SWIG_ConvertPtr(argv[4], &argp5,SWIGTYPE_p_apr_array_header_t, 0 | 0 );
+ if (!SWIG_IsOK(res5)) {
+ SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "apr_array_header_t const *","svn_wc_revert5", 5, argv[4] ));
+ }
+ arg5 = (apr_array_header_t *)(argp5);
+ arg6 = RTEST(argv[5]);
+ arg7 = RTEST(argv[6]);
+ {
+ arg8 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
+ arg9 = (void *)svn_swig_rb_make_baton(argv[7], _global_svn_swig_rb_pool);
+ }
+ {
+ arg10 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
+ arg11 = (void *)svn_swig_rb_make_baton(argv[8], _global_svn_swig_rb_pool);
+ }
+ if (argc > 9) {
+
+ }
+ {
+ result = (svn_error_t *)svn_wc_revert5(arg1,(char const *)arg2,arg3,arg4,(apr_array_header_t const *)arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12);
+
+
+
+ }
+ {
+ if (result) {
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_handle_svn_error(result);
+ }
+ vresult = Qnil;
+ }
+ {
+ svn_swig_rb_set_baton(vresult, (VALUE)arg9);
+ }
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return vresult;
+fail:
+ if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+ {
+ VALUE target;
+ target = _global_vresult_address == &vresult ? self : vresult;
+ if (!svn_swig_rb_set_pool(target, _global_svn_swig_rb_pool))
+ svn_swig_rb_destroy_pool(_global_svn_swig_rb_pool);
+ svn_swig_rb_pop_pool(_global_svn_swig_rb_pool);
+ }
+ return Qnil;
+}
+
+
+SWIGINTERN VALUE
_wrap_svn_wc_revert4(int argc, VALUE *argv, VALUE self) {
svn_wc_context_t *arg1 = (svn_wc_context_t *) 0 ;
char *arg2 = (char *) 0 ;
@@ -32576,11 +31890,11 @@ _wrap_svn_wc_revert4(int argc, VALUE *argv, VALUE self) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -32677,11 +31991,11 @@ _wrap_svn_wc_revert3(int argc, VALUE *argv, VALUE self) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -32768,11 +32082,11 @@ _wrap_svn_wc_revert2(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
- arg7 = svn_swig_rb_notify_func2;
+ arg7 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg8 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
if (argc > 6) {
@@ -32860,7 +32174,7 @@ _wrap_svn_wc_revert(int argc, VALUE *argv, VALUE self) {
arg3 = RTEST(argv[2]);
arg4 = RTEST(argv[3]);
{
- arg5 = svn_swig_rb_cancel_func;
+ arg5 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg6 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
{
@@ -34874,7 +34188,7 @@ _wrap_new_svn_wc_revision_status_t(int argc, VALUE *argv, VALUE self) {
}
arg3 = RTEST(argv[2]);
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -34974,7 +34288,7 @@ _wrap_svn_wc_revision_status2(int argc, VALUE *argv, VALUE self) {
}
arg5 = RTEST(argv[3]);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -35093,11 +34407,11 @@ _wrap_svn_wc_set_changelist2(int argc, VALUE *argv, VALUE self) {
}
arg5 = (apr_array_header_t *)(argp5);
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[5], _global_svn_swig_rb_pool);
}
{
- arg8 = svn_swig_rb_notify_func2;
+ arg8 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg9 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -35184,11 +34498,11 @@ _wrap_svn_wc_set_changelist(int argc, VALUE *argv, VALUE self) {
}
arg3 = (svn_wc_adm_access_t *)(argp3);
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -35294,7 +34608,7 @@ _wrap_svn_wc_get_changelists(int argc, VALUE *argv, VALUE self) {
SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "void *","svn_wc_get_changelists", 6, argv[5] ));
}
{
- arg7 = svn_swig_rb_cancel_func;
+ arg7 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg8 = (void *)svn_swig_rb_make_baton(argv[6], _global_svn_swig_rb_pool);
}
if (argc > 7) {
@@ -35381,11 +34695,11 @@ _wrap_svn_wc_crop_tree2(int argc, VALUE *argv, VALUE self) {
arg3 = svn_swig_rb_to_depth(argv[2]);
}
{
- arg4 = svn_swig_rb_cancel_func;
+ arg4 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
{
- arg6 = svn_swig_rb_notify_func2;
+ arg6 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -35472,11 +34786,11 @@ _wrap_svn_wc_crop_tree(int argc, VALUE *argv, VALUE self) {
arg3 = svn_swig_rb_to_depth(argv[2]);
}
{
- arg4 = svn_swig_rb_notify_func2;
+ arg4 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg5 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
{
- arg6 = svn_swig_rb_cancel_func;
+ arg6 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg7 = (void *)svn_swig_rb_make_baton(argv[4], _global_svn_swig_rb_pool);
}
if (argc > 5) {
@@ -35559,11 +34873,11 @@ _wrap_svn_wc_exclude(int argc, VALUE *argv, VALUE self) {
}
arg2 = (char *)(buf2);
{
- arg3 = svn_swig_rb_cancel_func;
+ arg3 = (svn_cancel_func_t) svn_swig_rb_cancel_func;
arg4 = (void *)svn_swig_rb_make_baton(argv[2], _global_svn_swig_rb_pool);
}
{
- arg5 = svn_swig_rb_notify_func2;
+ arg5 = (svn_wc_notify_func2_t) svn_swig_rb_notify_func2;
arg6 = (void *)svn_swig_rb_make_baton(argv[3], _global_svn_swig_rb_pool);
}
if (argc > 4) {
@@ -41701,18 +41015,18 @@ static swig_cast_info *swig_cast_initial[] = {
/* -----------------------------------------------------------------------------
* Type initialization:
- * This problem is tough by the requirement that no dynamic
- * memory is used. Also, since swig_type_info structures store pointers to
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
* swig_cast_info structures and swig_cast_info structures store pointers back
- * to swig_type_info structures, we need some lookup code at initialization.
- * The idea is that swig generates all the structures that are needed.
- * The runtime then collects these partially filled structures.
- * The SWIG_InitializeModule function takes these initial arrays out of
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
* swig_module, and does all the lookup, filling in the swig_module.types
* array with the correct data and linking the correct swig_cast_info
* structures together.
*
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned staticly to an initial
* array. We just loop through that array, and handle each type individually.
* First we lookup if this type has been already loaded, and if so, use the
* loaded structure instead of the generated one. Then we have to fill in the
@@ -41722,17 +41036,17 @@ static swig_cast_info *swig_cast_initial[] = {
* a column is one of the swig_cast_info structures for that type.
* The cast_initial array is actually an array of arrays, because each row has
* a variable number of columns. So to actually build the cast linked list,
- * we find the array of casts associated with the type, and loop through it
+ * we find the array of casts associated with the type, and loop through it
* adding the casts to the list. The one last trick we need to do is making
* sure the type pointer in the swig_cast_info struct is correct.
*
- * First off, we lookup the cast->type name to see if it is already loaded.
+ * First off, we lookup the cast->type name to see if it is already loaded.
* There are three cases to handle:
* 1) If the cast->type has already been loaded AND the type we are adding
* casting info to has not been loaded (it is in this module), THEN we
* replace the cast->type pointer with the type pointer that has already
* been loaded.
- * 2) If BOTH types (the one we are adding casting info to, and the
+ * 2) If BOTH types (the one we are adding casting info to, and the
* cast->type) are loaded, THEN the cast info has already been loaded by
* the previous module so we just ignore it.
* 3) Finally, if cast->type has not already been loaded, then we add that
@@ -41795,7 +41109,7 @@ SWIG_InitializeModule(void *clientdata) {
module_head->next = &swig_module;
}
- /* When multiple interpeters are used, a module could have already been initialized in
+ /* When multiple interpreters are used, a module could have already been initialized in
a different interpreter, but not yet have a pointer in this interpreter.
In this case, we do not want to continue adding types... everything should be
set up already */
@@ -41809,7 +41123,7 @@ SWIG_InitializeModule(void *clientdata) {
swig_type_info *type = 0;
swig_type_info *ret;
swig_cast_info *cast;
-
+
#ifdef SWIGRUNTIME_DEBUG
printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
@@ -41836,7 +41150,7 @@ SWIG_InitializeModule(void *clientdata) {
/* Insert casting types */
cast = swig_module.cast_initial[i];
while (cast->type) {
-
+
/* Don't need to add information already in the list */
ret = 0;
#ifdef SWIGRUNTIME_DEBUG
@@ -42101,6 +41415,10 @@ SWIGEXPORT void Init_wc(void) {
rb_define_const(mWc, "Svn_wc_notify_left_local_modifications", SWIG_From_int((int)(svn_wc_notify_left_local_modifications)));
rb_define_const(mWc, "Svn_wc_notify_foreign_copy_begin", SWIG_From_int((int)(svn_wc_notify_foreign_copy_begin)));
rb_define_const(mWc, "Svn_wc_notify_move_broken", SWIG_From_int((int)(svn_wc_notify_move_broken)));
+ rb_define_const(mWc, "Svn_wc_notify_cleanup_external", SWIG_From_int((int)(svn_wc_notify_cleanup_external)));
+ rb_define_const(mWc, "Svn_wc_notify_failed_requires_target", SWIG_From_int((int)(svn_wc_notify_failed_requires_target)));
+ rb_define_const(mWc, "Svn_wc_notify_info_external", SWIG_From_int((int)(svn_wc_notify_info_external)));
+ rb_define_const(mWc, "Svn_wc_notify_commit_finalizing", SWIG_From_int((int)(svn_wc_notify_commit_finalizing)));
rb_define_const(mWc, "Svn_wc_notify_state_inapplicable", SWIG_From_int((int)(svn_wc_notify_state_inapplicable)));
rb_define_const(mWc, "Svn_wc_notify_state_unknown", SWIG_From_int((int)(svn_wc_notify_state_unknown)));
rb_define_const(mWc, "Svn_wc_notify_state_unchanged", SWIG_From_int((int)(svn_wc_notify_state_unchanged)));
@@ -42214,44 +41532,6 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_conflict_version_create", _wrap_svn_wc_conflict_version_create, -1);
rb_define_module_function(mWc, "svn_wc_conflict_version_dup", _wrap_svn_wc_conflict_version_dup, -1);
- SwigClassSvn_wc_conflict_description2_t.klass = rb_define_class_under(mWc, "Svn_wc_conflict_description2_t", rb_cObject);
- SWIG_TypeClientData(SWIGTYPE_p_svn_wc_conflict_description2_t, (void *) &SwigClassSvn_wc_conflict_description2_t);
- rb_define_alloc_func(SwigClassSvn_wc_conflict_description2_t.klass, _wrap_svn_wc_conflict_description2_t_allocate);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "initialize", _wrap_new_svn_wc_conflict_description2_t, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "local_abspath=", _wrap_svn_wc_conflict_description2_t_local_abspath_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "local_abspath", _wrap_svn_wc_conflict_description2_t_local_abspath_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "node_kind=", _wrap_svn_wc_conflict_description2_t_node_kind_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "node_kind", _wrap_svn_wc_conflict_description2_t_node_kind_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "kind=", _wrap_svn_wc_conflict_description2_t_kind_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "kind", _wrap_svn_wc_conflict_description2_t_kind_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "property_name=", _wrap_svn_wc_conflict_description2_t_property_name_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "property_name", _wrap_svn_wc_conflict_description2_t_property_name_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "is_binary=", _wrap_svn_wc_conflict_description2_t_is_binary_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "is_binary", _wrap_svn_wc_conflict_description2_t_is_binary_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "mime_type=", _wrap_svn_wc_conflict_description2_t_mime_type_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "mime_type", _wrap_svn_wc_conflict_description2_t_mime_type_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "action=", _wrap_svn_wc_conflict_description2_t_action_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "action", _wrap_svn_wc_conflict_description2_t_action_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "reason=", _wrap_svn_wc_conflict_description2_t_reason_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "reason", _wrap_svn_wc_conflict_description2_t_reason_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "base_abspath=", _wrap_svn_wc_conflict_description2_t_base_abspath_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "base_abspath", _wrap_svn_wc_conflict_description2_t_base_abspath_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "their_abspath=", _wrap_svn_wc_conflict_description2_t_their_abspath_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "their_abspath", _wrap_svn_wc_conflict_description2_t_their_abspath_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "my_abspath=", _wrap_svn_wc_conflict_description2_t_my_abspath_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "my_abspath", _wrap_svn_wc_conflict_description2_t_my_abspath_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "merged_file=", _wrap_svn_wc_conflict_description2_t_merged_file_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "merged_file", _wrap_svn_wc_conflict_description2_t_merged_file_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "operation=", _wrap_svn_wc_conflict_description2_t_operation_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "operation", _wrap_svn_wc_conflict_description2_t_operation_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "src_left_version=", _wrap_svn_wc_conflict_description2_t_src_left_version_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "src_left_version", _wrap_svn_wc_conflict_description2_t_src_left_version_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "src_right_version=", _wrap_svn_wc_conflict_description2_t_src_right_version_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_description2_t.klass, "src_right_version", _wrap_svn_wc_conflict_description2_t_src_right_version_get, -1);
- SwigClassSvn_wc_conflict_description2_t.mark = 0;
- SwigClassSvn_wc_conflict_description2_t.destroy = (void (*)(void *)) free_svn_wc_conflict_description2_t;
- SwigClassSvn_wc_conflict_description2_t.trackObjects = 0;
-
SwigClassSvn_wc_conflict_description_t.klass = rb_define_class_under(mWc, "Svn_wc_conflict_description_t", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p_svn_wc_conflict_description_t, (void *) &SwigClassSvn_wc_conflict_description_t);
rb_define_alloc_func(SwigClassSvn_wc_conflict_description_t.klass, _wrap_svn_wc_conflict_description_t_allocate);
@@ -42297,7 +41577,9 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_conflict_description_create_prop", _wrap_svn_wc_conflict_description_create_prop, -1);
rb_define_module_function(mWc, "svn_wc_conflict_description_create_tree2", _wrap_svn_wc_conflict_description_create_tree2, -1);
rb_define_module_function(mWc, "svn_wc_conflict_description_create_tree", _wrap_svn_wc_conflict_description_create_tree, -1);
+ rb_define_module_function(mWc, "svn_wc_conflict_description2_dup", _wrap_svn_wc_conflict_description2_dup, -1);
rb_define_module_function(mWc, "svn_wc__conflict_description2_dup", _wrap_svn_wc__conflict_description2_dup, -1);
+ rb_define_const(mWc, "Svn_wc_conflict_choose_undefined", SWIG_From_int((int)(svn_wc_conflict_choose_undefined)));
rb_define_const(mWc, "Svn_wc_conflict_choose_postpone", SWIG_From_int((int)(svn_wc_conflict_choose_postpone)));
rb_define_const(mWc, "Svn_wc_conflict_choose_base", SWIG_From_int((int)(svn_wc_conflict_choose_base)));
rb_define_const(mWc, "Svn_wc_conflict_choose_theirs_full", SWIG_From_int((int)(svn_wc_conflict_choose_theirs_full)));
@@ -42306,20 +41588,6 @@ SWIGEXPORT void Init_wc(void) {
rb_define_const(mWc, "Svn_wc_conflict_choose_mine_conflict", SWIG_From_int((int)(svn_wc_conflict_choose_mine_conflict)));
rb_define_const(mWc, "Svn_wc_conflict_choose_merged", SWIG_From_int((int)(svn_wc_conflict_choose_merged)));
rb_define_const(mWc, "Svn_wc_conflict_choose_unspecified", SWIG_From_int((int)(svn_wc_conflict_choose_unspecified)));
-
- SwigClassSvn_wc_conflict_result_t.klass = rb_define_class_under(mWc, "Svn_wc_conflict_result_t", rb_cObject);
- SWIG_TypeClientData(SWIGTYPE_p_svn_wc_conflict_result_t, (void *) &SwigClassSvn_wc_conflict_result_t);
- rb_define_alloc_func(SwigClassSvn_wc_conflict_result_t.klass, _wrap_svn_wc_conflict_result_t_allocate);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "initialize", _wrap_new_svn_wc_conflict_result_t, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "choice=", _wrap_svn_wc_conflict_result_t_choice_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "choice", _wrap_svn_wc_conflict_result_t_choice_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "merged_file=", _wrap_svn_wc_conflict_result_t_merged_file_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "merged_file", _wrap_svn_wc_conflict_result_t_merged_file_get, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "save_merged=", _wrap_svn_wc_conflict_result_t_save_merged_set, -1);
- rb_define_method(SwigClassSvn_wc_conflict_result_t.klass, "save_merged", _wrap_svn_wc_conflict_result_t_save_merged_get, -1);
- SwigClassSvn_wc_conflict_result_t.mark = 0;
- SwigClassSvn_wc_conflict_result_t.destroy = (void (*)(void *)) free_svn_wc_conflict_result_t;
- SwigClassSvn_wc_conflict_result_t.trackObjects = 0;
rb_define_module_function(mWc, "svn_wc_create_conflict_result", _wrap_svn_wc_create_conflict_result, -1);
SwigClassSvn_wc_diff_callbacks4_t.klass = rb_define_class_under(mWc, "Svn_wc_diff_callbacks4_t", rb_cObject);
@@ -42661,6 +41929,8 @@ SWIGEXPORT void Init_wc(void) {
rb_define_method(SwigClassSvn_wc_status3_t.klass, "moved_to_abspath", _wrap_svn_wc_status3_t_moved_to_abspath_get, -1);
rb_define_method(SwigClassSvn_wc_status3_t.klass, "file_external=", _wrap_svn_wc_status3_t_file_external_set, -1);
rb_define_method(SwigClassSvn_wc_status3_t.klass, "file_external", _wrap_svn_wc_status3_t_file_external_get, -1);
+ rb_define_method(SwigClassSvn_wc_status3_t.klass, "actual_kind=", _wrap_svn_wc_status3_t_actual_kind_set, -1);
+ rb_define_method(SwigClassSvn_wc_status3_t.klass, "actual_kind", _wrap_svn_wc_status3_t_actual_kind_get, -1);
SwigClassSvn_wc_status3_t.mark = 0;
SwigClassSvn_wc_status3_t.destroy = (void (*)(void *)) free_svn_wc_status3_t;
SwigClassSvn_wc_status3_t.trackObjects = 0;
@@ -42753,6 +42023,7 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_delete3", _wrap_svn_wc_delete3, -1);
rb_define_module_function(mWc, "svn_wc_delete2", _wrap_svn_wc_delete2, -1);
rb_define_module_function(mWc, "svn_wc_delete", _wrap_svn_wc_delete, -1);
+ rb_define_module_function(mWc, "svn_wc_add_from_disk3", _wrap_svn_wc_add_from_disk3, -1);
rb_define_module_function(mWc, "svn_wc_add_from_disk2", _wrap_svn_wc_add_from_disk2, -1);
rb_define_module_function(mWc, "svn_wc_add_from_disk", _wrap_svn_wc_add_from_disk, -1);
rb_define_module_function(mWc, "svn_wc_add4", _wrap_svn_wc_add4, -1);
@@ -42770,6 +42041,7 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_resolved_conflict3", _wrap_svn_wc_resolved_conflict3, -1);
rb_define_module_function(mWc, "svn_wc_resolved_conflict2", _wrap_svn_wc_resolved_conflict2, -1);
rb_define_module_function(mWc, "svn_wc_resolved_conflict", _wrap_svn_wc_resolved_conflict, -1);
+ rb_define_module_function(mWc, "svn_wc_queue_committed4", _wrap_svn_wc_queue_committed4, -1);
rb_define_module_function(mWc, "svn_wc_queue_committed3", _wrap_svn_wc_queue_committed3, -1);
rb_define_module_function(mWc, "svn_wc_queue_committed2", _wrap_svn_wc_queue_committed2, -1);
rb_define_module_function(mWc, "svn_wc_queue_committed", _wrap_svn_wc_queue_committed, -1);
@@ -42840,6 +42112,7 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_get_pristine_contents2", _wrap_svn_wc_get_pristine_contents2, -1);
rb_define_module_function(mWc, "svn_wc_get_pristine_contents", _wrap_svn_wc_get_pristine_contents, -1);
rb_define_module_function(mWc, "svn_wc_get_pristine_copy_path", _wrap_svn_wc_get_pristine_copy_path, -1);
+ rb_define_module_function(mWc, "svn_wc_cleanup4", _wrap_svn_wc_cleanup4, -1);
rb_define_module_function(mWc, "svn_wc_cleanup3", _wrap_svn_wc_cleanup3, -1);
rb_define_module_function(mWc, "svn_wc_cleanup2", _wrap_svn_wc_cleanup2, -1);
rb_define_module_function(mWc, "svn_wc_cleanup", _wrap_svn_wc_cleanup, -1);
@@ -42848,6 +42121,7 @@ SWIGEXPORT void Init_wc(void) {
rb_define_module_function(mWc, "svn_wc_relocate3", _wrap_svn_wc_relocate3, -1);
rb_define_module_function(mWc, "svn_wc_relocate2", _wrap_svn_wc_relocate2, -1);
rb_define_module_function(mWc, "svn_wc_relocate", _wrap_svn_wc_relocate, -1);
+ rb_define_module_function(mWc, "svn_wc_revert5", _wrap_svn_wc_revert5, -1);
rb_define_module_function(mWc, "svn_wc_revert4", _wrap_svn_wc_revert4, -1);
rb_define_module_function(mWc, "svn_wc_revert3", _wrap_svn_wc_revert3, -1);
rb_define_module_function(mWc, "svn_wc_revert2", _wrap_svn_wc_revert2, -1);
diff --git a/subversion/bindings/swig/ruby/test/my-assertions.rb b/subversion/bindings/swig/ruby/test/my-assertions.rb
index 77c42e7..0aa3d94 100644
--- a/subversion/bindings/swig/ruby/test/my-assertions.rb
+++ b/subversion/bindings/swig/ruby/test/my-assertions.rb
@@ -27,9 +27,7 @@ module Test
# make an intermediary assertion block handler
def _my_assert_block(&block)
if RUBY_VERSION > '1.9'
- assert_block do
- yield
- end
+ yield
else
_wrap_assertion do
yield
diff --git a/subversion/bindings/swig/ruby/test/test_client.rb b/subversion/bindings/swig/ruby/test/test_client.rb
index 9c97567..7f3343b 100644
--- a/subversion/bindings/swig/ruby/test/test_client.rb
+++ b/subversion/bindings/swig/ruby/test/test_client.rb
@@ -179,7 +179,9 @@ class SvnClientTest < Test::Unit::TestCase
infos = []
ctx.set_notify_func do |notify|
- infos << [notify.path, notify]
+ if notify.action != Svn::Wc::NOTIFY_COMMIT_FINALIZING
+ infos << [notify.path, notify]
+ end
end
assert_equal([false, false], dirs_path.collect {|path| path.exist?})
@@ -223,7 +225,9 @@ class SvnClientTest < Test::Unit::TestCase
infos = []
ctx.set_notify_func do |notify|
- infos << [notify.path, notify]
+ if notify.action != Svn::Wc::NOTIFY_COMMIT_FINALIZING
+ infos << [notify.path, notify]
+ end
end
assert_equal([false, false], [dir_path.exist?, child_dir_path.exist?])
@@ -1155,7 +1159,8 @@ class SvnClientTest < Test::Unit::TestCase
ctx.relocate(@wc_path, @repos_uri, @repos_svnserve_uri)
make_context(log) do |ctx|
- assert_raises(Svn::Error::AuthnNoProvider) do
+ # ### TODO: Verify Svn::Error::AuthnNoProvider in error chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.cat(path)
end
end
@@ -1227,10 +1232,12 @@ class SvnClientTest < Test::Unit::TestCase
end
ctx.ci(@wc_path)
- assert_equal([full_path2.to_s].sort,
+ assert_equal([full_path2.to_s, '.'].sort,
infos.collect{|path, notify| path}.sort)
path2_notify = infos.assoc(full_path2.to_s)[1]
assert(path2_notify.commit_added?)
+ finalizing_notify = infos.assoc('.')[1]
+ assert(finalizing_notify.action == Svn::Wc::NOTIFY_COMMIT_FINALIZING)
assert_equal(File.open(path1) {|f| f.read},
File.open(path2) {|f| f.read})
end
@@ -1258,12 +1265,16 @@ class SvnClientTest < Test::Unit::TestCase
end
ctx.ci(@wc_path)
- assert_equal([path1, path2].sort.collect{|p|File.expand_path(p)},
+ assert_equal([path1, path2].collect do |p|
+ File.expand_path(p)
+ end.push('.').sort,
infos.collect{|path, notify| path}.sort)
path1_notify = infos.assoc(File.expand_path(path1))[1]
assert(path1_notify.commit_deleted?)
path2_notify = infos.assoc(File.expand_path(path2))[1]
assert(path2_notify.commit_added?)
+ finalizing_notify = infos.assoc('.')[1]
+ assert(finalizing_notify.action == Svn::Wc::NOTIFY_COMMIT_FINALIZING)
assert_equal(src, File.open(path2) {|f| f.read})
end
end
@@ -1302,7 +1313,9 @@ class SvnClientTest < Test::Unit::TestCase
paths = notifies.collect do |notify|
notify.path
end
- assert_equal([path1, path2, path2].sort.collect{|p|File.expand_path(p)},
+ assert_equal([path1, path2, path2].collect do |p|
+ File.expand_path(p)
+ end.push('.').sort,
paths.sort)
deleted_paths = notifies.find_all do |notify|
@@ -1329,6 +1342,13 @@ class SvnClientTest < Test::Unit::TestCase
assert_equal([path2].sort.collect{|p|File.expand_path(p)},
postfix_txdelta_paths.sort)
+ finalizing_paths = notifies.find_all do |notify|
+ notify.action == Svn::Wc::NOTIFY_COMMIT_FINALIZING
+ end.collect do |notify|
+ notify.path
+ end
+ assert_equal(['.'], finalizing_paths)
+
assert_equal(src2, File.open(path2) {|f| f.read})
end
end
@@ -2022,7 +2042,8 @@ class SvnClientTest < Test::Unit::TestCase
end
Svn::Client::Context.new do |ctx|
- assert_raises(Svn::Error::AuthnNoProvider) do
+ # ### TODO: Verify Svn::Error::AuthnNoProvider in error chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.cat(svnserve_uri)
end
@@ -2031,7 +2052,8 @@ class SvnClientTest < Test::Unit::TestCase
cred.password = @password
cred.may_save = false
end
- assert_raises(Svn::Error::RaNotAuthorized) do
+ # ### TODO: Verify Svn::Error::RaNotAuthorized in error chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.cat(svnserve_uri)
end
@@ -2040,7 +2062,8 @@ class SvnClientTest < Test::Unit::TestCase
cred.password = "wrong-#{@password}"
cred.may_save = false
end
- assert_raises(Svn::Error::RaNotAuthorized) do
+ # ### TODO: Verify Svn::Error::RaNotAuthorized in error chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.cat(svnserve_uri)
end
@@ -2071,7 +2094,8 @@ class SvnClientTest < Test::Unit::TestCase
ctx = Svn::Client::Context.new
setup_auth_baton(ctx.auth_baton)
ctx.send(method)
- assert_raises(Svn::Error::RaNotAuthorized) do
+ # ### Verify Svn::Error::RaNotAuthorized in chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.cat(svnserve_uri)
end
@@ -2219,8 +2243,8 @@ class SvnClientTest < Test::Unit::TestCase
items = nil
ctx.cp(path, repos_uri2)
- assert_equal([nil], items.collect {|item| item.wcprop_changes})
- assert_equal([nil], items.collect {|item| item.incoming_prop_changes})
+ assert_equal([[]], items.collect {|item| item.wcprop_changes})
+ assert_equal([[]], items.collect {|item| item.incoming_prop_changes})
assert_equal([nil], items.collect {|item| item.outgoing_prop_changes})
end
end
@@ -2493,7 +2517,7 @@ class SvnClientTest < Test::Unit::TestCase
assert_not_nil(info)
assert_equal(3, info.revision)
- assert_equal("<<<<<<< .mine\nafter\n=======\nbefore\n>>>>>>> .r2\n",
+ assert_equal("<<<<<<< .mine\nafter\n||||||| .r1\n=======\nbefore\n>>>>>>> .r2\n",
File.read(path))
end
end
diff --git a/subversion/bindings/swig/ruby/test/test_core.rb b/subversion/bindings/swig/ruby/test/test_core.rb
index 5f05448..9d5743c 100644
--- a/subversion/bindings/swig/ruby/test/test_core.rb
+++ b/subversion/bindings/swig/ruby/test/test_core.rb
@@ -33,9 +33,9 @@ class SvnCoreTest < Test::Unit::TestCase
setup_default_variables
@config_file = File.join(@config_path, Svn::Core::CONFIG_CATEGORY_CONFIG)
@servers_file = File.join(@config_path, Svn::Core::CONFIG_CATEGORY_SERVERS)
+ setup_tmp
setup_repository(@repos_path)
setup_config
- setup_tmp
end
def teardown
diff --git a/subversion/bindings/swig/ruby/test/test_fs.rb b/subversion/bindings/swig/ruby/test/test_fs.rb
index 2c693a1..8808055 100644
--- a/subversion/bindings/swig/ruby/test/test_fs.rb
+++ b/subversion/bindings/swig/ruby/test/test_fs.rb
@@ -110,7 +110,8 @@ class SvnFsTest < Test::Unit::TestCase
FileUtils.mkdir_p(fs_path)
make_context(log) do |ctx|
- assert_raises(Svn::Error::RaLocalReposOpenFailed) do
+ # ### Verify Svn::Error::RaLocalReposOpenFailed in chain
+ assert_raises(Svn::Error::RaCannotCreateSession) do
ctx.log_message(path, rev)
end
@@ -209,10 +210,14 @@ class SvnFsTest < Test::Unit::TestCase
ctx.commit(@wc_path)
end
- assert_raises(Svn::Error::FsNoSuchTransaction) do
+ assert_raises(Svn::Error::FsMalformedTxnId) do
@fs.open_txn("NOT-EXIST")
end
+ assert_raises(Svn::Error::FsNoSuchTransaction) do
+ @fs.open_txn("9-9")
+ end
+
start_time = Time.now
txn1 = @fs.transaction
assert_equal([Svn::Core::PROP_REVISION_DATE], txn1.proplist.keys)
diff --git a/subversion/bindings/swig/ruby/test/test_ra.rb b/subversion/bindings/swig/ruby/test/test_ra.rb
index 7fbbe16..1d20ca4 100644
--- a/subversion/bindings/swig/ruby/test/test_ra.rb
+++ b/subversion/bindings/swig/ruby/test/test_ra.rb
@@ -38,8 +38,7 @@ class SvnRaTest < Test::Unit::TestCase
def test_uuid
Svn::Ra::Session.open(@repos_uri) do |session|
- assert_equal(File.read(File.join(@repos_path, "db", "uuid")).strip,
- session.uuid)
+ assert_equal(@repos.fs.uuid, session.uuid)
end
end
diff --git a/subversion/bindings/swig/ruby/test/test_repos.rb b/subversion/bindings/swig/ruby/test/test_repos.rb
index 89ca8c1..1c0c366 100644
--- a/subversion/bindings/swig/ruby/test/test_repos.rb
+++ b/subversion/bindings/swig/ruby/test/test_repos.rb
@@ -679,7 +679,7 @@ class SvnReposTest < Test::Unit::TestCase
dest_path = File.join(@tmp_path, "dest")
Svn::Repos.create(dest_path) do |repos|
assert_raises(NoMethodError) do
- repos.load_fs(nil)
+ repos.load_fs(Object.new)
end
end
diff --git a/subversion/bindings/swig/ruby/test/test_wc.rb b/subversion/bindings/swig/ruby/test/test_wc.rb
index 3a2aa65..763cbf6 100644
--- a/subversion/bindings/swig/ruby/test/test_wc.rb
+++ b/subversion/bindings/swig/ruby/test/test_wc.rb
@@ -1068,15 +1068,10 @@ EOE
def test_context_create
assert_nothing_raised do
- result = Svn::Wc::Context.create do |context|
+ Svn::Wc::Context.create do |context|
assert_not_nil context
assert_kind_of Svn::Wc::Context, context
end
- if RUBY_VERSION > '1.9'
- assert_equal(result,true)
- else
- assert_nil result
- end
end
end
diff --git a/subversion/bindings/swig/ruby/test/util.rb b/subversion/bindings/swig/ruby/test/util.rb
index ee1a7ac..06ae7ba 100644
--- a/subversion/bindings/swig/ruby/test/util.rb
+++ b/subversion/bindings/swig/ruby/test/util.rb
@@ -1,4 +1,4 @@
-# ====================================================================
+# ====================================================================
# 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
@@ -79,10 +79,11 @@ module SvnTestUtil
@wc_path = File.join(@tmp_path, "wc")
@import_path = File.join(@tmp_path, "import")
@repos_path = File.join(@tmp_path, "repos")
+ @svnserve_pid_file = File.join(@tmp_path, "svnserve.pid")
@full_repos_path = File.expand_path(@repos_path)
@repos_uri = "file://#{@full_repos_path.sub(/^\/?/, '/')}"
- @config_path = "config"
+ @config_path = File.join(@tmp_path, "config")
@greek = Greek.new(@tmp_path, @import_path, @wc_path, @repos_uri)
end
@@ -90,7 +91,7 @@ module SvnTestUtil
@need_svnserve = need_svnserve
setup_default_variables
setup_tmp
- setup_tmp(@import_path)
+ setup_tmp(@import_path)
setup_repository
add_hooks
setup_svnserve if @need_svnserve
@@ -233,6 +234,7 @@ realm = #{@realm}
cred.username = @author
cred.may_save = false
end
+ ctx.config = Svn::Core::Config.config(@config_path)
setup_auth_baton(ctx.auth_baton)
return ctx unless block_given?
begin
diff --git a/subversion/bindings/swig/ruby/test/windows_util.rb b/subversion/bindings/swig/ruby/test/windows_util.rb
index 793d096..726527a 100644
--- a/subversion/bindings/swig/ruby/test/windows_util.rb
+++ b/subversion/bindings/swig/ruby/test/windows_util.rb
@@ -34,149 +34,34 @@ module SvnTestUtil
end
end
- def service_control(command, args={})
- args = args.collect do |key, value|
- "#{key}= #{Svnserve.escape_value(value)}"
- end.join(" ")
- result = `sc #{command} #{service_name} #{args}`
- if result.match(/FAILED/)
- raise "Failed to #{command} #{service_name}: #{args}"
- end
- /^\s*STATE\s*:\s\d+\s*(.*?)\s*$/ =~ result
- $1
- end
-
- def grant_everyone_full_access(dir)
- dir = dir.tr(File::SEPARATOR, File::ALT_SEPARATOR)
- `cacls #{Svnserve.escape_value(dir)} /T /E /P Everyone:F`
- end
-
- def service_exists?
- begin
- service_control("query")
- true
- rescue
- false
- end
- end
-
- def service_stopped?
- "STOPPED" == service_control("query") rescue true
- end
-
def setup_svnserve
@svnserve_port = @svnserve_ports.last
@repos_svnserve_uri = "svn://#{@svnserve_host}:#{@svnserve_port}"
- grant_everyone_full_access(@full_repos_path)
@@service_created ||= begin
@@service_created = true
- service_control('stop') unless service_stopped?
- service_control('delete') if service_exists?
-
- svnserve_dir = File.expand_path("svnserve")
- FileUtils.mkdir_p(svnserve_dir)
- at_exit do
- service_control('stop') unless service_stopped?
- service_control('delete') if service_exists?
- FileUtils.rm_rf(svnserve_dir)
- end
- trap("INT") do
- service_control('stop') unless service_stopped?
- service_control('delete') if service_exists?
- FileUtils.rm_rf(svnserve_dir)
- end
- config = SetupEnvironment.gen_make_opts
- apr_version_include = Pathname.new(config["--with-apr"]) +
- 'include' + 'apr_version.h'
- %r'^\s*#define\s+APR_MAJOR_VERSION\s+(\d+)' =~ apr_version_include.read
- apr_major_version = $1 == '0' ? '' : "-#{$1}"
-
- cwd = Dir.getwd
- targets = %W(svnserve.exe libsvn_subr-1.dll libsvn_repos-1.dll
- libsvn_fs-1.dll libsvn_delta-1.dll
- libaprutil#{apr_major_version}.dll
- libapr#{apr_major_version}.dll
- libapriconv#{apr_major_version}.dll
- libdb??.dll libdb??d.dll)
- ENV["PATH"].split(";").each do |path|
-
- # Change the cwd to path, but ignore non-existent paths.
- begin
- Dir.chdir(path)
- rescue Errno::ENOENT
- next
- end
-
- found_targets = []
- targets.each do |target|
- matching_paths = Dir.glob(target)
- matching_paths.each do |target_path|
- target_path = File.join(path.tr('\\', '/'), target_path)
- if File.exists?(target_path)
- found_targets << target
- retried = 0
- begin
- FileUtils.cp(target_path, svnserve_dir)
- rescue Errno::EACCES
- # On Windows the tests frequently fail spuriously with a
- # 'Errno::EACCES: Permission denied - svnserve.exe' error.
- # Sleeping for a few seconds avoids this.
- if retried > 5
- # Give up!
- raise
- else
- # Wait a sec...
- sleep(1)
- retried += 1
- retry
- end
- end
- end
- end
- end
- targets -= found_targets
- break if targets.empty?
- end
- Dir.chdir(cwd)
- # Remove optional targets instead of raising below. If they are really
- # needed, svnserve won't start anyway.
- targets -= %W[libapriconv#{apr_major_version}.dll]
- # Ditto these four, since svnserve.exe might be a static build.
- targets -= %W[libsvn_subr-1.dll]
- targets -= %W[libsvn_repos-1.dll]
- targets -= %W[libsvn_fs-1.dll]
- targets -= %W[libsvn_delta-1.dll]
-
- unless targets.empty?
- raise "can't find libraries to work svnserve: #{targets.join(' ')}"
- end
-
- grant_everyone_full_access(svnserve_dir)
-
- svnserve_path = File.join(svnserve_dir, "svnserve.exe")
- svnserve_path = svnserve_path.tr(File::SEPARATOR,
- File::ALT_SEPARATOR)
+ top_directory = File.join(File.dirname(__FILE__), "..", "..", "..", "..", "..")
+ build_type = ENV["BUILD_TYPE"] || "Release"
+ svnserve_path = File.join(top_directory, build_type, 'subversion', 'svnserve', 'svnserve.exe')
svnserve_path = Svnserve.escape_value(svnserve_path)
root = @full_repos_path.tr(File::SEPARATOR, File::ALT_SEPARATOR)
+ FileUtils.mkdir_p(root)
- args = ["--service", "--root", Svnserve.escape_value(root),
- "--listen-host", @svnserve_host,
- "--listen-port", @svnserve_port]
+ IO.popen("#{svnserve_path} -d -r #{Svnserve.escape_value(root)} --listen-host #{@svnserve_host} --listen-port #{@svnserve_port} --pid-file #{@svnserve_pid_file}")
user = ENV["USERNAME"] || Etc.getlogin
- service_control('create',
- [["binPath", "#{svnserve_path} #{args.join(' ')}"],
- ["DisplayName", service_name],
- ["type", "own"]])
+
+ # Give svnserve a bit of time to start
+ sleep 1
end
- service_control('start')
true
end
def teardown_svnserve
- service_control('stop') unless service_stopped?
+ # TODO:
+ # Load @svnserve_pid_file
+ # Kill process
end
def add_pre_revprop_change_hook
diff --git a/subversion/bindings/swig/svn_client.i b/subversion/bindings/swig/svn_client.i
index 432ae55..1b017c3 100644
--- a/subversion/bindings/swig/svn_client.i
+++ b/subversion/bindings/swig/svn_client.i
@@ -170,13 +170,6 @@
svn_swig_rb_get_commit_log_func)
#endif
-#ifdef SWIGRUBY
-%callback_typemap(svn_cancel_func_t cancel_func, void *cancel_baton,
- ,
- ,
- svn_swig_rb_cancel_func)
-#endif
-
%callback_typemap(svn_client_blame_receiver_t receiver, void *receiver_baton,
svn_swig_py_client_blame_receiver_func,
svn_swig_pl_blame_func,
@@ -300,8 +293,9 @@ Callback: svn_client_diff_summarize_func_t
*/
#ifdef SWIGPERL
%typemap(in) apr_hash_t *config {
- $1 = svn_swig_pl_objs_to_hash_by_name ($input, "svn_config_t *",
- svn_swig_pl_make_pool ((SV *)NULL));
+ apr_pool_t *pool = svn_swig_pl_make_pool ((SV *)NULL);
+ SPAGAIN;
+ $1 = svn_swig_pl_objs_to_hash_by_name ($input, "svn_config_t *", pool);
}
%typemap(out) apr_hash_t *config {
@@ -448,13 +442,13 @@ Callback: svn_client_diff_summarize_func_t
self = apr_palloc(pool, sizeof(*self));
self->path = path ? apr_pstrdup(pool, path) : NULL;
- revision = apr_palloc(pool, sizeof(revision));
+ revision = apr_palloc(pool, sizeof(*revision));
revision->kind = rev->kind;
revision->value.number = rev->value.number;
revision->value.date = rev->value.date;
self->revision = revision;
- peg_revision = apr_palloc(pool, sizeof(peg_revision));
+ peg_revision = apr_palloc(pool, sizeof(*peg_revision));
peg_revision->kind = peg_rev->kind;
peg_revision->value.number = peg_rev->value.number;
peg_revision->value.date = peg_rev->value.date;
diff --git a/subversion/bindings/swig/svn_delta.i b/subversion/bindings/swig/svn_delta.i
index ddcd714..f69b76e 100644
--- a/subversion/bindings/swig/svn_delta.i
+++ b/subversion/bindings/swig/svn_delta.i
@@ -63,6 +63,9 @@
*/
#ifdef SWIGPYTHON
+/* Make swig wrap this function for us, to allow making an editor in python
+ ### There must be a cleaner way to implement this?
+ ### Maybe follow Ruby by wrapping it where passing an editor? */
void svn_swig_py_make_editor(const svn_delta_editor_t **editor,
void **edit_baton,
PyObject *py_editor,
@@ -71,14 +74,8 @@ void svn_swig_py_make_editor(const svn_delta_editor_t **editor,
#ifdef SWIGPERL
%typemap(in) (const svn_delta_editor_t *EDITOR, void *BATON) {
- svn_delta_make_editor(&$1, &$2, $input, _global_pool);
+ svn_swig_pl_make_editor(&$1, &$2, $input, _global_pool);
}
-
-void svn_delta_wrap_window_handler(svn_txdelta_window_handler_t *handler,
- void **handler_baton,
- SV *callback,
- apr_pool_t *pool);
-
#endif
#ifdef SWIGRUBY
@@ -176,7 +173,7 @@ svn_txdelta_window_t_ops_get(svn_txdelta_window_t *window)
%ignore svn_txdelta_window_t::ops;
%extend svn_txdelta_window_t {
-void _ops_get(int *num_ops, svn_txdelta_op_t **ops)
+void _ops_get(int *num_ops, const svn_txdelta_op_t **ops)
{
*num_ops = self->num_ops;
*ops = self->ops;
@@ -208,11 +205,11 @@ void _ops_get(int *num_ops, svn_txdelta_op_t **ops)
%include svn_delta_h.swg
#ifdef SWIGPYTHON
-%pythoncode {
+%pythoncode %{
# This function is for backwards compatibility only.
# Use svn_txdelta_window_t.ops instead.
svn_txdelta_window_t_ops_get = svn_txdelta_window_t._ops_get
-}
+%}
#endif
#ifdef SWIGRUBY
diff --git a/subversion/bindings/swig/svn_fs.i b/subversion/bindings/swig/svn_fs.i
index 26ca84b..ae1d847 100644
--- a/subversion/bindings/swig/svn_fs.i
+++ b/subversion/bindings/swig/svn_fs.i
@@ -71,6 +71,14 @@
,
svn_swig_rb_fs_get_locks_callback)
#endif
+
+#ifdef SWIGPYTHON
+%callback_typemap(svn_fs_lock_callback_t lock_callback, void *lock_baton,
+ svn_swig_py_fs_lock_callback,
+ ,
+ )
+#endif
+
/* -----------------------------------------------------------------------
svn_fs_get_merge_info
*/
diff --git a/subversion/bindings/swig/svn_ra.i b/subversion/bindings/swig/svn_ra.i
index ebf5297..e1925f8 100644
--- a/subversion/bindings/swig/svn_ra.i
+++ b/subversion/bindings/swig/svn_ra.i
@@ -65,7 +65,7 @@
#ifdef SWIGPERL
/* FIXME: svn_ra_callbacks2_t ? */
%typemap(in) (const svn_ra_callbacks_t *callbacks, void *callback_baton) {
- svn_ra_make_callbacks(&$1, &$2, $input, _global_pool);
+ svn_swig_pl_make_callbacks(&$1, &$2, $input, _global_pool);
}
#endif
#ifdef SWIGRUBY
@@ -77,7 +77,7 @@
#ifdef SWIGPYTHON
%callback_typemap(const svn_ra_reporter2_t *reporter, void *report_baton,
- (svn_ra_reporter2_t *)&swig_py_ra_reporter2,
+ svn_swig_py_get_ra_reporter2(),
,
)
%callback_typemap(svn_location_segment_receiver_t receiver, void *receiver_baton,
@@ -90,7 +90,7 @@
%callback_typemap(const svn_ra_reporter3_t *reporter, void *report_baton,
,
,
- svn_swig_rb_ra_reporter3)
+ svn_swig_rb_get_ra_reporter3())
#endif
#ifndef SWIGPERL
diff --git a/subversion/bindings/swig/svn_repos.i b/subversion/bindings/swig/svn_repos.i
index 2b12313..bab95c8 100644
--- a/subversion/bindings/swig/svn_repos.i
+++ b/subversion/bindings/swig/svn_repos.i
@@ -147,8 +147,18 @@ svn_error_t *svn_repos_dump_fs2(svn_repos_t *repos,
%ignore svn_repos_dump_fs2;
#endif
+/* ----------------------------------------------------------------------- */
+#ifdef SWIGPYTHON
+/* Make swig wrap this function for us, to allow making a vtable in python */
+void svn_swig_py_make_parse_fns3(const svn_repos_parse_fns3_t **parse_fns3,
+ void **parse_baton,
+ PyObject *py_parse_fns3,
+ apr_pool_t *pool);
+#endif
+
%include svn_repos_h.swg
#ifdef SWIGRUBY
%define_close_related_methods(repos)
#endif
+
diff --git a/subversion/bindings/swig/svn_wc.i b/subversion/bindings/swig/svn_wc.i
index 6137b99..2efe847 100644
--- a/subversion/bindings/swig/svn_wc.i
+++ b/subversion/bindings/swig/svn_wc.i
@@ -40,8 +40,10 @@
*/
%ignore svn_wc_set_auth_file;
-/* ### ignore this structure because the accessors will need a pool */
+/* ### ignore these structures because the accessors will need a pool */
%ignore svn_wc_keywords_t;
+%ignore svn_wc_conflict_description2_t;
+%ignore svn_wc_conflict_result_t;
#ifdef SWIGRUBY
%ignore svn_wc_external_item_create;
diff --git a/subversion/include/mod_dav_svn.h b/subversion/include/mod_dav_svn.h
index c498c5e..223f2f1 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 187703b..6a6b2dc 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 6c32688..89146b9 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 08d2f09..166295d 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 0000000..fe670b0
--- /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 91ea647..892fc4b 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 ad16b66..f21a5d2 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 4de85a9..260327c 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 108b67c..729cf7e 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 bb17c17..48b4d52 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 8cd4c0e..4554da2 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 d714bb1..aa8a2ac 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 f8bd2bc..2d35bc6 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 0000000..59aede1
--- /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 20b70cd..5bd89c0 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 eb0f024..c9f74a1 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 239cd6e..814c27a 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 bdcf32f..1ad8d55 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 b057e56..2e5fafd 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 b8748f4..716d0c9 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 c647697..c04820b 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 4efa255..0000000
--- 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 0000000..7a9383e
--- /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 6ae67a5..89e7227 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 0000000..6faf0dd
--- /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 34d5929..0000000
--- 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 accca3d..1afa071 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 b4294d0..bc2fa45 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 09e4037..c5a232f 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 0000000..c358513
--- /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 4c03e19..4c6cb97 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 *
@@ -538,6 +555,9 @@ svn_sqlite__hotcopy(const char *src_path,
const char *dst_path,
apr_pool_t *scratch_pool);
+/* Backported version of SVN_ERR_SQLITE_ROLLBACK_FAILED. */
+#define SVN_SQLITE__ERR_ROLLBACK_FAILED (SVN_ERR_MISC_CATEGORY_START + 44)
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_string_private.h b/subversion/include/private/svn_string_private.h
index 8579f4d..2f16273 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 30fbbf2..095d71c 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 7a007c3..dd2e047 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 9f5a4ad..4584944 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 fce42b0..28d2247 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 3e9f45e..3a78ba6 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 b03a079..2db619a 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 d3271f5..e332e87 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 5db3e16..cb0f49d 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_abspath,
+ * 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_abspath after successful working copy cleanup.
+ * If @a remove_ignored_items is @c TRUE, remove ignored unversioned items
+ * in @a dir_abspath 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 80442e4..923aeee 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 a127125..35bbe19 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 a3fa9df..5ad3b0b 100644
--- a/subversion/include/svn_config.h
+++ b/subversion/include/svn_config.h
@@ -76,18 +76,27 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_HTTP_PROXY_EXCEPTIONS "http-proxy-exceptions"
#define SVN_CONFIG_OPTION_HTTP_TIMEOUT "http-timeout"
#define SVN_CONFIG_OPTION_HTTP_COMPRESSION "http-compression"
+/** @deprecated Not used since 1.8. */
#define SVN_CONFIG_OPTION_NEON_DEBUG_MASK "neon-debug-mask"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_HTTP_AUTH_TYPES "http-auth-types"
#define SVN_CONFIG_OPTION_SSL_AUTHORITY_FILES "ssl-authority-files"
#define SVN_CONFIG_OPTION_SSL_TRUST_DEFAULT_CA "ssl-trust-default-ca"
#define SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE "ssl-client-cert-file"
#define SVN_CONFIG_OPTION_SSL_CLIENT_CERT_PASSWORD "ssl-client-cert-password"
+/** @deprecated Not used since 1.8.
+ * @since New in 1.5. */
#define SVN_CONFIG_OPTION_SSL_PKCS11_PROVIDER "ssl-pkcs11-provider"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_HTTP_LIBRARY "http-library"
+/** @since New in 1.1. */
#define SVN_CONFIG_OPTION_STORE_PASSWORDS "store-passwords"
+/** @since New in 1.6. */
#define SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS "store-plaintext-passwords"
#define SVN_CONFIG_OPTION_STORE_AUTH_CREDS "store-auth-creds"
+/** @since New in 1.6. */
#define SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP "store-ssl-client-cert-pp"
+/** @since New in 1.6. */
#define SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT \
"store-ssl-client-cert-pp-plaintext"
#define SVN_CONFIG_OPTION_USERNAME "username"
@@ -95,6 +104,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"
@@ -115,6 +132,7 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_DIFF_EXTENSIONS "diff-extensions"
#define SVN_CONFIG_OPTION_DIFF3_CMD "diff3-cmd"
#define SVN_CONFIG_OPTION_DIFF3_HAS_PROGRAM_ARG "diff3-has-program-arg"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_MERGE_TOOL_CMD "merge-tool-cmd"
#define SVN_CONFIG_SECTION_MISCELLANY "miscellany"
#define SVN_CONFIG_OPTION_GLOBAL_IGNORES "global-ignores"
@@ -123,13 +141,20 @@ 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"
+/** @since New in 1.2. */
#define SVN_CONFIG_OPTION_NO_UNLOCK "no-unlock"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_MIMETYPES_FILE "mime-types-file"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_PRESERVED_CF_EXTS "preserved-conflict-file-exts"
/** @since New in 1.7. */
#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 +163,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
@@ -158,9 +185,13 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_FORCE_USERNAME_CASE "force-username-case"
/** @since New in 1.8. */
#define SVN_CONFIG_OPTION_HOOKS_ENV "hooks-env"
+/** @since New in 1.5. */
#define SVN_CONFIG_SECTION_SASL "sasl"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_USE_SASL "use-sasl"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_MIN_SSF "min-encryption"
+/** @since New in 1.5. */
#define SVN_CONFIG_OPTION_MAX_SSF "max-encryption"
/* For repository password database */
@@ -177,7 +208,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 +690,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 +799,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 +816,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 +835,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 +887,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 7df7f3f..d949ced 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 ac9f8fc..5b8f8d7 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 c4374d7..94856f2 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 3a6e4c5..5681644 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 222bc2b..f8348f4 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 8cef9a3..e34146d 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,9 +1618,25 @@ 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,
const char *path,
@@ -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,12 +1740,34 @@ svn_fs_node_id(const svn_fs_id_t **id_p,
const char *path,
apr_pool_t *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
+/** 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 the node-revision identified
+ * by @a path under @a root was created; that is, to the revision in which
+ * @a path under @a root was last modified. @a *revision will
* be set to #SVN_INVALID_REVNUM for uncommitted nodes (i.e. modified nodes
* under a transaction root). Note that the root of an unmodified transaction
* is not itself considered to be modified; in that case, return the revision
* upon which the transaction was based.
+ *
+ * Use @a pool for any temporary allocations.
*/
svn_error_t *
svn_fs_node_created_rev(svn_revnum_t *revision,
@@ -1501,6 +1826,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 +1858,53 @@ 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.
+ *
+ * @note For the purposes of preserving accurate history, certain bits of
+ * code (such as the repository dump code) need to care about the distinction
+ * between situations when the properties are "different" and "have changed
+ * across two points in history". We have a pair of functions that can
+ * answer both of these questions, svn_fs_props_different() and
+ * svn_fs_props_changed(). See issue 4598 for more details.
+ *
+ * @see svn_fs_props_changed
+ *
+ * @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 have changed.
+ *
+ * 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 For the purposes of preserving accurate history, certain bits of
+ * code (such as the repository dump code) need to care about the distinction
+ * between situations when the properties are "different" and "have changed
+ * across two points in history". We have a pair of functions that can
+ * answer both of these questions, svn_fs_props_different() and
+ * svn_fs_props_changed(). See issue 4598 for more details.
+ *
+ * @note This function can currently 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.
+ *
+ * @see svn_fs_props_different
*/
svn_error_t *
svn_fs_props_changed(svn_boolean_t *changed_p,
@@ -1624,12 +2004,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 +2120,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 +2208,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 +2319,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 +2413,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,
@@ -2029,12 +2424,54 @@ svn_fs_apply_text(svn_stream_t **contents_p,
apr_pool_t *pool);
+/** Check if the contents of two root/path combos are different.
+ *
+ * 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.
+ *
+ * @note For the purposes of preserving accurate history, certain bits of
+ * code (such as the repository dump code) need to care about the distinction
+ * between situations when two files have "different" content and when the
+ * contents of a given file "have changed" across two points in its history.
+ * We have a pair of functions that can answer both of these questions,
+ * svn_fs_contents_different() and svn_fs_contents_changed(). See issue
+ * 4598 for more details.
+ *
+ * @see svn_fs_contents_changed
+ *
+ * @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.
*
- * 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 *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 svn_fs_contents_changed() was not designed to be used to detect
+ * when two files have different content, but really to detect when the
+ * contents of a given file have changed across two points in its history.
+ * For the purposes of preserving accurate history, certain bits of code
+ * (such as the repository dump code) need to care about this distinction.
+ * For example, it's not an error from the FS API point of view to call
+ * svn_fs_apply_textdelta() and explicitly set a file's contents to exactly
+ * what they were before the edit was made. We have a pair of functions
+ * that can answer both of these questions, svn_fs_contents_changed() and
+ * svn_fs_contents_different(). See issue 4598 for more details.
+ *
+ * @see svn_fs_contents_different
*/
svn_error_t *
svn_fs_contents_changed(svn_boolean_t *changed_p,
@@ -2060,6 +2497,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 +2658,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 +2676,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 +2686,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().
*
- * @warning You may prefer to use svn_repos_fs_lock() instead,
- * which see.
+ * @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.
+ *
+ * @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 +2752,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 +2835,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.
*
- * 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.
+ * 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 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.
+ * 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.
*
- * Use @a pool for temporary allocations.
+ * @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.
+ *
+ * @since New in 1.2.
*/
svn_error_t *
svn_fs_unlock(svn_fs_t *fs,
@@ -2312,7 +2893,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 +3104,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 46b4760..50ed10a 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 0082917..42eb422 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 ab88935..78044b8 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 ada70a2..ad1bd47 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 25da44f..1c85b61 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 3478003..20452c1 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 1f2bbbf..e920b03 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 cf6f612..a3ab672 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 9c556b8..c968e40 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 6ffa842..45b7a8f 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 b9e05e5..3a6a838 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 d8ce02b..82c6fd6 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 1ad2194..f1a0850 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 6c34dc7..39f7154 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 13
+#define SVN_VER_PATCH 7
/** @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 " (r1667537)"
+#define SVN_VER_TAG " (r1800392)"
/** 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 1667537
+#define SVN_VER_REVISION 1800392
/* 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 37210ff..010597b 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 0000000..eabe3ed
--- /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 90969be..8791b14 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 0000000..a768b6d
--- /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 e1a345e..74e4eaf 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 0000000..fa65cfa
--- /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 f121bc8..ce7891a 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 188fdd2..b9363e2 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 7c58f88..8c6aac8 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 41be776..0d20e24 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 b15e824..e3fffdc 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),
+ ctx->wc_ctx,
+ local_abspath,
+ FALSE /* lock_anchor */,
+ scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* An implementation of svn_wc_status_func4_t. */
+static svn_error_t *
+cleanup_status_walk(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool)
+{
+ struct cleanup_status_walk_baton *b = baton;
+ svn_node_kind_t kind_on_disk;
+ svn_wc_notify_t *notify;
+
+ if (status->node_status == svn_wc_status_external && b->include_externals)
+ {
+ svn_error_t *err;
+
+ SVN_ERR(svn_io_check_path(local_abspath, &kind_on_disk, scratch_pool));
+ if (kind_on_disk == svn_node_dir)
+ {
+ if (b->ctx->notify_func2)
+ {
+ notify = svn_wc_create_notify(local_abspath,
+ svn_wc_notify_cleanup_external,
+ scratch_pool);
+ b->ctx->notify_func2(b->ctx->notify_baton2, notify,
+ scratch_pool);
+ }
+
+ err = do_cleanup(local_abspath,
+ b->break_locks,
+ b->fix_timestamps,
+ b->clear_dav_cache,
+ b->vacuum_pristines,
+ b->remove_unversioned_items,
+ b->remove_ignored_items,
+ TRUE /* include_externals */,
+ b->ctx, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ else
+ SVN_ERR(err);
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+ if (status->node_status == svn_wc_status_ignored)
+ {
+ if (!b->remove_ignored_items)
+ return SVN_NO_ERROR;
+ }
+ else if (status->node_status == svn_wc_status_unversioned)
+ {
+ if (!b->remove_unversioned_items)
+ return SVN_NO_ERROR;
+ }
+ else
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_io_check_path(local_abspath, &kind_on_disk, scratch_pool));
+ switch (kind_on_disk)
+ {
+ case svn_node_file:
+ case svn_node_symlink:
+ SVN_ERR(svn_io_remove_file2(local_abspath, FALSE, scratch_pool));
+ break;
+ case svn_node_dir:
+ SVN_ERR(svn_io_remove_dir2(local_abspath, FALSE,
+ b->ctx->cancel_func, b->ctx->cancel_baton,
+ scratch_pool));
+ break;
+ case svn_node_none:
+ default:
+ return SVN_NO_ERROR;
+ }
+
+ if (b->ctx->notify_func2)
+ {
+ notify = svn_wc_create_notify(local_abspath, svn_wc_notify_delete,
+ scratch_pool);
+ notify->kind = kind_on_disk;
+ b->ctx->notify_func2(b->ctx->notify_baton2, notify, scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
-svn_client_cleanup(const char *path,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
+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)
{
- const char *local_abspath;
- svn_error_t *err;
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath));
- if (svn_path_is_url(path))
- return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
- _("'%s' is not a local path"), path);
+ SVN_ERR(do_cleanup(dir_abspath,
+ break_locks,
+ fix_recorded_timestamps,
+ clear_dav_cache,
+ vacuum_pristines,
+ FALSE /* remove_unversioned_items */,
+ FALSE /* remove_ignored_items */,
+ include_externals,
+ ctx, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath));
- SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
+ SVN_ERR(do_cleanup(dir_abspath,
+ FALSE /* break_locks */,
+ fix_recorded_timestamps,
+ FALSE /* clear_dav_cache */,
+ vacuum_pristines,
+ remove_unversioned_items,
+ remove_ignored_items,
+ include_externals,
+ ctx, scratch_pool));
- err = svn_wc_cleanup3(ctx->wc_ctx, local_abspath, ctx->cancel_func,
- ctx->cancel_baton, scratch_pool);
- svn_io_sleep_for_timestamps(path, scratch_pool);
- return svn_error_trace(err);
+ return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/client.h b/subversion/libsvn_client/client.h
index f136888..58354cf 100644
--- a/subversion/libsvn_client/client.h
+++ b/subversion/libsvn_client/client.h
@@ -45,60 +45,48 @@
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);
+
+/* Private client context.
+ *
+ * This is what is actually allocated by svn_client_create_context2(),
+ * which then returns the address of the public_ctx member. */
+typedef struct svn_client__private_ctx_t
+{
+ /* Reserved field, always zero, to detect misuse of the private
+ context as a public client context. */
+ apr_uint64_t magic_null;
+
+ /* Reserved field, always set to a known magic number, to identify
+ this struct as the private client context. */
+ apr_uint64_t magic_id;
+
+ /* Total number of bytes transferred over network across all RA sessions. */
+ apr_off_t total_progress;
+
+ /* The public context. */
+ svn_client_ctx_t public_ctx;
+} svn_client__private_ctx_t;
+
+
+/* Given a public client context CTX, return the private context
+ within which it is allocated. */
+svn_client__private_ctx_t *
+svn_client__get_private_ctx(svn_client_ctx_t *ctx);
/* Set *ORIGINAL_REPOS_RELPATH and *ORIGINAL_REVISION to the original location
that served as the source of the copy from which PATH_OR_URL at REVISION was
created, or NULL and SVN_INVALID_REVNUM (respectively) if PATH_OR_URL at
- REVISION was not the result of a copy operation. */
+ REVISION was not the result of a copy operation.
+
+ If RA_SESSION is not NULL it is an existing session to the repository that
+ might be reparented temporarily to obtain the information.
+ */
svn_error_t *
svn_client__get_copy_source(const char **original_repos_relpath,
svn_revnum_t *original_revision,
const char *path_or_url,
const svn_opt_revision_t *revision,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -212,7 +200,6 @@ svn_client__repos_location_segments(apr_array_header_t **segments,
See also svn_client__calc_youngest_common_ancestor() to find youngest
common ancestor for already fetched history-as-mergeinfo information.
- See also svn_client__youngest_common_ancestor().
*/
svn_error_t *
svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p,
@@ -422,17 +409,6 @@ svn_error_t *svn_client__get_all_auto_props(apr_hash_t **autoprops,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Get a list of ignore patterns defined by the svn:global-ignores
- properties set on, or inherited by, PATH_OR_URL. Store the collected
- patterns as const char * elements in the array *IGNORES. Allocate
- *IGNORES and its contents in RESULT_POOL. Use SCRATCH_POOL for
- temporary allocations. */
-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);
-
/* The main logic for client deletion from a working copy. Deletes PATH
from CTX->WC_CTX. If PATH (or any item below a directory PATH) is
modified the delete will fail and return an error unless FORCE or KEEP_LOCAL
@@ -467,10 +443,10 @@ svn_client__wc_delete_many(const apr_array_header_t *targets,
apr_pool_t *pool);
-/* Make PATH and add it to the working copy, optionally making all the
- intermediate parent directories if MAKE_PARENTS is TRUE. */
+/* Make LOCAL_ABSPATH and add it to the working copy, optionally making all
+ the intermediate parent directories if MAKE_PARENTS is TRUE. */
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);
@@ -519,10 +495,14 @@ svn_client__make_local_parents(const char *path,
(with depth=empty) any parent directories of the requested update
target which are missing from the working copy.
+ If RA_SESSION is NOT NULL, it may be used to avoid creating a new
+ session. The session may point to a different URL after returning.
+
NOTE: You may not specify both INNERUPDATE and MAKE_PARENTS as true.
*/
svn_error_t *
svn_client__update_internal(svn_revnum_t *result_rev,
+ svn_boolean_t *timestamp_sleep,
const char *local_abspath,
const svn_opt_revision_t *revision,
svn_depth_t depth,
@@ -532,7 +512,7 @@ svn_client__update_internal(svn_revnum_t *result_rev,
svn_boolean_t adds_as_modification,
svn_boolean_t make_parents,
svn_boolean_t innerupdate,
- svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool);
@@ -548,11 +528,6 @@ svn_client__update_internal(svn_revnum_t *result_rev,
DEPTH must be a definite depth, not (e.g.) svn_depth_unknown.
- RA_CACHE is a pointer to a cache of information for the URL at
- REVISION based on the PEG_REVISION. Any information not in
- *RA_CACHE is retrieved by a round-trip to the repository. RA_CACHE
- may be NULL which indicates that no cache information is available.
-
If IGNORE_EXTERNALS is true, do no externals processing.
Set *TIMESTAMP_SLEEP to TRUE if a sleep is required; otherwise do not
@@ -564,10 +539,12 @@ svn_client__update_internal(svn_revnum_t *result_rev,
the repos are tolerated; if FALSE, these obstructions cause the checkout
to fail.
- If INNERCHECKOUT is true, no anchor check is performed on the target.
+ If RA_SESSION is NOT NULL, it may be used to avoid creating a new
+ session. The session may point to a different URL after returning.
*/
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,
@@ -575,7 +552,7 @@ 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);
@@ -707,24 +684,28 @@ svn_client__get_diff_editor2(const svn_delta_editor_t **editor,
/*** Editor for diff summary ***/
-/* Set *CALLBACKS and *CALLBACK_BATON to a set of diff callbacks that will
- report a diff summary, i.e. only providing information about the changed
- items without the text deltas.
+/* Set *DIFF_PROCESSOR to a diff processor that will report a diff summary
+ to SUMMARIZE_FUNC.
+
+ P_ROOT_RELPATH will return a pointer to a string that must be set to
+ the root of the operation before the processor is called.
- TARGET is the target path, relative to the anchor, of the diff.
+ ORIGINAL_PATH specifies the original path and will be used with
+ **ANCHOR_PATH to create paths as the user originally provided them
+ to the diff function.
SUMMARIZE_FUNC is called with SUMMARIZE_BATON as parameter by the
created callbacks for each changed item.
*/
svn_error_t *
svn_client__get_diff_summarize_callbacks(
- svn_wc_diff_callbacks4_t **callbacks,
- void **callback_baton,
- const char *target,
- svn_boolean_t reversed,
+ const svn_diff_tree_processor_t **diff_processor,
+ const char ***p_root_relpath,
svn_client_diff_summarize_func_t summarize_func,
void *summarize_baton,
- apr_pool_t *pool);
+ const char *original_target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* ---------------------------------------------------------------- */
@@ -921,11 +902,6 @@ svn_client__get_copy_committables(svn_client__committables_t **committables,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* A qsort()-compatible sort routine for sorting an array of
- svn_client_commit_item_t *'s by their URL member. */
-int svn_client__sort_commit_item_urls(const void *a, const void *b);
-
-
/* Rewrite the COMMIT_ITEMS array to be sorted by URL. Also, discover
a common *BASE_URL for the items in the array, and rewrite those
items' URLs to be relative to that *BASE_URL.
@@ -939,18 +915,6 @@ svn_client__condense_commit_items(const char **base_url,
apr_array_header_t *commit_items,
apr_pool_t *pool);
-
-/* Like svn_ra_stat() on the ra session root, but with a compatibility
- hack for pre-1.2 svnserve that don't support this api. */
-svn_error_t *
-svn_client__ra_stat_compatible(svn_ra_session_t *ra_session,
- svn_revnum_t rev,
- svn_dirent_t **dirent_p,
- apr_uint32_t dirent_fields,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool);
-
-
/* Commit the items in the COMMIT_ITEMS array using EDITOR/EDIT_BATON
to describe the committed local mods. Prior to this call,
COMMIT_ITEMS should have been run through (and BASE_URL generated
@@ -1016,6 +980,9 @@ svn_client__do_commit(const char *base_url,
change *TIMESTAMP_SLEEP. The output will be valid even if the function
returns an error.
+ If RA_SESSION is NOT NULL, it may be used to avoid creating a new
+ session. The session may point to a different URL after returning.
+
Use POOL for temporary allocation. */
svn_error_t *
svn_client__handle_externals(apr_hash_t *externals_new,
@@ -1024,6 +991,7 @@ svn_client__handle_externals(apr_hash_t *externals_new,
const char *target_abspath,
svn_depth_t requested_depth,
svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool);
@@ -1157,7 +1125,61 @@ svn_client__resolve_conflicts(svn_boolean_t *conflicts_remain,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool);
+/* Produce a diff with depth DEPTH between two files or two directories at
+ * LEFT_ABSPATH1 and RIGHT_ABSPATH, 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.
+ *
+ * If ANCHOR_ABSPATH is not null, set it to the anchor of the diff before
+ * the first processor call. (The anchor is LEFT_ABSPATH or an ancestor of it)
+ */
+svn_error_t *
+svn_client__arbitrary_nodes_diff(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ const char *left_abspath,
+ const char *right_abspath,
+ svn_depth_t depth,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Helper for the remote case of svn_client_propget.
+ *
+ * If PROPS is not null, then get the value of property PROPNAME in
+ * REVNUM, using RA_SESSION. Store the value ('svn_string_t *') in
+ * PROPS, under the path key "TARGET_PREFIX/TARGET_RELATIVE"
+ * ('const char *').
+ *
+ * If INHERITED_PROPS is not null, then set *INHERITED_PROPS to a
+ * depth-first ordered array of svn_prop_inherited_item_t * structures
+ * representing the PROPNAME properties inherited by the target. If
+ * INHERITABLE_PROPS in not null and no inheritable properties are found,
+ * then set *INHERITED_PROPS to an empty array.
+ *
+ * Recurse according to DEPTH, similarly to svn_client_propget3().
+ *
+ * KIND is the kind of the node at "TARGET_PREFIX/TARGET_RELATIVE".
+ * Yes, caller passes this; it makes the recursion more efficient :-).
+ *
+ * Allocate PROPS and *INHERITED_PROPS in RESULT_POOL, but do all temporary
+ * work in SCRATCH_POOL. The two pools can be the same; recursive
+ * calls may use a different SCRATCH_POOL, however.
+ */
+svn_error_t *
+svn_client__remote_propget(apr_hash_t *props,
+ apr_array_header_t **inherited_props,
+ const char *propname,
+ const char *target_prefix,
+ const char *target_relative,
+ svn_node_kind_t kind,
+ svn_revnum_t revnum,
+ svn_ra_session_t *ra_session,
+ svn_depth_t depth,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
#ifdef __cplusplus
}
diff --git a/subversion/libsvn_client/cmdline.c b/subversion/libsvn_client/cmdline.c
index a17f8c4..a850b4e 100644
--- a/subversion/libsvn_client/cmdline.c
+++ b/subversion/libsvn_client/cmdline.c
@@ -87,7 +87,7 @@ check_root_url_of_target(const char **root_url,
if ((err->apr_err == SVN_ERR_ENTRY_NOT_FOUND)
|| (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
|| (err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
- || (err->apr_err == SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED)
+ || (err->apr_err == SVN_ERR_RA_CANNOT_CREATE_SESSION)
|| (err->apr_err == SVN_ERR_CLIENT_BAD_REVISION))
{
svn_error_clear(err);
@@ -200,6 +200,15 @@ svn_client_args_to_target_array2(apr_array_header_t **targets_p,
SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, &peg_rev,
utf8_target, pool));
+ /* Reject the form "@abc", a peg specifier with no path. */
+ if (true_target[0] == '\0' && peg_rev[0] != '\0')
+ {
+ return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
+ _("'%s' is just a peg revision. "
+ "Maybe try '%s@' instead?"),
+ utf8_target, utf8_target);
+ }
+
/* URLs and wc-paths get treated differently. */
if (svn_path_is_url(true_target))
{
@@ -278,7 +287,7 @@ svn_client_args_to_target_array2(apr_array_header_t **targets_p,
}
}
- target = apr_pstrcat(pool, true_target, peg_rev, (char *)NULL);
+ target = apr_pstrcat(pool, true_target, peg_rev, SVN_VA_NULL);
if (rel_url_found)
{
@@ -338,7 +347,7 @@ svn_client_args_to_target_array2(apr_array_header_t **targets_p,
SVN_ERR(svn_opt__arg_canonicalize_url(&true_target, abs_target,
pool));
- target = apr_pstrcat(pool, true_target, peg_rev, (char *)NULL);
+ target = apr_pstrcat(pool, true_target, peg_rev, SVN_VA_NULL);
}
APR_ARRAY_PUSH(*targets_p, const char *) = target;
diff --git a/subversion/libsvn_client/commit.c b/subversion/libsvn_client/commit.c
index 07fdce1..4a945c8 100644
--- a/subversion/libsvn_client/commit.c
+++ b/subversion/libsvn_client/commit.c
@@ -45,6 +45,7 @@
#include "client.h"
#include "private/svn_wc_private.h"
#include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
#include "svn_private_config.h"
@@ -110,7 +111,8 @@ get_ra_editor(const svn_delta_editor_t **editor,
continue;
svn_pool_clear(iterpool);
- SVN_ERR(svn_wc__node_get_origin(NULL, NULL, &relpath, NULL, NULL, NULL,
+ SVN_ERR(svn_wc__node_get_origin(NULL, NULL, &relpath, NULL, NULL,
+ NULL, NULL,
ctx->wc_ctx, item->path, FALSE, pool,
iterpool));
if (relpath)
@@ -203,8 +205,8 @@ collect_lock_tokens(apr_hash_t **result,
for (hi = apr_hash_first(pool, all_tokens); hi; hi = apr_hash_next(hi))
{
- const char *url = svn__apr_hash_index_key(hi);
- const char *token = svn__apr_hash_index_val(hi);
+ const char *url = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
const char *relpath = svn_uri_skip_ancestor(base_url, url, pool);
if (relpath)
@@ -238,91 +240,30 @@ post_process_commit_item(svn_wc_committed_queue_t *queue,
loop_recurse = TRUE;
remove_lock = (! keep_locks && (item->state_flags
- & SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN));
+ & (SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN
+ | SVN_CLIENT_COMMIT_ITEM_ADD
+ | SVN_CLIENT_COMMIT_ITEM_DELETE)));
- /* When the node was deleted (or replaced), we need to always remove the
- locks, as they're invalidated on the server. We cannot honor the
+ /* When the node was deleted (or replaced), we need to always remove the
+ locks, as they're invalidated on the server. We cannot honor the
SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN flag here because it does not tell
us whether we have locked children. */
if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
remove_lock = TRUE;
- return svn_wc_queue_committed3(queue, wc_ctx, item->path,
- loop_recurse, item->incoming_prop_changes,
+ return svn_error_trace(
+ svn_wc_queue_committed4(queue, wc_ctx, item->path,
+ loop_recurse,
+ 0 != (item->state_flags &
+ (SVN_CLIENT_COMMIT_ITEM_ADD
+ | SVN_CLIENT_COMMIT_ITEM_DELETE
+ | SVN_CLIENT_COMMIT_ITEM_TEXT_MODS
+ | SVN_CLIENT_COMMIT_ITEM_PROP_MODS)),
+ item->incoming_prop_changes,
remove_lock, !keep_changelists,
- sha1_checksum, scratch_pool);
-}
-
-
-static svn_error_t *
-check_nonrecursive_dir_delete(svn_wc_context_t *wc_ctx,
- const char *target_abspath,
- svn_depth_t depth,
- apr_pool_t *scratch_pool)
-{
- svn_node_kind_t kind;
-
- SVN_ERR_ASSERT(depth != svn_depth_infinity);
-
- SVN_ERR(svn_wc_read_kind2(&kind, wc_ctx, target_abspath,
- TRUE, FALSE, scratch_pool));
-
-
- /* ### TODO(sd): This check is slightly too strict. It should be
- ### possible to:
- ###
- ### * delete a directory containing only files when
- ### depth==svn_depth_files;
- ###
- ### * delete a directory containing only files and empty
- ### subdirs when depth==svn_depth_immediates.
- ###
- ### But for now, we insist on svn_depth_infinity if you're
- ### going to delete a directory, because we're lazy and
- ### trying to get depthy commits working in the first place.
- ###
- ### This would be fairly easy to fix, though: just, well,
- ### check the above conditions!
- ###
- ### GJS: I think there may be some confusion here. there is
- ### the depth of the commit, and the depth of a checked-out
- ### directory in the working copy. Delete, by its nature, will
- ### always delete all of its children, so it seems a bit
- ### strange to worry about what is in the working copy.
- */
- if (kind == svn_node_dir)
- {
- svn_wc_schedule_t schedule;
-
- /* ### Looking at schedule is probably enough, no need for
- pristine compare etc. */
- SVN_ERR(svn_wc__node_get_schedule(&schedule, NULL,
- wc_ctx, target_abspath,
- scratch_pool));
-
- if (schedule == svn_wc_schedule_delete
- || schedule == svn_wc_schedule_replace)
- {
- const apr_array_header_t *children;
-
- SVN_ERR(svn_wc__node_get_children(&children, wc_ctx,
- target_abspath, TRUE,
- scratch_pool, scratch_pool));
-
- if (children->nelts > 0)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("Cannot delete the directory '%s' "
- "in a non-recursive commit "
- "because it has children"),
- svn_dirent_local_style(target_abspath,
- scratch_pool));
- }
- }
-
- return SVN_NO_ERROR;
+ sha1_checksum, scratch_pool));
}
-
/* Given a list of committables described by their common base abspath
BASE_ABSPATH and a list of relative dirents TARGET_RELPATHS determine
which absolute paths must be locked to commit all these targets and
@@ -393,8 +334,8 @@ determine_lock_targets(apr_array_header_t **lock_targets,
hi = apr_hash_next(hi))
{
const char *common;
- const char *wcroot_abspath = svn__apr_hash_index_key(hi);
- apr_array_header_t *wc_targets = svn__apr_hash_index_val(hi);
+ const char *wcroot_abspath = apr_hash_this_key(hi);
+ apr_array_header_t *wc_targets = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
@@ -420,8 +361,7 @@ determine_lock_targets(apr_array_header_t **lock_targets,
SVN_ERR(svn_dirent_condense_targets(&common, &wc_targets, wc_targets,
FALSE, iterpool, iterpool));
- qsort(wc_targets->elts, wc_targets->nelts, wc_targets->elt_size,
- svn_sort_compare_paths);
+ svn_sort__array(wc_targets, svn_sort_compare_paths);
if (wc_targets->nelts == 0
|| !svn_path_is_empty(APR_ARRAY_IDX(wc_targets, 0, const char*))
@@ -599,6 +539,7 @@ svn_client_commit6(const apr_array_header_t *targets,
const char *current_abspath;
const char *notify_prefix;
int depth_empty_after = -1;
+ apr_hash_t *move_youngest = NULL;
int i;
SVN_ERR_ASSERT(depth != svn_depth_unknown && depth != svn_depth_exclude);
@@ -673,26 +614,6 @@ svn_client_commit6(const apr_array_header_t *targets,
base_abspath,
pool);
- /* If a non-recursive commit is desired, do not allow a deleted directory
- as one of the targets. */
- if (depth != svn_depth_infinity && ! commit_as_operations)
- for (i = 0; i < rel_targets->nelts; i++)
- {
- const char *relpath = APR_ARRAY_IDX(rel_targets, i, const char *);
- const char *target_abspath;
-
- svn_pool_clear(iterpool);
-
- target_abspath = svn_dirent_join(base_abspath, relpath, iterpool);
-
- cmt_err = svn_error_trace(
- check_nonrecursive_dir_delete(ctx->wc_ctx, target_abspath,
- depth, iterpool));
-
- if (cmt_err)
- goto cleanup;
- }
-
/* Crawl the working copy for commit items. */
{
struct check_url_kind_baton cukb;
@@ -741,7 +662,7 @@ svn_client_commit6(const apr_array_header_t *targets,
apr_hash_index_t *hi = apr_hash_first(iterpool,
committables->by_repository);
- commit_items = svn__apr_hash_index_val(hi);
+ commit_items = apr_hash_this_val(hi);
}
/* If our array of targets contains only locks (and no actual file
@@ -789,62 +710,12 @@ svn_client_commit6(const apr_array_header_t *targets,
if (cmt_err)
goto cleanup;
- if (moved_from_abspath && delete_op_root_abspath &&
- strcmp(moved_from_abspath, delete_op_root_abspath) == 0)
-
+ if (moved_from_abspath && delete_op_root_abspath)
{
- svn_boolean_t found_delete_half =
- (svn_hash_gets(committables->by_path, delete_op_root_abspath)
- != NULL);
-
- if (!found_delete_half)
- {
- const char *delete_half_parent_abspath;
-
- /* The delete-half isn't in the commit target list.
- * However, it might itself be the child of a deleted node,
- * either because of another move or a deletion.
- *
- * For example, consider: mv A/B B; mv B/C C; commit;
- * C's moved-from A/B/C is a child of the deleted A/B.
- * A/B/C does not appear in the commit target list, but
- * A/B does appear.
- * (Note that moved-from information is always stored
- * relative to the BASE tree, so we have 'C moved-from
- * A/B/C', not 'C moved-from B/C'.)
- *
- * An example involving a move and a delete would be:
- * mv A/B C; rm A; commit;
- * Now C is moved-from A/B which does not appear in the
- * commit target list, but A does appear.
- */
-
- /* Scan upwards for a deletion op-root from the
- * delete-half's parent directory. */
- delete_half_parent_abspath =
- svn_dirent_dirname(delete_op_root_abspath, iterpool);
- if (strcmp(delete_op_root_abspath,
- delete_half_parent_abspath) != 0)
- {
- const char *parent_delete_op_root_abspath;
-
- cmt_err = svn_error_trace(
- svn_wc__node_get_deleted_ancestor(
- &parent_delete_op_root_abspath,
- ctx->wc_ctx, delete_half_parent_abspath,
- iterpool, iterpool));
- if (cmt_err)
- goto cleanup;
-
- if (parent_delete_op_root_abspath)
- found_delete_half =
- (svn_hash_gets(committables->by_path,
- parent_delete_op_root_abspath)
- != NULL);
- }
- }
+ svn_client_commit_item3_t *delete_half =
+ svn_hash_gets(committables->by_path, delete_op_root_abspath);
- if (!found_delete_half)
+ if (!delete_half)
{
cmt_err = svn_error_createf(
SVN_ERR_ILLEGAL_TARGET, NULL,
@@ -854,8 +725,32 @@ svn_client_commit6(const apr_array_header_t *targets,
svn_dirent_local_style(item->path, iterpool),
svn_dirent_local_style(delete_op_root_abspath,
iterpool));
+
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(
+ delete_op_root_abspath,
+ svn_wc_notify_failed_requires_target,
+ iterpool);
+ notify->err = cmt_err;
+
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
+ }
+
goto cleanup;
}
+ else if (delete_half->revision == item->copyfrom_rev)
+ {
+ /* Ok, now we know that we perform an out-of-date check
+ on the copyfrom location. Remember this for a fixup
+ round right before committing. */
+
+ if (!move_youngest)
+ move_youngest = apr_hash_make(pool);
+
+ svn_hash_sets(move_youngest, item->path, item);
+ }
}
}
@@ -885,6 +780,19 @@ svn_client_commit6(const apr_array_header_t *targets,
svn_dirent_local_style(item->path, iterpool),
svn_dirent_local_style(copy_op_root_abspath,
iterpool));
+
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(
+ copy_op_root_abspath,
+ svn_wc_notify_failed_requires_target,
+ iterpool);
+ notify->err = cmt_err;
+
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
+ }
+
goto cleanup;
}
}
@@ -941,6 +849,37 @@ svn_client_commit6(const apr_array_header_t *targets,
if (cmt_err)
goto cleanup;
+ if (move_youngest != NULL)
+ {
+ apr_hash_index_t *hi;
+ svn_revnum_t youngest;
+
+ SVN_ERR(svn_ra_get_latest_revnum(ra_session, &youngest, pool));
+
+ for (hi = apr_hash_first(iterpool, move_youngest);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_client_commit_item3_t *item = apr_hash_this_val(hi);
+
+ /* We delete the original side with its original revision and will
+ receive an out-of-date error if that node changed since that
+ revision.
+
+ The copy is of that same revision and we know that this revision
+ didn't change between this revision and youngest. So we can just
+ as well commit a copy from youngest.
+
+ Note that it is still possible to see gaps between the delete and
+ copy revisions as the repository might handle multiple commits
+ at the same time (or when an out of date proxy is involved), but
+ in general it should decrease the number of gaps. */
+
+ if (item->copyfrom_rev < youngest)
+ item->copyfrom_rev = youngest;
+ }
+ }
+
cmt_err = svn_error_trace(
get_ra_editor(&editor, &edit_baton, ra_session, ctx,
log_msg, commit_items, revprop_table,
@@ -996,6 +935,9 @@ svn_client_commit6(const apr_array_header_t *targets,
commit_info->author,
ctx->cancel_func, ctx->cancel_baton,
iterpool);
+
+ if (bump_err)
+ goto cleanup;
}
cleanup:
@@ -1004,16 +946,16 @@ svn_client_commit6(const apr_array_header_t *targets,
working copies. */
if (timestamp_sleep)
{
- const char *wcroot_abspath;
- svn_error_t *err = svn_wc__get_wcroot(&wcroot_abspath, ctx->wc_ctx,
+ const char *sleep_abspath;
+ svn_error_t *err = svn_wc__get_wcroot(&sleep_abspath, ctx->wc_ctx,
base_abspath, pool, pool);
if (err)
{
svn_error_clear(err);
- wcroot_abspath = NULL;
+ sleep_abspath = base_abspath;
}
- svn_io_sleep_for_timestamps(wcroot_abspath, pool);
+ svn_io_sleep_for_timestamps(sleep_abspath, pool);
}
/* Abort the commit if it is still in progress. */
diff --git a/subversion/libsvn_client/commit_util.c b/subversion/libsvn_client/commit_util.c
index a32ec5d..1f3d877 100644
--- a/subversion/libsvn_client/commit_util.c
+++ b/subversion/libsvn_client/commit_util.c
@@ -40,11 +40,11 @@
#include "svn_hash.h"
#include <assert.h>
-#include <stdlib.h> /* for qsort() */
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
#include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
/*** Uncomment this to turn on commit driver debugging. ***/
/*
@@ -62,10 +62,12 @@ fixup_commit_error(const char *local_abspath,
apr_pool_t *scratch_pool)
{
if (err->apr_err == SVN_ERR_FS_NOT_FOUND
+ || err->apr_err == SVN_ERR_FS_CONFLICT
|| err->apr_err == SVN_ERR_FS_ALREADY_EXISTS
|| err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE
|| err->apr_err == SVN_ERR_RA_DAV_PATH_NOT_FOUND
|| err->apr_err == SVN_ERR_RA_DAV_ALREADY_EXISTS
+ || err->apr_err == SVN_ERR_RA_DAV_PRECONDITION_FAILED
|| svn_error_find_cause(err, SVN_ERR_RA_OUT_OF_DATE))
{
if (ctx->notify_func2)
@@ -102,6 +104,7 @@ fixup_commit_error(const char *local_abspath,
}
else if (svn_error_find_cause(err, SVN_ERR_FS_NO_LOCK_TOKEN)
|| err->apr_err == SVN_ERR_FS_LOCK_OWNER_MISMATCH
+ || err->apr_err == SVN_ERR_FS_BAD_LOCK_TOKEN
|| err->apr_err == SVN_ERR_RA_NOT_LOCKED)
{
if (ctx->notify_func2)
@@ -464,10 +467,12 @@ harvest_not_present_for_copy(svn_wc_context_t *wc_ctx,
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
+ SVN_ERR_ASSERT(commit_relpath != NULL);
+
/* A function to retrieve not present children would be nice to have */
- SVN_ERR(svn_wc__node_get_children_of_working_node(
- &children, wc_ctx, local_abspath, TRUE,
- scratch_pool, iterpool));
+ SVN_ERR(svn_wc__node_get_not_present_children(&children, wc_ctx,
+ local_abspath,
+ scratch_pool, iterpool));
for (i = 0; i < children->nelts; i++)
{
@@ -483,13 +488,10 @@ harvest_not_present_for_copy(svn_wc_context_t *wc_ctx,
this_abspath, FALSE, scratch_pool));
if (!not_present)
- continue;
+ continue; /* Node is replaced */
- if (commit_relpath == NULL)
- this_commit_relpath = NULL;
- else
- this_commit_relpath = svn_relpath_join(commit_relpath, name,
- iterpool);
+ this_commit_relpath = svn_relpath_join(commit_relpath, name,
+ iterpool);
/* We should check if we should really add a delete operation */
if (check_url_func)
@@ -502,7 +504,7 @@ harvest_not_present_for_copy(svn_wc_context_t *wc_ctx,
/* Determine from what parent we would be the deleted child */
SVN_ERR(svn_wc__node_get_origin(
NULL, &parent_rev, &parent_repos_relpath,
- &parent_repos_root_url, NULL, NULL,
+ &parent_repos_root_url, NULL, NULL, NULL,
wc_ctx,
svn_dirent_dirname(this_abspath,
scratch_pool),
@@ -768,13 +770,14 @@ harvest_status_callback(void *status_baton,
&& !(state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE))
{
svn_revnum_t dir_rev = SVN_INVALID_REVNUM;
+ const char *dir_repos_relpath = NULL;
- if (!copy_mode_root && !status->switched && !is_added)
- SVN_ERR(svn_wc__node_get_base(NULL, &dir_rev, NULL, NULL, NULL, NULL,
+ if (!copy_mode_root && !is_added)
+ SVN_ERR(svn_wc__node_get_base(NULL, &dir_rev, &dir_repos_relpath, NULL,
+ NULL, NULL,
wc_ctx, svn_dirent_dirname(local_abspath,
scratch_pool),
FALSE /* ignore_enoent */,
- FALSE /* show_hidden */,
scratch_pool, scratch_pool));
if (copy_mode_root || status->switched || node_rev != dir_rev)
@@ -794,6 +797,25 @@ harvest_status_callback(void *status_baton,
cf_rev = status->revision;
cf_relpath = status->repos_relpath;
}
+
+ if (!copy_mode_root && !is_added && baton->check_url_func
+ && dir_repos_relpath)
+ {
+ svn_node_kind_t me_kind;
+ /* Maybe we need to issue an delete (mixed rev/switched) */
+
+ SVN_ERR(baton->check_url_func(
+ baton->check_url_baton, &me_kind,
+ svn_path_url_add_component2(repos_root_url,
+ svn_relpath_join(dir_repos_relpath,
+ svn_dirent_basename(local_abspath,
+ NULL),
+ scratch_pool),
+ scratch_pool),
+ dir_rev, scratch_pool));
+ if (me_kind != svn_node_none)
+ state_flags |= SVN_CLIENT_COMMIT_ITEM_DELETE;
+ }
}
}
@@ -919,7 +941,7 @@ harvest_status_callback(void *status_baton,
* directory. In either case, we require the op-root of the parent
* to be part of the commit. See issue #4059. */
SVN_ERR(svn_wc__node_get_origin(&parent_is_copy, NULL, NULL, NULL,
- NULL, &copy_root_abspath,
+ NULL, NULL, &copy_root_abspath,
wc_ctx, parent_abspath,
FALSE, scratch_pool, scratch_pool));
@@ -1233,13 +1255,13 @@ svn_client__harvest_committables(svn_client__committables_t **committables,
/* Make sure that every path in danglers is part of the commit. */
for (hi = apr_hash_first(scratch_pool, danglers); hi; hi = apr_hash_next(hi))
{
- const char *dangling_parent = svn__apr_hash_index_key(hi);
+ const char *dangling_parent = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
if (! look_up_committable(*committables, dangling_parent, iterpool))
{
- const char *dangling_child = svn__apr_hash_index_val(hi);
+ const char *dangling_child = apr_hash_this_val(hi);
if (ctx->notify_func2 != NULL)
{
@@ -1357,7 +1379,10 @@ svn_client__get_copy_committables(svn_client__committables_t **committables,
}
-int svn_client__sort_commit_item_urls(const void *a, const void *b)
+/* A svn_sort__array()/qsort()-compatible sort routine for sorting
+ an array of svn_client_commit_item_t *'s by their URL member. */
+static int
+sort_commit_item_urls(const void *a, const void *b)
{
const svn_client_commit_item3_t *item1
= *((const svn_client_commit_item3_t * const *) a);
@@ -1381,8 +1406,7 @@ svn_client__condense_commit_items(const char **base_url,
SVN_ERR_ASSERT(ci && ci->nelts);
/* Sort our commit items by their URLs. */
- qsort(ci->elts, ci->nelts,
- ci->elt_size, svn_client__sort_commit_item_urls);
+ svn_sort__array(ci, sort_commit_item_urls);
/* Loop through the URLs, finding the longest usable ancestor common
to all of them, and making sure there are no duplicate URLs. */
@@ -1470,6 +1494,7 @@ struct file_mod_t
{
const svn_client_commit_item3_t *item;
void *file_baton;
+ apr_pool_t *file_pool;
};
@@ -1535,6 +1560,9 @@ do_item_commit(void **dir_baton,
else
file_pool = pool;
+ /* Subpools are cheap, but memory isn't */
+ file_pool = svn_pool_create(file_pool);
+
/* Call the cancellation function. */
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
@@ -1618,11 +1646,12 @@ do_item_commit(void **dir_baton,
else
notify = NULL;
+
if (notify)
{
notify->kind = item->kind;
notify->path_prefix = icb->notify_path_prefix;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
}
@@ -1783,6 +1812,7 @@ do_item_commit(void **dir_baton,
/* Add this file mod to the FILE_MODS hash. */
mod->item = item;
mod->file_baton = file_baton;
+ mod->file_pool = file_pool;
svn_hash_sets(file_mods, item->session_relpath, mod);
}
else if (file_baton)
@@ -1790,7 +1820,7 @@ do_item_commit(void **dir_baton,
/* Close any outstanding file batons that didn't get caught by
the "has local mods" conditional above. */
err = editor->close_file(file_baton, NULL, file_pool);
-
+ svn_pool_destroy(file_pool);
if (err)
goto fixup_error;
}
@@ -1858,7 +1888,7 @@ svn_client__do_commit(const char *base_url,
hi;
hi = apr_hash_next(hi))
{
- struct file_mod_t *mod = svn__apr_hash_index_val(hi);
+ struct file_mod_t *mod = apr_hash_this_val(hi);
const svn_client_commit_item3_t *item = mod->item;
const svn_checksum_t *new_text_base_md5_checksum;
const svn_checksum_t *new_text_base_sha1_checksum;
@@ -1905,6 +1935,17 @@ svn_client__do_commit(const char *base_url,
if (sha1_checksums)
svn_hash_sets(*sha1_checksums, item->path, new_text_base_sha1_checksum);
+
+ svn_pool_destroy(mod->file_pool);
+ }
+
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(base_url,
+ svn_wc_notify_commit_finalizing,
+ iterpool);
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
}
svn_pool_destroy(iterpool);
diff --git a/subversion/libsvn_client/compat_providers.c b/subversion/libsvn_client/compat_providers.c
index ae53a15..864d158 100644
--- a/subversion/libsvn_client/compat_providers.c
+++ b/subversion/libsvn_client/compat_providers.c
@@ -27,6 +27,10 @@
/*** Includes. ***/
+/* We define this here to remove any further warnings about the usage of
+ deprecated functions in this file. */
+#define SVN_DEPRECATED
+
#include "svn_auth.h"
#include "svn_client.h"
diff --git a/subversion/libsvn_client/copy.c b/subversion/libsvn_client/copy.c
index f204bbc..af6a75b 100644
--- a/subversion/libsvn_client/copy.c
+++ b/subversion/libsvn_client/copy.c
@@ -177,12 +177,513 @@ get_copy_pair_ancestors(const apr_array_header_t *copy_pairs,
return SVN_NO_ERROR;
}
+/* Quote a string if it would be handled as multiple or different tokens
+ during externals parsing */
+static const char *
+maybe_quote(const char *value,
+ apr_pool_t *result_pool)
+{
+ apr_status_t status;
+ char **argv;
+
+ status = apr_tokenize_to_argv(value, &argv, result_pool);
+
+ if (!status && argv[0] && !argv[1] && strcmp(argv[0], value) == 0)
+ return apr_pstrdup(result_pool, value);
+
+ {
+ svn_stringbuf_t *sb = svn_stringbuf_create_empty(result_pool);
+ const char *c;
+
+ svn_stringbuf_appendbyte(sb, '\"');
+
+ for (c = value; *c; c++)
+ {
+ if (*c == '\\' || *c == '\"' || *c == '\'')
+ svn_stringbuf_appendbyte(sb, '\\');
+
+ svn_stringbuf_appendbyte(sb, *c);
+ }
+
+ svn_stringbuf_appendbyte(sb, '\"');
+
+#ifdef SVN_DEBUG
+ status = apr_tokenize_to_argv(sb->data, &argv, result_pool);
+
+ SVN_ERR_ASSERT_NO_RETURN(!status && argv[0] && !argv[1]
+ && !strcmp(argv[0], value));
+#endif
+
+ return sb->data;
+ }
+}
+
+/* In *NEW_EXTERNALS_DESCRIPTION, return a new external description for
+ * use as a line in an svn:externals property, based on the external item
+ * ITEM and the additional parser information in INFO. Pin the external
+ * to EXTERNAL_PEGREV. Use POOL for all allocations. */
+static svn_error_t *
+make_external_description(const char **new_external_description,
+ const char *local_abspath_or_url,
+ svn_wc_external_item2_t *item,
+ svn_wc__externals_parser_info_t *info,
+ svn_opt_revision_t external_pegrev,
+ apr_pool_t *pool)
+{
+ const char *rev_str;
+ const char *peg_rev_str;
+
+ switch (info->format)
+ {
+ case svn_wc__external_description_format_1:
+ if (external_pegrev.kind == svn_opt_revision_unspecified)
+ {
+ /* If info->rev_str is NULL, this yields an empty string. */
+ rev_str = apr_pstrcat(pool, info->rev_str, " ", SVN_VA_NULL);
+ }
+ else if (info->rev_str && item->revision.kind != svn_opt_revision_head)
+ rev_str = apr_psprintf(pool, "%s ", info->rev_str);
+ else
+ {
+ /* ### can't handle svn_opt_revision_date without info->rev_str */
+ SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_number);
+ rev_str = apr_psprintf(pool, "-r%ld ",
+ external_pegrev.value.number);
+ }
+
+ *new_external_description =
+ apr_psprintf(pool, "%s %s%s\n", maybe_quote(item->target_dir, pool),
+ rev_str,
+ maybe_quote(item->url, pool));
+ break;
+
+ case svn_wc__external_description_format_2:
+ if (external_pegrev.kind == svn_opt_revision_unspecified)
+ {
+ /* If info->rev_str is NULL, this yields an empty string. */
+ rev_str = apr_pstrcat(pool, info->rev_str, " ", SVN_VA_NULL);
+ }
+ else if (info->rev_str && item->revision.kind != svn_opt_revision_head)
+ rev_str = apr_psprintf(pool, "%s ", info->rev_str);
+ else
+ rev_str = "";
+
+ if (external_pegrev.kind == svn_opt_revision_unspecified)
+ peg_rev_str = info->peg_rev_str ? info->peg_rev_str : "";
+ else if (info->peg_rev_str &&
+ item->peg_revision.kind != svn_opt_revision_head)
+ peg_rev_str = info->peg_rev_str;
+ else
+ {
+ /* ### can't handle svn_opt_revision_date without info->rev_str */
+ SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_number);
+ peg_rev_str = apr_psprintf(pool, "@%ld",
+ external_pegrev.value.number);
+ }
+
+ *new_external_description =
+ apr_psprintf(pool, "%s%s %s\n", rev_str,
+ maybe_quote(apr_psprintf(pool, "%s%s", item->url,
+ peg_rev_str),
+ pool),
+ maybe_quote(item->target_dir, pool));
+ break;
+
+ default:
+ return svn_error_createf(
+ SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION, NULL,
+ _("%s property defined at '%s' is using an unsupported "
+ "syntax"), SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(local_abspath_or_url, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Pin all externals listed in EXTERNALS_PROP_VAL to their
+ * last-changed revision. Set *PINNED_EXTERNALS to a new property
+ * value allocated in RESULT_POOL, or to NULL if none of the externals
+ * in EXTERNALS_PROP_VAL were changed. LOCAL_ABSPATH_OR_URL is the
+ * path or URL defining the svn:externals property. Use SCRATCH_POOL
+ * for temporary allocations.
+ */
+static svn_error_t *
+pin_externals_prop(svn_string_t **pinned_externals,
+ svn_string_t *externals_prop_val,
+ const apr_hash_t *externals_to_pin,
+ const char *repos_root_url,
+ const char *local_abspath_or_url,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *buf;
+ apr_array_header_t *external_items;
+ apr_array_header_t *parser_infos;
+ apr_array_header_t *items_to_pin;
+ int pinned_items;
+ int i;
+ apr_pool_t *iterpool;
+
+ SVN_ERR(svn_wc__parse_externals_description(&external_items,
+ &parser_infos,
+ local_abspath_or_url,
+ externals_prop_val->data,
+ FALSE /* canonicalize_url */,
+ scratch_pool));
+
+ if (externals_to_pin)
+ {
+ items_to_pin = svn_hash_gets((apr_hash_t *)externals_to_pin,
+ local_abspath_or_url);
+ if (!items_to_pin)
+ {
+ /* No pinning at all for this path. */
+ *pinned_externals = NULL;
+ return SVN_NO_ERROR;
+ }
+ }
+ else
+ items_to_pin = NULL;
+
+ buf = svn_stringbuf_create_empty(scratch_pool);
+ iterpool = svn_pool_create(scratch_pool);
+ pinned_items = 0;
+ for (i = 0; i < external_items->nelts; i++)
+ {
+ svn_wc_external_item2_t *item;
+ svn_wc__externals_parser_info_t *info;
+ svn_opt_revision_t external_pegrev;
+ const char *pinned_desc;
+
+ svn_pool_clear(iterpool);
+
+ item = APR_ARRAY_IDX(external_items, i, svn_wc_external_item2_t *);
+ info = APR_ARRAY_IDX(parser_infos, i, svn_wc__externals_parser_info_t *);
+
+ if (items_to_pin)
+ {
+ int j;
+ svn_wc_external_item2_t *item_to_pin = NULL;
+
+ for (j = 0; j < items_to_pin->nelts; j++)
+ {
+ svn_wc_external_item2_t *const current =
+ APR_ARRAY_IDX(items_to_pin, j, svn_wc_external_item2_t *);
+
+
+ if (current
+ && 0 == strcmp(item->url, current->url)
+ && 0 == strcmp(item->target_dir, current->target_dir))
+ {
+ item_to_pin = current;
+ break;
+ }
+ }
+
+ /* If this item is not in our list of external items to pin then
+ * simply keep the external at its original value. */
+ if (!item_to_pin)
+ {
+ const char *desc;
+
+ external_pegrev.kind = svn_opt_revision_unspecified;
+ SVN_ERR(make_external_description(&desc, local_abspath_or_url,
+ item, info, external_pegrev,
+ iterpool));
+ svn_stringbuf_appendcstr(buf, desc);
+ continue;
+ }
+ }
+
+ if (item->peg_revision.kind == svn_opt_revision_date)
+ {
+ /* Already pinned ... copy the peg date. */
+ external_pegrev.kind = svn_opt_revision_date;
+ external_pegrev.value.date = item->peg_revision.value.date;
+ }
+ else if (item->peg_revision.kind == svn_opt_revision_number)
+ {
+ /* Already pinned ... copy the peg revision number. */
+ external_pegrev.kind = svn_opt_revision_number;
+ external_pegrev.value.number = item->peg_revision.value.number;
+ }
+ else
+ {
+ SVN_ERR_ASSERT(
+ item->peg_revision.kind == svn_opt_revision_head ||
+ item->peg_revision.kind == svn_opt_revision_unspecified);
+
+ /* We're actually going to change the peg revision. */
+ ++pinned_items;
+
+ if (svn_path_is_url(local_abspath_or_url))
+ {
+ const char *resolved_url;
+ svn_ra_session_t *external_ra_session;
+ svn_revnum_t latest_revnum;
+
+ SVN_ERR(svn_wc__resolve_relative_external_url(
+ &resolved_url, item, repos_root_url,
+ local_abspath_or_url, iterpool, iterpool));
+ SVN_ERR(svn_client__open_ra_session_internal(&external_ra_session,
+ NULL, resolved_url,
+ NULL, NULL, FALSE,
+ FALSE, ctx,
+ iterpool,
+ iterpool));
+ SVN_ERR(svn_ra_get_latest_revnum(external_ra_session,
+ &latest_revnum,
+ iterpool));
+
+ external_pegrev.kind = svn_opt_revision_number;
+ external_pegrev.value.number = latest_revnum;
+ }
+ else
+ {
+ const char *external_abspath;
+ svn_node_kind_t external_kind;
+ svn_revnum_t external_checked_out_rev;
+
+ external_abspath = svn_dirent_join(local_abspath_or_url,
+ item->target_dir,
+ iterpool);
+ SVN_ERR(svn_wc__read_external_info(&external_kind, NULL, NULL,
+ NULL, NULL, ctx->wc_ctx,
+ local_abspath_or_url,
+ external_abspath, TRUE,
+ iterpool,
+ iterpool));
+ if (external_kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS,
+ NULL,
+ _("Cannot pin external '%s' defined "
+ "in %s at '%s' because it is not "
+ "checked out in the working copy "
+ "at '%s'"),
+ item->url, SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(
+ local_abspath_or_url, iterpool),
+ svn_dirent_local_style(
+ external_abspath, iterpool));
+ else if (external_kind == svn_node_dir)
+ {
+ svn_boolean_t is_switched;
+ svn_boolean_t is_modified;
+ svn_revnum_t min_rev;
+ svn_revnum_t max_rev;
+
+ /* Perform some sanity checks on the checked-out external. */
+
+ SVN_ERR(svn_wc__has_switched_subtrees(&is_switched,
+ ctx->wc_ctx,
+ external_abspath, NULL,
+ iterpool));
+ if (is_switched)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS,
+ NULL,
+ _("Cannot pin external '%s' defined "
+ "in %s at '%s' because '%s' has "
+ "switched subtrees (switches "
+ "cannot be represented in %s)"),
+ item->url, SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(
+ local_abspath_or_url, iterpool),
+ svn_dirent_local_style(
+ external_abspath, iterpool),
+ SVN_PROP_EXTERNALS);
+
+ SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx,
+ external_abspath, TRUE,
+ ctx->cancel_func,
+ ctx->cancel_baton,
+ iterpool));
+ if (is_modified)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS,
+ NULL,
+ _("Cannot pin external '%s' defined "
+ "in %s at '%s' because '%s' has "
+ "local modifications (local "
+ "modifications cannot be "
+ "represented in %s)"),
+ item->url, SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(
+ local_abspath_or_url, iterpool),
+ svn_dirent_local_style(
+ external_abspath, iterpool),
+ SVN_PROP_EXTERNALS);
+
+ SVN_ERR(svn_wc__min_max_revisions(&min_rev, &max_rev, ctx->wc_ctx,
+ external_abspath, FALSE,
+ iterpool));
+ if (min_rev != max_rev)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS,
+ NULL,
+ _("Cannot pin external '%s' defined "
+ "in %s at '%s' because '%s' is a "
+ "mixed-revision working copy "
+ "(mixed-revisions cannot be "
+ "represented in %s)"),
+ item->url, SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(
+ local_abspath_or_url, iterpool),
+ svn_dirent_local_style(
+ external_abspath, iterpool),
+ SVN_PROP_EXTERNALS);
+ external_checked_out_rev = min_rev;
+ }
+ else
+ {
+ SVN_ERR_ASSERT(external_kind == svn_node_file);
+ SVN_ERR(svn_wc__node_get_repos_info(&external_checked_out_rev,
+ NULL, NULL, NULL,
+ ctx->wc_ctx, external_abspath,
+ iterpool, iterpool));
+ }
+
+ external_pegrev.kind = svn_opt_revision_number;
+ external_pegrev.value.number = external_checked_out_rev;
+ }
+ }
+
+ SVN_ERR_ASSERT(external_pegrev.kind == svn_opt_revision_date ||
+ external_pegrev.kind == svn_opt_revision_number);
+
+ SVN_ERR(make_external_description(&pinned_desc, local_abspath_or_url,
+ item, info, external_pegrev, iterpool));
+
+ svn_stringbuf_appendcstr(buf, pinned_desc);
+ }
+ svn_pool_destroy(iterpool);
+
+ if (pinned_items > 0)
+ *pinned_externals = svn_string_create_from_buf(buf, result_pool);
+ else
+ *pinned_externals = NULL;
+
+ return SVN_NO_ERROR;
+}
+
+/* Return, in *PINNED_EXTERNALS, a new hash mapping URLs or local abspaths
+ * to svn:externals property values (as const char *), where some or all
+ * external references have been pinned.
+ * If EXTERNALS_TO_PIN is NULL, pin all externals, else pin the externals
+ * mentioned in EXTERNALS_TO_PIN.
+ * The pinning operation takes place as part of the copy operation for
+ * the source/destination pair PAIR. Use RA_SESSION and REPOS_ROOT_URL
+ * to contact the repository containing the externals definition, if neccesary.
+ * Use CX to fopen additional RA sessions to external repositories, if
+ * neccessary. Allocate *NEW_EXTERNALS in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+resolve_pinned_externals(apr_hash_t **pinned_externals,
+ const apr_hash_t *externals_to_pin,
+ svn_client__copy_pair_t *pair,
+ svn_ra_session_t *ra_session,
+ const char *repos_root_url,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *old_url = NULL;
+ apr_hash_t *externals_props;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+
+ *pinned_externals = apr_hash_make(result_pool);
+
+ if (svn_path_is_url(pair->src_abspath_or_url))
+ {
+ SVN_ERR(svn_client__ensure_ra_session_url(&old_url, ra_session,
+ pair->src_abspath_or_url,
+ scratch_pool));
+ externals_props = apr_hash_make(scratch_pool);
+ SVN_ERR(svn_client__remote_propget(externals_props, NULL,
+ SVN_PROP_EXTERNALS,
+ pair->src_abspath_or_url, "",
+ svn_node_dir,
+ pair->src_revnum,
+ ra_session,
+ svn_depth_infinity,
+ scratch_pool,
+ scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_wc__externals_gather_definitions(&externals_props, NULL,
+ ctx->wc_ctx,
+ pair->src_abspath_or_url,
+ svn_depth_infinity,
+ scratch_pool, scratch_pool));
+
+ /* ### gather_definitions returns propvals as const char * */
+ for (hi = apr_hash_first(scratch_pool, externals_props);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *local_abspath_or_url = apr_hash_this_key(hi);
+ const char *propval = apr_hash_this_val(hi);
+ svn_string_t *new_propval = svn_string_create(propval, scratch_pool);
+
+ svn_hash_sets(externals_props, local_abspath_or_url, new_propval);
+ }
+ }
+
+ if (apr_hash_count(externals_props) == 0)
+ {
+ if (old_url)
+ SVN_ERR(svn_ra_reparent(ra_session, old_url, scratch_pool));
+ return SVN_NO_ERROR;
+ }
+
+ iterpool = svn_pool_create(scratch_pool);
+ for (hi = apr_hash_first(scratch_pool, externals_props);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *local_abspath_or_url = apr_hash_this_key(hi);
+ svn_string_t *externals_propval = apr_hash_this_val(hi);
+ const char *relpath;
+ svn_string_t *new_propval;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(pin_externals_prop(&new_propval, externals_propval,
+ externals_to_pin,
+ repos_root_url, local_abspath_or_url, ctx,
+ result_pool, iterpool));
+ if (new_propval)
+ {
+ if (svn_path_is_url(pair->src_abspath_or_url))
+ relpath = svn_uri_skip_ancestor(pair->src_abspath_or_url,
+ local_abspath_or_url,
+ result_pool);
+ else
+ relpath = svn_dirent_skip_ancestor(pair->src_abspath_or_url,
+ local_abspath_or_url);
+ SVN_ERR_ASSERT(relpath);
+
+ svn_hash_sets(*pinned_externals, relpath, new_propval);
+ }
+ }
+ svn_pool_destroy(iterpool);
+
+ if (old_url)
+ SVN_ERR(svn_ra_reparent(ra_session, old_url, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
/* The guts of do_wc_to_wc_copies */
static svn_error_t *
do_wc_to_wc_copies_with_write_lock(svn_boolean_t *timestamp_sleep,
const apr_array_header_t *copy_pairs,
const char *dst_parent,
+ svn_boolean_t metadata_only,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
@@ -195,22 +696,63 @@ do_wc_to_wc_copies_with_write_lock(svn_boolean_t *timestamp_sleep,
const char *dst_abspath;
svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
svn_client__copy_pair_t *);
+ apr_hash_t *pinned_externals = NULL;
+
svn_pool_clear(iterpool);
/* Check for cancellation */
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
+ if (pin_externals)
+ {
+ const char *repos_root_url;
+
+ SVN_ERR(svn_wc__node_get_origin(NULL, NULL, NULL, &repos_root_url,
+ NULL, NULL, NULL, ctx->wc_ctx,
+ pair->src_abspath_or_url, FALSE,
+ scratch_pool, iterpool));
+ SVN_ERR(resolve_pinned_externals(&pinned_externals,
+ externals_to_pin, pair, NULL,
+ repos_root_url, ctx,
+ iterpool, iterpool));
+ }
+
/* Perform the copy */
dst_abspath = svn_dirent_join(pair->dst_parent_abspath, pair->base_name,
iterpool);
*timestamp_sleep = TRUE;
err = svn_wc_copy3(ctx->wc_ctx, pair->src_abspath_or_url, dst_abspath,
- FALSE /* metadata_only */,
+ metadata_only,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2, iterpool);
if (err)
break;
+
+ if (pinned_externals)
+ {
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(iterpool, pinned_externals);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *dst_relpath = apr_hash_this_key(hi);
+ svn_string_t *externals_propval = apr_hash_this_val(hi);
+ const char *local_abspath;
+
+ local_abspath = svn_dirent_join(pair->dst_abspath_or_url,
+ dst_relpath, iterpool);
+ /* ### use a work queue? */
+ SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath,
+ SVN_PROP_EXTERNALS, externals_propval,
+ svn_depth_empty, TRUE /* skip_checks */,
+ NULL /* changelist_filter */,
+ ctx->cancel_func, ctx->cancel_baton,
+ NULL, NULL, /* no extra notification */
+ iterpool));
+ }
+ }
}
svn_pool_destroy(iterpool);
@@ -223,6 +765,9 @@ do_wc_to_wc_copies_with_write_lock(svn_boolean_t *timestamp_sleep,
static svn_error_t *
do_wc_to_wc_copies(svn_boolean_t *timestamp_sleep,
const apr_array_header_t *copy_pairs,
+ svn_boolean_t metadata_only,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
@@ -236,7 +781,8 @@ do_wc_to_wc_copies(svn_boolean_t *timestamp_sleep,
SVN_WC__CALL_WITH_WRITE_LOCK(
do_wc_to_wc_copies_with_write_lock(timestamp_sleep, copy_pairs, dst_parent,
- ctx, pool),
+ metadata_only, pin_externals,
+ externals_to_pin, ctx, pool),
ctx->wc_ctx, dst_parent_abspath, FALSE, pool);
return SVN_NO_ERROR;
@@ -511,10 +1057,24 @@ verify_wc_dsts(const apr_array_header_t *copy_pairs,
ctx->wc_ctx, pair->dst_parent_abspath,
FALSE, TRUE,
iterpool));
- if (make_parents && dst_parent_kind == svn_node_none)
+ if (dst_parent_kind == svn_node_none)
{
- SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
- TRUE, ctx, iterpool));
+ if (make_parents)
+ SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
+ TRUE, ctx, iterpool));
+ else
+ {
+ SVN_ERR(svn_io_check_path(pair->dst_parent_abspath,
+ &dst_parent_kind, scratch_pool));
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ (dst_parent_kind == svn_node_dir)
+ ? _("Directory '%s' is not under "
+ "version control")
+ : _("Path '%s' is not a directory"),
+ svn_dirent_local_style(
+ pair->dst_parent_abspath,
+ scratch_pool));
+ }
}
else if (dst_parent_kind != svn_node_dir)
{
@@ -594,6 +1154,8 @@ typedef struct path_driver_info_t
svn_boolean_t resurrection;
svn_boolean_t dir_add;
svn_string_t *mergeinfo; /* the new mergeinfo for the target */
+ svn_string_t *externals; /* new externals definitions for the target */
+ svn_boolean_t only_pin_externals;
} path_driver_info_t;
@@ -631,7 +1193,7 @@ path_driver_cb_func(void **dir_baton,
with such, the code is just plain wrong. */
SVN_ERR_ASSERT(! svn_path_is_empty(path));
- /* Check to see if we need to add the path as a directory. */
+ /* Check to see if we need to add the path as a parent directory. */
if (path_info->dir_add)
{
return cb_baton->editor->add_directory(path, parent_baton, NULL,
@@ -662,7 +1224,7 @@ path_driver_cb_func(void **dir_baton,
/* Not a move? This must just be the copy addition. */
else
{
- do_add = TRUE;
+ do_add = !path_info->only_pin_externals;
}
}
@@ -702,6 +1264,18 @@ path_driver_cb_func(void **dir_baton,
pool));
}
}
+
+ if (path_info->externals)
+ {
+ if (*dir_baton == NULL)
+ SVN_ERR(cb_baton->editor->open_directory(path, parent_baton,
+ SVN_INVALID_REVNUM,
+ pool, dir_baton));
+
+ SVN_ERR(cb_baton->editor->change_dir_prop(*dir_baton, SVN_PROP_EXTERNALS,
+ path_info->externals, pool));
+ }
+
return SVN_NO_ERROR;
}
@@ -786,6 +1360,79 @@ find_absent_parents2(svn_ra_session_t *ra_session,
return SVN_NO_ERROR;
}
+/* Queue property changes for pinning svn:externals properties set on
+ * descendants of the path corresponding to PARENT_INFO. PINNED_EXTERNALS
+ * is keyed by the relative path of each descendant which should have some
+ * or all of its externals pinned, with the corresponding pinned svn:externals
+ * properties as values. Property changes are queued in a new list of path
+ * infos *NEW_PATH_INFOS, or in an existing item of the PATH_INFOS list if an
+ * existing item is found for the descendant. Allocate results in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+queue_externals_change_path_infos(apr_array_header_t *new_path_infos,
+ apr_array_header_t *path_infos,
+ apr_hash_t *pinned_externals,
+ path_driver_info_t *parent_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(scratch_pool, pinned_externals);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *dst_relpath = apr_hash_this_key(hi);
+ svn_string_t *externals_prop = apr_hash_this_val(hi);
+ const char *src_url;
+ path_driver_info_t *info;
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ src_url = svn_path_url_add_component2(parent_info->src_url,
+ dst_relpath, iterpool);
+
+ /* Try to find a path info the external change can be applied to. */
+ info = NULL;
+ for (i = 0; i < path_infos->nelts; i++)
+ {
+ path_driver_info_t *existing_info;
+
+ existing_info = APR_ARRAY_IDX(path_infos, i, path_driver_info_t *);
+ if (strcmp(src_url, existing_info->src_url) == 0)
+ {
+ info = existing_info;
+ break;
+ }
+ }
+
+ if (info == NULL)
+ {
+ /* A copied-along child needs its externals pinned.
+ Create a new path info for this property change. */
+ info = apr_pcalloc(result_pool, sizeof(*info));
+ info->src_url = svn_path_url_add_component2(
+ parent_info->src_url, dst_relpath,
+ result_pool);
+ info->src_path = NULL; /* Only needed on copied dirs */
+ info->dst_path = svn_relpath_join(parent_info->dst_path,
+ dst_relpath,
+ result_pool);
+ info->src_kind = svn_node_dir;
+ info->only_pin_externals = TRUE;
+ APR_ARRAY_PUSH(new_path_infos, path_driver_info_t *) = info;
+ }
+
+ info->externals = externals_prop;
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
repos_to_repos_copy(const apr_array_header_t *copy_pairs,
svn_boolean_t make_parents,
@@ -794,6 +1441,8 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
void *commit_baton,
svn_client_ctx_t *ctx,
svn_boolean_t is_move,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
apr_pool_t *pool)
{
svn_error_t *err;
@@ -809,6 +1458,7 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
struct path_driver_cb_baton cb_baton;
apr_array_header_t *new_dirs = NULL;
apr_hash_t *commit_revprops;
+ apr_array_header_t *pin_externals_only_infos = NULL;
int i;
svn_client__copy_pair_t *first_pair =
APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *);
@@ -1006,7 +1656,10 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
&& (relpath != NULL && *relpath != '\0'))
{
info->resurrection = TRUE;
- top_url = svn_uri_dirname(top_url, pool);
+ top_url = svn_uri_get_longest_ancestor(
+ top_url,
+ svn_uri_dirname(pair->dst_abspath_or_url, pool),
+ pool);
SVN_ERR(svn_ra_reparent(ra_session, top_url, pool));
}
}
@@ -1058,16 +1711,40 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
SVN_ERR(svn_ra_check_path(ra_session, dst_rel, SVN_INVALID_REVNUM,
&dst_kind, pool));
if (dst_kind != svn_node_none)
- return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
- _("Path '%s' already exists"), dst_rel);
+ {
+ const char *path = svn_uri_skip_ancestor(repos_root,
+ pair->dst_abspath_or_url,
+ pool);
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Path '/%s' already exists"), path);
+ }
/* More info for our INFO structure. */
- info->src_path = src_rel;
+ info->src_path = src_rel; /* May be NULL, if outside RA session scope */
info->dst_path = dst_rel;
svn_hash_sets(action_hash, info->dst_path, info);
if (is_move && (! info->resurrection))
svn_hash_sets(action_hash, info->src_path, info);
+
+ if (pin_externals)
+ {
+ apr_hash_t *pinned_externals;
+
+ SVN_ERR(resolve_pinned_externals(&pinned_externals,
+ externals_to_pin, pair,
+ ra_session, repos_root,
+ ctx, pool, pool));
+ if (pin_externals_only_infos == NULL)
+ {
+ pin_externals_only_infos =
+ apr_array_make(pool, 0, sizeof(path_driver_info_t *));
+ }
+ SVN_ERR(queue_externals_change_path_infos(pin_externals_only_infos,
+ path_infos,
+ pinned_externals,
+ info, pool, pool));
+ }
}
if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx))
@@ -1088,6 +1765,7 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
item = svn_client_commit_item3_create(pool);
item->url = svn_path_url_add_component2(top_url, relpath, pool);
+ item->kind = svn_node_dir;
item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
}
@@ -1101,14 +1779,19 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
item = svn_client_commit_item3_create(pool);
item->url = svn_path_url_add_component2(top_url, info->dst_path,
pool);
- item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
+ item->kind = info->src_kind;
+ item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD
+ | SVN_CLIENT_COMMIT_ITEM_IS_COPY;
+ item->copyfrom_url = info->src_url;
+ item->copyfrom_rev = info->src_revnum;
APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
if (is_move && (! info->resurrection))
{
- item = apr_pcalloc(pool, sizeof(*item));
+ item = svn_client_commit_item3_create(pool);
item->url = svn_path_url_add_component2(top_url, info->src_path,
pool);
+ item->kind = info->src_kind;
item->state_flags = SVN_CLIENT_COMMIT_ITEM_DELETE;
APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
}
@@ -1150,6 +1833,19 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
APR_ARRAY_PUSH(paths, const char *) = info->src_path;
}
+ /* Add any items which only need their externals pinned. */
+ if (pin_externals_only_infos)
+ {
+ for (i = 0; i < pin_externals_only_infos->nelts; i++)
+ {
+ path_driver_info_t *info;
+
+ info = APR_ARRAY_IDX(pin_externals_only_infos, i, path_driver_info_t *);
+ APR_ARRAY_PUSH(paths, const char *) = info->dst_path;
+ svn_hash_sets(action_hash, info->dst_path, info);
+ }
+ }
+
SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
message, ctx, pool));
@@ -1181,6 +1877,15 @@ repos_to_repos_copy(const apr_array_header_t *copy_pairs,
editor->abort_edit(edit_baton, pool));
}
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(top_url,
+ svn_wc_notify_commit_finalizing,
+ pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
+ }
+
/* Close the edit. */
return svn_error_trace(editor->close_edit(edit_baton, pool));
}
@@ -1219,6 +1924,65 @@ check_url_kind(void *baton,
return SVN_NO_ERROR;
}
+/* Queue a property change on a copy of LOCAL_ABSPATH to COMMIT_URL
+ * in the COMMIT_ITEMS list.
+ * If the list does not already have a commit item for COMMIT_URL
+ * add a new commit item for the property change.
+ * Allocate results in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+queue_prop_change_commit_items(const char *local_abspath,
+ const char *commit_url,
+ apr_array_header_t *commit_items,
+ const char *propname,
+ svn_string_t *propval,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_client_commit_item3_t *item = NULL;
+ svn_prop_t *prop;
+ int i;
+
+ for (i = 0; i < commit_items->nelts; i++)
+ {
+ svn_client_commit_item3_t *existing_item;
+
+ existing_item = APR_ARRAY_IDX(commit_items, i,
+ svn_client_commit_item3_t *);
+ if (strcmp(existing_item->url, commit_url) == 0)
+ {
+ item = existing_item;
+ break;
+ }
+ }
+
+ if (item == NULL)
+ {
+ item = svn_client_commit_item3_create(result_pool);
+ item->path = local_abspath;
+ item->url = commit_url;
+ item->kind = svn_node_dir;
+ item->state_flags = SVN_CLIENT_COMMIT_ITEM_PROP_MODS;
+
+ item->incoming_prop_changes = apr_array_make(result_pool, 1,
+ sizeof(svn_prop_t *));
+ APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
+ }
+ else
+ item->state_flags |= SVN_CLIENT_COMMIT_ITEM_PROP_MODS;
+
+ if (item->outgoing_prop_changes == NULL)
+ item->outgoing_prop_changes = apr_array_make(result_pool, 1,
+ sizeof(svn_prop_t *));
+
+ prop = apr_palloc(result_pool, sizeof(*prop));
+ prop->name = propname;
+ prop->value = propval;
+ APR_ARRAY_PUSH(item->outgoing_prop_changes, svn_prop_t *) = prop;
+
+ return SVN_NO_ERROR;
+}
+
/* ### Copy ...
* COMMIT_INFO_P is ...
* COPY_PAIRS is ... such that each 'src_abspath_or_url' is a local abspath
@@ -1232,6 +1996,8 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
const apr_hash_t *revprop_table,
svn_commit_callback2_t commit_callback,
void *commit_baton,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
@@ -1241,7 +2007,9 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
const char *top_src_abspath;
svn_ra_session_t *ra_session;
const svn_delta_editor_t *editor;
+#ifdef ENABLE_EV2_SHIMS
apr_hash_t *relpath_map = NULL;
+#endif
void *edit_baton;
svn_client__committables_t *committables;
apr_array_header_t *commit_items;
@@ -1250,6 +2018,7 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
apr_hash_t *commit_revprops;
svn_client__copy_pair_t *first_pair;
apr_pool_t *session_pool = svn_pool_create(scratch_pool);
+ apr_array_header_t *commit_items_for_dav;
int i;
/* Find the common root of all the source paths */
@@ -1284,9 +2053,13 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
SVN_ERR(svn_dirent_get_absolute(&top_src_abspath, top_src_path, scratch_pool));
+ commit_items_for_dav = apr_array_make(session_pool, 0,
+ sizeof(svn_client_commit_item3_t*));
+
/* Open a session to help while determining the exact targets */
SVN_ERR(svn_client__open_ra_session_internal(&ra_session, NULL, top_dst_url,
- top_src_abspath, NULL,
+ top_src_abspath,
+ commit_items_for_dav,
FALSE /* write_dav_props */,
TRUE /* read_dav_props */,
ctx,
@@ -1323,52 +2096,6 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
}
}
- if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx))
- {
- /* Produce a list of new paths to add, and provide it to the
- mechanism used to acquire a log message. */
- svn_client_commit_item3_t *item;
- const char *tmp_file;
- commit_items = apr_array_make(scratch_pool, copy_pairs->nelts,
- sizeof(item));
-
- /* Add any intermediate directories to the message */
- if (make_parents)
- {
- for (i = 0; i < new_dirs->nelts; i++)
- {
- const char *url = APR_ARRAY_IDX(new_dirs, i, const char *);
-
- item = svn_client_commit_item3_create(scratch_pool);
- item->url = url;
- item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
- APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
- }
- }
-
- for (i = 0; i < copy_pairs->nelts; i++)
- {
- svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
- svn_client__copy_pair_t *);
-
- item = svn_client_commit_item3_create(scratch_pool);
- item->url = pair->dst_abspath_or_url;
- item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
- APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
- }
-
- SVN_ERR(svn_client__get_log_msg(&message, &tmp_file, commit_items,
- ctx, scratch_pool));
- if (! message)
- {
- svn_pool_destroy(iterpool);
- svn_pool_destroy(session_pool);
- return SVN_NO_ERROR;
- }
- }
- else
- message = "";
-
cukb.session = ra_session;
SVN_ERR(svn_ra_get_repos_root2(ra_session, &cukb.repos_root_url, session_pool));
cukb.should_reparent = FALSE;
@@ -1399,6 +2126,7 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
item = svn_client_commit_item3_create(scratch_pool);
item->url = url;
+ item->kind = svn_node_dir;
item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
item->incoming_prop_changes = apr_array_make(scratch_pool, 1,
sizeof(svn_prop_t *));
@@ -1426,8 +2154,6 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
/* Set the mergeinfo for the destination to the combined merge
info known to the WC and the repository. */
- item->outgoing_prop_changes = apr_array_make(scratch_pool, 1,
- sizeof(svn_prop_t *));
/* Repository mergeinfo (or NULL if it's locally added)... */
if (src_origin)
SVN_ERR(svn_client__get_repos_mergeinfo(
@@ -1444,34 +2170,97 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
iterpool));
else if (! mergeinfo)
mergeinfo = wc_mergeinfo;
+
if (mergeinfo)
{
/* Push a mergeinfo prop representing MERGEINFO onto the
* OUTGOING_PROP_CHANGES array. */
svn_prop_t *mergeinfo_prop
- = apr_palloc(item->outgoing_prop_changes->pool,
- sizeof(svn_prop_t));
+ = apr_palloc(scratch_pool, sizeof(*mergeinfo_prop));
svn_string_t *prop_value;
SVN_ERR(svn_mergeinfo_to_string(&prop_value, mergeinfo,
- item->outgoing_prop_changes->pool));
+ scratch_pool));
+
+ if (!item->outgoing_prop_changes)
+ {
+ item->outgoing_prop_changes = apr_array_make(scratch_pool, 1,
+ sizeof(svn_prop_t *));
+ }
mergeinfo_prop->name = SVN_PROP_MERGEINFO;
mergeinfo_prop->value = prop_value;
APR_ARRAY_PUSH(item->outgoing_prop_changes, svn_prop_t *)
= mergeinfo_prop;
}
+
+ if (pin_externals)
+ {
+ apr_hash_t *pinned_externals;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(resolve_pinned_externals(&pinned_externals,
+ externals_to_pin, pair,
+ ra_session, cukb.repos_root_url,
+ ctx, scratch_pool, iterpool));
+ for (hi = apr_hash_first(scratch_pool, pinned_externals);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *dst_relpath = apr_hash_this_key(hi);
+ svn_string_t *externals_propval = apr_hash_this_val(hi);
+ const char *dst_url;
+ const char *commit_url;
+ const char *src_abspath;
+
+ if (svn_path_is_url(pair->dst_abspath_or_url))
+ dst_url = pair->dst_abspath_or_url;
+ else
+ SVN_ERR(svn_wc__node_get_url(&dst_url, ctx->wc_ctx,
+ pair->dst_abspath_or_url,
+ scratch_pool, iterpool));
+ commit_url = svn_path_url_add_component2(dst_url, dst_relpath,
+ scratch_pool);
+ src_abspath = svn_dirent_join(pair->src_abspath_or_url,
+ dst_relpath, iterpool);
+ SVN_ERR(queue_prop_change_commit_items(src_abspath,
+ commit_url, commit_items,
+ SVN_PROP_EXTERNALS,
+ externals_propval,
+ scratch_pool, iterpool));
+ }
+ }
+ }
+
+ if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx))
+ {
+ const char *tmp_file;
+
+ SVN_ERR(svn_client__get_log_msg(&message, &tmp_file, commit_items,
+ ctx, scratch_pool));
+ if (! message)
+ {
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(session_pool);
+ return SVN_NO_ERROR;
+ }
}
+ else
+ message = "";
/* Sort and condense our COMMIT_ITEMS. */
SVN_ERR(svn_client__condense_commit_items(&top_dst_url,
commit_items, scratch_pool));
+ /* Add the commit items to the DAV commit item list to provide access
+ to dav properties (for pre http-v2 DAV) */
+ apr_array_cat(commit_items_for_dav, commit_items);
+
#ifdef ENABLE_EV2_SHIMS
if (commit_items)
{
- relpath_map = apr_hash_make(pool);
+ relpath_map = apr_hash_make(scratch_pool);
for (i = 0; i < commit_items->nelts; i++)
{
svn_client_commit_item3_t *item = APR_ARRAY_IDX(commit_items, i,
@@ -1482,7 +2271,8 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
continue;
svn_pool_clear(iterpool);
- SVN_ERR(svn_wc__node_get_origin(NULL, NULL, &relpath, NULL, NULL, NULL,
+ SVN_ERR(svn_wc__node_get_origin(NULL, NULL, &relpath, NULL, NULL,
+ NULL, NULL,
ctx->wc_ctx, item->path, FALSE,
scratch_pool, iterpool));
if (relpath)
@@ -1491,22 +2281,17 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
}
#endif
- /* Close the initial session, to reopen a new session with commit handling */
- svn_pool_clear(session_pool);
-
- /* Open a new RA session to DST_URL. */
- SVN_ERR(svn_client__open_ra_session_internal(&ra_session, NULL, top_dst_url,
- NULL, commit_items,
- FALSE, FALSE, ctx,
- session_pool, session_pool));
+ SVN_ERR(svn_ra_reparent(ra_session, top_dst_url, session_pool));
SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
message, ctx, session_pool));
/* Fetch RA commit editor. */
+#ifdef ENABLE_EV2_SHIMS
SVN_ERR(svn_ra__register_editor_shim_callbacks(ra_session,
svn_client__get_shim_callbacks(ctx->wc_ctx, relpath_map,
session_pool)));
+#endif
SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,
commit_revprops,
commit_callback,
@@ -1517,7 +2302,7 @@ wc_to_repos_copy(const apr_array_header_t *copy_pairs,
/* Perform the commit. */
SVN_ERR_W(svn_client__do_commit(top_dst_url, commit_items,
editor, edit_baton,
- 0, /* ### any notify_path_offset needed? */
+ NULL /* notify_path_prefix */,
NULL, ctx, session_pool, session_pool),
_("Commit failed (details follow):"));
@@ -1565,6 +2350,8 @@ repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep,
svn_client__copy_pair_t *pair,
svn_boolean_t same_repositories,
svn_boolean_t ignore_externals,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
@@ -1593,7 +2380,6 @@ repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep,
{
if (same_repositories)
{
- svn_boolean_t sleep_needed = FALSE;
const char *tmpdir_abspath, *tmp_abspath;
/* Find a temporary location in which to check out the copy source. */
@@ -1622,14 +2408,22 @@ repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep,
ctx->notify_func2 = notification_adjust_func;
ctx->notify_baton2 = &nb;
- err = svn_client__checkout_internal(&pair->src_revnum,
+ /* Avoid a chicken-and-egg problem:
+ * If pinning externals we'll need to adjust externals
+ * properties before checking out any externals.
+ * But copy needs to happen before pinning because else there
+ * are no svn:externals properties to pin. */
+ if (pin_externals)
+ ignore_externals = TRUE;
+
+ err = svn_client__checkout_internal(&pair->src_revnum, timestamp_sleep,
pair->src_original,
tmp_abspath,
&pair->src_peg_revision,
&pair->src_op_revision,
svn_depth_infinity,
ignore_externals, FALSE,
- &sleep_needed, ctx, pool);
+ ra_session, ctx, pool);
ctx->notify_func2 = old_notify_func2;
ctx->notify_baton2 = old_notify_baton2;
@@ -1674,6 +2468,61 @@ repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep,
return SVN_NO_ERROR;
}
+
+ if (pin_externals)
+ {
+ apr_hash_t *pinned_externals;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ const char *repos_root_url;
+ apr_hash_t *new_externals;
+ apr_hash_t *new_depths;
+
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool));
+ SVN_ERR(resolve_pinned_externals(&pinned_externals,
+ externals_to_pin, pair,
+ ra_session, repos_root_url,
+ ctx, pool, pool));
+
+ iterpool = svn_pool_create(pool);
+ for (hi = apr_hash_first(pool, pinned_externals);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *dst_relpath = apr_hash_this_key(hi);
+ svn_string_t *externals_propval = apr_hash_this_val(hi);
+ const char *local_abspath;
+
+ svn_pool_clear(iterpool);
+
+ local_abspath = svn_dirent_join(pair->dst_abspath_or_url,
+ dst_relpath, iterpool);
+ /* ### use a work queue? */
+ SVN_ERR(svn_wc_prop_set4(ctx->wc_ctx, local_abspath,
+ SVN_PROP_EXTERNALS, externals_propval,
+ svn_depth_empty, TRUE /* skip_checks */,
+ NULL /* changelist_filter */,
+ ctx->cancel_func, ctx->cancel_baton,
+ NULL, NULL, /* no extra notification */
+ iterpool));
+ }
+
+ /* Now update all externals in the newly created copy. */
+ SVN_ERR(svn_wc__externals_gather_definitions(&new_externals,
+ &new_depths,
+ ctx->wc_ctx,
+ dst_abspath,
+ svn_depth_infinity,
+ iterpool, iterpool));
+ SVN_ERR(svn_client__handle_externals(new_externals,
+ new_depths,
+ repos_root_url, dst_abspath,
+ svn_depth_infinity,
+ timestamp_sleep,
+ ra_session,
+ ctx, iterpool));
+ svn_pool_destroy(iterpool);
+ }
} /* end directory case */
else if (pair->src_kind == svn_node_file)
@@ -1722,7 +2571,7 @@ repos_to_wc_copy_single(svn_boolean_t *timestamp_sleep,
svn_wc_notify_t *notify = svn_wc_create_notify(
dst_abspath, svn_wc_notify_add, pool);
notify->kind = pair->src_kind;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
return SVN_NO_ERROR;
@@ -1733,6 +2582,8 @@ repos_to_wc_copy_locked(svn_boolean_t *timestamp_sleep,
const apr_array_header_t *copy_pairs,
const char *top_dst_path,
svn_boolean_t ignore_externals,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
@@ -1798,6 +2649,7 @@ repos_to_wc_copy_locked(svn_boolean_t *timestamp_sleep,
svn_client__copy_pair_t *),
same_repositories,
ignore_externals,
+ pin_externals, externals_to_pin,
ra_session, ctx, iterpool));
}
svn_pool_destroy(iterpool);
@@ -1810,6 +2662,8 @@ repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
const apr_array_header_t *copy_pairs,
svn_boolean_t make_parents,
svn_boolean_t ignore_externals,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
@@ -1918,6 +2772,7 @@ repos_to_wc_copy(svn_boolean_t *timestamp_sleep,
SVN_WC__CALL_WITH_WRITE_LOCK(
repos_to_wc_copy_locked(timestamp_sleep,
copy_pairs, top_dst_path, ignore_externals,
+ pin_externals, externals_to_pin,
ra_session, ctx, pool),
ctx->wc_ctx, lock_abspath, FALSE, pool);
return SVN_NO_ERROR;
@@ -1944,6 +2799,8 @@ try_copy(svn_boolean_t *timestamp_sleep,
svn_boolean_t metadata_only,
svn_boolean_t make_parents,
svn_boolean_t ignore_externals,
+ 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,
@@ -1956,6 +2813,9 @@ try_copy(svn_boolean_t *timestamp_sleep,
svn_boolean_t srcs_are_urls, dst_is_url;
int i;
+ /* Assert instead of crashing if the sources list is empty. */
+ SVN_ERR_ASSERT(sources->nelts > 0);
+
/* Are either of our paths URLs? Just check the first src_path. If
there are more than one, we'll check for homogeneity among them
down below. */
@@ -1976,7 +2836,7 @@ try_copy(svn_boolean_t *timestamp_sleep,
{
svn_client_copy_source_t *source = APR_ARRAY_IDX(sources, i,
svn_client_copy_source_t *);
- svn_client__copy_pair_t *pair = apr_palloc(pool, sizeof(*pair));
+ svn_client__copy_pair_t *pair = apr_pcalloc(pool, sizeof(*pair));
const char *src_basename;
svn_boolean_t src_is_url = svn_path_is_url(source->path);
@@ -1998,6 +2858,7 @@ try_copy(svn_boolean_t *timestamp_sleep,
pair->src_op_revision = *source->revision;
pair->src_peg_revision = *source->peg_revision;
+ pair->src_kind = svn_node_unknown;
SVN_ERR(svn_opt_resolve_revisions(&pair->src_peg_revision,
&pair->src_op_revision,
@@ -2026,7 +2887,7 @@ try_copy(svn_boolean_t *timestamp_sleep,
else
{
/* Only one source path. */
- svn_client__copy_pair_t *pair = apr_palloc(pool, sizeof(*pair));
+ svn_client__copy_pair_t *pair = apr_pcalloc(pool, sizeof(*pair));
svn_client_copy_source_t *source =
APR_ARRAY_IDX(sources, 0, svn_client_copy_source_t *);
svn_boolean_t src_is_url = svn_path_is_url(source->path);
@@ -2038,6 +2899,7 @@ try_copy(svn_boolean_t *timestamp_sleep,
source->path, pool));
pair->src_op_revision = *source->revision;
pair->src_peg_revision = *source->peg_revision;
+ pair->src_kind = svn_node_unknown;
SVN_ERR(svn_opt_resolve_revisions(&pair->src_peg_revision,
&pair->src_op_revision,
@@ -2184,7 +3046,7 @@ try_copy(svn_boolean_t *timestamp_sleep,
SVN_ERR(svn_wc__node_get_origin(NULL, &copyfrom_rev,
&copyfrom_repos_relpath,
&copyfrom_repos_root_url,
- NULL, NULL,
+ NULL, NULL, NULL,
ctx->wc_ctx,
pair->src_abspath_or_url,
TRUE, iterpool, iterpool));
@@ -2239,30 +3101,35 @@ try_copy(svn_boolean_t *timestamp_sleep,
else
{
/* We ignore these values, so assert the default value */
- SVN_ERR_ASSERT(allow_mixed_revisions && !metadata_only);
+ SVN_ERR_ASSERT(allow_mixed_revisions);
return svn_error_trace(do_wc_to_wc_copies(timestamp_sleep,
- copy_pairs, ctx, pool));
+ copy_pairs,
+ metadata_only,
+ pin_externals,
+ externals_to_pin,
+ ctx, pool));
}
}
else if ((! srcs_are_urls) && (dst_is_url))
{
return svn_error_trace(
wc_to_repos_copy(copy_pairs, make_parents, revprop_table,
- commit_callback, commit_baton, ctx, pool));
+ commit_callback, commit_baton,
+ pin_externals, externals_to_pin, ctx, pool));
}
else if ((srcs_are_urls) && (! dst_is_url))
{
return svn_error_trace(
repos_to_wc_copy(timestamp_sleep,
copy_pairs, make_parents, ignore_externals,
- ctx, pool));
+ pin_externals, externals_to_pin, ctx, pool));
}
else
{
return svn_error_trace(
repos_to_repos_copy(copy_pairs, make_parents, revprop_table,
commit_callback, commit_baton, ctx, is_move,
- pool));
+ pin_externals, externals_to_pin, pool));
}
}
@@ -2270,11 +3137,14 @@ try_copy(svn_boolean_t *timestamp_sleep,
/* Public Interfaces */
svn_error_t *
-svn_client_copy6(const apr_array_header_t *sources,
+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,
@@ -2293,9 +3163,11 @@ svn_client_copy6(const apr_array_header_t *sources,
sources, dst_path,
FALSE /* is_move */,
TRUE /* allow_mixed_revisions */,
- FALSE /* metadata_only */,
+ metadata_only,
make_parents,
ignore_externals,
+ pin_externals,
+ externals_to_pin,
revprop_table,
commit_callback, commit_baton,
ctx,
@@ -2327,9 +3199,11 @@ svn_client_copy6(const apr_array_header_t *sources,
sources, dst_path,
FALSE /* is_move */,
TRUE /* allow_mixed_revisions */,
- FALSE /* metadata_only */,
+ metadata_only,
make_parents,
ignore_externals,
+ pin_externals,
+ externals_to_pin,
revprop_table,
commit_callback, commit_baton,
ctx,
@@ -2391,6 +3265,8 @@ svn_client_move7(const apr_array_header_t *src_paths,
metadata_only,
make_parents,
FALSE /* ignore_externals */,
+ FALSE /* pin_externals */,
+ NULL /* externals_to_pin */,
revprop_table,
commit_callback, commit_baton,
ctx,
@@ -2424,6 +3300,8 @@ svn_client_move7(const apr_array_header_t *src_paths,
metadata_only,
make_parents,
FALSE /* ignore_externals */,
+ FALSE /* pin_externals */,
+ NULL /* externals_to_pin */,
revprop_table,
commit_callback, commit_baton,
ctx,
diff --git a/subversion/libsvn_client/copy_foreign.c b/subversion/libsvn_client/copy_foreign.c
index 8de8a5d..cfe6aea 100644
--- a/subversion/libsvn_client/copy_foreign.c
+++ b/subversion/libsvn_client/copy_foreign.c
@@ -160,7 +160,7 @@ dir_change_prop(void *dir_baton,
if (! db->created)
{
/* We can still store them in the hash for immediate addition
- with the svn_wc_add_from_disk2() call */
+ with the svn_wc_add_from_disk3() call */
if (! db->properties)
db->properties = apr_hash_make(db->pool);
@@ -173,7 +173,7 @@ dir_change_prop(void *dir_baton,
/* We have already notified for this directory, so don't do that again */
SVN_ERR(svn_wc_prop_set4(eb->wc_ctx, db->local_abspath, name, value,
svn_depth_empty, FALSE, NULL,
- NULL, NULL, /* Cancelation */
+ NULL, NULL, /* Cancellation */
NULL, NULL, /* Notification */
scratch_pool));
}
@@ -213,9 +213,10 @@ ensure_added(struct dir_baton_t *db,
db->created = TRUE;
/* Add the directory with all the already collected properties */
- SVN_ERR(svn_wc_add_from_disk2(db->eb->wc_ctx,
+ SVN_ERR(svn_wc_add_from_disk3(db->eb->wc_ctx,
db->local_abspath,
db->properties,
+ TRUE /* skip checks */,
db->eb->notify_func,
db->eb->notify_baton,
scratch_pool));
@@ -306,7 +307,7 @@ file_change_prop(void *file_baton,
}
/* We store all properties in the hash for immediate addition
- with the svn_wc_add_from_disk2() call */
+ with the svn_wc_add_from_disk3() call */
if (! fb->properties)
fb->properties = apr_hash_make(fb->pool);
@@ -375,7 +376,8 @@ file_close(void *file_baton,
fb->pool)));
}
- SVN_ERR(svn_wc_add_from_disk2(eb->wc_ctx, fb->local_abspath, fb->properties,
+ SVN_ERR(svn_wc_add_from_disk3(eb->wc_ctx, fb->local_abspath, fb->properties,
+ TRUE /* skip checks */,
eb->notify_func, eb->notify_baton,
fb->pool));
@@ -526,7 +528,7 @@ svn_client__copy_foreign(const char *url,
for (hi = apr_hash_first(scratch_pool, props); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
+ const char *name = apr_hash_this_key(hi);
if (svn_property_kind2(name) != svn_prop_regular_kind
|| ! strcmp(name, SVN_PROP_MERGEINFO))
@@ -538,12 +540,14 @@ svn_client__copy_foreign(const char *url,
if (!already_locked)
SVN_WC__CALL_WITH_WRITE_LOCK(
- svn_wc_add_from_disk2(ctx->wc_ctx, dst_abspath, props,
+ svn_wc_add_from_disk3(ctx->wc_ctx, dst_abspath, props,
+ TRUE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2,
scratch_pool),
ctx->wc_ctx, dir_abspath, FALSE, scratch_pool);
else
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, dst_abspath, props,
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, dst_abspath, props,
+ TRUE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2,
scratch_pool));
}
diff --git a/subversion/libsvn_client/ctx.c b/subversion/libsvn_client/ctx.c
index 185b91e..05a5eec 100644
--- a/subversion/libsvn_client/ctx.c
+++ b/subversion/libsvn_client/ctx.c
@@ -27,6 +27,7 @@
/*** Includes. ***/
+#include <stddef.h>
#include <apr_pools.h>
#include "svn_hash.h"
#include "svn_client.h"
@@ -34,6 +35,8 @@
#include "private/svn_wc_private.h"
+#include "client.h"
+
/*** Code. ***/
@@ -76,6 +79,20 @@ call_conflict_func(svn_wc_conflict_result_t **result,
return SVN_NO_ERROR;
}
+/* The magic number in client_ctx_t.magic_id. */
+#define CLIENT_CTX_MAGIC APR_UINT64_C(0xDEADBEEF600DF00D)
+
+svn_client__private_ctx_t *
+svn_client__get_private_ctx(svn_client_ctx_t *ctx)
+{
+ svn_client__private_ctx_t *const private_ctx =
+ (void*)((char *)ctx - offsetof(svn_client__private_ctx_t, public_ctx));
+ SVN_ERR_ASSERT_NO_RETURN(&private_ctx->public_ctx == ctx);
+ SVN_ERR_ASSERT_NO_RETURN(0 == private_ctx->magic_null);
+ SVN_ERR_ASSERT_NO_RETURN(CLIENT_CTX_MAGIC == private_ctx->magic_id);
+ return private_ctx;
+}
+
svn_error_t *
svn_client_create_context2(svn_client_ctx_t **ctx,
apr_hash_t *cfg_hash,
@@ -83,23 +100,29 @@ svn_client_create_context2(svn_client_ctx_t **ctx,
{
svn_config_t *cfg_config;
- *ctx = apr_pcalloc(pool, sizeof(svn_client_ctx_t));
+ svn_client__private_ctx_t *const private_ctx =
+ apr_pcalloc(pool, sizeof(*private_ctx));
+ svn_client_ctx_t *const public_ctx = &private_ctx->public_ctx;
+
+ private_ctx->magic_null = 0;
+ private_ctx->magic_id = CLIENT_CTX_MAGIC;
- (*ctx)->notify_func2 = call_notify_func;
- (*ctx)->notify_baton2 = *ctx;
+ public_ctx->notify_func2 = call_notify_func;
+ public_ctx->notify_baton2 = public_ctx;
- (*ctx)->conflict_func2 = call_conflict_func;
- (*ctx)->conflict_baton2 = *ctx;
+ public_ctx->conflict_func2 = call_conflict_func;
+ public_ctx->conflict_baton2 = public_ctx;
- (*ctx)->config = cfg_hash;
+ public_ctx->config = cfg_hash;
if (cfg_hash)
cfg_config = svn_hash_gets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG);
else
cfg_config = NULL;
- SVN_ERR(svn_wc_context_create(&(*ctx)->wc_ctx, cfg_config, pool,
- pool));
+ SVN_ERR(svn_wc_context_create(&public_ctx->wc_ctx, cfg_config,
+ pool, pool));
+ *ctx = public_ctx;
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/delete.c b/subversion/libsvn_client/delete.c
index 803b70c..943cdd9 100644
--- a/subversion/libsvn_client/delete.c
+++ b/subversion/libsvn_client/delete.c
@@ -258,6 +258,15 @@ single_repos_delete(svn_ra_session_t *ra_session,
editor->abort_edit(edit_baton, pool)));
}
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(base_uri,
+ svn_wc_notify_commit_finalizing,
+ pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
+ }
+
/* Close the edit. */
return svn_error_trace(editor->close_edit(edit_baton, pool));
}
@@ -296,7 +305,7 @@ delete_urls_multi_repos(const apr_array_header_t *uris,
for (hi = apr_hash_first(pool, deletables); hi; hi = apr_hash_next(hi))
{
- const char *repos_root = svn__apr_hash_index_key(hi);
+ const char *repos_root = apr_hash_this_key(hi);
repos_relpath = svn_uri_skip_ancestor(repos_root, uri, pool);
if (repos_relpath)
@@ -304,7 +313,7 @@ delete_urls_multi_repos(const apr_array_header_t *uris,
/* Great! We've found another URI underneath this
session. We'll pick out the related RA session for
use later, store the new target, and move on. */
- repos_deletables = svn__apr_hash_index_val(hi);
+ repos_deletables = apr_hash_this_val(hi);
APR_ARRAY_PUSH(repos_deletables->target_uris, const char *) =
apr_pstrdup(pool, uri);
break;
@@ -346,14 +355,14 @@ delete_urls_multi_repos(const apr_array_header_t *uris,
RA error code otherwise for 1.6 compatibility.) */
if (!repos_relpath || !*repos_relpath)
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
- "URL '%s' not within a repository", uri);
+ _("URL '%s' not within a repository"), uri);
/* Now, test to see if the thing actually exists in HEAD. */
SVN_ERR(svn_ra_check_path(repos_deletables->ra_session, repos_relpath,
SVN_INVALID_REVNUM, &kind, pool));
if (kind == svn_node_none)
return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
- "URL '%s' does not exist", uri);
+ _("URL '%s' does not exist"), uri);
}
/* Now we iterate over the DELETABLES hash, issuing a commit for
@@ -361,7 +370,7 @@ delete_urls_multi_repos(const apr_array_header_t *uris,
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, deletables); hi; hi = apr_hash_next(hi))
{
- struct repos_deletables_t *repos_deletables = svn__apr_hash_index_val(hi);
+ struct repos_deletables_t *repos_deletables = apr_hash_this_val(hi);
const char *base_uri;
apr_array_header_t *target_relpaths;
@@ -573,7 +582,7 @@ svn_client_delete4(const apr_array_header_t *paths,
for (hi = apr_hash_first(pool, wcroots); hi; hi = apr_hash_next(hi))
{
const char *root_abspath;
- const apr_array_header_t *targets = svn__apr_hash_index_val(hi);
+ const apr_array_header_t *targets = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
diff --git a/subversion/libsvn_client/deprecated.c b/subversion/libsvn_client/deprecated.c
index a67a69b..b1760a4 100644
--- a/subversion/libsvn_client/deprecated.c
+++ b/subversion/libsvn_client/deprecated.c
@@ -627,6 +627,28 @@ svn_client_commit(svn_client_commit_info_t **commit_info_p,
/*** From copy.c ***/
svn_error_t *
+svn_client_copy6(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,
+ const apr_hash_t *revprop_table,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_client_copy7(sources, dst_path, copy_as_child,
+ make_parents, ignore_externals,
+ FALSE /* metadata_only */,
+ FALSE /* pin_externals */,
+ NULL /* externals_to_pin */,
+ revprop_table,
+ commit_callback, commit_baton,
+ ctx, pool));
+}
+
+svn_error_t *
svn_client_copy5(svn_commit_info_t **commit_info_p,
const apr_array_header_t *sources,
const char *dst_path,
@@ -1498,6 +1520,7 @@ svn_client_ls(apr_hash_t **dirents,
}
/*** From log.c ***/
+
svn_error_t *
svn_client_log4(const apr_array_header_t *targets,
const svn_opt_revision_t *peg_revision,
@@ -1970,8 +1993,8 @@ svn_client_propget3(apr_hash_t **props,
for (hi = apr_hash_first(pool, temp_props); hi;
hi = apr_hash_next(hi))
{
- const char *abspath = svn__apr_hash_index_key(hi);
- svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *abspath = apr_hash_this_key(hi);
+ svn_string_t *value = apr_hash_this_val(hi);
const char *relpath = svn_dirent_join(path_or_url,
svn_dirent_skip_ancestor(target, abspath),
pool);
@@ -2031,9 +2054,9 @@ string_hash_dup(apr_hash_t *hash, apr_pool_t *pool)
for (hi = apr_hash_first(pool, hash); hi; hi = apr_hash_next(hi))
{
- const char *key = apr_pstrdup(pool, svn__apr_hash_index_key(hi));
- apr_ssize_t klen = svn__apr_hash_index_klen(hi);
- svn_string_t *val = svn_string_dup(svn__apr_hash_index_val(hi), pool);
+ const char *key = apr_pstrdup(pool, apr_hash_this_key(hi));
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ svn_string_t *val = svn_string_dup(apr_hash_this_val(hi), pool);
apr_hash_set(new_hash, key, klen, val);
}
@@ -2185,6 +2208,28 @@ svn_client_proplist(apr_array_header_t **props,
/*** From status.c ***/
+svn_error_t *
+svn_client_status5(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 update,
+ 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)
+{
+ return svn_client_status6(result_rev, ctx, path, revision, depth,
+ get_all, update, TRUE, no_ignore,
+ ignore_externals, depth_as_sticky, changelists,
+ status_func, status_baton, scratch_pool);
+}
+
struct status4_wrapper_baton
{
svn_wc_context_t *wc_ctx;
@@ -2439,6 +2484,21 @@ svn_client_switch(svn_revnum_t *result_rev,
/*** From cat.c ***/
svn_error_t *
+svn_client_cat2(svn_stream_t *out,
+ const char *path_or_url,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *revision,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ return svn_client_cat3(NULL /* props */,
+ out, path_or_url, peg_revision, revision,
+ TRUE /* expand_keywords */,
+ ctx, pool, pool);
+}
+
+
+svn_error_t *
svn_client_cat(svn_stream_t *out,
const char *path_or_url,
const svn_opt_revision_t *revision,
@@ -2487,6 +2547,32 @@ svn_client_checkout(svn_revnum_t *result_rev,
/*** From info.c ***/
+svn_error_t *
+svn_client_info3(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,
+ const apr_array_header_t *changelists,
+ svn_client_info_receiver2_t receiver,
+ void *receiver_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(
+ svn_client_info4(abspath_or_url,
+ peg_revision,
+ revision,
+ depth,
+ fetch_excluded,
+ fetch_actual_only,
+ FALSE /* include_externals */,
+ changelists,
+ receiver, receiver_baton,
+ ctx, pool));
+}
+
svn_info_t *
svn_info_dup(const svn_info_t *info, apr_pool_t *pool)
{
@@ -2747,6 +2833,22 @@ svn_client_resolved(const char *path,
}
/*** From revert.c ***/
svn_error_t *
+svn_client_revert2(const apr_array_header_t *paths,
+ svn_depth_t depth,
+ const apr_array_header_t *changelists,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_client_revert3(paths,
+ depth,
+ changelists,
+ FALSE /* clear_changelists */,
+ FALSE /* metadata_only */,
+ ctx,
+ pool));
+}
+
+svn_error_t *
svn_client_revert(const apr_array_header_t *paths,
svn_boolean_t recursive,
svn_client_ctx_t *ctx,
@@ -2783,7 +2885,7 @@ svn_client_uuid_from_url(const char **uuid,
/* destroy the RA session */
svn_pool_destroy(subpool);
- return svn_error_trace(err);;
+ return svn_error_trace(err);
}
svn_error_t *
@@ -2964,3 +3066,24 @@ svn_client_commit_item2_dup(const svn_client_commit_item2_t *item,
return new_item;
}
+svn_error_t *
+svn_client_cleanup(const char *path,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ const char *local_abspath;
+
+ if (svn_path_is_url(path))
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("'%s' is not a local path"), path);
+
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
+
+ return svn_error_trace(svn_client_cleanup2(local_abspath,
+ TRUE /* break_locks */,
+ TRUE /* fix_recorded_timestamps */,
+ TRUE /* clear_dav_cache */,
+ TRUE /* vacuum_pristines */,
+ FALSE /* include_externals */,
+ ctx, scratch_pool));
+}
diff --git a/subversion/libsvn_client/diff.c b/subversion/libsvn_client/diff.c
index 26890ae..4817ffd 100644
--- a/subversion/libsvn_client/diff.c
+++ b/subversion/libsvn_client/diff.c
@@ -52,20 +52,22 @@
#include "private/svn_diff_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_io_private.h"
+#include "private/svn_ra_private.h"
#include "svn_private_config.h"
/* Utilities */
+#define DIFF_REVNUM_NONEXISTENT ((svn_revnum_t) -100)
#define MAKE_ERR_BAD_RELATIVE_PATH(path, relative_to_dir) \
svn_error_createf(SVN_ERR_BAD_RELATIVE_PATH, NULL, \
_("Path '%s' must be an immediate child of " \
"the directory '%s'"), path, relative_to_dir)
-/* Calculate the repository relative path of DIFF_RELPATH, using RA_SESSION
- * and WC_CTX, and return the result in *REPOS_RELPATH.
+/* Calculate the repository relative path of DIFF_RELPATH, using
+ * SESSION_RELPATH and WC_CTX, and return the result in *REPOS_RELPATH.
* ORIG_TARGET is the related original target passed to the diff command,
* and may be used to derive leading path components missing from PATH.
* ANCHOR is the local path where the diff editor is anchored.
@@ -74,16 +76,15 @@ static svn_error_t *
make_repos_relpath(const char **repos_relpath,
const char *diff_relpath,
const char *orig_target,
- svn_ra_session_t *ra_session,
+ const char *session_relpath,
svn_wc_context_t *wc_ctx,
const char *anchor,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *local_abspath;
- const char *orig_repos_relpath = NULL;
- if (! ra_session
+ if (! session_relpath
|| (anchor && !svn_path_is_url(orig_target)))
{
svn_error_t *err;
@@ -98,7 +99,7 @@ make_repos_relpath(const char **repos_relpath,
wc_ctx, local_abspath,
result_pool, scratch_pool);
- if (!ra_session
+ if (!session_relpath
|| ! err
|| (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND))
{
@@ -113,23 +114,8 @@ make_repos_relpath(const char **repos_relpath,
svn_error_clear(err);
}
- {
- const char *url;
- const char *repos_root_url;
-
- /* Would be nice if the RA layer could just provide the parent
- repos_relpath of the ra session */
- SVN_ERR(svn_ra_get_session_url(ra_session, &url, scratch_pool));
-
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
- scratch_pool));
-
- orig_repos_relpath = svn_uri_skip_ancestor(repos_root_url, url,
- scratch_pool);
-
- *repos_relpath = svn_relpath_join(orig_repos_relpath, diff_relpath,
- result_pool);
- }
+ *repos_relpath = svn_relpath_join(session_relpath, diff_relpath,
+ result_pool);
return SVN_NO_ERROR;
}
@@ -169,9 +155,6 @@ adjust_paths_for_diff_labels(const char **index_path,
new_path = ".";
else
return MAKE_ERR_BAD_RELATIVE_PATH(new_path, relative_to_dir);
-
- child_path = svn_dirent_is_child(relative_to_dir, new_path1,
- result_pool);
}
{
@@ -179,7 +162,7 @@ adjust_paths_for_diff_labels(const char **index_path,
svn_boolean_t is_url1;
svn_boolean_t is_url2;
/* ### Holy cow. Due to anchor/target weirdness, we can't
- simply join diff_cmd_baton->orig_path_1 with path, ditto for
+ simply join dwi->orig_path_1 with path, ditto for
orig_path_2. That will work when they're directory URLs, but
not for file URLs. Nor can we just use anchor1 and anchor2
from do_diff(), at least not without some more logic here.
@@ -230,7 +213,7 @@ adjust_paths_for_diff_labels(const char **index_path,
if (new_path2[0] == '\0')
new_path2 = new_path;
else if (svn_path_is_url(new_path2))
- new_path1 = apr_psprintf(result_pool, "%s\t(%s)", new_path, new_path2);
+ new_path2 = apr_psprintf(result_pool, "%s\t(%s)", new_path, new_path2);
else if (new_path2[0] == '/')
new_path2 = apr_psprintf(result_pool, "%s\t(...%s)", new_path, new_path2);
else
@@ -254,9 +237,11 @@ diff_label(const char *path,
apr_pool_t *pool)
{
const char *label;
- if (revnum != SVN_INVALID_REVNUM)
+ if (revnum >= 0)
label = apr_psprintf(pool, _("%s\t(revision %ld)"), path, revnum);
- else
+ else if (revnum == DIFF_REVNUM_NONEXISTENT)
+ label = apr_psprintf(pool, _("%s\t(nonexistent)"), path);
+ else /* SVN_INVALID_REVNUM */
label = apr_psprintf(pool, _("%s\t(working copy)"), path);
return label;
@@ -452,7 +437,9 @@ display_prop_diffs(const apr_array_header_t *propchanges,
const char *relative_to_dir,
svn_boolean_t show_diff_header,
svn_boolean_t use_git_diff_format,
- svn_ra_session_t *ra_session,
+ const char *ra_session_relpath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
svn_wc_context_t *wc_ctx,
apr_pool_t *scratch_pool)
{
@@ -465,10 +452,10 @@ display_prop_diffs(const apr_array_header_t *propchanges,
if (use_git_diff_format)
{
SVN_ERR(make_repos_relpath(&repos_relpath1, diff_relpath, orig_path1,
- ra_session, wc_ctx, anchor,
+ ra_session_relpath, wc_ctx, anchor,
scratch_pool, scratch_pool));
SVN_ERR(make_repos_relpath(&repos_relpath2, diff_relpath, orig_path2,
- ra_session, wc_ctx, anchor,
+ ra_session_relpath, wc_ctx, anchor,
scratch_pool, scratch_pool));
}
@@ -521,7 +508,9 @@ display_prop_diffs(const apr_array_header_t *propchanges,
SVN_ERR(svn_diff__display_prop_diffs(
outstream, encoding, propchanges, original_props,
- TRUE /* pretty_print_mergeinfo */, scratch_pool));
+ TRUE /* pretty_print_mergeinfo */,
+ -1 /* context_size */,
+ cancel_func, cancel_baton, scratch_pool));
return SVN_NO_ERROR;
}
@@ -530,9 +519,27 @@ display_prop_diffs(const apr_array_header_t *propchanges,
/*** Callbacks for 'svn diff', invoked by the repos-diff editor. ***/
+/* State provided by the diff drivers; used by the diff writer */
+typedef struct diff_driver_info_t
+{
+ /* The anchor to prefix before wc paths */
+ const char *anchor;
-struct diff_cmd_baton {
+ /* Relative path of ra session from repos_root_url */
+ const char *session_relpath;
+ /* The original targets passed to the diff command. We may need
+ these to construct distinctive diff labels when comparing the
+ same relative path in the same revision, under different anchors
+ (for example, when comparing a trunk against a branch). */
+ const char *orig_path_1;
+ const char *orig_path_2;
+} diff_driver_info_t;
+
+
+/* Diff writer state */
+typedef struct diff_writer_info_t
+{
/* If non-null, the external diff command to invoke. */
const char *diff_cmd;
@@ -556,24 +563,6 @@ struct diff_cmd_baton {
const char *header_encoding;
- /* The original targets passed to the diff command. We may need
- these to construct distinctive diff labels when comparing the
- same relative path in the same revision, under different anchors
- (for example, when comparing a trunk against a branch). */
- const char *orig_path_1;
- const char *orig_path_2;
-
- /* These are the numeric representations of the revisions passed to
- svn_client_diff6(), either may be SVN_INVALID_REVNUM. We need these
- because some of the svn_wc_diff_callbacks4_t don't get revision
- arguments.
-
- ### Perhaps we should change the callback signatures and eliminate
- ### these?
- */
- svn_revnum_t revnum1;
- svn_revnum_t revnum2;
-
/* Set this if you want diff output even for binary files. */
svn_boolean_t force_binary;
@@ -597,22 +586,18 @@ struct diff_cmd_baton {
svn_boolean_t no_diff_deleted;
/* Whether to ignore copyfrom information when showing adds */
- svn_boolean_t no_copyfrom_on_add;
+ svn_boolean_t show_copies_as_adds;
/* Empty files for creating diffs or NULL if not used yet */
const char *empty_file;
svn_wc_context_t *wc_ctx;
- /* The RA session used during diffs involving the repository. */
- svn_ra_session_t *ra_session;
-
- /* The anchor to prefix before wc paths */
- const char *anchor;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
- /* Whether the local diff target of a repos->wc diff is a copy. */
- svn_boolean_t repos_wc_diff_target_is_copy;
-};
+ struct diff_driver_info_t ddi;
+} diff_writer_info_t;
/* An helper for diff_dir_props_changed, diff_file_changed and diff_file_added
*/
@@ -620,17 +605,16 @@ static svn_error_t *
diff_props_changed(const char *diff_relpath,
svn_revnum_t rev1,
svn_revnum_t rev2,
- svn_boolean_t dir_was_added,
const apr_array_header_t *propchanges,
apr_hash_t *original_props,
svn_boolean_t show_diff_header,
- struct diff_cmd_baton *diff_cmd_baton,
+ diff_writer_info_t *dwi,
apr_pool_t *scratch_pool)
{
apr_array_header_t *props;
/* If property differences are ignored, there's nothing to do. */
- if (diff_cmd_baton->ignore_properties)
+ if (dwi->ignore_properties)
return SVN_NO_ERROR;
SVN_ERR(svn_categorize_props(propchanges, NULL, NULL, &props,
@@ -638,58 +622,31 @@ diff_props_changed(const char *diff_relpath,
if (props->nelts > 0)
{
- /* We're using the revnums from the diff_cmd_baton since there's
+ /* We're using the revnums from the dwi since there's
* no revision argument to the svn_wc_diff_callback_t
* dir_props_changed(). */
SVN_ERR(display_prop_diffs(props, original_props,
diff_relpath,
- diff_cmd_baton->anchor,
- diff_cmd_baton->orig_path_1,
- diff_cmd_baton->orig_path_2,
+ dwi->ddi.anchor,
+ dwi->ddi.orig_path_1,
+ dwi->ddi.orig_path_2,
rev1,
rev2,
- diff_cmd_baton->header_encoding,
- diff_cmd_baton->outstream,
- diff_cmd_baton->relative_to_dir,
+ dwi->header_encoding,
+ dwi->outstream,
+ dwi->relative_to_dir,
show_diff_header,
- diff_cmd_baton->use_git_diff_format,
- diff_cmd_baton->ra_session,
- diff_cmd_baton->wc_ctx,
+ dwi->use_git_diff_format,
+ dwi->ddi.session_relpath,
+ dwi->cancel_func,
+ dwi->cancel_baton,
+ dwi->wc_ctx,
scratch_pool));
}
return SVN_NO_ERROR;
}
-/* An svn_wc_diff_callbacks4_t function. */
-static svn_error_t *
-diff_dir_props_changed(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- svn_boolean_t dir_was_added,
- const apr_array_header_t *propchanges,
- apr_hash_t *original_props,
- void *diff_baton,
- apr_pool_t *scratch_pool)
-{
- struct diff_cmd_baton *diff_cmd_baton = diff_baton;
-
- return svn_error_trace(diff_props_changed(diff_relpath,
- /* ### These revs be filled
- * ### with per node info */
- dir_was_added
- ? 0 /* Magic legacy value */
- : diff_cmd_baton->revnum1,
- diff_cmd_baton->revnum2,
- dir_was_added,
- propchanges,
- original_props,
- TRUE /* show_diff_header */,
- diff_cmd_baton,
- scratch_pool));
-}
-
-
/* Show differences between TMPFILE1 and TMPFILE2. DIFF_RELPATH, REV1, and
REV2 are used in the headers to indicate the file and revisions. If either
MIMETYPE1 or MIMETYPE2 indicate binary content, don't show a diff,
@@ -711,26 +668,24 @@ diff_content_changed(svn_boolean_t *wrote_header,
svn_boolean_t force_diff,
const char *copyfrom_path,
svn_revnum_t copyfrom_rev,
- struct diff_cmd_baton *diff_cmd_baton,
+ diff_writer_info_t *dwi,
apr_pool_t *scratch_pool)
{
- int exitcode;
- const char *rel_to_dir = diff_cmd_baton->relative_to_dir;
- svn_stream_t *errstream = diff_cmd_baton->errstream;
- svn_stream_t *outstream = diff_cmd_baton->outstream;
+ const char *rel_to_dir = dwi->relative_to_dir;
+ svn_stream_t *outstream = dwi->outstream;
const char *label1, *label2;
svn_boolean_t mt1_binary = FALSE, mt2_binary = FALSE;
const char *index_path = diff_relpath;
- const char *path1 = diff_cmd_baton->orig_path_1;
- const char *path2 = diff_cmd_baton->orig_path_2;
+ const char *path1 = dwi->ddi.orig_path_1;
+ const char *path2 = dwi->ddi.orig_path_2;
/* If only property differences are shown, there's nothing to do. */
- if (diff_cmd_baton->properties_only)
+ if (dwi->properties_only)
return SVN_NO_ERROR;
/* Generate the diff headers. */
SVN_ERR(adjust_paths_for_diff_labels(&index_path, &path1, &path2,
- rel_to_dir, diff_cmd_baton->anchor,
+ rel_to_dir, dwi->ddi.anchor,
scratch_pool, scratch_pool));
label1 = diff_label(path1, rev1, scratch_pool);
@@ -744,42 +699,82 @@ diff_content_changed(svn_boolean_t *wrote_header,
if (mimetype2)
mt2_binary = svn_mime_type_is_binary(mimetype2);
- if (! diff_cmd_baton->force_binary && (mt1_binary || mt2_binary))
+ if (! dwi->force_binary && (mt1_binary || mt2_binary))
{
/* Print out the diff header. */
SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
+ dwi->header_encoding, scratch_pool,
"Index: %s" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
/* ### Print git diff headers. */
- SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
- _("Cannot display: file marked as a binary type.%s"),
- APR_EOL_STR));
-
- if (mt1_binary && !mt2_binary)
- SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
- "svn:mime-type = %s" APR_EOL_STR, mimetype1));
- else if (mt2_binary && !mt1_binary)
- SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
- "svn:mime-type = %s" APR_EOL_STR, mimetype2));
- else if (mt1_binary && mt2_binary)
+ if (dwi->use_git_diff_format)
+ {
+ svn_stream_t *left_stream;
+ svn_stream_t *right_stream;
+ const char *repos_relpath1;
+ const char *repos_relpath2;
+
+ SVN_ERR(make_repos_relpath(&repos_relpath1, diff_relpath,
+ dwi->ddi.orig_path_1,
+ dwi->ddi.session_relpath,
+ dwi->wc_ctx,
+ dwi->ddi.anchor,
+ scratch_pool, scratch_pool));
+ SVN_ERR(make_repos_relpath(&repos_relpath2, diff_relpath,
+ dwi->ddi.orig_path_2,
+ dwi->ddi.session_relpath,
+ dwi->wc_ctx,
+ dwi->ddi.anchor,
+ scratch_pool, scratch_pool));
+ SVN_ERR(print_git_diff_header(outstream, &label1, &label2,
+ operation,
+ repos_relpath1, repos_relpath2,
+ rev1, rev2,
+ copyfrom_path,
+ copyfrom_rev,
+ dwi->header_encoding,
+ scratch_pool));
+
+ SVN_ERR(svn_stream_open_readonly(&left_stream, tmpfile1,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream_open_readonly(&right_stream, tmpfile2,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_diff_output_binary(outstream,
+ left_stream, right_stream,
+ dwi->cancel_func, dwi->cancel_baton,
+ scratch_pool));
+ }
+ else
{
- if (strcmp(mimetype1, mimetype2) == 0)
+ SVN_ERR(svn_stream_printf_from_utf8(outstream,
+ dwi->header_encoding, scratch_pool,
+ _("Cannot display: file marked as a binary type.%s"),
+ APR_EOL_STR));
+
+ if (mt1_binary && !mt2_binary)
SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
- "svn:mime-type = %s" APR_EOL_STR,
- mimetype1));
- else
+ dwi->header_encoding, scratch_pool,
+ "svn:mime-type = %s" APR_EOL_STR, mimetype1));
+ else if (mt2_binary && !mt1_binary)
SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
- "svn:mime-type = (%s, %s)" APR_EOL_STR,
- mimetype1, mimetype2));
+ dwi->header_encoding, scratch_pool,
+ "svn:mime-type = %s" APR_EOL_STR, mimetype2));
+ else if (mt1_binary && mt2_binary)
+ {
+ if (strcmp(mimetype1, mimetype2) == 0)
+ SVN_ERR(svn_stream_printf_from_utf8(outstream,
+ dwi->header_encoding, scratch_pool,
+ "svn:mime-type = %s" APR_EOL_STR,
+ mimetype1));
+ else
+ SVN_ERR(svn_stream_printf_from_utf8(outstream,
+ dwi->header_encoding, scratch_pool,
+ "svn:mime-type = (%s, %s)" APR_EOL_STR,
+ mimetype1, mimetype2));
+ }
}
/* Exit early. */
@@ -787,17 +782,19 @@ diff_content_changed(svn_boolean_t *wrote_header,
}
- if (diff_cmd_baton->diff_cmd)
+ if (dwi->diff_cmd)
{
+ svn_stream_t *errstream = dwi->errstream;
apr_file_t *outfile;
apr_file_t *errfile;
const char *outfilename;
const char *errfilename;
svn_stream_t *stream;
+ int exitcode;
/* Print out the diff header. */
SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
+ dwi->header_encoding, scratch_pool,
"Index: %s" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
@@ -827,12 +824,12 @@ diff_content_changed(svn_boolean_t *wrote_header,
scratch_pool, scratch_pool));
SVN_ERR(svn_io_run_diff2(".",
- diff_cmd_baton->options.for_external.argv,
- diff_cmd_baton->options.for_external.argc,
+ dwi->options.for_external.argv,
+ dwi->options.for_external.argc,
label1, label2,
tmpfile1, tmpfile2,
&exitcode, outfile, errfile,
- diff_cmd_baton->diff_cmd, scratch_pool));
+ dwi->diff_cmd, scratch_pool));
/* Now, open and copy our files to our output streams. */
if (outfilename)
@@ -854,43 +851,44 @@ diff_content_changed(svn_boolean_t *wrote_header,
NULL, NULL, scratch_pool));
}
- /* We have a printed a diff for this path, mark it as visited. */
- *wrote_header = TRUE;
+ /* If we have printed a diff for this path, mark it as visited. */
+ if (exitcode == 1)
+ *wrote_header = TRUE;
}
else /* use libsvn_diff to generate the diff */
{
svn_diff_t *diff;
SVN_ERR(svn_diff_file_diff_2(&diff, tmpfile1, tmpfile2,
- diff_cmd_baton->options.for_internal,
+ dwi->options.for_internal,
scratch_pool));
if (force_diff
- || diff_cmd_baton->use_git_diff_format
+ || dwi->use_git_diff_format
|| svn_diff_contains_diffs(diff))
{
/* Print out the diff header. */
SVN_ERR(svn_stream_printf_from_utf8(outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
+ dwi->header_encoding, scratch_pool,
"Index: %s" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
- if (diff_cmd_baton->use_git_diff_format)
+ if (dwi->use_git_diff_format)
{
const char *repos_relpath1;
const char *repos_relpath2;
SVN_ERR(make_repos_relpath(&repos_relpath1, diff_relpath,
- diff_cmd_baton->orig_path_1,
- diff_cmd_baton->ra_session,
- diff_cmd_baton->wc_ctx,
- diff_cmd_baton->anchor,
+ dwi->ddi.orig_path_1,
+ dwi->ddi.session_relpath,
+ dwi->wc_ctx,
+ dwi->ddi.anchor,
scratch_pool, scratch_pool));
SVN_ERR(make_repos_relpath(&repos_relpath2, diff_relpath,
- diff_cmd_baton->orig_path_2,
- diff_cmd_baton->ra_session,
- diff_cmd_baton->wc_ctx,
- diff_cmd_baton->anchor,
+ dwi->ddi.orig_path_2,
+ dwi->ddi.session_relpath,
+ dwi->wc_ctx,
+ dwi->ddi.anchor,
scratch_pool, scratch_pool));
SVN_ERR(print_git_diff_header(outstream, &label1, &label2,
operation,
@@ -898,20 +896,23 @@ diff_content_changed(svn_boolean_t *wrote_header,
rev1, rev2,
copyfrom_path,
copyfrom_rev,
- diff_cmd_baton->header_encoding,
+ dwi->header_encoding,
scratch_pool));
}
/* Output the actual diff */
if (force_diff || svn_diff_contains_diffs(diff))
- SVN_ERR(svn_diff_file_output_unified3(outstream, diff,
+ SVN_ERR(svn_diff_file_output_unified4(outstream, diff,
tmpfile1, tmpfile2, label1, label2,
- diff_cmd_baton->header_encoding, rel_to_dir,
- diff_cmd_baton->options.for_internal->show_c_function,
+ dwi->header_encoding, rel_to_dir,
+ dwi->options.for_internal->show_c_function,
+ dwi->options.for_internal->context_size,
+ dwi->cancel_func, dwi->cancel_baton,
scratch_pool));
- /* We have a printed a diff for this path, mark it as visited. */
- *wrote_header = TRUE;
+ /* If we have printed a diff for this path, mark it as visited. */
+ if (dwi->use_git_diff_format || svn_diff_contains_diffs(diff))
+ *wrote_header = TRUE;
}
}
@@ -922,62 +923,43 @@ diff_content_changed(svn_boolean_t *wrote_header,
return SVN_NO_ERROR;
}
+/* An svn_diff_tree_processor_t callback. */
static svn_error_t *
-diff_file_opened(svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- const char *diff_relpath,
- svn_revnum_t rev,
- void *diff_baton,
- apr_pool_t *scratch_pool)
-{
- return SVN_NO_ERROR;
-}
-
-/* An svn_wc_diff_callbacks4_t function. */
-static svn_error_t *
-diff_file_changed(svn_wc_notify_state_t *content_state,
- svn_wc_notify_state_t *prop_state,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- const char *tmpfile1,
- const char *tmpfile2,
- svn_revnum_t rev1,
- svn_revnum_t rev2,
- const char *mimetype1,
- const char *mimetype2,
+diff_file_changed(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const svn_diff_source_t *right_source,
+ const char *left_file,
+ const char *right_file,
+ /*const*/ apr_hash_t *left_props,
+ /*const*/ apr_hash_t *right_props,
+ svn_boolean_t file_modified,
const apr_array_header_t *prop_changes,
- apr_hash_t *original_props,
- void *diff_baton,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
- struct diff_cmd_baton *diff_cmd_baton = diff_baton;
+ diff_writer_info_t *dwi = processor->baton;
svn_boolean_t wrote_header = FALSE;
- /* During repos->wc diff of a copy revision numbers obtained
- * from the working copy are always SVN_INVALID_REVNUM. */
- if (diff_cmd_baton->repos_wc_diff_target_is_copy)
- {
- if (rev1 == SVN_INVALID_REVNUM &&
- diff_cmd_baton->revnum1 != SVN_INVALID_REVNUM)
- rev1 = diff_cmd_baton->revnum1;
-
- if (rev2 == SVN_INVALID_REVNUM &&
- diff_cmd_baton->revnum2 != SVN_INVALID_REVNUM)
- rev2 = diff_cmd_baton->revnum2;
- }
-
- if (tmpfile1)
- SVN_ERR(diff_content_changed(&wrote_header, diff_relpath,
- tmpfile1, tmpfile2, rev1, rev2,
- mimetype1, mimetype2,
+ if (file_modified)
+ SVN_ERR(diff_content_changed(&wrote_header, relpath,
+ left_file, right_file,
+ left_source->revision,
+ right_source->revision,
+ svn_prop_get_value(left_props,
+ SVN_PROP_MIME_TYPE),
+ svn_prop_get_value(right_props,
+ SVN_PROP_MIME_TYPE),
svn_diff_op_modified, FALSE,
NULL,
- SVN_INVALID_REVNUM, diff_cmd_baton,
+ SVN_INVALID_REVNUM, dwi,
scratch_pool));
if (prop_changes->nelts > 0)
- SVN_ERR(diff_props_changed(diff_relpath, rev1, rev2, FALSE, prop_changes,
- original_props, !wrote_header,
- diff_cmd_baton, scratch_pool));
+ SVN_ERR(diff_props_changed(relpath,
+ left_source->revision,
+ right_source->revision, prop_changes,
+ left_props, !wrote_header,
+ dwi, scratch_pool));
return SVN_NO_ERROR;
}
@@ -985,132 +967,125 @@ diff_file_changed(svn_wc_notify_state_t *content_state,
each of these next two functions, they can be dumb wrappers around
the main workhorse routine. */
-/* An svn_wc_diff_callbacks4_t function. */
+/* An svn_diff_tree_processor_t callback. */
static svn_error_t *
-diff_file_added(svn_wc_notify_state_t *content_state,
- svn_wc_notify_state_t *prop_state,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- const char *tmpfile1,
- const char *tmpfile2,
- svn_revnum_t rev1,
- svn_revnum_t rev2,
- const char *mimetype1,
- const char *mimetype2,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_revision,
- const apr_array_header_t *prop_changes,
- apr_hash_t *original_props,
- void *diff_baton,
+diff_file_added(const char *relpath,
+ const svn_diff_source_t *copyfrom_source,
+ const svn_diff_source_t *right_source,
+ const char *copyfrom_file,
+ const char *right_file,
+ /*const*/ apr_hash_t *copyfrom_props,
+ /*const*/ apr_hash_t *right_props,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
- struct diff_cmd_baton *diff_cmd_baton = diff_baton;
+ diff_writer_info_t *dwi = processor->baton;
svn_boolean_t wrote_header = FALSE;
+ const char *left_file;
+ apr_hash_t *left_props;
+ apr_array_header_t *prop_changes;
/* During repos->wc diff of a copy revision numbers obtained
* from the working copy are always SVN_INVALID_REVNUM. */
- if (diff_cmd_baton->repos_wc_diff_target_is_copy)
+ if (copyfrom_source && !dwi->show_copies_as_adds)
{
- if (rev1 == SVN_INVALID_REVNUM &&
- diff_cmd_baton->revnum1 != SVN_INVALID_REVNUM)
- rev1 = diff_cmd_baton->revnum1;
-
- if (rev2 == SVN_INVALID_REVNUM &&
- diff_cmd_baton->revnum2 != SVN_INVALID_REVNUM)
- rev2 = diff_cmd_baton->revnum2;
+ left_file = copyfrom_file;
+ left_props = copyfrom_props ? copyfrom_props : apr_hash_make(scratch_pool);
}
-
- if (diff_cmd_baton->no_copyfrom_on_add
- && (copyfrom_path || SVN_IS_VALID_REVNUM(copyfrom_revision)))
+ else
{
- apr_hash_t *empty_hash = apr_hash_make(scratch_pool);
- apr_array_header_t *new_changes;
-
- /* Rebase changes on having no left source. */
- if (!diff_cmd_baton->empty_file)
- SVN_ERR(svn_io_open_unique_file3(NULL, &diff_cmd_baton->empty_file,
+ if (!dwi->empty_file)
+ SVN_ERR(svn_io_open_unique_file3(NULL, &dwi->empty_file,
NULL, svn_io_file_del_on_pool_cleanup,
- diff_cmd_baton->pool, scratch_pool));
+ dwi->pool, scratch_pool));
- SVN_ERR(svn_prop_diffs(&new_changes,
- svn_prop__patch(original_props, prop_changes,
- scratch_pool),
- empty_hash,
- scratch_pool));
+ left_file = dwi->empty_file;
+ left_props = apr_hash_make(scratch_pool);
- tmpfile1 = diff_cmd_baton->empty_file;
- prop_changes = new_changes;
- original_props = empty_hash;
- copyfrom_revision = SVN_INVALID_REVNUM;
+ copyfrom_source = NULL;
+ copyfrom_file = NULL;
}
- if (diff_cmd_baton->no_diff_added)
+ SVN_ERR(svn_prop_diffs(&prop_changes, right_props, left_props, scratch_pool));
+
+ if (dwi->no_diff_added)
{
- const char *index_path = diff_relpath;
+ const char *index_path = relpath;
- if (diff_cmd_baton->anchor)
- index_path = svn_dirent_join(diff_cmd_baton->anchor, diff_relpath,
+ if (dwi->ddi.anchor)
+ index_path = svn_dirent_join(dwi->ddi.anchor, relpath,
scratch_pool);
- SVN_ERR(svn_stream_printf_from_utf8(diff_cmd_baton->outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
+ SVN_ERR(svn_stream_printf_from_utf8(dwi->outstream,
+ dwi->header_encoding, scratch_pool,
"Index: %s (added)" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
wrote_header = TRUE;
}
- else if (tmpfile1 && copyfrom_path)
- SVN_ERR(diff_content_changed(&wrote_header, diff_relpath,
- tmpfile1, tmpfile2, rev1, rev2,
- mimetype1, mimetype2,
+ else if (copyfrom_source && right_file)
+ SVN_ERR(diff_content_changed(&wrote_header, relpath,
+ left_file, right_file,
+ copyfrom_source->revision,
+ right_source->revision,
+ svn_prop_get_value(left_props,
+ SVN_PROP_MIME_TYPE),
+ svn_prop_get_value(right_props,
+ SVN_PROP_MIME_TYPE),
svn_diff_op_copied,
TRUE /* force diff output */,
- copyfrom_path,
- copyfrom_revision, diff_cmd_baton,
- scratch_pool));
- else if (tmpfile1)
- SVN_ERR(diff_content_changed(&wrote_header, diff_relpath,
- tmpfile1, tmpfile2, rev1, rev2,
- mimetype1, mimetype2,
+ copyfrom_source->repos_relpath,
+ copyfrom_source->revision,
+ dwi, scratch_pool));
+ else if (right_file)
+ SVN_ERR(diff_content_changed(&wrote_header, relpath,
+ left_file, right_file,
+ DIFF_REVNUM_NONEXISTENT,
+ right_source->revision,
+ svn_prop_get_value(left_props,
+ SVN_PROP_MIME_TYPE),
+ svn_prop_get_value(right_props,
+ SVN_PROP_MIME_TYPE),
svn_diff_op_added,
TRUE /* force diff output */,
NULL, SVN_INVALID_REVNUM,
- diff_cmd_baton, scratch_pool));
+ dwi, scratch_pool));
if (prop_changes->nelts > 0)
- SVN_ERR(diff_props_changed(diff_relpath, rev1, rev2,
- FALSE, prop_changes,
- original_props, ! wrote_header,
- diff_cmd_baton, scratch_pool));
+ SVN_ERR(diff_props_changed(relpath,
+ copyfrom_source ? copyfrom_source->revision
+ : DIFF_REVNUM_NONEXISTENT,
+ right_source->revision,
+ prop_changes,
+ left_props, ! wrote_header,
+ dwi, scratch_pool));
return SVN_NO_ERROR;
}
-/* An svn_wc_diff_callbacks4_t function. */
+/* An svn_diff_tree_processor_t callback. */
static svn_error_t *
-diff_file_deleted(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- const char *tmpfile1,
- const char *tmpfile2,
- const char *mimetype1,
- const char *mimetype2,
- apr_hash_t *original_props,
- void *diff_baton,
+diff_file_deleted(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const char *left_file,
+ /*const*/ apr_hash_t *left_props,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
- struct diff_cmd_baton *diff_cmd_baton = diff_baton;
+ diff_writer_info_t *dwi = processor->baton;
- if (diff_cmd_baton->no_diff_deleted)
+ if (dwi->no_diff_deleted)
{
- const char *index_path = diff_relpath;
+ const char *index_path = relpath;
- if (diff_cmd_baton->anchor)
- index_path = svn_dirent_join(diff_cmd_baton->anchor, diff_relpath,
+ if (dwi->ddi.anchor)
+ index_path = svn_dirent_join(dwi->ddi.anchor, relpath,
scratch_pool);
- SVN_ERR(svn_stream_printf_from_utf8(diff_cmd_baton->outstream,
- diff_cmd_baton->header_encoding, scratch_pool,
+ SVN_ERR(svn_stream_printf_from_utf8(dwi->outstream,
+ dwi->header_encoding, scratch_pool,
"Index: %s (deleted)" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
@@ -1118,99 +1093,144 @@ diff_file_deleted(svn_wc_notify_state_t *state,
else
{
svn_boolean_t wrote_header = FALSE;
- if (tmpfile1)
- SVN_ERR(diff_content_changed(&wrote_header, diff_relpath,
- tmpfile1, tmpfile2,
- diff_cmd_baton->revnum1,
- diff_cmd_baton->revnum2,
- mimetype1, mimetype2,
+
+ if (!dwi->empty_file)
+ SVN_ERR(svn_io_open_unique_file3(NULL, &dwi->empty_file,
+ NULL, svn_io_file_del_on_pool_cleanup,
+ dwi->pool, scratch_pool));
+
+ if (left_file)
+ SVN_ERR(diff_content_changed(&wrote_header, relpath,
+ left_file, dwi->empty_file,
+ left_source->revision,
+ DIFF_REVNUM_NONEXISTENT,
+ svn_prop_get_value(left_props,
+ SVN_PROP_MIME_TYPE),
+ NULL,
svn_diff_op_deleted, FALSE,
NULL, SVN_INVALID_REVNUM,
- diff_cmd_baton,
+ dwi,
scratch_pool));
- /* Should we also report the properties as deleted? */
- }
+ if (left_props && apr_hash_count(left_props))
+ {
+ apr_array_header_t *prop_changes;
- /* We don't list all the deleted properties. */
+ SVN_ERR(svn_prop_diffs(&prop_changes, apr_hash_make(scratch_pool),
+ left_props, scratch_pool));
- return SVN_NO_ERROR;
-}
-
-/* An svn_wc_diff_callbacks4_t function. */
-static svn_error_t *
-diff_dir_added(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- svn_boolean_t *skip_children,
- const char *diff_relpath,
- svn_revnum_t rev,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_revision,
- void *diff_baton,
- apr_pool_t *scratch_pool)
-{
- /* Do nothing. */
+ SVN_ERR(diff_props_changed(relpath,
+ left_source->revision,
+ DIFF_REVNUM_NONEXISTENT,
+ prop_changes,
+ left_props, ! wrote_header,
+ dwi, scratch_pool));
+ }
+ }
return SVN_NO_ERROR;
}
/* An svn_wc_diff_callbacks4_t function. */
static svn_error_t *
-diff_dir_deleted(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- void *diff_baton,
+diff_dir_changed(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const svn_diff_source_t *right_source,
+ /*const*/ apr_hash_t *left_props,
+ /*const*/ apr_hash_t *right_props,
+ const apr_array_header_t *prop_changes,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
apr_pool_t *scratch_pool)
{
- /* Do nothing. */
+ diff_writer_info_t *dwi = processor->baton;
+
+ SVN_ERR(diff_props_changed(relpath,
+ left_source->revision,
+ right_source->revision,
+ prop_changes,
+ left_props,
+ TRUE /* show_diff_header */,
+ dwi,
+ scratch_pool));
return SVN_NO_ERROR;
}
-/* An svn_wc_diff_callbacks4_t function. */
+/* An svn_diff_tree_processor_t callback. */
static svn_error_t *
-diff_dir_opened(svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- svn_boolean_t *skip_children,
- const char *diff_relpath,
- svn_revnum_t rev,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_added(const char *relpath,
+ const svn_diff_source_t *copyfrom_source,
+ const svn_diff_source_t *right_source,
+ /*const*/ apr_hash_t *copyfrom_props,
+ /*const*/ apr_hash_t *right_props,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- /* Do nothing. */
+ diff_writer_info_t *dwi = processor->baton;
+ apr_hash_t *left_props;
+ apr_array_header_t *prop_changes;
- return SVN_NO_ERROR;
+ if (dwi->no_diff_added)
+ return SVN_NO_ERROR;
+
+ if (copyfrom_source && !dwi->show_copies_as_adds)
+ {
+ left_props = copyfrom_props ? copyfrom_props
+ : apr_hash_make(scratch_pool);
+ }
+ else
+ {
+ left_props = apr_hash_make(scratch_pool);
+ copyfrom_source = NULL;
+ }
+
+ SVN_ERR(svn_prop_diffs(&prop_changes, right_props, left_props,
+ scratch_pool));
+
+ return svn_error_trace(diff_props_changed(relpath,
+ copyfrom_source ? copyfrom_source->revision
+ : DIFF_REVNUM_NONEXISTENT,
+ right_source->revision,
+ prop_changes,
+ left_props,
+ TRUE /* show_diff_header */,
+ dwi,
+ scratch_pool));
}
-/* An svn_wc_diff_callbacks4_t function. */
+/* An svn_diff_tree_processor_t callback. */
static svn_error_t *
-diff_dir_closed(svn_wc_notify_state_t *contentstate,
- svn_wc_notify_state_t *propstate,
- svn_boolean_t *tree_conflicted,
- const char *diff_relpath,
- svn_boolean_t dir_was_added,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_deleted(const char *relpath,
+ const svn_diff_source_t *left_source,
+ /*const*/ apr_hash_t *left_props,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- /* Do nothing. */
+ diff_writer_info_t *dwi = processor->baton;
+ apr_array_header_t *prop_changes;
+
+ if (dwi->no_diff_deleted)
+ return SVN_NO_ERROR;
+
+
+ SVN_ERR(svn_prop_diffs(&prop_changes, apr_hash_make(scratch_pool),
+ left_props, scratch_pool));
+
+ SVN_ERR(diff_props_changed(relpath,
+ left_source->revision,
+ DIFF_REVNUM_NONEXISTENT,
+ prop_changes,
+ left_props,
+ TRUE /* show_diff_header */,
+ dwi,
+ scratch_pool));
return SVN_NO_ERROR;
}
-static const svn_wc_diff_callbacks4_t diff_callbacks =
-{
- diff_file_opened,
- diff_file_changed,
- diff_file_added,
- diff_file_deleted,
- diff_dir_deleted,
- diff_dir_opened,
- diff_dir_added,
- diff_dir_props_changed,
- diff_dir_closed
-};
-
/*-----------------------------------------------------------------*/
/** The logic behind 'svn diff' and 'svn merge'. */
@@ -1329,45 +1349,6 @@ check_diff_target_exists(const char *url,
return SVN_NO_ERROR;
}
-
-/* Return in *RESOLVED_URL the URL which PATH_OR_URL@PEG_REVISION has in
- * REVISION. If the object has no location in REVISION, set *RESOLVED_URL
- * to NULL. */
-static svn_error_t *
-resolve_pegged_diff_target_url(const char **resolved_url,
- svn_ra_session_t *ra_session,
- const char *path_or_url,
- const svn_opt_revision_t *peg_revision,
- const svn_opt_revision_t *revision,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- svn_error_t *err;
-
- /* Check if the PATH_OR_URL exists at REVISION. */
- err = svn_client__repos_locations(resolved_url, NULL,
- NULL, NULL,
- ra_session,
- path_or_url,
- peg_revision,
- revision,
- NULL,
- ctx, scratch_pool);
- if (err)
- {
- if (err->apr_err == SVN_ERR_CLIENT_UNRELATED_RESOURCES ||
- err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- *resolved_url = NULL;
- }
- else
- return svn_error_trace(err);
- }
-
- return SVN_NO_ERROR;
-}
-
/** Prepare a repos repos diff between PATH_OR_URL1 and
* PATH_OR_URL2@PEG_REVISION, in the revision range REVISION1:REVISION2.
* Return URLs and peg revisions in *URL1, *REV1 and in *URL2, *REV2.
@@ -1375,13 +1356,10 @@ resolve_pegged_diff_target_url(const char **resolved_url,
* *TARGET1 and *TARGET2, based on *URL1 and *URL2.
* Indicate the corresponding node kinds in *KIND1 and *KIND2, and verify
* that at least one of the diff targets exists.
- * Set *BASE_PATH corresponding to the URL opened in the new *RA_SESSION
- * which is pointing at *ANCHOR1.
* Use client context CTX. Do all allocations in POOL. */
static svn_error_t *
diff_prepare_repos_repos(const char **url1,
const char **url2,
- const char **base_path,
svn_revnum_t *rev1,
svn_revnum_t *rev2,
const char **anchor1,
@@ -1399,92 +1377,135 @@ diff_prepare_repos_repos(const char **url1,
const svn_opt_revision_t *peg_revision,
apr_pool_t *pool)
{
- const char *abspath_or_url2;
- const char *abspath_or_url1;
+ const char *local_abspath1 = NULL;
+ const char *local_abspath2 = NULL;
const char *repos_root_url;
const char *wri_abspath = NULL;
+ svn_client__pathrev_t *resolved1;
+ svn_client__pathrev_t *resolved2 = NULL;
+ enum svn_opt_revision_kind peg_kind = peg_revision->kind;
if (!svn_path_is_url(path_or_url2))
{
- SVN_ERR(svn_dirent_get_absolute(&abspath_or_url2, path_or_url2, pool));
- SVN_ERR(svn_wc__node_get_url(url2, ctx->wc_ctx, abspath_or_url2,
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath2, path_or_url2, pool));
+ SVN_ERR(svn_wc__node_get_url(url2, ctx->wc_ctx, local_abspath2,
pool, pool));
- wri_abspath = abspath_or_url2;
+ wri_abspath = local_abspath2;
}
else
- *url2 = abspath_or_url2 = apr_pstrdup(pool, path_or_url2);
+ *url2 = apr_pstrdup(pool, path_or_url2);
if (!svn_path_is_url(path_or_url1))
{
- SVN_ERR(svn_dirent_get_absolute(&abspath_or_url1, path_or_url1, pool));
- SVN_ERR(svn_wc__node_get_url(url1, ctx->wc_ctx, abspath_or_url1,
- pool, pool));
- wri_abspath = abspath_or_url1;
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath1, path_or_url1, pool));
+ wri_abspath = local_abspath1;
}
- else
- *url1 = abspath_or_url1 = apr_pstrdup(pool, path_or_url1);
-
- /* We need exactly one BASE_PATH, so we'll let the BASE_PATH
- calculated for PATH_OR_URL2 override the one for PATH_OR_URL1
- (since the diff will be "applied" to URL2 anyway). */
- *base_path = NULL;
- if (strcmp(*url1, path_or_url1) != 0)
- *base_path = path_or_url1;
- if (strcmp(*url2, path_or_url2) != 0)
- *base_path = path_or_url2;
SVN_ERR(svn_client_open_ra_session2(ra_session, *url2, wri_abspath,
ctx, pool, pool));
/* If we are performing a pegged diff, we need to find out what our
actual URLs will be. */
- if (peg_revision->kind != svn_opt_revision_unspecified)
+ if (peg_kind != svn_opt_revision_unspecified
+ || path_or_url1 == path_or_url2
+ || local_abspath2)
{
- const char *resolved_url1;
- const char *resolved_url2;
-
- SVN_ERR(resolve_pegged_diff_target_url(&resolved_url2, *ra_session,
- path_or_url2, peg_revision,
- revision2, ctx, pool));
-
- SVN_ERR(svn_ra_reparent(*ra_session, *url1, pool));
- SVN_ERR(resolve_pegged_diff_target_url(&resolved_url1, *ra_session,
- path_or_url1, peg_revision,
- revision1, ctx, pool));
-
- /* Either or both URLs might have changed as a result of resolving
- * the PATH_OR_URL@PEG_REVISION's history. If only one of the URLs
- * could be resolved, use the same URL for URL1 and URL2, so we can
- * show a diff that adds or removes the object (see issue #4153). */
- if (resolved_url2)
+ svn_error_t *err;
+
+ err = svn_client__resolve_rev_and_url(&resolved2,
+ *ra_session, path_or_url2,
+ peg_revision, revision2,
+ ctx, pool);
+ if (err)
{
- *url2 = resolved_url2;
- if (!resolved_url1)
- *url1 = resolved_url2;
+ if (err->apr_err != SVN_ERR_CLIENT_UNRELATED_RESOURCES
+ && err->apr_err != SVN_ERR_FS_NOT_FOUND)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ resolved2 = NULL;
}
- if (resolved_url1)
+ }
+ else
+ resolved2 = NULL;
+
+ if (peg_kind != svn_opt_revision_unspecified
+ || path_or_url1 == path_or_url2
+ || local_abspath1)
+ {
+ svn_error_t *err;
+
+ err = svn_client__resolve_rev_and_url(&resolved1,
+ *ra_session, path_or_url1,
+ peg_revision, revision1,
+ ctx, pool);
+ if (err)
{
- *url1 = resolved_url1;
- if (!resolved_url2)
- *url2 = resolved_url1;
+ if (err->apr_err != SVN_ERR_CLIENT_UNRELATED_RESOURCES
+ && err->apr_err != SVN_ERR_FS_NOT_FOUND)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ resolved1 = NULL;
}
+ }
+ else
+ resolved1 = NULL;
+
+ if (resolved1)
+ {
+ *url1 = resolved1->url;
+ *rev1 = resolved1->rev;
+ }
+ else
+ {
+ /* It would be nice if we could just return an error when resolving a
+ location fails... But in many such cases we prefer diffing against
+ an not existing location to show adds od removes (see issue #4153) */
+
+ if (resolved2
+ && (peg_kind != svn_opt_revision_unspecified
+ || path_or_url1 == path_or_url2))
+ *url1 = resolved2->url;
+ else if (! local_abspath1)
+ *url1 = path_or_url1;
+ else
+ SVN_ERR(svn_wc__node_get_url(url1, ctx->wc_ctx, local_abspath1,
+ pool, pool));
+
+ SVN_ERR(svn_client__get_revision_number(rev1, NULL, ctx->wc_ctx,
+ local_abspath1 /* may be NULL */,
+ *ra_session, revision1, pool));
+ }
- /* Reparent the session, since *URL2 might have changed as a result
- the above call. */
- SVN_ERR(svn_ra_reparent(*ra_session, *url2, pool));
+ if (resolved2)
+ {
+ *url2 = resolved2->url;
+ *rev2 = resolved2->rev;
+ }
+ else
+ {
+ /* It would be nice if we could just return an error when resolving a
+ location fails... But in many such cases we prefer diffing against
+ an not existing location to show adds od removes (see issue #4153) */
+
+ if (resolved1
+ && (peg_kind != svn_opt_revision_unspecified
+ || path_or_url1 == path_or_url2))
+ *url2 = resolved1->url;
+ /* else keep url2 */
+
+ SVN_ERR(svn_client__get_revision_number(rev2, NULL, ctx->wc_ctx,
+ local_abspath2 /* may be NULL */,
+ *ra_session, revision2, pool));
}
/* Resolve revision and get path kind for the second target. */
- SVN_ERR(svn_client__get_revision_number(rev2, NULL, ctx->wc_ctx,
- (path_or_url2 == *url2) ? NULL : abspath_or_url2,
- *ra_session, revision2, pool));
+ SVN_ERR(svn_ra_reparent(*ra_session, *url2, pool));
SVN_ERR(svn_ra_check_path(*ra_session, "", *rev2, kind2, pool));
/* Do the same for the first target. */
SVN_ERR(svn_ra_reparent(*ra_session, *url1, pool));
- SVN_ERR(svn_client__get_revision_number(rev1, NULL, ctx->wc_ctx,
- (strcmp(path_or_url1, *url1) == 0) ? NULL : abspath_or_url1,
- *ra_session, revision1, pool));
SVN_ERR(svn_ra_check_path(*ra_session, "", *rev1, kind1, pool));
/* Either both URLs must exist at their respective revisions,
@@ -1521,12 +1542,37 @@ diff_prepare_repos_repos(const char **url1,
if (strcmp(*url1, repos_root_url) != 0
&& strcmp(*url2, repos_root_url) != 0)
{
+ svn_node_kind_t ignored_kind;
+ svn_error_t *err;
+
svn_uri_split(anchor1, target1, *url1, pool);
svn_uri_split(anchor2, target2, *url2, pool);
- if (*base_path
- && (*kind1 == svn_node_file || *kind2 == svn_node_file))
- *base_path = svn_dirent_dirname(*base_path, pool);
+
SVN_ERR(svn_ra_reparent(*ra_session, *anchor1, pool));
+
+ /* We might not have the necessary rights to read the root now.
+ (It is ok to pass a revision here where the node doesn't exist) */
+ err = svn_ra_check_path(*ra_session, "", *rev1, &ignored_kind, pool);
+
+ if (err && (err->apr_err == SVN_ERR_RA_DAV_FORBIDDEN
+ || err->apr_err == SVN_ERR_RA_NOT_AUTHORIZED))
+ {
+ svn_error_clear(err);
+
+ /* Ok, lets undo the reparent...
+
+ We can't report replacements this way, but at least we can
+ report changes on the descendants */
+
+ *anchor1 = svn_path_url_add_component2(*anchor1, *target1, pool);
+ *anchor2 = svn_path_url_add_component2(*anchor2, *target2, pool);
+ *target1 = "";
+ *target2 = "";
+
+ SVN_ERR(svn_ra_reparent(*ra_session, *anchor1, pool));
+ }
+ else
+ SVN_ERR(err);
}
return SVN_NO_ERROR;
@@ -1553,7 +1599,7 @@ diff_prepare_repos_repos(const char **url1,
Since Subversion 1.8 we also have a variant of svn_wc_diff called
svn_client__arbitrary_nodes_diff, that allows handling WORKING-WORKING
- comparisions between nodes in the working copy.
+ comparisons between nodes in the working copy.
So the truth of the matter is, if the caller's arguments can't be
pigeonholed into one of these use-cases, we currently bail with a
@@ -1583,28 +1629,27 @@ unsupported_diff_error(svn_error_t *child_err)
All other options are the same as those passed to svn_client_diff6(). */
static svn_error_t *
-diff_wc_wc(const char *path1,
+diff_wc_wc(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ struct diff_driver_info_t *ddi,
+ const char *path1,
const svn_opt_revision_t *revision1,
const char *path2,
const svn_opt_revision_t *revision2,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t use_git_diff_format,
const apr_array_header_t *changelists,
- const svn_wc_diff_callbacks4_t *callbacks,
- struct diff_cmd_baton *callback_baton,
+ const svn_diff_tree_processor_t *diff_processor,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *abspath1;
- svn_error_t *err;
- svn_node_kind_t kind;
SVN_ERR_ASSERT(! svn_path_is_url(path1));
SVN_ERR_ASSERT(! svn_path_is_url(path2));
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path1, pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath1, path1, scratch_pool));
/* Currently we support only the case where path1 and path2 are the
same path. */
@@ -1617,42 +1662,25 @@ diff_wc_wc(const char *path1,
"and its working files are supported at this time"
)));
-
- /* Resolve named revisions to real numbers. */
- err = svn_client__get_revision_number(&callback_baton->revnum1, NULL,
- ctx->wc_ctx, abspath1, NULL,
- revision1, pool);
-
- /* In case of an added node, we have no base rev, and we show a revision
- * number of 0. Note that this code is currently always asking for
- * svn_opt_revision_base.
- * ### TODO: get rid of this 0 for added nodes. */
- if (err && (err->apr_err == SVN_ERR_CLIENT_BAD_REVISION))
+ if (ddi)
{
- svn_error_clear(err);
- callback_baton->revnum1 = 0;
- }
- else
- SVN_ERR(err);
+ svn_node_kind_t kind;
- callback_baton->revnum2 = SVN_INVALID_REVNUM; /* WC */
+ SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, abspath1,
+ TRUE, FALSE, scratch_pool));
- SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, abspath1,
- TRUE, FALSE, pool));
+ if (kind != svn_node_dir)
+ ddi->anchor = svn_dirent_dirname(path1, scratch_pool);
+ else
+ ddi->anchor = path1;
+ }
- if (kind != svn_node_dir)
- callback_baton->anchor = svn_dirent_dirname(path1, pool);
- else
- callback_baton->anchor = path1;
-
- SVN_ERR(svn_wc_diff6(ctx->wc_ctx,
- abspath1,
- callbacks, callback_baton,
- depth,
- ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists,
- ctx->cancel_func, ctx->cancel_baton,
- pool));
+ SVN_ERR(svn_wc__diff7(root_relpath, root_is_dir,
+ ctx->wc_ctx, abspath1, depth,
+ ignore_ancestry, changelists,
+ diff_processor,
+ ctx->cancel_func, ctx->cancel_baton,
+ result_pool, scratch_pool));
return SVN_NO_ERROR;
}
@@ -1666,9 +1694,9 @@ diff_wc_wc(const char *path1,
All other options are the same as those passed to svn_client_diff6(). */
static svn_error_t *
-diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
- struct diff_cmd_baton *callback_baton,
- svn_client_ctx_t *ctx,
+diff_repos_repos(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ struct diff_driver_info_t *ddi,
const char *path_or_url1,
const char *path_or_url2,
const svn_opt_revision_t *revision1,
@@ -1676,7 +1704,11 @@ diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
const svn_opt_revision_t *peg_revision,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- apr_pool_t *pool)
+ svn_boolean_t text_deltas,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_ra_session_t *extra_ra_session;
@@ -1686,11 +1718,8 @@ diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
const svn_delta_editor_t *diff_editor;
void *diff_edit_baton;
- const svn_diff_tree_processor_t *diff_processor;
-
const char *url1;
const char *url2;
- const char *base_path;
svn_revnum_t rev1;
svn_revnum_t rev2;
svn_node_kind_t kind1;
@@ -1700,40 +1729,40 @@ diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
const char *target1;
const char *target2;
svn_ra_session_t *ra_session;
- const char *wri_abspath = NULL;
/* Prepare info for the repos repos diff. */
- SVN_ERR(diff_prepare_repos_repos(&url1, &url2, &base_path, &rev1, &rev2,
+ SVN_ERR(diff_prepare_repos_repos(&url1, &url2, &rev1, &rev2,
&anchor1, &anchor2, &target1, &target2,
&kind1, &kind2, &ra_session,
ctx, path_or_url1, path_or_url2,
revision1, revision2, peg_revision,
- pool));
-
- /* Find a WC path for the ra session */
- if (!svn_path_is_url(path_or_url1))
- SVN_ERR(svn_dirent_get_absolute(&wri_abspath, path_or_url1, pool));
- else if (!svn_path_is_url(path_or_url2))
- SVN_ERR(svn_dirent_get_absolute(&wri_abspath, path_or_url2, pool));
+ scratch_pool));
/* Set up the repos_diff editor on BASE_PATH, if available.
Otherwise, we just use "". */
- SVN_ERR(svn_wc__wrap_diff_callbacks(&diff_processor,
- callbacks, callback_baton,
- TRUE /* walk_deleted_dirs */,
- pool, pool));
-
- /* Get actual URLs. */
- callback_baton->orig_path_1 = url1;
- callback_baton->orig_path_2 = url2;
-
- /* Get numeric revisions. */
- callback_baton->revnum1 = rev1;
- callback_baton->revnum2 = rev2;
+ if (ddi)
+ {
+ /* Get actual URLs. */
+ ddi->orig_path_1 = url1;
+ ddi->orig_path_2 = url2;
+
+ /* This should be moved to the diff writer
+ - path_or_url are provided by the caller
+ - target1 is available as *root_relpath
+ - (kind1 != svn_node_dir || kind2 != svn_node_dir) = !*root_is_dir */
+
+ if (!svn_path_is_url(path_or_url2))
+ ddi->anchor = path_or_url2;
+ else if (!svn_path_is_url(path_or_url1))
+ ddi->anchor = path_or_url1;
+ else
+ ddi->anchor = NULL;
- callback_baton->ra_session = ra_session;
- callback_baton->anchor = base_path;
+ if (*target1 && ddi->anchor
+ && (kind1 != svn_node_dir || kind2 != svn_node_dir))
+ ddi->anchor = svn_dirent_dirname(ddi->anchor, result_pool);
+ }
/* The repository can bring in a new working copy, but not delete
everything. Luckily our new diff handler can just be reversed. */
@@ -1759,45 +1788,65 @@ diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
target1 = str_tmp;
diff_processor = svn_diff__tree_processor_reverse_create(diff_processor,
- NULL, pool);
+ NULL,
+ scratch_pool);
}
/* Filter the first path component using a filter processor, until we fixed
the diff processing to handle this directly */
- if ((kind1 != svn_node_file && kind2 != svn_node_file) && target1[0] != '\0')
- {
- diff_processor = svn_diff__tree_processor_filter_create(diff_processor,
- target1, pool);
- }
+ if (root_relpath)
+ *root_relpath = apr_pstrdup(result_pool, target1);
+ else if ((kind1 != svn_node_file && kind2 != svn_node_file)
+ && target1[0] != '\0')
+ {
+ diff_processor = svn_diff__tree_processor_filter_create(
+ diff_processor, target1, scratch_pool);
+ }
/* Now, we open an extra RA session to the correct anchor
location for URL1. This is used during the editor calls to fetch file
contents. */
- SVN_ERR(svn_client_open_ra_session2(&extra_ra_session, anchor1, wri_abspath,
- ctx, pool, pool));
+ SVN_ERR(svn_ra__dup_session(&extra_ra_session, ra_session, anchor1,
+ scratch_pool, scratch_pool));
+
+ if (ddi)
+ {
+ const char *repos_root_url;
+ const char *session_url;
+
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
+ scratch_pool));
+ SVN_ERR(svn_ra_get_session_url(ra_session, &session_url,
+ scratch_pool));
+
+ ddi->session_relpath = svn_uri_skip_ancestor(repos_root_url,
+ session_url,
+ result_pool);
+ }
SVN_ERR(svn_client__get_diff_editor2(
&diff_editor, &diff_edit_baton,
extra_ra_session, depth,
rev1,
- TRUE /* text_deltas */,
+ text_deltas,
diff_processor,
ctx->cancel_func, ctx->cancel_baton,
- pool));
+ scratch_pool));
/* We want to switch our txn into URL2 */
SVN_ERR(svn_ra_do_diff3(ra_session, &reporter, &reporter_baton,
rev2, target1,
- depth, ignore_ancestry, TRUE /* text_deltas */,
- url2, diff_editor, diff_edit_baton, pool));
+ depth, ignore_ancestry, text_deltas,
+ url2, diff_editor, diff_edit_baton, scratch_pool));
/* Drive the reporter; do the diff. */
SVN_ERR(reporter->set_path(reporter_baton, "", rev1,
svn_depth_infinity,
FALSE, NULL,
- pool));
+ scratch_pool));
- return svn_error_trace(reporter->finish_report(reporter_baton, pool));
+ return svn_error_trace(
+ reporter->finish_report(reporter_baton, scratch_pool));
}
/* Perform a diff between a repository path and a working-copy path.
@@ -1811,7 +1860,10 @@ diff_repos_repos(const svn_wc_diff_callbacks4_t *callbacks,
All other options are the same as those passed to svn_client_diff6(). */
static svn_error_t *
-diff_repos_wc(const char *path_or_url1,
+diff_repos_wc(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ struct diff_driver_info_t *ddi,
+ const char *path_or_url1,
const svn_opt_revision_t *revision1,
const svn_opt_revision_t *peg_revision,
const char *path2,
@@ -1819,18 +1871,13 @@ diff_repos_wc(const char *path_or_url1,
svn_boolean_t reverse,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t use_git_diff_format,
const apr_array_header_t *changelists,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *callback_baton,
- struct diff_cmd_baton *cmd_baton,
+ const svn_diff_tree_processor_t *diff_processor,
svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- apr_pool_t *pool = scratch_pool;
- const char *url1, *anchor, *anchor_url, *target;
- svn_revnum_t rev;
+ const char *anchor, *anchor_url, *target;
svn_ra_session_t *ra_session;
svn_depth_t diff_depth;
const svn_ra_reporter3_t *reporter;
@@ -1842,197 +1889,236 @@ diff_repos_wc(const char *path_or_url1,
const char *abspath_or_url1;
const char *abspath2;
const char *anchor_abspath;
- svn_node_kind_t kind1;
- svn_node_kind_t kind2;
svn_boolean_t is_copy;
svn_revnum_t cf_revision;
const char *cf_repos_relpath;
const char *cf_repos_root_url;
+ svn_depth_t cf_depth;
+ const char *copy_root_abspath;
+ const char *target_url;
+ svn_client__pathrev_t *loc1;
SVN_ERR_ASSERT(! svn_path_is_url(path2));
if (!svn_path_is_url(path_or_url1))
{
- SVN_ERR(svn_dirent_get_absolute(&abspath_or_url1, path_or_url1, pool));
- SVN_ERR(svn_wc__node_get_url(&url1, ctx->wc_ctx, abspath_or_url1,
- pool, pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath_or_url1, path_or_url1,
+ scratch_pool));
}
else
{
- url1 = path_or_url1;
abspath_or_url1 = path_or_url1;
}
- SVN_ERR(svn_dirent_get_absolute(&abspath2, path2, pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath2, path2, scratch_pool));
- /* Convert path_or_url1 to a URL to feed to do_diff. */
- SVN_ERR(svn_wc_get_actual_target2(&anchor, &target,
- ctx->wc_ctx, path2,
- pool, pool));
+ /* Check if our diff target is a copied node. */
+ SVN_ERR(svn_wc__node_get_origin(&is_copy,
+ &cf_revision,
+ &cf_repos_relpath,
+ &cf_repos_root_url,
+ NULL, &cf_depth,
+ &copy_root_abspath,
+ ctx->wc_ctx, abspath2,
+ FALSE, scratch_pool, scratch_pool));
- /* Fetch the URL of the anchor directory. */
- SVN_ERR(svn_dirent_get_absolute(&anchor_abspath, anchor, pool));
- SVN_ERR(svn_wc__node_get_url(&anchor_url, ctx->wc_ctx, anchor_abspath,
- pool, pool));
- SVN_ERR_ASSERT(anchor_url != NULL);
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc1,
+ path_or_url1, abspath2,
+ peg_revision, revision1,
+ ctx, scratch_pool));
- /* If we are performing a pegged diff, we need to find out what our
- actual URLs will be. */
- if (peg_revision->kind != svn_opt_revision_unspecified)
+ if (revision2->kind == svn_opt_revision_base || !is_copy)
{
- SVN_ERR(svn_client__repos_locations(&url1, NULL, NULL, NULL,
- NULL,
- path_or_url1,
- peg_revision,
- revision1, NULL,
- ctx, pool));
- if (!reverse)
+ /* Convert path_or_url1 to a URL to feed to do_diff. */
+ SVN_ERR(svn_wc_get_actual_target2(&anchor, &target, ctx->wc_ctx, path2,
+ scratch_pool, scratch_pool));
+
+ /* Handle the ugly case where target is ".." */
+ if (*target && !svn_path_is_single_path_component(target))
+ {
+ anchor = svn_dirent_join(anchor, target, scratch_pool);
+ target = "";
+ }
+
+ if (root_relpath)
+ *root_relpath = apr_pstrdup(result_pool, target);
+ if (root_is_dir)
+ *root_is_dir = (*target == '\0');
+
+ /* Fetch the URL of the anchor directory. */
+ SVN_ERR(svn_dirent_get_absolute(&anchor_abspath, anchor, scratch_pool));
+ SVN_ERR(svn_wc__node_get_url(&anchor_url, ctx->wc_ctx, anchor_abspath,
+ scratch_pool, scratch_pool));
+ SVN_ERR_ASSERT(anchor_url != NULL);
+
+ target_url = NULL;
+ }
+ else /* is_copy && revision2->kind == svn_opt_revision_base */
+ {
+#if 0
+ svn_node_kind_t kind;
+#endif
+ /* ### Ugly hack ahead ###
+ *
+ * We're diffing a locally copied/moved node.
+ * Describe the copy source to the reporter instead of the copy itself.
+ * Doing the latter would generate a single add_directory() call to the
+ * diff editor which results in an unexpected diff (the copy would
+ * be shown as deleted).
+ *
+ * ### But if we will receive any real changes from the repositor we
+ * will most likely fail to apply them as the wc diff editor assumes
+ * that we have the data to which the change applies in BASE...
+ */
+
+ target_url = svn_path_url_add_component2(cf_repos_root_url,
+ cf_repos_relpath,
+ scratch_pool);
+
+#if 0
+ /*SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, abspath2, FALSE, FALSE,
+ scratch_pool));
+
+ if (kind != svn_node_dir
+ || strcmp(copy_root_abspath, abspath2) != 0) */
+#endif
{
- cmd_baton->orig_path_1 = url1;
- cmd_baton->orig_path_2 =
- svn_path_url_add_component2(anchor_url, target, pool);
+ /* We are looking at a subdirectory of the repository,
+ We can describe the parent directory as the anchor..
+
+ ### This 'appears to work', but that is really dumb luck
+ ### for the simple cases in the test suite */
+ anchor_abspath = svn_dirent_dirname(abspath2, scratch_pool);
+ anchor_url = svn_path_url_add_component2(cf_repos_root_url,
+ svn_relpath_dirname(
+ cf_repos_relpath,
+ scratch_pool),
+ scratch_pool);
+ target = svn_dirent_basename(abspath2, NULL);
+ anchor = svn_dirent_dirname(path2, scratch_pool);
}
+#if 0
else
{
- cmd_baton->orig_path_1 =
- svn_path_url_add_component2(anchor_url, target, pool);
- cmd_baton->orig_path_2 = url1;
+ /* This code, while ok can't be enabled without causing test
+ * failures. The repository will send some changes against
+ * BASE for nodes that don't have BASE...
+ */
+ anchor_abspath = abspath2;
+ anchor_url = svn_path_url_add_component2(cf_repos_root_url,
+ cf_repos_relpath,
+ scratch_pool);
+ anchor = path2;
+ target = "";
}
+#endif
}
- /* Open an RA session to URL1 to figure out its node kind. */
- SVN_ERR(svn_client_open_ra_session2(&ra_session, url1, abspath2,
- ctx, pool, pool));
- /* Resolve the revision to use for URL1. */
- SVN_ERR(svn_client__get_revision_number(&rev, NULL, ctx->wc_ctx,
- (strcmp(path_or_url1, url1) == 0)
- ? NULL : abspath_or_url1,
- ra_session, revision1, pool));
- SVN_ERR(svn_ra_check_path(ra_session, "", rev, &kind1, pool));
-
- /* Figure out the node kind of the local target. */
- SVN_ERR(svn_wc_read_kind2(&kind2, ctx->wc_ctx, abspath2,
- TRUE, FALSE, pool));
-
- cmd_baton->ra_session = ra_session;
- cmd_baton->anchor = anchor;
-
- if (!reverse)
- cmd_baton->revnum1 = rev;
- else
- cmd_baton->revnum2 = rev;
+ SVN_ERR(svn_ra_reparent(ra_session, anchor_url, scratch_pool));
- /* Check if our diff target is a copied node. */
- SVN_ERR(svn_wc__node_get_origin(&is_copy,
- &cf_revision,
- &cf_repos_relpath,
- &cf_repos_root_url,
- NULL, NULL,
- ctx->wc_ctx, abspath2,
- FALSE, pool, pool));
+ if (ddi)
+ {
+ const char *repos_root_url;
+
+ ddi->anchor = anchor;
+
+ if (!reverse)
+ {
+ ddi->orig_path_1 = apr_pstrdup(result_pool, loc1->url);
+ ddi->orig_path_2 =
+ svn_path_url_add_component2(anchor_url, target, result_pool);
+ }
+ else
+ {
+ ddi->orig_path_1 =
+ svn_path_url_add_component2(anchor_url, target, result_pool);
+ ddi->orig_path_2 = apr_pstrdup(result_pool, loc1->url);
+ }
+
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
+ scratch_pool));
+
+ ddi->session_relpath = svn_uri_skip_ancestor(repos_root_url,
+ anchor_url,
+ result_pool);
+ }
+
+ if (reverse)
+ diff_processor = svn_diff__tree_processor_reverse_create(
+ diff_processor, NULL, scratch_pool);
/* Use the diff editor to generate the diff. */
SVN_ERR(svn_ra_has_capability(ra_session, &server_supports_depth,
- SVN_RA_CAPABILITY_DEPTH, pool));
+ SVN_RA_CAPABILITY_DEPTH, scratch_pool));
SVN_ERR(svn_wc__get_diff_editor(&diff_editor, &diff_edit_baton,
ctx->wc_ctx,
anchor_abspath,
target,
depth,
- ignore_ancestry || is_copy,
- show_copies_as_adds,
- use_git_diff_format,
+ ignore_ancestry,
rev2_is_base,
reverse,
server_supports_depth,
changelists,
- callbacks, callback_baton,
+ diff_processor,
ctx->cancel_func, ctx->cancel_baton,
- pool, pool));
- SVN_ERR(svn_ra_reparent(ra_session, anchor_url, pool));
+ scratch_pool, scratch_pool));
if (depth != svn_depth_infinity)
diff_depth = depth;
else
diff_depth = svn_depth_unknown;
- if (is_copy)
- {
- const char *copyfrom_parent_url;
- const char *copyfrom_basename;
- svn_depth_t copy_depth;
-
- cmd_baton->repos_wc_diff_target_is_copy = TRUE;
-
- /* We're diffing a locally copied/moved node.
- * Describe the copy source to the reporter instead of the copy itself.
- * Doing the latter would generate a single add_directory() call to the
- * diff editor which results in an unexpected diff (the copy would
- * be shown as deleted). */
-
- if (cf_repos_relpath[0] == '\0')
- {
- copyfrom_parent_url = cf_repos_root_url;
- copyfrom_basename = "";
- }
- else
- {
- const char *parent_relpath;
- svn_relpath_split(&parent_relpath, &copyfrom_basename,
- cf_repos_relpath, scratch_pool);
- copyfrom_parent_url = svn_path_url_add_component2(cf_repos_root_url,
- parent_relpath,
- scratch_pool);
- }
- SVN_ERR(svn_ra_reparent(ra_session, copyfrom_parent_url, pool));
+ if (is_copy && revision2->kind != svn_opt_revision_base)
+ {
/* Tell the RA layer we want a delta to change our txn to URL1 */
SVN_ERR(svn_ra_do_diff3(ra_session,
&reporter, &reporter_baton,
- rev,
+ loc1->rev,
target,
diff_depth,
ignore_ancestry,
TRUE, /* text_deltas */
- url1,
- diff_editor, diff_edit_baton, pool));
+ loc1->url,
+ diff_editor, diff_edit_baton,
+ scratch_pool));
/* Report the copy source. */
- SVN_ERR(svn_wc__node_get_depth(&copy_depth, ctx->wc_ctx, abspath2,
- pool));
+ if (cf_depth == svn_depth_unknown)
+ cf_depth = svn_depth_infinity;
- if (copy_depth == svn_depth_unknown)
- copy_depth = svn_depth_infinity;
+ /* Reporting the in-wc revision as r0, makes the repository send
+ everything as added, which avoids using BASE for pristine information,
+ which is not there (or unrelated) for a copy */
SVN_ERR(reporter->set_path(reporter_baton, "",
- cf_revision,
- copy_depth, FALSE, NULL, scratch_pool));
+ ignore_ancestry ? 0 : cf_revision,
+ cf_depth, FALSE, NULL, scratch_pool));
- if (strcmp(target, copyfrom_basename) != 0)
+ if (*target)
SVN_ERR(reporter->link_path(reporter_baton, target,
- svn_path_url_add_component2(
- cf_repos_root_url,
- cf_repos_relpath,
- scratch_pool),
- cf_revision,
- copy_depth, FALSE, NULL, scratch_pool));
+ target_url,
+ ignore_ancestry ? 0 : cf_revision,
+ cf_depth, FALSE, NULL, scratch_pool));
/* Finish the report to generate the diff. */
- SVN_ERR(reporter->finish_report(reporter_baton, pool));
+ SVN_ERR(reporter->finish_report(reporter_baton, scratch_pool));
}
else
{
/* Tell the RA layer we want a delta to change our txn to URL1 */
SVN_ERR(svn_ra_do_diff3(ra_session,
&reporter, &reporter_baton,
- rev,
+ loc1->rev,
target,
diff_depth,
ignore_ancestry,
TRUE, /* text_deltas */
- url1,
- diff_editor, diff_edit_baton, pool));
+ loc1->url,
+ diff_editor, diff_edit_baton,
+ scratch_pool));
/* Create a txn mirror of path2; the diff editor will print
diffs in reverse. :-) */
@@ -2043,18 +2129,18 @@ diff_repos_wc(const char *path_or_url1,
FALSE,
ctx->cancel_func, ctx->cancel_baton,
NULL, NULL, /* notification is N/A */
- pool));
+ scratch_pool));
}
return SVN_NO_ERROR;
}
-/* This is basically just the guts of svn_client_diff[_peg]6(). */
+/* This is basically just the guts of svn_client_diff[_summarize][_peg]6(). */
static svn_error_t *
-do_diff(const svn_wc_diff_callbacks4_t *callbacks,
- struct diff_cmd_baton *callback_baton,
- svn_client_ctx_t *ctx,
+do_diff(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ diff_driver_info_t *ddi,
const char *path_or_url1,
const char *path_or_url2,
const svn_opt_revision_t *revision1,
@@ -2062,10 +2148,12 @@ do_diff(const svn_wc_diff_callbacks4_t *callbacks,
const svn_opt_revision_t *peg_revision,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t use_git_diff_format,
const apr_array_header_t *changelists,
- apr_pool_t *pool)
+ svn_boolean_t text_deltas,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_boolean_t is_repos1;
svn_boolean_t is_repos2;
@@ -2079,32 +2167,35 @@ do_diff(const svn_wc_diff_callbacks4_t *callbacks,
if (is_repos2)
{
/* ### Ignores 'show_copies_as_adds'. */
- SVN_ERR(diff_repos_repos(callbacks, callback_baton, ctx,
+ SVN_ERR(diff_repos_repos(root_relpath, root_is_dir,
+ ddi,
path_or_url1, path_or_url2,
revision1, revision2,
peg_revision, depth, ignore_ancestry,
- pool));
+ text_deltas,
+ diff_processor, ctx,
+ result_pool, scratch_pool));
}
else /* path_or_url2 is a working copy path */
{
- SVN_ERR(diff_repos_wc(path_or_url1, revision1, peg_revision,
+ SVN_ERR(diff_repos_wc(root_relpath, root_is_dir, ddi,
+ path_or_url1, revision1, peg_revision,
path_or_url2, revision2, FALSE, depth,
- ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists,
- callbacks, callback_baton, callback_baton,
- ctx, pool));
+ ignore_ancestry, changelists,
+ diff_processor, ctx,
+ result_pool, scratch_pool));
}
}
else /* path_or_url1 is a working copy path */
{
if (is_repos2)
{
- SVN_ERR(diff_repos_wc(path_or_url2, revision2, peg_revision,
+ SVN_ERR(diff_repos_wc(root_relpath, root_is_dir, ddi,
+ path_or_url2, revision2, peg_revision,
path_or_url1, revision1, TRUE, depth,
- ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists,
- callbacks, callback_baton, callback_baton,
- ctx, pool));
+ ignore_ancestry, changelists,
+ diff_processor, ctx,
+ result_pool, scratch_pool));
}
else /* path_or_url2 is a working copy path */
{
@@ -2114,352 +2205,44 @@ do_diff(const svn_wc_diff_callbacks4_t *callbacks,
const char *abspath1;
const char *abspath2;
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path_or_url1, pool));
- SVN_ERR(svn_dirent_get_absolute(&abspath2, path_or_url2, pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath1, path_or_url1,
+ scratch_pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath2, path_or_url2,
+ scratch_pool));
- SVN_ERR(svn_client__arbitrary_nodes_diff(abspath1, abspath2,
+ /* ### What about ddi? */
+
+ SVN_ERR(svn_client__arbitrary_nodes_diff(root_relpath, root_is_dir,
+ abspath1, abspath2,
depth,
- callbacks,
- callback_baton,
- ctx, pool));
+ diff_processor,
+ ctx,
+ result_pool, scratch_pool));
}
else
- SVN_ERR(diff_wc_wc(path_or_url1, revision1,
- path_or_url2, revision2,
- depth, ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists,
- callbacks, callback_baton, ctx, pool));
+ {
+ SVN_ERR(diff_wc_wc(root_relpath, root_is_dir, ddi,
+ path_or_url1, revision1,
+ path_or_url2, revision2,
+ depth, ignore_ancestry, changelists,
+ diff_processor, ctx,
+ result_pool, scratch_pool));
+ }
}
}
return SVN_NO_ERROR;
}
-/* Perform a diff between a repository path and a working-copy path.
-
- PATH_OR_URL1 may be either a URL or a working copy path. PATH2 is a
- working copy path. REVISION1 and REVISION2 are their respective
- revisions. If REVERSE is TRUE, the diff will be done in reverse.
- If PEG_REVISION is specified, then PATH_OR_URL1 is the path in the peg
- revision, and the actual repository path to be compared is
- determined by following copy history.
-
- All other options are the same as those passed to svn_client_diff6(). */
-static svn_error_t *
-diff_summarize_repos_wc(svn_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- const char *path_or_url1,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *peg_revision,
- const char *path2,
- const svn_opt_revision_t *revision2,
- svn_boolean_t reverse,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- const char *anchor, *target;
- svn_wc_diff_callbacks4_t *callbacks;
- void *callback_baton;
- struct diff_cmd_baton cmd_baton;
-
- SVN_ERR_ASSERT(! svn_path_is_url(path2));
-
- SVN_ERR(svn_wc_get_actual_target2(&anchor, &target,
- ctx->wc_ctx, path2,
- pool, pool));
-
- SVN_ERR(svn_client__get_diff_summarize_callbacks(
- &callbacks, &callback_baton, target, reverse,
- summarize_func, summarize_baton, pool));
-
- SVN_ERR(diff_repos_wc(path_or_url1, revision1, peg_revision,
- path2, revision2, reverse,
- depth, FALSE, TRUE, FALSE, changelists,
- callbacks, callback_baton, &cmd_baton,
- ctx, pool));
- return SVN_NO_ERROR;
-}
-
-/* Perform a summary diff between two working-copy paths.
-
- PATH1 and PATH2 are both working copy paths. REVISION1 and
- REVISION2 are their respective revisions.
-
- All other options are the same as those passed to svn_client_diff6(). */
-static svn_error_t *
-diff_summarize_wc_wc(svn_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- const char *path1,
- const svn_opt_revision_t *revision1,
- const char *path2,
- const svn_opt_revision_t *revision2,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_wc_diff_callbacks4_t *callbacks;
- void *callback_baton;
- const char *abspath1, *target1;
- svn_node_kind_t kind;
-
- SVN_ERR_ASSERT(! svn_path_is_url(path1));
- SVN_ERR_ASSERT(! svn_path_is_url(path2));
-
- /* Currently we support only the case where path1 and path2 are the
- same path. */
- if ((strcmp(path1, path2) != 0)
- || (! ((revision1->kind == svn_opt_revision_base)
- && (revision2->kind == svn_opt_revision_working))))
- return unsupported_diff_error
- (svn_error_create
- (SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Summarized diffs are only supported between a path's text-base "
- "and its working files at this time")));
-
- /* Find the node kind of PATH1 so that we know whether the diff drive will
- be anchored at PATH1 or its parent dir. */
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path1, pool));
- SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, abspath1,
- TRUE, FALSE, pool));
- target1 = (kind == svn_node_dir) ? "" : svn_dirent_basename(path1, pool);
- SVN_ERR(svn_client__get_diff_summarize_callbacks(
- &callbacks, &callback_baton, target1, FALSE,
- summarize_func, summarize_baton, pool));
-
- SVN_ERR(svn_wc_diff6(ctx->wc_ctx,
- abspath1,
- callbacks, callback_baton,
- depth,
- ignore_ancestry, FALSE /* show_copies_as_adds */,
- FALSE /* use_git_diff_format */, changelists,
- ctx->cancel_func, ctx->cancel_baton,
- pool));
- return SVN_NO_ERROR;
-}
-
-/* Perform a diff summary between two repository paths. */
-static svn_error_t *
-diff_summarize_repos_repos(svn_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- svn_client_ctx_t *ctx,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- apr_pool_t *pool)
-{
- svn_ra_session_t *extra_ra_session;
-
- const svn_ra_reporter3_t *reporter;
- void *reporter_baton;
-
- const svn_delta_editor_t *diff_editor;
- void *diff_edit_baton;
-
- const svn_diff_tree_processor_t *diff_processor;
-
- const char *url1;
- const char *url2;
- const char *base_path;
- svn_revnum_t rev1;
- svn_revnum_t rev2;
- svn_node_kind_t kind1;
- svn_node_kind_t kind2;
- const char *anchor1;
- const char *anchor2;
- const char *target1;
- const char *target2;
- svn_ra_session_t *ra_session;
- svn_wc_diff_callbacks4_t *callbacks;
- void *callback_baton;
-
- /* Prepare info for the repos repos diff. */
- SVN_ERR(diff_prepare_repos_repos(&url1, &url2, &base_path, &rev1, &rev2,
- &anchor1, &anchor2, &target1, &target2,
- &kind1, &kind2, &ra_session,
- ctx, path_or_url1, path_or_url2,
- revision1, revision2,
- peg_revision, pool));
-
- /* Set up the repos_diff editor. */
- SVN_ERR(svn_client__get_diff_summarize_callbacks(
- &callbacks, &callback_baton,
- target1, FALSE, summarize_func, summarize_baton, pool));
-
- SVN_ERR(svn_wc__wrap_diff_callbacks(&diff_processor,
- callbacks, callback_baton,
- TRUE /* walk_deleted_dirs */,
- pool, pool));
-
-
- /* The repository can bring in a new working copy, but not delete
- everything. Luckily our new diff handler can just be reversed. */
- if (kind2 == svn_node_none)
- {
- const char *str_tmp;
- svn_revnum_t rev_tmp;
-
- str_tmp = url2;
- url2 = url1;
- url1 = str_tmp;
-
- rev_tmp = rev2;
- rev2 = rev1;
- rev1 = rev_tmp;
-
- str_tmp = anchor2;
- anchor2 = anchor1;
- anchor1 = str_tmp;
-
- str_tmp = target2;
- target2 = target1;
- target1 = str_tmp;
-
- diff_processor = svn_diff__tree_processor_reverse_create(diff_processor,
- NULL, pool);
- }
-
- /* Now, we open an extra RA session to the correct anchor
- location for URL1. This is used to get deleted path information. */
- SVN_ERR(svn_client_open_ra_session2(&extra_ra_session, anchor1, NULL,
- ctx, pool, pool));
-
- SVN_ERR(svn_client__get_diff_editor2(&diff_editor, &diff_edit_baton,
- extra_ra_session,
- depth,
- rev1,
- FALSE /* text_deltas */,
- diff_processor,
- ctx->cancel_func, ctx->cancel_baton,
- pool));
-
- /* We want to switch our txn into URL2 */
- SVN_ERR(svn_ra_do_diff3
- (ra_session, &reporter, &reporter_baton, rev2, target1,
- depth, ignore_ancestry,
- FALSE /* do not create text delta */, url2, diff_editor,
- diff_edit_baton, pool));
-
- /* Drive the reporter; do the diff. */
- SVN_ERR(reporter->set_path(reporter_baton, "", rev1,
- svn_depth_infinity,
- FALSE, NULL, pool));
- return svn_error_trace(reporter->finish_report(reporter_baton, pool));
-}
-
-/* This is basically just the guts of svn_client_diff_summarize[_peg]2(). */
-static svn_error_t *
-do_diff_summarize(svn_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- svn_client_ctx_t *ctx,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- apr_pool_t *pool)
-{
- svn_boolean_t is_repos1;
- svn_boolean_t is_repos2;
-
- /* Check if paths/revisions are urls/local. */
- SVN_ERR(check_paths(&is_repos1, &is_repos2, path_or_url1, path_or_url2,
- revision1, revision2, peg_revision));
-
- if (is_repos1)
- {
- if (is_repos2)
- SVN_ERR(diff_summarize_repos_repos(summarize_func, summarize_baton, ctx,
- path_or_url1, path_or_url2,
- revision1, revision2,
- peg_revision, depth, ignore_ancestry,
- pool));
- else
- SVN_ERR(diff_summarize_repos_wc(summarize_func, summarize_baton,
- path_or_url1, revision1,
- peg_revision,
- path_or_url2, revision2,
- FALSE, depth,
- ignore_ancestry,
- changelists,
- ctx, pool));
- }
- else /* ! is_repos1 */
- {
- if (is_repos2)
- SVN_ERR(diff_summarize_repos_wc(summarize_func, summarize_baton,
- path_or_url2, revision2,
- peg_revision,
- path_or_url1, revision1,
- TRUE, depth,
- ignore_ancestry,
- changelists,
- ctx, pool));
- else
- {
- if (revision1->kind == svn_opt_revision_working
- && revision2->kind == svn_opt_revision_working)
- {
- const char *abspath1;
- const char *abspath2;
- svn_wc_diff_callbacks4_t *callbacks;
- void *callback_baton;
- const char *target;
- svn_node_kind_t kind;
-
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path_or_url1, pool));
- SVN_ERR(svn_dirent_get_absolute(&abspath2, path_or_url2, pool));
-
- SVN_ERR(svn_io_check_resolved_path(abspath1, &kind, pool));
-
- if (kind == svn_node_dir)
- target = "";
- else
- target = svn_dirent_basename(path_or_url1, NULL);
-
- SVN_ERR(svn_client__get_diff_summarize_callbacks(
- &callbacks, &callback_baton, target, FALSE,
- summarize_func, summarize_baton, pool));
-
- SVN_ERR(svn_client__arbitrary_nodes_diff(abspath1, abspath2,
- depth,
- callbacks,
- callback_baton,
- ctx, pool));
- }
- else
- SVN_ERR(diff_summarize_wc_wc(summarize_func, summarize_baton,
- path_or_url1, revision1,
- path_or_url2, revision2,
- depth, ignore_ancestry,
- changelists, ctx, pool));
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Initialize DIFF_CMD_BATON.diff_cmd and DIFF_CMD_BATON.options,
+/* Initialize DWI.diff_cmd and DWI.options,
* according to OPTIONS and CONFIG. CONFIG and OPTIONS may be null.
- * Allocate the fields in POOL, which should be at least as long-lived
- * as the pool DIFF_CMD_BATON itself is allocated in.
+ * Allocate the fields in RESULT_POOL, which should be at least as long-lived
+ * as the pool DWI itself is allocated in.
*/
static svn_error_t *
-set_up_diff_cmd_and_options(struct diff_cmd_baton *diff_cmd_baton,
- const apr_array_header_t *options,
- apr_hash_t *config, apr_pool_t *pool)
+create_diff_writer_info(diff_writer_info_t *dwi,
+ const apr_array_header_t *options,
+ apr_hash_t *config, apr_pool_t *result_pool)
{
const char *diff_cmd = NULL;
@@ -2475,41 +2258,41 @@ set_up_diff_cmd_and_options(struct diff_cmd_baton *diff_cmd_baton,
svn_config_get(cfg, &diff_extensions, SVN_CONFIG_SECTION_HELPERS,
SVN_CONFIG_OPTION_DIFF_EXTENSIONS, NULL);
if (diff_extensions)
- options = svn_cstring_split(diff_extensions, " \t\n\r", TRUE, pool);
+ options = svn_cstring_split(diff_extensions, " \t\n\r", TRUE,
+ result_pool);
}
}
if (options == NULL)
- options = apr_array_make(pool, 0, sizeof(const char *));
+ options = apr_array_make(result_pool, 0, sizeof(const char *));
if (diff_cmd)
- SVN_ERR(svn_path_cstring_to_utf8(&diff_cmd_baton->diff_cmd, diff_cmd,
- pool));
+ SVN_ERR(svn_path_cstring_to_utf8(&dwi->diff_cmd, diff_cmd,
+ result_pool));
else
- diff_cmd_baton->diff_cmd = NULL;
+ dwi->diff_cmd = NULL;
/* If there was a command, arrange options to pass to it. */
- if (diff_cmd_baton->diff_cmd)
+ if (dwi->diff_cmd)
{
const char **argv = NULL;
int argc = options->nelts;
if (argc)
{
int i;
- argv = apr_palloc(pool, argc * sizeof(char *));
+ argv = apr_palloc(result_pool, argc * sizeof(char *));
for (i = 0; i < argc; i++)
SVN_ERR(svn_utf_cstring_to_utf8(&argv[i],
- APR_ARRAY_IDX(options, i, const char *), pool));
+ APR_ARRAY_IDX(options, i, const char *), result_pool));
}
- diff_cmd_baton->options.for_external.argv = argv;
- diff_cmd_baton->options.for_external.argc = argc;
+ dwi->options.for_external.argv = argv;
+ dwi->options.for_external.argc = argc;
}
else /* No command, so arrange options for internal invocation instead. */
{
- diff_cmd_baton->options.for_internal
- = svn_diff_file_options_create(pool);
- SVN_ERR(svn_diff_file_options_parse
- (diff_cmd_baton->options.for_internal, options, pool));
+ dwi->options.for_internal = svn_diff_file_options_create(result_pool);
+ SVN_ERR(svn_diff_file_options_parse(dwi->options.for_internal,
+ options, result_pool));
}
return SVN_NO_ERROR;
@@ -2574,8 +2357,10 @@ svn_client_diff6(const apr_array_header_t *options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- struct diff_cmd_baton diff_cmd_baton = { 0 };
+ diff_writer_info_t dwi = { 0 };
svn_opt_revision_t peg_revision;
+ const svn_diff_tree_processor_t *diff_processor;
+ svn_diff_tree_processor_t *processor;
if (ignore_properties && properties_only)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
@@ -2586,36 +2371,54 @@ svn_client_diff6(const apr_array_header_t *options,
peg_revision.kind = svn_opt_revision_unspecified;
/* setup callback and baton */
- diff_cmd_baton.orig_path_1 = path_or_url1;
- diff_cmd_baton.orig_path_2 = path_or_url2;
-
- SVN_ERR(set_up_diff_cmd_and_options(&diff_cmd_baton, options,
- ctx->config, pool));
- diff_cmd_baton.pool = pool;
- diff_cmd_baton.outstream = outstream;
- diff_cmd_baton.errstream = errstream;
- diff_cmd_baton.header_encoding = header_encoding;
- diff_cmd_baton.revnum1 = SVN_INVALID_REVNUM;
- diff_cmd_baton.revnum2 = SVN_INVALID_REVNUM;
-
- diff_cmd_baton.force_binary = ignore_content_type;
- diff_cmd_baton.ignore_properties = ignore_properties;
- diff_cmd_baton.properties_only = properties_only;
- diff_cmd_baton.relative_to_dir = relative_to_dir;
- diff_cmd_baton.use_git_diff_format = use_git_diff_format;
- diff_cmd_baton.no_diff_added = no_diff_added;
- diff_cmd_baton.no_diff_deleted = no_diff_deleted;
- diff_cmd_baton.no_copyfrom_on_add = show_copies_as_adds;
-
- diff_cmd_baton.wc_ctx = ctx->wc_ctx;
- diff_cmd_baton.ra_session = NULL;
- diff_cmd_baton.anchor = NULL;
-
- return do_diff(&diff_callbacks, &diff_cmd_baton, ctx,
- path_or_url1, path_or_url2, revision1, revision2,
- &peg_revision,
- depth, ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists, pool);
+ dwi.ddi.orig_path_1 = path_or_url1;
+ dwi.ddi.orig_path_2 = path_or_url2;
+
+ SVN_ERR(create_diff_writer_info(&dwi, options,
+ ctx->config, pool));
+ dwi.pool = pool;
+ dwi.outstream = outstream;
+ dwi.errstream = errstream;
+ dwi.header_encoding = header_encoding;
+
+ dwi.force_binary = ignore_content_type;
+ dwi.ignore_properties = ignore_properties;
+ dwi.properties_only = properties_only;
+ dwi.relative_to_dir = relative_to_dir;
+ dwi.use_git_diff_format = use_git_diff_format;
+ dwi.no_diff_added = no_diff_added;
+ dwi.no_diff_deleted = no_diff_deleted;
+ dwi.show_copies_as_adds = show_copies_as_adds;
+
+ dwi.cancel_func = ctx->cancel_func;
+ dwi.cancel_baton = ctx->cancel_baton;
+
+ dwi.wc_ctx = ctx->wc_ctx;
+ dwi.ddi.session_relpath = NULL;
+ dwi.ddi.anchor = NULL;
+
+ processor = svn_diff__tree_processor_create(&dwi, pool);
+
+ processor->dir_added = diff_dir_added;
+ processor->dir_changed = diff_dir_changed;
+ processor->dir_deleted = diff_dir_deleted;
+
+ processor->file_added = diff_file_added;
+ processor->file_changed = diff_file_changed;
+ processor->file_deleted = diff_file_deleted;
+
+ diff_processor = processor;
+
+ /* --show-copies-as-adds and --git imply --notice-ancestry */
+ if (show_copies_as_adds || use_git_diff_format)
+ ignore_ancestry = FALSE;
+
+ return svn_error_trace(do_diff(NULL, NULL, &dwi.ddi,
+ path_or_url1, path_or_url2,
+ revision1, revision2, &peg_revision,
+ depth, ignore_ancestry, changelists,
+ TRUE /* text_deltas */,
+ diff_processor, ctx, pool, pool));
}
svn_error_t *
@@ -2641,7 +2444,9 @@ svn_client_diff_peg6(const apr_array_header_t *options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- struct diff_cmd_baton diff_cmd_baton = { 0 };
+ diff_writer_info_t dwi = { 0 };
+ const svn_diff_tree_processor_t *diff_processor;
+ svn_diff_tree_processor_t *processor;
if (ignore_properties && properties_only)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
@@ -2649,36 +2454,54 @@ svn_client_diff_peg6(const apr_array_header_t *options,
"properties at the same time"));
/* setup callback and baton */
- diff_cmd_baton.orig_path_1 = path_or_url;
- diff_cmd_baton.orig_path_2 = path_or_url;
-
- SVN_ERR(set_up_diff_cmd_and_options(&diff_cmd_baton, options,
- ctx->config, pool));
- diff_cmd_baton.pool = pool;
- diff_cmd_baton.outstream = outstream;
- diff_cmd_baton.errstream = errstream;
- diff_cmd_baton.header_encoding = header_encoding;
- diff_cmd_baton.revnum1 = SVN_INVALID_REVNUM;
- diff_cmd_baton.revnum2 = SVN_INVALID_REVNUM;
-
- diff_cmd_baton.force_binary = ignore_content_type;
- diff_cmd_baton.ignore_properties = ignore_properties;
- diff_cmd_baton.properties_only = properties_only;
- diff_cmd_baton.relative_to_dir = relative_to_dir;
- diff_cmd_baton.use_git_diff_format = use_git_diff_format;
- diff_cmd_baton.no_diff_added = no_diff_added;
- diff_cmd_baton.no_diff_deleted = no_diff_deleted;
- diff_cmd_baton.no_copyfrom_on_add = show_copies_as_adds;
-
- diff_cmd_baton.wc_ctx = ctx->wc_ctx;
- diff_cmd_baton.ra_session = NULL;
- diff_cmd_baton.anchor = NULL;
-
- return do_diff(&diff_callbacks, &diff_cmd_baton, ctx,
- path_or_url, path_or_url, start_revision, end_revision,
- peg_revision,
- depth, ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, changelists, pool);
+ dwi.ddi.orig_path_1 = path_or_url;
+ dwi.ddi.orig_path_2 = path_or_url;
+
+ SVN_ERR(create_diff_writer_info(&dwi, options,
+ ctx->config, pool));
+ dwi.pool = pool;
+ dwi.outstream = outstream;
+ dwi.errstream = errstream;
+ dwi.header_encoding = header_encoding;
+
+ dwi.force_binary = ignore_content_type;
+ dwi.ignore_properties = ignore_properties;
+ dwi.properties_only = properties_only;
+ dwi.relative_to_dir = relative_to_dir;
+ dwi.use_git_diff_format = use_git_diff_format;
+ dwi.no_diff_added = no_diff_added;
+ dwi.no_diff_deleted = no_diff_deleted;
+ dwi.show_copies_as_adds = show_copies_as_adds;
+
+ dwi.cancel_func = ctx->cancel_func;
+ dwi.cancel_baton = ctx->cancel_baton;
+
+ dwi.wc_ctx = ctx->wc_ctx;
+ dwi.ddi.session_relpath = NULL;
+ dwi.ddi.anchor = NULL;
+
+ processor = svn_diff__tree_processor_create(&dwi, pool);
+
+ processor->dir_added = diff_dir_added;
+ processor->dir_changed = diff_dir_changed;
+ processor->dir_deleted = diff_dir_deleted;
+
+ processor->file_added = diff_file_added;
+ processor->file_changed = diff_file_changed;
+ processor->file_deleted = diff_file_deleted;
+
+ diff_processor = processor;
+
+ /* --show-copies-as-adds and --git imply --notice-ancestry */
+ if (show_copies_as_adds || use_git_diff_format)
+ ignore_ancestry = FALSE;
+
+ return svn_error_trace(do_diff(NULL, NULL, &dwi.ddi,
+ path_or_url, path_or_url,
+ start_revision, end_revision, peg_revision,
+ depth, ignore_ancestry, changelists,
+ TRUE /* text_deltas */,
+ diff_processor, ctx, pool, pool));
}
svn_error_t *
@@ -2694,14 +2517,24 @@ svn_client_diff_summarize2(const char *path_or_url1,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- /* We will never do a pegged diff from here. */
+ const svn_diff_tree_processor_t *diff_processor;
svn_opt_revision_t peg_revision;
+ const char **p_root_relpath;
+
+ /* We will never do a pegged diff from here. */
peg_revision.kind = svn_opt_revision_unspecified;
- return do_diff_summarize(summarize_func, summarize_baton, ctx,
- path_or_url1, path_or_url2, revision1, revision2,
- &peg_revision,
- depth, ignore_ancestry, changelists, pool);
+ SVN_ERR(svn_client__get_diff_summarize_callbacks(
+ &diff_processor, &p_root_relpath,
+ summarize_func, summarize_baton,
+ path_or_url1, pool, pool));
+
+ return svn_error_trace(do_diff(p_root_relpath, NULL, NULL,
+ path_or_url1, path_or_url2,
+ revision1, revision2, &peg_revision,
+ depth, ignore_ancestry, changelists,
+ FALSE /* text_deltas */,
+ diff_processor, ctx, pool, pool));
}
svn_error_t *
@@ -2717,22 +2550,19 @@ svn_client_diff_summarize_peg2(const char *path_or_url,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- return do_diff_summarize(summarize_func, summarize_baton, ctx,
- path_or_url, path_or_url,
- start_revision, end_revision, peg_revision,
- depth, ignore_ancestry, changelists, pool);
-}
-
-svn_client_diff_summarize_t *
-svn_client_diff_summarize_dup(const svn_client_diff_summarize_t *diff,
- apr_pool_t *pool)
-{
- svn_client_diff_summarize_t *dup_diff = apr_palloc(pool, sizeof(*dup_diff));
-
- *dup_diff = *diff;
-
- if (diff->path)
- dup_diff->path = apr_pstrdup(pool, diff->path);
+ const svn_diff_tree_processor_t *diff_processor;
+ const char **p_root_relpath;
- return dup_diff;
+ SVN_ERR(svn_client__get_diff_summarize_callbacks(
+ &diff_processor, &p_root_relpath,
+ summarize_func, summarize_baton,
+ path_or_url, pool, pool));
+
+ return svn_error_trace(do_diff(p_root_relpath, NULL, NULL,
+ path_or_url, path_or_url,
+ start_revision, end_revision, peg_revision,
+ depth, ignore_ancestry, changelists,
+ FALSE /* text_deltas */,
+ diff_processor, ctx, pool, pool));
}
+
diff --git a/subversion/libsvn_client/diff_local.c b/subversion/libsvn_client/diff_local.c
index 2dd8a1b..df6bc0a 100644
--- a/subversion/libsvn_client/diff_local.c
+++ b/subversion/libsvn_client/diff_local.c
@@ -45,7 +45,9 @@
#include "svn_subst.h"
#include "client.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_wc_private.h"
+#include "private/svn_diff_tree.h"
#include "svn_private_config.h"
@@ -81,559 +83,718 @@ get_props(apr_hash_t **props,
return SVN_NO_ERROR;
}
-/* Produce a diff between two arbitrary files at LOCAL_ABSPATH1 and
- * LOCAL_ABSPATH2, using the diff callbacks from CALLBACKS.
- * Use PATH as the name passed to diff callbacks.
- * FILE1_IS_EMPTY and FILE2_IS_EMPTY are used as hints which diff callback
- * function to use to compare the files (added/deleted/changed).
+/* Forward declaration */
+static svn_error_t *
+do_file_diff(const char *left_abspath,
+ const char *right_abspath,
+ const char *left_root_abspath,
+ const char *right_root_abspath,
+ svn_boolean_t left_only,
+ svn_boolean_t right_only,
+ void *parent_baton,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+/* Forward declaration */
+static svn_error_t *
+do_dir_diff(const char *left_abspath,
+ const char *right_abspath,
+ const char *left_root_abspath,
+ const char *right_root_abspath,
+ svn_boolean_t left_only,
+ svn_boolean_t right_only,
+ svn_boolean_t left_before_right,
+ svn_depth_t depth,
+ void *parent_baton,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+/* Produce a diff of depth DEPTH between two arbitrary directories at
+ * LEFT_ABSPATH1 and RIGHT_ABSPATH2, using the provided diff callbacks
+ * to show file changes and, for versioned nodes, property changes.
+ *
+ * Report paths as relative from LEFT_ROOT_ABSPATH/RIGHT_ROOT_ABSPATH.
*
- * If ORIGINAL_PROPS_OVERRIDE is not NULL, use it as original properties
- * instead of reading properties from LOCAL_ABSPATH1. This is required when
- * a file replaces a directory, where LOCAL_ABSPATH1 is an empty file that
- * file content must be diffed against, but properties to diff against come
- * from the replaced directory. */
+ * If LEFT_ONLY is TRUE, only the left source exists (= everything will
+ * be reported as deleted). If RIGHT_ONLY is TRUE, only the right source
+ * exists (= everything will be reported as added).
+ *
+ * If LEFT_BEFORE_RIGHT is TRUE and left and right are unrelated, left is
+ * reported first. If false, right is reported first. (This is to allow
+ * producing a proper inverse diff).
+ *
+ * Walk the sources according to depth, and report with parent baton
+ * PARENT_BATON. */
static svn_error_t *
-do_arbitrary_files_diff(const char *local_abspath1,
- const char *local_abspath2,
- const char *path,
- svn_boolean_t file1_is_empty,
- svn_boolean_t file2_is_empty,
- apr_hash_t *original_props_override,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *diff_baton,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
+inner_dir_diff(const char *left_abspath,
+ const char *right_abspath,
+ const char *left_root_abspath,
+ const char *right_root_abspath,
+ svn_boolean_t left_only,
+ svn_boolean_t right_only,
+ svn_boolean_t left_before_right,
+ svn_depth_t depth,
+ void *parent_baton,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
{
- apr_hash_t *original_props;
- apr_hash_t *modified_props;
- apr_array_header_t *prop_changes;
- svn_string_t *original_mime_type = NULL;
- svn_string_t *modified_mime_type = NULL;
-
- if (ctx->cancel_func)
- SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
-
- /* Try to get properties from either file. It's OK if the files do not
- * have properties, or if they are unversioned. */
- if (original_props_override)
- original_props = original_props_override;
- else
- SVN_ERR(get_props(&original_props, local_abspath1, ctx->wc_ctx,
- scratch_pool, scratch_pool));
- SVN_ERR(get_props(&modified_props, local_abspath2, ctx->wc_ctx,
- scratch_pool, scratch_pool));
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_t *left_dirents;
+ apr_hash_t *right_dirents;
+ apr_array_header_t *sorted_dirents;
+ svn_error_t *err;
+ svn_depth_t depth_below_here;
+ int i;
- SVN_ERR(svn_prop_diffs(&prop_changes, modified_props, original_props,
- scratch_pool));
+ SVN_ERR_ASSERT(depth >= svn_depth_files && depth <= svn_depth_infinity);
- /* Try to determine the mime-type of each file. */
- original_mime_type = svn_hash_gets(original_props, SVN_PROP_MIME_TYPE);
- if (!file1_is_empty && !original_mime_type)
+ if (!right_only)
{
- const char *mime_type;
- SVN_ERR(svn_io_detect_mimetype2(&mime_type, local_abspath1,
- ctx->mimetypes_map, scratch_pool));
+ err = svn_io_get_dirents3(&left_dirents, left_abspath, FALSE,
+ scratch_pool, iterpool);
- if (mime_type)
- original_mime_type = svn_string_create(mime_type, scratch_pool);
+ if (err && (APR_STATUS_IS_ENOENT(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)))
+ {
+ svn_error_clear(err);
+ left_dirents = apr_hash_make(scratch_pool);
+ right_only = TRUE;
+ }
+ else
+ SVN_ERR(err);
}
+ else
+ left_dirents = apr_hash_make(scratch_pool);
- modified_mime_type = svn_hash_gets(modified_props, SVN_PROP_MIME_TYPE);
- if (!file2_is_empty && !modified_mime_type)
+ if (!left_only)
{
- const char *mime_type;
- SVN_ERR(svn_io_detect_mimetype2(&mime_type, local_abspath1,
- ctx->mimetypes_map, scratch_pool));
+ err = svn_io_get_dirents3(&right_dirents, right_abspath, FALSE,
+ scratch_pool, iterpool);
- if (mime_type)
- modified_mime_type = svn_string_create(mime_type, scratch_pool);
+ if (err && (APR_STATUS_IS_ENOENT(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)))
+ {
+ svn_error_clear(err);
+ right_dirents = apr_hash_make(scratch_pool);
+ right_only = TRUE;
+ }
+ else
+ SVN_ERR(err);
}
+ else
+ right_dirents = apr_hash_make(scratch_pool);
+
+ if (left_only && right_only)
+ return SVN_NO_ERROR; /* Somebody deleted the directory?? */
- /* Produce the diff. */
- if (file1_is_empty && !file2_is_empty)
- SVN_ERR(callbacks->file_added(NULL, NULL, NULL, path,
- local_abspath1, local_abspath2,
- /* ### TODO get real revision info
- * for versioned files? */
- SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
- original_mime_type ?
- original_mime_type->data : NULL,
- modified_mime_type ?
- modified_mime_type->data : NULL,
- /* ### TODO get copyfrom? */
- NULL, SVN_INVALID_REVNUM,
- prop_changes, original_props,
- diff_baton, scratch_pool));
- else if (!file1_is_empty && file2_is_empty)
- SVN_ERR(callbacks->file_deleted(NULL, NULL, path,
- local_abspath1, local_abspath2,
- original_mime_type ?
- original_mime_type->data : NULL,
- modified_mime_type ?
- modified_mime_type->data : NULL,
- original_props,
- diff_baton, scratch_pool));
+ if (depth != svn_depth_infinity)
+ depth_below_here = svn_depth_empty;
else
+ depth_below_here = svn_depth_infinity;
+
+ sorted_dirents = svn_sort__hash(apr_hash_merge(iterpool, left_dirents,
+ right_dirents, NULL, NULL),
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+
+ for (i = 0; i < sorted_dirents->nelts; i++)
{
- svn_stream_t *file1;
- svn_stream_t *file2;
- svn_boolean_t same;
- svn_string_t *val;
- /* We have two files, which may or may not be the same.
+ svn_sort__item_t* elt = &APR_ARRAY_IDX(sorted_dirents, i, svn_sort__item_t);
+ svn_io_dirent2_t *left_dirent;
+ svn_io_dirent2_t *right_dirent;
+ const char *child_left_abspath;
+ const char *child_right_abspath;
- ### Our caller assumes that we should ignore symlinks here and
- handle them as normal paths. Perhaps that should change?
- */
- SVN_ERR(svn_stream_open_readonly(&file1, local_abspath1, scratch_pool,
- scratch_pool));
+ svn_pool_clear(iterpool);
- SVN_ERR(svn_stream_open_readonly(&file2, local_abspath2, scratch_pool,
- scratch_pool));
+ if (ctx->cancel_func)
+ SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
- /* Wrap with normalization, etc. if necessary */
- if (original_props)
- {
- val = svn_hash_gets(original_props, SVN_PROP_EOL_STYLE);
+ if (svn_wc_is_adm_dir(elt->key, iterpool))
+ continue;
- if (val)
+ left_dirent = right_only ? NULL : svn_hash_gets(left_dirents, elt->key);
+ right_dirent = left_only ? NULL : svn_hash_gets(right_dirents, elt->key);
+
+ child_left_abspath = svn_dirent_join(left_abspath, elt->key, iterpool);
+ child_right_abspath = svn_dirent_join(right_abspath, elt->key, iterpool);
+
+ if (((left_dirent == NULL) != (right_dirent == NULL))
+ || (left_dirent->kind != right_dirent->kind))
+ {
+ /* Report delete and/or add */
+ if (left_dirent && left_before_right)
{
- svn_subst_eol_style_t style;
- const char *eol;
- svn_subst_eol_style_from_value(&style, &eol, val->data);
-
- /* ### Ignoring keywords */
- if (eol)
- file1 = svn_subst_stream_translated(file1, eol, TRUE,
- NULL, FALSE,
- scratch_pool);
+ if (left_dirent->kind == svn_node_file)
+ SVN_ERR(do_file_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, parent_baton,
+ diff_processor, ctx, iterpool));
+ else if (depth >= svn_depth_immediates)
+ SVN_ERR(do_dir_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, left_before_right,
+ depth_below_here, parent_baton,
+ diff_processor, ctx, iterpool));
}
- }
- if (modified_props)
- {
- val = svn_hash_gets(modified_props, SVN_PROP_EOL_STYLE);
+ if (right_dirent)
+ {
+ if (right_dirent->kind == svn_node_file)
+ SVN_ERR(do_file_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, TRUE, parent_baton,
+ diff_processor, ctx, iterpool));
+ else if (depth >= svn_depth_immediates)
+ SVN_ERR(do_dir_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, TRUE, left_before_right,
+ depth_below_here, parent_baton,
+ diff_processor, ctx, iterpool));
+ }
- if (val)
+ if (left_dirent && !left_before_right)
{
- svn_subst_eol_style_t style;
- const char *eol;
- svn_subst_eol_style_from_value(&style, &eol, val->data);
-
- /* ### Ignoring keywords */
- if (eol)
- file2 = svn_subst_stream_translated(file2, eol, TRUE,
- NULL, FALSE,
- scratch_pool);
+ if (left_dirent->kind == svn_node_file)
+ SVN_ERR(do_file_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, parent_baton,
+ diff_processor, ctx, iterpool));
+ else if (depth >= svn_depth_immediates)
+ SVN_ERR(do_dir_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, left_before_right,
+ depth_below_here, parent_baton,
+ diff_processor, ctx, iterpool));
}
}
-
- SVN_ERR(svn_stream_contents_same2(&same, file1, file2, scratch_pool));
-
- if (! same || prop_changes->nelts > 0)
+ else if (left_dirent->kind == svn_node_file)
{
- /* ### We should probably pass the normalized data we created using
- the subst streams as that is what diff users expect */
- SVN_ERR(callbacks->file_changed(NULL, NULL, NULL, path,
- same ? NULL : local_abspath1,
- same ? NULL : local_abspath2,
- /* ### TODO get real revision info
- * for versioned files? */
- SVN_INVALID_REVNUM /* rev1 */,
- SVN_INVALID_REVNUM /* rev2 */,
- original_mime_type ?
- original_mime_type->data : NULL,
- modified_mime_type ?
- modified_mime_type->data : NULL,
- prop_changes, original_props,
- diff_baton, scratch_pool));
+ /* Perform file-file diff */
+ SVN_ERR(do_file_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, FALSE, parent_baton,
+ diff_processor, ctx, iterpool));
+ }
+ else if (depth >= svn_depth_immediates)
+ {
+ /* Perform dir-dir diff */
+ SVN_ERR(do_dir_diff(child_left_abspath, child_right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, FALSE, left_before_right,
+ depth_below_here, parent_baton,
+ diff_processor, ctx, iterpool));
}
}
return SVN_NO_ERROR;
}
-struct arbitrary_diff_walker_baton {
- /* The root directories of the trees being compared. */
- const char *root1_abspath;
- const char *root2_abspath;
-
- /* TRUE if recursing within an added subtree of root2_abspath that
- * does not exist in root1_abspath. */
- svn_boolean_t recursing_within_added_subtree;
+/* Translates *LEFT_ABSPATH to a temporary file if PROPS specify that the
+ file needs translation. *LEFT_ABSPATH is updated to point to a file that
+ lives at least as long as RESULT_POOL when translation is necessary.
+ Otherwise the value is not updated */
+static svn_error_t *
+translate_if_necessary(const char **local_abspath,
+ apr_hash_t *props,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const svn_string_t *eol_style_val;
+ const svn_string_t *keywords_val;
+ svn_subst_eol_style_t eol_style;
+ const char *eol;
+ apr_hash_t *keywords;
+ svn_stream_t *contents;
+ svn_stream_t *dst;
+
+ /* if (svn_hash_gets(props, SVN_PROP_SPECIAL))
+ ### TODO: Implement */
+
+ eol_style_val = svn_hash_gets(props, SVN_PROP_EOL_STYLE);
+ keywords_val = svn_hash_gets(props, SVN_PROP_KEYWORDS);
+
+ if (eol_style_val)
+ svn_subst_eol_style_from_value(&eol_style, &eol, eol_style_val->data);
+ else
+ {
+ eol = NULL;
+ eol_style = svn_subst_eol_style_none;
+ }
- /* TRUE if recursing within an administrative (.i.e. .svn) directory. */
- svn_boolean_t recursing_within_adm_dir;
+ if (keywords_val)
+ SVN_ERR(svn_subst_build_keywords3(&keywords, keywords_val->data,
+ APR_STRINGIFY(SVN_INVALID_REVNUM),
+ "", "", 0, "", scratch_pool));
+ else
+ keywords = NULL;
- /* The absolute path of the adm dir if RECURSING_WITHIN_ADM_DIR is TRUE.
- * Else this is NULL.*/
- const char *adm_dir_abspath;
+ if (!svn_subst_translation_required(eol_style, eol, keywords, FALSE, FALSE))
+ return SVN_NO_ERROR;
- /* A path to an empty file used for diffs that add/delete files. */
- const char *empty_file_abspath;
+ SVN_ERR(svn_stream_open_readonly(&contents, *local_abspath,
+ scratch_pool, scratch_pool));
- const svn_wc_diff_callbacks4_t *callbacks;
- void *diff_baton;
- svn_client_ctx_t *ctx;
- apr_pool_t *pool;
-} arbitrary_diff_walker_baton;
+ SVN_ERR(svn_stream_open_unique(&dst, local_abspath, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
-/* Forward declaration needed because this function has a cyclic
- * dependency with do_arbitrary_dirs_diff(). */
-static svn_error_t *
-arbitrary_diff_walker(void *baton, const char *local_abspath,
- const apr_finfo_t *finfo,
- apr_pool_t *scratch_pool);
+ dst = svn_subst_stream_translated(dst, eol, TRUE /* repair */,
+ keywords, FALSE /* expand */,
+ scratch_pool);
-/* Another forward declaration. */
-static svn_error_t *
-arbitrary_diff_this_dir(struct arbitrary_diff_walker_baton *b,
- const char *local_abspath,
- svn_depth_t depth,
- apr_pool_t *scratch_pool);
+ SVN_ERR(svn_stream_copy3(contents, dst, cancel_func, cancel_baton,
+ scratch_pool));
-/* Produce a diff of depth DEPTH between two arbitrary directories at
- * LOCAL_ABSPATH1 and LOCAL_ABSPATH2, using the provided diff callbacks
- * to show file changes and, for versioned nodes, property changes.
- *
- * If ROOT_ABSPATH1 and ROOT_ABSPATH2 are not NULL, show paths in diffs
- * relative to these roots, rather than relative to LOCAL_ABSPATH1 and
- * LOCAL_ABSPATH2. This is needed when crawling a subtree that exists
- * only within LOCAL_ABSPATH2. */
-static svn_error_t *
-do_arbitrary_dirs_diff(const char *local_abspath1,
- const char *local_abspath2,
- const char *root_abspath1,
- const char *root_abspath2,
- svn_depth_t depth,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *diff_baton,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- apr_file_t *empty_file;
- svn_node_kind_t kind1;
-
- struct arbitrary_diff_walker_baton b;
-
- /* If LOCAL_ABSPATH1 is not a directory, crawl LOCAL_ABSPATH2 instead
- * and compare it to LOCAL_ABSPATH1, showing only additions.
- * This case can only happen during recursion from arbitrary_diff_walker(),
- * because do_arbitrary_nodes_diff() prevents this from happening at
- * the root of the comparison. */
- SVN_ERR(svn_io_check_resolved_path(local_abspath1, &kind1, scratch_pool));
- b.recursing_within_added_subtree = (kind1 != svn_node_dir);
-
- b.root1_abspath = root_abspath1 ? root_abspath1 : local_abspath1;
- b.root2_abspath = root_abspath2 ? root_abspath2 : local_abspath2;
- b.recursing_within_adm_dir = FALSE;
- b.adm_dir_abspath = NULL;
- b.callbacks = callbacks;
- b.diff_baton = diff_baton;
- b.ctx = ctx;
- b.pool = scratch_pool;
-
- SVN_ERR(svn_io_open_unique_file3(&empty_file, &b.empty_file_abspath,
- NULL, svn_io_file_del_on_pool_cleanup,
- scratch_pool, scratch_pool));
-
- if (depth <= svn_depth_immediates)
- SVN_ERR(arbitrary_diff_this_dir(&b, local_abspath1, depth, scratch_pool));
- else if (depth == svn_depth_infinity)
- SVN_ERR(svn_io_dir_walk2(b.recursing_within_added_subtree ? local_abspath2
- : local_abspath1,
- 0, arbitrary_diff_walker, &b, scratch_pool));
return SVN_NO_ERROR;
}
-/* Produce a diff of depth DEPTH for the directory at LOCAL_ABSPATH,
- * using information from the arbitrary_diff_walker_baton B.
- * LOCAL_ABSPATH is the path being crawled and can be on either side
- * of the diff depending on baton->recursing_within_added_subtree. */
+/* Handles reporting of a file for inner_dir_diff */
static svn_error_t *
-arbitrary_diff_this_dir(struct arbitrary_diff_walker_baton *b,
- const char *local_abspath,
- svn_depth_t depth,
- apr_pool_t *scratch_pool)
+do_file_diff(const char *left_abspath,
+ const char *right_abspath,
+ const char *left_root_abspath,
+ const char *right_root_abspath,
+ svn_boolean_t left_only,
+ svn_boolean_t right_only,
+ void *parent_baton,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
{
- const char *local_abspath1;
- const char *local_abspath2;
- svn_node_kind_t kind1;
- svn_node_kind_t kind2;
- const char *child_relpath;
- apr_hash_t *dirents1;
- apr_hash_t *dirents2;
- apr_hash_t *merged_dirents;
- apr_array_header_t *sorted_dirents;
- int i;
- apr_pool_t *iterpool;
-
- if (b->recursing_within_adm_dir)
- {
- if (svn_dirent_skip_ancestor(b->adm_dir_abspath, local_abspath))
- return SVN_NO_ERROR;
- else
- {
- b->recursing_within_adm_dir = FALSE;
- b->adm_dir_abspath = NULL;
- }
- }
- else if (svn_wc_is_adm_dir(svn_dirent_basename(local_abspath, NULL),
- scratch_pool))
- {
- b->recursing_within_adm_dir = TRUE;
- b->adm_dir_abspath = apr_pstrdup(b->pool, local_abspath);
- return SVN_NO_ERROR;
- }
+ const char *relpath;
+ svn_diff_source_t *left_source;
+ svn_diff_source_t *right_source;
+ svn_boolean_t skip = FALSE;
+ apr_hash_t *left_props;
+ apr_hash_t *right_props;
+ void *file_baton;
+
+ relpath = svn_dirent_skip_ancestor(left_root_abspath, left_abspath);
+
+ if (! right_only)
+ left_source = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
+ else
+ left_source = NULL;
- if (b->recursing_within_added_subtree)
- child_relpath = svn_dirent_skip_ancestor(b->root2_abspath, local_abspath);
+ if (! left_only)
+ right_source = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
else
- child_relpath = svn_dirent_skip_ancestor(b->root1_abspath, local_abspath);
- if (!child_relpath)
+ right_source = NULL;
+
+ SVN_ERR(diff_processor->file_opened(&file_baton, &skip,
+ relpath,
+ left_source,
+ right_source,
+ NULL /* copyfrom_source */,
+ parent_baton,
+ diff_processor,
+ scratch_pool,
+ scratch_pool));
+
+ if (skip)
return SVN_NO_ERROR;
- local_abspath1 = svn_dirent_join(b->root1_abspath, child_relpath,
- scratch_pool);
- SVN_ERR(svn_io_check_resolved_path(local_abspath1, &kind1, scratch_pool));
+ if (! right_only)
+ {
+ SVN_ERR(get_props(&left_props, left_abspath, ctx->wc_ctx,
+ scratch_pool, scratch_pool));
- local_abspath2 = svn_dirent_join(b->root2_abspath, child_relpath,
- scratch_pool);
- SVN_ERR(svn_io_check_resolved_path(local_abspath2, &kind2, scratch_pool));
+ /* We perform a mimetype detection to avoid diffing binary files
+ for textual changes.*/
+ if (! svn_hash_gets(left_props, SVN_PROP_MIME_TYPE))
+ {
+ const char *mime_type;
- if (depth > svn_depth_empty)
- {
- if (kind1 == svn_node_dir)
- SVN_ERR(svn_io_get_dirents3(&dirents1, local_abspath1,
- TRUE, /* only_check_type */
- scratch_pool, scratch_pool));
- else
- dirents1 = apr_hash_make(scratch_pool);
+ /* ### Use libmagic magic? */
+ SVN_ERR(svn_io_detect_mimetype2(&mime_type, left_abspath,
+ ctx->mimetypes_map, scratch_pool));
+
+ if (mime_type)
+ svn_hash_sets(left_props, SVN_PROP_MIME_TYPE,
+ svn_string_create(mime_type, scratch_pool));
+ }
+
+ SVN_ERR(translate_if_necessary(&left_abspath, left_props,
+ ctx->cancel_func, ctx->cancel_baton,
+ scratch_pool, scratch_pool));
}
+ else
+ left_props = NULL;
- if (kind2 == svn_node_dir)
+ if (! left_only)
{
- apr_hash_t *original_props;
- apr_hash_t *modified_props;
- apr_array_header_t *prop_changes;
-
- /* Show any property changes for this directory. */
- SVN_ERR(get_props(&original_props, local_abspath1, b->ctx->wc_ctx,
- scratch_pool, scratch_pool));
- SVN_ERR(get_props(&modified_props, local_abspath2, b->ctx->wc_ctx,
+ SVN_ERR(get_props(&right_props, right_abspath, ctx->wc_ctx,
scratch_pool, scratch_pool));
- SVN_ERR(svn_prop_diffs(&prop_changes, modified_props, original_props,
- scratch_pool));
- if (prop_changes->nelts > 0)
- SVN_ERR(b->callbacks->dir_props_changed(NULL, NULL, child_relpath,
- FALSE /* was_added */,
- prop_changes, original_props,
- b->diff_baton,
- scratch_pool));
-
- if (depth > svn_depth_empty)
- {
- /* Read directory entries. */
- SVN_ERR(svn_io_get_dirents3(&dirents2, local_abspath2,
- TRUE, /* only_check_type */
- scratch_pool, scratch_pool));
- }
- }
- else if (depth > svn_depth_empty)
- dirents2 = apr_hash_make(scratch_pool);
- if (depth <= svn_depth_empty)
- return SVN_NO_ERROR;
+ /* We perform a mimetype detection to avoid diffing binary files
+ for textual changes.*/
+ if (! svn_hash_gets(right_props, SVN_PROP_MIME_TYPE))
+ {
+ const char *mime_type;
- /* Compare dirents1 to dirents2 and show added/deleted/changed files. */
- merged_dirents = apr_hash_merge(scratch_pool, dirents1, dirents2,
- NULL, NULL);
- sorted_dirents = svn_sort__hash(merged_dirents,
- svn_sort_compare_items_as_paths,
- scratch_pool);
- iterpool = svn_pool_create(scratch_pool);
- for (i = 0; i < sorted_dirents->nelts; i++)
- {
- svn_sort__item_t elt = APR_ARRAY_IDX(sorted_dirents, i, svn_sort__item_t);
- const char *name = elt.key;
- svn_io_dirent2_t *dirent1;
- svn_io_dirent2_t *dirent2;
- const char *child1_abspath;
- const char *child2_abspath;
+ /* ### Use libmagic magic? */
+ SVN_ERR(svn_io_detect_mimetype2(&mime_type, right_abspath,
+ ctx->mimetypes_map, scratch_pool));
- svn_pool_clear(iterpool);
+ if (mime_type)
+ svn_hash_sets(right_props, SVN_PROP_MIME_TYPE,
+ svn_string_create(mime_type, scratch_pool));
+ }
- if (b->ctx->cancel_func)
- SVN_ERR(b->ctx->cancel_func(b->ctx->cancel_baton));
+ SVN_ERR(translate_if_necessary(&right_abspath, right_props,
+ ctx->cancel_func, ctx->cancel_baton,
+ scratch_pool, scratch_pool));
- if (strcmp(name, SVN_WC_ADM_DIR_NAME) == 0)
- continue;
+ }
+ else
+ right_props = NULL;
- dirent1 = svn_hash_gets(dirents1, name);
- if (!dirent1)
- {
- dirent1 = svn_io_dirent2_create(iterpool);
- dirent1->kind = svn_node_none;
- }
- dirent2 = svn_hash_gets(dirents2, name);
- if (!dirent2)
- {
- dirent2 = svn_io_dirent2_create(iterpool);
- dirent2->kind = svn_node_none;
- }
+ if (left_only)
+ {
+ SVN_ERR(diff_processor->file_deleted(relpath,
+ left_source,
+ left_abspath,
+ left_props,
+ file_baton,
+ diff_processor,
+ scratch_pool));
+ }
+ else if (right_only)
+ {
+ SVN_ERR(diff_processor->file_added(relpath,
+ NULL /* copyfrom_source */,
+ right_source,
+ NULL /* copyfrom_file */,
+ right_abspath,
+ NULL /* copyfrom_props */,
+ right_props,
+ file_baton,
+ diff_processor,
+ scratch_pool));
+ }
+ else
+ {
+ /* ### Perform diff -> close/changed */
+ svn_boolean_t same;
+ apr_array_header_t *prop_changes;
- child1_abspath = svn_dirent_join(local_abspath1, name, iterpool);
- child2_abspath = svn_dirent_join(local_abspath2, name, iterpool);
+ SVN_ERR(svn_io_files_contents_same_p(&same, left_abspath, right_abspath,
+ scratch_pool));
- if (dirent1->special)
- SVN_ERR(svn_io_check_resolved_path(child1_abspath, &dirent1->kind,
- iterpool));
- if (dirent2->special)
- SVN_ERR(svn_io_check_resolved_path(child1_abspath, &dirent2->kind,
- iterpool));
+ SVN_ERR(svn_prop_diffs(&prop_changes, right_props, left_props,
+ scratch_pool));
- if (dirent1->kind == svn_node_dir &&
- dirent2->kind == svn_node_dir)
+ if (!same || prop_changes->nelts > 0)
{
- if (depth == svn_depth_immediates)
- {
- /* Not using the walker, so show property diffs on these dirs. */
- SVN_ERR(do_arbitrary_dirs_diff(child1_abspath, child2_abspath,
- b->root1_abspath, b->root2_abspath,
- svn_depth_empty,
- b->callbacks, b->diff_baton,
- b->ctx, iterpool));
- }
- else
- {
- /* Either the walker will visit these directories (with
- * depth=infinity) and they will be processed as 'this dir'
- * later, or we're showing file children only (depth=files). */
- continue;
- }
-
+ SVN_ERR(diff_processor->file_changed(relpath,
+ left_source,
+ right_source,
+ same ? NULL : left_abspath,
+ same ? NULL : right_abspath,
+ left_props,
+ right_props,
+ !same,
+ prop_changes,
+ file_baton,
+ diff_processor,
+ scratch_pool));
}
-
- /* Files that exist only in dirents1. */
- if (dirent1->kind == svn_node_file &&
- (dirent2->kind == svn_node_dir || dirent2->kind == svn_node_none))
- SVN_ERR(do_arbitrary_files_diff(child1_abspath, b->empty_file_abspath,
- svn_relpath_join(child_relpath, name,
- iterpool),
- FALSE, TRUE, NULL,
- b->callbacks, b->diff_baton,
- b->ctx, iterpool));
-
- /* Files that exist only in dirents2. */
- if (dirent2->kind == svn_node_file &&
- (dirent1->kind == svn_node_dir || dirent1->kind == svn_node_none))
+ else
{
- apr_hash_t *original_props;
-
- SVN_ERR(get_props(&original_props, child1_abspath, b->ctx->wc_ctx,
- scratch_pool, scratch_pool));
- SVN_ERR(do_arbitrary_files_diff(b->empty_file_abspath, child2_abspath,
- svn_relpath_join(child_relpath, name,
- iterpool),
- TRUE, FALSE, original_props,
- b->callbacks, b->diff_baton,
- b->ctx, iterpool));
+ SVN_ERR(diff_processor->file_closed(relpath,
+ left_source,
+ right_source,
+ file_baton,
+ diff_processor,
+ scratch_pool));
}
-
- /* Files that exist in dirents1 and dirents2. */
- if (dirent1->kind == svn_node_file && dirent2->kind == svn_node_file)
- SVN_ERR(do_arbitrary_files_diff(child1_abspath, child2_abspath,
- svn_relpath_join(child_relpath, name,
- iterpool),
- FALSE, FALSE, NULL,
- b->callbacks, b->diff_baton,
- b->ctx, scratch_pool));
-
- /* Directories that only exist in dirents2. These aren't crawled
- * by this walker so we have to crawl them separately. */
- if (depth > svn_depth_files &&
- dirent2->kind == svn_node_dir &&
- (dirent1->kind == svn_node_file || dirent1->kind == svn_node_none))
- SVN_ERR(do_arbitrary_dirs_diff(child1_abspath, child2_abspath,
- b->root1_abspath, b->root2_abspath,
- depth <= svn_depth_immediates
- ? svn_depth_empty
- : svn_depth_infinity ,
- b->callbacks, b->diff_baton,
- b->ctx, iterpool));
}
-
- svn_pool_destroy(iterpool);
-
return SVN_NO_ERROR;
}
-/* An implementation of svn_io_walk_func_t.
- * Note: LOCAL_ABSPATH is the path being crawled and can be on either side
- * of the diff depending on baton->recursing_within_added_subtree. */
+
+/* Handles reporting of a directory and its children for inner_dir_diff */
static svn_error_t *
-arbitrary_diff_walker(void *baton, const char *local_abspath,
- const apr_finfo_t *finfo,
- apr_pool_t *scratch_pool)
+do_dir_diff(const char *left_abspath,
+ const char *right_abspath,
+ const char *left_root_abspath,
+ const char *right_root_abspath,
+ svn_boolean_t left_only,
+ svn_boolean_t right_only,
+ svn_boolean_t left_before_right,
+ svn_depth_t depth,
+ void *parent_baton,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
{
- struct arbitrary_diff_walker_baton *b = baton;
+ const char *relpath;
+ svn_diff_source_t *left_source;
+ svn_diff_source_t *right_source;
+ svn_boolean_t skip = FALSE;
+ svn_boolean_t skip_children = FALSE;
+ void *dir_baton;
+ apr_hash_t *left_props;
+ apr_hash_t *right_props;
+
+ relpath = svn_dirent_skip_ancestor(left_root_abspath, left_abspath);
+
+ if (! right_only)
+ {
+ left_source = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
+ SVN_ERR(get_props(&left_props, left_abspath, ctx->wc_ctx,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ left_source = NULL;
+ left_props = NULL;
+ }
+
+ if (! left_only)
+ {
+ right_source = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
+ SVN_ERR(get_props(&right_props, right_abspath, ctx->wc_ctx,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ right_source = NULL;
+ right_props = NULL;
+ }
- if (b->ctx->cancel_func)
- SVN_ERR(b->ctx->cancel_func(b->ctx->cancel_baton));
+ SVN_ERR(diff_processor->dir_opened(&dir_baton, &skip, &skip_children,
+ relpath,
+ left_source,
+ right_source,
+ NULL /* copyfrom_source */,
+ parent_baton,
+ diff_processor,
+ scratch_pool, scratch_pool));
- if (finfo->filetype != APR_DIR)
+ if (!skip_children)
+ {
+ if (depth >= svn_depth_files)
+ SVN_ERR(inner_dir_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ left_only, right_only,
+ left_before_right, depth,
+ dir_baton,
+ diff_processor, ctx, scratch_pool));
+ }
+ else if (skip)
return SVN_NO_ERROR;
- SVN_ERR(arbitrary_diff_this_dir(b, local_abspath, svn_depth_infinity,
- scratch_pool));
+ if (left_props && right_props)
+ {
+ apr_array_header_t *prop_diffs;
+
+ SVN_ERR(svn_prop_diffs(&prop_diffs, right_props, left_props,
+ scratch_pool));
+
+ if (prop_diffs->nelts)
+ {
+ SVN_ERR(diff_processor->dir_changed(relpath,
+ left_source,
+ right_source,
+ left_props,
+ right_props,
+ prop_diffs,
+ dir_baton,
+ diff_processor,
+ scratch_pool));
+ return SVN_NO_ERROR;
+ }
+ }
+
+ if (left_source && right_source)
+ {
+ SVN_ERR(diff_processor->dir_closed(relpath,
+ left_source,
+ right_source,
+ dir_baton,
+ diff_processor,
+ scratch_pool));
+ }
+ else if (left_source)
+ {
+ SVN_ERR(diff_processor->dir_deleted(relpath,
+ left_source,
+ left_props,
+ dir_baton,
+ diff_processor,
+ scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(diff_processor->dir_added(relpath,
+ NULL /* copyfrom_source */,
+ right_source,
+ NULL /* copyfrom_props */,
+ right_props,
+ dir_baton,
+ diff_processor,
+ scratch_pool));
+ }
return SVN_NO_ERROR;
}
svn_error_t *
-svn_client__arbitrary_nodes_diff(const char *local_abspath1,
- const char *local_abspath2,
+svn_client__arbitrary_nodes_diff(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ const char *left_abspath,
+ const char *right_abspath,
svn_depth_t depth,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *diff_baton,
+ const svn_diff_tree_processor_t *diff_processor,
svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_node_kind_t kind1;
- svn_node_kind_t kind2;
+ svn_node_kind_t left_kind;
+ svn_node_kind_t right_kind;
+ const char *left_root_abspath;
+ const char *right_root_abspath;
+ svn_boolean_t left_before_right = TRUE; /* Future argument? */
- SVN_ERR(svn_io_check_resolved_path(local_abspath1, &kind1, scratch_pool));
- SVN_ERR(svn_io_check_resolved_path(local_abspath2, &kind2, scratch_pool));
+ if (depth == svn_depth_unknown)
+ depth = svn_depth_infinity;
- if (kind1 != kind2)
- return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
- _("'%s' is not the same node kind as '%s'"),
- svn_dirent_local_style(local_abspath1,
- scratch_pool),
- svn_dirent_local_style(local_abspath2,
- scratch_pool));
+ SVN_ERR(svn_io_check_resolved_path(left_abspath, &left_kind, scratch_pool));
+ SVN_ERR(svn_io_check_resolved_path(right_abspath, &right_kind, scratch_pool));
if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
- if (kind1 == svn_node_file)
- SVN_ERR(do_arbitrary_files_diff(local_abspath1, local_abspath2,
- svn_dirent_basename(local_abspath1,
- scratch_pool),
- FALSE, FALSE, NULL,
- callbacks, diff_baton,
- ctx, scratch_pool));
- else if (kind1 == svn_node_dir)
- SVN_ERR(do_arbitrary_dirs_diff(local_abspath1, local_abspath2,
- NULL, NULL, depth,
- callbacks, diff_baton,
- ctx, scratch_pool));
+ if (left_kind == svn_node_dir && right_kind == svn_node_dir)
+ {
+ left_root_abspath = left_abspath;
+ right_root_abspath = right_abspath;
+
+ if (root_relpath)
+ *root_relpath = "";
+ if (root_is_dir)
+ *root_is_dir = TRUE;
+ }
+ else
+ {
+ svn_dirent_split(&left_root_abspath, root_relpath, left_abspath,
+ scratch_pool);
+ right_root_abspath = svn_dirent_dirname(right_abspath, scratch_pool);
+
+ if (root_relpath)
+ *root_relpath = apr_pstrdup(result_pool, *root_relpath);
+ if (root_is_dir)
+ *root_is_dir = FALSE;
+ }
+
+ if (left_kind == svn_node_dir && right_kind == svn_node_dir)
+ {
+ SVN_ERR(do_dir_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, FALSE, left_before_right,
+ depth, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ }
+ else if (left_kind == svn_node_file && right_kind == svn_node_file)
+ {
+ SVN_ERR(do_file_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, FALSE,
+ NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ }
+ else if (left_kind == svn_node_file || left_kind == svn_node_dir
+ || right_kind == svn_node_file || right_kind == svn_node_dir)
+ {
+ void *dir_baton;
+ svn_boolean_t skip = FALSE;
+ svn_boolean_t skip_children = FALSE;
+ svn_diff_source_t *left_src;
+ svn_diff_source_t *right_src;
+
+ left_src = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
+ right_src = svn_diff__source_create(SVN_INVALID_REVNUM, scratch_pool);
+
+ /* The root is replaced... */
+ /* Report delete and/or add */
+
+ SVN_ERR(diff_processor->dir_opened(&dir_baton, &skip, &skip_children, "",
+ left_src,
+ right_src,
+ NULL /* copyfrom_src */,
+ NULL,
+ diff_processor,
+ scratch_pool, scratch_pool));
+
+ if (skip)
+ return SVN_NO_ERROR;
+ else if (!skip_children)
+ {
+ if (left_before_right)
+ {
+ if (left_kind == svn_node_file)
+ SVN_ERR(do_file_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ else if (left_kind == svn_node_dir)
+ SVN_ERR(do_dir_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, left_before_right,
+ depth, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ }
+
+ if (right_kind == svn_node_file)
+ SVN_ERR(do_file_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, TRUE, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ else if (right_kind == svn_node_dir)
+ SVN_ERR(do_dir_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ FALSE, TRUE, left_before_right,
+ depth, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+
+ if (! left_before_right)
+ {
+ if (left_kind == svn_node_file)
+ SVN_ERR(do_file_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ else if (left_kind == svn_node_dir)
+ SVN_ERR(do_dir_diff(left_abspath, right_abspath,
+ left_root_abspath, right_root_abspath,
+ TRUE, FALSE, left_before_right,
+ depth, NULL /* parent_baton */,
+ diff_processor, ctx, scratch_pool));
+ }
+ }
+
+ SVN_ERR(diff_processor->dir_closed("",
+ left_src,
+ right_src,
+ dir_baton,
+ diff_processor,
+ scratch_pool));
+ }
else
return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
_("'%s' is not a file or directory"),
- kind1 == svn_node_none
- ? svn_dirent_local_style(local_abspath1,
- scratch_pool)
- : svn_dirent_local_style(local_abspath2,
- scratch_pool));
+ svn_dirent_local_style(
+ (left_kind == svn_node_none)
+ ? left_abspath
+ : right_abspath,
+ scratch_pool));
+
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/diff_summarize.c b/subversion/libsvn_client/diff_summarize.c
index df0911b..9e258cd 100644
--- a/subversion/libsvn_client/diff_summarize.c
+++ b/subversion/libsvn_client/diff_summarize.c
@@ -25,32 +25,29 @@
#include "svn_dirent_uri.h"
#include "svn_hash.h"
+#include "svn_path.h"
#include "svn_props.h"
#include "svn_pools.h"
+#include "private/svn_wc_private.h"
+
#include "client.h"
/* Diff callbacks baton. */
struct summarize_baton_t {
+ apr_pool_t *baton_pool; /* For allocating skip_path */
+
/* The target path of the diff, relative to the anchor; "" if target == anchor. */
- const char *target;
+ const char *skip_relpath;
/* The summarize callback passed down from the API */
svn_client_diff_summarize_func_t summarize_func;
- /* Is the diff handling reversed? (add<->delete) */
- svn_boolean_t reversed;
-
/* The summarize callback baton */
void *summarize_func_baton;
-
- /* Which paths have a prop change. Key is a (const char *) path; the value
- * is any non-null pointer to indicate that this path has a prop change. */
- apr_hash_t *prop_changes;
};
-
/* Call B->summarize_func with B->summarize_func_baton, passing it a
* summary object composed from PATH (but made to be relative to the target
* of the diff), SUMMARIZE_KIND, PROP_CHANGED (or FALSE if the action is an
@@ -68,24 +65,9 @@ send_summary(struct summarize_baton_t *b,
SVN_ERR_ASSERT(summarize_kind != svn_client_diff_summarize_kind_normal
|| prop_changed);
- if (b->reversed)
- {
- switch(summarize_kind)
- {
- case svn_client_diff_summarize_kind_added:
- summarize_kind = svn_client_diff_summarize_kind_deleted;
- break;
- case svn_client_diff_summarize_kind_deleted:
- summarize_kind = svn_client_diff_summarize_kind_added;
- break;
- default:
- break;
- }
- }
-
/* PATH is relative to the anchor of the diff, but SUM->path needs to be
relative to the target of the diff. */
- sum->path = svn_relpath_skip_ancestor(b->target, path);
+ sum->path = svn_relpath_skip_ancestor(b->skip_relpath, path);
sum->summarize_kind = summarize_kind;
if (summarize_kind == svn_client_diff_summarize_kind_modified
|| summarize_kind == svn_client_diff_summarize_kind_normal)
@@ -96,6 +78,29 @@ send_summary(struct summarize_baton_t *b,
return SVN_NO_ERROR;
}
+/* Are there any changes to relevant (normal) props in PROPS? */
+static svn_boolean_t
+props_changed_hash(apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_index_t *hi;
+
+ if (!props)
+ return FALSE;
+
+ for (hi = apr_hash_first(scratch_pool, props); hi; hi = apr_hash_next(hi))
+ {
+ const char *name = apr_hash_this_key(hi);
+
+ if (svn_property_kind2(name) == svn_prop_regular_kind)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
/* Are there any changes to relevant (normal) props in PROPCHANGES? */
static svn_boolean_t
props_changed(const apr_array_header_t *propchanges,
@@ -108,210 +113,201 @@ props_changed(const apr_array_header_t *propchanges,
return (props->nelts != 0);
}
-
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_dir_deleted(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- const char *path,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_opened(void **new_dir_baton,
+ svn_boolean_t *skip,
+ svn_boolean_t *skip_children,
+ const char *relpath,
+ const svn_diff_source_t *left_source,
+ const svn_diff_source_t *right_source,
+ const svn_diff_source_t *copyfrom_source,
+ void *parent_dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- struct summarize_baton_t *b = diff_baton;
+ /* struct summarize_baton_t *b = processor->baton; */
- SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_deleted,
- FALSE, svn_node_dir, scratch_pool));
+ /* ### Send here instead of from dir_added() ? */
+ /*if (!left_source)
+ {
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_added,
+ FALSE, svn_node_dir, scratch_pool));
+ }*/
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_file_deleted(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- const char *path,
- const char *tmpfile1,
- const char *tmpfile2,
- const char *mimetype1,
- const char *mimetype2,
- apr_hash_t *originalprops,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_changed(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const svn_diff_source_t *right_source,
+ /*const*/ apr_hash_t *left_props,
+ /*const*/ apr_hash_t *right_props,
+ const apr_array_header_t *prop_changes,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- struct summarize_baton_t *b = diff_baton;
+ struct summarize_baton_t *b = processor->baton;
- SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_deleted,
- FALSE, svn_node_file, scratch_pool));
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_normal,
+ TRUE, svn_node_dir, scratch_pool));
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_dir_added(svn_wc_notify_state_t *state,
- svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- svn_boolean_t *skip_children,
- const char *path,
- svn_revnum_t rev,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_revision,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_added(const char *relpath,
+ const svn_diff_source_t *copyfrom_source,
+ const svn_diff_source_t *right_source,
+ /*const*/ apr_hash_t *copyfrom_props,
+ /*const*/ apr_hash_t *right_props,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- return SVN_NO_ERROR;
-}
+ struct summarize_baton_t *b = processor->baton;
+
+ /* ### Send from dir_opened without prop info? */
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_added,
+ props_changed_hash(right_props, scratch_pool),
+ svn_node_dir, scratch_pool));
-static svn_error_t *
-cb_dir_opened(svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- svn_boolean_t *skip_children,
- const char *path,
- svn_revnum_t rev,
- void *diff_baton,
- apr_pool_t *scratch_pool)
-{
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_dir_closed(svn_wc_notify_state_t *contentstate,
- svn_wc_notify_state_t *propstate,
- svn_boolean_t *tree_conflicted,
- const char *path,
- svn_boolean_t dir_was_added,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_dir_deleted(const char *relpath,
+ const svn_diff_source_t *left_source,
+ /*const*/ apr_hash_t *left_props,
+ void *dir_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- struct summarize_baton_t *b = diff_baton;
- svn_boolean_t prop_change;
+ struct summarize_baton_t *b = processor->baton;
- if (! svn_relpath_skip_ancestor(b->target, path))
- return SVN_NO_ERROR;
-
- prop_change = svn_hash_gets(b->prop_changes, path) != NULL;
- if (dir_was_added || prop_change)
- SVN_ERR(send_summary(b, path,
- dir_was_added ? svn_client_diff_summarize_kind_added
- : svn_client_diff_summarize_kind_normal,
- prop_change, svn_node_dir, scratch_pool));
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_deleted,
+ FALSE, svn_node_dir, scratch_pool));
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_file_added(svn_wc_notify_state_t *contentstate,
- svn_wc_notify_state_t *propstate,
- svn_boolean_t *tree_conflicted,
- const char *path,
- const char *tmpfile1,
- const char *tmpfile2,
- svn_revnum_t rev1,
- svn_revnum_t rev2,
- const char *mimetype1,
- const char *mimetype2,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_revision,
- const apr_array_header_t *propchanges,
- apr_hash_t *originalprops,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_file_added(const char *relpath,
+ const svn_diff_source_t *copyfrom_source,
+ const svn_diff_source_t *right_source,
+ const char *copyfrom_file,
+ const char *right_file,
+ /*const*/ apr_hash_t *copyfrom_props,
+ /*const*/ apr_hash_t *right_props,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- struct summarize_baton_t *b = diff_baton;
+ struct summarize_baton_t *b = processor->baton;
- SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_added,
- props_changed(propchanges, scratch_pool),
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_added,
+ props_changed_hash(right_props, scratch_pool),
svn_node_file, scratch_pool));
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_file_opened(svn_boolean_t *tree_conflicted,
- svn_boolean_t *skip,
- const char *path,
- svn_revnum_t rev,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_file_changed(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const svn_diff_source_t *right_source,
+ const char *left_file,
+ const char *right_file,
+ /*const*/ apr_hash_t *left_props,
+ /*const*/ apr_hash_t *right_props,
+ svn_boolean_t file_modified,
+ const apr_array_header_t *prop_changes,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- return SVN_NO_ERROR;
-}
+ struct summarize_baton_t *b = processor->baton;
-static svn_error_t *
-cb_file_changed(svn_wc_notify_state_t *contentstate,
- svn_wc_notify_state_t *propstate,
- svn_boolean_t *tree_conflicted,
- const char *path,
- const char *tmpfile1,
- const char *tmpfile2,
- svn_revnum_t rev1,
- svn_revnum_t rev2,
- const char *mimetype1,
- const char *mimetype2,
- const apr_array_header_t *propchanges,
- apr_hash_t *originalprops,
- void *diff_baton,
- apr_pool_t *scratch_pool)
-{
- struct summarize_baton_t *b = diff_baton;
- svn_boolean_t text_change = (tmpfile2 != NULL);
- svn_boolean_t prop_change = props_changed(propchanges, scratch_pool);
-
- if (text_change || prop_change)
- SVN_ERR(send_summary(b, path,
- text_change ? svn_client_diff_summarize_kind_modified
+ SVN_ERR(send_summary(b, relpath,
+ file_modified ? svn_client_diff_summarize_kind_modified
: svn_client_diff_summarize_kind_normal,
- prop_change, svn_node_file, scratch_pool));
+ props_changed(prop_changes, scratch_pool),
+ svn_node_file, scratch_pool));
return SVN_NO_ERROR;
}
+/* svn_diff_tree_processor_t callback */
static svn_error_t *
-cb_dir_props_changed(svn_wc_notify_state_t *propstate,
- svn_boolean_t *tree_conflicted,
- const char *path,
- svn_boolean_t dir_was_added,
- const apr_array_header_t *propchanges,
- apr_hash_t *original_props,
- void *diff_baton,
- apr_pool_t *scratch_pool)
+diff_file_deleted(const char *relpath,
+ const svn_diff_source_t *left_source,
+ const char *left_file,
+ /*const*/ apr_hash_t *left_props,
+ void *file_baton,
+ const struct svn_diff_tree_processor_t *processor,
+ apr_pool_t *scratch_pool)
{
- struct summarize_baton_t *b = diff_baton;
+ struct summarize_baton_t *b = processor->baton;
- if (props_changed(propchanges, scratch_pool))
- svn_hash_sets(b->prop_changes, path, path);
+ SVN_ERR(send_summary(b, relpath, svn_client_diff_summarize_kind_deleted,
+ FALSE, svn_node_file, scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_client__get_diff_summarize_callbacks(
- svn_wc_diff_callbacks4_t **callbacks,
- void **callback_baton,
- const char *target,
- svn_boolean_t reversed,
+ const svn_diff_tree_processor_t **diff_processor,
+ const char ***p_root_relpath,
svn_client_diff_summarize_func_t summarize_func,
void *summarize_baton,
- apr_pool_t *pool)
+ const char *original_target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- svn_wc_diff_callbacks4_t *cb = apr_palloc(pool, sizeof(*cb));
- struct summarize_baton_t *b = apr_palloc(pool, sizeof(*b));
+ svn_diff_tree_processor_t *dp;
+ struct summarize_baton_t *b = apr_pcalloc(result_pool, sizeof(*b));
- b->target = target;
+ b->baton_pool = result_pool;
b->summarize_func = summarize_func;
b->summarize_func_baton = summarize_baton;
- b->prop_changes = apr_hash_make(pool);
- b->reversed = reversed;
-
- cb->file_opened = cb_file_opened;
- cb->file_changed = cb_file_changed;
- cb->file_added = cb_file_added;
- cb->file_deleted = cb_file_deleted;
- cb->dir_deleted = cb_dir_deleted;
- cb->dir_opened = cb_dir_opened;
- cb->dir_added = cb_dir_added;
- cb->dir_props_changed = cb_dir_props_changed;
- cb->dir_closed = cb_dir_closed;
-
- *callbacks = cb;
- *callback_baton = b;
+
+ dp = svn_diff__tree_processor_create(b, result_pool);
+
+ /*dp->file_opened = diff_file_opened;*/
+ dp->file_added = diff_file_added;
+ dp->file_deleted = diff_file_deleted;
+ dp->file_changed = diff_file_changed;
+
+ dp->dir_opened = diff_dir_opened;
+ dp->dir_changed = diff_dir_changed;
+ dp->dir_deleted = diff_dir_deleted;
+ dp->dir_added = diff_dir_added;
+
+ *diff_processor = dp;
+ *p_root_relpath = &b->skip_relpath;
return SVN_NO_ERROR;
}
+
+svn_client_diff_summarize_t *
+svn_client_diff_summarize_dup(const svn_client_diff_summarize_t *diff,
+ apr_pool_t *pool)
+{
+ svn_client_diff_summarize_t *dup_diff = apr_palloc(pool, sizeof(*dup_diff));
+
+ *dup_diff = *diff;
+
+ if (diff->path)
+ dup_diff->path = apr_pstrdup(pool, diff->path);
+
+ return dup_diff;
+}
diff --git a/subversion/libsvn_client/export.c b/subversion/libsvn_client/export.c
index c14a5f0..63cd87a 100644
--- a/subversion/libsvn_client/export.c
+++ b/subversion/libsvn_client/export.c
@@ -1274,8 +1274,8 @@ export_file(const char *from_path_or_url,
* with information. */
for (hi = apr_hash_first(scratch_pool, props); hi; hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- const svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ const svn_string_t *propval = apr_hash_this_val(hi);
SVN_ERR(change_file_prop(fb, propname, propval, scratch_pool));
}
@@ -1542,7 +1542,7 @@ svn_client_export5(svn_revnum_t *result_rev,
hi;
hi = apr_hash_next(hi))
{
- const char *external_abspath = svn__apr_hash_index_key(hi);
+ const char *external_abspath = apr_hash_this_key(hi);
const char *relpath;
const char *target_abspath;
@@ -1581,7 +1581,7 @@ svn_client_export5(svn_revnum_t *result_rev,
= svn_wc_create_notify(to_path,
svn_wc_notify_update_completed, pool);
notify->revision = edit_revision;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
if (result_rev)
diff --git a/subversion/libsvn_client/externals.c b/subversion/libsvn_client/externals.c
index 52c236c..851b260 100644
--- a/subversion/libsvn_client/externals.c
+++ b/subversion/libsvn_client/externals.c
@@ -151,6 +151,7 @@ switch_dir_external(const char *local_abspath,
const svn_opt_revision_t *revision,
const char *defining_abspath,
svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
@@ -170,7 +171,7 @@ switch_dir_external(const char *local_abspath,
if (revision->kind == svn_opt_revision_number)
external_rev = revision->value.number;
- /*
+ /*
* The code below assumes existing versioned paths are *not* part of
* the external's defining working copy.
* The working copy library does not support registering externals
@@ -186,7 +187,6 @@ switch_dir_external(const char *local_abspath,
&repos_root_url, &repos_uuid,
NULL, ctx->wc_ctx, local_abspath,
TRUE, /* ignore_enoent */
- TRUE, /* show hidden */
pool, pool));
if (kind != svn_node_unknown)
{
@@ -231,17 +231,53 @@ switch_dir_external(const char *local_abspath,
if (node_url)
{
+ svn_boolean_t is_wcroot;
+
+ SVN_ERR(svn_wc__is_wcroot(&is_wcroot, ctx->wc_ctx, local_abspath,
+ pool));
+
+ if (! is_wcroot)
+ {
+ /* This can't be a directory external! */
+
+ err = svn_wc__external_remove(ctx->wc_ctx, defining_abspath,
+ local_abspath,
+ TRUE /* declaration_only */,
+ ctx->cancel_func, ctx->cancel_baton,
+ pool);
+
+ if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ {
+ /* New external... No problem that we can't remove it */
+ svn_error_clear(err);
+ err = NULL;
+ }
+ else if (err)
+ return svn_error_trace(err);
+
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("The external '%s' defined in %s at '%s' "
+ "cannot be checked out because '%s' is "
+ "already a versioned path."),
+ url_from_externals_definition,
+ SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(defining_abspath,
+ pool),
+ svn_dirent_local_style(local_abspath,
+ pool));
+ }
+
/* If we have what appears to be a version controlled
subdir, and its top-level URL matches that of our
externals definition, perform an update. */
if (strcmp(node_url, url) == 0)
{
- SVN_ERR(svn_client__update_internal(NULL, local_abspath,
+ SVN_ERR(svn_client__update_internal(NULL, timestamp_sleep,
+ local_abspath,
revision, svn_depth_unknown,
FALSE, FALSE, FALSE, TRUE,
FALSE, TRUE,
- timestamp_sleep,
- ctx, subpool));
+ ra_session, ctx, subpool));
/* We just decided that this existing directory is an external,
so update the external registry with this information, like
@@ -372,9 +408,11 @@ switch_dir_external(const char *local_abspath,
}
/* ... Hello, new hotness. */
- SVN_ERR(svn_client__checkout_internal(NULL, url, local_abspath, peg_revision,
+ SVN_ERR(svn_client__checkout_internal(NULL, timestamp_sleep,
+ url, local_abspath, peg_revision,
revision, svn_depth_infinity,
- FALSE, FALSE, timestamp_sleep,
+ FALSE, FALSE,
+ ra_session,
ctx, pool));
SVN_ERR(svn_wc__node_get_repos_info(NULL, NULL,
@@ -401,14 +439,15 @@ switch_dir_external(const char *local_abspath,
return SVN_NO_ERROR;
}
-/* Try to update a file external at LOCAL_ABSPATH to URL at REVISION using a
- access baton that has a write lock. Use SCRATCH_POOL for temporary
+/* Try to update a file external at LOCAL_ABSPATH to SWITCH_LOC. This function
+ assumes caller has a write lock in CTX. Use SCRATCH_POOL for temporary
allocations, and use the client context CTX. */
static svn_error_t *
switch_file_external(const char *local_abspath,
- const char *url,
- const svn_opt_revision_t *peg_revision,
- const svn_opt_revision_t *revision,
+ const svn_client__pathrev_t *switch_loc,
+ const char *record_url,
+ const svn_opt_revision_t *record_peg_revision,
+ const svn_opt_revision_t *record_revision,
const char *def_dir_abspath,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
@@ -485,7 +524,8 @@ switch_file_external(const char *local_abspath,
SVN_ERR_CLIENT_FILE_EXTERNAL_OVERWRITE_VERSIONED, 0,
_("The file external from '%s' cannot overwrite the existing "
"versioned item at '%s'"),
- url, svn_dirent_local_style(local_abspath, scratch_pool));
+ switch_loc->url,
+ svn_dirent_local_style(local_abspath, scratch_pool));
}
}
else
@@ -507,28 +547,17 @@ switch_file_external(const char *local_abspath,
void *report_baton;
const svn_delta_editor_t *switch_editor;
void *switch_baton;
- svn_client__pathrev_t *switch_loc;
svn_revnum_t revnum;
apr_array_header_t *inherited_props;
- const char *dir_abspath;
- const char *target;
-
- svn_dirent_split(&dir_abspath, &target, local_abspath, scratch_pool);
-
- /* ### Why do we open a new session? RA_SESSION is a valid
- ### session -- the caller used it to call svn_ra_check_path on
- ### this very URL, the caller also did the resolving and
- ### reparenting that is repeated here. */
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &switch_loc,
- url, dir_abspath,
- peg_revision, revision,
- ctx, scratch_pool));
+ const char *target = svn_dirent_basename(local_abspath, scratch_pool);
+
/* Get the external file's iprops. */
SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, "",
switch_loc->rev,
scratch_pool, scratch_pool));
- SVN_ERR(svn_ra_reparent(ra_session, svn_uri_dirname(url, scratch_pool),
+ SVN_ERR(svn_ra_reparent(ra_session,
+ svn_uri_dirname(switch_loc->url, scratch_pool),
scratch_pool));
SVN_ERR(svn_wc__get_file_external_editor(&switch_editor, &switch_baton,
@@ -542,9 +571,9 @@ switch_file_external(const char *local_abspath,
use_commit_times,
diff3_cmd, preserved_exts,
def_dir_abspath,
- url, peg_revision, revision,
- ctx->conflict_func2,
- ctx->conflict_baton2,
+ record_url,
+ record_peg_revision,
+ record_revision,
ctx->cancel_func,
ctx->cancel_baton,
ctx->notify_func2,
@@ -578,7 +607,7 @@ switch_file_external(const char *local_abspath,
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
notify->revision = revnum;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, scratch_pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
}
@@ -691,7 +720,7 @@ handle_external_item_removal(const svn_client_ctx_t *ctx,
notify->kind = kind;
notify->err = err;
- (ctx->notify_func2)(ctx->notify_baton2, notify, scratch_pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
if (err && err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD)
{
@@ -701,7 +730,7 @@ handle_external_item_removal(const svn_client_ctx_t *ctx,
notify->kind = svn_node_dir;
notify->err = err;
- (ctx->notify_func2)(ctx->notify_baton2, notify, scratch_pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
}
@@ -722,10 +751,10 @@ handle_external_item_change(svn_client_ctx_t *ctx,
const char *local_abspath,
const char *old_defining_abspath,
const svn_wc_external_item2_t *new_item,
+ svn_ra_session_t *ra_session,
svn_boolean_t *timestamp_sleep,
apr_pool_t *scratch_pool)
{
- svn_ra_session_t *ra_session;
svn_client__pathrev_t *new_loc;
const char *new_url;
svn_node_kind_t ext_kind;
@@ -746,12 +775,39 @@ handle_external_item_change(svn_client_ctx_t *ctx,
scratch_pool, scratch_pool));
/* Determine if the external is a file or directory. */
- /* Get the RA connection. */
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &new_loc,
- new_url, NULL,
- &(new_item->peg_revision),
- &(new_item->revision), ctx,
- scratch_pool));
+ /* Get the RA connection, if needed. */
+ if (ra_session)
+ {
+ svn_error_t *err = svn_ra_reparent(ra_session, new_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(&new_loc,
+ ra_session, new_url,
+ &(new_item->peg_revision),
+ &(new_item->revision), ctx,
+ scratch_pool));
+
+ SVN_ERR(svn_ra_reparent(ra_session, new_loc->url, scratch_pool));
+ }
+ }
+
+ if (!ra_session)
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &new_loc,
+ new_url, NULL,
+ &(new_item->peg_revision),
+ &(new_item->revision), ctx,
+ scratch_pool));
SVN_ERR(svn_ra_check_path(ra_session, "", new_loc->rev, &ext_kind,
scratch_pool));
@@ -775,7 +831,7 @@ handle_external_item_change(svn_client_ctx_t *ctx,
/* First notify that we're about to handle an external. */
if (ctx->notify_func2)
{
- (*ctx->notify_func2)(
+ ctx->notify_func2(
ctx->notify_baton2,
svn_wc_create_notify(local_abspath,
svn_wc_notify_update_external,
@@ -800,7 +856,7 @@ handle_external_item_change(svn_client_ctx_t *ctx,
&(new_item->peg_revision),
&(new_item->revision),
parent_dir_abspath,
- timestamp_sleep, ctx,
+ timestamp_sleep, ra_session, ctx,
scratch_pool));
break;
case svn_node_file:
@@ -858,6 +914,7 @@ handle_external_item_change(svn_client_ctx_t *ctx,
}
SVN_ERR(switch_file_external(local_abspath,
+ new_loc,
new_url,
&new_item->peg_revision,
&new_item->revision,
@@ -908,6 +965,7 @@ handle_externals_change(svn_client_ctx_t *ctx,
apr_hash_t *old_externals,
svn_depth_t ambient_depth,
svn_depth_t requested_depth,
+ svn_ra_session_t *ra_session,
apr_pool_t *scratch_pool)
{
apr_array_header_t *new_desc;
@@ -976,7 +1034,7 @@ handle_externals_change(svn_client_ctx_t *ctx,
local_abspath, url,
target_abspath,
old_defining_abspath,
- new_item,
+ new_item, ra_session,
timestamp_sleep,
iterpool),
iterpool));
@@ -999,6 +1057,7 @@ svn_client__handle_externals(apr_hash_t *externals_new,
const char *target_abspath,
svn_depth_t requested_depth,
svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
@@ -1018,8 +1077,8 @@ svn_client__handle_externals(apr_hash_t *externals_new,
hi;
hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
- const char *desc_text = svn__apr_hash_index_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
+ const char *desc_text = apr_hash_this_val(hi);
svn_depth_t ambient_depth = svn_depth_infinity;
svn_pool_clear(iterpool);
@@ -1029,7 +1088,7 @@ svn_client__handle_externals(apr_hash_t *externals_new,
const char *ambient_depth_w;
ambient_depth_w = apr_hash_get(ambient_depths, local_abspath,
- svn__apr_hash_index_klen(hi));
+ apr_hash_this_key_len(hi));
if (ambient_depth_w == NULL)
{
@@ -1048,7 +1107,7 @@ svn_client__handle_externals(apr_hash_t *externals_new,
local_abspath,
desc_text, old_external_defs,
ambient_depth, requested_depth,
- iterpool));
+ ra_session, iterpool));
}
/* Remove the remaining externals */
@@ -1056,8 +1115,8 @@ svn_client__handle_externals(apr_hash_t *externals_new,
hi;
hi = apr_hash_next(hi))
{
- const char *item_abspath = svn__apr_hash_index_key(hi);
- const char *defining_abspath = svn__apr_hash_index_val(hi);
+ const char *item_abspath = apr_hash_this_key(hi);
+ const char *defining_abspath = apr_hash_this_val(hi);
const char *parent_abspath;
svn_pool_clear(iterpool);
@@ -1131,8 +1190,8 @@ svn_client__export_externals(apr_hash_t *externals,
hi;
hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
- const char *desc_text = svn__apr_hash_index_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
+ const char *desc_text = apr_hash_this_val(hi);
const char *local_relpath;
const char *dir_url;
apr_array_header_t *items;
@@ -1188,6 +1247,17 @@ svn_client__export_externals(apr_hash_t *externals,
sub_iterpool),
sub_iterpool));
+ /* First notify that we're about to handle an external. */
+ if (ctx->notify_func2)
+ {
+ ctx->notify_func2(
+ ctx->notify_baton2,
+ svn_wc_create_notify(item_abspath,
+ svn_wc_notify_update_external,
+ sub_iterpool),
+ sub_iterpool);
+ }
+
SVN_ERR(wrap_external_error(
ctx, item_abspath,
svn_client_export5(NULL, new_url, item_abspath,
diff --git a/subversion/libsvn_client/import.c b/subversion/libsvn_client/import.c
index 43e0d79..b5ee077 100644
--- a/subversion/libsvn_client/import.c
+++ b/subversion/libsvn_client/import.c
@@ -47,25 +47,15 @@
#include "svn_props.h"
#include "client.h"
-#include "private/svn_subr_private.h"
#include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
#include "private/svn_magic.h"
#include "svn_private_config.h"
-/* Import context baton.
-
- ### TODO: Add the following items to this baton:
- /` import editor/baton. `/
- const svn_delta_editor_t *editor;
- void *edit_baton;
+/* Import context baton. */
- /` Client context baton `/
- svn_client_ctx_t `ctx;
-
- /` Paths (keys) excluded from the import (values ignored) `/
- apr_hash_t *excludes;
-*/
typedef struct import_ctx_t
{
/* Whether any changes were made to the repository */
@@ -238,8 +228,8 @@ import_file(const svn_delta_editor_t *editor,
{
for (hi = apr_hash_first(pool, properties); hi; hi = apr_hash_next(hi))
{
- const char *pname = svn__apr_hash_index_key(hi);
- const svn_string_t *pval = svn__apr_hash_index_val(hi);
+ const char *pname = apr_hash_this_key(hi);
+ const svn_string_t *pval = apr_hash_this_val(hi);
SVN_ERR(editor->change_file_prop(file_baton, pname, pval, pool));
}
@@ -255,7 +245,7 @@ import_file(const svn_delta_editor_t *editor,
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
/* If this is a special file, we need to set the svn:special
@@ -279,7 +269,7 @@ import_file(const svn_delta_editor_t *editor,
text_checksum =
svn_checksum_to_cstring(svn_checksum__from_digest_md5(digest, pool), pool);
- return editor->close_file(file_baton, text_checksum, pool);
+ return svn_error_trace(editor->close_file(file_baton, text_checksum, pool));
}
@@ -312,8 +302,8 @@ get_filtered_children(apr_hash_t **children,
for (hi = apr_hash_first(scratch_pool, dirents); hi; hi = apr_hash_next(hi))
{
- const char *base_name = svn__apr_hash_index_key(hi);
- const svn_io_dirent2_t *dirent = svn__apr_hash_index_val(hi);
+ const char *base_name = apr_hash_this_key(hi);
+ const svn_io_dirent2_t *dirent = apr_hash_this_val(hi);
const char *local_abspath;
svn_pool_clear(iterpool);
@@ -338,7 +328,7 @@ get_filtered_children(apr_hash_t **children,
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, iterpool);
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
}
svn_hash_sets(dirents, base_name, NULL);
@@ -480,7 +470,7 @@ import_children(const char *dir_abspath,
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, iterpool);
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
}
}
else
@@ -569,7 +559,7 @@ import_dir(const svn_delta_editor_t *editor,
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
}
@@ -590,9 +580,15 @@ import_dir(const svn_delta_editor_t *editor,
/* Recursively import PATH to a repository using EDITOR and
* EDIT_BATON. PATH can be a file or directory.
*
+ * Sets *UPDATED_REPOSITORY to TRUE when the repository was modified by
+ * a successfull commit, otherwise to FALSE.
+ *
* DEPTH is the depth at which to import PATH; it behaves as for
* svn_client_import4().
*
+ * BASE_REV is the revision to use for the root of the commit. We
+ * checked the preconditions against this revision.
+ *
* NEW_ENTRIES is an ordered array of path components that must be
* created in the repository (where the ordering direction is
* parent-to-child). If PATH is a directory, NEW_ENTRIES may be empty
@@ -636,11 +632,14 @@ import_dir(const svn_delta_editor_t *editor,
* not necessarily the root.)
*/
static svn_error_t *
-import(const char *local_abspath,
+import(svn_boolean_t *updated_repository,
+ const char *local_abspath,
+ const char *url,
const apr_array_header_t *new_entries,
const svn_delta_editor_t *editor,
void *edit_baton,
svn_depth_t depth,
+ svn_revnum_t base_rev,
apr_hash_t *excludes,
apr_hash_t *autoprops,
apr_array_header_t *local_ignores,
@@ -656,17 +655,17 @@ import(const char *local_abspath,
void *root_baton;
apr_array_header_t *batons = NULL;
const char *edit_path = "";
- import_ctx_t *import_ctx = apr_pcalloc(pool, sizeof(*import_ctx));
+ import_ctx_t import_ctx = { FALSE };
const svn_io_dirent2_t *dirent;
- import_ctx->autoprops = autoprops;
- svn_magic__init(&import_ctx->magic_cookie, pool);
+ *updated_repository = FALSE;
- /* Get a root dir baton. We pass an invalid revnum to open_root
- to mean "base this on the youngest revision". Should we have an
- SVN_YOUNGEST_REVNUM defined for these purposes? */
- SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
- pool, &root_baton));
+ import_ctx.autoprops = autoprops;
+ SVN_ERR(svn_magic__init(&import_ctx.magic_cookie, ctx->config, pool));
+
+ /* Get a root dir baton. We pass the revnum we used for testing our
+ assumptions and obtaining inherited properties. */
+ SVN_ERR(editor->open_root(edit_baton, base_rev, pool, &root_baton));
/* Import a file or a directory tree. */
SVN_ERR(svn_io_stat_dirent2(&dirent, local_abspath, FALSE, FALSE,
@@ -697,7 +696,7 @@ import(const char *local_abspath,
pool, &root_baton));
/* Remember that the repository was modified */
- import_ctx->repos_changed = TRUE;
+ import_ctx.repos_changed = TRUE;
}
}
else if (dirent->kind == svn_node_file)
@@ -728,7 +727,7 @@ import(const char *local_abspath,
if (!ignores_match)
SVN_ERR(import_file(editor, root_baton, local_abspath, edit_path,
- dirent, import_ctx, ctx, pool));
+ dirent, &import_ctx, ctx, pool));
}
else if (dirent->kind == svn_node_dir)
{
@@ -748,7 +747,7 @@ import(const char *local_abspath,
root_baton, depth, excludes, global_ignores,
no_ignore, no_autoprops,
ignore_unknown_node_types, filter_callback,
- filter_baton, import_ctx, ctx, pool));
+ filter_baton, &import_ctx, ctx, pool));
}
else if (dirent->kind == svn_node_none
@@ -770,10 +769,23 @@ import(const char *local_abspath,
}
}
- if (import_ctx->repos_changed)
- return editor->close_edit(edit_baton, pool);
- else
- return editor->abort_edit(edit_baton, pool);
+ if (import_ctx.repos_changed)
+ {
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(url,
+ svn_wc_notify_commit_finalizing,
+ pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
+ }
+
+ SVN_ERR(editor->close_edit(edit_baton, pool));
+
+ *updated_repository = TRUE;
+ }
+
+ return SVN_NO_ERROR;
}
@@ -809,6 +821,10 @@ svn_client_import5(const char *path,
apr_hash_t *autoprops = NULL;
apr_array_header_t *global_ignores;
apr_array_header_t *local_ignores_arr;
+ svn_revnum_t base_rev;
+ apr_array_header_t *inherited_props = NULL;
+ apr_hash_t *url_props = NULL;
+ svn_boolean_t updated_repository;
if (svn_path_is_url(path))
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
@@ -816,6 +832,8 @@ svn_client_import5(const char *path,
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
+ SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
+
/* Create a new commit item and add it to the array. */
if (SVN_CLIENT__HAS_LOG_MSG_FUNC(ctx))
{
@@ -828,7 +846,9 @@ svn_client_import5(const char *path,
= apr_array_make(scratch_pool, 1, sizeof(item));
item = svn_client_commit_item3_create(scratch_pool);
- item->path = apr_pstrdup(scratch_pool, path);
+ item->path = local_abspath;
+ item->url = url;
+ item->kind = kind;
item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
@@ -844,15 +864,14 @@ svn_client_import5(const char *path,
}
}
- SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
-
SVN_ERR(svn_client_open_ra_session2(&ra_session, url, NULL,
ctx, scratch_pool, iterpool));
+ SVN_ERR(svn_ra_get_latest_revnum(ra_session, &base_rev, iterpool));
+
/* Figure out all the path components we need to create just to have
a place to stick our imported tree. */
- SVN_ERR(svn_ra_check_path(ra_session, "", SVN_INVALID_REVNUM, &kind,
- iterpool));
+ SVN_ERR(svn_ra_check_path(ra_session, "", base_rev, &kind, iterpool));
/* We can import into directories, but if a file already exists, that's
an error. */
@@ -871,8 +890,7 @@ svn_client_import5(const char *path,
APR_ARRAY_PUSH(new_entries, const char *) = dir;
SVN_ERR(svn_ra_reparent(ra_session, url, iterpool));
- SVN_ERR(svn_ra_check_path(ra_session, "", SVN_INVALID_REVNUM, &kind,
- iterpool));
+ SVN_ERR(svn_ra_check_path(ra_session, "", base_rev, &kind, iterpool));
}
/* Reverse the order of the components we added to our NEW_ENTRIES array. */
@@ -895,6 +913,17 @@ svn_client_import5(const char *path,
SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
log_msg, ctx, scratch_pool));
+ /* Obtain properties before opening the commit editor, as at that point we are
+ not allowed to use the existing ra-session */
+ if (! no_ignore /*|| ! no_autoprops*/)
+ {
+ SVN_ERR(svn_ra_get_dir2(ra_session, NULL, NULL, &url_props, "",
+ base_rev, SVN_DIRENT_KIND, scratch_pool));
+
+ SVN_ERR(svn_ra_get_inherited_props(ra_session, &inherited_props, "", base_rev,
+ scratch_pool, iterpool));
+ }
+
/* Fetch RA commit editor. */
SVN_ERR(svn_ra__register_editor_shim_callbacks(ra_session,
svn_client__get_shim_callbacks(ctx->wc_ctx,
@@ -907,8 +936,13 @@ svn_client_import5(const char *path,
/* Get inherited svn:auto-props, svn:global-ignores, and
svn:ignores for the location we are importing to. */
if (!no_autoprops)
- SVN_ERR(svn_client__get_all_auto_props(&autoprops, url, ctx,
- scratch_pool, iterpool));
+ {
+ /* ### This should use inherited_props and url_props to avoid creating
+ another ra session to obtain the same values, but using a possibly
+ different HEAD revision */
+ SVN_ERR(svn_client__get_all_auto_props(&autoprops, url, ctx,
+ scratch_pool, iterpool));
+ }
if (no_ignore)
{
global_ignores = NULL;
@@ -916,49 +950,62 @@ svn_client_import5(const char *path,
}
else
{
- svn_opt_revision_t rev;
apr_array_header_t *config_ignores;
- apr_hash_t *local_ignores_hash;
+ svn_string_t *val;
+ int i;
+
+ global_ignores = apr_array_make(scratch_pool, 64, sizeof(const char *));
- SVN_ERR(svn_client__get_inherited_ignores(&global_ignores, url, ctx,
- scratch_pool, iterpool));
SVN_ERR(svn_wc_get_default_ignores(&config_ignores, ctx->config,
scratch_pool));
global_ignores = apr_array_append(scratch_pool, global_ignores,
config_ignores);
- rev.kind = svn_opt_revision_head;
- SVN_ERR(svn_client_propget5(&local_ignores_hash, NULL, SVN_PROP_IGNORE, url,
- &rev, &rev, NULL, svn_depth_empty, NULL, ctx,
- scratch_pool, scratch_pool));
+ val = svn_hash_gets(url_props, SVN_PROP_INHERITABLE_IGNORES);
+ if (val)
+ svn_cstring_split_append(global_ignores, val->data, "\n\r\t\v ",
+ FALSE, scratch_pool);
+
+ for (i = 0; i < inherited_props->nelts; i++)
+ {
+ svn_prop_inherited_item_t *elt = APR_ARRAY_IDX(
+ inherited_props, i, svn_prop_inherited_item_t *);
+
+ val = svn_hash_gets(elt->prop_hash, SVN_PROP_INHERITABLE_IGNORES);
+
+ if (val)
+ svn_cstring_split_append(global_ignores, val->data, "\n\r\t\v ",
+ FALSE, scratch_pool);
+ }
local_ignores_arr = apr_array_make(scratch_pool, 1, sizeof(const char *));
- if (apr_hash_count(local_ignores_hash))
+ val = svn_hash_gets(url_props, SVN_PROP_IGNORE);
+
+ if (val)
{
- svn_string_t *propval = svn_hash_gets(local_ignores_hash, url);
- if (propval)
- {
- svn_cstring_split_append(local_ignores_arr, propval->data,
- "\n\r\t\v ", FALSE, scratch_pool);
- }
+ svn_cstring_split_append(local_ignores_arr, val->data,
+ "\n\r\t\v ", FALSE, scratch_pool);
}
}
- /* If an error occurred during the commit, abort the edit and return
- the error. We don't even care if the abort itself fails. */
- if ((err = import(local_abspath, new_entries, editor, edit_baton,
- depth, excludes, autoprops, local_ignores_arr,
- global_ignores, no_ignore, no_autoprops,
- ignore_unknown_node_types, filter_callback,
- filter_baton, ctx, iterpool)))
+ /* If an error occurred during the commit, properly abort the edit. */
+ err = svn_error_trace(import(&updated_repository,
+ local_abspath, url, new_entries, editor,
+ edit_baton, depth, base_rev, excludes,
+ autoprops, local_ignores_arr, global_ignores,
+ no_ignore, no_autoprops,
+ ignore_unknown_node_types, filter_callback,
+ filter_baton, ctx, iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ if (err || !updated_repository)
{
return svn_error_compose_create(
err,
- editor->abort_edit(edit_baton, iterpool));
+ editor->abort_edit(edit_baton, scratch_pool));
}
- svn_pool_destroy(iterpool);
-
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/info.c b/subversion/libsvn_client/info.c
index f49f22e..39b5eb1 100644
--- a/subversion/libsvn_client/info.c
+++ b/subversion/libsvn_client/info.c
@@ -27,14 +27,16 @@
#include "client.h"
#include "svn_client.h"
-#include "svn_pools.h"
#include "svn_dirent_uri.h"
-#include "svn_path.h"
#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
#include "svn_wc.h"
#include "svn_private_config.h"
#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_wc_private.h"
@@ -59,6 +61,78 @@ svn_client_info2_dup(const svn_client_info2_t *info,
return new_info;
}
+/* Handle externals for svn_client_info4() */
+
+static svn_error_t *
+do_external_info(apr_hash_t *external_map,
+ svn_depth_t depth,
+ svn_boolean_t fetch_excluded,
+ svn_boolean_t fetch_actual_only,
+ 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)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *externals;
+ int i;
+
+ externals = svn_sort__hash(external_map, svn_sort_compare_items_lexically,
+ scratch_pool);
+
+ /* Loop over the hash of new values (we don't care about the old
+ ones). This is a mapping of versioned directories to property
+ values. */
+ for (i = 0; i < externals->nelts; i++)
+ {
+ svn_node_kind_t external_kind;
+ svn_sort__item_t item = APR_ARRAY_IDX(externals, i, svn_sort__item_t);
+ const char *local_abspath = item.key;
+ const char *defining_abspath = item.value;
+ svn_opt_revision_t opt_rev;
+ svn_node_kind_t kind;
+
+ svn_pool_clear(iterpool);
+
+ /* Obtain information on the expected external. */
+ SVN_ERR(svn_wc__read_external_info(&external_kind, NULL, NULL, NULL,
+ &opt_rev.value.number,
+ ctx->wc_ctx, defining_abspath,
+ local_abspath, FALSE,
+ iterpool, iterpool));
+
+ if (external_kind != svn_node_dir)
+ continue;
+
+ SVN_ERR(svn_io_check_path(local_abspath, &kind, iterpool));
+ if (kind != svn_node_dir)
+ continue;
+
+ /* Tell the client we're starting an external info. */
+ if (ctx->notify_func2)
+ ctx->notify_func2(
+ ctx->notify_baton2,
+ svn_wc_create_notify(local_abspath,
+ svn_wc_notify_info_external,
+ iterpool), iterpool);
+
+ SVN_ERR(svn_client_info4(local_abspath,
+ NULL /* peg_revision */,
+ NULL /* revision */,
+ depth,
+ fetch_excluded,
+ fetch_actual_only,
+ TRUE /* include_externals */,
+ changelists,
+ receiver, receiver_baton,
+ ctx, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
/* Set *INFO to a new info struct built from DIRENT
and (possibly NULL) svn_lock_t LOCK, all allocated in POOL.
Pointer fields are copied by reference, not dup'd. */
@@ -129,8 +203,8 @@ push_dir_info(svn_ra_session_t *ra_session,
const char *path, *fs_path;
svn_lock_t *lock;
svn_client_info2_t *info;
- const char *name = svn__apr_hash_index_key(hi);
- svn_dirent_t *the_ent = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_dirent_t *the_ent = apr_hash_this_val(hi);
svn_client__pathrev_t *child_pathrev;
svn_pool_clear(subpool);
@@ -249,12 +323,13 @@ wc_info_receiver(void *baton,
}
svn_error_t *
-svn_client_info3(const char *abspath_or_url,
+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,
@@ -283,11 +358,26 @@ svn_client_info3(const char *abspath_or_url,
b.client_receiver_func = receiver;
b.client_receiver_baton = receiver_baton;
- return svn_error_trace(
- svn_wc__get_info(ctx->wc_ctx, abspath_or_url, depth,
- fetch_excluded, fetch_actual_only, changelists,
- wc_info_receiver, &b,
- ctx->cancel_func, ctx->cancel_baton, pool));
+ SVN_ERR(svn_wc__get_info(ctx->wc_ctx, abspath_or_url, depth,
+ fetch_excluded, fetch_actual_only, changelists,
+ wc_info_receiver, &b,
+ ctx->cancel_func, ctx->cancel_baton, pool));
+
+ if (include_externals && SVN_DEPTH_IS_RECURSIVE(depth))
+ {
+ apr_hash_t *external_map;
+
+ SVN_ERR(svn_wc__externals_defined_below(&external_map,
+ ctx->wc_ctx, abspath_or_url,
+ pool, pool));
+
+ SVN_ERR(do_external_info(external_map,
+ depth, fetch_excluded, fetch_actual_only,
+ changelists,
+ receiver, receiver_baton, ctx, pool));
+ }
+
+ return SVN_NO_ERROR;
}
/* Go repository digging instead. */
@@ -298,12 +388,10 @@ svn_client_info3(const char *abspath_or_url,
SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev,
abspath_or_url, NULL, peg_revision,
revision, ctx, pool));
-
- svn_uri_split(NULL, &base_name, pathrev->url, pool);
+ base_name = svn_uri_basename(pathrev->url, pool);
/* Get the dirent for the URL itself. */
- SVN_ERR(svn_client__ra_stat_compatible(ra_session, pathrev->rev, &the_ent,
- DIRENT_FIELDS, ctx, pool));
+ SVN_ERR(svn_ra_stat(ra_session, "", pathrev->rev, &the_ent, pool));
if (! the_ent)
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
@@ -353,9 +441,7 @@ svn_client_info3(const char *abspath_or_url,
pool);
/* Catch specific errors thrown by old mod_dav_svn or svnserve. */
- if (err &&
- (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED
- || err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE))
+ if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
{
svn_error_clear(err);
locks = apr_hash_make(pool); /* use an empty hash */
diff --git a/subversion/libsvn_client/iprops.c b/subversion/libsvn_client/iprops.c
index 653ce8c..9d725bf 100644
--- a/subversion/libsvn_client/iprops.c
+++ b/subversion/libsvn_client/iprops.c
@@ -176,8 +176,8 @@ get_inheritable_props(apr_hash_t **wcroot_iprops,
hi;
hi = apr_hash_next(hi))
{
- const char *child_abspath = svn__apr_hash_index_key(hi);
- const char *child_repos_relpath = svn__apr_hash_index_val(hi);
+ const char *child_abspath = apr_hash_this_key(hi);
+ const char *child_repos_relpath = apr_hash_this_val(hi);
const char *url;
apr_array_header_t *inherited_props;
svn_error_t *err;
@@ -244,6 +244,8 @@ svn_client__get_inheritable_props(apr_hash_t **wcroot_iprops,
const char *old_session_url;
svn_error_t *err;
+ *wcroot_iprops = NULL;
+
if (!SVN_IS_VALID_REVNUM(revision))
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_client/libsvn_client.pc.in b/subversion/libsvn_client/libsvn_client.pc.in
new file mode 100644
index 0000000..7cc7865
--- /dev/null
+++ b/subversion/libsvn_client/libsvn_client.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_client
+Description: Subversion Client Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_wc libsvn_ra libsvn_delta libsvn_diff libsvn_subr
+Libs: -L${libdir} -lsvn_client
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_client/list.c b/subversion/libsvn_client/list.c
index 4093893..c29b8bd 100644
--- a/subversion/libsvn_client/list.c
+++ b/subversion/libsvn_client/list.c
@@ -34,6 +34,7 @@
#include "private/svn_fspath.h"
#include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_wc_private.h"
#include "svn_private_config.h"
@@ -128,6 +129,10 @@ get_dir_contents(apr_uint32_t dirent_fields,
}
SVN_ERR(err);
+ /* Locks will often be empty. Prevent pointless lookups in that case. */
+ if (locks && apr_hash_count(locks) == 0)
+ locks = NULL;
+
/* Filter out svn:externals from all properties hash. */
if (prop_hash)
prop_val = svn_hash_gets(prop_hash, SVN_PROP_EXTERNALS);
@@ -187,114 +192,6 @@ get_dir_contents(apr_uint32_t dirent_fields,
return SVN_NO_ERROR;
}
-/* Like svn_ra_stat() but with a compatibility hack for pre-1.2 svnserve. */
-/* ### Maybe we should move this behavior into the svn_ra_stat wrapper? */
-svn_error_t *
-svn_client__ra_stat_compatible(svn_ra_session_t *ra_session,
- svn_revnum_t rev,
- svn_dirent_t **dirent_p,
- apr_uint32_t dirent_fields,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_error_t *err;
-
- err = svn_ra_stat(ra_session, "", rev, dirent_p, pool);
-
- /* svnserve before 1.2 doesn't support the above, so fall back on
- a less efficient method. */
- if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
- {
- const char *repos_root_url;
- const char *session_url;
- svn_node_kind_t kind;
- svn_dirent_t *dirent;
-
- svn_error_clear(err);
-
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool));
- SVN_ERR(svn_ra_get_session_url(ra_session, &session_url, pool));
-
- SVN_ERR(svn_ra_check_path(ra_session, "", rev, &kind, pool));
-
- if (kind != svn_node_none)
- {
- if (strcmp(session_url, repos_root_url) != 0)
- {
- svn_ra_session_t *parent_session;
- apr_hash_t *parent_ents;
- const char *parent_url, *base_name;
- apr_pool_t *subpool = svn_pool_create(pool);
-
- /* Open another session to the path's parent. This server
- doesn't support svn_ra_reparent anyway, so don't try it. */
- svn_uri_split(&parent_url, &base_name, session_url, subpool);
-
- SVN_ERR(svn_client_open_ra_session2(&parent_session, parent_url,
- NULL, ctx,
- subpool, subpool));
-
- /* Get all parent's entries, no props. */
- SVN_ERR(svn_ra_get_dir2(parent_session, &parent_ents, NULL,
- NULL, "", rev, dirent_fields, subpool));
-
- /* Get the relevant entry. */
- dirent = svn_hash_gets(parent_ents, base_name);
-
- if (dirent)
- *dirent_p = svn_dirent_dup(dirent, pool);
- else
- *dirent_p = NULL;
-
- svn_pool_destroy(subpool); /* Close RA session */
- }
- else
- {
- /* We can't get the directory entry for the repository root,
- but we can still get the information we want.
- The created-rev of the repository root must, by definition,
- be rev. */
- dirent = apr_palloc(pool, sizeof(*dirent));
- dirent->kind = kind;
- dirent->size = SVN_INVALID_FILESIZE;
- if (dirent_fields & SVN_DIRENT_HAS_PROPS)
- {
- apr_hash_t *props;
- SVN_ERR(svn_ra_get_dir2(ra_session, NULL, NULL, &props,
- "", rev, 0 /* no dirent fields */,
- pool));
- dirent->has_props = (apr_hash_count(props) != 0);
- }
- dirent->created_rev = rev;
- if (dirent_fields & (SVN_DIRENT_TIME | SVN_DIRENT_LAST_AUTHOR))
- {
- apr_hash_t *props;
- svn_string_t *val;
-
- SVN_ERR(svn_ra_rev_proplist(ra_session, rev, &props,
- pool));
- val = svn_hash_gets(props, SVN_PROP_REVISION_DATE);
- if (val)
- SVN_ERR(svn_time_from_cstring(&dirent->time, val->data,
- pool));
- else
- dirent->time = 0;
-
- val = svn_hash_gets(props, SVN_PROP_REVISION_AUTHOR);
- dirent->last_author = val ? val->data : NULL;
- }
-
- *dirent_p = dirent;
- }
- }
- else
- *dirent_p = NULL;
- }
- else
- SVN_ERR(err);
-
- return SVN_NO_ERROR;
-}
/* List the file/directory entries for PATH_OR_URL at REVISION.
The actual node revision selected is determined by the path as
@@ -369,8 +266,7 @@ list_internal(const char *path_or_url,
fs_path = svn_client__pathrev_fspath(loc, pool);
- SVN_ERR(svn_client__ra_stat_compatible(ra_session, loc->rev, &dirent,
- dirent_fields, ctx, pool));
+ SVN_ERR(svn_ra_stat(ra_session, "", loc->rev, &dirent, pool));
if (! dirent)
return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
_("URL '%s' non-existent in revision %ld"),
@@ -530,8 +426,8 @@ list_externals(apr_hash_t *externals,
hi;
hi = apr_hash_next(hi))
{
- const char *externals_parent_url = svn__apr_hash_index_key(hi);
- svn_string_t *externals_desc = svn__apr_hash_index_val(hi);
+ const char *externals_parent_url = apr_hash_this_key(hi);
+ svn_string_t *externals_desc = apr_hash_this_val(hi);
apr_array_header_t *external_items;
svn_pool_clear(iterpool);
diff --git a/subversion/libsvn_client/locking_commands.c b/subversion/libsvn_client/locking_commands.c
index c768503..2e0164f 100644
--- a/subversion/libsvn_client/locking_commands.c
+++ b/subversion/libsvn_client/locking_commands.c
@@ -46,7 +46,8 @@
struct lock_baton
{
const char *base_dir_abspath;
- apr_hash_t *urls_to_paths;
+ apr_hash_t *urls_to_paths; /* url -> abspath */
+ const char *base_url;
svn_client_ctx_t *ctx;
apr_pool_t *pool;
};
@@ -56,7 +57,7 @@ struct lock_baton
* BATON is a 'struct lock_baton *', PATH is the path being locked,
* and LOCK is the lock itself.
*
- * If BATON->base_dir_abspath is not null, then this function either
+ * If BATON->urls_to_paths is not null, then this function either
* stores the LOCK on REL_URL or removes any lock tokens from REL_URL
* (depending on whether DO_LOCK is true or false respectively), but
* only if RA_ERR is null, or (in the unlock case) is something other
@@ -73,9 +74,12 @@ store_locks_callback(void *baton,
{
struct lock_baton *lb = baton;
svn_wc_notify_t *notify;
+ const char *local_abspath = lb->urls_to_paths
+ ? svn_hash_gets(lb->urls_to_paths, rel_url)
+ : NULL;
/* Create the notify struct first, so we can tweak it below. */
- notify = svn_wc_create_notify(rel_url,
+ notify = svn_wc_create_notify(local_abspath ? local_abspath : rel_url,
do_lock
? (ra_err
? svn_wc_notify_failed_lock
@@ -87,20 +91,14 @@ store_locks_callback(void *baton,
notify->lock = lock;
notify->err = ra_err;
- if (lb->base_dir_abspath)
+ if (local_abspath)
{
- char *path = svn_hash_gets(lb->urls_to_paths, rel_url);
- const char *local_abspath;
-
- local_abspath = svn_dirent_join(lb->base_dir_abspath, path, pool);
-
/* Notify a valid working copy path */
- notify->path = local_abspath;
notify->path_prefix = lb->base_dir_abspath;
if (do_lock)
{
- if (!ra_err)
+ if (!ra_err && lock)
{
SVN_ERR(svn_wc_add_lock2(lb->ctx->wc_ctx, local_abspath, lock,
lb->pool));
@@ -112,12 +110,14 @@ store_locks_callback(void *baton,
else /* unlocking */
{
/* Remove our wc lock token either a) if we got no error, or b) if
- we got any error except for owner mismatch. Note that the only
- errors that are handed to this callback will be locking-related
- errors. */
+ we got any error except for owner mismatch or hook failure (the
+ hook would be pre-unlock rather than post-unlock). Note that the
+ only errors that are handed to this callback will be
+ locking-related errors. */
if (!ra_err ||
- (ra_err && (ra_err->apr_err != SVN_ERR_FS_LOCK_OWNER_MISMATCH)))
+ (ra_err && (ra_err->apr_err != SVN_ERR_FS_LOCK_OWNER_MISMATCH
+ && ra_err->apr_err != SVN_ERR_REPOS_HOOK_FAILURE)))
{
SVN_ERR(svn_wc_remove_lock2(lb->ctx->wc_ctx, local_abspath,
lb->pool));
@@ -128,7 +128,7 @@ store_locks_callback(void *baton,
}
}
else
- notify->url = rel_url; /* Notify that path is actually a url */
+ notify->url = svn_path_url_add_component2(lb->base_url, rel_url, pool);
if (lb->ctx->notify_func2)
lb->ctx->notify_func2(lb->ctx->notify_baton2, notify, pool);
@@ -195,9 +195,15 @@ struct wc_lock_item_t
{
svn_revnum_t revision;
const char *lock_token;
+ const char *url;
};
-/* Set *COMMON_PARENT_URL to the nearest common parent URL of all TARGETS.
+/*
+ * Sets LOCK_PATHS to an array of working copy paths that this function
+ * has obtained lock on. The caller is responsible to release the locks
+ * EVEN WHEN THIS FUNCTION RETURNS AN ERROR.
+ *
+ * Set *COMMON_PARENT_URL to the nearest common parent URL of all TARGETS.
* If TARGETS are local paths, then the entry for each path is examined
* and *COMMON_PARENT is set to the common parent URL for all the
* targets (as opposed to the common local path).
@@ -217,8 +223,7 @@ struct wc_lock_item_t
*
* If TARGETS is an array of urls, REL_FS_PATHS_P is set to NULL.
* Otherwise each key in REL_FS_PATHS_P is an repository path (relative to
- * COMMON_PARENT) mapped to the target path for TARGET (relative to
- * the common parent WC path). working copy targets that they "belong" to.
+ * COMMON_PARENT) mapped to the absolute path for TARGET.
*
* If *COMMON_PARENT is a URL, then the values are a pointer to
* SVN_INVALID_REVNUM (allocated in pool) if DO_LOCK, else "".
@@ -226,8 +231,9 @@ struct wc_lock_item_t
* TARGETS may not be empty.
*/
static svn_error_t *
-organize_lock_targets(const char **common_parent_url,
- const char **base_dir,
+organize_lock_targets(apr_array_header_t **lock_paths,
+ const char **common_parent_url,
+ const char **base_dir_abspath,
apr_hash_t **rel_targets_p,
apr_hash_t **rel_fs_paths_p,
const apr_array_header_t *targets,
@@ -238,13 +244,12 @@ organize_lock_targets(const char **common_parent_url,
apr_pool_t *scratch_pool)
{
const char *common_url = NULL;
- const char *common_dirent = NULL;
apr_hash_t *rel_targets_ret = apr_hash_make(result_pool);
apr_hash_t *rel_fs_paths = NULL;
- apr_array_header_t *rel_targets;
apr_hash_t *wc_info = apr_hash_make(scratch_pool);
svn_boolean_t url_mode;
- int i;
+
+ *lock_paths = NULL;
SVN_ERR_ASSERT(targets->nelts);
SVN_ERR(svn_client__assert_homogeneous_target_type(targets));
@@ -253,6 +258,8 @@ organize_lock_targets(const char **common_parent_url,
if (url_mode)
{
+ apr_array_header_t *rel_targets;
+ int i;
svn_revnum_t *invalid_revnum =
apr_palloc(result_pool, sizeof(*invalid_revnum));
@@ -281,58 +288,108 @@ organize_lock_targets(const char **common_parent_url,
else
{
apr_array_header_t *rel_urls, *target_urls;
+ apr_hash_t *wcroot_target = apr_hash_make(scratch_pool);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_index_t *hi;
+ int i;
- /* Get the common parent dirent and a bunch of relpaths, one per
- target. */
- SVN_ERR(condense_targets(&common_dirent, &rel_targets, targets,
- FALSE, TRUE, result_pool, scratch_pool));
- if (! (common_dirent && *common_dirent))
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("No common parent found, unable to operate "
- "on disjoint arguments"));
+ *lock_paths = apr_array_make(result_pool, 1, sizeof(const char *));
- /* Get the URL for each target (which also serves to verify that
- the dirent targets are sane). */
- target_urls = apr_array_make(scratch_pool, rel_targets->nelts,
- sizeof(const char *));
- for (i = 0; i < rel_targets->nelts; i++)
+ for (i = 0; i < targets->nelts; i++)
{
- const char *rel_target;
- const char *repos_relpath;
- const char *repos_root_url;
- const char *target_url;
- struct wc_lock_item_t *wli;
- const char *local_abspath;
- svn_node_kind_t kind;
+ const char *target_abspath;
+ const char *wcroot_abspath;
+ apr_array_header_t *wc_targets;
svn_pool_clear(iterpool);
- rel_target = APR_ARRAY_IDX(rel_targets, i, const char *);
- local_abspath = svn_dirent_join(common_dirent, rel_target, scratch_pool);
- wli = apr_pcalloc(scratch_pool, sizeof(*wli));
+ SVN_ERR(svn_dirent_get_absolute(&target_abspath,
+ APR_ARRAY_IDX(targets, i, const char*),
+ result_pool));
- SVN_ERR(svn_wc__node_get_base(&kind, &wli->revision, &repos_relpath,
- &repos_root_url, NULL,
- &wli->lock_token,
- wc_ctx, local_abspath,
- FALSE /* ignore_enoent */,
- FALSE /* show_hidden */,
- result_pool, iterpool));
+ SVN_ERR(svn_wc__get_wcroot(&wcroot_abspath, wc_ctx, target_abspath,
+ iterpool, iterpool));
- if (kind != svn_node_file)
- return svn_error_createf(SVN_ERR_WC_NOT_FILE, NULL,
- _("The node '%s' is not a file"),
- svn_dirent_local_style(local_abspath,
- iterpool));
+ wc_targets = svn_hash_gets(wcroot_target, wcroot_abspath);
- svn_hash_sets(wc_info, local_abspath, wli);
+ if (!wc_targets)
+ {
+ wc_targets = apr_array_make(scratch_pool, 1, sizeof(const char*));
+ svn_hash_sets(wcroot_target, apr_pstrdup(scratch_pool, wcroot_abspath),
+ wc_targets);
+ }
- target_url = svn_path_url_add_component2(repos_root_url,
- repos_relpath,
- scratch_pool);
+ APR_ARRAY_PUSH(wc_targets, const char *) = target_abspath;
+ }
- APR_ARRAY_PUSH(target_urls, const char *) = target_url;
+ for (hi = apr_hash_first(scratch_pool, wcroot_target);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *lock_abspath;
+ apr_array_header_t *paths = apr_hash_this_val(hi);
+
+ /* Use parent dir of a single file target */
+ if (paths->nelts == 1)
+ lock_abspath = svn_dirent_dirname(
+ APR_ARRAY_IDX(paths, 0, const char *),
+ result_pool);
+ else
+ SVN_ERR(svn_dirent_condense_targets(&lock_abspath, NULL, paths,
+ FALSE, result_pool,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__acquire_write_lock(&lock_abspath,
+ wc_ctx, lock_abspath, FALSE,
+ result_pool, scratch_pool));
+
+ APR_ARRAY_PUSH(*lock_paths, const char *) = lock_abspath;
+ }
+
+ /* Get the URL for each target (which also serves to verify that
+ the dirent targets are sane). */
+ target_urls = apr_array_make(scratch_pool, targets->nelts,
+ sizeof(const char *));
+ for (hi = apr_hash_first(scratch_pool, wcroot_target);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ apr_array_header_t *wc_targets = apr_hash_this_val(hi);
+
+ for (i = 0; i < wc_targets->nelts; i++)
+ {
+ const char *repos_relpath;
+ const char *repos_root_url;
+ struct wc_lock_item_t *wli;
+ const char *local_abspath;
+ svn_node_kind_t kind;
+
+ svn_pool_clear(iterpool);
+
+ local_abspath = APR_ARRAY_IDX(wc_targets, i, const char *);
+ wli = apr_pcalloc(scratch_pool, sizeof(*wli));
+
+ SVN_ERR(svn_wc__node_get_base(&kind, &wli->revision,
+ &repos_relpath,
+ &repos_root_url, NULL,
+ &wli->lock_token,
+ wc_ctx, local_abspath,
+ FALSE /* ignore_enoent */,
+ result_pool, iterpool));
+
+ if (kind != svn_node_file)
+ return svn_error_createf(SVN_ERR_WC_NOT_FILE, NULL,
+ _("The node '%s' is not a file"),
+ svn_dirent_local_style(local_abspath,
+ iterpool));
+
+ wli->url = svn_path_url_add_component2(repos_root_url,
+ repos_relpath,
+ scratch_pool);
+ svn_hash_sets(wc_info, local_abspath, wli);
+
+ APR_ARRAY_PUSH(target_urls, const char *) = wli->url;
+ }
}
/* Now that we have a bunch of URLs for our dirent targets,
@@ -345,39 +402,29 @@ organize_lock_targets(const char **common_parent_url,
_("Unable to lock/unlock across multiple "
"repositories"));
- /* Now we need to create a couple of different hash mappings. */
+ /* Now we need to create our mapping. */
rel_fs_paths = apr_hash_make(result_pool);
- for (i = 0; i < rel_targets->nelts; i++)
+
+ for (hi = apr_hash_first(scratch_pool, wc_info);
+ hi;
+ hi = apr_hash_next(hi))
{
- const char *rel_target, *rel_url;
- const char *local_abspath;
+ const char *local_abspath = apr_hash_this_key(hi);
+ struct wc_lock_item_t *wli = apr_hash_this_val(hi);
+ const char *rel_url;
svn_pool_clear(iterpool);
- /* First, we need to map our REL_URL (which is relative to
- COMMON_URL) to our REL_TARGET (which is relative to
- COMMON_DIRENT). */
- rel_target = APR_ARRAY_IDX(rel_targets, i, const char *);
- rel_url = APR_ARRAY_IDX(rel_urls, i, const char *);
- svn_hash_sets(rel_fs_paths, rel_url,
- apr_pstrdup(result_pool, rel_target));
+ rel_url = svn_uri_skip_ancestor(common_url, wli->url, result_pool);
- /* Then, we map our REL_URL (again) to either the base
- revision of the dirent target with which it is associated
- (if our caller is locking) or to a (possible empty) lock
- token string (if the caller is unlocking). */
- local_abspath = svn_dirent_join(common_dirent, rel_target, iterpool);
+ svn_hash_sets(rel_fs_paths, rel_url,
+ apr_pstrdup(result_pool, local_abspath));
if (do_lock) /* Lock. */
{
svn_revnum_t *revnum;
- struct wc_lock_item_t *wli;
revnum = apr_palloc(result_pool, sizeof(* revnum));
- wli = svn_hash_gets(wc_info, local_abspath);
-
- SVN_ERR_ASSERT(wli != NULL);
-
*revnum = wli->revision;
svn_hash_sets(rel_targets_ret, rel_url, revnum);
@@ -385,15 +432,10 @@ organize_lock_targets(const char **common_parent_url,
else /* Unlock. */
{
const char *lock_token;
- struct wc_lock_item_t *wli;
/* If not forcing the unlock, get the lock token. */
if (! force)
{
- wli = svn_hash_gets(wc_info, local_abspath);
-
- SVN_ERR_ASSERT(wli != NULL);
-
if (! wli->lock_token)
return svn_error_createf(
SVN_ERR_CLIENT_MISSING_LOCK_TOKEN, NULL,
@@ -419,7 +461,10 @@ organize_lock_targets(const char **common_parent_url,
/* Set our return variables. */
*common_parent_url = common_url;
- *base_dir = common_dirent;
+ if (*lock_paths && (*lock_paths)->nelts == 1)
+ *base_dir_abspath = APR_ARRAY_IDX(*lock_paths, 0, const char*);
+ else
+ *base_dir_abspath = NULL;
*rel_targets_p = rel_targets_ret;
*rel_fs_paths_p = rel_fs_paths;
@@ -437,7 +482,7 @@ fetch_tokens(svn_ra_session_t *ra_session, apr_hash_t *path_tokens,
for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
svn_lock_t *lock;
svn_pool_clear(iterpool);
@@ -464,12 +509,13 @@ svn_client_lock(const apr_array_header_t *targets,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- const char *base_dir;
const char *base_dir_abspath = NULL;
const char *common_parent_url;
svn_ra_session_t *ra_session;
apr_hash_t *path_revs, *urls_to_paths;
struct lock_baton cb;
+ apr_array_header_t *lock_abspaths;
+ svn_error_t *err;
if (apr_is_empty_array(targets))
return SVN_NO_ERROR;
@@ -483,26 +529,49 @@ svn_client_lock(const apr_array_header_t *targets,
_("Lock comment contains illegal characters"));
}
- SVN_ERR(organize_lock_targets(&common_parent_url, &base_dir, &path_revs,
- &urls_to_paths, targets, TRUE, steal_lock,
- ctx->wc_ctx, pool, pool));
+ err = organize_lock_targets(&lock_abspaths, &common_parent_url,
+ &base_dir_abspath, &path_revs,
+ &urls_to_paths,
+ targets, TRUE, steal_lock,
+ ctx->wc_ctx, pool, pool);
+
+ if (err)
+ goto release_locks;
- /* Open an RA session to the common parent of TARGETS. */
- if (base_dir)
- SVN_ERR(svn_dirent_get_absolute(&base_dir_abspath, base_dir, pool));
- SVN_ERR(svn_client_open_ra_session2(&ra_session, common_parent_url,
- base_dir_abspath, ctx, pool, pool));
+ /* Open an RA session to the common parent URL of TARGETS. */
+ err = svn_client_open_ra_session2(&ra_session, common_parent_url,
+ base_dir_abspath, ctx, pool, pool);
+
+ if (err)
+ goto release_locks;
cb.base_dir_abspath = base_dir_abspath;
+ cb.base_url = common_parent_url;
cb.urls_to_paths = urls_to_paths;
cb.ctx = ctx;
cb.pool = pool;
/* Lock the paths. */
- SVN_ERR(svn_ra_lock(ra_session, path_revs, comment,
- steal_lock, store_locks_callback, &cb, pool));
+ err = svn_ra_lock(ra_session, path_revs, comment,
+ steal_lock, store_locks_callback, &cb, pool);
- return SVN_NO_ERROR;
+release_locks:
+ if (lock_abspaths)
+ {
+ int i;
+
+ for (i = 0; i < lock_abspaths->nelts; i++)
+ {
+ err = svn_error_compose_create(
+ err,
+ svn_wc__release_write_lock(ctx->wc_ctx,
+ APR_ARRAY_IDX(lock_abspaths, i,
+ const char *),
+ pool));
+ }
+ }
+
+ return svn_error_trace(err);
}
svn_error_t *
@@ -511,42 +580,70 @@ svn_client_unlock(const apr_array_header_t *targets,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- const char *base_dir;
const char *base_dir_abspath = NULL;
const char *common_parent_url;
svn_ra_session_t *ra_session;
apr_hash_t *path_tokens, *urls_to_paths;
+ apr_array_header_t *lock_abspaths;
struct lock_baton cb;
+ svn_error_t *err;
if (apr_is_empty_array(targets))
return SVN_NO_ERROR;
- SVN_ERR(organize_lock_targets(&common_parent_url, &base_dir, &path_tokens,
- &urls_to_paths, targets, FALSE, break_lock,
- ctx->wc_ctx, pool, pool));
+ err = organize_lock_targets(&lock_abspaths, &common_parent_url,
+ &base_dir_abspath, &path_tokens, &urls_to_paths,
+ targets, FALSE, break_lock,
+ ctx->wc_ctx, pool, pool);
+
+ if (err)
+ goto release_locks;
- /* Open an RA session. */
- if (base_dir)
- SVN_ERR(svn_dirent_get_absolute(&base_dir_abspath, base_dir, pool));
- SVN_ERR(svn_client_open_ra_session2(&ra_session, common_parent_url,
- base_dir_abspath, ctx, pool, pool));
+ /* Open an RA session to the common parent URL of TARGETS. */
+ err = svn_client_open_ra_session2(&ra_session, common_parent_url,
+ base_dir_abspath, ctx, pool, pool);
+
+ if (err)
+ goto release_locks;
/* If break_lock is not set, lock tokens are required by the server.
If the targets were all URLs, ensure that we provide lock tokens,
so the repository will only check that the user owns the
locks. */
- if (! base_dir && !break_lock)
- SVN_ERR(fetch_tokens(ra_session, path_tokens, pool));
+ if (! lock_abspaths && !break_lock)
+ {
+ err = fetch_tokens(ra_session, path_tokens, pool);
+
+ if (err)
+ goto release_locks;
+ }
cb.base_dir_abspath = base_dir_abspath;
+ cb.base_url = common_parent_url;
cb.urls_to_paths = urls_to_paths;
cb.ctx = ctx;
cb.pool = pool;
/* Unlock the paths. */
- SVN_ERR(svn_ra_unlock(ra_session, path_tokens, break_lock,
- store_locks_callback, &cb, pool));
+ err = svn_ra_unlock(ra_session, path_tokens, break_lock,
+ store_locks_callback, &cb, pool);
- return SVN_NO_ERROR;
+release_locks:
+ if (lock_abspaths)
+ {
+ int i;
+
+ for (i = 0; i < lock_abspaths->nelts; i++)
+ {
+ err = svn_error_compose_create(
+ err,
+ svn_wc__release_write_lock(ctx->wc_ctx,
+ APR_ARRAY_IDX(lock_abspaths, i,
+ const char *),
+ pool));
+ }
+ }
+
+ return svn_error_trace(err);
}
diff --git a/subversion/libsvn_client/log.c b/subversion/libsvn_client/log.c
index 9196155..adaee61 100644
--- a/subversion/libsvn_client/log.c
+++ b/subversion/libsvn_client/log.c
@@ -96,6 +96,7 @@ svn_client__get_copy_source(const char **original_repos_relpath,
svn_revnum_t *original_revision,
const char *path_or_url,
const svn_opt_revision_t *revision,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
@@ -103,18 +104,50 @@ svn_client__get_copy_source(const char **original_repos_relpath,
svn_error_t *err;
copyfrom_info_t copyfrom_info = { 0 };
apr_pool_t *sesspool = svn_pool_create(scratch_pool);
- svn_ra_session_t *ra_session;
svn_client__pathrev_t *at_loc;
+ const char *old_session_url = NULL;
copyfrom_info.is_first = TRUE;
copyfrom_info.path = NULL;
copyfrom_info.rev = SVN_INVALID_REVNUM;
copyfrom_info.pool = result_pool;
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &at_loc,
- path_or_url, NULL,
- revision, revision,
- ctx, sesspool));
+ if (!ra_session)
+ {
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &at_loc,
+ path_or_url, NULL,
+ revision, revision,
+ ctx, sesspool));
+ }
+ else
+ {
+ const char *url;
+ if (svn_path_is_url(path_or_url))
+ url = path_or_url;
+ else
+ {
+ SVN_ERR(svn_client_url_from_path2(&url, path_or_url, ctx, sesspool,
+ sesspool));
+
+ if (! url)
+ return svn_error_createf(SVN_ERR_ENTRY_MISSING_URL, NULL,
+ _("'%s' has no URL"), path_or_url);
+ }
+
+ SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session,
+ url, sesspool));
+
+ err = svn_client__resolve_rev_and_url(&at_loc, ra_session, path_or_url,
+ revision, revision, ctx,
+ sesspool);
+
+ /* On error reparent back (and return), otherwise reparent to new
+ location */
+ SVN_ERR(svn_error_compose_create(
+ err,
+ svn_ra_reparent(ra_session, err ? old_session_url
+ : at_loc->url, sesspool)));
+ }
/* Find the copy source. Walk the location segments to find the revision
at which this node was created (copied or added). */
@@ -124,6 +157,11 @@ svn_client__get_copy_source(const char **original_repos_relpath,
copyfrom_info_receiver, &copyfrom_info,
scratch_pool);
+ if (old_session_url)
+ err = svn_error_compose_create(
+ err,
+ svn_ra_reparent(ra_session, old_session_url, sesspool));
+
svn_pool_destroy(sesspool);
if (err)
@@ -265,7 +303,7 @@ limit_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool)
The limitations on TARGETS specified by svn_client_log5 are enforced here.
So TARGETS can only contain a single WC path or a URL and zero or more
- relative paths -- anything else will raise an error.
+ relative paths -- anything else will raise an error.
PEG_REVISION, TARGETS, and CTX are as per svn_client_log5.
@@ -604,7 +642,7 @@ run_ra_get_log(apr_array_header_t *revision_ranges,
apr_array_header_t *log_segments,
svn_client__pathrev_t *actual_loc,
svn_ra_session_t *ra_session,
- /* The following are as per svn_client_log5. */
+ /* The following are as per svn_client_log5. */
const apr_array_header_t *targets,
int limit,
svn_boolean_t discover_changed_paths,
@@ -723,7 +761,7 @@ run_ra_get_log(apr_array_header_t *revision_ranges,
So to be safe we handle that case. */
if (matching_segment == NULL)
continue;
-
+
/* A segment with a NULL path means there is gap in the history.
We'll just proceed and let svn_ra_get_log2 fail with a useful
error...*/
@@ -905,8 +943,8 @@ svn_client_log5(const apr_array_header_t *targets,
SVN_ERR(run_ra_get_log(revision_ranges, relative_targets, log_segments,
actual_loc, ra_session, targets, limit,
discover_changed_paths, strict_node_history,
- include_merged_revisions, revprops, real_receiver,
- real_receiver_baton, ctx, pool));
+ include_merged_revisions, revprops,
+ real_receiver, real_receiver_baton, ctx, pool));
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/merge.c b/subversion/libsvn_client/merge.c
index f0ff9a2..aaab4e0 100644
--- a/subversion/libsvn_client/merge.c
+++ b/subversion/libsvn_client/merge.c
@@ -54,13 +54,12 @@
#include "client.h"
#include "mergeinfo.h"
-#include "private/svn_opt_private.h"
-#include "private/svn_wc_private.h"
-#include "private/svn_mergeinfo_private.h"
#include "private/svn_fspath.h"
-#include "private/svn_ra_private.h"
+#include "private/svn_mergeinfo_private.h"
#include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
+#include "private/svn_wc_private.h"
#include "svn_private_config.h"
@@ -570,14 +569,16 @@ perform_obstruction_check(svn_wc_notify_state_t *obstruction_state,
}
/* Create *LEFT and *RIGHT conflict versions for conflict victim
- * at VICTIM_ABSPATH, with kind NODE_KIND, using information obtained
- * from MERGE_SOURCE and TARGET.
+ * at VICTIM_ABSPATH, with merge-left node kind MERGE_LEFT_NODE_KIND
+ * and merge-right node kind MERGE_RIGHT_NODE_KIND, using information
+ * obtained from MERGE_SOURCE and TARGET.
* Allocate returned conflict versions in RESULT_POOL. */
static svn_error_t *
make_conflict_versions(const svn_wc_conflict_version_t **left,
const svn_wc_conflict_version_t **right,
const char *victim_abspath,
- svn_node_kind_t node_kind,
+ svn_node_kind_t merge_left_node_kind,
+ svn_node_kind_t merge_right_node_kind,
const merge_source_t *merge_source,
const merge_target_t *target,
apr_pool_t *result_pool,
@@ -597,13 +598,15 @@ make_conflict_versions(const svn_wc_conflict_version_t **left,
merge_source->loc1->repos_root_url,
merge_source->loc1->repos_uuid,
svn_relpath_join(left_relpath, child, scratch_pool),
- merge_source->loc1->rev, node_kind, result_pool);
+ merge_source->loc1->rev,
+ merge_left_node_kind, result_pool);
*right = svn_wc_conflict_version_create2(
merge_source->loc2->repos_root_url,
merge_source->loc2->repos_uuid,
svn_relpath_join(right_relpath, child, scratch_pool),
- merge_source->loc2->rev, node_kind, result_pool);
+ merge_source->loc2->rev,
+ merge_right_node_kind, result_pool);
return SVN_NO_ERROR;
}
@@ -633,8 +636,8 @@ split_mergeinfo_on_revision(svn_mergeinfo_t *younger_mergeinfo,
for (hi = apr_hash_first(pool, *mergeinfo); hi; hi = apr_hash_next(hi))
{
int i;
- const char *merge_source_path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *merge_source_path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
@@ -764,7 +767,7 @@ filter_self_referential_mergeinfo(apr_array_header_t **props,
/* If PATH itself has been added there is no need to filter. */
SVN_ERR(svn_wc__node_get_origin(&is_copy, &target_base.rev, &repos_relpath,
&target_base.repos_root_url,
- &target_base.repos_uuid, NULL,
+ &target_base.repos_uuid, NULL, NULL,
ctx->wc_ctx, target_abspath, FALSE,
pool, pool));
@@ -863,8 +866,8 @@ filter_self_referential_mergeinfo(apr_array_header_t **props,
hi; hi = apr_hash_next(hi))
{
int j;
- const char *source_path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *source_path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
const char *merge_source_url;
svn_rangelist_t *adjusted_rangelist =
apr_array_make(iterpool, 0, sizeof(svn_merge_range_t *));
@@ -1182,6 +1185,9 @@ struct merge_dir_baton_t
*/
svn_wc_conflict_reason_t tree_conflict_reason;
svn_wc_conflict_action_t tree_conflict_action;
+ svn_node_kind_t tree_conflict_local_node_kind;
+ svn_node_kind_t tree_conflict_merge_left_node_kind;
+ svn_node_kind_t tree_conflict_merge_right_node_kind;
/* When TREE_CONFLICT_REASON is CONFLICT_REASON_SKIP, the skip state to
add to the notification */
@@ -1233,6 +1239,9 @@ struct merge_file_baton_t
merge_tree_baton_t for an explanation. */
svn_wc_conflict_reason_t tree_conflict_reason;
svn_wc_conflict_action_t tree_conflict_action;
+ svn_node_kind_t tree_conflict_local_node_kind;
+ svn_node_kind_t tree_conflict_merge_left_node_kind;
+ svn_node_kind_t tree_conflict_merge_right_node_kind;
/* When TREE_CONFLICT_REASON is CONFLICT_REASON_SKIP, the skip state to
add to the notification */
@@ -1280,12 +1289,21 @@ record_skip(merge_cmd_baton_t *merge_b,
notify->kind = kind;
notify->content_state = notify->prop_state = state;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
+ scratch_pool);
}
return SVN_NO_ERROR;
}
+/* Forward declaration */
+static svn_client__merge_path_t *
+find_nearest_ancestor_with_intersecting_ranges(
+ svn_revnum_t *start,
+ svn_revnum_t *end,
+ const apr_array_header_t *children_with_mergeinfo,
+ svn_boolean_t path_is_own_ancestor,
+ const char *local_abspath);
+
/* Record a tree conflict in the WC, unless this is a dry run or a record-
* only merge, or if a tree conflict is already flagged for the VICTIM_PATH.
* (The latter can happen if a merge-tracking-aware merge is doing multiple
@@ -1294,8 +1312,6 @@ record_skip(merge_cmd_baton_t *merge_b,
* The tree conflict, with its victim specified by VICTIM_PATH, is
* assumed to have happened during a merge using merge baton MERGE_B.
*
- * NODE_KIND must be the node kind of "old" and "theirs" and "mine";
- * this function cannot cope with node kind clashes.
* ACTION and REASON correspond to the fields
* of the same names in svn_wc_tree_conflict_description_t.
*/
@@ -1303,7 +1319,9 @@ static svn_error_t *
record_tree_conflict(merge_cmd_baton_t *merge_b,
const char *local_abspath,
struct merge_dir_baton_t *parent_baton,
- svn_node_kind_t node_kind,
+ svn_node_kind_t local_node_kind,
+ svn_node_kind_t merge_left_node_kind,
+ svn_node_kind_t merge_right_node_kind,
svn_wc_conflict_action_t action,
svn_wc_conflict_reason_t reason,
const svn_wc_conflict_description2_t *existing_conflict,
@@ -1357,16 +1375,53 @@ record_tree_conflict(merge_cmd_baton_t *merge_b,
reason = svn_wc_conflict_reason_moved_here;
}
- SVN_ERR(make_conflict_versions(&left, &right, local_abspath, node_kind,
- &merge_b->merge_source, merge_b->target,
- result_pool, scratch_pool));
+ if (HONOR_MERGEINFO(merge_b) && merge_b->merge_source.ancestral)
+ {
+ struct merge_source_t *source;
+ svn_client__pathrev_t *loc1;
+ svn_client__pathrev_t *loc2;
+ svn_merge_range_t range =
+ {SVN_INVALID_REVNUM, SVN_INVALID_REVNUM, TRUE};
+
+ /* We are honoring mergeinfo so do not blindly record
+ * a conflict describing the merge of
+ * SOURCE->LOC1->URL@SOURCE->LOC1->REV through
+ * SOURCE->LOC2->URL@SOURCE->LOC2->REV
+ * but figure out the actual revision range merged. */
+ (void)find_nearest_ancestor_with_intersecting_ranges(
+ &(range.start), &(range.end),
+ merge_b->notify_begin.nodes_with_mergeinfo,
+ action != svn_wc_conflict_action_delete,
+ local_abspath);
+ loc1 = svn_client__pathrev_dup(merge_b->merge_source.loc1,
+ scratch_pool);
+ loc2 = svn_client__pathrev_dup(merge_b->merge_source.loc2,
+ scratch_pool);
+ loc1->rev = range.start;
+ loc2->rev = range.end;
+ source = merge_source_create(loc1, loc2,
+ merge_b->merge_source.ancestral,
+ scratch_pool);
+ SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
+ merge_left_node_kind,
+ merge_right_node_kind,
+ source, merge_b->target,
+ result_pool, scratch_pool));
+ }
+ else
+ SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
+ merge_left_node_kind,
+ merge_right_node_kind,
+ &merge_b->merge_source, merge_b->target,
+ result_pool, scratch_pool));
/* Fix up delete of file, add of dir replacement (or other way around) */
if (existing_conflict != NULL && existing_conflict->src_left_version)
left = existing_conflict->src_left_version;
conflict = svn_wc_conflict_description_create_tree2(
- local_abspath, node_kind, svn_wc_operation_merge,
+ local_abspath, local_node_kind,
+ svn_wc_operation_merge,
left, right, result_pool);
conflict->action = action;
@@ -1402,10 +1457,10 @@ record_tree_conflict(merge_cmd_baton_t *merge_b,
notify = svn_wc_create_notify(local_abspath, svn_wc_notify_tree_conflict,
scratch_pool);
- notify->kind = node_kind;
+ notify->kind = local_node_kind;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
+ scratch_pool);
}
return SVN_NO_ERROR;
@@ -1439,8 +1494,8 @@ record_update_add(merge_cmd_baton_t *merge_b,
notify = svn_wc_create_notify(local_abspath, action, scratch_pool);
notify->kind = kind;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
+ scratch_pool);
}
return SVN_NO_ERROR;
@@ -1473,8 +1528,8 @@ record_update_update(merge_cmd_baton_t *merge_b,
notify->content_state = content_state;
notify->prop_state = prop_state;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
+ scratch_pool);
}
return SVN_NO_ERROR;
@@ -1531,17 +1586,17 @@ handle_pending_notifications(merge_cmd_baton_t *merge_b,
hi;
hi = apr_hash_next(hi))
{
- const char *del_abspath = svn__apr_hash_index_key(hi);
+ const char *del_abspath = apr_hash_this_key(hi);
svn_wc_notify_t *notify;
notify = svn_wc_create_notify(del_abspath,
svn_wc_notify_update_delete,
scratch_pool);
notify->kind = svn_node_kind_from_word(
- svn__apr_hash_index_val(hi));
+ apr_hash_this_val(hi));
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2,
- notify, scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
+ notify, scratch_pool);
}
db->pending_deletes = NULL;
@@ -1607,9 +1662,9 @@ mark_dir_edited(merge_cmd_baton_t *merge_b,
notify->kind = svn_node_dir;
notify->content_state = notify->prop_state = db->skip_reason;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2,
- notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
+ notify,
+ scratch_pool);
}
if (merge_b->merge_source.ancestral
@@ -1623,7 +1678,10 @@ mark_dir_edited(merge_cmd_baton_t *merge_b,
/* open_directory() decided that a tree conflict should be raised */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, db->parent_baton,
- svn_node_dir, db->tree_conflict_action,
+ db->tree_conflict_local_node_kind,
+ db->tree_conflict_merge_left_node_kind,
+ db->tree_conflict_merge_right_node_kind,
+ db->tree_conflict_action,
db->tree_conflict_reason,
NULL, TRUE,
scratch_pool));
@@ -1686,9 +1744,9 @@ mark_file_edited(merge_cmd_baton_t *merge_b,
notify->kind = svn_node_file;
notify->content_state = notify->prop_state = fb->skip_reason;
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2,
- notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2,
+ notify,
+ scratch_pool);
}
if (merge_b->merge_source.ancestral
@@ -1702,7 +1760,10 @@ mark_file_edited(merge_cmd_baton_t *merge_b,
/* open_file() decided that a tree conflict should be raised */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, fb->parent_baton,
- svn_node_file, fb->tree_conflict_action,
+ fb->tree_conflict_local_node_kind,
+ fb->tree_conflict_merge_left_node_kind,
+ fb->tree_conflict_merge_right_node_kind,
+ fb->tree_conflict_action,
fb->tree_conflict_reason,
NULL, TRUE,
scratch_pool));
@@ -1742,6 +1803,16 @@ merge_file_opened(void **new_file_baton,
fb->tree_conflict_action = svn_wc_conflict_action_edit;
fb->skip_reason = svn_wc_notify_state_unknown;
+ if (left_source)
+ fb->tree_conflict_merge_left_node_kind = svn_node_file;
+ else
+ fb->tree_conflict_merge_left_node_kind = svn_node_none;
+
+ if (right_source)
+ fb->tree_conflict_merge_right_node_kind = svn_node_file;
+ else
+ fb->tree_conflict_merge_right_node_kind = svn_node_none;
+
*new_file_baton = fb;
if (pdb)
@@ -1758,7 +1829,6 @@ merge_file_opened(void **new_file_baton,
else if (left_source != NULL)
{
/* Node is expected to be a file, which will be changed or deleted. */
- svn_node_kind_t kind;
svn_boolean_t is_deleted;
svn_boolean_t excluded;
svn_depth_t parent_depth;
@@ -1770,7 +1840,8 @@ merge_file_opened(void **new_file_baton,
svn_wc_notify_state_t obstr_state;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, &excluded,
- &kind, &parent_depth,
+ &fb->tree_conflict_local_node_kind,
+ &parent_depth,
merge_b, local_abspath,
scratch_pool));
@@ -1783,10 +1854,10 @@ merge_file_opened(void **new_file_baton,
}
if (is_deleted)
- kind = svn_node_none;
+ fb->tree_conflict_local_node_kind = svn_node_none;
}
- if (kind == svn_node_none)
+ if (fb->tree_conflict_local_node_kind == svn_node_none)
{
fb->shadowed = TRUE;
@@ -1820,11 +1891,16 @@ merge_file_opened(void **new_file_baton,
return SVN_NO_ERROR;
/* ### /Similar */
}
- else if (kind != svn_node_file)
+ else if (fb->tree_conflict_local_node_kind != svn_node_file)
{
+ svn_boolean_t added;
fb->shadowed = TRUE;
- fb->tree_conflict_reason = svn_wc_conflict_reason_obstructed;
+ SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
+ local_abspath, scratch_pool));
+
+ fb->tree_conflict_reason = added ? svn_wc_conflict_reason_added
+ : svn_wc_conflict_reason_obstructed;
/* ### Similar to directory */
*skip = TRUE;
@@ -1879,6 +1955,8 @@ merge_file_opened(void **new_file_baton,
/* Update the tree conflict to store that this is a replace */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
+ old_tc->node_kind,
+ old_tc->src_left_version->node_kind,
svn_node_file,
fb->tree_conflict_action,
fb->tree_conflict_reason,
@@ -1905,12 +1983,11 @@ merge_file_opened(void **new_file_baton,
&& ((pdb && pdb->added) || fb->add_is_replace)))
{
svn_wc_notify_state_t obstr_state;
- svn_node_kind_t kind;
svn_boolean_t is_deleted;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, NULL,
- &kind, NULL,
- merge_b, local_abspath,
+ &fb->tree_conflict_local_node_kind,
+ NULL, merge_b, local_abspath,
scratch_pool));
if (obstr_state != svn_wc_notify_state_inapplicable)
@@ -1920,11 +1997,18 @@ merge_file_opened(void **new_file_baton,
fb->tree_conflict_reason = CONFLICT_REASON_SKIP;
fb->skip_reason = obstr_state;
}
- else if (kind != svn_node_none && !is_deleted)
+ else if (fb->tree_conflict_local_node_kind != svn_node_none
+ && !is_deleted)
{
/* Set a tree conflict */
+ svn_boolean_t added;
+
fb->shadowed = TRUE;
- fb->tree_conflict_reason = svn_wc_conflict_reason_obstructed;
+ SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
+ local_abspath, scratch_pool));
+
+ fb->tree_conflict_reason = added ? svn_wc_conflict_reason_added
+ : svn_wc_conflict_reason_obstructed;
}
}
@@ -2000,7 +2084,8 @@ merge_file_changed(const char *relpath,
scratch_pool, scratch_pool));
SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
- svn_node_file, &merge_b->merge_source, merge_b->target,
+ svn_node_file, svn_node_file,
+ &merge_b->merge_source, merge_b->target,
scratch_pool, scratch_pool));
/* Do property merge now, if we are not going to perform a text merge */
@@ -2307,17 +2392,47 @@ files_same_p(svn_boolean_t *same,
{
svn_stream_t *mine_stream;
svn_stream_t *older_stream;
- svn_opt_revision_t working_rev = { svn_opt_revision_working, { 0 } };
+ svn_string_t *special = svn_hash_gets(working_props, SVN_PROP_SPECIAL);
+ svn_string_t *eol_style = svn_hash_gets(working_props, SVN_PROP_EOL_STYLE);
+ svn_string_t *keywords = svn_hash_gets(working_props, SVN_PROP_KEYWORDS);
/* Compare the file content, translating 'mine' to 'normal' form. */
- if (svn_prop_get_value(working_props, SVN_PROP_SPECIAL) != NULL)
+ if (special != NULL)
SVN_ERR(svn_subst_read_specialfile(&mine_stream, mine_abspath,
scratch_pool, scratch_pool));
else
- SVN_ERR(svn_client__get_normalized_stream(&mine_stream, wc_ctx,
- mine_abspath, &working_rev,
- FALSE, TRUE, NULL, NULL,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream_open_readonly(&mine_stream, mine_abspath,
+ scratch_pool, scratch_pool));
+
+ if (!special && (eol_style || keywords))
+ {
+ apr_hash_t *kw = NULL;
+ const char *eol = NULL;
+ svn_subst_eol_style_t style;
+
+ /* We used to use svn_client__get_normalized_stream() here, but
+ that doesn't work in 100% of the cases because it doesn't
+ convert EOLs to the repository form; just to '\n'.
+ */
+
+ if (eol_style)
+ {
+ svn_subst_eol_style_from_value(&style, &eol, eol_style->data);
+
+ if (style == svn_subst_eol_style_native)
+ eol = SVN_SUBST_NATIVE_EOL_STR;
+ else if (style != svn_subst_eol_style_fixed
+ && style != svn_subst_eol_style_none)
+ return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
+ }
+
+ if (keywords)
+ SVN_ERR(svn_subst_build_keywords3(&kw, keywords->data, "", "",
+ "", 0, "", scratch_pool));
+
+ mine_stream = svn_subst_stream_translated(
+ mine_stream, eol, FALSE, kw, FALSE, scratch_pool);
+ }
SVN_ERR(svn_stream_open_readonly(&older_stream, older_abspath,
scratch_pool, scratch_pool));
@@ -2427,6 +2542,8 @@ merge_file_deleted(const char *relpath,
*/
SVN_ERR(record_tree_conflict(merge_b, local_abspath, fb->parent_baton,
svn_node_file,
+ svn_node_file,
+ svn_node_none,
svn_wc_conflict_action_delete,
svn_wc_conflict_reason_edited,
NULL, TRUE,
@@ -2447,7 +2564,7 @@ merge_file_deleted(const char *relpath,
When *SKIP is TRUE, the diff driver avoids work on getting the details
for the closing callbacks.
- The SKIP and SKIP_DESCENDANTS work independantly.
+ The SKIP and SKIP_DESCENDANTS work independently.
*/
static svn_error_t *
merge_dir_opened(void **new_dir_baton,
@@ -2477,6 +2594,16 @@ merge_dir_opened(void **new_dir_baton,
*new_dir_baton = db;
+ if (left_source)
+ db->tree_conflict_merge_left_node_kind = svn_node_dir;
+ else
+ db->tree_conflict_merge_left_node_kind = svn_node_none;
+
+ if (right_source)
+ db->tree_conflict_merge_right_node_kind = svn_node_dir;
+ else
+ db->tree_conflict_merge_right_node_kind = svn_node_none;
+
if (pdb)
{
db->parent_baton = pdb;
@@ -2493,7 +2620,6 @@ merge_dir_opened(void **new_dir_baton,
else if (left_source != NULL)
{
/* Node is expected to be a directory. */
- svn_node_kind_t kind;
svn_boolean_t is_deleted;
svn_boolean_t excluded;
svn_depth_t parent_depth;
@@ -2505,9 +2631,9 @@ merge_dir_opened(void **new_dir_baton,
{
svn_wc_notify_state_t obstr_state;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, &excluded,
- &kind, &parent_depth,
- merge_b, local_abspath,
- scratch_pool));
+ &db->tree_conflict_local_node_kind,
+ &parent_depth, merge_b,
+ local_abspath, scratch_pool));
if (obstr_state != svn_wc_notify_state_inapplicable)
{
@@ -2542,10 +2668,10 @@ merge_dir_opened(void **new_dir_baton,
}
if (is_deleted)
- kind = svn_node_none;
+ db->tree_conflict_local_node_kind = svn_node_none;
}
- if (kind == svn_node_none)
+ if (db->tree_conflict_local_node_kind == svn_node_none)
{
db->shadowed = TRUE;
@@ -2581,11 +2707,16 @@ merge_dir_opened(void **new_dir_baton,
return SVN_NO_ERROR;
/* ### /avoid breaking tests */
}
- else if (kind != svn_node_dir)
+ else if (db->tree_conflict_local_node_kind != svn_node_dir)
{
+ svn_boolean_t added;
+
db->shadowed = TRUE;
+ SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
+ local_abspath, scratch_pool));
- db->tree_conflict_reason = svn_wc_conflict_reason_obstructed;
+ db->tree_conflict_reason = added ? svn_wc_conflict_reason_added
+ : svn_wc_conflict_reason_obstructed;
/* ### To avoid breaking tests */
*skip = TRUE;
@@ -2672,6 +2803,8 @@ merge_dir_opened(void **new_dir_baton,
/* Update the tree conflict to store that this is a replace */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
+ old_tc->node_kind,
+ old_tc->src_left_version->node_kind,
svn_node_dir,
db->tree_conflict_action,
db->tree_conflict_reason,
@@ -2686,12 +2819,11 @@ merge_dir_opened(void **new_dir_baton,
&& ((pdb && pdb->added) || db->add_is_replace)))
{
svn_wc_notify_state_t obstr_state;
- svn_node_kind_t kind;
svn_boolean_t is_deleted;
SVN_ERR(perform_obstruction_check(&obstr_state, &is_deleted, NULL,
- &kind, NULL,
- merge_b, local_abspath,
+ &db->tree_conflict_local_node_kind,
+ NULL, merge_b, local_abspath,
scratch_pool));
/* In this case of adding a directory, we have an exception to the
@@ -2701,7 +2833,8 @@ merge_dir_opened(void **new_dir_baton,
* versioned but unexpectedly missing from disk, or is unversioned
* but obstructed by a node of the wrong kind. */
if (obstr_state == svn_wc_notify_state_obstructed
- && (is_deleted || kind == svn_node_none))
+ && (is_deleted ||
+ db->tree_conflict_local_node_kind == svn_node_none))
{
svn_node_kind_t disk_kind;
@@ -2722,17 +2855,18 @@ merge_dir_opened(void **new_dir_baton,
db->tree_conflict_reason = CONFLICT_REASON_SKIP;
db->skip_reason = obstr_state;
}
- else if (kind != svn_node_none && !is_deleted)
+ else if (db->tree_conflict_local_node_kind != svn_node_none
+ && !is_deleted)
{
/* Set a tree conflict */
+ svn_boolean_t added;
db->shadowed = TRUE;
- db->tree_conflict_reason = svn_wc_conflict_reason_obstructed;
- if ((merge_b->merge_source.ancestral || merge_b->reintegrate_merge)
- && !(pdb && pdb->shadowed))
- {
- store_path(merge_b->skipped_abspaths, local_abspath);
- }
+ SVN_ERR(svn_wc__node_is_added(&added, merge_b->ctx->wc_ctx,
+ local_abspath, scratch_pool));
+
+ db->tree_conflict_reason = added ? svn_wc_conflict_reason_added
+ : svn_wc_conflict_reason_obstructed;
}
}
@@ -2758,7 +2892,7 @@ merge_dir_opened(void **new_dir_baton,
if (old_tc)
{
- /* svn_wc_add4 and svn_wc_add_from_disk2 can't add a node
+ /* svn_wc_add4 and svn_wc_add_from_disk3 can't add a node
over an existing tree conflict */
/* ### These functions should take some tree conflict argument
@@ -2796,8 +2930,9 @@ merge_dir_opened(void **new_dir_baton,
}
else
{
- SVN_ERR(svn_wc_add_from_disk2(merge_b->ctx->wc_ctx, local_abspath,
+ SVN_ERR(svn_wc_add_from_disk3(merge_b->ctx->wc_ctx, local_abspath,
apr_hash_make(scratch_pool),
+ FALSE /* skip checks */,
NULL, NULL /* no notify! */,
scratch_pool));
}
@@ -2806,6 +2941,8 @@ merge_dir_opened(void **new_dir_baton,
{
/* ### Should be atomic with svn_wc_add(4|_from_disk2)() */
SVN_ERR(record_tree_conflict(merge_b, local_abspath, pdb,
+ old_tc->node_kind,
+ svn_node_none,
svn_node_dir,
db->tree_conflict_action,
db->tree_conflict_reason,
@@ -2875,7 +3012,8 @@ merge_dir_changed(const char *relpath,
svn_wc_notify_state_t prop_state;
SVN_ERR(make_conflict_versions(&left, &right, local_abspath,
- svn_node_dir, &merge_b->merge_source,
+ svn_node_dir, svn_node_dir,
+ &merge_b->merge_source,
merge_b->target,
scratch_pool, scratch_pool));
@@ -3225,6 +3363,8 @@ merge_dir_deleted(const char *relpath,
*/
SVN_ERR(record_tree_conflict(merge_b, local_abspath, db->parent_baton,
svn_node_dir,
+ svn_node_dir,
+ svn_node_none,
svn_wc_conflict_action_delete,
svn_wc_conflict_reason_edited,
NULL, TRUE,
@@ -3643,8 +3783,8 @@ notify_merge_begin(merge_cmd_baton_t *merge_b,
notify->merge_range = NULL;
}
- (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
- scratch_pool);
+ merge_b->ctx->notify_func2(merge_b->ctx->notify_baton2, notify,
+ scratch_pool);
return SVN_NO_ERROR;
}
@@ -3792,111 +3932,96 @@ adjust_deleted_subtree_ranges(svn_client__merge_path_t *child,
younger_rev, older_rev, ctx,
scratch_pool);
- /* If PRIMARY_URL@peg_rev doesn't exist then
- svn_client__repos_location_segments() typically returns an
- SVN_ERR_FS_NOT_FOUND error, but if it doesn't exist for a
- forward merge over ra_neon then we get SVN_ERR_RA_DAV_REQUEST_FAILED.
- http://subversion.tigris.org/issues/show_bug.cgi?id=3137 fixed some of
- the cases where different RA layers returned different error codes to
- signal the "path not found"...but it looks like there is more to do.
-
- ### Do we still need to special case for ra_neon (since it no longer
- exists)? */
if (err)
{
- if (err->apr_err == SVN_ERR_FS_NOT_FOUND
- || err->apr_err == SVN_ERR_RA_DAV_REQUEST_FAILED)
+ const char *rel_source_path; /* PRIMARY_URL relative to RA_SESSION */
+ svn_node_kind_t kind;
+
+ if (err->apr_err != SVN_ERR_FS_NOT_FOUND)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+
+ /* PRIMARY_URL@peg_rev doesn't exist. Check if PRIMARY_URL@older_rev
+ exists, if neither exist then the editor can simply ignore this
+ subtree. */
+
+ SVN_ERR(svn_ra_get_path_relative_to_session(
+ ra_session, &rel_source_path, primary_url, scratch_pool));
+
+ SVN_ERR(svn_ra_check_path(ra_session, rel_source_path,
+ older_rev, &kind, scratch_pool));
+ if (kind == svn_node_none)
{
- /* PRIMARY_URL@peg_rev doesn't exist. Check if PRIMARY_URL@older_rev
- exists, if neither exist then the editor can simply ignore this
- subtree. */
- const char *rel_source_path; /* PRIMARY_URL relative to RA_SESSION */
- svn_node_kind_t kind;
+ /* Neither PRIMARY_URL@peg_rev nor PRIMARY_URL@older_rev exist,
+ so there is nothing to merge. Set CHILD->REMAINING_RANGES
+ identical to PARENT's. */
+ child->remaining_ranges =
+ svn_rangelist_dup(parent->remaining_ranges, scratch_pool);
+ }
+ else
+ {
+ svn_rangelist_t *deleted_rangelist;
+ svn_revnum_t rev_primary_url_deleted;
- svn_error_clear(err);
- err = NULL;
+ /* PRIMARY_URL@older_rev exists, so it was deleted at some
+ revision prior to peg_rev, find that revision. */
+ SVN_ERR(svn_ra_get_deleted_rev(ra_session, rel_source_path,
+ older_rev, younger_rev,
+ &rev_primary_url_deleted,
+ scratch_pool));
- SVN_ERR(svn_ra_get_path_relative_to_session(
- ra_session, &rel_source_path, primary_url, scratch_pool));
+ /* PRIMARY_URL@older_rev exists and PRIMARY_URL@peg_rev doesn't,
+ so svn_ra_get_deleted_rev() should always find the revision
+ PRIMARY_URL@older_rev was deleted. */
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(rev_primary_url_deleted));
- SVN_ERR(svn_ra_check_path(ra_session, rel_source_path,
- older_rev, &kind, scratch_pool));
- if (kind == svn_node_none)
+ /* If this is a reverse merge reorder CHILD->REMAINING_RANGES and
+ PARENT->REMAINING_RANGES so both will work with the
+ svn_rangelist_* APIs below. */
+ if (is_rollback)
{
- /* Neither PRIMARY_URL@peg_rev nor PRIMARY_URL@older_rev exist,
- so there is nothing to merge. Set CHILD->REMAINING_RANGES
- identical to PARENT's. */
- child->remaining_ranges =
- svn_rangelist_dup(parent->remaining_ranges, scratch_pool);
+ /* svn_rangelist_reverse operates in place so it's safe
+ to use our scratch_pool. */
+ SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
+ scratch_pool));
+ SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
+ scratch_pool));
}
- else
- {
- svn_rangelist_t *deleted_rangelist;
- svn_revnum_t rev_primary_url_deleted;
-
- /* PRIMARY_URL@older_rev exists, so it was deleted at some
- revision prior to peg_rev, find that revision. */
- SVN_ERR(svn_ra_get_deleted_rev(ra_session, rel_source_path,
- older_rev, younger_rev,
- &rev_primary_url_deleted,
- scratch_pool));
-
- /* PRIMARY_URL@older_rev exists and PRIMARY_URL@peg_rev doesn't,
- so svn_ra_get_deleted_rev() should always find the revision
- PRIMARY_URL@older_rev was deleted. */
- SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(rev_primary_url_deleted));
- /* If this is a reverse merge reorder CHILD->REMAINING_RANGES and
- PARENT->REMAINING_RANGES so both will work with the
- svn_rangelist_* APIs below. */
- if (is_rollback)
- {
- /* svn_rangelist_reverse operates in place so it's safe
- to use our scratch_pool. */
- SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
- scratch_pool));
- SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
- scratch_pool));
- }
+ /* Find the intersection of CHILD->REMAINING_RANGES with the
+ range over which PRIMARY_URL@older_rev exists (ending at
+ the youngest revision at which it still exists). */
+ SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
+ child->remaining_ranges,
+ older_rev,
+ rev_primary_url_deleted - 1,
+ FALSE,
+ scratch_pool, scratch_pool));
- /* Find the intersection of CHILD->REMAINING_RANGES with the
- range over which PRIMARY_URL@older_rev exists (ending at
- the youngest revision at which it still exists). */
- SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
- child->remaining_ranges,
- older_rev,
- rev_primary_url_deleted - 1,
- FALSE,
- scratch_pool, scratch_pool));
-
- /* Merge into CHILD->REMAINING_RANGES the intersection of
- PARENT->REMAINING_RANGES with the range beginning when
- PRIMARY_URL@older_rev was deleted until younger_rev. */
- SVN_ERR(rangelist_intersect_range(&deleted_rangelist,
- parent->remaining_ranges,
- rev_primary_url_deleted - 1,
- peg_rev,
- FALSE,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_rangelist_merge2(child->remaining_ranges,
- deleted_rangelist, scratch_pool,
- scratch_pool));
+ /* Merge into CHILD->REMAINING_RANGES the intersection of
+ PARENT->REMAINING_RANGES with the range beginning when
+ PRIMARY_URL@older_rev was deleted until younger_rev. */
+ SVN_ERR(rangelist_intersect_range(&deleted_rangelist,
+ parent->remaining_ranges,
+ rev_primary_url_deleted - 1,
+ peg_rev,
+ FALSE,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_rangelist_merge2(child->remaining_ranges,
+ deleted_rangelist, scratch_pool,
+ scratch_pool));
- /* Return CHILD->REMAINING_RANGES and PARENT->REMAINING_RANGES
- to reverse order if necessary. */
- if (is_rollback)
- {
- SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
- scratch_pool));
- SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
- scratch_pool));
- }
+ /* Return CHILD->REMAINING_RANGES and PARENT->REMAINING_RANGES
+ to reverse order if necessary. */
+ if (is_rollback)
+ {
+ SVN_ERR(svn_rangelist_reverse(child->remaining_ranges,
+ scratch_pool));
+ SVN_ERR(svn_rangelist_reverse(parent->remaining_ranges,
+ scratch_pool));
}
}
- else
- {
- return svn_error_trace(err);
- }
}
else /* PRIMARY_URL@peg_rev exists. */
{
@@ -4684,7 +4809,6 @@ calculate_remaining_ranges(svn_client__merge_path_t *parent,
NULL, NULL, NULL, NULL,
ctx->wc_ctx, child->abspath,
TRUE /* ignore_enoent */,
- FALSE /* show_hidden */,
scratch_pool, scratch_pool));
/* If CHILD has no base revision then it hasn't been committed yet, so it
can't have any "future" history. */
@@ -4779,7 +4903,7 @@ find_gaps_in_merge_source_history(svn_revnum_t *gap_start,
*gap_start = *gap_end = SVN_INVALID_REVNUM;
/* Easy out: There can't be a gap between adjacent revisions. */
- if (abs(source->loc1->rev - source->loc2->rev) == 1)
+ if (labs(source->loc1->rev - source->loc2->rev) == 1)
return SVN_NO_ERROR;
/* Get SOURCE as mergeinfo. */
@@ -5174,8 +5298,8 @@ update_wc_mergeinfo(svn_mergeinfo_catalog_t result_catalog,
the WC with its on-disk mergeinfo. */
for (hi = apr_hash_first(scratch_pool, merges); hi; hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
- svn_rangelist_t *ranges = svn__apr_hash_index_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
+ svn_rangelist_t *ranges = apr_hash_this_val(hi);
svn_rangelist_t *rangelist;
svn_error_t *err;
const char *local_abspath_rel_to_target;
@@ -5326,7 +5450,7 @@ record_skips_in_mergeinfo(const char *mergeinfo_path,
for (hi = apr_hash_first(scratch_pool, merge_b->skipped_abspaths); hi;
hi = apr_hash_next(hi))
{
- const char *skipped_abspath = svn__apr_hash_index_key(hi);
+ const char *skipped_abspath = apr_hash_this_key(hi);
svn_wc_notify_state_t obstruction_state;
svn_pool_clear(iterpool);
@@ -5882,7 +6006,7 @@ slice_remaining_ranges(apr_array_header_t *children_with_mergeinfo,
split_range2->start = end_rev;
APR_ARRAY_IDX(child->remaining_ranges, 0,
svn_merge_range_t *) = split_range1;
- svn_sort__array_insert(&split_range2, child->remaining_ranges, 1);
+ svn_sort__array_insert(child->remaining_ranges, &split_range2, 1);
}
}
}
@@ -6017,11 +6141,11 @@ insert_child_to_merge(apr_array_header_t *children_with_mergeinfo,
/* Find where to insert the new element */
insert_index =
- svn_sort__bsearch_lower_bound(&insert_element, children_with_mergeinfo,
+ svn_sort__bsearch_lower_bound(children_with_mergeinfo, &insert_element,
compare_merge_path_t_as_paths);
new_element = svn_client__merge_path_dup(insert_element, pool);
- svn_sort__array_insert(&new_element, children_with_mergeinfo, insert_index);
+ svn_sort__array_insert(children_with_mergeinfo, &new_element, insert_index);
}
/* Helper for get_mergeinfo_paths().
@@ -6088,8 +6212,9 @@ insert_parent_and_sibs_of_sw_absent_del_subtree(
} /*(parent == NULL) */
/* Add all of PARENT's non-missing children that are not already present.*/
- SVN_ERR(svn_wc__node_get_children(&children, ctx->wc_ctx,
- parent_abspath, FALSE, pool, pool));
+ SVN_ERR(svn_wc__node_get_children_of_working_node(&children, ctx->wc_ctx,
+ parent_abspath,
+ pool, pool));
iterpool = svn_pool_create(pool);
for (i = 0; i < children->nelts; i++)
{
@@ -6188,7 +6313,7 @@ pre_merge_status_cb(void *baton,
hi;
hi = apr_hash_next(hi))
{
- const char *missing_root_path = svn__apr_hash_index_key(hi);
+ const char *missing_root_path = apr_hash_this_key(hi);
if (svn_dirent_is_ancestor(missing_root_path,
local_abspath))
@@ -6246,8 +6371,8 @@ get_wc_explicit_mergeinfo_catalog(apr_hash_t **subtrees_with_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *wc_path = svn__apr_hash_index_key(hi);
- svn_string_t *mergeinfo_string = svn__apr_hash_index_val(hi);
+ const char *wc_path = apr_hash_this_key(hi);
+ svn_string_t *mergeinfo_string = apr_hash_this_val(hi);
svn_mergeinfo_t mergeinfo;
svn_error_t *err;
@@ -6340,6 +6465,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
{
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *swmi_pool;
apr_hash_t *subtrees_with_mergeinfo;
apr_hash_t *excluded_subtrees;
apr_hash_t *switched_subtrees;
@@ -6348,10 +6474,13 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
struct pre_merge_status_baton_t pre_merge_status_baton;
/* Case 1: Subtrees with explicit mergeinfo. */
+ /* Use a subpool for subtrees_with_mergeinfo, as it can be very large
+ and is temporary. */
+ swmi_pool = svn_pool_create(scratch_pool);
SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
target->abspath,
depth, ctx,
- result_pool, scratch_pool));
+ swmi_pool, swmi_pool));
if (subtrees_with_mergeinfo)
{
apr_hash_index_t *hi;
@@ -6360,8 +6489,8 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *wc_path = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t mergeinfo = svn__apr_hash_index_val(hi);
+ const char *wc_path = apr_hash_this_key(hi);
+ svn_mergeinfo_t mergeinfo = apr_hash_this_val(hi);
svn_client__merge_path_t *mergeinfo_child =
svn_client__merge_path_create(wc_path, result_pool);
@@ -6388,6 +6517,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
children_with_mergeinfo->elt_size,
compare_merge_path_t_as_paths);
}
+ svn_pool_destroy(swmi_pool);
/* Case 2: Switched subtrees
Case 10: Paths at depths of 'empty' or 'files'
@@ -6429,7 +6559,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
svn_pool_clear(iterpool);
svn_stringbuf_appendcstr(missing_subtree_err_buf,
svn_dirent_local_style(
- svn__apr_hash_index_key(hi), iterpool));
+ apr_hash_this_key(hi), iterpool));
svn_stringbuf_appendcstr(missing_subtree_err_buf, "\n");
}
@@ -6445,7 +6575,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *wc_path = svn__apr_hash_index_key(hi);
+ const char *wc_path = apr_hash_this_key(hi);
svn_client__merge_path_t *child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
@@ -6473,8 +6603,8 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
hi = apr_hash_next(hi))
{
svn_boolean_t new_shallow_child = FALSE;
- const char *wc_path = svn__apr_hash_index_key(hi);
- svn_depth_t *child_depth = svn__apr_hash_index_val(hi);
+ const char *wc_path = apr_hash_this_key(hi);
+ svn_depth_t *child_depth = apr_hash_this_val(hi);
svn_client__merge_path_t *shallow_child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
@@ -6528,7 +6658,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *wc_path = svn__apr_hash_index_key(hi);
+ const char *wc_path = apr_hash_this_key(hi);
svn_client__merge_path_t *child = get_child_with_mergeinfo(
children_with_mergeinfo, wc_path);
@@ -6571,7 +6701,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
SVN_ERR(svn_wc__node_get_children_of_working_node(
&immediate_children, ctx->wc_ctx,
- target->abspath, FALSE, scratch_pool, scratch_pool));
+ target->abspath, scratch_pool, scratch_pool));
for (j = 0; j < immediate_children->nelts; j++)
{
@@ -6655,9 +6785,10 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
const apr_array_header_t *children;
int j;
- SVN_ERR(svn_wc__node_get_children(&children,
+ SVN_ERR(svn_wc__node_get_children_of_working_node(
+ &children,
ctx->wc_ctx,
- child->abspath, FALSE,
+ child->abspath,
iterpool, iterpool));
for (j = 0; j < children->nelts; j++)
{
@@ -7104,7 +7235,8 @@ normalize_merge_sources_internal(apr_array_header_t **merge_sources_p,
SVN_ERR(svn_client__get_copy_source(&original_repos_relpath,
&original_revision,
segment_url,
- &range_start_rev, ctx,
+ &range_start_rev,
+ ra_session, ctx,
result_pool, scratch_pool));
/* Got copyfrom data? Fix up the first segment to cover
back to COPYFROM_REV + 1, and then prepend a new
@@ -7117,7 +7249,7 @@ normalize_merge_sources_internal(apr_array_header_t **merge_sources_p,
new_segment->path = original_repos_relpath;
new_segment->range_start = original_revision;
new_segment->range_end = original_revision;
- svn_sort__array_insert(&new_segment, segments, 0);
+ svn_sort__array_insert(segments, &new_segment, 0);
}
}
}
@@ -7783,7 +7915,7 @@ process_children_with_new_mergeinfo(merge_cmd_baton_t *merge_b,
hi;
hi = apr_hash_next(hi))
{
- const char *abspath_with_new_mergeinfo = svn__apr_hash_index_key(hi);
+ const char *abspath_with_new_mergeinfo = apr_hash_this_key(hi);
svn_mergeinfo_t path_inherited_mergeinfo;
svn_mergeinfo_t path_explicit_mergeinfo;
svn_client__merge_path_t *new_child;
@@ -7886,7 +8018,7 @@ path_is_subtree(const char *local_abspath,
for (hi = apr_hash_first(pool, subtrees);
hi; hi = apr_hash_next(hi))
{
- const char *path_touched_by_merge = svn__apr_hash_index_key(hi);
+ const char *path_touched_by_merge = apr_hash_this_key(hi);
if (svn_dirent_is_ancestor(local_abspath, path_touched_by_merge))
return TRUE;
}
@@ -8001,8 +8133,8 @@ log_find_operative_subtree_revs(void *baton,
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_log_changed_path2_t *change = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_log_changed_path2_t *change = apr_hash_this_val(hi);
{
const char *child;
@@ -8638,7 +8770,7 @@ record_mergeinfo_for_dir_merge(svn_mergeinfo_catalog_t result_catalog,
/* Allow mergeinfo on switched subtrees to elide to the
repository. Otherwise limit elision to the merge target
- for now. do_directory_merge() will eventually try to
+ for now. do_merge() will eventually try to
elide that when the merge is complete. */
SVN_ERR(svn_client__elide_mergeinfo(
child->abspath,
@@ -8687,7 +8819,7 @@ record_mergeinfo_for_added_subtrees(
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, added_abspaths); hi; hi = apr_hash_next(hi))
{
- const char *added_abspath = svn__apr_hash_index_key(hi);
+ const char *added_abspath = apr_hash_this_key(hi);
const char *dir_abspath;
svn_mergeinfo_t parent_mergeinfo;
svn_mergeinfo_t added_path_mergeinfo;
@@ -8896,7 +9028,7 @@ log_noop_revs(void *baton,
hi;
hi = apr_hash_next(hi))
{
- const char *fspath = svn__apr_hash_index_key(hi);
+ const char *fspath = apr_hash_this_key(hi);
const char *rel_path;
const char *cwmi_abspath;
svn_rangelist_t *paths_explicit_rangelist = NULL;
@@ -9053,24 +9185,23 @@ remove_noop_subtree_ranges(const merge_source_t *source,
svn_pool_clear(iterpool);
- /* Issue #4269: Keep track of the longest common ancestor of all the
- subtrees which require merges. This may be a child of
- TARGET->ABSPATH, which will allow us to narrow the log request
- below. */
+ /* CHILD->REMAINING_RANGES will be NULL if child is absent. */
if (child->remaining_ranges && child->remaining_ranges->nelts)
{
+ /* Issue #4269: Keep track of the longest common ancestor of all the
+ subtrees which require merges. This may be a child of
+ TARGET->ABSPATH, which will allow us to narrow the log request
+ below. */
if (longest_common_subtree_ancestor)
longest_common_subtree_ancestor = svn_dirent_get_longest_ancestor(
longest_common_subtree_ancestor, child->abspath, scratch_pool);
else
longest_common_subtree_ancestor = child->abspath;
- }
- /* CHILD->REMAINING_RANGES will be NULL if child is absent. */
- if (child->remaining_ranges && child->remaining_ranges->nelts)
- SVN_ERR(svn_rangelist_merge2(subtree_remaining_ranges,
- child->remaining_ranges,
- scratch_pool, iterpool));
+ SVN_ERR(svn_rangelist_merge2(subtree_remaining_ranges,
+ child->remaining_ranges,
+ scratch_pool, iterpool));
+ }
}
svn_pool_destroy(iterpool);
@@ -9464,7 +9595,7 @@ do_mergeinfo_aware_dir_merge(svn_mergeinfo_catalog_t result_catalog,
{
if (!merge_b->record_only)
{
- /* Reset cur_ancestor_abspath to null so that subsequent cherry
+ /* Reset the last notification path so that subsequent cherry
picked revision ranges will be notified upon subsequent
operative merge. */
merge_b->notify_begin.last_abspath = NULL;
@@ -10226,7 +10357,7 @@ ensure_wc_is_suitable_merge_target(const char *target_abspath,
svn_boolean_t is_modified;
SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx,
- target_abspath,
+ target_abspath, TRUE,
ctx->cancel_func,
ctx->cancel_baton,
scratch_pool));
@@ -10724,7 +10855,7 @@ log_find_operative_revs(void *baton,
hi = apr_hash_next(hi))
{
const char *subtree_missing_this_rev;
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
const char *rel_path;
const char *source_rel_path;
svn_boolean_t in_catalog;
@@ -10852,7 +10983,7 @@ find_unsynced_ranges(const svn_client__pathrev_t *source_loc,
hi_catalog;
hi_catalog = apr_hash_next(hi_catalog))
{
- svn_mergeinfo_t mergeinfo = svn__apr_hash_index_val(hi_catalog);
+ svn_mergeinfo_t mergeinfo = apr_hash_this_val(hi_catalog);
SVN_ERR(svn_rangelist__merge_many(potentially_unmerged_ranges,
mergeinfo,
@@ -10873,7 +11004,7 @@ find_unsynced_ranges(const svn_client__pathrev_t *source_loc,
potentially_unmerged_ranges->nelts - 1,
svn_merge_range_t *))->end;
log_find_operative_baton_t log_baton;
- const char *old_session_url;
+ const char *old_session_url = NULL;
svn_error_t *err;
log_baton.merged_catalog = merged_catalog;
@@ -10884,14 +11015,22 @@ find_unsynced_ranges(const svn_client__pathrev_t *source_loc,
= svn_client__pathrev_fspath(target_loc, scratch_pool);
log_baton.result_pool = result_pool;
- SVN_ERR(svn_client__ensure_ra_session_url(
- &old_session_url, ra_session, target_loc->url, scratch_pool));
+ /* Reparent the session to TARGET_LOC if this target location
+ * exists within the unmerged revision range. */
+ if (target_loc->rev <= youngest_rev && target_loc->rev >= oldest_rev)
+ SVN_ERR(svn_client__ensure_ra_session_url(
+ &old_session_url, ra_session, target_loc->url, scratch_pool));
+
err = get_log(ra_session, "", youngest_rev, oldest_rev,
TRUE, /* discover_changed_paths */
log_find_operative_revs, &log_baton,
scratch_pool);
- SVN_ERR(svn_error_compose_create(
- err, svn_ra_reparent(ra_session, old_session_url, scratch_pool)));
+ if (old_session_url)
+ err = svn_error_compose_create(err,
+ svn_ra_reparent(ra_session,
+ old_session_url,
+ scratch_pool));
+ SVN_ERR(err);
}
return SVN_NO_ERROR;
@@ -11058,8 +11197,8 @@ find_unmerged_mergeinfo(svn_mergeinfo_catalog_t *unmerged_to_source_catalog,
hi;
hi = apr_hash_next(hi))
{
- const char *target_path = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t target_history_as_mergeinfo = svn__apr_hash_index_val(hi);
+ const char *target_path = apr_hash_this_key(hi);
+ svn_mergeinfo_t target_history_as_mergeinfo = apr_hash_this_val(hi);
const char *path_rel_to_session
= svn_relpath_skip_ancestor(target_repos_rel_path, target_path);
const char *source_path;
@@ -11143,11 +11282,11 @@ find_unmerged_mergeinfo(svn_mergeinfo_catalog_t *unmerged_to_source_catalog,
hi;
hi = apr_hash_next(hi))
{
- const char *source_path = svn__apr_hash_index_key(hi);
+ const char *source_path = apr_hash_this_key(hi);
const char *path_rel_to_session =
svn_relpath_skip_ancestor(source_repos_rel_path, source_path);
const char *source_url;
- svn_mergeinfo_t source_mergeinfo = svn__apr_hash_index_val(hi);
+ svn_mergeinfo_t source_mergeinfo = apr_hash_this_val(hi);
svn_mergeinfo_t filtered_mergeinfo;
svn_client__pathrev_t *target_pathrev;
svn_mergeinfo_t target_history_as_mergeinfo;
@@ -11296,7 +11435,7 @@ calculate_left_hand_side(svn_client__pathrev_t **left_p,
hi;
hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
svn_client__pathrev_t *target_child;
const char *repos_relpath;
svn_mergeinfo_t target_history_as_mergeinfo;
@@ -11523,7 +11662,7 @@ find_reintegrate_merge(merge_source_t **source_p,
SVN_ERR(svn_mergeinfo__catalog_to_formatted_string(
&source_mergeinfo_cat_string,
final_unmerged_catalog,
- " ", " Missing ranges: ", scratch_pool));
+ " ", _(" Missing ranges: "), scratch_pool));
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE,
NULL,
_("Reintegrate can only be used if "
@@ -11583,9 +11722,6 @@ open_reintegrate_source_and_target(svn_ra_session_t **source_ra_session_p,
SVN_ERR(open_target_wc(&target, target_abspath,
FALSE, FALSE, FALSE,
ctx, scratch_pool, scratch_pool));
- SVN_ERR(svn_client_open_ra_session2(target_ra_session_p,
- target->loc.url, target->abspath,
- ctx, result_pool, scratch_pool));
if (! target->loc.url)
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("Can't reintegrate into '%s' because it is "
@@ -11594,6 +11730,10 @@ open_reintegrate_source_and_target(svn_ra_session_t **source_ra_session_p,
svn_dirent_local_style(target->abspath,
scratch_pool));
+ SVN_ERR(svn_client_open_ra_session2(target_ra_session_p,
+ target->loc.url, target->abspath,
+ ctx, result_pool, scratch_pool));
+
SVN_ERR(svn_client__ra_session_from_path2(
source_ra_session_p, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
@@ -11647,6 +11787,7 @@ merge_reintegrate_locked(conflict_report_t **conflict_report,
if (! source)
{
+ *conflict_report = NULL;
return SVN_NO_ERROR;
}
@@ -11943,8 +12084,8 @@ location_on_branch_at_rev(const branch_history_t *branch_history,
for (hi = apr_hash_first(scratch_pool, branch_history->history); hi;
hi = apr_hash_next(hi))
{
- const char *fspath = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *fspath = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
int i;
for (i = 0; i < rangelist->nelts; i++)
@@ -12195,6 +12336,10 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
svn_mergeinfo_catalog_t target_mergeinfo_cat = NULL;
+ /* Using a local subpool for 'target_mergeinfo_cat' can make a big
+ reduction in overall memory usage. */
+ apr_pool_t *tmic_pool = svn_pool_create(scratch_pool);
+
source_peg_rev.kind = svn_opt_revision_number;
source_peg_rev.value.number = source_branch->tip->rev;
source_start_rev.kind = svn_opt_revision_number;
@@ -12215,7 +12360,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
operative_rev_receiver,
&youngest_merged_rev,
ctx, ra_session,
- result_pool, scratch_pool));
+ tmic_pool, tmic_pool));
if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
{
@@ -12251,7 +12396,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
operative_rev_receiver,
&oldest_eligible_rev,
ctx, ra_session,
- scratch_pool, scratch_pool));
+ tmic_pool, tmic_pool));
/* If there are revisions eligible for merging, use the oldest one
to calculate the base. Otherwise there are no operative revisions
@@ -12273,6 +12418,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
result_pool, scratch_pool));
}
+ svn_pool_destroy(tmic_pool);
return SVN_NO_ERROR;
}
@@ -12347,7 +12493,16 @@ find_base_on_target(svn_client__pathrev_t **base_p,
return SVN_NO_ERROR;
}
-/* The body of client_find_automatic_merge(), which see.
+/* Find the last point at which the branch at S_T->source was completely
+ * merged to the branch at S_T->target or vice-versa.
+ *
+ * Fill in S_T->source_branch and S_T->target_branch and S_T->yca.
+ * Set *BASE_P to the merge base. Set *IS_REINTEGRATE_LIKE to true if
+ * an automatic merge from source to target would be a reintegration
+ * merge: that is, if the last automatic merge was in the opposite
+ * direction; or to false otherwise.
+ *
+ * If there is no youngest common ancestor, throw an error.
*/
static svn_error_t *
find_automatic_merge(svn_client__pathrev_t **base_p,
@@ -12417,6 +12572,9 @@ find_automatic_merge(svn_client__pathrev_t **base_p,
* Like find_automatic_merge() except that the target is
* specified by @a target_path_or_url at @a target_revision, which must
* refer to a repository location, instead of by a WC path argument.
+ *
+ * Set *MERGE_P to a new structure with all fields filled in except the
+ * 'allow_*' flags.
*/
static svn_error_t *
find_automatic_merge_no_wc(automatic_merge_t **merge_p,
@@ -12492,6 +12650,8 @@ client_find_automatic_merge(automatic_merge_t **merge_p,
source_and_target_t *s_t = apr_palloc(result_pool, sizeof(*s_t));
automatic_merge_t *merge = apr_palloc(result_pool, sizeof(*merge));
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
+
/* "Open" the target WC. Check the target WC for mixed-rev, local mods and
* switched subtrees yet to faster exit and notify user before contacting
* with server. After we find out what kind of merge is required, then if a
@@ -12503,12 +12663,19 @@ client_find_automatic_merge(automatic_merge_t **merge_p,
allow_switched_subtrees,
ctx, result_pool, scratch_pool));
+ if (!s_t->target->loc.url)
+ return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
+ _("Can't perform automatic merge into '%s' "
+ "because it is locally added and therefore "
+ "not related to the merge source"),
+ svn_dirent_local_style(target_abspath,
+ scratch_pool));
+
/* Open RA sessions to the source and target trees. */
SVN_ERR(svn_client_open_ra_session2(&s_t->target_ra_session,
s_t->target->loc.url,
s_t->target->abspath,
ctx, result_pool, scratch_pool));
- /* ### check for null URL (i.e. added path) here, like in reintegrate? */
SVN_ERR(svn_client__ra_session_from_path2(
&s_t->source_ra_session, &s_t->source,
source_path_or_url, NULL, source_revision, source_revision,
@@ -12523,6 +12690,7 @@ client_find_automatic_merge(automatic_merge_t **merge_p,
ctx, result_pool, scratch_pool));
merge->yca = s_t->yca;
merge->right = s_t->source;
+ merge->target = &s_t->target->loc;
merge->allow_mixed_rev = allow_mixed_rev;
merge->allow_local_mods = allow_local_mods;
merge->allow_switched_subtrees = allow_switched_subtrees;
@@ -12711,14 +12879,21 @@ svn_client_get_merging_summary(svn_boolean_t *needs_reintegration,
target_is_wc = (! svn_path_is_url(target_path_or_url))
&& (target_revision->kind == svn_opt_revision_unspecified
- || target_revision->kind == svn_opt_revision_working);
+ || target_revision->kind == svn_opt_revision_working
+ || target_revision->kind == svn_opt_revision_base);
if (target_is_wc)
- SVN_ERR(client_find_automatic_merge(
- &merge,
- source_path_or_url, source_revision,
- target_path_or_url,
- TRUE, TRUE, TRUE, /* allow_* */
- ctx, scratch_pool, scratch_pool));
+ {
+ const char *target_abspath;
+
+ SVN_ERR(svn_dirent_get_absolute(&target_abspath, target_path_or_url,
+ scratch_pool));
+ SVN_ERR(client_find_automatic_merge(
+ &merge,
+ source_path_or_url, source_revision,
+ target_abspath,
+ TRUE, TRUE, TRUE, /* allow_* */
+ ctx, scratch_pool, scratch_pool));
+ }
else
SVN_ERR(find_automatic_merge_no_wc(
&merge,
diff --git a/subversion/libsvn_client/mergeinfo.c b/subversion/libsvn_client/mergeinfo.c
index 2d277f5..622dbbc 100644
--- a/subversion/libsvn_client/mergeinfo.c
+++ b/subversion/libsvn_client/mergeinfo.c
@@ -38,12 +38,13 @@
#include "svn_client.h"
#include "svn_hash.h"
+#include "private/svn_client_private.h"
#include "private/svn_opt_private.h"
#include "private/svn_mergeinfo_private.h"
-#include "private/svn_wc_private.h"
#include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_wc_private.h"
#include "private/svn_fspath.h"
-#include "private/svn_client_private.h"
#include "client.h"
#include "mergeinfo.h"
#include "svn_private_config.h"
@@ -223,7 +224,6 @@ svn_client__get_wc_mergeinfo(svn_mergeinfo_t *mergeinfo,
SVN_ERR(svn_wc__node_get_base(NULL, &base_revision, NULL, NULL, NULL, NULL,
ctx->wc_ctx, local_abspath,
TRUE /* ignore_enoent */,
- FALSE /* show_hidden */,
scratch_pool, scratch_pool));
iterpool = svn_pool_create(scratch_pool);
@@ -294,7 +294,7 @@ svn_client__get_wc_mergeinfo(svn_mergeinfo_t *mergeinfo,
SVN_ERR(svn_wc__node_get_base(NULL, &parent_base_rev, NULL, NULL,
NULL, NULL,
ctx->wc_ctx, local_abspath,
- TRUE, FALSE,
+ TRUE /* ignore_enoent */,
scratch_pool, scratch_pool));
/* ### This checks the WORKING changed_rev, so invalid on replacement
@@ -360,7 +360,7 @@ svn_client__get_wc_mergeinfo(svn_mergeinfo_t *mergeinfo,
SVN_ERR(svn_mergeinfo_inheritable2(mergeinfo, *mergeinfo, NULL,
SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
TRUE, result_pool, scratch_pool));
- svn_mergeinfo__remove_empty_rangelists(*mergeinfo, result_pool);
+ svn_mergeinfo__remove_empty_rangelists(*mergeinfo, scratch_pool);
}
if (inherited_p)
@@ -429,8 +429,8 @@ svn_client__get_wc_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
hi;
hi = apr_hash_next(hi))
{
- const char *node_abspath = svn__apr_hash_index_key(hi);
- svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *node_abspath = apr_hash_this_key(hi);
+ svn_string_t *propval = apr_hash_this_val(hi);
svn_mergeinfo_t subtree_mergeinfo;
const char *repos_relpath;
@@ -482,7 +482,7 @@ svn_client__get_repos_mergeinfo(svn_mergeinfo_t *target_mergeinfo,
descendants. So if there is anything in the catalog it is the
mergeinfo for REL_PATH. */
*target_mergeinfo =
- svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+ apr_hash_this_val(apr_hash_first(pool, tgt_mergeinfo_cat));
}
@@ -582,7 +582,7 @@ svn_client__get_wc_or_repos_mergeinfo(svn_mergeinfo_t *target_mergeinfo,
so we can peek into our catalog, but it ought to be the only
thing in the catalog, so we'll just fetch the first hash item. */
*target_mergeinfo =
- svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+ apr_hash_this_val(apr_hash_first(pool, tgt_mergeinfo_cat));
}
@@ -623,7 +623,7 @@ svn_client__get_wc_or_repos_mergeinfo_catalog(
a URL and without that we cannot get accurate mergeinfo for
TARGET_WCPATH. */
SVN_ERR(svn_wc__node_get_origin(NULL, &target_rev, &repos_relpath,
- &repos_root, NULL, NULL,
+ &repos_root, NULL, NULL, NULL,
ctx->wc_ctx, local_abspath, FALSE,
scratch_pool, scratch_pool));
@@ -921,16 +921,13 @@ svn_client__elide_mergeinfo(const char *target_abspath,
{
svn_mergeinfo_t target_mergeinfo;
svn_mergeinfo_t mergeinfo = NULL;
- svn_boolean_t inherited;
- const char *walk_path;
svn_error_t *err;
/* Get the TARGET_WCPATH's explicit mergeinfo. */
- err = svn_client__get_wc_mergeinfo(&target_mergeinfo, &inherited,
- svn_mergeinfo_inherited,
+ err = svn_client__get_wc_mergeinfo(&target_mergeinfo, NULL,
+ svn_mergeinfo_explicit,
target_abspath,
- limit_abspath,
- &walk_path, FALSE,
+ NULL, NULL, FALSE,
ctx, pool, pool);
if (err)
{
@@ -950,7 +947,7 @@ svn_client__elide_mergeinfo(const char *target_abspath,
/* If TARGET_WCPATH has no explicit mergeinfo, there's nothing to
elide, we're done. */
- if (inherited || target_mergeinfo == NULL)
+ if (target_mergeinfo == NULL)
return SVN_NO_ERROR;
/* Get TARGET_WCPATH's inherited mergeinfo from the WC. */
@@ -958,7 +955,7 @@ svn_client__elide_mergeinfo(const char *target_abspath,
svn_mergeinfo_nearest_ancestor,
target_abspath,
limit_abspath,
- &walk_path, FALSE, ctx, pool, pool);
+ NULL, FALSE, ctx, pool, pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
@@ -1345,8 +1342,8 @@ filter_log_entry_with_rangelist(void *baton,
hi = apr_hash_next(hi))
{
int i;
- const char *path = svn__apr_hash_index_key(hi);
- svn_log_changed_path2_t *change = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_log_changed_path2_t *change = apr_hash_this_val(hi);
const char *target_fspath_affected;
svn_mergeinfo_t nearest_ancestor_mergeinfo;
svn_boolean_t found_this_revision = FALSE;
@@ -1430,8 +1427,8 @@ filter_log_entry_with_rangelist(void *baton,
hi2;
hi2 = apr_hash_next(hi2))
{
- const char *mergeinfo_path = svn__apr_hash_index_key(hi2);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi2);
+ const char *mergeinfo_path = apr_hash_this_key(hi2);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi2);
/* Does the mergeinfo for PATH reflect if
LOG_ENTRY->REVISION was previously merged
@@ -1608,8 +1605,8 @@ mergeinfo_relpaths_to_urls(apr_hash_t **out_mergeinfo,
for (hi = apr_hash_first(scratch_pool, mergeinfo);
hi; hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- void *val = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ void *val = apr_hash_this_val(hi);
svn_hash_sets(full_path_mergeinfo,
svn_path_url_add_component2(repos_root_url, key + 1,
@@ -1927,14 +1924,14 @@ svn_client__mergeinfo_log(svn_boolean_t finding_merged,
hi_catalog;
hi_catalog = apr_hash_next(hi_catalog))
{
- svn_mergeinfo_t subtree_mergeinfo = svn__apr_hash_index_val(hi_catalog);
+ svn_mergeinfo_t subtree_mergeinfo = apr_hash_this_val(hi_catalog);
svn_mergeinfo_t subtree_history;
svn_mergeinfo_t subtree_source_history;
svn_mergeinfo_t subtree_inheritable_mergeinfo;
svn_mergeinfo_t subtree_noninheritable_mergeinfo;
svn_mergeinfo_t merged_noninheritable;
svn_mergeinfo_t merged;
- const char *subtree_path = svn__apr_hash_index_key(hi_catalog);
+ const char *subtree_path = apr_hash_this_key(hi_catalog);
svn_boolean_t is_subtree = strcmp(subtree_path,
target_repos_relpath) != 0;
svn_pool_clear(iterpool);
@@ -2057,8 +2054,7 @@ svn_client__mergeinfo_log(svn_boolean_t finding_merged,
{
svn_rangelist_t *deleted_rangelist;
svn_rangelist_t *added_rangelist;
- svn_rangelist_t *subtree_merged_rangelist =
- svn__apr_hash_index_val(hi);
+ svn_rangelist_t *subtree_merged_rangelist = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
@@ -2134,15 +2130,14 @@ svn_client__mergeinfo_log(svn_boolean_t finding_merged,
svn_rangelist__initialize(youngest_range->end - 1,
youngest_range->end,
youngest_range->inheritable,
- scratch_pool);;
+ scratch_pool);
for (hi = apr_hash_first(scratch_pool, source_history);
hi;
hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- svn_rangelist_t *subtree_merged_rangelist =
- svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ svn_rangelist_t *subtree_merged_rangelist = apr_hash_this_val(hi);
svn_rangelist_t *intersecting_rangelist;
svn_pool_clear(iterpool);
@@ -2230,6 +2225,8 @@ svn_client_suggest_merge_sources(apr_array_header_t **suggestions,
svn_mergeinfo_catalog_t mergeinfo_cat;
svn_mergeinfo_t mergeinfo;
apr_hash_index_t *hi;
+ apr_pool_t *session_pool = svn_pool_create(pool);
+ svn_ra_session_t *ra_session;
list = apr_array_make(pool, 1, sizeof(const char *));
@@ -2248,26 +2245,32 @@ svn_client_suggest_merge_sources(apr_array_header_t **suggestions,
1. The copyfrom source.
2. All remaining merge sources (unordered).
*/
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, NULL, path_or_url,
+ NULL, peg_revision, peg_revision,
+ ctx, session_pool));
- /* ### TODO: Share ra_session batons to improve efficiency? */
SVN_ERR(get_mergeinfo(&mergeinfo_cat, &repos_root, path_or_url,
- peg_revision, FALSE, FALSE, ctx, NULL, pool, pool));
+ peg_revision, FALSE, FALSE,
+ ctx, ra_session, session_pool, session_pool));
if (mergeinfo_cat && apr_hash_count(mergeinfo_cat))
{
/* We asked only for the PATH_OR_URL's mergeinfo, not any of its
descendants. So if there is anything in the catalog it is the
mergeinfo for PATH_OR_URL. */
- mergeinfo = svn__apr_hash_index_val(apr_hash_first(pool, mergeinfo_cat));
+ mergeinfo = apr_hash_this_val(apr_hash_first(session_pool,
+ mergeinfo_cat));
}
else
{
mergeinfo = NULL;
}
+ /* ### Should we only add the last source or all copy sources back to
+ the origin? */
SVN_ERR(svn_client__get_copy_source(&copyfrom_path, &copyfrom_rev,
- path_or_url, peg_revision, ctx,
- pool, pool));
+ path_or_url, peg_revision, ra_session,
+ ctx, session_pool, session_pool));
if (copyfrom_path)
{
APR_ARRAY_PUSH(list, const char *) =
@@ -2276,9 +2279,11 @@ svn_client_suggest_merge_sources(apr_array_header_t **suggestions,
if (mergeinfo)
{
- for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
+ for (hi = apr_hash_first(session_pool, mergeinfo);
+ hi;
+ hi = apr_hash_next(hi))
{
- const char *rel_path = svn__apr_hash_index_key(hi);
+ const char *rel_path = apr_hash_this_key(hi);
if (copyfrom_path == NULL || strcmp(rel_path, copyfrom_path) != 0)
APR_ARRAY_PUSH(list, const char *) = \
@@ -2286,6 +2291,8 @@ svn_client_suggest_merge_sources(apr_array_header_t **suggestions,
}
}
+ svn_pool_destroy(session_pool);
+
*suggestions = list;
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_client/mergeinfo.h b/subversion/libsvn_client/mergeinfo.h
index 0c4cf05..1d6d524 100644
--- a/subversion/libsvn_client/mergeinfo.h
+++ b/subversion/libsvn_client/mergeinfo.h
@@ -316,7 +316,9 @@ svn_client__get_history_as_mergeinfo(svn_mergeinfo_t *mergeinfo_p,
/* Parse any explicit mergeinfo on LOCAL_ABSPATH and store it in
*MERGEINFO. If no record of any mergeinfo exists, set *MERGEINFO to NULL.
- Does not acount for inherited mergeinfo. */
+ Does not acount for inherited mergeinfo.
+
+ Allocate the result deeply in @a result_pool. */
svn_error_t *
svn_client__parse_mergeinfo(svn_mergeinfo_t *mergeinfo,
svn_wc_context_t *wc_ctx,
@@ -358,8 +360,6 @@ svn_client__record_wc_mergeinfo_catalog(apr_hash_t *result_catalog,
working copy or the nearest switched parent for an elision
destination, if none is found check the repository, otherwise check
as far as WC_ELISION_LIMIT_ABSPATH within the working copy.
- TARGET_WCPATH and WC_ELISION_LIMIT_ABSPATH, if it exists, must both be
- absolute or relative to the working directory.
Elision occurs if:
diff --git a/subversion/libsvn_client/mtcc.c b/subversion/libsvn_client/mtcc.c
new file mode 100644
index 0000000..e0fc1e9
--- /dev/null
+++ b/subversion/libsvn_client/mtcc.c
@@ -0,0 +1,1429 @@
+/*
+ * mtcc.c -- Multi Command Context implementation. This allows
+ * performing many operations without a working copy.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_dirent_uri.h"
+#include "svn_hash.h"
+#include "svn_path.h"
+#include "svn_props.h"
+#include "svn_pools.h"
+#include "svn_subst.h"
+
+#include "private/svn_client_mtcc.h"
+
+
+#include "svn_private_config.h"
+
+#include "client.h"
+
+#include <assert.h>
+
+#define SVN_PATH_IS_EMPTY(s) ((s)[0] == '\0')
+
+/* The kind of operation to perform in an mtcc_op_t */
+typedef enum mtcc_kind_t
+{
+ OP_OPEN_DIR,
+ OP_OPEN_FILE,
+ OP_ADD_DIR,
+ OP_ADD_FILE,
+ OP_DELETE
+} mtcc_kind_t;
+
+typedef struct mtcc_op_t
+{
+ const char *name; /* basename of operation */
+ mtcc_kind_t kind; /* editor operation */
+
+ apr_array_header_t *children; /* List of mtcc_op_t * */
+
+ const char *src_relpath; /* For ADD_DIR, ADD_FILE */
+ svn_revnum_t src_rev; /* For ADD_DIR, ADD_FILE */
+ svn_stream_t *src_stream; /* For ADD_FILE, OPEN_FILE */
+ svn_checksum_t *src_checksum; /* For ADD_FILE, OPEN_FILE */
+ svn_stream_t *base_stream; /* For ADD_FILE, OPEN_FILE */
+ const svn_checksum_t *base_checksum; /* For ADD_FILE, OPEN_FILE */
+
+ apr_array_header_t *prop_mods; /* For all except DELETE
+ List of svn_prop_t */
+
+ svn_boolean_t performed_stat; /* Verified kind with repository */
+} mtcc_op_t;
+
+/* Check if the mtcc doesn't contain any modifications yet */
+#define MTCC_UNMODIFIED(mtcc) \
+ ((mtcc->root_op->kind == OP_OPEN_DIR \
+ || mtcc->root_op->kind == OP_OPEN_FILE) \
+ && (mtcc->root_op->prop_mods == NULL \
+ || !mtcc->root_op->prop_mods->nelts) \
+ && (mtcc->root_op->children == NULL \
+ || !mtcc->root_op->children->nelts))
+
+struct svn_client__mtcc_t
+{
+ apr_pool_t *pool;
+ svn_revnum_t head_revision;
+ svn_revnum_t base_revision;
+
+ svn_ra_session_t *ra_session;
+ svn_client_ctx_t *ctx;
+
+ mtcc_op_t *root_op;
+};
+
+static mtcc_op_t *
+mtcc_op_create(const char *name,
+ svn_boolean_t add,
+ svn_boolean_t directory,
+ apr_pool_t *result_pool)
+{
+ mtcc_op_t *op;
+
+ op = apr_pcalloc(result_pool, sizeof(*op));
+ op->name = name ? apr_pstrdup(result_pool, name) : "";
+
+ if (add)
+ op->kind = directory ? OP_ADD_DIR : OP_ADD_FILE;
+ else
+ op->kind = directory ? OP_OPEN_DIR : OP_OPEN_FILE;
+
+ if (directory)
+ op->children = apr_array_make(result_pool, 4, sizeof(mtcc_op_t *));
+
+ op->src_rev = SVN_INVALID_REVNUM;
+
+ return op;
+}
+
+static svn_error_t *
+mtcc_op_find(mtcc_op_t **op,
+ svn_boolean_t *created,
+ const char *relpath,
+ mtcc_op_t *base_op,
+ svn_boolean_t find_existing,
+ svn_boolean_t find_deletes,
+ svn_boolean_t create_file,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *name;
+ const char *child;
+ int i;
+
+ assert(svn_relpath_is_canonical(relpath));
+ if (created)
+ *created = FALSE;
+
+ if (SVN_PATH_IS_EMPTY(relpath))
+ {
+ if (find_existing)
+ *op = base_op;
+ else
+ *op = NULL;
+
+ return SVN_NO_ERROR;
+ }
+
+ child = strchr(relpath, '/');
+
+ if (child)
+ {
+ name = apr_pstrmemdup(scratch_pool, relpath, (child-relpath));
+ child++; /* Skip '/' */
+ }
+ else
+ name = relpath;
+
+ if (!base_op->children)
+ {
+ if (!created)
+ {
+ *op = NULL;
+ return SVN_NO_ERROR;
+ }
+ else
+ return svn_error_createf(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't operate on '%s' because '%s' is not a "
+ "directory"),
+ name, base_op->name);
+ }
+
+ for (i = base_op->children->nelts-1; i >= 0 ; i--)
+ {
+ mtcc_op_t *cop;
+
+ cop = APR_ARRAY_IDX(base_op->children, i, mtcc_op_t *);
+
+ if (! strcmp(cop->name, name)
+ && (find_deletes || cop->kind != OP_DELETE))
+ {
+ return svn_error_trace(
+ mtcc_op_find(op, created, child ? child : "", cop,
+ find_existing, find_deletes, create_file,
+ result_pool, scratch_pool));
+ }
+ }
+
+ if (!created)
+ {
+ *op = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ {
+ mtcc_op_t *cop;
+
+ cop = mtcc_op_create(name, FALSE, child || !create_file, result_pool);
+
+ APR_ARRAY_PUSH(base_op->children, mtcc_op_t *) = cop;
+
+ if (!child)
+ {
+ *op = cop;
+ *created = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(
+ mtcc_op_find(op, created, child, cop, find_existing,
+ find_deletes, create_file,
+ result_pool, scratch_pool));
+ }
+}
+
+/* Gets the original repository location of RELPATH, checking things
+ like copies, moves, etc. */
+static svn_error_t *
+get_origin(svn_boolean_t *done,
+ const char **origin_relpath,
+ svn_revnum_t *rev,
+ mtcc_op_t *op,
+ const char *relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *child;
+ const char *name;
+ if (SVN_PATH_IS_EMPTY(relpath))
+ {
+ if (op->kind == OP_ADD_DIR || op->kind == OP_ADD_FILE)
+ *done = TRUE;
+ *origin_relpath = op->src_relpath
+ ? apr_pstrdup(result_pool, op->src_relpath)
+ : NULL;
+ *rev = op->src_rev;
+ return SVN_NO_ERROR;
+ }
+
+ child = strchr(relpath, '/');
+ if (child)
+ {
+ name = apr_pstrmemdup(scratch_pool, relpath, child-relpath);
+ child++; /* Skip '/' */
+ }
+ else
+ name = relpath;
+
+ if (op->children && op->children->nelts)
+ {
+ int i;
+
+ for (i = op->children->nelts-1; i >= 0; i--)
+ {
+ mtcc_op_t *cop;
+
+ cop = APR_ARRAY_IDX(op->children, i, mtcc_op_t *);
+
+ if (! strcmp(cop->name, name))
+ {
+ if (cop->kind == OP_DELETE)
+ {
+ *done = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(get_origin(done, origin_relpath, rev,
+ cop, child ? child : "",
+ result_pool, scratch_pool));
+
+ if (*origin_relpath || *done)
+ return SVN_NO_ERROR;
+
+ break;
+ }
+ }
+ }
+
+ if (op->kind == OP_ADD_DIR || op->kind == OP_ADD_FILE)
+ {
+ *done = TRUE;
+ if (op->src_relpath)
+ {
+ *origin_relpath = svn_relpath_join(op->src_relpath, relpath,
+ result_pool);
+ *rev = op->src_rev;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Obtains the original repository location for an mtcc relpath as
+ *ORIGIN_RELPATH @ *REV, if it has one. If it has not and IGNORE_ENOENT
+ is TRUE report *ORIGIN_RELPATH as NULL, otherwise return an error */
+static svn_error_t *
+mtcc_get_origin(const char **origin_relpath,
+ svn_revnum_t *rev,
+ const char *relpath,
+ svn_boolean_t ignore_enoent,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t done = FALSE;
+
+ *origin_relpath = NULL;
+ *rev = SVN_INVALID_REVNUM;
+
+ SVN_ERR(get_origin(&done, origin_relpath, rev, mtcc->root_op, relpath,
+ result_pool, scratch_pool));
+
+ if (!*origin_relpath && !done)
+ {
+ *origin_relpath = apr_pstrdup(result_pool, relpath);
+ *rev = mtcc->base_revision;
+ }
+ else if (!ignore_enoent)
+ {
+ return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+ _("No origin found for node at '%s'"),
+ relpath);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ apr_pool_t *mtcc_pool;
+
+ mtcc_pool = svn_pool_create(result_pool);
+
+ *mtcc = apr_pcalloc(mtcc_pool, sizeof(**mtcc));
+ (*mtcc)->pool = mtcc_pool;
+
+ (*mtcc)->root_op = mtcc_op_create(NULL, FALSE, TRUE, mtcc_pool);
+
+ (*mtcc)->ctx = ctx;
+
+ SVN_ERR(svn_client_open_ra_session2(&(*mtcc)->ra_session, anchor_url,
+ NULL /* wri_abspath */, ctx,
+ mtcc_pool, scratch_pool));
+
+ SVN_ERR(svn_ra_get_latest_revnum((*mtcc)->ra_session, &(*mtcc)->head_revision,
+ scratch_pool));
+
+ if (SVN_IS_VALID_REVNUM(base_revision))
+ (*mtcc)->base_revision = base_revision;
+ else
+ (*mtcc)->base_revision = (*mtcc)->head_revision;
+
+ if ((*mtcc)->base_revision > (*mtcc)->head_revision)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld (HEAD is %ld)"),
+ base_revision, (*mtcc)->head_revision);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+update_copy_src(mtcc_op_t *op,
+ const char *add_relpath,
+ apr_pool_t *result_pool)
+{
+ int i;
+
+ if (op->src_relpath)
+ op->src_relpath = svn_relpath_join(add_relpath, op->src_relpath,
+ result_pool);
+
+ if (!op->children)
+ return SVN_NO_ERROR;
+
+ for (i = 0; i < op->children->nelts; i++)
+ {
+ mtcc_op_t *cop;
+
+ cop = APR_ARRAY_IDX(op->children, i, mtcc_op_t *);
+
+ SVN_ERR(update_copy_src(cop, add_relpath, result_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+mtcc_reparent(const char *new_anchor_url,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool)
+{
+ const char *session_url;
+ const char *up;
+
+ SVN_ERR(svn_ra_get_session_url(mtcc->ra_session, &session_url,
+ scratch_pool));
+
+ up = svn_uri_skip_ancestor(new_anchor_url, session_url, scratch_pool);
+
+ if (! up)
+ {
+ return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+ _("'%s' is not an ancestor of '%s'"),
+ new_anchor_url, session_url);
+ }
+ else if (!*up)
+ {
+ return SVN_NO_ERROR; /* Same url */
+ }
+
+ /* Update copy origins recursively...:( */
+ SVN_ERR(update_copy_src(mtcc->root_op, up, mtcc->pool));
+
+ SVN_ERR(svn_ra_reparent(mtcc->ra_session, new_anchor_url, scratch_pool));
+
+ /* Create directory open operations for new ancestors */
+ while (*up)
+ {
+ mtcc_op_t *root_op;
+
+ mtcc->root_op->name = svn_relpath_basename(up, mtcc->pool);
+ up = svn_relpath_dirname(up, scratch_pool);
+
+ root_op = mtcc_op_create(NULL, FALSE, TRUE, mtcc->pool);
+
+ APR_ARRAY_PUSH(root_op->children, mtcc_op_t *) = mtcc->root_op;
+
+ mtcc->root_op = root_op;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Check if it is safe to create a new node at NEW_RELPATH. Return a proper
+ error if it is not */
+static svn_error_t *
+mtcc_verify_create(svn_client__mtcc_t *mtcc,
+ const char *new_relpath,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind;
+
+ if (*new_relpath || !MTCC_UNMODIFIED(mtcc))
+ {
+ mtcc_op_t *op;
+
+ SVN_ERR(mtcc_op_find(&op, NULL, new_relpath, mtcc->root_op, TRUE, FALSE,
+ FALSE, mtcc->pool, scratch_pool));
+
+ if (op)
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Path '%s' already exists"),
+ new_relpath);
+
+ SVN_ERR(mtcc_op_find(&op, NULL, new_relpath, mtcc->root_op, TRUE, TRUE,
+ FALSE, mtcc->pool, scratch_pool));
+
+ if (op)
+ return SVN_NO_ERROR; /* Node is explicitly deleted. We can replace */
+ }
+
+ /* mod_dav_svn used to allow overwriting existing directories. Let's hide
+ that for users of this api */
+ SVN_ERR(svn_client__mtcc_check_path(&kind, new_relpath, FALSE,
+ mtcc, scratch_pool));
+
+ if (kind != svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Path '%s' already exists"),
+ new_relpath);
+
+ return SVN_NO_ERROR;
+}
+
+
+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)
+{
+ mtcc_op_t *op;
+ svn_boolean_t created;
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath) && src_stream);
+
+ SVN_ERR(mtcc_verify_create(mtcc, relpath, scratch_pool));
+
+ if (SVN_PATH_IS_EMPTY(relpath) && MTCC_UNMODIFIED(mtcc))
+ {
+ /* Turn the root operation into a file addition */
+ op = mtcc->root_op;
+ }
+ else
+ {
+ SVN_ERR(mtcc_op_find(&op, &created, relpath, mtcc->root_op, FALSE, FALSE,
+ TRUE, mtcc->pool, scratch_pool));
+
+ if (!op || !created)
+ {
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't add file at '%s'"),
+ relpath);
+ }
+ }
+
+ op->kind = OP_ADD_FILE;
+ op->src_stream = src_stream;
+ op->src_checksum = src_checksum ? svn_checksum_dup(src_checksum, mtcc->pool)
+ : NULL;
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ mtcc_op_t *op;
+ svn_boolean_t created;
+ svn_node_kind_t kind;
+
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(src_relpath)
+ && svn_relpath_is_canonical(dst_relpath));
+
+ if (! SVN_IS_VALID_REVNUM(revision))
+ revision = mtcc->head_revision;
+ else if (revision > mtcc->head_revision)
+ {
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"), revision);
+ }
+
+ SVN_ERR(mtcc_verify_create(mtcc, dst_relpath, scratch_pool));
+
+ /* Subversion requires the kind of a copy */
+ SVN_ERR(svn_ra_check_path(mtcc->ra_session, src_relpath, revision, &kind,
+ scratch_pool));
+
+ if (kind != svn_node_dir && kind != svn_node_file)
+ {
+ return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+ _("Path '%s' not found in revision %ld"),
+ src_relpath, revision);
+ }
+
+ SVN_ERR(mtcc_op_find(&op, &created, dst_relpath, mtcc->root_op, FALSE, FALSE,
+ (kind == svn_node_file), mtcc->pool, scratch_pool));
+
+ if (!op || !created)
+ {
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't add node at '%s'"),
+ dst_relpath);
+ }
+
+ op->kind = (kind == svn_node_file) ? OP_ADD_FILE : OP_ADD_DIR;
+ op->src_relpath = apr_pstrdup(mtcc->pool, src_relpath);
+ op->src_rev = revision;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client__mtcc_add_delete(const char *relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool)
+{
+ mtcc_op_t *op;
+ svn_boolean_t created;
+ svn_node_kind_t kind;
+
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
+
+ SVN_ERR(svn_client__mtcc_check_path(&kind, relpath, FALSE,
+ mtcc, scratch_pool));
+
+ if (kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+ _("Can't delete node at '%s' as it "
+ "does not exist"),
+ relpath);
+
+ if (SVN_PATH_IS_EMPTY(relpath) && MTCC_UNMODIFIED(mtcc))
+ {
+ /* Turn root operation into delete */
+ op = mtcc->root_op;
+ }
+ else
+ {
+ SVN_ERR(mtcc_op_find(&op, &created, relpath, mtcc->root_op, FALSE, TRUE,
+ TRUE, mtcc->pool, scratch_pool));
+
+ if (!op || !created)
+ {
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't delete node at '%s'"),
+ relpath);
+ }
+ }
+
+ op->kind = OP_DELETE;
+ op->children = NULL;
+ op->prop_mods = NULL;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client__mtcc_add_mkdir(const char *relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool)
+{
+ mtcc_op_t *op;
+ svn_boolean_t created;
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
+
+ SVN_ERR(mtcc_verify_create(mtcc, relpath, scratch_pool));
+
+ if (SVN_PATH_IS_EMPTY(relpath) && MTCC_UNMODIFIED(mtcc))
+ {
+ /* Turn the root of the operation in an MKDIR */
+ mtcc->root_op->kind = OP_ADD_DIR;
+
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(mtcc_op_find(&op, &created, relpath, mtcc->root_op, FALSE, FALSE,
+ FALSE, mtcc->pool, scratch_pool));
+
+ if (!op || !created)
+ {
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't create directory at '%s'"),
+ relpath);
+ }
+
+ op->kind = OP_ADD_DIR;
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ const char *origin_relpath;
+ svn_revnum_t origin_rev;
+
+ SVN_ERR(mtcc_get_origin(&origin_relpath, &origin_rev,
+ src_relpath, FALSE, mtcc,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_client__mtcc_add_copy(src_relpath, mtcc->base_revision,
+ dst_relpath, mtcc, scratch_pool));
+ SVN_ERR(svn_client__mtcc_add_delete(src_relpath, mtcc, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for mtcc_prop_getter */
+struct mtcc_prop_get_baton
+{
+ svn_client__mtcc_t *mtcc;
+ const char *relpath;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+};
+
+/* Implements svn_wc_canonicalize_svn_prop_get_file_t */
+static svn_error_t *
+mtcc_prop_getter(const svn_string_t **mime_type,
+ svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *pool)
+{
+ struct mtcc_prop_get_baton *mpgb = baton;
+ const char *origin_relpath;
+ svn_revnum_t origin_rev;
+ apr_hash_t *props = NULL;
+
+ mtcc_op_t *op;
+
+ if (mime_type)
+ *mime_type = NULL;
+
+ /* Check if we have the information locally */
+ SVN_ERR(mtcc_op_find(&op, NULL, mpgb->relpath, mpgb->mtcc->root_op, TRUE,
+ FALSE, FALSE, pool, pool));
+
+ if (op)
+ {
+ if (mime_type)
+ {
+ int i;
+
+ for (i = 0; op->prop_mods && i < op->prop_mods->nelts; i++)
+ {
+ const svn_prop_t *mod = &APR_ARRAY_IDX(op->prop_mods, i,
+ svn_prop_t);
+
+ if (! strcmp(mod->name, SVN_PROP_MIME_TYPE))
+ {
+ *mime_type = svn_string_dup(mod->value, pool);
+ mime_type = NULL;
+ }
+ }
+ }
+
+ if (stream && op->src_stream)
+ {
+ svn_stream_mark_t *mark;
+ svn_error_t *err;
+
+ /* Is the source stream capable of being read multiple times? */
+ err = svn_stream_mark(op->src_stream, &mark, pool);
+
+ if (err && err->apr_err != SVN_ERR_STREAM_SEEK_NOT_SUPPORTED)
+ return svn_error_trace(err);
+ svn_error_clear(err);
+
+ if (!err)
+ {
+ err = svn_stream_copy3(svn_stream_disown(op->src_stream, pool),
+ svn_stream_disown(stream, pool),
+ mpgb->cancel_func, mpgb->cancel_baton,
+ pool);
+
+ SVN_ERR(svn_error_compose_create(
+ err,
+ svn_stream_seek(op->src_stream, mark)));
+ }
+ /* else: ### Create tempfile? */
+
+ stream = NULL; /* Stream is handled */
+ }
+ }
+
+ if (!stream && !mime_type)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(mtcc_get_origin(&origin_relpath, &origin_rev, mpgb->relpath, TRUE,
+ mpgb->mtcc, pool, pool));
+
+ if (!origin_relpath)
+ return SVN_NO_ERROR; /* Nothing to fetch at repository */
+
+ SVN_ERR(svn_ra_get_file(mpgb->mtcc->ra_session, origin_relpath, origin_rev,
+ stream, NULL, mime_type ? &props : NULL, pool));
+
+ if (mime_type && props)
+ *mime_type = svn_hash_gets(props, SVN_PROP_MIME_TYPE);
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ mtcc_op_t *op;
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
+
+ if (! svn_prop_name_is_valid(propname))
+ return svn_error_createf(SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
+ _("Bad property name: '%s'"), propname);
+
+ if (svn_prop_is_known_svn_rev_prop(propname))
+ return svn_error_createf(SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
+ _("Revision property '%s' not allowed "
+ "in this context"), propname);
+
+ if (svn_property_kind2(propname) == svn_prop_wc_kind)
+ return svn_error_createf(SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
+ _("'%s' is a wcprop, thus not accessible "
+ "to clients"), propname);
+
+ if (!skip_checks && svn_prop_needs_translation(propname))
+ {
+ svn_string_t *translated_value;
+ SVN_ERR_W(svn_subst_translate_string2(&translated_value, NULL,
+ NULL, propval,
+ NULL, FALSE,
+ scratch_pool, scratch_pool),
+ _("Error normalizing property value"));
+
+ propval = translated_value;
+ }
+
+ if (propval && svn_prop_is_svn_prop(propname))
+ {
+ struct mtcc_prop_get_baton mpbg;
+ svn_node_kind_t kind;
+ SVN_ERR(svn_client__mtcc_check_path(&kind, relpath, FALSE, mtcc,
+ scratch_pool));
+
+ mpbg.mtcc = mtcc;
+ mpbg.relpath = relpath;
+ mpbg.cancel_func = mtcc->ctx->cancel_func;
+ mpbg.cancel_baton = mtcc->ctx->cancel_baton;
+
+ SVN_ERR(svn_wc_canonicalize_svn_prop(&propval, propname, propval,
+ relpath, kind, skip_checks,
+ mtcc_prop_getter, &mpbg,
+ scratch_pool));
+ }
+
+ if (SVN_PATH_IS_EMPTY(relpath) && MTCC_UNMODIFIED(mtcc))
+ {
+ svn_node_kind_t kind;
+
+ /* Probing the node for an unmodified root will fix the node type to
+ a file if necessary */
+
+ SVN_ERR(svn_client__mtcc_check_path(&kind, relpath, FALSE,
+ mtcc, scratch_pool));
+
+ if (kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't set properties at not existing '%s'"),
+ relpath);
+
+ op = mtcc->root_op;
+ }
+ else
+ {
+ SVN_ERR(mtcc_op_find(&op, NULL, relpath, mtcc->root_op, TRUE, FALSE,
+ FALSE, mtcc->pool, scratch_pool));
+
+ if (!op)
+ {
+ svn_node_kind_t kind;
+ svn_boolean_t created;
+
+ /* ### TODO: Check if this node is within a newly copied directory,
+ and update origin values accordingly */
+
+ SVN_ERR(svn_client__mtcc_check_path(&kind, relpath, FALSE,
+ mtcc, scratch_pool));
+
+ if (kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't set properties at not existing '%s'"),
+ relpath);
+
+ SVN_ERR(mtcc_op_find(&op, &created, relpath, mtcc->root_op, TRUE, FALSE,
+ (kind != svn_node_dir),
+ mtcc->pool, scratch_pool));
+
+ SVN_ERR_ASSERT(op != NULL);
+ }
+ }
+
+ if (!op->prop_mods)
+ op->prop_mods = apr_array_make(mtcc->pool, 4, sizeof(svn_prop_t));
+
+ {
+ svn_prop_t propchange;
+ propchange.name = apr_pstrdup(mtcc->pool, propname);
+
+ if (propval)
+ propchange.value = svn_string_dup(propval, mtcc->pool);
+ else
+ propchange.value = NULL;
+
+ APR_ARRAY_PUSH(op->prop_mods, svn_prop_t) = propchange;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ mtcc_op_t *op;
+ svn_boolean_t created;
+ svn_node_kind_t kind;
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath) && src_stream);
+
+ SVN_ERR(svn_client__mtcc_check_path(&kind, relpath, FALSE,
+ mtcc, scratch_pool));
+
+ if (kind != svn_node_file)
+ return svn_error_createf(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't update '%s' because it is not a file"),
+ relpath);
+
+ SVN_ERR(mtcc_op_find(&op, &created, relpath, mtcc->root_op, TRUE, FALSE,
+ TRUE, mtcc->pool, scratch_pool));
+
+ if (!op
+ || (op->kind != OP_OPEN_FILE && op->kind != OP_ADD_FILE)
+ || (op->src_stream != NULL))
+ {
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Can't update file at '%s'"), relpath);
+ }
+
+ op->src_stream = src_stream;
+ op->src_checksum = src_checksum ? svn_checksum_dup(src_checksum, mtcc->pool)
+ : NULL;
+
+ op->base_stream = base_stream;
+ op->base_checksum = base_checksum ? svn_checksum_dup(base_checksum,
+ mtcc->pool)
+ : NULL;
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ const char *origin_relpath;
+ svn_revnum_t origin_rev;
+ mtcc_op_t *op;
+
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
+
+ if (SVN_PATH_IS_EMPTY(relpath) && MTCC_UNMODIFIED(mtcc)
+ && !mtcc->root_op->performed_stat)
+ {
+ /* We know nothing about the root. Perhaps it is a file? */
+ SVN_ERR(svn_ra_check_path(mtcc->ra_session, "", mtcc->base_revision,
+ kind, scratch_pool));
+
+ mtcc->root_op->performed_stat = TRUE;
+ if (*kind == svn_node_file)
+ {
+ mtcc->root_op->kind = OP_OPEN_FILE;
+ mtcc->root_op->children = NULL;
+ }
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(mtcc_op_find(&op, NULL, relpath, mtcc->root_op, TRUE, FALSE,
+ FALSE, mtcc->pool, scratch_pool));
+
+ if (!op || (check_repository && !op->performed_stat))
+ {
+ SVN_ERR(mtcc_get_origin(&origin_relpath, &origin_rev,
+ relpath, TRUE, mtcc,
+ scratch_pool, scratch_pool));
+
+ if (!origin_relpath)
+ *kind = svn_node_none;
+ else
+ SVN_ERR(svn_ra_check_path(mtcc->ra_session, origin_relpath,
+ origin_rev, kind, scratch_pool));
+
+ if (op && *kind == svn_node_dir)
+ {
+ if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
+ op->performed_stat = TRUE;
+ else if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
+ return svn_error_createf(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't perform file operation "
+ "on '%s' as it is not a file"),
+ relpath);
+ }
+ else if (op && *kind == svn_node_file)
+ {
+ if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
+ op->performed_stat = TRUE;
+ else if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
+ return svn_error_createf(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't perform directory operation "
+ "on '%s' as it is not a directory"),
+ relpath);
+ }
+ else if (op && (op->kind == OP_OPEN_DIR || op->kind == OP_OPEN_FILE))
+ {
+ return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+ _("Can't open '%s' as it does not exist"),
+ relpath);
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+ /* op != NULL */
+ if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
+ {
+ *kind = svn_node_dir;
+ return SVN_NO_ERROR;
+ }
+ else if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
+ {
+ *kind = svn_node_file;
+ return SVN_NO_ERROR;
+ }
+ SVN_ERR_MALFUNCTION(); /* No other kinds defined as delete is filtered */
+}
+
+static svn_error_t *
+commit_properties(const svn_delta_editor_t *editor,
+ const mtcc_op_t *op,
+ void *node_baton,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_pool_t *iterpool;
+
+ if (!op->prop_mods || op->prop_mods->nelts == 0)
+ return SVN_NO_ERROR;
+
+ iterpool = svn_pool_create(scratch_pool);
+ for (i = 0; i < op->prop_mods->nelts; i++)
+ {
+ const svn_prop_t *mod = &APR_ARRAY_IDX(op->prop_mods, i, svn_prop_t);
+
+ svn_pool_clear(iterpool);
+
+ if (op->kind == OP_ADD_DIR || op->kind == OP_OPEN_DIR)
+ SVN_ERR(editor->change_dir_prop(node_baton, mod->name, mod->value,
+ iterpool));
+ else if (op->kind == OP_ADD_FILE || op->kind == OP_OPEN_FILE)
+ SVN_ERR(editor->change_file_prop(node_baton, mod->name, mod->value,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Handles updating a file to a delta editor and then closes it */
+static svn_error_t *
+commit_file(const svn_delta_editor_t *editor,
+ mtcc_op_t *op,
+ void *file_baton,
+ const char *session_url,
+ const char *relpath,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ const char *text_checksum = NULL;
+ svn_checksum_t *src_checksum = op->src_checksum;
+ SVN_ERR(commit_properties(editor, op, file_baton, scratch_pool));
+
+ if (op->src_stream)
+ {
+ const char *base_checksum = NULL;
+ apr_pool_t *txdelta_pool = scratch_pool;
+ svn_txdelta_window_handler_t window_handler;
+ void *handler_baton;
+ svn_stream_t *src_stream = op->src_stream;
+
+ if (op->base_checksum && op->base_checksum->kind == svn_checksum_md5)
+ base_checksum = svn_checksum_to_cstring(op->base_checksum, scratch_pool);
+
+ /* ### TODO: Future enhancement: Allocate in special pool and send
+ files after the true edit operation, like a wc commit */
+ SVN_ERR(editor->apply_textdelta(file_baton, base_checksum, txdelta_pool,
+ &window_handler, &handler_baton));
+
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+
+ notify = svn_wc_create_notify_url(
+ svn_path_url_add_component2(session_url, relpath,
+ scratch_pool),
+ svn_wc_notify_commit_postfix_txdelta,
+ scratch_pool);
+
+ notify->path = relpath;
+ notify->kind = svn_node_file;
+
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
+ }
+
+ if (window_handler != svn_delta_noop_window_handler)
+ {
+ if (!src_checksum || src_checksum->kind != svn_checksum_md5)
+ src_stream = svn_stream_checksummed2(src_stream, &src_checksum, NULL,
+ svn_checksum_md5,
+ TRUE, scratch_pool);
+
+ if (!op->base_stream)
+ SVN_ERR(svn_txdelta_send_stream(src_stream,
+ window_handler, handler_baton, NULL,
+ scratch_pool));
+ else
+ SVN_ERR(svn_txdelta_run(op->base_stream, src_stream,
+ window_handler, handler_baton,
+ svn_checksum_md5, NULL,
+ ctx->cancel_func, ctx->cancel_baton,
+ scratch_pool, scratch_pool));
+ }
+
+ SVN_ERR(svn_stream_close(src_stream));
+ if (op->base_stream)
+ SVN_ERR(svn_stream_close(op->base_stream));
+ }
+
+ if (src_checksum && src_checksum->kind == svn_checksum_md5)
+ text_checksum = svn_checksum_to_cstring(src_checksum, scratch_pool);
+
+ return svn_error_trace(editor->close_file(file_baton, text_checksum,
+ scratch_pool));
+}
+
+/* Handles updating a directory to a delta editor and then closes it */
+static svn_error_t *
+commit_directory(const svn_delta_editor_t *editor,
+ mtcc_op_t *op,
+ const char *relpath,
+ svn_revnum_t base_rev,
+ void *dir_baton,
+ const char *session_url,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(commit_properties(editor, op, dir_baton, scratch_pool));
+
+ if (op->children && op->children->nelts > 0)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ for (i = 0; i < op->children->nelts; i++)
+ {
+ mtcc_op_t *cop;
+ const char * child_relpath;
+ void *child_baton;
+
+ cop = APR_ARRAY_IDX(op->children, i, mtcc_op_t *);
+
+ svn_pool_clear(iterpool);
+
+ if (ctx->cancel_func)
+ SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
+
+ child_relpath = svn_relpath_join(relpath, cop->name, iterpool);
+
+ switch (cop->kind)
+ {
+ case OP_DELETE:
+ SVN_ERR(editor->delete_entry(child_relpath, base_rev,
+ dir_baton, iterpool));
+ break;
+
+ case OP_ADD_DIR:
+ SVN_ERR(editor->add_directory(child_relpath, dir_baton,
+ cop->src_relpath
+ ? svn_path_url_add_component2(
+ session_url,
+ cop->src_relpath,
+ iterpool)
+ : NULL,
+ cop->src_rev,
+ iterpool, &child_baton));
+ SVN_ERR(commit_directory(editor, cop, child_relpath,
+ SVN_INVALID_REVNUM, child_baton,
+ session_url, ctx, iterpool));
+ break;
+ case OP_OPEN_DIR:
+ SVN_ERR(editor->open_directory(child_relpath, dir_baton,
+ base_rev, iterpool, &child_baton));
+ SVN_ERR(commit_directory(editor, cop, child_relpath,
+ base_rev, child_baton,
+ session_url, ctx, iterpool));
+ break;
+
+ case OP_ADD_FILE:
+ SVN_ERR(editor->add_file(child_relpath, dir_baton,
+ cop->src_relpath
+ ? svn_path_url_add_component2(
+ session_url,
+ cop->src_relpath,
+ iterpool)
+ : NULL,
+ cop->src_rev,
+ iterpool, &child_baton));
+ SVN_ERR(commit_file(editor, cop, child_baton,
+ session_url, child_relpath, ctx, iterpool));
+ break;
+ case OP_OPEN_FILE:
+ SVN_ERR(editor->open_file(child_relpath, dir_baton, base_rev,
+ iterpool, &child_baton));
+ SVN_ERR(commit_file(editor, cop, child_baton,
+ session_url, child_relpath, ctx, iterpool));
+ break;
+
+ default:
+ SVN_ERR_MALFUNCTION();
+ }
+ }
+ }
+
+ return svn_error_trace(editor->close_directory(dir_baton, scratch_pool));
+}
+
+
+/* Helper function to recursively create svn_client_commit_item3_t items
+ to provide to the log message callback */
+static svn_error_t *
+add_commit_items(mtcc_op_t *op,
+ const char *session_url,
+ const char *url,
+ apr_array_header_t *commit_items,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if ((op->kind != OP_OPEN_DIR && op->kind != OP_OPEN_FILE)
+ || (op->prop_mods && op->prop_mods->nelts)
+ || (op->src_stream))
+ {
+ svn_client_commit_item3_t *item;
+
+ item = svn_client_commit_item3_create(result_pool);
+
+ item->path = NULL;
+ if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
+ item->kind = svn_node_dir;
+ else if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
+ item->kind = svn_node_file;
+ else
+ item->kind = svn_node_unknown;
+
+ item->url = apr_pstrdup(result_pool, url);
+ item->session_relpath = svn_uri_skip_ancestor(session_url, item->url,
+ result_pool);
+
+ if (op->src_relpath)
+ {
+ item->copyfrom_url = svn_path_url_add_component2(session_url,
+ op->src_relpath,
+ result_pool);
+ item->copyfrom_rev = op->src_rev;
+ item->state_flags |= SVN_CLIENT_COMMIT_ITEM_IS_COPY;
+ }
+ else
+ item->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ if (op->kind == OP_ADD_DIR || op->kind == OP_ADD_FILE)
+ item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
+ else if (op->kind == OP_DELETE)
+ item->state_flags = SVN_CLIENT_COMMIT_ITEM_DELETE;
+ /* else item->state_flags = 0; */
+
+ if (op->prop_mods && op->prop_mods->nelts)
+ item->state_flags |= SVN_CLIENT_COMMIT_ITEM_PROP_MODS;
+
+ if (op->src_stream)
+ item->state_flags |= SVN_CLIENT_COMMIT_ITEM_TEXT_MODS;
+
+ APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
+ }
+
+ if (op->children && op->children->nelts)
+ {
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ for (i = 0; i < op->children->nelts; i++)
+ {
+ mtcc_op_t *cop;
+ const char * child_url;
+
+ cop = APR_ARRAY_IDX(op->children, i, mtcc_op_t *);
+
+ svn_pool_clear(iterpool);
+
+ child_url = svn_path_url_add_component2(url, cop->name, iterpool);
+
+ SVN_ERR(add_commit_items(cop, session_url, child_url, commit_items,
+ result_pool, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ const svn_delta_editor_t *editor;
+ void *edit_baton;
+ void *root_baton;
+ apr_hash_t *commit_revprops;
+ svn_node_kind_t kind;
+ svn_error_t *err;
+ const char *session_url;
+ const char *log_msg;
+
+ if (MTCC_UNMODIFIED(mtcc))
+ {
+ /* No changes -> no revision. Easy out */
+ svn_pool_destroy(mtcc->pool);
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_ra_get_session_url(mtcc->ra_session, &session_url, scratch_pool));
+
+ if (mtcc->root_op->kind != OP_OPEN_DIR)
+ {
+ const char *name;
+
+ svn_uri_split(&session_url, &name, session_url, scratch_pool);
+
+ if (*name)
+ {
+ SVN_ERR(mtcc_reparent(session_url, mtcc, scratch_pool));
+
+ SVN_ERR(svn_ra_reparent(mtcc->ra_session, session_url, scratch_pool));
+ }
+ }
+
+ /* Create new commit items and add them to the array. */
+ if (SVN_CLIENT__HAS_LOG_MSG_FUNC(mtcc->ctx))
+ {
+ svn_client_commit_item3_t *item;
+ const char *tmp_file;
+ apr_array_header_t *commit_items
+ = apr_array_make(scratch_pool, 32, sizeof(item));
+
+ SVN_ERR(add_commit_items(mtcc->root_op, session_url, session_url,
+ commit_items, scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_client__get_log_msg(&log_msg, &tmp_file, commit_items,
+ mtcc->ctx, scratch_pool));
+
+ if (! log_msg)
+ return SVN_NO_ERROR;
+ }
+ else
+ log_msg = "";
+
+ SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
+ log_msg, mtcc->ctx, scratch_pool));
+
+ /* Ugly corner case: The ra session might have died while we were waiting
+ for the callback */
+
+ err = svn_ra_check_path(mtcc->ra_session, "", mtcc->base_revision, &kind,
+ scratch_pool);
+
+ if (err)
+ {
+ svn_error_t *err2 = svn_client_open_ra_session2(&mtcc->ra_session,
+ session_url,
+ NULL, mtcc->ctx,
+ mtcc->pool,
+ scratch_pool);
+
+ if (err2)
+ {
+ svn_pool_destroy(mtcc->pool);
+ return svn_error_trace(svn_error_compose_create(err, err2));
+ }
+ svn_error_clear(err);
+
+ SVN_ERR(svn_ra_check_path(mtcc->ra_session, "",
+ mtcc->base_revision, &kind, scratch_pool));
+ }
+
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't commit to '%s' because it "
+ "is not a directory"),
+ session_url);
+
+ /* Beware that the editor object must not live longer than the MTCC.
+ Otherwise, txn objects etc. in EDITOR may live longer than their
+ respective FS objects. So, we can't use SCRATCH_POOL here. */
+ SVN_ERR(svn_ra_get_commit_editor3(mtcc->ra_session, &editor, &edit_baton,
+ commit_revprops,
+ commit_callback, commit_baton,
+ NULL /* lock_tokens */,
+ FALSE /* keep_locks */,
+ mtcc->pool));
+
+ err = editor->open_root(edit_baton, mtcc->base_revision, scratch_pool, &root_baton);
+
+ if (!err)
+ err = commit_directory(editor, mtcc->root_op, "", mtcc->base_revision,
+ root_baton, session_url, mtcc->ctx, scratch_pool);
+
+ if (!err)
+ {
+ if (mtcc->ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(session_url,
+ svn_wc_notify_commit_finalizing,
+ scratch_pool);
+ mtcc->ctx->notify_func2(mtcc->ctx->notify_baton2, notify,
+ scratch_pool);
+ }
+ SVN_ERR(editor->close_edit(edit_baton, scratch_pool));
+ }
+ else
+ err = svn_error_compose_create(err,
+ editor->abort_edit(edit_baton, scratch_pool));
+
+ svn_pool_destroy(mtcc->pool);
+
+ return svn_error_trace(err);
+}
diff --git a/subversion/libsvn_client/patch.c b/subversion/libsvn_client/patch.c
index b7fbf06..6d8d0a4 100644
--- a/subversion/libsvn_client/patch.c
+++ b/subversion/libsvn_client/patch.c
@@ -48,6 +48,7 @@
#include "private/svn_dep_compat.h"
#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
+#include "private/svn_sorts_private.h"
typedef struct hunk_info_t {
/* The hunk. */
@@ -208,9 +209,6 @@ typedef struct patch_target_t {
/* True if the target had to be skipped for some reason. */
svn_boolean_t skipped;
- /* True if the target has been filtered by the patch callback. */
- svn_boolean_t filtered;
-
/* True if at least one hunk was rejected. */
svn_boolean_t had_rejects;
@@ -232,6 +230,10 @@ typedef struct patch_target_t {
* (i.e. a new file was added on top locally deleted node). */
svn_boolean_t replaced;
+ /* Set if the target is supposed to be moved by the patch.
+ * This applies to --git diffs which carry "rename from/to" headers. */
+ const char *move_target_abspath;
+
/* True if the target has the executable bit set. */
svn_boolean_t executable;
@@ -321,7 +323,8 @@ obtain_eol_and_keywords_for_file(apr_hash_t **keywords,
const char *rev_str;
const char *author;
const char *url;
- const char *root_url;
+ const char *repos_root_url;
+ const char *repos_relpath;
SVN_ERR(svn_wc__node_get_changed_info(&changed_rev,
&changed_date,
@@ -330,15 +333,17 @@ obtain_eol_and_keywords_for_file(apr_hash_t **keywords,
scratch_pool,
scratch_pool));
rev_str = apr_psprintf(scratch_pool, "%ld", changed_rev);
- SVN_ERR(svn_wc__node_get_url(&url, wc_ctx,
- local_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_wc__node_get_repos_info(NULL, NULL, &root_url, NULL,
+ SVN_ERR(svn_wc__node_get_repos_info(NULL, &repos_relpath, &repos_root_url,
+ NULL,
wc_ctx, local_abspath,
scratch_pool, scratch_pool));
+ url = svn_path_url_add_component2(repos_root_url, repos_relpath,
+ scratch_pool);
+
SVN_ERR(svn_subst_build_keywords3(keywords,
keywords_val->data,
- rev_str, url, root_url, changed_date,
+ rev_str, url, repos_root_url,
+ changed_date,
author, result_pool));
}
@@ -481,6 +486,8 @@ resolve_target_path(patch_target_t *target,
SVN_ERR(svn_wc__node_was_moved_away(&moved_to_abspath, NULL,
wc_ctx, target->local_abspath,
result_pool, scratch_pool));
+ /* ### BUG: moved_to_abspath contains the target where the op-root was
+ ### moved to... not the target itself! */
if (moved_to_abspath)
{
target->local_abspath = moved_to_abspath;
@@ -942,6 +949,12 @@ choose_target_filename(const svn_patch_t *patch)
if (strcmp(patch->new_filename, "/dev/null") == 0)
return patch->old_filename;
+ /* If the patch renames the target, use the old name while
+ * applying hunks. The target will be renamed to the new name
+ * after hunks have been applied. */
+ if (patch->operation == svn_diff_op_moved)
+ return patch->old_filename;
+
old = svn_path_component_count(patch->old_filename);
new = svn_path_component_count(patch->new_filename);
@@ -991,7 +1004,7 @@ init_patch_target(patch_target_t **patch_target,
hi;
hi = apr_hash_next(hi))
{
- svn_prop_patch_t *prop_patch = svn__apr_hash_index_val(hi);
+ svn_prop_patch_t *prop_patch = apr_hash_this_val(hi);
if (! has_prop_changes)
has_prop_changes = prop_patch->hunks->nelts > 0;
else
@@ -1021,6 +1034,7 @@ init_patch_target(patch_target_t **patch_target,
SVN_ERR(resolve_target_path(target, choose_target_filename(patch),
wcroot_abspath, strip_count, prop_changes_only,
wc_ctx, result_pool, scratch_pool));
+ *patch_target = target;
if (! target->skipped)
{
const char *diff_header;
@@ -1079,6 +1093,64 @@ init_patch_target(patch_target_t **patch_target,
target->added = TRUE;
else if (patch->operation == svn_diff_op_deleted)
target->deleted = TRUE;
+ else if (patch->operation == svn_diff_op_moved)
+ {
+ const char *move_target_path;
+ const char *move_target_relpath;
+ svn_boolean_t under_root;
+ svn_node_kind_t kind_on_disk;
+ svn_node_kind_t wc_kind;
+
+ move_target_path = svn_dirent_internal_style(patch->new_filename,
+ scratch_pool);
+
+ if (strip_count > 0)
+ SVN_ERR(strip_path(&move_target_path, move_target_path,
+ strip_count, scratch_pool, scratch_pool));
+
+ if (svn_dirent_is_absolute(move_target_path))
+ {
+ move_target_relpath = svn_dirent_is_child(wcroot_abspath,
+ move_target_path,
+ scratch_pool);
+ if (! move_target_relpath)
+ {
+ /* The move target path is either outside of the working
+ * copy or it is the working copy itself. Skip it. */
+ target->skipped = TRUE;
+ target->local_abspath = NULL;
+ return SVN_NO_ERROR;
+ }
+ }
+ else
+ move_target_relpath = move_target_path;
+
+ /* Make sure the move target path is secure to use. */
+ SVN_ERR(svn_dirent_is_under_root(&under_root,
+ &target->move_target_abspath,
+ wcroot_abspath,
+ move_target_relpath, result_pool));
+ if (! under_root)
+ {
+ /* The target path is outside of the working copy. Skip it. */
+ target->skipped = TRUE;
+ target->local_abspath = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_io_check_path(target->move_target_abspath,
+ &kind_on_disk, scratch_pool));
+ SVN_ERR(svn_wc_read_kind2(&wc_kind, wc_ctx,
+ target->move_target_abspath,
+ FALSE, FALSE, scratch_pool));
+ if (kind_on_disk != svn_node_none || wc_kind != svn_node_none)
+ {
+ /* The move target path already exists on disk. Skip target. */
+ target->skipped = TRUE;
+ target->move_target_abspath = NULL;
+ return SVN_NO_ERROR;
+ }
+ }
if (! target->is_symlink)
{
@@ -1136,8 +1208,8 @@ init_patch_target(patch_target_t **patch_target,
hi;
hi = apr_hash_next(hi))
{
- const char *prop_name = svn__apr_hash_index_key(hi);
- svn_prop_patch_t *prop_patch = svn__apr_hash_index_val(hi);
+ const char *prop_name = apr_hash_this_key(hi);
+ svn_prop_patch_t *prop_patch = apr_hash_this_val(hi);
prop_patch_target_t *prop_target;
SVN_ERR(init_prop_target(&prop_target,
@@ -1150,7 +1222,6 @@ init_patch_target(patch_target_t **patch_target,
}
}
- *patch_target = target;
return SVN_NO_ERROR;
}
@@ -1510,7 +1581,8 @@ match_existing_target(svn_boolean_t *match,
/* Determine the line at which a HUNK applies to CONTENT of the TARGET
* file, and return an appropriate hunk_info object in *HI, allocated from
* RESULT_POOL. Use fuzz factor FUZZ. Set HI->FUZZ to FUZZ. If no correct
- * line can be determined, set HI->REJECTED to TRUE.
+ * line can be determined, set HI->REJECTED to TRUE. PREVIOUS_OFFSET
+ * is the offset at which the previous matching hunk was applied, or zero.
* IGNORE_WHITESPACE tells whether whitespace should be considered when
* matching. IS_PROP_HUNK indicates whether the hunk patches file content
* or a property.
@@ -1522,6 +1594,7 @@ static svn_error_t *
get_hunk_info(hunk_info_t **hi, patch_target_t *target,
target_content_t *content,
svn_diff_hunk_t *hunk, svn_linenum_t fuzz,
+ svn_linenum_t previous_offset,
svn_boolean_t ignore_whitespace,
svn_boolean_t is_prop_hunk,
svn_cancel_func_t cancel_func, void *cancel_baton,
@@ -1531,7 +1604,7 @@ get_hunk_info(hunk_info_t **hi, patch_target_t *target,
svn_linenum_t original_start;
svn_boolean_t already_applied;
- original_start = svn_diff_hunk_get_original_start(hunk);
+ original_start = svn_diff_hunk_get_original_start(hunk) + previous_offset;
already_applied = FALSE;
/* An original offset of zero means that this hunk wants to create
@@ -1639,7 +1712,9 @@ get_hunk_info(hunk_info_t **hi, patch_target_t *target,
modified_start = svn_diff_hunk_get_modified_start(hunk);
if (modified_start == 0)
{
- /* Patch wants to delete the file. */
+ /* Patch wants to delete the file.
+
+ ### locally_deleted is always false here? */
already_applied = target->locally_deleted;
}
else
@@ -1660,27 +1735,85 @@ get_hunk_info(hunk_info_t **hi, patch_target_t *target,
if (! already_applied)
{
- /* Scan the whole file again from the start. */
- SVN_ERR(seek_to_line(content, 1, scratch_pool));
+ int i;
+ svn_linenum_t search_start = 1, search_end = 0;
+ svn_linenum_t matched_line2;
+
+ /* Search for closest match before or after original
+ start. We have no backward search so search forwards
+ from the previous match (or start of file) to the
+ original start looking for the last match. Then
+ search forwards from the original start looking for a
+ better match. Finally search forwards from the start
+ of file to the previous hunk if that could result in
+ a better match. */
+
+ for (i = content->hunks->nelts; i > 0; --i)
+ {
+ const hunk_info_t *prev
+ = APR_ARRAY_IDX(content->hunks, i - 1, const hunk_info_t *);
+ if (!prev->rejected)
+ {
+ svn_linenum_t length;
- /* Scan forward towards the hunk's line and look for a line
- * where the hunk matches. */
+ length = svn_diff_hunk_get_original_length(prev->hunk);
+ search_start = prev->matched_line + length;
+ break;
+ }
+ }
+
+ /* Search from the previous match, or start of file,
+ towards the original location. */
+ SVN_ERR(seek_to_line(content, search_start, scratch_pool));
SVN_ERR(scan_for_match(&matched_line, content, hunk, FALSE,
original_start, fuzz,
ignore_whitespace, FALSE,
cancel_func, cancel_baton,
scratch_pool));
- /* In tie-break situations, we arbitrarily prefer early matches
- * to save us from scanning the rest of the file. */
- if (matched_line == 0)
+ /* If a match we only need to search forwards for a
+ better match, otherwise to the end of the file. */
+ if (matched_line)
+ search_end = original_start + (original_start - matched_line);
+
+ /* Search from original location, towards the end. */
+ SVN_ERR(seek_to_line(content, original_start + 1, scratch_pool));
+ SVN_ERR(scan_for_match(&matched_line2, content, hunk,
+ TRUE, search_end, fuzz, ignore_whitespace,
+ FALSE, cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* Chose the forward match if it is closer than the
+ backward match or if there is no backward match. */
+ if (matched_line2
+ && (!matched_line
+ || (matched_line2 - original_start
+ < original_start - matched_line)))
+ matched_line = matched_line2;
+
+ /* Search from before previous hunk if there could be a
+ better match. */
+ if (search_start > 1
+ && (!matched_line
+ || (matched_line > original_start
+ && (matched_line - original_start
+ > original_start - search_start))))
{
- /* Scan forward towards the end of the file and look
- * for a line where the hunk matches. */
- SVN_ERR(scan_for_match(&matched_line, content, hunk,
- TRUE, 0, fuzz, ignore_whitespace,
- FALSE, cancel_func, cancel_baton,
+ svn_linenum_t search_start2 = 1;
+
+ if (matched_line
+ && matched_line - original_start < original_start)
+ search_start2
+ = original_start - (matched_line - original_start) + 1;
+
+ SVN_ERR(seek_to_line(content, search_start2, scratch_pool));
+ SVN_ERR(scan_for_match(&matched_line2, content, hunk, FALSE,
+ search_start - 1, fuzz,
+ ignore_whitespace, FALSE,
+ cancel_func, cancel_baton,
scratch_pool));
+ if (matched_line2)
+ matched_line = matched_line2;
}
}
}
@@ -1725,7 +1858,7 @@ copy_lines_to_target(target_content_t *content, svn_linenum_t line,
SVN_ERR(readline(content, &target_line, iterpool, iterpool));
if (! content->eof)
target_line = apr_pstrcat(iterpool, target_line, content->eol_str,
- (char *)NULL);
+ SVN_VA_NULL);
len = strlen(target_line);
SVN_ERR(content->write(content->write_baton, target_line,
len, iterpool));
@@ -1949,7 +2082,7 @@ send_hunk_notification(const hunk_info_t *hi,
notify->hunk_fuzz = hi->fuzz;
notify->prop_name = prop_name;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
return SVN_NO_ERROR;
}
@@ -1963,6 +2096,7 @@ send_patch_notification(const patch_target_t *target,
{
svn_wc_notify_t *notify;
svn_wc_notify_action_t action;
+ const char *notify_path;
if (! ctx->notify_func2)
return SVN_NO_ERROR;
@@ -1971,14 +2105,18 @@ send_patch_notification(const patch_target_t *target,
action = svn_wc_notify_skip;
else if (target->deleted)
action = svn_wc_notify_delete;
- else if (target->added || target->replaced)
+ else if (target->added || target->replaced || target->move_target_abspath)
action = svn_wc_notify_add;
else
action = svn_wc_notify_patch;
- notify = svn_wc_create_notify(target->local_abspath ? target->local_abspath
- : target->local_relpath,
- action, pool);
+ if (target->move_target_abspath)
+ notify_path = target->move_target_abspath;
+ else
+ notify_path = target->local_abspath ? target->local_abspath
+ : target->local_relpath;
+
+ notify = svn_wc_create_notify(notify_path, action, pool);
notify->kind = svn_node_file;
if (action == svn_wc_notify_skip)
@@ -2006,7 +2144,7 @@ send_patch_notification(const patch_target_t *target,
notify->prop_state = svn_wc_notify_state_changed;
}
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
if (action == svn_wc_notify_patch)
{
@@ -2033,7 +2171,7 @@ send_patch_notification(const patch_target_t *target,
{
prop_patch_target_t *prop_target;
- prop_target = svn__apr_hash_index_val(hash_index);
+ prop_target = apr_hash_this_val(hash_index);
for (i = 0; i < prop_target->content->hunks->nelts; i++)
{
@@ -2054,15 +2192,16 @@ send_patch_notification(const patch_target_t *target,
svn_pool_destroy(iterpool);
}
- return SVN_NO_ERROR;
-}
+ if (target->move_target_abspath)
+ {
+ /* Notify about deletion of move source. */
+ notify = svn_wc_create_notify(target->local_abspath,
+ svn_wc_notify_delete, pool);
+ notify->kind = svn_node_file;
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
+ }
-static void
-svn_sort__array(apr_array_header_t *array,
- int (*comparison_func)(const void *,
- const void *))
-{
- qsort(array->elts, array->nelts, array->elt_size, comparison_func);
+ return SVN_NO_ERROR;
}
/* Implements the callback for svn_sort__array. Puts hunks that match
@@ -2124,8 +2263,6 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
int strip_count,
svn_boolean_t ignore_whitespace,
svn_boolean_t remove_tempfiles,
- svn_client_patch_func_t patch_func,
- void *patch_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
@@ -2135,6 +2272,7 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
int i;
static const svn_linenum_t MAX_FUZZ = 2;
apr_hash_index_t *hash_index;
+ svn_linenum_t previous_offset = 0;
SVN_ERR(init_patch_target(&target, patch, abs_wc_path, wc_ctx, strip_count,
remove_tempfiles, result_pool, scratch_pool));
@@ -2144,19 +2282,6 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
return SVN_NO_ERROR;
}
- if (patch_func)
- {
- SVN_ERR(patch_func(patch_baton, &target->filtered,
- target->canon_path_from_patchfile,
- target->patched_path, target->reject_path,
- scratch_pool));
- if (target->filtered)
- {
- *patch_target = target;
- return SVN_NO_ERROR;
- }
- }
-
iterpool = svn_pool_create(scratch_pool);
/* Match hunks. */
for (i = 0; i < patch->hunks->nelts; i++)
@@ -2177,6 +2302,7 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
do
{
SVN_ERR(get_hunk_info(&hi, target, target->content, hunk, fuzz,
+ previous_offset,
ignore_whitespace,
FALSE /* is_prop_hunk */,
cancel_func, cancel_baton,
@@ -2185,6 +2311,10 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
}
while (hi->rejected && fuzz <= MAX_FUZZ && ! hi->already_applied);
+ if (hi->matched_line)
+ previous_offset
+ = hi->matched_line - svn_diff_hunk_get_original_start(hunk);
+
APR_ARRAY_PUSH(target->content->hunks, hunk_info_t *) = hi;
}
@@ -2236,8 +2366,8 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
const char *prop_name;
prop_patch_target_t *prop_target;
- prop_name = svn__apr_hash_index_key(hash_index);
- prop_patch = svn__apr_hash_index_val(hash_index);
+ prop_name = apr_hash_this_key(hash_index);
+ prop_patch = apr_hash_this_val(hash_index);
if (! strcmp(prop_name, SVN_PROP_SPECIAL))
target->is_special = TRUE;
@@ -2263,7 +2393,7 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
do
{
SVN_ERR(get_hunk_info(&hi, target, prop_target->content,
- hunk, fuzz,
+ hunk, fuzz, 0,
ignore_whitespace,
TRUE /* is_prop_hunk */,
cancel_func, cancel_baton,
@@ -2283,7 +2413,7 @@ apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
{
prop_patch_target_t *prop_target;
- prop_target = svn__apr_hash_index_val(hash_index);
+ prop_target = apr_hash_this_val(hash_index);
for (i = 0; i < prop_target->content->hunks->nelts; i++)
{
@@ -2508,8 +2638,9 @@ create_missing_parents(patch_target_t *target,
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, local_abspath,
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, local_abspath,
NULL /*props*/,
+ FALSE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2,
iterpool));
}
@@ -2625,7 +2756,10 @@ install_patched_target(patch_target_t *target, const char *abs_wc_path,
svn_subst_eol_style_native);
SVN_ERR(svn_subst_copy_and_translate4(
- target->patched_path, target->local_abspath,
+ target->patched_path,
+ target->move_target_abspath
+ ? target->move_target_abspath
+ : target->local_abspath,
target->content->eol_str, repair_eol,
target->content->keywords,
TRUE /* expand */, FALSE /* special */,
@@ -2639,15 +2773,39 @@ install_patched_target(patch_target_t *target, const char *abs_wc_path,
* Suppress notification, we'll do that later (and also
* during dry-run). Don't allow cancellation because
* we'd rather notify about what we did before aborting. */
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, target->local_abspath,
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, target->local_abspath,
NULL /*props*/,
+ FALSE /* skip checks */,
NULL, NULL, pool));
}
/* Restore the target's executable bit if necessary. */
- SVN_ERR(svn_io_set_file_executable(target->local_abspath,
+ SVN_ERR(svn_io_set_file_executable(target->move_target_abspath
+ ? target->move_target_abspath
+ : target->local_abspath,
target->executable,
FALSE, pool));
+
+ if (target->move_target_abspath)
+ {
+ /* ### Copying the patched content to the move target location,
+ * performing the move in meta-data, and removing the file at
+ * the move source should be one atomic operation. */
+
+ /* ### Create missing parents. */
+
+ /* Perform the move in meta-data. */
+ SVN_ERR(svn_wc__move2(ctx->wc_ctx,
+ target->local_abspath,
+ target->move_target_abspath,
+ TRUE, /* metadata_only */
+ FALSE, /* allow_mixed_revisions */
+ NULL, NULL, NULL, NULL,
+ pool));
+
+ /* Delete the patch target's old location from disk. */
+ SVN_ERR(svn_io_remove_file2(target->local_abspath, FALSE, pool));
+ }
}
}
@@ -2694,7 +2852,7 @@ install_patched_prop_targets(patch_target_t *target,
hi;
hi = apr_hash_next(hi))
{
- prop_patch_target_t *prop_target = svn__apr_hash_index_val(hi);
+ prop_patch_target_t *prop_target = apr_hash_this_val(hi);
const svn_string_t *prop_val;
svn_error_t *err;
@@ -2730,10 +2888,11 @@ install_patched_prop_targets(patch_target_t *target,
{
if (! dry_run)
{
- SVN_ERR(svn_io_file_create(target->local_abspath, "",
- scratch_pool));
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, target->local_abspath,
+ SVN_ERR(svn_io_file_create_empty(target->local_abspath,
+ scratch_pool));
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, target->local_abspath,
NULL /*props*/,
+ FALSE /* skip checks */,
/* suppress notification */
NULL, NULL,
iterpool));
@@ -2869,10 +3028,13 @@ check_ancestor_delete(const char *deleted_target,
{
struct can_delete_baton_t cb;
svn_error_t *err;
+ apr_array_header_t *ignores;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
const char *dir_abspath = svn_dirent_dirname(deleted_target, scratch_pool);
+ SVN_ERR(svn_wc_get_default_ignores(&ignores, ctx->config, scratch_pool));
+
while (svn_dirent_is_child(apply_root, dir_abspath, iterpool))
{
svn_pool_clear(iterpool);
@@ -2882,7 +3044,7 @@ check_ancestor_delete(const char *deleted_target,
cb.targets_info = targets_info;
err = svn_wc_walk_status(ctx->wc_ctx, dir_abspath, svn_depth_infinity,
- TRUE, FALSE, FALSE, NULL,
+ TRUE, FALSE, FALSE, ignores,
can_delete_callback, &cb,
ctx->cancel_func, ctx->cancel_baton,
iterpool);
@@ -2986,14 +3148,23 @@ apply_patches(/* The path to the patch file. */
if (patch)
{
patch_target_t *target;
+ svn_boolean_t filtered = FALSE;
SVN_ERR(apply_one_patch(&target, patch, abs_wc_path,
ctx->wc_ctx, strip_count,
ignore_whitespace, remove_tempfiles,
- patch_func, patch_baton,
ctx->cancel_func, ctx->cancel_baton,
iterpool, iterpool));
- if (! target->filtered)
+
+ if (!target->skipped && patch_func)
+ {
+ SVN_ERR(patch_func(patch_baton, &filtered,
+ target->canon_path_from_patchfile,
+ target->patched_path, target->reject_path,
+ iterpool));
+ }
+
+ if (! filtered)
{
/* Save info we'll still need when we're done patching. */
patch_target_info_t *target_info =
@@ -3009,6 +3180,7 @@ apply_patches(/* The path to the patch file. */
if (target->has_text_changes
|| target->added
+ || target->move_target_abspath
|| target->deleted)
SVN_ERR(install_patched_target(target, abs_wc_path,
ctx, dry_run, iterpool));
diff --git a/subversion/libsvn_client/prop_commands.c b/subversion/libsvn_client/prop_commands.c
index 06c4d21..1562966 100644
--- a/subversion/libsvn_client/prop_commands.c
+++ b/subversion/libsvn_client/prop_commands.c
@@ -206,6 +206,7 @@ propset_on_url(const char *propname,
item = svn_client_commit_item3_create(pool);
item->url = target;
+ item->kind = node_kind;
item->state_flags = SVN_CLIENT_COMMIT_ITEM_PROP_MODS;
APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
SVN_ERR(svn_client__get_log_msg(&message, &tmp_file, commit_items,
@@ -240,6 +241,14 @@ propset_on_url(const char *propname,
return svn_error_trace(err);
}
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(target,
+ svn_wc_notify_commit_finalizing,
+ pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
+ }
/* Close the edit. */
return editor->close_edit(edit_baton, pool);
}
@@ -485,11 +494,11 @@ svn_client_revprop_set2(const char *propname,
const svn_string_t *unset = NULL;
if (original_propval == NULL)
- old_value_p = NULL;
+ old_value_p = NULL;
else if (original_propval->data == NULL)
- old_value_p = &unset;
+ old_value_p = &unset;
else
- old_value_p = &original_propval;
+ old_value_p = &original_propval;
/* The actual RA call. */
SVN_ERR(svn_ra_change_rev_prop2(ra_session, *set_rev, propname,
@@ -512,45 +521,24 @@ svn_client_revprop_set2(const char *propname,
notify->prop_name = propname;
notify->revision = *set_rev;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
return SVN_NO_ERROR;
}
-/* Helper for the remote case of svn_client_propget.
- *
- * If PROPS is not null, then get the value of property PROPNAME in REVNUM,
- using RA_LIB and SESSION. Store the value ('svn_string_t *') in PROPS,
- under the path key "TARGET_PREFIX/TARGET_RELATIVE" ('const char *').
- *
- * If INHERITED_PROPS is not null, then set *INHERITED_PROPS to a
- * depth-first ordered array of svn_prop_inherited_item_t * structures
- * representing the PROPNAME properties inherited by the target. If
- * INHERITABLE_PROPS in not null and no inheritable properties are found,
- * then set *INHERITED_PROPS to an empty array.
- *
- * Recurse according to DEPTH, similarly to svn_client_propget3().
- *
- * KIND is the kind of the node at "TARGET_PREFIX/TARGET_RELATIVE".
- * Yes, caller passes this; it makes the recursion more efficient :-).
- *
- * Allocate PROPS and *INHERITED_PROPS in RESULT_POOL, but do all temporary
- * work in SCRATCH_POOL. The two pools can be the same; recursive
- * calls may use a different SCRATCH_POOL, however.
- */
-static svn_error_t *
-remote_propget(apr_hash_t *props,
- apr_array_header_t **inherited_props,
- const char *propname,
- const char *target_prefix,
- const char *target_relative,
- svn_node_kind_t kind,
- svn_revnum_t revnum,
- svn_ra_session_t *ra_session,
- svn_depth_t depth,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+svn_error_t *
+svn_client__remote_propget(apr_hash_t *props,
+ apr_array_header_t **inherited_props,
+ const char *propname,
+ const char *target_prefix,
+ const char *target_relative,
+ svn_node_kind_t kind,
+ svn_revnum_t revnum,
+ svn_ra_session_t *ra_session,
+ svn_depth_t depth,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
apr_hash_t *dirents;
apr_hash_t *prop_hash = NULL;
@@ -587,6 +575,9 @@ remote_propget(apr_hash_t *props,
if (inherited_props)
{
const char *repos_root_url;
+ int i;
+ apr_array_header_t *final_iprops =
+ apr_array_make(result_pool, 1, sizeof(svn_prop_inherited_item_t *));
/* We will filter out all but PROPNAME later, making a final copy
in RESULT_POOL, so pass SCRATCH_POOL for all pools. */
@@ -599,15 +590,8 @@ remote_propget(apr_hash_t *props,
repos_root_url,
scratch_pool,
scratch_pool));
- }
-
- /* Make a copy of any inherited PROPNAME properties in RESULT_POOL. */
- if (inherited_props)
- {
- int i;
- apr_array_header_t *final_iprops =
- apr_array_make(result_pool, 1, sizeof(svn_prop_inherited_item_t *));
+ /* Make a copy of any inherited PROPNAME properties in RESULT_POOL. */
for (i = 0; i < (*inherited_props)->nelts; i++)
{
svn_prop_inherited_item_t *iprop =
@@ -650,8 +634,8 @@ remote_propget(apr_hash_t *props,
hi;
hi = apr_hash_next(hi))
{
- const char *this_name = svn__apr_hash_index_key(hi);
- svn_dirent_t *this_ent = svn__apr_hash_index_val(hi);
+ const char *this_name = apr_hash_this_key(hi);
+ svn_dirent_t *this_ent = apr_hash_this_val(hi);
const char *new_target_relative;
svn_depth_t depth_below_here = depth;
@@ -666,15 +650,15 @@ remote_propget(apr_hash_t *props,
new_target_relative = svn_relpath_join(target_relative, this_name,
iterpool);
- SVN_ERR(remote_propget(props, NULL,
- propname,
- target_prefix,
- new_target_relative,
- this_ent->kind,
- revnum,
- ra_session,
- depth_below_here,
- result_pool, iterpool));
+ SVN_ERR(svn_client__remote_propget(props, NULL,
+ propname,
+ target_prefix,
+ new_target_relative,
+ this_ent->kind,
+ revnum,
+ ra_session,
+ depth_below_here,
+ result_pool, iterpool));
}
svn_pool_destroy(iterpool);
@@ -704,7 +688,7 @@ recursive_propget_receiver(void *baton,
{
apr_hash_index_t *hi = apr_hash_first(scratch_pool, props);
svn_hash_sets(b->props, apr_pstrdup(b->pool, local_abspath),
- svn_string_dup(svn__apr_hash_index_val(hi), b->pool));
+ svn_string_dup(apr_hash_this_val(hi), b->pool));
}
return SVN_NO_ERROR;
@@ -882,13 +866,9 @@ svn_client_propget5(apr_hash_t **props,
if (SVN_CLIENT__REVKIND_NEEDS_WC(peg_revision->kind)
|| SVN_CLIENT__REVKIND_NEEDS_WC(revision->kind))
{
- svn_revnum_t origin_rev;
const char *repos_relpath;
const char *repos_root_url;
- const char *repos_uuid;
const char *local_abspath;
- const char *copy_root_abspath;
- svn_boolean_t is_copy;
/* Avoid assertion on the next line when somebody accidentally asks for
a working copy revision on a URL */
@@ -901,12 +881,10 @@ svn_client_propget5(apr_hash_t **props,
if (SVN_CLIENT__REVKIND_NEEDS_WC(peg_revision->kind))
{
- SVN_ERR(svn_wc__node_get_origin(&is_copy,
- &origin_rev,
+ SVN_ERR(svn_wc__node_get_origin(NULL, NULL,
&repos_relpath,
&repos_root_url,
- &repos_uuid,
- &copy_root_abspath,
+ NULL, NULL, NULL,
ctx->wc_ctx,
local_abspath,
FALSE, /* scan_deleted */
@@ -970,7 +948,8 @@ svn_client_propget5(apr_hash_t **props,
if (!local_explicit_props)
*props = apr_hash_make(result_pool);
- SVN_ERR(remote_propget(!local_explicit_props ? *props : NULL,
+ SVN_ERR(svn_client__remote_propget(
+ !local_explicit_props ? *props : NULL,
!local_iprops ? inherited_props : NULL,
propname, loc->url, "",
kind, loc->rev, ra_session,
@@ -1134,8 +1113,8 @@ remote_proplist(const char *target_prefix,
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- apr_ssize_t klen = svn__apr_hash_index_klen(hi);
+ const char *name = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
svn_prop_kind_t prop_kind;
prop_kind = svn_property_kind2(name);
@@ -1160,8 +1139,8 @@ remote_proplist(const char *target_prefix,
hi;
hi = apr_hash_next(hi))
{
- const char *this_name = svn__apr_hash_index_key(hi);
- svn_dirent_t *this_ent = svn__apr_hash_index_val(hi);
+ const char *this_name = apr_hash_this_key(hi);
+ svn_dirent_t *this_ent = apr_hash_this_val(hi);
const char *new_target_relative;
if (cancel_func)
@@ -1291,12 +1270,9 @@ get_remote_props(const char *path_or_url,
if (SVN_CLIENT__REVKIND_NEEDS_WC(peg_revision->kind)
|| SVN_CLIENT__REVKIND_NEEDS_WC(revision->kind))
{
- svn_revnum_t origin_rev;
const char *repos_relpath;
const char *repos_root_url;
- const char *repos_uuid;
const char *local_abspath;
- const char *copy_root_abspath;
svn_boolean_t is_copy;
/* Avoid assertion on the next line when somebody accidentally asks for
@@ -1311,11 +1287,10 @@ get_remote_props(const char *path_or_url,
if (SVN_CLIENT__REVKIND_NEEDS_WC(peg_revision->kind))
{
SVN_ERR(svn_wc__node_get_origin(&is_copy,
- &origin_rev,
+ NULL,
&repos_relpath,
&repos_root_url,
- &repos_uuid,
- &copy_root_abspath,
+ NULL, NULL, NULL,
ctx->wc_ctx,
local_abspath,
FALSE, /* scan_deleted */
diff --git a/subversion/libsvn_client/ra.c b/subversion/libsvn_client/ra.c
index a0d4cea..f98b4b0 100644
--- a/subversion/libsvn_client/ra.c
+++ b/subversion/libsvn_client/ra.c
@@ -42,6 +42,7 @@
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
#include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
/* This is the baton that we pass svn_ra_open3(), and is associated with
@@ -70,6 +71,8 @@ typedef struct callback_baton_t
/* A client context. */
svn_client_ctx_t *ctx;
+ /* Last progress reported by progress callback. */
+ apr_off_t last_progress;
} callback_baton_t;
@@ -287,6 +290,31 @@ get_client_string(void *baton,
return SVN_NO_ERROR;
}
+/* Implements svn_ra_progress_notify_func_t. Accumulates progress information
+ * for different RA sessions and reports total progress to caller. */
+static void
+progress_func(apr_off_t progress,
+ apr_off_t total,
+ void *baton,
+ apr_pool_t *pool)
+{
+ callback_baton_t *b = baton;
+ svn_client_ctx_t *public_ctx = b->ctx;
+ svn_client__private_ctx_t *private_ctx =
+ svn_client__get_private_ctx(public_ctx);
+
+ private_ctx->total_progress += (progress - b->last_progress);
+ b->last_progress = progress;
+
+ if (public_ctx->progress_func)
+ {
+ /* All RA implementations currently provide -1 for total. So it doesn't
+ make sense to develop some complex logic to combine total across all
+ RA sessions. */
+ public_ctx->progress_func(private_ctx->total_progress, -1,
+ public_ctx->progress_baton, pool);
+ }
+}
#define SVN_CLIENT__MAX_REDIRECT_ATTEMPTS 3 /* ### TODO: Make configurable. */
@@ -320,12 +348,15 @@ svn_client__open_ra_session_internal(svn_ra_session_t **ra_session,
cbtable->invalidate_wc_props = (write_dav_props && read_dav_props)
? invalidate_wc_props : NULL;
cbtable->auth_baton = ctx->auth_baton; /* new-style */
- cbtable->progress_func = ctx->progress_func;
- cbtable->progress_baton = ctx->progress_baton;
+ cbtable->progress_func = progress_func;
+ cbtable->progress_baton = cb;
cbtable->cancel_func = ctx->cancel_func ? cancel_callback : NULL;
cbtable->get_client_string = get_client_string;
if (base_dir_abspath)
cbtable->get_wc_contents = get_wc_contents;
+ cbtable->check_tunnel_func = ctx->check_tunnel_func;
+ cbtable->open_tunnel_func = ctx->open_tunnel_func;
+ cbtable->tunnel_baton = ctx->tunnel_baton;
cb->commit_items = commit_items;
cb->ctx = ctx;
@@ -403,7 +434,7 @@ svn_client__open_ra_session_internal(svn_ra_session_t **ra_session,
svn_wc_create_notify_url(corrected,
svn_wc_notify_url_redirect,
scratch_pool);
- (*ctx->notify_func2)(ctx->notify_baton2, notify, scratch_pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
/* Our caller will want to know what our final corrected URL was. */
@@ -614,8 +645,7 @@ svn_client__repos_location_segments(apr_array_header_t **segments,
pool);
SVN_ERR(svn_error_compose_create(
err, svn_ra_reparent(ra_session, old_session_url, pool)));
- qsort((*segments)->elts, (*segments)->nelts,
- (*segments)->elt_size, compare_segments);
+ svn_sort__array(*segments, compare_segments);
return SVN_NO_ERROR;
}
@@ -627,6 +657,9 @@ svn_client__repos_location_segments(apr_array_header_t **segments,
* END_REVNUM must be valid revision numbers except that END_REVNUM may
* be SVN_INVALID_REVNUM if END_URL is NULL.
*
+ * YOUNGEST_REV is the already retrieved youngest revision of the ra session,
+ * but can be SVN_INVALID_REVNUM if the value is not already retrieved.
+ *
* RA_SESSION is an open RA session parented at URL.
*/
static svn_error_t *
@@ -637,6 +670,7 @@ repos_locations(const char **start_url,
svn_revnum_t peg_revnum,
svn_revnum_t start_revnum,
svn_revnum_t end_revnum,
+ svn_revnum_t youngest_rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -644,9 +678,9 @@ repos_locations(const char **start_url,
apr_array_header_t *revs;
apr_hash_t *rev_locs;
- SVN_ERR_ASSERT(peg_revnum != SVN_INVALID_REVNUM);
- SVN_ERR_ASSERT(start_revnum != SVN_INVALID_REVNUM);
- SVN_ERR_ASSERT(end_revnum != SVN_INVALID_REVNUM || end_url == NULL);
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(peg_revnum));
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(start_revnum));
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(end_revnum) || end_url == NULL);
/* Avoid a network request in the common easy case. */
if (start_revnum == peg_revnum
@@ -661,6 +695,27 @@ repos_locations(const char **start_url,
SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_url, scratch_pool));
+ /* Handle another common case: The repository root can't move */
+ if (! strcmp(repos_url, url))
+ {
+ if (! SVN_IS_VALID_REVNUM(youngest_rev))
+ SVN_ERR(svn_ra_get_latest_revnum(ra_session, &youngest_rev,
+ scratch_pool));
+
+ if (start_revnum > youngest_rev
+ || (SVN_IS_VALID_REVNUM(end_revnum) && (end_revnum > youngest_rev)))
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ (start_revnum > youngest_rev)
+ ? start_revnum : end_revnum);
+
+ if (start_url)
+ *start_url = apr_pstrdup(result_pool, repos_url);
+ if (end_url)
+ *end_url = apr_pstrdup(result_pool, repos_url);
+ return SVN_NO_ERROR;
+ }
+
revs = apr_array_make(scratch_pool, 2, sizeof(svn_revnum_t));
APR_ARRAY_PUSH(revs, svn_revnum_t) = start_revnum;
if (end_revnum != start_revnum && end_revnum != SVN_INVALID_REVNUM)
@@ -716,7 +771,7 @@ svn_client__repos_location(svn_client__pathrev_t **op_loc_p,
peg_loc->url, scratch_pool));
err = repos_locations(&op_url, NULL, ra_session,
peg_loc->url, peg_loc->rev,
- op_revnum, SVN_INVALID_REVNUM,
+ op_revnum, SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
result_pool, scratch_pool);
SVN_ERR(svn_error_compose_create(
err, svn_ra_reparent(ra_session, old_session_url, scratch_pool)));
@@ -776,7 +831,7 @@ svn_client__repos_locations(const char **start_url,
svn_boolean_t is_copy;
SVN_ERR(svn_wc__node_get_origin(&is_copy, &peg_revnum, &repos_relpath,
- &repos_root_url, NULL, NULL,
+ &repos_root_url, NULL, NULL, NULL,
ctx->wc_ctx, local_abspath_or_url,
FALSE, subpool, subpool));
@@ -856,7 +911,7 @@ svn_client__repos_locations(const char **start_url,
SVN_ERR(repos_locations(start_url, end_url,
ra_session, url, peg_revnum,
- start_revnum, end_revnum,
+ start_revnum, end_revnum, youngest_rev,
pool, subpool));
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
@@ -888,9 +943,9 @@ svn_client__calc_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p,
remembering the youngest matching location. */
for (hi = apr_hash_first(scratch_pool, history1); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- apr_ssize_t path_len = svn__apr_hash_index_klen(hi);
- svn_rangelist_t *ranges1 = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ apr_ssize_t path_len = apr_hash_this_key_len(hi);
+ svn_rangelist_t *ranges1 = apr_hash_this_val(hi);
svn_rangelist_t *ranges2, *common;
ranges2 = apr_hash_get(history2, path, path_len);
@@ -992,48 +1047,6 @@ svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p,
return SVN_NO_ERROR;
}
-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)
-{
- apr_pool_t *sesspool = svn_pool_create(scratch_pool);
- svn_ra_session_t *session;
- svn_client__pathrev_t *loc1, *loc2, *ancestor;
-
- /* Resolve the two locations */
- SVN_ERR(svn_client__ra_session_from_path2(&session, &loc1,
- path_or_url1, NULL,
- revision1, revision1,
- ctx, sesspool));
- SVN_ERR(svn_client__resolve_rev_and_url(&loc2, session,
- path_or_url2, revision2, revision2,
- ctx, scratch_pool));
-
- SVN_ERR(svn_client__get_youngest_common_ancestor(
- &ancestor, loc1, loc2, session, ctx, result_pool, scratch_pool));
-
- if (ancestor)
- {
- *ancestor_url = ancestor->url;
- *ancestor_rev = ancestor->rev;
- }
- else
- {
- *ancestor_url = NULL;
- *ancestor_rev = SVN_INVALID_REVNUM;
- }
- svn_pool_destroy(sesspool);
- return SVN_NO_ERROR;
-}
-
-
struct ra_ev2_baton {
/* The working copy context, from the client context. */
svn_wc_context_t *wc_ctx;
@@ -1080,6 +1093,7 @@ svn_client__ra_provide_base(svn_stream_t **contents,
/* The pristine contents refer to the BASE, or to the pristine of
a copy/move to this location. Fetch the correct revision. */
SVN_ERR(svn_wc__node_get_origin(NULL, revision, NULL, NULL, NULL, NULL,
+ NULL,
reb->wc_ctx, local_abspath, FALSE,
scratch_pool, scratch_pool));
}
@@ -1124,6 +1138,7 @@ svn_client__ra_provide_props(apr_hash_t **props,
/* The pristine props refer to the BASE, or to the pristine props of
a copy/move to this location. Fetch the correct revision. */
SVN_ERR(svn_wc__node_get_origin(NULL, revision, NULL, NULL, NULL, NULL,
+ NULL,
reb->wc_ctx, local_abspath, FALSE,
scratch_pool, scratch_pool));
}
diff --git a/subversion/libsvn_client/relocate.c b/subversion/libsvn_client/relocate.c
index ed8d09c..dcd9017 100644
--- a/subversion/libsvn_client/relocate.c
+++ b/subversion/libsvn_client/relocate.c
@@ -127,85 +127,6 @@ validator_func(void *baton,
return SVN_NO_ERROR;
}
-
-/* Examing the array of svn_wc_external_item2_t's EXT_DESC (parsed
- from the svn:externals property set on LOCAL_ABSPATH) and determine
- if the external working copies described by such should be
- relocated as a side-effect of the relocation of their parent
- working copy (from OLD_PARENT_REPOS_ROOT_URL to
- NEW_PARENT_REPOS_ROOT_URL). If so, attempt said relocation. */
-static svn_error_t *
-relocate_externals(const char *local_abspath,
- apr_array_header_t *ext_desc,
- const char *old_parent_repos_root_url,
- const char *new_parent_repos_root_url,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool;
- int i;
-
- /* Parse an externals definition into an array of external items. */
-
- iterpool = svn_pool_create(scratch_pool);
-
- for (i = 0; i < ext_desc->nelts; i++)
- {
- svn_wc_external_item2_t *ext_item =
- APR_ARRAY_IDX(ext_desc, i, svn_wc_external_item2_t *);
- const char *target_repos_root_url;
- const char *target_abspath;
- svn_error_t *err;
-
- svn_pool_clear(iterpool);
-
- /* If this external isn't pulled in via a relative URL, ignore
- it. There's no sense in relocating a working copy only to
- have the next 'svn update' try to point it back to another
- location. */
- if (! ((strncmp("../", ext_item->url, 3) == 0) ||
- (strncmp("^/", ext_item->url, 2) == 0)))
- continue;
-
- /* If the external working copy's not-yet-relocated repos root
- URL matches the primary working copy's pre-relocated
- repository root URL, try to relocate that external, too.
- You might wonder why this check is needed, given that we're
- already limiting ourselves to externals pulled via URLs
- relative to their primary working copy. Well, it's because
- you can use "../" to "crawl up" above one repository's URL
- space and down into another one. */
- SVN_ERR(svn_dirent_get_absolute(&target_abspath,
- svn_dirent_join(local_abspath,
- ext_item->target_dir,
- iterpool),
- iterpool));
- err = svn_client_get_repos_root(&target_repos_root_url, NULL /* uuid */,
- target_abspath, ctx, iterpool, iterpool);
-
- /* Ignore externals that aren't present in the working copy.
- * This can happen if an external is deleted from disk accidentally,
- * or if an external is configured on a locally added directory. */
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
- {
- svn_error_clear(err);
- continue;
- }
- else
- SVN_ERR(err);
-
- if (strcmp(target_repos_root_url, old_parent_repos_root_url) == 0)
- SVN_ERR(svn_client_relocate2(target_abspath,
- old_parent_repos_root_url,
- new_parent_repos_root_url,
- FALSE, ctx, iterpool));
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
svn_error_t *
svn_client_relocate2(const char *wcroot_dir,
const char *from_prefix,
@@ -256,10 +177,9 @@ svn_client_relocate2(const char *wcroot_dir,
/* Relocate externals, too (if any). */
- SVN_ERR(svn_wc__externals_gather_definitions(&externals_hash, NULL,
- ctx->wc_ctx, local_abspath,
- svn_depth_infinity,
- pool, pool));
+ SVN_ERR(svn_wc__externals_defined_below(&externals_hash,
+ ctx->wc_ctx, local_abspath,
+ pool, pool));
if (! apr_hash_count(externals_hash))
return SVN_NO_ERROR;
@@ -269,18 +189,39 @@ svn_client_relocate2(const char *wcroot_dir,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *this_abspath = svn__apr_hash_index_key(hi);
- const char *value = svn__apr_hash_index_val(hi);
- apr_array_header_t *ext_desc;
+ svn_node_kind_t kind;
+ const char *this_abspath = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
- SVN_ERR(svn_wc_parse_externals_description3(&ext_desc, this_abspath,
- value, FALSE,
- iterpool));
- if (ext_desc->nelts)
- SVN_ERR(relocate_externals(this_abspath, ext_desc, old_repos_root_url,
- new_repos_root_url, ctx, iterpool));
+ SVN_ERR(svn_wc__read_external_info(&kind, NULL, NULL, NULL, NULL,
+ ctx->wc_ctx,
+ local_abspath, this_abspath,
+ FALSE, iterpool, iterpool));
+
+ if (kind == svn_node_dir)
+ {
+ const char *this_repos_root_url;
+ svn_error_t *err;
+
+ err = svn_client_get_repos_root(&this_repos_root_url, NULL /* uuid */,
+ this_abspath, ctx, iterpool, iterpool);
+
+ /* Ignore externals that aren't present in the working copy.
+ * This can happen if an external is deleted from disk accidentally,
+ * or if an external is configured on a locally added directory. */
+ if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ continue;
+ }
+ SVN_ERR(err);
+
+ if (strcmp(old_repos_root_url, this_repos_root_url) == 0)
+ SVN_ERR(svn_client_relocate2(this_abspath, from_prefix, to_prefix,
+ FALSE /* ignore_externals */,
+ ctx, iterpool));
+ }
}
svn_pool_destroy(iterpool);
diff --git a/subversion/libsvn_client/repos_diff.c b/subversion/libsvn_client/repos_diff.c
index 6a7725f..58fe8aa 100644
--- a/subversion/libsvn_client/repos_diff.c
+++ b/subversion/libsvn_client/repos_diff.c
@@ -328,7 +328,7 @@ get_file_from_ra(struct file_baton *fb,
fb->pool, scratch_pool));
fstream = svn_stream_checksummed2(fstream, NULL, &fb->start_md5_checksum,
- svn_checksum_md5, TRUE, scratch_pool);
+ svn_checksum_md5, TRUE, fb->pool);
/* Retrieve the file and its properties */
SVN_ERR(svn_ra_get_file(fb->edit_baton->ra_session,
@@ -389,6 +389,10 @@ remove_non_prop_changes(apr_hash_t *pristine_props,
{
int i;
+ /* For added nodes, there is nothing to filter. */
+ if (apr_hash_count(pristine_props) == 0)
+ return;
+
for (i = 0; i < changes->nelts; i++)
{
svn_prop_t *change = &APR_ARRAY_IDX(changes, i, svn_prop_t);
@@ -581,8 +585,8 @@ diff_deleted_dir(const char *path,
hi = apr_hash_next(hi))
{
const char *child_path;
- const char *name = svn__apr_hash_index_key(hi);
- svn_dirent_t *dirent = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_dirent_t *dirent = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
@@ -1162,7 +1166,7 @@ change_file_prop(void *file_baton,
propchange = apr_array_push(fb->propchanges);
propchange->name = apr_pstrdup(fb->pool, name);
- propchange->value = value ? svn_string_dup(value, fb->pool) : NULL;
+ propchange->value = svn_string_dup(value, fb->pool);
return SVN_NO_ERROR;
}
@@ -1192,7 +1196,7 @@ change_dir_prop(void *dir_baton,
propchange = apr_array_push(db->propchanges);
propchange->name = apr_pstrdup(db->pool, name);
- propchange->value = value ? svn_string_dup(value, db->pool) : NULL;
+ propchange->value = svn_string_dup(value, db->pool);
return SVN_NO_ERROR;
}
@@ -1365,6 +1369,7 @@ svn_client__get_diff_editor2(const svn_delta_editor_t **editor,
eb->ra_session = ra_session;
eb->revision = revision;
+ eb->target_revision = SVN_INVALID_REVNUM;
eb->empty_file = NULL;
eb->empty_hash = apr_hash_make(eb->pool);
eb->text_deltas = text_deltas;
diff --git a/subversion/libsvn_client/resolved.c b/subversion/libsvn_client/resolved.c
index 0496371..8b94707 100644
--- a/subversion/libsvn_client/resolved.c
+++ b/subversion/libsvn_client/resolved.c
@@ -27,8 +27,6 @@
/*** Includes. ***/
-#include <stdlib.h>
-
#include "svn_types.h"
#include "svn_wc.h"
#include "svn_client.h"
@@ -39,6 +37,7 @@
#include "svn_hash.h"
#include "svn_sorts.h"
#include "client.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_wc_private.h"
#include "svn_private_config.h"
@@ -59,8 +58,7 @@ svn_client__resolve_conflicts(svn_boolean_t *conflicts_remain,
*conflicts_remain = FALSE;
SVN_ERR(svn_hash_keys(&array, conflicted_paths, scratch_pool));
- qsort(array->elts, array->nelts, array->elt_size,
- svn_sort_compare_paths);
+ svn_sort__array(array, svn_sort_compare_paths);
for (i = 0; i < array->nelts; i++)
{
@@ -79,7 +77,7 @@ svn_client__resolve_conflicts(svn_boolean_t *conflicts_remain,
ctx->notify_func2, ctx->notify_baton2,
iterpool));
- if (conflicts_remain)
+ if (conflicts_remain && !*conflicts_remain)
{
svn_error_t *err;
svn_boolean_t text_c, prop_c, tree_c;
diff --git a/subversion/libsvn_client/revert.c b/subversion/libsvn_client/revert.c
index 681e39c..d827014 100644
--- a/subversion/libsvn_client/revert.c
+++ b/subversion/libsvn_client/revert.c
@@ -49,6 +49,8 @@ struct revert_with_write_lock_baton {
svn_depth_t depth;
svn_boolean_t use_commit_times;
const apr_array_header_t *changelists;
+ svn_boolean_t clear_changelists;
+ svn_boolean_t metadata_only;
svn_client_ctx_t *ctx;
};
@@ -78,11 +80,13 @@ revert(void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool)
struct revert_with_write_lock_baton *b = baton;
svn_error_t *err;
- err = svn_wc_revert4(b->ctx->wc_ctx,
+ err = svn_wc_revert5(b->ctx->wc_ctx,
b->local_abspath,
b->depth,
b->use_commit_times,
b->changelists,
+ b->clear_changelists,
+ b->metadata_only,
b->ctx->cancel_func, b->ctx->cancel_baton,
b->ctx->notify_func2, b->ctx->notify_baton2,
scratch_pool);
@@ -96,11 +100,18 @@ revert(void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool)
|| err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
{
if (b->ctx->notify_func2)
- (*b->ctx->notify_func2)(
- b->ctx->notify_baton2,
- svn_wc_create_notify(b->local_abspath, svn_wc_notify_skip,
- scratch_pool),
- scratch_pool);
+ {
+ svn_wc_notify_t *notify;
+
+ notify = svn_wc_create_notify(b->local_abspath,
+ svn_wc_notify_skip,
+ scratch_pool);
+
+ notify->err = err;
+
+ b->ctx->notify_func2(b->ctx->notify_baton2,
+ notify, scratch_pool);
+ }
svn_error_clear(err);
}
else
@@ -112,13 +123,15 @@ revert(void *baton, apr_pool_t *result_pool, apr_pool_t *scratch_pool)
svn_error_t *
-svn_client_revert2(const apr_array_header_t *paths,
+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)
{
- apr_pool_t *subpool;
+ apr_pool_t *iterpool;
svn_error_t *err = SVN_NO_ERROR;
int i;
svn_config_t *cfg;
@@ -145,7 +158,7 @@ svn_client_revert2(const apr_array_header_t *paths,
SVN_CONFIG_OPTION_USE_COMMIT_TIMES,
FALSE));
- subpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(pool);
for (i = 0; i < paths->nelts; i++)
{
@@ -153,14 +166,14 @@ svn_client_revert2(const apr_array_header_t *paths,
const char *local_abspath, *lock_target;
svn_boolean_t wc_root;
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
/* See if we've been asked to cancel this operation. */
if ((ctx->cancel_func)
&& ((err = ctx->cancel_func(ctx->cancel_baton))))
goto errorful;
- err = svn_dirent_get_absolute(&local_abspath, path, pool);
+ err = svn_dirent_get_absolute(&local_abspath, path, iterpool);
if (err)
goto errorful;
@@ -168,15 +181,18 @@ svn_client_revert2(const apr_array_header_t *paths,
baton.depth = depth;
baton.use_commit_times = use_commit_times;
baton.changelists = changelists;
+ baton.clear_changelists = clear_changelists;
+ baton.metadata_only = metadata_only;
baton.ctx = ctx;
- err = svn_wc__is_wcroot(&wc_root, ctx->wc_ctx, local_abspath, pool);
+ err = svn_wc__is_wcroot(&wc_root, ctx->wc_ctx, local_abspath, iterpool);
if (err)
goto errorful;
lock_target = wc_root ? local_abspath
: svn_dirent_dirname(local_abspath, pool);
err = svn_wc__call_with_write_lock(revert, &baton, ctx->wc_ctx,
- lock_target, FALSE, pool, pool);
+ lock_target, FALSE,
+ iterpool, iterpool);
if (err)
goto errorful;
}
@@ -192,10 +208,10 @@ svn_client_revert2(const apr_array_header_t *paths,
if (paths->nelts == 1)
sleep_path = APR_ARRAY_IDX(paths, 0, const char *);
- svn_io_sleep_for_timestamps(sleep_path, subpool);
+ svn_io_sleep_for_timestamps(sleep_path, iterpool);
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
return svn_error_trace(err);
}
diff --git a/subversion/libsvn_client/revisions.c b/subversion/libsvn_client/revisions.c
index ec255c1..e61e7d4 100644
--- a/subversion/libsvn_client/revisions.c
+++ b/subversion/libsvn_client/revisions.c
@@ -92,6 +92,7 @@ svn_client__get_revision_number(svn_revnum_t *revnum,
goto invalid_rev_arg;
err = svn_wc__node_get_origin(NULL, revnum, NULL, NULL, NULL, NULL,
+ NULL,
wc_ctx, local_abspath, TRUE,
scratch_pool, scratch_pool);
diff --git a/subversion/libsvn_client/status.c b/subversion/libsvn_client/status.c
index e581d37..a701658 100644
--- a/subversion/libsvn_client/status.c
+++ b/subversion/libsvn_client/status.c
@@ -29,7 +29,9 @@
#include <apr_strings.h>
#include <apr_pools.h>
+#include "svn_private_config.h"
#include "svn_pools.h"
+#include "svn_sorts.h"
#include "client.h"
#include "svn_path.h"
@@ -39,9 +41,9 @@
#include "svn_error.h"
#include "svn_hash.h"
-#include "svn_private_config.h"
-#include "private/svn_wc_private.h"
#include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_wc_private.h"
/*** Getting update information ***/
@@ -195,8 +197,7 @@ reporter_finish_report(void *report_baton, apr_pool_t *pool)
server doesn't support lock discovery, we'll just not do locky
stuff. */
err = svn_ra_get_locks2(ras, &locks, "", rb->depth, rb->pool);
- if (err && ((err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
- || (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)))
+ if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
{
svn_error_clear(err);
err = SVN_NO_ERROR;
@@ -245,27 +246,32 @@ do_external_status(svn_client_ctx_t *ctx,
apr_hash_t *external_map,
svn_depth_t depth,
svn_boolean_t get_all,
- svn_boolean_t update,
+ svn_boolean_t check_out_of_date,
+ svn_boolean_t check_working_copy,
svn_boolean_t no_ignore,
+ const apr_array_header_t *changelists,
const char *anchor_abspath,
const char *anchor_relpath,
svn_client_status_func_t status_func,
void *status_baton,
apr_pool_t *scratch_pool)
{
- apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *externals;
+ int i;
+
+ externals = svn_sort__hash(external_map, svn_sort_compare_items_lexically,
+ scratch_pool);
/* Loop over the hash of new values (we don't care about the old
ones). This is a mapping of versioned directories to property
values. */
- for (hi = apr_hash_first(scratch_pool, external_map);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < externals->nelts; i++)
{
svn_node_kind_t external_kind;
- const char *local_abspath = svn__apr_hash_index_key(hi);
- const char *defining_abspath = svn__apr_hash_index_val(hi);
+ svn_sort__item_t item = APR_ARRAY_IDX(externals, i, svn_sort__item_t);
+ const char *local_abspath = item.key;
+ const char *defining_abspath = item.value;
svn_node_kind_t kind;
svn_opt_revision_t opt_rev;
const char *status_path;
@@ -309,9 +315,12 @@ do_external_status(svn_client_ctx_t *ctx,
}
/* And then do the status. */
- SVN_ERR(svn_client_status5(NULL, ctx, status_path, &opt_rev, depth,
- get_all, update, no_ignore, FALSE, FALSE,
- NULL, status_func, status_baton,
+ SVN_ERR(svn_client_status6(NULL, ctx, status_path, &opt_rev, depth,
+ get_all, check_out_of_date,
+ check_working_copy, no_ignore,
+ FALSE /* ignore_exernals */,
+ FALSE /* depth_as_sticky */,
+ changelists, status_func, status_baton,
iterpool));
}
@@ -325,13 +334,14 @@ do_external_status(svn_client_ctx_t *ctx,
svn_error_t *
-svn_client_status5(svn_revnum_t *result_rev,
+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 update,
+ 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,
@@ -348,6 +358,11 @@ svn_client_status5(svn_revnum_t *result_rev,
svn_error_t *err;
apr_hash_t *changelist_hash = NULL;
+ /* Override invalid combinations of the check_out_of_date and
+ check_working_copy flags. */
+ if (!check_out_of_date)
+ check_working_copy = TRUE;
+
if (svn_path_is_url(path))
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
_("'%s' is not a local path"), path);
@@ -366,7 +381,7 @@ svn_client_status5(svn_revnum_t *result_rev,
SVN_ERR(svn_dirent_get_absolute(&target_abspath, path, pool));
- if (update)
+ if (check_out_of_date)
{
/* The status editor only works on directories, so get the ancestor
if necessary */
@@ -434,7 +449,7 @@ svn_client_status5(svn_revnum_t *result_rev,
/* If we want to know about out-of-dateness, we crawl the working copy and
let the RA layer drive the editor for real. Otherwise, we just close the
edit. :-) */
- if (update)
+ if (check_out_of_date)
{
svn_ra_session_t *ra_session;
const char *URL;
@@ -464,14 +479,14 @@ svn_client_status5(svn_revnum_t *result_rev,
SVN_RA_CAPABILITY_DEPTH, pool));
SVN_ERR(svn_wc__get_status_editor(&editor, &edit_baton, &set_locks_baton,
- &edit_revision, ctx->wc_ctx,
- dir_abspath, target_basename,
- depth, get_all,
- no_ignore, depth_as_sticky,
- server_supports_depth,
- ignores, tweak_status, &sb,
- ctx->cancel_func, ctx->cancel_baton,
- pool, pool));
+ &edit_revision, ctx->wc_ctx,
+ dir_abspath, target_basename,
+ depth, get_all, check_working_copy,
+ no_ignore, depth_as_sticky,
+ server_supports_depth,
+ ignores, tweak_status, &sb,
+ ctx->cancel_func, ctx->cancel_baton,
+ pool, pool));
/* Verify that URL exists in HEAD. If it doesn't, this can save
@@ -562,7 +577,7 @@ svn_client_status5(svn_revnum_t *result_rev,
= svn_wc_create_notify(target_abspath,
svn_wc_notify_status_completed, pool);
notify->revision = edit_revision;
- (ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
/* If the caller wants the result revision, give it to them. */
@@ -590,14 +605,7 @@ svn_client_status5(svn_revnum_t *result_rev,
SVN_ERR(err);
}
- /* If there are svn:externals set, we don't want those to show up as
- unversioned or unrecognized, so patch up the hash. If caller wants
- all the statuses, we will change unversioned status items that
- are interesting to an svn:externals property to
- svn_wc_status_unversioned, otherwise we'll just remove the status
- item altogether.
-
- We only descend into an external if depth is svn_depth_infinity or
+ /* We only descend into an external if depth is svn_depth_infinity or
svn_depth_unknown. However, there are conceivable behaviors that
would involve descending under other circumstances; thus, we pass
depth anyway, so the code will DTRT if we change the conditional
@@ -613,7 +621,8 @@ svn_client_status5(svn_revnum_t *result_rev,
SVN_ERR(do_external_status(ctx, external_map,
depth, get_all,
- update, no_ignore,
+ check_out_of_date, check_working_copy,
+ no_ignore, changelists,
sb.anchor_abspath, sb.anchor_relpath,
status_func, status_baton, pool));
}
diff --git a/subversion/libsvn_client/switch.c b/subversion/libsvn_client/switch.c
index cd39cad..37ab05c 100644
--- a/subversion/libsvn_client/switch.c
+++ b/subversion/libsvn_client/switch.c
@@ -231,8 +231,6 @@ switch_internal(svn_revnum_t *result_rev,
yca = NULL; /* Not versioned */
else
{
- /* ### It would be nice if this function could reuse the existing
- ra session instead of opening two for its own use. */
SVN_ERR(svn_client__get_youngest_common_ancestor(
&yca, switch_loc, target_base_loc, ra_session, ctx,
pool, pool));
@@ -340,8 +338,8 @@ switch_internal(svn_revnum_t *result_rev,
*timestamp_sleep = TRUE;
/* Drive the reporter structure, describing the revisions within
- PATH. When we call reporter->finish_report, the update_editor
- will be driven by svn_repos_dir_delta2. */
+ LOCAL_ABSPATH. When this calls reporter->finish_report, the
+ reporter will drive the switch_editor. */
SVN_ERR(svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter,
report_baton, TRUE,
depth, (! depth_is_sticky),
@@ -367,7 +365,7 @@ switch_internal(svn_revnum_t *result_rev,
new_depths,
switch_loc->repos_root_url,
local_abspath,
- depth, timestamp_sleep,
+ depth, timestamp_sleep, ra_session,
ctx, pool));
}
@@ -382,7 +380,7 @@ switch_internal(svn_revnum_t *result_rev,
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
notify->revision = revnum;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
/* If the caller wants the result revision, give it to them. */
diff --git a/subversion/libsvn_client/update.c b/subversion/libsvn_client/update.c
index 0b006cc..3895aa2 100644
--- a/subversion/libsvn_client/update.c
+++ b/subversion/libsvn_client/update.c
@@ -196,10 +196,16 @@ record_conflict(svn_wc_conflict_result_t **result,
Add the paths of any conflict victims to CONFLICTED_PATHS, if that
is not null.
+
+ Use RA_SESSION_P to run the update if it is not NULL. If it is then
+ open a new ra session and place it in RA_SESSION_P. This allows
+ repeated calls to update_internal to reuse the same session.
*/
static svn_error_t *
update_internal(svn_revnum_t *result_rev,
+ svn_boolean_t *timestamp_sleep,
apr_hash_t *conflicted_paths,
+ svn_ra_session_t **ra_session_p,
const char *local_abspath,
const char *anchor_abspath,
const svn_opt_revision_t *revision,
@@ -208,10 +214,10 @@ update_internal(svn_revnum_t *result_rev,
svn_boolean_t ignore_externals,
svn_boolean_t allow_unver_obstructions,
svn_boolean_t adds_as_modification,
- svn_boolean_t *timestamp_sleep,
svn_boolean_t notify_summary,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const svn_delta_editor_t *update_editor;
void *update_edit_baton;
@@ -229,7 +235,7 @@ update_internal(svn_revnum_t *result_rev,
const char *diff3_cmd;
apr_hash_t *wcroot_iprops;
svn_opt_revision_t opt_rev;
- svn_ra_session_t *ra_session;
+ svn_ra_session_t *ra_session = *ra_session_p;
const char *preserved_exts_str;
apr_array_header_t *preserved_exts;
struct svn_client__dirent_fetcher_baton_t dfb;
@@ -248,7 +254,7 @@ update_internal(svn_revnum_t *result_rev,
depth_is_sticky = FALSE;
if (strcmp(local_abspath, anchor_abspath))
- target = svn_dirent_basename(local_abspath, pool);
+ target = svn_dirent_basename(local_abspath, scratch_pool);
else
target = "";
@@ -256,8 +262,8 @@ update_internal(svn_revnum_t *result_rev,
SVN_ERR(svn_wc__node_get_base(NULL, NULL, &repos_relpath, &repos_root_url,
&repos_uuid, NULL,
ctx->wc_ctx, anchor_abspath,
- TRUE, FALSE,
- pool, pool));
+ TRUE /* ignore_enoent */,
+ scratch_pool, scratch_pool));
/* It does not make sense to update conflict victims. */
if (repos_relpath)
@@ -266,11 +272,11 @@ update_internal(svn_revnum_t *result_rev,
svn_boolean_t text_conflicted, prop_conflicted;
anchor_url = svn_path_url_add_component2(repos_root_url, repos_relpath,
- pool);
+ scratch_pool);
err = svn_wc_conflicted_p3(&text_conflicted, &prop_conflicted,
NULL,
- ctx->wc_ctx, local_abspath, pool);
+ ctx->wc_ctx, local_abspath, scratch_pool);
if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
@@ -293,9 +299,9 @@ update_internal(svn_revnum_t *result_rev,
target_conflicted
? svn_wc_notify_skip_conflicted
: svn_wc_notify_update_skip_working_only,
- pool);
+ scratch_pool);
- ctx->notify_func2(ctx->notify_baton2, nt, pool);
+ ctx->notify_func2(ctx->notify_baton2, nt, scratch_pool);
}
return SVN_NO_ERROR;
}
@@ -312,32 +318,33 @@ update_internal(svn_revnum_t *result_rev,
local_abspath,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
- pool));
+ scratch_pool));
/* Target excluded, we are done now */
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc_read_kind2(&target_kind, ctx->wc_ctx, local_abspath,
- TRUE, TRUE, pool));
+ TRUE, TRUE, scratch_pool));
if (target_kind == svn_node_dir)
{
SVN_ERR(svn_wc_crop_tree2(ctx->wc_ctx, local_abspath, depth,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
- pool));
+ scratch_pool));
}
}
/* check whether the "clean c/o" optimization is applicable */
- SVN_ERR(is_empty_wc(&clean_checkout, local_abspath, anchor_abspath, pool));
+ SVN_ERR(is_empty_wc(&clean_checkout, local_abspath, anchor_abspath,
+ scratch_pool));
/* Get the external diff3, if any. */
svn_config_get(cfg, &diff3_cmd, SVN_CONFIG_SECTION_HELPERS,
SVN_CONFIG_OPTION_DIFF3_CMD, NULL);
if (diff3_cmd != NULL)
- SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
+ SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, scratch_pool));
/* See if the user wants last-commit timestamps instead of current ones. */
SVN_ERR(svn_config_get_bool(cfg, &use_commit_times,
@@ -349,7 +356,7 @@ update_internal(svn_revnum_t *result_rev,
svn_config_get(cfg, &preserved_exts_str, SVN_CONFIG_SECTION_MISCELLANY,
SVN_CONFIG_OPTION_PRESERVED_CF_EXTS, "");
preserved_exts = *preserved_exts_str
- ? svn_cstring_split(preserved_exts_str, "\n\r\t\v ", FALSE, pool)
+ ? svn_cstring_split(preserved_exts_str, "\n\r\t\v ", FALSE, scratch_pool)
: NULL;
/* Let everyone know we're starting a real update (unless we're
@@ -358,19 +365,52 @@ update_internal(svn_revnum_t *result_rev,
{
svn_wc_notify_t *notify
= svn_wc_create_notify(local_abspath, svn_wc_notify_update_started,
- pool);
+ scratch_pool);
notify->kind = svn_node_none;
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
- /* Open an RA session for the URL */
- SVN_ERR(svn_client__open_ra_session_internal(&ra_session, &corrected_url,
- anchor_url,
- anchor_abspath, NULL, TRUE,
- TRUE, ctx, pool, pool));
+ /* Try to reuse the RA session by reparenting it to the anchor_url.
+ * This code is probably overly cautious since we only use this
+ * currently when parents are missing and so all the anchor_urls
+ * have to be in the same repo. */
+ if (ra_session)
+ {
+ svn_error_t *err = svn_ra_reparent(ra_session, anchor_url, scratch_pool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
+ {
+ /* session changed repos, can't reuse it */
+ svn_error_clear(err);
+ ra_session = NULL;
+ }
+ else
+ {
+ return svn_error_trace(err);
+ }
+ }
+ else
+ {
+ corrected_url = NULL;
+ }
+ }
+
+ /* Open an RA session for the URL if one isn't already available */
+ if (!ra_session)
+ {
+ SVN_ERR(svn_client__open_ra_session_internal(&ra_session, &corrected_url,
+ anchor_url,
+ anchor_abspath, NULL,
+ TRUE /* write_dav_props */,
+ TRUE /* read_dav_props */,
+ ctx,
+ result_pool, scratch_pool));
+ *ra_session_p = ra_session;
+ }
/* If we got a corrected URL from the RA subsystem, we'll need to
relocate our working copy first. */
@@ -380,12 +420,13 @@ update_internal(svn_revnum_t *result_rev,
/* To relocate everything inside our repository we need the old and new
repos root. */
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &new_repos_root_url, pool));
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &new_repos_root_url,
+ scratch_pool));
/* svn_client_relocate2() will check the uuid */
SVN_ERR(svn_client_relocate2(anchor_abspath, repos_root_url,
new_repos_root_url, ignore_externals,
- ctx, pool));
+ ctx, scratch_pool));
/* Store updated repository root for externals */
repos_root_url = new_repos_root_url;
@@ -406,10 +447,10 @@ update_internal(svn_revnum_t *result_rev,
to take a URL as easily as a local path? */
SVN_ERR(svn_client__get_revision_number(&revnum, NULL, ctx->wc_ctx,
local_abspath, ra_session, &opt_rev,
- pool));
+ scratch_pool));
SVN_ERR(svn_ra_has_capability(ra_session, &server_supports_depth,
- SVN_RA_CAPABILITY_DEPTH, pool));
+ SVN_RA_CAPABILITY_DEPTH, scratch_pool));
dfb.ra_session = ra_session;
dfb.target_revision = revnum;
@@ -417,7 +458,7 @@ update_internal(svn_revnum_t *result_rev,
SVN_ERR(svn_client__get_inheritable_props(&wcroot_iprops, local_abspath,
revnum, depth, ra_session,
- ctx, pool, pool));
+ ctx, scratch_pool, scratch_pool));
/* Fetch the update editor. If REVISION is invalid, that's okay;
the RA driver will call editor->set_target_revision later on. */
@@ -436,7 +477,7 @@ update_internal(svn_revnum_t *result_rev,
NULL, NULL,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
- pool, pool));
+ scratch_pool, scratch_pool));
/* Tell RA to do an update of URL+TARGET to REVISION; if we pass an
invalid revnum, that means RA will use the latest revision. */
@@ -447,15 +488,16 @@ update_internal(svn_revnum_t *result_rev,
: svn_depth_unknown),
FALSE /* send_copyfrom_args */,
FALSE /* ignore_ancestry */,
- update_editor, update_edit_baton, pool, pool));
+ update_editor, update_edit_baton,
+ scratch_pool, scratch_pool));
/* Past this point, we assume the WC is going to be modified so we will
* need to sleep for timestamps. */
*timestamp_sleep = TRUE;
/* Drive the reporter structure, describing the revisions within
- PATH. When we call reporter->finish_report, the
- update_editor will be driven by svn_repos_dir_delta2. */
+ LOCAL_ABSPATH. When this calls reporter->finish_report, the
+ reporter will drive the update_editor. */
SVN_ERR(svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter,
report_baton, TRUE,
depth, (! depth_is_sticky),
@@ -463,7 +505,7 @@ update_internal(svn_revnum_t *result_rev,
use_commit_times,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
- pool));
+ scratch_pool));
/* We handle externals after the update is complete, so that
handling external items (and any errors therefrom) doesn't delay
@@ -476,13 +518,14 @@ update_internal(svn_revnum_t *result_rev,
SVN_ERR(svn_wc__externals_gather_definitions(&new_externals,
&new_depths,
ctx->wc_ctx, local_abspath,
- depth, pool, pool));
+ depth,
+ scratch_pool, scratch_pool));
SVN_ERR(svn_client__handle_externals(new_externals,
new_depths,
repos_root_url, local_abspath,
- depth, timestamp_sleep,
- ctx, pool));
+ depth, timestamp_sleep, ra_session,
+ ctx, scratch_pool));
}
/* Let everyone know we're finished here (unless we're asked not to). */
@@ -490,13 +533,13 @@ update_internal(svn_revnum_t *result_rev,
{
svn_wc_notify_t *notify
= svn_wc_create_notify(local_abspath, svn_wc_notify_update_completed,
- pool);
+ scratch_pool);
notify->kind = svn_node_none;
notify->content_state = notify->prop_state
= svn_wc_notify_state_inapplicable;
notify->lock_state = svn_wc_notify_lock_state_inapplicable;
notify->revision = revnum;
- (*ctx->notify_func2)(ctx->notify_baton2, notify, pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
}
/* If the caller wants the result revision, give it to them. */
@@ -508,6 +551,7 @@ update_internal(svn_revnum_t *result_rev,
svn_error_t *
svn_client__update_internal(svn_revnum_t *result_rev,
+ svn_boolean_t *timestamp_sleep,
const char *local_abspath,
const svn_opt_revision_t *revision,
svn_depth_t depth,
@@ -517,7 +561,7 @@ svn_client__update_internal(svn_revnum_t *result_rev,
svn_boolean_t adds_as_modification,
svn_boolean_t make_parents,
svn_boolean_t innerupdate,
- svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
@@ -536,16 +580,21 @@ svn_client__update_internal(svn_revnum_t *result_rev,
const char *parent_abspath = local_abspath;
apr_array_header_t *missing_parents =
apr_array_make(pool, 4, sizeof(const char *));
+ apr_pool_t *iterpool;
+
+ iterpool = svn_pool_create(pool);
while (1)
{
+ svn_pool_clear(iterpool);
+
/* Try to lock. If we can't lock because our target (or its
parent) isn't a working copy, we'll try to walk up the
tree to find a working copy, remembering this path's
parent as one we need to flesh out. */
err = svn_wc__acquire_write_lock(&lockroot_abspath, ctx->wc_ctx,
parent_abspath, !innerupdate,
- pool, pool);
+ pool, iterpool);
if (!err)
break;
if ((err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY)
@@ -567,12 +616,14 @@ svn_client__update_internal(svn_revnum_t *result_rev,
const char *missing_parent =
APR_ARRAY_IDX(missing_parents, i, const char *);
- err = update_internal(result_rev, conflicted_paths,
- missing_parent, anchor_abspath,
- &peg_revision, svn_depth_empty, FALSE,
- ignore_externals, allow_unver_obstructions,
- adds_as_modification, timestamp_sleep,
- FALSE, ctx, pool);
+ svn_pool_clear(iterpool);
+
+ err = update_internal(result_rev, timestamp_sleep, conflicted_paths,
+ &ra_session, missing_parent,
+ anchor_abspath, &peg_revision, svn_depth_empty,
+ FALSE, ignore_externals,
+ allow_unver_obstructions, adds_as_modification,
+ FALSE, ctx, pool, iterpool);
if (err)
goto cleanup;
anchor_abspath = missing_parent;
@@ -583,6 +634,8 @@ svn_client__update_internal(svn_revnum_t *result_rev,
peg_revision.kind = svn_opt_revision_number;
peg_revision.value.number = *result_rev;
}
+
+ svn_pool_destroy(iterpool);
}
else
{
@@ -592,16 +645,17 @@ svn_client__update_internal(svn_revnum_t *result_rev,
anchor_abspath = lockroot_abspath;
}
- err = update_internal(result_rev, conflicted_paths,
+ err = update_internal(result_rev, timestamp_sleep, conflicted_paths,
+ &ra_session,
local_abspath, anchor_abspath,
&peg_revision, depth, depth_is_sticky,
ignore_externals, allow_unver_obstructions,
- adds_as_modification, timestamp_sleep,
- TRUE, ctx, pool);
+ adds_as_modification,
+ TRUE, ctx, pool, pool);
/* Give the conflict resolver callback the opportunity to
* resolve any conflicts that were raised. */
- if (! err && ctx->conflict_func2)
+ if (! err && ctx->conflict_func2 && apr_hash_count(conflicted_paths))
{
err = svn_client__resolve_conflicts(NULL, conflicted_paths, ctx, pool);
}
@@ -633,6 +687,7 @@ svn_client_update4(apr_array_header_t **result_revs,
const char *path = NULL;
svn_boolean_t sleep = FALSE;
svn_error_t *err = SVN_NO_ERROR;
+ svn_boolean_t found_valid_target = FALSE;
if (result_revs)
*result_revs = apr_array_make(pool, paths->nelts, sizeof(svn_revnum_t));
@@ -664,14 +719,13 @@ svn_client_update4(apr_array_header_t **result_revs,
err = svn_dirent_get_absolute(&local_abspath, path, iterpool);
if (err)
goto cleanup;
- err = svn_client__update_internal(&result_rev, local_abspath,
+ err = svn_client__update_internal(&result_rev, &sleep, local_abspath,
revision, depth, depth_is_sticky,
ignore_externals,
allow_unver_obstructions,
adds_as_modification,
make_parents,
- FALSE, &sleep,
- ctx,
+ FALSE, NULL, ctx,
iterpool);
if (err)
@@ -691,15 +745,21 @@ svn_client_update4(apr_array_header_t **result_revs,
notify = svn_wc_create_notify(path,
svn_wc_notify_skip,
iterpool);
- (*ctx->notify_func2)(ctx->notify_baton2, notify, iterpool);
+ ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
}
}
+ else
+ found_valid_target = TRUE;
+
if (result_revs)
APR_ARRAY_PUSH(*result_revs, svn_revnum_t) = result_rev;
}
svn_pool_destroy(iterpool);
cleanup:
+ if (!err && !found_valid_target)
+ return svn_error_create(SVN_ERR_WC_NOT_WORKING_COPY, NULL,
+ _("None of the targets are working copies"));
if (sleep)
{
const char *wcroot_abspath;
diff --git a/subversion/libsvn_client/upgrade.c b/subversion/libsvn_client/upgrade.c
index 7a69619..5677b1c 100644
--- a/subversion/libsvn_client/upgrade.c
+++ b/subversion/libsvn_client/upgrade.c
@@ -83,11 +83,13 @@ fetch_repos_info(const char **repos_root,
}
/* Forward definition. Upgrades svn:externals properties in the working copy
- LOCAL_ABSPATH to the WC-NG storage.
+ LOCAL_ABSPATH to the WC-NG storage. INFO_BATON will be used to fetch
+ repository info using fetch_repos_info() function if needed.
*/
static svn_error_t *
upgrade_externals_from_properties(svn_client_ctx_t *ctx,
const char *local_abspath,
+ struct repos_info_baton *info_baton,
apr_pool_t *scratch_pool);
svn_error_t *
@@ -138,7 +140,7 @@ svn_client_upgrade(const char *path,
svn_pool_clear(iterpool);
- ext_abspath = svn__apr_hash_index_key(hi);
+ ext_abspath = apr_hash_this_key(hi);
SVN_ERR(svn_wc__read_external_info(&kind, NULL, NULL, NULL, NULL,
ctx->wc_ctx, local_abspath,
@@ -172,7 +174,7 @@ svn_client_upgrade(const char *path,
(There is no way to detect the difference from libsvn_client :( ) */
SVN_ERR(upgrade_externals_from_properties(ctx, local_abspath,
- scratch_pool));
+ &info_baton, scratch_pool));
}
return SVN_NO_ERROR;
}
@@ -180,6 +182,7 @@ svn_client_upgrade(const char *path,
static svn_error_t *
upgrade_externals_from_properties(svn_client_ctx_t *ctx,
const char *local_abspath,
+ struct repos_info_baton *info_baton,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
@@ -187,7 +190,6 @@ upgrade_externals_from_properties(svn_client_ctx_t *ctx,
apr_pool_t *iterpool2;
apr_hash_t *externals;
svn_opt_revision_t rev = {svn_opt_revision_unspecified, {0}};
- struct repos_info_baton info_baton;
/* Now it's time to upgrade the externals too. We do it after the wc
upgrade to avoid that errors in the externals causes the wc upgrade to
@@ -209,8 +211,8 @@ upgrade_externals_from_properties(svn_client_ctx_t *ctx,
const char *externals_parent_url;
const char *externals_parent_repos_root_url;
const char *externals_parent_repos_relpath;
- const char *externals_parent = svn__apr_hash_index_key(hi);
- svn_string_t *external_desc = svn__apr_hash_index_val(hi);
+ const char *externals_parent = apr_hash_this_key(hi);
+ svn_string_t *external_desc = apr_hash_this_val(hi);
apr_array_header_t *externals_p;
svn_error_t *err;
@@ -345,7 +347,7 @@ upgrade_externals_from_properties(svn_client_ctx_t *ctx,
{
err = fetch_repos_info(&repos_root_url,
&repos_uuid,
- &info_baton,
+ info_baton,
resolved_url,
scratch_pool, scratch_pool);
if (err)
diff --git a/subversion/libsvn_client/util.c b/subversion/libsvn_client/util.c
index 06855e7..248412b 100644
--- a/subversion/libsvn_client/util.c
+++ b/subversion/libsvn_client/util.c
@@ -138,7 +138,13 @@ svn_client__pathrev_fspath(const svn_client__pathrev_t *pathrev,
svn_client_commit_item3_t *
svn_client_commit_item3_create(apr_pool_t *pool)
{
- return apr_pcalloc(pool, sizeof(svn_client_commit_item3_t));
+ svn_client_commit_item3_t *item = apr_pcalloc(pool, sizeof(*item));
+
+ item->revision = SVN_INVALID_REVNUM;
+ item->copyfrom_rev = SVN_INVALID_REVNUM;
+ item->kind = svn_node_unknown;
+
+ return item;
}
svn_client_commit_item3_t *
@@ -195,7 +201,6 @@ svn_client__wc_node_get_base(svn_client__pathrev_t **base_p,
NULL,
wc_ctx, wc_abspath,
TRUE /* ignore_enoent */,
- TRUE /* show_hidden */,
result_pool, scratch_pool));
if ((*base_p)->repos_root_url && relpath)
{
@@ -225,7 +230,8 @@ svn_client__wc_node_get_origin(svn_client__pathrev_t **origin_p,
&relpath,
&(*origin_p)->repos_root_url,
&(*origin_p)->repos_uuid,
- NULL, ctx->wc_ctx, wc_abspath,
+ NULL, NULL,
+ ctx->wc_ctx, wc_abspath,
FALSE /* scan_deleted */,
result_pool, scratch_pool));
if ((*origin_p)->repos_root_url && relpath)
diff --git a/subversion/libsvn_delta/compat.c b/subversion/libsvn_delta/compat.c
index 470efa2..dfa9743 100644
--- a/subversion/libsvn_delta/compat.c
+++ b/subversion/libsvn_delta/compat.c
@@ -36,6 +36,8 @@
#include "svn_private_config.h"
#include "private/svn_delta_private.h"
+#include "private/svn_sorts_private.h"
+#include "svn_private_config.h"
struct file_rev_handler_wrapper_baton {
@@ -188,6 +190,7 @@ struct change_node
apr_hash_t *props; /* new/final set of props to apply */
+ svn_boolean_t contents_changed; /* the file contents changed */
const char *contents_abspath; /* file containing new fulltext */
svn_checksum_t *checksum; /* checksum of new fulltext */
@@ -292,7 +295,7 @@ get_children(struct ev2_edit_baton *eb,
for (hi = apr_hash_first(pool, eb->changes); hi; hi = apr_hash_next(hi))
{
- const char *repos_relpath = svn__apr_hash_index_key(hi);
+ const char *repos_relpath = apr_hash_this_key(hi);
const char *child;
/* Find potential children. */
@@ -347,17 +350,26 @@ process_actions(struct ev2_edit_baton *eb,
return SVN_NO_ERROR;
}
- if (change->contents_abspath != NULL)
+ if (change->contents_changed)
{
/* We can only set text on files. */
/* ### validate we aren't overwriting KIND? */
kind = svn_node_file;
- /* ### the checksum might be in CHANGE->CHECKSUM */
- SVN_ERR(svn_io_file_checksum2(&checksum, change->contents_abspath,
- svn_checksum_sha1, scratch_pool));
- SVN_ERR(svn_stream_open_readonly(&contents, change->contents_abspath,
- scratch_pool, scratch_pool));
+ if (change->contents_abspath)
+ {
+ /* ### the checksum might be in CHANGE->CHECKSUM */
+ SVN_ERR(svn_io_file_checksum2(&checksum, change->contents_abspath,
+ svn_checksum_sha1, scratch_pool));
+ SVN_ERR(svn_stream_open_readonly(&contents, change->contents_abspath,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ contents = svn_stream_empty(scratch_pool);
+ checksum = svn_checksum_empty_checksum(svn_checksum_sha1,
+ scratch_pool);
+ }
}
if (change->props != NULL)
@@ -399,7 +411,7 @@ process_actions(struct ev2_edit_baton *eb,
else
{
/* If this file was added, but apply_txdelta() was not
- called (ie. no CONTENTS_ABSPATH), then we're adding
+ called (i.e., CONTENTS_CHANGED is FALSE), then we're adding
an empty file. */
if (change->contents_abspath == NULL)
{
@@ -440,8 +452,8 @@ process_actions(struct ev2_edit_baton *eb,
change->changing, NULL, props));
else
SVN_ERR(svn_editor_alter_file(eb->editor, repos_relpath,
- change->changing, props,
- checksum, contents));
+ change->changing,
+ checksum, contents, props));
}
return SVN_NO_ERROR;
@@ -789,6 +801,26 @@ window_handler(svn_txdelta_window_t *window, void *baton)
return svn_error_trace(err);
}
+/* Lazy-open handler for getting a read-only stream of the delta base. */
+static svn_error_t *
+open_delta_base(svn_stream_t **stream, void *baton,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ const char *const delta_base = baton;
+ return svn_stream_open_readonly(stream, delta_base,
+ result_pool, scratch_pool);
+}
+
+/* Lazy-open handler for opening a stream for the delta result. */
+static svn_error_t *
+open_delta_target(svn_stream_t **stream, void *baton,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ const char **delta_target = baton;
+ return svn_stream_open_unique(stream, delta_target, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool);
+}
static svn_error_t *
ev2_apply_textdelta(void *file_baton,
@@ -802,10 +834,9 @@ ev2_apply_textdelta(void *file_baton,
struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
struct change_node *change;
svn_stream_t *target;
- /* ### fix this. for now, we know this has a "short" lifetime. */
- apr_pool_t *scratch_pool = handler_pool;
change = locate_change(fb->eb, fb->path);
+ SVN_ERR_ASSERT(!change->contents_changed);
SVN_ERR_ASSERT(change->contents_abspath == NULL);
SVN_ERR_ASSERT(!SVN_IS_VALID_REVNUM(change->changing)
|| change->changing == fb->base_revision);
@@ -814,12 +845,14 @@ ev2_apply_textdelta(void *file_baton,
if (! fb->delta_base)
hb->source = svn_stream_empty(handler_pool);
else
- SVN_ERR(svn_stream_open_readonly(&hb->source, fb->delta_base, handler_pool,
- scratch_pool));
+ hb->source = svn_stream_lazyopen_create(open_delta_base,
+ (char*)fb->delta_base,
+ FALSE, handler_pool);
- SVN_ERR(svn_stream_open_unique(&target, &change->contents_abspath, NULL,
- svn_io_file_del_on_pool_cleanup,
- fb->eb->edit_pool, scratch_pool));
+ change->contents_changed = TRUE;
+ target = svn_stream_lazyopen_create(open_delta_target,
+ &change->contents_abspath,
+ FALSE, fb->eb->edit_pool);
svn_txdelta_apply(hb->source, target,
NULL, NULL,
@@ -1106,6 +1139,7 @@ add_file_cb(void *baton,
change->kind = svn_node_file;
change->deleting = replaces_rev;
change->props = svn_prop_hash_dup(props, eb->edit_pool);
+ change->contents_changed = TRUE;
change->contents_abspath = tmp_filename;
change->checksum = svn_checksum_dup(md5_checksum, eb->edit_pool);
@@ -1183,9 +1217,9 @@ static svn_error_t *
alter_file_cb(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)
{
struct editor_baton *eb = baton;
@@ -1199,12 +1233,12 @@ alter_file_cb(void *baton,
if (contents)
{
/* We may need to re-checksum these contents */
- if (!(checksum && checksum->kind == svn_checksum_md5))
+ if (checksum && checksum->kind == svn_checksum_md5)
+ md5_checksum = (svn_checksum_t *)checksum;
+ else
contents = svn_stream_checksummed2(contents, &md5_checksum, NULL,
svn_checksum_md5, TRUE,
scratch_pool);
- else
- md5_checksum = (svn_checksum_t *)checksum;
/* Spool the contents to a tempfile, and provide that to the driver. */
SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_filename, NULL,
@@ -1223,6 +1257,7 @@ alter_file_cb(void *baton,
change->props = svn_prop_hash_dup(props, eb->edit_pool);
if (contents != NULL)
{
+ change->contents_changed = TRUE;
change->contents_abspath = tmp_filename;
change->checksum = svn_checksum_dup(md5_checksum, eb->edit_pool);
}
@@ -1235,8 +1270,8 @@ static svn_error_t *
alter_symlink_cb(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)
{
/* ### should we verify the kind is truly a symlink? */
@@ -1331,17 +1366,6 @@ move_cb(void *baton,
return SVN_NO_ERROR;
}
-/* This implements svn_editor_cb_rotate_t */
-static svn_error_t *
-rotate_cb(void *baton,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions,
- apr_pool_t *scratch_pool)
-{
- SVN__NOT_IMPLEMENTED();
-}
-
-
static int
count_components(const char *relpath)
{
@@ -1640,7 +1664,7 @@ apply_change(void **dir_baton,
/* Make this an FS path by prepending "/" */
if (copyfrom_url[0] != '/')
copyfrom_url = apr_pstrcat(scratch_pool, "/",
- copyfrom_url, NULL);
+ copyfrom_url, SVN_VA_NULL);
}
copyfrom_rev = change->copyfrom_rev;
@@ -1673,7 +1697,7 @@ apply_change(void **dir_baton,
else
SVN_ERR(drive_ev1_props(eb, relpath, change, file_baton, scratch_pool));
- if (change->contents_abspath)
+ if (change->contents_changed && change->contents_abspath)
{
svn_txdelta_window_handler_t handler;
void *handler_baton;
@@ -1889,7 +1913,6 @@ svn_delta__editor_from_delta(svn_editor_t **editor_p,
delete_cb,
copy_cb,
move_cb,
- rotate_cb,
complete_cb,
abort_cb
};
diff --git a/subversion/libsvn_delta/compose_delta.c b/subversion/libsvn_delta/compose_delta.c
index 7b96438..6d757f2 100644
--- a/subversion/libsvn_delta/compose_delta.c
+++ b/subversion/libsvn_delta/compose_delta.c
@@ -648,15 +648,18 @@ copy_source_ops(apr_size_t offset, apr_size_t limit,
{
const svn_txdelta_op_t *const op = &window->ops[op_ndx];
const apr_size_t *const off = &ndx->offs[op_ndx];
- apr_size_t fix_offset;
- apr_size_t fix_limit;
-
+ const apr_size_t fix_offset = (offset > off[0] ? offset - off[0] : 0);
+ const apr_size_t fix_limit = (off[0] >= limit ? 0
+ : (off[1] > limit ? off[1] - limit : 0));
+
+ /* Ideally, we'd do this check before assigning fix_offset and
+ fix_limit; but then we couldn't make them const whilst still
+ adhering to C90 rules. Instead, we're going to assume that a
+ smart optimizing compiler will reorder this check before the
+ local variable initialization. */
if (off[0] >= limit)
break;
- fix_offset = (offset > off[0] ? offset - off[0] : 0);
- fix_limit = (off[1] > limit ? off[1] - limit : 0);
-
/* It would be extremely weird if the fixed-up op had zero length. */
assert(fix_offset + fix_limit < op->length);
@@ -701,23 +704,22 @@ copy_source_ops(apr_size_t offset, apr_size_t limit,
apr_size_t tgt_off = target_offset;
assert(ptn_length > ptn_overlap);
- /* ### FIXME: ptn_overlap is unsigned, so the if() condition
- below is always true! Either it should be '> 0', or the
- code block should be unconditional. See also r842362. */
- if (ptn_overlap >= 0)
- {
- /* Issue second subrange in the pattern. */
- const apr_size_t length =
- MIN(op->length - fix_off - fix_limit,
- ptn_length - ptn_overlap);
- copy_source_ops(op->offset + ptn_overlap,
- op->offset + ptn_overlap + length,
- tgt_off,
- op_ndx,
- build_baton, window, ndx, pool);
- fix_off += length;
- tgt_off += length;
- }
+ /* Unconditionally issue the second subrange of the
+ pattern. This is always correct, since the outer
+ condition already verifies that there is an overlap
+ in the target copy. */
+ {
+ const apr_size_t length =
+ MIN(op->length - fix_off - fix_limit,
+ ptn_length - ptn_overlap);
+ copy_source_ops(op->offset + ptn_overlap,
+ op->offset + ptn_overlap + length,
+ tgt_off,
+ op_ndx,
+ build_baton, window, ndx, pool);
+ fix_off += length;
+ tgt_off += length;
+ }
assert(fix_off + fix_limit <= op->length);
if (ptn_overlap > 0
diff --git a/subversion/libsvn_delta/debug_editor.c b/subversion/libsvn_delta/debug_editor.c
index 7c2cdec..8ca7b20 100644
--- a/subversion/libsvn_delta/debug_editor.c
+++ b/subversion/libsvn_delta/debug_editor.c
@@ -33,6 +33,7 @@ struct edit_baton
int indent_level;
svn_stream_t *out;
+ const char *prefix;
};
struct dir_baton
@@ -52,8 +53,7 @@ write_indent(struct edit_baton *eb, apr_pool_t *pool)
{
int i;
- /* This is DBG_FLAG from ../libsvn_subr/debug.c */
- SVN_ERR(svn_stream_puts(eb->out, "DBG:"));
+ SVN_ERR(svn_stream_puts(eb->out, eb->prefix));
for (i = 0; i < eb->indent_level; ++i)
SVN_ERR(svn_stream_puts(eb->out, " "));
@@ -346,8 +346,8 @@ change_file_prop(void *file_baton,
struct edit_baton *eb = fb->edit_baton;
SVN_ERR(write_indent(eb, pool));
- SVN_ERR(svn_stream_printf(eb->out, pool, "change_file_prop : %s\n",
- name));
+ SVN_ERR(svn_stream_printf(eb->out, pool, "change_file_prop : %s -> %s\n",
+ name, value ? value->data : "<deleted>"));
SVN_ERR(eb->wrapped_editor->change_file_prop(fb->wrapped_file_baton,
name,
@@ -367,7 +367,8 @@ change_dir_prop(void *dir_baton,
struct edit_baton *eb = db->edit_baton;
SVN_ERR(write_indent(eb, pool));
- SVN_ERR(svn_stream_printf(eb->out, pool, "change_dir_prop : %s\n", name));
+ SVN_ERR(svn_stream_printf(eb->out, pool, "change_dir_prop : %s -> %s\n",
+ name, value ? value->data : "<deleted>"));
SVN_ERR(eb->wrapped_editor->change_dir_prop(db->wrapped_dir_baton,
name,
@@ -391,19 +392,34 @@ close_edit(void *edit_baton,
return SVN_NO_ERROR;
}
+static svn_error_t *
+abort_edit(void *edit_baton,
+ apr_pool_t *pool)
+{
+ struct edit_baton *eb = edit_baton;
+
+ SVN_ERR(write_indent(eb, pool));
+ SVN_ERR(svn_stream_printf(eb->out, pool, "abort_edit\n"));
+
+ SVN_ERR(eb->wrapped_editor->abort_edit(eb->wrapped_edit_baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_delta__get_debug_editor(const svn_delta_editor_t **editor,
void **edit_baton,
const svn_delta_editor_t *wrapped_editor,
void *wrapped_edit_baton,
+ const char *prefix,
apr_pool_t *pool)
{
- svn_delta_editor_t *tree_editor = svn_delta_default_editor(pool);
+ svn_delta_editor_t *tree_editor = apr_palloc(pool, sizeof(*tree_editor));
struct edit_baton *eb = apr_palloc(pool, sizeof(*eb));
apr_file_t *errfp;
svn_stream_t *out;
- apr_status_t apr_err = apr_file_open_stderr(&errfp, pool);
+ apr_status_t apr_err = apr_file_open_stdout(&errfp, pool);
if (apr_err)
return svn_error_wrap_apr(apr_err, "Problem opening stderr");
@@ -424,11 +440,14 @@ svn_delta__get_debug_editor(const svn_delta_editor_t **editor,
tree_editor->close_file = close_file;
tree_editor->absent_file = absent_file;
tree_editor->close_edit = close_edit;
+ tree_editor->abort_edit = abort_edit;
eb->wrapped_editor = wrapped_editor;
eb->wrapped_edit_baton = wrapped_edit_baton;
eb->out = out;
eb->indent_level = 0;
+ /* This is DBG_FLAG from ../libsvn_subr/debug.c */
+ eb->prefix = apr_pstrcat(pool, "DBG: ", prefix, SVN_VA_NULL);
*editor = tree_editor;
*edit_baton = eb;
diff --git a/subversion/libsvn_delta/debug_editor.h b/subversion/libsvn_delta/debug_editor.h
index 2b031af..63c90d3 100644
--- a/subversion/libsvn_delta/debug_editor.h
+++ b/subversion/libsvn_delta/debug_editor.h
@@ -32,14 +32,19 @@ extern "C" {
/* Return a debug editor that wraps @a wrapped_editor.
*
* The debug editor simply prints an indication of what callbacks are being
- * called to @c stderr, and is only intended for use in debugging subversion
+ * called to @c stdout, and is only intended for use in debugging subversion
* editors.
+ *
+ * @a prefix, if non-null, is printed between "DBG: " and each indication.
+ *
+ * Note: Our test suite generally ignores stdout lines starting with "DBG:".
*/
svn_error_t *
svn_delta__get_debug_editor(const svn_delta_editor_t **editor,
void **edit_baton,
const svn_delta_editor_t *wrapped_editor,
void *wrapped_baton,
+ const char *prefix,
apr_pool_t *pool);
#ifdef __cplusplus
diff --git a/subversion/libsvn_delta/editor.c b/subversion/libsvn_delta/editor.c
index 1dc94b2..1c5e298 100644
--- a/subversion/libsvn_delta/editor.c
+++ b/subversion/libsvn_delta/editor.c
@@ -391,16 +391,6 @@ svn_editor_setcb_move(svn_editor_t *editor,
svn_error_t *
-svn_editor_setcb_rotate(svn_editor_t *editor,
- svn_editor_cb_rotate_t callback,
- apr_pool_t *scratch_pool)
-{
- editor->funcs.cb_rotate = callback;
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
svn_editor_setcb_complete(svn_editor_t *editor,
svn_editor_cb_complete_t callback,
apr_pool_t *scratch_pool)
@@ -437,7 +427,6 @@ svn_editor_setcb_many(svn_editor_t *editor,
COPY_CALLBACK(cb_delete);
COPY_CALLBACK(cb_copy);
COPY_CALLBACK(cb_move);
- COPY_CALLBACK(cb_rotate);
COPY_CALLBACK(cb_complete);
COPY_CALLBACK(cb_abort);
@@ -683,9 +672,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)
{
svn_error_t *err = SVN_NO_ERROR;
@@ -705,8 +694,8 @@ svn_editor_alter_file(svn_editor_t *editor,
{
START_CALLBACK(editor);
err = editor->funcs.cb_alter_file(editor->baton,
- relpath, revision, props,
- checksum, contents,
+ relpath, revision,
+ checksum, contents, props,
editor->scratch_pool);
END_CALLBACK(editor);
}
@@ -723,8 +712,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)
{
svn_error_t *err = SVN_NO_ERROR;
@@ -740,8 +729,8 @@ svn_editor_alter_symlink(svn_editor_t *editor,
{
START_CALLBACK(editor);
err = editor->funcs.cb_alter_symlink(editor->baton,
- relpath, revision, props,
- target,
+ relpath, revision,
+ target, props,
editor->scratch_pool);
END_CALLBACK(editor);
}
@@ -862,56 +851,6 @@ svn_editor_move(svn_editor_t *editor,
svn_error_t *
-svn_editor_rotate(svn_editor_t *editor,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions)
-{
- svn_error_t *err = SVN_NO_ERROR;
-
- SHOULD_NOT_BE_FINISHED(editor);
-#ifdef ENABLE_ORDERING_CHECK
- {
- int i;
- for (i = 0; i < relpaths->nelts; i++)
- {
- const char *relpath = APR_ARRAY_IDX(relpaths, i, const char *);
-
- SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
- SHOULD_NOT_BE_COMPLETED(editor, relpath);
- VERIFY_PARENT_MAY_EXIST(editor, relpath);
- CHILD_DELETIONS_ALLOWED(editor, relpath);
- }
- }
-#endif
-
- SVN_ERR(check_cancel(editor));
-
- if (editor->funcs.cb_rotate)
- {
- START_CALLBACK(editor);
- err = editor->funcs.cb_rotate(editor->baton, relpaths, revisions,
- editor->scratch_pool);
- END_CALLBACK(editor);
- }
-
-#ifdef ENABLE_ORDERING_CHECK
- {
- int i;
- for (i = 0; i < relpaths->nelts; i++)
- {
- const char *relpath = APR_ARRAY_IDX(relpaths, i, const char *);
- MARK_ALLOW_ALTER(editor, relpath);
- MARK_PARENT_STABLE(editor, relpath);
- }
- }
-#endif
-
- svn_pool_clear(editor->scratch_pool);
- return svn_error_trace(err);
-}
-
-
-svn_error_t *
svn_editor_complete(svn_editor_t *editor)
{
svn_error_t *err = SVN_NO_ERROR;
diff --git a/subversion/libsvn_delta/libsvn_delta.pc.in b/subversion/libsvn_delta/libsvn_delta.pc.in
new file mode 100644
index 0000000..b96e6ab
--- /dev/null
+++ b/subversion/libsvn_delta/libsvn_delta.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_delta
+Description: Subversion Delta Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_subr
+Libs: -L${libdir} -lsvn_delta @SVN_ZLIB_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_delta/path_driver.c b/subversion/libsvn_delta/path_driver.c
index 62e703a..c1f3e07 100644
--- a/subversion/libsvn_delta/path_driver.c
+++ b/subversion/libsvn_delta/path_driver.c
@@ -32,6 +32,7 @@
#include "svn_path.h"
#include "svn_sorts.h"
#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
/*** Helper functions. ***/
@@ -157,8 +158,7 @@ svn_delta_path_driver2(const svn_delta_editor_t *editor,
if (sort_paths && paths->nelts > 1)
{
apr_array_header_t *sorted = apr_array_copy(subpool, paths);
- qsort(sorted->elts, sorted->nelts, sorted->elt_size,
- svn_sort_compare_paths);
+ svn_sort__array(sorted, svn_sort_compare_paths);
paths = sorted;
}
@@ -187,7 +187,7 @@ svn_delta_path_driver2(const svn_delta_editor_t *editor,
driving the editor. */
for (; i < paths->nelts; i++)
{
- const char *pdir, *bname;
+ const char *pdir;
const char *common = "";
size_t common_len;
@@ -224,9 +224,10 @@ svn_delta_path_driver2(const svn_delta_editor_t *editor,
/*** Step C - Open any directories between the common ancestor
and the parent of the current path. ***/
if (*path == '/')
- svn_fspath__split(&pdir, &bname, path, iterpool);
+ pdir = svn_fspath__dirname(path, iterpool);
else
- svn_relpath_split(&pdir, &bname, path, iterpool);
+ pdir = svn_relpath_dirname(path, iterpool);
+
if (strlen(pdir) > common_len)
{
const char *piece = pdir + common_len + 1;
diff --git a/subversion/libsvn_delta/svndiff.c b/subversion/libsvn_delta/svndiff.c
index b9cb285..070c638 100644
--- a/subversion/libsvn_delta/svndiff.c
+++ b/subversion/libsvn_delta/svndiff.c
@@ -29,21 +29,12 @@
#include "delta.h"
#include "svn_pools.h"
#include "svn_private_config.h"
-#include <zlib.h>
#include "private/svn_error_private.h"
#include "private/svn_delta_private.h"
-
-/* The zlib compressBound function was not exported until 1.2.0. */
-#if ZLIB_VERNUM >= 0x1200
-#define svnCompressBound(LEN) compressBound(LEN)
-#else
-#define svnCompressBound(LEN) ((LEN) + ((LEN) >> 12) + ((LEN) >> 14) + 11)
-#endif
-
-/* For svndiff1, address/instruction/new data under this size will not
- be compressed using zlib as a secondary compressor. */
-#define MIN_COMPRESS_SIZE 512
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_dep_compat.h"
/* ----- Text delta to svndiff ----- */
@@ -58,139 +49,31 @@ struct encoder_baton {
apr_pool_t *pool;
};
-/* This is at least as big as the largest size of an integer that
- encode_int 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 MAX_ENCODED_INT_LEN 10
/* This is at least as big as the largest size for a single instruction. */
-#define MAX_INSTRUCTION_LEN (2*MAX_ENCODED_INT_LEN+1)
+#define MAX_INSTRUCTION_LEN (2*SVN__MAX_ENCODED_UINT_LEN+1)
/* This is at least as big as the largest possible instructions
section: in theory, the instructions could be SVN_DELTA_WINDOW_SIZE
1-byte copy-from-source instructions (though this is very unlikely). */
#define MAX_INSTRUCTION_SECTION_LEN (SVN_DELTA_WINDOW_SIZE*MAX_INSTRUCTION_LEN)
-/* Encode VAL into the buffer P using the variable-length svndiff
- 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 MAX_ENCODED_INT_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]
-*/
-static unsigned char *
-encode_int(unsigned char *p, svn_filesize_t val)
-{
- int n;
- svn_filesize_t v;
- unsigned char cont;
-
- SVN_ERR_ASSERT_NO_RETURN(val >= 0);
-
- /* Figure out how many bytes we'll need. */
- v = val >> 7;
- n = 1;
- while (v > 0)
- {
- v = v >> 7;
- n++;
- }
-
- SVN_ERR_ASSERT_NO_RETURN(n <= MAX_ENCODED_INT_LEN);
-
- /* Encode the remaining bytes; n is always the number of bytes
- coming after the one we're encoding. */
- while (--n >= 0)
- {
- cont = ((n > 0) ? 0x1 : 0x0) << 7;
- *p++ = (unsigned char)(((val >> (n * 7)) & 0x7f) | cont);
- }
-
- return p;
-}
-
/* Append an encoded integer to a string. */
static void
append_encoded_int(svn_stringbuf_t *header, svn_filesize_t val)
{
- unsigned char buf[MAX_ENCODED_INT_LEN], *p;
+ unsigned char buf[SVN__MAX_ENCODED_UINT_LEN], *p;
- p = encode_int(buf, val);
+ SVN_ERR_ASSERT_NO_RETURN(val >= 0);
+ p = svn__encode_uint(buf, (apr_uint64_t)val);
svn_stringbuf_appendbytes(header, (const char *)buf, p - buf);
}
-/* If IN is a string that is >= MIN_COMPRESS_SIZE and the COMPRESSION_LEVEL
- is not SVN_DELTA_COMPRESSION_LEVEL_NONE, zlib compress it and places the
- result in OUT, with an integer prepended specifying the original size.
- If IN is < MIN_COMPRESS_SIZE, or if the compressed version of IN was no
- smaller than the original IN, OUT will be a copy of IN with the size
- prepended as an integer. */
-static svn_error_t *
-zlib_encode(const char *data,
- apr_size_t len,
- svn_stringbuf_t *out,
- int compression_level)
-{
- unsigned long endlen;
- apr_size_t intlen;
-
- svn_stringbuf_setempty(out);
- append_encoded_int(out, len);
- intlen = out->len;
-
- /* Compression initialization overhead is considered to large for
- short buffers. Also, if we don't actually want to compress data,
- ZLIB will produce an output no shorter than the input. Hence,
- the DATA would directly appended to OUT, so we can do that directly
- without calling ZLIB before. */
- if ( (len < MIN_COMPRESS_SIZE)
- || (compression_level == SVN_DELTA_COMPRESSION_LEVEL_NONE))
- {
- svn_stringbuf_appendbytes(out, data, len);
- }
- else
- {
- int zerr;
-
- svn_stringbuf_ensure(out, svnCompressBound(len) + intlen);
- endlen = out->blocksize;
-
- zerr = compress2((unsigned char *)out->data + intlen, &endlen,
- (const unsigned char *)data, len,
- compression_level);
- if (zerr != Z_OK)
- return svn_error_trace(svn_error__wrap_zlib(
- zerr, "compress2",
- _("Compression of svndiff data failed")));
-
- /* Compression didn't help :(, just append the original text */
- if (endlen >= len)
- {
- svn_stringbuf_appendbytes(out, data, len);
- return SVN_NO_ERROR;
- }
- out->len = endlen + intlen;
- out->data[out->len] = 0;
- }
- return SVN_NO_ERROR;
-}
-
static svn_error_t *
send_simple_insertion_window(svn_txdelta_window_t *window,
struct encoder_baton *eb)
{
- unsigned char headers[4 + 5 * MAX_ENCODED_INT_LEN + MAX_INSTRUCTION_LEN];
+ unsigned char headers[4 + 5 * SVN__MAX_ENCODED_UINT_LEN
+ + MAX_INSTRUCTION_LEN];
unsigned char ibuf[MAX_INSTRUCTION_LEN];
unsigned char *header_current;
apr_size_t header_len;
@@ -226,16 +109,17 @@ send_simple_insertion_window(svn_txdelta_window_t *window,
else
{
ibuf[0] = (0x2 << 6);
- ip_len = encode_int(ibuf + 1, window->tview_len) - ibuf;
+ ip_len = svn__encode_uint(ibuf + 1, window->tview_len) - ibuf;
}
/* encode the window header. Please note that the source window may
* have content despite not being used for deltification. */
- header_current = encode_int(header_current, window->sview_offset);
- header_current = encode_int(header_current, window->sview_len);
- header_current = encode_int(header_current, window->tview_len);
+ header_current = svn__encode_uint(header_current,
+ (apr_uint64_t)window->sview_offset);
+ header_current = svn__encode_uint(header_current, window->sview_len);
+ header_current = svn__encode_uint(header_current, window->tview_len);
header_current[0] = (unsigned char)ip_len; /* 1 instruction */
- header_current = encode_int(&header_current[1], len);
+ header_current = svn__encode_uint(&header_current[1], len);
/* append instructions (1 to a handful of bytes) */
for (i = 0; i < ip_len; ++i)
@@ -319,9 +203,9 @@ window_handler(svn_txdelta_window_t *window, void *baton)
if (op->length >> 6 == 0)
*ip++ |= (unsigned char)op->length;
else
- ip = encode_int(ip + 1, op->length);
+ ip = svn__encode_uint(ip + 1, op->length);
if (op->action_code != svn_txdelta_new)
- ip = encode_int(ip, op->offset);
+ ip = svn__encode_uint(ip, op->offset);
svn_stringbuf_appendbytes(instructions, (const char *)ibuf, ip - ibuf);
}
@@ -331,20 +215,20 @@ window_handler(svn_txdelta_window_t *window, void *baton)
append_encoded_int(header, window->tview_len);
if (eb->version == 1)
{
- SVN_ERR(zlib_encode(instructions->data, instructions->len,
- i1, eb->compression_level));
+ SVN_ERR(svn__compress(instructions, i1, eb->compression_level));
instructions = i1;
}
append_encoded_int(header, instructions->len);
if (eb->version == 1)
{
- svn_stringbuf_t *temp = svn_stringbuf_create_empty(pool);
- svn_string_t *tempstr = svn_string_create_empty(pool);
- SVN_ERR(zlib_encode(window->new_data->data, window->new_data->len,
- temp, eb->compression_level));
- tempstr->data = temp->data;
- tempstr->len = temp->len;
- newdata = tempstr;
+ svn_stringbuf_t *compressed = svn_stringbuf_create_empty(pool);
+ svn_stringbuf_t *original = svn_stringbuf_create_empty(pool);
+ original->data = (char *)window->new_data->data; /* won't be modified */
+ original->len = window->new_data->len;
+ original->blocksize = window->new_data->len + 1;
+
+ SVN_ERR(svn__compress(original, compressed, eb->compression_level));
+ newdata = svn_stringbuf__morph_into_string(compressed);
}
else
newdata = window->new_data;
@@ -453,128 +337,32 @@ struct decode_baton
};
-/* Decode an svndiff-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 encode_int() earlier in this file for more detail on
- the encoding format. */
+/* Wrapper aroung svn__deencode_uint taking a file size as *VAL. */
static const unsigned char *
decode_file_offset(svn_filesize_t *val,
const unsigned char *p,
const unsigned char *end)
{
- svn_filesize_t temp = 0;
-
- if (p + MAX_ENCODED_INT_LEN < end)
- end = p + MAX_ENCODED_INT_LEN;
- /* Decode bytes until we're done. */
- while (p < end)
- {
- /* Don't use svn_filesize_t here, because this might be 64 bits
- * on 32 bit targets. Optimizing compilers may or may not be
- * able to reduce that to the effective code below. */
- unsigned int c = *p++;
-
- temp = (temp << 7) | (c & 0x7f);
- if (c < 0x80)
- {
- *val = temp;
- return p;
- }
- }
+ apr_uint64_t temp = 0;
+ const unsigned char *result = svn__decode_uint(&temp, p, end);
+ *val = (svn_filesize_t)temp;
- return NULL;
+ return result;
}
-
/* Same as above, only decode into a size variable. */
static const unsigned char *
decode_size(apr_size_t *val,
const unsigned char *p,
const unsigned char *end)
{
- apr_size_t temp = 0;
-
- if (p + MAX_ENCODED_INT_LEN < end)
- end = p + MAX_ENCODED_INT_LEN;
- /* Decode bytes until we're done. */
- while (p < end)
- {
- apr_size_t c = *p++;
-
- temp = (temp << 7) | (c & 0x7f);
- if (c < 0x80)
- {
- *val = temp;
- return p;
- }
- }
-
- return NULL;
-}
-
-/* Decode the possibly-zlib compressed string of length INLEN that is in
- IN, into OUT. We expect an integer is prepended to IN that specifies
- the original size, and that if encoded size == original size, that the
- remaining data is not compressed.
- In that case, we will simply return pointer into IN as data pointer for
- OUT, COPYLESS_ALLOWED has been set. The, the caller is expected not to
- modify the contents of OUT.
- An error is returned if the decoded length exceeds the given LIMIT.
- */
-static svn_error_t *
-zlib_decode(const unsigned char *in, apr_size_t inLen, svn_stringbuf_t *out,
- apr_size_t limit)
-{
- apr_size_t len;
- const unsigned char *oldplace = in;
-
- /* First thing in the string is the original length. */
- in = decode_size(&len, in, in + inLen);
- if (in == NULL)
- return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA, NULL,
- _("Decompression of svndiff data failed: no size"));
- if (len > limit)
- return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA, NULL,
- _("Decompression of svndiff data failed: "
- "size too large"));
- /* We need to subtract the size of the encoded original length off the
- * still remaining input length. */
- inLen -= (in - oldplace);
- if (inLen == len)
- {
- svn_stringbuf_ensure(out, len);
- memcpy(out->data, in, len);
- out->data[len] = 0;
- out->len = len;
+ apr_uint64_t temp = 0;
+ const unsigned char *result = svn__decode_uint(&temp, p, end);
+ if (temp > APR_SIZE_MAX)
+ return NULL;
- return SVN_NO_ERROR;
- }
- else
- {
- unsigned long zlen = len;
- int zerr;
-
- svn_stringbuf_ensure(out, len);
- zerr = uncompress((unsigned char *)out->data, &zlen, in, inLen);
- if (zerr != Z_OK)
- return svn_error_trace(svn_error__wrap_zlib(
- zerr, "uncompress",
- _("Decompression of svndiff data failed")));
-
- /* Zlib should not produce something that has a different size than the
- original length we stored. */
- if (zlen != len)
- return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA,
- NULL,
- _("Size of uncompressed data "
- "does not match stored original length"));
- out->data[zlen] = 0;
- out->len = zlen;
- }
- return SVN_NO_ERROR;
+ *val = (apr_size_t)temp;
+ return result;
}
/* Decode an instruction into OP, returning a pointer to the text
@@ -695,6 +483,21 @@ count_and_verify_instructions(int *ninst,
return SVN_NO_ERROR;
}
+static svn_error_t *
+zlib_decode(const unsigned char *in, apr_size_t inLen, svn_stringbuf_t *out,
+ apr_size_t limit)
+{
+ /* construct a fake string buffer as parameter to svn__decompress.
+ This is fine as that function never writes to it. */
+ svn_stringbuf_t compressed;
+ compressed.pool = NULL;
+ compressed.data = (char *)in;
+ compressed.len = inLen;
+ compressed.blocksize = inLen + 1;
+
+ return svn__decompress(&compressed, out, limit);
+}
+
/* Given the five integer fields of a window header and a pointer to
the remainder of the window contents, fill in a delta window
structure *WINDOW. New allocations will be performed in POOL;
@@ -775,6 +578,10 @@ decode_window(svn_txdelta_window_t *window, svn_filesize_t sview_offset,
return SVN_NO_ERROR;
}
+static const char SVNDIFF_V0[] = { 'S', 'V', 'N', 0 };
+static const char SVNDIFF_V1[] = { 'S', 'V', 'N', 1 };
+#define SVNDIFF_HEADER_SIZE (sizeof(SVNDIFF_V0))
+
static svn_error_t *
write_handler(void *baton,
const char *buffer,
@@ -787,14 +594,14 @@ write_handler(void *baton,
apr_size_t buflen = *len;
/* Chew up four bytes at the beginning for the header. */
- if (db->header_bytes < 4)
+ if (db->header_bytes < SVNDIFF_HEADER_SIZE)
{
- apr_size_t nheader = 4 - db->header_bytes;
+ apr_size_t nheader = SVNDIFF_HEADER_SIZE - db->header_bytes;
if (nheader > buflen)
nheader = buflen;
- if (memcmp(buffer, "SVN\0" + db->header_bytes, nheader) == 0)
+ if (memcmp(buffer, SVNDIFF_V0 + db->header_bytes, nheader) == 0)
db->version = 0;
- else if (memcmp(buffer, "SVN\1" + db->header_bytes, nheader) == 0)
+ else if (memcmp(buffer, SVNDIFF_V1 + db->header_bytes, nheader) == 0)
db->version = 1;
else
return svn_error_create(SVN_ERR_SVNDIFF_INVALID_HEADER, NULL,
@@ -830,28 +637,28 @@ write_handler(void *baton,
p = decode_file_offset(&sview_offset, p, end);
if (p == NULL)
- return SVN_NO_ERROR;
+ break;
p = decode_size(&sview_len, p, end);
if (p == NULL)
- return SVN_NO_ERROR;
+ break;
p = decode_size(&tview_len, p, end);
if (p == NULL)
- return SVN_NO_ERROR;
+ break;
p = decode_size(&inslen, p, end);
if (p == NULL)
- return SVN_NO_ERROR;
+ break;
p = decode_size(&newlen, p, end);
if (p == NULL)
- return SVN_NO_ERROR;
+ break;
if (tview_len > SVN_DELTA_WINDOW_SIZE ||
sview_len > SVN_DELTA_WINDOW_SIZE ||
/* for svndiff1, newlen includes the original length */
- newlen > SVN_DELTA_WINDOW_SIZE + MAX_ENCODED_INT_LEN ||
+ newlen > SVN_DELTA_WINDOW_SIZE + SVN__MAX_ENCODED_UINT_LEN ||
inslen > MAX_INSTRUCTION_SECTION_LEN)
return svn_error_create(SVN_ERR_SVNDIFF_CORRUPT_WINDOW, NULL,
_("Svndiff contains a too-large window"));
@@ -904,7 +711,15 @@ write_handler(void *baton,
db->subpool = newpool;
}
- /* NOTREACHED */
+ /* At this point we processed all integral windows and DB->BUFFER is empty
+ or contains partially read window header.
+ Check that unprocessed data is not larger that theoretical maximum
+ window header size. */
+ if (db->buffer->len > 5 * SVN__MAX_ENCODED_UINT_LEN)
+ return svn_error_create(SVN_ERR_SVNDIFF_CORRUPT_WINDOW, NULL,
+ _("Svndiff contains a too-large window header"));
+
+ return SVN_NO_ERROR;
}
/* Minimal svn_stream_t write handler, doing nothing */
@@ -981,7 +796,7 @@ read_one_byte(unsigned char *byte, svn_stream_t *stream)
char c;
apr_size_t len = 1;
- SVN_ERR(svn_stream_read(stream, &c, &len));
+ SVN_ERR(svn_stream_read_full(stream, &c, &len));
if (len == 0)
return svn_error_create(SVN_ERR_SVNDIFF_UNEXPECTED_END, NULL,
_("Unexpected end of svndiff input"));
@@ -989,9 +804,12 @@ read_one_byte(unsigned char *byte, svn_stream_t *stream)
return SVN_NO_ERROR;
}
-/* Read and decode one integer from STREAM into *SIZE. */
+/* Read and decode one integer from STREAM into *SIZE.
+ Increment *BYTE_COUNTER by the number of chars we have read. */
static svn_error_t *
-read_one_size(apr_size_t *size, svn_stream_t *stream)
+read_one_size(apr_size_t *size,
+ apr_size_t *byte_counter,
+ svn_stream_t *stream)
{
unsigned char c;
@@ -999,6 +817,7 @@ read_one_size(apr_size_t *size, svn_stream_t *stream)
while (1)
{
SVN_ERR(read_one_byte(&c, stream));
+ ++*byte_counter;
*size = (*size << 7) | (c & 0x7f);
if (!(c & 0x80))
break;
@@ -1010,30 +829,33 @@ read_one_size(apr_size_t *size, svn_stream_t *stream)
static svn_error_t *
read_window_header(svn_stream_t *stream, svn_filesize_t *sview_offset,
apr_size_t *sview_len, apr_size_t *tview_len,
- apr_size_t *inslen, apr_size_t *newlen)
+ apr_size_t *inslen, apr_size_t *newlen,
+ apr_size_t *header_len)
{
unsigned char c;
/* Read the source view offset by hand, since it's not an apr_size_t. */
+ *header_len = 0;
*sview_offset = 0;
while (1)
{
SVN_ERR(read_one_byte(&c, stream));
+ ++*header_len;
*sview_offset = (*sview_offset << 7) | (c & 0x7f);
if (!(c & 0x80))
break;
}
/* Read the four size fields. */
- SVN_ERR(read_one_size(sview_len, stream));
- SVN_ERR(read_one_size(tview_len, stream));
- SVN_ERR(read_one_size(inslen, stream));
- SVN_ERR(read_one_size(newlen, stream));
+ SVN_ERR(read_one_size(sview_len, header_len, stream));
+ SVN_ERR(read_one_size(tview_len, header_len, stream));
+ SVN_ERR(read_one_size(inslen, header_len, stream));
+ SVN_ERR(read_one_size(newlen, header_len, stream));
if (*tview_len > SVN_DELTA_WINDOW_SIZE ||
*sview_len > SVN_DELTA_WINDOW_SIZE ||
/* for svndiff1, newlen includes the original length */
- *newlen > SVN_DELTA_WINDOW_SIZE + MAX_ENCODED_INT_LEN ||
+ *newlen > SVN_DELTA_WINDOW_SIZE + SVN__MAX_ENCODED_UINT_LEN ||
*inslen > MAX_INSTRUCTION_SECTION_LEN)
return svn_error_create(SVN_ERR_SVNDIFF_CORRUPT_WINDOW, NULL,
_("Svndiff contains a too-large window"));
@@ -1055,14 +877,14 @@ svn_txdelta_read_svndiff_window(svn_txdelta_window_t **window,
apr_pool_t *pool)
{
svn_filesize_t sview_offset;
- apr_size_t sview_len, tview_len, inslen, newlen, len;
+ apr_size_t sview_len, tview_len, inslen, newlen, len, header_len;
unsigned char *buf;
SVN_ERR(read_window_header(stream, &sview_offset, &sview_len, &tview_len,
- &inslen, &newlen));
+ &inslen, &newlen, &header_len));
len = inslen + newlen;
buf = apr_palloc(pool, len);
- SVN_ERR(svn_stream_read(stream, (char*)buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, (char*)buf, &len));
if (len < inslen + newlen)
return svn_error_create(SVN_ERR_SVNDIFF_UNEXPECTED_END, NULL,
_("Unexpected end of svndiff input"));
@@ -1079,29 +901,28 @@ svn_txdelta_skip_svndiff_window(apr_file_t *file,
{
svn_stream_t *stream = svn_stream_from_aprfile2(file, TRUE, pool);
svn_filesize_t sview_offset;
- apr_size_t sview_len, tview_len, inslen, newlen;
+ apr_size_t sview_len, tview_len, inslen, newlen, header_len;
apr_off_t offset;
SVN_ERR(read_window_header(stream, &sview_offset, &sview_len, &tview_len,
- &inslen, &newlen));
+ &inslen, &newlen, &header_len));
offset = inslen + newlen;
return svn_io_file_seek(file, APR_CUR, &offset, pool);
}
-
svn_error_t *
-svn__compress(svn_string_t *in,
- svn_stringbuf_t *out,
- int compression_level)
+svn_txdelta__read_raw_window_len(apr_size_t *window_len,
+ svn_stream_t *stream,
+ apr_pool_t *pool)
{
- return zlib_encode(in->data, in->len, out, compression_level);
-}
+ svn_filesize_t sview_offset;
+ apr_size_t sview_len, tview_len, inslen, newlen, header_len;
-svn_error_t *
-svn__decompress(svn_string_t *in,
- svn_stringbuf_t *out,
- apr_size_t limit)
-{
- return zlib_decode((const unsigned char*)in->data, in->len, out, limit);
+ SVN_ERR(read_window_header(stream, &sview_offset, &sview_len, &tview_len,
+ &inslen, &newlen, &header_len));
+
+ *window_len = inslen + newlen + header_len;
+ return SVN_NO_ERROR;
}
+
diff --git a/subversion/libsvn_delta/text_delta.c b/subversion/libsvn_delta/text_delta.c
index be2c434..04eca8a 100644
--- a/subversion/libsvn_delta/text_delta.c
+++ b/subversion/libsvn_delta/text_delta.c
@@ -366,14 +366,14 @@ txdelta_next_window(svn_txdelta_window_t **window,
/* Read the source stream. */
if (b->more_source)
{
- SVN_ERR(svn_stream_read(b->source, b->buf, &source_len));
+ SVN_ERR(svn_stream_read_full(b->source, b->buf, &source_len));
b->more_source = (source_len == SVN_DELTA_WINDOW_SIZE);
}
else
source_len = 0;
/* Read the target stream. */
- SVN_ERR(svn_stream_read(b->target, b->buf + source_len, &target_len));
+ SVN_ERR(svn_stream_read_full(b->target, b->buf + source_len, &target_len));
b->pos += source_len;
if (target_len == 0)
@@ -522,7 +522,7 @@ tpush_write_handler(void *baton, const char *data, apr_size_t *len)
if (tb->source_len == 0 && !tb->source_done)
{
tb->source_len = SVN_DELTA_WINDOW_SIZE;
- SVN_ERR(svn_stream_read(tb->source, tb->buf, &tb->source_len));
+ SVN_ERR(svn_stream_read_full(tb->source, tb->buf, &tb->source_len));
if (tb->source_len < SVN_DELTA_WINDOW_SIZE)
tb->source_done = TRUE;
}
@@ -623,68 +623,31 @@ size_buffer(char **buf, apr_size_t *buf_size,
return SVN_NO_ERROR;
}
-/* Copy LEN bytes from SOURCE to TARGET, optimizing for the case where LEN
- * is often very small. Return a pointer to the first byte after the copied
- * target range, unlike standard memcpy(), as a potential further
- * optimization for the caller.
- *
- * memcpy() is hard to tune for a wide range of buffer lengths. Therefore,
- * it is often tuned for high throughput on large buffers and relatively
- * low latency for mid-sized buffers (tens of bytes). However, the overhead
- * for very small buffers (<10 bytes) is still high. Even passing the
- * parameters, for instance, may take as long as copying 3 bytes.
- *
- * Because short copy sequences seem to be a common case, at least in
- * "format 2" FSFS repositories, we copy them directly. Larger buffer sizes
- * aren't hurt measurably by the exta 'if' clause. */
-static APR_INLINE char *
-fast_memcpy(char *target, const char *source, apr_size_t len)
-{
- if (len > 7)
- {
- memcpy(target, source, len);
- target += len;
- }
- else
- {
- /* memcpy is not exactly fast for small block sizes.
- * Since they are common, let's run optimized code for them. */
- const char *end = source + len;
- for (; source != end; source++)
- *(target++) = *source;
- }
-
- return target;
-}
-
/* Copy LEN bytes from SOURCE to TARGET. Unlike memmove() or memcpy(),
* create repeating patterns if the source and target ranges overlap.
* Return a pointer to the first byte after the copied target range. */
static APR_INLINE char *
patterning_copy(char *target, const char *source, apr_size_t len)
{
- const char *end = source + len;
-
- /* On many machines, we can do "chunky" copies. */
-
-#if SVN_UNALIGNED_ACCESS_IS_OK
-
- if (end + sizeof(apr_uint32_t) <= target)
+ /* If the source and target overlap, repeat the overlapping pattern
+ in the target buffer. Always copy from the source buffer because
+ presumably it will be in the L1 cache after the first iteration
+ and doing this should avoid pipeline stalls due to write/read
+ dependencies. */
+ const apr_size_t overlap = target - source;
+ while (len > overlap)
{
- /* Source and target are at least 4 bytes apart, so we can copy in
- * 4-byte chunks. */
- for (; source + sizeof(apr_uint32_t) <= end;
- source += sizeof(apr_uint32_t),
- target += sizeof(apr_uint32_t))
- *(apr_uint32_t *)(target) = *(apr_uint32_t *)(source);
+ memcpy(target, source, overlap);
+ target += overlap;
+ len -= overlap;
}
-#endif
-
- /* fall through to byte-wise copy (either for the below-chunk-size tail
- * or the whole copy) */
- for (; source != end; source++)
- *(target++) = *source;
+ /* Copy any remaining source pattern. */
+ if (len)
+ {
+ memcpy(target, source, len);
+ target += len;
+ }
return target;
}
@@ -697,6 +660,11 @@ svn_txdelta_apply_instructions(svn_txdelta_window_t *window,
const svn_txdelta_op_t *op;
apr_size_t tpos = 0;
+ /* Nothing to do for empty buffers.
+ * This check allows for NULL TBUF in that case. */
+ if (*tlen == 0)
+ return;
+
for (op = window->ops; op < window->ops + window->num_ops; op++)
{
const apr_size_t buf_len = (op->length < *tlen - tpos
@@ -711,7 +679,7 @@ svn_txdelta_apply_instructions(svn_txdelta_window_t *window,
/* Copy from source area. */
assert(sbuf);
assert(op->offset + op->length <= window->sview_len);
- fast_memcpy(tbuf + tpos, sbuf + op->offset, buf_len);
+ memcpy(tbuf + tpos, sbuf + op->offset, buf_len);
break;
case svn_txdelta_target:
@@ -728,9 +696,9 @@ svn_txdelta_apply_instructions(svn_txdelta_window_t *window,
case svn_txdelta_new:
/* Copy from window new area. */
assert(op->offset + op->length <= window->new_data->len);
- fast_memcpy(tbuf + tpos,
- window->new_data->data + op->offset,
- buf_len);
+ memcpy(tbuf + tpos,
+ window->new_data->data + op->offset,
+ buf_len);
break;
default:
@@ -747,20 +715,6 @@ svn_txdelta_apply_instructions(svn_txdelta_window_t *window,
*tlen = tpos;
}
-/* This is a private interlibrary compatibility wrapper. */
-void
-svn_txdelta__apply_instructions(svn_txdelta_window_t *window,
- const char *sbuf, char *tbuf,
- apr_size_t *tlen);
-void
-svn_txdelta__apply_instructions(svn_txdelta_window_t *window,
- const char *sbuf, char *tbuf,
- apr_size_t *tlen)
-{
- svn_txdelta_apply_instructions(window, sbuf, tbuf, tlen);
-}
-
-
/* Apply WINDOW to the streams given by APPL. */
static svn_error_t *
apply_window(svn_txdelta_window_t *window, void *baton)
@@ -819,7 +773,7 @@ apply_window(svn_txdelta_window_t *window, void *baton)
if (ab->sbuf_len < window->sview_len)
{
len = window->sview_len - ab->sbuf_len;
- err = svn_stream_read(ab->source, ab->sbuf + ab->sbuf_len, &len);
+ err = svn_stream_read_full(ab->source, ab->sbuf + ab->sbuf_len, &len);
if (err == SVN_NO_ERROR && len != window->sview_len - ab->sbuf_len)
err = svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL,
"Delta source ended unexpectedly");
@@ -836,13 +790,7 @@ apply_window(svn_txdelta_window_t *window, void *baton)
/* Write out the output. */
- /* ### We've also considered just adding two (optionally null)
- arguments to svn_stream_create(): read_checksum and
- write_checksum. Then instead of every caller updating an md5
- context when it calls svn_stream_write() or svn_stream_read(),
- streams would do it automatically, and verify the checksum in
- svn_stream_closed(). But this might be overkill for issue #689;
- so for now we just update the context here. */
+ /* Just update the context here. */
if (ab->result_digest)
apr_md5_update(&(ab->md5_context), ab->tbuf, len);
@@ -936,7 +884,7 @@ svn_error_t *svn_txdelta_send_stream(svn_stream_t *stream,
{
apr_size_t read_len = SVN__STREAM_CHUNK_SIZE;
- SVN_ERR(svn_stream_read(stream, read_buf, &read_len));
+ SVN_ERR(svn_stream_read_full(stream, read_buf, &read_len));
if (read_len == 0)
break;
diff --git a/subversion/libsvn_delta/xdelta.c b/subversion/libsvn_delta/xdelta.c
index 2075a51..2e5bb26 100644
--- a/subversion/libsvn_delta/xdelta.c
+++ b/subversion/libsvn_delta/xdelta.c
@@ -29,6 +29,7 @@
#include "svn_hash.h"
#include "svn_delta.h"
+#include "private/svn_string_private.h"
#include "delta.h"
/* This is pseudo-adler32. It is adler32 without the prime modulus.
@@ -43,6 +44,15 @@
*/
#define MATCH_BLOCKSIZE 64
+/* Size of the checksum presence FLAGS array in BLOCKS_T. With standard
+ MATCH_BLOCKSIZE and SVN_DELTA_WINDOW_SIZE, 32k entries is about 20x
+ the number of checksums that actually occur, i.e. we expect a >95%
+ probability that non-matching checksums get already detected by checking
+ against the FLAGS array.
+ Must be a power of 2.
+ */
+#define FLAGS_COUNT (32 * 1024)
+
/* "no" / "invalid" / "unused" value for positions within the delta windows
*/
#define NO_POSITION ((apr_uint32_t)-1)
@@ -104,7 +114,7 @@ struct block
(our delta window size much much smaller then 4GB).
That reduces the hash table size by 50% from 32to 16KB
and makes it easier to fit into the CPU's L1 cache. */
- apr_uint32_t pos; /* NO_POSITION -> block is not used */
+ apr_uint32_t pos; /* NO_POSITION -> block is not used */
};
/* A hash table, using open addressing, of the blocks of the source. */
@@ -117,8 +127,19 @@ struct blocks
hte same width as the block position index, (struct
block).pos. */
apr_uint32_t max;
+
/* Source buffer that the positions in SLOTS refer to. */
const char* data;
+
+ /* Bit array indicating whether there may be a matching slot for a given
+ adler32 checksum. Since FLAGS has much more entries than SLOTS, this
+ will indicate most cases of non-matching checksums with a "0" bit, i.e.
+ as "known not to have a match".
+ The mapping of adler32 checksum bits is [0..2][16..27] (LSB -> MSB),
+ i.e. address the byte by the multiplicative part of adler32 and address
+ the bits in that byte by the additive part of adler32. */
+ char flags[FLAGS_COUNT / 8];
+
/* The vector of blocks. A pos value of NO_POSITION represents an unused
slot. */
struct block *slots;
@@ -135,6 +156,15 @@ static apr_uint32_t hash_func(apr_uint32_t sum)
return sum ^ (sum >> 12);
}
+/* Return the offset in BLOCKS.FLAGS for the adler32 SUM. */
+static apr_uint32_t hash_flags(apr_uint32_t sum)
+{
+ /* The upper half of SUM has a wider value range than the lower 16 bit.
+ Also, we want to a different folding than HASH_FUNC to minimize
+ correlation between different hash levels. */
+ return (sum >> 16) & ((FLAGS_COUNT / 8) - 1);
+}
+
/* Insert a block with the checksum ADLERSUM at position POS in the source
data into the table BLOCKS. Ignore true duplicates, i.e. blocks with
actually the same content. */
@@ -152,6 +182,7 @@ add_block(struct blocks *blocks, apr_uint32_t adlersum, apr_uint32_t pos)
blocks->slots[h].adlersum = adlersum;
blocks->slots[h].pos = pos;
+ blocks->flags[hash_flags(adlersum)] |= 1 << (adlersum & 7);
}
/* Find a block in BLOCKS with the checksum ADLERSUM and matching the content
@@ -216,6 +247,9 @@ init_blocks_table(const char *data,
blocks->slots[i].pos = NO_POSITION;
}
+ /* No checksum entries in SLOTS, yet => reset all checksum flags. */
+ memset(blocks->flags, 0, sizeof(blocks->flags));
+
/* If there is an odd block at the end of the buffer, we will
not use that shorter block for deltification (only indirectly
as an extension of some previous block). */
@@ -223,73 +257,6 @@ init_blocks_table(const char *data,
add_block(blocks, init_adler32(data + i), i);
}
-/* 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.
- */
-static apr_size_t
-match_length(const char *a, const char *b, apr_size_t max_len)
-{
- apr_size_t pos = 0;
-
-#if SVN_UNALIGNED_ACCESS_IS_OK
-
- /* Chunky processing is so much faster ...
- *
- * We can't make this work on architectures that require aligned access
- * because A and B will probably have different alignment. So, skipping
- * the first few chars until alignment is reached is not an option.
- */
- for (; pos + sizeof(apr_size_t) <= max_len; pos += sizeof(apr_size_t))
- if (*(const apr_size_t*)(a + pos) != *(const apr_size_t*)(b + pos))
- break;
-
-#endif
-
- for (; pos < max_len; ++pos)
- if (a[pos] != b[pos])
- break;
-
- return pos;
-}
-
-/* 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.
- */
-static apr_size_t
-reverse_match_length(const char *a, const char *b, apr_size_t max_len)
-{
- apr_size_t pos = 0;
-
-#if SVN_UNALIGNED_ACCESS_IS_OK
-
- /* Chunky processing is so much faster ...
- *
- * We can't make this work on architectures that require aligned access
- * because A and B will probably have different alignment. So, skipping
- * the first few chars until alignment is reached is not an option.
- */
- for (pos = sizeof(apr_size_t); pos <= max_len; pos += sizeof(apr_size_t))
- if (*(const apr_size_t*)(a - pos) != *(const apr_size_t*)(b - pos))
- break;
-
- pos -= sizeof(apr_size_t);
-
-#endif
-
- /* If we find a mismatch at -pos, pos-1 characters matched.
- */
- while (++pos <= max_len)
- if (a[0-pos] != b[0-pos])
- return pos - 1;
-
- /* No mismatch found -> at least MAX_LEN matching chars.
- */
- return max_len;
-}
-
-
/* Try to find a match for the target data B in BLOCKS, and then
extend the match as long as data in A and B at the match position
continues to match. We set the position in A we ended up in (in
@@ -323,9 +290,9 @@ find_match(const struct blocks *blocks,
max_delta = asize - apos - MATCH_BLOCKSIZE < bsize - bpos - MATCH_BLOCKSIZE
? asize - apos - MATCH_BLOCKSIZE
: bsize - bpos - MATCH_BLOCKSIZE;
- delta = match_length(a + apos + MATCH_BLOCKSIZE,
- b + bpos + MATCH_BLOCKSIZE,
- max_delta);
+ delta = svn_cstring__match_length(a + apos + MATCH_BLOCKSIZE,
+ b + bpos + MATCH_BLOCKSIZE,
+ max_delta);
/* See if we can extend backwards (max MATCH_BLOCKSIZE-1 steps because A's
content has been sampled only every MATCH_BLOCKSIZE positions). */
@@ -362,7 +329,8 @@ store_delta_trailer(svn_txdelta__ops_baton_t *build_baton,
if (max_len == 0)
return;
- end_match = reverse_match_length(a + asize, b + bsize, max_len);
+ end_match = svn_cstring__reverse_match_length(a + asize, b + bsize,
+ max_len);
if (end_match <= 4)
end_match = 0;
@@ -409,12 +377,12 @@ compute_delta(svn_txdelta__ops_baton_t *build_baton,
{
struct blocks blocks;
apr_uint32_t rolling;
- apr_size_t lo = 0, pending_insert_start = 0;
+ apr_size_t lo = 0, pending_insert_start = 0, upper;
/* Optimization: directly compare window starts. If more than 4
* bytes match, we can immediately create a matching windows.
* Shorter sequences result in a net data increase. */
- lo = match_length(a, b, asize > bsize ? bsize : asize);
+ lo = svn_cstring__match_length(a, b, asize > bsize ? bsize : asize);
if ((lo > 4) || (lo == bsize))
{
svn_txdelta__insert_op(build_baton, svn_txdelta_source,
@@ -432,19 +400,32 @@ compute_delta(svn_txdelta__ops_baton_t *build_baton,
return;
}
+ upper = bsize - MATCH_BLOCKSIZE; /* this is now known to be >= LO */
+
/* Initialize the matches table. */
init_blocks_table(a, asize, &blocks, pool);
/* Initialize our rolling checksum. */
rolling = init_adler32(b + lo);
- while (lo < bsize)
+ while (lo < upper)
{
- apr_size_t matchlen = 0;
+ apr_size_t matchlen;
apr_size_t apos;
- if (lo + MATCH_BLOCKSIZE <= bsize)
- matchlen = find_match(&blocks, rolling, a, asize, b, bsize,
- &lo, &apos, pending_insert_start);
+ /* Quickly skip positions whose respective ROLLING checksums
+ definitely do not match any SLOT in BLOCKS. */
+ while (!(blocks.flags[hash_flags(rolling)] & (1 << (rolling & 7)))
+ && lo < upper)
+ {
+ rolling = adler32_replace(rolling, b[lo], b[lo+MATCH_BLOCKSIZE]);
+ lo++;
+ }
+
+ /* LO is still <= UPPER, i.e. the following lookup is legal:
+ Closely check whether we've got a match for the current location.
+ Due to the above pre-filter, chances are that we find one. */
+ matchlen = find_match(&blocks, rolling, a, asize, b, bsize,
+ &lo, &apos, pending_insert_start);
/* If we didn't find a real match, insert the byte at the target
position into the pending insert. */
@@ -468,7 +449,8 @@ compute_delta(svn_txdelta__ops_baton_t *build_baton,
{
/* the match borders on the previous op. Maybe, we found a
* match that is better than / overlapping the previous one. */
- apr_size_t len = reverse_match_length(a + apos, b + lo, apos < lo ? apos : lo);
+ apr_size_t len = svn_cstring__reverse_match_length
+ (a + apos, b + lo, apos < lo ? apos : lo);
if (len > 0)
{
len = svn_txdelta__remove_copy(build_baton, len);
diff --git a/subversion/libsvn_diff/binary_diff.c b/subversion/libsvn_diff/binary_diff.c
new file mode 100644
index 0000000..035794d
--- /dev/null
+++ b/subversion/libsvn_diff/binary_diff.c
@@ -0,0 +1,221 @@
+/*
+ * binary_diff.c: handling of git like binary diffs
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <apr.h>
+
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_diff.h"
+#include "svn_types.h"
+
+/* Copies the data from ORIGINAL_STREAM to a temporary file, returning both
+ the original and compressed size. */
+static svn_error_t *
+create_compressed(apr_file_t **result,
+ svn_filesize_t *full_size,
+ svn_filesize_t *compressed_size,
+ svn_stream_t *original_stream,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *compressed;
+ svn_filesize_t bytes_read = 0;
+ apr_finfo_t finfo;
+ apr_size_t rd;
+
+ SVN_ERR(svn_io_open_uniquely_named(result, NULL, NULL, "diffgz",
+ NULL, svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+
+ compressed = svn_stream_compressed(
+ svn_stream_from_aprfile2(*result, TRUE, scratch_pool),
+ scratch_pool);
+
+ if (original_stream)
+ do
+ {
+ char buffer[SVN_STREAM_CHUNK_SIZE];
+ rd = sizeof(buffer);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR(svn_stream_read_full(original_stream, buffer, &rd));
+
+ bytes_read += rd;
+ SVN_ERR(svn_stream_write(compressed, buffer, &rd));
+ }
+ while(rd == SVN_STREAM_CHUNK_SIZE);
+ else
+ {
+ apr_size_t zero = 0;
+ SVN_ERR(svn_stream_write(compressed, NULL, &zero));
+ }
+
+ SVN_ERR(svn_stream_close(compressed)); /* Flush compression */
+
+ *full_size = bytes_read;
+ SVN_ERR(svn_io_file_info_get(&finfo, APR_FINFO_SIZE, *result, scratch_pool));
+ *compressed_size = finfo.size;
+
+ return SVN_NO_ERROR;
+}
+
+#define GIT_BASE85_CHUNKSIZE 52
+
+/* Git Base-85 table for write_literal */
+static const char b85str[] =
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "!#$%&()*+-;<=>?@^_`{|}~";
+
+/* Git length encoding table for write_literal */
+static const char b85lenstr[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz";
+
+/* Writes out a git-like literal output of the compressed data in
+ COMPRESSED_DATA to OUTPUT_STREAM, describing that its normal length is
+ UNCOMPRESSED_SIZE. */
+static svn_error_t *
+write_literal(svn_filesize_t uncompressed_size,
+ svn_stream_t *compressed_data,
+ svn_stream_t *output_stream,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t rd;
+ SVN_ERR(svn_stream_seek(compressed_data, NULL)); /* Seek to start */
+
+ SVN_ERR(svn_stream_printf(output_stream, scratch_pool,
+ "literal %" SVN_FILESIZE_T_FMT APR_EOL_STR,
+ uncompressed_size));
+
+ do
+ {
+ char chunk[GIT_BASE85_CHUNKSIZE];
+ const unsigned char *next;
+ apr_size_t left;
+
+ rd = sizeof(chunk);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR(svn_stream_read_full(compressed_data, chunk, &rd));
+
+ {
+ apr_size_t one = 1;
+ SVN_ERR(svn_stream_write(output_stream, &b85lenstr[rd-1], &one));
+ }
+
+ left = rd;
+ next = (void*)chunk;
+ while (left)
+ {
+ char five[5];
+ unsigned info = 0;
+ int n;
+ apr_size_t five_sz;
+
+ /* Push 4 bytes into the 32 bit info, when available */
+ for (n = 24; n >= 0 && left; n -= 8, next++, left--)
+ {
+ info |= (*next) << n;
+ }
+
+ /* Write out info as base85 */
+ for (n = 4; n >= 0; n--)
+ {
+ five[n] = b85str[info % 85];
+ info /= 85;
+ }
+
+ five_sz = 5;
+ SVN_ERR(svn_stream_write(output_stream, five, &five_sz));
+ }
+
+ SVN_ERR(svn_stream_puts(output_stream, APR_EOL_STR));
+ }
+ while (rd == GIT_BASE85_CHUNKSIZE);
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ apr_file_t *original_apr;
+ svn_filesize_t original_full;
+ svn_filesize_t original_deflated;
+ apr_file_t *latest_apr;
+ svn_filesize_t latest_full;
+ svn_filesize_t latest_deflated;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(create_compressed(&original_apr, &original_full, &original_deflated,
+ original, cancel_func, cancel_baton,
+ scratch_pool, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(create_compressed(&latest_apr, &latest_full, &latest_deflated,
+ latest, cancel_func, cancel_baton,
+ scratch_pool, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_stream_puts(output_stream, "GIT binary patch" APR_EOL_STR));
+
+ /* ### git would first calculate if a git-delta latest->original would be
+ shorter than the zipped data. For now lets assume that it is not
+ and just dump the literal data */
+ SVN_ERR(write_literal(latest_full,
+ svn_stream_from_aprfile2(latest_apr, FALSE, subpool),
+ output_stream,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ svn_pool_clear(subpool);
+ SVN_ERR(svn_stream_puts(output_stream, APR_EOL_STR));
+
+ /* ### git would first calculate if a git-delta original->latest would be
+ shorter than the zipped data. For now lets assume that it is not
+ and just dump the literal data */
+ SVN_ERR(write_literal(original_full,
+ svn_stream_from_aprfile2(original_apr, FALSE, subpool),
+ output_stream,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ svn_pool_destroy(subpool);
+
+ SVN_ERR(svn_stream_puts(output_stream, APR_EOL_STR));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_diff/deprecated.c b/subversion/libsvn_diff/deprecated.c
index 891ad5f..b8dc097 100644
--- a/subversion/libsvn_diff/deprecated.c
+++ b/subversion/libsvn_diff/deprecated.c
@@ -143,6 +143,34 @@ wrap_diff_fns(svn_diff_fns2_t **diff_fns2,
/*** From diff_file.c ***/
+
+svn_error_t *
+svn_diff_file_output_unified3(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,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(
+ svn_diff_file_output_unified4(output_stream,
+ diff,
+ original_path,
+ modified_path,
+ original_header,
+ modified_header,
+ header_encoding,
+ relative_to_dir,
+ show_c_function,
+ -1 /* context_size */,
+ NULL, NULL, /* cancel */
+ pool));
+}
+
svn_error_t *
svn_diff_file_output_unified2(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -243,6 +271,31 @@ svn_diff_file_output_merge(svn_stream_t *output_stream,
pool);
}
+svn_error_t *
+svn_diff_file_output_merge2(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,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_diff_file_output_merge3(output_stream,
+ diff, original_path,
+ modified_path,
+ latest_path,
+ conflict_original,
+ conflict_modified,
+ conflict_latest,
+ conflict_separator,
+ conflict_style,
+ NULL, NULL, /* cancel */
+ pool));
+}
/*** From diff.c ***/
svn_error_t *
@@ -287,3 +340,125 @@ svn_diff_diff4(svn_diff_t **diff,
wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool);
return svn_diff_diff4_2(diff, fwb, diff_fns2, pool);
}
+
+/*** From util.c ***/
+svn_error_t *
+svn_diff_output(svn_diff_t *diff,
+ void *output_baton,
+ const svn_diff_output_fns_t *output_fns)
+{
+ return svn_error_trace(svn_diff_output2(diff, output_baton, output_fns,
+ NULL, NULL /* cancel */));
+}
+
+/*** From diff_memory.c ***/
+svn_error_t *
+svn_diff_mem_string_output_merge(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_boolean_t display_original_in_conflict,
+ svn_boolean_t display_resolved_conflicts,
+ apr_pool_t *pool)
+{
+ svn_diff_conflict_display_style_t style =
+ svn_diff_conflict_display_modified_latest;
+
+ if (display_resolved_conflicts)
+ style = svn_diff_conflict_display_resolved_modified_latest;
+
+ if (display_original_in_conflict)
+ style = svn_diff_conflict_display_modified_original_latest;
+
+ return svn_diff_mem_string_output_merge2(output_stream,
+ diff,
+ original,
+ modified,
+ latest,
+ conflict_original,
+ conflict_modified,
+ conflict_latest,
+ conflict_separator,
+ style,
+ pool);
+}
+
+svn_error_t *
+svn_diff_mem_string_output_merge2(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,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_diff_mem_string_output_merge3(output_stream, diff,
+ original,
+ modified, latest,
+ conflict_original,
+ conflict_modified,
+ conflict_latest,
+ conflict_separator,
+ style,
+ /* no cancelation */
+ NULL, NULL,
+ pool));
+}
+
+svn_error_t *
+svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
+ svn_diff_t *diff,
+ const char *original_header,
+ const char *modified_header,
+ const char *header_encoding,
+ const svn_string_t *original,
+ const svn_string_t *modified,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_diff_mem_string_output_unified2(output_stream,
+ diff,
+ TRUE,
+ NULL,
+ original_header,
+ modified_header,
+ header_encoding,
+ original,
+ modified,
+ pool));
+}
+
+svn_error_t *
+svn_diff_mem_string_output_unified2(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,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_diff_mem_string_output_unified3(output_stream,
+ diff,
+ with_diff_header,
+ hunk_delimiter,
+ original_header,
+ modified_header,
+ header_encoding,
+ original,
+ modified,
+ -1 /* context */,
+ /* cancel */
+ NULL, NULL,
+ pool));
+}
diff --git a/subversion/libsvn_diff/diff4.c b/subversion/libsvn_diff/diff4.c
index 9f3cb8c..1ecbb38 100644
--- a/subversion/libsvn_diff/diff4.c
+++ b/subversion/libsvn_diff/diff4.c
@@ -270,7 +270,7 @@ svn_diff_diff4_2(svn_diff_t **diff,
}
/* Get the lcs for common ancestor - original
- * Do reverse adjustements
+ * Do reverse adjustments
*/
lcs_adjust = svn_diff__lcs(position_list[3], position_list[2],
token_counts[3], token_counts[2],
diff --git a/subversion/libsvn_diff/diff_file.c b/subversion/libsvn_diff/diff_file.c
index 830552a..f54522e 100644
--- a/subversion/libsvn_diff/diff_file.c
+++ b/subversion/libsvn_diff/diff_file.c
@@ -31,6 +31,8 @@
#include <apr_mmap.h>
#include <apr_getopt.h>
+#include <assert.h>
+
#include "svn_error.h"
#include "svn_diff.h"
#include "svn_types.h"
@@ -137,16 +139,16 @@ datasource_to_index(svn_diff_datasource_e datasource)
* *LENGTH. The actual bytes read are stored in *LENGTH on return.
*/
static APR_INLINE svn_error_t *
-read_chunk(apr_file_t *file, const char *path,
+read_chunk(apr_file_t *file,
char *buffer, apr_off_t length,
- apr_off_t offset, apr_pool_t *pool)
+ apr_off_t offset, apr_pool_t *scratch_pool)
{
/* XXX: The final offset may not be the one we asked for.
* XXX: Check.
*/
- SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool));
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, scratch_pool));
return svn_io_file_read_full2(file, buffer, (apr_size_t) length,
- NULL, NULL, pool);
+ NULL, NULL, scratch_pool);
}
@@ -286,7 +288,7 @@ increment_chunk(struct file_info *file, apr_pool_t *pool)
file->chunk++;
length = file->chunk == last_chunk ?
offset_in_chunk(file->size) : CHUNK_SIZE;
- SVN_ERR(read_chunk(file->file, file->path, file->buffer,
+ SVN_ERR(read_chunk(file->file, file->buffer,
length, chunk_to_offset(file->chunk),
pool));
file->endp = file->buffer + length;
@@ -313,7 +315,7 @@ decrement_chunk(struct file_info *file, apr_pool_t *pool)
{
/* Read previous chunk and reset pointers. */
file->chunk--;
- SVN_ERR(read_chunk(file->file, file->path, file->buffer,
+ SVN_ERR(read_chunk(file->file, file->buffer,
CHUNK_SIZE, chunk_to_offset(file->chunk),
pool));
file->endp = file->buffer + CHUNK_SIZE;
@@ -542,7 +544,6 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
int suffix_lines_to_keep = SUFFIX_LINES_TO_KEEP;
svn_boolean_t is_match;
apr_off_t lines = 0;
- svn_boolean_t had_cr;
svn_boolean_t had_nl;
apr_size_t i;
@@ -573,7 +574,7 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
/* There is at least more than 1 chunk,
so allocate full chunk size buffer */
file_for_suffix[i].buffer = apr_palloc(pool, CHUNK_SIZE);
- SVN_ERR(read_chunk(file_for_suffix[i].file, file_for_suffix[i].path,
+ SVN_ERR(read_chunk(file_for_suffix[i].file,
file_for_suffix[i].buffer, length[i],
chunk_to_offset(file_for_suffix[i].chunk),
pool));
@@ -646,11 +647,10 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
min_curp[0] += suffix_min_offset0;
/* Scan quickly by reading with machine-word granularity. */
- for (i = 0, can_read_word = TRUE; i < file_len; i++)
- can_read_word = can_read_word
- && ( (file_for_suffix[i].curp + 1
- - sizeof(apr_uintptr_t))
- > min_curp[i]);
+ for (i = 0, can_read_word = TRUE; can_read_word && i < file_len; i++)
+ can_read_word = ((file_for_suffix[i].curp + 1 - sizeof(apr_uintptr_t))
+ > min_curp[i]);
+
while (can_read_word)
{
apr_uintptr_t chunk;
@@ -664,9 +664,8 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
if (contains_eol(chunk))
break;
- for (i = 1, is_match = TRUE; i < file_len; i++)
- is_match = is_match
- && ( chunk
+ for (i = 1, is_match = TRUE; is_match && i < file_len; i++)
+ is_match = (chunk
== *(const apr_uintptr_t *)
(file_for_suffix[i].curp + 1
- sizeof(apr_uintptr_t)));
@@ -685,7 +684,6 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
/* We skipped some bytes, so there are no closing EOLs */
had_nl = FALSE;
- had_cr = FALSE;
}
/* The > min_curp[i] check leaves at least one final byte for checking
@@ -712,7 +710,7 @@ find_identical_suffix(apr_off_t *suffix_lines, struct file_info file[],
one file reaches its end. */
do
{
- had_cr = FALSE;
+ svn_boolean_t had_cr = FALSE;
while (!is_one_at_eof(file_for_suffix, file_len)
&& *file_for_suffix[0].curp != '\n'
&& *file_for_suffix[0].curp != '\r')
@@ -803,7 +801,7 @@ datasources_open(void *baton,
file->size = finfo[i].size;
length[i] = finfo[i].size > CHUNK_SIZE ? CHUNK_SIZE : finfo[i].size;
file->buffer = apr_palloc(file_baton->pool, (apr_size_t) length[i]);
- SVN_ERR(read_chunk(file->file, file->path, file->buffer,
+ SVN_ERR(read_chunk(file->file, file->buffer,
length[i], 0, file_baton->pool));
file->endp = file->buffer + length[i];
file->curp = file->buffer;
@@ -969,9 +967,9 @@ datasource_get_next_token(apr_uint32_t *hash, void **token, void *baton,
function.
When changing things here, make sure the whitespace settings are
- applied, or we mught not reach the exact suffix boundary as token
+ applied, or we might not reach the exact suffix boundary as token
boundary. */
- SVN_ERR(read_chunk(file->file, file->path,
+ SVN_ERR(read_chunk(file->file,
curp, length,
chunk_to_offset(file->chunk),
file_baton->pool));
@@ -1113,7 +1111,6 @@ token_compare(void *baton, void *token1, void *token2, int *compare)
COMPARE_CHUNK_SIZE : raw_length[i];
SVN_ERR(read_chunk(file[i]->file,
- file[i]->path,
bufp[i], length[i], offset[i],
file_baton->pool));
offset[i] += length[i];
@@ -1196,13 +1193,18 @@ static const apr_getopt_option_t diff_options[] =
/* ### For compatibility; we don't support the argument to -u, because
* ### we don't have optional argument support. */
{ "unified", 'u', 0, NULL },
+ { "context", 'U', 1, NULL },
{ NULL, 0, 0, NULL }
};
svn_diff_file_options_t *
svn_diff_file_options_create(apr_pool_t *pool)
{
- return apr_pcalloc(pool, sizeof(svn_diff_file_options_t));
+ svn_diff_file_options_t * opts = apr_pcalloc(pool, sizeof(*opts));
+
+ opts->context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+
+ return opts;
}
/* A baton for use with opt_parsing_error_func(). */
@@ -1248,7 +1250,7 @@ svn_diff_file_options_parse(svn_diff_file_options_t *options,
opt_parsing_error_baton.pool = pool;
argv[0] = "";
- memcpy((void *) (argv + 1), args->elts, sizeof(char*) * args->nelts);
+ memcpy(argv + 1, args->elts, sizeof(char*) * args->nelts);
argv[args->nelts + 1] = NULL;
apr_getopt_init(&os, pool, args->nelts + 1, argv);
@@ -1291,6 +1293,9 @@ svn_diff_file_options_parse(svn_diff_file_options_t *options,
case 'p':
options->show_c_function = TRUE;
break;
+ case 'U':
+ SVN_ERR(svn_cstring_atoi(&options->context_size, opt_arg));
+ break;
default:
break;
}
@@ -1410,6 +1415,8 @@ typedef struct svn_diff__file_output_baton_t
/* Extra context for the current hunk. */
char hunk_extra_context[SVN_DIFF__EXTRA_CONTEXT_LENGTH + 1];
+ int context_size;
+
apr_pool_t *pool;
} svn_diff__file_output_baton_t;
@@ -1615,7 +1622,7 @@ output_unified_flush_hunk(svn_diff__file_output_baton_t *baton)
}
target_line = baton->hunk_start[0] + baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + baton->context_size;
/* Add trailing context to the hunk */
SVN_ERR(output_unified_diff_range(baton, 0 /* original */,
@@ -1666,8 +1673,8 @@ output_unified_diff_modified(void *baton,
apr_off_t prev_context_end;
svn_boolean_t init_hunk = FALSE;
- if (original_start > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
- context_prefix_length = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ if (original_start > output_baton->context_size)
+ context_prefix_length = output_baton->context_size;
else
context_prefix_length = original_start;
@@ -1677,7 +1684,7 @@ output_unified_diff_modified(void *baton,
{
prev_context_end = output_baton->hunk_start[0]
+ output_baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + output_baton->context_size;
}
else
{
@@ -1815,7 +1822,7 @@ static const svn_diff_output_fns_t svn_diff__file_output_unified_vtable =
};
svn_error_t *
-svn_diff_file_output_unified3(svn_stream_t *output_stream,
+svn_diff_file_output_unified4(svn_stream_t *output_stream,
svn_diff_t *diff,
const char *original_path,
const char *modified_path,
@@ -1824,6 +1831,9 @@ svn_diff_file_output_unified3(svn_stream_t *output_stream,
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 *pool)
{
if (svn_diff_contains_diffs(diff))
@@ -1840,6 +1850,8 @@ svn_diff_file_output_unified3(svn_stream_t *output_stream,
baton.hunk = svn_stringbuf_create_empty(pool);
baton.show_c_function = show_c_function;
baton.extra_context = svn_stringbuf_create_empty(pool);
+ baton.context_size = (context_size >= 0) ? context_size
+ : SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (show_c_function)
{
@@ -1918,8 +1930,9 @@ svn_diff_file_output_unified3(svn_stream_t *output_stream,
original_header, modified_header,
pool));
- SVN_ERR(svn_diff_output(diff, &baton,
- &svn_diff__file_output_unified_vtable));
+ SVN_ERR(svn_diff_output2(diff, &baton,
+ &svn_diff__file_output_unified_vtable,
+ cancel_func, cancel_baton));
SVN_ERR(output_unified_flush_hunk(&baton));
for (i = 0; i < 2; i++)
@@ -1939,8 +1952,9 @@ svn_diff_file_output_unified3(svn_stream_t *output_stream,
*pointers! */
typedef struct context_saver_t {
svn_stream_t *stream;
- const char *data[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
- apr_size_t len[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
+ int context_size;
+ const char **data; /* const char *data[context_size] */
+ apr_size_t *len; /* apr_size_t len[context_size] */
apr_size_t next_slot;
apr_size_t total_written;
} context_saver_t;
@@ -1952,10 +1966,14 @@ context_saver_stream_write(void *baton,
apr_size_t *len)
{
context_saver_t *cs = baton;
- cs->data[cs->next_slot] = data;
- cs->len[cs->next_slot] = *len;
- cs->next_slot = (cs->next_slot + 1) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
- cs->total_written++;
+
+ if (cs->context_size > 0)
+ {
+ cs->data[cs->next_slot] = data;
+ cs->len[cs->next_slot] = *len;
+ cs->next_slot = (cs->next_slot + 1) % cs->context_size;
+ cs->total_written++;
+ }
return SVN_NO_ERROR;
}
@@ -1980,6 +1998,11 @@ typedef struct svn_diff3__file_output_baton_t
const char *marker_eol;
svn_diff_conflict_display_style_t conflict_style;
+ int context_size;
+
+ /* cancel support */
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
/* The rest of the fields are for
svn_diff_conflict_display_only_conflicts only. Note that for
@@ -1999,9 +2022,9 @@ flush_context_saver(context_saver_t *cs,
svn_stream_t *output_stream)
{
int i;
- for (i = 0; i < SVN_DIFF__UNIFIED_CONTEXT_SIZE; i++)
+ for (i = 0; i < cs->context_size; i++)
{
- apr_size_t slot = (i + cs->next_slot) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ apr_size_t slot = (i + cs->next_slot) % cs->context_size;
if (cs->data[slot])
{
apr_size_t len = cs->len[slot];
@@ -2016,6 +2039,8 @@ make_context_saver(svn_diff3__file_output_baton_t *fob)
{
context_saver_t *cs;
+ assert(fob->context_size > 0); /* Or nothing to save */
+
svn_pool_clear(fob->pool);
cs = apr_pcalloc(fob->pool, sizeof(*cs));
cs->stream = svn_stream_empty(fob->pool);
@@ -2023,10 +2048,13 @@ make_context_saver(svn_diff3__file_output_baton_t *fob)
svn_stream_set_write(cs->stream, context_saver_stream_write);
fob->context_saver = cs;
fob->output_stream = cs->stream;
+ cs->context_size = fob->context_size;
+ cs->data = apr_pcalloc(fob->pool, sizeof(*cs->data) * cs->context_size);
+ cs->len = apr_pcalloc(fob->pool, sizeof(*cs->len) * cs->context_size);
}
-/* A stream which prints SVN_DIFF__UNIFIED_CONTEXT_SIZE lines to
+/* A stream which prints LINES_TO_PRINT (based on context size) lines to
BATON->REAL_OUTPUT_STREAM, and then changes BATON->OUTPUT_STREAM to
a context_saver; used for *trailing* context. */
@@ -2061,7 +2089,7 @@ make_trailing_context_printer(svn_diff3__file_output_baton_t *btn)
svn_pool_clear(btn->pool);
tcp = apr_pcalloc(btn->pool, sizeof(*tcp));
- tcp->lines_to_print = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ tcp->lines_to_print = btn->context_size;
tcp->fob = btn;
s = svn_stream_empty(btn->pool);
svn_stream_set_baton(s, tcp);
@@ -2191,7 +2219,25 @@ static const svn_diff_output_fns_t svn_diff3__file_output_vtable =
output_conflict
};
+static svn_error_t *
+output_conflict_with_context_marker(svn_diff3__file_output_baton_t *btn,
+ const char *label,
+ apr_off_t start,
+ apr_off_t length)
+{
+ if (length == 1)
+ SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
+ "%s (%" APR_OFF_T_FMT ")",
+ label, start + 1));
+ else
+ SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
+ "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")",
+ label, start + 1, length));
+ SVN_ERR(output_marker_eol(btn));
+
+ return SVN_NO_ERROR;
+}
static svn_error_t *
output_conflict_with_context(svn_diff3__file_output_baton_t *btn,
@@ -2206,7 +2252,7 @@ output_conflict_with_context(svn_diff3__file_output_baton_t *btn,
trailing context)? If so, flush it. */
if (btn->output_stream == btn->context_saver->stream)
{
- if (btn->context_saver->total_written > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
+ if (btn->context_saver->total_written > btn->context_size)
SVN_ERR(svn_stream_puts(btn->real_output_stream, "@@\n"));
SVN_ERR(flush_context_saver(btn->context_saver, btn->real_output_stream));
}
@@ -2215,34 +2261,19 @@ output_conflict_with_context(svn_diff3__file_output_baton_t *btn,
btn->output_stream = btn->real_output_stream;
/* Output the conflict itself. */
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (modified_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->conflict_modified,
- modified_start + 1, modified_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->conflict_modified,
+ modified_start, modified_length));
SVN_ERR(output_hunk(btn, 1/*modified*/, modified_start, modified_length));
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (original_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->conflict_original,
- original_start + 1, original_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->conflict_original,
+ original_start, original_length));
SVN_ERR(output_hunk(btn, 0/*original*/, original_start, original_length));
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
"%s%s", btn->conflict_separator, btn->marker_eol));
SVN_ERR(output_hunk(btn, 2/*latest*/, latest_start, latest_length));
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (latest_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->conflict_latest,
- latest_start + 1, latest_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->conflict_latest,
+ latest_start, latest_length));
/* Go into print-trailing-context mode instead. */
make_trailing_context_printer(btn);
@@ -2271,8 +2302,10 @@ output_conflict(void *baton,
if (style == svn_diff_conflict_display_resolved_modified_latest)
{
if (diff)
- return svn_diff_output(diff, baton,
- &svn_diff3__file_output_vtable);
+ return svn_diff_output2(diff, baton,
+ &svn_diff3__file_output_vtable,
+ file_baton->cancel_func,
+ file_baton->cancel_baton);
else
style = svn_diff_conflict_display_modified_latest;
}
@@ -2315,7 +2348,7 @@ output_conflict(void *baton,
}
svn_error_t *
-svn_diff_file_output_merge2(svn_stream_t *output_stream,
+svn_diff_file_output_merge3(svn_stream_t *output_stream,
svn_diff_t *diff,
const char *original_path,
const char *modified_path,
@@ -2325,7 +2358,9 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
const char *conflict_latest,
const char *conflict_separator,
svn_diff_conflict_display_style_t style,
- apr_pool_t *pool)
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
{
svn_diff3__file_output_baton_t baton;
apr_file_t *file[3];
@@ -2338,9 +2373,10 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
(style == svn_diff_conflict_display_only_conflicts);
memset(&baton, 0, sizeof(baton));
+ baton.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (conflicts_only)
{
- baton.pool = svn_pool_create(pool);
+ baton.pool = svn_pool_create(scratch_pool);
make_context_saver(&baton);
baton.real_output_stream = output_stream;
}
@@ -2351,22 +2387,22 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
baton.path[2] = latest_path;
SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_modified,
conflict_modified ? conflict_modified
- : apr_psprintf(pool, "<<<<<<< %s",
+ : apr_psprintf(scratch_pool, "<<<<<<< %s",
modified_path),
- pool));
+ scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_original,
conflict_original ? conflict_original
- : apr_psprintf(pool, "||||||| %s",
+ : apr_psprintf(scratch_pool, "||||||| %s",
original_path),
- pool));
+ scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_separator,
conflict_separator ? conflict_separator
- : "=======", pool));
+ : "=======", scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&baton.conflict_latest,
conflict_latest ? conflict_latest
- : apr_psprintf(pool, ">>>>>>> %s",
+ : apr_psprintf(scratch_pool, ">>>>>>> %s",
latest_path),
- pool));
+ scratch_pool));
baton.conflict_style = style;
@@ -2377,7 +2413,7 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
SVN_ERR(map_or_read_file(&file[idx],
MMAP_T_ARG(mm[idx])
&baton.buffer[idx], &size,
- baton.path[idx], pool));
+ baton.path[idx], scratch_pool));
baton.curp[idx] = baton.buffer[idx];
baton.endp[idx] = baton.buffer[idx];
@@ -2395,8 +2431,12 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
eol = APR_EOL_STR;
baton.marker_eol = eol;
- SVN_ERR(svn_diff_output(diff, &baton,
- &svn_diff3__file_output_vtable));
+ baton.cancel_func = cancel_func;
+ baton.cancel_baton = cancel_baton;
+
+ SVN_ERR(svn_diff_output2(diff, &baton,
+ &svn_diff3__file_output_vtable,
+ cancel_func, cancel_baton));
for (idx = 0; idx < 3; idx++)
{
@@ -2414,7 +2454,7 @@ svn_diff_file_output_merge2(svn_stream_t *output_stream,
if (file[idx])
{
- SVN_ERR(svn_io_file_close(file[idx], pool));
+ SVN_ERR(svn_io_file_close(file[idx], scratch_pool));
}
}
diff --git a/subversion/libsvn_diff/diff_memory.c b/subversion/libsvn_diff/diff_memory.c
index 00f4c7f..d9d800d 100644
--- a/subversion/libsvn_diff/diff_memory.c
+++ b/subversion/libsvn_diff/diff_memory.c
@@ -356,6 +356,8 @@ typedef struct unified_output_baton_t
source_tokens_t sources[2]; /* 0 == original; 1 == modified */
apr_off_t current_token[2]; /* current token per source */
+ int context_size;
+
/* Cached markers, in header_encoding,
indexed using unified_output_e */
const char *prefix_str[3];
@@ -461,7 +463,7 @@ output_unified_flush_hunk(output_baton_t *baton,
/* Write the trailing context */
target_token = baton->hunk_start[0] + baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + baton->context_size;
SVN_ERR(output_unified_token_range(baton, 0 /*original*/,
unified_output_context,
target_token));
@@ -515,8 +517,8 @@ output_unified_diff_modified(void *baton,
apr_off_t prev_context_end;
svn_boolean_t init_hunk = FALSE;
- if (original_start > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
- context_prefix_length = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ if (original_start > output_baton->context_size)
+ context_prefix_length = output_baton->context_size;
else
context_prefix_length = original_start;
@@ -526,7 +528,7 @@ output_unified_diff_modified(void *baton,
{
prev_context_end = output_baton->hunk_start[0]
+ output_baton->hunk_length[0]
- + SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ + output_baton->context_size;
}
else
{
@@ -608,7 +610,7 @@ static const svn_diff_output_fns_t mem_output_unified_vtable =
svn_error_t *
-svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
+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,
@@ -617,7 +619,10 @@ svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
const char *header_encoding,
const svn_string_t *original,
const svn_string_t *modified,
- apr_pool_t *pool)
+ int context_size,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
{
if (svn_diff_contains_diffs(diff))
@@ -626,37 +631,40 @@ svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
memset(&baton, 0, sizeof(baton));
baton.output_stream = output_stream;
- baton.pool = svn_pool_create(pool);
+ baton.pool = svn_pool_create(scratch_pool);
baton.header_encoding = header_encoding;
- baton.hunk = svn_stringbuf_create_empty(pool);
+ baton.hunk = svn_stringbuf_create_empty(scratch_pool);
baton.hunk_delimiter = hunk_delimiter;
baton.no_newline_string
= (hunk_delimiter == NULL || strcmp(hunk_delimiter, "##") != 0)
? APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_FILE APR_EOL_STR
: APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_PROPERTY APR_EOL_STR;
+ baton.context_size = context_size >= 0 ? context_size
+ : SVN_DIFF__UNIFIED_CONTEXT_SIZE;
SVN_ERR(svn_utf_cstring_from_utf8_ex2
(&(baton.prefix_str[unified_output_context]), " ",
- header_encoding, pool));
+ header_encoding, scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8_ex2
(&(baton.prefix_str[unified_output_delete]), "-",
- header_encoding, pool));
+ header_encoding, scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8_ex2
(&(baton.prefix_str[unified_output_insert]), "+",
- header_encoding, pool));
+ header_encoding, scratch_pool));
- fill_source_tokens(&baton.sources[0], original, pool);
- fill_source_tokens(&baton.sources[1], modified, pool);
+ fill_source_tokens(&baton.sources[0], original, scratch_pool);
+ fill_source_tokens(&baton.sources[1], modified, scratch_pool);
if (with_diff_header)
{
SVN_ERR(svn_diff__unidiff_write_header(
output_stream, header_encoding,
- original_header, modified_header, pool));
+ original_header, modified_header, scratch_pool));
}
- SVN_ERR(svn_diff_output(diff, &baton,
- &mem_output_unified_vtable));
+ SVN_ERR(svn_diff_output2(diff, &baton,
+ &mem_output_unified_vtable,
+ cancel_func, cancel_baton));
SVN_ERR(output_unified_flush_hunk(&baton, hunk_delimiter));
@@ -666,28 +674,6 @@ svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
- svn_diff_t *diff,
- const char *original_header,
- const char *modified_header,
- const char *header_encoding,
- const svn_string_t *original,
- const svn_string_t *modified,
- apr_pool_t *pool)
-{
- SVN_ERR(svn_diff_mem_string_output_unified2(output_stream,
- diff,
- TRUE,
- NULL,
- original_header,
- modified_header,
- header_encoding,
- original,
- modified,
- pool));
- return SVN_NO_ERROR;
-}
@@ -698,8 +684,9 @@ svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
*pointers! */
typedef struct context_saver_t {
svn_stream_t *stream;
- const char *data[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
- apr_size_t len[SVN_DIFF__UNIFIED_CONTEXT_SIZE];
+ int context_size;
+ const char **data; /* const char *data[context_size] */
+ apr_size_t *len; /* apr_size_t len[context_size] */
apr_size_t next_slot;
apr_size_t total_written;
} context_saver_t;
@@ -713,7 +700,7 @@ context_saver_stream_write(void *baton,
context_saver_t *cs = baton;
cs->data[cs->next_slot] = data;
cs->len[cs->next_slot] = *len;
- cs->next_slot = (cs->next_slot + 1) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ cs->next_slot = (cs->next_slot + 1) % cs->context_size;
cs->total_written++;
return SVN_NO_ERROR;
}
@@ -733,6 +720,11 @@ typedef struct merge_output_baton_t
const char *marker_eol;
svn_diff_conflict_display_style_t conflict_style;
+ int context_size;
+
+ /* cancel support */
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
/* The rest of the fields are for
svn_diff_conflict_display_only_conflicts only. Note that for
@@ -753,9 +745,9 @@ flush_context_saver(context_saver_t *cs,
svn_stream_t *output_stream)
{
int i;
- for (i = 0; i < SVN_DIFF__UNIFIED_CONTEXT_SIZE; i++)
+ for (i = 0; i < cs->context_size; i++)
{
- apr_size_t slot = (i + cs->next_slot) % SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ apr_size_t slot = (i + cs->next_slot) % cs->context_size;
if (cs->data[slot])
{
apr_size_t len = cs->len[slot];
@@ -771,6 +763,8 @@ make_context_saver(merge_output_baton_t *mob)
{
context_saver_t *cs;
+ assert(mob->context_size > 0); /* Or nothing to save */
+
svn_pool_clear(mob->pool);
cs = apr_pcalloc(mob->pool, sizeof(*cs));
cs->stream = svn_stream_empty(mob->pool);
@@ -778,10 +772,13 @@ make_context_saver(merge_output_baton_t *mob)
svn_stream_set_write(cs->stream, context_saver_stream_write);
mob->context_saver = cs;
mob->output_stream = cs->stream;
+ cs->context_size = mob->context_size;
+ cs->data = apr_pcalloc(mob->pool, sizeof(*cs->data) * cs->context_size);
+ cs->len = apr_pcalloc(mob->pool, sizeof(*cs->len) * cs->context_size);
}
-/* A stream which prints SVN_DIFF__UNIFIED_CONTEXT_SIZE lines to
+/* A stream which prints LINES_TO_PRINT (based on context_size) lines to
BATON->REAL_OUTPUT_STREAM, and then changes BATON->OUTPUT_STREAM to
a context_saver; used for *trailing* context. */
@@ -815,7 +812,7 @@ make_trailing_context_printer(merge_output_baton_t *btn)
svn_pool_clear(btn->pool);
tcp = apr_pcalloc(btn->pool, sizeof(*tcp));
- tcp->lines_to_print = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
+ tcp->lines_to_print = btn->context_size;
tcp->mob = btn;
s = svn_stream_empty(btn->pool);
svn_stream_set_baton(s, tcp);
@@ -913,7 +910,8 @@ output_conflict(void *baton,
if (style == svn_diff_conflict_display_resolved_modified_latest)
{
if (diff)
- return svn_diff_output(diff, baton, &merge_output_vtable);
+ return svn_diff_output2(diff, baton, &merge_output_vtable,
+ btn->cancel_func, btn->cancel_baton);
else
style = svn_diff_conflict_display_modified_latest;
}
@@ -949,6 +947,25 @@ output_conflict(void *baton,
return SVN_NO_ERROR;
}
+static svn_error_t *
+output_conflict_with_context_marker(merge_output_baton_t *btn,
+ const char *label,
+ apr_off_t start,
+ apr_off_t length)
+{
+ if (length == 1)
+ SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
+ "%s (%" APR_OFF_T_FMT ")",
+ label, start + 1));
+ else
+ SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
+ "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")",
+ label, start + 1, length));
+
+ SVN_ERR(output_marker_eol(btn));
+
+ return SVN_NO_ERROR;
+}
static svn_error_t *
output_conflict_with_context(void *baton,
@@ -966,7 +983,7 @@ output_conflict_with_context(void *baton,
trailing context)? If so, flush it. */
if (btn->output_stream == btn->context_saver->stream)
{
- if (btn->context_saver->total_written > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
+ if (btn->context_saver->total_written > btn->context_size)
SVN_ERR(svn_stream_puts(btn->real_output_stream, "@@\n"));
SVN_ERR(flush_context_saver(btn->context_saver, btn->real_output_stream));
}
@@ -975,36 +992,24 @@ output_conflict_with_context(void *baton,
btn->output_stream = btn->real_output_stream;
/* Output the conflict itself. */
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (modified_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->markers[1],
- modified_start + 1, modified_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[1],
+ modified_start,
+ modified_length));
SVN_ERR(output_merge_token_range(NULL, btn, 1/*modified*/,
modified_start, modified_length));
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (original_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->markers[0],
- original_start + 1, original_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[0],
+ original_start,
+ original_length));
SVN_ERR(output_merge_token_range(NULL, btn, 0/*original*/,
original_start, original_length));
SVN_ERR(output_merge_marker(btn, 2/*separator*/));
SVN_ERR(output_merge_token_range(NULL, btn, 2/*latest*/,
latest_start, latest_length));
- SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
- (latest_length == 1
- ? "%s (%" APR_OFF_T_FMT ")"
- : "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
- btn->markers[3],
- latest_start + 1, latest_length));
- SVN_ERR(output_marker_eol(btn));
+ SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[3],
+ latest_start,
+ latest_length));
/* Go into print-trailing-context mode instead. */
make_trailing_context_printer(btn);
@@ -1049,7 +1054,7 @@ detect_eol(svn_string_t *token)
}
svn_error_t *
-svn_diff_mem_string_output_merge2(svn_stream_t *output_stream,
+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,
@@ -1059,7 +1064,9 @@ svn_diff_mem_string_output_merge2(svn_stream_t *output_stream,
const char *conflict_latest,
const char *conflict_separator,
svn_diff_conflict_display_style_t style,
- apr_pool_t *pool)
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
{
merge_output_baton_t btn;
const char *eol;
@@ -1069,19 +1076,20 @@ svn_diff_mem_string_output_merge2(svn_stream_t *output_stream,
? &merge_only_conflicts_output_vtable : &merge_output_vtable;
memset(&btn, 0, sizeof(btn));
+ btn.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
if (conflicts_only)
{
- btn.pool = svn_pool_create(pool);
+ btn.pool = svn_pool_create(scratch_pool);
make_context_saver(&btn);
btn.real_output_stream = output_stream;
}
else
btn.output_stream = output_stream;
- fill_source_tokens(&(btn.sources[0]), original, pool);
- fill_source_tokens(&(btn.sources[1]), modified, pool);
- fill_source_tokens(&(btn.sources[2]), latest, pool);
+ fill_source_tokens(&(btn.sources[0]), original, scratch_pool);
+ fill_source_tokens(&(btn.sources[1]), modified, scratch_pool);
+ fill_source_tokens(&(btn.sources[2]), latest, scratch_pool);
btn.conflict_style = style;
@@ -1095,67 +1103,33 @@ svn_diff_mem_string_output_merge2(svn_stream_t *output_stream,
eol = APR_EOL_STR; /* use the platform default */
btn.marker_eol = eol;
+ btn.cancel_func = cancel_func;
+ btn.cancel_baton = cancel_baton;
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[1],
conflict_modified
? conflict_modified
: "<<<<<<< (modified)",
- pool));
+ scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[0],
conflict_original
? conflict_original
: "||||||| (original)",
- pool));
+ scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[2],
conflict_separator
? conflict_separator
: "=======",
- pool));
+ scratch_pool));
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[3],
conflict_latest
? conflict_latest
: ">>>>>>> (latest)",
- pool));
+ scratch_pool));
- SVN_ERR(svn_diff_output(diff, &btn, vtable));
+ SVN_ERR(svn_diff_output2(diff, &btn, vtable, cancel_func, cancel_baton));
if (conflicts_only)
svn_pool_destroy(btn.pool);
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_diff_mem_string_output_merge(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_boolean_t display_original_in_conflict,
- svn_boolean_t display_resolved_conflicts,
- apr_pool_t *pool)
-{
- svn_diff_conflict_display_style_t style =
- svn_diff_conflict_display_modified_latest;
-
- if (display_resolved_conflicts)
- style = svn_diff_conflict_display_resolved_modified_latest;
-
- if (display_original_in_conflict)
- style = svn_diff_conflict_display_modified_original_latest;
-
- return svn_diff_mem_string_output_merge2(output_stream,
- diff,
- original,
- modified,
- latest,
- conflict_original,
- conflict_modified,
- conflict_latest,
- conflict_separator,
- style,
- pool);
-}
diff --git a/subversion/libsvn_diff/lcs.c b/subversion/libsvn_diff/lcs.c
index 8087a92..b420187 100644
--- a/subversion/libsvn_diff/lcs.c
+++ b/subversion/libsvn_diff/lcs.c
@@ -345,7 +345,7 @@ svn_diff__lcs(svn_diff__position_t *position_list1, /* pointer to tail (ring) */
{
svn_diff__snake(fp + k, token_counts, &lcs_freelist, pool);
}
- /* for k > 0, deletions are free */
+ /* for k > 0, deletions are free */
for (k = (d > 0 ? d : 0) + p; k >= 0; k--)
{
svn_diff__snake(fp + k, token_counts, &lcs_freelist, pool);
diff --git a/subversion/libsvn_diff/libsvn_diff.pc.in b/subversion/libsvn_diff/libsvn_diff.pc.in
new file mode 100644
index 0000000..eed9d88
--- /dev/null
+++ b/subversion/libsvn_diff/libsvn_diff.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_diff
+Description: Subversion Diff Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_subr
+Libs: -L${libdir} -lsvn_diff @SVN_ZLIB_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_diff/parse-diff.c b/subversion/libsvn_diff/parse-diff.c
index e269ef9..3f794b8 100644
--- a/subversion/libsvn_diff/parse-diff.c
+++ b/subversion/libsvn_diff/parse-diff.c
@@ -35,9 +35,12 @@
#include "svn_utf.h"
#include "svn_dirent_uri.h"
#include "svn_diff.h"
+#include "svn_ctype.h"
+#include "svn_mergeinfo.h"
#include "private/svn_eol_private.h"
#include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
/* Helper macro for readability */
#define starts_with(str, start) \
@@ -385,7 +388,6 @@ svn_diff_hunk_readline_diff_text(svn_diff_hunk_t *hunk,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_diff_hunk_t dummy;
svn_stringbuf_t *line;
apr_size_t max_len;
apr_off_t pos;
@@ -415,33 +417,10 @@ svn_diff_hunk_readline_diff_text(svn_diff_hunk_t *hunk,
if (hunk->patch->reverse)
{
- if (parse_hunk_header(line->data, &dummy, "@@", scratch_pool))
- {
- /* Line is a hunk header, reverse it. */
- line = svn_stringbuf_createf(result_pool,
- "@@ -%lu,%lu +%lu,%lu @@",
- hunk->modified_start,
- hunk->modified_length,
- hunk->original_start,
- hunk->original_length);
- }
- else if (parse_hunk_header(line->data, &dummy, "##", scratch_pool))
- {
- /* Line is a hunk header, reverse it. */
- line = svn_stringbuf_createf(result_pool,
- "## -%lu,%lu +%lu,%lu ##",
- hunk->modified_start,
- hunk->modified_length,
- hunk->original_start,
- hunk->original_length);
- }
- else
- {
- if (line->data[0] == '+')
- line->data[0] = '-';
- else if (line->data[0] == '-')
- line->data[0] = '+';
- }
+ if (line->data[0] == '+')
+ line->data[0] = '-';
+ else if (line->data[0] == '-')
+ line->data[0] = '+';
}
*stringbuf = line;
@@ -471,6 +450,147 @@ parse_prop_name(const char **prop_name, const char *header,
return SVN_NO_ERROR;
}
+
+/* A helper function to parse svn:mergeinfo diffs.
+ *
+ * These diffs use a special pretty-print format, for instance:
+ *
+ * Added: svn:mergeinfo
+ * ## -0,0 +0,1 ##
+ * Merged /trunk:r2-3
+ *
+ * The hunk header has the following format:
+ * ## -0,NUMBER_OF_REVERSE_MERGES +0,NUMBER_OF_FORWARD_MERGES ##
+ *
+ * At this point, the number of reverse merges has already been
+ * parsed into HUNK->ORIGINAL_LENGTH, and the number of forward
+ * merges has been parsed into HUNK->MODIFIED_LENGTH.
+ *
+ * The header is followed by a list of mergeinfo, one path per line.
+ * This function parses such lines. Lines describing reverse merges
+ * appear first, and then all lines describing forward merges appear.
+ *
+ * Parts of the line are affected by i18n. The words 'Merged'
+ * and 'Reverse-merged' can appear in any language and at any
+ * position within the line. We can only assume that a leading
+ * '/' starts the merge source path, the path is followed by
+ * ":r", which in turn is followed by a mergeinfo revision range,
+ * which is terminated by whitespace or end-of-string.
+ *
+ * If the current line meets the above criteria and we're able
+ * to parse valid mergeinfo from it, the resulting mergeinfo
+ * is added to patch->mergeinfo or patch->reverse_mergeinfo,
+ * and we proceed to the next line.
+ */
+static svn_error_t *
+parse_mergeinfo(svn_boolean_t *found_mergeinfo,
+ svn_stringbuf_t *line,
+ svn_diff_hunk_t *hunk,
+ svn_patch_t *patch,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ char *slash = strchr(line->data, '/');
+ char *colon = strrchr(line->data, ':');
+
+ *found_mergeinfo = FALSE;
+
+ if (slash && colon && colon[1] == 'r' && slash < colon)
+ {
+ svn_stringbuf_t *input;
+ svn_mergeinfo_t mergeinfo = NULL;
+ char *s;
+ svn_error_t *err;
+
+ input = svn_stringbuf_create_ensure(line->len, scratch_pool);
+
+ /* Copy the merge source path + colon */
+ s = slash;
+ while (s <= colon)
+ {
+ svn_stringbuf_appendbyte(input, *s);
+ s++;
+ }
+
+ /* skip 'r' after colon */
+ s++;
+
+ /* Copy the revision range. */
+ while (s < line->data + line->len)
+ {
+ if (svn_ctype_isspace(*s))
+ break;
+ svn_stringbuf_appendbyte(input, *s);
+ s++;
+ }
+
+ err = svn_mergeinfo_parse(&mergeinfo, input->data, result_pool);
+ if (err && err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ {
+ svn_error_clear(err);
+ mergeinfo = NULL;
+ }
+ else
+ SVN_ERR(err);
+
+ if (mergeinfo)
+ {
+ if (hunk->original_length > 0) /* reverse merges */
+ {
+ if (patch->reverse)
+ {
+ if (patch->mergeinfo == NULL)
+ patch->mergeinfo = mergeinfo;
+ else
+ SVN_ERR(svn_mergeinfo_merge2(patch->mergeinfo,
+ mergeinfo,
+ result_pool,
+ scratch_pool));
+ }
+ else
+ {
+ if (patch->reverse_mergeinfo == NULL)
+ patch->reverse_mergeinfo = mergeinfo;
+ else
+ SVN_ERR(svn_mergeinfo_merge2(patch->reverse_mergeinfo,
+ mergeinfo,
+ result_pool,
+ scratch_pool));
+ }
+ hunk->original_length--;
+ }
+ else if (hunk->modified_length > 0) /* forward merges */
+ {
+ if (patch->reverse)
+ {
+ if (patch->reverse_mergeinfo == NULL)
+ patch->reverse_mergeinfo = mergeinfo;
+ else
+ SVN_ERR(svn_mergeinfo_merge2(patch->reverse_mergeinfo,
+ mergeinfo,
+ result_pool,
+ scratch_pool));
+ }
+ else
+ {
+ if (patch->mergeinfo == NULL)
+ patch->mergeinfo = mergeinfo;
+ else
+ SVN_ERR(svn_mergeinfo_merge2(patch->mergeinfo,
+ mergeinfo,
+ result_pool,
+ scratch_pool));
+ }
+ hunk->modified_length--;
+ }
+
+ *found_mergeinfo = TRUE;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* Return the next *HUNK from a PATCH in APR_FILE.
* If no hunk can be found, set *HUNK to NULL.
* Set IS_PROPERTY to TRUE if we have a property hunk. If the returned HUNK
@@ -600,6 +720,17 @@ parse_next_hunk(svn_diff_hunk_t **hunk,
continue;
}
+ if (in_hunk && *is_property && *prop_name &&
+ strcmp(*prop_name, SVN_PROP_MERGEINFO) == 0)
+ {
+ svn_boolean_t found_mergeinfo;
+
+ SVN_ERR(parse_mergeinfo(&found_mergeinfo, line, *hunk, patch,
+ result_pool, iterpool));
+ if (found_mergeinfo)
+ continue; /* Proceed to the next line in the patch. */
+ }
+
if (in_hunk)
{
char c;
@@ -1192,6 +1323,13 @@ parse_hunks(svn_patch_t *patch, apr_file_t *apr_file,
prop_name = last_prop_name;
else
last_prop_name = prop_name;
+
+ /* Skip svn:mergeinfo properties.
+ * Mergeinfo data cannot be represented as a hunk and
+ * is therefore stored in PATCH itself. */
+ if (strcmp(prop_name, SVN_PROP_MERGEINFO) == 0)
+ continue;
+
SVN_ERR(add_property_hunk(patch, prop_name, hunk, prop_operation,
result_pool));
}
@@ -1229,7 +1367,7 @@ static struct transition transitions[] =
};
svn_error_t *
-svn_diff_parse_next_patch(svn_patch_t **patch,
+svn_diff_parse_next_patch(svn_patch_t **patch_p,
svn_patch_file_t *patch_file,
svn_boolean_t reverse,
svn_boolean_t ignore_whitespace,
@@ -1240,16 +1378,17 @@ svn_diff_parse_next_patch(svn_patch_t **patch,
svn_boolean_t eof;
svn_boolean_t line_after_tree_header_read = FALSE;
apr_pool_t *iterpool;
+ svn_patch_t *patch;
enum parse_state state = state_start;
if (apr_file_eof(patch_file->apr_file) == APR_EOF)
{
/* No more patches here. */
- *patch = NULL;
+ *patch_p = NULL;
return SVN_NO_ERROR;
}
- *patch = apr_pcalloc(result_pool, sizeof(**patch));
+ patch = apr_pcalloc(result_pool, sizeof(*patch));
pos = patch_file->next_patch_offset;
SVN_ERR(svn_io_file_seek(patch_file->apr_file, APR_SET, &pos, scratch_pool));
@@ -1282,7 +1421,7 @@ svn_diff_parse_next_patch(svn_patch_t **patch,
if (starts_with(line->data, transitions[i].expected_input)
&& state == transitions[i].required_state)
{
- SVN_ERR(transitions[i].fn(&state, line->data, *patch,
+ SVN_ERR(transitions[i].fn(&state, line->data, patch,
result_pool, iterpool));
valid_header_line = TRUE;
break;
@@ -1328,22 +1467,22 @@ svn_diff_parse_next_patch(svn_patch_t **patch,
}
while (! eof);
- (*patch)->reverse = reverse;
+ patch->reverse = reverse;
if (reverse)
{
const char *temp;
- temp = (*patch)->old_filename;
- (*patch)->old_filename = (*patch)->new_filename;
- (*patch)->new_filename = temp;
+ temp = patch->old_filename;
+ patch->old_filename = patch->new_filename;
+ patch->new_filename = temp;
}
- if ((*patch)->old_filename == NULL || (*patch)->new_filename == NULL)
+ if (patch->old_filename == NULL || patch->new_filename == NULL)
{
/* Something went wrong, just discard the result. */
- *patch = NULL;
+ patch = NULL;
}
else
- SVN_ERR(parse_hunks(*patch, patch_file->apr_file, ignore_whitespace,
+ SVN_ERR(parse_hunks(patch, patch_file->apr_file, ignore_whitespace,
result_pool, iterpool));
svn_pool_destroy(iterpool);
@@ -1352,16 +1491,16 @@ svn_diff_parse_next_patch(svn_patch_t **patch,
SVN_ERR(svn_io_file_seek(patch_file->apr_file, APR_CUR,
&patch_file->next_patch_offset, scratch_pool));
- if (*patch)
+ if (patch)
{
/* Usually, hunks appear in the patch sorted by their original line
* offset. But just in case they weren't parsed in this order for
* some reason, we sort them so that our caller can assume that hunks
* are sorted as if parsed from a usual patch. */
- qsort((*patch)->hunks->elts, (*patch)->hunks->nelts,
- (*patch)->hunks->elt_size, compare_hunks);
+ svn_sort__array(patch->hunks, compare_hunks);
}
+ *patch_p = patch;
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_diff/util.c b/subversion/libsvn_diff/util.c
index 412b20b..a931822 100644
--- a/subversion/libsvn_diff/util.c
+++ b/subversion/libsvn_diff/util.c
@@ -34,11 +34,11 @@
#include "svn_diff.h"
#include "svn_types.h"
#include "svn_ctype.h"
-#include "svn_sorts.h"
#include "svn_utf.h"
#include "svn_version.h"
#include "private/svn_diff_private.h"
+#include "private/svn_sorts_private.h"
#include "diff.h"
#include "svn_private_config.h"
@@ -77,9 +77,11 @@ svn_diff_contains_diffs(svn_diff_t *diff)
}
svn_error_t *
-svn_diff_output(svn_diff_t *diff,
- void *output_baton,
- const svn_diff_output_fns_t *vtable)
+svn_diff_output2(svn_diff_t *diff,
+ void *output_baton,
+ const svn_diff_output_fns_t *vtable,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton)
{
svn_error_t *(*output_fn)(void *,
apr_off_t, apr_off_t,
@@ -88,6 +90,9 @@ svn_diff_output(svn_diff_t *diff,
while (diff != NULL)
{
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
switch (diff->type)
{
case svn_diff__type_common:
@@ -449,11 +454,19 @@ display_mergeinfo_diff(const char *old_mergeinfo_val,
new_mergeinfo_hash,
TRUE, pool, pool));
+ /* Print a hint for 'svn patch' or smilar tools, indicating the
+ * number of reverse-merges and forward-merges. */
+ SVN_ERR(svn_stream_printf_from_utf8(outstream, encoding, pool,
+ "## -0,%u +0,%u ##%s",
+ apr_hash_count(deleted),
+ apr_hash_count(added),
+ APR_EOL_STR));
+
for (hi = apr_hash_first(pool, deleted);
hi; hi = apr_hash_next(hi))
{
- const char *from_path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *merge_revarray = svn__apr_hash_index_val(hi);
+ const char *from_path = apr_hash_this_key(hi);
+ svn_rangelist_t *merge_revarray = apr_hash_this_val(hi);
svn_string_t *merge_revstr;
svn_pool_clear(iterpool);
@@ -469,8 +482,8 @@ display_mergeinfo_diff(const char *old_mergeinfo_val,
for (hi = apr_hash_first(pool, added);
hi; hi = apr_hash_next(hi))
{
- const char *from_path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *merge_revarray = svn__apr_hash_index_val(hi);
+ const char *from_path = apr_hash_this_key(hi);
+ svn_rangelist_t *merge_revarray = apr_hash_this_val(hi);
svn_string_t *merge_revstr;
svn_pool_clear(iterpool);
@@ -487,7 +500,7 @@ display_mergeinfo_diff(const char *old_mergeinfo_val,
return SVN_NO_ERROR;
}
-/* qsort callback handling svn_prop_t by name */
+/* svn_sort__array callback handling svn_prop_t by name */
static int
propchange_sort(const void *k1, const void *k2)
{
@@ -503,6 +516,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)
{
apr_pool_t *pool = scratch_pool;
@@ -510,7 +526,7 @@ svn_diff__display_prop_diffs(svn_stream_t *outstream,
apr_array_header_t *changes = apr_array_copy(scratch_pool, propchanges);
int i;
- qsort(changes->elts, changes->nelts, changes->elt_size, propchange_sort);
+ svn_sort__array(changes, propchange_sort);
for (i = 0; i < changes->nelts; i++)
{
@@ -586,10 +602,11 @@ svn_diff__display_prop_diffs(svn_stream_t *outstream,
* from the diff header. But there usually are no files which
* UNIX patch could apply the property diff to, so we use "##"
* instead of "@@" as the default hunk delimiter for property diffs.
- * We also supress the diff header. */
- SVN_ERR(svn_diff_mem_string_output_unified2(
+ * We also suppress the diff header. */
+ SVN_ERR(svn_diff_mem_string_output_unified3(
outstream, diff, FALSE /* no header */, "##", NULL, NULL,
- encoding, orig, val, iterpool));
+ encoding, orig, val, context_size,
+ cancel_func, cancel_baton, iterpool));
}
}
svn_pool_destroy(iterpool);
diff --git a/subversion/libsvn_fs/access.c b/subversion/libsvn_fs/access.c
index 9918be4..2b1901f 100644
--- a/subversion/libsvn_fs/access.c
+++ b/subversion/libsvn_fs/access.c
@@ -91,13 +91,6 @@ svn_fs_access_add_lock_token2(svn_fs_access_t *access_ctx,
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_fs_access_add_lock_token(svn_fs_access_t *access_ctx,
- const char *token)
-{
- return svn_fs_access_add_lock_token2(access_ctx, (const char *) 1, token);
-}
-
apr_hash_t *
svn_fs__access_get_lock_tokens(svn_fs_access_t *access_ctx)
{
diff --git a/subversion/libsvn_fs/deprecated.c b/subversion/libsvn_fs/deprecated.c
new file mode 100644
index 0000000..0304577
--- /dev/null
+++ b/subversion/libsvn_fs/deprecated.c
@@ -0,0 +1,90 @@
+/*
+ * deprecated.c: holding file for all deprecated APIs.
+ * "we can't lose 'em, but we can shun 'em!"
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* We define this here to remove any further warnings about the usage of
+ deprecated functions in this file. */
+#define SVN_DEPRECATED
+
+#include "svn_fs.h"
+
+
+/*** From fs-loader.c ***/
+svn_error_t *
+svn_fs_upgrade(const char *path, apr_pool_t *pool)
+{
+ return svn_error_trace(svn_fs_upgrade2(path, NULL, NULL, NULL, NULL, pool));
+}
+
+svn_error_t *
+svn_fs_hotcopy2(const char *src_path, const char *dest_path,
+ svn_boolean_t clean, svn_boolean_t incremental,
+ svn_cancel_func_t cancel_func, void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_fs_hotcopy3(src_path, dest_path, clean,
+ incremental, NULL, NULL,
+ cancel_func, cancel_baton,
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_hotcopy(const char *src_path, const char *dest_path,
+ svn_boolean_t clean, apr_pool_t *pool)
+{
+ return svn_error_trace(svn_fs_hotcopy2(src_path, dest_path, clean,
+ FALSE, NULL, NULL, pool));
+}
+
+svn_error_t *
+svn_fs_begin_txn(svn_fs_txn_t **txn_p, svn_fs_t *fs, svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_fs_begin_txn2(txn_p, fs, rev, 0, pool));
+}
+
+svn_error_t *
+svn_fs_change_rev_prop(svn_fs_t *fs, svn_revnum_t rev, const char *name,
+ const svn_string_t *value, apr_pool_t *pool)
+{
+ return svn_error_trace(
+ svn_fs_change_rev_prop2(fs, rev, name, NULL, value, pool));
+}
+
+svn_error_t *
+svn_fs_get_locks(svn_fs_t *fs, const char *path,
+ svn_fs_get_locks_callback_t get_locks_func,
+ void *get_locks_baton, apr_pool_t *pool)
+{
+ return svn_error_trace(svn_fs_get_locks2(fs, path, svn_depth_infinity,
+ get_locks_func, get_locks_baton,
+ pool));
+}
+
+/*** From access.c ***/
+svn_error_t *
+svn_fs_access_add_lock_token(svn_fs_access_t *access_ctx,
+ const char *token)
+{
+ return svn_fs_access_add_lock_token2(access_ctx, (const char *) 1, token);
+}
diff --git a/subversion/libsvn_fs/editor.c b/subversion/libsvn_fs/editor.c
index a75f210..b4cd3bc 100644
--- a/subversion/libsvn_fs/editor.c
+++ b/subversion/libsvn_fs/editor.c
@@ -62,9 +62,7 @@ struct edit_baton {
svn_fs_root_t *root;
};
-#define FSPATH(relpath, pool) apr_pstrcat(pool, "/", relpath, NULL)
-#define UNUSED(x) ((void)(x))
-
+#define FSPATH(relpath, pool) apr_pstrcat(pool, "/", relpath, SVN_VA_NULL)
static svn_error_t *
get_root(svn_fs_root_t **root,
@@ -94,8 +92,8 @@ add_new_props(svn_fs_root_t *root,
for (hi = apr_hash_first(scratch_pool, props); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_string_t *value = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
@@ -177,7 +175,7 @@ can_modify(svn_fs_root_t *txn_root,
SVN_ERR(svn_fs_node_created_rev(&created_rev, txn_root, fspath,
scratch_pool));
- /* Uncommitted nodes (eg. a descendent of a copy/move/rotate destination)
+ /* Uncommitted nodes (eg. a descendant of a copy/move destination)
have no (committed) revision number. Let the caller go ahead and
modify these nodes.
@@ -195,7 +193,7 @@ can_modify(svn_fs_root_t *txn_root,
have supplied a valid revision number [that they expect to change].
The checks further below will determine the out-of-dateness of the
specified revision. */
- /* ### ugh. descendents of copy/move/rotate destinations carry along
+ /* ### ugh. descendants of copy/move destinations carry along
### their original immutable state and (thus) a valid CREATED_REV.
### but they are logically uncommitted, so the caller will pass
### SVN_INVALID_REVNUM. (technically, the caller could provide
@@ -203,9 +201,9 @@ can_modify(svn_fs_root_t *txn_root,
### API).
###
### for now, we will assume the caller knows what they are doing
- ### and an invalid revision implies such a descendent. in the
+ ### and an invalid revision implies such a descendant. in the
### future, we could examine the ancestor chain looking for a
- ### copy/move/rotate-here node and allow the modification (and the
+ ### copy/move-here node and allow the modification (and the
### converse: if no such ancestor, the caller must specify the
### correct/intended revision to modify).
*/
@@ -240,23 +238,18 @@ can_modify(svn_fs_root_t *txn_root,
of those new revisions.
In either case, the node may not have changed in those new
revisions; use the node's ID to determine this case. */
- const svn_fs_id_t *txn_noderev_id;
svn_fs_root_t *rev_root;
- const svn_fs_id_t *new_noderev_id;
-
- /* The ID of the node that we would be modifying in the txn */
- SVN_ERR(svn_fs_node_id(&txn_noderev_id, txn_root, fspath,
- scratch_pool));
+ svn_fs_node_relation_t relation;
/* Get the ID from the future/new revision. */
SVN_ERR(svn_fs_revision_root(&rev_root, svn_fs_root_fs(txn_root),
revision, scratch_pool));
- SVN_ERR(svn_fs_node_id(&new_noderev_id, rev_root, fspath,
- scratch_pool));
+ SVN_ERR(svn_fs_node_relation(&relation, txn_root, fspath, rev_root,
+ fspath, scratch_pool));
svn_fs_close_root(rev_root);
/* Has the target node changed in the future? */
- if (svn_fs_compare_ids(txn_noderev_id, new_noderev_id) != 0)
+ if (relation != svn_fs_node_unchanged)
{
/* Restarting the commit will base the txn on the future/new
revision, allowing the modification at REVISION. */
@@ -299,7 +292,7 @@ can_create(svn_fs_root_t *txn_root,
### test the ancestor to determine if it has been *-here in this
### txn, or just a simple modification. */
- /* Are any of the parents copied/moved/rotated-here? */
+ /* Are any of the parents copied/moved-here? */
for (cur_fspath = fspath;
strlen(cur_fspath) > 1; /* not the root */
cur_fspath = svn_fspath__dirname(cur_fspath, scratch_pool))
@@ -488,9 +481,9 @@ static svn_error_t *
alter_file_cb(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)
{
struct edit_baton *eb = baton;
@@ -521,13 +514,14 @@ static svn_error_t *
alter_symlink_cb(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)
{
struct edit_baton *eb = baton;
- UNUSED(eb); SVN__NOT_IMPLEMENTED();
+ SVN_UNUSED(eb);
+ SVN__NOT_IMPLEMENTED();
}
@@ -633,19 +627,6 @@ move_cb(void *baton,
}
-/* This implements svn_editor_cb_rotate_t */
-static svn_error_t *
-rotate_cb(void *baton,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions,
- apr_pool_t *scratch_pool)
-{
- struct edit_baton *eb = baton;
-
- UNUSED(eb); SVN__NOT_IMPLEMENTED();
-}
-
-
/* This implements svn_editor_cb_complete_t */
static svn_error_t *
complete_cb(void *baton,
@@ -714,7 +695,6 @@ make_editor(svn_editor_t **editor,
delete_cb,
copy_cb,
move_cb,
- rotate_cb,
complete_cb,
abort_cb
};
@@ -804,9 +784,9 @@ svn_fs__editor_commit(svn_revnum_t *revision,
if (!err)
err = svn_fs_commit_txn(&inner_conflict_path,
- revision,
- eb->txn,
- scratch_pool);
+ revision,
+ eb->txn,
+ scratch_pool);
if (SVN_IS_VALID_REVNUM(*revision))
{
if (err)
@@ -829,7 +809,7 @@ svn_fs__editor_commit(svn_revnum_t *revision,
/* Copy this into the correct pool (see note above). */
*conflict_path = apr_pstrdup(result_pool, inner_conflict_path);
- /* Return sucess. The caller should inspect CONFLICT_PATH to
+ /* Return success. The caller should inspect CONFLICT_PATH to
determine this particular case. */
svn_error_clear(err);
err = SVN_NO_ERROR;
diff --git a/subversion/libsvn_fs/fs-loader.c b/subversion/libsvn_fs/fs-loader.c
index 336b84f..ba90554 100644
--- a/subversion/libsvn_fs/fs-loader.c
+++ b/subversion/libsvn_fs/fs-loader.c
@@ -24,12 +24,14 @@
#include <string.h>
#include <apr.h>
+#include <apr_atomic.h>
#include <apr_hash.h>
#include <apr_md5.h>
#include <apr_thread_mutex.h>
#include <apr_uuid.h>
#include <apr_strings.h>
+#include "svn_private_config.h"
#include "svn_hash.h"
#include "svn_ctype.h"
#include "svn_types.h"
@@ -40,8 +42,9 @@
#include "svn_xml.h"
#include "svn_pools.h"
#include "svn_string.h"
-#include "svn_private_config.h"
+#include "svn_sorts.h"
+#include "private/svn_atomic.h"
#include "private/svn_fs_private.h"
#include "private/svn_fs_util.h"
#include "private/svn_utf_private.h"
@@ -60,8 +63,9 @@
/* A pool common to all FS objects. See the documentation on the
open/create functions in fs-loader.h and for svn_fs_initialize(). */
-static apr_pool_t *common_pool;
-svn_mutex__t *common_pool_lock;
+static apr_pool_t *common_pool = NULL;
+static svn_mutex__t *common_pool_lock = NULL;
+static svn_atomic_t common_pool_initialized = FALSE;
/* --- Utility functions for the loader --- */
@@ -70,6 +74,7 @@ struct fs_type_defn {
const char *fs_type;
const char *fsap_name;
fs_init_func_t initfunc;
+ fs_library_vtable_t *vtable;
struct fs_type_defn *next;
};
@@ -81,10 +86,23 @@ static struct fs_type_defn base_defn =
#else
NULL,
#endif
+ NULL,
NULL /* End of static list: this needs to be reset to NULL if the
common_pool used when setting it has been cleared. */
};
+static struct fs_type_defn fsx_defn =
+ {
+ SVN_FS_TYPE_FSX, "x",
+#ifdef SVN_LIBSVN_FS_LINKS_FS_X
+ svn_fs_x__init,
+#else
+ NULL,
+#endif
+ NULL,
+ &base_defn
+ };
+
static struct fs_type_defn fsfs_defn =
{
SVN_FS_TYPE_FSFS, "fs",
@@ -93,7 +111,8 @@ static struct fs_type_defn fsfs_defn =
#else
NULL,
#endif
- &base_defn
+ NULL,
+ &fsx_defn
};
static struct fs_type_defn *fs_modules = &fsfs_defn;
@@ -148,13 +167,20 @@ load_module(fs_init_func_t *initfunc, const char *name, apr_pool_t *pool)
/* Fetch a library vtable by a pointer into the library definitions array. */
static svn_error_t *
get_library_vtable_direct(fs_library_vtable_t **vtable,
- const struct fs_type_defn *fst,
+ struct fs_type_defn *fst,
apr_pool_t *pool)
{
fs_init_func_t initfunc = NULL;
const svn_version_t *my_version = svn_fs_version();
const svn_version_t *fs_version;
+ /* most times, we get lucky */
+ *vtable = apr_atomic_casptr((volatile void **)&fst->vtable, NULL, NULL);
+ if (*vtable)
+ return SVN_NO_ERROR;
+
+ /* o.k. the first access needs to actually load the module, find the
+ vtable and check for version compatibility. */
initfunc = fst->initfunc;
if (! initfunc)
SVN_ERR(load_module(&initfunc, fst->fsap_name, pool));
@@ -172,8 +198,7 @@ get_library_vtable_direct(fs_library_vtable_t **vtable,
unloaded. This function makes a best effort by creating the
common pool as a child of the global pool; the window of failure
due to thread collision is small. */
- if (!common_pool)
- SVN_ERR(svn_fs_initialize(NULL));
+ SVN_ERR(svn_fs_initialize(NULL));
/* Invoke the FS module's initfunc function with the common
pool protected by a lock. */
@@ -191,6 +216,10 @@ get_library_vtable_direct(fs_library_vtable_t **vtable,
my_version->patch, my_version->tag,
fs_version->major, fs_version->minor,
fs_version->patch, fs_version->tag);
+
+ /* the vtable will not change. Remember it */
+ apr_atomic_casptr((volatile void **)&fst->vtable, *vtable, NULL);
+
return SVN_NO_ERROR;
}
@@ -211,31 +240,37 @@ get_or_allocate_third(struct fs_type_defn **fst,
(*fst)->fs_type = apr_pstrdup(common_pool, fs_type);
(*fst)->fsap_name = (*fst)->fs_type;
(*fst)->initfunc = NULL;
+ (*fst)->vtable = NULL;
(*fst)->next = NULL;
return SVN_NO_ERROR;
}
#endif
-/* Fetch a library vtable by FS type. */
+/* Fetch a library *VTABLE by FS_TYPE.
+ Use POOL for temporary allocations. */
static svn_error_t *
get_library_vtable(fs_library_vtable_t **vtable, const char *fs_type,
apr_pool_t *pool)
{
- struct fs_type_defn **fst = &fs_modules;
+ struct fs_type_defn **fst;
svn_boolean_t known = FALSE;
- /* There are two FS module definitions known at compile time. We
+ /* There are three FS module definitions known at compile time. We
want to check these without any locking overhead even when
dynamic third party modules are enabled. The third party modules
cannot be checked until the lock is held. */
- if (strcmp(fs_type, (*fst)->fs_type) == 0)
- known = TRUE;
- else
+ for (fst = &fs_modules; *fst; fst = &(*fst)->next)
{
- fst = &(*fst)->next;
if (strcmp(fs_type, (*fst)->fs_type) == 0)
- known = TRUE;
+ {
+ known = TRUE;
+ break;
+ }
+ else if (!(*fst)->next)
+ {
+ break;
+ }
}
#if defined(SVN_USE_DSO) && APR_HAS_DSO
@@ -254,8 +289,8 @@ get_library_vtable(fs_library_vtable_t **vtable, const char *fs_type,
if (!known)
{
fst = &(*fst)->next;
- if (!common_pool) /* Best-effort init, see get_library_vtable_direct. */
- SVN_ERR(svn_fs_initialize(NULL));
+ /* Best-effort init, see get_library_vtable_direct. */
+ SVN_ERR(svn_fs_initialize(NULL));
SVN_MUTEX__WITH_LOCK(common_pool_lock,
get_or_allocate_third(fst, fs_type));
known = TRUE;
@@ -320,7 +355,9 @@ fs_library_vtable(fs_library_vtable_t **vtable, const char *path,
SVN_ERR(svn_fs_type(&fs_type, path, pool));
/* Fetch the library vtable by name, now that we've chosen one. */
- return svn_error_trace(get_library_vtable(vtable, fs_type, pool));
+ SVN_ERR(get_library_vtable(vtable, fs_type, pool));
+
+ return SVN_NO_ERROR;
}
static svn_error_t *
@@ -345,16 +382,15 @@ write_fs_type(const char *path, const char *fs_type, apr_pool_t *pool)
static apr_status_t uninit(void *data)
{
common_pool = NULL;
+ common_pool_lock = NULL;
+ common_pool_initialized = 0;
+
return APR_SUCCESS;
}
-svn_error_t *
-svn_fs_initialize(apr_pool_t *pool)
+static svn_error_t *
+synchronized_initialize(void *baton, apr_pool_t *pool)
{
- /* Protect against multiple calls. */
- if (common_pool)
- return SVN_NO_ERROR;
-
common_pool = svn_pool_create(pool);
base_defn.next = NULL;
SVN_ERR(svn_mutex__init(&common_pool_lock, TRUE, common_pool));
@@ -369,19 +405,44 @@ svn_fs_initialize(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_initialize(apr_pool_t *pool)
+{
+#if defined(SVN_USE_DSO) && APR_HAS_DSO
+ /* Ensure that DSO subsystem is initialized early as possible if
+ we're going to use it. */
+ SVN_ERR(svn_dso_initialize2());
+#endif
+ /* Protect against multiple calls. */
+ return svn_error_trace(svn_atomic__init_once(&common_pool_initialized,
+ synchronized_initialize,
+ NULL, pool));
+}
+
/* A default warning handling function. */
static void
default_warning_func(void *baton, svn_error_t *err)
{
/* The one unforgiveable sin is to fail silently. Dumping to stderr
or /dev/tty is not acceptable default behavior for server
- processes, since those may both be equivalent to /dev/null. */
+ processes, since those may both be equivalent to /dev/null.
+
+ That said, be a good citizen and print something anyway, in case it goes
+ somewhere, and our caller hasn't overridden the abort() call.
+ */
+ if (svn_error_get_malfunction_handler()
+ == svn_error_abort_on_malfunction)
+ /* ### TODO: extend the malfunction API such that non-abort()ing consumers
+ ### also get the information on ERR. */
+ svn_handle_error2(err, stderr, FALSE /* fatal */, "svn: fs-loader: ");
SVN_ERR_MALFUNCTION_NO_RETURN();
}
svn_error_t *
svn_fs__path_valid(const char *path, apr_pool_t *pool)
{
+ char *c;
+
/* UTF-8 encoded string without NULs. */
if (! svn_utf__cstring_is_valid(path))
{
@@ -398,6 +459,18 @@ svn_fs__path_valid(const char *path, apr_pool_t *pool)
path);
}
+ /* Raise an error if PATH contains a newline because svn:mergeinfo and
+ friends can't handle them. Issue #4340 describes a similar problem
+ in the FSFS code itself.
+ */
+ c = strchr(path, '\n');
+ if (c)
+ {
+ return svn_error_createf(SVN_ERR_FS_PATH_SYNTAX, NULL,
+ _("Invalid control character '0x%02x' in path '%s'"),
+ (unsigned char)*c, svn_path_illegal_path_escape(path, pool));
+ }
+
/* That's good enough. */
return SVN_NO_ERROR;
}
@@ -451,42 +524,66 @@ svn_fs_create(svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config,
/* Perform the actual creation. */
*fs_p = fs_new(fs_config, pool);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->create(*fs_p, path, pool, common_pool));
- SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open));
+ SVN_ERR(vtable->create(*fs_p, path, common_pool_lock, pool, common_pool));
+ SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open2));
return SVN_NO_ERROR;
}
svn_error_t *
-svn_fs_open(svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config,
- apr_pool_t *pool)
+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)
{
fs_library_vtable_t *vtable;
- SVN_ERR(fs_library_vtable(&vtable, path, pool));
- *fs_p = fs_new(fs_config, pool);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->open_fs(*fs_p, path, pool, common_pool));
- SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open));
+ SVN_ERR(fs_library_vtable(&vtable, path, scratch_pool));
+ *fs_p = fs_new(fs_config, result_pool);
+ SVN_ERR(vtable->open_fs(*fs_p, path, common_pool_lock, scratch_pool,
+ common_pool));
+ SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open2));
return SVN_NO_ERROR;
}
svn_error_t *
-svn_fs_upgrade(const char *path, apr_pool_t *pool)
+svn_fs_open(svn_fs_t **fs_p,
+ const char *path,
+ apr_hash_t *fs_config,
+ apr_pool_t *pool)
+{
+ return svn_fs_open2(fs_p, path, fs_config, pool, pool);
+}
+
+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)
{
fs_library_vtable_t *vtable;
svn_fs_t *fs;
- SVN_ERR(fs_library_vtable(&vtable, path, pool));
- fs = fs_new(NULL, pool);
+ SVN_ERR(fs_library_vtable(&vtable, path, scratch_pool));
+ fs = fs_new(NULL, scratch_pool);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->upgrade_fs(fs, path, pool, common_pool));
+ SVN_ERR(vtable->upgrade_fs(fs, path,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton,
+ common_pool_lock,
+ scratch_pool, common_pool));
return SVN_NO_ERROR;
}
+/* A warning handling function that does not abort on errors,
+ but just lets them be returned normally. */
+static void
+verify_fs_warning_func(void *baton, svn_error_t *err)
+{
+}
+
svn_error_t *
svn_fs_verify(const char *path,
apr_hash_t *fs_config,
@@ -503,12 +600,13 @@ svn_fs_verify(const char *path,
SVN_ERR(fs_library_vtable(&vtable, path, pool));
fs = fs_new(fs_config, pool);
+ svn_fs_set_warning_func(fs, verify_fs_warning_func, NULL);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->verify_fs(fs, path, start, end,
- notify_func, notify_baton,
- cancel_func, cancel_baton,
- pool, common_pool));
+ SVN_ERR(vtable->verify_fs(fs, path, start, end,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton,
+ common_pool_lock,
+ pool, common_pool));
return SVN_NO_ERROR;
}
@@ -537,9 +635,12 @@ svn_fs_delete_fs(const char *path, apr_pool_t *pool)
}
svn_error_t *
-svn_fs_hotcopy2(const char *src_path, const char *dst_path,
+svn_fs_hotcopy3(const char *src_path, const char *dst_path,
svn_boolean_t clean, svn_boolean_t incremental,
- svn_cancel_func_t cancel_func, void *cancel_baton,
+ svn_fs_hotcopy_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
fs_library_vtable_t *vtable;
@@ -592,20 +693,13 @@ svn_fs_hotcopy2(const char *src_path, const char *dst_path,
}
SVN_ERR(vtable->hotcopy(src_fs, dst_fs, src_path, dst_path, clean,
- incremental, cancel_func, cancel_baton,
- scratch_pool));
+ incremental, notify_func, notify_baton,
+ cancel_func, cancel_baton, common_pool_lock,
+ scratch_pool, common_pool));
return svn_error_trace(write_fs_type(dst_path, src_fs_type, scratch_pool));
}
svn_error_t *
-svn_fs_hotcopy(const char *src_path, const char *dest_path,
- svn_boolean_t clean, apr_pool_t *pool)
-{
- return svn_error_trace(svn_fs_hotcopy2(src_path, dest_path, clean,
- FALSE, NULL, NULL, pool));
-}
-
-svn_error_t *
svn_fs_pack(const char *path,
svn_fs_pack_notify_t notify_func,
void *notify_baton,
@@ -619,10 +713,9 @@ svn_fs_pack(const char *path,
SVN_ERR(fs_library_vtable(&vtable, path, pool));
fs = fs_new(NULL, pool);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->pack_fs(fs, path, notify_func, notify_baton,
- cancel_func, cancel_baton, pool,
- common_pool));
+ SVN_ERR(vtable->pack_fs(fs, path, notify_func, notify_baton,
+ cancel_func, cancel_baton, common_pool_lock,
+ pool, common_pool));
return SVN_NO_ERROR;
}
@@ -637,9 +730,8 @@ svn_fs_recover(const char *path,
SVN_ERR(fs_library_vtable(&vtable, path, pool));
fs = fs_new(NULL, pool);
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->open_fs_for_recovery(fs, path, pool,
- common_pool));
+ SVN_ERR(vtable->open_fs_for_recovery(fs, path, common_pool_lock,
+ pool, common_pool));
return svn_error_trace(vtable->recover(fs, cancel_func, cancel_baton,
pool));
}
@@ -680,9 +772,8 @@ svn_fs_create_berkeley(svn_fs_t *fs, const char *path)
SVN_ERR(write_fs_type(path, SVN_FS_TYPE_BDB, fs->pool));
/* Perform the actual creation. */
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->create(fs, path, fs->pool, common_pool));
- SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open));
+ SVN_ERR(vtable->create(fs, path, common_pool_lock, fs->pool, common_pool));
+ SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open2));
return SVN_NO_ERROR;
}
@@ -693,9 +784,8 @@ svn_fs_open_berkeley(svn_fs_t *fs, const char *path)
fs_library_vtable_t *vtable;
SVN_ERR(fs_library_vtable(&vtable, path, fs->pool));
- SVN_MUTEX__WITH_LOCK(common_pool_lock,
- vtable->open_fs(fs, path, fs->pool, common_pool));
- SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open));
+ SVN_ERR(vtable->open_fs(fs, path, common_pool_lock, fs->pool, common_pool));
+ SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open2));
return SVN_NO_ERROR;
}
@@ -716,8 +806,9 @@ svn_error_t *
svn_fs_hotcopy_berkeley(const char *src_path, const char *dest_path,
svn_boolean_t clean_logs, apr_pool_t *pool)
{
- return svn_error_trace(svn_fs_hotcopy2(src_path, dest_path, clean_logs,
- FALSE, NULL, NULL, pool));
+ return svn_error_trace(svn_fs_hotcopy3(src_path, dest_path, clean_logs,
+ FALSE, NULL, NULL, NULL, NULL,
+ pool));
}
svn_error_t *
@@ -758,16 +849,8 @@ svn_fs_begin_txn2(svn_fs_txn_t **txn_p, svn_fs_t *fs, svn_revnum_t rev,
svn_error_t *
-svn_fs_begin_txn(svn_fs_txn_t **txn_p, svn_fs_t *fs, svn_revnum_t rev,
- apr_pool_t *pool)
-{
- return svn_error_trace(svn_fs_begin_txn2(txn_p, fs, rev, 0, pool));
-}
-
-
-svn_error_t *
svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
- svn_fs_txn_t *txn, apr_pool_t *pool)
+ svn_fs_txn_t *txn, apr_pool_t *pool)
{
svn_error_t *err;
@@ -791,24 +874,9 @@ svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
SVN_ERR(err);
-#ifdef PACK_AFTER_EVERY_COMMIT
- {
- svn_fs_t *fs = txn->fs;
- const char *fs_path = svn_fs_path(fs, pool);
- err = svn_fs_pack(fs_path, NULL, NULL, NULL, NULL, pool);
- if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
- /* Pre-1.6 filesystem. */
- svn_error_clear(err);
- else if (err)
- /* Real error. */
- return svn_error_trace(err);
- }
-#endif
-
return SVN_NO_ERROR;
}
-
svn_error_t *
svn_fs_abort_txn(svn_fs_txn_t *txn, apr_pool_t *pool)
{
@@ -848,23 +916,49 @@ svn_fs_list_transactions(apr_array_header_t **names_p, svn_fs_t *fs,
return svn_error_trace(fs->vtable->list_transactions(names_p, fs, pool));
}
+static svn_boolean_t
+is_internal_txn_prop(const char *name)
+{
+ return strcmp(name, SVN_FS__PROP_TXN_CHECK_LOCKS) == 0 ||
+ strcmp(name, SVN_FS__PROP_TXN_CHECK_OOD) == 0 ||
+ strcmp(name, SVN_FS__PROP_TXN_CLIENT_DATE) == 0;
+}
+
svn_error_t *
svn_fs_txn_prop(svn_string_t **value_p, svn_fs_txn_t *txn,
const char *propname, apr_pool_t *pool)
{
+ if (is_internal_txn_prop(propname))
+ {
+ *value_p = NULL;
+ return SVN_NO_ERROR;
+ }
+
return svn_error_trace(txn->vtable->get_prop(value_p, txn, propname, pool));
}
svn_error_t *
svn_fs_txn_proplist(apr_hash_t **table_p, svn_fs_txn_t *txn, apr_pool_t *pool)
{
- return svn_error_trace(txn->vtable->get_proplist(table_p, txn, pool));
+ SVN_ERR(txn->vtable->get_proplist(table_p, txn, pool));
+
+ /* Don't give away internal transaction properties. */
+ svn_hash_sets(*table_p, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
+ svn_hash_sets(*table_p, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
+ svn_hash_sets(*table_p, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
+
+ return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_change_txn_prop(svn_fs_txn_t *txn, const char *name,
const svn_string_t *value, apr_pool_t *pool)
{
+ if (is_internal_txn_prop(name))
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Attempt to modify internal transaction "
+ "property '%s'"), name);
+
return svn_error_trace(txn->vtable->change_prop(txn, name, value, pool));
}
@@ -872,6 +966,18 @@ svn_error_t *
svn_fs_change_txn_props(svn_fs_txn_t *txn, const apr_array_header_t *props,
apr_pool_t *pool)
{
+ int i;
+
+ for (i = 0; i < props->nelts; ++i)
+ {
+ svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
+
+ if (is_internal_txn_prop(prop->name))
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Attempt to modify internal transaction "
+ "property '%s'"), prop->name);
+ }
+
return svn_error_trace(txn->vtable->change_props(txn, props, pool));
}
@@ -940,7 +1046,8 @@ svn_fs_revision_root_revision(svn_fs_root_t *root)
}
svn_error_t *
-svn_fs_paths_changed2(apr_hash_t **changed_paths_p, svn_fs_root_t *root,
+svn_fs_paths_changed2(apr_hash_t **changed_paths_p,
+ svn_fs_root_t *root,
apr_pool_t *pool)
{
return root->vtable->paths_changed(changed_paths_p, root, pool);
@@ -984,11 +1091,21 @@ svn_fs_check_path(svn_node_kind_t *kind_p, svn_fs_root_t *root,
}
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)
+{
+ return svn_error_trace(root->vtable->node_history(history_p, root, path,
+ result_pool,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_node_history(svn_fs_history_t **history_p, svn_fs_root_t *root,
const char *path, apr_pool_t *pool)
{
return svn_error_trace(root->vtable->node_history(history_p, root, path,
- pool));
+ pool, pool));
}
svn_error_t *
@@ -1021,6 +1138,25 @@ svn_fs_node_id(const svn_fs_id_t **id_p, svn_fs_root_t *root,
}
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)
+{
+ /* Different repository types? */
+ if (root_a->fs != root_b->fs)
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(root_a->vtable->node_relation(relation,
+ root_a, path_a,
+ root_b, path_b,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_node_created_rev(svn_revnum_t *revision, svn_fs_root_t *root,
const char *path, apr_pool_t *pool)
{
@@ -1061,6 +1197,16 @@ svn_fs_node_proplist(apr_hash_t **table_p, svn_fs_root_t *root,
}
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)
+{
+ return svn_error_trace(root->vtable->node_has_props(has_props, root, path,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_change_node_prop(svn_fs_root_t *root, const char *path,
const char *name, const svn_string_t *value,
apr_pool_t *pool)
@@ -1070,6 +1216,17 @@ svn_fs_change_node_prop(svn_fs_root_t *root, const char *path,
}
svn_error_t *
+svn_fs_props_different(svn_boolean_t *changed_p, svn_fs_root_t *root1,
+ const char *path1, svn_fs_root_t *root2,
+ const char *path2, apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(root1->vtable->props_changed(changed_p,
+ root1, path1,
+ root2, path2,
+ TRUE, scratch_pool));
+}
+
+svn_error_t *
svn_fs_props_changed(svn_boolean_t *changed_p, svn_fs_root_t *root1,
const char *path1, svn_fs_root_t *root2,
const char *path2, apr_pool_t *pool)
@@ -1077,7 +1234,7 @@ svn_fs_props_changed(svn_boolean_t *changed_p, svn_fs_root_t *root1,
return svn_error_trace(root1->vtable->props_changed(changed_p,
root1, path1,
root2, path2,
- pool));
+ FALSE, pool));
}
svn_error_t *
@@ -1126,6 +1283,30 @@ svn_fs_get_mergeinfo(svn_mergeinfo_catalog_t *catalog,
}
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)
+{
+ apr_array_header_t *paths
+ = apr_array_make(scratch_pool, 1, sizeof(const char *));
+ svn_mergeinfo_catalog_t catalog;
+
+ APR_ARRAY_PUSH(paths, const char *) = path;
+
+ SVN_ERR(svn_fs_get_mergeinfo2(&catalog, root, paths,
+ inherit, FALSE /*include_descendants*/,
+ adjust_inherited_mergeinfo,
+ result_pool, scratch_pool));
+ *mergeinfo = svn_hash_gets(catalog, path);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_fs_merge(const char **conflict_p, svn_fs_root_t *source_root,
const char *source_path, svn_fs_root_t *target_root,
const char *target_path, svn_fs_root_t *ancestor_root,
@@ -1147,6 +1328,19 @@ svn_fs_dir_entries(apr_hash_t **entries_p, svn_fs_root_t *root,
}
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)
+{
+ return svn_error_trace(root->vtable->dir_optimal_order(ordered_p, root,
+ entries,
+ result_pool,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_make_dir(svn_fs_root_t *root, const char *path, apr_pool_t *pool)
{
SVN_ERR(svn_fs__path_valid(path, pool));
@@ -1302,6 +1496,18 @@ svn_fs_apply_text(svn_stream_t **contents_p, svn_fs_root_t *root,
}
svn_error_t *
+svn_fs_contents_different(svn_boolean_t *changed_p, svn_fs_root_t *root1,
+ const char *path1, svn_fs_root_t *root2,
+ const char *path2, apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(root1->vtable->contents_changed(changed_p,
+ root1, path1,
+ root2, path2,
+ TRUE,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_contents_changed(svn_boolean_t *changed_p, svn_fs_root_t *root1,
const char *path1, svn_fs_root_t *root2,
const char *path2, apr_pool_t *pool)
@@ -1309,7 +1515,7 @@ svn_fs_contents_changed(svn_boolean_t *changed_p, svn_fs_root_t *root1,
return svn_error_trace(root1->vtable->contents_changed(changed_p,
root1, path1,
root2, path2,
- pool));
+ FALSE, pool));
}
svn_error_t *
@@ -1319,6 +1525,29 @@ svn_fs_youngest_rev(svn_revnum_t *youngest_p, svn_fs_t *fs, apr_pool_t *pool)
}
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 svn_error_trace(fs->vtable->info_format(fs_format, supports_version,
+ fs,
+ result_pool, scratch_pool));
+}
+
+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)
+{
+ return svn_error_trace(fs->vtable->info_config_files(files, fs,
+ result_pool,
+ scratch_pool));
+}
+
+svn_error_t *
svn_fs_deltify_revision(svn_fs_t *fs, svn_revnum_t revision, apr_pool_t *pool)
{
return svn_error_trace(fs->vtable->deltify(fs, revision, pool));
@@ -1351,14 +1580,6 @@ svn_fs_change_rev_prop2(svn_fs_t *fs, svn_revnum_t rev, const char *name,
}
svn_error_t *
-svn_fs_change_rev_prop(svn_fs_t *fs, svn_revnum_t rev, const char *name,
- const svn_string_t *value, apr_pool_t *pool)
-{
- return svn_error_trace(
- svn_fs_change_rev_prop2(fs, rev, name, NULL, value, pool));
-}
-
-svn_error_t *
svn_fs_get_file_delta_stream(svn_txdelta_stream_t **stream_p,
svn_fs_root_t *source_root,
const char *source_path,
@@ -1398,54 +1619,144 @@ svn_fs_set_uuid(svn_fs_t *fs, const char *uuid, apr_pool_t *pool)
}
svn_error_t *
-svn_fs_lock(svn_lock_t **lock, svn_fs_t *fs, const char *path,
- const char *token, const char *comment,
- svn_boolean_t is_dav_comment, apr_time_t expiration_date,
- svn_revnum_t current_rev, svn_boolean_t steal_lock,
- apr_pool_t *pool)
+svn_fs_lock_many(svn_fs_t *fs,
+ apr_hash_t *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)
{
+ apr_hash_index_t *hi;
+ apr_hash_t *ok_targets = apr_hash_make(scratch_pool);
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
+
/* Enforce that the comment be xml-escapable. */
if (comment)
- {
- if (! svn_xml_is_xml_safe(comment, strlen(comment)))
- return svn_error_create
- (SVN_ERR_XML_UNESCAPABLE_DATA, NULL,
- _("Lock comment contains illegal characters"));
- }
+ if (! svn_xml_is_xml_safe(comment, strlen(comment)))
+ return svn_error_create(SVN_ERR_XML_UNESCAPABLE_DATA, NULL,
+ _("Lock comment contains illegal characters"));
+
+ if (expiration_date < 0)
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Negative expiration date passed to svn_fs_lock"));
/* Enforce that the token be an XML-safe URI. */
- if (token)
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
{
- const char *c;
-
- if (strncmp(token, "opaquelocktoken:", 16))
- return svn_error_createf(SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
- _("Lock token URI '%s' has bad scheme; "
- "expected '%s'"),
- token, "opaquelocktoken");
-
- for (c = token; *c; c++)
- if (! svn_ctype_isascii(*c))
- return svn_error_createf(SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
- _("Lock token '%s' is not ASCII "
- "at byte %u"),
- token, (unsigned)(c - token));
-
- /* strlen(token) == c - token. */
- if (! svn_xml_is_xml_safe(token, c - token))
- return svn_error_createf(SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
- _("Lock token URI '%s' is not XML-safe"),
- token);
+ const svn_fs_lock_target_t *target = apr_hash_this_val(hi);
+
+ err = SVN_NO_ERROR;
+ if (target->token)
+ {
+ const char *c;
+
+
+ if (strncmp(target->token, "opaquelocktoken:", 16))
+ err = svn_error_createf(SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
+ _("Lock token URI '%s' has bad scheme; "
+ "expected '%s'"),
+ target->token, "opaquelocktoken");
+
+ if (!err)
+ for (c = target->token; *c && !err; c++)
+ if (! svn_ctype_isascii(*c) || svn_ctype_iscntrl(*c))
+ err = svn_error_createf(
+ SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
+ _("Lock token '%s' is not ASCII or is a "
+ "control character at byte %u"),
+ target->token,
+ (unsigned)(c - target->token));
+
+ /* strlen(token) == c - token. */
+ if (!err && !svn_xml_is_xml_safe(target->token, c - target->token))
+ err = svn_error_createf(SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
+ _("Lock token URI '%s' is not XML-safe"),
+ target->token);
+ }
+
+ if (err)
+ {
+ if (!cb_err && lock_callback)
+ cb_err = lock_callback(lock_baton, apr_hash_this_key(hi),
+ NULL, err, scratch_pool);
+ svn_error_clear(err);
+ }
+ else
+ svn_hash_sets(ok_targets, apr_hash_this_key(hi), target);
}
- if (expiration_date < 0)
- return svn_error_create
- (SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Negative expiration date passed to svn_fs_lock"));
+ if (!apr_hash_count(ok_targets))
+ return svn_error_trace(cb_err);
+
+ err = fs->vtable->lock(fs, ok_targets, comment, is_dav_comment,
+ expiration_date, steal_lock,
+ lock_callback, lock_baton,
+ result_pool, scratch_pool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
+
+ return svn_error_trace(err);
+}
+
+struct lock_baton_t {
+ const svn_lock_t *lock;
+ svn_error_t *fs_err;
+};
+
+/* Implements svn_fs_lock_callback_t. Used by svn_fs_lock and
+ svn_fs_unlock to record the lock and error from svn_fs_lock_many
+ and svn_fs_unlock_many. */
+static svn_error_t *
+lock_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_baton_t *b = lock_baton;
+
+ b->lock = lock;
+ b->fs_err = svn_error_dup(fs_err);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_lock(svn_lock_t **lock, svn_fs_t *fs, const char *path,
+ const char *token, const char *comment,
+ svn_boolean_t is_dav_comment, apr_time_t expiration_date,
+ svn_revnum_t current_rev, svn_boolean_t steal_lock,
+ apr_pool_t *pool)
+{
+ apr_hash_t *targets = apr_hash_make(pool);
+ svn_fs_lock_target_t target;
+ svn_error_t *err;
+ struct lock_baton_t baton = {0};
+
+ target.token = token;
+ target.current_rev = current_rev;
+ svn_hash_sets(targets, path, &target);
- return svn_error_trace(fs->vtable->lock(lock, fs, path, token, comment,
- is_dav_comment, expiration_date,
- current_rev, steal_lock, pool));
+ err = svn_fs_lock_many(fs, targets, comment, is_dav_comment,
+ expiration_date, steal_lock, lock_cb, &baton,
+ pool, pool);
+
+ if (baton.lock)
+ *lock = (svn_lock_t*)baton.lock;
+
+ if (err && baton.fs_err)
+ svn_error_compose(err, baton.fs_err);
+ else if (!err)
+ err = baton.fs_err;
+
+ return svn_error_trace(err);
}
svn_error_t *
@@ -1454,12 +1765,62 @@ svn_fs_generate_lock_token(const char **token, svn_fs_t *fs, apr_pool_t *pool)
return svn_error_trace(fs->vtable->generate_lock_token(token, fs, pool));
}
+svn_fs_lock_target_t *
+svn_fs_lock_target_create(const char *token,
+ svn_revnum_t current_rev,
+ apr_pool_t *result_pool)
+{
+ svn_fs_lock_target_t *target = apr_palloc(result_pool,
+ sizeof(svn_fs_lock_target_t));
+
+ target->token = token;
+ target->current_rev = current_rev;
+
+ return target;
+}
+
+void
+svn_fs_lock_target_set_token(svn_fs_lock_target_t *target,
+ const char *token)
+{
+ target->token = token;
+}
+
+svn_error_t *
+svn_fs_unlock_many(svn_fs_t *fs,
+ apr_hash_t *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)
+{
+ return svn_error_trace(fs->vtable->unlock(fs, targets, break_lock,
+ lock_callback, lock_baton,
+ result_pool, scratch_pool));
+}
+
svn_error_t *
svn_fs_unlock(svn_fs_t *fs, const char *path, const char *token,
svn_boolean_t break_lock, apr_pool_t *pool)
{
- return svn_error_trace(fs->vtable->unlock(fs, path, token, break_lock,
- pool));
+ apr_hash_t *targets = apr_hash_make(pool);
+ svn_error_t *err;
+ struct lock_baton_t baton = {0};
+
+ if (!token)
+ token = "";
+ svn_hash_sets(targets, path, token);
+
+ err = svn_fs_unlock_many(fs, targets, break_lock, lock_cb, &baton,
+ pool, pool);
+
+ if (err && baton.fs_err)
+ svn_error_compose(err, baton.fs_err);
+ else if (!err)
+ err = baton.fs_err;
+
+ return svn_error_trace(err);
}
svn_error_t *
@@ -1483,26 +1844,26 @@ svn_fs_get_locks2(svn_fs_t *fs, const char *path, svn_depth_t depth,
get_locks_baton, pool));
}
+
+/* --- History functions --- */
+
svn_error_t *
-svn_fs_get_locks(svn_fs_t *fs, const char *path,
- svn_fs_get_locks_callback_t get_locks_func,
- void *get_locks_baton, apr_pool_t *pool)
+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)
{
- return svn_error_trace(svn_fs_get_locks2(fs, path, svn_depth_infinity,
- get_locks_func, get_locks_baton,
- pool));
+ return svn_error_trace(history->vtable->prev(prev_history_p, history,
+ cross_copies, result_pool,
+ scratch_pool));
}
-
-/* --- History functions --- */
-
svn_error_t *
svn_fs_history_prev(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history, svn_boolean_t cross_copies,
apr_pool_t *pool)
{
return svn_error_trace(history->vtable->prev(prev_history_p, history,
- cross_copies, pool));
+ cross_copies, pool, pool));
}
svn_error_t *
@@ -1540,20 +1901,28 @@ svn_fs_unparse_id(const svn_fs_id_t *id, apr_pool_t *pool)
svn_boolean_t
svn_fs_check_related(const svn_fs_id_t *a, const svn_fs_id_t *b)
{
- return (a->vtable->compare(a, b) != -1);
+ return (a->vtable->compare(a, b) != svn_fs_node_unrelated);
}
int
svn_fs_compare_ids(const svn_fs_id_t *a, const svn_fs_id_t *b)
{
- return a->vtable->compare(a, b);
+ switch (a->vtable->compare(a, b))
+ {
+ case svn_fs_node_unchanged:
+ return 0;
+ case svn_fs_node_common_ancestor:
+ return 1;
+ default:
+ return -1;
+ }
}
svn_error_t *
svn_fs_print_modules(svn_stringbuf_t *output,
apr_pool_t *pool)
{
- const struct fs_type_defn *defn = fs_modules;
+ struct fs_type_defn *defn = fs_modules;
fs_library_vtable_t *vtable;
apr_pool_t *iterpool = svn_pool_create(pool);
@@ -1602,3 +1971,43 @@ svn_fs_version(void)
{
SVN_VERSION_BODY;
}
+
+
+/** info **/
+svn_error_t *
+svn_fs_info(const svn_fs_info_placeholder_t **info_p,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (fs->vtable->info_fsap)
+ {
+ SVN_ERR(fs->vtable->info_fsap((const void **)info_p, fs,
+ result_pool, scratch_pool));
+ }
+ else
+ {
+ svn_fs_info_placeholder_t *info = apr_palloc(result_pool, sizeof(*info));
+ /* ### Ask the disk(!), since svn_fs_t doesn't cache the answer. */
+ SVN_ERR(svn_fs_type(&info->fs_type, fs->path, result_pool));
+ *info_p = info;
+ }
+ return SVN_NO_ERROR;
+}
+
+void *
+svn_fs_info_dup(const void *info_void,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const svn_fs_info_placeholder_t *info = info_void;
+ fs_library_vtable_t *vtable;
+
+ SVN_ERR(get_library_vtable(&vtable, info->fs_type, scratch_pool));
+
+ if (vtable->info_fsap_dup)
+ return vtable->info_fsap_dup(info_void, result_pool);
+ else
+ return apr_pmemdup(result_pool, info, sizeof(*info));
+}
+
diff --git a/subversion/libsvn_fs/fs-loader.h b/subversion/libsvn_fs/fs-loader.h
index 532ff05..db83744 100644
--- a/subversion/libsvn_fs/fs-loader.h
+++ b/subversion/libsvn_fs/fs-loader.h
@@ -27,6 +27,8 @@
#include "svn_types.h"
#include "svn_fs.h"
+#include "svn_props.h"
+#include "private/svn_mutex.h"
#ifdef __cplusplus
extern "C" {
@@ -72,20 +74,32 @@ typedef struct fs_library_vtable_t
this statement, now that the minor version has increased. */
const svn_version_t *(*get_version)(void);
- /* The open_fs/create/open_fs_for_recovery/upgrade_fs functions are
- serialized so that they may use the common_pool parameter to
- allocate fs-global objects such as the bdb env cache. */
- svn_error_t *(*create)(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+ /* The open_fs/create/open_fs_for_recovery/upgrade_fs functions must
+ use the common_pool_lock to serialize the access to the common_pool
+ parameter for allocating fs-global objects such as an env cache. */
+ svn_error_t *(*create)(svn_fs_t *fs, const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool);
- svn_error_t *(*open_fs)(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+ svn_error_t *(*open_fs)(svn_fs_t *fs, const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool);
/* open_for_recovery() is like open(), but used to fill in an fs pointer
that will be passed to recover(). We assume that the open() method
might not be immediately appropriate for recovery. */
svn_error_t *(*open_fs_for_recovery)(svn_fs_t *fs, const char *path,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool);
- svn_error_t *(*upgrade_fs)(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+ svn_error_t *(*upgrade_fs)(svn_fs_t *fs,
+ const char *path,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
apr_pool_t *common_pool);
svn_error_t *(*verify_fs)(svn_fs_t *fs, const char *path,
svn_revnum_t start,
@@ -94,14 +108,23 @@ typedef struct fs_library_vtable_t
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool);
svn_error_t *(*delete_fs)(const char *path, apr_pool_t *pool);
- svn_error_t *(*hotcopy)(svn_fs_t *src_fs, svn_fs_t *dst_fs,
- const char *src_path, const char *dst_path,
- svn_boolean_t clean, svn_boolean_t incremental,
- svn_cancel_func_t cancel_func, void *cancel_baton,
- apr_pool_t *pool);
+ svn_error_t *(*hotcopy)(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *src_path,
+ const char *dst_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,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool);
const char *(*get_description)(void);
svn_error_t *(*recover)(svn_fs_t *fs,
svn_cancel_func_t cancel_func, void *cancel_baton,
@@ -109,6 +132,7 @@ typedef struct fs_library_vtable_t
svn_error_t *(*pack_fs)(svn_fs_t *fs, const char *path,
svn_fs_pack_notify_t notify_func, void *notify_baton,
svn_cancel_func_t cancel_func, void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool, apr_pool_t *common_pool);
/* Provider-specific functions should go here, even if they could go
@@ -130,8 +154,11 @@ typedef struct fs_library_vtable_t
svn_error_t *(*svn_fs_open_)(svn_fs_t **,
const char *,
apr_hash_t *,
+ apr_pool_t *,
apr_pool_t *));
-
+ /* For svn_fs_info_fsfs_dup(). */
+ void *(*info_fsap_dup)(const void *fsap_info,
+ apr_pool_t *result_pool);
} fs_library_vtable_t;
/* This is the type of symbol an FS module defines to fetch the
@@ -163,6 +190,9 @@ svn_error_t *svn_fs_base__init(const svn_version_t *loader_version,
svn_error_t *svn_fs_fs__init(const svn_version_t *loader_version,
fs_library_vtable_t **vtable,
apr_pool_t* common_pool);
+svn_error_t *svn_fs_x__init(const svn_version_t *loader_version,
+ fs_library_vtable_t **vtable,
+ apr_pool_t* common_pool);
@@ -196,22 +226,38 @@ typedef struct fs_vtable_t
svn_error_t *(*list_transactions)(apr_array_header_t **names_p,
svn_fs_t *fs, apr_pool_t *pool);
svn_error_t *(*deltify)(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool);
- svn_error_t *(*lock)(svn_lock_t **lock, svn_fs_t *fs,
- const char *path, const char *token,
+ svn_error_t *(*lock)(svn_fs_t *fs,
+ apr_hash_t *targets,
const char *comment, svn_boolean_t is_dav_comment,
- apr_time_t expiration_date,
- svn_revnum_t current_rev, svn_boolean_t steal_lock,
- apr_pool_t *pool);
+ 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);
svn_error_t *(*generate_lock_token)(const char **token, svn_fs_t *fs,
apr_pool_t *pool);
- svn_error_t *(*unlock)(svn_fs_t *fs, const char *path, const char *token,
- svn_boolean_t break_lock, apr_pool_t *pool);
+ svn_error_t *(*unlock)(svn_fs_t *fs, apr_hash_t *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);
svn_error_t *(*get_lock)(svn_lock_t **lock, svn_fs_t *fs,
const char *path, apr_pool_t *pool);
svn_error_t *(*get_locks)(svn_fs_t *fs, const char *path, svn_depth_t depth,
svn_fs_get_locks_callback_t get_locks_func,
void *get_locks_baton,
apr_pool_t *pool);
+ svn_error_t *(*info_format)(int *fs_format,
+ svn_version_t **supports_version,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ svn_error_t *(*info_config_files)(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ svn_error_t *(*info_fsap)(const void **fsap_info,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ /* info_fsap_dup is in the library vtable. */
svn_error_t *(*verify_root)(svn_fs_root_t *root,
apr_pool_t *pool);
svn_error_t *(*freeze)(svn_fs_t *fs,
@@ -261,9 +307,14 @@ typedef struct root_vtable_t
const char *path, apr_pool_t *pool);
svn_error_t *(*node_history)(svn_fs_history_t **history_p,
svn_fs_root_t *root, const char *path,
- apr_pool_t *pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
svn_error_t *(*node_id)(const svn_fs_id_t **id_p, svn_fs_root_t *root,
const char *path, apr_pool_t *pool);
+ svn_error_t *(*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);
svn_error_t *(*node_created_rev)(svn_revnum_t *revision,
svn_fs_root_t *root, const char *path,
apr_pool_t *pool);
@@ -275,6 +326,13 @@ typedef struct root_vtable_t
apr_pool_t *pool);
svn_error_t *(*delete_node)(svn_fs_root_t *root, const char *path,
apr_pool_t *pool);
+ svn_error_t *(*copy)(svn_fs_root_t *from_root, const char *from_path,
+ svn_fs_root_t *to_root, const char *to_path,
+ apr_pool_t *pool);
+ svn_error_t *(*revision_link)(svn_fs_root_t *from_root,
+ svn_fs_root_t *to_root,
+ const char *path,
+ apr_pool_t *pool);
svn_error_t *(*copied_from)(svn_revnum_t *rev_p, const char **path_p,
svn_fs_root_t *root, const char *path,
apr_pool_t *pool);
@@ -288,26 +346,27 @@ typedef struct root_vtable_t
apr_pool_t *pool);
svn_error_t *(*node_proplist)(apr_hash_t **table_p, svn_fs_root_t *root,
const char *path, apr_pool_t *pool);
+ svn_error_t *(*node_has_props)(svn_boolean_t *has_props, svn_fs_root_t *root,
+ const char *path, apr_pool_t *scratch_pool);
svn_error_t *(*change_node_prop)(svn_fs_root_t *root, const char *path,
const char *name,
const svn_string_t *value,
apr_pool_t *pool);
svn_error_t *(*props_changed)(int *changed_p, svn_fs_root_t *root1,
const char *path1, svn_fs_root_t *root2,
- const char *path2, apr_pool_t *pool);
+ const char *path2, svn_boolean_t strict,
+ apr_pool_t *scratch_pool);
/* Directories */
svn_error_t *(*dir_entries)(apr_hash_t **entries_p, svn_fs_root_t *root,
const char *path, apr_pool_t *pool);
+ svn_error_t *(*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);
svn_error_t *(*make_dir)(svn_fs_root_t *root, const char *path,
apr_pool_t *pool);
- svn_error_t *(*copy)(svn_fs_root_t *from_root, const char *from_path,
- svn_fs_root_t *to_root, const char *to_path,
- apr_pool_t *pool);
- svn_error_t *(*revision_link)(svn_fs_root_t *from_root,
- svn_fs_root_t *to_root,
- const char *path,
- apr_pool_t *pool);
/* Files */
svn_error_t *(*file_length)(svn_filesize_t *length_p, svn_fs_root_t *root,
@@ -337,7 +396,8 @@ typedef struct root_vtable_t
apr_pool_t *pool);
svn_error_t *(*contents_changed)(int *changed_p, svn_fs_root_t *root1,
const char *path1, svn_fs_root_t *root2,
- const char *path2, apr_pool_t *pool);
+ const char *path2, svn_boolean_t strict,
+ apr_pool_t *scratch_pool);
svn_error_t *(*get_file_delta_stream)(svn_txdelta_stream_t **stream_p,
svn_fs_root_t *source_root,
const char *source_path,
@@ -370,7 +430,7 @@ typedef struct history_vtable_t
{
svn_error_t *(*prev)(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history, svn_boolean_t cross_copies,
- apr_pool_t *pool);
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool);
svn_error_t *(*location)(const char **path, svn_revnum_t *revision,
svn_fs_history_t *history, apr_pool_t *pool);
} history_vtable_t;
@@ -378,8 +438,10 @@ typedef struct history_vtable_t
typedef struct id_vtable_t
{
- svn_string_t *(*unparse)(const svn_fs_id_t *id, apr_pool_t *pool);
- int (*compare)(const svn_fs_id_t *a, const svn_fs_id_t *b);
+ svn_string_t *(*unparse)(const svn_fs_id_t *id,
+ apr_pool_t *pool);
+ svn_fs_node_relation_t (*compare)(const svn_fs_id_t *a,
+ const svn_fs_id_t *b);
} id_vtable_t;
@@ -390,6 +452,8 @@ typedef struct id_vtable_t
in the 'flags' argument to svn_fs_lock(). */
#define SVN_FS__PROP_TXN_CHECK_LOCKS SVN_PROP_PREFIX "check-locks"
#define SVN_FS__PROP_TXN_CHECK_OOD SVN_PROP_PREFIX "check-ood"
+/* Set to "0" at the start of the txn, to "1" when svn:date changes. */
+#define SVN_FS__PROP_TXN_CLIENT_DATE SVN_PROP_PREFIX "client-date"
struct svn_fs_t
{
@@ -487,12 +551,18 @@ struct svn_fs_access_t
const char *username;
/* A collection of lock-tokens supplied by the fs caller.
- Hash maps (const char *) UUID --> (void *) 1
+ Hash maps (const char *) UUID --> path where path can be the
+ magic value (void *) 1 if no path was specified.
fs functions should really only be interested whether a UUID
exists as a hash key at all; the value is irrelevant. */
apr_hash_t *lock_tokens;
};
+struct svn_fs_lock_target_t
+{
+ const char *token;
+ svn_revnum_t current_rev;
+};
#ifdef __cplusplus
diff --git a/subversion/libsvn_fs/libsvn_fs.pc.in b/subversion/libsvn_fs/libsvn_fs.pc.in
new file mode 100644
index 0000000..67154f0
--- /dev/null
+++ b/subversion/libsvn_fs/libsvn_fs.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_fs
+Description: Subversion Repository Filesystem Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_fs_util libsvn_delta libsvn_subr
+Libs: -L${libdir} -lsvn_fs
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_fs_base/bdb/changes-table.c b/subversion/libsvn_fs_base/bdb/changes-table.c
index 80ff468..b206318 100644
--- a/subversion/libsvn_fs_base/bdb/changes-table.c
+++ b/subversion/libsvn_fs_base/bdb/changes-table.c
@@ -121,12 +121,32 @@ svn_fs_bdb__changes_delete(svn_fs_t *fs,
return SVN_NO_ERROR;
}
+/* Return a deep FS API type copy of SOURCE in internal format and allocate
+ * the result in RESULT_POOL.
+ */
+static svn_fs_path_change2_t *
+change_to_fs_change(const change_t *change,
+ apr_pool_t *result_pool)
+{
+ svn_fs_path_change2_t *result = svn_fs__path_change_create_internal(
+ svn_fs_base__id_copy(change->noderev_id,
+ result_pool),
+ change->kind,
+ result_pool);
+ result->text_mod = change->text_mod;
+ result->prop_mod = change->prop_mod;
+ result->node_kind = svn_node_unknown;
+ result->copyfrom_known = FALSE;
+
+ return result;
+}
/* Merge the internal-use-only CHANGE into a hash of public-FS
svn_fs_path_change2_t CHANGES, collapsing multiple changes into a
single succinct change per path. */
static svn_error_t *
fold_change(apr_hash_t *changes,
+ apr_hash_t *deletions,
const change_t *change)
{
apr_pool_t *pool = apr_hash_pool_get(changes);
@@ -185,7 +205,7 @@ fold_change(apr_hash_t *changes,
case svn_fs_path_change_reset:
/* A reset here will simply remove the path change from the
hash. */
- old_change = NULL;
+ new_change = NULL;
break;
case svn_fs_path_change_delete:
@@ -194,14 +214,21 @@ fold_change(apr_hash_t *changes,
/* If the path was introduced in this transaction via an
add, and we are deleting it, just remove the path
altogether. */
- old_change = NULL;
+ new_change = NULL;
+ }
+ else if (old_change->change_kind == svn_fs_path_change_replace)
+ {
+ /* A deleting a 'replace' restore the original deletion. */
+ new_change = svn_hash_gets(deletions, path);
+ SVN_ERR_ASSERT(new_change);
}
else
{
/* A deletion overrules all previous changes. */
- old_change->change_kind = svn_fs_path_change_delete;
- old_change->text_mod = change->text_mod;
- old_change->prop_mod = change->prop_mod;
+ new_change = old_change;
+ new_change->change_kind = svn_fs_path_change_delete;
+ new_change->text_mod = change->text_mod;
+ new_change->prop_mod = change->prop_mod;
}
break;
@@ -209,38 +236,33 @@ fold_change(apr_hash_t *changes,
case svn_fs_path_change_replace:
/* An add at this point must be following a previous delete,
so treat it just like a replace. */
- old_change->change_kind = svn_fs_path_change_replace;
- old_change->node_rev_id = svn_fs_base__id_copy(change->noderev_id,
- pool);
- old_change->text_mod = change->text_mod;
- old_change->prop_mod = change->prop_mod;
+
+ new_change = change_to_fs_change(change, pool);
+ new_change->change_kind = svn_fs_path_change_replace;
+
+ /* Remember the original deletion.
+ * Make sure to allocate the hash key in a durable pool. */
+ svn_hash_sets(deletions,
+ apr_pstrdup(apr_hash_pool_get(deletions), path),
+ old_change);
break;
case svn_fs_path_change_modify:
default:
+ new_change = old_change;
if (change->text_mod)
- old_change->text_mod = TRUE;
+ new_change->text_mod = TRUE;
if (change->prop_mod)
- old_change->prop_mod = TRUE;
+ new_change->prop_mod = TRUE;
break;
}
-
- /* Point our new_change to our (possibly modified) old_change. */
- new_change = old_change;
}
else
{
/* This change is new to the hash, so make a new public change
structure from the internal one (in the hash's pool), and dup
the path into the hash's pool, too. */
- new_change = svn_fs__path_change_create_internal(
- svn_fs_base__id_copy(change->noderev_id, pool),
- change->kind,
- pool);
- new_change->text_mod = change->text_mod;
- new_change->prop_mod = change->prop_mod;
- new_change->node_kind = svn_node_unknown;
- new_change->copyfrom_known = FALSE;
+ new_change = change_to_fs_change(change, pool);
path = apr_pstrdup(pool, change->path);
}
@@ -265,6 +287,8 @@ svn_fs_bdb__changes_fetch(apr_hash_t **changes_p,
svn_error_t *err = SVN_NO_ERROR;
apr_hash_t *changes = apr_hash_make(pool);
apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_hash_t *deletions = apr_hash_make(subpool);
/* Get a cursor on the first record matching KEY, and then loop over
the records, adding them to the return array. */
@@ -286,11 +310,11 @@ svn_fs_bdb__changes_fetch(apr_hash_t **changes_p,
svn_skel_t *result_skel;
/* Clear the per-iteration subpool. */
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
/* RESULT now contains a change record associated with KEY. We
need to parse that skel into an change_t structure ... */
- result_skel = svn_skel__parse(result.data, result.size, subpool);
+ result_skel = svn_skel__parse(result.data, result.size, iterpool);
if (! result_skel)
{
err = svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
@@ -298,12 +322,12 @@ svn_fs_bdb__changes_fetch(apr_hash_t **changes_p,
key);
goto cleanup;
}
- err = svn_fs_base__parse_change_skel(&change, result_skel, subpool);
+ err = svn_fs_base__parse_change_skel(&change, result_skel, iterpool);
if (err)
goto cleanup;
/* ... and merge it with our return hash. */
- err = fold_change(changes, change);
+ err = fold_change(changes, deletions, change);
if (err)
goto cleanup;
@@ -319,7 +343,7 @@ svn_fs_bdb__changes_fetch(apr_hash_t **changes_p,
{
apr_hash_index_t *hi;
- for (hi = apr_hash_first(subpool, changes);
+ for (hi = apr_hash_first(iterpool, changes);
hi;
hi = apr_hash_next(hi))
{
@@ -347,6 +371,7 @@ svn_fs_bdb__changes_fetch(apr_hash_t **changes_p,
}
/* Destroy the per-iteration subpool. */
+ svn_pool_destroy(iterpool);
svn_pool_destroy(subpool);
/* If there are no (more) change records for this KEY, we're
diff --git a/subversion/libsvn_fs_base/bdb/locks-table.c b/subversion/libsvn_fs_base/bdb/locks-table.c
index a22663f..e81bca8 100644
--- a/subversion/libsvn_fs_base/bdb/locks-table.c
+++ b/subversion/libsvn_fs_base/bdb/locks-table.c
@@ -257,7 +257,7 @@ svn_fs_bdb__locks_get(svn_fs_t *fs,
DB_SET_RANGE);
if (!svn_fspath__is_root(path, strlen(path)))
- lookup_path = apr_pstrcat(pool, path, "/", (char *)NULL);
+ lookup_path = apr_pstrcat(pool, path, "/", SVN_VA_NULL);
lookup_len = strlen(lookup_path);
/* As long as the prefix of the returned KEY matches LOOKUP_PATH we
diff --git a/subversion/libsvn_fs_base/bdb/strings-table.c b/subversion/libsvn_fs_base/bdb/strings-table.c
index f5348e7..e1f4b90 100644
--- a/subversion/libsvn_fs_base/bdb/strings-table.c
+++ b/subversion/libsvn_fs_base/bdb/strings-table.c
@@ -236,9 +236,9 @@ svn_fs_bdb__string_read(svn_fs_t *fs,
{
svn_fs_base__clear_dbt(&result);
result.data = buf + bytes_read;
- result.ulen = *len - bytes_read;
+ result.ulen = (u_int32_t)(*len - bytes_read);
result.doff = (u_int32_t)offset;
- result.dlen = *len - bytes_read;
+ result.dlen = result.ulen;
result.flags |= (DB_DBT_USERMEM | DB_DBT_PARTIAL);
db_err = svn_bdb_dbc_get(cursor, &query, &result, DB_CURRENT);
if (db_err)
diff --git a/subversion/libsvn_fs_base/dag.c b/subversion/libsvn_fs_base/dag.c
index 510ccbb..7c79dc2 100644
--- a/subversion/libsvn_fs_base/dag.c
+++ b/subversion/libsvn_fs_base/dag.c
@@ -1028,12 +1028,14 @@ svn_fs_base__dag_delete_if_mutable(svn_fs_t *fs,
void *val;
svn_fs_dirent_t *dirent;
+ svn_pool_clear(subpool);
apr_hash_this(hi, NULL, NULL, &val);
dirent = val;
SVN_ERR(svn_fs_base__dag_delete_if_mutable(fs, dirent->id,
txn_id, trail,
subpool));
}
+ svn_pool_destroy(subpool);
}
}
@@ -1342,7 +1344,7 @@ svn_fs_base__dag_finalize_edits(dag_node_t *file,
dag_node_t *
-svn_fs_base__dag_dup(dag_node_t *node,
+svn_fs_base__dag_dup(const dag_node_t *node,
apr_pool_t *pool)
{
/* Allocate our new node. */
@@ -1579,10 +1581,10 @@ svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
apr_pool_t *pool)
{
revision_t revision;
- svn_string_t date;
apr_hash_t *txnprops;
svn_fs_t *fs = txn->fs;
const char *txn_id = txn->id;
+ const svn_string_t *client_date;
/* Remove any temporary transaction properties initially created by
begin_txn(). */
@@ -1601,16 +1603,27 @@ svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
SVN_ERR(svn_fs_base__set_txn_prop
(fs, txn_id, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL, trail, pool));
+ client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
+ if (client_date)
+ SVN_ERR(svn_fs_base__set_txn_prop
+ (fs, txn_id, SVN_FS__PROP_TXN_CLIENT_DATE, NULL, trail, pool));
+
/* Promote the unfinished transaction to a committed one. */
SVN_ERR(svn_fs_base__txn_make_committed(fs, txn_id, *new_rev,
trail, pool));
- /* Set a date on the commit. We wait until now to fetch the date,
- so it's definitely newer than any previous revision's date. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
- return svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
- NULL, &date, trail, pool);
+ if (!client_date || strcmp(client_date->data, "1"))
+ {
+ /* Set a date on the commit if requested. We wait until now to fetch the
+ date, so it's definitely newer than any previous revision's date. */
+ svn_string_t date;
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
+ SVN_ERR(svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
+ NULL, &date, trail, pool));
+ }
+
+ return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_fs_base/dag.h b/subversion/libsvn_fs_base/dag.h
index 4c50c84..fb963ce 100644
--- a/subversion/libsvn_fs_base/dag.h
+++ b/subversion/libsvn_fs_base/dag.h
@@ -82,7 +82,7 @@ svn_error_t *svn_fs_base__dag_get_node(dag_node_t **node,
/* Return a new dag_node_t object referring to the same node as NODE,
allocated in POOL. */
-dag_node_t *svn_fs_base__dag_dup(dag_node_t *node,
+dag_node_t *svn_fs_base__dag_dup(const dag_node_t *node,
apr_pool_t *pool);
diff --git a/subversion/libsvn_fs_base/fs.c b/subversion/libsvn_fs_base/fs.c
index 4ad9e6f..06dfbaf 100644
--- a/subversion/libsvn_fs_base/fs.c
+++ b/subversion/libsvn_fs_base/fs.c
@@ -65,8 +65,6 @@
#include "../libsvn_fs/fs-loader.h"
#include "private/svn_fs_util.h"
-#include "private/svn_subr_private.h"
-
/* Checking for return values, and reporting errors. */
@@ -473,6 +471,59 @@ bdb_write_config(svn_fs_t *fs)
}
static svn_error_t *
+base_bdb_info_format(int *fs_format,
+ svn_version_t **supports_version,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ base_fs_data_t *bfd = fs->fsap_data;
+
+ *fs_format = bfd->format;
+ *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+ (*supports_version)->major = SVN_VER_MAJOR;
+ (*supports_version)->minor = 0;
+ (*supports_version)->patch = 0;
+ (*supports_version)->tag = "";
+
+ switch (bfd->format)
+ {
+ case 1:
+ break;
+ case 2:
+ (*supports_version)->minor = 4;
+ break;
+ case 3:
+ (*supports_version)->minor = 5;
+ break;
+ case 4:
+ (*supports_version)->minor = 6;
+ break;
+#ifdef SVN_DEBUG
+# if SVN_FS_BASE__FORMAT_NUMBER != 4
+# error "Need to add a 'case' statement here"
+# endif
+#endif
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+base_bdb_info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *files = apr_array_make(result_pool, 1, sizeof(const char *));
+ APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path,
+ BDB_CONFIG_FILE,
+ result_pool);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
base_bdb_verify_root(svn_fs_root_t *root,
apr_pool_t *scratch_pool)
{
@@ -509,6 +560,9 @@ static fs_vtable_t fs_vtable = {
svn_fs_base__unlock,
svn_fs_base__get_lock,
svn_fs_base__get_locks,
+ base_bdb_info_format,
+ base_bdb_info_config_files,
+ NULL /* info_fsap */,
base_bdb_verify_root,
base_bdb_freeze,
base_bdb_set_errcall,
@@ -675,7 +729,10 @@ populate_opened_fs(svn_fs_t *fs, apr_pool_t *scratch_pool)
}
static svn_error_t *
-base_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+base_create(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
int format = SVN_FS_BASE__FORMAT_NUMBER;
@@ -684,12 +741,27 @@ base_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
/* See if compatibility with older versions was explicitly requested. */
if (fs->config)
{
- if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE))
- format = 1;
- else if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE))
- format = 2;
- else if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE))
- format = 3;
+ svn_version_t *compatible_version;
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, fs->config,
+ pool));
+
+ /* select format number */
+ switch(compatible_version->minor)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3: format = 1;
+ break;
+
+ case 4: format = 2;
+ break;
+
+ case 5: format = 3;
+ break;
+
+ default:format = SVN_FS_BASE__FORMAT_NUMBER;
+ }
}
/* Create the environment and databases. */
@@ -711,8 +783,8 @@ base_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
return SVN_NO_ERROR;;
error:
- svn_error_clear(cleanup_fs(fs));
- return svn_err;
+ return svn_error_compose_create(svn_err,
+ svn_error_trace(cleanup_fs(fs)));
}
@@ -751,7 +823,10 @@ check_format(int format)
}
static svn_error_t *
-base_open(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+base_open(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
int format;
@@ -796,8 +871,8 @@ base_open(svn_fs_t *fs, const char *path, apr_pool_t *pool,
return SVN_NO_ERROR;
error:
- svn_error_clear(cleanup_fs(fs));
- return svn_err;
+ return svn_error_compose_create(svn_err,
+ svn_error_trace(cleanup_fs(fs)));
}
@@ -834,7 +909,10 @@ bdb_recover(const char *path, svn_boolean_t fatal, apr_pool_t *pool)
}
static svn_error_t *
-base_open_for_recovery(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+base_open_for_recovery(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
/* Just stash the path in the fs pointer - it's all we really need. */
@@ -844,7 +922,14 @@ base_open_for_recovery(svn_fs_t *fs, const char *path, apr_pool_t *pool,
}
static svn_error_t *
-base_upgrade(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+base_upgrade(svn_fs_t *fs,
+ const char *path,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
const char *version_file_path;
@@ -867,6 +952,9 @@ base_upgrade(svn_fs_t *fs, const char *path, apr_pool_t *pool,
/* Bump the format file's stored version number. */
SVN_ERR(svn_io_write_version_file(version_file_path,
SVN_FS_BASE__FORMAT_NUMBER, pool));
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, SVN_FS_BASE__FORMAT_NUMBER,
+ svn_fs_upgrade_format_bumped, pool));
/* Check and see if we need to record the "bump" revision. */
if (old_format_number < SVN_FS_BASE__MIN_FORWARD_DELTAS_FORMAT)
@@ -883,7 +971,7 @@ base_upgrade(svn_fs_t *fs, const char *path, apr_pool_t *pool,
But it's better to use the existing encapsulation of "opening
the filesystem" rather than duplicating (or worse, partially
duplicating) that logic here. */
- SVN_ERR(base_open(fs, path, subpool, common_pool));
+ SVN_ERR(base_open(fs, path, common_pool_lock, subpool, common_pool));
/* Fetch the youngest rev, and record it */
SVN_ERR(svn_fs_base__youngest_rev(&youngest_rev, fs, subpool));
@@ -905,6 +993,7 @@ base_verify(svn_fs_t *fs, const char *path,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
@@ -929,6 +1018,7 @@ base_bdb_pack(svn_fs_t *fs,
void *notify_baton,
svn_cancel_func_t cancel,
void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
@@ -994,7 +1084,7 @@ svn_fs_base__clean_logs(const char *live_path,
{ /* Process unused logs from live area */
int idx;
- apr_pool_t *sub_pool = svn_pool_create(pool);
+ apr_pool_t *subpool = svn_pool_create(pool);
/* Process log files. */
for (idx = 0; idx < logfiles->nelts; idx++)
@@ -1003,9 +1093,9 @@ svn_fs_base__clean_logs(const char *live_path,
const char *live_log_path;
const char *backup_log_path;
- svn_pool_clear(sub_pool);
- live_log_path = svn_dirent_join(live_path, log_file, sub_pool);
- backup_log_path = svn_dirent_join(backup_path, log_file, sub_pool);
+ svn_pool_clear(subpool);
+ live_log_path = svn_dirent_join(live_path, log_file, subpool);
+ backup_log_path = svn_dirent_join(backup_path, log_file, subpool);
{ /* Compare files. No point in using MD5 and wasting CPU cycles as we
got full copies of both logs */
@@ -1022,17 +1112,17 @@ svn_fs_base__clean_logs(const char *live_path,
SVN_ERR(svn_io_files_contents_same_p(&files_match,
live_log_path,
backup_log_path,
- sub_pool));
+ subpool));
/* If log files do not match, go to the next log file. */
if (!files_match)
continue;
}
- SVN_ERR(svn_io_remove_file2(live_log_path, FALSE, sub_pool));
+ SVN_ERR(svn_io_remove_file2(live_log_path, FALSE, subpool));
}
- svn_pool_destroy(sub_pool);
+ svn_pool_destroy(subpool);
}
return SVN_NO_ERROR;
@@ -1201,9 +1291,13 @@ base_hotcopy(svn_fs_t *src_fs,
const char *dest_path,
svn_boolean_t clean_logs,
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 *pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
svn_error_t *err;
u_int32_t pagesize;
@@ -1388,6 +1482,7 @@ base_set_svn_fs_open(svn_fs_t *fs,
svn_error_t *(*svn_fs_open_)(svn_fs_t **,
const char *,
apr_hash_t *,
+ apr_pool_t *,
apr_pool_t *))
{
return SVN_NO_ERROR;
@@ -1409,7 +1504,8 @@ static fs_library_vtable_t library_vtable = {
base_bdb_pack,
base_bdb_logfiles,
svn_fs_base__id_parse,
- base_set_svn_fs_open
+ base_set_svn_fs_open,
+ NULL /* info_fsap_dup */
};
svn_error_t *
@@ -1420,6 +1516,7 @@ svn_fs_base__init(const svn_version_t *loader_version,
{
{ "svn_subr", svn_subr_version },
{ "svn_delta", svn_delta_version },
+ { "svn_fs_util", svn_fs_util__version },
{ NULL, NULL }
};
diff --git a/subversion/libsvn_fs_base/fs.h b/subversion/libsvn_fs_base/fs.h
index 017c898..cc89116 100644
--- a/subversion/libsvn_fs_base/fs.h
+++ b/subversion/libsvn_fs_base/fs.h
@@ -43,7 +43,11 @@ extern "C" {
repository format number, and independent of any other FS back
ends. See the SVN_FS_BASE__MIN_*_FORMAT defines to get a sense of
what changes and features were added in which versions of this
- back-end's format. */
+ back-end's format.
+
+ Note: If you bump this, please update the switch statement in
+ base_create() as well.
+ */
#define SVN_FS_BASE__FORMAT_NUMBER 4
/* Minimum format number that supports representation sharing. This
diff --git a/subversion/libsvn_fs_base/id.c b/subversion/libsvn_fs_base/id.c
index c063d02..a094743 100644
--- a/subversion/libsvn_fs_base/id.c
+++ b/subversion/libsvn_fs_base/id.c
@@ -108,13 +108,14 @@ svn_fs_base__id_check_related(const svn_fs_id_t *a,
}
-int
+svn_fs_node_relation_t
svn_fs_base__id_compare(const svn_fs_id_t *a,
const svn_fs_id_t *b)
{
if (svn_fs_base__id_eq(a, b))
- return 0;
- return (svn_fs_base__id_check_related(a, b) ? 1 : -1);
+ return svn_fs_node_unchanged;
+ return (svn_fs_base__id_check_related(a, b) ? svn_fs_node_common_ancestor
+ : svn_fs_node_unrelated);
}
diff --git a/subversion/libsvn_fs_base/id.h b/subversion/libsvn_fs_base/id.h
index 4cdb45c..9cdc46d 100644
--- a/subversion/libsvn_fs_base/id.h
+++ b/subversion/libsvn_fs_base/id.h
@@ -53,9 +53,9 @@ svn_boolean_t svn_fs_base__id_eq(const svn_fs_id_t *a,
svn_boolean_t svn_fs_base__id_check_related(const svn_fs_id_t *a,
const svn_fs_id_t *b);
-/* Return 0 if A and B are equal, 1 if they are related, -1 otherwise. */
-int svn_fs_base__id_compare(const svn_fs_id_t *a,
- const svn_fs_id_t *b);
+/* Return the noderev relationship between A and B. */
+svn_fs_node_relation_t svn_fs_base__id_compare(const svn_fs_id_t *a,
+ const svn_fs_id_t *b);
/* Create an ID based on NODE_ID, COPY_ID, and TXN_ID, allocated in
POOL. */
diff --git a/subversion/libsvn_fs_base/key-gen.c b/subversion/libsvn_fs_base/key-gen.c
index 411207d..34f0e0f 100644
--- a/subversion/libsvn_fs_base/key-gen.c
+++ b/subversion/libsvn_fs_base/key-gen.c
@@ -39,20 +39,19 @@ void
svn_fs_base__next_key(const char *this, apr_size_t *len, char *next)
{
apr_size_t olen = *len; /* remember the first length */
- int i = olen - 1; /* initial index; we work backwards */
+ apr_size_t i; /* current index */
char c; /* current char */
svn_boolean_t carry = TRUE; /* boolean: do we have a carry or not?
We start with a carry, because we're
incrementing the number, after all. */
- /* Leading zeros are not allowed, except for the string "0". */
- if ((*len > 1) && (this[0] == '0'))
- {
- *len = 0;
- return;
- }
+ /* Empty strings and leading zeros (except for the string "0") are not
+ * allowed. Run our malfunction handler to prevent possible db corruption
+ * from being propagated further. */
+ SVN_ERR_ASSERT_NO_RETURN(olen != 0 && (olen == 1 || this[0] != '0'));
- for (i = (olen - 1); i >= 0; i--)
+ i = olen - 1; /* initial index: we work backwords */
+ while (1729)
{
c = this[i];
@@ -79,6 +78,11 @@ svn_fs_base__next_key(const char *this, apr_size_t *len, char *next)
}
else
next[i] = c;
+
+ if (i == 0)
+ break;
+
+ i--;
}
/* The new length is OLEN, plus 1 if there's a carry out of the
@@ -102,22 +106,6 @@ svn_fs_base__next_key(const char *this, apr_size_t *len, char *next)
}
-int
-svn_fs_base__key_compare(const char *a, const char *b)
-{
- int a_len = strlen(a);
- int b_len = strlen(b);
- int cmp;
-
- if (a_len > b_len)
- return 1;
- if (b_len > a_len)
- return -1;
- cmp = strcmp(a, b);
- return (cmp ? (cmp / abs(cmp)) : 0);
-}
-
-
svn_boolean_t
svn_fs_base__same_keys(const char *a, const char *b)
{
diff --git a/subversion/libsvn_fs_base/key-gen.h b/subversion/libsvn_fs_base/key-gen.h
index e1cd1aa..a0634d3 100644
--- a/subversion/libsvn_fs_base/key-gen.h
+++ b/subversion/libsvn_fs_base/key-gen.h
@@ -78,13 +78,6 @@ extern "C" {
void svn_fs_base__next_key(const char *this, apr_size_t *len, char *next);
-/* Compare two strings A and B as base-36 alphanumeric keys.
- *
- * Return -1, 0, or 1 if A is less than, equal to, or greater than B,
- * respectively.
- */
-int svn_fs_base__key_compare(const char *a, const char *b);
-
/* Compare two strings A and B as base-36 alphanumber keys.
*
* Return TRUE iff both keys are NULL or both keys have the same
diff --git a/subversion/libsvn_fs_base/libsvn_fs_base.pc.in b/subversion/libsvn_fs_base/libsvn_fs_base.pc.in
new file mode 100644
index 0000000..ef44eaf
--- /dev/null
+++ b/subversion/libsvn_fs_base/libsvn_fs_base.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_fs_base
+Description: Subversion Filesystem Base Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr libsvn_fs_util
+Libs: -L${libdir} -lsvn_fs_base @SVN_DB_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_fs_base/lock.c b/subversion/libsvn_fs_base/lock.c
index 79f72cc..1145207 100644
--- a/subversion/libsvn_fs_base/lock.c
+++ b/subversion/libsvn_fs_base/lock.c
@@ -39,6 +39,7 @@
#include "private/svn_fs_util.h"
#include "private/svn_subr_private.h"
#include "private/svn_dep_compat.h"
+#include "revs-txns.h"
/* Add LOCK and its associated LOCK_TOKEN (associated with PATH) as
@@ -70,6 +71,7 @@ delete_lock_and_token(const char *lock_token,
}
+/* The effective arguments for txn_body_lock() below. */
struct lock_args
{
svn_lock_t **lock_p;
@@ -80,9 +82,19 @@ struct lock_args
svn_boolean_t steal_lock;
apr_time_t expiration_date;
svn_revnum_t current_rev;
+ apr_pool_t *result_pool;
};
+/* The body of svn_fs_base__lock(), which see.
+
+ BATON is a 'struct lock_args *' holding the effective arguments.
+ BATON->path is the canonical abspath to lock. Set *BATON->lock_p
+ to the resulting lock. For the other arguments, see
+ svn_fs_lock_many().
+
+ This implements the svn_fs_base__retry_txn() 'body' callback type.
+ */
static svn_error_t *
txn_body_lock(void *baton, trail_t *trail)
{
@@ -91,6 +103,8 @@ txn_body_lock(void *baton, trail_t *trail)
svn_lock_t *existing_lock;
svn_lock_t *lock;
+ *args->lock_p = NULL;
+
SVN_ERR(svn_fs_base__get_path_kind(&kind, args->path, trail, trail->pool));
/* Until we implement directory locks someday, we only allow locks
@@ -194,15 +208,15 @@ txn_body_lock(void *baton, trail_t *trail)
}
/* Create a new lock, and add it to the tables. */
- lock = svn_lock_create(trail->pool);
+ lock = svn_lock_create(args->result_pool);
if (args->token)
- lock->token = apr_pstrdup(trail->pool, args->token);
+ lock->token = apr_pstrdup(args->result_pool, args->token);
else
SVN_ERR(svn_fs_base__generate_lock_token(&(lock->token), trail->fs,
- trail->pool));
- lock->path = apr_pstrdup(trail->pool, args->path);
- lock->owner = apr_pstrdup(trail->pool, trail->fs->access_ctx->username);
- lock->comment = apr_pstrdup(trail->pool, args->comment);
+ args->result_pool));
+ lock->path = args->path; /* Already in result_pool. */
+ lock->owner = apr_pstrdup(args->result_pool, trail->fs->access_ctx->username);
+ lock->comment = apr_pstrdup(args->result_pool, args->comment);
lock->is_dav_comment = args->is_dav_comment;
lock->creation_date = apr_time_now();
lock->expiration_date = args->expiration_date;
@@ -215,31 +229,62 @@ txn_body_lock(void *baton, trail_t *trail)
svn_error_t *
-svn_fs_base__lock(svn_lock_t **lock,
- svn_fs_t *fs,
- const char *path,
- const char *token,
+svn_fs_base__lock(svn_fs_t *fs,
+ apr_hash_t *targets,
const char *comment,
svn_boolean_t is_dav_comment,
apr_time_t expiration_date,
- svn_revnum_t current_rev,
svn_boolean_t steal_lock,
- apr_pool_t *pool)
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- struct lock_args args;
+ apr_hash_index_t *hi;
+ svn_error_t *cb_err = SVN_NO_ERROR;
+ svn_revnum_t youngest_rev = SVN_INVALID_REVNUM;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_base__youngest_rev(&youngest_rev, fs, scratch_pool));
- args.lock_p = lock;
- args.path = svn_fs__canonicalize_abspath(path, pool);
- args.token = token;
- args.comment = comment;
- args.is_dav_comment = is_dav_comment;
- args.steal_lock = steal_lock;
- args.expiration_date = expiration_date;
- args.current_rev = current_rev;
-
- return svn_fs_base__retry_txn(fs, txn_body_lock, &args, FALSE, pool);
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ struct lock_args args;
+ const char *path = apr_hash_this_key(hi);
+ const svn_fs_lock_target_t *target = apr_hash_this_val(hi);
+ svn_lock_t *lock;
+ svn_error_t *err = NULL;
+
+ svn_pool_clear(iterpool);
+ args.lock_p = &lock;
+ args.path = svn_fs__canonicalize_abspath(path, result_pool);
+ args.token = target->token;
+ args.comment = comment;
+ args.is_dav_comment = is_dav_comment;
+ args.steal_lock = steal_lock;
+ args.expiration_date = expiration_date;
+ args.current_rev = target->current_rev;
+ args.result_pool = result_pool;
+
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
+ {
+ if (target->current_rev > youngest_rev)
+ err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ }
+
+ if (!err)
+ err = svn_fs_base__retry_txn(fs, txn_body_lock, &args, TRUE,
+ iterpool);
+ if (!cb_err && lock_callback)
+ cb_err = lock_callback(lock_baton, args.path, lock, err, iterpool);
+ svn_error_clear(err);
+ }
+ svn_pool_destroy(iterpool);
+
+ return svn_error_trace(cb_err);
}
@@ -253,11 +298,12 @@ svn_fs_base__generate_lock_token(const char **token,
generate a URI that matches the DAV RFC. We could change this to
some other URI scheme someday, if we wish. */
*token = apr_pstrcat(pool, "opaquelocktoken:",
- svn_uuid_generate(pool), (char *)NULL);
+ svn_uuid_generate(pool), SVN_VA_NULL);
return SVN_NO_ERROR;
}
+/* The effective arguments for txn_body_unlock() below. */
struct unlock_args
{
const char *path;
@@ -266,6 +312,14 @@ struct unlock_args
};
+/* The body of svn_fs_base__unlock(), which see.
+
+ BATON is a 'struct unlock_args *' holding the effective arguments.
+ BATON->path is the canonical path and BATON->token is the token.
+ For the other arguments, see svn_fs_unlock_many().
+
+ This implements the svn_fs_base__retry_txn() 'body' callback type.
+ */
static svn_error_t *
txn_body_unlock(void *baton, trail_t *trail)
{
@@ -308,19 +362,40 @@ txn_body_unlock(void *baton, trail_t *trail)
svn_error_t *
svn_fs_base__unlock(svn_fs_t *fs,
- const char *path,
- const char *token,
+ apr_hash_t *targets,
svn_boolean_t break_lock,
- apr_pool_t *pool)
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- struct unlock_args args;
+ apr_hash_index_t *hi;
+ svn_error_t *cb_err = SVN_NO_ERROR;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_fs__check_fs(fs, TRUE));
- args.path = svn_fs__canonicalize_abspath(path, pool);
- args.token = token;
- args.break_lock = break_lock;
- return svn_fs_base__retry_txn(fs, txn_body_unlock, &args, TRUE, pool);
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ struct unlock_args args;
+ const char *path = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
+ svn_error_t *err;
+
+ svn_pool_clear(iterpool);
+ args.path = svn_fs__canonicalize_abspath(path, result_pool);
+ args.token = token;
+ args.break_lock = break_lock;
+
+ err = svn_fs_base__retry_txn(fs, txn_body_unlock, &args, TRUE,
+ iterpool);
+ if (!cb_err && lock_callback)
+ cb_err = lock_callback(lock_baton, path, NULL, err, iterpool);
+ svn_error_clear(err);
+ }
+ svn_pool_destroy(iterpool);
+
+ return svn_error_trace(cb_err);
}
@@ -465,8 +540,9 @@ svn_fs_base__get_locks(svn_fs_t *fs,
args.path = svn_fs__canonicalize_abspath(path, pool);
args.depth = depth;
/* Enough for 100+ locks if the comments are small. */
- args.stream = svn_stream__from_spillbuf(4 * 1024 /* blocksize */,
- 64 * 1024 /* maxsize */,
+ args.stream = svn_stream__from_spillbuf(svn_spillbuf__create(4 * 1024 /* blocksize */,
+ 64 * 1024 /* maxsize */,
+ pool),
pool);
SVN_ERR(svn_fs_base__retry_txn(fs, txn_body_get_locks, &args, FALSE, pool));
@@ -495,12 +571,12 @@ svn_fs_base__get_locks(svn_fs_t *fs,
/* Now read that much into a buffer. */
skel_buf = apr_palloc(pool, skel_len + 1);
- SVN_ERR(svn_stream_read(stream, skel_buf, &skel_len));
+ SVN_ERR(svn_stream_read_full(stream, skel_buf, &skel_len));
skel_buf[skel_len] = '\0';
/* Read the extra newline that follows the skel. */
len = 1;
- SVN_ERR(svn_stream_read(stream, &c, &len));
+ SVN_ERR(svn_stream_read_full(stream, &c, &len));
if (c != '\n')
return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL, NULL);
diff --git a/subversion/libsvn_fs_base/lock.h b/subversion/libsvn_fs_base/lock.h
index 603e78c..3a17ce0 100644
--- a/subversion/libsvn_fs_base/lock.h
+++ b/subversion/libsvn_fs_base/lock.h
@@ -33,34 +33,41 @@ extern "C" {
/* These functions implement part of the FS loader library's fs
- vtables. See the public svn_fs.h for docstrings.*/
+ vtables. */
-svn_error_t *svn_fs_base__lock(svn_lock_t **lock,
- svn_fs_t *fs,
- const char *path,
- const char *token,
+/* See svn_fs_lock(), svn_fs_lock_many(). */
+svn_error_t *svn_fs_base__lock(svn_fs_t *fs,
+ apr_hash_t *targets,
const char *comment,
svn_boolean_t is_dav_comment,
apr_time_t expiration_date,
- svn_revnum_t current_rev,
svn_boolean_t steal_lock,
- apr_pool_t *pool);
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+/* See svn_fs_generate_lock_token(). */
svn_error_t *svn_fs_base__generate_lock_token(const char **token,
svn_fs_t *fs,
apr_pool_t *pool);
+/* See svn_fs_unlock(), svn_fs_unlock_many(). */
svn_error_t *svn_fs_base__unlock(svn_fs_t *fs,
- const char *path,
- const char *token,
+ apr_hash_t *targets,
svn_boolean_t break_lock,
- apr_pool_t *pool);
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+/* See svn_fs_get_lock(). */
svn_error_t *svn_fs_base__get_lock(svn_lock_t **lock,
svn_fs_t *fs,
const char *path,
apr_pool_t *pool);
+/* See svn_fs_get_locks2(). */
svn_error_t *
svn_fs_base__get_locks(svn_fs_t *fs,
const char *path,
diff --git a/subversion/libsvn_fs_base/reps-strings.c b/subversion/libsvn_fs_base/reps-strings.c
index 553075d..e88583a 100644
--- a/subversion/libsvn_fs_base/reps-strings.c
+++ b/subversion/libsvn_fs_base/reps-strings.c
@@ -920,7 +920,7 @@ txn_body_read_rep(void *baton, trail_t *trail)
args->rb->md5_checksum)))
return svn_error_create(SVN_ERR_FS_CORRUPT,
svn_checksum_mismatch_err(rep->md5_checksum,
- args->rb->sha1_checksum, trail->pool,
+ args->rb->md5_checksum, trail->pool,
_("MD5 checksum mismatch on representation '%s'"),
args->rb->rep_key),
NULL);
@@ -1224,7 +1224,8 @@ svn_fs_base__rep_contents_read_stream(svn_stream_t **rs_p,
SVN_ERR(rep_read_get_baton(&rb, fs, rep_key, use_trail_for_reads,
trail, pool));
*rs_p = svn_stream_create(rb, pool);
- svn_stream_set_read(*rs_p, rep_read_contents);
+ svn_stream_set_read2(*rs_p, NULL /* only full read support */,
+ rep_read_contents);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_fs_base/revs-txns.c b/subversion/libsvn_fs_base/revs-txns.c
index d218843..f1029f4 100644
--- a/subversion/libsvn_fs_base/revs-txns.c
+++ b/subversion/libsvn_fs_base/revs-txns.c
@@ -574,6 +574,10 @@ svn_fs_base__set_txn_prop(svn_fs_t *fs,
txn->proplist = apr_hash_make(pool);
/* Set the property. */
+ if (svn_hash_gets(txn->proplist, SVN_FS__PROP_TXN_CLIENT_DATE)
+ && !strcmp(name, SVN_PROP_REVISION_DATE))
+ svn_hash_sets(txn->proplist, SVN_FS__PROP_TXN_CLIENT_DATE,
+ svn_string_create("1", pool));
svn_hash_sets(txn->proplist, name, value);
/* Now overwrite the transaction. */
@@ -707,6 +711,34 @@ txn_body_begin_txn(void *baton, trail_t *trail)
SVN_ERR(txn_body_change_txn_prop(&cpargs, trail));
}
+ /* Put a datestamp on the newly created txn, so we always know
+ exactly how old it is. (This will help sysadmins identify
+ long-abandoned txns that may need to be manually removed.) Do
+ this before setting CLIENT_DATE so that it is not recorded as an
+ explicit setting. */
+ {
+ struct change_txn_prop_args cpargs;
+ svn_string_t date;
+ cpargs.fs = trail->fs;
+ cpargs.id = txn_id;
+ cpargs.name = SVN_PROP_REVISION_DATE;
+ date.data = svn_time_to_cstring(apr_time_now(), trail->pool);
+ date.len = strlen(date.data);
+ cpargs.value = &date;
+ SVN_ERR(txn_body_change_txn_prop(&cpargs, trail));
+ }
+
+ if (args->flags & SVN_FS_TXN_CLIENT_DATE)
+ {
+ struct change_txn_prop_args cpargs;
+ cpargs.fs = trail->fs;
+ cpargs.id = txn_id;
+ cpargs.name = SVN_FS__PROP_TXN_CLIENT_DATE;
+ cpargs.value = svn_string_create("0", trail->pool);
+
+ SVN_ERR(txn_body_change_txn_prop(&cpargs, trail));
+ }
+
*args->txn_p = make_txn(trail->fs, txn_id, args->base_rev, trail->pool);
return SVN_NO_ERROR;
}
@@ -722,7 +754,6 @@ svn_fs_base__begin_txn(svn_fs_txn_t **txn_p,
{
svn_fs_txn_t *txn;
struct begin_txn_args args;
- svn_string_t date;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
@@ -733,15 +764,7 @@ svn_fs_base__begin_txn(svn_fs_txn_t **txn_p,
*txn_p = txn;
- /* Put a datestamp on the newly created txn, so we always know
- exactly how old it is. (This will help sysadmins identify
- long-abandoned txns that may need to be manually removed.) When
- a txn is promoted to a revision, this property will be
- automatically overwritten with a revision datestamp. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
- return svn_fs_base__change_txn_prop(txn, SVN_PROP_REVISION_DATE,
- &date, pool);
+ return SVN_NO_ERROR;
}
@@ -897,7 +920,7 @@ delete_txn_tree(svn_fs_t *fs,
svn_error_t *err;
/* If this sucker isn't mutable, there's nothing to do. */
- if (svn_fs_base__key_compare(svn_fs_base__id_txn_id(id), txn_id) != 0)
+ if (strcmp(svn_fs_base__id_txn_id(id), txn_id) != 0)
return SVN_NO_ERROR;
/* See if the thing has dirents that need to be recursed upon. If
diff --git a/subversion/libsvn_fs_base/tree.c b/subversion/libsvn_fs_base/tree.c
index 046ab5d..924e7c9 100644
--- a/subversion/libsvn_fs_base/tree.c
+++ b/subversion/libsvn_fs_base/tree.c
@@ -543,7 +543,7 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
parent_copy_id = svn_fs_base__id_copy_id(parent_id);
/* Easy out: if this child is already mutable, we have nothing to do. */
- if (svn_fs_base__key_compare(svn_fs_base__id_txn_id(child_id), txn_id) == 0)
+ if (strcmp(svn_fs_base__id_txn_id(child_id), txn_id) == 0)
return SVN_NO_ERROR;
/* If the child and its parent are on the same branch, then the
@@ -560,7 +560,7 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
target of any copy, and therefore must be on the same branch as
its parent. */
if ((strcmp(child_copy_id, "0") == 0)
- || (svn_fs_base__key_compare(child_copy_id, parent_copy_id) == 0))
+ || (strcmp(child_copy_id, parent_copy_id) == 0))
{
*inherit_p = copy_id_inherit_parent;
return SVN_NO_ERROR;
@@ -569,7 +569,8 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
{
copy_t *copy;
SVN_ERR(svn_fs_bdb__get_copy(&copy, fs, child_copy_id, trail, pool));
- if (svn_fs_base__id_compare(copy->dst_noderev_id, child_id) == -1)
+ if ( svn_fs_base__id_compare(copy->dst_noderev_id, child_id)
+ == svn_fs_node_unrelated)
{
*inherit_p = copy_id_inherit_parent;
return SVN_NO_ERROR;
@@ -1027,6 +1028,30 @@ base_node_id(const svn_fs_id_t **id_p,
return SVN_NO_ERROR;
}
+static svn_error_t *
+base_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 *pool)
+{
+ const svn_fs_id_t *id_a, *id_b;
+
+ /* Paths from different repository are never related. */
+ if (root_a->fs != root_b->fs)
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ /* Naive implementation. */
+ SVN_ERR(base_node_id(&id_a, root_a, path_a, pool));
+ SVN_ERR(base_node_id(&id_b, root_b, path_b, pool));
+
+ *relation = svn_fs_base__id_compare(id_a, id_b);
+
+ return SVN_NO_ERROR;
+}
+
struct node_created_rev_args {
svn_revnum_t revision;
@@ -1212,7 +1237,7 @@ base_node_prop(svn_string_t **value_p,
args.propname = propname;
SVN_ERR(svn_fs_base__retry_txn(root->fs, txn_body_node_prop, &args,
FALSE, scratch_pool));
- *value_p = value ? svn_string_dup(value, pool) : NULL;
+ *value_p = svn_string_dup(value, pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
@@ -1260,6 +1285,21 @@ base_node_proplist(apr_hash_t **table_p,
return SVN_NO_ERROR;
}
+static svn_error_t *
+base_node_has_props(svn_boolean_t *has_props,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *props;
+
+ SVN_ERR(base_node_proplist(&props, root, path, scratch_pool));
+
+ *has_props = (0 < apr_hash_count(props));
+
+ return SVN_NO_ERROR;
+}
+
struct change_node_prop_args {
svn_fs_root_t *root;
@@ -1369,6 +1409,7 @@ struct things_changed_args
svn_fs_root_t *root2;
const char *path1;
const char *path2;
+ svn_boolean_t strict;
apr_pool_t *pool;
};
@@ -1378,11 +1419,26 @@ txn_body_props_changed(void *baton, trail_t *trail)
{
struct things_changed_args *args = baton;
dag_node_t *node1, *node2;
+ apr_hash_t *proplist1, *proplist2;
SVN_ERR(get_dag(&node1, args->root1, args->path1, trail, trail->pool));
SVN_ERR(get_dag(&node2, args->root2, args->path2, trail, trail->pool));
- return svn_fs_base__things_different(args->changed_p, NULL,
- node1, node2, trail, trail->pool);
+ SVN_ERR(svn_fs_base__things_different(args->changed_p, NULL,
+ node1, node2, trail, trail->pool));
+
+ /* Is there a potential false positive and do we want to correct it? */
+ if (!args->strict || !*args->changed_p)
+ return SVN_NO_ERROR;
+
+ /* Different representations. They might still have equal contents. */
+ SVN_ERR(svn_fs_base__dag_get_proplist(&proplist1, node1,
+ trail, trail->pool));
+ SVN_ERR(svn_fs_base__dag_get_proplist(&proplist2, node2,
+ trail, trail->pool));
+
+ *args->changed_p = !svn_fs__prop_lists_equal(proplist1, proplist2,
+ trail->pool);
+ return SVN_NO_ERROR;
}
@@ -1392,6 +1448,7 @@ base_props_changed(svn_boolean_t *changed_p,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
+ svn_boolean_t strict,
apr_pool_t *pool)
{
struct things_changed_args args;
@@ -1408,6 +1465,7 @@ base_props_changed(svn_boolean_t *changed_p,
args.path2 = path2;
args.changed_p = changed_p;
args.pool = pool;
+ args.strict = strict;
return svn_fs_base__retry_txn(root1->fs, txn_body_props_changed, &args,
TRUE, pool);
@@ -1561,6 +1619,25 @@ base_dir_entries(apr_hash_t **table_p,
return SVN_NO_ERROR;
}
+static svn_error_t *
+base_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)
+{
+ /* 1:1 copy of entries with no differnce in ordering */
+ apr_hash_index_t *hi;
+ apr_array_header_t *result
+ = apr_array_make(result_pool, apr_hash_count(entries),
+ sizeof(svn_fs_dirent_t *));
+ for (hi = apr_hash_first(scratch_pool, entries); hi; hi = apr_hash_next(hi))
+ APR_ARRAY_PUSH(result, svn_fs_dirent_t *) = apr_hash_this_val(hi);
+
+ *ordered_p = result;
+ return SVN_NO_ERROR;
+}
+
/* Merges and commits. */
@@ -3104,7 +3181,8 @@ txn_body_copy(void *baton,
if ((to_parent_path->node)
&& (svn_fs_base__id_compare(svn_fs_base__dag_get_id(from_node),
svn_fs_base__dag_get_id
- (to_parent_path->node)) == 0))
+ (to_parent_path->node))
+ == svn_fs_node_unchanged))
return SVN_NO_ERROR;
if (! from_root->is_txn_root)
@@ -3292,8 +3370,8 @@ txn_body_copied_from(void *baton, trail_t *trail)
return SVN_NO_ERROR;
/* If NODE's copy-ID is the same as that of its predecessor... */
- if (svn_fs_base__key_compare(svn_fs_base__id_copy_id(node_id),
- svn_fs_base__id_copy_id(pred_id)) != 0)
+ if (strcmp(svn_fs_base__id_copy_id(node_id),
+ svn_fs_base__id_copy_id(pred_id)) != 0)
{
/* ... then NODE was either the target of a copy operation,
a copied subtree item. We examine the actual copy record
@@ -3942,11 +4020,53 @@ txn_body_contents_changed(void *baton, trail_t *trail)
{
struct things_changed_args *args = baton;
dag_node_t *node1, *node2;
+ svn_checksum_t *checksum1, *checksum2;
+ svn_stream_t *stream1, *stream2;
+ svn_boolean_t same;
SVN_ERR(get_dag(&node1, args->root1, args->path1, trail, trail->pool));
SVN_ERR(get_dag(&node2, args->root2, args->path2, trail, trail->pool));
- return svn_fs_base__things_different(NULL, args->changed_p,
- node1, node2, trail, trail->pool);
+ SVN_ERR(svn_fs_base__things_different(NULL, args->changed_p,
+ node1, node2, trail, trail->pool));
+
+ /* Is there a potential false positive and do we want to correct it? */
+ if (!args->strict || !*args->changed_p)
+ return SVN_NO_ERROR;
+
+ /* Different representations. They might still have equal contents. */
+
+ /* Compare MD5 checksums. These should be readily accessible. */
+ SVN_ERR(svn_fs_base__dag_file_checksum(&checksum1, svn_checksum_md5,
+ node1, trail, trail->pool));
+ SVN_ERR(svn_fs_base__dag_file_checksum(&checksum2, svn_checksum_md5,
+ node2, trail, trail->pool));
+
+ /* Different MD5 checksums -> different contents */
+ if (!svn_checksum_match(checksum1, checksum2))
+ return SVN_NO_ERROR;
+
+ /* Paranoia. Compare SHA1 checksums because that's the level of
+ confidence we require for e.g. the working copy. */
+ SVN_ERR(svn_fs_base__dag_file_checksum(&checksum1, svn_checksum_sha1,
+ node1, trail, trail->pool));
+ SVN_ERR(svn_fs_base__dag_file_checksum(&checksum2, svn_checksum_sha1,
+ node2, trail, trail->pool));
+
+ /* Different SHA1 checksums -> different contents */
+ if (checksum1 && checksum2)
+ {
+ *args->changed_p = !svn_checksum_match(checksum1, checksum2);
+ return SVN_NO_ERROR;
+ }
+
+ /* SHA1 checksums are not available for very old reps / repositories. */
+ SVN_ERR(svn_fs_base__dag_get_contents(&stream1, node1, trail, trail->pool));
+ SVN_ERR(svn_fs_base__dag_get_contents(&stream2, node2, trail, trail->pool));
+ SVN_ERR(svn_stream_contents_same2(&same, stream1, stream2, trail->pool));
+
+ /* Now, it's definitive. */
+ *args->changed_p = !same;
+ return SVN_NO_ERROR;
}
@@ -3958,6 +4078,7 @@ base_contents_changed(svn_boolean_t *changed_p,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
+ svn_boolean_t strict,
apr_pool_t *pool)
{
struct things_changed_args args;
@@ -3989,6 +4110,7 @@ base_contents_changed(svn_boolean_t *changed_p,
args.path2 = path2;
args.changed_p = changed_p;
args.pool = pool;
+ args.strict = strict;
return svn_fs_base__retry_txn(root1->fs, txn_body_contents_changed, &args,
TRUE, pool);
@@ -4108,7 +4230,8 @@ static svn_error_t *
base_node_history(svn_fs_history_t **history_p,
svn_fs_root_t *root,
const char *path,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
@@ -4117,15 +4240,16 @@ base_node_history(svn_fs_history_t **history_p,
return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
/* And we require that the path exist in the root. */
- SVN_ERR(base_check_path(&kind, root, path, pool));
+ SVN_ERR(base_check_path(&kind, root, path, scratch_pool));
if (kind == svn_node_none)
return SVN_FS__NOT_FOUND(root, path);
/* Okay, all seems well. Build our history object and return it. */
*history_p = assemble_history(root->fs,
- svn_fs__canonicalize_abspath(path, pool),
+ svn_fs__canonicalize_abspath(path,
+ result_pool),
root->rev, FALSE, NULL,
- SVN_INVALID_REVNUM, pool);
+ SVN_INVALID_REVNUM, result_pool);
return SVN_NO_ERROR;
}
@@ -4298,8 +4422,7 @@ txn_body_history_prev(void *baton, trail_t *trail)
(which is either a real predecessor, or is the node itself
playing the predecessor role to an imaginary mutable successor),
then we need to report a copy. */
- if (svn_fs_base__key_compare(svn_fs_base__id_copy_id(node_id),
- end_copy_id) != 0)
+ if (strcmp(svn_fs_base__id_copy_id(node_id), end_copy_id) != 0)
{
const char *remainder;
dag_node_t *dst_node;
@@ -4376,7 +4499,8 @@ static svn_error_t *
base_history_prev(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history,
svn_boolean_t cross_copies,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_fs_history_t *prev_history = NULL;
base_history_data_t *bhd = history->fsap_data;
@@ -4390,10 +4514,12 @@ base_history_prev(svn_fs_history_t **prev_history_p,
{
if (! bhd->is_interesting)
prev_history = assemble_history(fs, "/", bhd->revision,
- 1, NULL, SVN_INVALID_REVNUM, pool);
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
else if (bhd->revision > 0)
prev_history = assemble_history(fs, "/", bhd->revision - 1,
- 1, NULL, SVN_INVALID_REVNUM, pool);
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
}
else
{
@@ -4407,9 +4533,9 @@ base_history_prev(svn_fs_history_t **prev_history_p,
args.prev_history_p = &prev_history;
args.history = prev_history;
args.cross_copies = cross_copies;
- args.pool = pool;
+ args.pool = result_pool;
SVN_ERR(svn_fs_base__retry_txn(fs, txn_body_history_prev, &args,
- FALSE, pool));
+ FALSE, result_pool));
if (! prev_history)
break;
bhd = prev_history->fsap_data;
@@ -5370,20 +5496,23 @@ static root_vtable_t root_vtable = {
base_check_path,
base_node_history,
base_node_id,
+ base_node_relation,
base_node_created_rev,
base_node_origin_rev,
base_node_created_path,
base_delete_node,
+ base_copy,
+ base_revision_link,
base_copied_from,
base_closest_copy,
base_node_prop,
base_node_proplist,
+ base_node_has_props,
base_change_node_prop,
base_props_changed,
base_dir_entries,
+ base_dir_optimal_order,
base_make_dir,
- base_copy,
- base_revision_link,
base_file_length,
base_file_checksum,
base_file_contents,
diff --git a/subversion/libsvn_fs_fs/cached_data.c b/subversion/libsvn_fs_fs/cached_data.c
new file mode 100644
index 0000000..6581a6c
--- /dev/null
+++ b/subversion/libsvn_fs_fs/cached_data.c
@@ -0,0 +1,3502 @@
+/* cached_data.c --- cached (read) access to FSFS data
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "cached_data.h"
+
+#include <assert.h>
+
+#include "svn_hash.h"
+#include "svn_ctype.h"
+#include "svn_sorts.h"
+#include "private/svn_delta_private.h"
+#include "private/svn_io_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "fs_fs.h"
+#include "id.h"
+#include "index.h"
+#include "low_level.h"
+#include "pack.h"
+#include "util.h"
+#include "temp_serializer.h"
+
+#include "../libsvn_fs/fs-loader.h"
+#include "../libsvn_delta/delta.h" /* for SVN_DELTA_WINDOW_SIZE */
+
+#include "svn_private_config.h"
+
+/* forward-declare. See implementation for the docstring */
+static svn_error_t *
+block_read(void **result,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_uint64_t item_index,
+ svn_fs_fs__revision_file_t *revision_file,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Defined this to enable access logging via dgb__log_access
+#define SVN_FS_FS__LOG_ACCESS
+ */
+
+/* When SVN_FS_FS__LOG_ACCESS has been defined, write a line to console
+ * showing where REVISION, ITEM_INDEX is located in FS and use ITEM to
+ * show details on it's contents if not NULL. To support format 6 and
+ * earlier repos, ITEM_TYPE (SVN_FS_FS__ITEM_TYPE_*) must match ITEM.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * For pre-format7 repos, the display will be restricted.
+ */
+static svn_error_t *
+dbg_log_access(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_uint64_t item_index,
+ void *item,
+ apr_uint32_t item_type,
+ apr_pool_t *scratch_pool)
+{
+ /* no-op if this macro is not defined */
+#ifdef SVN_FS_FS__LOG_ACCESS
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_off_t end_offset = 0;
+ svn_fs_fs__p2l_entry_t *entry = NULL;
+ static const char *types[] = {"<n/a>", "frep ", "drep ", "fprop", "dprop",
+ "node ", "chgs ", "rep "};
+ const char *description = "";
+ const char *type = types[item_type];
+ const char *pack = "";
+ apr_off_t offset;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, revision,
+ scratch_pool));
+
+ /* determine rev / pack file offset */
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, revision, NULL,
+ item_index, scratch_pool));
+
+ /* constructing the pack file description */
+ if (revision < ffd->min_unpacked_rev)
+ pack = apr_psprintf(scratch_pool, "%4ld|",
+ revision / ffd->max_files_per_dir);
+
+ /* construct description if possible */
+ if (item_type == SVN_FS_FS__ITEM_TYPE_NODEREV && item != NULL)
+ {
+ node_revision_t *node = item;
+ const char *data_rep
+ = node->data_rep
+ ? apr_psprintf(scratch_pool, " d=%ld/%" APR_UINT64_T_FMT,
+ node->data_rep->revision,
+ node->data_rep->item_index)
+ : "";
+ const char *prop_rep
+ = node->prop_rep
+ ? apr_psprintf(scratch_pool, " p=%ld/%" APR_UINT64_T_FMT,
+ node->prop_rep->revision,
+ node->prop_rep->item_index)
+ : "";
+ description = apr_psprintf(scratch_pool, "%s (pc=%d%s%s)",
+ node->created_path,
+ node->predecessor_count,
+ data_rep,
+ prop_rep);
+ }
+ else if (item_type == SVN_FS_FS__ITEM_TYPE_ANY_REP)
+ {
+ svn_fs_fs__rep_header_t *header = item;
+ if (header == NULL)
+ description = " (txdelta window)";
+ else if (header->type == svn_fs_fs__rep_plain)
+ description = " PLAIN";
+ else if (header->type == svn_fs_fs__rep_self_delta)
+ description = " DELTA";
+ else
+ description = apr_psprintf(scratch_pool,
+ " DELTA against %ld/%" APR_UINT64_T_FMT,
+ header->base_revision,
+ header->base_item_index);
+ }
+ else if (item_type == SVN_FS_FS__ITEM_TYPE_CHANGES && item != NULL)
+ {
+ apr_array_header_t *changes = item;
+ switch (changes->nelts)
+ {
+ case 0: description = " no change";
+ break;
+ case 1: description = " 1 change";
+ break;
+ default: description = apr_psprintf(scratch_pool, " %d changes",
+ changes->nelts);
+ }
+ }
+
+ /* some info is only available in format7 repos */
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ /* reverse index lookup: get item description in ENTRY */
+ SVN_ERR(svn_fs_fs__p2l_entry_lookup(&entry, fs, rev_file, revision,
+ offset, scratch_pool));
+ if (entry)
+ {
+ /* more details */
+ end_offset = offset + entry->size;
+ type = types[entry->type];
+ }
+
+ /* line output */
+ printf("%5s%4lx:%04lx -%4lx:%04lx %s %7ld %5"APR_UINT64_T_FMT" %s\n",
+ pack, (long)(offset / ffd->block_size),
+ (long)(offset % ffd->block_size),
+ (long)(end_offset / ffd->block_size),
+ (long)(end_offset % ffd->block_size),
+ type, revision, item_index, description);
+ }
+ else
+ {
+ /* reduced logging for format 6 and earlier */
+ printf("%5s%10" APR_UINT64_T_HEX_FMT " %s %7ld %7" APR_UINT64_T_FMT \
+ " %s\n",
+ pack, (apr_uint64_t)(offset), type, revision, item_index,
+ description);
+ }
+
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience wrapper around svn_io_file_aligned_seek, taking filesystem
+ FS instead of a block size. */
+static svn_error_t *
+aligned_seek(svn_fs_t *fs,
+ apr_file_t *file,
+ apr_off_t *buffer_start,
+ apr_off_t offset,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ return svn_error_trace(svn_io_file_aligned_seek(file, ffd->block_size,
+ buffer_start, offset,
+ pool));
+}
+
+/* Open the revision file for revision REV in filesystem FS and store
+ the newly opened file in FILE. Seek to location OFFSET before
+ returning. Perform temporary allocations in POOL. */
+static svn_error_t *
+open_and_seek_revision(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint64_t item,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__revision_file_t *rev_file;
+ apr_off_t offset = -1;
+
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
+
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rev, pool, pool));
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, rev, NULL, item,
+ pool));
+
+ SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, pool));
+
+ *file = rev_file;
+
+ return SVN_NO_ERROR;
+}
+
+/* Open the representation REP for a node-revision in filesystem FS, seek
+ to its position and store the newly opened file in FILE. Perform
+ temporary allocations in POOL. */
+static svn_error_t *
+open_and_seek_transaction(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_pool_t *pool)
+{
+ apr_off_t offset;
+
+ SVN_ERR(svn_fs_fs__open_proto_rev_file(file, fs, &rep->txn_id, pool, pool));
+
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, NULL, SVN_INVALID_REVNUM,
+ &rep->txn_id, rep->item_index, pool));
+ SVN_ERR(aligned_seek(fs, (*file)->file, NULL, offset, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Given a node-id ID, and a representation REP in filesystem FS, open
+ the correct file and seek to the correction location. Store this
+ file in *FILE_P. Perform any allocations in POOL. */
+static svn_error_t *
+open_and_seek_representation(svn_fs_fs__revision_file_t **file_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_pool_t *pool)
+{
+ if (! svn_fs_fs__id_txn_used(&rep->txn_id))
+ return open_and_seek_revision(file_p, fs, rep->revision, rep->item_index,
+ pool);
+ else
+ return open_and_seek_transaction(file_p, fs, rep, pool);
+}
+
+
+
+static svn_error_t *
+err_dangling_id(svn_fs_t *fs, const svn_fs_id_t *id)
+{
+ svn_string_t *id_str = svn_fs_fs__id_unparse(id, fs->pool);
+ return svn_error_createf
+ (SVN_ERR_FS_ID_NOT_FOUND, 0,
+ _("Reference to non-existent node '%s' in filesystem '%s'"),
+ id_str->data, fs->path);
+}
+
+/* Return TRUE, if FS is of a format that supports block-read and the
+ feature has been enabled. */
+static svn_boolean_t
+use_block_read(svn_fs_t *fs)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ return svn_fs_fs__use_log_addressing(fs) && ffd->use_block_read;
+}
+
+/* Get the node-revision for the node ID in FS.
+ Set *NODEREV_P to the new node-revision structure, allocated in POOL.
+ See svn_fs_fs__get_node_revision, which wraps this and adds another
+ error. */
+static svn_error_t *
+get_node_revision_body(node_revision_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_boolean_t is_cached = FALSE;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (svn_fs_fs__id_is_txn(id))
+ {
+ apr_file_t *file;
+
+ /* This is a transaction node-rev. Its storage logic is very
+ different from that of rev / pack files. */
+ err = svn_io_file_open(&file,
+ svn_fs_fs__path_txn_node_rev(fs, id,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool);
+ if (err)
+ {
+ if (APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_clear(err);
+ return svn_error_trace(err_dangling_id(fs, id));
+ }
+
+ return svn_error_trace(err);
+ }
+
+ SVN_ERR(svn_fs_fs__read_noderev(noderev_p,
+ svn_stream_from_aprfile2(file,
+ FALSE,
+ scratch_pool),
+ result_pool, scratch_pool));
+ }
+ else
+ {
+ svn_fs_fs__revision_file_t *revision_file;
+
+ /* noderevs in rev / pack files can be cached */
+ const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
+ pair_cache_key_t key = { 0 };
+ key.revision = rev_item->revision;
+ key.second = rev_item->number;
+
+ /* Not found or not applicable. Try a noderev cache lookup.
+ * If that succeeds, we are done here. */
+ if (ffd->node_revision_cache)
+ {
+ SVN_ERR(svn_cache__get((void **) noderev_p,
+ &is_cached,
+ ffd->node_revision_cache,
+ &key,
+ result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ /* read the data from disk */
+ SVN_ERR(open_and_seek_revision(&revision_file, fs,
+ rev_item->revision,
+ rev_item->number,
+ scratch_pool));
+
+ if (use_block_read(fs))
+ {
+ /* block-read will parse the whole block and will also return
+ the one noderev that we need right now. */
+ SVN_ERR(block_read((void **)noderev_p, fs,
+ rev_item->revision,
+ rev_item->number,
+ revision_file,
+ result_pool,
+ scratch_pool));
+ }
+ else
+ {
+ /* physical addressing mode reading, parsing and caching */
+ SVN_ERR(svn_fs_fs__read_noderev(noderev_p,
+ revision_file->stream,
+ result_pool,
+ scratch_pool));
+
+ /* Workaround issue #4031: is-fresh-txn-root in revision files. */
+ (*noderev_p)->is_fresh_txn_root = FALSE;
+
+ /* The noderev is not in cache, yet. Add it, if caching has been enabled. */
+ if (ffd->node_revision_cache)
+ SVN_ERR(svn_cache__set(ffd->node_revision_cache,
+ &key,
+ *noderev_p,
+ scratch_pool));
+ }
+
+ SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_node_revision(node_revision_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
+
+ svn_error_t *err = get_node_revision_body(noderev_p, fs, id,
+ result_pool, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
+ {
+ svn_string_t *id_string = svn_fs_fs__id_unparse(id, scratch_pool);
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Corrupt node-revision '%s'",
+ id_string->data);
+ }
+
+ SVN_ERR(dbg_log_access(fs,
+ rev_item->revision,
+ rev_item->number,
+ *noderev_p,
+ SVN_FS_FS__ITEM_TYPE_NODEREV,
+ scratch_pool));
+
+ return svn_error_trace(err);
+}
+
+
+/* Given a revision file REV_FILE, opened to REV in FS, find the Node-ID
+ of the header located at OFFSET and store it in *ID_P. Allocate
+ temporary variables from POOL. */
+static svn_error_t *
+get_fs_id_at_offset(svn_fs_id_t **id_p,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_off_t offset,
+ apr_pool_t *pool)
+{
+ node_revision_t *noderev;
+
+ SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, pool));
+ SVN_ERR(svn_fs_fs__read_noderev(&noderev,
+ rev_file->stream,
+ pool, pool));
+
+ /* noderev->id is const, get rid of that */
+ *id_p = svn_fs_fs__id_copy(noderev->id, pool);
+
+ /* assert that the txn_id is REV
+ * (asserting on offset would be harder because we the rev_offset is not
+ * known here) */
+ assert(svn_fs_fs__id_rev(*id_p) == rev);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Given an open revision file REV_FILE in FS for REV, locate the trailer that
+ specifies the offset to the root node-id and to the changed path
+ information. Store the root node offset in *ROOT_OFFSET and the
+ changed path offset in *CHANGES_OFFSET. If either of these
+ pointers is NULL, do nothing with it.
+
+ Allocate temporary variables from POOL. */
+static svn_error_t *
+get_root_changes_offset(apr_off_t *root_offset,
+ apr_off_t *changes_offset,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_off_t rev_offset;
+ apr_seek_where_t seek_relative;
+ svn_stringbuf_t *trailer;
+ char buffer[64];
+ apr_off_t start;
+ apr_off_t end;
+ apr_size_t len;
+
+ /* Determine where to seek to in the file.
+
+ If we've got a pack file, we want to seek to the end of the desired
+ revision. But we don't track that, so we seek to the beginning of the
+ next revision.
+
+ Unless the next revision is in a different file, in which case, we can
+ just seek to the end of the pack file -- just like we do in the
+ non-packed case. */
+ if (rev_file->is_packed && ((rev + 1) % ffd->max_files_per_dir != 0))
+ {
+ SVN_ERR(svn_fs_fs__get_packed_offset(&end, fs, rev + 1, pool));
+ seek_relative = APR_SET;
+ }
+ else
+ {
+ seek_relative = APR_END;
+ end = 0;
+ }
+
+ /* Offset of the revision from the start of the pack file, if applicable. */
+ if (rev_file->is_packed)
+ SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, rev, pool));
+ else
+ rev_offset = 0;
+
+ /* We will assume that the last line containing the two offsets
+ will never be longer than 64 characters. */
+ SVN_ERR(svn_io_file_seek(rev_file->file, seek_relative, &end, pool));
+
+ if (end < sizeof(buffer))
+ {
+ len = (apr_size_t)end;
+ start = 0;
+ }
+ else
+ {
+ len = sizeof(buffer);
+ start = end - sizeof(buffer);
+ }
+
+ /* Read in this last block, from which we will identify the last line. */
+ SVN_ERR(aligned_seek(fs, rev_file->file, NULL, start, pool));
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, buffer, len, NULL, NULL,
+ pool));
+
+ /* Parse the last line. */
+ trailer = svn_stringbuf_ncreate(buffer, len, pool);
+ SVN_ERR(svn_fs_fs__parse_revision_trailer(root_offset,
+ changes_offset,
+ trailer,
+ rev));
+
+ /* return absolute offsets */
+ if (root_offset)
+ *root_offset += rev_offset;
+ if (changes_offset)
+ *changes_offset += rev_offset;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__rev_get_root(svn_fs_id_t **root_id_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, scratch_pool));
+
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ *root_id_p = svn_fs_fs__id_create_root(rev, result_pool);
+ }
+ else
+ {
+ svn_fs_fs__revision_file_t *revision_file;
+ apr_off_t root_offset;
+ svn_fs_id_t *root_id = NULL;
+ svn_boolean_t is_cached;
+
+ SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
+ ffd->rev_root_id_cache, &rev, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev,
+ scratch_pool, scratch_pool));
+ SVN_ERR(get_root_changes_offset(&root_offset, NULL,
+ revision_file, fs, rev,
+ scratch_pool));
+
+ SVN_ERR(get_fs_id_at_offset(&root_id, revision_file, fs, rev,
+ root_offset, result_pool));
+
+ SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
+
+ SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &rev, root_id,
+ scratch_pool));
+
+ *root_id_p = root_id;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Describes a lazily opened rev / pack file. Instances will be shared
+ between multiple instances of rep_state_t. */
+typedef struct shared_file_t
+{
+ /* The opened file. NULL while file is not open, yet. */
+ svn_fs_fs__revision_file_t *rfile;
+
+ /* file system to open the file in */
+ svn_fs_t *fs;
+
+ /* a revision contained in the FILE. Since this file may be shared,
+ that value may be different from REP_STATE_T->REVISION. */
+ svn_revnum_t revision;
+
+ /* pool to use when creating the FILE. This guarantees that the file
+ remains open / valid beyond the respective local context that required
+ the file to be opened eventually. */
+ apr_pool_t *pool;
+} shared_file_t;
+
+/* Represents where in the current svndiff data block each
+ representation is. */
+typedef struct rep_state_t
+{
+ /* shared lazy-open rev/pack file structure */
+ shared_file_t *sfile;
+ /* The txdelta window cache to use or NULL. */
+ svn_cache__t *raw_window_cache;
+ /* Caches raw (unparsed) windows. May be NULL. */
+ svn_cache__t *window_cache;
+ /* Caches un-deltified windows. May be NULL. */
+ svn_cache__t *combined_cache;
+ /* revision containing the representation */
+ svn_revnum_t revision;
+ /* representation's item index in REVISION */
+ apr_uint64_t item_index;
+ /* length of the header at the start of the rep.
+ 0 iff this is rep is stored in a container
+ (i.e. does not have a header) */
+ apr_size_t header_size;
+ apr_off_t start; /* The starting offset for the raw
+ svndiff/plaintext data minus header.
+ -1 if the offset is yet unknown. */
+ apr_off_t current;/* The current offset relative to START. */
+ apr_off_t size; /* The on-disk size of the representation. */
+ int ver; /* If a delta, what svndiff version?
+ -1 for unknown delta version. */
+ int chunk_index; /* number of the window to read */
+} rep_state_t;
+
+/* Simple wrapper around svn_fs_fs__get_file_offset to simplify callers. */
+static svn_error_t *
+get_file_offset(apr_off_t *offset,
+ rep_state_t *rs,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_fs_fs__get_file_offset(offset,
+ rs->sfile->rfile->file,
+ pool));
+}
+
+/* Simple wrapper around svn_io_file_aligned_seek to simplify callers. */
+static svn_error_t *
+rs_aligned_seek(rep_state_t *rs,
+ apr_off_t *buffer_start,
+ apr_off_t offset,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = rs->sfile->fs->fsap_data;
+ return svn_error_trace(svn_io_file_aligned_seek(rs->sfile->rfile->file,
+ ffd->block_size,
+ buffer_start, offset,
+ pool));
+}
+
+/* Open FILE->FILE and FILE->STREAM if they haven't been opened, yet. */
+static svn_error_t*
+auto_open_shared_file(shared_file_t *file)
+{
+ if (file->rfile == NULL)
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&file->rfile, file->fs,
+ file->revision, file->pool,
+ file->pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Set RS->START to the begin of the representation raw in RS->FILE->FILE,
+ if that hasn't been done yet. Use POOL for temporary allocations. */
+static svn_error_t*
+auto_set_start_offset(rep_state_t *rs, apr_pool_t *pool)
+{
+ if (rs->start == -1)
+ {
+ SVN_ERR(svn_fs_fs__item_offset(&rs->start, rs->sfile->fs,
+ rs->sfile->rfile, rs->revision, NULL,
+ rs->item_index, pool));
+ rs->start += rs->header_size;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set RS->VER depending on what is found in the already open RS->FILE->FILE
+ if the diff version is still unknown. Use POOL for temporary allocations.
+ */
+static svn_error_t*
+auto_read_diff_version(rep_state_t *rs, apr_pool_t *pool)
+{
+ if (rs->ver == -1)
+ {
+ char buf[4];
+ SVN_ERR(rs_aligned_seek(rs, NULL, rs->start, pool));
+ SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, buf,
+ sizeof(buf), NULL, NULL, pool));
+
+ /* ### Layering violation */
+ if (! ((buf[0] == 'S') && (buf[1] == 'V') && (buf[2] == 'N')))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed svndiff data in representation"));
+ rs->ver = buf[3];
+
+ rs->chunk_index = 0;
+ rs->current = 4;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* See create_rep_state, which wraps this and adds another error. */
+static svn_error_t *
+create_rep_state_body(rep_state_t **rep_state,
+ svn_fs_fs__rep_header_t **rep_header,
+ shared_file_t **shared_file,
+ representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ rep_state_t *rs = apr_pcalloc(result_pool, sizeof(*rs));
+ svn_fs_fs__rep_header_t *rh;
+ svn_boolean_t is_cached = FALSE;
+ apr_uint64_t estimated_window_storage;
+
+ /* If the hint is
+ * - given,
+ * - refers to a valid revision,
+ * - refers to a packed revision,
+ * - as does the rep we want to read, and
+ * - refers to the same pack file as the rep
+ * we can re-use the same, already open file object
+ */
+ svn_boolean_t reuse_shared_file
+ = shared_file && *shared_file && (*shared_file)->rfile
+ && SVN_IS_VALID_REVNUM((*shared_file)->revision)
+ && (*shared_file)->revision < ffd->min_unpacked_rev
+ && rep->revision < ffd->min_unpacked_rev
+ && ( ((*shared_file)->revision / ffd->max_files_per_dir)
+ == (rep->revision / ffd->max_files_per_dir));
+
+ pair_cache_key_t key;
+ key.revision = rep->revision;
+ key.second = rep->item_index;
+
+ /* continue constructing RS and RA */
+ rs->size = rep->size;
+ rs->revision = rep->revision;
+ rs->item_index = rep->item_index;
+ rs->raw_window_cache = ffd->raw_window_cache;
+ rs->ver = -1;
+ rs->start = -1;
+
+ /* Very long files stored as self-delta will produce a huge number of
+ delta windows. Don't cache them lest we don't thrash the cache.
+ Since we don't know the depth of the delta chain, let's assume, the
+ whole contents get rewritten 3 times.
+ */
+ estimated_window_storage
+ = 4 * ( (rep->expanded_size ? rep->expanded_size : rep->size)
+ + SVN_DELTA_WINDOW_SIZE);
+ estimated_window_storage = MIN(estimated_window_storage, APR_SIZE_MAX);
+
+ rs->window_cache = ffd->txdelta_window_cache
+ && svn_cache__is_cachable(ffd->txdelta_window_cache,
+ (apr_size_t)estimated_window_storage)
+ ? ffd->txdelta_window_cache
+ : NULL;
+ rs->combined_cache = ffd->combined_window_cache
+ && svn_cache__is_cachable(ffd->combined_window_cache,
+ (apr_size_t)estimated_window_storage)
+ ? ffd->combined_window_cache
+ : NULL;
+
+ /* cache lookup, i.e. skip reading the rep header if possible */
+ if (ffd->rep_header_cache && !svn_fs_fs__id_txn_used(&rep->txn_id))
+ SVN_ERR(svn_cache__get((void **) &rh, &is_cached,
+ ffd->rep_header_cache, &key, result_pool));
+
+ /* initialize the (shared) FILE member in RS */
+ if (reuse_shared_file)
+ {
+ rs->sfile = *shared_file;
+ }
+ else
+ {
+ shared_file_t *file = apr_pcalloc(result_pool, sizeof(*file));
+ file->revision = rep->revision;
+ file->pool = result_pool;
+ file->fs = fs;
+ rs->sfile = file;
+
+ /* remember the current file, if suggested by the caller */
+ if (shared_file)
+ *shared_file = file;
+ }
+
+ /* read rep header, if necessary */
+ if (!is_cached)
+ {
+ /* ensure file is open and navigate to the start of rep header */
+ if (reuse_shared_file)
+ {
+ apr_off_t offset;
+
+ /* ... we can re-use the same, already open file object.
+ * This implies that we don't read from a txn.
+ */
+ rs->sfile = *shared_file;
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rs->sfile->rfile,
+ rep->revision, NULL, rep->item_index,
+ scratch_pool));
+ SVN_ERR(rs_aligned_seek(rs, NULL, offset, scratch_pool));
+ }
+ else
+ {
+ /* otherwise, create a new file object. May or may not be
+ * an in-txn file.
+ */
+ SVN_ERR(open_and_seek_representation(&rs->sfile->rfile, fs, rep,
+ result_pool));
+ }
+
+ SVN_ERR(svn_fs_fs__read_rep_header(&rh, rs->sfile->rfile->stream,
+ result_pool, scratch_pool));
+ SVN_ERR(get_file_offset(&rs->start, rs, result_pool));
+
+ /* populate the cache if appropriate */
+ if (! svn_fs_fs__id_txn_used(&rep->txn_id))
+ {
+ if (use_block_read(fs))
+ SVN_ERR(block_read(NULL, fs, rep->revision, rep->item_index,
+ rs->sfile->rfile, result_pool, scratch_pool));
+ else
+ if (ffd->rep_header_cache)
+ SVN_ERR(svn_cache__set(ffd->rep_header_cache, &key, rh,
+ scratch_pool));
+ }
+ }
+
+ /* finalize */
+ SVN_ERR(dbg_log_access(fs, rep->revision, rep->item_index, rh,
+ SVN_FS_FS__ITEM_TYPE_ANY_REP, scratch_pool));
+
+ rs->header_size = rh->header_size;
+ *rep_state = rs;
+ *rep_header = rh;
+
+ if (rh->type == svn_fs_fs__rep_plain)
+ /* This is a plaintext, so just return the current rep_state. */
+ return SVN_NO_ERROR;
+
+ /* skip "SVNx" diff marker */
+ rs->current = 4;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the rep args for REP in filesystem FS and create a rep_state
+ for reading the representation. Return the rep_state in *REP_STATE
+ and the rep header in *REP_HEADER, both allocated in POOL.
+
+ When reading multiple reps, i.e. a skip delta chain, you may provide
+ non-NULL SHARED_FILE. (If SHARED_FILE is not NULL, in the first
+ call it should be a pointer to NULL.) The function will use this
+ variable to store the previous call results and tries to re-use it.
+ This may result in significant savings in I/O for packed files and
+ number of open file handles.
+ */
+static svn_error_t *
+create_rep_state(rep_state_t **rep_state,
+ svn_fs_fs__rep_header_t **rep_header,
+ shared_file_t **shared_file,
+ representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = create_rep_state_body(rep_state, rep_header,
+ shared_file, rep, fs,
+ result_pool, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const char *rep_str;
+
+ /* ### This always returns "-1" for transaction reps, because
+ ### this particular bit of code doesn't know if the rep is
+ ### stored in the protorev or in the mutable area (for props
+ ### or dir contents). It is pretty rare for FSFS to *read*
+ ### from the protorev file, though, so this is probably OK.
+ ### And anyone going to debug corruption errors is probably
+ ### going to jump straight to this comment anyway! */
+ rep_str = rep
+ ? svn_fs_fs__unparse_representation
+ (rep, ffd->format, TRUE, scratch_pool, scratch_pool)->data
+ : "(null)";
+
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Corrupt representation '%s'",
+ rep_str);
+ }
+ /* ### Call representation_string() ? */
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_fs_fs__check_rep(representation_t *rep,
+ svn_fs_t *fs,
+ void **hint,
+ apr_pool_t *scratch_pool)
+{
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ apr_off_t offset;
+ svn_fs_fs__p2l_entry_t *entry;
+ svn_fs_fs__revision_file_t *rev_file = NULL;
+
+ /* Reuse the revision file provided by *HINT, if it is given and
+ * actually the rev / pack file that we want. */
+ svn_revnum_t start_rev = svn_fs_fs__packed_base_rev(fs, rep->revision);
+ if (hint)
+ rev_file = *(svn_fs_fs__revision_file_t **)hint;
+
+ if (rev_file == NULL || rev_file->start_revision != start_rev)
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rep->revision,
+ scratch_pool, scratch_pool));
+
+ if (hint)
+ *hint = rev_file;
+
+ /* This will auto-retry if there was a background pack. */
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, rep->revision,
+ NULL, rep->item_index, scratch_pool));
+
+ /* This may fail if there is a background pack operation (can't auto-
+ retry because the item offset lookup has to be redone as well). */
+ SVN_ERR(svn_fs_fs__p2l_entry_lookup(&entry, fs, rev_file,
+ rep->revision, offset,
+ scratch_pool, scratch_pool));
+
+ if ( entry == NULL
+ || entry->type < SVN_FS_FS__ITEM_TYPE_FILE_REP
+ || entry->type > SVN_FS_FS__ITEM_TYPE_DIR_PROPS)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("No representation found at offset %s "
+ "for item %s in revision %ld"),
+ apr_off_t_toa(scratch_pool, offset),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ rep->item_index),
+ rep->revision);
+ }
+ else
+ {
+ rep_state_t *rs;
+ svn_fs_fs__rep_header_t *rep_header;
+
+ /* ### Should this be using read_rep_line() directly? */
+ SVN_ERR(create_rep_state(&rs, &rep_header, (shared_file_t**)hint,
+ rep, fs, scratch_pool, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__rep_chain_length(int *chain_length,
+ int *shard_count,
+ representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_revnum_t shard_size = ffd->max_files_per_dir
+ ? ffd->max_files_per_dir
+ : 1;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_boolean_t is_delta = FALSE;
+ int count = 0;
+ int shards = 1;
+ svn_revnum_t last_shard = rep->revision / shard_size;
+
+ /* Check whether the length of the deltification chain is acceptable.
+ * Otherwise, shared reps may form a non-skipping delta chain in
+ * extreme cases. */
+ representation_t base_rep = *rep;
+
+ /* re-use open files between iterations */
+ shared_file_t *file_hint = NULL;
+
+ svn_fs_fs__rep_header_t *header;
+
+ /* follow the delta chain towards the end but for at most
+ * MAX_CHAIN_LENGTH steps. */
+ do
+ {
+ rep_state_t *rep_state;
+
+ svn_pool_clear(iterpool);
+
+ if (base_rep.revision / shard_size != last_shard)
+ {
+ last_shard = base_rep.revision / shard_size;
+ ++shards;
+ }
+
+ SVN_ERR(create_rep_state_body(&rep_state,
+ &header,
+ &file_hint,
+ &base_rep,
+ fs,
+ subpool,
+ iterpool));
+
+ base_rep.revision = header->base_revision;
+ base_rep.item_index = header->base_item_index;
+ base_rep.size = header->base_length;
+ svn_fs_fs__id_txn_reset(&base_rep.txn_id);
+ is_delta = header->type == svn_fs_fs__rep_delta;
+
+ /* Clear it the SUBPOOL once in a while. Doing it too frequently
+ * renders the FILE_HINT ineffective. Doing too infrequently, may
+ * leave us with too many open file handles.
+ *
+ * Note that this is mostly about efficiency, with larger values
+ * being more efficient, and any non-zero value is legal here. When
+ * reading deltified contents, we may keep 10s of rev files open at
+ * the same time and the system has to cope with that. Thus, the
+ * limit of 16 chosen below is in the same ballpark.
+ */
+ ++count;
+ if (count % 16 == 0)
+ {
+ file_hint = NULL;
+ svn_pool_clear(subpool);
+ }
+ }
+ while (is_delta && base_rep.revision);
+
+ *chain_length = count;
+ *shard_count = shards;
+ svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+struct rep_read_baton
+{
+ /* The FS from which we're reading. */
+ svn_fs_t *fs;
+
+ /* Representation to read. */
+ representation_t rep;
+
+ /* If not NULL, this is the base for the first delta window in rs_list */
+ svn_stringbuf_t *base_window;
+
+ /* The state of all prior delta representations. */
+ apr_array_header_t *rs_list;
+
+ /* The plaintext state, if there is a plaintext. */
+ rep_state_t *src_state;
+
+ /* The index of the current delta chunk, if we are reading a delta. */
+ int chunk_index;
+
+ /* The buffer where we store undeltified data. */
+ char *buf;
+ apr_size_t buf_pos;
+ apr_size_t buf_len;
+
+ /* A checksum context for summing the data read in order to verify it.
+ Note: we don't need to use the sha1 checksum because we're only doing
+ data verification, for which md5 is perfectly safe. */
+ svn_checksum_ctx_t *md5_checksum_ctx;
+
+ svn_boolean_t checksum_finalized;
+
+ /* The stored checksum of the representation we are reading, its
+ length, and the amount we've read so far. Some of this
+ information is redundant with rs_list and src_state, but it's
+ convenient for the checksumming code to have it here. */
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
+
+ svn_filesize_t len;
+ svn_filesize_t off;
+
+ /* The key for the fulltext cache for this rep, if there is a
+ fulltext cache. */
+ pair_cache_key_t fulltext_cache_key;
+ /* The text we've been reading, if we're going to cache it. */
+ svn_stringbuf_t *current_fulltext;
+
+ /* If not NULL, attempt to read the data from this cache.
+ Once that lookup fails, reset it to NULL. */
+ svn_cache__t *fulltext_cache;
+
+ /* Bytes delivered from the FULLTEXT_CACHE so far. If the next
+ lookup fails, we need to skip that much data from the reconstructed
+ window stream before we continue normal operation. */
+ svn_filesize_t fulltext_delivered;
+
+ /* Used for temporary allocations during the read. */
+ apr_pool_t *pool;
+
+ /* Pool used to store file handles and other data that is persistant
+ for the entire stream read. */
+ apr_pool_t *filehandle_pool;
+};
+
+/* Set window key in *KEY to address the window described by RS.
+ For convenience, return the KEY. */
+static window_cache_key_t *
+get_window_key(window_cache_key_t *key, rep_state_t *rs)
+{
+ assert(rs->revision <= APR_UINT32_MAX);
+ key->revision = (apr_uint32_t)rs->revision;
+ key->item_index = rs->item_index;
+ key->chunk_index = rs->chunk_index;
+
+ return key;
+}
+
+/* Implement svn_cache__partial_getter_func_t for raw txdelta windows.
+ * Parse the raw data and return a svn_fs_fs__txdelta_cached_window_t.
+ */
+static svn_error_t *
+parse_raw_window(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ svn_string_t raw_window;
+ svn_stream_t *stream;
+
+ /* unparsed and parsed window */
+ const svn_fs_fs__raw_cached_window_t *window
+ = (const svn_fs_fs__raw_cached_window_t *)data;
+ svn_fs_fs__txdelta_cached_window_t *result
+ = apr_pcalloc(result_pool, sizeof(*result));
+
+ /* create a read stream taking the raw window as input */
+ raw_window.data = svn_temp_deserializer__ptr(window,
+ (const void * const *)&window->window.data);
+ raw_window.len = window->window.len;
+ stream = svn_stream_from_string(&raw_window, result_pool);
+
+ /* parse it */
+ SVN_ERR(svn_txdelta_read_svndiff_window(&result->window, stream, 1,
+ result_pool));
+
+ /* complete the window and return it */
+ result->end_offset = window->end_offset;
+ *out = result;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Read the WINDOW_P number CHUNK_INDEX for the representation given in
+ * rep state RS from the current FSFS session's cache. This will be a
+ * no-op and IS_CACHED will be set to FALSE if no cache has been given.
+ * If a cache is available IS_CACHED will inform the caller about the
+ * success of the lookup. Allocations of the window in will be made
+ * from RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ *
+ * If the information could be found, put RS to CHUNK_INDEX.
+ */
+static svn_error_t *
+get_cached_window(svn_txdelta_window_t **window_p,
+ rep_state_t *rs,
+ int chunk_index,
+ svn_boolean_t *is_cached,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (! rs->window_cache)
+ {
+ /* txdelta window has not been enabled */
+ *is_cached = FALSE;
+ }
+ else
+ {
+ /* ask the cache for the desired txdelta window */
+ svn_fs_fs__txdelta_cached_window_t *cached_window;
+ window_cache_key_t key = { 0 };
+ get_window_key(&key, rs);
+ key.chunk_index = chunk_index;
+ SVN_ERR(svn_cache__get((void **) &cached_window,
+ is_cached,
+ rs->window_cache,
+ &key,
+ result_pool));
+
+ /* If we did not find a parsed txdelta window, we might have a raw
+ version of it in our cache. If so, read, parse and re-cache it. */
+ if (!*is_cached && rs->raw_window_cache)
+ {
+ SVN_ERR(svn_cache__get_partial((void **) &cached_window, is_cached,
+ rs->raw_window_cache, &key,
+ parse_raw_window, NULL, result_pool));
+ if (*is_cached)
+ SVN_ERR(svn_cache__set(rs->window_cache, &key, cached_window,
+ scratch_pool));
+ }
+
+ /* Return cached information. */
+ if (*is_cached)
+ {
+ /* found it. Pass it back to the caller. */
+ *window_p = cached_window->window;
+
+ /* manipulate the RS as if we just read the data */
+ rs->current = cached_window->end_offset;
+ rs->chunk_index = chunk_index;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Store the WINDOW read for the rep state RS in the current FSFS
+ * session's cache. This will be a no-op if no cache has been given.
+ * Temporary allocations will be made from SCRATCH_POOL. */
+static svn_error_t *
+set_cached_window(svn_txdelta_window_t *window,
+ rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->window_cache)
+ {
+ /* store the window and the first offset _past_ it */
+ svn_fs_fs__txdelta_cached_window_t cached_window;
+ window_cache_key_t key = {0};
+
+ cached_window.window = window;
+ cached_window.end_offset = rs->current;
+
+ /* but key it with the start offset because that is the known state
+ * when we will look it up */
+ SVN_ERR(svn_cache__set(rs->window_cache,
+ get_window_key(&key, rs),
+ &cached_window,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the WINDOW_P for the rep state RS from the current FSFS session's
+ * cache. This will be a no-op and IS_CACHED will be set to FALSE if no
+ * cache has been given. If a cache is available IS_CACHED will inform
+ * the caller about the success of the lookup. Allocations (of the window
+ * in particular) will be made from POOL.
+ */
+static svn_error_t *
+get_cached_combined_window(svn_stringbuf_t **window_p,
+ rep_state_t *rs,
+ svn_boolean_t *is_cached,
+ apr_pool_t *pool)
+{
+ if (! rs->combined_cache)
+ {
+ /* txdelta window has not been enabled */
+ *is_cached = FALSE;
+ }
+ else
+ {
+ /* ask the cache for the desired txdelta window */
+ window_cache_key_t key = { 0 };
+ return svn_cache__get((void **)window_p,
+ is_cached,
+ rs->combined_cache,
+ get_window_key(&key, rs),
+ pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Store the WINDOW read for the rep state RS in the current FSFS session's
+ * cache. This will be a no-op if no cache has been given.
+ * Temporary allocations will be made from SCRATCH_POOL. */
+static svn_error_t *
+set_cached_combined_window(svn_stringbuf_t *window,
+ rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->combined_cache)
+ {
+ /* but key it with the start offset because that is the known state
+ * when we will look it up */
+ window_cache_key_t key = { 0 };
+ return svn_cache__set(rs->combined_cache,
+ get_window_key(&key, rs),
+ window,
+ scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Build an array of rep_state structures in *LIST giving the delta
+ reps from first_rep to a plain-text or self-compressed rep. Set
+ *SRC_STATE to the plain-text rep we find at the end of the chain,
+ or to NULL if the final delta representation is self-compressed.
+ The representation to start from is designated by filesystem FS, id
+ ID, and representation REP.
+ Also, set *WINDOW_P to the base window content for *LIST, if it
+ could be found in cache. Otherwise, *LIST will contain the base
+ representation for the whole delta chain.
+ Finally, return the expanded size of the representation in
+ *EXPANDED_SIZE. It will take care of cases where only the on-disk
+ size is known. */
+static svn_error_t *
+build_rep_list(apr_array_header_t **list,
+ svn_stringbuf_t **window_p,
+ rep_state_t **src_state,
+ svn_filesize_t *expanded_size,
+ svn_fs_t *fs,
+ representation_t *first_rep,
+ apr_pool_t *pool)
+{
+ representation_t rep;
+ rep_state_t *rs = NULL;
+ svn_fs_fs__rep_header_t *rep_header;
+ svn_boolean_t is_cached = FALSE;
+ shared_file_t *shared_file = NULL;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ *list = apr_array_make(pool, 1, sizeof(rep_state_t *));
+ rep = *first_rep;
+
+ /* The value as stored in the data struct.
+ 0 is either for unknown length or actually zero length. */
+ *expanded_size = first_rep->expanded_size;
+
+ /* for the top-level rep, we need the rep_args */
+ SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file, &rep, fs, pool,
+ iterpool));
+
+ /* Unknown size or empty representation?
+ That implies the this being the first iteration.
+ Usually size equals on-disk size, except for empty,
+ compressed representations (delta, size = 4).
+ Please note that for all non-empty deltas have
+ a 4-byte header _plus_ some data. */
+ if (*expanded_size == 0)
+ if (rep_header->type == svn_fs_fs__rep_plain || first_rep->size != 4)
+ *expanded_size = first_rep->size;
+
+ while (1)
+ {
+ svn_pool_clear(iterpool);
+
+ /* fetch state, if that has not been done already */
+ if (!rs)
+ SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file,
+ &rep, fs, pool, iterpool));
+
+ /* for txn reps, there won't be a cached combined window */
+ if (!svn_fs_fs__id_txn_used(&rep.txn_id))
+ SVN_ERR(get_cached_combined_window(window_p, rs, &is_cached, pool));
+
+ if (is_cached)
+ {
+ /* We already have a reconstructed window in our cache.
+ Write a pseudo rep_state with the full length. */
+ rs->start = 0;
+ rs->current = 0;
+ rs->size = (*window_p)->len;
+ *src_state = rs;
+ break;
+ }
+
+ if (rep_header->type == svn_fs_fs__rep_plain)
+ {
+ /* This is a plaintext, so just return the current rep_state. */
+ *src_state = rs;
+ break;
+ }
+
+ /* Push this rep onto the list. If it's self-compressed, we're done. */
+ APR_ARRAY_PUSH(*list, rep_state_t *) = rs;
+ if (rep_header->type == svn_fs_fs__rep_self_delta)
+ {
+ *src_state = NULL;
+ break;
+ }
+
+ rep.revision = rep_header->base_revision;
+ rep.item_index = rep_header->base_item_index;
+ rep.size = rep_header->base_length;
+ svn_fs_fs__id_txn_reset(&rep.txn_id);
+
+ rs = NULL;
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Create a rep_read_baton structure for node revision NODEREV in
+ filesystem FS and store it in *RB_P. Perform all allocations in
+ POOL. If rep is mutable, it must be for file contents. */
+static svn_error_t *
+rep_read_get_baton(struct rep_read_baton **rb_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ pair_cache_key_t fulltext_cache_key,
+ apr_pool_t *pool)
+{
+ struct rep_read_baton *b;
+
+ b = apr_pcalloc(pool, sizeof(*b));
+ b->fs = fs;
+ b->rep = *rep;
+ b->base_window = NULL;
+ b->chunk_index = 0;
+ b->buf = NULL;
+ b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+ b->checksum_finalized = FALSE;
+ memcpy(b->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
+ b->len = rep->expanded_size;
+ b->off = 0;
+ b->fulltext_cache_key = fulltext_cache_key;
+ b->pool = svn_pool_create(pool);
+ b->filehandle_pool = svn_pool_create(pool);
+ b->fulltext_cache = NULL;
+ b->fulltext_delivered = 0;
+ b->current_fulltext = NULL;
+
+ /* Save our output baton. */
+ *rb_p = b;
+
+ return SVN_NO_ERROR;
+}
+
+/* Skip forwards to THIS_CHUNK in REP_STATE and then read the next delta
+ window into *NWIN. Note that RS->CHUNK_INDEX will be THIS_CHUNK rather
+ than THIS_CHUNK + 1 when this function returns. */
+static svn_error_t *
+read_delta_window(svn_txdelta_window_t **nwin, int this_chunk,
+ rep_state_t *rs, apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t is_cached;
+ apr_off_t start_offset;
+ apr_off_t end_offset;
+ apr_pool_t *iterpool;
+
+ SVN_ERR_ASSERT(rs->chunk_index <= this_chunk);
+
+ SVN_ERR(dbg_log_access(rs->sfile->fs, rs->revision, rs->item_index,
+ NULL, SVN_FS_FS__ITEM_TYPE_ANY_REP, scratch_pool));
+
+ /* Read the next window. But first, try to find it in the cache. */
+ SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
+ result_pool, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* someone has to actually read the data from file. Open it */
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+
+ /* invoke the 'block-read' feature for non-txn data.
+ However, don't do that if we are in the middle of some representation,
+ because the block is unlikely to contain other data. */
+ if ( rs->chunk_index == 0
+ && SVN_IS_VALID_REVNUM(rs->revision)
+ && use_block_read(rs->sfile->fs)
+ && rs->raw_window_cache)
+ {
+ SVN_ERR(block_read(NULL, rs->sfile->fs, rs->revision, rs->item_index,
+ rs->sfile->rfile, result_pool, scratch_pool));
+
+ /* reading the whole block probably also provided us with the
+ desired txdelta window */
+ SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
+ result_pool, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ /* data is still not cached -> we need to read it.
+ Make sure we have all the necessary info. */
+ SVN_ERR(auto_set_start_offset(rs, scratch_pool));
+ SVN_ERR(auto_read_diff_version(rs, scratch_pool));
+
+ /* RS->FILE may be shared between RS instances -> make sure we point
+ * to the right data. */
+ start_offset = rs->start + rs->current;
+ SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, scratch_pool));
+
+ /* Skip windows to reach the current chunk if we aren't there yet. */
+ iterpool = svn_pool_create(scratch_pool);
+ while (rs->chunk_index < this_chunk)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_txdelta_skip_svndiff_window(rs->sfile->rfile->file,
+ rs->ver, iterpool));
+ rs->chunk_index++;
+ SVN_ERR(get_file_offset(&start_offset, rs, iterpool));
+ rs->current = start_offset - rs->start;
+ if (rs->current >= rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read "
+ "beyond the end of the "
+ "representation"));
+ }
+ svn_pool_destroy(iterpool);
+
+ /* Actually read the next window. */
+ SVN_ERR(svn_txdelta_read_svndiff_window(nwin, rs->sfile->rfile->stream,
+ rs->ver, result_pool));
+ SVN_ERR(get_file_offset(&end_offset, rs, scratch_pool));
+ rs->current = end_offset - rs->start;
+ if (rs->current > rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read beyond "
+ "the end of the representation"));
+
+ /* the window has not been cached before, thus cache it now
+ * (if caching is used for them at all) */
+ if (SVN_IS_VALID_REVNUM(rs->revision))
+ SVN_ERR(set_cached_window(*nwin, rs, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read SIZE bytes from the representation RS and return it in *NWIN. */
+static svn_error_t *
+read_plain_window(svn_stringbuf_t **nwin, rep_state_t *rs,
+ apr_size_t size, apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset;
+
+ /* RS->FILE may be shared between RS instances -> make sure we point
+ * to the right data. */
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+ SVN_ERR(auto_set_start_offset(rs, scratch_pool));
+
+ offset = rs->start + rs->current;
+ SVN_ERR(rs_aligned_seek(rs, NULL, offset, scratch_pool));
+
+ /* Read the plain data. */
+ *nwin = svn_stringbuf_create_ensure(size, result_pool);
+ SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, (*nwin)->data, size,
+ NULL, NULL, result_pool));
+ (*nwin)->data[size] = 0;
+
+ /* Update RS. */
+ rs->current += (apr_off_t)size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Skip SIZE bytes from the PLAIN representation RS. */
+static svn_error_t *
+skip_plain_window(rep_state_t *rs,
+ apr_size_t size)
+{
+ /* Update RS. */
+ rs->current += (apr_off_t)size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Get the undeltified window that is a result of combining all deltas
+ from the current desired representation identified in *RB with its
+ base representation. Store the window in *RESULT. */
+static svn_error_t *
+get_combined_window(svn_stringbuf_t **result,
+ struct rep_read_baton *rb)
+{
+ apr_pool_t *pool, *new_pool, *window_pool;
+ int i;
+ apr_array_header_t *windows;
+ svn_stringbuf_t *source, *buf = rb->base_window;
+ rep_state_t *rs;
+ apr_pool_t *iterpool;
+
+ /* Read all windows that we need to combine. This is fine because
+ the size of each window is relatively small (100kB) and skip-
+ delta limits the number of deltas in a chain to well under 100.
+ Stop early if one of them does not depend on its predecessors. */
+ window_pool = svn_pool_create(rb->pool);
+ windows = apr_array_make(window_pool, 0, sizeof(svn_txdelta_window_t *));
+ iterpool = svn_pool_create(rb->pool);
+ for (i = 0; i < rb->rs_list->nelts; ++i)
+ {
+ svn_txdelta_window_t *window;
+
+ svn_pool_clear(iterpool);
+
+ rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
+ SVN_ERR(read_delta_window(&window, rb->chunk_index, rs, window_pool,
+ iterpool));
+
+ APR_ARRAY_PUSH(windows, svn_txdelta_window_t *) = window;
+ if (window->src_ops == 0)
+ {
+ ++i;
+ break;
+ }
+ }
+
+ /* Combine in the windows from the other delta reps. */
+ pool = svn_pool_create(rb->pool);
+ for (--i; i >= 0; --i)
+ {
+ svn_txdelta_window_t *window;
+
+ svn_pool_clear(iterpool);
+
+ rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
+ window = APR_ARRAY_IDX(windows, i, svn_txdelta_window_t *);
+
+ /* Maybe, we've got a PLAIN start representation. If we do, read
+ as much data from it as the needed for the txdelta window's source
+ view.
+ Note that BUF / SOURCE may only be NULL in the first iteration.
+ Also note that we may have short-cut reading the delta chain --
+ in which case SRC_OPS is 0 and it might not be a PLAIN rep. */
+ source = buf;
+ if (source == NULL && rb->src_state != NULL)
+ {
+ /* Even if we don't need the source rep now, we still must keep
+ * its read offset in sync with what we might need for the next
+ * window. */
+ if (window->src_ops)
+ SVN_ERR(read_plain_window(&source, rb->src_state,
+ window->sview_len,
+ pool, iterpool));
+ else
+ SVN_ERR(skip_plain_window(rb->src_state, window->sview_len));
+ }
+
+ /* Combine this window with the current one. */
+ new_pool = svn_pool_create(rb->pool);
+ buf = svn_stringbuf_create_ensure(window->tview_len, new_pool);
+ buf->len = window->tview_len;
+
+ svn_txdelta_apply_instructions(window, source ? source->data : NULL,
+ buf->data, &buf->len);
+ if (buf->len != window->tview_len)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("svndiff window length is "
+ "corrupt"));
+
+ /* Cache windows only if the whole rep content could be read as a
+ single chunk. Only then will no other chunk need a deeper RS
+ list than the cached chunk. */
+ if ( (rb->chunk_index == 0) && (rs->current == rs->size)
+ && SVN_IS_VALID_REVNUM(rs->revision))
+ SVN_ERR(set_cached_combined_window(buf, rs, new_pool));
+
+ rs->chunk_index++;
+
+ /* Cycle pools so that we only need to hold three windows at a time. */
+ svn_pool_destroy(pool);
+ pool = new_pool;
+ }
+ svn_pool_destroy(iterpool);
+
+ svn_pool_destroy(window_pool);
+
+ *result = buf;
+ return SVN_NO_ERROR;
+}
+
+/* Returns whether or not the expanded fulltext of the file is cachable
+ * based on its size SIZE. The decision depends on the cache used by RB.
+ */
+static svn_boolean_t
+fulltext_size_is_cachable(fs_fs_data_t *ffd, svn_filesize_t size)
+{
+ return (size < APR_SIZE_MAX)
+ && svn_cache__is_cachable(ffd->fulltext_cache, (apr_size_t)size);
+}
+
+/* Close method used on streams returned by read_representation().
+ */
+static svn_error_t *
+rep_read_contents_close(void *baton)
+{
+ struct rep_read_baton *rb = baton;
+
+ svn_pool_destroy(rb->pool);
+ svn_pool_destroy(rb->filehandle_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the next *LEN bytes of the rep from our plain / delta windows
+ and store them in *BUF. */
+static svn_error_t *
+get_contents_from_windows(struct rep_read_baton *rb,
+ char *buf,
+ apr_size_t *len)
+{
+ apr_size_t copy_len, remaining = *len;
+ char *cur = buf;
+ rep_state_t *rs;
+
+ /* Special case for when there are no delta reps, only a plain
+ text. */
+ if (rb->rs_list->nelts == 0)
+ {
+ copy_len = remaining;
+ rs = rb->src_state;
+
+ if (rb->base_window != NULL)
+ {
+ /* We got the desired rep directly from the cache.
+ This is where we need the pseudo rep_state created
+ by build_rep_list(). */
+ apr_size_t offset = (apr_size_t)rs->current;
+ if (copy_len + offset > rb->base_window->len)
+ copy_len = offset < rb->base_window->len
+ ? rb->base_window->len - offset
+ : 0ul;
+
+ memcpy (cur, rb->base_window->data + offset, copy_len);
+ }
+ else
+ {
+ apr_off_t offset;
+ if (((apr_off_t) copy_len) > rs->size - rs->current)
+ copy_len = (apr_size_t) (rs->size - rs->current);
+
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+ SVN_ERR(auto_set_start_offset(rs, rb->pool));
+
+ offset = rs->start + rs->current;
+ SVN_ERR(rs_aligned_seek(rs, NULL, offset, rb->pool));
+ SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, cur,
+ copy_len, NULL, NULL, rb->pool));
+ }
+
+ rs->current += copy_len;
+ *len = copy_len;
+ return SVN_NO_ERROR;
+ }
+
+ while (remaining > 0)
+ {
+ /* If we have buffered data from a previous chunk, use that. */
+ if (rb->buf)
+ {
+ /* Determine how much to copy from the buffer. */
+ copy_len = rb->buf_len - rb->buf_pos;
+ if (copy_len > remaining)
+ copy_len = remaining;
+
+ /* Actually copy the data. */
+ memcpy(cur, rb->buf + rb->buf_pos, copy_len);
+ rb->buf_pos += copy_len;
+ cur += copy_len;
+ remaining -= copy_len;
+
+ /* If the buffer is all used up, clear it and empty the
+ local pool. */
+ if (rb->buf_pos == rb->buf_len)
+ {
+ svn_pool_clear(rb->pool);
+ rb->buf = NULL;
+ }
+ }
+ else
+ {
+ svn_stringbuf_t *sbuf = NULL;
+
+ rs = APR_ARRAY_IDX(rb->rs_list, 0, rep_state_t *);
+ if (rs->current == rs->size)
+ break;
+
+ /* Get more buffered data by evaluating a chunk. */
+ SVN_ERR(get_combined_window(&sbuf, rb));
+
+ rb->chunk_index++;
+ rb->buf_len = sbuf->len;
+ rb->buf = sbuf->data;
+ rb->buf_pos = 0;
+ }
+ }
+
+ *len = cur - buf;
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton type for get_fulltext_partial. */
+typedef struct fulltext_baton_t
+{
+ /* Target buffer to write to; of at least LEN bytes. */
+ char *buffer;
+
+ /* Offset within the respective fulltext at which we shall start to
+ copy data into BUFFER. */
+ apr_size_t start;
+
+ /* Number of bytes to copy. The actual amount may be less in case
+ the fulltext is short(er). */
+ apr_size_t len;
+
+ /* Number of bytes actually copied into BUFFER. */
+ apr_size_t read;
+} fulltext_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t for fulltext caches.
+ * From the fulltext in DATA, we copy the range specified by the
+ * fulltext_baton_t* BATON into the buffer provided by that baton.
+ * OUT and RESULT_POOL are not used.
+ */
+static svn_error_t *
+get_fulltext_partial(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ fulltext_baton_t *fulltext_baton = baton;
+
+ /* We cached the fulltext with an NUL appended to it. */
+ apr_size_t fulltext_len = data_len - 1;
+
+ /* Clip the copy range to what the fulltext size allows. */
+ apr_size_t start = MIN(fulltext_baton->start, fulltext_len);
+ fulltext_baton->read = MIN(fulltext_len - start, fulltext_baton->len);
+
+ /* Copy the data to the output buffer and be done. */
+ memcpy(fulltext_baton->buffer, (const char *)data + start,
+ fulltext_baton->read);
+
+ return SVN_NO_ERROR;
+}
+
+/* Find the fulltext specified in BATON in the fulltext cache given
+ * as well by BATON. If that succeeds, set *CACHED to TRUE and copy
+ * up to the next *LEN bytes into BUFFER. Set *LEN to the actual
+ * number of bytes copied.
+ */
+static svn_error_t *
+get_contents_from_fulltext(svn_boolean_t *cached,
+ struct rep_read_baton *baton,
+ char *buffer,
+ apr_size_t *len)
+{
+ void *dummy;
+ fulltext_baton_t fulltext_baton;
+
+ SVN_ERR_ASSERT((apr_size_t)baton->fulltext_delivered
+ == baton->fulltext_delivered);
+ fulltext_baton.buffer = buffer;
+ fulltext_baton.start = (apr_size_t)baton->fulltext_delivered;
+ fulltext_baton.len = *len;
+ fulltext_baton.read = 0;
+
+ SVN_ERR(svn_cache__get_partial(&dummy, cached, baton->fulltext_cache,
+ &baton->fulltext_cache_key,
+ get_fulltext_partial, &fulltext_baton,
+ baton->pool));
+
+ if (*cached)
+ {
+ baton->fulltext_delivered += fulltext_baton.read;
+ *len = fulltext_baton.read;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Determine the optimal size of a string buf that shall receive a
+ * (full-) text of NEEDED bytes.
+ *
+ * The critical point is that those buffers may be very large and
+ * can cause memory fragmentation. We apply simple heuristics to
+ * make fragmentation less likely.
+ */
+static apr_size_t
+optimimal_allocation_size(apr_size_t needed)
+{
+ /* For all allocations, assume some overhead that is shared between
+ * OS memory managemnt, APR memory management and svn_stringbuf_t. */
+ const apr_size_t overhead = 0x400;
+ apr_size_t optimal;
+
+ /* If an allocation size if safe for other ephemeral buffers, it should
+ * be safe for ours. */
+ if (needed <= SVN__STREAM_CHUNK_SIZE)
+ return needed;
+
+ /* Paranoia edge case:
+ * Skip our heuristics if they created arithmetical overflow.
+ * Beware to make this test work for NEEDED = APR_SIZE_MAX as well! */
+ if (needed >= APR_SIZE_MAX / 2 - overhead)
+ return needed;
+
+ /* As per definition SVN__STREAM_CHUNK_SIZE is a power of two.
+ * Since we know NEEDED to be larger than that, use it as the
+ * starting point.
+ *
+ * Heuristics: Allocate a power-of-two number of bytes that fit
+ * NEEDED plus some OVERHEAD. The APR allocator
+ * will round it up to the next full page size.
+ */
+ optimal = SVN__STREAM_CHUNK_SIZE;
+ while (optimal - overhead < needed)
+ optimal *= 2;
+
+ /* This is above or equal to NEEDED. */
+ return optimal - overhead;
+}
+
+/* After a fulltext cache lookup failure, we will continue to read from
+ * combined delta or plain windows. However, we must first make that data
+ * stream in BATON catch up tho the position LEN already delivered from the
+ * fulltext cache. Also, we need to store the reconstructed fulltext if we
+ * want to cache it at the end.
+ */
+static svn_error_t *
+skip_contents(struct rep_read_baton *baton,
+ svn_filesize_t len)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+
+ /* Do we want to cache the reconstructed fulltext? */
+ if (SVN_IS_VALID_REVNUM(baton->fulltext_cache_key.revision))
+ {
+ char *buffer;
+ svn_filesize_t to_alloc = MAX(len, baton->len);
+
+ /* This should only be happening if BATON->LEN and LEN are
+ * cacheable, implying they fit into memory. */
+ SVN_ERR_ASSERT((apr_size_t)to_alloc == to_alloc);
+
+ /* Allocate the fulltext buffer. */
+ baton->current_fulltext = svn_stringbuf_create_ensure(
+ optimimal_allocation_size((apr_size_t)to_alloc),
+ baton->filehandle_pool);
+
+ /* Read LEN bytes from the window stream and store the data
+ * in the fulltext buffer (will be filled by further reads later). */
+ baton->current_fulltext->len = (apr_size_t)len;
+ baton->current_fulltext->data[(apr_size_t)len] = 0;
+
+ buffer = baton->current_fulltext->data;
+ while (len > 0 && !err)
+ {
+ apr_size_t to_read = (apr_size_t)len;
+ err = get_contents_from_windows(baton, buffer, &to_read);
+ len -= to_read;
+ buffer += to_read;
+ }
+ }
+ else if (len > 0)
+ {
+ /* Simply drain LEN bytes from the window stream. */
+ apr_pool_t *subpool = subpool = svn_pool_create(baton->pool);
+ char *buffer = apr_palloc(subpool, SVN__STREAM_CHUNK_SIZE);
+
+ while (len > 0 && !err)
+ {
+ apr_size_t to_read = len > SVN__STREAM_CHUNK_SIZE
+ ? SVN__STREAM_CHUNK_SIZE
+ : (apr_size_t)len;
+
+ err = get_contents_from_windows(baton, buffer, &to_read);
+ len -= to_read;
+ }
+
+ svn_pool_destroy(subpool);
+ }
+
+ return svn_error_trace(err);
+}
+
+/* BATON is of type `rep_read_baton'; read the next *LEN bytes of the
+ representation and store them in *BUF. Sum as we read and verify
+ the MD5 sum at the end. */
+static svn_error_t *
+rep_read_contents(void *baton,
+ char *buf,
+ apr_size_t *len)
+{
+ struct rep_read_baton *rb = baton;
+
+ /* Get data from the fulltext cache for as long as we can. */
+ if (rb->fulltext_cache)
+ {
+ svn_boolean_t cached;
+ SVN_ERR(get_contents_from_fulltext(&cached, rb, buf, len));
+ if (cached)
+ return SVN_NO_ERROR;
+
+ /* Cache miss. From now on, we will never read from the fulltext
+ * cache for this representation anymore. */
+ rb->fulltext_cache = NULL;
+ }
+
+ /* No fulltext cache to help us. We must read from the window stream. */
+ if (!rb->rs_list)
+ {
+ /* Window stream not initialized, yet. Do it now. */
+ SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window,
+ &rb->src_state, &rb->len, rb->fs, &rb->rep,
+ rb->filehandle_pool));
+
+ /* In case we did read from the fulltext cache before, make the
+ * window stream catch up. Also, initialize the fulltext buffer
+ * if we want to cache the fulltext at the end. */
+ SVN_ERR(skip_contents(rb, rb->fulltext_delivered));
+ }
+
+ /* Get the next block of data.
+ * Keep in mind that the representation might be empty and leave us
+ * already positioned at the end of the rep. */
+ if (rb->off == rb->len)
+ *len = 0;
+ else
+ SVN_ERR(get_contents_from_windows(rb, buf, len));
+
+ if (rb->current_fulltext)
+ svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
+
+ /* Perform checksumming. We want to check the checksum as soon as
+ the last byte of data is read, in case the caller never performs
+ a short read, but we don't want to finalize the MD5 context
+ twice. */
+ if (!rb->checksum_finalized)
+ {
+ SVN_ERR(svn_checksum_update(rb->md5_checksum_ctx, buf, *len));
+ rb->off += *len;
+ if (rb->off == rb->len)
+ {
+ svn_checksum_t *md5_checksum;
+ svn_checksum_t expected;
+ expected.kind = svn_checksum_md5;
+ expected.digest = rb->md5_digest;
+
+ rb->checksum_finalized = TRUE;
+ SVN_ERR(svn_checksum_final(&md5_checksum, rb->md5_checksum_ctx,
+ rb->pool));
+ if (!svn_checksum_match(md5_checksum, &expected))
+ return svn_error_create(SVN_ERR_FS_CORRUPT,
+ svn_checksum_mismatch_err(&expected, md5_checksum,
+ rb->pool,
+ _("Checksum mismatch while reading representation")),
+ NULL);
+ }
+ }
+
+ if (rb->off == rb->len && rb->current_fulltext)
+ {
+ fs_fs_data_t *ffd = rb->fs->fsap_data;
+ SVN_ERR(svn_cache__set(ffd->fulltext_cache, &rb->fulltext_cache_key,
+ rb->current_fulltext, rb->pool));
+ rb->current_fulltext = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_contents(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ svn_boolean_t cache_fulltext,
+ apr_pool_t *pool)
+{
+ if (! rep)
+ {
+ *contents_p = svn_stream_empty(pool);
+ }
+ else
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_filesize_t len = rep->expanded_size ? rep->expanded_size : rep->size;
+ struct rep_read_baton *rb;
+
+ pair_cache_key_t fulltext_cache_key = { 0 };
+ fulltext_cache_key.revision = rep->revision;
+ fulltext_cache_key.second = rep->item_index;
+
+ /* Initialize the reader baton. Some members may added lazily
+ * while reading from the stream */
+ SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key, pool));
+
+ /* Make the stream attempt fulltext cache lookups if the fulltext
+ * is cacheable. If it is not, then also don't try to buffer and
+ * cache it. */
+ if (ffd->fulltext_cache && cache_fulltext
+ && SVN_IS_VALID_REVNUM(rep->revision)
+ && fulltext_size_is_cachable(ffd, len))
+ {
+ rb->fulltext_cache = ffd->fulltext_cache;
+ }
+ else
+ {
+ /* This will also prevent the reconstructed fulltext from being
+ put into the cache. */
+ rb->fulltext_cache_key.revision = SVN_INVALID_REVNUM;
+ }
+
+ *contents_p = svn_stream_create(rb, pool);
+ svn_stream_set_read2(*contents_p, NULL /* only full read support */,
+ rep_read_contents);
+ svn_stream_set_close(*contents_p, rep_read_contents_close);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_file_t *file,
+ apr_off_t offset,
+ apr_pool_t *pool)
+{
+ struct rep_read_baton *rb;
+ pair_cache_key_t fulltext_cache_key = { SVN_INVALID_REVNUM, 0 };
+ rep_state_t *rs = apr_pcalloc(pool, sizeof(*rs));
+ svn_fs_fs__rep_header_t *rh;
+
+ /* Initialize the reader baton. Some members may added lazily
+ * while reading from the stream. */
+ SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key, pool));
+
+ /* Continue constructing RS. Leave caches as NULL. */
+ rs->size = rep->size;
+ rs->revision = SVN_INVALID_REVNUM;
+ rs->item_index = 0;
+ rs->ver = -1;
+ rs->start = -1;
+
+ /* Provide just enough file access info to allow for a basic read from
+ * FILE but leave all index / footer info with empty values b/c FILE
+ * probably is not a complete revision file. */
+ rs->sfile = apr_pcalloc(pool, sizeof(*rs->sfile));
+ rs->sfile->revision = rep->revision;
+ rs->sfile->pool = pool;
+ rs->sfile->fs = fs;
+ rs->sfile->rfile = apr_pcalloc(pool, sizeof(*rs->sfile->rfile));
+ rs->sfile->rfile->start_revision = SVN_INVALID_REVNUM;
+ rs->sfile->rfile->file = file;
+ rs->sfile->rfile->stream = svn_stream_from_aprfile2(file, TRUE, pool);
+
+ /* Read the rep header. */
+ SVN_ERR(aligned_seek(fs, file, NULL, offset, pool));
+ SVN_ERR(svn_fs_fs__read_rep_header(&rh, rs->sfile->rfile->stream,
+ pool, pool));
+ SVN_ERR(get_file_offset(&rs->start, rs, pool));
+ rs->header_size = rh->header_size;
+
+ /* Log the access. */
+ SVN_ERR(dbg_log_access(fs, SVN_INVALID_REVNUM, 0, rh,
+ SVN_FS_FS__ITEM_TYPE_ANY_REP, pool));
+
+ /* Build the representation list (delta chain). */
+ if (rh->type == svn_fs_fs__rep_plain)
+ {
+ rb->rs_list = apr_array_make(pool, 0, sizeof(rep_state_t *));
+ rb->src_state = rs;
+ }
+ else if (rh->type == svn_fs_fs__rep_self_delta)
+ {
+ rb->rs_list = apr_array_make(pool, 1, sizeof(rep_state_t *));
+ APR_ARRAY_PUSH(rb->rs_list, rep_state_t *) = rs;
+ rb->src_state = NULL;
+ }
+ else
+ {
+ representation_t next_rep = { 0 };
+
+ /* skip "SVNx" diff marker */
+ rs->current = 4;
+
+ /* REP's base rep is inside a proper revision.
+ * It can be reconstructed in the usual way. */
+ next_rep.revision = rh->base_revision;
+ next_rep.item_index = rh->base_item_index;
+ next_rep.size = rh->base_length;
+ svn_fs_fs__id_txn_reset(&next_rep.txn_id);
+
+ SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window,
+ &rb->src_state, &rb->len, rb->fs, &next_rep,
+ rb->filehandle_pool));
+
+ /* Insert the access to REP as the first element of the delta chain. */
+ svn_sort__array_insert(rb->rs_list, &rs, 0);
+ }
+
+ /* Now, the baton is complete and we can assemble the stream around it. */
+ *contents_p = svn_stream_create(rb, pool);
+ svn_stream_set_read2(*contents_p, NULL /* only full read support */,
+ rep_read_contents);
+ svn_stream_set_close(*contents_p, rep_read_contents_close);
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for cache_access_wrapper. Wraps the original parameters of
+ * svn_fs_fs__try_process_file_content().
+ */
+typedef struct cache_access_wrapper_baton_t
+{
+ svn_fs_process_contents_func_t func;
+ void* baton;
+} cache_access_wrapper_baton_t;
+
+/* Wrapper to translate between svn_fs_process_contents_func_t and
+ * svn_cache__partial_getter_func_t.
+ */
+static svn_error_t *
+cache_access_wrapper(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ cache_access_wrapper_baton_t *wrapper_baton = baton;
+
+ SVN_ERR(wrapper_baton->func((const unsigned char *)data,
+ data_len - 1, /* cache adds terminating 0 */
+ wrapper_baton->baton,
+ pool));
+
+ /* non-NULL value to signal the calling cache that all went well */
+ *out = baton;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__try_process_file_contents(svn_boolean_t *success,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *pool)
+{
+ representation_t *rep = noderev->data_rep;
+ if (rep)
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+ pair_cache_key_t fulltext_cache_key = { 0 };
+
+ fulltext_cache_key.revision = rep->revision;
+ fulltext_cache_key.second = rep->item_index;
+ if (ffd->fulltext_cache && SVN_IS_VALID_REVNUM(rep->revision)
+ && fulltext_size_is_cachable(ffd, rep->expanded_size))
+ {
+ cache_access_wrapper_baton_t wrapper_baton;
+ void *dummy = NULL;
+
+ wrapper_baton.func = processor;
+ wrapper_baton.baton = baton;
+ return svn_cache__get_partial(&dummy, success,
+ ffd->fulltext_cache,
+ &fulltext_cache_key,
+ cache_access_wrapper,
+ &wrapper_baton,
+ pool);
+ }
+ }
+
+ *success = FALSE;
+ return SVN_NO_ERROR;
+}
+
+
+/* Baton used when reading delta windows. */
+struct delta_read_baton
+{
+ rep_state_t *rs;
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
+};
+
+/* This implements the svn_txdelta_next_window_fn_t interface. */
+static svn_error_t *
+delta_read_next_window(svn_txdelta_window_t **window, void *baton,
+ apr_pool_t *pool)
+{
+ struct delta_read_baton *drb = baton;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ *window = NULL;
+ if (drb->rs->current < drb->rs->size)
+ {
+ SVN_ERR(read_delta_window(window, drb->rs->chunk_index, drb->rs, pool,
+ scratch_pool));
+ drb->rs->chunk_index++;
+ }
+
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements the svn_txdelta_md5_digest_fn_t interface. */
+static const unsigned char *
+delta_read_md5_digest(void *baton)
+{
+ struct delta_read_baton *drb = baton;
+ return drb->md5_digest;
+}
+
+/* Return a txdelta stream for on-disk representation REP_STATE
+ * of TARGET. Allocate the result in POOL.
+ */
+static svn_txdelta_stream_t *
+get_storaged_delta_stream(rep_state_t *rep_state,
+ node_revision_t *target,
+ apr_pool_t *pool)
+{
+ /* Create the delta read baton. */
+ struct delta_read_baton *drb = apr_pcalloc(pool, sizeof(*drb));
+ drb->rs = rep_state;
+ memcpy(drb->md5_digest, target->data_rep->md5_digest,
+ sizeof(drb->md5_digest));
+ return svn_txdelta_stream_create(drb, delta_read_next_window,
+ delta_read_md5_digest, pool);
+}
+
+svn_error_t *
+svn_fs_fs__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ svn_fs_t *fs,
+ node_revision_t *source,
+ node_revision_t *target,
+ apr_pool_t *pool)
+{
+ svn_stream_t *source_stream, *target_stream;
+ rep_state_t *rep_state;
+ svn_fs_fs__rep_header_t *rep_header;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* Try a shortcut: if the target is stored as a delta against the source,
+ then just use that delta. However, prefer using the fulltext cache
+ whenever that is available. */
+ if (target->data_rep && (source || ! ffd->fulltext_cache))
+ {
+ /* Read target's base rep if any. */
+ SVN_ERR(create_rep_state(&rep_state, &rep_header, NULL,
+ target->data_rep, fs, pool, pool));
+
+ if (source && source->data_rep && target->data_rep)
+ {
+ /* If that matches source, then use this delta as is.
+ Note that we want an actual delta here. E.g. a self-delta would
+ not be good enough. */
+ if (rep_header->type == svn_fs_fs__rep_delta
+ && rep_header->base_revision == source->data_rep->revision
+ && rep_header->base_item_index == source->data_rep->item_index)
+ {
+ *stream_p = get_storaged_delta_stream(rep_state, target, pool);
+ return SVN_NO_ERROR;
+ }
+ }
+ else if (!source)
+ {
+ /* We want a self-delta. There is a fair chance that TARGET got
+ added in this revision and is already stored in the requested
+ format. */
+ if (rep_header->type == svn_fs_fs__rep_self_delta)
+ {
+ *stream_p = get_storaged_delta_stream(rep_state, target, pool);
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Don't keep file handles open for longer than necessary. */
+ if (rep_state->sfile->rfile)
+ {
+ SVN_ERR(svn_fs_fs__close_revision_file(rep_state->sfile->rfile));
+ rep_state->sfile->rfile = NULL;
+ }
+ }
+
+ /* Read both fulltexts and construct a delta. */
+ if (source)
+ SVN_ERR(svn_fs_fs__get_contents(&source_stream, fs, source->data_rep,
+ TRUE, pool));
+ else
+ source_stream = svn_stream_empty(pool);
+ SVN_ERR(svn_fs_fs__get_contents(&target_stream, fs, target->data_rep,
+ TRUE, pool));
+
+ /* Because source and target stream will already verify their content,
+ * there is no need to do this once more. In particular if the stream
+ * content is being fetched from cache. */
+ svn_txdelta2(stream_p, source_stream, target_stream, FALSE, pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE when all svn_fs_dirent_t* in ENTRIES are already sorted
+ by their respective name. */
+static svn_boolean_t
+sorted(apr_array_header_t *entries)
+{
+ int i;
+
+ const svn_fs_dirent_t * const *dirents = (const void *)entries->elts;
+ for (i = 0; i < entries->nelts-1; ++i)
+ if (strcmp(dirents[i]->name, dirents[i+1]->name) > 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Compare the names of the two dirents given in **A and **B. */
+static int
+compare_dirents(const void *a, const void *b)
+{
+ const svn_fs_dirent_t *lhs = *((const svn_fs_dirent_t * const *) a);
+ const svn_fs_dirent_t *rhs = *((const svn_fs_dirent_t * const *) b);
+
+ return strcmp(lhs->name, rhs->name);
+}
+
+/* Compare the name of the dirents given in **A with the C string in *B. */
+static int
+compare_dirent_name(const void *a, const void *b)
+{
+ const svn_fs_dirent_t *lhs = *((const svn_fs_dirent_t * const *) a);
+ const char *rhs = b;
+
+ return strcmp(lhs->name, rhs);
+}
+
+/* Into ENTRIES, read all directories entries from the key-value text in
+ * STREAM. If INCREMENTAL is TRUE, read until the end of the STREAM and
+ * update the data. ID is provided for nicer error messages.
+ */
+static svn_error_t *
+read_dir_entries(apr_array_header_t *entries,
+ svn_stream_t *stream,
+ svn_boolean_t incremental,
+ const svn_fs_id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_t *hash = incremental ? svn_hash__make(scratch_pool) : NULL;
+ const char *terminator = SVN_HASH_TERMINATOR;
+
+ /* Read until the terminator (non-incremental) or the end of STREAM
+ (incremental mode). In the latter mode, we use a temporary HASH
+ to make updating and removing entries cheaper. */
+ while (1)
+ {
+ svn_hash__entry_t entry;
+ svn_fs_dirent_t *dirent;
+ char *str;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_hash__read_entry(&entry, stream, terminator,
+ incremental, iterpool));
+
+ /* End of directory? */
+ if (entry.key == NULL)
+ {
+ /* In incremental mode, we skip the terminator and read the
+ increments following it until the end of the stream. */
+ if (incremental && terminator)
+ terminator = NULL;
+ else
+ break;
+ }
+
+ /* Deleted entry? */
+ if (entry.val == NULL)
+ {
+ /* We must be in incremental mode */
+ assert(hash);
+ apr_hash_set(hash, entry.key, entry.keylen, NULL);
+ continue;
+ }
+
+ /* Add a new directory entry. */
+ dirent = apr_pcalloc(result_pool, sizeof(*dirent));
+ dirent->name = apr_pstrmemdup(result_pool, entry.key, entry.keylen);
+
+ str = svn_cstring_tokenize(" ", &entry.val);
+ if (str == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_fs__id_unparse(id, scratch_pool)->data);
+
+ if (strcmp(str, SVN_FS_FS__KIND_FILE) == 0)
+ {
+ dirent->kind = svn_node_file;
+ }
+ else if (strcmp(str, SVN_FS_FS__KIND_DIR) == 0)
+ {
+ dirent->kind = svn_node_dir;
+ }
+ else
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_fs__id_unparse(id, scratch_pool)->data);
+ }
+
+ str = svn_cstring_tokenize(" ", &entry.val);
+ if (str == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_fs__id_unparse(id, scratch_pool)->data);
+
+ SVN_ERR(svn_fs_fs__id_parse(&dirent->id, str, result_pool));
+
+ /* In incremental mode, update the hash; otherwise, write to the
+ * final array. Be sure to use hash keys that survive this iteration.
+ */
+ if (incremental)
+ apr_hash_set(hash, dirent->name, entry.keylen, dirent);
+ else
+ APR_ARRAY_PUSH(entries, svn_fs_dirent_t *) = dirent;
+ }
+
+ /* Convert container to a sorted array. */
+ if (incremental)
+ {
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(iterpool, hash); hi; hi = apr_hash_next(hi))
+ APR_ARRAY_PUSH(entries, svn_fs_dirent_t *) = apr_hash_this_val(hi);
+ }
+
+ if (!sorted(entries))
+ svn_sort__array(entries, compare_dirents);
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Fetch the contents of a directory into ENTRIES. Values are stored
+ as filename to string mappings; further conversion is necessary to
+ convert them into svn_fs_dirent_t values. */
+static svn_error_t *
+get_dir_contents(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *contents;
+
+ *entries = apr_array_make(result_pool, 16, sizeof(svn_fs_dirent_t *));
+ if (noderev->data_rep && svn_fs_fs__id_txn_used(&noderev->data_rep->txn_id))
+ {
+ const char *filename
+ = svn_fs_fs__path_txn_node_children(fs, noderev->id, scratch_pool);
+
+ /* The representation is mutable. Read the old directory
+ contents from the mutable children file, followed by the
+ changes we've made in this transaction. */
+ SVN_ERR(svn_stream_open_readonly(&contents, filename, scratch_pool,
+ scratch_pool));
+ SVN_ERR(read_dir_entries(*entries, contents, TRUE, noderev->id,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_stream_close(contents));
+ }
+ else if (noderev->data_rep)
+ {
+ /* Undeltify content before parsing it. Otherwise, we could only
+ * parse it byte-by-byte.
+ */
+ apr_size_t len = noderev->data_rep->expanded_size
+ ? (apr_size_t)noderev->data_rep->expanded_size
+ : (apr_size_t)noderev->data_rep->size;
+ svn_stringbuf_t *text;
+
+ /* The representation is immutable. Read it normally. */
+ SVN_ERR(svn_fs_fs__get_contents(&contents, fs, noderev->data_rep,
+ FALSE, scratch_pool));
+ SVN_ERR(svn_stringbuf_from_stream(&text, contents, len, scratch_pool));
+ SVN_ERR(svn_stream_close(contents));
+
+ /* de-serialize hash */
+ contents = svn_stream_from_stringbuf(text, scratch_pool);
+ SVN_ERR(read_dir_entries(*entries, contents, FALSE, noderev->id,
+ result_pool, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Return the cache object in FS responsible to storing the directory the
+ * NODEREV plus the corresponding *KEY. If no cache exists, return NULL.
+ * PAIR_KEY must point to some key struct, which does not need to be
+ * initialized. We use it to avoid dynamic allocation.
+ */
+static svn_cache__t *
+locate_dir_cache(svn_fs_t *fs,
+ const void **key,
+ pair_cache_key_t *pair_key,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ if (svn_fs_fs__id_is_txn(noderev->id))
+ {
+ /* data in txns requires the expensive fs_id-based addressing mode */
+ *key = svn_fs_fs__id_unparse(noderev->id, pool)->data;
+ return ffd->txn_dir_cache;
+ }
+ else
+ {
+ /* committed data can use simple rev,item pairs */
+ if (noderev->data_rep)
+ {
+ pair_key->revision = noderev->data_rep->revision;
+ pair_key->second = noderev->data_rep->item_index;
+ *key = pair_key;
+ }
+ else
+ {
+ /* no data rep -> empty directory.
+ A NULL key causes a cache miss. */
+ *key = NULL;
+ }
+
+ return ffd->dir_cache;
+ }
+}
+
+svn_error_t *
+svn_fs_fs__rep_contents_dir(apr_array_header_t **entries_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ pair_cache_key_t pair_key = { 0 };
+ const void *key;
+
+ /* find the cache we may use */
+ svn_cache__t *cache = locate_dir_cache(fs, &key, &pair_key, noderev,
+ scratch_pool);
+ if (cache)
+ {
+ svn_boolean_t found;
+
+ SVN_ERR(svn_cache__get((void **)entries_p, &found, cache, key,
+ result_pool));
+ if (found)
+ return SVN_NO_ERROR;
+ }
+
+ /* Read in the directory contents. */
+ SVN_ERR(get_dir_contents(entries_p, fs, noderev, result_pool,
+ scratch_pool));
+
+ /* Update the cache, if we are to use one.
+ *
+ * Don't even attempt to serialize very large directories; it would cause
+ * an unnecessary memory allocation peak. 150 bytes/entry is about right.
+ */
+ if (cache && svn_cache__is_cachable(cache, 150 * (*entries_p)->nelts))
+ SVN_ERR(svn_cache__set(cache, key, *entries_p, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_fs_dirent_t *
+svn_fs_fs__find_dir_entry(apr_array_header_t *entries,
+ const char *name,
+ int *hint)
+{
+ svn_fs_dirent_t **result
+ = svn_sort__array_lookup(entries, name, hint, compare_dirent_name);
+ return result ? *result : NULL;
+}
+
+svn_error_t *
+svn_fs_fs__rep_contents_dir_entry(svn_fs_dirent_t **dirent,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t found = FALSE;
+
+ /* find the cache we may use */
+ pair_cache_key_t pair_key = { 0 };
+ const void *key;
+ svn_cache__t *cache = locate_dir_cache(fs, &key, &pair_key, noderev,
+ scratch_pool);
+ if (cache)
+ {
+ /* Cache lookup. */
+ SVN_ERR(svn_cache__get_partial((void **)dirent,
+ &found,
+ cache,
+ key,
+ svn_fs_fs__extract_dir_entry,
+ (void*)name,
+ result_pool));
+ }
+
+ /* fetch data from disk if we did not find it in the cache */
+ if (! found)
+ {
+ apr_array_header_t *entries;
+ svn_fs_dirent_t *entry;
+ svn_fs_dirent_t *entry_copy = NULL;
+
+ /* read the dir from the file system. It will probably be put it
+ into the cache for faster lookup in future calls. */
+ SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev,
+ scratch_pool, scratch_pool));
+
+ /* find desired entry and return a copy in POOL, if found */
+ entry = svn_fs_fs__find_dir_entry(entries, name, NULL);
+ if (entry)
+ {
+ entry_copy = apr_palloc(result_pool, sizeof(*entry_copy));
+ entry_copy->name = apr_pstrdup(result_pool, entry->name);
+ entry_copy->id = svn_fs_fs__id_copy(entry->id, result_pool);
+ entry_copy->kind = entry->kind;
+ }
+
+ *dirent = entry_copy;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ apr_hash_t *proplist;
+ svn_stream_t *stream;
+
+ if (noderev->prop_rep && svn_fs_fs__id_txn_used(&noderev->prop_rep->txn_id))
+ {
+ svn_error_t *err;
+ const char *filename
+ = svn_fs_fs__path_txn_node_props(fs, noderev->id, pool);
+ proplist = apr_hash_make(pool);
+
+ SVN_ERR(svn_stream_open_readonly(&stream, filename, pool, pool));
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list for node-revision '%s' in '%s'"),
+ id_str->data, filename);
+ }
+ SVN_ERR(svn_stream_close(stream));
+ }
+ else if (noderev->prop_rep)
+ {
+ svn_error_t *err;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ representation_t *rep = noderev->prop_rep;
+ pair_cache_key_t key = { 0 };
+
+ key.revision = rep->revision;
+ key.second = rep->item_index;
+ if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
+ {
+ svn_boolean_t is_cached;
+ SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
+ ffd->properties_cache, &key, pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ proplist = apr_hash_make(pool);
+ SVN_ERR(svn_fs_fs__get_contents(&stream, fs, noderev->prop_rep, FALSE,
+ pool));
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list for node-revision '%s'"),
+ id_str->data);
+ }
+ SVN_ERR(svn_stream_close(stream));
+
+ if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
+ SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist, pool));
+ }
+ else
+ {
+ /* return an empty prop list if the node doesn't have any props */
+ proplist = apr_hash_make(pool);
+ }
+
+ *proplist_p = proplist;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ apr_off_t changes_offset = SVN_FS_FS__ITEM_INDEX_CHANGES;
+ svn_fs_fs__revision_file_t *revision_file;
+ svn_boolean_t found;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
+
+ /* try cache lookup first */
+
+ if (ffd->changes_cache)
+ {
+ SVN_ERR(svn_cache__get((void **) changes, &found, ffd->changes_cache,
+ &rev, result_pool));
+ }
+ else
+ {
+ found = FALSE;
+ }
+
+ if (!found)
+ {
+ /* read changes from revision file */
+
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, scratch_pool));
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev,
+ scratch_pool, scratch_pool));
+
+ if (use_block_read(fs))
+ {
+ /* 'block-read' will also provide us with the desired data */
+ SVN_ERR(block_read((void **)changes, fs,
+ rev, SVN_FS_FS__ITEM_INDEX_CHANGES,
+ revision_file, result_pool, scratch_pool));
+ }
+ else
+ {
+ /* Addressing is very different for old formats
+ * (needs to read the revision trailer). */
+ if (svn_fs_fs__use_log_addressing(fs))
+ SVN_ERR(svn_fs_fs__item_offset(&changes_offset, fs,
+ revision_file, rev, NULL,
+ SVN_FS_FS__ITEM_INDEX_CHANGES,
+ scratch_pool));
+ else
+ SVN_ERR(get_root_changes_offset(NULL, &changes_offset,
+ revision_file, fs, rev,
+ scratch_pool));
+
+ /* Actual reading and parsing are the same, though. */
+ SVN_ERR(aligned_seek(fs, revision_file->file, NULL, changes_offset,
+ scratch_pool));
+ SVN_ERR(svn_fs_fs__read_changes(changes, revision_file->stream,
+ result_pool, scratch_pool));
+
+ /* cache for future reference */
+
+ if (ffd->changes_cache)
+ {
+ /* Guesstimate for the size of the in-cache representation. */
+ apr_size_t estimated_size = (apr_size_t)250 * (*changes)->nelts;
+
+ /* Don't even serialize data that probably won't fit into the
+ * cache. This often implies that either CHANGES is very
+ * large, memory is scarce or both. Having a huge temporary
+ * copy would not be a good thing in either case. */
+ if (svn_cache__is_cachable(ffd->changes_cache, estimated_size))
+ SVN_ERR(svn_cache__set(ffd->changes_cache, &rev, *changes,
+ scratch_pool));
+ }
+ }
+
+ SVN_ERR(svn_fs_fs__close_revision_file(revision_file));
+ }
+
+ SVN_ERR(dbg_log_access(fs, rev, changes_offset, *changes,
+ SVN_FS_FS__ITEM_TYPE_CHANGES, scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+/* Inialize the representation read state RS for the given REP_HEADER and
+ * p2l index ENTRY. If not NULL, assign FILE and STREAM to RS.
+ * Use RESULT_POOL for allocations.
+ */
+static svn_error_t *
+init_rep_state(rep_state_t *rs,
+ svn_fs_fs__rep_header_t *rep_header,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *file,
+ svn_fs_fs__p2l_entry_t* entry,
+ apr_pool_t *result_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ shared_file_t *shared_file = apr_pcalloc(result_pool, sizeof(*shared_file));
+
+ /* this function does not apply to representation containers */
+ SVN_ERR_ASSERT(entry->type >= SVN_FS_FS__ITEM_TYPE_FILE_REP
+ && entry->type <= SVN_FS_FS__ITEM_TYPE_DIR_PROPS);
+
+ shared_file->rfile = file;
+ shared_file->fs = fs;
+ shared_file->revision = entry->item.revision;
+ shared_file->pool = result_pool;
+
+ rs->sfile = shared_file;
+ rs->revision = entry->item.revision;
+ rs->item_index = entry->item.number;
+ rs->header_size = rep_header->header_size;
+ rs->start = entry->offset + rs->header_size;
+ rs->current = rep_header->type == svn_fs_fs__rep_plain ? 0 : 4;
+ rs->size = entry->size - rep_header->header_size - 7;
+ rs->ver = 1;
+ rs->chunk_index = 0;
+ rs->raw_window_cache = ffd->raw_window_cache;
+ rs->window_cache = ffd->txdelta_window_cache;
+ rs->combined_cache = ffd->combined_window_cache;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t for txdelta windows.
+ * Instead of the whole window data, return only END_OFFSET member.
+ */
+static svn_error_t *
+get_txdelta_window_end(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ const svn_fs_fs__txdelta_cached_window_t *window
+ = (const svn_fs_fs__txdelta_cached_window_t *)data;
+ *(apr_off_t*)out = window->end_offset;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t for raw windows.
+ * Instead of the whole window data, return only END_OFFSET member.
+ */
+static svn_error_t *
+get_raw_window_end(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ const svn_fs_fs__raw_cached_window_t *window
+ = (const svn_fs_fs__raw_cached_window_t *)data;
+ *(apr_off_t*)out = window->end_offset;
+
+ return SVN_NO_ERROR;
+}
+
+/* Walk through all windows in the representation addressed by RS in FS
+ * (excluding the delta bases) and put those not already cached into the
+ * window caches. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset. Use POOL for temporary allocations.
+ *
+ * This function requires RS->RAW_WINDOW_CACHE and RS->WINDOW_CACHE to
+ * be non-NULL.
+ */
+static svn_error_t *
+cache_windows(svn_fs_t *fs,
+ rep_state_t *rs,
+ apr_off_t max_offset,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ while (rs->current < rs->size)
+ {
+ apr_off_t end_offset;
+ svn_boolean_t found = FALSE;
+ window_cache_key_t key = { 0 };
+
+ svn_pool_clear(iterpool);
+
+ if (max_offset != -1 && rs->start + rs->current >= max_offset)
+ {
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+ }
+
+ /* We don't need to read the data again if it is already in cache.
+ * It might be cached as either raw or parsed window.
+ */
+ SVN_ERR(svn_cache__get_partial((void **) &end_offset, &found,
+ rs->raw_window_cache,
+ get_window_key(&key, rs),
+ get_raw_window_end, NULL,
+ iterpool));
+ if (! found)
+ SVN_ERR(svn_cache__get_partial((void **) &end_offset, &found,
+ rs->window_cache, &key,
+ get_txdelta_window_end, NULL,
+ iterpool));
+
+ if (found)
+ {
+ rs->current = end_offset;
+ }
+ else
+ {
+ /* Read, decode and cache the window. */
+ svn_fs_fs__raw_cached_window_t window;
+ apr_off_t start_offset = rs->start + rs->current;
+ apr_size_t window_len;
+ char *buf;
+
+ /* navigate to the current window */
+ SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, iterpool));
+ SVN_ERR(svn_txdelta__read_raw_window_len(&window_len,
+ rs->sfile->rfile->stream,
+ iterpool));
+
+ /* Read the raw window. */
+ buf = apr_palloc(iterpool, window_len + 1);
+ SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, iterpool));
+ SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, buf,
+ window_len, NULL, NULL, iterpool));
+ buf[window_len] = 0;
+
+ /* update relative offset in representation */
+ rs->current += window_len;
+
+ /* Construct the cachable raw window object. */
+ window.end_offset = rs->current;
+ window.window.len = window_len;
+ window.window.data = buf;
+
+ /* cache the window now */
+ SVN_ERR(svn_cache__set(rs->raw_window_cache, &key, &window,
+ iterpool));
+ }
+
+ if (rs->current > rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read beyond "
+ "the end of the representation"));
+
+ rs->chunk_index++;
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Read all txdelta / plain windows following REP_HEADER in FS as described
+ * by ENTRY. Read the data from the already open FILE and the wrapping
+ * STREAM object. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset. Use SCRATCH_POOL for temporary allocations.
+ * If caching is not enabled, this is a no-op.
+ */
+static svn_error_t *
+block_read_windows(svn_fs_fs__rep_header_t *rep_header,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t* entry,
+ apr_off_t max_offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ rep_state_t rs = { 0 };
+ apr_off_t offset;
+ window_cache_key_t key = { 0 };
+
+ if ( (rep_header->type != svn_fs_fs__rep_plain
+ && (!ffd->txdelta_window_cache || !ffd->raw_window_cache))
+ || (rep_header->type == svn_fs_fs__rep_plain
+ && !ffd->combined_window_cache))
+ return SVN_NO_ERROR;
+
+ SVN_ERR(init_rep_state(&rs, rep_header, fs, rev_file, entry,
+ result_pool));
+
+ /* RS->FILE may be shared between RS instances -> make sure we point
+ * to the right data. */
+ offset = rs.start + rs.current;
+ if (rep_header->type == svn_fs_fs__rep_plain)
+ {
+ svn_stringbuf_t *plaintext;
+ svn_boolean_t is_cached;
+
+ /* already in cache? */
+ SVN_ERR(svn_cache__has_key(&is_cached, rs.combined_cache,
+ get_window_key(&key, &rs),
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* for larger reps, the header may have crossed a block boundary.
+ * make sure we still read blocks properly aligned, i.e. don't use
+ * plain seek here. */
+ SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, scratch_pool));
+
+ plaintext = svn_stringbuf_create_ensure(rs.size, result_pool);
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, plaintext->data,
+ rs.size, &plaintext->len, NULL,
+ result_pool));
+ plaintext->data[plaintext->len] = 0;
+ rs.current += rs.size;
+
+ SVN_ERR(set_cached_combined_window(plaintext, &rs, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(cache_windows(fs, &rs, max_offset, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Try to get the representation header identified by KEY from FS's cache.
+ * If it has not been cached, read it from the current position in STREAM
+ * and put it into the cache (if caching has been enabled for rep headers).
+ * Return the result in *REP_HEADER. Use POOL for allocations.
+ */
+static svn_error_t *
+read_rep_header(svn_fs_fs__rep_header_t **rep_header,
+ svn_fs_t *fs,
+ svn_stream_t *stream,
+ pair_cache_key_t *key,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+
+ if (ffd->rep_header_cache)
+ {
+ SVN_ERR(svn_cache__get((void**)rep_header, &is_cached,
+ ffd->rep_header_cache, key,
+ result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_fs_fs__read_rep_header(rep_header, stream, result_pool,
+ scratch_pool));
+
+ if (ffd->rep_header_cache)
+ SVN_ERR(svn_cache__set(ffd->rep_header_cache, key, *rep_header,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Fetch the representation data (header, txdelta / plain windows)
+ * addressed by ENTRY->ITEM in FS and cache it if caches are enabled.
+ * Read the data from the already open FILE and the wrapping
+ * STREAM object. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+block_read_contents(svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t* entry,
+ apr_off_t max_offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ pair_cache_key_t header_key = { 0 };
+ svn_fs_fs__rep_header_t *rep_header;
+
+ header_key.revision = (apr_int32_t)entry->item.revision;
+ header_key.second = entry->item.number;
+
+ SVN_ERR(read_rep_header(&rep_header, fs, rev_file->stream, &header_key,
+ result_pool, scratch_pool));
+ SVN_ERR(block_read_windows(rep_header, fs, rev_file, entry, max_offset,
+ result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For the given REV_FILE in FS, in *STREAM return a stream covering the
+ * item specified by ENTRY. Also, verify the item's content by low-level
+ * checksum. Allocate the result in POOL.
+ */
+static svn_error_t *
+read_item(svn_stream_t **stream,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t* entry,
+ apr_pool_t *pool)
+{
+ apr_uint32_t digest;
+ svn_checksum_t *expected, *actual;
+ apr_uint32_t plain_digest;
+
+ /* Read item into string buffer. */
+ svn_stringbuf_t *text = svn_stringbuf_create_ensure(entry->size, pool);
+ text->len = entry->size;
+ text->data[text->len] = 0;
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, text->data, text->len,
+ NULL, NULL, pool));
+
+ /* Return (construct, calculate) stream and checksum. */
+ *stream = svn_stream_from_stringbuf(text, pool);
+ digest = svn__fnv1a_32x4(text->data, text->len);
+
+ /* Checksums will match most of the time. */
+ if (entry->fnv1_checksum == digest)
+ return SVN_NO_ERROR;
+
+ /* Construct proper checksum objects from their digests to allow for
+ * nice error messages. */
+ plain_digest = htonl(entry->fnv1_checksum);
+ expected = svn_checksum__from_digest_fnv1a_32x4(
+ (const unsigned char *)&plain_digest, pool);
+ plain_digest = htonl(digest);
+ actual = svn_checksum__from_digest_fnv1a_32x4(
+ (const unsigned char *)&plain_digest, pool);
+
+ /* Construct the full error message with all the info we have. */
+ return svn_checksum_mismatch_err(expected, actual, pool,
+ _("Low-level checksum mismatch while reading\n"
+ "%s bytes of meta data at offset %s "
+ "for item %s in revision %ld"),
+ apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->size),
+ apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->offset),
+ apr_psprintf(pool, "%" APR_UINT64_T_FMT, entry->item.number),
+ entry->item.revision);
+}
+
+/* If not already cached or if MUST_READ is set, read the changed paths
+ * list addressed by ENTRY in FS and retúrn it in *CHANGES. Cache the
+ * result if caching is enabled. Read the data from the already open
+ * FILE and wrapping FILE_STREAM. Use POOL for allocations.
+ */
+static svn_error_t *
+block_read_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+ if (!must_read && !ffd->changes_cache)
+ return SVN_NO_ERROR;
+
+ /* already in cache? */
+ if (!must_read && ffd->changes_cache)
+ {
+ svn_boolean_t is_cached;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->changes_cache,
+ &entry->item.revision,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read changes from revision file */
+ SVN_ERR(svn_fs_fs__read_changes(changes, stream, result_pool,
+ scratch_pool));
+
+ /* cache for future reference */
+ if (ffd->changes_cache)
+ SVN_ERR(svn_cache__set(ffd->changes_cache, &entry->item.revision,
+ *changes, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* If not already cached or if MUST_READ is set, read the nod revision
+ * addressed by ENTRY in FS and retúrn it in *NODEREV_P. Cache the
+ * result if caching is enabled. Read the data from the already open
+ * FILE and wrapping FILE_STREAM. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+block_read_noderev(node_revision_t **noderev_p,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+
+ pair_cache_key_t key = { 0 };
+ key.revision = entry->item.revision;
+ key.second = entry->item.number;
+
+ if (!must_read && !ffd->node_revision_cache)
+ return SVN_NO_ERROR;
+
+ /* already in cache? */
+ if (!must_read && ffd->node_revision_cache)
+ {
+ svn_boolean_t is_cached;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->node_revision_cache,
+ &key, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read node rev from revision file */
+ SVN_ERR(svn_fs_fs__read_noderev(noderev_p, stream,
+ result_pool, scratch_pool));
+
+ /* Workaround issue #4031: is-fresh-txn-root in revision files. */
+ (*noderev_p)->is_fresh_txn_root = FALSE;
+
+ if (ffd->node_revision_cache)
+ SVN_ERR(svn_cache__set(ffd->node_revision_cache, &key, *noderev_p,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the whole (e.g. 64kB) block containing ITEM_INDEX of REVISION in FS
+ * and put all data into cache. If necessary and depending on heuristics,
+ * neighboring blocks may also get read. The data is being read from
+ * already open REVISION_FILE, which must be the correct rev / pack file
+ * w.r.t. REVISION.
+ *
+ * For noderevs and changed path lists, the item fetched can be allocated
+ * RESULT_POOL and returned in *RESULT. Otherwise, RESULT must be NULL.
+ */
+static svn_error_t *
+block_read(void **result,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_uint64_t item_index,
+ svn_fs_fs__revision_file_t *revision_file,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_off_t offset, wanted_offset = 0;
+ apr_off_t block_start = 0;
+ apr_array_header_t *entries;
+ int run_count = 0;
+ int i;
+ apr_pool_t *iterpool;
+
+ /* Block read is an optional feature. If the caller does not want anything
+ * specific we may not have to read anything. */
+ if (!result)
+ return SVN_NO_ERROR;
+
+ iterpool = svn_pool_create(scratch_pool);
+
+ /* don't try this on transaction protorev files */
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(revision));
+
+ /* index lookup: find the OFFSET of the item we *must* read plus (in the
+ * "do-while" block) the list of items in the same block. */
+ SVN_ERR(svn_fs_fs__item_offset(&wanted_offset, fs, revision_file,
+ revision, NULL, item_index, iterpool));
+
+ offset = wanted_offset;
+
+ /* Heuristics:
+ *
+ * Read this block. If the last item crosses the block boundary, read
+ * the next block but stop there. Because cross-boundary items cause
+ * blocks to be read twice, this heuristics will limit this effect to
+ * approx. 50% of blocks, probably less, while providing a sensible
+ * amount of read-ahead.
+ */
+ do
+ {
+ /* fetch list of items in the block surrounding OFFSET */
+ block_start = offset - (offset % ffd->block_size);
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, fs, revision_file,
+ revision, block_start,
+ ffd->block_size, scratch_pool,
+ scratch_pool));
+
+ SVN_ERR(aligned_seek(fs, revision_file->file, &block_start, offset,
+ iterpool));
+
+ /* read all items from the block */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_boolean_t is_result, is_wanted;
+ apr_pool_t *pool;
+ svn_fs_fs__p2l_entry_t* entry;
+
+ svn_pool_clear(iterpool);
+
+ /* skip empty sections */
+ entry = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ continue;
+
+ /* the item / container we were looking for? */
+ is_wanted = entry->offset == wanted_offset
+ && entry->item.revision == revision
+ && entry->item.number == item_index;
+ is_result = result && is_wanted;
+
+ /* select the pool that we want the item to be allocated in */
+ pool = is_result ? result_pool : iterpool;
+
+ /* handle all items that start within this block and are relatively
+ * small (i.e. < block size). Always read the item we need to return.
+ */
+ if (is_result || ( entry->offset >= block_start
+ && entry->size < ffd->block_size))
+ {
+ void *item = NULL;
+ SVN_ERR(svn_io_file_seek(revision_file->file, APR_SET,
+ &entry->offset, iterpool));
+ switch (entry->type)
+ {
+ case SVN_FS_FS__ITEM_TYPE_FILE_REP:
+ case SVN_FS_FS__ITEM_TYPE_DIR_REP:
+ case SVN_FS_FS__ITEM_TYPE_FILE_PROPS:
+ case SVN_FS_FS__ITEM_TYPE_DIR_PROPS:
+ SVN_ERR(block_read_contents(fs, revision_file, entry,
+ is_wanted
+ ? -1
+ : block_start + ffd->block_size,
+ pool, iterpool));
+ break;
+
+ case SVN_FS_FS__ITEM_TYPE_NODEREV:
+ if (ffd->node_revision_cache || is_result)
+ SVN_ERR(block_read_noderev((node_revision_t **)&item,
+ fs, revision_file,
+ entry, is_result, pool,
+ iterpool));
+ break;
+
+ case SVN_FS_FS__ITEM_TYPE_CHANGES:
+ SVN_ERR(block_read_changes((apr_array_header_t **)&item,
+ fs, revision_file,
+ entry, is_result,
+ pool, iterpool));
+ break;
+
+ default:
+ break;
+ }
+
+ if (is_result)
+ *result = item;
+
+ /* if we crossed a block boundary, read the remainder of
+ * the last block as well */
+ offset = entry->offset + entry->size;
+ if (offset > block_start + ffd->block_size)
+ ++run_count;
+ }
+ }
+
+ }
+ while(run_count++ == 1); /* can only be true once and only if a block
+ * boundary got crossed */
+
+ /* if the caller requested a result, we must have provided one by now */
+ assert(!result || *result);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/cached_data.h b/subversion/libsvn_fs_fs/cached_data.h
new file mode 100644
index 0000000..07fa956
--- /dev/null
+++ b/subversion/libsvn_fs_fs/cached_data.h
@@ -0,0 +1,178 @@
+/* cached_data.h --- cached (read) access to FSFS data
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__CACHED_DATA_H
+#define SVN_LIBSVN_FS__CACHED_DATA_H
+
+#include "svn_pools.h"
+#include "svn_fs.h"
+
+#include "fs.h"
+
+
+
+/* Set *NODEREV_P to the node-revision for the node ID in FS. Do any
+ allocations in POOL. */
+svn_error_t *
+svn_fs_fs__get_node_revision(node_revision_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set *ROOT_ID to the node-id for the root of revision REV in
+ filesystem FS. Do any allocations in POOL. */
+svn_error_t *
+svn_fs_fs__rev_get_root(svn_fs_id_t **root_id,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Verify that representation REP in FS can be accessed. Successive calls
+ to this function should pass a non-NULL value to HINT. In that case,
+ many file open / close operations can be eliminated.
+ Do any allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__check_rep(representation_t *rep,
+ svn_fs_t *fs,
+ void **hint,
+ apr_pool_t *scratch_pool);
+
+/* Follow the representation delta chain in FS starting with REP. The
+ number of reps (including REP) in the chain will be returned in
+ *CHAIN_LENGTH. *SHARD_COUNT will be set to the number of shards
+ accessed. Do any allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__rep_chain_length(int *chain_length,
+ int *shard_count,
+ representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Set *CONTENTS to be a readable svn_stream_t that receives the text
+ representation REP as seen in filesystem FS. If CACHE_FULLTEXT is
+ not set, bypass fulltext cache lookup for this rep and don't put the
+ reconstructed fulltext into cache.
+ Use POOL for allocations. */
+svn_error_t *
+svn_fs_fs__get_contents(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ svn_boolean_t cache_fulltext,
+ apr_pool_t *pool);
+
+/* Set *CONTENTS_P to be a readable svn_stream_t that receives the text
+ representation REP as seen in filesystem FS. Read the latest element
+ of the delta chain from FILE at offset OFFSET.
+ Use POOL for allocations. */
+svn_error_t *
+svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_file_t *file,
+ apr_off_t offset,
+ apr_pool_t *pool);
+
+/* Attempt to fetch the text representation of node-revision NODEREV as
+ seen in filesystem FS and pass it along with the BATON to the PROCESSOR.
+ Set *SUCCESS only of the data could be provided and the processing
+ had been called.
+ Use POOL for all allocations.
+ */
+svn_error_t *
+svn_fs_fs__try_process_file_contents(svn_boolean_t *success,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *pool);
+
+/* Set *STREAM_P to a delta stream turning the contents of the file SOURCE into
+ the contents of the file TARGET, allocated in POOL.
+ If SOURCE is null, the empty string will be used. */
+svn_error_t *
+svn_fs_fs__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ svn_fs_t *fs,
+ node_revision_t *source,
+ node_revision_t *target,
+ apr_pool_t *pool);
+
+/* Set *ENTRIES to an apr_array_header_t of dirent structs that contain
+ the directory entries of node-revision NODEREV in filesystem FS. The
+ returned table is allocated in RESULT_POOL and entries are sorted
+ lexicographically. SCRATCH_POOL is used for temporary allocations. */
+svn_error_t *
+svn_fs_fs__rep_contents_dir(apr_array_header_t **entries_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return the directory entry from ENTRIES that matches NAME. If no such
+ entry exists, return NULL. If HINT is not NULL, set *HINT to the array
+ index of the entry returned. Successive calls in a linear scan scenario
+ will be faster called with the same HINT variable. */
+svn_fs_dirent_t *
+svn_fs_fs__find_dir_entry(apr_array_header_t *entries,
+ const char *name,
+ int *hint);
+
+/* Set *DIRENT to the entry identified by NAME in the directory given
+ by NODEREV in filesystem FS. If no such entry exits, *DIRENT will
+ be NULL. The returned object is allocated in RESULT_POOL; SCRATCH_POOL
+ used for temporary allocations. */
+svn_error_t *
+svn_fs_fs__rep_contents_dir_entry(svn_fs_dirent_t **dirent,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set *PROPLIST to be an apr_hash_t containing the property list of
+ node-revision NODEREV as seen in filesystem FS. Use POOL for
+ temporary allocations. */
+svn_error_t *
+svn_fs_fs__get_proplist(apr_hash_t **proplist,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool);
+
+/* Set *HAS_PROPS to TRUE if NODEREV has properties in FS, otherwise
+ to FALSE. Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__has_props(svn_boolean_t *has_props,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *scratch_pool);
+
+/* Fetch the list of change in revision REV in FS and return it in *CHANGES.
+ * Allocate the result in POOL.
+ */
+svn_error_t *
+svn_fs_fs__get_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/caching.c b/subversion/libsvn_fs_fs/caching.c
index 42898cb..b54d69b 100644
--- a/subversion/libsvn_fs_fs/caching.c
+++ b/subversion/libsvn_fs_fs/caching.c
@@ -25,6 +25,7 @@
#include "id.h"
#include "dag.h"
#include "tree.h"
+#include "index.h"
#include "temp_serializer.h"
#include "../libsvn_fs/fs-loader.h"
@@ -65,32 +66,18 @@ normalize_key_part(const char *original,
return normalized->data;
}
-/* Return a memcache in *MEMCACHE_P for FS if it's configured to use
- memcached, or NULL otherwise. Also, sets *FAIL_STOP to a boolean
- indicating whether cache errors should be returned to the caller or
- just passed to the FS warning handler.
-
- *CACHE_TXDELTAS, *CACHE_FULLTEXTS and *CACHE_REVPROPS flags will be set
- according to FS->CONFIG. *CACHE_NAMESPACE receives the cache prefix
- to use.
+/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS flags will be set according to
+ FS->CONFIG. *CACHE_NAMESPACE receives the cache prefix to use.
Use FS->pool for allocating the memcache and CACHE_NAMESPACE, and POOL
for temporary allocations. */
static svn_error_t *
-read_config(svn_memcache_t **memcache_p,
- svn_boolean_t *fail_stop,
- const char **cache_namespace,
+read_config(const char **cache_namespace,
svn_boolean_t *cache_txdeltas,
svn_boolean_t *cache_fulltexts,
- svn_boolean_t *cache_revprops,
svn_fs_t *fs,
apr_pool_t *pool)
{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- SVN_ERR(svn_cache__make_memcache_from_config(memcache_p, ffd->config,
- fs->pool));
-
/* No cache namespace by default. I.e. all FS instances share the
* cached data. If you specify different namespaces, the data will
* share / compete for the same cache memory but keys will not match
@@ -116,7 +103,8 @@ read_config(svn_memcache_t **memcache_p,
*cache_txdeltas
= svn_hash__get_bool(fs->config,
SVN_FS_CONFIG_FSFS_CACHE_DELTAS,
- FALSE);
+ TRUE);
+
/* by default, cache fulltexts.
* Most SVN tools care about reconstructed file content.
* Thus, this is a reasonable default.
@@ -129,13 +117,7 @@ read_config(svn_memcache_t **memcache_p,
SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
TRUE);
- /* For now, always disable revprop caching.
- */
- *cache_revprops = FALSE;
-
- return svn_config_get_bool(ffd->config, fail_stop,
- CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
- FALSE);
+ return SVN_NO_ERROR;
}
@@ -196,9 +178,10 @@ dump_cache_statistics(void *baton_void)
TRUE,
baton->pool);
- if (! err)
+ /* skip unused caches */
+ if (! err && (info.gets > 0 || info.sets > 0))
{
- text_stats = svn_cache__format_info(&info, baton->pool);
+ text_stats = svn_cache__format_info(&info, TRUE, baton->pool);
lines = svn_cstring_split(text_stats->data, "\n", FALSE, baton->pool);
for (i = 0; i < lines->nelts; ++i)
@@ -219,6 +202,29 @@ dump_cache_statistics(void *baton_void)
return result;
}
+
+static apr_status_t
+dump_global_cache_statistics(void *baton_void)
+{
+ apr_pool_t *pool = baton_void;
+
+ svn_cache__info_t *info = svn_cache__membuffer_get_global_info(pool);
+ svn_string_t *text_stats = svn_cache__format_info(info, FALSE, pool);
+ apr_array_header_t *lines = svn_cstring_split(text_stats->data, "\n",
+ FALSE, pool);
+
+ int i;
+ for (i = 0; i < lines->nelts; ++i)
+ {
+ const char *line = APR_ARRAY_IDX(lines, i, const char *);
+#ifdef SVN_DEBUG
+ SVN_DBG(("%s\n", line));
+#endif
+ }
+
+ return APR_SUCCESS;
+}
+
#endif /* SVN_DEBUG_CACHE_DUMP_STATS */
/* This function sets / registers the required callbacks for a given
@@ -267,12 +273,13 @@ init_callbacks(svn_cache__t *cache,
* Creates memcache if MEMCACHE is not NULL. Creates membuffer cache if
* MEMBUFFER is not NULL. Fallbacks to inprocess cache if MEMCACHE and
* MEMBUFFER are NULL and pages is non-zero. Sets *CACHE_P to NULL
- * otherwise.
+ * otherwise. Use the given PRIORITY class for the new cache. If it
+ * is 0, then use the default priority class.
*
* Unless NO_HANDLER is true, register an error handler that reports errors
* as warnings to the FS warning callback.
*
- * Cache is allocated in POOL.
+ * Cache is allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
* */
static svn_error_t *
create_cache(svn_cache__t **cache_p,
@@ -284,19 +291,23 @@ create_cache(svn_cache__t **cache_p,
svn_cache__deserialize_func_t deserializer,
apr_ssize_t klen,
const char *prefix,
+ apr_uint32_t priority,
svn_fs_t *fs,
svn_boolean_t no_handler,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_cache__error_handler_t error_handler = no_handler
? NULL
: warn_and_fail_on_cache_errors;
+ if (priority == 0)
+ priority = SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY;
if (memcache)
{
SVN_ERR(svn_cache__create_memcache(cache_p, memcache,
serializer, deserializer, klen,
- prefix, pool));
+ prefix, result_pool));
error_handler = no_handler
? NULL
: warn_and_continue_on_cache_errors;
@@ -305,20 +316,20 @@ create_cache(svn_cache__t **cache_p,
{
SVN_ERR(svn_cache__create_membuffer_cache(
cache_p, membuffer, serializer, deserializer,
- klen, prefix, FALSE, pool));
+ klen, prefix, priority, FALSE, result_pool, scratch_pool));
}
else if (pages)
{
SVN_ERR(svn_cache__create_inprocess(
cache_p, serializer, deserializer, klen, pages,
- items_per_page, FALSE, prefix, pool));
+ items_per_page, FALSE, prefix, result_pool));
}
else
{
*cache_p = NULL;
}
- SVN_ERR(init_callbacks(*cache_p, fs, error_handler, pool));
+ SVN_ERR(init_callbacks(*cache_p, fs, error_handler, result_pool));
return SVN_NO_ERROR;
}
@@ -332,29 +343,45 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
"fsfs:", fs->uuid,
"/", normalize_key_part(fs->path, pool),
":",
- (char *)NULL);
- svn_memcache_t *memcache;
+ SVN_VA_NULL);
svn_membuffer_t *membuffer;
- svn_boolean_t no_handler;
+ svn_boolean_t no_handler = ffd->fail_stop;
svn_boolean_t cache_txdeltas;
svn_boolean_t cache_fulltexts;
- svn_boolean_t cache_revprops;
const char *cache_namespace;
/* Evaluating the cache configuration. */
- SVN_ERR(read_config(&memcache,
- &no_handler,
- &cache_namespace,
+ SVN_ERR(read_config(&cache_namespace,
&cache_txdeltas,
&cache_fulltexts,
- &cache_revprops,
fs,
pool));
- prefix = apr_pstrcat(pool, "ns:", cache_namespace, ":", prefix, NULL);
+ prefix = apr_pstrcat(pool, "ns:", cache_namespace, ":", prefix, SVN_VA_NULL);
membuffer = svn_cache__get_global_membuffer_cache();
+ /* General rules for assigning cache priorities:
+ *
+ * - Data that can be reconstructed from other elements has low prio
+ * (e.g. fulltexts, directories etc.)
+ * - Index data required to find any of the other data has high prio
+ * (e.g. noderevs, L2P and P2L index pages)
+ * - everthing else should use default prio
+ */
+
+#ifdef SVN_DEBUG_CACHE_DUMP_STATS
+
+ /* schedule printing the global access statistics upon pool cleanup,
+ * i.e. when the repo instance gets closed / cleaned up.
+ */
+ if (membuffer)
+ apr_pool_cleanup_register(fs->pool,
+ fs->pool,
+ dump_global_cache_statistics,
+ apr_pool_cleanup_null);
+#endif
+
/* Make the cache for revision roots. For the vast majority of
* commands, this is only going to contain a few entries (svnadmin
* dump/verify is an exception here), so to reduce overhead let's
@@ -370,10 +397,11 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
svn_fs_fs__serialize_id,
svn_fs_fs__deserialize_id,
sizeof(svn_revnum_t),
- apr_pstrcat(pool, prefix, "RRI", (char *)NULL),
+ apr_pstrcat(pool, prefix, "RRI", SVN_VA_NULL),
+ 0,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* Rough estimate: revision DAG nodes have size around 320 bytes, so
* let's put 16 on a page. */
@@ -384,13 +412,14 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
svn_fs_fs__dag_serialize,
svn_fs_fs__dag_deserialize,
APR_HASH_KEY_STRING,
- apr_pstrcat(pool, prefix, "DAG", (char *)NULL),
+ apr_pstrcat(pool, prefix, "DAG", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* 1st level DAG node cache */
- ffd->dag_node_cache = svn_fs_fs__create_dag_cache(pool);
+ ffd->dag_node_cache = svn_fs_fs__create_dag_cache(fs->pool);
/* Very rough estimate: 1K per directory. */
SVN_ERR(create_cache(&(ffd->dir_cache),
@@ -399,11 +428,12 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
1024, 8,
svn_fs_fs__serialize_dir_entries,
svn_fs_fs__deserialize_dir_entries,
- APR_HASH_KEY_STRING,
- apr_pstrcat(pool, prefix, "DIR", (char *)NULL),
+ sizeof(pair_cache_key_t),
+ apr_pstrcat(pool, prefix, "DIR", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* Only 16 bytes per entry (a revision number + the corresponding offset).
Since we want ~8k pages, that means 512 entries per page. */
@@ -415,51 +445,69 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
svn_fs_fs__deserialize_manifest,
sizeof(svn_revnum_t),
apr_pstrcat(pool, prefix, "PACK-MANIFEST",
- (char *)NULL),
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* initialize node revision cache, if caching has been enabled */
SVN_ERR(create_cache(&(ffd->node_revision_cache),
NULL,
membuffer,
- 0, 0, /* Do not use inprocess cache */
+ 32, 32, /* ~200 byte / entry; 1k entries total */
svn_fs_fs__serialize_node_revision,
svn_fs_fs__deserialize_node_revision,
sizeof(pair_cache_key_t),
- apr_pstrcat(pool, prefix, "NODEREVS", (char *)NULL),
+ apr_pstrcat(pool, prefix, "NODEREVS", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, pool));
+
+ /* initialize representation header cache, if caching has been enabled */
+ SVN_ERR(create_cache(&(ffd->rep_header_cache),
+ NULL,
+ membuffer,
+ 1, 1000, /* ~8 bytes / entry; 1k entries total */
+ svn_fs_fs__serialize_rep_header,
+ svn_fs_fs__deserialize_rep_header,
+ sizeof(pair_cache_key_t),
+ apr_pstrcat(pool, prefix, "REPHEADER", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* initialize node change list cache, if caching has been enabled */
SVN_ERR(create_cache(&(ffd->changes_cache),
NULL,
membuffer,
- 0, 0, /* Do not use inprocess cache */
+ 1, 8, /* 1k / entry; 8 entries total, rarely used */
svn_fs_fs__serialize_changes,
svn_fs_fs__deserialize_changes,
sizeof(svn_revnum_t),
- apr_pstrcat(pool, prefix, "CHANGES", (char *)NULL),
+ apr_pstrcat(pool, prefix, "CHANGES", SVN_VA_NULL),
+ 0,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
/* if enabled, cache fulltext and other derived information */
if (cache_fulltexts)
{
SVN_ERR(create_cache(&(ffd->fulltext_cache),
- memcache,
+ ffd->memcache,
membuffer,
0, 0, /* Do not use inprocess cache */
/* Values are svn_stringbuf_t */
NULL, NULL,
sizeof(pair_cache_key_t),
- apr_pstrcat(pool, prefix, "TEXT", (char *)NULL),
+ apr_pstrcat(pool, prefix, "TEXT", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
SVN_ERR(create_cache(&(ffd->properties_cache),
NULL,
@@ -469,10 +517,11 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
svn_fs_fs__deserialize_properties,
sizeof(pair_cache_key_t),
apr_pstrcat(pool, prefix, "PROP",
- (char *)NULL),
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
SVN_ERR(create_cache(&(ffd->mergeinfo_cache),
NULL,
@@ -482,10 +531,11 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
svn_fs_fs__deserialize_mergeinfo,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "MERGEINFO",
- (char *)NULL),
+ SVN_VA_NULL),
+ 0,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
SVN_ERR(create_cache(&(ffd->mergeinfo_existence_cache),
NULL,
@@ -495,10 +545,11 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
NULL, NULL,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "HAS_MERGEINFO",
- (char *)NULL),
+ SVN_VA_NULL),
+ 0,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
}
else
{
@@ -508,42 +559,36 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
ffd->mergeinfo_existence_cache = NULL;
}
- /* initialize revprop cache, if full-text caching has been enabled */
- if (cache_revprops)
+ /* if enabled, cache text deltas and their combinations */
+ if (cache_txdeltas)
{
- SVN_ERR(create_cache(&(ffd->revprop_cache),
+ SVN_ERR(create_cache(&(ffd->raw_window_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
- svn_fs_fs__serialize_properties,
- svn_fs_fs__deserialize_properties,
- sizeof(pair_cache_key_t),
- apr_pstrcat(pool, prefix, "REVPROP",
- (char *)NULL),
+ svn_fs_fs__serialize_raw_window,
+ svn_fs_fs__deserialize_raw_window,
+ sizeof(window_cache_key_t),
+ apr_pstrcat(pool, prefix, "RAW_WINDOW",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
- fs->pool));
- }
- else
- {
- ffd->revprop_cache = NULL;
- }
+ fs->pool, pool));
- /* if enabled, cache text deltas and their combinations */
- if (cache_txdeltas)
- {
SVN_ERR(create_cache(&(ffd->txdelta_window_cache),
NULL,
membuffer,
0, 0, /* Do not use inprocess cache */
svn_fs_fs__serialize_txdelta_window,
svn_fs_fs__deserialize_txdelta_window,
- APR_HASH_KEY_STRING,
+ sizeof(window_cache_key_t),
apr_pstrcat(pool, prefix, "TXDELTA_WINDOW",
- (char *)NULL),
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
SVN_ERR(create_cache(&(ffd->combined_window_cache),
NULL,
@@ -551,12 +596,13 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
0, 0, /* Do not use inprocess cache */
/* Values are svn_stringbuf_t */
NULL, NULL,
- APR_HASH_KEY_STRING,
+ sizeof(window_cache_key_t),
apr_pstrcat(pool, prefix, "COMBINED_WINDOW",
- (char *)NULL),
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
fs,
no_handler,
- fs->pool));
+ fs->pool, pool));
}
else
{
@@ -564,6 +610,61 @@ svn_fs_fs__initialize_caches(svn_fs_t *fs,
ffd->combined_window_cache = NULL;
}
+ SVN_ERR(create_cache(&(ffd->l2p_header_cache),
+ NULL,
+ membuffer,
+ 64, 16, /* entry size varies but we must cover
+ a reasonable number of revisions (1k) */
+ svn_fs_fs__serialize_l2p_header,
+ svn_fs_fs__deserialize_l2p_header,
+ sizeof(pair_cache_key_t),
+ apr_pstrcat(pool, prefix, "L2P_HEADER",
+ (char *)NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, pool));
+ SVN_ERR(create_cache(&(ffd->l2p_page_cache),
+ NULL,
+ membuffer,
+ 64, 16, /* entry size varies but we must cover
+ a reasonable number of revisions (1k) */
+ svn_fs_fs__serialize_l2p_page,
+ svn_fs_fs__deserialize_l2p_page,
+ sizeof(svn_fs_fs__page_cache_key_t),
+ apr_pstrcat(pool, prefix, "L2P_PAGE",
+ (char *)NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, pool));
+ SVN_ERR(create_cache(&(ffd->p2l_header_cache),
+ NULL,
+ membuffer,
+ 4, 1, /* Large entries. Rarely used. */
+ svn_fs_fs__serialize_p2l_header,
+ svn_fs_fs__deserialize_p2l_header,
+ sizeof(pair_cache_key_t),
+ apr_pstrcat(pool, prefix, "P2L_HEADER",
+ (char *)NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, pool));
+ SVN_ERR(create_cache(&(ffd->p2l_page_cache),
+ NULL,
+ membuffer,
+ 4, 16, /* Variably sized entries. Rarely used. */
+ svn_fs_fs__serialize_p2l_page,
+ svn_fs_fs__deserialize_p2l_page,
+ sizeof(svn_fs_fs__page_cache_key_t),
+ apr_pstrcat(pool, prefix, "P2L_PAGE",
+ (char *)NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, pool));
+
return SVN_NO_ERROR;
}
@@ -575,12 +676,44 @@ struct txn_cleanup_baton_t
/* the position where to reset it */
svn_cache__t **to_reset;
+
+ /* pool that TXN_CACHE was allocated in */
+ apr_pool_t *txn_pool;
+
+ /* pool that the FS containing the TO_RESET pointer was allocator */
+ apr_pool_t *fs_pool;
};
+/* Forward declaration. */
+static apr_status_t
+remove_txn_cache_fs(void *baton_void);
+
+/* APR pool cleanup handler that will reset the cache pointer given in
+ BATON_VOID when the TXN_POOL gets cleaned up. */
+static apr_status_t
+remove_txn_cache_txn(void *baton_void)
+{
+ struct txn_cleanup_baton_t *baton = baton_void;
+
+ /* be careful not to hurt performance by resetting newer txn's caches. */
+ if (*baton->to_reset == baton->txn_cache)
+ {
+ /* This is equivalent to calling svn_fs_fs__reset_txn_caches(). */
+ *baton->to_reset = NULL;
+ }
+
+ /* It's cleaned up now. Prevent double cleanup. */
+ apr_pool_cleanup_kill(baton->fs_pool,
+ baton,
+ remove_txn_cache_fs);
+
+ return APR_SUCCESS;
+}
+
/* APR pool cleanup handler that will reset the cache pointer given in
- BATON_VOID. */
+ BATON_VOID when the FS_POOL gets cleaned up. */
static apr_status_t
-remove_txn_cache(void *baton_void)
+remove_txn_cache_fs(void *baton_void)
{
struct txn_cleanup_baton_t *baton = baton_void;
@@ -588,19 +721,25 @@ remove_txn_cache(void *baton_void)
if (*baton->to_reset == baton->txn_cache)
{
/* This is equivalent to calling svn_fs_fs__reset_txn_caches(). */
- *baton->to_reset = NULL;
+ *baton->to_reset = NULL;
}
+ /* It's cleaned up now. Prevent double cleanup. */
+ apr_pool_cleanup_kill(baton->txn_pool,
+ baton,
+ remove_txn_cache_txn);
+
return APR_SUCCESS;
}
/* This function sets / registers the required callbacks for a given
- * transaction-specific *CACHE object, if CACHE is not NULL and a no-op
- * otherwise. In particular, it will ensure that *CACHE gets reset to NULL
- * upon POOL destruction latest.
+ * transaction-specific *CACHE object in FS, if CACHE is not NULL and
+ * a no-op otherwise. In particular, it will ensure that *CACHE gets
+ * reset to NULL upon POOL or FS->POOL destruction latest.
*/
static void
-init_txn_callbacks(svn_cache__t **cache,
+init_txn_callbacks(svn_fs_t *fs,
+ svn_cache__t **cache,
apr_pool_t *pool)
{
if (*cache != NULL)
@@ -610,10 +749,20 @@ init_txn_callbacks(svn_cache__t **cache,
baton = apr_palloc(pool, sizeof(*baton));
baton->txn_cache = *cache;
baton->to_reset = cache;
+ baton->txn_pool = pool;
+ baton->fs_pool = fs->pool;
+ /* If any of these pools gets cleaned, we must reset the cache.
+ * We don't know which one will get cleaned up first, so register
+ * cleanup actions for both and during the cleanup action, unregister
+ * the respective other action. */
apr_pool_cleanup_register(pool,
baton,
- remove_txn_cache,
+ remove_txn_cache_txn,
+ apr_pool_cleanup_null);
+ apr_pool_cleanup_register(fs->pool,
+ baton,
+ remove_txn_cache_fs,
apr_pool_cleanup_null);
}
}
@@ -635,7 +784,7 @@ svn_fs_fs__initialize_txn_caches(svn_fs_t *fs,
"/", fs->path,
":", txn_id,
":", svn_uuid_generate(pool), ":",
- (char *)NULL);
+ SVN_VA_NULL);
/* We don't support caching for concurrent transactions in the SAME
* FSFS session. Maybe, you forgot to clean POOL. */
@@ -656,13 +805,14 @@ svn_fs_fs__initialize_txn_caches(svn_fs_t *fs,
svn_fs_fs__deserialize_dir_entries,
APR_HASH_KEY_STRING,
apr_pstrcat(pool, prefix, "TXNDIR",
- (char *)NULL),
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
fs,
TRUE,
- pool));
+ pool, pool));
/* reset the transaction-specific cache if the pool gets cleaned up. */
- init_txn_callbacks(&(ffd->txn_dir_cache), pool);
+ init_txn_callbacks(fs, &(ffd->txn_dir_cache), pool);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_fs_fs/dag.c b/subversion/libsvn_fs_fs/dag.c
index 3c51ffd..d21c17c 100644
--- a/subversion/libsvn_fs_fs/dag.c
+++ b/subversion/libsvn_fs_fs/dag.c
@@ -28,11 +28,12 @@
#include "svn_props.h"
#include "svn_pools.h"
+#include "cached_data.h"
#include "dag.h"
#include "fs.h"
-#include "key-gen.h"
#include "fs_fs.h"
#include "id.h"
+#include "transaction.h"
#include "../libsvn_fs/fs-loader.h"
@@ -159,10 +160,13 @@ get_node_revision(node_revision_t **noderev_p,
if (! node->node_revision)
{
node_revision_t *noderev;
+ apr_pool_t *scratch_pool = svn_pool_create(node->node_pool);
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, node->fs,
- node->id, node->node_pool));
+ node->id, node->node_pool,
+ scratch_pool));
node->node_revision = noderev;
+ svn_pool_destroy(scratch_pool);
}
/* Now NODE->node_revision is set. */
@@ -173,7 +177,7 @@ get_node_revision(node_revision_t **noderev_p,
svn_boolean_t svn_fs_fs__dag_check_mutable(const dag_node_t *node)
{
- return (svn_fs_fs__id_txn_id(svn_fs_fs__dag_get_id(node)) != NULL);
+ return svn_fs_fs__id_is_txn(svn_fs_fs__dag_get_id(node));
}
@@ -312,8 +316,9 @@ dir_entry_id_from_node(const svn_fs_id_t **id_p,
{
svn_fs_dirent_t *dirent;
- SVN_ERR(svn_fs_fs__dag_dir_entry(&dirent, parent, name, scratch_pool));
- *id_p = dirent ? svn_fs_fs__id_copy(dirent->id, result_pool) : NULL;
+ SVN_ERR(svn_fs_fs__dag_dir_entry(&dirent, parent, name, result_pool,
+ scratch_pool));
+ *id_p = dirent ? dirent->id : NULL;
return SVN_NO_ERROR;
}
@@ -332,7 +337,7 @@ set_entry(dag_node_t *parent,
const char *name,
const svn_fs_id_t *id,
svn_node_kind_t kind,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
node_revision_t *parent_noderev;
@@ -359,7 +364,7 @@ make_entry(dag_node_t **child_p,
const char *parent_path,
const char *name,
svn_boolean_t is_dir,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *new_node_id;
@@ -413,7 +418,7 @@ make_entry(dag_node_t **child_p,
svn_error_t *
-svn_fs_fs__dag_dir_entries(apr_hash_t **entries,
+svn_fs_fs__dag_dir_entries(apr_array_header_t **entries,
dag_node_t *node,
apr_pool_t *pool)
{
@@ -425,14 +430,15 @@ svn_fs_fs__dag_dir_entries(apr_hash_t **entries,
return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
_("Can't get entries of non-directory"));
- return svn_fs_fs__rep_contents_dir(entries, node->fs, noderev, pool);
+ return svn_fs_fs__rep_contents_dir(entries, node->fs, noderev, pool, pool);
}
svn_error_t *
svn_fs_fs__dag_dir_entry(svn_fs_dirent_t **dirent,
dag_node_t *node,
const char* name,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
node_revision_t *noderev;
SVN_ERR(get_node_revision(&noderev, node));
@@ -442,8 +448,8 @@ svn_fs_fs__dag_dir_entry(svn_fs_dirent_t **dirent,
_("Can't get entries of non-directory"));
/* Get a dirent hash for this directory. */
- return svn_fs_fs__rep_contents_dir_entry(dirent, node->fs,
- noderev, name, pool, pool);
+ return svn_fs_fs__rep_contents_dir_entry(dirent, node->fs, noderev, name,
+ result_pool, scratch_pool);
}
@@ -452,7 +458,7 @@ svn_fs_fs__dag_set_entry(dag_node_t *node,
const char *entry_name,
const svn_fs_id_t *id,
svn_node_kind_t kind,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
/* Check it's a directory. */
@@ -492,6 +498,42 @@ svn_fs_fs__dag_get_proplist(apr_hash_t **proplist_p,
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_fs__dag_has_props(svn_boolean_t *has_props,
+ dag_node_t *node,
+ apr_pool_t *scratch_pool)
+{
+ node_revision_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ if (! noderev->prop_rep)
+ {
+ *has_props = FALSE; /* Easy out */
+ return SVN_NO_ERROR;
+ }
+
+ if (svn_fs_fs__id_txn_used(&noderev->prop_rep->txn_id))
+ {
+ /* We are in a commit or something. Check actual properties */
+ apr_hash_t *proplist;
+
+ SVN_ERR(svn_fs_fs__get_proplist(&proplist, node->fs,
+ noderev, scratch_pool));
+
+ *has_props = proplist ? (0 < apr_hash_count(proplist)) : FALSE;
+ }
+ else
+ {
+ /* Properties are stored as a standard hash stream,
+ always ending with "END\n" (4 bytes) */
+ *has_props = (noderev->prop_rep->expanded_size > 4
+ || (noderev->prop_rep->expanded_size == 0
+ && noderev->prop_rep->size > 4));
+ }
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
svn_fs_fs__dag_set_proplist(dag_node_t *node,
@@ -606,17 +648,31 @@ svn_fs_fs__dag_revision_root(dag_node_t **node_p,
svn_revnum_t rev,
apr_pool_t *pool)
{
- svn_fs_id_t *root_id;
+ dag_node_t *new_node;
- SVN_ERR(svn_fs_fs__rev_get_root(&root_id, fs, rev, pool));
- return svn_fs_fs__dag_get_node(node_p, fs, root_id, pool);
+ /* Construct the node. */
+ new_node = apr_pcalloc(pool, sizeof(*new_node));
+ new_node->fs = fs;
+ SVN_ERR(svn_fs_fs__rev_get_root(&new_node->id, fs, rev, pool, pool));
+
+ /* Grab the contents so we can inspect the node's kind and created path. */
+ new_node->node_pool = pool;
+
+ /* Initialize the KIND and CREATED_PATH attributes */
+ new_node->kind = svn_node_dir;
+ new_node->created_path = "/";
+ new_node->fresh_root_predecessor_id = NULL;
+
+ /* Return a fresh new node */
+ *node_p = new_node;
+ return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__dag_txn_root(dag_node_t **node_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *root_id, *ignored;
@@ -629,7 +685,7 @@ svn_fs_fs__dag_txn_root(dag_node_t **node_p,
svn_error_t *
svn_fs_fs__dag_txn_base_root(dag_node_t **node_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *base_root_id, *ignored;
@@ -644,8 +700,8 @@ svn_fs_fs__dag_clone_child(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *copy_id,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
svn_boolean_t is_parent_copyroot,
apr_pool_t *pool)
{
@@ -668,6 +724,10 @@ svn_fs_fs__dag_clone_child(dag_node_t **child_p,
/* Find the node named NAME in PARENT's entries list if it exists. */
SVN_ERR(svn_fs_fs__dag_open(&cur_entry, parent, name, pool, subpool));
+ if (! cur_entry)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FOUND, NULL,
+ "Attempted to open non-existent child node '%s'", name);
/* Check for mutability in the node we found. If it's mutable, we
don't need to clone it. */
@@ -718,7 +778,7 @@ svn_fs_fs__dag_clone_child(dag_node_t **child_p,
svn_error_t *
svn_fs_fs__dag_clone_root(dag_node_t **root_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *base_root_id, *root_id;
@@ -745,7 +805,7 @@ svn_fs_fs__dag_clone_root(dag_node_t **root_p,
svn_error_t *
svn_fs_fs__dag_delete(dag_node_t *parent,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
node_revision_t *parent_noderev;
@@ -840,23 +900,22 @@ svn_fs_fs__dag_delete_if_mutable(svn_fs_t *fs,
/* Else it's mutable. Recurse on directories... */
if (node->kind == svn_node_dir)
{
- apr_hash_t *entries;
- apr_hash_index_t *hi;
+ apr_array_header_t *entries;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
- /* Loop over hash entries */
+ /* Loop over directory entries */
SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, node, pool));
if (entries)
- {
- for (hi = apr_hash_first(pool, entries);
- hi;
- hi = apr_hash_next(hi))
- {
- svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
-
- SVN_ERR(svn_fs_fs__dag_delete_if_mutable(fs, dirent->id,
- pool));
- }
- }
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__dag_delete_if_mutable(fs,
+ APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *)->id,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
}
/* ... then delete the node itself, after deleting any mutable
@@ -869,7 +928,7 @@ svn_fs_fs__dag_make_file(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
/* Call our little helper function */
@@ -882,7 +941,7 @@ svn_fs_fs__dag_make_dir(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
/* Call our little helper function */
@@ -909,7 +968,7 @@ svn_fs_fs__dag_get_contents(svn_stream_t **contents_p,
/* Get a stream to the contents. */
SVN_ERR(svn_fs_fs__get_contents(&contents, file->fs,
- noderev, pool));
+ noderev->data_rep, TRUE, pool));
*contents_p = contents;
@@ -1107,7 +1166,7 @@ svn_fs_fs__dag_serialize(void **data,
/* The deserializer will use its own pool. */
svn_temp_serializer__set_null(context,
- (const void * const *)&node->node_pool);
+ (const void * const *)&node->node_pool);
/* serialize other sub-structures */
svn_fs_fs__id_serialize(context, (const svn_fs_id_t **)&node->id);
@@ -1164,9 +1223,10 @@ svn_fs_fs__dag_open(dag_node_t **child_p,
SVN_ERR(dir_entry_id_from_node(&node_id, parent, name,
scratch_pool, scratch_pool));
if (! node_id)
- return svn_error_createf
- (SVN_ERR_FS_NOT_FOUND, NULL,
- "Attempted to open non-existent child node '%s'", name);
+ {
+ *child_p = NULL;
+ return SVN_NO_ERROR;
+ }
/* Make sure that NAME is a single path component. */
if (! svn_path_is_single_path_component(name))
@@ -1187,7 +1247,7 @@ svn_fs_fs__dag_copy(dag_node_t *to_node,
svn_boolean_t preserve_history,
svn_revnum_t from_rev,
const char *from_path,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *id;
@@ -1195,7 +1255,7 @@ svn_fs_fs__dag_copy(dag_node_t *to_node,
if (preserve_history)
{
node_revision_t *from_noderev, *to_noderev;
- const char *copy_id;
+ svn_fs_fs__id_part_t copy_id;
const svn_fs_id_t *src_id = svn_fs_fs__dag_get_id(from_node);
svn_fs_t *fs = svn_fs_fs__dag_get_fs(from_node);
@@ -1221,7 +1281,7 @@ svn_fs_fs__dag_copy(dag_node_t *to_node,
to_noderev->copyroot_path = NULL;
SVN_ERR(svn_fs_fs__create_successor(&id, fs, src_id, to_noderev,
- copy_id, txn_id, pool));
+ &copy_id, txn_id, pool));
}
else /* don't preserve history */
@@ -1242,7 +1302,9 @@ svn_error_t *
svn_fs_fs__dag_things_different(svn_boolean_t *props_changed,
svn_boolean_t *contents_changed,
dag_node_t *node1,
- dag_node_t *node2)
+ dag_node_t *node2,
+ svn_boolean_t strict,
+ apr_pool_t *pool)
{
node_revision_t *noderev1, *noderev2;
@@ -1255,16 +1317,49 @@ svn_fs_fs__dag_things_different(svn_boolean_t *props_changed,
SVN_ERR(get_node_revision(&noderev1, node1));
SVN_ERR(get_node_revision(&noderev2, node2));
- /* Compare property keys. */
- if (props_changed != NULL)
- *props_changed = (! svn_fs_fs__noderev_same_rep_key(noderev1->prop_rep,
- noderev2->prop_rep));
+ if (strict)
+ {
+ /* In strict mode, compare text and property representations in the
+ svn_fs_contents_different() / svn_fs_props_different() manner.
+
+ See the "No-op changes no longer dumped by 'svnadmin dump' in 1.9"
+ discussion (http://svn.haxx.se/dev/archive-2015-09/0269.shtml) and
+ issue #4598 (https://issues.apache.org/jira/browse/SVN-4598). */
+ svn_fs_t *fs = svn_fs_fs__dag_get_fs(node1);
+ svn_boolean_t same;
+
+ /* Compare property keys. */
+ if (props_changed != NULL)
+ {
+ SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, noderev1,
+ noderev2, pool));
+ *props_changed = !same;
+ }
- /* Compare contents keys. */
- if (contents_changed != NULL)
- *contents_changed =
- (! svn_fs_fs__noderev_same_rep_key(noderev1->data_rep,
- noderev2->data_rep));
+ /* Compare contents keys. */
+ if (contents_changed != NULL)
+ {
+ SVN_ERR(svn_fs_fs__file_text_rep_equal(&same, fs, noderev1,
+ noderev2, pool));
+ *contents_changed = !same;
+ }
+ }
+ else
+ {
+ /* Otherwise, compare representation keys -- as in Subversion 1.8. */
+
+ /* Compare property keys. */
+ if (props_changed != NULL)
+ *props_changed =
+ !svn_fs_fs__noderev_same_rep_key(noderev1->prop_rep,
+ noderev2->prop_rep);
+
+ /* Compare contents keys. */
+ if (contents_changed != NULL)
+ *contents_changed =
+ !svn_fs_fs__noderev_same_rep_key(noderev1->data_rep,
+ noderev2->data_rep);
+ }
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_fs_fs/dag.h b/subversion/libsvn_fs_fs/dag.h
index 867b025..edab6d5 100644
--- a/subversion/libsvn_fs_fs/dag.h
+++ b/subversion/libsvn_fs_fs/dag.h
@@ -27,6 +27,8 @@
#include "svn_delta.h"
#include "private/svn_cache.h"
+#include "id.h"
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -175,6 +177,12 @@ svn_error_t *svn_fs_fs__dag_get_proplist(apr_hash_t **proplist_p,
dag_node_t *node,
apr_pool_t *pool);
+/* Set *HAS_PROPS to TRUE if NODE has properties. Use SCRATCH_POOL
+ for temporary allocations */
+svn_error_t *svn_fs_fs__dag_has_props(svn_boolean_t *has_props,
+ dag_node_t *node,
+ apr_pool_t *scratch_pool);
+
/* Set the property list of NODE to PROPLIST, allocating from POOL.
The node being changed must be mutable.
@@ -224,7 +232,7 @@ svn_error_t *svn_fs_fs__dag_revision_root(dag_node_t **node_p,
for a transaction, call svn_fs_fs__dag_clone_root. */
svn_error_t *svn_fs_fs__dag_txn_root(dag_node_t **node_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -232,7 +240,7 @@ svn_error_t *svn_fs_fs__dag_txn_root(dag_node_t **node_p,
allocating from POOL. Allocate the node in TRAIL->pool. */
svn_error_t *svn_fs_fs__dag_txn_base_root(dag_node_t **node_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -242,7 +250,7 @@ svn_error_t *svn_fs_fs__dag_txn_base_root(dag_node_t **node_p,
root directory clone. Allocate *ROOT_P in POOL. */
svn_error_t *svn_fs_fs__dag_clone_root(dag_node_t **root_p,
svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -252,7 +260,8 @@ svn_error_t *svn_fs_fs__dag_clone_root(dag_node_t **root_p,
/* Open the node named NAME in the directory PARENT. Set *CHILD_P to
the new node, allocated in RESULT_POOL. NAME must be a single path
- component; it cannot be a slash-separated directory path.
+ component; it cannot be a slash-separated directory path. If NAME does
+ not exist within PARENT, set *CHILD_P to NULL.
*/
svn_error_t *
svn_fs_fs__dag_open(dag_node_t **child_p,
@@ -262,24 +271,25 @@ svn_fs_fs__dag_open(dag_node_t **child_p,
apr_pool_t *scratch_pool);
-/* Set *ENTRIES_P to a hash table of NODE's entries. The keys of the
- table are entry names, and the values are svn_fs_dirent_t's. The
- returned table (and its keys and values) is allocated in POOL,
- which is also used for temporary allocations. */
-svn_error_t *svn_fs_fs__dag_dir_entries(apr_hash_t **entries_p,
+/* Set *ENTRIES_P to an array of NODE's entries, sorted by entry names,
+ and the values are svn_fs_dirent_t's. The returned table (and elements)
+ is allocated in POOL, which is also used for temporary allocations. */
+svn_error_t *svn_fs_fs__dag_dir_entries(apr_array_header_t **entries_p,
dag_node_t *node,
apr_pool_t *pool);
/* Fetches the NODE's entries and returns a copy of the entry selected
by the key value given in NAME and set *DIRENT to a copy of that
- entry. If such entry was found, the copy will be allocated in POOL.
+ entry. If such entry was found, the copy will be allocated in
+ RESULT_POOL. Temporary data will be used in SCRATCH_POOL.
Otherwise, the *DIRENT will be set to NULL.
*/
/* ### This function is currently only called from dag.c. */
svn_error_t * svn_fs_fs__dag_dir_entry(svn_fs_dirent_t **dirent,
dag_node_t *node,
const char* name,
- apr_pool_t *pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Set ENTRY_NAME in NODE to point to ID (with kind KIND), allocating
from POOL. NODE must be a mutable directory. ID can refer to a
@@ -294,7 +304,7 @@ svn_error_t *svn_fs_fs__dag_set_entry(dag_node_t *node,
const char *entry_name,
const svn_fs_id_t *id,
svn_node_kind_t kind,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -321,8 +331,8 @@ svn_error_t *svn_fs_fs__dag_clone_child(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *copy_id,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
svn_boolean_t is_parent_copyroot,
apr_pool_t *pool);
@@ -341,7 +351,7 @@ svn_error_t *svn_fs_fs__dag_clone_child(dag_node_t **child_p,
*/
svn_error_t *svn_fs_fs__dag_delete(dag_node_t *parent,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -384,7 +394,7 @@ svn_error_t *svn_fs_fs__dag_make_dir(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -495,7 +505,7 @@ svn_error_t *svn_fs_fs__dag_make_file(dag_node_t **child_p,
dag_node_t *parent,
const char *parent_path,
const char *name,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
@@ -522,33 +532,31 @@ svn_error_t *svn_fs_fs__dag_copy(dag_node_t *to_node,
svn_boolean_t preserve_history,
svn_revnum_t from_rev,
const char *from_path,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
/* Comparison */
-/* Find out what is the same between two nodes.
+/* Find out what is the same between two nodes. If STRICT is FALSE,
+ this function may report false positives, i.e. report changes even
+ if the resulting contents / props are equal.
If PROPS_CHANGED is non-null, set *PROPS_CHANGED to 1 if the two
nodes have different property lists, or to 0 if same.
If CONTENTS_CHANGED is non-null, set *CONTENTS_CHANGED to 1 if the
- two nodes have different contents, or to 0 if same. For files,
- file contents are compared; for directories, the entries lists are
- compared. If one is a file and the other is a directory, the one's
- contents will be compared to the other's entries list. (Not
- terribly useful, I suppose, but that's the caller's business.)
-
- ### todo: This function only compares rep keys at the moment. This
- may leave us with a slight chance of a false positive, though I
- don't really see how that would happen in practice. Nevertheless,
- it should probably be fixed.
+ two nodes have different contents, or to 0 if same. NODE1 and NODE2
+ must refer to files from the same filesystem.
+
+ Use POOL for temporary allocations.
*/
svn_error_t *svn_fs_fs__dag_things_different(svn_boolean_t *props_changed,
svn_boolean_t *contents_changed,
dag_node_t *node1,
- dag_node_t *node2);
+ dag_node_t *node2,
+ svn_boolean_t strict,
+ apr_pool_t *pool);
/* Set *REV and *PATH to the copyroot revision and path of node NODE, or
diff --git a/subversion/libsvn_fs_fs/dump-index.c b/subversion/libsvn_fs_fs/dump-index.c
new file mode 100644
index 0000000..c97be10
--- /dev/null
+++ b/subversion/libsvn_fs_fs/dump-index.c
@@ -0,0 +1,90 @@
+/* dump-index.c -- implements the svn_fs_fs__dump_index private API
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+#include "private/svn_fs_fs_private.h"
+
+#include "index.h"
+#include "rev_file.h"
+#include "util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+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)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_fs__revision_file_t *rev_file;
+ int i;
+ apr_off_t offset, max_offset;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Check the FS format. */
+ if (! svn_fs_fs__use_log_addressing(fs))
+ return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL, NULL);
+
+ /* Revision & index file access object. */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, revision,
+ scratch_pool, iterpool));
+
+ /* Offset range to cover. */
+ SVN_ERR(svn_fs_fs__p2l_get_max_offset(&max_offset, fs, rev_file, revision,
+ scratch_pool));
+
+ /* Walk through all P2L index entries in offset order. */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+
+ /* Read entries for the next block. There will be no overlaps since
+ * we start at the first offset not covered. */
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, fs, rev_file, revision,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+
+ /* Print entries for this block, one line per entry. */
+ for (i = 0; i < entries->nelts && offset < max_offset; ++i)
+ {
+ const svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t);
+ offset = entry->offset + entry->size;
+
+ /* Cancellation support */
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Invoke processing callback. */
+ SVN_ERR(callback_func(entry, callback_baton, iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/fs.c b/subversion/libsvn_fs_fs/fs.c
index d0ba734..1978798 100644
--- a/subversion/libsvn_fs_fs/fs.c
+++ b/subversion/libsvn_fs_fs/fs.c
@@ -37,11 +37,17 @@
#include "fs_fs.h"
#include "tree.h"
#include "lock.h"
+#include "hotcopy.h"
#include "id.h"
+#include "pack.h"
+#include "recovery.h"
#include "rep-cache.h"
+#include "revprops.h"
+#include "transaction.h"
+#include "util.h"
+#include "verify.h"
#include "svn_private_config.h"
#include "private/svn_fs_util.h"
-#include "private/svn_subr_private.h"
#include "../libsvn_fs/fs-loader.h"
@@ -51,6 +57,9 @@
+/* Initialize the part of FS that requires global serialization across all
+ instances. The caller is responsible of ensuring that serialization.
+ Use COMMON_POOL for process-wide and POOL for temporary allocations. */
static svn_error_t *
fs_serialized_init(svn_fs_t *fs, apr_pool_t *common_pool, apr_pool_t *pool)
{
@@ -64,20 +73,29 @@ fs_serialized_init(svn_fs_t *fs, apr_pool_t *common_pool, apr_pool_t *pool)
each separate repository opened during the lifetime of the
svn_fs_initialize pool. It's unlikely that anyone will notice
the modest expenditure; the alternative is to allocate each structure
- in a subpool, add a reference-count, and add a serialized deconstructor
+ in a subpool, add a reference-count, and add a serialized destructor
to the FS vtable. That's more machinery than it's worth.
- Using the uuid to obtain the lock creates a corner case if a
- caller uses svn_fs_set_uuid on the repository in a process where
- other threads might be using the same repository through another
- FS object. The only real-world consumer of svn_fs_set_uuid is
- "svnadmin load", so this is a low-priority problem, and we don't
- know of a better way of associating such data with the
- repository. */
+ Picking an appropriate key for the shared data is tricky, because,
+ unfortunately, a filesystem UUID is not really unique. It is implicitly
+ shared between hotcopied (1), dump / loaded (2) or naively copied (3)
+ filesystems. We tackle this problem by using a combination of the UUID
+ and an instance ID as the key. This allows us to avoid key clashing
+ in (1) and (2) for formats >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT, which
+ do support instance IDs. For old formats the shared data (locks, shared
+ transaction data, ...) will still clash.
+
+ Speaking of (3), there is not so much we can do about it, except maybe
+ provide a convenient way of fixing things. Naively copied filesystems
+ have identical filesystem UUIDs *and* instance IDs. With the key being
+ a combination of these two, clashes can be fixed by changing either of
+ them (or both), e.g. with svn_fs_set_uuid(). */
SVN_ERR_ASSERT(fs->uuid);
- key = apr_pstrcat(pool, SVN_FSFS_SHARED_USERDATA_PREFIX, fs->uuid,
- (char *) NULL);
+ SVN_ERR_ASSERT(ffd->instance_id);
+
+ key = apr_pstrcat(pool, SVN_FSFS_SHARED_USERDATA_PREFIX,
+ fs->uuid, ":", ffd->instance_id, SVN_VA_NULL);
status = apr_pool_userdata_get(&val, key, common_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't fetch FSFS shared data"));
@@ -94,15 +112,17 @@ fs_serialized_init(svn_fs_t *fs, apr_pool_t *common_pool, apr_pool_t *pool)
SVN_ERR(svn_mutex__init(&ffsd->fs_write_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
+ /* ... the pack lock ... */
+ SVN_ERR(svn_mutex__init(&ffsd->fs_pack_lock,
+ SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
+
/* ... not to mention locking the txn-current file. */
SVN_ERR(svn_mutex__init(&ffsd->txn_current_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* We also need a mutex for synchronizing access to the active
- transaction list and free transaction pointer. This one is
- enabled unconditionally. */
- SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock,
- TRUE, common_pool));
+ transaction list and free transaction pointer. */
+ SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock, TRUE, common_pool));
key = apr_pstrdup(common_pool, key);
status = apr_pool_userdata_set(ffsd, key, NULL, common_pool);
@@ -143,9 +163,21 @@ fs_freeze_body(void *baton,
SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, b->fs, pool));
if (exists)
- SVN_ERR(svn_fs_fs__lock_rep_cache(b->fs, pool));
+ SVN_ERR(svn_fs_fs__with_rep_cache_lock(b->fs,
+ b->freeze_func, b->freeze_baton,
+ pool));
+ else
+ SVN_ERR(b->freeze_func(b->freeze_baton, pool));
+
+ return SVN_NO_ERROR;
+}
- SVN_ERR(b->freeze_func(b->freeze_baton, pool));
+static svn_error_t *
+fs_freeze_body2(void *baton,
+ apr_pool_t *pool)
+{
+ struct fs_freeze_baton_t *b = baton;
+ SVN_ERR(svn_fs_fs__with_write_lock(b->fs, fs_freeze_body, baton, pool));
return SVN_NO_ERROR;
}
@@ -156,6 +188,7 @@ fs_freeze(svn_fs_t *fs,
void *freeze_baton,
apr_pool_t *pool)
{
+ fs_fs_data_t *ffd = fs->fsap_data;
struct fs_freeze_baton_t b;
b.fs = fs;
@@ -163,20 +196,52 @@ fs_freeze(svn_fs_t *fs,
b.freeze_baton = freeze_baton;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
- SVN_ERR(svn_fs_fs__with_write_lock(fs, fs_freeze_body, &b, pool));
+
+ if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
+ SVN_ERR(svn_fs_fs__with_pack_lock(fs, fs_freeze_body2, &b, pool));
+ else
+ SVN_ERR(fs_freeze_body2(&b, pool));
return SVN_NO_ERROR;
}
+static svn_error_t *
+fs_info(const void **fsfs_info,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_fsfs_info_t *info = apr_palloc(result_pool, sizeof(*info));
+ info->fs_type = SVN_FS_TYPE_FSFS;
+ info->shard_size = ffd->max_files_per_dir;
+ info->min_unpacked_rev = ffd->min_unpacked_rev;
+ info->log_addressing = ffd->use_log_addressing;
+ *fsfs_info = info;
+ return SVN_NO_ERROR;
+}
+
+/* Wrapper around svn_fs_fs__set_uuid() adapting between function
+ signatures. */
+static svn_error_t *
+fs_set_uuid(svn_fs_t *fs,
+ const char *uuid,
+ apr_pool_t *pool)
+{
+ /* Whenever we set a new UUID, imply that FS will also be a different
+ * instance (on formats that support this). */
+ return svn_error_trace(svn_fs_fs__set_uuid(fs, uuid, NULL, pool));
+}
+
/* The vtable associated with a specific open filesystem. */
static fs_vtable_t fs_vtable = {
svn_fs_fs__youngest_rev,
svn_fs_fs__revision_prop,
- svn_fs_fs__revision_proplist,
+ svn_fs_fs__get_revision_proplist,
svn_fs_fs__change_rev_prop,
- svn_fs_fs__set_uuid,
+ fs_set_uuid,
svn_fs_fs__revision_root,
svn_fs_fs__begin_txn,
svn_fs_fs__open_txn,
@@ -188,6 +253,9 @@ static fs_vtable_t fs_vtable = {
svn_fs_fs__unlock,
svn_fs_fs__get_lock,
svn_fs_fs__get_locks,
+ svn_fs_fs__info_format,
+ svn_fs_fs__info_config_files,
+ fs_info,
svn_fs_fs__verify_root,
fs_freeze,
fs_set_errcall
@@ -201,17 +269,31 @@ static svn_error_t *
initialize_fs_struct(svn_fs_t *fs)
{
fs_fs_data_t *ffd = apr_pcalloc(fs->pool, sizeof(*ffd));
+ ffd->use_log_addressing = FALSE;
+
fs->vtable = &fs_vtable;
fs->fsap_data = ffd;
return SVN_NO_ERROR;
}
+/* Reset vtable and fsap_data fields in FS such that the FS is basically
+ * closed now. Note that FS must not hold locks when you call this. */
+static void
+uninitialize_fs_struct(svn_fs_t *fs)
+{
+ fs->vtable = NULL;
+ fs->fsap_data = NULL;
+}
+
/* This implements the fs_library_vtable_t.create() API. Create a new
fsfs-backed Subversion filesystem at path PATH and link it into
*FS. Perform temporary allocations in POOL, and fs-global allocations
- in COMMON_POOL. */
+ in COMMON_POOL. The latter must be serialized using COMMON_POOL_LOCK. */
static svn_error_t *
-fs_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+fs_create(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
SVN_ERR(svn_fs__check_fs(fs, FALSE));
@@ -221,7 +303,10 @@ fs_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
SVN_ERR(svn_fs_fs__create(fs, path, pool));
SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
- return fs_serialized_init(fs, common_pool, pool);
+ SVN_MUTEX__WITH_LOCK(common_pool_lock,
+ fs_serialized_init(fs, common_pool, pool));
+
+ return SVN_NO_ERROR;
}
@@ -231,17 +316,30 @@ fs_create(svn_fs_t *fs, const char *path, apr_pool_t *pool,
/* This implements the fs_library_vtable_t.open() API. Open an FSFS
Subversion filesystem located at PATH, set *FS to point to the
correct vtable for the filesystem. Use POOL for any temporary
- allocations, and COMMON_POOL for fs-global allocations. */
+ allocations, and COMMON_POOL for fs-global allocations.
+ The latter must be serialized using COMMON_POOL_LOCK. */
static svn_error_t *
-fs_open(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+fs_open(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ SVN_ERR(svn_fs__check_fs(fs, FALSE));
+
SVN_ERR(initialize_fs_struct(fs));
- SVN_ERR(svn_fs_fs__open(fs, path, pool));
+ SVN_ERR(svn_fs_fs__open(fs, path, subpool));
- SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
- return fs_serialized_init(fs, common_pool, pool);
+ SVN_ERR(svn_fs_fs__initialize_caches(fs, subpool));
+ SVN_MUTEX__WITH_LOCK(common_pool_lock,
+ fs_serialized_init(fs, common_pool, subpool));
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
}
@@ -250,40 +348,79 @@ fs_open(svn_fs_t *fs, const char *path, apr_pool_t *pool,
static svn_error_t *
fs_open_for_recovery(svn_fs_t *fs,
const char *path,
- apr_pool_t *pool, apr_pool_t *common_pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
+ svn_error_t * err;
+ svn_revnum_t youngest_rev;
+ apr_pool_t * subpool = svn_pool_create(pool);
+
/* Recovery for FSFS is currently limited to recreating the 'current'
file from the latest revision. */
/* The only thing we have to watch out for is that the 'current' file
- might not exist. So we'll try to create it here unconditionally,
- and just ignore any errors that might indicate that it's already
- present. (We'll need it to exist later anyway as a source for the
- new file's permissions). */
+ might not exist or contain garbage. So we'll try to read it here
+ and provide or replace the existing file if we couldn't read it.
+ (We'll also need it to exist later anyway as a source for the new
+ file's permissions). */
- /* Use a partly-filled fs pointer first to create 'current'. This will fail
- if 'current' already exists, but we don't care about that. */
+ /* Use a partly-filled fs pointer first to create 'current'. */
fs->path = apr_pstrdup(fs->pool, path);
- svn_error_clear(svn_io_file_create(svn_fs_fs__path_current(fs, pool),
- "0 1 1\n", pool));
+
+ SVN_ERR(initialize_fs_struct(fs));
+
+ /* Figure out the repo format and check that we can even handle it. */
+ SVN_ERR(svn_fs_fs__read_format_file(fs, subpool));
+
+ /* Now, read 'current' and try to patch it if necessary. */
+ err = svn_fs_fs__youngest_rev(&youngest_rev, fs, subpool);
+ if (err)
+ {
+ const char *file_path;
+
+ /* 'current' file is missing or contains garbage. Since we are trying
+ * to recover from whatever problem there is, being picky about the
+ * error code here won't do us much good. If there is a persistent
+ * problem that we can't fix, it will show up when we try rewrite the
+ * file a few lines further below and we will report the failure back
+ * to the caller.
+ *
+ * Start recovery with HEAD = 0. */
+ svn_error_clear(err);
+ file_path = svn_fs_fs__path_current(fs, subpool);
+
+ /* Best effort to ensure the file exists and is valid.
+ * This may fail for r/o filesystems etc. */
+ SVN_ERR(svn_io_remove_file2(file_path, TRUE, subpool));
+ SVN_ERR(svn_io_file_create_empty(file_path, subpool));
+ SVN_ERR(svn_fs_fs__write_current(fs, 0, 1, 1, subpool));
+ }
+
+ uninitialize_fs_struct(fs);
+ svn_pool_destroy(subpool);
/* Now open the filesystem properly by calling the vtable method directly. */
- return fs_open(fs, path, pool, common_pool);
+ return fs_open(fs, path, common_pool_lock, pool, common_pool);
}
/* This implements the fs_library_vtable_t.upgrade_fs() API. */
static svn_error_t *
-fs_upgrade(svn_fs_t *fs, const char *path, apr_pool_t *pool,
+fs_upgrade(svn_fs_t *fs,
+ const char *path,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(fs, FALSE));
- SVN_ERR(initialize_fs_struct(fs));
- SVN_ERR(svn_fs_fs__open(fs, path, pool));
- SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
- SVN_ERR(fs_serialized_init(fs, common_pool, pool));
- return svn_fs_fs__upgrade(fs, pool);
+ SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
+ return svn_fs_fs__upgrade(fs, notify_func, notify_baton,
+ cancel_func, cancel_baton, pool);
}
static svn_error_t *
@@ -294,14 +431,11 @@ fs_verify(svn_fs_t *fs, const char *path,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(fs, FALSE));
- SVN_ERR(initialize_fs_struct(fs));
- SVN_ERR(svn_fs_fs__open(fs, path, pool));
- SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
- SVN_ERR(fs_serialized_init(fs, common_pool, pool));
+ SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
return svn_fs_fs__verify(fs, start, end, notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
@@ -313,15 +447,12 @@ fs_pack(svn_fs_t *fs,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(fs, FALSE));
- SVN_ERR(initialize_fs_struct(fs));
- SVN_ERR(svn_fs_fs__open(fs, path, pool));
- SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
- SVN_ERR(fs_serialized_init(fs, common_pool, pool));
- return svn_fs_fs__pack(fs, notify_func, notify_baton,
+ SVN_ERR(fs_open(fs, path, common_pool_lock, pool, common_pool));
+ return svn_fs_fs__pack(fs, 0, notify_func, notify_baton,
cancel_func, cancel_baton, pool);
}
@@ -333,7 +464,8 @@ fs_pack(svn_fs_t *fs,
DST_FS at DEST_PATH. If INCREMENTAL is TRUE, make an effort not to
re-copy data which already exists in DST_FS.
The CLEAN_LOGS argument is ignored and included for Subversion
- 1.0.x compatibility. Perform all temporary allocations in POOL. */
+ 1.0.x compatibility. Indicate progress via the optional NOTIFY_FUNC
+ callback using NOTIFY_BATON. Perform all temporary allocations in POOL. */
static svn_error_t *
fs_hotcopy(svn_fs_t *src_fs,
svn_fs_t *dst_fs,
@@ -341,24 +473,36 @@ fs_hotcopy(svn_fs_t *src_fs,
const char *dst_path,
svn_boolean_t clean_logs,
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 *pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(src_fs, FALSE));
- SVN_ERR(initialize_fs_struct(src_fs));
- SVN_ERR(svn_fs_fs__open(src_fs, src_path, pool));
- SVN_ERR(svn_fs_fs__initialize_caches(src_fs, pool));
- SVN_ERR(fs_serialized_init(src_fs, pool, pool));
-
- SVN_ERR(svn_fs__check_fs(dst_fs, FALSE));
+ /* Open the source repo as usual. */
+ SVN_ERR(fs_open(src_fs, src_path, common_pool_lock, pool, common_pool));
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Test target repo when in INCREMENTAL mode, initialize it when not.
+ * For this, we need our FS internal data structures to be temporarily
+ * available. */
SVN_ERR(initialize_fs_struct(dst_fs));
- /* In INCREMENTAL mode, svn_fs_fs__hotcopy() will open DST_FS.
- Otherwise, it's not an FS yet --- possibly just an empty dir --- so
- can't be opened.
- */
- return svn_fs_fs__hotcopy(src_fs, dst_fs, src_path, dst_path,
- incremental, cancel_func, cancel_baton, pool);
+ SVN_ERR(svn_fs_fs__hotcopy_prepare_target(src_fs, dst_fs, dst_path,
+ incremental, pool));
+ uninitialize_fs_struct(dst_fs);
+
+ /* Now, the destination repo should open just fine. */
+ SVN_ERR(fs_open(dst_fs, dst_path, common_pool_lock, pool, common_pool));
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Now, we may copy data as needed ... */
+ return svn_fs_fs__hotcopy(src_fs, dst_fs, incremental,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, pool);
}
@@ -389,7 +533,7 @@ fs_delete_fs(const char *path,
apr_pool_t *pool)
{
/* Remove everything. */
- return svn_io_remove_dir2(path, FALSE, NULL, NULL, pool);
+ return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
}
static const svn_version_t *
@@ -409,6 +553,7 @@ fs_set_svn_fs_open(svn_fs_t *fs,
svn_error_t *(*svn_fs_open_)(svn_fs_t **,
const char *,
apr_hash_t *,
+ apr_pool_t *,
apr_pool_t *))
{
fs_fs_data_t *ffd = fs->fsap_data;
@@ -416,6 +561,15 @@ fs_set_svn_fs_open(svn_fs_t *fs,
return SVN_NO_ERROR;
}
+static void *
+fs_info_dup(const void *fsfs_info_void,
+ apr_pool_t *result_pool)
+{
+ /* All fields are either ints or static strings. */
+ const svn_fs_fsfs_info_t *fsfs_info = fsfs_info_void;
+ return apr_pmemdup(result_pool, fsfs_info, sizeof(*fsfs_info));
+}
+
/* Base FS library vtable, used by the FS loader library. */
@@ -433,7 +587,8 @@ static fs_library_vtable_t library_vtable = {
fs_pack,
fs_logfiles,
NULL /* parse_id */,
- fs_set_svn_fs_open
+ fs_set_svn_fs_open,
+ fs_info_dup
};
svn_error_t *
@@ -444,6 +599,7 @@ svn_fs_fs__init(const svn_version_t *loader_version,
{
{ "svn_subr", svn_subr_version },
{ "svn_delta", svn_delta_version },
+ { "svn_fs_util", svn_fs_util__version },
{ NULL, NULL }
};
diff --git a/subversion/libsvn_fs_fs/fs.h b/subversion/libsvn_fs_fs/fs.h
index 5cdc270..c75eafb 100644
--- a/subversion/libsvn_fs_fs/fs.h
+++ b/subversion/libsvn_fs_fs/fs.h
@@ -26,6 +26,8 @@
#include <apr_pools.h>
#include <apr_hash.h>
#include <apr_network_io.h>
+#include <apr_md5.h>
+#include <apr_sha1.h>
#include "svn_fs.h"
#include "svn_config.h"
@@ -34,7 +36,8 @@
#include "private/svn_fs_private.h"
#include "private/svn_sqlite.h"
#include "private/svn_mutex.h"
-#include "private/svn_named_atomic.h"
+
+#include "id.h"
#ifdef __cplusplus
extern "C" {
@@ -51,9 +54,11 @@ extern "C" {
#define PATH_UUID "uuid" /* Contains UUID */
#define PATH_CURRENT "current" /* Youngest revision */
#define PATH_LOCK_FILE "write-lock" /* Revision lock file */
+#define PATH_PACK_LOCK_FILE "pack-lock" /* Pack lock file */
#define PATH_REVS_DIR "revs" /* Directory of revisions */
#define PATH_REVPROPS_DIR "revprops" /* Directory of revprops */
-#define PATH_TXNS_DIR "transactions" /* Directory of transactions */
+#define PATH_TXNS_DIR "transactions" /* Directory of transactions in
+ repos w/o log addressing */
#define PATH_NODE_ORIGINS_DIR "node-origins" /* Lazy node-origin cache */
#define PATH_TXN_PROTOS_DIR "txn-protorevs" /* Directory of proto-revs */
#define PATH_TXN_CURRENT "txn-current" /* File with next txn key */
@@ -67,12 +72,18 @@ extern "C" {
#define PATH_PACKED "pack" /* Packed revision data file */
#define PATH_EXT_PACKED_SHARD ".pack" /* Extension for packed
shards */
+#define PATH_EXT_L2P_INDEX ".l2p" /* extension of the log-
+ to-phys index */
+#define PATH_EXT_P2L_INDEX ".p2l" /* extension of the phys-
+ to-log index */
/* If you change this, look at tests/svn_test_fs.c(maybe_install_fsfs_conf) */
#define PATH_CONFIG "fsfs.conf" /* Configuration */
/* Names of special files and file extensions for transactions */
#define PATH_CHANGES "changes" /* Records changes made so far */
#define PATH_TXN_PROPS "props" /* Transaction properties */
+#define PATH_TXN_PROPS_FINAL "props-final" /* Final transaction properties
+ before moving to revprops */
#define PATH_NEXT_IDS "next-ids" /* Next temporary ID assignments */
#define PATH_PREFIX_NODE "node." /* Prefix for node filename */
#define PATH_EXT_TXN ".txn" /* Extension of txn dir */
@@ -80,6 +91,10 @@ extern "C" {
#define PATH_EXT_PROPS ".props" /* Extension for node props */
#define PATH_EXT_REV ".rev" /* Extension of protorev file */
#define PATH_EXT_REV_LOCK ".rev-lock" /* Extension of protorev lock file */
+#define PATH_TXN_ITEM_INDEX "itemidx" /* File containing the current item
+ index number */
+#define PATH_INDEX "index" /* name of index files w/o ext */
+
/* Names of files in legacy FS formats */
#define PATH_REV "rev" /* Proto rev file */
#define PATH_REV_LOCK "rev-lock" /* Proto rev (write) lock file */
@@ -94,14 +109,25 @@ extern "C" {
#define CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION "enable-props-deltification"
#define CONFIG_OPTION_MAX_DELTIFICATION_WALK "max-deltification-walk"
#define CONFIG_OPTION_MAX_LINEAR_DELTIFICATION "max-linear-deltification"
+#define CONFIG_OPTION_COMPRESSION_LEVEL "compression-level"
#define CONFIG_SECTION_PACKED_REVPROPS "packed-revprops"
#define CONFIG_OPTION_REVPROP_PACK_SIZE "revprop-pack-size"
#define CONFIG_OPTION_COMPRESS_PACKED_REVPROPS "compress-packed-revprops"
+#define CONFIG_SECTION_IO "io"
+#define CONFIG_OPTION_BLOCK_SIZE "block-size"
+#define CONFIG_OPTION_L2P_PAGE_SIZE "l2p-page-size"
+#define CONFIG_OPTION_P2L_PAGE_SIZE "p2l-page-size"
+#define CONFIG_SECTION_DEBUG "debug"
+#define CONFIG_OPTION_PACK_AFTER_COMMIT "pack-after-commit"
/* The format number of this filesystem.
This is independent of the repository format number, and
- independent of any other FS back ends. */
-#define SVN_FS_FS__FORMAT_NUMBER 6
+ independent of any other FS back ends.
+
+ Note: If you bump this, please update the switch statement in
+ svn_fs_fs__create() as well.
+ */
+#define SVN_FS_FS__FORMAT_NUMBER 7
/* The minimum format number that supports svndiff version 1. */
#define SVN_FS_FS__MIN_SVNDIFF1_FORMAT 2
@@ -144,9 +170,31 @@ extern "C" {
/* The minimum format number that supports packed revprops. */
#define SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT 6
+/* The minimum format number that supports packed revprops. */
+#define SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT 7
+
+/* Minimum format number that providing a separate lock file for pack ops */
+#define SVN_FS_FS__MIN_PACK_LOCK_FORMAT 7
+
+/* Minimum format number that stores mergeinfo-mode flag in changed paths */
+#define SVN_FS_FS__MIN_MERGEINFO_IN_CHANGED_FORMAT 7
+
+/* Minimum format number that supports per-instance filesystem IDs. */
+#define SVN_FS_FS__MIN_INSTANCE_ID_FORMAT 7
+
/* The minimum format number that supports a configuration file (fsfs.conf) */
#define SVN_FS_FS__MIN_CONFIG_FILE 4
+/* On most operating systems apr implements file locks per process, not
+ per file. On Windows apr implements the locking as per file handle
+ locks, so we don't have to add our own mutex for just in-process
+ synchronization. */
+#if APR_HAS_THREADS && !defined(WIN32)
+#define SVN_FS_FS__USE_LOCK_MUTEX 1
+#else
+#define SVN_FS_FS__USE_LOCK_MUTEX 0
+#endif
+
/* Private FSFS-specific data shared between all svn_txn_t objects that
relate to a particular transaction in a filesystem (as identified
by transaction id and filesystem UUID). Objects of this type are
@@ -157,13 +205,8 @@ typedef struct fs_fs_shared_txn_data_t
transaction. */
struct fs_fs_shared_txn_data_t *next;
- /* This transaction's ID. For repositories whose format is less
- than SVN_FS_FS__MIN_TXN_CURRENT_FORMAT, the ID is in the form
- <rev>-<uniqueifier>, where <uniqueifier> runs from 0-99999 (see
- create_txn_dir_pre_1_5() in fs_fs.c). For newer repositories,
- the form is <rev>-<200 digit base 36 number> (see
- create_txn_dir() in fs_fs.c). */
- char txn_id[SVN_FS__TXN_MAX_LEN+1];
+ /* ID of this transaction. */
+ svn_fs_fs__id_part_t txn_id;
/* Whether the transaction's prototype revision file is locked for
writing by any thread in this process (including the current
@@ -176,17 +219,6 @@ typedef struct fs_fs_shared_txn_data_t
apr_pool_t *pool;
} fs_fs_shared_txn_data_t;
-/* On most operating systems apr implements file locks per process, not
- per file. On Windows apr implements the locking as per file handle
- locks, so we don't have to add our own mutex for just in-process
- synchronization. */
-/* Compare ../libsvn_subr/named_atomic.c:USE_THREAD_MUTEX */
-#if APR_HAS_THREADS && !defined(WIN32)
-#define SVN_FS_FS__USE_LOCK_MUTEX 1
-#else
-#define SVN_FS_FS__USE_LOCK_MUTEX 0
-#endif
-
/* Private FSFS-specific data shared between all svn_fs_t objects that
relate to a particular filesystem, as identified by filesystem UUID.
Objects of this type are allocated in the common pool. */
@@ -202,6 +234,12 @@ typedef struct fs_fs_shared_data_t
Access to this object is synchronised under TXN_LIST_LOCK. */
fs_fs_shared_txn_data_t *free_txn;
+ /* The following lock must be taken out in reverse order of their
+ declaration here. Any subset may be acquired and held at any given
+ time but their relative acquisition order must not change.
+
+ (lock 'txn-current' before 'pack' before 'write' before 'txn-list') */
+
/* A lock for intra-process synchronization when accessing the TXNS list. */
svn_mutex__t *txn_list_lock;
@@ -209,6 +247,10 @@ typedef struct fs_fs_shared_data_t
repository write lock. */
svn_mutex__t *fs_write_lock;
+ /* A lock for intra-process synchronization when grabbing the
+ repository pack operation lock. */
+ svn_mutex__t *fs_pack_lock;
+
/* A lock for intra-process synchronization when locking the
txn-current file. */
svn_mutex__t *txn_current_lock;
@@ -221,34 +263,76 @@ typedef struct fs_fs_shared_data_t
/* Data structure for the 1st level DAG node cache. */
typedef struct fs_fs_dag_cache_t fs_fs_dag_cache_t;
-/* Key type for all caches that use revision + offset / counter as key. */
+/* Key type for all caches that use revision + offset / counter as key.
+
+ Note: Cache keys should be 16 bytes for best performance and there
+ should be no padding. */
typedef struct pair_cache_key_t
{
- svn_revnum_t revision;
+ /* The object's revision. Use the 64 data type to prevent padding. */
+ apr_int64_t revision;
+ /* Sub-address: item index, revprop generation, packed flag, etc. */
apr_int64_t second;
} pair_cache_key_t;
+/* Key type that identifies a txdelta window.
+
+ Note: Cache keys should require no padding. */
+typedef struct window_cache_key_t
+{
+ /* The object's revision. Use the 64 data type to prevent padding. */
+ apr_int64_t revision;
+
+ /* Window number within that representation. */
+ apr_int64_t chunk_index;
+
+ /* Item index of the representation */
+ apr_uint64_t item_index;
+} window_cache_key_t;
+
/* Private (non-shared) FSFS-specific data for each svn_fs_t object.
Any caches in here may be NULL. */
typedef struct fs_fs_data_t
{
/* The format number of this FS. */
int format;
+
/* The maximum number of files to store per directory (for sharded
layouts) or zero (for linear layouts). */
int max_files_per_dir;
+ /* If set, this FS is using logical addressing. Otherwise, it is using
+ physical addressing. */
+ svn_boolean_t use_log_addressing;
+
+ /* Rev / pack file read granularity in bytes. */
+ apr_int64_t block_size;
+
+ /* Capacity in entries of log-to-phys index pages */
+ apr_int64_t l2p_page_size;
+
+ /* Rev / pack file granularity (in bytes) covered by a single phys-to-log
+ * index page. */
+ apr_int64_t p2l_page_size;
+
+ /* If set, parse and cache *all* data of each block that we read
+ * (not just the one bit that we need, atm). */
+ svn_boolean_t use_block_read;
+
/* The revision that was youngest, last time we checked. */
svn_revnum_t youngest_rev_cache;
- /* The fsfs.conf file, parsed. Allocated in FS->pool. */
- svn_config_t *config;
-
- /* Caches of immutable data. (Note that if these are created with
- svn_cache__create_memcache, the data can be shared between
+ /* Caches of immutable data. (Note that these may be shared between
multiple svn_fs_t's for the same filesystem.) */
+ /* Access to the configured memcached instances. May be NULL. */
+ svn_memcache_t *memcache;
+
+ /* If TRUE, don't ignore any cache-related errors. If FALSE, errors from
+ e.g. memcached may be ignored as caching is an optional feature. */
+ svn_boolean_t fail_stop;
+
/* A cache of revision root IDs, mapping from (svn_revnum_t *) to
(svn_fs_id_t *). (Not threadsafe.) */
svn_cache__t *rev_root_id_cache;
@@ -269,21 +353,6 @@ typedef struct fs_fs_data_t
rep key (revision/offset) to svn_stringbuf_t. */
svn_cache__t *fulltext_cache;
- /* Access object to the atomics namespace used by revprop caching.
- Will be NULL until the first access. */
- svn_atomic_namespace__t *revprop_namespace;
-
- /* Access object to the revprop "generation". Will be NULL until
- the first access. */
- svn_named_atomic__t *revprop_generation;
-
- /* Access object to the revprop update timeout. Will be NULL until
- the first access. */
- svn_named_atomic__t *revprop_timeout;
-
- /* Revision property cache. Maps from (rev,generation) to apr_hash_t. */
- svn_cache__t *revprop_cache;
-
/* Node properties cache. Maps from rep key to apr_hash_t. */
svn_cache__t *properties_cache;
@@ -293,20 +362,28 @@ typedef struct fs_fs_data_t
respective pack file. */
svn_cache__t *packed_offset_cache;
- /* Cache for txdelta_window_t objects; the key is (revFilePath, offset) */
+ /* Cache for svn_fs_fs__raw_cached_window_t objects; the key is
+ window_cache_key_t. */
+ svn_cache__t *raw_window_cache;
+
+ /* Cache for txdelta_window_t objects; the key is window_cache_key_t */
svn_cache__t *txdelta_window_cache;
/* Cache for combined windows as svn_stringbuf_t objects;
- the key is (revFilePath, offset) */
+ the key is window_cache_key_t */
svn_cache__t *combined_window_cache;
- /* Cache for node_revision_t objects; the key is (revision, id offset) */
+ /* Cache for node_revision_t objects; the key is (revision, item_index) */
svn_cache__t *node_revision_cache;
/* Cache for change lists as APR arrays of change_t * objects; the key
is the revision */
svn_cache__t *changes_cache;
+ /* Cache for svn_fs_fs__rep_header_t objects; the key is a
+ (revision, item index) pair */
+ svn_cache__t *rep_header_cache;
+
/* Cache for svn_mergeinfo_t objects; the key is a combination of
revision, inheritance flags and path. */
svn_cache__t *mergeinfo_cache;
@@ -316,6 +393,23 @@ typedef struct fs_fs_data_t
if the node has mergeinfo, "0" if it doesn't. */
svn_cache__t *mergeinfo_existence_cache;
+ /* Cache for l2p_header_t objects; the key is (revision, is-packed).
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *l2p_header_cache;
+
+ /* Cache for l2p_page_t objects; the key is svn_fs_fs__page_cache_key_t.
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *l2p_page_cache;
+
+ /* Cache for p2l_header_t objects; the key is (revision, is-packed).
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *p2l_header_cache;
+
+ /* Cache for apr_array_header_t objects containing svn_fs_fs__p2l_entry_t
+ elements; the key is svn_fs_fs__page_cache_key_t.
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *p2l_page_cache;
+
/* TRUE while the we hold a lock on the write lock file. */
svn_boolean_t has_write_lock;
@@ -363,19 +457,27 @@ typedef struct fs_fs_data_t
* deltification history after which skip deltas will be used. */
apr_int64_t max_linear_deltification;
+ /* Compression level to use with txdelta storage format in new revs. */
+ int delta_compression_level;
+
+ /* Pack after every commit. */
+ svn_boolean_t pack_after_commit;
+
+ /* Per-instance filesystem ID, which provides an additional level of
+ uniqueness for filesystems that share the same UUID, but should
+ still be distinguishable (e.g. backups produced by svn_fs_hotcopy()
+ or dump / load cycles). */
+ const char *instance_id;
+
/* Pointer to svn_fs_open. */
svn_error_t *(*svn_fs_open_)(svn_fs_t **, const char *, apr_hash_t *,
- apr_pool_t *);
+ apr_pool_t *, apr_pool_t *);
} fs_fs_data_t;
/*** Filesystem Transaction ***/
typedef struct transaction_t
{
- /* property list (const char * name, svn_string_t * value).
- may be NULL if there are no properties. */
- apr_hash_t *proplist;
-
/* node revision id of the root node. */
const svn_fs_id_t *root_id;
@@ -395,26 +497,26 @@ typedef struct transaction_t
* svn_fs_fs__rep_copy. */
typedef struct representation_t
{
- /* Checksums for the contents produced by this representation.
+ /* Checksums digests for the contents produced by this representation.
This checksum is for the contents the rep shows to consumers,
regardless of how the rep stores the data under the hood. It is
independent of the storage (fulltext, delta, whatever).
- If checksum is NULL, then for compatibility behave as though this
+ If has_sha1 is FALSE, then for compatibility behave as though this
checksum matches the expected checksum.
The md5 checksum is always filled, unless this is rep which was
retrieved from the rep-cache. The sha1 checksum is only computed on
- a write, for use with rep-sharing; it may be read from an existing
- representation, but otherwise it is NULL. */
- svn_checksum_t *md5_checksum;
- svn_checksum_t *sha1_checksum;
+ a write, for use with rep-sharing. */
+ svn_boolean_t has_sha1;
+ unsigned char sha1_digest[APR_SHA1_DIGESTSIZE];
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
/* Revision where this representation is located. */
svn_revnum_t revision;
- /* Offset into the revision file where it is located. */
- apr_off_t offset;
+ /* Item index with the the revision. */
+ apr_uint64_t item_index;
/* The size of the representation in bytes as seen in the revision
file. */
@@ -424,17 +526,21 @@ typedef struct representation_t
* the fulltext size is equal to representation size in the rev file, */
svn_filesize_t expanded_size;
- /* Is this representation a transaction? */
- const char *txn_id;
+ /* Is this a representation (still) within a transaction? */
+ svn_fs_fs__id_part_t txn_id;
/* For rep-sharing, we need a way of uniquifying node-revs which share the
same representation (see svn_fs_fs__noderev_same_rep_key() ). So, we
store the original txn of the node rev (not the rep!), along with some
- intra-node uniqification content.
-
- May be NULL, in which case, it is considered to match other NULL
- values.*/
- const char *uniquifier;
+ intra-node uniqification content. */
+ struct
+ {
+ /* unique context, i.e. txn ID, in which the noderev (!) got created */
+ svn_fs_fs__id_part_t noderev_txn_id;
+
+ /* unique value within that txn */
+ apr_uint64_t number;
+ } uniquifier;
} representation_t;
@@ -494,25 +600,10 @@ typedef struct node_revision_t
typedef struct change_t
{
/* Path of the change. */
- const char *path;
-
- /* Node revision ID of the change. */
- const svn_fs_id_t *noderev_id;
-
- /* The kind of change. */
- svn_fs_path_change_kind_t kind;
-
- /* Text or property mods? */
- svn_boolean_t text_mod;
- svn_boolean_t prop_mod;
-
- /* Node kind (possibly svn_node_unknown). */
- svn_node_kind_t node_kind;
-
- /* Copyfrom revision and path. */
- svn_revnum_t copyfrom_rev;
- const char * copyfrom_path;
+ svn_string_t path;
+ /* API compatible change description */
+ svn_fs_path_change2_t info;
} change_t;
diff --git a/subversion/libsvn_fs_fs/fs_fs.c b/subversion/libsvn_fs_fs/fs_fs.c
index 8fb3a36..103458d 100644
--- a/subversion/libsvn_fs_fs/fs_fs.c
+++ b/subversion/libsvn_fs_fs/fs_fs.c
@@ -20,59 +20,35 @@
* ====================================================================
*/
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-#include <errno.h>
-
-#include <apr_general.h>
-#include <apr_pools.h>
-#include <apr_file_io.h>
+#include "fs_fs.h"
+
#include <apr_uuid.h>
-#include <apr_lib.h>
-#include <apr_md5.h>
-#include <apr_sha1.h>
-#include <apr_strings.h>
-#include <apr_thread_mutex.h>
-
-#include "svn_pools.h"
-#include "svn_fs.h"
-#include "svn_dirent_uri.h"
-#include "svn_path.h"
+
+#include "svn_private_config.h"
+
+#include "svn_checksum.h"
#include "svn_hash.h"
#include "svn_props.h"
-#include "svn_sorts.h"
-#include "svn_string.h"
#include "svn_time.h"
-#include "svn_mergeinfo.h"
-#include "svn_config.h"
-#include "svn_ctype.h"
+#include "svn_dirent_uri.h"
+#include "svn_sorts.h"
#include "svn_version.h"
-#include "fs.h"
-#include "tree.h"
-#include "lock.h"
-#include "key-gen.h"
-#include "fs_fs.h"
+#include "cached_data.h"
#include "id.h"
+#include "index.h"
#include "rep-cache.h"
-#include "temp_serializer.h"
+#include "revprops.h"
+#include "transaction.h"
+#include "tree.h"
+#include "util.h"
-#include "private/svn_string_private.h"
#include "private/svn_fs_util.h"
+#include "private/svn_io_private.h"
+#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
-#include "private/svn_delta_private.h"
#include "../libsvn_fs/fs-loader.h"
-#include "svn_private_config.h"
-#include "temp_serializer.h"
-
-/* An arbitrary maximum path length, so clients can't run us out of memory
- * by giving us arbitrarily large paths. */
-#define FSFS_MAX_PATH_LEN 4096
-
/* The default maximum number of files per directory to store in the
rev and revprops directory. The number below is somewhat arbitrary,
and can be overridden by defining the macro while compiling; the
@@ -96,53 +72,6 @@
Values < 1 disable deltification. */
#define SVN_FS_FS_MAX_DELTIFICATION_WALK 1023
-/* Give writing processes 10 seconds to replace an existing revprop
- file with a new one. After that time, we assume that the writing
- process got aborted and that we have re-read revprops. */
-#define REVPROP_CHANGE_TIMEOUT (10 * 1000000)
-
-/* The following are names of atomics that will be used to communicate
- * revprop updates across all processes on this machine. */
-#define ATOMIC_REVPROP_GENERATION "rev-prop-generation"
-#define ATOMIC_REVPROP_TIMEOUT "rev-prop-timeout"
-#define ATOMIC_REVPROP_NAMESPACE "rev-prop-atomics"
-
-/* Following are defines that specify the textual elements of the
- native filesystem directories and revision files. */
-
-/* Headers used to describe node-revision in the revision file. */
-#define HEADER_ID "id"
-#define HEADER_TYPE "type"
-#define HEADER_COUNT "count"
-#define HEADER_PROPS "props"
-#define HEADER_TEXT "text"
-#define HEADER_CPATH "cpath"
-#define HEADER_PRED "pred"
-#define HEADER_COPYFROM "copyfrom"
-#define HEADER_COPYROOT "copyroot"
-#define HEADER_FRESHTXNRT "is-fresh-txn-root"
-#define HEADER_MINFO_HERE "minfo-here"
-#define HEADER_MINFO_CNT "minfo-cnt"
-
-/* Kinds that a change can be. */
-#define ACTION_MODIFY "modify"
-#define ACTION_ADD "add"
-#define ACTION_DELETE "delete"
-#define ACTION_REPLACE "replace"
-#define ACTION_RESET "reset"
-
-/* True and False flags. */
-#define FLAG_TRUE "true"
-#define FLAG_FALSE "false"
-
-/* Kinds that a node-rev can be. */
-#define KIND_FILE "file"
-#define KIND_DIR "dir"
-
-/* Kinds of representation. */
-#define REP_PLAIN "PLAIN"
-#define REP_DELTA "DELTA"
-
/* Notes:
To avoid opening and closing the rev-files all the time, it would
@@ -155,59 +84,13 @@ are likely some errors because of that.
*/
-/* The vtable associated with an open transaction object. */
-static txn_vtable_t txn_vtable = {
- svn_fs_fs__commit_txn,
- svn_fs_fs__abort_txn,
- svn_fs_fs__txn_prop,
- svn_fs_fs__txn_proplist,
- svn_fs_fs__change_txn_prop,
- svn_fs_fs__txn_root,
- svn_fs_fs__change_txn_props
-};
-
/* Declarations. */
static svn_error_t *
-read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
- const char *path,
- apr_pool_t *pool);
-
-static svn_error_t *
-update_min_unpacked_rev(svn_fs_t *fs, apr_pool_t *pool);
-
-static svn_error_t *
-get_youngest(svn_revnum_t *youngest_p, const char *fs_path, apr_pool_t *pool);
-
-static svn_error_t *
-verify_walker(representation_t *rep,
- void *baton,
- svn_fs_t *fs,
- apr_pool_t *scratch_pool);
+get_youngest(svn_revnum_t *youngest_p, svn_fs_t *fs, apr_pool_t *pool);
/* Pathname helper functions */
-/* Return TRUE is REV is packed in FS, FALSE otherwise. */
-static svn_boolean_t
-is_packed_rev(svn_fs_t *fs, svn_revnum_t rev)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- return (rev < ffd->min_unpacked_rev);
-}
-
-/* Return TRUE is REV is packed in FS, FALSE otherwise. */
-static svn_boolean_t
-is_packed_revprop(svn_fs_t *fs, svn_revnum_t rev)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* rev 0 will not be packed */
- return (rev < ffd->min_unpacked_rev)
- && (rev != 0)
- && (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT);
-}
-
static const char *
path_format(svn_fs_t *fs, apr_pool_t *pool)
{
@@ -226,442 +109,250 @@ svn_fs_fs__path_current(svn_fs_t *fs, apr_pool_t *pool)
return svn_dirent_join(fs->path, PATH_CURRENT, pool);
}
-static APR_INLINE const char *
-path_txn_current(svn_fs_t *fs, apr_pool_t *pool)
-{
- return svn_dirent_join(fs->path, PATH_TXN_CURRENT, pool);
-}
-static APR_INLINE const char *
-path_txn_current_lock(svn_fs_t *fs, apr_pool_t *pool)
-{
- return svn_dirent_join(fs->path, PATH_TXN_CURRENT_LOCK, pool);
-}
-
-static APR_INLINE const char *
-path_lock(svn_fs_t *fs, apr_pool_t *pool)
-{
- return svn_dirent_join(fs->path, PATH_LOCK_FILE, pool);
-}
-
-static const char *
-path_revprop_generation(svn_fs_t *fs, apr_pool_t *pool)
+
+/* Get a lock on empty file LOCK_FILENAME, creating it in POOL. */
+static svn_error_t *
+get_lock_on_filesystem(const char *lock_filename,
+ apr_pool_t *pool)
{
- return svn_dirent_join(fs->path, PATH_REVPROP_GENERATION, pool);
+ return svn_error_trace(svn_io__file_lock_autocreate(lock_filename, pool));
}
-static const char *
-path_rev_packed(svn_fs_t *fs, svn_revnum_t rev, const char *kind,
- apr_pool_t *pool)
+/* Reset the HAS_WRITE_LOCK member in the FFD given as BATON_VOID.
+ When registered with the pool holding the lock on the lock file,
+ this makes sure the flag gets reset just before we release the lock. */
+static apr_status_t
+reset_lock_flag(void *baton_void)
{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- assert(ffd->max_files_per_dir);
- assert(is_packed_rev(fs, rev));
-
- return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
- apr_psprintf(pool,
- "%ld" PATH_EXT_PACKED_SHARD,
- rev / ffd->max_files_per_dir),
- kind, NULL);
+ fs_fs_data_t *ffd = baton_void;
+ ffd->has_write_lock = FALSE;
+ return APR_SUCCESS;
}
-static const char *
-path_rev_shard(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
+/* Structure defining a file system lock to be acquired and the function
+ to be executed while the lock is held.
- assert(ffd->max_files_per_dir);
- return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
- apr_psprintf(pool, "%ld",
- rev / ffd->max_files_per_dir),
- NULL);
-}
+ Instances of this structure may be nested to allow for multiple locks to
+ be taken out before executing the user-provided body. In that case, BODY
+ and BATON of the outer instances will be with_lock and a with_lock_baton_t
+ instance (transparently, no special treatment is required.). It is
+ illegal to attempt to acquire the same lock twice within the same lock
+ chain or via nesting calls using separate lock chains.
-static const char *
-path_rev(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
+ All instances along the chain share the same LOCK_POOL such that only one
+ pool needs to be created and cleared for all locks. We also allocate as
+ much data from that lock pool as possible to minimize memory usage in
+ caller pools. */
+typedef struct with_lock_baton_t
{
- fs_fs_data_t *ffd = fs->fsap_data;
+ /* The filesystem we operate on. Same for all instances along the chain. */
+ svn_fs_t *fs;
- assert(! is_packed_rev(fs, rev));
+ /* Mutex to complement the lock file in an APR threaded process.
+ No-op object for non-threaded processes but never NULL. */
+ svn_mutex__t *mutex;
- if (ffd->max_files_per_dir)
- {
- return svn_dirent_join(path_rev_shard(fs, rev, pool),
- apr_psprintf(pool, "%ld", rev),
- pool);
- }
+ /* Path to the file to lock. */
+ const char *lock_path;
- return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
- apr_psprintf(pool, "%ld", rev), NULL);
-}
+ /* If true, set FS->HAS_WRITE_LOCK after we acquired the lock. */
+ svn_boolean_t is_global_lock;
-svn_error_t *
-svn_fs_fs__path_rev_absolute(const char **path,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
+ /* Function body to execute after we acquired the lock.
+ This may be user-provided or a nested call to with_lock(). */
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool);
- if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT
- || ! is_packed_rev(fs, rev))
- {
- *path = path_rev(fs, rev, pool);
- }
- else
- {
- *path = path_rev_packed(fs, rev, PATH_PACKED, pool);
- }
+ /* Baton to pass to BODY; possibly NULL.
+ This may be user-provided or a nested lock baton instance. */
+ void *baton;
- return SVN_NO_ERROR;
-}
-
-static const char *
-path_revprops_shard(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
+ /* Pool for all allocations along the lock chain and BODY. Will hold the
+ file locks and gets destroyed after the outermost BODY returned,
+ releasing all file locks.
+ Same for all instances along the chain. */
+ apr_pool_t *lock_pool;
- assert(ffd->max_files_per_dir);
- return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
- apr_psprintf(pool, "%ld",
- rev / ffd->max_files_per_dir),
- NULL);
-}
+ /* TRUE, iff BODY is the user-provided body. */
+ svn_boolean_t is_inner_most_lock;
-static const char *
-path_revprops_pack_shard(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
+ /* TRUE, iff this is not a nested lock.
+ Then responsible for destroying LOCK_POOL. */
+ svn_boolean_t is_outer_most_lock;
+} with_lock_baton_t;
- assert(ffd->max_files_per_dir);
- return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
- apr_psprintf(pool, "%ld" PATH_EXT_PACKED_SHARD,
- rev / ffd->max_files_per_dir),
- NULL);
-}
-
-static const char *
-path_revprops(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
+/* Obtain a write lock on the file BATON->LOCK_PATH and call BATON->BODY
+ with BATON->BATON. If this is the outermost lock call, release all file
+ locks after the body returned. If BATON->IS_GLOBAL_LOCK is set, set the
+ HAS_WRITE_LOCK flag while we keep the write lock. */
+static svn_error_t *
+with_some_lock_file(with_lock_baton_t *baton)
{
- fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *pool = baton->lock_pool;
+ svn_error_t *err = get_lock_on_filesystem(baton->lock_path, pool);
- if (ffd->max_files_per_dir)
+ if (!err)
{
- return svn_dirent_join(path_revprops_shard(fs, rev, pool),
- apr_psprintf(pool, "%ld", rev),
- pool);
- }
-
- return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
- apr_psprintf(pool, "%ld", rev), NULL);
-}
-
-static APR_INLINE const char *
-path_txn_dir(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- SVN_ERR_ASSERT_NO_RETURN(txn_id != NULL);
- return svn_dirent_join_many(pool, fs->path, PATH_TXNS_DIR,
- apr_pstrcat(pool, txn_id, PATH_EXT_TXN,
- (char *)NULL),
- NULL);
-}
-
-/* Return the name of the sha1->rep mapping file in transaction TXN_ID
- * within FS for the given SHA1 checksum. Use POOL for allocations.
- */
-static APR_INLINE const char *
-path_txn_sha1(svn_fs_t *fs, const char *txn_id, svn_checksum_t *sha1,
- apr_pool_t *pool)
-{
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool),
- svn_checksum_to_cstring(sha1, pool),
- pool);
-}
-
-static APR_INLINE const char *
-path_txn_changes(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), PATH_CHANGES, pool);
-}
-
-static APR_INLINE const char *
-path_txn_props(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), PATH_TXN_PROPS, pool);
-}
-
-static APR_INLINE const char *
-path_txn_next_ids(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), PATH_NEXT_IDS, pool);
-}
-
-static APR_INLINE const char *
-path_min_unpacked_rev(svn_fs_t *fs, apr_pool_t *pool)
-{
- return svn_dirent_join(fs->path, PATH_MIN_UNPACKED_REV, pool);
-}
-
-
-static APR_INLINE const char *
-path_txn_proto_rev(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
- return svn_dirent_join_many(pool, fs->path, PATH_TXN_PROTOS_DIR,
- apr_pstrcat(pool, txn_id, PATH_EXT_REV,
- (char *)NULL),
- NULL);
- else
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), PATH_REV, pool);
-}
+ svn_fs_t *fs = baton->fs;
+ fs_fs_data_t *ffd = fs->fsap_data;
-static APR_INLINE const char *
-path_txn_proto_rev_lock(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
- return svn_dirent_join_many(pool, fs->path, PATH_TXN_PROTOS_DIR,
- apr_pstrcat(pool, txn_id, PATH_EXT_REV_LOCK,
- (char *)NULL),
- NULL);
- else
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), PATH_REV_LOCK,
- pool);
-}
+ if (baton->is_global_lock)
+ {
+ /* set the "got the lock" flag and register reset function */
+ apr_pool_cleanup_register(pool,
+ ffd,
+ reset_lock_flag,
+ apr_pool_cleanup_null);
+ ffd->has_write_lock = TRUE;
+ }
-static const char *
-path_txn_node_rev(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
-{
- const char *txn_id = svn_fs_fs__id_txn_id(id);
- const char *node_id = svn_fs_fs__id_node_id(id);
- const char *copy_id = svn_fs_fs__id_copy_id(id);
- const char *name = apr_psprintf(pool, PATH_PREFIX_NODE "%s.%s",
- node_id, copy_id);
+ /* nobody else will modify the repo state
+ => read HEAD & pack info once */
+ if (baton->is_inner_most_lock)
+ {
+ if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
+ err = svn_fs_fs__update_min_unpacked_rev(fs, pool);
+ if (!err)
+ err = get_youngest(&ffd->youngest_rev_cache, fs, pool);
+ }
- return svn_dirent_join(path_txn_dir(fs, txn_id, pool), name, pool);
-}
+ if (!err)
+ err = baton->body(baton->baton, pool);
+ }
-static APR_INLINE const char *
-path_txn_node_props(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
-{
- return apr_pstrcat(pool, path_txn_node_rev(fs, id, pool), PATH_EXT_PROPS,
- (char *)NULL);
-}
+ if (baton->is_outer_most_lock)
+ svn_pool_destroy(pool);
-static APR_INLINE const char *
-path_txn_node_children(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
-{
- return apr_pstrcat(pool, path_txn_node_rev(fs, id, pool),
- PATH_EXT_CHILDREN, (char *)NULL);
+ return svn_error_trace(err);
}
-static APR_INLINE const char *
-path_node_origin(svn_fs_t *fs, const char *node_id, apr_pool_t *pool)
-{
- size_t len = strlen(node_id);
- const char *node_id_minus_last_char =
- (len == 1) ? "0" : apr_pstrmemdup(pool, node_id, len - 1);
- return svn_dirent_join_many(pool, fs->path, PATH_NODE_ORIGINS_DIR,
- node_id_minus_last_char, NULL);
-}
+/* Wraps with_some_lock_file, protecting it with BATON->MUTEX.
-static APR_INLINE const char *
-path_and_offset_of(apr_file_t *file, apr_pool_t *pool)
+ POOL is unused here and only provided for signature compatibility with
+ WITH_LOCK_BATON_T.BODY. */
+static svn_error_t *
+with_lock(void *baton,
+ apr_pool_t *pool)
{
- const char *path;
- apr_off_t offset = 0;
+ with_lock_baton_t *lock_baton = baton;
+ SVN_MUTEX__WITH_LOCK(lock_baton->mutex, with_some_lock_file(lock_baton));
- if (apr_file_name_get(&path, file) != APR_SUCCESS)
- path = "(unknown)";
-
- if (apr_file_seek(file, APR_CUR, &offset) != APR_SUCCESS)
- offset = -1;
-
- return apr_psprintf(pool, "%s:%" APR_OFF_T_FMT, path, offset);
+ return SVN_NO_ERROR;
}
-
-
-/* Functions for working with shared transaction data. */
-
-/* Return the transaction object for transaction TXN_ID from the
- transaction list of filesystem FS (which must already be locked via the
- txn_list_lock mutex). If the transaction does not exist in the list,
- then create a new transaction object and return it (if CREATE_NEW is
- true) or return NULL (otherwise). */
-static fs_fs_shared_txn_data_t *
-get_shared_txn(svn_fs_t *fs, const char *txn_id, svn_boolean_t create_new)
+/* Enum identifying a filesystem lock. */
+typedef enum lock_id_t
{
- fs_fs_data_t *ffd = fs->fsap_data;
- fs_fs_shared_data_t *ffsd = ffd->shared;
- fs_fs_shared_txn_data_t *txn;
-
- for (txn = ffsd->txns; txn; txn = txn->next)
- if (strcmp(txn->txn_id, txn_id) == 0)
- break;
-
- if (txn || !create_new)
- return txn;
-
- /* Use the transaction object from the (single-object) freelist,
- if one is available, or otherwise create a new object. */
- if (ffsd->free_txn)
- {
- txn = ffsd->free_txn;
- ffsd->free_txn = NULL;
- }
- else
- {
- apr_pool_t *subpool = svn_pool_create(ffsd->common_pool);
- txn = apr_palloc(subpool, sizeof(*txn));
- txn->pool = subpool;
- }
-
- assert(strlen(txn_id) < sizeof(txn->txn_id));
- apr_cpystrn(txn->txn_id, txn_id, sizeof(txn->txn_id));
- txn->being_written = FALSE;
-
- /* Link this transaction into the head of the list. We will typically
- be dealing with only one active transaction at a time, so it makes
- sense for searches through the transaction list to look at the
- newest transactions first. */
- txn->next = ffsd->txns;
- ffsd->txns = txn;
-
- return txn;
-}
+ write_lock,
+ txn_lock,
+ pack_lock
+} lock_id_t;
-/* Free the transaction object for transaction TXN_ID, and remove it
- from the transaction list of filesystem FS (which must already be
- locked via the txn_list_lock mutex). Do nothing if the transaction
- does not exist. */
+/* Initialize BATON->MUTEX, BATON->LOCK_PATH and BATON->IS_GLOBAL_LOCK
+ according to the LOCK_ID. All other members of BATON must already be
+ valid. */
static void
-free_shared_txn(svn_fs_t *fs, const char *txn_id)
+init_lock_baton(with_lock_baton_t *baton,
+ lock_id_t lock_id)
{
- fs_fs_data_t *ffd = fs->fsap_data;
+ fs_fs_data_t *ffd = baton->fs->fsap_data;
fs_fs_shared_data_t *ffsd = ffd->shared;
- fs_fs_shared_txn_data_t *txn, *prev = NULL;
- for (txn = ffsd->txns; txn; prev = txn, txn = txn->next)
- if (strcmp(txn->txn_id, txn_id) == 0)
+ switch (lock_id)
+ {
+ case write_lock:
+ baton->mutex = ffsd->fs_write_lock;
+ baton->lock_path = svn_fs_fs__path_lock(baton->fs, baton->lock_pool);
+ baton->is_global_lock = TRUE;
break;
- if (!txn)
- return;
-
- if (prev)
- prev->next = txn->next;
- else
- ffsd->txns = txn->next;
+ case txn_lock:
+ baton->mutex = ffsd->txn_current_lock;
+ baton->lock_path = svn_fs_fs__path_txn_current_lock(baton->fs,
+ baton->lock_pool);
+ baton->is_global_lock = FALSE;
+ break;
- /* As we typically will be dealing with one transaction after another,
- we will maintain a single-object free list so that we can hopefully
- keep reusing the same transaction object. */
- if (!ffsd->free_txn)
- ffsd->free_txn = txn;
- else
- svn_pool_destroy(txn->pool);
+ case pack_lock:
+ baton->mutex = ffsd->fs_pack_lock;
+ baton->lock_path = svn_fs_fs__path_pack_lock(baton->fs,
+ baton->lock_pool);
+ baton->is_global_lock = FALSE;
+ break;
+ }
}
-
-/* Obtain a lock on the transaction list of filesystem FS, call BODY
- with FS, BATON, and POOL, and then unlock the transaction list.
- Return what BODY returned. */
-static svn_error_t *
-with_txnlist_lock(svn_fs_t *fs,
- svn_error_t *(*body)(svn_fs_t *fs,
- const void *baton,
+/* Return the baton for the innermost lock of a (potential) lock chain.
+ The baton shall take out LOCK_ID from FS and execute BODY with BATON
+ while the lock is being held. Allocate the result in a sub-pool of POOL.
+ */
+static with_lock_baton_t *
+create_lock_baton(svn_fs_t *fs,
+ lock_id_t lock_id,
+ svn_error_t *(*body)(void *baton,
apr_pool_t *pool),
- const void *baton,
+ void *baton,
apr_pool_t *pool)
{
- fs_fs_data_t *ffd = fs->fsap_data;
- fs_fs_shared_data_t *ffsd = ffd->shared;
+ /* Allocate everything along the lock chain into a single sub-pool.
+ This minimizes memory usage and cleanup overhead. */
+ apr_pool_t *lock_pool = svn_pool_create(pool);
+ with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
- SVN_MUTEX__WITH_LOCK(ffsd->txn_list_lock,
- body(fs, baton, pool));
+ /* Store parameters. */
+ result->fs = fs;
+ result->body = body;
+ result->baton = baton;
- return SVN_NO_ERROR;
-}
+ /* File locks etc. will use this pool as well for easy cleanup. */
+ result->lock_pool = lock_pool;
+ /* Right now, we are the first, (only, ) and last struct in the chain. */
+ result->is_inner_most_lock = TRUE;
+ result->is_outer_most_lock = TRUE;
-/* Get a lock on empty file LOCK_FILENAME, creating it in POOL. */
-static svn_error_t *
-get_lock_on_filesystem(const char *lock_filename,
- apr_pool_t *pool)
-{
- svn_error_t *err = svn_io_file_lock2(lock_filename, TRUE, FALSE, pool);
-
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- /* No lock file? No big deal; these are just empty files
- anyway. Create it and try again. */
- svn_error_clear(err);
- err = NULL;
-
- SVN_ERR(svn_io_file_create(lock_filename, "", pool));
- SVN_ERR(svn_io_file_lock2(lock_filename, TRUE, FALSE, pool));
- }
+ /* Select mutex and lock file path depending on LOCK_ID.
+ Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
+ init_lock_baton(result, lock_id);
- return svn_error_trace(err);
+ return result;
}
-/* Reset the HAS_WRITE_LOCK member in the FFD given as BATON_VOID.
- When registered with the pool holding the lock on the lock file,
- this makes sure the flag gets reset just before we release the lock. */
-static apr_status_t
-reset_lock_flag(void *baton_void)
+/* Return a baton that wraps NESTED and requests LOCK_ID as additional lock.
+ *
+ * That means, when you create a lock chain, start with the last / innermost
+ * lock to take out and add the first / outermost lock last.
+ */
+static with_lock_baton_t *
+chain_lock_baton(lock_id_t lock_id,
+ with_lock_baton_t *nested)
{
- fs_fs_data_t *ffd = baton_void;
- ffd->has_write_lock = FALSE;
- return APR_SUCCESS;
-}
+ /* Use the same pool for batons along the lock chain. */
+ apr_pool_t *lock_pool = nested->lock_pool;
+ with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
-/* Obtain a write lock on the file LOCK_FILENAME (protecting with
- LOCK_MUTEX if APR is threaded) in a subpool of POOL, call BODY with
- BATON and that subpool, destroy the subpool (releasing the write
- lock) and return what BODY returned. If IS_GLOBAL_LOCK is set,
- set the HAS_WRITE_LOCK flag while we keep the write lock. */
-static svn_error_t *
-with_some_lock_file(svn_fs_t *fs,
- svn_error_t *(*body)(void *baton,
- apr_pool_t *pool),
- void *baton,
- const char *lock_filename,
- svn_boolean_t is_global_lock,
- apr_pool_t *pool)
-{
- apr_pool_t *subpool = svn_pool_create(pool);
- svn_error_t *err = get_lock_on_filesystem(lock_filename, subpool);
+ /* All locks along the chain operate on the same FS. */
+ result->fs = nested->fs;
- if (!err)
- {
- fs_fs_data_t *ffd = fs->fsap_data;
+ /* Execution of this baton means acquiring the nested lock and its
+ execution. */
+ result->body = with_lock;
+ result->baton = nested;
- if (is_global_lock)
- {
- /* set the "got the lock" flag and register reset function */
- apr_pool_cleanup_register(subpool,
- ffd,
- reset_lock_flag,
- apr_pool_cleanup_null);
- ffd->has_write_lock = TRUE;
- }
+ /* Shared among all locks along the chain. */
+ result->lock_pool = lock_pool;
- /* nobody else will modify the repo state
- => read HEAD & pack info once */
- if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(update_min_unpacked_rev(fs, pool));
- SVN_ERR(get_youngest(&ffd->youngest_rev_cache, fs->path,
- pool));
- err = body(baton, subpool);
- }
+ /* We are the new outermost lock but surely not the innermost lock. */
+ result->is_inner_most_lock = FALSE;
+ result->is_outer_most_lock = TRUE;
+ nested->is_outer_most_lock = FALSE;
- svn_pool_destroy(subpool);
+ /* Select mutex and lock file path depending on LOCK_ID.
+ Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
+ init_lock_baton(result, lock_id);
- return svn_error_trace(err);
+ return result;
}
svn_error_t *
@@ -671,306 +362,63 @@ svn_fs_fs__with_write_lock(svn_fs_t *fs,
void *baton,
apr_pool_t *pool)
{
- fs_fs_data_t *ffd = fs->fsap_data;
- fs_fs_shared_data_t *ffsd = ffd->shared;
-
- SVN_MUTEX__WITH_LOCK(ffsd->fs_write_lock,
- with_some_lock_file(fs, body, baton,
- path_lock(fs, pool),
- TRUE,
- pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Run BODY (with BATON and POOL) while the txn-current file
- of FS is locked. */
-static svn_error_t *
-with_txn_current_lock(svn_fs_t *fs,
- svn_error_t *(*body)(void *baton,
- apr_pool_t *pool),
- void *baton,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- fs_fs_shared_data_t *ffsd = ffd->shared;
-
- SVN_MUTEX__WITH_LOCK(ffsd->txn_current_lock,
- with_some_lock_file(fs, body, baton,
- path_txn_current_lock(fs, pool),
- FALSE,
- pool));
-
- return SVN_NO_ERROR;
-}
-
-/* A structure used by unlock_proto_rev() and unlock_proto_rev_body(),
- which see. */
-struct unlock_proto_rev_baton
-{
- const char *txn_id;
- void *lockcookie;
-};
-
-/* Callback used in the implementation of unlock_proto_rev(). */
-static svn_error_t *
-unlock_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
-{
- const struct unlock_proto_rev_baton *b = baton;
- const char *txn_id = b->txn_id;
- apr_file_t *lockfile = b->lockcookie;
- fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, txn_id, FALSE);
- apr_status_t apr_err;
-
- if (!txn)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Can't unlock unknown transaction '%s'"),
- txn_id);
- if (!txn->being_written)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Can't unlock nonlocked transaction '%s'"),
- txn_id);
-
- apr_err = apr_file_unlock(lockfile);
- if (apr_err)
- return svn_error_wrap_apr
- (apr_err,
- _("Can't unlock prototype revision lockfile for transaction '%s'"),
- txn_id);
- apr_err = apr_file_close(lockfile);
- if (apr_err)
- return svn_error_wrap_apr
- (apr_err,
- _("Can't close prototype revision lockfile for transaction '%s'"),
- txn_id);
-
- txn->being_written = FALSE;
-
- return SVN_NO_ERROR;
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, write_lock, body, baton, pool),
+ pool));
}
-/* Unlock the prototype revision file for transaction TXN_ID in filesystem
- FS using cookie LOCKCOOKIE. The original prototype revision file must
- have been closed _before_ calling this function.
-
- Perform temporary allocations in POOL. */
-static svn_error_t *
-unlock_proto_rev(svn_fs_t *fs, const char *txn_id, void *lockcookie,
- apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__with_pack_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool)
{
- struct unlock_proto_rev_baton b;
-
- b.txn_id = txn_id;
- b.lockcookie = lockcookie;
- return with_txnlist_lock(fs, unlock_proto_rev_body, &b, pool);
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, pack_lock, body, baton, pool),
+ pool));
}
-/* Same as unlock_proto_rev(), but requires that the transaction list
- lock is already held. */
-static svn_error_t *
-unlock_proto_rev_list_locked(svn_fs_t *fs, const char *txn_id,
- void *lockcookie,
- apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__with_txn_current_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool)
{
- struct unlock_proto_rev_baton b;
-
- b.txn_id = txn_id;
- b.lockcookie = lockcookie;
- return unlock_proto_rev_body(fs, &b, pool);
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, txn_lock, body, baton, pool),
+ pool));
}
-/* A structure used by get_writable_proto_rev() and
- get_writable_proto_rev_body(), which see. */
-struct get_writable_proto_rev_baton
-{
- apr_file_t **file;
- void **lockcookie;
- const char *txn_id;
-};
-
-/* Callback used in the implementation of get_writable_proto_rev(). */
-static svn_error_t *
-get_writable_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__with_all_locks(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool)
{
- const struct get_writable_proto_rev_baton *b = baton;
- apr_file_t **file = b->file;
- void **lockcookie = b->lockcookie;
- const char *txn_id = b->txn_id;
- svn_error_t *err;
- fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, txn_id, TRUE);
-
- /* First, ensure that no thread in this process (including this one)
- is currently writing to this transaction's proto-rev file. */
- if (txn->being_written)
- return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
- _("Cannot write to the prototype revision file "
- "of transaction '%s' because a previous "
- "representation is currently being written by "
- "this process"),
- txn_id);
-
-
- /* We know that no thread in this process is writing to the proto-rev
- file, and by extension, that no thread in this process is holding a
- lock on the prototype revision lock file. It is therefore safe
- for us to attempt to lock this file, to see if any other process
- is holding a lock. */
-
- {
- apr_file_t *lockfile;
- apr_status_t apr_err;
- const char *lockfile_path = path_txn_proto_rev_lock(fs, txn_id, pool);
-
- /* Open the proto-rev lockfile, creating it if necessary, as it may
- not exist if the transaction dates from before the lockfiles were
- introduced.
-
- ### We'd also like to use something like svn_io_file_lock2(), but
- that forces us to create a subpool just to be able to unlock
- the file, which seems a waste. */
- SVN_ERR(svn_io_file_open(&lockfile, lockfile_path,
- APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool));
-
- apr_err = apr_file_lock(lockfile,
- APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);
- if (apr_err)
- {
- svn_error_clear(svn_io_file_close(lockfile, pool));
-
- if (APR_STATUS_IS_EAGAIN(apr_err))
- return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
- _("Cannot write to the prototype revision "
- "file of transaction '%s' because a "
- "previous representation is currently "
- "being written by another process"),
- txn_id);
-
- return svn_error_wrap_apr(apr_err,
- _("Can't get exclusive lock on file '%s'"),
- svn_dirent_local_style(lockfile_path, pool));
- }
-
- *lockcookie = lockfile;
- }
-
- /* We've successfully locked the transaction; mark it as such. */
- txn->being_written = TRUE;
-
-
- /* Now open the prototype revision file and seek to the end. */
- err = svn_io_file_open(file, path_txn_proto_rev(fs, txn_id, pool),
- APR_WRITE | APR_BUFFERED, APR_OS_DEFAULT, pool);
-
- /* You might expect that we could dispense with the following seek
- and achieve the same thing by opening the file using APR_APPEND.
- Unfortunately, APR's buffered file implementation unconditionally
- places its initial file pointer at the start of the file (even for
- files opened with APR_APPEND), so we need this seek to reconcile
- the APR file pointer to the OS file pointer (since we need to be
- able to read the current file position later). */
- if (!err)
- {
- apr_off_t offset = 0;
- err = svn_io_file_seek(*file, APR_END, &offset, pool);
- }
-
- if (err)
- {
- err = svn_error_compose_create(
- err,
- unlock_proto_rev_list_locked(fs, txn_id, *lockcookie, pool));
-
- *lockcookie = NULL;
- }
-
- return svn_error_trace(err);
-}
-
-/* Get a handle to the prototype revision file for transaction TXN_ID in
- filesystem FS, and lock it for writing. Return FILE, a file handle
- positioned at the end of the file, and LOCKCOOKIE, a cookie that
- should be passed to unlock_proto_rev() to unlock the file once FILE
- has been closed.
+ fs_fs_data_t *ffd = fs->fsap_data;
- If the prototype revision file is already locked, return error
- SVN_ERR_FS_REP_BEING_WRITTEN.
+ /* Be sure to use the correct lock ordering as documented in
+ fs_fs_shared_data_t. The lock chain is being created in
+ innermost (last to acquire) -> outermost (first to acquire) order. */
+ with_lock_baton_t *lock_baton
+ = create_lock_baton(fs, write_lock, body, baton, pool);
- Perform all allocations in POOL. */
-static svn_error_t *
-get_writable_proto_rev(apr_file_t **file,
- void **lockcookie,
- svn_fs_t *fs, const char *txn_id,
- apr_pool_t *pool)
-{
- struct get_writable_proto_rev_baton b;
+ if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
+ lock_baton = chain_lock_baton(pack_lock, lock_baton);
- b.file = file;
- b.lockcookie = lockcookie;
- b.txn_id = txn_id;
+ if (ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
+ lock_baton = chain_lock_baton(txn_lock, lock_baton);
- return with_txnlist_lock(fs, get_writable_proto_rev_body, &b, pool);
+ return svn_error_trace(with_lock(lock_baton, pool));
}
-/* Callback used in the implementation of purge_shared_txn(). */
-static svn_error_t *
-purge_shared_txn_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
-{
- const char *txn_id = baton;
- free_shared_txn(fs, txn_id);
- svn_fs_fs__reset_txn_caches(fs);
-
- return SVN_NO_ERROR;
-}
-
-/* Purge the shared data for transaction TXN_ID in filesystem FS.
- Perform all allocations in POOL. */
-static svn_error_t *
-purge_shared_txn(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
-{
- return with_txnlist_lock(fs, purge_shared_txn_body, txn_id, pool);
-}
-/* Fetch the current offset of FILE into *OFFSET_P. */
-static svn_error_t *
-get_file_offset(apr_off_t *offset_p, apr_file_t *file, apr_pool_t *pool)
-{
- apr_off_t offset;
-
- /* Note that, for buffered files, one (possibly surprising) side-effect
- of this call is to flush any unwritten data to disk. */
- offset = 0;
- SVN_ERR(svn_io_file_seek(file, APR_CUR, &offset, pool));
- *offset_p = offset;
-
- return SVN_NO_ERROR;
-}
-
-
-/* Check that BUF, a nul-terminated buffer of text from file PATH,
- contains only digits at OFFSET and beyond, raising an error if not.
- TITLE contains a user-visible description of the file, usually the
- short file name.
-
- Uses POOL for temporary allocation. */
-static svn_error_t *
-check_file_buffer_numeric(const char *buf, apr_off_t offset,
- const char *path, const char *title,
- apr_pool_t *pool)
-{
- const char *p;
-
- for (p = buf + offset; *p; p++)
- if (!svn_ctype_isdigit(*p))
- return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
- _("%s file '%s' contains unexpected non-digit '%c' within '%s'"),
- title, svn_dirent_local_style(path, pool), *p, buf);
-
- return SVN_NO_ERROR;
-}
-
/* Check that BUF, a nul-terminated buffer of text from format file PATH,
contains only digits at OFFSET and beyond, raising an error if not.
@@ -979,7 +427,8 @@ static svn_error_t *
check_format_file_buffer_numeric(const char *buf, apr_off_t offset,
const char *path, apr_pool_t *pool)
{
- return check_file_buffer_numeric(buf, offset, path, "Format", pool);
+ return svn_fs_fs__check_file_buffer_numeric(buf, offset, path, "Format",
+ pool);
}
/* Return the error SVN_ERR_FS_UNSUPPORTED_FORMAT if FS's format
@@ -1008,16 +457,21 @@ check_format(int format)
}
/* Read the format number and maximum number of files per directory
- from PATH and return them in *PFORMAT and *MAX_FILES_PER_DIR
- respectively.
+ from PATH and return them in *PFORMAT, *MAX_FILES_PER_DIR and
+ USE_LOG_ADDRESSIONG respectively.
*MAX_FILES_PER_DIR is obtained from the 'layout' format option, and
will be set to zero if a linear scheme should be used.
+ *USE_LOG_ADDRESSIONG is obtained from the 'addressing' format option,
+ and will be set to FALSE for physical addressing.
Use POOL for temporary allocation. */
static svn_error_t *
-read_format(int *pformat, int *max_files_per_dir,
- const char *path, apr_pool_t *pool)
+read_format(int *pformat,
+ int *max_files_per_dir,
+ svn_boolean_t *use_log_addressing,
+ const char *path,
+ apr_pool_t *pool)
{
svn_error_t *err;
svn_stream_t *stream;
@@ -1038,6 +492,7 @@ read_format(int *pformat, int *max_files_per_dir,
svn_error_clear(err);
*pformat = 1;
*max_files_per_dir = 0;
+ *use_log_addressing = FALSE;
return SVN_NO_ERROR;
}
@@ -1062,6 +517,7 @@ read_format(int *pformat, int *max_files_per_dir,
/* Set the default values for anything that can be set via an option. */
*max_files_per_dir = 0;
+ *use_log_addressing = FALSE;
/* Read any options. */
while (!eos)
@@ -1088,38 +544,75 @@ read_format(int *pformat, int *max_files_per_dir,
}
}
+ if (*pformat >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT &&
+ strncmp(buf->data, "addressing ", 11) == 0)
+ {
+ if (strcmp(buf->data + 11, "physical") == 0)
+ {
+ *use_log_addressing = FALSE;
+ continue;
+ }
+
+ if (strcmp(buf->data + 11, "logical") == 0)
+ {
+ *use_log_addressing = TRUE;
+ continue;
+ }
+ }
+
return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
_("'%s' contains invalid filesystem format option '%s'"),
svn_dirent_local_style(path, pool), buf->data);
}
+ /* Non-sharded repositories never use logical addressing.
+ * If the format file is inconsistent in that respect, something
+ * probably went wrong.
+ */
+ if (*use_log_addressing && !*max_files_per_dir)
+ return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
+ _("'%s' specifies logical addressing for a non-sharded repository"),
+ svn_dirent_local_style(path, pool));
+
return SVN_NO_ERROR;
}
-/* Write the format number and maximum number of files per directory
- to a new format file in PATH, possibly expecting to overwrite a
- previously existing file.
+/* Write the format number, maximum number of files per directory and
+ the addressing scheme to a new format file in PATH, possibly expecting
+ to overwrite a previously existing file.
Use POOL for temporary allocation. */
-static svn_error_t *
-write_format(const char *path, int format, int max_files_per_dir,
- svn_boolean_t overwrite, apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__write_format(svn_fs_t *fs,
+ svn_boolean_t overwrite,
+ apr_pool_t *pool)
{
svn_stringbuf_t *sb;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const char *path = path_format(fs, pool);
- SVN_ERR_ASSERT(1 <= format && format <= SVN_FS_FS__FORMAT_NUMBER);
+ SVN_ERR_ASSERT(1 <= ffd->format
+ && ffd->format <= SVN_FS_FS__FORMAT_NUMBER);
- sb = svn_stringbuf_createf(pool, "%d\n", format);
+ sb = svn_stringbuf_createf(pool, "%d\n", ffd->format);
- if (format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
+ if (ffd->format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
{
- if (max_files_per_dir)
+ if (ffd->max_files_per_dir)
svn_stringbuf_appendcstr(sb, apr_psprintf(pool, "layout sharded %d\n",
- max_files_per_dir));
+ ffd->max_files_per_dir));
else
svn_stringbuf_appendcstr(sb, "layout linear\n");
}
+ if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
+ {
+ if (ffd->use_log_addressing)
+ svn_stringbuf_appendcstr(sb, "addressing logical\n");
+ else
+ svn_stringbuf_appendcstr(sb, "addressing physical\n");
+ }
+
/* svn_io_write_version_file() does a load of magic to allow it to
replace version files that already exist. We only need to do
that when we're allowed to overwrite an existing file. */
@@ -1130,15 +623,8 @@ write_format(const char *path, int format, int max_files_per_dir,
}
else
{
- const char *path_tmp;
-
- SVN_ERR(svn_io_write_unique(&path_tmp,
- svn_dirent_dirname(path, pool),
- sb->data, sb->len,
- svn_io_file_del_none, pool));
-
- /* rename the temp file as the real destination */
- SVN_ERR(svn_io_file_rename(path_tmp, path, pool));
+ SVN_ERR(svn_io_write_atomic(path, sb->data, sb->len,
+ NULL /* copy_perms_path */, pool));
}
/* And set the perms to make it read only */
@@ -1152,21 +638,68 @@ svn_fs_fs__fs_supports_mergeinfo(svn_fs_t *fs)
return ffd->format >= SVN_FS_FS__MIN_MERGEINFO_FORMAT;
}
+/* Check that BLOCK_SIZE is a valid block / page size, i.e. it is within
+ * the range of what the current system may address in RAM and it is a
+ * power of 2. Assume that the element size within the block is ITEM_SIZE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+verify_block_size(apr_int64_t block_size,
+ apr_size_t item_size,
+ const char *name,
+ apr_pool_t *scratch_pool
+ )
+{
+ /* Limit range. */
+ if (block_size <= 0)
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is too small for fsfs.conf setting '%s'."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ if (block_size > SVN_MAX_OBJECT_SIZE / item_size)
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is too large for fsfs.conf setting '%s'."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ /* Ensure it is a power of two.
+ * For positive X, X & (X-1) will reset the lowest bit set.
+ * If the result is 0, at most one bit has been set. */
+ if (0 != (block_size & (block_size - 1)))
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is invalid for fsfs.conf setting '%s' "
+ "because it is not a power of 2."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ return SVN_NO_ERROR;
+}
+
/* Read the configuration information of the file system at FS_PATH
- * and set the respective values in FFD. Use POOL for allocations.
+ * and set the respective values in FFD. Use pools as usual.
*/
static svn_error_t *
read_config(fs_fs_data_t *ffd,
const char *fs_path,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- SVN_ERR(svn_config_read3(&ffd->config,
- svn_dirent_join(fs_path, PATH_CONFIG, pool),
- FALSE, FALSE, FALSE, pool));
+ svn_config_t *config;
+
+ SVN_ERR(svn_config_read3(&config,
+ svn_dirent_join(fs_path, PATH_CONFIG, scratch_pool),
+ FALSE, FALSE, FALSE, scratch_pool));
/* Initialize ffd->rep_sharing_allowed. */
if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
- SVN_ERR(svn_config_get_bool(ffd->config, &ffd->rep_sharing_allowed,
+ SVN_ERR(svn_config_get_bool(config, &ffd->rep_sharing_allowed,
CONFIG_SECTION_REP_SHARING,
CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
else
@@ -1175,22 +708,32 @@ read_config(fs_fs_data_t *ffd,
/* Initialize deltification settings in ffd. */
if (ffd->format >= SVN_FS_FS__MIN_DELTIFICATION_FORMAT)
{
- SVN_ERR(svn_config_get_bool(ffd->config, &ffd->deltify_directories,
+ apr_int64_t compression_level;
+
+ SVN_ERR(svn_config_get_bool(config, &ffd->deltify_directories,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_ENABLE_DIR_DELTIFICATION,
- FALSE));
- SVN_ERR(svn_config_get_bool(ffd->config, &ffd->deltify_properties,
+ TRUE));
+ SVN_ERR(svn_config_get_bool(config, &ffd->deltify_properties,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION,
- FALSE));
- SVN_ERR(svn_config_get_int64(ffd->config, &ffd->max_deltification_walk,
+ TRUE));
+ SVN_ERR(svn_config_get_int64(config, &ffd->max_deltification_walk,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_MAX_DELTIFICATION_WALK,
SVN_FS_FS_MAX_DELTIFICATION_WALK));
- SVN_ERR(svn_config_get_int64(ffd->config, &ffd->max_linear_deltification,
+ SVN_ERR(svn_config_get_int64(config, &ffd->max_linear_deltification,
CONFIG_SECTION_DELTIFICATION,
CONFIG_OPTION_MAX_LINEAR_DELTIFICATION,
SVN_FS_FS_MAX_LINEAR_DELTIFICATION));
+
+ SVN_ERR(svn_config_get_int64(config, &compression_level,
+ CONFIG_SECTION_DELTIFICATION,
+ CONFIG_OPTION_COMPRESSION_LEVEL,
+ SVN_DELTA_COMPRESSION_LEVEL_DEFAULT));
+ ffd->delta_compression_level
+ = (int)MIN(MAX(SVN_DELTA_COMPRESSION_LEVEL_NONE, compression_level),
+ SVN_DELTA_COMPRESSION_LEVEL_MAX);
}
else
{
@@ -1198,21 +741,22 @@ read_config(fs_fs_data_t *ffd,
ffd->deltify_properties = FALSE;
ffd->max_deltification_walk = SVN_FS_FS_MAX_DELTIFICATION_WALK;
ffd->max_linear_deltification = SVN_FS_FS_MAX_LINEAR_DELTIFICATION;
+ ffd->delta_compression_level = SVN_DELTA_COMPRESSION_LEVEL_DEFAULT;
}
/* Initialize revprop packing settings in ffd. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
{
- SVN_ERR(svn_config_get_bool(ffd->config, &ffd->compress_packed_revprops,
+ SVN_ERR(svn_config_get_bool(config, &ffd->compress_packed_revprops,
CONFIG_SECTION_PACKED_REVPROPS,
CONFIG_OPTION_COMPRESS_PACKED_REVPROPS,
FALSE));
- SVN_ERR(svn_config_get_int64(ffd->config, &ffd->revprop_pack_size,
+ SVN_ERR(svn_config_get_int64(config, &ffd->revprop_pack_size,
CONFIG_SECTION_PACKED_REVPROPS,
CONFIG_OPTION_REVPROP_PACK_SIZE,
ffd->compress_packed_revprops
- ? 0x100
- : 0x40));
+ ? 0x10
+ : 0x4));
ffd->revprop_pack_size *= 1024;
}
@@ -1222,6 +766,64 @@ read_config(fs_fs_data_t *ffd,
ffd->compress_packed_revprops = FALSE;
}
+ if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
+ {
+ SVN_ERR(svn_config_get_int64(config, &ffd->block_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_BLOCK_SIZE,
+ 64));
+ SVN_ERR(svn_config_get_int64(config, &ffd->l2p_page_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_L2P_PAGE_SIZE,
+ 0x2000));
+ SVN_ERR(svn_config_get_int64(config, &ffd->p2l_page_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_P2L_PAGE_SIZE,
+ 0x400));
+
+ /* Don't accept unreasonable or illegal values.
+ * Block size and P2L page size are in kbytes;
+ * L2P blocks are arrays of apr_off_t. */
+ SVN_ERR(verify_block_size(ffd->block_size, 0x400,
+ CONFIG_OPTION_BLOCK_SIZE, scratch_pool));
+ SVN_ERR(verify_block_size(ffd->p2l_page_size, 0x400,
+ CONFIG_OPTION_P2L_PAGE_SIZE, scratch_pool));
+ SVN_ERR(verify_block_size(ffd->l2p_page_size, sizeof(apr_off_t),
+ CONFIG_OPTION_L2P_PAGE_SIZE, scratch_pool));
+
+ /* convert kBytes to bytes */
+ ffd->block_size *= 0x400;
+ ffd->p2l_page_size *= 0x400;
+ /* L2P pages are in entries - not in (k)Bytes */
+ }
+ else
+ {
+ /* should be irrelevant but we initialize them anyway */
+ ffd->block_size = 0x1000; /* Matches default APR file buffer size. */
+ ffd->l2p_page_size = 0x2000; /* Matches above default. */
+ ffd->p2l_page_size = 0x100000; /* Matches above default in bytes. */
+ }
+
+ if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
+ {
+ SVN_ERR(svn_config_get_bool(config, &ffd->pack_after_commit,
+ CONFIG_SECTION_DEBUG,
+ CONFIG_OPTION_PACK_AFTER_COMMIT,
+ FALSE));
+ }
+ else
+ {
+ ffd->pack_after_commit = FALSE;
+ }
+
+ /* memcached configuration */
+ SVN_ERR(svn_cache__make_memcache_from_config(&ffd->memcache, config,
+ result_pool, scratch_pool));
+
+ SVN_ERR(svn_config_get_bool(config, &ffd->fail_stop,
+ CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
+ FALSE));
+
return SVN_NO_ERROR;
}
@@ -1286,20 +888,20 @@ write_config(svn_fs_t *fs,
"###" NL
"### The following parameter enables deltification for directories. It can" NL
"### be switched on and off at will, but for best space-saving results" NL
-"### should be enabled consistently over the life of the repository." NL
+"### should be enabled consistently over the lifetime of the repository." NL
"### Repositories containing large directories will benefit greatly." NL
-"### In rarely read repositories, the I/O overhead may be significant as" NL
-"### cache hit rates will most likely be low" NL
-"### directory deltification is disabled by default." NL
-"# " CONFIG_OPTION_ENABLE_DIR_DELTIFICATION " = false" NL
+"### In rarely accessed repositories, the I/O overhead may be significant" NL
+"### as caches will most likely be low." NL
+"### directory deltification is enabled by default." NL
+"# " CONFIG_OPTION_ENABLE_DIR_DELTIFICATION " = true" NL
"###" NL
"### The following parameter enables deltification for properties on files" NL
"### and directories. Overall, this is a minor tuning option but can save" NL
"### some disk space if you merge frequently or frequently change node" NL
"### properties. You should not activate this if rep-sharing has been" NL
"### disabled because this may result in a net increase in repository size." NL
-"### property deltification is disabled by default." NL
-"# " CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION " = false" NL
+"### property deltification is enabled by default." NL
+"# " CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION " = true" NL
"###" NL
"### During commit, the server may need to walk the whole change history of" NL
"### of a given node to find a suitable deltification base. This linear" NL
@@ -1331,6 +933,24 @@ write_config(svn_fs_t *fs,
"### exclusive use of skip-deltas (as in pre-1.8)." NL
"### For 1.8, the default value is 16; earlier versions use 1." NL
"# " CONFIG_OPTION_MAX_LINEAR_DELTIFICATION " = 16" NL
+"###" NL
+"### After deltification, we compress the data through zlib to minimize on-" NL
+"### disk size. That can be an expensive and ineffective process. This" NL
+"### setting controls the usage of zlib in future revisions." NL
+"### Revisions with highly compressible data in them may shrink in size" NL
+"### if the setting is increased but may take much longer to commit. The" NL
+"### time taken to uncompress that data again is widely independent of the" NL
+"### compression level." NL
+"### Compression will be ineffective if the incoming content is already" NL
+"### highly compressed. In that case, disabling the compression entirely" NL
+"### will speed up commits as well as reading the data. Repositories with" NL
+"### many small compressible files (source code) but also a high percentage" NL
+"### of large incompressible ones (artwork) may benefit from compression" NL
+"### levels lowered to e.g. 1." NL
+"### Valid values are 0 to 9 with 9 providing the highest compression ratio" NL
+"### and 0 disabling it altogether." NL
+"### The default value is 5." NL
+"# " CONFIG_OPTION_COMPRESSION_LEVEL " = 5" NL
"" NL
"[" CONFIG_SECTION_PACKED_REVPROPS "]" NL
"### This parameter controls the size (in kBytes) of packed revprop files." NL
@@ -1340,96 +960,174 @@ write_config(svn_fs_t *fs,
"### much larger than the limit set here. The threshold will be applied" NL
"### before optional compression takes place." NL
"### Large values will reduce disk space usage at the expense of increased" NL
-"### latency and CPU usage reading and changing individual revprops. They" NL
-"### become an advantage when revprop caching has been enabled because a" NL
-"### lot of data can be read in one go. Values smaller than 4 kByte will" NL
-"### not improve latency any further and quickly render revprop packing" NL
-"### ineffective." NL
-"### revprop-pack-size is 64 kBytes by default for non-compressed revprop" NL
-"### pack files and 256 kBytes when compression has been enabled." NL
-"# " CONFIG_OPTION_REVPROP_PACK_SIZE " = 64" NL
+"### latency and CPU usage reading and changing individual revprops." NL
+"### Values smaller than 4 kByte will not improve latency any further and " NL
+"### quickly render revprop packing ineffective." NL
+"### revprop-pack-size is 4 kBytes by default for non-compressed revprop" NL
+"### pack files and 16 kBytes when compression has been enabled." NL
+"# " CONFIG_OPTION_REVPROP_PACK_SIZE " = 4" NL
"###" NL
"### To save disk space, packed revprop files may be compressed. Standard" NL
"### revprops tend to allow for very effective compression. Reading and" NL
-"### even more so writing, become significantly more CPU intensive. With" NL
-"### revprop caching enabled, the overhead can be offset by reduced I/O" NL
-"### unless you often modify revprops after packing." NL
+"### even more so writing, become significantly more CPU intensive." NL
"### Compressing packed revprops is disabled by default." NL
"# " CONFIG_OPTION_COMPRESS_PACKED_REVPROPS " = false" NL
+"" NL
+"[" CONFIG_SECTION_IO "]" NL
+"### Parameters in this section control the data access granularity in" NL
+"### format 7 repositories and later. The defaults should translate into" NL
+"### decent performance over a wide range of setups." NL
+"###" NL
+"### When a specific piece of information needs to be read from disk, a" NL
+"### data block is being read at once and its contents are being cached." NL
+"### If the repository is being stored on a RAID, the block size should be" NL
+"### either 50% or 100% of RAID block size / granularity. Also, your file" NL
+"### system blocks/clusters should be properly aligned and sized. In that" NL
+"### setup, each access will hit only one disk (minimizes I/O load) but" NL
+"### uses all the data provided by the disk in a single access." NL
+"### For SSD-based storage systems, slightly lower values around 16 kB" NL
+"### may improve latency while still maximizing throughput. If block-read" NL
+"### has not been enabled, this will be capped to 4 kBytes." NL
+"### Can be changed at any time but must be a power of 2." NL
+"### block-size is given in kBytes and with a default of 64 kBytes." NL
+"# " CONFIG_OPTION_BLOCK_SIZE " = 64" NL
+"###" NL
+"### The log-to-phys index maps data item numbers to offsets within the" NL
+"### rev or pack file. This index is organized in pages of a fixed maximum" NL
+"### capacity. To access an item, the page table and the respective page" NL
+"### must be read." NL
+"### This parameter only affects revisions with thousands of changed paths." NL
+"### If you have several extremely large revisions (~1 mio changes), think" NL
+"### about increasing this setting. Reducing the value will rarely result" NL
+"### in a net speedup." NL
+"### This is an expert setting. Must be a power of 2." NL
+"### l2p-page-size is 8192 entries by default." NL
+"# " CONFIG_OPTION_L2P_PAGE_SIZE " = 8192" NL
+"###" NL
+"### The phys-to-log index maps positions within the rev or pack file to" NL
+"### to data items, i.e. describes what piece of information is being" NL
+"### stored at any particular offset. The index describes the rev file" NL
+"### in chunks (pages) and keeps a global list of all those pages. Large" NL
+"### pages mean a shorter page table but a larger per-page description of" NL
+"### data items in it. The latency sweetspot depends on the change size" NL
+"### distribution but covers a relatively wide range." NL
+"### If the repository contains very large files, i.e. individual changes" NL
+"### of tens of MB each, increasing the page size will shorten the index" NL
+"### file at the expense of a slightly increased latency in sections with" NL
+"### smaller changes." NL
+"### For source code repositories, this should be about 16x the block-size." NL
+"### Must be a power of 2." NL
+"### p2l-page-size is given in kBytes and with a default of 1024 kBytes." NL
+"# " CONFIG_OPTION_P2L_PAGE_SIZE " = 1024" NL
;
#undef NL
return svn_io_file_create(svn_dirent_join(fs->path, PATH_CONFIG, pool),
fsfs_conf_contents, pool);
}
+/* Read / Evaluate the global configuration in FS->CONFIG to set up
+ * parameters in FS. */
static svn_error_t *
-read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
- const char *path,
- apr_pool_t *pool)
+read_global_config(svn_fs_t *fs)
{
- char buf[80];
- apr_file_t *file;
- apr_size_t len;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* Providing a config hash is optional. */
+ if (fs->config)
+ ffd->use_block_read = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_BLOCK_READ,
+ FALSE);
+ else
+ ffd->use_block_read = FALSE;
- SVN_ERR(svn_io_file_open(&file, path, APR_READ | APR_BUFFERED,
- APR_OS_DEFAULT, pool));
- len = sizeof(buf);
- SVN_ERR(svn_io_read_length_line(file, buf, &len, pool));
- SVN_ERR(svn_io_file_close(file, pool));
+ /* Ignore the user-specified larger block size if we don't use block-read.
+ Defaulting to 4k gives us the same access granularity in format 7 as in
+ older formats. */
+ if (!ffd->use_block_read)
+ ffd->block_size = MIN(0x1000, ffd->block_size);
- *min_unpacked_rev = SVN_STR_TO_REV(buf);
return SVN_NO_ERROR;
}
+/* Read FS's UUID file and store the data in the FS struct. */
static svn_error_t *
-update_min_unpacked_rev(svn_fs_t *fs, apr_pool_t *pool)
+read_uuid(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
+ apr_file_t *uuid_file;
+ char buf[APR_UUID_FORMATTED_LENGTH + 2];
+ apr_size_t limit;
+
+ /* Read the repository uuid. */
+ SVN_ERR(svn_io_file_open(&uuid_file, path_uuid(fs, scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ limit = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit, scratch_pool));
+ fs->uuid = apr_pstrdup(fs->pool, buf);
- SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT);
+ /* Read the instance ID. */
+ if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
+ {
+ limit = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit,
+ scratch_pool));
+ ffd->instance_id = apr_pstrdup(fs->pool, buf);
+ }
+ else
+ {
+ ffd->instance_id = fs->uuid;
+ }
- return read_min_unpacked_rev(&ffd->min_unpacked_rev,
- path_min_unpacked_rev(fs, pool),
- pool);
+ SVN_ERR(svn_io_file_close(uuid_file, scratch_pool));
+
+ return SVN_NO_ERROR;
}
svn_error_t *
-svn_fs_fs__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
+svn_fs_fs__read_format_file(svn_fs_t *fs, apr_pool_t *scratch_pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
- apr_file_t *uuid_file;
int format, max_files_per_dir;
- char buf[APR_UUID_FORMATTED_LENGTH + 2];
- apr_size_t limit;
+ svn_boolean_t use_log_addressing;
- fs->path = apr_pstrdup(fs->pool, path);
+ /* Read info from format file. */
+ SVN_ERR(read_format(&format, &max_files_per_dir, &use_log_addressing,
+ path_format(fs, scratch_pool), scratch_pool));
- /* Read the FS format number. */
- SVN_ERR(read_format(&format, &max_files_per_dir,
- path_format(fs, pool), pool));
-
- /* Now we've got a format number no matter what. */
+ /* Now that we've got *all* info, store / update values in FFD. */
ffd->format = format;
ffd->max_files_per_dir = max_files_per_dir;
+ ffd->use_log_addressing = use_log_addressing;
- /* Read in and cache the repository uuid. */
- SVN_ERR(svn_io_file_open(&uuid_file, path_uuid(fs, pool),
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
+ return SVN_NO_ERROR;
+}
- limit = sizeof(buf);
- SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit, pool));
- fs->uuid = apr_pstrdup(fs->pool, buf);
+svn_error_t *
+svn_fs_fs__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ fs->path = apr_pstrdup(fs->pool, path);
+
+ /* Read the FS format file. */
+ SVN_ERR(svn_fs_fs__read_format_file(fs, pool));
- SVN_ERR(svn_io_file_close(uuid_file, pool));
+ /* Read in and cache the repository uuid. */
+ SVN_ERR(read_uuid(fs, pool));
/* Read the min unpacked revision. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(update_min_unpacked_rev(fs, pool));
+ SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, pool));
/* Read the configuration file. */
- SVN_ERR(read_config(ffd, fs->path, pool));
+ SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
- return get_youngest(&(ffd->youngest_rev_cache), path, pool);
+ /* Global configuration options. */
+ SVN_ERR(read_global_config(fs));
+
+ return get_youngest(&(ffd->youngest_rev_cache), fs, pool);
}
/* Wrapper around svn_io_file_create which ignores EEXIST. */
@@ -1447,125 +1145,32 @@ create_file_ignore_eexist(const char *file,
return svn_error_trace(err);
}
-/* forward declarations */
-
-static svn_error_t *
-pack_revprops_shard(const char *pack_file_dir,
- const char *shard_path,
- apr_int64_t shard,
- int max_files_per_dir,
- apr_off_t max_pack_size,
- int compression_level,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
-
-static svn_error_t *
-delete_revprops_shard(const char *shard_path,
- apr_int64_t shard,
- int max_files_per_dir,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
-
-/* In the filesystem FS, pack all revprop shards up to min_unpacked_rev.
- *
- * NOTE: Keep the old non-packed shards around until after the format bump.
- * Otherwise, re-running upgrade will drop the packed revprop shard but
- * have no unpacked data anymore. Call upgrade_cleanup_pack_revprops after
- * the bump.
- *
- * Use SCRATCH_POOL for temporary allocations.
- */
-static svn_error_t *
-upgrade_pack_revprops(svn_fs_t *fs,
- apr_pool_t *scratch_pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- const char *revprops_shard_path;
- const char *revprops_pack_file_dir;
- apr_int64_t shard;
- apr_int64_t first_unpacked_shard
- = ffd->min_unpacked_rev / ffd->max_files_per_dir;
-
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
- scratch_pool);
- int compression_level = ffd->compress_packed_revprops
- ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
- : SVN_DELTA_COMPRESSION_LEVEL_NONE;
-
- /* first, pack all revprops shards to match the packed revision shards */
- for (shard = 0; shard < first_unpacked_shard; ++shard)
- {
- revprops_pack_file_dir = svn_dirent_join(revsprops_dir,
- apr_psprintf(iterpool,
- "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
- shard),
- iterpool);
- revprops_shard_path = svn_dirent_join(revsprops_dir,
- apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
- iterpool);
-
- SVN_ERR(pack_revprops_shard(revprops_pack_file_dir, revprops_shard_path,
- shard, ffd->max_files_per_dir,
- (int)(0.9 * ffd->revprop_pack_size),
- compression_level,
- NULL, NULL, iterpool));
- svn_pool_clear(iterpool);
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* In the filesystem FS, remove all non-packed revprop shards up to
- * min_unpacked_rev. Use SCRATCH_POOL for temporary allocations.
- * See upgrade_pack_revprops for more info.
- */
-static svn_error_t *
-upgrade_cleanup_pack_revprops(svn_fs_t *fs,
- apr_pool_t *scratch_pool)
+/* Baton type bridging svn_fs_fs__upgrade and upgrade_body carrying
+ * parameters over between them. */
+struct upgrade_baton_t
{
- fs_fs_data_t *ffd = fs->fsap_data;
- const char *revprops_shard_path;
- apr_int64_t shard;
- apr_int64_t first_unpacked_shard
- = ffd->min_unpacked_rev / ffd->max_files_per_dir;
-
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
- scratch_pool);
-
- /* delete the non-packed revprops shards afterwards */
- for (shard = 0; shard < first_unpacked_shard; ++shard)
- {
- revprops_shard_path = svn_dirent_join(revsprops_dir,
- apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
- iterpool);
- SVN_ERR(delete_revprops_shard(revprops_shard_path,
- shard, ffd->max_files_per_dir,
- NULL, NULL, iterpool));
- svn_pool_clear(iterpool);
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
+ svn_fs_t *fs;
+ svn_fs_upgrade_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+};
static svn_error_t *
upgrade_body(void *baton, apr_pool_t *pool)
{
- svn_fs_t *fs = baton;
+ struct upgrade_baton_t *upgrade_baton = baton;
+ svn_fs_t *fs = upgrade_baton->fs;
+ fs_fs_data_t *ffd = fs->fsap_data;
int format, max_files_per_dir;
+ svn_boolean_t use_log_addressing;
const char *format_path = path_format(fs, pool);
svn_node_kind_t kind;
svn_boolean_t needs_revprop_shard_cleanup = FALSE;
/* Read the FS format number and max-files-per-dir setting. */
- SVN_ERR(read_format(&format, &max_files_per_dir, format_path, pool));
+ SVN_ERR(read_format(&format, &max_files_per_dir, &use_log_addressing,
+ format_path, pool));
/* If the config file does not exist, create one. */
SVN_ERR(svn_io_check_path(svn_dirent_join(fs->path, PATH_CONFIG, pool),
@@ -1589,29 +1194,30 @@ upgrade_body(void *baton, apr_pool_t *pool)
if (format == SVN_FS_FS__FORMAT_NUMBER)
return SVN_NO_ERROR;
- /* If our filesystem predates the existance of the 'txn-current
+ /* If our filesystem predates the existence of the 'txn-current
file', make that file and its corresponding lock file. */
if (format < SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
{
- SVN_ERR(create_file_ignore_eexist(path_txn_current(fs, pool), "0\n",
- pool));
- SVN_ERR(create_file_ignore_eexist(path_txn_current_lock(fs, pool), "",
- pool));
+ SVN_ERR(create_file_ignore_eexist(
+ svn_fs_fs__path_txn_current(fs, pool), "0\n",
+ pool));
+ SVN_ERR(create_file_ignore_eexist(
+ svn_fs_fs__path_txn_current_lock(fs, pool), "",
+ pool));
}
- /* If our filesystem predates the existance of the 'txn-protorevs'
+ /* If our filesystem predates the existence of the 'txn-protorevs'
dir, make that directory. */
if (format < SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
{
- /* We don't use path_txn_proto_rev() here because it expects
- we've already bumped our format. */
SVN_ERR(svn_io_make_dir_recursively(
- svn_dirent_join(fs->path, PATH_TXN_PROTOS_DIR, pool), pool));
+ svn_fs_fs__path_txn_proto_revs(fs, pool), pool));
}
/* If our filesystem is new enough, write the min unpacked rev file. */
if (format < SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(svn_io_file_create(path_min_unpacked_rev(fs, pool), "0\n", pool));
+ SVN_ERR(svn_io_file_create(svn_fs_fs__path_min_unpacked_rev(fs, pool),
+ "0\n", pool));
/* If the file system supports revision packing but not revprop packing
*and* the FS has been sharded, pack the revprops up to the point that
@@ -1622,16 +1228,46 @@ upgrade_body(void *baton, apr_pool_t *pool)
&& max_files_per_dir > 0)
{
needs_revprop_shard_cleanup = TRUE;
- SVN_ERR(upgrade_pack_revprops(fs, pool));
- }
+ SVN_ERR(svn_fs_fs__upgrade_pack_revprops(fs,
+ upgrade_baton->notify_func,
+ upgrade_baton->notify_baton,
+ upgrade_baton->cancel_func,
+ upgrade_baton->cancel_baton,
+ pool));
+ }
+
+ /* We will need the UUID info shortly ...
+ Read it before the format bump as the UUID file still uses the old
+ format. */
+ SVN_ERR(read_uuid(fs, pool));
+
+ /* Update the format info in the FS struct. Upgrade steps further
+ down will use the format from FS to create missing info. */
+ ffd->format = SVN_FS_FS__FORMAT_NUMBER;
+ ffd->max_files_per_dir = max_files_per_dir;
+ ffd->use_log_addressing = use_log_addressing;
+
+ /* Always add / bump the instance ID such that no form of caching
+ accidentally uses outdated information. Keep the UUID. */
+ SVN_ERR(svn_fs_fs__set_uuid(fs, fs->uuid, NULL, pool));
/* Bump the format file. */
- SVN_ERR(write_format(format_path, SVN_FS_FS__FORMAT_NUMBER,
- max_files_per_dir, TRUE, pool));
+ SVN_ERR(svn_fs_fs__write_format(fs, TRUE, pool));
+
+ if (upgrade_baton->notify_func)
+ SVN_ERR(upgrade_baton->notify_func(upgrade_baton->notify_baton,
+ SVN_FS_FS__FORMAT_NUMBER,
+ svn_fs_upgrade_format_bumped,
+ pool));
/* Now, it is safe to remove the redundant revprop files. */
if (needs_revprop_shard_cleanup)
- SVN_ERR(upgrade_cleanup_pack_revprops(fs, pool));
+ SVN_ERR(svn_fs_fs__upgrade_cleanup_pack_revprops(fs,
+ upgrade_baton->notify_func,
+ upgrade_baton->notify_baton,
+ upgrade_baton->cancel_func,
+ upgrade_baton->cancel_baton,
+ pool));
/* Done */
return SVN_NO_ERROR;
@@ -1639,121 +1275,21 @@ upgrade_body(void *baton, apr_pool_t *pool)
svn_error_t *
-svn_fs_fs__upgrade(svn_fs_t *fs, apr_pool_t *pool)
-{
- return svn_fs_fs__with_write_lock(fs, upgrade_body, (void *)fs, pool);
-}
-
-
-/* Functions for dealing with recoverable errors on mutable files
- *
- * Revprops, current, and txn-current files are mutable; that is, they
- * change as part of normal fsfs operation, in constrat to revs files, or
- * the format file, which are written once at create (or upgrade) time.
- * When more than one host writes to the same repository, we will
- * sometimes see these recoverable errors when accesssing these files.
- *
- * These errors all relate to NFS, and thus we only use this retry code if
- * ESTALE is defined.
- *
- ** ESTALE
- *
- * In NFS v3 and under, the server doesn't track opened files. If you
- * unlink(2) or rename(2) a file held open by another process *on the
- * same host*, that host's kernel typically renames the file to
- * .nfsXXXX and automatically deletes that when it's no longer open,
- * but this behavior is not required.
- *
- * For obvious reasons, this does not work *across hosts*. No one
- * knows about the opened file; not the server, and not the deleting
- * client. So the file vanishes, and the reader gets stale NFS file
- * handle.
- *
- ** EIO, ENOENT
- *
- * Some client implementations (at least the 2.6.18.5 kernel that ships
- * with Ubuntu Dapper) sometimes give spurious ENOENT (only on open) or
- * even EIO errors when trying to read these files that have been renamed
- * over on some other host.
- *
- ** Solution
- *
- * Try open and read of such files in try_stringbuf_from_file(). Call
- * this function within a loop of RECOVERABLE_RETRY_COUNT iterations
- * (though, realistically, the second try will succeed).
- */
-
-#define RECOVERABLE_RETRY_COUNT 10
-
-/* Read the file at PATH and return its content in *CONTENT. *CONTENT will
- * not be modified unless the whole file was read successfully.
- *
- * ESTALE, EIO and ENOENT will not cause this function to return an error
- * unless LAST_ATTEMPT has been set. If MISSING is not NULL, indicate
- * missing files (ENOENT) there.
- *
- * Use POOL for allocations.
- */
-static svn_error_t *
-try_stringbuf_from_file(svn_stringbuf_t **content,
- svn_boolean_t *missing,
- const char *path,
- svn_boolean_t last_attempt,
- apr_pool_t *pool)
-{
- svn_error_t *err = svn_stringbuf_from_file2(content, path, pool);
- if (missing)
- *missing = FALSE;
-
- if (err)
- {
- *content = NULL;
-
- if (APR_STATUS_IS_ENOENT(err->apr_err))
- {
- if (!last_attempt)
- {
- svn_error_clear(err);
- if (missing)
- *missing = TRUE;
- return SVN_NO_ERROR;
- }
- }
-#ifdef ESTALE
- else if (APR_TO_OS_ERROR(err->apr_err) == ESTALE
- || APR_TO_OS_ERROR(err->apr_err) == EIO)
- {
- if (!last_attempt)
- {
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
- }
-#endif
- }
-
- return svn_error_trace(err);
-}
-
-/* Read the 'current' file FNAME and store the contents in *BUF.
- Allocations are performed in POOL. */
-static svn_error_t *
-read_content(svn_stringbuf_t **content, const char *fname, apr_pool_t *pool)
+svn_fs_fs__upgrade(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
{
- int i;
- *content = NULL;
+ struct upgrade_baton_t baton;
+ baton.fs = fs;
+ baton.notify_func = notify_func;
+ baton.notify_baton = notify_baton;
+ baton.cancel_func = cancel_func;
+ baton.cancel_baton = cancel_baton;
- for (i = 0; !*content && (i < RECOVERABLE_RETRY_COUNT); ++i)
- SVN_ERR(try_stringbuf_from_file(content, NULL,
- fname, i + 1 < RECOVERABLE_RETRY_COUNT,
- pool));
-
- if (!*content)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Can't read '%s'"),
- svn_dirent_local_style(fname, pool));
-
- return SVN_NO_ERROR;
+ return svn_fs_fs__with_all_locks(fs, upgrade_body, (void *)&baton, pool);
}
/* Find the youngest revision in a repository at path FS_PATH and
@@ -1761,15 +1297,11 @@ read_content(svn_stringbuf_t **content, const char *fname, apr_pool_t *pool)
POOL. */
static svn_error_t *
get_youngest(svn_revnum_t *youngest_p,
- const char *fs_path,
+ svn_fs_t *fs,
apr_pool_t *pool)
{
- svn_stringbuf_t *buf;
- SVN_ERR(read_content(&buf, svn_dirent_join(fs_path, PATH_CURRENT, pool),
- pool));
-
- *youngest_p = SVN_STR_TO_REV(buf->data);
-
+ apr_uint64_t dummy;
+ SVN_ERR(svn_fs_fs__read_current(youngest_p, &dummy, &dummy, fs, pool));
return SVN_NO_ERROR;
}
@@ -1781,88 +1313,37 @@ svn_fs_fs__youngest_rev(svn_revnum_t *youngest_p,
{
fs_fs_data_t *ffd = fs->fsap_data;
- SVN_ERR(get_youngest(youngest_p, fs->path, pool));
+ SVN_ERR(get_youngest(youngest_p, fs, pool));
ffd->youngest_rev_cache = *youngest_p;
return SVN_NO_ERROR;
}
-/* Given a revision file FILE that has been pre-positioned at the
- beginning of a Node-Rev header block, read in that header block and
- store it in the apr_hash_t HEADERS. All allocations will be from
- POOL. */
-static svn_error_t * read_header_block(apr_hash_t **headers,
- svn_stream_t *stream,
- apr_pool_t *pool)
+int
+svn_fs_fs__shard_size(svn_fs_t *fs)
{
- *headers = apr_hash_make(pool);
-
- while (1)
- {
- svn_stringbuf_t *header_str;
- const char *name, *value;
- apr_size_t i = 0;
- svn_boolean_t eof;
-
- SVN_ERR(svn_stream_readline(stream, &header_str, "\n", &eof, pool));
-
- if (eof || header_str->len == 0)
- break; /* end of header block */
-
- while (header_str->data[i] != ':')
- {
- if (header_str->data[i] == '\0')
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Found malformed header '%s' in "
- "revision file"),
- header_str->data);
- i++;
- }
-
- /* Create a 'name' string and point to it. */
- header_str->data[i] = '\0';
- name = header_str->data;
-
- /* Skip over the NULL byte and the space following it. */
- i += 2;
+ fs_fs_data_t *ffd = fs->fsap_data;
- if (i > header_str->len)
- {
- /* Restore the original line for the error. */
- i -= 2;
- header_str->data[i] = ':';
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Found malformed header '%s' in "
- "revision file"),
- header_str->data);
- }
+ return ffd->max_files_per_dir;
+}
- value = header_str->data + i;
+svn_error_t *
+svn_fs_fs__min_unpacked_rev(svn_revnum_t *min_unpacked,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
- /* header_str is safely in our pool, so we can use bits of it as
- key and value. */
- svn_hash_sets(*headers, name, value);
- }
+ SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, pool));
+ *min_unpacked = ffd->min_unpacked_rev;
return SVN_NO_ERROR;
}
-/* Return SVN_ERR_FS_NO_SUCH_REVISION if the given revision is newer
- than the current youngest revision or is simply not a valid
- revision number, else return success.
-
- FSFS is based around the concept that commits only take effect when
- the number in "current" is bumped. Thus if there happens to be a rev
- or revprops file installed for a revision higher than the one recorded
- in "current" (because a commit failed between installing the rev file
- and bumping "current", or because an administrator rolled back the
- repository by resetting "current" without deleting rev files, etc), it
- ought to be completely ignored. This function provides the check
- by which callers can make that decision. */
-static svn_error_t *
-ensure_revision_exists(svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__ensure_revision_exists(svn_revnum_t rev,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
@@ -1876,7 +1357,7 @@ ensure_revision_exists(svn_fs_t *fs,
if (rev <= ffd->youngest_rev_cache)
return SVN_NO_ERROR;
- SVN_ERR(get_youngest(&(ffd->youngest_rev_cache), fs->path, pool));
+ SVN_ERR(get_youngest(&(ffd->youngest_rev_cache), fs, pool));
/* Check again. */
if (rev <= ffd->youngest_rev_cache)
@@ -1887,3931 +1368,53 @@ ensure_revision_exists(svn_fs_t *fs,
}
svn_error_t *
-svn_fs_fs__revision_exists(svn_revnum_t rev,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- /* Different order of parameters. */
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
- return SVN_NO_ERROR;
-}
-
-/* Open the correct revision file for REV. If the filesystem FS has
- been packed, *FILE will be set to the packed file; otherwise, set *FILE
- to the revision file for REV. Return SVN_ERR_FS_NO_SUCH_REVISION if the
- file doesn't exist.
-
- TODO: Consider returning an indication of whether this is a packed rev
- file, so the caller need not rely on is_packed_rev() which in turn
- relies on the cached FFD->min_unpacked_rev value not having changed
- since the rev file was opened.
-
- Use POOL for allocations. */
-static svn_error_t *
-open_pack_or_rev_file(apr_file_t **file,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_error_t *err;
- const char *path;
- svn_boolean_t retry = FALSE;
-
- do
- {
- err = svn_fs_fs__path_rev_absolute(&path, fs, rev, pool);
-
- /* open the revision file in buffered r/o mode */
- if (! err)
- err = svn_io_file_open(file, path,
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool);
-
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- {
- /* Could not open the file. This may happen if the
- * file once existed but got packed later. */
- svn_error_clear(err);
-
- /* if that was our 2nd attempt, leave it at that. */
- if (retry)
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("No such revision %ld"), rev);
-
- /* We failed for the first time. Refresh cache & retry. */
- SVN_ERR(update_min_unpacked_rev(fs, pool));
-
- retry = TRUE;
- }
- else
- {
- svn_error_clear(err);
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("No such revision %ld"), rev);
- }
- }
- else
- {
- retry = FALSE;
- }
- }
- while (retry);
-
- return svn_error_trace(err);
-}
-
-/* Reads a line from STREAM and converts it to a 64 bit integer to be
- * returned in *RESULT. If we encounter eof, set *HIT_EOF and leave
- * *RESULT unchanged. If HIT_EOF is NULL, EOF causes an "corrupt FS"
- * error return.
- * SCRATCH_POOL is used for temporary allocations.
- */
-static svn_error_t *
-read_number_from_stream(apr_int64_t *result,
- svn_boolean_t *hit_eof,
- svn_stream_t *stream,
- apr_pool_t *scratch_pool)
-{
- svn_stringbuf_t *sb;
- svn_boolean_t eof;
- svn_error_t *err;
-
- SVN_ERR(svn_stream_readline(stream, &sb, "\n", &eof, scratch_pool));
- if (hit_eof)
- *hit_eof = eof;
- else
- if (eof)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL, _("Unexpected EOF"));
-
- if (!eof)
- {
- err = svn_cstring_atoi64(result, sb->data);
- if (err)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
- _("Number '%s' invalid or too large"),
- sb->data);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Given REV in FS, set *REV_OFFSET to REV's offset in the packed file.
- Use POOL for temporary allocations. */
-static svn_error_t *
-get_packed_offset(apr_off_t *rev_offset,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_stream_t *manifest_stream;
- svn_boolean_t is_cached;
- svn_revnum_t shard;
- apr_int64_t shard_pos;
- apr_array_header_t *manifest;
- apr_pool_t *iterpool;
-
- shard = rev / ffd->max_files_per_dir;
-
- /* position of the shard within the manifest */
- shard_pos = rev % ffd->max_files_per_dir;
-
- /* fetch exactly that element into *rev_offset, if the manifest is found
- in the cache */
- SVN_ERR(svn_cache__get_partial((void **) rev_offset, &is_cached,
- ffd->packed_offset_cache, &shard,
- svn_fs_fs__get_sharded_offset, &shard_pos,
- pool));
-
- if (is_cached)
- return SVN_NO_ERROR;
-
- /* Open the manifest file. */
- SVN_ERR(svn_stream_open_readonly(&manifest_stream,
- path_rev_packed(fs, rev, PATH_MANIFEST,
- pool),
- pool, pool));
-
- /* While we're here, let's just read the entire manifest file into an array,
- so we can cache the entire thing. */
- iterpool = svn_pool_create(pool);
- manifest = apr_array_make(pool, ffd->max_files_per_dir, sizeof(apr_off_t));
- while (1)
- {
- svn_boolean_t eof;
- apr_int64_t val;
-
- svn_pool_clear(iterpool);
- SVN_ERR(read_number_from_stream(&val, &eof, manifest_stream, iterpool));
- if (eof)
- break;
-
- APR_ARRAY_PUSH(manifest, apr_off_t) = (apr_off_t)val;
- }
- svn_pool_destroy(iterpool);
-
- *rev_offset = APR_ARRAY_IDX(manifest, rev % ffd->max_files_per_dir,
- apr_off_t);
-
- /* Close up shop and cache the array. */
- SVN_ERR(svn_stream_close(manifest_stream));
- return svn_cache__set(ffd->packed_offset_cache, &shard, manifest, pool);
-}
-
-/* Open the revision file for revision REV in filesystem FS and store
- the newly opened file in FILE. Seek to location OFFSET before
- returning. Perform temporary allocations in POOL. */
-static svn_error_t *
-open_and_seek_revision(apr_file_t **file,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_off_t offset,
- apr_pool_t *pool)
-{
- apr_file_t *rev_file;
-
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
-
- SVN_ERR(open_pack_or_rev_file(&rev_file, fs, rev, pool));
-
- if (is_packed_rev(fs, rev))
- {
- apr_off_t rev_offset;
-
- SVN_ERR(get_packed_offset(&rev_offset, fs, rev, pool));
- offset += rev_offset;
- }
-
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
-
- *file = rev_file;
-
- return SVN_NO_ERROR;
-}
-
-/* Open the representation for a node-revision in transaction TXN_ID
- in filesystem FS and store the newly opened file in FILE. Seek to
- location OFFSET before returning. Perform temporary allocations in
- POOL. Only appropriate for file contents, nor props or directory
- contents. */
-static svn_error_t *
-open_and_seek_transaction(apr_file_t **file,
- svn_fs_t *fs,
- const char *txn_id,
- representation_t *rep,
- apr_pool_t *pool)
-{
- apr_file_t *rev_file;
- apr_off_t offset;
-
- SVN_ERR(svn_io_file_open(&rev_file, path_txn_proto_rev(fs, txn_id, pool),
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- offset = rep->offset;
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
-
- *file = rev_file;
-
- return SVN_NO_ERROR;
-}
-
-/* Given a node-id ID, and a representation REP in filesystem FS, open
- the correct file and seek to the correction location. Store this
- file in *FILE_P. Perform any allocations in POOL. */
-static svn_error_t *
-open_and_seek_representation(apr_file_t **file_p,
- svn_fs_t *fs,
- representation_t *rep,
- apr_pool_t *pool)
-{
- if (! rep->txn_id)
- return open_and_seek_revision(file_p, fs, rep->revision, rep->offset,
- pool);
- else
- return open_and_seek_transaction(file_p, fs, rep->txn_id, rep, pool);
-}
-
-/* Parse the description of a representation from STRING and store it
- into *REP_P. If the representation is mutable (the revision is
- given as -1), then use TXN_ID for the representation's txn_id
- field. If MUTABLE_REP_TRUNCATED is true, then this representation
- is for property or directory contents, and no information will be
- expected except the "-1" revision number for a mutable
- representation. Allocate *REP_P in POOL. */
-static svn_error_t *
-read_rep_offsets_body(representation_t **rep_p,
- char *string,
- const char *txn_id,
- svn_boolean_t mutable_rep_truncated,
- apr_pool_t *pool)
-{
- representation_t *rep;
- char *str;
- apr_int64_t val;
-
- rep = apr_pcalloc(pool, sizeof(*rep));
- *rep_p = rep;
-
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
-
- rep->revision = SVN_STR_TO_REV(str);
- if (rep->revision == SVN_INVALID_REVNUM)
- {
- rep->txn_id = txn_id;
- if (mutable_rep_truncated)
- return SVN_NO_ERROR;
- }
-
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- SVN_ERR(svn_cstring_atoi64(&val, str));
- rep->offset = (apr_off_t)val;
-
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- SVN_ERR(svn_cstring_atoi64(&val, str));
- rep->size = (svn_filesize_t)val;
-
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- SVN_ERR(svn_cstring_atoi64(&val, str));
- rep->expanded_size = (svn_filesize_t)val;
-
- /* Read in the MD5 hash. */
- str = svn_cstring_tokenize(" ", &string);
- if ((str == NULL) || (strlen(str) != (APR_MD5_DIGESTSIZE * 2)))
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- SVN_ERR(svn_checksum_parse_hex(&rep->md5_checksum, svn_checksum_md5, str,
- pool));
-
- /* The remaining fields are only used for formats >= 4, so check that. */
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return SVN_NO_ERROR;
-
- /* Read the SHA1 hash. */
- if (strlen(str) != (APR_SHA1_DIGESTSIZE * 2))
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- SVN_ERR(svn_checksum_parse_hex(&rep->sha1_checksum, svn_checksum_sha1, str,
- pool));
-
- /* Read the uniquifier. */
- str = svn_cstring_tokenize(" ", &string);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed text representation offset line in node-rev"));
-
- rep->uniquifier = apr_pstrdup(pool, str);
-
- return SVN_NO_ERROR;
-}
-
-/* Wrap read_rep_offsets_body(), extracting its TXN_ID from our NODEREV_ID,
- and adding an error message. */
-static svn_error_t *
-read_rep_offsets(representation_t **rep_p,
- char *string,
- const svn_fs_id_t *noderev_id,
- svn_boolean_t mutable_rep_truncated,
- apr_pool_t *pool)
-{
- svn_error_t *err;
- const char *txn_id;
-
- if (noderev_id)
- txn_id = svn_fs_fs__id_txn_id(noderev_id);
- else
- txn_id = NULL;
-
- err = read_rep_offsets_body(rep_p, string, txn_id, mutable_rep_truncated,
- pool);
- if (err)
- {
- const svn_string_t *id_unparsed = svn_fs_fs__id_unparse(noderev_id, pool);
- const char *where;
- where = apr_psprintf(pool,
- _("While reading representation offsets "
- "for node-revision '%s':"),
- noderev_id ? id_unparsed->data : "(null)");
-
- return svn_error_quick_wrap(err, where);
- }
- else
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-err_dangling_id(svn_fs_t *fs, const svn_fs_id_t *id)
-{
- svn_string_t *id_str = svn_fs_fs__id_unparse(id, fs->pool);
- return svn_error_createf
- (SVN_ERR_FS_ID_NOT_FOUND, 0,
- _("Reference to non-existent node '%s' in filesystem '%s'"),
- id_str->data, fs->path);
-}
-
-/* Look up the NODEREV_P for ID in FS' node revsion cache. If noderev
- * caching has been enabled and the data can be found, IS_CACHED will
- * be set to TRUE. The noderev will be allocated from POOL.
- *
- * Non-permanent ids (e.g. ids within a TXN) will not be cached.
- */
-static svn_error_t *
-get_cached_node_revision_body(node_revision_t **noderev_p,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- svn_boolean_t *is_cached,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- if (! ffd->node_revision_cache || svn_fs_fs__id_txn_id(id))
- {
- *is_cached = FALSE;
- }
- else
- {
- pair_cache_key_t key = { 0 };
-
- key.revision = svn_fs_fs__id_rev(id);
- key.second = svn_fs_fs__id_offset(id);
- SVN_ERR(svn_cache__get((void **) noderev_p,
- is_cached,
- ffd->node_revision_cache,
- &key,
- pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-/* If noderev caching has been enabled, store the NODEREV_P for the given ID
- * in FS' node revsion cache. SCRATCH_POOL is used for temporary allcations.
- *
- * Non-permanent ids (e.g. ids within a TXN) will not be cached.
- */
-static svn_error_t *
-set_cached_node_revision_body(node_revision_t *noderev_p,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *scratch_pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- if (ffd->node_revision_cache && !svn_fs_fs__id_txn_id(id))
- {
- pair_cache_key_t key = { 0 };
-
- key.revision = svn_fs_fs__id_rev(id);
- key.second = svn_fs_fs__id_offset(id);
- return svn_cache__set(ffd->node_revision_cache,
- &key,
- noderev_p,
- scratch_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Get the node-revision for the node ID in FS.
- Set *NODEREV_P to the new node-revision structure, allocated in POOL.
- See svn_fs_fs__get_node_revision, which wraps this and adds another
- error. */
-static svn_error_t *
-get_node_revision_body(node_revision_t **noderev_p,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *pool)
-{
- apr_file_t *revision_file;
- svn_error_t *err;
- svn_boolean_t is_cached = FALSE;
-
- /* First, try a cache lookup. If that succeeds, we are done here. */
- SVN_ERR(get_cached_node_revision_body(noderev_p, fs, id, &is_cached, pool));
- if (is_cached)
- return SVN_NO_ERROR;
-
- if (svn_fs_fs__id_txn_id(id))
- {
- /* This is a transaction node-rev. */
- err = svn_io_file_open(&revision_file, path_txn_node_rev(fs, id, pool),
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool);
- }
- else
- {
- /* This is a revision node-rev. */
- err = open_and_seek_revision(&revision_file, fs,
- svn_fs_fs__id_rev(id),
- svn_fs_fs__id_offset(id),
- pool);
- }
-
- if (err)
- {
- if (APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_clear(err);
- return svn_error_trace(err_dangling_id(fs, id));
- }
-
- return svn_error_trace(err);
- }
-
- SVN_ERR(svn_fs_fs__read_noderev(noderev_p,
- svn_stream_from_aprfile2(revision_file, FALSE,
- pool),
- pool));
-
- /* The noderev is not in cache, yet. Add it, if caching has been enabled. */
- return set_cached_node_revision_body(*noderev_p, fs, id, pool);
-}
-
-svn_error_t *
-svn_fs_fs__read_noderev(node_revision_t **noderev_p,
- svn_stream_t *stream,
- apr_pool_t *pool)
-{
- apr_hash_t *headers;
- node_revision_t *noderev;
- char *value;
- const char *noderev_id;
-
- SVN_ERR(read_header_block(&headers, stream, pool));
-
- noderev = apr_pcalloc(pool, sizeof(*noderev));
-
- /* Read the node-rev id. */
- value = svn_hash_gets(headers, HEADER_ID);
- if (value == NULL)
- /* ### More information: filename/offset coordinates */
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Missing id field in node-rev"));
-
- SVN_ERR(svn_stream_close(stream));
-
- noderev->id = svn_fs_fs__id_parse(value, strlen(value), pool);
- noderev_id = value; /* for error messages later */
-
- /* Read the type. */
- value = svn_hash_gets(headers, HEADER_TYPE);
-
- if ((value == NULL) ||
- (strcmp(value, KIND_FILE) != 0 && strcmp(value, KIND_DIR)))
- /* ### s/kind/type/ */
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Missing kind field in node-rev '%s'"),
- noderev_id);
-
- noderev->kind = (strcmp(value, KIND_FILE) == 0) ? svn_node_file
- : svn_node_dir;
-
- /* Read the 'count' field. */
- value = svn_hash_gets(headers, HEADER_COUNT);
- if (value)
- SVN_ERR(svn_cstring_atoi(&noderev->predecessor_count, value));
- else
- noderev->predecessor_count = 0;
-
- /* Get the properties location. */
- value = svn_hash_gets(headers, HEADER_PROPS);
- if (value)
- {
- SVN_ERR(read_rep_offsets(&noderev->prop_rep, value,
- noderev->id, TRUE, pool));
- }
-
- /* Get the data location. */
- value = svn_hash_gets(headers, HEADER_TEXT);
- if (value)
- {
- SVN_ERR(read_rep_offsets(&noderev->data_rep, value,
- noderev->id,
- (noderev->kind == svn_node_dir), pool));
- }
-
- /* Get the created path. */
- value = svn_hash_gets(headers, HEADER_CPATH);
- if (value == NULL)
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Missing cpath field in node-rev '%s'"),
- noderev_id);
- }
- else
- {
- noderev->created_path = apr_pstrdup(pool, value);
- }
-
- /* Get the predecessor ID. */
- value = svn_hash_gets(headers, HEADER_PRED);
- if (value)
- noderev->predecessor_id = svn_fs_fs__id_parse(value, strlen(value),
- pool);
-
- /* Get the copyroot. */
- value = svn_hash_gets(headers, HEADER_COPYROOT);
- if (value == NULL)
- {
- noderev->copyroot_path = apr_pstrdup(pool, noderev->created_path);
- noderev->copyroot_rev = svn_fs_fs__id_rev(noderev->id);
- }
- else
- {
- char *str;
-
- str = svn_cstring_tokenize(" ", &value);
- if (str == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed copyroot line in node-rev '%s'"),
- noderev_id);
-
- noderev->copyroot_rev = SVN_STR_TO_REV(str);
-
- if (*value == '\0')
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed copyroot line in node-rev '%s'"),
- noderev_id);
- noderev->copyroot_path = apr_pstrdup(pool, value);
- }
-
- /* Get the copyfrom. */
- value = svn_hash_gets(headers, HEADER_COPYFROM);
- if (value == NULL)
- {
- noderev->copyfrom_path = NULL;
- noderev->copyfrom_rev = SVN_INVALID_REVNUM;
- }
- else
- {
- char *str = svn_cstring_tokenize(" ", &value);
- if (str == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed copyfrom line in node-rev '%s'"),
- noderev_id);
-
- noderev->copyfrom_rev = SVN_STR_TO_REV(str);
-
- if (*value == 0)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed copyfrom line in node-rev '%s'"),
- noderev_id);
- noderev->copyfrom_path = apr_pstrdup(pool, value);
- }
-
- /* Get whether this is a fresh txn root. */
- value = svn_hash_gets(headers, HEADER_FRESHTXNRT);
- noderev->is_fresh_txn_root = (value != NULL);
-
- /* Get the mergeinfo count. */
- value = svn_hash_gets(headers, HEADER_MINFO_CNT);
- if (value)
- SVN_ERR(svn_cstring_atoi64(&noderev->mergeinfo_count, value));
- else
- noderev->mergeinfo_count = 0;
-
- /* Get whether *this* node has mergeinfo. */
- value = svn_hash_gets(headers, HEADER_MINFO_HERE);
- noderev->has_mergeinfo = (value != NULL);
-
- *noderev_p = noderev;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__get_node_revision(node_revision_t **noderev_p,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *pool)
-{
- svn_error_t *err = get_node_revision_body(noderev_p, fs, id, pool);
- if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
- {
- svn_string_t *id_string = svn_fs_fs__id_unparse(id, pool);
- return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
- "Corrupt node-revision '%s'",
- id_string->data);
- }
- return svn_error_trace(err);
-}
-
-
-/* Return a formatted string, compatible with filesystem format FORMAT,
- that represents the location of representation REP. If
- MUTABLE_REP_TRUNCATED is given, the rep is for props or dir contents,
- and only a "-1" revision number will be given for a mutable rep.
- If MAY_BE_CORRUPT is true, guard for NULL when constructing the string.
- Perform the allocation from POOL. */
-static const char *
-representation_string(representation_t *rep,
- int format,
- svn_boolean_t mutable_rep_truncated,
- svn_boolean_t may_be_corrupt,
- apr_pool_t *pool)
-{
- if (rep->txn_id && mutable_rep_truncated)
- return "-1";
-
-#define DISPLAY_MAYBE_NULL_CHECKSUM(checksum) \
- ((!may_be_corrupt || (checksum) != NULL) \
- ? svn_checksum_to_cstring_display((checksum), pool) \
- : "(null)")
-
- if (format < SVN_FS_FS__MIN_REP_SHARING_FORMAT || rep->sha1_checksum == NULL)
- return apr_psprintf(pool, "%ld %" APR_OFF_T_FMT " %" SVN_FILESIZE_T_FMT
- " %" SVN_FILESIZE_T_FMT " %s",
- rep->revision, rep->offset, rep->size,
- rep->expanded_size,
- DISPLAY_MAYBE_NULL_CHECKSUM(rep->md5_checksum));
-
- return apr_psprintf(pool, "%ld %" APR_OFF_T_FMT " %" SVN_FILESIZE_T_FMT
- " %" SVN_FILESIZE_T_FMT " %s %s %s",
- rep->revision, rep->offset, rep->size,
- rep->expanded_size,
- DISPLAY_MAYBE_NULL_CHECKSUM(rep->md5_checksum),
- DISPLAY_MAYBE_NULL_CHECKSUM(rep->sha1_checksum),
- rep->uniquifier);
-
-#undef DISPLAY_MAYBE_NULL_CHECKSUM
-
-}
-
-
-svn_error_t *
-svn_fs_fs__write_noderev(svn_stream_t *outfile,
- node_revision_t *noderev,
- int format,
- svn_boolean_t include_mergeinfo,
- apr_pool_t *pool)
-{
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_ID ": %s\n",
- svn_fs_fs__id_unparse(noderev->id,
- pool)->data));
-
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_TYPE ": %s\n",
- (noderev->kind == svn_node_file) ?
- KIND_FILE : KIND_DIR));
-
- if (noderev->predecessor_id)
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_PRED ": %s\n",
- svn_fs_fs__id_unparse(noderev->predecessor_id,
- pool)->data));
-
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_COUNT ": %d\n",
- noderev->predecessor_count));
-
- if (noderev->data_rep)
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_TEXT ": %s\n",
- representation_string(noderev->data_rep,
- format,
- (noderev->kind
- == svn_node_dir),
- FALSE,
- pool)));
-
- if (noderev->prop_rep)
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_PROPS ": %s\n",
- representation_string(noderev->prop_rep, format,
- TRUE, FALSE, pool)));
-
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_CPATH ": %s\n",
- noderev->created_path));
-
- if (noderev->copyfrom_path)
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_COPYFROM ": %ld"
- " %s\n",
- noderev->copyfrom_rev,
- noderev->copyfrom_path));
-
- if ((noderev->copyroot_rev != svn_fs_fs__id_rev(noderev->id)) ||
- (strcmp(noderev->copyroot_path, noderev->created_path) != 0))
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_COPYROOT ": %ld"
- " %s\n",
- noderev->copyroot_rev,
- noderev->copyroot_path));
-
- if (noderev->is_fresh_txn_root)
- SVN_ERR(svn_stream_puts(outfile, HEADER_FRESHTXNRT ": y\n"));
-
- if (include_mergeinfo)
- {
- if (noderev->mergeinfo_count > 0)
- SVN_ERR(svn_stream_printf(outfile, pool, HEADER_MINFO_CNT ": %"
- APR_INT64_T_FMT "\n",
- noderev->mergeinfo_count));
-
- if (noderev->has_mergeinfo)
- SVN_ERR(svn_stream_puts(outfile, HEADER_MINFO_HERE ": y\n"));
- }
-
- return svn_stream_puts(outfile, "\n");
-}
-
-svn_error_t *
-svn_fs_fs__put_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
- node_revision_t *noderev,
- svn_boolean_t fresh_txn_root,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- apr_file_t *noderev_file;
- const char *txn_id = svn_fs_fs__id_txn_id(id);
-
- noderev->is_fresh_txn_root = fresh_txn_root;
-
- if (! txn_id)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Attempted to write to non-transaction '%s'"),
- svn_fs_fs__id_unparse(id, pool)->data);
-
- SVN_ERR(svn_io_file_open(&noderev_file, path_txn_node_rev(fs, id, pool),
- APR_WRITE | APR_CREATE | APR_TRUNCATE
- | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- SVN_ERR(svn_fs_fs__write_noderev(svn_stream_from_aprfile2(noderev_file, TRUE,
- pool),
- noderev, ffd->format,
- svn_fs_fs__fs_supports_mergeinfo(fs),
- pool));
-
- SVN_ERR(svn_io_file_close(noderev_file, pool));
-
- return SVN_NO_ERROR;
-}
-
-/* For the in-transaction NODEREV within FS, write the sha1->rep mapping
- * file in the respective transaction, if rep sharing has been enabled etc.
- * Use POOL for temporary allocations.
- */
-static svn_error_t *
-store_sha1_rep_mapping(svn_fs_t *fs,
+svn_fs_fs__file_length(svn_filesize_t *length,
node_revision_t *noderev,
apr_pool_t *pool)
{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* if rep sharing has been enabled and the noderev has a data rep and
- * its SHA-1 is known, store the rep struct under its SHA1. */
- if ( ffd->rep_sharing_allowed
- && noderev->data_rep
- && noderev->data_rep->sha1_checksum)
+ representation_t *data_rep = noderev->data_rep;
+ if (!data_rep)
{
- apr_file_t *rep_file;
- const char *file_name = path_txn_sha1(fs,
- svn_fs_fs__id_txn_id(noderev->id),
- noderev->data_rep->sha1_checksum,
- pool);
- const char *rep_string = representation_string(noderev->data_rep,
- ffd->format,
- (noderev->kind
- == svn_node_dir),
- FALSE,
- pool);
- SVN_ERR(svn_io_file_open(&rep_file, file_name,
- APR_WRITE | APR_CREATE | APR_TRUNCATE
- | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- SVN_ERR(svn_io_file_write_full(rep_file, rep_string,
- strlen(rep_string), NULL, pool));
-
- SVN_ERR(svn_io_file_close(rep_file, pool));
+ /* Treat "no representation" as "empty file". */
+ *length = 0;
}
-
- return SVN_NO_ERROR;
-}
-
-
-/* This structure is used to hold the information associated with a
- REP line. */
-struct rep_args
-{
- svn_boolean_t is_delta;
- svn_boolean_t is_delta_vs_empty;
-
- svn_revnum_t base_revision;
- apr_off_t base_offset;
- svn_filesize_t base_length;
-};
-
-/* Read the next line from file FILE and parse it as a text
- representation entry. Return the parsed entry in *REP_ARGS_P.
- Perform all allocations in POOL. */
-static svn_error_t *
-read_rep_line(struct rep_args **rep_args_p,
- apr_file_t *file,
- apr_pool_t *pool)
-{
- char buffer[160];
- apr_size_t limit;
- struct rep_args *rep_args;
- char *str, *last_str = buffer;
- apr_int64_t val;
-
- limit = sizeof(buffer);
- SVN_ERR(svn_io_read_length_line(file, buffer, &limit, pool));
-
- rep_args = apr_pcalloc(pool, sizeof(*rep_args));
- rep_args->is_delta = FALSE;
-
- if (strcmp(buffer, REP_PLAIN) == 0)
- {
- *rep_args_p = rep_args;
- return SVN_NO_ERROR;
- }
-
- if (strcmp(buffer, REP_DELTA) == 0)
- {
- /* This is a delta against the empty stream. */
- rep_args->is_delta = TRUE;
- rep_args->is_delta_vs_empty = TRUE;
- *rep_args_p = rep_args;
- return SVN_NO_ERROR;
- }
-
- rep_args->is_delta = TRUE;
- rep_args->is_delta_vs_empty = FALSE;
-
- /* We have hopefully a DELTA vs. a non-empty base revision. */
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str || (strcmp(str, REP_DELTA) != 0))
- goto error;
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- goto error;
- rep_args->base_revision = SVN_STR_TO_REV(str);
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- goto error;
- SVN_ERR(svn_cstring_atoi64(&val, str));
- rep_args->base_offset = (apr_off_t)val;
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- goto error;
- SVN_ERR(svn_cstring_atoi64(&val, str));
- rep_args->base_length = (svn_filesize_t)val;
-
- *rep_args_p = rep_args;
- return SVN_NO_ERROR;
-
- error:
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed representation header at %s"),
- path_and_offset_of(file, pool));
-}
-
-/* Given a revision file REV_FILE, opened to REV in FS, find the Node-ID
- of the header located at OFFSET and store it in *ID_P. Allocate
- temporary variables from POOL. */
-static svn_error_t *
-get_fs_id_at_offset(svn_fs_id_t **id_p,
- apr_file_t *rev_file,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_off_t offset,
- apr_pool_t *pool)
-{
- svn_fs_id_t *id;
- apr_hash_t *headers;
- const char *node_id_str;
-
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
-
- SVN_ERR(read_header_block(&headers,
- svn_stream_from_aprfile2(rev_file, TRUE, pool),
- pool));
-
- /* In error messages, the offset is relative to the pack file,
- not to the rev file. */
-
- node_id_str = svn_hash_gets(headers, HEADER_ID);
-
- if (node_id_str == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Missing node-id in node-rev at r%ld "
- "(offset %s)"),
- rev,
- apr_psprintf(pool, "%" APR_OFF_T_FMT, offset));
-
- id = svn_fs_fs__id_parse(node_id_str, strlen(node_id_str), pool);
-
- if (id == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Corrupt node-id '%s' in node-rev at r%ld "
- "(offset %s)"),
- node_id_str, rev,
- apr_psprintf(pool, "%" APR_OFF_T_FMT, offset));
-
- *id_p = id;
-
- /* ### assert that the txn_id is REV/OFFSET ? */
-
- return SVN_NO_ERROR;
-}
-
-
-/* Given an open revision file REV_FILE in FS for REV, locate the trailer that
- specifies the offset to the root node-id and to the changed path
- information. Store the root node offset in *ROOT_OFFSET and the
- changed path offset in *CHANGES_OFFSET. If either of these
- pointers is NULL, do nothing with it.
-
- If PACKED is true, REV_FILE should be a packed shard file.
- ### There is currently no such parameter. This function assumes that
- is_packed_rev(FS, REV) will indicate whether REV_FILE is a packed
- file. Therefore FS->fsap_data->min_unpacked_rev must not have been
- refreshed since REV_FILE was opened if there is a possibility that
- revision REV may have become packed since then.
- TODO: Take an IS_PACKED parameter instead, in order to remove this
- requirement.
-
- Allocate temporary variables from POOL. */
-static svn_error_t *
-get_root_changes_offset(apr_off_t *root_offset,
- apr_off_t *changes_offset,
- apr_file_t *rev_file,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- apr_off_t offset;
- apr_off_t rev_offset;
- char buf[64];
- int i, num_bytes;
- const char *str;
- apr_size_t len;
- apr_seek_where_t seek_relative;
-
- /* Determine where to seek to in the file.
-
- If we've got a pack file, we want to seek to the end of the desired
- revision. But we don't track that, so we seek to the beginning of the
- next revision.
-
- Unless the next revision is in a different file, in which case, we can
- just seek to the end of the pack file -- just like we do in the
- non-packed case. */
- if (is_packed_rev(fs, rev) && ((rev + 1) % ffd->max_files_per_dir != 0))
- {
- SVN_ERR(get_packed_offset(&offset, fs, rev + 1, pool));
- seek_relative = APR_SET;
- }
- else
- {
- seek_relative = APR_END;
- offset = 0;
- }
-
- /* Offset of the revision from the start of the pack file, if applicable. */
- if (is_packed_rev(fs, rev))
- SVN_ERR(get_packed_offset(&rev_offset, fs, rev, pool));
- else
- rev_offset = 0;
-
- /* We will assume that the last line containing the two offsets
- will never be longer than 64 characters. */
- SVN_ERR(svn_io_file_seek(rev_file, seek_relative, &offset, pool));
-
- offset -= sizeof(buf);
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
-
- /* Read in this last block, from which we will identify the last line. */
- len = sizeof(buf);
- SVN_ERR(svn_io_file_read(rev_file, buf, &len, pool));
-
- /* This cast should be safe since the maximum amount read, 64, will
- never be bigger than the size of an int. */
- num_bytes = (int) len;
-
- /* The last byte should be a newline. */
- if (buf[num_bytes - 1] != '\n')
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revision file (r%ld) lacks trailing newline"),
- rev);
- }
-
- /* Look for the next previous newline. */
- for (i = num_bytes - 2; i >= 0; i--)
- {
- if (buf[i] == '\n')
- break;
- }
-
- if (i < 0)
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Final line in revision file (r%ld) longer "
- "than 64 characters"),
- rev);
- }
-
- i++;
- str = &buf[i];
-
- /* find the next space */
- for ( ; i < (num_bytes - 2) ; i++)
- if (buf[i] == ' ')
- break;
-
- if (i == (num_bytes - 2))
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Final line in revision file r%ld missing space"),
- rev);
-
- if (root_offset)
- {
- apr_int64_t val;
-
- buf[i] = '\0';
- SVN_ERR(svn_cstring_atoi64(&val, str));
- *root_offset = rev_offset + (apr_off_t)val;
- }
-
- i++;
- str = &buf[i];
-
- /* find the next newline */
- for ( ; i < num_bytes; i++)
- if (buf[i] == '\n')
- break;
-
- if (changes_offset)
- {
- apr_int64_t val;
-
- buf[i] = '\0';
- SVN_ERR(svn_cstring_atoi64(&val, str));
- *changes_offset = rev_offset + (apr_off_t)val;
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Move a file into place from OLD_FILENAME in the transactions
- directory to its final location NEW_FILENAME in the repository. On
- Unix, match the permissions of the new file to the permissions of
- PERMS_REFERENCE. Temporary allocations are from POOL.
-
- This function almost duplicates svn_io_file_move(), but it tries to
- guarantee a flush. */
-static svn_error_t *
-move_into_place(const char *old_filename,
- const char *new_filename,
- const char *perms_reference,
- apr_pool_t *pool)
-{
- svn_error_t *err;
-
- SVN_ERR(svn_io_copy_perms(perms_reference, old_filename, pool));
-
- /* Move the file into place. */
- err = svn_io_file_rename(old_filename, new_filename, pool);
- if (err && APR_STATUS_IS_EXDEV(err->apr_err))
- {
- apr_file_t *file;
-
- /* Can't rename across devices; fall back to copying. */
- svn_error_clear(err);
- err = SVN_NO_ERROR;
- SVN_ERR(svn_io_copy_file(old_filename, new_filename, TRUE, pool));
-
- /* Flush the target of the copy to disk. */
- SVN_ERR(svn_io_file_open(&file, new_filename, APR_READ,
- APR_OS_DEFAULT, pool));
- /* ### BH: Does this really guarantee a flush of the data written
- ### via a completely different handle on all operating systems?
- ###
- ### Maybe we should perform the copy ourselves instead of making
- ### apr do that and flush the real handle? */
- SVN_ERR(svn_io_file_flush_to_disk(file, pool));
- SVN_ERR(svn_io_file_close(file, pool));
- }
- if (err)
- return svn_error_trace(err);
-
-#ifdef __linux__
- {
- /* Linux has the unusual feature that fsync() on a file is not
- enough to ensure that a file's directory entries have been
- flushed to disk; you have to fsync the directory as well.
- On other operating systems, we'd only be asking for trouble
- by trying to open and fsync a directory. */
- const char *dirname;
- apr_file_t *file;
-
- dirname = svn_dirent_dirname(new_filename, pool);
- SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT,
- pool));
- SVN_ERR(svn_io_file_flush_to_disk(file, pool));
- SVN_ERR(svn_io_file_close(file, pool));
- }
-#endif
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__rev_get_root(svn_fs_id_t **root_id_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- apr_file_t *revision_file;
- apr_off_t root_offset;
- svn_fs_id_t *root_id = NULL;
- svn_boolean_t is_cached;
-
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
-
- SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
- ffd->rev_root_id_cache, &rev, pool));
- if (is_cached)
- return SVN_NO_ERROR;
-
- SVN_ERR(open_pack_or_rev_file(&revision_file, fs, rev, pool));
- SVN_ERR(get_root_changes_offset(&root_offset, NULL, revision_file, fs, rev,
- pool));
-
- SVN_ERR(get_fs_id_at_offset(&root_id, revision_file, fs, rev,
- root_offset, pool));
-
- SVN_ERR(svn_io_file_close(revision_file, pool));
-
- SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &rev, root_id, pool));
-
- *root_id_p = root_id;
-
- return SVN_NO_ERROR;
-}
-
-/* Revprop caching management.
- *
- * Mechanism:
- * ----------
- *
- * Revprop caching needs to be activated and will be deactivated for the
- * respective FS instance if the necessary infrastructure could not be
- * initialized. In deactivated mode, there is almost no runtime overhead
- * associated with revprop caching. As long as no revprops are being read
- * or changed, revprop caching imposes no overhead.
- *
- * When activated, we cache revprops using (revision, generation) pairs
- * as keys with the generation being incremented upon every revprop change.
- * Since the cache is process-local, the generation needs to be tracked
- * for at least as long as the process lives but may be reset afterwards.
- *
- * To track the revprop generation, we use two-layer approach. On the lower
- * level, we use named atomics to have a system-wide consistent value for
- * the current revprop generation. However, those named atomics will only
- * remain valid for as long as at least one process / thread in the system
- * accesses revprops in the respective repository. The underlying shared
- * memory gets cleaned up afterwards.
- *
- * On the second level, we will use a persistent file to track the latest
- * revprop generation. It will be written upon each revprop change but
- * only be read if we are the first process to initialize the named atomics
- * with that value.
- *
- * The overhead for the second and following accesses to revprops is
- * almost zero on most systems.
- *
- *
- * Tech aspects:
- * -------------
- *
- * A problem is that we need to provide a globally available file name to
- * back the SHM implementation on OSes that need it. We can only assume
- * write access to some file within the respective repositories. Because
- * a given server process may access thousands of repositories during its
- * lifetime, keeping the SHM data alive for all of them is also not an
- * option.
- *
- * So, we store the new revprop generation on disk as part of each
- * setrevprop call, i.e. this write will be serialized and the write order
- * be guaranteed by the repository write lock.
- *
- * The only racy situation occurs when the data is being read again by two
- * processes concurrently but in that situation, the first process to
- * finish that procedure is guaranteed to be the only one that initializes
- * the SHM data. Since even writers will first go through that
- * initialization phase, they will never operate on stale data.
- */
-
-/* Read revprop generation as stored on disk for repository FS. The result
- * is returned in *CURRENT. Default to 2 if no such file is available.
- */
-static svn_error_t *
-read_revprop_generation_file(apr_int64_t *current,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- svn_error_t *err;
- apr_file_t *file;
- char buf[80];
- apr_size_t len;
- const char *path = path_revprop_generation(fs, pool);
-
- err = svn_io_file_open(&file, path,
- APR_READ | APR_BUFFERED,
- APR_OS_DEFAULT, pool);
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_clear(err);
- *current = 2;
-
- return SVN_NO_ERROR;
- }
- SVN_ERR(err);
-
- len = sizeof(buf);
- SVN_ERR(svn_io_read_length_line(file, buf, &len, pool));
-
- /* Check that the first line contains only digits. */
- SVN_ERR(check_file_buffer_numeric(buf, 0, path,
- "Revprop Generation", pool));
- SVN_ERR(svn_cstring_atoi64(current, buf));
-
- return svn_io_file_close(file, pool);
-}
-
-/* Write the CURRENT revprop generation to disk for repository FS.
- */
-static svn_error_t *
-write_revprop_generation_file(svn_fs_t *fs,
- apr_int64_t current,
- apr_pool_t *pool)
-{
- apr_file_t *file;
- const char *tmp_path;
-
- char buf[SVN_INT64_BUFFER_SIZE];
- apr_size_t len = svn__i64toa(buf, current);
- buf[len] = '\n';
-
- SVN_ERR(svn_io_open_unique_file3(&file, &tmp_path, fs->path,
- svn_io_file_del_none, pool, pool));
- SVN_ERR(svn_io_file_write_full(file, buf, len + 1, NULL, pool));
- SVN_ERR(svn_io_file_close(file, pool));
-
- return move_into_place(tmp_path, path_revprop_generation(fs, pool),
- tmp_path, pool);
-}
-
-/* Make sure the revprop_namespace member in FS is set. */
-static svn_error_t *
-ensure_revprop_namespace(svn_fs_t *fs)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- return ffd->revprop_namespace == NULL
- ? svn_atomic_namespace__create(&ffd->revprop_namespace,
- svn_dirent_join(fs->path,
- ATOMIC_REVPROP_NAMESPACE,
- fs->pool),
- fs->pool)
- : SVN_NO_ERROR;
-}
-
-/* Make sure the revprop_namespace member in FS is set. */
-static svn_error_t *
-cleanup_revprop_namespace(svn_fs_t *fs)
-{
- const char *name = svn_dirent_join(fs->path,
- ATOMIC_REVPROP_NAMESPACE,
- fs->pool);
- return svn_error_trace(svn_atomic_namespace__cleanup(name, fs->pool));
-}
-
-/* Make sure the revprop_generation member in FS is set and, if necessary,
- * initialized with the latest value stored on disk.
- */
-static svn_error_t *
-ensure_revprop_generation(svn_fs_t *fs, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- SVN_ERR(ensure_revprop_namespace(fs));
- if (ffd->revprop_generation == NULL)
- {
- apr_int64_t current = 0;
-
- SVN_ERR(svn_named_atomic__get(&ffd->revprop_generation,
- ffd->revprop_namespace,
- ATOMIC_REVPROP_GENERATION,
- TRUE));
-
- /* If the generation is at 0, we just created a new namespace
- * (it would be at least 2 otherwise). Read the latest generation
- * from disk and if we are the first one to initialize the atomic
- * (i.e. is still 0), set it to the value just gotten.
- */
- SVN_ERR(svn_named_atomic__read(&current, ffd->revprop_generation));
- if (current == 0)
- {
- SVN_ERR(read_revprop_generation_file(&current, fs, pool));
- SVN_ERR(svn_named_atomic__cmpxchg(NULL, current, 0,
- ffd->revprop_generation));
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Make sure the revprop_timeout member in FS is set. */
-static svn_error_t *
-ensure_revprop_timeout(svn_fs_t *fs)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- SVN_ERR(ensure_revprop_namespace(fs));
- return ffd->revprop_timeout == NULL
- ? svn_named_atomic__get(&ffd->revprop_timeout,
- ffd->revprop_namespace,
- ATOMIC_REVPROP_TIMEOUT,
- TRUE)
- : SVN_NO_ERROR;
-}
-
-/* Create an error object with the given MESSAGE and pass it to the
- WARNING member of FS. */
-static void
-log_revprop_cache_init_warning(svn_fs_t *fs,
- svn_error_t *underlying_err,
- const char *message)
-{
- svn_error_t *err = svn_error_createf(SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE,
- underlying_err,
- message, fs->path);
-
- if (fs->warning)
- (fs->warning)(fs->warning_baton, err);
-
- svn_error_clear(err);
-}
-
-/* Test whether revprop cache and necessary infrastructure are
- available in FS. */
-static svn_boolean_t
-has_revprop_cache(svn_fs_t *fs, apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_error_t *error;
-
- /* is the cache (still) enabled? */
- if (ffd->revprop_cache == NULL)
- return FALSE;
-
- /* is it efficient? */
- if (!svn_named_atomic__is_efficient())
- {
- /* access to it would be quite slow
- * -> disable the revprop cache for good
- */
- ffd->revprop_cache = NULL;
- log_revprop_cache_init_warning(fs, NULL,
- "Revprop caching for '%s' disabled"
- " because it would be inefficient.");
-
- return FALSE;
- }
-
- /* try to access our SHM-backed infrastructure */
- error = ensure_revprop_generation(fs, pool);
- if (error)
- {
- /* failure -> disable revprop cache for good */
-
- ffd->revprop_cache = NULL;
- log_revprop_cache_init_warning(fs, error,
- "Revprop caching for '%s' disabled "
- "because SHM infrastructure for revprop "
- "caching failed to initialize.");
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* Baton structure for revprop_generation_fixup. */
-typedef struct revprop_generation_fixup_t
-{
- /* revprop generation to read */
- apr_int64_t *generation;
-
- /* containing the revprop_generation member to query */
- fs_fs_data_t *ffd;
-} revprop_generation_upgrade_t;
-
-/* If the revprop generation has an odd value, it means the original writer
- of the revprop got killed. We don't know whether that process as able
- to change the revprop data but we assume that it was. Therefore, we
- increase the generation in that case to basically invalidate everyones
- cache content.
- Execute this onlx while holding the write lock to the repo in baton->FFD.
- */
-static svn_error_t *
-revprop_generation_fixup(void *void_baton,
- apr_pool_t *pool)
-{
- revprop_generation_upgrade_t *baton = void_baton;
- assert(baton->ffd->has_write_lock);
-
- /* Maybe, either the original revprop writer or some other reader has
- already corrected / bumped the revprop generation. Thus, we need
- to read it again. */
- SVN_ERR(svn_named_atomic__read(baton->generation,
- baton->ffd->revprop_generation));
-
- /* Cause everyone to re-read revprops upon their next access, if the
- last revprop write did not complete properly. */
- while (*baton->generation % 2)
- SVN_ERR(svn_named_atomic__add(baton->generation,
- 1,
- baton->ffd->revprop_generation));
-
- return SVN_NO_ERROR;
-}
-
-/* Read the current revprop generation and return it in *GENERATION.
- Also, detect aborted / crashed writers and recover from that.
- Use the access object in FS to set the shared mem values. */
-static svn_error_t *
-read_revprop_generation(apr_int64_t *generation,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- apr_int64_t current = 0;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* read the current revprop generation number */
- SVN_ERR(ensure_revprop_generation(fs, pool));
- SVN_ERR(svn_named_atomic__read(&current, ffd->revprop_generation));
-
- /* is an unfinished revprop write under the way? */
- if (current % 2)
- {
- apr_int64_t timeout = 0;
-
- /* read timeout for the write operation */
- SVN_ERR(ensure_revprop_timeout(fs));
- SVN_ERR(svn_named_atomic__read(&timeout, ffd->revprop_timeout));
-
- /* has the writer process been aborted,
- * i.e. has the timeout been reached?
- */
- if (apr_time_now() > timeout)
- {
- revprop_generation_upgrade_t baton;
- baton.generation = &current;
- baton.ffd = ffd;
-
- /* Ensure that the original writer process no longer exists by
- * acquiring the write lock to this repository. Then, fix up
- * the revprop generation.
- */
- if (ffd->has_write_lock)
- SVN_ERR(revprop_generation_fixup(&baton, pool));
- else
- SVN_ERR(svn_fs_fs__with_write_lock(fs, revprop_generation_fixup,
- &baton, pool));
- }
- }
-
- /* return the value we just got */
- *generation = current;
- return SVN_NO_ERROR;
-}
-
-/* Set the revprop generation to the next odd number to indicate that
- there is a revprop write process under way. If that times out,
- readers shall recover from that state & re-read revprops.
- Use the access object in FS to set the shared mem value. */
-static svn_error_t *
-begin_revprop_change(svn_fs_t *fs, apr_pool_t *pool)
-{
- apr_int64_t current;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* set the timeout for the write operation */
- SVN_ERR(ensure_revprop_timeout(fs));
- SVN_ERR(svn_named_atomic__write(NULL,
- apr_time_now() + REVPROP_CHANGE_TIMEOUT,
- ffd->revprop_timeout));
-
- /* set the revprop generation to an odd value to indicate
- * that a write is in progress
- */
- SVN_ERR(ensure_revprop_generation(fs, pool));
- do
- {
- SVN_ERR(svn_named_atomic__add(&current,
- 1,
- ffd->revprop_generation));
- }
- while (current % 2 == 0);
-
- return SVN_NO_ERROR;
-}
-
-/* Set the revprop generation to the next even number to indicate that
- a) readers shall re-read revprops, and
- b) the write process has been completed (no recovery required)
- Use the access object in FS to set the shared mem value. */
-static svn_error_t *
-end_revprop_change(svn_fs_t *fs, apr_pool_t *pool)
-{
- apr_int64_t current = 1;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* set the revprop generation to an even value to indicate
- * that a write has been completed
- */
- SVN_ERR(ensure_revprop_generation(fs, pool));
- do
- {
- SVN_ERR(svn_named_atomic__add(&current,
- 1,
- ffd->revprop_generation));
- }
- while (current % 2);
-
- /* Save the latest generation to disk. FS is currently in a "locked"
- * state such that we can be sure the be the only ones to write that
- * file.
- */
- return write_revprop_generation_file(fs, current, pool);
-}
-
-/* Container for all data required to access the packed revprop file
- * for a given REVISION. This structure will be filled incrementally
- * by read_pack_revprops() its sub-routines.
- */
-typedef struct packed_revprops_t
-{
- /* revision number to read (not necessarily the first in the pack) */
- svn_revnum_t revision;
-
- /* current revprop generation. Used when populating the revprop cache */
- apr_int64_t generation;
-
- /* the actual revision properties */
- apr_hash_t *properties;
-
- /* their size when serialized to a single string
- * (as found in PACKED_REVPROPS) */
- apr_size_t serialized_size;
-
-
- /* name of the pack file (without folder path) */
- const char *filename;
-
- /* packed shard folder path */
- const char *folder;
-
- /* sum of values in SIZES */
- apr_size_t total_size;
-
- /* first revision in the pack (>= MANIFEST_START) */
- svn_revnum_t start_revision;
-
- /* size of the revprops in PACKED_REVPROPS */
- apr_array_header_t *sizes;
-
- /* offset of the revprops in PACKED_REVPROPS */
- apr_array_header_t *offsets;
-
-
- /* concatenation of the serialized representation of all revprops
- * in the pack, i.e. the pack content without header and compression */
- svn_stringbuf_t *packed_revprops;
-
- /* First revision covered by MANIFEST.
- * Will equal the shard start revision or 1, for the 1st shard. */
- svn_revnum_t manifest_start;
-
- /* content of the manifest.
- * Maps long(rev - MANIFEST_START) to const char* pack file name */
- apr_array_header_t *manifest;
-} packed_revprops_t;
-
-/* Parse the serialized revprops in CONTENT and return them in *PROPERTIES.
- * Also, put them into the revprop cache, if activated, for future use.
- * Three more parameters are being used to update the revprop cache: FS is
- * our file system, the revprops belong to REVISION and the global revprop
- * GENERATION is used as well.
- *
- * The returned hash will be allocated in POOL, SCRATCH_POOL is being used
- * for temporary allocations.
- */
-static svn_error_t *
-parse_revprop(apr_hash_t **properties,
- svn_fs_t *fs,
- svn_revnum_t revision,
- apr_int64_t generation,
- svn_string_t *content,
- apr_pool_t *pool,
- apr_pool_t *scratch_pool)
-{
- svn_stream_t *stream = svn_stream_from_string(content, scratch_pool);
- *properties = apr_hash_make(pool);
-
- SVN_ERR(svn_hash_read2(*properties, stream, SVN_HASH_TERMINATOR, pool));
- if (has_revprop_cache(fs, pool))
- {
- fs_fs_data_t *ffd = fs->fsap_data;
- pair_cache_key_t key = { 0 };
-
- key.revision = revision;
- key.second = generation;
- SVN_ERR(svn_cache__set(ffd->revprop_cache, &key, *properties,
- scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Read the non-packed revprops for revision REV in FS, put them into the
- * revprop cache if activated and return them in *PROPERTIES. GENERATION
- * is the current revprop generation.
- *
- * If the data could not be read due to an otherwise recoverable error,
- * leave *PROPERTIES unchanged. No error will be returned in that case.
- *
- * Allocations will be done in POOL.
- */
-static svn_error_t *
-read_non_packed_revprop(apr_hash_t **properties,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_int64_t generation,
- apr_pool_t *pool)
-{
- svn_stringbuf_t *content = NULL;
- apr_pool_t *iterpool = svn_pool_create(pool);
- svn_boolean_t missing = FALSE;
- int i;
-
- for (i = 0; i < RECOVERABLE_RETRY_COUNT && !missing && !content; ++i)
- {
- svn_pool_clear(iterpool);
- SVN_ERR(try_stringbuf_from_file(&content,
- &missing,
- path_revprops(fs, rev, iterpool),
- i + 1 < RECOVERABLE_RETRY_COUNT,
- iterpool));
- }
-
- if (content)
- SVN_ERR(parse_revprop(properties, fs, rev, generation,
- svn_stringbuf__morph_into_string(content),
- pool, iterpool));
-
- svn_pool_clear(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Given FS and REVPROPS->REVISION, fill the FILENAME, FOLDER and MANIFEST
- * members. Use POOL for allocating results and SCRATCH_POOL for temporaries.
- */
-static svn_error_t *
-get_revprop_packname(svn_fs_t *fs,
- packed_revprops_t *revprops,
- apr_pool_t *pool,
- apr_pool_t *scratch_pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_stringbuf_t *content = NULL;
- const char *manifest_file_path;
- int idx;
-
- /* read content of the manifest file */
- revprops->folder = path_revprops_pack_shard(fs, revprops->revision, pool);
- manifest_file_path = svn_dirent_join(revprops->folder, PATH_MANIFEST, pool);
-
- SVN_ERR(read_content(&content, manifest_file_path, pool));
-
- /* parse the manifest. Every line is a file name */
- revprops->manifest = apr_array_make(pool, ffd->max_files_per_dir,
- sizeof(const char*));
-
- /* Read all lines. Since the last line ends with a newline, we will
- end up with a valid but empty string after the last entry. */
- while (content->data && *content->data)
- {
- APR_ARRAY_PUSH(revprops->manifest, const char*) = content->data;
- content->data = strchr(content->data, '\n');
- if (content->data)
- {
- *content->data = 0;
- content->data++;
- }
- }
-
- /* Index for our revision. Rev 0 is excluded from the first shard. */
- revprops->manifest_start = revprops->revision
- - (revprops->revision % ffd->max_files_per_dir);
- if (revprops->manifest_start == 0)
- ++revprops->manifest_start;
- idx = (int)(revprops->revision - revprops->manifest_start);
-
- if (revprops->manifest->nelts <= idx)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Packed revprop manifest for r%ld too "
- "small"), revprops->revision);
-
- /* Now get the file name */
- revprops->filename = APR_ARRAY_IDX(revprops->manifest, idx, const char*);
-
- return SVN_NO_ERROR;
-}
-
-/* Return TRUE, if revision R1 and R2 refer to the same shard in FS.
- */
-static svn_boolean_t
-same_shard(svn_fs_t *fs,
- svn_revnum_t r1,
- svn_revnum_t r2)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- return (r1 / ffd->max_files_per_dir) == (r2 / ffd->max_files_per_dir);
-}
-
-/* Given FS and the full packed file content in REVPROPS->PACKED_REVPROPS,
- * fill the START_REVISION, SIZES, OFFSETS members. Also, make
- * PACKED_REVPROPS point to the first serialized revprop.
- *
- * Parse the revprops for REVPROPS->REVISION and set the PROPERTIES as
- * well as the SERIALIZED_SIZE member. If revprop caching has been
- * enabled, parse all revprops in the pack and cache them.
- */
-static svn_error_t *
-parse_packed_revprops(svn_fs_t *fs,
- packed_revprops_t *revprops,
- apr_pool_t *pool,
- apr_pool_t *scratch_pool)
-{
- svn_stream_t *stream;
- apr_int64_t first_rev, count, i;
- apr_off_t offset;
- const char *header_end;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
- /* decompress (even if the data is only "stored", there is still a
- * length header to remove) */
- svn_string_t *compressed
- = svn_stringbuf__morph_into_string(revprops->packed_revprops);
- svn_stringbuf_t *uncompressed = svn_stringbuf_create_empty(pool);
- SVN_ERR(svn__decompress(compressed, uncompressed, APR_SIZE_MAX));
-
- /* read first revision number and number of revisions in the pack */
- stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
- SVN_ERR(read_number_from_stream(&first_rev, NULL, stream, iterpool));
- SVN_ERR(read_number_from_stream(&count, NULL, stream, iterpool));
-
- /* Check revision range for validity. */
- if ( !same_shard(fs, revprops->revision, first_rev)
- || !same_shard(fs, revprops->revision, first_rev + count - 1)
- || count < 1)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revprop pack for revision r%ld"
- " contains revprops for r%ld .. r%ld"),
- revprops->revision,
- (svn_revnum_t)first_rev,
- (svn_revnum_t)(first_rev + count -1));
-
- /* Since start & end are in the same shard, it is enough to just test
- * the FIRST_REV for being actually packed. That will also cover the
- * special case of rev 0 never being packed. */
- if (!is_packed_revprop(fs, first_rev))
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revprop pack for revision r%ld"
- " starts at non-packed revisions r%ld"),
- revprops->revision, (svn_revnum_t)first_rev);
-
- /* make PACKED_REVPROPS point to the first char after the header.
- * This is where the serialized revprops are. */
- header_end = strstr(uncompressed->data, "\n\n");
- if (header_end == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Header end not found"));
-
- offset = header_end - uncompressed->data + 2;
-
- revprops->packed_revprops = svn_stringbuf_create_empty(pool);
- revprops->packed_revprops->data = uncompressed->data + offset;
- revprops->packed_revprops->len = (apr_size_t)(uncompressed->len - offset);
- revprops->packed_revprops->blocksize = (apr_size_t)(uncompressed->blocksize - offset);
-
- /* STREAM still points to the first entry in the sizes list.
- * Init / construct REVPROPS members. */
- revprops->start_revision = (svn_revnum_t)first_rev;
- revprops->sizes = apr_array_make(pool, (int)count, sizeof(offset));
- revprops->offsets = apr_array_make(pool, (int)count, sizeof(offset));
-
- /* Now parse, revision by revision, the size and content of each
- * revisions' revprops. */
- for (i = 0, offset = 0, revprops->total_size = 0; i < count; ++i)
- {
- apr_int64_t size;
- svn_string_t serialized;
- apr_hash_t *properties;
- svn_revnum_t revision = (svn_revnum_t)(first_rev + i);
-
- /* read & check the serialized size */
- SVN_ERR(read_number_from_stream(&size, NULL, stream, iterpool));
- if (size + offset > (apr_int64_t)revprops->packed_revprops->len)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Packed revprop size exceeds pack file size"));
-
- /* Parse this revprops list, if necessary */
- serialized.data = revprops->packed_revprops->data + offset;
- serialized.len = (apr_size_t)size;
-
- if (revision == revprops->revision)
- {
- SVN_ERR(parse_revprop(&revprops->properties, fs, revision,
- revprops->generation, &serialized,
- pool, iterpool));
- revprops->serialized_size = serialized.len;
- }
- else
- {
- /* If revprop caching is enabled, parse any revprops.
- * They will get cached as a side-effect of this. */
- if (has_revprop_cache(fs, pool))
- SVN_ERR(parse_revprop(&properties, fs, revision,
- revprops->generation, &serialized,
- iterpool, iterpool));
- }
-
- /* fill REVPROPS data structures */
- APR_ARRAY_PUSH(revprops->sizes, apr_off_t) = serialized.len;
- APR_ARRAY_PUSH(revprops->offsets, apr_off_t) = offset;
- revprops->total_size += serialized.len;
-
- offset += serialized.len;
-
- svn_pool_clear(iterpool);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* In filesystem FS, read the packed revprops for revision REV into
- * *REVPROPS. Use GENERATION to populate the revprop cache, if enabled.
- * Allocate data in POOL.
- */
-static svn_error_t *
-read_pack_revprop(packed_revprops_t **revprops,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_int64_t generation,
- apr_pool_t *pool)
-{
- apr_pool_t *iterpool = svn_pool_create(pool);
- svn_boolean_t missing = FALSE;
- svn_error_t *err;
- packed_revprops_t *result;
- int i;
-
- /* someone insisted that REV is packed. Double-check if necessary */
- if (!is_packed_revprop(fs, rev))
- SVN_ERR(update_min_unpacked_rev(fs, iterpool));
-
- if (!is_packed_revprop(fs, rev))
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("No such packed revision %ld"), rev);
-
- /* initialize the result data structure */
- result = apr_pcalloc(pool, sizeof(*result));
- result->revision = rev;
- result->generation = generation;
-
- /* try to read the packed revprops. This may require retries if we have
- * concurrent writers. */
- for (i = 0; i < RECOVERABLE_RETRY_COUNT && !result->packed_revprops; ++i)
- {
- const char *file_path;
-
- /* there might have been concurrent writes.
- * Re-read the manifest and the pack file.
- */
- SVN_ERR(get_revprop_packname(fs, result, pool, iterpool));
- file_path = svn_dirent_join(result->folder,
- result->filename,
- iterpool);
- SVN_ERR(try_stringbuf_from_file(&result->packed_revprops,
- &missing,
- file_path,
- i + 1 < RECOVERABLE_RETRY_COUNT,
- pool));
-
- /* If we could not find the file, there was a write.
- * So, we should refresh our revprop generation info as well such
- * that others may find data we will put into the cache. They would
- * consider it outdated, otherwise.
- */
- if (missing && has_revprop_cache(fs, pool))
- SVN_ERR(read_revprop_generation(&result->generation, fs, pool));
-
- svn_pool_clear(iterpool);
- }
-
- /* the file content should be available now */
- if (!result->packed_revprops)
- return svn_error_createf(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE, NULL,
- _("Failed to read revprop pack file for r%ld"), rev);
-
- /* parse it. RESULT will be complete afterwards. */
- err = parse_packed_revprops(fs, result, pool, iterpool);
- svn_pool_destroy(iterpool);
- if (err)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
- _("Revprop pack file for r%ld is corrupt"), rev);
-
- *revprops = result;
-
- return SVN_NO_ERROR;
-}
-
-/* Read the revprops for revision REV in FS and return them in *PROPERTIES_P.
- *
- * Allocations will be done in POOL.
- */
-static svn_error_t *
-get_revision_proplist(apr_hash_t **proplist_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- apr_int64_t generation = 0;
-
- /* not found, yet */
- *proplist_p = NULL;
-
- /* should they be available at all? */
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
-
- /* Try cache lookup first. */
- if (has_revprop_cache(fs, pool))
- {
- svn_boolean_t is_cached;
- pair_cache_key_t key = { 0 };
-
- SVN_ERR(read_revprop_generation(&generation, fs, pool));
-
- key.revision = rev;
- key.second = generation;
- SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
- ffd->revprop_cache, &key, pool));
- if (is_cached)
- return SVN_NO_ERROR;
- }
-
- /* if REV had not been packed when we began, try reading it from the
- * non-packed shard. If that fails, we will fall through to packed
- * shard reads. */
- if (!is_packed_revprop(fs, rev))
- {
- svn_error_t *err = read_non_packed_revprop(proplist_p, fs, rev,
- generation, pool);
- if (err)
- {
- if (!APR_STATUS_IS_ENOENT(err->apr_err)
- || ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
- return svn_error_trace(err);
-
- svn_error_clear(err);
- *proplist_p = NULL; /* in case read_non_packed_revprop changed it */
- }
- }
-
- /* if revprop packing is available and we have not read the revprops, yet,
- * try reading them from a packed shard. If that fails, REV is most
- * likely invalid (or its revprops highly contested). */
- if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT && !*proplist_p)
- {
- packed_revprops_t *packed_revprops;
- SVN_ERR(read_pack_revprop(&packed_revprops, fs, rev, generation, pool));
- *proplist_p = packed_revprops->properties;
- }
-
- /* The revprops should have been there. Did we get them? */
- if (!*proplist_p)
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("Could not read revprops for revision %ld"),
- rev);
-
- return SVN_NO_ERROR;
-}
-
-/* Serialize the revision property list PROPLIST of revision REV in
- * filesystem FS to a non-packed file. Return the name of that temporary
- * file in *TMP_PATH and the file path that it must be moved to in
- * *FINAL_PATH.
- *
- * Use POOL for allocations.
- */
-static svn_error_t *
-write_non_packed_revprop(const char **final_path,
- const char **tmp_path,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_hash_t *proplist,
- apr_pool_t *pool)
-{
- svn_stream_t *stream;
- *final_path = path_revprops(fs, rev, pool);
-
- /* ### do we have a directory sitting around already? we really shouldn't
- ### have to get the dirname here. */
- SVN_ERR(svn_stream_open_unique(&stream, tmp_path,
- svn_dirent_dirname(*final_path, pool),
- svn_io_file_del_none, pool, pool));
- SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
-
- return SVN_NO_ERROR;
-}
-
-/* After writing the new revprop file(s), call this function to move the
- * file at TMP_PATH to FINAL_PATH and give it the permissions from
- * PERMS_REFERENCE.
- *
- * If indicated in BUMP_GENERATION, increase FS' revprop generation.
- * Finally, delete all the temporary files given in FILES_TO_DELETE.
- * The latter may be NULL.
- *
- * Use POOL for temporary allocations.
- */
-static svn_error_t *
-switch_to_new_revprop(svn_fs_t *fs,
- const char *final_path,
- const char *tmp_path,
- const char *perms_reference,
- apr_array_header_t *files_to_delete,
- svn_boolean_t bump_generation,
- apr_pool_t *pool)
-{
- /* Now, we may actually be replacing revprops. Make sure that all other
- threads and processes will know about this. */
- if (bump_generation)
- SVN_ERR(begin_revprop_change(fs, pool));
-
- SVN_ERR(move_into_place(tmp_path, final_path, perms_reference, pool));
-
- /* Indicate that the update (if relevant) has been completed. */
- if (bump_generation)
- SVN_ERR(end_revprop_change(fs, pool));
-
- /* Clean up temporary files, if necessary. */
- if (files_to_delete)
- {
- apr_pool_t *iterpool = svn_pool_create(pool);
- int i;
-
- for (i = 0; i < files_to_delete->nelts; ++i)
- {
- const char *path = APR_ARRAY_IDX(files_to_delete, i, const char*);
- SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
- svn_pool_clear(iterpool);
- }
-
- svn_pool_destroy(iterpool);
- }
- return SVN_NO_ERROR;
-}
-
-/* Write a pack file header to STREAM that starts at revision START_REVISION
- * and contains the indexes [START,END) of SIZES.
- */
-static svn_error_t *
-serialize_revprops_header(svn_stream_t *stream,
- svn_revnum_t start_revision,
- apr_array_header_t *sizes,
- int start,
- int end,
- apr_pool_t *pool)
-{
- apr_pool_t *iterpool = svn_pool_create(pool);
- int i;
-
- SVN_ERR_ASSERT(start < end);
-
- /* start revision and entry count */
- SVN_ERR(svn_stream_printf(stream, pool, "%ld\n", start_revision));
- SVN_ERR(svn_stream_printf(stream, pool, "%d\n", end - start));
-
- /* the sizes array */
- for (i = start; i < end; ++i)
+ else if (data_rep->expanded_size)
{
- apr_off_t size = APR_ARRAY_IDX(sizes, i, apr_off_t);
- SVN_ERR(svn_stream_printf(stream, iterpool, "%" APR_OFF_T_FMT "\n",
- size));
- }
-
- /* the double newline char indicates the end of the header */
- SVN_ERR(svn_stream_printf(stream, iterpool, "\n"));
-
- svn_pool_clear(iterpool);
- return SVN_NO_ERROR;
-}
-
-/* Writes the a pack file to FILE_STREAM. It copies the serialized data
- * from REVPROPS for the indexes [START,END) except for index CHANGED_INDEX.
- *
- * The data for the latter is taken from NEW_SERIALIZED. Note, that
- * CHANGED_INDEX may be outside the [START,END) range, i.e. no new data is
- * taken in that case but only a subset of the old data will be copied.
- *
- * NEW_TOTAL_SIZE is a hint for pre-allocating buffers of appropriate size.
- * POOL is used for temporary allocations.
- */
-static svn_error_t *
-repack_revprops(svn_fs_t *fs,
- packed_revprops_t *revprops,
- int start,
- int end,
- int changed_index,
- svn_stringbuf_t *new_serialized,
- apr_off_t new_total_size,
- svn_stream_t *file_stream,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_stream_t *stream;
- int i;
-
- /* create data empty buffers and the stream object */
- svn_stringbuf_t *uncompressed
- = svn_stringbuf_create_ensure((apr_size_t)new_total_size, pool);
- svn_stringbuf_t *compressed
- = svn_stringbuf_create_empty(pool);
- stream = svn_stream_from_stringbuf(uncompressed, pool);
-
- /* write the header*/
- SVN_ERR(serialize_revprops_header(stream, revprops->start_revision + start,
- revprops->sizes, start, end, pool));
-
- /* append the serialized revprops */
- for (i = start; i < end; ++i)
- if (i == changed_index)
- {
- SVN_ERR(svn_stream_write(stream,
- new_serialized->data,
- &new_serialized->len));
- }
- else
- {
- apr_size_t size
- = (apr_size_t)APR_ARRAY_IDX(revprops->sizes, i, apr_off_t);
- apr_size_t offset
- = (apr_size_t)APR_ARRAY_IDX(revprops->offsets, i, apr_off_t);
-
- SVN_ERR(svn_stream_write(stream,
- revprops->packed_revprops->data + offset,
- &size));
- }
-
- /* flush the stream buffer (if any) to our underlying data buffer */
- SVN_ERR(svn_stream_close(stream));
-
- /* compress / store the data */
- SVN_ERR(svn__compress(svn_stringbuf__morph_into_string(uncompressed),
- compressed,
- ffd->compress_packed_revprops
- ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
- : SVN_DELTA_COMPRESSION_LEVEL_NONE));
-
- /* finally, write the content to the target stream and close it */
- SVN_ERR(svn_stream_write(file_stream, compressed->data, &compressed->len));
- SVN_ERR(svn_stream_close(file_stream));
-
- return SVN_NO_ERROR;
-}
-
-/* Allocate a new pack file name for revisions
- * [REVPROPS->START_REVISION + START, REVPROPS->START_REVISION + END - 1]
- * of REVPROPS->MANIFEST. Add the name of old file to FILES_TO_DELETE,
- * auto-create that array if necessary. Return an open file stream to
- * the new file in *STREAM allocated in POOL.
- */
-static svn_error_t *
-repack_stream_open(svn_stream_t **stream,
- svn_fs_t *fs,
- packed_revprops_t *revprops,
- int start,
- int end,
- apr_array_header_t **files_to_delete,
- apr_pool_t *pool)
-{
- apr_int64_t tag;
- const char *tag_string;
- svn_string_t *new_filename;
- int i;
- apr_file_t *file;
- int manifest_offset
- = (int)(revprops->start_revision - revprops->manifest_start);
-
- /* get the old (= current) file name and enlist it for later deletion */
- const char *old_filename = APR_ARRAY_IDX(revprops->manifest,
- start + manifest_offset,
- const char*);
-
- if (*files_to_delete == NULL)
- *files_to_delete = apr_array_make(pool, 3, sizeof(const char*));
-
- APR_ARRAY_PUSH(*files_to_delete, const char*)
- = svn_dirent_join(revprops->folder, old_filename, pool);
-
- /* increase the tag part, i.e. the counter after the dot */
- tag_string = strchr(old_filename, '.');
- if (tag_string == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Packed file '%s' misses a tag"),
- old_filename);
-
- SVN_ERR(svn_cstring_atoi64(&tag, tag_string + 1));
- new_filename = svn_string_createf(pool, "%ld.%" APR_INT64_T_FMT,
- revprops->start_revision + start,
- ++tag);
-
- /* update the manifest to point to the new file */
- for (i = start; i < end; ++i)
- APR_ARRAY_IDX(revprops->manifest, i + manifest_offset, const char*)
- = new_filename->data;
-
- /* create a file stream for the new file */
- SVN_ERR(svn_io_file_open(&file, svn_dirent_join(revprops->folder,
- new_filename->data,
- pool),
- APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool));
- *stream = svn_stream_from_aprfile2(file, FALSE, pool);
-
- return SVN_NO_ERROR;
-}
-
-/* For revision REV in filesystem FS, set the revision properties to
- * PROPLIST. Return a new file in *TMP_PATH that the caller shall move
- * to *FINAL_PATH to make the change visible. Files to be deleted will
- * be listed in *FILES_TO_DELETE which may remain unchanged / unallocated.
- * Use POOL for allocations.
- */
-static svn_error_t *
-write_packed_revprop(const char **final_path,
- const char **tmp_path,
- apr_array_header_t **files_to_delete,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_hash_t *proplist,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- packed_revprops_t *revprops;
- apr_int64_t generation = 0;
- svn_stream_t *stream;
- svn_stringbuf_t *serialized;
- apr_off_t new_total_size;
- int changed_index;
-
- /* read the current revprop generation. This value will not change
- * while we hold the global write lock to this FS. */
- if (has_revprop_cache(fs, pool))
- SVN_ERR(read_revprop_generation(&generation, fs, pool));
-
- /* read contents of the current pack file */
- SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, pool));
-
- /* serialize the new revprops */
- serialized = svn_stringbuf_create_empty(pool);
- stream = svn_stream_from_stringbuf(serialized, pool);
- SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
-
- /* calculate the size of the new data */
- changed_index = (int)(rev - revprops->start_revision);
- new_total_size = revprops->total_size - revprops->serialized_size
- + serialized->len
- + (revprops->offsets->nelts + 2) * SVN_INT64_BUFFER_SIZE;
-
- APR_ARRAY_IDX(revprops->sizes, changed_index, apr_off_t) = serialized->len;
-
- /* can we put the new data into the same pack as the before? */
- if ( new_total_size < ffd->revprop_pack_size
- || revprops->sizes->nelts == 1)
- {
- /* simply replace the old pack file with new content as we do it
- * in the non-packed case */
-
- *final_path = svn_dirent_join(revprops->folder, revprops->filename,
- pool);
- SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder,
- svn_io_file_del_none, pool, pool));
- SVN_ERR(repack_revprops(fs, revprops, 0, revprops->sizes->nelts,
- changed_index, serialized, new_total_size,
- stream, pool));
+ /* Standard case: a non-empty file. */
+ *length = data_rep->expanded_size;
}
else
{
- /* split the pack file into two of roughly equal size */
- int right_count, left_count, i;
-
- int left = 0;
- int right = revprops->sizes->nelts - 1;
- apr_off_t left_size = 2 * SVN_INT64_BUFFER_SIZE;
- apr_off_t right_size = 2 * SVN_INT64_BUFFER_SIZE;
-
- /* let left and right side grow such that their size difference
- * is minimal after each step. */
- while (left <= right)
- if ( left_size + APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
- < right_size + APR_ARRAY_IDX(revprops->sizes, right, apr_off_t))
- {
- left_size += APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
- + SVN_INT64_BUFFER_SIZE;
- ++left;
- }
- else
- {
- right_size += APR_ARRAY_IDX(revprops->sizes, right, apr_off_t)
- + SVN_INT64_BUFFER_SIZE;
- --right;
- }
-
- /* since the items need much less than SVN_INT64_BUFFER_SIZE
- * bytes to represent their length, the split may not be optimal */
- left_count = left;
- right_count = revprops->sizes->nelts - left;
-
- /* if new_size is large, one side may exceed the pack size limit.
- * In that case, split before and after the modified revprop.*/
- if ( left_size > ffd->revprop_pack_size
- || right_size > ffd->revprop_pack_size)
- {
- left_count = changed_index;
- right_count = revprops->sizes->nelts - left_count - 1;
- }
-
- /* write the new, split files */
- if (left_count)
- {
- SVN_ERR(repack_stream_open(&stream, fs, revprops, 0,
- left_count, files_to_delete, pool));
- SVN_ERR(repack_revprops(fs, revprops, 0, left_count,
- changed_index, serialized, new_total_size,
- stream, pool));
- }
-
- if (left_count + right_count < revprops->sizes->nelts)
- {
- SVN_ERR(repack_stream_open(&stream, fs, revprops, changed_index,
- changed_index + 1, files_to_delete,
- pool));
- SVN_ERR(repack_revprops(fs, revprops, changed_index,
- changed_index + 1,
- changed_index, serialized, new_total_size,
- stream, pool));
- }
-
- if (right_count)
- {
- SVN_ERR(repack_stream_open(&stream, fs, revprops,
- revprops->sizes->nelts - right_count,
- revprops->sizes->nelts,
- files_to_delete, pool));
- SVN_ERR(repack_revprops(fs, revprops,
- revprops->sizes->nelts - right_count,
- revprops->sizes->nelts, changed_index,
- serialized, new_total_size, stream,
- pool));
- }
-
- /* write the new manifest */
- *final_path = svn_dirent_join(revprops->folder, PATH_MANIFEST, pool);
- SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder,
- svn_io_file_del_none, pool, pool));
-
- for (i = 0; i < revprops->manifest->nelts; ++i)
- {
- const char *filename = APR_ARRAY_IDX(revprops->manifest, i,
- const char*);
- SVN_ERR(svn_stream_printf(stream, pool, "%s\n", filename));
- }
-
- SVN_ERR(svn_stream_close(stream));
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Set the revision property list of revision REV in filesystem FS to
- PROPLIST. Use POOL for temporary allocations. */
-static svn_error_t *
-set_revision_proplist(svn_fs_t *fs,
- svn_revnum_t rev,
- apr_hash_t *proplist,
- apr_pool_t *pool)
-{
- svn_boolean_t is_packed;
- svn_boolean_t bump_generation = FALSE;
- const char *final_path;
- const char *tmp_path;
- const char *perms_reference;
- apr_array_header_t *files_to_delete = NULL;
-
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
-
- /* this info will not change while we hold the global FS write lock */
- is_packed = is_packed_revprop(fs, rev);
-
- /* Test whether revprops already exist for this revision.
- * Only then will we need to bump the revprop generation. */
- if (has_revprop_cache(fs, pool))
- {
- if (is_packed)
- {
- bump_generation = TRUE;
- }
- else
- {
- svn_node_kind_t kind;
- SVN_ERR(svn_io_check_path(path_revprops(fs, rev, pool), &kind,
- pool));
- bump_generation = kind != svn_node_none;
- }
- }
-
- /* Serialize the new revprop data */
- if (is_packed)
- SVN_ERR(write_packed_revprop(&final_path, &tmp_path, &files_to_delete,
- fs, rev, proplist, pool));
- else
- SVN_ERR(write_non_packed_revprop(&final_path, &tmp_path,
- fs, rev, proplist, pool));
-
- /* We use the rev file of this revision as the perms reference,
- * because when setting revprops for the first time, the revprop
- * file won't exist and therefore can't serve as its own reference.
- * (Whereas the rev file should already exist at this point.)
- */
- SVN_ERR(svn_fs_fs__path_rev_absolute(&perms_reference, fs, rev, pool));
-
- /* Now, switch to the new revprop data. */
- SVN_ERR(switch_to_new_revprop(fs, final_path, tmp_path, perms_reference,
- files_to_delete, bump_generation, pool));
+ /* Work around a FSFS format quirk (see issue #4554).
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__revision_proplist(apr_hash_t **proplist_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- SVN_ERR(get_revision_proplist(proplist_p, fs, rev, pool));
+ A plain representation may specify its EXPANDED LENGTH as "0"
+ in which case, the SIZE value is what we want.
- return SVN_NO_ERROR;
-}
-
-/* Represents where in the current svndiff data block each
- representation is. */
-struct rep_state
-{
- apr_file_t *file;
- /* The txdelta window cache to use or NULL. */
- svn_cache__t *window_cache;
- /* Caches un-deltified windows. May be NULL. */
- svn_cache__t *combined_cache;
- apr_off_t start; /* The starting offset for the raw
- svndiff/plaintext data minus header. */
- apr_off_t off; /* The current offset into the file. */
- apr_off_t end; /* The end offset of the raw data. */
- int ver; /* If a delta, what svndiff version? */
- int chunk_index;
-};
-
-/* See create_rep_state, which wraps this and adds another error. */
-static svn_error_t *
-create_rep_state_body(struct rep_state **rep_state,
- struct rep_args **rep_args,
- apr_file_t **file_hint,
- svn_revnum_t *rev_hint,
- representation_t *rep,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- struct rep_state *rs = apr_pcalloc(pool, sizeof(*rs));
- struct rep_args *ra;
- unsigned char buf[4];
-
- /* If the hint is
- * - given,
- * - refers to a valid revision,
- * - refers to a packed revision,
- * - as does the rep we want to read, and
- * - refers to the same pack file as the rep
- * ...
- */
- if ( file_hint && rev_hint && *file_hint
- && SVN_IS_VALID_REVNUM(*rev_hint)
- && *rev_hint < ffd->min_unpacked_rev
- && rep->revision < ffd->min_unpacked_rev
- && ( (*rev_hint / ffd->max_files_per_dir)
- == (rep->revision / ffd->max_files_per_dir)))
- {
- /* ... we can re-use the same, already open file object
+ Because EXPANDED_LENGTH will also be 0 for empty files, while
+ SIZE is non-null, we need to check wether the content is
+ actually empty. We simply compare with the MD5 checksum of
+ empty content (sha-1 is not always available).
*/
- apr_off_t offset;
- SVN_ERR(get_packed_offset(&offset, fs, rep->revision, pool));
-
- offset += rep->offset;
- SVN_ERR(svn_io_file_seek(*file_hint, APR_SET, &offset, pool));
-
- rs->file = *file_hint;
- }
- else
- {
- /* otherwise, create a new file object
- */
- SVN_ERR(open_and_seek_representation(&rs->file, fs, rep, pool));
- }
-
- /* remember the current file, if suggested by the caller */
- if (file_hint)
- *file_hint = rs->file;
- if (rev_hint)
- *rev_hint = rep->revision;
-
- /* continue constructing RS and RA */
- rs->window_cache = ffd->txdelta_window_cache;
- rs->combined_cache = ffd->combined_window_cache;
-
- SVN_ERR(read_rep_line(&ra, rs->file, pool));
- SVN_ERR(get_file_offset(&rs->start, rs->file, pool));
- rs->off = rs->start;
- rs->end = rs->start + rep->size;
- *rep_state = rs;
- *rep_args = ra;
-
- if (!ra->is_delta)
- /* This is a plaintext, so just return the current rep_state. */
- return SVN_NO_ERROR;
-
- /* We are dealing with a delta, find out what version. */
- SVN_ERR(svn_io_file_read_full2(rs->file, buf, sizeof(buf),
- NULL, NULL, pool));
- /* ### Layering violation */
- if (! ((buf[0] == 'S') && (buf[1] == 'V') && (buf[2] == 'N')))
- return svn_error_create
- (SVN_ERR_FS_CORRUPT, NULL,
- _("Malformed svndiff data in representation"));
- rs->ver = buf[3];
- rs->chunk_index = 0;
- rs->off += 4;
-
- return SVN_NO_ERROR;
-}
-
-/* Read the rep args for REP in filesystem FS and create a rep_state
- for reading the representation. Return the rep_state in *REP_STATE
- and the rep args in *REP_ARGS, both allocated in POOL.
-
- When reading multiple reps, i.e. a skip delta chain, you may provide
- non-NULL FILE_HINT and REV_HINT. (If FILE_HINT is not NULL, in the first
- call it should be a pointer to NULL.) The function will use these variables
- to store the previous call results and tries to re-use them. This may
- result in significant savings in I/O for packed files.
- */
-static svn_error_t *
-create_rep_state(struct rep_state **rep_state,
- struct rep_args **rep_args,
- apr_file_t **file_hint,
- svn_revnum_t *rev_hint,
- representation_t *rep,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- svn_error_t *err = create_rep_state_body(rep_state, rep_args,
- file_hint, rev_hint,
- rep, fs, pool);
- if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
- {
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* ### This always returns "-1" for transaction reps, because
- ### this particular bit of code doesn't know if the rep is
- ### stored in the protorev or in the mutable area (for props
- ### or dir contents). It is pretty rare for FSFS to *read*
- ### from the protorev file, though, so this is probably OK.
- ### And anyone going to debug corruption errors is probably
- ### going to jump straight to this comment anyway! */
- return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
- "Corrupt representation '%s'",
- rep
- ? representation_string(rep, ffd->format, TRUE,
- TRUE, pool)
- : "(null)");
- }
- /* ### Call representation_string() ? */
- return svn_error_trace(err);
-}
-
-struct rep_read_baton
-{
- /* The FS from which we're reading. */
- svn_fs_t *fs;
-
- /* If not NULL, this is the base for the first delta window in rs_list */
- svn_stringbuf_t *base_window;
-
- /* The state of all prior delta representations. */
- apr_array_header_t *rs_list;
-
- /* The plaintext state, if there is a plaintext. */
- struct rep_state *src_state;
-
- /* The index of the current delta chunk, if we are reading a delta. */
- int chunk_index;
-
- /* The buffer where we store undeltified data. */
- char *buf;
- apr_size_t buf_pos;
- apr_size_t buf_len;
-
- /* A checksum context for summing the data read in order to verify it.
- Note: we don't need to use the sha1 checksum because we're only doing
- data verification, for which md5 is perfectly safe. */
- svn_checksum_ctx_t *md5_checksum_ctx;
-
- svn_boolean_t checksum_finalized;
-
- /* The stored checksum of the representation we are reading, its
- length, and the amount we've read so far. Some of this
- information is redundant with rs_list and src_state, but it's
- convenient for the checksumming code to have it here. */
- svn_checksum_t *md5_checksum;
-
- svn_filesize_t len;
- svn_filesize_t off;
-
- /* The key for the fulltext cache for this rep, if there is a
- fulltext cache. */
- pair_cache_key_t fulltext_cache_key;
- /* The text we've been reading, if we're going to cache it. */
- svn_stringbuf_t *current_fulltext;
-
- /* Used for temporary allocations during the read. */
- apr_pool_t *pool;
-
- /* Pool used to store file handles and other data that is persistant
- for the entire stream read. */
- apr_pool_t *filehandle_pool;
-};
-
-/* Combine the name of the rev file in RS with the given OFFSET to form
- * a cache lookup key. Allocations will be made from POOL. May return
- * NULL if the key cannot be constructed. */
-static const char*
-get_window_key(struct rep_state *rs, apr_off_t offset, apr_pool_t *pool)
-{
- const char *name;
- const char *last_part;
- const char *name_last;
-
- /* the rev file name containing the txdelta window.
- * If this fails we are in serious trouble anyways.
- * And if nobody else detects the problems, the file content checksum
- * comparison _will_ find them.
- */
- if (apr_file_name_get(&name, rs->file))
- return NULL;
-
- /* Handle packed files as well by scanning backwards until we find the
- * revision or pack number. */
- name_last = name + strlen(name) - 1;
- while (! svn_ctype_isdigit(*name_last))
- --name_last;
-
- last_part = name_last;
- while (svn_ctype_isdigit(*last_part))
- --last_part;
-
- /* We must differentiate between packed files (as of today, the number
- * is being followed by a dot) and non-packed files (followed by \0).
- * Otherwise, there might be overlaps in the numbering range if the
- * repo gets packed after caching the txdeltas of non-packed revs.
- * => add the first non-digit char to the packed number. */
- if (name_last[1] != '\0')
- ++name_last;
-
- /* copy one char MORE than the actual number to mark packed files,
- * i.e. packed revision file content uses different key space then
- * non-packed ones: keys for packed rev file content ends with a dot
- * for non-packed rev files they end with a digit. */
- name = apr_pstrndup(pool, last_part + 1, name_last - last_part);
- return svn_fs_fs__combine_number_and_string(offset, name, pool);
-}
-
-/* Read the WINDOW_P for the rep state RS from the current FSFS session's
- * cache. This will be a no-op and IS_CACHED will be set to FALSE if no
- * cache has been given. If a cache is available IS_CACHED will inform
- * the caller about the success of the lookup. Allocations (of the window
- * in particualar) will be made from POOL.
- *
- * If the information could be found, put RS and the position within the
- * rev file into the same state as if the data had just been read from it.
- */
-static svn_error_t *
-get_cached_window(svn_txdelta_window_t **window_p,
- struct rep_state *rs,
- svn_boolean_t *is_cached,
- apr_pool_t *pool)
-{
- if (! rs->window_cache)
- {
- /* txdelta window has not been enabled */
- *is_cached = FALSE;
- }
- else
- {
- /* ask the cache for the desired txdelta window */
- svn_fs_fs__txdelta_cached_window_t *cached_window;
- SVN_ERR(svn_cache__get((void **) &cached_window,
- is_cached,
- rs->window_cache,
- get_window_key(rs, rs->off, pool),
- pool));
-
- if (*is_cached)
- {
- /* found it. Pass it back to the caller. */
- *window_p = cached_window->window;
-
- /* manipulate the RS as if we just read the data */
- rs->chunk_index++;
- rs->off = cached_window->end_offset;
-
- /* manipulate the rev file as if we just read from it */
- SVN_ERR(svn_io_file_seek(rs->file, APR_SET, &rs->off, pool));
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Store the WINDOW read at OFFSET for the rep state RS in the current
- * FSFS session's cache. This will be a no-op if no cache has been given.
- * Temporary allocations will be made from SCRATCH_POOL. */
-static svn_error_t *
-set_cached_window(svn_txdelta_window_t *window,
- struct rep_state *rs,
- apr_off_t offset,
- apr_pool_t *scratch_pool)
-{
- if (rs->window_cache)
- {
- /* store the window and the first offset _past_ it */
- svn_fs_fs__txdelta_cached_window_t cached_window;
-
- cached_window.window = window;
- cached_window.end_offset = rs->off;
-
- /* but key it with the start offset because that is the known state
- * when we will look it up */
- return svn_cache__set(rs->window_cache,
- get_window_key(rs, offset, scratch_pool),
- &cached_window,
- scratch_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Read the WINDOW_P for the rep state RS from the current FSFS session's
- * cache. This will be a no-op and IS_CACHED will be set to FALSE if no
- * cache has been given. If a cache is available IS_CACHED will inform
- * the caller about the success of the lookup. Allocations (of the window
- * in particualar) will be made from POOL.
- */
-static svn_error_t *
-get_cached_combined_window(svn_stringbuf_t **window_p,
- struct rep_state *rs,
- svn_boolean_t *is_cached,
- apr_pool_t *pool)
-{
- if (! rs->combined_cache)
- {
- /* txdelta window has not been enabled */
- *is_cached = FALSE;
- }
- else
- {
- /* ask the cache for the desired txdelta window */
- return svn_cache__get((void **)window_p,
- is_cached,
- rs->combined_cache,
- get_window_key(rs, rs->start, pool),
- pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Store the WINDOW read at OFFSET for the rep state RS in the current
- * FSFS session's cache. This will be a no-op if no cache has been given.
- * Temporary allocations will be made from SCRATCH_POOL. */
-static svn_error_t *
-set_cached_combined_window(svn_stringbuf_t *window,
- struct rep_state *rs,
- apr_off_t offset,
- apr_pool_t *scratch_pool)
-{
- if (rs->combined_cache)
- {
- /* but key it with the start offset because that is the known state
- * when we will look it up */
- return svn_cache__set(rs->combined_cache,
- get_window_key(rs, offset, scratch_pool),
- window,
- scratch_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Build an array of rep_state structures in *LIST giving the delta
- reps from first_rep to a plain-text or self-compressed rep. Set
- *SRC_STATE to the plain-text rep we find at the end of the chain,
- or to NULL if the final delta representation is self-compressed.
- The representation to start from is designated by filesystem FS, id
- ID, and representation REP.
- Also, set *WINDOW_P to the base window content for *LIST, if it
- could be found in cache. Otherwise, *LIST will contain the base
- representation for the whole delta chain.
- Finally, return the expanded size of the representation in
- *EXPANDED_SIZE. It will take care of cases where only the on-disk
- size is known. */
-static svn_error_t *
-build_rep_list(apr_array_header_t **list,
- svn_stringbuf_t **window_p,
- struct rep_state **src_state,
- svn_filesize_t *expanded_size,
- svn_fs_t *fs,
- representation_t *first_rep,
- apr_pool_t *pool)
-{
- representation_t rep;
- struct rep_state *rs = NULL;
- struct rep_args *rep_args;
- svn_boolean_t is_cached = FALSE;
- apr_file_t *last_file = NULL;
- svn_revnum_t last_revision;
-
- *list = apr_array_make(pool, 1, sizeof(struct rep_state *));
- rep = *first_rep;
-
- /* The value as stored in the data struct.
- 0 is either for unknown length or actually zero length. */
- *expanded_size = first_rep->expanded_size;
-
- /* for the top-level rep, we need the rep_args */
- SVN_ERR(create_rep_state(&rs, &rep_args, &last_file,
- &last_revision, &rep, fs, pool));
-
- /* Unknown size or empty representation?
- That implies the this being the first iteration.
- Usually size equals on-disk size, except for empty,
- compressed representations (delta, size = 4).
- Please note that for all non-empty deltas have
- a 4-byte header _plus_ some data. */
- if (*expanded_size == 0)
- if (! rep_args->is_delta || first_rep->size != 4)
- *expanded_size = first_rep->size;
-
- while (1)
- {
- /* fetch state, if that has not been done already */
- if (!rs)
- SVN_ERR(create_rep_state(&rs, &rep_args, &last_file,
- &last_revision, &rep, fs, pool));
-
- SVN_ERR(get_cached_combined_window(window_p, rs, &is_cached, pool));
- if (is_cached)
- {
- /* We already have a reconstructed window in our cache.
- Write a pseudo rep_state with the full length. */
- rs->off = rs->start;
- rs->end = rs->start + (*window_p)->len;
- *src_state = rs;
- return SVN_NO_ERROR;
- }
-
- if (!rep_args->is_delta)
- {
- /* This is a plaintext, so just return the current rep_state. */
- *src_state = rs;
- return SVN_NO_ERROR;
- }
-
- /* Push this rep onto the list. If it's self-compressed, we're done. */
- APR_ARRAY_PUSH(*list, struct rep_state *) = rs;
- if (rep_args->is_delta_vs_empty)
- {
- *src_state = NULL;
- return SVN_NO_ERROR;
- }
-
- rep.revision = rep_args->base_revision;
- rep.offset = rep_args->base_offset;
- rep.size = rep_args->base_length;
- rep.txn_id = NULL;
-
- rs = NULL;
- }
-}
-
-
-/* Create a rep_read_baton structure for node revision NODEREV in
- filesystem FS and store it in *RB_P. If FULLTEXT_CACHE_KEY is not
- NULL, it is the rep's key in the fulltext cache, and a stringbuf
- must be allocated to store the text. Perform all allocations in
- POOL. If rep is mutable, it must be for file contents. */
-static svn_error_t *
-rep_read_get_baton(struct rep_read_baton **rb_p,
- svn_fs_t *fs,
- representation_t *rep,
- pair_cache_key_t fulltext_cache_key,
- apr_pool_t *pool)
-{
- struct rep_read_baton *b;
-
- b = apr_pcalloc(pool, sizeof(*b));
- b->fs = fs;
- b->base_window = NULL;
- b->chunk_index = 0;
- b->buf = NULL;
- b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
- b->checksum_finalized = FALSE;
- b->md5_checksum = svn_checksum_dup(rep->md5_checksum, pool);
- b->len = rep->expanded_size;
- b->off = 0;
- b->fulltext_cache_key = fulltext_cache_key;
- b->pool = svn_pool_create(pool);
- b->filehandle_pool = svn_pool_create(pool);
-
- SVN_ERR(build_rep_list(&b->rs_list, &b->base_window,
- &b->src_state, &b->len, fs, rep,
- b->filehandle_pool));
-
- if (SVN_IS_VALID_REVNUM(fulltext_cache_key.revision))
- b->current_fulltext = svn_stringbuf_create_ensure
- ((apr_size_t)b->len,
- b->filehandle_pool);
- else
- b->current_fulltext = NULL;
-
- /* Save our output baton. */
- *rb_p = b;
-
- return SVN_NO_ERROR;
-}
-
-/* Skip forwards to THIS_CHUNK in REP_STATE and then read the next delta
- window into *NWIN. */
-static svn_error_t *
-read_delta_window(svn_txdelta_window_t **nwin, int this_chunk,
- struct rep_state *rs, apr_pool_t *pool)
-{
- svn_stream_t *stream;
- svn_boolean_t is_cached;
- apr_off_t old_offset;
-
- SVN_ERR_ASSERT(rs->chunk_index <= this_chunk);
-
- /* RS->FILE may be shared between RS instances -> make sure we point
- * to the right data. */
- SVN_ERR(svn_io_file_seek(rs->file, APR_SET, &rs->off, pool));
-
- /* Skip windows to reach the current chunk if we aren't there yet. */
- while (rs->chunk_index < this_chunk)
- {
- SVN_ERR(svn_txdelta_skip_svndiff_window(rs->file, rs->ver, pool));
- rs->chunk_index++;
- SVN_ERR(get_file_offset(&rs->off, rs->file, pool));
- if (rs->off >= rs->end)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Reading one svndiff window read "
- "beyond the end of the "
- "representation"));
- }
-
- /* Read the next window. But first, try to find it in the cache. */
- SVN_ERR(get_cached_window(nwin, rs, &is_cached, pool));
- if (is_cached)
- return SVN_NO_ERROR;
-
- /* Actually read the next window. */
- old_offset = rs->off;
- stream = svn_stream_from_aprfile2(rs->file, TRUE, pool);
- SVN_ERR(svn_txdelta_read_svndiff_window(nwin, stream, rs->ver, pool));
- rs->chunk_index++;
- SVN_ERR(get_file_offset(&rs->off, rs->file, pool));
-
- if (rs->off > rs->end)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Reading one svndiff window read beyond "
- "the end of the representation"));
-
- /* the window has not been cached before, thus cache it now
- * (if caching is used for them at all) */
- return set_cached_window(*nwin, rs, old_offset, pool);
-}
-
-/* Read SIZE bytes from the representation RS and return it in *NWIN. */
-static svn_error_t *
-read_plain_window(svn_stringbuf_t **nwin, struct rep_state *rs,
- apr_size_t size, apr_pool_t *pool)
-{
- /* RS->FILE may be shared between RS instances -> make sure we point
- * to the right data. */
- SVN_ERR(svn_io_file_seek(rs->file, APR_SET, &rs->off, pool));
-
- /* Read the plain data. */
- *nwin = svn_stringbuf_create_ensure(size, pool);
- SVN_ERR(svn_io_file_read_full2(rs->file, (*nwin)->data, size, NULL, NULL,
- pool));
- (*nwin)->data[size] = 0;
-
- /* Update RS. */
- rs->off += (apr_off_t)size;
-
- return SVN_NO_ERROR;
-}
-
-/* Get the undeltified window that is a result of combining all deltas
- from the current desired representation identified in *RB with its
- base representation. Store the window in *RESULT. */
-static svn_error_t *
-get_combined_window(svn_stringbuf_t **result,
- struct rep_read_baton *rb)
-{
- apr_pool_t *pool, *new_pool, *window_pool;
- int i;
- svn_txdelta_window_t *window;
- apr_array_header_t *windows;
- svn_stringbuf_t *source, *buf = rb->base_window;
- struct rep_state *rs;
-
- /* Read all windows that we need to combine. This is fine because
- the size of each window is relatively small (100kB) and skip-
- delta limits the number of deltas in a chain to well under 100.
- Stop early if one of them does not depend on its predecessors. */
- window_pool = svn_pool_create(rb->pool);
- windows = apr_array_make(window_pool, 0, sizeof(svn_txdelta_window_t *));
- for (i = 0; i < rb->rs_list->nelts; ++i)
- {
- rs = APR_ARRAY_IDX(rb->rs_list, i, struct rep_state *);
- SVN_ERR(read_delta_window(&window, rb->chunk_index, rs, window_pool));
-
- APR_ARRAY_PUSH(windows, svn_txdelta_window_t *) = window;
- if (window->src_ops == 0)
- {
- ++i;
- break;
- }
- }
-
- /* Combine in the windows from the other delta reps. */
- pool = svn_pool_create(rb->pool);
- for (--i; i >= 0; --i)
- {
-
- rs = APR_ARRAY_IDX(rb->rs_list, i, struct rep_state *);
- window = APR_ARRAY_IDX(windows, i, svn_txdelta_window_t *);
-
- /* Maybe, we've got a PLAIN start representation. If we do, read
- as much data from it as the needed for the txdelta window's source
- view.
- Note that BUF / SOURCE may only be NULL in the first iteration. */
- source = buf;
- if (source == NULL && rb->src_state != NULL)
- SVN_ERR(read_plain_window(&source, rb->src_state, window->sview_len,
- pool));
-
- /* Combine this window with the current one. */
- new_pool = svn_pool_create(rb->pool);
- buf = svn_stringbuf_create_ensure(window->tview_len, new_pool);
- buf->len = window->tview_len;
-
- svn_txdelta_apply_instructions(window, source ? source->data : NULL,
- buf->data, &buf->len);
- if (buf->len != window->tview_len)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("svndiff window length is "
- "corrupt"));
-
- /* Cache windows only if the whole rep content could be read as a
- single chunk. Only then will no other chunk need a deeper RS
- list than the cached chunk. */
- if ((rb->chunk_index == 0) && (rs->off == rs->end))
- SVN_ERR(set_cached_combined_window(buf, rs, rs->start, new_pool));
-
- /* Cycle pools so that we only need to hold three windows at a time. */
- svn_pool_destroy(pool);
- pool = new_pool;
- }
-
- svn_pool_destroy(window_pool);
-
- *result = buf;
- return SVN_NO_ERROR;
-}
-
-/* Returns whether or not the expanded fulltext of the file is cachable
- * based on its size SIZE. The decision depends on the cache used by RB.
- */
-static svn_boolean_t
-fulltext_size_is_cachable(fs_fs_data_t *ffd, svn_filesize_t size)
-{
- return (size < APR_SIZE_MAX)
- && svn_cache__is_cachable(ffd->fulltext_cache, (apr_size_t)size);
-}
-
-/* Close method used on streams returned by read_representation().
- */
-static svn_error_t *
-rep_read_contents_close(void *baton)
-{
- struct rep_read_baton *rb = baton;
-
- svn_pool_destroy(rb->pool);
- svn_pool_destroy(rb->filehandle_pool);
-
- return SVN_NO_ERROR;
-}
-
-/* Return the next *LEN bytes of the rep and store them in *BUF. */
-static svn_error_t *
-get_contents(struct rep_read_baton *rb,
- char *buf,
- apr_size_t *len)
-{
- apr_size_t copy_len, remaining = *len;
- char *cur = buf;
- struct rep_state *rs;
-
- /* Special case for when there are no delta reps, only a plain
- text. */
- if (rb->rs_list->nelts == 0)
- {
- copy_len = remaining;
- rs = rb->src_state;
-
- if (rb->base_window != NULL)
- {
- /* We got the desired rep directly from the cache.
- This is where we need the pseudo rep_state created
- by build_rep_list(). */
- apr_size_t offset = (apr_size_t)(rs->off - rs->start);
- if (copy_len + offset > rb->base_window->len)
- copy_len = offset < rb->base_window->len
- ? rb->base_window->len - offset
- : 0ul;
-
- memcpy (cur, rb->base_window->data + offset, copy_len);
- }
- else
- {
- if (((apr_off_t) copy_len) > rs->end - rs->off)
- copy_len = (apr_size_t) (rs->end - rs->off);
- SVN_ERR(svn_io_file_read_full2(rs->file, cur, copy_len, NULL,
- NULL, rb->pool));
- }
-
- rs->off += copy_len;
- *len = copy_len;
- return SVN_NO_ERROR;
- }
-
- while (remaining > 0)
- {
- /* If we have buffered data from a previous chunk, use that. */
- if (rb->buf)
- {
- /* Determine how much to copy from the buffer. */
- copy_len = rb->buf_len - rb->buf_pos;
- if (copy_len > remaining)
- copy_len = remaining;
-
- /* Actually copy the data. */
- memcpy(cur, rb->buf + rb->buf_pos, copy_len);
- rb->buf_pos += copy_len;
- cur += copy_len;
- remaining -= copy_len;
-
- /* If the buffer is all used up, clear it and empty the
- local pool. */
- if (rb->buf_pos == rb->buf_len)
- {
- svn_pool_clear(rb->pool);
- rb->buf = NULL;
- }
- }
- else
- {
- svn_stringbuf_t *sbuf = NULL;
-
- rs = APR_ARRAY_IDX(rb->rs_list, 0, struct rep_state *);
- if (rs->off == rs->end)
- break;
-
- /* Get more buffered data by evaluating a chunk. */
- SVN_ERR(get_combined_window(&sbuf, rb));
-
- rb->chunk_index++;
- rb->buf_len = sbuf->len;
- rb->buf = sbuf->data;
- rb->buf_pos = 0;
- }
- }
-
- *len = cur - buf;
-
- return SVN_NO_ERROR;
-}
-
-/* BATON is of type `rep_read_baton'; read the next *LEN bytes of the
- representation and store them in *BUF. Sum as we read and verify
- the MD5 sum at the end. */
-static svn_error_t *
-rep_read_contents(void *baton,
- char *buf,
- apr_size_t *len)
-{
- struct rep_read_baton *rb = baton;
-
- /* Get the next block of data. */
- SVN_ERR(get_contents(rb, buf, len));
-
- if (rb->current_fulltext)
- svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
-
- /* Perform checksumming. We want to check the checksum as soon as
- the last byte of data is read, in case the caller never performs
- a short read, but we don't want to finalize the MD5 context
- twice. */
- if (!rb->checksum_finalized)
- {
- SVN_ERR(svn_checksum_update(rb->md5_checksum_ctx, buf, *len));
- rb->off += *len;
- if (rb->off == rb->len)
- {
- svn_checksum_t *md5_checksum;
-
- rb->checksum_finalized = TRUE;
- SVN_ERR(svn_checksum_final(&md5_checksum, rb->md5_checksum_ctx,
- rb->pool));
- if (!svn_checksum_match(md5_checksum, rb->md5_checksum))
- return svn_error_create(SVN_ERR_FS_CORRUPT,
- svn_checksum_mismatch_err(rb->md5_checksum, md5_checksum,
- rb->pool,
- _("Checksum mismatch while reading representation")),
- NULL);
- }
- }
-
- if (rb->off == rb->len && rb->current_fulltext)
- {
- fs_fs_data_t *ffd = rb->fs->fsap_data;
- SVN_ERR(svn_cache__set(ffd->fulltext_cache, &rb->fulltext_cache_key,
- rb->current_fulltext, rb->pool));
- rb->current_fulltext = NULL;
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Return a stream in *CONTENTS_P that will read the contents of a
- representation stored at the location given by REP. Appropriate
- for any kind of immutable representation, but only for file
- contents (not props or directory contents) in mutable
- representations.
-
- If REP is NULL, the representation is assumed to be empty, and the
- empty stream is returned.
-*/
-static svn_error_t *
-read_representation(svn_stream_t **contents_p,
- svn_fs_t *fs,
- representation_t *rep,
- apr_pool_t *pool)
-{
- if (! rep)
- {
- *contents_p = svn_stream_empty(pool);
- }
- else
- {
- fs_fs_data_t *ffd = fs->fsap_data;
- pair_cache_key_t fulltext_cache_key = { 0 };
- svn_filesize_t len = rep->expanded_size ? rep->expanded_size : rep->size;
- struct rep_read_baton *rb;
-
- fulltext_cache_key.revision = rep->revision;
- fulltext_cache_key.second = rep->offset;
- if (ffd->fulltext_cache && SVN_IS_VALID_REVNUM(rep->revision)
- && fulltext_size_is_cachable(ffd, len))
- {
- svn_stringbuf_t *fulltext;
- svn_boolean_t is_cached;
- SVN_ERR(svn_cache__get((void **) &fulltext, &is_cached,
- ffd->fulltext_cache, &fulltext_cache_key,
- pool));
- if (is_cached)
- {
- *contents_p = svn_stream_from_stringbuf(fulltext, pool);
- return SVN_NO_ERROR;
- }
- }
- else
- fulltext_cache_key.revision = SVN_INVALID_REVNUM;
-
- SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key, pool));
-
- *contents_p = svn_stream_create(rb, pool);
- svn_stream_set_read(*contents_p, rep_read_contents);
- svn_stream_set_close(*contents_p, rep_read_contents_close);
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__get_contents(svn_stream_t **contents_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- return read_representation(contents_p, fs, noderev->data_rep, pool);
-}
-
-/* Baton used when reading delta windows. */
-struct delta_read_baton
-{
- struct rep_state *rs;
- svn_checksum_t *checksum;
-};
-
-/* This implements the svn_txdelta_next_window_fn_t interface. */
-static svn_error_t *
-delta_read_next_window(svn_txdelta_window_t **window, void *baton,
- apr_pool_t *pool)
-{
- struct delta_read_baton *drb = baton;
-
- if (drb->rs->off == drb->rs->end)
- {
- *window = NULL;
- return SVN_NO_ERROR;
- }
-
- return read_delta_window(window, drb->rs->chunk_index, drb->rs, pool);
-}
-
-/* This implements the svn_txdelta_md5_digest_fn_t interface. */
-static const unsigned char *
-delta_read_md5_digest(void *baton)
-{
- struct delta_read_baton *drb = baton;
-
- if (drb->checksum->kind == svn_checksum_md5)
- return drb->checksum->digest;
- else
- return NULL;
-}
-
-svn_error_t *
-svn_fs_fs__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
- svn_fs_t *fs,
- node_revision_t *source,
- node_revision_t *target,
- apr_pool_t *pool)
-{
- svn_stream_t *source_stream, *target_stream;
-
- /* Try a shortcut: if the target is stored as a delta against the source,
- then just use that delta. */
- if (source && source->data_rep && target->data_rep)
- {
- struct rep_state *rep_state;
- struct rep_args *rep_args;
-
- /* Read target's base rep if any. */
- SVN_ERR(create_rep_state(&rep_state, &rep_args, NULL, NULL,
- target->data_rep, fs, pool));
-
- /* If that matches source, then use this delta as is.
- Note that we want an actual delta here. E.g. a self-delta would
- not be good enough. */
- if (rep_args->is_delta
- && rep_args->base_revision == source->data_rep->revision
- && rep_args->base_offset == source->data_rep->offset)
- {
- /* Create the delta read baton. */
- struct delta_read_baton *drb = apr_pcalloc(pool, sizeof(*drb));
- drb->rs = rep_state;
- drb->checksum = svn_checksum_dup(target->data_rep->md5_checksum,
- pool);
- *stream_p = svn_txdelta_stream_create(drb, delta_read_next_window,
- delta_read_md5_digest, pool);
- return SVN_NO_ERROR;
- }
- else
- SVN_ERR(svn_io_file_close(rep_state->file, pool));
- }
-
- /* Read both fulltexts and construct a delta. */
- if (source)
- SVN_ERR(read_representation(&source_stream, fs, source->data_rep, pool));
- else
- source_stream = svn_stream_empty(pool);
- SVN_ERR(read_representation(&target_stream, fs, target->data_rep, pool));
-
- /* Because source and target stream will already verify their content,
- * there is no need to do this once more. In particular if the stream
- * content is being fetched from cache. */
- svn_txdelta2(stream_p, source_stream, target_stream, FALSE, pool);
-
- return SVN_NO_ERROR;
-}
-
-/* Baton for cache_access_wrapper. Wraps the original parameters of
- * svn_fs_fs__try_process_file_content().
- */
-typedef struct cache_access_wrapper_baton_t
-{
- svn_fs_process_contents_func_t func;
- void* baton;
-} cache_access_wrapper_baton_t;
-
-/* Wrapper to translate between svn_fs_process_contents_func_t and
- * svn_cache__partial_getter_func_t.
- */
-static svn_error_t *
-cache_access_wrapper(void **out,
- const void *data,
- apr_size_t data_len,
- void *baton,
- apr_pool_t *pool)
-{
- cache_access_wrapper_baton_t *wrapper_baton = baton;
-
- SVN_ERR(wrapper_baton->func((const unsigned char *)data,
- data_len - 1, /* cache adds terminating 0 */
- wrapper_baton->baton,
- pool));
-
- /* non-NULL value to signal the calling cache that all went well */
- *out = baton;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__try_process_file_contents(svn_boolean_t *success,
- svn_fs_t *fs,
- node_revision_t *noderev,
- svn_fs_process_contents_func_t processor,
- void* baton,
- apr_pool_t *pool)
-{
- representation_t *rep = noderev->data_rep;
- if (rep)
- {
- fs_fs_data_t *ffd = fs->fsap_data;
- pair_cache_key_t fulltext_cache_key = { 0 };
-
- fulltext_cache_key.revision = rep->revision;
- fulltext_cache_key.second = rep->offset;
- if (ffd->fulltext_cache && SVN_IS_VALID_REVNUM(rep->revision)
- && fulltext_size_is_cachable(ffd, rep->expanded_size))
- {
- cache_access_wrapper_baton_t wrapper_baton;
- void *dummy = NULL;
-
- wrapper_baton.func = processor;
- wrapper_baton.baton = baton;
- return svn_cache__get_partial(&dummy, success,
- ffd->fulltext_cache,
- &fulltext_cache_key,
- cache_access_wrapper,
- &wrapper_baton,
- pool);
- }
- }
-
- *success = FALSE;
- return SVN_NO_ERROR;
-}
-
-/* Fetch the contents of a directory into ENTRIES. Values are stored
- as filename to string mappings; further conversion is necessary to
- convert them into svn_fs_dirent_t values. */
-static svn_error_t *
-get_dir_contents(apr_hash_t *entries,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- svn_stream_t *contents;
-
- if (noderev->data_rep && noderev->data_rep->txn_id)
- {
- const char *filename = path_txn_node_children(fs, noderev->id, pool);
-
- /* The representation is mutable. Read the old directory
- contents from the mutable children file, followed by the
- changes we've made in this transaction. */
- SVN_ERR(svn_stream_open_readonly(&contents, filename, pool, pool));
- SVN_ERR(svn_hash_read2(entries, contents, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_hash_read_incremental(entries, contents, NULL, pool));
- SVN_ERR(svn_stream_close(contents));
- }
- else if (noderev->data_rep)
- {
- /* use a temporary pool for temp objects.
- * Also undeltify content before parsing it. Otherwise, we could only
- * parse it byte-by-byte.
- */
- apr_pool_t *text_pool = svn_pool_create(pool);
- apr_size_t len = noderev->data_rep->expanded_size
- ? (apr_size_t)noderev->data_rep->expanded_size
- : (apr_size_t)noderev->data_rep->size;
- svn_stringbuf_t *text = svn_stringbuf_create_ensure(len, text_pool);
- text->len = len;
-
- /* The representation is immutable. Read it normally. */
- SVN_ERR(read_representation(&contents, fs, noderev->data_rep, text_pool));
- SVN_ERR(svn_stream_read(contents, text->data, &text->len));
- SVN_ERR(svn_stream_close(contents));
-
- /* de-serialize hash */
- contents = svn_stream_from_stringbuf(text, text_pool);
- SVN_ERR(svn_hash_read2(entries, contents, SVN_HASH_TERMINATOR, pool));
-
- svn_pool_destroy(text_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-static const char *
-unparse_dir_entry(svn_node_kind_t kind, const svn_fs_id_t *id,
- apr_pool_t *pool)
-{
- return apr_psprintf(pool, "%s %s",
- (kind == svn_node_file) ? KIND_FILE : KIND_DIR,
- svn_fs_fs__id_unparse(id, pool)->data);
-}
-
-/* Given a hash ENTRIES of dirent structions, return a hash in
- *STR_ENTRIES_P, that has svn_string_t as the values in the format
- specified by the fs_fs directory contents file. Perform
- allocations in POOL. */
-static svn_error_t *
-unparse_dir_entries(apr_hash_t **str_entries_p,
- apr_hash_t *entries,
- apr_pool_t *pool)
-{
- apr_hash_index_t *hi;
-
- /* For now, we use a our own hash function to ensure that we get a
- * (largely) stable order when serializing the data. It also gives
- * us some performance improvement.
- *
- * ### TODO ###
- * Use some sorted or other fixed order data container.
- */
- *str_entries_p = svn_hash__make(pool);
-
- for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
- {
- const void *key;
- apr_ssize_t klen;
- svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
- const char *new_val;
-
- apr_hash_this(hi, &key, &klen, NULL);
- new_val = unparse_dir_entry(dirent->kind, dirent->id, pool);
- apr_hash_set(*str_entries_p, key, klen,
- svn_string_create(new_val, pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Given a hash STR_ENTRIES with values as svn_string_t as specified
- in an FSFS directory contents listing, return a hash of dirents in
- *ENTRIES_P. Perform allocations in POOL. */
-static svn_error_t *
-parse_dir_entries(apr_hash_t **entries_p,
- apr_hash_t *str_entries,
- const char *unparsed_id,
- apr_pool_t *pool)
-{
- apr_hash_index_t *hi;
-
- *entries_p = apr_hash_make(pool);
+ svn_checksum_t *empty_md5
+ = svn_checksum_empty_checksum(svn_checksum_md5, pool);
- /* Translate the string dir entries into real entries. */
- for (hi = apr_hash_first(pool, str_entries); hi; hi = apr_hash_next(hi))
- {
- const char *name = svn__apr_hash_index_key(hi);
- svn_string_t *str_val = svn__apr_hash_index_val(hi);
- char *str, *last_str;
- svn_fs_dirent_t *dirent = apr_pcalloc(pool, sizeof(*dirent));
-
- last_str = apr_pstrdup(pool, str_val->data);
- dirent->name = apr_pstrdup(pool, name);
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt in '%s'"),
- unparsed_id);
-
- if (strcmp(str, KIND_FILE) == 0)
+ if (memcmp(empty_md5->digest, data_rep->md5_digest,
+ sizeof(data_rep->md5_digest)))
{
- dirent->kind = svn_node_file;
- }
- else if (strcmp(str, KIND_DIR) == 0)
- {
- dirent->kind = svn_node_dir;
+ /* Contents is not empty, i.e. EXPANDED_LENGTH cannot be the
+ actual file length. */
+ *length = data_rep->size;
}
else
{
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt in '%s'"),
- unparsed_id);
- }
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt in '%s'"),
- unparsed_id);
-
- dirent->id = svn_fs_fs__id_parse(str, strlen(str), pool);
-
- svn_hash_sets(*entries_p, dirent->name, dirent);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Return the cache object in FS responsible to storing the directory
- * the NODEREV. If none exists, return NULL. */
-static svn_cache__t *
-locate_dir_cache(svn_fs_t *fs,
- node_revision_t *noderev)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- return svn_fs_fs__id_txn_id(noderev->id)
- ? ffd->txn_dir_cache
- : ffd->dir_cache;
-}
-
-svn_error_t *
-svn_fs_fs__rep_contents_dir(apr_hash_t **entries_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- const char *unparsed_id = NULL;
- apr_hash_t *unparsed_entries, *parsed_entries;
-
- /* find the cache we may use */
- svn_cache__t *cache = locate_dir_cache(fs, noderev);
- if (cache)
- {
- svn_boolean_t found;
-
- unparsed_id = svn_fs_fs__id_unparse(noderev->id, pool)->data;
- SVN_ERR(svn_cache__get((void **) entries_p, &found, cache,
- unparsed_id, pool));
- if (found)
- return SVN_NO_ERROR;
- }
-
- /* Read in the directory hash. */
- unparsed_entries = apr_hash_make(pool);
- SVN_ERR(get_dir_contents(unparsed_entries, fs, noderev, pool));
- SVN_ERR(parse_dir_entries(&parsed_entries, unparsed_entries,
- unparsed_id, pool));
-
- /* Update the cache, if we are to use one. */
- if (cache)
- SVN_ERR(svn_cache__set(cache, unparsed_id, parsed_entries, pool));
-
- *entries_p = parsed_entries;
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__rep_contents_dir_entry(svn_fs_dirent_t **dirent,
- svn_fs_t *fs,
- node_revision_t *noderev,
- const char *name,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_boolean_t found = FALSE;
-
- /* find the cache we may use */
- svn_cache__t *cache = locate_dir_cache(fs, noderev);
- if (cache)
- {
- const char *unparsed_id =
- svn_fs_fs__id_unparse(noderev->id, scratch_pool)->data;
-
- /* Cache lookup. */
- SVN_ERR(svn_cache__get_partial((void **)dirent,
- &found,
- cache,
- unparsed_id,
- svn_fs_fs__extract_dir_entry,
- (void*)name,
- result_pool));
- }
-
- /* fetch data from disk if we did not find it in the cache */
- if (! found)
- {
- apr_hash_t *entries;
- svn_fs_dirent_t *entry;
- svn_fs_dirent_t *entry_copy = NULL;
-
- /* read the dir from the file system. It will probably be put it
- into the cache for faster lookup in future calls. */
- SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev,
- scratch_pool));
-
- /* find desired entry and return a copy in POOL, if found */
- entry = svn_hash_gets(entries, name);
- if (entry != NULL)
- {
- entry_copy = apr_palloc(result_pool, sizeof(*entry_copy));
- entry_copy->name = apr_pstrdup(result_pool, entry->name);
- entry_copy->id = svn_fs_fs__id_copy(entry->id, result_pool);
- entry_copy->kind = entry->kind;
+ /* Contents is empty. */
+ *length = 0;
}
-
- *dirent = entry_copy;
}
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_fs_fs__get_proplist(apr_hash_t **proplist_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- apr_hash_t *proplist;
- svn_stream_t *stream;
-
- if (noderev->prop_rep && noderev->prop_rep->txn_id)
- {
- const char *filename = path_txn_node_props(fs, noderev->id, pool);
- proplist = apr_hash_make(pool);
-
- SVN_ERR(svn_stream_open_readonly(&stream, filename, pool, pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
- }
- else if (noderev->prop_rep)
- {
- fs_fs_data_t *ffd = fs->fsap_data;
- representation_t *rep = noderev->prop_rep;
- pair_cache_key_t key = { 0 };
-
- key.revision = rep->revision;
- key.second = rep->offset;
- if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
- {
- svn_boolean_t is_cached;
- SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
- ffd->properties_cache, &key, pool));
- if (is_cached)
- return SVN_NO_ERROR;
- }
-
- proplist = apr_hash_make(pool);
- SVN_ERR(read_representation(&stream, fs, noderev->prop_rep, pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
-
- if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
- SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist, pool));
- }
- else
- {
- /* return an empty prop list if the node doesn't have any props */
- proplist = apr_hash_make(pool);
- }
-
- *proplist_p = proplist;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__file_length(svn_filesize_t *length,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- if (noderev->data_rep)
- *length = noderev->data_rep->expanded_size;
- else
- *length = 0;
-
- return SVN_NO_ERROR;
-}
-
svn_boolean_t
svn_fs_fs__noderev_same_rep_key(representation_t *a,
representation_t *b)
@@ -5822,3035 +1425,299 @@ svn_fs_fs__noderev_same_rep_key(representation_t *a,
if (a == NULL || b == NULL)
return FALSE;
- if (a->offset != b->offset)
+ if (a->item_index != b->item_index)
return FALSE;
if (a->revision != b->revision)
return FALSE;
- if (a->uniquifier == b->uniquifier)
- return TRUE;
-
- if (a->uniquifier == NULL || b->uniquifier == NULL)
- return FALSE;
-
- return strcmp(a->uniquifier, b->uniquifier) == 0;
+ return memcmp(&a->uniquifier, &b->uniquifier, sizeof(a->uniquifier)) == 0;
}
svn_error_t *
-svn_fs_fs__file_checksum(svn_checksum_t **checksum,
- node_revision_t *noderev,
- svn_checksum_kind_t kind,
- apr_pool_t *pool)
-{
- if (noderev->data_rep)
- {
- switch(kind)
- {
- case svn_checksum_md5:
- *checksum = svn_checksum_dup(noderev->data_rep->md5_checksum,
- pool);
- break;
- case svn_checksum_sha1:
- *checksum = svn_checksum_dup(noderev->data_rep->sha1_checksum,
- pool);
- break;
- default:
- *checksum = NULL;
- }
+svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ node_revision_t *a,
+ node_revision_t *b,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *contents_a, *contents_b;
+ representation_t *rep_a = a->data_rep;
+ representation_t *rep_b = b->data_rep;
+ svn_boolean_t a_empty = !rep_a;
+ svn_boolean_t b_empty = !rep_b;
+
+ /* This makes sure that neither rep will be NULL later on */
+ if (a_empty && b_empty)
+ {
+ *equal = TRUE;
+ return SVN_NO_ERROR;
}
- else
- *checksum = NULL;
-
- return SVN_NO_ERROR;
-}
-
-representation_t *
-svn_fs_fs__rep_copy(representation_t *rep,
- apr_pool_t *pool)
-{
- representation_t *rep_new;
-
- if (rep == NULL)
- return NULL;
-
- rep_new = apr_pcalloc(pool, sizeof(*rep_new));
-
- memcpy(rep_new, rep, sizeof(*rep_new));
- rep_new->md5_checksum = svn_checksum_dup(rep->md5_checksum, pool);
- rep_new->sha1_checksum = svn_checksum_dup(rep->sha1_checksum, pool);
- rep_new->uniquifier = apr_pstrdup(pool, rep->uniquifier);
-
- return rep_new;
-}
-/* Merge the internal-use-only CHANGE into a hash of public-FS
- svn_fs_path_change2_t CHANGES, collapsing multiple changes into a
- single summarical (is that real word?) change per path. Also keep
- the COPYFROM_CACHE up to date with new adds and replaces. */
-static svn_error_t *
-fold_change(apr_hash_t *changes,
- const change_t *change,
- apr_hash_t *copyfrom_cache)
-{
- apr_pool_t *pool = apr_hash_pool_get(changes);
- svn_fs_path_change2_t *old_change, *new_change;
- const char *path;
- apr_size_t path_len = strlen(change->path);
-
- if ((old_change = apr_hash_get(changes, change->path, path_len)))
+ /* Same path in same rev or txn? */
+ if (svn_fs_fs__id_eq(a->id, b->id))
{
- /* This path already exists in the hash, so we have to merge
- this change into the already existing one. */
-
- /* Sanity check: only allow NULL node revision ID in the
- `reset' case. */
- if ((! change->noderev_id) && (change->kind != svn_fs_path_change_reset))
- return svn_error_create
- (SVN_ERR_FS_CORRUPT, NULL,
- _("Missing required node revision ID"));
-
- /* Sanity check: we should be talking about the same node
- revision ID as our last change except where the last change
- was a deletion. */
- if (change->noderev_id
- && (! svn_fs_fs__id_eq(old_change->node_rev_id, change->noderev_id))
- && (old_change->change_kind != svn_fs_path_change_delete))
- return svn_error_create
- (SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid change ordering: new node revision ID "
- "without delete"));
-
- /* Sanity check: an add, replacement, or reset must be the first
- thing to follow a deletion. */
- if ((old_change->change_kind == svn_fs_path_change_delete)
- && (! ((change->kind == svn_fs_path_change_replace)
- || (change->kind == svn_fs_path_change_reset)
- || (change->kind == svn_fs_path_change_add))))
- return svn_error_create
- (SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid change ordering: non-add change on deleted path"));
-
- /* Sanity check: an add can't follow anything except
- a delete or reset. */
- if ((change->kind == svn_fs_path_change_add)
- && (old_change->change_kind != svn_fs_path_change_delete)
- && (old_change->change_kind != svn_fs_path_change_reset))
- return svn_error_create
- (SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid change ordering: add change on preexisting path"));
-
- /* Now, merge that change in. */
- switch (change->kind)
- {
- case svn_fs_path_change_reset:
- /* A reset here will simply remove the path change from the
- hash. */
- old_change = NULL;
- break;
-
- case svn_fs_path_change_delete:
- if (old_change->change_kind == svn_fs_path_change_add)
- {
- /* If the path was introduced in this transaction via an
- add, and we are deleting it, just remove the path
- altogether. */
- old_change = NULL;
- }
- else
- {
- /* A deletion overrules all previous changes. */
- old_change->change_kind = svn_fs_path_change_delete;
- old_change->text_mod = change->text_mod;
- old_change->prop_mod = change->prop_mod;
- old_change->copyfrom_rev = SVN_INVALID_REVNUM;
- old_change->copyfrom_path = NULL;
- }
- break;
-
- case svn_fs_path_change_add:
- case svn_fs_path_change_replace:
- /* An add at this point must be following a previous delete,
- so treat it just like a replace. */
- old_change->change_kind = svn_fs_path_change_replace;
- old_change->node_rev_id = svn_fs_fs__id_copy(change->noderev_id,
- pool);
- old_change->text_mod = change->text_mod;
- old_change->prop_mod = change->prop_mod;
- if (change->copyfrom_rev == SVN_INVALID_REVNUM)
- {
- old_change->copyfrom_rev = SVN_INVALID_REVNUM;
- old_change->copyfrom_path = NULL;
- }
- else
- {
- old_change->copyfrom_rev = change->copyfrom_rev;
- old_change->copyfrom_path = apr_pstrdup(pool,
- change->copyfrom_path);
- }
- break;
-
- case svn_fs_path_change_modify:
- default:
- if (change->text_mod)
- old_change->text_mod = TRUE;
- if (change->prop_mod)
- old_change->prop_mod = TRUE;
- break;
- }
-
- /* Point our new_change to our (possibly modified) old_change. */
- new_change = old_change;
- }
- else
- {
- /* This change is new to the hash, so make a new public change
- structure from the internal one (in the hash's pool), and dup
- the path into the hash's pool, too. */
- new_change = apr_pcalloc(pool, sizeof(*new_change));
- new_change->node_rev_id = svn_fs_fs__id_copy(change->noderev_id, pool);
- new_change->change_kind = change->kind;
- new_change->text_mod = change->text_mod;
- new_change->prop_mod = change->prop_mod;
- /* In FSFS, copyfrom_known is *always* true, since we've always
- * stored copyfroms in changed paths lists. */
- new_change->copyfrom_known = TRUE;
- if (change->copyfrom_rev != SVN_INVALID_REVNUM)
- {
- new_change->copyfrom_rev = change->copyfrom_rev;
- new_change->copyfrom_path = apr_pstrdup(pool, change->copyfrom_path);
- }
- else
- {
- new_change->copyfrom_rev = SVN_INVALID_REVNUM;
- new_change->copyfrom_path = NULL;
- }
- }
-
- if (new_change)
- new_change->node_kind = change->node_kind;
-
- /* Add (or update) this path.
-
- Note: this key might already be present, and it would be nice to
- re-use its value, but there is no way to fetch it. The API makes no
- guarantees that this (new) key will not be retained. Thus, we (again)
- copy the key into the target pool to ensure a proper lifetime. */
- path = apr_pstrmemdup(pool, change->path, path_len);
- apr_hash_set(changes, path, path_len, new_change);
-
- /* Update the copyfrom cache, if any. */
- if (copyfrom_cache)
- {
- apr_pool_t *copyfrom_pool = apr_hash_pool_get(copyfrom_cache);
- const char *copyfrom_string = NULL, *copyfrom_key = path;
- if (new_change)
- {
- if (SVN_IS_VALID_REVNUM(new_change->copyfrom_rev))
- copyfrom_string = apr_psprintf(copyfrom_pool, "%ld %s",
- new_change->copyfrom_rev,
- new_change->copyfrom_path);
- else
- copyfrom_string = "";
- }
- /* We need to allocate a copy of the key in the copyfrom_pool if
- * we're not doing a deletion and if it isn't already there. */
- if ( copyfrom_string
- && ( ! apr_hash_count(copyfrom_cache)
- || ! apr_hash_get(copyfrom_cache, copyfrom_key, path_len)))
- copyfrom_key = apr_pstrmemdup(copyfrom_pool, copyfrom_key, path_len);
-
- apr_hash_set(copyfrom_cache, copyfrom_key, path_len,
- copyfrom_string);
+ *equal = TRUE;
+ return SVN_NO_ERROR;
}
- return SVN_NO_ERROR;
-}
-
-/* The 256 is an arbitrary size large enough to hold the node id and the
- * various flags. */
-#define MAX_CHANGE_LINE_LEN FSFS_MAX_PATH_LEN + 256
-
-/* Read the next entry in the changes record from file FILE and store
- the resulting change in *CHANGE_P. If there is no next record,
- store NULL there. Perform all allocations from POOL. */
-static svn_error_t *
-read_change(change_t **change_p,
- apr_file_t *file,
- apr_pool_t *pool)
-{
- char buf[MAX_CHANGE_LINE_LEN];
- apr_size_t len = sizeof(buf);
- change_t *change;
- char *str, *last_str = buf, *kind_str;
- svn_error_t *err;
-
- /* Default return value. */
- *change_p = NULL;
-
- err = svn_io_read_length_line(file, buf, &len, pool);
-
- /* Check for a blank line. */
- if (err || (len == 0))
+ /* Beware of the combination NULL rep and possibly empty rep.
+ * Due to EXPANDED_SIZE not being reliable, we can't easily detect empty
+ * reps. So, we can only take further shortcuts if both reps are given. */
+ if (!a_empty && !b_empty)
{
- if (err && APR_STATUS_IS_EOF(err->apr_err))
+ /* File text representations always know their checksums -
+ * even in a txn. */
+ if (memcmp(rep_a->md5_digest, rep_b->md5_digest,
+ sizeof(rep_a->md5_digest)))
{
- svn_error_clear(err);
+ *equal = FALSE;
return SVN_NO_ERROR;
}
- if ((len == 0) && (! err))
- return SVN_NO_ERROR;
- return svn_error_trace(err);
- }
-
- change = apr_pcalloc(pool, sizeof(*change));
-
- /* Get the node-id of the change. */
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- change->noderev_id = svn_fs_fs__id_parse(str, strlen(str), pool);
- if (change->noderev_id == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- /* Get the change type. */
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- /* Don't bother to check the format number before looking for
- * node-kinds: just read them if you find them. */
- change->node_kind = svn_node_unknown;
- kind_str = strchr(str, '-');
- if (kind_str)
- {
- /* Cap off the end of "str" (the action). */
- *kind_str = '\0';
- kind_str++;
- if (strcmp(kind_str, KIND_FILE) == 0)
- change->node_kind = svn_node_file;
- else if (strcmp(kind_str, KIND_DIR) == 0)
- change->node_kind = svn_node_dir;
- else
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
- }
-
- if (strcmp(str, ACTION_MODIFY) == 0)
- {
- change->kind = svn_fs_path_change_modify;
- }
- else if (strcmp(str, ACTION_ADD) == 0)
- {
- change->kind = svn_fs_path_change_add;
- }
- else if (strcmp(str, ACTION_DELETE) == 0)
- {
- change->kind = svn_fs_path_change_delete;
- }
- else if (strcmp(str, ACTION_REPLACE) == 0)
- {
- change->kind = svn_fs_path_change_replace;
- }
- else if (strcmp(str, ACTION_RESET) == 0)
- {
- change->kind = svn_fs_path_change_reset;
- }
- else
- {
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid change kind in rev file"));
- }
-
- /* Get the text-mod flag. */
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- if (strcmp(str, FLAG_TRUE) == 0)
- {
- change->text_mod = TRUE;
- }
- else if (strcmp(str, FLAG_FALSE) == 0)
- {
- change->text_mod = FALSE;
- }
- else
- {
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid text-mod flag in rev-file"));
- }
-
- /* Get the prop-mod flag. */
- str = svn_cstring_tokenize(" ", &last_str);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- if (strcmp(str, FLAG_TRUE) == 0)
- {
- change->prop_mod = TRUE;
- }
- else if (strcmp(str, FLAG_FALSE) == 0)
- {
- change->prop_mod = FALSE;
- }
- else
- {
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid prop-mod flag in rev-file"));
- }
-
- /* Get the changed path. */
- change->path = apr_pstrdup(pool, last_str);
-
-
- /* Read the next line, the copyfrom line. */
- len = sizeof(buf);
- SVN_ERR(svn_io_read_length_line(file, buf, &len, pool));
-
- if (len == 0)
- {
- change->copyfrom_rev = SVN_INVALID_REVNUM;
- change->copyfrom_path = NULL;
- }
- else
- {
- last_str = buf;
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
- change->copyfrom_rev = SVN_STR_TO_REV(str);
-
- if (! last_str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid changes line in rev-file"));
-
- change->copyfrom_path = apr_pstrdup(pool, last_str);
- }
-
- *change_p = change;
-
- return SVN_NO_ERROR;
-}
-
-/* Examine all the changed path entries in CHANGES and store them in
- *CHANGED_PATHS. Folding is done to remove redundant or unnecessary
- *data. Store a hash of paths to copyfrom "REV PATH" strings in
- COPYFROM_HASH if it is non-NULL. If PREFOLDED is true, assume that
- the changed-path entries have already been folded (by
- write_final_changed_path_info) and may be out of order, so we shouldn't
- remove children of replaced or deleted directories. Do all
- allocations in POOL. */
-static svn_error_t *
-process_changes(apr_hash_t *changed_paths,
- apr_hash_t *copyfrom_cache,
- apr_array_header_t *changes,
- svn_boolean_t prefolded,
- apr_pool_t *pool)
-{
- apr_pool_t *iterpool = svn_pool_create(pool);
- int i;
-
- /* Read in the changes one by one, folding them into our local hash
- as necessary. */
-
- for (i = 0; i < changes->nelts; ++i)
- {
- change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
-
- SVN_ERR(fold_change(changed_paths, change, copyfrom_cache));
-
- /* Now, if our change was a deletion or replacement, we have to
- blow away any changes thus far on paths that are (or, were)
- children of this path.
- ### i won't bother with another iteration pool here -- at
- most we talking about a few extra dups of paths into what
- is already a temporary subpool.
- */
-
- if (((change->kind == svn_fs_path_change_delete)
- || (change->kind == svn_fs_path_change_replace))
- && ! prefolded)
- {
- apr_hash_index_t *hi;
-
- /* a potential child path must contain at least 2 more chars
- (the path separator plus at least one char for the name).
- Also, we should not assume that all paths have been normalized
- i.e. some might have trailing path separators.
- */
- apr_ssize_t change_path_len = strlen(change->path);
- apr_ssize_t min_child_len = change_path_len == 0
- ? 1
- : change->path[change_path_len-1] == '/'
- ? change_path_len + 1
- : change_path_len + 2;
-
- /* CAUTION: This is the inner loop of an O(n^2) algorithm.
- The number of changes to process may be >> 1000.
- Therefore, keep the inner loop as tight as possible.
- */
- for (hi = apr_hash_first(iterpool, changed_paths);
- hi;
- hi = apr_hash_next(hi))
- {
- /* KEY is the path. */
- const void *path;
- apr_ssize_t klen;
- apr_hash_this(hi, &path, &klen, NULL);
-
- /* If we come across a child of our path, remove it.
- Call svn_dirent_is_child only if there is a chance that
- this is actually a sub-path.
- */
- if ( klen >= min_child_len
- && svn_dirent_is_child(change->path, path, iterpool))
- apr_hash_set(changed_paths, path, klen, NULL);
- }
- }
-
- /* Clear the per-iteration subpool. */
- svn_pool_clear(iterpool);
- }
-
- /* Destroy the per-iteration subpool. */
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Fetch all the changes from FILE and store them in *CHANGES. Do all
- allocations in POOL. */
-static svn_error_t *
-read_all_changes(apr_array_header_t **changes,
- apr_file_t *file,
- apr_pool_t *pool)
-{
- change_t *change;
-
- /* pre-allocate enough room for most change lists
- (will be auto-expanded as necessary) */
- *changes = apr_array_make(pool, 30, sizeof(change_t *));
-
- SVN_ERR(read_change(&change, file, pool));
- while (change)
- {
- APR_ARRAY_PUSH(*changes, change_t*) = change;
- SVN_ERR(read_change(&change, file, pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__txn_changes_fetch(apr_hash_t **changed_paths_p,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- apr_file_t *file;
- apr_hash_t *changed_paths = apr_hash_make(pool);
- apr_array_header_t *changes;
- apr_pool_t *scratch_pool = svn_pool_create(pool);
-
- SVN_ERR(svn_io_file_open(&file, path_txn_changes(fs, txn_id, pool),
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- SVN_ERR(read_all_changes(&changes, file, scratch_pool));
- SVN_ERR(process_changes(changed_paths, NULL, changes, FALSE, pool));
- svn_pool_destroy(scratch_pool);
-
- SVN_ERR(svn_io_file_close(file, pool));
-
- *changed_paths_p = changed_paths;
-
- return SVN_NO_ERROR;
-}
-
-/* Fetch the list of change in revision REV in FS and return it in *CHANGES.
- * Allocate the result in POOL.
- */
-static svn_error_t *
-get_changes(apr_array_header_t **changes,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- apr_off_t changes_offset;
- apr_file_t *revision_file;
- svn_boolean_t found;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* try cache lookup first */
-
- if (ffd->changes_cache)
- {
- SVN_ERR(svn_cache__get((void **) changes, &found, ffd->changes_cache,
- &rev, pool));
- if (found)
- return SVN_NO_ERROR;
- }
-
- /* read changes from revision file */
-
- SVN_ERR(ensure_revision_exists(fs, rev, pool));
-
- SVN_ERR(open_pack_or_rev_file(&revision_file, fs, rev, pool));
-
- SVN_ERR(get_root_changes_offset(NULL, &changes_offset, revision_file, fs,
- rev, pool));
-
- SVN_ERR(svn_io_file_seek(revision_file, APR_SET, &changes_offset, pool));
- SVN_ERR(read_all_changes(changes, revision_file, pool));
-
- SVN_ERR(svn_io_file_close(revision_file, pool));
-
- /* cache for future reference */
-
- if (ffd->changes_cache)
- SVN_ERR(svn_cache__set(ffd->changes_cache, &rev, *changes, pool));
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_fs_fs__paths_changed(apr_hash_t **changed_paths_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_hash_t *copyfrom_cache,
- apr_pool_t *pool)
-{
- apr_hash_t *changed_paths;
- apr_array_header_t *changes;
- apr_pool_t *scratch_pool = svn_pool_create(pool);
-
- SVN_ERR(get_changes(&changes, fs, rev, scratch_pool));
-
- changed_paths = svn_hash__make(pool);
-
- SVN_ERR(process_changes(changed_paths, copyfrom_cache, changes,
- TRUE, pool));
- svn_pool_destroy(scratch_pool);
- *changed_paths_p = changed_paths;
-
- return SVN_NO_ERROR;
-}
-
-/* Copy a revision node-rev SRC into the current transaction TXN_ID in
- the filesystem FS. This is only used to create the root of a transaction.
- Allocations are from POOL. */
-static svn_error_t *
-create_new_txn_noderev_from_rev(svn_fs_t *fs,
- const char *txn_id,
- svn_fs_id_t *src,
- apr_pool_t *pool)
-{
- node_revision_t *noderev;
- const char *node_id, *copy_id;
-
- SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, src, pool));
-
- if (svn_fs_fs__id_txn_id(noderev->id))
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Copying from transactions not allowed"));
-
- noderev->predecessor_id = noderev->id;
- noderev->predecessor_count++;
- noderev->copyfrom_path = NULL;
- noderev->copyfrom_rev = SVN_INVALID_REVNUM;
-
- /* For the transaction root, the copyroot never changes. */
-
- node_id = svn_fs_fs__id_node_id(noderev->id);
- copy_id = svn_fs_fs__id_copy_id(noderev->id);
- noderev->id = svn_fs_fs__id_txn_create(node_id, copy_id, txn_id, pool);
-
- return svn_fs_fs__put_node_revision(fs, noderev->id, noderev, TRUE, pool);
-}
-
-/* A structure used by get_and_increment_txn_key_body(). */
-struct get_and_increment_txn_key_baton {
- svn_fs_t *fs;
- char *txn_id;
- apr_pool_t *pool;
-};
-
-/* Callback used in the implementation of create_txn_dir(). This gets
- the current base 36 value in PATH_TXN_CURRENT and increments it.
- It returns the original value by the baton. */
-static svn_error_t *
-get_and_increment_txn_key_body(void *baton, apr_pool_t *pool)
-{
- struct get_and_increment_txn_key_baton *cb = baton;
- const char *txn_current_filename = path_txn_current(cb->fs, pool);
- const char *tmp_filename;
- char next_txn_id[MAX_KEY_SIZE+3];
- apr_size_t len;
-
- svn_stringbuf_t *buf;
- SVN_ERR(read_content(&buf, txn_current_filename, cb->pool));
-
- /* remove trailing newlines */
- svn_stringbuf_strip_whitespace(buf);
- cb->txn_id = buf->data;
- len = buf->len;
-
- /* Increment the key and add a trailing \n to the string so the
- txn-current file has a newline in it. */
- svn_fs_fs__next_key(cb->txn_id, &len, next_txn_id);
- next_txn_id[len] = '\n';
- ++len;
- next_txn_id[len] = '\0';
-
- SVN_ERR(svn_io_write_unique(&tmp_filename,
- svn_dirent_dirname(txn_current_filename, pool),
- next_txn_id, len, svn_io_file_del_none, pool));
- SVN_ERR(move_into_place(tmp_filename, txn_current_filename,
- txn_current_filename, pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Create a unique directory for a transaction in FS based on revision
- REV. Return the ID for this transaction in *ID_P. Use a sequence
- value in the transaction ID to prevent reuse of transaction IDs. */
-static svn_error_t *
-create_txn_dir(const char **id_p, svn_fs_t *fs, svn_revnum_t rev,
- apr_pool_t *pool)
-{
- struct get_and_increment_txn_key_baton cb;
- const char *txn_dir;
-
- /* Get the current transaction sequence value, which is a base-36
- number, from the txn-current file, and write an
- incremented value back out to the file. Place the revision
- number the transaction is based off into the transaction id. */
- cb.pool = pool;
- cb.fs = fs;
- SVN_ERR(with_txn_current_lock(fs,
- get_and_increment_txn_key_body,
- &cb,
- pool));
- *id_p = apr_psprintf(pool, "%ld-%s", rev, cb.txn_id);
-
- txn_dir = svn_dirent_join_many(pool,
- fs->path,
- PATH_TXNS_DIR,
- apr_pstrcat(pool, *id_p, PATH_EXT_TXN,
- (char *)NULL),
- NULL);
-
- return svn_io_dir_make(txn_dir, APR_OS_DEFAULT, pool);
-}
-
-/* Create a unique directory for a transaction in FS based on revision
- REV. Return the ID for this transaction in *ID_P. This
- implementation is used in svn 1.4 and earlier repositories and is
- kept in 1.5 and greater to support the --pre-1.4-compatible and
- --pre-1.5-compatible repository creation options. Reused
- transaction IDs are possible with this implementation. */
-static svn_error_t *
-create_txn_dir_pre_1_5(const char **id_p, svn_fs_t *fs, svn_revnum_t rev,
- apr_pool_t *pool)
-{
- unsigned int i;
- apr_pool_t *subpool;
- const char *unique_path, *prefix;
-
- /* Try to create directories named "<txndir>/<rev>-<uniqueifier>.txn". */
- prefix = svn_dirent_join_many(pool, fs->path, PATH_TXNS_DIR,
- apr_psprintf(pool, "%ld", rev), NULL);
-
- subpool = svn_pool_create(pool);
- for (i = 1; i <= 99999; i++)
- {
- svn_error_t *err;
-
- svn_pool_clear(subpool);
- unique_path = apr_psprintf(subpool, "%s-%u" PATH_EXT_TXN, prefix, i);
- err = svn_io_dir_make(unique_path, APR_OS_DEFAULT, subpool);
- if (! err)
+ /* Paranoia. Compare SHA1 checksums because that's the level of
+ confidence we require for e.g. the working copy. */
+ if (rep_a->has_sha1 && rep_b->has_sha1)
{
- /* We succeeded. Return the basename minus the ".txn" extension. */
- const char *name = svn_dirent_basename(unique_path, subpool);
- *id_p = apr_pstrndup(pool, name,
- strlen(name) - strlen(PATH_EXT_TXN));
- svn_pool_destroy(subpool);
+ *equal = memcmp(rep_a->sha1_digest, rep_b->sha1_digest,
+ sizeof(rep_a->sha1_digest)) == 0;
return SVN_NO_ERROR;
}
- if (! APR_STATUS_IS_EEXIST(err->apr_err))
- return svn_error_trace(err);
- svn_error_clear(err);
}
- return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED,
- NULL,
- _("Unable to create transaction directory "
- "in '%s' for revision %ld"),
- svn_dirent_local_style(fs->path, pool),
- rev);
-}
-
-svn_error_t *
-svn_fs_fs__create_txn(svn_fs_txn_t **txn_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_fs_txn_t *txn;
- svn_fs_id_t *root_id;
-
- txn = apr_pcalloc(pool, sizeof(*txn));
-
- /* Get the txn_id. */
- if (ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
- SVN_ERR(create_txn_dir(&txn->id, fs, rev, pool));
- else
- SVN_ERR(create_txn_dir_pre_1_5(&txn->id, fs, rev, pool));
-
- txn->fs = fs;
- txn->base_rev = rev;
-
- txn->vtable = &txn_vtable;
- *txn_p = txn;
-
- /* Create a new root node for this transaction. */
- SVN_ERR(svn_fs_fs__rev_get_root(&root_id, fs, rev, pool));
- SVN_ERR(create_new_txn_noderev_from_rev(fs, txn->id, root_id, pool));
-
- /* Create an empty rev file. */
- SVN_ERR(svn_io_file_create(path_txn_proto_rev(fs, txn->id, pool), "",
- pool));
-
- /* Create an empty rev-lock file. */
- SVN_ERR(svn_io_file_create(path_txn_proto_rev_lock(fs, txn->id, pool), "",
- pool));
-
- /* Create an empty changes file. */
- SVN_ERR(svn_io_file_create(path_txn_changes(fs, txn->id, pool), "",
- pool));
-
- /* Create the next-ids file. */
- return svn_io_file_create(path_txn_next_ids(fs, txn->id, pool), "0 0\n",
- pool);
-}
-
-/* Store the property list for transaction TXN_ID in PROPLIST.
- Perform temporary allocations in POOL. */
-static svn_error_t *
-get_txn_proplist(apr_hash_t *proplist,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- svn_stream_t *stream;
-
- /* Check for issue #3696. (When we find and fix the cause, we can change
- * this to an assertion.) */
- if (txn_id == NULL)
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Internal error: a null transaction id was "
- "passed to get_txn_proplist()"));
-
- /* Open the transaction properties file. */
- SVN_ERR(svn_stream_open_readonly(&stream, path_txn_props(fs, txn_id, pool),
- pool, pool));
-
- /* Read in the property list. */
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
-
- return svn_stream_close(stream);
-}
-
-svn_error_t *
-svn_fs_fs__change_txn_prop(svn_fs_txn_t *txn,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool)
-{
- apr_array_header_t *props = apr_array_make(pool, 1, sizeof(svn_prop_t));
- svn_prop_t prop;
-
- prop.name = name;
- prop.value = value;
- APR_ARRAY_PUSH(props, svn_prop_t) = prop;
-
- return svn_fs_fs__change_txn_props(txn, props, pool);
-}
-
-svn_error_t *
-svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
- const apr_array_header_t *props,
- apr_pool_t *pool)
-{
- const char *txn_prop_filename;
- svn_stringbuf_t *buf;
- svn_stream_t *stream;
- apr_hash_t *txn_prop = apr_hash_make(pool);
- int i;
- svn_error_t *err;
-
- err = get_txn_proplist(txn_prop, txn->fs, txn->id, pool);
- /* Here - and here only - we need to deal with the possibility that the
- transaction property file doesn't yet exist. The rest of the
- implementation assumes that the file exists, but we're called to set the
- initial transaction properties as the transaction is being created. */
- if (err && (APR_STATUS_IS_ENOENT(err->apr_err)))
- svn_error_clear(err);
- else if (err)
- return svn_error_trace(err);
-
- for (i = 0; i < props->nelts; i++)
- {
- svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
-
- svn_hash_sets(txn_prop, prop->name, prop->value);
- }
-
- /* Create a new version of the file and write out the new props. */
- /* Open the transaction properties file. */
- buf = svn_stringbuf_create_ensure(1024, pool);
- stream = svn_stream_from_stringbuf(buf, pool);
- SVN_ERR(svn_hash_write2(txn_prop, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
- SVN_ERR(svn_io_write_unique(&txn_prop_filename,
- path_txn_dir(txn->fs, txn->id, pool),
- buf->data,
- buf->len,
- svn_io_file_del_none,
- pool));
- return svn_io_file_rename(txn_prop_filename,
- path_txn_props(txn->fs, txn->id, pool),
- pool);
-}
-
-svn_error_t *
-svn_fs_fs__get_txn(transaction_t **txn_p,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- transaction_t *txn;
- node_revision_t *noderev;
- svn_fs_id_t *root_id;
-
- txn = apr_pcalloc(pool, sizeof(*txn));
- txn->proplist = apr_hash_make(pool);
-
- SVN_ERR(get_txn_proplist(txn->proplist, fs, txn_id, pool));
- root_id = svn_fs_fs__id_txn_create("0", "0", txn_id, pool);
-
- SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, root_id, pool));
-
- txn->root_id = svn_fs_fs__id_copy(noderev->id, pool);
- txn->base_id = svn_fs_fs__id_copy(noderev->predecessor_id, pool);
- txn->copies = NULL;
-
- *txn_p = txn;
-
- return SVN_NO_ERROR;
-}
-
-/* Write out the currently available next node_id NODE_ID and copy_id
- COPY_ID for transaction TXN_ID in filesystem FS. The next node-id is
- used both for creating new unique nodes for the given transaction, as
- well as uniquifying representations. Perform temporary allocations in
- POOL. */
-static svn_error_t *
-write_next_ids(svn_fs_t *fs,
- const char *txn_id,
- const char *node_id,
- const char *copy_id,
- apr_pool_t *pool)
-{
- apr_file_t *file;
- svn_stream_t *out_stream;
-
- SVN_ERR(svn_io_file_open(&file, path_txn_next_ids(fs, txn_id, pool),
- APR_WRITE | APR_TRUNCATE,
- APR_OS_DEFAULT, pool));
-
- out_stream = svn_stream_from_aprfile2(file, TRUE, pool);
-
- SVN_ERR(svn_stream_printf(out_stream, pool, "%s %s\n", node_id, copy_id));
-
- SVN_ERR(svn_stream_close(out_stream));
- return svn_io_file_close(file, pool);
-}
-
-/* Find out what the next unique node-id and copy-id are for
- transaction TXN_ID in filesystem FS. Store the results in *NODE_ID
- and *COPY_ID. The next node-id is used both for creating new unique
- nodes for the given transaction, as well as uniquifying representations.
- Perform all allocations in POOL. */
-static svn_error_t *
-read_next_ids(const char **node_id,
- const char **copy_id,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- apr_file_t *file;
- char buf[MAX_KEY_SIZE*2+3];
- apr_size_t limit;
- char *str, *last_str = buf;
-
- SVN_ERR(svn_io_file_open(&file, path_txn_next_ids(fs, txn_id, pool),
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- limit = sizeof(buf);
- SVN_ERR(svn_io_read_length_line(file, buf, &limit, pool));
-
- SVN_ERR(svn_io_file_close(file, pool));
-
- /* Parse this into two separate strings. */
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("next-id file corrupt"));
-
- *node_id = apr_pstrdup(pool, str);
-
- str = svn_cstring_tokenize(" ", &last_str);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("next-id file corrupt"));
-
- *copy_id = apr_pstrdup(pool, str);
-
- return SVN_NO_ERROR;
-}
-
-/* Get a new and unique to this transaction node-id for transaction
- TXN_ID in filesystem FS. Store the new node-id in *NODE_ID_P.
- Node-ids are guaranteed to be unique to this transction, but may
- not necessarily be sequential. Perform all allocations in POOL. */
-static svn_error_t *
-get_new_txn_node_id(const char **node_id_p,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- const char *cur_node_id, *cur_copy_id;
- char *node_id;
- apr_size_t len;
-
- /* First read in the current next-ids file. */
- SVN_ERR(read_next_ids(&cur_node_id, &cur_copy_id, fs, txn_id, pool));
-
- node_id = apr_pcalloc(pool, strlen(cur_node_id) + 2);
-
- len = strlen(cur_node_id);
- svn_fs_fs__next_key(cur_node_id, &len, node_id);
-
- SVN_ERR(write_next_ids(fs, txn_id, node_id, cur_copy_id, pool));
-
- *node_id_p = apr_pstrcat(pool, "_", cur_node_id, (char *)NULL);
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__create_node(const svn_fs_id_t **id_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- const char *copy_id,
- const char *txn_id,
- apr_pool_t *pool)
-{
- const char *node_id;
- const svn_fs_id_t *id;
-
- /* Get a new node-id for this node. */
- SVN_ERR(get_new_txn_node_id(&node_id, fs, txn_id, pool));
-
- id = svn_fs_fs__id_txn_create(node_id, copy_id, txn_id, pool);
-
- noderev->id = id;
-
- SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE, pool));
-
- *id_p = id;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__purge_txn(svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* Remove the shared transaction object associated with this transaction. */
- SVN_ERR(purge_shared_txn(fs, txn_id, pool));
- /* Remove the directory associated with this transaction. */
- SVN_ERR(svn_io_remove_dir2(path_txn_dir(fs, txn_id, pool), FALSE,
- NULL, NULL, pool));
- if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
- {
- /* Delete protorev and its lock, which aren't in the txn
- directory. It's OK if they don't exist (for example, if this
- is post-commit and the proto-rev has been moved into
- place). */
- SVN_ERR(svn_io_remove_file2(path_txn_proto_rev(fs, txn_id, pool),
- TRUE, pool));
- SVN_ERR(svn_io_remove_file2(path_txn_proto_rev_lock(fs, txn_id, pool),
- TRUE, pool));
- }
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_fs_fs__abort_txn(svn_fs_txn_t *txn,
- apr_pool_t *pool)
-{
- SVN_ERR(svn_fs__check_fs(txn->fs, TRUE));
-
- /* Now, purge the transaction. */
- SVN_ERR_W(svn_fs_fs__purge_txn(txn->fs, txn->id, pool),
- apr_psprintf(pool, _("Transaction '%s' cleanup failed"),
- txn->id));
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_fs_fs__set_entry(svn_fs_t *fs,
- const char *txn_id,
- node_revision_t *parent_noderev,
- const char *name,
- const svn_fs_id_t *id,
- svn_node_kind_t kind,
- apr_pool_t *pool)
-{
- representation_t *rep = parent_noderev->data_rep;
- const char *filename = path_txn_node_children(fs, parent_noderev->id, pool);
- apr_file_t *file;
- svn_stream_t *out;
- fs_fs_data_t *ffd = fs->fsap_data;
- apr_pool_t *subpool = svn_pool_create(pool);
-
- if (!rep || !rep->txn_id)
- {
- const char *unique_suffix;
- apr_hash_t *entries;
-
- /* Before we can modify the directory, we need to dump its old
- contents into a mutable representation file. */
- SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, parent_noderev,
- subpool));
- SVN_ERR(unparse_dir_entries(&entries, entries, subpool));
- SVN_ERR(svn_io_file_open(&file, filename,
- APR_WRITE | APR_CREATE | APR_BUFFERED,
- APR_OS_DEFAULT, pool));
- out = svn_stream_from_aprfile2(file, TRUE, pool);
- SVN_ERR(svn_hash_write2(entries, out, SVN_HASH_TERMINATOR, subpool));
-
- svn_pool_clear(subpool);
-
- /* Mark the node-rev's data rep as mutable. */
- rep = apr_pcalloc(pool, sizeof(*rep));
- rep->revision = SVN_INVALID_REVNUM;
- rep->txn_id = txn_id;
-
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
- {
- SVN_ERR(get_new_txn_node_id(&unique_suffix, fs, txn_id, pool));
- rep->uniquifier = apr_psprintf(pool, "%s/%s", txn_id, unique_suffix);
- }
-
- parent_noderev->data_rep = rep;
- SVN_ERR(svn_fs_fs__put_node_revision(fs, parent_noderev->id,
- parent_noderev, FALSE, pool));
- }
- else
- {
- /* The directory rep is already mutable, so just open it for append. */
- SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_APPEND,
- APR_OS_DEFAULT, pool));
- out = svn_stream_from_aprfile2(file, TRUE, pool);
- }
-
- /* if we have a directory cache for this transaction, update it */
- if (ffd->txn_dir_cache)
- {
- /* build parameters: (name, new entry) pair */
- const char *key =
- svn_fs_fs__id_unparse(parent_noderev->id, subpool)->data;
- replace_baton_t baton;
-
- baton.name = name;
- baton.new_entry = NULL;
-
- if (id)
- {
- baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
- baton.new_entry->name = name;
- baton.new_entry->kind = kind;
- baton.new_entry->id = id;
- }
-
- /* actually update the cached directory (if cached) */
- SVN_ERR(svn_cache__set_partial(ffd->txn_dir_cache, key,
- svn_fs_fs__replace_dir_entry, &baton,
- subpool));
- }
- svn_pool_clear(subpool);
-
- /* Append an incremental hash entry for the entry change. */
- if (id)
- {
- const char *val = unparse_dir_entry(kind, id, subpool);
-
- SVN_ERR(svn_stream_printf(out, subpool, "K %" APR_SIZE_T_FMT "\n%s\n"
- "V %" APR_SIZE_T_FMT "\n%s\n",
- strlen(name), name,
- strlen(val), val));
- }
- else
- {
- SVN_ERR(svn_stream_printf(out, subpool, "D %" APR_SIZE_T_FMT "\n%s\n",
- strlen(name), name));
- }
+ SVN_ERR(svn_fs_fs__get_contents(&contents_a, fs, rep_a, TRUE,
+ scratch_pool));
+ SVN_ERR(svn_fs_fs__get_contents(&contents_b, fs, rep_b, TRUE,
+ scratch_pool));
+ SVN_ERR(svn_stream_contents_same2(equal, contents_a, contents_b,
+ scratch_pool));
- SVN_ERR(svn_io_file_close(file, subpool));
- svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
-/* Write a single change entry, path PATH, change CHANGE, and copyfrom
- string COPYFROM, into the file specified by FILE. Only include the
- node kind field if INCLUDE_NODE_KIND is true. All temporary
- allocations are in POOL. */
-static svn_error_t *
-write_change_entry(apr_file_t *file,
- const char *path,
- svn_fs_path_change2_t *change,
- svn_boolean_t include_node_kind,
- apr_pool_t *pool)
-{
- const char *idstr, *buf;
- const char *change_string = NULL;
- const char *kind_string = "";
-
- switch (change->change_kind)
- {
- case svn_fs_path_change_modify:
- change_string = ACTION_MODIFY;
- break;
- case svn_fs_path_change_add:
- change_string = ACTION_ADD;
- break;
- case svn_fs_path_change_delete:
- change_string = ACTION_DELETE;
- break;
- case svn_fs_path_change_replace:
- change_string = ACTION_REPLACE;
- break;
- case svn_fs_path_change_reset:
- change_string = ACTION_RESET;
- break;
- default:
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Invalid change type %d"),
- change->change_kind);
- }
-
- if (change->node_rev_id)
- idstr = svn_fs_fs__id_unparse(change->node_rev_id, pool)->data;
- else
- idstr = ACTION_RESET;
-
- if (include_node_kind)
- {
- SVN_ERR_ASSERT(change->node_kind == svn_node_dir
- || change->node_kind == svn_node_file);
- kind_string = apr_psprintf(pool, "-%s",
- change->node_kind == svn_node_dir
- ? KIND_DIR : KIND_FILE);
- }
- buf = apr_psprintf(pool, "%s %s%s %s %s %s\n",
- idstr, change_string, kind_string,
- change->text_mod ? FLAG_TRUE : FLAG_FALSE,
- change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
- path);
-
- SVN_ERR(svn_io_file_write_full(file, buf, strlen(buf), NULL, pool));
-
- if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
- {
- buf = apr_psprintf(pool, "%ld %s", change->copyfrom_rev,
- change->copyfrom_path);
- SVN_ERR(svn_io_file_write_full(file, buf, strlen(buf), NULL, pool));
- }
-
- return svn_io_file_write_full(file, "\n", 1, NULL, pool);
-}
-
svn_error_t *
-svn_fs_fs__add_change(svn_fs_t *fs,
- const char *txn_id,
- const char *path,
- const svn_fs_id_t *id,
- svn_fs_path_change_kind_t change_kind,
- svn_boolean_t text_mod,
- svn_boolean_t prop_mod,
- svn_node_kind_t node_kind,
- svn_revnum_t copyfrom_rev,
- const char *copyfrom_path,
- apr_pool_t *pool)
-{
- apr_file_t *file;
- svn_fs_path_change2_t *change;
-
- SVN_ERR(svn_io_file_open(&file, path_txn_changes(fs, txn_id, pool),
- APR_APPEND | APR_WRITE | APR_CREATE
- | APR_BUFFERED, APR_OS_DEFAULT, pool));
-
- change = svn_fs__path_change_create_internal(id, change_kind, pool);
- change->text_mod = text_mod;
- change->prop_mod = prop_mod;
- change->node_kind = node_kind;
- change->copyfrom_rev = copyfrom_rev;
- change->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
-
- SVN_ERR(write_change_entry(file, path, change, TRUE, pool));
-
- return svn_io_file_close(file, pool);
-}
-
-/* This baton is used by the representation writing streams. It keeps
- track of the checksum information as well as the total size of the
- representation so far. */
-struct rep_write_baton
-{
- /* The FS we are writing to. */
- svn_fs_t *fs;
-
- /* Actual file to which we are writing. */
- svn_stream_t *rep_stream;
-
- /* A stream from the delta combiner. Data written here gets
- deltified, then eventually written to rep_stream. */
- svn_stream_t *delta_stream;
-
- /* Where is this representation header stored. */
- apr_off_t rep_offset;
-
- /* Start of the actual data. */
- apr_off_t delta_start;
-
- /* How many bytes have been written to this rep already. */
- svn_filesize_t rep_size;
-
- /* The node revision for which we're writing out info. */
- node_revision_t *noderev;
-
- /* Actual output file. */
- apr_file_t *file;
- /* Lock 'cookie' used to unlock the output file once we've finished
- writing to it. */
- void *lockcookie;
-
- svn_checksum_ctx_t *md5_checksum_ctx;
- svn_checksum_ctx_t *sha1_checksum_ctx;
-
- apr_pool_t *pool;
-
- apr_pool_t *parent_pool;
-};
-
-/* Handler for the write method of the representation writable stream.
- BATON is a rep_write_baton, DATA is the data to write, and *LEN is
- the length of this data. */
-static svn_error_t *
-rep_write_contents(void *baton,
- const char *data,
- apr_size_t *len)
-{
- struct rep_write_baton *b = baton;
-
- SVN_ERR(svn_checksum_update(b->md5_checksum_ctx, data, *len));
- SVN_ERR(svn_checksum_update(b->sha1_checksum_ctx, data, *len));
- b->rep_size += *len;
-
- /* If we are writing a delta, use that stream. */
- if (b->delta_stream)
- return svn_stream_write(b->delta_stream, data, len);
- else
- return svn_stream_write(b->rep_stream, data, len);
-}
-
-/* Given a node-revision NODEREV in filesystem FS, return the
- representation in *REP to use as the base for a text representation
- delta if PROPS is FALSE. If PROPS has been set, a suitable props
- base representation will be returned. Perform temporary allocations
- in *POOL. */
-static svn_error_t *
-choose_delta_base(representation_t **rep,
- svn_fs_t *fs,
- node_revision_t *noderev,
- svn_boolean_t props,
- apr_pool_t *pool)
+svn_fs_fs__prop_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ node_revision_t *a,
+ node_revision_t *b,
+ apr_pool_t *scratch_pool)
{
- int count;
- int walk;
- node_revision_t *base;
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_boolean_t maybe_shared_rep = FALSE;
+ representation_t *rep_a = a->prop_rep;
+ representation_t *rep_b = b->prop_rep;
+ apr_hash_t *proplist_a;
+ apr_hash_t *proplist_b;
- /* If we have no predecessors, then use the empty stream as a
- base. */
- if (! noderev->predecessor_count)
+ /* Mainly for a==b==NULL */
+ if (rep_a == rep_b)
{
- *rep = NULL;
+ *equal = TRUE;
return SVN_NO_ERROR;
}
- /* Flip the rightmost '1' bit of the predecessor count to determine
- which file rev (counting from 0) we want to use. (To see why
- count & (count - 1) unsets the rightmost set bit, think about how
- you decrement a binary number.) */
- count = noderev->predecessor_count;
- count = count & (count - 1);
-
- /* We use skip delta for limiting the number of delta operations
- along very long node histories. Close to HEAD however, we create
- a linear history to minimize delta size. */
- walk = noderev->predecessor_count - count;
- if (walk < (int)ffd->max_linear_deltification)
- count = noderev->predecessor_count - 1;
-
- /* Finding the delta base over a very long distance can become extremely
- expensive for very deep histories, possibly causing client timeouts etc.
- OTOH, this is a rare operation and its gains are minimal. Lets simply
- start deltification anew close every other 1000 changes or so. */
- if (walk > (int)ffd->max_deltification_walk)
+ /* Committed property lists can be compared quickly */
+ if ( rep_a && rep_b
+ && !svn_fs_fs__id_txn_used(&rep_a->txn_id)
+ && !svn_fs_fs__id_txn_used(&rep_b->txn_id))
{
- *rep = NULL;
+ /* MD5 must be given. Having the same checksum is good enough for
+ accepting the prop lists as equal. */
+ *equal = memcmp(rep_a->md5_digest, rep_b->md5_digest,
+ sizeof(rep_a->md5_digest)) == 0;
return SVN_NO_ERROR;
}
- /* Walk back a number of predecessors equal to the difference
- between count and the original predecessor count. (For example,
- if noderev has ten predecessors and we want the eighth file rev,
- walk back two predecessors.) */
- base = noderev;
- while ((count++) < noderev->predecessor_count)
- {
- SVN_ERR(svn_fs_fs__get_node_revision(&base, fs,
- base->predecessor_id, pool));
-
- /* If there is a shared rep along the way, we need to limit the
- * length of the deltification chain.
- *
- * Please note that copied nodes - such as branch directories - will
- * look the same (false positive) while reps shared within the same
- * revision will not be caught (false negative).
- */
- if (props)
- {
- if ( base->prop_rep
- && svn_fs_fs__id_rev(base->id) > base->prop_rep->revision)
- maybe_shared_rep = TRUE;
- }
- else
- {
- if ( base->data_rep
- && svn_fs_fs__id_rev(base->id) > base->data_rep->revision)
- maybe_shared_rep = TRUE;
- }
- }
-
- /* return a suitable base representation */
- *rep = props ? base->prop_rep : base->data_rep;
-
- /* if we encountered a shared rep, it's parent chain may be different
- * from the node-rev parent chain. */
- if (*rep && maybe_shared_rep)
+ /* Same path in same txn? */
+ if (svn_fs_fs__id_eq(a->id, b->id))
{
- /* Check whether the length of the deltification chain is acceptable.
- * Otherwise, shared reps may form a non-skipping delta chain in
- * extreme cases. */
- apr_pool_t *sub_pool = svn_pool_create(pool);
- representation_t base_rep = **rep;
-
- /* Some reasonable limit, depending on how acceptable longer linear
- * chains are in this repo. Also, allow for some minimal chain. */
- int max_chain_length = 2 * (int)ffd->max_linear_deltification + 2;
-
- /* re-use open files between iterations */
- svn_revnum_t rev_hint = SVN_INVALID_REVNUM;
- apr_file_t *file_hint = NULL;
-
- /* follow the delta chain towards the end but for at most
- * MAX_CHAIN_LENGTH steps. */
- for (; max_chain_length; --max_chain_length)
- {
- struct rep_state *rep_state;
- struct rep_args *rep_args;
-
- SVN_ERR(create_rep_state_body(&rep_state,
- &rep_args,
- &file_hint,
- &rev_hint,
- &base_rep,
- fs,
- sub_pool));
- if (!rep_args->is_delta || !rep_args->base_revision)
- break;
-
- base_rep.revision = rep_args->base_revision;
- base_rep.offset = rep_args->base_offset;
- base_rep.size = rep_args->base_length;
- base_rep.txn_id = NULL;
- }
-
- /* start new delta chain if the current one has grown too long */
- if (max_chain_length == 0)
- *rep = NULL;
-
- svn_pool_destroy(sub_pool);
- }
-
- /* verify that the reps don't form a degenerated '*/
- return SVN_NO_ERROR;
-}
-
-/* Something went wrong and the pool for the rep write is being
- cleared before we've finished writing the rep. So we need
- to remove the rep from the protorevfile and we need to unlock
- the protorevfile. */
-static apr_status_t
-rep_write_cleanup(void *data)
-{
- struct rep_write_baton *b = data;
- const char *txn_id = svn_fs_fs__id_txn_id(b->noderev->id);
- svn_error_t *err;
-
- /* Truncate and close the protorevfile. */
- err = svn_io_file_trunc(b->file, b->rep_offset, b->pool);
- err = svn_error_compose_create(err, svn_io_file_close(b->file, b->pool));
-
- /* Remove our lock regardless of any preceeding errors so that the
- being_written flag is always removed and stays consistent with the
- file lock which will be removed no matter what since the pool is
- going away. */
- err = svn_error_compose_create(err, unlock_proto_rev(b->fs, txn_id,
- b->lockcookie, b->pool));
- if (err)
- {
- apr_status_t rc = err->apr_err;
- svn_error_clear(err);
- return rc;
- }
-
- return APR_SUCCESS;
-}
-
-
-/* Get a rep_write_baton and store it in *WB_P for the representation
- indicated by NODEREV in filesystem FS. Perform allocations in
- POOL. Only appropriate for file contents, not for props or
- directory contents. */
-static svn_error_t *
-rep_write_get_baton(struct rep_write_baton **wb_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- struct rep_write_baton *b;
- apr_file_t *file;
- representation_t *base_rep;
- svn_stream_t *source;
- const char *header;
- svn_txdelta_window_handler_t wh;
- void *whb;
- fs_fs_data_t *ffd = fs->fsap_data;
- int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
-
- b = apr_pcalloc(pool, sizeof(*b));
-
- b->sha1_checksum_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
- b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
-
- b->fs = fs;
- b->parent_pool = pool;
- b->pool = svn_pool_create(pool);
- b->rep_size = 0;
- b->noderev = noderev;
-
- /* Open the prototype rev file and seek to its end. */
- SVN_ERR(get_writable_proto_rev(&file, &b->lockcookie,
- fs, svn_fs_fs__id_txn_id(noderev->id),
- b->pool));
-
- b->file = file;
- b->rep_stream = svn_stream_from_aprfile2(file, TRUE, b->pool);
-
- SVN_ERR(get_file_offset(&b->rep_offset, file, b->pool));
-
- /* Get the base for this delta. */
- SVN_ERR(choose_delta_base(&base_rep, fs, noderev, FALSE, b->pool));
- SVN_ERR(read_representation(&source, fs, base_rep, b->pool));
-
- /* Write out the rep header. */
- if (base_rep)
- {
- header = apr_psprintf(b->pool, REP_DELTA " %ld %" APR_OFF_T_FMT " %"
- SVN_FILESIZE_T_FMT "\n",
- base_rep->revision, base_rep->offset,
- base_rep->size);
- }
- else
- {
- header = REP_DELTA "\n";
- }
- SVN_ERR(svn_io_file_write_full(file, header, strlen(header), NULL,
- b->pool));
-
- /* Now determine the offset of the actual svndiff data. */
- SVN_ERR(get_file_offset(&b->delta_start, file, b->pool));
-
- /* Cleanup in case something goes wrong. */
- apr_pool_cleanup_register(b->pool, b, rep_write_cleanup,
- apr_pool_cleanup_null);
-
- /* Prepare to write the svndiff data. */
- svn_txdelta_to_svndiff3(&wh,
- &whb,
- b->rep_stream,
- diff_version,
- SVN_DELTA_COMPRESSION_LEVEL_DEFAULT,
- pool);
-
- b->delta_stream = svn_txdelta_target_push(wh, whb, source, b->pool);
-
- *wb_p = b;
-
- return SVN_NO_ERROR;
-}
-
-/* For the hash REP->SHA1, try to find an already existing representation
- in FS and return it in *OUT_REP. If no such representation exists or
- if rep sharing has been disabled for FS, NULL will be returned. Since
- there may be new duplicate representations within the same uncommitted
- revision, those can be passed in REPS_HASH (maps a sha1 digest onto
- representation_t*), otherwise pass in NULL for REPS_HASH.
- POOL will be used for allocations. The lifetime of the returned rep is
- limited by both, POOL and REP lifetime.
- */
-static svn_error_t *
-get_shared_rep(representation_t **old_rep,
- svn_fs_t *fs,
- representation_t *rep,
- apr_hash_t *reps_hash,
- apr_pool_t *pool)
-{
- svn_error_t *err;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* Return NULL, if rep sharing has been disabled. */
- *old_rep = NULL;
- if (!ffd->rep_sharing_allowed)
- return SVN_NO_ERROR;
-
- /* Check and see if we already have a representation somewhere that's
- identical to the one we just wrote out. Start with the hash lookup
- because it is cheepest. */
- if (reps_hash)
- *old_rep = apr_hash_get(reps_hash,
- rep->sha1_checksum->digest,
- APR_SHA1_DIGESTSIZE);
-
- /* If we haven't found anything yet, try harder and consult our DB. */
- if (*old_rep == NULL)
- {
- err = svn_fs_fs__get_rep_reference(old_rep, fs, rep->sha1_checksum,
- pool);
- /* ### Other error codes that we shouldn't mask out? */
- if (err == SVN_NO_ERROR)
- {
- if (*old_rep)
- SVN_ERR(verify_walker(*old_rep, NULL, fs, pool));
- }
- else if (err->apr_err == SVN_ERR_FS_CORRUPT
- || SVN_ERROR_IN_CATEGORY(err->apr_err,
- SVN_ERR_MALFUNC_CATEGORY_START))
- {
- /* Fatal error; don't mask it.
-
- In particular, this block is triggered when the rep-cache refers
- to revisions in the future. We signal that as a corruption situation
- since, once those revisions are less than youngest (because of more
- commits), the rep-cache would be invalid.
- */
- SVN_ERR(err);
- }
- else
- {
- /* Something's wrong with the rep-sharing index. We can continue
- without rep-sharing, but warn.
- */
- (fs->warning)(fs->warning_baton, err);
- svn_error_clear(err);
- *old_rep = NULL;
- }
- }
-
- /* look for intra-revision matches (usually data reps but not limited
- to them in case props happen to look like some data rep)
- */
- if (*old_rep == NULL && rep->txn_id)
- {
- svn_node_kind_t kind;
- const char *file_name
- = path_txn_sha1(fs, rep->txn_id, rep->sha1_checksum, pool);
-
- /* in our txn, is there a rep file named with the wanted SHA1?
- If so, read it and use that rep.
- */
- SVN_ERR(svn_io_check_path(file_name, &kind, pool));
- if (kind == svn_node_file)
- {
- svn_stringbuf_t *rep_string;
- SVN_ERR(svn_stringbuf_from_file2(&rep_string, file_name, pool));
- SVN_ERR(read_rep_offsets_body(old_rep, rep_string->data,
- rep->txn_id, FALSE, pool));
- }
- }
-
- /* Add information that is missing in the cached data. */
- if (*old_rep)
- {
- /* Use the old rep for this content. */
- (*old_rep)->md5_checksum = rep->md5_checksum;
- (*old_rep)->uniquifier = rep->uniquifier;
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Close handler for the representation write stream. BATON is a
- rep_write_baton. Writes out a new node-rev that correctly
- references the representation we just finished writing. */
-static svn_error_t *
-rep_write_contents_close(void *baton)
-{
- struct rep_write_baton *b = baton;
- const char *unique_suffix;
- representation_t *rep;
- representation_t *old_rep;
- apr_off_t offset;
- fs_fs_data_t *ffd = b->fs->fsap_data;
-
- rep = apr_pcalloc(b->parent_pool, sizeof(*rep));
- rep->offset = b->rep_offset;
-
- /* Close our delta stream so the last bits of svndiff are written
- out. */
- if (b->delta_stream)
- SVN_ERR(svn_stream_close(b->delta_stream));
-
- /* Determine the length of the svndiff data. */
- SVN_ERR(get_file_offset(&offset, b->file, b->pool));
- rep->size = offset - b->delta_start;
-
- /* Fill in the rest of the representation field. */
- rep->expanded_size = b->rep_size;
- rep->txn_id = svn_fs_fs__id_txn_id(b->noderev->id);
-
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
- {
- SVN_ERR(get_new_txn_node_id(&unique_suffix, b->fs, rep->txn_id, b->pool));
- rep->uniquifier = apr_psprintf(b->parent_pool, "%s/%s", rep->txn_id,
- unique_suffix);
- }
- rep->revision = SVN_INVALID_REVNUM;
-
- /* Finalize the checksum. */
- SVN_ERR(svn_checksum_final(&rep->md5_checksum, b->md5_checksum_ctx,
- b->parent_pool));
- SVN_ERR(svn_checksum_final(&rep->sha1_checksum, b->sha1_checksum_ctx,
- b->parent_pool));
-
- /* Check and see if we already have a representation somewhere that's
- identical to the one we just wrote out. */
- SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, NULL, b->parent_pool));
-
- if (old_rep)
- {
- /* We need to erase from the protorev the data we just wrote. */
- SVN_ERR(svn_io_file_trunc(b->file, b->rep_offset, b->pool));
-
- /* Use the old rep for this content. */
- b->noderev->data_rep = old_rep;
- }
- else
- {
- /* Write out our cosmetic end marker. */
- SVN_ERR(svn_stream_puts(b->rep_stream, "ENDREP\n"));
-
- b->noderev->data_rep = rep;
+ *equal = TRUE;
+ return SVN_NO_ERROR;
}
- /* Remove cleanup callback. */
- apr_pool_cleanup_kill(b->pool, b, rep_write_cleanup);
-
- /* Write out the new node-rev information. */
- SVN_ERR(svn_fs_fs__put_node_revision(b->fs, b->noderev->id, b->noderev, FALSE,
- b->pool));
- if (!old_rep)
- SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->pool));
-
- SVN_ERR(svn_io_file_close(b->file, b->pool));
- SVN_ERR(unlock_proto_rev(b->fs, rep->txn_id, b->lockcookie, b->pool));
- svn_pool_destroy(b->pool);
+ /* At least one of the reps has been modified in a txn.
+ Fetch and compare them. */
+ SVN_ERR(svn_fs_fs__get_proplist(&proplist_a, fs, a, scratch_pool));
+ SVN_ERR(svn_fs_fs__get_proplist(&proplist_b, fs, b, scratch_pool));
+ *equal = svn_fs__prop_lists_equal(proplist_a, proplist_b, scratch_pool);
return SVN_NO_ERROR;
}
-/* Store a writable stream in *CONTENTS_P that will receive all data
- written and store it as the file data representation referenced by
- NODEREV in filesystem FS. Perform temporary allocations in
- POOL. Only appropriate for file data, not props or directory
- contents. */
-static svn_error_t *
-set_representation(svn_stream_t **contents_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- struct rep_write_baton *wb;
-
- if (! svn_fs_fs__id_txn_id(noderev->id))
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Attempted to write to non-transaction '%s'"),
- svn_fs_fs__id_unparse(noderev->id, pool)->data);
-
- SVN_ERR(rep_write_get_baton(&wb, fs, noderev, pool));
-
- *contents_p = svn_stream_create(wb, pool);
- svn_stream_set_write(*contents_p, rep_write_contents);
- svn_stream_set_close(*contents_p, rep_write_contents_close);
-
- return SVN_NO_ERROR;
-}
svn_error_t *
-svn_fs_fs__set_contents(svn_stream_t **stream,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool)
-{
- if (noderev->kind != svn_node_file)
- return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
- _("Can't set text contents of a directory"));
-
- return set_representation(stream, fs, noderev, pool);
-}
-
-svn_error_t *
-svn_fs_fs__create_successor(const svn_fs_id_t **new_id_p,
- svn_fs_t *fs,
- const svn_fs_id_t *old_idp,
- node_revision_t *new_noderev,
- const char *copy_id,
- const char *txn_id,
- apr_pool_t *pool)
-{
- const svn_fs_id_t *id;
-
- if (! copy_id)
- copy_id = svn_fs_fs__id_copy_id(old_idp);
- id = svn_fs_fs__id_txn_create(svn_fs_fs__id_node_id(old_idp), copy_id,
- txn_id, pool);
-
- new_noderev->id = id;
-
- if (! new_noderev->copyroot_path)
- {
- new_noderev->copyroot_path = apr_pstrdup(pool,
- new_noderev->created_path);
- new_noderev->copyroot_rev = svn_fs_fs__id_rev(new_noderev->id);
- }
-
- SVN_ERR(svn_fs_fs__put_node_revision(fs, new_noderev->id, new_noderev, FALSE,
- pool));
-
- *new_id_p = id;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__set_proplist(svn_fs_t *fs,
- node_revision_t *noderev,
- apr_hash_t *proplist,
- apr_pool_t *pool)
-{
- const char *filename = path_txn_node_props(fs, noderev->id, pool);
- apr_file_t *file;
- svn_stream_t *out;
-
- /* Dump the property list to the mutable property file. */
- SVN_ERR(svn_io_file_open(&file, filename,
- APR_WRITE | APR_CREATE | APR_TRUNCATE
- | APR_BUFFERED, APR_OS_DEFAULT, pool));
- out = svn_stream_from_aprfile2(file, TRUE, pool);
- SVN_ERR(svn_hash_write2(proplist, out, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_io_file_close(file, pool));
-
- /* Mark the node-rev's prop rep as mutable, if not already done. */
- if (!noderev->prop_rep || !noderev->prop_rep->txn_id)
- {
- noderev->prop_rep = apr_pcalloc(pool, sizeof(*noderev->prop_rep));
- noderev->prop_rep->txn_id = svn_fs_fs__id_txn_id(noderev->id);
- SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE, pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Read the 'current' file for filesystem FS and store the next
- available node id in *NODE_ID, and the next available copy id in
- *COPY_ID. Allocations are performed from POOL. */
-static svn_error_t *
-get_next_revision_ids(const char **node_id,
- const char **copy_id,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- char *buf;
- char *str;
- svn_stringbuf_t *content;
-
- SVN_ERR(read_content(&content, svn_fs_fs__path_current(fs, pool), pool));
- buf = content->data;
-
- str = svn_cstring_tokenize(" ", &buf);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Corrupt 'current' file"));
-
- str = svn_cstring_tokenize(" ", &buf);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Corrupt 'current' file"));
-
- *node_id = apr_pstrdup(pool, str);
-
- str = svn_cstring_tokenize(" \n", &buf);
- if (! str)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Corrupt 'current' file"));
-
- *copy_id = apr_pstrdup(pool, str);
-
- return SVN_NO_ERROR;
-}
-
-/* This baton is used by the stream created for write_hash_rep. */
-struct write_hash_baton
-{
- svn_stream_t *stream;
-
- apr_size_t size;
-
- svn_checksum_ctx_t *md5_ctx;
- svn_checksum_ctx_t *sha1_ctx;
-};
-
-/* The handler for the write_hash_rep stream. BATON is a
- write_hash_baton, DATA has the data to write and *LEN is the number
- of bytes to write. */
-static svn_error_t *
-write_hash_handler(void *baton,
- const char *data,
- apr_size_t *len)
-{
- struct write_hash_baton *whb = baton;
-
- SVN_ERR(svn_checksum_update(whb->md5_ctx, data, *len));
- SVN_ERR(svn_checksum_update(whb->sha1_ctx, data, *len));
-
- SVN_ERR(svn_stream_write(whb->stream, data, len));
- whb->size += *len;
-
- return SVN_NO_ERROR;
-}
-
-/* Write out the hash HASH as a text representation to file FILE. In
- the process, record position, the total size of the dump and MD5 as
- well as SHA1 in REP. If rep sharing has been enabled and REPS_HASH
- is not NULL, it will be used in addition to the on-disk cache to find
- earlier reps with the same content. When such existing reps can be
- found, we will truncate the one just written from the file and return
- the existing rep. Perform temporary allocations in POOL. */
-static svn_error_t *
-write_hash_rep(representation_t *rep,
- apr_file_t *file,
- apr_hash_t *hash,
- svn_fs_t *fs,
- apr_hash_t *reps_hash,
- apr_pool_t *pool)
-{
- svn_stream_t *stream;
- struct write_hash_baton *whb;
- representation_t *old_rep;
-
- SVN_ERR(get_file_offset(&rep->offset, file, pool));
-
- whb = apr_pcalloc(pool, sizeof(*whb));
-
- whb->stream = svn_stream_from_aprfile2(file, TRUE, pool);
- whb->size = 0;
- whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
- whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
-
- stream = svn_stream_create(whb, pool);
- svn_stream_set_write(stream, write_hash_handler);
-
- SVN_ERR(svn_stream_puts(whb->stream, "PLAIN\n"));
-
- SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool));
-
- /* Store the results. */
- SVN_ERR(svn_checksum_final(&rep->md5_checksum, whb->md5_ctx, pool));
- SVN_ERR(svn_checksum_final(&rep->sha1_checksum, whb->sha1_ctx, pool));
-
- /* Check and see if we already have a representation somewhere that's
- identical to the one we just wrote out. */
- SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, pool));
-
- if (old_rep)
- {
- /* We need to erase from the protorev the data we just wrote. */
- SVN_ERR(svn_io_file_trunc(file, rep->offset, pool));
-
- /* Use the old rep for this content. */
- memcpy(rep, old_rep, sizeof (*rep));
- }
- else
- {
- /* Write out our cosmetic end marker. */
- SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n"));
-
- /* update the representation */
- rep->size = whb->size;
- rep->expanded_size = whb->size;
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Write out the hash HASH pertaining to the NODEREV in FS as a deltified
- text representation to file FILE. In the process, record the total size
- and the md5 digest in REP. If rep sharing has been enabled and REPS_HASH
- is not NULL, it will be used in addition to the on-disk cache to find
- earlier reps with the same content. When such existing reps can be found,
- we will truncate the one just written from the file and return the existing
- rep. If PROPS is set, assume that we want to a props representation as
- the base for our delta. Perform temporary allocations in POOL. */
-static svn_error_t *
-write_hash_delta_rep(representation_t *rep,
- apr_file_t *file,
- apr_hash_t *hash,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_hash_t *reps_hash,
- svn_boolean_t props,
- apr_pool_t *pool)
-{
- svn_txdelta_window_handler_t diff_wh;
- void *diff_whb;
-
- svn_stream_t *file_stream;
- svn_stream_t *stream;
- representation_t *base_rep;
- representation_t *old_rep;
- svn_stream_t *source;
- const char *header;
-
- apr_off_t rep_end = 0;
- apr_off_t delta_start = 0;
-
- struct write_hash_baton *whb;
- fs_fs_data_t *ffd = fs->fsap_data;
- int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
-
- /* Get the base for this delta. */
- SVN_ERR(choose_delta_base(&base_rep, fs, noderev, props, pool));
- SVN_ERR(read_representation(&source, fs, base_rep, pool));
-
- SVN_ERR(get_file_offset(&rep->offset, file, pool));
-
- /* Write out the rep header. */
- if (base_rep)
- {
- header = apr_psprintf(pool, REP_DELTA " %ld %" APR_OFF_T_FMT " %"
- SVN_FILESIZE_T_FMT "\n",
- base_rep->revision, base_rep->offset,
- base_rep->size);
- }
- else
- {
- header = REP_DELTA "\n";
- }
- SVN_ERR(svn_io_file_write_full(file, header, strlen(header), NULL,
- pool));
-
- SVN_ERR(get_file_offset(&delta_start, file, pool));
- file_stream = svn_stream_from_aprfile2(file, TRUE, pool);
-
- /* Prepare to write the svndiff data. */
- svn_txdelta_to_svndiff3(&diff_wh,
- &diff_whb,
- file_stream,
- diff_version,
- SVN_DELTA_COMPRESSION_LEVEL_DEFAULT,
- pool);
-
- whb = apr_pcalloc(pool, sizeof(*whb));
- whb->stream = svn_txdelta_target_push(diff_wh, diff_whb, source, pool);
- whb->size = 0;
- whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
- whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
-
- /* serialize the hash */
- stream = svn_stream_create(whb, pool);
- svn_stream_set_write(stream, write_hash_handler);
-
- SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(whb->stream));
-
- /* Store the results. */
- SVN_ERR(svn_checksum_final(&rep->md5_checksum, whb->md5_ctx, pool));
- SVN_ERR(svn_checksum_final(&rep->sha1_checksum, whb->sha1_ctx, pool));
-
- /* Check and see if we already have a representation somewhere that's
- identical to the one we just wrote out. */
- SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, pool));
-
- if (old_rep)
- {
- /* We need to erase from the protorev the data we just wrote. */
- SVN_ERR(svn_io_file_trunc(file, rep->offset, pool));
-
- /* Use the old rep for this content. */
- memcpy(rep, old_rep, sizeof (*rep));
- }
- else
- {
- /* Write out our cosmetic end marker. */
- SVN_ERR(get_file_offset(&rep_end, file, pool));
- SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
-
- /* update the representation */
- rep->expanded_size = whb->size;
- rep->size = rep_end - delta_start;
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Sanity check ROOT_NODEREV, a candidate for being the root node-revision
- of (not yet committed) revision REV in FS. Use POOL for temporary
- allocations.
-
- If you change this function, consider updating svn_fs_fs__verify() too.
- */
-static svn_error_t *
-validate_root_noderev(svn_fs_t *fs,
- node_revision_t *root_noderev,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- svn_revnum_t head_revnum = rev-1;
- int head_predecessor_count;
-
- SVN_ERR_ASSERT(rev > 0);
-
- /* Compute HEAD_PREDECESSOR_COUNT. */
- {
- svn_fs_root_t *head_revision;
- const svn_fs_id_t *head_root_id;
- node_revision_t *head_root_noderev;
-
- /* Get /@HEAD's noderev. */
- SVN_ERR(svn_fs_fs__revision_root(&head_revision, fs, head_revnum, pool));
- SVN_ERR(svn_fs_fs__node_id(&head_root_id, head_revision, "/", pool));
- SVN_ERR(svn_fs_fs__get_node_revision(&head_root_noderev, fs, head_root_id,
- pool));
-
- head_predecessor_count = head_root_noderev->predecessor_count;
- }
-
- /* Check that the root noderev's predecessor count equals REV.
-
- This kind of corruption was seen on svn.apache.org (both on
- the root noderev and on other fspaths' noderevs); see
- issue #4129.
-
- Normally (rev == root_noderev->predecessor_count), but here we
- use a more roundabout check that should only trigger on new instances
- of the corruption, rather then trigger on each and every new commit
- to a repository that has triggered the bug somewhere in its root
- noderev's history.
- */
- if (root_noderev->predecessor_count != -1
- && (root_noderev->predecessor_count - head_predecessor_count)
- != (rev - head_revnum))
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("predecessor count for "
- "the root node-revision is wrong: "
- "found (%d+%ld != %d), committing r%ld"),
- head_predecessor_count,
- rev - head_revnum, /* This is equal to 1. */
- root_noderev->predecessor_count,
- rev);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Copy a node-revision specified by id ID in fileystem FS from a
- transaction into the proto-rev-file FILE. Set *NEW_ID_P to a
- pointer to the new node-id which will be allocated in POOL.
- If this is a directory, copy all children as well.
-
- START_NODE_ID and START_COPY_ID are
- the first available node and copy ids for this filesystem, for older
- FS formats.
-
- REV is the revision number that this proto-rev-file will represent.
-
- INITIAL_OFFSET is the offset of the proto-rev-file on entry to
- commit_body.
-
- If REPS_TO_CACHE is not NULL, append to it a copy (allocated in
- REPS_POOL) of each data rep that is new in this revision.
-
- If REPS_HASH is not NULL, append copies (allocated in REPS_POOL)
- of the representations of each property rep that is new in this
- revision.
-
- AT_ROOT is true if the node revision being written is the root
- node-revision. It is only controls additional sanity checking
- logic.
-
- Temporary allocations are also from POOL. */
-static svn_error_t *
-write_final_rev(const svn_fs_id_t **new_id_p,
- apr_file_t *file,
- svn_revnum_t rev,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- const char *start_node_id,
- const char *start_copy_id,
- apr_off_t initial_offset,
- apr_array_header_t *reps_to_cache,
- apr_hash_t *reps_hash,
- apr_pool_t *reps_pool,
- svn_boolean_t at_root,
- apr_pool_t *pool)
+svn_fs_fs__file_checksum(svn_checksum_t **checksum,
+ node_revision_t *noderev,
+ svn_checksum_kind_t kind,
+ apr_pool_t *pool)
{
- node_revision_t *noderev;
- apr_off_t my_offset;
- char my_node_id_buf[MAX_KEY_SIZE + 2];
- char my_copy_id_buf[MAX_KEY_SIZE + 2];
- const svn_fs_id_t *new_id;
- const char *node_id, *copy_id, *my_node_id, *my_copy_id;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- *new_id_p = NULL;
-
- /* Check to see if this is a transaction node. */
- if (! svn_fs_fs__id_txn_id(id))
- return SVN_NO_ERROR;
-
- SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool));
-
- if (noderev->kind == svn_node_dir)
- {
- apr_pool_t *subpool;
- apr_hash_t *entries, *str_entries;
- apr_array_header_t *sorted_entries;
- int i;
-
- /* This is a directory. Write out all the children first. */
- subpool = svn_pool_create(pool);
-
- SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev, pool));
- /* For the sake of the repository administrator sort the entries
- so that the final file is deterministic and repeatable,
- however the rest of the FSFS code doesn't require any
- particular order here. */
- sorted_entries = svn_sort__hash(entries, svn_sort_compare_items_lexically,
- pool);
- for (i = 0; i < sorted_entries->nelts; ++i)
- {
- svn_fs_dirent_t *dirent = APR_ARRAY_IDX(sorted_entries, i,
- svn_sort__item_t).value;
-
- svn_pool_clear(subpool);
- SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
- start_node_id, start_copy_id, initial_offset,
- reps_to_cache, reps_hash, reps_pool, FALSE,
- subpool));
- if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
- dirent->id = svn_fs_fs__id_copy(new_id, pool);
- }
- svn_pool_destroy(subpool);
-
- if (noderev->data_rep && noderev->data_rep->txn_id)
- {
- /* Write out the contents of this directory as a text rep. */
- SVN_ERR(unparse_dir_entries(&str_entries, entries, pool));
-
- noderev->data_rep->txn_id = NULL;
- noderev->data_rep->revision = rev;
-
- if (ffd->deltify_directories)
- SVN_ERR(write_hash_delta_rep(noderev->data_rep, file,
- str_entries, fs, noderev, NULL,
- FALSE, pool));
- else
- SVN_ERR(write_hash_rep(noderev->data_rep, file, str_entries,
- fs, NULL, pool));
- }
- }
- else
- {
- /* This is a file. We should make sure the data rep, if it
- exists in a "this" state, gets rewritten to our new revision
- num. */
-
- if (noderev->data_rep && noderev->data_rep->txn_id)
- {
- noderev->data_rep->txn_id = NULL;
- noderev->data_rep->revision = rev;
-
- /* See issue 3845. Some unknown mechanism caused the
- protorev file to get truncated, so check for that
- here. */
- if (noderev->data_rep->offset + noderev->data_rep->size
- > initial_offset)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Truncated protorev file detected"));
- }
- }
-
- /* Fix up the property reps. */
- if (noderev->prop_rep && noderev->prop_rep->txn_id)
- {
- apr_hash_t *proplist;
- SVN_ERR(svn_fs_fs__get_proplist(&proplist, fs, noderev, pool));
-
- noderev->prop_rep->txn_id = NULL;
- noderev->prop_rep->revision = rev;
-
- if (ffd->deltify_properties)
- SVN_ERR(write_hash_delta_rep(noderev->prop_rep, file,
- proplist, fs, noderev, reps_hash,
- TRUE, pool));
- else
- SVN_ERR(write_hash_rep(noderev->prop_rep, file, proplist,
- fs, reps_hash, pool));
- }
-
-
- /* Convert our temporary ID into a permanent revision one. */
- SVN_ERR(get_file_offset(&my_offset, file, pool));
-
- node_id = svn_fs_fs__id_node_id(noderev->id);
- if (*node_id == '_')
- {
- if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- my_node_id = apr_psprintf(pool, "%s-%ld", node_id + 1, rev);
- else
- {
- svn_fs_fs__add_keys(start_node_id, node_id + 1, my_node_id_buf);
- my_node_id = my_node_id_buf;
- }
- }
- else
- my_node_id = node_id;
-
- copy_id = svn_fs_fs__id_copy_id(noderev->id);
- if (*copy_id == '_')
- {
- if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- my_copy_id = apr_psprintf(pool, "%s-%ld", copy_id + 1, rev);
- else
- {
- svn_fs_fs__add_keys(start_copy_id, copy_id + 1, my_copy_id_buf);
- my_copy_id = my_copy_id_buf;
- }
- }
- else
- my_copy_id = copy_id;
-
- if (noderev->copyroot_rev == SVN_INVALID_REVNUM)
- noderev->copyroot_rev = rev;
-
- new_id = svn_fs_fs__id_rev_create(my_node_id, my_copy_id, rev, my_offset,
- pool);
+ *checksum = NULL;
- noderev->id = new_id;
-
- if (ffd->rep_sharing_allowed)
+ if (noderev->data_rep)
{
- /* Save the data representation's hash in the rep cache. */
- if ( noderev->data_rep && noderev->kind == svn_node_file
- && noderev->data_rep->revision == rev)
- {
- SVN_ERR_ASSERT(reps_to_cache && reps_pool);
- APR_ARRAY_PUSH(reps_to_cache, representation_t *)
- = svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
- }
+ svn_checksum_t temp;
+ temp.kind = kind;
- if (noderev->prop_rep && noderev->prop_rep->revision == rev)
+ switch(kind)
{
- /* Add new property reps to hash and on-disk cache. */
- representation_t *copy
- = svn_fs_fs__rep_copy(noderev->prop_rep, reps_pool);
-
- SVN_ERR_ASSERT(reps_to_cache && reps_pool);
- APR_ARRAY_PUSH(reps_to_cache, representation_t *) = copy;
-
- apr_hash_set(reps_hash,
- copy->sha1_checksum->digest,
- APR_SHA1_DIGESTSIZE,
- copy);
- }
- }
-
- /* don't serialize SHA1 for dirs to disk (waste of space) */
- if (noderev->data_rep && noderev->kind == svn_node_dir)
- noderev->data_rep->sha1_checksum = NULL;
-
- /* don't serialize SHA1 for props to disk (waste of space) */
- if (noderev->prop_rep)
- noderev->prop_rep->sha1_checksum = NULL;
-
- /* Workaround issue #4031: is-fresh-txn-root in revision files. */
- noderev->is_fresh_txn_root = FALSE;
-
- /* Write out our new node-revision. */
- if (at_root)
- SVN_ERR(validate_root_noderev(fs, noderev, rev, pool));
-
- SVN_ERR(svn_fs_fs__write_noderev(svn_stream_from_aprfile2(file, TRUE, pool),
- noderev, ffd->format,
- svn_fs_fs__fs_supports_mergeinfo(fs),
- pool));
-
- /* Return our ID that references the revision file. */
- *new_id_p = noderev->id;
-
- return SVN_NO_ERROR;
-}
-
-/* Write the changed path info from transaction TXN_ID in filesystem
- FS to the permanent rev-file FILE. *OFFSET_P is set the to offset
- in the file of the beginning of this information. Perform
- temporary allocations in POOL. */
-static svn_error_t *
-write_final_changed_path_info(apr_off_t *offset_p,
- apr_file_t *file,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- apr_hash_t *changed_paths;
- apr_off_t offset;
- apr_pool_t *iterpool = svn_pool_create(pool);
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_boolean_t include_node_kinds =
- ffd->format >= SVN_FS_FS__MIN_KIND_IN_CHANGED_FORMAT;
- apr_array_header_t *sorted_changed_paths;
- int i;
-
- SVN_ERR(get_file_offset(&offset, file, pool));
-
- SVN_ERR(svn_fs_fs__txn_changes_fetch(&changed_paths, fs, txn_id, pool));
- /* For the sake of the repository administrator sort the changes so
- that the final file is deterministic and repeatable, however the
- rest of the FSFS code doesn't require any particular order here. */
- sorted_changed_paths = svn_sort__hash(changed_paths,
- svn_sort_compare_items_lexically, pool);
-
- /* Iterate through the changed paths one at a time, and convert the
- temporary node-id into a permanent one for each change entry. */
- for (i = 0; i < sorted_changed_paths->nelts; ++i)
- {
- node_revision_t *noderev;
- const svn_fs_id_t *id;
- svn_fs_path_change2_t *change;
- const char *path;
-
- svn_pool_clear(iterpool);
-
- change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
- path = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).key;
+ case svn_checksum_md5:
+ temp.digest = noderev->data_rep->md5_digest;
+ break;
- id = change->node_rev_id;
+ case svn_checksum_sha1:
+ if (! noderev->data_rep->has_sha1)
+ return SVN_NO_ERROR;
- /* If this was a delete of a mutable node, then it is OK to
- leave the change entry pointing to the non-existent temporary
- node, since it will never be used. */
- if ((change->change_kind != svn_fs_path_change_delete) &&
- (! svn_fs_fs__id_txn_id(id)))
- {
- SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, iterpool));
+ temp.digest = noderev->data_rep->sha1_digest;
+ break;
- /* noderev has the permanent node-id at this point, so we just
- substitute it for the temporary one. */
- change->node_rev_id = noderev->id;
+ default:
+ return SVN_NO_ERROR;
}
- /* Write out the new entry into the final rev-file. */
- SVN_ERR(write_change_entry(file, path, change, include_node_kinds,
- iterpool));
+ *checksum = svn_checksum_dup(&temp, pool);
}
- svn_pool_destroy(iterpool);
-
- *offset_p = offset;
-
- return SVN_NO_ERROR;
-}
-
-/* Atomically update the 'current' file to hold the specifed REV,
- NEXT_NODE_ID, and NEXT_COPY_ID. (The two next-ID parameters are
- ignored and may be NULL if the FS format does not use them.)
- Perform temporary allocations in POOL. */
-static svn_error_t *
-write_current(svn_fs_t *fs, svn_revnum_t rev, const char *next_node_id,
- const char *next_copy_id, apr_pool_t *pool)
-{
- char *buf;
- const char *tmp_name, *name;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- /* Now we can just write out this line. */
- if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- buf = apr_psprintf(pool, "%ld\n", rev);
- else
- buf = apr_psprintf(pool, "%ld %s %s\n", rev, next_node_id, next_copy_id);
-
- name = svn_fs_fs__path_current(fs, pool);
- SVN_ERR(svn_io_write_unique(&tmp_name,
- svn_dirent_dirname(name, pool),
- buf, strlen(buf),
- svn_io_file_del_none, pool));
-
- return move_into_place(tmp_name, name, name, pool);
-}
-
-/* Open a new svn_fs_t handle to FS, set that handle's concept of "current
- youngest revision" to NEW_REV, and call svn_fs_fs__verify_root() on
- NEW_REV's revision root.
-
- Intended to be called as the very last step in a commit before 'current'
- is bumped. This implies that we are holding the write lock. */
-static svn_error_t *
-verify_as_revision_before_current_plus_plus(svn_fs_t *fs,
- svn_revnum_t new_rev,
- apr_pool_t *pool)
-{
-#ifdef SVN_DEBUG
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_fs_t *ft; /* fs++ == ft */
- svn_fs_root_t *root;
- fs_fs_data_t *ft_ffd;
- apr_hash_t *fs_config;
-
- SVN_ERR_ASSERT(ffd->svn_fs_open_);
-
- /* make sure FT does not simply return data cached by other instances
- * but actually retrieves it from disk at least once.
- */
- fs_config = apr_hash_make(pool);
- svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
- svn_uuid_generate(pool));
- SVN_ERR(ffd->svn_fs_open_(&ft, fs->path,
- fs_config,
- pool));
- ft_ffd = ft->fsap_data;
- /* Don't let FT consult rep-cache.db, either. */
- ft_ffd->rep_sharing_allowed = FALSE;
-
- /* Time travel! */
- ft_ffd->youngest_rev_cache = new_rev;
-
- SVN_ERR(svn_fs_fs__revision_root(&root, ft, new_rev, pool));
- SVN_ERR_ASSERT(root->is_txn_root == FALSE && root->rev == new_rev);
- SVN_ERR_ASSERT(ft_ffd->youngest_rev_cache == new_rev);
- SVN_ERR(svn_fs_fs__verify_root(root, pool));
-#endif /* SVN_DEBUG */
-
return SVN_NO_ERROR;
}
-/* Update the 'current' file to hold the correct next node and copy_ids
- from transaction TXN_ID in filesystem FS. The current revision is
- set to REV. Perform temporary allocations in POOL. */
-static svn_error_t *
-write_final_current(svn_fs_t *fs,
- const char *txn_id,
- svn_revnum_t rev,
- const char *start_node_id,
- const char *start_copy_id,
+representation_t *
+svn_fs_fs__rep_copy(representation_t *rep,
apr_pool_t *pool)
{
- const char *txn_node_id, *txn_copy_id;
- char new_node_id[MAX_KEY_SIZE + 2];
- char new_copy_id[MAX_KEY_SIZE + 2];
- fs_fs_data_t *ffd = fs->fsap_data;
-
- if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- return write_current(fs, rev, NULL, NULL, pool);
-
- /* To find the next available ids, we add the id that used to be in
- the 'current' file, to the next ids from the transaction file. */
- SVN_ERR(read_next_ids(&txn_node_id, &txn_copy_id, fs, txn_id, pool));
-
- svn_fs_fs__add_keys(start_node_id, txn_node_id, new_node_id);
- svn_fs_fs__add_keys(start_copy_id, txn_copy_id, new_copy_id);
-
- return write_current(fs, rev, new_node_id, new_copy_id, pool);
-}
+ if (rep == NULL)
+ return NULL;
-/* Verify that the user registed with FS has all the locks necessary to
- permit all the changes associate with TXN_NAME.
- The FS write lock is assumed to be held by the caller. */
-static svn_error_t *
-verify_locks(svn_fs_t *fs,
- const char *txn_name,
- apr_pool_t *pool)
-{
- apr_pool_t *subpool = svn_pool_create(pool);
- apr_hash_t *changes;
- apr_hash_index_t *hi;
- apr_array_header_t *changed_paths;
- svn_stringbuf_t *last_recursed = NULL;
- int i;
-
- /* Fetch the changes for this transaction. */
- SVN_ERR(svn_fs_fs__txn_changes_fetch(&changes, fs, txn_name, pool));
-
- /* Make an array of the changed paths, and sort them depth-first-ily. */
- changed_paths = apr_array_make(pool, apr_hash_count(changes) + 1,
- sizeof(const char *));
- for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
- APR_ARRAY_PUSH(changed_paths, const char *) = svn__apr_hash_index_key(hi);
- qsort(changed_paths->elts, changed_paths->nelts,
- changed_paths->elt_size, svn_sort_compare_paths);
-
- /* Now, traverse the array of changed paths, verify locks. Note
- that if we need to do a recursive verification a path, we'll skip
- over children of that path when we get to them. */
- for (i = 0; i < changed_paths->nelts; i++)
- {
- const char *path;
- svn_fs_path_change2_t *change;
- svn_boolean_t recurse = TRUE;
-
- svn_pool_clear(subpool);
- path = APR_ARRAY_IDX(changed_paths, i, const char *);
-
- /* If this path has already been verified as part of a recursive
- check of one of its parents, no need to do it again. */
- if (last_recursed
- && svn_dirent_is_child(last_recursed->data, path, subpool))
- continue;
-
- /* Fetch the change associated with our path. */
- change = svn_hash_gets(changes, path);
-
- /* What does it mean to succeed at lock verification for a given
- path? For an existing file or directory getting modified
- (text, props), it means we hold the lock on the file or
- directory. For paths being added or removed, we need to hold
- the locks for that path and any children of that path.
-
- WHEW! We have no reliable way to determine the node kind
- of deleted items, but fortunately we are going to do a
- recursive check on deleted paths regardless of their kind. */
- if (change->change_kind == svn_fs_path_change_modify)
- recurse = FALSE;
- SVN_ERR(svn_fs_fs__allow_locked_operation(path, fs, recurse, TRUE,
- subpool));
-
- /* If we just did a recursive check, remember the path we
- checked (so children can be skipped). */
- if (recurse)
- {
- if (! last_recursed)
- last_recursed = svn_stringbuf_create(path, pool);
- else
- svn_stringbuf_set(last_recursed, path);
- }
- }
- svn_pool_destroy(subpool);
- return SVN_NO_ERROR;
+ return apr_pmemdup(pool, rep, sizeof(*rep));
}
-/* Baton used for commit_body below. */
-struct commit_baton {
- svn_revnum_t *new_rev_p;
- svn_fs_t *fs;
- svn_fs_txn_t *txn;
- apr_array_header_t *reps_to_cache;
- apr_hash_t *reps_hash;
- apr_pool_t *reps_pool;
-};
-/* The work-horse for svn_fs_fs__commit, called with the FS write lock.
- This implements the svn_fs_fs__with_write_lock() 'body' callback
- type. BATON is a 'struct commit_baton *'. */
+/* Write out the zeroth revision for filesystem FS.
+ Perform temporary allocations in SCRATCH_POOL. */
static svn_error_t *
-commit_body(void *baton, apr_pool_t *pool)
-{
- struct commit_baton *cb = baton;
- fs_fs_data_t *ffd = cb->fs->fsap_data;
- const char *old_rev_filename, *rev_filename, *proto_filename;
- const char *revprop_filename, *final_revprop;
- const svn_fs_id_t *root_id, *new_root_id;
- const char *start_node_id = NULL, *start_copy_id = NULL;
- svn_revnum_t old_rev, new_rev;
- apr_file_t *proto_file;
- void *proto_file_lockcookie;
- apr_off_t initial_offset, changed_path_offset;
- char *buf;
- apr_hash_t *txnprops;
- apr_array_header_t *txnprop_list;
- svn_prop_t prop;
- svn_string_t date;
-
- /* Get the current youngest revision. */
- SVN_ERR(svn_fs_fs__youngest_rev(&old_rev, cb->fs, pool));
-
- /* Check to make sure this transaction is based off the most recent
- revision. */
- if (cb->txn->base_rev != old_rev)
- return svn_error_create(SVN_ERR_FS_TXN_OUT_OF_DATE, NULL,
- _("Transaction out of date"));
-
- /* Locks may have been added (or stolen) between the calling of
- previous svn_fs.h functions and svn_fs_commit_txn(), so we need
- to re-examine every changed-path in the txn and re-verify all
- discovered locks. */
- SVN_ERR(verify_locks(cb->fs, cb->txn->id, pool));
-
- /* Get the next node_id and copy_id to use. */
- if (ffd->format < SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- SVN_ERR(get_next_revision_ids(&start_node_id, &start_copy_id, cb->fs,
- pool));
-
- /* We are going to be one better than this puny old revision. */
- new_rev = old_rev + 1;
-
- /* Get a write handle on the proto revision file. */
- SVN_ERR(get_writable_proto_rev(&proto_file, &proto_file_lockcookie,
- cb->fs, cb->txn->id, pool));
- SVN_ERR(get_file_offset(&initial_offset, proto_file, pool));
-
- /* Write out all the node-revisions and directory contents. */
- root_id = svn_fs_fs__id_txn_create("0", "0", cb->txn->id, pool);
- SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
- start_node_id, start_copy_id, initial_offset,
- cb->reps_to_cache, cb->reps_hash, cb->reps_pool,
- TRUE, pool));
-
- /* Write the changed-path information. */
- SVN_ERR(write_final_changed_path_info(&changed_path_offset, proto_file,
- cb->fs, cb->txn->id, pool));
-
- /* Write the final line. */
- buf = apr_psprintf(pool, "\n%" APR_OFF_T_FMT " %" APR_OFF_T_FMT "\n",
- svn_fs_fs__id_offset(new_root_id),
- changed_path_offset);
- SVN_ERR(svn_io_file_write_full(proto_file, buf, strlen(buf), NULL,
- pool));
- SVN_ERR(svn_io_file_flush_to_disk(proto_file, pool));
- SVN_ERR(svn_io_file_close(proto_file, pool));
-
- /* We don't unlock the prototype revision file immediately to avoid a
- race with another caller writing to the prototype revision file
- before we commit it. */
-
- /* Remove any temporary txn props representing 'flags'. */
- SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, cb->txn, pool));
- txnprop_list = apr_array_make(pool, 3, sizeof(svn_prop_t));
- prop.value = NULL;
-
- if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
- {
- prop.name = SVN_FS__PROP_TXN_CHECK_OOD;
- APR_ARRAY_PUSH(txnprop_list, svn_prop_t) = prop;
- }
-
- if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
- {
- prop.name = SVN_FS__PROP_TXN_CHECK_LOCKS;
- APR_ARRAY_PUSH(txnprop_list, svn_prop_t) = prop;
- }
-
- if (! apr_is_empty_array(txnprop_list))
- SVN_ERR(svn_fs_fs__change_txn_props(cb->txn, txnprop_list, pool));
-
- /* Create the shard for the rev and revprop file, if we're sharding and
- this is the first revision of a new shard. We don't care if this
- fails because the shard already existed for some reason. */
- if (ffd->max_files_per_dir && new_rev % ffd->max_files_per_dir == 0)
- {
- /* Create the revs shard. */
- {
- const char *new_dir = path_rev_shard(cb->fs, new_rev, pool);
- svn_error_t *err = svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
- if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
- return svn_error_trace(err);
- svn_error_clear(err);
- SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
- PATH_REVS_DIR,
- pool),
- new_dir, pool));
- }
-
- /* Create the revprops shard. */
- SVN_ERR_ASSERT(! is_packed_revprop(cb->fs, new_rev));
- {
- const char *new_dir = path_revprops_shard(cb->fs, new_rev, pool);
- svn_error_t *err = svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
- if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
- return svn_error_trace(err);
- svn_error_clear(err);
- SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
- PATH_REVPROPS_DIR,
- pool),
- new_dir, pool));
- }
- }
-
- /* Move the finished rev file into place. */
- SVN_ERR(svn_fs_fs__path_rev_absolute(&old_rev_filename,
- cb->fs, old_rev, pool));
- rev_filename = path_rev(cb->fs, new_rev, pool);
- proto_filename = path_txn_proto_rev(cb->fs, cb->txn->id, pool);
- SVN_ERR(move_into_place(proto_filename, rev_filename, old_rev_filename,
- pool));
-
- /* Now that we've moved the prototype revision file out of the way,
- we can unlock it (since further attempts to write to the file
- will fail as it no longer exists). We must do this so that we can
- remove the transaction directory later. */
- SVN_ERR(unlock_proto_rev(cb->fs, cb->txn->id, proto_file_lockcookie, pool));
-
- /* Update commit time to ensure that svn:date revprops remain ordered. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
-
- SVN_ERR(svn_fs_fs__change_txn_prop(cb->txn, SVN_PROP_REVISION_DATE,
- &date, pool));
-
- /* Move the revprops file into place. */
- SVN_ERR_ASSERT(! is_packed_revprop(cb->fs, new_rev));
- revprop_filename = path_txn_props(cb->fs, cb->txn->id, pool);
- final_revprop = path_revprops(cb->fs, new_rev, pool);
- SVN_ERR(move_into_place(revprop_filename, final_revprop,
- old_rev_filename, pool));
-
- /* Update the 'current' file. */
- SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
- SVN_ERR(write_final_current(cb->fs, cb->txn->id, new_rev, start_node_id,
- start_copy_id, pool));
-
- /* At this point the new revision is committed and globally visible
- so let the caller know it succeeded by giving it the new revision
- number, which fulfills svn_fs_commit_txn() contract. Any errors
- after this point do not change the fact that a new revision was
- created. */
- *cb->new_rev_p = new_rev;
-
- ffd->youngest_rev_cache = new_rev;
-
- /* Remove this transaction directory. */
- SVN_ERR(svn_fs_fs__purge_txn(cb->fs, cb->txn->id, pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Add the representations in REPS_TO_CACHE (an array of representation_t *)
- * to the rep-cache database of FS. */
-static svn_error_t *
-write_reps_to_cache(svn_fs_t *fs,
- const apr_array_header_t *reps_to_cache,
+write_revision_zero(svn_fs_t *fs,
apr_pool_t *scratch_pool)
{
- int i;
-
- for (i = 0; i < reps_to_cache->nelts; i++)
- {
- representation_t *rep = APR_ARRAY_IDX(reps_to_cache, i, representation_t *);
-
- /* FALSE because we don't care if another parallel commit happened to
- * collide with us. (Non-parallel collisions will not be detected.) */
- SVN_ERR(svn_fs_fs__set_rep_reference(fs, rep, FALSE, scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__commit(svn_revnum_t *new_rev_p,
- svn_fs_t *fs,
- svn_fs_txn_t *txn,
- apr_pool_t *pool)
-{
- struct commit_baton cb;
- fs_fs_data_t *ffd = fs->fsap_data;
-
- cb.new_rev_p = new_rev_p;
- cb.fs = fs;
- cb.txn = txn;
-
- if (ffd->rep_sharing_allowed)
- {
- cb.reps_to_cache = apr_array_make(pool, 5, sizeof(representation_t *));
- cb.reps_hash = apr_hash_make(pool);
- cb.reps_pool = pool;
- }
- else
- {
- cb.reps_to_cache = NULL;
- cb.reps_hash = NULL;
- cb.reps_pool = NULL;
- }
-
- SVN_ERR(svn_fs_fs__with_write_lock(fs, commit_body, &cb, pool));
-
- /* At this point, *NEW_REV_P has been set, so errors below won't affect
- the success of the commit. (See svn_fs_commit_txn().) */
-
- if (ffd->rep_sharing_allowed)
- {
- SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
-
- /* Write new entries to the rep-sharing database.
- *
- * We use an sqlite transaction to speed things up;
- * see <http://www.sqlite.org/faq.html#q19>.
- */
- SVN_SQLITE__WITH_TXN(
- write_reps_to_cache(fs, cb.reps_to_cache, pool),
- ffd->rep_cache_db);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_fs_fs__reserve_copy_id(const char **copy_id_p,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool)
-{
- const char *cur_node_id, *cur_copy_id;
- char *copy_id;
- apr_size_t len;
-
- /* First read in the current next-ids file. */
- SVN_ERR(read_next_ids(&cur_node_id, &cur_copy_id, fs, txn_id, pool));
-
- copy_id = apr_pcalloc(pool, strlen(cur_copy_id) + 2);
-
- len = strlen(cur_copy_id);
- svn_fs_fs__next_key(cur_copy_id, &len, copy_id);
-
- SVN_ERR(write_next_ids(fs, txn_id, cur_node_id, copy_id, pool));
-
- *copy_id_p = apr_pstrcat(pool, "_", cur_copy_id, (char *)NULL);
-
- return SVN_NO_ERROR;
-}
-
-/* Write out the zeroth revision for filesystem FS. */
-static svn_error_t *
-write_revision_zero(svn_fs_t *fs)
-{
- const char *path_revision_zero = path_rev(fs, 0, fs->pool);
+ /* Use an explicit sub-pool to have full control over temp file lifetimes.
+ * Since we have it, use it for everything else as well. */
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+ const char *path_revision_zero = svn_fs_fs__path_rev(fs, 0, subpool);
apr_hash_t *proplist;
svn_string_t date;
/* Write out a rev file for revision 0. */
- SVN_ERR(svn_io_file_create(path_revision_zero,
- "PLAIN\nEND\nENDREP\n"
- "id: 0.0.r0/17\n"
- "type: dir\n"
- "count: 0\n"
- "text: 0 0 4 4 "
- "2d2977d1c96f487abe4a1e202dd03b4e\n"
- "cpath: /\n"
- "\n\n17 107\n", fs->pool));
- SVN_ERR(svn_io_set_file_read_only(path_revision_zero, FALSE, fs->pool));
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ apr_array_header_t *index_entries;
+ svn_fs_fs__p2l_entry_t *entry;
+ svn_fs_fs__revision_file_t *rev_file;
+ const char *l2p_proto_index, *p2l_proto_index;
+
+ /* Write a skeleton r0 with no indexes. */
+ SVN_ERR(svn_io_file_create(path_revision_zero,
+ "PLAIN\nEND\nENDREP\n"
+ "id: 0.0.r0/2\n"
+ "type: dir\n"
+ "count: 0\n"
+ "text: 0 3 4 4 "
+ "2d2977d1c96f487abe4a1e202dd03b4e\n"
+ "cpath: /\n"
+ "\n\n", subpool));
+
+ /* Construct the index P2L contents: describe the 3 items we have.
+ Be sure to create them in on-disk order. */
+ index_entries = apr_array_make(subpool, 3, sizeof(entry));
+
+ entry = apr_pcalloc(subpool, sizeof(*entry));
+ entry->offset = 0;
+ entry->size = 17;
+ entry->type = SVN_FS_FS__ITEM_TYPE_DIR_REP;
+ entry->item.revision = 0;
+ entry->item.number = SVN_FS_FS__ITEM_INDEX_FIRST_USER;
+ APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
+
+ entry = apr_pcalloc(subpool, sizeof(*entry));
+ entry->offset = 17;
+ entry->size = 89;
+ entry->type = SVN_FS_FS__ITEM_TYPE_NODEREV;
+ entry->item.revision = 0;
+ entry->item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
+ APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
+
+ entry = apr_pcalloc(subpool, sizeof(*entry));
+ entry->offset = 106;
+ entry->size = 1;
+ entry->type = SVN_FS_FS__ITEM_TYPE_CHANGES;
+ entry->item.revision = 0;
+ entry->item.number = SVN_FS_FS__ITEM_INDEX_CHANGES;
+ APR_ARRAY_PUSH(index_entries, svn_fs_fs__p2l_entry_t *) = entry;
+
+ /* Now re-open r0, create proto-index files from our entries and
+ rewrite the index section of r0. */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs, 0,
+ subpool, subpool));
+ SVN_ERR(svn_fs_fs__p2l_index_from_p2l_entries(&p2l_proto_index, fs,
+ rev_file, index_entries,
+ subpool, subpool));
+ SVN_ERR(svn_fs_fs__l2p_index_from_p2l_entries(&l2p_proto_index, fs,
+ index_entries,
+ subpool, subpool));
+ SVN_ERR(svn_fs_fs__add_index_data(fs, rev_file->file, l2p_proto_index,
+ p2l_proto_index, 0, subpool));
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+ }
+ else
+ SVN_ERR(svn_io_file_create(path_revision_zero,
+ "PLAIN\nEND\nENDREP\n"
+ "id: 0.0.r0/17\n"
+ "type: dir\n"
+ "count: 0\n"
+ "text: 0 0 4 4 "
+ "2d2977d1c96f487abe4a1e202dd03b4e\n"
+ "cpath: /\n"
+ "\n\n17 107\n", subpool));
+
+ SVN_ERR(svn_io_set_file_read_only(path_revision_zero, FALSE, subpool));
/* Set a date on revision 0. */
- date.data = svn_time_to_cstring(apr_time_now(), fs->pool);
+ date.data = svn_time_to_cstring(apr_time_now(), subpool);
date.len = strlen(date.data);
- proplist = apr_hash_make(fs->pool);
+ proplist = apr_hash_make(subpool);
svn_hash_sets(proplist, SVN_PROP_REVISION_DATE, &date);
- return set_revision_proplist(fs, 0, proplist, fs->pool);
+ SVN_ERR(svn_fs_fs__set_revision_proplist(fs, 0, proplist, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
}
svn_error_t *
-svn_fs_fs__create(svn_fs_t *fs,
- const char *path,
- apr_pool_t *pool)
+svn_fs_fs__create_file_tree(svn_fs_t *fs,
+ const char *path,
+ int format,
+ int shard_size,
+ svn_boolean_t use_log_addressing,
+ apr_pool_t *pool)
{
- int format = SVN_FS_FS__FORMAT_NUMBER;
fs_fs_data_t *ffd = fs->fsap_data;
- fs->path = apr_pstrdup(pool, path);
- /* See if compatibility with older versions was explicitly requested. */
- if (fs->config)
- {
- if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE))
- format = 1;
- else if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE))
- format = 2;
- else if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE))
- format = 3;
- else if (svn_hash_gets(fs->config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE))
- format = 4;
- }
+ fs->path = apr_pstrdup(fs->pool, path);
ffd->format = format;
- /* Override the default linear layout if this is a new-enough format. */
+ /* Use an appropriate sharding mode if supported by the format. */
if (format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
- ffd->max_files_per_dir = SVN_FS_FS_DEFAULT_MAX_FILES_PER_DIR;
+ ffd->max_files_per_dir = shard_size;
+ else
+ ffd->max_files_per_dir = 0;
+
+ /* Select the addressing mode depending on the format. */
+ if (format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
+ ffd->use_log_addressing = use_log_addressing;
+ else
+ ffd->use_log_addressing = FALSE;
/* Create the revision data directories. */
if (ffd->max_files_per_dir)
- SVN_ERR(svn_io_make_dir_recursively(path_rev_shard(fs, 0, pool), pool));
+ SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_rev_shard(fs, 0,
+ pool),
+ pool));
else
SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path, PATH_REVS_DIR,
pool),
@@ -8858,7 +1725,8 @@ svn_fs_fs__create(svn_fs_t *fs,
/* Create the revprops directory. */
if (ffd->max_files_per_dir)
- SVN_ERR(svn_io_make_dir_recursively(path_revprops_shard(fs, 0, pool),
+ SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_revprops_shard(fs, 0,
+ pool),
pool));
else
SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path,
@@ -8867,25 +1735,22 @@ svn_fs_fs__create(svn_fs_t *fs,
pool));
/* Create the transaction directory. */
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path, PATH_TXNS_DIR,
- pool),
+ SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_txns_dir(fs, pool),
pool));
/* Create the protorevs directory. */
if (format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(path, PATH_TXN_PROTOS_DIR,
- pool),
+ SVN_ERR(svn_io_make_dir_recursively(svn_fs_fs__path_txn_proto_revs(fs,
+ pool),
pool));
/* Create the 'current' file. */
- SVN_ERR(svn_io_file_create(svn_fs_fs__path_current(fs, pool),
- (format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT
- ? "0\n" : "0 1 1\n"),
- pool));
- SVN_ERR(svn_io_file_create(path_lock(fs, pool), "", pool));
- SVN_ERR(svn_fs_fs__set_uuid(fs, NULL, pool));
+ SVN_ERR(svn_io_file_create_empty(svn_fs_fs__path_current(fs, pool), pool));
+ SVN_ERR(svn_fs_fs__write_current(fs, 0, 1, 1, pool));
- SVN_ERR(write_revision_zero(fs));
+ /* Create the 'uuid' file. */
+ SVN_ERR(svn_io_file_create_empty(svn_fs_fs__path_lock(fs, pool), pool));
+ SVN_ERR(svn_fs_fs__set_uuid(fs, NULL, NULL, pool));
/* Create the fsfs.conf file if supported. Older server versions would
simply ignore the file but that might result in a different behavior
@@ -8894,554 +1759,140 @@ svn_fs_fs__create(svn_fs_t *fs,
if (ffd->format >= SVN_FS_FS__MIN_CONFIG_FILE)
SVN_ERR(write_config(fs, pool));
- SVN_ERR(read_config(ffd, fs->path, pool));
+ SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
+
+ /* Global configuration options. */
+ SVN_ERR(read_global_config(fs));
+
+ /* Add revision 0. */
+ SVN_ERR(write_revision_zero(fs, pool));
/* Create the min unpacked rev file. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(svn_io_file_create(path_min_unpacked_rev(fs, pool), "0\n", pool));
+ SVN_ERR(svn_io_file_create(svn_fs_fs__path_min_unpacked_rev(fs, pool),
+ "0\n", pool));
/* Create the txn-current file if the repository supports
the transaction sequence file. */
if (format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
{
- SVN_ERR(svn_io_file_create(path_txn_current(fs, pool),
+ SVN_ERR(svn_io_file_create(svn_fs_fs__path_txn_current(fs, pool),
"0\n", pool));
- SVN_ERR(svn_io_file_create(path_txn_current_lock(fs, pool),
- "", pool));
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_fs__path_txn_current_lock(fs, pool),
+ pool));
}
- /* This filesystem is ready. Stamp it with a format number. */
- SVN_ERR(write_format(path_format(fs, pool),
- ffd->format, ffd->max_files_per_dir, FALSE, pool));
-
ffd->youngest_rev_cache = 0;
return SVN_NO_ERROR;
}
-/* Part of the recovery procedure. Return the largest revision *REV in
- filesystem FS. Use POOL for temporary allocation. */
-static svn_error_t *
-recover_get_largest_revision(svn_fs_t *fs, svn_revnum_t *rev, apr_pool_t *pool)
-{
- /* Discovering the largest revision in the filesystem would be an
- expensive operation if we did a readdir() or searched linearly,
- so we'll do a form of binary search. left is a revision that we
- know exists, right a revision that we know does not exist. */
- apr_pool_t *iterpool;
- svn_revnum_t left, right = 1;
-
- iterpool = svn_pool_create(pool);
- /* Keep doubling right, until we find a revision that doesn't exist. */
- while (1)
- {
- svn_error_t *err;
- apr_file_t *file;
-
- err = open_pack_or_rev_file(&file, fs, right, iterpool);
- svn_pool_clear(iterpool);
-
- if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
- {
- svn_error_clear(err);
- break;
- }
- else
- SVN_ERR(err);
-
- right <<= 1;
- }
-
- left = right >> 1;
-
- /* We know that left exists and right doesn't. Do a normal bsearch to find
- the last revision. */
- while (left + 1 < right)
- {
- svn_revnum_t probe = left + ((right - left) / 2);
- svn_error_t *err;
- apr_file_t *file;
-
- err = open_pack_or_rev_file(&file, fs, probe, iterpool);
- svn_pool_clear(iterpool);
-
- if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
- {
- svn_error_clear(err);
- right = probe;
- }
- else
- {
- SVN_ERR(err);
- left = probe;
- }
- }
-
- svn_pool_destroy(iterpool);
-
- /* left is now the largest revision that exists. */
- *rev = left;
- return SVN_NO_ERROR;
-}
-
-/* A baton for reading a fixed amount from an open file. For
- recover_find_max_ids() below. */
-struct recover_read_from_file_baton
-{
- apr_file_t *file;
- apr_pool_t *pool;
- apr_off_t remaining;
-};
-
-/* A stream read handler used by recover_find_max_ids() below.
- Read and return at most BATON->REMAINING bytes from the stream,
- returning nothing after that to indicate EOF. */
-static svn_error_t *
-read_handler_recover(void *baton, char *buffer, apr_size_t *len)
-{
- struct recover_read_from_file_baton *b = baton;
- svn_filesize_t bytes_to_read = *len;
-
- if (b->remaining == 0)
- {
- /* Return a successful read of zero bytes to signal EOF. */
- *len = 0;
- return SVN_NO_ERROR;
- }
-
- if (bytes_to_read > b->remaining)
- bytes_to_read = b->remaining;
- b->remaining -= bytes_to_read;
-
- return svn_io_file_read_full2(b->file, buffer, (apr_size_t) bytes_to_read,
- len, NULL, b->pool);
-}
-
-/* Part of the recovery procedure. Read the directory noderev at offset
- OFFSET of file REV_FILE (the revision file of revision REV of
- filesystem FS), and set MAX_NODE_ID and MAX_COPY_ID to be the node-id
- and copy-id of that node, if greater than the current value stored
- in either. Recurse into any child directories that were modified in
- this revision.
-
- MAX_NODE_ID and MAX_COPY_ID must be arrays of at least MAX_KEY_SIZE.
-
- Perform temporary allocation in POOL. */
-static svn_error_t *
-recover_find_max_ids(svn_fs_t *fs, svn_revnum_t rev,
- apr_file_t *rev_file, apr_off_t offset,
- char *max_node_id, char *max_copy_id,
- apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__create(svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *pool)
{
- apr_hash_t *headers;
- char *value;
- representation_t *data_rep;
- struct rep_args *ra;
- struct recover_read_from_file_baton baton;
- svn_stream_t *stream;
- apr_hash_t *entries;
- apr_hash_index_t *hi;
- apr_pool_t *iterpool;
-
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
- SVN_ERR(read_header_block(&headers, svn_stream_from_aprfile2(rev_file, TRUE,
- pool),
- pool));
-
- /* Check that this is a directory. It should be. */
- value = svn_hash_gets(headers, HEADER_TYPE);
- if (value == NULL || strcmp(value, KIND_DIR) != 0)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Recovery encountered a non-directory node"));
-
- /* Get the data location. No data location indicates an empty directory. */
- value = svn_hash_gets(headers, HEADER_TEXT);
- if (!value)
- return SVN_NO_ERROR;
- SVN_ERR(read_rep_offsets(&data_rep, value, NULL, FALSE, pool));
-
- /* If the directory's data representation wasn't changed in this revision,
- we've already scanned the directory's contents for noderevs, so we don't
- need to again. This will occur if a property is changed on a directory
- without changing the directory's contents. */
- if (data_rep->revision != rev)
- return SVN_NO_ERROR;
-
- /* We could use get_dir_contents(), but this is much cheaper. It does
- rely on directory entries being stored as PLAIN reps, though. */
- offset = data_rep->offset;
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
- SVN_ERR(read_rep_line(&ra, rev_file, pool));
- if (ra->is_delta)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Recovery encountered a deltified directory "
- "representation"));
-
- /* Now create a stream that's allowed to read only as much data as is
- stored in the representation. */
- baton.file = rev_file;
- baton.pool = pool;
- baton.remaining = data_rep->expanded_size
- ? data_rep->expanded_size
- : data_rep->size;
- stream = svn_stream_create(&baton, pool);
- svn_stream_set_read(stream, read_handler_recover);
-
- /* Now read the entries from that stream. */
- entries = apr_hash_make(pool);
- SVN_ERR(svn_hash_read2(entries, stream, SVN_HASH_TERMINATOR, pool));
- SVN_ERR(svn_stream_close(stream));
+ int format = SVN_FS_FS__FORMAT_NUMBER;
+ int shard_size = SVN_FS_FS_DEFAULT_MAX_FILES_PER_DIR;
+ svn_boolean_t log_addressing;
- /* Now check each of the entries in our directory to find new node and
- copy ids, and recurse into new subdirectories. */
- iterpool = svn_pool_create(pool);
- for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
+ /* Process the given filesystem config. */
+ if (fs->config)
{
- char *str_val;
- char *str;
- svn_node_kind_t kind;
- svn_fs_id_t *id;
- const char *node_id, *copy_id;
- apr_off_t child_dir_offset;
- const svn_string_t *path = svn__apr_hash_index_val(hi);
-
- svn_pool_clear(iterpool);
-
- str_val = apr_pstrdup(iterpool, path->data);
-
- str = svn_cstring_tokenize(" ", &str_val);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt"));
-
- if (strcmp(str, KIND_FILE) == 0)
- kind = svn_node_file;
- else if (strcmp(str, KIND_DIR) == 0)
- kind = svn_node_dir;
- else
- {
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt"));
- }
-
- str = svn_cstring_tokenize(" ", &str_val);
- if (str == NULL)
- return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
- _("Directory entry corrupt"));
-
- id = svn_fs_fs__id_parse(str, strlen(str), iterpool);
+ svn_version_t *compatible_version;
+ const char *shard_size_str;
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, fs->config,
+ pool));
- if (svn_fs_fs__id_rev(id) != rev)
+ /* select format number */
+ switch(compatible_version->minor)
{
- /* If the node wasn't modified in this revision, we've already
- checked the node and copy id. */
- continue;
- }
+ case 0: return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
+ _("FSFS is not compatible with Subversion prior to 1.1"));
- node_id = svn_fs_fs__id_node_id(id);
- copy_id = svn_fs_fs__id_copy_id(id);
+ case 1:
+ case 2:
+ case 3: format = 1;
+ break;
- if (svn_fs_fs__key_compare(node_id, max_node_id) > 0)
- {
- SVN_ERR_ASSERT(strlen(node_id) < MAX_KEY_SIZE);
- apr_cpystrn(max_node_id, node_id, MAX_KEY_SIZE);
- }
- if (svn_fs_fs__key_compare(copy_id, max_copy_id) > 0)
- {
- SVN_ERR_ASSERT(strlen(copy_id) < MAX_KEY_SIZE);
- apr_cpystrn(max_copy_id, copy_id, MAX_KEY_SIZE);
- }
+ case 4: format = 2;
+ break;
- if (kind == svn_node_file)
- continue;
+ case 5: format = 3;
+ break;
- child_dir_offset = svn_fs_fs__id_offset(id);
- SVN_ERR(recover_find_max_ids(fs, rev, rev_file, child_dir_offset,
- max_node_id, max_copy_id, iterpool));
- }
- svn_pool_destroy(iterpool);
+ case 6:
+ case 7: format = 4;
+ break;
- return SVN_NO_ERROR;
-}
-
-/* Return TRUE, if for REVISION in FS, we can find the revprop pack file.
- * Use POOL for temporary allocations.
- * Set *MISSING, if the reason is a missing manifest or pack file.
- */
-static svn_boolean_t
-packed_revprop_available(svn_boolean_t *missing,
- svn_fs_t *fs,
- svn_revnum_t revision,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_stringbuf_t *content = NULL;
-
- /* try to read the manifest file */
- const char *folder = path_revprops_pack_shard(fs, revision, pool);
- const char *manifest_path = svn_dirent_join(folder, PATH_MANIFEST, pool);
-
- svn_error_t *err = try_stringbuf_from_file(&content,
- missing,
- manifest_path,
- FALSE,
- pool);
-
- /* if the manifest cannot be read, consider the pack files inaccessible
- * even if the file itself exists. */
- if (err)
- {
- svn_error_clear(err);
- return FALSE;
- }
+ case 8: format = 6;
+ break;
- if (*missing)
- return FALSE;
-
- /* parse manifest content until we find the entry for REVISION.
- * Revision 0 is never packed. */
- revision = revision < ffd->max_files_per_dir
- ? revision - 1
- : revision % ffd->max_files_per_dir;
- while (content->data)
- {
- char *next = strchr(content->data, '\n');
- if (next)
- {
- *next = 0;
- ++next;
+ default:format = SVN_FS_FS__FORMAT_NUMBER;
}
- if (revision-- == 0)
+ shard_size_str = svn_hash_gets(fs->config, SVN_FS_CONFIG_FSFS_SHARD_SIZE);
+ if (shard_size_str)
{
- /* the respective pack file must exist (and be a file) */
- svn_node_kind_t kind;
- err = svn_io_check_path(svn_dirent_join(folder, content->data,
- pool),
- &kind, pool);
- if (err)
- {
- svn_error_clear(err);
- return FALSE;
- }
+ apr_int64_t val;
+ SVN_ERR(svn_cstring_strtoi64(&val, shard_size_str, 0,
+ APR_INT32_MAX, 10));
- *missing = kind == svn_node_none;
- return kind == svn_node_file;
+ shard_size = (int) val;
}
-
- content->data = next;
}
- return FALSE;
-}
+ log_addressing = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_LOG_ADDRESSING,
+ TRUE);
-/* Baton used for recover_body below. */
-struct recover_baton {
- svn_fs_t *fs;
- svn_cancel_func_t cancel_func;
- void *cancel_baton;
-};
+ /* Actual FS creation. */
+ SVN_ERR(svn_fs_fs__create_file_tree(fs, path, format, shard_size,
+ log_addressing, pool));
-/* The work-horse for svn_fs_fs__recover, called with the FS
- write lock. This implements the svn_fs_fs__with_write_lock()
- 'body' callback type. BATON is a 'struct recover_baton *'. */
-static svn_error_t *
-recover_body(void *baton, apr_pool_t *pool)
-{
- struct recover_baton *b = baton;
- svn_fs_t *fs = b->fs;
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_revnum_t max_rev;
- char next_node_id_buf[MAX_KEY_SIZE], next_copy_id_buf[MAX_KEY_SIZE];
- char *next_node_id = NULL, *next_copy_id = NULL;
- svn_revnum_t youngest_rev;
- svn_node_kind_t youngest_revprops_kind;
-
- /* Lose potentially corrupted data in temp files */
- SVN_ERR(cleanup_revprop_namespace(fs));
-
- /* We need to know the largest revision in the filesystem. */
- SVN_ERR(recover_get_largest_revision(fs, &max_rev, pool));
-
- /* Get the expected youngest revision */
- SVN_ERR(get_youngest(&youngest_rev, fs->path, pool));
-
- /* Policy note:
-
- Since the revprops file is written after the revs file, the true
- maximum available revision is the youngest one for which both are
- present. That's probably the same as the max_rev we just found,
- but if it's not, we could, in theory, repeatedly decrement
- max_rev until we find a revision that has both a revs and
- revprops file, then write db/current with that.
-
- But we choose not to. If a repository is so corrupt that it's
- missing at least one revprops file, we shouldn't assume that the
- youngest revision for which both the revs and revprops files are
- present is healthy. In other words, we're willing to recover
- from a missing or out-of-date db/current file, because db/current
- is truly redundant -- it's basically a cache so we don't have to
- find max_rev each time, albeit a cache with unusual semantics,
- since it also officially defines when a revision goes live. But
- if we're missing more than the cache, it's time to back out and
- let the admin reconstruct things by hand: correctness at that
- point may depend on external things like checking a commit email
- list, looking in particular working copies, etc.
-
- This policy matches well with a typical naive backup scenario.
- Say you're rsyncing your FSFS repository nightly to the same
- location. Once revs and revprops are written, you've got the
- maximum rev; if the backup should bomb before db/current is
- written, then db/current could stay arbitrarily out-of-date, but
- we can still recover. It's a small window, but we might as well
- do what we can. */
-
- /* Even if db/current were missing, it would be created with 0 by
- get_youngest(), so this conditional remains valid. */
- if (youngest_rev > max_rev)
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Expected current rev to be <= %ld "
- "but found %ld"), max_rev, youngest_rev);
-
- /* We only need to search for maximum IDs for old FS formats which
- se global ID counters. */
- if (ffd->format < SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- {
- /* Next we need to find the maximum node id and copy id in use across the
- filesystem. Unfortunately, the only way we can get this information
- is to scan all the noderevs of all the revisions and keep track as
- we go along. */
- svn_revnum_t rev;
- apr_pool_t *iterpool = svn_pool_create(pool);
- char max_node_id[MAX_KEY_SIZE] = "0", max_copy_id[MAX_KEY_SIZE] = "0";
- apr_size_t len;
-
- for (rev = 0; rev <= max_rev; rev++)
- {
- apr_file_t *rev_file;
- apr_off_t root_offset;
-
- svn_pool_clear(iterpool);
-
- if (b->cancel_func)
- SVN_ERR(b->cancel_func(b->cancel_baton));
-
- SVN_ERR(open_pack_or_rev_file(&rev_file, fs, rev, iterpool));
- SVN_ERR(get_root_changes_offset(&root_offset, NULL, rev_file, fs, rev,
- iterpool));
- SVN_ERR(recover_find_max_ids(fs, rev, rev_file, root_offset,
- max_node_id, max_copy_id, iterpool));
- SVN_ERR(svn_io_file_close(rev_file, iterpool));
- }
- svn_pool_destroy(iterpool);
-
- /* Now that we finally have the maximum revision, node-id and copy-id, we
- can bump the two ids to get the next of each. */
- len = strlen(max_node_id);
- svn_fs_fs__next_key(max_node_id, &len, next_node_id_buf);
- next_node_id = next_node_id_buf;
- len = strlen(max_copy_id);
- svn_fs_fs__next_key(max_copy_id, &len, next_copy_id_buf);
- next_copy_id = next_copy_id_buf;
- }
-
- /* Before setting current, verify that there is a revprops file
- for the youngest revision. (Issue #2992) */
- SVN_ERR(svn_io_check_path(path_revprops(fs, max_rev, pool),
- &youngest_revprops_kind, pool));
- if (youngest_revprops_kind == svn_node_none)
- {
- svn_boolean_t missing = TRUE;
- if (!packed_revprop_available(&missing, fs, max_rev, pool))
- {
- if (missing)
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revision %ld has a revs file but no "
- "revprops file"),
- max_rev);
- }
- else
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revision %ld has a revs file but the "
- "revprops file is inaccessible"),
- max_rev);
- }
- }
- }
- else if (youngest_revprops_kind != svn_node_file)
- {
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- _("Revision %ld has a non-file where its "
- "revprops file should be"),
- max_rev);
- }
-
- /* Prune younger-than-(newfound-youngest) revisions from the rep
- cache if sharing is enabled taking care not to create the cache
- if it does not exist. */
- if (ffd->rep_sharing_allowed)
- {
- svn_boolean_t rep_cache_exists;
-
- SVN_ERR(svn_fs_fs__exists_rep_cache(&rep_cache_exists, fs, pool));
- if (rep_cache_exists)
- SVN_ERR(svn_fs_fs__del_rep_reference(fs, max_rev, pool));
- }
-
- /* Now store the discovered youngest revision, and the next IDs if
- relevant, in a new 'current' file. */
- return write_current(fs, max_rev, next_node_id, next_copy_id, pool);
-}
+ /* This filesystem is ready. Stamp it with a format number. */
+ SVN_ERR(svn_fs_fs__write_format(fs, FALSE, pool));
-/* This implements the fs_library_vtable_t.recover() API. */
-svn_error_t *
-svn_fs_fs__recover(svn_fs_t *fs,
- svn_cancel_func_t cancel_func, void *cancel_baton,
- apr_pool_t *pool)
-{
- struct recover_baton b;
-
- /* We have no way to take out an exclusive lock in FSFS, so we're
- restricted as to the types of recovery we can do. Luckily,
- we just want to recreate the 'current' file, and we can do that just
- by blocking other writers. */
- b.fs = fs;
- b.cancel_func = cancel_func;
- b.cancel_baton = cancel_baton;
- return svn_fs_fs__with_write_lock(fs, recover_body, &b, pool);
+ return SVN_NO_ERROR;
}
svn_error_t *
svn_fs_fs__set_uuid(svn_fs_t *fs,
const char *uuid,
+ const char *instance_id,
apr_pool_t *pool)
{
- char *my_uuid;
- apr_size_t my_uuid_len;
- const char *tmp_path;
+ fs_fs_data_t *ffd = fs->fsap_data;
const char *uuid_path = path_uuid(fs, pool);
+ svn_stringbuf_t *contents = svn_stringbuf_create_empty(pool);
if (! uuid)
uuid = svn_uuid_generate(pool);
- /* Make sure we have a copy in FS->POOL, and append a newline. */
- my_uuid = apr_pstrcat(fs->pool, uuid, "\n", (char *)NULL);
- my_uuid_len = strlen(my_uuid);
+ if (! instance_id)
+ instance_id = svn_uuid_generate(pool);
- SVN_ERR(svn_io_write_unique(&tmp_path,
- svn_dirent_dirname(uuid_path, pool),
- my_uuid, my_uuid_len,
- svn_io_file_del_none, pool));
+ svn_stringbuf_appendcstr(contents, uuid);
+ svn_stringbuf_appendcstr(contents, "\n");
+
+ if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
+ {
+ svn_stringbuf_appendcstr(contents, instance_id);
+ svn_stringbuf_appendcstr(contents, "\n");
+ }
/* We use the permissions of the 'current' file, because the 'uuid'
file does not exist during repository creation. */
- SVN_ERR(move_into_place(tmp_path, uuid_path,
- svn_fs_fs__path_current(fs, pool), pool));
+ SVN_ERR(svn_io_write_atomic(uuid_path, contents->data, contents->len,
+ svn_fs_fs__path_current(fs, pool) /* perms */,
+ pool));
- /* Remove the newline we added, and stash the UUID. */
- my_uuid[my_uuid_len - 1] = '\0';
- fs->uuid = my_uuid;
+ fs->uuid = apr_pstrdup(fs->pool, uuid);
+
+ if (ffd->format >= SVN_FS_FS__MIN_INSTANCE_ID_FORMAT)
+ ffd->instance_id = apr_pstrdup(fs->pool, instance_id);
+ else
+ ffd->instance_id = fs->uuid;
return SVN_NO_ERROR;
}
@@ -9492,29 +1943,37 @@ get_node_origins_from_file(svn_fs_t *fs,
stream = svn_stream_from_aprfile2(fd, FALSE, pool);
*node_origins = apr_hash_make(pool);
- SVN_ERR(svn_hash_read2(*node_origins, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(*node_origins, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ return svn_error_quick_wrapf(err, _("malformed node origin data in '%s'"),
+ node_origins_file);
return svn_stream_close(stream);
}
svn_error_t *
svn_fs_fs__get_node_origin(const svn_fs_id_t **origin_id,
svn_fs_t *fs,
- const char *node_id,
+ const svn_fs_fs__id_part_t *node_id,
apr_pool_t *pool)
{
apr_hash_t *node_origins;
*origin_id = NULL;
SVN_ERR(get_node_origins_from_file(fs, &node_origins,
- path_node_origin(fs, node_id, pool),
+ svn_fs_fs__path_node_origin(fs, node_id,
+ pool),
pool));
if (node_origins)
{
- svn_string_t *origin_id_str =
- svn_hash_gets(node_origins, node_id);
+ char node_id_ptr[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__ui64tobase36(node_id_ptr, node_id->number);
+ svn_string_t *origin_id_str
+ = apr_hash_get(node_origins, node_id_ptr, len);
+
if (origin_id_str)
- *origin_id = svn_fs_fs__id_parse(origin_id_str->data,
- origin_id_str->len, pool);
+ SVN_ERR(svn_fs_fs__id_parse(origin_id,
+ apr_pstrdup(pool, origin_id_str->data),
+ pool));
}
return SVN_NO_ERROR;
}
@@ -9525,7 +1984,7 @@ svn_fs_fs__get_node_origin(const svn_fs_id_t **origin_id,
static svn_error_t *
set_node_origins_for_file(svn_fs_t *fs,
const char *node_origins_path,
- const char *node_id,
+ const svn_fs_fs__id_part_t *node_id,
svn_string_t *node_rev_id,
apr_pool_t *pool)
{
@@ -9534,6 +1993,10 @@ set_node_origins_for_file(svn_fs_t *fs,
apr_hash_t *origins_hash;
svn_string_t *old_node_rev_id;
+ /* the hash serialization functions require strings as keys */
+ char node_id_ptr[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__ui64tobase36(node_id_ptr, node_id->number);
+
SVN_ERR(svn_fs_fs__ensure_dir_exists(svn_dirent_join(fs->path,
PATH_NODE_ORIGINS_DIR,
pool),
@@ -9546,16 +2009,17 @@ set_node_origins_for_file(svn_fs_t *fs,
if (! origins_hash)
origins_hash = apr_hash_make(pool);
- old_node_rev_id = svn_hash_gets(origins_hash, node_id);
+ old_node_rev_id = apr_hash_get(origins_hash, node_id_ptr, len);
if (old_node_rev_id && !svn_string_compare(node_rev_id, old_node_rev_id))
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
_("Node origin for '%s' exists with a different "
"value (%s) than what we were about to store "
"(%s)"),
- node_id, old_node_rev_id->data, node_rev_id->data);
+ node_id_ptr, old_node_rev_id->data,
+ node_rev_id->data);
- svn_hash_sets(origins_hash, node_id, node_rev_id);
+ apr_hash_set(origins_hash, node_id_ptr, len, node_rev_id);
/* Sure, there's a race condition here. Two processes could be
trying to add different cache elements to the same file at the
@@ -9578,12 +2042,12 @@ set_node_origins_for_file(svn_fs_t *fs,
svn_error_t *
svn_fs_fs__set_node_origin(svn_fs_t *fs,
- const char *node_id,
+ const svn_fs_fs__id_part_t *node_id,
const svn_fs_id_t *node_rev_id,
apr_pool_t *pool)
{
svn_error_t *err;
- const char *filename = path_node_origin(fs, node_id, pool);
+ const char *filename = svn_fs_fs__path_node_origin(fs, node_id, pool);
err = set_node_origins_for_file(fs, filename,
node_id,
@@ -9599,128 +2063,6 @@ svn_fs_fs__set_node_origin(svn_fs_t *fs,
}
-svn_error_t *
-svn_fs_fs__list_transactions(apr_array_header_t **names_p,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- const char *txn_dir;
- apr_hash_t *dirents;
- apr_hash_index_t *hi;
- apr_array_header_t *names;
- apr_size_t ext_len = strlen(PATH_EXT_TXN);
-
- names = apr_array_make(pool, 1, sizeof(const char *));
-
- /* Get the transactions directory. */
- txn_dir = svn_dirent_join(fs->path, PATH_TXNS_DIR, pool);
-
- /* Now find a listing of this directory. */
- SVN_ERR(svn_io_get_dirents3(&dirents, txn_dir, TRUE, pool, pool));
-
- /* Loop through all the entries and return anything that ends with '.txn'. */
- for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
- {
- const char *name = svn__apr_hash_index_key(hi);
- apr_ssize_t klen = svn__apr_hash_index_klen(hi);
- const char *id;
-
- /* The name must end with ".txn" to be considered a transaction. */
- if ((apr_size_t) klen <= ext_len
- || (strcmp(name + klen - ext_len, PATH_EXT_TXN)) != 0)
- continue;
-
- /* Truncate the ".txn" extension and store the ID. */
- id = apr_pstrndup(pool, name, strlen(name) - ext_len);
- APR_ARRAY_PUSH(names, const char *) = id;
- }
-
- *names_p = names;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__open_txn(svn_fs_txn_t **txn_p,
- svn_fs_t *fs,
- const char *name,
- apr_pool_t *pool)
-{
- svn_fs_txn_t *txn;
- svn_node_kind_t kind;
- transaction_t *local_txn;
-
- /* First check to see if the directory exists. */
- SVN_ERR(svn_io_check_path(path_txn_dir(fs, name, pool), &kind, pool));
-
- /* Did we find it? */
- if (kind != svn_node_dir)
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_TRANSACTION, NULL,
- _("No such transaction '%s'"),
- name);
-
- txn = apr_pcalloc(pool, sizeof(*txn));
-
- /* Read in the root node of this transaction. */
- txn->id = apr_pstrdup(pool, name);
- txn->fs = fs;
-
- SVN_ERR(svn_fs_fs__get_txn(&local_txn, fs, name, pool));
-
- txn->base_rev = svn_fs_fs__id_rev(local_txn->base_id);
-
- txn->vtable = &txn_vtable;
- *txn_p = txn;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__txn_proplist(apr_hash_t **table_p,
- svn_fs_txn_t *txn,
- apr_pool_t *pool)
-{
- apr_hash_t *proplist = apr_hash_make(pool);
- SVN_ERR(get_txn_proplist(proplist, txn->fs, txn->id, pool));
- *table_p = proplist;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__delete_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *pool)
-{
- node_revision_t *noderev;
-
- SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool));
-
- /* Delete any mutable property representation. */
- if (noderev->prop_rep && noderev->prop_rep->txn_id)
- SVN_ERR(svn_io_remove_file2(path_txn_node_props(fs, id, pool), FALSE,
- pool));
-
- /* Delete any mutable data representation. */
- if (noderev->data_rep && noderev->data_rep->txn_id
- && noderev->kind == svn_node_dir)
- {
- fs_fs_data_t *ffd = fs->fsap_data;
- SVN_ERR(svn_io_remove_file2(path_txn_node_children(fs, id, pool), FALSE,
- pool));
-
- /* remove the corresponding entry from the cache, if such exists */
- if (ffd->txn_dir_cache)
- {
- const char *key = svn_fs_fs__id_unparse(id, pool)->data;
- SVN_ERR(svn_cache__set(ffd->txn_dir_cache, key, NULL, pool));
- }
- }
-
- return svn_io_remove_file2(path_txn_node_rev(fs, id, pool), FALSE, pool);
-}
-
-
/*** Revisions ***/
@@ -9734,7 +2076,7 @@ svn_fs_fs__revision_prop(svn_string_t **value_p,
apr_hash_t *table;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
- SVN_ERR(svn_fs_fs__revision_proplist(&table, fs, rev, pool));
+ SVN_ERR(svn_fs_fs__get_revision_proplist(&table, fs, rev, pool));
*value_p = svn_hash_gets(table, propname);
@@ -9760,7 +2102,7 @@ change_rev_prop_body(void *baton, apr_pool_t *pool)
struct change_rev_prop_baton *cb = baton;
apr_hash_t *table;
- SVN_ERR(svn_fs_fs__revision_proplist(&table, cb->fs, cb->rev, pool));
+ SVN_ERR(svn_fs_fs__get_revision_proplist(&table, cb->fs, cb->rev, pool));
if (cb->old_value_p)
{
@@ -9780,7 +2122,7 @@ change_rev_prop_body(void *baton, apr_pool_t *pool)
}
svn_hash_sets(table, cb->name, cb->value);
- return set_revision_proplist(cb->fs, cb->rev, table, pool);
+ return svn_fs_fs__set_revision_proplist(cb->fs, cb->rev, table, pool);
}
svn_error_t *
@@ -9804,1849 +2146,60 @@ svn_fs_fs__change_rev_prop(svn_fs_t *fs,
return svn_fs_fs__with_write_lock(fs, change_rev_prop_body, &cb, pool);
}
-
-/*** Transactions ***/
-
svn_error_t *
-svn_fs_fs__get_txn_ids(const svn_fs_id_t **root_id_p,
- const svn_fs_id_t **base_root_id_p,
+svn_fs_fs__info_format(int *fs_format,
+ svn_version_t **supports_version,
svn_fs_t *fs,
- const char *txn_name,
- apr_pool_t *pool)
-{
- transaction_t *txn;
- SVN_ERR(svn_fs_fs__get_txn(&txn, fs, txn_name, pool));
- *root_id_p = txn->root_id;
- *base_root_id_p = txn->base_id;
- return SVN_NO_ERROR;
-}
-
-
-/* Generic transaction operations. */
-
-svn_error_t *
-svn_fs_fs__txn_prop(svn_string_t **value_p,
- svn_fs_txn_t *txn,
- const char *propname,
- apr_pool_t *pool)
-{
- apr_hash_t *table;
- svn_fs_t *fs = txn->fs;
-
- SVN_ERR(svn_fs__check_fs(fs, TRUE));
- SVN_ERR(svn_fs_fs__txn_proplist(&table, txn, pool));
-
- *value_p = svn_hash_gets(table, propname);
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__begin_txn(svn_fs_txn_t **txn_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_uint32_t flags,
- apr_pool_t *pool)
-{
- svn_string_t date;
- svn_prop_t prop;
- apr_array_header_t *props = apr_array_make(pool, 3, sizeof(svn_prop_t));
-
- SVN_ERR(svn_fs__check_fs(fs, TRUE));
-
- SVN_ERR(svn_fs_fs__create_txn(txn_p, fs, rev, pool));
-
- /* Put a datestamp on the newly created txn, so we always know
- exactly how old it is. (This will help sysadmins identify
- long-abandoned txns that may need to be manually removed.) When
- a txn is promoted to a revision, this property will be
- automatically overwritten with a revision datestamp. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
-
- prop.name = SVN_PROP_REVISION_DATE;
- prop.value = &date;
- APR_ARRAY_PUSH(props, svn_prop_t) = prop;
-
- /* Set temporary txn props that represent the requested 'flags'
- behaviors. */
- if (flags & SVN_FS_TXN_CHECK_OOD)
- {
- prop.name = SVN_FS__PROP_TXN_CHECK_OOD;
- prop.value = svn_string_create("true", pool);
- APR_ARRAY_PUSH(props, svn_prop_t) = prop;
- }
-
- if (flags & SVN_FS_TXN_CHECK_LOCKS)
- {
- prop.name = SVN_FS__PROP_TXN_CHECK_LOCKS;
- prop.value = svn_string_create("true", pool);
- APR_ARRAY_PUSH(props, svn_prop_t) = prop;
- }
-
- return svn_fs_fs__change_txn_props(*txn_p, props, pool);
-}
-
-
-/****** Packing FSFS shards *********/
-
-/* Write a file FILENAME in directory FS_PATH, containing a single line
- * with the number REVNUM in ASCII decimal. Move the file into place
- * atomically, overwriting any existing file.
- *
- * Similar to write_current(). */
-static svn_error_t *
-write_revnum_file(const char *fs_path,
- const char *filename,
- svn_revnum_t revnum,
- apr_pool_t *scratch_pool)
-{
- const char *final_path, *tmp_path;
- svn_stream_t *tmp_stream;
-
- final_path = svn_dirent_join(fs_path, filename, scratch_pool);
- SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_path, fs_path,
- svn_io_file_del_none,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_stream_printf(tmp_stream, scratch_pool, "%ld\n", revnum));
- SVN_ERR(svn_stream_close(tmp_stream));
- SVN_ERR(move_into_place(tmp_path, final_path, final_path, scratch_pool));
- return SVN_NO_ERROR;
-}
-
-/* Pack the revision SHARD containing exactly MAX_FILES_PER_DIR revisions
- * from SHARD_PATH into the PACK_FILE_DIR, using POOL for allocations.
- * CANCEL_FUNC and CANCEL_BATON are what you think they are.
- *
- * If for some reason we detect a partial packing already performed, we
- * remove the pack file and start again.
- */
-static svn_error_t *
-pack_rev_shard(const char *pack_file_dir,
- const char *shard_path,
- apr_int64_t shard,
- int max_files_per_dir,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- const char *pack_file_path, *manifest_file_path;
- svn_stream_t *pack_stream, *manifest_stream;
- svn_revnum_t start_rev, end_rev, rev;
- apr_off_t next_offset;
- apr_pool_t *iterpool;
-
- /* Some useful paths. */
- pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
- manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST, pool);
-
- /* Remove any existing pack file for this shard, since it is incomplete. */
- SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
- pool));
-
- /* Create the new directory and pack and manifest files. */
- SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, pool));
- SVN_ERR(svn_stream_open_writable(&pack_stream, pack_file_path, pool,
- pool));
- SVN_ERR(svn_stream_open_writable(&manifest_stream, manifest_file_path,
- pool, pool));
-
- start_rev = (svn_revnum_t) (shard * max_files_per_dir);
- end_rev = (svn_revnum_t) ((shard + 1) * (max_files_per_dir) - 1);
- next_offset = 0;
- iterpool = svn_pool_create(pool);
-
- /* Iterate over the revisions in this shard, squashing them together. */
- for (rev = start_rev; rev <= end_rev; rev++)
- {
- svn_stream_t *rev_stream;
- apr_finfo_t finfo;
- const char *path;
-
- svn_pool_clear(iterpool);
-
- /* Get the size of the file. */
- path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
- iterpool);
- SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
-
- /* Update the manifest. */
- SVN_ERR(svn_stream_printf(manifest_stream, iterpool, "%" APR_OFF_T_FMT
- "\n", next_offset));
- next_offset += finfo.size;
-
- /* Copy all the bits from the rev file to the end of the pack file. */
- SVN_ERR(svn_stream_open_readonly(&rev_stream, path, iterpool, iterpool));
- SVN_ERR(svn_stream_copy3(rev_stream, svn_stream_disown(pack_stream,
- iterpool),
- cancel_func, cancel_baton, iterpool));
- }
-
- SVN_ERR(svn_stream_close(manifest_stream));
- SVN_ERR(svn_stream_close(pack_stream));
- SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, iterpool));
- SVN_ERR(svn_io_set_file_read_only(pack_file_path, FALSE, iterpool));
- SVN_ERR(svn_io_set_file_read_only(manifest_file_path, FALSE, iterpool));
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Copy revprop files for revisions [START_REV, END_REV) from SHARD_PATH
- * to the pack file at PACK_FILE_NAME in PACK_FILE_DIR.
- *
- * The file sizes have already been determined and written to SIZES.
- * Please note that this function will be executed while the filesystem
- * has been locked and that revprops files will therefore not be modified
- * while the pack is in progress.
- *
- * COMPRESSION_LEVEL defines how well the resulting pack file shall be
- * compressed or whether is shall be compressed at all. TOTAL_SIZE is
- * a hint on which initial buffer size we should use to hold the pack file
- * content.
- *
- * CANCEL_FUNC and CANCEL_BATON are used as usual. Temporary allocations
- * are done in SCRATCH_POOL.
- */
-static svn_error_t *
-copy_revprops(const char *pack_file_dir,
- const char *pack_filename,
- const char *shard_path,
- svn_revnum_t start_rev,
- svn_revnum_t end_rev,
- apr_array_header_t *sizes,
- apr_size_t total_size,
- int compression_level,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- svn_stream_t *pack_stream;
- apr_file_t *pack_file;
- svn_revnum_t rev;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- svn_stream_t *stream;
-
- /* create empty data buffer and a write stream on top of it */
- svn_stringbuf_t *uncompressed
- = svn_stringbuf_create_ensure(total_size, scratch_pool);
- svn_stringbuf_t *compressed
- = svn_stringbuf_create_empty(scratch_pool);
- pack_stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
-
- /* write the pack file header */
- SVN_ERR(serialize_revprops_header(pack_stream, start_rev, sizes, 0,
- sizes->nelts, iterpool));
-
- /* Some useful paths. */
- SVN_ERR(svn_io_file_open(&pack_file, svn_dirent_join(pack_file_dir,
- pack_filename,
- scratch_pool),
- APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
- scratch_pool));
-
- /* Iterate over the revisions in this shard, squashing them together. */
- for (rev = start_rev; rev <= end_rev; rev++)
- {
- const char *path;
-
- svn_pool_clear(iterpool);
-
- /* Construct the file name. */
- path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
- iterpool);
-
- /* Copy all the bits from the non-packed revprop file to the end of
- * the pack file. */
- SVN_ERR(svn_stream_open_readonly(&stream, path, iterpool, iterpool));
- SVN_ERR(svn_stream_copy3(stream, pack_stream,
- cancel_func, cancel_baton, iterpool));
- }
-
- /* flush stream buffers to content buffer */
- SVN_ERR(svn_stream_close(pack_stream));
-
- /* compress the content (or just store it for COMPRESSION_LEVEL 0) */
- SVN_ERR(svn__compress(svn_stringbuf__morph_into_string(uncompressed),
- compressed, compression_level));
-
- /* write the pack file content to disk */
- stream = svn_stream_from_aprfile2(pack_file, FALSE, scratch_pool);
- SVN_ERR(svn_stream_write(stream, compressed->data, &compressed->len));
- SVN_ERR(svn_stream_close(stream));
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* For the revprop SHARD at SHARD_PATH with exactly MAX_FILES_PER_DIR
- * revprop files in it, create a packed shared at PACK_FILE_DIR.
- *
- * COMPRESSION_LEVEL defines how well the resulting pack file shall be
- * compressed or whether is shall be compressed at all. Individual pack
- * file containing more than one revision will be limited to a size of
- * MAX_PACK_SIZE bytes before compression.
- *
- * CANCEL_FUNC and CANCEL_BATON are used in the usual way. Temporary
- * allocations are done in SCRATCH_POOL.
- */
-static svn_error_t *
-pack_revprops_shard(const char *pack_file_dir,
- const char *shard_path,
- apr_int64_t shard,
- int max_files_per_dir,
- apr_off_t max_pack_size,
- int compression_level,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- const char *manifest_file_path, *pack_filename = NULL;
- svn_stream_t *manifest_stream;
- svn_revnum_t start_rev, end_rev, rev;
- apr_off_t total_size;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- apr_array_header_t *sizes;
-
- /* Some useful paths. */
- manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST,
- scratch_pool);
-
- /* Remove any existing pack file for this shard, since it is incomplete. */
- SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
- scratch_pool));
-
- /* Create the new directory and manifest file stream. */
- SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, scratch_pool));
- SVN_ERR(svn_stream_open_writable(&manifest_stream, manifest_file_path,
- scratch_pool, scratch_pool));
-
- /* revisions to handle. Special case: revision 0 */
- start_rev = (svn_revnum_t) (shard * max_files_per_dir);
- end_rev = (svn_revnum_t) ((shard + 1) * (max_files_per_dir) - 1);
- if (start_rev == 0)
- ++start_rev;
-
- /* initialize the revprop size info */
- sizes = apr_array_make(scratch_pool, max_files_per_dir, sizeof(apr_off_t));
- total_size = 2 * SVN_INT64_BUFFER_SIZE;
-
- /* Iterate over the revisions in this shard, determine their size and
- * squashing them together into pack files. */
- for (rev = start_rev; rev <= end_rev; rev++)
- {
- apr_finfo_t finfo;
- const char *path;
-
- svn_pool_clear(iterpool);
-
- /* Get the size of the file. */
- path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
- iterpool);
- SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
-
- /* if we already have started a pack file and this revprop cannot be
- * appended to it, write the previous pack file. */
- if (sizes->nelts != 0 &&
- total_size + SVN_INT64_BUFFER_SIZE + finfo.size > max_pack_size)
- {
- SVN_ERR(copy_revprops(pack_file_dir, pack_filename, shard_path,
- start_rev, rev-1, sizes, (apr_size_t)total_size,
- compression_level, cancel_func, cancel_baton,
- iterpool));
-
- /* next pack file starts empty again */
- apr_array_clear(sizes);
- total_size = 2 * SVN_INT64_BUFFER_SIZE;
- start_rev = rev;
- }
-
- /* Update the manifest. Allocate a file name for the current pack
- * file if it is a new one */
- if (sizes->nelts == 0)
- pack_filename = apr_psprintf(scratch_pool, "%ld.0", rev);
-
- SVN_ERR(svn_stream_printf(manifest_stream, iterpool, "%s\n",
- pack_filename));
-
- /* add to list of files to put into the current pack file */
- APR_ARRAY_PUSH(sizes, apr_off_t) = finfo.size;
- total_size += SVN_INT64_BUFFER_SIZE + finfo.size;
- }
-
- /* write the last pack file */
- if (sizes->nelts != 0)
- SVN_ERR(copy_revprops(pack_file_dir, pack_filename, shard_path,
- start_rev, rev-1, sizes, (apr_size_t)total_size,
- compression_level, cancel_func, cancel_baton,
- iterpool));
-
- /* flush the manifest file and update permissions */
- SVN_ERR(svn_stream_close(manifest_stream));
- SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, iterpool));
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Delete the non-packed revprop SHARD at SHARD_PATH with exactly
- * MAX_FILES_PER_DIR revprop files in it. If this is shard 0, keep the
- * revprop file for revision 0.
- *
- * CANCEL_FUNC and CANCEL_BATON are used in the usual way. Temporary
- * allocations are done in SCRATCH_POOL.
- */
-static svn_error_t *
-delete_revprops_shard(const char *shard_path,
- apr_int64_t shard,
- int max_files_per_dir,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- if (shard == 0)
- {
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- int i;
-
- /* delete all files except the one for revision 0 */
- for (i = 1; i < max_files_per_dir; ++i)
- {
- const char *path = svn_dirent_join(shard_path,
- apr_psprintf(iterpool, "%d", i),
- iterpool);
- if (cancel_func)
- SVN_ERR((*cancel_func)(cancel_baton));
-
- SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
- svn_pool_clear(iterpool);
- }
-
- svn_pool_destroy(iterpool);
- }
- else
- SVN_ERR(svn_io_remove_dir2(shard_path, TRUE,
- cancel_func, cancel_baton, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* In the file system at FS_PATH, pack the SHARD in REVS_DIR and
- * REVPROPS_DIR containing exactly MAX_FILES_PER_DIR revisions, using POOL
- * for allocations. REVPROPS_DIR will be NULL if revprop packing is not
- * supported. COMPRESSION_LEVEL and MAX_PACK_SIZE will be ignored in that
- * case.
- *
- * CANCEL_FUNC and CANCEL_BATON are what you think they are; similarly
- * NOTIFY_FUNC and NOTIFY_BATON.
- *
- * If for some reason we detect a partial packing already performed, we
- * remove the pack file and start again.
- */
-static svn_error_t *
-pack_shard(const char *revs_dir,
- const char *revsprops_dir,
- const char *fs_path,
- apr_int64_t shard,
- int max_files_per_dir,
- apr_off_t max_pack_size,
- int compression_level,
- svn_fs_pack_notify_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- const char *rev_shard_path, *rev_pack_file_dir;
- const char *revprops_shard_path, *revprops_pack_file_dir;
-
- /* Notify caller we're starting to pack this shard. */
- if (notify_func)
- SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_start,
- pool));
-
- /* Some useful paths. */
- rev_pack_file_dir = svn_dirent_join(revs_dir,
- apr_psprintf(pool,
- "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
- shard),
- pool);
- rev_shard_path = svn_dirent_join(revs_dir,
- apr_psprintf(pool, "%" APR_INT64_T_FMT, shard),
- pool);
-
- /* pack the revision content */
- SVN_ERR(pack_rev_shard(rev_pack_file_dir, rev_shard_path,
- shard, max_files_per_dir,
- cancel_func, cancel_baton, pool));
-
- /* if enabled, pack the revprops in an equivalent way */
- if (revsprops_dir)
- {
- revprops_pack_file_dir = svn_dirent_join(revsprops_dir,
- apr_psprintf(pool,
- "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
- shard),
- pool);
- revprops_shard_path = svn_dirent_join(revsprops_dir,
- apr_psprintf(pool, "%" APR_INT64_T_FMT, shard),
- pool);
-
- SVN_ERR(pack_revprops_shard(revprops_pack_file_dir, revprops_shard_path,
- shard, max_files_per_dir,
- (int)(0.9 * max_pack_size),
- compression_level,
- cancel_func, cancel_baton, pool));
- }
-
- /* Update the min-unpacked-rev file to reflect our newly packed shard.
- * (This doesn't update ffd->min_unpacked_rev. That will be updated by
- * update_min_unpacked_rev() when necessary.) */
- SVN_ERR(write_revnum_file(fs_path, PATH_MIN_UNPACKED_REV,
- (svn_revnum_t)((shard + 1) * max_files_per_dir),
- pool));
-
- /* Finally, remove the existing shard directories. */
- SVN_ERR(svn_io_remove_dir2(rev_shard_path, TRUE,
- cancel_func, cancel_baton, pool));
- if (revsprops_dir)
- SVN_ERR(delete_revprops_shard(revprops_shard_path,
- shard, max_files_per_dir,
- cancel_func, cancel_baton, pool));
-
- /* Notify caller we're starting to pack this shard. */
- if (notify_func)
- SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_end,
- pool));
-
- return SVN_NO_ERROR;
-}
-
-struct pack_baton
-{
- svn_fs_t *fs;
- svn_fs_pack_notify_t notify_func;
- void *notify_baton;
- svn_cancel_func_t cancel_func;
- void *cancel_baton;
-};
-
-
-/* The work-horse for svn_fs_fs__pack, called with the FS write lock.
- This implements the svn_fs_fs__with_write_lock() 'body' callback
- type. BATON is a 'struct pack_baton *'.
-
- WARNING: if you add a call to this function, please note:
- The code currently assumes that any piece of code running with
- the write-lock set can rely on the ffd->min_unpacked_rev and
- ffd->min_unpacked_revprop caches to be up-to-date (and, by
- extension, on not having to use a retry when calling
- svn_fs_fs__path_rev_absolute() and friends). If you add a call
- to this function, consider whether you have to call
- update_min_unpacked_rev().
- See this thread: http://thread.gmane.org/1291206765.3782.3309.camel@edith
- */
-static svn_error_t *
-pack_body(void *baton,
- apr_pool_t *pool)
-{
- struct pack_baton *pb = baton;
- fs_fs_data_t ffd = {0};
- apr_int64_t completed_shards;
- apr_int64_t i;
- svn_revnum_t youngest;
- apr_pool_t *iterpool;
- const char *rev_data_path;
- const char *revprops_data_path = NULL;
-
- /* read repository settings */
- SVN_ERR(read_format(&ffd.format, &ffd.max_files_per_dir,
- path_format(pb->fs, pool), pool));
- SVN_ERR(check_format(ffd.format));
- SVN_ERR(read_config(&ffd, pb->fs->path, pool));
-
- /* If the repository isn't a new enough format, we don't support packing.
- Return a friendly error to that effect. */
- if (ffd.format < SVN_FS_FS__MIN_PACKED_FORMAT)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
- ffd.format);
-
- /* If we aren't using sharding, we can't do any packing, so quit. */
- if (!ffd.max_files_per_dir)
- return SVN_NO_ERROR;
-
- SVN_ERR(read_min_unpacked_rev(&ffd.min_unpacked_rev,
- path_min_unpacked_rev(pb->fs, pool),
- pool));
-
- SVN_ERR(get_youngest(&youngest, pb->fs->path, pool));
- completed_shards = (youngest + 1) / ffd.max_files_per_dir;
-
- /* See if we've already completed all possible shards thus far. */
- if (ffd.min_unpacked_rev == (completed_shards * ffd.max_files_per_dir))
- return SVN_NO_ERROR;
-
- rev_data_path = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
- if (ffd.format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
- revprops_data_path = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
- pool);
-
- iterpool = svn_pool_create(pool);
- for (i = ffd.min_unpacked_rev / ffd.max_files_per_dir;
- i < completed_shards;
- i++)
- {
- svn_pool_clear(iterpool);
-
- if (pb->cancel_func)
- SVN_ERR(pb->cancel_func(pb->cancel_baton));
-
- SVN_ERR(pack_shard(rev_data_path, revprops_data_path,
- pb->fs->path, i, ffd.max_files_per_dir,
- ffd.revprop_pack_size,
- ffd.compress_packed_revprops
- ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
- : SVN_DELTA_COMPRESSION_LEVEL_NONE,
- pb->notify_func, pb->notify_baton,
- pb->cancel_func, pb->cancel_baton, iterpool));
- }
-
- svn_pool_destroy(iterpool);
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__pack(svn_fs_t *fs,
- svn_fs_pack_notify_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- struct pack_baton pb = { 0 };
- pb.fs = fs;
- pb.notify_func = notify_func;
- pb.notify_baton = notify_baton;
- pb.cancel_func = cancel_func;
- pb.cancel_baton = cancel_baton;
- return svn_fs_fs__with_write_lock(fs, pack_body, &pb, pool);
-}
-
-
-/** Verifying. **/
-
-/* Baton type expected by verify_walker(). The purpose is to reuse open
- * rev / pack file handles between calls. Its contents need to be cleaned
- * periodically to limit resource usage.
- */
-typedef struct verify_walker_baton_t
-{
- /* number of calls to verify_walker() since the last clean */
- int iteration_count;
-
- /* number of files opened since the last clean */
- int file_count;
-
- /* progress notification callback to invoke periodically (may be NULL) */
- svn_fs_progress_notify_func_t notify_func;
-
- /* baton to use with NOTIFY_FUNC */
- void *notify_baton;
-
- /* remember the last revision for which we called notify_func */
- svn_revnum_t last_notified_revision;
-
- /* current file handle (or NULL) */
- apr_file_t *file_hint;
-
- /* corresponding revision (or SVN_INVALID_REVNUM) */
- svn_revnum_t rev_hint;
-
- /* pool to use for the file handles etc. */
- apr_pool_t *pool;
-} verify_walker_baton_t;
-
-/* Used by svn_fs_fs__verify().
- Implements svn_fs_fs__walk_rep_reference().walker. */
-static svn_error_t *
-verify_walker(representation_t *rep,
- void *baton,
- svn_fs_t *fs,
- apr_pool_t *scratch_pool)
-{
- struct rep_state *rs;
- struct rep_args *rep_args;
-
- if (baton)
- {
- verify_walker_baton_t *walker_baton = baton;
- apr_file_t * previous_file;
-
- /* notify and free resources periodically */
- if ( walker_baton->iteration_count > 1000
- || walker_baton->file_count > 16)
- {
- if ( walker_baton->notify_func
- && rep->revision != walker_baton->last_notified_revision)
- {
- walker_baton->notify_func(rep->revision,
- walker_baton->notify_baton,
- scratch_pool);
- walker_baton->last_notified_revision = rep->revision;
- }
-
- svn_pool_clear(walker_baton->pool);
-
- walker_baton->iteration_count = 0;
- walker_baton->file_count = 0;
- walker_baton->file_hint = NULL;
- walker_baton->rev_hint = SVN_INVALID_REVNUM;
- }
-
- /* access the repo data */
- previous_file = walker_baton->file_hint;
- SVN_ERR(create_rep_state(&rs, &rep_args, &walker_baton->file_hint,
- &walker_baton->rev_hint, rep, fs,
- walker_baton->pool));
-
- /* update resource usage counters */
- walker_baton->iteration_count++;
- if (previous_file != walker_baton->file_hint)
- walker_baton->file_count++;
- }
- else
- {
- /* ### Should this be using read_rep_line() directly? */
- SVN_ERR(create_rep_state(&rs, &rep_args, NULL, NULL, rep, fs,
- scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__verify(svn_fs_t *fs,
- svn_revnum_t start,
- svn_revnum_t end,
- svn_fs_progress_notify_func_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- fs_fs_data_t *ffd = fs->fsap_data;
- svn_boolean_t exists;
- svn_revnum_t youngest = ffd->youngest_rev_cache; /* cache is current */
-
- if (ffd->format < SVN_FS_FS__MIN_REP_SHARING_FORMAT)
- return SVN_NO_ERROR;
-
- /* Input validation. */
- if (! SVN_IS_VALID_REVNUM(start))
- start = 0;
- if (! SVN_IS_VALID_REVNUM(end))
- end = youngest;
- SVN_ERR(ensure_revision_exists(fs, start, pool));
- SVN_ERR(ensure_revision_exists(fs, end, pool));
-
- /* rep-cache verification. */
- SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, fs, pool));
- if (exists)
- {
- /* provide a baton to allow the reuse of open file handles between
- iterations (saves 2/3 of OS level file operations). */
- verify_walker_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
- baton->rev_hint = SVN_INVALID_REVNUM;
- baton->pool = svn_pool_create(pool);
- baton->last_notified_revision = SVN_INVALID_REVNUM;
- baton->notify_func = notify_func;
- baton->notify_baton = notify_baton;
-
- /* tell the user that we are now ready to do *something* */
- if (notify_func)
- notify_func(SVN_INVALID_REVNUM, notify_baton, baton->pool);
-
- /* Do not attempt to walk the rep-cache database if its file does
- not exist, since doing so would create it --- which may confuse
- the administrator. Don't take any lock. */
- SVN_ERR(svn_fs_fs__walk_rep_reference(fs, start, end,
- verify_walker, baton,
- cancel_func, cancel_baton,
- pool));
-
- /* walker resource cleanup */
- svn_pool_destroy(baton->pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/** Hotcopy. **/
-
-/* Like svn_io_dir_file_copy(), but doesn't copy files that exist at
- * the destination and do not differ in terms of kind, size, and mtime. */
-static svn_error_t *
-hotcopy_io_dir_file_copy(const char *src_path,
- const char *dst_path,
- const char *file,
- apr_pool_t *scratch_pool)
-{
- const svn_io_dirent2_t *src_dirent;
- const svn_io_dirent2_t *dst_dirent;
- const char *src_target;
- const char *dst_target;
-
- /* Does the destination already exist? If not, we must copy it. */
- dst_target = svn_dirent_join(dst_path, file, scratch_pool);
- SVN_ERR(svn_io_stat_dirent2(&dst_dirent, dst_target, FALSE, TRUE,
- scratch_pool, scratch_pool));
- if (dst_dirent->kind != svn_node_none)
- {
- /* If the destination's stat information indicates that the file
- * is equal to the source, don't bother copying the file again. */
- src_target = svn_dirent_join(src_path, file, scratch_pool);
- SVN_ERR(svn_io_stat_dirent2(&src_dirent, src_target, FALSE, FALSE,
- scratch_pool, scratch_pool));
- if (src_dirent->kind == dst_dirent->kind &&
- src_dirent->special == dst_dirent->special &&
- src_dirent->filesize == dst_dirent->filesize &&
- src_dirent->mtime <= dst_dirent->mtime)
- return SVN_NO_ERROR;
- }
-
- return svn_error_trace(svn_io_dir_file_copy(src_path, dst_path, file,
- scratch_pool));
-}
-
-/* Set *NAME_P to the UTF-8 representation of directory entry NAME.
- * NAME is in the internal encoding used by APR; PARENT is in
- * UTF-8 and in internal (not local) style.
- *
- * Use PARENT only for generating an error string if the conversion
- * fails because NAME could not be represented in UTF-8. In that
- * case, return a two-level error in which the outer error's message
- * mentions PARENT, but the inner error's message does not mention
- * NAME (except possibly in hex) since NAME may not be printable.
- * Such a compound error at least allows the user to go looking in the
- * right directory for the problem.
- *
- * If there is any other error, just return that error directly.
- *
- * If there is any error, the effect on *NAME_P is undefined.
- *
- * *NAME_P and NAME may refer to the same storage.
- */
-static svn_error_t *
-entry_name_to_utf8(const char **name_p,
- const char *name,
- const char *parent,
- apr_pool_t *pool)
-{
- svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, pool);
- if (err && err->apr_err == APR_EINVAL)
- {
- return svn_error_createf(err->apr_err, err,
- _("Error converting entry "
- "in directory '%s' to UTF-8"),
- svn_dirent_local_style(parent, pool));
- }
- return err;
-}
-
-/* Like svn_io_copy_dir_recursively() but doesn't copy regular files that
- * exist in the destination and do not differ from the source in terms of
- * kind, size, and mtime. */
-static svn_error_t *
-hotcopy_io_copy_dir_recursively(const char *src,
- const char *dst_parent,
- const char *dst_basename,
- svn_boolean_t copy_perms,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- svn_node_kind_t kind;
- apr_status_t status;
- const char *dst_path;
- apr_dir_t *this_dir;
- apr_finfo_t this_entry;
- apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME;
-
- /* Make a subpool for recursion */
- apr_pool_t *subpool = svn_pool_create(pool);
-
- /* The 'dst_path' is simply dst_parent/dst_basename */
- dst_path = svn_dirent_join(dst_parent, dst_basename, pool);
-
- /* Sanity checks: SRC and DST_PARENT are directories, and
- DST_BASENAME doesn't already exist in DST_PARENT. */
- SVN_ERR(svn_io_check_path(src, &kind, subpool));
- if (kind != svn_node_dir)
- return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
- _("Source '%s' is not a directory"),
- svn_dirent_local_style(src, pool));
-
- SVN_ERR(svn_io_check_path(dst_parent, &kind, subpool));
- if (kind != svn_node_dir)
- return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
- _("Destination '%s' is not a directory"),
- svn_dirent_local_style(dst_parent, pool));
-
- SVN_ERR(svn_io_check_path(dst_path, &kind, subpool));
-
- /* Create the new directory. */
- /* ### TODO: copy permissions (needs apr_file_attrs_get()) */
- SVN_ERR(svn_io_make_dir_recursively(dst_path, pool));
-
- /* Loop over the dirents in SRC. ('.' and '..' are auto-excluded) */
- SVN_ERR(svn_io_dir_open(&this_dir, src, subpool));
-
- for (status = apr_dir_read(&this_entry, flags, this_dir);
- status == APR_SUCCESS;
- status = apr_dir_read(&this_entry, flags, this_dir))
- {
- if ((this_entry.name[0] == '.')
- && ((this_entry.name[1] == '\0')
- || ((this_entry.name[1] == '.')
- && (this_entry.name[2] == '\0'))))
- {
- continue;
- }
- else
- {
- const char *entryname_utf8;
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- SVN_ERR(entry_name_to_utf8(&entryname_utf8, this_entry.name,
- src, subpool));
- if (this_entry.filetype == APR_REG) /* regular file */
- {
- SVN_ERR(hotcopy_io_dir_file_copy(src, dst_path, entryname_utf8,
- subpool));
- }
- else if (this_entry.filetype == APR_LNK) /* symlink */
- {
- const char *src_target = svn_dirent_join(src, entryname_utf8,
- subpool);
- const char *dst_target = svn_dirent_join(dst_path,
- entryname_utf8,
- subpool);
- SVN_ERR(svn_io_copy_link(src_target, dst_target,
- subpool));
- }
- else if (this_entry.filetype == APR_DIR) /* recurse */
- {
- const char *src_target;
-
- /* Prevent infinite recursion by filtering off our
- newly created destination path. */
- if (strcmp(src, dst_parent) == 0
- && strcmp(entryname_utf8, dst_basename) == 0)
- continue;
-
- src_target = svn_dirent_join(src, entryname_utf8, subpool);
- SVN_ERR(hotcopy_io_copy_dir_recursively(src_target,
- dst_path,
- entryname_utf8,
- copy_perms,
- cancel_func,
- cancel_baton,
- subpool));
- }
- /* ### support other APR node types someday?? */
-
- }
- }
-
- if (! (APR_STATUS_IS_ENOENT(status)))
- return svn_error_wrap_apr(status, _("Can't read directory '%s'"),
- svn_dirent_local_style(src, pool));
-
- status = apr_dir_close(this_dir);
- if (status)
- return svn_error_wrap_apr(status, _("Error closing directory '%s'"),
- svn_dirent_local_style(src, pool));
-
- /* Free any memory used by recursion */
- svn_pool_destroy(subpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Copy an un-packed revision or revprop file for revision REV from SRC_SUBDIR
- * to DST_SUBDIR. Assume a sharding layout based on MAX_FILES_PER_DIR.
- * Use SCRATCH_POOL for temporary allocations. */
-static svn_error_t *
-hotcopy_copy_shard_file(const char *src_subdir,
- const char *dst_subdir,
- svn_revnum_t rev,
- int max_files_per_dir,
- apr_pool_t *scratch_pool)
-{
- const char *src_subdir_shard = src_subdir,
- *dst_subdir_shard = dst_subdir;
-
- if (max_files_per_dir)
- {
- const char *shard = apr_psprintf(scratch_pool, "%ld",
- rev / max_files_per_dir);
- src_subdir_shard = svn_dirent_join(src_subdir, shard, scratch_pool);
- dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
-
- if (rev % max_files_per_dir == 0)
- {
- SVN_ERR(svn_io_make_dir_recursively(dst_subdir_shard, scratch_pool));
- SVN_ERR(svn_io_copy_perms(dst_subdir, dst_subdir_shard,
- scratch_pool));
- }
- }
-
- SVN_ERR(hotcopy_io_dir_file_copy(src_subdir_shard, dst_subdir_shard,
- apr_psprintf(scratch_pool, "%ld", rev),
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-
-/* Copy a packed shard containing revision REV, and which contains
- * MAX_FILES_PER_DIR revisions, from SRC_FS to DST_FS.
- * Update *DST_MIN_UNPACKED_REV in case the shard is new in DST_FS.
- * Do not re-copy data which already exists in DST_FS.
- * Use SCRATCH_POOL for temporary allocations. */
-static svn_error_t *
-hotcopy_copy_packed_shard(svn_revnum_t *dst_min_unpacked_rev,
- svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- svn_revnum_t rev,
- int max_files_per_dir,
- apr_pool_t *scratch_pool)
-{
- const char *src_subdir;
- const char *dst_subdir;
- const char *packed_shard;
- const char *src_subdir_packed_shard;
- svn_revnum_t revprop_rev;
- apr_pool_t *iterpool;
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
-
- /* Copy the packed shard. */
- src_subdir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, scratch_pool);
- dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, scratch_pool);
- packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
- rev / max_files_per_dir);
- src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
- scratch_pool);
- SVN_ERR(hotcopy_io_copy_dir_recursively(src_subdir_packed_shard,
- dst_subdir, packed_shard,
- TRUE /* copy_perms */,
- NULL /* cancel_func */, NULL,
- scratch_pool));
-
- /* Copy revprops belonging to revisions in this pack. */
- src_subdir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR, scratch_pool);
- dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR, scratch_pool);
-
- if ( src_ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT
- || src_ffd->min_unpacked_rev < rev + max_files_per_dir)
- {
- /* copy unpacked revprops rev by rev */
- iterpool = svn_pool_create(scratch_pool);
- for (revprop_rev = rev;
- revprop_rev < rev + max_files_per_dir;
- revprop_rev++)
- {
- svn_pool_clear(iterpool);
-
- SVN_ERR(hotcopy_copy_shard_file(src_subdir, dst_subdir,
- revprop_rev, max_files_per_dir,
- iterpool));
- }
- svn_pool_destroy(iterpool);
- }
- else
- {
- /* revprop for revision 0 will never be packed */
- if (rev == 0)
- SVN_ERR(hotcopy_copy_shard_file(src_subdir, dst_subdir,
- 0, max_files_per_dir,
- scratch_pool));
-
- /* packed revprops folder */
- packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
- rev / max_files_per_dir);
- src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
- scratch_pool);
- SVN_ERR(hotcopy_io_copy_dir_recursively(src_subdir_packed_shard,
- dst_subdir, packed_shard,
- TRUE /* copy_perms */,
- NULL /* cancel_func */, NULL,
- scratch_pool));
- }
-
- /* If necessary, update the min-unpacked rev file in the hotcopy. */
- if (*dst_min_unpacked_rev < rev + max_files_per_dir)
- {
- *dst_min_unpacked_rev = rev + max_files_per_dir;
- SVN_ERR(write_revnum_file(dst_fs->path, PATH_MIN_UNPACKED_REV,
- *dst_min_unpacked_rev,
- scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-/* If NEW_YOUNGEST is younger than *DST_YOUNGEST, update the 'current'
- * file in DST_FS and set *DST_YOUNGEST to NEW_YOUNGEST.
- * Use SCRATCH_POOL for temporary allocations. */
-static svn_error_t *
-hotcopy_update_current(svn_revnum_t *dst_youngest,
- svn_fs_t *dst_fs,
- svn_revnum_t new_youngest,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- char next_node_id[MAX_KEY_SIZE] = "0";
- char next_copy_id[MAX_KEY_SIZE] = "0";
- fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
-
- if (*dst_youngest >= new_youngest)
- return SVN_NO_ERROR;
-
- /* If necessary, get new current next_node and next_copy IDs. */
- if (dst_ffd->format < SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
- {
- apr_off_t root_offset;
- apr_file_t *rev_file;
- char max_node_id[MAX_KEY_SIZE] = "0";
- char max_copy_id[MAX_KEY_SIZE] = "0";
- apr_size_t len;
-
- if (dst_ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(update_min_unpacked_rev(dst_fs, scratch_pool));
-
- SVN_ERR(open_pack_or_rev_file(&rev_file, dst_fs, new_youngest,
- scratch_pool));
- SVN_ERR(get_root_changes_offset(&root_offset, NULL, rev_file,
- dst_fs, new_youngest, scratch_pool));
- SVN_ERR(recover_find_max_ids(dst_fs, new_youngest, rev_file,
- root_offset, max_node_id, max_copy_id,
- scratch_pool));
- SVN_ERR(svn_io_file_close(rev_file, scratch_pool));
-
- /* We store the _next_ ids. */
- len = strlen(max_node_id);
- svn_fs_fs__next_key(max_node_id, &len, next_node_id);
- len = strlen(max_copy_id);
- svn_fs_fs__next_key(max_copy_id, &len, next_copy_id);
- }
-
- /* Update 'current'. */
- SVN_ERR(write_current(dst_fs, new_youngest, next_node_id, next_copy_id,
- scratch_pool));
-
- *dst_youngest = new_youngest;
-
- return SVN_NO_ERROR;
-}
-
-
-/* Remove revision or revprop files between START_REV (inclusive) and
- * END_REV (non-inclusive) from folder DST_SUBDIR in DST_FS. Assume
- * sharding as per MAX_FILES_PER_DIR.
- * Use SCRATCH_POOL for temporary allocations. */
-static svn_error_t *
-hotcopy_remove_files(svn_fs_t *dst_fs,
- const char *dst_subdir,
- svn_revnum_t start_rev,
- svn_revnum_t end_rev,
- int max_files_per_dir,
- apr_pool_t *scratch_pool)
-{
- const char *shard;
- const char *dst_subdir_shard;
- svn_revnum_t rev;
- apr_pool_t *iterpool;
-
- /* Pre-compute paths for initial shard. */
- shard = apr_psprintf(scratch_pool, "%ld", start_rev / max_files_per_dir);
- dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
-
- iterpool = svn_pool_create(scratch_pool);
- for (rev = start_rev; rev < end_rev; rev++)
- {
- const char *path;
- svn_pool_clear(iterpool);
-
- /* If necessary, update paths for shard. */
- if (rev != start_rev && rev % max_files_per_dir == 0)
- {
- shard = apr_psprintf(iterpool, "%ld", rev / max_files_per_dir);
- dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
- }
-
- /* remove files for REV */
- path = svn_dirent_join(dst_subdir_shard,
- apr_psprintf(iterpool, "%ld", rev),
- iterpool);
-
- /* Make the rev file writable and remove it. */
- SVN_ERR(svn_io_set_file_read_write(path, TRUE, iterpool));
- SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-/* Remove revisions between START_REV (inclusive) and END_REV (non-inclusive)
- * from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
- * Use SCRATCH_POOL for temporary allocations. */
-static svn_error_t *
-hotcopy_remove_rev_files(svn_fs_t *dst_fs,
- svn_revnum_t start_rev,
- svn_revnum_t end_rev,
- int max_files_per_dir,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR_ASSERT(start_rev <= end_rev);
- SVN_ERR(hotcopy_remove_files(dst_fs,
- svn_dirent_join(dst_fs->path,
- PATH_REVS_DIR,
- scratch_pool),
- start_rev, end_rev,
- max_files_per_dir, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Remove revision properties between START_REV (inclusive) and END_REV
- * (non-inclusive) from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
- * Use SCRATCH_POOL for temporary allocations. Revision 0 revprops will
- * not be deleted. */
-static svn_error_t *
-hotcopy_remove_revprop_files(svn_fs_t *dst_fs,
- svn_revnum_t start_rev,
- svn_revnum_t end_rev,
- int max_files_per_dir,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR_ASSERT(start_rev <= end_rev);
-
- /* don't delete rev 0 props */
- SVN_ERR(hotcopy_remove_files(dst_fs,
- svn_dirent_join(dst_fs->path,
- PATH_REVPROPS_DIR,
- scratch_pool),
- start_rev ? start_rev : 1, end_rev,
- max_files_per_dir, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Verify that DST_FS is a suitable destination for an incremental
- * hotcopy from SRC_FS. */
-static svn_error_t *
-hotcopy_incremental_check_preconditions(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- apr_pool_t *pool)
-{
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
- fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
-
- /* We only support incremental hotcopy between the same format. */
- if (src_ffd->format != dst_ffd->format)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("The FSFS format (%d) of the hotcopy source does not match the "
- "FSFS format (%d) of the hotcopy destination; please upgrade "
- "both repositories to the same format"),
- src_ffd->format, dst_ffd->format);
-
- /* Make sure the UUID of source and destination match up.
- * We don't want to copy over a different repository. */
- if (strcmp(src_fs->uuid, dst_fs->uuid) != 0)
- return svn_error_create(SVN_ERR_RA_UUID_MISMATCH, NULL,
- _("The UUID of the hotcopy source does "
- "not match the UUID of the hotcopy "
- "destination"));
-
- /* Also require same shard size. */
- if (src_ffd->max_files_per_dir != dst_ffd->max_files_per_dir)
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("The sharding layout configuration "
- "of the hotcopy source does not match "
- "the sharding layout configuration of "
- "the hotcopy destination"));
- return SVN_NO_ERROR;
-}
-
-/* Remove folder PATH. Ignore errors due to the sub-tree not being empty.
- * CANCEL_FUNC and CANCEL_BATON do the usual thing.
- * Use POOL for temporary allocations.
- */
-static svn_error_t *
-remove_folder(const char *path,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- svn_error_t *err = svn_io_remove_dir2(path, TRUE,
- cancel_func, cancel_baton, pool);
-
- if (err && APR_STATUS_IS_ENOTEMPTY(err->apr_err))
- {
- svn_error_clear(err);
- err = SVN_NO_ERROR;
- }
-
- return svn_error_trace(err);
-}
-
-/* Baton for hotcopy_body(). */
-struct hotcopy_body_baton {
- svn_fs_t *src_fs;
- svn_fs_t *dst_fs;
- svn_boolean_t incremental;
- svn_cancel_func_t cancel_func;
- void *cancel_baton;
-} hotcopy_body_baton;
-
-/* Perform a hotcopy, either normal or incremental.
- *
- * Normal hotcopy assumes that the destination exists as an empty
- * directory. It behaves like an incremental hotcopy except that
- * none of the copied files already exist in the destination.
- *
- * An incremental hotcopy copies only changed or new files to the destination,
- * and removes files from the destination no longer present in the source.
- * While the incremental hotcopy is running, readers should still be able
- * to access the destintation repository without error and should not see
- * revisions currently in progress of being copied. Readers are able to see
- * new fully copied revisions even if the entire incremental hotcopy procedure
- * has not yet completed.
- *
- * Writers are blocked out completely during the entire incremental hotcopy
- * process to ensure consistency. This function assumes that the repository
- * write-lock is held.
- */
-static svn_error_t *
-hotcopy_body(void *baton, apr_pool_t *pool)
-{
- struct hotcopy_body_baton *hbb = baton;
- svn_fs_t *src_fs = hbb->src_fs;
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
- svn_fs_t *dst_fs = hbb->dst_fs;
- fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
- int max_files_per_dir = src_ffd->max_files_per_dir;
- svn_boolean_t incremental = hbb->incremental;
- svn_cancel_func_t cancel_func = hbb->cancel_func;
- void* cancel_baton = hbb->cancel_baton;
- svn_revnum_t src_youngest;
- svn_revnum_t dst_youngest;
- svn_revnum_t rev;
- svn_revnum_t src_min_unpacked_rev;
- svn_revnum_t dst_min_unpacked_rev;
- const char *src_subdir;
- const char *dst_subdir;
- const char *revprop_src_subdir;
- const char *revprop_dst_subdir;
- apr_pool_t *iterpool;
- svn_node_kind_t kind;
-
- /* Try to copy the config.
- *
- * ### We try copying the config file before doing anything else,
- * ### because higher layers will abort the hotcopy if we throw
- * ### an error from this function, and that renders the hotcopy
- * ### unusable anyway. */
- if (src_ffd->format >= SVN_FS_FS__MIN_CONFIG_FILE)
- {
- svn_error_t *err;
-
- err = svn_io_dir_file_copy(src_fs->path, dst_fs->path, PATH_CONFIG,
- pool);
- if (err)
- {
- if (APR_STATUS_IS_ENOENT(err->apr_err))
- {
- /* 1.6.0 to 1.6.11 did not copy the configuration file during
- * hotcopy. So if we're hotcopying a repository which has been
- * created as a hotcopy itself, it's possible that fsfs.conf
- * does not exist. Ask the user to re-create it.
- *
- * ### It would be nice to make this a non-fatal error,
- * ### but this function does not get an svn_fs_t object
- * ### so we have no way of just printing a warning via
- * ### the fs->warning() callback. */
-
- const char *msg;
- const char *src_abspath;
- const char *dst_abspath;
- const char *config_relpath;
- svn_error_t *err2;
-
- config_relpath = svn_dirent_join(src_fs->path, PATH_CONFIG, pool);
- err2 = svn_dirent_get_absolute(&src_abspath, src_fs->path, pool);
- if (err2)
- return svn_error_trace(svn_error_compose_create(err, err2));
- err2 = svn_dirent_get_absolute(&dst_abspath, dst_fs->path, pool);
- if (err2)
- return svn_error_trace(svn_error_compose_create(err, err2));
-
- /* ### hack: strip off the 'db/' directory from paths so
- * ### they make sense to the user */
- src_abspath = svn_dirent_dirname(src_abspath, pool);
- dst_abspath = svn_dirent_dirname(dst_abspath, pool);
-
- msg = apr_psprintf(pool,
- _("Failed to create hotcopy at '%s'. "
- "The file '%s' is missing from the source "
- "repository. Please create this file, for "
- "instance by running 'svnadmin upgrade %s'"),
- dst_abspath, config_relpath, src_abspath);
- return svn_error_quick_wrap(err, msg);
- }
- else
- return svn_error_trace(err);
- }
- }
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Find the youngest revision in the source and destination.
- * We only support hotcopies from sources with an equal or greater amount
- * of revisions than the destination.
- * This also catches the case where users accidentally swap the
- * source and destination arguments. */
- SVN_ERR(get_youngest(&src_youngest, src_fs->path, pool));
- if (incremental)
- {
- SVN_ERR(get_youngest(&dst_youngest, dst_fs->path, pool));
- if (src_youngest < dst_youngest)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("The hotcopy destination already contains more revisions "
- "(%lu) than the hotcopy source contains (%lu); are source "
- "and destination swapped?"),
- dst_youngest, src_youngest);
- }
- else
- dst_youngest = 0;
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Copy the min unpacked rev, and read its value. */
- if (src_ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- {
- const char *min_unpacked_rev_path;
-
- min_unpacked_rev_path = svn_dirent_join(src_fs->path,
- PATH_MIN_UNPACKED_REV,
- pool);
- SVN_ERR(read_min_unpacked_rev(&src_min_unpacked_rev,
- min_unpacked_rev_path,
- pool));
-
- min_unpacked_rev_path = svn_dirent_join(dst_fs->path,
- PATH_MIN_UNPACKED_REV,
- pool);
- SVN_ERR(read_min_unpacked_rev(&dst_min_unpacked_rev,
- min_unpacked_rev_path,
- pool));
-
- /* We only support packs coming from the hotcopy source.
- * The destination should not be packed independently from
- * the source. This also catches the case where users accidentally
- * swap the source and destination arguments. */
- if (src_min_unpacked_rev < dst_min_unpacked_rev)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("The hotcopy destination already contains "
- "more packed revisions (%lu) than the "
- "hotcopy source contains (%lu)"),
- dst_min_unpacked_rev - 1,
- src_min_unpacked_rev - 1);
-
- SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
- PATH_MIN_UNPACKED_REV, pool));
- }
- else
- {
- src_min_unpacked_rev = 0;
- dst_min_unpacked_rev = 0;
- }
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /*
- * Copy the necessary rev files.
- */
-
- src_subdir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, pool);
- dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, pool);
- SVN_ERR(svn_io_make_dir_recursively(dst_subdir, pool));
-
- iterpool = svn_pool_create(pool);
- /* First, copy packed shards. */
- for (rev = 0; rev < src_min_unpacked_rev; rev += max_files_per_dir)
- {
- svn_pool_clear(iterpool);
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Copy the packed shard. */
- SVN_ERR(hotcopy_copy_packed_shard(&dst_min_unpacked_rev,
- src_fs, dst_fs,
- rev, max_files_per_dir,
- iterpool));
-
- /* If necessary, update 'current' to the most recent packed rev,
- * so readers can see new revisions which arrived in this pack. */
- SVN_ERR(hotcopy_update_current(&dst_youngest, dst_fs,
- rev + max_files_per_dir - 1,
- iterpool));
-
- /* Remove revision files which are now packed. */
- if (incremental)
- {
- SVN_ERR(hotcopy_remove_rev_files(dst_fs, rev,
- rev + max_files_per_dir,
- max_files_per_dir, iterpool));
- if (dst_ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
- SVN_ERR(hotcopy_remove_revprop_files(dst_fs, rev,
- rev + max_files_per_dir,
- max_files_per_dir,
- iterpool));
- }
-
- /* Now that all revisions have moved into the pack, the original
- * rev dir can be removed. */
- SVN_ERR(remove_folder(path_rev_shard(dst_fs, rev, iterpool),
- cancel_func, cancel_baton, iterpool));
- if (rev > 0 && dst_ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
- SVN_ERR(remove_folder(path_revprops_shard(dst_fs, rev, iterpool),
- cancel_func, cancel_baton, iterpool));
- }
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Now, copy pairs of non-packed revisions and revprop files.
- * If necessary, update 'current' after copying all files from a shard. */
- SVN_ERR_ASSERT(rev == src_min_unpacked_rev);
- SVN_ERR_ASSERT(src_min_unpacked_rev == dst_min_unpacked_rev);
- revprop_src_subdir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR, pool);
- revprop_dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR, pool);
- SVN_ERR(svn_io_make_dir_recursively(revprop_dst_subdir, pool));
- for (; rev <= src_youngest; rev++)
- {
- svn_error_t *err;
-
- svn_pool_clear(iterpool);
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Copy the rev file. */
- err = hotcopy_copy_shard_file(src_subdir, dst_subdir,
- rev, max_files_per_dir,
- iterpool);
- if (err)
- {
- if (APR_STATUS_IS_ENOENT(err->apr_err) &&
- src_ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- {
- svn_error_clear(err);
-
- /* The source rev file does not exist. This can happen if the
- * source repository is being packed concurrently with this
- * hotcopy operation.
- *
- * If the new revision is now packed, and the youngest revision
- * we're interested in is not inside this pack, try to copy the
- * pack instead.
- *
- * If the youngest revision ended up being packed, don't try
- * to be smart and work around this. Just abort the hotcopy. */
- SVN_ERR(update_min_unpacked_rev(src_fs, pool));
- if (is_packed_rev(src_fs, rev))
- {
- if (is_packed_rev(src_fs, src_youngest))
- return svn_error_createf(
- SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("The assumed HEAD revision (%lu) of the "
- "hotcopy source has been packed while the "
- "hotcopy was in progress; please restart "
- "the hotcopy operation"),
- src_youngest);
-
- SVN_ERR(hotcopy_copy_packed_shard(&dst_min_unpacked_rev,
- src_fs, dst_fs,
- rev, max_files_per_dir,
- iterpool));
- rev = dst_min_unpacked_rev;
- continue;
- }
- else
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- _("Revision %lu disappeared from the "
- "hotcopy source while hotcopy was "
- "in progress"), rev);
- }
- else
- return svn_error_trace(err);
- }
-
- /* Copy the revprop file. */
- SVN_ERR(hotcopy_copy_shard_file(revprop_src_subdir,
- revprop_dst_subdir,
- rev, max_files_per_dir,
- iterpool));
-
- /* After completing a full shard, update 'current'. */
- if (max_files_per_dir && rev % max_files_per_dir == 0)
- SVN_ERR(hotcopy_update_current(&dst_youngest, dst_fs, rev, iterpool));
- }
- svn_pool_destroy(iterpool);
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* We assume that all revisions were copied now, i.e. we didn't exit the
- * above loop early. 'rev' was last incremented during exit of the loop. */
- SVN_ERR_ASSERT(rev == src_youngest + 1);
-
- /* All revisions were copied. Update 'current'. */
- SVN_ERR(hotcopy_update_current(&dst_youngest, dst_fs, src_youngest, pool));
-
- /* Replace the locks tree.
- * This is racy in case readers are currently trying to list locks in
- * the destination. However, we need to get rid of stale locks.
- * This is the simplest way of doing this, so we accept this small race. */
- dst_subdir = svn_dirent_join(dst_fs->path, PATH_LOCKS_DIR, pool);
- SVN_ERR(svn_io_remove_dir2(dst_subdir, TRUE, cancel_func, cancel_baton,
- pool));
- src_subdir = svn_dirent_join(src_fs->path, PATH_LOCKS_DIR, pool);
- SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
- if (kind == svn_node_dir)
- SVN_ERR(svn_io_copy_dir_recursively(src_subdir, dst_fs->path,
- PATH_LOCKS_DIR, TRUE,
- cancel_func, cancel_baton, pool));
-
- /* Now copy the node-origins cache tree. */
- src_subdir = svn_dirent_join(src_fs->path, PATH_NODE_ORIGINS_DIR, pool);
- SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
- if (kind == svn_node_dir)
- SVN_ERR(hotcopy_io_copy_dir_recursively(src_subdir, dst_fs->path,
- PATH_NODE_ORIGINS_DIR, TRUE,
- cancel_func, cancel_baton, pool));
-
- /*
- * NB: Data copied below is only read by writers, not readers.
- * Writers are still locked out at this point.
- */
-
- if (dst_ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
- {
- /* Copy the rep cache and then remove entries for revisions
- * younger than the destination's youngest revision. */
- src_subdir = svn_dirent_join(src_fs->path, REP_CACHE_DB_NAME, pool);
- dst_subdir = svn_dirent_join(dst_fs->path, REP_CACHE_DB_NAME, pool);
- SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
- if (kind == svn_node_file)
- {
- SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
- SVN_ERR(svn_fs_fs__del_rep_reference(dst_fs, dst_youngest, pool));
- }
- }
-
- /* Copy the txn-current file. */
- if (dst_ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
- SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
- PATH_TXN_CURRENT, pool));
-
- /* If a revprop generation file exists in the source filesystem,
- * reset it to zero (since this is on a different path, it will not
- * overlap with data already in cache). Also, clean up stale files
- * used for the named atomics implementation. */
- SVN_ERR(svn_io_check_path(path_revprop_generation(src_fs, pool),
- &kind, pool));
- if (kind == svn_node_file)
- SVN_ERR(write_revprop_generation_file(dst_fs, 0, pool));
-
- SVN_ERR(cleanup_revprop_namespace(dst_fs));
-
- /* Hotcopied FS is complete. Stamp it with a format file. */
- SVN_ERR(write_format(svn_dirent_join(dst_fs->path, PATH_FORMAT, pool),
- dst_ffd->format, max_files_per_dir, TRUE, pool));
-
- return SVN_NO_ERROR;
-}
-
-
-/* Set up shared data between SRC_FS and DST_FS. */
-static void
-hotcopy_setup_shared_fs_data(svn_fs_t *src_fs, svn_fs_t *dst_fs)
-{
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
- fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
-
- /* The common pool and mutexes are shared between src and dst filesystems.
- * During hotcopy we only grab the mutexes for the destination, so there
- * is no risk of dead-lock. We don't write to the src filesystem. Shared
- * data for the src_fs has already been initialised in fs_hotcopy(). */
- dst_ffd->shared = src_ffd->shared;
-}
-
-/* Create an empty filesystem at DST_FS at DST_PATH with the same
- * configuration as SRC_FS (uuid, format, and other parameters).
- * After creation DST_FS has no revisions, not even revision zero. */
-static svn_error_t *
-hotcopy_create_empty_dest(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *dst_path,
- apr_pool_t *pool)
-{
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
- fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
-
- dst_fs->path = apr_pstrdup(pool, dst_path);
-
- dst_ffd->max_files_per_dir = src_ffd->max_files_per_dir;
- dst_ffd->config = src_ffd->config;
- dst_ffd->format = src_ffd->format;
-
- /* Create the revision data directories. */
- if (dst_ffd->max_files_per_dir)
- SVN_ERR(svn_io_make_dir_recursively(path_rev_shard(dst_fs, 0, pool),
- pool));
- else
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(dst_path,
- PATH_REVS_DIR, pool),
- pool));
-
- /* Create the revprops directory. */
- if (src_ffd->max_files_per_dir)
- SVN_ERR(svn_io_make_dir_recursively(path_revprops_shard(dst_fs, 0, pool),
- pool));
- else
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(dst_path,
- PATH_REVPROPS_DIR,
- pool),
- pool));
-
- /* Create the transaction directory. */
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(dst_path, PATH_TXNS_DIR,
- pool),
- pool));
-
- /* Create the protorevs directory. */
- if (dst_ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
- SVN_ERR(svn_io_make_dir_recursively(svn_dirent_join(dst_path,
- PATH_TXN_PROTOS_DIR,
- pool),
- pool));
-
- /* Create the 'current' file. */
- SVN_ERR(svn_io_file_create(svn_fs_fs__path_current(dst_fs, pool),
- (dst_ffd->format >=
- SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT
- ? "0\n" : "0 1 1\n"),
- pool));
+ fs_fs_data_t *ffd = fs->fsap_data;
+ *fs_format = ffd->format;
+ *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
- /* Create lock file and UUID. */
- SVN_ERR(svn_io_file_create(path_lock(dst_fs, pool), "", pool));
- SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, pool));
+ (*supports_version)->major = SVN_VER_MAJOR;
+ (*supports_version)->minor = 1;
+ (*supports_version)->patch = 0;
+ (*supports_version)->tag = "";
- /* Create the min unpacked rev file. */
- if (dst_ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
- SVN_ERR(svn_io_file_create(path_min_unpacked_rev(dst_fs, pool),
- "0\n", pool));
- /* Create the txn-current file if the repository supports
- the transaction sequence file. */
- if (dst_ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
+ switch (ffd->format)
{
- SVN_ERR(svn_io_file_create(path_txn_current(dst_fs, pool),
- "0\n", pool));
- SVN_ERR(svn_io_file_create(path_txn_current_lock(dst_fs, pool),
- "", pool));
+ case 1:
+ break;
+ case 2:
+ (*supports_version)->minor = 4;
+ break;
+ case 3:
+ (*supports_version)->minor = 5;
+ break;
+ case 4:
+ (*supports_version)->minor = 6;
+ break;
+ case 6:
+ (*supports_version)->minor = 8;
+ break;
+ case 7:
+ (*supports_version)->minor = 9;
+ break;
+#ifdef SVN_DEBUG
+# if SVN_FS_FS__FORMAT_NUMBER != 7
+# error "Need to add a 'case' statement here"
+# endif
+#endif
}
- dst_ffd->youngest_rev_cache = 0;
-
- hotcopy_setup_shared_fs_data(src_fs, dst_fs);
- SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
-
return SVN_NO_ERROR;
}
svn_error_t *
-svn_fs_fs__hotcopy(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *src_path,
- const char *dst_path,
- svn_boolean_t incremental,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
+svn_fs_fs__info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- struct hotcopy_body_baton hbb;
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- SVN_ERR(svn_fs_fs__open(src_fs, src_path, pool));
-
- if (incremental)
- {
- const char *dst_format_abspath;
- svn_node_kind_t dst_format_kind;
-
- /* Check destination format to be sure we know how to incrementally
- * hotcopy to the destination FS. */
- dst_format_abspath = svn_dirent_join(dst_path, PATH_FORMAT, pool);
- SVN_ERR(svn_io_check_path(dst_format_abspath, &dst_format_kind, pool));
- if (dst_format_kind == svn_node_none)
- {
- /* Destination doesn't exist yet. Perform a normal hotcopy to a
- * empty destination using the same configuration as the source. */
- SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
- }
- else
- {
- /* Check the existing repository. */
- SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
- SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs,
- pool));
- hotcopy_setup_shared_fs_data(src_fs, dst_fs);
- SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
- }
- }
- else
- {
- /* Start out with an empty destination using the same configuration
- * as the source. */
- SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
- }
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- hbb.src_fs = src_fs;
- hbb.dst_fs = dst_fs;
- hbb.incremental = incremental;
- hbb.cancel_func = cancel_func;
- hbb.cancel_baton = cancel_baton;
- SVN_ERR(svn_fs_fs__with_write_lock(dst_fs, hotcopy_body, &hbb, pool));
-
+ *files = apr_array_make(result_pool, 1, sizeof(const char *));
+ APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path, PATH_CONFIG,
+ result_pool);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_fs_fs/fs_fs.h b/subversion/libsvn_fs_fs/fs_fs.h
index c09f861..b6c94c7 100644
--- a/subversion/libsvn_fs_fs/fs_fs.h
+++ b/subversion/libsvn_fs_fs/fs_fs.h
@@ -25,6 +25,11 @@
#include "fs.h"
+/* Read the 'format' file of fsfs filesystem FS and store its info in FS.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__read_format_file(svn_fs_t *fs, apr_pool_t *scratch_pool);
+
/* Open the fsfs filesystem pointed to by PATH and associate it with
filesystem object FS. Use POOL for temporary allocations.
@@ -34,166 +39,41 @@ svn_error_t *svn_fs_fs__open(svn_fs_t *fs,
const char *path,
apr_pool_t *pool);
-/* Upgrade the fsfs filesystem FS. Use POOL for temporary allocations. */
-svn_error_t *svn_fs_fs__upgrade(svn_fs_t *fs,
- apr_pool_t *pool);
-
-/* Verify metadata in fsfs filesystem FS. Limit the checks to revisions
- * START to END where possible. Indicate progress via the optional
+/* Upgrade the fsfs filesystem FS. Indicate progress via the optional
* NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC
* will periodically be called with CANCEL_BATON to allow for preemption.
* Use POOL for temporary allocations. */
-svn_error_t *svn_fs_fs__verify(svn_fs_t *fs,
- svn_revnum_t start,
- svn_revnum_t end,
- svn_fs_progress_notify_func_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool);
-
-/* Copy the fsfs filesystem SRC_FS at SRC_PATH into a new copy DST_FS at
- * DST_PATH. If INCREMENTAL is TRUE, do not re-copy data which already
- * exists in DST_FS. Use POOL for temporary allocations. */
-svn_error_t * svn_fs_fs__hotcopy(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *src_path,
- const char *dst_path,
- svn_boolean_t incremental,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool);
-
-/* Recover the fsfs associated with filesystem FS.
- Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
- Use POOL for temporary allocations. */
-svn_error_t *svn_fs_fs__recover(svn_fs_t *fs,
+svn_error_t *svn_fs_fs__upgrade(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool);
-/* Set *NODEREV_P to the node-revision for the node ID in FS. Do any
- allocations in POOL. */
-svn_error_t *svn_fs_fs__get_node_revision(node_revision_t **noderev_p,
- svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *pool);
-
-/* Store NODEREV as the node-revision for the node whose id is ID in
- FS, after setting its is_fresh_txn_root to FRESH_TXN_ROOT. Do any
- necessary temporary allocation in POOL. */
-svn_error_t *svn_fs_fs__put_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
- node_revision_t *noderev,
- svn_boolean_t fresh_txn_root,
- apr_pool_t *pool);
-
-/* Write the node-revision NODEREV into the stream OUTFILE, compatible with
- filesystem format FORMAT. Only write mergeinfo-related metadata if
- INCLUDE_MERGEINFO is true. Temporary allocations are from POOL. */
-/* ### Currently used only by fs_fs.c */
-svn_error_t *
-svn_fs_fs__write_noderev(svn_stream_t *outfile,
- node_revision_t *noderev,
- int format,
- svn_boolean_t include_mergeinfo,
- apr_pool_t *pool);
-
-/* Read a node-revision from STREAM. Set *NODEREV to the new structure,
- allocated in POOL. */
-/* ### Currently used only by fs_fs.c */
-svn_error_t *
-svn_fs_fs__read_noderev(node_revision_t **noderev,
- svn_stream_t *stream,
- apr_pool_t *pool);
-
-
/* Set *YOUNGEST to the youngest revision in filesystem FS. Do any
temporary allocation in POOL. */
svn_error_t *svn_fs_fs__youngest_rev(svn_revnum_t *youngest,
svn_fs_t *fs,
apr_pool_t *pool);
-/* Return an error iff REV does not exist in FS. */
-svn_error_t *
-svn_fs_fs__revision_exists(svn_revnum_t rev,
- svn_fs_t *fs,
- apr_pool_t *pool);
-
-/* Set *ROOT_ID to the node-id for the root of revision REV in
- filesystem FS. Do any allocations in POOL. */
-svn_error_t *svn_fs_fs__rev_get_root(svn_fs_id_t **root_id,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool);
+/* Return the shard size of filesystem FS. Return 0 for non-shared ones. */
+int
+svn_fs_fs__shard_size(svn_fs_t *fs);
-/* Set *ENTRIES to an apr_hash_t of dirent structs that contain the
- directory entries of node-revision NODEREV in filesystem FS. The
- returned table (and its keys and values) is allocated in POOL,
- which is also used for temporary allocations. */
-svn_error_t *svn_fs_fs__rep_contents_dir(apr_hash_t **entries,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool);
-
-/* Set *DIRENT to the entry identified by NAME in the directory given
- by NODEREV in filesystem FS. If no such entry exits, *DIRENT will
- be NULL. The returned object is allocated in RESULT_POOL; SCRATCH_POOL
- used for temporary allocations. */
+/* Set *MIN_UNPACKED to the oldest non-packed revision in filesystem FS.
+ Do any temporary allocation in POOL. */
svn_error_t *
-svn_fs_fs__rep_contents_dir_entry(svn_fs_dirent_t **dirent,
- svn_fs_t *fs,
- node_revision_t *noderev,
- const char *name,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-/* Set *CONTENTS to be a readable svn_stream_t that receives the text
- representation of node-revision NODEREV as seen in filesystem FS.
- Use POOL for temporary allocations. */
-svn_error_t *svn_fs_fs__get_contents(svn_stream_t **contents,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool);
+svn_fs_fs__min_unpacked_rev(svn_revnum_t *min_unpacked,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
-/* Attempt to fetch the text representation of node-revision NODEREV as
- seen in filesystem FS and pass it along with the BATON to the PROCESSOR.
- Set *SUCCESS only of the data could be provided and the processing
- had been called.
- Use POOL for all allocations.
- */
+/* Return SVN_ERR_FS_NO_SUCH_REVISION if the given revision REV is newer
+ than the current youngest revision in FS or is simply not a valid
+ revision number, else return success. */
svn_error_t *
-svn_fs_fs__try_process_file_contents(svn_boolean_t *success,
- svn_fs_t *fs,
- node_revision_t *noderev,
- svn_fs_process_contents_func_t processor,
- void* baton,
- apr_pool_t *pool);
-
-/* Set *STREAM_P to a delta stream turning the contents of the file SOURCE into
- the contents of the file TARGET, allocated in POOL.
- If SOURCE is null, the empty string will be used. */
-svn_error_t *svn_fs_fs__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
- svn_fs_t *fs,
- node_revision_t *source,
- node_revision_t *target,
- apr_pool_t *pool);
-
-/* Set *PROPLIST to be an apr_hash_t containing the property list of
- node-revision NODEREV as seen in filesystem FS. Use POOL for
- temporary allocations. */
-svn_error_t *svn_fs_fs__get_proplist(apr_hash_t **proplist,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool);
-
-/* Set *PROPLIST to be an apr_hash_t containing the property list of
- revision REV as seen in filesystem FS. Use POOL for temporary
- allocations. */
-svn_error_t *svn_fs_fs__revision_proplist(apr_hash_t **proplist,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool);
+svn_fs_fs__ensure_revision_exists(svn_revnum_t rev,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
/* Set *LENGTH to the be fulltext length of the node revision
specified by NODEREV. Use POOL for temporary allocations. */
@@ -206,6 +86,26 @@ svn_error_t *svn_fs_fs__file_length(svn_filesize_t *length,
svn_boolean_t svn_fs_fs__noderev_same_rep_key(representation_t *a,
representation_t *b);
+/* Set *EQUAL to TRUE if the text representations in A and B within FS
+ have equal contents, else set it to FALSE.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ node_revision_t *a,
+ node_revision_t *b,
+ apr_pool_t *scratch_pool);
+
+/* Set *EQUAL to TRUE if the property representations in A and B within FS
+ have equal contents, else set it to FALSE.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__prop_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ node_revision_t *a,
+ node_revision_t *b,
+ apr_pool_t *scratch_pool);
+
/* Return a copy of the representation REP allocated from POOL. */
representation_t *svn_fs_fs__rep_copy(representation_t *rep,
@@ -220,152 +120,27 @@ svn_error_t *svn_fs_fs__file_checksum(svn_checksum_t **checksum,
svn_checksum_kind_t kind,
apr_pool_t *pool);
-/* Find the paths which were changed in revision REV of filesystem FS
- and store them in *CHANGED_PATHS_P. Cached copyfrom information
- will be stored in *COPYFROM_CACHE. Get any temporary allocations
- from POOL. */
-svn_error_t *svn_fs_fs__paths_changed(apr_hash_t **changed_paths_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_hash_t *copyfrom_cache,
- apr_pool_t *pool);
-
-/* Create a new transaction in filesystem FS, based on revision REV,
- and store it in *TXN_P. Allocate all necessary variables from
- POOL. */
-svn_error_t *svn_fs_fs__create_txn(svn_fs_txn_t **txn_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool);
-
-/* Set the transaction property NAME to the value VALUE in transaction
- TXN. Perform temporary allocations from POOL. */
-svn_error_t *svn_fs_fs__change_txn_prop(svn_fs_txn_t *txn,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool);
-
-/* Change transaction properties in transaction TXN based on PROPS.
- Perform temporary allocations from POOL. */
-svn_error_t *svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
- const apr_array_header_t *props,
- apr_pool_t *pool);
-
/* Return whether or not the given FS supports mergeinfo metadata. */
svn_boolean_t svn_fs_fs__fs_supports_mergeinfo(svn_fs_t *fs);
-/* Store a transaction record in *TXN_P for the transaction identified
- by TXN_ID in filesystem FS. Allocate everything from POOL. */
-svn_error_t *svn_fs_fs__get_txn(transaction_t **txn_p,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool);
-
-/* Abort the existing transaction TXN, performing any temporary
- allocations in POOL. */
-svn_error_t *svn_fs_fs__abort_txn(svn_fs_txn_t *txn, apr_pool_t *pool);
-
-/* Create an entirely new mutable node in the filesystem FS, whose
- node-revision is NODEREV. Set *ID_P to the new node revision's ID.
- Use POOL for any temporary allocation. COPY_ID is the copy_id to
- use in the node revision ID. TXN_ID is the Subversion transaction
- under which this occurs. */
-svn_error_t *svn_fs_fs__create_node(const svn_fs_id_t **id_p,
- svn_fs_t *fs,
- node_revision_t *noderev,
- const char *copy_id,
- const char *txn_id,
- apr_pool_t *pool);
-
-/* Remove all references to the transaction TXN_ID from filesystem FS.
- Temporary allocations are from POOL. */
-svn_error_t *svn_fs_fs__purge_txn(svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool);
-
-/* Add or set in filesystem FS, transaction TXN_ID, in directory
- PARENT_NODEREV a directory entry for NAME pointing to ID of type
- KIND. Allocations are done in POOL. */
-svn_error_t *svn_fs_fs__set_entry(svn_fs_t *fs,
- const char *txn_id,
- node_revision_t *parent_noderev,
- const char *name,
- const svn_fs_id_t *id,
- svn_node_kind_t kind,
- apr_pool_t *pool);
-
-/* Add a change to the changes record for filesystem FS in transaction
- TXN_ID. Mark path PATH, having node-id ID, as changed according to
- the type in CHANGE_KIND. If the text representation was changed
- set TEXT_MOD to TRUE, and likewise for PROP_MOD. If this change
- was the result of a copy, set COPYFROM_REV and COPYFROM_PATH to the
- revision and path of the copy source, otherwise they should be set
- to SVN_INVALID_REVNUM and NULL. Perform any temporary allocations
- from POOL. */
-svn_error_t *svn_fs_fs__add_change(svn_fs_t *fs,
- const char *txn_id,
- const char *path,
- const svn_fs_id_t *id,
- svn_fs_path_change_kind_t change_kind,
- svn_boolean_t text_mod,
- svn_boolean_t prop_mod,
- svn_node_kind_t node_kind,
- svn_revnum_t copyfrom_rev,
- const char *copyfrom_path,
- apr_pool_t *pool);
-
-/* Return a writable stream in *STREAM that allows storing the text
- representation of node-revision NODEREV in filesystem FS.
- Allocations are from POOL. */
-svn_error_t *svn_fs_fs__set_contents(svn_stream_t **stream,
- svn_fs_t *fs,
- node_revision_t *noderev,
- apr_pool_t *pool);
-
-/* Create a node revision in FS which is an immediate successor of
- OLD_ID, whose contents are NEW_NR. Set *NEW_ID_P to the new node
- revision's ID. Use POOL for any temporary allocation.
-
- COPY_ID, if non-NULL, is a key into the `copies' table, and
- indicates that this new node is being created as the result of a
- copy operation, and specifically which operation that was. If
- COPY_ID is NULL, then re-use the copy ID from the predecessor node.
-
- TXN_ID is the Subversion transaction under which this occurs.
-
- After this call, the deltification code assumes that the new node's
- contents will change frequently, and will avoid representing other
- nodes as deltas against this node's contents. */
-svn_error_t *svn_fs_fs__create_successor(const svn_fs_id_t **new_id_p,
- svn_fs_t *fs,
- const svn_fs_id_t *old_idp,
- node_revision_t *new_noderev,
- const char *copy_id,
- const char *txn_id,
- apr_pool_t *pool);
-
-/* Write a new property list PROPLIST for node-revision NODEREV in
- filesystem FS. Perform any temporary allocations in POOL. */
-svn_error_t *svn_fs_fs__set_proplist(svn_fs_t *fs,
- node_revision_t *noderev,
- apr_hash_t *proplist,
- apr_pool_t *pool);
-
-/* Commit the transaction TXN in filesystem FS and return its new
- revision number in *REV. If the transaction is out of date, return
- the error SVN_ERR_FS_TXN_OUT_OF_DATE. Use POOL for temporary
- allocations. */
-svn_error_t *svn_fs_fs__commit(svn_revnum_t *new_rev_p,
- svn_fs_t *fs,
- svn_fs_txn_t *txn,
- apr_pool_t *pool);
-
-/* Return the next available copy_id in *COPY_ID for the transaction
- TXN_ID in filesystem FS. Allocate space in POOL. */
-svn_error_t *svn_fs_fs__reserve_copy_id(const char **copy_id,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool);
+/* Under the repository db PATH, create a FSFS repository with FORMAT,
+ * the given SHARD_SIZE. If USE_LOG_ADDRESSING is non-zero, repository
+ * will use logical addressing. If not supported by the respective format,
+ * the latter two parameters will be ignored. FS will be updated.
+ *
+ * The only file not being written is the 'format' file. This allows
+ * callers such as hotcopy to modify the contents before turning the
+ * tree into an accessible repository.
+ *
+ * Use POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__create_file_tree(svn_fs_t *fs,
+ const char *path,
+ int format,
+ int shard_size,
+ svn_boolean_t use_log_addressing,
+ apr_pool_t *pool);
/* Create a fs_fs fileysystem referenced by FS at path PATH. Get any
temporary allocations from POOL.
@@ -376,70 +151,29 @@ svn_error_t *svn_fs_fs__create(svn_fs_t *fs,
const char *path,
apr_pool_t *pool);
-/* Set the uuid of repository FS to UUID, if UUID is not NULL;
- otherwise, set the uuid of FS to a newly generated UUID. Perform
- temporary allocations in POOL. */
+/* Set the uuid of repository FS to UUID and the instance ID to INSTANCE_ID.
+ If any of them is NULL, use a newly generated UUID / ID instead. Ignore
+ INSTANCE_ID whenever instance IDs are not supported by the FS format.
+ Perform temporary allocations in POOL. */
svn_error_t *svn_fs_fs__set_uuid(svn_fs_t *fs,
const char *uuid,
+ const char *instance_id,
apr_pool_t *pool);
-/* Set *NAMES_P to an array of names which are all the active
- transactions in filesystem FS. Allocate the array from POOL. */
-svn_error_t *svn_fs_fs__list_transactions(apr_array_header_t **names_p,
- svn_fs_t *fs,
- apr_pool_t *pool);
-
-/* Open the transaction named NAME in filesystem FS. Set *TXN_P to
- * the transaction. If there is no such transaction, return
-` * SVN_ERR_FS_NO_SUCH_TRANSACTION. Allocate the new transaction in
- * POOL. */
-svn_error_t *svn_fs_fs__open_txn(svn_fs_txn_t **txn_p,
- svn_fs_t *fs,
- const char *name,
- apr_pool_t *pool);
-
-/* Return the property list from transaction TXN and store it in
- *PROPLIST. Allocate the property list from POOL. */
-svn_error_t *svn_fs_fs__txn_proplist(apr_hash_t **proplist,
- svn_fs_txn_t *txn,
- apr_pool_t *pool);
-
-/* Delete the mutable node-revision referenced by ID, along with any
- mutable props or directory contents associated with it. Perform
- temporary allocations in POOL. */
-svn_error_t *svn_fs_fs__delete_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
- apr_pool_t *pool);
-
-
-/* Find the paths which were changed in transaction TXN_ID of
- filesystem FS and store them in *CHANGED_PATHS_P.
- Get any temporary allocations from POOL. */
-svn_error_t *svn_fs_fs__txn_changes_fetch(apr_hash_t **changes,
- svn_fs_t *fs,
- const char *txn_id,
- apr_pool_t *pool);
-
-
-/* Set *PATH to the path of REV in FS, whether in a pack file or not.
- Allocate *PATH in POOL.
-
- Note: If the caller does not have the write lock on FS, then the path is
- not guaranteed to be correct or to remain correct after the function
- returns, because the revision might become packed before or after this
- call. If a file exists at that path, then it is correct; if not, then
- the caller should call update_min_unpacked_rev() and re-try once. */
-svn_error_t *
-svn_fs_fs__path_rev_absolute(const char **path,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool);
-
/* Return the path to the 'current' file in FS.
Perform allocation in POOL. */
const char *
svn_fs_fs__path_current(svn_fs_t *fs, apr_pool_t *pool);
+/* Write the format number and maximum number of files per directory
+ for FS, possibly expecting to overwrite a previously existing file.
+
+ Use POOL for temporary allocation. */
+svn_error_t *
+svn_fs_fs__write_format(svn_fs_t *fs,
+ svn_boolean_t overwrite,
+ apr_pool_t *pool);
+
/* Obtain a write lock on the filesystem FS in a subpool of POOL, call
BODY with BATON and that subpool, destroy the subpool (releasing the write
lock) and return what BODY returned. */
@@ -450,6 +184,38 @@ svn_fs_fs__with_write_lock(svn_fs_t *fs,
void *baton,
apr_pool_t *pool);
+/* Obtain a pack operation lock on the filesystem FS in a subpool of POOL,
+ call BODY with BATON and that subpool, destroy the subpool (releasing the
+ write lock) and return what BODY returned. */
+svn_error_t *
+svn_fs_fs__with_pack_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
+
+/* Run BODY (with BATON and POOL) while the txn-current file
+ of FS is locked. */
+svn_error_t *
+svn_fs_fs__with_txn_current_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
+
+/* Obtain all locks on the filesystem FS in a subpool of POOL, call BODY
+ with BATON and that subpool, destroy the subpool (releasing the locks)
+ and return what BODY returned.
+
+ This combines svn_fs_fs__with_write_lock, svn_fs_fs__with_pack_lock,
+ and svn_fs_fs__with_txn_current_lock, ensuring correct lock ordering. */
+svn_error_t *
+svn_fs_fs__with_all_locks(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
+
/* Find the value of the property named PROPNAME in transaction TXN.
Return the contents in *VALUE_P. The contents will be allocated
from POOL. */
@@ -469,38 +235,6 @@ svn_error_t *svn_fs_fs__change_rev_prop(svn_fs_t *fs, svn_revnum_t rev,
const svn_string_t *value,
apr_pool_t *pool);
-/* Retrieve information about the Subversion transaction SVN_TXN from
- the `transactions' table of FS, allocating from POOL. Set
- *ROOT_ID_P to the ID of the transaction's root directory. Set
- *BASE_ROOT_ID_P to the ID of the root directory of the
- transaction's base revision.
-
- If there is no such transaction, SVN_ERR_FS_NO_SUCH_TRANSACTION is
- the error returned.
-
- Returns SVN_ERR_FS_TRANSACTION_NOT_MUTABLE if TXN_NAME refers to a
- transaction that has already been committed.
-
- Allocate *ROOT_ID_P and *BASE_ROOT_ID_P in POOL. */
-svn_error_t *svn_fs_fs__get_txn_ids(const svn_fs_id_t **root_id_p,
- const svn_fs_id_t **base_root_id_p,
- svn_fs_t *fs,
- const char *txn_name,
- apr_pool_t *pool);
-
-/* Begin a new transaction in filesystem FS, based on existing
- revision REV. The new transaction is returned in *TXN_P. Allocate
- the new transaction structure from POOL. */
-svn_error_t *svn_fs_fs__begin_txn(svn_fs_txn_t **txn_p, svn_fs_t *fs,
- svn_revnum_t rev, apr_uint32_t flags,
- apr_pool_t *pool);
-
-/* Find the value of the property named PROPNAME in transaction TXN.
- Return the contents in *VALUE_P. The contents will be allocated
- from POOL. */
-svn_error_t *svn_fs_fs__txn_prop(svn_string_t **value_p, svn_fs_txn_t *txn,
- const char *propname, apr_pool_t *pool);
-
/* If directory PATH does not exist, create it and give it the same
permissions as FS_PATH.*/
svn_error_t *svn_fs_fs__ensure_dir_exists(const char *path,
@@ -516,7 +250,7 @@ svn_error_t *svn_fs_fs__ensure_dir_exists(const char *path,
*/
svn_error_t *
svn_fs_fs__set_node_origin(svn_fs_t *fs,
- const char *node_id,
+ const svn_fs_fs__id_part_t *node_id,
const svn_fs_id_t *node_rev_id,
apr_pool_t *pool);
@@ -530,12 +264,12 @@ svn_fs_fs__set_node_origin(svn_fs_t *fs,
svn_error_t *
svn_fs_fs__get_node_origin(const svn_fs_id_t **origin_id,
svn_fs_t *fs,
- const char *node_id,
+ const svn_fs_fs__id_part_t *node_id,
apr_pool_t *pool);
/* Initialize all session-local caches in FS according to the global
- cache settings. Use POOL for allocations.
+ cache settings. Use POOL for temporary allocations.
Please note that it is permissible for this function to set some
or all of these caches to NULL, regardless of any setting. */
@@ -558,18 +292,4 @@ svn_fs_fs__initialize_txn_caches(svn_fs_t *fs,
void
svn_fs_fs__reset_txn_caches(svn_fs_t *fs);
-/* Possibly pack the repository at PATH. This just take full shards, and
- combines all the revision files into a single one, with a manifest header.
- Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
-
- Existing filesystem references need not change. */
-svn_error_t *
-svn_fs_fs__pack(svn_fs_t *fs,
- svn_fs_pack_notify_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool);
-
-
#endif
diff --git a/subversion/libsvn_fs_fs/hotcopy.c b/subversion/libsvn_fs_fs/hotcopy.c
new file mode 100644
index 0000000..43f513e
--- /dev/null
+++ b/subversion/libsvn_fs_fs/hotcopy.c
@@ -0,0 +1,1097 @@
+/* hotcopy.c --- FS hotcopy functionality for FSFS
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+#include "svn_pools.h"
+#include "svn_path.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_fs.h"
+#include "hotcopy.h"
+#include "util.h"
+#include "recovery.h"
+#include "revprops.h"
+#include "rep-cache.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Like svn_io_dir_file_copy(), but doesn't copy files that exist at
+ * the destination and do not differ in terms of kind, size, and mtime.
+ * Set *SKIPPED_P to FALSE only if the file was copied, do not change
+ * the value in *SKIPPED_P otherwise. SKIPPED_P may be NULL if not
+ * required. */
+static svn_error_t *
+hotcopy_io_dir_file_copy(svn_boolean_t *skipped_p,
+ const char *src_path,
+ const char *dst_path,
+ const char *file,
+ apr_pool_t *scratch_pool)
+{
+ const svn_io_dirent2_t *src_dirent;
+ const svn_io_dirent2_t *dst_dirent;
+ const char *src_target;
+ const char *dst_target;
+
+ /* Does the destination already exist? If not, we must copy it. */
+ dst_target = svn_dirent_join(dst_path, file, scratch_pool);
+ SVN_ERR(svn_io_stat_dirent2(&dst_dirent, dst_target, FALSE, TRUE,
+ scratch_pool, scratch_pool));
+ if (dst_dirent->kind != svn_node_none)
+ {
+ /* If the destination's stat information indicates that the file
+ * is equal to the source, don't bother copying the file again. */
+ src_target = svn_dirent_join(src_path, file, scratch_pool);
+ SVN_ERR(svn_io_stat_dirent2(&src_dirent, src_target, FALSE, FALSE,
+ scratch_pool, scratch_pool));
+ if (src_dirent->kind == dst_dirent->kind &&
+ src_dirent->special == dst_dirent->special &&
+ src_dirent->filesize == dst_dirent->filesize &&
+ src_dirent->mtime <= dst_dirent->mtime)
+ return SVN_NO_ERROR;
+ }
+
+ if (skipped_p)
+ *skipped_p = FALSE;
+
+ return svn_error_trace(svn_io_dir_file_copy(src_path, dst_path, file,
+ scratch_pool));
+}
+
+/* Set *NAME_P to the UTF-8 representation of directory entry NAME.
+ * NAME is in the internal encoding used by APR; PARENT is in
+ * UTF-8 and in internal (not local) style.
+ *
+ * Use PARENT only for generating an error string if the conversion
+ * fails because NAME could not be represented in UTF-8. In that
+ * case, return a two-level error in which the outer error's message
+ * mentions PARENT, but the inner error's message does not mention
+ * NAME (except possibly in hex) since NAME may not be printable.
+ * Such a compound error at least allows the user to go looking in the
+ * right directory for the problem.
+ *
+ * If there is any other error, just return that error directly.
+ *
+ * If there is any error, the effect on *NAME_P is undefined.
+ *
+ * *NAME_P and NAME may refer to the same storage.
+ */
+static svn_error_t *
+entry_name_to_utf8(const char **name_p,
+ const char *name,
+ const char *parent,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, pool);
+ if (err && err->apr_err == APR_EINVAL)
+ {
+ return svn_error_createf(err->apr_err, err,
+ _("Error converting entry "
+ "in directory '%s' to UTF-8"),
+ svn_dirent_local_style(parent, pool));
+ }
+ return err;
+}
+
+/* Like svn_io_copy_dir_recursively() but doesn't copy regular files that
+ * exist in the destination and do not differ from the source in terms of
+ * kind, size, and mtime. Set *SKIPPED_P to FALSE only if at least one
+ * file was copied, do not change the value in *SKIPPED_P otherwise.
+ * SKIPPED_P may be NULL if not required. */
+static svn_error_t *
+hotcopy_io_copy_dir_recursively(svn_boolean_t *skipped_p,
+ const char *src,
+ const char *dst_parent,
+ const char *dst_basename,
+ svn_boolean_t copy_perms,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_node_kind_t kind;
+ apr_status_t status;
+ const char *dst_path;
+ apr_dir_t *this_dir;
+ apr_finfo_t this_entry;
+ apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME;
+
+ /* Make a subpool for recursion */
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ /* The 'dst_path' is simply dst_parent/dst_basename */
+ dst_path = svn_dirent_join(dst_parent, dst_basename, pool);
+
+ /* Sanity checks: SRC and DST_PARENT are directories, and
+ DST_BASENAME doesn't already exist in DST_PARENT. */
+ SVN_ERR(svn_io_check_path(src, &kind, subpool));
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Source '%s' is not a directory"),
+ svn_dirent_local_style(src, pool));
+
+ SVN_ERR(svn_io_check_path(dst_parent, &kind, subpool));
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Destination '%s' is not a directory"),
+ svn_dirent_local_style(dst_parent, pool));
+
+ SVN_ERR(svn_io_check_path(dst_path, &kind, subpool));
+
+ /* Create the new directory. */
+ /* ### TODO: copy permissions (needs apr_file_attrs_get()) */
+ SVN_ERR(svn_io_make_dir_recursively(dst_path, pool));
+
+ /* Loop over the dirents in SRC. ('.' and '..' are auto-excluded) */
+ SVN_ERR(svn_io_dir_open(&this_dir, src, subpool));
+
+ for (status = apr_dir_read(&this_entry, flags, this_dir);
+ status == APR_SUCCESS;
+ status = apr_dir_read(&this_entry, flags, this_dir))
+ {
+ if ((this_entry.name[0] == '.')
+ && ((this_entry.name[1] == '\0')
+ || ((this_entry.name[1] == '.')
+ && (this_entry.name[2] == '\0'))))
+ {
+ continue;
+ }
+ else
+ {
+ const char *entryname_utf8;
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR(entry_name_to_utf8(&entryname_utf8, this_entry.name,
+ src, subpool));
+ if (this_entry.filetype == APR_REG) /* regular file */
+ {
+ SVN_ERR(hotcopy_io_dir_file_copy(skipped_p, src, dst_path,
+ entryname_utf8, subpool));
+ }
+ else if (this_entry.filetype == APR_LNK) /* symlink */
+ {
+ const char *src_target = svn_dirent_join(src, entryname_utf8,
+ subpool);
+ const char *dst_target = svn_dirent_join(dst_path,
+ entryname_utf8,
+ subpool);
+ SVN_ERR(svn_io_copy_link(src_target, dst_target,
+ subpool));
+ }
+ else if (this_entry.filetype == APR_DIR) /* recurse */
+ {
+ const char *src_target;
+
+ /* Prevent infinite recursion by filtering off our
+ newly created destination path. */
+ if (strcmp(src, dst_parent) == 0
+ && strcmp(entryname_utf8, dst_basename) == 0)
+ continue;
+
+ src_target = svn_dirent_join(src, entryname_utf8, subpool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p,
+ src_target,
+ dst_path,
+ entryname_utf8,
+ copy_perms,
+ cancel_func,
+ cancel_baton,
+ subpool));
+ }
+ /* ### support other APR node types someday?? */
+
+ }
+ }
+
+ if (! (APR_STATUS_IS_ENOENT(status)))
+ return svn_error_wrap_apr(status, _("Can't read directory '%s'"),
+ svn_dirent_local_style(src, pool));
+
+ status = apr_dir_close(this_dir);
+ if (status)
+ return svn_error_wrap_apr(status, _("Error closing directory '%s'"),
+ svn_dirent_local_style(src, pool));
+
+ /* Free any memory used by recursion */
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy an un-packed revision or revprop file for revision REV from SRC_SUBDIR
+ * to DST_SUBDIR. Assume a sharding layout based on MAX_FILES_PER_DIR.
+ * Set *SKIPPED_P to FALSE only if the file was copied, do not change the
+ * value in *SKIPPED_P otherwise. SKIPPED_P may be NULL if not required.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_copy_shard_file(svn_boolean_t *skipped_p,
+ const char *src_subdir,
+ const char *dst_subdir,
+ svn_revnum_t rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *src_subdir_shard = src_subdir,
+ *dst_subdir_shard = dst_subdir;
+
+ if (max_files_per_dir)
+ {
+ const char *shard = apr_psprintf(scratch_pool, "%ld",
+ rev / max_files_per_dir);
+ src_subdir_shard = svn_dirent_join(src_subdir, shard, scratch_pool);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+
+ if (rev % max_files_per_dir == 0)
+ {
+ SVN_ERR(svn_io_make_dir_recursively(dst_subdir_shard, scratch_pool));
+ SVN_ERR(svn_io_copy_perms(dst_subdir, dst_subdir_shard,
+ scratch_pool));
+ }
+ }
+
+ SVN_ERR(hotcopy_io_dir_file_copy(skipped_p,
+ src_subdir_shard, dst_subdir_shard,
+ apr_psprintf(scratch_pool, "%ld", rev),
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Copy a packed shard containing revision REV, and which contains
+ * MAX_FILES_PER_DIR revisions, from SRC_FS to DST_FS.
+ * Update *DST_MIN_UNPACKED_REV in case the shard is new in DST_FS.
+ * Do not re-copy data which already exists in DST_FS.
+ * Set *SKIPPED_P to FALSE only if at least one part of the shard
+ * was copied, do not change the value in *SKIPPED_P otherwise.
+ * SKIPPED_P may be NULL if not required.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_copy_packed_shard(svn_boolean_t *skipped_p,
+ svn_revnum_t *dst_min_unpacked_rev,
+ svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ svn_revnum_t rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *src_subdir;
+ const char *dst_subdir;
+ const char *packed_shard;
+ const char *src_subdir_packed_shard;
+ svn_revnum_t revprop_rev;
+ apr_pool_t *iterpool;
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+
+ /* Copy the packed shard. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, scratch_pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, scratch_pool);
+ packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
+ rev / max_files_per_dir);
+ src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
+ scratch_pool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p, src_subdir_packed_shard,
+ dst_subdir, packed_shard,
+ TRUE /* copy_perms */,
+ NULL /* cancel_func */, NULL,
+ scratch_pool));
+
+ /* Copy revprops belonging to revisions in this pack. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR, scratch_pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR, scratch_pool);
+
+ if ( src_ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT
+ || src_ffd->min_unpacked_rev < rev + max_files_per_dir)
+ {
+ /* copy unpacked revprops rev by rev */
+ iterpool = svn_pool_create(scratch_pool);
+ for (revprop_rev = rev;
+ revprop_rev < rev + max_files_per_dir;
+ revprop_rev++)
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(hotcopy_copy_shard_file(skipped_p, src_subdir, dst_subdir,
+ revprop_rev, max_files_per_dir,
+ iterpool));
+ }
+ svn_pool_destroy(iterpool);
+ }
+ else
+ {
+ /* revprop for revision 0 will never be packed */
+ if (rev == 0)
+ SVN_ERR(hotcopy_copy_shard_file(skipped_p, src_subdir, dst_subdir,
+ 0, max_files_per_dir,
+ scratch_pool));
+
+ /* packed revprops folder */
+ packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
+ rev / max_files_per_dir);
+ src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
+ scratch_pool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p,
+ src_subdir_packed_shard,
+ dst_subdir, packed_shard,
+ TRUE /* copy_perms */,
+ NULL /* cancel_func */, NULL,
+ scratch_pool));
+ }
+
+ /* If necessary, update the min-unpacked rev file in the hotcopy. */
+ if (*dst_min_unpacked_rev < rev + max_files_per_dir)
+ {
+ *dst_min_unpacked_rev = rev + max_files_per_dir;
+ SVN_ERR(svn_fs_fs__write_min_unpacked_rev(dst_fs,
+ *dst_min_unpacked_rev,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove file PATH, if it exists - even if it is read-only.
+ * Use POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_file(const char *path,
+ apr_pool_t *pool)
+{
+ /* Make the rev file writable and remove it. */
+ SVN_ERR(svn_io_set_file_read_write(path, TRUE, pool));
+ SVN_ERR(svn_io_remove_file2(path, TRUE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Remove revision or revprop files between START_REV (inclusive) and
+ * END_REV (non-inclusive) from folder DST_SUBDIR in DST_FS. Assume
+ * sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_files(svn_fs_t *dst_fs,
+ const char *dst_subdir,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *shard;
+ const char *dst_subdir_shard;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool;
+
+ /* Pre-compute paths for initial shard. */
+ shard = apr_psprintf(scratch_pool, "%ld", start_rev / max_files_per_dir);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+
+ iterpool = svn_pool_create(scratch_pool);
+ for (rev = start_rev; rev < end_rev; rev++)
+ {
+ svn_pool_clear(iterpool);
+
+ /* If necessary, update paths for shard. */
+ if (rev != start_rev && rev % max_files_per_dir == 0)
+ {
+ shard = apr_psprintf(iterpool, "%ld", rev / max_files_per_dir);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+ }
+
+ /* remove files for REV */
+ SVN_ERR(hotcopy_remove_file(svn_dirent_join(dst_subdir_shard,
+ apr_psprintf(iterpool,
+ "%ld", rev),
+ iterpool),
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove revisions between START_REV (inclusive) and END_REV (non-inclusive)
+ * from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_rev_files(svn_fs_t *dst_fs,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(start_rev <= end_rev);
+ SVN_ERR(hotcopy_remove_files(dst_fs,
+ svn_dirent_join(dst_fs->path,
+ PATH_REVS_DIR,
+ scratch_pool),
+ start_rev, end_rev,
+ max_files_per_dir, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove revision properties between START_REV (inclusive) and END_REV
+ * (non-inclusive) from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. Revision 0 revprops will
+ * not be deleted. */
+static svn_error_t *
+hotcopy_remove_revprop_files(svn_fs_t *dst_fs,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(start_rev <= end_rev);
+
+ /* don't delete rev 0 props */
+ SVN_ERR(hotcopy_remove_files(dst_fs,
+ svn_dirent_join(dst_fs->path,
+ PATH_REVPROPS_DIR,
+ scratch_pool),
+ start_rev ? start_rev : 1, end_rev,
+ max_files_per_dir, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that DST_FS is a suitable destination for an incremental
+ * hotcopy from SRC_FS. */
+static svn_error_t *
+hotcopy_incremental_check_preconditions(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+ fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
+
+ /* We only support incremental hotcopy between the same format. */
+ if (src_ffd->format != dst_ffd->format)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The FSFS format (%d) of the hotcopy source does not match the "
+ "FSFS format (%d) of the hotcopy destination; please upgrade "
+ "both repositories to the same format"),
+ src_ffd->format, dst_ffd->format);
+
+ /* Make sure the UUID of source and destination match up.
+ * We don't want to copy over a different repository. */
+ if (strcmp(src_fs->uuid, dst_fs->uuid) != 0)
+ return svn_error_create(SVN_ERR_RA_UUID_MISMATCH, NULL,
+ _("The UUID of the hotcopy source does "
+ "not match the UUID of the hotcopy "
+ "destination"));
+
+ /* Also require same shard size. */
+ if (src_ffd->max_files_per_dir != dst_ffd->max_files_per_dir)
+ return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The sharding layout configuration "
+ "of the hotcopy source does not match "
+ "the sharding layout configuration of "
+ "the hotcopy destination"));
+ return SVN_NO_ERROR;
+}
+
+/* Remove folder PATH. Ignore errors due to the sub-tree not being empty.
+ * CANCEL_FUNC and CANCEL_BATON do the usual thing.
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+remove_folder(const char *path,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = svn_io_remove_dir2(path, TRUE,
+ cancel_func, cancel_baton, pool);
+
+ if (err && APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Copy the revision and revprop files (possibly sharded / packed) from
+ * SRC_FS to DST_FS. Do not re-copy data which already exists in DST_FS.
+ * When copying packed or unpacked shards, checkpoint the result in DST_FS
+ * for every shard by updating the 'current' file if necessary. Assume
+ * the >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT filesystem format without
+ * global next-ID counters. Indicate progress via the optional NOTIFY_FUNC
+ * callback using NOTIFY_BATON. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+hotcopy_revisions(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ svn_revnum_t src_youngest,
+ svn_revnum_t dst_youngest,
+ svn_boolean_t incremental,
+ const char *src_revs_dir,
+ const char *dst_revs_dir,
+ const char *src_revprops_dir,
+ const char *dst_revprops_dir,
+ svn_fs_hotcopy_notify_t notify_func,
+ void* notify_baton,
+ svn_cancel_func_t cancel_func,
+ void* cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+ fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
+ int max_files_per_dir = src_ffd->max_files_per_dir;
+ svn_revnum_t src_min_unpacked_rev;
+ svn_revnum_t dst_min_unpacked_rev;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool;
+
+ /* Copy the min unpacked rev, and read its value. */
+ if (src_ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
+ {
+ SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&src_min_unpacked_rev,
+ src_fs, pool));
+ SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&dst_min_unpacked_rev,
+ dst_fs, pool));
+
+ /* We only support packs coming from the hotcopy source.
+ * The destination should not be packed independently from
+ * the source. This also catches the case where users accidentally
+ * swap the source and destination arguments. */
+ if (src_min_unpacked_rev < dst_min_unpacked_rev)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The hotcopy destination already contains "
+ "more packed revisions (%lu) than the "
+ "hotcopy source contains (%lu)"),
+ dst_min_unpacked_rev - 1,
+ src_min_unpacked_rev - 1);
+
+ SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
+ PATH_MIN_UNPACKED_REV, pool));
+ }
+ else
+ {
+ src_min_unpacked_rev = 0;
+ dst_min_unpacked_rev = 0;
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /*
+ * Copy the necessary rev files.
+ */
+
+ iterpool = svn_pool_create(pool);
+ /* First, copy packed shards. */
+ for (rev = 0; rev < src_min_unpacked_rev; rev += max_files_per_dir)
+ {
+ svn_boolean_t skipped = TRUE;
+ svn_revnum_t pack_end_rev;
+
+ svn_pool_clear(iterpool);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Copy the packed shard. */
+ SVN_ERR(hotcopy_copy_packed_shard(&skipped, &dst_min_unpacked_rev,
+ src_fs, dst_fs,
+ rev, max_files_per_dir,
+ iterpool));
+
+ pack_end_rev = rev + max_files_per_dir - 1;
+
+ /* Whenever this pack did not previously exist in the destination,
+ * update 'current' to the most recent packed rev (so readers can see
+ * new revisions which arrived in this pack). */
+ if (pack_end_rev > dst_youngest)
+ {
+ SVN_ERR(svn_fs_fs__write_current(dst_fs, pack_end_rev, 0, 0,
+ iterpool));
+ }
+
+ /* When notifying about packed shards, make things simpler by either
+ * reporting a full revision range, i.e [pack start, pack end] or
+ * reporting nothing. There is one case when this approach might not
+ * be exact (incremental hotcopy with a pack replacing last unpacked
+ * revisions), but generally this is good enough. */
+ if (notify_func && !skipped)
+ notify_func(notify_baton, rev, pack_end_rev, iterpool);
+
+ /* Remove revision files which are now packed. */
+ if (incremental)
+ {
+ SVN_ERR(hotcopy_remove_rev_files(dst_fs, rev,
+ rev + max_files_per_dir,
+ max_files_per_dir, iterpool));
+ if (dst_ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
+ SVN_ERR(hotcopy_remove_revprop_files(dst_fs, rev,
+ rev + max_files_per_dir,
+ max_files_per_dir,
+ iterpool));
+ }
+
+ /* Now that all revisions have moved into the pack, the original
+ * rev dir can be removed. */
+ SVN_ERR(remove_folder(svn_fs_fs__path_rev_shard(dst_fs, rev, iterpool),
+ cancel_func, cancel_baton, iterpool));
+ if (rev > 0 && dst_ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
+ SVN_ERR(remove_folder(svn_fs_fs__path_revprops_shard(dst_fs, rev,
+ iterpool),
+ cancel_func, cancel_baton, iterpool));
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR_ASSERT(rev == src_min_unpacked_rev);
+ SVN_ERR_ASSERT(src_min_unpacked_rev == dst_min_unpacked_rev);
+
+ /* Now, copy pairs of non-packed revisions and revprop files.
+ * If necessary, update 'current' after copying all files from a shard. */
+ for (; rev <= src_youngest; rev++)
+ {
+ svn_boolean_t skipped = TRUE;
+
+ svn_pool_clear(iterpool);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Copying non-packed revisions is racy in case the source repository is
+ * being packed concurrently with this hotcopy operation. The race can
+ * happen with FS formats prior to SVN_FS_FS__MIN_PACK_LOCK_FORMAT that
+ * support packed revisions. With the pack lock, however, the race is
+ * impossible, because hotcopy and pack operations block each other.
+ *
+ * We assume that all revisions coming after 'min-unpacked-rev' really
+ * are unpacked and that's not necessarily true with concurrent packing.
+ * Don't try to be smart in this edge case, because handling it properly
+ * might require copying *everything* from the start. Just abort the
+ * hotcopy with an ENOENT (revision file moved to a pack, so it is no
+ * longer where we expect it to be). */
+
+ /* Copy the rev file. */
+ SVN_ERR(hotcopy_copy_shard_file(&skipped,
+ src_revs_dir, dst_revs_dir, rev,
+ max_files_per_dir,
+ iterpool));
+ /* Copy the revprop file. */
+ SVN_ERR(hotcopy_copy_shard_file(&skipped,
+ src_revprops_dir, dst_revprops_dir,
+ rev, max_files_per_dir,
+ iterpool));
+
+ /* Whenever this revision did not previously exist in the destination,
+ * checkpoint the progress via 'current' (do that once per full shard
+ * in order not to slow things down). */
+ if (rev > dst_youngest)
+ {
+ if (max_files_per_dir && (rev % max_files_per_dir == 0))
+ {
+ SVN_ERR(svn_fs_fs__write_current(dst_fs, rev, 0, 0,
+ iterpool));
+ }
+ }
+
+ if (notify_func && !skipped)
+ notify_func(notify_baton, rev, rev, iterpool);
+ }
+ svn_pool_destroy(iterpool);
+
+ /* We assume that all revisions were copied now, i.e. we didn't exit the
+ * above loop early. 'rev' was last incremented during exit of the loop. */
+ SVN_ERR_ASSERT(rev == src_youngest + 1);
+
+ return SVN_NO_ERROR;
+}
+
+/* Shortcut for the revision and revprop copying for old (1 or 2) format
+ * filesystems without sharding and packing. Copy the non-sharded revision
+ * and revprop files from SRC_FS to DST_FS. Do not re-copy data which
+ * already exists in DST_FS. Do not somehow checkpoint the results in
+ * the 'current' file in DST_FS. Indicate progress via the optional
+ * NOTIFY_FUNC callback using NOTIFY_BATON. Use POOL for temporary
+ * allocations. Also see hotcopy_revisions().
+ */
+static svn_error_t *
+hotcopy_revisions_old(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ svn_revnum_t src_youngest,
+ const char *src_revs_dir,
+ const char *dst_revs_dir,
+ const char *src_revprops_dir,
+ const char *dst_revprops_dir,
+ svn_fs_hotcopy_notify_t notify_func,
+ void* notify_baton,
+ svn_cancel_func_t cancel_func,
+ void* cancel_baton,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_revnum_t rev;
+
+ for (rev = 0; rev <= src_youngest; rev++)
+ {
+ svn_boolean_t skipped = TRUE;
+
+ svn_pool_clear(iterpool);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR(hotcopy_io_dir_file_copy(&skipped, src_revs_dir, dst_revs_dir,
+ apr_psprintf(iterpool, "%ld", rev),
+ iterpool));
+ SVN_ERR(hotcopy_io_dir_file_copy(&skipped, src_revprops_dir,
+ dst_revprops_dir,
+ apr_psprintf(iterpool, "%ld", rev),
+ iterpool));
+
+ if (notify_func && !skipped)
+ notify_func(notify_baton, rev, rev, iterpool);
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for hotcopy_body(). */
+struct hotcopy_body_baton {
+ svn_fs_t *src_fs;
+ svn_fs_t *dst_fs;
+ svn_boolean_t incremental;
+ svn_fs_hotcopy_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+};
+
+/* Perform a hotcopy, either normal or incremental.
+ *
+ * Normal hotcopy assumes that the destination exists as an empty
+ * directory. It behaves like an incremental hotcopy except that
+ * none of the copied files already exist in the destination.
+ *
+ * An incremental hotcopy copies only changed or new files to the destination,
+ * and removes files from the destination no longer present in the source.
+ * While the incremental hotcopy is running, readers should still be able
+ * to access the destintation repository without error and should not see
+ * revisions currently in progress of being copied. Readers are able to see
+ * new fully copied revisions even if the entire incremental hotcopy procedure
+ * has not yet completed.
+ *
+ * Writers are blocked out completely during the entire incremental hotcopy
+ * process to ensure consistency. This function assumes that the repository
+ * write-lock is held.
+ */
+static svn_error_t *
+hotcopy_body(void *baton, apr_pool_t *pool)
+{
+ struct hotcopy_body_baton *hbb = baton;
+ svn_fs_t *src_fs = hbb->src_fs;
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+ svn_fs_t *dst_fs = hbb->dst_fs;
+ fs_fs_data_t *dst_ffd = dst_fs->fsap_data;
+ svn_boolean_t incremental = hbb->incremental;
+ svn_fs_hotcopy_notify_t notify_func = hbb->notify_func;
+ void* notify_baton = hbb->notify_baton;
+ svn_cancel_func_t cancel_func = hbb->cancel_func;
+ void* cancel_baton = hbb->cancel_baton;
+ svn_revnum_t src_youngest;
+ apr_uint64_t src_next_node_id;
+ apr_uint64_t src_next_copy_id;
+ svn_revnum_t dst_youngest;
+ const char *src_revprops_dir;
+ const char *dst_revprops_dir;
+ const char *src_revs_dir;
+ const char *dst_revs_dir;
+ const char *src_subdir;
+ const char *dst_subdir;
+ svn_node_kind_t kind;
+
+ /* Try to copy the config.
+ *
+ * ### We try copying the config file before doing anything else,
+ * ### because higher layers will abort the hotcopy if we throw
+ * ### an error from this function, and that renders the hotcopy
+ * ### unusable anyway. */
+ if (src_ffd->format >= SVN_FS_FS__MIN_CONFIG_FILE)
+ {
+ svn_error_t *err;
+
+ err = svn_io_dir_file_copy(src_fs->path, dst_fs->path, PATH_CONFIG,
+ pool);
+ if (err)
+ {
+ if (APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ /* 1.6.0 to 1.6.11 did not copy the configuration file during
+ * hotcopy. So if we're hotcopying a repository which has been
+ * created as a hotcopy itself, it's possible that fsfs.conf
+ * does not exist. Ask the user to re-create it.
+ *
+ * ### It would be nice to make this a non-fatal error,
+ * ### but this function does not get an svn_fs_t object
+ * ### so we have no way of just printing a warning via
+ * ### the fs->warning() callback. */
+
+ const char *src_abspath;
+ const char *dst_abspath;
+ const char *config_relpath;
+ svn_error_t *err2;
+
+ config_relpath = svn_dirent_join(src_fs->path, PATH_CONFIG, pool);
+ err2 = svn_dirent_get_absolute(&src_abspath, src_fs->path, pool);
+ if (err2)
+ return svn_error_trace(svn_error_compose_create(err, err2));
+ err2 = svn_dirent_get_absolute(&dst_abspath, dst_fs->path, pool);
+ if (err2)
+ return svn_error_trace(svn_error_compose_create(err, err2));
+
+ /* ### hack: strip off the 'db/' directory from paths so
+ * ### they make sense to the user */
+ src_abspath = svn_dirent_dirname(src_abspath, pool);
+ dst_abspath = svn_dirent_dirname(dst_abspath, pool);
+
+ return svn_error_quick_wrapf(err,
+ _("Failed to create hotcopy at '%s'. "
+ "The file '%s' is missing from the source "
+ "repository. Please create this file, for "
+ "instance by running 'svnadmin upgrade %s'"),
+ dst_abspath, config_relpath, src_abspath);
+ }
+ else
+ return svn_error_trace(err);
+ }
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Find the youngest revision in the source and destination.
+ * We only support hotcopies from sources with an equal or greater amount
+ * of revisions than the destination.
+ * This also catches the case where users accidentally swap the
+ * source and destination arguments. */
+ SVN_ERR(svn_fs_fs__read_current(&src_youngest, &src_next_node_id,
+ &src_next_copy_id, src_fs, pool));
+ if (incremental)
+ {
+ SVN_ERR(svn_fs_fs__youngest_rev(&dst_youngest, dst_fs, pool));
+ if (src_youngest < dst_youngest)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The hotcopy destination already contains more revisions "
+ "(%lu) than the hotcopy source contains (%lu); are source "
+ "and destination swapped?"),
+ dst_youngest, src_youngest);
+ }
+ else
+ dst_youngest = 0;
+
+ src_revs_dir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, pool);
+ dst_revs_dir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, pool);
+ src_revprops_dir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR, pool);
+ dst_revprops_dir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR, pool);
+
+ /* Ensure that the required folders exist in the destination
+ * before actually copying the revisions and revprops. */
+ SVN_ERR(svn_io_make_dir_recursively(dst_revs_dir, pool));
+ SVN_ERR(svn_io_make_dir_recursively(dst_revprops_dir, pool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Split the logic for new and old FS formats. The latter is much simpler
+ * due to the absense of sharding and packing. However, it requires special
+ * care when updating the 'current' file (which contains not just the
+ * revision number, but also the next-ID counters). */
+ if (src_ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ {
+ SVN_ERR(hotcopy_revisions(src_fs, dst_fs, src_youngest, dst_youngest,
+ incremental, src_revs_dir, dst_revs_dir,
+ src_revprops_dir, dst_revprops_dir,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, pool));
+ SVN_ERR(svn_fs_fs__write_current(dst_fs, src_youngest, 0, 0, pool));
+ }
+ else
+ {
+ SVN_ERR(hotcopy_revisions_old(src_fs, dst_fs, src_youngest,
+ src_revs_dir, dst_revs_dir,
+ src_revprops_dir, dst_revprops_dir,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, pool));
+ SVN_ERR(svn_fs_fs__write_current(dst_fs, src_youngest, src_next_node_id,
+ src_next_copy_id, pool));
+ }
+
+ /* Replace the locks tree.
+ * This is racy in case readers are currently trying to list locks in
+ * the destination. However, we need to get rid of stale locks.
+ * This is the simplest way of doing this, so we accept this small race. */
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_LOCKS_DIR, pool);
+ SVN_ERR(svn_io_remove_dir2(dst_subdir, TRUE, cancel_func, cancel_baton,
+ pool));
+ src_subdir = svn_dirent_join(src_fs->path, PATH_LOCKS_DIR, pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
+ if (kind == svn_node_dir)
+ SVN_ERR(svn_io_copy_dir_recursively(src_subdir, dst_fs->path,
+ PATH_LOCKS_DIR, TRUE,
+ cancel_func, cancel_baton, pool));
+
+ /* Now copy the node-origins cache tree. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_NODE_ORIGINS_DIR, pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
+ if (kind == svn_node_dir)
+ SVN_ERR(hotcopy_io_copy_dir_recursively(NULL, src_subdir, dst_fs->path,
+ PATH_NODE_ORIGINS_DIR, TRUE,
+ cancel_func, cancel_baton, pool));
+
+ /*
+ * NB: Data copied below is only read by writers, not readers.
+ * Writers are still locked out at this point.
+ */
+
+ if (dst_ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ {
+ /* Copy the rep cache and then remove entries for revisions
+ * that did not make it into the destination. */
+ src_subdir = svn_dirent_join(src_fs->path, REP_CACHE_DB_NAME, pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, REP_CACHE_DB_NAME, pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, pool));
+ if (kind == svn_node_file)
+ {
+ SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
+
+ /* The source might have r/o flags set on it - which would be
+ carried over to the copy. */
+ SVN_ERR(svn_io_set_file_read_write(dst_subdir, FALSE, pool));
+ SVN_ERR(svn_fs_fs__del_rep_reference(dst_fs, src_youngest, pool));
+ }
+ }
+
+ /* Copy the txn-current file. */
+ if (dst_ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
+ SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
+ PATH_TXN_CURRENT, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Create an empty filesystem at DST_FS at DST_PATH with the same
+ * configuration as SRC_FS (uuid, format, and other parameters).
+ * After creation DST_FS has no revisions, not even revision zero. */
+static svn_error_t *
+hotcopy_create_empty_dest(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+
+ /* Create the DST_FS repository with the same layout as SRC_FS. */
+ SVN_ERR(svn_fs_fs__create_file_tree(dst_fs, dst_path, src_ffd->format,
+ src_ffd->max_files_per_dir,
+ src_ffd->use_log_addressing,
+ pool));
+
+ /* Copy the UUID. Hotcopy destination receives a new instance ID, but
+ * has the same filesystem UUID as the source. */
+ SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, NULL, pool));
+
+ /* Remove revision 0 contents. Otherwise, it may not get overwritten
+ * due to having a newer timestamp. */
+ SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_rev(dst_fs, 0, pool), pool));
+ SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_revprops(dst_fs, 0, pool),
+ pool));
+
+ /* This filesystem is ready. Stamp it with a format number. Fail if
+ * the 'format' file should already exist. */
+ SVN_ERR(svn_fs_fs__write_format(dst_fs, FALSE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ svn_boolean_t incremental,
+ apr_pool_t *pool)
+{
+ if (incremental)
+ {
+ const char *dst_format_abspath;
+ svn_node_kind_t dst_format_kind;
+
+ /* Check destination format to be sure we know how to incrementally
+ * hotcopy to the destination FS. */
+ dst_format_abspath = svn_dirent_join(dst_path, PATH_FORMAT, pool);
+ SVN_ERR(svn_io_check_path(dst_format_abspath, &dst_format_kind, pool));
+ if (dst_format_kind == svn_node_none)
+ {
+ /* Destination doesn't exist yet. Perform a normal hotcopy to a
+ * empty destination using the same configuration as the source. */
+ SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
+ }
+ else
+ {
+ /* Check the existing repository. */
+ SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
+ SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs,
+ pool));
+ }
+ }
+ else
+ {
+ /* Start out with an empty destination using the same configuration
+ * as the source. */
+ SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ 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 *pool)
+{
+ struct hotcopy_body_baton hbb;
+
+ hbb.src_fs = src_fs;
+ hbb.dst_fs = dst_fs;
+ hbb.incremental = incremental;
+ hbb.notify_func = notify_func;
+ hbb.notify_baton = notify_baton;
+ hbb.cancel_func = cancel_func;
+ hbb.cancel_baton = cancel_baton;
+ SVN_ERR(svn_fs_fs__with_all_locks(dst_fs, hotcopy_body, &hbb, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/hotcopy.h b/subversion/libsvn_fs_fs/hotcopy.h
new file mode 100644
index 0000000..ddd6218
--- /dev/null
+++ b/subversion/libsvn_fs_fs/hotcopy.h
@@ -0,0 +1,51 @@
+/* hotcopy.h : interface to the native filesystem layer
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__HOTCOPY_H
+#define SVN_LIBSVN_FS__HOTCOPY_H
+
+#include "fs.h"
+
+/* Create an empty copy of the fsfs filesystem SRC_FS into a new DST_FS at
+ * DST_PATH. If INCREMENTAL is TRUE, perform a few pre-checks only if
+ * a repo already exists at DST_PATH. Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ svn_boolean_t incremental,
+ apr_pool_t *pool);
+
+/* Copy the fsfs filesystem SRC_FS into DST_FS. If INCREMENTAL is TRUE, do
+ * not re-copy data which already exists in DST_FS. Indicate progress via
+ * the optional NOTIFY_FUNC callback using NOTIFY_BATON. Use POOL for
+ * temporary allocations. */
+svn_error_t * svn_fs_fs__hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ 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 *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/id.c b/subversion/libsvn_fs_fs/id.c
index 1317829..bd505e0 100644
--- a/subversion/libsvn_fs_fs/id.c
+++ b/subversion/libsvn_fs_fs/id.c
@@ -24,90 +24,311 @@
#include <stdlib.h>
#include "id.h"
+#include "index.h"
+
#include "../libsvn_fs/fs-loader.h"
#include "private/svn_temp_serializer.h"
#include "private/svn_string_private.h"
-typedef struct id_private_t {
- const char *node_id;
- const char *copy_id;
- const char *txn_id;
- svn_revnum_t rev;
- apr_off_t offset;
-} id_private_t;
+typedef struct fs_fs__id_t
+{
+ /* API visible part */
+ svn_fs_id_t generic_id;
+
+ /* private members */
+ struct
+ {
+ svn_fs_fs__id_part_t node_id;
+ svn_fs_fs__id_part_t copy_id;
+ svn_fs_fs__id_part_t txn_id;
+ svn_fs_fs__id_part_t rev_item;
+ } private_id;
+} fs_fs__id_t;
-/* Accessing ID Pieces. */
-const char *
-svn_fs_fs__id_node_id(const svn_fs_id_t *id)
+/** Like strtol but with a fixed base of 10, locale independent and limited
+ * to non-negative values. Overflows are indicated by a FALSE return value
+ * in which case *RESULT_P will not be modified.
+ *
+ * This allows the compiler to generate massively faster code.
+ * (E.g. Avoiding locale specific processing). ID parsing is one of the
+ * most CPU consuming parts of FSFS data access. Better be quick.
+ */
+static svn_boolean_t
+locale_independent_strtol(long *result_p,
+ const char* buffer,
+ const char** end)
+{
+ /* We allow positive values only. We use unsigned arithmetics to get
+ * well-defined overflow behavior. It also happens to allow for a wider
+ * range of compiler-side optimizations. */
+ unsigned long result = 0;
+ while (1)
+ {
+ unsigned long c = (unsigned char)*buffer - (unsigned char)'0';
+ unsigned long next;
+
+ /* This implies the NUL check. */
+ if (c > 9)
+ break;
+
+ /* Overflow check. Passing this, NEXT can be no more than ULONG_MAX+9
+ * before being truncated to ULONG but it still covers 0 .. ULONG_MAX.
+ */
+ if (result > ULONG_MAX / 10)
+ return FALSE;
+
+ next = result * 10 + c;
+
+ /* Overflow check. In case of an overflow, NEXT is 0..9.
+ * In the non-overflow case, RESULT is either >= 10 or RESULT and NEXT
+ * are both 0. */
+ if (next < result)
+ return FALSE;
+
+ result = next;
+ ++buffer;
+ }
+
+ *end = buffer;
+ if (result > LONG_MAX)
+ return FALSE;
+
+ *result_p = (long)result;
+
+ return TRUE;
+}
+
+/* Parse the NUL-terminated ID part at DATA and write the result into *PART.
+ * Return TRUE if no errors were detected. */
+static svn_boolean_t
+part_parse(svn_fs_fs__id_part_t *part,
+ const char *data)
{
- id_private_t *pvt = id->fsap_data;
+ const char *end;
+
+ /* special case: ID inside some transaction */
+ if (data[0] == '_')
+ {
+ part->revision = SVN_INVALID_REVNUM;
+ part->number = svn__base36toui64(&data, data + 1);
+ return *data == '\0';
+ }
+
+ /* special case: 0 / default ID */
+ if (data[0] == '0' && data[1] == '\0')
+ {
+ part->revision = 0;
+ part->number = 0;
+ return TRUE;
+ }
- return pvt->node_id;
+ /* read old style / new style ID */
+ part->number = svn__base36toui64(&data, data);
+ if (data[0] != '-')
+ {
+ part->revision = 0;
+ return *data == '\0';
+ }
+
+ return locale_independent_strtol(&part->revision, data+1, &end);
}
+/* Parse the transaction id in DATA and store the result in *TXN_ID.
+ * Return FALSE if there was some problem.
+ */
+static svn_boolean_t
+txn_id_parse(svn_fs_fs__id_part_t *txn_id,
+ const char *data)
+{
+ const char *end;
+ if (!locale_independent_strtol(&txn_id->revision, data, &end))
+ return FALSE;
+
+ data = end;
+ if (*data != '-')
+ return FALSE;
-const char *
-svn_fs_fs__id_copy_id(const svn_fs_id_t *id)
+ ++data;
+ txn_id->number = svn__base36toui64(&data, data);
+ return *data == '\0';
+}
+
+/* Write the textual representation of *PART into P and return a pointer
+ * to the first position behind that string.
+ */
+static char *
+unparse_id_part(char *p,
+ const svn_fs_fs__id_part_t *part)
+{
+ if (SVN_IS_VALID_REVNUM(part->revision))
+ {
+ /* ordinary old style / new style ID */
+ p += svn__ui64tobase36(p, part->number);
+ if (part->revision > 0)
+ {
+ *(p++) = '-';
+ p += svn__i64toa(p, part->revision);
+ }
+ }
+ else
+ {
+ /* in txn: mark with "_" prefix */
+ *(p++) = '_';
+ p += svn__ui64tobase36(p, part->number);
+ }
+
+ *(p++) = '.';
+
+ return p;
+}
+
+
+
+/* Operations on ID parts */
+
+svn_boolean_t
+svn_fs_fs__id_part_is_root(const svn_fs_fs__id_part_t* part)
+{
+ return part->revision == 0 && part->number == 0;
+}
+
+svn_boolean_t
+svn_fs_fs__id_part_eq(const svn_fs_fs__id_part_t *lhs,
+ const svn_fs_fs__id_part_t *rhs)
+{
+ return lhs->revision == rhs->revision && lhs->number == rhs->number;
+}
+
+svn_boolean_t
+svn_fs_fs__id_txn_used(const svn_fs_fs__id_part_t *txn_id)
{
- id_private_t *pvt = id->fsap_data;
+ return SVN_IS_VALID_REVNUM(txn_id->revision) || (txn_id->number != 0);
+}
- return pvt->copy_id;
+void
+svn_fs_fs__id_txn_reset(svn_fs_fs__id_part_t *txn_id)
+{
+ txn_id->revision = SVN_INVALID_REVNUM;
+ txn_id->number = 0;
}
+svn_error_t *
+svn_fs_fs__id_txn_parse(svn_fs_fs__id_part_t *txn_id,
+ const char *data)
+{
+ if (! txn_id_parse(txn_id, data))
+ return svn_error_createf(SVN_ERR_FS_MALFORMED_TXN_ID, NULL,
+ "malformed txn id '%s'", data);
+
+ return SVN_NO_ERROR;
+}
const char *
-svn_fs_fs__id_txn_id(const svn_fs_id_t *id)
+svn_fs_fs__id_txn_unparse(const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
{
- id_private_t *pvt = id->fsap_data;
+ char string[2 * SVN_INT64_BUFFER_SIZE + 1];
+ char *p = string;
- return pvt->txn_id;
+ p += svn__i64toa(p, txn_id->revision);
+ *(p++) = '-';
+ p += svn__ui64tobase36(p, txn_id->number);
+
+ return apr_pstrmemdup(pool, string, p - string);
}
+
+
+/* Accessing ID Pieces. */
-svn_revnum_t
-svn_fs_fs__id_rev(const svn_fs_id_t *id)
+const svn_fs_fs__id_part_t *
+svn_fs_fs__id_node_id(const svn_fs_id_t *fs_id)
{
- id_private_t *pvt = id->fsap_data;
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
- return pvt->rev;
+ return &id->private_id.node_id;
}
-apr_off_t
-svn_fs_fs__id_offset(const svn_fs_id_t *id)
+const svn_fs_fs__id_part_t *
+svn_fs_fs__id_copy_id(const svn_fs_id_t *fs_id)
{
- id_private_t *pvt = id->fsap_data;
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
- return pvt->offset;
+ return &id->private_id.copy_id;
}
+const svn_fs_fs__id_part_t *
+svn_fs_fs__id_txn_id(const svn_fs_id_t *fs_id)
+{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ return &id->private_id.txn_id;
+}
+
+
+const svn_fs_fs__id_part_t *
+svn_fs_fs__id_rev_item(const svn_fs_id_t *fs_id)
+{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ return &id->private_id.rev_item;
+}
+
+svn_revnum_t
+svn_fs_fs__id_rev(const svn_fs_id_t *fs_id)
+{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ return id->private_id.rev_item.revision;
+}
+
+apr_uint64_t
+svn_fs_fs__id_item(const svn_fs_id_t *fs_id)
+{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ return id->private_id.rev_item.number;
+}
+
+svn_boolean_t
+svn_fs_fs__id_is_txn(const svn_fs_id_t *fs_id)
+{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ return svn_fs_fs__id_txn_used(&id->private_id.txn_id);
+}
+
svn_string_t *
-svn_fs_fs__id_unparse(const svn_fs_id_t *id,
+svn_fs_fs__id_unparse(const svn_fs_id_t *fs_id,
apr_pool_t *pool)
{
- id_private_t *pvt = id->fsap_data;
+ char string[6 * SVN_INT64_BUFFER_SIZE + 10];
+ const fs_fs__id_t *id = (const fs_fs__id_t *)fs_id;
+
+ char *p = unparse_id_part(string, &id->private_id.node_id);
+ p = unparse_id_part(p, &id->private_id.copy_id);
- if ((! pvt->txn_id))
+ if (svn_fs_fs__id_txn_used(&id->private_id.txn_id))
{
- char rev_string[SVN_INT64_BUFFER_SIZE];
- char offset_string[SVN_INT64_BUFFER_SIZE];
-
- svn__i64toa(rev_string, pvt->rev);
- svn__i64toa(offset_string, pvt->offset);
- return svn_string_createf(pool, "%s.%s.r%s/%s",
- pvt->node_id, pvt->copy_id,
- rev_string, offset_string);
+ *(p++) = 't';
+ p += svn__i64toa(p, id->private_id.txn_id.revision);
+ *(p++) = '-';
+ p += svn__ui64tobase36(p, id->private_id.txn_id.number);
}
else
{
- return svn_string_createf(pool, "%s.%s.t%s",
- pvt->node_id, pvt->copy_id,
- pvt->txn_id);
+ *(p++) = 'r';
+ p += svn__i64toa(p, id->private_id.rev_item.revision);
+ *(p++) = '/';
+ p += svn__i64toa(p, id->private_id.rev_item.number);
}
+
+ return svn_string_ncreate(string, p - string, pool);
}
@@ -117,23 +338,20 @@ svn_boolean_t
svn_fs_fs__id_eq(const svn_fs_id_t *a,
const svn_fs_id_t *b)
{
- id_private_t *pvta = a->fsap_data, *pvtb = b->fsap_data;
+ const fs_fs__id_t *id_a = (const fs_fs__id_t *)a;
+ const fs_fs__id_t *id_b = (const fs_fs__id_t *)b;
if (a == b)
return TRUE;
- if (strcmp(pvta->node_id, pvtb->node_id) != 0)
- return FALSE;
- if (strcmp(pvta->copy_id, pvtb->copy_id) != 0)
- return FALSE;
- if ((pvta->txn_id == NULL) != (pvtb->txn_id == NULL))
- return FALSE;
- if (pvta->txn_id && pvtb->txn_id && strcmp(pvta->txn_id, pvtb->txn_id) != 0)
- return FALSE;
- if (pvta->rev != pvtb->rev)
- return FALSE;
- if (pvta->offset != pvtb->offset)
- return FALSE;
- return TRUE;
+
+ return svn_fs_fs__id_part_eq(&id_a->private_id.node_id,
+ &id_b->private_id.node_id)
+ && svn_fs_fs__id_part_eq(&id_a->private_id.copy_id,
+ &id_b->private_id.copy_id)
+ && svn_fs_fs__id_part_eq(&id_a->private_id.txn_id,
+ &id_b->private_id.txn_id)
+ && svn_fs_fs__id_part_eq(&id_a->private_id.rev_item,
+ &id_b->private_id.rev_item);
}
@@ -141,30 +359,54 @@ svn_boolean_t
svn_fs_fs__id_check_related(const svn_fs_id_t *a,
const svn_fs_id_t *b)
{
- id_private_t *pvta = a->fsap_data, *pvtb = b->fsap_data;
+ const fs_fs__id_t *id_a = (const fs_fs__id_t *)a;
+ const fs_fs__id_t *id_b = (const fs_fs__id_t *)b;
if (a == b)
return TRUE;
- /* If both node_ids start with _ and they have differing transaction
- IDs, then it is impossible for them to be related. */
- if (pvta->node_id[0] == '_')
+
+ /* If both node_ids have been created within _different_ transactions
+ (and are still uncommitted), then it is impossible for them to be
+ related.
+
+ Due to our txn-local temporary IDs, however, they might have been
+ given the same temporary node ID. We need to detect that case.
+ */
+ if ( id_a->private_id.node_id.revision == SVN_INVALID_REVNUM
+ && id_b->private_id.node_id.revision == SVN_INVALID_REVNUM)
{
- if (pvta->txn_id && pvtb->txn_id &&
- (strcmp(pvta->txn_id, pvtb->txn_id) != 0))
+ if (!svn_fs_fs__id_part_eq(&id_a->private_id.txn_id,
+ &id_b->private_id.txn_id))
return FALSE;
+
+ /* At this point, matching node_ids implies relatedness. */
}
- return (strcmp(pvta->node_id, pvtb->node_id) == 0);
+ return svn_fs_fs__id_part_eq(&id_a->private_id.node_id,
+ &id_b->private_id.node_id);
}
-int
+svn_fs_node_relation_t
svn_fs_fs__id_compare(const svn_fs_id_t *a,
const svn_fs_id_t *b)
{
if (svn_fs_fs__id_eq(a, b))
- return 0;
- return (svn_fs_fs__id_check_related(a, b) ? 1 : -1);
+ return svn_fs_node_unchanged;
+ return (svn_fs_fs__id_check_related(a, b) ? svn_fs_node_common_ancestor
+ : svn_fs_node_unrelated);
+}
+
+int
+svn_fs_fs__id_part_compare(const svn_fs_fs__id_part_t *a,
+ const svn_fs_fs__id_part_t *b)
+{
+ if (a->revision < b->revision)
+ return -1;
+ if (a->revision > b->revision)
+ return 1;
+
+ return a->number < b->number ? -1 : a->number == b->number ? 0 : 1;
}
@@ -176,87 +418,102 @@ static id_vtable_t id_vtable = {
svn_fs_fs__id_compare
};
-
svn_fs_id_t *
-svn_fs_fs__id_txn_create(const char *node_id,
- const char *copy_id,
- const char *txn_id,
- apr_pool_t *pool)
+svn_fs_fs__id_txn_create_root(const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
{
- svn_fs_id_t *id = apr_palloc(pool, sizeof(*id));
- id_private_t *pvt = apr_palloc(pool, sizeof(*pvt));
+ fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
+
+ /* node ID and copy ID are "0" */
+
+ id->private_id.txn_id = *txn_id;
+ id->private_id.rev_item.revision = SVN_INVALID_REVNUM;
- pvt->node_id = apr_pstrdup(pool, node_id);
- pvt->copy_id = apr_pstrdup(pool, copy_id);
- pvt->txn_id = apr_pstrdup(pool, txn_id);
- pvt->rev = SVN_INVALID_REVNUM;
- pvt->offset = -1;
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
- id->vtable = &id_vtable;
- id->fsap_data = pvt;
- return id;
+ return (svn_fs_id_t *)id;
}
+svn_fs_id_t *svn_fs_fs__id_create_root(const svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
+
+ id->private_id.txn_id.revision = SVN_INVALID_REVNUM;
+ id->private_id.rev_item.revision = revision;
+ id->private_id.rev_item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
+
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
+
+ return (svn_fs_id_t *)id;
+}
svn_fs_id_t *
-svn_fs_fs__id_rev_create(const char *node_id,
- const char *copy_id,
- svn_revnum_t rev,
- apr_off_t offset,
+svn_fs_fs__id_txn_create(const svn_fs_fs__id_part_t *node_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
- svn_fs_id_t *id = apr_palloc(pool, sizeof(*id));
- id_private_t *pvt = apr_palloc(pool, sizeof(*pvt));
+ fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
- pvt->node_id = apr_pstrdup(pool, node_id);
- pvt->copy_id = apr_pstrdup(pool, copy_id);
- pvt->txn_id = NULL;
- pvt->rev = rev;
- pvt->offset = offset;
+ id->private_id.node_id = *node_id;
+ id->private_id.copy_id = *copy_id;
+ id->private_id.txn_id = *txn_id;
+ id->private_id.rev_item.revision = SVN_INVALID_REVNUM;
- id->vtable = &id_vtable;
- id->fsap_data = pvt;
- return id;
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
+
+ return (svn_fs_id_t *)id;
}
svn_fs_id_t *
-svn_fs_fs__id_copy(const svn_fs_id_t *id, apr_pool_t *pool)
+svn_fs_fs__id_rev_create(const svn_fs_fs__id_part_t *node_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *rev_item,
+ apr_pool_t *pool)
{
- svn_fs_id_t *new_id = apr_palloc(pool, sizeof(*new_id));
- id_private_t *new_pvt = apr_palloc(pool, sizeof(*new_pvt));
- id_private_t *pvt = id->fsap_data;
+ fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
- new_pvt->node_id = apr_pstrdup(pool, pvt->node_id);
- new_pvt->copy_id = apr_pstrdup(pool, pvt->copy_id);
- new_pvt->txn_id = pvt->txn_id ? apr_pstrdup(pool, pvt->txn_id) : NULL;
- new_pvt->rev = pvt->rev;
- new_pvt->offset = pvt->offset;
+ id->private_id.node_id = *node_id;
+ id->private_id.copy_id = *copy_id;
+ id->private_id.txn_id.revision = SVN_INVALID_REVNUM;
+ id->private_id.rev_item = *rev_item;
- new_id->vtable = &id_vtable;
- new_id->fsap_data = new_pvt;
- return new_id;
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
+
+ return (svn_fs_id_t *)id;
}
svn_fs_id_t *
-svn_fs_fs__id_parse(const char *data,
- apr_size_t len,
- apr_pool_t *pool)
+svn_fs_fs__id_copy(const svn_fs_id_t *source, apr_pool_t *pool)
{
- svn_fs_id_t *id;
- id_private_t *pvt;
- char *data_copy, *str;
+ const fs_fs__id_t *id = (const fs_fs__id_t *)source;
+ fs_fs__id_t *new_id = apr_pmemdup(pool, id, sizeof(*new_id));
+
+ new_id->generic_id.fsap_data = new_id;
+
+ return (svn_fs_id_t *)new_id;
+}
- /* Dup the ID data into POOL. Our returned ID will have references
- into this memory. */
- data_copy = apr_pstrmemdup(pool, data, len);
+/* Return an ID resulting from parsing the string DATA, or NULL if DATA is
+ an invalid ID string. *DATA will be modified / invalidated by this call. */
+static svn_fs_id_t *
+id_parse(char *data,
+ apr_pool_t *pool)
+{
+ fs_fs__id_t *id;
+ char *str;
/* Alloc a new svn_fs_id_t structure. */
- id = apr_palloc(pool, sizeof(*id));
- pvt = apr_palloc(pool, sizeof(*pvt));
- id->vtable = &id_vtable;
- id->fsap_data = pvt;
+ id = apr_pcalloc(pool, sizeof(*id));
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
/* Now, we basically just need to "split" this data on `.'
characters. We will use svn_cstring_tokenize, which will put
@@ -265,141 +522,120 @@ svn_fs_fs__id_parse(const char *data,
string.*/
/* Node Id */
- str = svn_cstring_tokenize(".", &data_copy);
+ str = svn_cstring_tokenize(".", &data);
if (str == NULL)
return NULL;
- pvt->node_id = str;
+ if (! part_parse(&id->private_id.node_id, str))
+ return NULL;
/* Copy Id */
- str = svn_cstring_tokenize(".", &data_copy);
+ str = svn_cstring_tokenize(".", &data);
if (str == NULL)
return NULL;
- pvt->copy_id = str;
+ if (! part_parse(&id->private_id.copy_id, str))
+ return NULL;
/* Txn/Rev Id */
- str = svn_cstring_tokenize(".", &data_copy);
+ str = svn_cstring_tokenize(".", &data);
if (str == NULL)
return NULL;
if (str[0] == 'r')
{
apr_int64_t val;
+ const char *tmp;
svn_error_t *err;
/* This is a revision type ID */
- pvt->txn_id = NULL;
+ id->private_id.txn_id.revision = SVN_INVALID_REVNUM;
+ id->private_id.txn_id.number = 0;
- data_copy = str + 1;
- str = svn_cstring_tokenize("/", &data_copy);
+ data = str + 1;
+ str = svn_cstring_tokenize("/", &data);
if (str == NULL)
return NULL;
- pvt->rev = SVN_STR_TO_REV(str);
-
- str = svn_cstring_tokenize("/", &data_copy);
- if (str == NULL)
+ if (!locale_independent_strtol(&id->private_id.rev_item.revision,
+ str, &tmp))
return NULL;
- err = svn_cstring_atoi64(&val, str);
+
+ err = svn_cstring_atoi64(&val, data);
if (err)
{
svn_error_clear(err);
return NULL;
}
- pvt->offset = (apr_off_t)val;
+ id->private_id.rev_item.number = (apr_uint64_t)val;
}
else if (str[0] == 't')
{
/* This is a transaction type ID */
- pvt->txn_id = str + 1;
- pvt->rev = SVN_INVALID_REVNUM;
- pvt->offset = -1;
+ id->private_id.rev_item.revision = SVN_INVALID_REVNUM;
+ id->private_id.rev_item.number = 0;
+
+ if (! txn_id_parse(&id->private_id.txn_id, str + 1))
+ return NULL;
}
else
return NULL;
- return id;
+ return (svn_fs_id_t *)id;
}
-/* (de-)serialization support */
-
-/* Serialization of the PVT sub-structure within the CONTEXT.
- */
-static void
-serialize_id_private(svn_temp_serializer__context_t *context,
- const id_private_t * const *pvt)
+svn_error_t *
+svn_fs_fs__id_parse(const svn_fs_id_t **id_p,
+ char *data,
+ apr_pool_t *pool)
{
- const id_private_t *private = *pvt;
-
- /* serialize the pvt data struct itself */
- svn_temp_serializer__push(context,
- (const void * const *)pvt,
- sizeof(*private));
+ svn_fs_id_t *id = id_parse(data, pool);
+ if (id == NULL)
+ return svn_error_createf(SVN_ERR_FS_MALFORMED_NODEREV_ID, NULL,
+ "Malformed node revision ID string");
- /* append the referenced strings */
- svn_temp_serializer__add_string(context, &private->node_id);
- svn_temp_serializer__add_string(context, &private->copy_id);
- svn_temp_serializer__add_string(context, &private->txn_id);
+ *id_p = id;
- /* return to caller's nesting level */
- svn_temp_serializer__pop(context);
+ return SVN_NO_ERROR;
}
+/* (de-)serialization support */
+
/* Serialize an ID within the serialization CONTEXT.
*/
void
svn_fs_fs__id_serialize(svn_temp_serializer__context_t *context,
- const struct svn_fs_id_t * const *id)
+ const svn_fs_id_t * const *in)
{
+ const fs_fs__id_t *id = (const fs_fs__id_t *)*in;
+
/* nothing to do for NULL ids */
- if (*id == NULL)
+ if (id == NULL)
return;
/* serialize the id data struct itself */
- svn_temp_serializer__push(context,
- (const void * const *)id,
- sizeof(**id));
-
- /* serialize the id_private_t data sub-struct */
- serialize_id_private(context,
- (const id_private_t * const *)&(*id)->fsap_data);
-
- /* return to caller's nesting level */
- svn_temp_serializer__pop(context);
-}
-
-/* Deserialization of the PVT sub-structure in BUFFER.
- */
-static void
-deserialize_id_private(void *buffer, id_private_t **pvt)
-{
- /* fixup the reference to the only sub-structure */
- id_private_t *private;
- svn_temp_deserializer__resolve(buffer, (void**)pvt);
-
- /* fixup the sub-structure itself */
- private = *pvt;
- svn_temp_deserializer__resolve(private, (void**)&private->node_id);
- svn_temp_deserializer__resolve(private, (void**)&private->copy_id);
- svn_temp_deserializer__resolve(private, (void**)&private->txn_id);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)in,
+ sizeof(fs_fs__id_t));
}
/* Deserialize an ID inside the BUFFER.
*/
void
-svn_fs_fs__id_deserialize(void *buffer, svn_fs_id_t **id)
+svn_fs_fs__id_deserialize(void *buffer, svn_fs_id_t **in_out)
{
+ fs_fs__id_t *id;
+
/* The id maybe all what is in the whole buffer.
* Don't try to fixup the pointer in that case*/
- if (*id != buffer)
- svn_temp_deserializer__resolve(buffer, (void**)id);
+ if (*in_out != buffer)
+ svn_temp_deserializer__resolve(buffer, (void**)in_out);
+
+ id = (fs_fs__id_t *)*in_out;
/* no id, no sub-structure fixup necessary */
- if (*id == NULL)
+ if (id == NULL)
return;
/* the stored vtable is bogus at best -> set the right one */
- (*id)->vtable = &id_vtable;
-
- /* handle sub-structures */
- deserialize_id_private(*id, (id_private_t **)&(*id)->fsap_data);
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = id;
}
diff --git a/subversion/libsvn_fs_fs/id.h b/subversion/libsvn_fs_fs/id.h
index 11da466..d556a16 100644
--- a/subversion/libsvn_fs_fs/id.h
+++ b/subversion/libsvn_fs_fs/id.h
@@ -24,30 +24,63 @@
#define SVN_LIBSVN_FS_FS_ID_H
#include "svn_fs.h"
+#include "private/svn_fs_fs_private.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
+/*** Operations on ID parts. ***/
+
+/* Return TRUE, if both elements of the PART is 0, i.e. this is the default
+ * value if e.g. no copies were made of this node. */
+svn_boolean_t svn_fs_fs__id_part_is_root(const svn_fs_fs__id_part_t *part);
+
+/* Return TRUE, if all element values of *LHS and *RHS match. */
+svn_boolean_t svn_fs_fs__id_part_eq(const svn_fs_fs__id_part_t *lhs,
+ const svn_fs_fs__id_part_t *rhs);
+
+/* Return TRUE, if TXN_ID is used, i.e. doesn't contain just the defaults. */
+svn_boolean_t svn_fs_fs__id_txn_used(const svn_fs_fs__id_part_t *txn_id);
+
+/* Reset TXN_ID to the defaults. */
+void svn_fs_fs__id_txn_reset(svn_fs_fs__id_part_t *txn_id);
+
+/* Parse the transaction id in DATA and store the result in *TXN_ID */
+svn_error_t *svn_fs_fs__id_txn_parse(svn_fs_fs__id_part_t *txn_id,
+ const char *data);
+
+/* Convert the transaction id in *TXN_ID into a textual representation
+ * allocated in POOL. */
+const char *svn_fs_fs__id_txn_unparse(const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+
/*** ID accessor functions. ***/
/* Get the "node id" portion of ID. */
-const char *svn_fs_fs__id_node_id(const svn_fs_id_t *id);
+const svn_fs_fs__id_part_t *svn_fs_fs__id_node_id(const svn_fs_id_t *id);
/* Get the "copy id" portion of ID. */
-const char *svn_fs_fs__id_copy_id(const svn_fs_id_t *id);
+const svn_fs_fs__id_part_t *svn_fs_fs__id_copy_id(const svn_fs_id_t *id);
/* Get the "txn id" portion of ID, or NULL if it is a permanent ID. */
-const char *svn_fs_fs__id_txn_id(const svn_fs_id_t *id);
+const svn_fs_fs__id_part_t *svn_fs_fs__id_txn_id(const svn_fs_id_t *id);
+
+/* Get the "rev,item" portion of ID. */
+const svn_fs_fs__id_part_t *svn_fs_fs__id_rev_item(const svn_fs_id_t *id);
/* Get the "rev" portion of ID, or SVN_INVALID_REVNUM if it is a
transaction ID. */
svn_revnum_t svn_fs_fs__id_rev(const svn_fs_id_t *id);
-/* Access the "offset" portion of the ID, or -1 if it is a transaction
+/* Access the "item" portion of the ID, or 0 if it is a transaction
ID. */
-apr_off_t svn_fs_fs__id_offset(const svn_fs_id_t *id);
+apr_uint64_t svn_fs_fs__id_item(const svn_fs_id_t *id);
+
+/* Return TRUE, if this is a transaction ID. */
+svn_boolean_t svn_fs_fs__id_is_txn(const svn_fs_id_t *id);
/* Convert ID into string form, allocated in POOL. */
svn_string_t *svn_fs_fs__id_unparse(const svn_fs_id_t *id,
@@ -61,34 +94,48 @@ svn_boolean_t svn_fs_fs__id_eq(const svn_fs_id_t *a,
svn_boolean_t svn_fs_fs__id_check_related(const svn_fs_id_t *a,
const svn_fs_id_t *b);
-/* Return 0 if A and B are equal, 1 if they are related, -1 otherwise. */
-int svn_fs_fs__id_compare(const svn_fs_id_t *a,
- const svn_fs_id_t *b);
+/* Return the noderev relationship between A and B. */
+svn_fs_node_relation_t svn_fs_fs__id_compare(const svn_fs_id_t *a,
+ const svn_fs_id_t *b);
+
+/* Return 0 if A and B are equal, 1 if A is "greater than" B, -1 otherwise. */
+int svn_fs_fs__id_part_compare(const svn_fs_fs__id_part_t *a,
+ const svn_fs_fs__id_part_t *b);
+
+/* Create the txn root ID for transaction TXN_ID. Allocate it in POOL. */
+svn_fs_id_t *svn_fs_fs__id_txn_create_root(const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Create the root ID for REVISION (logical addressing node only).
+ Allocate it in POOL. */
+svn_fs_id_t *svn_fs_fs__id_create_root(const svn_revnum_t revision,
+ apr_pool_t *pool);
/* Create an ID within a transaction based on NODE_ID, COPY_ID, and
TXN_ID, allocated in POOL. */
-svn_fs_id_t *svn_fs_fs__id_txn_create(const char *node_id,
- const char *copy_id,
- const char *txn_id,
+svn_fs_id_t *svn_fs_fs__id_txn_create(const svn_fs_fs__id_part_t *node_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool);
-/* Create a permanent ID based on NODE_ID, COPY_ID, REV, and OFFSET,
+/* Create a permanent ID based on NODE_ID, COPY_ID and REV_ITEM,
allocated in POOL. */
-svn_fs_id_t *svn_fs_fs__id_rev_create(const char *node_id,
- const char *copy_id,
- svn_revnum_t rev,
- apr_off_t offset,
+svn_fs_id_t *svn_fs_fs__id_rev_create(const svn_fs_fs__id_part_t *node_id,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *rev_item,
apr_pool_t *pool);
/* Return a copy of ID, allocated from POOL. */
svn_fs_id_t *svn_fs_fs__id_copy(const svn_fs_id_t *id,
apr_pool_t *pool);
-/* Return an ID resulting from parsing the string DATA (with length
- LEN), or NULL if DATA is an invalid ID string. */
-svn_fs_id_t *svn_fs_fs__id_parse(const char *data,
- apr_size_t len,
- apr_pool_t *pool);
+/* Return an ID in *ID_P resulting from parsing the string DATA, or an error
+ if DATA is an invalid ID string. *DATA will be modified / invalidated by
+ this call. */
+svn_error_t *
+svn_fs_fs__id_parse(const svn_fs_id_t **id_p,
+ char *data,
+ apr_pool_t *pool);
/* (de-)serialization support*/
diff --git a/subversion/libsvn_fs_fs/index.c b/subversion/libsvn_fs_fs/index.c
new file mode 100644
index 0000000..a669558
--- /dev/null
+++ b/subversion/libsvn_fs_fs/index.c
@@ -0,0 +1,3470 @@
+/* index.c indexing support for FSFS support
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_io.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
+#include "svn_private_config.h"
+
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "index.h"
+#include "pack.h"
+#include "temp_serializer.h"
+#include "util.h"
+#include "fs_fs.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+/* maximum length of a uint64 in an 7/8b encoding */
+#define ENCODED_INT_LENGTH 10
+
+/* APR is missing an APR_OFF_T_MAX. So, define one. We will use it to
+ * limit file offsets stored in the indexes.
+ *
+ * We assume that everything shorter than 64 bits, it is at least 32 bits.
+ * We also assume that the type is always signed meaning we only have an
+ * effective positive range of 63 or 31 bits, respectively.
+ */
+static
+const apr_uint64_t off_t_max = (sizeof(apr_off_t) == sizeof(apr_int64_t))
+ ? APR_INT64_MAX
+ : APR_INT32_MAX;
+
+/* We store P2L proto-index entries as 6 values, 64 bits each on disk.
+ * See also svn_fs_fs__p2l_proto_index_add_entry().
+ */
+#define P2L_PROTO_INDEX_ENTRY_SIZE (6 * sizeof(apr_uint64_t))
+
+/* We put this string in front of the L2P index header. */
+#define L2P_STREAM_PREFIX "L2P-INDEX\n"
+
+/* We put this string in front of the P2L index header. */
+#define P2L_STREAM_PREFIX "P2L-INDEX\n"
+
+/* Size of the buffer that will fit the index header prefixes. */
+#define STREAM_PREFIX_LEN MAX(sizeof(L2P_STREAM_PREFIX), \
+ sizeof(P2L_STREAM_PREFIX))
+
+/* Page tables in the log-to-phys index file exclusively contain entries
+ * of this type to describe position and size of a given page.
+ */
+typedef struct l2p_page_table_entry_t
+{
+ /* global offset on the page within the index file */
+ apr_uint64_t offset;
+
+ /* number of mapping entries in that page */
+ apr_uint32_t entry_count;
+
+ /* size of the page on disk (in the index file) */
+ apr_uint32_t size;
+} l2p_page_table_entry_t;
+
+/* Master run-time data structure of an log-to-phys index. It contains
+ * the page tables of every revision covered by that index - but not the
+ * pages themselves.
+ */
+typedef struct l2p_header_t
+{
+ /* first revision covered by this index */
+ svn_revnum_t first_revision;
+
+ /* number of revisions covered */
+ apr_size_t revision_count;
+
+ /* (max) number of entries per page */
+ apr_uint32_t page_size;
+
+ /* indexes into PAGE_TABLE that mark the first page of the respective
+ * revision. PAGE_TABLE_INDEX[REVISION_COUNT] points to the end of
+ * PAGE_TABLE.
+ */
+ apr_size_t * page_table_index;
+
+ /* Page table covering all pages in the index */
+ l2p_page_table_entry_t * page_table;
+} l2p_header_t;
+
+/* Run-time data structure containing a single log-to-phys index page.
+ */
+typedef struct l2p_page_t
+{
+ /* number of entries in the OFFSETS array */
+ apr_uint32_t entry_count;
+
+ /* global file offsets (item index is the array index) within the
+ * packed or non-packed rev file. Offset will be -1 for unused /
+ * invalid item index values. */
+ apr_uint64_t *offsets;
+} l2p_page_t;
+
+/* All of the log-to-phys proto index file consist of entries of this type.
+ */
+typedef struct l2p_proto_entry_t
+{
+ /* phys offset + 1 of the data container. 0 for "new revision" entries. */
+ apr_uint64_t offset;
+
+ /* corresponding item index. 0 for "new revision" entries. */
+ apr_uint64_t item_index;
+} l2p_proto_entry_t;
+
+/* Master run-time data structure of an phys-to-log index. It contains
+ * an array with one offset value for each rev file cluster.
+ */
+typedef struct p2l_header_t
+{
+ /* first revision covered by the index (and rev file) */
+ svn_revnum_t first_revision;
+
+ /* number of bytes in the rev files covered by each p2l page */
+ apr_uint64_t page_size;
+
+ /* number of pages / clusters in that rev file */
+ apr_size_t page_count;
+
+ /* number of bytes in the rev file */
+ apr_uint64_t file_size;
+
+ /* offsets of the pages / cluster descriptions within the index file */
+ apr_off_t *offsets;
+} p2l_header_t;
+
+/*
+ * packed stream
+ *
+ * This is a utility object that will read files containing 7b/8b encoded
+ * unsigned integers. It decodes them in batches to minimize overhead
+ * and supports random access to random file locations.
+ */
+
+/* How many numbers we will pre-fetch and buffer in a packed number stream.
+ */
+enum { MAX_NUMBER_PREFETCH = 64 };
+
+/* Prefetched number entry in a packed number stream.
+ */
+typedef struct value_position_pair_t
+{
+ /* prefetched number */
+ apr_uint64_t value;
+
+ /* number of bytes read, *including* this number, since the buffer start */
+ apr_size_t total_len;
+} value_position_pair_t;
+
+/* State of a prefetching packed number stream. It will read compressed
+ * index data efficiently and present it as a series of non-packed uint64.
+ */
+struct svn_fs_fs__packed_number_stream_t
+{
+ /* underlying data file containing the packed values */
+ apr_file_t *file;
+
+ /* Offset within FILE at which the stream data starts
+ * (i.e. which offset will reported as offset 0 by packed_stream_offset). */
+ apr_off_t stream_start;
+
+ /* First offset within FILE after the stream data.
+ * Attempts to read beyond this will cause an "Unexpected End Of Stream"
+ * error. */
+ apr_off_t stream_end;
+
+ /* number of used entries in BUFFER (starting at index 0) */
+ apr_size_t used;
+
+ /* index of the next number to read from the BUFFER (0 .. USED).
+ * If CURRENT == USED, we need to read more data upon get() */
+ apr_size_t current;
+
+ /* offset in FILE from which the first entry in BUFFER has been read */
+ apr_off_t start_offset;
+
+ /* offset in FILE from which the next number has to be read */
+ apr_off_t next_offset;
+
+ /* read the file in chunks of this size */
+ apr_size_t block_size;
+
+ /* pool to be used for file ops etc. */
+ apr_pool_t *pool;
+
+ /* buffer for prefetched values */
+ value_position_pair_t buffer[MAX_NUMBER_PREFETCH];
+};
+
+/* Return an svn_error_t * object for error ERR on STREAM with the given
+ * MESSAGE string. The latter must have a placeholder for the index file
+ * name ("%s") and the current read offset (e.g. "0x%lx").
+ */
+static svn_error_t *
+stream_error_create(svn_fs_fs__packed_number_stream_t *stream,
+ apr_status_t err,
+ const char *message)
+{
+ const char *file_name;
+ apr_off_t offset;
+ SVN_ERR(svn_io_file_name_get(&file_name, stream->file,
+ stream->pool));
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, stream->file, stream->pool));
+
+ return svn_error_createf(err, NULL, message, file_name,
+ apr_psprintf(stream->pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ (apr_uint64_t)offset));
+}
+
+/* Read up to MAX_NUMBER_PREFETCH numbers from the STREAM->NEXT_OFFSET in
+ * STREAM->FILE and buffer them.
+ *
+ * We don't want GCC and others to inline this (infrequently called)
+ * function into packed_stream_get() because it prevents the latter from
+ * being inlined itself.
+ */
+SVN__PREVENT_INLINE
+static svn_error_t *
+packed_stream_read(svn_fs_fs__packed_number_stream_t *stream)
+{
+ unsigned char buffer[MAX_NUMBER_PREFETCH];
+ apr_size_t read = 0;
+ apr_size_t i;
+ value_position_pair_t *target;
+ apr_off_t block_start = 0;
+ apr_off_t block_left = 0;
+ apr_status_t err;
+
+ /* all buffered data will have been read starting here */
+ stream->start_offset = stream->next_offset;
+
+ /* packed numbers are usually not aligned to MAX_NUMBER_PREFETCH blocks,
+ * i.e. the last number has been incomplete (and not buffered in stream)
+ * and need to be re-read. Therefore, always correct the file pointer.
+ */
+ SVN_ERR(svn_io_file_aligned_seek(stream->file, stream->block_size,
+ &block_start, stream->next_offset,
+ stream->pool));
+
+ /* prefetch at least one number but, if feasible, don't cross block
+ * boundaries. This shall prevent jumping back and forth between two
+ * blocks because the extra data was not actually request _now_.
+ */
+ read = sizeof(buffer);
+ block_left = stream->block_size - (stream->next_offset - block_start);
+ if (block_left >= 10 && block_left < read)
+ read = (apr_size_t)block_left;
+
+ /* Don't read beyond the end of the file section that belongs to this
+ * index / stream. */
+ read = (apr_size_t)MIN(read, stream->stream_end - stream->next_offset);
+
+ err = apr_file_read(stream->file, buffer, &read);
+ if (err && !APR_STATUS_IS_EOF(err))
+ return stream_error_create(stream, err,
+ _("Can't read index file '%s' at offset 0x%s"));
+
+ /* if the last number is incomplete, trim it from the buffer */
+ while (read > 0 && buffer[read-1] >= 0x80)
+ --read;
+
+ /* we call read() only if get() requires more data. So, there must be
+ * at least *one* further number. */
+ if SVN__PREDICT_FALSE(read == 0)
+ return stream_error_create(stream, err,
+ _("Unexpected end of index file %s at offset 0x%s"));
+
+ /* parse file buffer and expand into stream buffer */
+ target = stream->buffer;
+ for (i = 0; i < read;)
+ {
+ if (buffer[i] < 0x80)
+ {
+ /* numbers < 128 are relatively frequent and particularly easy
+ * to decode. Give them special treatment. */
+ target->value = buffer[i];
+ ++i;
+ target->total_len = i;
+ ++target;
+ }
+ else
+ {
+ apr_uint64_t value = 0;
+ apr_uint64_t shift = 0;
+ while (buffer[i] >= 0x80)
+ {
+ value += ((apr_uint64_t)buffer[i] & 0x7f) << shift;
+ shift += 7;
+ ++i;
+ }
+
+ target->value = value + ((apr_uint64_t)buffer[i] << shift);
+ ++i;
+ target->total_len = i;
+ ++target;
+
+ /* let's catch corrupted data early. It would surely cause
+ * havoc further down the line. */
+ if SVN__PREDICT_FALSE(shift > 8 * sizeof(value))
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Corrupt index: number too large"));
+ }
+ }
+
+ /* update stream state */
+ stream->used = target - stream->buffer;
+ stream->next_offset = stream->start_offset + i;
+ stream->current = 0;
+
+ return SVN_NO_ERROR;
+}
+
+/* Create and open a packed number stream reading from offsets START to
+ * END in FILE and return it in *STREAM. Access the file in chunks of
+ * BLOCK_SIZE bytes. Expect the stream to be prefixed by STREAM_PREFIX.
+ * Allocate *STREAM in RESULT_POOL and use SCRATCH_POOL for temporaries.
+ */
+static svn_error_t *
+packed_stream_open(svn_fs_fs__packed_number_stream_t **stream,
+ apr_file_t *file,
+ apr_off_t start,
+ apr_off_t end,
+ const char *stream_prefix,
+ apr_size_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ char buffer[STREAM_PREFIX_LEN + 1] = { 0 };
+ apr_size_t len = strlen(stream_prefix);
+ svn_fs_fs__packed_number_stream_t *result;
+
+ /* If this is violated, we forgot to adjust STREAM_PREFIX_LEN after
+ * changing the index header prefixes. */
+ SVN_ERR_ASSERT(len < sizeof(buffer));
+
+ /* Read the header prefix and compare it with the expected prefix */
+ SVN_ERR(svn_io_file_aligned_seek(file, block_size, NULL, start,
+ scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(file, buffer, len, NULL, NULL,
+ scratch_pool));
+
+ if (strncmp(buffer, stream_prefix, len))
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index stream header prefix mismatch.\n"
+ " expected: %s"
+ " found: %s"), stream_prefix, buffer);
+
+ /* Construct the actual stream object. */
+ result = apr_palloc(result_pool, sizeof(*result));
+
+ result->pool = result_pool;
+ result->file = file;
+ result->stream_start = start + len;
+ result->stream_end = end;
+
+ result->used = 0;
+ result->current = 0;
+ result->start_offset = result->stream_start;
+ result->next_offset = result->stream_start;
+ result->block_size = block_size;
+
+ *stream = result;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * The forced inline is required for performance reasons: This is a very
+ * hot code path (called for every item we read) but e.g. GCC would rather
+ * chose to inline packed_stream_read() here, preventing packed_stream_get
+ * from being inlined itself.
+ */
+SVN__FORCE_INLINE
+static svn_error_t*
+packed_stream_get(apr_uint64_t *value,
+ svn_fs_fs__packed_number_stream_t *stream)
+{
+ if (stream->current == stream->used)
+ SVN_ERR(packed_stream_read(stream));
+
+ *value = stream->buffer[stream->current].value;
+ ++stream->current;
+
+ return SVN_NO_ERROR;
+}
+
+/* Navigate STREAM to packed stream offset OFFSET. There will be no checks
+ * whether the given OFFSET is valid.
+ */
+static void
+packed_stream_seek(svn_fs_fs__packed_number_stream_t *stream,
+ apr_off_t offset)
+{
+ apr_off_t file_offset = offset + stream->stream_start;
+
+ if ( stream->used == 0
+ || offset < stream->start_offset
+ || offset >= stream->next_offset)
+ {
+ /* outside buffered data. Next get() will read() from OFFSET. */
+ stream->start_offset = file_offset;
+ stream->next_offset = file_offset;
+ stream->current = 0;
+ stream->used = 0;
+ }
+ else
+ {
+ /* Find the suitable location in the stream buffer.
+ * Since our buffer is small, it is efficient enough to simply scan
+ * it for the desired position. */
+ apr_size_t i;
+ for (i = 0; i < stream->used; ++i)
+ if (stream->buffer[i].total_len > file_offset - stream->start_offset)
+ break;
+
+ stream->current = i;
+ }
+}
+
+/* Return the packed stream offset of at which the next number in the stream
+ * can be found.
+ */
+static apr_off_t
+packed_stream_offset(svn_fs_fs__packed_number_stream_t *stream)
+{
+ apr_off_t file_offset
+ = stream->current == 0
+ ? stream->start_offset
+ : stream->buffer[stream->current-1].total_len + stream->start_offset;
+
+ return file_offset - stream->stream_start;
+}
+
+/* Encode VALUE as 7/8b into P and return the number of bytes written.
+ * This will be used when _writing_ packed data. packed_stream_* is for
+ * read operations only.
+ */
+static apr_size_t
+encode_uint(unsigned char *p, apr_uint64_t value)
+{
+ unsigned char *start = p;
+ while (value >= 0x80)
+ {
+ *p = (unsigned char)((value % 0x80) + 0x80);
+ value /= 0x80;
+ ++p;
+ }
+
+ *p = (unsigned char)(value % 0x80);
+ return (p - start) + 1;
+}
+
+/* Encode VALUE as 7/8b into P and return the number of bytes written.
+ * This maps signed ints onto unsigned ones.
+ */
+static apr_size_t
+encode_int(unsigned char *p, apr_int64_t value)
+{
+ return encode_uint(p, (apr_uint64_t)(value < 0 ? -1 - 2*value : 2*value));
+}
+
+/* Append VALUE to STREAM in 7/8b encoding.
+ */
+static svn_error_t *
+stream_write_encoded(svn_stream_t *stream,
+ apr_uint64_t value)
+{
+ unsigned char encoded[ENCODED_INT_LENGTH];
+
+ apr_size_t len = encode_uint(encoded, value);
+ return svn_error_trace(svn_stream_write(stream, (char *)encoded, &len));
+}
+
+/* Map unsigned VALUE back to signed integer.
+ */
+static apr_int64_t
+decode_int(apr_uint64_t value)
+{
+ return (apr_int64_t)(value % 2 ? -1 - value / 2 : value / 2);
+}
+
+/* Write VALUE to the PROTO_INDEX file, using SCRATCH_POOL for temporary
+ * allocations.
+ *
+ * The point of this function is to ensure an architecture-independent
+ * proto-index file format. All data is written as unsigned 64 bits ints
+ * in little endian byte order. 64 bits is the largest portable integer
+ * we have and unsigned values have well-defined conversions in C.
+ */
+static svn_error_t *
+write_uint64_to_proto_index(apr_file_t *proto_index,
+ apr_uint64_t value,
+ apr_pool_t *scratch_pool)
+{
+ apr_byte_t buffer[sizeof(value)];
+ int i;
+ apr_size_t written;
+
+ /* Split VALUE into 8 bytes using LE ordering. */
+ for (i = 0; i < sizeof(buffer); ++i)
+ {
+ /* Unsigned conversions are well-defined ... */
+ buffer[i] = (apr_byte_t)value;
+ value >>= CHAR_BIT;
+ }
+
+ /* Write it all to disk. */
+ SVN_ERR(svn_io_file_write_full(proto_index, buffer, sizeof(buffer),
+ &written, scratch_pool));
+ SVN_ERR_ASSERT(written == sizeof(buffer));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read one unsigned 64 bit value from PROTO_INDEX file and return it in
+ * *VALUE_P. If EOF is NULL, error out when trying to read beyond EOF.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * This function is the inverse to write_uint64_to_proto_index (see there),
+ * reading the external LE byte order and convert it into host byte order.
+ */
+static svn_error_t *
+read_uint64_from_proto_index(apr_file_t *proto_index,
+ apr_uint64_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_byte_t buffer[sizeof(*value_p)];
+ apr_size_t read;
+
+ /* Read the full 8 bytes or our 64 bit value, unless we hit EOF.
+ * Assert that we never read partial values. */
+ SVN_ERR(svn_io_file_read_full2(proto_index, buffer, sizeof(buffer),
+ &read, eof, scratch_pool));
+ SVN_ERR_ASSERT((eof && *eof) || read == sizeof(buffer));
+
+ /* If we did not hit EOF, reconstruct the uint64 value and return it. */
+ if (!eof || !*eof)
+ {
+ int i;
+ apr_uint64_t value;
+
+ /* This could only overflow if CHAR_BIT had a value that is not
+ * a divisor of 64. */
+ value = 0;
+ for (i = sizeof(buffer) - 1; i >= 0; --i)
+ value = (value << CHAR_BIT) + buffer[i];
+
+ *value_p = value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience function similar to read_uint64_from_proto_index, but returns
+ * an uint32 value in VALUE_P. Return an error if the value does not fit.
+ */
+static svn_error_t *
+read_uint32_from_proto_index(apr_file_t *proto_index,
+ apr_uint32_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t value;
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &value, eof,
+ scratch_pool));
+ if (!eof || !*eof)
+ {
+ if (value > APR_UINT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("UINT32 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ value),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ (apr_uint64_t)APR_UINT32_MAX));
+
+ /* This conversion is not lossy because the value can be represented
+ * in the target type. */
+ *value_p = (apr_uint32_t)value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience function similar to read_uint64_from_proto_index, but returns
+ * an off_t value in VALUE_P. Return an error if the value does not fit.
+ */
+static svn_error_t *
+read_off_t_from_proto_index(apr_file_t *proto_index,
+ apr_off_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t value;
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &value, eof,
+ scratch_pool));
+ if (!eof || !*eof)
+ {
+ if (value > off_t_max)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("File offset 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ value),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ off_t_max));
+
+ /* Shortening conversion from unsigned to signed int is well-defined
+ * and not lossy in C because the value can be represented in the
+ * target type. */
+ *value_p = (apr_off_t)value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * log-to-phys index
+ */
+
+/* Append ENTRY to log-to-phys PROTO_INDEX file.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_l2p_entry_to_proto_index(apr_file_t *proto_index,
+ l2p_proto_entry_t entry,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry.offset,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry.item_index,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read *ENTRY from log-to-phys PROTO_INDEX file and indicate end-of-file
+ * in *EOF, or error out in that case if EOF is NULL. *ENTRY is in an
+ * undefined state if an end-of-file occurred.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+read_l2p_entry_from_proto_index(apr_file_t *proto_index,
+ l2p_proto_entry_t *entry,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &entry->offset, eof,
+ scratch_pool));
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &entry->item_index, eof,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Write the log-2-phys index page description for the l2p_page_entry_t
+ * array ENTRIES, starting with element START up to but not including END.
+ * Write the resulting representation into BUFFER. Use SCRATCH_POOL for
+ * temporary allocations.
+ */
+static svn_error_t *
+encode_l2p_page(apr_array_header_t *entries,
+ int start,
+ int end,
+ svn_spillbuf_t *buffer,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char encoded[ENCODED_INT_LENGTH];
+ int i;
+ const apr_uint64_t *values = (const apr_uint64_t *)entries->elts;
+ apr_uint64_t last_value = 0;
+
+ /* encode items */
+ for (i = start; i < end; ++i)
+ {
+ apr_int64_t diff = values[i] - last_value;
+ last_value = values[i];
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_int(encoded, diff), scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__l2p_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(svn_io_file_open(proto_index, file_name, APR_READ | APR_WRITE
+ | APR_CREATE | APR_APPEND | APR_BUFFERED,
+ APR_OS_DEFAULT, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__l2p_proto_index_add_revision(apr_file_t *proto_index,
+ apr_pool_t *scratch_pool)
+{
+ l2p_proto_entry_t entry;
+ entry.offset = 0;
+ entry.item_index = 0;
+
+ return svn_error_trace(write_l2p_entry_to_proto_index(proto_index, entry,
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_fs__l2p_proto_index_add_entry(apr_file_t *proto_index,
+ apr_off_t offset,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ l2p_proto_entry_t entry;
+
+ /* make sure the conversion to uint64 works */
+ SVN_ERR_ASSERT(offset >= -1);
+
+ /* we support offset '-1' as a "not used" indication */
+ entry.offset = (apr_uint64_t)offset + 1;
+
+ /* make sure we can use item_index as an array index when building the
+ * final index file */
+ SVN_ERR_ASSERT(item_index < UINT_MAX / 2);
+ entry.item_index = item_index;
+
+ return svn_error_trace(write_l2p_entry_to_proto_index(proto_index, entry,
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_fs__l2p_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t * result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_file_t *proto_index = NULL;
+ svn_stream_t *stream;
+ int i;
+ apr_uint64_t entry;
+ svn_boolean_t eof = FALSE;
+
+ int last_page_count = 0; /* total page count at the start of
+ the current revision */
+
+ /* temporary data structures that collect the data which will be moved
+ to the target file in a second step */
+ apr_pool_t *local_pool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool = svn_pool_create(local_pool);
+ apr_array_header_t *page_counts
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+ apr_array_header_t *page_sizes
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+ apr_array_header_t *entry_counts
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+
+ /* collect the item offsets and sub-item value for the current revision */
+ apr_array_header_t *entries
+ = apr_array_make(local_pool, 256, sizeof(apr_uint64_t));
+
+ /* 64k blocks, spill after 16MB */
+ svn_spillbuf_t *buffer
+ = svn_spillbuf__create(0x10000, 0x1000000, local_pool);
+
+ /* Paranoia check that makes later casting to int32 safe.
+ * The current implementation is limited to 2G entries per page. */
+ if (ffd->l2p_page_size > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("L2P index page size %s"
+ " exceeds current limit of 2G entries"),
+ apr_psprintf(local_pool, "%" APR_UINT64_T_FMT,
+ ffd->l2p_page_size));
+
+ /* start at the beginning of the source file */
+ SVN_ERR(svn_io_file_open(&proto_index, proto_file_name,
+ APR_READ | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, scratch_pool));
+
+ /* process all entries until we fail due to EOF */
+ for (entry = 0; !eof; ++entry)
+ {
+ l2p_proto_entry_t proto_entry;
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_l2p_entry_from_proto_index(proto_index, &proto_entry,
+ &eof, local_pool));
+
+ /* handle new revision */
+ if ((entry > 0 && proto_entry.offset == 0) || eof)
+ {
+ /* dump entries, grouped into pages */
+
+ int entry_count = 0;
+ for (i = 0; i < entries->nelts; i += entry_count)
+ {
+ /* 1 page with up to L2P_PAGE_SIZE entries.
+ * fsfs.conf settings validation guarantees this to fit into
+ * our address space. */
+ apr_uint64_t last_buffer_size
+ = (apr_uint64_t)svn_spillbuf__get_size(buffer);
+
+ svn_pool_clear(iterpool);
+
+ entry_count = ffd->l2p_page_size < entries->nelts - i
+ ? (int)ffd->l2p_page_size
+ : entries->nelts - i;
+ SVN_ERR(encode_l2p_page(entries, i, i + entry_count,
+ buffer, iterpool));
+
+ APR_ARRAY_PUSH(entry_counts, apr_uint64_t) = entry_count;
+ APR_ARRAY_PUSH(page_sizes, apr_uint64_t)
+ = svn_spillbuf__get_size(buffer) - last_buffer_size;
+ }
+
+ apr_array_clear(entries);
+
+ /* store the number of pages in this revision */
+ APR_ARRAY_PUSH(page_counts, apr_uint64_t)
+ = page_sizes->nelts - last_page_count;
+
+ last_page_count = page_sizes->nelts;
+ }
+ else
+ {
+ int idx;
+
+ /* store the mapping in our array */
+ if (proto_entry.item_index > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s too large "
+ "in l2p proto index for revision %ld"),
+ apr_psprintf(local_pool, "%" APR_UINT64_T_FMT,
+ proto_entry.item_index),
+ revision + page_counts->nelts);
+
+ idx = (int)proto_entry.item_index;
+ while (idx >= entries->nelts)
+ APR_ARRAY_PUSH(entries, apr_uint64_t) = 0;
+
+ APR_ARRAY_IDX(entries, idx, apr_uint64_t) = proto_entry.offset;
+ }
+ }
+
+ /* close the source file */
+ SVN_ERR(svn_io_file_close(proto_index, local_pool));
+
+ /* Paranoia check that makes later casting to int32 safe.
+ * The current implementation is limited to 2G pages per index. */
+ if (page_counts->nelts > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("L2P index page count %d"
+ " exceeds current limit of 2G pages"),
+ page_counts->nelts);
+
+ /* open target stream. */
+ stream = svn_stream_checksummed2(svn_stream_from_aprfile2(index_file, TRUE,
+ local_pool),
+ NULL, checksum, svn_checksum_md5, FALSE,
+ result_pool);
+
+
+ /* write header info */
+ SVN_ERR(svn_stream_puts(stream, L2P_STREAM_PREFIX));
+ SVN_ERR(stream_write_encoded(stream, revision));
+ SVN_ERR(stream_write_encoded(stream, ffd->l2p_page_size));
+ SVN_ERR(stream_write_encoded(stream, page_counts->nelts));
+ SVN_ERR(stream_write_encoded(stream, page_sizes->nelts));
+
+ /* write the revision table */
+ for (i = 0; i < page_counts->nelts; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(page_counts, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* write the page table */
+ for (i = 0; i < page_sizes->nelts; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(page_sizes, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ value = APR_ARRAY_IDX(entry_counts, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* append page contents and implicitly close STREAM */
+ SVN_ERR(svn_stream_copy3(svn_stream__from_spillbuf(buffer, local_pool),
+ stream, NULL, NULL, local_pool));
+
+ svn_pool_destroy(local_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* If REV_FILE->L2P_STREAM is NULL, create a new stream for the log-to-phys
+ * index for REVISION in FS and return it in REV_FILE.
+ */
+static svn_error_t *
+auto_open_l2p_index(svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision)
+{
+ if (rev_file->l2p_stream == NULL)
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ SVN_ERR(packed_stream_open(&rev_file->l2p_stream,
+ rev_file->file,
+ rev_file->l2p_offset,
+ rev_file->p2l_offset,
+ L2P_STREAM_PREFIX,
+ (apr_size_t)ffd->block_size,
+ rev_file->pool,
+ rev_file->pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the header data structure of the log-to-phys index for REVISION
+ * in FS and return it in *HEADER, allocated in RESULT_POOL. Use REV_FILE
+ * to access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_header_body(l2p_header_t **header,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_uint64_t value;
+ apr_size_t i;
+ apr_size_t page, page_count;
+ apr_off_t offset;
+ l2p_header_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ apr_size_t page_table_index;
+ svn_revnum_t next_rev;
+
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(auto_open_l2p_index(rev_file, fs, revision));
+ packed_stream_seek(rev_file->l2p_stream, 0);
+
+ /* Read the table sizes. Check the data for plausibility and
+ * consistency with other bits. */
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->first_revision = (svn_revnum_t)value;
+ if (result->first_revision != rev_file->start_revision)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index rev / pack file revision numbers do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->page_size = (apr_uint32_t)value;
+ if (!result->page_size || (result->page_size & (result->page_size - 1)))
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P index page size is not a power of two"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->revision_count = (int)value;
+ if ( result->revision_count != 1
+ && result->revision_count != (apr_uint64_t)ffd->max_files_per_dir)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid number of revisions in L2P index"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ page_count = (apr_size_t)value;
+ if (page_count < result->revision_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Fewer L2P index pages than revisions"));
+ if (page_count > (rev_file->p2l_offset - rev_file->l2p_offset) / 2)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P index page count implausibly large"));
+
+ next_rev = result->first_revision + (svn_revnum_t)result->revision_count;
+ if (result->first_revision > revision || next_rev <= revision)
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Corrupt L2P index for r%ld only covers r%ld:%ld"),
+ revision, result->first_revision, next_rev);
+
+ /* allocate the page tables */
+ result->page_table
+ = apr_pcalloc(result_pool, page_count * sizeof(*result->page_table));
+ result->page_table_index
+ = apr_pcalloc(result_pool, (result->revision_count + 1)
+ * sizeof(*result->page_table_index));
+
+ /* read per-revision page table sizes (i.e. number of pages per rev) */
+ page_table_index = 0;
+ result->page_table_index[0] = page_table_index;
+
+ for (i = 0; i < result->revision_count; ++i)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value == 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Revision with no L2P index pages"));
+
+ page_table_index += (apr_size_t)value;
+ if (page_table_index > page_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P page table exceeded"));
+
+ result->page_table_index[i+1] = page_table_index;
+ }
+
+ if (page_table_index != page_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Revisions do not cover the full L2P index page table"));
+
+ /* read actual page tables */
+ for (page = 0; page < page_count; ++page)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value == 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Empty L2P index page"));
+
+ result->page_table[page].size = (apr_uint32_t)value;
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value > result->page_size)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Page exceeds L2P index page size"));
+
+ result->page_table[page].entry_count = (apr_uint32_t)value;
+ }
+
+ /* correct the page description offsets */
+ offset = packed_stream_offset(rev_file->l2p_stream);
+ for (page = 0; page < page_count; ++page)
+ {
+ result->page_table[page].offset = offset;
+ offset += result->page_table[page].size;
+ }
+
+ /* return and cache the header */
+ *header = result;
+ SVN_ERR(svn_cache__set(ffd->l2p_header_cache, &key, result, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Data structure that describes which l2p page info shall be extracted
+ * from the cache and contains the fields that receive the result.
+ */
+typedef struct l2p_page_info_baton_t
+{
+ /* input data: we want the page covering (REVISION,ITEM_INDEX) */
+ svn_revnum_t revision;
+ apr_uint64_t item_index;
+
+ /* out data */
+ /* page location and size of the page within the l2p index file */
+ l2p_page_table_entry_t entry;
+
+ /* page number within the pages for REVISION (not l2p index global!) */
+ apr_uint32_t page_no;
+
+ /* offset of ITEM_INDEX within that page */
+ apr_uint32_t page_offset;
+
+ /* revision identifying the l2p index file, also the first rev in that */
+ svn_revnum_t first_revision;
+} l2p_page_info_baton_t;
+
+
+/* Utility function that copies the info requested by BATON->REVISION and
+ * BATON->ITEM_INDEX and from HEADER and PAGE_TABLE into the output fields
+ * of *BATON. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_page_info_copy(l2p_page_info_baton_t *baton,
+ const l2p_header_t *header,
+ const l2p_page_table_entry_t *page_table,
+ const apr_size_t *page_table_index,
+ apr_pool_t *scratch_pool)
+{
+ /* revision offset within the index file */
+ apr_size_t rel_revision = baton->revision - header->first_revision;
+ if (rel_revision >= header->revision_count)
+ return svn_error_createf(SVN_ERR_FS_INDEX_REVISION , NULL,
+ _("Revision %ld not covered by item index"),
+ baton->revision);
+
+ /* select the relevant page */
+ if (baton->item_index < header->page_size)
+ {
+ /* most revs fit well into a single page */
+ baton->page_offset = (apr_uint32_t)baton->item_index;
+ baton->page_no = 0;
+ baton->entry = page_table[page_table_index[rel_revision]];
+ }
+ else
+ {
+ const l2p_page_table_entry_t *first_entry;
+ const l2p_page_table_entry_t *last_entry;
+ apr_uint64_t max_item_index;
+
+ /* range of pages for this rev */
+ first_entry = page_table + page_table_index[rel_revision];
+ last_entry = page_table + page_table_index[rel_revision + 1];
+
+ /* do we hit a valid index page? */
+ max_item_index = (apr_uint64_t)header->page_size
+ * (last_entry - first_entry);
+ if (baton->item_index >= max_item_index)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s exceeds l2p limit "
+ "of %s for revision %ld"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ baton->item_index),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ max_item_index),
+ baton->revision);
+
+ /* all pages are of the same size and full, except for the last one */
+ baton->page_offset = (apr_uint32_t)(baton->item_index % header->page_size);
+ baton->page_no = (apr_uint32_t)(baton->item_index / header->page_size);
+ baton->entry = first_entry[baton->page_no];
+ }
+
+ baton->first_revision = header->first_revision;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_page_info_baton_t *BATON from l2p_header_t *DATA into the output
+ * fields in *BATON.
+ */
+static svn_error_t *
+l2p_page_info_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve all pointer values of in-cache data */
+ const l2p_header_t *header = data;
+ const l2p_page_table_entry_t *page_table
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table);
+ const apr_size_t *page_table_index
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table_index);
+
+ /* copy the info */
+ return l2p_page_info_copy(baton, header, page_table, page_table_index,
+ result_pool);
+}
+
+/* Get the page info requested in *BATON from FS and set the output fields
+ * in *BATON. Use REV_FILE for on-disk file access.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_page_info(l2p_page_info_baton_t *baton,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ l2p_header_t *result;
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* try to find the info in the cache */
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+ SVN_ERR(svn_cache__get_partial((void**)&dummy, &is_cached,
+ ffd->l2p_header_cache, &key,
+ l2p_page_info_access_func, baton,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* read from disk, cache and copy the result */
+ SVN_ERR(get_l2p_header_body(&result, rev_file, fs, baton->revision,
+ scratch_pool, scratch_pool));
+ SVN_ERR(l2p_page_info_copy(baton, result, result->page_table,
+ result->page_table_index, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Data request structure used by l2p_page_table_access_func.
+ */
+typedef struct l2p_page_table_baton_t
+{
+ /* revision for which to read the page table */
+ svn_revnum_t revision;
+
+ /* page table entries (of type l2p_page_table_entry_t).
+ * Must be created by caller and will be filled by callee. */
+ apr_array_header_t *pages;
+} l2p_page_table_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_page_baton_t *BATON from l2p_page_t *DATA into BATON->PAGES and *OUT.
+ */
+static svn_error_t *
+l2p_page_table_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve in-cache pointers */
+ l2p_page_table_baton_t *table_baton = baton;
+ const l2p_header_t *header = (const l2p_header_t *)data;
+ const l2p_page_table_entry_t *page_table
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table);
+ const apr_size_t *page_table_index
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table_index);
+
+ /* copy the revision's page table into BATON */
+ apr_size_t rel_revision = table_baton->revision - header->first_revision;
+ if (rel_revision < header->revision_count)
+ {
+ const l2p_page_table_entry_t *entry
+ = page_table + page_table_index[rel_revision];
+ const l2p_page_table_entry_t *last_entry
+ = page_table + page_table_index[rel_revision + 1];
+
+ for (; entry < last_entry; ++entry)
+ APR_ARRAY_PUSH(table_baton->pages, l2p_page_table_entry_t)
+ = *entry;
+ }
+
+ /* set output as a courtesy to the caller */
+ *out = table_baton->pages;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the l2p index page table for REVISION in FS from cache and return
+ * it in PAGES. The later must be provided by the caller (and can be
+ * re-used); existing entries will be removed before writing the result.
+ * If the data cannot be found in the cache, the result will be empty
+ * (it never can be empty for a valid REVISION if the data is cached).
+ * Use the info from REV_FILE to determine pack / rev file properties.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_page_table(apr_array_header_t *pages,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+ l2p_page_table_baton_t baton;
+
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ apr_array_clear(pages);
+ baton.revision = revision;
+ baton.pages = pages;
+ SVN_ERR(svn_cache__get_partial((void**)&pages, &is_cached,
+ ffd->l2p_header_cache, &key,
+ l2p_page_table_access_func, &baton,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* From the log-to-phys index file starting at START_REVISION in FS, read
+ * the mapping page identified by TABLE_ENTRY and return it in *PAGE.
+ * Use REV_FILE to access on-disk files.
+ * Use RESULT_POOL for allocations.
+ */
+static svn_error_t *
+get_l2p_page(l2p_page_t **page,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t start_revision,
+ l2p_page_table_entry_t *table_entry,
+ apr_pool_t *result_pool)
+{
+ apr_uint32_t i;
+ l2p_page_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ apr_uint64_t last_value = 0;
+
+ /* open index file and select page */
+ SVN_ERR(auto_open_l2p_index(rev_file, fs, start_revision));
+ packed_stream_seek(rev_file->l2p_stream, table_entry->offset);
+
+ /* initialize the page content */
+ result->entry_count = table_entry->entry_count;
+ result->offsets = apr_pcalloc(result_pool, result->entry_count
+ * sizeof(*result->offsets));
+
+ /* read all page entries (offsets in rev file and container sub-items) */
+ for (i = 0; i < result->entry_count; ++i)
+ {
+ apr_uint64_t value = 0;
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ last_value += decode_int(value);
+ result->offsets[i] = last_value - 1;
+ }
+
+ /* After reading all page entries, the read cursor must have moved by
+ * TABLE_ENTRY->SIZE bytes. */
+ if ( packed_stream_offset(rev_file->l2p_stream)
+ != table_entry->offset + table_entry->size)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P actual page size does not match page table value."));
+
+ *page = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility function. Read the l2p index pages for REVISION in FS from
+ * REV_FILE and put them into the cache. Skip page number EXLCUDED_PAGE_NO
+ * (use -1 for 'skip none') and pages outside the MIN_OFFSET, MAX_OFFSET
+ * range in the l2p index file. The index is being identified by
+ * FIRST_REVISION. PAGES is a scratch container provided by the caller.
+ * SCRATCH_POOL is used for temporary allocations.
+ *
+ * This function may be a no-op if the header cache lookup fails / misses.
+ */
+static svn_error_t *
+prefetch_l2p_pages(svn_boolean_t *end,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t first_revision,
+ svn_revnum_t revision,
+ apr_array_header_t *pages,
+ int exlcuded_page_no,
+ apr_off_t min_offset,
+ apr_off_t max_offset,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ int i;
+ apr_pool_t *iterpool;
+ svn_fs_fs__page_cache_key_t key = { 0 };
+
+ /* Parameter check. */
+ if (min_offset < 0)
+ min_offset = 0;
+
+ if (max_offset <= 0)
+ {
+ /* Nothing to do */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* get the page table for REVISION from cache */
+ *end = FALSE;
+ SVN_ERR(get_l2p_page_table(pages, fs, rev_file, revision, scratch_pool));
+ if (pages->nelts == 0 || rev_file->l2p_stream == NULL)
+ {
+ /* not found -> we can't continue without hitting the disk again */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* prefetch pages individually until all are done or we found one in
+ * the cache */
+ iterpool = svn_pool_create(scratch_pool);
+ assert(revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)revision;
+ key.is_packed = rev_file->is_packed;
+
+ for (i = 0; i < pages->nelts && !*end; ++i)
+ {
+ svn_boolean_t is_cached;
+
+ l2p_page_table_entry_t *entry
+ = &APR_ARRAY_IDX(pages, i, l2p_page_table_entry_t);
+ svn_pool_clear(iterpool);
+
+ if (i == exlcuded_page_no)
+ continue;
+
+ /* skip pages outside the specified index file range */
+ if ( entry->offset < (apr_uint64_t)min_offset
+ || entry->offset + entry->size > (apr_uint64_t)max_offset)
+ {
+ *end = TRUE;
+ continue;
+ }
+
+ /* page already in cache? */
+ key.page = i;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->l2p_page_cache,
+ &key, iterpool));
+ if (!is_cached)
+ {
+ /* no in cache -> read from stream (data already buffered in APR)
+ * and cache the result */
+ l2p_page_t *page = NULL;
+ SVN_ERR(get_l2p_page(&page, rev_file, fs, first_revision, entry,
+ iterpool));
+
+ SVN_ERR(svn_cache__set(ffd->l2p_page_cache, &key, page,
+ iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Request data structure for l2p_entry_access_func.
+ */
+typedef struct l2p_entry_baton_t
+{
+ /* in data */
+ /* revision. Used for error messages only */
+ svn_revnum_t revision;
+
+ /* item index to look up. Used for error messages only */
+ apr_uint64_t item_index;
+
+ /* offset within the cached page */
+ apr_uint32_t page_offset;
+
+ /* out data */
+ /* absolute item or container offset in rev / pack file */
+ apr_uint64_t offset;
+} l2p_entry_baton_t;
+
+/* Return the rev / pack file offset of the item at BATON->PAGE_OFFSET in
+ * OFFSETS of PAGE and write it to *OFFSET.
+ */
+static svn_error_t *
+l2p_page_get_entry(l2p_entry_baton_t *baton,
+ const l2p_page_t *page,
+ const apr_uint64_t *offsets,
+ apr_pool_t *scratch_pool)
+{
+ /* overflow check */
+ if (page->entry_count <= baton->page_offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s"
+ " too large in revision %ld"),
+ apr_psprintf(scratch_pool, "%" APR_UINT64_T_FMT,
+ baton->item_index),
+ baton->revision);
+
+ /* return the result */
+ baton->offset = offsets[baton->page_offset];
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_entry_baton_t *BATON from l2p_page_t *DATA into BATON->OFFSET.
+ * *OUT remains unchanged.
+ */
+static svn_error_t *
+l2p_entry_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve all in-cache pointers */
+ const l2p_page_t *page = data;
+ const apr_uint64_t *offsets
+ = svn_temp_deserializer__ptr(page, (const void *const *)&page->offsets);
+
+ /* return the requested data */
+ return l2p_page_get_entry(baton, page, offsets, result_pool);
+}
+
+/* Using the log-to-phys indexes in FS, find the absolute offset in the
+ * rev file for (REVISION, ITEM_INDEX) and return it in *OFFSET.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_index_lookup(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ l2p_page_info_baton_t info_baton;
+ l2p_entry_baton_t page_baton;
+ l2p_page_t *page = NULL;
+ svn_fs_fs__page_cache_key_t key = { 0 };
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* read index master data structure and extract the info required to
+ * access the l2p index page for (REVISION,ITEM_INDEX)*/
+ info_baton.revision = revision;
+ info_baton.item_index = item_index;
+ SVN_ERR(get_l2p_page_info(&info_baton, rev_file, fs, scratch_pool));
+
+ /* try to find the page in the cache and get the OFFSET from it */
+ page_baton.revision = revision;
+ page_baton.item_index = item_index;
+ page_baton.page_offset = info_baton.page_offset;
+
+ assert(revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)revision;
+ key.is_packed = svn_fs_fs__is_packed_rev(fs, revision);
+ key.page = info_baton.page_no;
+
+ SVN_ERR(svn_cache__get_partial(&dummy, &is_cached,
+ ffd->l2p_page_cache, &key,
+ l2p_entry_access_func, &page_baton,
+ scratch_pool));
+
+ if (!is_cached)
+ {
+ /* we need to read the info from disk (might already be in the
+ * APR file buffer, though) */
+ apr_array_header_t *pages;
+ svn_revnum_t prefetch_revision;
+ svn_revnum_t last_revision
+ = info_baton.first_revision
+ + (key.is_packed ? ffd->max_files_per_dir : 1);
+ svn_boolean_t end;
+ apr_off_t max_offset
+ = APR_ALIGN(info_baton.entry.offset + info_baton.entry.size,
+ ffd->block_size);
+ apr_off_t min_offset = max_offset - ffd->block_size;
+
+ /* read the relevant page */
+ SVN_ERR(get_l2p_page(&page, rev_file, fs, info_baton.first_revision,
+ &info_baton.entry, scratch_pool));
+
+ /* cache the page and extract the result we need */
+ SVN_ERR(svn_cache__set(ffd->l2p_page_cache, &key, page, scratch_pool));
+ SVN_ERR(l2p_page_get_entry(&page_baton, page, page->offsets,
+ scratch_pool));
+
+ if (ffd->use_block_read)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* prefetch pages from following and preceding revisions */
+ pages = apr_array_make(scratch_pool, 16,
+ sizeof(l2p_page_table_entry_t));
+ end = FALSE;
+ for (prefetch_revision = revision;
+ prefetch_revision < last_revision && !end;
+ ++prefetch_revision)
+ {
+ int excluded_page_no = prefetch_revision == revision
+ ? info_baton.page_no
+ : -1;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(prefetch_l2p_pages(&end, fs, rev_file,
+ info_baton.first_revision,
+ prefetch_revision, pages,
+ excluded_page_no, min_offset,
+ max_offset, iterpool));
+ }
+
+ end = FALSE;
+ for (prefetch_revision = revision-1;
+ prefetch_revision >= info_baton.first_revision && !end;
+ --prefetch_revision)
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(prefetch_l2p_pages(&end, fs, rev_file,
+ info_baton.first_revision,
+ prefetch_revision, pages, -1,
+ min_offset, max_offset, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+ }
+
+ *offset = page_baton.offset;
+
+ return SVN_NO_ERROR;
+}
+
+/* Using the log-to-phys proto index in transaction TXN_ID in FS, find the
+ * absolute offset in the proto rev file for the given ITEM_INDEX and return
+ * it in *OFFSET. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_proto_index_lookup(apr_off_t *offset,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t eof = FALSE;
+ apr_file_t *file = NULL;
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_fs__path_l2p_proto_index(fs, txn_id,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ /* process all entries until we fail due to EOF */
+ *offset = -1;
+ while (!eof)
+ {
+ l2p_proto_entry_t entry;
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_l2p_entry_from_proto_index(file, &entry, &eof,
+ scratch_pool));
+
+ /* handle new revision */
+ if (!eof && entry.item_index == item_index)
+ {
+ *offset = (apr_off_t)entry.offset - 1;
+ break;
+ }
+ }
+
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the log-to-phys header info of the index covering REVISION from FS
+ * and return it in *HEADER. REV_FILE provides the pack / rev status.
+ * Allocate *HEADER in RESULT_POOL, use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+get_l2p_header(l2p_header_t **header,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+
+ /* first, try cache lookop */
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+ SVN_ERR(svn_cache__get((void**)header, &is_cached, ffd->l2p_header_cache,
+ &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* read from disk and cache the result */
+ SVN_ERR(get_l2p_header_body(header, rev_file, fs, revision, result_pool,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__l2p_get_max_ids(apr_array_header_t **max_ids,
+ svn_fs_t *fs,
+ svn_revnum_t start_rev,
+ apr_size_t count,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ l2p_header_t *header = NULL;
+ svn_revnum_t revision;
+ svn_revnum_t last_rev = (svn_revnum_t)(start_rev + count);
+ svn_fs_fs__revision_file_t *rev_file;
+ apr_pool_t *header_pool = svn_pool_create(scratch_pool);
+
+ /* read index master data structure for the index covering START_REV */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, start_rev,
+ header_pool, header_pool));
+ SVN_ERR(get_l2p_header(&header, rev_file, fs, start_rev, header_pool,
+ header_pool));
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ /* Determine the length of the item index list for each rev.
+ * Read new index headers as required. */
+ *max_ids = apr_array_make(result_pool, (int)count, sizeof(apr_uint64_t));
+ for (revision = start_rev; revision < last_rev; ++revision)
+ {
+ apr_uint64_t full_page_count;
+ apr_uint64_t item_count;
+ apr_size_t first_page_index, last_page_index;
+
+ if (revision >= header->first_revision + header->revision_count)
+ {
+ /* need to read the next index. Clear up memory used for the
+ * previous one. Note that intermittent pack runs do not change
+ * the number of items in a revision, i.e. there is no consistency
+ * issue here. */
+ svn_pool_clear(header_pool);
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, revision,
+ header_pool, header_pool));
+ SVN_ERR(get_l2p_header(&header, rev_file, fs, revision,
+ header_pool, header_pool));
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+ }
+
+ /* in a revision with N index pages, the first N-1 index pages are
+ * "full", i.e. contain HEADER->PAGE_SIZE entries */
+ first_page_index
+ = header->page_table_index[revision - header->first_revision];
+ last_page_index
+ = header->page_table_index[revision - header->first_revision + 1];
+ full_page_count = last_page_index - first_page_index - 1;
+ item_count = full_page_count * header->page_size
+ + header->page_table[last_page_index - 1].entry_count;
+
+ APR_ARRAY_PUSH(*max_ids, apr_uint64_t) = item_count;
+ }
+
+ svn_pool_destroy(header_pool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__item_offset(apr_off_t *absolute_position,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+ if (txn_id)
+ {
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ /* the txn is going to produce a rev with logical addressing.
+ So, we need to get our info from the (proto) index file. */
+ SVN_ERR(l2p_proto_index_lookup(absolute_position, fs, txn_id,
+ item_index, scratch_pool));
+ }
+ else
+ {
+ /* for data in txns, item_index *is* the offset */
+ *absolute_position = item_index;
+ }
+ }
+ else if (svn_fs_fs__use_log_addressing(fs))
+ {
+ /* ordinary index lookup */
+ SVN_ERR(l2p_index_lookup(absolute_position, fs, rev_file, revision,
+ item_index, scratch_pool));
+ }
+ else if (rev_file->is_packed)
+ {
+ /* pack file with physical addressing */
+ apr_off_t rev_offset;
+ SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, revision,
+ scratch_pool));
+ *absolute_position = rev_offset + item_index;
+ }
+ else
+ {
+ /* for non-packed revs with physical addressing,
+ item_index *is* the offset */
+ *absolute_position = item_index;
+ }
+
+ return svn_error_trace(err);
+}
+
+/*
+ * phys-to-log index
+ */
+svn_error_t *
+svn_fs_fs__p2l_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(svn_io_file_open(proto_index, file_name, APR_READ | APR_WRITE
+ | APR_CREATE | APR_APPEND | APR_BUFFERED,
+ APR_OS_DEFAULT, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__p2l_proto_index_add_entry(apr_file_t *proto_index,
+ const svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t revision;
+
+ /* Make sure all signed elements of ENTRY have non-negative values.
+ *
+ * For file offsets and sizes, this is a given as we use them to describe
+ * absolute positions and sizes. For revisions, SVN_INVALID_REVNUM is
+ * valid, hence we have to shift it by 1.
+ */
+ SVN_ERR_ASSERT(entry->offset >= 0);
+ SVN_ERR_ASSERT(entry->size >= 0);
+ SVN_ERR_ASSERT( entry->item.revision >= 0
+ || entry->item.revision == SVN_INVALID_REVNUM);
+
+ revision = entry->item.revision == SVN_INVALID_REVNUM
+ ? 0
+ : ((apr_uint64_t)entry->item.revision + 1);
+
+ /* Now, all values will nicely convert to uint64. */
+ /* Make sure to keep P2L_PROTO_INDEX_ENTRY_SIZE consistent with this: */
+
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->offset,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->size,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->type,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->fnv1_checksum,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, revision,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->item.number,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read *ENTRY from log-to-phys PROTO_INDEX file and indicate end-of-file
+ * in *EOF, or error out in that case if EOF is NULL. *ENTRY is in an
+ * undefined state if an end-of-file occurred.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+read_p2l_entry_from_proto_index(apr_file_t *proto_index,
+ svn_fs_fs__p2l_entry_t *entry,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t revision;
+
+ SVN_ERR(read_off_t_from_proto_index(proto_index, &entry->offset,
+ eof, scratch_pool));
+ SVN_ERR(read_off_t_from_proto_index(proto_index, &entry->size,
+ eof, scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->type,
+ eof, scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->fnv1_checksum,
+ eof, scratch_pool));
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &revision,
+ eof, scratch_pool));
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &entry->item.number,
+ eof, scratch_pool));
+
+ /* Do the inverse REVSION number conversion (see
+ * svn_fs_fs__p2l_proto_index_add_entry), if we actually read a complete
+ * record.
+ */
+ if (!eof || !*eof)
+ {
+ /* Be careful with the arithmetics here (overflows and wrap-around): */
+ if (revision > 0 && revision - 1 > LONG_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("Revision 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ revision),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ (apr_uint64_t)LONG_MAX));
+
+ /* Shortening conversion from unsigned to signed int is well-defined
+ * and not lossy in C because the value can be represented in the
+ * target type. Also, cast to 'long' instead of 'svn_revnum_t' here
+ * to provoke a compiler warning if those types should differ and we
+ * would need to change the overflow checking logic.
+ */
+ entry->item.revision = revision == 0
+ ? SVN_INVALID_REVNUM
+ : (long)(revision - 1);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__p2l_proto_index_next_offset(apr_off_t *next_offset,
+ apr_file_t *proto_index,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset = 0;
+
+ /* Empty index file? */
+ SVN_ERR(svn_io_file_seek(proto_index, APR_END, &offset, scratch_pool));
+ if (offset == 0)
+ {
+ *next_offset = 0;
+ }
+ else
+ {
+ /* At least one entry. Read last entry. */
+ svn_fs_fs__p2l_entry_t entry;
+ offset -= P2L_PROTO_INDEX_ENTRY_SIZE;
+
+ SVN_ERR(svn_io_file_seek(proto_index, APR_SET, &offset, scratch_pool));
+ SVN_ERR(read_p2l_entry_from_proto_index(proto_index, &entry,
+ NULL, scratch_pool));
+
+ /* Return next offset. */
+ *next_offset = entry.offset + entry.size;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__p2l_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_uint64_t page_size = ffd->p2l_page_size;
+ apr_file_t *proto_index = NULL;
+ svn_stream_t *stream;
+ int i;
+ svn_boolean_t eof = FALSE;
+ unsigned char encoded[ENCODED_INT_LENGTH];
+ svn_revnum_t last_revision = revision;
+ apr_uint64_t last_compound = 0;
+
+ apr_uint64_t last_entry_end = 0;
+ apr_uint64_t last_page_end = 0;
+ apr_uint64_t last_buffer_size = 0; /* byte offset in the spill buffer at
+ the begin of the current revision */
+ apr_uint64_t file_size = 0;
+
+ /* temporary data structures that collect the data which will be moved
+ to the target file in a second step */
+ apr_pool_t *local_pool = svn_pool_create(scratch_pool);
+ apr_array_header_t *table_sizes
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+
+ /* 64k blocks, spill after 16MB */
+ svn_spillbuf_t *buffer
+ = svn_spillbuf__create(0x10000, 0x1000000, local_pool);
+
+ /* for loop temps ... */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* start at the beginning of the source file */
+ SVN_ERR(svn_io_file_open(&proto_index, proto_file_name,
+ APR_READ | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, scratch_pool));
+
+ /* process all entries until we fail due to EOF */
+ while (!eof)
+ {
+ svn_fs_fs__p2l_entry_t entry;
+ apr_uint64_t entry_end;
+ svn_boolean_t new_page = svn_spillbuf__get_size(buffer) == 0;
+ apr_uint64_t compound;
+ apr_int64_t rev_diff, compound_diff;
+
+ svn_pool_clear(iterpool);
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_p2l_entry_from_proto_index(proto_index, &entry,
+ &eof, iterpool));
+
+ /* "unused" (and usually non-existent) section to cover the offsets
+ at the end the of the last page. */
+ if (eof)
+ {
+ file_size = last_entry_end;
+
+ entry.offset = last_entry_end;
+ entry.size = APR_ALIGN(entry.offset, page_size) - entry.offset;
+ entry.type = SVN_FS_FS__ITEM_TYPE_UNUSED;
+ entry.fnv1_checksum = 0;
+ entry.item.revision = last_revision;
+ entry.item.number = 0;
+ }
+ else
+ {
+ /* fix-up items created when the txn's target rev was unknown */
+ if (entry.item.revision == SVN_INVALID_REVNUM)
+ entry.item.revision = revision;
+ }
+
+ /* end pages if entry is extending beyond their boundaries */
+ entry_end = entry.offset + entry.size;
+ while (entry_end - last_page_end > page_size)
+ {
+ apr_uint64_t buffer_size = svn_spillbuf__get_size(buffer);
+ APR_ARRAY_PUSH(table_sizes, apr_uint64_t)
+ = buffer_size - last_buffer_size;
+
+ last_buffer_size = buffer_size;
+ last_page_end += page_size;
+ new_page = TRUE;
+ }
+
+ /* this entry starts a new table -> store its offset
+ (all following entries in the same table will store sizes only) */
+ if (new_page)
+ {
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.offset),
+ iterpool));
+ last_revision = revision;
+ last_compound = 0;
+ }
+
+ /* write simple item entry */
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.size),
+ iterpool));
+
+ rev_diff = entry.item.revision - last_revision;
+ last_revision = entry.item.revision;
+
+ compound = entry.item.number * 8 + entry.type;
+ compound_diff = compound - last_compound;
+ last_compound = compound;
+
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_int(encoded, compound_diff),
+ iterpool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_int(encoded, rev_diff),
+ iterpool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.fnv1_checksum),
+ iterpool));
+
+ last_entry_end = entry_end;
+ }
+
+ /* close the source file */
+ SVN_ERR(svn_io_file_close(proto_index, local_pool));
+
+ /* store length of last table */
+ APR_ARRAY_PUSH(table_sizes, apr_uint64_t)
+ = svn_spillbuf__get_size(buffer) - last_buffer_size;
+
+ /* Open target stream. */
+ stream = svn_stream_checksummed2(svn_stream_from_aprfile2(index_file, TRUE,
+ local_pool),
+ NULL, checksum, svn_checksum_md5, FALSE,
+ result_pool);
+
+ /* write the start revision, file size and page size */
+ SVN_ERR(svn_stream_puts(stream, P2L_STREAM_PREFIX));
+ SVN_ERR(stream_write_encoded(stream, revision));
+ SVN_ERR(stream_write_encoded(stream, file_size));
+ SVN_ERR(stream_write_encoded(stream, page_size));
+
+ /* write the page table (actually, the sizes of each page description) */
+ SVN_ERR(stream_write_encoded(stream, table_sizes->nelts));
+ for (i = 0; i < table_sizes->nelts; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(table_sizes, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* append page contents and implicitly close STREAM */
+ SVN_ERR(svn_stream_copy3(svn_stream__from_spillbuf(buffer, local_pool),
+ stream, NULL, NULL, local_pool));
+
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(local_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* If REV_FILE->P2L_STREAM is NULL, create a new stream for the phys-to-log
+ * index for REVISION in FS using the rev / pack file provided by REV_FILE.
+ */
+static svn_error_t *
+auto_open_p2l_index(svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision)
+{
+ if (rev_file->p2l_stream == NULL)
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ SVN_ERR(packed_stream_open(&rev_file->p2l_stream,
+ rev_file->file,
+ rev_file->p2l_offset,
+ rev_file->footer_offset,
+ P2L_STREAM_PREFIX,
+ (apr_size_t)ffd->block_size,
+ rev_file->pool,
+ rev_file->pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Read the header data structure of the phys-to-log index for REVISION in
+ * FS and return it in *HEADER, allocated in RESULT_POOL. Use REV_FILE to
+ * access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_p2l_header(p2l_header_t **header,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_uint64_t value;
+ apr_size_t i;
+ apr_off_t offset;
+ p2l_header_t *result;
+ svn_boolean_t is_cached = FALSE;
+
+ /* look for the header data in our cache */
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(svn_cache__get((void**)header, &is_cached, ffd->p2l_header_cache,
+ &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* not found -> must read it from disk.
+ * Open index file or position read pointer to the begin of the file */
+ if (rev_file->p2l_stream == NULL)
+ SVN_ERR(auto_open_p2l_index(rev_file, fs, rev_file->start_revision));
+ else
+ packed_stream_seek(rev_file->p2l_stream, 0);
+
+ /* allocate result data structure */
+ result = apr_pcalloc(result_pool, sizeof(*result));
+
+ /* Read table sizes, check them for plausibility and allocate page array. */
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->first_revision = (svn_revnum_t)value;
+ if (result->first_revision != rev_file->start_revision)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index rev / pack file revision numbers do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->file_size = value;
+ if (result->file_size != (apr_uint64_t)rev_file->l2p_offset)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index offset and rev / pack file size do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->page_size = value;
+ if (!result->page_size || (result->page_size & (result->page_size - 1)))
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L index page size is not a power of two"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->page_count = (apr_size_t)value;
+ if (result->page_count != (result->file_size - 1) / result->page_size + 1)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L page count does not match rev / pack file size"));
+
+ result->offsets
+ = apr_pcalloc(result_pool, (result->page_count + 1) * sizeof(*result->offsets));
+
+ /* read page sizes and derive page description offsets from them */
+ result->offsets[0] = 0;
+ for (i = 0; i < result->page_count; ++i)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->offsets[i+1] = result->offsets[i] + (apr_off_t)value;
+ }
+
+ /* correct the offset values */
+ offset = packed_stream_offset(rev_file->p2l_stream);
+ for (i = 0; i <= result->page_count; ++i)
+ result->offsets[i] += offset;
+
+ /* cache the header data */
+ SVN_ERR(svn_cache__set(ffd->p2l_header_cache, &key, result, scratch_pool));
+
+ /* return the result */
+ *header = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Data structure that describes which p2l page info shall be extracted
+ * from the cache and contains the fields that receive the result.
+ */
+typedef struct p2l_page_info_baton_t
+{
+ /* input variables */
+ /* revision identifying the index file */
+ svn_revnum_t revision;
+
+ /* offset within the page in rev / pack file */
+ apr_off_t offset;
+
+ /* output variables */
+ /* page containing OFFSET */
+ apr_size_t page_no;
+
+ /* first revision in this p2l index */
+ svn_revnum_t first_revision;
+
+ /* offset within the p2l index file describing this page */
+ apr_off_t start_offset;
+
+ /* offset within the p2l index file describing the following page */
+ apr_off_t next_offset;
+
+ /* PAGE_NO * PAGE_SIZE (if <= OFFSET) */
+ apr_off_t page_start;
+
+ /* total number of pages indexed */
+ apr_size_t page_count;
+
+ /* size of each page in pack / rev file */
+ apr_uint64_t page_size;
+} p2l_page_info_baton_t;
+
+/* From HEADER and the list of all OFFSETS, fill BATON with the page info
+ * requested by BATON->OFFSET.
+ */
+static void
+p2l_page_info_copy(p2l_page_info_baton_t *baton,
+ const p2l_header_t *header,
+ const apr_off_t *offsets)
+{
+ /* if the requested offset is out of bounds, return info for
+ * a zero-sized empty page right behind the last page.
+ */
+ if (baton->offset / header->page_size < header->page_count)
+ {
+ /* This cast is safe because the value is < header->page_count. */
+ baton->page_no = (apr_size_t)(baton->offset / header->page_size);
+ baton->start_offset = offsets[baton->page_no];
+ baton->next_offset = offsets[baton->page_no + 1];
+ baton->page_size = header->page_size;
+ }
+ else
+ {
+ /* Beyond the last page. */
+ baton->page_no = header->page_count;
+ baton->start_offset = offsets[baton->page_no];
+ baton->next_offset = offsets[baton->page_no];
+ baton->page_size = 0;
+ }
+
+ baton->first_revision = header->first_revision;
+ baton->page_start = (apr_off_t)(header->page_size * baton->page_no);
+ baton->page_count = header->page_count;
+}
+
+/* Implement svn_cache__partial_getter_func_t: extract the p2l page info
+ * requested by BATON and return it in BATON.
+ */
+static svn_error_t *
+p2l_page_info_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* all the pointers to cached data we need */
+ const p2l_header_t *header = data;
+ const apr_off_t *offsets
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->offsets);
+
+ /* copy data from cache to BATON */
+ p2l_page_info_copy(baton, header, offsets);
+ return SVN_NO_ERROR;
+}
+
+/* Read the header data structure of the phys-to-log index for revision
+ * BATON->REVISION in FS. Return in *BATON all info relevant to read the
+ * index page for the rev / pack file offset BATON->OFFSET. Use REV_FILE
+ * to access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_p2l_page_info(p2l_page_info_baton_t *baton,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ p2l_header_t *header;
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* look for the header data in our cache */
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(svn_cache__get_partial(&dummy, &is_cached, ffd->p2l_header_cache,
+ &key, p2l_page_info_func, baton,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(get_p2l_header(&header, rev_file, fs, baton->revision,
+ scratch_pool, scratch_pool));
+
+ /* copy the requested info into *BATON */
+ p2l_page_info_copy(baton, header, header->offsets);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read a mapping entry from the phys-to-log index STREAM and append it to
+ * RESULT. *ITEM_INDEX contains the phys offset for the entry and will
+ * be moved forward by the size of entry.
+ */
+static svn_error_t *
+read_entry(svn_fs_fs__packed_number_stream_t *stream,
+ apr_off_t *item_offset,
+ svn_revnum_t *last_revision,
+ apr_uint64_t *last_compound,
+ apr_array_header_t *result)
+{
+ apr_uint64_t value;
+
+ svn_fs_fs__p2l_entry_t entry;
+
+ entry.offset = *item_offset;
+ SVN_ERR(packed_stream_get(&value, stream));
+ entry.size = (apr_off_t)value;
+
+ SVN_ERR(packed_stream_get(&value, stream));
+ *last_compound += decode_int(value);
+
+ entry.type = *last_compound & 7;
+ entry.item.number = *last_compound / 8;
+
+ /* Verify item type. */
+ if (entry.type > SVN_FS_FS__ITEM_TYPE_CHANGES)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid item type in P2L index"));
+ if ( entry.type == SVN_FS_FS__ITEM_TYPE_CHANGES
+ && entry.item.number != SVN_FS_FS__ITEM_INDEX_CHANGES)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Changed path list must have item number 1"));
+
+ SVN_ERR(packed_stream_get(&value, stream));
+ *last_revision += (svn_revnum_t)decode_int(value);
+ entry.item.revision = *last_revision;
+
+ SVN_ERR(packed_stream_get(&value, stream));
+ entry.fnv1_checksum = (apr_uint32_t)value;
+
+ /* Truncating the checksum to 32 bits may have hidden random data in the
+ * unused extra bits of the on-disk representation (7/8 bit representation
+ * uses 5 bytes on disk for the 32 bit value, leaving 3 bits unused). */
+ if (value > APR_UINT32_MAX)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid FNV1 checksum in P2L index"));
+
+ /* Some of the index data for empty rev / pack file sections will not be
+ * used during normal operation. Thus, we have strict rules for the
+ * contents of those unused fields. */
+ if (entry.type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ if ( entry.item.number != SVN_FS_FS__ITEM_INDEX_UNUSED
+ || entry.fnv1_checksum != 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Empty regions must have item number 0 and checksum 0"));
+
+ APR_ARRAY_PUSH(result, svn_fs_fs__p2l_entry_t) = entry;
+ *item_offset += entry.size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the phys-to-log mappings for the cluster beginning at rev file
+ * offset PAGE_START from the index for START_REVISION in FS. The data
+ * can be found in the index page beginning at START_OFFSET with the next
+ * page beginning at NEXT_OFFSET. PAGE_SIZE is the L2P index page size.
+ * Return the relevant index entries in *ENTRIES. Use REV_FILE to access
+ * on-disk data. Allocate *ENTRIES in RESULT_POOL.
+ */
+static svn_error_t *
+get_p2l_page(apr_array_header_t **entries,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t start_revision,
+ apr_off_t start_offset,
+ apr_off_t next_offset,
+ apr_off_t page_start,
+ apr_uint64_t page_size,
+ apr_pool_t *result_pool)
+{
+ apr_uint64_t value;
+ apr_array_header_t *result
+ = apr_array_make(result_pool, 16, sizeof(svn_fs_fs__p2l_entry_t));
+ apr_off_t item_offset;
+ apr_off_t offset;
+ svn_revnum_t last_revision;
+ apr_uint64_t last_compound;
+
+ /* open index and navigate to page start */
+ SVN_ERR(auto_open_p2l_index(rev_file, fs, start_revision));
+ packed_stream_seek(rev_file->p2l_stream, start_offset);
+
+ /* read rev file offset of the first page entry (all page entries will
+ * only store their sizes). */
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ item_offset = (apr_off_t)value;
+
+ /* read all entries of this page */
+ last_revision = start_revision;
+ last_compound = 0;
+
+ /* Special case: empty pages. */
+ if (start_offset == next_offset)
+ {
+ /* Empty page. This only happens if the first entry of the next page
+ * also covers this page (and possibly more) completely. */
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset,
+ &last_revision, &last_compound, result));
+ }
+ else
+ {
+ /* Read non-empty page. */
+ do
+ {
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset,
+ &last_revision, &last_compound, result));
+ offset = packed_stream_offset(rev_file->p2l_stream);
+ }
+ while (offset < next_offset);
+
+ /* We should now be exactly at the next offset, i.e. the numbers in
+ * the stream cannot overlap into the next page description. */
+ if (offset != next_offset)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L page description overlaps with next page description"));
+
+ /* if we haven't covered the cluster end yet, we must read the first
+ * entry of the next page */
+ if (item_offset < page_start + page_size)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ item_offset = (apr_off_t)value;
+ last_revision = start_revision;
+ last_compound = 0;
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset,
+ &last_revision, &last_compound, result));
+ }
+ }
+
+ *entries = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* If it cannot be found in FS's caches, read the p2l index page selected
+ * by BATON->OFFSET from REV_FILE. Don't read the page if it precedes
+ * MIN_OFFSET. Set *END to TRUE if the caller should stop refeching.
+ *
+ * *BATON will be updated with the selected page's info and SCRATCH_POOL
+ * will be used for temporary allocations. If the data is alread in the
+ * cache, descrease *LEAKING_BUCKET and increase it otherwise. With that
+ * pattern we will still read all pages from the block even if some of
+ * them survived in the cached.
+ */
+static svn_error_t *
+prefetch_p2l_page(svn_boolean_t *end,
+ int *leaking_bucket,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ p2l_page_info_baton_t *baton,
+ apr_off_t min_offset,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t already_cached;
+ apr_array_header_t *page;
+ svn_fs_fs__page_cache_key_t key = { 0 };
+
+ /* fetch the page info */
+ *end = FALSE;
+ baton->revision = baton->first_revision;
+ SVN_ERR(get_p2l_page_info(baton, rev_file, fs, scratch_pool));
+ if (baton->start_offset < min_offset || !rev_file->p2l_stream)
+ {
+ /* page outside limits -> stop prefetching */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* do we have that page in our caches already? */
+ assert(baton->first_revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)baton->first_revision;
+ key.is_packed = svn_fs_fs__is_packed_rev(fs, baton->first_revision);
+ key.page = baton->page_no;
+ SVN_ERR(svn_cache__has_key(&already_cached, ffd->p2l_page_cache,
+ &key, scratch_pool));
+
+ /* yes, already cached */
+ if (already_cached)
+ {
+ /* stop prefetching if most pages are already cached. */
+ if (!--*leaking_bucket)
+ *end = TRUE;
+
+ return SVN_NO_ERROR;
+ }
+
+ ++*leaking_bucket;
+
+ /* read from disk */
+ SVN_ERR(get_p2l_page(&page, rev_file, fs,
+ baton->first_revision,
+ baton->start_offset,
+ baton->next_offset,
+ baton->page_start,
+ baton->page_size,
+ scratch_pool));
+
+ /* and put it into our cache */
+ SVN_ERR(svn_cache__set(ffd->p2l_page_cache, &key, page, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Lookup & construct the baton and key information that we will need for
+ * a P2L page cache lookup. We want the page covering OFFSET in the rev /
+ * pack file containing REVSION in FS. Return the results in *PAGE_INFO_P
+ * and *KEY_P. Read data through REV_FILE. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+get_p2l_keys(p2l_page_info_baton_t *page_info_p,
+ svn_fs_fs__page_cache_key_t *key_p,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *scratch_pool)
+{
+ p2l_page_info_baton_t page_info;
+
+ /* request info for the index pages that describes the pack / rev file
+ * contents at pack / rev file position OFFSET. */
+ page_info.offset = offset;
+ page_info.revision = revision;
+ SVN_ERR(get_p2l_page_info(&page_info, rev_file, fs, scratch_pool));
+
+ /* if the offset refers to a non-existent page, bail out */
+ if (page_info.page_count <= page_info.page_no)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Offset %s too large in revision %ld"),
+ apr_off_t_toa(scratch_pool, offset), revision);
+
+ /* return results */
+ if (page_info_p)
+ *page_info_p = page_info;
+
+ /* construct cache key */
+ if (key_p)
+ {
+ svn_fs_fs__page_cache_key_t key = { 0 };
+ assert(page_info.first_revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)page_info.first_revision;
+ key.is_packed = rev_file->is_packed;
+ key.page = page_info.page_no;
+
+ *key_p = key;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* qsort-compatible compare function that compares the OFFSET of the
+ * svn_fs_fs__p2l_entry_t in *LHS with the apr_off_t in *RHS. */
+static int
+compare_start_p2l_entry(const void *lhs,
+ const void *rhs)
+{
+ const svn_fs_fs__p2l_entry_t *entry = lhs;
+ apr_off_t start = *(const apr_off_t*)rhs;
+ apr_off_t diff = entry->offset - start;
+
+ /* restrict result to int */
+ return diff < 0 ? -1 : (diff == 0 ? 0 : 1);
+}
+
+/* From the PAGE_ENTRIES array of svn_fs_fs__p2l_entry_t, ordered
+ * by their OFFSET member, copy all elements overlapping the range
+ * [BLOCK_START, BLOCK_END) to ENTRIES. */
+static void
+append_p2l_entries(apr_array_header_t *entries,
+ apr_array_header_t *page_entries,
+ apr_off_t block_start,
+ apr_off_t block_end)
+{
+ const svn_fs_fs__p2l_entry_t *entry;
+ int idx = svn_sort__bsearch_lower_bound(page_entries, &block_start,
+ compare_start_p2l_entry);
+
+ /* start at the first entry that overlaps with BLOCK_START */
+ if (idx > 0)
+ {
+ entry = &APR_ARRAY_IDX(page_entries, idx - 1, svn_fs_fs__p2l_entry_t);
+ if (entry->offset + entry->size > block_start)
+ --idx;
+ }
+
+ /* copy all entries covering the requested range */
+ for ( ; idx < page_entries->nelts; ++idx)
+ {
+ entry = &APR_ARRAY_IDX(page_entries, idx, svn_fs_fs__p2l_entry_t);
+ if (entry->offset >= block_end)
+ break;
+
+ APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t) = *entry;
+ }
+}
+
+/* Auxilliary struct passed to p2l_entries_func selecting the relevant
+ * data range. */
+typedef struct p2l_entries_baton_t
+{
+ apr_off_t start;
+ apr_off_t end;
+} p2l_entries_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t: extract p2l entries from
+ * the page in DATA which overlap the p2l_entries_baton_t in BATON.
+ * The target array is already provided in *OUT.
+ */
+static svn_error_t *
+p2l_entries_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ apr_array_header_t *entries = *(apr_array_header_t **)out;
+ const apr_array_header_t *raw_page = data;
+ p2l_entries_baton_t *block = baton;
+
+ /* Make PAGE a readable APR array. */
+ apr_array_header_t page = *raw_page;
+ page.elts = (void *)svn_temp_deserializer__ptr(raw_page,
+ (const void * const *)&raw_page->elts);
+
+ /* append relevant information to result */
+ append_p2l_entries(entries, &page, block->start, block->end);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Body of svn_fs_fs__p2l_index_lookup. However, do a single index page
+ * lookup and append the result to the ENTRIES array provided by the caller.
+ * Use successive calls to cover larger ranges.
+ */
+static svn_error_t *
+p2l_index_lookup(apr_array_header_t *entries,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_end,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_fs__page_cache_key_t key;
+ svn_boolean_t is_cached = FALSE;
+ p2l_page_info_baton_t page_info;
+ apr_array_header_t *local_result = entries;
+
+ /* baton selecting the relevant entries from the one page we access */
+ p2l_entries_baton_t block;
+ block.start = block_start;
+ block.end = block_end;
+
+ /* if we requested an empty range, the result would be empty */
+ SVN_ERR_ASSERT(block_start < block_end);
+
+ /* look for the fist page of the range in our cache */
+ SVN_ERR(get_p2l_keys(&page_info, &key, rev_file, fs, revision, block_start,
+ scratch_pool));
+ SVN_ERR(svn_cache__get_partial((void**)&local_result, &is_cached,
+ ffd->p2l_page_cache, &key, p2l_entries_func,
+ &block, scratch_pool));
+
+ if (!is_cached)
+ {
+ svn_boolean_t end;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_off_t original_page_start = page_info.page_start;
+ int leaking_bucket = 4;
+ p2l_page_info_baton_t prefetch_info = page_info;
+ apr_array_header_t *page_entries;
+
+ apr_off_t max_offset
+ = APR_ALIGN(page_info.next_offset, ffd->block_size);
+ apr_off_t min_offset
+ = APR_ALIGN(page_info.start_offset, ffd->block_size) - ffd->block_size;
+
+ /* Since we read index data in larger chunks, we probably got more
+ * page data than we requested. Parse & cache that until either we
+ * encounter pages already cached or reach the end of the buffer.
+ */
+
+ /* pre-fetch preceding pages */
+ if (ffd->use_block_read)
+ {
+ end = FALSE;
+ prefetch_info.offset = original_page_start;
+ while (prefetch_info.offset >= prefetch_info.page_size && !end)
+ {
+ svn_pool_clear(iterpool);
+
+ prefetch_info.offset -= prefetch_info.page_size;
+ SVN_ERR(prefetch_p2l_page(&end, &leaking_bucket, fs, rev_file,
+ &prefetch_info, min_offset,
+ iterpool));
+ }
+ }
+
+ /* fetch page from disk and put it into the cache */
+ SVN_ERR(get_p2l_page(&page_entries, rev_file, fs,
+ page_info.first_revision,
+ page_info.start_offset,
+ page_info.next_offset,
+ page_info.page_start,
+ page_info.page_size, iterpool));
+
+ /* The last cache entry must not end beyond the range covered by
+ * this index. The same applies for any subset of entries. */
+ if (page_entries->nelts)
+ {
+ const svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(page_entries, page_entries->nelts - 1,
+ svn_fs_fs__p2l_entry_t);
+ if ( entry->offset + entry->size
+ > page_info.page_size * page_info.page_count)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Last P2L index entry extends beyond "
+ "the last page in revision %ld."),
+ revision);
+ }
+
+ SVN_ERR(svn_cache__set(ffd->p2l_page_cache, &key, page_entries,
+ iterpool));
+
+ /* append relevant information to result */
+ append_p2l_entries(entries, page_entries, block_start, block_end);
+
+ /* pre-fetch following pages */
+ if (ffd->use_block_read)
+ {
+ end = FALSE;
+ leaking_bucket = 4;
+ prefetch_info = page_info;
+ prefetch_info.offset = original_page_start;
+ while ( prefetch_info.next_offset < max_offset
+ && prefetch_info.page_no + 1 < prefetch_info.page_count
+ && !end)
+ {
+ svn_pool_clear(iterpool);
+
+ prefetch_info.offset += prefetch_info.page_size;
+ SVN_ERR(prefetch_p2l_page(&end, &leaking_bucket, fs, rev_file,
+ &prefetch_info, min_offset,
+ iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ /* We access a valid page (otherwise, we had seen an error in the
+ * get_p2l_keys request). Hence, at least one entry must be found. */
+ SVN_ERR_ASSERT(entries->nelts > 0);
+
+ /* Add an "unused" entry if it extends beyond the end of the data file.
+ * Since the index page size might be smaller than the current data
+ * read block size, the trailing "unused" entry in this index may not
+ * fully cover the end of the last block. */
+ if (page_info.page_no + 1 >= page_info.page_count)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, entries->nelts-1, svn_fs_fs__p2l_entry_t);
+
+ apr_off_t entry_end = entry->offset + entry->size;
+ if (entry_end < block_end)
+ {
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ {
+ /* extend the terminal filler */
+ entry->size = block_end - entry->offset;
+ }
+ else
+ {
+ /* No terminal filler. Add one. */
+ entry = apr_array_push(entries);
+ entry->offset = entry_end;
+ entry->size = block_end - entry_end;
+ entry->type = SVN_FS_FS__ITEM_TYPE_UNUSED;
+ entry->fnv1_checksum = 0;
+ entry->item.revision = SVN_INVALID_REVNUM;
+ entry->item.number = SVN_FS_FS__ITEM_INDEX_UNUSED;
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__p2l_index_lookup(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t block_end = block_start + block_size;
+
+ /* the receiving container */
+ int last_count = 0;
+ apr_array_header_t *result = apr_array_make(result_pool, 16,
+ sizeof(svn_fs_fs__p2l_entry_t));
+
+ /* Fetch entries page-by-page. Since the p2l index is supposed to cover
+ * every single byte in the rev / pack file - even unused sections -
+ * every iteration must result in some progress. */
+ while (block_start < block_end)
+ {
+ svn_fs_fs__p2l_entry_t *entry;
+ SVN_ERR(p2l_index_lookup(result, rev_file, fs, revision, block_start,
+ block_end, scratch_pool));
+ SVN_ERR_ASSERT(result->nelts > 0);
+
+ /* continue directly behind last item */
+ entry = &APR_ARRAY_IDX(result, result->nelts-1, svn_fs_fs__p2l_entry_t);
+ block_start = entry->offset + entry->size;
+
+ /* Some paranoia check. Successive iterations should never return
+ * duplicates but if it did, we might get into trouble later on. */
+ if (last_count > 0 && last_count < result->nelts)
+ {
+ entry = &APR_ARRAY_IDX(result, last_count - 1,
+ svn_fs_fs__p2l_entry_t);
+ SVN_ERR_ASSERT(APR_ARRAY_IDX(result, last_count,
+ svn_fs_fs__p2l_entry_t).offset
+ >= entry->offset + entry->size);
+ }
+
+ last_count = result->nelts;
+ }
+
+ *entries = result;
+ return SVN_NO_ERROR;
+}
+
+/* compare_fn_t comparing a svn_fs_fs__p2l_entry_t at LHS with an offset
+ * RHS.
+ */
+static int
+compare_p2l_entry_offsets(const void *lhs, const void *rhs)
+{
+ const svn_fs_fs__p2l_entry_t *entry = (const svn_fs_fs__p2l_entry_t *)lhs;
+ apr_off_t offset = *(const apr_off_t *)rhs;
+
+ return entry->offset < offset ? -1 : (entry->offset == offset ? 0 : 1);
+}
+
+/* Cached data extraction utility. DATA is a P2L index page, e.g. an APR
+ * array of svn_fs_fs__p2l_entry_t elements. Return the entry for the item,
+ * allocated in RESULT_POOL, starting at OFFSET or NULL if that's not an
+ * the start offset of any item. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_fs_fs__p2l_entry_t *
+get_p2l_entry_from_cached_page(const void *data,
+ apr_uint64_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* resolve all pointer values of in-cache data */
+ const apr_array_header_t *page = data;
+ apr_array_header_t *entries = apr_pmemdup(scratch_pool, page,
+ sizeof(*page));
+ svn_fs_fs__p2l_entry_t *entry;
+
+ entries->elts = (char *)svn_temp_deserializer__ptr(page,
+ (const void *const *)&page->elts);
+
+ /* search of the offset we want */
+ entry = svn_sort__array_lookup(entries, &offset, NULL,
+ (int (*)(const void *, const void *))compare_p2l_entry_offsets);
+
+ /* return it, if it is a perfect match */
+ return entry ? apr_pmemdup(result_pool, entry, sizeof(*entry)) : NULL;
+}
+
+/* Implements svn_cache__partial_getter_func_t for P2L index pages, copying
+ * the entry for the apr_off_t at BATON into *OUT. *OUT will be NULL if
+ * there is no matching entry in the index page at DATA.
+ */
+static svn_error_t *
+p2l_entry_lookup_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ svn_fs_fs__p2l_entry_t *entry
+ = get_p2l_entry_from_cached_page(data, *(apr_off_t *)baton, result_pool,
+ result_pool);
+
+ *out = entry && entry->offset == *(apr_off_t *)baton
+ ? apr_pmemdup(result_pool, entry, sizeof(*entry))
+ : NULL;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__p2l_entry_lookup(svn_fs_fs__p2l_entry_t **entry_p,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_fs__page_cache_key_t key = { 0 };
+ svn_boolean_t is_cached = FALSE;
+ p2l_page_info_baton_t page_info;
+
+ *entry_p = NULL;
+
+ /* look for this info in our cache */
+ SVN_ERR(get_p2l_keys(&page_info, &key, rev_file, fs, revision, offset,
+ scratch_pool));
+ SVN_ERR(svn_cache__get_partial((void**)entry_p, &is_cached,
+ ffd->p2l_page_cache, &key,
+ p2l_entry_lookup_func, &offset,
+ result_pool));
+ if (!is_cached)
+ {
+ /* do a standard index lookup. This is will automatically prefetch
+ * data to speed up future lookups. */
+ apr_array_header_t *entries = apr_array_make(result_pool, 1,
+ sizeof(**entry_p));
+ SVN_ERR(p2l_index_lookup(entries, rev_file, fs, revision, offset,
+ offset + 1, scratch_pool));
+
+ /* Find the entry that we want. */
+ *entry_p = svn_sort__array_lookup(entries, &offset, NULL,
+ (int (*)(const void *, const void *))compare_p2l_entry_offsets);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_cache__partial_getter_func_t for P2L headers, setting *OUT
+ * to the largest the first offset not covered by this P2L index.
+ */
+static svn_error_t *
+p2l_get_max_offset_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ const p2l_header_t *header = data;
+ apr_off_t max_offset = header->file_size;
+ *out = apr_pmemdup(result_pool, &max_offset, sizeof(max_offset));
+
+ return SVN_NO_ERROR;
+}
+
+/* Core functionality of to svn_fs_fs__p2l_get_max_offset with identical
+ * signature. */
+static svn_error_t *
+p2l_get_max_offset(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ p2l_header_t *header;
+ svn_boolean_t is_cached = FALSE;
+ apr_off_t *offset_p;
+
+ /* look for the header data in our cache */
+ pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(svn_cache__get_partial((void **)&offset_p, &is_cached,
+ ffd->p2l_header_cache, &key,
+ p2l_get_max_offset_func, NULL,
+ scratch_pool));
+ if (is_cached)
+ {
+ *offset = *offset_p;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(get_p2l_header(&header, rev_file, fs, revision, scratch_pool,
+ scratch_pool));
+ *offset = header->file_size;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__p2l_get_max_offset(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(p2l_get_max_offset(offset, fs, rev_file, revision,
+ scratch_pool));
+}
+
+/* Calculate the FNV1 checksum over the offset range in REV_FILE, covered by
+ * ENTRY. Store the result in ENTRY->FNV1_CHECKSUM. Use SCRATCH_POOL for
+ * temporary allocations. */
+static svn_error_t *
+calc_fnv1(svn_fs_fs__p2l_entry_t *entry,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[4096];
+ svn_checksum_t *checksum;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, scratch_pool);
+ apr_off_t size = entry->size;
+
+ /* Special rules apply to unused sections / items. The data must be a
+ * sequence of NUL bytes (not checked here) and the checksum is fixed to 0.
+ */
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ {
+ entry->fnv1_checksum = 0;
+ return SVN_NO_ERROR;
+ }
+
+ /* Read the block and feed it to the checksum calculator. */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &entry->offset,
+ scratch_pool));
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, buffer, to_read, NULL,
+ NULL, scratch_pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+ }
+
+ /* Store final checksum in ENTRY. */
+ SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
+ entry->fnv1_checksum = ntohl(*(const apr_uint32_t *)checksum->digest);
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * Index (re-)creation utilities.
+ */
+
+svn_error_t *
+svn_fs_fs__p2l_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *proto_index;
+
+ /* Use a subpool for immediate temp file cleanup at the end of this
+ * function. */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* Create a proto-index file. */
+ SVN_ERR(svn_io_open_unique_file3(NULL, protoname, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_open(&proto_index, *protoname,
+ scratch_pool));
+
+ /* Write ENTRIES to proto-index file and calculate checksums as we go. */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t *);
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(calc_fnv1(entry, rev_file, iterpool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(proto_index, entry,
+ iterpool));
+ }
+
+ /* Convert proto-index into final index and move it into position.
+ * Note that REV_FILE contains the start revision of the shard file if it
+ * has been packed while REVISION may be somewhere in the middle. For
+ * non-packed shards, they will have identical values. */
+ SVN_ERR(svn_io_file_close(proto_index, iterpool));
+
+ /* Temp file cleanup. */
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* A svn_sort__array compatible comparator function, sorting the
+ * svn_fs_fs__p2l_entry_t** given in LHS, RHS by revision. */
+static int
+compare_p2l_entry_revision(const void *lhs,
+ const void *rhs)
+{
+ const svn_fs_fs__p2l_entry_t *lhs_entry
+ =*(const svn_fs_fs__p2l_entry_t **)lhs;
+ const svn_fs_fs__p2l_entry_t *rhs_entry
+ =*(const svn_fs_fs__p2l_entry_t **)rhs;
+
+ if (lhs_entry->item.revision < rhs_entry->item.revision)
+ return -1;
+
+ return lhs_entry->item.revision == rhs_entry->item.revision ? 0 : 1;
+}
+
+svn_error_t *
+svn_fs_fs__l2p_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *proto_index;
+
+ /* Use a subpool for immediate temp file cleanup at the end of this
+ * function. */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+ svn_revnum_t last_revision = SVN_INVALID_REVNUM;
+ svn_revnum_t revision = SVN_INVALID_REVNUM;
+
+ /* L2P index must be written in revision order.
+ * Sort ENTRIES accordingly. */
+ svn_sort__array(entries, compare_p2l_entry_revision);
+
+ /* Find the first revision in the index
+ * (must exist since no truly empty revs are allowed). */
+ for (i = 0; i < entries->nelts && !SVN_IS_VALID_REVNUM(revision); ++i)
+ revision = APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t *)
+ ->item.revision;
+
+ /* Create the temporary proto-rev file. */
+ SVN_ERR(svn_io_open_unique_file3(NULL, protoname, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_fs_fs__l2p_proto_index_open(&proto_index, *protoname,
+ scratch_pool));
+
+ /* Write all entries. */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ const svn_fs_fs__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t *);
+ svn_pool_clear(iterpool);
+
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ continue;
+
+ if (last_revision != entry->item.revision)
+ {
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_revision(proto_index,
+ scratch_pool));
+ last_revision = entry->item.revision;
+ }
+
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(proto_index,
+ entry->offset,
+ entry->item.number,
+ iterpool));
+ }
+
+ /* Convert proto-index into final index and move it into position. */
+ SVN_ERR(svn_io_file_close(proto_index, iterpool));
+
+ /* Temp file cleanup. */
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/*
+ * Standard (de-)serialization functions
+ */
+
+svn_error_t *
+svn_fs_fs__serialize_l2p_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ l2p_header_t *header = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t page_count = header->page_table_index[header->revision_count];
+ apr_size_t page_table_size = page_count * sizeof(*header->page_table);
+ apr_size_t index_size
+ = (header->revision_count + 1) * sizeof(*header->page_table_index);
+ apr_size_t data_size = sizeof(*header) + index_size + page_table_size;
+
+ /* serialize header and all its elements */
+ context = svn_temp_serializer__init(header,
+ sizeof(*header),
+ data_size + 32,
+ pool);
+
+ /* page table index array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->page_table_index,
+ index_size);
+
+ /* page table array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->page_table,
+ page_table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_l2p_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ l2p_header_t *header = (l2p_header_t *)data;
+
+ /* resolve the pointers in the struct */
+ svn_temp_deserializer__resolve(header, (void**)&header->page_table_index);
+ svn_temp_deserializer__resolve(header, (void**)&header->page_table);
+
+ /* done */
+ *out = header;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__serialize_l2p_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ l2p_page_t *page = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t of_table_size = page->entry_count * sizeof(*page->offsets);
+
+ /* serialize struct and all its elements */
+ context = svn_temp_serializer__init(page,
+ sizeof(*page),
+ of_table_size + sizeof(*page) + 32,
+ pool);
+
+ /* offsets and sub_items arrays */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&page->offsets,
+ of_table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_l2p_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ l2p_page_t *page = data;
+
+ /* resolve the pointers in the struct */
+ svn_temp_deserializer__resolve(page, (void**)&page->offsets);
+
+ /* done */
+ *out = page;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__serialize_p2l_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ p2l_header_t *header = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t table_size = (header->page_count + 1) * sizeof(*header->offsets);
+
+ /* serialize header and all its elements */
+ context = svn_temp_serializer__init(header,
+ sizeof(*header),
+ table_size + sizeof(*header) + 32,
+ pool);
+
+ /* offsets array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->offsets,
+ table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_p2l_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ p2l_header_t *header = data;
+
+ /* resolve the only pointer in the struct */
+ svn_temp_deserializer__resolve(header, (void**)&header->offsets);
+
+ /* done */
+ *out = header;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__serialize_p2l_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *page = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t table_size = page->elt_size * page->nelts;
+
+ /* serialize array header and all its elements */
+ context = svn_temp_serializer__init(page,
+ sizeof(*page),
+ table_size + sizeof(*page) + 32,
+ pool);
+
+ /* items in the array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&page->elts,
+ table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_p2l_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *page = (apr_array_header_t *)data;
+
+ /* resolve the only pointer in the struct */
+ svn_temp_deserializer__resolve(page, (void**)&page->elts);
+
+ /* patch up members */
+ page->pool = pool;
+ page->nalloc = page->nelts;
+
+ /* done */
+ *out = page;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/index.h b/subversion/libsvn_fs_fs/index.h
new file mode 100644
index 0000000..1b696f2
--- /dev/null
+++ b/subversion/libsvn_fs_fs/index.h
@@ -0,0 +1,356 @@
+/* index.h : interface to FSFS indexing functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__INDEX_H
+#define SVN_LIBSVN_FS__INDEX_H
+
+#include "fs.h"
+#include "rev_file.h"
+
+/* Per-defined item index values. They are used to identify empty or
+ * mandatory items.
+ */
+#define SVN_FS_FS__ITEM_INDEX_UNUSED 0 /* invalid / reserved value */
+#define SVN_FS_FS__ITEM_INDEX_CHANGES 1 /* list of changed paths */
+#define SVN_FS_FS__ITEM_INDEX_ROOT_NODE 2 /* the root noderev */
+#define SVN_FS_FS__ITEM_INDEX_FIRST_USER 3 /* first noderev to be freely
+ assigned */
+
+/* Data / item types as stored in the phys-to-log index.
+ */
+#define SVN_FS_FS__ITEM_TYPE_UNUSED 0 /* file section not used */
+#define SVN_FS_FS__ITEM_TYPE_FILE_REP 1 /* item is a file representation */
+#define SVN_FS_FS__ITEM_TYPE_DIR_REP 2 /* item is a directory rep. */
+#define SVN_FS_FS__ITEM_TYPE_FILE_PROPS 3 /* item is a file property rep. */
+#define SVN_FS_FS__ITEM_TYPE_DIR_PROPS 4 /* item is a directory prop rep */
+#define SVN_FS_FS__ITEM_TYPE_NODEREV 5 /* item is a noderev */
+#define SVN_FS_FS__ITEM_TYPE_CHANGES 6 /* item is a changed paths list */
+
+#define SVN_FS_FS__ITEM_TYPE_ANY_REP 7 /* item is any representation.
+ Only used in pre-format7. */
+
+/* Open / create a log-to-phys index file with the full file path name
+ * FILE_NAME. Return the open file in *PROTO_INDEX allocated in
+ * RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_fs__l2p_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool);
+
+/* Call this function before adding entries for the next revision to the
+ * log-to-phys index file in PROTO_INDEX. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+svn_error_t *
+svn_fs_fs__l2p_proto_index_add_revision(apr_file_t *proto_index,
+ apr_pool_t *scratch_pool);
+
+/* Add a new mapping, ITEM_INDEX to the OFFSET, to log-to-phys index file
+ * in PROTO_INDEX. Please note that mappings may be added in any order
+ * but duplicate entries for the same ITEM_INDEX are not supported.
+ * Not all possible index values need to be used. OFFSET may be -1 to
+ * mark 'invalid' item indexes but that is already implied for all item
+ * indexes not explicitly given a mapping.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__l2p_proto_index_add_entry(apr_file_t *proto_index,
+ apr_off_t offset,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool);
+
+/* Use the proto index file stored at PROTO_FILE_NAME, construct the final
+ * log-to-phys index and append it to INDEX_FILE. The first revision will
+ * be REVISION, entries to the next revision will be assigned to REVISION+1
+ * and so forth.
+ *
+ * Return the MD5 checksum of the on-disk index data in *CHECKSUM, allocated
+ * in RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__l2p_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Open / create a phys-to-log index file with the full file path name
+ * FILE_NAME. Return the open file in *PROTO_INDEX allocated in
+ * RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_fs__p2l_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool);
+
+/* Add a new mapping ENTRY to the phys-to-log index file in PROTO_INDEX.
+ * The entries must be added in ascending offset order and must not leave
+ * intermittent ranges uncovered. The revision value in ENTRY may be
+ * SVN_INVALID_REVISION. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_proto_index_add_entry(apr_file_t *proto_index,
+ const svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool);
+
+/* Set *NEXT_OFFSET to the first offset behind the last entry in the
+ * phys-to-log proto index file PROTO_INDEX. This will be 0 for empty
+ * index files. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_proto_index_next_offset(apr_off_t *next_offset,
+ apr_file_t *proto_index,
+ apr_pool_t *scratch_pool);
+
+/* Use the proto index file stored at PROTO_FILE_NAME, construct the final
+ * phys-to-log index and append it to INDEX_FILE. Entries without a valid
+ * revision will be assigned to the REVISION given here.
+ *
+ * Return the MD5 checksum of the on-disk index data in *CHECKSUM, allocated
+ * in RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Use the phys-to-log mapping files in FS to build a list of entries
+ * that (at least partly) overlap with the range given by BLOCK_START
+ * offset and BLOCK_SIZE in the rep / pack file containing REVISION.
+ * Return the array in *ENTRIES with svn_fs_fs__p2l_entry_t as elements,
+ * allocated in RESULT_POOL. REV_FILE determines whether to access single
+ * rev or pack file data. If that is not available anymore (neither in
+ * cache nor on disk), return an error. Use SCRATCH_POOL for temporary
+ * allocations.
+ *
+ * Note that (only) the first and the last mapping may cross a cluster
+ * boundary.
+ */
+svn_error_t *
+svn_fs_fs__p2l_index_lookup(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Use the phys-to-log mapping files in FS to return the entry for the
+ * item starting at global OFFSET in the rep file containing REVISION in
+ * *ENTRY, allocated in RESULT_POOL. Sets *ENTRY to NULL if no item starts
+ * at exactly that offset. REV_FILE determines whether to access single
+ * rev or pack file data. If that is not available anymore (neither in
+ * cache nor on disk), return an error. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_entry_lookup(svn_fs_fs__p2l_entry_t **entry,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* For ITEM_INDEX within REV in FS, return the position in the respective
+ * rev or pack file in *ABSOLUTE_POSITION. If TXN_ID is not NULL, return
+ * the file offset within that transaction and REV should be given as
+ * SVN_INVALID_REVNUM in that case.
+ *
+ * REV_FILE determines whether to access single rev or pack file data.
+ * If that is not available anymore (neither in cache nor on disk), re-open
+ * the rev / pack file and retry to open the index file. For anything but
+ * committed log addressed revisions, REV_FILE may be NULL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__item_offset(apr_off_t *absolute_position,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool);
+
+/* Use the log-to-phys indexes in FS to determine the maximum item indexes
+ * assigned to revision START_REV to START_REV + COUNT - 1. That is a
+ * close upper limit to the actual number of items in the respective revs.
+ * Return the results in *MAX_IDS, allocated in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__l2p_get_max_ids(apr_array_header_t **max_ids,
+ svn_fs_t *fs,
+ svn_revnum_t start_rev,
+ apr_size_t count,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* In *OFFSET, return the last OFFSET in the pack / rev file containing.
+ * REV_FILE determines whether to access single rev or pack file data.
+ * If that is not available anymore (neither in cache nor on disk), re-open
+ * the rev / pack file and retry to open the index file.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_get_max_offset(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+
+/* Index (re-)creation utilities.
+ */
+
+/* For FS, create a new L2P auto-deleting proto index file in POOL and return
+ * its name in *PROTONAME. All entries to write are given in ENTRIES and
+ * entries are of type svn_fs_fs__p2l_entry_t* (sic!). The ENTRIES array
+ * will be reordered. Give the proto index file the lifetime of RESULT_POOL
+ * and use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__l2p_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* For FS, create a new P2L auto-deleting proto index file in POOL and return
+ * its name in *PROTONAME. All entries to write are given in ENTRIES and
+ * of type svn_fs_fs__p2l_entry_t*. The FVN1 checksums are not taken from
+ * ENTRIES but are begin calculated from the current contents of REV_FILE
+ * as we go. Give the proto index file the lifetime of RESULT_POOL and use
+ * SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__p2l_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Serialization and caching interface
+ */
+
+/* We use this key type to address individual pages from both index types.
+ */
+typedef struct svn_fs_fs__page_cache_key_t
+{
+ /* in l2p: this is the revision of the items being mapped
+ in p2l: this is the start revision identifying the pack / rev file */
+ apr_uint32_t revision;
+
+ /* if TRUE, this is the index to a pack file
+ */
+ svn_boolean_t is_packed;
+
+ /* in l2p: page number within the revision
+ * in p2l: page number with the rev / pack file
+ */
+ apr_uint64_t page;
+} svn_fs_fs__page_cache_key_t;
+
+/*
+ * Implements svn_cache__serialize_func_t for l2p_header_t objects.
+ */
+svn_error_t *
+svn_fs_fs__serialize_l2p_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for l2p_header_t objects.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_l2p_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for l2p_page_t objects.
+ */
+svn_error_t *
+svn_fs_fs__serialize_l2p_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for l2p_page_t objects.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_l2p_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for p2l_header_t objects.
+ */
+svn_error_t *
+svn_fs_fs__serialize_p2l_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for p2l_header_t objects.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_p2l_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for apr_array_header_t objects
+ * with elements of type svn_fs_fs__p2l_entry_t.
+ */
+svn_error_t *
+svn_fs_fs__serialize_p2l_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for apr_array_header_t objects
+ * with elements of type svn_fs_fs__p2l_entry_t.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_p2l_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/key-gen.c b/subversion/libsvn_fs_fs/key-gen.c
deleted file mode 100644
index a65c59d..0000000
--- a/subversion/libsvn_fs_fs/key-gen.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* key-gen.c --- manufacturing sequential keys for some db tables
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-#include <apr.h>
-#include <apr_network_io.h>
-#include "private/svn_fs_private.h"
-#include "key-gen.h"
-
-/* The Berkeley DB backend uses a key as a transaction name and the
- maximum key size must be less than the maximum transaction name
- length. */
-#if MAX_KEY_SIZE > SVN_FS__TXN_MAX_LEN
-#error The MAX_KEY_SIZE used for BDB txn names is greater than SVN_FS__TXN_MAX_LEN.
-#endif
-
-
-/*** Keys for reps and strings. ***/
-
-void
-svn_fs_fs__add_keys(const char *key1, const char *key2, char *result)
-{
- apr_ssize_t i1 = strlen(key1) - 1;
- apr_ssize_t i2 = strlen(key2) - 1;
- int i3 = 0;
- int val;
- int carry = 0;
- char buf[MAX_KEY_SIZE + 2];
-
- while ((i1 >= 0) || (i2 >= 0) || (carry > 0))
- {
- val = carry;
- if (i1>=0)
- val += (key1[i1] <= '9') ? (key1[i1] - '0') : (key1[i1] - 'a' + 10);
-
- if (i2>=0)
- val += (key2[i2] <= '9') ? (key2[i2] - '0') : (key2[i2] - 'a' + 10);
-
- carry = val / 36;
- val = val % 36;
-
- buf[i3++] = (char)((val <= 9) ? (val + '0') : (val - 10 + 'a'));
-
- if (i1>=0)
- i1--;
- if (i2>=0)
- i2--;
- }
-
- /* Now reverse the resulting string and NULL terminate it. */
- for (i1 = 0; i1 < i3; i1++)
- result[i1] = buf[i3 - i1 - 1];
-
- result[i1] = '\0';
-}
-
-
-void
-svn_fs_fs__next_key(const char *this, apr_size_t *len, char *next)
-{
- apr_ssize_t i;
- apr_size_t olen = *len; /* remember the first length */
- char c; /* current char */
- svn_boolean_t carry = TRUE; /* boolean: do we have a carry or not?
- We start with a carry, because we're
- incrementing the number, after all. */
-
- /* Leading zeros are not allowed, except for the string "0". */
- if ((*len > 1) && (this[0] == '0'))
- {
- *len = 0;
- return;
- }
-
- for (i = (olen - 1); i >= 0; i--)
- {
- c = this[i];
-
- /* Validate as we go. */
- if (! (((c >= '0') && (c <= '9')) || ((c >= 'a') && (c <= 'z'))))
- {
- *len = 0;
- return;
- }
-
- if (carry)
- {
- if (c == 'z')
- next[i] = '0';
- else
- {
- carry = FALSE;
-
- if (c == '9')
- next[i] = 'a';
- else
- next[i] = ++c;
- }
- }
- else
- next[i] = c;
- }
-
- /* The new length is OLEN, plus 1 if there's a carry out of the
- leftmost digit. */
- *len = olen + (carry ? 1 : 0);
-
- /* Ensure that we haven't overrun the (ludicrous) bound on key length.
- Note that MAX_KEY_SIZE is a bound on the size *including*
- the trailing null byte. */
- assert(*len < MAX_KEY_SIZE);
-
- /* Now we know it's safe to add the null terminator. */
- next[*len] = '\0';
-
- /* Handle any leftover carry. */
- if (carry)
- {
- memmove(next+1, next, olen);
- next[0] = '1';
- }
-}
-
-
-int
-svn_fs_fs__key_compare(const char *a, const char *b)
-{
- apr_size_t a_len = strlen(a);
- apr_size_t b_len = strlen(b);
- int cmp;
-
- if (a_len > b_len)
- return 1;
- if (b_len > a_len)
- return -1;
- cmp = strcmp(a, b);
- return (cmp ? (cmp / abs(cmp)) : 0);
-}
diff --git a/subversion/libsvn_fs_fs/key-gen.h b/subversion/libsvn_fs_fs/key-gen.h
deleted file mode 100644
index e1b3858..0000000
--- a/subversion/libsvn_fs_fs/key-gen.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* key-gen.c --- manufacturing sequential keys for some db tables
- *
- * ====================================================================
- * 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_LIBSVN_FS_KEY_GEN_H
-#define SVN_LIBSVN_FS_KEY_GEN_H
-
-#include <apr.h>
-
-#include "svn_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-/* The alphanumeric keys passed in and out of svn_fs_fs__next_key
- are guaranteed never to be longer than this many bytes,
- *including* the trailing null byte. It is therefore safe
- to declare a key as "char key[MAX_KEY_SIZE]".
-
- Note that this limit will be a problem if the number of
- keys in a table ever exceeds
-
- 18217977168218728251394687124089371267338971528174
- 76066745969754933395997209053270030282678007662838
- 67331479599455916367452421574456059646801054954062
- 15017704234999886990788594743994796171248406730973
- 80736524850563115569208508785942830080999927310762
- 50733948404739350551934565743979678824151197232629
- 947748581376,
-
- but that's a risk we'll live with for now. */
-#define MAX_KEY_SIZE 200
-
-
-/* Generate the next key after a given alphanumeric key.
- *
- * The first *LEN bytes of THIS are an ascii representation of a
- * number in base 36: digits 0-9 have their usual values, and a-z have
- * values 10-35.
- *
- * The new key is stored in NEXT, null-terminated. NEXT must be at
- * least *LEN + 2 bytes long -- one extra byte to hold a possible
- * overflow column, and one for null termination. On return, *LEN
- * will be set to the length of the new key, not counting the null
- * terminator. In other words, the outgoing *LEN will be either equal
- * to the incoming, or to the incoming + 1.
- *
- * If THIS contains anything other than digits and lower-case
- * alphabetic characters, or if it starts with `0' but is not the
- * string "0", then *LEN is set to zero and the effect on NEXT
- * is undefined.
- */
-void svn_fs_fs__next_key(const char *this, apr_size_t *len, char *next);
-
-
-/* Compare two strings A and B as base-36 alphanumeric keys.
- *
- * Return -1, 0, or 1 if A is less than, equal to, or greater than B,
- * respectively.
- */
-int svn_fs_fs__key_compare(const char *a, const char *b);
-
-/* Add two base-36 alphanumeric keys to get a third, the result. */
-void svn_fs_fs__add_keys(const char *key1, const char *key2, char *result);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* SVN_LIBSVN_FS_KEY_GEN_H */
diff --git a/subversion/libsvn_fs_fs/libsvn_fs_fs.pc.in b/subversion/libsvn_fs_fs/libsvn_fs_fs.pc.in
new file mode 100644
index 0000000..324a709
--- /dev/null
+++ b/subversion/libsvn_fs_fs/libsvn_fs_fs.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_fs_fs
+Description: Subversion FSFS Repository Filesystem Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr libsvn_fs_util
+Libs: -L${libdir} -lsvn_fs_fs
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_fs_fs/load-index.c b/subversion/libsvn_fs_fs/load-index.c
new file mode 100644
index 0000000..3142e8e
--- /dev/null
+++ b/subversion/libsvn_fs_fs/load-index.c
@@ -0,0 +1,98 @@
+/* load-index-cmd.c -- implements the dump-index sub-command.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+
+#include "private/svn_fs_fs_private.h"
+#include "private/svn_sorts_private.h"
+
+#include "index.h"
+#include "util.h"
+#include "transaction.h"
+
+/* A svn_sort__array compatible comparator function, sorting the
+ * svn_fs_fs__p2l_entry_t** given in LHS, RHS by offset. */
+static int
+compare_p2l_entry_revision(const void *lhs,
+ const void *rhs)
+{
+ const svn_fs_fs__p2l_entry_t *lhs_entry
+ =*(const svn_fs_fs__p2l_entry_t **)lhs;
+ const svn_fs_fs__p2l_entry_t *rhs_entry
+ =*(const svn_fs_fs__p2l_entry_t **)rhs;
+
+ if (lhs_entry->offset < rhs_entry->offset)
+ return -1;
+
+ return lhs_entry->offset == rhs_entry->offset ? 0 : 1;
+}
+
+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)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Check the FS format number. */
+ if (! svn_fs_fs__use_log_addressing(fs))
+ return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL, NULL);
+
+ /* P2L index must be written in offset order.
+ * Sort ENTRIES accordingly. */
+ svn_sort__array(entries, compare_p2l_entry_revision);
+
+ /* Treat an empty array as a no-op instead error. */
+ if (entries->nelts != 0)
+ {
+ const char *l2p_proto_index;
+ const char *p2l_proto_index;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ /* Open rev / pack file & trim indexes + footer off it. */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs,
+ revision, iterpool,
+ iterpool));
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ SVN_ERR(svn_io_file_trunc(rev_file->file, rev_file->l2p_offset,
+ iterpool));
+
+ /* Create proto index files for the new index data
+ * (will be cleaned up automatically with iterpool). */
+ SVN_ERR(svn_fs_fs__p2l_index_from_p2l_entries(&p2l_proto_index, fs,
+ rev_file, entries,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_fs__l2p_index_from_p2l_entries(&l2p_proto_index, fs,
+ entries, iterpool,
+ iterpool));
+
+ /* Combine rev data with new index data. */
+ SVN_ERR(svn_fs_fs__add_index_data(fs, rev_file->file, l2p_proto_index,
+ p2l_proto_index,
+ rev_file->start_revision, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/lock.c b/subversion/libsvn_fs_fs/lock.c
index 95bd943..c852025 100644
--- a/subversion/libsvn_fs_fs/lock.c
+++ b/subversion/libsvn_fs_fs/lock.c
@@ -20,7 +20,6 @@
* ====================================================================
*/
-
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
@@ -37,10 +36,12 @@
#include "lock.h"
#include "tree.h"
#include "fs_fs.h"
+#include "util.h"
#include "../libsvn_fs/fs-loader.h"
#include "private/svn_fs_util.h"
#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
#include "svn_private_config.h"
/* Names of hash keys used to store a lock for writing to disk. */
@@ -102,8 +103,7 @@ hash_store(apr_hash_t *hash,
of that value (if it exists). */
static const char *
hash_fetch(apr_hash_t *hash,
- const char *key,
- apr_pool_t *pool)
+ const char *key)
{
svn_string_t *str = svn_hash_gets(hash, key);
return str ? str->data : NULL;
@@ -133,7 +133,7 @@ digest_path_from_digest(const char *fs_path,
{
return svn_dirent_join_many(pool, fs_path, PATH_LOCKS_DIR,
apr_pstrmemdup(pool, digest, DIGEST_SUBDIR_LEN),
- digest, NULL);
+ digest, SVN_VA_NULL);
}
@@ -151,7 +151,7 @@ digest_path_from_path(const char **digest_path,
*digest_path = svn_dirent_join_many(pool, fs_path, PATH_LOCKS_DIR,
apr_pstrmemdup(pool, digest,
DIGEST_SUBDIR_LEN),
- digest, NULL);
+ digest, SVN_VA_NULL);
return SVN_NO_ERROR;
}
@@ -209,8 +209,8 @@ write_digest_file(apr_hash_t *children,
for (hi = apr_hash_first(pool, children); hi; hi = apr_hash_next(hi))
{
svn_stringbuf_appendbytes(children_list,
- svn__apr_hash_index_key(hi),
- svn__apr_hash_index_klen(hi));
+ apr_hash_this_key(hi),
+ apr_hash_this_key_len(hi));
svn_stringbuf_appendbyte(children_list, '\n');
}
hash_store(hash, CHILDREN_KEY, sizeof(CHILDREN_KEY)-1,
@@ -252,24 +252,23 @@ read_digest_file(apr_hash_t **children_p,
apr_hash_t *hash;
svn_stream_t *stream;
const char *val;
+ svn_node_kind_t kind;
if (lock_p)
*lock_p = NULL;
if (children_p)
*children_p = apr_hash_make(pool);
- err = svn_stream_open_readonly(&stream, digest_path, pool, pool);
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
- SVN_ERR(err);
+ SVN_ERR(svn_io_check_path(digest_path, &kind, pool));
+ if (kind == svn_node_none)
+ return SVN_NO_ERROR;
/* If our caller doesn't care about anything but the presence of the
file... whatever. */
- if (! (lock_p || children_p))
- return svn_stream_close(stream);
+ if (kind == svn_node_file && !lock_p && !children_p)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_stream_open_readonly(&stream, digest_path, pool, pool));
hash = apr_hash_make(pool);
if ((err = svn_hash_read2(hash, stream, SVN_HASH_TERMINATOR, pool)))
@@ -284,7 +283,7 @@ read_digest_file(apr_hash_t **children_p,
/* If our caller cares, see if we have a lock path in our hash. If
so, we'll assume we have a lock here. */
- val = hash_fetch(hash, PATH_KEY, pool);
+ val = hash_fetch(hash, PATH_KEY);
if (val && lock_p)
{
const char *path = val;
@@ -293,30 +292,30 @@ read_digest_file(apr_hash_t **children_p,
lock = svn_lock_create(pool);
lock->path = path;
- if (! ((lock->token = hash_fetch(hash, TOKEN_KEY, pool))))
+ if (! ((lock->token = hash_fetch(hash, TOKEN_KEY))))
return svn_error_trace(err_corrupt_lockfile(fs_path, path));
- if (! ((lock->owner = hash_fetch(hash, OWNER_KEY, pool))))
+ if (! ((lock->owner = hash_fetch(hash, OWNER_KEY))))
return svn_error_trace(err_corrupt_lockfile(fs_path, path));
- if (! ((val = hash_fetch(hash, IS_DAV_COMMENT_KEY, pool))))
+ if (! ((val = hash_fetch(hash, IS_DAV_COMMENT_KEY))))
return svn_error_trace(err_corrupt_lockfile(fs_path, path));
lock->is_dav_comment = (val[0] == '1');
- if (! ((val = hash_fetch(hash, CREATION_DATE_KEY, pool))))
+ if (! ((val = hash_fetch(hash, CREATION_DATE_KEY))))
return svn_error_trace(err_corrupt_lockfile(fs_path, path));
SVN_ERR(svn_time_from_cstring(&(lock->creation_date), val, pool));
- if ((val = hash_fetch(hash, EXPIRATION_DATE_KEY, pool)))
+ if ((val = hash_fetch(hash, EXPIRATION_DATE_KEY)))
SVN_ERR(svn_time_from_cstring(&(lock->expiration_date), val, pool));
- lock->comment = hash_fetch(hash, COMMENT_KEY, pool);
+ lock->comment = hash_fetch(hash, COMMENT_KEY);
*lock_p = lock;
}
/* If our caller cares, see if we have any children for this path. */
- val = hash_fetch(hash, CHILDREN_KEY, pool);
+ val = hash_fetch(hash, CHILDREN_KEY);
if (val && children_p)
{
apr_array_header_t *kiddos = svn_cstring_split(val, "\n", FALSE, pool);
@@ -340,8 +339,6 @@ read_digest_file(apr_hash_t **children_p,
/* Write LOCK in FS to the actual OS filesystem.
Use PERMS_REFERENCE for the permissions of any digest files.
-
- Note: this takes an FS_PATH because it's called from the hotcopy logic.
*/
static svn_error_t *
set_lock(const char *fs_path,
@@ -349,130 +346,117 @@ set_lock(const char *fs_path,
const char *perms_reference,
apr_pool_t *pool)
{
- svn_stringbuf_t *this_path = svn_stringbuf_create(lock->path, pool);
- const char *lock_digest_path = NULL;
- apr_pool_t *subpool;
+ const char *digest_path;
+ apr_hash_t *children;
- SVN_ERR_ASSERT(lock);
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, lock->path, pool));
- /* Iterate in reverse, creating the lock for LOCK->path, and then
- just adding entries for its parent, until we reach a parent
- that's already listed in *its* parent. */
- subpool = svn_pool_create(pool);
- while (1729)
- {
- const char *digest_path, *digest_file;
- apr_hash_t *this_children;
- svn_lock_t *this_lock;
+ /* We could get away without reading the file as children should
+ always come back empty. */
+ SVN_ERR(read_digest_file(&children, NULL, fs_path, digest_path, pool));
- svn_pool_clear(subpool);
+ SVN_ERR(write_digest_file(children, lock, fs_path, digest_path,
+ perms_reference, pool));
- /* Calculate the DIGEST_PATH for the currently FS path, and then
- get its DIGEST_FILE basename. */
- SVN_ERR(digest_path_from_path(&digest_path, fs_path, this_path->data,
- subpool));
- digest_file = svn_dirent_basename(digest_path, subpool);
+ return SVN_NO_ERROR;
+}
- SVN_ERR(read_digest_file(&this_children, &this_lock, fs_path,
- digest_path, subpool));
+static svn_error_t *
+delete_lock(const char *fs_path,
+ const char *path,
+ apr_pool_t *pool)
+{
+ const char *digest_path;
- /* We're either writing a new lock (first time through only) or
- a new entry (every time but the first). */
- if (lock)
- {
- this_lock = lock;
- lock = NULL;
- lock_digest_path = apr_pstrdup(pool, digest_file);
- }
- else
- {
- /* If we already have an entry for this path, we're done. */
- if (svn_hash_gets(this_children, lock_digest_path))
- break;
- svn_hash_sets(this_children, lock_digest_path, (void *)1);
- }
- SVN_ERR(write_digest_file(this_children, this_lock, fs_path,
- digest_path, perms_reference, subpool));
-
- /* Prep for next iteration, or bail if we're done. */
- if (svn_fspath__is_root(this_path->data, this_path->len))
- break;
- svn_stringbuf_set(this_path,
- svn_fspath__dirname(this_path->data, subpool));
- }
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path, pool));
+
+ SVN_ERR(svn_io_remove_file2(digest_path, TRUE, pool));
- svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
-/* Delete LOCK from FS in the actual OS filesystem. */
static svn_error_t *
-delete_lock(svn_fs_t *fs,
- svn_lock_t *lock,
- apr_pool_t *pool)
+add_to_digest(const char *fs_path,
+ apr_array_header_t *paths,
+ const char *index_path,
+ const char *perms_reference,
+ apr_pool_t *pool)
{
- svn_stringbuf_t *this_path = svn_stringbuf_create(lock->path, pool);
- const char *child_to_kill = NULL;
- apr_pool_t *subpool;
+ const char *index_digest_path;
+ apr_hash_t *children;
+ svn_lock_t *lock;
+ int i;
+ unsigned int original_count;
- SVN_ERR_ASSERT(lock);
+ SVN_ERR(digest_path_from_path(&index_digest_path, fs_path, index_path, pool));
- /* Iterate in reverse, deleting the lock for LOCK->path, and then
- deleting its entry as it appears in each of its parents. */
- subpool = svn_pool_create(pool);
- while (1729)
+ SVN_ERR(read_digest_file(&children, &lock, fs_path, index_digest_path, pool));
+
+ original_count = apr_hash_count(children);
+
+ for (i = 0; i < paths->nelts; ++i)
{
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
const char *digest_path, *digest_file;
- apr_hash_t *this_children;
- svn_lock_t *this_lock;
- svn_pool_clear(subpool);
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path, pool));
+ digest_file = svn_dirent_basename(digest_path, NULL);
+ svn_hash_sets(children, digest_file, (void *)1);
+ }
- /* Calculate the DIGEST_PATH for the currently FS path, and then
- get its DIGEST_FILE basename. */
- SVN_ERR(digest_path_from_path(&digest_path, fs->path, this_path->data,
- subpool));
- digest_file = svn_dirent_basename(digest_path, subpool);
+ if (apr_hash_count(children) != original_count)
+ SVN_ERR(write_digest_file(children, lock, fs_path, index_digest_path,
+ perms_reference, pool));
- SVN_ERR(read_digest_file(&this_children, &this_lock, fs->path,
- digest_path, subpool));
+ return SVN_NO_ERROR;
+}
- /* Delete the lock (first time through only). */
- if (lock)
- {
- this_lock = NULL;
- lock = NULL;
- child_to_kill = apr_pstrdup(pool, digest_file);
- }
+static svn_error_t *
+delete_from_digest(const char *fs_path,
+ apr_array_header_t *paths,
+ const char *index_path,
+ const char *perms_reference,
+ apr_pool_t *pool)
+{
+ const char *index_digest_path;
+ apr_hash_t *children;
+ svn_lock_t *lock;
+ int i;
- if (child_to_kill)
- svn_hash_sets(this_children, child_to_kill, NULL);
+ SVN_ERR(digest_path_from_path(&index_digest_path, fs_path, index_path, pool));
- if (! (this_lock || apr_hash_count(this_children) != 0))
- {
- /* Special case: no goodz, no file. And remember to nix
- the entry for it in its parent. */
- SVN_ERR(svn_io_remove_file2(digest_path, FALSE, subpool));
- }
- else
- {
- const char *rev_0_path;
- SVN_ERR(svn_fs_fs__path_rev_absolute(&rev_0_path, fs, 0, pool));
- SVN_ERR(write_digest_file(this_children, this_lock, fs->path,
- digest_path, rev_0_path, subpool));
- }
+ SVN_ERR(read_digest_file(&children, &lock, fs_path, index_digest_path, pool));
- /* Prep for next iteration, or bail if we're done. */
- if (svn_fspath__is_root(this_path->data, this_path->len))
- break;
- svn_stringbuf_set(this_path,
- svn_fspath__dirname(this_path->data, subpool));
+ for (i = 0; i < paths->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ const char *digest_path, *digest_file;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path, pool));
+ digest_file = svn_dirent_basename(digest_path, NULL);
+ svn_hash_sets(children, digest_file, NULL);
}
- svn_pool_destroy(subpool);
+ if (apr_hash_count(children) || lock)
+ SVN_ERR(write_digest_file(children, lock, fs_path, index_digest_path,
+ perms_reference, pool));
+ else
+ SVN_ERR(svn_io_remove_file2(index_digest_path, TRUE, pool));
+
return SVN_NO_ERROR;
}
+static svn_error_t *
+unlock_single(svn_fs_t *fs,
+ svn_lock_t *lock,
+ apr_pool_t *pool);
+
+/* Check if LOCK has been already expired. */
+static svn_boolean_t lock_expired(const svn_lock_t *lock)
+{
+ return lock->expiration_date && (apr_time_now() > lock->expiration_date);
+}
+
/* Set *LOCK_P to the lock for PATH in FS. HAVE_WRITE_LOCK should be
TRUE if the caller (or one of its callers) has taken out the
repository-wide write lock, FALSE otherwise. If MUST_EXIST is
@@ -502,12 +486,12 @@ get_lock(svn_lock_t **lock_p,
return must_exist ? SVN_FS__ERR_NO_SUCH_LOCK(fs, path) : SVN_NO_ERROR;
/* Don't return an expired lock. */
- if (lock->expiration_date && (apr_time_now() > lock->expiration_date))
+ if (lock_expired(lock))
{
/* Only remove the lock if we have the write lock.
Read operations shouldn't change the filesystem. */
if (have_write_lock)
- SVN_ERR(delete_lock(fs, lock, pool));
+ SVN_ERR(unlock_single(fs, lock, pool));
return SVN_FS__ERR_LOCK_EXPIRED(fs, lock->token);
}
@@ -549,69 +533,17 @@ get_lock_helper(svn_fs_t *fs,
}
-/* Baton for locks_walker(). */
-struct walk_locks_baton {
- svn_fs_get_locks_callback_t get_locks_func;
- void *get_locks_baton;
- svn_fs_t *fs;
-};
-
-/* Implements walk_digests_callback_t. */
-static svn_error_t *
-locks_walker(void *baton,
- const char *fs_path,
- const char *digest_path,
- apr_hash_t *children,
- svn_lock_t *lock,
- svn_boolean_t have_write_lock,
- apr_pool_t *pool)
-{
- struct walk_locks_baton *wlb = baton;
-
- if (lock)
- {
- /* Don't report an expired lock. */
- if (lock->expiration_date == 0
- || (apr_time_now() <= lock->expiration_date))
- {
- if (wlb->get_locks_func)
- SVN_ERR(wlb->get_locks_func(wlb->get_locks_baton, lock, pool));
- }
- else
- {
- /* Only remove the lock if we have the write lock.
- Read operations shouldn't change the filesystem. */
- if (have_write_lock)
- SVN_ERR(delete_lock(wlb->fs, lock, pool));
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Callback type for walk_digest_files().
- *
- * CHILDREN and LOCK come from a read_digest_file(digest_path) call.
- */
-typedef svn_error_t *(*walk_digests_callback_t)(void *baton,
- const char *fs_path,
- const char *digest_path,
- apr_hash_t *children,
- svn_lock_t *lock,
- svn_boolean_t have_write_lock,
- apr_pool_t *pool);
-
-/* A recursive function that calls WALK_DIGESTS_FUNC/WALK_DIGESTS_BATON for
- all lock digest files in and under PATH in FS.
+/* A function that calls GET_LOCKS_FUNC/GET_LOCKS_BATON for
+ all locks in and under PATH in FS.
HAVE_WRITE_LOCK should be true if the caller (directly or indirectly)
has the FS write lock. */
static svn_error_t *
-walk_digest_files(const char *fs_path,
- const char *digest_path,
- walk_digests_callback_t walk_digests_func,
- void *walk_digests_baton,
- svn_boolean_t have_write_lock,
- apr_pool_t *pool)
+walk_locks(svn_fs_t *fs,
+ const char *digest_path,
+ svn_fs_get_locks_callback_t get_locks_func,
+ void *get_locks_baton,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool)
{
apr_hash_index_t *hi;
apr_hash_t *children;
@@ -619,47 +551,46 @@ walk_digest_files(const char *fs_path,
svn_lock_t *lock;
/* First, send up any locks in the current digest file. */
- SVN_ERR(read_digest_file(&children, &lock, fs_path, digest_path, pool));
+ SVN_ERR(read_digest_file(&children, &lock, fs->path, digest_path, pool));
- SVN_ERR(walk_digests_func(walk_digests_baton, fs_path, digest_path,
- children, lock,
- have_write_lock, pool));
+ if (lock && lock_expired(lock))
+ {
+ /* Only remove the lock if we have the write lock.
+ Read operations shouldn't change the filesystem. */
+ if (have_write_lock)
+ SVN_ERR(unlock_single(fs, lock, pool));
+ }
+ else if (lock)
+ {
+ SVN_ERR(get_locks_func(get_locks_baton, lock, pool));
+ }
- /* Now, recurse on this thing's child entries (if any; bail otherwise). */
+ /* Now, report all the child entries (if any; bail otherwise). */
if (! apr_hash_count(children))
return SVN_NO_ERROR;
subpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, children); hi; hi = apr_hash_next(hi))
{
- const char *digest = svn__apr_hash_index_key(hi);
+ const char *digest = apr_hash_this_key(hi);
svn_pool_clear(subpool);
- SVN_ERR(walk_digest_files
- (fs_path, digest_path_from_digest(fs_path, digest, subpool),
- walk_digests_func, walk_digests_baton, have_write_lock, subpool));
- }
- svn_pool_destroy(subpool);
- return SVN_NO_ERROR;
-}
-/* A recursive function that calls GET_LOCKS_FUNC/GET_LOCKS_BATON for
- all locks in and under PATH in FS.
- HAVE_WRITE_LOCK should be true if the caller (directly or indirectly)
- has the FS write lock. */
-static svn_error_t *
-walk_locks(svn_fs_t *fs,
- const char *digest_path,
- svn_fs_get_locks_callback_t get_locks_func,
- void *get_locks_baton,
- svn_boolean_t have_write_lock,
- apr_pool_t *pool)
-{
- struct walk_locks_baton wlb;
+ SVN_ERR(read_digest_file
+ (NULL, &lock, fs->path,
+ digest_path_from_digest(fs->path, digest, subpool), subpool));
- wlb.get_locks_func = get_locks_func;
- wlb.get_locks_baton = get_locks_baton;
- wlb.fs = fs;
- SVN_ERR(walk_digest_files(fs->path, digest_path, locks_walker, &wlb,
- have_write_lock, pool));
+ if (lock && lock_expired(lock))
+ {
+ /* Only remove the lock if we have the write lock.
+ Read operations shouldn't change the filesystem. */
+ if (have_write_lock)
+ SVN_ERR(unlock_single(fs, lock, pool));
+ }
+ else if (lock)
+ {
+ SVN_ERR(get_locks_func(get_locks_baton, lock, pool));
+ }
+ }
+ svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
@@ -737,70 +668,100 @@ svn_fs_fs__allow_locked_operation(const char *path,
return SVN_NO_ERROR;
}
-/* Baton used for lock_body below. */
+/* Helper function called from the lock and unlock code.
+ UPDATES is a map from "const char *" parent paths to "apr_array_header_t *"
+ arrays of child paths. For all of the parent paths of PATH this function
+ adds PATH to the corresponding array of child paths. */
+static void
+schedule_index_update(apr_hash_t *updates,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *hashpool = apr_hash_pool_get(updates);
+ const char *parent_path = path;
+
+ while (! svn_fspath__is_root(parent_path, strlen(parent_path)))
+ {
+ apr_array_header_t *children;
+
+ parent_path = svn_fspath__dirname(parent_path, scratch_pool);
+ children = svn_hash_gets(updates, parent_path);
+
+ if (! children)
+ {
+ children = apr_array_make(hashpool, 8, sizeof(const char *));
+ svn_hash_sets(updates, apr_pstrdup(hashpool, parent_path), children);
+ }
+
+ APR_ARRAY_PUSH(children, const char *) = path;
+ }
+}
+
+/* The effective arguments for lock_body() below. */
struct lock_baton {
- svn_lock_t **lock_p;
svn_fs_t *fs;
- const char *path;
- const char *token;
+ apr_array_header_t *targets;
+ apr_array_header_t *infos;
const char *comment;
svn_boolean_t is_dav_comment;
apr_time_t expiration_date;
- svn_revnum_t current_rev;
svn_boolean_t steal_lock;
- apr_pool_t *pool;
+ apr_pool_t *result_pool;
};
-
-/* This implements the svn_fs_fs__with_write_lock() 'body' callback
- type, and assumes that the write lock is held.
- BATON is a 'struct lock_baton *'. */
static svn_error_t *
-lock_body(void *baton, apr_pool_t *pool)
+check_lock(svn_error_t **fs_err,
+ const char *path,
+ const svn_fs_lock_target_t *target,
+ struct lock_baton *lb,
+ svn_fs_root_t *root,
+ svn_revnum_t youngest_rev,
+ apr_pool_t *pool)
{
- struct lock_baton *lb = baton;
svn_node_kind_t kind;
svn_lock_t *existing_lock;
- svn_lock_t *lock;
- svn_fs_root_t *root;
- svn_revnum_t youngest;
- const char *rev_0_path;
- /* Until we implement directory locks someday, we only allow locks
- on files or non-existent paths. */
- /* Use fs->vtable->foo instead of svn_fs_foo to avoid circular
- library dependencies, which are not portable. */
- SVN_ERR(lb->fs->vtable->youngest_rev(&youngest, lb->fs, pool));
- SVN_ERR(lb->fs->vtable->revision_root(&root, lb->fs, youngest, pool));
- SVN_ERR(svn_fs_fs__check_path(&kind, root, lb->path, pool));
+ *fs_err = SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_fs__check_path(&kind, root, path, pool));
if (kind == svn_node_dir)
- return SVN_FS__ERR_NOT_FILE(lb->fs, lb->path);
+ {
+ *fs_err = SVN_FS__ERR_NOT_FILE(lb->fs, path);
+ return SVN_NO_ERROR;
+ }
/* While our locking implementation easily supports the locking of
nonexistent paths, we deliberately choose not to allow such madness. */
if (kind == svn_node_none)
{
- if (SVN_IS_VALID_REVNUM(lb->current_rev))
- return svn_error_createf(
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
+ *fs_err = svn_error_createf(
SVN_ERR_FS_OUT_OF_DATE, NULL,
_("Path '%s' doesn't exist in HEAD revision"),
- lb->path);
+ path);
else
- return svn_error_createf(
+ *fs_err = svn_error_createf(
SVN_ERR_FS_NOT_FOUND, NULL,
_("Path '%s' doesn't exist in HEAD revision"),
- lb->path);
- }
+ path);
- /* We need to have a username attached to the fs. */
- if (!lb->fs->access_ctx || !lb->fs->access_ctx->username)
- return SVN_FS__ERR_NO_USER(lb->fs);
+ return SVN_NO_ERROR;
+ }
/* Is the caller attempting to lock an out-of-date working file? */
- if (SVN_IS_VALID_REVNUM(lb->current_rev))
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
{
svn_revnum_t created_rev;
- SVN_ERR(svn_fs_fs__node_created_rev(&created_rev, root, lb->path,
+
+ if (target->current_rev > youngest_rev)
+ {
+ *fs_err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_fs_fs__node_created_rev(&created_rev, root, path,
pool));
/* SVN_INVALID_REVNUM means the path doesn't exist. So
@@ -808,14 +769,22 @@ lock_body(void *baton, apr_pool_t *pool)
working copy, but somebody else has deleted the thing
from HEAD. That counts as being 'out of date'. */
if (! SVN_IS_VALID_REVNUM(created_rev))
- return svn_error_createf
- (SVN_ERR_FS_OUT_OF_DATE, NULL,
- _("Path '%s' doesn't exist in HEAD revision"), lb->path);
-
- if (lb->current_rev < created_rev)
- return svn_error_createf
- (SVN_ERR_FS_OUT_OF_DATE, NULL,
- _("Lock failed: newer version of '%s' exists"), lb->path);
+ {
+ *fs_err = svn_error_createf
+ (SVN_ERR_FS_OUT_OF_DATE, NULL,
+ _("Path '%s' doesn't exist in HEAD revision"), path);
+
+ return SVN_NO_ERROR;
+ }
+
+ if (target->current_rev < created_rev)
+ {
+ *fs_err = svn_error_createf
+ (SVN_ERR_FS_OUT_OF_DATE, NULL,
+ _("Lock failed: newer version of '%s' exists"), path);
+
+ return SVN_NO_ERROR;
+ }
}
/* If the caller provided a TOKEN, we *really* need to see
@@ -834,116 +803,380 @@ lock_body(void *baton, apr_pool_t *pool)
acceptable to ignore; it means that the path is now free and
clear for locking, because the fsfs funcs just cleared out both
of the tables for us. */
- SVN_ERR(get_lock_helper(lb->fs, &existing_lock, lb->path, TRUE, pool));
+ SVN_ERR(get_lock_helper(lb->fs, &existing_lock, path, TRUE, pool));
if (existing_lock)
{
if (! lb->steal_lock)
{
/* Sorry, the path is already locked. */
- return SVN_FS__ERR_PATH_ALREADY_LOCKED(lb->fs, existing_lock);
+ *fs_err = SVN_FS__ERR_PATH_ALREADY_LOCKED(lb->fs, existing_lock);
+ return SVN_NO_ERROR;
}
- else
+ }
+
+ return SVN_NO_ERROR;
+}
+
+struct lock_info_t {
+ const char *path;
+ svn_lock_t *lock;
+ svn_error_t *fs_err;
+};
+
+/* The body of svn_fs_fs__lock(), which see.
+
+ BATON is a 'struct lock_baton *' holding the effective arguments.
+ BATON->targets is an array of 'svn_sort__item_t' targets, sorted by
+ path, mapping canonical path to 'svn_fs_lock_target_t'. Set
+ BATON->infos to an array of 'lock_info_t' holding the results. For
+ the other arguments, see svn_fs_lock_many().
+
+ This implements the svn_fs_fs__with_write_lock() 'body' callback
+ type, and assumes that the write lock is held.
+ */
+static svn_error_t *
+lock_body(void *baton, apr_pool_t *pool)
+{
+ struct lock_baton *lb = baton;
+ svn_fs_root_t *root;
+ svn_revnum_t youngest;
+ const char *rev_0_path;
+ int i;
+ apr_hash_t *index_updates = apr_hash_make(pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Until we implement directory locks someday, we only allow locks
+ on files or non-existent paths. */
+ /* Use fs->vtable->foo instead of svn_fs_foo to avoid circular
+ library dependencies, which are not portable. */
+ SVN_ERR(lb->fs->vtable->youngest_rev(&youngest, lb->fs, pool));
+ SVN_ERR(lb->fs->vtable->revision_root(&root, lb->fs, youngest, pool));
+
+ for (i = 0; i < lb->targets->nelts; ++i)
+ {
+ const svn_sort__item_t *item = &APR_ARRAY_IDX(lb->targets, i,
+ svn_sort__item_t);
+ struct lock_info_t info;
+
+ svn_pool_clear(iterpool);
+
+ info.path = item->key;
+ info.lock = NULL;
+ info.fs_err = SVN_NO_ERROR;
+
+ SVN_ERR(check_lock(&info.fs_err, info.path, item->value, lb, root,
+ youngest, iterpool));
+
+ /* If no error occurred while pre-checking, schedule the index updates for
+ this path. */
+ if (!info.fs_err)
+ schedule_index_update(index_updates, info.path, iterpool);
+
+ APR_ARRAY_PUSH(lb->infos, struct lock_info_t) = info;
+ }
+
+ rev_0_path = svn_fs_fs__path_rev_absolute(lb->fs, 0, pool);
+
+ /* We apply the scheduled index updates before writing the actual locks.
+
+ Writing indices before locks is correct: if interrupted it leaves
+ indices without locks rather than locks without indices. An
+ index without a lock is consistent in that it always shows up as
+ unlocked in svn_fs_fs__allow_locked_operation. A lock without an
+ index is inconsistent, svn_fs_fs__allow_locked_operation will
+ show locked on the file but unlocked on the parent. */
+
+ for (hi = apr_hash_first(pool, index_updates); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ apr_array_header_t *children = apr_hash_this_val(hi);
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(add_to_digest(lb->fs->path, children, path, rev_0_path,
+ iterpool));
+ }
+
+ for (i = 0; i < lb->infos->nelts; ++i)
+ {
+ struct lock_info_t *info = &APR_ARRAY_IDX(lb->infos, i,
+ struct lock_info_t);
+ svn_sort__item_t *item = &APR_ARRAY_IDX(lb->targets, i, svn_sort__item_t);
+ svn_fs_lock_target_t *target = item->value;
+
+ svn_pool_clear(iterpool);
+
+ if (! info->fs_err)
{
- /* STEAL_LOCK was passed, so fs_username is "stealing" the
- lock from lock->owner. Destroy the existing lock. */
- SVN_ERR(delete_lock(lb->fs, existing_lock, pool));
+ info->lock = svn_lock_create(lb->result_pool);
+ if (target->token)
+ info->lock->token = apr_pstrdup(lb->result_pool, target->token);
+ else
+ SVN_ERR(svn_fs_fs__generate_lock_token(&(info->lock->token), lb->fs,
+ lb->result_pool));
+
+ /* The INFO->PATH is already allocated in LB->RESULT_POOL as a result
+ of svn_fspath__canonicalize() (see svn_fs_fs__lock()). */
+ info->lock->path = info->path;
+ info->lock->owner = apr_pstrdup(lb->result_pool,
+ lb->fs->access_ctx->username);
+ info->lock->comment = apr_pstrdup(lb->result_pool, lb->comment);
+ info->lock->is_dav_comment = lb->is_dav_comment;
+ info->lock->creation_date = apr_time_now();
+ info->lock->expiration_date = lb->expiration_date;
+
+ info->fs_err = set_lock(lb->fs->path, info->lock, rev_0_path,
+ iterpool);
}
}
- /* Create our new lock, and add it to the tables.
- Ensure that the lock is created in the correct pool. */
- lock = svn_lock_create(lb->pool);
- if (lb->token)
- lock->token = apr_pstrdup(lb->pool, lb->token);
- else
- SVN_ERR(svn_fs_fs__generate_lock_token(&(lock->token), lb->fs,
- lb->pool));
- lock->path = apr_pstrdup(lb->pool, lb->path);
- lock->owner = apr_pstrdup(lb->pool, lb->fs->access_ctx->username);
- lock->comment = apr_pstrdup(lb->pool, lb->comment);
- lock->is_dav_comment = lb->is_dav_comment;
- lock->creation_date = apr_time_now();
- lock->expiration_date = lb->expiration_date;
- SVN_ERR(svn_fs_fs__path_rev_absolute(&rev_0_path, lb->fs, 0, pool));
- SVN_ERR(set_lock(lb->fs->path, lock, rev_0_path, pool));
- *lb->lock_p = lock;
-
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
-/* Baton used for unlock_body below. */
+/* The effective arguments for unlock_body() below. */
struct unlock_baton {
svn_fs_t *fs;
- const char *path;
- const char *token;
+ apr_array_header_t *targets;
+ apr_array_header_t *infos;
+ /* Set skip_check TRUE to prevent the checks that set infos[].fs_err. */
+ svn_boolean_t skip_check;
svn_boolean_t break_lock;
+ apr_pool_t *result_pool;
};
-/* This implements the svn_fs_fs__with_write_lock() 'body' callback
+static svn_error_t *
+check_unlock(svn_error_t **fs_err,
+ const char *path,
+ const char *token,
+ struct unlock_baton *ub,
+ svn_fs_root_t *root,
+ apr_pool_t *pool)
+{
+ svn_lock_t *lock;
+
+ *fs_err = get_lock(&lock, ub->fs, path, TRUE, TRUE, pool);
+ if (!*fs_err && !ub->break_lock)
+ {
+ if (strcmp(token, lock->token) != 0)
+ *fs_err = SVN_FS__ERR_NO_SUCH_LOCK(ub->fs, path);
+ else if (strcmp(ub->fs->access_ctx->username, lock->owner) != 0)
+ *fs_err = SVN_FS__ERR_LOCK_OWNER_MISMATCH(ub->fs,
+ ub->fs->access_ctx->username,
+ lock->owner);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+struct unlock_info_t {
+ const char *path;
+ svn_error_t *fs_err;
+ svn_boolean_t done;
+};
+
+/* The body of svn_fs_fs__unlock(), which see.
+
+ BATON is a 'struct unlock_baton *' holding the effective arguments.
+ BATON->targets is an array of 'svn_sort__item_t' targets, sorted by
+ path, mapping canonical path to (const char *) token. Set
+ BATON->infos to an array of 'unlock_info_t' results. For the other
+ arguments, see svn_fs_unlock_many().
+
+ This implements the svn_fs_fs__with_write_lock() 'body' callback
type, and assumes that the write lock is held.
- BATON is a 'struct unlock_baton *'. */
+ */
static svn_error_t *
unlock_body(void *baton, apr_pool_t *pool)
{
struct unlock_baton *ub = baton;
- svn_lock_t *lock;
+ svn_fs_root_t *root;
+ svn_revnum_t youngest;
+ const char *rev_0_path;
+ int i;
+ apr_hash_t *indices_updates = apr_hash_make(pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool = svn_pool_create(pool);
- /* This could return SVN_ERR_FS_BAD_LOCK_TOKEN or SVN_ERR_FS_LOCK_EXPIRED. */
- SVN_ERR(get_lock(&lock, ub->fs, ub->path, TRUE, TRUE, pool));
+ SVN_ERR(ub->fs->vtable->youngest_rev(&youngest, ub->fs, pool));
+ SVN_ERR(ub->fs->vtable->revision_root(&root, ub->fs, youngest, pool));
- /* Unless breaking the lock, we do some checks. */
- if (! ub->break_lock)
+ for (i = 0; i < ub->targets->nelts; ++i)
{
- /* Sanity check: the incoming token should match lock->token. */
- if (strcmp(ub->token, lock->token) != 0)
- return SVN_FS__ERR_NO_SUCH_LOCK(ub->fs, lock->path);
-
- /* There better be a username attached to the fs. */
- if (! (ub->fs->access_ctx && ub->fs->access_ctx->username))
- return SVN_FS__ERR_NO_USER(ub->fs);
-
- /* And that username better be the same as the lock's owner. */
- if (strcmp(ub->fs->access_ctx->username, lock->owner) != 0)
- return SVN_FS__ERR_LOCK_OWNER_MISMATCH(
- ub->fs, ub->fs->access_ctx->username, lock->owner);
+ const svn_sort__item_t *item = &APR_ARRAY_IDX(ub->targets, i,
+ svn_sort__item_t);
+ const char *token = item->value;
+ struct unlock_info_t info;
+
+ svn_pool_clear(iterpool);
+
+ info.path = item->key;
+ info.fs_err = SVN_NO_ERROR;
+ info.done = FALSE;
+
+ if (!ub->skip_check)
+ SVN_ERR(check_unlock(&info.fs_err, info.path, token, ub, root,
+ iterpool));
+
+ /* If no error occurred while pre-checking, schedule the index updates for
+ this path. */
+ if (!info.fs_err)
+ schedule_index_update(indices_updates, info.path, iterpool);
+
+ APR_ARRAY_PUSH(ub->infos, struct unlock_info_t) = info;
}
- /* Remove lock and lock token files. */
- return delete_lock(ub->fs, lock, pool);
+ rev_0_path = svn_fs_fs__path_rev_absolute(ub->fs, 0, pool);
+
+ /* Unlike the lock_body(), we need to delete locks *before* we start to
+ update indices. */
+
+ for (i = 0; i < ub->infos->nelts; ++i)
+ {
+ struct unlock_info_t *info = &APR_ARRAY_IDX(ub->infos, i,
+ struct unlock_info_t);
+
+ svn_pool_clear(iterpool);
+
+ if (! info->fs_err)
+ {
+ SVN_ERR(delete_lock(ub->fs->path, info->path, iterpool));
+ info->done = TRUE;
+ }
+ }
+
+ for (hi = apr_hash_first(pool, indices_updates); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ apr_array_header_t *children = apr_hash_this_val(hi);
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(delete_from_digest(ub->fs->path, children, path, rev_0_path,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Unlock the lock described by LOCK->path and LOCK->token in FS.
+
+ This assumes that the write lock is held.
+ */
+static svn_error_t *
+unlock_single(svn_fs_t *fs,
+ svn_lock_t *lock,
+ apr_pool_t *pool)
+{
+ struct unlock_baton ub;
+ svn_sort__item_t item;
+ apr_array_header_t *targets = apr_array_make(pool, 1,
+ sizeof(svn_sort__item_t));
+ item.key = lock->path;
+ item.klen = strlen(item.key);
+ item.value = (char*)lock->token;
+ APR_ARRAY_PUSH(targets, svn_sort__item_t) = item;
+
+ ub.fs = fs;
+ ub.targets = targets;
+ ub.infos = apr_array_make(pool, targets->nelts,
+ sizeof(struct unlock_info_t));
+ ub.skip_check = TRUE;
+ ub.result_pool = pool;
+
+ /* No ub.infos[].fs_err error because skip_check is TRUE. */
+ SVN_ERR(unlock_body(&ub, pool));
+
+ return SVN_NO_ERROR;
}
/*** Public API implementations ***/
svn_error_t *
-svn_fs_fs__lock(svn_lock_t **lock_p,
- svn_fs_t *fs,
- const char *path,
- const char *token,
+svn_fs_fs__lock(svn_fs_t *fs,
+ apr_hash_t *targets,
const char *comment,
svn_boolean_t is_dav_comment,
apr_time_t expiration_date,
- svn_revnum_t current_rev,
svn_boolean_t steal_lock,
- apr_pool_t *pool)
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
struct lock_baton lb;
+ apr_array_header_t *sorted_targets;
+ apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
+ int i;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
- path = svn_fs__canonicalize_abspath(path, pool);
- lb.lock_p = lock_p;
+ /* We need to have a username attached to the fs. */
+ if (!fs->access_ctx || !fs->access_ctx->username)
+ return SVN_FS__ERR_NO_USER(fs);
+
+ /* The FS locking API allows both canonical and non-canonical
+ paths which means that the same canonical path could be
+ represented more than once in the TARGETS hash. We just keep
+ one, choosing one with a token if possible. */
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ const svn_fs_lock_target_t *target = apr_hash_this_val(hi);
+ const svn_fs_lock_target_t *other;
+
+ path = svn_fspath__canonicalize(path, result_pool);
+ other = svn_hash_gets(canonical_targets, path);
+
+ if (!other || (!other->token && target->token))
+ svn_hash_sets(canonical_targets, path, target);
+ }
+
+ sorted_targets = svn_sort__hash(canonical_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+
lb.fs = fs;
- lb.path = path;
- lb.token = token;
+ lb.targets = sorted_targets;
+ lb.infos = apr_array_make(result_pool, sorted_targets->nelts,
+ sizeof(struct lock_info_t));
lb.comment = comment;
lb.is_dav_comment = is_dav_comment;
lb.expiration_date = expiration_date;
- lb.current_rev = current_rev;
lb.steal_lock = steal_lock;
- lb.pool = pool;
+ lb.result_pool = result_pool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_fs__with_write_lock(fs, lock_body, &lb, iterpool);
+ for (i = 0; i < lb.infos->nelts; ++i)
+ {
+ struct lock_info_t *info = &APR_ARRAY_IDX(lb.infos, i,
+ struct lock_info_t);
+ svn_pool_clear(iterpool);
+ if (!cb_err && lock_callback)
+ {
+ if (!info->lock && !info->fs_err)
+ info->fs_err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED,
+ 0, _("Failed to lock '%s'"),
+ info->path);
+
+ cb_err = lock_callback(lock_baton, info->path, info->lock,
+ info->fs_err, iterpool);
+ }
+ svn_error_clear(info->fs_err);
+ }
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
- return svn_fs_fs__with_write_lock(fs, lock_body, &lb, pool);
+ return svn_error_trace(err);
}
@@ -959,29 +1192,84 @@ svn_fs_fs__generate_lock_token(const char **token,
generate a URI that matches the DAV RFC. We could change this to
some other URI scheme someday, if we wish. */
*token = apr_pstrcat(pool, "opaquelocktoken:",
- svn_uuid_generate(pool), (char *)NULL);
+ svn_uuid_generate(pool), SVN_VA_NULL);
return SVN_NO_ERROR;
}
-
svn_error_t *
svn_fs_fs__unlock(svn_fs_t *fs,
- const char *path,
- const char *token,
+ apr_hash_t *targets,
svn_boolean_t break_lock,
- apr_pool_t *pool)
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
struct unlock_baton ub;
+ apr_array_header_t *sorted_targets;
+ apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
+ int i;
SVN_ERR(svn_fs__check_fs(fs, TRUE));
- path = svn_fs__canonicalize_abspath(path, pool);
+
+ /* We need to have a username attached to the fs. */
+ if (!fs->access_ctx || !fs->access_ctx->username)
+ return SVN_FS__ERR_NO_USER(fs);
+
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
+ const char *other;
+
+ path = svn_fspath__canonicalize(path, result_pool);
+ other = svn_hash_gets(canonical_targets, path);
+
+ if (!other)
+ svn_hash_sets(canonical_targets, path, token);
+ }
+
+ sorted_targets = svn_sort__hash(canonical_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
ub.fs = fs;
- ub.path = path;
- ub.token = token;
+ ub.targets = sorted_targets;
+ ub.infos = apr_array_make(result_pool, sorted_targets->nelts,
+ sizeof(struct unlock_info_t));
+ ub.skip_check = FALSE;
ub.break_lock = break_lock;
+ ub.result_pool = result_pool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_fs__with_write_lock(fs, unlock_body, &ub, iterpool);
+ for (i = 0; i < ub.infos->nelts; ++i)
+ {
+ struct unlock_info_t *info = &APR_ARRAY_IDX(ub.infos, i,
+ struct unlock_info_t);
+ svn_pool_clear(iterpool);
+ if (!cb_err && lock_callback)
+ {
+ if (!info->done && !info->fs_err)
+ info->fs_err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED,
+ 0, _("Failed to unlock '%s'"),
+ info->path);
+ cb_err = lock_callback(lock_baton, info->path, NULL, info->fs_err,
+ iterpool);
+ }
+ svn_error_clear(info->fs_err);
+ }
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
- return svn_fs_fs__with_write_lock(fs, unlock_body, &ub, pool);
+ return svn_error_trace(err);
}
diff --git a/subversion/libsvn_fs_fs/lock.h b/subversion/libsvn_fs_fs/lock.h
index 1acc79e..beaaa0d 100644
--- a/subversion/libsvn_fs_fs/lock.h
+++ b/subversion/libsvn_fs_fs/lock.h
@@ -32,32 +32,39 @@ extern "C" {
/* These functions implement some of the calls in the FS loader
library's fs vtables. */
-svn_error_t *svn_fs_fs__lock(svn_lock_t **lock,
- svn_fs_t *fs,
- const char *path,
- const char *token,
+/* See svn_fs_lock(), svn_fs_lock_many(). */
+svn_error_t *svn_fs_fs__lock(svn_fs_t *fs,
+ apr_hash_t *targets,
const char *comment,
svn_boolean_t is_dav_comment,
apr_time_t expiration_date,
- svn_revnum_t current_rev,
svn_boolean_t steal_lock,
- apr_pool_t *pool);
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+/* See svn_fs_generate_lock_token(). */
svn_error_t *svn_fs_fs__generate_lock_token(const char **token,
svn_fs_t *fs,
apr_pool_t *pool);
+/* See svn_fs_unlock(), svn_fs_unlock_many(). */
svn_error_t *svn_fs_fs__unlock(svn_fs_t *fs,
- const char *path,
- const char *token,
+ apr_hash_t *targets,
svn_boolean_t break_lock,
- apr_pool_t *pool);
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+/* See svn_fs_get_lock(). */
svn_error_t *svn_fs_fs__get_lock(svn_lock_t **lock,
svn_fs_t *fs,
const char *path,
apr_pool_t *pool);
+/* See svn_fs_get_locks2(). */
svn_error_t *svn_fs_fs__get_locks(svn_fs_t *fs,
const char *path,
svn_depth_t depth,
diff --git a/subversion/libsvn_fs_fs/low_level.c b/subversion/libsvn_fs_fs/low_level.c
new file mode 100644
index 0000000..d21e312
--- /dev/null
+++ b/subversion/libsvn_fs_fs/low_level.c
@@ -0,0 +1,1208 @@
+/* low_level.c --- low level r/w access to fs_fs file structures
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_private_config.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_fspath.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "low_level.h"
+
+/* Headers used to describe node-revision in the revision file. */
+#define HEADER_ID "id"
+#define HEADER_TYPE "type"
+#define HEADER_COUNT "count"
+#define HEADER_PROPS "props"
+#define HEADER_TEXT "text"
+#define HEADER_CPATH "cpath"
+#define HEADER_PRED "pred"
+#define HEADER_COPYFROM "copyfrom"
+#define HEADER_COPYROOT "copyroot"
+#define HEADER_FRESHTXNRT "is-fresh-txn-root"
+#define HEADER_MINFO_HERE "minfo-here"
+#define HEADER_MINFO_CNT "minfo-cnt"
+
+/* Kinds that a change can be. */
+#define ACTION_MODIFY "modify"
+#define ACTION_ADD "add"
+#define ACTION_DELETE "delete"
+#define ACTION_REPLACE "replace"
+#define ACTION_RESET "reset"
+
+/* True and False flags. */
+#define FLAG_TRUE "true"
+#define FLAG_FALSE "false"
+
+/* Kinds of representation. */
+#define REP_PLAIN "PLAIN"
+#define REP_DELTA "DELTA"
+
+/* An arbitrary maximum path length, so clients can't run us out of memory
+ * by giving us arbitrarily large paths. */
+#define FSFS_MAX_PATH_LEN 4096
+
+/* The 256 is an arbitrary size large enough to hold the node id and the
+ * various flags. */
+#define MAX_CHANGE_LINE_LEN FSFS_MAX_PATH_LEN + 256
+
+/* Convert the C string in *TEXT to a revision number and return it in *REV.
+ * Overflows, negative values other than -1 and terminating characters other
+ * than 0x20 or 0x0 will cause an error. Set *TEXT to the first char after
+ * the initial separator or to EOS.
+ */
+static svn_error_t *
+parse_revnum(svn_revnum_t *rev,
+ const char **text)
+{
+ const char *string = *text;
+ if ((string[0] == '-') && (string[1] == '1'))
+ {
+ *rev = SVN_INVALID_REVNUM;
+ string += 2;
+ }
+ else
+ {
+ SVN_ERR(svn_revnum_parse(rev, string, &string));
+ }
+
+ if (*string == ' ')
+ ++string;
+ else if (*string != '\0')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid character in revision number"));
+
+ *text = string;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__parse_revision_trailer(apr_off_t *root_offset,
+ apr_off_t *changes_offset,
+ svn_stringbuf_t *trailer,
+ svn_revnum_t rev)
+{
+ int i, num_bytes;
+ const char *str;
+
+ /* This cast should be safe since the maximum amount read, 64, will
+ never be bigger than the size of an int. */
+ num_bytes = (int) trailer->len;
+
+ /* The last byte should be a newline. */
+ if (trailer->len == 0 || trailer->data[trailer->len - 1] != '\n')
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision file (r%ld) lacks trailing newline"),
+ rev);
+ }
+
+ /* Look for the next previous newline. */
+ for (i = num_bytes - 2; i >= 0; i--)
+ {
+ if (trailer->data[i] == '\n')
+ break;
+ }
+
+ if (i < 0)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Final line in revision file (r%ld) longer "
+ "than 64 characters"),
+ rev);
+ }
+
+ i++;
+ str = &trailer->data[i];
+
+ /* find the next space */
+ for ( ; i < (num_bytes - 2) ; i++)
+ if (trailer->data[i] == ' ')
+ break;
+
+ if (i == (num_bytes - 2))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Final line in revision file r%ld missing space"),
+ rev);
+
+ if (root_offset)
+ {
+ apr_int64_t val;
+
+ trailer->data[i] = '\0';
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *root_offset = (apr_off_t)val;
+ }
+
+ i++;
+ str = &trailer->data[i];
+
+ /* find the next newline */
+ for ( ; i < num_bytes; i++)
+ if (trailer->data[i] == '\n')
+ break;
+
+ if (changes_offset)
+ {
+ apr_int64_t val;
+
+ trailer->data[i] = '\0';
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *changes_offset = (apr_off_t)val;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_stringbuf_t *
+svn_fs_fs__unparse_revision_trailer(apr_off_t root_offset,
+ apr_off_t changes_offset,
+ apr_pool_t *result_pool)
+{
+ return svn_stringbuf_createf(result_pool,
+ "%" APR_OFF_T_FMT " %" APR_OFF_T_FMT "\n",
+ root_offset,
+ changes_offset);
+}
+
+svn_error_t *
+svn_fs_fs__parse_footer(apr_off_t *l2p_offset,
+ svn_checksum_t **l2p_checksum,
+ apr_off_t *p2l_offset,
+ svn_checksum_t **p2l_checksum,
+ svn_stringbuf_t *footer,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ apr_int64_t val;
+ char *last_str = footer->data;
+
+ /* Get the L2P offset. */
+ const char *str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *l2p_offset = (apr_off_t)val;
+
+ /* Get the L2P checksum. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_checksum_parse_hex(l2p_checksum, svn_checksum_md5, str,
+ result_pool));
+
+ /* Get the P2L offset. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *p2l_offset = (apr_off_t)val;
+
+ /* Get the P2L checksum. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_checksum_parse_hex(p2l_checksum, svn_checksum_md5, str,
+ result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_stringbuf_t *
+svn_fs_fs__unparse_footer(apr_off_t l2p_offset,
+ svn_checksum_t *l2p_checksum,
+ apr_off_t p2l_offset,
+ svn_checksum_t *p2l_checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_stringbuf_createf(result_pool,
+ "%" APR_OFF_T_FMT " %s %" APR_OFF_T_FMT " %s",
+ l2p_offset,
+ svn_checksum_to_cstring(l2p_checksum,
+ scratch_pool),
+ p2l_offset,
+ svn_checksum_to_cstring(p2l_checksum,
+ scratch_pool));
+}
+
+/* Read the next entry in the changes record from file FILE and store
+ the resulting change in *CHANGE_P. If there is no next record,
+ store NULL there. Perform all allocations from POOL. */
+static svn_error_t *
+read_change(change_t **change_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *line;
+ svn_boolean_t eof = TRUE;
+ change_t *change;
+ char *str, *last_str, *kind_str;
+ svn_fs_path_change2_t *info;
+
+ /* Default return value. */
+ *change_p = NULL;
+
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
+
+ /* Check for a blank line. */
+ if (eof || (line->len == 0))
+ return SVN_NO_ERROR;
+
+ change = apr_pcalloc(result_pool, sizeof(*change));
+ info = &change->info;
+ last_str = line->data;
+
+ /* Get the node-id of the change. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ SVN_ERR(svn_fs_fs__id_parse(&info->node_rev_id, str, result_pool));
+ if (info->node_rev_id == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ /* Get the change type. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ /* Don't bother to check the format number before looking for
+ * node-kinds: just read them if you find them. */
+ info->node_kind = svn_node_unknown;
+ kind_str = strchr(str, '-');
+ if (kind_str)
+ {
+ /* Cap off the end of "str" (the action). */
+ *kind_str = '\0';
+ kind_str++;
+ if (strcmp(kind_str, SVN_FS_FS__KIND_FILE) == 0)
+ info->node_kind = svn_node_file;
+ else if (strcmp(kind_str, SVN_FS_FS__KIND_DIR) == 0)
+ info->node_kind = svn_node_dir;
+ else
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+ }
+
+ if (strcmp(str, ACTION_MODIFY) == 0)
+ {
+ info->change_kind = svn_fs_path_change_modify;
+ }
+ else if (strcmp(str, ACTION_ADD) == 0)
+ {
+ info->change_kind = svn_fs_path_change_add;
+ }
+ else if (strcmp(str, ACTION_DELETE) == 0)
+ {
+ info->change_kind = svn_fs_path_change_delete;
+ }
+ else if (strcmp(str, ACTION_REPLACE) == 0)
+ {
+ info->change_kind = svn_fs_path_change_replace;
+ }
+ else if (strcmp(str, ACTION_RESET) == 0)
+ {
+ info->change_kind = svn_fs_path_change_reset;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change kind in rev file"));
+ }
+
+ /* Get the text-mod flag. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ info->text_mod = TRUE;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ info->text_mod = FALSE;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid text-mod flag in rev-file"));
+ }
+
+ /* Get the prop-mod flag. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ info->prop_mod = TRUE;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ info->prop_mod = FALSE;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid prop-mod flag in rev-file"));
+ }
+
+ /* Get the mergeinfo-mod flag if given. Otherwise, the next thing
+ is the path starting with a slash. Also, we must initialize the
+ flag explicitly because 0 is not valid for a svn_tristate_t. */
+ info->mergeinfo_mod = svn_tristate_unknown;
+ if (*last_str != '/')
+ {
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ info->mergeinfo_mod = svn_tristate_true;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ info->mergeinfo_mod = svn_tristate_false;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid mergeinfo-mod flag in rev-file"));
+ }
+ }
+
+ /* Get the changed path. */
+ if (!svn_fspath__is_canonical(last_str))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid path in changes line"));
+
+ change->path.len = strlen(last_str);
+ change->path.data = apr_pstrdup(result_pool, last_str);
+
+ /* Read the next line, the copyfrom line. */
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
+ info->copyfrom_known = TRUE;
+ if (eof || line->len == 0)
+ {
+ info->copyfrom_rev = SVN_INVALID_REVNUM;
+ info->copyfrom_path = NULL;
+ }
+ else
+ {
+ last_str = line->data;
+ SVN_ERR(parse_revnum(&info->copyfrom_rev, (const char **)&last_str));
+
+ if (!svn_fspath__is_canonical(last_str))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid copy-from path in changes line"));
+
+ info->copyfrom_path = apr_pstrdup(result_pool, last_str);
+ }
+
+ *change_p = change;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_changes(apr_array_header_t **changes,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ change_t *change;
+ apr_pool_t *iterpool;
+
+ /* Pre-allocate enough room for most change lists.
+ (will be auto-expanded as necessary).
+
+ Chose the default to just below 2^N such that the doubling reallocs
+ will request roughly 2^M bytes from the OS without exceeding the
+ respective two-power by just a few bytes (leaves room array and APR
+ node overhead for large enough M).
+ */
+ *changes = apr_array_make(result_pool, 63, sizeof(change_t *));
+
+ SVN_ERR(read_change(&change, stream, result_pool, scratch_pool));
+ iterpool = svn_pool_create(scratch_pool);
+ while (change)
+ {
+ APR_ARRAY_PUSH(*changes, change_t*) = change;
+ SVN_ERR(read_change(&change, stream, result_pool, iterpool));
+ svn_pool_clear(iterpool);
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_changes_incrementally(svn_stream_t *stream,
+ svn_fs_fs__change_receiver_t
+ change_receiver,
+ void *change_receiver_baton,
+ apr_pool_t *scratch_pool)
+{
+ change_t *change;
+ apr_pool_t *iterpool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ do
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(read_change(&change, stream, iterpool, iterpool));
+ if (change)
+ SVN_ERR(change_receiver(change_receiver_baton, change, iterpool));
+ }
+ while (change);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Write a single change entry, path PATH, change CHANGE, to STREAM.
+
+ Only include the node kind field if INCLUDE_NODE_KIND is true. Only
+ include the mergeinfo-mod field if INCLUDE_MERGEINFO_MODS is true.
+ All temporary allocations are in SCRATCH_POOL. */
+static svn_error_t *
+write_change_entry(svn_stream_t *stream,
+ const char *path,
+ svn_fs_path_change2_t *change,
+ svn_boolean_t include_node_kind,
+ svn_boolean_t include_mergeinfo_mods,
+ apr_pool_t *scratch_pool)
+{
+ const char *idstr;
+ const char *change_string = NULL;
+ const char *kind_string = "";
+ const char *mergeinfo_string = "";
+ svn_stringbuf_t *buf;
+ apr_size_t len;
+
+ switch (change->change_kind)
+ {
+ case svn_fs_path_change_modify:
+ change_string = ACTION_MODIFY;
+ break;
+ case svn_fs_path_change_add:
+ change_string = ACTION_ADD;
+ break;
+ case svn_fs_path_change_delete:
+ change_string = ACTION_DELETE;
+ break;
+ case svn_fs_path_change_replace:
+ change_string = ACTION_REPLACE;
+ break;
+ case svn_fs_path_change_reset:
+ change_string = ACTION_RESET;
+ break;
+ default:
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change type %d"),
+ change->change_kind);
+ }
+
+ if (change->node_rev_id)
+ idstr = svn_fs_fs__id_unparse(change->node_rev_id, scratch_pool)->data;
+ else
+ idstr = ACTION_RESET;
+
+ if (include_node_kind)
+ {
+ SVN_ERR_ASSERT(change->node_kind == svn_node_dir
+ || change->node_kind == svn_node_file);
+ kind_string = apr_psprintf(scratch_pool, "-%s",
+ change->node_kind == svn_node_dir
+ ? SVN_FS_FS__KIND_DIR
+ : SVN_FS_FS__KIND_FILE);
+ }
+
+ if (include_mergeinfo_mods && change->mergeinfo_mod != svn_tristate_unknown)
+ mergeinfo_string = apr_psprintf(scratch_pool, " %s",
+ change->mergeinfo_mod == svn_tristate_true
+ ? FLAG_TRUE
+ : FLAG_FALSE);
+
+ buf = svn_stringbuf_createf(scratch_pool, "%s %s%s %s %s%s %s\n",
+ idstr, change_string, kind_string,
+ change->text_mod ? FLAG_TRUE : FLAG_FALSE,
+ change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
+ mergeinfo_string,
+ path);
+
+ if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
+ {
+ svn_stringbuf_appendcstr(buf, apr_psprintf(scratch_pool, "%ld %s",
+ change->copyfrom_rev,
+ change->copyfrom_path));
+ }
+
+ svn_stringbuf_appendbyte(buf, '\n');
+
+ /* Write all change info in one write call. */
+ len = buf->len;
+ return svn_error_trace(svn_stream_write(stream, buf->data, &len));
+}
+
+svn_error_t *
+svn_fs_fs__write_changes(svn_stream_t *stream,
+ svn_fs_t *fs,
+ apr_hash_t *changes,
+ svn_boolean_t terminate_list,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t include_node_kinds =
+ ffd->format >= SVN_FS_FS__MIN_KIND_IN_CHANGED_FORMAT;
+ svn_boolean_t include_mergeinfo_mods =
+ ffd->format >= SVN_FS_FS__MIN_MERGEINFO_IN_CHANGED_FORMAT;
+ apr_array_header_t *sorted_changed_paths;
+ int i;
+
+ /* For the sake of the repository administrator sort the changes so
+ that the final file is deterministic and repeatable, however the
+ rest of the FSFS code doesn't require any particular order here.
+
+ Also, this sorting is only effective in writing all entries with
+ a single call as write_final_changed_path_info() does. For the
+ list being written incrementally during transaction, we actually
+ *must not* change the order of entries from different calls.
+ */
+ sorted_changed_paths = svn_sort__hash(changes,
+ svn_sort_compare_items_lexically,
+ scratch_pool);
+
+ /* Write all items to disk in the new order. */
+ for (i = 0; i < sorted_changed_paths->nelts; ++i)
+ {
+ svn_fs_path_change2_t *change;
+ const char *path;
+
+ svn_pool_clear(iterpool);
+
+ change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
+ path = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).key;
+
+ /* Write out the new entry into the final rev-file. */
+ SVN_ERR(write_change_entry(stream, path, change, include_node_kinds,
+ include_mergeinfo_mods, iterpool));
+ }
+
+ if (terminate_list)
+ svn_stream_puts(stream, "\n");
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Given a revision file FILE that has been pre-positioned at the
+ beginning of a Node-Rev header block, read in that header block and
+ store it in the apr_hash_t HEADERS. All allocations will be from
+ RESULT_POOL. */
+static svn_error_t *
+read_header_block(apr_hash_t **headers,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool)
+{
+ *headers = svn_hash__make(result_pool);
+
+ while (1)
+ {
+ svn_stringbuf_t *header_str;
+ const char *name, *value;
+ apr_size_t i = 0;
+ apr_size_t name_len;
+ svn_boolean_t eof;
+
+ SVN_ERR(svn_stream_readline(stream, &header_str, "\n", &eof,
+ result_pool));
+
+ if (eof || header_str->len == 0)
+ break; /* end of header block */
+
+ while (header_str->data[i] != ':')
+ {
+ if (header_str->data[i] == '\0')
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Found malformed header '%s' in "
+ "revision file"),
+ header_str->data);
+ i++;
+ }
+
+ /* Create a 'name' string and point to it. */
+ header_str->data[i] = '\0';
+ name = header_str->data;
+ name_len = i;
+
+ /* Check if we have enough data to parse. */
+ if (i + 2 > header_str->len)
+ {
+ /* Restore the original line for the error. */
+ header_str->data[i] = ':';
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Found malformed header '%s' in "
+ "revision file"),
+ header_str->data);
+ }
+
+ /* Skip over the NULL byte and the space following it. */
+ i += 2;
+
+ value = header_str->data + i;
+
+ /* header_str is safely in our pool, so we can use bits of it as
+ key and value. */
+ apr_hash_set(*headers, name, name_len, value);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__parse_representation(representation_t **rep_p,
+ svn_stringbuf_t *text,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ representation_t *rep;
+ char *str;
+ apr_int64_t val;
+ char *string = text->data;
+ svn_checksum_t *checksum;
+ const char *end;
+
+ rep = apr_pcalloc(result_pool, sizeof(*rep));
+ *rep_p = rep;
+
+ SVN_ERR(parse_revnum(&rep->revision, (const char **)&string));
+
+ /* initialize transaction info (never stored) */
+ svn_fs_fs__id_txn_reset(&rep->txn_id);
+
+ /* while in transactions, it is legal to simply write "-1" */
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ {
+ if (rep->revision == SVN_INVALID_REVNUM)
+ return SVN_NO_ERROR;
+
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+ }
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->item_index = (apr_uint64_t)val;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->size = (svn_filesize_t)val;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->expanded_size = (svn_filesize_t)val;
+
+ /* Read in the MD5 hash. */
+ str = svn_cstring_tokenize(" ", &string);
+ if ((str == NULL) || (strlen(str) != (APR_MD5_DIGESTSIZE * 2)))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_md5, str,
+ scratch_pool));
+
+ /* If STR is a all-zero checksum, CHECKSUM will be NULL and REP already
+ contains the correct value. */
+ if (checksum)
+ memcpy(rep->md5_digest, checksum->digest, sizeof(rep->md5_digest));
+
+ /* The remaining fields are only used for formats >= 4, so check that. */
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return SVN_NO_ERROR;
+
+ /* Read the SHA1 hash. */
+ if (strlen(str) != (APR_SHA1_DIGESTSIZE * 2))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1, str,
+ scratch_pool));
+
+ /* We do have a valid SHA1 but it might be all 0.
+ We cannot be sure where that came from (Alas! legacy), so let's not
+ claim we know the SHA1 in that case. */
+ rep->has_sha1 = checksum != NULL;
+
+ /* If STR is a all-zero checksum, CHECKSUM will be NULL and REP already
+ contains the correct value. */
+ if (checksum)
+ memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
+
+ /* Read the uniquifier. */
+ str = svn_cstring_tokenize("/", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_fs_fs__id_txn_parse(&rep->uniquifier.noderev_txn_id, str));
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL || *str != '_')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ ++str;
+ rep->uniquifier.number = svn__base36toui64(&end, str);
+
+ if (*end)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ return SVN_NO_ERROR;
+}
+
+/* Wrap svn_fs_fs__parse_representation(), extracting its TXN_ID from our
+ NODEREV_ID, and adding an error message. */
+static svn_error_t *
+read_rep_offsets(representation_t **rep_p,
+ char *string,
+ const svn_fs_id_t *noderev_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err
+ = svn_fs_fs__parse_representation(rep_p,
+ svn_stringbuf_create_wrap(string,
+ scratch_pool),
+ result_pool,
+ scratch_pool);
+ if (err)
+ {
+ const svn_string_t *id_unparsed;
+ const char *where;
+
+ id_unparsed = svn_fs_fs__id_unparse(noderev_id, scratch_pool);
+ where = apr_psprintf(scratch_pool,
+ _("While reading representation offsets "
+ "for node-revision '%s':"),
+ noderev_id ? id_unparsed->data : "(null)");
+
+ return svn_error_quick_wrap(err, where);
+ }
+
+ if ((*rep_p)->revision == SVN_INVALID_REVNUM)
+ if (noderev_id)
+ (*rep_p)->txn_id = *svn_fs_fs__id_txn_id(noderev_id);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_noderev(node_revision_t **noderev_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *headers;
+ node_revision_t *noderev;
+ char *value;
+ const char *noderev_id;
+
+ SVN_ERR(read_header_block(&headers, stream, scratch_pool));
+
+ noderev = apr_pcalloc(result_pool, sizeof(*noderev));
+
+ /* Read the node-rev id. */
+ value = svn_hash_gets(headers, HEADER_ID);
+ if (value == NULL)
+ /* ### More information: filename/offset coordinates */
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing id field in node-rev"));
+
+ SVN_ERR(svn_stream_close(stream));
+
+ SVN_ERR(svn_fs_fs__id_parse(&noderev->id, value, result_pool));
+ noderev_id = value; /* for error messages later */
+
+ /* Read the type. */
+ value = svn_hash_gets(headers, HEADER_TYPE);
+
+ if ((value == NULL) ||
+ ( strcmp(value, SVN_FS_FS__KIND_FILE)
+ && strcmp(value, SVN_FS_FS__KIND_DIR)))
+ /* ### s/kind/type/ */
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing kind field in node-rev '%s'"),
+ noderev_id);
+
+ noderev->kind = (strcmp(value, SVN_FS_FS__KIND_FILE) == 0)
+ ? svn_node_file
+ : svn_node_dir;
+
+ /* Read the 'count' field. */
+ value = svn_hash_gets(headers, HEADER_COUNT);
+ if (value)
+ SVN_ERR(svn_cstring_atoi(&noderev->predecessor_count, value));
+ else
+ noderev->predecessor_count = 0;
+
+ /* Get the properties location. */
+ value = svn_hash_gets(headers, HEADER_PROPS);
+ if (value)
+ {
+ SVN_ERR(read_rep_offsets(&noderev->prop_rep, value,
+ noderev->id, result_pool, scratch_pool));
+ }
+
+ /* Get the data location. */
+ value = svn_hash_gets(headers, HEADER_TEXT);
+ if (value)
+ {
+ SVN_ERR(read_rep_offsets(&noderev->data_rep, value,
+ noderev->id, result_pool, scratch_pool));
+ }
+
+ /* Get the created path. */
+ value = svn_hash_gets(headers, HEADER_CPATH);
+ if (value == NULL)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing cpath field in node-rev '%s'"),
+ noderev_id);
+ }
+ else
+ {
+ if (!svn_fspath__is_canonical(value))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Non-canonical cpath field in node-rev '%s'"),
+ noderev_id);
+
+ noderev->created_path = apr_pstrdup(result_pool, value);
+ }
+
+ /* Get the predecessor ID. */
+ value = svn_hash_gets(headers, HEADER_PRED);
+ if (value)
+ SVN_ERR(svn_fs_fs__id_parse(&noderev->predecessor_id, value,
+ result_pool));
+
+ /* Get the copyroot. */
+ value = svn_hash_gets(headers, HEADER_COPYROOT);
+ if (value == NULL)
+ {
+ noderev->copyroot_path = apr_pstrdup(result_pool, noderev->created_path);
+ noderev->copyroot_rev = svn_fs_fs__id_rev(noderev->id);
+ }
+ else
+ {
+ SVN_ERR(parse_revnum(&noderev->copyroot_rev, (const char **)&value));
+
+ if (!svn_fspath__is_canonical(value))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed copyroot line in node-rev '%s'"),
+ noderev_id);
+ noderev->copyroot_path = apr_pstrdup(result_pool, value);
+ }
+
+ /* Get the copyfrom. */
+ value = svn_hash_gets(headers, HEADER_COPYFROM);
+ if (value == NULL)
+ {
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+ }
+ else
+ {
+ SVN_ERR(parse_revnum(&noderev->copyfrom_rev, (const char **)&value));
+
+ if (*value == 0)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed copyfrom line in node-rev '%s'"),
+ noderev_id);
+ noderev->copyfrom_path = apr_pstrdup(result_pool, value);
+ }
+
+ /* Get whether this is a fresh txn root. */
+ value = svn_hash_gets(headers, HEADER_FRESHTXNRT);
+ noderev->is_fresh_txn_root = (value != NULL);
+
+ /* Get the mergeinfo count. */
+ value = svn_hash_gets(headers, HEADER_MINFO_CNT);
+ if (value)
+ SVN_ERR(svn_cstring_atoi64(&noderev->mergeinfo_count, value));
+ else
+ noderev->mergeinfo_count = 0;
+
+ /* Get whether *this* node has mergeinfo. */
+ value = svn_hash_gets(headers, HEADER_MINFO_HERE);
+ noderev->has_mergeinfo = (value != NULL);
+
+ *noderev_p = noderev;
+
+ return SVN_NO_ERROR;
+}
+
+/* Return a textual representation of the DIGEST of given KIND.
+ * If IS_NULL is TRUE, no digest is available.
+ * Allocate the result in RESULT_POOL.
+ */
+static const char *
+format_digest(const unsigned char *digest,
+ svn_checksum_kind_t kind,
+ svn_boolean_t is_null,
+ apr_pool_t *result_pool)
+{
+ svn_checksum_t checksum;
+ checksum.digest = digest;
+ checksum.kind = kind;
+
+ if (is_null)
+ return "(null)";
+
+ return svn_checksum_to_cstring_display(&checksum, result_pool);
+}
+
+svn_stringbuf_t *
+svn_fs_fs__unparse_representation(representation_t *rep,
+ int format,
+ svn_boolean_t mutable_rep_truncated,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ if (svn_fs_fs__id_txn_used(&rep->txn_id) && mutable_rep_truncated)
+ return svn_stringbuf_ncreate("-1", 2, result_pool);
+
+ if (format < SVN_FS_FS__MIN_REP_SHARING_FORMAT || !rep->has_sha1)
+ return svn_stringbuf_createf
+ (result_pool, "%ld %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
+ " %" SVN_FILESIZE_T_FMT " %s",
+ rep->revision, rep->item_index, rep->size,
+ rep->expanded_size,
+ format_digest(rep->md5_digest, svn_checksum_md5, FALSE,
+ scratch_pool));
+
+ svn__ui64tobase36(buffer, rep->uniquifier.number);
+ return svn_stringbuf_createf
+ (result_pool, "%ld %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
+ " %" SVN_FILESIZE_T_FMT " %s %s %s/_%s",
+ rep->revision, rep->item_index, rep->size,
+ rep->expanded_size,
+ format_digest(rep->md5_digest, svn_checksum_md5,
+ FALSE, scratch_pool),
+ format_digest(rep->sha1_digest, svn_checksum_sha1,
+ !rep->has_sha1, scratch_pool),
+ svn_fs_fs__id_txn_unparse(&rep->uniquifier.noderev_txn_id,
+ scratch_pool),
+ buffer);
+}
+
+
+svn_error_t *
+svn_fs_fs__write_noderev(svn_stream_t *outfile,
+ node_revision_t *noderev,
+ int format,
+ svn_boolean_t include_mergeinfo,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_ID ": %s\n",
+ svn_fs_fs__id_unparse(noderev->id,
+ scratch_pool)->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TYPE ": %s\n",
+ (noderev->kind == svn_node_file) ?
+ SVN_FS_FS__KIND_FILE : SVN_FS_FS__KIND_DIR));
+
+ if (noderev->predecessor_id)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n",
+ svn_fs_fs__id_unparse(noderev->predecessor_id,
+ scratch_pool)->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n",
+ noderev->predecessor_count));
+
+ if (noderev->data_rep)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TEXT ": %s\n",
+ svn_fs_fs__unparse_representation
+ (noderev->data_rep,
+ format,
+ noderev->kind == svn_node_dir,
+ scratch_pool, scratch_pool)->data));
+
+ if (noderev->prop_rep)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PROPS ": %s\n",
+ svn_fs_fs__unparse_representation
+ (noderev->prop_rep, format,
+ TRUE, scratch_pool, scratch_pool)->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_CPATH ": %s\n",
+ noderev->created_path));
+
+ if (noderev->copyfrom_path)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYFROM ": %ld"
+ " %s\n",
+ noderev->copyfrom_rev,
+ noderev->copyfrom_path));
+
+ if ((noderev->copyroot_rev != svn_fs_fs__id_rev(noderev->id)) ||
+ (strcmp(noderev->copyroot_path, noderev->created_path) != 0))
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYROOT ": %ld"
+ " %s\n",
+ noderev->copyroot_rev,
+ noderev->copyroot_path));
+
+ if (noderev->is_fresh_txn_root)
+ SVN_ERR(svn_stream_puts(outfile, HEADER_FRESHTXNRT ": y\n"));
+
+ if (include_mergeinfo)
+ {
+ if (noderev->mergeinfo_count > 0)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_MINFO_CNT
+ ": %" APR_INT64_T_FMT "\n",
+ noderev->mergeinfo_count));
+
+ if (noderev->has_mergeinfo)
+ SVN_ERR(svn_stream_puts(outfile, HEADER_MINFO_HERE ": y\n"));
+ }
+
+ return svn_stream_puts(outfile, "\n");
+}
+
+svn_error_t *
+svn_fs_fs__read_rep_header(svn_fs_fs__rep_header_t **header,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *buffer;
+ char *str, *last_str;
+ apr_int64_t val;
+ svn_boolean_t eol = FALSE;
+
+ SVN_ERR(svn_stream_readline(stream, &buffer, "\n", &eol, scratch_pool));
+
+ *header = apr_pcalloc(result_pool, sizeof(**header));
+ (*header)->header_size = buffer->len + 1;
+ if (strcmp(buffer->data, REP_PLAIN) == 0)
+ {
+ (*header)->type = svn_fs_fs__rep_plain;
+ return SVN_NO_ERROR;
+ }
+
+ if (strcmp(buffer->data, REP_DELTA) == 0)
+ {
+ /* This is a delta against the empty stream. */
+ (*header)->type = svn_fs_fs__rep_self_delta;
+ return SVN_NO_ERROR;
+ }
+
+ (*header)->type = svn_fs_fs__rep_delta;
+
+ /* We have hopefully a DELTA vs. a non-empty base revision. */
+ last_str = buffer->data;
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str || (strcmp(str, REP_DELTA) != 0))
+ goto error;
+
+ SVN_ERR(parse_revnum(&(*header)->base_revision, (const char **)&last_str));
+
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str)
+ goto error;
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ (*header)->base_item_index = (apr_off_t)val;
+
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str)
+ goto error;
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ (*header)->base_length = (svn_filesize_t)val;
+
+ return SVN_NO_ERROR;
+
+ error:
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed representation header"));
+}
+
+svn_error_t *
+svn_fs_fs__write_rep_header(svn_fs_fs__rep_header_t *header,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ const char *text;
+
+ switch (header->type)
+ {
+ case svn_fs_fs__rep_plain:
+ text = REP_PLAIN "\n";
+ break;
+
+ case svn_fs_fs__rep_self_delta:
+ text = REP_DELTA "\n";
+ break;
+
+ default:
+ text = apr_psprintf(scratch_pool, REP_DELTA " %ld %" APR_OFF_T_FMT
+ " %" SVN_FILESIZE_T_FMT "\n",
+ header->base_revision, header->base_item_index,
+ header->base_length);
+ }
+
+ return svn_error_trace(svn_stream_puts(stream, text));
+}
diff --git a/subversion/libsvn_fs_fs/low_level.h b/subversion/libsvn_fs_fs/low_level.h
new file mode 100644
index 0000000..35b9d0d
--- /dev/null
+++ b/subversion/libsvn_fs_fs/low_level.h
@@ -0,0 +1,230 @@
+/* low_level.c --- low level r/w access to fs_fs file structures
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_fs.h"
+
+#include "fs_fs.h"
+#include "id.h"
+
+/* Kinds that a node-rev can be. */
+#define SVN_FS_FS__KIND_FILE "file"
+#define SVN_FS_FS__KIND_DIR "dir"
+
+/* The functions are grouped as follows:
+ *
+ * - revision trailer (up to format 6)
+ * - revision footer (since format 7)
+ * - changed path list
+ * - node revision
+ * - representation (as in "text:" and "props:" lines)
+ * - representation header ("PLAIN" and "DELTA" lines)
+ */
+
+/* Given the last "few" bytes (should be at least 40) of revision REV in
+ * TRAILER, parse the last line and return the offset of the root noderev
+ * in *ROOT_OFFSET and the offset of the changed paths list in
+ * *CHANGES_OFFSET. Offsets are relative to the revision's start offset.
+ * ROOT_OFFSET and / or CHANGES_OFFSET may be NULL.
+ *
+ * Note that REV is only used to construct nicer error objects.
+ */
+svn_error_t *
+svn_fs_fs__parse_revision_trailer(apr_off_t *root_offset,
+ apr_off_t *changes_offset,
+ svn_stringbuf_t *trailer,
+ svn_revnum_t rev);
+
+/* Given the offset of the root noderev in ROOT_OFFSET and the offset of
+ * the changed paths list in CHANGES_OFFSET, return the corresponding
+ * revision's trailer. Allocate it in RESULT_POOL.
+ */
+svn_stringbuf_t *
+svn_fs_fs__unparse_revision_trailer(apr_off_t root_offset,
+ apr_off_t changes_offset,
+ apr_pool_t *result_pool);
+
+/* Given the format 7+ revision / pack FOOTER, parse it destructively
+ * and return the start offsets of the index data in *L2P_OFFSET and
+ * *P2L_OFFSET, respectively. Also, return the expected checksums in
+ * in *L2P_CHECKSUM and *P2L_CHECKSUM.
+ *
+ * Note that REV is only used to construct nicer error objects that
+ * mention this revision. Allocate the checksums in RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_fs__parse_footer(apr_off_t *l2p_offset,
+ svn_checksum_t **l2p_checksum,
+ apr_off_t *p2l_offset,
+ svn_checksum_t **p2l_checksum,
+ svn_stringbuf_t *footer,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Given the offset of the L2P index data in L2P_OFFSET, the content
+ * checksum in L2P_CHECKSUM and the offset plus checksum of the P2L
+ * index data in P2L_OFFSET and P2L_CHECKSUM.
+ *
+ * Return the corresponding format 7+ revision / pack file footer.
+ * Allocate it in RESULT_POOL and use SCRATCH_POOL for temporary.
+ */
+svn_stringbuf_t *
+svn_fs_fs__unparse_footer(apr_off_t l2p_offset,
+ svn_checksum_t *l2p_checksum,
+ apr_off_t p2l_offset,
+ svn_checksum_t *p2l_checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Read all the changes from STREAM and store them in *CHANGES,
+ allocated in RESULT_POOL. Do temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__read_changes(apr_array_header_t **changes,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Callback function used by svn_fs_fs__read_changes_incrementally(),
+ * asking the receiver to process to process CHANGE using BATON. CHANGE
+ * and SCRATCH_POOL will not be valid beyond the current callback invocation.
+ */
+typedef svn_error_t *(*svn_fs_fs__change_receiver_t)(
+ void *baton,
+ change_t *change,
+ apr_pool_t *scratch_pool);
+
+/* Read all the changes from STREAM and invoke CHANGE_RECEIVER on each change.
+ Do all allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__read_changes_incrementally(svn_stream_t *stream,
+ svn_fs_fs__change_receiver_t
+ change_receiver,
+ void *change_receiver_baton,
+ apr_pool_t *scratch_pool);
+
+/* Write the changed path info from CHANGES in filesystem FS to the
+ output stream STREAM. You may call this function multiple time on
+ the same stream. If you are writing to a (proto-)revision file,
+ the last call must set TERMINATE_LIST to write an extra empty line
+ that marks the end of the changed paths list.
+ Perform temporary allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_fs__write_changes(svn_stream_t *stream,
+ svn_fs_t *fs,
+ apr_hash_t *changes,
+ svn_boolean_t terminate_list,
+ apr_pool_t *scratch_pool);
+
+/* Read a node-revision from STREAM. Set *NODEREV to the new structure,
+ allocated in RESULT_POOL. */
+svn_error_t *
+svn_fs_fs__read_noderev(node_revision_t **noderev,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Write the node-revision NODEREV into the stream OUTFILE, compatible with
+ filesystem format FORMAT. Only write mergeinfo-related metadata if
+ INCLUDE_MERGEINFO is true. Temporary allocations are from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__write_noderev(svn_stream_t *outfile,
+ node_revision_t *noderev,
+ int format,
+ svn_boolean_t include_mergeinfo,
+ apr_pool_t *scratch_pool);
+
+/* Parse the description of a representation from TEXT and store it
+ into *REP_P. TEXT will be invalidated by this call. Allocate *REP_P in
+ RESULT_POOL and use SCRATCH_POOL for temporaries. */
+svn_error_t *
+svn_fs_fs__parse_representation(representation_t **rep_p,
+ svn_stringbuf_t *text,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return a formatted string, compatible with filesystem format FORMAT,
+ that represents the location of representation REP. If
+ MUTABLE_REP_TRUNCATED is given, the rep is for props or dir contents,
+ and only a "-1" revision number will be given for a mutable rep.
+ If MAY_BE_CORRUPT is true, guard for NULL when constructing the string.
+ Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL. */
+svn_stringbuf_t *
+svn_fs_fs__unparse_representation(representation_t *rep,
+ int format,
+ svn_boolean_t mutable_rep_truncated,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* This type enumerates all forms of representations that we support. */
+typedef enum svn_fs_fs__rep_type_t
+{
+ /* this is a PLAIN representation */
+ svn_fs_fs__rep_plain,
+
+ /* this is a DELTA representation with no base representation */
+ svn_fs_fs__rep_self_delta,
+
+ /* this is a DELTA representation against some base representation */
+ svn_fs_fs__rep_delta
+} svn_fs_fs__rep_type_t;
+
+/* This structure is used to hold the information stored in a representation
+ * header. */
+typedef struct svn_fs_fs__rep_header_t
+{
+ /* type of the representation, i.e. whether it is PLAIN, self-DELTA etc. */
+ svn_fs_fs__rep_type_t type;
+
+ /* if this rep is a delta against some other rep, that base rep can
+ * be found in this revision. Should be 0 if there is no base rep. */
+ svn_revnum_t base_revision;
+
+ /* if this rep is a delta against some other rep, that base rep can
+ * be found at this item index within the base rep's revision. Should
+ * be 0 if there is no base rep. */
+ apr_off_t base_item_index;
+
+ /* if this rep is a delta against some other rep, this is the (deltified)
+ * size of that base rep. Should be 0 if there is no base rep. */
+ svn_filesize_t base_length;
+
+ /* length of the textual representation of the header in the rep or pack
+ * file, including EOL. Only valid after reading it from disk.
+ * Should be 0 otherwise. */
+ apr_size_t header_size;
+} svn_fs_fs__rep_header_t;
+
+/* Read the next line from STREAM and parse it as a text
+ representation header. Return the parsed entry in *HEADER, allocated
+ in RESULT_POOL. Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_fs__read_rep_header(svn_fs_fs__rep_header_t **header,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Write the representation HEADER to STREAM.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__write_rep_header(svn_fs_fs__rep_header_t *header,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool);
diff --git a/subversion/libsvn_fs_fs/pack.c b/subversion/libsvn_fs_fs/pack.c
new file mode 100644
index 0000000..8c4ef37
--- /dev/null
+++ b/subversion/libsvn_fs_fs/pack.c
@@ -0,0 +1,2061 @@
+/* pack.c --- FSFS shard packing functionality
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+#include <assert.h>
+#include <string.h>
+
+#include "svn_pools.h"
+#include "svn_dirent_uri.h"
+#include "svn_sorts.h"
+#include "private/svn_temp_serializer.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_io_private.h"
+
+#include "fs_fs.h"
+#include "pack.h"
+#include "util.h"
+#include "id.h"
+#include "index.h"
+#include "low_level.h"
+#include "revprops.h"
+#include "transaction.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+#include "temp_serializer.h"
+
+/* Logical addressing packing logic:
+ *
+ * We pack files on a pack file basis (e.g. 1000 revs) without changing
+ * existing pack files nor the revision files outside the range to pack.
+ *
+ * First, we will scan the revision file indexes to determine the number
+ * of items to "place" (i.e. determine their optimal position within the
+ * future pack file). For each item, we will need a constant amount of
+ * memory to track it. A MAX_MEM parameter sets a limit to the number of
+ * items we may place in one go. That means, we may not be able to add
+ * all revisions at once. Instead, we will run the placement for a subset
+ * of revisions at a time. The very unlikely worst case will simply append
+ * all revision data with just a little reshuffling inside each revision.
+ *
+ * In a second step, we read all revisions in the selected range, build
+ * the item tracking information and copy the items themselves from the
+ * revision files to temporary files. The latter serve as buckets for a
+ * very coarse bucket presort: Separate change lists, file properties,
+ * directory properties and noderevs + representations from one another.
+ *
+ * The third step will determine an optimized placement for the items in
+ * each of the 4 buckets separately. The first three will simply order
+ * their items by revision, starting with the newest once. Placing rep
+ * and noderev items is a more elaborate process documented in the code.
+ *
+ * In short, we store items in the following order:
+ * - changed paths lists
+ * - node property
+ * - directory properties
+ * - directory representations corresponding noderevs, lexical path order
+ * with special treatment of "trunk" and "branches"
+ * - same for file representations
+ *
+ * Step 4 copies the items from the temporary buckets into the final
+ * pack file and writes the temporary index files.
+ *
+ * Finally, after the last range of revisions, create the final indexes.
+ */
+
+/* Maximum amount of memory we allocate for placement information during
+ * the pack process.
+ */
+#define DEFAULT_MAX_MEM (64 * 1024 * 1024)
+
+/* Data structure describing a node change at PATH, REVISION.
+ * We will sort these instances by PATH and NODE_ID such that we can combine
+ * similar nodes in the same reps container and store containers in path
+ * major order.
+ */
+typedef struct path_order_t
+{
+ /* changed path */
+ svn_prefix_string__t *path;
+
+ /* node ID for this PATH in REVISION */
+ svn_fs_fs__id_part_t node_id;
+
+ /* when this change happened */
+ svn_revnum_t revision;
+
+ /* noderev predecessor count */
+ int predecessor_count;
+
+ /* this is a directory node */
+ svn_boolean_t is_dir;
+
+ /* length of the expanded representation content */
+ apr_int64_t expanded_size;
+
+ /* item ID of the noderev linked to the change. May be (0, 0). */
+ svn_fs_fs__id_part_t noderev_id;
+
+ /* item ID of the representation containing the new data. May be (0, 0). */
+ svn_fs_fs__id_part_t rep_id;
+} path_order_t;
+
+/* Represents a reference from item FROM to item TO. FROM may be a noderev
+ * or rep_id while TO is (currently) always a representation. We will sort
+ * them by TO which allows us to collect all dependent items.
+ */
+typedef struct reference_t
+{
+ svn_fs_fs__id_part_t to;
+ svn_fs_fs__id_part_t from;
+} reference_t;
+
+/* This structure keeps track of all the temporary data and status that
+ * needs to be kept around during the creation of one pack file. After
+ * each revision range (in case we can't process all revs at once due to
+ * memory restrictions), parts of the data will get re-initialized.
+ */
+typedef struct pack_context_t
+{
+ /* file system that we operate on */
+ svn_fs_t *fs;
+
+ /* cancel function to invoke at regular intervals. May be NULL */
+ svn_cancel_func_t cancel_func;
+
+ /* baton to pass to CANCEL_FUNC */
+ void *cancel_baton;
+
+ /* first revision in the shard (and future pack file) */
+ svn_revnum_t shard_rev;
+
+ /* first revision in the range to process (>= SHARD_REV) */
+ svn_revnum_t start_rev;
+
+ /* first revision after the range to process (<= SHARD_END_REV) */
+ svn_revnum_t end_rev;
+
+ /* first revision after the current shard */
+ svn_revnum_t shard_end_rev;
+
+ /* log-to-phys proto index for the whole pack file */
+ apr_file_t *proto_l2p_index;
+
+ /* phys-to-log proto index for the whole pack file */
+ apr_file_t *proto_p2l_index;
+
+ /* full shard directory path (containing the unpacked revisions) */
+ const char *shard_dir;
+
+ /* full packed shard directory path (containing the pack file + indexes) */
+ const char *pack_file_dir;
+
+ /* full pack file path (including PACK_FILE_DIR) */
+ const char *pack_file_path;
+
+ /* current write position (i.e. file length) in the pack file */
+ apr_off_t pack_offset;
+
+ /* the pack file to ultimately write all data to */
+ apr_file_t *pack_file;
+
+ /* array of svn_fs_fs__p2l_entry_t *, all referring to change lists.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *changes;
+
+ /* temp file receiving all change list items (referenced by CHANGES).
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_file_t *changes_file;
+
+ /* array of svn_fs_fs__p2l_entry_t *, all referring to file properties.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *file_props;
+
+ /* temp file receiving all file prop items (referenced by FILE_PROPS).
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *file_props_file;
+
+ /* array of svn_fs_fs__p2l_entry_t *, all referring to directory properties.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *dir_props;
+
+ /* temp file receiving all directory prop items (referenced by DIR_PROPS).
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *dir_props_file;
+
+ /* container for all PATH members in PATH_ORDER. */
+ svn_prefix_tree__t *paths;
+
+ /* array of path_order_t *. Will be filled in phase 2 and be cleared
+ * after each revision range. Sorted by PATH, NODE_ID. */
+ apr_array_header_t *path_order;
+
+ /* array of reference_t* linking representations to their delta bases.
+ * Will be filled in phase 2 and be cleared after each revision range.
+ * It will be sorted by the FROM members (for rep->base rep lookup). */
+ apr_array_header_t *references;
+
+ /* array of svn_fs_fs__p2l_entry_t*. Will be filled in phase 2 and be
+ * cleared after each revision range. During phase 3, we will set items
+ * to NULL that we already processed. */
+ apr_array_header_t *reps;
+
+ /* array of int, marking for each revision, the which offset their items
+ * begin in REPS. Will be filled in phase 2 and be cleared after
+ * each revision range. */
+ apr_array_header_t *rev_offsets;
+
+ /* temp file receiving all items referenced by REPS.
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *reps_file;
+
+ /* pool used for temporary data structures that will be cleaned up when
+ * the next range of revisions is being processed */
+ apr_pool_t *info_pool;
+} pack_context_t;
+
+/* Create and initialize a new pack context for packing shard SHARD_REV in
+ * SHARD_DIR into PACK_FILE_DIR within filesystem FS. Allocate it in POOL
+ * and return the structure in *CONTEXT.
+ *
+ * Limit the number of items being copied per iteration to MAX_ITEMS.
+ * Set CANCEL_FUNC and CANCEL_BATON as well.
+ */
+static svn_error_t *
+initialize_pack_context(pack_context_t *context,
+ svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_dir,
+ svn_revnum_t shard_rev,
+ int max_items,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const char *temp_dir;
+ int max_revs = MIN(ffd->max_files_per_dir, max_items);
+
+ SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT);
+ SVN_ERR_ASSERT(shard_rev % ffd->max_files_per_dir == 0);
+
+ /* where we will place our various temp files */
+ SVN_ERR(svn_io_temp_dir(&temp_dir, pool));
+
+ /* store parameters */
+ context->fs = fs;
+ context->cancel_func = cancel_func;
+ context->cancel_baton = cancel_baton;
+
+ context->shard_rev = shard_rev;
+ context->start_rev = shard_rev;
+ context->end_rev = shard_rev;
+ context->shard_end_rev = shard_rev + ffd->max_files_per_dir;
+
+ /* Create the new directory and pack file. */
+ context->shard_dir = shard_dir;
+ context->pack_file_dir = pack_file_dir;
+ context->pack_file_path
+ = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
+ SVN_ERR(svn_io_file_open(&context->pack_file, context->pack_file_path,
+ APR_WRITE | APR_BUFFERED | APR_BINARY | APR_EXCL
+ | APR_CREATE, APR_OS_DEFAULT, pool));
+
+ /* Proto index files */
+ SVN_ERR(svn_fs_fs__l2p_proto_index_open(
+ &context->proto_l2p_index,
+ svn_dirent_join(pack_file_dir,
+ PATH_INDEX PATH_EXT_L2P_INDEX,
+ pool),
+ pool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_open(
+ &context->proto_p2l_index,
+ svn_dirent_join(pack_file_dir,
+ PATH_INDEX PATH_EXT_P2L_INDEX,
+ pool),
+ pool));
+
+ /* item buckets: one item info array and one temp file per bucket */
+ context->changes = apr_array_make(pool, max_items,
+ sizeof(svn_fs_fs__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->changes_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+ context->file_props = apr_array_make(pool, max_items,
+ sizeof(svn_fs_fs__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->file_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+ context->dir_props = apr_array_make(pool, max_items,
+ sizeof(svn_fs_fs__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->dir_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+
+ /* noderev and representation item bucket */
+ context->rev_offsets = apr_array_make(pool, max_revs, sizeof(int));
+ context->path_order = apr_array_make(pool, max_items,
+ sizeof(path_order_t *));
+ context->references = apr_array_make(pool, max_items,
+ sizeof(reference_t *));
+ context->reps = apr_array_make(pool, max_items,
+ sizeof(svn_fs_fs__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->reps_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+
+ /* the pool used for temp structures */
+ context->info_pool = svn_pool_create(pool);
+ context->paths = svn_prefix_tree__create(context->info_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Clean up / free all revision range specific data and files in CONTEXT.
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+reset_pack_context(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ const char *temp_dir;
+
+ apr_array_clear(context->changes);
+ SVN_ERR(svn_io_file_close(context->changes_file, pool));
+ apr_array_clear(context->file_props);
+ SVN_ERR(svn_io_file_close(context->file_props_file, pool));
+ apr_array_clear(context->dir_props);
+ SVN_ERR(svn_io_file_close(context->dir_props_file, pool));
+
+ apr_array_clear(context->rev_offsets);
+ apr_array_clear(context->path_order);
+ apr_array_clear(context->references);
+ apr_array_clear(context->reps);
+ SVN_ERR(svn_io_file_close(context->reps_file, pool));
+
+ svn_pool_clear(context->info_pool);
+
+ /* The new temporary files must live at least as long as any other info
+ * object in CONTEXT. */
+ SVN_ERR(svn_io_temp_dir(&temp_dir, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->changes_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->file_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->dir_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ SVN_ERR(svn_io_open_unique_file3(&context->reps_file, NULL, temp_dir,
+ svn_io_file_del_on_close,
+ context->info_pool, pool));
+ context->paths = svn_prefix_tree__create(context->info_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Call this after the last revision range. It will finalize all index files
+ * for CONTEXT and close any open files. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+close_pack_context(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ const char *proto_l2p_index_path;
+ const char *proto_p2l_index_path;
+
+ /* need the file names for the actual index creation call further down */
+ SVN_ERR(svn_io_file_name_get(&proto_l2p_index_path,
+ context->proto_l2p_index, pool));
+ SVN_ERR(svn_io_file_name_get(&proto_p2l_index_path,
+ context->proto_p2l_index, pool));
+
+ /* finalize proto index files */
+ SVN_ERR(svn_io_file_close(context->proto_l2p_index, pool));
+ SVN_ERR(svn_io_file_close(context->proto_p2l_index, pool));
+
+ /* Append the actual index data to the pack file. */
+ SVN_ERR(svn_fs_fs__add_index_data(context->fs, context->pack_file,
+ proto_l2p_index_path,
+ proto_p2l_index_path,
+ context->shard_rev,
+ pool));
+
+ /* remove proto index files */
+ SVN_ERR(svn_io_remove_file2(proto_l2p_index_path, FALSE, pool));
+ SVN_ERR(svn_io_remove_file2(proto_p2l_index_path, FALSE, pool));
+
+ /* Ensure that packed file is written to disk.*/
+ SVN_ERR(svn_io_file_flush_to_disk(context->pack_file, pool));
+ SVN_ERR(svn_io_file_close(context->pack_file, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Efficiently copy SIZE bytes from SOURCE to DEST. Invoke the CANCEL_FUNC
+ * from CONTEXT at regular intervals. Use POOL for allocations.
+ */
+static svn_error_t *
+copy_file_data(pack_context_t *context,
+ apr_file_t *dest,
+ apr_file_t *source,
+ apr_off_t size,
+ apr_pool_t *pool)
+{
+ /* most non-representation items will be small. Minimize the buffer
+ * and infrastructure overhead in that case. */
+ enum { STACK_BUFFER_SIZE = 1024 };
+
+ if (size < STACK_BUFFER_SIZE)
+ {
+ /* copy small data using a fixed-size buffer on stack */
+ char buffer[STACK_BUFFER_SIZE];
+ SVN_ERR(svn_io_file_read_full2(source, buffer, (apr_size_t)size,
+ NULL, NULL, pool));
+ SVN_ERR(svn_io_file_write_full(dest, buffer, (apr_size_t)size,
+ NULL, pool));
+ }
+ else
+ {
+ /* use streaming copies for larger data blocks. That may require
+ * the allocation of larger buffers and we should make sure that
+ * this extra memory is released asap. */
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+ apr_pool_t *copypool = svn_pool_create(pool);
+ char *buffer = apr_palloc(copypool, ffd->block_size);
+
+ while (size)
+ {
+ apr_size_t to_copy = (apr_size_t)(MIN(size, ffd->block_size));
+ if (context->cancel_func)
+ SVN_ERR(context->cancel_func(context->cancel_baton));
+
+ SVN_ERR(svn_io_file_read_full2(source, buffer, to_copy,
+ NULL, NULL, pool));
+ SVN_ERR(svn_io_file_write_full(dest, buffer, to_copy,
+ NULL, pool));
+
+ size -= to_copy;
+ }
+
+ svn_pool_destroy(copypool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Writes SIZE bytes, all 0, to DEST. Uses POOL for allocations.
+ */
+static svn_error_t *
+write_null_bytes(apr_file_t *dest,
+ apr_off_t size,
+ apr_pool_t *pool)
+{
+ /* Have a collection of high-quality, easy to access NUL bytes handy. */
+ enum { BUFFER_SIZE = 1024 };
+ static const char buffer[BUFFER_SIZE] = { 0 };
+
+ /* copy SIZE of them into the file's buffer */
+ while (size)
+ {
+ apr_size_t to_write = MIN(size, BUFFER_SIZE);
+ SVN_ERR(svn_io_file_write_full(dest, buffer, to_write, NULL, pool));
+ size -= to_write;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy the "simple" item (changed paths list or property representation)
+ * from the current position in REV_FILE to TEMP_FILE using CONTEXT. Add
+ * a copy of ENTRY to ENTRIES but with an updated offset value that points
+ * to the copy destination in TEMP_FILE. Use POOL for allocations.
+ */
+static svn_error_t *
+copy_item_to_temp(pack_context_t *context,
+ apr_array_header_t *entries,
+ apr_file_t *temp_file,
+ apr_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__p2l_entry_t *new_entry
+ = apr_pmemdup(context->info_pool, entry, sizeof(*entry));
+
+ SVN_ERR(svn_fs_fs__get_file_offset(&new_entry->offset, temp_file, pool));
+ APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t *) = new_entry;
+
+ SVN_ERR(copy_file_data(context, temp_file, rev_file, entry->size, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the offset within CONTEXT->REPS that corresponds to item
+ * ITEM_INDEX in REVISION.
+ */
+static int
+get_item_array_index(pack_context_t *context,
+ svn_revnum_t revision,
+ apr_int64_t item_index)
+{
+ assert(revision >= context->start_rev);
+ return (int)item_index + APR_ARRAY_IDX(context->rev_offsets,
+ revision - context->start_rev,
+ int);
+}
+
+/* Write INFO to the correct position in CONTEXT->REP_INFOS. The latter
+ * may need auto-expanding. Overwriting an array element is not allowed.
+ */
+static void
+add_item_rep_mapping(pack_context_t *context,
+ svn_fs_fs__p2l_entry_t *entry)
+{
+ int idx;
+
+ /* index of INFO */
+ idx = get_item_array_index(context,
+ entry->item.revision,
+ entry->item.number);
+
+ /* make sure the index exists in the array */
+ while (context->reps->nelts <= idx)
+ APR_ARRAY_PUSH(context->reps, void *) = NULL;
+
+ /* set the element. If there is already an entry, there are probably
+ * two items claiming to be the same -> bail out */
+ assert(!APR_ARRAY_IDX(context->reps, idx, void *));
+ APR_ARRAY_IDX(context->reps, idx, void *) = entry;
+}
+
+/* Return the P2L entry from CONTEXT->REPS for the given ID. If there is
+ * none (or not anymore), return NULL. If RESET has been specified, set
+ * the array entry to NULL after returning the entry.
+ */
+static svn_fs_fs__p2l_entry_t *
+get_item(pack_context_t *context,
+ const svn_fs_fs__id_part_t *id,
+ svn_boolean_t reset)
+{
+ svn_fs_fs__p2l_entry_t *result = NULL;
+ if (id->number && id->revision >= context->start_rev)
+ {
+ int idx = get_item_array_index(context, id->revision, id->number);
+ if (context->reps->nelts > idx)
+ {
+ result = APR_ARRAY_IDX(context->reps, idx, void *);
+ if (result && reset)
+ APR_ARRAY_IDX(context->reps, idx, void *) = NULL;
+ }
+ }
+
+ return result;
+}
+
+/* Copy representation item identified by ENTRY from the current position
+ * in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
+ * our placement algorithm to CONTEXT. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_rep_to_temp(pack_context_t *context,
+ apr_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__rep_header_t *rep_header;
+ svn_stream_t *stream;
+ apr_off_t source_offset = entry->offset;
+
+ /* create a copy of ENTRY, make it point to the copy destination and
+ * store it in CONTEXT */
+ entry = apr_pmemdup(context->info_pool, entry, sizeof(*entry));
+ SVN_ERR(svn_fs_fs__get_file_offset(&entry->offset, context->reps_file, pool));
+ add_item_rep_mapping(context, entry);
+
+ /* read & parse the representation header */
+ stream = svn_stream_from_aprfile2(rev_file, TRUE, pool);
+ SVN_ERR(svn_fs_fs__read_rep_header(&rep_header, stream, pool, pool));
+ svn_stream_close(stream);
+
+ /* if the representation is a delta against some other rep, link the two */
+ if ( rep_header->type == svn_fs_fs__rep_delta
+ && rep_header->base_revision >= context->start_rev)
+ {
+ reference_t *reference = apr_pcalloc(context->info_pool,
+ sizeof(*reference));
+ reference->from = entry->item;
+ reference->to.revision = rep_header->base_revision;
+ reference->to.number = rep_header->base_item_index;
+ APR_ARRAY_PUSH(context->references, reference_t *) = reference;
+ }
+
+ /* copy the whole rep (including header!) to our temp file */
+ SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &source_offset, pool));
+ SVN_ERR(copy_file_data(context, context->reps_file, rev_file, entry->size,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Directories first, dirs / files sorted by name in reverse lexical order.
+ * This maximizes the chance of two items being located close to one another
+ * in *all* pack files independent of their change order. It also groups
+ * multi-project repos nicely according to their sub-projects. The reverse
+ * order aspect gives "trunk" preference over "tags" and "branches", so
+ * trunk-related items are more likely to be contiguous.
+ */
+static int
+compare_dir_entries_format7(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
+ const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
+
+ if (lhs->kind != rhs->kind)
+ return lhs->kind == svn_node_dir ? -1 : 1;
+
+ return strcmp(lhs->name, rhs->name);
+}
+
+/* Directories entries sorted by revision (decreasing - to max cache hits)
+ * and offset (increasing - to max benefit from APR file buffering).
+ */
+static int
+compare_dir_entries_format6(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
+ const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
+
+ const svn_fs_fs__id_part_t *lhs_rev_item
+ = svn_fs_fs__id_rev_item(lhs->id);
+ const svn_fs_fs__id_part_t *rhs_rev_item
+ = svn_fs_fs__id_rev_item(rhs->id);
+
+ /* decreasing ("reverse") order on revs */
+ if (lhs_rev_item->revision != rhs_rev_item->revision)
+ return lhs_rev_item->revision > rhs_rev_item->revision ? -1 : 1;
+
+ /* increasing order on offsets */
+ if (lhs_rev_item->number != rhs_rev_item->number)
+ return lhs_rev_item->number > rhs_rev_item->number ? 1 : -1;
+
+ return 0;
+}
+
+apr_array_header_t *
+svn_fs_fs__order_dir_entries(svn_fs_t *fs,
+ apr_hash_t *directory,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *ordered
+ = svn_sort__hash(directory,
+ svn_fs_fs__use_log_addressing(fs)
+ ? compare_dir_entries_format7
+ : compare_dir_entries_format6,
+ scratch_pool);
+
+ apr_array_header_t *result
+ = apr_array_make(result_pool, ordered->nelts, sizeof(svn_fs_dirent_t *));
+
+ int i;
+ for (i = 0; i < ordered->nelts; ++i)
+ APR_ARRAY_PUSH(result, svn_fs_dirent_t *)
+ = APR_ARRAY_IDX(ordered, i, svn_sort__item_t).value;
+
+ return result;
+}
+
+/* Return a duplicate of the the ORIGINAL path and with special sub-strins
+ * (e.g. "trunk") modified in such a way that have a lower lexicographic
+ * value than any other "normal" file name.
+ */
+static const char *
+tweak_path_for_ordering(const char *original,
+ apr_pool_t *pool)
+{
+ /* We may add further special cases as needed. */
+ enum {SPECIAL_COUNT = 2};
+ static const char *special[SPECIAL_COUNT] = {"trunk", "branch"};
+ char *pos;
+ char *path = apr_pstrdup(pool, original);
+ int i;
+
+ /* Replace the first char of any "special" sub-string we find by
+ * a control char, i.e. '\1' .. '\31'. In the rare event that this
+ * would clash with existing paths, no data will be lost but merely
+ * the node ordering will be sub-optimal.
+ */
+ for (i = 0; i < SPECIAL_COUNT; ++i)
+ for (pos = strstr(path, special[i]);
+ pos;
+ pos = strstr(pos + 1, special[i]))
+ {
+ *pos = (char)(i + '\1');
+ }
+
+ return path;
+}
+
+/* Copy node revision item identified by ENTRY from the current position
+ * in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
+ * our placement algorithm to CONTEXT. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_node_to_temp(pack_context_t *context,
+ apr_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ path_order_t *path_order = apr_pcalloc(context->info_pool,
+ sizeof(*path_order));
+ node_revision_t *noderev;
+ const char *sort_path;
+ svn_stream_t *stream;
+ apr_off_t source_offset = entry->offset;
+
+ /* read & parse noderev */
+ stream = svn_stream_from_aprfile2(rev_file, TRUE, pool);
+ SVN_ERR(svn_fs_fs__read_noderev(&noderev, stream, pool, pool));
+ svn_stream_close(stream);
+
+ /* create a copy of ENTRY, make it point to the copy destination and
+ * store it in CONTEXT */
+ entry = apr_pmemdup(context->info_pool, entry, sizeof(*entry));
+ SVN_ERR(svn_fs_fs__get_file_offset(&entry->offset, context->reps_file,
+ pool));
+ add_item_rep_mapping(context, entry);
+
+ /* copy the noderev to our temp file */
+ SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &source_offset, pool));
+ SVN_ERR(copy_file_data(context, context->reps_file, rev_file, entry->size,
+ pool));
+
+ /* if the node has a data representation, make that the node's "base".
+ * This will (often) cause the noderev to be placed right in front of
+ * its data representation. */
+
+ if (noderev->data_rep && noderev->data_rep->revision >= context->start_rev)
+ {
+ path_order->rep_id.revision = noderev->data_rep->revision;
+ path_order->rep_id.number = noderev->data_rep->item_index;
+ path_order->expanded_size = noderev->data_rep->expanded_size
+ ? noderev->data_rep->expanded_size
+ : noderev->data_rep->size;
+ }
+
+ /* Sort path is the key used for ordering noderevs and associated reps.
+ * It will not be stored in the final pack file. */
+ sort_path = tweak_path_for_ordering(noderev->created_path, pool);
+ path_order->path = svn_prefix_string__create(context->paths, sort_path);
+ path_order->node_id = *svn_fs_fs__id_node_id(noderev->id);
+ path_order->revision = svn_fs_fs__id_rev(noderev->id);
+ path_order->predecessor_count = noderev->predecessor_count;
+ path_order->is_dir = noderev->kind == svn_node_dir;
+ path_order->noderev_id = *svn_fs_fs__id_rev_item(noderev->id);
+ APR_ARRAY_PUSH(context->path_order, path_order_t *) = path_order;
+
+ return SVN_NO_ERROR;
+}
+
+/* implements compare_fn_t. Bring all directories in front of the files
+ and sort descendingly by PATH, NODE_ID and REVISION.
+ */
+static int
+compare_path_order(const path_order_t * const * lhs_p,
+ const path_order_t * const * rhs_p)
+{
+ const path_order_t * lhs = *lhs_p;
+ const path_order_t * rhs = *rhs_p;
+
+ /* cluster all directories */
+ int diff = rhs->is_dir - lhs->is_dir;
+ if (diff)
+ return diff;
+
+ /* lexicographic order on path and node (i.e. latest first) */
+ diff = svn_prefix_string__compare(lhs->path, rhs->path);
+ if (diff)
+ return diff;
+
+ /* reverse order on node (i.e. latest first) */
+ diff = svn_fs_fs__id_part_compare(&rhs->node_id, &lhs->node_id);
+ if (diff)
+ return diff;
+
+ /* reverse order on revision (i.e. latest first) */
+ if (lhs->revision != rhs->revision)
+ return lhs->revision < rhs->revision ? 1 : -1;
+
+ return 0;
+}
+
+/* implements compare_fn_t. Sort ascendingly by FROM, TO.
+ */
+static int
+compare_references(const reference_t * const * lhs_p,
+ const reference_t * const * rhs_p)
+{
+ const reference_t * lhs = *lhs_p;
+ const reference_t * rhs = *rhs_p;
+
+ int diff = svn_fs_fs__id_part_compare(&lhs->from, &rhs->from);
+ return diff ? diff : svn_fs_fs__id_part_compare(&lhs->to, &rhs->to);
+}
+
+/* implements compare_fn_t. Assume ascending order by FROM.
+ */
+static int
+compare_ref_to_item(const reference_t * const * lhs_p,
+ const svn_fs_fs__id_part_t * rhs_p)
+{
+ return svn_fs_fs__id_part_compare(&(*lhs_p)->from, rhs_p);
+}
+
+/* implements compare_fn_t. Finds the DIR / FILE boundary.
+ */
+static int
+compare_is_dir(const path_order_t * const * lhs_p,
+ const void *unused)
+{
+ return (*lhs_p)->is_dir ? -1 : 0;
+}
+
+/* Look for the least significant bit set in VALUE and return the smallest
+ * number with the same property, i.e. the largest power of 2 that is a
+ * factor in VALUE. */
+static int
+roundness(int value)
+{
+ return value ? value - (value & (value - 1)) : INT_MAX;
+}
+
+/* Order a range of data collected in CONTEXT such that we can place them
+ * in the desired order. The input is taken from *PATH_ORDER, offsets FIRST
+ * to LAST and then written in the final order to the same range in *TEMP.
+ */
+static void
+sort_reps_range(pack_context_t *context,
+ const path_order_t **path_order,
+ const path_order_t **temp,
+ int first,
+ int last)
+{
+ const svn_prefix_string__t *path;
+ int i, dest, best;
+ svn_fs_fs__id_part_t rep_id;
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+
+ /* The logic below would fail for empty ranges. */
+ if (first == last)
+ return;
+
+ /* Re-order noderevs like this:
+ *
+ * (1) Most likely to be referenced by future pack files, in path order.
+ * (2) highest revision rep per path + dependency chain
+ * (3) Remaining reps in path, rev order
+ *
+ * We simply pick & chose from the existing path, rev order.
+ */
+ dest = first;
+ path = path_order[first]->path;
+ best = first;
+
+ /* (1) For each path, pick the "roundest" representation and put it in
+ * front of all other nodes in the pack file. The "roundest" rep is
+ * the one most likely to be referenced from future pack files, i.e. we
+ * concentrate those potential "foreign link targets" in one section of
+ * the pack file.
+ *
+ * And we only apply this to reps outside the linear deltification
+ * sections because references *into* linear deltification ranges are
+ * much less likely.
+ */
+ for (i = first; i < last; ++i)
+ {
+ /* Investigated all nodes for the current path? */
+ if (svn_prefix_string__compare(path, path_order[i]->path))
+ {
+ /* next path */
+ path = path_order[i]->path;
+
+ /* Pick roundest non-linear deltified node. */
+ if (roundness(path_order[best]->predecessor_count)
+ >= ffd->max_linear_deltification)
+ {
+ temp[dest++] = path_order[best];
+ path_order[best] = NULL;
+ best = i;
+ }
+ }
+
+ /* next entry */
+ if ( roundness(path_order[best]->predecessor_count)
+ < roundness(path_order[i]->predecessor_count))
+ best = i;
+ }
+
+ /* Treat the last path the same as all others. */
+ if (roundness(path_order[best]->predecessor_count)
+ >= ffd->max_linear_deltification)
+ {
+ temp[dest++] = path_order[best];
+ path_order[best] = NULL;
+ }
+
+ /* (2) For each (remaining) path, pick the nodes along the delta chain
+ * for the highest revision. Due to our ordering, this is the first
+ * node we encounter for any path.
+ *
+ * Most references that don't hit a delta base picked in (1), will
+ * access HEAD of the respective path. Keeping all its dependency chain
+ * in one place turns reconstruction into a linear scan of minimal length.
+ */
+ for (i = first; i < last; ++i)
+ if (path_order[i])
+ {
+ /* This is the first path we still have to handle. */
+ path = path_order[i]->path;
+ rep_id = path_order[i]->rep_id;
+ break;
+ }
+
+ for (i = first; i < last; ++i)
+ if (path_order[i])
+ {
+ /* New path? */
+ if (svn_prefix_string__compare(path, path_order[i]->path))
+ {
+ path = path_order[i]->path;
+ rep_id = path_order[i]->rep_id;
+ }
+
+ /* Pick nodes along the deltification chain. Skip side-branches. */
+ if (svn_fs_fs__id_part_eq(&path_order[i]->rep_id, &rep_id))
+ {
+ reference_t **reference;
+
+ temp[dest++] = path_order[i];
+ path_order[i] = NULL;
+
+ reference = svn_sort__array_lookup(context->references,
+ &rep_id, NULL,
+ (int (*)(const void *, const void *))compare_ref_to_item);
+ if (reference)
+ rep_id = (*reference)->to;
+ }
+ }
+
+ /* (3) All remaining nodes in path, rev order. Linear deltification
+ * makes HEAD delta chains from (2) cover all or most of their deltas
+ * in a given pack file. So, this is just a few remnants that we put
+ * at the end of the pack file.
+ */
+ for (i = first; i < last; ++i)
+ if (path_order[i])
+ temp[dest++] = path_order[i];
+
+ /* We now know the final ordering. */
+ assert(dest == last);
+}
+
+/* Order the data collected in CONTEXT such that we can place them in the
+ * desired order.
+ */
+static void
+sort_reps(pack_context_t *context)
+{
+ apr_pool_t *temp_pool;
+ const path_order_t **temp, **path_order;
+ int i, count, dir_count;
+
+ /* We will later assume that there is at least one node / path.
+ */
+ if (context->path_order->nelts == 0)
+ {
+ assert(context->references->nelts == 0);
+ return;
+ }
+
+ /* Sort containers by path and IDs, respectively.
+ */
+ svn_sort__array(context->path_order,
+ (int (*)(const void *, const void *))compare_path_order);
+ svn_sort__array(context->references,
+ (int (*)(const void *, const void *))compare_references);
+
+ /* Directories are already in front; sort directories section and files
+ * section separately but use the same heuristics (see sub-function).
+ */
+ temp_pool = svn_pool_create(context->info_pool);
+ count = context->path_order->nelts;
+ temp = apr_pcalloc(temp_pool, count * sizeof(*temp));
+ path_order = (void *)context->path_order->elts;
+
+ /* Find the boundary between DIR and FILE section. */
+ dir_count = svn_sort__bsearch_lower_bound(context->path_order, NULL,
+ (int (*)(const void *, const void *))compare_is_dir);
+
+ /* Sort those sub-sections separately. */
+ sort_reps_range(context, path_order, temp, 0, dir_count);
+ sort_reps_range(context, path_order, temp, dir_count, count);
+
+ /* We now know the final ordering. */
+ for (i = 0; i < count; ++i)
+ path_order[i] = temp[i];
+
+ svn_pool_destroy(temp_pool);
+}
+
+/* implements compare_fn_t. Place LHS before RHS, if the latter is older.
+ */
+static int
+compare_p2l_info(const svn_fs_fs__p2l_entry_t * const * lhs,
+ const svn_fs_fs__p2l_entry_t * const * rhs)
+{
+ assert(*lhs != *rhs);
+
+ if ((*lhs)->item.revision == (*rhs)->item.revision)
+ return (*lhs)->item.number > (*rhs)->item.number ? -1 : 1;
+
+ return (*lhs)->item.revision > (*rhs)->item.revision ? -1 : 1;
+}
+
+/* Sort svn_fs_fs__p2l_entry_t * array ENTRIES by age. Place the latest
+ * items first.
+ */
+static void
+sort_items(apr_array_header_t *entries)
+{
+ svn_sort__array(entries,
+ (int (*)(const void *, const void *))compare_p2l_info);
+}
+
+/* Return the remaining unused bytes in the current block in CONTEXT's
+ * pack file.
+ */
+static apr_ssize_t
+get_block_left(pack_context_t *context)
+{
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+ return ffd->block_size - (context->pack_offset % ffd->block_size);
+}
+
+/* To prevent items from overlapping a block boundary, we will usually
+ * put them into the next block and top up the old one with NUL bytes.
+ * Pad CONTEXT's pack file to the end of the current block, if TO_ADD does
+ * not fit into the current block and the padding is short enough.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+auto_pad_block(pack_context_t *context,
+ apr_off_t to_add,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+
+ /* This is the maximum number of bytes "wasted" that way per block.
+ * Larger items will cross the block boundaries. */
+ const apr_off_t max_padding = MAX(ffd->block_size / 50, 512);
+
+ /* Is wasted space small enough to align the current item to the next
+ * block? */
+ apr_off_t padding = get_block_left(context);
+
+ if (padding < to_add && padding < max_padding)
+ {
+ /* Yes. To up with NUL bytes and don't forget to create
+ * an P2L index entry marking this section as unused. */
+ svn_fs_fs__p2l_entry_t null_entry;
+
+ null_entry.offset = context->pack_offset;
+ null_entry.size = padding;
+ null_entry.type = SVN_FS_FS__ITEM_TYPE_UNUSED;
+ null_entry.item.revision = SVN_INVALID_REVNUM;
+ null_entry.item.number = SVN_FS_FS__ITEM_INDEX_UNUSED;
+ null_entry.fnv1_checksum = 0;
+
+ SVN_ERR(write_null_bytes(context->pack_file, padding, pool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(
+ context->proto_p2l_index, &null_entry, pool));
+ context->pack_offset += padding;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the contents of ITEM, if not empty, from TEMP_FILE and write it
+ * to CONTEXT->PACK_FILE. Use POOL for allocations.
+ */
+static svn_error_t *
+store_item(pack_context_t *context,
+ apr_file_t *temp_file,
+ svn_fs_fs__p2l_entry_t *item,
+ apr_pool_t *pool)
+{
+ apr_off_t safety_margin;
+
+ /* skip empty entries */
+ if (item->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ return SVN_NO_ERROR;
+
+ /* If the next item does not fit into the current block, auto-pad it.
+ Take special care of textual noderevs since their parsers may
+ prefetch up to 80 bytes and we don't want them to cross block
+ boundaries. */
+ safety_margin = item->type == SVN_FS_FS__ITEM_TYPE_NODEREV
+ ? SVN__LINE_CHUNK_SIZE
+ : 0;
+ SVN_ERR(auto_pad_block(context, item->size + safety_margin, pool));
+
+ /* select the item in the source file and copy it into the target
+ * pack file */
+ SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &item->offset, pool));
+ SVN_ERR(copy_file_data(context, context->pack_file, temp_file,
+ item->size, pool));
+
+ /* write index entry and update current position */
+ item->offset = context->pack_offset;
+ context->pack_offset += item->size;
+
+ SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(context->proto_p2l_index,
+ item, pool));
+
+ APR_ARRAY_PUSH(context->reps, svn_fs_fs__p2l_entry_t *) = item;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the contents of the non-empty items in ITEMS from TEMP_FILE and
+ * write them to CONTEXT->PACK_FILE. Use POOL for allocations.
+ */
+static svn_error_t *
+store_items(pack_context_t *context,
+ apr_file_t *temp_file,
+ apr_array_header_t *items,
+ apr_pool_t *pool)
+{
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* copy all items in strict order */
+ for (i = 0; i < items->nelts; ++i)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(store_item(context, temp_file,
+ APR_ARRAY_IDX(items, i, svn_fs_fs__p2l_entry_t *),
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy (append) the items identified by svn_fs_fs__p2l_entry_t * elements
+ * in ENTRIES strictly in order from TEMP_FILE into CONTEXT->PACK_FILE.
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_reps_from_temp(pack_context_t *context,
+ apr_file_t *temp_file,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_array_header_t *path_order = context->path_order;
+ int i;
+
+ /* copy items in path order. */
+ for (i = 0; i < path_order->nelts; ++i)
+ {
+ path_order_t *current_path;
+ svn_fs_fs__p2l_entry_t *node_part;
+ svn_fs_fs__p2l_entry_t *rep_part;
+
+ svn_pool_clear(iterpool);
+
+ current_path = APR_ARRAY_IDX(path_order, i, path_order_t *);
+ node_part = get_item(context, &current_path->noderev_id, TRUE);
+ rep_part = get_item(context, &current_path->rep_id, TRUE);
+
+ if (node_part)
+ SVN_ERR(store_item(context, temp_file, node_part, iterpool));
+ if (rep_part)
+ SVN_ERR(store_item(context, temp_file, rep_part, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* implements compare_fn_t. Place LHS before RHS, if the latter belongs to
+ * a newer revision.
+ */
+static int
+compare_p2l_info_rev(const svn_fs_fs__p2l_entry_t * const * lhs_p,
+ const svn_fs_fs__p2l_entry_t * const * rhs_p)
+{
+ const svn_fs_fs__p2l_entry_t * lhs = *lhs_p;
+ const svn_fs_fs__p2l_entry_t * rhs = *rhs_p;
+
+ if (lhs->item.revision == rhs->item.revision)
+ return 0;
+
+ return lhs->item.revision < rhs->item.revision ? -1 : 1;
+}
+
+/* Write the log-to-phys proto index file for CONTEXT and use POOL for
+ * temporary allocations. All items in all buckets must have been placed
+ * by now.
+ */
+static svn_error_t *
+write_l2p_index(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_revnum_t prev_rev = SVN_INVALID_REVNUM;
+ int i, dest;
+
+ /* eliminate empty entries from CONTEXT->REPS */
+ for (i = 0, dest = 0; i < context->reps->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = APR_ARRAY_IDX(context->reps, i, svn_fs_fs__p2l_entry_t *);
+ if (entry)
+ APR_ARRAY_IDX(context->reps, dest++, svn_fs_fs__p2l_entry_t *)
+ = entry;
+ }
+ context->reps->nelts = dest;
+
+ /* we need to write the l2p index revision by revision */
+ svn_sort__array(context->reps,
+ (int (*)(const void *, const void *))compare_p2l_info_rev);
+
+ /* write index entries */
+ for (i = 0; i < context->reps->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *p2l_entry
+ = APR_ARRAY_IDX(context->reps, i, svn_fs_fs__p2l_entry_t *);
+ if (p2l_entry == NULL)
+ continue;
+
+ /* next revision? */
+ if (prev_rev != p2l_entry->item.revision)
+ {
+ prev_rev = p2l_entry->item.revision;
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_revision(
+ context->proto_l2p_index, iterpool));
+ }
+
+ /* add entry */
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(context->proto_l2p_index,
+ p2l_entry->offset,
+ p2l_entry->item.number,
+ iterpool));
+
+ /* keep memory usage in check */
+ if (i % 256 == 0)
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Pack the current revision range of CONTEXT, i.e. this covers phases 2
+ * to 4. Use POOL for allocations.
+ */
+static svn_error_t *
+pack_range(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+ apr_pool_t *revpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_pool_t *iterpool2 = svn_pool_create(pool);
+
+ /* Phase 2: Copy items into various buckets and build tracking info */
+ svn_revnum_t revision;
+ for (revision = context->start_rev; revision < context->end_rev; ++revision)
+ {
+ apr_off_t offset = 0;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ svn_pool_clear(revpool);
+
+ /* Get the rev file dimensions (mainly index locations). */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, context->fs,
+ revision, revpool, iterpool));
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+
+ /* store the indirect array index */
+ APR_ARRAY_PUSH(context->rev_offsets, int) = context->reps->nelts;
+
+ /* read the phys-to-log index file until we covered the whole rev file.
+ * That index contains enough info to build both target indexes from it. */
+ while (offset < rev_file->l2p_offset)
+ {
+ /* read one cluster */
+ int i;
+ apr_array_header_t *entries;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, context->fs,
+ rev_file, revision, offset,
+ ffd->p2l_page_size, iterpool,
+ iterpool));
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+
+ /* skip first entry if that was duplicated due crossing a
+ cluster boundary */
+ if (offset > entry->offset)
+ continue;
+
+ svn_pool_clear(iterpool2);
+
+ /* process entry while inside the rev file */
+ offset = entry->offset;
+ if (offset < rev_file->l2p_offset)
+ {
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset,
+ iterpool2));
+
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_CHANGES)
+ SVN_ERR(copy_item_to_temp(context,
+ context->changes,
+ context->changes_file,
+ rev_file->file, entry,
+ iterpool2));
+ else if (entry->type == SVN_FS_FS__ITEM_TYPE_FILE_PROPS)
+ SVN_ERR(copy_item_to_temp(context,
+ context->file_props,
+ context->file_props_file,
+ rev_file->file, entry,
+ iterpool2));
+ else if (entry->type == SVN_FS_FS__ITEM_TYPE_DIR_PROPS)
+ SVN_ERR(copy_item_to_temp(context,
+ context->dir_props,
+ context->dir_props_file,
+ rev_file->file, entry,
+ iterpool2));
+ else if ( entry->type == SVN_FS_FS__ITEM_TYPE_FILE_REP
+ || entry->type == SVN_FS_FS__ITEM_TYPE_DIR_REP)
+ SVN_ERR(copy_rep_to_temp(context, rev_file->file, entry,
+ iterpool2));
+ else if (entry->type == SVN_FS_FS__ITEM_TYPE_NODEREV)
+ SVN_ERR(copy_node_to_temp(context, rev_file->file, entry,
+ iterpool2));
+ else
+ SVN_ERR_ASSERT(entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED);
+
+ offset += entry->size;
+ }
+ }
+
+ if (context->cancel_func)
+ SVN_ERR(context->cancel_func(context->cancel_baton));
+ }
+ }
+
+ svn_pool_destroy(iterpool2);
+ svn_pool_destroy(iterpool);
+
+ /* phase 3: placement.
+ * Use "newest first" placement for simple items. */
+ sort_items(context->changes);
+ sort_items(context->file_props);
+ sort_items(context->dir_props);
+
+ /* follow dependencies recursively for noderevs and data representations */
+ sort_reps(context);
+
+ /* phase 4: copy bucket data to pack file. Write P2L index. */
+ SVN_ERR(store_items(context, context->changes_file, context->changes,
+ revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(store_items(context, context->file_props_file, context->file_props,
+ revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(store_items(context, context->dir_props_file, context->dir_props,
+ revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(copy_reps_from_temp(context, context->reps_file, revpool));
+ svn_pool_clear(revpool);
+
+ /* write L2P index as well (now that we know all target offsets) */
+ SVN_ERR(write_l2p_index(context, revpool));
+
+ svn_pool_destroy(revpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Append CONTEXT->START_REV to the context's pack file with no re-ordering.
+ * This function will only be used for very large revisions (>>100k changes).
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+append_revision(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = context->fs->fsap_data;
+ apr_off_t offset = 0;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_fs_fs__revision_file_t *rev_file;
+ svn_filesize_t revdata_size;
+
+ /* Copy all non-index contents the rev file to the end of the pack file. */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, context->fs,
+ context->start_rev, pool,
+ iterpool));
+
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ revdata_size = rev_file->l2p_offset;
+
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size, NULL, 0,
+ iterpool));
+ SVN_ERR(copy_file_data(context, context->pack_file, rev_file->file,
+ revdata_size, iterpool));
+
+ /* mark the start of a new revision */
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_revision(context->proto_l2p_index,
+ pool));
+
+ /* read the phys-to-log index file until we covered the whole rev file.
+ * That index contains enough info to build both target indexes from it. */
+ while (offset < revdata_size)
+ {
+ /* read one cluster */
+ int i;
+ apr_array_header_t *entries;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, context->fs, rev_file,
+ context->start_rev, offset,
+ ffd->p2l_page_size, iterpool,
+ iterpool));
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+
+ /* skip first entry if that was duplicated due crossing a
+ cluster boundary */
+ if (offset > entry->offset)
+ continue;
+
+ /* process entry while inside the rev file */
+ offset = entry->offset;
+ if (offset < revdata_size)
+ {
+ entry->offset += context->pack_offset;
+ offset += entry->size;
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(
+ context->proto_l2p_index, entry->offset,
+ entry->item.number, iterpool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(
+ context->proto_p2l_index, entry, iterpool));
+ }
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+ context->pack_offset += revdata_size;
+
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Logical addressing mode packing logic.
+ *
+ * Pack the revision shard starting at SHARD_REV in filesystem FS from
+ * SHARD_DIR into the PACK_FILE_DIR, using POOL for allocations. Limit
+ * the extra memory consumption to MAX_MEM bytes. CANCEL_FUNC and
+ * CANCEL_BATON are what you think they are.
+ */
+static svn_error_t *
+pack_log_addressed(svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_dir,
+ svn_revnum_t shard_rev,
+ apr_size_t max_mem,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ enum
+ {
+ /* estimated amount of memory used to represent one item in memory
+ * during rev file packing */
+ PER_ITEM_MEM = APR_ALIGN_DEFAULT(sizeof(path_order_t))
+ + APR_ALIGN_DEFAULT(2 *sizeof(void*))
+ + APR_ALIGN_DEFAULT(sizeof(reference_t))
+ + APR_ALIGN_DEFAULT(sizeof(svn_fs_fs__p2l_entry_t))
+ + 6 * sizeof(void*)
+ };
+
+ int max_items;
+ apr_array_header_t *max_ids;
+ pack_context_t context = { 0 };
+ int i;
+ apr_size_t item_count = 0;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Prevent integer overflow. We use apr arrays to process the items so
+ * the maximum number of items is INT_MAX. */
+ {
+ apr_size_t temp = max_mem / PER_ITEM_MEM;
+ SVN_ERR_ASSERT(temp <= INT_MAX);
+ max_items = (int)temp;
+ }
+
+ /* set up a pack context */
+ SVN_ERR(initialize_pack_context(&context, fs, pack_file_dir, shard_dir,
+ shard_rev, max_items, cancel_func,
+ cancel_baton, pool));
+
+ /* phase 1: determine the size of the revisions to pack */
+ SVN_ERR(svn_fs_fs__l2p_get_max_ids(&max_ids, fs, shard_rev,
+ context.shard_end_rev - shard_rev,
+ pool, pool));
+
+ /* pack revisions in ranges that don't exceed MAX_MEM */
+ for (i = 0; i < max_ids->nelts; ++i)
+ if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) + item_count <= max_items)
+ {
+ item_count += APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
+ context.end_rev++;
+ }
+ else
+ {
+ svn_pool_clear(iterpool);
+
+ /* some unpacked revisions before this one? */
+ if (context.start_rev < context.end_rev)
+ {
+ /* pack them intelligently (might be just 1 rev but still ...) */
+ SVN_ERR(pack_range(&context, iterpool));
+ SVN_ERR(reset_pack_context(&context, iterpool));
+ item_count = 0;
+ }
+
+ /* next revision range is to start with the current revision */
+ context.start_rev = i + context.shard_rev;
+ context.end_rev = context.start_rev + 1;
+
+ /* if this is a very large revision, we must place it as is */
+ if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) > max_items)
+ {
+ SVN_ERR(append_revision(&context, iterpool));
+ context.start_rev++;
+ }
+ else
+ item_count += (apr_size_t)APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
+ }
+
+ /* non-empty revision range at the end? */
+ if (context.start_rev < context.end_rev)
+ SVN_ERR(pack_range(&context, iterpool));
+
+ /* last phase: finalize indexes and clean up */
+ SVN_ERR(reset_pack_context(&context, iterpool));
+ SVN_ERR(close_pack_context(&context, iterpool));
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Given REV in FS, set *REV_OFFSET to REV's offset in the packed file.
+ Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__get_packed_offset(apr_off_t *rev_offset,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stream_t *manifest_stream;
+ svn_boolean_t is_cached;
+ svn_revnum_t shard;
+ apr_int64_t shard_pos;
+ apr_array_header_t *manifest;
+ apr_pool_t *iterpool;
+
+ shard = rev / ffd->max_files_per_dir;
+
+ /* position of the shard within the manifest */
+ shard_pos = rev % ffd->max_files_per_dir;
+
+ /* fetch exactly that element into *rev_offset, if the manifest is found
+ in the cache */
+ SVN_ERR(svn_cache__get_partial((void **) rev_offset, &is_cached,
+ ffd->packed_offset_cache, &shard,
+ svn_fs_fs__get_sharded_offset, &shard_pos,
+ pool));
+
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* Open the manifest file. */
+ SVN_ERR(svn_stream_open_readonly(&manifest_stream,
+ svn_fs_fs__path_rev_packed(fs, rev,
+ PATH_MANIFEST,
+ pool),
+ pool, pool));
+
+ /* While we're here, let's just read the entire manifest file into an array,
+ so we can cache the entire thing. */
+ iterpool = svn_pool_create(pool);
+ manifest = apr_array_make(pool, ffd->max_files_per_dir, sizeof(apr_off_t));
+ while (1)
+ {
+ svn_boolean_t eof;
+ apr_int64_t val;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__read_number_from_stream(&val, &eof, manifest_stream,
+ iterpool));
+ if (eof)
+ break;
+
+ APR_ARRAY_PUSH(manifest, apr_off_t) = (apr_off_t)val;
+ }
+ svn_pool_destroy(iterpool);
+
+ *rev_offset = APR_ARRAY_IDX(manifest, rev % ffd->max_files_per_dir,
+ apr_off_t);
+
+ /* Close up shop and cache the array. */
+ SVN_ERR(svn_stream_close(manifest_stream));
+ return svn_cache__set(ffd->packed_offset_cache, &shard, manifest, pool);
+}
+
+/* Packing logic for physical addresssing mode:
+ * Simply concatenate all revision contents.
+ *
+ * Pack the revision shard starting at SHARD_REV containing exactly
+ * MAX_FILES_PER_DIR revisions from SHARD_PATH into the PACK_FILE_DIR,
+ * using POOL for allocations. CANCEL_FUNC and CANCEL_BATON are what you
+ * think they are.
+ */
+static svn_error_t *
+pack_phys_addressed(const char *pack_file_dir,
+ const char *shard_path,
+ svn_revnum_t start_rev,
+ int max_files_per_dir,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ const char *pack_file_path, *manifest_file_path;
+ apr_file_t *pack_file;
+ apr_file_t *manifest_file;
+ svn_stream_t *manifest_stream;
+ svn_revnum_t end_rev, rev;
+ apr_off_t next_offset;
+ apr_pool_t *iterpool;
+
+ /* Some useful paths. */
+ pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
+ manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST, pool);
+
+ /* Create the new directory and pack file.
+ * Use unbuffered apr_file_t since we're going to write using 16kb
+ * chunks. */
+ SVN_ERR(svn_io_file_open(&pack_file, pack_file_path,
+ APR_WRITE | APR_CREATE | APR_EXCL,
+ APR_OS_DEFAULT, pool));
+
+ /* Create the manifest file. */
+ SVN_ERR(svn_io_file_open(&manifest_file, manifest_file_path,
+ APR_WRITE | APR_BUFFERED | APR_CREATE | APR_EXCL,
+ APR_OS_DEFAULT, pool));
+ manifest_stream = svn_stream_from_aprfile2(manifest_file, TRUE, pool);
+
+ end_rev = start_rev + max_files_per_dir - 1;
+ next_offset = 0;
+ iterpool = svn_pool_create(pool);
+
+ /* Iterate over the revisions in this shard, squashing them together. */
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ svn_stream_t *rev_stream;
+ apr_finfo_t finfo;
+ const char *path;
+
+ svn_pool_clear(iterpool);
+
+ /* Get the size of the file. */
+ path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
+ iterpool);
+ SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
+
+ /* build manifest */
+ SVN_ERR(svn_stream_printf(manifest_stream, iterpool,
+ "%" APR_OFF_T_FMT "\n", next_offset));
+ next_offset += finfo.size;
+
+ /* Copy all the bits from the rev file to the end of the pack file. */
+ SVN_ERR(svn_stream_open_readonly(&rev_stream, path, iterpool, iterpool));
+ SVN_ERR(svn_stream_copy3(rev_stream,
+ svn_stream_from_aprfile2(pack_file, TRUE, pool),
+ cancel_func, cancel_baton, iterpool));
+ }
+
+ /* Close stream over APR file. */
+ SVN_ERR(svn_stream_close(manifest_stream));
+
+ /* Ensure that pack file is written to disk. */
+ SVN_ERR(svn_io_file_flush_to_disk(manifest_file, pool));
+ SVN_ERR(svn_io_file_close(manifest_file, pool));
+
+ /* disallow write access to the manifest file */
+ SVN_ERR(svn_io_set_file_read_only(manifest_file_path, FALSE, iterpool));
+
+ /* Ensure that pack file is written to disk. */
+ SVN_ERR(svn_io_file_flush_to_disk(pack_file, pool));
+ SVN_ERR(svn_io_file_close(pack_file, pool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* In filesystem FS, pack the revision SHARD containing exactly
+ * MAX_FILES_PER_DIR revisions from SHARD_PATH into the PACK_FILE_DIR,
+ * using POOL for allocations. Try to limit the amount of temporary
+ * memory needed to MAX_MEM bytes. CANCEL_FUNC and CANCEL_BATON are what
+ * you think they are.
+ *
+ * If for some reason we detect a partial packing already performed, we
+ * remove the pack file and start again.
+ *
+ * The actual packing will be done in a format-specific sub-function.
+ */
+static svn_error_t *
+pack_rev_shard(svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_size_t max_mem,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ const char *pack_file_path;
+ svn_revnum_t shard_rev = (svn_revnum_t) (shard * max_files_per_dir);
+
+ /* Some useful paths. */
+ pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
+
+ /* Remove any existing pack file for this shard, since it is incomplete. */
+ SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
+ pool));
+
+ /* Create the new directory and pack file. */
+ SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, pool));
+
+ /* Index information files */
+ if (svn_fs_fs__use_log_addressing(fs))
+ SVN_ERR(pack_log_addressed(fs, pack_file_dir, shard_path, shard_rev,
+ max_mem, cancel_func, cancel_baton, pool));
+ else
+ SVN_ERR(pack_phys_addressed(pack_file_dir, shard_path, shard_rev,
+ max_files_per_dir, cancel_func,
+ cancel_baton, pool));
+
+ SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, pool));
+ SVN_ERR(svn_io_set_file_read_only(pack_file_path, FALSE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton struct used by pack_body(), pack_shard() and synced_pack_shard().
+ These calls are nested and for every level additional fields will be
+ available. */
+struct pack_baton
+{
+ /* Valid when entering pack_body(). */
+ svn_fs_t *fs;
+ svn_fs_pack_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+ size_t max_mem;
+
+ /* Additional entries valid when entering pack_shard(). */
+ const char *revs_dir;
+ const char *revsprops_dir;
+ apr_int64_t shard;
+
+ /* Additional entries valid when entering synced_pack_shard(). */
+ const char *rev_shard_path;
+};
+
+
+/* Part of the pack process that requires global (write) synchronization.
+ * We pack the revision properties of the shard described by BATON and
+ * In the file system at FS_PATH, pack the SHARD in REVS_DIR and replace
+ * the non-packed revprop & rev shard folder(s) with the packed ones.
+ * The packed rev folder has been created prior to calling this function.
+ */
+static svn_error_t *
+synced_pack_shard(void *baton,
+ apr_pool_t *pool)
+{
+ struct pack_baton *pb = baton;
+ fs_fs_data_t *ffd = pb->fs->fsap_data;
+ const char *revprops_shard_path, *revprops_pack_file_dir;
+
+ /* if enabled, pack the revprops in an equivalent way */
+ if (pb->revsprops_dir)
+ {
+ revprops_pack_file_dir = svn_dirent_join(pb->revsprops_dir,
+ apr_psprintf(pool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ pb->shard),
+ pool);
+ revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
+ apr_psprintf(pool, "%" APR_INT64_T_FMT, pb->shard),
+ pool);
+
+ SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
+ revprops_shard_path,
+ pb->shard,
+ ffd->max_files_per_dir,
+ (int)(0.9*ffd->revprop_pack_size),
+ ffd->compress_packed_revprops
+ ? SVN__COMPRESSION_ZLIB_DEFAULT
+ : SVN__COMPRESSION_NONE,
+ pb->cancel_func,
+ pb->cancel_baton,
+ pool));
+ }
+
+ /* Update the min-unpacked-rev file to reflect our newly packed shard. */
+ SVN_ERR(svn_fs_fs__write_min_unpacked_rev(pb->fs,
+ (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir),
+ pool));
+ ffd->min_unpacked_rev
+ = (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir);
+
+ /* Finally, remove the existing shard directories.
+ * For revprops, clean up older obsolete shards as well as they might
+ * have been left over from an interrupted FS upgrade. */
+ SVN_ERR(svn_io_remove_dir2(pb->rev_shard_path, TRUE,
+ pb->cancel_func, pb->cancel_baton, pool));
+ if (pb->revsprops_dir)
+ {
+ svn_node_kind_t kind = svn_node_dir;
+ apr_int64_t to_cleanup = pb->shard;
+ do
+ {
+ SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
+ to_cleanup,
+ ffd->max_files_per_dir,
+ pb->cancel_func,
+ pb->cancel_baton,
+ pool));
+
+ /* If the previous shard exists, clean it up as well.
+ Don't try to clean up shard 0 as it we can't tell quickly
+ whether it actually needs cleaning up. */
+ revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
+ apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
+ pool);
+ SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
+ }
+ while (kind == svn_node_dir && to_cleanup > 0);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Pack the shard described by BATON.
+ *
+ * If for some reason we detect a partial packing already performed,
+ * we remove the pack file and start again.
+ */
+static svn_error_t *
+pack_shard(struct pack_baton *baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = baton->fs->fsap_data;
+ const char *rev_pack_file_dir;
+
+ /* Notify caller we're starting to pack this shard. */
+ if (baton->notify_func)
+ SVN_ERR(baton->notify_func(baton->notify_baton, baton->shard,
+ svn_fs_pack_notify_start, pool));
+
+ /* Some useful paths. */
+ rev_pack_file_dir = svn_dirent_join(baton->revs_dir,
+ apr_psprintf(pool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ baton->shard),
+ pool);
+ baton->rev_shard_path = svn_dirent_join(baton->revs_dir,
+ apr_psprintf(pool,
+ "%" APR_INT64_T_FMT,
+ baton->shard),
+ pool);
+
+ /* pack the revision content */
+ SVN_ERR(pack_rev_shard(baton->fs, rev_pack_file_dir, baton->rev_shard_path,
+ baton->shard, ffd->max_files_per_dir,
+ baton->max_mem, baton->cancel_func,
+ baton->cancel_baton, pool));
+
+ /* For newer repo formats, we only acquired the pack lock so far.
+ Before modifying the repo state by switching over to the packed
+ data, we need to acquire the global (write) lock. */
+ if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
+ SVN_ERR(svn_fs_fs__with_write_lock(baton->fs, synced_pack_shard, baton,
+ pool));
+ else
+ SVN_ERR(synced_pack_shard(baton, pool));
+
+ /* Notify caller we're starting to pack this shard. */
+ if (baton->notify_func)
+ SVN_ERR(baton->notify_func(baton->notify_baton, baton->shard,
+ svn_fs_pack_notify_end, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* The work-horse for svn_fs_fs__pack, called with the FS write lock.
+ This implements the svn_fs_fs__with_write_lock() 'body' callback
+ type. BATON is a 'struct pack_baton *'.
+
+ WARNING: if you add a call to this function, please note:
+ The code currently assumes that any piece of code running with
+ the write-lock set can rely on the ffd->min_unpacked_rev and
+ ffd->min_unpacked_revprop caches to be up-to-date (and, by
+ extension, on not having to use a retry when calling
+ svn_fs_fs__path_rev_absolute() and friends). If you add a call
+ to this function, consider whether you have to call
+ svn_fs_fs__update_min_unpacked_rev().
+ See this thread: http://thread.gmane.org/1291206765.3782.3309.camel@edith
+ */
+static svn_error_t *
+pack_body(void *baton,
+ apr_pool_t *pool)
+{
+ struct pack_baton *pb = baton;
+ fs_fs_data_t *ffd = pb->fs->fsap_data;
+ apr_int64_t completed_shards;
+ svn_revnum_t youngest;
+ apr_pool_t *iterpool;
+
+ /* If the repository isn't a new enough format, we don't support packing.
+ Return a friendly error to that effect. */
+ if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
+ ffd->format);
+
+ /* If we aren't using sharding, we can't do any packing, so quit. */
+ if (!ffd->max_files_per_dir)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs,
+ pool));
+
+ SVN_ERR(svn_fs_fs__youngest_rev(&youngest, pb->fs, pool));
+ completed_shards = (youngest + 1) / ffd->max_files_per_dir;
+
+ /* See if we've already completed all possible shards thus far. */
+ if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+ return SVN_NO_ERROR;
+
+ pb->revs_dir = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
+ if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
+ pb->revsprops_dir = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
+ pool);
+
+ iterpool = svn_pool_create(pool);
+ for (pb->shard = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+ pb->shard < completed_shards;
+ pb->shard++)
+ {
+ svn_pool_clear(iterpool);
+
+ if (pb->cancel_func)
+ SVN_ERR(pb->cancel_func(pb->cancel_baton));
+
+ SVN_ERR(pack_shard(pb, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__pack(svn_fs_t *fs,
+ apr_size_t max_mem,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ struct pack_baton pb = { 0 };
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_error_t *err;
+
+ pb.fs = fs;
+ pb.notify_func = notify_func;
+ pb.notify_baton = notify_baton;
+ pb.cancel_func = cancel_func;
+ pb.cancel_baton = cancel_baton;
+ pb.max_mem = max_mem ? max_mem : DEFAULT_MAX_MEM;
+
+ if (ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT)
+ {
+ /* Newer repositories provide a pack operation specific lock.
+ Acquire it to prevent concurrent packs.
+
+ Since the file lock's lifetime is bound to a pool, we create a
+ separate subpool here to release the lock immediately after the
+ operation finished.
+ */
+ err = svn_fs_fs__with_pack_lock(fs, pack_body, &pb, pool);
+ }
+ else
+ {
+ /* Use the global write lock for older repos. */
+ err = svn_fs_fs__with_write_lock(fs, pack_body, &pb, pool);
+ }
+
+ return svn_error_trace(err);
+}
diff --git a/subversion/libsvn_fs_fs/pack.h b/subversion/libsvn_fs_fs/pack.h
new file mode 100644
index 0000000..b11f999
--- /dev/null
+++ b/subversion/libsvn_fs_fs/pack.h
@@ -0,0 +1,70 @@
+/* pack.h : interface FSFS pack functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__PACK_H
+#define SVN_LIBSVN_FS__PACK_H
+
+#include "fs.h"
+
+/* Possibly pack the repository at PATH. This just take full shards, and
+ combines all the revision files into a single one, with a manifest header
+ when required by the repository format.
+
+ MAX_MEM limits the size of in-memory data structures needed for reordering
+ items in format 7 repositories. 0 means use the built-in default.
+
+ If given, NOTIFY_FUNC will be called with NOTIFY_BATON to report progress.
+ Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
+
+ Existing filesystem references need not change. */
+svn_error_t *
+svn_fs_fs__pack(svn_fs_t *fs,
+ apr_size_t max_mem,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool);
+
+/**
+ * For the packed revision @a rev in @a fs, determine the offset within
+ * the revision pack file and return it in @a rev_offset. Use @a pool for
+ * allocations.
+ */
+svn_error_t *
+svn_fs_fs__get_packed_offset(apr_off_t *rev_offset,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the svn_dir_entry_t* objects of DIRECTORY in an APR array
+ * allocated in RESULT_POOL with entries added in storage (on-disk) order.
+ * FS' format will be used to pick the optimal ordering strategy. Use
+ * SCRATCH_POOL for temporary allocations.
+ */
+apr_array_header_t *
+svn_fs_fs__order_dir_entries(svn_fs_t *fs,
+ apr_hash_t *directory,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/recovery.c b/subversion/libsvn_fs_fs/recovery.c
new file mode 100644
index 0000000..125d47a
--- /dev/null
+++ b/subversion/libsvn_fs_fs/recovery.c
@@ -0,0 +1,509 @@
+/* recovery.c --- FSFS recovery functionality
+*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "recovery.h"
+
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "private/svn_string_private.h"
+
+#include "index.h"
+#include "low_level.h"
+#include "rep-cache.h"
+#include "revprops.h"
+#include "util.h"
+#include "cached_data.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Part of the recovery procedure. Return the largest revision *REV in
+ filesystem FS. Use POOL for temporary allocation. */
+static svn_error_t *
+recover_get_largest_revision(svn_fs_t *fs, svn_revnum_t *rev, apr_pool_t *pool)
+{
+ /* Discovering the largest revision in the filesystem would be an
+ expensive operation if we did a readdir() or searched linearly,
+ so we'll do a form of binary search. left is a revision that we
+ know exists, right a revision that we know does not exist. */
+ apr_pool_t *iterpool;
+ svn_revnum_t left, right = 1;
+
+ iterpool = svn_pool_create(pool);
+ /* Keep doubling right, until we find a revision that doesn't exist. */
+ while (1)
+ {
+ svn_error_t *err;
+ svn_fs_fs__revision_file_t *file;
+ svn_pool_clear(iterpool);
+
+ err = svn_fs_fs__open_pack_or_rev_file(&file, fs, right, iterpool,
+ iterpool);
+ if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
+ {
+ svn_error_clear(err);
+ break;
+ }
+ else
+ SVN_ERR(err);
+
+ right <<= 1;
+ }
+
+ left = right >> 1;
+
+ /* We know that left exists and right doesn't. Do a normal bsearch to find
+ the last revision. */
+ while (left + 1 < right)
+ {
+ svn_revnum_t probe = left + ((right - left) / 2);
+ svn_error_t *err;
+ svn_fs_fs__revision_file_t *file;
+ svn_pool_clear(iterpool);
+
+ err = svn_fs_fs__open_pack_or_rev_file(&file, fs, probe, iterpool,
+ iterpool);
+ if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
+ {
+ svn_error_clear(err);
+ right = probe;
+ }
+ else
+ {
+ SVN_ERR(err);
+ left = probe;
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ /* left is now the largest revision that exists. */
+ *rev = left;
+ return SVN_NO_ERROR;
+}
+
+/* A baton for reading a fixed amount from an open file. For
+ recover_find_max_ids() below. */
+struct recover_read_from_file_baton
+{
+ svn_stream_t *stream;
+ apr_pool_t *pool;
+ apr_off_t remaining;
+};
+
+/* A stream read handler used by recover_find_max_ids() below.
+ Read and return at most BATON->REMAINING bytes from the stream,
+ returning nothing after that to indicate EOF. */
+static svn_error_t *
+read_handler_recover(void *baton, char *buffer, apr_size_t *len)
+{
+ struct recover_read_from_file_baton *b = baton;
+ apr_size_t bytes_to_read = *len;
+
+ if (b->remaining == 0)
+ {
+ /* Return a successful read of zero bytes to signal EOF. */
+ *len = 0;
+ return SVN_NO_ERROR;
+ }
+
+ if ((apr_int64_t)bytes_to_read > (apr_int64_t)b->remaining)
+ bytes_to_read = (apr_size_t)b->remaining;
+ b->remaining -= bytes_to_read;
+
+ return svn_stream_read_full(b->stream, buffer, &bytes_to_read);
+}
+
+/* Part of the recovery procedure. Read the directory noderev at offset
+ OFFSET of file REV_FILE (the revision file of revision REV of
+ filesystem FS), and set MAX_NODE_ID and MAX_COPY_ID to be the node-id
+ and copy-id of that node, if greater than the current value stored
+ in either. Recurse into any child directories that were modified in
+ this revision.
+
+ MAX_NODE_ID and MAX_COPY_ID must be arrays of at least MAX_KEY_SIZE.
+
+ Perform temporary allocation in POOL. */
+static svn_error_t *
+recover_find_max_ids(svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_off_t offset,
+ apr_uint64_t *max_node_id,
+ apr_uint64_t *max_copy_id,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__rep_header_t *header;
+ struct recover_read_from_file_baton baton;
+ svn_stream_t *stream;
+ apr_hash_t *entries;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ node_revision_t *noderev;
+ svn_error_t *err;
+
+ baton.stream = rev_file->stream;
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset, pool));
+ SVN_ERR(svn_fs_fs__read_noderev(&noderev, baton.stream, pool, pool));
+
+ /* Check that this is a directory. It should be. */
+ if (noderev->kind != svn_node_dir)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Recovery encountered a non-directory node"));
+
+ /* Get the data location. No data location indicates an empty directory. */
+ if (!noderev->data_rep)
+ return SVN_NO_ERROR;
+
+ /* If the directory's data representation wasn't changed in this revision,
+ we've already scanned the directory's contents for noderevs, so we don't
+ need to again. This will occur if a property is changed on a directory
+ without changing the directory's contents. */
+ if (noderev->data_rep->revision != rev)
+ return SVN_NO_ERROR;
+
+ /* We could use get_dir_contents(), but this is much cheaper. It does
+ rely on directory entries being stored as PLAIN reps, though. */
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, rev, NULL,
+ noderev->data_rep->item_index, pool));
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset, pool));
+ SVN_ERR(svn_fs_fs__read_rep_header(&header, baton.stream, pool, pool));
+ if (header->type != svn_fs_fs__rep_plain)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Recovery encountered a deltified directory "
+ "representation"));
+
+ /* Now create a stream that's allowed to read only as much data as is
+ stored in the representation. Note that this is a directory, i.e.
+ represented using the hash format on disk and can never have 0 length. */
+ baton.pool = pool;
+ baton.remaining = noderev->data_rep->expanded_size
+ ? noderev->data_rep->expanded_size
+ : noderev->data_rep->size;
+ stream = svn_stream_create(&baton, pool);
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_handler_recover);
+
+ /* Now read the entries from that stream. */
+ entries = apr_hash_make(pool);
+ err = svn_hash_read2(entries, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed representation for node-revision '%s'"),
+ id_str->data);
+ }
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Now check each of the entries in our directory to find new node and
+ copy ids, and recurse into new subdirectories. */
+ iterpool = svn_pool_create(pool);
+ for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
+ {
+ char *str_val;
+ char *str;
+ svn_node_kind_t kind;
+ const svn_fs_id_t *id;
+ const svn_fs_fs__id_part_t *rev_item;
+ apr_uint64_t node_id, copy_id;
+ apr_off_t child_dir_offset;
+ const svn_string_t *path = apr_hash_this_val(hi);
+
+ svn_pool_clear(iterpool);
+
+ str_val = apr_pstrdup(iterpool, path->data);
+
+ str = svn_cstring_tokenize(" ", &str_val);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt"));
+
+ if (strcmp(str, SVN_FS_FS__KIND_FILE) == 0)
+ kind = svn_node_file;
+ else if (strcmp(str, SVN_FS_FS__KIND_DIR) == 0)
+ kind = svn_node_dir;
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt"));
+ }
+
+ str = svn_cstring_tokenize(" ", &str_val);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt"));
+
+ SVN_ERR(svn_fs_fs__id_parse(&id, str, iterpool));
+
+ rev_item = svn_fs_fs__id_rev_item(id);
+ if (rev_item->revision != rev)
+ {
+ /* If the node wasn't modified in this revision, we've already
+ checked the node and copy id. */
+ continue;
+ }
+
+ node_id = svn_fs_fs__id_node_id(id)->number;
+ copy_id = svn_fs_fs__id_copy_id(id)->number;
+
+ if (node_id > *max_node_id)
+ *max_node_id = node_id;
+ if (copy_id > *max_copy_id)
+ *max_copy_id = copy_id;
+
+ if (kind == svn_node_file)
+ continue;
+
+ SVN_ERR(svn_fs_fs__item_offset(&child_dir_offset, fs,
+ rev_file, rev, NULL, rev_item->number,
+ iterpool));
+ SVN_ERR(recover_find_max_ids(fs, rev, rev_file, child_dir_offset,
+ max_node_id, max_copy_id, iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Part of the recovery procedure. Given an open non-packed revision file
+ REV_FILE for REV, locate the trailer that specifies the offset to the root
+ node-id and store this offset in *ROOT_OFFSET. Do temporary allocations in
+ POOL. */
+static svn_error_t *
+recover_get_root_offset(apr_off_t *root_offset,
+ svn_revnum_t rev,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_pool_t *pool)
+{
+ char buffer[64];
+ svn_stringbuf_t *trailer;
+ apr_off_t start;
+ apr_off_t end;
+ apr_size_t len;
+
+ SVN_ERR_ASSERT(!rev_file->is_packed);
+
+ /* We will assume that the last line containing the two offsets (to the root
+ node-id and to the changed path information) will never be longer than 64
+ characters. */
+ end = 0;
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_END, &end, pool));
+
+ if (end < sizeof(buffer))
+ {
+ len = (apr_size_t)end;
+ start = 0;
+ }
+ else
+ {
+ len = sizeof(buffer);
+ start = end - sizeof(buffer);
+ }
+
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &start, pool));
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, buffer, len,
+ NULL, NULL, pool));
+
+ trailer = svn_stringbuf_ncreate(buffer, len, pool);
+ SVN_ERR(svn_fs_fs__parse_revision_trailer(root_offset, NULL, trailer, rev));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton used for recover_body below. */
+struct recover_baton {
+ svn_fs_t *fs;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+};
+
+/* The work-horse for svn_fs_fs__recover, called with the FS
+ write lock. This implements the svn_fs_fs__with_write_lock()
+ 'body' callback type. BATON is a 'struct recover_baton *'. */
+static svn_error_t *
+recover_body(void *baton, apr_pool_t *pool)
+{
+ struct recover_baton *b = baton;
+ svn_fs_t *fs = b->fs;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_revnum_t max_rev;
+ apr_uint64_t next_node_id = 0;
+ apr_uint64_t next_copy_id = 0;
+ svn_revnum_t youngest_rev;
+ svn_node_kind_t youngest_revprops_kind;
+
+ /* The admin may have created a plain copy of this repo before attempting
+ to recover it (hotcopy may or may not work with corrupted repos).
+ Bump the instance ID. */
+ SVN_ERR(svn_fs_fs__set_uuid(fs, fs->uuid, NULL, pool));
+
+ /* We need to know the largest revision in the filesystem. */
+ SVN_ERR(recover_get_largest_revision(fs, &max_rev, pool));
+
+ /* Get the expected youngest revision */
+ SVN_ERR(svn_fs_fs__youngest_rev(&youngest_rev, fs, pool));
+
+ /* Policy note:
+
+ Since the revprops file is written after the revs file, the true
+ maximum available revision is the youngest one for which both are
+ present. That's probably the same as the max_rev we just found,
+ but if it's not, we could, in theory, repeatedly decrement
+ max_rev until we find a revision that has both a revs and
+ revprops file, then write db/current with that.
+
+ But we choose not to. If a repository is so corrupt that it's
+ missing at least one revprops file, we shouldn't assume that the
+ youngest revision for which both the revs and revprops files are
+ present is healthy. In other words, we're willing to recover
+ from a missing or out-of-date db/current file, because db/current
+ is truly redundant -- it's basically a cache so we don't have to
+ find max_rev each time, albeit a cache with unusual semantics,
+ since it also officially defines when a revision goes live. But
+ if we're missing more than the cache, it's time to back out and
+ let the admin reconstruct things by hand: correctness at that
+ point may depend on external things like checking a commit email
+ list, looking in particular working copies, etc.
+
+ This policy matches well with a typical naive backup scenario.
+ Say you're rsyncing your FSFS repository nightly to the same
+ location. Once revs and revprops are written, you've got the
+ maximum rev; if the backup should bomb before db/current is
+ written, then db/current could stay arbitrarily out-of-date, but
+ we can still recover. It's a small window, but we might as well
+ do what we can. */
+
+ /* Even if db/current were missing, it would be created with 0 by
+ get_youngest(), so this conditional remains valid. */
+ if (youngest_rev > max_rev)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Expected current rev to be <= %ld "
+ "but found %ld"), max_rev, youngest_rev);
+
+ /* We only need to search for maximum IDs for old FS formats which
+ se global ID counters. */
+ if (ffd->format < SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ {
+ /* Next we need to find the maximum node id and copy id in use across the
+ filesystem. Unfortunately, the only way we can get this information
+ is to scan all the noderevs of all the revisions and keep track as
+ we go along. */
+ svn_revnum_t rev;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ for (rev = 0; rev <= max_rev; rev++)
+ {
+ svn_fs_fs__revision_file_t *rev_file;
+ apr_off_t root_offset;
+
+ svn_pool_clear(iterpool);
+
+ if (b->cancel_func)
+ SVN_ERR(b->cancel_func(b->cancel_baton));
+
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rev, pool,
+ iterpool));
+ SVN_ERR(recover_get_root_offset(&root_offset, rev, rev_file, pool));
+ SVN_ERR(recover_find_max_ids(fs, rev, rev_file, root_offset,
+ &next_node_id, &next_copy_id, pool));
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+ }
+ svn_pool_destroy(iterpool);
+
+ /* Now that we finally have the maximum revision, node-id and copy-id, we
+ can bump the two ids to get the next of each. */
+ next_node_id++;
+ next_copy_id++;
+ }
+
+ /* Before setting current, verify that there is a revprops file
+ for the youngest revision. (Issue #2992) */
+ SVN_ERR(svn_io_check_path(svn_fs_fs__path_revprops(fs, max_rev, pool),
+ &youngest_revprops_kind, pool));
+ if (youngest_revprops_kind == svn_node_none)
+ {
+ svn_boolean_t missing = TRUE;
+ if (!svn_fs_fs__packed_revprop_available(&missing, fs, max_rev, pool))
+ {
+ if (missing)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a revs file but no "
+ "revprops file"),
+ max_rev);
+ }
+ else
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a revs file but the "
+ "revprops file is inaccessible"),
+ max_rev);
+ }
+ }
+ }
+ else if (youngest_revprops_kind != svn_node_file)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a non-file where its "
+ "revprops file should be"),
+ max_rev);
+ }
+
+ /* Prune younger-than-(newfound-youngest) revisions from the rep
+ cache if sharing is enabled taking care not to create the cache
+ if it does not exist. */
+ if (ffd->rep_sharing_allowed)
+ {
+ svn_boolean_t rep_cache_exists;
+
+ SVN_ERR(svn_fs_fs__exists_rep_cache(&rep_cache_exists, fs, pool));
+ if (rep_cache_exists)
+ SVN_ERR(svn_fs_fs__del_rep_reference(fs, max_rev, pool));
+ }
+
+ /* Now store the discovered youngest revision, and the next IDs if
+ relevant, in a new 'current' file. */
+ return svn_fs_fs__write_current(fs, max_rev, next_node_id, next_copy_id,
+ pool);
+}
+
+/* This implements the fs_library_vtable_t.recover() API. */
+svn_error_t *
+svn_fs_fs__recover(svn_fs_t *fs,
+ svn_cancel_func_t cancel_func, void *cancel_baton,
+ apr_pool_t *pool)
+{
+ struct recover_baton b;
+
+ /* We have no way to take out an exclusive lock in FSFS, so we're
+ restricted as to the types of recovery we can do. Luckily,
+ we just want to recreate the 'current' file, and we can do that just
+ by blocking other writers. */
+ b.fs = fs;
+ b.cancel_func = cancel_func;
+ b.cancel_baton = cancel_baton;
+ return svn_fs_fs__with_all_locks(fs, recover_body, &b, pool);
+}
diff --git a/subversion/libsvn_fs_fs/recovery.h b/subversion/libsvn_fs_fs/recovery.h
new file mode 100644
index 0000000..5a6b68a
--- /dev/null
+++ b/subversion/libsvn_fs_fs/recovery.h
@@ -0,0 +1,36 @@
+/* recovery.h : interface to the FSFS recovery functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__RECOVERY_H
+#define SVN_LIBSVN_FS__RECOVERY_H
+
+#include "fs.h"
+
+/* Recover the fsfs associated with filesystem FS.
+ Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
+ Use POOL for temporary allocations. */
+svn_error_t *svn_fs_fs__recover(svn_fs_t *fs,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/rep-cache-db.h b/subversion/libsvn_fs_fs/rep-cache-db.h
index 255ea07..0f2cc89 100644
--- a/subversion/libsvn_fs_fs/rep-cache-db.h
+++ b/subversion/libsvn_fs_fs/rep-cache-db.h
@@ -1,4 +1,4 @@
-/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.8.13/subversion/libsvn_fs_fs/token-map.h.
+/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_fs_fs/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_CREATE_SCHEMA 0
@@ -58,6 +58,12 @@
"INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0) " \
""
+#define STMT_UNLOCK_REP 7
+#define STMT_7_INFO {"STMT_UNLOCK_REP", NULL}
+#define STMT_7 \
+ "ROLLBACK TRANSACTION; " \
+ ""
+
#define REP_CACHE_DB_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
@@ -67,6 +73,7 @@
STMT_4, \
STMT_5, \
STMT_6, \
+ STMT_7, \
NULL \
}
@@ -79,5 +86,6 @@
STMT_4_INFO, \
STMT_5_INFO, \
STMT_6_INFO, \
+ STMT_7_INFO, \
{NULL, NULL} \
}
diff --git a/subversion/libsvn_fs_fs/rep-cache-db.sql b/subversion/libsvn_fs_fs/rep-cache-db.sql
index b88c3e0..caaac33 100644
--- a/subversion/libsvn_fs_fs/rep-cache-db.sql
+++ b/subversion/libsvn_fs_fs/rep-cache-db.sql
@@ -63,3 +63,6 @@ WHERE revision > ?1
-- STMT_LOCK_REP
BEGIN TRANSACTION;
INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0)
+
+-- STMT_UNLOCK_REP
+ROLLBACK TRANSACTION;
diff --git a/subversion/libsvn_fs_fs/rep-cache.c b/subversion/libsvn_fs_fs/rep-cache.c
index 0082266..437d603 100644
--- a/subversion/libsvn_fs_fs/rep-cache.c
+++ b/subversion/libsvn_fs_fs/rep-cache.c
@@ -50,19 +50,12 @@ path_rep_cache_db(const char *fs_path,
return svn_dirent_join(fs_path, REP_CACHE_DB_NAME, result_pool);
}
-/* Check that REP refers to a revision that exists in FS. */
-static svn_error_t *
-rep_has_been_born(representation_t *rep,
- svn_fs_t *fs,
- apr_pool_t *pool)
-{
- SVN_ERR_ASSERT(rep);
-
- SVN_ERR(svn_fs_fs__revision_exists(rep->revision, fs, pool));
-
- return SVN_NO_ERROR;
-}
-
+#define SVN_ERR_CLOSE(x, db) do \
+{ \
+ svn_error_t *svn__err = (x); \
+ if (svn__err) \
+ return svn_error_compose_create(svn__err, svn_sqlite__close(db)); \
+} while (0)
/** Library-private API's. **/
@@ -81,7 +74,7 @@ open_rep_cache(void *baton,
int version;
/* Open (or create) the sqlite database. It will be automatically
- closed when fs->pool is destoyed. */
+ closed when fs->pool is destroyed. */
db_path = path_rep_cache_db(fs->path, pool);
#ifndef WIN32
{
@@ -94,7 +87,7 @@ open_rep_cache(void *baton,
if (!exists)
{
const char *current = svn_fs_fs__path_current(fs, pool);
- svn_error_t *err = svn_io_file_create(db_path, "", pool);
+ svn_error_t *err = svn_io_file_create_empty(db_path, pool);
if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
/* A real error. */
@@ -110,15 +103,15 @@ open_rep_cache(void *baton,
#endif
SVN_ERR(svn_sqlite__open(&sdb, db_path,
svn_sqlite__mode_rwcreate, statements,
- 0, NULL,
+ 0, NULL, 0,
fs->pool, pool));
- SVN_ERR(svn_sqlite__read_schema_version(&version, sdb, pool));
+ SVN_ERR_CLOSE(svn_sqlite__read_schema_version(&version, sdb, pool), sdb);
if (version < REP_CACHE_SCHEMA_FORMAT)
{
/* Must be 0 -- an uninitialized (no schema) database. Create
the schema. Results in schema version of 1. */
- SVN_ERR(svn_sqlite__exec_statements(sdb, STMT_CREATE_SCHEMA));
+ SVN_ERR_CLOSE(svn_sqlite__exec_statements(sdb, STMT_CREATE_SCHEMA), sdb);
}
/* This is used as a flag that the database is available so don't
@@ -135,7 +128,25 @@ svn_fs_fs__open_rep_cache(svn_fs_t *fs,
fs_fs_data_t *ffd = fs->fsap_data;
svn_error_t *err = svn_atomic__init_once(&ffd->rep_cache_db_opened,
open_rep_cache, fs, pool);
- return svn_error_quick_wrap(err, _("Couldn't open rep-cache database"));
+ return svn_error_quick_wrapf(err,
+ _("Couldn't open rep-cache database '%s'"),
+ svn_dirent_local_style(
+ path_rep_cache_db(fs->path, pool), pool));
+}
+
+svn_error_t *
+svn_fs_fs__close_rep_cache(svn_fs_t *fs)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (ffd->rep_cache_db)
+ {
+ SVN_ERR(svn_sqlite__close(ffd->rep_cache_db));
+ ffd->rep_cache_db = NULL;
+ ffd->rep_cache_db_opened = 0;
+ }
+
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -188,7 +199,7 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
max = svn_sqlite__column_revnum(stmt, 0);
SVN_ERR(svn_sqlite__reset(stmt));
if (SVN_IS_VALID_REVNUM(max)) /* The rep-cache could be empty. */
- SVN_ERR(svn_fs_fs__revision_exists(max, fs, iterpool));
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(max, fs, iterpool));
}
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
@@ -203,6 +214,7 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
representation_t *rep;
const char *sha1_digest;
svn_error_t *err;
+ svn_checksum_t *checksum;
/* Clear ITERPOOL occasionally. */
if (iterations++ % 16 == 0)
@@ -218,14 +230,17 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
/* Construct a representation_t. */
rep = apr_pcalloc(iterpool, sizeof(*rep));
+ svn_fs_fs__id_txn_reset(&rep->txn_id);
sha1_digest = svn_sqlite__column_text(stmt, 0, iterpool);
- err = svn_checksum_parse_hex(&rep->sha1_checksum,
- svn_checksum_sha1, sha1_digest,
- iterpool);
+ err = svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
+ sha1_digest, iterpool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ rep->has_sha1 = TRUE;
+ memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
rep->revision = svn_sqlite__column_revnum(stmt, 1);
- rep->offset = svn_sqlite__column_int64(stmt, 2);
+ rep->item_index = svn_sqlite__column_int64(stmt, 2);
rep->size = svn_sqlite__column_int64(stmt, 3);
rep->expanded_size = svn_sqlite__column_int64(stmt, 4);
@@ -275,9 +290,12 @@ svn_fs_fs__get_rep_reference(representation_t **rep,
if (have_row)
{
*rep = apr_pcalloc(pool, sizeof(**rep));
- (*rep)->sha1_checksum = svn_checksum_dup(checksum, pool);
+ svn_fs_fs__id_txn_reset(&(*rep)->txn_id);
+ memcpy((*rep)->sha1_digest, checksum->digest,
+ sizeof((*rep)->sha1_digest));
+ (*rep)->has_sha1 = TRUE;
(*rep)->revision = svn_sqlite__column_revnum(stmt, 0);
- (*rep)->offset = svn_sqlite__column_int64(stmt, 1);
+ (*rep)->item_index = svn_sqlite__column_int64(stmt, 1);
(*rep)->size = svn_sqlite__column_int64(stmt, 2);
(*rep)->expanded_size = svn_sqlite__column_int64(stmt, 3);
}
@@ -287,7 +305,16 @@ svn_fs_fs__get_rep_reference(representation_t **rep,
SVN_ERR(svn_sqlite__reset(stmt));
if (*rep)
- SVN_ERR(rep_has_been_born(*rep, fs, pool));
+ {
+ /* Check that REP refers to a revision that exists in FS. */
+ svn_error_t *err = svn_fs_fs__ensure_revision_exists((*rep)->revision,
+ fs, pool);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Checksum '%s' in rep-cache is beyond HEAD",
+ svn_checksum_to_cstring_display(checksum,
+ pool));
+ }
return SVN_NO_ERROR;
}
@@ -295,28 +322,30 @@ svn_fs_fs__get_rep_reference(representation_t **rep,
svn_error_t *
svn_fs_fs__set_rep_reference(svn_fs_t *fs,
representation_t *rep,
- svn_boolean_t reject_dup,
apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
svn_sqlite__stmt_t *stmt;
svn_error_t *err;
+ svn_checksum_t checksum;
+ checksum.kind = svn_checksum_sha1;
+ checksum.digest = rep->sha1_digest;
SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
if (! ffd->rep_cache_db)
SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* We only allow SHA1 checksums in this table. */
- if (rep->sha1_checksum == NULL)
+ if (! rep->has_sha1)
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
_("Only SHA1 checksums can be used as keys in the "
"rep_cache table.\n"));
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db, STMT_SET_REP));
SVN_ERR(svn_sqlite__bindf(stmt, "siiii",
- svn_checksum_to_cstring(rep->sha1_checksum, pool),
+ svn_checksum_to_cstring(&checksum, pool),
(apr_int64_t) rep->revision,
- (apr_int64_t) rep->offset,
+ (apr_int64_t) rep->item_index,
(apr_int64_t) rep->size,
(apr_int64_t) rep->expanded_size));
@@ -331,35 +360,11 @@ svn_fs_fs__set_rep_reference(svn_fs_t *fs,
svn_error_clear(err);
/* Constraint failed so the mapping for SHA1_CHECKSUM->REP
- should exist. If so, and the value is the same one we were
- about to write, that's cool -- just do nothing. If, however,
- the value is *different*, that's a red flag! */
- SVN_ERR(svn_fs_fs__get_rep_reference(&old_rep, fs, rep->sha1_checksum,
- pool));
+ should exist. If so that's cool -- just do nothing. If not,
+ that's a red flag! */
+ SVN_ERR(svn_fs_fs__get_rep_reference(&old_rep, fs, &checksum, pool));
- if (old_rep)
- {
- if (reject_dup && ((old_rep->revision != rep->revision)
- || (old_rep->offset != rep->offset)
- || (old_rep->size != rep->size)
- || (old_rep->expanded_size != rep->expanded_size)))
- return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
- apr_psprintf(pool,
- _("Representation key for checksum '%%s' exists "
- "in filesystem '%%s' with a different value "
- "(%%ld,%%%s,%%%s,%%%s) than what we were about "
- "to store (%%ld,%%%s,%%%s,%%%s)"),
- APR_OFF_T_FMT, SVN_FILESIZE_T_FMT,
- SVN_FILESIZE_T_FMT, APR_OFF_T_FMT,
- SVN_FILESIZE_T_FMT, SVN_FILESIZE_T_FMT),
- svn_checksum_to_cstring_display(rep->sha1_checksum, pool),
- fs->path, old_rep->revision, old_rep->offset, old_rep->size,
- old_rep->expanded_size, rep->revision, rep->offset, rep->size,
- rep->expanded_size);
- else
- return SVN_NO_ERROR;
- }
- else
+ if (!old_rep)
{
/* Something really odd at this point, we failed to insert the
checksum AND failed to read an existing checksum. Do we need
@@ -391,9 +396,13 @@ svn_fs_fs__del_rep_reference(svn_fs_t *fs,
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_fs_fs__lock_rep_cache(svn_fs_t *fs,
- apr_pool_t *pool)
+/* Start a transaction to take an SQLite reserved lock that prevents
+ other writes.
+
+ See unlock_rep_cache(). */
+static svn_error_t *
+lock_rep_cache(svn_fs_t *fs,
+ apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
@@ -404,3 +413,31 @@ svn_fs_fs__lock_rep_cache(svn_fs_t *fs,
return SVN_NO_ERROR;
}
+
+/* End the transaction started by lock_rep_cache(). */
+static svn_error_t *
+unlock_rep_cache(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ SVN_ERR_ASSERT(ffd->rep_cache_db); /* was opened by lock_rep_cache() */
+
+ SVN_ERR(svn_sqlite__exec_statements(ffd->rep_cache_db, STMT_UNLOCK_REP));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__with_rep_cache_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *,
+ apr_pool_t *),
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_error_t *err;
+
+ SVN_ERR(lock_rep_cache(fs, pool));
+ err = body(baton, pool);
+ return svn_error_compose_create(err, unlock_rep_cache(fs, pool));
+}
diff --git a/subversion/libsvn_fs_fs/rep-cache.h b/subversion/libsvn_fs_fs/rep-cache.h
index 3ccb056..75072a0 100644
--- a/subversion/libsvn_fs_fs/rep-cache.h
+++ b/subversion/libsvn_fs_fs/rep-cache.h
@@ -40,6 +40,10 @@ svn_error_t *
svn_fs_fs__open_rep_cache(svn_fs_t *fs,
apr_pool_t *pool);
+/* Close the rep cache database associated with FS. */
+svn_error_t *
+svn_fs_fs__close_rep_cache(svn_fs_t *fs);
+
/* Set *EXISTS to TRUE iff the rep-cache DB file exists. */
svn_error_t *
svn_fs_fs__exists_rep_cache(svn_boolean_t *exists,
@@ -61,7 +65,8 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *fs,
/* Return the representation REP in FS which has fulltext CHECKSUM.
REP is allocated in POOL. If the rep cache database has not been
- opened, just set *REP to NULL. */
+ opened, just set *REP to NULL. Returns SVN_ERR_FS_CORRUPT if
+ a reference beyond HEAD is detected. */
svn_error_t *
svn_fs_fs__get_rep_reference(representation_t **rep,
svn_fs_t *fs,
@@ -69,16 +74,13 @@ svn_fs_fs__get_rep_reference(representation_t **rep,
apr_pool_t *pool);
/* Set the representation REP in FS, using REP->CHECKSUM.
- Use POOL for temporary allocations.
-
- If the rep cache database has not been opened, this may be a no op.
+ Use POOL for temporary allocations. Returns SVN_ERR_FS_CORRUPT if
+ an existing reference beyond HEAD is detected.
- If REJECT_DUP is TRUE, return an error if there is an existing
- match for REP->CHECKSUM. */
+ If the rep cache database has not been opened, this may be a no op. */
svn_error_t *
svn_fs_fs__set_rep_reference(svn_fs_t *fs,
representation_t *rep,
- svn_boolean_t reject_dup,
apr_pool_t *pool);
/* Delete from the cache all reps corresponding to revisions younger
@@ -89,10 +91,14 @@ svn_fs_fs__del_rep_reference(svn_fs_t *fs,
apr_pool_t *pool);
/* Start a transaction to take an SQLite reserved lock that prevents
- other writes. */
+ other writes, call BODY, end the transaction, and return what BODY returned.
+ */
svn_error_t *
-svn_fs_fs__lock_rep_cache(svn_fs_t *fs,
- apr_pool_t *pool);
+svn_fs_fs__with_rep_cache_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
#ifdef __cplusplus
}
diff --git a/subversion/libsvn_fs_fs/rev_file.c b/subversion/libsvn_fs_fs/rev_file.c
new file mode 100644
index 0000000..7c18ac8
--- /dev/null
+++ b/subversion/libsvn_fs_fs/rev_file.c
@@ -0,0 +1,306 @@
+/* rev_file.c --- revision file and index access functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "rev_file.h"
+#include "fs_fs.h"
+#include "index.h"
+#include "low_level.h"
+#include "util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "private/svn_io_private.h"
+#include "svn_private_config.h"
+
+/* Initialize the *FILE structure for REVISION in filesystem FS. Set its
+ * pool member to the provided POOL. */
+static void
+init_revision_file(svn_fs_fs__revision_file_t *file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ file->is_packed = svn_fs_fs__is_packed_rev(fs, revision);
+ file->start_revision = svn_fs_fs__packed_base_rev(fs, revision);
+
+ file->file = NULL;
+ file->stream = NULL;
+ file->p2l_stream = NULL;
+ file->l2p_stream = NULL;
+ file->block_size = ffd->block_size;
+ file->l2p_offset = -1;
+ file->l2p_checksum = NULL;
+ file->p2l_offset = -1;
+ file->p2l_checksum = NULL;
+ file->footer_offset = -1;
+ file->pool = pool;
+}
+
+/* Baton type for set_read_only() */
+typedef struct set_read_only_baton_t
+{
+ /* File to set to read-only. */
+ const char *file_path;
+
+ /* Scratch pool sufficient life time.
+ * Ideally the pool that we registered the cleanup on. */
+ apr_pool_t *pool;
+} set_read_only_baton_t;
+
+/* APR pool cleanup callback taking a set_read_only_baton_t baton and then
+ * (trying to) set the specified file to r/o mode. */
+static apr_status_t
+set_read_only(void *baton)
+{
+ set_read_only_baton_t *ro_baton = baton;
+ apr_status_t status = APR_SUCCESS;
+ svn_error_t *err;
+
+ err = svn_io_set_file_read_only(ro_baton->file_path, TRUE, ro_baton->pool);
+ if (err)
+ {
+ status = err->apr_err;
+ svn_error_clear(err);
+ }
+
+ return status;
+}
+
+/* If the file at PATH is read-only, attempt to make it writable. The
+ * original state will be restored with RESULT_POOL gets cleaned up.
+ * SCRATCH_POOL is for temporary allocations. */
+static svn_error_t *
+auto_make_writable(const char *path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t is_read_only;
+ apr_finfo_t finfo;
+
+ SVN_ERR(svn_io_stat(&finfo, path, SVN__APR_FINFO_READONLY, scratch_pool));
+ SVN_ERR(svn_io__is_finfo_read_only(&is_read_only, &finfo, scratch_pool));
+
+ if (is_read_only)
+ {
+ /* Tell the pool to restore the r/o state upon cleanup
+ (assuming the file will still exist, failing silently otherwise). */
+ set_read_only_baton_t *baton = apr_pcalloc(result_pool,
+ sizeof(*baton));
+ baton->pool = result_pool;
+ baton->file_path = apr_pstrdup(result_pool, path);
+ apr_pool_cleanup_register(result_pool, baton,
+ set_read_only, apr_pool_cleanup_null);
+
+ /* Finally, allow write access (undoing it has already been scheduled
+ and is idempotent). */
+ SVN_ERR(svn_io_set_file_read_write(path, FALSE, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Core implementation of svn_fs_fs__open_pack_or_rev_file working on an
+ * existing, initialized FILE structure. If WRITABLE is TRUE, give write
+ * access to the file - temporarily resetting the r/o state if necessary.
+ */
+static svn_error_t *
+open_pack_or_rev_file(svn_fs_fs__revision_file_t *file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t writable,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_error_t *err;
+ svn_boolean_t retry = FALSE;
+
+ do
+ {
+ const char *path = svn_fs_fs__path_rev_absolute(fs, rev, scratch_pool);
+ apr_file_t *apr_file;
+ apr_int32_t flags = writable
+ ? APR_READ | APR_WRITE | APR_BUFFERED
+ : APR_READ | APR_BUFFERED;
+
+ /* We may have to *temporarily* enable write access. */
+ err = writable ? auto_make_writable(path, result_pool, scratch_pool)
+ : SVN_NO_ERROR;
+
+ /* open the revision file in buffered r/o or r/w mode */
+ if (!err)
+ err = svn_io_file_open(&apr_file, path, flags, APR_OS_DEFAULT,
+ result_pool);
+
+ if (!err)
+ {
+ file->file = apr_file;
+ file->stream = svn_stream_from_aprfile2(apr_file, TRUE,
+ result_pool);
+ file->is_packed = svn_fs_fs__is_packed_rev(fs, rev);
+
+ return SVN_NO_ERROR;
+ }
+
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
+ {
+ /* Could not open the file. This may happen if the
+ * file once existed but got packed later. */
+ svn_error_clear(err);
+
+ /* if that was our 2nd attempt, leave it at that. */
+ if (retry)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"), rev);
+
+ /* We failed for the first time. Refresh cache & retry. */
+ SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, scratch_pool));
+ file->start_revision = svn_fs_fs__packed_base_rev(fs, rev);
+
+ retry = TRUE;
+ }
+ else
+ {
+ svn_error_clear(err);
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"), rev);
+ }
+ }
+ else
+ {
+ retry = FALSE;
+ }
+ }
+ while (retry);
+
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_fs_fs__open_pack_or_rev_file(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *file = apr_palloc(result_pool, sizeof(**file));
+ init_revision_file(*file, fs, rev, result_pool);
+
+ return svn_error_trace(open_pack_or_rev_file(*file, fs, rev, FALSE,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_fs_fs__open_pack_or_rev_file_writable(svn_fs_fs__revision_file_t** file,
+ svn_fs_t* fs,
+ svn_revnum_t rev,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *file = apr_palloc(result_pool, sizeof(**file));
+ init_revision_file(*file, fs, rev, result_pool);
+
+ return svn_error_trace(open_pack_or_rev_file(*file, fs, rev, TRUE,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_fs_fs__auto_read_footer(svn_fs_fs__revision_file_t *file)
+{
+ if (file->l2p_offset == -1)
+ {
+ apr_off_t filesize = 0;
+ unsigned char footer_length;
+ svn_stringbuf_t *footer;
+
+ /* Determine file size. */
+ SVN_ERR(svn_io_file_seek(file->file, APR_END, &filesize, file->pool));
+
+ /* Read last byte (containing the length of the footer). */
+ SVN_ERR(svn_io_file_aligned_seek(file->file, file->block_size, NULL,
+ filesize - 1, file->pool));
+ SVN_ERR(svn_io_file_read_full2(file->file, &footer_length,
+ sizeof(footer_length), NULL, NULL,
+ file->pool));
+
+ /* Read footer. */
+ footer = svn_stringbuf_create_ensure(footer_length, file->pool);
+ SVN_ERR(svn_io_file_aligned_seek(file->file, file->block_size, NULL,
+ filesize - 1 - footer_length,
+ file->pool));
+ SVN_ERR(svn_io_file_read_full2(file->file, footer->data, footer_length,
+ &footer->len, NULL, file->pool));
+ footer->data[footer->len] = '\0';
+
+ /* Extract index locations. */
+ SVN_ERR(svn_fs_fs__parse_footer(&file->l2p_offset, &file->l2p_checksum,
+ &file->p2l_offset, &file->p2l_checksum,
+ footer, file->start_revision,
+ file->pool));
+ file->footer_offset = filesize - footer_length - 1;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__open_proto_rev_file(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *apr_file;
+ SVN_ERR(svn_io_file_open(&apr_file,
+ svn_fs_fs__path_txn_proto_rev(fs, txn_id,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ result_pool));
+
+ *file = apr_pcalloc(result_pool, sizeof(**file));
+ (*file)->file = apr_file;
+ (*file)->is_packed = FALSE;
+ (*file)->start_revision = SVN_INVALID_REVNUM;
+ (*file)->stream = svn_stream_from_aprfile2(apr_file, TRUE, result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__close_revision_file(svn_fs_fs__revision_file_t *file)
+{
+ if (file->stream)
+ SVN_ERR(svn_stream_close(file->stream));
+ if (file->file)
+ SVN_ERR(svn_io_file_close(file->file, file->pool));
+
+ file->file = NULL;
+ file->stream = NULL;
+ file->l2p_stream = NULL;
+ file->p2l_stream = NULL;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/rev_file.h b/subversion/libsvn_fs_fs/rev_file.h
new file mode 100644
index 0000000..9511994
--- /dev/null
+++ b/subversion/libsvn_fs_fs/rev_file.h
@@ -0,0 +1,145 @@
+/* rev_file.h --- revision file and index access 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_LIBSVN_FS__REV_FILE_H
+#define SVN_LIBSVN_FS__REV_FILE_H
+
+#include "svn_fs.h"
+#include "id.h"
+
+/* In format 7, index files must be read in sync with the respective
+ * revision / pack file. I.e. we must use packed index files for packed
+ * rev files and unpacked ones for non-packed rev files. So, the whole
+ * point is to open them with matching "is packed" setting in case some
+ * background pack process was run.
+ */
+
+/* Opaque index stream type.
+ */
+typedef struct svn_fs_fs__packed_number_stream_t
+ svn_fs_fs__packed_number_stream_t;
+
+/* Data file, including indexes data, and associated properties for
+ * START_REVISION. As the FILE is kept open, background pack operations
+ * will not cause access to this file to fail.
+ */
+typedef struct svn_fs_fs__revision_file_t
+{
+ /* first (potentially only) revision in the rev / pack file.
+ * SVN_INVALID_REVNUM for txn proto-rev files. */
+ svn_revnum_t start_revision;
+
+ /* the revision was packed when the first file / stream got opened */
+ svn_boolean_t is_packed;
+
+ /* rev / pack file */
+ apr_file_t *file;
+
+ /* stream based on FILE and not NULL exactly when FILE is not NULL */
+ svn_stream_t *stream;
+
+ /* the opened P2L index stream or NULL. Always NULL for txns. */
+ svn_fs_fs__packed_number_stream_t *p2l_stream;
+
+ /* the opened L2P index stream or NULL. Always NULL for txns. */
+ svn_fs_fs__packed_number_stream_t *l2p_stream;
+
+ /* Copied from FS->FFD->BLOCK_SIZE upon creation. It allows us to
+ * use aligned seek() without having the FS handy. */
+ apr_off_t block_size;
+
+ /* Offset within FILE at which the rev data ends and the L2P index
+ * data starts. Less than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer
+ * has not been called, yet. */
+ apr_off_t l2p_offset;
+
+ /* MD5 checksum on the whole on-disk representation of the L2P index.
+ * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
+ svn_checksum_t *l2p_checksum;
+
+ /* Offset within FILE at which the L2P index ends and the P2L index
+ * data starts. Greater than L2P_OFFSET. -1 if svn_fs_fs__auto_read_footer
+ * has not been called, yet. */
+ apr_off_t p2l_offset;
+
+ /* MD5 checksum on the whole on-disk representation of the P2L index.
+ * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
+ svn_checksum_t *p2l_checksum;
+
+ /* Offset within FILE at which the P2L index ends and the footer starts.
+ * Greater than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer has not
+ * been called, yet. */
+ apr_off_t footer_offset;
+
+ /* pool containing this object */
+ apr_pool_t *pool;
+} svn_fs_fs__revision_file_t;
+
+/* Open the correct revision file for REV. If the filesystem FS has
+ * been packed, *FILE will be set to the packed file; otherwise, set *FILE
+ * to the revision file for REV. Return SVN_ERR_FS_NO_SUCH_REVISION if the
+ * file doesn't exist. Allocate *FILE in RESULT_POOL and use SCRATCH_POOL
+ * for temporaries. */
+svn_error_t *
+svn_fs_fs__open_pack_or_rev_file(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Open the correct revision file for REV with read and write access.
+ * If necessary, temporarily reset the file's read-only state. If the
+ * filesystem FS has been packed, *FILE will be set to the packed file;
+ * otherwise, set *FILE to the revision file for REV.
+ *
+ * Return SVN_ERR_FS_NO_SUCH_REVISION if the file doesn't exist.
+ * Allocate *FILE in RESULT_POOL and use SCRATCH_POOLfor temporaries. */
+svn_error_t *
+svn_fs_fs__open_pack_or_rev_file_writable(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* If the footer data in FILE has not been read, yet, do so now.
+ * Index locations will only be read upon request as we assume they get
+ * cached and the FILE is usually used for REP data access only.
+ * Hence, the separate step.
+ */
+svn_error_t *
+svn_fs_fs__auto_read_footer(svn_fs_fs__revision_file_t *file);
+
+/* Open the proto-rev file of transaction TXN_ID in FS and return it in *FILE.
+ * Allocate *FILE in RESULT_POOL use and SCRATCH_POOL for temporaries.. */
+svn_error_t *
+svn_fs_fs__open_proto_rev_file(svn_fs_fs__revision_file_t **file,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Close all files and streams in FILE.
+ */
+svn_error_t *
+svn_fs_fs__close_revision_file(svn_fs_fs__revision_file_t *file);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/revprops.c b/subversion/libsvn_fs_fs/revprops.c
new file mode 100644
index 0000000..dbb185b
--- /dev/null
+++ b/subversion/libsvn_fs_fs/revprops.c
@@ -0,0 +1,1381 @@
+/* revprops.c --- everything needed to handle revprops in FSFS
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_pools.h"
+#include "svn_hash.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_fs.h"
+#include "revprops.h"
+#include "util.h"
+
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Give writing processes 10 seconds to replace an existing revprop
+ file with a new one. After that time, we assume that the writing
+ process got aborted and that we have re-read revprops. */
+#define REVPROP_CHANGE_TIMEOUT (10 * 1000000)
+
+svn_error_t *
+svn_fs_fs__upgrade_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const char *revprops_shard_path;
+ const char *revprops_pack_file_dir;
+ apr_int64_t shard;
+ apr_int64_t first_unpacked_shard
+ = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+ int compression_level = ffd->compress_packed_revprops
+ ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
+ : SVN_DELTA_COMPRESSION_LEVEL_NONE;
+
+ /* first, pack all revprops shards to match the packed revision shards */
+ for (shard = 0; shard < first_unpacked_shard; ++shard)
+ {
+ svn_pool_clear(iterpool);
+
+ revprops_pack_file_dir = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ shard),
+ iterpool);
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
+ iterpool);
+
+ SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
+ revprops_shard_path,
+ shard, ffd->max_files_per_dir,
+ (int)(0.9 * ffd->revprop_pack_size),
+ compression_level,
+ cancel_func, cancel_baton,
+ iterpool));
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard,
+ svn_fs_upgrade_pack_revprops, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__upgrade_cleanup_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const char *revprops_shard_path;
+ apr_int64_t shard;
+ apr_int64_t first_unpacked_shard
+ = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+
+ /* delete the non-packed revprops shards afterwards */
+ for (shard = 0; shard < first_unpacked_shard; ++shard)
+ {
+ svn_pool_clear(iterpool);
+
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
+ iterpool);
+ SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
+ shard,
+ ffd->max_files_per_dir,
+ cancel_func, cancel_baton,
+ iterpool));
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard,
+ svn_fs_upgrade_cleanup_revprops, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Container for all data required to access the packed revprop file
+ * for a given REVISION. This structure will be filled incrementally
+ * by read_pack_revprops() its sub-routines.
+ */
+typedef struct packed_revprops_t
+{
+ /* revision number to read (not necessarily the first in the pack) */
+ svn_revnum_t revision;
+
+ /* current revprop generation. Used when populating the revprop cache */
+ apr_int64_t generation;
+
+ /* the actual revision properties */
+ apr_hash_t *properties;
+
+ /* their size when serialized to a single string
+ * (as found in PACKED_REVPROPS) */
+ apr_size_t serialized_size;
+
+
+ /* name of the pack file (without folder path) */
+ const char *filename;
+
+ /* packed shard folder path */
+ const char *folder;
+
+ /* sum of values in SIZES */
+ apr_size_t total_size;
+
+ /* first revision in the pack (>= MANIFEST_START) */
+ svn_revnum_t start_revision;
+
+ /* size of the revprops in PACKED_REVPROPS */
+ apr_array_header_t *sizes;
+
+ /* offset of the revprops in PACKED_REVPROPS */
+ apr_array_header_t *offsets;
+
+
+ /* concatenation of the serialized representation of all revprops
+ * in the pack, i.e. the pack content without header and compression */
+ svn_stringbuf_t *packed_revprops;
+
+ /* First revision covered by MANIFEST.
+ * Will equal the shard start revision or 1, for the 1st shard. */
+ svn_revnum_t manifest_start;
+
+ /* content of the manifest.
+ * Maps long(rev - MANIFEST_START) to const char* pack file name */
+ apr_array_header_t *manifest;
+} packed_revprops_t;
+
+/* Parse the serialized revprops in CONTENT and return them in *PROPERTIES.
+ * Also, put them into the revprop cache, if activated, for future use.
+ * Three more parameters are being used to update the revprop cache: FS is
+ * our file system, the revprops belong to REVISION and the global revprop
+ * GENERATION is used as well.
+ *
+ * The returned hash will be allocated in POOL, SCRATCH_POOL is being used
+ * for temporary allocations.
+ */
+static svn_error_t *
+parse_revprop(apr_hash_t **properties,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_int64_t generation,
+ svn_string_t *content,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream = svn_stream_from_string(content, scratch_pool);
+ *properties = apr_hash_make(pool);
+
+ SVN_ERR_W(svn_hash_read2(*properties, stream, SVN_HASH_TERMINATOR, pool),
+ apr_psprintf(scratch_pool, "Failed to parse revprops for r%ld.",
+ revision));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the non-packed revprops for revision REV in FS, put them into the
+ * revprop cache if activated and return them in *PROPERTIES. GENERATION
+ * is the current revprop generation.
+ *
+ * If the data could not be read due to an otherwise recoverable error,
+ * leave *PROPERTIES unchanged. No error will be returned in that case.
+ *
+ * Allocations will be done in POOL.
+ */
+static svn_error_t *
+read_non_packed_revprop(apr_hash_t **properties,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_int64_t generation,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *content = NULL;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_boolean_t missing = FALSE;
+ int i;
+
+ for (i = 0;
+ i < SVN_FS_FS__RECOVERABLE_RETRY_COUNT && !missing && !content;
+ ++i)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__try_stringbuf_from_file(&content,
+ &missing,
+ svn_fs_fs__path_revprops(fs, rev, iterpool),
+ i + 1 < SVN_FS_FS__RECOVERABLE_RETRY_COUNT ,
+ iterpool));
+ }
+
+ if (content)
+ SVN_ERR(parse_revprop(properties, fs, rev, generation,
+ svn_stringbuf__morph_into_string(content),
+ pool, iterpool));
+
+ svn_pool_clear(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the minimum length of any packed revprop file name in REVPROPS. */
+static apr_size_t
+get_min_filename_len(packed_revprops_t *revprops)
+{
+ char number_buffer[SVN_INT64_BUFFER_SIZE];
+
+ /* The revprop filenames have the format <REV>.<COUNT> - with <REV> being
+ * at least the first rev in the shard and <COUNT> having at least one
+ * digit. Thus, the minimum is 2 + #decimal places in the start rev.
+ */
+ return svn__i64toa(number_buffer, revprops->manifest_start) + 2;
+}
+
+/* Given FS and REVPROPS->REVISION, fill the FILENAME, FOLDER and MANIFEST
+ * members. Use POOL for allocating results and SCRATCH_POOL for temporaries.
+ */
+static svn_error_t *
+get_revprop_packname(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *content = NULL;
+ const char *manifest_file_path;
+ int idx, rev_count;
+ char *buffer, *buffer_end;
+ const char **filenames, **filenames_end;
+ apr_size_t min_filename_len;
+
+ /* Determine the dimensions. Rev 0 is excluded from the first shard. */
+ rev_count = ffd->max_files_per_dir;
+ revprops->manifest_start
+ = revprops->revision - (revprops->revision % rev_count);
+ if (revprops->manifest_start == 0)
+ {
+ ++revprops->manifest_start;
+ --rev_count;
+ }
+
+ revprops->manifest = apr_array_make(pool, rev_count, sizeof(const char*));
+
+ /* No line in the file can be less than this number of chars long. */
+ min_filename_len = get_min_filename_len(revprops);
+
+ /* Read the content of the manifest file */
+ revprops->folder
+ = svn_fs_fs__path_revprops_pack_shard(fs, revprops->revision, pool);
+ manifest_file_path
+ = svn_dirent_join(revprops->folder, PATH_MANIFEST, pool);
+
+ SVN_ERR(svn_fs_fs__read_content(&content, manifest_file_path, pool));
+
+ /* There CONTENT must have a certain minimal size and there no
+ * unterminated lines at the end of the file. Both guarantees also
+ * simplify the parser loop below.
+ */
+ if ( content->len < rev_count * (min_filename_len + 1)
+ || content->data[content->len - 1] != '\n')
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld not "
+ "properly terminated"), revprops->revision);
+
+ /* Chop (parse) the manifest CONTENT into filenames, one per line.
+ * We only have to replace all newlines with NUL and add all line
+ * starts to REVPROPS->MANIFEST.
+ *
+ * There must be exactly REV_COUNT lines and that is the number of
+ * lines we parse from BUFFER to FILENAMES. Set the end pointer for
+ * the source BUFFER such that BUFFER+MIN_FILENAME_LEN is still valid
+ * BUFFER_END is always valid due to CONTENT->LEN > MIN_FILENAME_LEN.
+ *
+ * Please note that this loop is performance critical for e.g. 'svn log'.
+ * It is run 1000x per revprop access, i.e. per revision and about
+ * 50 million times per sec (and CPU core).
+ */
+ for (filenames = (const char **)revprops->manifest->elts,
+ filenames_end = filenames + rev_count,
+ buffer = content->data,
+ buffer_end = buffer + content->len - min_filename_len;
+ (filenames < filenames_end) && (buffer < buffer_end);
+ ++filenames)
+ {
+ /* BUFFER always points to the start of the next line / filename. */
+ *filenames = buffer;
+
+ /* Find the next EOL. This is guaranteed to stay within the CONTENT
+ * buffer because we left enough room after BUFFER_END and we know
+ * we will always see a newline as the last non-NUL char. */
+ buffer += min_filename_len;
+ while (*buffer != '\n')
+ ++buffer;
+
+ /* Found EOL. Turn it into the filename terminator and move BUFFER
+ * to the start of the next line or CONTENT buffer end. */
+ *buffer = '\0';
+ ++buffer;
+ }
+
+ /* We must have reached the end of both buffers. */
+ if (buffer < content->data + content->len)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld "
+ "has too many entries"), revprops->revision);
+
+ if (filenames < filenames_end)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld "
+ "has too few entries"), revprops->revision);
+
+ /* The target array has now exactly one entry per revision. */
+ revprops->manifest->nelts = rev_count;
+
+ /* Now get the file name */
+ idx = (int)(revprops->revision - revprops->manifest_start);
+ revprops->filename = APR_ARRAY_IDX(revprops->manifest, idx, const char*);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE, if revision R1 and R2 refer to the same shard in FS.
+ */
+static svn_boolean_t
+same_shard(svn_fs_t *fs,
+ svn_revnum_t r1,
+ svn_revnum_t r2)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ return (r1 / ffd->max_files_per_dir) == (r2 / ffd->max_files_per_dir);
+}
+
+/* Given FS and the full packed file content in REVPROPS->PACKED_REVPROPS,
+ * fill the START_REVISION member, and make PACKED_REVPROPS point to the
+ * first serialized revprop. If READ_ALL is set, initialize the SIZES
+ * and OFFSETS members as well.
+ *
+ * Parse the revprops for REVPROPS->REVISION and set the PROPERTIES as
+ * well as the SERIALIZED_SIZE member. If revprop caching has been
+ * enabled, parse all revprops in the pack and cache them.
+ */
+static svn_error_t *
+parse_packed_revprops(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ svn_boolean_t read_all,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream;
+ apr_int64_t first_rev, count, i;
+ apr_off_t offset;
+ const char *header_end;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* decompress (even if the data is only "stored", there is still a
+ * length header to remove) */
+ svn_stringbuf_t *compressed = revprops->packed_revprops;
+ svn_stringbuf_t *uncompressed = svn_stringbuf_create_empty(pool);
+ SVN_ERR(svn__decompress(compressed, uncompressed, APR_SIZE_MAX));
+
+ /* read first revision number and number of revisions in the pack */
+ stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
+ SVN_ERR(svn_fs_fs__read_number_from_stream(&first_rev, NULL, stream,
+ iterpool));
+ SVN_ERR(svn_fs_fs__read_number_from_stream(&count, NULL, stream,
+ iterpool));
+
+ /* Check revision range for validity. */
+ if ( !same_shard(fs, revprops->revision, first_rev)
+ || !same_shard(fs, revprops->revision, first_rev + count - 1)
+ || count < 1)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revprop pack for revision r%ld"
+ " contains revprops for r%ld .. r%ld"),
+ revprops->revision,
+ (svn_revnum_t)first_rev,
+ (svn_revnum_t)(first_rev + count -1));
+
+ /* Since start & end are in the same shard, it is enough to just test
+ * the FIRST_REV for being actually packed. That will also cover the
+ * special case of rev 0 never being packed. */
+ if (!svn_fs_fs__is_packed_revprop(fs, first_rev))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revprop pack for revision r%ld"
+ " starts at non-packed revisions r%ld"),
+ revprops->revision, (svn_revnum_t)first_rev);
+
+ /* make PACKED_REVPROPS point to the first char after the header.
+ * This is where the serialized revprops are. */
+ header_end = strstr(uncompressed->data, "\n\n");
+ if (header_end == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Header end not found"));
+
+ offset = header_end - uncompressed->data + 2;
+
+ revprops->packed_revprops = svn_stringbuf_create_empty(pool);
+ revprops->packed_revprops->data = uncompressed->data + offset;
+ revprops->packed_revprops->len = (apr_size_t)(uncompressed->len - offset);
+ revprops->packed_revprops->blocksize = (apr_size_t)(uncompressed->blocksize - offset);
+
+ /* STREAM still points to the first entry in the sizes list. */
+ revprops->start_revision = (svn_revnum_t)first_rev;
+ if (read_all)
+ {
+ /* Init / construct REVPROPS members. */
+ revprops->sizes = apr_array_make(pool, (int)count, sizeof(offset));
+ revprops->offsets = apr_array_make(pool, (int)count, sizeof(offset));
+ }
+
+ /* Now parse, revision by revision, the size and content of each
+ * revisions' revprops. */
+ for (i = 0, offset = 0, revprops->total_size = 0; i < count; ++i)
+ {
+ apr_int64_t size;
+ svn_string_t serialized;
+ svn_revnum_t revision = (svn_revnum_t)(first_rev + i);
+ svn_pool_clear(iterpool);
+
+ /* read & check the serialized size */
+ SVN_ERR(svn_fs_fs__read_number_from_stream(&size, NULL, stream,
+ iterpool));
+ if (size + offset > (apr_int64_t)revprops->packed_revprops->len)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop size exceeds pack file size"));
+
+ /* Parse this revprops list, if necessary */
+ serialized.data = revprops->packed_revprops->data + offset;
+ serialized.len = (apr_size_t)size;
+
+ if (revision == revprops->revision)
+ {
+ SVN_ERR(parse_revprop(&revprops->properties, fs, revision,
+ revprops->generation, &serialized,
+ pool, iterpool));
+ revprops->serialized_size = serialized.len;
+
+ /* If we only wanted the revprops for REVISION then we are done. */
+ if (!read_all)
+ break;
+ }
+
+ if (read_all)
+ {
+ /* fill REVPROPS data structures */
+ APR_ARRAY_PUSH(revprops->sizes, apr_off_t) = serialized.len;
+ APR_ARRAY_PUSH(revprops->offsets, apr_off_t) = offset;
+ }
+ revprops->total_size += serialized.len;
+
+ offset += serialized.len;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* In filesystem FS, read the packed revprops for revision REV into
+ * *REVPROPS. Use GENERATION to populate the revprop cache, if enabled.
+ * If you want to modify revprop contents / update REVPROPS, READ_ALL
+ * must be set. Otherwise, only the properties of REV are being provided.
+ * Allocate data in POOL.
+ */
+static svn_error_t *
+read_pack_revprop(packed_revprops_t **revprops,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_int64_t generation,
+ svn_boolean_t read_all,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_boolean_t missing = FALSE;
+ svn_error_t *err;
+ packed_revprops_t *result;
+ int i;
+
+ /* someone insisted that REV is packed. Double-check if necessary */
+ if (!svn_fs_fs__is_packed_revprop(fs, rev))
+ SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, iterpool));
+
+ if (!svn_fs_fs__is_packed_revprop(fs, rev))
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such packed revision %ld"), rev);
+
+ /* initialize the result data structure */
+ result = apr_pcalloc(pool, sizeof(*result));
+ result->revision = rev;
+ result->generation = generation;
+
+ /* try to read the packed revprops. This may require retries if we have
+ * concurrent writers. */
+ for (i = 0;
+ i < SVN_FS_FS__RECOVERABLE_RETRY_COUNT && !result->packed_revprops;
+ ++i)
+ {
+ const char *file_path;
+ svn_pool_clear(iterpool);
+
+ /* there might have been concurrent writes.
+ * Re-read the manifest and the pack file.
+ */
+ SVN_ERR(get_revprop_packname(fs, result, pool, iterpool));
+ file_path = svn_dirent_join(result->folder,
+ result->filename,
+ iterpool);
+ SVN_ERR(svn_fs_fs__try_stringbuf_from_file(&result->packed_revprops,
+ &missing,
+ file_path,
+ i + 1 < SVN_FS_FS__RECOVERABLE_RETRY_COUNT,
+ pool));
+ }
+
+ /* the file content should be available now */
+ if (!result->packed_revprops)
+ return svn_error_createf(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE, NULL,
+ _("Failed to read revprop pack file for r%ld"), rev);
+
+ /* parse it. RESULT will be complete afterwards. */
+ err = parse_packed_revprops(fs, result, read_all, pool, iterpool);
+ svn_pool_destroy(iterpool);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ _("Revprop pack file for r%ld is corrupt"), rev);
+
+ *revprops = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the revprops for revision REV in FS and return them in *PROPERTIES_P.
+ *
+ * Allocations will be done in POOL.
+ */
+svn_error_t *
+svn_fs_fs__get_revision_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_int64_t generation = 0;
+
+ /* not found, yet */
+ *proplist_p = NULL;
+
+ /* should they be available at all? */
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
+
+ /* if REV had not been packed when we began, try reading it from the
+ * non-packed shard. If that fails, we will fall through to packed
+ * shard reads. */
+ if (!svn_fs_fs__is_packed_revprop(fs, rev))
+ {
+ svn_error_t *err = read_non_packed_revprop(proplist_p, fs, rev,
+ generation, pool);
+ if (err)
+ {
+ if (!APR_STATUS_IS_ENOENT(err->apr_err)
+ || ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ *proplist_p = NULL; /* in case read_non_packed_revprop changed it */
+ }
+ }
+
+ /* if revprop packing is available and we have not read the revprops, yet,
+ * try reading them from a packed shard. If that fails, REV is most
+ * likely invalid (or its revprops highly contested). */
+ if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT && !*proplist_p)
+ {
+ packed_revprops_t *revprops;
+ SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, FALSE, pool));
+ *proplist_p = revprops->properties;
+ }
+
+ /* The revprops should have been there. Did we get them? */
+ if (!*proplist_p)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("Could not read revprops for revision %ld"),
+ rev);
+
+ return SVN_NO_ERROR;
+}
+
+/* Serialize the revision property list PROPLIST of revision REV in
+ * filesystem FS to a non-packed file. Return the name of that temporary
+ * file in *TMP_PATH and the file path that it must be moved to in
+ * *FINAL_PATH.
+ *
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+write_non_packed_revprop(const char **final_path,
+ const char **tmp_path,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool)
+{
+ apr_file_t *file;
+ svn_stream_t *stream;
+ *final_path = svn_fs_fs__path_revprops(fs, rev, pool);
+
+ /* ### do we have a directory sitting around already? we really shouldn't
+ ### have to get the dirname here. */
+ SVN_ERR(svn_io_open_unique_file3(&file, tmp_path,
+ svn_dirent_dirname(*final_path, pool),
+ svn_io_file_del_none, pool, pool));
+ stream = svn_stream_from_aprfile2(file, TRUE, pool);
+ SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Flush temporary file to disk and close it. */
+ SVN_ERR(svn_io_file_flush_to_disk(file, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* After writing the new revprop file(s), call this function to move the
+ * file at TMP_PATH to FINAL_PATH and give it the permissions from
+ * PERMS_REFERENCE.
+ *
+ * Finally, delete all the temporary files given in FILES_TO_DELETE.
+ * The latter may be NULL.
+ *
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+switch_to_new_revprop(svn_fs_t *fs,
+ const char *final_path,
+ const char *tmp_path,
+ const char *perms_reference,
+ apr_array_header_t *files_to_delete,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_fs_fs__move_into_place(tmp_path, final_path, perms_reference,
+ pool));
+
+ /* Clean up temporary files, if necessary. */
+ if (files_to_delete)
+ {
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ int i;
+
+ for (i = 0; i < files_to_delete->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(files_to_delete, i, const char*);
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+ return SVN_NO_ERROR;
+}
+
+/* Write a pack file header to STREAM that starts at revision START_REVISION
+ * and contains the indexes [START,END) of SIZES.
+ */
+static svn_error_t *
+serialize_revprops_header(svn_stream_t *stream,
+ svn_revnum_t start_revision,
+ apr_array_header_t *sizes,
+ int start,
+ int end,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ int i;
+
+ SVN_ERR_ASSERT(start < end);
+
+ /* start revision and entry count */
+ SVN_ERR(svn_stream_printf(stream, pool, "%ld\n", start_revision));
+ SVN_ERR(svn_stream_printf(stream, pool, "%d\n", end - start));
+
+ /* the sizes array */
+ for (i = start; i < end; ++i)
+ {
+ /* Non-standard pool usage.
+ *
+ * We only allocate a few bytes each iteration -- even with a
+ * million iterations we would still be in good shape memory-wise.
+ */
+ apr_off_t size = APR_ARRAY_IDX(sizes, i, apr_off_t);
+ SVN_ERR(svn_stream_printf(stream, iterpool, "%" APR_OFF_T_FMT "\n",
+ size));
+ }
+
+ /* the double newline char indicates the end of the header */
+ SVN_ERR(svn_stream_printf(stream, iterpool, "\n"));
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Writes the a pack file to FILE. It copies the serialized data
+ * from REVPROPS for the indexes [START,END) except for index CHANGED_INDEX.
+ *
+ * The data for the latter is taken from NEW_SERIALIZED. Note, that
+ * CHANGED_INDEX may be outside the [START,END) range, i.e. no new data is
+ * taken in that case but only a subset of the old data will be copied.
+ *
+ * NEW_TOTAL_SIZE is a hint for pre-allocating buffers of appropriate size.
+ * POOL is used for temporary allocations.
+ */
+static svn_error_t *
+repack_revprops(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ int start,
+ int end,
+ int changed_index,
+ svn_stringbuf_t *new_serialized,
+ apr_off_t new_total_size,
+ apr_file_t *file,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+ int i;
+
+ /* create data empty buffers and the stream object */
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure((apr_size_t)new_total_size, pool);
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_empty(pool);
+ stream = svn_stream_from_stringbuf(uncompressed, pool);
+
+ /* write the header*/
+ SVN_ERR(serialize_revprops_header(stream, revprops->start_revision + start,
+ revprops->sizes, start, end, pool));
+
+ /* append the serialized revprops */
+ for (i = start; i < end; ++i)
+ if (i == changed_index)
+ {
+ SVN_ERR(svn_stream_write(stream,
+ new_serialized->data,
+ &new_serialized->len));
+ }
+ else
+ {
+ apr_size_t size
+ = (apr_size_t)APR_ARRAY_IDX(revprops->sizes, i, apr_off_t);
+ apr_size_t offset
+ = (apr_size_t)APR_ARRAY_IDX(revprops->offsets, i, apr_off_t);
+
+ SVN_ERR(svn_stream_write(stream,
+ revprops->packed_revprops->data + offset,
+ &size));
+ }
+
+ /* flush the stream buffer (if any) to our underlying data buffer */
+ SVN_ERR(svn_stream_close(stream));
+
+ /* compress / store the data */
+ SVN_ERR(svn__compress(uncompressed,
+ compressed,
+ ffd->compress_packed_revprops
+ ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
+ : SVN_DELTA_COMPRESSION_LEVEL_NONE));
+
+ /* finally, write the content to the target file, flush and close it */
+ SVN_ERR(svn_io_file_write_full(file, compressed->data, compressed->len,
+ NULL, pool));
+ SVN_ERR(svn_io_file_flush_to_disk(file, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Allocate a new pack file name for revisions
+ * [REVPROPS->START_REVISION + START, REVPROPS->START_REVISION + END - 1]
+ * of REVPROPS->MANIFEST. Add the name of old file to FILES_TO_DELETE,
+ * auto-create that array if necessary. Return an open file *FILE that is
+ * allocated in POOL.
+ */
+static svn_error_t *
+repack_file_open(apr_file_t **file,
+ svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ int start,
+ int end,
+ apr_array_header_t **files_to_delete,
+ apr_pool_t *pool)
+{
+ apr_int64_t tag;
+ const char *tag_string;
+ svn_string_t *new_filename;
+ int i;
+ int manifest_offset
+ = (int)(revprops->start_revision - revprops->manifest_start);
+
+ /* get the old (= current) file name and enlist it for later deletion */
+ const char *old_filename = APR_ARRAY_IDX(revprops->manifest,
+ start + manifest_offset,
+ const char*);
+
+ if (*files_to_delete == NULL)
+ *files_to_delete = apr_array_make(pool, 3, sizeof(const char*));
+
+ APR_ARRAY_PUSH(*files_to_delete, const char*)
+ = svn_dirent_join(revprops->folder, old_filename, pool);
+
+ /* increase the tag part, i.e. the counter after the dot */
+ tag_string = strchr(old_filename, '.');
+ if (tag_string == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed file '%s' misses a tag"),
+ old_filename);
+
+ SVN_ERR(svn_cstring_atoi64(&tag, tag_string + 1));
+ new_filename = svn_string_createf(pool, "%ld.%" APR_INT64_T_FMT,
+ revprops->start_revision + start,
+ ++tag);
+
+ /* update the manifest to point to the new file */
+ for (i = start; i < end; ++i)
+ APR_ARRAY_IDX(revprops->manifest, i + manifest_offset, const char*)
+ = new_filename->data;
+
+ /* open the file */
+ SVN_ERR(svn_io_file_open(file, svn_dirent_join(revprops->folder,
+ new_filename->data,
+ pool),
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For revision REV in filesystem FS, set the revision properties to
+ * PROPLIST. Return a new file in *TMP_PATH that the caller shall move
+ * to *FINAL_PATH to make the change visible. Files to be deleted will
+ * be listed in *FILES_TO_DELETE which may remain unchanged / unallocated.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+write_packed_revprop(const char **final_path,
+ const char **tmp_path,
+ apr_array_header_t **files_to_delete,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ packed_revprops_t *revprops;
+ apr_int64_t generation = 0;
+ svn_stream_t *stream;
+ apr_file_t *file;
+ svn_stringbuf_t *serialized;
+ apr_off_t new_total_size;
+ int changed_index;
+
+ /* read contents of the current pack file */
+ SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, TRUE, pool));
+
+ /* serialize the new revprops */
+ serialized = svn_stringbuf_create_empty(pool);
+ stream = svn_stream_from_stringbuf(serialized, pool);
+ SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* calculate the size of the new data */
+ changed_index = (int)(rev - revprops->start_revision);
+ new_total_size = revprops->total_size - revprops->serialized_size
+ + serialized->len
+ + (revprops->offsets->nelts + 2) * SVN_INT64_BUFFER_SIZE;
+
+ APR_ARRAY_IDX(revprops->sizes, changed_index, apr_off_t) = serialized->len;
+
+ /* can we put the new data into the same pack as the before? */
+ if ( new_total_size < ffd->revprop_pack_size
+ || revprops->sizes->nelts == 1)
+ {
+ /* simply replace the old pack file with new content as we do it
+ * in the non-packed case */
+
+ *final_path = svn_dirent_join(revprops->folder, revprops->filename,
+ pool);
+ SVN_ERR(svn_io_open_unique_file3(&file, tmp_path, revprops->folder,
+ svn_io_file_del_none, pool, pool));
+ SVN_ERR(repack_revprops(fs, revprops, 0, revprops->sizes->nelts,
+ changed_index, serialized, new_total_size,
+ file, pool));
+ }
+ else
+ {
+ /* split the pack file into two of roughly equal size */
+ int right_count, left_count, i;
+
+ int left = 0;
+ int right = revprops->sizes->nelts - 1;
+ apr_off_t left_size = 2 * SVN_INT64_BUFFER_SIZE;
+ apr_off_t right_size = 2 * SVN_INT64_BUFFER_SIZE;
+
+ /* let left and right side grow such that their size difference
+ * is minimal after each step. */
+ while (left <= right)
+ if ( left_size + APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
+ < right_size + APR_ARRAY_IDX(revprops->sizes, right, apr_off_t))
+ {
+ left_size += APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
+ + SVN_INT64_BUFFER_SIZE;
+ ++left;
+ }
+ else
+ {
+ right_size += APR_ARRAY_IDX(revprops->sizes, right, apr_off_t)
+ + SVN_INT64_BUFFER_SIZE;
+ --right;
+ }
+
+ /* since the items need much less than SVN_INT64_BUFFER_SIZE
+ * bytes to represent their length, the split may not be optimal */
+ left_count = left;
+ right_count = revprops->sizes->nelts - left;
+
+ /* if new_size is large, one side may exceed the pack size limit.
+ * In that case, split before and after the modified revprop.*/
+ if ( left_size > ffd->revprop_pack_size
+ || right_size > ffd->revprop_pack_size)
+ {
+ left_count = changed_index;
+ right_count = revprops->sizes->nelts - left_count - 1;
+ }
+
+ /* write the new, split files */
+ if (left_count)
+ {
+ SVN_ERR(repack_file_open(&file, fs, revprops, 0,
+ left_count, files_to_delete, pool));
+ SVN_ERR(repack_revprops(fs, revprops, 0, left_count,
+ changed_index, serialized, new_total_size,
+ file, pool));
+ }
+
+ if (left_count + right_count < revprops->sizes->nelts)
+ {
+ SVN_ERR(repack_file_open(&file, fs, revprops, changed_index,
+ changed_index + 1, files_to_delete,
+ pool));
+ SVN_ERR(repack_revprops(fs, revprops, changed_index,
+ changed_index + 1,
+ changed_index, serialized, new_total_size,
+ file, pool));
+ }
+
+ if (right_count)
+ {
+ SVN_ERR(repack_file_open(&file, fs, revprops,
+ revprops->sizes->nelts - right_count,
+ revprops->sizes->nelts,
+ files_to_delete, pool));
+ SVN_ERR(repack_revprops(fs, revprops,
+ revprops->sizes->nelts - right_count,
+ revprops->sizes->nelts, changed_index,
+ serialized, new_total_size, file,
+ pool));
+ }
+
+ /* write the new manifest */
+ *final_path = svn_dirent_join(revprops->folder, PATH_MANIFEST, pool);
+ SVN_ERR(svn_io_open_unique_file3(&file, tmp_path, revprops->folder,
+ svn_io_file_del_none, pool, pool));
+
+ for (i = 0; i < revprops->manifest->nelts; ++i)
+ {
+ const char *filename = APR_ARRAY_IDX(revprops->manifest, i,
+ const char*);
+ SVN_ERR(svn_io_file_write_full(file, filename, strlen(filename),
+ NULL, pool));
+ SVN_ERR(svn_io_file_putc('\n', file, pool));
+ }
+
+ SVN_ERR(svn_io_file_flush_to_disk(file, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set the revision property list of revision REV in filesystem FS to
+ PROPLIST. Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__set_revision_proplist(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool)
+{
+ svn_boolean_t is_packed;
+ const char *final_path;
+ const char *tmp_path;
+ const char *perms_reference;
+ apr_array_header_t *files_to_delete = NULL;
+
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
+
+ /* this info will not change while we hold the global FS write lock */
+ is_packed = svn_fs_fs__is_packed_revprop(fs, rev);
+
+ /* Serialize the new revprop data */
+ if (is_packed)
+ SVN_ERR(write_packed_revprop(&final_path, &tmp_path, &files_to_delete,
+ fs, rev, proplist, pool));
+ else
+ SVN_ERR(write_non_packed_revprop(&final_path, &tmp_path,
+ fs, rev, proplist, pool));
+
+ /* We use the rev file of this revision as the perms reference,
+ * because when setting revprops for the first time, the revprop
+ * file won't exist and therefore can't serve as its own reference.
+ * (Whereas the rev file should already exist at this point.)
+ */
+ perms_reference = svn_fs_fs__path_rev_absolute(fs, rev, pool);
+
+ /* Now, switch to the new revprop data. */
+ SVN_ERR(switch_to_new_revprop(fs, final_path, tmp_path, perms_reference,
+ files_to_delete, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE, if for REVISION in FS, we can find the revprop pack file.
+ * Use POOL for temporary allocations.
+ * Set *MISSING, if the reason is a missing manifest or pack file.
+ */
+svn_boolean_t
+svn_fs_fs__packed_revprop_available(svn_boolean_t *missing,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *content = NULL;
+
+ /* try to read the manifest file */
+ const char *folder
+ = svn_fs_fs__path_revprops_pack_shard(fs, revision, pool);
+ const char *manifest_path = svn_dirent_join(folder, PATH_MANIFEST, pool);
+
+ svn_error_t *err = svn_fs_fs__try_stringbuf_from_file(&content,
+ missing,
+ manifest_path,
+ FALSE,
+ pool);
+
+ /* if the manifest cannot be read, consider the pack files inaccessible
+ * even if the file itself exists. */
+ if (err)
+ {
+ svn_error_clear(err);
+ return FALSE;
+ }
+
+ if (*missing)
+ return FALSE;
+
+ /* parse manifest content until we find the entry for REVISION.
+ * Revision 0 is never packed. */
+ revision = revision < ffd->max_files_per_dir
+ ? revision - 1
+ : revision % ffd->max_files_per_dir;
+ while (content->data)
+ {
+ char *next = strchr(content->data, '\n');
+ if (next)
+ {
+ *next = 0;
+ ++next;
+ }
+
+ if (revision-- == 0)
+ {
+ /* the respective pack file must exist (and be a file) */
+ svn_node_kind_t kind;
+ err = svn_io_check_path(svn_dirent_join(folder, content->data,
+ pool),
+ &kind, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ return FALSE;
+ }
+
+ *missing = kind == svn_node_none;
+ return kind == svn_node_file;
+ }
+
+ content->data = next;
+ }
+
+ return FALSE;
+}
+
+
+/****** Packing FSFS shards *********/
+
+svn_error_t *
+svn_fs_fs__copy_revprops(const char *pack_file_dir,
+ const char *pack_filename,
+ const char *shard_path,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ apr_array_header_t *sizes,
+ apr_size_t total_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *pack_stream;
+ apr_file_t *pack_file;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* create empty data buffer and a write stream on top of it */
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure(total_size, scratch_pool);
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_empty(scratch_pool);
+ pack_stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
+
+ /* write the pack file header */
+ SVN_ERR(serialize_revprops_header(pack_stream, start_rev, sizes, 0,
+ sizes->nelts, iterpool));
+
+ /* Some useful paths. */
+ SVN_ERR(svn_io_file_open(&pack_file, svn_dirent_join(pack_file_dir,
+ pack_filename,
+ scratch_pool),
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
+ scratch_pool));
+
+ /* Iterate over the revisions in this shard, squashing them together. */
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ const char *path;
+ svn_stream_t *stream;
+
+ svn_pool_clear(iterpool);
+
+ /* Construct the file name. */
+ path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
+ iterpool);
+
+ /* Copy all the bits from the non-packed revprop file to the end of
+ * the pack file. */
+ SVN_ERR(svn_stream_open_readonly(&stream, path, iterpool, iterpool));
+ SVN_ERR(svn_stream_copy3(stream, pack_stream,
+ cancel_func, cancel_baton, iterpool));
+ }
+
+ /* flush stream buffers to content buffer */
+ SVN_ERR(svn_stream_close(pack_stream));
+
+ /* compress the content (or just store it for COMPRESSION_LEVEL 0) */
+ SVN_ERR(svn__compress(uncompressed, compressed, compression_level));
+
+ /* write the pack file content to disk */
+ SVN_ERR(svn_io_file_write_full(pack_file, compressed->data, compressed->len,
+ NULL, scratch_pool));
+ SVN_ERR(svn_io_file_flush_to_disk(pack_file, scratch_pool));
+ SVN_ERR(svn_io_file_close(pack_file, scratch_pool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__pack_revprops_shard(const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_off_t max_pack_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *manifest_file_path, *pack_filename = NULL;
+ apr_file_t *manifest_file;
+ svn_stream_t *manifest_stream;
+ svn_revnum_t start_rev, end_rev, rev;
+ apr_off_t total_size;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *sizes;
+
+ /* Some useful paths. */
+ manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST,
+ scratch_pool);
+
+ /* Remove any existing pack file for this shard, since it is incomplete. */
+ SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* Create the new directory and manifest file stream. */
+ SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, scratch_pool));
+
+ SVN_ERR(svn_io_file_open(&manifest_file, manifest_file_path,
+ APR_WRITE | APR_BUFFERED | APR_CREATE | APR_EXCL,
+ APR_OS_DEFAULT, scratch_pool));
+ manifest_stream = svn_stream_from_aprfile2(manifest_file, TRUE,
+ scratch_pool);
+
+ /* revisions to handle. Special case: revision 0 */
+ start_rev = (svn_revnum_t) (shard * max_files_per_dir);
+ end_rev = (svn_revnum_t) ((shard + 1) * (max_files_per_dir) - 1);
+ if (start_rev == 0)
+ ++start_rev;
+ /* Special special case: if max_files_per_dir is 1, then at this point
+ start_rev == 1 and end_rev == 0 (!). Fortunately, everything just
+ works. */
+
+ /* initialize the revprop size info */
+ sizes = apr_array_make(scratch_pool, max_files_per_dir, sizeof(apr_off_t));
+ total_size = 2 * SVN_INT64_BUFFER_SIZE;
+
+ /* Iterate over the revisions in this shard, determine their size and
+ * squashing them together into pack files. */
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ apr_finfo_t finfo;
+ const char *path;
+
+ svn_pool_clear(iterpool);
+
+ /* Get the size of the file. */
+ path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
+ iterpool);
+ SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
+
+ /* if we already have started a pack file and this revprop cannot be
+ * appended to it, write the previous pack file. */
+ if (sizes->nelts != 0 &&
+ total_size + SVN_INT64_BUFFER_SIZE + finfo.size > max_pack_size)
+ {
+ SVN_ERR(svn_fs_fs__copy_revprops(pack_file_dir, pack_filename,
+ shard_path, start_rev, rev-1,
+ sizes, (apr_size_t)total_size,
+ compression_level, cancel_func,
+ cancel_baton, iterpool));
+
+ /* next pack file starts empty again */
+ apr_array_clear(sizes);
+ total_size = 2 * SVN_INT64_BUFFER_SIZE;
+ start_rev = rev;
+ }
+
+ /* Update the manifest. Allocate a file name for the current pack
+ * file if it is a new one */
+ if (sizes->nelts == 0)
+ pack_filename = apr_psprintf(scratch_pool, "%ld.0", rev);
+
+ SVN_ERR(svn_stream_printf(manifest_stream, iterpool, "%s\n",
+ pack_filename));
+
+ /* add to list of files to put into the current pack file */
+ APR_ARRAY_PUSH(sizes, apr_off_t) = finfo.size;
+ total_size += SVN_INT64_BUFFER_SIZE + finfo.size;
+ }
+
+ /* write the last pack file */
+ if (sizes->nelts != 0)
+ SVN_ERR(svn_fs_fs__copy_revprops(pack_file_dir, pack_filename,
+ shard_path, start_rev, rev-1,
+ sizes, (apr_size_t)total_size,
+ compression_level, cancel_func,
+ cancel_baton, iterpool));
+
+ /* flush the manifest file to disk and update permissions */
+ SVN_ERR(svn_stream_close(manifest_stream));
+ SVN_ERR(svn_io_file_flush_to_disk(manifest_file, iterpool));
+ SVN_ERR(svn_io_file_close(manifest_file, iterpool));
+ SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__delete_revprops_shard(const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ if (shard == 0)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* delete all files except the one for revision 0 */
+ for (i = 1; i < max_files_per_dir; ++i)
+ {
+ const char *path;
+ svn_pool_clear(iterpool);
+
+ path = svn_dirent_join(shard_path,
+ apr_psprintf(iterpool, "%d", i),
+ iterpool);
+ if (cancel_func)
+ SVN_ERR((*cancel_func)(cancel_baton));
+
+ SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+ else
+ SVN_ERR(svn_io_remove_dir2(shard_path, TRUE,
+ cancel_func, cancel_baton, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
diff --git a/subversion/libsvn_fs_fs/revprops.h b/subversion/libsvn_fs_fs/revprops.h
new file mode 100644
index 0000000..66c137c
--- /dev/null
+++ b/subversion/libsvn_fs_fs/revprops.h
@@ -0,0 +1,159 @@
+/* revprops.h --- everything needed to handle revprops in FSFS
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_fs.h"
+
+/* In the filesystem FS, pack all revprop shards up to min_unpacked_rev.
+ *
+ * NOTE: Keep the old non-packed shards around until after the format bump.
+ * Otherwise, re-running upgrade will drop the packed revprop shard but
+ * have no unpacked data anymore. Call upgrade_cleanup_pack_revprops after
+ * the bump.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Temporary allocations are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_fs__upgrade_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* In the filesystem FS, remove all non-packed revprop shards up to
+ * min_unpacked_rev. Temporary allocations are done in SCRATCH_POOL.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Cancellation is supported in the sense that we
+ * will cleanly abort the operation. However, there will be remnant shards
+ * that must be removed manually.
+ *
+ * See upgrade_pack_revprops for more info.
+ */
+svn_error_t *
+svn_fs_fs__upgrade_cleanup_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* Read the revprops for revision REV in FS and return them in *PROPERTIES_P.
+ *
+ * Allocations will be done in POOL.
+ */
+svn_error_t *
+svn_fs_fs__get_revision_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Set the revision property list of revision REV in filesystem FS to
+ PROPLIST. Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__set_revision_proplist(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool);
+
+
+/* Return TRUE, if for REVISION in FS, we can find the revprop pack file.
+ * Use POOL for temporary allocations.
+ * Set *MISSING, if the reason is a missing manifest or pack file.
+ */
+svn_boolean_t
+svn_fs_fs__packed_revprop_available(svn_boolean_t *missing,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool);
+
+
+/****** Packing FSFS shards *********/
+
+/* Copy revprop files for revisions [START_REV, END_REV) from SHARD_PATH
+ * to the pack file at PACK_FILE_NAME in PACK_FILE_DIR.
+ *
+ * The file sizes have already been determined and written to SIZES.
+ * Please note that this function will be executed while the filesystem
+ * has been locked and that revprops files will therefore not be modified
+ * while the pack is in progress.
+ *
+ * COMPRESSION_LEVEL defines how well the resulting pack file shall be
+ * compressed or whether is shall be compressed at all. TOTAL_SIZE is
+ * a hint on which initial buffer size we should use to hold the pack file
+ * content.
+ *
+ * CANCEL_FUNC and CANCEL_BATON are used as usual. Temporary allocations
+ * are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_fs__copy_revprops(const char *pack_file_dir,
+ const char *pack_filename,
+ const char *shard_path,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ apr_array_header_t *sizes,
+ apr_size_t total_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* In the filesystem FS, pack all revprop shards up to min_unpacked_rev.
+ *
+ * NOTE: Keep the old non-packed shards around until after the format bump.
+ * Otherwise, re-running upgrade will drop the packed revprop shard but
+ * have no unpacked data anymore. Call upgrade_cleanup_pack_revprops after
+ * the bump.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Temporary allocations are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_fs__pack_revprops_shard(const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_off_t max_pack_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* In the filesystem FS, remove all non-packed revprop shards up to
+ * min_unpacked_rev. Temporary allocations are done in SCRATCH_POOL.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Cancellation is supported in the sense that we
+ * will cleanly abort the operation. However, there will be remnant shards
+ * that must be removed manually.
+ *
+ * See upgrade_pack_revprops for more info.
+ */
+svn_error_t *
+svn_fs_fs__delete_revprops_shard(const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
diff --git a/subversion/libsvn_fs_fs/stats.c b/subversion/libsvn_fs_fs/stats.c
new file mode 100644
index 0000000..97a2ed7
--- /dev/null
+++ b/subversion/libsvn_fs_fs/stats.c
@@ -0,0 +1,1255 @@
+/* stats.c -- implements the svn_fs_fs__get_stats private API.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_dirent_uri.h"
+#include "svn_fs.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
+#include "private/svn_cache.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_fs_fs_private.h"
+
+#include "index.h"
+#include "pack.h"
+#include "rev_file.h"
+#include "util.h"
+#include "fs_fs.h"
+#include "cached_data.h"
+#include "low_level.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* We group representations into 2x2 different kinds plus one default:
+ * [dir / file] x [text / prop]. The assignment is done by the first node
+ * that references the respective representation.
+ */
+typedef enum rep_kind_t
+{
+ /* The representation is not used _directly_, i.e. not referenced by any
+ * noderev. However, some other representation may use it as delta base.
+ * Null value. Should not occur in real-word repositories. */
+ unused_rep,
+
+ /* a properties on directory rep */
+ dir_property_rep,
+
+ /* a properties on file rep */
+ file_property_rep,
+
+ /* a directory rep */
+ dir_rep,
+
+ /* a file rep */
+ file_rep
+} rep_kind_t;
+
+/* A representation fragment.
+ */
+typedef struct rep_stats_t
+{
+ /* absolute offset in the file */
+ apr_off_t offset;
+
+ /* item length in bytes */
+ apr_uint64_t size;
+
+ /* item length after de-deltification */
+ apr_uint64_t expanded_size;
+
+ /* revision that contains this representation
+ * (may be referenced by other revisions, though) */
+ svn_revnum_t revision;
+
+ /* number of nodes that reference this representation */
+ apr_uint32_t ref_count;
+
+ /* length of the PLAIN / DELTA line in the source file in bytes */
+ apr_uint16_t header_size;
+
+ /* classification of the representation. values of rep_kind_t */
+ char kind;
+
+} rep_stats_t;
+
+/* Represents a single revision.
+ * There will be only one instance per revision. */
+typedef struct revision_info_t
+{
+ /* number of this revision */
+ svn_revnum_t revision;
+
+ /* pack file offset (manifest value), 0 for non-packed files */
+ apr_off_t offset;
+
+ /* length of the changes list on bytes */
+ apr_uint64_t changes_len;
+
+ /* offset of the changes list relative to OFFSET */
+ apr_uint64_t change_count;
+
+ /* first offset behind the revision data in the pack file (file length
+ * for non-packed revs) */
+ apr_off_t end;
+
+ /* number of directory noderevs in this revision */
+ apr_uint64_t dir_noderev_count;
+
+ /* number of file noderevs in this revision */
+ apr_uint64_t file_noderev_count;
+
+ /* total size of directory noderevs (i.e. the structs - not the rep) */
+ apr_uint64_t dir_noderev_size;
+
+ /* total size of file noderevs (i.e. the structs - not the rep) */
+ apr_uint64_t file_noderev_size;
+
+ /* all rep_stats_t of this revision (in no particular order),
+ * i.e. those that point back to this struct */
+ apr_array_header_t *representations;
+
+ /* Temporary rev / pack file access object, used in phys. addressing
+ * mode only. NULL when done reading this revision. */
+ svn_fs_fs__revision_file_t *rev_file;
+} revision_info_t;
+
+/* Root data structure containing all information about a given repository.
+ * We use it as a wrapper around svn_fs_t and pass it around where we would
+ * otherwise just use a svn_fs_t.
+ */
+typedef struct query_t
+{
+ /* FS API object*/
+ svn_fs_t *fs;
+
+ /* The HEAD revision. */
+ svn_revnum_t head;
+
+ /* Number of revs per shard; 0 for non-sharded repos. */
+ int shard_size;
+
+ /* First non-packed revision. */
+ svn_revnum_t min_unpacked_rev;
+
+ /* all revisions */
+ apr_array_header_t *revisions;
+
+ /* empty representation.
+ * Used as a dummy base for DELTA reps without base. */
+ rep_stats_t *null_base;
+
+ /* collected statistics */
+ svn_fs_fs__stats_t *stats;
+
+ /* Progress notification callback to call after each shard. May be NULL. */
+ svn_fs_progress_notify_func_t progress_func;
+
+ /* Baton for PROGRESS_FUNC. */
+ void *progress_baton;
+
+ /* Cancellation support callback to call once in a while. May be NULL. */
+ svn_cancel_func_t cancel_func;
+
+ /* Baton for CANCEL_FUNC. */
+ void *cancel_baton;
+} query_t;
+
+/* Return the length of REV_FILE in *FILE_SIZE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_file_size(apr_off_t *file_size,
+ svn_fs_fs__revision_file_t *rev_file,
+ apr_pool_t *scratch_pool)
+{
+ apr_finfo_t finfo;
+
+ SVN_ERR(svn_io_file_info_get(&finfo, APR_FINFO_SIZE, rev_file->file,
+ scratch_pool));
+
+ *file_size = finfo.size;
+ return SVN_NO_ERROR;
+}
+
+/* Initialize the LARGEST_CHANGES member in STATS with a capacity of COUNT
+ * entries. Allocate the result in RESULT_POOL.
+ */
+static void
+initialize_largest_changes(svn_fs_fs__stats_t *stats,
+ apr_size_t count,
+ apr_pool_t *result_pool)
+{
+ apr_size_t i;
+
+ stats->largest_changes = apr_pcalloc(result_pool,
+ sizeof(*stats->largest_changes));
+ stats->largest_changes->count = count;
+ stats->largest_changes->min_size = 1;
+ stats->largest_changes->changes
+ = apr_palloc(result_pool, count * sizeof(*stats->largest_changes->changes));
+
+ /* allocate *all* entries before the path stringbufs. This increases
+ * cache locality and enhances performance significantly. */
+ for (i = 0; i < count; ++i)
+ stats->largest_changes->changes[i]
+ = apr_palloc(result_pool, sizeof(**stats->largest_changes->changes));
+
+ /* now initialize them and allocate the stringbufs */
+ for (i = 0; i < count; ++i)
+ {
+ stats->largest_changes->changes[i]->size = 0;
+ stats->largest_changes->changes[i]->revision = SVN_INVALID_REVNUM;
+ stats->largest_changes->changes[i]->path
+ = svn_stringbuf_create_ensure(1024, result_pool);
+ }
+}
+
+/* Add entry for SIZE to HISTOGRAM.
+ */
+static void
+add_to_histogram(svn_fs_fs__histogram_t *histogram,
+ apr_int64_t size)
+{
+ apr_int64_t shift = 0;
+
+ while (((apr_int64_t)(1) << shift) <= size)
+ shift++;
+
+ histogram->total.count++;
+ histogram->total.sum += size;
+ histogram->lines[(apr_size_t)shift].count++;
+ histogram->lines[(apr_size_t)shift].sum += size;
+}
+
+/* Update data aggregators in STATS with this representation of type KIND,
+ * on-disk REP_SIZE and expanded node size EXPANDED_SIZE for PATH in REVSION.
+ * PLAIN_ADDED indicates whether the node has a deltification predecessor.
+ */
+static void
+add_change(svn_fs_fs__stats_t *stats,
+ apr_uint64_t rep_size,
+ apr_uint64_t expanded_size,
+ svn_revnum_t revision,
+ const char *path,
+ rep_kind_t kind,
+ svn_boolean_t plain_added)
+{
+ /* identify largest reps */
+ if (rep_size >= stats->largest_changes->min_size)
+ {
+ apr_size_t i;
+ svn_fs_fs__largest_changes_t *largest_changes = stats->largest_changes;
+ svn_fs_fs__large_change_info_t *info
+ = largest_changes->changes[largest_changes->count - 1];
+ info->size = rep_size;
+ info->revision = revision;
+ svn_stringbuf_set(info->path, path);
+
+ /* linear insertion but not too bad since count is low and insertions
+ * near the end are more likely than close to front */
+ for (i = largest_changes->count - 1; i > 0; --i)
+ if (largest_changes->changes[i-1]->size >= rep_size)
+ break;
+ else
+ largest_changes->changes[i] = largest_changes->changes[i-1];
+
+ largest_changes->changes[i] = info;
+ largest_changes->min_size
+ = largest_changes->changes[largest_changes->count-1]->size;
+ }
+
+ /* global histograms */
+ add_to_histogram(&stats->rep_size_histogram, rep_size);
+ add_to_histogram(&stats->node_size_histogram, expanded_size);
+
+ if (plain_added)
+ {
+ add_to_histogram(&stats->added_rep_size_histogram, rep_size);
+ add_to_histogram(&stats->added_node_size_histogram, expanded_size);
+ }
+
+ /* specific histograms by type */
+ switch (kind)
+ {
+ case unused_rep:
+ add_to_histogram(&stats->unused_rep_histogram, rep_size);
+ break;
+ case dir_property_rep:
+ add_to_histogram(&stats->dir_prop_rep_histogram, rep_size);
+ add_to_histogram(&stats->dir_prop_histogram, expanded_size);
+ break;
+ case file_property_rep:
+ add_to_histogram(&stats->file_prop_rep_histogram, rep_size);
+ add_to_histogram(&stats->file_prop_histogram, expanded_size);
+ break;
+ case dir_rep:
+ add_to_histogram(&stats->dir_rep_histogram, rep_size);
+ add_to_histogram(&stats->dir_histogram, expanded_size);
+ break;
+ case file_rep:
+ add_to_histogram(&stats->file_rep_histogram, rep_size);
+ add_to_histogram(&stats->file_histogram, expanded_size);
+ break;
+ }
+
+ /* by extension */
+ if (kind == file_rep)
+ {
+ /* determine extension */
+ svn_fs_fs__extension_info_t *info;
+ const char * file_name = strrchr(path, '/');
+ const char * extension = file_name ? strrchr(file_name, '.') : NULL;
+
+ if (extension == NULL || extension == file_name + 1)
+ extension = "(none)";
+
+ /* get / auto-insert entry for this extension */
+ info = apr_hash_get(stats->by_extension, extension, APR_HASH_KEY_STRING);
+ if (info == NULL)
+ {
+ apr_pool_t *pool = apr_hash_pool_get(stats->by_extension);
+ info = apr_pcalloc(pool, sizeof(*info));
+ info->extension = apr_pstrdup(pool, extension);
+
+ apr_hash_set(stats->by_extension, info->extension,
+ APR_HASH_KEY_STRING, info);
+ }
+
+ /* update per-extension histogram */
+ add_to_histogram(&info->node_histogram, expanded_size);
+ add_to_histogram(&info->rep_histogram, rep_size);
+ }
+}
+
+/* Comparator used for binary search comparing the absolute file offset
+ * of a representation to some other offset. DATA is a *rep_stats_t,
+ * KEY is a pointer to an apr_off_t.
+ */
+static int
+compare_representation_offsets(const void *data, const void *key)
+{
+ apr_off_t lhs = (*(const rep_stats_t *const *)data)->offset;
+ apr_off_t rhs = *(const apr_off_t *)key;
+
+ if (lhs < rhs)
+ return -1;
+ return (lhs > rhs ? 1 : 0);
+}
+
+/* Find the revision_info_t object to the given REVISION in QUERY and
+ * return it in *REVISION_INFO. For performance reasons, we skip the
+ * lookup if the info is already provided.
+ *
+ * In that revision, look for the rep_stats_t object for offset OFFSET.
+ * If it already exists, set *IDX to its index in *REVISION_INFO's
+ * representations list and return the representation object. Otherwise,
+ * set the index to where it must be inserted and return NULL.
+ */
+static rep_stats_t *
+find_representation(int *idx,
+ query_t *query,
+ revision_info_t **revision_info,
+ svn_revnum_t revision,
+ apr_off_t offset)
+{
+ revision_info_t *info;
+ *idx = -1;
+
+ /* first let's find the revision */
+ info = revision_info ? *revision_info : NULL;
+ if (info == NULL || info->revision != revision)
+ {
+ info = APR_ARRAY_IDX(query->revisions, revision, revision_info_t*);
+ if (revision_info)
+ *revision_info = info;
+ }
+
+ /* not found -> no result */
+ if (info == NULL)
+ return NULL;
+
+ /* look for the representation */
+ *idx = svn_sort__bsearch_lower_bound(info->representations,
+ &offset,
+ compare_representation_offsets);
+ if (*idx < info->representations->nelts)
+ {
+ /* return the representation, if this is the one we were looking for */
+ rep_stats_t *result
+ = APR_ARRAY_IDX(info->representations, *idx, rep_stats_t *);
+ if (result->offset == offset)
+ return result;
+ }
+
+ /* not parsed, yet */
+ return NULL;
+}
+
+/* Find / auto-construct the representation stats for REP in QUERY and
+ * return it in *REPRESENTATION.
+ *
+ * If necessary, allocate the result in RESULT_POOL; use SCRATCH_POOL for
+ * temporary allocations.
+ */
+static svn_error_t *
+parse_representation(rep_stats_t **representation,
+ query_t *query,
+ representation_t *rep,
+ revision_info_t *revision_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ rep_stats_t *result;
+ int idx;
+
+ /* read location (revision, offset) and size */
+
+ /* look it up */
+ result = find_representation(&idx, query, &revision_info, rep->revision,
+ (apr_off_t)rep->item_index);
+ if (!result)
+ {
+ /* not parsed, yet (probably a rep in the same revision).
+ * Create a new rep object and determine its base rep as well.
+ */
+ result = apr_pcalloc(result_pool, sizeof(*result));
+ result->revision = rep->revision;
+ result->expanded_size = (rep->expanded_size ? rep->expanded_size
+ : rep->size);
+ result->offset = (apr_off_t)rep->item_index;
+ result->size = rep->size;
+
+ /* In phys. addressing mode, follow link to the actual representation.
+ * In log. addressing mode, we will find it already as part of our
+ * linear walk through the whole file. */
+ if (!svn_fs_fs__use_log_addressing(query->fs))
+ {
+ svn_fs_fs__rep_header_t *header;
+ apr_off_t offset = revision_info->offset + result->offset;
+
+ SVN_ERR_ASSERT(revision_info->rev_file);
+ SVN_ERR(svn_io_file_seek(revision_info->rev_file->file, APR_SET,
+ &offset, scratch_pool));
+ SVN_ERR(svn_fs_fs__read_rep_header(&header,
+ revision_info->rev_file->stream,
+ scratch_pool, scratch_pool));
+
+ result->header_size = header->header_size;
+ }
+
+ svn_sort__array_insert(revision_info->representations, &result, idx);
+ }
+
+ *representation = result;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* forward declaration */
+static svn_error_t *
+read_noderev(query_t *query,
+ svn_stringbuf_t *noderev_str,
+ revision_info_t *revision_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Read the noderev item at OFFSET in REVISION_INFO from the filesystem
+ * provided by QUERY. Return it in *NODEREV, allocated in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * The textual representation of the noderev will be used to determine
+ * the on-disk size of the noderev. Only called in phys. addressing mode.
+ */
+static svn_error_t *
+read_phsy_noderev(svn_stringbuf_t **noderev,
+ query_t *query,
+ apr_off_t offset,
+ revision_info_t *revision_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *noderev_str = svn_stringbuf_create_empty(result_pool);
+ svn_stringbuf_t *line;
+ svn_boolean_t eof;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Navigate the file stream to the start of noderev. */
+ SVN_ERR_ASSERT(revision_info->rev_file);
+
+ offset += revision_info->offset;
+ SVN_ERR(svn_io_file_seek(revision_info->rev_file->file, APR_SET,
+ &offset, scratch_pool));
+
+ /* Read it (terminated by an empty line) */
+ do
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_stream_readline(revision_info->rev_file->stream, &line,
+ "\n", &eof, iterpool));
+ svn_stringbuf_appendstr(noderev_str, line);
+ svn_stringbuf_appendbyte(noderev_str, '\n');
+ }
+ while (line->len > 0 && !eof);
+
+ /* Return the result. */
+ *noderev = noderev_str;
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Starting at the directory in NODEREV's text, read all DAG nodes,
+ * directories and representations linked in that tree structure.
+ * Store them in QUERY and REVISION_INFO. Also, read them only once.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+parse_dir(query_t *query,
+ node_revision_t *noderev,
+ revision_info_t *revision_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ int i;
+ apr_array_header_t *entries;
+ SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, query->fs, noderev,
+ scratch_pool, scratch_pool));
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_dirent_t *dirent = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
+
+ if (svn_fs_fs__id_rev(dirent->id) == revision_info->revision)
+ {
+ svn_stringbuf_t *noderev_str;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(read_phsy_noderev(&noderev_str, query,
+ svn_fs_fs__id_item(dirent->id),
+ revision_info, iterpool, iterpool));
+ SVN_ERR(read_noderev(query, noderev_str, revision_info,
+ result_pool, iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Parse the noderev given as NODEREV_STR and store the info in QUERY and
+ * REVISION_INFO. In phys. addressing mode, continue reading all DAG nodes,
+ * directories and representations linked in that tree structure.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_noderev(query_t *query,
+ svn_stringbuf_t *noderev_str,
+ revision_info_t *revision_info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ rep_stats_t *text = NULL;
+ rep_stats_t *props = NULL;
+ node_revision_t *noderev;
+
+ svn_stream_t *stream = svn_stream_from_stringbuf(noderev_str, scratch_pool);
+ SVN_ERR(svn_fs_fs__read_noderev(&noderev, stream, scratch_pool,
+ scratch_pool));
+
+ if (noderev->data_rep)
+ {
+ SVN_ERR(parse_representation(&text, query,
+ noderev->data_rep, revision_info,
+ result_pool, scratch_pool));
+
+ /* if we are the first to use this rep, mark it as "text rep" */
+ if (++text->ref_count == 1)
+ text->kind = noderev->kind == svn_node_dir ? dir_rep : file_rep;
+ }
+
+ if (noderev->prop_rep)
+ {
+ SVN_ERR(parse_representation(&props, query,
+ noderev->prop_rep, revision_info,
+ result_pool, scratch_pool));
+
+ /* if we are the first to use this rep, mark it as "prop rep" */
+ if (++props->ref_count == 1)
+ props->kind = noderev->kind == svn_node_dir ? dir_property_rep
+ : file_property_rep;
+ }
+
+ /* record largest changes */
+ if (text && text->ref_count == 1)
+ add_change(query->stats, text->size, text->expanded_size, text->revision,
+ noderev->created_path, text->kind, !noderev->predecessor_id);
+ if (props && props->ref_count == 1)
+ add_change(query->stats, props->size, props->expanded_size,
+ props->revision, noderev->created_path, props->kind,
+ !noderev->predecessor_id);
+
+ /* if this is a directory and has not been processed, yet, read and
+ * process it recursively */
+ if ( noderev->kind == svn_node_dir && text && text->ref_count == 1
+ && !svn_fs_fs__use_log_addressing(query->fs))
+ SVN_ERR(parse_dir(query, noderev, revision_info, result_pool,
+ scratch_pool));
+
+ /* update stats */
+ if (noderev->kind == svn_node_dir)
+ {
+ revision_info->dir_noderev_size += noderev_str->len;
+ revision_info->dir_noderev_count++;
+ }
+ else
+ {
+ revision_info->file_noderev_size += noderev_str->len;
+ revision_info->file_noderev_count++;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* For the revision given as REVISION_INFO within QUERY, determine the number
+ * of entries in its changed paths list and store that info in REVISION_INFO.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_phys_change_count(query_t *query,
+ revision_info_t *revision_info,
+ apr_pool_t *scratch_pool)
+{
+ /* We are going to use our own sub-pool here because the changes object
+ * may well be >100MB and SCRATCH_POOL may not get cleared until all other
+ * info has been read by read_phys_revision(). Therefore, tidy up early.
+ */
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *changes;
+
+ SVN_ERR(svn_fs_fs__get_changes(&changes, query->fs,
+ revision_info->revision, subpool));
+ revision_info->change_count = changes->nelts;
+
+ /* Release potentially tons of memory. */
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read header information for the revision stored in FILE_CONTENT (one
+ * whole revision). Return the offsets within FILE_CONTENT for the
+ * *ROOT_NODEREV, the list of *CHANGES and its len in *CHANGES_LEN.
+ * Use POOL for temporary allocations. */
+static svn_error_t *
+read_phys_revision(query_t *query,
+ revision_info_t *info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ char buf[64];
+ apr_off_t root_node_offset;
+ apr_off_t changes_offset;
+ svn_stringbuf_t *trailer;
+ svn_stringbuf_t *noderev_str;
+
+ /* Read the last 64 bytes of the revision (if long enough). */
+ apr_off_t start = MAX(info->offset, info->end - sizeof(buf));
+ apr_size_t len = (apr_size_t)(info->end - start);
+ SVN_ERR(svn_io_file_seek(info->rev_file->file, APR_SET, &start,
+ scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(info->rev_file->file, buf, len, NULL, NULL,
+ scratch_pool));
+ trailer = svn_stringbuf_ncreate(buf, len, scratch_pool);
+
+ /* Parse that trailer. */
+ SVN_ERR(svn_fs_fs__parse_revision_trailer(&root_node_offset,
+ &changes_offset, trailer,
+ info->revision));
+ SVN_ERR(get_phys_change_count(query, info, scratch_pool));
+
+ /* Calculate the length of the changes list. */
+ trailer = svn_fs_fs__unparse_revision_trailer(root_node_offset,
+ changes_offset,
+ scratch_pool);
+ info->changes_len = info->end - info->offset - changes_offset
+ - trailer->len;
+
+ /* Recursively read nodes added in this rev. */
+ SVN_ERR(read_phsy_noderev(&noderev_str, query, root_node_offset, info,
+ scratch_pool, scratch_pool));
+ SVN_ERR(read_noderev(query, noderev_str, info, result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the content of the pack file staring at revision BASE physical
+ * addressing mode and store it in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_phys_pack_file(query_t *query,
+ svn_revnum_t base,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+ apr_off_t file_size = 0;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, query->fs, base,
+ scratch_pool, scratch_pool));
+ SVN_ERR(get_file_size(&file_size, rev_file, scratch_pool));
+
+ /* process each revision in the pack file */
+ for (i = 0; i < query->shard_size; ++i)
+ {
+ revision_info_t *info;
+
+ /* cancellation support */
+ if (query->cancel_func)
+ SVN_ERR(query->cancel_func(query->cancel_baton));
+
+ /* create the revision info for the current rev */
+ info = apr_pcalloc(result_pool, sizeof(*info));
+ info->representations = apr_array_make(result_pool, 4,
+ sizeof(rep_stats_t*));
+ info->rev_file = rev_file;
+
+ info->revision = base + i;
+ SVN_ERR(svn_fs_fs__get_packed_offset(&info->offset, query->fs, base + i,
+ iterpool));
+ if (i + 1 == query->shard_size)
+ info->end = file_size;
+ else
+ SVN_ERR(svn_fs_fs__get_packed_offset(&info->end, query->fs,
+ base + i + 1, iterpool));
+
+ SVN_ERR(read_phys_revision(query, info, result_pool, iterpool));
+
+ info->representations = apr_array_copy(result_pool,
+ info->representations);
+
+ /* Done with this revision. */
+ info->rev_file = NULL;
+
+ /* put it into our container */
+ APR_ARRAY_PUSH(query->revisions, revision_info_t*) = info;
+
+ /* destroy temps */
+ svn_pool_clear(iterpool);
+ }
+
+ /* Done with this pack file. */
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ /* one more pack file processed */
+ if (query->progress_func)
+ query->progress_func(base, query->progress_baton, scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the content of the file for REVISION in physical addressing mode
+ * and store its contents in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_phys_revision_file(query_t *query,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ revision_info_t *info = apr_pcalloc(result_pool, sizeof(*info));
+ apr_off_t file_size = 0;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ /* cancellation support */
+ if (query->cancel_func)
+ SVN_ERR(query->cancel_func(query->cancel_baton));
+
+ /* read the whole pack file into memory */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, query->fs, revision,
+ scratch_pool, scratch_pool));
+ SVN_ERR(get_file_size(&file_size, rev_file, scratch_pool));
+
+ /* create the revision info for the current rev */
+ info->representations = apr_array_make(result_pool, 4, sizeof(rep_stats_t*));
+
+ info->rev_file = rev_file;
+ info->revision = revision;
+ info->offset = 0;
+ info->end = file_size;
+
+ SVN_ERR(read_phys_revision(query, info, result_pool, scratch_pool));
+
+ /* Done with this revision. */
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+ info->rev_file = NULL;
+
+ /* put it into our container */
+ APR_ARRAY_PUSH(query->revisions, revision_info_t*) = info;
+
+ /* show progress every 1000 revs or so */
+ if (query->progress_func)
+ {
+ if (query->shard_size && (revision % query->shard_size == 0))
+ query->progress_func(revision, query->progress_baton, scratch_pool);
+ if (!query->shard_size && (revision % 1000 == 0))
+ query->progress_func(revision, query->progress_baton, scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Given the unparsed changes list in CHANGES with LEN chars, return the
+ * number of changed paths encoded in it. Only used in log. addressing
+ * mode.
+ */
+static apr_uint64_t
+get_log_change_count(const char *changes,
+ apr_size_t len)
+{
+ apr_size_t lines = 0;
+ const char *end = changes + len;
+
+ /* line count */
+ for (; changes < end; ++changes)
+ if (*changes == '\n')
+ ++lines;
+
+ /* two lines per change */
+ return lines / 2;
+}
+
+/* Read the item described by ENTRY from the REV_FILE and return the
+ * respective byte sequence in *CONTENTS, allocated in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations
+ */
+static svn_error_t *
+read_item(svn_stringbuf_t **contents,
+ svn_fs_fs__revision_file_t *rev_file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *item = svn_stringbuf_create_ensure(entry->size,
+ result_pool);
+ item->len = entry->size;
+ item->data[item->len] = 0;
+
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, rev_file->block_size,
+ NULL, entry->offset, scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, item->data, item->len,
+ NULL, NULL, scratch_pool));
+
+ *contents = item;
+
+ return SVN_NO_ERROR;
+}
+
+/* Process the logically addressed revision contents of revisions BASE to
+ * BASE + COUNT - 1 in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_log_rev_or_packfile(query_t *query,
+ svn_revnum_t base,
+ int count,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = query->fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_off_t max_offset;
+ apr_off_t offset = 0;
+ int i;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ /* we will process every revision in the rev / pack file */
+ for (i = 0; i < count; ++i)
+ {
+ /* create the revision info for the current rev */
+ revision_info_t *info = apr_pcalloc(result_pool, sizeof(*info));
+ info->representations = apr_array_make(result_pool, 4,
+ sizeof(rep_stats_t*));
+ info->revision = base + i;
+
+ APR_ARRAY_PUSH(query->revisions, revision_info_t*) = info;
+ }
+
+ /* open the pack / rev file that is covered by the p2l index */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, query->fs, base,
+ scratch_pool, iterpool));
+ SVN_ERR(svn_fs_fs__p2l_get_max_offset(&max_offset, query->fs, rev_file,
+ base, scratch_pool));
+
+ /* record the whole pack size in the first rev so the total sum will
+ still be correct */
+ APR_ARRAY_IDX(query->revisions, base, revision_info_t*)->end = max_offset;
+
+ /* for all offsets in the file, get the P2L index entries and process
+ the interesting items (change lists, noderevs) */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+
+ svn_pool_clear(iterpool);
+
+ /* cancellation support */
+ if (query->cancel_func)
+ SVN_ERR(query->cancel_func(query->cancel_baton));
+
+ /* get all entries for the current block */
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, query->fs, rev_file, base,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+
+ /* process all entries (and later continue with the next block) */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+
+ /* skip bits we previously processed */
+ if (i == 0 && entry->offset < offset)
+ continue;
+
+ /* skip zero-sized entries */
+ if (entry->size == 0)
+ continue;
+
+ /* read and process interesting items */
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_NODEREV)
+ {
+ svn_stringbuf_t *item;
+ revision_info_t *info = APR_ARRAY_IDX(query->revisions,
+ entry->item.revision,
+ revision_info_t*);
+ SVN_ERR(read_item(&item, rev_file, entry, iterpool, iterpool));
+ SVN_ERR(read_noderev(query, item, info, result_pool, iterpool));
+ }
+ else if (entry->type == SVN_FS_FS__ITEM_TYPE_CHANGES)
+ {
+ svn_stringbuf_t *item;
+ revision_info_t *info = APR_ARRAY_IDX(query->revisions,
+ entry->item.revision,
+ revision_info_t*);
+ SVN_ERR(read_item(&item, rev_file, entry, iterpool, iterpool));
+ info->change_count
+ = get_log_change_count(item->data + 0, item->len);
+ info->changes_len += entry->size;
+ }
+
+ /* advance offset */
+ offset += entry->size;
+ }
+ }
+
+ /* clean up and close file handles */
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the content of the pack file staring at revision BASE logical
+ * addressing mode and store it in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_log_pack_file(query_t *query,
+ svn_revnum_t base,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(read_log_rev_or_packfile(query, base, query->shard_size,
+ result_pool, scratch_pool));
+
+ /* one more pack file processed */
+ if (query->progress_func)
+ query->progress_func(base, query->progress_baton, scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the content of the file for REVISION in logical addressing mode
+ * and store its contents in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_log_revision_file(query_t *query,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(read_log_rev_or_packfile(query, revision, 1,
+ result_pool, scratch_pool));
+
+ /* show progress every 1000 revs or so */
+ if (query->progress_func)
+ {
+ if (query->shard_size && (revision % query->shard_size == 0))
+ query->progress_func(revision, query->progress_baton, scratch_pool);
+ if (!query->shard_size && (revision % 1000 == 0))
+ query->progress_func(revision, query->progress_baton, scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the repository and collect the stats info in QUERY.
+ *
+ * Use RESULT_POOL for persistent allocations and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+read_revisions(query_t *query,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_revnum_t revision;
+
+ /* read all packed revs */
+ for ( revision = 0
+ ; revision < query->min_unpacked_rev
+ ; revision += query->shard_size)
+ {
+ svn_pool_clear(iterpool);
+
+ if (svn_fs_fs__use_log_addressing(query->fs))
+ SVN_ERR(read_log_pack_file(query, revision, result_pool, iterpool));
+ else
+ SVN_ERR(read_phys_pack_file(query, revision, result_pool, iterpool));
+ }
+
+ /* read non-packed revs */
+ for ( ; revision <= query->head; ++revision)
+ {
+ svn_pool_clear(iterpool);
+
+ if (svn_fs_fs__use_log_addressing(query->fs))
+ SVN_ERR(read_log_revision_file(query, revision, result_pool,
+ iterpool));
+ else
+ SVN_ERR(read_phys_revision_file(query, revision, result_pool,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Accumulate stats of REP in STATS.
+ */
+static void
+add_rep_pack_stats(svn_fs_fs__rep_pack_stats_t *stats,
+ rep_stats_t *rep)
+{
+ stats->count++;
+
+ stats->packed_size += rep->size;
+ stats->expanded_size += rep->expanded_size;
+ stats->overhead_size += rep->header_size + 7 /* ENDREP\n */;
+}
+
+/* Accumulate stats of REP in STATS.
+ */
+static void
+add_rep_stats(svn_fs_fs__representation_stats_t *stats,
+ rep_stats_t *rep)
+{
+ add_rep_pack_stats(&stats->total, rep);
+ if (rep->ref_count == 1)
+ add_rep_pack_stats(&stats->uniques, rep);
+ else
+ add_rep_pack_stats(&stats->shared, rep);
+
+ stats->references += rep->ref_count;
+ stats->expanded_size += rep->ref_count * rep->expanded_size;
+}
+
+/* Aggregate the info the in revision_info_t * array REVISIONS into the
+ * respectve fields of STATS.
+ */
+static void
+aggregate_stats(const apr_array_header_t *revisions,
+ svn_fs_fs__stats_t *stats)
+{
+ int i, k;
+
+ /* aggregate info from all revisions */
+ stats->revision_count = revisions->nelts;
+ for (i = 0; i < revisions->nelts; ++i)
+ {
+ revision_info_t *revision = APR_ARRAY_IDX(revisions, i,
+ revision_info_t *);
+
+ /* data gathered on a revision level */
+ stats->change_count += revision->change_count;
+ stats->change_len += revision->changes_len;
+ stats->total_size += revision->end - revision->offset;
+
+ stats->dir_node_stats.count += revision->dir_noderev_count;
+ stats->dir_node_stats.size += revision->dir_noderev_size;
+ stats->file_node_stats.count += revision->file_noderev_count;
+ stats->file_node_stats.size += revision->file_noderev_size;
+ stats->total_node_stats.count += revision->dir_noderev_count
+ + revision->file_noderev_count;
+ stats->total_node_stats.size += revision->dir_noderev_size
+ + revision->file_noderev_size;
+
+ /* process representations */
+ for (k = 0; k < revision->representations->nelts; ++k)
+ {
+ rep_stats_t *rep = APR_ARRAY_IDX(revision->representations, k,
+ rep_stats_t *);
+
+ /* accumulate in the right bucket */
+ switch(rep->kind)
+ {
+ case file_rep:
+ add_rep_stats(&stats->file_rep_stats, rep);
+ break;
+ case dir_rep:
+ add_rep_stats(&stats->dir_rep_stats, rep);
+ break;
+ case file_property_rep:
+ add_rep_stats(&stats->file_prop_rep_stats, rep);
+ break;
+ case dir_property_rep:
+ add_rep_stats(&stats->dir_prop_rep_stats, rep);
+ break;
+ default:
+ break;
+ }
+
+ add_rep_stats(&stats->total_rep_stats, rep);
+ }
+ }
+}
+
+/* Return a new svn_fs_fs__stats_t instance, allocated in RESULT_POOL.
+ */
+static svn_fs_fs__stats_t *
+create_stats(apr_pool_t *result_pool)
+{
+ svn_fs_fs__stats_t *stats = apr_pcalloc(result_pool, sizeof(*stats));
+
+ initialize_largest_changes(stats, 64, result_pool);
+ stats->by_extension = apr_hash_make(result_pool);
+
+ return stats;
+}
+
+/* Create a *QUERY, allocated in RESULT_POOL, reading filesystem FS and
+ * collecting results in STATS. Store the optional PROCESS_FUNC and
+ * PROGRESS_BATON as well as CANCEL_FUNC and CANCEL_BATON in *QUERY, too.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+create_query(query_t **query,
+ svn_fs_t *fs,
+ svn_fs_fs__stats_t *stats,
+ 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)
+{
+ *query = apr_pcalloc(result_pool, sizeof(**query));
+
+ /* Read repository dimensions. */
+ (*query)->shard_size = svn_fs_fs__shard_size(fs);
+ SVN_ERR(svn_fs_fs__youngest_rev(&(*query)->head, fs, scratch_pool));
+ SVN_ERR(svn_fs_fs__min_unpacked_rev(&(*query)->min_unpacked_rev, fs,
+ scratch_pool));
+
+ /* create data containers and caches
+ * Note: this assumes that int is at least 32-bits and that we only support
+ * 32-bit wide revision numbers (actually 31-bits due to the signedness
+ * of both the nelts field of the array and our revision numbers). This
+ * means this code will fail on platforms where int is less than 32-bits
+ * and the repository has more revisions than int can hold. */
+ (*query)->revisions = apr_array_make(result_pool, (int) (*query)->head + 1,
+ sizeof(revision_info_t *));
+ (*query)->null_base = apr_pcalloc(result_pool,
+ sizeof(*(*query)->null_base));
+
+ /* Store other parameters */
+ (*query)->fs = fs;
+ (*query)->stats = stats;
+ (*query)->progress_func = progress_func;
+ (*query)->progress_baton = progress_baton;
+ (*query)->cancel_func = cancel_func;
+ (*query)->cancel_baton = cancel_baton;
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ query_t *query;
+
+ *stats = create_stats(result_pool);
+ SVN_ERR(create_query(&query, fs, *stats, progress_func, progress_baton,
+ cancel_func, cancel_baton, scratch_pool,
+ scratch_pool));
+ SVN_ERR(read_revisions(query, scratch_pool, scratch_pool));
+ aggregate_stats(query->revisions, *stats);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/structure b/subversion/libsvn_fs_fs/structure
index 41caf1d..7b5129f 100644
--- a/subversion/libsvn_fs_fs/structure
+++ b/subversion/libsvn_fs_fs/structure
@@ -43,7 +43,7 @@ repository) is:
<shard>.pack/ Pack directory, if the repo has been packed (see below)
<rev>.<count> Pack file, if the repository has been packed (see below)
manifest Pack manifest file, if a pack file exists (see below)
- revprops.db SQLite database of the packed revision properties
+ revprops.db SQLite database of the packed revprops (format 5 only)
transactions/ Subdirectory containing transactions
<txnid>.txn/ Directory containing transaction <txnid>
txn-protorevs/ Subdirectory containing transaction proto-revision files
@@ -58,12 +58,13 @@ repository) is:
current File specifying current revision and next node/copy id
fs-type File identifying this filesystem as an FSFS filesystem
write-lock Empty file, locked to serialise writers
+ pack-lock Empty file, locked to serialise 'svnadmin pack' (f. 7+)
txn-current-lock Empty file, locked to serialise 'txn-current'
- uuid File containing the UUID of the repository
+ uuid File containing the repository IDs
format File containing the format number of this filesystem
fsfs.conf Configuration file
min-unpacked-rev File containing the oldest revision not in a pack file
- min-unpacked-revprop File containing the oldest revision of unpacked revprop
+ min-unpacked-revprop Same for revision properties (format 5 only)
rep-cache.db SQLite database mapping rep checksums to locations
Files in the revprops directory are in the hash dump format used by
@@ -84,9 +85,19 @@ The "write-lock" file is an empty file which is locked before the
final stage of a commit and unlocked after the new "current" file has
been moved into place to indicate that a new revision is present. It
is also locked during a revprop propchange while the revprop file is
-read in, mutated, and written out again. Note that readers are never
-blocked by any operation - writers must ensure that the filesystem is
-always in a consistent state.
+read in, mutated, and written out again. Furthermore, it will be used
+to serialize the repository structure changes during 'svnadmin pack'
+(see also next section). Note that readers are never blocked by any
+operation - writers must ensure that the filesystem is always in a
+consistent state.
+
+The "pack-lock" file is an empty file which is locked before an 'svnadmin
+pack' operation commences. Thus, only one process may attempt to modify
+the repository structure at a time while other processes may still read
+and write (commit) to the repository during most of the pack procedure.
+It is only available with format 7 and newer repositories. Older formats
+use the global write-lock instead which disables commits completely
+for the duration of the pack process.
The "txn-current" file is a file with a single line of text that
contains only a base-36 number. The current value will be used in the
@@ -138,6 +149,7 @@ The formats are:
Format 4, understood by Subversion 1.6+
Format 5, understood by Subversion 1.7-dev, never released
Format 6, understood by Subversion 1.8
+ Format 7, understood by Subversion 1.9
The differences between the formats are:
@@ -148,6 +160,7 @@ Delta representation in revision files
Format options
Formats 1-2: none permitted
Format 3+: "layout" option
+ Format 7+: "addressing" option
Transaction name reuse
Formats 1-2: transaction names may be reused
@@ -176,6 +189,7 @@ Mergeinfo metadata:
Revision changed paths list:
Format 1-3: Does not contain the node's kind.
Format 4+: Contains the node's kind.
+ Format 7+: Contains the mergeinfo-mod flag.
Shard packing:
Format 4: Applied to revision data only.
@@ -183,15 +197,25 @@ Shard packing:
Format 6+: Applied equally to revision data and revprop data
(i.e. same min packed revision)
+Addressing:
+ Format 1-6: Physical addressing; uses fixed positions within a rev file
+ Format 7+: Logical addressing; uses item index that will be translated
+ on-the-fly to the actual rev / pack file location
+
+Repository IDs:
+ Format 1+: The first line of db/uuid contains the repository UUID
+ Format 7+: The second line contains the instance ID (in UUID formatting)
+
# Incomplete list. See SVN_FS_FS__MIN_*_FORMAT
Filesystem format options
-------------------------
-Currently, the only recognised format option is "layout", which
-specifies the paths that will be used to store the revision files and
-revision property files.
+Currently, the only recognised format options are "layout" and "addressing".
+The first specifies the paths that will be used to store the revision
+files and revision property files. The second specifies that logical to
+physical address translation is required.
The "layout" option is followed by the name of the filesystem layout
and any required parameters. The default layout, if no "layout"
@@ -219,19 +243,92 @@ The known layouts, and the parameters they require, are as follows:
revs/0/ directory will contain revisions 0-999, revs/1/ will contain
1000-1999, and so on.
+The "addressing" option is followed by the name of the addressing mode
+and any required parameters. The default addressing, if no "addressing"
+keyword is specified, is the 'physical' addressing.
+
+The supported modes, and the parameters they require, are as follows:
+
+"physical"
+ All existing and future revision files will use the traditional
+ physical addressing scheme. All references are given as rev/offset
+ pairs with "offset" being the byte offset relative to the beginning of
+ the revision in the respective rev or pack file.
+
+"logical"
+ All existing and future revision files will use logical
+ addressing. It is illegal to use logical addressing on non-sharded
+ repositories.
+
+
+Addressing modes
+----------------
+
+Two addressing modes are supported in format 7: physical and logical
+addressing. Both use the same address format but apply a different
+interpretation to it. Older formats only support physical addressing.
+
+All items are addressed using <rev> <item_index> pairs. In physical
+addressing mode, item_index is the (ASCII decimal) number of bytes from
+the start of the revision file to the start of the respective item. For
+non-packed files that is also the absolute file offset. Revision pack
+files simply concatenate multiple rev files, i.e. the absolute file offset
+is determined as
+
+ absolute offset = rev offset taken from manifest + item_index
+
+This simple addressing scheme makes it hard to change the location of
+any item since that may break references from later revisions.
+
+Logical addressing uses an index file to translate the rev / item_index
+pairs into absolute file offsets. There is one such index for every rev /
+pack file using logical addressing and both are created in sync. That
+makes it possible to reorder items during pack file creation, particularly
+to mix items from different revisions.
+
+Some item_index values are pre-defined and apply to every revision:
+
+ 0 ... not used / invalid
+ 1 ... changed path list
+ 2 ... root node revision
+
+A reverse index (phys-to-log) is being created as well that allows for
+translating arbitrary file locations into item descriptions (type, rev,
+item_index, on-disk length). Known item types
+
+ 0 ... unused / empty section
+ 1 ... file representation
+ 2 ... directory representation
+ 3 ... file property representation
+ 4 ... directory property representation
+ 5 ... node revision
+ 6 ... changed paths list
+
+The various representation types all share the same morphology. The
+distinction is only made to allow for more effective reordering heuristics.
+Zero-length items are allowed.
+
+
Packing revisions
-----------------
A filesystem can optionally be "packed" to conserve space on disk. The
packing process concatenates all the revision files in each full shard to
-create pack files. A manifest file is also created for each shard which
+create a pack file. The original shard is removed, and reads are
+redirected to the pack file.
+
+With physical addressing, a manifest file is created for each shard which
records the indexes of the corresponding revision files in the pack file.
-In addition, the original shard is removed, and reads are redirected to the
-pack file.
+The manifest file consists of a list of offsets, one for each revision in
+the pack file. The offsets are stored as ASCII decimal, and separated by
+a newline character.
+
+Revision pack files using logical addressing don't use manifest files but
+appends index data to the revision contents. The revisions inside a pack
+file will also get interleaved to reduce I/O for typical access patterns.
+There is no structural difference between packed and non-packed revision
+files in that mode.
-The manifest file consists of a list of offsets, one for each revision in the
-pack file. The offsets are stored as ASCII decimal, and separated by a newline
-character.
Packing revision properties (format 5: SQLite)
---------------------------
@@ -341,13 +438,12 @@ Within a new transaction:
Within a revision:
Within a revision file, node-revs have a txn-id field of the form
- "r<rev>/<offset>", to support easy lookup. The <offset> is the (ASCII
- decimal) number of bytes from the start of the revision file to the
- start of the node-rev.
+ "r<rev>/<item_index>", to support easy lookup. See addressing modes
+ for details.
During the final phase of a commit, node-revision IDs are rewritten
to have repository-wide unique node-ID and copy-ID fields, and to have
- "r<rev>/<offset>" txn-id fields.
+ "r<rev>/<item_index>" txn-id fields.
In Format 3 and above, this uniqueness is done by changing a temporary
id of "_<base36>" to "<base36>-<rev>". Note that this means that the
@@ -429,13 +525,14 @@ A revision file contains a concatenation of various kinds of data:
* Text and property representations
* Node-revisions
* The changed-path data
- * Two offsets at the very end
+ * Index data (logical addressing only)
+ * Revision / pack file footer (logical addressing only)
A representation begins with a line containing either "PLAIN\n" or
-"DELTA\n" or "DELTA <rev> <offset> <length>\n", where <rev>, <offset>,
-and <length> give the location of the delta base of the representation
-and the amount of data it contains (not counting the header or
-trailer). If no base location is given for a delta, the base is the
+"DELTA\n" or "DELTA <rev> <item_index> <length>\n", where <rev>,
+<item_index>, and <length> give the location of the delta base of the
+representation and the amount of data it contains (not counting the header
+or trailer). If no base location is given for a delta, the base is the
empty stream. After the initial line comes raw svndiff data, followed
by a cosmetic trailer "ENDREP\n".
@@ -459,12 +556,11 @@ defined:
type "file" or "dir"
pred The ID of the predecessor node-rev
count Count of node-revs since the base of the node
- text "<rev> <offset> <length> <size> <digest>" for text rep
- props "<rev> <offset> <length> <size> <digest>" for props rep
- <rev> and <offset> give location of rep
+ text "<rev> <item_index> <length> <size> <digest>" for text rep
+ props "<rev> <item_index> <length> <size> <digest>" for props rep
+ <rev> and <item_index> give location of rep
<length> gives length of rep, sans header and trailer
- <size> gives size of expanded rep; may be 0 if equal
- to the length
+ <size> gives size of expanded rep (*)
<digest> gives hex MD5 digest of expanded rep
### in formats >=4, also present:
<sha1-digest> gives hex SHA1 digest of expanded rep
@@ -476,6 +572,16 @@ defined:
which have svn:mergeinfo.
minfo-here Exists if this node itself has svn:mergeinfo.
+(*) Earlier versions of this document would state that <size> may be 0
+ if the actual value matches <length>. This is only true for property
+ and directory representations and should be avoided in general. File
+ representations may not be handled correctly by SVN before 1.7.20,
+ 1.8.12 and 1.9.0, if they have 0 <size> fields for non-empty contents.
+ Releases 1.8.0 through 1.8.11 may have falsely created instances of
+ that (see issue #4554). Finally, 0 <size> fields are only ever legal
+ for DELTA representations if the reconstructed full-text is actually
+ empty.
+
The predecessor of a node-rev crosses both soft and true copies;
together with the count field, it allows efficient determination of
the base for skip-deltas. The first node-rev of a node contains no
@@ -489,28 +595,40 @@ of the copy; it may be omitted if the node-rev is its own copy root
of revision 0). Copy roots are identified by revision and
created-path, not by node-rev ID, because a copy root may be a
node-rev which exists later on within the same revision file, meaning
-its offset is not yet known.
+its location is not yet known.
The changed-path data is represented as a series of changed-path
items, each consisting of two lines. The first line has the format
-"<id> <action> <text-mod> <prop-mod> <path>\n", where <id> is the
-node-rev ID of the new node-rev, <action> is "add", "delete",
-"replace", or "modify", <text-mod> and <prop-mod> are "true" or
-"false" indicating whether the text and/or properties changed, and
-<path> is the changed pathname. For deletes, <id> is the node-rev ID
-of the deleted node-rev, and <text-mod> and <prop-mod> are always
-"false". The second line has the format "<rev> <path>\n" containing
-the node-rev's copyfrom information if it has any; if it does not, the
-second line is blank.
+"<id> <action> <text-mod> <prop-mod> <mergeinfo-mod> <path>\n",
+where <id> is the node-rev ID of the new node-rev, <action> is "add",
+"delete", "replace", or "modify", <text-mod>, <prop-mod>, and
+<mergeinfo-mod> are "true" or "false" indicating whether the text,
+properties and/or mergeinfo changed, and <path> is the changed pathname.
+For deletes, <id> is the node-rev ID of the deleted node-rev, and
+<text-mod> and <prop-mod> are always "false". The second line has the
+format "<rev> <path>\n" containing the node-rev's copyfrom information
+if it has any; if it does not, the second line is blank.
Starting with FS format 4, <action> may contain the kind ("file" or
"dir") of the node, after a hyphen; for example, an added directory
may be represented as "add-dir".
-At the very end of a rev file is a pair of lines containing
-"\n<root-offset> <cp-offset>\n", where <root-offset> is the offset of
-the root directory node revision and <cp-offset> is the offset of the
-changed-path data.
+Prior to FS format 7, <mergeinfo-mod> flag is not available. It may
+also be missing in revisions upgraded from pre-f7 formats.
+
+In physical addressing mode, at the very end of a rev file is a pair of
+lines containing "\n<root-offset> <cp-offset>\n", where <root-offset> is
+the offset of the root directory node revision and <cp-offset> is the
+offset of the changed-path data.
+
+In logical addressing mode, the revision footer has the form
+
+ <l2p offset> <l2p checksum> <p2l offset> <p2l checksum><terminal byte>
+
+The terminal byte contains the length (as plain 8 bit value) of the footer
+excluding that length byte. The first offset is the start of the log-to-
+phys index, followed by the digest of the MD5 checksum over its content.
+The other pair gives the same of for the phys-to-log index.
All numbers in the rev file format are unsigned and are represented as
ASCII decimal.
@@ -521,6 +639,7 @@ Transaction layout
A transaction directory has the following layout:
props Transaction props
+ props-final Final transaction props (optional)
next-ids Next temporary node-ID and copy-ID
changes Changed-path information so far
node.<nid>.<cid> New node-rev data for node
@@ -533,19 +652,29 @@ In FS formats 1 and 2, it also contains:
rev Prototype rev file with new text reps
rev-lock Lockfile for writing to the above
-In newer formats, these files are in the txn-protorevs/ directory.
+(In newer formats, these files are in the txn-protorevs/ directory.)
+
+In format 7+ logical addressing mode, it contains two additional index
+files (see structure-indexes for a detailed description) and one more
+counter file:
+
+ itemidx Next item_index value as decimal integer
+ index.l2p Log-to-phys proto-index
+ index.p2l Phys-to-log proto-index
The prototype rev file is used to store the text representations as
they are received from the client. To ensure that only one client is
writing to the file at a given time, the "rev-lock" file is locked for
the duration of each write.
-The two kinds of props files are all in hash dump format. The "props"
+The three kinds of props files are all in hash dump format. The "props"
file will always be present. The "node.<nid>.<cid>.props" file will
-only be present if the node-rev properties have been changed.
+only be present if the node-rev properties have been changed. The
+"props-final" only exists while converting the transaction into a revision.
+
The <sha1> files have been introduced in FS format 6. Their content
-is that of text rep references: "<rev> <offset> <length> <size> <digest>"
+is that of text rep references: "<rev> <item_offset> <length> <size> <digest>"
They will be written for text reps in the current transaction and be
used to eliminate duplicate reps within that transaction.
@@ -619,3 +748,15 @@ reference the same path as above, but look for a list of children in
that file (instead of lock information). Children are listed as MD5
digests, too, so you would simply iterate over those digests and
consult the files they reference for lock information.
+
+
+Index Data
+----------
+
+Format 7 introduces logical addressing that requires item indexes
+to be translated / mapped to physical rev / pack file offsets.
+These indexes are appended to the respective rev / pack file.
+
+Details of the binary format used by these index files can be
+found in structure-indexes.
+
diff --git a/subversion/libsvn_fs_fs/structure-indexes b/subversion/libsvn_fs_fs/structure-indexes
new file mode 100644
index 0000000..25490c7
--- /dev/null
+++ b/subversion/libsvn_fs_fs/structure-indexes
@@ -0,0 +1,352 @@
+This file describes the design, data model, and storage formats of FSFS
+index data.
+
+
+Design
+======
+
+Each pack and each rev file using logical addressing contains exactly
+two index sections. One, the log-to-phys index, maps the (rev, item_index)
+pairs to absolute file offsets. The other, phys-to-log, is a reverse
+index that gives basic information on any file location. This is enough
+to read and cache any data without traversing DAGs.
+
+Rev and pack files are immutable, so the same is true for index data.
+During a transaction or while packing a file, a proto index file gets
+written (actually, one log-to-phys and one phys-to-log). Its format is
+a simple concatenation of runtime structs and as such, an implementation
+detail subject to change. A proto index basically aggregates all the
+information that must later be transformed into the final index.
+
+
+General design concerns
+-----------------------
+
+In Subversion, there is no limit to the size of a revision; even practical
+limits are in the order of millions of changes at least. Index data for
+these would be multiple megabytes in size with pack file indexes possibly
+approaching 1 GB. To ensure we still get roughly O(1) access time, we
+need a hierarchical data structure.
+
+Therefore, the indexes will start with a header containing an array of
+references to sub-sections or pages. The length of these pages varies
+but is limited to a size configurable in fsfs.conf.
+
+Finally, it is assumed that whole pages can be cached efficiently and
+with a high cache hit rate. So, although a page may have a thousand or
+more entries, the access time is still amortized O(1) in many scenarios.
+
+
+Items and item types
+--------------------
+
+The index implementation treats item_index and item type as simple ints,
+except for SVN_FS_FS__ITEM_INDEX_UNUSED and SVN_FS_FS__ITEM_TYPE_UNUSED.
+Since they have been defined as 0, the code may test for "used" etc.
+by simply comparing with 0.
+
+See section "addressing modes" in structure to a list of item types
+and pre-defined item_index values.
+
+
+Encoding
+--------
+
+The final index data format is tuned for space and decoding efficiency.
+Indexes are stored as a sequence of variable integers. The encoding is
+as follows:
+
+* Unsigned integers are stored in little endian order with a variable
+ length 7b/8b encoding. If most significant bit a byte has been set,
+ the next byte has also belongs to the same value.
+
+ 0x00 .. 0x7f -> 0x00 .. 0x7f ( 7 bits stored in 8 bits)
+ 0x80 .. 0xff -> 0x80 0x01 .. 0xff 0x01 (14 bits stored in 16 bits)
+ 0x100 .. 0x3fff -> 0x80 0x02 .. 0xff 0x7f (14 bits stored in 16 bits)
+ 0x100000000 -> 0x80 0x80 0x80 0x80 0x10 (35 bits stored in 40 bits)
+
+ Technically, we can represent integers of arbitrary lengths. Currently,
+ we only generate and parse up to 64 bits.
+
+* Signed integers are mapped onto the unsigned value space as follows:
+
+ x >= 0 -> 2 * x
+ x < 0 -> -2 * x - 1
+
+ Again, we can represent arbitrary length numbers that way but the code
+ is currently restricted to 64 bits.
+
+Most data is unsigned by nature but will be stored differentially using
+signed integers.
+
+
+Encoding in proto-index files
+-----------------------------
+
+These have a much simpler encoding. Throughout the files, all records have
+the same length (but different between L2P and P2L). All records contain
+unsigned 64 bit integers only, stored in little endian byte order.
+
+
+Log-to-phys index
+=================
+
+This index has to map (rev, item_index) -> offset. It assumes that the
+item_index values per revision are dense and start at 0. There may be
+unused item_index values, though; the data structure simply gets less
+space-efficient when the more sparse the value space gets.
+
+
+Index data model
+----------------
+
+hierarchy:
+
+ header -> per-revision info -> page -> offset
+
+ There is one entry per revision in the header. Per revision there are
+ one or more pages (exclusive to that revision) containing up to a known,
+ fixed limit of entries (= page size). The total access path is:
+
+ pages = header->pages[revision];
+ offsets = page = pages[item_index / page_size];
+ offset = offsets[item_index % page_size];
+
+ Different log-to-phys indexes in the same repository may have different
+ page sizes but within any given index, the page size is the same and
+ immutable.
+
+header:
+
+ <first revision> ... first revision covered by this index
+ <revision count> ... number of revision covered by this index
+ <page size> ... maximum number of entries per page
+ <page table index> ... array, for each revision containing the index in
+ <page table> of the first page that belongs to
+ this revision. This has <revision count>+1
+ entries to terminate the last revision.
+ <page table> ... array of page headers. It has
+ <page table index>[<revision count>] entries.
+
+page table:
+
+ <offset> ... absolute position of the page contents within the
+ index
+ <entry count> ... number of offset entries in the page.
+ Must match <header>.<page size> unless this is
+ the last page for the respective revision.
+ <size> ... length in bytes of the on-disk page description.
+ Note that this is redundant with the <offset>.
+
+page:
+
+ <entry count> ... number of offset entries in the page.
+ Must match <header>.<page size> unless this is
+ the last page for the respective revision.
+ Redundant with <page table>.<entry count>
+ <offsets> ... array of absolute file positions within the rev /
+ pack file. This has <entry count> entries.
+
+
+Index on-disk format
+--------------------
+
+ index := "L2P-INDEX\n" header revisions pages offsets
+
+ header := u(<header>.<first revision>) \
+ u(<header>.<page size>) \
+ u(<header>.<revision count>) \
+ u(s(<header>.<page table>))
+
+ revisions := u( <header>.<page table index>[k+1]
+ - <header>.<page table index>[k]),
+ for k in 0 .. <header>.<revision count>-1
+
+ pages := u(<header>.<page table>[k].<size>) \
+ u(<header>.<page table>[k].<entry count>),
+ for k in 0 .. s(<header>.<page table>)-1
+
+ offsets := page(k),
+ for k in 0 .. s(<header>.<page table>)-1
+
+ page(k) := i(<header>.<page table>[k].<offsets>[0]) \
+ i( <header>.<page table>[k].<offsets>[l] \
+ - <header>.<page table>[k].<offsets>[l - 1]),
+ for l in 1 .. s(<header>.<page table>[k].<entry count>)-1
+
+ u(x) ... unsigned int x in 7b/8b encoding
+ i(x) ... signed int x in 7b/8b encoding
+ s(x) ... number of entries in array x
+
+
+Proto index file format
+-----------------------
+
+The index will be created from a "revision-less" proto index file
+containing (<offset><item_index>) pairs only.
+
+All mappings belonging to the same revision must be written in one go but
+there is no restriction on the order of those entries. To signify that
+a new revision begins, a (0, 0) mapping must be written. A (0, 0) entry
+at the beginning of the file is optional and will be ignored.
+
+ <bof> /* begin of proto index file for revision r and following */
+ (0, 0) /* mark start of revision r, optional for first rev */
+ (off, item)* /* zero to many mappings in random order */
+ (0, 0) /* mark start of revision r + 1 */
+ (off, item)* /* zero to many mappings in random order */
+ (0, 0) /* mark start of revision r + 2 */
+ (off, item)* /* zero to many mappings in random order */
+ ...
+ <eof> /* end of file. */
+
+All entries are pairs of 64 bit unsigned integers in little endian order.
+
+
+Phys-to-log index
+=================
+
+This index has to map offset -> (rev, item_index, type, len, checksum).
+
+
+Index data model
+----------------
+
+hierarchy:
+
+ header -> page -> item info
+
+ Logically, the index splits up index rev / pack file into pages of a
+ fixed size. That page size may differ from the FS's block size. The
+ index will describe each rev / pack file page with one index page.
+
+ page = header->pages[offset % page_size];
+ item info = binary_search(page.data, offset)
+
+ Note that the current implementation will not return any data if the
+ offset is does not match any actual item start. To simplify the lookup,
+ the last index page will have an "unused item" entry for the section
+ behind EOF. Holes aren't allowed as well, i.e. every byte of the rev /
+ pack is expected to be covered by the index.
+
+ Also, there may be items stretching across page borders or even over
+ multiple pages. The data model solves this issue by storing the item
+ descriptions as a "primary array" and then representing the pages as
+ ranges within that array. Thus multiple pages may reference the same
+ item description.
+
+header:
+
+ <first revision> ... first revision covered by this index
+ <file size> ... size of the rev / pack file in bytes
+ <page size> ... number of bytes in the rev / pack file covered by
+ each index page
+ <page count> ... number of pages
+ <offsets> ... array of page offsets, i.e. locations the page
+ data within the index.
+ This array has <page count> + 1 entries.
+
+page:
+
+ <entries> ... array of item descriptions, ordered by offset.
+ First and last entry may cross page boundaries.
+
+entry:
+
+ <offset> ... absolute position in the pack / rev file
+ <size> ... on-disk size of the item in the pack / rev file
+ <type> ... item type
+ <FNV checksum> ... modified 32 bit FNV-1a checksum of that section
+ of the pack / rev file (see below). 0 for empty
+ or zero-length items
+ <revision> ... revision that this item belongs to
+ <item_index> ... item_index within that revision
+
+
+Index on-disk format
+--------------------
+
+ index := "P2L-INDEX\n" header pages items
+
+ header := u(<header>.<first revision>) \
+ u(<header>.<file size>) \
+ u(<header>.<page size>) \
+ u(<header>.<page count>)
+
+ pages := u(<header>.<offsets>[k+1] - <header>.<offsets>[k]),
+ for k in 0 .. <header>.<page count> -1
+
+ items := u(<items in page k>[0].<offset>) \
+ u(<items in page k>[l].<size>) \
+ i(c(<items in page k>[l]) - c(<items of page k>[l-1])) \
+ i( <items in page k>[l].<revision>
+ - <items in page k>[l-1].<revision>), \
+ u(FNV checksum)
+ for l in 0 .. s(<items in page k>)-1,
+ for k in 0 .. <header>.<page count>-1
+
+ u(x) ... unsigned int x in 7b/8b encoding
+ i(x) ... signed int x in 7b/8b encoding
+ s(x) ... number of entries in collection x
+ c(x) ... compound function := x.<item_index> * 8 + x.<type>
+
+ Access to negative indexes gives a 0 value.
+
+ <Items in page k> are in strict ascending offset order. Items that
+ started after the begin of a given page and overlap with the next page
+ will not be stored in the start page. The runtime representation will
+ duplicate items overlapping page boundaries; the on-disk representation
+ will not. Thus, pages inside large items will have zero entries on disk.
+
+
+Proto index file format
+-----------------------
+
+The index will be created from a proto index file containing simple
+instances of svn_fs_fs__p2l_entry_t with the following element order:
+
+ item offset as uint64
+ item size as uint64
+ item type as uint64
+ modified FNV1a checksum as uint64
+ revision as uint64, with SVN_INVALID_REVNUM mapped to 0
+ and revisions >= 0 stored as rev+1
+ item index as uint64
+
+All values are stored in little endian order.
+
+Page table and header information, except start revision and page size,
+can easily be derived from that information.
+
+All entries must be written in strict offset order. Overlapping entries
+are not allowed; zero-length items are.
+
+In transactions, the final revision number may not be known when writing
+the proto index file (e.g. while still writing the proto rev file). Items
+with revision set to SVN_INVALID_REVNUM will therefore be automatically
+updated when creating the final index. This is possible in conjunction
+with rev files but not for pack files.
+
+
+FNV checksum
+------------
+
+FNV-1a can be found here: http://www.isthe.com/chongo/tech/comp/fnv/
+For performance reasons we use a modified version:
+
+* split the input byte stream [b0 .. bN] into 4 sub-streams of equal
+ length and up to 3 remnants:
+
+ [b0 b4 b8 ..], [b1 b5 b9 ..], [b2 b6 b10 ..], [b3 b7 b11 ..], [remnant]
+
+* calculate 32 bit FNV-1a checksums for the 4 substreams:
+
+ h0 = fnv_1a([b0 b4 b8 ..]), ..., h3 = fnv_1a([b3 b7 b11 ..])
+
+* combine the big endian representation of these checksums plus the
+ remnant of the original stream into a 12 to 15 byte long intermediate
+
+ [i0 .. iK], 12 <= K+1 <= 15
+
+* FNV checksum = fnv_1a([i0 .. iK]) in big endian representation
+
diff --git a/subversion/libsvn_fs_fs/temp_serializer.c b/subversion/libsvn_fs_fs/temp_serializer.c
index 0178143..4e7ae2d 100644
--- a/subversion/libsvn_fs_fs/temp_serializer.c
+++ b/subversion/libsvn_fs_fs/temp_serializer.c
@@ -24,15 +24,18 @@
#include "svn_pools.h"
#include "svn_hash.h"
-
-#include "id.h"
+#include "svn_sorts.h"
#include "svn_fs.h"
#include "private/svn_fs_util.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_temp_serializer.h"
#include "private/svn_subr_private.h"
+#include "id.h"
#include "temp_serializer.h"
+#include "low_level.h"
+#include "cached_data.h"
/* Utility to encode a signed NUMBER into a variable-length sequence of
* 8-bit chars in KEY_BUFFER and return the last writen position.
@@ -106,13 +109,12 @@ serialize_svn_string(svn_temp_serializer__context_t *context,
/* the "string" content may actually be arbitrary binary data.
* Thus, we cannot use svn_temp_serializer__add_string. */
- svn_temp_serializer__push(context,
- (const void * const *)&string->data,
- string->len + 1);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&string->data,
+ string->len + 1);
/* back to the caller's nesting level */
svn_temp_serializer__pop(context);
- svn_temp_serializer__pop(context);
}
/* Utility function to deserialize the STRING inside the BUFFER.
@@ -127,44 +129,6 @@ deserialize_svn_string(void *buffer, svn_string_t **string)
svn_temp_deserializer__resolve(*string, (void **)&(*string)->data);
}
-/* Utility function to serialize checkum CS within the given serialization
- * CONTEXT.
- */
-static void
-serialize_checksum(svn_temp_serializer__context_t *context,
- svn_checksum_t * const *cs)
-{
- const svn_checksum_t *checksum = *cs;
- if (checksum == NULL)
- return;
-
- svn_temp_serializer__push(context,
- (const void * const *)cs,
- sizeof(*checksum));
-
- /* The digest is arbitrary binary data.
- * Thus, we cannot use svn_temp_serializer__add_string. */
- svn_temp_serializer__push(context,
- (const void * const *)&checksum->digest,
- svn_checksum_size(checksum));
-
- /* return to the caller's nesting level */
- svn_temp_serializer__pop(context);
- svn_temp_serializer__pop(context);
-}
-
-/* Utility function to deserialize the checksum CS inside the BUFFER.
- */
-static void
-deserialize_checksum(void *buffer, svn_checksum_t **cs)
-{
- svn_temp_deserializer__resolve(buffer, (void **)cs);
- if (*cs == NULL)
- return;
-
- svn_temp_deserializer__resolve(*cs, (void **)&(*cs)->digest);
-}
-
/* Utility function to serialize the REPRESENTATION within the given
* serialization CONTEXT.
*/
@@ -177,48 +141,17 @@ serialize_representation(svn_temp_serializer__context_t *context,
return;
/* serialize the representation struct itself */
- svn_temp_serializer__push(context,
- (const void * const *)representation,
- sizeof(*rep));
-
- /* serialize sub-structures */
- serialize_checksum(context, &rep->md5_checksum);
- serialize_checksum(context, &rep->sha1_checksum);
-
- svn_temp_serializer__add_string(context, &rep->txn_id);
- svn_temp_serializer__add_string(context, &rep->uniquifier);
-
- /* return to the caller's nesting level */
- svn_temp_serializer__pop(context);
-}
-
-/* Utility function to deserialize the REPRESENTATIONS inside the BUFFER.
- */
-static void
-deserialize_representation(void *buffer,
- representation_t **representation)
-{
- representation_t *rep;
-
- /* fixup the reference to the representation itself */
- svn_temp_deserializer__resolve(buffer, (void **)representation);
- rep = *representation;
- if (rep == NULL)
- return;
-
- /* fixup of sub-structures */
- deserialize_checksum(rep, &rep->md5_checksum);
- deserialize_checksum(rep, &rep->sha1_checksum);
-
- svn_temp_deserializer__resolve(rep, (void **)&rep->txn_id);
- svn_temp_deserializer__resolve(rep, (void **)&rep->uniquifier);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)representation,
+ sizeof(*rep));
}
-/* auxilliary structure representing the content of a directory hash */
-typedef struct hash_data_t
+/* auxiliary structure representing the content of a directory array */
+typedef struct dir_data_t
{
- /* number of entries in the directory */
- apr_size_t count;
+ /* number of entries in the directory
+ * (it's int because the directory is an APR array) */
+ int count;
/* number of unused dir entry buckets in the index */
apr_size_t over_provision;
@@ -238,14 +171,7 @@ typedef struct hash_data_t
/* size of the serialized entries and don't be too wasteful
* (needed since the entries are no longer in sequence) */
apr_uint32_t *lengths;
-} hash_data_t;
-
-static int
-compare_dirent_id_names(const void *lhs, const void *rhs)
-{
- return strcmp((*(const svn_fs_dirent_t *const *)lhs)->name,
- (*(const svn_fs_dirent_t *const *)rhs)->name);
-}
+} dir_data_t;
/* Utility function to serialize the *ENTRY_P into a the given
* serialization CONTEXT. Return the serialized size of the
@@ -276,91 +202,85 @@ serialize_dir_entry(svn_temp_serializer__context_t *context,
* context to be returned. Allocation will be made form POOL.
*/
static svn_temp_serializer__context_t *
-serialize_dir(apr_hash_t *entries, apr_pool_t *pool)
+serialize_dir(apr_array_header_t *entries, apr_pool_t *pool)
{
- hash_data_t hash_data;
- apr_hash_index_t *hi;
- apr_size_t i = 0;
+ dir_data_t dir_data;
+ int i = 0;
svn_temp_serializer__context_t *context;
/* calculate sizes */
- apr_size_t count = apr_hash_count(entries);
+ int count = entries->nelts;
apr_size_t over_provision = 2 + count / 4;
apr_size_t entries_len = (count + over_provision) * sizeof(svn_fs_dirent_t*);
apr_size_t lengths_len = (count + over_provision) * sizeof(apr_uint32_t);
- /* copy the hash entries to an auxilliary struct of known layout */
- hash_data.count = count;
- hash_data.over_provision = over_provision;
- hash_data.operations = 0;
- hash_data.entries = apr_palloc(pool, entries_len);
- hash_data.lengths = apr_palloc(pool, lengths_len);
+ /* copy the hash entries to an auxiliary struct of known layout */
+ dir_data.count = count;
+ dir_data.over_provision = over_provision;
+ dir_data.operations = 0;
+ dir_data.entries = apr_palloc(pool, entries_len);
+ dir_data.lengths = apr_palloc(pool, lengths_len);
- for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi), ++i)
- hash_data.entries[i] = svn__apr_hash_index_val(hi);
-
- /* sort entry index by ID name */
- qsort(hash_data.entries,
- count,
- sizeof(*hash_data.entries),
- compare_dirent_id_names);
+ for (i = 0; i < count; ++i)
+ dir_data.entries[i] = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
/* Serialize that aux. structure into a new one. Also, provide a good
* estimate for the size of the buffer that we will need. */
- context = svn_temp_serializer__init(&hash_data,
- sizeof(hash_data),
+ context = svn_temp_serializer__init(&dir_data,
+ sizeof(dir_data),
50 + count * 200 + entries_len,
pool);
/* serialize entries references */
svn_temp_serializer__push(context,
- (const void * const *)&hash_data.entries,
+ (const void * const *)&dir_data.entries,
entries_len);
/* serialize the individual entries and their sub-structures */
for (i = 0; i < count; ++i)
serialize_dir_entry(context,
- &hash_data.entries[i],
- &hash_data.lengths[i]);
+ &dir_data.entries[i],
+ &dir_data.lengths[i]);
svn_temp_serializer__pop(context);
/* serialize entries references */
svn_temp_serializer__push(context,
- (const void * const *)&hash_data.lengths,
+ (const void * const *)&dir_data.lengths,
lengths_len);
return context;
}
-/* Utility function to reconstruct a dir entries hash from serialized data
- * in BUFFER and HASH_DATA. Allocation will be made form POOL.
+/* Utility function to reconstruct a dir entries array from serialized data
+ * in BUFFER and DIR_DATA. Allocation will be made form POOL.
*/
-static apr_hash_t *
-deserialize_dir(void *buffer, hash_data_t *hash_data, apr_pool_t *pool)
+static apr_array_header_t *
+deserialize_dir(void *buffer, dir_data_t *dir_data, apr_pool_t *pool)
{
- apr_hash_t *result = svn_hash__make(pool);
+ apr_array_header_t *result
+ = apr_array_make(pool, dir_data->count, sizeof(svn_fs_dirent_t *));
apr_size_t i;
apr_size_t count;
svn_fs_dirent_t *entry;
svn_fs_dirent_t **entries;
/* resolve the reference to the entries array */
- svn_temp_deserializer__resolve(buffer, (void **)&hash_data->entries);
- entries = hash_data->entries;
+ svn_temp_deserializer__resolve(buffer, (void **)&dir_data->entries);
+ entries = dir_data->entries;
/* fixup the references within each entry and add it to the hash */
- for (i = 0, count = hash_data->count; i < count; ++i)
+ for (i = 0, count = dir_data->count; i < count; ++i)
{
svn_temp_deserializer__resolve(entries, (void **)&entries[i]);
- entry = hash_data->entries[i];
+ entry = dir_data->entries[i];
/* pointer fixup */
svn_temp_deserializer__resolve(entry, (void **)&entry->name);
svn_fs_fs__id_deserialize(entry, (svn_fs_id_t **)&entry->id);
/* add the entry to the hash */
- svn_hash_sets(result, entry->name, entry);
+ APR_ARRAY_PUSH(result, svn_fs_dirent_t *) = entry;
}
/* return the now complete hash */
@@ -413,14 +333,63 @@ svn_fs_fs__noderev_deserialize(void *buffer,
/* fixup of sub-structures */
svn_fs_fs__id_deserialize(noderev, (svn_fs_id_t **)&noderev->id);
svn_fs_fs__id_deserialize(noderev, (svn_fs_id_t **)&noderev->predecessor_id);
- deserialize_representation(noderev, &noderev->prop_rep);
- deserialize_representation(noderev, &noderev->data_rep);
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->prop_rep);
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->data_rep);
svn_temp_deserializer__resolve(noderev, (void **)&noderev->copyfrom_path);
svn_temp_deserializer__resolve(noderev, (void **)&noderev->copyroot_path);
svn_temp_deserializer__resolve(noderev, (void **)&noderev->created_path);
}
+svn_error_t *
+svn_fs_fs__serialize_raw_window(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__raw_cached_window_t *window = item;
+ svn_stringbuf_t *serialized;
+
+ /* initialize the serialization process and allocate a buffer large
+ * enough to do prevent re-allocations. */
+ svn_temp_serializer__context_t *context =
+ svn_temp_serializer__init(window,
+ sizeof(*window),
+ sizeof(*window) + window->window.len + 16,
+ pool);
+
+ /* serialize the sub-structure(s) */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&window->window.data,
+ window->window.len + 1);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *buffer = serialized->data;
+ *buffer_size = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_raw_window(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__raw_cached_window_t *window =
+ (svn_fs_fs__raw_cached_window_t *)buffer;
+
+ /* pointer reference fixup */
+ svn_temp_deserializer__resolve(window, (void **)&window->window.data);
+
+ /* done */
+ *item = buffer;
+
+ return SVN_NO_ERROR;
+}
+
/* Utility function to serialize COUNT svn_txdelta_op_t objects
* at OPS in the given serialization CONTEXT.
@@ -434,10 +403,9 @@ serialize_txdelta_ops(svn_temp_serializer__context_t *context,
return;
/* the ops form a contiguous chunk of memory with no further references */
- svn_temp_serializer__push(context,
- (const void * const *)ops,
- count * sizeof(svn_txdelta_op_t));
- svn_temp_serializer__pop(context);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)ops,
+ count * sizeof(svn_txdelta_op_t));
}
/* Utility function to serialize W in the given serialization CONTEXT.
@@ -551,7 +519,7 @@ svn_fs_fs__deserialize_manifest(void **out,
return SVN_NO_ERROR;
}
-/* Auxilliary structure representing the content of a properties hash.
+/* Auxiliary structure representing the content of a properties hash.
This structure is much easier to (de-)serialize than an apr_hash.
*/
typedef struct properties_data_t
@@ -621,7 +589,7 @@ svn_fs_fs__serialize_properties(void **data,
svn_stringbuf_t *serialized;
apr_size_t i;
- /* create our auxilliary data structure */
+ /* create our auxiliary data structure */
properties.count = apr_hash_count(hash);
properties.keys = apr_palloc(pool, sizeof(const char*) * (properties.count + 1));
properties.values = apr_palloc(pool, sizeof(const char*) * properties.count);
@@ -629,8 +597,8 @@ svn_fs_fs__serialize_properties(void **data,
/* populate it with the hash entries */
for (hi = apr_hash_first(pool, hash), i=0; hi; hi = apr_hash_next(hi), ++i)
{
- properties.keys[i] = svn__apr_hash_index_key(hi);
- properties.values[i] = svn__apr_hash_index_val(hi);
+ properties.keys[i] = apr_hash_this_key(hi);
+ properties.values[i] = apr_hash_this_val(hi);
}
/* serialize it */
@@ -662,7 +630,7 @@ svn_fs_fs__deserialize_properties(void **out,
properties_data_t *properties = (properties_data_t *)data;
size_t i;
- /* de-serialize our auxilliary data structure */
+ /* de-serialize our auxiliary data structure */
svn_temp_deserializer__resolve(properties, (void**)&properties->keys);
svn_temp_deserializer__resolve(properties, (void**)&properties->values);
@@ -670,10 +638,10 @@ svn_fs_fs__deserialize_properties(void **out,
for (i = 0; i < properties->count; ++i)
{
apr_size_t len = properties->keys[i+1] - properties->keys[i] - 1;
- svn_temp_deserializer__resolve((void*)properties->keys,
+ svn_temp_deserializer__resolve(properties->keys,
(void**)&properties->keys[i]);
- deserialize_svn_string((void*)properties->values,
+ deserialize_svn_string(properties->values,
(svn_string_t **)&properties->values[i]);
apr_hash_set(hash,
@@ -785,7 +753,7 @@ return_serialized_dir_context(svn_temp_serializer__context_t *context,
*data = serialized->data;
*data_len = serialized->blocksize;
- ((hash_data_t *)serialized->data)->len = serialized->len;
+ ((dir_data_t *)serialized->data)->len = serialized->len;
return SVN_NO_ERROR;
}
@@ -796,7 +764,7 @@ svn_fs_fs__serialize_dir_entries(void **data,
void *in,
apr_pool_t *pool)
{
- apr_hash_t *dir = in;
+ apr_array_header_t *dir = in;
/* serialize the dir content into a new serialization context
* and return the serialized data */
@@ -812,10 +780,10 @@ svn_fs_fs__deserialize_dir_entries(void **out,
apr_pool_t *pool)
{
/* Copy the _full_ buffer as it also contains the sub-structures. */
- hash_data_t *hash_data = (hash_data_t *)data;
+ dir_data_t *dir_data = (dir_data_t *)data;
/* reconstruct the hash from the serialized data */
- *out = deserialize_dir(hash_data, hash_data, pool);
+ *out = deserialize_dir(dir_data, dir_data, pool);
return SVN_NO_ERROR;
}
@@ -888,22 +856,22 @@ svn_fs_fs__extract_dir_entry(void **out,
void *baton,
apr_pool_t *pool)
{
- const hash_data_t *hash_data = data;
+ const dir_data_t *dir_data = data;
const char* name = baton;
svn_boolean_t found;
/* resolve the reference to the entries array */
const svn_fs_dirent_t * const *entries =
- svn_temp_deserializer__ptr(data, (const void *const *)&hash_data->entries);
+ svn_temp_deserializer__ptr(data, (const void *const *)&dir_data->entries);
/* resolve the reference to the lengths array */
const apr_uint32_t *lengths =
- svn_temp_deserializer__ptr(data, (const void *const *)&hash_data->lengths);
+ svn_temp_deserializer__ptr(data, (const void *const *)&dir_data->lengths);
/* binary search for the desired entry by name */
apr_size_t pos = find_entry((svn_fs_dirent_t **)entries,
name,
- hash_data->count,
+ dir_data->count,
&found);
/* de-serialize that entry or return NULL, if no match has been found */
@@ -942,14 +910,33 @@ slowly_replace_dir_entry(void **data,
apr_pool_t *pool)
{
replace_baton_t *replace_baton = (replace_baton_t *)baton;
- hash_data_t *hash_data = (hash_data_t *)*data;
- apr_hash_t *dir;
+ dir_data_t *dir_data = (dir_data_t *)*data;
+ apr_array_header_t *dir;
+ int idx = -1;
+ svn_fs_dirent_t *entry;
SVN_ERR(svn_fs_fs__deserialize_dir_entries((void **)&dir,
*data,
- hash_data->len,
+ dir_data->len,
pool));
- svn_hash_sets(dir, replace_baton->name, replace_baton->new_entry);
+
+ entry = svn_fs_fs__find_dir_entry(dir, replace_baton->name, &idx);
+
+ /* Replacement or removal? */
+ if (replace_baton->new_entry)
+ {
+ /* Replace ENTRY with / insert the NEW_ENTRY */
+ if (entry)
+ APR_ARRAY_IDX(dir, idx, svn_fs_dirent_t *) = replace_baton->new_entry;
+ else
+ svn_sort__array_insert(dir, &replace_baton->new_entry, idx);
+ }
+ else
+ {
+ /* Remove the old ENTRY. */
+ if (entry)
+ svn_sort__array_delete(dir, idx, 1);
+ }
return svn_fs_fs__serialize_dir_entries(data, data_len, dir, pool);
}
@@ -961,7 +948,7 @@ svn_fs_fs__replace_dir_entry(void **data,
apr_pool_t *pool)
{
replace_baton_t *replace_baton = (replace_baton_t *)baton;
- hash_data_t *hash_data = (hash_data_t *)*data;
+ dir_data_t *dir_data = (dir_data_t *)*data;
svn_boolean_t found;
svn_fs_dirent_t **entries;
apr_uint32_t *lengths;
@@ -971,23 +958,23 @@ svn_fs_fs__replace_dir_entry(void **data,
svn_temp_serializer__context_t *context;
/* after quite a number of operations, let's re-pack everything.
- * This is to limit the number of vasted space as we cannot overwrite
+ * This is to limit the number of wasted space as we cannot overwrite
* existing data but must always append. */
- if (hash_data->operations > 2 + hash_data->count / 4)
+ if (dir_data->operations > 2 + dir_data->count / 4)
return slowly_replace_dir_entry(data, data_len, baton, pool);
/* resolve the reference to the entries array */
entries = (svn_fs_dirent_t **)
- svn_temp_deserializer__ptr((const char *)hash_data,
- (const void *const *)&hash_data->entries);
+ svn_temp_deserializer__ptr(dir_data,
+ (const void *const *)&dir_data->entries);
/* resolve the reference to the lengths array */
lengths = (apr_uint32_t *)
- svn_temp_deserializer__ptr((const char *)hash_data,
- (const void *const *)&hash_data->lengths);
+ svn_temp_deserializer__ptr(dir_data,
+ (const void *const *)&dir_data->lengths);
/* binary search for the desired entry by name */
- pos = find_entry(entries, replace_baton->name, hash_data->count, &found);
+ pos = find_entry(entries, replace_baton->name, dir_data->count, &found);
/* handle entry removal (if found at all) */
if (replace_baton->new_entry == NULL)
@@ -997,14 +984,14 @@ svn_fs_fs__replace_dir_entry(void **data,
/* remove reference to the entry from the index */
memmove(&entries[pos],
&entries[pos + 1],
- sizeof(entries[pos]) * (hash_data->count - pos));
+ sizeof(entries[pos]) * (dir_data->count - pos));
memmove(&lengths[pos],
&lengths[pos + 1],
- sizeof(lengths[pos]) * (hash_data->count - pos));
+ sizeof(lengths[pos]) * (dir_data->count - pos));
- hash_data->count--;
- hash_data->over_provision++;
- hash_data->operations++;
+ dir_data->count--;
+ dir_data->over_provision++;
+ dir_data->operations++;
}
return SVN_NO_ERROR;
@@ -1016,27 +1003,27 @@ svn_fs_fs__replace_dir_entry(void **data,
/* fallback to slow operation if there is no place left to insert an
* new entry to index. That will automatically give add some spare
* entries ("overprovision"). */
- if (hash_data->over_provision == 0)
+ if (dir_data->over_provision == 0)
return slowly_replace_dir_entry(data, data_len, baton, pool);
/* make entries[index] available for pointing to the new entry */
memmove(&entries[pos + 1],
&entries[pos],
- sizeof(entries[pos]) * (hash_data->count - pos));
+ sizeof(entries[pos]) * (dir_data->count - pos));
memmove(&lengths[pos + 1],
&lengths[pos],
- sizeof(lengths[pos]) * (hash_data->count - pos));
+ sizeof(lengths[pos]) * (dir_data->count - pos));
- hash_data->count++;
- hash_data->over_provision--;
- hash_data->operations++;
+ dir_data->count++;
+ dir_data->over_provision--;
+ dir_data->operations++;
}
/* de-serialize the new entry */
entries[pos] = replace_baton->new_entry;
- context = svn_temp_serializer__init_append(hash_data,
+ context = svn_temp_serializer__init_append(dir_data,
entries,
- hash_data->len,
+ dir_data->len,
*data_len,
pool);
serialize_dir_entry(context, &entries[pos], &length);
@@ -1050,15 +1037,45 @@ svn_fs_fs__replace_dir_entry(void **data,
* pointer may no longer point to the entry in that buffer. Therefore,
* re-map it again and store the length value after that. */
- hash_data = (hash_data_t *)*data;
+ dir_data = (dir_data_t *)*data;
lengths = (apr_uint32_t *)
- svn_temp_deserializer__ptr((const char *)hash_data,
- (const void *const *)&hash_data->lengths);
+ svn_temp_deserializer__ptr(dir_data,
+ (const void *const *)&dir_data->lengths);
lengths[pos] = length;
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_fs__serialize_rep_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__rep_header_t *copy = apr_palloc(pool, sizeof(*copy));
+ *copy = *(svn_fs_fs__rep_header_t *)in;
+
+ *data_len = sizeof(svn_fs_fs__rep_header_t);
+ *data = copy;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__deserialize_rep_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__rep_header_t *copy = apr_palloc(pool, sizeof(*copy));
+ SVN_ERR_ASSERT(data_len == sizeof(*copy));
+
+ *copy = *(svn_fs_fs__rep_header_t *)data;
+ *out = data;
+
+ return SVN_NO_ERROR;
+}
+
/* Utility function to serialize change CHANGE_P in the given serialization
* CONTEXT.
*/
@@ -1076,10 +1093,10 @@ serialize_change(svn_temp_serializer__context_t *context,
sizeof(*change));
/* serialize sub-structures */
- svn_fs_fs__id_serialize(context, &change->noderev_id);
+ svn_fs_fs__id_serialize(context, &change->info.node_rev_id);
- svn_temp_serializer__add_string(context, &change->path);
- svn_temp_serializer__add_string(context, &change->copyfrom_path);
+ svn_temp_serializer__add_string(context, &change->path.data);
+ svn_temp_serializer__add_string(context, &change->info.copyfrom_path);
/* return to the caller's nesting level */
svn_temp_serializer__pop(context);
@@ -1101,10 +1118,10 @@ deserialize_change(void *buffer, change_t **change_p)
return;
/* fix-up of sub-structures */
- svn_fs_fs__id_deserialize(change, (svn_fs_id_t **)&change->noderev_id);
+ svn_fs_fs__id_deserialize(change, (svn_fs_id_t **)&change->info.node_rev_id);
- svn_temp_deserializer__resolve(change, (void **)&change->path);
- svn_temp_deserializer__resolve(change, (void **)&change->copyfrom_path);
+ svn_temp_deserializer__resolve(change, (void **)&change->path.data);
+ svn_temp_deserializer__resolve(change, (void **)&change->info.copyfrom_path);
}
/* Auxiliary structure representing the content of a change_t array.
@@ -1131,18 +1148,15 @@ svn_fs_fs__serialize_changes(void **data,
svn_stringbuf_t *serialized;
int i;
- /* initialize our auxiliary data structure */
+ /* initialize our auxiliary data structure and link it to the
+ * array elements */
changes.count = array->nelts;
- changes.changes = apr_palloc(pool, sizeof(change_t*) * changes.count);
-
- /* populate it with the array elements */
- for (i = 0; i < changes.count; ++i)
- changes.changes[i] = APR_ARRAY_IDX(array, i, change_t*);
+ changes.changes = (change_t **)array->elts;
/* serialize it and all its elements */
context = svn_temp_serializer__init(&changes,
sizeof(changes),
- changes.count * 100,
+ changes.count * 250,
pool);
svn_temp_serializer__push(context,
@@ -1171,19 +1185,21 @@ svn_fs_fs__deserialize_changes(void **out,
{
int i;
changes_data_t *changes = (changes_data_t *)data;
- apr_array_header_t *array = apr_array_make(pool, changes->count,
- sizeof(change_t *));
+ apr_array_header_t *array = apr_array_make(pool, 0, sizeof(change_t *));
/* de-serialize our auxiliary data structure */
svn_temp_deserializer__resolve(changes, (void**)&changes->changes);
/* de-serialize each entry and add it to the array */
for (i = 0; i < changes->count; ++i)
- {
- deserialize_change((void*)changes->changes,
- (change_t **)&changes->changes[i]);
- APR_ARRAY_PUSH(array, change_t *) = changes->changes[i];
- }
+ deserialize_change(changes->changes,
+ (change_t **)&changes->changes[i]);
+
+ /* Use the changes buffer as the array's data buffer
+ * (DATA remains valid for at least as long as POOL). */
+ array->elts = (char *)changes->changes;
+ array->nelts = changes->count;
+ array->nalloc = changes->count;
/* done */
*out = array;
@@ -1252,7 +1268,7 @@ svn_fs_fs__serialize_mergeinfo(void **data,
i = 0;
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- svn_rangelist_t *ranges = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *ranges = apr_hash_this_val(hi);
for (k = 0; k < ranges->nelts; ++k, ++i)
merges.ranges[i] = *APR_ARRAY_IDX(ranges, k, svn_merge_range_t*);
}
@@ -1274,22 +1290,19 @@ svn_fs_fs__serialize_mergeinfo(void **data,
svn_temp_serializer__pop(context);
/* key lengths array */
- svn_temp_serializer__push(context,
- (const void * const *)&merges.key_lengths,
- merges.count * sizeof(*merges.key_lengths));
- svn_temp_serializer__pop(context);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.key_lengths,
+ merges.count * sizeof(*merges.key_lengths));
/* range counts array */
- svn_temp_serializer__push(context,
- (const void * const *)&merges.range_counts,
- merges.count * sizeof(*merges.range_counts));
- svn_temp_serializer__pop(context);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.range_counts,
+ merges.count * sizeof(*merges.range_counts));
/* ranges */
- svn_temp_serializer__push(context,
- (const void * const *)&merges.ranges,
- range_count * sizeof(*merges.ranges));
- svn_temp_serializer__pop(context);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.ranges,
+ range_count * sizeof(*merges.ranges));
/* return the serialized result */
serialized = svn_temp_serializer__get(context);
@@ -1328,7 +1341,7 @@ svn_fs_fs__deserialize_mergeinfo(void **out,
for (k = 0; k < merges->range_counts[i]; ++k, ++n)
APR_ARRAY_PUSH(ranges, svn_merge_range_t*) = &merges->ranges[n];
- svn_temp_deserializer__resolve((void*)merges->keys,
+ svn_temp_deserializer__resolve(merges->keys,
(void**)&merges->keys[i]);
apr_hash_set(mergeinfo, merges->keys[i], merges->key_lengths[i], ranges);
}
diff --git a/subversion/libsvn_fs_fs/temp_serializer.h b/subversion/libsvn_fs_fs/temp_serializer.h
index 1009d63..4d14b01 100644
--- a/subversion/libsvn_fs_fs/temp_serializer.h
+++ b/subversion/libsvn_fs_fs/temp_serializer.h
@@ -49,9 +49,42 @@ void
svn_fs_fs__noderev_deserialize(void *buffer,
node_revision_t **noderev_p);
+
+/**
+ * Adds position information to the the raw window data in WINDOW.
+ */
+typedef struct
+{
+ /* the (unprocessed) txdelta window byte sequence cached / to be cached */
+ svn_string_t window;
+
+ /* the offset within the representation right after reading the window */
+ apr_off_t end_offset;
+} svn_fs_fs__raw_cached_window_t;
+
+/**
+ * Implements #svn_cache__serialize_func_t for
+ * #svn_fs_fs__raw_cached_window_t.
+ */
+svn_error_t *
+svn_fs_fs__serialize_raw_window(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for
+ * #svn_fs_fs__raw_cached_window_t.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_raw_window(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool);
+
/**
* #svn_txdelta_window_t is not sufficient for caching the data it
- * represents because data read process needs auxilliary information.
+ * represents because data read process needs auxiliary information.
*/
typedef struct
{
@@ -159,7 +192,7 @@ svn_fs_fs__deserialize_node_revision(void **item,
apr_pool_t *pool);
/**
- * Implements #svn_cache__serialize_func_t for a directory contents hash
+ * Implements #svn_cache__serialize_func_t for a directory contents array
*/
svn_error_t *
svn_fs_fs__serialize_dir_entries(void **data,
@@ -168,7 +201,7 @@ svn_fs_fs__serialize_dir_entries(void **data,
apr_pool_t *pool);
/**
- * Implements #svn_cache__deserialize_func_t for a directory contents hash
+ * Implements #svn_cache__deserialize_func_t for a directory contents array
*/
svn_error_t *
svn_fs_fs__deserialize_dir_entries(void **out,
@@ -226,6 +259,24 @@ svn_fs_fs__replace_dir_entry(void **data,
apr_pool_t *pool);
/**
+ * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__rep_header_t.
+ */
+svn_error_t *
+svn_fs_fs__serialize_rep_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__rep_header_t.
+ */
+svn_error_t *
+svn_fs_fs__deserialize_rep_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
* Implements #svn_cache__serialize_func_t for an #apr_array_header_t of
* #change_t *.
*/
diff --git a/subversion/libsvn_fs_fs/transaction.c b/subversion/libsvn_fs_fs/transaction.c
new file mode 100644
index 0000000..bc93a5c
--- /dev/null
+++ b/subversion/libsvn_fs_fs/transaction.c
@@ -0,0 +1,3964 @@
+/* transaction.c --- transaction-related functions of FSFS
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "transaction.h"
+
+#include <assert.h>
+#include <apr_sha1.h>
+
+#include "svn_hash.h"
+#include "svn_props.h"
+#include "svn_sorts.h"
+#include "svn_time.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_fs.h"
+#include "index.h"
+#include "tree.h"
+#include "util.h"
+#include "id.h"
+#include "low_level.h"
+#include "temp_serializer.h"
+#include "cached_data.h"
+#include "lock.h"
+#include "rep-cache.h"
+
+#include "private/svn_fs_util.h"
+#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Return the name of the sha1->rep mapping file in transaction TXN_ID
+ * within FS for the given SHA1 checksum. Use POOL for allocations.
+ */
+static APR_INLINE const char *
+path_txn_sha1(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ const unsigned char *sha1,
+ apr_pool_t *pool)
+{
+ svn_checksum_t checksum;
+ checksum.digest = sha1;
+ checksum.kind = svn_checksum_sha1;
+
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ svn_checksum_to_cstring(&checksum, pool),
+ pool);
+}
+
+static APR_INLINE const char *
+path_txn_changes(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_CHANGES, pool);
+}
+
+static APR_INLINE const char *
+path_txn_props(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_TXN_PROPS, pool);
+}
+
+static APR_INLINE const char *
+path_txn_props_final(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_TXN_PROPS_FINAL, pool);
+}
+
+static APR_INLINE const char *
+path_txn_next_ids(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_NEXT_IDS, pool);
+}
+
+
+/* The vtable associated with an open transaction object. */
+static txn_vtable_t txn_vtable = {
+ svn_fs_fs__commit_txn,
+ svn_fs_fs__abort_txn,
+ svn_fs_fs__txn_prop,
+ svn_fs_fs__txn_proplist,
+ svn_fs_fs__change_txn_prop,
+ svn_fs_fs__txn_root,
+ svn_fs_fs__change_txn_props
+};
+
+/* FSFS-specific data being attached to svn_fs_txn_t.
+ */
+typedef struct fs_txn_data_t
+{
+ /* Strongly typed representation of the TXN's ID member. */
+ svn_fs_fs__id_part_t txn_id;
+} fs_txn_data_t;
+
+const svn_fs_fs__id_part_t *
+svn_fs_fs__txn_get_id(svn_fs_txn_t *txn)
+{
+ fs_txn_data_t *ftd = txn->fsap_data;
+ return &ftd->txn_id;
+}
+
+/* Functions for working with shared transaction data. */
+
+/* Return the transaction object for transaction TXN_ID from the
+ transaction list of filesystem FS (which must already be locked via the
+ txn_list_lock mutex). If the transaction does not exist in the list,
+ then create a new transaction object and return it (if CREATE_NEW is
+ true) or return NULL (otherwise). */
+static fs_fs_shared_txn_data_t *
+get_shared_txn(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ svn_boolean_t create_new)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ fs_fs_shared_data_t *ffsd = ffd->shared;
+ fs_fs_shared_txn_data_t *txn;
+
+ for (txn = ffsd->txns; txn; txn = txn->next)
+ if (svn_fs_fs__id_part_eq(&txn->txn_id, txn_id))
+ break;
+
+ if (txn || !create_new)
+ return txn;
+
+ /* Use the transaction object from the (single-object) freelist,
+ if one is available, or otherwise create a new object. */
+ if (ffsd->free_txn)
+ {
+ txn = ffsd->free_txn;
+ ffsd->free_txn = NULL;
+ }
+ else
+ {
+ apr_pool_t *subpool = svn_pool_create(ffsd->common_pool);
+ txn = apr_palloc(subpool, sizeof(*txn));
+ txn->pool = subpool;
+ }
+
+ txn->txn_id = *txn_id;
+ txn->being_written = FALSE;
+
+ /* Link this transaction into the head of the list. We will typically
+ be dealing with only one active transaction at a time, so it makes
+ sense for searches through the transaction list to look at the
+ newest transactions first. */
+ txn->next = ffsd->txns;
+ ffsd->txns = txn;
+
+ return txn;
+}
+
+/* Free the transaction object for transaction TXN_ID, and remove it
+ from the transaction list of filesystem FS (which must already be
+ locked via the txn_list_lock mutex). Do nothing if the transaction
+ does not exist. */
+static void
+free_shared_txn(svn_fs_t *fs, const svn_fs_fs__id_part_t *txn_id)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ fs_fs_shared_data_t *ffsd = ffd->shared;
+ fs_fs_shared_txn_data_t *txn, *prev = NULL;
+
+ for (txn = ffsd->txns; txn; prev = txn, txn = txn->next)
+ if (svn_fs_fs__id_part_eq(&txn->txn_id, txn_id))
+ break;
+
+ if (!txn)
+ return;
+
+ if (prev)
+ prev->next = txn->next;
+ else
+ ffsd->txns = txn->next;
+
+ /* As we typically will be dealing with one transaction after another,
+ we will maintain a single-object free list so that we can hopefully
+ keep reusing the same transaction object. */
+ if (!ffsd->free_txn)
+ ffsd->free_txn = txn;
+ else
+ svn_pool_destroy(txn->pool);
+}
+
+
+/* Obtain a lock on the transaction list of filesystem FS, call BODY
+ with FS, BATON, and POOL, and then unlock the transaction list.
+ Return what BODY returned. */
+static svn_error_t *
+with_txnlist_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(svn_fs_t *fs,
+ const void *baton,
+ apr_pool_t *pool),
+ const void *baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ fs_fs_shared_data_t *ffsd = ffd->shared;
+
+ SVN_MUTEX__WITH_LOCK(ffsd->txn_list_lock,
+ body(fs, baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* A structure used by unlock_proto_rev() and unlock_proto_rev_body(),
+ which see. */
+struct unlock_proto_rev_baton
+{
+ svn_fs_fs__id_part_t txn_id;
+ void *lockcookie;
+};
+
+/* Callback used in the implementation of unlock_proto_rev(). */
+static svn_error_t *
+unlock_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
+{
+ const struct unlock_proto_rev_baton *b = baton;
+ apr_file_t *lockfile = b->lockcookie;
+ fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, &b->txn_id, FALSE);
+ apr_status_t apr_err;
+
+ if (!txn)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't unlock unknown transaction '%s'"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
+ if (!txn->being_written)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't unlock nonlocked transaction '%s'"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
+
+ apr_err = apr_file_unlock(lockfile);
+ if (apr_err)
+ return svn_error_wrap_apr
+ (apr_err,
+ _("Can't unlock prototype revision lockfile for transaction '%s'"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
+ apr_err = apr_file_close(lockfile);
+ if (apr_err)
+ return svn_error_wrap_apr
+ (apr_err,
+ _("Can't close prototype revision lockfile for transaction '%s'"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
+
+ txn->being_written = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
+/* Unlock the prototype revision file for transaction TXN_ID in filesystem
+ FS using cookie LOCKCOOKIE. The original prototype revision file must
+ have been closed _before_ calling this function.
+
+ Perform temporary allocations in POOL. */
+static svn_error_t *
+unlock_proto_rev(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ void *lockcookie,
+ apr_pool_t *pool)
+{
+ struct unlock_proto_rev_baton b;
+
+ b.txn_id = *txn_id;
+ b.lockcookie = lockcookie;
+ return with_txnlist_lock(fs, unlock_proto_rev_body, &b, pool);
+}
+
+/* A structure used by get_writable_proto_rev() and
+ get_writable_proto_rev_body(), which see. */
+struct get_writable_proto_rev_baton
+{
+ void **lockcookie;
+ svn_fs_fs__id_part_t txn_id;
+};
+
+/* Callback used in the implementation of get_writable_proto_rev(). */
+static svn_error_t *
+get_writable_proto_rev_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
+{
+ const struct get_writable_proto_rev_baton *b = baton;
+ void **lockcookie = b->lockcookie;
+ fs_fs_shared_txn_data_t *txn = get_shared_txn(fs, &b->txn_id, TRUE);
+
+ /* First, ensure that no thread in this process (including this one)
+ is currently writing to this transaction's proto-rev file. */
+ if (txn->being_written)
+ return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
+ _("Cannot write to the prototype revision file "
+ "of transaction '%s' because a previous "
+ "representation is currently being written by "
+ "this process"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id, pool));
+
+
+ /* We know that no thread in this process is writing to the proto-rev
+ file, and by extension, that no thread in this process is holding a
+ lock on the prototype revision lock file. It is therefore safe
+ for us to attempt to lock this file, to see if any other process
+ is holding a lock. */
+
+ {
+ apr_file_t *lockfile;
+ apr_status_t apr_err;
+ const char *lockfile_path
+ = svn_fs_fs__path_txn_proto_rev_lock(fs, &b->txn_id, pool);
+
+ /* Open the proto-rev lockfile, creating it if necessary, as it may
+ not exist if the transaction dates from before the lockfiles were
+ introduced.
+
+ ### We'd also like to use something like svn_io_file_lock2(), but
+ that forces us to create a subpool just to be able to unlock
+ the file, which seems a waste. */
+ SVN_ERR(svn_io_file_open(&lockfile, lockfile_path,
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool));
+
+ apr_err = apr_file_lock(lockfile,
+ APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);
+ if (apr_err)
+ {
+ svn_error_clear(svn_io_file_close(lockfile, pool));
+
+ if (APR_STATUS_IS_EAGAIN(apr_err))
+ return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
+ _("Cannot write to the prototype revision "
+ "file of transaction '%s' because a "
+ "previous representation is currently "
+ "being written by another process"),
+ svn_fs_fs__id_txn_unparse(&b->txn_id,
+ pool));
+
+ return svn_error_wrap_apr(apr_err,
+ _("Can't get exclusive lock on file '%s'"),
+ svn_dirent_local_style(lockfile_path, pool));
+ }
+
+ *lockcookie = lockfile;
+ }
+
+ /* We've successfully locked the transaction; mark it as such. */
+ txn->being_written = TRUE;
+
+ return SVN_NO_ERROR;
+}
+
+/* Make sure the length ACTUAL_LENGTH of the proto-revision file PROTO_REV
+ of transaction TXN_ID in filesystem FS matches the proto-index file.
+ Trim any crash / failure related extra data from the proto-rev file.
+
+ If the prototype revision file is too short, we can't do much but bail out.
+
+ Perform all allocations in POOL. */
+static svn_error_t *
+auto_truncate_proto_rev(svn_fs_t *fs,
+ apr_file_t *proto_rev,
+ apr_off_t actual_length,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ /* Only relevant for newer FSFS formats. */
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ /* Determine file range covered by the proto-index so far. Note that
+ we always append to both file, i.e. the last index entry also
+ corresponds to the last addition in the rev file. */
+ const char *path = svn_fs_fs__path_p2l_proto_index(fs, txn_id, pool);
+ apr_file_t *file;
+ apr_off_t indexed_length;
+
+ SVN_ERR(svn_fs_fs__p2l_proto_index_open(&file, path, pool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_next_offset(&indexed_length, file,
+ pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ /* Handle mismatches. */
+ if (indexed_length < actual_length)
+ SVN_ERR(svn_io_file_trunc(proto_rev, indexed_length, pool));
+ else if (indexed_length > actual_length)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l proto index offset %s beyond proto"
+ "rev file size %s for TXN %s"),
+ apr_off_t_toa(pool, indexed_length),
+ apr_off_t_toa(pool, actual_length),
+ svn_fs_fs__id_txn_unparse(txn_id, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Get a handle to the prototype revision file for transaction TXN_ID in
+ filesystem FS, and lock it for writing. Return FILE, a file handle
+ positioned at the end of the file, and LOCKCOOKIE, a cookie that
+ should be passed to unlock_proto_rev() to unlock the file once FILE
+ has been closed.
+
+ If the prototype revision file is already locked, return error
+ SVN_ERR_FS_REP_BEING_WRITTEN.
+
+ Perform all allocations in POOL. */
+static svn_error_t *
+get_writable_proto_rev(apr_file_t **file,
+ void **lockcookie,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ struct get_writable_proto_rev_baton b;
+ svn_error_t *err;
+ apr_off_t end_offset = 0;
+
+ b.lockcookie = lockcookie;
+ b.txn_id = *txn_id;
+
+ SVN_ERR(with_txnlist_lock(fs, get_writable_proto_rev_body, &b, pool));
+
+ /* Now open the prototype revision file and seek to the end. */
+ err = svn_io_file_open(file,
+ svn_fs_fs__path_txn_proto_rev(fs, txn_id, pool),
+ APR_READ | APR_WRITE | APR_BUFFERED, APR_OS_DEFAULT,
+ pool);
+
+ /* You might expect that we could dispense with the following seek
+ and achieve the same thing by opening the file using APR_APPEND.
+ Unfortunately, APR's buffered file implementation unconditionally
+ places its initial file pointer at the start of the file (even for
+ files opened with APR_APPEND), so we need this seek to reconcile
+ the APR file pointer to the OS file pointer (since we need to be
+ able to read the current file position later). */
+ if (!err)
+ err = svn_io_file_seek(*file, APR_END, &end_offset, pool);
+
+ /* We don't want unused sections (such as leftovers from failed delta
+ stream) in our file. If we use log addressing, we would need an
+ index entry for the unused section and that section would need to
+ be all NUL by convention. So, detect and fix those cases by truncating
+ the protorev file. */
+ if (!err)
+ err = auto_truncate_proto_rev(fs, *file, end_offset, txn_id, pool);
+
+ if (err)
+ {
+ err = svn_error_compose_create(
+ err,
+ unlock_proto_rev(fs, txn_id, *lockcookie, pool));
+
+ *lockcookie = NULL;
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Callback used in the implementation of purge_shared_txn(). */
+static svn_error_t *
+purge_shared_txn_body(svn_fs_t *fs, const void *baton, apr_pool_t *pool)
+{
+ const svn_fs_fs__id_part_t *txn_id = baton;
+
+ free_shared_txn(fs, txn_id);
+ svn_fs_fs__reset_txn_caches(fs);
+
+ return SVN_NO_ERROR;
+}
+
+/* Purge the shared data for transaction TXN_ID in filesystem FS.
+ Perform all allocations in POOL. */
+static svn_error_t *
+purge_shared_txn(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return with_txnlist_lock(fs, purge_shared_txn_body, txn_id, pool);
+}
+
+
+svn_error_t *
+svn_fs_fs__put_node_revision(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ node_revision_t *noderev,
+ svn_boolean_t fresh_txn_root,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_file_t *noderev_file;
+
+ noderev->is_fresh_txn_root = fresh_txn_root;
+
+ if (! svn_fs_fs__id_is_txn(id))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Attempted to write to non-transaction '%s'"),
+ svn_fs_fs__id_unparse(id, pool)->data);
+
+ SVN_ERR(svn_io_file_open(&noderev_file,
+ svn_fs_fs__path_txn_node_rev(fs, id, pool),
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, pool));
+
+ SVN_ERR(svn_fs_fs__write_noderev(svn_stream_from_aprfile2(noderev_file, TRUE,
+ pool),
+ noderev, ffd->format,
+ svn_fs_fs__fs_supports_mergeinfo(fs),
+ pool));
+
+ SVN_ERR(svn_io_file_close(noderev_file, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For the in-transaction NODEREV within FS, write the sha1->rep mapping
+ * file in the respective transaction, if rep sharing has been enabled etc.
+ * Use SCATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+store_sha1_rep_mapping(svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* if rep sharing has been enabled and the noderev has a data rep and
+ * its SHA-1 is known, store the rep struct under its SHA1. */
+ if ( ffd->rep_sharing_allowed
+ && noderev->data_rep
+ && noderev->data_rep->has_sha1)
+ {
+ apr_file_t *rep_file;
+ const char *file_name = path_txn_sha1(fs,
+ &noderev->data_rep->txn_id,
+ noderev->data_rep->sha1_digest,
+ scratch_pool);
+ svn_stringbuf_t *rep_string
+ = svn_fs_fs__unparse_representation(noderev->data_rep,
+ ffd->format,
+ (noderev->kind == svn_node_dir),
+ scratch_pool, scratch_pool);
+ SVN_ERR(svn_io_file_open(&rep_file, file_name,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, scratch_pool));
+
+ SVN_ERR(svn_io_file_write_full(rep_file, rep_string->data,
+ rep_string->len, NULL, scratch_pool));
+
+ SVN_ERR(svn_io_file_close(rep_file, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+unparse_dir_entry(svn_fs_dirent_t *dirent,
+ svn_stream_t *stream,
+ apr_pool_t *pool)
+{
+ const char *val
+ = apr_psprintf(pool, "%s %s",
+ (dirent->kind == svn_node_file) ? SVN_FS_FS__KIND_FILE
+ : SVN_FS_FS__KIND_DIR,
+ svn_fs_fs__id_unparse(dirent->id, pool)->data);
+
+ SVN_ERR(svn_stream_printf(stream, pool, "K %" APR_SIZE_T_FMT "\n%s\n"
+ "V %" APR_SIZE_T_FMT "\n%s\n",
+ strlen(dirent->name), dirent->name,
+ strlen(val), val));
+ return SVN_NO_ERROR;
+}
+
+/* Write the directory given as array of dirent structs in ENTRIES to STREAM.
+ Perform temporary allocations in POOL. */
+static svn_error_t *
+unparse_dir_entries(apr_array_header_t *entries,
+ svn_stream_t *stream,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ int i;
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_dirent_t *dirent;
+
+ svn_pool_clear(iterpool);
+ dirent = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
+ SVN_ERR(unparse_dir_entry(dirent, stream, iterpool));
+ }
+
+ SVN_ERR(svn_stream_printf(stream, pool, "%s\n", SVN_HASH_TERMINATOR));
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Return a deep copy of SOURCE and allocate it in RESULT_POOL.
+ */
+static svn_fs_path_change2_t *
+path_change_dup(const svn_fs_path_change2_t *source,
+ apr_pool_t *result_pool)
+{
+ svn_fs_path_change2_t *result = apr_pmemdup(result_pool, source,
+ sizeof(*source));
+ result->node_rev_id = svn_fs_fs__id_copy(source->node_rev_id, result_pool);
+ if (source->copyfrom_path)
+ result->copyfrom_path = apr_pstrdup(result_pool, source->copyfrom_path);
+
+ return result;
+}
+
+/* Merge the internal-use-only CHANGE into a hash of public-FS
+ svn_fs_path_change2_t CHANGED_PATHS, collapsing multiple changes into a
+ single summarical (is that real word?) change per path. DELETIONS is
+ also a path->svn_fs_path_change2_t hash and contains all the deletions
+ that got turned into a replacement. */
+static svn_error_t *
+fold_change(apr_hash_t *changed_paths,
+ apr_hash_t *deletions,
+ const change_t *change)
+{
+ apr_pool_t *pool = apr_hash_pool_get(changed_paths);
+ svn_fs_path_change2_t *old_change, *new_change;
+ const svn_string_t *path = &change->path;
+ const svn_fs_path_change2_t *info = &change->info;
+
+ if ((old_change = apr_hash_get(changed_paths, path->data, path->len)))
+ {
+ /* This path already exists in the hash, so we have to merge
+ this change into the already existing one. */
+
+ /* Sanity check: only allow NULL node revision ID in the
+ `reset' case. */
+ if ((! info->node_rev_id)
+ && (info->change_kind != svn_fs_path_change_reset))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing required node revision ID"));
+
+ /* Sanity check: we should be talking about the same node
+ revision ID as our last change except where the last change
+ was a deletion. */
+ if (info->node_rev_id
+ && (! svn_fs_fs__id_eq(old_change->node_rev_id, info->node_rev_id))
+ && (old_change->change_kind != svn_fs_path_change_delete))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: new node revision ID "
+ "without delete"));
+
+ /* Sanity check: an add, replacement, or reset must be the first
+ thing to follow a deletion. */
+ if ((old_change->change_kind == svn_fs_path_change_delete)
+ && (! ((info->change_kind == svn_fs_path_change_replace)
+ || (info->change_kind == svn_fs_path_change_reset)
+ || (info->change_kind == svn_fs_path_change_add))))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: non-add change on deleted path"));
+
+ /* Sanity check: an add can't follow anything except
+ a delete or reset. */
+ if ((info->change_kind == svn_fs_path_change_add)
+ && (old_change->change_kind != svn_fs_path_change_delete)
+ && (old_change->change_kind != svn_fs_path_change_reset))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: add change on preexisting path"));
+
+ /* Now, merge that change in. */
+ switch (info->change_kind)
+ {
+ case svn_fs_path_change_reset:
+ /* A reset here will simply remove the path change from the
+ hash. */
+ apr_hash_set(changed_paths, path->data, path->len, NULL);
+ break;
+
+ case svn_fs_path_change_delete:
+ if (old_change->change_kind == svn_fs_path_change_add)
+ {
+ /* If the path was introduced in this transaction via an
+ add, and we are deleting it, just remove the path
+ altogether. (The caller will delete any child paths.) */
+ apr_hash_set(changed_paths, path->data, path->len, NULL);
+ }
+ else if (old_change->change_kind == svn_fs_path_change_replace)
+ {
+ /* A deleting a 'replace' restore the original deletion. */
+ new_change = apr_hash_get(deletions, path->data, path->len);
+ SVN_ERR_ASSERT(new_change);
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+ }
+ else
+ {
+ /* A deletion overrules a previous change (modify). */
+ new_change = path_change_dup(info, pool);
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+ }
+ break;
+
+ case svn_fs_path_change_add:
+ case svn_fs_path_change_replace:
+ /* An add at this point must be following a previous delete,
+ so treat it just like a replace. Remember the original
+ deletion such that we are able to delete this path again
+ (the replacement may have changed node kind and id). */
+ new_change = path_change_dup(info, pool);
+ new_change->change_kind = svn_fs_path_change_replace;
+
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+
+ /* Remember the original change.
+ * Make sure to allocate the hash key in a durable pool. */
+ apr_hash_set(deletions,
+ apr_pstrmemdup(apr_hash_pool_get(deletions),
+ path->data, path->len),
+ path->len, old_change);
+ break;
+
+ case svn_fs_path_change_modify:
+ default:
+ /* If the new change modifies some attribute of the node, set
+ the corresponding flag, whether it already was set or not.
+ Note: We do not reset a flag to FALSE if a change is undone. */
+ if (info->text_mod)
+ old_change->text_mod = TRUE;
+ if (info->prop_mod)
+ old_change->prop_mod = TRUE;
+ if (info->mergeinfo_mod == svn_tristate_true)
+ old_change->mergeinfo_mod = svn_tristate_true;
+ break;
+ }
+ }
+ else
+ {
+ /* Add this path. The API makes no guarantees that this (new) key
+ will not be retained. Thus, we copy the key into the target pool
+ to ensure a proper lifetime. */
+ apr_hash_set(changed_paths,
+ apr_pstrmemdup(pool, path->data, path->len), path->len,
+ path_change_dup(info, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton type to be used with process_changes(). */
+typedef struct process_changes_baton_t
+{
+ /* Folded list of path changes. */
+ apr_hash_t *changed_paths;
+
+ /* Path changes that are deletions and have been turned into
+ replacements. If those replacements get deleted again, this
+ container contains the record that we have to revert to. */
+ apr_hash_t *deletions;
+} process_changes_baton_t;
+
+/* An implementation of svn_fs_fs__change_receiver_t.
+ Examine all the changed path entries in CHANGES and store them in
+ *CHANGED_PATHS. Folding is done to remove redundant or unnecessary
+ data. Do all allocations in POOL. */
+static svn_error_t *
+process_changes(void *baton_p,
+ change_t *change,
+ apr_pool_t *scratch_pool)
+{
+ process_changes_baton_t *baton = baton_p;
+
+ SVN_ERR(fold_change(baton->changed_paths, baton->deletions, change));
+
+ /* Now, if our change was a deletion or replacement, we have to
+ blow away any changes thus far on paths that are (or, were)
+ children of this path.
+ ### i won't bother with another iteration pool here -- at
+ most we talking about a few extra dups of paths into what
+ is already a temporary subpool.
+ */
+
+ if ((change->info.change_kind == svn_fs_path_change_delete)
+ || (change->info.change_kind == svn_fs_path_change_replace))
+ {
+ apr_hash_index_t *hi;
+
+ /* a potential child path must contain at least 2 more chars
+ (the path separator plus at least one char for the name).
+ Also, we should not assume that all paths have been normalized
+ i.e. some might have trailing path separators.
+ */
+ apr_ssize_t path_len = change->path.len;
+ apr_ssize_t min_child_len = path_len == 0
+ ? 1
+ : change->path.data[path_len-1] == '/'
+ ? path_len + 1
+ : path_len + 2;
+
+ /* CAUTION: This is the inner loop of an O(n^2) algorithm.
+ The number of changes to process may be >> 1000.
+ Therefore, keep the inner loop as tight as possible.
+ */
+ for (hi = apr_hash_first(scratch_pool, baton->changed_paths);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ /* KEY is the path. */
+ const void *path;
+ apr_ssize_t klen;
+ svn_fs_path_change2_t *old_change;
+ apr_hash_this(hi, &path, &klen, (void**)&old_change);
+
+ /* If we come across a child of our path, remove it.
+ Call svn_fspath__skip_ancestor only if there is a chance that
+ this is actually a sub-path.
+ */
+ if (klen >= min_child_len)
+ {
+ const char *child;
+
+ child = svn_fspath__skip_ancestor(change->path.data, path);
+ if (child && child[0] != '\0')
+ {
+ apr_hash_set(baton->changed_paths, path, klen, NULL);
+ }
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__txn_changes_fetch(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ apr_file_t *file;
+ apr_hash_t *changed_paths = apr_hash_make(pool);
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ process_changes_baton_t baton;
+
+ baton.changed_paths = changed_paths;
+ baton.deletions = apr_hash_make(scratch_pool);
+
+ SVN_ERR(svn_io_file_open(&file,
+ path_txn_changes(fs, txn_id, scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_fs__read_changes_incrementally(
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ process_changes, &baton,
+ scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ *changed_paths_p = changed_paths;
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__paths_changed(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ apr_hash_t *changed_paths;
+ apr_array_header_t *changes;
+ int i;
+
+ SVN_ERR(svn_fs_fs__get_changes(&changes, fs, rev, pool));
+
+ changed_paths = svn_hash__make(pool);
+ for (i = 0; i < changes->nelts; ++i)
+ {
+ change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
+ apr_hash_set(changed_paths, change->path.data, change->path.len,
+ &change->info);
+ }
+
+ *changed_paths_p = changed_paths;
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy a revision node-rev SRC into the current transaction TXN_ID in
+ the filesystem FS. This is only used to create the root of a transaction.
+ Allocations are from POOL. */
+static svn_error_t *
+create_new_txn_noderev_from_rev(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ svn_fs_id_t *src,
+ apr_pool_t *pool)
+{
+ node_revision_t *noderev;
+ const svn_fs_fs__id_part_t *node_id, *copy_id;
+
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, src, pool, pool));
+
+ if (svn_fs_fs__id_is_txn(noderev->id))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Copying from transactions not allowed"));
+
+ noderev->predecessor_id = noderev->id;
+ noderev->predecessor_count++;
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ /* For the transaction root, the copyroot never changes. */
+
+ node_id = svn_fs_fs__id_node_id(noderev->id);
+ copy_id = svn_fs_fs__id_copy_id(noderev->id);
+ noderev->id = svn_fs_fs__id_txn_create(node_id, copy_id, txn_id, pool);
+
+ return svn_fs_fs__put_node_revision(fs, noderev->id, noderev, TRUE, pool);
+}
+
+/* A structure used by get_and_increment_txn_key_body(). */
+struct get_and_increment_txn_key_baton {
+ svn_fs_t *fs;
+ apr_uint64_t txn_number;
+ apr_pool_t *pool;
+};
+
+/* Callback used in the implementation of create_txn_dir(). This gets
+ the current base 36 value in PATH_TXN_CURRENT and increments it.
+ It returns the original value by the baton. */
+static svn_error_t *
+get_and_increment_txn_key_body(void *baton, apr_pool_t *pool)
+{
+ struct get_and_increment_txn_key_baton *cb = baton;
+ const char *txn_current_filename
+ = svn_fs_fs__path_txn_current(cb->fs, pool);
+ char new_id_str[SVN_INT64_BUFFER_SIZE + 1]; /* add space for a newline */
+ apr_size_t line_length;
+
+ svn_stringbuf_t *buf;
+ SVN_ERR(svn_fs_fs__read_content(&buf, txn_current_filename, cb->pool));
+
+ /* assign the current txn counter value to our result */
+ cb->txn_number = svn__base36toui64(NULL, buf->data);
+
+ /* remove trailing newlines */
+ line_length = svn__ui64tobase36(new_id_str, cb->txn_number+1);
+ new_id_str[line_length] = '\n';
+
+ /* Increment the key and add a trailing \n to the string so the
+ txn-current file has a newline in it. */
+ SVN_ERR(svn_io_write_atomic(txn_current_filename, new_id_str,
+ line_length + 1,
+ txn_current_filename /* copy_perms path */,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Create a unique directory for a transaction in FS based on revision REV.
+ Return the ID for this transaction in *ID_P and *TXN_ID. Use a sequence
+ value in the transaction ID to prevent reuse of transaction IDs. */
+static svn_error_t *
+create_txn_dir(const char **id_p,
+ svn_fs_fs__id_part_t *txn_id,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ struct get_and_increment_txn_key_baton cb;
+ const char *txn_dir;
+
+ /* Get the current transaction sequence value, which is a base-36
+ number, from the txn-current file, and write an
+ incremented value back out to the file. Place the revision
+ number the transaction is based off into the transaction id. */
+ cb.pool = pool;
+ cb.fs = fs;
+ SVN_ERR(svn_fs_fs__with_txn_current_lock(fs,
+ get_and_increment_txn_key_body,
+ &cb,
+ pool));
+ txn_id->revision = rev;
+ txn_id->number = cb.txn_number;
+
+ *id_p = svn_fs_fs__id_txn_unparse(txn_id, pool);
+ txn_dir = svn_fs_fs__path_txn_dir(fs, txn_id, pool);
+
+ return svn_io_dir_make(txn_dir, APR_OS_DEFAULT, pool);
+}
+
+/* Create a unique directory for a transaction in FS based on revision
+ REV. Return the ID for this transaction in *ID_P and *TXN_ID. This
+ implementation is used in svn 1.4 and earlier repositories and is
+ kept in 1.5 and greater to support the --pre-1.4-compatible and
+ --pre-1.5-compatible repository creation options. Reused
+ transaction IDs are possible with this implementation. */
+static svn_error_t *
+create_txn_dir_pre_1_5(const char **id_p,
+ svn_fs_fs__id_part_t *txn_id,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ unsigned int i;
+ apr_pool_t *subpool;
+ const char *unique_path, *prefix;
+
+ /* Try to create directories named "<txndir>/<rev>-<uniqueifier>.txn". */
+ prefix = svn_dirent_join(svn_fs_fs__path_txns_dir(fs, pool),
+ apr_psprintf(pool, "%ld", rev), pool);
+
+ subpool = svn_pool_create(pool);
+ for (i = 1; i <= 99999; i++)
+ {
+ svn_error_t *err;
+
+ svn_pool_clear(subpool);
+ unique_path = apr_psprintf(subpool, "%s-%u" PATH_EXT_TXN, prefix, i);
+ err = svn_io_dir_make(unique_path, APR_OS_DEFAULT, subpool);
+ if (! err)
+ {
+ /* We succeeded. Return the basename minus the ".txn" extension. */
+ const char *name = svn_dirent_basename(unique_path, subpool);
+ *id_p = apr_pstrndup(pool, name,
+ strlen(name) - strlen(PATH_EXT_TXN));
+ SVN_ERR(svn_fs_fs__id_txn_parse(txn_id, *id_p));
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+ }
+ if (! APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ }
+
+ return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED,
+ NULL,
+ _("Unable to create transaction directory "
+ "in '%s' for revision %ld"),
+ svn_dirent_local_style(fs->path, pool),
+ rev);
+}
+
+svn_error_t *
+svn_fs_fs__create_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_txn_t *txn;
+ fs_txn_data_t *ftd;
+ svn_fs_id_t *root_id;
+
+ txn = apr_pcalloc(pool, sizeof(*txn));
+ ftd = apr_pcalloc(pool, sizeof(*ftd));
+
+ /* Get the txn_id. */
+ if (ffd->format >= SVN_FS_FS__MIN_TXN_CURRENT_FORMAT)
+ SVN_ERR(create_txn_dir(&txn->id, &ftd->txn_id, fs, rev, pool));
+ else
+ SVN_ERR(create_txn_dir_pre_1_5(&txn->id, &ftd->txn_id, fs, rev, pool));
+
+ txn->fs = fs;
+ txn->base_rev = rev;
+
+ txn->vtable = &txn_vtable;
+ txn->fsap_data = ftd;
+ *txn_p = txn;
+
+ /* Create a new root node for this transaction. */
+ SVN_ERR(svn_fs_fs__rev_get_root(&root_id, fs, rev, pool, pool));
+ SVN_ERR(create_new_txn_noderev_from_rev(fs, &ftd->txn_id, root_id, pool));
+
+ /* Create an empty rev file. */
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_fs__path_txn_proto_rev(fs, &ftd->txn_id, pool),
+ pool));
+
+ /* Create an empty rev-lock file. */
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_fs__path_txn_proto_rev_lock(fs, &ftd->txn_id, pool),
+ pool));
+
+ /* Create an empty changes file. */
+ SVN_ERR(svn_io_file_create_empty(path_txn_changes(fs, &ftd->txn_id, pool),
+ pool));
+
+ /* Create the next-ids file. */
+ return svn_io_file_create(path_txn_next_ids(fs, &ftd->txn_id, pool),
+ "0 0\n", pool);
+}
+
+/* Store the property list for transaction TXN_ID in PROPLIST.
+ Perform temporary allocations in POOL. */
+static svn_error_t *
+get_txn_proplist(apr_hash_t *proplist,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ svn_stream_t *stream;
+ svn_error_t *err;
+
+ /* Check for issue #3696. (When we find and fix the cause, we can change
+ * this to an assertion.) */
+ if (!txn_id || !svn_fs_fs__id_txn_used(txn_id))
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Internal error: a null transaction id was "
+ "passed to get_txn_proplist()"));
+
+ /* Open the transaction properties file. */
+ SVN_ERR(svn_stream_open_readonly(&stream, path_txn_props(fs, txn_id, pool),
+ pool, pool));
+
+ /* Read in the property list. */
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list in transaction '%s'"),
+ path_txn_props(fs, txn_id, pool));
+ }
+
+ return svn_stream_close(stream);
+}
+
+/* Save the property list PROPS as the revprops for transaction TXN_ID
+ in FS. Perform temporary allocations in POOL. */
+static svn_error_t *
+set_txn_proplist(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_hash_t *props,
+ svn_boolean_t final,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *buf;
+ svn_stream_t *stream;
+
+ /* Write out the new file contents to BUF. */
+ buf = svn_stringbuf_create_ensure(1024, pool);
+ stream = svn_stream_from_stringbuf(buf, pool);
+ SVN_ERR(svn_hash_write2(props, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Open the transaction properties file and write new contents to it. */
+ SVN_ERR(svn_io_write_atomic((final
+ ? path_txn_props_final(fs, txn_id, pool)
+ : path_txn_props(fs, txn_id, pool)),
+ buf->data, buf->len,
+ NULL /* copy_perms_path */, pool));
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__change_txn_prop(svn_fs_txn_t *txn,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *props = apr_array_make(pool, 1, sizeof(svn_prop_t));
+ svn_prop_t prop;
+
+ prop.name = name;
+ prop.value = value;
+ APR_ARRAY_PUSH(props, svn_prop_t) = prop;
+
+ return svn_fs_fs__change_txn_props(txn, props, pool);
+}
+
+svn_error_t *
+svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
+ const apr_array_header_t *props,
+ apr_pool_t *pool)
+{
+ fs_txn_data_t *ftd = txn->fsap_data;
+ apr_hash_t *txn_prop = apr_hash_make(pool);
+ int i;
+ svn_error_t *err;
+
+ err = get_txn_proplist(txn_prop, txn->fs, &ftd->txn_id, pool);
+ /* Here - and here only - we need to deal with the possibility that the
+ transaction property file doesn't yet exist. The rest of the
+ implementation assumes that the file exists, but we're called to set the
+ initial transaction properties as the transaction is being created. */
+ if (err && (APR_STATUS_IS_ENOENT(err->apr_err)))
+ svn_error_clear(err);
+ else if (err)
+ return svn_error_trace(err);
+
+ for (i = 0; i < props->nelts; i++)
+ {
+ svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
+
+ if (svn_hash_gets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE)
+ && !strcmp(prop->name, SVN_PROP_REVISION_DATE))
+ svn_hash_sets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE,
+ svn_string_create("1", pool));
+
+ svn_hash_sets(txn_prop, prop->name, prop->value);
+ }
+
+ /* Create a new version of the file and write out the new props. */
+ /* Open the transaction properties file. */
+ SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, FALSE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__get_txn(transaction_t **txn_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ transaction_t *txn;
+ node_revision_t *noderev;
+ svn_fs_id_t *root_id;
+
+ txn = apr_pcalloc(pool, sizeof(*txn));
+ root_id = svn_fs_fs__id_txn_create_root(txn_id, pool);
+
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, root_id, pool, pool));
+
+ txn->root_id = svn_fs_fs__id_copy(noderev->id, pool);
+ txn->base_id = svn_fs_fs__id_copy(noderev->predecessor_id, pool);
+ txn->copies = NULL;
+
+ *txn_p = txn;
+
+ return SVN_NO_ERROR;
+}
+
+/* Write out the currently available next node_id NODE_ID and copy_id
+ COPY_ID for transaction TXN_ID in filesystem FS. The next node-id is
+ used both for creating new unique nodes for the given transaction, as
+ well as uniquifying representations. Perform temporary allocations in
+ POOL. */
+static svn_error_t *
+write_next_ids(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_uint64_t node_id,
+ apr_uint64_t copy_id,
+ apr_pool_t *pool)
+{
+ apr_file_t *file;
+ char buffer[2 * SVN_INT64_BUFFER_SIZE + 2];
+ char *p = buffer;
+
+ p += svn__ui64tobase36(p, node_id);
+ *(p++) = ' ';
+ p += svn__ui64tobase36(p, copy_id);
+ *(p++) = '\n';
+ *(p++) = '\0';
+
+ SVN_ERR(svn_io_file_open(&file,
+ path_txn_next_ids(fs, txn_id, pool),
+ APR_WRITE | APR_TRUNCATE,
+ APR_OS_DEFAULT, pool));
+ SVN_ERR(svn_io_file_write_full(file, buffer, p - buffer, NULL, pool));
+ return svn_io_file_close(file, pool);
+}
+
+/* Find out what the next unique node-id and copy-id are for
+ transaction TXN_ID in filesystem FS. Store the results in *NODE_ID
+ and *COPY_ID. The next node-id is used both for creating new unique
+ nodes for the given transaction, as well as uniquifying representations.
+ Perform all allocations in POOL. */
+static svn_error_t *
+read_next_ids(apr_uint64_t *node_id,
+ apr_uint64_t *copy_id,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *buf;
+ const char *str;
+ SVN_ERR(svn_fs_fs__read_content(&buf,
+ path_txn_next_ids(fs, txn_id, pool),
+ pool));
+
+ /* Parse this into two separate strings. */
+
+ str = buf->data;
+ *node_id = svn__base36toui64(&str, str);
+ if (*str != ' ')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("next-id file corrupt"));
+
+ ++str;
+ *copy_id = svn__base36toui64(&str, str);
+ if (*str != '\n')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("next-id file corrupt"));
+
+ return SVN_NO_ERROR;
+}
+
+/* Get a new and unique to this transaction node-id for transaction
+ TXN_ID in filesystem FS. Store the new node-id in *NODE_ID_P.
+ Node-ids are guaranteed to be unique to this transction, but may
+ not necessarily be sequential. Perform all allocations in POOL. */
+static svn_error_t *
+get_new_txn_node_id(svn_fs_fs__id_part_t *node_id_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ apr_uint64_t node_id, copy_id;
+
+ /* First read in the current next-ids file. */
+ SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, pool));
+
+ node_id_p->revision = SVN_INVALID_REVNUM;
+ node_id_p->number = node_id;
+
+ SVN_ERR(write_next_ids(fs, txn_id, ++node_id, copy_id, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__reserve_copy_id(svn_fs_fs__id_part_t *copy_id_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ apr_uint64_t node_id, copy_id;
+
+ /* First read in the current next-ids file. */
+ SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, pool));
+
+ /* this is an in-txn ID now */
+ copy_id_p->revision = SVN_INVALID_REVNUM;
+ copy_id_p->number = copy_id;
+
+ /* Update the ID counter file */
+ SVN_ERR(write_next_ids(fs, txn_id, node_id, ++copy_id, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__create_node(const svn_fs_id_t **id_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__id_part_t node_id;
+ const svn_fs_id_t *id;
+
+ /* Get a new node-id for this node. */
+ SVN_ERR(get_new_txn_node_id(&node_id, fs, txn_id, pool));
+
+ id = svn_fs_fs__id_txn_create(&node_id, copy_id, txn_id, pool);
+
+ noderev->id = id;
+
+ SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE, pool));
+
+ *id_p = id;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__purge_txn(svn_fs_t *fs,
+ const char *txn_id_str,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_fs__id_part_t txn_id;
+ SVN_ERR(svn_fs_fs__id_txn_parse(&txn_id, txn_id_str));
+
+ /* Remove the shared transaction object associated with this transaction. */
+ SVN_ERR(purge_shared_txn(fs, &txn_id, pool));
+ /* Remove the directory associated with this transaction. */
+ SVN_ERR(svn_io_remove_dir2(svn_fs_fs__path_txn_dir(fs, &txn_id, pool),
+ FALSE, NULL, NULL, pool));
+ if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
+ {
+ /* Delete protorev and its lock, which aren't in the txn
+ directory. It's OK if they don't exist (for example, if this
+ is post-commit and the proto-rev has been moved into
+ place). */
+ SVN_ERR(svn_io_remove_file2(
+ svn_fs_fs__path_txn_proto_rev(fs, &txn_id, pool),
+ TRUE, pool));
+ SVN_ERR(svn_io_remove_file2(
+ svn_fs_fs__path_txn_proto_rev_lock(fs, &txn_id, pool),
+ TRUE, pool));
+ }
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__abort_txn(svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_fs__check_fs(txn->fs, TRUE));
+
+ /* Now, purge the transaction. */
+ SVN_ERR_W(svn_fs_fs__purge_txn(txn->fs, txn->id, pool),
+ apr_psprintf(pool, _("Transaction '%s' cleanup failed"),
+ txn->id));
+
+ return SVN_NO_ERROR;
+}
+
+/* Assign the UNIQUIFIER member of REP based on the current state of TXN_ID
+ * in FS. Allocate the uniquifier in POOL.
+ */
+static svn_error_t *
+set_uniquifier(svn_fs_t *fs,
+ representation_t *rep,
+ apr_pool_t *pool)
+{
+ svn_fs_fs__id_part_t temp;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ {
+ SVN_ERR(get_new_txn_node_id(&temp, fs, &rep->txn_id, pool));
+ rep->uniquifier.noderev_txn_id = rep->txn_id;
+ rep->uniquifier.number = temp.number;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE if the TXN_ID member of REP is in use.
+ */
+static svn_boolean_t
+is_txn_rep(const representation_t *rep)
+{
+ return svn_fs_fs__id_txn_used(&rep->txn_id);
+}
+
+/* Mark the TXN_ID member of REP as "unused".
+ */
+static void
+reset_txn_in_rep(representation_t *rep)
+{
+ svn_fs_fs__id_txn_reset(&rep->txn_id);
+}
+
+svn_error_t *
+svn_fs_fs__set_entry(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ node_revision_t *parent_noderev,
+ const char *name,
+ const svn_fs_id_t *id,
+ svn_node_kind_t kind,
+ apr_pool_t *pool)
+{
+ representation_t *rep = parent_noderev->data_rep;
+ const char *filename
+ = svn_fs_fs__path_txn_node_children(fs, parent_noderev->id, pool);
+ apr_file_t *file;
+ svn_stream_t *out;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ if (!rep || !is_txn_rep(rep))
+ {
+ apr_array_header_t *entries;
+
+ /* Before we can modify the directory, we need to dump its old
+ contents into a mutable representation file. */
+ SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, parent_noderev,
+ subpool, subpool));
+ SVN_ERR(svn_io_file_open(&file, filename,
+ APR_WRITE | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, pool));
+ out = svn_stream_from_aprfile2(file, TRUE, pool);
+ SVN_ERR(unparse_dir_entries(entries, out, subpool));
+
+ svn_pool_clear(subpool);
+
+ /* Mark the node-rev's data rep as mutable. */
+ rep = apr_pcalloc(pool, sizeof(*rep));
+ rep->revision = SVN_INVALID_REVNUM;
+ rep->txn_id = *txn_id;
+ SVN_ERR(set_uniquifier(fs, rep, pool));
+ parent_noderev->data_rep = rep;
+ SVN_ERR(svn_fs_fs__put_node_revision(fs, parent_noderev->id,
+ parent_noderev, FALSE, pool));
+ }
+ else
+ {
+ /* The directory rep is already mutable, so just open it for append. */
+ SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_APPEND,
+ APR_OS_DEFAULT, pool));
+ out = svn_stream_from_aprfile2(file, TRUE, pool);
+ }
+
+ /* if we have a directory cache for this transaction, update it */
+ if (ffd->txn_dir_cache)
+ {
+ /* build parameters: (name, new entry) pair */
+ const char *key =
+ svn_fs_fs__id_unparse(parent_noderev->id, subpool)->data;
+ replace_baton_t baton;
+
+ baton.name = name;
+ baton.new_entry = NULL;
+
+ if (id)
+ {
+ baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
+ baton.new_entry->name = name;
+ baton.new_entry->kind = kind;
+ baton.new_entry->id = id;
+ }
+
+ /* actually update the cached directory (if cached) */
+ SVN_ERR(svn_cache__set_partial(ffd->txn_dir_cache, key,
+ svn_fs_fs__replace_dir_entry, &baton,
+ subpool));
+ }
+ svn_pool_clear(subpool);
+
+ /* Append an incremental hash entry for the entry change. */
+ if (id)
+ {
+ svn_fs_dirent_t entry;
+ entry.name = name;
+ entry.id = id;
+ entry.kind = kind;
+
+ SVN_ERR(unparse_dir_entry(&entry, out, subpool));
+ }
+ else
+ {
+ SVN_ERR(svn_stream_printf(out, subpool, "D %" APR_SIZE_T_FMT "\n%s\n",
+ strlen(name), name));
+ }
+
+ SVN_ERR(svn_io_file_close(file, subpool));
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__add_change(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ const char *path,
+ const svn_fs_id_t *id,
+ svn_fs_path_change_kind_t change_kind,
+ svn_boolean_t text_mod,
+ svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
+ svn_node_kind_t node_kind,
+ svn_revnum_t copyfrom_rev,
+ const char *copyfrom_path,
+ apr_pool_t *pool)
+{
+ apr_file_t *file;
+ svn_fs_path_change2_t *change;
+ apr_hash_t *changes = apr_hash_make(pool);
+
+ /* Not using APR_BUFFERED to append change in one atomic write operation. */
+ SVN_ERR(svn_io_file_open(&file, path_txn_changes(fs, txn_id, pool),
+ APR_APPEND | APR_WRITE | APR_CREATE,
+ APR_OS_DEFAULT, pool));
+
+ change = svn_fs__path_change_create_internal(id, change_kind, pool);
+ change->text_mod = text_mod;
+ change->prop_mod = prop_mod;
+ change->mergeinfo_mod = mergeinfo_mod
+ ? svn_tristate_true
+ : svn_tristate_false;
+ change->node_kind = node_kind;
+ change->copyfrom_known = TRUE;
+ change->copyfrom_rev = copyfrom_rev;
+ if (copyfrom_path)
+ change->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
+
+ svn_hash_sets(changes, path, change);
+ SVN_ERR(svn_fs_fs__write_changes(svn_stream_from_aprfile2(file, TRUE, pool),
+ fs, changes, FALSE, pool));
+
+ return svn_io_file_close(file, pool);
+}
+
+/* If the transaction TXN_ID in FS uses logical addressing, store the
+ * (ITEM_INDEX, OFFSET) pair in the txn's log-to-phys proto index file.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+store_l2p_index_entry(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_off_t offset,
+ apr_uint64_t item_index,
+ apr_pool_t *pool)
+{
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ const char *path = svn_fs_fs__path_l2p_proto_index(fs, txn_id, pool);
+ apr_file_t *file;
+ SVN_ERR(svn_fs_fs__l2p_proto_index_open(&file, path, pool));
+ SVN_ERR(svn_fs_fs__l2p_proto_index_add_entry(file, offset,
+ item_index, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* If the transaction TXN_ID in FS uses logical addressing, store ENTRY
+ * in the phys-to-log proto index file of transaction TXN_ID.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+store_p2l_index_entry(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ const char *path = svn_fs_fs__path_p2l_proto_index(fs, txn_id, pool);
+ apr_file_t *file;
+ SVN_ERR(svn_fs_fs__p2l_proto_index_open(&file, path, pool));
+ SVN_ERR(svn_fs_fs__p2l_proto_index_add_entry(file, entry, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Allocate an item index for the given MY_OFFSET in the transaction TXN_ID
+ * of file system FS and return it in *ITEM_INDEX. For old formats, it
+ * will simply return the offset as item index; in new formats, it will
+ * increment the txn's item index counter file and store the mapping in
+ * the proto index file. Use POOL for allocations.
+ */
+static svn_error_t *
+allocate_item_index(apr_uint64_t *item_index,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_off_t my_offset,
+ apr_pool_t *pool)
+{
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ apr_file_t *file;
+ char buffer[SVN_INT64_BUFFER_SIZE] = { 0 };
+ svn_boolean_t eof = FALSE;
+ apr_size_t to_write;
+ apr_size_t read;
+ apr_off_t offset = 0;
+
+ /* read number, increment it and write it back to disk */
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_fs__path_txn_item_index(fs, txn_id, pool),
+ APR_READ | APR_WRITE | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, pool));
+ SVN_ERR(svn_io_file_read_full2(file, buffer, sizeof(buffer)-1,
+ &read, &eof, pool));
+ if (read)
+ SVN_ERR(svn_cstring_atoui64(item_index, buffer));
+ else
+ *item_index = SVN_FS_FS__ITEM_INDEX_FIRST_USER;
+
+ to_write = svn__ui64toa(buffer, *item_index + 1);
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool));
+ SVN_ERR(svn_io_file_write_full(file, buffer, to_write, NULL, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ /* write log-to-phys index */
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset, *item_index, pool));
+ }
+ else
+ {
+ *item_index = (apr_uint64_t)my_offset;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton used by fnv1a_write_handler to calculate the FNV checksum
+ * before passing the data on to the INNER_STREAM.
+ */
+typedef struct fnv1a_stream_baton_t
+{
+ svn_stream_t *inner_stream;
+ svn_checksum_ctx_t *context;
+} fnv1a_stream_baton_t;
+
+/* Implement svn_write_fn_t.
+ * Update checksum and pass data on to inner stream.
+ */
+static svn_error_t *
+fnv1a_write_handler(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ fnv1a_stream_baton_t *b = baton;
+
+ SVN_ERR(svn_checksum_update(b->context, data, *len));
+ SVN_ERR(svn_stream_write(b->inner_stream, data, len));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return a stream that calculates a FNV checksum in *CONTEXT
+ * over all data written to the stream and passes that data on
+ * to INNER_STREAM. Allocate objects in POOL.
+ */
+static svn_stream_t *
+fnv1a_wrap_stream(svn_checksum_ctx_t **context,
+ svn_stream_t *inner_stream,
+ apr_pool_t *pool)
+{
+ svn_stream_t *outer_stream;
+
+ fnv1a_stream_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
+ baton->inner_stream = inner_stream;
+ baton->context = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, pool);
+ *context = baton->context;
+
+ outer_stream = svn_stream_create(baton, pool);
+ svn_stream_set_write(outer_stream, fnv1a_write_handler);
+
+ return outer_stream;
+}
+
+/* Set *DIGEST to the FNV checksum calculated in CONTEXT.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+fnv1a_checksum_finalize(apr_uint32_t *digest,
+ svn_checksum_ctx_t *context,
+ apr_pool_t *scratch_pool)
+{
+ svn_checksum_t *checksum;
+
+ SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
+ SVN_ERR_ASSERT(checksum->kind == svn_checksum_fnv1a_32x4);
+ *digest = ntohl(*(const apr_uint32_t *)(checksum->digest));
+
+ return SVN_NO_ERROR;
+}
+
+/* This baton is used by the representation writing streams. It keeps
+ track of the checksum information as well as the total size of the
+ representation so far. */
+struct rep_write_baton
+{
+ /* The FS we are writing to. */
+ svn_fs_t *fs;
+
+ /* Actual file to which we are writing. */
+ svn_stream_t *rep_stream;
+
+ /* A stream from the delta combiner. Data written here gets
+ deltified, then eventually written to rep_stream. */
+ svn_stream_t *delta_stream;
+
+ /* Where is this representation header stored. */
+ apr_off_t rep_offset;
+
+ /* Start of the actual data. */
+ apr_off_t delta_start;
+
+ /* How many bytes have been written to this rep already. */
+ svn_filesize_t rep_size;
+
+ /* The node revision for which we're writing out info. */
+ node_revision_t *noderev;
+
+ /* Actual output file. */
+ apr_file_t *file;
+ /* Lock 'cookie' used to unlock the output file once we've finished
+ writing to it. */
+ void *lockcookie;
+
+ svn_checksum_ctx_t *md5_checksum_ctx;
+ svn_checksum_ctx_t *sha1_checksum_ctx;
+
+ /* calculate a modified FNV-1a checksum of the on-disk representation */
+ svn_checksum_ctx_t *fnv1a_checksum_ctx;
+
+ /* Local / scratch pool, available for temporary allocations. */
+ apr_pool_t *scratch_pool;
+
+ /* Outer / result pool. */
+ apr_pool_t *result_pool;
+};
+
+/* Handler for the write method of the representation writable stream.
+ BATON is a rep_write_baton, DATA is the data to write, and *LEN is
+ the length of this data. */
+static svn_error_t *
+rep_write_contents(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ struct rep_write_baton *b = baton;
+
+ SVN_ERR(svn_checksum_update(b->md5_checksum_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(b->sha1_checksum_ctx, data, *len));
+ b->rep_size += *len;
+
+ /* If we are writing a delta, use that stream. */
+ if (b->delta_stream)
+ return svn_stream_write(b->delta_stream, data, len);
+ else
+ return svn_stream_write(b->rep_stream, data, len);
+}
+
+/* Set *SPANNED to the number of shards touched when walking WALK steps on
+ * NODEREV's predecessor chain in FS. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+shards_spanned(int *spanned,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ int walk,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ int shard_size = ffd->max_files_per_dir ? ffd->max_files_per_dir : 1;
+ apr_pool_t *iterpool;
+
+ int count = walk ? 1 : 0; /* The start of a walk already touches a shard. */
+ svn_revnum_t shard, last_shard = ffd->youngest_rev_cache / shard_size;
+ iterpool = svn_pool_create(pool);
+ while (walk-- && noderev->predecessor_count)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs,
+ noderev->predecessor_id, pool,
+ iterpool));
+ shard = svn_fs_fs__id_rev(noderev->id) / shard_size;
+ if (shard != last_shard)
+ {
+ ++count;
+ last_shard = shard;
+ }
+ }
+ svn_pool_destroy(iterpool);
+
+ *spanned = count;
+ return SVN_NO_ERROR;
+}
+
+/* Given a node-revision NODEREV in filesystem FS, return the
+ representation in *REP to use as the base for a text representation
+ delta if PROPS is FALSE. If PROPS has been set, a suitable props
+ base representation will be returned. Perform temporary allocations
+ in *POOL. */
+static svn_error_t *
+choose_delta_base(representation_t **rep,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ svn_boolean_t props,
+ apr_pool_t *pool)
+{
+ /* The zero-based index (counting from the "oldest" end), along NODEREVs line
+ * predecessors, of the node-rev we will use as delta base. */
+ int count;
+ /* The length of the linear part of a delta chain. (Delta chains use
+ * skip-delta bits for the high-order bits and are linear in the low-order
+ * bits.) */
+ int walk;
+ node_revision_t *base;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool;
+
+ /* If we have no predecessors, or that one is empty, then use the empty
+ * stream as a base. */
+ if (! noderev->predecessor_count)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* Flip the rightmost '1' bit of the predecessor count to determine
+ which file rev (counting from 0) we want to use. (To see why
+ count & (count - 1) unsets the rightmost set bit, think about how
+ you decrement a binary number.) */
+ count = noderev->predecessor_count;
+ count = count & (count - 1);
+
+ /* Finding the delta base over a very long distance can become extremely
+ expensive for very deep histories, possibly causing client timeouts etc.
+ OTOH, this is a rare operation and its gains are minimal. Lets simply
+ start deltification anew close every other 1000 changes or so. */
+ walk = noderev->predecessor_count - count;
+ if (walk > (int)ffd->max_deltification_walk)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* We use skip delta for limiting the number of delta operations
+ along very long node histories. Close to HEAD however, we create
+ a linear history to minimize delta size. */
+ if (walk < (int)ffd->max_linear_deltification)
+ {
+ int shards;
+ SVN_ERR(shards_spanned(&shards, fs, noderev, walk, pool));
+
+ /* We also don't want the linear deltification to span more shards
+ than if deltas we used in a simple skip-delta scheme. */
+ if ((1 << (--shards)) <= walk)
+ count = noderev->predecessor_count - 1;
+ }
+
+ /* Walk back a number of predecessors equal to the difference
+ between count and the original predecessor count. (For example,
+ if noderev has ten predecessors and we want the eighth file rev,
+ walk back two predecessors.) */
+ base = noderev;
+ iterpool = svn_pool_create(pool);
+ while ((count++) < noderev->predecessor_count)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&base, fs,
+ base->predecessor_id, pool,
+ iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ /* return a suitable base representation */
+ *rep = props ? base->prop_rep : base->data_rep;
+
+ /* if we encountered a shared rep, its parent chain may be different
+ * from the node-rev parent chain. */
+ if (*rep)
+ {
+ int chain_length = 0;
+ int shard_count = 0;
+
+ /* Very short rep bases are simply not worth it as we are unlikely
+ * to re-coup the deltification space overhead of 20+ bytes. */
+ svn_filesize_t rep_size = (*rep)->expanded_size
+ ? (*rep)->expanded_size
+ : (*rep)->size;
+ if (rep_size < 64)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* Check whether the length of the deltification chain is acceptable.
+ * Otherwise, shared reps may form a non-skipping delta chain in
+ * extreme cases. */
+ SVN_ERR(svn_fs_fs__rep_chain_length(&chain_length, &shard_count,
+ *rep, fs, pool));
+
+ /* Some reasonable limit, depending on how acceptable longer linear
+ * chains are in this repo. Also, allow for some minimal chain. */
+ if (chain_length >= 2 * (int)ffd->max_linear_deltification + 2)
+ *rep = NULL;
+ else
+ /* To make it worth opening additional shards / pack files, we
+ * require that the reps have a certain minimal size. To deltify
+ * against a rep in different shard, the lower limit is 512 bytes
+ * and doubles with every extra shard to visit along the delta
+ * chain. */
+ if ( shard_count > 1
+ && ((svn_filesize_t)128 << shard_count) >= rep_size)
+ *rep = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Something went wrong and the pool for the rep write is being
+ cleared before we've finished writing the rep. So we need
+ to remove the rep from the protorevfile and we need to unlock
+ the protorevfile. */
+static apr_status_t
+rep_write_cleanup(void *data)
+{
+ struct rep_write_baton *b = data;
+ svn_error_t *err;
+
+ /* Truncate and close the protorevfile. */
+ err = svn_io_file_trunc(b->file, b->rep_offset, b->scratch_pool);
+ err = svn_error_compose_create(err, svn_io_file_close(b->file,
+ b->scratch_pool));
+
+ /* Remove our lock regardless of any preceding errors so that the
+ being_written flag is always removed and stays consistent with the
+ file lock which will be removed no matter what since the pool is
+ going away. */
+ err = svn_error_compose_create(err,
+ unlock_proto_rev(b->fs,
+ svn_fs_fs__id_txn_id(b->noderev->id),
+ b->lockcookie, b->scratch_pool));
+ if (err)
+ {
+ apr_status_t rc = err->apr_err;
+ svn_error_clear(err);
+ return rc;
+ }
+
+ return APR_SUCCESS;
+}
+
+/* Get a rep_write_baton and store it in *WB_P for the representation
+ indicated by NODEREV in filesystem FS. Perform allocations in
+ POOL. Only appropriate for file contents, not for props or
+ directory contents. */
+static svn_error_t *
+rep_write_get_baton(struct rep_write_baton **wb_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ struct rep_write_baton *b;
+ apr_file_t *file;
+ representation_t *base_rep;
+ svn_stream_t *source;
+ svn_txdelta_window_handler_t wh;
+ void *whb;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
+ svn_fs_fs__rep_header_t header = { 0 };
+
+ b = apr_pcalloc(pool, sizeof(*b));
+
+ b->sha1_checksum_ctx = svn_checksum_ctx_create(svn_checksum_sha1, pool);
+ b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5, pool);
+
+ b->fs = fs;
+ b->result_pool = pool;
+ b->scratch_pool = svn_pool_create(pool);
+ b->rep_size = 0;
+ b->noderev = noderev;
+
+ /* Open the prototype rev file and seek to its end. */
+ SVN_ERR(get_writable_proto_rev(&file, &b->lockcookie,
+ fs, svn_fs_fs__id_txn_id(noderev->id),
+ b->scratch_pool));
+
+ b->file = file;
+ b->rep_stream = fnv1a_wrap_stream(&b->fnv1a_checksum_ctx,
+ svn_stream_from_aprfile2(file, TRUE,
+ b->scratch_pool),
+ b->scratch_pool);
+
+ SVN_ERR(svn_fs_fs__get_file_offset(&b->rep_offset, file, b->scratch_pool));
+
+ /* Get the base for this delta. */
+ SVN_ERR(choose_delta_base(&base_rep, fs, noderev, FALSE, b->scratch_pool));
+ SVN_ERR(svn_fs_fs__get_contents(&source, fs, base_rep, TRUE,
+ b->scratch_pool));
+
+ /* Write out the rep header. */
+ if (base_rep)
+ {
+ header.base_revision = base_rep->revision;
+ header.base_item_index = base_rep->item_index;
+ header.base_length = base_rep->size;
+ header.type = svn_fs_fs__rep_delta;
+ }
+ else
+ {
+ header.type = svn_fs_fs__rep_self_delta;
+ }
+ SVN_ERR(svn_fs_fs__write_rep_header(&header, b->rep_stream,
+ b->scratch_pool));
+
+ /* Now determine the offset of the actual svndiff data. */
+ SVN_ERR(svn_fs_fs__get_file_offset(&b->delta_start, file,
+ b->scratch_pool));
+
+ /* Cleanup in case something goes wrong. */
+ apr_pool_cleanup_register(b->scratch_pool, b, rep_write_cleanup,
+ apr_pool_cleanup_null);
+
+ /* Prepare to write the svndiff data. */
+ svn_txdelta_to_svndiff3(&wh,
+ &whb,
+ b->rep_stream,
+ diff_version,
+ ffd->delta_compression_level,
+ pool);
+
+ b->delta_stream = svn_txdelta_target_push(wh, whb, source,
+ b->scratch_pool);
+
+ *wb_p = b;
+
+ return SVN_NO_ERROR;
+}
+
+/* For REP->SHA1_CHECKSUM, try to find an already existing representation
+ in FS and return it in *OUT_REP. If no such representation exists or
+ if rep sharing has been disabled for FS, NULL will be returned. Since
+ there may be new duplicate representations within the same uncommitted
+ revision, those can be passed in REPS_HASH (maps a sha1 digest onto
+ representation_t*), otherwise pass in NULL for REPS_HASH.
+
+ The content of both representations will be compared, taking REP's content
+ from FILE at OFFSET. Only if they actually match, will *OLD_REP not be
+ NULL.
+
+ Use RESULT_POOL for *OLD_REP allocations and SCRATCH_POOL for temporaries.
+ The lifetime of *OLD_REP is limited by both, RESULT_POOL and REP lifetime.
+ */
+static svn_error_t *
+get_shared_rep(representation_t **old_rep,
+ svn_fs_t *fs,
+ representation_t *rep,
+ apr_file_t *file,
+ apr_off_t offset,
+ apr_hash_t *reps_hash,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ svn_checksum_t checksum;
+ checksum.digest = rep->sha1_digest;
+ checksum.kind = svn_checksum_sha1;
+
+ /* Return NULL, if rep sharing has been disabled. */
+ *old_rep = NULL;
+ if (!ffd->rep_sharing_allowed)
+ return SVN_NO_ERROR;
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. Start with the hash lookup
+ because it is cheepest. */
+ if (reps_hash)
+ *old_rep = apr_hash_get(reps_hash,
+ rep->sha1_digest,
+ APR_SHA1_DIGESTSIZE);
+
+ /* If we haven't found anything yet, try harder and consult our DB. */
+ if (*old_rep == NULL)
+ {
+ err = svn_fs_fs__get_rep_reference(old_rep, fs, &checksum, result_pool);
+ /* ### Other error codes that we shouldn't mask out? */
+ if (err == SVN_NO_ERROR)
+ {
+ if (*old_rep)
+ SVN_ERR(svn_fs_fs__check_rep(*old_rep, fs, NULL, scratch_pool));
+ }
+ else if (err->apr_err == SVN_ERR_FS_CORRUPT
+ || SVN_ERROR_IN_CATEGORY(err->apr_err,
+ SVN_ERR_MALFUNC_CATEGORY_START))
+ {
+ /* Fatal error; don't mask it.
+
+ In particular, this block is triggered when the rep-cache refers
+ to revisions in the future. We signal that as a corruption situation
+ since, once those revisions are less than youngest (because of more
+ commits), the rep-cache would be invalid.
+ */
+ SVN_ERR(err);
+ }
+ else
+ {
+ /* Something's wrong with the rep-sharing index. We can continue
+ without rep-sharing, but warn.
+ */
+ (fs->warning)(fs->warning_baton, err);
+ svn_error_clear(err);
+ *old_rep = NULL;
+ }
+ }
+
+ /* look for intra-revision matches (usually data reps but not limited
+ to them in case props happen to look like some data rep)
+ */
+ if (*old_rep == NULL && is_txn_rep(rep))
+ {
+ svn_node_kind_t kind;
+ const char *file_name
+ = path_txn_sha1(fs, &rep->txn_id, rep->sha1_digest, scratch_pool);
+
+ /* in our txn, is there a rep file named with the wanted SHA1?
+ If so, read it and use that rep.
+ */
+ SVN_ERR(svn_io_check_path(file_name, &kind, scratch_pool));
+ if (kind == svn_node_file)
+ {
+ svn_stringbuf_t *rep_string;
+ SVN_ERR(svn_stringbuf_from_file2(&rep_string, file_name,
+ scratch_pool));
+ SVN_ERR(svn_fs_fs__parse_representation(old_rep, rep_string,
+ result_pool, scratch_pool));
+ }
+ }
+
+ if (!*old_rep)
+ return SVN_NO_ERROR;
+
+ /* We don't want 0-length PLAIN representations to replace non-0-length
+ ones (see issue #4554). Take into account that EXPANDED_SIZE may be
+ 0 in which case we have to check the on-disk SIZE. Also, this doubles
+ as a simple guard against general rep-cache induced corruption. */
+ if ( ((*old_rep)->expanded_size != rep->expanded_size)
+ || ((rep->expanded_size == 0) && ((*old_rep)->size != rep->size)))
+ {
+ *old_rep = NULL;
+ }
+ else
+ {
+ /* Add information that is missing in the cached data.
+ Use the old rep for this content. */
+ memcpy((*old_rep)->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
+ (*old_rep)->uniquifier = rep->uniquifier;
+ }
+
+ /* If we (very likely) found a matching representation, compare the actual
+ * contents such that we can be sure that no rep-cache.db corruption or
+ * hash collision produced a false positive. */
+ if (*old_rep)
+ {
+ apr_off_t old_position;
+ svn_stream_t *contents;
+ svn_stream_t *old_contents;
+ svn_boolean_t same;
+
+ /* The existing representation may itself be part of the current
+ * transaction. In that case, it may be in different stages of
+ * the commit finalization process.
+ *
+ * OLD_REP_NORM is the same as that OLD_REP but it is assigned
+ * explicitly to REP's transaction if OLD_REP does not point
+ * to an already committed revision. This then prevents the
+ * revision lookup and the txn data will be accessed.
+ */
+ representation_t old_rep_norm = **old_rep;
+ if ( !SVN_IS_VALID_REVNUM(old_rep_norm.revision)
+ || old_rep_norm.revision > ffd->youngest_rev_cache)
+ old_rep_norm.txn_id = rep->txn_id;
+
+ /* Make sure we can later restore FILE's current position. */
+ SVN_ERR(svn_fs_fs__get_file_offset(&old_position, file, scratch_pool));
+
+ /* Compare the two representations.
+ * Note that the stream comparison might also produce MD5 checksum
+ * errors or other failures in case of SHA1 collisions. */
+ SVN_ERR(svn_fs_fs__get_contents_from_file(&contents, fs, rep, file,
+ offset, scratch_pool));
+ SVN_ERR(svn_fs_fs__get_contents(&old_contents, fs, &old_rep_norm,
+ FALSE, scratch_pool));
+ err = svn_stream_contents_same2(&same, contents, old_contents,
+ scratch_pool);
+
+ /* A mismatch should be extremely rare.
+ * If it does happen, reject the commit. */
+ if (!same || err)
+ {
+ /* SHA1 collision or worse. */
+ svn_stringbuf_t *old_rep_str
+ = svn_fs_fs__unparse_representation(*old_rep,
+ ffd->format, FALSE,
+ scratch_pool,
+ scratch_pool);
+ svn_stringbuf_t *rep_str
+ = svn_fs_fs__unparse_representation(rep,
+ ffd->format, FALSE,
+ scratch_pool,
+ scratch_pool);
+ const char *checksum__str
+ = svn_checksum_to_cstring_display(&checksum, scratch_pool);
+
+ return svn_error_createf(SVN_ERR_FS_GENERAL,
+ err, "SHA1 of reps '%s' and '%s' "
+ "matches (%s) but contents differ",
+ old_rep_str->data, rep_str->data,
+ checksum__str);
+ }
+
+ /* Restore FILE's read / write position. */
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &old_position, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy the hash sum calculation results from MD5_CTX, SHA1_CTX into REP.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+digests_final(representation_t *rep,
+ const svn_checksum_ctx_t *md5_ctx,
+ const svn_checksum_ctx_t *sha1_ctx,
+ apr_pool_t *pool)
+{
+ svn_checksum_t *checksum;
+
+ SVN_ERR(svn_checksum_final(&checksum, md5_ctx, pool));
+ memcpy(rep->md5_digest, checksum->digest, svn_checksum_size(checksum));
+ SVN_ERR(svn_checksum_final(&checksum, sha1_ctx, pool));
+ rep->has_sha1 = checksum != NULL;
+ if (rep->has_sha1)
+ memcpy(rep->sha1_digest, checksum->digest, svn_checksum_size(checksum));
+
+ return SVN_NO_ERROR;
+}
+
+/* Close handler for the representation write stream. BATON is a
+ rep_write_baton. Writes out a new node-rev that correctly
+ references the representation we just finished writing. */
+static svn_error_t *
+rep_write_contents_close(void *baton)
+{
+ struct rep_write_baton *b = baton;
+ representation_t *rep;
+ representation_t *old_rep;
+ apr_off_t offset;
+
+ rep = apr_pcalloc(b->result_pool, sizeof(*rep));
+
+ /* Close our delta stream so the last bits of svndiff are written
+ out. */
+ if (b->delta_stream)
+ SVN_ERR(svn_stream_close(b->delta_stream));
+
+ /* Determine the length of the svndiff data. */
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, b->file, b->scratch_pool));
+ rep->size = offset - b->delta_start;
+
+ /* Fill in the rest of the representation field. */
+ rep->expanded_size = b->rep_size;
+ rep->txn_id = *svn_fs_fs__id_txn_id(b->noderev->id);
+ SVN_ERR(set_uniquifier(b->fs, rep, b->scratch_pool));
+ rep->revision = SVN_INVALID_REVNUM;
+
+ /* Finalize the checksum. */
+ SVN_ERR(digests_final(rep, b->md5_checksum_ctx, b->sha1_checksum_ctx,
+ b->result_pool));
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, b->file, b->rep_offset, NULL,
+ b->result_pool, b->scratch_pool));
+
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(b->file, b->rep_offset, b->scratch_pool));
+
+ /* Use the old rep for this content. */
+ b->noderev->data_rep = old_rep;
+ }
+ else
+ {
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_stream_puts(b->rep_stream, "ENDREP\n"));
+ SVN_ERR(allocate_item_index(&rep->item_index, b->fs, &rep->txn_id,
+ b->rep_offset, b->scratch_pool));
+
+ b->noderev->data_rep = rep;
+ }
+
+ /* Remove cleanup callback. */
+ apr_pool_cleanup_kill(b->scratch_pool, b, rep_write_cleanup);
+
+ /* Write out the new node-rev information. */
+ SVN_ERR(svn_fs_fs__put_node_revision(b->fs, b->noderev->id, b->noderev,
+ FALSE, b->scratch_pool));
+ if (!old_rep)
+ {
+ svn_fs_fs__p2l_entry_t entry;
+
+ entry.offset = b->rep_offset;
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, b->file, b->scratch_pool));
+ entry.size = offset - b->rep_offset;
+ entry.type = SVN_FS_FS__ITEM_TYPE_FILE_REP;
+ entry.item.revision = SVN_INVALID_REVNUM;
+ entry.item.number = rep->item_index;
+ SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
+ b->fnv1a_checksum_ctx,
+ b->scratch_pool));
+
+ SVN_ERR(store_p2l_index_entry(b->fs, &rep->txn_id, &entry,
+ b->scratch_pool));
+ }
+
+ SVN_ERR(svn_io_file_close(b->file, b->scratch_pool));
+
+ /* Write the sha1->rep mapping *after* we successfully written node
+ * revision to disk. */
+ if (!old_rep)
+ SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->scratch_pool));
+
+ SVN_ERR(unlock_proto_rev(b->fs, &rep->txn_id, b->lockcookie,
+ b->scratch_pool));
+ svn_pool_destroy(b->scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Store a writable stream in *CONTENTS_P that will receive all data
+ written and store it as the file data representation referenced by
+ NODEREV in filesystem FS. Perform temporary allocations in
+ POOL. Only appropriate for file data, not props or directory
+ contents. */
+static svn_error_t *
+set_representation(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ struct rep_write_baton *wb;
+
+ if (! svn_fs_fs__id_is_txn(noderev->id))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Attempted to write to non-transaction '%s'"),
+ svn_fs_fs__id_unparse(noderev->id, pool)->data);
+
+ SVN_ERR(rep_write_get_baton(&wb, fs, noderev, pool));
+
+ *contents_p = svn_stream_create(wb, pool);
+ svn_stream_set_write(*contents_p, rep_write_contents);
+ svn_stream_set_close(*contents_p, rep_write_contents_close);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__set_contents(svn_stream_t **stream,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ if (noderev->kind != svn_node_file)
+ return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't set text contents of a directory"));
+
+ return set_representation(stream, fs, noderev, pool);
+}
+
+svn_error_t *
+svn_fs_fs__create_successor(const svn_fs_id_t **new_id_p,
+ svn_fs_t *fs,
+ const svn_fs_id_t *old_idp,
+ node_revision_t *new_noderev,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ const svn_fs_id_t *id;
+
+ if (! copy_id)
+ copy_id = svn_fs_fs__id_copy_id(old_idp);
+ id = svn_fs_fs__id_txn_create(svn_fs_fs__id_node_id(old_idp), copy_id,
+ txn_id, pool);
+
+ new_noderev->id = id;
+
+ if (! new_noderev->copyroot_path)
+ {
+ new_noderev->copyroot_path = apr_pstrdup(pool,
+ new_noderev->created_path);
+ new_noderev->copyroot_rev = svn_fs_fs__id_rev(new_noderev->id);
+ }
+
+ SVN_ERR(svn_fs_fs__put_node_revision(fs, new_noderev->id, new_noderev, FALSE,
+ pool));
+
+ *new_id_p = id;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__set_proplist(svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool)
+{
+ const char *filename
+ = svn_fs_fs__path_txn_node_props(fs, noderev->id, pool);
+ apr_file_t *file;
+ svn_stream_t *out;
+
+ /* Dump the property list to the mutable property file. */
+ SVN_ERR(svn_io_file_open(&file, filename,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, pool));
+ out = svn_stream_from_aprfile2(file, TRUE, pool);
+ SVN_ERR(svn_hash_write2(proplist, out, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ /* Mark the node-rev's prop rep as mutable, if not already done. */
+ if (!noderev->prop_rep || !is_txn_rep(noderev->prop_rep))
+ {
+ noderev->prop_rep = apr_pcalloc(pool, sizeof(*noderev->prop_rep));
+ noderev->prop_rep->txn_id = *svn_fs_fs__id_txn_id(noderev->id);
+ SVN_ERR(svn_fs_fs__put_node_revision(fs, noderev->id, noderev, FALSE,
+ pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* This baton is used by the stream created for write_container_rep. */
+struct write_container_baton
+{
+ svn_stream_t *stream;
+
+ apr_size_t size;
+
+ svn_checksum_ctx_t *md5_ctx;
+ svn_checksum_ctx_t *sha1_ctx;
+};
+
+/* The handler for the write_container_rep stream. BATON is a
+ write_container_baton, DATA has the data to write and *LEN is the number
+ of bytes to write. */
+static svn_error_t *
+write_container_handler(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ struct write_container_baton *whb = baton;
+
+ SVN_ERR(svn_checksum_update(whb->md5_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(whb->sha1_ctx, data, *len));
+
+ SVN_ERR(svn_stream_write(whb->stream, data, len));
+ whb->size += *len;
+
+ return SVN_NO_ERROR;
+}
+
+/* Callback function type. Write the data provided by BATON into STREAM. */
+typedef svn_error_t *
+(* collection_writer_t)(svn_stream_t *stream, void *baton, apr_pool_t *pool);
+
+/* Implement collection_writer_t writing the C string->svn_string_t hash
+ given as BATON. */
+static svn_error_t *
+write_hash_to_stream(svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *pool)
+{
+ apr_hash_t *hash = baton;
+ SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement collection_writer_t writing the svn_fs_dirent_t* array given
+ as BATON. */
+static svn_error_t *
+write_directory_to_stream(svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *dir = baton;
+ SVN_ERR(unparse_dir_entries(dir, stream, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Write out the COLLECTION as a text representation to file FILE using
+ WRITER. In the process, record position, the total size of the dump and
+ MD5 as well as SHA1 in REP. Add the representation of type ITEM_TYPE to
+ the indexes if necessary.
+
+ If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless
+ of any other option and rep-sharing settings. If rep sharing has been
+ enabled and REPS_HASH is not NULL, it will be used in addition to the
+ on-disk cache to find earlier reps with the same content. If such
+ existing reps can be found, we will truncate the one just written from
+ the file and return the existing rep.
+
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+write_container_rep(representation_t *rep,
+ apr_file_t *file,
+ void *collection,
+ collection_writer_t writer,
+ svn_fs_t *fs,
+ apr_hash_t *reps_hash,
+ svn_boolean_t allow_rep_sharing,
+ apr_uint32_t item_type,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream;
+ struct write_container_baton *whb;
+ svn_checksum_ctx_t *fnv1a_checksum_ctx;
+ apr_off_t offset = 0;
+ svn_fs_fs__p2l_entry_t entry;
+
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
+
+ whb = apr_pcalloc(scratch_pool, sizeof(*whb));
+
+ whb->stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ scratch_pool);
+ whb->size = 0;
+ whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
+ whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, scratch_pool);
+
+ stream = svn_stream_create(whb, scratch_pool);
+ svn_stream_set_write(stream, write_container_handler);
+
+ SVN_ERR(svn_stream_puts(whb->stream, "PLAIN\n"));
+
+ SVN_ERR(writer(stream, collection, scratch_pool));
+
+ /* Store the results. */
+ SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
+
+ /* Update size info. */
+ rep->expanded_size = whb->size;
+ rep->size = whb->size;
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ if (allow_rep_sharing)
+ {
+ representation_t *old_rep;
+ SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash,
+ scratch_pool, scratch_pool));
+
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
+
+ /* Use the old rep for this content. */
+ memcpy(rep, old_rep, sizeof (*rep));
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n"));
+
+ SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
+ offset, scratch_pool));
+
+ entry.offset = offset;
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
+ entry.size = offset - entry.offset;
+ entry.type = item_type;
+ entry.item.revision = SVN_INVALID_REVNUM;
+ entry.item.number = rep->item_index;
+ SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
+ fnv1a_checksum_ctx,
+ scratch_pool));
+
+ SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Write out the COLLECTION pertaining to the NODEREV in FS as a deltified
+ text representation to file FILE using WRITER. In the process, record the
+ total size and the md5 digest in REP and add the representation of type
+ ITEM_TYPE to the indexes if necessary.
+
+ If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless
+ of any other option and rep-sharing settings. If rep sharing has been
+ enabled and REPS_HASH is not NULL, it will be used in addition to the
+ on-disk cache to find earlier reps with the same content. If such
+ existing reps can be found, we will truncate the one just written from
+ the file and return the existing rep.
+
+ If ITEM_TYPE is IS_PROPS equals SVN_FS_FS__ITEM_TYPE_*_PROPS, assume
+ that we want to a props representation as the base for our delta.
+ Perform temporary allocations in SCRATCH_POOL.
+ */
+static svn_error_t *
+write_container_delta_rep(representation_t *rep,
+ apr_file_t *file,
+ void *collection,
+ collection_writer_t writer,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_hash_t *reps_hash,
+ svn_boolean_t allow_rep_sharing,
+ apr_uint32_t item_type,
+ apr_pool_t *scratch_pool)
+{
+ svn_txdelta_window_handler_t diff_wh;
+ void *diff_whb;
+
+ svn_stream_t *file_stream;
+ svn_stream_t *stream;
+ representation_t *base_rep;
+ svn_checksum_ctx_t *fnv1a_checksum_ctx;
+ svn_stream_t *source;
+ svn_fs_fs__rep_header_t header = { 0 };
+ svn_fs_fs__p2l_entry_t entry;
+
+ apr_off_t rep_end = 0;
+ apr_off_t delta_start = 0;
+ apr_off_t offset = 0;
+
+ struct write_container_baton *whb;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ int diff_version = ffd->format >= SVN_FS_FS__MIN_SVNDIFF1_FORMAT ? 1 : 0;
+ svn_boolean_t is_props = (item_type == SVN_FS_FS__ITEM_TYPE_FILE_PROPS)
+ || (item_type == SVN_FS_FS__ITEM_TYPE_DIR_PROPS);
+
+ /* Get the base for this delta. */
+ SVN_ERR(choose_delta_base(&base_rep, fs, noderev, is_props, scratch_pool));
+ SVN_ERR(svn_fs_fs__get_contents(&source, fs, base_rep, FALSE, scratch_pool));
+
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
+
+ /* Write out the rep header. */
+ if (base_rep)
+ {
+ header.base_revision = base_rep->revision;
+ header.base_item_index = base_rep->item_index;
+ header.base_length = base_rep->size;
+ header.type = svn_fs_fs__rep_delta;
+ }
+ else
+ {
+ header.type = svn_fs_fs__rep_self_delta;
+ }
+
+ file_stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ scratch_pool);
+ SVN_ERR(svn_fs_fs__write_rep_header(&header, file_stream, scratch_pool));
+ SVN_ERR(svn_fs_fs__get_file_offset(&delta_start, file, scratch_pool));
+
+ /* Prepare to write the svndiff data. */
+ svn_txdelta_to_svndiff3(&diff_wh,
+ &diff_whb,
+ file_stream,
+ diff_version,
+ ffd->delta_compression_level,
+ scratch_pool);
+
+ whb = apr_pcalloc(scratch_pool, sizeof(*whb));
+ whb->stream = svn_txdelta_target_push(diff_wh, diff_whb, source,
+ scratch_pool);
+ whb->size = 0;
+ whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
+ whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, scratch_pool);
+
+ /* serialize the hash */
+ stream = svn_stream_create(whb, scratch_pool);
+ svn_stream_set_write(stream, write_container_handler);
+
+ SVN_ERR(writer(stream, collection, scratch_pool));
+ SVN_ERR(svn_stream_close(whb->stream));
+
+ /* Store the results. */
+ SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
+
+ /* Update size info. */
+ SVN_ERR(svn_fs_fs__get_file_offset(&rep_end, file, scratch_pool));
+ rep->size = rep_end - delta_start;
+ rep->expanded_size = whb->size;
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ if (allow_rep_sharing)
+ {
+ representation_t *old_rep;
+ SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash,
+ scratch_pool, scratch_pool));
+
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
+
+ /* Use the old rep for this content. */
+ memcpy(rep, old_rep, sizeof (*rep));
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
+
+ SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
+ offset, scratch_pool));
+
+ entry.offset = offset;
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
+ entry.size = offset - entry.offset;
+ entry.type = item_type;
+ entry.item.revision = SVN_INVALID_REVNUM;
+ entry.item.number = rep->item_index;
+ SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
+ fnv1a_checksum_ctx,
+ scratch_pool));
+
+ SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Sanity check ROOT_NODEREV, a candidate for being the root node-revision
+ of (not yet committed) revision REV in FS. Use POOL for temporary
+ allocations.
+
+ If you change this function, consider updating svn_fs_fs__verify() too.
+ */
+static svn_error_t *
+validate_root_noderev(svn_fs_t *fs,
+ node_revision_t *root_noderev,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ svn_revnum_t head_revnum = rev-1;
+ int head_predecessor_count;
+
+ SVN_ERR_ASSERT(rev > 0);
+
+ /* Compute HEAD_PREDECESSOR_COUNT. */
+ {
+ svn_fs_root_t *head_revision;
+ const svn_fs_id_t *head_root_id;
+ node_revision_t *head_root_noderev;
+
+ /* Get /@HEAD's noderev. */
+ SVN_ERR(svn_fs_fs__revision_root(&head_revision, fs, head_revnum, pool));
+ SVN_ERR(svn_fs_fs__node_id(&head_root_id, head_revision, "/", pool));
+ SVN_ERR(svn_fs_fs__get_node_revision(&head_root_noderev, fs, head_root_id,
+ pool, pool));
+ head_predecessor_count = head_root_noderev->predecessor_count;
+ }
+
+ /* Check that the root noderev's predecessor count equals REV.
+
+ This kind of corruption was seen on svn.apache.org (both on
+ the root noderev and on other fspaths' noderevs); see
+ issue #4129.
+
+ Normally (rev == root_noderev->predecessor_count), but here we
+ use a more roundabout check that should only trigger on new instances
+ of the corruption, rather then trigger on each and every new commit
+ to a repository that has triggered the bug somewhere in its root
+ noderev's history.
+ */
+ if (root_noderev->predecessor_count != -1
+ && (root_noderev->predecessor_count - head_predecessor_count)
+ != (rev - head_revnum))
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("predecessor count for "
+ "the root node-revision is wrong: "
+ "found (%d+%ld != %d), committing r%ld"),
+ head_predecessor_count,
+ rev - head_revnum, /* This is equal to 1. */
+ root_noderev->predecessor_count,
+ rev);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Given the potentially txn-local id PART, update that to a permanent ID
+ * based on the REVISION currently being written and the START_ID for that
+ * revision. Use the repo FORMAT to decide which implementation to use.
+ */
+static void
+get_final_id(svn_fs_fs__id_part_t *part,
+ svn_revnum_t revision,
+ apr_uint64_t start_id,
+ int format)
+{
+ if (part->revision == SVN_INVALID_REVNUM)
+ {
+ if (format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ {
+ part->revision = revision;
+ }
+ else
+ {
+ part->revision = 0;
+ part->number += start_id;
+ }
+ }
+}
+
+/* Copy a node-revision specified by id ID in fileystem FS from a
+ transaction into the proto-rev-file FILE. Set *NEW_ID_P to a
+ pointer to the new node-id which will be allocated in POOL.
+ If this is a directory, copy all children as well.
+
+ START_NODE_ID and START_COPY_ID are
+ the first available node and copy ids for this filesystem, for older
+ FS formats.
+
+ REV is the revision number that this proto-rev-file will represent.
+
+ INITIAL_OFFSET is the offset of the proto-rev-file on entry to
+ commit_body.
+
+ If REPS_TO_CACHE is not NULL, append to it a copy (allocated in
+ REPS_POOL) of each data rep that is new in this revision.
+
+ If REPS_HASH is not NULL, append copies (allocated in REPS_POOL)
+ of the representations of each property rep that is new in this
+ revision.
+
+ AT_ROOT is true if the node revision being written is the root
+ node-revision. It is only controls additional sanity checking
+ logic.
+
+ Temporary allocations are also from POOL. */
+static svn_error_t *
+write_final_rev(const svn_fs_id_t **new_id_p,
+ apr_file_t *file,
+ svn_revnum_t rev,
+ svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_uint64_t start_node_id,
+ apr_uint64_t start_copy_id,
+ apr_off_t initial_offset,
+ apr_array_header_t *reps_to_cache,
+ apr_hash_t *reps_hash,
+ apr_pool_t *reps_pool,
+ svn_boolean_t at_root,
+ apr_pool_t *pool)
+{
+ node_revision_t *noderev;
+ apr_off_t my_offset;
+ const svn_fs_id_t *new_id;
+ svn_fs_fs__id_part_t node_id, copy_id, rev_item;
+ fs_fs_data_t *ffd = fs->fsap_data;
+ const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__id_txn_id(id);
+ svn_stream_t *file_stream;
+ svn_checksum_ctx_t *fnv1a_checksum_ctx;
+ apr_pool_t *subpool;
+
+ *new_id_p = NULL;
+
+ /* Check to see if this is a transaction node. */
+ if (! svn_fs_fs__id_is_txn(id))
+ return SVN_NO_ERROR;
+
+ subpool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool, subpool));
+
+ if (noderev->kind == svn_node_dir)
+ {
+ apr_array_header_t *entries;
+ int i;
+
+ /* This is a directory. Write out all the children first. */
+
+ SVN_ERR(svn_fs_fs__rep_contents_dir(&entries, fs, noderev, pool,
+ subpool));
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_dirent_t *dirent
+ = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
+
+ svn_pool_clear(subpool);
+ SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
+ start_node_id, start_copy_id, initial_offset,
+ reps_to_cache, reps_hash, reps_pool, FALSE,
+ subpool));
+ if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
+ dirent->id = svn_fs_fs__id_copy(new_id, pool);
+ }
+
+ if (noderev->data_rep && is_txn_rep(noderev->data_rep))
+ {
+ /* Write out the contents of this directory as a text rep. */
+ noderev->data_rep->revision = rev;
+ if (ffd->deltify_directories)
+ SVN_ERR(write_container_delta_rep(noderev->data_rep, file,
+ entries,
+ write_directory_to_stream,
+ fs, noderev, NULL, FALSE,
+ SVN_FS_FS__ITEM_TYPE_DIR_REP,
+ pool));
+ else
+ SVN_ERR(write_container_rep(noderev->data_rep, file, entries,
+ write_directory_to_stream, fs, NULL,
+ FALSE, SVN_FS_FS__ITEM_TYPE_DIR_REP,
+ pool));
+
+ reset_txn_in_rep(noderev->data_rep);
+ }
+ }
+ else
+ {
+ /* This is a file. We should make sure the data rep, if it
+ exists in a "this" state, gets rewritten to our new revision
+ num. */
+
+ if (noderev->data_rep && is_txn_rep(noderev->data_rep))
+ {
+ reset_txn_in_rep(noderev->data_rep);
+ noderev->data_rep->revision = rev;
+
+ if (!svn_fs_fs__use_log_addressing(fs))
+ {
+ /* See issue 3845. Some unknown mechanism caused the
+ protorev file to get truncated, so check for that
+ here. */
+ if (noderev->data_rep->item_index + noderev->data_rep->size
+ > initial_offset)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Truncated protorev file detected"));
+ }
+ }
+ }
+
+ svn_pool_destroy(subpool);
+
+ /* Fix up the property reps. */
+ if (noderev->prop_rep && is_txn_rep(noderev->prop_rep))
+ {
+ apr_hash_t *proplist;
+ apr_uint32_t item_type = noderev->kind == svn_node_dir
+ ? SVN_FS_FS__ITEM_TYPE_DIR_PROPS
+ : SVN_FS_FS__ITEM_TYPE_FILE_PROPS;
+ SVN_ERR(svn_fs_fs__get_proplist(&proplist, fs, noderev, pool));
+
+ noderev->prop_rep->revision = rev;
+
+ if (ffd->deltify_properties)
+ SVN_ERR(write_container_delta_rep(noderev->prop_rep, file, proplist,
+ write_hash_to_stream, fs, noderev,
+ reps_hash, TRUE, item_type, pool));
+ else
+ SVN_ERR(write_container_rep(noderev->prop_rep, file, proplist,
+ write_hash_to_stream, fs, reps_hash,
+ TRUE, item_type, pool));
+
+ reset_txn_in_rep(noderev->prop_rep);
+ }
+
+ /* Convert our temporary ID into a permanent revision one. */
+ node_id = *svn_fs_fs__id_node_id(noderev->id);
+ get_final_id(&node_id, rev, start_node_id, ffd->format);
+ copy_id = *svn_fs_fs__id_copy_id(noderev->id);
+ get_final_id(&copy_id, rev, start_copy_id, ffd->format);
+
+ if (noderev->copyroot_rev == SVN_INVALID_REVNUM)
+ noderev->copyroot_rev = rev;
+
+ /* root nodes have a fixed ID in log addressing mode */
+ SVN_ERR(svn_fs_fs__get_file_offset(&my_offset, file, pool));
+ if (svn_fs_fs__use_log_addressing(fs) && at_root)
+ {
+ /* reference the root noderev from the log-to-phys index */
+ rev_item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset,
+ rev_item.number, pool));
+ }
+ else
+ SVN_ERR(allocate_item_index(&rev_item.number, fs, txn_id,
+ my_offset, pool));
+
+ rev_item.revision = rev;
+ new_id = svn_fs_fs__id_rev_create(&node_id, &copy_id, &rev_item, pool);
+
+ noderev->id = new_id;
+
+ if (ffd->rep_sharing_allowed)
+ {
+ /* Save the data representation's hash in the rep cache. */
+ if ( noderev->data_rep && noderev->kind == svn_node_file
+ && noderev->data_rep->revision == rev)
+ {
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, representation_t *)
+ = svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
+ }
+
+ if (noderev->prop_rep && noderev->prop_rep->revision == rev)
+ {
+ /* Add new property reps to hash and on-disk cache. */
+ representation_t *copy
+ = svn_fs_fs__rep_copy(noderev->prop_rep, reps_pool);
+
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, representation_t *) = copy;
+
+ apr_hash_set(reps_hash,
+ copy->sha1_digest,
+ APR_SHA1_DIGESTSIZE,
+ copy);
+ }
+ }
+
+ /* don't serialize SHA1 for dirs to disk (waste of space) */
+ if (noderev->data_rep && noderev->kind == svn_node_dir)
+ noderev->data_rep->has_sha1 = FALSE;
+
+ /* don't serialize SHA1 for props to disk (waste of space) */
+ if (noderev->prop_rep)
+ noderev->prop_rep->has_sha1 = FALSE;
+
+ /* Workaround issue #4031: is-fresh-txn-root in revision files. */
+ noderev->is_fresh_txn_root = FALSE;
+
+ /* Write out our new node-revision. */
+ if (at_root)
+ SVN_ERR(validate_root_noderev(fs, noderev, rev, pool));
+
+ file_stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
+ svn_stream_from_aprfile2(file, TRUE, pool),
+ pool);
+ SVN_ERR(svn_fs_fs__write_noderev(file_stream, noderev, ffd->format,
+ svn_fs_fs__fs_supports_mergeinfo(fs),
+ pool));
+
+ /* reference the root noderev from the log-to-phys index */
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ svn_fs_fs__p2l_entry_t entry;
+ rev_item.revision = SVN_INVALID_REVNUM;
+
+ entry.offset = my_offset;
+ SVN_ERR(svn_fs_fs__get_file_offset(&my_offset, file, pool));
+ entry.size = my_offset - entry.offset;
+ entry.type = SVN_FS_FS__ITEM_TYPE_NODEREV;
+ entry.item = rev_item;
+ SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
+ fnv1a_checksum_ctx,
+ pool));
+
+ SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, pool));
+ }
+
+ /* Return our ID that references the revision file. */
+ *new_id_p = noderev->id;
+
+ return SVN_NO_ERROR;
+}
+
+/* Write the changed path info CHANGED_PATHS from transaction TXN_ID to the
+ permanent rev-file FILE in filesystem FS. *OFFSET_P is set the to offset
+ in the file of the beginning of this information. Perform temporary
+ allocations in POOL. */
+static svn_error_t *
+write_final_changed_path_info(apr_off_t *offset_p,
+ apr_file_t *file,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_hash_t *changed_paths,
+ apr_pool_t *pool)
+{
+ apr_off_t offset;
+ svn_stream_t *stream;
+ svn_checksum_ctx_t *fnv1a_checksum_ctx;
+
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, pool));
+
+ /* write to target file & calculate checksum */
+ stream = fnv1a_wrap_stream(&fnv1a_checksum_ctx,
+ svn_stream_from_aprfile2(file, TRUE, pool),
+ pool);
+ SVN_ERR(svn_fs_fs__write_changes(stream, fs, changed_paths, TRUE, pool));
+
+ *offset_p = offset;
+
+ /* reference changes from the indexes */
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ svn_fs_fs__p2l_entry_t entry;
+
+ entry.offset = offset;
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, pool));
+ entry.size = offset - entry.offset;
+ entry.type = SVN_FS_FS__ITEM_TYPE_CHANGES;
+ entry.item.revision = SVN_INVALID_REVNUM;
+ entry.item.number = SVN_FS_FS__ITEM_INDEX_CHANGES;
+ SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
+ fnv1a_checksum_ctx,
+ pool));
+
+ SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, pool));
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, entry.offset,
+ SVN_FS_FS__ITEM_INDEX_CHANGES, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Open a new svn_fs_t handle to FS, set that handle's concept of "current
+ youngest revision" to NEW_REV, and call svn_fs_fs__verify_root() on
+ NEW_REV's revision root.
+
+ Intended to be called as the very last step in a commit before 'current'
+ is bumped. This implies that we are holding the write lock. */
+static svn_error_t *
+verify_as_revision_before_current_plus_plus(svn_fs_t *fs,
+ svn_revnum_t new_rev,
+ apr_pool_t *pool)
+{
+#ifdef SVN_DEBUG
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_fs_t *ft; /* fs++ == ft */
+ svn_fs_root_t *root;
+ fs_fs_data_t *ft_ffd;
+ apr_hash_t *fs_config;
+
+ SVN_ERR_ASSERT(ffd->svn_fs_open_);
+
+ /* make sure FT does not simply return data cached by other instances
+ * but actually retrieves it from disk at least once.
+ */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ SVN_ERR(ffd->svn_fs_open_(&ft, fs->path,
+ fs_config,
+ pool,
+ pool));
+ ft_ffd = ft->fsap_data;
+ /* Don't let FT consult rep-cache.db, either. */
+ ft_ffd->rep_sharing_allowed = FALSE;
+
+ /* Time travel! */
+ ft_ffd->youngest_rev_cache = new_rev;
+
+ SVN_ERR(svn_fs_fs__revision_root(&root, ft, new_rev, pool));
+ SVN_ERR_ASSERT(root->is_txn_root == FALSE && root->rev == new_rev);
+ SVN_ERR_ASSERT(ft_ffd->youngest_rev_cache == new_rev);
+ SVN_ERR(svn_fs_fs__verify_root(root, pool));
+#endif /* SVN_DEBUG */
+
+ return SVN_NO_ERROR;
+}
+
+/* Update the 'current' file to hold the correct next node and copy_ids
+ from transaction TXN_ID in filesystem FS. The current revision is
+ set to REV. Perform temporary allocations in POOL. */
+static svn_error_t *
+write_final_current(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ svn_revnum_t rev,
+ apr_uint64_t start_node_id,
+ apr_uint64_t start_copy_id,
+ apr_pool_t *pool)
+{
+ apr_uint64_t txn_node_id;
+ apr_uint64_t txn_copy_id;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ return svn_fs_fs__write_current(fs, rev, 0, 0, pool);
+
+ /* To find the next available ids, we add the id that used to be in
+ the 'current' file, to the next ids from the transaction file. */
+ SVN_ERR(read_next_ids(&txn_node_id, &txn_copy_id, fs, txn_id, pool));
+
+ start_node_id += txn_node_id;
+ start_copy_id += txn_copy_id;
+
+ return svn_fs_fs__write_current(fs, rev, start_node_id, start_copy_id,
+ pool);
+}
+
+/* Verify that the user registered with FS has all the locks necessary to
+ permit all the changes associated with TXN_NAME.
+ The FS write lock is assumed to be held by the caller. */
+static svn_error_t *
+verify_locks(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_hash_t *changed_paths,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool;
+ apr_array_header_t *changed_paths_sorted;
+ svn_stringbuf_t *last_recursed = NULL;
+ int i;
+
+ /* Make an array of the changed paths, and sort them depth-first-ily. */
+ changed_paths_sorted = svn_sort__hash(changed_paths,
+ svn_sort_compare_items_as_paths,
+ pool);
+
+ /* Now, traverse the array of changed paths, verify locks. Note
+ that if we need to do a recursive verification a path, we'll skip
+ over children of that path when we get to them. */
+ iterpool = svn_pool_create(pool);
+ for (i = 0; i < changed_paths_sorted->nelts; i++)
+ {
+ const svn_sort__item_t *item;
+ const char *path;
+ svn_fs_path_change2_t *change;
+ svn_boolean_t recurse = TRUE;
+
+ svn_pool_clear(iterpool);
+
+ item = &APR_ARRAY_IDX(changed_paths_sorted, i, svn_sort__item_t);
+
+ /* Fetch the change associated with our path. */
+ path = item->key;
+ change = item->value;
+
+ /* If this path has already been verified as part of a recursive
+ check of one of its parents, no need to do it again. */
+ if (last_recursed
+ && svn_fspath__skip_ancestor(last_recursed->data, path))
+ continue;
+
+ /* What does it mean to succeed at lock verification for a given
+ path? For an existing file or directory getting modified
+ (text, props), it means we hold the lock on the file or
+ directory. For paths being added or removed, we need to hold
+ the locks for that path and any children of that path.
+
+ WHEW! We have no reliable way to determine the node kind
+ of deleted items, but fortunately we are going to do a
+ recursive check on deleted paths regardless of their kind. */
+ if (change->change_kind == svn_fs_path_change_modify)
+ recurse = FALSE;
+ SVN_ERR(svn_fs_fs__allow_locked_operation(path, fs, recurse, TRUE,
+ iterpool));
+
+ /* If we just did a recursive check, remember the path we
+ checked (so children can be skipped). */
+ if (recurse)
+ {
+ if (! last_recursed)
+ last_recursed = svn_stringbuf_create(path, pool);
+ else
+ svn_stringbuf_set(last_recursed, path);
+ }
+ }
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Return in *PATH the path to a file containing the properties that
+ make up the final revision properties file. This involves setting
+ svn:date and removing any temporary properties associated with the
+ commit flags. */
+static svn_error_t *
+write_final_revprop(const char **path,
+ svn_fs_txn_t *txn,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ apr_hash_t *txnprops;
+ svn_boolean_t final_mods = FALSE;
+ svn_string_t date;
+ svn_string_t *client_date;
+
+ SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, txn, pool));
+
+ /* Remove any temporary txn props representing 'flags'. */
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
+ final_mods = TRUE;
+ }
+
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
+ final_mods = TRUE;
+ }
+
+ client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
+ if (client_date)
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
+ final_mods = TRUE;
+ }
+
+ /* Update commit time to ensure that svn:date revprops remain ordered if
+ requested. */
+ if (!client_date || strcmp(client_date->data, "1"))
+ {
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
+ svn_hash_sets(txnprops, SVN_PROP_REVISION_DATE, &date);
+ final_mods = TRUE;
+ }
+
+ if (final_mods)
+ {
+ SVN_ERR(set_txn_proplist(txn->fs, txn_id, txnprops, TRUE, pool));
+ *path = path_txn_props_final(txn->fs, txn_id, pool);
+ }
+ else
+ {
+ *path = path_txn_props(txn->fs, txn_id, pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__add_index_data(svn_fs_t *fs,
+ apr_file_t *file,
+ const char *l2p_proto_index,
+ const char *p2l_proto_index,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ apr_off_t l2p_offset;
+ apr_off_t p2l_offset;
+ svn_stringbuf_t *footer;
+ unsigned char footer_length;
+ svn_checksum_t *l2p_checksum;
+ svn_checksum_t *p2l_checksum;
+
+ /* Append the actual index data to the pack file. */
+ l2p_offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_END, &l2p_offset, pool));
+ SVN_ERR(svn_fs_fs__l2p_index_append(&l2p_checksum, fs, file,
+ l2p_proto_index, revision,
+ pool, pool));
+
+ p2l_offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_END, &p2l_offset, pool));
+ SVN_ERR(svn_fs_fs__p2l_index_append(&p2l_checksum, fs, file,
+ p2l_proto_index, revision,
+ pool, pool));
+
+ /* Append footer. */
+ footer = svn_fs_fs__unparse_footer(l2p_offset, l2p_checksum,
+ p2l_offset, p2l_checksum, pool, pool);
+ SVN_ERR(svn_io_file_write_full(file, footer->data, footer->len, NULL,
+ pool));
+
+ footer_length = footer->len;
+ SVN_ERR_ASSERT(footer_length == footer->len);
+ SVN_ERR(svn_io_file_write_full(file, &footer_length, 1, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton used for commit_body below. */
+struct commit_baton {
+ svn_revnum_t *new_rev_p;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ apr_array_header_t *reps_to_cache;
+ apr_hash_t *reps_hash;
+ apr_pool_t *reps_pool;
+};
+
+/* The work-horse for svn_fs_fs__commit, called with the FS write lock.
+ This implements the svn_fs_fs__with_write_lock() 'body' callback
+ type. BATON is a 'struct commit_baton *'. */
+static svn_error_t *
+commit_body(void *baton, apr_pool_t *pool)
+{
+ struct commit_baton *cb = baton;
+ fs_fs_data_t *ffd = cb->fs->fsap_data;
+ const char *old_rev_filename, *rev_filename, *proto_filename;
+ const char *revprop_filename, *final_revprop;
+ const svn_fs_id_t *root_id, *new_root_id;
+ apr_uint64_t start_node_id;
+ apr_uint64_t start_copy_id;
+ svn_revnum_t old_rev, new_rev;
+ apr_file_t *proto_file;
+ void *proto_file_lockcookie;
+ apr_off_t initial_offset, changed_path_offset;
+ const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__txn_get_id(cb->txn);
+ apr_hash_t *changed_paths;
+
+ /* Re-Read the current repository format. All our repo upgrade and
+ config evaluation strategies are such that existing information in
+ FS and FFD remains valid.
+
+ Although we don't recommend upgrading hot repositories, people may
+ still do it and we must make sure to either handle them gracefully
+ or to error out.
+
+ Committing pre-format 3 txns will fail after upgrade to format 3+
+ because the proto-rev cannot be found; no further action needed.
+ Upgrades from pre-f7 to f7+ means a potential change in addressing
+ mode for the final rev. We must be sure to detect that cause because
+ the failure would only manifest once the new revision got committed.
+ */
+ SVN_ERR(svn_fs_fs__read_format_file(cb->fs, pool));
+
+ /* Read the current youngest revision and, possibly, the next available
+ node id and copy id (for old format filesystems). Update the cached
+ value for the youngest revision, because we have just checked it. */
+ SVN_ERR(svn_fs_fs__read_current(&old_rev, &start_node_id, &start_copy_id,
+ cb->fs, pool));
+ ffd->youngest_rev_cache = old_rev;
+
+ /* Check to make sure this transaction is based off the most recent
+ revision. */
+ if (cb->txn->base_rev != old_rev)
+ return svn_error_create(SVN_ERR_FS_TXN_OUT_OF_DATE, NULL,
+ _("Transaction out of date"));
+
+ /* We need the changes list for verification as well as for writing it
+ to the final rev file. */
+ SVN_ERR(svn_fs_fs__txn_changes_fetch(&changed_paths, cb->fs, txn_id,
+ pool));
+
+ /* Locks may have been added (or stolen) between the calling of
+ previous svn_fs.h functions and svn_fs_commit_txn(), so we need
+ to re-examine every changed-path in the txn and re-verify all
+ discovered locks. */
+ SVN_ERR(verify_locks(cb->fs, txn_id, changed_paths, pool));
+
+ /* We are going to be one better than this puny old revision. */
+ new_rev = old_rev + 1;
+
+ /* Get a write handle on the proto revision file. */
+ SVN_ERR(get_writable_proto_rev(&proto_file, &proto_file_lockcookie,
+ cb->fs, txn_id, pool));
+ SVN_ERR(svn_fs_fs__get_file_offset(&initial_offset, proto_file, pool));
+
+ /* Write out all the node-revisions and directory contents. */
+ root_id = svn_fs_fs__id_txn_create_root(txn_id, pool);
+ SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
+ start_node_id, start_copy_id, initial_offset,
+ cb->reps_to_cache, cb->reps_hash, cb->reps_pool,
+ TRUE, pool));
+
+ /* Write the changed-path information. */
+ SVN_ERR(write_final_changed_path_info(&changed_path_offset, proto_file,
+ cb->fs, txn_id, changed_paths,
+ pool));
+
+ if (svn_fs_fs__use_log_addressing(cb->fs))
+ {
+ /* Append the index data to the rev file. */
+ SVN_ERR(svn_fs_fs__add_index_data(cb->fs, proto_file,
+ svn_fs_fs__path_l2p_proto_index(cb->fs, txn_id, pool),
+ svn_fs_fs__path_p2l_proto_index(cb->fs, txn_id, pool),
+ new_rev, pool));
+ }
+ else
+ {
+ /* Write the final line. */
+
+ svn_stringbuf_t *trailer
+ = svn_fs_fs__unparse_revision_trailer
+ ((apr_off_t)svn_fs_fs__id_item(new_root_id),
+ changed_path_offset,
+ pool);
+ SVN_ERR(svn_io_file_write_full(proto_file, trailer->data, trailer->len,
+ NULL, pool));
+ }
+
+ SVN_ERR(svn_io_file_flush_to_disk(proto_file, pool));
+ SVN_ERR(svn_io_file_close(proto_file, pool));
+
+ /* We don't unlock the prototype revision file immediately to avoid a
+ race with another caller writing to the prototype revision file
+ before we commit it. */
+
+ /* Create the shard for the rev and revprop file, if we're sharding and
+ this is the first revision of a new shard. We don't care if this
+ fails because the shard already existed for some reason. */
+ if (ffd->max_files_per_dir && new_rev % ffd->max_files_per_dir == 0)
+ {
+ /* Create the revs shard. */
+ {
+ const char *new_dir
+ = svn_fs_fs__path_rev_shard(cb->fs, new_rev, pool);
+ svn_error_t *err
+ = svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
+ PATH_REVS_DIR,
+ pool),
+ new_dir, pool));
+ }
+
+ /* Create the revprops shard. */
+ SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
+ {
+ const char *new_dir
+ = svn_fs_fs__path_revprops_shard(cb->fs, new_rev, pool);
+ svn_error_t *err
+ = svn_io_dir_make(new_dir, APR_OS_DEFAULT, pool);
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
+ PATH_REVPROPS_DIR,
+ pool),
+ new_dir, pool));
+ }
+ }
+
+ /* Move the finished rev file into place.
+
+ ### This "breaks" the transaction by removing the protorev file
+ ### but the revision is not yet complete. If this commit does
+ ### not complete for any reason the transaction will be lost. */
+ old_rev_filename = svn_fs_fs__path_rev_absolute(cb->fs, old_rev, pool);
+ rev_filename = svn_fs_fs__path_rev(cb->fs, new_rev, pool);
+ proto_filename = svn_fs_fs__path_txn_proto_rev(cb->fs, txn_id, pool);
+ SVN_ERR(svn_fs_fs__move_into_place(proto_filename, rev_filename,
+ old_rev_filename, pool));
+
+ /* Now that we've moved the prototype revision file out of the way,
+ we can unlock it (since further attempts to write to the file
+ will fail as it no longer exists). We must do this so that we can
+ remove the transaction directory later. */
+ SVN_ERR(unlock_proto_rev(cb->fs, txn_id, proto_file_lockcookie, pool));
+
+ /* Move the revprops file into place. */
+ SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
+ SVN_ERR(write_final_revprop(&revprop_filename, cb->txn, txn_id, pool));
+ final_revprop = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
+ SVN_ERR(svn_fs_fs__move_into_place(revprop_filename, final_revprop,
+ old_rev_filename, pool));
+
+ /* Update the 'current' file. */
+ SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
+ SVN_ERR(write_final_current(cb->fs, txn_id, new_rev, start_node_id,
+ start_copy_id, pool));
+
+ /* At this point the new revision is committed and globally visible
+ so let the caller know it succeeded by giving it the new revision
+ number, which fulfills svn_fs_commit_txn() contract. Any errors
+ after this point do not change the fact that a new revision was
+ created. */
+ *cb->new_rev_p = new_rev;
+
+ ffd->youngest_rev_cache = new_rev;
+
+ /* Remove this transaction directory. */
+ SVN_ERR(svn_fs_fs__purge_txn(cb->fs, cb->txn->id, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Add the representations in REPS_TO_CACHE (an array of representation_t *)
+ * to the rep-cache database of FS. */
+static svn_error_t *
+write_reps_to_cache(svn_fs_t *fs,
+ const apr_array_header_t *reps_to_cache,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ for (i = 0; i < reps_to_cache->nelts; i++)
+ {
+ representation_t *rep = APR_ARRAY_IDX(reps_to_cache, i, representation_t *);
+
+ SVN_ERR(svn_fs_fs__set_rep_reference(fs, rep, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__commit(svn_revnum_t *new_rev_p,
+ svn_fs_t *fs,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ struct commit_baton cb;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ cb.new_rev_p = new_rev_p;
+ cb.fs = fs;
+ cb.txn = txn;
+
+ if (ffd->rep_sharing_allowed)
+ {
+ cb.reps_to_cache = apr_array_make(pool, 5, sizeof(representation_t *));
+ cb.reps_hash = apr_hash_make(pool);
+ cb.reps_pool = pool;
+ }
+ else
+ {
+ cb.reps_to_cache = NULL;
+ cb.reps_hash = NULL;
+ cb.reps_pool = NULL;
+ }
+
+ SVN_ERR(svn_fs_fs__with_write_lock(fs, commit_body, &cb, pool));
+
+ /* At this point, *NEW_REV_P has been set, so errors below won't affect
+ the success of the commit. (See svn_fs_commit_txn().) */
+
+ if (ffd->rep_sharing_allowed)
+ {
+ svn_error_t *err;
+
+ SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
+
+ /* Write new entries to the rep-sharing database.
+ *
+ * We use an sqlite transaction to speed things up;
+ * see <http://www.sqlite.org/faq.html#q19>.
+ */
+ /* ### A commit that touches thousands of files will starve other
+ (reader/writer) commits for the duration of the below call.
+ Maybe write in batches? */
+ SVN_ERR(svn_sqlite__begin_transaction(ffd->rep_cache_db));
+ err = write_reps_to_cache(fs, cb.reps_to_cache, pool);
+ err = svn_sqlite__finish_transaction(ffd->rep_cache_db, err);
+
+ if (svn_error_find_cause(err, SVN_SQLITE__ERR_ROLLBACK_FAILED))
+ {
+ /* Failed rollback means that our db connection is unusable, and
+ the only thing we can do is close it. The connection will be
+ reopened during the next operation with rep-cache.db. */
+ return svn_error_trace(
+ svn_error_compose_create(err,
+ svn_fs_fs__close_rep_cache(fs)));
+ }
+ else if (err)
+ return svn_error_trace(err);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__list_transactions(apr_array_header_t **names_p,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ const char *txn_dir;
+ apr_hash_t *dirents;
+ apr_hash_index_t *hi;
+ apr_array_header_t *names;
+ apr_size_t ext_len = strlen(PATH_EXT_TXN);
+
+ names = apr_array_make(pool, 1, sizeof(const char *));
+
+ /* Get the transactions directory. */
+ txn_dir = svn_fs_fs__path_txns_dir(fs, pool);
+
+ /* Now find a listing of this directory. */
+ SVN_ERR(svn_io_get_dirents3(&dirents, txn_dir, TRUE, pool, pool));
+
+ /* Loop through all the entries and return anything that ends with '.txn'. */
+ for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
+ {
+ const char *name = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ const char *id;
+
+ /* The name must end with ".txn" to be considered a transaction. */
+ if ((apr_size_t) klen <= ext_len
+ || (strcmp(name + klen - ext_len, PATH_EXT_TXN)) != 0)
+ continue;
+
+ /* Truncate the ".txn" extension and store the ID. */
+ id = apr_pstrndup(pool, name, strlen(name) - ext_len);
+ APR_ARRAY_PUSH(names, const char *) = id;
+ }
+
+ *names_p = names;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__open_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ const char *name,
+ apr_pool_t *pool)
+{
+ svn_fs_txn_t *txn;
+ fs_txn_data_t *ftd;
+ svn_node_kind_t kind;
+ transaction_t *local_txn;
+ svn_fs_fs__id_part_t txn_id;
+
+ SVN_ERR(svn_fs_fs__id_txn_parse(&txn_id, name));
+
+ /* First check to see if the directory exists. */
+ SVN_ERR(svn_io_check_path(svn_fs_fs__path_txn_dir(fs, &txn_id, pool),
+ &kind, pool));
+
+ /* Did we find it? */
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_TRANSACTION, NULL,
+ _("No such transaction '%s'"),
+ name);
+
+ txn = apr_pcalloc(pool, sizeof(*txn));
+ ftd = apr_pcalloc(pool, sizeof(*ftd));
+ ftd->txn_id = txn_id;
+
+ /* Read in the root node of this transaction. */
+ txn->id = apr_pstrdup(pool, name);
+ txn->fs = fs;
+
+ SVN_ERR(svn_fs_fs__get_txn(&local_txn, fs, &txn_id, pool));
+
+ txn->base_rev = svn_fs_fs__id_rev(local_txn->base_id);
+
+ txn->vtable = &txn_vtable;
+ txn->fsap_data = ftd;
+ *txn_p = txn;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__txn_proplist(apr_hash_t **table_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ apr_hash_t *proplist = apr_hash_make(pool);
+ SVN_ERR(get_txn_proplist(proplist, txn->fs, svn_fs_fs__txn_get_id(txn),
+ pool));
+ *table_p = proplist;
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_fs__delete_node_revision(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool)
+{
+ node_revision_t *noderev;
+
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, id, pool, pool));
+
+ /* Delete any mutable property representation. */
+ if (noderev->prop_rep && is_txn_rep(noderev->prop_rep))
+ SVN_ERR(svn_io_remove_file2(svn_fs_fs__path_txn_node_props(fs, id, pool),
+ FALSE, pool));
+
+ /* Delete any mutable data representation. */
+ if (noderev->data_rep && is_txn_rep(noderev->data_rep)
+ && noderev->kind == svn_node_dir)
+ {
+ fs_fs_data_t *ffd = fs->fsap_data;
+ SVN_ERR(svn_io_remove_file2(svn_fs_fs__path_txn_node_children(fs, id,
+ pool),
+ FALSE, pool));
+
+ /* remove the corresponding entry from the cache, if such exists */
+ if (ffd->txn_dir_cache)
+ {
+ const char *key = svn_fs_fs__id_unparse(id, pool)->data;
+ SVN_ERR(svn_cache__set(ffd->txn_dir_cache, key, NULL, pool));
+ }
+ }
+
+ return svn_io_remove_file2(svn_fs_fs__path_txn_node_rev(fs, id, pool),
+ FALSE, pool);
+}
+
+
+
+/*** Transactions ***/
+
+svn_error_t *
+svn_fs_fs__get_txn_ids(const svn_fs_id_t **root_id_p,
+ const svn_fs_id_t **base_root_id_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ transaction_t *txn;
+ SVN_ERR(svn_fs_fs__get_txn(&txn, fs, txn_id, pool));
+ *root_id_p = txn->root_id;
+ *base_root_id_p = txn->base_id;
+ return SVN_NO_ERROR;
+}
+
+
+/* Generic transaction operations. */
+
+svn_error_t *
+svn_fs_fs__txn_prop(svn_string_t **value_p,
+ svn_fs_txn_t *txn,
+ const char *propname,
+ apr_pool_t *pool)
+{
+ apr_hash_t *table;
+ svn_fs_t *fs = txn->fs;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_fs__txn_proplist(&table, txn, pool));
+
+ *value_p = svn_hash_gets(table, propname);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__begin_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint32_t flags,
+ apr_pool_t *pool)
+{
+ svn_string_t date;
+ fs_txn_data_t *ftd;
+ apr_hash_t *props = apr_hash_make(pool);
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ SVN_ERR(svn_fs_fs__create_txn(txn_p, fs, rev, pool));
+
+ /* Put a datestamp on the newly created txn, so we always know
+ exactly how old it is. (This will help sysadmins identify
+ long-abandoned txns that may need to be manually removed.) When
+ a txn is promoted to a revision, this property will be
+ automatically overwritten with a revision datestamp. */
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
+
+ svn_hash_sets(props, SVN_PROP_REVISION_DATE, &date);
+
+ /* Set temporary txn props that represent the requested 'flags'
+ behaviors. */
+ if (flags & SVN_FS_TXN_CHECK_OOD)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_OOD,
+ svn_string_create("true", pool));
+
+ if (flags & SVN_FS_TXN_CHECK_LOCKS)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_LOCKS,
+ svn_string_create("true", pool));
+
+ if (flags & SVN_FS_TXN_CLIENT_DATE)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CLIENT_DATE,
+ svn_string_create("0", pool));
+
+ ftd = (*txn_p)->fsap_data;
+ return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, FALSE,
+ pool));
+}
diff --git a/subversion/libsvn_fs_fs/transaction.h b/subversion/libsvn_fs_fs/transaction.h
new file mode 100644
index 0000000..f96b04d
--- /dev/null
+++ b/subversion/libsvn_fs_fs/transaction.h
@@ -0,0 +1,294 @@
+/* transaction.h --- transaction-related functions of FSFS
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__TRANSACTION_H
+#define SVN_LIBSVN_FS__TRANSACTION_H
+
+#include "fs.h"
+
+/* Return the transaction ID of TXN.
+ */
+const svn_fs_fs__id_part_t *
+svn_fs_fs__txn_get_id(svn_fs_txn_t *txn);
+
+/* Store NODEREV as the node-revision for the node whose id is ID in
+ FS, after setting its is_fresh_txn_root to FRESH_TXN_ROOT. Do any
+ necessary temporary allocation in POOL. */
+svn_error_t *
+svn_fs_fs__put_node_revision(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ node_revision_t *noderev,
+ svn_boolean_t fresh_txn_root,
+ apr_pool_t *pool);
+
+/* Find the paths which were changed in transaction TXN_ID of
+ filesystem FS and store them in *CHANGED_PATHS_P.
+ Get any temporary allocations from POOL. */
+svn_error_t *
+svn_fs_fs__txn_changes_fetch(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Find the paths which were changed in revision REV of filesystem FS
+ and store them in *CHANGED_PATHS_P. Get any temporary allocations
+ from POOL. */
+svn_error_t *
+svn_fs_fs__paths_changed(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Create a new transaction in filesystem FS, based on revision REV,
+ and store it in *TXN_P. Allocate all necessary variables from
+ POOL. */
+svn_error_t *
+svn_fs_fs__create_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Set the transaction property NAME to the value VALUE in transaction
+ TXN. Perform temporary allocations from POOL. */
+svn_error_t *
+svn_fs_fs__change_txn_prop(svn_fs_txn_t *txn,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool);
+
+/* Change transaction properties in transaction TXN based on PROPS.
+ Perform temporary allocations from POOL. */
+svn_error_t *
+svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
+ const apr_array_header_t *props,
+ apr_pool_t *pool);
+
+/* Store a transaction record in *TXN_P for the transaction identified
+ by TXN_ID in filesystem FS. Allocate everything from POOL. */
+svn_error_t *
+svn_fs_fs__get_txn(transaction_t **txn_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the next available copy_id in *COPY_ID for the transaction
+ TXN_ID in filesystem FS. Allocate space in POOL. */
+svn_error_t *
+svn_fs_fs__reserve_copy_id(svn_fs_fs__id_part_t *copy_id_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Create an entirely new mutable node in the filesystem FS, whose
+ node-revision is NODEREV. Set *ID_P to the new node revision's ID.
+ Use POOL for any temporary allocation. COPY_ID is the copy_id to
+ use in the node revision ID. TXN_ID is the Subversion transaction
+ under which this occurs. */
+svn_error_t *
+svn_fs_fs__create_node(const svn_fs_id_t **id_p,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Remove all references to the transaction TXN_ID from filesystem FS.
+ Temporary allocations are from POOL. */
+svn_error_t *
+svn_fs_fs__purge_txn(svn_fs_t *fs,
+ const char *txn_id,
+ apr_pool_t *pool);
+
+/* Abort the existing transaction TXN, performing any temporary
+ allocations in POOL. */
+svn_error_t *
+svn_fs_fs__abort_txn(svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+/* Add or set in filesystem FS, transaction TXN_ID, in directory
+ PARENT_NODEREV a directory entry for NAME pointing to ID of type
+ KIND. Allocations are done in POOL. */
+svn_error_t *
+svn_fs_fs__set_entry(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ node_revision_t *parent_noderev,
+ const char *name,
+ const svn_fs_id_t *id,
+ svn_node_kind_t kind,
+ apr_pool_t *pool);
+
+/* Add a change to the changes record for filesystem FS in transaction
+ TXN_ID. Mark path PATH, having node-id ID, as changed according to
+ the type in CHANGE_KIND. If the text representation was changed set
+ TEXT_MOD to TRUE, and likewise for PROP_MOD as well as MERGEINFO_MOD.
+ If this change was the result of a copy, set COPYFROM_REV and
+ COPYFROM_PATH to the revision and path of the copy source, otherwise
+ they should be set to SVN_INVALID_REVNUM and NULL. Perform any
+ temporary allocations from POOL. */
+svn_error_t *
+svn_fs_fs__add_change(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ const char *path,
+ const svn_fs_id_t *id,
+ svn_fs_path_change_kind_t change_kind,
+ svn_boolean_t text_mod,
+ svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
+ svn_node_kind_t node_kind,
+ svn_revnum_t copyfrom_rev,
+ const char *copyfrom_path,
+ apr_pool_t *pool);
+
+/* Return a writable stream in *STREAM that allows storing the text
+ representation of node-revision NODEREV in filesystem FS.
+ Allocations are from POOL. */
+svn_error_t *
+svn_fs_fs__set_contents(svn_stream_t **stream,
+ svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool);
+
+/* Create a node revision in FS which is an immediate successor of
+ OLD_ID, whose contents are NEW_NR. Set *NEW_ID_P to the new node
+ revision's ID. Use POOL for any temporary allocation.
+
+ COPY_ID, if non-NULL, is a key into the `copies' table, and
+ indicates that this new node is being created as the result of a
+ copy operation, and specifically which operation that was. If
+ COPY_ID is NULL, then re-use the copy ID from the predecessor node.
+
+ TXN_ID is the Subversion transaction under which this occurs.
+
+ After this call, the deltification code assumes that the new node's
+ contents will change frequently, and will avoid representing other
+ nodes as deltas against this node's contents. */
+svn_error_t *
+svn_fs_fs__create_successor(const svn_fs_id_t **new_id_p,
+ svn_fs_t *fs,
+ const svn_fs_id_t *old_idp,
+ node_revision_t *new_noderev,
+ const svn_fs_fs__id_part_t *copy_id,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Write a new property list PROPLIST for node-revision NODEREV in
+ filesystem FS. Perform any temporary allocations in POOL. */
+svn_error_t *
+svn_fs_fs__set_proplist(svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_hash_t *proplist,
+ apr_pool_t *pool);
+
+/* Append the L2P and P2L indexes given by their proto index file names
+ * L2P_PROTO_INDEX and P2L_PROTO_INDEX to the revision / pack FILE.
+ * The latter contains revision(s) starting at REVISION in FS.
+ * Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__add_index_data(svn_fs_t *fs,
+ apr_file_t *file,
+ const char *l2p_proto_index,
+ const char *p2l_proto_index,
+ svn_revnum_t revision,
+ apr_pool_t *pool);
+
+/* Commit the transaction TXN in filesystem FS and return its new
+ revision number in *REV. If the transaction is out of date, return
+ the error SVN_ERR_FS_TXN_OUT_OF_DATE. Use POOL for temporary
+ allocations. */
+svn_error_t *
+svn_fs_fs__commit(svn_revnum_t *new_rev_p,
+ svn_fs_t *fs,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+/* Set *NAMES_P to an array of names which are all the active
+ transactions in filesystem FS. Allocate the array from POOL. */
+svn_error_t *
+svn_fs_fs__list_transactions(apr_array_header_t **names_p,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Open the transaction named NAME in filesystem FS. Set *TXN_P to
+ * the transaction. If there is no such transaction, return
+` * SVN_ERR_FS_NO_SUCH_TRANSACTION. Allocate the new transaction in
+ * POOL. */
+svn_error_t *
+svn_fs_fs__open_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ const char *name,
+ apr_pool_t *pool);
+
+/* Return the property list from transaction TXN and store it in
+ *PROPLIST. Allocate the property list from POOL. */
+svn_error_t *
+svn_fs_fs__txn_proplist(apr_hash_t **table_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+/* Delete the mutable node-revision referenced by ID, along with any
+ mutable props or directory contents associated with it. Perform
+ temporary allocations in POOL. */
+svn_error_t *
+svn_fs_fs__delete_node_revision(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool);
+
+/* Retrieve information about the Subversion transaction SVN_TXN from
+ the `transactions' table of FS, allocating from POOL. Set
+ *ROOT_ID_P to the ID of the transaction's root directory. Set
+ *BASE_ROOT_ID_P to the ID of the root directory of the
+ transaction's base revision.
+
+ If there is no such transaction, SVN_ERR_FS_NO_SUCH_TRANSACTION is
+ the error returned.
+
+ Returns SVN_ERR_FS_TRANSACTION_NOT_MUTABLE if TXN_NAME refers to a
+ transaction that has already been committed.
+
+ Allocate *ROOT_ID_P and *BASE_ROOT_ID_P in POOL. */
+svn_error_t *
+svn_fs_fs__get_txn_ids(const svn_fs_id_t **root_id_p,
+ const svn_fs_id_t **base_root_id_p,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_name,
+ apr_pool_t *pool);
+
+/* Find the value of the property named PROPNAME in transaction TXN.
+ Return the contents in *VALUE_P. The contents will be allocated
+ from POOL. */
+svn_error_t *
+svn_fs_fs__txn_prop(svn_string_t **value_p,
+ svn_fs_txn_t *txn,
+ const char *propname,
+ apr_pool_t *pool);
+
+/* Begin a new transaction in filesystem FS, based on existing
+ revision REV. The new transaction is returned in *TXN_P. Allocate
+ the new transaction structure from POOL. */
+svn_error_t *
+svn_fs_fs__begin_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint32_t flags,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/tree.c b/subversion/libsvn_fs_fs/tree.c
index acd1eb4..5893da2 100644
--- a/subversion/libsvn_fs_fs/tree.c
+++ b/subversion/libsvn_fs_fs/tree.c
@@ -49,15 +49,19 @@
#include "svn_mergeinfo.h"
#include "svn_fs.h"
#include "svn_props.h"
+#include "svn_sorts.h"
#include "fs.h"
-#include "key-gen.h"
+#include "cached_data.h"
#include "dag.h"
#include "lock.h"
#include "tree.h"
#include "fs_fs.h"
#include "id.h"
+#include "pack.h"
#include "temp_serializer.h"
+#include "transaction.h"
+#include "util.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_subr_private.h"
@@ -66,26 +70,6 @@
#include "../libsvn_fs/fs-loader.h"
-/* ### I believe this constant will become internal to reps-strings.c.
- ### see the comment in window_consumer() for more information. */
-
-/* ### the comment also seems to need tweaking: the log file stuff
- ### is no longer an issue... */
-/* Data written to the filesystem through the svn_fs_apply_textdelta()
- interface is cached in memory until the end of the data stream, or
- until a size trigger is hit. Define that trigger here (in bytes).
- Setting the value to 0 will result in no filesystem buffering at
- all. The value only really matters when dealing with file contents
- bigger than the value itself. Above that point, large values here
- allow the filesystem to buffer more data in memory before flushing
- to the database, which increases memory usage but greatly decreases
- the amount of disk access (and log-file generation) in database.
- Smaller values will limit your overall memory consumption, but can
- drastically hurt throughput by necessitating more write operations
- to the database (which also generates more log-files). */
-#define WRITE_BUFFER_SIZE 512000
-
-
/* The root structures.
@@ -100,23 +84,12 @@
kept in the FS object and shared among multiple revision root
objects.
*/
-typedef struct fs_rev_root_data_t
-{
- /* A dag node for the revision's root directory. */
- dag_node_t *root_dir;
-
- /* Cache structure for mapping const char * PATH to const char
- *COPYFROM_STRING, so that paths_changed can remember all the
- copyfrom information in the changes file.
- COPYFROM_STRING has the format "REV PATH", or is the empty string if
- the path was added without history. */
- apr_hash_t *copyfrom_cache;
-
-} fs_rev_root_data_t;
+typedef dag_node_t fs_rev_root_data_t;
typedef struct fs_txn_root_data_t
{
- const char *txn_id;
+ /* TXN_ID value from the main struct but as a struct instead of a string */
+ svn_fs_fs__id_part_t txn_id;
/* Cache of txn DAG nodes (without their nested noderevs, because
* it's mutable). Same keys/values as ffd->rev_node_cache. */
@@ -134,10 +107,18 @@ static svn_fs_root_t *make_revision_root(svn_fs_t *fs, svn_revnum_t rev,
apr_pool_t *pool);
static svn_error_t *make_txn_root(svn_fs_root_t **root_p,
- svn_fs_t *fs, const char *txn,
- svn_revnum_t base_rev, apr_uint32_t flags,
+ svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn,
+ svn_revnum_t base_rev,
+ apr_uint32_t flags,
apr_pool_t *pool);
+static svn_error_t *fs_closest_copy(svn_fs_root_t **root_p,
+ const char **path_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool);
+
/*** Node Caching ***/
@@ -196,6 +177,13 @@ struct fs_fs_dag_cache_t
/* Property lookups etc. have a very high locality (75% re-hit).
Thus, remember the last hit location for optimistic lookup. */
apr_size_t last_hit;
+
+ /* Position of the last bucket hit that actually had a DAG node in it.
+ LAST_HIT may refer to a bucket that matches path@rev but has not
+ its NODE element set, yet.
+ This value is a mere hint for optimistic lookup and any value is
+ valid (as long as it is < BUCKET_COUNT). */
+ apr_size_t last_non_empty;
};
fs_fs_dag_cache_t*
@@ -245,11 +233,36 @@ cache_lookup( fs_fs_dag_cache_t *cache
&& (result->path_len == path_len)
&& !memcmp(result->path, path, path_len))
{
+ /* Remember the position of the last node we found in this cache. */
+ if (result->node)
+ cache->last_non_empty = cache->last_hit;
+
return result;
}
/* need to do a full lookup. Calculate the hash value
- (HASH_VALUE has been initialized to REVISION). */
+ (HASH_VALUE has been initialized to REVISION).
+
+ Note that the actual hash function is arbitrary as long as its result
+ in HASH_VALUE only depends on REVISION and *PATH. However, we try to
+ make as much of *PATH influence the result as possible to get an "even"
+ spread across the hash buckets (maximizes our cache retention rate and
+ thus the hit rates).
+
+ When chunked access is possible (independent of the PATH pointer's
+ value!), we read 4 bytes at once and multiply the hash value with a
+ FACTOR that mirror / pattern / shift all 4 input bytes to various bits
+ of the result. The final result will be taken from the MSBs.
+
+ When chunked access is not possible (not supported by CPU or odd bytes
+ at the end of *PATH), we use the simple traditional "* 33" hash
+ function that works very well with texts / paths and that e.g. APR uses.
+
+ Please note that the bytewise and the chunked calculation are *NOT*
+ interchangeable as they will yield different results for the same input.
+ For any given machine and *PATH, we must use a fixed combination of the
+ two functions.
+ */
i = 0;
#if SVN_UNALIGNED_ACCESS_IS_OK
/* We relax the dependency chain between iterations by processing
@@ -295,14 +308,44 @@ cache_lookup( fs_fs_dag_cache_t *cache
cache->insertions++;
}
+ else if (result->node)
+ {
+ /* This bucket is valid & has a suitable DAG node in it.
+ Remember its location. */
+ cache->last_non_empty = bucket_index;
+ }
return result;
}
+/* Optimistic lookup using the last seen non-empty location in CACHE.
+ Return the node of that entry, if it is still in use and matches PATH.
+ Return NULL otherwise. Since the caller usually already knows the path
+ length, provide it in PATH_LEN. */
+static dag_node_t *
+cache_lookup_last_path(fs_fs_dag_cache_t *cache,
+ const char *path,
+ apr_size_t path_len)
+{
+ cache_entry_t *result = &cache->buckets[cache->last_non_empty];
+ assert(strlen(path) == path_len);
+
+ if ( result->node
+ && (result->path_len == path_len)
+ && !memcmp(result->path, path, path_len))
+ {
+ return result->node;
+ }
+
+ return NULL;
+}
+
/* 2nd level cache */
/* Find and return the DAG node cache for ROOT and the key that
- should be used for PATH. */
+ should be used for PATH.
+
+ Pool will only be used for allocating a new keys if necessary */
static void
locate_cache(svn_cache__t **cache,
const char **key,
@@ -313,20 +356,25 @@ locate_cache(svn_cache__t **cache,
if (root->is_txn_root)
{
fs_txn_root_data_t *frd = root->fsap_data;
- if (cache) *cache = frd->txn_node_cache;
- if (key && path) *key = path;
+
+ if (cache)
+ *cache = frd->txn_node_cache;
+ if (key && path)
+ *key = path;
}
else
{
fs_fs_data_t *ffd = root->fs->fsap_data;
- if (cache) *cache = ffd->rev_node_cache;
- if (key && path) *key
- = svn_fs_fs__combine_number_and_string(root->rev, path, pool);
+
+ if (cache)
+ *cache = ffd->rev_node_cache;
+ if (key && path)
+ *key = svn_fs_fs__combine_number_and_string(root->rev, path, pool);
}
}
-/* Return NODE_P for PATH from ROOT's node cache, or NULL if the node
- isn't cached; read it from the FS. *NODE_P is allocated in POOL. */
+/* In *NODE_P, return the DAG node for PATH from ROOT's node cache, or NULL
+ if the node isn't cached. *NODE_P is allocated in POOL. */
static svn_error_t *
dag_node_cache_get(dag_node_t **node_p,
svn_fs_root_t *root,
@@ -356,7 +404,7 @@ dag_node_cache_get(dag_node_t **node_p,
if (found && node)
{
/* Patch up the FS, since this might have come from an old FS
- * object. */
+ * object. */
svn_fs_fs__dag_set_fs(node, root->fs);
/* Retain the DAG node in L1 cache. */
@@ -380,7 +428,7 @@ dag_node_cache_get(dag_node_t **node_p,
if (found && node)
{
/* Patch up the FS, since this might have come from an old FS
- * object. */
+ * object. */
svn_fs_fs__dag_set_fs(node, root->fs);
}
}
@@ -403,27 +451,23 @@ dag_node_cache_set(svn_fs_root_t *root,
SVN_ERR_ASSERT(*path == '/');
- /* Do *not* attempt to dup and put the node into L1.
- * dup() is twice as expensive as an L2 lookup (which will set also L1).
- */
locate_cache(&cache, &key, root, path, pool);
-
return svn_cache__set(cache, key, node, pool);
}
-/* Baton for find_descendents_in_cache. */
+/* Baton for find_descendants_in_cache. */
struct fdic_baton {
const char *path;
apr_array_header_t *list;
apr_pool_t *pool;
};
-/* If the given item is a descendent of BATON->PATH, push
+/* If the given item is a descendant of BATON->PATH, push
* it onto BATON->LIST (copying into BATON->POOL). Implements
* the svn_iter_apr_hash_cb_t prototype. */
static svn_error_t *
-find_descendents_in_cache(void *baton,
+find_descendants_in_cache(void *baton,
const void *key,
apr_ssize_t klen,
void *val,
@@ -458,16 +502,16 @@ dag_node_cache_invalidate(svn_fs_root_t *root,
locate_cache(&cache, NULL, root, NULL, b.pool);
- SVN_ERR(svn_cache__iter(NULL, cache, find_descendents_in_cache,
+ SVN_ERR(svn_cache__iter(NULL, cache, find_descendants_in_cache,
&b, b.pool));
iterpool = svn_pool_create(b.pool);
for (i = 0; i < b.list->nelts; i++)
{
- const char *descendent = APR_ARRAY_IDX(b.list, i, const char *);
+ const char *descendant = APR_ARRAY_IDX(b.list, i, const char *);
svn_pool_clear(iterpool);
- SVN_ERR(svn_cache__set(cache, descendent, NULL, iterpool));
+ SVN_ERR(svn_cache__set(cache, descendant, NULL, iterpool));
}
svn_pool_destroy(iterpool);
@@ -498,7 +542,8 @@ svn_fs_fs__txn_root(svn_fs_root_t **root_p,
flags |= SVN_FS_TXN_CHECK_LOCKS;
}
- return make_txn_root(root_p, txn->fs, txn->id, txn->base_rev, flags, pool);
+ return make_txn_root(root_p, txn->fs, svn_fs_fs__txn_get_id(txn),
+ txn->base_rev, flags, pool);
}
@@ -523,6 +568,15 @@ svn_fs_fs__revision_root(svn_fs_root_t **root_p,
/* Getting dag nodes for roots. */
+/* Return the transaction ID to a given transaction ROOT. */
+static const svn_fs_fs__id_part_t *
+root_txn_id(svn_fs_root_t *root)
+{
+ fs_txn_root_data_t *frd = root->fsap_data;
+ assert(root->is_txn_root);
+
+ return &frd->txn_id;
+}
/* Set *NODE_P to a freshly opened dag node referring to the root
directory of ROOT, allocating from POOL. */
@@ -534,14 +588,15 @@ root_node(dag_node_t **node_p,
if (root->is_txn_root)
{
/* It's a transaction root. Open a fresh copy. */
- return svn_fs_fs__dag_txn_root(node_p, root->fs, root->txn, pool);
+ return svn_fs_fs__dag_txn_root(node_p, root->fs, root_txn_id(root),
+ pool);
}
else
{
/* It's a revision root, so we already have its root directory
opened. */
- fs_rev_root_data_t *frd = root->fsap_data;
- *node_p = svn_fs_fs__dag_dup(frd->root_dir, pool);
+ dag_node_t *root_dir = root->fsap_data;
+ *node_p = svn_fs_fs__dag_dup(root_dir, pool);
return SVN_NO_ERROR;
}
}
@@ -557,7 +612,11 @@ mutable_root_node(dag_node_t **node_p,
apr_pool_t *pool)
{
if (root->is_txn_root)
- return svn_fs_fs__dag_clone_root(node_p, root->fs, root->txn, pool);
+ {
+ /* It's a transaction root. Open a fresh copy. */
+ return svn_fs_fs__dag_clone_root(node_p, root->fs, root_txn_id(root),
+ pool);
+ }
else
/* If it's not a transaction root, we can't change its contents. */
return SVN_FS__ERR_NOT_MUTABLE(root->fs, root->rev, error_path);
@@ -645,25 +704,23 @@ parent_path_relpath(parent_path_t *child,
the inheritance method is copy_id_inherit_new, also return a
*COPY_SRC_PATH on which to base the new copy ID (else return NULL
for that path). CHILD must have a parent (it cannot be the root
- node). TXN_ID is the transaction in which these items might be
- mutable. Allocations are taken from POOL. */
+ node). Allocations are taken from POOL. */
static svn_error_t *
get_copy_inheritance(copy_id_inherit_t *inherit_p,
const char **copy_src_path,
svn_fs_t *fs,
parent_path_t *child,
- const char *txn_id,
apr_pool_t *pool)
{
const svn_fs_id_t *child_id, *parent_id, *copyroot_id;
- const char *child_copy_id, *parent_copy_id;
+ const svn_fs_fs__id_part_t *child_copy_id, *parent_copy_id;
const char *id_path = NULL;
svn_fs_root_t *copyroot_root;
dag_node_t *copyroot_node;
svn_revnum_t copyroot_rev;
const char *copyroot_path;
- SVN_ERR_ASSERT(child && child->parent && txn_id);
+ SVN_ERR_ASSERT(child && child->parent);
/* Initialize some convenience variables. */
child_id = svn_fs_fs__dag_get_id(child->node);
@@ -672,7 +729,7 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
parent_copy_id = svn_fs_fs__id_copy_id(parent_id);
/* If this child is already mutable, we have nothing to do. */
- if (svn_fs_fs__id_txn_id(child_id))
+ if (svn_fs_fs__id_is_txn(child_id))
{
*inherit_p = copy_id_inherit_self;
*copy_src_path = NULL;
@@ -686,14 +743,14 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
/* Special case: if the child's copy ID is '0', use the parent's
copy ID. */
- if (strcmp(child_copy_id, "0") == 0)
+ if (svn_fs_fs__id_part_is_root(child_copy_id))
return SVN_NO_ERROR;
/* Compare the copy IDs of the child and its parent. If they are
the same, then the child is already on the same branch as the
parent, and should use the same mutability copy ID that the
parent will use. */
- if (svn_fs_fs__key_compare(child_copy_id, parent_copy_id) == 0)
+ if (svn_fs_fs__id_part_eq(child_copy_id, parent_copy_id))
return SVN_NO_ERROR;
/* If the child is on the same branch that the parent is on, the
@@ -709,7 +766,7 @@ get_copy_inheritance(copy_id_inherit_t *inherit_p,
SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
- if (svn_fs_fs__id_compare(copyroot_id, child_id) == -1)
+ if (svn_fs_fs__id_compare(copyroot_id, child_id) == svn_fs_node_unrelated)
return SVN_NO_ERROR;
/* Determine if we are looking at the child via its original path or
@@ -763,9 +820,63 @@ typedef enum open_path_flags_t {
/* The caller does not care about the parent node chain but only
the final DAG node. */
- open_path_node_only = 4
+ open_path_node_only = 4,
+
+ /* The caller wants a NULL path object instead of an error if the
+ path cannot be found. */
+ open_path_allow_null = 8
} open_path_flags_t;
+/* Try a short-cut for the open_path() function using the last node accessed.
+ * If that ROOT is that nodes's "created rev" and PATH of PATH_LEN chars is
+ * its "created path", return the node in *NODE_P. Set it to NULL otherwise.
+ *
+ * This function is used to support ra_serf-style access patterns where we
+ * are first asked for path@rev and then for path@c_rev of the same node.
+ * The shortcut works by ignoring the "rev" part of the cache key and then
+ * checking whether we got lucky. Lookup and verification are both quick
+ * plus there are many early outs for common types of mismatch.
+ */
+static svn_error_t *
+try_match_last_node(dag_node_t **node_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_size_t path_len,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = root->fs->fsap_data;
+
+ /* Optimistic lookup: if the last node returned from the cache applied to
+ the same PATH, return it in NODE. */
+ dag_node_t *node
+ = cache_lookup_last_path(ffd->dag_node_cache, path, path_len);
+
+ /* Did we get a bucket with a committed node? */
+ if (node && !svn_fs_fs__dag_check_mutable(node))
+ {
+ /* Get the path&rev pair at which this node was created.
+ This is repository location for which this node is _known_ to be
+ the right lookup result irrespective of how we found it. */
+ const char *created_path
+ = svn_fs_fs__dag_get_created_path(node);
+ svn_revnum_t revision;
+ SVN_ERR(svn_fs_fs__dag_get_revision(&revision, node, scratch_pool));
+
+ /* Is it an exact match? */
+ if (revision == root->rev && strcmp(created_path, path) == 0)
+ {
+ /* Cache it under its full path@rev access path. */
+ SVN_ERR(dag_node_cache_set(root, path, node, scratch_pool));
+
+ *node_p = node;
+ return SVN_NO_ERROR;
+ }
+ }
+
+ *node_p = NULL;
+ return SVN_NO_ERROR;
+}
+
/* Open the node identified by PATH in ROOT, allocating in POOL. Set
*PARENT_PATH_P to a path from the node up to ROOT. The resulting
@@ -773,10 +884,9 @@ typedef enum open_path_flags_t {
*element, for the root directory. PATH must be in canonical form.
If resulting *PARENT_PATH_P will eventually be made mutable and
- modified, or if copy ID inheritance information is otherwise
- needed, TXN_ID should be the ID of the mutability transaction. If
- TXN_ID is NULL, no copy ID inheritance information will be
- calculated for the *PARENT_PATH_P chain.
+ modified, or if copy ID inheritance information is otherwise needed,
+ IS_TXN_PATH must be set. If IS_TXN_PATH is FALSE, no copy ID
+ inheritance information will be calculated for the *PARENT_PATH_P chain.
If FLAGS & open_path_last_optional is zero, return the error
SVN_ERR_FS_NOT_FOUND if the node PATH refers to does not exist. If
@@ -800,38 +910,80 @@ open_path(parent_path_t **parent_path_p,
svn_fs_root_t *root,
const char *path,
int flags,
- const char *txn_id,
+ svn_boolean_t is_txn_path,
apr_pool_t *pool)
{
svn_fs_t *fs = root->fs;
dag_node_t *here = NULL; /* The directory we're currently looking at. */
parent_path_t *parent_path; /* The path from HERE up to the root. */
- const char *rest; /* The portion of PATH we haven't traversed yet. */
-
- /* ensure a canonical path representation */
- const char *path_so_far = "/";
+ const char *rest = NULL; /* The portion of PATH we haven't traversed yet. */
apr_pool_t *iterpool = svn_pool_create(pool);
- /* callers often traverse the tree in some path-based order. That means
- a sibling of PATH has been presently accessed. Try to start the lookup
- directly at the parent node, if the caller did not requested the full
- parent chain. */
- const char *directory;
+ /* path to the currently processed entry without trailing '/'.
+ We will reuse this across iterations by simply putting a NUL terminator
+ at the respective position and replacing that with a '/' in the next
+ iteration. This is correct as we assert() PATH to be canonical. */
+ svn_stringbuf_t *path_so_far = svn_stringbuf_create(path, pool);
+ apr_size_t path_len = path_so_far->len;
+
+ /* Callers often traverse the DAG in some path-based order or along the
+ history segments. That allows us to try a few guesses about where to
+ find the next item. This is only useful if the caller didn't request
+ the full parent chain. */
assert(svn_fs__is_canonical_abspath(path));
+ path_so_far->len = 0; /* "" */
if (flags & open_path_node_only)
{
+ const char *directory;
+
+ /* First attempt: Assume that we access the DAG for the same path as
+ in the last lookup but for a different revision that happens to be
+ the last revision that touched the respective node. This is a
+ common pattern when e.g. checking out over ra_serf. Note that this
+ will only work for committed data as the revision info for nodes in
+ txns is bogus.
+
+ This shortcut is quick and will exit this function upon success.
+ So, try it first. */
+ if (!root->is_txn_root)
+ {
+ dag_node_t *node;
+ SVN_ERR(try_match_last_node(&node, root, path, path_len, iterpool));
+
+ /* Did the shortcut work? */
+ if (node)
+ {
+ /* Construct and return the result. */
+ svn_pool_destroy(iterpool);
+
+ parent_path = make_parent_path(node, 0, 0, pool);
+ parent_path->copy_inherit = copy_id_inherit_self;
+ *parent_path_p = parent_path;
+
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Second attempt: Try starting the lookup immediately at the parent
+ node. We will often have recently accessed either a sibling or
+ said parent DIRECTORY itself for the same revision. */
directory = svn_dirent_dirname(path, pool);
if (directory[1] != 0) /* root nodes are covered anyway */
- SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
+ {
+ SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
+
+ /* Did the shortcut work? */
+ if (here)
+ {
+ apr_size_t dirname_len = strlen(directory);
+ path_so_far->len = dirname_len;
+ rest = path + dirname_len + 1;
+ }
+ }
}
/* did the shortcut work? */
- if (here)
- {
- path_so_far = directory;
- rest = path + strlen(directory) + 1;
- }
- else
+ if (!here)
{
/* Make a parent_path item for the root node, using its own current
copy id. */
@@ -839,6 +991,7 @@ open_path(parent_path_t **parent_path_p,
rest = path + 1; /* skip the leading '/', it saves in iteration */
}
+ path_so_far->data[path_so_far->len] = '\0';
parent_path = make_parent_path(here, 0, 0, pool);
parent_path->copy_inherit = copy_id_inherit_self;
@@ -858,8 +1011,10 @@ open_path(parent_path_t **parent_path_p,
/* Parse out the next entry from the path. */
entry = svn_fs__next_entry_name(&next, rest, pool);
- /* Calculate the path traversed thus far. */
- path_so_far = svn_fspath__join(path_so_far, entry, pool);
+ /* Update the path traversed thus far. */
+ path_so_far->data[path_so_far->len] = '/';
+ path_so_far->len += strlen(entry) + 1;
+ path_so_far->data[path_so_far->len] = '\0';
if (*entry == '\0')
{
@@ -873,7 +1028,6 @@ open_path(parent_path_t **parent_path_p,
{
copy_id_inherit_t inherit;
const char *copy_path = NULL;
- svn_error_t *err = SVN_NO_ERROR;
dag_node_t *cached_node = NULL;
/* If we found a directory entry, follow it. First, we
@@ -882,22 +1036,20 @@ open_path(parent_path_t **parent_path_p,
element if we already know the lookup to fail for the
complete path. */
if (next || !(flags & open_path_uncached))
- SVN_ERR(dag_node_cache_get(&cached_node, root, path_so_far, pool));
-
+ SVN_ERR(dag_node_cache_get(&cached_node, root, path_so_far->data,
+ pool));
if (cached_node)
child = cached_node;
else
- err = svn_fs_fs__dag_open(&child, here, entry, pool, iterpool);
+ SVN_ERR(svn_fs_fs__dag_open(&child, here, entry, pool, iterpool));
/* "file not found" requires special handling. */
- if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ if (child == NULL)
{
/* If this was the last path component, and the caller
said it was optional, then don't return an error;
just put a NULL node pointer in the path. */
- svn_error_clear(err);
-
if ((flags & open_path_last_optional)
&& (! next || *next == '\0'))
{
@@ -905,6 +1057,11 @@ open_path(parent_path_t **parent_path_p,
pool);
break;
}
+ else if (flags & open_path_allow_null)
+ {
+ parent_path = NULL;
+ break;
+ }
else
{
/* Build a better error message than svn_fs_fs__dag_open
@@ -913,22 +1070,19 @@ open_path(parent_path_t **parent_path_p,
}
}
- /* Other errors we return normally. */
- SVN_ERR(err);
-
if (flags & open_path_node_only)
{
- /* Shortcut: the caller only wan'ts the final DAG node. */
+ /* Shortcut: the caller only wants the final DAG node. */
parent_path->node = child;
}
else
{
/* Now, make a parent_path item for CHILD. */
parent_path = make_parent_path(child, entry, parent_path, pool);
- if (txn_id)
+ if (is_txn_path)
{
SVN_ERR(get_copy_inheritance(&inherit, &copy_path, fs,
- parent_path, txn_id, iterpool));
+ parent_path, iterpool));
parent_path->copy_inherit = inherit;
parent_path->copy_src_path = apr_pstrdup(pool, copy_path);
}
@@ -936,7 +1090,8 @@ open_path(parent_path_t **parent_path_p,
/* Cache the node we found (if it wasn't already cached). */
if (! cached_node)
- SVN_ERR(dag_node_cache_set(root, path_so_far, child, iterpool));
+ SVN_ERR(dag_node_cache_set(root, path_so_far->data, child,
+ iterpool));
}
/* Are we finished traversing the path? */
@@ -945,7 +1100,7 @@ open_path(parent_path_t **parent_path_p,
/* The path isn't finished yet; we'd better be in a directory. */
if (svn_fs_fs__dag_node_kind(child) != svn_node_dir)
- SVN_ERR_W(SVN_FS__ERR_NOT_DIRECTORY(fs, path_so_far),
+ SVN_ERR_W(SVN_FS__ERR_NOT_DIRECTORY(fs, path_so_far->data),
apr_psprintf(iterpool, _("Failure opening '%s'"), path));
rest = next;
@@ -970,7 +1125,7 @@ make_path_mutable(svn_fs_root_t *root,
apr_pool_t *pool)
{
dag_node_t *clone;
- const char *txn_id = root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
/* Is the node mutable already? */
if (svn_fs_fs__dag_check_mutable(parent_path->node))
@@ -980,7 +1135,8 @@ make_path_mutable(svn_fs_root_t *root,
if (parent_path->parent)
{
const svn_fs_id_t *parent_id, *child_id, *copyroot_id;
- const char *copy_id = NULL;
+ svn_fs_fs__id_part_t copy_id = { SVN_INVALID_REVNUM, 0 };
+ svn_fs_fs__id_part_t *copy_id_ptr = &copy_id;
copy_id_inherit_t inherit = parent_path->copy_inherit;
const char *clone_path, *copyroot_path;
svn_revnum_t copyroot_rev;
@@ -997,7 +1153,7 @@ make_path_mutable(svn_fs_root_t *root,
{
case copy_id_inherit_parent:
parent_id = svn_fs_fs__dag_get_id(parent_path->parent->node);
- copy_id = svn_fs_fs__id_copy_id(parent_id);
+ copy_id = *svn_fs_fs__id_copy_id(parent_id);
break;
case copy_id_inherit_new:
@@ -1006,7 +1162,7 @@ make_path_mutable(svn_fs_root_t *root,
break;
case copy_id_inherit_self:
- copy_id = NULL;
+ copy_id_ptr = NULL;
break;
case copy_id_inherit_unknown:
@@ -1024,8 +1180,8 @@ make_path_mutable(svn_fs_root_t *root,
child_id = svn_fs_fs__dag_get_id(parent_path->node);
copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
- if (strcmp(svn_fs_fs__id_node_id(child_id),
- svn_fs_fs__id_node_id(copyroot_id)) != 0)
+ if (!svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(child_id),
+ svn_fs_fs__id_node_id(copyroot_id)))
is_parent_copyroot = TRUE;
/* Now make this node mutable. */
@@ -1034,7 +1190,7 @@ make_path_mutable(svn_fs_root_t *root,
parent_path->parent->node,
clone_path,
parent_path->entry,
- copy_id, txn_id,
+ copy_id_ptr, txn_id,
is_parent_copyroot,
pool));
@@ -1074,14 +1230,13 @@ get_dag(dag_node_t **dag_node_p,
if (! node)
{
- /* Canonicalize the input PATH. */
- if (! svn_fs__is_canonical_abspath(path))
- {
- path = svn_fs__canonicalize_abspath(path, pool);
-
- /* Try again with the corrected path. */
- SVN_ERR(dag_node_cache_get(&node, root, path, pool));
- }
+ /* Canonicalize the input PATH. As it turns out, >95% of all paths
+ * seen here during e.g. svnadmin verify are non-canonical, i.e.
+ * miss the leading '/'. Unconditional canonicalization has a net
+ * performance benefit over previously checking path for being
+ * canonical. */
+ path = svn_fs__canonicalize_abspath(path, pool);
+ SVN_ERR(dag_node_cache_get(&node, root, path, pool));
if (! node)
{
@@ -1089,7 +1244,7 @@ get_dag(dag_node_t **dag_node_p,
* error if the node for which we are searching doesn't exist. */
SVN_ERR(open_path(&parent_path, root, path,
open_path_uncached | open_path_node_only,
- NULL, pool));
+ FALSE, pool));
node = parent_path->node;
/* No need to cache our find -- open_path() will do that for us. */
@@ -1107,19 +1262,20 @@ get_dag(dag_node_t **dag_node_p,
/* Add a change to the changes table in FS, keyed on transaction id
TXN_ID, and indicated that a change of kind CHANGE_KIND occurred on
PATH (whose node revision id is--or was, in the case of a
- deletion--NODEREV_ID), and optionally that TEXT_MODs or PROP_MODs
- occurred. If the change resulted from a copy, COPYFROM_REV and
- COPYFROM_PATH specify under which revision and path the node was
- copied from. If this was not part of a copy, COPYFROM_REV should
- be SVN_INVALID_REVNUM. Do all this as part of POOL. */
+ deletion--NODEREV_ID), and optionally that TEXT_MODs, PROP_MODs or
+ MERGEINFO_MODs occurred. If the change resulted from a copy,
+ COPYFROM_REV and COPYFROM_PATH specify under which revision and path
+ the node was copied from. If this was not part of a copy, COPYFROM_REV
+ should be SVN_INVALID_REVNUM. Do all this as part of POOL. */
static svn_error_t *
add_change(svn_fs_t *fs,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
const char *path,
const svn_fs_id_t *noderev_id,
svn_fs_path_change_kind_t change_kind,
svn_boolean_t text_mod,
svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
svn_node_kind_t node_kind,
svn_revnum_t copyfrom_rev,
const char *copyfrom_path,
@@ -1127,7 +1283,8 @@ add_change(svn_fs_t *fs,
{
return svn_fs_fs__add_change(fs, txn_id,
svn_fs__canonicalize_abspath(path, pool),
- noderev_id, change_kind, text_mod, prop_mod,
+ noderev_id, change_kind,
+ text_mod, prop_mod, mergeinfo_mod,
node_kind, copyfrom_rev, copyfrom_path,
pool);
}
@@ -1151,8 +1308,8 @@ svn_fs_fs__node_id(const svn_fs_id_t **id_p,
The root directory ("" or "/") node is stored in the
svn_fs_root_t object, and never changes when it's a revision
root, so we can just reach in and grab it directly. */
- fs_rev_root_data_t *frd = root->fsap_data;
- *id_p = svn_fs_fs__id_copy(svn_fs_fs__dag_get_id(frd->root_dir), pool);
+ dag_node_t *root_dir = root->fsap_data;
+ *id_p = svn_fs_fs__id_copy(svn_fs_fs__dag_get_id(root_dir), pool);
}
else
{
@@ -1164,6 +1321,82 @@ svn_fs_fs__node_id(const svn_fs_id_t **id_p,
return SVN_NO_ERROR;
}
+static svn_error_t *
+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 *pool)
+{
+ dag_node_t *node;
+ const svn_fs_id_t *id_a, *id_b;
+ svn_fs_fs__id_part_t node_id_a, node_id_b;
+
+ /* Root paths are a common special case. */
+ svn_boolean_t a_is_root_dir
+ = (path_a[0] == '\0') || ((path_a[0] == '/') && (path_a[1] == '\0'));
+ svn_boolean_t b_is_root_dir
+ = (path_b[0] == '\0') || ((path_b[0] == '/') && (path_b[1] == '\0'));
+
+ /* Another useful thing to know: Both are txns but not the same txn. */
+ svn_boolean_t different_txn
+ = root_a->is_txn_root && root_b->is_txn_root
+ && strcmp(root_a->txn, root_b->txn);
+
+ /* Path from different repository are always unrelated. */
+ if (root_a->fs != root_b->fs)
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ /* Are both (!) root paths? Then, they are related and we only test how
+ * direct the relation is. */
+ if (a_is_root_dir && b_is_root_dir)
+ {
+ /* For txn roots, root->REV is the base revision of that TXN. */
+ *relation = ( (root_a->rev == root_b->rev)
+ && (root_a->is_txn_root == root_b->is_txn_root)
+ && !different_txn)
+ ? svn_fs_node_unchanged
+ : svn_fs_node_common_ancestor;
+ return SVN_NO_ERROR;
+ }
+
+ /* We checked for all separations between ID spaces (repos, txn).
+ * Now, we can simply test for the ID values themselves. */
+ SVN_ERR(get_dag(&node, root_a, path_a, pool));
+ id_a = svn_fs_fs__dag_get_id(node);
+ node_id_a = *svn_fs_fs__id_node_id(id_a);
+
+ SVN_ERR(get_dag(&node, root_b, path_b, pool));
+ id_b = svn_fs_fs__dag_get_id(node);
+ node_id_b = *svn_fs_fs__id_node_id(id_b);
+
+ /* Noderevs from different nodes are unrelated. */
+ if (!svn_fs_fs__id_part_eq(&node_id_a, &node_id_b))
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ /* Noderevs have the same node-ID now. So, they *seem* to be related.
+ *
+ * Special case: Different txns may create the same (txn-local) node ID.
+ * Only when they are committed can they actually be related to others. */
+ if (different_txn && node_id_a.revision == SVN_INVALID_REVNUM)
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ /* The noderevs are actually related. Are they the same? */
+ if (svn_fs_fs__id_eq(id_a, id_b))
+ *relation = svn_fs_node_unchanged;
+ else
+ *relation = svn_fs_node_common_ancestor;
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
svn_fs_fs__node_created_rev(svn_revnum_t *revision,
@@ -1282,6 +1515,19 @@ fs_node_proplist(apr_hash_t **table_p,
return SVN_NO_ERROR;
}
+static svn_error_t *
+fs_node_has_props(svn_boolean_t *has_props,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node;
+
+ SVN_ERR(get_dag(&node, root, path, scratch_pool));
+
+ return svn_error_trace(svn_fs_fs__dag_has_props(has_props, node,
+ scratch_pool));
+}
static svn_error_t *
increment_mergeinfo_up_tree(parent_path_t *pp,
@@ -1310,14 +1556,15 @@ fs_change_node_prop(svn_fs_root_t *root,
{
parent_path_t *parent_path;
apr_hash_t *proplist;
- const char *txn_id;
+ const svn_fs_fs__id_part_t *txn_id;
+ svn_boolean_t mergeinfo_mod = FALSE;
if (! root->is_txn_root)
return SVN_FS__NOT_TXN(root);
- txn_id = root->txn;
+ txn_id = root_txn_id(root);
path = svn_fs__canonicalize_abspath(path, pool);
- SVN_ERR(open_path(&parent_path, root, path, 0, txn_id, pool));
+ SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
@@ -1354,6 +1601,8 @@ fs_change_node_prop(svn_fs_root_t *root,
SVN_ERR(svn_fs_fs__dag_set_has_mergeinfo(parent_path->node,
(value != NULL), pool));
}
+
+ mergeinfo_mod = TRUE;
}
/* Set the property. */
@@ -1366,7 +1615,7 @@ fs_change_node_prop(svn_fs_root_t *root,
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path,
svn_fs_fs__dag_get_id(parent_path->node),
- svn_fs_path_change_modify, FALSE, TRUE,
+ svn_fs_path_change_modify, FALSE, TRUE, mergeinfo_mod,
svn_fs_fs__dag_node_kind(parent_path->node),
SVN_INVALID_REVNUM, NULL, pool);
}
@@ -1382,6 +1631,7 @@ fs_props_changed(svn_boolean_t *changed_p,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
+ svn_boolean_t strict,
apr_pool_t *pool)
{
dag_node_t *node1, *node2;
@@ -1395,7 +1645,7 @@ fs_props_changed(svn_boolean_t *changed_p,
SVN_ERR(get_dag(&node1, root1, path1, pool));
SVN_ERR(get_dag(&node2, root2, path2, pool));
return svn_fs_fs__dag_things_different(changed_p, NULL,
- node1, node2);
+ node1, node2, strict, pool);
}
@@ -1423,6 +1673,53 @@ conflict_err(svn_stringbuf_t *conflict_path,
_("Conflict at '%s'"), path);
}
+/* Compare the directory representations at nodes LHS and RHS and set
+ * *CHANGED to TRUE, if at least one entry has been added or removed them.
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+compare_dir_structure(svn_boolean_t *changed,
+ dag_node_t *lhs,
+ dag_node_t *rhs,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *lhs_entries;
+ apr_array_header_t *rhs_entries;
+ int i;
+
+ SVN_ERR(svn_fs_fs__dag_dir_entries(&lhs_entries, lhs, pool));
+ SVN_ERR(svn_fs_fs__dag_dir_entries(&rhs_entries, rhs, pool));
+
+ /* different number of entries -> some addition / removal */
+ if (lhs_entries->nelts != rhs_entries->nelts)
+ {
+ *changed = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Since directories are sorted by name, we can simply compare their
+ entries one-by-one without binary lookup etc. */
+ for (i = 0; i < lhs_entries->nelts; ++i)
+ {
+ svn_fs_dirent_t *lhs_entry
+ = APR_ARRAY_IDX(lhs_entries, i, svn_fs_dirent_t *);
+ svn_fs_dirent_t *rhs_entry
+ = APR_ARRAY_IDX(rhs_entries, i, svn_fs_dirent_t *);
+
+ if (strcmp(lhs_entry->name, rhs_entry->name)
+ || !svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(lhs_entry->id),
+ svn_fs_fs__id_node_id(rhs_entry->id))
+ || !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(lhs_entry->id),
+ svn_fs_fs__id_copy_id(rhs_entry->id)))
+ {
+ *changed = TRUE;
+ return SVN_NO_ERROR;
+ }
+ }
+
+ *changed = FALSE;
+ return SVN_NO_ERROR;
+}
/* Merge changes between ANCESTOR and SOURCE into TARGET. ANCESTOR
* and TARGET must be distinct node revisions. TARGET_PATH should
@@ -1452,13 +1749,13 @@ merge(svn_stringbuf_t *conflict_p,
dag_node_t *target,
dag_node_t *source,
dag_node_t *ancestor,
- const char *txn_id,
+ const svn_fs_fs__id_part_t *txn_id,
apr_int64_t *mergeinfo_increment_out,
apr_pool_t *pool)
{
const svn_fs_id_t *source_id, *target_id, *ancestor_id;
- apr_hash_t *s_entries, *t_entries, *a_entries;
- apr_hash_index_t *hi;
+ apr_array_header_t *s_entries, *t_entries, *a_entries;
+ int i, s_idx = -1, t_idx = -1;
svn_fs_t *fs;
apr_pool_t *iterpool;
apr_int64_t mergeinfo_increment = 0;
@@ -1585,22 +1882,43 @@ merge(svn_stringbuf_t *conflict_p,
*/
{
node_revision_t *tgt_nr, *anc_nr, *src_nr;
+ svn_boolean_t same;
+ apr_pool_t *scratch_pool;
/* Get node revisions for our id's. */
- SVN_ERR(svn_fs_fs__get_node_revision(&tgt_nr, fs, target_id, pool));
- SVN_ERR(svn_fs_fs__get_node_revision(&anc_nr, fs, ancestor_id, pool));
- SVN_ERR(svn_fs_fs__get_node_revision(&src_nr, fs, source_id, pool));
+ scratch_pool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&tgt_nr, fs, target_id, pool,
+ scratch_pool));
+ svn_pool_clear(scratch_pool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&anc_nr, fs, ancestor_id, pool,
+ scratch_pool));
+ svn_pool_clear(scratch_pool);
+ SVN_ERR(svn_fs_fs__get_node_revision(&src_nr, fs, source_id, pool,
+ scratch_pool));
+ svn_pool_destroy(scratch_pool);
/* Now compare the prop-keys of the skels. Note that just because
the keys are different -doesn't- mean the proplists have
- different contents. But merge() isn't concerned with contents;
- it doesn't do a brute-force comparison on textual contents, so
- it won't do that here either. Checking to see if the propkey
- atoms are `equal' is enough. */
- if (! svn_fs_fs__noderev_same_rep_key(tgt_nr->prop_rep, anc_nr->prop_rep))
- return conflict_err(conflict_p, target_path);
- if (! svn_fs_fs__noderev_same_rep_key(src_nr->prop_rep, anc_nr->prop_rep))
+ different contents. */
+ SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, src_nr, anc_nr, pool));
+ if (! same)
return conflict_err(conflict_p, target_path);
+
+ /* The directory entries got changed in the repository but the directory
+ properties did not. */
+ SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, tgt_nr, anc_nr, pool));
+ if (! same)
+ {
+ /* There is an incoming prop change for this directory.
+ We will accept it only if the directory changes were mere updates
+ to its entries, i.e. there were no additions or removals.
+ Those could cause update problems to the working copy. */
+ svn_boolean_t changed;
+ SVN_ERR(compare_dir_structure(&changed, source, ancestor, pool));
+
+ if (changed)
+ return conflict_err(conflict_p, target_path);
+ }
}
/* ### todo: it would be more efficient to simply check for a NULL
@@ -1614,27 +1932,19 @@ merge(svn_stringbuf_t *conflict_p,
/* for each entry E in a_entries... */
iterpool = svn_pool_create(pool);
- for (hi = apr_hash_first(pool, a_entries);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < a_entries->nelts; ++i)
{
svn_fs_dirent_t *s_entry, *t_entry, *a_entry;
- const char *name;
- apr_ssize_t klen;
-
svn_pool_clear(iterpool);
- name = svn__apr_hash_index_key(hi);
- klen = svn__apr_hash_index_klen(hi);
- a_entry = svn__apr_hash_index_val(hi);
-
- s_entry = apr_hash_get(s_entries, name, klen);
- t_entry = apr_hash_get(t_entries, name, klen);
+ a_entry = APR_ARRAY_IDX(a_entries, i, svn_fs_dirent_t *);
+ s_entry = svn_fs_fs__find_dir_entry(s_entries, a_entry->name, &s_idx);
+ t_entry = svn_fs_fs__find_dir_entry(t_entries, a_entry->name, &t_idx);
/* No changes were made to this entry while the transaction was
in progress, so do nothing to the target. */
if (s_entry && svn_fs_fs__id_eq(a_entry->id, s_entry->id))
- goto end;
+ continue;
/* A change was made to this entry while the transaction was in
process, but the transaction did not touch this entry. */
@@ -1665,15 +1975,16 @@ merge(svn_stringbuf_t *conflict_p,
mergeinfo_increment += mergeinfo_end;
}
- SVN_ERR(svn_fs_fs__dag_set_entry(target, name,
+ SVN_ERR(svn_fs_fs__dag_set_entry(target, a_entry->name,
s_entry->id,
s_entry->kind,
txn_id,
- iterpool));
+ pool));
}
else
{
- SVN_ERR(svn_fs_fs__dag_delete(target, name, txn_id, iterpool));
+ SVN_ERR(svn_fs_fs__dag_delete(target, a_entry->name, txn_id,
+ iterpool));
}
}
@@ -1706,14 +2017,14 @@ merge(svn_stringbuf_t *conflict_p,
/* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
modification of ANCESTOR-ENTRY, declare a conflict. */
- if (strcmp(svn_fs_fs__id_node_id(s_entry->id),
- svn_fs_fs__id_node_id(a_entry->id)) != 0
- || strcmp(svn_fs_fs__id_copy_id(s_entry->id),
- svn_fs_fs__id_copy_id(a_entry->id)) != 0
- || strcmp(svn_fs_fs__id_node_id(t_entry->id),
- svn_fs_fs__id_node_id(a_entry->id)) != 0
- || strcmp(svn_fs_fs__id_copy_id(t_entry->id),
- svn_fs_fs__id_copy_id(a_entry->id)) != 0)
+ if (!svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(s_entry->id),
+ svn_fs_fs__id_node_id(a_entry->id))
+ || !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(s_entry->id),
+ svn_fs_fs__id_copy_id(a_entry->id))
+ || !svn_fs_fs__id_part_eq(svn_fs_fs__id_node_id(t_entry->id),
+ svn_fs_fs__id_node_id(a_entry->id))
+ || !svn_fs_fs__id_part_eq(svn_fs_fs__id_copy_id(t_entry->id),
+ svn_fs_fs__id_copy_id(a_entry->id)))
return conflict_err(conflict_p,
svn_fspath__join(target_path,
a_entry->name,
@@ -1737,29 +2048,23 @@ merge(svn_stringbuf_t *conflict_p,
if (fs_supports_mergeinfo)
mergeinfo_increment += sub_mergeinfo_increment;
}
-
- /* We've taken care of any possible implications E could have.
- Remove it from source_entries, so it's easy later to loop
- over all the source entries that didn't exist in
- ancestor_entries. */
- end:
- apr_hash_set(s_entries, name, klen, NULL);
}
/* For each entry E in source but not in ancestor */
- for (hi = apr_hash_first(pool, s_entries);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < s_entries->nelts; ++i)
{
- svn_fs_dirent_t *s_entry, *t_entry;
- const char *name = svn__apr_hash_index_key(hi);
- apr_ssize_t klen = svn__apr_hash_index_klen(hi);
+ svn_fs_dirent_t *a_entry, *s_entry, *t_entry;
dag_node_t *s_ent_node;
svn_pool_clear(iterpool);
- s_entry = svn__apr_hash_index_val(hi);
- t_entry = apr_hash_get(t_entries, name, klen);
+ s_entry = APR_ARRAY_IDX(s_entries, i, svn_fs_dirent_t *);
+ a_entry = svn_fs_fs__find_dir_entry(a_entries, s_entry->name, &s_idx);
+ t_entry = svn_fs_fs__find_dir_entry(t_entries, s_entry->name, &t_idx);
+
+ /* Process only entries in source that are NOT in ancestor. */
+ if (a_entry)
+ continue;
/* If NAME exists in TARGET, declare a conflict. */
if (t_entry)
@@ -1816,7 +2121,7 @@ merge_changes(dag_node_t *ancestor_node,
{
dag_node_t *txn_root_node;
svn_fs_t *fs = txn->fs;
- const char *txn_id = txn->id;
+ const svn_fs_fs__id_part_t *txn_id = svn_fs_fs__txn_get_id(txn);
SVN_ERR(svn_fs_fs__dag_txn_root(&txn_root_node, fs, txn_id, pool));
@@ -1891,6 +2196,7 @@ svn_fs_fs__commit_txn(const char **conflict_p,
svn_error_t *err = SVN_NO_ERROR;
svn_stringbuf_t *conflict = svn_stringbuf_create_empty(pool);
svn_fs_t *fs = txn->fs;
+ fs_fs_data_t *ffd = fs->fsap_data;
/* Limit memory usage when the repository has a high commit rate and
needs to run the following while loop multiple times. The memory
@@ -1973,7 +2279,15 @@ svn_fs_fs__commit_txn(const char **conflict_p,
svn_fs_fs__reset_txn_caches(fs);
svn_pool_destroy(iterpool);
- return svn_error_trace(err);
+
+ SVN_ERR(err);
+
+ if (ffd->pack_after_commit)
+ {
+ SVN_ERR(svn_fs_fs__pack(fs, 0, NULL, NULL, NULL, NULL, pool));
+ }
+
+ return SVN_NO_ERROR;
}
@@ -2068,10 +2382,36 @@ fs_dir_entries(apr_hash_t **table_p,
apr_pool_t *pool)
{
dag_node_t *node;
+ apr_hash_t *hash = svn_hash__make(pool);
+ apr_array_header_t *table;
+ int i;
/* Get the entries for this path in the caller's pool. */
SVN_ERR(get_dag(&node, root, path, pool));
- return svn_fs_fs__dag_dir_entries(table_p, node, pool);
+ SVN_ERR(svn_fs_fs__dag_dir_entries(&table, node, pool));
+
+ /* Convert directory array to hash. */
+ for (i = 0; i < table->nelts; ++i)
+ {
+ svn_fs_dirent_t *entry = APR_ARRAY_IDX(table, i, svn_fs_dirent_t *);
+ svn_hash_sets(hash, entry->name, entry);
+ }
+
+ *table_p = hash;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+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)
+{
+ *ordered_p = svn_fs_fs__order_dir_entries(root->fs, entries, result_pool,
+ scratch_pool);
+
+ return SVN_NO_ERROR;
}
/* Raise an error if PATH contains a newline because FSFS cannot handle
@@ -2100,13 +2440,13 @@ fs_make_dir(svn_fs_root_t *root,
{
parent_path_t *parent_path;
dag_node_t *sub_dir;
- const char *txn_id = root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
SVN_ERR(check_newline(path, pool));
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
- txn_id, pool));
+ TRUE, pool));
/* Check (recursively) to see if some lock is 'reserving' a path at
that location, or even some child-path; if so, check that we can
@@ -2136,8 +2476,8 @@ fs_make_dir(svn_fs_root_t *root,
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(sub_dir),
- svn_fs_path_change_add, FALSE, FALSE, svn_node_dir,
- SVN_INVALID_REVNUM, NULL, pool);
+ svn_fs_path_change_add, FALSE, FALSE, FALSE,
+ svn_node_dir, SVN_INVALID_REVNUM, NULL, pool);
}
@@ -2149,15 +2489,16 @@ fs_delete_node(svn_fs_root_t *root,
apr_pool_t *pool)
{
parent_path_t *parent_path;
- const char *txn_id = root->txn;
+ const svn_fs_fs__id_part_t *txn_id;
apr_int64_t mergeinfo_count = 0;
svn_node_kind_t kind;
if (! root->is_txn_root)
return SVN_FS__NOT_TXN(root);
+ txn_id = root_txn_id(root);
path = svn_fs__canonicalize_abspath(path, pool);
- SVN_ERR(open_path(&parent_path, root, path, 0, txn_id, pool));
+ SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, pool));
kind = svn_fs_fs__dag_node_kind(parent_path->node);
/* We can't remove the root of the filesystem. */
@@ -2193,7 +2534,7 @@ fs_delete_node(svn_fs_root_t *root,
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path,
svn_fs_fs__dag_get_id(parent_path->node),
- svn_fs_path_change_delete, FALSE, FALSE, kind,
+ svn_fs_path_change_delete, FALSE, FALSE, FALSE, kind,
SVN_INVALID_REVNUM, NULL, pool);
}
@@ -2224,7 +2565,7 @@ copy_helper(svn_fs_root_t *from_root,
{
dag_node_t *from_node;
parent_path_t *to_parent_path;
- const char *txn_id = to_root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(to_root);
svn_boolean_t same_p;
/* Use an error check, not an assert, because even the caller cannot
@@ -2236,11 +2577,17 @@ copy_helper(svn_fs_root_t *from_root,
_("Cannot copy between two different filesystems ('%s' and '%s')"),
from_root->fs->path, to_root->fs->path);
+ /* more things that we can't do ATM */
if (from_root->is_txn_root)
return svn_error_create
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Copy from mutable tree not currently supported"));
+ if (! to_root->is_txn_root)
+ return svn_error_create
+ (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Copy immutable tree not supported"));
+
/* Get the NODE for FROM_PATH in FROM_ROOT.*/
SVN_ERR(get_dag(&from_node, from_root, from_path, pool));
@@ -2248,7 +2595,7 @@ copy_helper(svn_fs_root_t *from_root,
component does not exist, it's not that big a deal. We'll just
make one there. */
SVN_ERR(open_path(&to_parent_path, to_root, to_path,
- open_path_last_optional, txn_id, pool));
+ open_path_last_optional, TRUE, pool));
/* Check to see if path (or any child thereof) is locked; if so,
check that we can use the existing lock(s). */
@@ -2307,7 +2654,7 @@ copy_helper(svn_fs_root_t *from_root,
from_canonpath,
txn_id, pool));
- if (kind == svn_fs_path_change_replace)
+ if (kind != svn_fs_path_change_add)
SVN_ERR(dag_node_cache_invalidate(to_root,
parent_path_path(to_parent_path,
pool), pool));
@@ -2321,8 +2668,8 @@ copy_helper(svn_fs_root_t *from_root,
/* Make a record of this modification in the changes table. */
SVN_ERR(get_dag(&new_node, to_root, to_path, pool));
SVN_ERR(add_change(to_root->fs, txn_id, to_path,
- svn_fs_fs__dag_get_id(new_node), kind, FALSE, FALSE,
- svn_fs_fs__dag_node_kind(from_node),
+ svn_fs_fs__dag_get_id(new_node), kind, FALSE,
+ FALSE, FALSE, svn_fs_fs__dag_node_kind(from_node),
from_root->rev, from_canonpath, pool));
}
else
@@ -2397,46 +2744,12 @@ fs_copied_from(svn_revnum_t *rev_p,
apr_pool_t *pool)
{
dag_node_t *node;
- const char *copyfrom_path, *copyfrom_str = NULL;
- svn_revnum_t copyfrom_rev;
- char *str, *buf;
-
- /* Check to see if there is a cached version of this copyfrom
- entry. */
- if (! root->is_txn_root) {
- fs_rev_root_data_t *frd = root->fsap_data;
- copyfrom_str = svn_hash_gets(frd->copyfrom_cache, path);
- }
-
- if (copyfrom_str)
- {
- if (*copyfrom_str == 0)
- {
- /* We have a cached entry that says there is no copyfrom
- here. */
- copyfrom_rev = SVN_INVALID_REVNUM;
- copyfrom_path = NULL;
- }
- else
- {
- /* Parse the copyfrom string for our cached entry. */
- buf = apr_pstrdup(pool, copyfrom_str);
- str = svn_cstring_tokenize(" ", &buf);
- copyfrom_rev = SVN_STR_TO_REV(str);
- copyfrom_path = buf;
- }
- }
- else
- {
- /* There is no cached entry, look it up the old-fashioned
- way. */
- SVN_ERR(get_dag(&node, root, path, pool));
- SVN_ERR(svn_fs_fs__dag_get_copyfrom_rev(&copyfrom_rev, node));
- SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(&copyfrom_path, node));
- }
- *rev_p = copyfrom_rev;
- *path_p = copyfrom_path;
+ /* There is no cached entry, look it up the old-fashioned
+ way. */
+ SVN_ERR(get_dag(&node, root, path, pool));
+ SVN_ERR(svn_fs_fs__dag_get_copyfrom_rev(rev_p, node));
+ SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(path_p, node));
return SVN_NO_ERROR;
}
@@ -2454,13 +2767,13 @@ fs_make_file(svn_fs_root_t *root,
{
parent_path_t *parent_path;
dag_node_t *child;
- const char *txn_id = root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(root);
SVN_ERR(check_newline(path, pool));
path = svn_fs__canonicalize_abspath(path, pool);
SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
- txn_id, pool));
+ TRUE, pool));
/* If there's already a file by that name, complain.
This also catches the case of trying to make a file named `/'. */
@@ -2489,8 +2802,8 @@ fs_make_file(svn_fs_root_t *root,
/* Make a record of this modification in the changes table. */
return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(child),
- svn_fs_path_change_add, TRUE, FALSE, svn_node_file,
- SVN_INVALID_REVNUM, NULL, pool);
+ svn_fs_path_change_add, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
@@ -2597,8 +2910,6 @@ typedef struct txdelta_baton_t
svn_stream_t *source_stream;
svn_stream_t *target_stream;
- svn_stream_t *string_stream;
- svn_stringbuf_t *target_string;
/* MD5 digest for the base text against which a delta is to be
applied, and for the resultant fulltext, respectively. Either or
@@ -2612,20 +2923,6 @@ typedef struct txdelta_baton_t
} txdelta_baton_t;
-/* ### see comment in window_consumer() regarding this function. */
-
-/* Helper function of generic type `svn_write_fn_t'. Implements a
- writable stream which appends to an svn_stringbuf_t. */
-static svn_error_t *
-write_to_string(void *baton, const char *data, apr_size_t *len)
-{
- txdelta_baton_t *tb = (txdelta_baton_t *) baton;
- svn_stringbuf_appendbytes(tb->target_string, data, *len);
- return SVN_NO_ERROR;
-}
-
-
-
/* The main window handler returned by svn_fs_apply_textdelta. */
static svn_error_t *
window_consumer(svn_txdelta_window_t *window, void *baton)
@@ -2637,48 +2934,11 @@ window_consumer(svn_txdelta_window_t *window, void *baton)
cb->target_string. */
SVN_ERR(tb->interpreter(window, tb->interpreter_baton));
- /* ### the write_to_string() callback for the txdelta's output stream
- ### should be doing all the flush determination logic, not here.
- ### in a drastic case, a window could generate a LOT more than the
- ### maximum buffer size. we want to flush to the underlying target
- ### stream much sooner (e.g. also in a streamy fashion). also, by
- ### moving this logic inside the stream, the stream becomes nice
- ### and encapsulated: it holds all the logic about buffering and
- ### flushing.
- ###
- ### further: I believe the buffering should be removed from tree.c
- ### the buffering should go into the target_stream itself, which
- ### is defined by reps-string.c. Specifically, I think the
- ### rep_write_contents() function will handle the buffering and
- ### the spill to the underlying DB. by locating it there, then
- ### anybody who gets a writable stream for FS content can take
- ### advantage of the buffering capability. this will be important
- ### when we export an FS API function for writing a fulltext into
- ### the FS, rather than forcing that fulltext thru apply_textdelta.
- */
-
- /* Check to see if we need to purge the portion of the contents that
- have been written thus far. */
- if ((! window) || (tb->target_string->len > WRITE_BUFFER_SIZE))
- {
- apr_size_t len = tb->target_string->len;
- SVN_ERR(svn_stream_write(tb->target_stream,
- tb->target_string->data,
- &len));
- svn_stringbuf_setempty(tb->target_string);
- }
-
- /* Is the window NULL? If so, we're done. */
+ /* Is the window NULL? If so, we're done. The stream has already been
+ closed by the interpreter. */
if (! window)
- {
- /* Close the internal-use stream. ### This used to be inside of
- txn_body_fulltext_finalize_edits(), but that invoked a nested
- Berkeley DB transaction -- scandalous! */
- SVN_ERR(svn_stream_close(tb->target_stream));
-
- SVN_ERR(svn_fs_fs__dag_finalize_edits(tb->node, tb->result_checksum,
- tb->pool));
- }
+ SVN_ERR(svn_fs_fs__dag_finalize_edits(tb->node, tb->result_checksum,
+ tb->pool));
return SVN_NO_ERROR;
}
@@ -2690,11 +2950,11 @@ apply_textdelta(void *baton, apr_pool_t *pool)
{
txdelta_baton_t *tb = (txdelta_baton_t *) baton;
parent_path_t *parent_path;
- const char *txn_id = tb->root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(tb->root);
/* Call open_path with no flags, as we want this to return an error
if the node for which we are searching doesn't exist. */
- SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, txn_id, pool));
+ SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
@@ -2730,15 +2990,9 @@ apply_textdelta(void *baton, apr_pool_t *pool)
SVN_ERR(svn_fs_fs__dag_get_edit_stream(&(tb->target_stream), tb->node,
tb->pool));
- /* Make a writable "string" stream which writes data to
- tb->target_string. */
- tb->target_string = svn_stringbuf_create_empty(tb->pool);
- tb->string_stream = svn_stream_create(tb, tb->pool);
- svn_stream_set_write(tb->string_stream, write_to_string);
-
/* Now, create a custom window handler that uses our two streams. */
svn_txdelta_apply(tb->source_stream,
- tb->string_stream,
+ tb->target_stream,
NULL,
tb->path,
tb->pool,
@@ -2748,8 +3002,8 @@ apply_textdelta(void *baton, apr_pool_t *pool)
/* Make a record of this modification in the changes table. */
return add_change(tb->root->fs, txn_id, tb->path,
svn_fs_fs__dag_get_id(tb->node),
- svn_fs_path_change_modify, TRUE, FALSE, svn_node_file,
- SVN_INVALID_REVNUM, NULL, pool);
+ svn_fs_path_change_modify, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
@@ -2855,11 +3109,11 @@ apply_text(void *baton, apr_pool_t *pool)
{
struct text_baton_t *tb = baton;
parent_path_t *parent_path;
- const char *txn_id = tb->root->txn;
+ const svn_fs_fs__id_part_t *txn_id = root_txn_id(tb->root);
/* Call open_path with no flags, as we want this to return an error
if the node for which we are searching doesn't exist. */
- SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, txn_id, pool));
+ SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, pool));
/* Check (non-recursively) to see if path is locked; if so, check
that we can use it. */
@@ -2883,8 +3137,8 @@ apply_text(void *baton, apr_pool_t *pool)
/* Make a record of this modification in the changes table. */
return add_change(tb->root->fs, txn_id, tb->path,
svn_fs_fs__dag_get_id(tb->node),
- svn_fs_path_change_modify, TRUE, FALSE, svn_node_file,
- SVN_INVALID_REVNUM, NULL, pool);
+ svn_fs_path_change_modify, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, pool);
}
@@ -2923,6 +3177,7 @@ fs_contents_changed(svn_boolean_t *changed_p,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
+ svn_boolean_t strict,
apr_pool_t *pool)
{
dag_node_t *node1, *node2;
@@ -2951,7 +3206,7 @@ fs_contents_changed(svn_boolean_t *changed_p,
SVN_ERR(get_dag(&node1, root1, path1, pool));
SVN_ERR(get_dag(&node2, root2, path2, pool));
return svn_fs_fs__dag_things_different(NULL, changed_p,
- node1, node2);
+ node1, node2, strict, pool);
}
@@ -2993,14 +3248,11 @@ fs_paths_changed(apr_hash_t **changed_paths_p,
apr_pool_t *pool)
{
if (root->is_txn_root)
- return svn_fs_fs__txn_changes_fetch(changed_paths_p, root->fs, root->txn,
- pool);
+ return svn_fs_fs__txn_changes_fetch(changed_paths_p, root->fs,
+ root_txn_id(root), pool);
else
- {
- fs_rev_root_data_t *frd = root->fsap_data;
- return svn_fs_fs__paths_changed(changed_paths_p, root->fs, root->rev,
- frd->copyfrom_cache, pool);
- }
+ return svn_fs_fs__paths_changed(changed_paths_p, root->fs, root->rev,
+ pool);
}
@@ -3040,7 +3292,8 @@ static svn_error_t *
fs_node_history(svn_fs_history_t **history_p,
svn_fs_root_t *root,
const char *path,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
@@ -3049,15 +3302,13 @@ fs_node_history(svn_fs_history_t **history_p,
return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
/* And we require that the path exist in the root. */
- SVN_ERR(svn_fs_fs__check_path(&kind, root, path, pool));
+ SVN_ERR(svn_fs_fs__check_path(&kind, root, path, scratch_pool));
if (kind == svn_node_none)
return SVN_FS__NOT_FOUND(root, path);
/* Okay, all seems well. Build our history object and return it. */
- *history_p = assemble_history(root->fs,
- svn_fs__canonicalize_abspath(path, pool),
- root->rev, FALSE, NULL,
- SVN_INVALID_REVNUM, pool);
+ *history_p = assemble_history(root->fs, path, root->rev, FALSE, NULL,
+ SVN_INVALID_REVNUM, result_pool);
return SVN_NO_ERROR;
}
@@ -3115,14 +3366,13 @@ static svn_error_t *fs_closest_copy(svn_fs_root_t **root_p,
const char *copy_dst_path;
svn_fs_root_t *copy_dst_root;
dag_node_t *copy_dst_node;
- svn_node_kind_t kind;
/* Initialize return values. */
*root_p = NULL;
*path_p = NULL;
path = svn_fs__canonicalize_abspath(path, pool);
- SVN_ERR(open_path(&parent_path, root, path, 0, NULL, pool));
+ SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, pool));
/* Find the youngest copyroot in the path of this node-rev, which
will indicate the target of the innermost copy affecting the
@@ -3136,11 +3386,11 @@ static svn_error_t *fs_closest_copy(svn_fs_root_t **root_p,
revision between COPY_DST_REV and REV. Make sure that PATH
exists as of COPY_DST_REV and is related to this node-rev. */
SVN_ERR(svn_fs_fs__revision_root(&copy_dst_root, fs, copy_dst_rev, pool));
- SVN_ERR(svn_fs_fs__check_path(&kind, copy_dst_root, path, pool));
- if (kind == svn_node_none)
- return SVN_NO_ERROR;
SVN_ERR(open_path(&copy_dst_parent_path, copy_dst_root, path,
- open_path_node_only, NULL, pool));
+ open_path_node_only | open_path_allow_null, FALSE, pool));
+ if (copy_dst_parent_path == NULL)
+ return SVN_NO_ERROR;
+
copy_dst_node = copy_dst_parent_path->node;
if (! svn_fs_fs__id_check_related(svn_fs_fs__dag_get_id(copy_dst_node),
svn_fs_fs__dag_get_id(parent_path->node)))
@@ -3236,7 +3486,7 @@ fs_node_origin_rev(svn_revnum_t *revision,
{
svn_fs_t *fs = root->fs;
const svn_fs_id_t *given_noderev_id, *cached_origin_id;
- const char *node_id, *dash;
+ const svn_fs_fs__id_part_t *node_id;
path = svn_fs__canonicalize_abspath(path, pool);
@@ -3244,27 +3494,13 @@ fs_node_origin_rev(svn_revnum_t *revision,
SVN_ERR(svn_fs_fs__node_id(&given_noderev_id, root, path, pool));
node_id = svn_fs_fs__id_node_id(given_noderev_id);
- /* Is it a brand new uncommitted node? */
- if (node_id[0] == '_')
- {
- *revision = SVN_INVALID_REVNUM;
- return SVN_NO_ERROR;
- }
-
- /* Maybe this is a new-style node ID that just has the revision
- sitting right in it. */
- dash = strchr(node_id, '-');
- if (dash && *(dash+1))
- {
- *revision = SVN_STR_TO_REV(dash + 1);
- return SVN_NO_ERROR;
- }
-
- /* The root node always has ID 0, created in revision 0 and will never
- use the new-style ID format. */
- if (strcmp(node_id, "0") == 0)
+ /* Is it a brand new uncommitted node or a new-style node ID?
+ * (committed old-style nodes will have a 0 revision value;
+ * rev 0, number 0 is rev 0 root node). Note that != 0 includes
+ * SVN_INVALID_REVNUM for uncommitted nodes. */
+ if (node_id->revision != 0 || node_id->number == 0)
{
- *revision = 0;
+ *revision = node_id->revision;
return SVN_NO_ERROR;
}
@@ -3344,7 +3580,7 @@ fs_node_origin_rev(svn_revnum_t *revision,
/* Wow, I don't want to have to do all that again. Let's cache
the result. */
- if (node_id[0] != '_')
+ if (node_id->revision != SVN_INVALID_REVNUM)
SVN_ERR(svn_fs_fs__set_node_origin(fs, node_id,
svn_fs_fs__dag_get_id(node), pool));
@@ -3355,26 +3591,17 @@ fs_node_origin_rev(svn_revnum_t *revision,
}
-struct history_prev_args
-{
- svn_fs_history_t **prev_history_p;
- svn_fs_history_t *history;
- svn_boolean_t cross_copies;
- apr_pool_t *pool;
-};
-
-
static svn_error_t *
-history_prev(void *baton, apr_pool_t *pool)
+history_prev(svn_fs_history_t **prev_history,
+ svn_fs_history_t *history,
+ svn_boolean_t cross_copies,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- struct history_prev_args *args = baton;
- svn_fs_history_t **prev_history = args->prev_history_p;
- svn_fs_history_t *history = args->history;
fs_history_data_t *fhd = history->fsap_data;
const char *commit_path, *src_path, *path = fhd->path;
svn_revnum_t commit_rev, src_rev, dst_rev;
svn_revnum_t revision = fhd->revision;
- apr_pool_t *retpool = args->pool;
svn_fs_t *fs = fhd->fs;
parent_path_t *parent_path;
dag_node_t *node;
@@ -3393,21 +3620,21 @@ history_prev(void *baton, apr_pool_t *pool)
if (fhd->path_hint && SVN_IS_VALID_REVNUM(fhd->rev_hint))
{
reported = FALSE;
- if (! args->cross_copies)
+ if (! cross_copies)
return SVN_NO_ERROR;
path = fhd->path_hint;
revision = fhd->rev_hint;
}
/* Construct a ROOT for the current revision. */
- SVN_ERR(svn_fs_fs__revision_root(&root, fs, revision, pool));
+ SVN_ERR(svn_fs_fs__revision_root(&root, fs, revision, scratch_pool));
/* Open PATH/REVISION, and get its node and a bunch of other
goodies. */
- SVN_ERR(open_path(&parent_path, root, path, 0, NULL, pool));
+ SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, scratch_pool));
node = parent_path->node;
commit_path = svn_fs_fs__dag_get_created_path(node);
- SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, pool));
+ SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, scratch_pool));
/* The Subversion filesystem is written in such a way that a given
line of history may have at most one interesting history point
@@ -3422,10 +3649,9 @@ history_prev(void *baton, apr_pool_t *pool)
{
/* ... we either have not yet reported on this revision (and
need now to do so) ... */
- *prev_history = assemble_history(fs,
- apr_pstrdup(retpool, commit_path),
+ *prev_history = assemble_history(fs, commit_path,
commit_rev, TRUE, NULL,
- SVN_INVALID_REVNUM, retpool);
+ SVN_INVALID_REVNUM, result_pool);
return SVN_NO_ERROR;
}
else
@@ -3441,16 +3667,16 @@ history_prev(void *baton, apr_pool_t *pool)
/* Replace NODE and friends with the information from its
predecessor. */
- SVN_ERR(svn_fs_fs__dag_get_node(&node, fs, pred_id, pool));
+ SVN_ERR(svn_fs_fs__dag_get_node(&node, fs, pred_id, scratch_pool));
commit_path = svn_fs_fs__dag_get_created_path(node);
- SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, pool));
+ SVN_ERR(svn_fs_fs__dag_get_revision(&commit_rev, node, scratch_pool));
}
}
/* Find the youngest copyroot in the path of this node, including
itself. */
SVN_ERR(find_youngest_copyroot(&copyroot_rev, &copyroot_path, fs,
- parent_path, pool));
+ parent_path, scratch_pool));
/* Initialize some state variables. */
src_path = NULL;
@@ -3464,8 +3690,8 @@ history_prev(void *baton, apr_pool_t *pool)
svn_fs_root_t *copyroot_root;
SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, fs, copyroot_rev,
- pool));
- SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, pool));
+ scratch_pool));
+ SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, scratch_pool));
copy_dst = svn_fs_fs__dag_get_created_path(node);
/* If our current path was the very destination of the copy,
@@ -3487,7 +3713,7 @@ history_prev(void *baton, apr_pool_t *pool)
SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(&copy_src, node));
dst_rev = copyroot_rev;
- src_path = svn_fspath__join(copy_src, remainder_path, pool);
+ src_path = svn_fspath__join(copy_src, remainder_path, scratch_pool);
}
}
@@ -3504,15 +3730,13 @@ history_prev(void *baton, apr_pool_t *pool)
if ((dst_rev == revision) && reported)
retry = TRUE;
- *prev_history = assemble_history(fs, apr_pstrdup(retpool, path),
- dst_rev, ! retry,
- src_path, src_rev, retpool);
+ *prev_history = assemble_history(fs, path, dst_rev, ! retry,
+ src_path, src_rev, result_pool);
}
else
{
- *prev_history = assemble_history(fs, apr_pstrdup(retpool, commit_path),
- commit_rev, TRUE, NULL,
- SVN_INVALID_REVNUM, retpool);
+ *prev_history = assemble_history(fs, commit_path, commit_rev, TRUE,
+ NULL, SVN_INVALID_REVNUM, result_pool);
}
return SVN_NO_ERROR;
@@ -3527,7 +3751,8 @@ static svn_error_t *
fs_history_prev(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history,
svn_boolean_t cross_copies,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_fs_history_t *prev_history = NULL;
fs_history_data_t *fhd = history->fsap_data;
@@ -3541,23 +3766,23 @@ fs_history_prev(svn_fs_history_t **prev_history_p,
{
if (! fhd->is_interesting)
prev_history = assemble_history(fs, "/", fhd->revision,
- 1, NULL, SVN_INVALID_REVNUM, pool);
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
else if (fhd->revision > 0)
prev_history = assemble_history(fs, "/", fhd->revision - 1,
- 1, NULL, SVN_INVALID_REVNUM, pool);
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
}
else
{
- struct history_prev_args args;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
prev_history = history;
while (1)
{
- args.prev_history_p = &prev_history;
- args.history = prev_history;
- args.cross_copies = cross_copies;
- args.pool = pool;
- SVN_ERR(history_prev(&args, pool));
+ svn_pool_clear(iterpool);
+ SVN_ERR(history_prev(&prev_history, prev_history, cross_copies,
+ result_pool, iterpool));
if (! prev_history)
break;
@@ -3565,6 +3790,8 @@ fs_history_prev(svn_fs_history_t **prev_history_p,
if (fhd->is_interesting)
break;
}
+
+ svn_pool_destroy(iterpool);
}
*prev_history_p = prev_history;
@@ -3594,9 +3821,8 @@ static history_vtable_t history_vtable = {
/* Return a new history object (marked as "interesting") for PATH and
REVISION, allocated in POOL, and with its members set to the values
- of the parameters provided. Note that PATH and PATH_HINT are not
- duped into POOL -- it is the responsibility of the caller to ensure
- that this happens. */
+ of the parameters provided. Note that PATH and PATH_HINT get
+ normalized and duplicated in POOL. */
static svn_fs_history_t *
assemble_history(svn_fs_t *fs,
const char *path,
@@ -3611,7 +3837,8 @@ assemble_history(svn_fs_t *fs,
fhd->path = svn_fs__canonicalize_abspath(path, pool);
fhd->revision = revision;
fhd->is_interesting = is_interesting;
- fhd->path_hint = path_hint;
+ fhd->path_hint = path_hint ? svn_fs__canonicalize_abspath(path_hint, pool)
+ : NULL;
fhd->rev_hint = rev_hint;
fhd->fs = fs;
@@ -3643,18 +3870,14 @@ crawl_directory_dag_for_mergeinfo(svn_fs_root_t *root,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- apr_hash_t *entries;
- apr_hash_index_t *hi;
+ apr_array_header_t *entries;
+ int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, dir_dag,
- scratch_pool));
-
- for (hi = apr_hash_first(scratch_pool, entries);
- hi;
- hi = apr_hash_next(hi))
+ SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, dir_dag, scratch_pool));
+ for (i = 0; i < entries->nelts; ++i)
{
- svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
+ svn_fs_dirent_t *dirent = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
const char *kid_path;
dag_node_t *kid_dag;
svn_boolean_t has_mergeinfo, go_down;
@@ -3758,7 +3981,7 @@ get_mergeinfo_for_path_internal(svn_mergeinfo_t *mergeinfo,
path = svn_fs__canonicalize_abspath(path, scratch_pool);
- SVN_ERR(open_path(&parent_path, rev_root, path, 0, NULL, scratch_pool));
+ SVN_ERR(open_path(&parent_path, rev_root, path, 0, FALSE, scratch_pool));
if (inherit == svn_mergeinfo_nearest_ancestor && ! parent_path->parent)
return SVN_NO_ERROR;
@@ -4017,20 +4240,23 @@ static root_vtable_t root_vtable = {
svn_fs_fs__check_path,
fs_node_history,
svn_fs_fs__node_id,
+ fs_node_relation,
svn_fs_fs__node_created_rev,
fs_node_origin_rev,
fs_node_created_path,
fs_delete_node,
+ fs_copy,
+ fs_revision_link,
fs_copied_from,
fs_closest_copy,
fs_node_prop,
fs_node_proplist,
+ fs_node_has_props,
fs_change_node_prop,
fs_props_changed,
fs_dir_entries,
+ fs_dir_optimal_order,
fs_make_dir,
- fs_copy,
- fs_revision_link,
fs_file_length,
fs_file_checksum,
fs_file_contents,
@@ -4068,15 +4294,10 @@ make_revision_root(svn_fs_t *fs,
apr_pool_t *pool)
{
svn_fs_root_t *root = make_root(fs, pool);
- fs_rev_root_data_t *frd = apr_pcalloc(root->pool, sizeof(*frd));
root->is_txn_root = FALSE;
root->rev = rev;
-
- frd->root_dir = root_dir;
- frd->copyfrom_cache = svn_hash__make(root->pool);
-
- root->fsap_data = frd;
+ root->fsap_data = root_dir;
return root;
}
@@ -4088,21 +4309,20 @@ make_revision_root(svn_fs_t *fs,
static svn_error_t *
make_txn_root(svn_fs_root_t **root_p,
svn_fs_t *fs,
- const char *txn,
+ const svn_fs_fs__id_part_t *txn,
svn_revnum_t base_rev,
apr_uint32_t flags,
apr_pool_t *pool)
{
svn_fs_root_t *root = make_root(fs, pool);
fs_txn_root_data_t *frd = apr_pcalloc(root->pool, sizeof(*frd));
+ frd->txn_id = *txn;
root->is_txn_root = TRUE;
- root->txn = apr_pstrdup(root->pool, txn);
+ root->txn = svn_fs_fs__id_txn_unparse(txn, root->pool);
root->txn_flags = flags;
root->rev = base_rev;
- frd->txn_id = txn;
-
/* Because this cache actually tries to invalidate elements, keep
the number of elements per page down.
@@ -4114,14 +4334,14 @@ make_txn_root(svn_fs_root_t **root_p,
APR_HASH_KEY_STRING,
32, 20, FALSE,
apr_pstrcat(pool, txn, ":TXN",
- (char *)NULL),
+ SVN_VA_NULL),
root->pool));
/* Initialize transaction-local caches in FS.
Note that we cannot put those caches in frd because that content
fs root object is not available where we would need it. */
- SVN_ERR(svn_fs_fs__initialize_txn_caches(fs, txn, pool));
+ SVN_ERR(svn_fs_fs__initialize_txn_caches(fs, root->txn, root->pool));
root->fsap_data = frd;
@@ -4132,7 +4352,7 @@ make_txn_root(svn_fs_root_t **root_p,
/* Verify. */
-static APR_INLINE const char *
+static const char *
stringify_node(dag_node_t *node,
apr_pool_t *pool)
{
@@ -4142,10 +4362,12 @@ stringify_node(dag_node_t *node,
/* Check metadata sanity on NODE, and on its children. Manually verify
information for DAG nodes in revision REV, and trust the metadata
- accuracy for nodes belonging to older revisions. */
+ accuracy for nodes belonging to older revisions. To detect cycles,
+ provide all parent dag_node_t * in PARENT_NODES. */
static svn_error_t *
verify_node(dag_node_t *node,
svn_revnum_t rev,
+ apr_array_header_t *parent_nodes,
apr_pool_t *pool)
{
svn_boolean_t has_mergeinfo;
@@ -4155,6 +4377,18 @@ verify_node(dag_node_t *node,
int pred_count;
svn_node_kind_t kind;
apr_pool_t *iterpool = svn_pool_create(pool);
+ int i;
+
+ /* Detect (non-)DAG cycles. */
+ for (i = 0; i < parent_nodes->nelts; ++i)
+ {
+ dag_node_t *parent = APR_ARRAY_IDX(parent_nodes, i, dag_node_t *);
+ if (svn_fs_fs__id_eq(svn_fs_fs__dag_get_id(parent),
+ svn_fs_fs__dag_get_id(node)))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Node is its own direct or indirect parent '%s'",
+ stringify_node(node, iterpool));
+ }
/* Fetch some data. */
SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&has_mergeinfo, node));
@@ -4205,32 +4439,40 @@ verify_node(dag_node_t *node,
}
if (kind == svn_node_dir)
{
- apr_hash_t *entries;
- apr_hash_index_t *hi;
+ apr_array_header_t *entries;
apr_int64_t children_mergeinfo = 0;
+ APR_ARRAY_PUSH(parent_nodes, dag_node_t*) = node;
SVN_ERR(svn_fs_fs__dag_dir_entries(&entries, node, pool));
/* Compute CHILDREN_MERGEINFO. */
- for (hi = apr_hash_first(pool, entries);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < entries->nelts; ++i)
{
- svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
+ svn_fs_dirent_t *dirent
+ = APR_ARRAY_IDX(entries, i, svn_fs_dirent_t *);
dag_node_t *child;
- svn_revnum_t child_rev;
apr_int64_t child_mergeinfo;
svn_pool_clear(iterpool);
/* Compute CHILD_REV. */
- SVN_ERR(svn_fs_fs__dag_get_node(&child, fs, dirent->id, iterpool));
- SVN_ERR(svn_fs_fs__dag_get_revision(&child_rev, child, iterpool));
-
- if (child_rev == rev)
- SVN_ERR(verify_node(child, rev, iterpool));
+ if (svn_fs_fs__id_rev(dirent->id) == rev)
+ {
+ SVN_ERR(svn_fs_fs__dag_get_node(&child, fs, dirent->id,
+ iterpool));
+ SVN_ERR(verify_node(child, rev, parent_nodes, iterpool));
+ SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&child_mergeinfo,
+ child));
+ }
+ else
+ {
+ /* access mergeinfo counter with minimal overhead */
+ node_revision_t *noderev;
+ SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, dirent->id,
+ iterpool, iterpool));
+ child_mergeinfo = noderev->mergeinfo_count;
+ }
- SVN_ERR(svn_fs_fs__dag_get_mergeinfo_count(&child_mergeinfo, child));
children_mergeinfo += child_mergeinfo;
}
@@ -4243,6 +4485,10 @@ verify_node(dag_node_t *node,
stringify_node(node, iterpool),
mergeinfo_count, has_mergeinfo,
children_mergeinfo);
+
+ /* If we don't make it here, there was an error / corruption.
+ * In that case, nobody will need PARENT_NODES anymore. */
+ apr_array_pop(parent_nodes);
}
svn_pool_destroy(iterpool);
@@ -4255,6 +4501,7 @@ svn_fs_fs__verify_root(svn_fs_root_t *root,
{
svn_fs_t *fs = root->fs;
dag_node_t *root_dir;
+ apr_array_header_t *parent_nodes;
/* Issue #4129: bogus pred-counts and minfo-cnt's on the root node-rev
(and elsewhere). This code makes more thorough checks than the
@@ -4270,16 +4517,16 @@ svn_fs_fs__verify_root(svn_fs_root_t *root,
if (root->is_txn_root)
{
fs_txn_root_data_t *frd = root->fsap_data;
- SVN_ERR(svn_fs_fs__dag_txn_root(&root_dir, fs, frd->txn_id, pool));
+ SVN_ERR(svn_fs_fs__dag_txn_root(&root_dir, fs, &frd->txn_id, pool));
}
else
{
- fs_rev_root_data_t *frd = root->fsap_data;
- root_dir = frd->root_dir;
+ root_dir = root->fsap_data;
}
/* Recursively verify ROOT_DIR. */
- SVN_ERR(verify_node(root_dir, root->rev, pool));
+ parent_nodes = apr_array_make(pool, 16, sizeof(dag_node_t *));
+ SVN_ERR(verify_node(root_dir, root->rev, parent_nodes, pool));
/* Verify explicitly the predecessor of the root. */
{
diff --git a/subversion/libsvn_fs_fs/tree.h b/subversion/libsvn_fs_fs/tree.h
index 34fa0a2..7ddfcd9 100644
--- a/subversion/libsvn_fs_fs/tree.h
+++ b/subversion/libsvn_fs_fs/tree.h
@@ -48,8 +48,7 @@ svn_error_t *svn_fs_fs__deltify(svn_fs_t *fs, svn_revnum_t rev,
/* Commit the transaction TXN as a new revision. Return the new
revision in *NEW_REV. If the transaction conflicts with other
changes return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a string
- that details the cause of the conflict. Perform temporary
- allocations in POOL. */
+ that details the cause of the conflict. */
svn_error_t *svn_fs_fs__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev, svn_fs_txn_t *txn,
apr_pool_t *pool);
@@ -91,6 +90,20 @@ svn_error_t *
svn_fs_fs__verify_root(svn_fs_root_t *root,
apr_pool_t *pool);
+svn_error_t *
+svn_fs_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);
+
+
+svn_error_t *
+svn_fs_fs__info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/libsvn_fs_fs/util.c b/subversion/libsvn_fs_fs/util.c
new file mode 100644
index 0000000..faa1e3d
--- /dev/null
+++ b/subversion/libsvn_fs_fs/util.c
@@ -0,0 +1,694 @@
+/* util.c --- utility functions for FSFS repo access
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_ctype.h"
+#include "svn_dirent_uri.h"
+#include "private/svn_string_private.h"
+
+#include "fs_fs.h"
+#include "pack.h"
+#include "util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+svn_boolean_t
+svn_fs_fs__is_packed_rev(svn_fs_t *fs,
+ svn_revnum_t rev)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ return (rev < ffd->min_unpacked_rev);
+}
+
+svn_boolean_t
+svn_fs_fs__is_packed_revprop(svn_fs_t *fs,
+ svn_revnum_t rev)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* rev 0 will not be packed */
+ return (rev < ffd->min_unpacked_rev)
+ && (rev != 0)
+ && (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT);
+}
+
+svn_revnum_t
+svn_fs_fs__packed_base_rev(svn_fs_t *fs,
+ svn_revnum_t revision)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ return (revision < ffd->min_unpacked_rev)
+ ? (revision - (revision % ffd->max_files_per_dir))
+ : revision;
+}
+
+const char *
+svn_fs_fs__path_txn_current(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_CURRENT, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_current_lock(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_CURRENT_LOCK, pool);
+}
+
+const char *
+svn_fs_fs__path_lock(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_LOCK_FILE, pool);
+}
+
+const char *
+svn_fs_fs__path_pack_lock(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_PACK_LOCK_FILE, pool);
+}
+
+const char *
+svn_fs_fs__path_revprop_generation(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_REVPROP_GENERATION, pool);
+}
+
+const char *
+svn_fs_fs__path_rev_packed(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *kind,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ assert(ffd->max_files_per_dir);
+ assert(svn_fs_fs__is_packed_rev(fs, rev));
+
+ return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
+ apr_psprintf(pool,
+ "%ld" PATH_EXT_PACKED_SHARD,
+ rev / ffd->max_files_per_dir),
+ kind, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_rev_shard(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ assert(ffd->max_files_per_dir);
+ return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
+ apr_psprintf(pool, "%ld",
+ rev / ffd->max_files_per_dir),
+ SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_rev(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ assert(! svn_fs_fs__is_packed_rev(fs, rev));
+
+ if (ffd->max_files_per_dir)
+ {
+ return svn_dirent_join(svn_fs_fs__path_rev_shard(fs, rev, pool),
+ apr_psprintf(pool, "%ld", rev),
+ pool);
+ }
+
+ return svn_dirent_join_many(pool, fs->path, PATH_REVS_DIR,
+ apr_psprintf(pool, "%ld", rev), SVN_VA_NULL);
+}
+
+/* Set *PATH to the path of REV in FS with PACKED selecting whether the
+ (potential) pack file or single revision file name is returned.
+ Allocate *PATH in POOL.
+*/
+static const char *
+path_rev_absolute_internal(svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t packed,
+ apr_pool_t *pool)
+{
+ return packed
+ ? svn_fs_fs__path_rev_packed(fs, rev, PATH_PACKED, pool)
+ : svn_fs_fs__path_rev(fs, rev, pool);
+}
+
+const char *
+svn_fs_fs__path_rev_absolute(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_packed = ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT
+ && svn_fs_fs__is_packed_rev(fs, rev);
+
+ return path_rev_absolute_internal(fs, rev, is_packed, pool);
+}
+
+const char *
+svn_fs_fs__path_revprops_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ assert(ffd->max_files_per_dir);
+ return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
+ apr_psprintf(pool, "%ld",
+ rev / ffd->max_files_per_dir),
+ SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_revprops_pack_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ assert(ffd->max_files_per_dir);
+ return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
+ apr_psprintf(pool, "%ld" PATH_EXT_PACKED_SHARD,
+ rev / ffd->max_files_per_dir),
+ SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_revprops(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ if (ffd->max_files_per_dir)
+ {
+ return svn_dirent_join(svn_fs_fs__path_revprops_shard(fs, rev, pool),
+ apr_psprintf(pool, "%ld", rev),
+ pool);
+ }
+
+ return svn_dirent_join_many(pool, fs->path, PATH_REVPROPS_DIR,
+ apr_psprintf(pool, "%ld", rev), SVN_VA_NULL);
+}
+
+/* Return TO_ADD appended to the C string representation of TXN_ID.
+ * Allocate the result in POOL.
+ */
+static const char *
+combine_txn_id_string(const svn_fs_fs__id_part_t *txn_id,
+ const char *to_add,
+ apr_pool_t *pool)
+{
+ return apr_pstrcat(pool, svn_fs_fs__id_txn_unparse(txn_id, pool),
+ to_add, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_txns_dir(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXNS_DIR, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_dir(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ SVN_ERR_ASSERT_NO_RETURN(txn_id != NULL);
+ return svn_dirent_join(svn_fs_fs__path_txns_dir(fs, pool),
+ combine_txn_id_string(txn_id, PATH_EXT_TXN, pool),
+ pool);
+}
+
+const char*
+svn_fs_fs__path_l2p_proto_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_INDEX PATH_EXT_L2P_INDEX, pool);
+}
+
+const char*
+svn_fs_fs__path_p2l_proto_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_INDEX PATH_EXT_P2L_INDEX, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_item_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_TXN_ITEM_INDEX, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_proto_revs(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_PROTOS_DIR, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_proto_rev(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
+ return svn_dirent_join(svn_fs_fs__path_txn_proto_revs(fs, pool),
+ combine_txn_id_string(txn_id, PATH_EXT_REV, pool),
+ pool);
+ else
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_REV, pool);
+}
+
+
+const char *
+svn_fs_fs__path_txn_proto_rev_lock(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ if (ffd->format >= SVN_FS_FS__MIN_PROTOREVS_DIR_FORMAT)
+ return svn_dirent_join(svn_fs_fs__path_txn_proto_revs(fs, pool),
+ combine_txn_id_string(txn_id, PATH_EXT_REV_LOCK,
+ pool),
+ pool);
+ else
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
+ PATH_REV_LOCK, pool);
+}
+
+const char *
+svn_fs_fs__path_txn_node_rev(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool)
+{
+ char *filename = (char *)svn_fs_fs__id_unparse(id, pool)->data;
+ *strrchr(filename, '.') = '\0';
+
+ return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, svn_fs_fs__id_txn_id(id),
+ pool),
+ apr_psprintf(pool, PATH_PREFIX_NODE "%s",
+ filename),
+ pool);
+}
+
+const char *
+svn_fs_fs__path_txn_node_props(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool)
+{
+ return apr_pstrcat(pool, svn_fs_fs__path_txn_node_rev(fs, id, pool),
+ PATH_EXT_PROPS, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_txn_node_children(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool)
+{
+ return apr_pstrcat(pool, svn_fs_fs__path_txn_node_rev(fs, id, pool),
+ PATH_EXT_CHILDREN, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_node_origin(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *node_id,
+ apr_pool_t *pool)
+{
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__ui64tobase36(buffer, node_id->number);
+
+ if (len > 1)
+ buffer[len - 1] = '\0';
+
+ return svn_dirent_join_many(pool, fs->path, PATH_NODE_ORIGINS_DIR,
+ buffer, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_fs__path_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(fs->path, PATH_MIN_UNPACKED_REV, pool);
+}
+
+svn_error_t *
+svn_fs_fs__check_file_buffer_numeric(const char *buf,
+ apr_off_t offset,
+ const char *path,
+ const char *title,
+ apr_pool_t *pool)
+{
+ const char *p;
+
+ for (p = buf + offset; *p; p++)
+ if (!svn_ctype_isdigit(*p))
+ return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
+ _("%s file '%s' contains unexpected non-digit '%c' within '%s'"),
+ title, svn_dirent_local_style(path, pool), *p, buf);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ char buf[80];
+ apr_file_t *file;
+ apr_size_t len;
+
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_fs__path_min_unpacked_rev(fs, pool),
+ APR_READ | APR_BUFFERED,
+ APR_OS_DEFAULT,
+ pool));
+ len = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(file, buf, &len, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ SVN_ERR(svn_revnum_parse(min_unpacked_rev, buf, NULL));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__update_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ SVN_ERR_ASSERT(ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT);
+
+ return svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, fs, pool);
+}
+
+svn_error_t *
+svn_fs_fs__write_min_unpacked_rev(svn_fs_t *fs,
+ svn_revnum_t revnum,
+ apr_pool_t *scratch_pool)
+{
+ const char *final_path;
+ char buf[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__i64toa(buf, revnum);
+ buf[len] = '\n';
+
+ final_path = svn_fs_fs__path_min_unpacked_rev(fs, scratch_pool);
+
+ SVN_ERR(svn_io_write_atomic(final_path, buf, len + 1,
+ final_path /* copy_perms */, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_current(svn_revnum_t *rev,
+ apr_uint64_t *next_node_id,
+ apr_uint64_t *next_copy_id,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *content;
+
+ SVN_ERR(svn_fs_fs__read_content(&content,
+ svn_fs_fs__path_current(fs, pool),
+ pool));
+
+ if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ {
+ /* When format 1 and 2 filesystems are upgraded, the 'current' file is
+ left intact. As a consequence, there is a window when a filesystem
+ has a new format, but this file still contains the IDs left from an
+ old format, i.e. looks like "359 j5 v\n". Do not be too strict here
+ and only expect a parseable revision number. */
+ SVN_ERR(svn_revnum_parse(rev, content->data, NULL));
+
+ *next_node_id = 0;
+ *next_copy_id = 0;
+ }
+ else
+ {
+ const char *str;
+
+ SVN_ERR(svn_revnum_parse(rev, content->data, &str));
+ if (*str != ' ')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Corrupt 'current' file"));
+
+ *next_node_id = svn__base36toui64(&str, str + 1);
+ if (*str != ' ')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Corrupt 'current' file"));
+
+ *next_copy_id = svn__base36toui64(&str, str + 1);
+ if (*str != '\n')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Corrupt 'current' file"));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__write_current(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint64_t next_node_id,
+ apr_uint64_t next_copy_id,
+ apr_pool_t *pool)
+{
+ char *buf;
+ const char *name;
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ /* Now we can just write out this line. */
+ if (ffd->format >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT)
+ {
+ buf = apr_psprintf(pool, "%ld\n", rev);
+ }
+ else
+ {
+ char node_id_str[SVN_INT64_BUFFER_SIZE];
+ char copy_id_str[SVN_INT64_BUFFER_SIZE];
+ svn__ui64tobase36(node_id_str, next_node_id);
+ svn__ui64tobase36(copy_id_str, next_copy_id);
+
+ buf = apr_psprintf(pool, "%ld %s %s\n", rev, node_id_str, copy_id_str);
+ }
+
+ name = svn_fs_fs__path_current(fs, pool);
+ SVN_ERR(svn_io_write_atomic(name, buf, strlen(buf),
+ name /* copy_perms_path */, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__try_stringbuf_from_file(svn_stringbuf_t **content,
+ svn_boolean_t *missing,
+ const char *path,
+ svn_boolean_t last_attempt,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = svn_stringbuf_from_file2(content, path, pool);
+ if (missing)
+ *missing = FALSE;
+
+ if (err)
+ {
+ *content = NULL;
+
+ if (APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ if (!last_attempt)
+ {
+ svn_error_clear(err);
+ if (missing)
+ *missing = TRUE;
+ return SVN_NO_ERROR;
+ }
+ }
+#ifdef ESTALE
+ else if (APR_TO_OS_ERROR(err->apr_err) == ESTALE
+ || APR_TO_OS_ERROR(err->apr_err) == EIO)
+ {
+ if (!last_attempt)
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ }
+#endif
+ }
+
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_fs_fs__get_file_offset(apr_off_t *offset_p,
+ apr_file_t *file,
+ apr_pool_t *pool)
+{
+ apr_off_t offset;
+
+ /* Note that, for buffered files, one (possibly surprising) side-effect
+ of this call is to flush any unwritten data to disk. */
+ offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_CUR, &offset, pool));
+ *offset_p = offset;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_content(svn_stringbuf_t **content,
+ const char *fname,
+ apr_pool_t *pool)
+{
+ int i;
+ *content = NULL;
+
+ for (i = 0; !*content && (i < SVN_FS_FS__RECOVERABLE_RETRY_COUNT); ++i)
+ SVN_ERR(svn_fs_fs__try_stringbuf_from_file(content, NULL,
+ fname, i + 1 < SVN_FS_FS__RECOVERABLE_RETRY_COUNT,
+ pool));
+
+ if (!*content)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't read '%s'"),
+ svn_dirent_local_style(fname, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__read_number_from_stream(apr_int64_t *result,
+ svn_boolean_t *hit_eof,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *sb;
+ svn_boolean_t eof;
+ svn_error_t *err;
+
+ SVN_ERR(svn_stream_readline(stream, &sb, "\n", &eof, scratch_pool));
+ if (hit_eof)
+ *hit_eof = eof;
+ else
+ if (eof)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL, _("Unexpected EOF"));
+
+ if (!eof)
+ {
+ err = svn_cstring_atoi64(result, sb->data);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ _("Number '%s' invalid or too large"),
+ sb->data);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__move_into_place(const char *old_filename,
+ const char *new_filename,
+ const char *perms_reference,
+ apr_pool_t *pool)
+{
+ svn_error_t *err;
+
+ SVN_ERR(svn_io_copy_perms(perms_reference, old_filename, pool));
+
+ /* Move the file into place. */
+ err = svn_io_file_rename(old_filename, new_filename, pool);
+ if (err && APR_STATUS_IS_EXDEV(err->apr_err))
+ {
+ apr_file_t *file;
+
+ /* Can't rename across devices; fall back to copying. */
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ SVN_ERR(svn_io_copy_file(old_filename, new_filename, TRUE, pool));
+
+ /* Flush the target of the copy to disk. */
+ SVN_ERR(svn_io_file_open(&file, new_filename, APR_READ,
+ APR_OS_DEFAULT, pool));
+ /* ### BH: Does this really guarantee a flush of the data written
+ ### via a completely different handle on all operating systems?
+ ###
+ ### Maybe we should perform the copy ourselves instead of making
+ ### apr do that and flush the real handle? */
+ SVN_ERR(svn_io_file_flush_to_disk(file, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ }
+ if (err)
+ return svn_error_trace(err);
+
+#ifdef __linux__
+ {
+ /* Linux has the unusual feature that fsync() on a file is not
+ enough to ensure that a file's directory entries have been
+ flushed to disk; you have to fsync the directory as well.
+ On other operating systems, we'd only be asking for trouble
+ by trying to open and fsync a directory. */
+ const char *dirname;
+ apr_file_t *file;
+
+ dirname = svn_dirent_dirname(new_filename, pool);
+ SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT,
+ pool));
+ SVN_ERR(svn_io_file_flush_to_disk(file, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ }
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_fs_fs__use_log_addressing(svn_fs_t *fs)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ return ffd->use_log_addressing;
+}
diff --git a/subversion/libsvn_fs_fs/util.h b/subversion/libsvn_fs_fs/util.h
new file mode 100644
index 0000000..328dfbc
--- /dev/null
+++ b/subversion/libsvn_fs_fs/util.h
@@ -0,0 +1,408 @@
+/* util.h --- utility functions for FSFS repo access
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__UTIL_H
+#define SVN_LIBSVN_FS__UTIL_H
+
+#include "svn_fs.h"
+#include "id.h"
+
+/* Functions for dealing with recoverable errors on mutable files
+ *
+ * Revprops, current, and txn-current files are mutable; that is, they
+ * change as part of normal fsfs operation, in constrat to revs files, or
+ * the format file, which are written once at create (or upgrade) time.
+ * When more than one host writes to the same repository, we will
+ * sometimes see these recoverable errors when accesssing these files.
+ *
+ * These errors all relate to NFS, and thus we only use this retry code if
+ * ESTALE is defined.
+ *
+ ** ESTALE
+ *
+ * In NFS v3 and under, the server doesn't track opened files. If you
+ * unlink(2) or rename(2) a file held open by another process *on the
+ * same host*, that host's kernel typically renames the file to
+ * .nfsXXXX and automatically deletes that when it's no longer open,
+ * but this behavior is not required.
+ *
+ * For obvious reasons, this does not work *across hosts*. No one
+ * knows about the opened file; not the server, and not the deleting
+ * client. So the file vanishes, and the reader gets stale NFS file
+ * handle.
+ *
+ ** EIO, ENOENT
+ *
+ * Some client implementations (at least the 2.6.18.5 kernel that ships
+ * with Ubuntu Dapper) sometimes give spurious ENOENT (only on open) or
+ * even EIO errors when trying to read these files that have been renamed
+ * over on some other host.
+ *
+ ** Solution
+ *
+ * Try open and read of such files in try_stringbuf_from_file(). Call
+ * this function within a loop of SVN_FS_FS__RECOVERABLE_RETRY_COUNT
+ * iterations (though, realistically, the second try will succeed).
+ */
+
+#define SVN_FS_FS__RECOVERABLE_RETRY_COUNT 10
+
+/* Return TRUE is REV is packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_fs__is_packed_rev(svn_fs_t *fs,
+ svn_revnum_t rev);
+
+/* Return TRUE is REV's props have been packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_fs__is_packed_revprop(svn_fs_t *fs,
+ svn_revnum_t rev);
+
+/* Return the first revision in the pack / rev file containing REVISION in
+ * filesystem FS. For non-packed revs, this will simply be REVISION. */
+svn_revnum_t
+svn_fs_fs__packed_base_rev(svn_fs_t *fs,
+ svn_revnum_t revision);
+
+/* Return the full path of the rev shard directory that will contain
+ * revision REV in FS. Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_rev_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the full path of the non-packed rev file containing revision REV
+ * in FS. Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_rev(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the path of the pack-related file that for revision REV in FS.
+ * KIND specifies the file name base, e.g. "manifest" or "pack".
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_rev_packed(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *kind,
+ apr_pool_t *pool);
+
+/* Return the full path of the "txn-current" file in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_current(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the full path of the "txn-current-lock" file in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_current_lock(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the full path of the global write lock file in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_lock(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the full path of the pack operation lock file in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_pack_lock(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the full path of the revprop generation file in FS.
+ * Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_revprop_generation(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the full path of the revision properties pack shard directory
+ * that will contain the packed properties of revision REV in FS.
+ * Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_revprops_pack_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Set *PATH to the path of REV in FS, whether in a pack file or not.
+ Allocate *PATH in POOL.
+
+ Note: If the caller does not have the write lock on FS, then the path is
+ not guaranteed to be correct or to remain correct after the function
+ returns, because the revision might become packed before or after this
+ call. If a file exists at that path, then it is correct; if not, then
+ the caller should call update_min_unpacked_rev() and re-try once. */
+const char *
+svn_fs_fs__path_rev_absolute(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the full path of the revision properties shard directory that
+ * will contain the properties of revision REV in FS.
+ * Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_revprops_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the full path of the non-packed revision properties file that
+ * contains the props for revision REV in FS. Allocate the result in POOL.
+ */
+const char *
+svn_fs_fs__path_revprops(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Return the path of the file storing the oldest non-packed revision in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the path of the 'transactions' directory in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txns_dir(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the path of the directory containing the transaction TXN_ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_dir(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the 'txn-protorevs' directory in FS, even if that
+ * folder may not exist in FS. The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_proto_revs(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Return the path of the proto-revision file for transaction TXN_ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_proto_rev(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the proto-revision lock file for transaction TXN_ID
+ * in FS. The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_proto_rev_lock(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the in-transaction node revision
+ * identified by ID in FS. The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_node_rev(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the in-transaction properties of
+ * the node identified by ID in FS. The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_node_props(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the directory entries of the
+ * in-transaction directory node identified by ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_node_children(svn_fs_t *fs,
+ const svn_fs_id_t *id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the log-to-phys index for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char*
+svn_fs_fs__path_l2p_proto_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the phys-to-log index for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char*
+svn_fs_fs__path_p2l_proto_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing item_index counter for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_txn_item_index(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *txn_id,
+ apr_pool_t *pool);
+
+/* Return the path of the file containing the node origins cachs for
+ * the given NODE_ID in FS. The result will be allocated in POOL.
+ */
+const char *
+svn_fs_fs__path_node_origin(svn_fs_t *fs,
+ const svn_fs_fs__id_part_t *node_id,
+ apr_pool_t *pool);
+
+/* Set *MIN_UNPACKED_REV to the integer value read from the file returned
+ * by #svn_fs_fs__path_min_unpacked_rev() for FS.
+ * Use POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Check that BUF, a nul-terminated buffer of text from file PATH,
+ contains only digits at OFFSET and beyond, raising an error if not.
+ TITLE contains a user-visible description of the file, usually the
+ short file name.
+
+ Uses POOL for temporary allocation. */
+svn_error_t *
+svn_fs_fs__check_file_buffer_numeric(const char *buf,
+ apr_off_t offset,
+ const char *path,
+ const char *title,
+ apr_pool_t *pool);
+
+/* Re-read the MIN_UNPACKED_REV member of FS from disk.
+ * Use POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__update_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Atomically update the 'min-unpacked-rev' file in FS to hold the specifed
+ * REVNUM. Perform temporary allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_fs__write_min_unpacked_rev(svn_fs_t *fs,
+ svn_revnum_t revnum,
+ apr_pool_t *scratch_pool);
+
+/* Set *REV, *NEXT_NODE_ID and *NEXT_COPY_ID to the values read from the
+ * 'current' file. For new FS formats, which only store the youngest
+ * revision, set the *NEXT_NODE_ID and *NEXT_COPY_ID to 0. Perform
+ * temporary allocations in POOL.
+ */
+svn_error_t *
+svn_fs_fs__read_current(svn_revnum_t *rev,
+ apr_uint64_t *next_node_id,
+ apr_uint64_t *next_copy_id,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Atomically update the 'current' file to hold the specifed REV,
+ NEXT_NODE_ID, and NEXT_COPY_ID. (The two next-ID parameters are
+ ignored and may be 0 if the FS format does not use them.)
+ Perform temporary allocations in POOL. */
+svn_error_t *
+svn_fs_fs__write_current(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint64_t next_node_id,
+ apr_uint64_t next_copy_id,
+ apr_pool_t *pool);
+
+/* Read the file at PATH and return its content in *CONTENT. *CONTENT will
+ * not be modified unless the whole file was read successfully.
+ *
+ * ESTALE, EIO and ENOENT will not cause this function to return an error
+ * unless LAST_ATTEMPT has been set. If MISSING is not NULL, indicate
+ * missing files (ENOENT) there.
+ *
+ * Use POOL for allocations.
+ */
+svn_error_t *
+svn_fs_fs__try_stringbuf_from_file(svn_stringbuf_t **content,
+ svn_boolean_t *missing,
+ const char *path,
+ svn_boolean_t last_attempt,
+ apr_pool_t *pool);
+
+/* Fetch the current offset of FILE into *OFFSET_P. */
+svn_error_t *
+svn_fs_fs__get_file_offset(apr_off_t *offset_p,
+ apr_file_t *file,
+ apr_pool_t *pool);
+
+/* Read the file FNAME and store the contents in *BUF.
+ Allocations are performed in POOL. */
+svn_error_t *
+svn_fs_fs__read_content(svn_stringbuf_t **content,
+ const char *fname,
+ apr_pool_t *pool);
+
+/* Reads a line from STREAM and converts it to a 64 bit integer to be
+ * returned in *RESULT. If we encounter eof, set *HIT_EOF and leave
+ * *RESULT unchanged. If HIT_EOF is NULL, EOF causes an "corrupt FS"
+ * error return.
+ * SCRATCH_POOL is used for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__read_number_from_stream(apr_int64_t *result,
+ svn_boolean_t *hit_eof,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool);
+
+/* Move a file into place from OLD_FILENAME in the transactions
+ directory to its final location NEW_FILENAME in the repository. On
+ Unix, match the permissions of the new file to the permissions of
+ PERMS_REFERENCE. Temporary allocations are from POOL.
+
+ This function almost duplicates svn_io_file_move(), but it tries to
+ guarantee a flush. */
+svn_error_t *
+svn_fs_fs__move_into_place(const char *old_filename,
+ const char *new_filename,
+ const char *perms_reference,
+ apr_pool_t *pool);
+
+/* Return TRUE, iff FS uses logical addressing. */
+svn_boolean_t
+svn_fs_fs__use_log_addressing(svn_fs_t *fs);
+
+#endif
diff --git a/subversion/libsvn_fs_fs/verify.c b/subversion/libsvn_fs_fs/verify.c
new file mode 100644
index 0000000..0fa314b
--- /dev/null
+++ b/subversion/libsvn_fs_fs/verify.c
@@ -0,0 +1,883 @@
+/* verify.c --- verification of FSFS filesystems
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_sorts.h"
+#include "svn_checksum.h"
+#include "svn_time.h"
+#include "private/svn_subr_private.h"
+
+#include "verify.h"
+#include "fs_fs.h"
+
+#include "cached_data.h"
+#include "rep-cache.h"
+#include "util.h"
+#include "index.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+
+/** Verifying. **/
+
+/* Baton type expected by verify_walker(). The purpose is to reuse open
+ * rev / pack file handles between calls. Its contents need to be cleaned
+ * periodically to limit resource usage.
+ */
+typedef struct verify_walker_baton_t
+{
+ /* number of calls to verify_walker() since the last clean */
+ int iteration_count;
+
+ /* number of files opened since the last clean */
+ int file_count;
+
+ /* progress notification callback to invoke periodically (may be NULL) */
+ svn_fs_progress_notify_func_t notify_func;
+
+ /* baton to use with NOTIFY_FUNC */
+ void *notify_baton;
+
+ /* remember the last revision for which we called notify_func */
+ svn_revnum_t last_notified_revision;
+
+ /* cached hint for successive calls to svn_fs_fs__check_rep() */
+ void *hint;
+
+ /* pool to use for the file handles etc. */
+ apr_pool_t *pool;
+} verify_walker_baton_t;
+
+/* Used by svn_fs_fs__verify().
+ Implements svn_fs_fs__walk_rep_reference().walker. */
+static svn_error_t *
+verify_walker(representation_t *rep,
+ void *baton,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ verify_walker_baton_t *walker_baton = baton;
+ void *previous_hint;
+
+ /* notify and free resources periodically */
+ if ( walker_baton->iteration_count > 1000
+ || walker_baton->file_count > 16)
+ {
+ if ( walker_baton->notify_func
+ && rep->revision != walker_baton->last_notified_revision)
+ {
+ walker_baton->notify_func(rep->revision,
+ walker_baton->notify_baton,
+ scratch_pool);
+ walker_baton->last_notified_revision = rep->revision;
+ }
+
+ svn_pool_clear(walker_baton->pool);
+
+ walker_baton->iteration_count = 0;
+ walker_baton->file_count = 0;
+ walker_baton->hint = NULL;
+ }
+
+ /* access the repo data */
+ previous_hint = walker_baton->hint;
+ SVN_ERR(svn_fs_fs__check_rep(rep, fs, &walker_baton->hint,
+ walker_baton->pool));
+
+ /* update resource usage counters */
+ walker_baton->iteration_count++;
+ if (previous_hint != walker_baton->hint)
+ walker_baton->file_count++;
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify the rep cache DB's consistency with our rev / pack data.
+ * The function signature is similar to svn_fs_fs__verify.
+ * The values of START and END have already been auto-selected and
+ * verified.
+ */
+static svn_error_t *
+verify_rep_cache(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_boolean_t exists;
+
+ /* rep-cache verification. */
+ SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, fs, pool));
+ if (exists)
+ {
+ /* provide a baton to allow the reuse of open file handles between
+ iterations (saves 2/3 of OS level file operations). */
+ verify_walker_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
+ baton->pool = svn_pool_create(pool);
+ baton->last_notified_revision = SVN_INVALID_REVNUM;
+ baton->notify_func = notify_func;
+ baton->notify_baton = notify_baton;
+
+ /* tell the user that we are now ready to do *something* */
+ if (notify_func)
+ notify_func(SVN_INVALID_REVNUM, notify_baton, baton->pool);
+
+ /* Do not attempt to walk the rep-cache database if its file does
+ not exist, since doing so would create it --- which may confuse
+ the administrator. Don't take any lock. */
+ SVN_ERR(svn_fs_fs__walk_rep_reference(fs, start, end,
+ verify_walker, baton,
+ cancel_func, cancel_baton,
+ pool));
+
+ /* walker resource cleanup */
+ svn_pool_destroy(baton->pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the MD5 checksum of the data between offsets START and END
+ * in FILE matches the EXPECTED checksum. If there is a mismatch use the
+ * indedx NAME in the error message. Supports cancellation with CANCEL_FUNC
+ * and CANCEL_BATON. SCRATCH_POOL is for temporary allocations. */
+static svn_error_t *
+verify_index_checksum(apr_file_t *file,
+ const char *name,
+ apr_off_t start,
+ apr_off_t end,
+ svn_checksum_t *expected,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[SVN__STREAM_CHUNK_SIZE];
+ apr_off_t size = end - start;
+ svn_checksum_t *actual;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
+
+ /* Calculate the index checksum. */
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &start, scratch_pool));
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(file, buffer, to_read, NULL, NULL,
+ scratch_pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ SVN_ERR(svn_checksum_final(&actual, context, scratch_pool));
+
+ /* Verify that it matches the expected checksum. */
+ if (!svn_checksum_match(expected, actual))
+ {
+ const char *file_name;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, scratch_pool));
+ SVN_ERR(svn_checksum_mismatch_err(expected, actual, scratch_pool,
+ _("%s checksum mismatch in file %s"),
+ name, file_name));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify the MD5 checksums of the index data in the rev / pack file
+ * containing revision START in FS. If given, invoke CANCEL_FUNC with
+ * CANCEL_BATON at regular intervals. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+verify_index_checksums(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_fs__revision_file_t *rev_file;
+
+ /* Open the rev / pack file and read the footer */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, start,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+
+ /* Verify the index contents against the checksum from the footer. */
+ SVN_ERR(verify_index_checksum(rev_file->file, "L2P index",
+ rev_file->l2p_offset, rev_file->p2l_offset,
+ rev_file->l2p_checksum,
+ cancel_func, cancel_baton, scratch_pool));
+ SVN_ERR(verify_index_checksum(rev_file->file, "P2L index",
+ rev_file->p2l_offset, rev_file->footer_offset,
+ rev_file->p2l_checksum,
+ cancel_func, cancel_baton, scratch_pool));
+
+ /* Done. */
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all log-to-phys index entries for revisions START to
+ * START + COUNT-1 in FS there is a consistent entry in the phys-to-log
+ * index. If given, invoke CANCEL_FUNC with CANCEL_BATON at regular
+ * intervals. Use POOL for allocations.
+ */
+static svn_error_t *
+compare_l2p_to_p2l_index(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_revnum_t i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_array_header_t *max_ids;
+
+ /* common file access structure */
+ svn_fs_fs__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, start, pool,
+ iterpool));
+
+ /* determine the range of items to check for each revision */
+ SVN_ERR(svn_fs_fs__l2p_get_max_ids(&max_ids, fs, start, count, pool,
+ iterpool));
+
+ /* check all items in all revisions if the given range */
+ for (i = 0; i < max_ids->nelts; ++i)
+ {
+ apr_uint64_t k;
+ apr_uint64_t max_id = APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
+ svn_revnum_t revision = start + i;
+
+ for (k = 0; k < max_id; ++k)
+ {
+ apr_off_t offset;
+ svn_fs_fs__p2l_entry_t *p2l_entry;
+ svn_pool_clear(iterpool);
+
+ /* get L2P entry. Ignore unused entries. */
+ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, revision,
+ NULL, k, iterpool));
+ if (offset == -1)
+ continue;
+
+ /* find the corresponding P2L entry */
+ SVN_ERR(svn_fs_fs__p2l_entry_lookup(&p2l_entry, fs, rev_file,
+ revision, offset, iterpool,
+ iterpool));
+
+ if (p2l_entry == NULL)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index entry not found for "
+ "PHYS %s returned by "
+ "l2p index for LOG r%ld:i%ld"),
+ apr_off_t_toa(pool, offset),
+ revision, (long)k);
+
+ if ( p2l_entry->item.number != k
+ || p2l_entry->item.revision != revision)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index info LOG r%ld:i%ld"
+ " does not match "
+ "l2p index for LOG r%ld:i%ld"),
+ p2l_entry->item.revision,
+ (long)p2l_entry->item.number,
+ revision, (long)k);
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all phys-to-log index entries for revisions START to
+ * START + COUNT-1 in FS there is a consistent entry in the log-to-phys
+ * index. If given, invoke CANCEL_FUNC with CANCEL_BATON at regular
+ * intervals. Use POOL for allocations.
+ *
+ * Please note that we can only check on pack / rev file granularity and
+ * must only be called for a single rev / pack file.
+ */
+static svn_error_t *
+compare_p2l_to_l2p_index(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_off_t max_offset;
+ apr_off_t offset = 0;
+
+ /* common file access structure */
+ svn_fs_fs__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, start, pool,
+ iterpool));
+
+ /* get the size of the rev / pack file as covered by the P2L index */
+ SVN_ERR(svn_fs_fs__p2l_get_max_offset(&max_offset, fs, rev_file, start,
+ pool));
+
+ /* for all offsets in the file, get the P2L index entries and check
+ them against the L2P index */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+ svn_fs_fs__p2l_entry_t *last_entry;
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ /* get all entries for the current block */
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, fs, rev_file, start,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+ if (entries->nelts == 0)
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION,
+ NULL,
+ _("p2l does not cover offset %s"
+ " for revision %ld"),
+ apr_off_t_toa(pool, offset), start);
+
+ /* process all entries (and later continue with the next block) */
+ last_entry
+ = &APR_ARRAY_IDX(entries, entries->nelts-1, svn_fs_fs__p2l_entry_t);
+ offset = last_entry->offset + last_entry->size;
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+
+ /* check all sub-items for consist entries in the L2P index */
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ {
+ /* There is no L2P entry for unused rev file sections.
+ * And its P2L index data is hardly ever used. But we
+ * should still check whether someone tempered with it. */
+ if ( entry->item.revision != SVN_INVALID_REVNUM
+ && ( entry->item.revision < start
+ || entry->item.revision >= start + count))
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("Empty P2L entry for PHYS %s "
+ "refers to revision %ld outside "
+ "the rev / pack file (%ld-%ld)"),
+ apr_off_t_toa(pool, entry->offset),
+ entry->item.revision,
+ start, start + count - 1);
+ }
+ else
+ {
+ apr_off_t l2p_offset;
+ SVN_ERR(svn_fs_fs__item_offset(&l2p_offset, fs, rev_file,
+ entry->item.revision, NULL,
+ entry->item.number, iterpool));
+
+ if (l2p_offset != entry->offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("l2p index entry PHYS %s"
+ "does not match p2l index value "
+ "LOG r%ld:i%ld for PHYS %s"),
+ apr_off_t_toa(pool, l2p_offset),
+ entry->item.revision,
+ (long)entry->item.number,
+ apr_off_t_toa(pool, entry->offset));
+ }
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Items smaller than this can be read at once into a buffer and directly
+ * be checksummed. Larger items require stream processing.
+ * Must be a multiple of 8. */
+#define STREAM_THRESHOLD 4096
+
+/* Verify that the next SIZE bytes read from FILE are NUL.
+ * SIZE must not exceed STREAM_THRESHOLD. Use POOL for allocations.
+ */
+static svn_error_t *
+expect_buffer_nul(apr_file_t *file,
+ apr_off_t size,
+ apr_pool_t *pool)
+{
+ union
+ {
+ unsigned char buffer[STREAM_THRESHOLD];
+ apr_uint64_t chunks[STREAM_THRESHOLD / sizeof(apr_uint64_t)];
+ } data;
+
+ apr_size_t i;
+ SVN_ERR_ASSERT(size <= STREAM_THRESHOLD);
+
+ /* read the whole data block; error out on failure */
+ data.chunks[(size - 1)/ sizeof(apr_uint64_t)] = 0;
+ SVN_ERR(svn_io_file_read_full2(file, data.buffer, size, NULL, NULL, pool));
+
+ /* chunky check */
+ for (i = 0; i < size / sizeof(apr_uint64_t); ++i)
+ if (data.chunks[i] != 0)
+ break;
+
+ /* byte-wise check upon mismatch or at the end of the block */
+ for (i *= sizeof(apr_uint64_t); i < size; ++i)
+ if (data.buffer[i] != 0)
+ {
+ const char *file_name;
+ apr_off_t offset;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, pool));
+ SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, pool));
+ offset -= size - i;
+
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Empty section in file %s contains "
+ "non-NUL data at offset %s"),
+ file_name, apr_off_t_toa(pool, offset));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the next SIZE bytes read from FILE are NUL.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+read_all_nul(apr_file_t *file,
+ apr_off_t size,
+ apr_pool_t *pool)
+{
+ for (; size >= STREAM_THRESHOLD; size -= STREAM_THRESHOLD)
+ SVN_ERR(expect_buffer_nul(file, STREAM_THRESHOLD, pool));
+
+ if (size)
+ SVN_ERR(expect_buffer_nul(file, size, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Compare the ACTUAL checksum with the one expected by ENTRY.
+ * Return an error in case of mismatch. Use the name of FILE
+ * in error message. Allocate data in POOL.
+ */
+static svn_error_t *
+expected_checksum(apr_file_t *file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_uint32_t actual,
+ apr_pool_t *pool)
+{
+ if (actual != entry->fnv1_checksum)
+ {
+ const char *file_name;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, pool));
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Checksum mismatch in item at offset %s of "
+ "length %s bytes in file %s"),
+ apr_off_t_toa(pool, entry->offset),
+ apr_off_t_toa(pool, entry->size), file_name);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the FNV checksum over the next ENTRY->SIZE bytes read
+ * from FILE will match ENTRY's expected checksum. SIZE must not
+ * exceed STREAM_THRESHOLD. Use POOL for allocations.
+ */
+static svn_error_t *
+expected_buffered_checksum(apr_file_t *file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ unsigned char buffer[STREAM_THRESHOLD];
+ SVN_ERR_ASSERT(entry->size <= STREAM_THRESHOLD);
+
+ SVN_ERR(svn_io_file_read_full2(file, buffer, (apr_size_t)entry->size,
+ NULL, NULL, pool));
+ SVN_ERR(expected_checksum(file, entry,
+ svn__fnv1a_32x4(buffer, (apr_size_t)entry->size),
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the FNV checksum over the next ENTRY->SIZE bytes read from
+ * FILE will match ENTRY's expected checksum. Use POOL for allocations.
+ */
+static svn_error_t *
+expected_streamed_checksum(apr_file_t *file,
+ svn_fs_fs__p2l_entry_t *entry,
+ apr_pool_t *pool)
+{
+ unsigned char buffer[STREAM_THRESHOLD];
+ svn_checksum_t *checksum;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, pool);
+ apr_off_t size = entry->size;
+
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(file, buffer, to_read, NULL, NULL,
+ pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+ }
+
+ SVN_ERR(svn_checksum_final(&checksum, context, pool));
+ SVN_ERR(expected_checksum(file, entry,
+ ntohl(*(const apr_uint32_t *)checksum->digest),
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all phys-to-log index entries for revisions START to
+ * START + COUNT-1 in FS match the actual pack / rev file contents.
+ * If given, invoke CANCEL_FUNC with CANCEL_BATON at regular intervals.
+ * Use POOL for allocations.
+ *
+ * Please note that we can only check on pack / rev file granularity and
+ * must only be called for a single rev / pack file.
+ */
+static svn_error_t *
+compare_p2l_to_rev(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_off_t max_offset;
+ apr_off_t offset = 0;
+ svn_fs_fs__revision_file_t *rev_file;
+
+ /* open the pack / rev file that is covered by the p2l index */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, start, pool,
+ iterpool));
+
+ /* check file size vs. range covered by index */
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ SVN_ERR(svn_fs_fs__p2l_get_max_offset(&max_offset, fs, rev_file, start,
+ pool));
+
+ if (rev_file->l2p_offset != max_offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT, NULL,
+ _("File size of %s for revision r%ld does "
+ "not match p2l index size of %s"),
+ apr_off_t_toa(pool, rev_file->l2p_offset), start,
+ apr_off_t_toa(pool, max_offset));
+
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size, NULL, 0,
+ pool));
+
+ /* for all offsets in the file, get the P2L index entries and check
+ them against the L2P index */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ /* get all entries for the current block */
+ SVN_ERR(svn_fs_fs__p2l_index_lookup(&entries, fs, rev_file, start,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+
+ /* The above might have moved the file pointer.
+ * Ensure we actually start reading at OFFSET. */
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size,
+ NULL, offset, iterpool));
+
+ /* process all entries (and later continue with the next block) */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_fs__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_fs__p2l_entry_t);
+
+ /* skip bits we previously checked */
+ if (i == 0 && entry->offset < offset)
+ continue;
+
+ /* skip zero-sized entries */
+ if (entry->size == 0)
+ continue;
+
+ /* p2l index must cover all rev / pack file offsets exactly once */
+ if (entry->offset != offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index entry for revision r%ld"
+ " is non-contiguous between offsets "
+ " %s and %s"),
+ start,
+ apr_off_t_toa(pool, offset),
+ apr_off_t_toa(pool, entry->offset));
+
+ /* empty sections must contain NUL bytes only */
+ if (entry->type == SVN_FS_FS__ITEM_TYPE_UNUSED)
+ {
+ /* skip filler entry at the end of the p2l index */
+ if (entry->offset != max_offset)
+ SVN_ERR(read_all_nul(rev_file->file, entry->size, pool));
+ }
+ else
+ {
+ if (entry->size < STREAM_THRESHOLD)
+ SVN_ERR(expected_buffered_checksum(rev_file->file, entry,
+ pool));
+ else
+ SVN_ERR(expected_streamed_checksum(rev_file->file, entry,
+ pool));
+ }
+
+ /* advance offset */
+ offset += entry->size;
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_fs__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the revprops of the revisions START to END in FS can be
+ * accessed. Invoke CANCEL_FUNC with CANCEL_BATON at regular intervals.
+ *
+ * The values of START and END have already been auto-selected and
+ * verified.
+ */
+static svn_error_t *
+verify_revprops(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_revnum_t revision;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ for (revision = start; revision < end; ++revision)
+ {
+ svn_string_t *date;
+ apr_time_t timetemp;
+
+ svn_pool_clear(iterpool);
+
+ /* Access the svn:date revprop.
+ * This implies parsing all revprops for that revision. */
+ SVN_ERR(svn_fs_fs__revision_prop(&date, fs, revision,
+ SVN_PROP_REVISION_DATE, iterpool));
+
+ /* The time stamp is the only revprop that, if given, needs to
+ * have a valid content. */
+ if (date)
+ SVN_ERR(svn_time_from_cstring(&timetemp, date->data, iterpool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_revnum_t
+pack_size(svn_fs_t *fs, svn_revnum_t rev)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ return rev < ffd->min_unpacked_rev ? ffd->max_files_per_dir : 1;
+}
+
+/* Verify that on-disk representation has not been tempered with (in a way
+ * that leaves the repository in a corrupted state). This compares log-to-
+ * phys with phys-to-log indexes, verifies the low-level checksums and
+ * checks that all revprops are available. The function signature is
+ * similar to svn_fs_fs__verify.
+ *
+ * The values of START and END have already been auto-selected and
+ * verified. You may call this for format7 or higher repos.
+ */
+static svn_error_t *
+verify_f7_metadata_consistency(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_revnum_t revision, next_revision;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ for (revision = start; revision <= end; revision = next_revision)
+ {
+ svn_error_t *err = SVN_NO_ERROR;
+
+ svn_revnum_t count = pack_size(fs, revision);
+ svn_revnum_t pack_start = svn_fs_fs__packed_base_rev(fs, revision);
+ svn_revnum_t pack_end = pack_start + count;
+
+ svn_pool_clear(iterpool);
+
+ if (notify_func && (pack_start % ffd->max_files_per_dir == 0))
+ notify_func(pack_start, notify_baton, iterpool);
+
+ /* Check for external corruption to the indexes. */
+ err = verify_index_checksums(fs, pack_start, cancel_func,
+ cancel_baton, iterpool);
+
+ /* two-way index check */
+ if (!err)
+ err = compare_l2p_to_p2l_index(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+ if (!err)
+ err = compare_p2l_to_l2p_index(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+
+ /* verify in-index checksums and types vs. actual rev / pack files */
+ if (!err)
+ err = compare_p2l_to_rev(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+
+ /* ensure that revprops are available and accessible */
+ if (!err)
+ err = verify_revprops(fs, pack_start, pack_end,
+ cancel_func, cancel_baton, iterpool);
+
+ /* concurrent packing is one of the reasons why verification may fail.
+ Make sure, we operate on up-to-date information. */
+ if (err)
+ {
+ svn_error_t *err2
+ = svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev,
+ fs, pool);
+
+ /* Be careful to not leak ERR. */
+ if (err2)
+ return svn_error_trace(svn_error_compose_create(err, err2));
+ }
+
+ /* retry the whole shard if it got packed in the meantime */
+ if (err && count != pack_size(fs, revision))
+ {
+ svn_error_clear(err);
+
+ /* We could simply assign revision here but the code below is
+ more intuitive to maintainers. */
+ next_revision = svn_fs_fs__packed_base_rev(fs, revision);
+ }
+ else
+ {
+ SVN_ERR(err);
+ next_revision = pack_end;
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__verify(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ svn_revnum_t youngest = ffd->youngest_rev_cache; /* cache is current */
+
+ /* Input validation. */
+ if (! SVN_IS_VALID_REVNUM(start))
+ start = 0;
+ if (! SVN_IS_VALID_REVNUM(end))
+ end = youngest;
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(start, fs, pool));
+ SVN_ERR(svn_fs_fs__ensure_revision_exists(end, fs, pool));
+
+ /* log/phys index consistency. We need to check them first to make
+ sure we can access the rev / pack files in format7. */
+ if (svn_fs_fs__use_log_addressing(fs))
+ SVN_ERR(verify_f7_metadata_consistency(fs, start, end,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, pool));
+
+ /* rep cache consistency */
+ if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ SVN_ERR(verify_rep_cache(fs, start, end, notify_func, notify_baton,
+ cancel_func, cancel_baton, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_fs/verify.h b/subversion/libsvn_fs_fs/verify.h
new file mode 100644
index 0000000..650a35b
--- /dev/null
+++ b/subversion/libsvn_fs_fs/verify.h
@@ -0,0 +1,42 @@
+/* verify.h : verification interface of the native filesystem layer
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__VERIFY_H
+#define SVN_LIBSVN_FS__VERIFY_H
+
+#include "fs.h"
+
+/* Verify metadata in fsfs filesystem FS. Limit the checks to revisions
+ * START to END where possible. Indicate progress via the optional
+ * NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC
+ * will periodically be called with CANCEL_BATON to allow for preemption.
+ * Use POOL for temporary allocations. */
+svn_error_t *svn_fs_fs__verify(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_util/fs-util.c b/subversion/libsvn_fs_util/fs-util.c
index da57bc9..1e7ed4f 100644
--- a/subversion/libsvn_fs_util/fs-util.c
+++ b/subversion/libsvn_fs_util/fs-util.c
@@ -26,16 +26,26 @@
#include <apr_pools.h>
#include <apr_strings.h>
+#include "svn_private_config.h"
#include "svn_hash.h"
#include "svn_fs.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
-#include "svn_private_config.h"
+#include "svn_version.h"
#include "private/svn_fs_util.h"
#include "private/svn_fspath.h"
+#include "private/svn_subr_private.h"
#include "../libsvn_fs/fs-loader.h"
+
+const svn_version_t *
+svn_fs_util__version(void)
+{
+ SVN_VERSION_BODY;
+}
+
+
/* Return TRUE, if PATH of PATH_LEN > 0 chars starts with a '/' and does
* not end with a '/' and does not contain duplicate '/'.
*/
@@ -196,6 +206,8 @@ svn_fs__path_change_create_internal(const svn_fs_id_t *node_rev_id,
change = apr_pcalloc(pool, sizeof(*change));
change->node_rev_id = node_rev_id;
change->change_kind = change_kind;
+ change->mergeinfo_mod = svn_tristate_unknown;
+ change->copyfrom_rev = SVN_INVALID_REVNUM;
return change;
}
@@ -211,8 +223,8 @@ svn_fs__append_to_merged_froms(svn_mergeinfo_t *output,
*output = apr_hash_make(pool);
for (hi = apr_hash_first(pool, input); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_hash_sets(*output,
svn_fspath__join(path, rel_path, pool),
@@ -221,3 +233,102 @@ svn_fs__append_to_merged_froms(svn_mergeinfo_t *output,
return SVN_NO_ERROR;
}
+
+/* Set the version info in *VERSION to COMPAT_MAJOR and COMPAT_MINOR, if
+ the current value refers to a newer version than that.
+ */
+static void
+add_compatility(svn_version_t *version,
+ int compat_major,
+ int compat_minor)
+{
+ if ( version->major > compat_major
+ || (version->major == compat_major && version->minor > compat_minor))
+ {
+ version->major = compat_major;
+ version->minor = compat_minor;
+ }
+}
+
+svn_error_t *
+svn_fs__compatible_version(svn_version_t **compatible_version,
+ apr_hash_t *config,
+ apr_pool_t *pool)
+{
+ svn_version_t *version;
+ const char *compatible;
+
+ /* set compatible version according to generic option.
+ Make sure, we are always compatible to the current SVN version
+ (or older). */
+ compatible = svn_hash_gets(config, SVN_FS_CONFIG_COMPATIBLE_VERSION);
+ if (compatible)
+ {
+ SVN_ERR(svn_version__parse_version_string(&version,
+ compatible, pool));
+ add_compatility(version,
+ svn_subr_version()->major,
+ svn_subr_version()->minor);
+ }
+ else
+ {
+ version = apr_pmemdup(pool, svn_subr_version(), sizeof(*version));
+ }
+
+ /* specific options take precedence.
+ Let the lowest version compatibility requirement win */
+ if (svn_hash_gets(config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE))
+ add_compatility(version, 1, 3);
+ else if (svn_hash_gets(config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE))
+ add_compatility(version, 1, 4);
+ else if (svn_hash_gets(config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE))
+ add_compatility(version, 1, 5);
+ else if (svn_hash_gets(config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE))
+ add_compatility(version, 1, 7);
+
+ /* we ignored the patch level and tag so far.
+ * Give them a defined value. */
+ version->patch = 0;
+ version->tag = "";
+
+ /* done here */
+ *compatible_version = version;
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_fs__prop_lists_equal(apr_hash_t *a,
+ apr_hash_t *b,
+ apr_pool_t *pool)
+{
+ apr_hash_index_t *hi;
+
+ /* Quick checks and special cases. */
+ if (a == b)
+ return TRUE;
+
+ if (a == NULL)
+ return apr_hash_count(b) == 0;
+ if (b == NULL)
+ return apr_hash_count(a) == 0;
+
+ if (apr_hash_count(a) != apr_hash_count(b))
+ return FALSE;
+
+ /* Compare prop by prop. */
+ for (hi = apr_hash_first(pool, a); hi; hi = apr_hash_next(hi))
+ {
+ const char *key;
+ apr_ssize_t klen;
+ svn_string_t *val_a, *val_b;
+
+ apr_hash_this(hi, (const void **)&key, &klen, (void **)&val_a);
+ val_b = apr_hash_get(b, key, klen);
+
+ if (!val_b || !svn_string_compare(val_a, val_b))
+ return FALSE;
+ }
+
+ /* No difference found. */
+ return TRUE;
+}
diff --git a/subversion/libsvn_fs_util/libsvn_fs_util.pc.in b/subversion/libsvn_fs_util/libsvn_fs_util.pc.in
new file mode 100644
index 0000000..05a9b4f
--- /dev/null
+++ b/subversion/libsvn_fs_util/libsvn_fs_util.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_fs_util
+Description: Subversion Filesystem Utility Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_subr
+Libs: -L${libdir} -lsvn_fs_util
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_fs_x/TODO b/subversion/libsvn_fs_x/TODO
new file mode 100644
index 0000000..4daf45b
--- /dev/null
+++ b/subversion/libsvn_fs_x/TODO
@@ -0,0 +1,270 @@
+
+TODO (see also DONE section below)
+==================================
+
+Internal API cleanup
+--------------------
+
+During refactoring, some functions had to be declared in header files
+to make them available to other fsfs code. We need to revisit those
+function definitions to turn them into a proper API that may be useful
+to other code (such as fsfs tools).
+
+
+Checksum all metadata elements
+------------------------------
+
+All elements of an FS-X repository shall be guarded by checksums. That
+includes indexes, noderevs etc. Larger data structures, such as index
+files, should have checksummed sub-elements such that corrupted parts
+may be identified and potentially repaired / circumvented in a meaningful
+way.
+
+Those checksums may be quite simple such as Adler32 because that meta-
+data can be cross-verified with other parts as well and acts only as a
+fallback to narrow down the affected parts.
+
+'svnadmin verify' shall check consistency based on those checksums.
+
+
+Port existing FSFS tools
+------------------------
+
+fsfs-stats, fsfsverify.py and possibly others should have equivalents
+in the FS-X world.
+
+
+Optimize data ordering during pack
+----------------------------------
+
+I/O optimized copy algorithms are yet to be implemented. The current
+code is relatively slow as it performs quasi-random I/O on the
+input stream.
+
+
+TxDelta v2
+----------
+
+Version 1 of txdelta turns out to be limited in its effectiveness for
+larger files when data gets inserted or removed. For typical office
+documents (zip files), deltification often becomes ineffective.
+
+Version 2 shall introduce the following changes:
+
+- increase the delta window from 100kB to 1MB
+- use a sliding window instead of a fixed-sized one
+- use a slightly more efficient instruction encoding
+
+When introducing it, we will make it an option at the txdelta interfaces
+(e.g. a format number). The version will be indicated in the 'SVN\x1' /
+'SVN\x2' stream header. While at it, (try to) fix the layering violations
+where those prefixes are being read or written.
+
+
+Large file storage
+------------------
+
+Even most source code repositories contain large, hard to compress,
+hard to deltify binaries. Reconstructing their content becomes very I/O
+intense and it "dilutes" the data in our pack files. The latter makes
+e.g. caching, prefetching and packing less efficient.
+
+Once a representation exceeds a certain configured threshold (16M default),
+the fulltext of that item will be stored in a separate file. This will
+be marked in the representation_t by an extra flag and future reps will
+not be deltified against it. From that location, the data can be forwarded
+directly via SendFile and the fulltext caches will not be used for it.
+
+Note that by making the decision contingent upon the size of the deltified
+and packed representation, all large data that benefit from these (i.e.
+have smaller increments) will still be stored within the rev and pack files.
+If a future representation is smaller than the threshold, it may be
+
+/* danielsh: so if we have a file which is 20MB over many revisions, it'll
+be stored in fulltext every single time unless the configured threshold is
+changed? Wondering if that's the best solution... */
+
+
+Sorted binary directory representations
+---------------------------------------
+
+Lookup of entries in a directory is a frequent operation when following
+cached paths. The represents directories as arrays sorted by entry name
+to allow for binary search during that lookup. However, all external
+representation uses hashes and the conversion is expensive.
+
+FS-X shall store directory representations sorted by element names and
+all use that array representation internally wherever appropriate. This
+will minimize the conversion overhead for long directories, especially
+during transaction building.
+
+Moreover, switch from the key/value representation to a slightly tighter
+and easier to process binary representation (validity is already guaranteed
+by checksums).
+
+
+Star-Deltification
+------------------
+
+Current implementation is incomplete. TODO: actually support & use base
+representations, optimize instruction table.
+
+Combine this with Txdelta 2 such that the corresponding windows from
+all representations get stored in a common star-delta container.
+
+
+Multiple pack stages
+--------------------
+
+FSFS only knows one packing level - the shard. For repositories with
+a large number of revisions, it may be more efficient to start with small
+packs (10-ish) and later pack them into larger and larger ones.
+
+
+Open less files when opening a repository
+-----------------------------------------
+
+Opening a repository reads numerous files in db/ (besides several more in
+../conf): uuid, current, format, fs-type, fsfs.conf, min-unpacked-rev, ...
+
+Combine most of them into one or two files (eg uuid|format(|fs-type?),
+current|min-unpacked-revprop).
+
+
+Sharded transaction directories
+-------------------------------
+
+Transaction directories contain 3 OS files per FS file modified in the
+transaction. That doesn't scale well; find something better.
+
+
+DONE
+====
+
+Turn into separate FS
+---------------------
+
+Make FS-X a separate file system alongside BDB and FSFS. Rip out all
+FSFS compatibility code.
+
+
+Logical addressing
+------------------
+
+To allow for moving data structures around within the repository, we must
+replace the current absolute addressing using file offsets with a logical
+one. All references will no take the form of (revision, index) pairs and
+a replacement to the format 6 manifest files will map that to actual file
+offsets.
+
+Having the need to map revision-local offsets to pack-file global offsets
+today already gives us some localized address mapping code that simply
+needs to be replaced.
+
+
+Optimize data ordering during pack
+----------------------------------
+
+Replace today's simple concatenating shard packing process with a one
+placing fragments (representations and noderevs) from various revisions
+close to each other if they are likely needed to serve in the same request.
+
+We will optimize on a per-shard basis. The general strategy is
+
+* place all change lists at the beginning of the pack file
+ - strict revision order
+ - place newest ones first
+* place all file properties reps next
+ - place newer reps first
+* place all directory properties next
+ - place newer reps first
+* place all root nodes and root directories
+ - ordered newest rev -> oldest rev
+ - place rep delta chains 'en block'
+ - place root node in front of rep, if that rep has not already
+ been placed as part of a rep delta chain
+* place remaining content as follows:
+ - place node rev directly in front of their reps (where they have one)
+ - start with the latest root directory not placed, yet
+ - recurse to sub-folders first with, sorted by name
+ - per folder, place files in naming order
+ - place rep deltification chains in deltification order (new->old)
+* no fragments should be left but if they are, put them at the end
+
+
+Index pack files
+----------------
+
+In addition to the manifest we need for the (revision, index) -> offset
+mapping, we also introduce an offset -> (revision, index, type) index
+file. This will allow us to parse any data in a pack file without walking
+the DAG top down.
+
+
+Data prefetch
+-------------
+
+This builds on the previous. The idea is that whenever a cache lookup
+fails, we will not just read the single missing fragment but parse all
+data within the APR file buffer and put that into the cache.
+
+For maximum efficiency, we will align the data blocks being read to
+multiples of the block size and allow that buffer size to be configured
+(where supported by APR). The default block size will be raised to 64kB.
+
+
+Extend 'svnadmin verify'
+------------------------
+
+Format 7 provides many extra chances to verify contents plus contains
+extra indexes that must be consistent with the pack / rev files. We
+must extend the tests to cover all that.
+
+
+Containers
+----------
+
+Extend the index format support containers, i.e. map a logical item index
+to (file offset, sub-index) pairs. The whole container will be read and
+cached and the specific item later accessed from the whole structure.
+
+Use these containers for reps, noderevs and changes. Provide specific
+data container types for each of these item types and different item
+types cannot be put into the same container. Containers are binaries,
+i.e. there is no textual representations of their contents.
+
+This allows for significant space savings on disk due to deltification
+amongst e.g. revprops. More importantly, it reduces the size of the
+runtime data structures within the cache *and* reduces the number of
+cache entries (the cache is can't handle items < 500 bytes very well).
+
+
+Packed change lists
+-------------------
+
+Change lists tend to be large, in some cases >20% of the repo. Due to the
+new ordering of pack data, the change lists can be the largest part of
+data to read for svn log. Use our standard compression method to save
+70 .. 80% of the disk space.
+
+Packing will only be applied to binary representations of change lists
+to keep the number of possible combinations low.
+
+
+Star-Deltification
+------------------
+
+Most node contents are smaller than 500k, i.e. less than Txdelta 2 window.
+Those contents shall be aggregated into star-delta containers upon pack.
+This will save significant amounts of disk space, particularly in case
+of heavy branching. Also, the data extraction is independent of the
+number of deltas, i.e. delta chain length) within the same container.
+
+
+Support for arbitrary chars in path names
+-----------------------------------------
+
+FSFS's textual item representations breaks when path names contain
+newlines. FS-X revisions shall escape all control chars (e.g. < 0x20)
+in path names when using them in textual item representations.
+
diff --git a/subversion/libsvn_fs_x/cached_data.c b/subversion/libsvn_fs_x/cached_data.c
new file mode 100644
index 0000000..2fdf569
--- /dev/null
+++ b/subversion/libsvn_fs_x/cached_data.c
@@ -0,0 +1,3355 @@
+/* cached_data.c --- cached (read) access to FSX data
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "cached_data.h"
+
+#include <assert.h>
+
+#include "svn_hash.h"
+#include "svn_ctype.h"
+#include "svn_sorts.h"
+
+#include "private/svn_io_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "fs_x.h"
+#include "low_level.h"
+#include "util.h"
+#include "pack.h"
+#include "temp_serializer.h"
+#include "index.h"
+#include "changes.h"
+#include "noderevs.h"
+#include "reps.h"
+
+#include "../libsvn_fs/fs-loader.h"
+#include "../libsvn_delta/delta.h" /* for SVN_DELTA_WINDOW_SIZE */
+
+#include "svn_private_config.h"
+
+/* forward-declare. See implementation for the docstring */
+static svn_error_t *
+block_read(void **result,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ svn_fs_x__revision_file_t *revision_file,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Defined this to enable access logging via dgb__log_access
+#define SVN_FS_X__LOG_ACCESS
+*/
+
+/* When SVN_FS_X__LOG_ACCESS has been defined, write a line to console
+ * showing where ID is located in FS and use ITEM to show details on it's
+ * contents if not NULL. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+dgb__log_access(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ void *item,
+ apr_uint32_t item_type,
+ apr_pool_t *scratch_pool)
+{
+ /* no-op if this macro is not defined */
+#ifdef SVN_FS_X__LOG_ACCESS
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_off_t offset = -1;
+ apr_off_t end_offset = 0;
+ apr_uint32_t sub_item = 0;
+ svn_fs_x__p2l_entry_t *entry = NULL;
+ static const char *types[] = {"<n/a>", "frep ", "drep ", "fprop", "dprop",
+ "node ", "chgs ", "rep ", "c:", "n:", "r:"};
+ const char *description = "";
+ const char *type = types[item_type];
+ const char *pack = "";
+ svn_revnum_t revision = svn_fs_x__get_revnum(id->change_set);
+
+ /* determine rev / pack file offset */
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, id, scratch_pool));
+
+ /* constructing the pack file description */
+ if (revision < ffd->min_unpacked_rev)
+ pack = apr_psprintf(scratch_pool, "%4ld|",
+ revision / ffd->max_files_per_dir);
+
+ /* construct description if possible */
+ if (item_type == SVN_FS_X__ITEM_TYPE_NODEREV && item != NULL)
+ {
+ svn_fs_x__noderev_t *node = item;
+ const char *data_rep
+ = node->data_rep
+ ? apr_psprintf(scratch_pool, " d=%ld/%" APR_UINT64_T_FMT,
+ svn_fs_x__get_revnum(node->data_rep->id.change_set),
+ node->data_rep->id.number)
+ : "";
+ const char *prop_rep
+ = node->prop_rep
+ ? apr_psprintf(scratch_pool, " p=%ld/%" APR_UINT64_T_FMT,
+ svn_fs_x__get_revnum(node->prop_rep->id.change_set),
+ node->prop_rep->id.number)
+ : "";
+ description = apr_psprintf(scratch_pool, "%s (pc=%d%s%s)",
+ node->created_path,
+ node->predecessor_count,
+ data_rep,
+ prop_rep);
+ }
+ else if (item_type == SVN_FS_X__ITEM_TYPE_ANY_REP)
+ {
+ svn_fs_x__rep_header_t *header = item;
+ if (header == NULL)
+ description = " (txdelta window)";
+ else if (header->type == svn_fs_x__rep_self_delta)
+ description = " DELTA";
+ else
+ description = apr_psprintf(scratch_pool,
+ " DELTA against %ld/%" APR_UINT64_T_FMT,
+ header->base_revision,
+ header->base_item_index);
+ }
+ else if (item_type == SVN_FS_X__ITEM_TYPE_CHANGES && item != NULL)
+ {
+ apr_array_header_t *changes = item;
+ switch (changes->nelts)
+ {
+ case 0: description = " no change";
+ break;
+ case 1: description = " 1 change";
+ break;
+ default: description = apr_psprintf(scratch_pool, " %d changes",
+ changes->nelts);
+ }
+ }
+
+ /* reverse index lookup: get item description in ENTRY */
+ SVN_ERR(svn_fs_x__p2l_entry_lookup(&entry, fs, revision, offset,
+ scratch_pool));
+ if (entry)
+ {
+ /* more details */
+ end_offset = offset + entry->size;
+ type = types[entry->type];
+
+ /* merge the sub-item number with the container type */
+ if ( entry->type == SVN_FS_X__ITEM_TYPE_CHANGES_CONT
+ || entry->type == SVN_FS_X__ITEM_TYPE_NODEREVS_CONT
+ || entry->type == SVN_FS_X__ITEM_TYPE_REPS_CONT)
+ type = apr_psprintf(scratch_pool, "%s%-3d", type, sub_item);
+ }
+
+ /* line output */
+ printf("%5s%4lx:%04lx -%4lx:%04lx %s %7ld %5"APR_UINT64_T_FMT" %s\n",
+ pack, (long)(offset / ffd->block_size),
+ (long)(offset % ffd->block_size),
+ (long)(end_offset / ffd->block_size),
+ (long)(end_offset % ffd->block_size),
+ type, revision, id->number, description);
+
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience wrapper around svn_io_file_aligned_seek, taking filesystem
+ FS instead of a block size. */
+static svn_error_t *
+aligned_seek(svn_fs_t *fs,
+ apr_file_t *file,
+ apr_off_t *buffer_start,
+ apr_off_t offset,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ return svn_error_trace(svn_io_file_aligned_seek(file, ffd->block_size,
+ buffer_start, offset,
+ scratch_pool));
+}
+
+/* Open the revision file for the item given by ID in filesystem FS and
+ store the newly opened file in FILE. Seek to the item's location before
+ returning.
+
+ Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL. */
+static svn_error_t *
+open_and_seek_revision(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__revision_file_t *rev_file;
+ apr_off_t offset = -1;
+ apr_uint32_t sub_item = 0;
+ svn_revnum_t rev = svn_fs_x__get_revnum(id->change_set);
+
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
+
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, rev, result_pool,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, rev_file, id,
+ scratch_pool));
+ SVN_ERR(aligned_seek(fs, rev_file->file, NULL, offset, scratch_pool));
+
+ *file = rev_file;
+
+ return SVN_NO_ERROR;
+}
+
+/* Open the representation REP for a node-revision in filesystem FS, seek
+ to its position and store the newly opened file in FILE.
+
+ Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL. */
+static svn_error_t *
+open_and_seek_transaction(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset;
+ apr_uint32_t sub_item = 0;
+ apr_int64_t txn_id = svn_fs_x__get_txn_id(rep->id.change_set);
+
+ SVN_ERR(svn_fs_x__open_proto_rev_file(file, fs, txn_id, result_pool,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, *file, &rep->id,
+ scratch_pool));
+ SVN_ERR(aligned_seek(fs, (*file)->file, NULL, offset, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Given a node-id ID, and a representation REP in filesystem FS, open
+ the correct file and seek to the correction location. Store this
+ file in *FILE_P.
+
+ Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL. */
+static svn_error_t *
+open_and_seek_representation(svn_fs_x__revision_file_t **file_p,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (svn_fs_x__is_revision(rep->id.change_set))
+ return open_and_seek_revision(file_p, fs, &rep->id, result_pool,
+ scratch_pool);
+ else
+ return open_and_seek_transaction(file_p, fs, rep, result_pool,
+ scratch_pool);
+}
+
+
+
+static svn_error_t *
+err_dangling_id(svn_fs_t *fs,
+ const svn_fs_x__id_t *id)
+{
+ svn_string_t *id_str = svn_fs_x__id_unparse(id, fs->pool);
+ return svn_error_createf
+ (SVN_ERR_FS_ID_NOT_FOUND, 0,
+ _("Reference to non-existent node '%s' in filesystem '%s'"),
+ id_str->data, fs->path);
+}
+
+/* Get the node-revision for the node ID in FS.
+ Set *NODEREV_P to the new node-revision structure, allocated in POOL.
+ See svn_fs_x__get_node_revision, which wraps this and adds another
+ error. */
+static svn_error_t *
+get_node_revision_body(svn_fs_x__noderev_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_boolean_t is_cached = FALSE;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ if (svn_fs_x__is_txn(id->change_set))
+ {
+ apr_file_t *file;
+
+ /* This is a transaction node-rev. Its storage logic is very
+ different from that of rev / pack files. */
+ err = svn_io_file_open(&file,
+ svn_fs_x__path_txn_node_rev(fs, id,
+ scratch_pool,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool);
+ if (err)
+ {
+ if (APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_clear(err);
+ return svn_error_trace(err_dangling_id(fs, id));
+ }
+
+ return svn_error_trace(err);
+ }
+
+ SVN_ERR(svn_fs_x__read_noderev(noderev_p,
+ svn_stream_from_aprfile2(file,
+ FALSE,
+ scratch_pool),
+ result_pool, scratch_pool));
+ }
+ else
+ {
+ svn_fs_x__revision_file_t *revision_file;
+
+ /* noderevs in rev / pack files can be cached */
+ svn_revnum_t revision = svn_fs_x__get_revnum(id->change_set);
+ svn_fs_x__pair_cache_key_t key;
+
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&revision_file, fs, revision,
+ scratch_pool, scratch_pool));
+
+ /* First, try a noderevs container cache lookup. */
+ if ( svn_fs_x__is_packed_rev(fs, revision)
+ && ffd->noderevs_container_cache)
+ {
+ apr_off_t offset;
+ apr_uint32_t sub_item;
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, revision_file,
+ id, scratch_pool));
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = offset;
+
+ SVN_ERR(svn_cache__get_partial((void **)noderev_p, &is_cached,
+ ffd->noderevs_container_cache, &key,
+ svn_fs_x__noderevs_get_func,
+ &sub_item, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ key.revision = revision;
+ key.second = id->number;
+
+ /* Not found or not applicable. Try a noderev cache lookup.
+ * If that succeeds, we are done here. */
+ if (ffd->node_revision_cache)
+ {
+ SVN_ERR(svn_cache__get((void **) noderev_p,
+ &is_cached,
+ ffd->node_revision_cache,
+ &key,
+ result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ /* block-read will parse the whole block and will also return
+ the one noderev that we need right now. */
+ SVN_ERR(block_read((void **)noderev_p, fs,
+ id,
+ revision_file,
+ result_pool,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__close_revision_file(revision_file));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_node_revision(svn_fs_x__noderev_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = get_node_revision_body(noderev_p, fs, id,
+ result_pool, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
+ {
+ svn_string_t *id_string = svn_fs_x__id_unparse(id, scratch_pool);
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Corrupt node-revision '%s'",
+ id_string->data);
+ }
+
+ SVN_ERR(dgb__log_access(fs, id, *noderev_p,
+ SVN_FS_X__ITEM_TYPE_NODEREV, scratch_pool));
+
+ return svn_error_trace(err);
+}
+
+
+svn_error_t *
+svn_fs_x__get_mergeinfo_count(apr_int64_t *count,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* If we want a full acccess log, we need to provide full data and
+ cannot take shortcuts here. */
+#if !defined(SVN_FS_X__LOG_ACCESS)
+
+ /* First, try a noderevs container cache lookup. */
+ if (! svn_fs_x__is_txn(id->change_set))
+ {
+ /* noderevs in rev / pack files can be cached */
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_revnum_t revision = svn_fs_x__get_revnum(id->change_set);
+
+ svn_fs_x__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, revision,
+ scratch_pool, scratch_pool));
+
+ if ( svn_fs_x__is_packed_rev(fs, revision)
+ && ffd->noderevs_container_cache)
+ {
+ svn_fs_x__pair_cache_key_t key;
+ apr_off_t offset;
+ apr_uint32_t sub_item;
+ svn_boolean_t is_cached;
+
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, rev_file,
+ id, scratch_pool));
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = offset;
+
+ SVN_ERR(svn_cache__get_partial((void **)count, &is_cached,
+ ffd->noderevs_container_cache, &key,
+ svn_fs_x__mergeinfo_count_get_func,
+ &sub_item, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+ }
+#endif
+
+ /* fallback to the naive implementation handling all edge cases */
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, scratch_pool,
+ scratch_pool));
+ *count = noderev->mergeinfo_count;
+
+ return SVN_NO_ERROR;
+}
+
+/* Describes a lazily opened rev / pack file. Instances will be shared
+ between multiple instances of rep_state_t. */
+typedef struct shared_file_t
+{
+ /* The opened file. NULL while file is not open, yet. */
+ svn_fs_x__revision_file_t *rfile;
+
+ /* file system to open the file in */
+ svn_fs_t *fs;
+
+ /* a revision contained in the FILE. Since this file may be shared,
+ that value may be different from REP_STATE_T->REVISION. */
+ svn_revnum_t revision;
+
+ /* pool to use when creating the FILE. This guarantees that the file
+ remains open / valid beyond the respective local context that required
+ the file to be opened eventually. */
+ apr_pool_t *pool;
+} shared_file_t;
+
+/* Represents where in the current svndiff data block each
+ representation is. */
+typedef struct rep_state_t
+{
+ /* shared lazy-open rev/pack file structure */
+ shared_file_t *sfile;
+ /* The txdelta window cache to use or NULL. */
+ svn_cache__t *window_cache;
+ /* Caches un-deltified windows. May be NULL. */
+ svn_cache__t *combined_cache;
+ /* ID addressing the representation */
+ svn_fs_x__id_t rep_id;
+ /* length of the header at the start of the rep.
+ 0 iff this is rep is stored in a container
+ (i.e. does not have a header) */
+ apr_size_t header_size;
+ apr_off_t start; /* The starting offset for the raw
+ svndiff data minus header.
+ -1 if the offset is yet unknown. */
+ /* sub-item index in case the rep is containered */
+ apr_uint32_t sub_item;
+ apr_off_t current;/* The current offset relative to START. */
+ apr_off_t size; /* The on-disk size of the representation. */
+ int ver; /* If a delta, what svndiff version?
+ -1 for unknown delta version. */
+ int chunk_index; /* number of the window to read */
+} rep_state_t;
+
+/* Simple wrapper around svn_fs_x__get_file_offset to simplify callers. */
+static svn_error_t *
+get_file_offset(apr_off_t *offset,
+ rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_fs_x__get_file_offset(offset,
+ rs->sfile->rfile->file,
+ scratch_pool));
+}
+
+/* Simple wrapper around svn_io_file_aligned_seek to simplify callers. */
+static svn_error_t *
+rs_aligned_seek(rep_state_t *rs,
+ apr_off_t *buffer_start,
+ apr_off_t offset,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = rs->sfile->fs->fsap_data;
+ return svn_error_trace(svn_io_file_aligned_seek(rs->sfile->rfile->file,
+ ffd->block_size,
+ buffer_start, offset,
+ scratch_pool));
+}
+
+/* Open FILE->FILE and FILE->STREAM if they haven't been opened, yet. */
+static svn_error_t*
+auto_open_shared_file(shared_file_t *file)
+{
+ if (file->rfile == NULL)
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&file->rfile, file->fs,
+ file->revision, file->pool,
+ file->pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Set RS->START to the begin of the representation raw in RS->SFILE->RFILE,
+ if that hasn't been done yet. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t*
+auto_set_start_offset(rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->start == -1)
+ {
+ SVN_ERR(svn_fs_x__item_offset(&rs->start, &rs->sub_item,
+ rs->sfile->fs, rs->sfile->rfile,
+ &rs->rep_id, scratch_pool));
+ rs->start += rs->header_size;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set RS->VER depending on what is found in the already open RS->FILE->FILE
+ if the diff version is still unknown. Use SCRATCH_POOL for temporary
+ allocations.
+ */
+static svn_error_t*
+auto_read_diff_version(rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->ver == -1)
+ {
+ char buf[4];
+ SVN_ERR(rs_aligned_seek(rs, NULL, rs->start, scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(rs->sfile->rfile->file, buf,
+ sizeof(buf), NULL, NULL, scratch_pool));
+
+ /* ### Layering violation */
+ if (! ((buf[0] == 'S') && (buf[1] == 'V') && (buf[2] == 'N')))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed svndiff data in representation"));
+ rs->ver = buf[3];
+
+ rs->chunk_index = 0;
+ rs->current = 4;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* See create_rep_state, which wraps this and adds another error. */
+static svn_error_t *
+create_rep_state_body(rep_state_t **rep_state,
+ svn_fs_x__rep_header_t **rep_header,
+ shared_file_t **shared_file,
+ svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ rep_state_t *rs = apr_pcalloc(result_pool, sizeof(*rs));
+ svn_fs_x__rep_header_t *rh;
+ svn_boolean_t is_cached = FALSE;
+ svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
+ apr_uint64_t estimated_window_storage;
+
+ /* If the hint is
+ * - given,
+ * - refers to a valid revision,
+ * - refers to a packed revision,
+ * - as does the rep we want to read, and
+ * - refers to the same pack file as the rep
+ * we can re-use the same, already open file object
+ */
+ svn_boolean_t reuse_shared_file
+ = shared_file && *shared_file && (*shared_file)->rfile
+ && SVN_IS_VALID_REVNUM((*shared_file)->revision)
+ && (*shared_file)->revision < ffd->min_unpacked_rev
+ && revision < ffd->min_unpacked_rev
+ && ( ((*shared_file)->revision / ffd->max_files_per_dir)
+ == (revision / ffd->max_files_per_dir));
+
+ svn_fs_x__representation_cache_key_t key = { 0 };
+ key.revision = revision;
+ key.is_packed = revision < ffd->min_unpacked_rev;
+ key.item_index = rep->id.number;
+
+ /* continue constructing RS and RA */
+ rs->size = rep->size;
+ rs->rep_id = rep->id;
+ rs->ver = -1;
+ rs->start = -1;
+
+ /* Very long files stored as self-delta will produce a huge number of
+ delta windows. Don't cache them lest we don't thrash the cache.
+ Since we don't know the depth of the delta chain, let's assume, the
+ whole contents get rewritten 3 times.
+ */
+ estimated_window_storage
+ = 4 * ( (rep->expanded_size ? rep->expanded_size : rep->size)
+ + SVN_DELTA_WINDOW_SIZE);
+ estimated_window_storage = MIN(estimated_window_storage, APR_SIZE_MAX);
+
+ rs->window_cache = ffd->txdelta_window_cache
+ && svn_cache__is_cachable(ffd->txdelta_window_cache,
+ (apr_size_t)estimated_window_storage)
+ ? ffd->txdelta_window_cache
+ : NULL;
+ rs->combined_cache = ffd->combined_window_cache
+ && svn_cache__is_cachable(ffd->combined_window_cache,
+ (apr_size_t)estimated_window_storage)
+ ? ffd->combined_window_cache
+ : NULL;
+
+ /* cache lookup, i.e. skip reading the rep header if possible */
+ if (ffd->rep_header_cache && SVN_IS_VALID_REVNUM(revision))
+ SVN_ERR(svn_cache__get((void **) &rh, &is_cached,
+ ffd->rep_header_cache, &key, result_pool));
+
+ /* initialize the (shared) FILE member in RS */
+ if (reuse_shared_file)
+ {
+ rs->sfile = *shared_file;
+ }
+ else
+ {
+ shared_file_t *file = apr_pcalloc(result_pool, sizeof(*file));
+ file->revision = revision;
+ file->pool = result_pool;
+ file->fs = fs;
+ rs->sfile = file;
+
+ /* remember the current file, if suggested by the caller */
+ if (shared_file)
+ *shared_file = file;
+ }
+
+ /* read rep header, if necessary */
+ if (!is_cached)
+ {
+ /* we will need the on-disk location for non-txn reps */
+ apr_off_t offset;
+ svn_boolean_t in_container = TRUE;
+
+ /* ensure file is open and navigate to the start of rep header */
+ if (reuse_shared_file)
+ {
+ /* ... we can re-use the same, already open file object.
+ * This implies that we don't read from a txn.
+ */
+ rs->sfile = *shared_file;
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+ }
+ else
+ {
+ /* otherwise, create a new file object. May or may not be
+ * an in-txn file.
+ */
+ SVN_ERR(open_and_seek_representation(&rs->sfile->rfile, fs, rep,
+ result_pool, scratch_pool));
+ }
+
+ if (SVN_IS_VALID_REVNUM(revision))
+ {
+ apr_uint32_t sub_item;
+
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs,
+ rs->sfile->rfile, &rep->id,
+ scratch_pool));
+
+ /* is rep stored in some star-deltified container? */
+ if (sub_item == 0)
+ {
+ svn_fs_x__p2l_entry_t *entry;
+ SVN_ERR(svn_fs_x__p2l_entry_lookup(&entry, fs, rs->sfile->rfile,
+ revision, offset,
+ scratch_pool, scratch_pool));
+ in_container = entry->type == SVN_FS_X__ITEM_TYPE_REPS_CONT;
+ }
+
+ if (in_container)
+ {
+ /* construct a container rep header */
+ *rep_header = apr_pcalloc(result_pool, sizeof(**rep_header));
+ (*rep_header)->type = svn_fs_x__rep_container;
+
+ /* exit to caller */
+ *rep_state = rs;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(rs_aligned_seek(rs, NULL, offset, scratch_pool));
+ }
+
+ SVN_ERR(svn_fs_x__read_rep_header(&rh, rs->sfile->rfile->stream,
+ result_pool, scratch_pool));
+ SVN_ERR(get_file_offset(&rs->start, rs, result_pool));
+
+ /* populate the cache if appropriate */
+ if (SVN_IS_VALID_REVNUM(revision))
+ {
+ SVN_ERR(block_read(NULL, fs, &rs->rep_id, rs->sfile->rfile,
+ result_pool, scratch_pool));
+ if (ffd->rep_header_cache)
+ SVN_ERR(svn_cache__set(ffd->rep_header_cache, &key, rh,
+ scratch_pool));
+ }
+ }
+
+ /* finalize */
+ SVN_ERR(dgb__log_access(fs, &rs->rep_id, rh, SVN_FS_X__ITEM_TYPE_ANY_REP,
+ scratch_pool));
+
+ rs->header_size = rh->header_size;
+ *rep_state = rs;
+ *rep_header = rh;
+
+ rs->chunk_index = 0;
+
+ /* skip "SVNx" diff marker */
+ rs->current = 4;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the rep args for REP in filesystem FS and create a rep_state
+ for reading the representation. Return the rep_state in *REP_STATE
+ and the rep args in *REP_ARGS, both allocated in POOL.
+
+ When reading multiple reps, i.e. a skip delta chain, you may provide
+ non-NULL SHARED_FILE. (If SHARED_FILE is not NULL, in the first
+ call it should be a pointer to NULL.) The function will use this
+ variable to store the previous call results and tries to re-use it.
+ This may result in significant savings in I/O for packed files and
+ number of open file handles.
+ */
+static svn_error_t *
+create_rep_state(rep_state_t **rep_state,
+ svn_fs_x__rep_header_t **rep_header,
+ shared_file_t **shared_file,
+ svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = create_rep_state_body(rep_state, rep_header,
+ shared_file, rep, fs,
+ result_pool, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
+ {
+ /* ### This always returns "-1" for transaction reps, because
+ ### this particular bit of code doesn't know if the rep is
+ ### stored in the protorev or in the mutable area (for props
+ ### or dir contents). It is pretty rare for FSX to *read*
+ ### from the protorev file, though, so this is probably OK.
+ ### And anyone going to debug corruption errors is probably
+ ### going to jump straight to this comment anyway! */
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Corrupt representation '%s'",
+ rep
+ ? svn_fs_x__unparse_representation
+ (rep, TRUE, scratch_pool,
+ scratch_pool)->data
+ : "(null)");
+ }
+ /* ### Call representation_string() ? */
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_fs_x__check_rep(svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset;
+ apr_uint32_t sub_item;
+ svn_fs_x__p2l_entry_t *entry;
+ svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
+
+ svn_fs_x__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, revision,
+ scratch_pool, scratch_pool));
+
+ /* Does REP->ID refer to an actual item? Which one is it? */
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, rev_file, &rep->id,
+ scratch_pool));
+
+ /* What is the type of that item? */
+ SVN_ERR(svn_fs_x__p2l_entry_lookup(&entry, fs, rev_file, revision, offset,
+ scratch_pool, scratch_pool));
+
+ /* Verify that we've got an item that is actually a representation. */
+ if ( entry == NULL
+ || ( entry->type != SVN_FS_X__ITEM_TYPE_FILE_REP
+ && entry->type != SVN_FS_X__ITEM_TYPE_DIR_REP
+ && entry->type != SVN_FS_X__ITEM_TYPE_FILE_PROPS
+ && entry->type != SVN_FS_X__ITEM_TYPE_DIR_PROPS
+ && entry->type != SVN_FS_X__ITEM_TYPE_REPS_CONT))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("No representation found at offset %s "
+ "for item %s in revision %ld"),
+ apr_off_t_toa(scratch_pool, offset),
+ apr_psprintf(scratch_pool, "%" APR_UINT64_T_FMT,
+ rep->id.number),
+ revision);
+
+ return SVN_NO_ERROR;
+}
+
+/* .
+ Do any allocations in POOL. */
+svn_error_t *
+svn_fs_x__rep_chain_length(int *chain_length,
+ int *shard_count,
+ svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_revnum_t shard_size = ffd->max_files_per_dir;
+ svn_boolean_t is_delta = FALSE;
+ int count = 0;
+ int shards = 1;
+ svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
+ svn_revnum_t last_shard = revision / shard_size;
+
+ /* Note that this iteration pool will be used in a non-standard way.
+ * To reuse open file handles between iterations (e.g. while within the
+ * same pack file), we only clear this pool once in a while instead of
+ * at the start of each iteration. */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Check whether the length of the deltification chain is acceptable.
+ * Otherwise, shared reps may form a non-skipping delta chain in
+ * extreme cases. */
+ svn_fs_x__representation_t base_rep = *rep;
+
+ /* re-use open files between iterations */
+ shared_file_t *file_hint = NULL;
+
+ svn_fs_x__rep_header_t *header;
+
+ /* follow the delta chain towards the end but for at most
+ * MAX_CHAIN_LENGTH steps. */
+ do
+ {
+ rep_state_t *rep_state;
+ revision = svn_fs_x__get_revnum(base_rep.id.change_set);
+ if (revision / shard_size != last_shard)
+ {
+ last_shard = revision / shard_size;
+ ++shards;
+ }
+
+ SVN_ERR(create_rep_state_body(&rep_state,
+ &header,
+ &file_hint,
+ &base_rep,
+ fs,
+ iterpool,
+ iterpool));
+
+ base_rep.id.change_set
+ = svn_fs_x__change_set_by_rev(header->base_revision);
+ base_rep.id.number = header->base_item_index;
+ base_rep.size = header->base_length;
+ is_delta = header->type == svn_fs_x__rep_delta;
+
+ /* Clear it the ITERPOOL once in a while. Doing it too frequently
+ * renders the FILE_HINT ineffective. Doing too infrequently, may
+ * leave us with too many open file handles.
+ *
+ * Note that this is mostly about efficiency, with larger values
+ * being more efficient, and any non-zero value is legal here. When
+ * reading deltified contents, we may keep 10s of rev files open at
+ * the same time and the system has to cope with that. Thus, the
+ * limit of 16 chosen below is in the same ballpark.
+ */
+ ++count;
+ if (count % 16 == 0)
+ {
+ file_hint = NULL;
+ svn_pool_clear(iterpool);
+ }
+ }
+ while (is_delta && base_rep.id.change_set);
+
+ *chain_length = count;
+ *shard_count = shards;
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+typedef struct rep_read_baton_t
+{
+ /* The FS from which we're reading. */
+ svn_fs_t *fs;
+
+ /* Representation to read. */
+ svn_fs_x__representation_t rep;
+
+ /* If not NULL, this is the base for the first delta window in rs_list */
+ svn_stringbuf_t *base_window;
+
+ /* The state of all prior delta representations. */
+ apr_array_header_t *rs_list;
+
+ /* The plaintext state, if there is a plaintext. */
+ rep_state_t *src_state;
+
+ /* The index of the current delta chunk, if we are reading a delta. */
+ int chunk_index;
+
+ /* The buffer where we store undeltified data. */
+ char *buf;
+ apr_size_t buf_pos;
+ apr_size_t buf_len;
+
+ /* A checksum context for summing the data read in order to verify it.
+ Note: we don't need to use the sha1 checksum because we're only doing
+ data verification, for which md5 is perfectly safe. */
+ svn_checksum_ctx_t *md5_checksum_ctx;
+
+ svn_boolean_t checksum_finalized;
+
+ /* The stored checksum of the representation we are reading, its
+ length, and the amount we've read so far. Some of this
+ information is redundant with rs_list and src_state, but it's
+ convenient for the checksumming code to have it here. */
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
+
+ svn_filesize_t len;
+ svn_filesize_t off;
+
+ /* The key for the fulltext cache for this rep, if there is a
+ fulltext cache. */
+ svn_fs_x__pair_cache_key_t fulltext_cache_key;
+ /* The text we've been reading, if we're going to cache it. */
+ svn_stringbuf_t *current_fulltext;
+
+ /* If not NULL, attempt to read the data from this cache.
+ Once that lookup fails, reset it to NULL. */
+ svn_cache__t *fulltext_cache;
+
+ /* Bytes delivered from the FULLTEXT_CACHE so far. If the next
+ lookup fails, we need to skip that much data from the reconstructed
+ window stream before we continue normal operation. */
+ svn_filesize_t fulltext_delivered;
+
+ /* Used for temporary allocations during the read. */
+ apr_pool_t *scratch_pool;
+
+ /* Pool used to store file handles and other data that is persistant
+ for the entire stream read. */
+ apr_pool_t *filehandle_pool;
+} rep_read_baton_t;
+
+/* Set window key in *KEY to address the window described by RS.
+ For convenience, return the KEY. */
+static svn_fs_x__window_cache_key_t *
+get_window_key(svn_fs_x__window_cache_key_t *key,
+ rep_state_t *rs)
+{
+ svn_revnum_t revision = svn_fs_x__get_revnum(rs->rep_id.change_set);
+ assert(revision <= APR_UINT32_MAX);
+
+ key->revision = (apr_uint32_t)revision;
+ key->item_index = rs->rep_id.number;
+ key->chunk_index = rs->chunk_index;
+
+ return key;
+}
+
+/* Read the WINDOW_P number CHUNK_INDEX for the representation given in
+ * rep state RS from the current FSX session's cache. This will be a
+ * no-op and IS_CACHED will be set to FALSE if no cache has been given.
+ * If a cache is available IS_CACHED will inform the caller about the
+ * success of the lookup. Allocations (of the window in particualar) will
+ * be made from POOL.
+ *
+ * If the information could be found, put RS to CHUNK_INDEX.
+ */
+
+/* Return data type for get_cached_window_sizes_func.
+ */
+typedef struct window_sizes_t
+{
+ /* length of the txdelta window in its on-disk format */
+ svn_filesize_t packed_len;
+
+ /* expanded (and combined) window length */
+ svn_filesize_t target_len;
+} window_sizes_t;
+
+/* Implements svn_cache__partial_getter_func_t extracting the packed
+ * and expanded window sizes from a cached window and return the size
+ * info as a window_sizes_t* in *OUT.
+ */
+static svn_error_t *
+get_cached_window_sizes_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ const svn_fs_x__txdelta_cached_window_t *window = data;
+ const svn_txdelta_window_t *txdelta_window
+ = svn_temp_deserializer__ptr(window, (const void **)&window->window);
+
+ window_sizes_t *result = apr_palloc(pool, sizeof(*result));
+ result->packed_len = window->end_offset - window->start_offset;
+ result->target_len = txdelta_window->tview_len;
+
+ *out = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the WINDOW_P number CHUNK_INDEX for the representation given in
+ * rep state RS from the current FSFS session's cache. This will be a
+ * no-op and IS_CACHED will be set to FALSE if no cache has been given.
+ * If a cache is available IS_CACHED will inform the caller about the
+ * success of the lookup. Allocations of the window in will be made
+ * from RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ *
+ * If the information could be found, put RS to CHUNK_INDEX.
+ */
+static svn_error_t *
+get_cached_window_sizes(window_sizes_t **sizes,
+ rep_state_t *rs,
+ svn_boolean_t *is_cached,
+ apr_pool_t *pool)
+{
+ if (! rs->window_cache)
+ {
+ /* txdelta window has not been enabled */
+ *is_cached = FALSE;
+ }
+ else
+ {
+ svn_fs_x__window_cache_key_t key = { 0 };
+ SVN_ERR(svn_cache__get_partial((void **)sizes,
+ is_cached,
+ rs->window_cache,
+ get_window_key(&key, rs),
+ get_cached_window_sizes_func,
+ NULL,
+ pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+get_cached_window(svn_txdelta_window_t **window_p,
+ rep_state_t *rs,
+ int chunk_index,
+ svn_boolean_t *is_cached,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (! rs->window_cache)
+ {
+ /* txdelta window has not been enabled */
+ *is_cached = FALSE;
+ }
+ else
+ {
+ /* ask the cache for the desired txdelta window */
+ svn_fs_x__txdelta_cached_window_t *cached_window;
+ svn_fs_x__window_cache_key_t key = { 0 };
+ get_window_key(&key, rs);
+ key.chunk_index = chunk_index;
+ SVN_ERR(svn_cache__get((void **) &cached_window,
+ is_cached,
+ rs->window_cache,
+ &key,
+ result_pool));
+
+ if (*is_cached)
+ {
+ /* found it. Pass it back to the caller. */
+ *window_p = cached_window->window;
+
+ /* manipulate the RS as if we just read the data */
+ rs->current = cached_window->end_offset;
+ rs->chunk_index = chunk_index;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Store the WINDOW read for the rep state RS with the given START_OFFSET
+ * within the pack / rev file in the current FSX session's cache. This
+ * will be a no-op if no cache has been given.
+ * Temporary allocations will be made from SCRATCH_POOL. */
+static svn_error_t *
+set_cached_window(svn_txdelta_window_t *window,
+ rep_state_t *rs,
+ apr_off_t start_offset,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->window_cache)
+ {
+ /* store the window and the first offset _past_ it */
+ svn_fs_x__txdelta_cached_window_t cached_window;
+ svn_fs_x__window_cache_key_t key = {0};
+
+ cached_window.window = window;
+ cached_window.start_offset = start_offset - rs->start;
+ cached_window.end_offset = rs->current;
+
+ /* but key it with the start offset because that is the known state
+ * when we will look it up */
+ SVN_ERR(svn_cache__set(rs->window_cache,
+ get_window_key(&key, rs),
+ &cached_window,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the WINDOW_P for the rep state RS from the current FSX session's
+ * cache. This will be a no-op and IS_CACHED will be set to FALSE if no
+ * cache has been given. If a cache is available IS_CACHED will inform
+ * the caller about the success of the lookup. Allocations (of the window
+ * in particular) will be made from POOL.
+ */
+static svn_error_t *
+get_cached_combined_window(svn_stringbuf_t **window_p,
+ rep_state_t *rs,
+ svn_boolean_t *is_cached,
+ apr_pool_t *pool)
+{
+ if (! rs->combined_cache)
+ {
+ /* txdelta window has not been enabled */
+ *is_cached = FALSE;
+ }
+ else
+ {
+ /* ask the cache for the desired txdelta window */
+ svn_fs_x__window_cache_key_t key = { 0 };
+ return svn_cache__get((void **)window_p,
+ is_cached,
+ rs->combined_cache,
+ get_window_key(&key, rs),
+ pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Store the WINDOW read for the rep state RS in the current FSX session's
+ * cache. This will be a no-op if no cache has been given.
+ * Temporary allocations will be made from SCRATCH_POOL. */
+static svn_error_t *
+set_cached_combined_window(svn_stringbuf_t *window,
+ rep_state_t *rs,
+ apr_pool_t *scratch_pool)
+{
+ if (rs->combined_cache)
+ {
+ /* but key it with the start offset because that is the known state
+ * when we will look it up */
+ svn_fs_x__window_cache_key_t key = { 0 };
+ return svn_cache__set(rs->combined_cache,
+ get_window_key(&key, rs),
+ window,
+ scratch_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Build an array of rep_state structures in *LIST giving the delta
+ reps from first_rep to a self-compressed rep. Set *SRC_STATE to
+ the container rep we find at the end of the chain, or to NULL if
+ the final delta representation is self-compressed.
+ The representation to start from is designated by filesystem FS, id
+ ID, and representation REP.
+ Also, set *WINDOW_P to the base window content for *LIST, if it
+ could be found in cache. Otherwise, *LIST will contain the base
+ representation for the whole delta chain.
+ */
+static svn_error_t *
+build_rep_list(apr_array_header_t **list,
+ svn_stringbuf_t **window_p,
+ rep_state_t **src_state,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *first_rep,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_t rep;
+ rep_state_t *rs = NULL;
+ svn_fs_x__rep_header_t *rep_header;
+ svn_boolean_t is_cached = FALSE;
+ shared_file_t *shared_file = NULL;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ *list = apr_array_make(result_pool, 1, sizeof(rep_state_t *));
+ rep = *first_rep;
+
+ /* for the top-level rep, we need the rep_args */
+ SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file, &rep, fs,
+ result_pool, iterpool));
+
+ while (1)
+ {
+ svn_pool_clear(iterpool);
+
+ /* fetch state, if that has not been done already */
+ if (!rs)
+ SVN_ERR(create_rep_state(&rs, &rep_header, &shared_file,
+ &rep, fs, result_pool, iterpool));
+
+ /* for txn reps and containered reps, there won't be a cached
+ * combined window */
+ if (svn_fs_x__is_revision(rep.id.change_set)
+ && rep_header->type != svn_fs_x__rep_container)
+ SVN_ERR(get_cached_combined_window(window_p, rs, &is_cached,
+ result_pool));
+
+ if (is_cached)
+ {
+ /* We already have a reconstructed window in our cache.
+ Write a pseudo rep_state with the full length. */
+ rs->start = 0;
+ rs->current = 0;
+ rs->size = (*window_p)->len;
+ *src_state = rs;
+ break;
+ }
+
+ if (rep_header->type == svn_fs_x__rep_container)
+ {
+ /* This is a container item, so just return the current rep_state. */
+ *src_state = rs;
+ break;
+ }
+
+ /* Push this rep onto the list. If it's self-compressed, we're done. */
+ APR_ARRAY_PUSH(*list, rep_state_t *) = rs;
+ if (rep_header->type == svn_fs_x__rep_self_delta)
+ {
+ *src_state = NULL;
+ break;
+ }
+
+ rep.id.change_set
+ = svn_fs_x__change_set_by_rev(rep_header->base_revision);
+ rep.id.number = rep_header->base_item_index;
+ rep.size = rep_header->base_length;
+
+ rs = NULL;
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Create a rep_read_baton structure for node revision NODEREV in
+ filesystem FS and store it in *RB_P. If FULLTEXT_CACHE_KEY is not
+ NULL, it is the rep's key in the fulltext cache, and a stringbuf
+ must be allocated to store the text. If rep is mutable, it must be
+ refer to file contents.
+
+ Allocate the result in RESULT_POOL. This includes the pools within *RB_P.
+ */
+static svn_error_t *
+rep_read_get_baton(rep_read_baton_t **rb_p,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ svn_fs_x__pair_cache_key_t fulltext_cache_key,
+ apr_pool_t *result_pool)
+{
+ rep_read_baton_t *b;
+
+ b = apr_pcalloc(result_pool, sizeof(*b));
+ b->fs = fs;
+ b->rep = *rep;
+ b->base_window = NULL;
+ b->chunk_index = 0;
+ b->buf = NULL;
+ b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5,
+ result_pool);
+ b->checksum_finalized = FALSE;
+ memcpy(b->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
+ b->len = rep->expanded_size;
+ b->off = 0;
+ b->fulltext_cache_key = fulltext_cache_key;
+
+ /* Clearable sub-pools. Since they have to remain valid for as long as B
+ lives, we can't take them from some scratch pool. The caller of this
+ function will have no control over how those subpools will be used. */
+ b->scratch_pool = svn_pool_create(result_pool);
+ b->filehandle_pool = svn_pool_create(result_pool);
+ b->fulltext_cache = NULL;
+ b->fulltext_delivered = 0;
+ b->current_fulltext = NULL;
+
+ /* Save our output baton. */
+ *rb_p = b;
+
+ return SVN_NO_ERROR;
+}
+
+/* Skip forwards to THIS_CHUNK in REP_STATE and then read the next delta
+ window into *NWIN. */
+static svn_error_t *
+read_delta_window(svn_txdelta_window_t **nwin, int this_chunk,
+ rep_state_t *rs, apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t is_cached;
+ apr_off_t start_offset;
+ apr_off_t end_offset;
+ apr_pool_t *iterpool;
+
+ SVN_ERR_ASSERT(rs->chunk_index <= this_chunk);
+
+ SVN_ERR(dgb__log_access(rs->sfile->fs, &rs->rep_id, NULL,
+ SVN_FS_X__ITEM_TYPE_ANY_REP, scratch_pool));
+
+ /* Read the next window. But first, try to find it in the cache. */
+ SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
+ result_pool, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* someone has to actually read the data from file. Open it */
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+
+ /* invoke the 'block-read' feature for non-txn data.
+ However, don't do that if we are in the middle of some representation,
+ because the block is unlikely to contain other data. */
+ if ( rs->chunk_index == 0
+ && svn_fs_x__is_revision(rs->rep_id.change_set)
+ && rs->window_cache)
+ {
+ SVN_ERR(block_read(NULL, rs->sfile->fs, &rs->rep_id,
+ rs->sfile->rfile, result_pool, scratch_pool));
+
+ /* reading the whole block probably also provided us with the
+ desired txdelta window */
+ SVN_ERR(get_cached_window(nwin, rs, this_chunk, &is_cached,
+ result_pool, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ /* data is still not cached -> we need to read it.
+ Make sure we have all the necessary info. */
+ SVN_ERR(auto_set_start_offset(rs, scratch_pool));
+ SVN_ERR(auto_read_diff_version(rs, scratch_pool));
+
+ /* RS->FILE may be shared between RS instances -> make sure we point
+ * to the right data. */
+ start_offset = rs->start + rs->current;
+ SVN_ERR(rs_aligned_seek(rs, NULL, start_offset, scratch_pool));
+
+ /* Skip windows to reach the current chunk if we aren't there yet. */
+ iterpool = svn_pool_create(scratch_pool);
+ while (rs->chunk_index < this_chunk)
+ {
+ apr_file_t *file = rs->sfile->rfile->file;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_txdelta_skip_svndiff_window(file, rs->ver, iterpool));
+ rs->chunk_index++;
+ SVN_ERR(svn_fs_x__get_file_offset(&start_offset, file, iterpool));
+
+ rs->current = start_offset - rs->start;
+ if (rs->current >= rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read "
+ "beyond the end of the "
+ "representation"));
+ }
+ svn_pool_destroy(iterpool);
+
+ /* Actually read the next window. */
+ SVN_ERR(svn_txdelta_read_svndiff_window(nwin, rs->sfile->rfile->stream,
+ rs->ver, result_pool));
+ SVN_ERR(get_file_offset(&end_offset, rs, scratch_pool));
+ rs->current = end_offset - rs->start;
+ if (rs->current > rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read beyond "
+ "the end of the representation"));
+
+ /* the window has not been cached before, thus cache it now
+ * (if caching is used for them at all) */
+ if (svn_fs_x__is_revision(rs->rep_id.change_set))
+ SVN_ERR(set_cached_window(*nwin, rs, start_offset, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the whole representation RS and return it in *NWIN. */
+static svn_error_t *
+read_container_window(svn_stringbuf_t **nwin,
+ rep_state_t *rs,
+ apr_size_t size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__rep_extractor_t *extractor = NULL;
+ svn_fs_t *fs = rs->sfile->fs;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__pair_cache_key_t key;
+ svn_revnum_t revision = svn_fs_x__get_revnum(rs->rep_id.change_set);
+
+ SVN_ERR(auto_set_start_offset(rs, scratch_pool));
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = rs->start;
+
+ /* already in cache? */
+ if (ffd->reps_container_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ svn_fs_x__reps_baton_t baton;
+ baton.fs = fs;
+ baton.idx = rs->sub_item;
+
+ SVN_ERR(svn_cache__get_partial((void**)&extractor, &is_cached,
+ ffd->reps_container_cache, &key,
+ svn_fs_x__reps_get_func, &baton,
+ result_pool));
+ }
+
+ /* read from disk, if necessary */
+ if (extractor == NULL)
+ {
+ SVN_ERR(auto_open_shared_file(rs->sfile));
+ SVN_ERR(block_read((void **)&extractor, fs, &rs->rep_id,
+ rs->sfile->rfile, result_pool, scratch_pool));
+ }
+
+ SVN_ERR(svn_fs_x__extractor_drive(nwin, extractor, rs->current, size,
+ result_pool, scratch_pool));
+
+ /* Update RS. */
+ rs->current += (apr_off_t)size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Get the undeltified window that is a result of combining all deltas
+ from the current desired representation identified in *RB with its
+ base representation. Store the window in *RESULT. */
+static svn_error_t *
+get_combined_window(svn_stringbuf_t **result,
+ rep_read_baton_t *rb)
+{
+ apr_pool_t *pool, *new_pool, *window_pool;
+ int i;
+ apr_array_header_t *windows;
+ svn_stringbuf_t *source, *buf = rb->base_window;
+ rep_state_t *rs;
+ apr_pool_t *iterpool;
+
+ /* Read all windows that we need to combine. This is fine because
+ the size of each window is relatively small (100kB) and skip-
+ delta limits the number of deltas in a chain to well under 100.
+ Stop early if one of them does not depend on its predecessors. */
+ window_pool = svn_pool_create(rb->scratch_pool);
+ windows = apr_array_make(window_pool, 0, sizeof(svn_txdelta_window_t *));
+ iterpool = svn_pool_create(rb->scratch_pool);
+ for (i = 0; i < rb->rs_list->nelts; ++i)
+ {
+ svn_txdelta_window_t *window;
+
+ svn_pool_clear(iterpool);
+
+ rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
+ SVN_ERR(read_delta_window(&window, rb->chunk_index, rs, window_pool,
+ iterpool));
+
+ APR_ARRAY_PUSH(windows, svn_txdelta_window_t *) = window;
+ if (window->src_ops == 0)
+ {
+ ++i;
+ break;
+ }
+ }
+
+ /* Combine in the windows from the other delta reps. */
+ pool = svn_pool_create(rb->scratch_pool);
+ for (--i; i >= 0; --i)
+ {
+ svn_txdelta_window_t *window;
+
+ svn_pool_clear(iterpool);
+
+ rs = APR_ARRAY_IDX(rb->rs_list, i, rep_state_t *);
+ window = APR_ARRAY_IDX(windows, i, svn_txdelta_window_t *);
+
+ /* Maybe, we've got a start representation in a container. If we do,
+ read as much data from it as the needed for the txdelta window's
+ source view.
+ Note that BUF / SOURCE may only be NULL in the first iteration. */
+ source = buf;
+ if (source == NULL && rb->src_state != NULL)
+ SVN_ERR(read_container_window(&source, rb->src_state,
+ window->sview_len, pool, iterpool));
+
+ /* Combine this window with the current one. */
+ new_pool = svn_pool_create(rb->scratch_pool);
+ buf = svn_stringbuf_create_ensure(window->tview_len, new_pool);
+ buf->len = window->tview_len;
+
+ svn_txdelta_apply_instructions(window, source ? source->data : NULL,
+ buf->data, &buf->len);
+ if (buf->len != window->tview_len)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("svndiff window length is "
+ "corrupt"));
+
+ /* Cache windows only if the whole rep content could be read as a
+ single chunk. Only then will no other chunk need a deeper RS
+ list than the cached chunk. */
+ if ( (rb->chunk_index == 0) && (rs->current == rs->size)
+ && svn_fs_x__is_revision(rs->rep_id.change_set))
+ SVN_ERR(set_cached_combined_window(buf, rs, new_pool));
+
+ rs->chunk_index++;
+
+ /* Cycle pools so that we only need to hold three windows at a time. */
+ svn_pool_destroy(pool);
+ pool = new_pool;
+ }
+ svn_pool_destroy(iterpool);
+
+ svn_pool_destroy(window_pool);
+
+ *result = buf;
+ return SVN_NO_ERROR;
+}
+
+/* Returns whether or not the expanded fulltext of the file is cachable
+ * based on its size SIZE. The decision depends on the cache used by RB.
+ */
+static svn_boolean_t
+fulltext_size_is_cachable(svn_fs_x__data_t *ffd,
+ svn_filesize_t size)
+{
+ return (size < APR_SIZE_MAX)
+ && svn_cache__is_cachable(ffd->fulltext_cache, (apr_size_t)size);
+}
+
+/* Close method used on streams returned by read_representation().
+ */
+static svn_error_t *
+rep_read_contents_close(void *baton)
+{
+ rep_read_baton_t *rb = baton;
+
+ svn_pool_destroy(rb->scratch_pool);
+ svn_pool_destroy(rb->filehandle_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Inialize the representation read state RS for the given REP_HEADER and
+ * p2l index ENTRY. If not NULL, assign FILE and STREAM to RS.
+ * Allocate all sub-structures of RS in RESULT_POOL.
+ */
+static svn_error_t *
+init_rep_state(rep_state_t *rs,
+ svn_fs_x__rep_header_t *rep_header,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ shared_file_t *shared_file = apr_pcalloc(result_pool, sizeof(*shared_file));
+
+ /* this function does not apply to representation containers */
+ SVN_ERR_ASSERT(entry->type >= SVN_FS_X__ITEM_TYPE_FILE_REP
+ && entry->type <= SVN_FS_X__ITEM_TYPE_DIR_PROPS);
+ SVN_ERR_ASSERT(entry->item_count == 1);
+
+ shared_file->rfile = rev_file;
+ shared_file->fs = fs;
+ shared_file->revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+ shared_file->pool = result_pool;
+
+ rs->sfile = shared_file;
+ rs->rep_id = entry->items[0];
+ rs->header_size = rep_header->header_size;
+ rs->start = entry->offset + rs->header_size;
+ rs->current = 4;
+ rs->size = entry->size - rep_header->header_size - 7;
+ rs->ver = 1;
+ rs->chunk_index = 0;
+ rs->window_cache = ffd->txdelta_window_cache;
+ rs->combined_cache = ffd->combined_window_cache;
+
+ return SVN_NO_ERROR;
+}
+
+/* Walk through all windows in the representation addressed by RS in FS
+ * (excluding the delta bases) and put those not already cached into the
+ * window caches. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset. As a side effect, return the total sum of all
+ * expanded window sizes in *FULLTEXT_LEN.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+cache_windows(svn_filesize_t *fulltext_len,
+ svn_fs_t *fs,
+ rep_state_t *rs,
+ apr_off_t max_offset,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ *fulltext_len = 0;
+
+ while (rs->current < rs->size)
+ {
+ svn_boolean_t is_cached = FALSE;
+ window_sizes_t *window_sizes;
+
+ svn_pool_clear(iterpool);
+ if (max_offset != -1 && rs->start + rs->current >= max_offset)
+ {
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+ }
+
+ /* efficiently skip windows that are still being cached instead
+ * of fully decoding them */
+ SVN_ERR(get_cached_window_sizes(&window_sizes, rs, &is_cached,
+ iterpool));
+ if (is_cached)
+ {
+ *fulltext_len += window_sizes->target_len;
+ rs->current += window_sizes->packed_len;
+ }
+ else
+ {
+ svn_txdelta_window_t *window;
+ apr_off_t start_offset = rs->start + rs->current;
+ apr_off_t end_offset;
+ apr_off_t block_start;
+
+ /* navigate to & read the current window */
+ SVN_ERR(rs_aligned_seek(rs, &block_start, start_offset, iterpool));
+ SVN_ERR(svn_txdelta_read_svndiff_window(&window,
+ rs->sfile->rfile->stream,
+ rs->ver, iterpool));
+
+ /* aggregate expanded window size */
+ *fulltext_len += window->tview_len;
+
+ /* determine on-disk window size */
+ SVN_ERR(svn_fs_x__get_file_offset(&end_offset,
+ rs->sfile->rfile->file,
+ iterpool));
+ rs->current = end_offset - rs->start;
+ if (rs->current > rs->size)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Reading one svndiff window read beyond "
+ "the end of the representation"));
+
+ /* if the window has not been cached before, cache it now
+ * (if caching is used for them at all) */
+ if (!is_cached)
+ SVN_ERR(set_cached_window(window, rs, start_offset, iterpool));
+ }
+
+ rs->chunk_index++;
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Try to get the representation header identified by KEY from FS's cache.
+ * If it has not been cached, read it from the current position in STREAM
+ * and put it into the cache (if caching has been enabled for rep headers).
+ * Return the result in *REP_HEADER. Use POOL for allocations.
+ */
+static svn_error_t *
+read_rep_header(svn_fs_x__rep_header_t **rep_header,
+ svn_fs_t *fs,
+ svn_stream_t *stream,
+ svn_fs_x__representation_cache_key_t *key,
+ apr_pool_t *pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+
+ if (ffd->rep_header_cache)
+ {
+ SVN_ERR(svn_cache__get((void**)rep_header, &is_cached,
+ ffd->rep_header_cache, key, pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_fs_x__read_rep_header(rep_header, stream, pool, pool));
+
+ if (ffd->rep_header_cache)
+ SVN_ERR(svn_cache__set(ffd->rep_header_cache, key, *rep_header, pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_representation_length(svn_filesize_t *packed_len,
+ svn_filesize_t *expanded_len,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_cache_key_t key = { 0 };
+ rep_state_t rs = { 0 };
+ svn_fs_x__rep_header_t *rep_header;
+
+ /* this function does not apply to representation containers */
+ SVN_ERR_ASSERT(entry->type >= SVN_FS_X__ITEM_TYPE_FILE_REP
+ && entry->type <= SVN_FS_X__ITEM_TYPE_DIR_PROPS);
+ SVN_ERR_ASSERT(entry->item_count == 1);
+
+ /* get / read the representation header */
+ key.revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+ key.is_packed = svn_fs_x__is_packed_rev(fs, key.revision);
+ key.item_index = entry->items[0].number;
+ SVN_ERR(read_rep_header(&rep_header, fs, rev_file->stream, &key,
+ scratch_pool));
+
+ /* prepare representation reader state (rs) structure */
+ SVN_ERR(init_rep_state(&rs, rep_header, fs, rev_file, entry,
+ scratch_pool));
+
+ /* RS->SFILE may be shared between RS instances -> make sure we point
+ * to the right data. */
+ *packed_len = rs.size;
+ SVN_ERR(cache_windows(expanded_len, fs, &rs, -1, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the next *LEN bytes of the rep from our plain / delta windows
+ and store them in *BUF. */
+static svn_error_t *
+get_contents_from_windows(rep_read_baton_t *rb,
+ char *buf,
+ apr_size_t *len)
+{
+ apr_size_t copy_len, remaining = *len;
+ char *cur = buf;
+ rep_state_t *rs;
+
+ /* Special case for when there are no delta reps, only a
+ containered text. */
+ if (rb->rs_list->nelts == 0 && rb->buf == NULL)
+ {
+ copy_len = remaining;
+ rs = rb->src_state;
+
+ /* reps in containers don't have a header */
+ if (rs->header_size == 0 && rb->base_window == NULL)
+ {
+ /* RS->SIZE is unreliable here because it is based upon
+ * the delta rep size _before_ putting the data into a
+ * a container. */
+ SVN_ERR(read_container_window(&rb->base_window, rs, rb->len,
+ rb->scratch_pool, rb->scratch_pool));
+ rs->current -= rb->base_window->len;
+ }
+
+ if (rb->base_window != NULL)
+ {
+ /* We got the desired rep directly from the cache.
+ This is where we need the pseudo rep_state created
+ by build_rep_list(). */
+ apr_size_t offset = (apr_size_t)rs->current;
+ if (copy_len + offset > rb->base_window->len)
+ copy_len = offset < rb->base_window->len
+ ? rb->base_window->len - offset
+ : 0ul;
+
+ memcpy (cur, rb->base_window->data + offset, copy_len);
+ }
+
+ rs->current += copy_len;
+ *len = copy_len;
+ return SVN_NO_ERROR;
+ }
+
+ while (remaining > 0)
+ {
+ /* If we have buffered data from a previous chunk, use that. */
+ if (rb->buf)
+ {
+ /* Determine how much to copy from the buffer. */
+ copy_len = rb->buf_len - rb->buf_pos;
+ if (copy_len > remaining)
+ copy_len = remaining;
+
+ /* Actually copy the data. */
+ memcpy(cur, rb->buf + rb->buf_pos, copy_len);
+ rb->buf_pos += copy_len;
+ cur += copy_len;
+ remaining -= copy_len;
+
+ /* If the buffer is all used up, clear it and empty the
+ local pool. */
+ if (rb->buf_pos == rb->buf_len)
+ {
+ svn_pool_clear(rb->scratch_pool);
+ rb->buf = NULL;
+ }
+ }
+ else
+ {
+ svn_stringbuf_t *sbuf = NULL;
+
+ rs = APR_ARRAY_IDX(rb->rs_list, 0, rep_state_t *);
+ if (rs->current == rs->size)
+ break;
+
+ /* Get more buffered data by evaluating a chunk. */
+ SVN_ERR(get_combined_window(&sbuf, rb));
+
+ rb->chunk_index++;
+ rb->buf_len = sbuf->len;
+ rb->buf = sbuf->data;
+ rb->buf_pos = 0;
+ }
+ }
+
+ *len = cur - buf;
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton type for get_fulltext_partial. */
+typedef struct fulltext_baton_t
+{
+ /* Target buffer to write to; of at least LEN bytes. */
+ char *buffer;
+
+ /* Offset within the respective fulltext at which we shall start to
+ copy data into BUFFER. */
+ apr_size_t start;
+
+ /* Number of bytes to copy. The actual amount may be less in case
+ the fulltext is short(er). */
+ apr_size_t len;
+
+ /* Number of bytes actually copied into BUFFER. */
+ apr_size_t read;
+} fulltext_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t for fulltext caches.
+ * From the fulltext in DATA, we copy the range specified by the
+ * fulltext_baton_t* BATON into the buffer provided by that baton.
+ * OUT and RESULT_POOL are not used.
+ */
+static svn_error_t *
+get_fulltext_partial(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ fulltext_baton_t *fulltext_baton = baton;
+
+ /* We cached the fulltext with an NUL appended to it. */
+ apr_size_t fulltext_len = data_len - 1;
+
+ /* Clip the copy range to what the fulltext size allows. */
+ apr_size_t start = MIN(fulltext_baton->start, fulltext_len);
+ fulltext_baton->read = MIN(fulltext_len - start, fulltext_baton->len);
+
+ /* Copy the data to the output buffer and be done. */
+ memcpy(fulltext_baton->buffer, (const char *)data + start,
+ fulltext_baton->read);
+
+ return SVN_NO_ERROR;
+}
+
+/* Find the fulltext specified in BATON in the fulltext cache given
+ * as well by BATON. If that succeeds, set *CACHED to TRUE and copy
+ * up to the next *LEN bytes into BUFFER. Set *LEN to the actual
+ * number of bytes copied.
+ */
+static svn_error_t *
+get_contents_from_fulltext(svn_boolean_t *cached,
+ rep_read_baton_t *baton,
+ char *buffer,
+ apr_size_t *len)
+{
+ void *dummy;
+ fulltext_baton_t fulltext_baton;
+
+ SVN_ERR_ASSERT((apr_size_t)baton->fulltext_delivered
+ == baton->fulltext_delivered);
+ fulltext_baton.buffer = buffer;
+ fulltext_baton.start = (apr_size_t)baton->fulltext_delivered;
+ fulltext_baton.len = *len;
+ fulltext_baton.read = 0;
+
+ SVN_ERR(svn_cache__get_partial(&dummy, cached, baton->fulltext_cache,
+ &baton->fulltext_cache_key,
+ get_fulltext_partial, &fulltext_baton,
+ baton->scratch_pool));
+
+ if (*cached)
+ {
+ baton->fulltext_delivered += fulltext_baton.read;
+ *len = fulltext_baton.read;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Determine the optimal size of a string buf that shall receive a
+ * (full-) text of NEEDED bytes.
+ *
+ * The critical point is that those buffers may be very large and
+ * can cause memory fragmentation. We apply simple heuristics to
+ * make fragmentation less likely.
+ */
+static apr_size_t
+optimimal_allocation_size(apr_size_t needed)
+{
+ /* For all allocations, assume some overhead that is shared between
+ * OS memory managemnt, APR memory management and svn_stringbuf_t. */
+ const apr_size_t overhead = 0x400;
+ apr_size_t optimal;
+
+ /* If an allocation size if safe for other ephemeral buffers, it should
+ * be safe for ours. */
+ if (needed <= SVN__STREAM_CHUNK_SIZE)
+ return needed;
+
+ /* Paranoia edge case:
+ * Skip our heuristics if they created arithmetical overflow.
+ * Beware to make this test work for NEEDED = APR_SIZE_MAX as well! */
+ if (needed >= APR_SIZE_MAX / 2 - overhead)
+ return needed;
+
+ /* As per definition SVN__STREAM_CHUNK_SIZE is a power of two.
+ * Since we know NEEDED to be larger than that, use it as the
+ * starting point.
+ *
+ * Heuristics: Allocate a power-of-two number of bytes that fit
+ * NEEDED plus some OVERHEAD. The APR allocator
+ * will round it up to the next full page size.
+ */
+ optimal = SVN__STREAM_CHUNK_SIZE;
+ while (optimal - overhead < needed)
+ optimal *= 2;
+
+ /* This is above or equal to NEEDED. */
+ return optimal - overhead;
+}
+
+/* After a fulltext cache lookup failure, we will continue to read from
+ * combined delta or plain windows. However, we must first make that data
+ * stream in BATON catch up tho the position LEN already delivered from the
+ * fulltext cache. Also, we need to store the reconstructed fulltext if we
+ * want to cache it at the end.
+ */
+static svn_error_t *
+skip_contents(rep_read_baton_t *baton,
+ svn_filesize_t len)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+
+ /* Do we want to cache the reconstructed fulltext? */
+ if (SVN_IS_VALID_REVNUM(baton->fulltext_cache_key.revision))
+ {
+ char *buffer;
+ svn_filesize_t to_alloc = MAX(len, baton->len);
+
+ /* This should only be happening if BATON->LEN and LEN are
+ * cacheable, implying they fit into memory. */
+ SVN_ERR_ASSERT((apr_size_t)to_alloc == to_alloc);
+
+ /* Allocate the fulltext buffer. */
+ baton->current_fulltext = svn_stringbuf_create_ensure(
+ optimimal_allocation_size((apr_size_t)to_alloc),
+ baton->filehandle_pool);
+
+ /* Read LEN bytes from the window stream and store the data
+ * in the fulltext buffer (will be filled by further reads later). */
+ baton->current_fulltext->len = (apr_size_t)len;
+ baton->current_fulltext->data[(apr_size_t)len] = 0;
+
+ buffer = baton->current_fulltext->data;
+ while (len > 0 && !err)
+ {
+ apr_size_t to_read = (apr_size_t)len;
+ err = get_contents_from_windows(baton, buffer, &to_read);
+ len -= to_read;
+ buffer += to_read;
+ }
+ }
+ else if (len > 0)
+ {
+ /* Simply drain LEN bytes from the window stream. */
+ apr_pool_t *subpool = svn_pool_create(baton->scratch_pool);
+ char *buffer = apr_palloc(subpool, SVN__STREAM_CHUNK_SIZE);
+
+ while (len > 0 && !err)
+ {
+ apr_size_t to_read = len > SVN__STREAM_CHUNK_SIZE
+ ? SVN__STREAM_CHUNK_SIZE
+ : (apr_size_t)len;
+
+ err = get_contents_from_windows(baton, buffer, &to_read);
+ len -= to_read;
+ }
+
+ svn_pool_destroy(subpool);
+ }
+
+ return svn_error_trace(err);
+}
+
+/* BATON is of type `rep_read_baton_t'; read the next *LEN bytes of the
+ representation and store them in *BUF. Sum as we read and verify
+ the MD5 sum at the end. */
+static svn_error_t *
+rep_read_contents(void *baton,
+ char *buf,
+ apr_size_t *len)
+{
+ rep_read_baton_t *rb = baton;
+
+ /* Get data from the fulltext cache for as long as we can. */
+ if (rb->fulltext_cache)
+ {
+ svn_boolean_t cached;
+ SVN_ERR(get_contents_from_fulltext(&cached, rb, buf, len));
+ if (cached)
+ return SVN_NO_ERROR;
+
+ /* Cache miss. From now on, we will never read from the fulltext
+ * cache for this representation anymore. */
+ rb->fulltext_cache = NULL;
+ }
+
+ /* No fulltext cache to help us. We must read from the window stream. */
+ if (!rb->rs_list)
+ {
+ /* Window stream not initialized, yet. Do it now. */
+ SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window,
+ &rb->src_state, rb->fs, &rb->rep,
+ rb->filehandle_pool, rb->scratch_pool));
+
+ /* In case we did read from the fulltext cache before, make the
+ * window stream catch up. Also, initialize the fulltext buffer
+ * if we want to cache the fulltext at the end. */
+ SVN_ERR(skip_contents(rb, rb->fulltext_delivered));
+ }
+
+ /* Get the next block of data. */
+ SVN_ERR(get_contents_from_windows(rb, buf, len));
+
+ if (rb->current_fulltext)
+ svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
+
+ /* Perform checksumming. We want to check the checksum as soon as
+ the last byte of data is read, in case the caller never performs
+ a short read, but we don't want to finalize the MD5 context
+ twice. */
+ if (!rb->checksum_finalized)
+ {
+ SVN_ERR(svn_checksum_update(rb->md5_checksum_ctx, buf, *len));
+ rb->off += *len;
+ if (rb->off == rb->len)
+ {
+ svn_checksum_t *md5_checksum;
+ svn_checksum_t expected;
+ expected.kind = svn_checksum_md5;
+ expected.digest = rb->md5_digest;
+
+ rb->checksum_finalized = TRUE;
+ SVN_ERR(svn_checksum_final(&md5_checksum, rb->md5_checksum_ctx,
+ rb->scratch_pool));
+ if (!svn_checksum_match(md5_checksum, &expected))
+ return svn_error_create(SVN_ERR_FS_CORRUPT,
+ svn_checksum_mismatch_err(&expected, md5_checksum,
+ rb->scratch_pool,
+ _("Checksum mismatch while reading representation")),
+ NULL);
+ }
+ }
+
+ if (rb->off == rb->len && rb->current_fulltext)
+ {
+ svn_fs_x__data_t *ffd = rb->fs->fsap_data;
+ SVN_ERR(svn_cache__set(ffd->fulltext_cache, &rb->fulltext_cache_key,
+ rb->current_fulltext, rb->scratch_pool));
+ rb->current_fulltext = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_contents(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ svn_boolean_t cache_fulltext,
+ apr_pool_t *result_pool)
+{
+ if (! rep)
+ {
+ *contents_p = svn_stream_empty(result_pool);
+ }
+ else
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_filesize_t len = rep->expanded_size;
+ rep_read_baton_t *rb;
+ svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
+
+ svn_fs_x__pair_cache_key_t fulltext_cache_key = { 0 };
+ fulltext_cache_key.revision = revision;
+ fulltext_cache_key.second = rep->id.number;
+
+ /* Initialize the reader baton. Some members may added lazily
+ * while reading from the stream */
+ SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key,
+ result_pool));
+
+ /* Make the stream attempt fulltext cache lookups if the fulltext
+ * is cacheable. If it is not, then also don't try to buffer and
+ * cache it. */
+ if (ffd->fulltext_cache && cache_fulltext
+ && SVN_IS_VALID_REVNUM(revision)
+ && fulltext_size_is_cachable(ffd, len))
+ {
+ rb->fulltext_cache = ffd->fulltext_cache;
+ }
+ else
+ {
+ /* This will also prevent the reconstructed fulltext from being
+ put into the cache. */
+ rb->fulltext_cache_key.revision = SVN_INVALID_REVNUM;
+ }
+
+ *contents_p = svn_stream_create(rb, result_pool);
+ svn_stream_set_read2(*contents_p, NULL /* only full read support */,
+ rep_read_contents);
+ svn_stream_set_close(*contents_p, rep_read_contents_close);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Baton for cache_access_wrapper. Wraps the original parameters of
+ * svn_fs_x__try_process_file_content().
+ */
+typedef struct cache_access_wrapper_baton_t
+{
+ svn_fs_process_contents_func_t func;
+ void* baton;
+} cache_access_wrapper_baton_t;
+
+/* Wrapper to translate between svn_fs_process_contents_func_t and
+ * svn_cache__partial_getter_func_t.
+ */
+static svn_error_t *
+cache_access_wrapper(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ cache_access_wrapper_baton_t *wrapper_baton = baton;
+
+ SVN_ERR(wrapper_baton->func((const unsigned char *)data,
+ data_len - 1, /* cache adds terminating 0 */
+ wrapper_baton->baton,
+ pool));
+
+ /* non-NULL value to signal the calling cache that all went well */
+ *out = baton;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__try_process_file_contents(svn_boolean_t *success,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_t *rep = noderev->data_rep;
+ if (rep)
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__pair_cache_key_t fulltext_cache_key = { 0 };
+
+ fulltext_cache_key.revision = svn_fs_x__get_revnum(rep->id.change_set);
+ fulltext_cache_key.second = rep->id.number;
+ if (ffd->fulltext_cache
+ && SVN_IS_VALID_REVNUM(fulltext_cache_key.revision)
+ && fulltext_size_is_cachable(ffd, rep->expanded_size))
+ {
+ cache_access_wrapper_baton_t wrapper_baton;
+ void *dummy = NULL;
+
+ wrapper_baton.func = processor;
+ wrapper_baton.baton = baton;
+ return svn_cache__get_partial(&dummy, success,
+ ffd->fulltext_cache,
+ &fulltext_cache_key,
+ cache_access_wrapper,
+ &wrapper_baton,
+ scratch_pool);
+ }
+ }
+
+ *success = FALSE;
+ return SVN_NO_ERROR;
+}
+
+/* Baton used when reading delta windows. */
+typedef struct delta_read_baton_t
+{
+ struct rep_state_t *rs;
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
+} delta_read_baton_t;
+
+/* This implements the svn_txdelta_next_window_fn_t interface. */
+static svn_error_t *
+delta_read_next_window(svn_txdelta_window_t **window,
+ void *baton,
+ apr_pool_t *pool)
+{
+ delta_read_baton_t *drb = baton;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ *window = NULL;
+ if (drb->rs->current < drb->rs->size)
+ {
+ SVN_ERR(read_delta_window(window, drb->rs->chunk_index, drb->rs, pool,
+ scratch_pool));
+ drb->rs->chunk_index++;
+ }
+
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements the svn_txdelta_md5_digest_fn_t interface. */
+static const unsigned char *
+delta_read_md5_digest(void *baton)
+{
+ delta_read_baton_t *drb = baton;
+ return drb->md5_digest;
+}
+
+/* Return a txdelta stream for on-disk representation REP_STATE
+ * of TARGET. Allocate the result in RESULT_POOL.
+ */
+static svn_txdelta_stream_t *
+get_storaged_delta_stream(rep_state_t *rep_state,
+ svn_fs_x__noderev_t *target,
+ apr_pool_t *result_pool)
+{
+ /* Create the delta read baton. */
+ delta_read_baton_t *drb = apr_pcalloc(result_pool, sizeof(*drb));
+ drb->rs = rep_state;
+ memcpy(drb->md5_digest, target->data_rep->md5_digest,
+ sizeof(drb->md5_digest));
+ return svn_txdelta_stream_create(drb, delta_read_next_window,
+ delta_read_md5_digest, result_pool);
+}
+
+svn_error_t *
+svn_fs_x__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *source,
+ svn_fs_x__noderev_t *target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *source_stream, *target_stream;
+ rep_state_t *rep_state;
+ svn_fs_x__rep_header_t *rep_header;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* Try a shortcut: if the target is stored as a delta against the source,
+ then just use that delta. However, prefer using the fulltext cache
+ whenever that is available. */
+ if (target->data_rep && (source || !ffd->fulltext_cache))
+ {
+ /* Read target's base rep if any. */
+ SVN_ERR(create_rep_state(&rep_state, &rep_header, NULL,
+ target->data_rep, fs, result_pool,
+ scratch_pool));
+
+ /* Try a shortcut: if the target is stored as a delta against the source,
+ then just use that delta. */
+ if (source && source->data_rep && target->data_rep)
+ {
+ /* If that matches source, then use this delta as is.
+ Note that we want an actual delta here. E.g. a self-delta would
+ not be good enough. */
+ if (rep_header->type == svn_fs_x__rep_delta
+ && rep_header->base_revision
+ == svn_fs_x__get_revnum(source->data_rep->id.change_set)
+ && rep_header->base_item_index == source->data_rep->id.number)
+ {
+ *stream_p = get_storaged_delta_stream(rep_state, target,
+ result_pool);
+ return SVN_NO_ERROR;
+ }
+ }
+ else if (!source)
+ {
+ /* We want a self-delta. There is a fair chance that TARGET got
+ added in this revision and is already stored in the requested
+ format. */
+ if (rep_header->type == svn_fs_x__rep_self_delta)
+ {
+ *stream_p = get_storaged_delta_stream(rep_state, target,
+ result_pool);
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Don't keep file handles open for longer than necessary. */
+ if (rep_state->sfile->rfile)
+ {
+ SVN_ERR(svn_fs_x__close_revision_file(rep_state->sfile->rfile));
+ rep_state->sfile->rfile = NULL;
+ }
+ }
+
+ /* Read both fulltexts and construct a delta. */
+ if (source)
+ SVN_ERR(svn_fs_x__get_contents(&source_stream, fs, source->data_rep,
+ TRUE, result_pool));
+ else
+ source_stream = svn_stream_empty(result_pool);
+
+ SVN_ERR(svn_fs_x__get_contents(&target_stream, fs, target->data_rep,
+ TRUE, result_pool));
+
+ /* Because source and target stream will already verify their content,
+ * there is no need to do this once more. In particular if the stream
+ * content is being fetched from cache. */
+ svn_txdelta2(stream_p, source_stream, target_stream, FALSE, result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE when all svn_fs_x__dirent_t* in ENTRIES are already sorted
+ by their respective name. */
+static svn_boolean_t
+sorted(apr_array_header_t *entries)
+{
+ int i;
+
+ const svn_fs_x__dirent_t * const *dirents = (const void *)entries->elts;
+ for (i = 0; i < entries->nelts-1; ++i)
+ if (strcmp(dirents[i]->name, dirents[i+1]->name) > 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Compare the names of the two dirents given in **A and **B. */
+static int
+compare_dirents(const void *a,
+ const void *b)
+{
+ const svn_fs_x__dirent_t *lhs = *((const svn_fs_x__dirent_t * const *) a);
+ const svn_fs_x__dirent_t *rhs = *((const svn_fs_x__dirent_t * const *) b);
+
+ return strcmp(lhs->name, rhs->name);
+}
+
+/* Compare the name of the dirents given in **A with the C string in *B. */
+static int
+compare_dirent_name(const void *a,
+ const void *b)
+{
+ const svn_fs_x__dirent_t *lhs = *((const svn_fs_x__dirent_t * const *) a);
+ const char *rhs = b;
+
+ return strcmp(lhs->name, rhs);
+}
+
+/* Into ENTRIES, read all directories entries from the key-value text in
+ * STREAM. If INCREMENTAL is TRUE, read until the end of the STREAM and
+ * update the data. ID is provided for nicer error messages.
+ */
+static svn_error_t *
+read_dir_entries(apr_array_header_t *entries,
+ svn_stream_t *stream,
+ svn_boolean_t incremental,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_t *hash = incremental ? svn_hash__make(scratch_pool) : NULL;
+ const char *terminator = SVN_HASH_TERMINATOR;
+
+ /* Read until the terminator (non-incremental) or the end of STREAM
+ (incremental mode). In the latter mode, we use a temporary HASH
+ to make updating and removing entries cheaper. */
+ while (1)
+ {
+ svn_hash__entry_t entry;
+ svn_fs_x__dirent_t *dirent;
+ char *str;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_hash__read_entry(&entry, stream, terminator,
+ incremental, iterpool));
+
+ /* End of directory? */
+ if (entry.key == NULL)
+ {
+ /* In incremental mode, we skip the terminator and read the
+ increments following it until the end of the stream. */
+ if (incremental && terminator)
+ terminator = NULL;
+ else
+ break;
+ }
+
+ /* Deleted entry? */
+ if (entry.val == NULL)
+ {
+ /* We must be in incremental mode */
+ assert(hash);
+ apr_hash_set(hash, entry.key, entry.keylen, NULL);
+ continue;
+ }
+
+ /* Add a new directory entry. */
+ dirent = apr_pcalloc(result_pool, sizeof(*dirent));
+ dirent->name = apr_pstrmemdup(result_pool, entry.key, entry.keylen);
+
+ str = svn_cstring_tokenize(" ", &entry.val);
+ if (str == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_x__id_unparse(id, scratch_pool)->data);
+
+ if (strcmp(str, SVN_FS_X__KIND_FILE) == 0)
+ {
+ dirent->kind = svn_node_file;
+ }
+ else if (strcmp(str, SVN_FS_X__KIND_DIR) == 0)
+ {
+ dirent->kind = svn_node_dir;
+ }
+ else
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_x__id_unparse(id, scratch_pool)->data);
+ }
+
+ str = svn_cstring_tokenize(" ", &entry.val);
+ if (str == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Directory entry corrupt in '%s'"),
+ svn_fs_x__id_unparse(id, scratch_pool)->data);
+
+ SVN_ERR(svn_fs_x__id_parse(&dirent->id, str));
+
+ /* In incremental mode, update the hash; otherwise, write to the
+ * final array. */
+ if (incremental)
+ apr_hash_set(hash, dirent->name, entry.keylen, dirent);
+ else
+ APR_ARRAY_PUSH(entries, svn_fs_x__dirent_t *) = dirent;
+ }
+
+ /* Convert container to a sorted array. */
+ if (incremental)
+ {
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(iterpool, hash); hi; hi = apr_hash_next(hi))
+ APR_ARRAY_PUSH(entries, svn_fs_x__dirent_t *) = apr_hash_this_val(hi);
+ }
+
+ if (!sorted(entries))
+ svn_sort__array(entries, compare_dirents);
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Fetch the contents of a directory into ENTRIES. Values are stored
+ as filename to string mappings; further conversion is necessary to
+ convert them into svn_fs_x__dirent_t values. */
+static svn_error_t *
+get_dir_contents(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *contents;
+ const svn_fs_x__id_t *id = &noderev->noderev_id;
+
+ *entries = apr_array_make(result_pool, 16, sizeof(svn_fs_x__dirent_t *));
+ if (noderev->data_rep
+ && ! svn_fs_x__is_revision(noderev->data_rep->id.change_set))
+ {
+ const char *filename
+ = svn_fs_x__path_txn_node_children(fs, id, scratch_pool,
+ scratch_pool);
+
+ /* The representation is mutable. Read the old directory
+ contents from the mutable children file, followed by the
+ changes we've made in this transaction. */
+ SVN_ERR(svn_stream_open_readonly(&contents, filename, scratch_pool,
+ scratch_pool));
+ SVN_ERR(read_dir_entries(*entries, contents, TRUE, id,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_stream_close(contents));
+ }
+ else if (noderev->data_rep)
+ {
+ /* Undeltify content before parsing it. Otherwise, we could only
+ * parse it byte-by-byte.
+ */
+ apr_size_t len = noderev->data_rep->expanded_size;
+ svn_stringbuf_t *text;
+
+ /* The representation is immutable. Read it normally. */
+ SVN_ERR(svn_fs_x__get_contents(&contents, fs, noderev->data_rep,
+ FALSE, scratch_pool));
+ SVN_ERR(svn_stringbuf_from_stream(&text, contents, len, scratch_pool));
+ SVN_ERR(svn_stream_close(contents));
+
+ /* de-serialize hash */
+ contents = svn_stream_from_stringbuf(text, scratch_pool);
+ SVN_ERR(read_dir_entries(*entries, contents, FALSE, id,
+ result_pool, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Return the cache object in FS responsible to storing the directory the
+ * NODEREV plus the corresponding pre-allocated *KEY.
+ */
+static svn_cache__t *
+locate_dir_cache(svn_fs_t *fs,
+ svn_fs_x__id_t *key,
+ svn_fs_x__noderev_t *noderev)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ if (svn_fs_x__is_txn(noderev->noderev_id.change_set))
+ {
+ /* data in txns must be addressed by ID since the representation has
+ not been created, yet. */
+ *key = noderev->noderev_id;
+ }
+ else
+ {
+ /* committed data can use simple rev,item pairs */
+ if (noderev->data_rep)
+ {
+ *key = noderev->data_rep->id;
+ }
+ else
+ {
+ /* no data rep -> empty directory.
+ Use a key that does definitely not clash with non-NULL reps. */
+ key->change_set = SVN_FS_X__INVALID_CHANGE_SET;
+ key->number = SVN_FS_X__ITEM_INDEX_UNUSED;
+ }
+ }
+
+ return ffd->dir_cache;
+}
+
+svn_error_t *
+svn_fs_x__rep_contents_dir(apr_array_header_t **entries_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__id_t key;
+
+ /* find the cache we may use */
+ svn_cache__t *cache = locate_dir_cache(fs, &key, noderev);
+ if (cache)
+ {
+ svn_boolean_t found;
+
+ SVN_ERR(svn_cache__get((void **)entries_p, &found, cache, &key,
+ result_pool));
+ if (found)
+ return SVN_NO_ERROR;
+ }
+
+ /* Read in the directory contents. */
+ SVN_ERR(get_dir_contents(entries_p, fs, noderev, result_pool,
+ scratch_pool));
+
+ /* Update the cache, if we are to use one. */
+ if (cache)
+ SVN_ERR(svn_cache__set(cache, &key, *entries_p, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_fs_x__dirent_t *
+svn_fs_x__find_dir_entry(apr_array_header_t *entries,
+ const char *name,
+ int *hint)
+{
+ svn_fs_x__dirent_t **result
+ = svn_sort__array_lookup(entries, name, hint, compare_dirent_name);
+ return result ? *result : NULL;
+}
+
+svn_error_t *
+svn_fs_x__rep_contents_dir_entry(svn_fs_x__dirent_t **dirent,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ const char *name,
+ apr_size_t *hint,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t found = FALSE;
+
+ /* find the cache we may use */
+ svn_fs_x__id_t key;
+ svn_cache__t *cache = locate_dir_cache(fs, &key, noderev);
+ if (cache)
+ {
+ svn_fs_x__ede_baton_t baton;
+ baton.hint = *hint;
+ baton.name = name;
+
+ /* Cache lookup. */
+ SVN_ERR(svn_cache__get_partial((void **)dirent,
+ &found,
+ cache,
+ &key,
+ svn_fs_x__extract_dir_entry,
+ &baton,
+ result_pool));
+
+ /* Remember the new clue only if we found something at that spot. */
+ if (found)
+ *hint = baton.hint;
+ }
+
+ /* fetch data from disk if we did not find it in the cache */
+ if (! found)
+ {
+ apr_array_header_t *entries;
+ svn_fs_x__dirent_t *entry;
+ svn_fs_x__dirent_t *entry_copy = NULL;
+
+ /* read the dir from the file system. It will probably be put it
+ into the cache for faster lookup in future calls. */
+ SVN_ERR(svn_fs_x__rep_contents_dir(&entries, fs, noderev,
+ scratch_pool, scratch_pool));
+
+ /* find desired entry and return a copy in POOL, if found */
+ entry = svn_fs_x__find_dir_entry(entries, name, NULL);
+ if (entry)
+ {
+ entry_copy = apr_pmemdup(result_pool, entry, sizeof(*entry_copy));
+ entry_copy->name = apr_pstrdup(result_pool, entry->name);
+ }
+
+ *dirent = entry_copy;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *proplist;
+ svn_stream_t *stream;
+ const svn_fs_x__id_t *noderev_id = &noderev->noderev_id;
+
+ if (noderev->prop_rep
+ && !svn_fs_x__is_revision(noderev->prop_rep->id.change_set))
+ {
+ const char *filename = svn_fs_x__path_txn_node_props(fs, noderev_id,
+ scratch_pool,
+ scratch_pool);
+ proplist = apr_hash_make(result_pool);
+
+ SVN_ERR(svn_stream_open_readonly(&stream, filename, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR,
+ result_pool));
+ SVN_ERR(svn_stream_close(stream));
+ }
+ else if (noderev->prop_rep)
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__representation_t *rep = noderev->prop_rep;
+ svn_fs_x__pair_cache_key_t key = { 0 };
+
+ key.revision = svn_fs_x__get_revnum(rep->id.change_set);
+ key.second = rep->id.number;
+ if (ffd->properties_cache && SVN_IS_VALID_REVNUM(key.revision))
+ {
+ svn_boolean_t is_cached;
+ SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
+ ffd->properties_cache, &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ proplist = apr_hash_make(result_pool);
+ SVN_ERR(svn_fs_x__get_contents(&stream, fs, noderev->prop_rep, FALSE,
+ scratch_pool));
+ SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR,
+ result_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->id.change_set))
+ SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist,
+ scratch_pool));
+ }
+ else
+ {
+ /* return an empty prop list if the node doesn't have any props */
+ proplist = apr_hash_make(result_pool);
+ }
+
+ *proplist_p = proplist;
+
+ return SVN_NO_ERROR;
+}
+
+
+
+svn_error_t *
+svn_fs_x__get_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__revision_file_t *revision_file;
+ svn_boolean_t found;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
+
+ svn_fs_x__id_t id;
+ id.change_set = svn_fs_x__change_set_by_rev(rev);
+ id.number = SVN_FS_X__ITEM_INDEX_CHANGES;
+
+ /* Provide revision file. */
+
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&revision_file, fs, rev,
+ scratch_pool, scratch_pool));
+
+ /* try cache lookup first */
+
+ if (ffd->changes_container_cache && svn_fs_x__is_packed_rev(fs, rev))
+ {
+ apr_off_t offset;
+ apr_uint32_t sub_item;
+ svn_fs_x__pair_cache_key_t key;
+
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, revision_file,
+ &id, scratch_pool));
+ key.revision = svn_fs_x__packed_base_rev(fs, rev);
+ key.second = offset;
+
+ SVN_ERR(svn_cache__get_partial((void **)changes, &found,
+ ffd->changes_container_cache, &key,
+ svn_fs_x__changes_get_list_func,
+ &sub_item, result_pool));
+ }
+ else if (ffd->changes_cache)
+ {
+ SVN_ERR(svn_cache__get((void **) changes, &found, ffd->changes_cache,
+ &rev, result_pool));
+ }
+ else
+ {
+ found = FALSE;
+ }
+
+ if (!found)
+ {
+ /* 'block-read' will also provide us with the desired data */
+ SVN_ERR(block_read((void **)changes, fs, &id, revision_file,
+ result_pool, scratch_pool));
+
+ SVN_ERR(svn_fs_x__close_revision_file(revision_file));
+ }
+
+ SVN_ERR(dgb__log_access(fs, &id, *changes, SVN_FS_X__ITEM_TYPE_CHANGES,
+ scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+/* Fetch the representation data (header, txdelta / plain windows)
+ * addressed by ENTRY->ITEM in FS and cache it if caches are enabled.
+ * Read the data from the already open FILE and the wrapping
+ * STREAM object. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+block_read_contents(svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ svn_fs_x__pair_cache_key_t *key,
+ apr_off_t max_offset,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__representation_cache_key_t header_key = { 0 };
+ rep_state_t rs = { 0 };
+ svn_filesize_t fulltext_len;
+ svn_fs_x__rep_header_t *rep_header;
+
+ if (!ffd->txdelta_window_cache || !ffd->combined_window_cache)
+ return SVN_NO_ERROR;
+
+ header_key.revision = (apr_int32_t)key->revision;
+ header_key.is_packed = svn_fs_x__is_packed_rev(fs, header_key.revision);
+ header_key.item_index = key->second;
+
+ SVN_ERR(read_rep_header(&rep_header, fs, rev_file->stream, &header_key,
+ scratch_pool));
+ SVN_ERR(init_rep_state(&rs, rep_header, fs, rev_file, entry, scratch_pool));
+ SVN_ERR(cache_windows(&fulltext_len, fs, &rs, max_offset, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For the given REV_FILE in FS, in *STREAM return a stream covering the
+ * item specified by ENTRY. Also, verify the item's content by low-level
+ * checksum. Allocate the result in POOL.
+ */
+static svn_error_t *
+read_item(svn_stream_t **stream,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_pool_t *pool)
+{
+ apr_uint32_t digest;
+ svn_checksum_t *expected, *actual;
+ apr_uint32_t plain_digest;
+
+ /* Read item into string buffer. */
+ svn_stringbuf_t *text = svn_stringbuf_create_ensure(entry->size, pool);
+ text->len = entry->size;
+ text->data[text->len] = 0;
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, text->data, text->len,
+ NULL, NULL, pool));
+
+ /* Return (construct, calculate) stream and checksum. */
+ *stream = svn_stream_from_stringbuf(text, pool);
+ digest = svn__fnv1a_32x4(text->data, text->len);
+
+ /* Checksums will match most of the time. */
+ if (entry->fnv1_checksum == digest)
+ return SVN_NO_ERROR;
+
+ /* Construct proper checksum objects from their digests to allow for
+ * nice error messages. */
+ plain_digest = htonl(entry->fnv1_checksum);
+ expected = svn_checksum__from_digest_fnv1a_32x4(
+ (const unsigned char *)&plain_digest, pool);
+ plain_digest = htonl(digest);
+ actual = svn_checksum__from_digest_fnv1a_32x4(
+ (const unsigned char *)&plain_digest, pool);
+
+ /* Construct the full error message with all the info we have. */
+ return svn_checksum_mismatch_err(expected, actual, pool,
+ _("Low-level checksum mismatch while reading\n"
+ "%s bytes of meta data at offset %s "),
+ apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->size),
+ apr_psprintf(pool, "%" APR_OFF_T_FMT, entry->offset));
+}
+
+/* Read all txdelta / plain windows following REP_HEADER in FS as described
+ * by ENTRY. Read the data from the already open FILE and the wrapping
+ * STREAM object. If MAX_OFFSET is not -1, don't read windows that start
+ * at or beyond that offset. Use SCRATCH_POOL for temporary allocations.
+ * If caching is not enabled, this is a no-op.
+ */
+static svn_error_t *
+block_read_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+ svn_revnum_t revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+ if (!must_read && !ffd->changes_cache)
+ return SVN_NO_ERROR;
+
+ /* we don't support containers, yet */
+ SVN_ERR_ASSERT(entry->item_count == 1);
+
+ /* already in cache? */
+ if (!must_read && ffd->changes_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->changes_cache, &revision,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read changes from revision file */
+
+ SVN_ERR(svn_fs_x__read_changes(changes, stream, result_pool, scratch_pool));
+
+ /* cache for future reference */
+
+ if (ffd->changes_cache)
+ {
+ /* Guesstimate for the size of the in-cache representation. */
+ apr_size_t estimated_size = (apr_size_t)250 * (*changes)->nelts;
+
+ /* Don't even serialize data that probably won't fit into the
+ * cache. This often implies that either CHANGES is very
+ * large, memory is scarce or both. Having a huge temporary
+ * copy would not be a good thing in either case. */
+ if (svn_cache__is_cachable(ffd->changes_cache, estimated_size))
+ SVN_ERR(svn_cache__set(ffd->changes_cache, &revision, *changes,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+block_read_changes_container(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_uint32_t sub_item,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__changes_t *container;
+ svn_fs_x__pair_cache_key_t key;
+ svn_stream_t *stream;
+ svn_revnum_t revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = entry->offset;
+
+ /* already in cache? */
+ if (!must_read && ffd->changes_container_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->changes_container_cache,
+ &key, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read changes from revision file */
+
+ SVN_ERR(svn_fs_x__read_changes_container(&container, stream, scratch_pool,
+ scratch_pool));
+
+ /* extract requested data */
+
+ if (must_read)
+ SVN_ERR(svn_fs_x__changes_get_list(changes, container, sub_item,
+ result_pool));
+
+ if (ffd->changes_container_cache)
+ SVN_ERR(svn_cache__set(ffd->changes_container_cache, &key, container,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+block_read_noderev(svn_fs_x__noderev_t **noderev_p,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ svn_fs_x__pair_cache_key_t *key,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+ if (!must_read && !ffd->node_revision_cache)
+ return SVN_NO_ERROR;
+
+ /* we don't support containers, yet */
+ SVN_ERR_ASSERT(entry->item_count == 1);
+
+ /* already in cache? */
+ if (!must_read && ffd->node_revision_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->node_revision_cache, key,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read node rev from revision file */
+
+ SVN_ERR(svn_fs_x__read_noderev(noderev_p, stream, result_pool,
+ scratch_pool));
+ if (ffd->node_revision_cache)
+ SVN_ERR(svn_cache__set(ffd->node_revision_cache, key, *noderev_p,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+block_read_noderevs_container(svn_fs_x__noderev_t **noderev_p,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_uint32_t sub_item,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__noderevs_t *container;
+ svn_stream_t *stream;
+ svn_fs_x__pair_cache_key_t key;
+ svn_revnum_t revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = entry->offset;
+
+ /* already in cache? */
+ if (!must_read && ffd->noderevs_container_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->noderevs_container_cache,
+ &key, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read noderevs from revision file */
+ SVN_ERR(svn_fs_x__read_noderevs_container(&container, stream, scratch_pool,
+ scratch_pool));
+
+ /* extract requested data */
+ if (must_read)
+ SVN_ERR(svn_fs_x__noderevs_get(noderev_p, container, sub_item,
+ result_pool));
+
+ if (ffd->noderevs_container_cache)
+ SVN_ERR(svn_cache__set(ffd->noderevs_container_cache, &key, container,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+block_read_reps_container(svn_fs_x__rep_extractor_t **extractor,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_uint32_t sub_item,
+ svn_boolean_t must_read,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__reps_t *container;
+ svn_stream_t *stream;
+ svn_fs_x__pair_cache_key_t key;
+ svn_revnum_t revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+
+ key.revision = svn_fs_x__packed_base_rev(fs, revision);
+ key.second = entry->offset;
+
+ /* already in cache? */
+ if (!must_read && ffd->reps_container_cache)
+ {
+ svn_boolean_t is_cached = FALSE;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->reps_container_cache,
+ &key, scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(read_item(&stream, fs, rev_file, entry, scratch_pool));
+
+ /* read noderevs from revision file */
+ SVN_ERR(svn_fs_x__read_reps_container(&container, stream, result_pool,
+ scratch_pool));
+
+ /* extract requested data */
+
+ if (must_read)
+ SVN_ERR(svn_fs_x__reps_get(extractor, fs, container, sub_item,
+ result_pool));
+
+ if (ffd->noderevs_container_cache)
+ SVN_ERR(svn_cache__set(ffd->reps_container_cache, &key, container,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+block_read(void **result,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ svn_fs_x__revision_file_t *revision_file,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_off_t offset, wanted_offset = 0;
+ apr_off_t block_start = 0;
+ apr_uint32_t wanted_sub_item = 0;
+ svn_revnum_t revision = svn_fs_x__get_revnum(id->change_set);
+ apr_array_header_t *entries;
+ int run_count = 0;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* don't try this on transaction protorev files */
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(revision));
+
+ /* index lookup: find the OFFSET of the item we *must* read plus (in the
+ * "do-while" block) the list of items in the same block. */
+ SVN_ERR(svn_fs_x__item_offset(&wanted_offset, &wanted_sub_item, fs,
+ revision_file, id, iterpool));
+
+ offset = wanted_offset;
+ do
+ {
+ /* fetch list of items in the block surrounding OFFSET */
+ SVN_ERR(aligned_seek(fs, revision_file->file, &block_start, offset,
+ iterpool));
+ SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, fs, revision_file,
+ revision, block_start,
+ ffd->block_size, scratch_pool,
+ scratch_pool));
+
+ /* read all items from the block */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_boolean_t is_result, is_wanted;
+ apr_pool_t *pool;
+
+ svn_fs_x__p2l_entry_t* entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t);
+
+ /* skip empty sections */
+ if (entry->type == SVN_FS_X__ITEM_TYPE_UNUSED)
+ continue;
+
+ /* the item / container we were looking for? */
+ is_wanted = entry->offset == wanted_offset
+ && entry->item_count >= wanted_sub_item
+ && svn_fs_x__id_eq(entry->items + wanted_sub_item, id);
+ is_result = result && is_wanted;
+
+ /* select the pool that we want the item to be allocated in */
+ pool = is_result ? result_pool : iterpool;
+
+ /* handle all items that start within this block and are relatively
+ * small (i.e. < block size). Always read the item we need to return.
+ */
+ if (is_result || ( entry->offset >= block_start
+ && entry->size < ffd->block_size))
+ {
+ void *item = NULL;
+ svn_fs_x__pair_cache_key_t key = { 0 };
+ key.revision = svn_fs_x__get_revnum(entry->items[0].change_set);
+ key.second = entry->items[0].number;
+
+ SVN_ERR(svn_io_file_seek(revision_file->file, SEEK_SET,
+ &entry->offset, iterpool));
+ switch (entry->type)
+ {
+ case SVN_FS_X__ITEM_TYPE_FILE_REP:
+ case SVN_FS_X__ITEM_TYPE_DIR_REP:
+ case SVN_FS_X__ITEM_TYPE_FILE_PROPS:
+ case SVN_FS_X__ITEM_TYPE_DIR_PROPS:
+ SVN_ERR(block_read_contents(fs, revision_file,
+ entry, &key,
+ is_wanted
+ ? -1
+ : block_start + ffd->block_size,
+ iterpool));
+ break;
+
+ case SVN_FS_X__ITEM_TYPE_NODEREV:
+ if (ffd->node_revision_cache || is_result)
+ SVN_ERR(block_read_noderev((svn_fs_x__noderev_t **)&item,
+ fs, revision_file,
+ entry, &key, is_result,
+ pool, iterpool));
+ break;
+
+ case SVN_FS_X__ITEM_TYPE_CHANGES:
+ SVN_ERR(block_read_changes((apr_array_header_t **)&item,
+ fs, revision_file,
+ entry, is_result,
+ pool, iterpool));
+ break;
+
+ case SVN_FS_X__ITEM_TYPE_CHANGES_CONT:
+ SVN_ERR(block_read_changes_container
+ ((apr_array_header_t **)&item,
+ fs, revision_file,
+ entry, wanted_sub_item,
+ is_result, pool, iterpool));
+ break;
+
+ case SVN_FS_X__ITEM_TYPE_NODEREVS_CONT:
+ SVN_ERR(block_read_noderevs_container
+ ((svn_fs_x__noderev_t **)&item,
+ fs, revision_file,
+ entry, wanted_sub_item,
+ is_result, pool, iterpool));
+ break;
+
+ case SVN_FS_X__ITEM_TYPE_REPS_CONT:
+ SVN_ERR(block_read_reps_container
+ ((svn_fs_x__rep_extractor_t **)&item,
+ fs, revision_file,
+ entry, wanted_sub_item,
+ is_result, pool, iterpool));
+ break;
+
+ default:
+ break;
+ }
+
+ if (is_result)
+ *result = item;
+
+ /* if we crossed a block boundary, read the remainder of
+ * the last block as well */
+ offset = entry->offset + entry->size;
+ if (offset > block_start + ffd->block_size)
+ ++run_count;
+
+ svn_pool_clear(iterpool);
+ }
+ }
+ }
+ while(run_count++ == 1); /* can only be true once and only if a block
+ * boundary got crossed */
+
+ /* if the caller requested a result, we must have provided one by now */
+ assert(!result || *result);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/cached_data.h b/subversion/libsvn_fs_x/cached_data.h
new file mode 100644
index 0000000..079303e
--- /dev/null
+++ b/subversion/libsvn_fs_x/cached_data.h
@@ -0,0 +1,180 @@
+/* cached_data.h --- cached (read) access to FSX data
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__CACHED_DATA_H
+#define SVN_LIBSVN_FS__CACHED_DATA_H
+
+#include "svn_pools.h"
+#include "svn_fs.h"
+
+#include "fs.h"
+#include "index.h"
+
+
+
+/* Set *NODEREV_P to the node-revision for the node ID in FS. Do any
+ allocations in POOL. */
+svn_error_t *
+svn_fs_x__get_node_revision(svn_fs_x__noderev_t **noderev_p,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set *COUNT to the value of the mergeinfo_count member of the node-
+ revision for the node ID in FS. Do temporary allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__get_mergeinfo_count(apr_int64_t *count,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *scratch_pool);
+
+/* Verify that representation REP in FS can be accessed.
+ Do any allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__check_rep(svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Follow the representation delta chain in FS starting with REP. The
+ number of reps (including REP) in the chain will be returned in
+ *CHAIN_LENGTH. *SHARD_COUNT will be set to the number of shards
+ accessed. Do any allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__rep_chain_length(int *chain_length,
+ int *shard_count,
+ svn_fs_x__representation_t *rep,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Set *CONTENTS to be a readable svn_stream_t that receives the text
+ representation REP as seen in filesystem FS. If CACHE_FULLTEXT is
+ not set, bypass fulltext cache lookup for this rep and don't put the
+ reconstructed fulltext into cache.
+ Allocate *CONTENT_P in RESULT_POOL. */
+svn_error_t *
+svn_fs_x__get_contents(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ svn_boolean_t cache_fulltext,
+ apr_pool_t *result_pool);
+
+/* Determine on-disk and expanded sizes of the representation identified
+ * by ENTRY in FS and return the result in PACKED_LEN and EXPANDED_LEN,
+ * respectively. FILE must point to the start of the representation and
+ * STREAM must be a stream defined on top of FILE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__get_representation_length(svn_filesize_t *packed_len,
+ svn_filesize_t *expanded_len,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t* entry,
+ apr_pool_t *scratch_pool);
+
+/* Attempt to fetch the text representation of node-revision NODEREV as
+ seen in filesystem FS and pass it along with the BATON to the PROCESSOR.
+ Set *SUCCESS only of the data could be provided and the processing
+ had been called.
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__try_process_file_contents(svn_boolean_t *success,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *scratch_pool);
+
+/* Set *STREAM_P to a delta stream turning the contents of the file SOURCE
+ into the contents of the file TARGET, allocated in RESULT_POOL.
+ If SOURCE is NULL, an empty string will be used in its stead.
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *source,
+ svn_fs_x__noderev_t *target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set *ENTRIES to an apr_array_header_t of dirent structs that contain
+ the directory entries of node-revision NODEREV in filesystem FS. The
+ returned table is allocated in RESULT_POOL and entries are sorted
+ lexicographically. SCRATCH_POOL is used for temporary allocations. */
+svn_error_t *
+svn_fs_x__rep_contents_dir(apr_array_header_t **entries_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return the directory entry from ENTRIES that matches NAME. If no such
+ entry exists, return NULL. If HINT is not NULL, set *HINT to the array
+ index of the entry returned. Successive calls in a linear scan scenario
+ will be faster called with the same HINT variable. */
+svn_fs_x__dirent_t *
+svn_fs_x__find_dir_entry(apr_array_header_t *entries,
+ const char *name,
+ int *hint);
+
+/* Set *DIRENT to the entry identified by NAME in the directory given
+ by NODEREV in filesystem FS. If no such entry exits, *DIRENT will
+ be NULL. The value referenced by HINT can be used to speed up
+ consecutive calls when travering the directory in name order.
+ Any value is allowed, however APR_SIZE_MAX gives best performance
+ when there has been no previous lookup for the same directory.
+
+ The returned object is allocated in RESULT_POOL; SCRATCH_POOL
+ used for temporary allocations. */
+svn_error_t *
+svn_fs_x__rep_contents_dir_entry(svn_fs_x__dirent_t **dirent,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ const char *name,
+ apr_size_t *hint,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set *PROPLIST to be an apr_hash_t containing the property list of
+ node-revision NODEREV as seen in filesystem FS. Allocate the result
+ in RESULT_POOL and use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__get_proplist(apr_hash_t **proplist,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Fetch the list of change in revision REV in FS and return it in *CHANGES.
+ * Allocate the result in POOL.
+ */
+svn_error_t *
+svn_fs_x__get_changes(apr_array_header_t **changes,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/caching.c b/subversion/libsvn_fs_x/caching.c
new file mode 100644
index 0000000..17e80bd
--- /dev/null
+++ b/subversion/libsvn_fs_x/caching.c
@@ -0,0 +1,725 @@
+/* caching.c : in-memory caching
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "fs.h"
+#include "fs_x.h"
+#include "id.h"
+#include "dag.h"
+#include "tree.h"
+#include "index.h"
+#include "changes.h"
+#include "noderevs.h"
+#include "temp_serializer.h"
+#include "reps.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_config.h"
+#include "svn_cache_config.h"
+
+#include "svn_private_config.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+
+#include "private/svn_debug.h"
+#include "private/svn_subr_private.h"
+
+/* Take the ORIGINAL string and replace all occurrences of ":" without
+ * limiting the key space. Allocate the result in RESULT_POOL.
+ */
+static const char *
+normalize_key_part(const char *original,
+ apr_pool_t *result_pool)
+{
+ apr_size_t i;
+ apr_size_t len = strlen(original);
+ svn_stringbuf_t *normalized = svn_stringbuf_create_ensure(len,
+ result_pool);
+
+ for (i = 0; i < len; ++i)
+ {
+ char c = original[i];
+ switch (c)
+ {
+ case ':': svn_stringbuf_appendbytes(normalized, "%_", 2);
+ break;
+ case '%': svn_stringbuf_appendbytes(normalized, "%%", 2);
+ break;
+ default : svn_stringbuf_appendbyte(normalized, c);
+ }
+ }
+
+ return normalized->data;
+}
+
+/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS and *CACHE_REVPROPS flags will be set
+ according to FS->CONFIG. *CACHE_NAMESPACE receives the cache prefix
+ to use.
+
+ Allocate CACHE_NAMESPACE in RESULT_POOL. */
+static svn_error_t *
+read_config(const char **cache_namespace,
+ svn_boolean_t *cache_txdeltas,
+ svn_boolean_t *cache_fulltexts,
+ svn_boolean_t *cache_revprops,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ /* No cache namespace by default. I.e. all FS instances share the
+ * cached data. If you specify different namespaces, the data will
+ * share / compete for the same cache memory but keys will not match
+ * across namespaces and, thus, cached data will not be shared between
+ * namespaces.
+ *
+ * Since the namespace will be concatenated with other elements to form
+ * the complete key prefix, we must make sure that the resulting string
+ * is unique and cannot be created by any other combination of elements.
+ */
+ *cache_namespace
+ = normalize_key_part(svn_hash__get_cstring(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_NS,
+ ""),
+ result_pool);
+
+ /* don't cache text deltas by default.
+ * Once we reconstructed the fulltexts from the deltas,
+ * these deltas are rarely re-used. Therefore, only tools
+ * like svnadmin will activate this to speed up operations
+ * dump and verify.
+ */
+ *cache_txdeltas
+ = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_DELTAS,
+ TRUE);
+
+ /* by default, cache fulltexts.
+ * Most SVN tools care about reconstructed file content.
+ * Thus, this is a reasonable default.
+ * SVN admin tools may set that to FALSE because fulltexts
+ * won't be re-used rendering the cache less effective
+ * by squeezing wanted data out.
+ */
+ *cache_fulltexts
+ = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
+ TRUE);
+
+ /* don't cache revprops by default.
+ * Revprop caching significantly speeds up operations like
+ * svn ls -v. However, it requires synchronization that may
+ * not be available or efficient in the current server setup.
+ * Option "2" is equivalent to "1".
+ */
+ if (strcmp(svn_hash__get_cstring(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
+ ""), "2"))
+ *cache_revprops
+ = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
+ FALSE);
+ else
+ *cache_revprops = TRUE;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Implements svn_cache__error_handler_t
+ * This variant clears the error after logging it.
+ */
+static svn_error_t *
+warn_and_continue_on_cache_errors(svn_error_t *err,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs = baton;
+ (fs->warning)(fs->warning_baton, err);
+ svn_error_clear(err);
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_cache__error_handler_t
+ * This variant logs the error and passes it on to the callers.
+ */
+static svn_error_t *
+warn_and_fail_on_cache_errors(svn_error_t *err,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs = baton;
+ (fs->warning)(fs->warning_baton, err);
+ return err;
+}
+
+#ifdef SVN_DEBUG_CACHE_DUMP_STATS
+/* Baton to be used for the dump_cache_statistics() pool cleanup function, */
+typedef struct dump_cache_baton_t
+{
+ /* the pool about to be cleaned up. Will be used for temp. allocations. */
+ apr_pool_t *pool;
+
+ /* the cache to dump the statistics for */
+ svn_cache__t *cache;
+} dump_cache_baton_t;
+
+/* APR pool cleanup handler that will printf the statistics of the
+ cache referenced by the baton in BATON_VOID. */
+static apr_status_t
+dump_cache_statistics(void *baton_void)
+{
+ dump_cache_baton_t *baton = baton_void;
+
+ apr_status_t result = APR_SUCCESS;
+ svn_cache__info_t info;
+ svn_string_t *text_stats;
+ apr_array_header_t *lines;
+ int i;
+
+ svn_error_t *err = svn_cache__get_info(baton->cache,
+ &info,
+ TRUE,
+ baton->pool);
+
+ /* skip unused caches */
+ if (! err && (info.gets > 0 || info.sets > 0))
+ {
+ text_stats = svn_cache__format_info(&info, TRUE, baton->pool);
+ lines = svn_cstring_split(text_stats->data, "\n", FALSE, baton->pool);
+
+ for (i = 0; i < lines->nelts; ++i)
+ {
+ const char *line = APR_ARRAY_IDX(lines, i, const char *);
+#ifdef SVN_DEBUG
+ SVN_DBG(("%s\n", line));
+#endif
+ }
+ }
+
+ /* process error returns */
+ if (err)
+ {
+ result = err->apr_err;
+ svn_error_clear(err);
+ }
+
+ return result;
+}
+
+static apr_status_t
+dump_global_cache_statistics(void *baton_void)
+{
+ apr_pool_t *pool = baton_void;
+
+ svn_cache__info_t *info = svn_cache__membuffer_get_global_info(pool);
+ svn_string_t *text_stats = svn_cache__format_info(info, FALSE, pool);
+ apr_array_header_t *lines = svn_cstring_split(text_stats->data, "\n",
+ FALSE, pool);
+
+ int i;
+ for (i = 0; i < lines->nelts; ++i)
+ {
+ const char *line = APR_ARRAY_IDX(lines, i, const char *);
+#ifdef SVN_DEBUG
+ SVN_DBG(("%s\n", line));
+#endif
+ }
+
+ return APR_SUCCESS;
+}
+
+#endif /* SVN_DEBUG_CACHE_DUMP_STATS */
+
+/* This function sets / registers the required callbacks for a given
+ * not transaction-specific CACHE object in FS, if CACHE is not NULL.
+ *
+ * All these svn_cache__t instances shall be handled uniformly. Unless
+ * ERROR_HANDLER is NULL, register it for the given CACHE in FS.
+ */
+static svn_error_t *
+init_callbacks(svn_cache__t *cache,
+ svn_fs_t *fs,
+ svn_cache__error_handler_t error_handler,
+ apr_pool_t *pool)
+{
+ if (cache != NULL)
+ {
+#ifdef SVN_DEBUG_CACHE_DUMP_STATS
+
+ /* schedule printing the access statistics upon pool cleanup,
+ * i.e. end of FSX session.
+ */
+ dump_cache_baton_t *baton;
+
+ baton = apr_palloc(pool, sizeof(*baton));
+ baton->pool = pool;
+ baton->cache = cache;
+
+ apr_pool_cleanup_register(pool,
+ baton,
+ dump_cache_statistics,
+ apr_pool_cleanup_null);
+#endif
+
+ if (error_handler)
+ SVN_ERR(svn_cache__set_error_handler(cache,
+ error_handler,
+ fs,
+ pool));
+
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Sets *CACHE_P to cache instance based on provided options.
+ * Creates memcache if MEMCACHE is not NULL. Creates membuffer cache if
+ * MEMBUFFER is not NULL. Fallbacks to inprocess cache if MEMCACHE and
+ * MEMBUFFER are NULL and pages is non-zero. Sets *CACHE_P to NULL
+ * otherwise. Use the given PRIORITY class for the new cache. If it
+ * is 0, then use the default priority class.
+ *
+ * Unless NO_HANDLER is true, register an error handler that reports errors
+ * as warnings to the FS warning callback.
+ *
+ * Cache is allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
+ * */
+static svn_error_t *
+create_cache(svn_cache__t **cache_p,
+ svn_memcache_t *memcache,
+ svn_membuffer_t *membuffer,
+ apr_int64_t pages,
+ apr_int64_t items_per_page,
+ svn_cache__serialize_func_t serializer,
+ svn_cache__deserialize_func_t deserializer,
+ apr_ssize_t klen,
+ const char *prefix,
+ apr_uint32_t priority,
+ svn_fs_t *fs,
+ svn_boolean_t no_handler,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_cache__error_handler_t error_handler = no_handler
+ ? NULL
+ : warn_and_fail_on_cache_errors;
+ if (priority == 0)
+ priority = SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY;
+
+ if (memcache)
+ {
+ SVN_ERR(svn_cache__create_memcache(cache_p, memcache,
+ serializer, deserializer, klen,
+ prefix, result_pool));
+ error_handler = no_handler
+ ? NULL
+ : warn_and_continue_on_cache_errors;
+ }
+ else if (membuffer)
+ {
+ SVN_ERR(svn_cache__create_membuffer_cache(
+ cache_p, membuffer, serializer, deserializer,
+ klen, prefix, priority, FALSE, result_pool, scratch_pool));
+ }
+ else if (pages)
+ {
+ SVN_ERR(svn_cache__create_inprocess(
+ cache_p, serializer, deserializer, klen, pages,
+ items_per_page, FALSE, prefix, result_pool));
+ }
+ else
+ {
+ *cache_p = NULL;
+ }
+
+ SVN_ERR(init_callbacks(*cache_p, fs, error_handler, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__initialize_caches(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *prefix = apr_pstrcat(scratch_pool,
+ "fsx:", fs->uuid,
+ "/", normalize_key_part(fs->path,
+ scratch_pool),
+ ":",
+ SVN_VA_NULL);
+ svn_membuffer_t *membuffer;
+ svn_boolean_t no_handler = ffd->fail_stop;
+ svn_boolean_t cache_txdeltas;
+ svn_boolean_t cache_fulltexts;
+ svn_boolean_t cache_revprops;
+ const char *cache_namespace;
+
+ /* Evaluating the cache configuration. */
+ SVN_ERR(read_config(&cache_namespace,
+ &cache_txdeltas,
+ &cache_fulltexts,
+ &cache_revprops,
+ fs,
+ scratch_pool));
+
+ prefix = apr_pstrcat(scratch_pool, "ns:", cache_namespace, ":", prefix,
+ SVN_VA_NULL);
+
+ membuffer = svn_cache__get_global_membuffer_cache();
+
+ /* General rules for assigning cache priorities:
+ *
+ * - Data that can be reconstructed from other elements has low prio
+ * (e.g. fulltexts, directories etc.)
+ * - Index data required to find any of the other data has high prio
+ * (e.g. noderevs, L2P and P2L index pages)
+ * - everthing else should use default prio
+ */
+
+#ifdef SVN_DEBUG_CACHE_DUMP_STATS
+
+ /* schedule printing the global access statistics upon pool cleanup,
+ * i.e. end of FSX session.
+ */
+ if (membuffer)
+ apr_pool_cleanup_register(fs->pool,
+ fs->pool,
+ dump_global_cache_statistics,
+ apr_pool_cleanup_null);
+#endif
+
+ /* Rough estimate: revision DAG nodes have size around 320 bytes, so
+ * let's put 16 on a page. */
+ SVN_ERR(create_cache(&(ffd->rev_node_cache),
+ NULL,
+ membuffer,
+ 1024, 16,
+ svn_fs_x__dag_serialize,
+ svn_fs_x__dag_deserialize,
+ APR_HASH_KEY_STRING,
+ apr_pstrcat(scratch_pool, prefix, "DAG", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* 1st level DAG node cache */
+ ffd->dag_node_cache = svn_fs_x__create_dag_cache(fs->pool);
+
+ /* Very rough estimate: 1K per directory. */
+ SVN_ERR(create_cache(&(ffd->dir_cache),
+ NULL,
+ membuffer,
+ 1024, 8,
+ svn_fs_x__serialize_dir_entries,
+ svn_fs_x__deserialize_dir_entries,
+ sizeof(svn_fs_x__id_t),
+ apr_pstrcat(scratch_pool, prefix, "DIR", SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* Only 16 bytes per entry (a revision number + the corresponding offset).
+ Since we want ~8k pages, that means 512 entries per page. */
+ SVN_ERR(create_cache(&(ffd->packed_offset_cache),
+ NULL,
+ membuffer,
+ 32, 1,
+ svn_fs_x__serialize_manifest,
+ svn_fs_x__deserialize_manifest,
+ sizeof(svn_revnum_t),
+ apr_pstrcat(scratch_pool, prefix, "PACK-MANIFEST",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* initialize node revision cache, if caching has been enabled */
+ SVN_ERR(create_cache(&(ffd->node_revision_cache),
+ NULL,
+ membuffer,
+ 32, 32, /* ~200 byte / entry; 1k entries total */
+ svn_fs_x__serialize_node_revision,
+ svn_fs_x__deserialize_node_revision,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "NODEREVS",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* initialize representation header cache, if caching has been enabled */
+ SVN_ERR(create_cache(&(ffd->rep_header_cache),
+ NULL,
+ membuffer,
+ 1, 1000, /* ~8 bytes / entry; 1k entries total */
+ svn_fs_x__serialize_rep_header,
+ svn_fs_x__deserialize_rep_header,
+ sizeof(svn_fs_x__representation_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "REPHEADER",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* initialize node change list cache, if caching has been enabled */
+ SVN_ERR(create_cache(&(ffd->changes_cache),
+ NULL,
+ membuffer,
+ 1, 8, /* 1k / entry; 8 entries total, rarely used */
+ svn_fs_x__serialize_changes,
+ svn_fs_x__deserialize_changes,
+ sizeof(svn_revnum_t),
+ apr_pstrcat(scratch_pool, prefix, "CHANGES",
+ SVN_VA_NULL),
+ 0,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ /* if enabled, cache fulltext and other derived information */
+ if (cache_fulltexts)
+ {
+ SVN_ERR(create_cache(&(ffd->fulltext_cache),
+ ffd->memcache,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ /* Values are svn_stringbuf_t */
+ NULL, NULL,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "TEXT",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(create_cache(&(ffd->properties_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_properties,
+ svn_fs_x__deserialize_properties,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "PROP",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(create_cache(&(ffd->mergeinfo_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_mergeinfo,
+ svn_fs_x__deserialize_mergeinfo,
+ APR_HASH_KEY_STRING,
+ apr_pstrcat(scratch_pool, prefix, "MERGEINFO",
+ SVN_VA_NULL),
+ 0,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(create_cache(&(ffd->mergeinfo_existence_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ /* Values are svn_stringbuf_t */
+ NULL, NULL,
+ APR_HASH_KEY_STRING,
+ apr_pstrcat(scratch_pool, prefix, "HAS_MERGEINFO",
+ SVN_VA_NULL),
+ 0,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ }
+ else
+ {
+ ffd->fulltext_cache = NULL;
+ ffd->properties_cache = NULL;
+ ffd->mergeinfo_cache = NULL;
+ ffd->mergeinfo_existence_cache = NULL;
+ }
+
+ /* if enabled, cache revprops */
+ if (cache_revprops)
+ {
+ SVN_ERR(create_cache(&(ffd->revprop_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_properties,
+ svn_fs_x__deserialize_properties,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "REVPROP",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ }
+ else
+ {
+ ffd->revprop_cache = NULL;
+ }
+
+ /* if enabled, cache text deltas and their combinations */
+ if (cache_txdeltas)
+ {
+ SVN_ERR(create_cache(&(ffd->txdelta_window_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_txdelta_window,
+ svn_fs_x__deserialize_txdelta_window,
+ sizeof(svn_fs_x__window_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "TXDELTA_WINDOW",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(create_cache(&(ffd->combined_window_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ /* Values are svn_stringbuf_t */
+ NULL, NULL,
+ sizeof(svn_fs_x__window_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "COMBINED_WINDOW",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_LOW_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ }
+ else
+ {
+ ffd->txdelta_window_cache = NULL;
+ ffd->combined_window_cache = NULL;
+ }
+
+ SVN_ERR(create_cache(&(ffd->noderevs_container_cache),
+ NULL,
+ membuffer,
+ 16, 4, /* Important, largish objects */
+ svn_fs_x__serialize_noderevs_container,
+ svn_fs_x__deserialize_noderevs_container,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "NODEREVSCNT",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ SVN_ERR(create_cache(&(ffd->changes_container_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_changes_container,
+ svn_fs_x__deserialize_changes_container,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "CHANGESCNT",
+ SVN_VA_NULL),
+ 0,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ SVN_ERR(create_cache(&(ffd->reps_container_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use inprocess cache */
+ svn_fs_x__serialize_reps_container,
+ svn_fs_x__deserialize_reps_container,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "REPSCNT",
+ SVN_VA_NULL),
+ 0,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(create_cache(&(ffd->l2p_header_cache),
+ NULL,
+ membuffer,
+ 64, 16, /* entry size varies but we must cover
+ a reasonable number of revisions (1k) */
+ svn_fs_x__serialize_l2p_header,
+ svn_fs_x__deserialize_l2p_header,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "L2P_HEADER",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ SVN_ERR(create_cache(&(ffd->l2p_page_cache),
+ NULL,
+ membuffer,
+ 64, 16, /* entry size varies but we must cover
+ a reasonable number of revisions (1k) */
+ svn_fs_x__serialize_l2p_page,
+ svn_fs_x__deserialize_l2p_page,
+ sizeof(svn_fs_x__page_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "L2P_PAGE",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ SVN_ERR(create_cache(&(ffd->p2l_header_cache),
+ NULL,
+ membuffer,
+ 4, 1, /* Large entries. Rarely used. */
+ svn_fs_x__serialize_p2l_header,
+ svn_fs_x__deserialize_p2l_header,
+ sizeof(svn_fs_x__pair_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "P2L_HEADER",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+ SVN_ERR(create_cache(&(ffd->p2l_page_cache),
+ NULL,
+ membuffer,
+ 4, 16, /* Variably sized entries. Rarely used. */
+ svn_fs_x__serialize_p2l_page,
+ svn_fs_x__deserialize_p2l_page,
+ sizeof(svn_fs_x__page_cache_key_t),
+ apr_pstrcat(scratch_pool, prefix, "P2L_PAGE",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_HIGH_PRIORITY,
+ fs,
+ no_handler,
+ fs->pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/changes.c b/subversion/libsvn_fs_x/changes.c
new file mode 100644
index 0000000..a7d5ee2
--- /dev/null
+++ b/subversion/libsvn_fs_x/changes.c
@@ -0,0 +1,536 @@
+/* changes.h --- FSX changed paths lists container
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_private_config.h"
+
+#include "private/svn_packed_data.h"
+
+#include "changes.h"
+#include "string_table.h"
+#include "temp_serializer.h"
+
+/* These flags will be used with the FLAGS field in binary_change_t.
+ */
+
+/* the change contains a text modification */
+#define CHANGE_TEXT_MOD 0x00001
+
+/* the change contains a property modification */
+#define CHANGE_PROP_MOD 0x00002
+
+/* the last part (rev_id) of node revision ID is a transaction ID */
+#define CHANGE_TXN_NODE 0x00004
+
+/* (flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT extracts the node type */
+#define CHANGE_NODE_SHIFT 0x00003
+#define CHANGE_NODE_MASK 0x00018
+
+/* node types according to svn_node_kind_t */
+#define CHANGE_NODE_NONE 0x00000
+#define CHANGE_NODE_FILE 0x00008
+#define CHANGE_NODE_DIR 0x00010
+#define CHANGE_NODE_UNKNOWN 0x00018
+
+/* (flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT extracts the change type */
+#define CHANGE_KIND_SHIFT 0x00005
+#define CHANGE_KIND_MASK 0x000E0
+
+/* node types according to svn_fs_path_change_kind_t */
+#define CHANGE_KIND_MODIFY 0x00000
+#define CHANGE_KIND_ADD 0x00020
+#define CHANGE_KIND_DELETE 0x00040
+#define CHANGE_KIND_REPLACE 0x00060
+#define CHANGE_KIND_RESET 0x00080
+#define CHANGE_KIND_MOVE 0x000A0
+#define CHANGE_KIND_MOVEREPLACE 0x000C0
+
+/* Our internal representation of a change */
+typedef struct binary_change_t
+{
+ /* define the kind of change and what specific information is present */
+ int flags;
+
+ /* Path of the change. */
+ apr_size_t path;
+
+ /* copy-from information.
+ * Not present if COPYFROM_REV is SVN_INVALID_REVNUM. */
+ svn_revnum_t copyfrom_rev;
+ apr_size_t copyfrom_path;
+
+ /* Relevant parts of the node revision ID of the change.
+ * Empty, if REV_ID is not "used". */
+ svn_fs_x__id_t noderev_id;
+
+} binary_change_t;
+
+/* The actual container object. Change lists are concatenated into CHANGES
+ * and and their begins and ends are stored in OFFSETS.
+ */
+struct svn_fs_x__changes_t
+{
+ /* The paths - either in 'builder' mode or finalized mode.
+ * The respective other pointer will be NULL. */
+ string_table_builder_t *builder;
+ string_table_t *paths;
+
+ /* All changes of all change lists concatenated.
+ * Array elements are binary_change_t.structs (not pointer!) */
+ apr_array_header_t *changes;
+
+ /* [Offsets[index] .. Offsets[index+1]) is the range in CHANGES that
+ * forms the contents of change list INDEX. */
+ apr_array_header_t *offsets;
+};
+
+/* Create and return a new container object, allocated in RESULT_POOL with
+ * an initial capacity of INITIAL_COUNT changes. The PATH and BUILDER
+ * members must be initialized by the caller afterwards.
+ */
+static svn_fs_x__changes_t *
+changes_create_body(apr_size_t initial_count,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__changes_t *changes = apr_pcalloc(result_pool, sizeof(*changes));
+
+ changes->changes = apr_array_make(result_pool, (int)initial_count,
+ sizeof(binary_change_t));
+ changes->offsets = apr_array_make(result_pool, 16, sizeof(int));
+ APR_ARRAY_PUSH(changes->offsets, int) = 0;
+
+ return changes;
+}
+
+svn_fs_x__changes_t *
+svn_fs_x__changes_create(apr_size_t initial_count,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__changes_t *changes = changes_create_body(initial_count,
+ result_pool);
+ changes->builder = svn_fs_x__string_table_builder_create(result_pool);
+
+ return changes;
+}
+
+/* Add CHANGE to the latest change list in CHANGES.
+ */
+static svn_error_t *
+append_change(svn_fs_x__changes_t *changes,
+ svn_fs_x__change_t *change)
+{
+ binary_change_t binary_change = { 0 };
+ svn_boolean_t is_txn_id;
+
+ /* CHANGE must be sufficiently complete */
+ SVN_ERR_ASSERT(change);
+ SVN_ERR_ASSERT(change->path.data);
+
+ /* Relevant parts of the revision ID of the change. */
+ binary_change.noderev_id = change->noderev_id;
+
+ /* define the kind of change and what specific information is present */
+ is_txn_id = svn_fs_x__is_txn(binary_change.noderev_id.change_set);
+ binary_change.flags = (change->text_mod ? CHANGE_TEXT_MOD : 0)
+ | (change->prop_mod ? CHANGE_PROP_MOD : 0)
+ | (is_txn_id ? CHANGE_TXN_NODE : 0)
+ | ((int)change->change_kind << CHANGE_KIND_SHIFT)
+ | ((int)change->node_kind << CHANGE_NODE_SHIFT);
+
+ /* Path of the change. */
+ binary_change.path
+ = svn_fs_x__string_table_builder_add(changes->builder,
+ change->path.data,
+ change->path.len);
+
+ /* copy-from information, if presence is indicated by FLAGS */
+ if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
+ {
+ binary_change.copyfrom_rev = change->copyfrom_rev;
+ binary_change.copyfrom_path
+ = svn_fs_x__string_table_builder_add(changes->builder,
+ change->copyfrom_path,
+ 0);
+ }
+ else
+ {
+ binary_change.copyfrom_rev = SVN_INVALID_REVNUM;
+ binary_change.copyfrom_path = 0;
+ }
+
+ APR_ARRAY_PUSH(changes->changes, binary_change_t) = binary_change;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__changes_append_list(apr_size_t *list_index,
+ svn_fs_x__changes_t *changes,
+ apr_array_header_t *list)
+{
+ int i;
+
+ /* CHANGES must be in 'builder' mode */
+ SVN_ERR_ASSERT(changes->builder);
+ SVN_ERR_ASSERT(changes->paths == NULL);
+
+ /* simply append the list and all changes */
+ for (i = 0; i < list->nelts; ++i)
+ append_change(changes, APR_ARRAY_IDX(list, i, svn_fs_x__change_t *));
+
+ /* terminate the list by storing the next changes offset */
+ APR_ARRAY_PUSH(changes->offsets, int) = changes->changes->nelts;
+ *list_index = (apr_size_t)(changes->offsets->nelts - 2);
+
+ return SVN_NO_ERROR;
+}
+
+apr_size_t
+svn_fs_x__changes_estimate_size(const svn_fs_x__changes_t *changes)
+{
+ /* CHANGES must be in 'builder' mode */
+ if (changes->builder == NULL)
+ return 0;
+
+ /* string table code makes its own prediction,
+ * changes should be < 10 bytes each,
+ * some static overhead should be assumed */
+ return svn_fs_x__string_table_builder_estimate_size(changes->builder)
+ + changes->changes->nelts * 10
+ + 100;
+}
+
+svn_error_t *
+svn_fs_x__changes_get_list(apr_array_header_t **list,
+ const svn_fs_x__changes_t *changes,
+ apr_size_t idx,
+ apr_pool_t *pool)
+{
+ int first;
+ int last;
+ int i;
+
+ /* CHANGES must be in 'finalized' mode */
+ SVN_ERR_ASSERT(changes->builder == NULL);
+ SVN_ERR_ASSERT(changes->paths);
+
+ /* validate index */
+ if (idx + 1 >= (apr_size_t)changes->offsets->nelts)
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ apr_psprintf(pool,
+ _("Changes list index %%%s"
+ " exceeds container size %%d"),
+ APR_SIZE_T_FMT),
+ idx, changes->offsets->nelts - 1);
+
+ /* range of changes to return */
+ first = APR_ARRAY_IDX(changes->offsets, (int)idx, int);
+ last = APR_ARRAY_IDX(changes->offsets, (int)idx + 1, int);
+
+ /* construct result */
+ *list = apr_array_make(pool, last - first, sizeof(svn_fs_x__change_t*));
+ for (i = first; i < last; ++i)
+ {
+ const binary_change_t *binary_change
+ = &APR_ARRAY_IDX(changes->changes, i, binary_change_t);
+
+ /* convert BINARY_CHANGE into a standard FSX svn_fs_x__change_t */
+ svn_fs_x__change_t *change = apr_pcalloc(pool, sizeof(*change));
+ change->path.data = svn_fs_x__string_table_get(changes->paths,
+ binary_change->path,
+ &change->path.len,
+ pool);
+
+ if (binary_change->noderev_id.change_set != SVN_FS_X__INVALID_CHANGE_SET)
+ change->noderev_id = binary_change->noderev_id;
+
+ change->change_kind = (svn_fs_path_change_kind_t)
+ ((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
+ change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+ change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+ change->node_kind = (svn_node_kind_t)
+ ((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
+
+ change->copyfrom_rev = binary_change->copyfrom_rev;
+ change->copyfrom_known = TRUE;
+ if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
+ change->copyfrom_path
+ = svn_fs_x__string_table_get(changes->paths,
+ binary_change->copyfrom_path,
+ NULL,
+ pool);
+
+ /* add it to the result */
+ APR_ARRAY_PUSH(*list, svn_fs_x__change_t*) = change;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__write_changes_container(svn_stream_t *stream,
+ const svn_fs_x__changes_t *changes,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ string_table_t *paths = changes->paths
+ ? changes->paths
+ : svn_fs_x__string_table_create(changes->builder,
+ scratch_pool);
+
+ svn_packed__data_root_t *root = svn_packed__data_create_root(scratch_pool);
+
+ /* one top-level stream for each array */
+ svn_packed__int_stream_t *offsets_stream
+ = svn_packed__create_int_stream(root, TRUE, FALSE);
+ svn_packed__int_stream_t *changes_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+
+ /* structure the CHANGES_STREAM such we can extract much of the redundancy
+ * from the binary_change_t structs */
+ svn_packed__create_int_substream(changes_stream, TRUE, FALSE);
+ svn_packed__create_int_substream(changes_stream, TRUE, FALSE);
+ svn_packed__create_int_substream(changes_stream, TRUE, TRUE);
+ svn_packed__create_int_substream(changes_stream, TRUE, FALSE);
+ svn_packed__create_int_substream(changes_stream, TRUE, TRUE);
+ svn_packed__create_int_substream(changes_stream, TRUE, FALSE);
+
+ /* serialize offsets array */
+ for (i = 0; i < changes->offsets->nelts; ++i)
+ svn_packed__add_uint(offsets_stream,
+ APR_ARRAY_IDX(changes->offsets, i, int));
+
+ /* serialize changes array */
+ for (i = 0; i < changes->changes->nelts; ++i)
+ {
+ const binary_change_t *change
+ = &APR_ARRAY_IDX(changes->changes, i, binary_change_t);
+
+ svn_packed__add_uint(changes_stream, change->flags);
+ svn_packed__add_uint(changes_stream, change->path);
+
+ svn_packed__add_int(changes_stream, change->copyfrom_rev);
+ svn_packed__add_uint(changes_stream, change->copyfrom_path);
+
+ svn_packed__add_int(changes_stream, change->noderev_id.change_set);
+ svn_packed__add_uint(changes_stream, change->noderev_id.number);
+ }
+
+ /* write to disk */
+ SVN_ERR(svn_fs_x__write_string_table(stream, paths, scratch_pool));
+ SVN_ERR(svn_packed__data_write(stream, root, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_changes_container(svn_fs_x__changes_t **changes_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t i;
+ apr_size_t count;
+
+ svn_fs_x__changes_t *changes = apr_pcalloc(result_pool, sizeof(*changes));
+
+ svn_packed__data_root_t *root;
+ svn_packed__int_stream_t *offsets_stream;
+ svn_packed__int_stream_t *changes_stream;
+
+ /* read from disk */
+ SVN_ERR(svn_fs_x__read_string_table(&changes->paths, stream,
+ result_pool, scratch_pool));
+
+ SVN_ERR(svn_packed__data_read(&root, stream, result_pool, scratch_pool));
+ offsets_stream = svn_packed__first_int_stream(root);
+ changes_stream = svn_packed__next_int_stream(offsets_stream);
+
+ /* read offsets array */
+ count = svn_packed__int_count(offsets_stream);
+ changes->offsets = apr_array_make(result_pool, (int)count, sizeof(int));
+ for (i = 0; i < count; ++i)
+ APR_ARRAY_PUSH(changes->offsets, int)
+ = (int)svn_packed__get_uint(offsets_stream);
+
+ /* read changes array */
+ count
+ = svn_packed__int_count(svn_packed__first_int_substream(changes_stream));
+ changes->changes
+ = apr_array_make(result_pool, (int)count, sizeof(binary_change_t));
+ for (i = 0; i < count; ++i)
+ {
+ binary_change_t change;
+
+ change.flags = (int)svn_packed__get_uint(changes_stream);
+ change.path = (apr_size_t)svn_packed__get_uint(changes_stream);
+
+ change.copyfrom_rev = (svn_revnum_t)svn_packed__get_int(changes_stream);
+ change.copyfrom_path = (apr_size_t)svn_packed__get_uint(changes_stream);
+
+ change.noderev_id.change_set = svn_packed__get_int(changes_stream);
+ change.noderev_id.number = svn_packed__get_uint(changes_stream);
+
+ APR_ARRAY_PUSH(changes->changes, binary_change_t) = change;
+ }
+
+ *changes_p = changes;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_changes_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_fs_x__changes_t *changes = in;
+ svn_stringbuf_t *serialized;
+
+ /* make a guesstimate on the size of the serialized data. Erring on the
+ * low side will cause the serializer to re-alloc its buffer. */
+ apr_size_t size
+ = changes->changes->elt_size * changes->changes->nelts
+ + changes->offsets->elt_size * changes->offsets->nelts
+ + 10 * changes->changes->elt_size
+ + 100;
+
+ /* serialize array header and all its elements */
+ svn_temp_serializer__context_t *context
+ = svn_temp_serializer__init(changes, sizeof(*changes), size, pool);
+
+ /* serialize sub-structures */
+ svn_fs_x__serialize_string_table(context, &changes->paths);
+ svn_fs_x__serialize_apr_array(context, &changes->changes);
+ svn_fs_x__serialize_apr_array(context, &changes->offsets);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_changes_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ svn_fs_x__changes_t *changes = (svn_fs_x__changes_t *)data;
+
+ /* de-serialize sub-structures */
+ svn_fs_x__deserialize_string_table(changes, &changes->paths);
+ svn_fs_x__deserialize_apr_array(changes, &changes->changes, pool);
+ svn_fs_x__deserialize_apr_array(changes, &changes->offsets, pool);
+
+ /* done */
+ *out = changes;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__changes_get_list_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ int first;
+ int last;
+ int i;
+ apr_array_header_t *list;
+
+ apr_uint32_t idx = *(apr_uint32_t *)baton;
+ const svn_fs_x__changes_t *container = data;
+
+ /* resolve all the sub-container pointers we need */
+ const string_table_t *paths
+ = svn_temp_deserializer__ptr(container,
+ (const void *const *)&container->paths);
+ const apr_array_header_t *serialized_offsets
+ = svn_temp_deserializer__ptr(container,
+ (const void *const *)&container->offsets);
+ const apr_array_header_t *serialized_changes
+ = svn_temp_deserializer__ptr(container,
+ (const void *const *)&container->changes);
+ const int *offsets
+ = svn_temp_deserializer__ptr(serialized_offsets,
+ (const void *const *)&serialized_offsets->elts);
+ const binary_change_t *changes
+ = svn_temp_deserializer__ptr(serialized_changes,
+ (const void *const *)&serialized_changes->elts);
+
+ /* validate index */
+ if (idx + 1 >= (apr_size_t)serialized_offsets->nelts)
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ _("Changes list index %u exceeds container "
+ "size %d"),
+ (unsigned)idx, serialized_offsets->nelts - 1);
+
+ /* range of changes to return */
+ first = offsets[idx];
+ last = offsets[idx+1];
+
+ /* construct result */
+ list = apr_array_make(pool, last - first, sizeof(svn_fs_x__change_t*));
+
+ for (i = first; i < last; ++i)
+ {
+ const binary_change_t *binary_change = &changes[i];
+
+ /* convert BINARY_CHANGE into a standard FSX svn_fs_x__change_t */
+ svn_fs_x__change_t *change = apr_pcalloc(pool, sizeof(*change));
+ change->path.data
+ = svn_fs_x__string_table_get_func(paths, binary_change->path,
+ &change->path.len, pool);
+
+ change->noderev_id = binary_change->noderev_id;
+
+ change->change_kind = (svn_fs_path_change_kind_t)
+ ((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
+ change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+ change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+ change->node_kind = (svn_node_kind_t)
+ ((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
+
+ change->copyfrom_rev = binary_change->copyfrom_rev;
+ change->copyfrom_known = TRUE;
+ if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
+ change->copyfrom_path
+ = svn_fs_x__string_table_get_func(paths,
+ binary_change->copyfrom_path,
+ NULL,
+ pool);
+
+ /* add it to the result */
+ APR_ARRAY_PUSH(list, svn_fs_x__change_t*) = change;
+ }
+
+ *out = list;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/changes.h b/subversion/libsvn_fs_x/changes.h
new file mode 100644
index 0000000..ccb2647
--- /dev/null
+++ b/subversion/libsvn_fs_x/changes.h
@@ -0,0 +1,132 @@
+/* changes.h --- FSX changed paths lists container
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__CHANGES_H
+#define SVN_LIBSVN_FS__CHANGES_H
+
+#include "svn_io.h"
+#include "fs.h"
+
+/* Entries in a revision's change list tend to be widely redundant (similar
+ * changes to similar paths). Even more so, change lists from a larger
+ * revision range also tend to overlap.
+ *
+ * In its serialized form, the svn_fs_x__changes_t container extracts most
+ * of that redundancy and the run-time representation is also much smaller
+ * than sum of the respective svn_fs_x__change_t* arrays.
+ *
+ * As with other containers, this one has two modes: 'construction', in
+ * which you may add data to it, and 'getter' in which there is only r/o
+ * access to the data.
+ */
+
+/* An opaque collection of change lists (apr_array_header_t * of
+ * svn_fs_x__change_t *).
+ */
+typedef struct svn_fs_x__changes_t svn_fs_x__changes_t;
+
+/* Create and populate changes containers. */
+
+/* Create and return a new changes container with an initial capacity of
+ * INITIAL_COUNT svn_fs_x__change_t objects.
+ * Allocate the result in RESULT_POOL.
+ */
+svn_fs_x__changes_t *
+svn_fs_x__changes_create(apr_size_t initial_count,
+ apr_pool_t *result_pool);
+
+/* Start a new change list CHANGES (implicitly terminating the previous one)
+ * and return its index in *LIST_INDEX. Append all changes from LIST to
+ * that new change list.
+ */
+svn_error_t *
+svn_fs_x__changes_append_list(apr_size_t *list_index,
+ svn_fs_x__changes_t *changes,
+ apr_array_header_t *list);
+
+/* Return a rough estimate in bytes for the serialized representation
+ * of CHANGES.
+ */
+apr_size_t
+svn_fs_x__changes_estimate_size(const svn_fs_x__changes_t *changes);
+
+/* Read changes containers. */
+
+/* From CHANGES, extract the change list with the given IDX. Allocate
+ * the result in POOL and return it in *LIST.
+ */
+svn_error_t *
+svn_fs_x__changes_get_list(apr_array_header_t **list,
+ const svn_fs_x__changes_t *changes,
+ apr_size_t idx,
+ apr_pool_t *pool);
+
+/* I/O interface. */
+
+/* Write a serialized representation of CHANGES to STREAM.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__write_changes_container(svn_stream_t *stream,
+ const svn_fs_x__changes_t *changes,
+ apr_pool_t *scratch_pool);
+
+/* Read a changes container from its serialized representation in STREAM.
+ * Allocate the result in RESULT_POOL and return it in *CHANGES_P. Use
+ * SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_changes_container(svn_fs_x__changes_t **changes_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Implements #svn_cache__serialize_func_t for svn_fs_x__changes_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_changes_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/* Implements #svn_cache__deserialize_func_t for svn_fs_x__changes_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_changes_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/* Implements svn_cache__partial_getter_func_t for svn_fs_x__changes_t,
+ * setting *OUT to the change list (apr_array_header_t *) selected by
+ * the apr_uint32_t index passed in as *BATON. This function is similar
+ * to svn_fs_x__changes_get_list but operates on the cache serialized
+ * representation of the container.
+ */
+svn_error_t *
+svn_fs_x__changes_get_list_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/dag.c b/subversion/libsvn_fs_x/dag.c
new file mode 100644
index 0000000..2f5bcb2
--- /dev/null
+++ b/subversion/libsvn_fs_x/dag.c
@@ -0,0 +1,1368 @@
+/* dag.c : DAG-like interface filesystem, private to libsvn_fs
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <string.h>
+
+#include "svn_path.h"
+#include "svn_error.h"
+#include "svn_fs.h"
+#include "svn_props.h"
+#include "svn_pools.h"
+
+#include "dag.h"
+#include "fs.h"
+#include "fs_x.h"
+#include "fs_id.h"
+#include "cached_data.h"
+#include "transaction.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "private/svn_fspath.h"
+#include "svn_private_config.h"
+#include "private/svn_temp_serializer.h"
+#include "temp_serializer.h"
+
+
+/* Initializing a filesystem. */
+
+struct dag_node_t
+{
+ /* The filesystem this dag node came from. */
+ svn_fs_t *fs;
+
+ /* The node revision ID for this dag node. */
+ svn_fs_x__id_t id;
+
+ /* In the special case that this node is the root of a transaction
+ that has not yet been modified, the revision of this node is the
+ respective txn's base rev. Otherwise, this is SVN_INVALID_REVNUM
+ for txn nodes and the respective crev for committed nodes.
+ (Used in svn_fs_node_created_rev.) */
+ svn_revnum_t revision;
+
+ /* The node's type (file, dir, etc.) */
+ svn_node_kind_t kind;
+
+ /* The node's NODE-REVISION, or NULL if we haven't read it in yet.
+ This is allocated in this node's POOL.
+
+ If you're willing to respect all the rules above, you can munge
+ this yourself, but you're probably better off just calling
+ `get_node_revision' and `set_node_revision', which take care of
+ things for you. */
+ svn_fs_x__noderev_t *node_revision;
+
+ /* The pool to allocate NODE_REVISION in. */
+ apr_pool_t *node_pool;
+
+ /* the path at which this node was created. */
+ const char *created_path;
+
+ /* Directory entry lookup hint to speed up consecutive calls to
+ svn_fs_x__rep_contents_dir_entry(). Only used for directory nodes.
+ Any value is legal but should default to APR_SIZE_MAX. */
+ apr_size_t hint;
+};
+
+
+
+/* Trivial helper/accessor functions. */
+svn_node_kind_t
+svn_fs_x__dag_node_kind(dag_node_t *node)
+{
+ return node->kind;
+}
+
+const svn_fs_x__id_t *
+svn_fs_x__dag_get_id(const dag_node_t *node)
+{
+ return &node->id;
+}
+
+
+const char *
+svn_fs_x__dag_get_created_path(dag_node_t *node)
+{
+ return node->created_path;
+}
+
+
+svn_fs_t *
+svn_fs_x__dag_get_fs(dag_node_t *node)
+{
+ return node->fs;
+}
+
+void
+svn_fs_x__dag_set_fs(dag_node_t *node,
+ svn_fs_t *fs)
+{
+ node->fs = fs;
+}
+
+
+/* Dup NODEREV and all associated data into RESULT_POOL.
+ Leaves the id and is_fresh_txn_root fields as zero bytes. */
+static svn_fs_x__noderev_t *
+copy_node_revision(svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__noderev_t *nr = apr_pmemdup(result_pool, noderev,
+ sizeof(*noderev));
+
+ if (noderev->copyfrom_path)
+ nr->copyfrom_path = apr_pstrdup(result_pool, noderev->copyfrom_path);
+
+ nr->copyroot_path = apr_pstrdup(result_pool, noderev->copyroot_path);
+ nr->data_rep = svn_fs_x__rep_copy(noderev->data_rep, result_pool);
+ nr->prop_rep = svn_fs_x__rep_copy(noderev->prop_rep, result_pool);
+
+ if (noderev->created_path)
+ nr->created_path = apr_pstrdup(result_pool, noderev->created_path);
+
+ return nr;
+}
+
+
+/* Set *NODEREV_P to the cached node-revision for NODE.
+ If the node-revision was not already cached in NODE, read it in,
+ allocating the cache in NODE->NODE_POOL.
+
+ If you plan to change the contents of NODE, be careful! We're
+ handing you a pointer directly to our cached node-revision, not
+ your own copy. If you change it as part of some operation, but
+ then some Berkeley DB function deadlocks or gets an error, you'll
+ need to back out your changes, or else the cache will reflect
+ changes that never got committed. It's probably best not to change
+ the structure at all. */
+static svn_error_t *
+get_node_revision(svn_fs_x__noderev_t **noderev_p,
+ dag_node_t *node)
+{
+ /* If we've already got a copy, there's no need to read it in. */
+ if (! node->node_revision)
+ {
+ svn_fs_x__noderev_t *noderev;
+ apr_pool_t *scratch_pool = svn_pool_create(node->node_pool);
+
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, node->fs, &node->id,
+ node->node_pool, scratch_pool));
+ node->node_revision = noderev;
+ svn_pool_destroy(scratch_pool);
+ }
+
+ /* Now NODE->node_revision is set. */
+ *noderev_p = node->node_revision;
+ return SVN_NO_ERROR;
+}
+
+/* Return the node revision ID of NODE. The value returned is shared
+ with NODE, and will be deallocated when NODE is. */
+svn_error_t *
+svn_fs_x__dag_get_node_id(svn_fs_x__id_t *node_id,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ *node_id = noderev->node_id;
+ return SVN_NO_ERROR;
+}
+
+/* Return the node revision ID of NODE. The value returned is shared
+ with NODE, and will be deallocated when NODE is. */
+svn_error_t *
+svn_fs_x__dag_get_copy_id(svn_fs_x__id_t *copy_id,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ *copy_id = noderev->copy_id;
+ return SVN_NO_ERROR;
+}
+
+/* Return the node ID of NODE. The value returned is shared with NODE,
+ and will be deallocated when NODE is. */
+svn_error_t *
+svn_fs_x__dag_related_node(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs)
+{
+ svn_fs_x__id_t lhs_node, rhs_node;
+
+ SVN_ERR(svn_fs_x__dag_get_node_id(&lhs_node, lhs));
+ SVN_ERR(svn_fs_x__dag_get_node_id(&rhs_node, rhs));
+ *same = svn_fs_x__id_eq(&lhs_node, &rhs_node);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_same_line_of_history(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs)
+{
+ svn_fs_x__noderev_t *lhs_noderev, *rhs_noderev;
+
+ SVN_ERR(get_node_revision(&lhs_noderev, lhs));
+ SVN_ERR(get_node_revision(&rhs_noderev, rhs));
+
+ *same = svn_fs_x__id_eq(&lhs_noderev->node_id, &rhs_noderev->node_id)
+ && svn_fs_x__id_eq(&lhs_noderev->copy_id, &rhs_noderev->copy_id);
+
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_fs_x__dag_check_mutable(const dag_node_t *node)
+{
+ return svn_fs_x__is_txn(svn_fs_x__dag_get_id(node)->change_set);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_node(dag_node_t **node,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *new_node;
+ svn_fs_x__noderev_t *noderev;
+
+ /* Construct the node. */
+ new_node = apr_pcalloc(result_pool, sizeof(*new_node));
+ new_node->fs = fs;
+ new_node->id = *id;
+ new_node->hint = APR_SIZE_MAX;
+
+ /* Grab the contents so we can inspect the node's kind and created path. */
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id,
+ result_pool, scratch_pool));
+ new_node->node_pool = result_pool;
+ new_node->node_revision = noderev;
+
+ /* Initialize the KIND and CREATED_PATH attributes */
+ new_node->kind = noderev->kind;
+ new_node->created_path = noderev->created_path;
+
+ /* Support our quirky svn_fs_node_created_rev API.
+ Untouched txn roots report the base rev as theirs. */
+ new_node->revision
+ = ( svn_fs_x__is_fresh_txn_root(noderev)
+ ? svn_fs_x__get_revnum(noderev->predecessor_id.change_set)
+ : svn_fs_x__get_revnum(id->change_set));
+
+ /* Return a fresh new node */
+ *node = new_node;
+ return SVN_NO_ERROR;
+}
+
+
+svn_revnum_t
+svn_fs_x__dag_get_revision(const dag_node_t *node)
+{
+ return node->revision;
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_predecessor_id(svn_fs_x__id_t *id_p,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+ *id_p = noderev->predecessor_id;
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_predecessor_count(int *count,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+ *count = noderev->predecessor_count;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_get_mergeinfo_count(apr_int64_t *count,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+ *count = noderev->mergeinfo_count;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_has_mergeinfo(svn_boolean_t *has_mergeinfo,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+ *has_mergeinfo = noderev->has_mergeinfo;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_has_descendants_with_mergeinfo(svn_boolean_t *do_they,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ if (node->kind != svn_node_dir)
+ {
+ *do_they = FALSE;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(get_node_revision(&noderev, node));
+ if (noderev->mergeinfo_count > 1)
+ *do_they = TRUE;
+ else if (noderev->mergeinfo_count == 1 && !noderev->has_mergeinfo)
+ *do_they = TRUE;
+ else
+ *do_they = FALSE;
+ return SVN_NO_ERROR;
+}
+
+
+/*** Directory node functions ***/
+
+/* Some of these are helpers for functions outside this section. */
+
+/* Set *ID_P to the noderev-id for entry NAME in PARENT. If no such
+ entry, set *ID_P to NULL but do not error. */
+static svn_error_t *
+dir_entry_id_from_node(svn_fs_x__id_t *id_p,
+ dag_node_t *parent,
+ const char *name,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__dirent_t *dirent;
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, parent));
+ if (noderev->kind != svn_node_dir)
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't get entries of non-directory"));
+
+ /* Make sure that NAME is a single path component. */
+ if (! svn_path_is_single_path_component(name))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, NULL,
+ "Attempted to open node with an illegal name '%s'", name);
+
+ /* Get a dirent hash for this directory. */
+ SVN_ERR(svn_fs_x__rep_contents_dir_entry(&dirent, parent->fs, noderev,
+ name, &parent->hint,
+ scratch_pool, scratch_pool));
+ if (dirent)
+ *id_p = dirent->id;
+ else
+ svn_fs_x__id_reset(id_p);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Add or set in PARENT a directory entry NAME pointing to ID.
+ Temporary allocations are done in SCRATCH_POOL.
+
+ Assumptions:
+ - PARENT is a mutable directory.
+ - ID does not refer to an ancestor of parent
+ - NAME is a single path component
+*/
+static svn_error_t *
+set_entry(dag_node_t *parent,
+ const char *name,
+ const svn_fs_x__id_t *id,
+ svn_node_kind_t kind,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *parent_noderev;
+
+ /* Get the parent's node-revision. */
+ SVN_ERR(get_node_revision(&parent_noderev, parent));
+
+ /* Set the new entry. */
+ return svn_fs_x__set_entry(parent->fs, txn_id, parent_noderev, name, id,
+ kind, parent->node_pool, scratch_pool);
+}
+
+
+/* Make a new entry named NAME in PARENT. If IS_DIR is true, then the
+ node revision the new entry points to will be a directory, else it
+ will be a file. The new node will be allocated in RESULT_POOL. PARENT
+ must be mutable, and must not have an entry named NAME.
+
+ Use SCRATCH_POOL for all temporary allocations.
+ */
+static svn_error_t *
+make_entry(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ svn_boolean_t is_dir,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t new_noderev, *parent_noderev;
+
+ /* Make sure that NAME is a single path component. */
+ if (! svn_path_is_single_path_component(name))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, NULL,
+ _("Attempted to create a node with an illegal name '%s'"), name);
+
+ /* Make sure that parent is a directory */
+ if (parent->kind != svn_node_dir)
+ return svn_error_create
+ (SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Attempted to create entry in non-directory parent"));
+
+ /* Check that the parent is mutable. */
+ if (! svn_fs_x__dag_check_mutable(parent))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ _("Attempted to clone child of non-mutable node"));
+
+ /* Create the new node's NODE-REVISION */
+ memset(&new_noderev, 0, sizeof(new_noderev));
+ new_noderev.kind = is_dir ? svn_node_dir : svn_node_file;
+ new_noderev.created_path = svn_fspath__join(parent_path, name, result_pool);
+
+ SVN_ERR(get_node_revision(&parent_noderev, parent));
+ new_noderev.copyroot_path = apr_pstrdup(result_pool,
+ parent_noderev->copyroot_path);
+ new_noderev.copyroot_rev = parent_noderev->copyroot_rev;
+ new_noderev.copyfrom_rev = SVN_INVALID_REVNUM;
+ new_noderev.copyfrom_path = NULL;
+ svn_fs_x__id_reset(&new_noderev.predecessor_id);
+
+ SVN_ERR(svn_fs_x__create_node
+ (svn_fs_x__dag_get_fs(parent), &new_noderev,
+ &parent_noderev->copy_id, txn_id, scratch_pool));
+
+ /* Create a new dag_node_t for our new node */
+ SVN_ERR(svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
+ &new_noderev.noderev_id, result_pool,
+ scratch_pool));
+
+ /* We can safely call set_entry because we already know that
+ PARENT is mutable, and we just created CHILD, so we know it has
+ no ancestors (therefore, PARENT cannot be an ancestor of CHILD) */
+ return set_entry(parent, name, &new_noderev.noderev_id,
+ new_noderev.kind, txn_id, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_dir_entries(apr_array_header_t **entries,
+ dag_node_t *node,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ if (noderev->kind != svn_node_dir)
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't get entries of non-directory"));
+
+ return svn_fs_x__rep_contents_dir(entries, node->fs, noderev, result_pool,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_set_entry(dag_node_t *node,
+ const char *entry_name,
+ const svn_fs_x__id_t *id,
+ svn_node_kind_t kind,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ /* Check it's a directory. */
+ if (node->kind != svn_node_dir)
+ return svn_error_create
+ (SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Attempted to set entry in non-directory node"));
+
+ /* Check it's mutable. */
+ if (! svn_fs_x__dag_check_mutable(node))
+ return svn_error_create
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ _("Attempted to set entry in immutable node"));
+
+ return set_entry(node, entry_name, id, kind, txn_id, scratch_pool);
+}
+
+
+
+/*** Proplists. ***/
+
+svn_error_t *
+svn_fs_x__dag_get_proplist(apr_hash_t **proplist_p,
+ dag_node_t *node,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ apr_hash_t *proplist = NULL;
+
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ SVN_ERR(svn_fs_x__get_proplist(&proplist, node->fs, noderev, result_pool,
+ scratch_pool));
+
+ *proplist_p = proplist;
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__dag_set_proplist(dag_node_t *node,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Sanity check: this node better be mutable! */
+ if (! svn_fs_x__dag_check_mutable(node))
+ {
+ svn_string_t *idstr = svn_fs_x__id_unparse(&node->id, scratch_pool);
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Can't set proplist on *immutable* node-revision %s",
+ idstr->data);
+ }
+
+ /* Go get a fresh NODE-REVISION for this node. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ /* Set the new proplist. */
+ return svn_fs_x__set_proplist(node->fs, noderev, proplist, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_increment_mergeinfo_count(dag_node_t *node,
+ apr_int64_t increment,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Sanity check: this node better be mutable! */
+ if (! svn_fs_x__dag_check_mutable(node))
+ {
+ svn_string_t *idstr = svn_fs_x__id_unparse(&node->id, scratch_pool);
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Can't increment mergeinfo count on *immutable* node-revision %s",
+ idstr->data);
+ }
+
+ if (increment == 0)
+ return SVN_NO_ERROR;
+
+ /* Go get a fresh NODE-REVISION for this node. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ noderev->mergeinfo_count += increment;
+ if (noderev->mergeinfo_count < 0)
+ {
+ svn_string_t *idstr = svn_fs_x__id_unparse(&node->id, scratch_pool);
+ return svn_error_createf
+ (SVN_ERR_FS_CORRUPT, NULL,
+ apr_psprintf(scratch_pool,
+ _("Can't increment mergeinfo count on node-revision %%s "
+ "to negative value %%%s"),
+ APR_INT64_T_FMT),
+ idstr->data, noderev->mergeinfo_count);
+ }
+ if (noderev->mergeinfo_count > 1 && noderev->kind == svn_node_file)
+ {
+ svn_string_t *idstr = svn_fs_x__id_unparse(&node->id, scratch_pool);
+ return svn_error_createf
+ (SVN_ERR_FS_CORRUPT, NULL,
+ apr_psprintf(scratch_pool,
+ _("Can't increment mergeinfo count on *file* "
+ "node-revision %%s to %%%s (> 1)"),
+ APR_INT64_T_FMT),
+ idstr->data, noderev->mergeinfo_count);
+ }
+
+ /* Flush it out. */
+ return svn_fs_x__put_node_revision(node->fs, noderev, scratch_pool);
+}
+
+svn_error_t *
+svn_fs_x__dag_set_has_mergeinfo(dag_node_t *node,
+ svn_boolean_t has_mergeinfo,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Sanity check: this node better be mutable! */
+ if (! svn_fs_x__dag_check_mutable(node))
+ {
+ svn_string_t *idstr = svn_fs_x__id_unparse(&node->id, scratch_pool);
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Can't set mergeinfo flag on *immutable* node-revision %s",
+ idstr->data);
+ }
+
+ /* Go get a fresh NODE-REVISION for this node. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ noderev->has_mergeinfo = has_mergeinfo;
+
+ /* Flush it out. */
+ return svn_fs_x__put_node_revision(node->fs, noderev, scratch_pool);
+}
+
+
+/*** Roots. ***/
+
+svn_error_t *
+svn_fs_x__dag_revision_root(dag_node_t **node_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__id_t root_id;
+
+ svn_fs_x__init_rev_root(&root_id, rev);
+ return svn_fs_x__dag_get_node(node_p, fs, &root_id, result_pool,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_txn_root(dag_node_t **node_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__id_t root_id;
+
+ svn_fs_x__init_txn_root(&root_id, txn_id);
+ return svn_fs_x__dag_get_node(node_p, fs, &root_id, result_pool,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_clone_child(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ svn_boolean_t is_parent_copyroot,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *cur_entry; /* parent's current entry named NAME */
+ const svn_fs_x__id_t *new_node_id; /* node id we'll put into NEW_NODE */
+ svn_fs_t *fs = svn_fs_x__dag_get_fs(parent);
+
+ /* First check that the parent is mutable. */
+ if (! svn_fs_x__dag_check_mutable(parent))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Attempted to clone child of non-mutable node");
+
+ /* Make sure that NAME is a single path component. */
+ if (! svn_path_is_single_path_component(name))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, NULL,
+ "Attempted to make a child clone with an illegal name '%s'", name);
+
+ /* Find the node named NAME in PARENT's entries list if it exists. */
+ SVN_ERR(svn_fs_x__dag_open(&cur_entry, parent, name, scratch_pool,
+ scratch_pool));
+ if (! cur_entry)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FOUND, NULL,
+ "Attempted to open non-existent child node '%s'", name);
+
+ /* Check for mutability in the node we found. If it's mutable, we
+ don't need to clone it. */
+ if (svn_fs_x__dag_check_mutable(cur_entry))
+ {
+ /* This has already been cloned */
+ new_node_id = svn_fs_x__dag_get_id(cur_entry);
+ }
+ else
+ {
+ svn_fs_x__noderev_t *noderev, *parent_noderev;
+
+ /* Go get a fresh NODE-REVISION for current child node. */
+ SVN_ERR(get_node_revision(&noderev, cur_entry));
+
+ if (is_parent_copyroot)
+ {
+ SVN_ERR(get_node_revision(&parent_noderev, parent));
+ noderev->copyroot_rev = parent_noderev->copyroot_rev;
+ noderev->copyroot_path = apr_pstrdup(scratch_pool,
+ parent_noderev->copyroot_path);
+ }
+
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ noderev->predecessor_id = noderev->noderev_id;
+ noderev->predecessor_count++;
+ noderev->created_path = svn_fspath__join(parent_path, name,
+ scratch_pool);
+
+ if (copy_id == NULL)
+ copy_id = &noderev->copy_id;
+
+ SVN_ERR(svn_fs_x__create_successor(fs, noderev, copy_id, txn_id,
+ scratch_pool));
+ new_node_id = &noderev->noderev_id;
+
+ /* Replace the ID in the parent's ENTRY list with the ID which
+ refers to the mutable clone of this child. */
+ SVN_ERR(set_entry(parent, name, new_node_id, noderev->kind, txn_id,
+ scratch_pool));
+ }
+
+ /* Initialize the youngster. */
+ return svn_fs_x__dag_get_node(child_p, fs, new_node_id, result_pool,
+ scratch_pool);
+}
+
+
+/* Delete all mutable node revisions reachable from node ID, including
+ ID itself, from FS's `nodes' table. Also delete any mutable
+ representations and strings associated with that node revision.
+ ID may refer to a file or directory, which may be mutable or immutable.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+delete_if_mutable(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node;
+
+ /* Get the node. */
+ SVN_ERR(svn_fs_x__dag_get_node(&node, fs, id, scratch_pool, scratch_pool));
+
+ /* If immutable, do nothing and return immediately. */
+ if (! svn_fs_x__dag_check_mutable(node))
+ return SVN_NO_ERROR;
+
+ /* Else it's mutable. Recurse on directories... */
+ if (node->kind == svn_node_dir)
+ {
+ apr_array_header_t *entries;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Loop over directory entries */
+ SVN_ERR(svn_fs_x__dag_dir_entries(&entries, node, scratch_pool,
+ iterpool));
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ const svn_fs_x__id_t *noderev_id
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__dirent_t *)->id;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(delete_if_mutable(fs, noderev_id, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ /* ... then delete the node itself, after deleting any mutable
+ representations and strings it points to. */
+ return svn_fs_x__delete_node_revision(fs, id, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_delete(dag_node_t *parent,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *parent_noderev;
+ svn_fs_t *fs = parent->fs;
+ svn_fs_x__dirent_t *dirent;
+ apr_pool_t *subpool;
+
+ /* Make sure parent is a directory. */
+ if (parent->kind != svn_node_dir)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ "Attempted to delete entry '%s' from *non*-directory node", name);
+
+ /* Make sure parent is mutable. */
+ if (! svn_fs_x__dag_check_mutable(parent))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Attempted to delete entry '%s' from immutable directory node", name);
+
+ /* Make sure that NAME is a single path component. */
+ if (! svn_path_is_single_path_component(name))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, NULL,
+ "Attempted to delete a node with an illegal name '%s'", name);
+
+ /* Get a fresh NODE-REVISION for the parent node. */
+ SVN_ERR(get_node_revision(&parent_noderev, parent));
+
+ subpool = svn_pool_create(scratch_pool);
+
+ /* Search this directory for a dirent with that NAME. */
+ SVN_ERR(svn_fs_x__rep_contents_dir_entry(&dirent, fs, parent_noderev,
+ name, &parent->hint,
+ subpool, subpool));
+
+ /* If we never found ID in ENTRIES (perhaps because there are no
+ ENTRIES, perhaps because ID just isn't in the existing ENTRIES
+ ... it doesn't matter), return an error. */
+ if (! dirent)
+ return svn_error_createf
+ (SVN_ERR_FS_NO_SUCH_ENTRY, NULL,
+ "Delete failed--directory has no entry '%s'", name);
+
+ /* If mutable, remove it and any mutable children from db. */
+ SVN_ERR(delete_if_mutable(parent->fs, &dirent->id, scratch_pool));
+ svn_pool_destroy(subpool);
+
+ /* Remove this entry from its parent's entries list. */
+ return svn_fs_x__set_entry(parent->fs, txn_id, parent_noderev, name,
+ NULL, svn_node_unknown, parent->node_pool,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_make_file(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* Call our little helper function */
+ return make_entry(child_p, parent, parent_path, name, FALSE, txn_id,
+ result_pool, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_make_dir(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* Call our little helper function */
+ return make_entry(child_p, parent, parent_path, name, TRUE, txn_id,
+ result_pool, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_contents(svn_stream_t **contents_p,
+ dag_node_t *file,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ svn_stream_t *contents;
+
+ /* Make sure our node is a file. */
+ if (file->kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FILE, NULL,
+ "Attempted to get textual contents of a *non*-file node");
+
+ /* Go get a fresh node-revision for FILE. */
+ SVN_ERR(get_node_revision(&noderev, file));
+
+ /* Get a stream to the contents. */
+ SVN_ERR(svn_fs_x__get_contents(&contents, file->fs,
+ noderev->data_rep, TRUE, result_pool));
+
+ *contents_p = contents;
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ dag_node_t *source,
+ dag_node_t *target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *src_noderev;
+ svn_fs_x__noderev_t *tgt_noderev;
+
+ /* Make sure our nodes are files. */
+ if ((source && source->kind != svn_node_file)
+ || target->kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FILE, NULL,
+ "Attempted to get textual contents of a *non*-file node");
+
+ /* Go get fresh node-revisions for the nodes. */
+ if (source)
+ SVN_ERR(get_node_revision(&src_noderev, source));
+ else
+ src_noderev = NULL;
+ SVN_ERR(get_node_revision(&tgt_noderev, target));
+
+ /* Get the delta stream. */
+ return svn_fs_x__get_file_delta_stream(stream_p, target->fs,
+ src_noderev, tgt_noderev,
+ result_pool, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_try_process_file_contents(svn_boolean_t *success,
+ dag_node_t *node,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Go get fresh node-revisions for the nodes. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ return svn_fs_x__try_process_file_contents(success, node->fs,
+ noderev,
+ processor, baton, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_file_length(svn_filesize_t *length,
+ dag_node_t *file)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Make sure our node is a file. */
+ if (file->kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FILE, NULL,
+ "Attempted to get length of a *non*-file node");
+
+ /* Go get a fresh node-revision for FILE, and . */
+ SVN_ERR(get_node_revision(&noderev, file));
+
+ return svn_fs_x__file_length(length, noderev);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_file_checksum(svn_checksum_t **checksum,
+ dag_node_t *file,
+ svn_checksum_kind_t kind,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ if (file->kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FILE, NULL,
+ "Attempted to get checksum of a *non*-file node");
+
+ SVN_ERR(get_node_revision(&noderev, file));
+
+ return svn_fs_x__file_checksum(checksum, noderev, kind, result_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_get_edit_stream(svn_stream_t **contents,
+ dag_node_t *file,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ svn_stream_t *ws;
+
+ /* Make sure our node is a file. */
+ if (file->kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_FILE, NULL,
+ "Attempted to set textual contents of a *non*-file node");
+
+ /* Make sure our node is mutable. */
+ if (! svn_fs_x__dag_check_mutable(file))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ "Attempted to set textual contents of an immutable node");
+
+ /* Get the node revision. */
+ SVN_ERR(get_node_revision(&noderev, file));
+
+ SVN_ERR(svn_fs_x__set_contents(&ws, file->fs, noderev, result_pool));
+
+ *contents = ws;
+
+ return SVN_NO_ERROR;
+}
+
+
+
+svn_error_t *
+svn_fs_x__dag_finalize_edits(dag_node_t *file,
+ const svn_checksum_t *checksum,
+ apr_pool_t *scratch_pool)
+{
+ if (checksum)
+ {
+ svn_checksum_t *file_checksum;
+
+ SVN_ERR(svn_fs_x__dag_file_checksum(&file_checksum, file,
+ checksum->kind, scratch_pool));
+ if (!svn_checksum_match(checksum, file_checksum))
+ return svn_checksum_mismatch_err(checksum, file_checksum,
+ scratch_pool,
+ _("Checksum mismatch for '%s'"),
+ file->created_path);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+dag_node_t *
+svn_fs_x__dag_dup(const dag_node_t *node,
+ apr_pool_t *result_pool)
+{
+ /* Allocate our new node. */
+ dag_node_t *new_node = apr_pmemdup(result_pool, node, sizeof(*new_node));
+
+ /* Only copy cached svn_fs_x__noderev_t for immutable nodes. */
+ if (node->node_revision && !svn_fs_x__dag_check_mutable(node))
+ {
+ new_node->node_revision = copy_node_revision(node->node_revision,
+ result_pool);
+ new_node->created_path = new_node->node_revision->created_path;
+ }
+ else
+ {
+ new_node->node_revision = NULL;
+ new_node->created_path = apr_pstrdup(result_pool, node->created_path);
+ }
+
+ new_node->node_pool = result_pool;
+
+ return new_node;
+}
+
+dag_node_t *
+svn_fs_x__dag_copy_into_pool(dag_node_t *node,
+ apr_pool_t *result_pool)
+{
+ return (node->node_pool == result_pool
+ ? node
+ : svn_fs_x__dag_dup(node, result_pool));
+}
+
+svn_error_t *
+svn_fs_x__dag_serialize(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ dag_node_t *node = in;
+ svn_stringbuf_t *serialized;
+
+ /* create an serialization context and serialize the dag node as root */
+ svn_temp_serializer__context_t *context =
+ svn_temp_serializer__init(node,
+ sizeof(*node),
+ 1024 - SVN_TEMP_SERIALIZER__OVERHEAD,
+ pool);
+
+ /* for mutable nodes, we will _never_ cache the noderev */
+ if (node->node_revision && !svn_fs_x__dag_check_mutable(node))
+ {
+ svn_fs_x__noderev_serialize(context, &node->node_revision);
+ }
+ else
+ {
+ svn_temp_serializer__set_null(context,
+ (const void * const *)&node->node_revision);
+ svn_temp_serializer__add_string(context, &node->created_path);
+ }
+
+ /* The deserializer will use its own pool. */
+ svn_temp_serializer__set_null(context,
+ (const void * const *)&node->node_pool);
+
+ /* return serialized data */
+ serialized = svn_temp_serializer__get(context);
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_deserialize(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ dag_node_t *node = (dag_node_t *)data;
+ if (data_len == 0)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Empty noderev in cache"));
+
+ /* Copy the _full_ buffer as it also contains the sub-structures. */
+ node->fs = NULL;
+
+ /* fixup all references to sub-structures */
+ svn_fs_x__noderev_deserialize(node, &node->node_revision, pool);
+ node->node_pool = pool;
+
+ if (node->node_revision)
+ node->created_path = node->node_revision->created_path;
+ else
+ svn_temp_deserializer__resolve(node, (void**)&node->created_path);
+
+ /* return result */
+ *out = node;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_open(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__id_t node_id;
+
+ /* Ensure that NAME exists in PARENT's entry list. */
+ SVN_ERR(dir_entry_id_from_node(&node_id, parent, name, scratch_pool));
+ if (! svn_fs_x__id_used(&node_id))
+ {
+ *child_p = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* Now get the node that was requested. */
+ return svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
+ &node_id, result_pool, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__dag_copy(dag_node_t *to_node,
+ const char *entry,
+ dag_node_t *from_node,
+ svn_boolean_t preserve_history,
+ svn_revnum_t from_rev,
+ const char *from_path,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ const svn_fs_x__id_t *id;
+
+ if (preserve_history)
+ {
+ svn_fs_x__noderev_t *from_noderev, *to_noderev;
+ svn_fs_x__id_t copy_id;
+ svn_fs_t *fs = svn_fs_x__dag_get_fs(from_node);
+
+ /* Make a copy of the original node revision. */
+ SVN_ERR(get_node_revision(&from_noderev, from_node));
+ to_noderev = copy_node_revision(from_noderev, scratch_pool);
+
+ /* Reserve a copy ID for this new copy. */
+ SVN_ERR(svn_fs_x__reserve_copy_id(&copy_id, fs, txn_id, scratch_pool));
+
+ /* Create a successor with its predecessor pointing at the copy
+ source. */
+ to_noderev->predecessor_id = to_noderev->noderev_id;
+ to_noderev->predecessor_count++;
+ to_noderev->created_path =
+ svn_fspath__join(svn_fs_x__dag_get_created_path(to_node), entry,
+ scratch_pool);
+ to_noderev->copyfrom_path = apr_pstrdup(scratch_pool, from_path);
+ to_noderev->copyfrom_rev = from_rev;
+
+ /* Set the copyroot equal to our own id. */
+ to_noderev->copyroot_path = NULL;
+
+ SVN_ERR(svn_fs_x__create_successor(fs, to_noderev,
+ &copy_id, txn_id, scratch_pool));
+ id = &to_noderev->noderev_id;
+ }
+ else /* don't preserve history */
+ {
+ id = svn_fs_x__dag_get_id(from_node);
+ }
+
+ /* Set the entry in to_node to the new id. */
+ return svn_fs_x__dag_set_entry(to_node, entry, id, from_node->kind,
+ txn_id, scratch_pool);
+}
+
+
+
+/*** Comparison. ***/
+
+svn_error_t *
+svn_fs_x__dag_things_different(svn_boolean_t *props_changed,
+ svn_boolean_t *contents_changed,
+ dag_node_t *node1,
+ dag_node_t *node2,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev1, *noderev2;
+ svn_fs_t *fs;
+ svn_boolean_t same;
+
+ /* If we have no place to store our results, don't bother doing
+ anything. */
+ if (! props_changed && ! contents_changed)
+ return SVN_NO_ERROR;
+
+ fs = svn_fs_x__dag_get_fs(node1);
+
+ /* The node revision skels for these two nodes. */
+ SVN_ERR(get_node_revision(&noderev1, node1));
+ SVN_ERR(get_node_revision(&noderev2, node2));
+
+ /* Compare property keys. */
+ if (props_changed != NULL)
+ {
+ SVN_ERR(svn_fs_x__prop_rep_equal(&same, fs, noderev1, noderev2,
+ strict, scratch_pool));
+ *props_changed = !same;
+ }
+
+ /* Compare contents keys. */
+ if (contents_changed != NULL)
+ *contents_changed = !svn_fs_x__file_text_rep_equal(noderev1->data_rep,
+ noderev2->data_rep);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_get_copyroot(svn_revnum_t *rev,
+ const char **path,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Go get a fresh node-revision for NODE. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ *rev = noderev->copyroot_rev;
+ *path = noderev->copyroot_path;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_get_copyfrom_rev(svn_revnum_t *rev,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Go get a fresh node-revision for NODE. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ *rev = noderev->copyfrom_rev;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_get_copyfrom_path(const char **path,
+ dag_node_t *node)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* Go get a fresh node-revision for NODE. */
+ SVN_ERR(get_node_revision(&noderev, node));
+
+ *path = noderev->copyfrom_path;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__dag_update_ancestry(dag_node_t *target,
+ dag_node_t *source,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *source_noderev, *target_noderev;
+
+ if (! svn_fs_x__dag_check_mutable(target))
+ return svn_error_createf
+ (SVN_ERR_FS_NOT_MUTABLE, NULL,
+ _("Attempted to update ancestry of non-mutable node"));
+
+ SVN_ERR(get_node_revision(&source_noderev, source));
+ SVN_ERR(get_node_revision(&target_noderev, target));
+
+ target_noderev->predecessor_id = source_noderev->noderev_id;
+ target_noderev->predecessor_count = source_noderev->predecessor_count;
+ target_noderev->predecessor_count++;
+
+ return svn_fs_x__put_node_revision(target->fs, target_noderev,
+ scratch_pool);
+}
diff --git a/subversion/libsvn_fs_x/dag.h b/subversion/libsvn_fs_x/dag.h
new file mode 100644
index 0000000..6d5e85b
--- /dev/null
+++ b/subversion/libsvn_fs_x/dag.h
@@ -0,0 +1,580 @@
+/* dag.h : DAG-like interface filesystem, private to libsvn_fs
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_DAG_H
+#define SVN_LIBSVN_FS_DAG_H
+
+#include "svn_fs.h"
+#include "svn_delta.h"
+#include "private/svn_cache.h"
+
+#include "fs.h"
+#include "id.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* The interface in this file provides all the essential filesystem
+ operations, but exposes the filesystem's DAG structure. This makes
+ it simpler to implement than the public interface, since a client
+ of this interface has to understand and cope with shared structure
+ directly as it appears in the database. However, it's still a
+ self-consistent set of invariants to maintain, making it
+ (hopefully) a useful interface boundary.
+
+ In other words:
+
+ - The dag_node_t interface exposes the internal DAG structure of
+ the filesystem, while the svn_fs.h interface does any cloning
+ necessary to make the filesystem look like a tree.
+
+ - The dag_node_t interface exposes the existence of copy nodes,
+ whereas the svn_fs.h handles them transparently.
+
+ - dag_node_t's must be explicitly cloned, whereas the svn_fs.h
+ operations make clones implicitly.
+
+ - Callers of the dag_node_t interface use Berkeley DB transactions
+ to ensure consistency between operations, while callers of the
+ svn_fs.h interface use Subversion transactions. */
+
+
+/* Generic DAG node stuff. */
+
+typedef struct dag_node_t dag_node_t;
+
+/* Fill *NODE with a dag_node_t representing node revision ID in FS,
+ allocating in RESULT_POOL. Use SCRATCH_POOL for temporaries. */
+svn_error_t *
+svn_fs_x__dag_get_node(dag_node_t **node,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Return a new dag_node_t object referring to the same node as NODE,
+ allocated in RESULT_POOL. If you're trying to build a structure in a
+ pool that wants to refer to dag nodes that may have been allocated
+ elsewhere, you can call this function and avoid inter-pool pointers. */
+dag_node_t *
+svn_fs_x__dag_dup(const dag_node_t *node,
+ apr_pool_t *result_pool);
+
+/* If NODE has been allocated in POOL, return NODE. Otherwise, return
+ a copy created in RESULT_POOL with svn_fs_fs__dag_dup. */
+dag_node_t *
+svn_fs_x__dag_copy_into_pool(dag_node_t *node,
+ apr_pool_t *result_pool);
+
+/* Serialize a DAG node, except don't try to preserve the 'fs' member.
+ Implements svn_cache__serialize_func_t */
+svn_error_t *
+svn_fs_x__dag_serialize(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/* Deserialize a DAG node, leaving the 'fs' member as NULL.
+ Implements svn_cache__deserialize_func_t */
+svn_error_t *
+svn_fs_x__dag_deserialize(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/* Return the filesystem containing NODE. */
+svn_fs_t *
+svn_fs_x__dag_get_fs(dag_node_t *node);
+
+/* Changes the filesystem containing NODE to FS. (Used when pulling
+ nodes out of a shared cache, say.) */
+void
+svn_fs_x__dag_set_fs(dag_node_t *node,
+ svn_fs_t *fs);
+
+
+/* Return NODE's revision number. If NODE has never been committed as
+ part of a revision, set *REV to SVN_INVALID_REVNUM. */
+svn_revnum_t
+svn_fs_x__dag_get_revision(const dag_node_t *node);
+
+
+/* Return the node revision ID of NODE. The value returned is shared
+ with NODE, and will be deallocated when NODE is. */
+const svn_fs_x__id_t *
+svn_fs_x__dag_get_id(const dag_node_t *node);
+
+/* Return the node ID of NODE. The value returned is shared with NODE,
+ and will be deallocated when NODE is. */
+svn_error_t *
+svn_fs_x__dag_get_node_id(svn_fs_x__id_t *node_id,
+ dag_node_t *node);
+
+/* Return the copy ID of NODE. The value returned is shared with NODE,
+ and will be deallocated when NODE is. */
+svn_error_t *
+svn_fs_x__dag_get_copy_id(svn_fs_x__id_t *copy_id,
+ dag_node_t *node);
+
+/* Set *SAME to TRUE, if nodes LHS and RHS have the same node ID. */
+svn_error_t *
+svn_fs_x__dag_related_node(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs);
+
+/* Set *SAME to TRUE, if nodes LHS and RHS have the same node and copy IDs.
+ */
+svn_error_t *
+svn_fs_x__dag_same_line_of_history(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs);
+
+/* Return the created path of NODE. The value returned is shared
+ with NODE, and will be deallocated when NODE is. */
+const char *
+svn_fs_x__dag_get_created_path(dag_node_t *node);
+
+
+/* Set *ID_P to the node revision ID of NODE's immediate predecessor.
+ */
+svn_error_t *
+svn_fs_x__dag_get_predecessor_id(svn_fs_x__id_t *id_p,
+ dag_node_t *node);
+
+
+/* Set *COUNT to the number of predecessors NODE has (recursively).
+ */
+/* ### This function is currently only used by 'verify'. */
+svn_error_t *
+svn_fs_x__dag_get_predecessor_count(int *count,
+ dag_node_t *node);
+
+/* Set *COUNT to the number of node under NODE (inclusive) with
+ svn:mergeinfo properties.
+ */
+svn_error_t *
+svn_fs_x__dag_get_mergeinfo_count(apr_int64_t *count,
+ dag_node_t *node);
+
+/* Set *DO_THEY to a flag indicating whether or not NODE is a
+ directory with at least one descendant (not including itself) with
+ svn:mergeinfo.
+ */
+svn_error_t *
+svn_fs_x__dag_has_descendants_with_mergeinfo(svn_boolean_t *do_they,
+ dag_node_t *node);
+
+/* Set *HAS_MERGEINFO to a flag indicating whether or not NODE itself
+ has svn:mergeinfo set on it.
+ */
+svn_error_t *
+svn_fs_x__dag_has_mergeinfo(svn_boolean_t *has_mergeinfo,
+ dag_node_t *node);
+
+/* Return non-zero IFF NODE is currently mutable. */
+svn_boolean_t
+svn_fs_x__dag_check_mutable(const dag_node_t *node);
+
+/* Return the node kind of NODE. */
+svn_node_kind_t
+svn_fs_x__dag_node_kind(dag_node_t *node);
+
+/* Set *PROPLIST_P to a PROPLIST hash representing the entire property
+ list of NODE, allocating from POOL. The hash has const char *
+ names (the property names) and svn_string_t * values (the property
+ values).
+
+ If properties do not exist on NODE, *PROPLIST_P will be set to
+ NULL.
+
+ Allocate the result in RESULT_POOL and use SCRATCH_POOL for temporaries.
+ */
+svn_error_t *
+svn_fs_x__dag_get_proplist(apr_hash_t **proplist_p,
+ dag_node_t *node,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set the property list of NODE to PROPLIST, allocating from POOL.
+ The node being changed must be mutable.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_set_proplist(dag_node_t *node,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool);
+
+/* Increment the mergeinfo_count field on NODE by INCREMENT. The node
+ being changed must be mutable.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_increment_mergeinfo_count(dag_node_t *node,
+ apr_int64_t increment,
+ apr_pool_t *scratch_pool);
+
+/* Set the has-mergeinfo flag on NODE to HAS_MERGEINFO. The node
+ being changed must be mutable.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_set_has_mergeinfo(dag_node_t *node,
+ svn_boolean_t has_mergeinfo,
+ apr_pool_t *scratch_pool);
+
+
+
+/* Revision and transaction roots. */
+
+
+/* Open the root of revision REV of filesystem FS, allocating from
+ RESULT_POOL. Set *NODE_P to the new node. Use SCRATCH_POOL for
+ temporary allocations.*/
+svn_error_t *
+svn_fs_x__dag_revision_root(dag_node_t **node_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Set *NODE_P to the root of transaction TXN_ID in FS, allocating
+ from RESULT_POOL. Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__dag_txn_root(dag_node_t **node_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Directories. */
+
+
+/* Open the node named NAME in the directory PARENT. Set *CHILD_P to
+ the new node, allocated in RESULT_POOL. NAME must be a single path
+ component; it cannot be a slash-separated directory path. If NAME does
+ not exist within PARENT, set *CHILD_P to NULL.
+ */
+svn_error_t *
+svn_fs_x__dag_open(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Set *ENTRIES_P to an array of NODE's entries, sorted by entry names,
+ and the values are svn_fs_x__dirent_t. The returned table (and elements)
+ is allocated in RESULT_POOL, temporaries in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__dag_dir_entries(apr_array_header_t **entries_p,
+ dag_node_t *node,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set ENTRY_NAME in NODE to point to ID (with kind KIND), allocating
+ from POOL. NODE must be a mutable directory. ID can refer to a
+ mutable or immutable node. If ENTRY_NAME does not exist, it will
+ be created. TXN_ID is the Subversion transaction under which this
+ occurs.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_set_entry(dag_node_t *node,
+ const char *entry_name,
+ const svn_fs_x__id_t *id,
+ svn_node_kind_t kind,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+
+/* Make a new mutable clone of the node named NAME in PARENT, and
+ adjust PARENT's directory entry to point to it, unless NAME in
+ PARENT already refers to a mutable node. In either case, set
+ *CHILD_P to a reference to the new node, allocated in POOL. PARENT
+ must be mutable. NAME must be a single path component; it cannot
+ be a slash-separated directory path. PARENT_PATH must be the
+ canonicalized absolute path of the parent directory.
+
+ COPY_ID, if non-NULL, is a key into the `copies' table, and
+ indicates that this new node is being created as the result of a
+ copy operation, and specifically which operation that was.
+
+ PATH is the canonicalized absolute path at which this node is being
+ created.
+
+ TXN_ID is the Subversion transaction under which this occurs.
+
+ Allocate *CHILD_P in RESULT_POOL and use SCRATCH_POOL for temporaries.
+ */
+svn_error_t *
+svn_fs_x__dag_clone_child(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ svn_boolean_t is_parent_copyroot,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Delete the directory entry named NAME from PARENT, allocating from
+ POOL. PARENT must be mutable. NAME must be a single path
+ component; it cannot be a slash-separated directory path. If the
+ node being deleted is a mutable directory, remove all mutable nodes
+ reachable from it. TXN_ID is the Subversion transaction under
+ which this occurs.
+
+ If return SVN_ERR_FS_NO_SUCH_ENTRY, then there is no entry NAME in
+ PARENT.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_delete(dag_node_t *parent,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+
+/* Create a new mutable directory named NAME in PARENT. Set *CHILD_P
+ to a reference to the new node, allocated in RESULT_POOL. The new
+ directory has no contents, and no properties. PARENT must be
+ mutable. NAME must be a single path component; it cannot be a
+ slash-separated directory path. PARENT_PATH must be the
+ canonicalized absolute path of the parent directory. PARENT must
+ not currently have an entry named NAME. TXN_ID is the Subversion
+ transaction under which this occurs.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_make_dir(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+
+/* Files. */
+
+
+/* Set *CONTENTS to a readable generic stream which yields the
+ contents of FILE. Allocate the stream in RESULT_POOL.
+
+ If FILE is not a file, return SVN_ERR_FS_NOT_FILE.
+ */
+svn_error_t *
+svn_fs_x__dag_get_contents(svn_stream_t **contents,
+ dag_node_t *file,
+ apr_pool_t *result_pool);
+
+/* Attempt to fetch the contents of NODE and pass it along with the BATON
+ to the PROCESSOR. Set *SUCCESS only of the data could be provided
+ and the processor had been called.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_try_process_file_contents(svn_boolean_t *success,
+ dag_node_t *node,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *scratch_pool);
+
+
+/* Set *STREAM_P to a delta stream that will turn the contents of SOURCE into
+ the contents of TARGET, allocated in RESULT_POOL. If SOURCE is null, the
+ empty string will be used is its stead.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ dag_node_t *source,
+ dag_node_t *target,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return a generic writable stream in *CONTENTS with which to set the
+ contents of FILE. Allocate the stream in RESULT_POOL.
+
+ Any previous edits on the file will be deleted, and a new edit
+ stream will be constructed.
+ */
+svn_error_t *
+svn_fs_x__dag_get_edit_stream(svn_stream_t **contents,
+ dag_node_t *file,
+ apr_pool_t *result_pool);
+
+
+/* Signify the completion of edits to FILE made using the stream
+ returned by svn_fs_x__dag_get_edit_stream.
+
+ If CHECKSUM is non-null, it must match the checksum for FILE's
+ contents (note: this is not recalculated, the recorded checksum is
+ used), else the error SVN_ERR_CHECKSUM_MISMATCH is returned.
+
+ This operation is a no-op if no edits are present.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_finalize_edits(dag_node_t *file,
+ const svn_checksum_t *checksum,
+ apr_pool_t *scratch_pool);
+
+
+/* Set *LENGTH to the length of the contents of FILE.
+ */
+svn_error_t *
+svn_fs_x__dag_file_length(svn_filesize_t *length,
+ dag_node_t *file);
+
+/* Put the recorded checksum of type KIND for FILE into CHECKSUM, allocating
+ from RESULT_POOL.
+
+ If no stored checksum is available, do not calculate the checksum,
+ just put NULL into CHECKSUM.
+ */
+svn_error_t *
+svn_fs_x__dag_file_checksum(svn_checksum_t **checksum,
+ dag_node_t *file,
+ svn_checksum_kind_t kind,
+ apr_pool_t *result_pool);
+
+/* Create a new mutable file named NAME in PARENT. Set *CHILD_P to a
+ reference to the new node, allocated in RESULT_POOL. The new file's
+ contents are the empty string, and it has no properties. PARENT
+ must be mutable. NAME must be a single path component; it cannot
+ be a slash-separated directory path. PARENT_PATH must be the
+ canonicalized absolute path of the parent directory. TXN_ID is the
+ Subversion transaction under which this occurs.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_make_file(dag_node_t **child_p,
+ dag_node_t *parent,
+ const char *parent_path,
+ const char *name,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+
+/* Copies */
+
+/* Make ENTRY in TO_NODE be a copy of FROM_NODE. TO_NODE must be mutable.
+ TXN_ID is the Subversion transaction under which this occurs.
+
+ If PRESERVE_HISTORY is true, the new node will record that it was
+ copied from FROM_PATH in FROM_REV; therefore, FROM_NODE should be
+ the node found at FROM_PATH in FROM_REV, although this is not
+ checked. FROM_PATH should be canonicalized before being passed
+ here.
+
+ If PRESERVE_HISTORY is false, FROM_PATH and FROM_REV are ignored.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_copy(dag_node_t *to_node,
+ const char *entry,
+ dag_node_t *from_node,
+ svn_boolean_t preserve_history,
+ svn_revnum_t from_rev,
+ const char *from_path,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+
+/* Comparison */
+
+/* Find out what is the same between two nodes. If STRICT is FALSE,
+ this function may report false positives, i.e. report changes even
+ if the resulting contents / props are equal.
+
+ If PROPS_CHANGED is non-null, set *PROPS_CHANGED to 1 if the two
+ nodes have different property lists, or to 0 if same.
+
+ If CONTENTS_CHANGED is non-null, set *CONTENTS_CHANGED to 1 if the
+ two nodes have different contents, or to 0 if same. NODE1 and NODE2
+ must refer to files from the same filesystem.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_things_different(svn_boolean_t *props_changed,
+ svn_boolean_t *contents_changed,
+ dag_node_t *node1,
+ dag_node_t *node2,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool);
+
+
+/* Set *REV and *PATH to the copyroot revision and path of node NODE, or
+ to SVN_INVALID_REVNUM and NULL if no copyroot exists.
+ */
+svn_error_t *
+svn_fs_x__dag_get_copyroot(svn_revnum_t *rev,
+ const char **path,
+ dag_node_t *node);
+
+/* Set *REV to the copyfrom revision associated with NODE.
+ */
+svn_error_t *
+svn_fs_x__dag_get_copyfrom_rev(svn_revnum_t *rev,
+ dag_node_t *node);
+
+/* Set *PATH to the copyfrom path associated with NODE.
+ */
+svn_error_t *
+svn_fs_x__dag_get_copyfrom_path(const char **path,
+ dag_node_t *node);
+
+/* Update *TARGET so that SOURCE is it's predecessor.
+
+ Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__dag_update_ancestry(dag_node_t *target,
+ dag_node_t *source,
+ apr_pool_t *scratch_pool);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_DAG_H */
diff --git a/subversion/libsvn_fs_x/fs.c b/subversion/libsvn_fs_x/fs.c
new file mode 100644
index 0000000..abc564d
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs.c
@@ -0,0 +1,669 @@
+/* fs.c --- creating, opening and closing filesystems
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <apr_general.h>
+#include <apr_pools.h>
+#include <apr_file_io.h>
+#include <apr_thread_mutex.h>
+
+#include "svn_fs.h"
+#include "svn_delta.h"
+#include "svn_version.h"
+#include "svn_pools.h"
+#include "fs.h"
+#include "fs_x.h"
+#include "pack.h"
+#include "recovery.h"
+#include "hotcopy.h"
+#include "verify.h"
+#include "tree.h"
+#include "lock.h"
+#include "id.h"
+#include "revprops.h"
+#include "rep-cache.h"
+#include "transaction.h"
+#include "util.h"
+#include "svn_private_config.h"
+#include "private/svn_fs_util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+/* A prefix for the pool userdata variables used to hold
+ per-filesystem shared data. See fs_serialized_init. */
+#define SVN_FSX_SHARED_USERDATA_PREFIX "svn-fsx-shared-"
+
+
+
+/* Initialize the part of FS that requires global serialization across all
+ instances. The caller is responsible of ensuring that serialization.
+ Use COMMON_POOL for process-wide and SCRATCH_POOL for temporary
+ allocations. */
+static svn_error_t *
+x_serialized_init(svn_fs_t *fs,
+ apr_pool_t *common_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *key;
+ void *val;
+ svn_fs_x__shared_data_t *ffsd;
+ apr_status_t status;
+
+ /* Note that we are allocating a small amount of long-lived data for
+ each separate repository opened during the lifetime of the
+ svn_fs_initialize pool. It's unlikely that anyone will notice
+ the modest expenditure; the alternative is to allocate each structure
+ in a subpool, add a reference-count, and add a serialized destructor
+ to the FS vtable. That's more machinery than it's worth.
+
+ Picking an appropriate key for the shared data is tricky, because,
+ unfortunately, a filesystem UUID is not really unique. It is implicitly
+ shared between hotcopied (1), dump / loaded (2) or naively copied (3)
+ filesystems. We tackle this problem by using a combination of the UUID
+ and an instance ID as the key. This allows us to avoid key clashing
+ in (1) and (2).
+
+ Speaking of (3), there is not so much we can do about it, except maybe
+ provide a convenient way of fixing things. Naively copied filesystems
+ have identical filesystem UUIDs *and* instance IDs. With the key being
+ a combination of these two, clashes can be fixed by changing either of
+ them (or both), e.g. with svn_fs_set_uuid(). */
+
+
+ SVN_ERR_ASSERT(fs->uuid);
+ SVN_ERR_ASSERT(ffd->instance_id);
+
+ key = apr_pstrcat(scratch_pool, SVN_FSX_SHARED_USERDATA_PREFIX,
+ fs->uuid, ":", ffd->instance_id, SVN_VA_NULL);
+ status = apr_pool_userdata_get(&val, key, common_pool);
+ if (status)
+ return svn_error_wrap_apr(status, _("Can't fetch FSX shared data"));
+ ffsd = val;
+
+ if (!ffsd)
+ {
+ ffsd = apr_pcalloc(common_pool, sizeof(*ffsd));
+ ffsd->common_pool = common_pool;
+
+ /* POSIX fcntl locks are per-process, so we need a mutex for
+ intra-process synchronization when grabbing the repository write
+ lock. */
+ SVN_ERR(svn_mutex__init(&ffsd->fs_write_lock,
+ SVN_FS_X__USE_LOCK_MUTEX, common_pool));
+
+ /* ... the pack lock ... */
+ SVN_ERR(svn_mutex__init(&ffsd->fs_pack_lock,
+ SVN_FS_X__USE_LOCK_MUTEX, common_pool));
+
+ /* ... not to mention locking the txn-current file. */
+ SVN_ERR(svn_mutex__init(&ffsd->txn_current_lock,
+ SVN_FS_X__USE_LOCK_MUTEX, common_pool));
+
+ /* We also need a mutex for synchronizing access to the active
+ transaction list and free transaction pointer. */
+ SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock, TRUE, common_pool));
+
+ key = apr_pstrdup(common_pool, key);
+ status = apr_pool_userdata_set(ffsd, key, NULL, common_pool);
+ if (status)
+ return svn_error_wrap_apr(status, _("Can't store FSX shared data"));
+ }
+
+ ffd->shared = ffsd;
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* This function is provided for Subversion 1.0.x compatibility. It
+ has no effect for fsx backed Subversion filesystems. It conforms
+ to the fs_library_vtable_t.bdb_set_errcall() API. */
+static svn_error_t *
+x_set_errcall(svn_fs_t *fs,
+ void (*db_errcall_fcn)(const char *errpfx, char *msg))
+{
+
+ return SVN_NO_ERROR;
+}
+
+typedef struct x_freeze_baton_t {
+ svn_fs_t *fs;
+ svn_fs_freeze_func_t freeze_func;
+ void *freeze_baton;
+} x_freeze_baton_t;
+
+static svn_error_t *
+x_freeze_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ x_freeze_baton_t *b = baton;
+ svn_boolean_t exists;
+
+ SVN_ERR(svn_fs_x__exists_rep_cache(&exists, b->fs, scratch_pool));
+ if (exists)
+ SVN_ERR(svn_fs_x__with_rep_cache_lock(b->fs,
+ b->freeze_func, b->freeze_baton,
+ scratch_pool));
+ else
+ SVN_ERR(b->freeze_func(b->freeze_baton, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_freeze_body2(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ x_freeze_baton_t *b = baton;
+ SVN_ERR(svn_fs_x__with_write_lock(b->fs, x_freeze_body, baton,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_freeze(svn_fs_t *fs,
+ svn_fs_freeze_func_t freeze_func,
+ void *freeze_baton,
+ apr_pool_t *scratch_pool)
+{
+ x_freeze_baton_t b;
+
+ b.fs = fs;
+ b.freeze_func = freeze_func;
+ b.freeze_baton = freeze_baton;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_x__with_pack_lock(fs, x_freeze_body2, &b, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_info(const void **fsx_info,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_fsx_info_t *info = apr_palloc(result_pool, sizeof(*info));
+ info->fs_type = SVN_FS_TYPE_FSX;
+ info->shard_size = ffd->max_files_per_dir;
+ info->min_unpacked_rev = ffd->min_unpacked_rev;
+ *fsx_info = info;
+ return SVN_NO_ERROR;
+}
+
+/* Wrapper around svn_fs_x__revision_prop() adapting between function
+ signatures. */
+static svn_error_t *
+x_revision_prop(svn_string_t **value_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *propname,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_x__revision_prop(value_p, fs, rev, propname, pool,
+ scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Wrapper around svn_fs_x__get_revision_proplist() adapting between function
+ signatures. */
+static svn_error_t *
+x_revision_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ /* No need to bypass the caches for r/o access to revprops. */
+ SVN_ERR(svn_fs_x__get_revision_proplist(proplist_p, fs, rev, FALSE,
+ pool, scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Wrapper around svn_fs_x__set_uuid() adapting between function
+ signatures. */
+static svn_error_t *
+x_set_uuid(svn_fs_t *fs,
+ const char *uuid,
+ apr_pool_t *scratch_pool)
+{
+ /* Whenever we set a new UUID, imply that FS will also be a different
+ * instance (on formats that support this). */
+ return svn_error_trace(svn_fs_x__set_uuid(fs, uuid, NULL, scratch_pool));
+}
+
+/* Wrapper around svn_fs_x__begin_txn() providing the scratch pool. */
+static svn_error_t *
+x_begin_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint32_t flags,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_x__begin_txn(txn_p, fs, rev, flags, pool, scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* The vtable associated with a specific open filesystem. */
+static fs_vtable_t fs_vtable = {
+ svn_fs_x__youngest_rev,
+ x_revision_prop,
+ x_revision_proplist,
+ svn_fs_x__change_rev_prop,
+ x_set_uuid,
+ svn_fs_x__revision_root,
+ x_begin_txn,
+ svn_fs_x__open_txn,
+ svn_fs_x__purge_txn,
+ svn_fs_x__list_transactions,
+ svn_fs_x__deltify,
+ svn_fs_x__lock,
+ svn_fs_x__generate_lock_token,
+ svn_fs_x__unlock,
+ svn_fs_x__get_lock,
+ svn_fs_x__get_locks,
+ svn_fs_x__info_format,
+ svn_fs_x__info_config_files,
+ x_info,
+ svn_fs_x__verify_root,
+ x_freeze,
+ x_set_errcall
+};
+
+
+/* Creating a new filesystem. */
+
+/* Set up vtable and fsap_data fields in FS. */
+static svn_error_t *
+initialize_fs_struct(svn_fs_t *fs)
+{
+ svn_fs_x__data_t *ffd = apr_pcalloc(fs->pool, sizeof(*ffd));
+ fs->vtable = &fs_vtable;
+ fs->fsap_data = ffd;
+ return SVN_NO_ERROR;
+}
+
+/* Reset vtable and fsap_data fields in FS such that the FS is basically
+ * closed now. Note that FS must not hold locks when you call this. */
+static void
+uninitialize_fs_struct(svn_fs_t *fs)
+{
+ fs->vtable = NULL;
+ fs->fsap_data = NULL;
+}
+
+/* This implements the fs_library_vtable_t.create() API. Create a new
+ fsx-backed Subversion filesystem at path PATH and link it into
+ *FS.
+
+ Perform temporary allocations in SCRATCH_POOL, and fs-global allocations
+ in COMMON_POOL. The latter must be serialized using COMMON_POOL_LOCK. */
+static svn_error_t *
+x_create(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ SVN_ERR(svn_fs__check_fs(fs, FALSE));
+
+ SVN_ERR(initialize_fs_struct(fs));
+
+ SVN_ERR(svn_fs_x__create(fs, path, scratch_pool));
+
+ SVN_ERR(svn_fs_x__initialize_caches(fs, scratch_pool));
+ SVN_MUTEX__WITH_LOCK(common_pool_lock,
+ x_serialized_init(fs, common_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Gaining access to an existing filesystem. */
+
+/* This implements the fs_library_vtable_t.open() API. Open an FSX
+ Subversion filesystem located at PATH, set *FS to point to the
+ correct vtable for the filesystem. Use SCRATCH_POOL for any temporary
+ allocations, and COMMON_POOL for fs-global allocations.
+ The latter must be serialized using COMMON_POOL_LOCK. */
+static svn_error_t *
+x_open(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_fs__check_fs(fs, FALSE));
+
+ SVN_ERR(initialize_fs_struct(fs));
+
+ SVN_ERR(svn_fs_x__open(fs, path, subpool));
+
+ SVN_ERR(svn_fs_x__initialize_caches(fs, subpool));
+ SVN_MUTEX__WITH_LOCK(common_pool_lock,
+ x_serialized_init(fs, common_pool, subpool));
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* This implements the fs_library_vtable_t.open_for_recovery() API. */
+static svn_error_t *
+x_open_for_recovery(svn_fs_t *fs,
+ const char *path,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ svn_error_t * err;
+ svn_revnum_t youngest_rev;
+ apr_pool_t * subpool = svn_pool_create(scratch_pool);
+
+ /* Recovery for FSFS is currently limited to recreating the 'current'
+ file from the latest revision. */
+
+ /* The only thing we have to watch out for is that the 'current' file
+ might not exist or contain garbage. So we'll try to read it here
+ and provide or replace the existing file if we couldn't read it.
+ (We'll also need it to exist later anyway as a source for the new
+ file's permissions). */
+
+ /* Use a partly-filled fs pointer first to create 'current'. */
+ fs->path = apr_pstrdup(fs->pool, path);
+
+ SVN_ERR(initialize_fs_struct(fs));
+
+ /* Figure out the repo format and check that we can even handle it. */
+ SVN_ERR(svn_fs_x__read_format_file(fs, subpool));
+
+ /* Now, read 'current' and try to patch it if necessary. */
+ err = svn_fs_x__youngest_rev(&youngest_rev, fs, subpool);
+ if (err)
+ {
+ const char *file_path;
+
+ /* 'current' file is missing or contains garbage. Since we are trying
+ * to recover from whatever problem there is, being picky about the
+ * error code here won't do us much good. If there is a persistent
+ * problem that we can't fix, it will show up when we try rewrite the
+ * file a few lines further below and we will report the failure back
+ * to the caller.
+ *
+ * Start recovery with HEAD = 0. */
+ svn_error_clear(err);
+ file_path = svn_fs_x__path_current(fs, subpool);
+
+ /* Best effort to ensure the file exists and is valid.
+ * This may fail for r/o filesystems etc. */
+ SVN_ERR(svn_io_remove_file2(file_path, TRUE, subpool));
+ SVN_ERR(svn_io_file_create_empty(file_path, subpool));
+ SVN_ERR(svn_fs_x__write_current(fs, 0, subpool));
+ }
+
+ uninitialize_fs_struct(fs);
+ svn_pool_destroy(subpool);
+
+ /* Now open the filesystem properly by calling the vtable method directly. */
+ return x_open(fs, path, common_pool_lock, scratch_pool, common_pool);
+}
+
+
+
+/* This implements the fs_library_vtable_t.upgrade_fs() API. */
+static svn_error_t *
+x_upgrade(svn_fs_t *fs,
+ const char *path,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ SVN_ERR(x_open(fs, path, common_pool_lock, scratch_pool, common_pool));
+ return svn_fs_x__upgrade(fs, notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool);
+}
+
+static svn_error_t *
+x_verify(svn_fs_t *fs,
+ const char *path,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ SVN_ERR(x_open(fs, path, common_pool_lock, scratch_pool, common_pool));
+ return svn_fs_x__verify(fs, start, end, notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool);
+}
+
+static svn_error_t *
+x_pack(svn_fs_t *fs,
+ const char *path,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ SVN_ERR(x_open(fs, path, common_pool_lock, scratch_pool, common_pool));
+ return svn_fs_x__pack(fs, notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool);
+}
+
+
+
+
+/* This implements the fs_library_vtable_t.hotcopy() API. Copy a
+ possibly live Subversion filesystem SRC_FS from SRC_PATH to a
+ DST_FS at DEST_PATH. If INCREMENTAL is TRUE, make an effort not to
+ re-copy data which already exists in DST_FS.
+ The CLEAN_LOGS argument is ignored and included for Subversion
+ 1.0.x compatibility. The NOTIFY_FUNC and NOTIFY_BATON arguments
+ are also currently ignored.
+ Perform all temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+x_hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *src_path,
+ const char *dst_path,
+ svn_boolean_t clean_logs,
+ svn_boolean_t incremental,
+ svn_fs_hotcopy_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *common_pool)
+{
+ /* Open the source repo as usual. */
+ SVN_ERR(x_open(src_fs, src_path, common_pool_lock, scratch_pool,
+ common_pool));
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Test target repo when in INCREMENTAL mode, initialize it when not.
+ * For this, we need our FS internal data structures to be temporarily
+ * available. */
+ SVN_ERR(initialize_fs_struct(dst_fs));
+ SVN_ERR(svn_fs_x__hotcopy_prepare_target(src_fs, dst_fs, dst_path,
+ incremental, scratch_pool));
+ uninitialize_fs_struct(dst_fs);
+
+ /* Now, the destination repo should open just fine. */
+ SVN_ERR(x_open(dst_fs, dst_path, common_pool_lock, scratch_pool,
+ common_pool));
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Now, we may copy data as needed ... */
+ return svn_fs_x__hotcopy(src_fs, dst_fs, incremental,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool);
+}
+
+
+
+/* This function is included for Subversion 1.0.x compatibility. It
+ has no effect for fsx backed Subversion filesystems. It conforms
+ to the fs_library_vtable_t.bdb_logfiles() API. */
+static svn_error_t *
+x_logfiles(apr_array_header_t **logfiles,
+ const char *path,
+ svn_boolean_t only_unused,
+ apr_pool_t *pool)
+{
+ /* A no-op for FSX. */
+ *logfiles = apr_array_make(pool, 0, sizeof(const char *));
+
+ return SVN_NO_ERROR;
+}
+
+
+
+
+
+/* Delete the filesystem located at path PATH. Perform any temporary
+ allocations in SCRATCH_POOL. */
+static svn_error_t *
+x_delete_fs(const char *path,
+ apr_pool_t *scratch_pool)
+{
+ /* Remove everything. */
+ return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL,
+ scratch_pool));
+}
+
+static const svn_version_t *
+x_version(void)
+{
+ SVN_VERSION_BODY;
+}
+
+static const char *
+x_get_description(void)
+{
+ return _("Module for working with an experimental (FSX) repository.");
+}
+
+static svn_error_t *
+x_set_svn_fs_open(svn_fs_t *fs,
+ svn_error_t *(*svn_fs_open_)(svn_fs_t **,
+ const char *,
+ apr_hash_t *,
+ apr_pool_t *,
+ apr_pool_t *))
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ ffd->svn_fs_open_ = svn_fs_open_;
+ return SVN_NO_ERROR;
+}
+
+static void *
+x_info_dup(const void *fsx_info_void,
+ apr_pool_t *result_pool)
+{
+ /* All fields are either ints or static strings. */
+ const svn_fs_fsx_info_t *fsx_info = fsx_info_void;
+ return apr_pmemdup(result_pool, fsx_info, sizeof(*fsx_info));
+}
+
+
+/* Base FS library vtable, used by the FS loader library. */
+
+static fs_library_vtable_t library_vtable = {
+ x_version,
+ x_create,
+ x_open,
+ x_open_for_recovery,
+ x_upgrade,
+ x_verify,
+ x_delete_fs,
+ x_hotcopy,
+ x_get_description,
+ svn_fs_x__recover,
+ x_pack,
+ x_logfiles,
+ NULL /* parse_id */,
+ x_set_svn_fs_open,
+ x_info_dup
+};
+
+svn_error_t *
+svn_fs_x__init(const svn_version_t *loader_version,
+ fs_library_vtable_t **vtable,
+ apr_pool_t* common_pool)
+{
+ static const svn_version_checklist_t checklist[] =
+ {
+ { "svn_subr", svn_subr_version },
+ { "svn_delta", svn_delta_version },
+ { "svn_fs_util", svn_fs_util__version },
+ { NULL, NULL }
+ };
+
+ /* Simplified version check to make sure we can safely use the
+ VTABLE parameter. The FS loader does a more exhaustive check. */
+ if (loader_version->major != SVN_VER_MAJOR)
+ return svn_error_createf(SVN_ERR_VERSION_MISMATCH, NULL,
+ _("Unsupported FS loader version (%d) for fsx"),
+ loader_version->major);
+ SVN_ERR(svn_ver_check_list2(x_version(), checklist, svn_ver_equal));
+
+ *vtable = &library_vtable;
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/fs.h b/subversion/libsvn_fs_x/fs.h
new file mode 100644
index 0000000..afb4b2a
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs.h
@@ -0,0 +1,574 @@
+/* fs.h : interface to Subversion filesystem, private to libsvn_fs
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_X_H
+#define SVN_LIBSVN_FS_X_H
+
+#include <apr_pools.h>
+#include <apr_hash.h>
+#include <apr_network_io.h>
+#include <apr_md5.h>
+#include <apr_sha1.h>
+
+#include "svn_fs.h"
+#include "svn_config.h"
+#include "private/svn_atomic.h"
+#include "private/svn_cache.h"
+#include "private/svn_fs_private.h"
+#include "private/svn_sqlite.h"
+#include "private/svn_mutex.h"
+
+#include "id.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*** The filesystem structure. ***/
+
+/* Following are defines that specify the textual elements of the
+ native filesystem directories and revision files. */
+
+/* Names of special files in the fs_x filesystem. */
+#define PATH_FORMAT "format" /* Contains format number */
+#define PATH_UUID "uuid" /* Contains UUID */
+#define PATH_CURRENT "current" /* Youngest revision */
+#define PATH_LOCK_FILE "write-lock" /* Revision lock file */
+#define PATH_PACK_LOCK_FILE "pack-lock" /* Pack lock file */
+#define PATH_REVS_DIR "revs" /* Directory of revisions */
+#define PATH_REVPROPS_DIR "revprops" /* Directory of revprops */
+#define PATH_TXNS_DIR "transactions" /* Directory of transactions */
+#define PATH_NODE_ORIGINS_DIR "node-origins" /* Lazy node-origin cache */
+#define PATH_TXN_PROTOS_DIR "txn-protorevs" /* Directory of proto-revs */
+#define PATH_TXN_CURRENT "txn-current" /* File with next txn key */
+#define PATH_TXN_CURRENT_LOCK "txn-current-lock" /* Lock for txn-current */
+#define PATH_LOCKS_DIR "locks" /* Directory of locks */
+#define PATH_MIN_UNPACKED_REV "min-unpacked-rev" /* Oldest revision which
+ has not been packed. */
+#define PATH_REVPROP_GENERATION "revprop-generation"
+ /* Current revprop generation*/
+#define PATH_MANIFEST "manifest" /* Manifest file name */
+#define PATH_PACKED "pack" /* Packed revision data file */
+#define PATH_EXT_PACKED_SHARD ".pack" /* Extension for packed
+ shards */
+#define PATH_EXT_L2P_INDEX ".l2p" /* extension of the log-
+ to-phys index */
+#define PATH_EXT_P2L_INDEX ".p2l" /* extension of the phys-
+ to-log index */
+/* If you change this, look at tests/svn_test_fs.c(maybe_install_fsx_conf) */
+#define PATH_CONFIG "fsx.conf" /* Configuration */
+
+/* Names of special files and file extensions for transactions */
+#define PATH_CHANGES "changes" /* Records changes made so far */
+#define PATH_TXN_PROPS "props" /* Transaction properties */
+#define PATH_TXN_PROPS_FINAL "props-final" /* Final transaction properties
+ before moving to revprops */
+#define PATH_NEXT_IDS "next-ids" /* Next temporary ID assignments */
+#define PATH_PREFIX_NODE "node." /* Prefix for node filename */
+#define PATH_EXT_TXN ".txn" /* Extension of txn dir */
+#define PATH_EXT_CHILDREN ".children" /* Extension for dir contents */
+#define PATH_EXT_PROPS ".props" /* Extension for node props */
+#define PATH_EXT_REV ".rev" /* Extension of protorev file */
+#define PATH_EXT_REV_LOCK ".rev-lock" /* Extension of protorev lock file */
+#define PATH_TXN_ITEM_INDEX "itemidx" /* File containing the current item
+ index number */
+#define PATH_INDEX "index" /* name of index files w/o ext */
+
+/* Names of files in legacy FS formats */
+#define PATH_REV "rev" /* Proto rev file */
+#define PATH_REV_LOCK "rev-lock" /* Proto rev (write) lock file */
+
+/* Names of sections and options in fsx.conf. */
+#define CONFIG_SECTION_CACHES "caches"
+#define CONFIG_OPTION_FAIL_STOP "fail-stop"
+#define CONFIG_SECTION_REP_SHARING "rep-sharing"
+#define CONFIG_OPTION_ENABLE_REP_SHARING "enable-rep-sharing"
+#define CONFIG_SECTION_DELTIFICATION "deltification"
+#define CONFIG_OPTION_MAX_DELTIFICATION_WALK "max-deltification-walk"
+#define CONFIG_OPTION_MAX_LINEAR_DELTIFICATION "max-linear-deltification"
+#define CONFIG_OPTION_COMPRESSION_LEVEL "compression-level"
+#define CONFIG_SECTION_PACKED_REVPROPS "packed-revprops"
+#define CONFIG_OPTION_REVPROP_PACK_SIZE "revprop-pack-size"
+#define CONFIG_OPTION_COMPRESS_PACKED_REVPROPS "compress-packed-revprops"
+#define CONFIG_SECTION_IO "io"
+#define CONFIG_OPTION_BLOCK_SIZE "block-size"
+#define CONFIG_OPTION_L2P_PAGE_SIZE "l2p-page-size"
+#define CONFIG_OPTION_P2L_PAGE_SIZE "p2l-page-size"
+#define CONFIG_SECTION_DEBUG "debug"
+#define CONFIG_OPTION_PACK_AFTER_COMMIT "pack-after-commit"
+
+/* The format number of this filesystem.
+ This is independent of the repository format number, and
+ independent of any other FS back ends.
+
+ Note: If you bump this, please update the switch statement in
+ svn_fs_x__create() as well.
+ */
+#define SVN_FS_X__FORMAT_NUMBER 1
+
+/* On most operating systems apr implements file locks per process, not
+ per file. On Windows apr implements the locking as per file handle
+ locks, so we don't have to add our own mutex for just in-process
+ synchronization. */
+#if APR_HAS_THREADS && !defined(WIN32)
+#define SVN_FS_X__USE_LOCK_MUTEX 1
+#else
+#define SVN_FS_X__USE_LOCK_MUTEX 0
+#endif
+
+/* Private FSX-specific data shared between all svn_txn_t objects that
+ relate to a particular transaction in a filesystem (as identified
+ by transaction id and filesystem UUID). Objects of this type are
+ allocated in their own subpool of the common pool. */
+typedef struct svn_fs_x__shared_txn_data_t
+{
+ /* The next transaction in the list, or NULL if there is no following
+ transaction. */
+ struct svn_fs_x__shared_txn_data_t *next;
+
+ /* ID of this transaction. */
+ svn_fs_x__txn_id_t txn_id;
+
+ /* Whether the transaction's prototype revision file is locked for
+ writing by any thread in this process (including the current
+ thread; recursive locks are not permitted). This is effectively
+ a non-recursive mutex. */
+ svn_boolean_t being_written;
+
+ /* The pool in which this object has been allocated; a subpool of the
+ common pool. */
+ apr_pool_t *pool;
+} svn_fs_x__shared_txn_data_t;
+
+/* Private FSX-specific data shared between all svn_fs_t objects that
+ relate to a particular filesystem, as identified by filesystem UUID.
+ Objects of this type are allocated in the common pool. */
+typedef struct svn_fs_x__shared_data_t
+{
+ /* A list of shared transaction objects for each transaction that is
+ currently active, or NULL if none are. All access to this list,
+ including the contents of the objects stored in it, is synchronised
+ under TXN_LIST_LOCK. */
+ svn_fs_x__shared_txn_data_t *txns;
+
+ /* A free transaction object, or NULL if there is no free object.
+ Access to this object is synchronised under TXN_LIST_LOCK. */
+ svn_fs_x__shared_txn_data_t *free_txn;
+
+ /* The following lock must be taken out in reverse order of their
+ declaration here. Any subset may be acquired and held at any given
+ time but their relative acquisition order must not change.
+
+ (lock 'txn-current' before 'pack' before 'write' before 'txn-list') */
+
+ /* A lock for intra-process synchronization when accessing the TXNS list. */
+ svn_mutex__t *txn_list_lock;
+
+ /* A lock for intra-process synchronization when grabbing the
+ repository write lock. */
+ svn_mutex__t *fs_write_lock;
+
+ /* A lock for intra-process synchronization when grabbing the
+ repository pack operation lock. */
+ svn_mutex__t *fs_pack_lock;
+
+ /* A lock for intra-process synchronization when locking the
+ txn-current file. */
+ svn_mutex__t *txn_current_lock;
+
+ /* The common pool, under which this object is allocated, subpools
+ of which are used to allocate the transaction objects. */
+ apr_pool_t *common_pool;
+} svn_fs_x__shared_data_t;
+
+/* Data structure for the 1st level DAG node cache. */
+typedef struct svn_fs_x__dag_cache_t svn_fs_x__dag_cache_t;
+
+/* Key type for all caches that use revision + offset / counter as key.
+
+ Note: Cache keys should be 16 bytes for best performance and there
+ should be no padding. */
+typedef struct svn_fs_x__pair_cache_key_t
+{
+ /* The object's revision. Use the 64 data type to prevent padding. */
+ apr_int64_t revision;
+
+ /* Sub-address: item index, revprop generation, packed flag, etc. */
+ apr_int64_t second;
+} svn_fs_x__pair_cache_key_t;
+
+/* Key type that identifies a representation / rep header.
+
+ Note: Cache keys should require no padding. */
+typedef struct svn_fs_x__representation_cache_key_t
+{
+ /* Revision that contains the representation */
+ apr_int64_t revision;
+
+ /* Packed or non-packed representation (boolean)? */
+ apr_int64_t is_packed;
+
+ /* Item index of the representation */
+ apr_uint64_t item_index;
+} svn_fs_x__representation_cache_key_t;
+
+/* Key type that identifies a txdelta window.
+
+ Note: Cache keys should require no padding. */
+typedef struct svn_fs_x__window_cache_key_t
+{
+ /* The object's revision. Use the 64 data type to prevent padding. */
+ apr_int64_t revision;
+
+ /* Window number within that representation. */
+ apr_int64_t chunk_index;
+
+ /* Item index of the representation */
+ apr_uint64_t item_index;
+} svn_fs_x__window_cache_key_t;
+
+/* Private (non-shared) FSX-specific data for each svn_fs_t object.
+ Any caches in here may be NULL. */
+typedef struct svn_fs_x__data_t
+{
+ /* The format number of this FS. */
+ int format;
+
+ /* The maximum number of files to store per directory. */
+ int max_files_per_dir;
+
+ /* Rev / pack file read granularity in bytes. */
+ apr_int64_t block_size;
+
+ /* Rev / pack file granularity (in bytes) covered by a single phys-to-log
+ * index page. */
+ /* Capacity in entries of log-to-phys index pages */
+ apr_int64_t l2p_page_size;
+
+ /* Rev / pack file granularity covered by phys-to-log index pages */
+ apr_int64_t p2l_page_size;
+
+ /* The revision that was youngest, last time we checked. */
+ svn_revnum_t youngest_rev_cache;
+
+ /* Caches of immutable data. (Note that these may be shared between
+ multiple svn_fs_t's for the same filesystem.) */
+
+ /* Access to the configured memcached instances. May be NULL. */
+ svn_memcache_t *memcache;
+
+ /* If TRUE, don't ignore any cache-related errors. If FALSE, errors from
+ e.g. memcached may be ignored as caching is an optional feature. */
+ svn_boolean_t fail_stop;
+
+ /* Caches native dag_node_t* instances and acts as a 1st level cache */
+ svn_fs_x__dag_cache_t *dag_node_cache;
+
+ /* DAG node cache for immutable nodes. Maps (revision, fspath)
+ to (dag_node_t *). This is the 2nd level cache for DAG nodes. */
+ svn_cache__t *rev_node_cache;
+
+ /* A cache of the contents of immutable directories; maps from
+ unparsed FS ID to a apr_hash_t * mapping (const char *) dirent
+ names to (svn_fs_x__dirent_t *). */
+ svn_cache__t *dir_cache;
+
+ /* Fulltext cache; currently only used with memcached. Maps from
+ rep key (revision/offset) to svn_stringbuf_t. */
+ svn_cache__t *fulltext_cache;
+
+ /* Access object to the revprop "generation". Will be NULL until
+ the first access. May be also get closed and set to NULL again. */
+ apr_file_t *revprop_generation_file;
+
+ /* Revision property cache. Maps from (rev,generation) to apr_hash_t. */
+ svn_cache__t *revprop_cache;
+
+ /* Node properties cache. Maps from rep key to apr_hash_t. */
+ svn_cache__t *properties_cache;
+
+ /* Pack manifest cache; a cache mapping (svn_revnum_t) shard number to
+ a manifest; and a manifest is a mapping from (svn_revnum_t) revision
+ number offset within a shard to (apr_off_t) byte-offset in the
+ respective pack file. */
+ svn_cache__t *packed_offset_cache;
+
+ /* Cache for txdelta_window_t objects;
+ * the key is svn_fs_x__window_cache_key_t */
+ svn_cache__t *txdelta_window_cache;
+
+ /* Cache for combined windows as svn_stringbuf_t objects;
+ the key is svn_fs_x__window_cache_key_t */
+ svn_cache__t *combined_window_cache;
+
+ /* Cache for svn_fs_x__rep_header_t objects;
+ * the key is (revision, item index) */
+ svn_cache__t *node_revision_cache;
+
+ /* Cache for noderevs_t containers;
+ the key is a (pack file revision, file offset) pair */
+ svn_cache__t *noderevs_container_cache;
+
+ /* Cache for change lists as APR arrays of svn_fs_x__change_t * objects;
+ the key is the revision */
+ svn_cache__t *changes_cache;
+
+ /* Cache for change_list_t containers;
+ the key is a (pack file revision, file offset) pair */
+ svn_cache__t *changes_container_cache;
+
+ /* Cache for star-delta / representation containers;
+ the key is a (pack file revision, file offset) pair */
+ svn_cache__t *reps_container_cache;
+
+ /* Cache for svn_fs_x__rep_header_t objects; the key is a
+ (revision, item index) pair */
+ svn_cache__t *rep_header_cache;
+
+ /* Cache for svn_mergeinfo_t objects; the key is a combination of
+ revision, inheritance flags and path. */
+ svn_cache__t *mergeinfo_cache;
+
+ /* Cache for presence of svn_mergeinfo_t on a noderev; the key is a
+ combination of revision, inheritance flags and path; value is "1"
+ if the node has mergeinfo, "0" if it doesn't. */
+ svn_cache__t *mergeinfo_existence_cache;
+
+ /* Cache for l2p_header_t objects; the key is (revision, is-packed).
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *l2p_header_cache;
+
+ /* Cache for l2p_page_t objects; the key is svn_fs_x__page_cache_key_t.
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *l2p_page_cache;
+
+ /* Cache for p2l_header_t objects; the key is (revision, is-packed).
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *p2l_header_cache;
+
+ /* Cache for apr_array_header_t objects containing svn_fs_x__p2l_entry_t
+ elements; the key is svn_fs_x__page_cache_key_t.
+ Will be NULL for pre-format7 repos */
+ svn_cache__t *p2l_page_cache;
+
+ /* TRUE while the we hold a lock on the write lock file. */
+ svn_boolean_t has_write_lock;
+
+ /* Data shared between all svn_fs_t objects for a given filesystem. */
+ svn_fs_x__shared_data_t *shared;
+
+ /* The sqlite database used for rep caching. */
+ svn_sqlite__db_t *rep_cache_db;
+
+ /* Thread-safe boolean */
+ svn_atomic_t rep_cache_db_opened;
+
+ /* The oldest revision not in a pack file. It also applies to revprops
+ * if revprop packing has been enabled by the FSX format version. */
+ svn_revnum_t min_unpacked_rev;
+
+ /* Whether rep-sharing is supported by the filesystem
+ * and allowed by the configuration. */
+ svn_boolean_t rep_sharing_allowed;
+
+ /* File size limit in bytes up to which multiple revprops shall be packed
+ * into a single file. */
+ apr_int64_t revprop_pack_size;
+
+ /* Whether packed revprop files shall be compressed. */
+ svn_boolean_t compress_packed_revprops;
+
+ /* Restart deltification histories after each multiple of this value */
+ apr_int64_t max_deltification_walk;
+
+ /* Maximum number of length of the linear part at the top of the
+ * deltification history after which skip deltas will be used. */
+ apr_int64_t max_linear_deltification;
+
+ /* Compression level to use with txdelta storage format in new revs. */
+ int delta_compression_level;
+
+ /* Pack after every commit. */
+ svn_boolean_t pack_after_commit;
+
+ /* Per-instance filesystem ID, which provides an additional level of
+ uniqueness for filesystems that share the same UUID, but should
+ still be distinguishable (e.g. backups produced by svn_fs_hotcopy()
+ or dump / load cycles). */
+ const char *instance_id;
+
+ /* Pointer to svn_fs_open. */
+ svn_error_t *(*svn_fs_open_)(svn_fs_t **, const char *, apr_hash_t *,
+ apr_pool_t *, apr_pool_t *);
+} svn_fs_x__data_t;
+
+
+/*** Filesystem Transaction ***/
+typedef struct svn_fs_x__transaction_t
+{
+ /* property list (const char * name, svn_string_t * value).
+ may be NULL if there are no properties. */
+ apr_hash_t *proplist;
+
+ /* revision upon which this txn is base. (unfinished only) */
+ svn_revnum_t base_rev;
+
+ /* copies list (const char * copy_ids), or NULL if there have been
+ no copies in this transaction. */
+ apr_array_header_t *copies;
+
+} svn_fs_x__transaction_t;
+
+
+/*** Representation ***/
+/* If you add fields to this, check to see if you need to change
+ * svn_fs_x__rep_copy. */
+typedef struct svn_fs_x__representation_t
+{
+ /* Checksums digests for the contents produced by this representation.
+ This checksum is for the contents the rep shows to consumers,
+ regardless of how the rep stores the data under the hood. It is
+ independent of the storage (fulltext, delta, whatever).
+
+ If has_sha1 is FALSE, then for compatibility behave as though this
+ checksum matches the expected checksum.
+
+ The md5 checksum is always filled, unless this is rep which was
+ retrieved from the rep-cache. The sha1 checksum is only computed on
+ a write, for use with rep-sharing. */
+ svn_boolean_t has_sha1;
+ unsigned char sha1_digest[APR_SHA1_DIGESTSIZE];
+ unsigned char md5_digest[APR_MD5_DIGESTSIZE];
+
+ /* Change set and item number where this representation is located. */
+ svn_fs_x__id_t id;
+
+ /* The size of the representation in bytes as seen in the revision
+ file. */
+ svn_filesize_t size;
+
+ /* The size of the fulltext of the representation. */
+ svn_filesize_t expanded_size;
+
+} svn_fs_x__representation_t;
+
+
+/*** Node-Revision ***/
+/* If you add fields to this, check to see if you need to change
+ * copy_node_revision in dag.c. */
+typedef struct svn_fs_x__noderev_t
+{
+ /* Predecessor node revision id. Will be "unused" if there is no
+ predecessor for this node revision. */
+ svn_fs_x__id_t predecessor_id;
+
+ /* The ID of this noderev */
+ svn_fs_x__id_t noderev_id;
+
+ /* Identifier of the node that this noderev belongs to. */
+ svn_fs_x__id_t node_id;
+
+ /* Copy identifier of this line of history. */
+ svn_fs_x__id_t copy_id;
+
+ /* If this node-rev is a copy, where was it copied from? */
+ const char *copyfrom_path;
+ svn_revnum_t copyfrom_rev;
+
+ /* Helper for history tracing, root of the parent tree from whence
+ this node-rev was copied. */
+ svn_revnum_t copyroot_rev;
+ const char *copyroot_path;
+
+ /* node kind */
+ svn_node_kind_t kind;
+
+ /* number of predecessors this node revision has (recursively). */
+ int predecessor_count;
+
+ /* representation key for this node's properties. may be NULL if
+ there are no properties. */
+ svn_fs_x__representation_t *prop_rep;
+
+ /* representation for this node's data. may be NULL if there is
+ no data. */
+ svn_fs_x__representation_t *data_rep;
+
+ /* path at which this node first came into existence. */
+ const char *created_path;
+
+ /* Does this node itself have svn:mergeinfo? */
+ svn_boolean_t has_mergeinfo;
+
+ /* Number of nodes with svn:mergeinfo properties that are
+ descendants of this node (including it itself) */
+ apr_int64_t mergeinfo_count;
+
+} svn_fs_x__noderev_t;
+
+
+/** The type of a directory entry. */
+typedef struct svn_fs_x__dirent_t
+{
+
+ /** The name of this directory entry. */
+ const char *name;
+
+ /** The node revision ID it names. */
+ svn_fs_x__id_t id;
+
+ /** The node kind. */
+ svn_node_kind_t kind;
+} svn_fs_x__dirent_t;
+
+
+/*** Change ***/
+typedef struct svn_fs_x__change_t
+{
+ /* Path of the change. */
+ svn_string_t path;
+
+ /* node revision id of changed path */
+ svn_fs_x__id_t noderev_id;
+
+ /* See svn_fs_path_change2_t for a description for the remaining elements.
+ */
+ svn_fs_path_change_kind_t change_kind;
+
+ svn_boolean_t text_mod;
+ svn_boolean_t prop_mod;
+ svn_node_kind_t node_kind;
+
+ svn_boolean_t copyfrom_known;
+ svn_revnum_t copyfrom_rev;
+ const char *copyfrom_path;
+
+ svn_tristate_t mergeinfo_mod;
+} svn_fs_x__change_t;
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_X_H */
diff --git a/subversion/libsvn_fs_x/fs_id.c b/subversion/libsvn_fs_x/fs_id.c
new file mode 100644
index 0000000..16f8f26
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs_id.c
@@ -0,0 +1,319 @@
+/* fs_id.c : FSX's implementation of svn_fs_id_t
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+
+#include "cached_data.h"
+#include "fs_id.h"
+
+#include "../libsvn_fs/fs-loader.h"
+#include "private/svn_string_private.h"
+
+
+
+/* Structure holding everything needed to implement svn_fs_id_t for FSX.
+ */
+typedef struct fs_x__id_t
+{
+ /* API visible part.
+ The fsap_data member points to our svn_fs_x__id_context_t object. */
+ svn_fs_id_t generic_id;
+
+ /* Private members.
+ This addresses the DAG node identified by this ID object.
+ If it refers to a TXN, it may become . */
+ svn_fs_x__id_t noderev_id;
+
+} fs_x__id_t;
+
+
+
+/* The state machine behind this is as follows:
+
+ (A) FS passed in during context construction still open and uses a
+ different pool as the context (Usually the initial state). In that
+ case, FS_PATH is NULL and we watch for either pool's cleanup.
+
+ Next states:
+ (B). Transition triggered by FS->POOL cleanup.
+ (D). Transition triggered by OWNER cleanup.
+
+ (B) FS has been closed but not the OWNER pool, i.e. the context is valid.
+ FS is NULL, FS_NAME has been set. No cleanup functions are registered.
+
+ Next states:
+ (C). Transition triggered by successful access to the file system.
+ (D). Transition triggered by OWNER cleanup.
+
+ (C) FS is open, allocated in the context's OWNER pool (maybe the initial
+ state but that is atypical). No cleanup functions are registered.
+
+ Next states:
+ (D). Transition triggered by OWNER cleanup.
+
+ (D) Destroyed. No access nor notification is allowed.
+ Final state.
+
+ */
+struct svn_fs_x__id_context_t
+{
+ /* If this is NULL, FS_PATH points to the on-disk path to the file system
+ we need to re-open the FS. */
+ svn_fs_t *fs;
+
+ /* If FS is NULL, this points to the on-disk path to pass into svn_fs_open2
+ to reopen the filesystem. Allocated in OWNER. May only be NULL if FS
+ is not.*/
+ const char *fs_path;
+
+ /* If FS is NULL, this points to svn_fs_open() as passed to the library. */
+ svn_error_t *(*svn_fs_open_)(svn_fs_t **,
+ const char *,
+ apr_hash_t *,
+ apr_pool_t *,
+ apr_pool_t *);
+
+ /* Pool that this context struct got allocated in. */
+ apr_pool_t *owner;
+
+ /* A sub-pool of ONWER. We use this when querying data from FS. Gets
+ cleanup up immediately after usage. NULL until needed for the first
+ time. */
+ apr_pool_t *aux_pool;
+};
+
+/* Forward declaration. */
+static apr_status_t
+fs_cleanup(void *baton);
+
+/* APR pool cleanup notification for the svn_fs_x__id_context_t given as
+ BATON. Sent at state (A)->(D) transition. */
+static apr_status_t
+owner_cleanup(void *baton)
+{
+ svn_fs_x__id_context_t *context = baton;
+
+ /* Everything in CONTEXT gets cleaned up automatically.
+ However, we must prevent notifications from other pools. */
+ apr_pool_cleanup_kill(context->fs->pool, context, fs_cleanup);
+
+ return APR_SUCCESS;
+}
+
+/* APR pool cleanup notification for the svn_fs_x__id_context_t given as
+ BATON. Sent at state (A)->(B) transition. */
+static apr_status_t
+fs_cleanup(void *baton)
+{
+ svn_fs_x__id_context_t *context = baton;
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+
+ /* Remember the FS_PATH to potentially reopen and mark the FS as n/a. */
+ context->fs_path = apr_pstrdup(context->owner, context->fs->path);
+ context->svn_fs_open_ = ffd->svn_fs_open_;
+ context->fs = NULL;
+
+
+ /* No need for further notifications because from now on, everything is
+ allocated in OWNER. */
+ apr_pool_cleanup_kill(context->owner, context, owner_cleanup);
+
+ return APR_SUCCESS;
+}
+
+/* Return the filesystem provided by CONTEXT. Re-open it if necessary.
+ Returns NULL if the FS could not be opened. */
+static svn_fs_t *
+get_fs(svn_fs_x__id_context_t *context)
+{
+ if (!context->fs)
+ {
+ svn_error_t *err;
+
+ SVN_ERR_ASSERT_NO_RETURN(context->svn_fs_open_);
+
+ err = context->svn_fs_open_(&context->fs, context->fs_path, NULL,
+ context->owner, context->owner);
+ if (err)
+ {
+ svn_error_clear(err);
+ context->fs = NULL;
+ }
+ }
+
+ return context->fs;
+}
+
+/* Provide the auto-created auxiliary pool from ID's context object. */
+static apr_pool_t *
+get_aux_pool(const fs_x__id_t *id)
+{
+ svn_fs_x__id_context_t *context = id->generic_id.fsap_data;
+ if (!context->aux_pool)
+ context->aux_pool = svn_pool_create(context->owner);
+
+ return context->aux_pool;
+}
+
+/* Return the noderev structure identified by ID. Returns NULL for invalid
+ IDs or inaccessible repositories. The caller should clear the auxiliary
+ pool before returning to its respective caller. */
+static svn_fs_x__noderev_t *
+get_noderev(const fs_x__id_t *id)
+{
+ svn_fs_x__noderev_t *result = NULL;
+
+ svn_fs_x__id_context_t *context = id->generic_id.fsap_data;
+ svn_fs_t *fs = get_fs(context);
+ apr_pool_t *pool = get_aux_pool(id);
+
+ if (fs)
+ {
+ svn_error_t *err = svn_fs_x__get_node_revision(&result, fs,
+ &id->noderev_id,
+ pool, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ result = NULL;
+ }
+ }
+
+ return result;
+}
+
+
+
+/*** Implement v-table functions ***/
+
+/* Implement id_vtable_t.unparse */
+static svn_string_t *
+id_unparse(const svn_fs_id_t *fs_id,
+ apr_pool_t *result_pool)
+{
+ const fs_x__id_t *id = (const fs_x__id_t *)fs_id;
+ return svn_fs_x__id_unparse(&id->noderev_id, result_pool);
+}
+
+/* Implement id_vtable_t.compare.
+
+ The result is efficiently computed for matching IDs. The far less
+ meaningful "common ancestor" relationship has a larger latency when
+ evaluated first for a given context object. Subsequent calls are
+ moderately fast. */
+static svn_fs_node_relation_t
+id_compare(const svn_fs_id_t *a,
+ const svn_fs_id_t *b)
+{
+ const fs_x__id_t *id_a = (const fs_x__id_t *)a;
+ const fs_x__id_t *id_b = (const fs_x__id_t *)b;
+ svn_fs_x__noderev_t *noderev_a, *noderev_b;
+ svn_boolean_t same_node;
+
+ /* Quick check: same IDs? */
+ if (svn_fs_x__id_eq(&id_a->noderev_id, &id_b->noderev_id))
+ return svn_fs_node_unchanged;
+
+ /* Fetch the nodesrevs, compare the IDs of the nodes they belong to and
+ clean up any temporaries. If we can't find one of the noderevs, don't
+ get access to the FS etc., report the IDs as "unrelated" as only
+ valid / existing things may be related. */
+ noderev_a = get_noderev(id_a);
+ noderev_b = get_noderev(id_b);
+
+ if (noderev_a && noderev_b)
+ same_node = svn_fs_x__id_eq(&noderev_a->node_id, &noderev_b->node_id);
+ else
+ same_node = FALSE;
+
+ svn_pool_clear(get_aux_pool(id_a));
+ svn_pool_clear(get_aux_pool(id_b));
+
+ /* Return result. */
+ return same_node ? svn_fs_node_common_ancestor : svn_fs_node_unrelated;
+}
+
+
+/* Creating ID's. */
+
+static id_vtable_t id_vtable = {
+ id_unparse,
+ id_compare
+};
+
+svn_fs_x__id_context_t *
+svn_fs_x__id_create_context(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__id_context_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ result->fs = fs;
+ result->owner = result_pool;
+
+ /* Check for a special case:
+ If the owner of the context also owns the FS, there will be no reason
+ to notify them of the respective other's cleanup. */
+ if (result_pool != fs->pool)
+ {
+ /* If the context's owner gets cleaned up before FS, we must disconnect
+ from the FS. */
+ apr_pool_cleanup_register(result_pool,
+ result,
+ owner_cleanup,
+ apr_pool_cleanup_null);
+
+ /* If the FS gets cleaned up before the context's owner, disconnect
+ from the FS and remember its path on disk to be able to re-open it
+ later if necessary. */
+ apr_pool_cleanup_register(fs->pool,
+ result,
+ fs_cleanup,
+ apr_pool_cleanup_null);
+ }
+
+ return result;
+}
+
+svn_fs_id_t *
+svn_fs_x__id_create(svn_fs_x__id_context_t *context,
+ const svn_fs_x__id_t *noderev_id,
+ apr_pool_t *result_pool)
+{
+ fs_x__id_t *id;
+
+ /* Special case: NULL IDs */
+ if (!svn_fs_x__id_used(noderev_id))
+ return NULL;
+
+ /* In theory, the CONTEXT might not be owned by POOL. It's FS might even
+ have been closed. Make sure we have a context owned by POOL. */
+ if (context->owner != result_pool)
+ context = svn_fs_x__id_create_context(get_fs(context), result_pool);
+
+ /* Finally, construct the ID object. */
+ id = apr_pcalloc(result_pool, sizeof(*id));
+ id->noderev_id = *noderev_id;
+
+ id->generic_id.vtable = &id_vtable;
+ id->generic_id.fsap_data = context;
+
+ return (svn_fs_id_t *)id;
+}
diff --git a/subversion/libsvn_fs_x/fs_id.h b/subversion/libsvn_fs_x/fs_id.h
new file mode 100644
index 0000000..6d6a08a
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs_id.h
@@ -0,0 +1,62 @@
+/* fs_id.h : FSX's implementation of svn_fs_id_t
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_X_FS_ID_H
+#define SVN_LIBSVN_FS_X_FS_ID_H
+
+#include "id.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Transparent FS access object to be used with FSX's implementation for
+ svn_fs_id_t. It allows the ID object query data from the respective FS
+ to check for node relationships etc. It also allows to re-open the repo
+ after the original svn_fs_t object got cleaned up, i.e. the ID object's
+ functionality does not depend on any other object's lifetime.
+
+ For efficiency, multiple svn_fs_id_t should share the same context.
+ */
+typedef struct svn_fs_x__id_context_t svn_fs_x__id_context_t;
+
+/* Return a context object for filesystem FS; construct it in RESULT_POOL. */
+svn_fs_x__id_context_t *
+svn_fs_x__id_create_context(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Create a permanent ID based on NODEREV_ID, allocated in RESULT_POOL.
+ For complex requests, access the filesystem provided with CONTEXT.
+
+ For efficiency, CONTEXT should have been created in RESULT_POOL and be
+ shared between multiple ID instances allocated in the same pool.
+ */
+svn_fs_id_t *
+svn_fs_x__id_create(svn_fs_x__id_context_t *context,
+ const svn_fs_x__id_t *noderev_id,
+ apr_pool_t *result_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_X_FS_ID_H */
diff --git a/subversion/libsvn_fs_x/fs_x.c b/subversion/libsvn_fs_x/fs_x.c
new file mode 100644
index 0000000..b766b58
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs_x.c
@@ -0,0 +1,1228 @@
+/* fs_x.c --- filesystem operations specific to fs_x
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "fs_x.h"
+
+#include <apr_uuid.h>
+
+#include "svn_hash.h"
+#include "svn_props.h"
+#include "svn_time.h"
+#include "svn_dirent_uri.h"
+#include "svn_sorts.h"
+#include "svn_version.h"
+
+#include "cached_data.h"
+#include "id.h"
+#include "rep-cache.h"
+#include "revprops.h"
+#include "transaction.h"
+#include "tree.h"
+#include "util.h"
+#include "index.h"
+
+#include "private/svn_fs_util.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* The default maximum number of files per directory to store in the
+ rev and revprops directory. The number below is somewhat arbitrary,
+ and can be overridden by defining the macro while compiling; the
+ figure of 1000 is reasonable for VFAT filesystems, which are by far
+ the worst performers in this area. */
+#ifndef SVN_FS_X_DEFAULT_MAX_FILES_PER_DIR
+#define SVN_FS_X_DEFAULT_MAX_FILES_PER_DIR 1000
+#endif
+
+/* Begin deltification after a node history exceeded this this limit.
+ Useful values are 4 to 64 with 16 being a good compromise between
+ computational overhead and repository size savings.
+ Should be a power of 2.
+ Values < 2 will result in standard skip-delta behavior. */
+#define SVN_FS_X_MAX_LINEAR_DELTIFICATION 16
+
+/* Finding a deltification base takes operations proportional to the
+ number of changes being skipped. To prevent exploding runtime
+ during commits, limit the deltification range to this value.
+ Should be a power of 2 minus one.
+ Values < 1 disable deltification. */
+#define SVN_FS_X_MAX_DELTIFICATION_WALK 1023
+
+
+
+
+/* Check that BUF, a nul-terminated buffer of text from format file PATH,
+ contains only digits at OFFSET and beyond, raising an error if not.
+
+ Uses SCRATCH_POOL for temporary allocation. */
+static svn_error_t *
+check_format_file_buffer_numeric(const char *buf,
+ apr_off_t offset,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ return svn_fs_x__check_file_buffer_numeric(buf, offset, path, "Format",
+ scratch_pool);
+}
+
+/* Return the error SVN_ERR_FS_UNSUPPORTED_FORMAT if FS's format
+ number is not the same as a format number supported by this
+ Subversion. */
+static svn_error_t *
+check_format(int format)
+{
+ /* Put blacklisted versions here. */
+
+ /* We support all formats from 1-current simultaneously */
+ if (1 <= format && format <= SVN_FS_X__FORMAT_NUMBER)
+ return SVN_NO_ERROR;
+
+ return svn_error_createf(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
+ _("Expected FS format between '1' and '%d'; found format '%d'"),
+ SVN_FS_X__FORMAT_NUMBER, format);
+}
+
+/* Read the format file at PATH and set *PFORMAT to the format version found
+ * and *MAX_FILES_PER_DIR to the shard size. Use SCRATCH_POOL for temporary
+ * allocations. */
+static svn_error_t *
+read_format(int *pformat,
+ int *max_files_per_dir,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream;
+ svn_stringbuf_t *content;
+ svn_stringbuf_t *buf;
+ svn_boolean_t eos = FALSE;
+
+ SVN_ERR(svn_stringbuf_from_file2(&content, path, scratch_pool));
+ stream = svn_stream_from_stringbuf(content, scratch_pool);
+ SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eos, scratch_pool));
+ if (buf->len == 0 && eos)
+ {
+ /* Return a more useful error message. */
+ return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
+ _("Can't read first line of format file '%s'"),
+ svn_dirent_local_style(path, scratch_pool));
+ }
+
+ /* Check that the first line contains only digits. */
+ SVN_ERR(check_format_file_buffer_numeric(buf->data, 0, path, scratch_pool));
+ SVN_ERR(svn_cstring_atoi(pformat, buf->data));
+
+ /* Check that we support this format at all */
+ SVN_ERR(check_format(*pformat));
+
+ /* Read any options. */
+ SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eos, scratch_pool));
+ if (!eos && strncmp(buf->data, "layout sharded ", 15) == 0)
+ {
+ /* Check that the argument is numeric. */
+ SVN_ERR(check_format_file_buffer_numeric(buf->data, 15, path,
+ scratch_pool));
+ SVN_ERR(svn_cstring_atoi(max_files_per_dir, buf->data + 15));
+ }
+ else
+ return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
+ _("'%s' contains invalid filesystem format option '%s'"),
+ svn_dirent_local_style(path, scratch_pool), buf->data);
+
+ return SVN_NO_ERROR;
+}
+
+/* Write the format number and maximum number of files per directory
+ to a new format file in PATH, possibly expecting to overwrite a
+ previously existing file.
+
+ Use SCRATCH_POOL for temporary allocation. */
+svn_error_t *
+svn_fs_x__write_format(svn_fs_t *fs,
+ svn_boolean_t overwrite,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *sb;
+ const char *path = svn_fs_x__path_format(fs, scratch_pool);
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ SVN_ERR_ASSERT(1 <= ffd->format && ffd->format <= SVN_FS_X__FORMAT_NUMBER);
+
+ sb = svn_stringbuf_createf(scratch_pool, "%d\n", ffd->format);
+ svn_stringbuf_appendcstr(sb, apr_psprintf(scratch_pool,
+ "layout sharded %d\n",
+ ffd->max_files_per_dir));
+
+ /* svn_io_write_version_file() does a load of magic to allow it to
+ replace version files that already exist. We only need to do
+ that when we're allowed to overwrite an existing file. */
+ if (! overwrite)
+ {
+ /* Create the file */
+ SVN_ERR(svn_io_file_create(path, sb->data, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_io_write_atomic(path, sb->data, sb->len,
+ NULL /* copy_perms_path */, scratch_pool));
+ }
+
+ /* And set the perms to make it read only */
+ return svn_io_set_file_read_only(path, FALSE, scratch_pool);
+}
+
+/* Check that BLOCK_SIZE is a valid block / page size, i.e. it is within
+ * the range of what the current system may address in RAM and it is a
+ * power of 2. Assume that the element size within the block is ITEM_SIZE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+verify_block_size(apr_int64_t block_size,
+ apr_size_t item_size,
+ const char *name,
+ apr_pool_t *scratch_pool)
+{
+ /* Limit range. */
+ if (block_size <= 0)
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is too small for fsfs.conf setting '%s'."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ if (block_size > SVN_MAX_OBJECT_SIZE / item_size)
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is too large for fsfs.conf setting '%s'."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ /* Ensure it is a power of two.
+ * For positive X, X & (X-1) will reset the lowest bit set.
+ * If the result is 0, at most one bit has been set. */
+ if (0 != (block_size & (block_size - 1)))
+ return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+ _("%s is invalid for fsfs.conf setting '%s' "
+ "because it is not a power of 2."),
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ block_size),
+ name);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the configuration information of the file system at FS_PATH
+ * and set the respective values in FFD. Use pools as usual.
+ */
+static svn_error_t *
+read_config(svn_fs_x__data_t *ffd,
+ const char *fs_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_config_t *config;
+ apr_int64_t compression_level;
+
+ SVN_ERR(svn_config_read3(&config,
+ svn_dirent_join(fs_path, PATH_CONFIG, scratch_pool),
+ FALSE, FALSE, FALSE, scratch_pool));
+
+ /* Initialize ffd->rep_sharing_allowed. */
+ SVN_ERR(svn_config_get_bool(config, &ffd->rep_sharing_allowed,
+ CONFIG_SECTION_REP_SHARING,
+ CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
+
+ /* Initialize deltification settings in ffd. */
+ SVN_ERR(svn_config_get_int64(config, &ffd->max_deltification_walk,
+ CONFIG_SECTION_DELTIFICATION,
+ CONFIG_OPTION_MAX_DELTIFICATION_WALK,
+ SVN_FS_X_MAX_DELTIFICATION_WALK));
+ SVN_ERR(svn_config_get_int64(config, &ffd->max_linear_deltification,
+ CONFIG_SECTION_DELTIFICATION,
+ CONFIG_OPTION_MAX_LINEAR_DELTIFICATION,
+ SVN_FS_X_MAX_LINEAR_DELTIFICATION));
+ SVN_ERR(svn_config_get_int64(config, &compression_level,
+ CONFIG_SECTION_DELTIFICATION,
+ CONFIG_OPTION_COMPRESSION_LEVEL,
+ SVN_DELTA_COMPRESSION_LEVEL_DEFAULT));
+ ffd->delta_compression_level
+ = (int)MIN(MAX(SVN_DELTA_COMPRESSION_LEVEL_NONE, compression_level),
+ SVN_DELTA_COMPRESSION_LEVEL_MAX);
+
+ /* Initialize revprop packing settings in ffd. */
+ SVN_ERR(svn_config_get_bool(config, &ffd->compress_packed_revprops,
+ CONFIG_SECTION_PACKED_REVPROPS,
+ CONFIG_OPTION_COMPRESS_PACKED_REVPROPS,
+ TRUE));
+ SVN_ERR(svn_config_get_int64(config, &ffd->revprop_pack_size,
+ CONFIG_SECTION_PACKED_REVPROPS,
+ CONFIG_OPTION_REVPROP_PACK_SIZE,
+ ffd->compress_packed_revprops
+ ? 0x100
+ : 0x40));
+
+ ffd->revprop_pack_size *= 1024;
+
+ /* I/O settings in ffd. */
+ SVN_ERR(svn_config_get_int64(config, &ffd->block_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_BLOCK_SIZE,
+ 64));
+ SVN_ERR(svn_config_get_int64(config, &ffd->l2p_page_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_L2P_PAGE_SIZE,
+ 0x2000));
+ SVN_ERR(svn_config_get_int64(config, &ffd->p2l_page_size,
+ CONFIG_SECTION_IO,
+ CONFIG_OPTION_P2L_PAGE_SIZE,
+ 0x400));
+
+ /* Don't accept unreasonable or illegal values.
+ * Block size and P2L page size are in kbytes;
+ * L2P blocks are arrays of apr_off_t. */
+ SVN_ERR(verify_block_size(ffd->block_size, 0x400,
+ CONFIG_OPTION_BLOCK_SIZE, scratch_pool));
+ SVN_ERR(verify_block_size(ffd->p2l_page_size, 0x400,
+ CONFIG_OPTION_P2L_PAGE_SIZE, scratch_pool));
+ SVN_ERR(verify_block_size(ffd->l2p_page_size, sizeof(apr_off_t),
+ CONFIG_OPTION_L2P_PAGE_SIZE, scratch_pool));
+
+ /* convert kBytes to bytes */
+ ffd->block_size *= 0x400;
+ ffd->p2l_page_size *= 0x400;
+ /* L2P pages are in entries - not in (k)Bytes */
+
+ /* Debug options. */
+ SVN_ERR(svn_config_get_bool(config, &ffd->pack_after_commit,
+ CONFIG_SECTION_DEBUG,
+ CONFIG_OPTION_PACK_AFTER_COMMIT,
+ FALSE));
+
+ /* memcached configuration */
+ SVN_ERR(svn_cache__make_memcache_from_config(&ffd->memcache, config,
+ result_pool, scratch_pool));
+
+ SVN_ERR(svn_config_get_bool(config, &ffd->fail_stop,
+ CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
+ FALSE));
+
+ return SVN_NO_ERROR;
+}
+
+/* Write FS' initial configuration file.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+write_config(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+#define NL APR_EOL_STR
+ static const char * const fsx_conf_contents =
+"### This file controls the configuration of the FSX filesystem." NL
+"" NL
+"[" SVN_CACHE_CONFIG_CATEGORY_MEMCACHED_SERVERS "]" NL
+"### These options name memcached servers used to cache internal FSX" NL
+"### data. See http://www.danga.com/memcached/ for more information on" NL
+"### memcached. To use memcached with FSX, run one or more memcached" NL
+"### servers, and specify each of them as an option like so:" NL
+"# first-server = 127.0.0.1:11211" NL
+"# remote-memcached = mymemcached.corp.example.com:11212" NL
+"### The option name is ignored; the value is of the form HOST:PORT." NL
+"### memcached servers can be shared between multiple repositories;" NL
+"### however, if you do this, you *must* ensure that repositories have" NL
+"### distinct UUIDs and paths, or else cached data from one repository" NL
+"### might be used by another accidentally. Note also that memcached has" NL
+"### no authentication for reads or writes, so you must ensure that your" NL
+"### memcached servers are only accessible by trusted users." NL
+"" NL
+"[" CONFIG_SECTION_CACHES "]" NL
+"### When a cache-related error occurs, normally Subversion ignores it" NL
+"### and continues, logging an error if the server is appropriately" NL
+"### configured (and ignoring it with file:// access). To make" NL
+"### Subversion never ignore cache errors, uncomment this line." NL
+"# " CONFIG_OPTION_FAIL_STOP " = true" NL
+"" NL
+"[" CONFIG_SECTION_REP_SHARING "]" NL
+"### To conserve space, the filesystem can optionally avoid storing" NL
+"### duplicate representations. This comes at a slight cost in" NL
+"### performance, as maintaining a database of shared representations can" NL
+"### increase commit times. The space savings are dependent upon the size" NL
+"### of the repository, the number of objects it contains and the amount of" NL
+"### duplication between them, usually a function of the branching and" NL
+"### merging process." NL
+"###" NL
+"### The following parameter enables rep-sharing in the repository. It can" NL
+"### be switched on and off at will, but for best space-saving results" NL
+"### should be enabled consistently over the life of the repository." NL
+"### 'svnadmin verify' will check the rep-cache regardless of this setting." NL
+"### rep-sharing is enabled by default." NL
+"# " CONFIG_OPTION_ENABLE_REP_SHARING " = true" NL
+"" NL
+"[" CONFIG_SECTION_DELTIFICATION "]" NL
+"### To conserve space, the filesystem stores data as differences against" NL
+"### existing representations. This comes at a slight cost in performance," NL
+"### as calculating differences can increase commit times. Reading data" NL
+"### will also create higher CPU load and the data will be fragmented." NL
+"### Since deltification tends to save significant amounts of disk space," NL
+"### the overall I/O load can actually be lower." NL
+"###" NL
+"### The options in this section allow for tuning the deltification" NL
+"### strategy. Their effects on data size and server performance may vary" NL
+"### from one repository to another." NL
+"###" NL
+"### During commit, the server may need to walk the whole change history of" NL
+"### of a given node to find a suitable deltification base. This linear" NL
+"### process can impact commit times, svnadmin load and similar operations." NL
+"### This setting limits the depth of the deltification history. If the" NL
+"### threshold has been reached, the node will be stored as fulltext and a" NL
+"### new deltification history begins." NL
+"### Note, this is unrelated to svn log." NL
+"### Very large values rarely provide significant additional savings but" NL
+"### can impact performance greatly - in particular if directory" NL
+"### deltification has been activated. Very small values may be useful in" NL
+"### repositories that are dominated by large, changing binaries." NL
+"### Should be a power of two minus 1. A value of 0 will effectively" NL
+"### disable deltification." NL
+"### For 1.9, the default value is 1023." NL
+"# " CONFIG_OPTION_MAX_DELTIFICATION_WALK " = 1023" NL
+"###" NL
+"### The skip-delta scheme used by FSX tends to repeatably store redundant" NL
+"### delta information where a simple delta against the latest version is" NL
+"### often smaller. By default, 1.9+ will therefore use skip deltas only" NL
+"### after the linear chain of deltas has grown beyond the threshold" NL
+"### specified by this setting." NL
+"### Values up to 64 can result in some reduction in repository size for" NL
+"### the cost of quickly increasing I/O and CPU costs. Similarly, smaller" NL
+"### numbers can reduce those costs at the cost of more disk space. For" NL
+"### rarely read repositories or those containing larger binaries, this may" NL
+"### present a better trade-off." NL
+"### Should be a power of two. A value of 1 or smaller will cause the" NL
+"### exclusive use of skip-deltas." NL
+"### For 1.8, the default value is 16." NL
+"# " CONFIG_OPTION_MAX_LINEAR_DELTIFICATION " = 16" NL
+"###" NL
+"### After deltification, we compress the data through zlib to minimize on-" NL
+"### disk size. That can be an expensive and ineffective process. This" NL
+"### setting controls the usage of zlib in future revisions." NL
+"### Revisions with highly compressible data in them may shrink in size" NL
+"### if the setting is increased but may take much longer to commit. The" NL
+"### time taken to uncompress that data again is widely independent of the" NL
+"### compression level." NL
+"### Compression will be ineffective if the incoming content is already" NL
+"### highly compressed. In that case, disabling the compression entirely" NL
+"### will speed up commits as well as reading the data. Repositories with" NL
+"### many small compressible files (source code) but also a high percentage" NL
+"### of large incompressible ones (artwork) may benefit from compression" NL
+"### levels lowered to e.g. 1." NL
+"### Valid values are 0 to 9 with 9 providing the highest compression ratio" NL
+"### and 0 disabling it altogether." NL
+"### The default value is 5." NL
+"# " CONFIG_OPTION_COMPRESSION_LEVEL " = 5" NL
+"" NL
+"[" CONFIG_SECTION_PACKED_REVPROPS "]" NL
+"### This parameter controls the size (in kBytes) of packed revprop files." NL
+"### Revprops of consecutive revisions will be concatenated into a single" NL
+"### file up to but not exceeding the threshold given here. However, each" NL
+"### pack file may be much smaller and revprops of a single revision may be" NL
+"### much larger than the limit set here. The threshold will be applied" NL
+"### before optional compression takes place." NL
+"### Large values will reduce disk space usage at the expense of increased" NL
+"### latency and CPU usage reading and changing individual revprops. They" NL
+"### become an advantage when revprop caching has been enabled because a" NL
+"### lot of data can be read in one go. Values smaller than 4 kByte will" NL
+"### not improve latency any further and quickly render revprop packing" NL
+"### ineffective." NL
+"### revprop-pack-size is 64 kBytes by default for non-compressed revprop" NL
+"### pack files and 256 kBytes when compression has been enabled." NL
+"# " CONFIG_OPTION_REVPROP_PACK_SIZE " = 64" NL
+"###" NL
+"### To save disk space, packed revprop files may be compressed. Standard" NL
+"### revprops tend to allow for very effective compression. Reading and" NL
+"### even more so writing, become significantly more CPU intensive. With" NL
+"### revprop caching enabled, the overhead can be offset by reduced I/O" NL
+"### unless you often modify revprops after packing." NL
+"### Compressing packed revprops is enabled by default." NL
+"# " CONFIG_OPTION_COMPRESS_PACKED_REVPROPS " = true" NL
+"" NL
+"[" CONFIG_SECTION_IO "]" NL
+"### Parameters in this section control the data access granularity in" NL
+"### format 7 repositories and later. The defaults should translate into" NL
+"### decent performance over a wide range of setups." NL
+"###" NL
+"### When a specific piece of information needs to be read from disk, a" NL
+"### data block is being read at once and its contents are being cached." NL
+"### If the repository is being stored on a RAID, the block size should be" NL
+"### either 50% or 100% of RAID block size / granularity. Also, your file" NL
+"### system blocks/clusters should be properly aligned and sized. In that" NL
+"### setup, each access will hit only one disk (minimizes I/O load) but" NL
+"### uses all the data provided by the disk in a single access." NL
+"### For SSD-based storage systems, slightly lower values around 16 kB" NL
+"### may improve latency while still maximizing throughput." NL
+"### Can be changed at any time but must be a power of 2." NL
+"### block-size is given in kBytes and with a default of 64 kBytes." NL
+"# " CONFIG_OPTION_BLOCK_SIZE " = 64" NL
+"###" NL
+"### The log-to-phys index maps data item numbers to offsets within the" NL
+"### rev or pack file. This index is organized in pages of a fixed maximum" NL
+"### capacity. To access an item, the page table and the respective page" NL
+"### must be read." NL
+"### This parameter only affects revisions with thousands of changed paths." NL
+"### If you have several extremely large revisions (~1 mio changes), think" NL
+"### about increasing this setting. Reducing the value will rarely result" NL
+"### in a net speedup." NL
+"### This is an expert setting. Must be a power of 2." NL
+"### l2p-page-size is 8192 entries by default." NL
+"# " CONFIG_OPTION_L2P_PAGE_SIZE " = 8192" NL
+"###" NL
+"### The phys-to-log index maps positions within the rev or pack file to" NL
+"### to data items, i.e. describes what piece of information is being" NL
+"### stored at any particular offset. The index describes the rev file" NL
+"### in chunks (pages) and keeps a global list of all those pages. Large" NL
+"### pages mean a shorter page table but a larger per-page description of" NL
+"### data items in it. The latency sweet spot depends on the change size" NL
+"### distribution but covers a relatively wide range." NL
+"### If the repository contains very large files, i.e. individual changes" NL
+"### of tens of MB each, increasing the page size will shorten the index" NL
+"### file at the expense of a slightly increased latency in sections with" NL
+"### smaller changes." NL
+"### For source code repositories, this should be about 16x the block-size." NL
+"### Must be a power of 2." NL
+"### p2l-page-size is given in kBytes and with a default of 1024 kBytes." NL
+"# " CONFIG_OPTION_P2L_PAGE_SIZE " = 1024" NL
+;
+#undef NL
+ return svn_io_file_create(svn_dirent_join(fs->path, PATH_CONFIG,
+ scratch_pool),
+ fsx_conf_contents, scratch_pool);
+}
+
+/* Read FS's UUID file and store the data in the FS struct. */
+static svn_error_t *
+read_uuid(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_file_t *uuid_file;
+ char buf[APR_UUID_FORMATTED_LENGTH + 2];
+ apr_size_t limit;
+
+ /* Read the repository uuid. */
+ SVN_ERR(svn_io_file_open(&uuid_file, svn_fs_x__path_uuid(fs, scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ limit = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit, scratch_pool));
+ fs->uuid = apr_pstrdup(fs->pool, buf);
+
+ /* Read the instance ID. */
+ limit = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(uuid_file, buf, &limit,
+ scratch_pool));
+ ffd->instance_id = apr_pstrdup(fs->pool, buf);
+
+ SVN_ERR(svn_io_file_close(uuid_file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_format_file(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ int format, max_files_per_dir;
+
+ /* Read info from format file. */
+ SVN_ERR(read_format(&format, &max_files_per_dir,
+ svn_fs_x__path_format(fs, scratch_pool), scratch_pool));
+
+ /* Now that we've got *all* info, store / update values in FFD. */
+ ffd->format = format;
+ ffd->max_files_per_dir = max_files_per_dir;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__open(svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ fs->path = apr_pstrdup(fs->pool, path);
+
+ /* Read the FS format file. */
+ SVN_ERR(svn_fs_x__read_format_file(fs, scratch_pool));
+
+ /* Read in and cache the repository uuid. */
+ SVN_ERR(read_uuid(fs, scratch_pool));
+
+ /* Read the min unpacked revision. */
+ SVN_ERR(svn_fs_x__update_min_unpacked_rev(fs, scratch_pool));
+
+ /* Read the configuration file. */
+ SVN_ERR(read_config(ffd, fs->path, fs->pool, scratch_pool));
+
+ return svn_error_trace(svn_fs_x__read_current(&ffd->youngest_rev_cache,
+ fs, scratch_pool));
+}
+
+/* Baton type bridging svn_fs_x__upgrade and upgrade_body carrying
+ * parameters over between them. */
+typedef struct upgrade_baton_t
+{
+ svn_fs_t *fs;
+ svn_fs_upgrade_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+} upgrade_baton_t;
+
+/* Upgrade the FS given in upgrade_baton_t *)BATON to the latest format
+ * version. Apply options an invoke callback from that BATON.
+ * Temporary allocations are to be made from SCRATCH_POOL.
+ *
+ * At the moment, this is a simple placeholder as we don't support upgrades
+ * from experimental FSX versions.
+ */
+static svn_error_t *
+upgrade_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ upgrade_baton_t *upgrade_baton = baton;
+ svn_fs_t *fs = upgrade_baton->fs;
+ int format, max_files_per_dir;
+ const char *format_path = svn_fs_x__path_format(fs, scratch_pool);
+
+ /* Read the FS format number and max-files-per-dir setting. */
+ SVN_ERR(read_format(&format, &max_files_per_dir, format_path,
+ scratch_pool));
+
+ /* If we're already up-to-date, there's nothing else to be done here. */
+ if (format == SVN_FS_X__FORMAT_NUMBER)
+ return SVN_NO_ERROR;
+
+ /* Done */
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__upgrade(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ upgrade_baton_t baton;
+ baton.fs = fs;
+ baton.notify_func = notify_func;
+ baton.notify_baton = notify_baton;
+ baton.cancel_func = cancel_func;
+ baton.cancel_baton = cancel_baton;
+
+ return svn_fs_x__with_all_locks(fs, upgrade_body, (void *)&baton,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__youngest_rev(svn_revnum_t *youngest_p,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ SVN_ERR(svn_fs_x__read_current(youngest_p, fs, scratch_pool));
+ ffd->youngest_rev_cache = *youngest_p;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__ensure_revision_exists(svn_revnum_t rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ if (! SVN_IS_VALID_REVNUM(rev))
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("Invalid revision number '%ld'"), rev);
+
+
+ /* Did the revision exist the last time we checked the current
+ file? */
+ if (rev <= ffd->youngest_rev_cache)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_x__read_current(&ffd->youngest_rev_cache, fs, scratch_pool));
+
+ /* Check again. */
+ if (rev <= ffd->youngest_rev_cache)
+ return SVN_NO_ERROR;
+
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"), rev);
+}
+
+
+svn_error_t *
+svn_fs_x__file_length(svn_filesize_t *length,
+ svn_fs_x__noderev_t *noderev)
+{
+ if (noderev->data_rep)
+ *length = noderev->data_rep->expanded_size;
+ else
+ *length = 0;
+
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_fs_x__file_text_rep_equal(svn_fs_x__representation_t *a,
+ svn_fs_x__representation_t *b)
+{
+ svn_boolean_t a_empty = a == NULL || a->expanded_size == 0;
+ svn_boolean_t b_empty = b == NULL || b->expanded_size == 0;
+
+ /* This makes sure that neither rep will be NULL later on */
+ if (a_empty && b_empty)
+ return TRUE;
+
+ if (a_empty != b_empty)
+ return FALSE;
+
+ /* Same physical representation? Note that these IDs are always up-to-date
+ instead of e.g. being set lazily. */
+ if (svn_fs_x__id_eq(&a->id, &b->id))
+ return TRUE;
+
+ /* Contents are equal if the checksums match. These are also always known.
+ */
+ return memcmp(a->md5_digest, b->md5_digest, sizeof(a->md5_digest)) == 0
+ && memcmp(a->sha1_digest, b->sha1_digest, sizeof(a->sha1_digest)) == 0;
+}
+
+svn_error_t *
+svn_fs_x__prop_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *a,
+ svn_fs_x__noderev_t *b,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_t *rep_a = a->prop_rep;
+ svn_fs_x__representation_t *rep_b = b->prop_rep;
+ apr_hash_t *proplist_a;
+ apr_hash_t *proplist_b;
+
+ /* Mainly for a==b==NULL */
+ if (rep_a == rep_b)
+ {
+ *equal = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Committed property lists can be compared quickly */
+ if ( rep_a && rep_b
+ && svn_fs_x__is_revision(rep_a->id.change_set)
+ && svn_fs_x__is_revision(rep_b->id.change_set))
+ {
+ /* MD5 must be given. Having the same checksum is good enough for
+ accepting the prop lists as equal. */
+ *equal = memcmp(rep_a->md5_digest, rep_b->md5_digest,
+ sizeof(rep_a->md5_digest)) == 0;
+ return SVN_NO_ERROR;
+ }
+
+ /* Same path in same txn? */
+ if (svn_fs_x__id_eq(&a->noderev_id, &b->noderev_id))
+ {
+ *equal = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Skip the expensive bits unless we are in strict mode.
+ Simply assume that there is a different. */
+ if (!strict)
+ {
+ *equal = FALSE;
+ return SVN_NO_ERROR;
+ }
+
+ /* At least one of the reps has been modified in a txn.
+ Fetch and compare them. */
+ SVN_ERR(svn_fs_x__get_proplist(&proplist_a, fs, a, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__get_proplist(&proplist_b, fs, b, scratch_pool,
+ scratch_pool));
+
+ *equal = svn_fs__prop_lists_equal(proplist_a, proplist_b, scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__file_checksum(svn_checksum_t **checksum,
+ svn_fs_x__noderev_t *noderev,
+ svn_checksum_kind_t kind,
+ apr_pool_t *result_pool)
+{
+ *checksum = NULL;
+
+ if (noderev->data_rep)
+ {
+ svn_checksum_t temp;
+ temp.kind = kind;
+
+ switch(kind)
+ {
+ case svn_checksum_md5:
+ temp.digest = noderev->data_rep->md5_digest;
+ break;
+
+ case svn_checksum_sha1:
+ if (! noderev->data_rep->has_sha1)
+ return SVN_NO_ERROR;
+
+ temp.digest = noderev->data_rep->sha1_digest;
+ break;
+
+ default:
+ return SVN_NO_ERROR;
+ }
+
+ *checksum = svn_checksum_dup(&temp, result_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_fs_x__representation_t *
+svn_fs_x__rep_copy(svn_fs_x__representation_t *rep,
+ apr_pool_t *result_pool)
+{
+ if (rep == NULL)
+ return NULL;
+
+ return apr_pmemdup(result_pool, rep, sizeof(*rep));
+}
+
+
+/* Write out the zeroth revision for filesystem FS.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+write_revision_zero(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ /* Use an explicit sub-pool to have full control over temp file lifetimes.
+ * Since we have it, use it for everything else as well. */
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+ const char *path_revision_zero = svn_fs_x__path_rev(fs, 0, subpool);
+ apr_hash_t *proplist;
+ svn_string_t date;
+
+ apr_array_header_t *index_entries;
+ svn_fs_x__p2l_entry_t *entry;
+ svn_fs_x__revision_file_t *rev_file;
+ const char *l2p_proto_index, *p2l_proto_index;
+
+ /* Construct a skeleton r0 with no indexes. */
+ svn_string_t *noderev_str = svn_string_create("id: 2+0\n"
+ "node: 0+0\n"
+ "copy: 0+0\n"
+ "type: dir\n"
+ "count: 0\n"
+ "cpath: /\n"
+ "\n",
+ subpool);
+ svn_string_t *changes_str = svn_string_create("\n",
+ subpool);
+ svn_string_t *r0 = svn_string_createf(subpool, "%s%s",
+ noderev_str->data,
+ changes_str->data);
+
+ /* Write skeleton r0 to disk. */
+ SVN_ERR(svn_io_file_create(path_revision_zero, r0->data, subpool));
+
+ /* Construct the index P2L contents: describe the 2 items we have.
+ Be sure to create them in on-disk order. */
+ index_entries = apr_array_make(subpool, 2, sizeof(entry));
+
+ entry = apr_pcalloc(subpool, sizeof(*entry));
+ entry->offset = 0;
+ entry->size = (apr_off_t)noderev_str->len;
+ entry->type = SVN_FS_X__ITEM_TYPE_NODEREV;
+ entry->item_count = 1;
+ entry->items = apr_pcalloc(subpool, sizeof(*entry->items));
+ entry->items[0].change_set = 0;
+ entry->items[0].number = SVN_FS_X__ITEM_INDEX_ROOT_NODE;
+ APR_ARRAY_PUSH(index_entries, svn_fs_x__p2l_entry_t *) = entry;
+
+ entry = apr_pcalloc(subpool, sizeof(*entry));
+ entry->offset = (apr_off_t)noderev_str->len;
+ entry->size = (apr_off_t)changes_str->len;
+ entry->type = SVN_FS_X__ITEM_TYPE_CHANGES;
+ entry->item_count = 1;
+ entry->items = apr_pcalloc(subpool, sizeof(*entry->items));
+ entry->items[0].change_set = 0;
+ entry->items[0].number = SVN_FS_X__ITEM_INDEX_CHANGES;
+ APR_ARRAY_PUSH(index_entries, svn_fs_x__p2l_entry_t *) = entry;
+
+ /* Now re-open r0, create proto-index files from our entries and
+ rewrite the index section of r0. */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file_writable(&rev_file, fs, 0,
+ subpool, subpool));
+ SVN_ERR(svn_fs_x__p2l_index_from_p2l_entries(&p2l_proto_index, fs,
+ rev_file, index_entries,
+ subpool, subpool));
+ SVN_ERR(svn_fs_x__l2p_index_from_p2l_entries(&l2p_proto_index, fs,
+ index_entries,
+ subpool, subpool));
+ SVN_ERR(svn_fs_x__add_index_data(fs, rev_file->file, l2p_proto_index,
+ p2l_proto_index, 0, subpool));
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+
+ SVN_ERR(svn_io_set_file_read_only(path_revision_zero, FALSE, fs->pool));
+
+ /* Set a date on revision 0. */
+ date.data = svn_time_to_cstring(apr_time_now(), fs->pool);
+ date.len = strlen(date.data);
+ proplist = apr_hash_make(fs->pool);
+ svn_hash_sets(proplist, SVN_PROP_REVISION_DATE, &date);
+ return svn_fs_x__set_revision_proplist(fs, 0, proplist, fs->pool);
+}
+
+svn_error_t *
+svn_fs_x__create_file_tree(svn_fs_t *fs,
+ const char *path,
+ int format,
+ int shard_size,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ fs->path = apr_pstrdup(fs->pool, path);
+ ffd->format = format;
+
+ /* Use an appropriate sharding mode if supported by the format. */
+ ffd->max_files_per_dir = shard_size;
+
+ /* Create the revision data directories. */
+ SVN_ERR(svn_io_make_dir_recursively(
+ svn_fs_x__path_rev_shard(fs, 0, scratch_pool),
+ scratch_pool));
+
+ /* Create the revprops directory. */
+ SVN_ERR(svn_io_make_dir_recursively(
+ svn_fs_x__path_revprops_shard(fs, 0, scratch_pool),
+ scratch_pool));
+
+ /* Create the transaction directory. */
+ SVN_ERR(svn_io_make_dir_recursively(
+ svn_fs_x__path_txns_dir(fs, scratch_pool),
+ scratch_pool));
+
+ /* Create the protorevs directory. */
+ SVN_ERR(svn_io_make_dir_recursively(
+ svn_fs_x__path_txn_proto_revs(fs, scratch_pool),
+ scratch_pool));
+
+ /* Create the 'current' file. */
+ SVN_ERR(svn_io_file_create_empty(svn_fs_x__path_current(fs, scratch_pool),
+ scratch_pool));
+ SVN_ERR(svn_fs_x__write_current(fs, 0, scratch_pool));
+
+ /* Create the 'uuid' file. */
+ SVN_ERR(svn_io_file_create_empty(svn_fs_x__path_lock(fs, scratch_pool),
+ scratch_pool));
+ SVN_ERR(svn_fs_x__set_uuid(fs, NULL, NULL, scratch_pool));
+
+ /* Create the fsfs.conf file. */
+ SVN_ERR(write_config(fs, scratch_pool));
+ SVN_ERR(read_config(ffd, fs->path, fs->pool, scratch_pool));
+
+ /* Add revision 0. */
+ SVN_ERR(write_revision_zero(fs, scratch_pool));
+
+ /* Create the min unpacked rev file. */
+ SVN_ERR(svn_io_file_create(
+ svn_fs_x__path_min_unpacked_rev(fs, scratch_pool),
+ "0\n", scratch_pool));
+
+ /* Create the txn-current file if the repository supports
+ the transaction sequence file. */
+ SVN_ERR(svn_io_file_create(svn_fs_x__path_txn_current(fs, scratch_pool),
+ "0\n", scratch_pool));
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_x__path_txn_current_lock(fs, scratch_pool),
+ scratch_pool));
+
+ /* Initialize the revprop caching info. */
+ SVN_ERR(svn_fs_x__reset_revprop_generation_file(fs, scratch_pool));
+
+ ffd->youngest_rev_cache = 0;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__create(svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ int format = SVN_FS_X__FORMAT_NUMBER;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ fs->path = apr_pstrdup(fs->pool, path);
+ /* See if compatibility with older versions was explicitly requested. */
+ if (fs->config)
+ {
+ svn_version_t *compatible_version;
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, fs->config,
+ scratch_pool));
+
+ /* select format number */
+ switch(compatible_version->minor)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8: return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
+ _("FSX is not compatible with Subversion prior to 1.9"));
+
+ default:format = SVN_FS_X__FORMAT_NUMBER;
+ }
+ }
+
+ /* Actual FS creation. */
+ SVN_ERR(svn_fs_x__create_file_tree(fs, path, format,
+ SVN_FS_X_DEFAULT_MAX_FILES_PER_DIR,
+ scratch_pool));
+
+ /* This filesystem is ready. Stamp it with a format number. */
+ SVN_ERR(svn_fs_x__write_format(fs, FALSE, scratch_pool));
+
+ ffd->youngest_rev_cache = 0;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__set_uuid(svn_fs_t *fs,
+ const char *uuid,
+ const char *instance_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *uuid_path = svn_fs_x__path_uuid(fs, scratch_pool);
+ svn_stringbuf_t *contents = svn_stringbuf_create_empty(scratch_pool);
+
+ if (! uuid)
+ uuid = svn_uuid_generate(scratch_pool);
+
+ if (! instance_id)
+ instance_id = svn_uuid_generate(scratch_pool);
+
+ svn_stringbuf_appendcstr(contents, uuid);
+ svn_stringbuf_appendcstr(contents, "\n");
+ svn_stringbuf_appendcstr(contents, instance_id);
+ svn_stringbuf_appendcstr(contents, "\n");
+
+ /* We use the permissions of the 'current' file, because the 'uuid'
+ file does not exist during repository creation. */
+ SVN_ERR(svn_io_write_atomic(uuid_path, contents->data, contents->len,
+ /* perms */
+ svn_fs_x__path_current(fs, scratch_pool),
+ scratch_pool));
+
+ fs->uuid = apr_pstrdup(fs->pool, uuid);
+ ffd->instance_id = apr_pstrdup(fs->pool, instance_id);
+
+ return SVN_NO_ERROR;
+}
+
+/** Node origin lazy cache. */
+
+/* If directory PATH does not exist, create it and give it the same
+ permissions as FS_path.*/
+svn_error_t *
+svn_fs_x__ensure_dir_exists(const char *path,
+ const char *fs_path,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = svn_io_dir_make(path, APR_OS_DEFAULT, scratch_pool);
+ if (err && APR_STATUS_IS_EEXIST(err->apr_err))
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ SVN_ERR(err);
+
+ /* We successfully created a new directory. Dup the permissions
+ from FS->path. */
+ return svn_io_copy_perms(fs_path, path, scratch_pool);
+}
+
+
+/*** Revisions ***/
+
+svn_error_t *
+svn_fs_x__revision_prop(svn_string_t **value_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *propname,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *table;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_x__get_revision_proplist(&table, fs, rev, FALSE,
+ scratch_pool, scratch_pool));
+
+ *value_p = svn_string_dup(svn_hash_gets(table, propname), result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Baton used for change_rev_prop_body below. */
+typedef struct change_rev_prop_baton_t {
+ svn_fs_t *fs;
+ svn_revnum_t rev;
+ const char *name;
+ const svn_string_t *const *old_value_p;
+ const svn_string_t *value;
+} change_rev_prop_baton_t;
+
+/* The work-horse for svn_fs_x__change_rev_prop, called with the FS
+ write lock. This implements the svn_fs_x__with_write_lock()
+ 'body' callback type. BATON is a 'change_rev_prop_baton_t *'. */
+static svn_error_t *
+change_rev_prop_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ change_rev_prop_baton_t *cb = baton;
+ apr_hash_t *table;
+
+ /* Read current revprop values from disk (never from cache).
+ Even if somehow the cache got out of sync, we want to make sure that
+ we read, update and write up-to-date data. */
+ SVN_ERR(svn_fs_x__get_revision_proplist(&table, cb->fs, cb->rev, TRUE,
+ scratch_pool, scratch_pool));
+
+ if (cb->old_value_p)
+ {
+ const svn_string_t *wanted_value = *cb->old_value_p;
+ const svn_string_t *present_value = svn_hash_gets(table, cb->name);
+ if ((!wanted_value != !present_value)
+ || (wanted_value && present_value
+ && !svn_string_compare(wanted_value, present_value)))
+ {
+ /* What we expected isn't what we found. */
+ return svn_error_createf(SVN_ERR_FS_PROP_BASEVALUE_MISMATCH, NULL,
+ _("revprop '%s' has unexpected value in "
+ "filesystem"),
+ cb->name);
+ }
+ /* Fall through. */
+ }
+ svn_hash_sets(table, cb->name, cb->value);
+
+ return svn_fs_x__set_revision_proplist(cb->fs, cb->rev, table,
+ scratch_pool);
+}
+
+svn_error_t *
+svn_fs_x__change_rev_prop(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *name,
+ const svn_string_t *const *old_value_p,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ change_rev_prop_baton_t cb;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ cb.fs = fs;
+ cb.rev = rev;
+ cb.name = name;
+ cb.old_value_p = old_value_p;
+ cb.value = value;
+
+ return svn_fs_x__with_write_lock(fs, change_rev_prop_body, &cb,
+ scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__info_format(int *fs_format,
+ svn_version_t **supports_version,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ *fs_format = ffd->format;
+ *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+ (*supports_version)->major = SVN_VER_MAJOR;
+ (*supports_version)->minor = 9;
+ (*supports_version)->patch = 0;
+ (*supports_version)->tag = "";
+
+ switch (ffd->format)
+ {
+ case 1:
+ break;
+#ifdef SVN_DEBUG
+# if SVN_FS_X__FORMAT_NUMBER != 1
+# error "Need to add a 'case' statement here"
+# endif
+#endif
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *files = apr_array_make(result_pool, 1, sizeof(const char *));
+ APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path, PATH_CONFIG,
+ result_pool);
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/fs_x.h b/subversion/libsvn_fs_x/fs_x.h
new file mode 100644
index 0000000..98be702
--- /dev/null
+++ b/subversion/libsvn_fs_x/fs_x.h
@@ -0,0 +1,202 @@
+/* fs_x.h : interface to the native filesystem layer
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__FS_X_H
+#define SVN_LIBSVN_FS__FS_X_H
+
+#include "fs.h"
+
+/* Read the 'format' file of fsx filesystem FS and store its info in FS.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__read_format_file(svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Open the fsx filesystem pointed to by PATH and associate it with
+ filesystem object FS. Use SCRATCH_POOL for temporary allocations.
+
+ ### Some parts of *FS must have been initialized beforehand; some parts
+ (including FS->path) are initialized by this function. */
+svn_error_t *
+svn_fs_x__open(svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *scratch_pool);
+
+/* Upgrade the fsx filesystem FS. Indicate progress via the optional
+ * NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC
+ * will periodically be called with CANCEL_BATON to allow for preemption.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__upgrade(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* Set *YOUNGEST to the youngest revision in filesystem FS. Do any
+ temporary allocation in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__youngest_rev(svn_revnum_t *youngest,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Return SVN_ERR_FS_NO_SUCH_REVISION if the given revision REV is newer
+ than the current youngest revision in FS or is simply not a valid
+ revision number, else return success. Use SCRATCH_POOL for temporary
+ allocations. */
+svn_error_t *
+svn_fs_x__ensure_revision_exists(svn_revnum_t rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Set *LENGTH to the be fulltext length of the node revision
+ specified by NODEREV. */
+svn_error_t *
+svn_fs_x__file_length(svn_filesize_t *length,
+ svn_fs_x__noderev_t *noderev);
+
+/* Return TRUE if the representations in A and B have equal contents, else
+ return FALSE. */
+svn_boolean_t
+svn_fs_x__file_text_rep_equal(svn_fs_x__representation_t *a,
+ svn_fs_x__representation_t *b);
+
+/* Set *EQUAL to TRUE if the property representations in A and B within FS
+ have equal contents, else set it to FALSE. If STRICT is not set, allow
+ for false negatives.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__prop_rep_equal(svn_boolean_t *equal,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *a,
+ svn_fs_x__noderev_t *b,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool);
+
+
+/* Return a copy of the representation REP allocated from RESULT_POOL. */
+svn_fs_x__representation_t *
+svn_fs_x__rep_copy(svn_fs_x__representation_t *rep,
+ apr_pool_t *result_pool);
+
+
+/* Return the recorded checksum of type KIND for the text representation
+ of NODREV into CHECKSUM, allocating from RESULT_POOL. If no stored
+ checksum is available, put all NULL into CHECKSUM. */
+svn_error_t *
+svn_fs_x__file_checksum(svn_checksum_t **checksum,
+ svn_fs_x__noderev_t *noderev,
+ svn_checksum_kind_t kind,
+ apr_pool_t *result_pool);
+
+/* Under the repository db PATH, create a FSFS repository with FORMAT,
+ * the given SHARD_SIZE. If not supported by the respective format,
+ * the latter two parameters will be ignored. FS will be updated.
+ *
+ * The only file not being written is the 'format' file. This allows
+ * callers such as hotcopy to modify the contents before turning the
+ * tree into an accessible repository.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__create_file_tree(svn_fs_t *fs,
+ const char *path,
+ int format,
+ int shard_size,
+ apr_pool_t *scratch_pool);
+
+/* Create a fs_x fileysystem referenced by FS at path PATH. Get any
+ temporary allocations from SCRATCH_POOL.
+
+ ### Some parts of *FS must have been initialized beforehand; some parts
+ (including FS->path) are initialized by this function. */
+svn_error_t *
+svn_fs_x__create(svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *scratch_pool);
+
+/* Set the uuid of repository FS to UUID and the instance ID to INSTANCE_ID.
+ If any of them is NULL, use a newly generated UUID / ID instead.
+ Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__set_uuid(svn_fs_t *fs,
+ const char *uuid,
+ const char *instance_id,
+ apr_pool_t *scratch_pool);
+
+/* Read the format number and maximum number of files per directory
+ from PATH and return them in *PFORMAT and *MAX_FILES_PER_DIR
+ respectively.
+
+ *MAX_FILES_PER_DIR is obtained from the 'layout' format option, and
+ will be set to zero if a linear scheme should be used.
+
+ Use SCRATCH_POOL for temporary allocation. */
+svn_error_t *
+svn_fs_x__write_format(svn_fs_t *fs,
+ svn_boolean_t overwrite,
+ apr_pool_t *scratch_pool);
+
+/* Find the value of the property named PROPNAME in transaction REV.
+ Return the contents in *VALUE_P, allocated from RESULT_POOL.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__revision_prop(svn_string_t **value_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *propname,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Change, add, or delete a property on a revision REV in filesystem
+ FS. NAME gives the name of the property, and value, if non-NULL,
+ gives the new contents of the property. If value is NULL, then the
+ property will be deleted. If OLD_VALUE_P is not NULL, do nothing unless
+ the preexisting value is *OLD_VALUE_P.
+ Do any temporary allocation in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__change_rev_prop(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *name,
+ const svn_string_t *const *old_value_p,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool);
+
+/* If directory PATH does not exist, create it and give it the same
+ permissions as FS_PATH. Do any temporary allocation in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__ensure_dir_exists(const char *path,
+ const char *fs_path,
+ apr_pool_t *scratch_pool);
+
+/* Initialize all session-local caches in FS according to the global
+ cache settings. Use SCRATCH_POOL for temporary allocations.
+
+ Please note that it is permissible for this function to set some
+ or all of these caches to NULL, regardless of any setting. */
+svn_error_t *
+svn_fs_x__initialize_caches(svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/hotcopy.c b/subversion/libsvn_fs_x/hotcopy.c
new file mode 100644
index 0000000..c9f0af2
--- /dev/null
+++ b/subversion/libsvn_fs_x/hotcopy.c
@@ -0,0 +1,991 @@
+/* hotcopys.c --- FS hotcopy functionality for FSX
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+#include "svn_pools.h"
+#include "svn_path.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_x.h"
+#include "hotcopy.h"
+#include "util.h"
+#include "revprops.h"
+#include "rep-cache.h"
+#include "transaction.h"
+#include "recovery.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Like svn_io_dir_file_copy(), but doesn't copy files that exist at
+ * the destination and do not differ in terms of kind, size, and mtime.
+ * Set *SKIPPED_P to FALSE only if the file was copied, do not change
+ * the value in *SKIPPED_P otherwise. SKIPPED_P may be NULL if not
+ * required. */
+static svn_error_t *
+hotcopy_io_dir_file_copy(svn_boolean_t *skipped_p,
+ const char *src_path,
+ const char *dst_path,
+ const char *file,
+ apr_pool_t *scratch_pool)
+{
+ const svn_io_dirent2_t *src_dirent;
+ const svn_io_dirent2_t *dst_dirent;
+ const char *src_target;
+ const char *dst_target;
+
+ /* Does the destination already exist? If not, we must copy it. */
+ dst_target = svn_dirent_join(dst_path, file, scratch_pool);
+ SVN_ERR(svn_io_stat_dirent2(&dst_dirent, dst_target, FALSE, TRUE,
+ scratch_pool, scratch_pool));
+ if (dst_dirent->kind != svn_node_none)
+ {
+ /* If the destination's stat information indicates that the file
+ * is equal to the source, don't bother copying the file again. */
+ src_target = svn_dirent_join(src_path, file, scratch_pool);
+ SVN_ERR(svn_io_stat_dirent2(&src_dirent, src_target, FALSE, FALSE,
+ scratch_pool, scratch_pool));
+ if (src_dirent->kind == dst_dirent->kind &&
+ src_dirent->special == dst_dirent->special &&
+ src_dirent->filesize == dst_dirent->filesize &&
+ src_dirent->mtime <= dst_dirent->mtime)
+ return SVN_NO_ERROR;
+ }
+
+ if (skipped_p)
+ *skipped_p = FALSE;
+
+ return svn_error_trace(svn_io_dir_file_copy(src_path, dst_path, file,
+ scratch_pool));
+}
+
+/* Set *NAME_P to the UTF-8 representation of directory entry NAME.
+ * NAME is in the internal encoding used by APR; PARENT is in
+ * UTF-8 and in internal (not local) style.
+ *
+ * Use PARENT only for generating an error string if the conversion
+ * fails because NAME could not be represented in UTF-8. In that
+ * case, return a two-level error in which the outer error's message
+ * mentions PARENT, but the inner error's message does not mention
+ * NAME (except possibly in hex) since NAME may not be printable.
+ * Such a compound error at least allows the user to go looking in the
+ * right directory for the problem.
+ *
+ * If there is any other error, just return that error directly.
+ *
+ * If there is any error, the effect on *NAME_P is undefined.
+ *
+ * *NAME_P and NAME may refer to the same storage.
+ */
+static svn_error_t *
+entry_name_to_utf8(const char **name_p,
+ const char *name,
+ const char *parent,
+ apr_pool_t *result_pool)
+{
+ svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, result_pool);
+ if (err && err->apr_err == APR_EINVAL)
+ {
+ return svn_error_createf(err->apr_err, err,
+ _("Error converting entry "
+ "in directory '%s' to UTF-8"),
+ svn_dirent_local_style(parent, result_pool));
+ }
+ return err;
+}
+
+/* Like svn_io_copy_dir_recursively() but doesn't copy regular files that
+ * exist in the destination and do not differ from the source in terms of
+ * kind, size, and mtime. Set *SKIPPED_P to FALSE only if at least one
+ * file was copied, do not change the value in *SKIPPED_P otherwise.
+ * SKIPPED_P may be NULL if not required. */
+static svn_error_t *
+hotcopy_io_copy_dir_recursively(svn_boolean_t *skipped_p,
+ const char *src,
+ const char *dst_parent,
+ const char *dst_basename,
+ svn_boolean_t copy_perms,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind;
+ apr_status_t status;
+ const char *dst_path;
+ apr_dir_t *this_dir;
+ apr_finfo_t this_entry;
+ apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME;
+
+ /* Make a subpool for recursion */
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ /* The 'dst_path' is simply dst_parent/dst_basename */
+ dst_path = svn_dirent_join(dst_parent, dst_basename, scratch_pool);
+
+ /* Sanity checks: SRC and DST_PARENT are directories, and
+ DST_BASENAME doesn't already exist in DST_PARENT. */
+ SVN_ERR(svn_io_check_path(src, &kind, subpool));
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Source '%s' is not a directory"),
+ svn_dirent_local_style(src, scratch_pool));
+
+ SVN_ERR(svn_io_check_path(dst_parent, &kind, subpool));
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Destination '%s' is not a directory"),
+ svn_dirent_local_style(dst_parent,
+ scratch_pool));
+
+ SVN_ERR(svn_io_check_path(dst_path, &kind, subpool));
+
+ /* Create the new directory. */
+ /* ### TODO: copy permissions (needs apr_file_attrs_get()) */
+ SVN_ERR(svn_io_make_dir_recursively(dst_path, scratch_pool));
+
+ /* Loop over the dirents in SRC. ('.' and '..' are auto-excluded) */
+ SVN_ERR(svn_io_dir_open(&this_dir, src, subpool));
+
+ for (status = apr_dir_read(&this_entry, flags, this_dir);
+ status == APR_SUCCESS;
+ status = apr_dir_read(&this_entry, flags, this_dir))
+ {
+ if ((this_entry.name[0] == '.')
+ && ((this_entry.name[1] == '\0')
+ || ((this_entry.name[1] == '.')
+ && (this_entry.name[2] == '\0'))))
+ {
+ continue;
+ }
+ else
+ {
+ const char *entryname_utf8;
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR(entry_name_to_utf8(&entryname_utf8, this_entry.name,
+ src, subpool));
+ if (this_entry.filetype == APR_REG) /* regular file */
+ {
+ SVN_ERR(hotcopy_io_dir_file_copy(skipped_p, src, dst_path,
+ entryname_utf8, subpool));
+ }
+ else if (this_entry.filetype == APR_LNK) /* symlink */
+ {
+ const char *src_target = svn_dirent_join(src, entryname_utf8,
+ subpool);
+ const char *dst_target = svn_dirent_join(dst_path,
+ entryname_utf8,
+ subpool);
+ SVN_ERR(svn_io_copy_link(src_target, dst_target,
+ subpool));
+ }
+ else if (this_entry.filetype == APR_DIR) /* recurse */
+ {
+ const char *src_target;
+
+ /* Prevent infinite recursion by filtering off our
+ newly created destination path. */
+ if (strcmp(src, dst_parent) == 0
+ && strcmp(entryname_utf8, dst_basename) == 0)
+ continue;
+
+ src_target = svn_dirent_join(src, entryname_utf8, subpool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p,
+ src_target,
+ dst_path,
+ entryname_utf8,
+ copy_perms,
+ cancel_func,
+ cancel_baton,
+ subpool));
+ }
+ /* ### support other APR node types someday?? */
+
+ }
+ }
+
+ if (! (APR_STATUS_IS_ENOENT(status)))
+ return svn_error_wrap_apr(status, _("Can't read directory '%s'"),
+ svn_dirent_local_style(src, scratch_pool));
+
+ status = apr_dir_close(this_dir);
+ if (status)
+ return svn_error_wrap_apr(status, _("Error closing directory '%s'"),
+ svn_dirent_local_style(src, scratch_pool));
+
+ /* Free any memory used by recursion */
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy an un-packed revision or revprop file for revision REV from SRC_SUBDIR
+ * to DST_SUBDIR. Assume a sharding layout based on MAX_FILES_PER_DIR.
+ * Set *SKIPPED_P to FALSE only if the file was copied, do not change the
+ * value in *SKIPPED_P otherwise. SKIPPED_P may be NULL if not required.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_copy_shard_file(svn_boolean_t *skipped_p,
+ const char *src_subdir,
+ const char *dst_subdir,
+ svn_revnum_t rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *src_subdir_shard = src_subdir,
+ *dst_subdir_shard = dst_subdir;
+
+ const char *shard = apr_psprintf(scratch_pool, "%ld",
+ rev / max_files_per_dir);
+ src_subdir_shard = svn_dirent_join(src_subdir, shard, scratch_pool);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+
+ if (rev % max_files_per_dir == 0)
+ {
+ SVN_ERR(svn_io_make_dir_recursively(dst_subdir_shard, scratch_pool));
+ SVN_ERR(svn_io_copy_perms(dst_subdir, dst_subdir_shard,
+ scratch_pool));
+ }
+
+ SVN_ERR(hotcopy_io_dir_file_copy(skipped_p,
+ src_subdir_shard, dst_subdir_shard,
+ apr_psprintf(scratch_pool, "%ld", rev),
+ scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+
+/* Copy a packed shard containing revision REV, and which contains
+ * MAX_FILES_PER_DIR revisions, from SRC_FS to DST_FS.
+ * Update *DST_MIN_UNPACKED_REV in case the shard is new in DST_FS.
+ * Do not re-copy data which already exists in DST_FS.
+ * Set *SKIPPED_P to FALSE only if at least one part of the shard
+ * was copied, do not change the value in *SKIPPED_P otherwise.
+ * SKIPPED_P may be NULL if not required.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_copy_packed_shard(svn_boolean_t *skipped_p,
+ svn_revnum_t *dst_min_unpacked_rev,
+ svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ svn_revnum_t rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *src_subdir;
+ const char *dst_subdir;
+ const char *packed_shard;
+ const char *src_subdir_packed_shard;
+ svn_revnum_t revprop_rev;
+ apr_pool_t *iterpool;
+ svn_fs_x__data_t *src_ffd = src_fs->fsap_data;
+
+ /* Copy the packed shard. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, scratch_pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, scratch_pool);
+ packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
+ rev / max_files_per_dir);
+ src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
+ scratch_pool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p, src_subdir_packed_shard,
+ dst_subdir, packed_shard,
+ TRUE /* copy_perms */,
+ NULL /* cancel_func */, NULL,
+ scratch_pool));
+
+ /* Copy revprops belonging to revisions in this pack. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR, scratch_pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR, scratch_pool);
+
+ if (src_ffd->min_unpacked_rev < rev + max_files_per_dir)
+ {
+ /* copy unpacked revprops rev by rev */
+ iterpool = svn_pool_create(scratch_pool);
+ for (revprop_rev = rev;
+ revprop_rev < rev + max_files_per_dir;
+ revprop_rev++)
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(hotcopy_copy_shard_file(skipped_p, src_subdir, dst_subdir,
+ revprop_rev, max_files_per_dir,
+ iterpool));
+ }
+ svn_pool_destroy(iterpool);
+ }
+ else
+ {
+ /* revprop for revision 0 will never be packed */
+ if (rev == 0)
+ SVN_ERR(hotcopy_copy_shard_file(skipped_p, src_subdir, dst_subdir,
+ 0, max_files_per_dir,
+ scratch_pool));
+
+ /* packed revprops folder */
+ packed_shard = apr_psprintf(scratch_pool, "%ld" PATH_EXT_PACKED_SHARD,
+ rev / max_files_per_dir);
+ src_subdir_packed_shard = svn_dirent_join(src_subdir, packed_shard,
+ scratch_pool);
+ SVN_ERR(hotcopy_io_copy_dir_recursively(skipped_p,
+ src_subdir_packed_shard,
+ dst_subdir, packed_shard,
+ TRUE /* copy_perms */,
+ NULL /* cancel_func */, NULL,
+ scratch_pool));
+ }
+
+ /* If necessary, update the min-unpacked rev file in the hotcopy. */
+ if (*dst_min_unpacked_rev < rev + max_files_per_dir)
+ {
+ *dst_min_unpacked_rev = rev + max_files_per_dir;
+ SVN_ERR(svn_fs_x__write_min_unpacked_rev(dst_fs,
+ *dst_min_unpacked_rev,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove file PATH, if it exists - even if it is read-only.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_file(const char *path,
+ apr_pool_t *scratch_pool)
+{
+ /* Make the rev file writable and remove it. */
+ SVN_ERR(svn_io_set_file_read_write(path, TRUE, scratch_pool));
+ SVN_ERR(svn_io_remove_file2(path, TRUE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Remove revision or revprop files between START_REV (inclusive) and
+ * END_REV (non-inclusive) from folder DST_SUBDIR in DST_FS. Assume
+ * sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_files(svn_fs_t *dst_fs,
+ const char *dst_subdir,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ const char *shard;
+ const char *dst_subdir_shard;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool;
+
+ /* Pre-compute paths for initial shard. */
+ shard = apr_psprintf(scratch_pool, "%ld", start_rev / max_files_per_dir);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+
+ iterpool = svn_pool_create(scratch_pool);
+ for (rev = start_rev; rev < end_rev; rev++)
+ {
+ svn_pool_clear(iterpool);
+
+ /* If necessary, update paths for shard. */
+ if (rev != start_rev && rev % max_files_per_dir == 0)
+ {
+ shard = apr_psprintf(iterpool, "%ld", rev / max_files_per_dir);
+ dst_subdir_shard = svn_dirent_join(dst_subdir, shard, scratch_pool);
+ }
+
+ /* remove files for REV */
+ SVN_ERR(hotcopy_remove_file(svn_dirent_join(dst_subdir_shard,
+ apr_psprintf(iterpool,
+ "%ld", rev),
+ iterpool),
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove revisions between START_REV (inclusive) and END_REV (non-inclusive)
+ * from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+hotcopy_remove_rev_files(svn_fs_t *dst_fs,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(start_rev <= end_rev);
+ SVN_ERR(hotcopy_remove_files(dst_fs,
+ svn_dirent_join(dst_fs->path,
+ PATH_REVS_DIR,
+ scratch_pool),
+ start_rev, end_rev,
+ max_files_per_dir, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove revision properties between START_REV (inclusive) and END_REV
+ * (non-inclusive) from DST_FS. Assume sharding as per MAX_FILES_PER_DIR.
+ * Use SCRATCH_POOL for temporary allocations. Revision 0 revprops will
+ * not be deleted. */
+static svn_error_t *
+hotcopy_remove_revprop_files(svn_fs_t *dst_fs,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ int max_files_per_dir,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(start_rev <= end_rev);
+
+ /* don't delete rev 0 props */
+ SVN_ERR(hotcopy_remove_files(dst_fs,
+ svn_dirent_join(dst_fs->path,
+ PATH_REVPROPS_DIR,
+ scratch_pool),
+ start_rev ? start_rev : 1, end_rev,
+ max_files_per_dir, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that DST_FS is a suitable destination for an incremental
+ * hotcopy from SRC_FS. */
+static svn_error_t *
+hotcopy_incremental_check_preconditions(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs)
+{
+ svn_fs_x__data_t *src_ffd = src_fs->fsap_data;
+ svn_fs_x__data_t *dst_ffd = dst_fs->fsap_data;
+
+ /* We only support incremental hotcopy between the same format. */
+ if (src_ffd->format != dst_ffd->format)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The FSX format (%d) of the hotcopy source does not match the "
+ "FSX format (%d) of the hotcopy destination; please upgrade "
+ "both repositories to the same format"),
+ src_ffd->format, dst_ffd->format);
+
+ /* Make sure the UUID of source and destination match up.
+ * We don't want to copy over a different repository. */
+ if (strcmp(src_fs->uuid, dst_fs->uuid) != 0)
+ return svn_error_create(SVN_ERR_RA_UUID_MISMATCH, NULL,
+ _("The UUID of the hotcopy source does "
+ "not match the UUID of the hotcopy "
+ "destination"));
+
+ /* Also require same shard size. */
+ if (src_ffd->max_files_per_dir != dst_ffd->max_files_per_dir)
+ return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The sharding layout configuration "
+ "of the hotcopy source does not match "
+ "the sharding layout configuration of "
+ "the hotcopy destination"));
+ return SVN_NO_ERROR;
+}
+
+/* Remove folder PATH. Ignore errors due to the sub-tree not being empty.
+ * CANCEL_FUNC and CANCEL_BATON do the usual thing.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+remove_folder(const char *path,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = svn_io_remove_dir2(path, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool);
+
+ if (err && APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Copy the revision and revprop files (possibly sharded / packed) from
+ * SRC_FS to DST_FS. Do not re-copy data which already exists in DST_FS.
+ * When copying packed or unpacked shards, checkpoint the result in DST_FS
+ * for every shard by updating the 'current' file if necessary. Assume
+ * the >= SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT filesystem format without
+ * global next-ID counters. Indicate progress via the optional NOTIFY_FUNC
+ * callback using NOTIFY_BATON. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+hotcopy_revisions(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ svn_revnum_t src_youngest,
+ svn_revnum_t dst_youngest,
+ svn_boolean_t incremental,
+ const char *src_revs_dir,
+ const char *dst_revs_dir,
+ const char *src_revprops_dir,
+ const char *dst_revprops_dir,
+ svn_fs_hotcopy_notify_t notify_func,
+ void* notify_baton,
+ svn_cancel_func_t cancel_func,
+ void* cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *src_ffd = src_fs->fsap_data;
+ int max_files_per_dir = src_ffd->max_files_per_dir;
+ svn_revnum_t src_min_unpacked_rev;
+ svn_revnum_t dst_min_unpacked_rev;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool;
+
+ /* Copy the min unpacked rev, and read its value. */
+ SVN_ERR(svn_fs_x__read_min_unpacked_rev(&src_min_unpacked_rev, src_fs,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__read_min_unpacked_rev(&dst_min_unpacked_rev, dst_fs,
+ scratch_pool));
+
+ /* We only support packs coming from the hotcopy source.
+ * The destination should not be packed independently from
+ * the source. This also catches the case where users accidentally
+ * swap the source and destination arguments. */
+ if (src_min_unpacked_rev < dst_min_unpacked_rev)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The hotcopy destination already contains "
+ "more packed revisions (%lu) than the "
+ "hotcopy source contains (%lu)"),
+ dst_min_unpacked_rev - 1,
+ src_min_unpacked_rev - 1);
+
+ SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
+ PATH_MIN_UNPACKED_REV, scratch_pool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /*
+ * Copy the necessary rev files.
+ */
+
+ iterpool = svn_pool_create(scratch_pool);
+ /* First, copy packed shards. */
+ for (rev = 0; rev < src_min_unpacked_rev; rev += max_files_per_dir)
+ {
+ svn_boolean_t skipped = TRUE;
+ svn_revnum_t pack_end_rev;
+
+ svn_pool_clear(iterpool);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Copy the packed shard. */
+ SVN_ERR(hotcopy_copy_packed_shard(&skipped, &dst_min_unpacked_rev,
+ src_fs, dst_fs,
+ rev, max_files_per_dir,
+ iterpool));
+
+ pack_end_rev = rev + max_files_per_dir - 1;
+
+ /* Whenever this pack did not previously exist in the destination,
+ * update 'current' to the most recent packed rev (so readers can see
+ * new revisions which arrived in this pack). */
+ if (pack_end_rev > dst_youngest)
+ {
+ SVN_ERR(svn_fs_x__write_current(dst_fs, pack_end_rev, iterpool));
+ }
+
+ /* When notifying about packed shards, make things simpler by either
+ * reporting a full revision range, i.e [pack start, pack end] or
+ * reporting nothing. There is one case when this approach might not
+ * be exact (incremental hotcopy with a pack replacing last unpacked
+ * revisions), but generally this is good enough. */
+ if (notify_func && !skipped)
+ notify_func(notify_baton, rev, pack_end_rev, iterpool);
+
+ /* Remove revision files which are now packed. */
+ if (incremental)
+ {
+ SVN_ERR(hotcopy_remove_rev_files(dst_fs, rev,
+ rev + max_files_per_dir,
+ max_files_per_dir, iterpool));
+ SVN_ERR(hotcopy_remove_revprop_files(dst_fs, rev,
+ rev + max_files_per_dir,
+ max_files_per_dir,
+ iterpool));
+ }
+
+ /* Now that all revisions have moved into the pack, the original
+ * rev dir can be removed. */
+ SVN_ERR(remove_folder(svn_fs_x__path_rev_shard(dst_fs, rev, iterpool),
+ cancel_func, cancel_baton, iterpool));
+ if (rev > 0)
+ SVN_ERR(remove_folder(svn_fs_x__path_revprops_shard(dst_fs, rev,
+ iterpool),
+ cancel_func, cancel_baton, iterpool));
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ SVN_ERR_ASSERT(rev == src_min_unpacked_rev);
+ SVN_ERR_ASSERT(src_min_unpacked_rev == dst_min_unpacked_rev);
+
+ /* Now, copy pairs of non-packed revisions and revprop files.
+ * If necessary, update 'current' after copying all files from a shard. */
+ for (; rev <= src_youngest; rev++)
+ {
+ svn_boolean_t skipped = TRUE;
+
+ svn_pool_clear(iterpool);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Copying non-packed revisions is racy in case the source repository is
+ * being packed concurrently with this hotcopy operation. With the pack
+ * lock, however, the race is impossible, because hotcopy and pack
+ * operations block each other.
+ *
+ * We assume that all revisions coming after 'min-unpacked-rev' really
+ * are unpacked and that's not necessarily true with concurrent packing.
+ * Don't try to be smart in this edge case, because handling it properly
+ * might require copying *everything* from the start. Just abort the
+ * hotcopy with an ENOENT (revision file moved to a pack, so it is no
+ * longer where we expect it to be). */
+
+ /* Copy the rev file. */
+ SVN_ERR(hotcopy_copy_shard_file(&skipped, src_revs_dir, dst_revs_dir,
+ rev, max_files_per_dir,
+ iterpool));
+
+ /* Copy the revprop file. */
+ SVN_ERR(hotcopy_copy_shard_file(&skipped, src_revprops_dir,
+ dst_revprops_dir,
+ rev, max_files_per_dir,
+ iterpool));
+
+ /* Whenever this revision did not previously exist in the destination,
+ * checkpoint the progress via 'current' (do that once per full shard
+ * in order not to slow things down). */
+ if (rev > dst_youngest)
+ {
+ if (max_files_per_dir && (rev % max_files_per_dir == 0))
+ {
+ SVN_ERR(svn_fs_x__write_current(dst_fs, rev, iterpool));
+ }
+ }
+
+ if (notify_func && !skipped)
+ notify_func(notify_baton, rev, rev, iterpool);
+ }
+ svn_pool_destroy(iterpool);
+
+ /* We assume that all revisions were copied now, i.e. we didn't exit the
+ * above loop early. 'rev' was last incremented during exit of the loop. */
+ SVN_ERR_ASSERT(rev == src_youngest + 1);
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for hotcopy_body(). */
+typedef struct hotcopy_body_baton_t {
+ svn_fs_t *src_fs;
+ svn_fs_t *dst_fs;
+ svn_boolean_t incremental;
+ svn_fs_hotcopy_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+} hotcopy_body_baton_t;
+
+/* Perform a hotcopy, either normal or incremental.
+ *
+ * Normal hotcopy assumes that the destination exists as an empty
+ * directory. It behaves like an incremental hotcopy except that
+ * none of the copied files already exist in the destination.
+ *
+ * An incremental hotcopy copies only changed or new files to the destination,
+ * and removes files from the destination no longer present in the source.
+ * While the incremental hotcopy is running, readers should still be able
+ * to access the destintation repository without error and should not see
+ * revisions currently in progress of being copied. Readers are able to see
+ * new fully copied revisions even if the entire incremental hotcopy procedure
+ * has not yet completed.
+ *
+ * Writers are blocked out completely during the entire incremental hotcopy
+ * process to ensure consistency. This function assumes that the repository
+ * write-lock is held.
+ */
+static svn_error_t *
+hotcopy_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ hotcopy_body_baton_t *hbb = baton;
+ svn_fs_t *src_fs = hbb->src_fs;
+ svn_fs_t *dst_fs = hbb->dst_fs;
+ svn_boolean_t incremental = hbb->incremental;
+ svn_fs_hotcopy_notify_t notify_func = hbb->notify_func;
+ void* notify_baton = hbb->notify_baton;
+ svn_cancel_func_t cancel_func = hbb->cancel_func;
+ void* cancel_baton = hbb->cancel_baton;
+ svn_revnum_t src_youngest;
+ svn_revnum_t dst_youngest;
+ const char *src_revprops_dir;
+ const char *dst_revprops_dir;
+ const char *src_revs_dir;
+ const char *dst_revs_dir;
+ const char *src_subdir;
+ const char *dst_subdir;
+ svn_node_kind_t kind;
+
+ /* Try to copy the config.
+ *
+ * ### We try copying the config file before doing anything else,
+ * ### because higher layers will abort the hotcopy if we throw
+ * ### an error from this function, and that renders the hotcopy
+ * ### unusable anyway. */
+ SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path, PATH_CONFIG,
+ scratch_pool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Find the youngest revision in the source and destination.
+ * We only support hotcopies from sources with an equal or greater amount
+ * of revisions than the destination.
+ * This also catches the case where users accidentally swap the
+ * source and destination arguments. */
+ SVN_ERR(svn_fs_x__read_current(&src_youngest, src_fs, scratch_pool));
+ if (incremental)
+ {
+ SVN_ERR(svn_fs_x__youngest_rev(&dst_youngest, dst_fs, scratch_pool));
+ if (src_youngest < dst_youngest)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("The hotcopy destination already contains more revisions "
+ "(%lu) than the hotcopy source contains (%lu); are source "
+ "and destination swapped?"),
+ dst_youngest, src_youngest);
+ }
+ else
+ dst_youngest = 0;
+
+ src_revs_dir = svn_dirent_join(src_fs->path, PATH_REVS_DIR, scratch_pool);
+ dst_revs_dir = svn_dirent_join(dst_fs->path, PATH_REVS_DIR, scratch_pool);
+ src_revprops_dir = svn_dirent_join(src_fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+ dst_revprops_dir = svn_dirent_join(dst_fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+
+ /* Ensure that the required folders exist in the destination
+ * before actually copying the revisions and revprops. */
+ SVN_ERR(svn_io_make_dir_recursively(dst_revs_dir, scratch_pool));
+ SVN_ERR(svn_io_make_dir_recursively(dst_revprops_dir, scratch_pool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ /* Split the logic for new and old FS formats. The latter is much simpler
+ * due to the absense of sharding and packing. However, it requires special
+ * care when updating the 'current' file (which contains not just the
+ * revision number, but also the next-ID counters). */
+ SVN_ERR(hotcopy_revisions(src_fs, dst_fs, src_youngest, dst_youngest,
+ incremental, src_revs_dir, dst_revs_dir,
+ src_revprops_dir, dst_revprops_dir,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool));
+ SVN_ERR(svn_fs_x__write_current(dst_fs, src_youngest, scratch_pool));
+
+ /* Replace the locks tree.
+ * This is racy in case readers are currently trying to list locks in
+ * the destination. However, we need to get rid of stale locks.
+ * This is the simplest way of doing this, so we accept this small race. */
+ dst_subdir = svn_dirent_join(dst_fs->path, PATH_LOCKS_DIR, scratch_pool);
+ SVN_ERR(svn_io_remove_dir2(dst_subdir, TRUE, cancel_func, cancel_baton,
+ scratch_pool));
+ src_subdir = svn_dirent_join(src_fs->path, PATH_LOCKS_DIR, scratch_pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, scratch_pool));
+ if (kind == svn_node_dir)
+ SVN_ERR(svn_io_copy_dir_recursively(src_subdir, dst_fs->path,
+ PATH_LOCKS_DIR, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* Now copy the node-origins cache tree. */
+ src_subdir = svn_dirent_join(src_fs->path, PATH_NODE_ORIGINS_DIR,
+ scratch_pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, scratch_pool));
+ if (kind == svn_node_dir)
+ SVN_ERR(hotcopy_io_copy_dir_recursively(NULL, src_subdir, dst_fs->path,
+ PATH_NODE_ORIGINS_DIR, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ /*
+ * NB: Data copied below is only read by writers, not readers.
+ * Writers are still locked out at this point.
+ */
+
+ /* Copy the rep cache and then remove entries for revisions
+ * younger than the destination's youngest revision. */
+ src_subdir = svn_dirent_join(src_fs->path, REP_CACHE_DB_NAME, scratch_pool);
+ dst_subdir = svn_dirent_join(dst_fs->path, REP_CACHE_DB_NAME, scratch_pool);
+ SVN_ERR(svn_io_check_path(src_subdir, &kind, scratch_pool));
+ if (kind == svn_node_file)
+ {
+ /* Copy the rep cache and then remove entries for revisions
+ * that did not make it into the destination. */
+ SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, scratch_pool));
+ SVN_ERR(svn_fs_x__del_rep_reference(dst_fs, src_youngest,
+ scratch_pool));
+ }
+
+ /* Copy the txn-current file. */
+ SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
+ PATH_TXN_CURRENT, scratch_pool));
+
+ /* If a revprop generation file exists in the source filesystem,
+ * reset it to zero (since this is on a different path, it will not
+ * overlap with data already in cache). Also, clean up stale files
+ * used for the named atomics implementation. */
+ SVN_ERR(svn_fs_x__reset_revprop_generation_file(dst_fs, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Wrapper around hotcopy_body taking out all necessary source repository
+ * locks.
+ */
+static svn_error_t *
+hotcopy_locking_src_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ hotcopy_body_baton_t *hbb = baton;
+
+ return svn_error_trace(svn_fs_x__with_pack_lock(hbb->src_fs, hotcopy_body,
+ baton, scratch_pool));
+}
+
+/* Create an empty filesystem at DST_FS at DST_PATH with the same
+ * configuration as SRC_FS (uuid, format, and other parameters).
+ * After creation DST_FS has no revisions, not even revision zero. */
+static svn_error_t *
+hotcopy_create_empty_dest(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *src_ffd = src_fs->fsap_data;
+
+ /* Create the DST_FS repository with the same layout as SRC_FS. */
+ SVN_ERR(svn_fs_x__create_file_tree(dst_fs, dst_path, src_ffd->format,
+ src_ffd->max_files_per_dir,
+ scratch_pool));
+
+ /* Copy the UUID. Hotcopy destination receives a new instance ID, but
+ * has the same filesystem UUID as the source. */
+ SVN_ERR(svn_fs_x__set_uuid(dst_fs, src_fs->uuid, NULL, scratch_pool));
+
+ /* Remove revision 0 contents. Otherwise, it may not get overwritten
+ * due to having a newer timestamp. */
+ SVN_ERR(hotcopy_remove_file(svn_fs_x__path_rev(dst_fs, 0, scratch_pool),
+ scratch_pool));
+ SVN_ERR(hotcopy_remove_file(svn_fs_x__path_revprops(dst_fs, 0,
+ scratch_pool),
+ scratch_pool));
+
+ /* This filesystem is ready. Stamp it with a format number. Fail if
+ * the 'format' file should already exist. */
+ SVN_ERR(svn_fs_x__write_format(dst_fs, FALSE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__hotcopy_prepare_target(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ svn_boolean_t incremental,
+ apr_pool_t *scratch_pool)
+{
+ if (incremental)
+ {
+ const char *dst_format_abspath;
+ svn_node_kind_t dst_format_kind;
+
+ /* Check destination format to be sure we know how to incrementally
+ * hotcopy to the destination FS. */
+ dst_format_abspath = svn_dirent_join(dst_path, PATH_FORMAT,
+ scratch_pool);
+ SVN_ERR(svn_io_check_path(dst_format_abspath, &dst_format_kind,
+ scratch_pool));
+ if (dst_format_kind == svn_node_none)
+ {
+ /* Destination doesn't exist yet. Perform a normal hotcopy to a
+ * empty destination using the same configuration as the source. */
+ SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path,
+ scratch_pool));
+ }
+ else
+ {
+ /* Check the existing repository. */
+ SVN_ERR(svn_fs_x__open(dst_fs, dst_path, scratch_pool));
+ SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs));
+ }
+ }
+ else
+ {
+ /* Start out with an empty destination using the same configuration
+ * as the source. */
+ SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ 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)
+{
+ hotcopy_body_baton_t hbb;
+
+ hbb.src_fs = src_fs;
+ hbb.dst_fs = dst_fs;
+ hbb.incremental = incremental;
+ hbb.notify_func = notify_func;
+ hbb.notify_baton = notify_baton;
+ hbb.cancel_func = cancel_func;
+ hbb.cancel_baton = cancel_baton;
+ SVN_ERR(svn_fs_x__with_all_locks(dst_fs, hotcopy_locking_src_body, &hbb,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/hotcopy.h b/subversion/libsvn_fs_x/hotcopy.h
new file mode 100644
index 0000000..516c66a
--- /dev/null
+++ b/subversion/libsvn_fs_x/hotcopy.h
@@ -0,0 +1,53 @@
+/* hotcopy.h : interface to the native filesystem layer
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__HOTCOPY_H
+#define SVN_LIBSVN_FS__HOTCOPY_H
+
+#include "fs.h"
+
+/* Create an empty copy of the fsfs filesystem SRC_FS into a new DST_FS at
+ * DST_PATH. If INCREMENTAL is TRUE, perform a few pre-checks only if
+ * a repo already exists at DST_PATH.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__hotcopy_prepare_target(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *dst_path,
+ svn_boolean_t incremental,
+ apr_pool_t *scratch_pool);
+
+/* Copy the fsfs filesystem SRC_FS into DST_FS. If INCREMENTAL is TRUE, do
+ * not re-copy data which already exists in DST_FS. Indicate progress via
+ * the optional NOTIFY_FUNC callback using NOTIFY_BATON.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ 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);
+
+#endif
diff --git a/subversion/libsvn_fs_x/id.c b/subversion/libsvn_fs_x/id.c
new file mode 100644
index 0000000..0127175
--- /dev/null
+++ b/subversion/libsvn_fs_x/id.c
@@ -0,0 +1,198 @@
+/* id.c : implements FSX-internal ID functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "id.h"
+#include "index.h"
+#include "util.h"
+
+#include "private/svn_string_private.h"
+
+
+
+svn_boolean_t
+svn_fs_x__is_txn(svn_fs_x__change_set_t change_set)
+{
+ return change_set < SVN_FS_X__INVALID_CHANGE_SET;
+}
+
+svn_boolean_t
+svn_fs_x__is_revision(svn_fs_x__change_set_t change_set)
+{
+ return change_set > SVN_FS_X__INVALID_CHANGE_SET;
+}
+
+svn_revnum_t
+svn_fs_x__get_revnum(svn_fs_x__change_set_t change_set)
+{
+ return svn_fs_x__is_revision(change_set)
+ ? (svn_revnum_t)change_set
+ : SVN_INVALID_REVNUM;
+}
+
+apr_int64_t
+svn_fs_x__get_txn_id(svn_fs_x__change_set_t change_set)
+{
+ return svn_fs_x__is_txn(change_set)
+ ? -change_set + SVN_FS_X__INVALID_CHANGE_SET -1
+ : SVN_FS_X__INVALID_TXN_ID;
+}
+
+
+svn_fs_x__change_set_t
+svn_fs_x__change_set_by_rev(svn_revnum_t revnum)
+{
+ assert(revnum >= SVN_FS_X__INVALID_CHANGE_SET);
+ return revnum;
+}
+
+svn_fs_x__change_set_t
+svn_fs_x__change_set_by_txn(apr_int64_t txn_id)
+{
+ assert(txn_id >= SVN_FS_X__INVALID_CHANGE_SET);
+ return -txn_id + SVN_FS_X__INVALID_CHANGE_SET -1;
+}
+
+
+/* Parse the NUL-terminated ID part at DATA and write the result into *PART.
+ * Return TRUE if no errors were detected. */
+static svn_boolean_t
+part_parse(svn_fs_x__id_t *part,
+ const char *data)
+{
+ part->number = svn__base36toui64(&data, data);
+ switch (data[0])
+ {
+ /* txn number? */
+ case '-': part->change_set = -svn__base36toui64(&data, data + 1);
+ return TRUE;
+
+ /* revision number? */
+ case '+': part->change_set = svn__base36toui64(&data, data + 1);
+ return TRUE;
+
+ /* everything else is forbidden */
+ default: return FALSE;
+ }
+}
+
+/* Write the textual representation of *PART into P and return a pointer
+ * to the first position behind that string.
+ */
+static char *
+part_unparse(char *p,
+ const svn_fs_x__id_t *part)
+{
+ p += svn__ui64tobase36(p, part->number);
+ if (part->change_set >= 0)
+ {
+ *(p++) = '+';
+ p += svn__ui64tobase36(p, part->change_set);
+ }
+ else
+ {
+ *(p++) = '-';
+ p += svn__ui64tobase36(p, -part->change_set);
+ }
+
+ return p;
+}
+
+
+
+/* Operations on ID parts */
+
+svn_boolean_t
+svn_fs_x__id_is_root(const svn_fs_x__id_t* part)
+{
+ return part->change_set == 0 && part->number == 0;
+}
+
+svn_boolean_t
+svn_fs_x__id_eq(const svn_fs_x__id_t *lhs,
+ const svn_fs_x__id_t *rhs)
+{
+ return lhs->change_set == rhs->change_set && lhs->number == rhs->number;
+}
+
+svn_error_t *
+svn_fs_x__id_parse(svn_fs_x__id_t *part,
+ const char *data)
+{
+ if (!part_parse(part, data))
+ return svn_error_createf(SVN_ERR_FS_MALFORMED_NODEREV_ID, NULL,
+ "Malformed ID string");
+
+ return SVN_NO_ERROR;
+}
+
+svn_string_t *
+svn_fs_x__id_unparse(const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool)
+{
+ char string[2 * SVN_INT64_BUFFER_SIZE + 1];
+ char *p = part_unparse(string, id);
+
+ return svn_string_ncreate(string, p - string, result_pool);
+}
+
+void
+svn_fs_x__id_reset(svn_fs_x__id_t *part)
+{
+ part->change_set = SVN_FS_X__INVALID_CHANGE_SET;
+ part->number = 0;
+}
+
+svn_boolean_t
+svn_fs_x__id_used(const svn_fs_x__id_t *part)
+{
+ return part->change_set != SVN_FS_X__INVALID_CHANGE_SET;
+}
+
+void
+svn_fs_x__init_txn_root(svn_fs_x__id_t *noderev_id,
+ svn_fs_x__txn_id_t txn_id)
+{
+ noderev_id->change_set = svn_fs_x__change_set_by_txn(txn_id);
+ noderev_id->number = SVN_FS_X__ITEM_INDEX_ROOT_NODE;
+}
+
+void
+svn_fs_x__init_rev_root(svn_fs_x__id_t *noderev_id,
+ svn_revnum_t rev)
+{
+ noderev_id->change_set = svn_fs_x__change_set_by_rev(rev);
+ noderev_id->number = SVN_FS_X__ITEM_INDEX_ROOT_NODE;
+}
+
+int
+svn_fs_x__id_compare(const svn_fs_x__id_t *a,
+ const svn_fs_x__id_t *b)
+{
+ if (a->change_set < b->change_set)
+ return -1;
+ if (a->change_set > b->change_set)
+ return 1;
+
+ return a->number < b->number ? -1 : a->number == b->number ? 0 : 1;
+}
diff --git a/subversion/libsvn_fs_x/id.h b/subversion/libsvn_fs_x/id.h
new file mode 100644
index 0000000..e584043
--- /dev/null
+++ b/subversion/libsvn_fs_x/id.h
@@ -0,0 +1,135 @@
+/* id.h : interface to FSX-internal ID functions
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_X_ID_H
+#define SVN_LIBSVN_FS_X_ID_H
+
+#include "svn_fs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Unique identifier for a transaction within the given repository. */
+typedef apr_int64_t svn_fs_x__txn_id_t;
+
+/* svn_fs_x__txn_id_t value for everything that is not a transaction. */
+#define SVN_FS_X__INVALID_TXN_ID ((svn_fs_x__txn_id_t)(-1))
+
+/* Change set is the umbrella term for transaction and revision in FSX.
+ * Revision numbers (>=0) map 1:1 onto change sets while txns are mapped
+ * onto the negatve value range. */
+typedef apr_int64_t svn_fs_x__change_set_t;
+
+/* Invalid / unused change set number. */
+#define SVN_FS_X__INVALID_CHANGE_SET ((svn_fs_x__change_set_t)(-1))
+
+/* Return TRUE iff the CHANGE_SET refers to a revision
+ (will return FALSE for SVN_INVALID_REVNUM). */
+svn_boolean_t
+svn_fs_x__is_revision(svn_fs_x__change_set_t change_set);
+
+/* Return TRUE iff the CHANGE_SET refers to a transaction
+ (will return FALSE for SVN_FS_X__INVALID_TXN_ID). */
+svn_boolean_t
+svn_fs_x__is_txn(svn_fs_x__change_set_t change_set);
+
+/* Return the revision number that corresponds to CHANGE_SET.
+ Will SVN_INVALID_REVNUM for transactions. */
+svn_revnum_t
+svn_fs_x__get_revnum(svn_fs_x__change_set_t change_set);
+
+/* Return the transaction ID that corresponds to CHANGE_SET.
+ Will SVN_FS_X__INVALID_TXN_ID for revisions. */
+svn_fs_x__txn_id_t
+svn_fs_x__get_txn_id(svn_fs_x__change_set_t change_set);
+
+/* Convert REVNUM into a change set number */
+svn_fs_x__change_set_t
+svn_fs_x__change_set_by_rev(svn_revnum_t revnum);
+
+/* Convert TXN_ID into a change set number */
+svn_fs_x__change_set_t
+svn_fs_x__change_set_by_txn(svn_fs_x__txn_id_t txn_id);
+
+/* An ID in FSX consists of a creation CHANGE_SET number and some changeset-
+ * local counter value (NUMBER).
+ */
+typedef struct svn_fs_x__id_t
+{
+ svn_fs_x__change_set_t change_set;
+
+ apr_uint64_t number;
+} svn_fs_x__id_t;
+
+
+/*** Operations on ID parts. ***/
+
+/* Return TRUE, if both elements of the PART is 0, i.e. this is the default
+ * value if e.g. no copies were made of this node. */
+svn_boolean_t
+svn_fs_x__id_is_root(const svn_fs_x__id_t *part);
+
+/* Return TRUE, if all element values of *LHS and *RHS match. */
+svn_boolean_t
+svn_fs_x__id_eq(const svn_fs_x__id_t *lhs,
+ const svn_fs_x__id_t *rhs);
+
+/* Parse the NUL-terminated ID part at DATA and write the result into *PART.
+ */
+svn_error_t *
+svn_fs_x__id_parse(svn_fs_x__id_t *part,
+ const char *data);
+
+/* Convert ID into string form, allocated in RESULT_POOL. */
+svn_string_t *
+svn_fs_x__id_unparse(const svn_fs_x__id_t*id,
+ apr_pool_t *result_pool);
+
+/* Set *PART to "unused". */
+void
+svn_fs_x__id_reset(svn_fs_x__id_t *part);
+
+/* Return TRUE if *PART is belongs to either a revision or transaction. */
+svn_boolean_t
+svn_fs_x__id_used(const svn_fs_x__id_t *part);
+
+/* Return 0 if A and B are equal, 1 if A is "greater than" B, -1 otherwise. */
+int
+svn_fs_x__id_compare(const svn_fs_x__id_t *a,
+ const svn_fs_x__id_t *b);
+
+/* Set *NODEREV_ID to the root node ID of transaction TXN_ID. */
+void
+svn_fs_x__init_txn_root(svn_fs_x__id_t *noderev_id,
+ svn_fs_x__txn_id_t txn_id);
+
+/* Set *NODEREV_ID to the root node ID of revision REV. */
+void
+svn_fs_x__init_rev_root(svn_fs_x__id_t *noderev_id,
+ svn_revnum_t rev);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_X_ID_H */
diff --git a/subversion/libsvn_fs_x/index.c b/subversion/libsvn_fs_x/index.c
new file mode 100644
index 0000000..7d568f9
--- /dev/null
+++ b/subversion/libsvn_fs_x/index.c
@@ -0,0 +1,3981 @@
+/* index.c indexing support for FSX support
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_io.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
+#include "index.h"
+#include "util.h"
+#include "pack.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "svn_private_config.h"
+#include "temp_serializer.h"
+#include "fs_x.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+/* maximum length of a uint64 in an 7/8b encoding */
+#define ENCODED_INT_LENGTH 10
+
+/* APR is missing an APR_OFF_T_MAX. So, define one. We will use it to
+ * limit file offsets stored in the indexes.
+ *
+ * We assume that everything shorter than 64 bits, it is at least 32 bits.
+ * We also assume that the type is always signed meaning we only have an
+ * effective positive range of 63 or 31 bits, respectively.
+ */
+static
+const apr_uint64_t off_t_max = (sizeof(apr_off_t) == sizeof(apr_int64_t))
+ ? APR_INT64_MAX
+ : APR_INT32_MAX;
+
+/* We store P2L proto-index entries as 6 values, 64 bits each on disk.
+ * See also svn_fs_fs__p2l_proto_index_add_entry().
+ */
+#define P2L_PROTO_INDEX_ENTRY_SIZE (6 * sizeof(apr_uint64_t))
+
+/* We put this string in front of the L2P index header. */
+#define L2P_STREAM_PREFIX "L2P-INDEX\n"
+
+/* We put this string in front of the P2L index header. */
+#define P2L_STREAM_PREFIX "P2L-INDEX\n"
+
+/* Size of the buffer that will fit the index header prefixes. */
+#define STREAM_PREFIX_LEN MAX(sizeof(L2P_STREAM_PREFIX), \
+ sizeof(P2L_STREAM_PREFIX))
+
+/* Page tables in the log-to-phys index file exclusively contain entries
+ * of this type to describe position and size of a given page.
+ */
+typedef struct l2p_page_table_entry_t
+{
+ /* global offset on the page within the index file */
+ apr_uint64_t offset;
+
+ /* number of mapping entries in that page */
+ apr_uint32_t entry_count;
+
+ /* size of the page on disk (in the index file) */
+ apr_uint32_t size;
+} l2p_page_table_entry_t;
+
+/* Master run-time data structure of an log-to-phys index. It contains
+ * the page tables of every revision covered by that index - but not the
+ * pages themselves.
+ */
+typedef struct l2p_header_t
+{
+ /* first revision covered by this index */
+ svn_revnum_t first_revision;
+
+ /* number of revisions covered */
+ apr_size_t revision_count;
+
+ /* (max) number of entries per page */
+ apr_uint32_t page_size;
+
+ /* indexes into PAGE_TABLE that mark the first page of the respective
+ * revision. PAGE_TABLE_INDEX[REVISION_COUNT] points to the end of
+ * PAGE_TABLE.
+ */
+ apr_size_t * page_table_index;
+
+ /* Page table covering all pages in the index */
+ l2p_page_table_entry_t * page_table;
+} l2p_header_t;
+
+/* Run-time data structure containing a single log-to-phys index page.
+ */
+typedef struct l2p_page_t
+{
+ /* number of entries in the OFFSETS array */
+ apr_uint32_t entry_count;
+
+ /* global file offsets (item index is the array index) within the
+ * packed or non-packed rev file. Offset will be -1 for unused /
+ * invalid item index values. */
+ apr_off_t *offsets;
+
+ /* In case that the item is stored inside a container, this is the
+ * identifying index of the item within that container. 0 for the
+ * container itself or for items that aren't containers. */
+ apr_uint32_t *sub_items;
+} l2p_page_t;
+
+/* All of the log-to-phys proto index file consist of entries of this type.
+ */
+typedef struct l2p_proto_entry_t
+{
+ /* phys offset + 1 of the data container. 0 for "new revision" entries. */
+ apr_uint64_t offset;
+
+ /* corresponding item index. 0 for "new revision" entries. */
+ apr_uint64_t item_index;
+
+ /* index within the container starting @ offset. 0 for "new revision"
+ * entries and for items with no outer container. */
+ apr_uint32_t sub_item;
+} l2p_proto_entry_t;
+
+/* Master run-time data structure of an phys-to-log index. It contains
+ * an array with one offset value for each rev file cluster.
+ */
+typedef struct p2l_header_t
+{
+ /* first revision covered by the index (and rev file) */
+ svn_revnum_t first_revision;
+
+ /* number of bytes in the rev files covered by each p2l page */
+ apr_uint64_t page_size;
+
+ /* number of pages / clusters in that rev file */
+ apr_size_t page_count;
+
+ /* number of bytes in the rev file */
+ apr_uint64_t file_size;
+
+ /* offsets of the pages / cluster descriptions within the index file */
+ apr_off_t *offsets;
+} p2l_header_t;
+
+/*
+ * packed stream array
+ */
+
+/* How many numbers we will pre-fetch and buffer in a packed number stream.
+ */
+enum { MAX_NUMBER_PREFETCH = 64 };
+
+/* Prefetched number entry in a packed number stream.
+ */
+typedef struct value_position_pair_t
+{
+ /* prefetched number */
+ apr_uint64_t value;
+
+ /* number of bytes read, *including* this number, since the buffer start */
+ apr_size_t total_len;
+} value_position_pair_t;
+
+/* State of a prefetching packed number stream. It will read compressed
+ * index data efficiently and present it as a series of non-packed uint64.
+ */
+struct svn_fs_x__packed_number_stream_t
+{
+ /* underlying data file containing the packed values */
+ apr_file_t *file;
+
+ /* Offset within FILE at which the stream data starts
+ * (i.e. which offset will reported as offset 0 by packed_stream_offset). */
+ apr_off_t stream_start;
+
+ /* First offset within FILE after the stream data.
+ * Attempts to read beyond this will cause an "Unexpected End Of Stream"
+ * error. */
+ apr_off_t stream_end;
+
+ /* number of used entries in BUFFER (starting at index 0) */
+ apr_size_t used;
+
+ /* index of the next number to read from the BUFFER (0 .. USED).
+ * If CURRENT == USED, we need to read more data upon get() */
+ apr_size_t current;
+
+ /* offset in FILE from which the first entry in BUFFER has been read */
+ apr_off_t start_offset;
+
+ /* offset in FILE from which the next number has to be read */
+ apr_off_t next_offset;
+
+ /* read the file in chunks of this size */
+ apr_size_t block_size;
+
+ /* pool to be used for file ops etc. */
+ apr_pool_t *pool;
+
+ /* buffer for prefetched values */
+ value_position_pair_t buffer[MAX_NUMBER_PREFETCH];
+};
+
+/* Return an svn_error_t * object for error ERR on STREAM with the given
+ * MESSAGE string. The latter must have a placeholder for the index file
+ * name ("%s") and the current read offset (e.g. "0x%lx").
+ */
+static svn_error_t *
+stream_error_create(svn_fs_x__packed_number_stream_t *stream,
+ apr_status_t err,
+ const char *message)
+{
+ const char *file_name;
+ apr_off_t offset;
+ SVN_ERR(svn_io_file_name_get(&file_name, stream->file,
+ stream->pool));
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, stream->file, stream->pool));
+
+ return svn_error_createf(err, NULL, message, file_name,
+ apr_psprintf(stream->pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ (apr_uint64_t)offset));
+}
+
+/* Read up to MAX_NUMBER_PREFETCH numbers from the STREAM->NEXT_OFFSET in
+ * STREAM->FILE and buffer them.
+ *
+ * We don't want GCC and others to inline this (infrequently called)
+ * function into packed_stream_get() because it prevents the latter from
+ * being inlined itself.
+ */
+SVN__PREVENT_INLINE
+static svn_error_t *
+packed_stream_read(svn_fs_x__packed_number_stream_t *stream)
+{
+ unsigned char buffer[MAX_NUMBER_PREFETCH];
+ apr_size_t read = 0;
+ apr_size_t i;
+ value_position_pair_t *target;
+ apr_off_t block_start = 0;
+ apr_off_t block_left = 0;
+ apr_status_t err;
+
+ /* all buffered data will have been read starting here */
+ stream->start_offset = stream->next_offset;
+
+ /* packed numbers are usually not aligned to MAX_NUMBER_PREFETCH blocks,
+ * i.e. the last number has been incomplete (and not buffered in stream)
+ * and need to be re-read. Therefore, always correct the file pointer.
+ */
+ SVN_ERR(svn_io_file_aligned_seek(stream->file, stream->block_size,
+ &block_start, stream->next_offset,
+ stream->pool));
+
+ /* prefetch at least one number but, if feasible, don't cross block
+ * boundaries. This shall prevent jumping back and forth between two
+ * blocks because the extra data was not actually request _now_.
+ */
+ read = sizeof(buffer);
+ block_left = stream->block_size - (stream->next_offset - block_start);
+ if (block_left >= 10 && block_left < read)
+ read = (apr_size_t)block_left;
+
+ /* Don't read beyond the end of the file section that belongs to this
+ * index / stream. */
+ read = (apr_size_t)MIN(read, stream->stream_end - stream->next_offset);
+
+ err = apr_file_read(stream->file, buffer, &read);
+ if (err && !APR_STATUS_IS_EOF(err))
+ return stream_error_create(stream, err,
+ _("Can't read index file '%s' at offset 0x%"));
+
+ /* if the last number is incomplete, trim it from the buffer */
+ while (read > 0 && buffer[read-1] >= 0x80)
+ --read;
+
+ /* we call read() only if get() requires more data. So, there must be
+ * at least *one* further number. */
+ if SVN__PREDICT_FALSE(read == 0)
+ return stream_error_create(stream, err,
+ _("Unexpected end of index file %s at offset 0x%"));
+
+ /* parse file buffer and expand into stream buffer */
+ target = stream->buffer;
+ for (i = 0; i < read;)
+ {
+ if (buffer[i] < 0x80)
+ {
+ /* numbers < 128 are relatively frequent and particularly easy
+ * to decode. Give them special treatment. */
+ target->value = buffer[i];
+ ++i;
+ target->total_len = i;
+ ++target;
+ }
+ else
+ {
+ apr_uint64_t value = 0;
+ apr_uint64_t shift = 0;
+ while (buffer[i] >= 0x80)
+ {
+ value += ((apr_uint64_t)buffer[i] & 0x7f) << shift;
+ shift += 7;
+ ++i;
+ }
+
+ target->value = value + ((apr_uint64_t)buffer[i] << shift);
+ ++i;
+ target->total_len = i;
+ ++target;
+
+ /* let's catch corrupted data early. It would surely cause
+ * havoc further down the line. */
+ if SVN__PREDICT_FALSE(shift > 8 * sizeof(value))
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Corrupt index: number too large"));
+ }
+ }
+
+ /* update stream state */
+ stream->used = target - stream->buffer;
+ stream->next_offset = stream->start_offset + i;
+ stream->current = 0;
+
+ return SVN_NO_ERROR;
+}
+
+/* Create and open a packed number stream reading from offsets START to
+ * END in FILE and return it in *STREAM. Access the file in chunks of
+ * BLOCK_SIZE bytes. Expect the stream to be prefixed by STREAM_PREFIX.
+ * Allocate *STREAM in RESULT_POOL and use SCRATCH_POOL for temporaries.
+ */
+static svn_error_t *
+packed_stream_open(svn_fs_x__packed_number_stream_t **stream,
+ apr_file_t *file,
+ apr_off_t start,
+ apr_off_t end,
+ const char *stream_prefix,
+ apr_size_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ char buffer[STREAM_PREFIX_LEN + 1] = { 0 };
+ apr_size_t len = strlen(stream_prefix);
+ svn_fs_x__packed_number_stream_t *result;
+
+ /* If this is violated, we forgot to adjust STREAM_PREFIX_LEN after
+ * changing the index header prefixes. */
+ SVN_ERR_ASSERT(len < sizeof(buffer));
+
+ /* Read the header prefix and compare it with the expected prefix */
+ SVN_ERR(svn_io_file_aligned_seek(file, block_size, NULL, start,
+ scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(file, buffer, len, NULL, NULL,
+ scratch_pool));
+
+ if (strncmp(buffer, stream_prefix, len))
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index stream header prefix mismatch.\n"
+ " expected: %s"
+ " found: %s"), stream_prefix, buffer);
+
+ /* Construct the actual stream object. */
+ result = apr_palloc(result_pool, sizeof(*result));
+
+ result->pool = result_pool;
+ result->file = file;
+ result->stream_start = start + len;
+ result->stream_end = end;
+
+ result->used = 0;
+ result->current = 0;
+ result->start_offset = result->stream_start;
+ result->next_offset = result->stream_start;
+ result->block_size = block_size;
+
+ *stream = result;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * The forced inline is required for performance reasons: This is a very
+ * hot code path (called for every item we read) but e.g. GCC would rather
+ * chose to inline packed_stream_read() here, preventing packed_stream_get
+ * from being inlined itself.
+ */
+SVN__FORCE_INLINE
+static svn_error_t*
+packed_stream_get(apr_uint64_t *value,
+ svn_fs_x__packed_number_stream_t *stream)
+{
+ if (stream->current == stream->used)
+ SVN_ERR(packed_stream_read(stream));
+
+ *value = stream->buffer[stream->current].value;
+ ++stream->current;
+
+ return SVN_NO_ERROR;
+}
+
+/* Navigate STREAM to packed stream offset OFFSET. There will be no checks
+ * whether the given OFFSET is valid.
+ */
+static void
+packed_stream_seek(svn_fs_x__packed_number_stream_t *stream,
+ apr_off_t offset)
+{
+ apr_off_t file_offset = offset + stream->stream_start;
+
+ if ( stream->used == 0
+ || offset < stream->start_offset
+ || offset >= stream->next_offset)
+ {
+ /* outside buffered data. Next get() will read() from OFFSET. */
+ stream->start_offset = file_offset;
+ stream->next_offset = file_offset;
+ stream->current = 0;
+ stream->used = 0;
+ }
+ else
+ {
+ /* Find the suitable location in the stream buffer.
+ * Since our buffer is small, it is efficient enough to simply scan
+ * it for the desired position. */
+ apr_size_t i;
+ for (i = 0; i < stream->used; ++i)
+ if (stream->buffer[i].total_len > file_offset - stream->start_offset)
+ break;
+
+ stream->current = i;
+ }
+}
+
+/* Return the packed stream offset of at which the next number in the stream
+ * can be found.
+ */
+static apr_off_t
+packed_stream_offset(svn_fs_x__packed_number_stream_t *stream)
+{
+ apr_off_t file_offset
+ = stream->current == 0
+ ? stream->start_offset
+ : stream->buffer[stream->current-1].total_len + stream->start_offset;
+
+ return file_offset - stream->stream_start;
+}
+
+/* Write VALUE to the PROTO_INDEX file, using SCRATCH_POOL for temporary
+ * allocations.
+ *
+ * The point of this function is to ensure an architecture-independent
+ * proto-index file format. All data is written as unsigned 64 bits ints
+ * in little endian byte order. 64 bits is the largest portable integer
+ * we have and unsigned values have well-defined conversions in C.
+ */
+static svn_error_t *
+write_uint64_to_proto_index(apr_file_t *proto_index,
+ apr_uint64_t value,
+ apr_pool_t *scratch_pool)
+{
+ apr_byte_t buffer[sizeof(value)];
+ int i;
+ apr_size_t written;
+
+ /* Split VALUE into 8 bytes using LE ordering. */
+ for (i = 0; i < sizeof(buffer); ++i)
+ {
+ /* Unsigned conversions are well-defined ... */
+ buffer[i] = (apr_byte_t)value;
+ value >>= CHAR_BIT;
+ }
+
+ /* Write it all to disk. */
+ SVN_ERR(svn_io_file_write_full(proto_index, buffer, sizeof(buffer),
+ &written, scratch_pool));
+ SVN_ERR_ASSERT(written == sizeof(buffer));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read one unsigned 64 bit value from PROTO_INDEX file and return it in
+ * *VALUE_P. If EOF is NULL, error out when trying to read beyond EOF.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * This function is the inverse to write_uint64_to_proto_index (see there),
+ * reading the external LE byte order and convert it into host byte order.
+ */
+static svn_error_t *
+read_uint64_from_proto_index(apr_file_t *proto_index,
+ apr_uint64_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_byte_t buffer[sizeof(*value_p)];
+ apr_size_t read;
+
+ /* Read the full 8 bytes or our 64 bit value, unless we hit EOF.
+ * Assert that we never read partial values. */
+ SVN_ERR(svn_io_file_read_full2(proto_index, buffer, sizeof(buffer),
+ &read, eof, scratch_pool));
+ SVN_ERR_ASSERT((eof && *eof) || read == sizeof(buffer));
+
+ /* If we did not hit EOF, reconstruct the uint64 value and return it. */
+ if (!eof || !*eof)
+ {
+ int i;
+ apr_uint64_t value;
+
+ /* This could only overflow if CHAR_BIT had a value that is not
+ * a divisor of 64. */
+ value = 0;
+ for (i = sizeof(buffer) - 1; i >= 0; --i)
+ value = (value << CHAR_BIT) + buffer[i];
+
+ *value_p = value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience function similar to read_uint64_from_proto_index, but returns
+ * an uint32 value in VALUE_P. Return an error if the value does not fit.
+ */
+static svn_error_t *
+read_uint32_from_proto_index(apr_file_t *proto_index,
+ apr_uint32_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t value;
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &value, eof,
+ scratch_pool));
+ if (!eof || !*eof)
+ {
+ if (value > APR_UINT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("UINT32 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ value),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ (apr_uint64_t)APR_UINT32_MAX));
+
+ /* This conversion is not lossy because the value can be represented
+ * in the target type. */
+ *value_p = (apr_uint32_t)value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Convenience function similar to read_uint64_from_proto_index, but returns
+ * an off_t value in VALUE_P. Return an error if the value does not fit.
+ */
+static svn_error_t *
+read_off_t_from_proto_index(apr_file_t *proto_index,
+ apr_off_t *value_p,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t value;
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &value, eof,
+ scratch_pool));
+ if (!eof || !*eof)
+ {
+ if (value > off_t_max)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("File offset 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ value),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_HEX_FMT,
+ off_t_max));
+
+ /* Shortening conversion from unsigned to signed int is well-defined
+ * and not lossy in C because the value can be represented in the
+ * target type. */
+ *value_p = (apr_off_t)value;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * log-to-phys index
+ */
+svn_error_t *
+svn_fs_x__l2p_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(svn_io_file_open(proto_index, file_name, APR_READ | APR_WRITE
+ | APR_CREATE | APR_APPEND | APR_BUFFERED,
+ APR_OS_DEFAULT, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Append ENTRY to log-to-phys PROTO_INDEX file.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_l2p_entry_to_proto_index(apr_file_t *proto_index,
+ l2p_proto_entry_t entry,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry.offset,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry.item_index,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry.sub_item,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read *ENTRY from log-to-phys PROTO_INDEX file and indicate end-of-file
+ * in *EOF, or error out in that case if EOF is NULL. *ENTRY is in an
+ * undefined state if an end-of-file occurred.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+read_l2p_entry_from_proto_index(apr_file_t *proto_index,
+ l2p_proto_entry_t *entry,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &entry->offset, eof,
+ scratch_pool));
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &entry->item_index, eof,
+ scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->sub_item, eof,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__l2p_proto_index_add_revision(apr_file_t *proto_index,
+ apr_pool_t *scratch_pool)
+{
+ l2p_proto_entry_t entry = { 0 };
+ return svn_error_trace(write_l2p_entry_to_proto_index(proto_index, entry,
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__l2p_proto_index_add_entry(apr_file_t *proto_index,
+ apr_off_t offset,
+ apr_uint32_t sub_item,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ l2p_proto_entry_t entry = { 0 };
+
+ /* make sure the conversion to uint64 works */
+ SVN_ERR_ASSERT(offset >= -1);
+
+ /* we support offset '-1' as a "not used" indication */
+ entry.offset = (apr_uint64_t)offset + 1;
+
+ /* make sure we can use item_index as an array index when building the
+ * final index file */
+ SVN_ERR_ASSERT(item_index < UINT_MAX / 2);
+ entry.item_index = item_index;
+
+ /* no limits on the container sub-item index */
+ entry.sub_item = sub_item;
+
+ return svn_error_trace(write_l2p_entry_to_proto_index(proto_index, entry,
+ scratch_pool));
+}
+
+/* Encode VALUE as 7/8b into P and return the number of bytes written.
+ * This will be used when _writing_ packed data. packed_stream_* is for
+ * read operations only.
+ */
+static apr_size_t
+encode_uint(unsigned char *p, apr_uint64_t value)
+{
+ unsigned char *start = p;
+ while (value >= 0x80)
+ {
+ *p = (unsigned char)((value % 0x80) + 0x80);
+ value /= 0x80;
+ ++p;
+ }
+
+ *p = (unsigned char)(value % 0x80);
+ return (p - start) + 1;
+}
+
+/* Encode VALUE as 7/8b into P and return the number of bytes written.
+ * This maps signed ints onto unsigned ones.
+ */
+static apr_size_t
+encode_int(unsigned char *p, apr_int64_t value)
+{
+ return encode_uint(p, (apr_uint64_t)(value < 0 ? -1 - 2*value : 2*value));
+}
+
+/* Append VALUE to STREAM in 7/8b encoding.
+ */
+static svn_error_t *
+stream_write_encoded(svn_stream_t *stream,
+ apr_uint64_t value)
+{
+ unsigned char encoded[ENCODED_INT_LENGTH];
+
+ apr_size_t len = encode_uint(encoded, value);
+ return svn_error_trace(svn_stream_write(stream, (char *)encoded, &len));
+}
+
+/* Run-length-encode the uint64 numbers in ARRAY starting at index START
+ * up to but not including END. All numbers must be > 0.
+ * Return the number of remaining entries in ARRAY after START.
+ */
+static int
+rle_array(apr_array_header_t *array, int start, int end)
+{
+ int i;
+ int target = start;
+ for (i = start; i < end; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(array, i, apr_uint64_t);
+ assert(value > 0);
+
+ if (value == 1)
+ {
+ int counter;
+ for (counter = 1; i + counter < end; ++counter)
+ if (APR_ARRAY_IDX(array, i + counter, apr_uint64_t) != 1)
+ break;
+
+ if (--counter)
+ {
+ APR_ARRAY_IDX(array, target, apr_uint64_t) = 0;
+ APR_ARRAY_IDX(array, target + 1, apr_uint64_t) = counter;
+ target += 2;
+ i += counter;
+ continue;
+ }
+ }
+
+ APR_ARRAY_IDX(array, target, apr_uint64_t) = value;
+ ++target;
+ }
+
+ return target;
+}
+
+/* Utility data structure describing an log-2-phys page entry.
+ * This is only used as a transient representation during index creation.
+ */
+typedef struct l2p_page_entry_t
+{
+ apr_uint64_t offset;
+ apr_uint32_t sub_item;
+} l2p_page_entry_t;
+
+/* qsort-compatible compare function taking two l2p_page_entry_t and
+ * ordering them by offset.
+ */
+static int
+compare_l2p_entries_by_offset(const l2p_page_entry_t *lhs,
+ const l2p_page_entry_t *rhs)
+{
+ return lhs->offset > rhs->offset ? 1
+ : lhs->offset == rhs->offset ? 0 : -1;
+}
+
+/* Write the log-2-phys index page description for the l2p_page_entry_t
+ * array ENTRIES, starting with element START up to but not including END.
+ * Write the resulting representation into BUFFER. Use SCRATCH_POOL for
+ * temporary allocations.
+ */
+static svn_error_t *
+encode_l2p_page(apr_array_header_t *entries,
+ int start,
+ int end,
+ svn_spillbuf_t *buffer,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char encoded[ENCODED_INT_LENGTH];
+ apr_hash_t *containers = apr_hash_make(scratch_pool);
+ int count = end - start;
+ int container_count = 0;
+ apr_uint64_t last_offset = 0;
+ int i;
+
+ apr_size_t data_size = count * sizeof(l2p_page_entry_t);
+ svn_stringbuf_t *container_offsets
+ = svn_stringbuf_create_ensure(count * 2, scratch_pool);
+
+ /* SORTED: relevant items from ENTRIES, sorted by offset */
+ l2p_page_entry_t *sorted
+ = apr_pmemdup(scratch_pool,
+ entries->elts + start * sizeof(l2p_page_entry_t),
+ data_size);
+ qsort(sorted, end - start, sizeof(l2p_page_entry_t),
+ (int (*)(const void *, const void *))compare_l2p_entries_by_offset);
+
+ /* identify container offsets and create container list */
+ for (i = 0; i < count; ++i)
+ {
+ /* skip "unused" entries */
+ if (sorted[i].offset == 0)
+ continue;
+
+ /* offset already covered? */
+ if (i > 0 && sorted[i].offset == sorted[i-1].offset)
+ continue;
+
+ /* is this a container item
+ * (appears more than once or accesses to sub-items other than 0)? */
+ if ( (i != count-1 && sorted[i].offset == sorted[i+1].offset)
+ || (sorted[i].sub_item != 0))
+ {
+ svn_stringbuf_appendbytes(container_offsets, (const char *)encoded,
+ encode_uint(encoded, sorted[i].offset
+ - last_offset));
+ last_offset = sorted[i].offset;
+ apr_hash_set(containers,
+ &sorted[i].offset,
+ sizeof(sorted[i].offset),
+ (void *)(apr_uintptr_t)++container_count);
+ }
+ }
+
+ /* write container list to BUFFER */
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, container_count),
+ scratch_pool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)container_offsets->data,
+ container_offsets->len, scratch_pool));
+
+ /* encode items */
+ for (i = start; i < end; ++i)
+ {
+ l2p_page_entry_t *entry = &APR_ARRAY_IDX(entries, i, l2p_page_entry_t);
+ if (entry->offset == 0)
+ {
+ SVN_ERR(svn_spillbuf__write(buffer, "\0", 1, scratch_pool));
+ }
+ else
+ {
+ void *void_idx = apr_hash_get(containers, &entry->offset,
+ sizeof(entry->offset));
+ if (void_idx == NULL)
+ {
+ apr_uint64_t value = entry->offset + container_count;
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, value),
+ scratch_pool));
+ }
+ else
+ {
+ apr_uintptr_t idx = (apr_uintptr_t)void_idx;
+ apr_uint64_t value = entry->sub_item;
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, idx),
+ scratch_pool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, value),
+ scratch_pool));
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__l2p_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t * result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_file_t *proto_index = NULL;
+ svn_stream_t *stream;
+ int i;
+ int end;
+ apr_uint64_t entry;
+ svn_boolean_t eof = FALSE;
+
+ int last_page_count = 0; /* total page count at the start of
+ the current revision */
+
+ /* temporary data structures that collect the data which will be moved
+ to the target file in a second step */
+ apr_pool_t *local_pool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool = svn_pool_create(local_pool);
+ apr_array_header_t *page_counts
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+ apr_array_header_t *page_sizes
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+ apr_array_header_t *entry_counts
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+
+ /* collect the item offsets and sub-item value for the current revision */
+ apr_array_header_t *entries
+ = apr_array_make(local_pool, 256, sizeof(l2p_page_entry_t));
+
+ /* 64k blocks, spill after 16MB */
+ svn_spillbuf_t *buffer
+ = svn_spillbuf__create(0x10000, 0x1000000, local_pool);
+
+ /* Paranoia check that makes later casting to int32 safe.
+ * The current implementation is limited to 2G entries per page. */
+ if (ffd->l2p_page_size > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("L2P index page size %s"
+ " exceeds current limit of 2G entries"),
+ apr_psprintf(local_pool, "%" APR_UINT64_T_FMT,
+ ffd->l2p_page_size));
+
+ /* start at the beginning of the source file */
+ SVN_ERR(svn_io_file_open(&proto_index, proto_file_name,
+ APR_READ | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, local_pool));
+
+ /* process all entries until we fail due to EOF */
+ for (entry = 0; !eof; ++entry)
+ {
+ l2p_proto_entry_t proto_entry;
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_l2p_entry_from_proto_index(proto_index, &proto_entry,
+ &eof, local_pool));
+
+ /* handle new revision */
+ if ((entry > 0 && proto_entry.offset == 0) || eof)
+ {
+ /* dump entries, grouped into pages */
+
+ int entry_count = 0;
+ for (i = 0; i < entries->nelts; i += entry_count)
+ {
+ /* 1 page with up to L2P_PAGE_SIZE entries.
+ * fsfs.conf settings validation guarantees this to fit into
+ * our address space. */
+ apr_size_t last_buffer_size
+ = (apr_size_t)svn_spillbuf__get_size(buffer);
+
+ svn_pool_clear(iterpool);
+
+ entry_count = ffd->l2p_page_size < entries->nelts - i
+ ? (int)ffd->l2p_page_size
+ : entries->nelts - i;
+ SVN_ERR(encode_l2p_page(entries, i, i + entry_count,
+ buffer, iterpool));
+
+ APR_ARRAY_PUSH(entry_counts, apr_uint64_t) = entry_count;
+ APR_ARRAY_PUSH(page_sizes, apr_uint64_t)
+ = svn_spillbuf__get_size(buffer) - last_buffer_size;
+ }
+
+ apr_array_clear(entries);
+
+ /* store the number of pages in this revision */
+ APR_ARRAY_PUSH(page_counts, apr_uint64_t)
+ = page_sizes->nelts - last_page_count;
+
+ last_page_count = page_sizes->nelts;
+ }
+ else
+ {
+ int idx;
+
+ /* store the mapping in our array */
+ l2p_page_entry_t page_entry = { 0 };
+
+ if (proto_entry.item_index > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s too large "
+ "in l2p proto index for revision %ld"),
+ apr_psprintf(local_pool,
+ "%" APR_UINT64_T_FMT,
+ proto_entry.item_index),
+ revision + page_counts->nelts);
+
+ idx = (int)proto_entry.item_index;
+ while (idx >= entries->nelts)
+ APR_ARRAY_PUSH(entries, l2p_page_entry_t) = page_entry;
+
+ page_entry.offset = proto_entry.offset;
+ page_entry.sub_item = proto_entry.sub_item;
+ APR_ARRAY_IDX(entries, idx, l2p_page_entry_t) = page_entry;
+ }
+ }
+
+ /* we are now done with the source file */
+ SVN_ERR(svn_io_file_close(proto_index, local_pool));
+
+ /* Paranoia check that makes later casting to int32 safe.
+ * The current implementation is limited to 2G pages per index. */
+ if (page_counts->nelts > APR_INT32_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("L2P index page count %d"
+ " exceeds current limit of 2G pages"),
+ page_counts->nelts);
+
+ /* open target stream. */
+ stream = svn_stream_checksummed2(svn_stream_from_aprfile2(index_file, TRUE,
+ local_pool),
+ NULL, checksum, svn_checksum_md5, FALSE,
+ result_pool);
+
+
+ /* write header info */
+ SVN_ERR(svn_stream_puts(stream, L2P_STREAM_PREFIX));
+ SVN_ERR(stream_write_encoded(stream, revision));
+ SVN_ERR(stream_write_encoded(stream, page_counts->nelts));
+ SVN_ERR(stream_write_encoded(stream, ffd->l2p_page_size));
+ SVN_ERR(stream_write_encoded(stream, page_sizes->nelts));
+
+ /* write the revision table */
+ end = rle_array(page_counts, 0, page_counts->nelts);
+ for (i = 0; i < end; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(page_counts, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* write the page table */
+ for (i = 0; i < page_sizes->nelts; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(page_sizes, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ value = APR_ARRAY_IDX(entry_counts, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* append page contents and implicitly close STREAM */
+ SVN_ERR(svn_stream_copy3(svn_stream__from_spillbuf(buffer, local_pool),
+ stream, NULL, NULL, local_pool));
+
+ svn_pool_destroy(local_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the base revision used to identify the p2l or lp2 index covering
+ * REVISION in FS.
+ */
+static svn_revnum_t
+base_revision(svn_fs_t *fs, svn_revnum_t revision)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ return svn_fs_x__is_packed_rev(fs, revision)
+ ? revision - (revision % ffd->max_files_per_dir)
+ : revision;
+}
+
+/* Data structure that describes which l2p page info shall be extracted
+ * from the cache and contains the fields that receive the result.
+ */
+typedef struct l2p_page_info_baton_t
+{
+ /* input data: we want the page covering (REVISION,ITEM_INDEX) */
+ svn_revnum_t revision;
+ apr_uint64_t item_index;
+
+ /* out data */
+ /* page location and size of the page within the l2p index file */
+ l2p_page_table_entry_t entry;
+
+ /* page number within the pages for REVISION (not l2p index global!) */
+ apr_uint32_t page_no;
+
+ /* offset of ITEM_INDEX within that page */
+ apr_uint32_t page_offset;
+
+ /* revision identifying the l2p index file, also the first rev in that */
+ svn_revnum_t first_revision;
+} l2p_page_info_baton_t;
+
+
+/* Utility function that copies the info requested by BATON->REVISION and
+ * BATON->ITEM_INDEX and from HEADER and PAGE_TABLE into the output fields
+ * of *BATON. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_header_copy(l2p_page_info_baton_t *baton,
+ const l2p_header_t *header,
+ const l2p_page_table_entry_t *page_table,
+ const apr_size_t *page_table_index,
+ apr_pool_t *scratch_pool)
+{
+ /* revision offset within the index file */
+ apr_size_t rel_revision = baton->revision - header->first_revision;
+ if (rel_revision >= header->revision_count)
+ return svn_error_createf(SVN_ERR_FS_INDEX_REVISION , NULL,
+ _("Revision %ld not covered by item index"),
+ baton->revision);
+
+ /* select the relevant page */
+ if (baton->item_index < header->page_size)
+ {
+ /* most revs fit well into a single page */
+ baton->page_offset = (apr_uint32_t)baton->item_index;
+ baton->page_no = 0;
+ baton->entry = page_table[page_table_index[rel_revision]];
+ }
+ else
+ {
+ const l2p_page_table_entry_t *first_entry;
+ const l2p_page_table_entry_t *last_entry;
+ apr_uint64_t max_item_index;
+
+ /* range of pages for this rev */
+ first_entry = page_table + page_table_index[rel_revision];
+ last_entry = page_table + page_table_index[rel_revision + 1];
+
+ /* do we hit a valid index page? */
+ max_item_index = (apr_uint64_t)header->page_size
+ * (last_entry - first_entry);
+ if (baton->item_index >= max_item_index)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s exceeds l2p limit "
+ "of %s for revision %ld"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ baton->item_index),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ max_item_index),
+ baton->revision);
+
+ /* all pages are of the same size and full, except for the last one */
+ baton->page_offset = (apr_uint32_t)(baton->item_index % header->page_size);
+ baton->page_no = (apr_uint32_t)(baton->item_index / header->page_size);
+ baton->entry = first_entry[baton->page_no];
+ }
+
+ baton->first_revision = header->first_revision;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_page_info_baton_t *BATON from l2p_header_t *DATA into the output
+ * fields in *BATON.
+ */
+static svn_error_t *
+l2p_header_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve all pointer values of in-cache data */
+ const l2p_header_t *header = data;
+ const l2p_page_table_entry_t *page_table
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table);
+ const apr_size_t *page_table_index
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table_index);
+
+ /* copy the info */
+ return l2p_header_copy(baton, header, page_table, page_table_index,
+ result_pool);
+}
+
+/* Read COUNT run-length-encoded (see rle_array) uint64 from STREAM and
+ * return them in VALUES.
+ */
+static svn_error_t *
+expand_rle(apr_array_header_t *values,
+ svn_fs_x__packed_number_stream_t *stream,
+ apr_size_t count)
+{
+ apr_array_clear(values);
+
+ while (count)
+ {
+ apr_uint64_t value;
+ SVN_ERR(packed_stream_get(&value, stream));
+
+ if (value)
+ {
+ APR_ARRAY_PUSH(values, apr_uint64_t) = value;
+ --count;
+ }
+ else
+ {
+ apr_uint64_t i;
+ apr_uint64_t repetitions;
+ SVN_ERR(packed_stream_get(&repetitions, stream));
+ if (++repetitions > count)
+ repetitions = count;
+
+ for (i = 0; i < repetitions; ++i)
+ APR_ARRAY_PUSH(values, apr_uint64_t) = 1;
+
+ count -= repetitions;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* If REV_FILE->L2P_STREAM is NULL, create a new stream for the log-to-phys
+ * index for REVISION in FS and return it in REV_FILE.
+ */
+static svn_error_t *
+auto_open_l2p_index(svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision)
+{
+ if (rev_file->l2p_stream == NULL)
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ SVN_ERR(svn_fs_x__auto_read_footer(rev_file));
+ SVN_ERR(packed_stream_open(&rev_file->l2p_stream,
+ rev_file->file,
+ rev_file->l2p_offset,
+ rev_file->p2l_offset,
+ L2P_STREAM_PREFIX,
+ (apr_size_t)ffd->block_size,
+ rev_file->pool,
+ rev_file->pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the header data structure of the log-to-phys index for REVISION
+ * in FS and return it in *HEADER, allocated in RESULT_POOL. Use REV_FILE
+ * to access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_header_body(l2p_header_t **header,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_uint64_t value;
+ apr_size_t i;
+ apr_size_t page, page_count;
+ apr_off_t offset;
+ l2p_header_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ apr_size_t page_table_index;
+ svn_revnum_t next_rev;
+ apr_array_header_t *expanded_values
+ = apr_array_make(scratch_pool, 16, sizeof(apr_uint64_t));
+
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(auto_open_l2p_index(rev_file, fs, revision));
+ packed_stream_seek(rev_file->l2p_stream, 0);
+
+ /* Read the table sizes. Check the data for plausibility and
+ * consistency with other bits. */
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->first_revision = (svn_revnum_t)value;
+ if (result->first_revision != rev_file->start_revision)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index rev / pack file revision numbers do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->revision_count = (int)value;
+ if ( result->revision_count != 1
+ && result->revision_count != (apr_uint64_t)ffd->max_files_per_dir)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid number of revisions in L2P index"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->page_size = (apr_uint32_t)value;
+ if (!result->page_size || (result->page_size & (result->page_size - 1)))
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P index page size is not a power of two"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ page_count = (apr_size_t)value;
+ if (page_count < result->revision_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Fewer L2P index pages than revisions"));
+ if (page_count > (rev_file->p2l_offset - rev_file->l2p_offset) / 2)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P index page count implausibly large"));
+
+ next_rev = result->first_revision + (svn_revnum_t)result->revision_count;
+ if (result->first_revision > revision || next_rev <= revision)
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Corrupt L2P index for r%ld only covers r%ld:%ld"),
+ revision, result->first_revision, next_rev);
+
+ /* allocate the page tables */
+ result->page_table
+ = apr_pcalloc(result_pool, page_count * sizeof(*result->page_table));
+ result->page_table_index
+ = apr_pcalloc(result_pool, (result->revision_count + 1)
+ * sizeof(*result->page_table_index));
+
+ /* read per-revision page table sizes (i.e. number of pages per rev) */
+ page_table_index = 0;
+ result->page_table_index[0] = page_table_index;
+ SVN_ERR(expand_rle(expanded_values, rev_file->l2p_stream,
+ result->revision_count));
+ for (i = 0; i < result->revision_count; ++i)
+ {
+ value = (apr_size_t)APR_ARRAY_IDX(expanded_values, i, apr_uint64_t);
+ if (value == 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Revision with no L2P index pages"));
+
+ page_table_index += (apr_size_t)value;
+ if (page_table_index > page_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P page table exceeded"));
+
+ result->page_table_index[i+1] = page_table_index;
+ }
+
+ if (page_table_index != page_count)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Revisions do not cover the full L2P index page table"));
+
+ /* read actual page tables */
+ for (page = 0; page < page_count; ++page)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value == 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Empty L2P index page"));
+
+ result->page_table[page].size = (apr_uint32_t)value;
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value > result->page_size)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Page exceeds L2P index page size"));
+
+ result->page_table[page].entry_count = (apr_uint32_t)value;
+ }
+
+ /* correct the page description offsets */
+ offset = packed_stream_offset(rev_file->l2p_stream);
+ for (page = 0; page < page_count; ++page)
+ {
+ result->page_table[page].offset = offset;
+ offset += result->page_table[page].size;
+ }
+
+ /* return and cache the header */
+ *header = result;
+ SVN_ERR(svn_cache__set(ffd->l2p_header_cache, &key, result, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Get the page info requested in *BATON from FS and set the output fields
+ * in *BATON.
+ * To maximize efficiency, use or return the data stream in *STREAM.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_page_info(l2p_page_info_baton_t *baton,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ l2p_header_t *result;
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* try to find the info in the cache */
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = base_revision(fs, baton->revision);
+ key.second = svn_fs_x__is_packed_rev(fs, baton->revision);
+ SVN_ERR(svn_cache__get_partial((void**)&dummy, &is_cached,
+ ffd->l2p_header_cache, &key,
+ l2p_header_access_func, baton,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* read from disk, cache and copy the result */
+ SVN_ERR(get_l2p_header_body(&result, rev_file, fs, baton->revision,
+ scratch_pool, scratch_pool));
+ SVN_ERR(l2p_header_copy(baton, result, result->page_table,
+ result->page_table_index, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the log-to-phys header info of the index covering REVISION from FS
+ * and return it in *HEADER. REV_FILE provides the pack / rev status.
+ * Allocate *HEADER in RESULT_POOL, use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+get_l2p_header(l2p_header_t **header,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+
+ /* first, try cache lookop */
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+ SVN_ERR(svn_cache__get((void**)header, &is_cached, ffd->l2p_header_cache,
+ &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* read from disk and cache the result */
+ SVN_ERR(get_l2p_header_body(header, rev_file, fs, revision, result_pool,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* From the log-to-phys index file starting at START_REVISION in FS, read
+ * the mapping page identified by TABLE_ENTRY and return it in *PAGE.
+ * Use REV_FILE to access on-disk files.
+ * Use RESULT_POOL for allocations.
+ */
+static svn_error_t *
+get_l2p_page(l2p_page_t **page,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t start_revision,
+ l2p_page_table_entry_t *table_entry,
+ apr_pool_t *result_pool)
+{
+ apr_uint64_t value, last_value = 0;
+ apr_uint32_t i;
+ l2p_page_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ apr_uint64_t container_count;
+ apr_off_t *container_offsets;
+
+ /* open index file and select page */
+ SVN_ERR(auto_open_l2p_index(rev_file, fs, start_revision));
+ packed_stream_seek(rev_file->l2p_stream, table_entry->offset);
+
+ /* initialize the page content */
+ result->entry_count = table_entry->entry_count;
+ result->offsets = apr_pcalloc(result_pool, result->entry_count
+ * sizeof(*result->offsets));
+ result->sub_items = apr_pcalloc(result_pool, result->entry_count
+ * sizeof(*result->sub_items));
+
+ /* container offsets array */
+
+ SVN_ERR(packed_stream_get(&container_count, rev_file->l2p_stream));
+ container_offsets = apr_pcalloc(result_pool,
+ container_count * sizeof(*result));
+ for (i = 0; i < container_count; ++i)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ last_value += value;
+ container_offsets[i] = (apr_off_t)last_value - 1;
+ /* '-1' is represented as '0' in the index file */
+ }
+
+ /* read all page entries (offsets in rev file and container sub-items) */
+ for (i = 0; i < result->entry_count; ++i)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ if (value == 0)
+ {
+ result->offsets[i] = -1;
+ result->sub_items[i] = 0;
+ }
+ else if (value <= container_count)
+ {
+ result->offsets[i] = container_offsets[value - 1];
+ SVN_ERR(packed_stream_get(&value, rev_file->l2p_stream));
+ result->sub_items[i] = (apr_uint32_t)value;
+ }
+ else
+ {
+ result->offsets[i] = (apr_off_t)(value - 1 - container_count);
+ result->sub_items[i] = 0;
+ }
+ }
+
+ /* After reading all page entries, the read cursor must have moved by
+ * TABLE_ENTRY->SIZE bytes. */
+ if ( packed_stream_offset(rev_file->l2p_stream)
+ != table_entry->offset + table_entry->size)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("L2P actual page size does not match page table value."));
+
+ *page = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Request data structure for l2p_page_access_func.
+ */
+typedef struct l2p_page_baton_t
+{
+ /* in data */
+ /* revision. Used for error messages only */
+ svn_revnum_t revision;
+
+ /* item index to look up. Used for error messages only */
+ apr_uint64_t item_index;
+
+ /* offset within the cached page */
+ apr_uint32_t page_offset;
+
+ /* out data */
+ /* absolute item or container offset in rev / pack file */
+ apr_off_t offset;
+
+ /* 0 -> container / item itself; sub-item in container otherwise */
+ apr_uint32_t sub_item;
+
+} l2p_page_baton_t;
+
+/* Return the rev / pack file offset of the item at BATON->PAGE_OFFSET in
+ * OFFSETS of PAGE and write it to *OFFSET.
+ * Allocate temporaries in SCRATCH_POOL.
+ */
+static svn_error_t *
+l2p_page_get_offset(l2p_page_baton_t *baton,
+ const l2p_page_t *page,
+ const apr_off_t *offsets,
+ const apr_uint32_t *sub_items,
+ apr_pool_t *scratch_pool)
+{
+ /* overflow check */
+ if (page->entry_count <= baton->page_offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Item index %s too large in"
+ " revision %ld"),
+ apr_psprintf(scratch_pool, "%" APR_UINT64_T_FMT,
+ baton->item_index),
+ baton->revision);
+
+ /* return the result */
+ baton->offset = offsets[baton->page_offset];
+ baton->sub_item = sub_items[baton->page_offset];
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_page_baton_t *BATON from l2p_page_t *DATA into apr_off_t *OUT.
+ */
+static svn_error_t *
+l2p_page_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve all in-cache pointers */
+ const l2p_page_t *page = data;
+ const apr_off_t *offsets
+ = svn_temp_deserializer__ptr(page, (const void *const *)&page->offsets);
+ const apr_uint32_t *sub_items
+ = svn_temp_deserializer__ptr(page, (const void *const *)&page->sub_items);
+
+ /* return the requested data */
+ return l2p_page_get_offset(baton, page, offsets, sub_items, result_pool);
+}
+
+/* Data request structure used by l2p_page_table_access_func.
+ */
+typedef struct l2p_page_table_baton_t
+{
+ /* revision for which to read the page table */
+ svn_revnum_t revision;
+
+ /* page table entries (of type l2p_page_table_entry_t).
+ * Must be created by caller and will be filled by callee. */
+ apr_array_header_t *pages;
+} l2p_page_table_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t: copy the data requested in
+ * l2p_page_baton_t *BATON from l2p_page_t *DATA into BATON->PAGES and *OUT.
+ */
+static svn_error_t *
+l2p_page_table_access_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* resolve in-cache pointers */
+ l2p_page_table_baton_t *table_baton = baton;
+ const l2p_header_t *header = (const l2p_header_t *)data;
+ const l2p_page_table_entry_t *page_table
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table);
+ const apr_size_t *page_table_index
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->page_table_index);
+
+ /* copy the revision's page table into BATON */
+ apr_size_t rel_revision = table_baton->revision - header->first_revision;
+ if (rel_revision < header->revision_count)
+ {
+ const l2p_page_table_entry_t *entry
+ = page_table + page_table_index[rel_revision];
+ const l2p_page_table_entry_t *last_entry
+ = page_table + page_table_index[rel_revision + 1];
+
+ for (; entry < last_entry; ++entry)
+ APR_ARRAY_PUSH(table_baton->pages, l2p_page_table_entry_t)
+ = *entry;
+ }
+
+ /* set output as a courtesy to the caller */
+ *out = table_baton->pages;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the l2p index page table for REVISION in FS from cache and return
+ * it in PAGES. The later must be provided by the caller (and can be
+ * re-used); existing entries will be removed before writing the result.
+ * If the data cannot be found in the cache, the result will be empty
+ * (it never can be empty for a valid REVISION if the data is cached).
+ * Use the info from REV_FILE to determine pack / rev file properties.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_l2p_page_table(apr_array_header_t *pages,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_boolean_t is_cached = FALSE;
+ l2p_page_table_baton_t baton;
+
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = base_revision(fs, revision);
+ key.second = svn_fs_x__is_packed_rev(fs, revision);
+
+ apr_array_clear(pages);
+ baton.revision = revision;
+ baton.pages = pages;
+ SVN_ERR(svn_cache__get_partial((void**)&pages, &is_cached,
+ ffd->l2p_header_cache, &key,
+ l2p_page_table_access_func, &baton,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility function. Read the l2p index pages for REVISION in FS from
+ * STREAM and put them into the cache. Skip page number EXLCUDED_PAGE_NO
+ * (use -1 for 'skip none') and pages outside the MIN_OFFSET, MAX_OFFSET
+ * range in the l2p index file. The index is being identified by
+ * FIRST_REVISION. PAGES is a scratch container provided by the caller.
+ * SCRATCH_POOL is used for temporary allocations.
+ *
+ * This function may be a no-op if the header cache lookup fails / misses.
+ */
+static svn_error_t *
+prefetch_l2p_pages(svn_boolean_t *end,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t first_revision,
+ svn_revnum_t revision,
+ apr_array_header_t *pages,
+ int exlcuded_page_no,
+ apr_off_t min_offset,
+ apr_off_t max_offset,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ int i;
+ apr_pool_t *iterpool;
+ svn_fs_x__page_cache_key_t key = { 0 };
+
+ /* Parameter check. */
+ if (min_offset < 0)
+ min_offset = 0;
+
+ if (max_offset <= 0)
+ {
+ /* Nothing to do */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* get the page table for REVISION from cache */
+ *end = FALSE;
+ SVN_ERR(get_l2p_page_table(pages, fs, revision, scratch_pool));
+ if (pages->nelts == 0)
+ {
+ /* not found -> we can't continue without hitting the disk again */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* prefetch pages individually until all are done or we found one in
+ * the cache */
+ iterpool = svn_pool_create(scratch_pool);
+ assert(revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)revision;
+ key.is_packed = svn_fs_x__is_packed_rev(fs, revision);
+
+ for (i = 0; i < pages->nelts && !*end; ++i)
+ {
+ svn_boolean_t is_cached;
+
+ l2p_page_table_entry_t *entry
+ = &APR_ARRAY_IDX(pages, i, l2p_page_table_entry_t);
+ svn_pool_clear(iterpool);
+
+ if (i == exlcuded_page_no)
+ continue;
+
+ /* skip pages outside the specified index file range */
+ if ( entry->offset < (apr_uint64_t)min_offset
+ || entry->offset + entry->size > (apr_uint64_t)max_offset)
+ {
+ *end = TRUE;
+ continue;
+ }
+
+ /* page already in cache? */
+ key.page = i;
+ SVN_ERR(svn_cache__has_key(&is_cached, ffd->l2p_page_cache,
+ &key, iterpool));
+ if (!is_cached)
+ {
+ /* no in cache -> read from stream (data already buffered in APR)
+ * and cache the result */
+ l2p_page_t *page = NULL;
+ SVN_ERR(get_l2p_page(&page, rev_file, fs, first_revision,
+ entry, iterpool));
+
+ SVN_ERR(svn_cache__set(ffd->l2p_page_cache, &key, page,
+ iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Using the log-to-phys indexes in FS, find the absolute offset in the
+ * rev file for (REVISION, ITEM_INDEX) and return it in *OFFSET.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_index_lookup(apr_off_t *offset,
+ apr_uint32_t *sub_item,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ l2p_page_info_baton_t info_baton;
+ l2p_page_baton_t page_baton;
+ l2p_page_t *page = NULL;
+ svn_fs_x__page_cache_key_t key = { 0 };
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* read index master data structure and extract the info required to
+ * access the l2p index page for (REVISION,ITEM_INDEX)*/
+ info_baton.revision = revision;
+ info_baton.item_index = item_index;
+ SVN_ERR(get_l2p_page_info(&info_baton, rev_file, fs, scratch_pool));
+
+ /* try to find the page in the cache and get the OFFSET from it */
+ page_baton.revision = revision;
+ page_baton.item_index = item_index;
+ page_baton.page_offset = info_baton.page_offset;
+
+ assert(revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)revision;
+ key.is_packed = svn_fs_x__is_packed_rev(fs, revision);
+ key.page = info_baton.page_no;
+
+ SVN_ERR(svn_cache__get_partial(&dummy, &is_cached,
+ ffd->l2p_page_cache, &key,
+ l2p_page_access_func, &page_baton,
+ scratch_pool));
+
+ if (!is_cached)
+ {
+ /* we need to read the info from disk (might already be in the
+ * APR file buffer, though) */
+ apr_array_header_t *pages;
+ svn_revnum_t prefetch_revision;
+ svn_revnum_t last_revision
+ = info_baton.first_revision
+ + svn_fs_x__pack_size(fs, info_baton.first_revision);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_boolean_t end;
+ apr_off_t max_offset
+ = APR_ALIGN(info_baton.entry.offset + info_baton.entry.size,
+ ffd->block_size);
+ apr_off_t min_offset = max_offset - ffd->block_size;
+
+ /* read the relevant page */
+ SVN_ERR(get_l2p_page(&page, rev_file, fs, info_baton.first_revision,
+ &info_baton.entry, scratch_pool));
+
+ /* cache the page and extract the result we need */
+ SVN_ERR(svn_cache__set(ffd->l2p_page_cache, &key, page, scratch_pool));
+ SVN_ERR(l2p_page_get_offset(&page_baton, page, page->offsets,
+ page->sub_items, scratch_pool));
+
+ /* prefetch pages from following and preceding revisions */
+ pages = apr_array_make(scratch_pool, 16,
+ sizeof(l2p_page_table_entry_t));
+ end = FALSE;
+ for (prefetch_revision = revision;
+ prefetch_revision < last_revision && !end;
+ ++prefetch_revision)
+ {
+ int excluded_page_no = prefetch_revision == revision
+ ? info_baton.page_no
+ : -1;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(prefetch_l2p_pages(&end, fs, rev_file,
+ info_baton.first_revision,
+ prefetch_revision, pages,
+ excluded_page_no, min_offset,
+ max_offset, iterpool));
+ }
+
+ end = FALSE;
+ for (prefetch_revision = revision-1;
+ prefetch_revision >= info_baton.first_revision && !end;
+ --prefetch_revision)
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(prefetch_l2p_pages(&end, fs, rev_file,
+ info_baton.first_revision,
+ prefetch_revision, pages, -1,
+ min_offset, max_offset, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ *offset = page_baton.offset;
+ *sub_item = page_baton.sub_item;
+
+ return SVN_NO_ERROR;
+}
+
+/* Using the log-to-phys proto index in transaction TXN_ID in FS, find the
+ * absolute offset in the proto rev file for the given ITEM_INDEX and return
+ * it in *OFFSET. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+l2p_proto_index_lookup(apr_off_t *offset,
+ apr_uint32_t *sub_item,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t eof = FALSE;
+ apr_file_t *file = NULL;
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_l2p_proto_index(fs, txn_id,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ /* process all entries until we fail due to EOF */
+ *offset = -1;
+ while (!eof)
+ {
+ l2p_proto_entry_t entry;
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_l2p_entry_from_proto_index(file, &entry, &eof,
+ scratch_pool));
+
+ /* handle new revision */
+ if (!eof && entry.item_index == item_index)
+ {
+ *offset = (apr_off_t)entry.offset - 1;
+ *sub_item = entry.sub_item;
+ break;
+ }
+ }
+
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__l2p_get_max_ids(apr_array_header_t **max_ids,
+ svn_fs_t *fs,
+ svn_revnum_t start_rev,
+ apr_size_t count,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ l2p_header_t *header = NULL;
+ svn_revnum_t revision;
+ svn_revnum_t last_rev = (svn_revnum_t)(start_rev + count);
+ svn_fs_x__revision_file_t *rev_file;
+ apr_pool_t *header_pool = svn_pool_create(scratch_pool);
+
+ /* read index master data structure for the index covering START_REV */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, start_rev,
+ header_pool, header_pool));
+ SVN_ERR(get_l2p_header(&header, rev_file, fs, start_rev, header_pool,
+ header_pool));
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+
+ /* Determine the length of the item index list for each rev.
+ * Read new index headers as required. */
+ *max_ids = apr_array_make(result_pool, (int)count, sizeof(apr_uint64_t));
+ for (revision = start_rev; revision < last_rev; ++revision)
+ {
+ apr_uint64_t full_page_count;
+ apr_uint64_t item_count;
+ apr_size_t first_page_index, last_page_index;
+
+ if (revision >= header->first_revision + header->revision_count)
+ {
+ /* need to read the next index. Clear up memory used for the
+ * previous one. Note that intermittent pack runs do not change
+ * the number of items in a revision, i.e. there is no consistency
+ * issue here. */
+ svn_pool_clear(header_pool);
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, revision,
+ header_pool, header_pool));
+ SVN_ERR(get_l2p_header(&header, rev_file, fs, revision,
+ header_pool, header_pool));
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+ }
+
+ /* in a revision with N index pages, the first N-1 index pages are
+ * "full", i.e. contain HEADER->PAGE_SIZE entries */
+ first_page_index
+ = header->page_table_index[revision - header->first_revision];
+ last_page_index
+ = header->page_table_index[revision - header->first_revision + 1];
+ full_page_count = last_page_index - first_page_index - 1;
+ item_count = full_page_count * header->page_size
+ + header->page_table[last_page_index - 1].entry_count;
+
+ APR_ARRAY_PUSH(*max_ids, apr_uint64_t) = item_count;
+ }
+
+ svn_pool_destroy(header_pool);
+ return SVN_NO_ERROR;
+}
+
+/*
+ * phys-to-log index
+ */
+svn_fs_x__p2l_entry_t *
+svn_fs_x__p2l_entry_dup(const svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__p2l_entry_t *new_entry = apr_pmemdup(result_pool, entry,
+ sizeof(*new_entry));
+ if (new_entry->item_count)
+ new_entry->items = apr_pmemdup(result_pool,
+ entry->items,
+ entry->item_count * sizeof(*entry->items));
+
+ return new_entry;
+}
+
+/*
+ * phys-to-log index
+ */
+svn_error_t *
+svn_fs_x__p2l_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(svn_io_file_open(proto_index, file_name, APR_READ | APR_WRITE
+ | APR_CREATE | APR_APPEND | APR_BUFFERED,
+ APR_OS_DEFAULT, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__p2l_proto_index_add_entry(apr_file_t *proto_index,
+ const svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t revision;
+ apr_int32_t i;
+
+ /* Make sure all signed elements of ENTRY have non-negative values.
+ *
+ * For file offsets and sizes, this is a given as we use them to describe
+ * absolute positions and sizes. For revisions, SVN_INVALID_REVNUM is
+ * valid, hence we have to shift it by 1.
+ */
+ SVN_ERR_ASSERT(entry->offset >= 0);
+ SVN_ERR_ASSERT(entry->size >= 0);
+
+ /* Now, all values will nicely convert to uint64. */
+ /* Make sure to keep P2L_PROTO_INDEX_ENTRY_SIZE consistent with this: */
+
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->offset,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->size,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->type,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->fnv1_checksum,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, entry->item_count,
+ scratch_pool));
+
+ /* Add sub-items. */
+ for (i = 0; i < entry->item_count; ++i)
+ {
+ const svn_fs_x__id_t *sub_item = &entry->items[i];
+
+ /* Make sure all signed elements of ENTRY have non-negative values.
+ *
+ * For file offsets and sizes, this is a given as we use them to
+ * describe absolute positions and sizes. For revisions,
+ * SVN_INVALID_REVNUM is valid, hence we have to shift it by 1.
+ */
+ SVN_ERR_ASSERT( sub_item->change_set >= 0
+ || sub_item->change_set == SVN_INVALID_REVNUM);
+
+ /* Write sub- record. */
+ revision = sub_item->change_set == SVN_INVALID_REVNUM
+ ? 0
+ : ((apr_uint64_t)sub_item->change_set + 1);
+
+ SVN_ERR(write_uint64_to_proto_index(proto_index, revision,
+ scratch_pool));
+ SVN_ERR(write_uint64_to_proto_index(proto_index, sub_item->number,
+ scratch_pool));
+ }
+
+ /* Add trailer: rev / pack file offset of the next item */
+ SVN_ERR(write_uint64_to_proto_index(proto_index,
+ entry->offset + entry->size,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read *ENTRY from log-to-phys PROTO_INDEX file and indicate end-of-file
+ * in *EOF, or error out in that case if EOF is NULL. *ENTRY is in an
+ * undefined state if an end-of-file occurred.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+read_p2l_entry_from_proto_index(apr_file_t *proto_index,
+ svn_fs_x__p2l_entry_t *entry,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(read_off_t_from_proto_index(proto_index, &entry->offset,
+ eof, scratch_pool));
+ SVN_ERR(read_off_t_from_proto_index(proto_index, &entry->size,
+ eof, scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->type,
+ eof, scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->fnv1_checksum,
+ eof, scratch_pool));
+ SVN_ERR(read_uint32_from_proto_index(proto_index, &entry->item_count,
+ eof, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+read_p2l_sub_items_from_proto_index(apr_file_t *proto_index,
+ svn_fs_x__p2l_entry_t *entry,
+ svn_boolean_t *eof,
+ apr_pool_t *scratch_pool)
+{
+ apr_int32_t i;
+ for (i = 0; i < entry->item_count; ++i)
+ {
+ apr_uint64_t revision;
+ svn_fs_x__id_t *sub_item = &entry->items[i];
+
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &revision,
+ eof, scratch_pool));
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &sub_item->number,
+ eof, scratch_pool));
+
+ /* Do the inverse REVSION number conversion (see
+ * svn_fs_x__p2l_proto_index_add_entry), if we actually read a
+ * complete record.
+ */
+ if (!eof || !*eof)
+ {
+ /* Be careful with the arithmetics here (overflows and wrap-around):
+ */
+ if (revision > 0 && revision - 1 > LONG_MAX)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW, NULL,
+ _("Revision 0x%s too large, max = 0x%s"),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ revision),
+ apr_psprintf(scratch_pool,
+ "%" APR_UINT64_T_FMT,
+ (apr_uint64_t)LONG_MAX));
+
+ /* Shortening conversion from unsigned to signed int is well-
+ * defined and not lossy in C because the value can be represented
+ * in the target type. Also, cast to 'long' instead of
+ * 'svn_revnum_t' here to provoke a compiler warning if those
+ * types should differ and we would need to change the overflow
+ * checking logic.
+ */
+ sub_item->change_set = revision == 0
+ ? SVN_INVALID_REVNUM
+ : (long)(revision - 1);
+ }
+
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_proto_index_next_offset(apr_off_t *next_offset,
+ apr_file_t *proto_index,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset = 0;
+
+ /* Empty index file? */
+ SVN_ERR(svn_io_file_seek(proto_index, APR_END, &offset, scratch_pool));
+ if (offset == 0)
+ {
+ *next_offset = 0;
+ }
+ else
+ {
+ /* The last 64 bits contain the value we are looking for. */
+ offset -= sizeof(apr_uint64_t);
+ SVN_ERR(svn_io_file_seek(proto_index, APR_SET, &offset, scratch_pool));
+ SVN_ERR(read_off_t_from_proto_index(proto_index, next_offset, NULL,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_uint64_t page_size = ffd->p2l_page_size;
+ apr_file_t *proto_index = NULL;
+ svn_stream_t *stream;
+ int i;
+ apr_uint32_t sub_item;
+ svn_boolean_t eof = FALSE;
+ unsigned char encoded[ENCODED_INT_LENGTH];
+
+ apr_uint64_t last_entry_end = 0;
+ apr_uint64_t last_page_end = 0;
+ apr_size_t last_buffer_size = 0; /* byte offset in the spill buffer at
+ the begin of the current revision */
+ apr_uint64_t file_size = 0;
+
+ /* temporary data structures that collect the data which will be moved
+ to the target file in a second step */
+ apr_pool_t *local_pool = svn_pool_create(scratch_pool);
+ apr_array_header_t *table_sizes
+ = apr_array_make(local_pool, 16, sizeof(apr_uint64_t));
+
+ /* 64k blocks, spill after 16MB */
+ svn_spillbuf_t *buffer
+ = svn_spillbuf__create(0x10000, 0x1000000, local_pool);
+
+ /* for loop temps ... */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* start at the beginning of the source file */
+ SVN_ERR(svn_io_file_open(&proto_index, proto_file_name,
+ APR_READ | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, local_pool));
+
+ /* process all entries until we fail due to EOF */
+ while (!eof)
+ {
+ svn_fs_x__p2l_entry_t entry;
+ apr_uint64_t entry_end;
+ svn_boolean_t new_page = svn_spillbuf__get_size(buffer) == 0;
+ svn_revnum_t last_revision = revision;
+ apr_uint64_t last_number = 0;
+
+ svn_pool_clear(iterpool);
+
+ /* (attempt to) read the next entry from the source */
+ SVN_ERR(read_p2l_entry_from_proto_index(proto_index, &entry,
+ &eof, iterpool));
+
+ if (entry.item_count && !eof)
+ {
+ entry.items = apr_palloc(iterpool,
+ entry.item_count * sizeof(*entry.items));
+ SVN_ERR(read_p2l_sub_items_from_proto_index(proto_index, &entry,
+ &eof, iterpool));
+ }
+
+ /* Read entry trailer. However, we won't need its content. */
+ if (!eof)
+ {
+ apr_uint64_t trailer;
+ SVN_ERR(read_uint64_from_proto_index(proto_index, &trailer, &eof,
+ scratch_pool));
+ }
+
+ /* "unused" (and usually non-existent) section to cover the offsets
+ at the end the of the last page. */
+ if (eof)
+ {
+ file_size = last_entry_end;
+
+ entry.offset = last_entry_end;
+ entry.size = APR_ALIGN(entry.offset, page_size) - entry.offset;
+ entry.type = SVN_FS_X__ITEM_TYPE_UNUSED;
+ entry.fnv1_checksum = 0;
+ entry.item_count = 0;
+ entry.items = NULL;
+ }
+
+ for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
+ if (entry.items[sub_item].change_set == SVN_FS_X__INVALID_CHANGE_SET)
+ entry.items[sub_item].change_set
+ = svn_fs_x__change_set_by_rev(revision);
+
+ /* end pages if entry is extending beyond their boundaries */
+ entry_end = entry.offset + entry.size;
+ while (entry_end - last_page_end > page_size)
+ {
+ apr_uint64_t buffer_size = svn_spillbuf__get_size(buffer);
+ APR_ARRAY_PUSH(table_sizes, apr_uint64_t)
+ = buffer_size - last_buffer_size;
+
+ last_buffer_size = buffer_size;
+ last_page_end += page_size;
+ new_page = TRUE;
+ }
+
+ /* this entry starts a new table -> store its offset
+ (all following entries in the same table will store sizes only) */
+ if (new_page)
+ {
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.offset),
+ iterpool));
+ last_revision = revision;
+ }
+
+ /* write simple item / container entry */
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.size),
+ iterpool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.type + entry.item_count * 16),
+ iterpool));
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_uint(encoded, entry.fnv1_checksum),
+ iterpool));
+
+ /* container contents (only one for non-container items) */
+ for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
+ {
+ svn_revnum_t item_rev
+ = svn_fs_x__get_revnum(entry.items[sub_item].change_set);
+ apr_int64_t diff = item_rev - last_revision;
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_int(encoded, diff),
+ iterpool));
+ last_revision = item_rev;
+ }
+
+ for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
+ {
+ apr_int64_t diff = entry.items[sub_item].number - last_number;
+ SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
+ encode_int(encoded, diff),
+ iterpool));
+ last_number = entry.items[sub_item].number;
+ }
+
+ last_entry_end = entry_end;
+ }
+
+ /* close the source file */
+ SVN_ERR(svn_io_file_close(proto_index, local_pool));
+
+ /* store length of last table */
+ APR_ARRAY_PUSH(table_sizes, apr_uint64_t)
+ = svn_spillbuf__get_size(buffer) - last_buffer_size;
+
+ /* Open target stream. */
+ stream = svn_stream_checksummed2(svn_stream_from_aprfile2(index_file, TRUE,
+ local_pool),
+ NULL, checksum, svn_checksum_md5, FALSE,
+ result_pool);
+
+ /* write the start revision, file size and page size */
+ SVN_ERR(svn_stream_puts(stream, P2L_STREAM_PREFIX));
+ SVN_ERR(stream_write_encoded(stream, revision));
+ SVN_ERR(stream_write_encoded(stream, file_size));
+ SVN_ERR(stream_write_encoded(stream, page_size));
+
+ /* write the page table (actually, the sizes of each page description) */
+ SVN_ERR(stream_write_encoded(stream, table_sizes->nelts));
+ for (i = 0; i < table_sizes->nelts; ++i)
+ {
+ apr_uint64_t value = APR_ARRAY_IDX(table_sizes, i, apr_uint64_t);
+ SVN_ERR(stream_write_encoded(stream, value));
+ }
+
+ /* append page contents and implicitly close STREAM */
+ SVN_ERR(svn_stream_copy3(svn_stream__from_spillbuf(buffer, local_pool),
+ stream, NULL, NULL, local_pool));
+
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(local_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* If REV_FILE->P2L_STREAM is NULL, create a new stream for the phys-to-log
+ * index for REVISION in FS using the rev / pack file provided by REV_FILE.
+ */
+static svn_error_t *
+auto_open_p2l_index(svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision)
+{
+ if (rev_file->p2l_stream == NULL)
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ SVN_ERR(svn_fs_x__auto_read_footer(rev_file));
+ SVN_ERR(packed_stream_open(&rev_file->p2l_stream,
+ rev_file->file,
+ rev_file->p2l_offset,
+ rev_file->footer_offset,
+ P2L_STREAM_PREFIX,
+ (apr_size_t)ffd->block_size,
+ rev_file->pool,
+ rev_file->pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Data structure that describes which p2l page info shall be extracted
+ * from the cache and contains the fields that receive the result.
+ */
+typedef struct p2l_page_info_baton_t
+{
+ /* input variables */
+ /* revision identifying the index file */
+ svn_revnum_t revision;
+
+ /* offset within the page in rev / pack file */
+ apr_off_t offset;
+
+ /* output variables */
+ /* page containing OFFSET */
+ apr_size_t page_no;
+
+ /* first revision in this p2l index */
+ svn_revnum_t first_revision;
+
+ /* offset within the p2l index file describing this page */
+ apr_off_t start_offset;
+
+ /* offset within the p2l index file describing the following page */
+ apr_off_t next_offset;
+
+ /* PAGE_NO * PAGE_SIZE (if <= OFFSET) */
+ apr_off_t page_start;
+
+ /* total number of pages indexed */
+ apr_size_t page_count;
+
+ /* size of each page in pack / rev file */
+ apr_uint64_t page_size;
+} p2l_page_info_baton_t;
+
+/* From HEADER and the list of all OFFSETS, fill BATON with the page info
+ * requested by BATON->OFFSET.
+ */
+static void
+p2l_page_info_copy(p2l_page_info_baton_t *baton,
+ const p2l_header_t *header,
+ const apr_off_t *offsets)
+{
+ /* if the requested offset is out of bounds, return info for
+ * a zero-sized empty page right behind the last page.
+ */
+ if (baton->offset / header->page_size < header->page_count)
+ {
+ /* This cast is safe because the value is < header->page_count. */
+ baton->page_no = (apr_size_t)(baton->offset / header->page_size);
+ baton->start_offset = offsets[baton->page_no];
+ baton->next_offset = offsets[baton->page_no + 1];
+ baton->page_size = header->page_size;
+ }
+ else
+ {
+ /* Beyond the last page. */
+ baton->page_no = header->page_count;
+ baton->start_offset = offsets[baton->page_no];
+ baton->next_offset = offsets[baton->page_no];
+ baton->page_size = 0;
+ }
+
+ baton->first_revision = header->first_revision;
+ baton->page_start = (apr_off_t)(header->page_size * baton->page_no);
+ baton->page_count = header->page_count;
+}
+
+/* Implement svn_cache__partial_getter_func_t: extract the p2l page info
+ * requested by BATON and return it in BATON.
+ */
+static svn_error_t *
+p2l_page_info_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* all the pointers to cached data we need */
+ const p2l_header_t *header = data;
+ const apr_off_t *offsets
+ = svn_temp_deserializer__ptr(header,
+ (const void *const *)&header->offsets);
+
+ /* copy data from cache to BATON */
+ p2l_page_info_copy(baton, header, offsets);
+ return SVN_NO_ERROR;
+}
+
+/* Read the header data structure of the phys-to-log index for REVISION in
+ * FS and return it in *HEADER, allocated in RESULT_POOL. Use REV_FILE to
+ * access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_p2l_header(p2l_header_t **header,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_uint64_t value;
+ apr_size_t i;
+ apr_off_t offset;
+ p2l_header_t *result;
+ svn_boolean_t is_cached = FALSE;
+
+ /* look for the header data in our cache */
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = rev_file->start_revision;
+ key.second = rev_file->is_packed;
+
+ SVN_ERR(svn_cache__get((void**)header, &is_cached, ffd->p2l_header_cache,
+ &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* not found -> must read it from disk.
+ * Open index file or position read pointer to the begin of the file */
+ SVN_ERR(auto_open_p2l_index(rev_file, fs, key.revision));
+ packed_stream_seek(rev_file->p2l_stream, 0);
+
+ /* allocate result data structure */
+ result = apr_pcalloc(result_pool, sizeof(*result));
+
+ /* Read table sizes, check them for plausibility and allocate page array. */
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->first_revision = (svn_revnum_t)value;
+ if (result->first_revision != rev_file->start_revision)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index rev / pack file revision numbers do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->file_size = value;
+ if (result->file_size != (apr_uint64_t)rev_file->l2p_offset)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Index offset and rev / pack file size do not match"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->page_size = value;
+ if (!result->page_size || (result->page_size & (result->page_size - 1)))
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L index page size is not a power of two"));
+
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->page_count = (apr_size_t)value;
+ if (result->page_count != (result->file_size - 1) / result->page_size + 1)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L page count does not match rev / pack file size"));
+
+ result->offsets
+ = apr_pcalloc(result_pool, (result->page_count + 1) * sizeof(*result->offsets));
+
+ /* read page sizes and derive page description offsets from them */
+ result->offsets[0] = 0;
+ for (i = 0; i < result->page_count; ++i)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ result->offsets[i+1] = result->offsets[i] + (apr_off_t)value;
+ }
+
+ /* correct the offset values */
+ offset = packed_stream_offset(rev_file->p2l_stream);
+ for (i = 0; i <= result->page_count; ++i)
+ result->offsets[i] += offset;
+
+ /* cache the header data */
+ SVN_ERR(svn_cache__set(ffd->p2l_header_cache, &key, result, scratch_pool));
+
+ /* return the result */
+ *header = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the header data structure of the phys-to-log index for revision
+ * BATON->REVISION in FS. Return in *BATON all info relevant to read the
+ * index page for the rev / pack file offset BATON->OFFSET. Use REV_FILE
+ * to access on-disk data. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_p2l_page_info(p2l_page_info_baton_t *baton,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ p2l_header_t *header;
+ svn_boolean_t is_cached = FALSE;
+ void *dummy = NULL;
+
+ /* look for the header data in our cache */
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = base_revision(fs, baton->revision);
+ key.second = svn_fs_x__is_packed_rev(fs, baton->revision);
+
+ SVN_ERR(svn_cache__get_partial(&dummy, &is_cached, ffd->p2l_header_cache,
+ &key, p2l_page_info_func, baton,
+ scratch_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(get_p2l_header(&header, rev_file, fs, baton->revision,
+ scratch_pool, scratch_pool));
+
+ /* copy the requested info into *BATON */
+ p2l_page_info_copy(baton, header, header->offsets);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read a mapping entry from the phys-to-log index STREAM and append it to
+ * RESULT. *ITEM_INDEX contains the phys offset for the entry and will
+ * be moved forward by the size of entry.
+ */
+static svn_error_t *
+read_entry(svn_fs_x__packed_number_stream_t *stream,
+ apr_off_t *item_offset,
+ svn_revnum_t revision,
+ apr_array_header_t *result)
+{
+ apr_uint64_t value;
+ apr_uint64_t number = 0;
+ apr_uint32_t sub_item;
+
+ svn_fs_x__p2l_entry_t entry;
+
+ entry.offset = *item_offset;
+ SVN_ERR(packed_stream_get(&value, stream));
+ entry.size = (apr_off_t)value;
+ SVN_ERR(packed_stream_get(&value, stream));
+ entry.type = (int)value % 16;
+ entry.item_count = (apr_uint32_t)(value / 16);
+
+ /* Verify item type. */
+ if (entry.type > SVN_FS_X__ITEM_TYPE_REPS_CONT)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid item type in P2L index"));
+
+ SVN_ERR(packed_stream_get(&value, stream));
+ entry.fnv1_checksum = (apr_uint32_t)value;
+
+ /* Truncating the checksum to 32 bits may have hidden random data in the
+ * unused extra bits of the on-disk representation (7/8 bit representation
+ * uses 5 bytes on disk for the 32 bit value, leaving 3 bits unused). */
+ if (value > APR_UINT32_MAX)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Invalid FNV1 checksum in P2L index"));
+
+ /* Some of the index data for empty rev / pack file sections will not be
+ * used during normal operation. Thus, we have strict rules for the
+ * contents of those unused fields. */
+ if (entry.type == SVN_FS_X__ITEM_TYPE_UNUSED)
+ if ( entry.fnv1_checksum != 0
+ || entry.item_count != 0)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Unused regions must be empty and have checksum 0"));
+
+ if (entry.item_count == 0)
+ {
+ entry.items = NULL;
+ }
+ else
+ {
+ entry.items
+ = apr_pcalloc(result->pool, entry.item_count * sizeof(*entry.items));
+
+ if ( entry.item_count > 1
+ && entry.type < SVN_FS_X__ITEM_TYPE_CHANGES_CONT)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Only containers may have more than one sub-item"));
+
+ for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
+ {
+ SVN_ERR(packed_stream_get(&value, stream));
+ revision += (svn_revnum_t)(value % 2 ? -1 - value / 2 : value / 2);
+ entry.items[sub_item].change_set
+ = svn_fs_x__change_set_by_rev(revision);
+ }
+
+ for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
+ {
+ SVN_ERR(packed_stream_get(&value, stream));
+ number += value % 2 ? -1 - value / 2 : value / 2;
+ entry.items[sub_item].number = number;
+
+ if ( ( entry.type == SVN_FS_X__ITEM_TYPE_CHANGES
+ || entry.type == SVN_FS_X__ITEM_TYPE_CHANGES_CONT)
+ && number != SVN_FS_X__ITEM_INDEX_CHANGES)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("Changed path list must have item number 1"));
+ }
+ }
+
+ APR_ARRAY_PUSH(result, svn_fs_x__p2l_entry_t) = entry;
+ *item_offset += entry.size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the phys-to-log mappings for the cluster beginning at rev file
+ * offset PAGE_START from the index for START_REVISION in FS. The data
+ * can be found in the index page beginning at START_OFFSET with the next
+ * page beginning at NEXT_OFFSET. PAGE_SIZE is the L2P index page size.
+ * Return the relevant index entries in *ENTRIES. Use REV_FILE to access
+ * on-disk data. Allocate *ENTRIES in RESULT_POOL.
+ */
+static svn_error_t *
+get_p2l_page(apr_array_header_t **entries,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t start_revision,
+ apr_off_t start_offset,
+ apr_off_t next_offset,
+ apr_off_t page_start,
+ apr_uint64_t page_size,
+ apr_pool_t *result_pool)
+{
+ apr_uint64_t value;
+ apr_array_header_t *result
+ = apr_array_make(result_pool, 16, sizeof(svn_fs_x__p2l_entry_t));
+ apr_off_t item_offset;
+ apr_off_t offset;
+
+ /* open index and navigate to page start */
+ SVN_ERR(auto_open_p2l_index(rev_file, fs, start_revision));
+ packed_stream_seek(rev_file->p2l_stream, start_offset);
+
+ /* read rev file offset of the first page entry (all page entries will
+ * only store their sizes). */
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ item_offset = (apr_off_t)value;
+
+ /* Special case: empty pages. */
+ if (start_offset == next_offset)
+ {
+ /* Empty page. This only happens if the first entry of the next page
+ * also covers this page (and possibly more) completely. */
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset, start_revision,
+ result));
+ }
+ else
+ {
+ /* Read non-empty page. */
+ do
+ {
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset,
+ start_revision, result));
+ offset = packed_stream_offset(rev_file->p2l_stream);
+ }
+ while (offset < next_offset);
+
+ /* We should now be exactly at the next offset, i.e. the numbers in
+ * the stream cannot overlap into the next page description. */
+ if (offset != next_offset)
+ return svn_error_create(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
+ _("P2L page description overlaps with next page description"));
+
+ /* if we haven't covered the cluster end yet, we must read the first
+ * entry of the next page */
+ if (item_offset < page_start + page_size)
+ {
+ SVN_ERR(packed_stream_get(&value, rev_file->p2l_stream));
+ item_offset = (apr_off_t)value;
+ SVN_ERR(read_entry(rev_file->p2l_stream, &item_offset,
+ start_revision, result));
+ }
+ }
+
+ *entries = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* If it cannot be found in FS's caches, read the p2l index page selected
+ * by BATON->OFFSET from *STREAM. If the latter is yet to be constructed,
+ * do so in STREAM_POOL. Don't read the page if it precedes MIN_OFFSET.
+ * Set *END to TRUE if the caller should stop refeching.
+ *
+ * *BATON will be updated with the selected page's info and SCRATCH_POOL
+ * will be used for temporary allocations. If the data is alread in the
+ * cache, descrease *LEAKING_BUCKET and increase it otherwise. With that
+ * pattern we will still read all pages from the block even if some of
+ * them survived in the cached.
+ */
+static svn_error_t *
+prefetch_p2l_page(svn_boolean_t *end,
+ int *leaking_bucket,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ p2l_page_info_baton_t *baton,
+ apr_off_t min_offset,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_boolean_t already_cached;
+ apr_array_header_t *page;
+ svn_fs_x__page_cache_key_t key = { 0 };
+
+ /* fetch the page info */
+ *end = FALSE;
+ baton->revision = baton->first_revision;
+ SVN_ERR(get_p2l_page_info(baton, rev_file, fs, scratch_pool));
+ if (baton->start_offset < min_offset)
+ {
+ /* page outside limits -> stop prefetching */
+ *end = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ /* do we have that page in our caches already? */
+ assert(baton->first_revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)baton->first_revision;
+ key.is_packed = svn_fs_x__is_packed_rev(fs, baton->first_revision);
+ key.page = baton->page_no;
+ SVN_ERR(svn_cache__has_key(&already_cached, ffd->p2l_page_cache,
+ &key, scratch_pool));
+
+ /* yes, already cached */
+ if (already_cached)
+ {
+ /* stop prefetching if most pages are already cached. */
+ if (!--*leaking_bucket)
+ *end = TRUE;
+
+ return SVN_NO_ERROR;
+ }
+
+ ++*leaking_bucket;
+
+ /* read from disk */
+ SVN_ERR(get_p2l_page(&page, rev_file, fs,
+ baton->first_revision,
+ baton->start_offset,
+ baton->next_offset,
+ baton->page_start,
+ baton->page_size,
+ scratch_pool));
+
+ /* and put it into our cache */
+ SVN_ERR(svn_cache__set(ffd->p2l_page_cache, &key, page, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Lookup & construct the baton and key information that we will need for
+ * a P2L page cache lookup. We want the page covering OFFSET in the rev /
+ * pack file containing REVSION in FS. Return the results in *PAGE_INFO_P
+ * and *KEY_P. Read data through REV_FILE. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+get_p2l_keys(p2l_page_info_baton_t *page_info_p,
+ svn_fs_x__page_cache_key_t *key_p,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *scratch_pool)
+{
+ p2l_page_info_baton_t page_info;
+
+ /* request info for the index pages that describes the pack / rev file
+ * contents at pack / rev file position OFFSET. */
+ page_info.offset = offset;
+ page_info.revision = revision;
+ SVN_ERR(get_p2l_page_info(&page_info, rev_file, fs, scratch_pool));
+
+ /* if the offset refers to a non-existent page, bail out */
+ if (page_info.page_count <= page_info.page_no)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Offset %s too large in revision %ld"),
+ apr_off_t_toa(scratch_pool, offset), revision);
+
+ /* return results */
+ if (page_info_p)
+ *page_info_p = page_info;
+
+ /* construct cache key */
+ if (key_p)
+ {
+ svn_fs_x__page_cache_key_t key = { 0 };
+ assert(page_info.first_revision <= APR_UINT32_MAX);
+ key.revision = (apr_uint32_t)page_info.first_revision;
+ key.is_packed = svn_fs_x__is_packed_rev(fs, revision);
+ key.page = page_info.page_no;
+
+ *key_p = key;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* qsort-compatible compare function that compares the OFFSET of the
+ * svn_fs_x__p2l_entry_t in *LHS with the apr_off_t in *RHS. */
+static int
+compare_start_p2l_entry(const void *lhs,
+ const void *rhs)
+{
+ const svn_fs_x__p2l_entry_t *entry = lhs;
+ apr_off_t start = *(const apr_off_t*)rhs;
+ apr_off_t diff = entry->offset - start;
+
+ /* restrict result to int */
+ return diff < 0 ? -1 : (diff == 0 ? 0 : 1);
+}
+
+/* From the PAGE_ENTRIES array of svn_fs_x__p2l_entry_t, ordered
+ * by their OFFSET member, copy all elements overlapping the range
+ * [BLOCK_START, BLOCK_END) to ENTRIES. If RESOLVE_PTR is set, the ITEMS
+ * sub-array in each entry needs to be de-serialized. */
+static void
+append_p2l_entries(apr_array_header_t *entries,
+ apr_array_header_t *page_entries,
+ apr_off_t block_start,
+ apr_off_t block_end,
+ svn_boolean_t resolve_ptr)
+{
+ const svn_fs_x__p2l_entry_t *entry;
+ int idx = svn_sort__bsearch_lower_bound(page_entries, &block_start,
+ compare_start_p2l_entry);
+
+ /* start at the first entry that overlaps with BLOCK_START */
+ if (idx > 0)
+ {
+ entry = &APR_ARRAY_IDX(page_entries, idx - 1, svn_fs_x__p2l_entry_t);
+ if (entry->offset + entry->size > block_start)
+ --idx;
+ }
+
+ /* copy all entries covering the requested range */
+ for ( ; idx < page_entries->nelts; ++idx)
+ {
+ svn_fs_x__p2l_entry_t *copy;
+ entry = &APR_ARRAY_IDX(page_entries, idx, svn_fs_x__p2l_entry_t);
+ if (entry->offset >= block_end)
+ break;
+
+ /* Copy the entry record. */
+ copy = apr_array_push(entries);
+ *copy = *entry;
+
+ /* Copy the items of that entries. */
+ if (entry->item_count)
+ {
+ const svn_fs_x__id_t *items
+ = resolve_ptr
+ ? svn_temp_deserializer__ptr(page_entries->elts,
+ (const void * const *)&entry->items)
+ : entry->items;
+
+ copy->items = apr_pmemdup(entries->pool, items,
+ entry->item_count * sizeof(*items));
+ }
+ }
+}
+
+/* Auxilliary struct passed to p2l_entries_func selecting the relevant
+ * data range. */
+typedef struct p2l_entries_baton_t
+{
+ apr_off_t start;
+ apr_off_t end;
+} p2l_entries_baton_t;
+
+/* Implement svn_cache__partial_getter_func_t: extract p2l entries from
+ * the page in DATA which overlap the p2l_entries_baton_t in BATON.
+ * The target array is already provided in *OUT.
+ */
+static svn_error_t *
+p2l_entries_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ apr_array_header_t *entries = *(apr_array_header_t **)out;
+ const apr_array_header_t *raw_page = data;
+ p2l_entries_baton_t *block = baton;
+
+ /* Make PAGE a readable APR array. */
+ apr_array_header_t page = *raw_page;
+ page.elts = (void *)svn_temp_deserializer__ptr(raw_page,
+ (const void * const *)&raw_page->elts);
+
+ /* append relevant information to result */
+ append_p2l_entries(entries, &page, block->start, block->end, TRUE);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Body of svn_fs_x__p2l_index_lookup. However, do a single index page
+ * lookup and append the result to the ENTRIES array provided by the caller.
+ * Use successive calls to cover larger ranges.
+ */
+static svn_error_t *
+p2l_index_lookup(apr_array_header_t *entries,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_end,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__page_cache_key_t key;
+ svn_boolean_t is_cached = FALSE;
+ p2l_page_info_baton_t page_info;
+ apr_array_header_t *local_result = entries;
+
+ /* baton selecting the relevant entries from the one page we access */
+ p2l_entries_baton_t block;
+ block.start = block_start;
+ block.end = block_end;
+
+ /* if we requested an empty range, the result would be empty */
+ SVN_ERR_ASSERT(block_start < block_end);
+
+ /* look for the fist page of the range in our cache */
+ SVN_ERR(get_p2l_keys(&page_info, &key, rev_file, fs, revision, block_start,
+ scratch_pool));
+ SVN_ERR(svn_cache__get_partial((void**)&local_result, &is_cached,
+ ffd->p2l_page_cache, &key, p2l_entries_func,
+ &block, scratch_pool));
+
+ if (!is_cached)
+ {
+ svn_boolean_t end;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_off_t original_page_start = page_info.page_start;
+ int leaking_bucket = 4;
+ p2l_page_info_baton_t prefetch_info = page_info;
+ apr_array_header_t *page_entries;
+
+ apr_off_t max_offset
+ = APR_ALIGN(page_info.next_offset, ffd->block_size);
+ apr_off_t min_offset
+ = APR_ALIGN(page_info.start_offset, ffd->block_size) - ffd->block_size;
+
+ /* Since we read index data in larger chunks, we probably got more
+ * page data than we requested. Parse & cache that until either we
+ * encounter pages already cached or reach the end of the buffer.
+ */
+
+ /* pre-fetch preceding pages */
+ end = FALSE;
+ prefetch_info.offset = original_page_start;
+ while (prefetch_info.offset >= prefetch_info.page_size && !end)
+ {
+ prefetch_info.offset -= prefetch_info.page_size;
+ SVN_ERR(prefetch_p2l_page(&end, &leaking_bucket, fs, rev_file,
+ &prefetch_info, min_offset, iterpool));
+ svn_pool_clear(iterpool);
+ }
+
+ /* fetch page from disk and put it into the cache */
+ SVN_ERR(get_p2l_page(&page_entries, rev_file, fs,
+ page_info.first_revision,
+ page_info.start_offset,
+ page_info.next_offset,
+ page_info.page_start,
+ page_info.page_size, iterpool));
+
+ /* The last cache entry must not end beyond the range covered by
+ * this index. The same applies for any subset of entries. */
+ if (page_entries->nelts)
+ {
+ const svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(page_entries, page_entries->nelts - 1,
+ svn_fs_x__p2l_entry_t);
+ if ( entry->offset + entry->size
+ > page_info.page_size * page_info.page_count)
+ return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
+ _("Last P2L index entry extends beyond "
+ "the last page in revision %ld."),
+ revision);
+ }
+
+ SVN_ERR(svn_cache__set(ffd->p2l_page_cache, &key, page_entries,
+ iterpool));
+
+ /* append relevant information to result */
+ append_p2l_entries(entries, page_entries, block_start, block_end, FALSE);
+
+ /* pre-fetch following pages */
+ end = FALSE;
+ leaking_bucket = 4;
+ prefetch_info = page_info;
+ prefetch_info.offset = original_page_start;
+ while ( prefetch_info.next_offset < max_offset
+ && prefetch_info.page_no + 1 < prefetch_info.page_count
+ && !end)
+ {
+ prefetch_info.offset += prefetch_info.page_size;
+ SVN_ERR(prefetch_p2l_page(&end, &leaking_bucket, fs, rev_file,
+ &prefetch_info, min_offset, iterpool));
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ /* We access a valid page (otherwise, we had seen an error in the
+ * get_p2l_keys request). Hence, at least one entry must be found. */
+ SVN_ERR_ASSERT(entries->nelts > 0);
+
+ /* Add an "unused" entry if it extends beyond the end of the data file.
+ * Since the index page size might be smaller than the current data
+ * read block size, the trailing "unused" entry in this index may not
+ * fully cover the end of the last block. */
+ if (page_info.page_no + 1 >= page_info.page_count)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, entries->nelts-1, svn_fs_x__p2l_entry_t);
+
+ apr_off_t entry_end = entry->offset + entry->size;
+ if (entry_end < block_end)
+ {
+ if (entry->type == SVN_FS_X__ITEM_TYPE_UNUSED)
+ {
+ /* extend the terminal filler */
+ entry->size = block_end - entry->offset;
+ }
+ else
+ {
+ /* No terminal filler. Add one. */
+ entry = apr_array_push(entries);
+ entry->offset = entry_end;
+ entry->size = block_end - entry_end;
+ entry->type = SVN_FS_X__ITEM_TYPE_UNUSED;
+ entry->fnv1_checksum = 0;
+ entry->item_count = 0;
+ entry->items = NULL;
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_index_lookup(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t block_end = block_start + block_size;
+
+ /* the receiving container */
+ int last_count = 0;
+ apr_array_header_t *result = apr_array_make(result_pool, 16,
+ sizeof(svn_fs_x__p2l_entry_t));
+
+ /* Fetch entries page-by-page. Since the p2l index is supposed to cover
+ * every single byte in the rev / pack file - even unused sections -
+ * every iteration must result in some progress. */
+ while (block_start < block_end)
+ {
+ svn_fs_x__p2l_entry_t *entry;
+ SVN_ERR(p2l_index_lookup(result, rev_file, fs, revision, block_start,
+ block_end, scratch_pool));
+ SVN_ERR_ASSERT(result->nelts > 0);
+
+ /* continue directly behind last item */
+ entry = &APR_ARRAY_IDX(result, result->nelts-1, svn_fs_x__p2l_entry_t);
+ block_start = entry->offset + entry->size;
+
+ /* Some paranoia check. Successive iterations should never return
+ * duplicates but if it did, we might get into trouble later on. */
+ if (last_count > 0 && last_count < result->nelts)
+ {
+ entry = &APR_ARRAY_IDX(result, last_count - 1,
+ svn_fs_x__p2l_entry_t);
+ SVN_ERR_ASSERT(APR_ARRAY_IDX(result, last_count,
+ svn_fs_x__p2l_entry_t).offset
+ >= entry->offset + entry->size);
+ }
+
+ last_count = result->nelts;
+ }
+
+ *entries = result;
+ return SVN_NO_ERROR;
+}
+
+/* compare_fn_t comparing a svn_fs_x__p2l_entry_t at LHS with an offset
+ * RHS.
+ */
+static int
+compare_p2l_entry_offsets(const void *lhs, const void *rhs)
+{
+ const svn_fs_x__p2l_entry_t *entry = (const svn_fs_x__p2l_entry_t *)lhs;
+ apr_off_t offset = *(const apr_off_t *)rhs;
+
+ return entry->offset < offset ? -1 : (entry->offset == offset ? 0 : 1);
+}
+
+/* Cached data extraction utility. DATA is a P2L index page, e.g. an APR
+ * array of svn_fs_fs__p2l_entry_t elements. Return the entry for the item,
+ * allocated in RESULT_POOL, starting at OFFSET or NULL if that's not an
+ * the start offset of any item. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_fs_x__p2l_entry_t *
+get_p2l_entry_from_cached_page(const void *data,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* resolve all pointer values of in-cache data */
+ const apr_array_header_t *page = data;
+ apr_array_header_t *entries = apr_pmemdup(scratch_pool, page,
+ sizeof(*page));
+ svn_fs_x__p2l_entry_t *entry;
+
+ entries->elts = (char *)svn_temp_deserializer__ptr(page,
+ (const void *const *)&page->elts);
+
+ /* search of the offset we want */
+ entry = svn_sort__array_lookup(entries, &offset, NULL,
+ (int (*)(const void *, const void *))compare_p2l_entry_offsets);
+
+ /* return it, if it is a perfect match */
+ if (entry)
+ {
+ svn_fs_x__p2l_entry_t *result
+ = apr_pmemdup(result_pool, entry, sizeof(*result));
+ result->items
+ = (svn_fs_x__id_t *)svn_temp_deserializer__ptr(entries->elts,
+ (const void *const *)&entry->items);
+ return result;
+ }
+
+ return NULL;
+}
+
+/* Implements svn_cache__partial_getter_func_t for P2L index pages, copying
+ * the entry for the apr_off_t at BATON into *OUT. *OUT will be NULL if
+ * there is no matching entry in the index page at DATA.
+ */
+static svn_error_t *
+p2l_entry_lookup_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__p2l_entry_t *entry
+ = get_p2l_entry_from_cached_page(data, *(apr_off_t *)baton, result_pool,
+ result_pool);
+
+ *out = entry && entry->offset == *(apr_off_t *)baton
+ ? svn_fs_x__p2l_entry_dup(entry, result_pool)
+ : NULL;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+p2l_entry_lookup(svn_fs_x__p2l_entry_t **entry_p,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__page_cache_key_t key = { 0 };
+ svn_boolean_t is_cached = FALSE;
+ p2l_page_info_baton_t page_info;
+
+ /* look for this info in our cache */
+ SVN_ERR(get_p2l_keys(&page_info, &key, rev_file, fs, revision, offset,
+ scratch_pool));
+ SVN_ERR(svn_cache__get_partial((void**)entry_p, &is_cached,
+ ffd->p2l_page_cache, &key,
+ p2l_entry_lookup_func, &offset,
+ result_pool));
+ if (!is_cached)
+ {
+ /* do a standard index lookup. This is will automatically prefetch
+ * data to speed up future lookups. */
+ apr_array_header_t *entries = apr_array_make(result_pool, 1,
+ sizeof(**entry_p));
+ SVN_ERR(p2l_index_lookup(entries, rev_file, fs, revision, offset,
+ offset + 1, scratch_pool));
+
+ /* Find the entry that we want. */
+ *entry_p = svn_sort__array_lookup(entries, &offset, NULL,
+ (int (*)(const void *, const void *))compare_p2l_entry_offsets);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_entry_lookup(svn_fs_x__p2l_entry_t **entry_p,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* look for this info in our cache */
+ SVN_ERR(p2l_entry_lookup(entry_p, rev_file, fs, revision, offset,
+ result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton structure for p2l_item_lookup_func. It describes which sub_item
+ * info shall be returned.
+ */
+typedef struct p2l_item_lookup_baton_t
+{
+ /* file offset to find the P2L index entry for */
+ apr_off_t offset;
+
+ /* return the sub-item at this position within that entry */
+ apr_uint32_t sub_item;
+} p2l_item_lookup_baton_t;
+
+/* Implements svn_cache__partial_getter_func_t for P2L index pages, copying
+ * the svn_fs_x__id_t for the item described 2l_item_lookup_baton_t
+ * *BATON. *OUT will be NULL if there is no matching index entry or the
+ * sub-item is out of range.
+ */
+static svn_error_t *
+p2l_item_lookup_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ p2l_item_lookup_baton_t *lookup_baton = baton;
+ svn_fs_x__p2l_entry_t *entry
+ = get_p2l_entry_from_cached_page(data, lookup_baton->offset, result_pool,
+ result_pool);
+
+ *out = entry
+ && entry->offset == lookup_baton->offset
+ && entry->item_count > lookup_baton->sub_item
+ ? apr_pmemdup(result_pool,
+ entry->items + lookup_baton->sub_item,
+ sizeof(*entry->items))
+ : NULL;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_item_lookup(svn_fs_x__id_t **item,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_uint32_t sub_item,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__page_cache_key_t key = { 0 };
+ svn_boolean_t is_cached = FALSE;
+ p2l_page_info_baton_t page_info;
+ p2l_item_lookup_baton_t baton;
+
+ *item = NULL;
+
+ /* look for this info in our cache */
+ SVN_ERR(get_p2l_keys(&page_info, &key, rev_file, fs, revision, offset,
+ scratch_pool));
+ baton.offset = offset;
+ baton.sub_item = sub_item;
+ SVN_ERR(svn_cache__get_partial((void**)item, &is_cached,
+ ffd->p2l_page_cache, &key,
+ p2l_item_lookup_func, &baton, result_pool));
+ if (!is_cached)
+ {
+ /* do a standard index lookup. This is will automatically prefetch
+ * data to speed up future lookups. */
+ svn_fs_x__p2l_entry_t *entry;
+ SVN_ERR(p2l_entry_lookup(&entry, rev_file, fs, revision, offset,
+ result_pool, scratch_pool));
+
+ /* return result */
+ if (entry && entry->item_count > sub_item)
+ *item = apr_pmemdup(result_pool, entry->items + sub_item,
+ sizeof(**item));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_cache__partial_getter_func_t for P2L headers, setting *OUT
+ * to the largest the first offset not covered by this P2L index.
+ */
+static svn_error_t *
+p2l_get_max_offset_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ const p2l_header_t *header = data;
+ apr_off_t max_offset = header->file_size;
+ *out = apr_pmemdup(result_pool, &max_offset, sizeof(max_offset));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__p2l_get_max_offset(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ p2l_header_t *header;
+ svn_boolean_t is_cached = FALSE;
+ apr_off_t *offset_p;
+
+ /* look for the header data in our cache */
+ svn_fs_x__pair_cache_key_t key;
+ key.revision = base_revision(fs, revision);
+ key.second = svn_fs_x__is_packed_rev(fs, revision);
+
+ SVN_ERR(svn_cache__get_partial((void **)&offset_p, &is_cached,
+ ffd->p2l_header_cache, &key,
+ p2l_get_max_offset_func, NULL,
+ scratch_pool));
+ if (is_cached)
+ {
+ *offset = *offset_p;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(get_p2l_header(&header, rev_file, fs, revision, scratch_pool,
+ scratch_pool));
+ *offset = header->file_size;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__item_offset(apr_off_t *absolute_position,
+ apr_uint32_t *sub_item,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ const svn_fs_x__id_t *item_id,
+ apr_pool_t *scratch_pool)
+{
+ if (svn_fs_x__is_txn(item_id->change_set))
+ SVN_ERR(l2p_proto_index_lookup(absolute_position, sub_item, fs,
+ svn_fs_x__get_txn_id(item_id->change_set),
+ item_id->number, scratch_pool));
+ else
+ SVN_ERR(l2p_index_lookup(absolute_position, sub_item, fs, rev_file,
+ svn_fs_x__get_revnum(item_id->change_set),
+ item_id->number, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Calculate the FNV1 checksum over the offset range in REV_FILE, covered by
+ * ENTRY. Store the result in ENTRY->FNV1_CHECKSUM. Use SCRATCH_POOL for
+ * temporary allocations. */
+static svn_error_t *
+calc_fnv1(svn_fs_x__p2l_entry_t *entry,
+ svn_fs_x__revision_file_t *rev_file,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[4096];
+ svn_checksum_t *checksum;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, scratch_pool);
+ apr_off_t size = entry->size;
+
+ /* Special rules apply to unused sections / items. The data must be a
+ * sequence of NUL bytes (not checked here) and the checksum is fixed to 0.
+ */
+ if (entry->type == SVN_FS_X__ITEM_TYPE_UNUSED)
+ {
+ entry->fnv1_checksum = 0;
+ return SVN_NO_ERROR;
+ }
+
+ /* Read the block and feed it to the checksum calculator. */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &entry->offset,
+ scratch_pool));
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(rev_file->file, buffer, to_read, NULL,
+ NULL, scratch_pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+ }
+
+ /* Store final checksum in ENTRY. */
+ SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
+ entry->fnv1_checksum = ntohl(*(const apr_uint32_t *)checksum->digest);
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * Index (re-)creation utilities.
+ */
+
+svn_error_t *
+svn_fs_x__p2l_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *proto_index;
+
+ /* Use a subpool for immediate temp file cleanup at the end of this
+ * function. */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* Create a proto-index file. */
+ SVN_ERR(svn_io_open_unique_file3(NULL, protoname, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_open(&proto_index, *protoname,
+ scratch_pool));
+
+ /* Write ENTRIES to proto-index file and calculate checksums as we go. */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t *);
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(calc_fnv1(entry, rev_file, iterpool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry(proto_index, entry,
+ iterpool));
+ }
+
+ /* Convert proto-index into final index and move it into position.
+ * Note that REV_FILE contains the start revision of the shard file if it
+ * has been packed while REVISION may be somewhere in the middle. For
+ * non-packed shards, they will have identical values. */
+ SVN_ERR(svn_io_file_close(proto_index, iterpool));
+
+ /* Temp file cleanup. */
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Decorator for svn_fs_x__p2l_entry_t that associates it with a sorted
+ * variant of its ITEMS array.
+ */
+typedef struct sub_item_ordered_t
+{
+ /* ENTRY that got wrapped */
+ svn_fs_x__p2l_entry_t *entry;
+
+ /* Array of pointers into ENTRY->ITEMS, sorted by their revision member
+ * _descending_ order. May be NULL if ENTRY->ITEM_COUNT < 2. */
+ svn_fs_x__id_t **order;
+} sub_item_ordered_t;
+
+/* implements compare_fn_t. Place LHS before RHS, if the latter is younger.
+ * Used to sort sub_item_ordered_t::order
+ */
+static int
+compare_sub_items(const svn_fs_x__id_t * const * lhs,
+ const svn_fs_x__id_t * const * rhs)
+{
+ return (*lhs)->change_set < (*rhs)->change_set
+ ? 1
+ : ((*lhs)->change_set > (*rhs)->change_set ? -1 : 0);
+}
+
+/* implements compare_fn_t. Place LHS before RHS, if the latter belongs to
+ * a newer revision.
+ */
+static int
+compare_p2l_info_rev(const sub_item_ordered_t * lhs,
+ const sub_item_ordered_t * rhs)
+{
+ svn_fs_x__id_t *lhs_part;
+ svn_fs_x__id_t *rhs_part;
+
+ assert(lhs != rhs);
+ if (lhs->entry->item_count == 0)
+ return rhs->entry->item_count == 0 ? 0 : -1;
+ if (rhs->entry->item_count == 0)
+ return 1;
+
+ lhs_part = lhs->order ? lhs->order[lhs->entry->item_count - 1]
+ : &lhs->entry->items[0];
+ rhs_part = rhs->order ? rhs->order[rhs->entry->item_count - 1]
+ : &rhs->entry->items[0];
+
+ if (lhs_part->change_set == rhs_part->change_set)
+ return 0;
+
+ return lhs_part->change_set < rhs_part->change_set ? -1 : 1;
+}
+
+svn_error_t *
+svn_fs_x__l2p_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *proto_index;
+
+ /* Use a subpool for immediate temp file cleanup at the end of this
+ * function. */
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_revnum_t prev_rev = SVN_INVALID_REVNUM;
+ int i;
+ apr_uint32_t k;
+ svn_priority_queue__t *queue;
+ apr_size_t count = 0;
+ apr_array_header_t *sub_item_orders;
+
+ /* Create the temporary proto-rev file. */
+ SVN_ERR(svn_io_open_unique_file3(NULL, protoname, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_fs_x__l2p_proto_index_open(&proto_index, *protoname,
+ scratch_pool));
+
+
+ /* wrap P2L entries such that we have access to the sub-items in revision
+ order. The ENTRY_COUNT member will point to the next item to read+1. */
+ sub_item_orders = apr_array_make(scratch_pool, entries->nelts,
+ sizeof(sub_item_ordered_t));
+ sub_item_orders->nelts = entries->nelts;
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t *);
+ sub_item_ordered_t *ordered
+ = &APR_ARRAY_IDX(sub_item_orders, i, sub_item_ordered_t);
+
+ /* skip unused regions (e.g. padding) */
+ if (entry->item_count == 0)
+ {
+ --sub_item_orders->nelts;
+ continue;
+ }
+
+ assert(entry);
+ ordered->entry = entry;
+ count += entry->item_count;
+
+ if (entry->item_count > 1)
+ {
+ ordered->order
+ = apr_palloc(scratch_pool,
+ sizeof(*ordered->order) * entry->item_count);
+ for (k = 0; k < entry->item_count; ++k)
+ ordered->order[k] = &entry->items[k];
+
+ qsort(ordered->order, entry->item_count, sizeof(*ordered->order),
+ (int (*)(const void *, const void *))compare_sub_items);
+ }
+ }
+
+ /* we need to write the index in ascending revision order */
+ queue = svn_priority_queue__create
+ (sub_item_orders,
+ (int (*)(const void *, const void *))compare_p2l_info_rev);
+
+ /* write index entries */
+ for (i = 0; i < count; ++i)
+ {
+ svn_fs_x__id_t *sub_item;
+ sub_item_ordered_t *ordered = svn_priority_queue__peek(queue);
+
+ if (ordered->entry->item_count > 0)
+ {
+ /* if there is only one item, we skip the overhead of having an
+ extra array for the item order */
+ sub_item = ordered->order
+ ? ordered->order[ordered->entry->item_count - 1]
+ : &ordered->entry->items[0];
+
+ /* next revision? */
+ if (prev_rev != svn_fs_x__get_revnum(sub_item->change_set))
+ {
+ prev_rev = svn_fs_x__get_revnum(sub_item->change_set);
+ SVN_ERR(svn_fs_x__l2p_proto_index_add_revision
+ (proto_index, iterpool));
+ }
+
+ /* add entry */
+ SVN_ERR(svn_fs_x__l2p_proto_index_add_entry
+ (proto_index, ordered->entry->offset,
+ (apr_uint32_t)(sub_item - ordered->entry->items),
+ sub_item->number, iterpool));
+
+ /* make ITEM_COUNT point the next sub-item to use+1 */
+ --ordered->entry->item_count;
+ }
+
+ /* process remaining sub-items (if any) of that container later */
+ if (ordered->entry->item_count)
+ svn_priority_queue__update(queue);
+ else
+ svn_priority_queue__pop(queue);
+
+ /* keep memory usage in check */
+ if (i % 256 == 0)
+ svn_pool_clear(iterpool);
+ }
+
+ /* Convert proto-index into final index and move it into position. */
+ SVN_ERR(svn_io_file_close(proto_index, iterpool));
+
+ /* Temp file cleanup. */
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/*
+ * Standard (de-)serialization functions
+ */
+
+svn_error_t *
+svn_fs_x__serialize_l2p_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ l2p_header_t *header = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t page_count = header->page_table_index[header->revision_count];
+ apr_size_t page_table_size = page_count * sizeof(*header->page_table);
+ apr_size_t index_size
+ = (header->revision_count + 1) * sizeof(*header->page_table_index);
+ apr_size_t data_size = sizeof(*header) + index_size + page_table_size;
+
+ /* serialize header and all its elements */
+ context = svn_temp_serializer__init(header,
+ sizeof(*header),
+ data_size + 32,
+ pool);
+
+ /* page table index array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->page_table_index,
+ index_size);
+
+ /* page table array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->page_table,
+ page_table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_l2p_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ l2p_header_t *header = (l2p_header_t *)data;
+
+ /* resolve the pointers in the struct */
+ svn_temp_deserializer__resolve(header, (void**)&header->page_table_index);
+ svn_temp_deserializer__resolve(header, (void**)&header->page_table);
+
+ /* done */
+ *out = header;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_l2p_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ l2p_page_t *page = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t of_table_size = page->entry_count * sizeof(*page->offsets);
+ apr_size_t si_table_size = page->entry_count * sizeof(*page->sub_items);
+
+ /* serialize struct and all its elements */
+ context = svn_temp_serializer__init(page,
+ sizeof(*page),
+ of_table_size + si_table_size
+ + sizeof(*page) + 32,
+ pool);
+
+ /* offsets and sub_items arrays */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&page->offsets,
+ of_table_size);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&page->sub_items,
+ si_table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_l2p_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ l2p_page_t *page = data;
+
+ /* resolve the pointers in the struct */
+ svn_temp_deserializer__resolve(page, (void**)&page->offsets);
+ svn_temp_deserializer__resolve(page, (void**)&page->sub_items);
+
+ /* done */
+ *out = page;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_p2l_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ p2l_header_t *header = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t table_size = (header->page_count + 1) * sizeof(*header->offsets);
+
+ /* serialize header and all its elements */
+ context = svn_temp_serializer__init(header,
+ sizeof(*header),
+ table_size + sizeof(*header) + 32,
+ pool);
+
+ /* offsets array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&header->offsets,
+ table_size);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_p2l_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ p2l_header_t *header = data;
+
+ /* resolve the only pointer in the struct */
+ svn_temp_deserializer__resolve(header, (void**)&header->offsets);
+
+ /* done */
+ *out = header;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_p2l_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *page = in;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_size_t table_size = page->elt_size * page->nelts;
+ svn_fs_x__p2l_entry_t *entries = (svn_fs_x__p2l_entry_t *)page->elts;
+ int i;
+
+ /* serialize array header and all its elements */
+ context = svn_temp_serializer__init(page,
+ sizeof(*page),
+ table_size + sizeof(*page) + 32,
+ pool);
+
+ /* items in the array */
+ svn_temp_serializer__push(context,
+ (const void * const *)&page->elts,
+ table_size);
+
+ for (i = 0; i < page->nelts; ++i)
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&entries[i].items,
+ entries[i].item_count
+ * sizeof(*entries[i].items));
+
+ svn_temp_serializer__pop(context);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_p2l_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *page = (apr_array_header_t *)data;
+ svn_fs_x__p2l_entry_t *entries;
+ int i;
+
+ /* resolve the only pointer in the struct */
+ svn_temp_deserializer__resolve(page, (void**)&page->elts);
+
+ /* resolve sub-struct pointers*/
+ entries = (svn_fs_x__p2l_entry_t *)page->elts;
+ for (i = 0; i < page->nelts; ++i)
+ svn_temp_deserializer__resolve(entries, (void**)&entries[i].items);
+
+ /* patch up members */
+ page->pool = pool;
+ page->nalloc = page->nelts;
+
+ /* done */
+ *out = page;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/index.h b/subversion/libsvn_fs_x/index.h
new file mode 100644
index 0000000..4e0e1dd
--- /dev/null
+++ b/subversion/libsvn_fs_x/index.h
@@ -0,0 +1,411 @@
+/* index.h : interface to FSX indexing functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__INDEX_H
+#define SVN_LIBSVN_FS__INDEX_H
+
+#include "fs.h"
+#include "rev_file.h"
+
+/* Per-defined item index values. They are used to identify empty or
+ * mandatory items.
+ */
+#define SVN_FS_X__ITEM_INDEX_UNUSED 0 /* invalid / reserved value */
+#define SVN_FS_X__ITEM_INDEX_CHANGES 1 /* list of changed paths */
+#define SVN_FS_X__ITEM_INDEX_ROOT_NODE 2 /* the root noderev */
+#define SVN_FS_X__ITEM_INDEX_FIRST_USER 3 /* first noderev to be freely
+ assigned */
+
+/* Data / item types as stored in the phys-to-log index.
+ */
+#define SVN_FS_X__ITEM_TYPE_UNUSED 0 /* file section not used */
+#define SVN_FS_X__ITEM_TYPE_FILE_REP 1 /* item is a file representation */
+#define SVN_FS_X__ITEM_TYPE_DIR_REP 2 /* item is a directory rep. */
+#define SVN_FS_X__ITEM_TYPE_FILE_PROPS 3 /* item is a file property rep. */
+#define SVN_FS_X__ITEM_TYPE_DIR_PROPS 4 /* item is a directory prop rep */
+#define SVN_FS_X__ITEM_TYPE_NODEREV 5 /* item is a noderev */
+#define SVN_FS_X__ITEM_TYPE_CHANGES 6 /* item is a changed paths list */
+
+#define SVN_FS_X__ITEM_TYPE_ANY_REP 7 /* item is any representation.
+ Only used in pre-format7. */
+
+#define SVN_FS_X__ITEM_TYPE_CHANGES_CONT 8 /* item is a changes container */
+#define SVN_FS_X__ITEM_TYPE_NODEREVS_CONT 9 /* item is a noderevs container */
+#define SVN_FS_X__ITEM_TYPE_REPS_CONT 10 /* item is a representations
+ container */
+
+/* (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_x__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_X__ITEM_TYPE_*) defines */
+ apr_uint32_t type;
+
+ /* modified FNV-1a checksum. 0 if unknown checksum */
+ apr_uint32_t fnv1_checksum;
+
+ /* Number of items in this block / container. Their list can be found
+ * in *ITEMS. 0 for unused sections. 1 for non-container items,
+ * > 1 for containers. */
+ apr_uint32_t item_count;
+
+ /* List of items in that block / container */
+ svn_fs_x__id_t *items;
+} svn_fs_x__p2l_entry_t;
+
+/* Return a (deep) copy of ENTRY, allocated in RESULT_POOL.
+ */
+svn_fs_x__p2l_entry_t *
+svn_fs_x__p2l_entry_dup(const svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *result_pool);
+
+/* Open / create a log-to-phys index file with the full file path name
+ * FILE_NAME. Return the open file in *PROTO_INDEX allocated in
+ * RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_x__l2p_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool);
+
+/* Call this function before adding entries for the next revision to the
+ * log-to-phys index file in PROTO_INDEX. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+svn_error_t *
+svn_fs_x__l2p_proto_index_add_revision(apr_file_t *proto_index,
+ apr_pool_t *scratch_pool);
+
+/* Add a new mapping, ITEM_INDEX to the (OFFSET, SUB_ITEM) pair, to log-to-
+ * phys index file in PROTO_INDEX. Please note that mappings may be added
+ * in any order but duplicate entries for the same ITEM_INDEX, SUB_ITEM
+ * are not supported. Not all possible index values need to be used.
+ * (OFFSET, SUB_ITEM) may be (-1, 0) to mark 'invalid' item indexes but
+ * that is already implied for all item indexes not explicitly given a
+ * mapping.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__l2p_proto_index_add_entry(apr_file_t *proto_index,
+ apr_off_t offset,
+ apr_uint32_t sub_item,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool);
+
+/* Use the proto index file stored at PROTO_FILE_NAME, construct the final
+ * log-to-phys index and append it to INDEX_FILE. The first revision will
+ * be REVISION, entries to the next revision will be assigned to REVISION+1
+ * and so forth.
+ *
+ * Return the MD5 checksum of the on-disk index data in *CHECKSUM, allocated
+ * in RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__l2p_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Open / create a phys-to-log index file with the full file path name
+ * FILE_NAME. Return the open file in *PROTO_INDEX allocated in
+ * RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_x__p2l_proto_index_open(apr_file_t **proto_index,
+ const char *file_name,
+ apr_pool_t *result_pool);
+
+/* Add a new mapping ENTRY to the phys-to-log index file in PROTO_INDEX.
+ * The entries must be added in ascending offset order and must not leave
+ * intermittent ranges uncovered. The revision value in ENTRY may be
+ * SVN_INVALID_REVISION. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_proto_index_add_entry(apr_file_t *proto_index,
+ const svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool);
+
+/* Set *NEXT_OFFSET to the first offset behind the last entry in the
+ * phys-to-log proto index file PROTO_INDEX. This will be 0 for empty
+ * index files. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_proto_index_next_offset(apr_off_t *next_offset,
+ apr_file_t *proto_index,
+ apr_pool_t *scratch_pool);
+
+/* Use the proto index file stored at PROTO_FILE_NAME, construct the final
+ * phys-to-log index and append it to INDEX_FILE. Entries without a valid
+ * revision will be assigned to the REVISION given here.
+ *
+ * Return the MD5 checksum of the on-disk index data in *CHECKSUM, allocated
+ * in RESULT_POOL. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_index_append(svn_checksum_t **checksum,
+ svn_fs_t *fs,
+ apr_file_t *index_file,
+ const char *proto_file_name,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Use the phys-to-log mapping files in FS to build a list of entries
+ * that (at least partly) overlap with the range given by BLOCK_START
+ * offset and BLOCK_SIZE in the rep / pack file containing REVISION.
+ * Return the array in *ENTRIES with svn_fs_fs__p2l_entry_t as elements,
+ * allocated in RESULT_POOL. REV_FILE determines whether to access single
+ * rev or pack file data. If that is not available anymore (neither in
+ * cache nor on disk), return an error. Use SCRATCH_POOL for temporary
+ * allocations.
+ *
+ * Note that (only) the first and the last mapping may cross a cluster
+ * boundary.
+ */
+svn_error_t *
+svn_fs_x__p2l_index_lookup(apr_array_header_t **entries,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t block_start,
+ apr_off_t block_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Use the phys-to-log mapping files in FS to return the entry for the
+ * container or single item starting at global OFFSET in the rep file
+ * containing REVISION in*ENTRY, allocated in RESULT_POOL. Sets *ENTRY
+ * to NULL if no item starts at exactly that offset. REV_FILE determines
+ * whether to access single rev or pack file data. If that is not available
+ * anymore (neither in cache nor on disk), return an error.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_entry_lookup(svn_fs_x__p2l_entry_t **entry,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Use the phys-to-log mapping files in FS to return the svn_fs_x__id_t
+ * for the SUB_ITEM of the container starting at global OFFSET in the rep /
+ * pack file containing REVISION in *ITEM, allocated in RESULT_POOL. Sets
+ * *ITEM to NULL if no element starts at exactly that offset or if it
+ * contains no more than SUB_ITEM sub-items.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_item_lookup(svn_fs_x__id_t **item,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_off_t offset,
+ apr_uint32_t sub_item,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* For ITEM_ID in FS, return the position in the respective rev or pack file
+ * in *ABSOLUTE_POSITION and the *SUB_ITEM number within the object at that
+ * location. *SUB_ITEM will be 0 for non-container items.
+ *
+ * REV_FILE determines whether to access single rev or pack file data.
+ * If that is not available anymore (neither in cache nor on disk), re-open
+ * the rev / pack file and retry to open the index file. For transaction
+ * content, REV_FILE may be NULL.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__item_offset(apr_off_t *absolute_position,
+ apr_uint32_t *sub_item,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ const svn_fs_x__id_t *item_id,
+ apr_pool_t *scratch_pool);
+
+/* Use the log-to-phys indexes in FS to determine the maximum item indexes
+ * assigned to revision START_REV to START_REV + COUNT - 1. That is a
+ * close upper limit to the actual number of items in the respective revs.
+ * Return the results in *MAX_IDS, allocated in RESULT_POOL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__l2p_get_max_ids(apr_array_header_t **max_ids,
+ svn_fs_t *fs,
+ svn_revnum_t start_rev,
+ apr_size_t count,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* In *OFFSET, return the first OFFSET in the pack / rev file containing
+ * REVISION in FS not covered by the log-to-phys index.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_get_max_offset(apr_off_t *offset,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+
+/* Index (re-)creation utilities.
+ */
+
+/* For FS, create a new L2P auto-deleting proto index file in POOL and return
+ * its name in *PROTONAME. All entries to write are given in ENTRIES and
+ * entries are of type svn_fs_fs__p2l_entry_t* (sic!). The ENTRIES array
+ * will be reordered. Give the proto index file the lifetime of RESULT_POOL
+ * and use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__l2p_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* For FS, create a new P2L auto-deleting proto index file in POOL and return
+ * its name in *PROTONAME. All entries to write are given in ENTRIES and
+ * of type svn_fs_fs__p2l_entry_t*. The FVN1 checksums are not taken from
+ * ENTRIES but are begin calculated from the current contents of REV_FILE
+ * as we go. Give the proto index file the lifetime of RESULT_POOL and use
+ * SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__p2l_index_from_p2l_entries(const char **protoname,
+ svn_fs_t *fs,
+ svn_fs_x__revision_file_t *rev_file,
+ apr_array_header_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Serialization and caching interface
+ */
+
+/* We use this key type to address individual pages from both index types.
+ */
+typedef struct svn_fs_x__page_cache_key_t
+{
+ /* in l2p: this is the revision of the items being mapped
+ in p2l: this is the start revision identifying the pack / rev file */
+ apr_uint32_t revision;
+
+ /* if TRUE, this is the index to a pack file
+ */
+ svn_boolean_t is_packed;
+
+ /* in l2p: page number within the revision
+ * in p2l: page number with the rev / pack file
+ */
+ apr_uint64_t page;
+} svn_fs_x__page_cache_key_t;
+
+/*
+ * Implements svn_cache__serialize_func_t for l2p_header_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_l2p_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for l2p_header_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_l2p_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for l2p_page_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_l2p_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for l2p_page_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_l2p_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for p2l_header_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_p2l_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for p2l_header_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_p2l_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__serialize_func_t for apr_array_header_t objects
+ * with elements of type svn_fs_x__p2l_entry_t.
+ */
+svn_error_t *
+svn_fs_x__serialize_p2l_page(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/*
+ * Implements svn_cache__deserialize_func_t for apr_array_header_t objects
+ * with elements of type svn_fs_x__p2l_entry_t.
+ */
+svn_error_t *
+svn_fs_x__deserialize_p2l_page(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/libsvn_fs_x.pc.in b/subversion/libsvn_fs_x/libsvn_fs_x.pc.in
new file mode 100644
index 0000000..46d93dc
--- /dev/null
+++ b/subversion/libsvn_fs_x/libsvn_fs_x.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_fs_x
+Description: Subversion FSX Repository Filesystem Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr libsvn_fs_util
+Libs: -L${libdir} -lsvn_fs_x
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_fs_x/lock.c b/subversion/libsvn_fs_x/lock.c
new file mode 100644
index 0000000..6819f63
--- /dev/null
+++ b/subversion/libsvn_fs_x/lock.c
@@ -0,0 +1,1492 @@
+/* lock.c : functions for manipulating filesystem locks.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_fs.h"
+#include "svn_hash.h"
+#include "svn_time.h"
+#include "svn_utf.h"
+
+#include <apr_uuid.h>
+#include <apr_file_io.h>
+#include <apr_file_info.h>
+
+#include "lock.h"
+#include "tree.h"
+#include "fs_x.h"
+#include "transaction.h"
+#include "util.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "private/svn_fs_util.h"
+#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
+#include "svn_private_config.h"
+
+/* Names of hash keys used to store a lock for writing to disk. */
+#define PATH_KEY "path"
+#define TOKEN_KEY "token"
+#define OWNER_KEY "owner"
+#define CREATION_DATE_KEY "creation_date"
+#define EXPIRATION_DATE_KEY "expiration_date"
+#define COMMENT_KEY "comment"
+#define IS_DAV_COMMENT_KEY "is_dav_comment"
+#define CHILDREN_KEY "children"
+
+/* Number of characters from the head of a digest file name used to
+ calculate a subdirectory in which to drop that file. */
+#define DIGEST_SUBDIR_LEN 3
+
+
+
+/*** Generic helper functions. ***/
+
+/* Set *DIGEST to the MD5 hash of STR. */
+static svn_error_t *
+make_digest(const char **digest,
+ const char *str,
+ apr_pool_t *pool)
+{
+ svn_checksum_t *checksum;
+
+ SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, str, strlen(str), pool));
+
+ *digest = svn_checksum_to_cstring_display(checksum, pool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Set the value of KEY (whose size is KEY_LEN, or APR_HASH_KEY_STRING
+ if unknown) to an svn_string_t-ized version of VALUE (whose size is
+ VALUE_LEN, or APR_HASH_KEY_STRING if unknown) in HASH. The value
+ will be allocated in POOL; KEY will not be duped. If either KEY or VALUE
+ is NULL, this function will do nothing. */
+static void
+hash_store(apr_hash_t *hash,
+ const char *key,
+ apr_ssize_t key_len,
+ const char *value,
+ apr_ssize_t value_len,
+ apr_pool_t *pool)
+{
+ if (! (key && value))
+ return;
+ if (value_len == APR_HASH_KEY_STRING)
+ value_len = strlen(value);
+ apr_hash_set(hash, key, key_len,
+ svn_string_ncreate(value, value_len, pool));
+}
+
+
+/* Fetch the value of KEY from HASH, returning only the cstring data
+ of that value (if it exists). */
+static const char *
+hash_fetch(apr_hash_t *hash,
+ const char *key)
+{
+ svn_string_t *str = svn_hash_gets(hash, key);
+ return str ? str->data : NULL;
+}
+
+
+/* SVN_ERR_FS_CORRUPT: the lockfile for PATH in FS is corrupt. */
+static svn_error_t *
+err_corrupt_lockfile(const char *fs_path, const char *path)
+{
+ return
+ svn_error_createf(
+ SVN_ERR_FS_CORRUPT, 0,
+ _("Corrupt lockfile for path '%s' in filesystem '%s'"),
+ path, fs_path);
+}
+
+
+/*** Digest file handling functions. ***/
+
+/* Return the path of the lock/entries file for which DIGEST is the
+ hashed repository relative path. */
+static const char *
+digest_path_from_digest(const char *fs_path,
+ const char *digest,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join_many(pool, fs_path, PATH_LOCKS_DIR,
+ apr_pstrmemdup(pool, digest, DIGEST_SUBDIR_LEN),
+ digest, SVN_VA_NULL);
+}
+
+
+/* Set *DIGEST_PATH to the path to the lock/entries digest file associate
+ with PATH, where PATH is the path to the lock file or lock entries file
+ in FS. */
+static svn_error_t *
+digest_path_from_path(const char **digest_path,
+ const char *fs_path,
+ const char *path,
+ apr_pool_t *pool)
+{
+ const char *digest;
+ SVN_ERR(make_digest(&digest, path, pool));
+ *digest_path = svn_dirent_join_many(pool, fs_path, PATH_LOCKS_DIR,
+ apr_pstrmemdup(pool, digest,
+ DIGEST_SUBDIR_LEN),
+ digest, SVN_VA_NULL);
+ return SVN_NO_ERROR;
+}
+
+
+/* Write to DIGEST_PATH a representation of CHILDREN (which may be
+ empty, if the versioned path in FS represented by DIGEST_PATH has
+ no children) and LOCK (which may be NULL if that versioned path is
+ lock itself locked). Set the permissions of DIGEST_PATH to those of
+ PERMS_REFERENCE. Use POOL for temporary allocations.
+ */
+static svn_error_t *
+write_digest_file(apr_hash_t *children,
+ svn_lock_t *lock,
+ const char *fs_path,
+ const char *digest_path,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+ svn_stream_t *stream;
+ apr_hash_index_t *hi;
+ apr_hash_t *hash = apr_hash_make(scratch_pool);
+ const char *tmp_path;
+
+ SVN_ERR(svn_fs_x__ensure_dir_exists(svn_dirent_join(fs_path, PATH_LOCKS_DIR,
+ scratch_pool),
+ fs_path, scratch_pool));
+ SVN_ERR(svn_fs_x__ensure_dir_exists(svn_dirent_dirname(digest_path,
+ scratch_pool),
+ fs_path, scratch_pool));
+
+ if (lock)
+ {
+ const char *creation_date = NULL, *expiration_date = NULL;
+ if (lock->creation_date)
+ creation_date = svn_time_to_cstring(lock->creation_date,
+ scratch_pool);
+ if (lock->expiration_date)
+ expiration_date = svn_time_to_cstring(lock->expiration_date,
+ scratch_pool);
+
+ hash_store(hash, PATH_KEY, sizeof(PATH_KEY)-1,
+ lock->path, APR_HASH_KEY_STRING, scratch_pool);
+ hash_store(hash, TOKEN_KEY, sizeof(TOKEN_KEY)-1,
+ lock->token, APR_HASH_KEY_STRING, scratch_pool);
+ hash_store(hash, OWNER_KEY, sizeof(OWNER_KEY)-1,
+ lock->owner, APR_HASH_KEY_STRING, scratch_pool);
+ hash_store(hash, COMMENT_KEY, sizeof(COMMENT_KEY)-1,
+ lock->comment, APR_HASH_KEY_STRING, scratch_pool);
+ hash_store(hash, IS_DAV_COMMENT_KEY, sizeof(IS_DAV_COMMENT_KEY)-1,
+ lock->is_dav_comment ? "1" : "0", 1, scratch_pool);
+ hash_store(hash, CREATION_DATE_KEY, sizeof(CREATION_DATE_KEY)-1,
+ creation_date, APR_HASH_KEY_STRING, scratch_pool);
+ hash_store(hash, EXPIRATION_DATE_KEY, sizeof(EXPIRATION_DATE_KEY)-1,
+ expiration_date, APR_HASH_KEY_STRING, scratch_pool);
+ }
+ if (apr_hash_count(children))
+ {
+ svn_stringbuf_t *children_list
+ = svn_stringbuf_create_empty(scratch_pool);
+ for (hi = apr_hash_first(scratch_pool, children);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_stringbuf_appendbytes(children_list,
+ apr_hash_this_key(hi),
+ apr_hash_this_key_len(hi));
+ svn_stringbuf_appendbyte(children_list, '\n');
+ }
+ hash_store(hash, CHILDREN_KEY, sizeof(CHILDREN_KEY)-1,
+ children_list->data, children_list->len, scratch_pool);
+ }
+
+ SVN_ERR(svn_stream_open_unique(&stream, &tmp_path,
+ svn_dirent_dirname(digest_path,
+ scratch_pool),
+ svn_io_file_del_none, scratch_pool,
+ scratch_pool));
+ if ((err = svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR,
+ scratch_pool)))
+ {
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_createf(err->apr_err,
+ err,
+ _("Cannot write lock/entries hashfile '%s'"),
+ svn_dirent_local_style(tmp_path,
+ scratch_pool));
+ }
+
+ SVN_ERR(svn_stream_close(stream));
+ SVN_ERR(svn_io_file_rename(tmp_path, digest_path, scratch_pool));
+ SVN_ERR(svn_io_copy_perms(perms_reference, digest_path, scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+
+/* Parse the file at DIGEST_PATH, populating the lock LOCK_P in that
+ file (if it exists, and if *LOCK_P is non-NULL) and the hash of
+ CHILDREN_P (if any exist, and if *CHILDREN_P is non-NULL). Use POOL
+ for all allocations. */
+static svn_error_t *
+read_digest_file(apr_hash_t **children_p,
+ svn_lock_t **lock_p,
+ const char *fs_path,
+ const char *digest_path,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+ svn_lock_t *lock;
+ apr_hash_t *hash;
+ svn_stream_t *stream;
+ const char *val;
+ svn_node_kind_t kind;
+
+ if (lock_p)
+ *lock_p = NULL;
+ if (children_p)
+ *children_p = apr_hash_make(pool);
+
+ SVN_ERR(svn_io_check_path(digest_path, &kind, pool));
+ if (kind == svn_node_none)
+ return SVN_NO_ERROR;
+
+ /* If our caller doesn't care about anything but the presence of the
+ file... whatever. */
+ if (kind == svn_node_file && !lock_p && !children_p)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_stream_open_readonly(&stream, digest_path, pool, pool));
+
+ hash = apr_hash_make(pool);
+ if ((err = svn_hash_read2(hash, stream, SVN_HASH_TERMINATOR, pool)))
+ {
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_createf(err->apr_err,
+ err,
+ _("Can't parse lock/entries hashfile '%s'"),
+ svn_dirent_local_style(digest_path, pool));
+ }
+ SVN_ERR(svn_stream_close(stream));
+
+ /* If our caller cares, see if we have a lock path in our hash. If
+ so, we'll assume we have a lock here. */
+ val = hash_fetch(hash, PATH_KEY);
+ if (val && lock_p)
+ {
+ const char *path = val;
+
+ /* Create our lock and load it up. */
+ lock = svn_lock_create(pool);
+ lock->path = path;
+
+ if (! ((lock->token = hash_fetch(hash, TOKEN_KEY))))
+ return svn_error_trace(err_corrupt_lockfile(fs_path, path));
+
+ if (! ((lock->owner = hash_fetch(hash, OWNER_KEY))))
+ return svn_error_trace(err_corrupt_lockfile(fs_path, path));
+
+ if (! ((val = hash_fetch(hash, IS_DAV_COMMENT_KEY))))
+ return svn_error_trace(err_corrupt_lockfile(fs_path, path));
+ lock->is_dav_comment = (val[0] == '1');
+
+ if (! ((val = hash_fetch(hash, CREATION_DATE_KEY))))
+ return svn_error_trace(err_corrupt_lockfile(fs_path, path));
+ SVN_ERR(svn_time_from_cstring(&(lock->creation_date), val, pool));
+
+ if ((val = hash_fetch(hash, EXPIRATION_DATE_KEY)))
+ SVN_ERR(svn_time_from_cstring(&(lock->expiration_date), val, pool));
+
+ lock->comment = hash_fetch(hash, COMMENT_KEY);
+
+ *lock_p = lock;
+ }
+
+ /* If our caller cares, see if we have any children for this path. */
+ val = hash_fetch(hash, CHILDREN_KEY);
+ if (val && children_p)
+ {
+ apr_array_header_t *kiddos = svn_cstring_split(val, "\n", FALSE, pool);
+ int i;
+
+ for (i = 0; i < kiddos->nelts; i++)
+ {
+ svn_hash_sets(*children_p, APR_ARRAY_IDX(kiddos, i, const char *),
+ (void *)1);
+ }
+ }
+ return SVN_NO_ERROR;
+}
+
+
+
+/*** Lock helper functions (path here are still FS paths, not on-disk
+ schema-supporting paths) ***/
+
+
+/* Write LOCK in FS to the actual OS filesystem.
+
+ Use PERMS_REFERENCE for the permissions of any digest files.
+ */
+static svn_error_t *
+set_lock(const char *fs_path,
+ svn_lock_t *lock,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool)
+{
+ const char *digest_path;
+ apr_hash_t *children;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, lock->path,
+ scratch_pool));
+
+ /* We could get away without reading the file as children should
+ always come back empty. */
+ SVN_ERR(read_digest_file(&children, NULL, fs_path, digest_path,
+ scratch_pool));
+
+ SVN_ERR(write_digest_file(children, lock, fs_path, digest_path,
+ perms_reference, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+delete_lock(const char *fs_path,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ const char *digest_path;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path, scratch_pool));
+
+ SVN_ERR(svn_io_remove_file2(digest_path, TRUE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+add_to_digest(const char *fs_path,
+ apr_array_header_t *paths,
+ const char *index_path,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool)
+{
+ const char *index_digest_path;
+ apr_hash_t *children;
+ svn_lock_t *lock;
+ int i;
+ unsigned int original_count;
+
+ SVN_ERR(digest_path_from_path(&index_digest_path, fs_path, index_path,
+ scratch_pool));
+ SVN_ERR(read_digest_file(&children, &lock, fs_path, index_digest_path,
+ scratch_pool));
+
+ original_count = apr_hash_count(children);
+
+ for (i = 0; i < paths->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ const char *digest_path, *digest_file;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path,
+ scratch_pool));
+ digest_file = svn_dirent_basename(digest_path, NULL);
+ svn_hash_sets(children, digest_file, (void *)1);
+ }
+
+ if (apr_hash_count(children) != original_count)
+ SVN_ERR(write_digest_file(children, lock, fs_path, index_digest_path,
+ perms_reference, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+delete_from_digest(const char *fs_path,
+ apr_array_header_t *paths,
+ const char *index_path,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool)
+{
+ const char *index_digest_path;
+ apr_hash_t *children;
+ svn_lock_t *lock;
+ int i;
+
+ SVN_ERR(digest_path_from_path(&index_digest_path, fs_path, index_path,
+ scratch_pool));
+ SVN_ERR(read_digest_file(&children, &lock, fs_path, index_digest_path,
+ scratch_pool));
+
+ for (i = 0; i < paths->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ const char *digest_path, *digest_file;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs_path, path,
+ scratch_pool));
+ digest_file = svn_dirent_basename(digest_path, NULL);
+ svn_hash_sets(children, digest_file, NULL);
+ }
+
+ if (apr_hash_count(children) || lock)
+ SVN_ERR(write_digest_file(children, lock, fs_path, index_digest_path,
+ perms_reference, scratch_pool));
+ else
+ SVN_ERR(svn_io_remove_file2(index_digest_path, TRUE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+unlock_single(svn_fs_t *fs,
+ svn_lock_t *lock,
+ apr_pool_t *pool);
+
+/* Set *LOCK_P to the lock for PATH in FS. HAVE_WRITE_LOCK should be
+ TRUE if the caller (or one of its callers) has taken out the
+ repository-wide write lock, FALSE otherwise. If MUST_EXIST is
+ not set, the function will simply return NULL in *LOCK_P instead
+ of creating an SVN_FS__ERR_NO_SUCH_LOCK error in case the lock
+ was not found (much faster). Use POOL for allocations. */
+static svn_error_t *
+get_lock(svn_lock_t **lock_p,
+ svn_fs_t *fs,
+ const char *path,
+ svn_boolean_t have_write_lock,
+ svn_boolean_t must_exist,
+ apr_pool_t *pool)
+{
+ svn_lock_t *lock = NULL;
+ const char *digest_path;
+ svn_node_kind_t kind;
+
+ SVN_ERR(digest_path_from_path(&digest_path, fs->path, path, pool));
+ SVN_ERR(svn_io_check_path(digest_path, &kind, pool));
+
+ *lock_p = NULL;
+ if (kind != svn_node_none)
+ SVN_ERR(read_digest_file(NULL, &lock, fs->path, digest_path, pool));
+
+ if (! lock)
+ return must_exist ? SVN_FS__ERR_NO_SUCH_LOCK(fs, path) : SVN_NO_ERROR;
+
+ /* Don't return an expired lock. */
+ if (lock->expiration_date && (apr_time_now() > lock->expiration_date))
+ {
+ /* Only remove the lock if we have the write lock.
+ Read operations shouldn't change the filesystem. */
+ if (have_write_lock)
+ SVN_ERR(unlock_single(fs, lock, pool));
+ return SVN_FS__ERR_LOCK_EXPIRED(fs, lock->token);
+ }
+
+ *lock_p = lock;
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *LOCK_P to the lock for PATH in FS. HAVE_WRITE_LOCK should be
+ TRUE if the caller (or one of its callers) has taken out the
+ repository-wide write lock, FALSE otherwise. Use POOL for
+ allocations. */
+static svn_error_t *
+get_lock_helper(svn_fs_t *fs,
+ svn_lock_t **lock_p,
+ const char *path,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool)
+{
+ svn_lock_t *lock;
+ svn_error_t *err;
+
+ err = get_lock(&lock, fs, path, have_write_lock, FALSE, pool);
+
+ /* We've deliberately decided that this function doesn't tell the
+ caller *why* the lock is unavailable. */
+ if (err && ((err->apr_err == SVN_ERR_FS_NO_SUCH_LOCK)
+ || (err->apr_err == SVN_ERR_FS_LOCK_EXPIRED)))
+ {
+ svn_error_clear(err);
+ *lock_p = NULL;
+ return SVN_NO_ERROR;
+ }
+ else
+ SVN_ERR(err);
+
+ *lock_p = lock;
+ return SVN_NO_ERROR;
+}
+
+
+/* Baton for locks_walker(). */
+typedef struct walk_locks_baton_t
+{
+ svn_fs_get_locks_callback_t get_locks_func;
+ void *get_locks_baton;
+ svn_fs_t *fs;
+} walk_locks_baton_t;
+
+/* Implements walk_digests_callback_t. */
+static svn_error_t *
+locks_walker(void *baton,
+ const char *fs_path,
+ const char *digest_path,
+ svn_lock_t *lock,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool)
+{
+ walk_locks_baton_t *wlb = baton;
+
+ if (lock)
+ {
+ /* Don't report an expired lock. */
+ if (lock->expiration_date == 0
+ || (apr_time_now() <= lock->expiration_date))
+ {
+ if (wlb->get_locks_func)
+ SVN_ERR(wlb->get_locks_func(wlb->get_locks_baton, lock, pool));
+ }
+ else
+ {
+ /* Only remove the lock if we have the write lock.
+ Read operations shouldn't change the filesystem. */
+ if (have_write_lock)
+ SVN_ERR(unlock_single(wlb->fs, lock, pool));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Callback type for walk_digest_files().
+ *
+ * LOCK come from a read_digest_file(digest_path) call.
+ */
+typedef svn_error_t *(*walk_digests_callback_t)(void *baton,
+ const char *fs_path,
+ const char *digest_path,
+ svn_lock_t *lock,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool);
+
+/* A function that calls WALK_DIGESTS_FUNC/WALK_DIGESTS_BATON for
+ all lock digest files in and under PATH in FS.
+ HAVE_WRITE_LOCK should be true if the caller (directly or indirectly)
+ has the FS write lock. */
+static svn_error_t *
+walk_digest_files(const char *fs_path,
+ const char *digest_path,
+ walk_digests_callback_t walk_digests_func,
+ void *walk_digests_baton,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool)
+{
+ apr_hash_index_t *hi;
+ apr_hash_t *children;
+ apr_pool_t *subpool;
+ svn_lock_t *lock;
+
+ /* First, send up any locks in the current digest file. */
+ SVN_ERR(read_digest_file(&children, &lock, fs_path, digest_path, pool));
+
+ SVN_ERR(walk_digests_func(walk_digests_baton, fs_path, digest_path, lock,
+ have_write_lock, pool));
+
+ /* Now, report all the child entries (if any; bail otherwise). */
+ if (! apr_hash_count(children))
+ return SVN_NO_ERROR;
+ subpool = svn_pool_create(pool);
+ for (hi = apr_hash_first(pool, children); hi; hi = apr_hash_next(hi))
+ {
+ const char *digest = apr_hash_this_key(hi);
+ svn_pool_clear(subpool);
+
+ SVN_ERR(read_digest_file
+ (NULL, &lock, fs_path,
+ digest_path_from_digest(fs_path, digest, subpool), subpool));
+
+ SVN_ERR(walk_digests_func(walk_digests_baton, fs_path, digest_path, lock,
+ have_write_lock, subpool));
+ }
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+/* A function that calls GET_LOCKS_FUNC/GET_LOCKS_BATON for
+ all locks in and under PATH in FS.
+ HAVE_WRITE_LOCK should be true if the caller (directly or indirectly)
+ has the FS write lock. */
+static svn_error_t *
+walk_locks(svn_fs_t *fs,
+ const char *digest_path,
+ svn_fs_get_locks_callback_t get_locks_func,
+ void *get_locks_baton,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *pool)
+{
+ walk_locks_baton_t wlb;
+
+ wlb.get_locks_func = get_locks_func;
+ wlb.get_locks_baton = get_locks_baton;
+ wlb.fs = fs;
+ SVN_ERR(walk_digest_files(fs->path, digest_path, locks_walker, &wlb,
+ have_write_lock, pool));
+ return SVN_NO_ERROR;
+}
+
+
+/* Utility function: verify that a lock can be used. Interesting
+ errors returned from this function:
+
+ SVN_ERR_FS_NO_USER: No username attached to FS.
+ SVN_ERR_FS_LOCK_OWNER_MISMATCH: FS's username doesn't match LOCK's owner.
+ SVN_ERR_FS_BAD_LOCK_TOKEN: FS doesn't hold matching lock-token for LOCK.
+ */
+static svn_error_t *
+verify_lock(svn_fs_t *fs,
+ svn_lock_t *lock)
+{
+ if ((! fs->access_ctx) || (! fs->access_ctx->username))
+ return svn_error_createf
+ (SVN_ERR_FS_NO_USER, NULL,
+ _("Cannot verify lock on path '%s'; no username available"),
+ lock->path);
+
+ else if (strcmp(fs->access_ctx->username, lock->owner) != 0)
+ return svn_error_createf
+ (SVN_ERR_FS_LOCK_OWNER_MISMATCH, NULL,
+ _("User '%s' does not own lock on path '%s' (currently locked by '%s')"),
+ fs->access_ctx->username, lock->path, lock->owner);
+
+ else if (svn_hash_gets(fs->access_ctx->lock_tokens, lock->token) == NULL)
+ return svn_error_createf
+ (SVN_ERR_FS_BAD_LOCK_TOKEN, NULL,
+ _("Cannot verify lock on path '%s'; no matching lock-token available"),
+ lock->path);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements the svn_fs_get_locks_callback_t interface, where
+ BATON is just an svn_fs_t object. */
+static svn_error_t *
+get_locks_callback(void *baton,
+ svn_lock_t *lock,
+ apr_pool_t *pool)
+{
+ return verify_lock(baton, lock);
+}
+
+
+/* The main routine for lock enforcement, used throughout libsvn_fs_x. */
+svn_error_t *
+svn_fs_x__allow_locked_operation(const char *path,
+ svn_fs_t *fs,
+ svn_boolean_t recurse,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *scratch_pool)
+{
+ path = svn_fs__canonicalize_abspath(path, scratch_pool);
+ if (recurse)
+ {
+ /* Discover all locks at or below the path. */
+ const char *digest_path;
+ SVN_ERR(digest_path_from_path(&digest_path, fs->path, path,
+ scratch_pool));
+ SVN_ERR(walk_locks(fs, digest_path, get_locks_callback,
+ fs, have_write_lock, scratch_pool));
+ }
+ else
+ {
+ /* Discover and verify any lock attached to the path. */
+ svn_lock_t *lock;
+ SVN_ERR(get_lock_helper(fs, &lock, path, have_write_lock,
+ scratch_pool));
+ if (lock)
+ SVN_ERR(verify_lock(fs, lock));
+ }
+ return SVN_NO_ERROR;
+}
+
+/* The effective arguments for lock_body() below. */
+typedef struct lock_baton_t {
+ svn_fs_t *fs;
+ apr_array_header_t *targets;
+ apr_array_header_t *infos;
+ const char *comment;
+ svn_boolean_t is_dav_comment;
+ apr_time_t expiration_date;
+ svn_boolean_t steal_lock;
+ apr_pool_t *result_pool;
+} lock_baton_t;
+
+static svn_error_t *
+check_lock(svn_error_t **fs_err,
+ const char *path,
+ const svn_fs_lock_target_t *target,
+ lock_baton_t *lb,
+ svn_fs_root_t *root,
+ svn_revnum_t youngest_rev,
+ apr_pool_t *pool)
+{
+ svn_node_kind_t kind;
+ svn_lock_t *existing_lock;
+
+ *fs_err = SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_x__check_path(&kind, root, path, pool));
+ if (kind == svn_node_dir)
+ {
+ *fs_err = SVN_FS__ERR_NOT_FILE(lb->fs, path);
+ return SVN_NO_ERROR;
+ }
+
+ /* While our locking implementation easily supports the locking of
+ nonexistent paths, we deliberately choose not to allow such madness. */
+ if (kind == svn_node_none)
+ {
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
+ *fs_err = svn_error_createf(
+ SVN_ERR_FS_OUT_OF_DATE, NULL,
+ _("Path '%s' doesn't exist in HEAD revision"),
+ path);
+ else
+ *fs_err = svn_error_createf(
+ SVN_ERR_FS_NOT_FOUND, NULL,
+ _("Path '%s' doesn't exist in HEAD revision"),
+ path);
+
+ return SVN_NO_ERROR;
+ }
+
+ /* Is the caller attempting to lock an out-of-date working file? */
+ if (SVN_IS_VALID_REVNUM(target->current_rev))
+ {
+ svn_revnum_t created_rev;
+
+ if (target->current_rev > youngest_rev)
+ {
+ *fs_err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"),
+ target->current_rev);
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_fs_x__node_created_rev(&created_rev, root, path,
+ pool));
+
+ /* SVN_INVALID_REVNUM means the path doesn't exist. So
+ apparently somebody is trying to lock something in their
+ working copy, but somebody else has deleted the thing
+ from HEAD. That counts as being 'out of date'. */
+ if (! SVN_IS_VALID_REVNUM(created_rev))
+ {
+ *fs_err = svn_error_createf
+ (SVN_ERR_FS_OUT_OF_DATE, NULL,
+ _("Path '%s' doesn't exist in HEAD revision"), path);
+
+ return SVN_NO_ERROR;
+ }
+
+ if (target->current_rev < created_rev)
+ {
+ *fs_err = svn_error_createf
+ (SVN_ERR_FS_OUT_OF_DATE, NULL,
+ _("Lock failed: newer version of '%s' exists"), path);
+
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* If the caller provided a TOKEN, we *really* need to see
+ if a lock already exists with that token, and if so, verify that
+ the lock's path matches PATH. Otherwise we run the risk of
+ breaking the 1-to-1 mapping of lock tokens to locked paths. */
+ /* ### TODO: actually do this check. This is tough, because the
+ schema doesn't supply a lookup-by-token mechanism. */
+
+ /* Is the path already locked?
+
+ Note that this next function call will automatically ignore any
+ errors about {the path not existing as a key, the path's token
+ not existing as a key, the lock just having been expired}. And
+ that's totally fine. Any of these three errors are perfectly
+ acceptable to ignore; it means that the path is now free and
+ clear for locking, because the fsx funcs just cleared out both
+ of the tables for us. */
+ SVN_ERR(get_lock_helper(lb->fs, &existing_lock, path, TRUE, pool));
+ if (existing_lock)
+ {
+ if (! lb->steal_lock)
+ {
+ /* Sorry, the path is already locked. */
+ *fs_err = SVN_FS__ERR_PATH_ALREADY_LOCKED(lb->fs, existing_lock);
+ return SVN_NO_ERROR;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+typedef struct lock_info_t {
+ const char *path;
+ const char *component;
+ svn_lock_t *lock;
+ svn_error_t *fs_err;
+} lock_info_t;
+
+/* The body of svn_fs_x__lock(), which see.
+
+ BATON is a 'lock_baton_t *' holding the effective arguments.
+ BATON->targets is an array of 'svn_sort__item_t' targets, sorted by
+ path, mapping canonical path to 'svn_fs_lock_target_t'. Set
+ BATON->infos to an array of 'lock_info_t' holding the results. For
+ the other arguments, see svn_fs_lock_many().
+
+ This implements the svn_fs_x__with_write_lock() 'body' callback
+ type, and assumes that the write lock is held.
+ */
+static svn_error_t *
+lock_body(void *baton, apr_pool_t *pool)
+{
+ lock_baton_t *lb = baton;
+ svn_fs_root_t *root;
+ svn_revnum_t youngest;
+ const char *rev_0_path;
+ int i, outstanding = 0;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ lb->infos = apr_array_make(lb->result_pool, lb->targets->nelts,
+ sizeof(lock_info_t));
+
+ /* Until we implement directory locks someday, we only allow locks
+ on files or non-existent paths. */
+ /* Use fs->vtable->foo instead of svn_fs_foo to avoid circular
+ library dependencies, which are not portable. */
+ SVN_ERR(lb->fs->vtable->youngest_rev(&youngest, lb->fs, pool));
+ SVN_ERR(lb->fs->vtable->revision_root(&root, lb->fs, youngest, pool));
+
+ for (i = 0; i < lb->targets->nelts; ++i)
+ {
+ const svn_sort__item_t *item = &APR_ARRAY_IDX(lb->targets, i,
+ svn_sort__item_t);
+ const svn_fs_lock_target_t *target = item->value;
+ lock_info_t info;
+
+ svn_pool_clear(iterpool);
+
+ info.path = item->key;
+ SVN_ERR(check_lock(&info.fs_err, info.path, target, lb, root,
+ youngest, iterpool));
+ info.lock = NULL;
+ info.component = NULL;
+ APR_ARRAY_PUSH(lb->infos, lock_info_t) = info;
+ if (!info.fs_err)
+ ++outstanding;
+ }
+
+ rev_0_path = svn_fs_x__path_rev_absolute(lb->fs, 0, pool);
+
+ /* Given the paths:
+
+ /foo/bar/f
+ /foo/bar/g
+ /zig/x
+
+ we loop through repeatedly. The first pass sees '/' on all paths
+ and writes the '/' index. The second pass sees '/foo' twice and
+ writes that index followed by '/zig' and that index. The third
+ pass sees '/foo/bar' twice and writes that index, and then writes
+ the lock for '/zig/x'. The fourth pass writes the locks for
+ '/foo/bar/f' and '/foo/bar/g'.
+
+ Writing indices before locks is correct: if interrupted it leaves
+ indices without locks rather than locks without indices. An
+ index without a lock is consistent in that it always shows up as
+ unlocked in svn_fs_x__allow_locked_operation. A lock without an
+ index is inconsistent, svn_fs_x__allow_locked_operation will
+ show locked on the file but unlocked on the parent. */
+
+
+ while (outstanding)
+ {
+ const char *last_path = NULL;
+ apr_array_header_t *paths;
+
+ svn_pool_clear(iterpool);
+ paths = apr_array_make(iterpool, 1, sizeof(const char *));
+
+ for (i = 0; i < lb->infos->nelts; ++i)
+ {
+ lock_info_t *info = &APR_ARRAY_IDX(lb->infos, i, lock_info_t);
+ const svn_sort__item_t *item = &APR_ARRAY_IDX(lb->targets, i,
+ svn_sort__item_t);
+ const svn_fs_lock_target_t *target = item->value;
+
+ if (!info->fs_err && !info->lock)
+ {
+ if (!info->component)
+ {
+ info->component = info->path;
+ APR_ARRAY_PUSH(paths, const char *) = info->path;
+ last_path = "/";
+ }
+ else
+ {
+ info->component = strchr(info->component + 1, '/');
+ if (!info->component)
+ {
+ /* The component is a path to lock, this cannot
+ match a previous path that need to be indexed. */
+ if (paths->nelts)
+ {
+ SVN_ERR(add_to_digest(lb->fs->path, paths, last_path,
+ rev_0_path, iterpool));
+ apr_array_clear(paths);
+ last_path = NULL;
+ }
+
+ info->lock = svn_lock_create(lb->result_pool);
+ if (target->token)
+ info->lock->token = target->token;
+ else
+ SVN_ERR(svn_fs_x__generate_lock_token(
+ &(info->lock->token), lb->fs,
+ lb->result_pool));
+ info->lock->path = info->path;
+ info->lock->owner = lb->fs->access_ctx->username;
+ info->lock->comment = lb->comment;
+ info->lock->is_dav_comment = lb->is_dav_comment;
+ info->lock->creation_date = apr_time_now();
+ info->lock->expiration_date = lb->expiration_date;
+
+ info->fs_err = set_lock(lb->fs->path, info->lock,
+ rev_0_path, iterpool);
+ --outstanding;
+ }
+ else
+ {
+ /* The component is a path to an index. */
+ apr_size_t len = info->component - info->path;
+
+ if (last_path
+ && (strncmp(last_path, info->path, len)
+ || strlen(last_path) != len))
+ {
+ /* No match to the previous paths to index. */
+ SVN_ERR(add_to_digest(lb->fs->path, paths, last_path,
+ rev_0_path, iterpool));
+ apr_array_clear(paths);
+ last_path = NULL;
+ }
+ APR_ARRAY_PUSH(paths, const char *) = info->path;
+ if (!last_path)
+ last_path = apr_pstrndup(iterpool, info->path, len);
+ }
+ }
+ }
+
+ if (last_path && i == lb->infos->nelts - 1)
+ SVN_ERR(add_to_digest(lb->fs->path, paths, last_path,
+ rev_0_path, iterpool));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* The effective arguments for unlock_body() below. */
+typedef struct unlock_baton_t {
+ svn_fs_t *fs;
+ apr_array_header_t *targets;
+ apr_array_header_t *infos;
+ /* Set skip_check TRUE to prevent the checks that set infos[].fs_err. */
+ svn_boolean_t skip_check;
+ svn_boolean_t break_lock;
+ apr_pool_t *result_pool;
+} unlock_baton_t;
+
+static svn_error_t *
+check_unlock(svn_error_t **fs_err,
+ const char *path,
+ const char *token,
+ unlock_baton_t *ub,
+ svn_fs_root_t *root,
+ apr_pool_t *pool)
+{
+ svn_lock_t *lock;
+
+ *fs_err = get_lock(&lock, ub->fs, path, TRUE, TRUE, pool);
+ if (!*fs_err && !ub->break_lock)
+ {
+ if (strcmp(token, lock->token) != 0)
+ *fs_err = SVN_FS__ERR_NO_SUCH_LOCK(ub->fs, path);
+ else if (strcmp(ub->fs->access_ctx->username, lock->owner) != 0)
+ *fs_err = SVN_FS__ERR_LOCK_OWNER_MISMATCH(ub->fs,
+ ub->fs->access_ctx->username,
+ lock->owner);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+typedef struct unlock_info_t {
+ const char *path;
+ const char *component;
+ svn_error_t *fs_err;
+ svn_boolean_t done;
+ int components;
+} unlock_info_t;
+
+/* The body of svn_fs_x__unlock(), which see.
+
+ BATON is a 'unlock_baton_t *' holding the effective arguments.
+ BATON->targets is an array of 'svn_sort__item_t' targets, sorted by
+ path, mapping canonical path to (const char *) token. Set
+ BATON->infos to an array of 'unlock_info_t' results. For the other
+ arguments, see svn_fs_unlock_many().
+
+ This implements the svn_fs_x__with_write_lock() 'body' callback
+ type, and assumes that the write lock is held.
+ */
+static svn_error_t *
+unlock_body(void *baton, apr_pool_t *pool)
+{
+ unlock_baton_t *ub = baton;
+ svn_fs_root_t *root;
+ svn_revnum_t youngest;
+ const char *rev_0_path;
+ int i, max_components = 0, outstanding = 0;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ ub->infos = apr_array_make(ub->result_pool, ub->targets->nelts,
+ sizeof( unlock_info_t));
+
+ SVN_ERR(ub->fs->vtable->youngest_rev(&youngest, ub->fs, pool));
+ SVN_ERR(ub->fs->vtable->revision_root(&root, ub->fs, youngest, pool));
+
+ for (i = 0; i < ub->targets->nelts; ++i)
+ {
+ const svn_sort__item_t *item = &APR_ARRAY_IDX(ub->targets, i,
+ svn_sort__item_t);
+ const char *token = item->value;
+ unlock_info_t info = { 0 };
+
+ svn_pool_clear(iterpool);
+
+ info.path = item->key;
+ if (!ub->skip_check)
+ SVN_ERR(check_unlock(&info.fs_err, info.path, token, ub, root,
+ iterpool));
+ if (!info.fs_err)
+ {
+ const char *s;
+
+ info.components = 1;
+ info.component = info.path;
+ while((s = strchr(info.component + 1, '/')))
+ {
+ info.component = s;
+ ++info.components;
+ }
+
+ if (info.components > max_components)
+ max_components = info.components;
+
+ ++outstanding;
+ }
+ APR_ARRAY_PUSH(ub->infos, unlock_info_t) = info;
+ }
+
+ rev_0_path = svn_fs_x__path_rev_absolute(ub->fs, 0, pool);
+
+ for (i = max_components; i >= 0; --i)
+ {
+ const char *last_path = NULL;
+ apr_array_header_t *paths;
+ int j;
+
+ svn_pool_clear(iterpool);
+ paths = apr_array_make(pool, 1, sizeof(const char *));
+
+ for (j = 0; j < ub->infos->nelts; ++j)
+ {
+ unlock_info_t *info = &APR_ARRAY_IDX(ub->infos, j, unlock_info_t);
+
+ if (!info->fs_err && info->path)
+ {
+
+ if (info->components == i)
+ {
+ SVN_ERR(delete_lock(ub->fs->path, info->path, iterpool));
+ info->done = TRUE;
+ }
+ else if (info->components > i)
+ {
+ apr_size_t len = info->component - info->path;
+
+ if (last_path
+ && strcmp(last_path, "/")
+ && (strncmp(last_path, info->path, len)
+ || strlen(last_path) != len))
+ {
+ SVN_ERR(delete_from_digest(ub->fs->path, paths, last_path,
+ rev_0_path, iterpool));
+ apr_array_clear(paths);
+ last_path = NULL;
+ }
+ APR_ARRAY_PUSH(paths, const char *) = info->path;
+ if (!last_path)
+ {
+ if (info->component > info->path)
+ last_path = apr_pstrndup(pool, info->path, len);
+ else
+ last_path = "/";
+ }
+
+ if (info->component > info->path)
+ {
+ --info->component;
+ while(info->component[0] != '/')
+ --info->component;
+ }
+ }
+ }
+
+ if (last_path && j == ub->infos->nelts - 1)
+ SVN_ERR(delete_from_digest(ub->fs->path, paths, last_path,
+ rev_0_path, iterpool));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Unlock the lock described by LOCK->path and LOCK->token in FS.
+
+ This assumes that the write lock is held.
+ */
+static svn_error_t *
+unlock_single(svn_fs_t *fs,
+ svn_lock_t *lock,
+ apr_pool_t *scratch_pool)
+{
+ unlock_baton_t ub;
+ svn_sort__item_t item;
+ apr_array_header_t *targets = apr_array_make(scratch_pool, 1,
+ sizeof(svn_sort__item_t));
+ item.key = lock->path;
+ item.klen = strlen(item.key);
+ item.value = (char*)lock->token;
+ APR_ARRAY_PUSH(targets, svn_sort__item_t) = item;
+
+ ub.fs = fs;
+ ub.targets = targets;
+ ub.skip_check = TRUE;
+ ub.result_pool = scratch_pool;
+
+ /* No ub.infos[].fs_err error because skip_check is TRUE. */
+ SVN_ERR(unlock_body(&ub, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/*** Public API implementations ***/
+
+svn_error_t *
+svn_fs_x__lock(svn_fs_t *fs,
+ apr_hash_t *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)
+{
+ lock_baton_t lb;
+ apr_array_header_t *sorted_targets;
+ apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
+ int i;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ /* We need to have a username attached to the fs. */
+ if (!fs->access_ctx || !fs->access_ctx->username)
+ return SVN_FS__ERR_NO_USER(fs);
+
+ /* The FS locking API allows both canonical and non-canonical
+ paths which means that the same canonical path could be
+ represented more than once in the TARGETS hash. We just keep
+ one, choosing one with a token if possible. */
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ const svn_fs_lock_target_t *target = apr_hash_this_val(hi);
+ const svn_fs_lock_target_t *other;
+
+ path = svn_fspath__canonicalize(path, result_pool);
+ other = svn_hash_gets(canonical_targets, path);
+
+ if (!other || (!other->token && target->token))
+ svn_hash_sets(canonical_targets, path, target);
+ }
+
+ sorted_targets = svn_sort__hash(canonical_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+
+ lb.fs = fs;
+ lb.targets = sorted_targets;
+ lb.comment = comment;
+ lb.is_dav_comment = is_dav_comment;
+ lb.expiration_date = expiration_date;
+ lb.steal_lock = steal_lock;
+ lb.result_pool = result_pool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_x__with_write_lock(fs, lock_body, &lb, iterpool);
+ for (i = 0; i < lb.infos->nelts; ++i)
+ {
+ struct lock_info_t *info = &APR_ARRAY_IDX(lb.infos, i,
+ struct lock_info_t);
+ svn_pool_clear(iterpool);
+ if (!cb_err && lock_callback)
+ {
+ if (!info->lock && !info->fs_err)
+ info->fs_err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED,
+ 0, _("Failed to lock '%s'"),
+ info->path);
+
+ cb_err = lock_callback(lock_baton, info->path, info->lock,
+ info->fs_err, iterpool);
+ }
+ svn_error_clear(info->fs_err);
+ }
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
+
+ return svn_error_trace(err);
+}
+
+
+svn_error_t *
+svn_fs_x__generate_lock_token(const char **token,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ /* Notice that 'fs' is currently unused. But perhaps someday, we'll
+ want to use the fs UUID + some incremented number? For now, we
+ generate a URI that matches the DAV RFC. We could change this to
+ some other URI scheme someday, if we wish. */
+ *token = apr_pstrcat(pool, "opaquelocktoken:",
+ svn_uuid_generate(pool), SVN_VA_NULL);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__unlock(svn_fs_t *fs,
+ apr_hash_t *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)
+{
+ unlock_baton_t ub;
+ apr_array_header_t *sorted_targets;
+ apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
+ int i;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ /* We need to have a username attached to the fs. */
+ if (!fs->access_ctx || !fs->access_ctx->username)
+ return SVN_FS__ERR_NO_USER(fs);
+
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
+ const char *other;
+
+ path = svn_fspath__canonicalize(path, result_pool);
+ other = svn_hash_gets(canonical_targets, path);
+
+ if (!other)
+ svn_hash_sets(canonical_targets, path, token);
+ }
+
+ sorted_targets = svn_sort__hash(canonical_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+
+ ub.fs = fs;
+ ub.targets = sorted_targets;
+ ub.skip_check = FALSE;
+ ub.break_lock = break_lock;
+ ub.result_pool = result_pool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_x__with_write_lock(fs, unlock_body, &ub, iterpool);
+ for (i = 0; i < ub.infos->nelts; ++i)
+ {
+ unlock_info_t *info = &APR_ARRAY_IDX(ub.infos, i, unlock_info_t);
+ svn_pool_clear(iterpool);
+ if (!cb_err && lock_callback)
+ {
+ if (!info->done && !info->fs_err)
+ info->fs_err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED,
+ 0, _("Failed to unlock '%s'"),
+ info->path);
+ cb_err = lock_callback(lock_baton, info->path, NULL, info->fs_err,
+ iterpool);
+ }
+ svn_error_clear(info->fs_err);
+ }
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
+
+ return svn_error_trace(err);
+}
+
+
+svn_error_t *
+svn_fs_x__get_lock(svn_lock_t **lock_p,
+ svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ path = svn_fs__canonicalize_abspath(path, pool);
+ return get_lock_helper(fs, lock_p, path, FALSE, pool);
+}
+
+
+/* Baton for get_locks_filter_func(). */
+typedef struct get_locks_filter_baton_t
+{
+ const char *path;
+ svn_depth_t requested_depth;
+ svn_fs_get_locks_callback_t get_locks_func;
+ void *get_locks_baton;
+
+} get_locks_filter_baton_t;
+
+
+/* A wrapper for the GET_LOCKS_FUNC passed to svn_fs_x__get_locks()
+ which filters out locks on paths that aren't within
+ BATON->requested_depth of BATON->path before called
+ BATON->get_locks_func() with BATON->get_locks_baton.
+
+ NOTE: See issue #3660 for details about how the FSX lock
+ management code is inconsistent. Until that inconsistency is
+ resolved, we take this filtering approach rather than honoring
+ depth requests closer to the crawling code. In other words, once
+ we decide how to resolve issue #3660, there might be a more
+ performant way to honor the depth passed to svn_fs_x__get_locks(). */
+static svn_error_t *
+get_locks_filter_func(void *baton,
+ svn_lock_t *lock,
+ apr_pool_t *pool)
+{
+ get_locks_filter_baton_t *b = baton;
+
+ /* Filter out unwanted paths. Since Subversion only allows
+ locks on files, we can treat depth=immediates the same as
+ depth=files for filtering purposes. Meaning, we'll keep
+ this lock if:
+
+ a) its path is the very path we queried, or
+ b) we've asked for a fully recursive answer, or
+ c) we've asked for depth=files or depth=immediates, and this
+ lock is on an immediate child of our query path.
+ */
+ if ((strcmp(b->path, lock->path) == 0)
+ || (b->requested_depth == svn_depth_infinity))
+ {
+ SVN_ERR(b->get_locks_func(b->get_locks_baton, lock, pool));
+ }
+ else if ((b->requested_depth == svn_depth_files) ||
+ (b->requested_depth == svn_depth_immediates))
+ {
+ const char *rel_uri = svn_fspath__skip_ancestor(b->path, lock->path);
+ if (rel_uri && (svn_path_component_count(rel_uri) == 1))
+ SVN_ERR(b->get_locks_func(b->get_locks_baton, lock, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_locks(svn_fs_t *fs,
+ const char *path,
+ svn_depth_t depth,
+ svn_fs_get_locks_callback_t get_locks_func,
+ void *get_locks_baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *digest_path;
+ get_locks_filter_baton_t glfb;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ path = svn_fs__canonicalize_abspath(path, scratch_pool);
+
+ glfb.path = path;
+ glfb.requested_depth = depth;
+ glfb.get_locks_func = get_locks_func;
+ glfb.get_locks_baton = get_locks_baton;
+
+ /* Get the top digest path in our tree of interest, and then walk it. */
+ SVN_ERR(digest_path_from_path(&digest_path, fs->path, path, scratch_pool));
+ SVN_ERR(walk_locks(fs, digest_path, get_locks_filter_func, &glfb,
+ FALSE, scratch_pool));
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/lock.h b/subversion/libsvn_fs_x/lock.h
new file mode 100644
index 0000000..1db5eb7
--- /dev/null
+++ b/subversion/libsvn_fs_x/lock.h
@@ -0,0 +1,116 @@
+/* lock.h : internal interface to lock functions
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_LOCK_H
+#define SVN_LIBSVN_FS_LOCK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* These functions implement some of the calls in the FS loader
+ library's fs vtables. */
+
+/* See svn_fs_lock(), svn_fs_lock_many(). */
+svn_error_t *
+svn_fs_x__lock(svn_fs_t *fs,
+ apr_hash_t *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);
+
+/* See svn_fs_generate_lock_token(). */
+svn_error_t *
+svn_fs_x__generate_lock_token(const char **token,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* See svn_fs_unlock(), svn_fs_unlock_many(). */
+svn_error_t *
+svn_fs_x__unlock(svn_fs_t *fs,
+ apr_hash_t *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);
+
+/* See svn_fs_get_lock(). */
+svn_error_t *
+svn_fs_x__get_lock(svn_lock_t **lock,
+ svn_fs_t *fs,
+ const char *path,
+ apr_pool_t *pool);
+
+/* See svn_fs_get_locks2(). */
+svn_error_t *
+svn_fs_x__get_locks(svn_fs_t *fs,
+ const char *path,
+ svn_depth_t depth,
+ svn_fs_get_locks_callback_t get_locks_func,
+ void *get_locks_baton,
+ apr_pool_t *scratch_pool);
+
+
+/* Examine PATH for existing locks, and check whether they can be
+ used. Use SCRATCH_POOL for temporary allocations.
+
+ If no locks are present, return SVN_NO_ERROR.
+
+ If PATH is locked (or contains locks "below" it, when RECURSE is
+ set), then verify that:
+
+ 1. a username has been supplied to TRAIL->fs's access-context,
+ else return SVN_ERR_FS_NO_USER.
+
+ 2. for every lock discovered, the current username in the access
+ context of TRAIL->fs matches the "owner" of the lock, else
+ return SVN_ERR_FS_LOCK_OWNER_MISMATCH.
+
+ 3. for every lock discovered, a matching lock token has been
+ passed into TRAIL->fs's access-context, else return
+ SVN_ERR_FS_BAD_LOCK_TOKEN.
+
+ If all three conditions are met, return SVN_NO_ERROR.
+
+ If the caller (directly or indirectly) has the FS write lock,
+ HAVE_WRITE_LOCK should be true.
+*/
+svn_error_t *
+svn_fs_x__allow_locked_operation(const char *path,
+ svn_fs_t *fs,
+ svn_boolean_t recurse,
+ svn_boolean_t have_write_lock,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_LOCK_H */
diff --git a/subversion/libsvn_fs_x/low_level.c b/subversion/libsvn_fs_x/low_level.c
new file mode 100644
index 0000000..76f3fd2
--- /dev/null
+++ b/subversion/libsvn_fs_x/low_level.c
@@ -0,0 +1,1123 @@
+/* low_level.c --- low level r/w access to fs_x file structures
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_private_config.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_fspath.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "low_level.h"
+#include "util.h"
+#include "pack.h"
+#include "cached_data.h"
+
+/* Headers used to describe node-revision in the revision file. */
+#define HEADER_ID "id"
+#define HEADER_NODE "node"
+#define HEADER_COPY "copy"
+#define HEADER_TYPE "type"
+#define HEADER_COUNT "count"
+#define HEADER_PROPS "props"
+#define HEADER_TEXT "text"
+#define HEADER_CPATH "cpath"
+#define HEADER_PRED "pred"
+#define HEADER_COPYFROM "copyfrom"
+#define HEADER_COPYROOT "copyroot"
+#define HEADER_MINFO_HERE "minfo-here"
+#define HEADER_MINFO_CNT "minfo-cnt"
+
+/* Kinds that a change can be. */
+#define ACTION_MODIFY "modify"
+#define ACTION_ADD "add"
+#define ACTION_DELETE "delete"
+#define ACTION_REPLACE "replace"
+#define ACTION_RESET "reset"
+
+/* True and False flags. */
+#define FLAG_TRUE "true"
+#define FLAG_FALSE "false"
+
+/* Kinds of representation. */
+#define REP_DELTA "DELTA"
+
+/* An arbitrary maximum path length, so clients can't run us out of memory
+ * by giving us arbitrarily large paths. */
+#define FSX_MAX_PATH_LEN 4096
+
+/* The 256 is an arbitrary size large enough to hold the node id and the
+ * various flags. */
+#define MAX_CHANGE_LINE_LEN FSX_MAX_PATH_LEN + 256
+
+/* Convert the C string in *TEXT to a revision number and return it in *REV.
+ * Overflows, negative values other than -1 and terminating characters other
+ * than 0x20 or 0x0 will cause an error. Set *TEXT to the first char after
+ * the initial separator or to EOS.
+ */
+static svn_error_t *
+parse_revnum(svn_revnum_t *rev,
+ const char **text)
+{
+ const char *string = *text;
+ if ((string[0] == '-') && (string[1] == '1'))
+ {
+ *rev = SVN_INVALID_REVNUM;
+ string += 2;
+ }
+ else
+ {
+ SVN_ERR(svn_revnum_parse(rev, string, &string));
+ }
+
+ if (*string == ' ')
+ ++string;
+ else if (*string != '\0')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid character in revision number"));
+
+ *text = string;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__parse_footer(apr_off_t *l2p_offset,
+ svn_checksum_t **l2p_checksum,
+ apr_off_t *p2l_offset,
+ svn_checksum_t **p2l_checksum,
+ svn_stringbuf_t *footer,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ apr_int64_t val;
+ char *last_str = footer->data;
+
+ /* Get the L2P offset. */
+ const char *str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *l2p_offset = (apr_off_t)val;
+
+ /* Get the L2P checksum. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_checksum_parse_hex(l2p_checksum, svn_checksum_md5, str,
+ result_pool));
+
+ /* Get the P2L offset. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ *p2l_offset = (apr_off_t)val;
+
+ /* Get the P2L checksum. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid revision footer"));
+
+ SVN_ERR(svn_checksum_parse_hex(p2l_checksum, svn_checksum_md5, str,
+ result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_stringbuf_t *
+svn_fs_x__unparse_footer(apr_off_t l2p_offset,
+ svn_checksum_t *l2p_checksum,
+ apr_off_t p2l_offset,
+ svn_checksum_t *p2l_checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_stringbuf_createf(result_pool,
+ "%" APR_OFF_T_FMT " %s %" APR_OFF_T_FMT " %s",
+ l2p_offset,
+ svn_checksum_to_cstring(l2p_checksum,
+ scratch_pool),
+ p2l_offset,
+ svn_checksum_to_cstring(p2l_checksum,
+ scratch_pool));
+}
+
+/* Given a revision file FILE that has been pre-positioned at the
+ beginning of a Node-Rev header block, read in that header block and
+ store it in the apr_hash_t HEADERS. All allocations will be from
+ RESULT_POOL. */
+static svn_error_t *
+read_header_block(apr_hash_t **headers,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool)
+{
+ *headers = svn_hash__make(result_pool);
+
+ while (1)
+ {
+ svn_stringbuf_t *header_str;
+ const char *name, *value;
+ apr_size_t i = 0;
+ apr_size_t name_len;
+ svn_boolean_t eof;
+
+ SVN_ERR(svn_stream_readline(stream, &header_str, "\n", &eof,
+ result_pool));
+
+ if (eof || header_str->len == 0)
+ break; /* end of header block */
+
+ while (header_str->data[i] != ':')
+ {
+ if (header_str->data[i] == '\0')
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Found malformed header '%s' in "
+ "revision file"),
+ header_str->data);
+ i++;
+ }
+
+ /* Create a 'name' string and point to it. */
+ header_str->data[i] = '\0';
+ name = header_str->data;
+ name_len = i;
+
+ /* Check if we have enough data to parse. */
+ if (i + 2 > header_str->len)
+ {
+ /* Restore the original line for the error. */
+ header_str->data[i] = ':';
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Found malformed header '%s' in "
+ "revision file"),
+ header_str->data);
+ }
+
+ /* Skip over the NULL byte and the space following it. */
+ i += 2;
+
+ value = header_str->data + i;
+
+ /* header_str is safely in our pool, so we can use bits of it as
+ key and value. */
+ apr_hash_set(*headers, name, name_len, value);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__parse_representation(svn_fs_x__representation_t **rep_p,
+ svn_stringbuf_t *text,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_t *rep;
+ char *str;
+ apr_int64_t val;
+ char *string = text->data;
+ svn_checksum_t *checksum;
+
+ rep = apr_pcalloc(result_pool, sizeof(*rep));
+ *rep_p = rep;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_cstring_atoi64(&rep->id.change_set, str));
+
+ /* while in transactions, it is legal to simply write "-1" */
+ if (rep->id.change_set == -1)
+ return SVN_NO_ERROR;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ {
+ if (rep->id.change_set == SVN_FS_X__INVALID_CHANGE_SET)
+ return SVN_NO_ERROR;
+
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+ }
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->id.number = (apr_off_t)val;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->size = (svn_filesize_t)val;
+
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ rep->expanded_size = (svn_filesize_t)val;
+
+ /* Read in the MD5 hash. */
+ str = svn_cstring_tokenize(" ", &string);
+ if ((str == NULL) || (strlen(str) != (APR_MD5_DIGESTSIZE * 2)))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_md5, str,
+ scratch_pool));
+ if (checksum)
+ memcpy(rep->md5_digest, checksum->digest, sizeof(rep->md5_digest));
+
+ /* The remaining fields are only used for formats >= 4, so check that. */
+ str = svn_cstring_tokenize(" ", &string);
+ if (str == NULL)
+ return SVN_NO_ERROR;
+
+ /* Read the SHA1 hash. */
+ if (strlen(str) != (APR_SHA1_DIGESTSIZE * 2))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed text representation offset line in node-rev"));
+
+ SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1, str,
+ scratch_pool));
+ rep->has_sha1 = checksum != NULL;
+ if (checksum)
+ memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
+
+ return SVN_NO_ERROR;
+}
+
+/* Wrap read_rep_offsets_body(), extracting its TXN_ID from our NODEREV_ID,
+ and adding an error message. */
+static svn_error_t *
+read_rep_offsets(svn_fs_x__representation_t **rep_p,
+ char *string,
+ const svn_fs_x__id_t *noderev_id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err
+ = svn_fs_x__parse_representation(rep_p,
+ svn_stringbuf_create_wrap(string,
+ scratch_pool),
+ result_pool,
+ scratch_pool);
+ if (err)
+ {
+ const svn_string_t *id_unparsed;
+ const char *where;
+
+ id_unparsed = svn_fs_x__id_unparse(noderev_id, scratch_pool);
+ where = apr_psprintf(scratch_pool,
+ _("While reading representation offsets "
+ "for node-revision '%s':"),
+ id_unparsed->data);
+
+ return svn_error_quick_wrap(err, where);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* If PATH needs to be escaped, return an escaped version of it, allocated
+ * from RESULT_POOL. Otherwise, return PATH directly. */
+static const char *
+auto_escape_path(const char *path,
+ apr_pool_t *result_pool)
+{
+ apr_size_t len = strlen(path);
+ apr_size_t i;
+ const char esc = '\x1b';
+
+ for (i = 0; i < len; ++i)
+ if (path[i] < ' ')
+ {
+ svn_stringbuf_t *escaped = svn_stringbuf_create_ensure(2 * len,
+ result_pool);
+ for (i = 0; i < len; ++i)
+ if (path[i] < ' ')
+ {
+ svn_stringbuf_appendbyte(escaped, esc);
+ svn_stringbuf_appendbyte(escaped, path[i] + 'A' - 1);
+ }
+ else
+ {
+ svn_stringbuf_appendbyte(escaped, path[i]);
+ }
+
+ return escaped->data;
+ }
+
+ return path;
+}
+
+/* If PATH has been escaped, return the un-escaped version of it, allocated
+ * from RESULT_POOL. Otherwise, return PATH directly. */
+static const char *
+auto_unescape_path(const char *path,
+ apr_pool_t *result_pool)
+{
+ const char esc = '\x1b';
+ if (strchr(path, esc))
+ {
+ apr_size_t len = strlen(path);
+ apr_size_t i;
+
+ svn_stringbuf_t *unescaped = svn_stringbuf_create_ensure(len,
+ result_pool);
+ for (i = 0; i < len; ++i)
+ if (path[i] == esc)
+ svn_stringbuf_appendbyte(unescaped, path[++i] + 1 - 'A');
+ else
+ svn_stringbuf_appendbyte(unescaped, path[i]);
+
+ return unescaped->data;
+ }
+
+ return path;
+}
+
+/* Find entry HEADER_NAME in HEADERS and parse its value into *ID. */
+static svn_error_t *
+read_id_part(svn_fs_x__id_t *id,
+ apr_hash_t *headers,
+ const char *header_name)
+{
+ const char *value = svn_hash_gets(headers, header_name);
+ if (value == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing %s field in node-rev"),
+ header_name);
+
+ SVN_ERR(svn_fs_x__id_parse(id, value));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_noderev(svn_fs_x__noderev_t **noderev_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *headers;
+ svn_fs_x__noderev_t *noderev;
+ char *value;
+ const char *noderev_id;
+
+ SVN_ERR(read_header_block(&headers, stream, scratch_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ noderev = apr_pcalloc(result_pool, sizeof(*noderev));
+
+ /* for error messages later */
+ noderev_id = svn_hash_gets(headers, HEADER_ID);
+
+ /* Read the node-rev id. */
+ SVN_ERR(read_id_part(&noderev->noderev_id, headers, HEADER_ID));
+ SVN_ERR(read_id_part(&noderev->node_id, headers, HEADER_NODE));
+ SVN_ERR(read_id_part(&noderev->copy_id, headers, HEADER_COPY));
+
+ /* Read the type. */
+ value = svn_hash_gets(headers, HEADER_TYPE);
+
+ if ((value == NULL) ||
+ ( strcmp(value, SVN_FS_X__KIND_FILE)
+ && strcmp(value, SVN_FS_X__KIND_DIR)))
+ /* ### s/kind/type/ */
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing kind field in node-rev '%s'"),
+ noderev_id);
+
+ noderev->kind = (strcmp(value, SVN_FS_X__KIND_FILE) == 0)
+ ? svn_node_file
+ : svn_node_dir;
+
+ /* Read the 'count' field. */
+ value = svn_hash_gets(headers, HEADER_COUNT);
+ if (value)
+ SVN_ERR(svn_cstring_atoi(&noderev->predecessor_count, value));
+ else
+ noderev->predecessor_count = 0;
+
+ /* Get the properties location. */
+ value = svn_hash_gets(headers, HEADER_PROPS);
+ if (value)
+ {
+ SVN_ERR(read_rep_offsets(&noderev->prop_rep, value,
+ &noderev->noderev_id, result_pool,
+ scratch_pool));
+ }
+
+ /* Get the data location. */
+ value = svn_hash_gets(headers, HEADER_TEXT);
+ if (value)
+ {
+ SVN_ERR(read_rep_offsets(&noderev->data_rep, value,
+ &noderev->noderev_id, result_pool,
+ scratch_pool));
+ }
+
+ /* Get the created path. */
+ value = svn_hash_gets(headers, HEADER_CPATH);
+ if (value == NULL)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing cpath field in node-rev '%s'"),
+ noderev_id);
+ }
+ else
+ {
+ if (!svn_fspath__is_canonical(value))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Non-canonical cpath field in node-rev '%s'"),
+ noderev_id);
+
+ noderev->created_path = auto_unescape_path(apr_pstrdup(result_pool,
+ value),
+ result_pool);
+ }
+
+ /* Get the predecessor ID. */
+ value = svn_hash_gets(headers, HEADER_PRED);
+ if (value)
+ SVN_ERR(svn_fs_x__id_parse(&noderev->predecessor_id, value));
+ else
+ svn_fs_x__id_reset(&noderev->predecessor_id);
+
+ /* Get the copyroot. */
+ value = svn_hash_gets(headers, HEADER_COPYROOT);
+ if (value == NULL)
+ {
+ noderev->copyroot_path = noderev->created_path;
+ noderev->copyroot_rev
+ = svn_fs_x__get_revnum(noderev->noderev_id.change_set);
+ }
+ else
+ {
+ SVN_ERR(parse_revnum(&noderev->copyroot_rev, (const char **)&value));
+
+ if (!svn_fspath__is_canonical(value))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed copyroot line in node-rev '%s'"),
+ noderev_id);
+ noderev->copyroot_path = auto_unescape_path(apr_pstrdup(result_pool,
+ value),
+ result_pool);
+ }
+
+ /* Get the copyfrom. */
+ value = svn_hash_gets(headers, HEADER_COPYFROM);
+ if (value == NULL)
+ {
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+ }
+ else
+ {
+ SVN_ERR(parse_revnum(&noderev->copyfrom_rev, (const char **)&value));
+
+ if (*value == 0)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed copyfrom line in node-rev '%s'"),
+ noderev_id);
+ noderev->copyfrom_path = auto_unescape_path(apr_pstrdup(result_pool,
+ value),
+ result_pool);
+ }
+
+ /* Get the mergeinfo count. */
+ value = svn_hash_gets(headers, HEADER_MINFO_CNT);
+ if (value)
+ SVN_ERR(svn_cstring_atoi64(&noderev->mergeinfo_count, value));
+ else
+ noderev->mergeinfo_count = 0;
+
+ /* Get whether *this* node has mergeinfo. */
+ value = svn_hash_gets(headers, HEADER_MINFO_HERE);
+ noderev->has_mergeinfo = (value != NULL);
+
+ *noderev_p = noderev;
+
+ return SVN_NO_ERROR;
+}
+
+/* Return a textual representation of the DIGEST of given KIND.
+ * If IS_NULL is TRUE, no digest is available.
+ * Allocate the result in RESULT_POOL.
+ */
+static const char *
+format_digest(const unsigned char *digest,
+ svn_checksum_kind_t kind,
+ svn_boolean_t is_null,
+ apr_pool_t *result_pool)
+{
+ svn_checksum_t checksum;
+ checksum.digest = digest;
+ checksum.kind = kind;
+
+ if (is_null)
+ return "(null)";
+
+ return svn_checksum_to_cstring_display(&checksum, result_pool);
+}
+
+svn_stringbuf_t *
+svn_fs_x__unparse_representation(svn_fs_x__representation_t *rep,
+ svn_boolean_t mutable_rep_truncated,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (!rep->has_sha1)
+ return svn_stringbuf_createf
+ (result_pool,
+ "%" APR_INT64_T_FMT " %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
+ " %" SVN_FILESIZE_T_FMT " %s",
+ rep->id.change_set, rep->id.number, rep->size,
+ rep->expanded_size,
+ format_digest(rep->md5_digest, svn_checksum_md5, FALSE,
+ scratch_pool));
+
+ return svn_stringbuf_createf
+ (result_pool,
+ "%" APR_INT64_T_FMT " %" APR_UINT64_T_FMT " %" SVN_FILESIZE_T_FMT
+ " %" SVN_FILESIZE_T_FMT " %s %s",
+ rep->id.change_set, rep->id.number, rep->size,
+ rep->expanded_size,
+ format_digest(rep->md5_digest, svn_checksum_md5,
+ FALSE, scratch_pool),
+ format_digest(rep->sha1_digest, svn_checksum_sha1,
+ !rep->has_sha1, scratch_pool));
+}
+
+
+svn_error_t *
+svn_fs_x__write_noderev(svn_stream_t *outfile,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *scratch_pool)
+{
+ svn_string_t *str_id;
+
+ str_id = svn_fs_x__id_unparse(&noderev->noderev_id, scratch_pool);
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_ID ": %s\n",
+ str_id->data));
+ str_id = svn_fs_x__id_unparse(&noderev->node_id, scratch_pool);
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_NODE ": %s\n",
+ str_id->data));
+ str_id = svn_fs_x__id_unparse(&noderev->copy_id, scratch_pool);
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPY ": %s\n",
+ str_id->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TYPE ": %s\n",
+ (noderev->kind == svn_node_file) ?
+ SVN_FS_X__KIND_FILE : SVN_FS_X__KIND_DIR));
+
+ if (svn_fs_x__id_used(&noderev->predecessor_id))
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n",
+ svn_fs_x__id_unparse(&noderev->predecessor_id,
+ scratch_pool)->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n",
+ noderev->predecessor_count));
+
+ if (noderev->data_rep)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TEXT ": %s\n",
+ svn_fs_x__unparse_representation
+ (noderev->data_rep,
+ noderev->kind == svn_node_dir,
+ scratch_pool, scratch_pool)->data));
+
+ if (noderev->prop_rep)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PROPS ": %s\n",
+ svn_fs_x__unparse_representation
+ (noderev->prop_rep,
+ TRUE, scratch_pool, scratch_pool)->data));
+
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_CPATH ": %s\n",
+ auto_escape_path(noderev->created_path,
+ scratch_pool)));
+
+ if (noderev->copyfrom_path)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYFROM ": %ld"
+ " %s\n",
+ noderev->copyfrom_rev,
+ auto_escape_path(noderev->copyfrom_path,
+ scratch_pool)));
+
+ if ( ( noderev->copyroot_rev
+ != svn_fs_x__get_revnum(noderev->noderev_id.change_set))
+ || (strcmp(noderev->copyroot_path, noderev->created_path) != 0))
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYROOT ": %ld"
+ " %s\n",
+ noderev->copyroot_rev,
+ auto_escape_path(noderev->copyroot_path,
+ scratch_pool)));
+
+ if (noderev->mergeinfo_count > 0)
+ SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_MINFO_CNT ": %"
+ APR_INT64_T_FMT "\n",
+ noderev->mergeinfo_count));
+
+ if (noderev->has_mergeinfo)
+ SVN_ERR(svn_stream_puts(outfile, HEADER_MINFO_HERE ": y\n"));
+
+ return svn_stream_puts(outfile, "\n");
+}
+
+svn_error_t *
+svn_fs_x__read_rep_header(svn_fs_x__rep_header_t **header,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *buffer;
+ char *str, *last_str;
+ apr_int64_t val;
+ svn_boolean_t eol = FALSE;
+
+ SVN_ERR(svn_stream_readline(stream, &buffer, "\n", &eol, scratch_pool));
+
+ *header = apr_pcalloc(result_pool, sizeof(**header));
+ (*header)->header_size = buffer->len + 1;
+ if (strcmp(buffer->data, REP_DELTA) == 0)
+ {
+ /* This is a delta against the empty stream. */
+ (*header)->type = svn_fs_x__rep_self_delta;
+ return SVN_NO_ERROR;
+ }
+
+ (*header)->type = svn_fs_x__rep_delta;
+
+ /* We have hopefully a DELTA vs. a non-empty base revision. */
+ last_str = buffer->data;
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str || (strcmp(str, REP_DELTA) != 0))
+ goto error;
+
+ SVN_ERR(parse_revnum(&(*header)->base_revision, (const char **)&last_str));
+
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str)
+ goto error;
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ (*header)->base_item_index = (apr_off_t)val;
+
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (! str)
+ goto error;
+ SVN_ERR(svn_cstring_atoi64(&val, str));
+ (*header)->base_length = (svn_filesize_t)val;
+
+ return SVN_NO_ERROR;
+
+ error:
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Malformed representation header"));
+}
+
+svn_error_t *
+svn_fs_x__write_rep_header(svn_fs_x__rep_header_t *header,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ const char *text;
+
+ switch (header->type)
+ {
+ case svn_fs_x__rep_self_delta:
+ text = REP_DELTA "\n";
+ break;
+
+ default:
+ text = apr_psprintf(scratch_pool, REP_DELTA " %ld %" APR_OFF_T_FMT
+ " %" SVN_FILESIZE_T_FMT "\n",
+ header->base_revision, header->base_item_index,
+ header->base_length);
+ }
+
+ return svn_error_trace(svn_stream_puts(stream, text));
+}
+
+/* Read the next entry in the changes record from file FILE and store
+ the resulting change in *CHANGE_P. If there is no next record,
+ store NULL there. Perform all allocations from POOL. */
+static svn_error_t *
+read_change(svn_fs_x__change_t **change_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *line;
+ svn_boolean_t eof = TRUE;
+ svn_fs_x__change_t *change;
+ char *str, *last_str, *kind_str;
+
+ /* Default return value. */
+ *change_p = NULL;
+
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
+
+ /* Check for a blank line. */
+ if (eof || (line->len == 0))
+ return SVN_NO_ERROR;
+
+ change = apr_pcalloc(result_pool, sizeof(*change));
+ last_str = line->data;
+
+ /* Get the node-id of the change. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ SVN_ERR(svn_fs_x__id_parse(&change->noderev_id, str));
+
+ /* Get the change type. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ /* Don't bother to check the format number before looking for
+ * node-kinds: just read them if you find them. */
+ change->node_kind = svn_node_unknown;
+ kind_str = strchr(str, '-');
+ if (kind_str)
+ {
+ /* Cap off the end of "str" (the action). */
+ *kind_str = '\0';
+ kind_str++;
+ if (strcmp(kind_str, SVN_FS_X__KIND_FILE) == 0)
+ change->node_kind = svn_node_file;
+ else if (strcmp(kind_str, SVN_FS_X__KIND_DIR) == 0)
+ change->node_kind = svn_node_dir;
+ else
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+ }
+
+ if (strcmp(str, ACTION_MODIFY) == 0)
+ {
+ change->change_kind = svn_fs_path_change_modify;
+ }
+ else if (strcmp(str, ACTION_ADD) == 0)
+ {
+ change->change_kind = svn_fs_path_change_add;
+ }
+ else if (strcmp(str, ACTION_DELETE) == 0)
+ {
+ change->change_kind = svn_fs_path_change_delete;
+ }
+ else if (strcmp(str, ACTION_REPLACE) == 0)
+ {
+ change->change_kind = svn_fs_path_change_replace;
+ }
+ else if (strcmp(str, ACTION_RESET) == 0)
+ {
+ change->change_kind = svn_fs_path_change_reset;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change kind in rev file"));
+ }
+
+ /* Get the text-mod flag. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ change->text_mod = TRUE;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ change->text_mod = FALSE;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid text-mod flag in rev-file"));
+ }
+
+ /* Get the prop-mod flag. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ change->prop_mod = TRUE;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ change->prop_mod = FALSE;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid prop-mod flag in rev-file"));
+ }
+
+ /* Get the mergeinfo-mod flag. */
+ str = svn_cstring_tokenize(" ", &last_str);
+ if (str == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid changes line in rev-file"));
+
+ if (strcmp(str, FLAG_TRUE) == 0)
+ {
+ change->mergeinfo_mod = svn_tristate_true;
+ }
+ else if (strcmp(str, FLAG_FALSE) == 0)
+ {
+ change->mergeinfo_mod = svn_tristate_false;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid mergeinfo-mod flag in rev-file"));
+ }
+
+ /* Get the changed path. */
+ if (!svn_fspath__is_canonical(last_str))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid path in changes line"));
+
+ change->path.data = auto_unescape_path(apr_pstrmemdup(result_pool,
+ last_str,
+ strlen(last_str)),
+ result_pool);
+ change->path.len = strlen(change->path.data);
+
+ /* Read the next line, the copyfrom line. */
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, result_pool));
+ change->copyfrom_known = TRUE;
+ if (eof || line->len == 0)
+ {
+ change->copyfrom_rev = SVN_INVALID_REVNUM;
+ change->copyfrom_path = NULL;
+ }
+ else
+ {
+ last_str = line->data;
+ SVN_ERR(parse_revnum(&change->copyfrom_rev, (const char **)&last_str));
+
+ if (!svn_fspath__is_canonical(last_str))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid copy-from path in changes line"));
+
+ change->copyfrom_path = auto_unescape_path(last_str, result_pool);
+ }
+
+ *change_p = change;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_changes(apr_array_header_t **changes,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__change_t *change;
+ apr_pool_t *iterpool;
+
+ /* Pre-allocate enough room for most change lists.
+ (will be auto-expanded as necessary).
+
+ Chose the default to just below 2^N such that the doubling reallocs
+ will request roughly 2^M bytes from the OS without exceeding the
+ respective two-power by just a few bytes (leaves room array and APR
+ node overhead for large enough M).
+ */
+ *changes = apr_array_make(result_pool, 63, sizeof(svn_fs_x__change_t *));
+
+ SVN_ERR(read_change(&change, stream, result_pool, scratch_pool));
+ iterpool = svn_pool_create(scratch_pool);
+ while (change)
+ {
+ APR_ARRAY_PUSH(*changes, svn_fs_x__change_t*) = change;
+ SVN_ERR(read_change(&change, stream, result_pool, iterpool));
+ svn_pool_clear(iterpool);
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_changes_incrementally(svn_stream_t *stream,
+ svn_fs_x__change_receiver_t
+ change_receiver,
+ void *change_receiver_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__change_t *change;
+ apr_pool_t *iterpool;
+
+ iterpool = svn_pool_create(scratch_pool);
+ do
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(read_change(&change, stream, iterpool, iterpool));
+ if (change)
+ SVN_ERR(change_receiver(change_receiver_baton, change, iterpool));
+ }
+ while (change);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Write a single change entry, path PATH, change CHANGE, to STREAM.
+
+ All temporary allocations are in SCRATCH_POOL. */
+static svn_error_t *
+write_change_entry(svn_stream_t *stream,
+ svn_fs_x__change_t *change,
+ apr_pool_t *scratch_pool)
+{
+ const char *idstr;
+ const char *change_string = NULL;
+ const char *kind_string = "";
+ svn_stringbuf_t *buf;
+ apr_size_t len;
+
+ switch (change->change_kind)
+ {
+ case svn_fs_path_change_modify:
+ change_string = ACTION_MODIFY;
+ break;
+ case svn_fs_path_change_add:
+ change_string = ACTION_ADD;
+ break;
+ case svn_fs_path_change_delete:
+ change_string = ACTION_DELETE;
+ break;
+ case svn_fs_path_change_replace:
+ change_string = ACTION_REPLACE;
+ break;
+ case svn_fs_path_change_reset:
+ change_string = ACTION_RESET;
+ break;
+ default:
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change type %d"),
+ change->change_kind);
+ }
+
+ idstr = svn_fs_x__id_unparse(&change->noderev_id, scratch_pool)->data;
+
+ SVN_ERR_ASSERT(change->node_kind == svn_node_dir
+ || change->node_kind == svn_node_file);
+ kind_string = apr_psprintf(scratch_pool, "-%s",
+ change->node_kind == svn_node_dir
+ ? SVN_FS_X__KIND_DIR
+ : SVN_FS_X__KIND_FILE);
+
+ buf = svn_stringbuf_createf(scratch_pool, "%s %s%s %s %s %s %s\n",
+ idstr, change_string, kind_string,
+ change->text_mod ? FLAG_TRUE : FLAG_FALSE,
+ change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
+ change->mergeinfo_mod == svn_tristate_true
+ ? FLAG_TRUE : FLAG_FALSE,
+ auto_escape_path(change->path.data, scratch_pool));
+
+ if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
+ {
+ svn_stringbuf_appendcstr(buf, apr_psprintf(scratch_pool, "%ld %s",
+ change->copyfrom_rev,
+ auto_escape_path(change->copyfrom_path,
+ scratch_pool)));
+ }
+
+ svn_stringbuf_appendbyte(buf, '\n');
+
+ /* Write all change info in one write call. */
+ len = buf->len;
+ return svn_error_trace(svn_stream_write(stream, buf->data, &len));
+}
+
+svn_error_t *
+svn_fs_x__write_changes(svn_stream_t *stream,
+ svn_fs_t *fs,
+ apr_hash_t *changes,
+ svn_boolean_t terminate_list,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *sorted_changed_paths;
+ int i;
+
+ /* For the sake of the repository administrator sort the changes so
+ that the final file is deterministic and repeatable, however the
+ rest of the FSX code doesn't require any particular order here.
+
+ Also, this sorting is only effective in writing all entries with
+ a single call as write_final_changed_path_info() does. For the
+ list being written incrementally during transaction, we actually
+ *must not* change the order of entries from different calls.
+ */
+ sorted_changed_paths = svn_sort__hash(changes,
+ svn_sort_compare_items_lexically,
+ scratch_pool);
+
+ /* Write all items to disk in the new order. */
+ for (i = 0; i < sorted_changed_paths->nelts; ++i)
+ {
+ svn_fs_x__change_t *change;
+
+ svn_pool_clear(iterpool);
+ change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
+
+ /* Write out the new entry into the final rev-file. */
+ SVN_ERR(write_change_entry(stream, change, iterpool));
+ }
+
+ if (terminate_list)
+ svn_stream_puts(stream, "\n");
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
diff --git a/subversion/libsvn_fs_x/low_level.h b/subversion/libsvn_fs_x/low_level.h
new file mode 100644
index 0000000..e4fdf05
--- /dev/null
+++ b/subversion/libsvn_fs_x/low_level.h
@@ -0,0 +1,214 @@
+/* low_level.c --- low level r/w access to fs_x file structures
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__LOW_LEVEL_H
+#define SVN_LIBSVN_FS__LOW_LEVEL_H
+
+#include "svn_fs.h"
+
+#include "fs_x.h"
+#include "id.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Kinds that a node-rev can be. */
+#define SVN_FS_X__KIND_FILE "file"
+#define SVN_FS_X__KIND_DIR "dir"
+
+/* The functions are grouped as follows:
+ *
+ * - revision footer
+ * - representation (as in "text:" and "props:" lines)
+ * - node revision
+ * - representation header ("DELTA" lines)
+ * - changed path list
+ */
+
+/* Given the FSX revision / pack FOOTER, parse it destructively
+ * and return the start offsets of the index data in *L2P_OFFSET and
+ * *P2L_OFFSET, respectively. Also, return the expected checksums in
+ * in *L2P_CHECKSUM and *P2L_CHECKSUM.
+ *
+ * Note that REV is only used to construct nicer error objects that
+ * mention this revision. Allocate the checksums in RESULT_POOL.
+ */
+svn_error_t *
+svn_fs_x__parse_footer(apr_off_t *l2p_offset,
+ svn_checksum_t **l2p_checksum,
+ apr_off_t *p2l_offset,
+ svn_checksum_t **p2l_checksum,
+ svn_stringbuf_t *footer,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Given the offset of the L2P index data in L2P_OFFSET, the content
+ * checksum in L2P_CHECKSUM and the offset plus checksum of the P2L
+ * index data in P2L_OFFSET and P2L_CHECKSUM.
+ *
+ * Return the corresponding format 7+ revision / pack file footer.
+ * Allocate it in RESULT_POOL and use SCRATCH_POOL for temporary.
+ */
+svn_stringbuf_t *
+svn_fs_x__unparse_footer(apr_off_t l2p_offset,
+ svn_checksum_t *l2p_checksum,
+ apr_off_t p2l_offset,
+ svn_checksum_t *p2l_checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Parse the description of a representation from TEXT and store it
+ into *REP_P. TEXT will be invalidated by this call. Allocate *REP_P in
+ RESULT_POOL and use SCRATCH_POOL for temporaries. */
+svn_error_t *
+svn_fs_x__parse_representation(svn_fs_x__representation_t **rep_p,
+ svn_stringbuf_t *text,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return a formatted string that represents the location of representation
+ * REP. If MUTABLE_REP_TRUNCATED is given, the rep is for props or dir
+ * contents, and only a "-1" revision number will be given for a mutable rep.
+ * If MAY_BE_CORRUPT is true, guard for NULL when constructing the string.
+ * Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL. */
+svn_stringbuf_t *
+svn_fs_x__unparse_representation(svn_fs_x__representation_t *rep,
+ svn_boolean_t mutable_rep_truncated,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Read a node-revision from STREAM. Set *NODEREV to the new structure,
+ allocated in RESULT_POOL. */
+svn_error_t *
+svn_fs_x__read_noderev(svn_fs_x__noderev_t **noderev,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Write the node-revision NODEREV into the stream OUTFILE.
+ Temporary allocations are from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__write_noderev(svn_stream_t *outfile,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *scratch_pool);
+
+/* This type enumerates all forms of representations that we support. */
+typedef enum svn_fs_x__rep_type_t
+{
+ /* this is a DELTA representation with no base representation */
+ svn_fs_x__rep_self_delta,
+
+ /* this is a DELTA representation against some base representation */
+ svn_fs_x__rep_delta,
+
+ /* this is a representation in a star-delta container */
+ svn_fs_x__rep_container
+} svn_fs_x__rep_type_t;
+
+/* This structure is used to hold the information stored in a representation
+ * header. */
+typedef struct svn_fs_x__rep_header_t
+{
+ /* type of the representation, i.e. whether self-DELTA etc. */
+ svn_fs_x__rep_type_t type;
+
+ /* if this rep is a delta against some other rep, that base rep can
+ * be found in this revision. Should be 0 if there is no base rep. */
+ svn_revnum_t base_revision;
+
+ /* if this rep is a delta against some other rep, that base rep can
+ * be found at this item index within the base rep's revision. Should
+ * be 0 if there is no base rep. */
+ apr_off_t base_item_index;
+
+ /* if this rep is a delta against some other rep, this is the (deltified)
+ * size of that base rep. Should be 0 if there is no base rep. */
+ svn_filesize_t base_length;
+
+ /* length of the textual representation of the header in the rep or pack
+ * file, including EOL. Only valid after reading it from disk.
+ * Should be 0 otherwise. */
+ apr_size_t header_size;
+} svn_fs_x__rep_header_t;
+
+/* Read the next line from STREAM and parse it as a text
+ representation header. Return the parsed entry in *HEADER, allocated
+ in RESULT_POOL. Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__read_rep_header(svn_fs_x__rep_header_t **header,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Write the representation HEADER to STREAM.
+ * Use SCRATCH_POOL for allocations. */
+svn_error_t *
+svn_fs_x__write_rep_header(svn_fs_x__rep_header_t *header,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool);
+
+/* Read all the changes from STREAM and store them in *CHANGES,
+ allocated in RESULT_POOL. Do temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__read_changes(apr_array_header_t **changes,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Callback function used by svn_fs_fs__read_changes_incrementally(),
+ * asking the receiver to process to process CHANGE using BATON. CHANGE
+ * and SCRATCH_POOL will not be valid beyond the current callback invocation.
+ */
+typedef svn_error_t *(*svn_fs_x__change_receiver_t)(
+ void *baton,
+ svn_fs_x__change_t *change,
+ apr_pool_t *scratch_pool);
+
+/* Read all the changes from STREAM and invoke CHANGE_RECEIVER on each change.
+ Do all allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__read_changes_incrementally(svn_stream_t *stream,
+ svn_fs_x__change_receiver_t
+ change_receiver,
+ void *change_receiver_baton,
+ apr_pool_t *scratch_pool);
+
+/* Write the changed path info from CHANGES in filesystem FS to the
+ output stream STREAM. You may call this function multiple time on
+ the same stream. If you are writing to a (proto-)revision file,
+ the last call must set TERMINATE_LIST to write an extra empty line
+ that marks the end of the changed paths list.
+ Perform temporary allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__write_changes(svn_stream_t *stream,
+ svn_fs_t *fs,
+ apr_hash_t *changes,
+ svn_boolean_t terminate_list,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS__LOW_LEVEL_H */
diff --git a/subversion/libsvn_fs_x/noderevs.c b/subversion/libsvn_fs_x/noderevs.c
new file mode 100644
index 0000000..60c6029
--- /dev/null
+++ b/subversion/libsvn_fs_x/noderevs.c
@@ -0,0 +1,912 @@
+/* noderevs.h --- FSX node revision container
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_private_config.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_packed_data.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "noderevs.h"
+#include "string_table.h"
+#include "temp_serializer.h"
+
+/* These flags will be used with the FLAGS field in binary_noderev_t.
+ */
+
+/* (flags & NODEREV_KIND_MASK) extracts the noderev type */
+#define NODEREV_KIND_MASK 0x00007
+
+/* the noderev has merge info */
+#define NODEREV_HAS_MINFO 0x00008
+
+/* the noderev has copy-from-path and revision */
+#define NODEREV_HAS_COPYFROM 0x00010
+
+/* the noderev has copy-root path and revision */
+#define NODEREV_HAS_COPYROOT 0x00020
+
+/* the noderev has copy-root path and revision */
+#define NODEREV_HAS_CPATH 0x00040
+
+/* Our internal representation of a svn_fs_x__noderev_t.
+ *
+ * We will store path strings in a string container and reference them
+ * from here. Similarly, IDs and representations are being stored in
+ * separate containers and then also referenced here. This eliminates
+ * the need to store the same IDs and representations more than once.
+ */
+typedef struct binary_noderev_t
+{
+ /* node type and presence indicators */
+ apr_uint32_t flags;
+
+ /* Index+1 of the noderev-id for this node-rev. */
+ int id;
+
+ /* Index+1 of the node-id for this node-rev. */
+ int node_id;
+
+ /* Index+1 of the copy-id for this node-rev. */
+ int copy_id;
+
+ /* Index+1 of the predecessor node revision id, or 0 if there is no
+ predecessor for this node revision */
+ int predecessor_id;
+
+ /* number of predecessors this node revision has (recursively), or
+ -1 if not known (for backward compatibility). */
+ int predecessor_count;
+
+ /* If this node-rev is a copy, what revision was it copied from? */
+ svn_revnum_t copyfrom_rev;
+
+ /* Helper for history tracing, root revision of the parent tree from
+ whence this node-rev was copied. */
+ svn_revnum_t copyroot_rev;
+
+ /* If this node-rev is a copy, this is the string index+1 of the path
+ from which that copy way made. 0, otherwise. */
+ apr_size_t copyfrom_path;
+
+ /* String index+1 of the root of the parent tree from whence this node-
+ * rev was copied. */
+ apr_size_t copyroot_path;
+
+ /* Index+1 of the representation key for this node's properties.
+ May be 0 if there are no properties. */
+ int prop_rep;
+
+ /* Index+1 of the representation for this node's data.
+ May be 0 if there is no data. */
+ int data_rep;
+
+ /* String index+1 of the path at which this node first came into
+ existence. */
+ apr_size_t created_path;
+
+ /* Number of nodes with svn:mergeinfo properties that are
+ descendants of this node (including it itself) */
+ apr_int64_t mergeinfo_count;
+
+} binary_noderev_t;
+
+/* The actual container object. Node revisions are concatenated into
+ * NODEREVS, referenced representations are stored in DATA_REPS / PROP_REPS
+ * and the ids in IDs. PATHS is the string table for all paths.
+ *
+ * During construction, BUILDER will be used instead of PATHS. IDS_DICT,
+ * DATA_REPS_DICT and PROP_REPS_DICT are also only used during construction
+ * and are NULL otherwise.
+ */
+struct svn_fs_x__noderevs_t
+{
+ /* The paths - either in 'builder' mode or finalized mode.
+ * The respective other pointer will be NULL. */
+ string_table_builder_t *builder;
+ string_table_t *paths;
+
+ /* During construction, maps a full binary_id_t to an index into IDS */
+ apr_hash_t *ids_dict;
+
+ /* During construction, maps a full binary_representation_t to an index
+ * into REPS. */
+ apr_hash_t *reps_dict;
+
+ /* array of binary_id_t */
+ apr_array_header_t *ids;
+
+ /* array of binary_representation_t */
+ apr_array_header_t *reps;
+
+ /* array of binary_noderev_t. */
+ apr_array_header_t *noderevs;
+};
+
+svn_fs_x__noderevs_t *
+svn_fs_x__noderevs_create(int initial_count,
+ apr_pool_t* result_pool)
+{
+ svn_fs_x__noderevs_t *noderevs
+ = apr_palloc(result_pool, sizeof(*noderevs));
+
+ noderevs->builder = svn_fs_x__string_table_builder_create(result_pool);
+ noderevs->ids_dict = svn_hash__make(result_pool);
+ noderevs->reps_dict = svn_hash__make(result_pool);
+ noderevs->paths = NULL;
+
+ noderevs->ids
+ = apr_array_make(result_pool, 2 * initial_count, sizeof(svn_fs_x__id_t));
+ noderevs->reps
+ = apr_array_make(result_pool, 2 * initial_count,
+ sizeof(svn_fs_x__representation_t));
+ noderevs->noderevs
+ = apr_array_make(result_pool, initial_count, sizeof(binary_noderev_t));
+
+ return noderevs;
+}
+
+/* Given the ID, return the index+1 into IDS that contains a binary_id
+ * for it. Returns 0 for NULL IDs. We use DICT to detect duplicates.
+ */
+static int
+store_id(apr_array_header_t *ids,
+ apr_hash_t *dict,
+ const svn_fs_x__id_t *id)
+{
+ int idx;
+ void *idx_void;
+
+ if (!svn_fs_x__id_used(id))
+ return 0;
+
+ idx_void = apr_hash_get(dict, &id, sizeof(id));
+ idx = (int)(apr_uintptr_t)idx_void;
+ if (idx == 0)
+ {
+ APR_ARRAY_PUSH(ids, svn_fs_x__id_t) = *id;
+ idx = ids->nelts;
+ apr_hash_set(dict, ids->elts + (idx-1) * ids->elt_size,
+ ids->elt_size, (void*)(apr_uintptr_t)idx);
+ }
+
+ return idx;
+}
+
+/* Given the REP, return the index+1 into REPS that contains a copy of it.
+ * Returns 0 for NULL IDs. We use DICT to detect duplicates.
+ */
+static int
+store_representation(apr_array_header_t *reps,
+ apr_hash_t *dict,
+ const svn_fs_x__representation_t *rep)
+{
+ int idx;
+ void *idx_void;
+
+ if (rep == NULL)
+ return 0;
+
+ idx_void = apr_hash_get(dict, rep, sizeof(*rep));
+ idx = (int)(apr_uintptr_t)idx_void;
+ if (idx == 0)
+ {
+ APR_ARRAY_PUSH(reps, svn_fs_x__representation_t) = *rep;
+ idx = reps->nelts;
+ apr_hash_set(dict, reps->elts + (idx-1) * reps->elt_size,
+ reps->elt_size, (void*)(apr_uintptr_t)idx);
+ }
+
+ return idx;
+}
+
+apr_size_t
+svn_fs_x__noderevs_add(svn_fs_x__noderevs_t *container,
+ svn_fs_x__noderev_t *noderev)
+{
+ binary_noderev_t binary_noderev = { 0 };
+
+ binary_noderev.flags = (noderev->has_mergeinfo ? NODEREV_HAS_MINFO : 0)
+ | (noderev->copyfrom_path ? NODEREV_HAS_COPYFROM : 0)
+ | (noderev->copyroot_path ? NODEREV_HAS_COPYROOT : 0)
+ | (noderev->created_path ? NODEREV_HAS_CPATH : 0)
+ | (int)noderev->kind;
+
+ binary_noderev.id
+ = store_id(container->ids, container->ids_dict, &noderev->noderev_id);
+ binary_noderev.node_id
+ = store_id(container->ids, container->ids_dict, &noderev->node_id);
+ binary_noderev.copy_id
+ = store_id(container->ids, container->ids_dict, &noderev->copy_id);
+ binary_noderev.predecessor_id
+ = store_id(container->ids, container->ids_dict, &noderev->predecessor_id);
+
+ if (noderev->copyfrom_path)
+ {
+ binary_noderev.copyfrom_path
+ = svn_fs_x__string_table_builder_add(container->builder,
+ noderev->copyfrom_path,
+ 0);
+ binary_noderev.copyfrom_rev = noderev->copyfrom_rev;
+ }
+
+ if (noderev->copyroot_path)
+ {
+ binary_noderev.copyroot_path
+ = svn_fs_x__string_table_builder_add(container->builder,
+ noderev->copyroot_path,
+ 0);
+ binary_noderev.copyroot_rev = noderev->copyroot_rev;
+ }
+
+ binary_noderev.predecessor_count = noderev->predecessor_count;
+ binary_noderev.prop_rep = store_representation(container->reps,
+ container->reps_dict,
+ noderev->prop_rep);
+ binary_noderev.data_rep = store_representation(container->reps,
+ container->reps_dict,
+ noderev->data_rep);
+
+ if (noderev->created_path)
+ binary_noderev.created_path
+ = svn_fs_x__string_table_builder_add(container->builder,
+ noderev->created_path,
+ 0);
+
+ binary_noderev.mergeinfo_count = noderev->mergeinfo_count;
+
+ APR_ARRAY_PUSH(container->noderevs, binary_noderev_t) = binary_noderev;
+
+ return container->noderevs->nelts - 1;
+}
+
+apr_size_t
+svn_fs_x__noderevs_estimate_size(const svn_fs_x__noderevs_t *container)
+{
+ /* CONTAINER must be in 'builder' mode */
+ if (container->builder == NULL)
+ return 0;
+
+ /* string table code makes its own prediction,
+ * noderevs should be < 16 bytes each,
+ * id parts < 4 bytes each,
+ * data representations < 40 bytes each,
+ * property representations < 30 bytes each,
+ * some static overhead should be assumed */
+ return svn_fs_x__string_table_builder_estimate_size(container->builder)
+ + container->noderevs->nelts * 16
+ + container->ids->nelts * 4
+ + container->reps->nelts * 40
+ + 100;
+}
+
+/* Set *ID to the ID part stored at index IDX in IDS.
+ */
+static svn_error_t *
+get_id(svn_fs_x__id_t *id,
+ const apr_array_header_t *ids,
+ int idx)
+{
+ /* handle NULL IDs */
+ if (idx == 0)
+ {
+ svn_fs_x__id_reset(id);
+ return SVN_NO_ERROR;
+ }
+
+ /* check for corrupted data */
+ if (idx < 0 || idx > ids->nelts)
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ _("ID part index %d exceeds container size %d"),
+ idx, ids->nelts);
+
+ /* Return the requested ID. */
+ *id = APR_ARRAY_IDX(ids, idx - 1, svn_fs_x__id_t);
+
+ return SVN_NO_ERROR;
+}
+
+/* Create a svn_fs_x__representation_t in *REP, allocated in POOL based on the
+ * representation stored at index IDX in REPS.
+ */
+static svn_error_t *
+get_representation(svn_fs_x__representation_t **rep,
+ const apr_array_header_t *reps,
+ int idx,
+ apr_pool_t *pool)
+{
+ /* handle NULL representations */
+ if (idx == 0)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* check for corrupted data */
+ if (idx < 0 || idx > reps->nelts)
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ _("Node revision ID index %d"
+ " exceeds container size %d"),
+ idx, reps->nelts);
+
+ /* no translation required. Just duplicate the info */
+ *rep = apr_pmemdup(pool,
+ &APR_ARRAY_IDX(reps, idx - 1, svn_fs_x__representation_t),
+ sizeof(**rep));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__noderevs_get(svn_fs_x__noderev_t **noderev_p,
+ const svn_fs_x__noderevs_t *container,
+ apr_size_t idx,
+ apr_pool_t *pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ binary_noderev_t *binary_noderev;
+
+ /* CONTAINER must be in 'finalized' mode */
+ SVN_ERR_ASSERT(container->builder == NULL);
+ SVN_ERR_ASSERT(container->paths);
+
+ /* validate index */
+ if (idx >= (apr_size_t)container->noderevs->nelts)
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ apr_psprintf(pool,
+ _("Node revision index %%%s"
+ " exceeds container size %%d"),
+ APR_SIZE_T_FMT),
+ idx, container->noderevs->nelts);
+
+ /* allocate result struct and fill it field by field */
+ noderev = apr_pcalloc(pool, sizeof(*noderev));
+ binary_noderev = &APR_ARRAY_IDX(container->noderevs, idx, binary_noderev_t);
+
+ noderev->kind = (svn_node_kind_t)(binary_noderev->flags & NODEREV_KIND_MASK);
+ SVN_ERR(get_id(&noderev->noderev_id, container->ids, binary_noderev->id));
+ SVN_ERR(get_id(&noderev->node_id, container->ids,
+ binary_noderev->node_id));
+ SVN_ERR(get_id(&noderev->copy_id, container->ids,
+ binary_noderev->copy_id));
+ SVN_ERR(get_id(&noderev->predecessor_id, container->ids,
+ binary_noderev->predecessor_id));
+
+ if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
+ {
+ noderev->copyfrom_path
+ = svn_fs_x__string_table_get(container->paths,
+ binary_noderev->copyfrom_path,
+ NULL,
+ pool);
+ noderev->copyfrom_rev = binary_noderev->copyfrom_rev;
+ }
+ else
+ {
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+ }
+
+ if (binary_noderev->flags & NODEREV_HAS_COPYROOT)
+ {
+ noderev->copyroot_path
+ = svn_fs_x__string_table_get(container->paths,
+ binary_noderev->copyroot_path,
+ NULL,
+ pool);
+ noderev->copyroot_rev = binary_noderev->copyroot_rev;
+ }
+ else
+ {
+ noderev->copyroot_path = NULL;
+ noderev->copyroot_rev = 0;
+ }
+
+ noderev->predecessor_count = binary_noderev->predecessor_count;
+
+ SVN_ERR(get_representation(&noderev->prop_rep, container->reps,
+ binary_noderev->prop_rep, pool));
+ SVN_ERR(get_representation(&noderev->data_rep, container->reps,
+ binary_noderev->data_rep, pool));
+
+ if (binary_noderev->flags & NODEREV_HAS_CPATH)
+ noderev->created_path
+ = svn_fs_x__string_table_get(container->paths,
+ binary_noderev->created_path,
+ NULL,
+ pool);
+
+ noderev->mergeinfo_count = binary_noderev->mergeinfo_count;
+
+ noderev->has_mergeinfo = (binary_noderev->flags & NODEREV_HAS_MINFO) ? 1 : 0;
+ *noderev_p = noderev;
+
+ return SVN_NO_ERROR;
+}
+
+/* Create and return a stream for representations in PARENT.
+ * Initialize the sub-streams for all fields, except checksums.
+ */
+static svn_packed__int_stream_t *
+create_rep_stream(svn_packed__int_stream_t *parent)
+{
+ svn_packed__int_stream_t *stream
+ = svn_packed__create_int_substream(parent, FALSE, FALSE);
+
+ /* sub-streams for members - except for checksums */
+ /* has_sha1 */
+ svn_packed__create_int_substream(stream, FALSE, FALSE);
+
+ /* rev, item_index, size, expanded_size */
+ svn_packed__create_int_substream(stream, TRUE, FALSE);
+ svn_packed__create_int_substream(stream, FALSE, FALSE);
+ svn_packed__create_int_substream(stream, FALSE, FALSE);
+ svn_packed__create_int_substream(stream, FALSE, FALSE);
+
+ return stream;
+}
+
+/* Serialize all representations in REP. Store checksums in DIGEST_STREAM,
+ * put all other fields into REP_STREAM.
+ */
+static void
+write_reps(svn_packed__int_stream_t *rep_stream,
+ svn_packed__byte_stream_t *digest_stream,
+ apr_array_header_t *reps)
+{
+ int i;
+ for (i = 0; i < reps->nelts; ++i)
+ {
+ svn_fs_x__representation_t *rep
+ = &APR_ARRAY_IDX(reps, i, svn_fs_x__representation_t);
+
+ svn_packed__add_uint(rep_stream, rep->has_sha1);
+
+ svn_packed__add_uint(rep_stream, rep->id.change_set);
+ svn_packed__add_uint(rep_stream, rep->id.number);
+ svn_packed__add_uint(rep_stream, rep->size);
+ svn_packed__add_uint(rep_stream, rep->expanded_size);
+
+ svn_packed__add_bytes(digest_stream,
+ (const char *)rep->md5_digest,
+ sizeof(rep->md5_digest));
+ if (rep->has_sha1)
+ svn_packed__add_bytes(digest_stream,
+ (const char *)rep->sha1_digest,
+ sizeof(rep->sha1_digest));
+ }
+}
+
+svn_error_t *
+svn_fs_x__write_noderevs_container(svn_stream_t *stream,
+ const svn_fs_x__noderevs_t *container,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ string_table_t *paths = container->paths
+ ? container->paths
+ : svn_fs_x__string_table_create(container->builder,
+ scratch_pool);
+
+ svn_packed__data_root_t *root = svn_packed__data_create_root(scratch_pool);
+
+ /* one common top-level stream for all arrays. One sub-stream */
+ svn_packed__int_stream_t *structs_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+ svn_packed__int_stream_t *ids_stream
+ = svn_packed__create_int_substream(structs_stream, FALSE, FALSE);
+ svn_packed__int_stream_t *reps_stream
+ = create_rep_stream(structs_stream);
+ svn_packed__int_stream_t *noderevs_stream
+ = svn_packed__create_int_substream(structs_stream, FALSE, FALSE);
+ svn_packed__byte_stream_t *digests_stream
+ = svn_packed__create_bytes_stream(root);
+
+ /* structure the IDS_STREAM such we can extract much of the redundancy
+ * from the svn_fs_x__ip_part_t structs */
+ for (i = 0; i < 2; ++i)
+ svn_packed__create_int_substream(ids_stream, TRUE, FALSE);
+
+ /* Same storing binary_noderev_t in the NODEREVS_STREAM */
+ svn_packed__create_int_substream(noderevs_stream, FALSE, FALSE);
+ for (i = 0; i < 13; ++i)
+ svn_packed__create_int_substream(noderevs_stream, TRUE, FALSE);
+
+ /* serialize ids array */
+ for (i = 0; i < container->ids->nelts; ++i)
+ {
+ svn_fs_x__id_t *id = &APR_ARRAY_IDX(container->ids, i, svn_fs_x__id_t);
+
+ svn_packed__add_int(ids_stream, id->change_set);
+ svn_packed__add_uint(ids_stream, id->number);
+ }
+
+ /* serialize rep arrays */
+ write_reps(reps_stream, digests_stream, container->reps);
+
+ /* serialize noderevs array */
+ for (i = 0; i < container->noderevs->nelts; ++i)
+ {
+ const binary_noderev_t *noderev
+ = &APR_ARRAY_IDX(container->noderevs, i, binary_noderev_t);
+
+ svn_packed__add_uint(noderevs_stream, noderev->flags);
+
+ svn_packed__add_uint(noderevs_stream, noderev->id);
+ svn_packed__add_uint(noderevs_stream, noderev->node_id);
+ svn_packed__add_uint(noderevs_stream, noderev->copy_id);
+ svn_packed__add_uint(noderevs_stream, noderev->predecessor_id);
+ svn_packed__add_uint(noderevs_stream, noderev->predecessor_count);
+
+ svn_packed__add_uint(noderevs_stream, noderev->copyfrom_path);
+ svn_packed__add_int(noderevs_stream, noderev->copyfrom_rev);
+ svn_packed__add_uint(noderevs_stream, noderev->copyroot_path);
+ svn_packed__add_int(noderevs_stream, noderev->copyroot_rev);
+
+ svn_packed__add_uint(noderevs_stream, noderev->prop_rep);
+ svn_packed__add_uint(noderevs_stream, noderev->data_rep);
+
+ svn_packed__add_uint(noderevs_stream, noderev->created_path);
+ svn_packed__add_uint(noderevs_stream, noderev->mergeinfo_count);
+ }
+
+ /* write to disk */
+ SVN_ERR(svn_fs_x__write_string_table(stream, paths, scratch_pool));
+ SVN_ERR(svn_packed__data_write(stream, root, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Allocate a svn_fs_x__representation_t array in POOL and return it in
+ * REPS_P. Deserialize the data in REP_STREAM and DIGEST_STREAM and store
+ * the resulting representations into the *REPS_P.
+ */
+static svn_error_t *
+read_reps(apr_array_header_t **reps_p,
+ svn_packed__int_stream_t *rep_stream,
+ svn_packed__byte_stream_t *digest_stream,
+ apr_pool_t *pool)
+{
+ apr_size_t i;
+ apr_size_t len;
+ const char *bytes;
+
+ apr_size_t count
+ = svn_packed__int_count(svn_packed__first_int_substream(rep_stream));
+ apr_array_header_t *reps
+ = apr_array_make(pool, (int)count, sizeof(svn_fs_x__representation_t));
+
+ for (i = 0; i < count; ++i)
+ {
+ svn_fs_x__representation_t rep;
+
+ rep.has_sha1 = (svn_boolean_t)svn_packed__get_uint(rep_stream);
+
+ rep.id.change_set = (svn_revnum_t)svn_packed__get_uint(rep_stream);
+ rep.id.number = svn_packed__get_uint(rep_stream);
+ rep.size = svn_packed__get_uint(rep_stream);
+ rep.expanded_size = svn_packed__get_uint(rep_stream);
+
+ /* when extracting the checksums, beware of buffer under/overflows
+ caused by disk data corruption. */
+ bytes = svn_packed__get_bytes(digest_stream, &len);
+ if (len != sizeof(rep.md5_digest))
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ apr_psprintf(pool,
+ _("Unexpected MD5"
+ " digest size %%%s"),
+ APR_SIZE_T_FMT),
+ len);
+
+ memcpy(rep.md5_digest, bytes, sizeof(rep.md5_digest));
+ if (rep.has_sha1)
+ {
+ bytes = svn_packed__get_bytes(digest_stream, &len);
+ if (len != sizeof(rep.sha1_digest))
+ return svn_error_createf(SVN_ERR_FS_CONTAINER_INDEX, NULL,
+ apr_psprintf(pool,
+ _("Unexpected SHA1"
+ " digest size %%%s"),
+ APR_SIZE_T_FMT),
+ len);
+
+ memcpy(rep.sha1_digest, bytes, sizeof(rep.sha1_digest));
+ }
+
+ APR_ARRAY_PUSH(reps, svn_fs_x__representation_t) = rep;
+ }
+
+ *reps_p = reps;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_noderevs_container(svn_fs_x__noderevs_t **container,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t i;
+ apr_size_t count;
+
+ svn_fs_x__noderevs_t *noderevs
+ = apr_pcalloc(result_pool, sizeof(*noderevs));
+
+ svn_packed__data_root_t *root;
+ svn_packed__int_stream_t *structs_stream;
+ svn_packed__int_stream_t *ids_stream;
+ svn_packed__int_stream_t *reps_stream;
+ svn_packed__int_stream_t *noderevs_stream;
+ svn_packed__byte_stream_t *digests_stream;
+
+ /* read everything from disk */
+ SVN_ERR(svn_fs_x__read_string_table(&noderevs->paths, stream,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_packed__data_read(&root, stream, result_pool, scratch_pool));
+
+ /* get streams */
+ structs_stream = svn_packed__first_int_stream(root);
+ ids_stream = svn_packed__first_int_substream(structs_stream);
+ reps_stream = svn_packed__next_int_stream(ids_stream);
+ noderevs_stream = svn_packed__next_int_stream(reps_stream);
+ digests_stream = svn_packed__first_byte_stream(root);
+
+ /* read ids array */
+ count
+ = svn_packed__int_count(svn_packed__first_int_substream(ids_stream));
+ noderevs->ids
+ = apr_array_make(result_pool, (int)count, sizeof(svn_fs_x__id_t));
+ for (i = 0; i < count; ++i)
+ {
+ svn_fs_x__id_t id;
+
+ id.change_set = (svn_revnum_t)svn_packed__get_int(ids_stream);
+ id.number = svn_packed__get_uint(ids_stream);
+
+ APR_ARRAY_PUSH(noderevs->ids, svn_fs_x__id_t) = id;
+ }
+
+ /* read rep arrays */
+ SVN_ERR(read_reps(&noderevs->reps, reps_stream, digests_stream,
+ result_pool));
+
+ /* read noderevs array */
+ count
+ = svn_packed__int_count(svn_packed__first_int_substream(noderevs_stream));
+ noderevs->noderevs
+ = apr_array_make(result_pool, (int)count, sizeof(binary_noderev_t));
+ for (i = 0; i < count; ++i)
+ {
+ binary_noderev_t noderev;
+
+ noderev.flags = (apr_uint32_t)svn_packed__get_uint(noderevs_stream);
+
+ noderev.id = (int)svn_packed__get_uint(noderevs_stream);
+ noderev.node_id = (int)svn_packed__get_uint(noderevs_stream);
+ noderev.copy_id = (int)svn_packed__get_uint(noderevs_stream);
+ noderev.predecessor_id = (int)svn_packed__get_uint(noderevs_stream);
+ noderev.predecessor_count = (int)svn_packed__get_uint(noderevs_stream);
+
+ noderev.copyfrom_path = (apr_size_t)svn_packed__get_uint(noderevs_stream);
+ noderev.copyfrom_rev = (svn_revnum_t)svn_packed__get_int(noderevs_stream);
+ noderev.copyroot_path = (apr_size_t)svn_packed__get_uint(noderevs_stream);
+ noderev.copyroot_rev = (svn_revnum_t)svn_packed__get_int(noderevs_stream);
+
+ noderev.prop_rep = (int)svn_packed__get_uint(noderevs_stream);
+ noderev.data_rep = (int)svn_packed__get_uint(noderevs_stream);
+
+ noderev.created_path = (apr_size_t)svn_packed__get_uint(noderevs_stream);
+ noderev.mergeinfo_count = svn_packed__get_uint(noderevs_stream);
+
+ APR_ARRAY_PUSH(noderevs->noderevs, binary_noderev_t) = noderev;
+ }
+
+ *container = noderevs;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_noderevs_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_fs_x__noderevs_t *noderevs = in;
+ svn_stringbuf_t *serialized;
+ apr_size_t size
+ = noderevs->ids->elt_size * noderevs->ids->nelts
+ + noderevs->reps->elt_size * noderevs->reps->nelts
+ + noderevs->noderevs->elt_size * noderevs->noderevs->nelts
+ + 10 * noderevs->noderevs->elt_size
+ + 100;
+
+ /* serialize array header and all its elements */
+ svn_temp_serializer__context_t *context
+ = svn_temp_serializer__init(noderevs, sizeof(*noderevs), size, pool);
+
+ /* serialize sub-structures */
+ svn_fs_x__serialize_string_table(context, &noderevs->paths);
+ svn_fs_x__serialize_apr_array(context, &noderevs->ids);
+ svn_fs_x__serialize_apr_array(context, &noderevs->reps);
+ svn_fs_x__serialize_apr_array(context, &noderevs->noderevs);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_noderevs_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ svn_fs_x__noderevs_t *noderevs = (svn_fs_x__noderevs_t *)data;
+
+ /* de-serialize sub-structures */
+ svn_fs_x__deserialize_string_table(noderevs, &noderevs->paths);
+ svn_fs_x__deserialize_apr_array(noderevs, &noderevs->ids, pool);
+ svn_fs_x__deserialize_apr_array(noderevs, &noderevs->reps, pool);
+ svn_fs_x__deserialize_apr_array(noderevs, &noderevs->noderevs, pool);
+
+ /* done */
+ *out = noderevs;
+
+ return SVN_NO_ERROR;
+}
+
+/* Deserialize the cache serialized APR struct at *IN in BUFFER and write
+ * the result to OUT. Note that this will only resolve the pointers and
+ * not the array elements themselves. */
+static void
+resolve_apr_array_header(apr_array_header_t *out,
+ const void *buffer,
+ apr_array_header_t * const *in)
+{
+ const apr_array_header_t *array
+ = svn_temp_deserializer__ptr(buffer, (const void *const *)in);
+ const char *elements
+ = svn_temp_deserializer__ptr(array, (const void *const *)&array->elts);
+
+ *out = *array;
+ out->elts = (char *)elements;
+ out->pool = NULL;
+}
+
+svn_error_t *
+svn_fs_x__noderevs_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ binary_noderev_t *binary_noderev;
+
+ apr_array_header_t ids;
+ apr_array_header_t reps;
+ apr_array_header_t noderevs;
+
+ apr_uint32_t idx = *(apr_uint32_t *)baton;
+ const svn_fs_x__noderevs_t *container = data;
+
+ /* Resolve all container pointers */
+ const string_table_t *paths
+ = svn_temp_deserializer__ptr(container,
+ (const void *const *)&container->paths);
+
+ resolve_apr_array_header(&ids, container, &container->ids);
+ resolve_apr_array_header(&reps, container, &container->reps);
+ resolve_apr_array_header(&noderevs, container, &container->noderevs);
+
+ /* allocate result struct and fill it field by field */
+ noderev = apr_pcalloc(pool, sizeof(*noderev));
+ binary_noderev = &APR_ARRAY_IDX(&noderevs, idx, binary_noderev_t);
+
+ noderev->kind = (svn_node_kind_t)(binary_noderev->flags & NODEREV_KIND_MASK);
+ SVN_ERR(get_id(&noderev->noderev_id, &ids, binary_noderev->id));
+ SVN_ERR(get_id(&noderev->node_id, &ids, binary_noderev->node_id));
+ SVN_ERR(get_id(&noderev->copy_id, &ids, binary_noderev->copy_id));
+ SVN_ERR(get_id(&noderev->predecessor_id, &ids,
+ binary_noderev->predecessor_id));
+
+ if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
+ {
+ noderev->copyfrom_path
+ = svn_fs_x__string_table_get_func(paths,
+ binary_noderev->copyfrom_path,
+ NULL,
+ pool);
+ noderev->copyfrom_rev = binary_noderev->copyfrom_rev;
+ }
+ else
+ {
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+ }
+
+ if (binary_noderev->flags & NODEREV_HAS_COPYROOT)
+ {
+ noderev->copyroot_path
+ = svn_fs_x__string_table_get_func(paths,
+ binary_noderev->copyroot_path,
+ NULL,
+ pool);
+ noderev->copyroot_rev = binary_noderev->copyroot_rev;
+ }
+ else
+ {
+ noderev->copyroot_path = NULL;
+ noderev->copyroot_rev = 0;
+ }
+
+ noderev->predecessor_count = binary_noderev->predecessor_count;
+
+ SVN_ERR(get_representation(&noderev->prop_rep, &reps,
+ binary_noderev->prop_rep, pool));
+ SVN_ERR(get_representation(&noderev->data_rep, &reps,
+ binary_noderev->data_rep, pool));
+
+ if (binary_noderev->flags & NODEREV_HAS_CPATH)
+ noderev->created_path
+ = svn_fs_x__string_table_get_func(paths,
+ binary_noderev->created_path,
+ NULL,
+ pool);
+
+ noderev->mergeinfo_count = binary_noderev->mergeinfo_count;
+
+ noderev->has_mergeinfo = (binary_noderev->flags & NODEREV_HAS_MINFO) ? 1 : 0;
+ *out = noderev;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__mergeinfo_count_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ binary_noderev_t *binary_noderev;
+ apr_array_header_t noderevs;
+
+ apr_uint32_t idx = *(apr_uint32_t *)baton;
+ const svn_fs_x__noderevs_t *container = data;
+
+ /* Resolve all container pointers */
+ resolve_apr_array_header(&noderevs, container, &container->noderevs);
+ binary_noderev = &APR_ARRAY_IDX(&noderevs, idx, binary_noderev_t);
+
+ *(apr_int64_t *)out = binary_noderev->mergeinfo_count;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/noderevs.h b/subversion/libsvn_fs_x/noderevs.h
new file mode 100644
index 0000000..f9b79dc
--- /dev/null
+++ b/subversion/libsvn_fs_x/noderevs.h
@@ -0,0 +1,142 @@
+/* noderevs.h --- FSX node revision container
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__NODEREVS_H
+#define SVN_LIBSVN_FS__NODEREVS_H
+
+#include "svn_io.h"
+#include "fs.h"
+
+/* A collection of related noderevs tends to be widely redundant (similar
+ * paths, predecessor ID matching anothers ID, shared representations etc.)
+ * Also, the binary representation of a noderev can be much shorter than
+ * the ordinary textual variant.
+ *
+ * In its serialized form, the svn_fs_x__noderevs_t container extracts
+ * most of that redundancy and the run-time representation is also much
+ * smaller than sum of the respective svn_fs_x__noderev_t objects.
+ *
+ * As with other containers, this one has two modes: 'construction', in
+ * which you may add data to it, and 'getter' in which there is only r/o
+ * access to the data.
+ */
+
+/* An opaque collection of node revisions.
+ */
+typedef struct svn_fs_x__noderevs_t svn_fs_x__noderevs_t;
+
+/* Create and populate noderev containers. */
+
+/* Create and return a new noderevs container with an initial capacity of
+ * INITIAL_COUNT svn_fs_x__noderev_t objects.
+ * Allocate the result in RESULT_POOL.
+ */
+svn_fs_x__noderevs_t *
+svn_fs_x__noderevs_create(int initial_count,
+ apr_pool_t *result_pool);
+
+/* Add NODEREV to the CONTAINER. Return the index that identifies the new
+ * item in this container.
+ */
+apr_size_t
+svn_fs_x__noderevs_add(svn_fs_x__noderevs_t *container,
+ svn_fs_x__noderev_t *noderev);
+
+/* Return a rough estimate in bytes for the serialized representation
+ * of CONTAINER.
+ */
+apr_size_t
+svn_fs_x__noderevs_estimate_size(const svn_fs_x__noderevs_t *container);
+
+/* Read from noderev containers. */
+
+/* From CONTAINER, extract the noderev with the given IDX. Allocate
+ * the result in POOL and return it in *NODEREV_P.
+ */
+svn_error_t *
+svn_fs_x__noderevs_get(svn_fs_x__noderev_t **noderev_p,
+ const svn_fs_x__noderevs_t *container,
+ apr_size_t idx,
+ apr_pool_t *pool);
+
+/* I/O interface. */
+
+/* Write a serialized representation of CONTAINER to STREAM.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__write_noderevs_container(svn_stream_t *stream,
+ const svn_fs_x__noderevs_t *container,
+ apr_pool_t *scratch_pool);
+
+/* Read a noderev container from its serialized representation in STREAM.
+ * Allocate the result in RESULT_POOL and return it in *CONTAINER. Use
+ * SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_noderevs_container(svn_fs_x__noderevs_t **container,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Implements #svn_cache__serialize_func_t for svn_fs_x__noderevs_t
+ * objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_noderevs_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/* Implements #svn_cache__deserialize_func_t for svn_fs_x__noderevs_t
+ * objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_noderevs_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/* Implements svn_cache__partial_getter_func_t for svn_fs_x__noderevs_t,
+ * setting *OUT to the svn_fs_x__noderev_t selected by the apr_uint32_t index
+ * passed in as *BATON. This function is similar to svn_fs_x__noderevs_get
+ * but operates on the cache serialized representation of the container.
+ */
+svn_error_t *
+svn_fs_x__noderevs_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+/* Implements svn_cache__partial_getter_func_t for the mergeinfo_count in
+ * the stored noderevs, setting *OUT to the apr_int64_t counter value of
+ * the noderev selected by the apr_uint32_t index passed in as *BATON.
+ */
+svn_error_t *
+svn_fs_x__mergeinfo_count_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/pack.c b/subversion/libsvn_fs_x/pack.c
new file mode 100644
index 0000000..cdbb980
--- /dev/null
+++ b/subversion/libsvn_fs_x/pack.c
@@ -0,0 +1,2324 @@
+/* pack.c --- FSX shard packing functionality
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+#include <assert.h>
+
+#include "svn_pools.h"
+#include "svn_dirent_uri.h"
+#include "svn_sorts.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_temp_serializer.h"
+
+#include "fs_x.h"
+#include "pack.h"
+#include "util.h"
+#include "revprops.h"
+#include "transaction.h"
+#include "index.h"
+#include "low_level.h"
+#include "cached_data.h"
+#include "changes.h"
+#include "noderevs.h"
+#include "reps.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+#include "temp_serializer.h"
+
+/* Packing logic:
+ *
+ * We pack files on a pack file basis (e.g. 1000 revs) without changing
+ * existing pack files nor the revision files outside the range to pack.
+ *
+ * First, we will scan the revision file indexes to determine the number
+ * of items to "place" (i.e. determine their optimal position within the
+ * future pack file). For each item, we will need a constant amount of
+ * memory to track it. A MAX_MEM parameter sets a limit to the number of
+ * items we may place in one go. That means, we may not be able to add
+ * all revisions at once. Instead, we will run the placement for a subset
+ * of revisions at a time. The very unlikely worst case will simply append
+ * all revision data with just a little reshuffling inside each revision.
+ *
+ * In a second step, we read all revisions in the selected range, build
+ * the item tracking information and copy the items themselves from the
+ * revision files to temporary files. The latter serve as buckets for a
+ * very coarse bucket presort: Separate change lists, file properties,
+ * directory properties and noderevs + representations from one another.
+ *
+ * The third step will determine an optimized placement for the items in
+ * each of the 4 buckets separately. The first three will simply order
+ * their items by revision, starting with the newest once. Placing rep
+ * and noderev items is a more elaborate process documented in the code.
+ *
+ * In short, we store items in the following order:
+ * - changed paths lists
+ * - node property
+ * - directory properties
+ * - directory representations corresponding noderevs, lexical path order
+ * with special treatment of "trunk" and "branches"
+ * - same for file representations
+ *
+ * Step 4 copies the items from the temporary buckets into the final
+ * pack file and writes the temporary index files.
+ *
+ * Finally, after the last range of revisions, create the final indexes.
+ */
+
+/* Maximum amount of memory we allocate for placement information during
+ * the pack process.
+ */
+#define DEFAULT_MAX_MEM (64 * 1024 * 1024)
+
+/* Data structure describing a node change at PATH, REVISION.
+ * We will sort these instances by PATH and NODE_ID such that we can combine
+ * similar nodes in the same reps container and store containers in path
+ * major order.
+ */
+typedef struct path_order_t
+{
+ /* changed path */
+ svn_prefix_string__t *path;
+
+ /* node ID for this PATH in REVISION */
+ svn_fs_x__id_t node_id;
+
+ /* when this change happened */
+ svn_revnum_t revision;
+
+ /* this is a directory node */
+ svn_boolean_t is_dir;
+
+ /* length of the expanded representation content */
+ apr_int64_t expanded_size;
+
+ /* item ID of the noderev linked to the change. May be (0, 0). */
+ svn_fs_x__id_t noderev_id;
+
+ /* item ID of the representation containing the new data. May be (0, 0). */
+ svn_fs_x__id_t rep_id;
+} path_order_t;
+
+/* Represents a reference from item FROM to item TO. FROM may be a noderev
+ * or rep_id while TO is (currently) always a representation. We will sort
+ * them by TO which allows us to collect all dependent items.
+ */
+typedef struct reference_t
+{
+ svn_fs_x__id_t to;
+ svn_fs_x__id_t from;
+} reference_t;
+
+/* This structure keeps track of all the temporary data and status that
+ * needs to be kept around during the creation of one pack file. After
+ * each revision range (in case we can't process all revs at once due to
+ * memory restrictions), parts of the data will get re-initialized.
+ */
+typedef struct pack_context_t
+{
+ /* file system that we operate on */
+ svn_fs_t *fs;
+
+ /* cancel function to invoke at regular intervals. May be NULL */
+ svn_cancel_func_t cancel_func;
+
+ /* baton to pass to CANCEL_FUNC */
+ void *cancel_baton;
+
+ /* first revision in the shard (and future pack file) */
+ svn_revnum_t shard_rev;
+
+ /* first revision in the range to process (>= SHARD_REV) */
+ svn_revnum_t start_rev;
+
+ /* first revision after the range to process (<= SHARD_END_REV) */
+ svn_revnum_t end_rev;
+
+ /* first revision after the current shard */
+ svn_revnum_t shard_end_rev;
+
+ /* log-to-phys proto index for the whole pack file */
+ apr_file_t *proto_l2p_index;
+
+ /* phys-to-log proto index for the whole pack file */
+ apr_file_t *proto_p2l_index;
+
+ /* full shard directory path (containing the unpacked revisions) */
+ const char *shard_dir;
+
+ /* full packed shard directory path (containing the pack file + indexes) */
+ const char *pack_file_dir;
+
+ /* full pack file path (including PACK_FILE_DIR) */
+ const char *pack_file_path;
+
+ /* current write position (i.e. file length) in the pack file */
+ apr_off_t pack_offset;
+
+ /* the pack file to ultimately write all data to */
+ apr_file_t *pack_file;
+
+ /* array of svn_fs_x__p2l_entry_t *, all referring to change lists.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *changes;
+
+ /* temp file receiving all change list items (referenced by CHANGES).
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_file_t *changes_file;
+
+ /* array of svn_fs_x__p2l_entry_t *, all referring to file properties.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *file_props;
+
+ /* temp file receiving all file prop items (referenced by FILE_PROPS).
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *file_props_file;
+
+ /* array of svn_fs_x__p2l_entry_t *, all referring to directory properties.
+ * Will be filled in phase 2 and be cleared after each revision range. */
+ apr_array_header_t *dir_props;
+
+ /* temp file receiving all directory prop items (referenced by DIR_PROPS).
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *dir_props_file;
+
+ /* container for all PATH members in PATH_ORDER. */
+ svn_prefix_tree__t *paths;
+
+ /* array of path_order_t *. Will be filled in phase 2 and be cleared
+ * after each revision range. Sorted by PATH, NODE_ID. */
+ apr_array_header_t *path_order;
+
+ /* array of reference_t* linking representations to their delta bases.
+ * Will be filled in phase 2 and be cleared after each revision range.
+ * It will be sorted by the FROM members (for rep->base rep lookup). */
+ apr_array_header_t *references;
+
+ /* array of svn_fs_x__p2l_entry_t*. Will be filled in phase 2 and be
+ * cleared after each revision range. During phase 3, we will set items
+ * to NULL that we already processed. */
+ apr_array_header_t *reps;
+
+ /* array of int, marking for each revision, the which offset their items
+ * begin in REPS. Will be filled in phase 2 and be cleared after
+ * each revision range. */
+ apr_array_header_t *rev_offsets;
+
+ /* temp file receiving all items referenced by REPS.
+ * Will be filled in phase 2 and be cleared after each revision range.*/
+ apr_file_t *reps_file;
+
+ /* pool used for temporary data structures that will be cleaned up when
+ * the next range of revisions is being processed */
+ apr_pool_t *info_pool;
+} pack_context_t;
+
+/* Create and initialize a new pack context for packing shard SHARD_REV in
+ * SHARD_DIR into PACK_FILE_DIR within filesystem FS. Allocate it in POOL
+ * and return the structure in *CONTEXT.
+ *
+ * Limit the number of items being copied per iteration to MAX_ITEMS.
+ * Set CANCEL_FUNC and CANCEL_BATON as well.
+ */
+static svn_error_t *
+initialize_pack_context(pack_context_t *context,
+ svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_dir,
+ svn_revnum_t shard_rev,
+ int max_items,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *temp_dir;
+ int max_revs = MIN(ffd->max_files_per_dir, max_items);
+
+ SVN_ERR_ASSERT(shard_rev % ffd->max_files_per_dir == 0);
+
+ /* where we will place our various temp files */
+ SVN_ERR(svn_io_temp_dir(&temp_dir, pool));
+
+ /* store parameters */
+ context->fs = fs;
+ context->cancel_func = cancel_func;
+ context->cancel_baton = cancel_baton;
+
+ context->shard_rev = shard_rev;
+ context->start_rev = shard_rev;
+ context->end_rev = shard_rev;
+ context->shard_end_rev = shard_rev + ffd->max_files_per_dir;
+
+ /* Create the new directory and pack file. */
+ context->shard_dir = shard_dir;
+ context->pack_file_dir = pack_file_dir;
+ context->pack_file_path
+ = svn_dirent_join(pack_file_dir, PATH_PACKED, pool);
+ SVN_ERR(svn_io_file_open(&context->pack_file, context->pack_file_path,
+ APR_WRITE | APR_BUFFERED | APR_BINARY | APR_EXCL
+ | APR_CREATE, APR_OS_DEFAULT, pool));
+
+ /* Proto index files */
+ SVN_ERR(svn_fs_x__l2p_proto_index_open(
+ &context->proto_l2p_index,
+ svn_dirent_join(pack_file_dir,
+ PATH_INDEX PATH_EXT_L2P_INDEX,
+ pool),
+ pool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_open(
+ &context->proto_p2l_index,
+ svn_dirent_join(pack_file_dir,
+ PATH_INDEX PATH_EXT_P2L_INDEX,
+ pool),
+ pool));
+
+ /* item buckets: one item info array and one temp file per bucket */
+ context->changes = apr_array_make(pool, max_items,
+ sizeof(svn_fs_x__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->changes_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+ context->file_props = apr_array_make(pool, max_items,
+ sizeof(svn_fs_x__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->file_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+ context->dir_props = apr_array_make(pool, max_items,
+ sizeof(svn_fs_x__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->dir_props_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+
+ /* noderev and representation item bucket */
+ context->rev_offsets = apr_array_make(pool, max_revs, sizeof(int));
+ context->path_order = apr_array_make(pool, max_items,
+ sizeof(path_order_t *));
+ context->references = apr_array_make(pool, max_items,
+ sizeof(reference_t *));
+ context->reps = apr_array_make(pool, max_items,
+ sizeof(svn_fs_x__p2l_entry_t *));
+ SVN_ERR(svn_io_open_unique_file3(&context->reps_file, NULL, temp_dir,
+ svn_io_file_del_on_close, pool, pool));
+
+ /* the pool used for temp structures */
+ context->info_pool = svn_pool_create(pool);
+ context->paths = svn_prefix_tree__create(context->info_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Clean up / free all revision range specific data and files in CONTEXT.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+reset_pack_context(pack_context_t *context,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_clear(context->changes);
+ SVN_ERR(svn_io_file_trunc(context->changes_file, 0, scratch_pool));
+ apr_array_clear(context->file_props);
+ SVN_ERR(svn_io_file_trunc(context->file_props_file, 0, scratch_pool));
+ apr_array_clear(context->dir_props);
+ SVN_ERR(svn_io_file_trunc(context->dir_props_file, 0, scratch_pool));
+
+ apr_array_clear(context->rev_offsets);
+ apr_array_clear(context->path_order);
+ apr_array_clear(context->references);
+ apr_array_clear(context->reps);
+ SVN_ERR(svn_io_file_trunc(context->reps_file, 0, scratch_pool));
+
+ svn_pool_clear(context->info_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Call this after the last revision range. It will finalize all index files
+ * for CONTEXT and close any open files.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+close_pack_context(pack_context_t *context,
+ apr_pool_t *scratch_pool)
+{
+ const char *proto_l2p_index_path;
+ const char *proto_p2l_index_path;
+
+ /* need the file names for the actual index creation call further down */
+ SVN_ERR(svn_io_file_name_get(&proto_l2p_index_path,
+ context->proto_l2p_index, scratch_pool));
+ SVN_ERR(svn_io_file_name_get(&proto_p2l_index_path,
+ context->proto_p2l_index, scratch_pool));
+
+ /* finalize proto index files */
+ SVN_ERR(svn_io_file_close(context->proto_l2p_index, scratch_pool));
+ SVN_ERR(svn_io_file_close(context->proto_p2l_index, scratch_pool));
+
+ /* Append the actual index data to the pack file. */
+ SVN_ERR(svn_fs_x__add_index_data(context->fs, context->pack_file,
+ proto_l2p_index_path,
+ proto_p2l_index_path,
+ context->shard_rev,
+ scratch_pool));
+
+ /* remove proto index files */
+ SVN_ERR(svn_io_remove_file2(proto_l2p_index_path, FALSE, scratch_pool));
+ SVN_ERR(svn_io_remove_file2(proto_p2l_index_path, FALSE, scratch_pool));
+
+ SVN_ERR(svn_io_file_close(context->pack_file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Efficiently copy SIZE bytes from SOURCE to DEST. Invoke the CANCEL_FUNC
+ * from CONTEXT at regular intervals.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_file_data(pack_context_t *context,
+ apr_file_t *dest,
+ apr_file_t *source,
+ apr_off_t size,
+ apr_pool_t *scratch_pool)
+{
+ /* most non-representation items will be small. Minimize the buffer
+ * and infrastructure overhead in that case. */
+ enum { STACK_BUFFER_SIZE = 1024 };
+
+ if (size < STACK_BUFFER_SIZE)
+ {
+ /* copy small data using a fixed-size buffer on stack */
+ char buffer[STACK_BUFFER_SIZE];
+ SVN_ERR(svn_io_file_read_full2(source, buffer, (apr_size_t)size,
+ NULL, NULL, scratch_pool));
+ SVN_ERR(svn_io_file_write_full(dest, buffer, (apr_size_t)size,
+ NULL, scratch_pool));
+ }
+ else
+ {
+ /* use streaming copies for larger data blocks. That may require
+ * the allocation of larger buffers and we should make sure that
+ * this extra memory is released asap. */
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+ apr_pool_t *copypool = svn_pool_create(scratch_pool);
+ char *buffer = apr_palloc(copypool, ffd->block_size);
+
+ while (size)
+ {
+ apr_size_t to_copy = (apr_size_t)(MIN(size, ffd->block_size));
+ if (context->cancel_func)
+ SVN_ERR(context->cancel_func(context->cancel_baton));
+
+ SVN_ERR(svn_io_file_read_full2(source, buffer, to_copy,
+ NULL, NULL, scratch_pool));
+ SVN_ERR(svn_io_file_write_full(dest, buffer, to_copy,
+ NULL, scratch_pool));
+
+ size -= to_copy;
+ }
+
+ svn_pool_destroy(copypool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Writes SIZE bytes, all 0, to DEST.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_null_bytes(apr_file_t *dest,
+ apr_off_t size,
+ apr_pool_t *scratch_pool)
+{
+ /* Have a collection of high-quality, easy to access NUL bytes handy. */
+ enum { BUFFER_SIZE = 1024 };
+ static const char buffer[BUFFER_SIZE] = { 0 };
+
+ /* copy SIZE of them into the file's buffer */
+ while (size)
+ {
+ apr_size_t to_write = MIN(size, BUFFER_SIZE);
+ SVN_ERR(svn_io_file_write_full(dest, buffer, to_write, NULL,
+ scratch_pool));
+ size -= to_write;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy the "simple" item (changed paths list or property representation)
+ * from the current position in REV_FILE to TEMP_FILE using CONTEXT. Add
+ * a copy of ENTRY to ENTRIES but with an updated offset value that points
+ * to the copy destination in TEMP_FILE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_item_to_temp(pack_context_t *context,
+ apr_array_header_t *entries,
+ apr_file_t *temp_file,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__p2l_entry_t *new_entry
+ = svn_fs_x__p2l_entry_dup(entry, context->info_pool);
+
+ SVN_ERR(svn_fs_x__get_file_offset(&new_entry->offset, temp_file,
+ scratch_pool));
+ APR_ARRAY_PUSH(entries, svn_fs_x__p2l_entry_t *) = new_entry;
+
+ SVN_ERR(copy_file_data(context, temp_file, rev_file->file, entry->size,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the offset within CONTEXT->REPS that corresponds to item
+ * ITEM_INDEX in REVISION.
+ */
+static int
+get_item_array_index(pack_context_t *context,
+ svn_revnum_t revision,
+ apr_int64_t item_index)
+{
+ assert(revision >= context->start_rev);
+ return (int)item_index + APR_ARRAY_IDX(context->rev_offsets,
+ revision - context->start_rev,
+ int);
+}
+
+/* Write INFO to the correct position in CONTEXT->REPS. The latter may
+ * need auto-expanding. Overwriting an array element is not allowed.
+ */
+static void
+add_item_rep_mapping(pack_context_t *context,
+ svn_fs_x__p2l_entry_t *entry)
+{
+ int idx;
+ assert(entry->item_count == 1);
+
+ /* index of INFO */
+ idx = get_item_array_index(context,
+ entry->items[0].change_set,
+ entry->items[0].number);
+
+ /* make sure the index exists in the array */
+ while (context->reps->nelts <= idx)
+ APR_ARRAY_PUSH(context->reps, void *) = NULL;
+
+ /* set the element. If there is already an entry, there are probably
+ * two items claiming to be the same -> bail out */
+ assert(!APR_ARRAY_IDX(context->reps, idx, void *));
+ APR_ARRAY_IDX(context->reps, idx, void *) = entry;
+}
+
+/* Return the P2L entry from CONTEXT->REPS for the given ID. If there is
+ * none (or not anymore), return NULL. If RESET has been specified, set
+ * the array entry to NULL after returning the entry.
+ */
+static svn_fs_x__p2l_entry_t *
+get_item(pack_context_t *context,
+ const svn_fs_x__id_t *id,
+ svn_boolean_t reset)
+{
+ svn_fs_x__p2l_entry_t *result = NULL;
+ svn_revnum_t revision = svn_fs_x__get_revnum(id->change_set);
+ if (id->number && revision >= context->start_rev)
+ {
+ int idx = get_item_array_index(context, revision, id->number);
+ if (context->reps->nelts > idx)
+ {
+ result = APR_ARRAY_IDX(context->reps, idx, void *);
+ if (result && reset)
+ APR_ARRAY_IDX(context->reps, idx, void *) = NULL;
+ }
+ }
+
+ return result;
+}
+
+/* Copy representation item identified by ENTRY from the current position
+ * in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
+ * our placement algorithm to CONTEXT.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_rep_to_temp(pack_context_t *context,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__rep_header_t *rep_header;
+ apr_off_t source_offset = entry->offset;
+
+ /* create a copy of ENTRY, make it point to the copy destination and
+ * store it in CONTEXT */
+ entry = svn_fs_x__p2l_entry_dup(entry, context->info_pool);
+ SVN_ERR(svn_fs_x__get_file_offset(&entry->offset, context->reps_file,
+ scratch_pool));
+ add_item_rep_mapping(context, entry);
+
+ /* read & parse the representation header */
+ SVN_ERR(svn_fs_x__read_rep_header(&rep_header, rev_file->stream,
+ scratch_pool, scratch_pool));
+
+ /* if the representation is a delta against some other rep, link the two */
+ if ( rep_header->type == svn_fs_x__rep_delta
+ && rep_header->base_revision >= context->start_rev)
+ {
+ reference_t *reference = apr_pcalloc(context->info_pool,
+ sizeof(*reference));
+ reference->from = entry->items[0];
+ reference->to.change_set
+ = svn_fs_x__change_set_by_rev(rep_header->base_revision);
+ reference->to.number = rep_header->base_item_index;
+ APR_ARRAY_PUSH(context->references, reference_t *) = reference;
+ }
+
+ /* copy the whole rep (including header!) to our temp file */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &source_offset,
+ scratch_pool));
+ SVN_ERR(copy_file_data(context, context->reps_file, rev_file->file,
+ entry->size, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Directories first, dirs / files sorted by name in reverse lexical order.
+ * This maximizes the chance of two items being located close to one another
+ * in *all* pack files independent of their change order. It also groups
+ * multi-project repos nicely according to their sub-projects. The reverse
+ * order aspect gives "trunk" preference over "tags" and "branches", so
+ * trunk-related items are more likely to be contiguous.
+ */
+static int
+compare_dir_entries(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
+ const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
+
+ if (lhs->kind != rhs->kind)
+ return lhs->kind == svn_node_dir ? -1 : 1;
+
+ return strcmp(lhs->name, rhs->name);
+}
+
+apr_array_header_t *
+svn_fs_x__order_dir_entries(svn_fs_t *fs,
+ apr_hash_t *directory,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *ordered
+ = svn_sort__hash(directory, compare_dir_entries, scratch_pool);
+
+ apr_array_header_t *result
+ = apr_array_make(result_pool, ordered->nelts, sizeof(svn_fs_dirent_t *));
+
+ int i;
+ for (i = 0; i < ordered->nelts; ++i)
+ APR_ARRAY_PUSH(result, svn_fs_dirent_t *)
+ = APR_ARRAY_IDX(ordered, i, svn_sort__item_t).value;
+
+ return result;
+}
+
+/* Return a duplicate of the the ORIGINAL path and with special sub-strins
+ * (e.g. "trunk") modified in such a way that have a lower lexicographic
+ * value than any other "normal" file name.
+ */
+static const char *
+tweak_path_for_ordering(const char *original,
+ apr_pool_t *pool)
+{
+ /* We may add further special cases as needed. */
+ enum {SPECIAL_COUNT = 2};
+ static const char *special[SPECIAL_COUNT] = {"trunk", "branch"};
+ char *pos;
+ char *path = apr_pstrdup(pool, original);
+ int i;
+
+ /* Replace the first char of any "special" sub-string we find by
+ * a control char, i.e. '\1' .. '\31'. In the rare event that this
+ * would clash with existing paths, no data will be lost but merely
+ * the node ordering will be sub-optimal.
+ */
+ for (i = 0; i < SPECIAL_COUNT; ++i)
+ for (pos = strstr(path, special[i]);
+ pos;
+ pos = strstr(pos + 1, special[i]))
+ {
+ *pos = (char)(i + '\1');
+ }
+
+ return path;
+}
+
+/* Copy node revision item identified by ENTRY from the current position
+ * in REV_FILE into CONTEXT->REPS_FILE. Add all tracking into needed by
+ * our placement algorithm to CONTEXT.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_node_to_temp(pack_context_t *context,
+ svn_fs_x__revision_file_t *rev_file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ path_order_t *path_order = apr_pcalloc(context->info_pool,
+ sizeof(*path_order));
+ svn_fs_x__noderev_t *noderev;
+ const char *sort_path;
+ apr_off_t source_offset = entry->offset;
+
+ /* read & parse noderev */
+ SVN_ERR(svn_fs_x__read_noderev(&noderev, rev_file->stream, scratch_pool,
+ scratch_pool));
+
+ /* create a copy of ENTRY, make it point to the copy destination and
+ * store it in CONTEXT */
+ entry = svn_fs_x__p2l_entry_dup(entry, context->info_pool);
+ SVN_ERR(svn_fs_x__get_file_offset(&entry->offset, context->reps_file,
+ scratch_pool));
+ add_item_rep_mapping(context, entry);
+
+ /* copy the noderev to our temp file */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &source_offset,
+ scratch_pool));
+ SVN_ERR(copy_file_data(context, context->reps_file, rev_file->file,
+ entry->size, scratch_pool));
+
+ /* if the node has a data representation, make that the node's "base".
+ * This will (often) cause the noderev to be placed right in front of
+ * its data representation. */
+
+ if (noderev->data_rep
+ && svn_fs_x__get_revnum(noderev->data_rep->id.change_set)
+ >= context->start_rev)
+ {
+ reference_t *reference = apr_pcalloc(context->info_pool,
+ sizeof(*reference));
+ reference->from = entry->items[0];
+ reference->to.change_set = noderev->data_rep->id.change_set;
+ reference->to.number = noderev->data_rep->id.number;
+ APR_ARRAY_PUSH(context->references, reference_t *) = reference;
+
+ path_order->rep_id = reference->to;
+ path_order->expanded_size = noderev->data_rep->expanded_size;
+ }
+
+ /* Sort path is the key used for ordering noderevs and associated reps.
+ * It will not be stored in the final pack file. */
+ sort_path = tweak_path_for_ordering(noderev->created_path, scratch_pool);
+ path_order->path = svn_prefix_string__create(context->paths, sort_path);
+ path_order->node_id = noderev->node_id;
+ path_order->revision = svn_fs_x__get_revnum(noderev->noderev_id.change_set);
+ path_order->is_dir = noderev->kind == svn_node_dir;
+ path_order->noderev_id = noderev->noderev_id;
+ APR_ARRAY_PUSH(context->path_order, path_order_t *) = path_order;
+
+ return SVN_NO_ERROR;
+}
+
+/* implements compare_fn_t. Place LHS before RHS, if the latter is older.
+ */
+static int
+compare_p2l_info(const svn_fs_x__p2l_entry_t * const * lhs,
+ const svn_fs_x__p2l_entry_t * const * rhs)
+{
+ assert(*lhs != *rhs);
+ if ((*lhs)->item_count == 0)
+ return (*lhs)->item_count == 0 ? 0 : -1;
+ if ((*lhs)->item_count == 0)
+ return 1;
+
+ if ((*lhs)->items[0].change_set == (*rhs)->items[0].change_set)
+ return (*lhs)->items[0].number > (*rhs)->items[0].number ? -1 : 1;
+
+ return (*lhs)->items[0].change_set > (*rhs)->items[0].change_set ? -1 : 1;
+}
+
+/* Sort svn_fs_x__p2l_entry_t * array ENTRIES by age. Place the latest
+ * items first.
+ */
+static void
+sort_items(apr_array_header_t *entries)
+{
+ svn_sort__array(entries,
+ (int (*)(const void *, const void *))compare_p2l_info);
+}
+
+/* implements compare_fn_t. Sort descending by PATH, NODE_ID and REVISION.
+ */
+static int
+compare_path_order(const path_order_t * const * lhs_p,
+ const path_order_t * const * rhs_p)
+{
+ const path_order_t * lhs = *lhs_p;
+ const path_order_t * rhs = *rhs_p;
+
+ /* cluster all directories */
+ int diff = rhs->is_dir - lhs->is_dir;
+ if (diff)
+ return diff;
+
+ /* lexicographic order on path and node (i.e. latest first) */
+ diff = svn_prefix_string__compare(lhs->path, rhs->path);
+ if (diff)
+ return diff;
+
+ /* reverse order on node (i.e. latest first) */
+ diff = svn_fs_x__id_compare(&rhs->node_id, &lhs->node_id);
+ if (diff)
+ return diff;
+
+ /* reverse order on revision (i.e. latest first) */
+ if (lhs->revision != rhs->revision)
+ return lhs->revision < rhs->revision ? 1 : -1;
+
+ return 0;
+}
+
+/* implements compare_fn_t. Sort ascending by TO, FROM.
+ */
+static int
+compare_references(const reference_t * const * lhs_p,
+ const reference_t * const * rhs_p)
+{
+ const reference_t * lhs = *lhs_p;
+ const reference_t * rhs = *rhs_p;
+
+ int diff = svn_fs_x__id_compare(&lhs->to, &rhs->to);
+ return diff ? diff : svn_fs_x__id_compare(&lhs->from, &rhs->from);
+}
+
+/* Order the data collected in CONTEXT such that we can place them in the
+ * desired order.
+ */
+static void
+sort_reps(pack_context_t *context)
+{
+ svn_sort__array(context->path_order,
+ (int (*)(const void *, const void *))compare_path_order);
+ svn_sort__array(context->references,
+ (int (*)(const void *, const void *))compare_references);
+}
+
+/* Return the remaining unused bytes in the current block in CONTEXT's
+ * pack file.
+ */
+static apr_ssize_t
+get_block_left(pack_context_t *context)
+{
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+ return ffd->block_size - (context->pack_offset % ffd->block_size);
+}
+
+/* To prevent items from overlapping a block boundary, we will usually
+ * put them into the next block and top up the old one with NUL bytes.
+ * Pad CONTEXT's pack file to the end of the current block, if that padding
+ * is short enough. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+auto_pad_block(pack_context_t *context,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+
+ /* This is the maximum number of bytes "wasted" that way per block.
+ * Larger items will cross the block boundaries. */
+ const apr_off_t max_padding = MAX(ffd->block_size / 50, 512);
+
+ /* Is wasted space small enough to align the current item to the next
+ * block? */
+ apr_off_t padding = get_block_left(context);
+
+ if (padding < max_padding)
+ {
+ /* Yes. To up with NUL bytes and don't forget to create
+ * an P2L index entry marking this section as unused. */
+ svn_fs_x__p2l_entry_t null_entry;
+
+ null_entry.offset = context->pack_offset;
+ null_entry.size = padding;
+ null_entry.type = SVN_FS_X__ITEM_TYPE_UNUSED;
+ null_entry.fnv1_checksum = 0;
+ null_entry.item_count = 0;
+ null_entry.items = NULL;
+
+ SVN_ERR(write_null_bytes(context->pack_file, padding, scratch_pool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, &null_entry, scratch_pool));
+ context->pack_offset += padding;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the index of the first entry in CONTEXT->REFERENCES that
+ * references ITEM->ITEMS[0] if such entries exist. All matching items
+ * will be consecutive.
+ */
+static int
+find_first_reference(pack_context_t *context,
+ svn_fs_x__p2l_entry_t *item)
+{
+ int lower = 0;
+ int upper = context->references->nelts - 1;
+
+ while (lower <= upper)
+ {
+ int current = lower + (upper - lower) / 2;
+ reference_t *reference
+ = APR_ARRAY_IDX(context->references, current, reference_t *);
+
+ if (svn_fs_x__id_compare(&reference->to, item->items) < 0)
+ lower = current + 1;
+ else
+ upper = current - 1;
+ }
+
+ return lower;
+}
+
+/* Check whether entry number IDX in CONTEXT->REFERENCES references ITEM.
+ */
+static svn_boolean_t
+is_reference_match(pack_context_t *context,
+ int idx,
+ svn_fs_x__p2l_entry_t *item)
+{
+ reference_t *reference;
+ if (context->references->nelts <= idx)
+ return FALSE;
+
+ reference = APR_ARRAY_IDX(context->references, idx, reference_t *);
+ return svn_fs_x__id_eq(&reference->to, item->items);
+}
+
+/* Starting at IDX in CONTEXT->PATH_ORDER, select all representations and
+ * noderevs that should be placed into the same container, respectively.
+ * Append the path_order_t * elements encountered in SELECTED, the
+ * svn_fs_x__p2l_entry_t * of the representations that should be placed
+ * into the same reps container will be appended to REP_PARTS and the
+ * svn_fs_x__p2l_entry_t * of the noderevs referencing those reps will
+ * be appended to NODE_PARTS.
+ *
+ * Remove all returned items from the CONTEXT->REPS container and prevent
+ * them from being placed a second time later on. That also means that the
+ * caller has to place all items returned.
+ */
+static svn_error_t *
+select_reps(pack_context_t *context,
+ int idx,
+ apr_array_header_t *selected,
+ apr_array_header_t *node_parts,
+ apr_array_header_t *rep_parts)
+{
+ apr_array_header_t *path_order = context->path_order;
+ path_order_t *start_path = APR_ARRAY_IDX(path_order, idx, path_order_t *);
+
+ svn_fs_x__p2l_entry_t *node_part;
+ svn_fs_x__p2l_entry_t *rep_part;
+ svn_fs_x__p2l_entry_t *depending;
+ int i, k;
+
+ /* collect all path_order records as well as rep and noderev items
+ * that occupy the same path with the same node. */
+ for (; idx < path_order->nelts; ++idx)
+ {
+ path_order_t *current_path
+ = APR_ARRAY_IDX(path_order, idx, path_order_t *);
+
+ if (!svn_fs_x__id_eq(&start_path->node_id, &current_path->node_id))
+ break;
+
+ APR_ARRAY_IDX(path_order, idx, path_order_t *) = NULL;
+ node_part = get_item(context, &current_path->noderev_id, TRUE);
+ rep_part = get_item(context, &current_path->rep_id, TRUE);
+
+ if (node_part && rep_part)
+ APR_ARRAY_PUSH(selected, path_order_t *) = current_path;
+
+ if (node_part)
+ APR_ARRAY_PUSH(node_parts, svn_fs_x__p2l_entry_t *) = node_part;
+ if (rep_part)
+ APR_ARRAY_PUSH(rep_parts, svn_fs_x__p2l_entry_t *) = rep_part;
+ }
+
+ /* collect depending reps and noderevs that reference any of the collected
+ * reps */
+ for (i = 0; i < rep_parts->nelts; ++i)
+ {
+ rep_part = APR_ARRAY_IDX(rep_parts, i, svn_fs_x__p2l_entry_t*);
+ for (k = find_first_reference(context, rep_part);
+ is_reference_match(context, k, rep_part);
+ ++k)
+ {
+ reference_t *reference
+ = APR_ARRAY_IDX(context->references, k, reference_t *);
+
+ depending = get_item(context, &reference->from, TRUE);
+ if (!depending)
+ continue;
+
+ if (depending->type == SVN_FS_X__ITEM_TYPE_NODEREV)
+ APR_ARRAY_PUSH(node_parts, svn_fs_x__p2l_entry_t *) = depending;
+ else
+ APR_ARRAY_PUSH(rep_parts, svn_fs_x__p2l_entry_t *) = depending;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE, if all path_order_t * in SELECTED reference contents that is
+ * not longer than LIMIT.
+ */
+static svn_boolean_t
+reps_fit_into_containers(apr_array_header_t *selected,
+ apr_uint64_t limit)
+{
+ int i;
+ for (i = 0; i < selected->nelts; ++i)
+ if (APR_ARRAY_IDX(selected, i, path_order_t *)->expanded_size > limit)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Write the *CONTAINER containing the noderevs described by the
+ * svn_fs_x__p2l_entry_t * in ITEMS to the pack file on CONTEXT.
+ * Append a P2L entry for the container to CONTAINER->REPS.
+ * Afterwards, clear ITEMS and re-allocate *CONTAINER in CONTAINER_POOL
+ * so the caller may fill them again.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_nodes_container(pack_context_t *context,
+ svn_fs_x__noderevs_t **container,
+ apr_array_header_t *items,
+ apr_pool_t *container_pool,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_off_t offset = 0;
+ svn_fs_x__p2l_entry_t *container_entry;
+ svn_stream_t *pack_stream;
+
+ if (items->nelts == 0)
+ return SVN_NO_ERROR;
+
+ /* serialize container */
+ container_entry = apr_palloc(context->info_pool, sizeof(*container_entry));
+ pack_stream = svn_checksum__wrap_write_stream_fnv1a_32x4
+ (&container_entry->fnv1_checksum,
+ svn_stream_from_aprfile2(context->pack_file,
+ TRUE, scratch_pool),
+ scratch_pool);
+ SVN_ERR(svn_fs_x__write_noderevs_container(pack_stream, *container,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(pack_stream));
+ SVN_ERR(svn_io_file_seek(context->pack_file, APR_CUR, &offset,
+ scratch_pool));
+
+ /* replace first noderev item in ENTRIES with the container
+ and set all others to NULL */
+ container_entry->offset = context->pack_offset;
+ container_entry->size = offset - container_entry->offset;
+ container_entry->type = SVN_FS_X__ITEM_TYPE_NODEREVS_CONT;
+ container_entry->item_count = items->nelts;
+ container_entry->items = apr_palloc(context->info_pool,
+ sizeof(svn_fs_x__id_t) * container_entry->item_count);
+
+ for (i = 0; i < items->nelts; ++i)
+ container_entry->items[i]
+ = APR_ARRAY_IDX(items, i, svn_fs_x__p2l_entry_t *)->items[0];
+
+ context->pack_offset = offset;
+ APR_ARRAY_PUSH(context->reps, svn_fs_x__p2l_entry_t *)
+ = container_entry;
+
+ /* Write P2L index for copied items, i.e. the 1 container */
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, container_entry, scratch_pool));
+
+ svn_pool_clear(container_pool);
+ *container = svn_fs_x__noderevs_create(16, container_pool);
+ apr_array_clear(items);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the noderevs given by the svn_fs_x__p2l_entry_t * in NODE_PARTS
+ * from TEMP_FILE and add them to *CONTAINER and NODES_IN_CONTAINER.
+ * Whenever the container grows bigger than the current block in CONTEXT,
+ * write the data to disk and continue in the next block.
+ *
+ * Use CONTAINER_POOL to re-allocate the *CONTAINER as necessary and
+ * SCRATCH_POOL to temporary allocations.
+ */
+static svn_error_t *
+store_nodes(pack_context_t *context,
+ apr_file_t *temp_file,
+ apr_array_header_t *node_parts,
+ svn_fs_x__noderevs_t **container,
+ apr_array_header_t *nodes_in_container,
+ apr_pool_t *container_pool,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_stream_t *stream
+ = svn_stream_from_aprfile2(temp_file, TRUE, scratch_pool);
+
+ /* number of bytes in the current block not being spent on fixed-size
+ items (i.e. those not put into the container). */
+ apr_size_t capacity_left = get_block_left(context);
+
+ /* Estimated noderev container size */
+ apr_size_t last_container_size = 0, container_size = 0;
+
+ /* Estimate extra capacity we will gain from container compression. */
+ apr_size_t pack_savings = 0;
+ for (i = 0; i < node_parts->nelts; ++i)
+ {
+ svn_fs_x__noderev_t *noderev;
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(node_parts, i, svn_fs_x__p2l_entry_t *);
+
+ /* if we reached the limit, check whether we saved some space
+ through the container. */
+ if (capacity_left + pack_savings < container_size + entry->size)
+ container_size = svn_fs_x__noderevs_estimate_size(*container);
+
+ /* If necessary and the container is large enough, try harder
+ by actually serializing the container and determine current
+ savings due to compression. */
+ if ( capacity_left + pack_savings < container_size + entry->size
+ && container_size > last_container_size + 2000)
+ {
+ svn_stringbuf_t *serialized
+ = svn_stringbuf_create_ensure(container_size, iterpool);
+ svn_stream_t *temp_stream
+ = svn_stream_from_stringbuf(serialized, iterpool);
+
+ SVN_ERR(svn_fs_x__write_noderevs_container(temp_stream, *container,
+ iterpool));
+ SVN_ERR(svn_stream_close(temp_stream));
+
+ last_container_size = container_size;
+ pack_savings = container_size - serialized->len;
+ }
+
+ /* still doesn't fit? -> block is full. Flush */
+ if ( capacity_left + pack_savings < container_size + entry->size
+ && nodes_in_container->nelts < 2)
+ {
+ SVN_ERR(auto_pad_block(context, iterpool));
+ capacity_left = get_block_left(context);
+ }
+
+ /* still doesn't fit? -> block is full. Flush */
+ if (capacity_left + pack_savings < container_size + entry->size)
+ {
+ SVN_ERR(write_nodes_container(context, container,
+ nodes_in_container, container_pool,
+ iterpool));
+
+ capacity_left = get_block_left(context);
+ pack_savings = 0;
+ container_size = 0;
+ }
+
+ /* item will fit into the block. */
+ SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &entry->offset, iterpool));
+ SVN_ERR(svn_fs_x__read_noderev(&noderev, stream, iterpool, iterpool));
+ svn_fs_x__noderevs_add(*container, noderev);
+
+ container_size += entry->size;
+ APR_ARRAY_PUSH(nodes_in_container, svn_fs_x__p2l_entry_t *) = entry;
+
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Finalize CONTAINER and write it to CONTEXT's pack file.
+ * Append an P2L entry containing the given SUB_ITEMS to NEW_ENTRIES.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_reps_container(pack_context_t *context,
+ svn_fs_x__reps_builder_t *container,
+ apr_array_header_t *sub_items,
+ apr_array_header_t *new_entries,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset = 0;
+ svn_fs_x__p2l_entry_t container_entry;
+
+ svn_stream_t *pack_stream
+ = svn_checksum__wrap_write_stream_fnv1a_32x4
+ (&container_entry.fnv1_checksum,
+ svn_stream_from_aprfile2(context->pack_file,
+ TRUE, scratch_pool),
+ scratch_pool);
+
+ SVN_ERR(svn_fs_x__write_reps_container(pack_stream, container,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(pack_stream));
+ SVN_ERR(svn_io_file_seek(context->pack_file, APR_CUR, &offset,
+ scratch_pool));
+
+ container_entry.offset = context->pack_offset;
+ container_entry.size = offset - container_entry.offset;
+ container_entry.type = SVN_FS_X__ITEM_TYPE_REPS_CONT;
+ container_entry.item_count = sub_items->nelts;
+ container_entry.items = (svn_fs_x__id_t *)sub_items->elts;
+
+ context->pack_offset = offset;
+ APR_ARRAY_PUSH(new_entries, svn_fs_x__p2l_entry_t *)
+ = svn_fs_x__p2l_entry_dup(&container_entry, context->info_pool);
+
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, &container_entry, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the (property) representations identified by svn_fs_x__p2l_entry_t
+ * elements in ENTRIES from TEMP_FILE, aggregate them and write them into
+ * CONTEXT->PACK_FILE. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_reps_containers(pack_context_t *context,
+ apr_array_header_t *entries,
+ apr_file_t *temp_file,
+ apr_array_header_t *new_entries,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *container_pool = svn_pool_create(scratch_pool);
+ int i;
+
+ apr_ssize_t block_left = get_block_left(context);
+
+ svn_fs_x__reps_builder_t *container
+ = svn_fs_x__reps_builder_create(context->fs, container_pool);
+ apr_array_header_t *sub_items
+ = apr_array_make(scratch_pool, 64, sizeof(svn_fs_x__id_t));
+ svn_fs_x__revision_file_t *file;
+
+ SVN_ERR(svn_fs_x__wrap_temp_rev_file(&file, context->fs, temp_file,
+ scratch_pool));
+
+ /* copy all items in strict order */
+ for (i = entries->nelts-1; i >= 0; --i)
+ {
+ svn_fs_x__representation_t representation = { 0 };
+ svn_stringbuf_t *contents;
+ svn_stream_t *stream;
+ apr_size_t list_index;
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t *);
+
+ if ((block_left < entry->size) && sub_items->nelts)
+ {
+ block_left = get_block_left(context)
+ - svn_fs_x__reps_estimate_size(container);
+ }
+
+ if ((block_left < entry->size) && sub_items->nelts)
+ {
+ SVN_ERR(write_reps_container(context, container, sub_items,
+ new_entries, iterpool));
+
+ apr_array_clear(sub_items);
+ svn_pool_clear(container_pool);
+ container = svn_fs_x__reps_builder_create(context->fs,
+ container_pool);
+ block_left = get_block_left(context);
+ }
+
+ /* still enough space in current block? */
+ if (block_left < entry->size)
+ {
+ SVN_ERR(auto_pad_block(context, iterpool));
+ block_left = get_block_left(context);
+ }
+
+ assert(entry->item_count == 1);
+ representation.id = entry->items[0];
+
+ /* select the change list in the source file, parse it and add it to
+ * the container */
+ SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &entry->offset,
+ iterpool));
+ SVN_ERR(svn_fs_x__get_representation_length(&representation.size,
+ &representation.expanded_size,
+ context->fs, file,
+ entry, iterpool));
+ SVN_ERR(svn_fs_x__get_contents(&stream, context->fs, &representation,
+ FALSE, iterpool));
+ contents = svn_stringbuf_create_ensure(representation.expanded_size,
+ iterpool);
+ contents->len = representation.expanded_size;
+
+ /* The representation is immutable. Read it normally. */
+ SVN_ERR(svn_stream_read_full(stream, contents->data, &contents->len));
+ SVN_ERR(svn_stream_close(stream));
+
+ SVN_ERR(svn_fs_x__reps_add(&list_index, container,
+ svn_stringbuf__morph_into_string(contents)));
+ SVN_ERR_ASSERT(list_index == sub_items->nelts);
+ block_left -= entry->size;
+
+ APR_ARRAY_PUSH(sub_items, svn_fs_x__id_t) = entry->items[0];
+
+ svn_pool_clear(iterpool);
+ }
+
+ if (sub_items->nelts)
+ SVN_ERR(write_reps_container(context, container, sub_items,
+ new_entries, iterpool));
+
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(container_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE if the estimated size of the NODES_IN_CONTAINER plus the
+ * representations given as svn_fs_x__p2l_entry_t * in ENTRIES may exceed
+ * the space left in the current block.
+ */
+static svn_boolean_t
+should_flush_nodes_container(pack_context_t *context,
+ svn_fs_x__noderevs_t *nodes_container,
+ apr_array_header_t *entries)
+{
+ apr_ssize_t block_left = get_block_left(context);
+ apr_ssize_t rep_sum = 0;
+ apr_ssize_t container_size
+ = svn_fs_x__noderevs_estimate_size(nodes_container);
+
+ int i;
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t *);
+ rep_sum += entry->size;
+ }
+
+ return block_left < rep_sum + container_size;
+}
+
+/* Read the contents of the first COUNT non-NULL, non-empty items in ITEMS
+ * from TEMP_FILE and write them to CONTEXT->PACK_FILE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+store_items(pack_context_t *context,
+ apr_file_t *temp_file,
+ apr_array_header_t *items,
+ int count,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* copy all items in strict order */
+ for (i = 0; i < count; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(items, i, svn_fs_x__p2l_entry_t *);
+ if (!entry
+ || entry->type == SVN_FS_X__ITEM_TYPE_UNUSED
+ || entry->item_count == 0)
+ continue;
+
+ /* select the item in the source file and copy it into the target
+ * pack file */
+ SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &entry->offset,
+ iterpool));
+ SVN_ERR(copy_file_data(context, context->pack_file, temp_file,
+ entry->size, iterpool));
+
+ /* write index entry and update current position */
+ entry->offset = context->pack_offset;
+ context->pack_offset += entry->size;
+
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, entry, iterpool));
+
+ APR_ARRAY_PUSH(context->reps, svn_fs_x__p2l_entry_t *) = entry;
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy (append) the items identified by svn_fs_x__p2l_entry_t * elements
+ * in ENTRIES strictly in order from TEMP_FILE into CONTEXT->PACK_FILE.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+copy_reps_from_temp(pack_context_t *context,
+ apr_file_t *temp_file,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *container_pool = svn_pool_create(scratch_pool);
+ apr_array_header_t *path_order = context->path_order;
+ apr_array_header_t *reps = context->reps;
+ apr_array_header_t *selected = apr_array_make(scratch_pool, 16,
+ path_order->elt_size);
+ apr_array_header_t *node_parts = apr_array_make(scratch_pool, 16,
+ reps->elt_size);
+ apr_array_header_t *rep_parts = apr_array_make(scratch_pool, 16,
+ reps->elt_size);
+ apr_array_header_t *nodes_in_container = apr_array_make(scratch_pool, 16,
+ reps->elt_size);
+ int i, k;
+ int initial_reps_count = reps->nelts;
+
+ /* 1 container for all noderevs in the current block. We will try to
+ * not write it to disk until the current block fills up, i.e. aim for
+ * a single noderevs container per block. */
+ svn_fs_x__noderevs_t *nodes_container
+ = svn_fs_x__noderevs_create(16, container_pool);
+
+ /* copy items in path order. Create block-sized containers. */
+ for (i = 0; i < path_order->nelts; ++i)
+ {
+ if (APR_ARRAY_IDX(path_order, i, path_order_t *) == NULL)
+ continue;
+
+ /* Collect reps to combine and all noderevs referencing them */
+ SVN_ERR(select_reps(context, i, selected, node_parts, rep_parts));
+
+ /* store the noderevs container in front of the reps */
+ SVN_ERR(store_nodes(context, temp_file, node_parts, &nodes_container,
+ nodes_in_container, container_pool, iterpool));
+
+ /* actually flush the noderevs to disk if the reps container is likely
+ * to fill the block, i.e. no further noderevs will be added to the
+ * nodes container. */
+ if (should_flush_nodes_container(context, nodes_container, node_parts))
+ SVN_ERR(write_nodes_container(context, &nodes_container,
+ nodes_in_container, container_pool,
+ iterpool));
+
+ /* if all reps are short enough put them into one container.
+ * Otherwise, just store all containers here. */
+ if (reps_fit_into_containers(selected, 2 * ffd->block_size))
+ SVN_ERR(write_reps_containers(context, rep_parts, temp_file,
+ context->reps, iterpool));
+ else
+ SVN_ERR(store_items(context, temp_file, rep_parts, rep_parts->nelts,
+ iterpool));
+
+ /* processed all items */
+ apr_array_clear(selected);
+ apr_array_clear(node_parts);
+ apr_array_clear(rep_parts);
+
+ svn_pool_clear(iterpool);
+ }
+
+ /* flush noderevs container to disk */
+ if (nodes_in_container->nelts)
+ SVN_ERR(write_nodes_container(context, &nodes_container,
+ nodes_in_container, container_pool,
+ iterpool));
+
+ /* copy all items in strict order */
+ SVN_ERR(store_items(context, temp_file, reps, initial_reps_count,
+ scratch_pool));
+
+ /* vaccum ENTRIES array: eliminate NULL entries */
+ for (i = 0, k = 0; i < reps->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(reps, i, svn_fs_x__p2l_entry_t *);
+ if (entry)
+ {
+ APR_ARRAY_IDX(reps, k, svn_fs_x__p2l_entry_t *) = entry;
+ ++k;
+ }
+ }
+ reps->nelts = k;
+
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(container_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Finalize CONTAINER and write it to CONTEXT's pack file.
+ * Append an P2L entry containing the given SUB_ITEMS to NEW_ENTRIES.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_changes_container(pack_context_t *context,
+ svn_fs_x__changes_t *container,
+ apr_array_header_t *sub_items,
+ apr_array_header_t *new_entries,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset = 0;
+ svn_fs_x__p2l_entry_t container_entry;
+
+ svn_stream_t *pack_stream
+ = svn_checksum__wrap_write_stream_fnv1a_32x4
+ (&container_entry.fnv1_checksum,
+ svn_stream_from_aprfile2(context->pack_file,
+ TRUE, scratch_pool),
+ scratch_pool);
+
+ SVN_ERR(svn_fs_x__write_changes_container(pack_stream,
+ container,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(pack_stream));
+ SVN_ERR(svn_io_file_seek(context->pack_file, APR_CUR, &offset,
+ scratch_pool));
+
+ container_entry.offset = context->pack_offset;
+ container_entry.size = offset - container_entry.offset;
+ container_entry.type = SVN_FS_X__ITEM_TYPE_CHANGES_CONT;
+ container_entry.item_count = sub_items->nelts;
+ container_entry.items = (svn_fs_x__id_t *)sub_items->elts;
+
+ context->pack_offset = offset;
+ APR_ARRAY_PUSH(new_entries, svn_fs_x__p2l_entry_t *)
+ = svn_fs_x__p2l_entry_dup(&container_entry, context->info_pool);
+
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, &container_entry, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the change lists identified by svn_fs_x__p2l_entry_t * elements
+ * in ENTRIES strictly in from TEMP_FILE, aggregate them and write them
+ * into CONTEXT->PACK_FILE. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_changes_containers(pack_context_t *context,
+ apr_array_header_t *entries,
+ apr_file_t *temp_file,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *container_pool = svn_pool_create(scratch_pool);
+ int i;
+
+ apr_ssize_t block_left = get_block_left(context);
+ apr_ssize_t estimated_addition = 0;
+
+ svn_fs_x__changes_t *container
+ = svn_fs_x__changes_create(1000, container_pool);
+ apr_array_header_t *sub_items
+ = apr_array_make(scratch_pool, 64, sizeof(svn_fs_x__id_t));
+ apr_array_header_t *new_entries
+ = apr_array_make(context->info_pool, 16, entries->elt_size);
+ svn_stream_t *temp_stream
+ = svn_stream_from_aprfile2(temp_file, TRUE, scratch_pool);
+
+ /* copy all items in strict order */
+ for (i = entries->nelts-1; i >= 0; --i)
+ {
+ apr_array_header_t *changes;
+ apr_size_t list_index;
+ svn_fs_x__p2l_entry_t *entry
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t *);
+
+ /* zip compression alone will significantly reduce the size of large
+ * change lists. So, we will probably need even less than this estimate.
+ */
+ apr_ssize_t estimated_size = (entry->size / 5) + 250;
+
+ /* If necessary and enough data has been added to the container since
+ * the last test, try harder by actually serializing the container and
+ * determine current savings due to compression. */
+ if (block_left < estimated_size && estimated_addition > 2000)
+ {
+ svn_stringbuf_t *serialized
+ = svn_stringbuf_create_ensure(get_block_left(context), iterpool);
+ svn_stream_t *memory_stream
+ = svn_stream_from_stringbuf(serialized, iterpool);
+
+ SVN_ERR(svn_fs_x__write_changes_container(memory_stream,
+ container, iterpool));
+ SVN_ERR(svn_stream_close(temp_stream));
+
+ block_left = get_block_left(context) - serialized->len;
+ estimated_addition = 0;
+ }
+
+ if ((block_left < estimated_size) && sub_items->nelts)
+ {
+ SVN_ERR(write_changes_container(context, container, sub_items,
+ new_entries, iterpool));
+
+ apr_array_clear(sub_items);
+ svn_pool_clear(container_pool);
+ container = svn_fs_x__changes_create(1000, container_pool);
+ block_left = get_block_left(context);
+ estimated_addition = 0;
+ }
+
+ /* still enough space in current block? */
+ if (block_left < estimated_size)
+ {
+ SVN_ERR(auto_pad_block(context, iterpool));
+ block_left = get_block_left(context);
+ }
+
+ /* select the change list in the source file, parse it and add it to
+ * the container */
+ SVN_ERR(svn_io_file_seek(temp_file, APR_SET, &entry->offset,
+ iterpool));
+ SVN_ERR(svn_fs_x__read_changes(&changes, temp_stream, scratch_pool,
+ iterpool));
+ SVN_ERR(svn_fs_x__changes_append_list(&list_index, container, changes));
+ SVN_ERR_ASSERT(list_index == sub_items->nelts);
+ block_left -= estimated_size;
+ estimated_addition += estimated_size;
+
+ APR_ARRAY_PUSH(sub_items, svn_fs_x__id_t) = entry->items[0];
+
+ svn_pool_clear(iterpool);
+ }
+
+ if (sub_items->nelts)
+ SVN_ERR(write_changes_container(context, container, sub_items,
+ new_entries, iterpool));
+
+ *entries = *new_entries;
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(container_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the (property) representations identified by svn_fs_x__p2l_entry_t
+ * elements in ENTRIES from TEMP_FILE, aggregate them and write them into
+ * CONTEXT->PACK_FILE. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+write_property_containers(pack_context_t *context,
+ apr_array_header_t *entries,
+ apr_file_t *temp_file,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *new_entries
+ = apr_array_make(context->info_pool, 16, entries->elt_size);
+
+ SVN_ERR(write_reps_containers(context, entries, temp_file, new_entries,
+ scratch_pool));
+
+ *entries = *new_entries;
+
+ return SVN_NO_ERROR;
+}
+
+/* Append all entries of svn_fs_x__p2l_entry_t * array TO_APPEND to
+ * svn_fs_x__p2l_entry_t * array DEST.
+ */
+static void
+append_entries(apr_array_header_t *dest,
+ apr_array_header_t *to_append)
+{
+ int i;
+ for (i = 0; i < to_append->nelts; ++i)
+ APR_ARRAY_PUSH(dest, svn_fs_x__p2l_entry_t *)
+ = APR_ARRAY_IDX(to_append, i, svn_fs_x__p2l_entry_t *);
+}
+
+/* Write the log-to-phys proto index file for CONTEXT and use POOL for
+ * temporary allocations. All items in all buckets must have been placed
+ * by now.
+ */
+static svn_error_t *
+write_l2p_index(pack_context_t *context,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ const char *temp_name;
+ const char *proto_index;
+ apr_off_t offset = 0;
+
+ /* lump all items into one bucket. As target, use the bucket that
+ * probably has the most entries already. */
+ append_entries(context->reps, context->changes);
+ append_entries(context->reps, context->file_props);
+ append_entries(context->reps, context->dir_props);
+
+ /* Let the index code do the expensive L2P -> P2L transformation. */
+ SVN_ERR(svn_fs_x__l2p_index_from_p2l_entries(&temp_name,
+ context->fs,
+ context->reps,
+ pool, scratch_pool));
+
+ /* Append newly written segment to exisiting proto index file. */
+ SVN_ERR(svn_io_file_name_get(&proto_index, context->proto_l2p_index,
+ scratch_pool));
+
+ SVN_ERR(svn_io_file_flush(context->proto_l2p_index, scratch_pool));
+ SVN_ERR(svn_io_append_file(temp_name, proto_index, scratch_pool));
+ SVN_ERR(svn_io_remove_file2(temp_name, FALSE, scratch_pool));
+ SVN_ERR(svn_io_file_seek(context->proto_l2p_index, APR_END, &offset,
+ scratch_pool));
+
+ /* Done. */
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Pack the current revision range of CONTEXT, i.e. this covers phases 2
+ * to 4. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+pack_range(pack_context_t *context,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+ apr_pool_t *revpool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Phase 2: Copy items into various buckets and build tracking info */
+ svn_revnum_t revision;
+ for (revision = context->start_rev; revision < context->end_rev; ++revision)
+ {
+ apr_off_t offset = 0;
+ svn_fs_x__revision_file_t *rev_file;
+
+ /* Get the rev file dimensions (mainly index locations). */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, context->fs,
+ revision, revpool, iterpool));
+ SVN_ERR(svn_fs_x__auto_read_footer(rev_file));
+
+ /* store the indirect array index */
+ APR_ARRAY_PUSH(context->rev_offsets, int) = context->reps->nelts;
+
+ /* read the phys-to-log index file until we covered the whole rev file.
+ * That index contains enough info to build both target indexes from it. */
+ while (offset < rev_file->l2p_offset)
+ {
+ /* read one cluster */
+ int i;
+ apr_array_header_t *entries;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, context->fs,
+ rev_file, revision, offset,
+ ffd->p2l_page_size, iterpool,
+ iterpool));
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t);
+
+ /* skip first entry if that was duplicated due crossing a
+ cluster boundary */
+ if (offset > entry->offset)
+ continue;
+
+ /* process entry while inside the rev file */
+ offset = entry->offset;
+ if (offset < rev_file->l2p_offset)
+ {
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset,
+ iterpool));
+
+ if (entry->type == SVN_FS_X__ITEM_TYPE_CHANGES)
+ SVN_ERR(copy_item_to_temp(context,
+ context->changes,
+ context->changes_file,
+ rev_file, entry, iterpool));
+ else if (entry->type == SVN_FS_X__ITEM_TYPE_FILE_PROPS)
+ SVN_ERR(copy_item_to_temp(context,
+ context->file_props,
+ context->file_props_file,
+ rev_file, entry, iterpool));
+ else if (entry->type == SVN_FS_X__ITEM_TYPE_DIR_PROPS)
+ SVN_ERR(copy_item_to_temp(context,
+ context->dir_props,
+ context->dir_props_file,
+ rev_file, entry, iterpool));
+ else if ( entry->type == SVN_FS_X__ITEM_TYPE_FILE_REP
+ || entry->type == SVN_FS_X__ITEM_TYPE_DIR_REP)
+ SVN_ERR(copy_rep_to_temp(context, rev_file, entry,
+ iterpool));
+ else if (entry->type == SVN_FS_X__ITEM_TYPE_NODEREV)
+ SVN_ERR(copy_node_to_temp(context, rev_file, entry,
+ iterpool));
+ else
+ SVN_ERR_ASSERT(entry->type == SVN_FS_X__ITEM_TYPE_UNUSED);
+
+ offset += entry->size;
+ }
+ }
+
+ if (context->cancel_func)
+ SVN_ERR(context->cancel_func(context->cancel_baton));
+ }
+
+ svn_pool_clear(revpool);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ /* phase 3: placement.
+ * Use "newest first" placement for simple items. */
+ sort_items(context->changes);
+ sort_items(context->file_props);
+ sort_items(context->dir_props);
+
+ /* follow dependencies recursively for noderevs and data representations */
+ sort_reps(context);
+
+ /* phase 4: copy bucket data to pack file. Write P2L index. */
+ SVN_ERR(write_changes_containers(context, context->changes,
+ context->changes_file, revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(write_property_containers(context, context->file_props,
+ context->file_props_file, revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(write_property_containers(context, context->dir_props,
+ context->dir_props_file, revpool));
+ svn_pool_clear(revpool);
+ SVN_ERR(copy_reps_from_temp(context, context->reps_file, revpool));
+ svn_pool_clear(revpool);
+
+ /* write L2P index as well (now that we know all target offsets) */
+ SVN_ERR(write_l2p_index(context, revpool));
+
+ svn_pool_destroy(revpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Append CONTEXT->START_REV to the context's pack file with no re-ordering.
+ * This function will only be used for very large revisions (>>100k changes).
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+append_revision(pack_context_t *context,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = context->fs->fsap_data;
+ apr_off_t offset = 0;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_fs_x__revision_file_t *rev_file;
+ apr_finfo_t finfo;
+
+ /* Get the size of the file. */
+ const char *path = svn_dirent_join(context->shard_dir,
+ apr_psprintf(iterpool, "%ld",
+ context->start_rev),
+ scratch_pool);
+ SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, scratch_pool));
+
+ /* Copy all the bits from the rev file to the end of the pack file. */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, context->fs,
+ context->start_rev, scratch_pool,
+ iterpool));
+ SVN_ERR(copy_file_data(context, context->pack_file, rev_file->file,
+ finfo.size, iterpool));
+
+ /* mark the start of a new revision */
+ SVN_ERR(svn_fs_x__l2p_proto_index_add_revision(context->proto_l2p_index,
+ scratch_pool));
+
+ /* read the phys-to-log index file until we covered the whole rev file.
+ * That index contains enough info to build both target indexes from it. */
+ while (offset < finfo.size)
+ {
+ /* read one cluster */
+ int i;
+ apr_array_header_t *entries;
+ SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, context->fs, rev_file,
+ context->start_rev, offset,
+ ffd->p2l_page_size, iterpool,
+ iterpool));
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t);
+
+ /* skip first entry if that was duplicated due crossing a
+ cluster boundary */
+ if (offset > entry->offset)
+ continue;
+
+ /* process entry while inside the rev file */
+ offset = entry->offset;
+ if (offset < finfo.size)
+ {
+ /* there should be true containers */
+ SVN_ERR_ASSERT(entry->item_count == 1);
+
+ entry->offset += context->pack_offset;
+ offset += entry->size;
+ SVN_ERR(svn_fs_x__l2p_proto_index_add_entry
+ (context->proto_l2p_index, entry->offset, 0,
+ entry->items[0].number, iterpool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry
+ (context->proto_p2l_index, entry, iterpool));
+ }
+ }
+
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+ context->pack_offset += finfo.size;
+
+ return SVN_NO_ERROR;
+}
+
+/* Format 7 packing logic.
+ *
+ * Pack the revision shard starting at SHARD_REV in filesystem FS from
+ * SHARD_DIR into the PACK_FILE_DIR, using SCRATCH_POOL for temporary
+ * allocations. Limit the extra memory consumption to MAX_MEM bytes.
+ * CANCEL_FUNC and CANCEL_BATON are what you think they are.
+ */
+static svn_error_t *
+pack_log_addressed(svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_dir,
+ svn_revnum_t shard_rev,
+ apr_size_t max_mem,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ enum
+ {
+ /* estimated amount of memory used to represent one item in memory
+ * during rev file packing */
+ PER_ITEM_MEM = APR_ALIGN_DEFAULT(sizeof(path_order_t))
+ + APR_ALIGN_DEFAULT(2 *sizeof(void*))
+ + APR_ALIGN_DEFAULT(sizeof(reference_t))
+ + APR_ALIGN_DEFAULT(sizeof(svn_fs_x__p2l_entry_t))
+ + 6 * sizeof(void*)
+ };
+
+ int max_items = max_mem / PER_ITEM_MEM > INT_MAX
+ ? INT_MAX
+ : (int)(max_mem / PER_ITEM_MEM);
+ apr_array_header_t *max_ids;
+ pack_context_t context = { 0 };
+ int i;
+ apr_size_t item_count = 0;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* set up a pack context */
+ SVN_ERR(initialize_pack_context(&context, fs, pack_file_dir, shard_dir,
+ shard_rev, max_items, cancel_func,
+ cancel_baton, scratch_pool));
+
+ /* phase 1: determine the size of the revisions to pack */
+ SVN_ERR(svn_fs_x__l2p_get_max_ids(&max_ids, fs, shard_rev,
+ context.shard_end_rev - shard_rev,
+ scratch_pool, scratch_pool));
+
+ /* pack revisions in ranges that don't exceed MAX_MEM */
+ for (i = 0; i < max_ids->nelts; ++i)
+ if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) + item_count <= max_items)
+ {
+ context.end_rev++;
+ }
+ else
+ {
+ /* some unpacked revisions before this one? */
+ if (context.start_rev < context.end_rev)
+ {
+ /* pack them intelligently (might be just 1 rev but still ...) */
+ SVN_ERR(pack_range(&context, iterpool));
+ SVN_ERR(reset_pack_context(&context, iterpool));
+ item_count = 0;
+ }
+
+ /* next revision range is to start with the current revision */
+ context.start_rev = i + context.shard_rev;
+ context.end_rev = context.start_rev + 1;
+
+ /* if this is a very large revision, we must place it as is */
+ if (APR_ARRAY_IDX(max_ids, i, apr_uint64_t) > max_items)
+ {
+ SVN_ERR(append_revision(&context, iterpool));
+ context.start_rev++;
+ }
+ else
+ item_count += (apr_size_t)APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
+
+ svn_pool_clear(iterpool);
+ }
+
+ /* non-empty revision range at the end? */
+ if (context.start_rev < context.end_rev)
+ SVN_ERR(pack_range(&context, iterpool));
+
+ /* last phase: finalize indexes and clean up */
+ SVN_ERR(reset_pack_context(&context, iterpool));
+ SVN_ERR(close_pack_context(&context, iterpool));
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Given REV in FS, set *REV_OFFSET to REV's offset in the packed file.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__get_packed_offset(apr_off_t *rev_offset,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stream_t *manifest_stream;
+ svn_boolean_t is_cached;
+ svn_revnum_t shard;
+ apr_int64_t shard_pos;
+ apr_array_header_t *manifest;
+ apr_pool_t *iterpool;
+
+ shard = rev / ffd->max_files_per_dir;
+
+ /* position of the shard within the manifest */
+ shard_pos = rev % ffd->max_files_per_dir;
+
+ /* fetch exactly that element into *rev_offset, if the manifest is found
+ in the cache */
+ SVN_ERR(svn_cache__get_partial((void **) rev_offset, &is_cached,
+ ffd->packed_offset_cache, &shard,
+ svn_fs_x__get_sharded_offset, &shard_pos,
+ scratch_pool));
+
+ if (is_cached)
+ return SVN_NO_ERROR;
+
+ /* Open the manifest file. */
+ SVN_ERR(svn_stream_open_readonly(&manifest_stream,
+ svn_fs_x__path_rev_packed(fs, rev, PATH_MANIFEST,
+ scratch_pool),
+ scratch_pool, scratch_pool));
+
+ /* While we're here, let's just read the entire manifest file into an array,
+ so we can cache the entire thing. */
+ iterpool = svn_pool_create(scratch_pool);
+ manifest = apr_array_make(scratch_pool, ffd->max_files_per_dir,
+ sizeof(apr_off_t));
+ while (1)
+ {
+ svn_boolean_t eof;
+ apr_int64_t val;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_x__read_number_from_stream(&val, &eof, manifest_stream,
+ iterpool));
+ if (eof)
+ break;
+
+ APR_ARRAY_PUSH(manifest, apr_off_t) = (apr_off_t)val;
+ }
+ svn_pool_destroy(iterpool);
+
+ *rev_offset = APR_ARRAY_IDX(manifest, rev % ffd->max_files_per_dir,
+ apr_off_t);
+
+ /* Close up shop and cache the array. */
+ SVN_ERR(svn_stream_close(manifest_stream));
+ return svn_cache__set(ffd->packed_offset_cache, &shard, manifest,
+ scratch_pool);
+}
+
+/* In filesystem FS, pack the revision SHARD containing exactly
+ * MAX_FILES_PER_DIR revisions from SHARD_PATH into the PACK_FILE_DIR,
+ * using SCRATCH_POOL for temporary allocations. Try to limit the amount of
+ * temporary memory needed to MAX_MEM bytes. CANCEL_FUNC and CANCEL_BATON
+ * are what you think they are.
+ *
+ * If for some reason we detect a partial packing already performed, we
+ * remove the pack file and start again.
+ *
+ * The actual packing will be done in a format-specific sub-function.
+ */
+static svn_error_t *
+pack_rev_shard(svn_fs_t *fs,
+ const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_size_t max_mem,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *pack_file_path;
+ svn_revnum_t shard_rev = (svn_revnum_t) (shard * max_files_per_dir);
+
+ /* Some useful paths. */
+ pack_file_path = svn_dirent_join(pack_file_dir, PATH_PACKED, scratch_pool);
+
+ /* Remove any existing pack file for this shard, since it is incomplete. */
+ SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* Create the new directory and pack file. */
+ SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, scratch_pool));
+
+ /* Index information files */
+ SVN_ERR(pack_log_addressed(fs, pack_file_dir, shard_path, shard_rev,
+ max_mem, cancel_func, cancel_baton,
+ scratch_pool));
+
+ SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, scratch_pool));
+ SVN_ERR(svn_io_set_file_read_only(pack_file_path, FALSE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* In the file system at FS_PATH, pack the SHARD in REVS_DIR and
+ * REVPROPS_DIR containing exactly MAX_FILES_PER_DIR revisions, using
+ * SCRATCH_POOL temporary for allocations. REVPROPS_DIR will be NULL if
+ * revprop packing is not supported. COMPRESSION_LEVEL and MAX_PACK_SIZE
+ * will be ignored in that case.
+ *
+ * CANCEL_FUNC and CANCEL_BATON are what you think they are; similarly
+ * NOTIFY_FUNC and NOTIFY_BATON.
+ *
+ * If for some reason we detect a partial packing already performed, we
+ * remove the pack file and start again.
+ */
+static svn_error_t *
+pack_shard(const char *revs_dir,
+ const char *revsprops_dir,
+ svn_fs_t *fs,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_off_t max_pack_size,
+ int compression_level,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *rev_shard_path, *rev_pack_file_dir;
+ const char *revprops_shard_path, *revprops_pack_file_dir;
+
+ /* Notify caller we're starting to pack this shard. */
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_start,
+ scratch_pool));
+
+ /* Some useful paths. */
+ rev_pack_file_dir = svn_dirent_join(revs_dir,
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ shard),
+ scratch_pool);
+ rev_shard_path = svn_dirent_join(revs_dir,
+ apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, shard),
+ scratch_pool);
+
+ /* pack the revision content */
+ SVN_ERR(pack_rev_shard(fs, rev_pack_file_dir, rev_shard_path,
+ shard, max_files_per_dir, DEFAULT_MAX_MEM,
+ cancel_func, cancel_baton, scratch_pool));
+
+ /* if enabled, pack the revprops in an equivalent way */
+ if (revsprops_dir)
+ {
+ revprops_pack_file_dir = svn_dirent_join(revsprops_dir,
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ shard),
+ scratch_pool);
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(scratch_pool, "%" APR_INT64_T_FMT, shard),
+ scratch_pool);
+
+ SVN_ERR(svn_fs_x__pack_revprops_shard(revprops_pack_file_dir,
+ revprops_shard_path,
+ shard, max_files_per_dir,
+ (int)(0.9 * max_pack_size),
+ compression_level,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ }
+
+ /* Update the min-unpacked-rev file to reflect our newly packed shard. */
+ SVN_ERR(svn_fs_x__write_min_unpacked_rev(fs,
+ (svn_revnum_t)((shard + 1) * max_files_per_dir),
+ scratch_pool));
+ ffd->min_unpacked_rev = (svn_revnum_t)((shard + 1) * max_files_per_dir);
+
+ /* Finally, remove the existing shard directories.
+ * For revprops, clean up older obsolete shards as well as they might
+ * have been left over from an interrupted FS upgrade. */
+ SVN_ERR(svn_io_remove_dir2(rev_shard_path, TRUE,
+ cancel_func, cancel_baton, scratch_pool));
+ if (revsprops_dir)
+ {
+ svn_node_kind_t kind = svn_node_dir;
+ apr_int64_t to_cleanup = shard;
+ do
+ {
+ SVN_ERR(svn_fs_x__delete_revprops_shard(revprops_shard_path,
+ to_cleanup,
+ max_files_per_dir,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* If the previous shard exists, clean it up as well.
+ Don't try to clean up shard 0 as it we can't tell quickly
+ whether it actually needs cleaning up. */
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ --to_cleanup),
+ scratch_pool);
+ SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, scratch_pool));
+ }
+ while (kind == svn_node_dir && to_cleanup > 0);
+ }
+
+ /* Notify caller we're starting to pack this shard. */
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_end,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+typedef struct pack_baton_t
+{
+ svn_fs_t *fs;
+ svn_fs_pack_notify_t notify_func;
+ void *notify_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+} pack_baton_t;
+
+
+/* The work-horse for svn_fs_x__pack, called with the FS write lock.
+ This implements the svn_fs_x__with_write_lock() 'body' callback
+ type. BATON is a 'pack_baton_t *'.
+
+ WARNING: if you add a call to this function, please note:
+ The code currently assumes that any piece of code running with
+ the write-lock set can rely on the ffd->min_unpacked_rev and
+ ffd->min_unpacked_revprop caches to be up-to-date (and, by
+ extension, on not having to use a retry when calling
+ svn_fs_x__path_rev_absolute() and friends). If you add a call
+ to this function, consider whether you have to call
+ update_min_unpacked_rev().
+ See this thread: http://thread.gmane.org/1291206765.3782.3309.camel@edith
+ */
+static svn_error_t *
+pack_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ pack_baton_t *pb = baton;
+ svn_fs_x__data_t *ffd = pb->fs->fsap_data;
+ apr_int64_t completed_shards;
+ apr_int64_t i;
+ svn_revnum_t youngest;
+ apr_pool_t *iterpool;
+ const char *rev_data_path;
+ const char *revprops_data_path = NULL;
+
+ /* If we aren't using sharding, we can't do any packing, so quit. */
+ SVN_ERR(svn_fs_x__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_x__youngest_rev(&youngest, pb->fs, scratch_pool));
+ completed_shards = (youngest + 1) / ffd->max_files_per_dir;
+
+ /* See if we've already completed all possible shards thus far. */
+ if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+ return SVN_NO_ERROR;
+
+ rev_data_path = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, scratch_pool);
+ revprops_data_path = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+
+ iterpool = svn_pool_create(scratch_pool);
+ for (i = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+ i < completed_shards;
+ i++)
+ {
+ svn_pool_clear(iterpool);
+
+ if (pb->cancel_func)
+ SVN_ERR(pb->cancel_func(pb->cancel_baton));
+
+ SVN_ERR(pack_shard(rev_data_path, revprops_data_path,
+ pb->fs, i, ffd->max_files_per_dir,
+ ffd->revprop_pack_size,
+ ffd->compress_packed_revprops
+ ? SVN__COMPRESSION_ZLIB_DEFAULT
+ : SVN__COMPRESSION_NONE,
+ pb->notify_func, pb->notify_baton,
+ pb->cancel_func, pb->cancel_baton, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__pack(svn_fs_t *fs,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ pack_baton_t pb = { 0 };
+ pb.fs = fs;
+ pb.notify_func = notify_func;
+ pb.notify_baton = notify_baton;
+ pb.cancel_func = cancel_func;
+ pb.cancel_baton = cancel_baton;
+ return svn_fs_x__with_pack_lock(fs, pack_body, &pb, scratch_pool);
+}
diff --git a/subversion/libsvn_fs_x/pack.h b/subversion/libsvn_fs_x/pack.h
new file mode 100644
index 0000000..5541619
--- /dev/null
+++ b/subversion/libsvn_fs_x/pack.h
@@ -0,0 +1,65 @@
+/* pack.h : interface FSX pack functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__PACK_H
+#define SVN_LIBSVN_FS__PACK_H
+
+#include "fs.h"
+
+/* Possibly pack the repository at PATH. This just take full shards, and
+ combines all the revision files into a single one, with a manifest header.
+ Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
+ Use SCRATCH_POOL for temporary allocations.
+
+ Existing filesystem references need not change. */
+svn_error_t *
+svn_fs_x__pack(svn_fs_t *fs,
+ svn_fs_pack_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * For the packed revision REV in FS, determine the offset within the
+ * revision pack file and return it in REV_OFFSET.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__get_packed_offset(apr_off_t *rev_offset,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool);
+
+/* Return the svn_dir_entry_t* objects of DIRECTORY in an APR array
+ * allocated in RESULT_POOL with entries added in storage (on-disk) order.
+ * FS' format will be used to pick the optimal ordering strategy. Use
+ * SCRATCH_POOL for temporary allocations.
+ */
+apr_array_header_t *
+svn_fs_x__order_dir_entries(svn_fs_t *fs,
+ apr_hash_t *directory,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+#endif
diff --git a/subversion/libsvn_fs_x/recovery.c b/subversion/libsvn_fs_x/recovery.c
new file mode 100644
index 0000000..984b740
--- /dev/null
+++ b/subversion/libsvn_fs_x/recovery.c
@@ -0,0 +1,263 @@
+/* recovery.c --- FSX recovery functionality
+*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "recovery.h"
+
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "private/svn_string_private.h"
+
+#include "low_level.h"
+#include "rep-cache.h"
+#include "revprops.h"
+#include "transaction.h"
+#include "util.h"
+#include "cached_data.h"
+#include "index.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Part of the recovery procedure. Return the largest revision *REV in
+ filesystem FS. Use SCRATCH_POOL for temporary allocation. */
+static svn_error_t *
+recover_get_largest_revision(svn_fs_t *fs,
+ svn_revnum_t *rev,
+ apr_pool_t *scratch_pool)
+{
+ /* Discovering the largest revision in the filesystem would be an
+ expensive operation if we did a readdir() or searched linearly,
+ so we'll do a form of binary search. left is a revision that we
+ know exists, right a revision that we know does not exist. */
+ apr_pool_t *iterpool;
+ svn_revnum_t left, right = 1;
+
+ iterpool = svn_pool_create(scratch_pool);
+ /* Keep doubling right, until we find a revision that doesn't exist. */
+ while (1)
+ {
+ svn_error_t *err;
+ svn_fs_x__revision_file_t *file;
+ svn_pool_clear(iterpool);
+
+ err = svn_fs_x__open_pack_or_rev_file(&file, fs, right, iterpool,
+ iterpool);
+ if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
+ {
+ svn_error_clear(err);
+ break;
+ }
+ else
+ SVN_ERR(err);
+
+ right <<= 1;
+ }
+
+ left = right >> 1;
+
+ /* We know that left exists and right doesn't. Do a normal bsearch to find
+ the last revision. */
+ while (left + 1 < right)
+ {
+ svn_revnum_t probe = left + ((right - left) / 2);
+ svn_error_t *err;
+ svn_fs_x__revision_file_t *file;
+ svn_pool_clear(iterpool);
+
+ err = svn_fs_x__open_pack_or_rev_file(&file, fs, probe, iterpool,
+ iterpool);
+ if (err && err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION)
+ {
+ svn_error_clear(err);
+ right = probe;
+ }
+ else
+ {
+ SVN_ERR(err);
+ left = probe;
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ /* left is now the largest revision that exists. */
+ *rev = left;
+ return SVN_NO_ERROR;
+}
+
+/* Baton used for recover_body below. */
+typedef struct recover_baton_t {
+ svn_fs_t *fs;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+} recover_baton_t;
+
+/* The work-horse for svn_fs_x__recover, called with the FS
+ write lock. This implements the svn_fs_x__with_write_lock()
+ 'body' callback type. BATON is a 'recover_baton_t *'. */
+static svn_error_t *
+recover_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ recover_baton_t *b = baton;
+ svn_fs_t *fs = b->fs;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_revnum_t max_rev;
+ svn_revnum_t youngest_rev;
+ svn_boolean_t revprop_missing = TRUE;
+ svn_boolean_t revprop_accessible = FALSE;
+
+ /* Lose potentially corrupted data in temp files */
+ SVN_ERR(svn_fs_x__reset_revprop_generation_file(fs, scratch_pool));
+
+ /* The admin may have created a plain copy of this repo before attempting
+ to recover it (hotcopy may or may not work with corrupted repos).
+ Bump the instance ID. */
+ SVN_ERR(svn_fs_x__set_uuid(fs, fs->uuid, NULL, scratch_pool));
+
+ /* We need to know the largest revision in the filesystem. */
+ SVN_ERR(recover_get_largest_revision(fs, &max_rev, scratch_pool));
+
+ /* Get the expected youngest revision */
+ SVN_ERR(svn_fs_x__youngest_rev(&youngest_rev, fs, scratch_pool));
+
+ /* Policy note:
+
+ Since the revprops file is written after the revs file, the true
+ maximum available revision is the youngest one for which both are
+ present. That's probably the same as the max_rev we just found,
+ but if it's not, we could, in theory, repeatedly decrement
+ max_rev until we find a revision that has both a revs and
+ revprops file, then write db/current with that.
+
+ But we choose not to. If a repository is so corrupt that it's
+ missing at least one revprops file, we shouldn't assume that the
+ youngest revision for which both the revs and revprops files are
+ present is healthy. In other words, we're willing to recover
+ from a missing or out-of-date db/current file, because db/current
+ is truly redundant -- it's basically a cache so we don't have to
+ find max_rev each time, albeit a cache with unusual semantics,
+ since it also officially defines when a revision goes live. But
+ if we're missing more than the cache, it's time to back out and
+ let the admin reconstruct things by hand: correctness at that
+ point may depend on external things like checking a commit email
+ list, looking in particular working copies, etc.
+
+ This policy matches well with a typical naive backup scenario.
+ Say you're rsyncing your FSX repository nightly to the same
+ location. Once revs and revprops are written, you've got the
+ maximum rev; if the backup should bomb before db/current is
+ written, then db/current could stay arbitrarily out-of-date, but
+ we can still recover. It's a small window, but we might as well
+ do what we can. */
+
+ /* Even if db/current were missing, it would be created with 0 by
+ get_youngest(), so this conditional remains valid. */
+ if (youngest_rev > max_rev)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Expected current rev to be <= %ld "
+ "but found %ld"), max_rev, youngest_rev);
+
+ /* Before setting current, verify that there is a revprops file
+ for the youngest revision. (Issue #2992) */
+ if (svn_fs_x__is_packed_revprop(fs, max_rev))
+ {
+ revprop_accessible
+ = svn_fs_x__packed_revprop_available(&revprop_missing, fs, max_rev,
+ scratch_pool);
+ }
+ else
+ {
+ svn_node_kind_t youngest_revprops_kind;
+ SVN_ERR(svn_io_check_path(svn_fs_x__path_revprops(fs, max_rev,
+ scratch_pool),
+ &youngest_revprops_kind, scratch_pool));
+
+ if (youngest_revprops_kind == svn_node_file)
+ {
+ revprop_missing = FALSE;
+ revprop_accessible = TRUE;
+ }
+ else if (youngest_revprops_kind != svn_node_none)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a non-file where its "
+ "revprops file should be"),
+ max_rev);
+ }
+ }
+
+ if (!revprop_accessible)
+ {
+ if (revprop_missing)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a revs file but no "
+ "revprops file"),
+ max_rev);
+ }
+ else
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revision %ld has a revs file but the "
+ "revprops file is inaccessible"),
+ max_rev);
+ }
+ }
+
+ /* Prune younger-than-(newfound-youngest) revisions from the rep
+ cache if sharing is enabled taking care not to create the cache
+ if it does not exist. */
+ if (ffd->rep_sharing_allowed)
+ {
+ svn_boolean_t rep_cache_exists;
+
+ SVN_ERR(svn_fs_x__exists_rep_cache(&rep_cache_exists, fs,
+ scratch_pool));
+ if (rep_cache_exists)
+ SVN_ERR(svn_fs_x__del_rep_reference(fs, max_rev, scratch_pool));
+ }
+
+ /* Now store the discovered youngest revision, and the next IDs if
+ relevant, in a new 'current' file. */
+ return svn_fs_x__write_current(fs, max_rev, scratch_pool);
+}
+
+/* This implements the fs_library_vtable_t.recover() API. */
+svn_error_t *
+svn_fs_x__recover(svn_fs_t *fs,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ recover_baton_t b;
+
+ /* We have no way to take out an exclusive lock in FSX, so we're
+ restricted as to the types of recovery we can do. Luckily,
+ we just want to recreate the 'current' file, and we can do that just
+ by blocking other writers. */
+ b.fs = fs;
+ b.cancel_func = cancel_func;
+ b.cancel_baton = cancel_baton;
+ return svn_fs_x__with_all_locks(fs, recover_body, &b, scratch_pool);
+}
diff --git a/subversion/libsvn_fs_x/recovery.h b/subversion/libsvn_fs_x/recovery.h
new file mode 100644
index 0000000..4fe0a07
--- /dev/null
+++ b/subversion/libsvn_fs_x/recovery.h
@@ -0,0 +1,37 @@
+/* recovery.h : interface to the FSX recovery functionality
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__RECOVERY_H
+#define SVN_LIBSVN_FS__RECOVERY_H
+
+#include "fs.h"
+
+/* Recover the fsx associated with filesystem FS.
+ Use optional CANCEL_FUNC/CANCEL_BATON for cancellation support.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__recover(svn_fs_t *fs,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/rep-cache-db.h b/subversion/libsvn_fs_x/rep-cache-db.h
new file mode 100644
index 0000000..918955f
--- /dev/null
+++ b/subversion/libsvn_fs_x/rep-cache-db.h
@@ -0,0 +1,92 @@
+/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_fs_x/token-map.h.
+ * Do not edit this file -- edit the source and rerun gen-make.py */
+
+#define STMT_CREATE_SCHEMA 0
+#define STMT_0_INFO {"STMT_CREATE_SCHEMA", NULL}
+#define STMT_0 \
+ "PRAGMA PAGE_SIZE = 4096; " \
+ "CREATE TABLE rep_cache ( " \
+ " hash TEXT NOT NULL PRIMARY KEY, " \
+ " revision INTEGER NOT NULL, " \
+ " offset INTEGER NOT NULL, " \
+ " size INTEGER NOT NULL, " \
+ " expanded_size INTEGER NOT NULL " \
+ " ); " \
+ "PRAGMA USER_VERSION = 1; " \
+ ""
+
+#define STMT_GET_REP 1
+#define STMT_1_INFO {"STMT_GET_REP", NULL}
+#define STMT_1 \
+ "SELECT revision, offset, size, expanded_size " \
+ "FROM rep_cache " \
+ "WHERE hash = ?1 " \
+ ""
+
+#define STMT_SET_REP 2
+#define STMT_2_INFO {"STMT_SET_REP", NULL}
+#define STMT_2 \
+ "INSERT OR FAIL INTO rep_cache (hash, revision, offset, size, expanded_size) " \
+ "VALUES (?1, ?2, ?3, ?4, ?5) " \
+ ""
+
+#define STMT_GET_REPS_FOR_RANGE 3
+#define STMT_3_INFO {"STMT_GET_REPS_FOR_RANGE", NULL}
+#define STMT_3 \
+ "SELECT hash, revision, offset, size, expanded_size " \
+ "FROM rep_cache " \
+ "WHERE revision >= ?1 AND revision <= ?2 " \
+ ""
+
+#define STMT_GET_MAX_REV 4
+#define STMT_4_INFO {"STMT_GET_MAX_REV", NULL}
+#define STMT_4 \
+ "SELECT MAX(revision) " \
+ "FROM rep_cache " \
+ ""
+
+#define STMT_DEL_REPS_YOUNGER_THAN_REV 5
+#define STMT_5_INFO {"STMT_DEL_REPS_YOUNGER_THAN_REV", NULL}
+#define STMT_5 \
+ "DELETE FROM rep_cache " \
+ "WHERE revision > ?1 " \
+ ""
+
+#define STMT_LOCK_REP 6
+#define STMT_6_INFO {"STMT_LOCK_REP", NULL}
+#define STMT_6 \
+ "BEGIN TRANSACTION; " \
+ "INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0) " \
+ ""
+
+#define STMT_UNLOCK_REP 7
+#define STMT_7_INFO {"STMT_UNLOCK_REP", NULL}
+#define STMT_7 \
+ "ROLLBACK TRANSACTION; " \
+ ""
+
+#define REP_CACHE_DB_SQL_DECLARE_STATEMENTS(varname) \
+ static const char * const varname[] = { \
+ STMT_0, \
+ STMT_1, \
+ STMT_2, \
+ STMT_3, \
+ STMT_4, \
+ STMT_5, \
+ STMT_6, \
+ STMT_7, \
+ NULL \
+ }
+
+#define REP_CACHE_DB_SQL_DECLARE_STATEMENT_INFO(varname) \
+ static const char * const varname[][2] = { \
+ STMT_0_INFO, \
+ STMT_1_INFO, \
+ STMT_2_INFO, \
+ STMT_3_INFO, \
+ STMT_4_INFO, \
+ STMT_5_INFO, \
+ STMT_6_INFO, \
+ STMT_7_INFO, \
+ {NULL, NULL} \
+ }
diff --git a/subversion/libsvn_fs_x/rep-cache-db.sql b/subversion/libsvn_fs_x/rep-cache-db.sql
new file mode 100644
index 0000000..7ad402a
--- /dev/null
+++ b/subversion/libsvn_fs_x/rep-cache-db.sql
@@ -0,0 +1,70 @@
+/* rep-cache-db.sql -- schema for use in rep-caching
+ * This is intended for use with SQLite 3
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+-- STMT_CREATE_SCHEMA
+PRAGMA PAGE_SIZE = 4096;
+
+/* A table mapping representation hashes to locations in a rev file. */
+CREATE TABLE rep_cache (
+ hash TEXT NOT NULL PRIMARY KEY,
+ revision INTEGER NOT NULL,
+ offset INTEGER NOT NULL,
+ size INTEGER NOT NULL,
+ expanded_size INTEGER NOT NULL
+ );
+
+PRAGMA USER_VERSION = 1;
+
+
+-- STMT_GET_REP
+SELECT revision, offset, size, expanded_size
+FROM rep_cache
+WHERE hash = ?1
+
+-- STMT_SET_REP
+INSERT OR FAIL INTO rep_cache (hash, revision, offset, size, expanded_size)
+VALUES (?1, ?2, ?3, ?4, ?5)
+
+-- STMT_GET_REPS_FOR_RANGE
+SELECT hash, revision, offset, size, expanded_size
+FROM rep_cache
+WHERE revision >= ?1 AND revision <= ?2
+
+-- STMT_GET_MAX_REV
+SELECT MAX(revision)
+FROM rep_cache
+
+-- STMT_DEL_REPS_YOUNGER_THAN_REV
+DELETE FROM rep_cache
+WHERE revision > ?1
+
+/* An INSERT takes an SQLite reserved lock that prevents other writes
+ but doesn't block reads. The incomplete transaction means that no
+ permanent change is made to the database and the transaction is
+ removed when the database is closed. */
+-- STMT_LOCK_REP
+BEGIN TRANSACTION;
+INSERT INTO rep_cache VALUES ('dummy', 0, 0, 0, 0)
+
+-- STMT_UNLOCK_REP
+ROLLBACK TRANSACTION;
diff --git a/subversion/libsvn_fs_x/rep-cache.c b/subversion/libsvn_fs_x/rep-cache.c
new file mode 100644
index 0000000..85e62a4
--- /dev/null
+++ b/subversion/libsvn_fs_x/rep-cache.c
@@ -0,0 +1,416 @@
+/* rep-sharing.c --- the rep-sharing cache for fsx
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+
+#include "svn_private_config.h"
+
+#include "fs_x.h"
+#include "fs.h"
+#include "rep-cache.h"
+#include "util.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_path.h"
+
+#include "private/svn_sqlite.h"
+
+#include "rep-cache-db.h"
+
+/* A few magic values */
+#define REP_CACHE_SCHEMA_FORMAT 1
+
+REP_CACHE_DB_SQL_DECLARE_STATEMENTS(statements);
+
+
+
+/** Helper functions. **/
+static APR_INLINE const char *
+path_rep_cache_db(const char *fs_path,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs_path, REP_CACHE_DB_NAME, result_pool);
+}
+
+
+/** Library-private API's. **/
+
+/* Body of svn_fs_x__open_rep_cache().
+ Implements svn_atomic__init_once().init_func.
+ */
+static svn_error_t *
+open_rep_cache(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_t *fs = baton;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_sqlite__db_t *sdb;
+ const char *db_path;
+ int version;
+
+ /* Open (or create) the sqlite database. It will be automatically
+ closed when fs->pool is destroyed. */
+ db_path = path_rep_cache_db(fs->path, scratch_pool);
+#ifndef WIN32
+ {
+ /* We want to extend the permissions that apply to the repository
+ as a whole when creating a new rep cache and not simply default
+ to umask. */
+ svn_boolean_t exists;
+
+ SVN_ERR(svn_fs_x__exists_rep_cache(&exists, fs, scratch_pool));
+ if (!exists)
+ {
+ const char *current = svn_fs_x__path_current(fs, scratch_pool);
+ svn_error_t *err = svn_io_file_create_empty(db_path, scratch_pool);
+
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ /* A real error. */
+ return svn_error_trace(err);
+ else if (err)
+ /* Some other thread/process created the file. */
+ svn_error_clear(err);
+ else
+ /* We created the file. */
+ SVN_ERR(svn_io_copy_perms(current, db_path, scratch_pool));
+ }
+ }
+#endif
+ SVN_ERR(svn_sqlite__open(&sdb, db_path,
+ svn_sqlite__mode_rwcreate, statements,
+ 0, NULL, 0,
+ fs->pool, scratch_pool));
+
+ SVN_ERR(svn_sqlite__read_schema_version(&version, sdb, scratch_pool));
+ if (version < REP_CACHE_SCHEMA_FORMAT)
+ {
+ /* Must be 0 -- an uninitialized (no schema) database. Create
+ the schema. Results in schema version of 1. */
+ SVN_ERR(svn_sqlite__exec_statements(sdb, STMT_CREATE_SCHEMA));
+ }
+
+ /* This is used as a flag that the database is available so don't
+ set it earlier. */
+ ffd->rep_cache_db = sdb;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__open_rep_cache(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_error_t *err = svn_atomic__init_once(&ffd->rep_cache_db_opened,
+ open_rep_cache, fs, scratch_pool);
+ return svn_error_quick_wrap(err, _("Couldn't open rep-cache database"));
+}
+
+svn_error_t *
+svn_fs_x__exists_rep_cache(svn_boolean_t *exists,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind;
+
+ SVN_ERR(svn_io_check_path(path_rep_cache_db(fs->path, scratch_pool),
+ &kind, scratch_pool));
+
+ *exists = (kind != svn_node_none);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__walk_rep_reference(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_error_t *(*walker)(svn_fs_x__representation_t *,
+ void *,
+ svn_fs_t *,
+ apr_pool_t *),
+ void *walker_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ int iterations = 0;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, scratch_pool));
+
+ /* Check global invariants. */
+ if (start == 0)
+ {
+ svn_revnum_t max;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
+ STMT_GET_MAX_REV));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ max = svn_sqlite__column_revnum(stmt, 0);
+ SVN_ERR(svn_sqlite__reset(stmt));
+ if (SVN_IS_VALID_REVNUM(max)) /* The rep-cache could be empty. */
+ SVN_ERR(svn_fs_x__ensure_revision_exists(max, fs, iterpool));
+ }
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
+ STMT_GET_REPS_FOR_RANGE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "rr",
+ start, end));
+
+ /* Walk the cache entries. */
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
+ {
+ svn_fs_x__representation_t *rep;
+ const char *sha1_digest;
+ svn_error_t *err;
+ svn_checksum_t *checksum;
+
+ /* Clear ITERPOOL occasionally. */
+ if (iterations++ % 16 == 0)
+ svn_pool_clear(iterpool);
+
+ /* Check for cancellation. */
+ if (cancel_func)
+ {
+ err = cancel_func(cancel_baton);
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+ }
+
+ /* Construct a svn_fs_x__representation_t. */
+ rep = apr_pcalloc(iterpool, sizeof(*rep));
+ sha1_digest = svn_sqlite__column_text(stmt, 0, iterpool);
+ err = svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
+ sha1_digest, iterpool);
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ rep->has_sha1 = TRUE;
+ memcpy(rep->sha1_digest, checksum->digest, sizeof(rep->sha1_digest));
+ rep->id.change_set = svn_sqlite__column_revnum(stmt, 1);
+ rep->id.number = svn_sqlite__column_int64(stmt, 2);
+ rep->size = svn_sqlite__column_int64(stmt, 3);
+ rep->expanded_size = svn_sqlite__column_int64(stmt, 4);
+
+ /* Walk. */
+ err = walker(rep, walker_baton, fs, iterpool);
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+
+ SVN_ERR(svn_sqlite__reset(stmt));
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This function's caller ignores most errors it returns.
+ If you extend this function, check the callsite to see if you have
+ to make it not-ignore additional error codes. */
+svn_error_t *
+svn_fs_x__get_rep_reference(svn_fs_x__representation_t **rep,
+ svn_fs_t *fs,
+ svn_checksum_t *checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+
+ SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, scratch_pool));
+
+ /* We only allow SHA1 checksums in this table. */
+ if (checksum->kind != svn_checksum_sha1)
+ return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
+ _("Only SHA1 checksums can be used as keys in the "
+ "rep_cache table.\n"));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db, STMT_GET_REP));
+ SVN_ERR(svn_sqlite__bindf(stmt, "s",
+ svn_checksum_to_cstring(checksum, scratch_pool)));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ {
+ *rep = apr_pcalloc(result_pool, sizeof(**rep));
+ memcpy((*rep)->sha1_digest, checksum->digest,
+ sizeof((*rep)->sha1_digest));
+ (*rep)->has_sha1 = TRUE;
+ (*rep)->id.change_set = svn_sqlite__column_revnum(stmt, 0);
+ (*rep)->id.number = svn_sqlite__column_int64(stmt, 1);
+ (*rep)->size = svn_sqlite__column_int64(stmt, 2);
+ (*rep)->expanded_size = svn_sqlite__column_int64(stmt, 3);
+ }
+ else
+ *rep = NULL;
+
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (*rep)
+ {
+ /* Check that REP refers to a revision that exists in FS. */
+ svn_revnum_t revision = svn_fs_x__get_revnum((*rep)->id.change_set);
+ svn_error_t *err = svn_fs_x__ensure_revision_exists(revision, fs,
+ scratch_pool);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ "Checksum '%s' in rep-cache is beyond HEAD",
+ svn_checksum_to_cstring_display(checksum, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__set_rep_reference(svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_sqlite__stmt_t *stmt;
+ svn_error_t *err;
+ svn_checksum_t checksum;
+ checksum.kind = svn_checksum_sha1;
+ checksum.digest = rep->sha1_digest;
+
+ SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, scratch_pool));
+
+ /* We only allow SHA1 checksums in this table. */
+ if (! rep->has_sha1)
+ return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
+ _("Only SHA1 checksums can be used as keys in the "
+ "rep_cache table.\n"));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db, STMT_SET_REP));
+ SVN_ERR(svn_sqlite__bindf(stmt, "siiii",
+ svn_checksum_to_cstring(&checksum, scratch_pool),
+ (apr_int64_t) rep->id.change_set,
+ (apr_int64_t) rep->id.number,
+ (apr_int64_t) rep->size,
+ (apr_int64_t) rep->expanded_size));
+
+ err = svn_sqlite__insert(NULL, stmt);
+ if (err)
+ {
+ svn_fs_x__representation_t *old_rep;
+
+ if (err->apr_err != SVN_ERR_SQLITE_CONSTRAINT)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+
+ /* Constraint failed so the mapping for SHA1_CHECKSUM->REP
+ should exist. If so that's cool -- just do nothing. If not,
+ that's a red flag! */
+ SVN_ERR(svn_fs_x__get_rep_reference(&old_rep, fs, &checksum,
+ scratch_pool, scratch_pool));
+
+ if (!old_rep)
+ {
+ /* Something really odd at this point, we failed to insert the
+ checksum AND failed to read an existing checksum. Do we need
+ to flag this? */
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__del_rep_reference(svn_fs_t *fs,
+ svn_revnum_t youngest,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_sqlite__stmt_t *stmt;
+
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, scratch_pool));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
+ STMT_DEL_REPS_YOUNGER_THAN_REV));
+ SVN_ERR(svn_sqlite__bindf(stmt, "r", youngest));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+
+ return SVN_NO_ERROR;
+}
+
+/* Start a transaction to take an SQLite reserved lock that prevents
+ other writes.
+
+ See unlock_rep_cache(). */
+static svn_error_t *
+lock_rep_cache(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, pool));
+
+ SVN_ERR(svn_sqlite__exec_statements(ffd->rep_cache_db, STMT_LOCK_REP));
+
+ return SVN_NO_ERROR;
+}
+
+/* End the transaction started by lock_rep_cache(). */
+static svn_error_t *
+unlock_rep_cache(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ SVN_ERR_ASSERT(ffd->rep_cache_db); /* was opened by lock_rep_cache() */
+
+ SVN_ERR(svn_sqlite__exec_statements(ffd->rep_cache_db, STMT_UNLOCK_REP));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__with_rep_cache_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *,
+ apr_pool_t *),
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_error_t *err;
+
+ SVN_ERR(lock_rep_cache(fs, pool));
+ err = body(baton, pool);
+ return svn_error_compose_create(err, unlock_rep_cache(fs, pool));
+}
diff --git a/subversion/libsvn_fs_x/rep-cache.h b/subversion/libsvn_fs_x/rep-cache.h
new file mode 100644
index 0000000..1fe26da
--- /dev/null
+++ b/subversion/libsvn_fs_x/rep-cache.h
@@ -0,0 +1,105 @@
+/* rep-cache.h : interface to rep cache db functions
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_X_REP_CACHE_H
+#define SVN_LIBSVN_FS_X_REP_CACHE_H
+
+#include "svn_error.h"
+
+#include "fs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#define REP_CACHE_DB_NAME "rep-cache.db"
+
+/* Open and create, if needed, the rep cache database associated with FS.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__open_rep_cache(svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Set *EXISTS to TRUE iff the rep-cache DB file exists. */
+svn_error_t *
+svn_fs_x__exists_rep_cache(svn_boolean_t *exists,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Iterate all representations currently in FS's cache. */
+svn_error_t *
+svn_fs_x__walk_rep_reference(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_error_t *(*walker)(svn_fs_x__representation_t *rep,
+ void *walker_baton,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool),
+ void *walker_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* Return the representation REP in FS which has fulltext CHECKSUM.
+ REP is allocated in RESULT_POOL. If the rep cache database has not been
+ opened, just set *REP to NULL. Returns SVN_ERR_FS_CORRUPT if a reference
+ beyond HEAD is detected. Uses SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__get_rep_reference(svn_fs_x__representation_t **rep,
+ svn_fs_t *fs,
+ svn_checksum_t *checksum,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set the representation REP in FS, using REP->CHECKSUM.
+ Use SCRATCH_POOL for temporary allocations. Returns SVN_ERR_FS_CORRUPT
+ if an existing reference beyond HEAD is detected.
+
+ If the rep cache database has not been opened, this may be a no op. */
+svn_error_t *
+svn_fs_x__set_rep_reference(svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ apr_pool_t *scratch_pool);
+
+/* Delete from the cache all reps corresponding to revisions younger
+ than YOUNGEST. */
+svn_error_t *
+svn_fs_x__del_rep_reference(svn_fs_t *fs,
+ svn_revnum_t youngest,
+ apr_pool_t *scratch_pool);
+
+
+/* Start a transaction to take an SQLite reserved lock that prevents
+ other writes, call BODY, end the transaction, and return what BODY returned.
+ */
+svn_error_t *
+svn_fs_x__with_rep_cache_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_X_REP_CACHE_H */
diff --git a/subversion/libsvn_fs_x/reps.c b/subversion/libsvn_fs_x/reps.c
new file mode 100644
index 0000000..85a5269
--- /dev/null
+++ b/subversion/libsvn_fs_x/reps.c
@@ -0,0 +1,948 @@
+/* reps.c --- FSX representation container
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "reps.h"
+
+#include "svn_sorts.h"
+#include "private/svn_string_private.h"
+#include "private/svn_packed_data.h"
+#include "private/svn_temp_serializer.h"
+
+#include "svn_private_config.h"
+
+#include "cached_data.h"
+
+/* Length of the text chunks we hash and match. The algorithm will find
+ * most matches with a length of 2 * MATCH_BLOCKSIZE and only specific
+ * ones that are shorter than MATCH_BLOCKSIZE.
+ *
+ * This should be a power of two and must be a multiple of 8.
+ * Good choices are 32, 64 and 128.
+ */
+#define MATCH_BLOCKSIZE 64
+
+/* Limit the total text body within a container to 16MB. Larger values
+ * of up to 2GB are possible but become increasingly impractical as the
+ * container has to be loaded in its entirety before any of it can be read.
+ */
+#define MAX_TEXT_BODY 0x1000000
+
+/* Limit the size of the instructions stream. This should not exceed the
+ * text body size limit. */
+#define MAX_INSTRUCTIONS (MAX_TEXT_BODY / 8)
+
+/* value of unused hash buckets */
+#define NO_OFFSET ((apr_uint32_t)(-1))
+
+/* Byte strings are described by a series of copy instructions that each
+ * do one of the following
+ *
+ * - copy a given number of bytes from the text corpus starting at a
+ * given offset
+ * - reference other instruction and specify how many of instructions of
+ * that sequence shall be executed (i.e. a sub-sequence)
+ * - copy a number of bytes from the base representation buffer starting
+ * at a given offset
+ */
+
+/* The contents of a fulltext / representation is defined by its first
+ * instruction and the number of instructions to execute.
+ */
+typedef struct rep_t
+{
+ apr_uint32_t first_instruction;
+ apr_uint32_t instruction_count;
+} rep_t;
+
+/* A single instruction. The instruction type is being encoded in OFFSET.
+ */
+typedef struct instruction_t
+{
+ /* Instruction type and offset.
+ * - offset < 0
+ * reference to instruction sub-sequence starting with
+ * container->instructions[-offset].
+ * - 0 <= offset < container->base_text_len
+ * reference to the base text corpus;
+ * start copy at offset
+ * - offset >= container->base_text_len
+ * reference to the text corpus;
+ * start copy at offset-container->base_text_len
+ */
+ apr_int32_t offset;
+
+ /* Number of bytes to copy / instructions to execute
+ */
+ apr_uint32_t count;
+} instruction_t;
+
+/* Describe a base fulltext.
+ */
+typedef struct base_t
+{
+ /* Revision */
+ svn_revnum_t revision;
+
+ /* Item within that revision */
+ apr_uint64_t item_index;
+
+ /* Priority with which to use this base over others */
+ int priority;
+
+ /* Index into builder->representations that identifies the copy
+ * instructions for this base. */
+ apr_uint32_t rep;
+} base_t;
+
+/* Yet another hash data structure. This one tries to be more cache
+ * friendly by putting the first byte of each hashed sequence in a
+ * common array. This array will often fit into L1 or L2 at least and
+ * give a 99% accurate test for a match without giving false negatives.
+ */
+typedef struct hash_t
+{
+ /* for used entries i, prefixes[i] == text[offsets[i]]; 0 otherwise.
+ * This allows for a quick check without resolving the double
+ * indirection. */
+ char *prefixes;
+
+ /* for used entries i, offsets[i] is start offset in the text corpus;
+ * NO_OFFSET otherwise.
+ */
+ apr_uint32_t *offsets;
+
+ /* to be used later for optimizations. */
+ apr_uint32_t *last_matches;
+
+ /* number of buckets in this hash, i.e. elements in each array above.
+ * Must be 1 << (8 * sizeof(hash_key_t) - shift) */
+ apr_size_t size;
+
+ /* number of buckets actually in use. Must be <= size. */
+ apr_size_t used;
+
+ /* number of bits to shift right to map a hash_key_t to a bucket index */
+ apr_size_t shift;
+
+ /* pool to use when growing the hash */
+ apr_pool_t *pool;
+} hash_t;
+
+/* Hash key type. 32 bits for pseudo-Adler32 hash sums.
+ */
+typedef apr_uint32_t hash_key_t;
+
+/* Constructor data structure.
+ */
+struct svn_fs_x__reps_builder_t
+{
+ /* file system to read base representations from */
+ svn_fs_t *fs;
+
+ /* text corpus */
+ svn_stringbuf_t *text;
+
+ /* text block hash */
+ hash_t hash;
+
+ /* array of base_t objects describing all bases defined so far */
+ apr_array_header_t *bases;
+
+ /* array of rep_t objects describing all fulltexts (including bases)
+ * added so far */
+ apr_array_header_t *reps;
+
+ /* array of instruction_t objects describing all instructions */
+ apr_array_header_t *instructions;
+
+ /* number of bytes in the text corpus that belongs to bases */
+ apr_size_t base_text_len;
+};
+
+/* R/o container.
+ */
+struct svn_fs_x__reps_t
+{
+ /* text corpus */
+ const char *text;
+
+ /* length of the text corpus in bytes */
+ apr_size_t text_len;
+
+ /* bases used */
+ const base_t *bases;
+
+ /* number of bases used */
+ apr_size_t base_count;
+
+ /* fulltext i can be reconstructed by executing instructions
+ * first_instructions[i] .. first_instructions[i+1]-1
+ * (this array has one extra element at the end)
+ */
+ const apr_uint32_t *first_instructions;
+
+ /* number of fulltexts (no bases) */
+ apr_size_t rep_count;
+
+ /* instructions */
+ const instruction_t *instructions;
+
+ /* total number of instructions */
+ apr_size_t instruction_count;
+
+ /* offsets > 0 but smaller that this are considered base references */
+ apr_size_t base_text_len;
+};
+
+/* describe a section in the extractor's result string that is not filled
+ * yet (but already exists).
+ */
+typedef struct missing_t
+{
+ /* start offset within the result string */
+ apr_uint32_t start;
+
+ /* number of bytes to write */
+ apr_uint32_t count;
+
+ /* index into extractor->bases selecting the base representation to
+ * copy from */
+ apr_uint32_t base;
+
+ /* copy source offset within that base representation */
+ apr_uint32_t offset;
+} missing_t;
+
+/* Fulltext extractor data structure.
+ */
+struct svn_fs_x__rep_extractor_t
+{
+ /* filesystem to read the bases from */
+ svn_fs_t *fs;
+
+ /* fulltext being constructed */
+ svn_stringbuf_t *result;
+
+ /* bases (base_t) yet to process (not used ATM) */
+ apr_array_header_t *bases;
+
+ /* missing sections (missing_t) in result->data that need to be filled,
+ * yet */
+ apr_array_header_t *missing;
+
+ /* pool to use for allocating the above arrays */
+ apr_pool_t *pool;
+};
+
+/* Given the ADLER32 checksum for a certain range of MATCH_BLOCKSIZE
+ * bytes, return the checksum for the range excluding the first byte
+ * C_OUT and appending C_IN.
+ */
+static hash_key_t
+hash_key_replace(hash_key_t adler32, const char c_out, const char c_in)
+{
+ adler32 -= (MATCH_BLOCKSIZE * 0x10000u * ((unsigned char) c_out));
+
+ adler32 -= (unsigned char)c_out;
+ adler32 += (unsigned char)c_in;
+
+ return adler32 + adler32 * 0x10000;
+}
+
+/* Calculate an pseudo-adler32 checksum for MATCH_BLOCKSIZE bytes starting
+ at DATA. Return the checksum value. */
+static hash_key_t
+hash_key(const char *data)
+{
+ const unsigned char *input = (const unsigned char *)data;
+ const unsigned char *last = input + MATCH_BLOCKSIZE;
+
+ hash_key_t s1 = 0;
+ hash_key_t s2 = 0;
+
+ for (; input < last; input += 8)
+ {
+ s1 += input[0]; s2 += s1;
+ s1 += input[1]; s2 += s1;
+ s1 += input[2]; s2 += s1;
+ s1 += input[3]; s2 += s1;
+ s1 += input[4]; s2 += s1;
+ s1 += input[5]; s2 += s1;
+ s1 += input[6]; s2 += s1;
+ s1 += input[7]; s2 += s1;
+ }
+
+ return s2 * 0x10000 + s1;
+}
+
+/* Map the ADLER32 key to a bucket index in HASH and return that index.
+ */
+static apr_size_t
+hash_to_index(hash_t *hash, hash_key_t adler32)
+{
+ return (adler32 * 0xd1f3da69) >> hash->shift;
+}
+
+/* Allocate and initialized SIZE buckets in RESULT_POOL.
+ * Assign them to HASH.
+ */
+static void
+allocate_hash_members(hash_t *hash,
+ apr_size_t size,
+ apr_pool_t *result_pool)
+{
+ apr_size_t i;
+
+ hash->pool = result_pool;
+ hash->size = size;
+
+ hash->prefixes = apr_pcalloc(result_pool, size);
+ hash->last_matches = apr_pcalloc(result_pool,
+ sizeof(*hash->last_matches) * size);
+ hash->offsets = apr_palloc(result_pool, sizeof(*hash->offsets) * size);
+
+ for (i = 0; i < size; ++i)
+ hash->offsets[i] = NO_OFFSET;
+}
+
+/* Initialize the HASH data structure with 2**TWOPOWER buckets allocated
+ * in RESULT_POOL.
+ */
+static void
+init_hash(hash_t *hash,
+ apr_size_t twoPower,
+ apr_pool_t *result_pool)
+{
+ hash->used = 0;
+ hash->shift = sizeof(hash_key_t) * 8 - twoPower;
+
+ allocate_hash_members(hash, 1 << twoPower, result_pool);
+}
+
+/* Make HASH have at least MIN_SIZE buckets but at least double the number
+ * of buckets in HASH by rehashing it based TEXT.
+ */
+static void
+grow_hash(hash_t *hash,
+ svn_stringbuf_t *text,
+ apr_size_t min_size)
+{
+ hash_t copy;
+ apr_size_t i;
+
+ /* determine the new hash size */
+ apr_size_t new_size = hash->size * 2;
+ apr_size_t new_shift = hash->shift - 1;
+ while (new_size < min_size)
+ {
+ new_size *= 2;
+ --new_shift;
+ }
+
+ /* allocate new hash */
+ allocate_hash_members(&copy, new_size, hash->pool);
+ copy.used = 0;
+ copy.shift = new_shift;
+
+ /* copy / translate data */
+ for (i = 0; i < hash->size; ++i)
+ {
+ apr_uint32_t offset = hash->offsets[i];
+ if (offset != NO_OFFSET)
+ {
+ hash_key_t key = hash_key(text->data + offset);
+ size_t idx = hash_to_index(&copy, key);
+
+ if (copy.offsets[idx] == NO_OFFSET)
+ copy.used++;
+
+ copy.prefixes[idx] = hash->prefixes[i];
+ copy.offsets[idx] = offset;
+ copy.last_matches[idx] = hash->last_matches[i];
+ }
+ }
+
+ *hash = copy;
+}
+
+svn_fs_x__reps_builder_t *
+svn_fs_x__reps_builder_create(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__reps_builder_t *result = apr_pcalloc(result_pool,
+ sizeof(*result));
+
+ result->fs = fs;
+ result->text = svn_stringbuf_create_empty(result_pool);
+ init_hash(&result->hash, 4, result_pool);
+
+ result->bases = apr_array_make(result_pool, 0, sizeof(base_t));
+ result->reps = apr_array_make(result_pool, 0, sizeof(rep_t));
+ result->instructions = apr_array_make(result_pool, 0,
+ sizeof(instruction_t));
+
+ return result;
+}
+
+svn_error_t *
+svn_fs_x__reps_add_base(svn_fs_x__reps_builder_t *builder,
+ svn_fs_x__representation_t *rep,
+ int priority,
+ apr_pool_t *scratch_pool)
+{
+ base_t base;
+ apr_size_t text_start_offset = builder->text->len;
+
+ svn_stream_t *stream;
+ svn_string_t *contents;
+ apr_size_t idx;
+ SVN_ERR(svn_fs_x__get_contents(&stream, builder->fs, rep, FALSE,
+ scratch_pool));
+ SVN_ERR(svn_string_from_stream(&contents, stream, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__reps_add(&idx, builder, contents));
+
+ base.revision = svn_fs_x__get_revnum(rep->id.change_set);
+ base.item_index = rep->id.number;
+ base.priority = priority;
+ base.rep = (apr_uint32_t)idx;
+
+ APR_ARRAY_PUSH(builder->bases, base_t) = base;
+ builder->base_text_len += builder->text->len - text_start_offset;
+
+ return SVN_NO_ERROR;
+}
+
+/* Add LEN bytes from DATA to BUILDER's text corpus. Also, add a copy
+ * operation for that text fragment.
+ */
+static void
+add_new_text(svn_fs_x__reps_builder_t *builder,
+ const char *data,
+ apr_size_t len)
+{
+ instruction_t instruction;
+ apr_size_t offset;
+ apr_size_t buckets_required;
+
+ if (len == 0)
+ return;
+
+ /* new instruction */
+ instruction.offset = (apr_int32_t)builder->text->len;
+ instruction.count = (apr_uint32_t)len;
+ APR_ARRAY_PUSH(builder->instructions, instruction_t) = instruction;
+
+ /* add to text corpus */
+ svn_stringbuf_appendbytes(builder->text, data, len);
+
+ /* expand the hash upfront to minimize the chances of collisions */
+ buckets_required = builder->hash.used + len / MATCH_BLOCKSIZE;
+ if (buckets_required * 3 >= builder->hash.size * 2)
+ grow_hash(&builder->hash, builder->text, 2 * buckets_required);
+
+ /* add hash entries for the new sequence */
+ for (offset = instruction.offset;
+ offset + MATCH_BLOCKSIZE <= builder->text->len;
+ offset += MATCH_BLOCKSIZE)
+ {
+ hash_key_t key = hash_key(builder->text->data + offset);
+ size_t idx = hash_to_index(&builder->hash, key);
+
+ /* Don't replace hash entries that stem from the current text.
+ * This makes early matches more likely. */
+ if (builder->hash.offsets[idx] == NO_OFFSET)
+ ++builder->hash.used;
+ else if (builder->hash.offsets[idx] >= instruction.offset)
+ continue;
+
+ builder->hash.offsets[idx] = (apr_uint32_t)offset;
+ builder->hash.prefixes[idx] = builder->text->data[offset];
+ }
+}
+
+svn_error_t *
+svn_fs_x__reps_add(apr_size_t *rep_idx,
+ svn_fs_x__reps_builder_t *builder,
+ const svn_string_t *contents)
+{
+ rep_t rep;
+ const char *current = contents->data;
+ const char *processed = current;
+ const char *end = current + contents->len;
+ const char *last_to_test = end - MATCH_BLOCKSIZE - 1;
+
+ if (builder->text->len + contents->len > MAX_TEXT_BODY)
+ return svn_error_create(SVN_ERR_FS_CONTAINER_SIZE, NULL,
+ _("Text body exceeds star delta container capacity"));
+
+ if ( builder->instructions->nelts + 2 * contents->len / MATCH_BLOCKSIZE
+ > MAX_INSTRUCTIONS)
+ return svn_error_create(SVN_ERR_FS_CONTAINER_SIZE, NULL,
+ _("Instruction count exceeds star delta container capacity"));
+
+ rep.first_instruction = (apr_uint32_t)builder->instructions->nelts;
+ while (current < last_to_test)
+ {
+ hash_key_t key = hash_key(current);
+ size_t offset;
+ size_t idx;
+
+ /* search for the next matching sequence */
+
+ for (; current < last_to_test; ++current)
+ {
+ idx = hash_to_index(&builder->hash, key);
+ if (builder->hash.prefixes[idx] == current[0])
+ {
+ offset = builder->hash.offsets[idx];
+ if ( (offset != NO_OFFSET)
+ && (memcmp(&builder->text->data[offset], current,
+ MATCH_BLOCKSIZE) == 0))
+ break;
+ }
+ key = hash_key_replace(key, current[0], current[MATCH_BLOCKSIZE]);
+ }
+
+ /* found it? */
+
+ if (current < last_to_test)
+ {
+ instruction_t instruction;
+
+ /* extend the match */
+
+ size_t prefix_match
+ = svn_cstring__reverse_match_length(current,
+ builder->text->data + offset,
+ MIN(offset, current - processed));
+ size_t postfix_match
+ = svn_cstring__match_length(current + MATCH_BLOCKSIZE,
+ builder->text->data + offset + MATCH_BLOCKSIZE,
+ MIN(builder->text->len - offset - MATCH_BLOCKSIZE,
+ end - current - MATCH_BLOCKSIZE));
+
+ /* non-matched section */
+
+ size_t new_copy = (current - processed) - prefix_match;
+ if (new_copy)
+ add_new_text(builder, processed, new_copy);
+
+ /* add instruction for matching section */
+
+ instruction.offset = (apr_int32_t)(offset - prefix_match);
+ instruction.count = (apr_uint32_t)(prefix_match + postfix_match +
+ MATCH_BLOCKSIZE);
+ APR_ARRAY_PUSH(builder->instructions, instruction_t) = instruction;
+
+ processed = current + MATCH_BLOCKSIZE + postfix_match;
+ current = processed;
+ }
+ }
+
+ add_new_text(builder, processed, end - processed);
+ rep.instruction_count = (apr_uint32_t)builder->instructions->nelts
+ - rep.first_instruction;
+ APR_ARRAY_PUSH(builder->reps, rep_t) = rep;
+
+ *rep_idx = (apr_size_t)(builder->reps->nelts - 1);
+ return SVN_NO_ERROR;
+}
+
+apr_size_t
+svn_fs_x__reps_estimate_size(const svn_fs_x__reps_builder_t *builder)
+{
+ /* approx: size of the text exclusive to us @ 50% compression rate
+ * + 2 bytes per instruction
+ * + 2 bytes per representation
+ * + 8 bytes per base representation
+ * + 1:8 inefficiency in using the base representations
+ * + 100 bytes static overhead
+ */
+ return (builder->text->len - builder->base_text_len) / 2
+ + builder->instructions->nelts * 2
+ + builder->reps->nelts * 2
+ + builder->bases->nelts * 8
+ + builder->base_text_len / 8
+ + 100;
+}
+
+/* Execute COUNT instructions starting at INSTRUCTION_IDX in CONTAINER
+ * and fill the parts of EXTRACTOR->RESULT that we can from this container.
+ * Record the remainder in EXTRACTOR->MISSING.
+ *
+ * This function will recurse for instructions that reference other
+ * instruction sequences. COUNT refers to the top-level instructions only.
+ */
+static void
+get_text(svn_fs_x__rep_extractor_t *extractor,
+ const svn_fs_x__reps_t *container,
+ apr_size_t instruction_idx,
+ apr_size_t count)
+{
+ const instruction_t *instruction;
+ const char *offset_0 = container->text - container->base_text_len;
+
+ for (instruction = container->instructions + instruction_idx;
+ instruction < container->instructions + instruction_idx + count;
+ instruction++)
+ if (instruction->offset < 0)
+ {
+ /* instruction sub-sequence */
+ get_text(extractor, container, -instruction->offset,
+ instruction->count);
+ }
+ else if (instruction->offset >= container->base_text_len)
+ {
+ /* direct copy instruction */
+ svn_stringbuf_appendbytes(extractor->result,
+ offset_0 + instruction->offset,
+ instruction->count);
+ }
+ else
+ {
+ /* a section that we need to fill from some external base rep. */
+ missing_t missing;
+ missing.base = 0;
+ missing.start = (apr_uint32_t)extractor->result->len;
+ missing.count = instruction->count;
+ missing.offset = instruction->offset;
+ svn_stringbuf_appendfill(extractor->result, 0, instruction->count);
+
+ if (extractor->missing == NULL)
+ extractor->missing = apr_array_make(extractor->pool, 1,
+ sizeof(missing));
+
+ APR_ARRAY_PUSH(extractor->missing, missing_t) = missing;
+ }
+}
+
+svn_error_t *
+svn_fs_x__reps_get(svn_fs_x__rep_extractor_t **extractor,
+ svn_fs_t *fs,
+ const svn_fs_x__reps_t *container,
+ apr_size_t idx,
+ apr_pool_t *pool)
+{
+ apr_uint32_t first = container->first_instructions[idx];
+ apr_uint32_t last = container->first_instructions[idx + 1];
+
+ /* create the extractor object */
+ svn_fs_x__rep_extractor_t *result = apr_pcalloc(pool, sizeof(*result));
+ result->fs = fs;
+ result->result = svn_stringbuf_create_empty(pool);
+ result->pool = pool;
+
+ /* fill all the bits of the result that we can, i.e. all but bits coming
+ * from base representations */
+ get_text(result, container, first, last - first);
+ *extractor = result;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__extractor_drive(svn_stringbuf_t **contents,
+ svn_fs_x__rep_extractor_t *extractor,
+ apr_size_t start_offset,
+ apr_size_t size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* we don't support base reps right now */
+ SVN_ERR_ASSERT(extractor->missing == NULL);
+
+ if (size == 0)
+ {
+ *contents = svn_stringbuf_dup(extractor->result, result_pool);
+ }
+ else
+ {
+ /* clip the selected range */
+ if (start_offset > extractor->result->len)
+ start_offset = extractor->result->len;
+
+ if (size > extractor->result->len - start_offset)
+ size = extractor->result->len - start_offset;
+
+ *contents = svn_stringbuf_ncreate(extractor->result->data + start_offset,
+ size, result_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__write_reps_container(svn_stream_t *stream,
+ const svn_fs_x__reps_builder_t *builder,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ svn_packed__data_root_t *root = svn_packed__data_create_root(scratch_pool);
+
+ /* one top-level stream for each array */
+ svn_packed__int_stream_t *bases_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+ svn_packed__int_stream_t *reps_stream
+ = svn_packed__create_int_stream(root, TRUE, FALSE);
+ svn_packed__int_stream_t *instructions_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+
+ /* for misc stuff */
+ svn_packed__int_stream_t *misc_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+
+ /* TEXT will be just a single string */
+ svn_packed__byte_stream_t *text_stream
+ = svn_packed__create_bytes_stream(root);
+
+ /* structure the struct streams such we can extract much of the redundancy
+ */
+ svn_packed__create_int_substream(bases_stream, TRUE, TRUE);
+ svn_packed__create_int_substream(bases_stream, TRUE, FALSE);
+ svn_packed__create_int_substream(bases_stream, TRUE, FALSE);
+ svn_packed__create_int_substream(bases_stream, TRUE, FALSE);
+
+ svn_packed__create_int_substream(instructions_stream, TRUE, TRUE);
+ svn_packed__create_int_substream(instructions_stream, FALSE, FALSE);
+
+ /* text */
+ svn_packed__add_bytes(text_stream, builder->text->data, builder->text->len);
+
+ /* serialize bases */
+ for (i = 0; i < builder->bases->nelts; ++i)
+ {
+ const base_t *base = &APR_ARRAY_IDX(builder->bases, i, base_t);
+ svn_packed__add_int(bases_stream, base->revision);
+ svn_packed__add_uint(bases_stream, base->item_index);
+ svn_packed__add_uint(bases_stream, base->priority);
+ svn_packed__add_uint(bases_stream, base->rep);
+ }
+
+ /* serialize reps */
+ for (i = 0; i < builder->reps->nelts; ++i)
+ {
+ const rep_t *rep = &APR_ARRAY_IDX(builder->reps, i, rep_t);
+ svn_packed__add_uint(reps_stream, rep->first_instruction);
+ }
+
+ svn_packed__add_uint(reps_stream, builder->instructions->nelts);
+
+ /* serialize instructions */
+ for (i = 0; i < builder->instructions->nelts; ++i)
+ {
+ const instruction_t *instruction
+ = &APR_ARRAY_IDX(builder->instructions, i, instruction_t);
+ svn_packed__add_int(instructions_stream, instruction->offset);
+ svn_packed__add_uint(instructions_stream, instruction->count);
+ }
+
+ /* other elements */
+ svn_packed__add_uint(misc_stream, 0);
+
+ /* write to stream */
+ SVN_ERR(svn_packed__data_write(stream, root, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_reps_container(svn_fs_x__reps_t **container,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t i;
+
+ base_t *bases;
+ apr_uint32_t *first_instructions;
+ instruction_t *instructions;
+
+ svn_fs_x__reps_t *reps = apr_pcalloc(result_pool, sizeof(*reps));
+
+ svn_packed__data_root_t *root;
+ svn_packed__int_stream_t *bases_stream;
+ svn_packed__int_stream_t *reps_stream;
+ svn_packed__int_stream_t *instructions_stream;
+ svn_packed__int_stream_t *misc_stream;
+ svn_packed__byte_stream_t *text_stream;
+
+ /* read from disk */
+ SVN_ERR(svn_packed__data_read(&root, stream, result_pool, scratch_pool));
+
+ bases_stream = svn_packed__first_int_stream(root);
+ reps_stream = svn_packed__next_int_stream(bases_stream);
+ instructions_stream = svn_packed__next_int_stream(reps_stream);
+ misc_stream = svn_packed__next_int_stream(instructions_stream);
+ text_stream = svn_packed__first_byte_stream(root);
+
+ /* text */
+ reps->text = svn_packed__get_bytes(text_stream, &reps->text_len);
+ reps->text = apr_pmemdup(result_pool, reps->text, reps->text_len);
+
+ /* de-serialize bases */
+ reps->base_count
+ = svn_packed__int_count(svn_packed__first_int_substream(bases_stream));
+ bases = apr_palloc(result_pool, reps->base_count * sizeof(*bases));
+ reps->bases = bases;
+
+ for (i = 0; i < reps->base_count; ++i)
+ {
+ base_t *base = bases + i;
+ base->revision = (svn_revnum_t)svn_packed__get_int(bases_stream);
+ base->item_index = svn_packed__get_uint(bases_stream);
+ base->priority = (int)svn_packed__get_uint(bases_stream);
+ base->rep = (apr_uint32_t)svn_packed__get_uint(bases_stream);
+ }
+
+ /* de-serialize instructions */
+ reps->instruction_count
+ = svn_packed__int_count
+ (svn_packed__first_int_substream(instructions_stream));
+ instructions
+ = apr_palloc(result_pool,
+ reps->instruction_count * sizeof(*instructions));
+ reps->instructions = instructions;
+
+ for (i = 0; i < reps->instruction_count; ++i)
+ {
+ instruction_t *instruction = instructions + i;
+ instruction->offset
+ = (apr_int32_t)svn_packed__get_int(instructions_stream);
+ instruction->count
+ = (apr_uint32_t)svn_packed__get_uint(instructions_stream);
+ }
+
+ /* de-serialize reps */
+ reps->rep_count = svn_packed__int_count(reps_stream);
+ first_instructions
+ = apr_palloc(result_pool,
+ (reps->rep_count + 1) * sizeof(*first_instructions));
+ reps->first_instructions = first_instructions;
+
+ for (i = 0; i < reps->rep_count; ++i)
+ first_instructions[i]
+ = (apr_uint32_t)svn_packed__get_uint(reps_stream);
+ first_instructions[reps->rep_count] = (apr_uint32_t)reps->instruction_count;
+
+ /* other elements */
+ reps->base_text_len = (apr_size_t)svn_packed__get_uint(misc_stream);
+
+ /* return result */
+ *container = reps;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_reps_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_fs_x__reps_t *reps = in;
+ svn_stringbuf_t *serialized;
+
+ /* make a guesstimate on the size of the serialized data. Erring on the
+ * low side will cause the serializer to re-alloc its buffer. */
+ apr_size_t size
+ = reps->text_len
+ + reps->base_count * sizeof(*reps->bases)
+ + reps->rep_count * sizeof(*reps->first_instructions)
+ + reps->instruction_count * sizeof(*reps->instructions)
+ + 100;
+
+ /* serialize array header and all its elements */
+ svn_temp_serializer__context_t *context
+ = svn_temp_serializer__init(reps, sizeof(*reps), size, pool);
+
+ /* serialize sub-structures */
+ svn_temp_serializer__add_leaf(context, (const void **)&reps->text,
+ reps->text_len);
+ svn_temp_serializer__add_leaf(context, (const void **)&reps->bases,
+ reps->base_count * sizeof(*reps->bases));
+ svn_temp_serializer__add_leaf(context,
+ (const void **)&reps->first_instructions,
+ reps->rep_count *
+ sizeof(*reps->first_instructions));
+ svn_temp_serializer__add_leaf(context, (const void **)&reps->instructions,
+ reps->instruction_count *
+ sizeof(*reps->instructions));
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_reps_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ svn_fs_x__reps_t *reps = (svn_fs_x__reps_t *)data;
+
+ /* de-serialize sub-structures */
+ svn_temp_deserializer__resolve(reps, (void **)&reps->text);
+ svn_temp_deserializer__resolve(reps, (void **)&reps->bases);
+ svn_temp_deserializer__resolve(reps, (void **)&reps->first_instructions);
+ svn_temp_deserializer__resolve(reps, (void **)&reps->instructions);
+
+ /* done */
+ *out = reps;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__reps_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_fs_x__reps_baton_t *reps_baton = baton;
+
+ /* get a usable reps structure */
+ const svn_fs_x__reps_t *cached = data;
+ svn_fs_x__reps_t *reps = apr_pmemdup(pool, cached, sizeof(*reps));
+
+ reps->text
+ = svn_temp_deserializer__ptr(cached, (const void **)&cached->text);
+ reps->bases
+ = svn_temp_deserializer__ptr(cached, (const void **)&cached->bases);
+ reps->first_instructions
+ = svn_temp_deserializer__ptr(cached,
+ (const void **)&cached->first_instructions);
+ reps->instructions
+ = svn_temp_deserializer__ptr(cached,
+ (const void **)&cached->instructions);
+
+ /* return an extractor for the selected item */
+ SVN_ERR(svn_fs_x__reps_get((svn_fs_x__rep_extractor_t **)out,
+ reps_baton->fs, reps, reps_baton->idx, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/reps.h b/subversion/libsvn_fs_x/reps.h
new file mode 100644
index 0000000..720bfbf
--- /dev/null
+++ b/subversion/libsvn_fs_x/reps.h
@@ -0,0 +1,190 @@
+/* reps.h --- FSX representation container
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__REPS_H
+#define SVN_LIBSVN_FS__REPS_H
+
+#include "svn_io.h"
+#include "fs.h"
+
+/* This container type implements the start-delta (aka pick lists) data
+ * structure plus functions to create it and read data from it. The key
+ * point is to identify common sub-strings within a whole set of fulltexts
+ * instead of only two as in the classic txdelta code.
+ *
+ * Because it is relatively expensive to optimize the final in-memory
+ * layout, representation containers cannot be updated. A builder object
+ * will do most of the space saving when adding fulltexts but the final
+ * data will only be created immediately before serializing everything to
+ * disk. So, builders are write only and representation containers are
+ * read-only.
+ *
+ * Extracting data from a representation container is O(length) but it
+ * may require multiple iterations if base representations outside the
+ * container were used. Therefore, you will first create an extractor
+ * object (this may happen while holding a cache lock) and the you need
+ * to "drive" the extractor outside any cache context.
+ */
+
+/* A write-only constructor object for representation containers.
+ */
+typedef struct svn_fs_x__reps_builder_t svn_fs_x__reps_builder_t;
+
+/* A read-only representation container -
+ * an opaque collection of fulltexts, i.e. byte strings.
+ */
+typedef struct svn_fs_x__reps_t svn_fs_x__reps_t;
+
+/* The fulltext extractor utility object.
+ */
+typedef struct svn_fs_x__rep_extractor_t svn_fs_x__rep_extractor_t;
+
+/* Baton type to be passed to svn_fs_x__reps_get_func.
+ */
+typedef struct svn_fs_x__reps_baton_t
+{
+ /* filesystem the resulting extractor shall operate on */
+ svn_fs_t *fs;
+
+ /* element index of the item to extract from the container */
+ apr_size_t idx;
+} svn_fs_x__reps_baton_t;
+
+/* Create and populate noderev containers. */
+
+/* Create and return a new builder object, allocated in RESULT_POOL.
+ */
+svn_fs_x__reps_builder_t *
+svn_fs_x__reps_builder_create(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* To BUILDER, add reference to the fulltext currently stored in
+ * representation REP. Substrings matching with any of the base reps
+ * in BUILDER can be removed from the text base and be replaced by
+ * references to those base representations.
+ *
+ * The PRIORITY is a mere hint on which base representations should
+ * preferred in case we could re-use the same contents from multiple bases.
+ * Higher numerical value means higher priority / likelihood of being
+ * selected over others.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__reps_add_base(svn_fs_x__reps_builder_t *builder,
+ svn_fs_x__representation_t *rep,
+ int priority,
+ apr_pool_t *scratch_pool);
+
+/* Add the byte string CONTENTS to BUILDER. Return the item index under
+ * which the fulltext can be retrieved from the final container in *REP_IDX.
+ */
+svn_error_t *
+svn_fs_x__reps_add(apr_size_t *rep_idx,
+ svn_fs_x__reps_builder_t *builder,
+ const svn_string_t *contents);
+
+/* Return a rough estimate in bytes for the serialized representation
+ * of BUILDER.
+ */
+apr_size_t
+svn_fs_x__reps_estimate_size(const svn_fs_x__reps_builder_t *builder);
+
+/* Read from representation containers. */
+
+/* For fulltext IDX in CONTAINER in filesystem FS, create an extract object
+ * allocated in POOL and return it in *EXTRACTOR.
+ */
+svn_error_t *
+svn_fs_x__reps_get(svn_fs_x__rep_extractor_t **extractor,
+ svn_fs_t *fs,
+ const svn_fs_x__reps_t *container,
+ apr_size_t idx,
+ apr_pool_t *pool);
+
+/* Let the EXTRACTOR object fetch all parts of the desired fulltext and
+ * return the latter in *CONTENTS. If SIZE is not 0, return SIZE bytes
+ * starting at offset START_OFFSET of the full contents. If that range
+ * lies partly or completely outside the content, clip it accordingly.
+ * Allocate the result in RESULT_POOL and use SCRATCH_POOL for temporary
+ * allocations.
+ *
+ * Note, you may not run this inside a cache access function.
+ */
+svn_error_t *
+svn_fs_x__extractor_drive(svn_stringbuf_t** contents,
+ svn_fs_x__rep_extractor_t* extractor,
+ apr_size_t start_offset,
+ apr_size_t size,
+ apr_pool_t* result_pool,
+ apr_pool_t* scratch_pool);
+
+/* I/O interface. */
+
+/* Write a serialized representation of the final container described by
+ * BUILDER to STREAM. Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__write_reps_container(svn_stream_t *stream,
+ const svn_fs_x__reps_builder_t *builder,
+ apr_pool_t *scratch_pool);
+
+/* Read a representations container from its serialized representation in
+ * STREAM. Allocate the result in RESULT_POOL and return it in *CONTAINER.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_reps_container(svn_fs_x__reps_t **container,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Implements #svn_cache__serialize_func_t for svn_fs_x__reps_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_reps_container(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/* Implements #svn_cache__deserialize_func_t for svn_fs_x__reps_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_reps_container(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/* Implements svn_cache__partial_getter_func_t for svn_fs_x__reps_t,
+ * setting *OUT to an svn_fs_x__rep_extractor_t object defined by the
+ * svn_fs_x__reps_baton_t passed in as *BATON. This function is similar
+ * to svn_fs_x__reps_get but operates on the cache serialized
+ * representation of the container.
+ */
+svn_error_t *
+svn_fs_x__reps_get_func(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/rev_file.c b/subversion/libsvn_fs_x/rev_file.c
new file mode 100644
index 0000000..445d45b
--- /dev/null
+++ b/subversion/libsvn_fs_x/rev_file.c
@@ -0,0 +1,316 @@
+/* rev_file.c --- revision file and index access functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "rev_file.h"
+#include "fs_x.h"
+#include "index.h"
+#include "low_level.h"
+#include "util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "private/svn_io_private.h"
+#include "svn_private_config.h"
+
+/* Return a new revision file instance, allocated in RESULT_POOL, for
+ * filesystem FS. Set its pool member to the provided RESULT_POOL. */
+static svn_fs_x__revision_file_t *
+create_revision_file(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__revision_file_t *file = apr_palloc(result_pool, sizeof(*file));
+
+ file->is_packed = FALSE;
+ file->start_revision = SVN_INVALID_REVNUM;
+
+ file->file = NULL;
+ file->stream = NULL;
+ file->p2l_stream = NULL;
+ file->l2p_stream = NULL;
+ file->block_size = ffd->block_size;
+ file->l2p_offset = -1;
+ file->l2p_checksum = NULL;
+ file->p2l_offset = -1;
+ file->p2l_checksum = NULL;
+ file->footer_offset = -1;
+ file->pool = result_pool;
+
+ return file;
+}
+
+/* Return a new revision file instance, allocated in RESULT_POOL, for
+ * REVISION in filesystem FS. Set its pool member to the provided
+ * RESULT_POOL. */
+static svn_fs_x__revision_file_t *
+init_revision_file(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__revision_file_t *file = create_revision_file(fs, result_pool);
+
+ file->is_packed = svn_fs_x__is_packed_rev(fs, revision);
+ file->start_revision = svn_fs_x__packed_base_rev(fs, revision);
+
+ return file;
+}
+
+/* Baton type for set_read_only() */
+typedef struct set_read_only_baton_t
+{
+ /* File to set to read-only. */
+ const char *file_path;
+
+ /* Scratch pool sufficient life time.
+ * Ideally the pool that we registered the cleanup on. */
+ apr_pool_t *pool;
+} set_read_only_baton_t;
+
+/* APR pool cleanup callback taking a set_read_only_baton_t baton and then
+ * (trying to) set the specified file to r/o mode. */
+static apr_status_t
+set_read_only(void *baton)
+{
+ set_read_only_baton_t *ro_baton = baton;
+ apr_status_t status = APR_SUCCESS;
+ svn_error_t *err;
+
+ err = svn_io_set_file_read_only(ro_baton->file_path, TRUE, ro_baton->pool);
+ if (err)
+ {
+ status = err->apr_err;
+ svn_error_clear(err);
+ }
+
+ return status;
+}
+
+/* If the file at PATH is read-only, attempt to make it writable. The
+ * original state will be restored with RESULT_POOL gets cleaned up.
+ * SCRATCH_POOL is for temporary allocations. */
+static svn_error_t *
+auto_make_writable(const char *path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t is_read_only;
+ apr_finfo_t finfo;
+
+ SVN_ERR(svn_io_stat(&finfo, path, SVN__APR_FINFO_READONLY, scratch_pool));
+ SVN_ERR(svn_io__is_finfo_read_only(&is_read_only, &finfo, scratch_pool));
+
+ if (is_read_only)
+ {
+ /* Tell the pool to restore the r/o state upon cleanup
+ (assuming the file will still exist, failing silently otherwise). */
+ set_read_only_baton_t *baton = apr_pcalloc(result_pool,
+ sizeof(*baton));
+ baton->pool = result_pool;
+ baton->file_path = apr_pstrdup(result_pool, path);
+ apr_pool_cleanup_register(result_pool, baton,
+ set_read_only, apr_pool_cleanup_null);
+
+ /* Finally, allow write access (undoing it has already been scheduled
+ and is idempotent). */
+ SVN_ERR(svn_io_set_file_read_write(path, FALSE, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Core implementation of svn_fs_fs__open_pack_or_rev_file working on an
+ * existing, initialized FILE structure. If WRITABLE is TRUE, give write
+ * access to the file - temporarily resetting the r/o state if necessary.
+ */
+static svn_error_t *
+open_pack_or_rev_file(svn_fs_x__revision_file_t *file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t writable,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_boolean_t retry = FALSE;
+
+ do
+ {
+ const char *path = svn_fs_x__path_rev_absolute(fs, rev, scratch_pool);
+ apr_file_t *apr_file;
+ apr_int32_t flags = writable
+ ? APR_READ | APR_WRITE | APR_BUFFERED
+ : APR_READ | APR_BUFFERED;
+
+ /* We may have to *temporarily* enable write access. */
+ err = writable ? auto_make_writable(path, result_pool, scratch_pool)
+ : SVN_NO_ERROR;
+
+ /* open the revision file in buffered r/o or r/w mode */
+ if (!err)
+ err = svn_io_file_open(&apr_file, path, flags, APR_OS_DEFAULT,
+ result_pool);
+
+ if (!err)
+ {
+ file->file = apr_file;
+ file->stream = svn_stream_from_aprfile2(apr_file, TRUE,
+ result_pool);
+
+ return SVN_NO_ERROR;
+ }
+
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ /* Could not open the file. This may happen if the
+ * file once existed but got packed later. */
+ svn_error_clear(err);
+
+ /* if that was our 2nd attempt, leave it at that. */
+ if (retry)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld"), rev);
+
+ /* We failed for the first time. Refresh cache & retry. */
+ SVN_ERR(svn_fs_x__update_min_unpacked_rev(fs, scratch_pool));
+ file->start_revision = svn_fs_x__packed_base_rev(fs, rev);
+
+ retry = TRUE;
+ }
+ else
+ {
+ retry = FALSE;
+ }
+ }
+ while (retry);
+
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_fs_x__open_pack_or_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *file = init_revision_file(fs, rev, result_pool);
+ return svn_error_trace(open_pack_or_rev_file(*file, fs, rev, FALSE,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__open_pack_or_rev_file_writable(svn_fs_x__revision_file_t** file,
+ svn_fs_t* fs,
+ svn_revnum_t rev,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *file = init_revision_file(fs, rev, result_pool);
+ return svn_error_trace(open_pack_or_rev_file(*file, fs, rev, TRUE,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__auto_read_footer(svn_fs_x__revision_file_t *file)
+{
+ if (file->l2p_offset == -1)
+ {
+ apr_off_t filesize = 0;
+ unsigned char footer_length;
+ svn_stringbuf_t *footer;
+
+ /* Determine file size. */
+ SVN_ERR(svn_io_file_seek(file->file, APR_END, &filesize, file->pool));
+
+ /* Read last byte (containing the length of the footer). */
+ SVN_ERR(svn_io_file_aligned_seek(file->file, file->block_size, NULL,
+ filesize - 1, file->pool));
+ SVN_ERR(svn_io_file_read_full2(file->file, &footer_length,
+ sizeof(footer_length), NULL, NULL,
+ file->pool));
+
+ /* Read footer. */
+ footer = svn_stringbuf_create_ensure(footer_length, file->pool);
+ SVN_ERR(svn_io_file_aligned_seek(file->file, file->block_size, NULL,
+ filesize - 1 - footer_length,
+ file->pool));
+ SVN_ERR(svn_io_file_read_full2(file->file, footer->data, footer_length,
+ &footer->len, NULL, file->pool));
+ footer->data[footer->len] = '\0';
+
+ /* Extract index locations. */
+ SVN_ERR(svn_fs_x__parse_footer(&file->l2p_offset, &file->l2p_checksum,
+ &file->p2l_offset, &file->p2l_checksum,
+ footer, file->start_revision,
+ file->pool));
+ file->footer_offset = filesize - footer_length - 1;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__open_proto_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *apr_file;
+ SVN_ERR(svn_io_file_open(&apr_file,
+ svn_fs_x__path_txn_proto_rev(fs, txn_id,
+ scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ result_pool));
+
+ return svn_error_trace(svn_fs_x__wrap_temp_rev_file(file, fs, apr_file,
+ result_pool));
+}
+
+svn_error_t *
+svn_fs_x__wrap_temp_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ apr_file_t *temp_file,
+ apr_pool_t *result_pool)
+{
+ *file = create_revision_file(fs, result_pool);
+ (*file)->file = temp_file;
+ (*file)->stream = svn_stream_from_aprfile2(temp_file, TRUE, result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__close_revision_file(svn_fs_x__revision_file_t *file)
+{
+ if (file->stream)
+ SVN_ERR(svn_stream_close(file->stream));
+ if (file->file)
+ SVN_ERR(svn_io_file_close(file->file, file->pool));
+
+ file->file = NULL;
+ file->stream = NULL;
+ file->l2p_stream = NULL;
+ file->p2l_stream = NULL;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/rev_file.h b/subversion/libsvn_fs_x/rev_file.h
new file mode 100644
index 0000000..b96d035
--- /dev/null
+++ b/subversion/libsvn_fs_x/rev_file.h
@@ -0,0 +1,154 @@
+/* rev_file.h --- revision file and index access 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_LIBSVN_FS_X__REV_FILE_H
+#define SVN_LIBSVN_FS_X__REV_FILE_H
+
+#include "svn_fs.h"
+#include "id.h"
+
+/* In format 7, index files must be read in sync with the respective
+ * revision / pack file. I.e. we must use packed index files for packed
+ * rev files and unpacked ones for non-packed rev files. So, the whole
+ * point is to open them with matching "is packed" setting in case some
+ * background pack process was run.
+ */
+
+/* Opaque index stream type.
+ */
+typedef struct svn_fs_x__packed_number_stream_t
+ svn_fs_x__packed_number_stream_t;
+
+/* Data file, including indexes data, and associated properties for
+ * START_REVISION. As the FILE is kept open, background pack operations
+ * will not cause access to this file to fail.
+ */
+typedef struct svn_fs_x__revision_file_t
+{
+ /* first (potentially only) revision in the rev / pack file.
+ * SVN_INVALID_REVNUM for txn proto-rev files. */
+ svn_revnum_t start_revision;
+
+ /* the revision was packed when the first file / stream got opened */
+ svn_boolean_t is_packed;
+
+ /* rev / pack file */
+ apr_file_t *file;
+
+ /* stream based on FILE and not NULL exactly when FILE is not NULL */
+ svn_stream_t *stream;
+
+ /* the opened P2L index stream or NULL. Always NULL for txns. */
+ svn_fs_x__packed_number_stream_t *p2l_stream;
+
+ /* the opened L2P index stream or NULL. Always NULL for txns. */
+ svn_fs_x__packed_number_stream_t *l2p_stream;
+
+ /* Copied from FS->FFD->BLOCK_SIZE upon creation. It allows us to
+ * use aligned seek() without having the FS handy. */
+ apr_off_t block_size;
+
+ /* Offset within FILE at which the rev data ends and the L2P index
+ * data starts. Less than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer
+ * has not been called, yet. */
+ apr_off_t l2p_offset;
+
+ /* MD5 checksum on the whole on-disk representation of the L2P index.
+ * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
+ svn_checksum_t *l2p_checksum;
+
+ /* Offset within FILE at which the L2P index ends and the P2L index
+ * data starts. Greater than L2P_OFFSET. -1 if svn_fs_fs__auto_read_footer
+ * has not been called, yet. */
+ apr_off_t p2l_offset;
+
+ /* MD5 checksum on the whole on-disk representation of the P2L index.
+ * NULL if svn_fs_fs__auto_read_footer has not been called, yet. */
+ svn_checksum_t *p2l_checksum;
+
+ /* Offset within FILE at which the P2L index ends and the footer starts.
+ * Greater than P2L_OFFSET. -1 if svn_fs_fs__auto_read_footer has not
+ * been called, yet. */
+ apr_off_t footer_offset;
+
+ /* pool containing this object */
+ apr_pool_t *pool;
+} svn_fs_x__revision_file_t;
+
+/* Open the correct revision file for REV. If the filesystem FS has
+ * been packed, *FILE will be set to the packed file; otherwise, set *FILE
+ * to the revision file for REV. Return SVN_ERR_FS_NO_SUCH_REVISION if the
+ * file doesn't exist. Allocate *FILE in RESULT_POOL and use SCRATCH_POOL
+ * for temporaries. */
+svn_error_t *
+svn_fs_x__open_pack_or_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Open the correct revision file for REV with read and write access.
+ * If necessary, temporarily reset the file's read-only state. If the
+ * filesystem FS has been packed, *FILE will be set to the packed file;
+ * otherwise, set *FILE to the revision file for REV.
+ *
+ * Return SVN_ERR_FS_NO_SUCH_REVISION if the file doesn't exist.
+ * Allocate *FILE in RESULT_POOL and use SCRATCH_POOLfor temporaries. */
+svn_error_t *
+svn_fs_x__open_pack_or_rev_file_writable(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* If the footer data in FILE has not been read, yet, do so now.
+ * Index locations will only be read upon request as we assume they get
+ * cached and the FILE is usually used for REP data access only.
+ * Hence, the separate step.
+ */
+svn_error_t *
+svn_fs_x__auto_read_footer(svn_fs_x__revision_file_t *file);
+
+/* Open the proto-rev file of transaction TXN_ID in FS and return it in *FILE.
+ * Allocate *FILE in RESULT_POOL use and SCRATCH_POOL for temporaries.. */
+svn_error_t *
+svn_fs_x__open_proto_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t* result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Wrap the TEMP_FILE, used in the context of FS, into a revision file
+ * struct, allocated in RESULT_POOL, and return it in *FILE.
+ */
+svn_error_t *
+svn_fs_x__wrap_temp_rev_file(svn_fs_x__revision_file_t **file,
+ svn_fs_t *fs,
+ apr_file_t *temp_file,
+ apr_pool_t *result_pool);
+
+/* Close all files and streams in FILE.
+ */
+svn_error_t *
+svn_fs_x__close_revision_file(svn_fs_x__revision_file_t *file);
+
+#endif
diff --git a/subversion/libsvn_fs_x/revprops.c b/subversion/libsvn_fs_x/revprops.c
new file mode 100644
index 0000000..5bc62cc
--- /dev/null
+++ b/subversion/libsvn_fs_x/revprops.c
@@ -0,0 +1,1948 @@
+/* revprops.c --- everything needed to handle revprops in FSX
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+#include <apr_md5.h>
+
+#include "svn_pools.h"
+#include "svn_hash.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_x.h"
+#include "revprops.h"
+#include "util.h"
+#include "transaction.h"
+
+#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Give writing processes 10 seconds to replace an existing revprop
+ file with a new one. After that time, we assume that the writing
+ process got aborted and that we have re-read revprops. */
+#define REVPROP_CHANGE_TIMEOUT (10 * 1000000)
+
+/* In case of an inconsistent read, close the generation file, yield,
+ re-open and re-read. This is the number of times we try this before
+ giving up. */
+#define GENERATION_READ_RETRY_COUNT 100
+
+/* Maximum size of the generation number file contents (including NUL). */
+#define CHECKSUMMED_NUMBER_BUFFER_LEN \
+ (SVN_INT64_BUFFER_SIZE + 3 + APR_MD5_DIGESTSIZE * 2)
+
+
+svn_error_t *
+svn_fs_x__upgrade_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *revprops_shard_path;
+ const char *revprops_pack_file_dir;
+ apr_int64_t shard;
+ apr_int64_t first_unpacked_shard
+ = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+ int compression_level = ffd->compress_packed_revprops
+ ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
+ : SVN_DELTA_COMPRESSION_LEVEL_NONE;
+
+ /* first, pack all revprops shards to match the packed revision shards */
+ for (shard = 0; shard < first_unpacked_shard; ++shard)
+ {
+ svn_pool_clear(iterpool);
+
+ revprops_pack_file_dir = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool,
+ "%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
+ shard),
+ iterpool);
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
+ iterpool);
+
+ SVN_ERR(svn_fs_x__pack_revprops_shard(revprops_pack_file_dir,
+ revprops_shard_path,
+ shard, ffd->max_files_per_dir,
+ (int)(0.9 * ffd->revprop_pack_size),
+ compression_level,
+ cancel_func, cancel_baton, iterpool));
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard,
+ svn_fs_upgrade_pack_revprops, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__upgrade_cleanup_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const char *revprops_shard_path;
+ apr_int64_t shard;
+ apr_int64_t first_unpacked_shard
+ = ffd->min_unpacked_rev / ffd->max_files_per_dir;
+
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR,
+ scratch_pool);
+
+ /* delete the non-packed revprops shards afterwards */
+ for (shard = 0; shard < first_unpacked_shard; ++shard)
+ {
+ svn_pool_clear(iterpool);
+
+ revprops_shard_path = svn_dirent_join(revsprops_dir,
+ apr_psprintf(iterpool, "%" APR_INT64_T_FMT, shard),
+ iterpool);
+ SVN_ERR(svn_fs_x__delete_revprops_shard(revprops_shard_path,
+ shard, ffd->max_files_per_dir,
+ cancel_func, cancel_baton,
+ iterpool));
+ if (notify_func)
+ SVN_ERR(notify_func(notify_baton, shard,
+ svn_fs_upgrade_cleanup_revprops, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Revprop caching management.
+ *
+ * Mechanism:
+ * ----------
+ *
+ * Revprop caching needs to be activated and will be deactivated for the
+ * respective FS instance if the necessary infrastructure could not be
+ * initialized. As long as no revprops are being read or changed, revprop
+ * caching imposes no overhead.
+ *
+ * When activated, we cache revprops using (revision, generation) pairs
+ * as keys with the generation being incremented upon every revprop change.
+ * Since the cache is process-local, the generation needs to be tracked
+ * for at least as long as the process lives but may be reset afterwards.
+ *
+ * We track the revprop generation in a persistent, unbuffered file that
+ * we may keep open for the lifetime of the svn_fs_t. It is the OS'
+ * responsibility to provide us with the latest contents upon read. To
+ * detect incomplete updates due to non-atomic reads, we put a MD5 checksum
+ * next to the actual generation number and verify that it matches.
+ *
+ * Since we cannot guarantee that the OS will provide us with up-to-date
+ * data buffers for open files, we re-open and re-read the file before
+ * modifying it. This will prevent lost updates.
+ *
+ * A race condition exists between switching to the modified revprop data
+ * and bumping the generation number. In particular, the process may crash
+ * just after switching to the new revprop data and before bumping the
+ * generation. To be able to detect this scenario, we bump the generation
+ * twice per revprop change: once immediately before (creating an odd number)
+ * and once after the atomic switch (even generation).
+ *
+ * A writer holding the write lock can immediately assume a crashed writer
+ * in case of an odd generation or they would not have been able to acquire
+ * the lock. A reader detecting an odd generation will use that number and
+ * be forced to re-read any revprop data - usually getting the new revprops
+ * already. If the generation file modification timestamp is too old, the
+ * reader will assume a crashed writer, acquire the write lock and bump
+ * the generation if it is still odd. So, for about REVPROP_CHANGE_TIMEOUT
+ * after the crash, reader caches may be stale.
+ */
+
+/* If the revprop generation file in FS is open, close it. This is a no-op
+ * if the file is not open.
+ */
+static svn_error_t *
+close_revprop_generation_file(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ if (ffd->revprop_generation_file)
+ {
+ SVN_ERR(svn_io_file_close(ffd->revprop_generation_file, scratch_pool));
+ ffd->revprop_generation_file = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Make sure the revprop_generation member in FS is set. If READ_ONLY is
+ * set, open the file w/o write permission if the file is not open yet.
+ * The file is kept open if it has sufficient rights (or more) but will be
+ * closed and re-opened if it provided insufficient access rights.
+ *
+ * Call only for repos that support revprop caching.
+ */
+static svn_error_t *
+open_revprop_generation_file(svn_fs_t *fs,
+ svn_boolean_t read_only,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_int32_t flags = read_only ? APR_READ : (APR_READ | APR_WRITE);
+
+ /* Close the current file handle if it has insufficient rights. */
+ if ( ffd->revprop_generation_file
+ && (apr_file_flags_get(ffd->revprop_generation_file) & flags) != flags)
+ SVN_ERR(close_revprop_generation_file(fs, scratch_pool));
+
+ /* If not open already, open with sufficient rights. */
+ if (ffd->revprop_generation_file == NULL)
+ {
+ const char *path = svn_fs_x__path_revprop_generation(fs, scratch_pool);
+ SVN_ERR(svn_io_file_open(&ffd->revprop_generation_file, path,
+ flags, APR_OS_DEFAULT, fs->pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the textual representation of NUMBER and its checksum in *BUFFER.
+ */
+static svn_error_t *
+checkedsummed_number(svn_stringbuf_t **buffer,
+ apr_int64_t number,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_checksum_t *checksum;
+ const char *digest;
+
+ char str[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__i64toa(str, number);
+ str[len] = 0;
+
+ SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, str, len, scratch_pool));
+ digest = svn_checksum_to_cstring_display(checksum, scratch_pool);
+
+ *buffer = svn_stringbuf_createf(result_pool, "%s %s\n", digest, str);
+
+ return SVN_NO_ERROR;
+}
+
+/* Extract the generation number from the text BUFFER of LEN bytes and
+ * verify it against the checksum in the same BUFFER. If they match, return
+ * the generation in *NUMBER. Otherwise, return an error.
+ * BUFFER does not need to be NUL-terminated.
+ */
+static svn_error_t *
+verify_extract_number(apr_int64_t *number,
+ const char *buffer,
+ apr_size_t len,
+ apr_pool_t *scratch_pool)
+{
+ const char *digest_end = strchr(buffer, ' ');
+
+ /* Does the buffer even contain checksum _and_ number? */
+ if (digest_end != NULL)
+ {
+ svn_checksum_t *expected;
+ svn_checksum_t *actual;
+
+ SVN_ERR(svn_checksum_parse_hex(&expected, svn_checksum_md5, buffer,
+ scratch_pool));
+ SVN_ERR(svn_checksum(&actual, svn_checksum_md5, digest_end + 1,
+ (buffer + len) - (digest_end + 1), scratch_pool));
+
+ if (svn_checksum_match(expected, actual))
+ return svn_error_trace(svn_cstring_atoi64(number, digest_end + 1));
+ }
+
+ /* Incomplete buffer or not a match. */
+ return svn_error_create(SVN_ERR_FS_INVALID_GENERATION, NULL,
+ _("Invalid generation number data."));
+}
+
+/* Read revprop generation as stored on disk for repository FS. The result is
+ * returned in *CURRENT. Call only for repos that support revprop caching.
+ */
+static svn_error_t *
+read_revprop_generation_file(apr_int64_t *current,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ char buf[CHECKSUMMED_NUMBER_BUFFER_LEN];
+ apr_size_t len;
+ apr_off_t offset = 0;
+ int i;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ /* Retry in case of incomplete file buffer updates. */
+ for (i = 0; i < GENERATION_READ_RETRY_COUNT; ++i)
+ {
+ svn_error_clear(err);
+ svn_pool_clear(iterpool);
+
+ /* If we can't even access the data, things are very wrong.
+ * Don't retry in that case.
+ */
+ SVN_ERR(open_revprop_generation_file(fs, TRUE, iterpool));
+ SVN_ERR(svn_io_file_seek(ffd->revprop_generation_file, APR_SET, &offset,
+ iterpool));
+
+ len = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(ffd->revprop_generation_file, buf, &len,
+ iterpool));
+
+ /* Some data has been read. It will most likely be complete and
+ * consistent. Extract and verify anyway. */
+ err = verify_extract_number(current, buf, len, iterpool);
+ if (!err)
+ break;
+
+ /* Got unlucky and data was invalid. Retry. */
+ SVN_ERR(close_revprop_generation_file(fs, iterpool));
+
+#if APR_HAS_THREADS
+ apr_thread_yield();
+#else
+ apr_sleep(0);
+#endif
+ }
+
+ svn_pool_destroy(iterpool);
+
+ /* If we had to give up, propagate the error. */
+ return svn_error_trace(err);
+}
+
+/* Write the CURRENT revprop generation to disk for repository FS.
+ * Call only for repos that support revprop caching.
+ */
+static svn_error_t *
+write_revprop_generation_file(svn_fs_t *fs,
+ apr_int64_t current,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *buffer;
+ apr_off_t offset = 0;
+
+ SVN_ERR(checkedsummed_number(&buffer, current, scratch_pool, scratch_pool));
+
+ SVN_ERR(open_revprop_generation_file(fs, FALSE, scratch_pool));
+ SVN_ERR(svn_io_file_seek(ffd->revprop_generation_file, APR_SET, &offset,
+ scratch_pool));
+ SVN_ERR(svn_io_file_write_full(ffd->revprop_generation_file, buffer->data,
+ buffer->len, NULL, scratch_pool));
+ SVN_ERR(svn_io_file_flush_to_disk(ffd->revprop_generation_file,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__reset_revprop_generation_file(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ const char *path = svn_fs_x__path_revprop_generation(fs, scratch_pool);
+ svn_stringbuf_t *buffer;
+
+ /* Unconditionally close the revprop generation file.
+ * Don't care about FS formats. This ensures consistent internal state. */
+ SVN_ERR(close_revprop_generation_file(fs, scratch_pool));
+
+ /* Unconditionally remove any old revprop generation file.
+ * Don't care about FS formats. This ensures consistent on-disk state
+ * for old format repositories. */
+ SVN_ERR(svn_io_remove_file2(path, TRUE, scratch_pool));
+
+ /* Write the initial revprop generation file contents, if supported by
+ * the current format. This ensures consistent on-disk state for new
+ * format repositories. */
+ SVN_ERR(checkedsummed_number(&buffer, 0, scratch_pool, scratch_pool));
+ SVN_ERR(svn_io_write_atomic(path, buffer->data, buffer->len, NULL,
+ scratch_pool));
+
+ /* ffd->revprop_generation_file will be re-opened on demand. */
+
+ return SVN_NO_ERROR;
+}
+
+/* Create an error object with the given MESSAGE and pass it to the
+ WARNING member of FS. Clears UNDERLYING_ERR. */
+static void
+log_revprop_cache_init_warning(svn_fs_t *fs,
+ svn_error_t *underlying_err,
+ const char *message,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = svn_error_createf(
+ SVN_ERR_FS_REVPROP_CACHE_INIT_FAILURE,
+ underlying_err, message,
+ svn_dirent_local_style(fs->path, scratch_pool));
+
+ if (fs->warning)
+ (fs->warning)(fs->warning_baton, err);
+
+ svn_error_clear(err);
+}
+
+/* Test whether revprop cache and necessary infrastructure are
+ available in FS. */
+static svn_boolean_t
+has_revprop_cache(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_error_t *error;
+
+ /* is the cache (still) enabled? */
+ if (ffd->revprop_cache == NULL)
+ return FALSE;
+
+ /* try initialize our file-backed infrastructure */
+ error = open_revprop_generation_file(fs, TRUE, scratch_pool);
+ if (error)
+ {
+ /* failure -> disable revprop cache for good */
+
+ ffd->revprop_cache = NULL;
+ log_revprop_cache_init_warning(fs, error,
+ "Revprop caching for '%s' disabled "
+ "because infrastructure for revprop "
+ "caching failed to initialize.",
+ scratch_pool);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Baton structure for revprop_generation_fixup. */
+typedef struct revprop_generation_fixup_t
+{
+ /* revprop generation to read */
+ apr_int64_t *generation;
+
+ /* file system context */
+ svn_fs_t *fs;
+} revprop_generation_upgrade_t;
+
+/* If the revprop generation has an odd value, it means the original writer
+ of the revprop got killed. We don't know whether that process as able
+ to change the revprop data but we assume that it was. Therefore, we
+ increase the generation in that case to basically invalidate everyone's
+ cache content.
+ Execute this only while holding the write lock to the repo in baton->FFD.
+ */
+static svn_error_t *
+revprop_generation_fixup(void *void_baton,
+ apr_pool_t *scratch_pool)
+{
+ revprop_generation_upgrade_t *baton = void_baton;
+ svn_fs_x__data_t *ffd = baton->fs->fsap_data;
+ assert(ffd->has_write_lock);
+
+ /* Make sure we don't operate on stale OS buffers. */
+ SVN_ERR(close_revprop_generation_file(baton->fs, scratch_pool));
+
+ /* Maybe, either the original revprop writer or some other reader has
+ already corrected / bumped the revprop generation. Thus, we need
+ to read it again. However, we will now be the only ones changing
+ the file contents due to us holding the write lock. */
+ SVN_ERR(read_revprop_generation_file(baton->generation, baton->fs,
+ scratch_pool));
+
+ /* Cause everyone to re-read revprops upon their next access, if the
+ last revprop write did not complete properly. */
+ if (*baton->generation % 2)
+ {
+ ++*baton->generation;
+ SVN_ERR(write_revprop_generation_file(baton->fs,
+ *baton->generation,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the current revprop generation and return it in *GENERATION.
+ Also, detect aborted / crashed writers and recover from that.
+ Use the access object in FS to set the shared mem values. */
+static svn_error_t *
+read_revprop_generation(apr_int64_t *generation,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ apr_int64_t current = 0;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* read the current revprop generation number */
+ SVN_ERR(read_revprop_generation_file(&current, fs, scratch_pool));
+
+ /* is an unfinished revprop write under the way? */
+ if (current % 2)
+ {
+ svn_boolean_t timeout = FALSE;
+
+ /* Has the writer process been aborted?
+ * Either by timeout or by us being the writer now.
+ */
+ if (!ffd->has_write_lock)
+ {
+ apr_time_t mtime;
+ SVN_ERR(svn_io_file_affected_time(&mtime,
+ svn_fs_x__path_revprop_generation(fs, scratch_pool),
+ scratch_pool));
+ timeout = apr_time_now() > mtime + REVPROP_CHANGE_TIMEOUT;
+ }
+
+ if (ffd->has_write_lock || timeout)
+ {
+ revprop_generation_upgrade_t baton;
+ baton.generation = &current;
+ baton.fs = fs;
+
+ /* Ensure that the original writer process no longer exists by
+ * acquiring the write lock to this repository. Then, fix up
+ * the revprop generation.
+ */
+ if (ffd->has_write_lock)
+ SVN_ERR(revprop_generation_fixup(&baton, scratch_pool));
+ else
+ SVN_ERR(svn_fs_x__with_write_lock(fs, revprop_generation_fixup,
+ &baton, scratch_pool));
+ }
+ }
+
+ /* return the value we just got */
+ *generation = current;
+ return SVN_NO_ERROR;
+}
+
+/* Set the revprop generation in FS to the next odd number to indicate
+ that there is a revprop write process under way. Return that value
+ in *GENERATION. If the change times out, readers shall recover from
+ that state & re-read revprops.
+ This is a no-op for repo formats that don't support revprop caching. */
+static svn_error_t *
+begin_revprop_change(apr_int64_t *generation,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ SVN_ERR_ASSERT(ffd->has_write_lock);
+
+ /* Close and re-open to make sure we read the latest data. */
+ SVN_ERR(close_revprop_generation_file(fs, scratch_pool));
+ SVN_ERR(open_revprop_generation_file(fs, FALSE, scratch_pool));
+
+ /* Set the revprop generation to an odd value to indicate
+ * that a write is in progress.
+ */
+ SVN_ERR(read_revprop_generation(generation, fs, scratch_pool));
+ ++*generation;
+ SVN_ERR(write_revprop_generation_file(fs, *generation, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Set the revprop generation in FS to the next even generation after
+ the odd value in GENERATION to indicate that
+ a) readers shall re-read revprops, and
+ b) the write process has been completed (no recovery required).
+ This is a no-op for repo formats that don't support revprop caching. */
+static svn_error_t *
+end_revprop_change(svn_fs_t *fs,
+ apr_int64_t generation,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ SVN_ERR_ASSERT(ffd->has_write_lock);
+ SVN_ERR_ASSERT(generation % 2);
+
+ /* Set the revprop generation to an even value to indicate
+ * that a write has been completed. Since we held the write
+ * lock, nobody else could have updated the file contents.
+ */
+ SVN_ERR(write_revprop_generation_file(fs, generation + 1, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Container for all data required to access the packed revprop file
+ * for a given REVISION. This structure will be filled incrementally
+ * by read_pack_revprops() its sub-routines.
+ */
+typedef struct packed_revprops_t
+{
+ /* revision number to read (not necessarily the first in the pack) */
+ svn_revnum_t revision;
+
+ /* current revprop generation. Used when populating the revprop cache */
+ apr_int64_t generation;
+
+ /* the actual revision properties */
+ apr_hash_t *properties;
+
+ /* their size when serialized to a single string
+ * (as found in PACKED_REVPROPS) */
+ apr_size_t serialized_size;
+
+
+ /* name of the pack file (without folder path) */
+ const char *filename;
+
+ /* packed shard folder path */
+ const char *folder;
+
+ /* sum of values in SIZES */
+ apr_size_t total_size;
+
+ /* first revision in the pack (>= MANIFEST_START) */
+ svn_revnum_t start_revision;
+
+ /* size of the revprops in PACKED_REVPROPS */
+ apr_array_header_t *sizes;
+
+ /* offset of the revprops in PACKED_REVPROPS */
+ apr_array_header_t *offsets;
+
+
+ /* concatenation of the serialized representation of all revprops
+ * in the pack, i.e. the pack content without header and compression */
+ svn_stringbuf_t *packed_revprops;
+
+ /* First revision covered by MANIFEST.
+ * Will equal the shard start revision or 1, for the 1st shard. */
+ svn_revnum_t manifest_start;
+
+ /* content of the manifest.
+ * Maps long(rev - MANIFEST_START) to const char* pack file name */
+ apr_array_header_t *manifest;
+} packed_revprops_t;
+
+/* Parse the serialized revprops in CONTENT and return them in *PROPERTIES.
+ * Also, put them into the revprop cache, if activated, for future use.
+ * Three more parameters are being used to update the revprop cache: FS is
+ * our file system, the revprops belong to REVISION and the global revprop
+ * GENERATION is used as well.
+ *
+ * The returned hash will be allocated in RESULT_POOL, SCRATCH_POOL is
+ * being used for temporary allocations.
+ */
+static svn_error_t *
+parse_revprop(apr_hash_t **properties,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_int64_t generation,
+ svn_string_t *content,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream = svn_stream_from_string(content, scratch_pool);
+ *properties = apr_hash_make(result_pool);
+
+ SVN_ERR(svn_hash_read2(*properties, stream, SVN_HASH_TERMINATOR,
+ result_pool));
+ if (has_revprop_cache(fs, scratch_pool))
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__pair_cache_key_t key = { 0 };
+
+ key.revision = revision;
+ key.second = generation;
+ SVN_ERR(svn_cache__set(ffd->revprop_cache, &key, *properties,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the non-packed revprops for revision REV in FS, put them into the
+ * revprop cache if activated and return them in *PROPERTIES. GENERATION
+ * is the current revprop generation.
+ *
+ * If the data could not be read due to an otherwise recoverable error,
+ * leave *PROPERTIES unchanged. No error will be returned in that case.
+ *
+ * Allocate *PROPERTIES in RESULT_POOL and temporaries in SCRATCH_POOL.
+ */
+static svn_error_t *
+read_non_packed_revprop(apr_hash_t **properties,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_int64_t generation,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *content = NULL;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_boolean_t missing = FALSE;
+ int i;
+
+ for (i = 0;
+ i < SVN_FS_X__RECOVERABLE_RETRY_COUNT && !missing && !content;
+ ++i)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_x__try_stringbuf_from_file(&content,
+ &missing,
+ svn_fs_x__path_revprops(fs, rev, iterpool),
+ i + 1 < SVN_FS_X__RECOVERABLE_RETRY_COUNT,
+ iterpool));
+ }
+
+ if (content)
+ SVN_ERR(parse_revprop(properties, fs, rev, generation,
+ svn_stringbuf__morph_into_string(content),
+ result_pool, iterpool));
+
+ svn_pool_clear(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the minimum length of any packed revprop file name in REVPROPS. */
+static apr_size_t
+get_min_filename_len(packed_revprops_t *revprops)
+{
+ char number_buffer[SVN_INT64_BUFFER_SIZE];
+
+ /* The revprop filenames have the format <REV>.<COUNT> - with <REV> being
+ * at least the first rev in the shard and <COUNT> having at least one
+ * digit. Thus, the minimum is 2 + #decimal places in the start rev.
+ */
+ return svn__i64toa(number_buffer, revprops->manifest_start) + 2;
+}
+
+/* Given FS and REVPROPS->REVISION, fill the FILENAME, FOLDER and MANIFEST
+ * members. Use RESULT_POOL for allocating results and SCRATCH_POOL for
+ * temporaries.
+ */
+static svn_error_t *
+get_revprop_packname(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *content = NULL;
+ const char *manifest_file_path;
+ int idx, rev_count;
+ char *buffer, *buffer_end;
+ const char **filenames, **filenames_end;
+ apr_size_t min_filename_len;
+
+ /* Determine the dimensions. Rev 0 is excluded from the first shard. */
+ rev_count = ffd->max_files_per_dir;
+ revprops->manifest_start
+ = revprops->revision - (revprops->revision % rev_count);
+ if (revprops->manifest_start == 0)
+ {
+ ++revprops->manifest_start;
+ --rev_count;
+ }
+
+ revprops->manifest = apr_array_make(result_pool, rev_count,
+ sizeof(const char*));
+
+ /* No line in the file can be less than this number of chars long. */
+ min_filename_len = get_min_filename_len(revprops);
+
+ /* Read the content of the manifest file */
+ revprops->folder
+ = svn_fs_x__path_revprops_pack_shard(fs, revprops->revision, result_pool);
+ manifest_file_path = svn_dirent_join(revprops->folder, PATH_MANIFEST,
+ result_pool);
+
+ SVN_ERR(svn_fs_x__read_content(&content, manifest_file_path, result_pool));
+
+ /* There CONTENT must have a certain minimal size and there no
+ * unterminated lines at the end of the file. Both guarantees also
+ * simplify the parser loop below.
+ */
+ if ( content->len < rev_count * (min_filename_len + 1)
+ || content->data[content->len - 1] != '\n')
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld not "
+ "properly terminated"), revprops->revision);
+
+ /* Chop (parse) the manifest CONTENT into filenames, one per line.
+ * We only have to replace all newlines with NUL and add all line
+ * starts to REVPROPS->MANIFEST.
+ *
+ * There must be exactly REV_COUNT lines and that is the number of
+ * lines we parse from BUFFER to FILENAMES. Set the end pointer for
+ * the source BUFFER such that BUFFER+MIN_FILENAME_LEN is still valid
+ * BUFFER_END is always valid due to CONTENT->LEN > MIN_FILENAME_LEN.
+ *
+ * Please note that this loop is performance critical for e.g. 'svn log'.
+ * It is run 1000x per revprop access, i.e. per revision and about
+ * 50 million times per sec (and CPU core).
+ */
+ for (filenames = (const char **)revprops->manifest->elts,
+ filenames_end = filenames + rev_count,
+ buffer = content->data,
+ buffer_end = buffer + content->len - min_filename_len;
+ (filenames < filenames_end) && (buffer < buffer_end);
+ ++filenames)
+ {
+ /* BUFFER always points to the start of the next line / filename. */
+ *filenames = buffer;
+
+ /* Find the next EOL. This is guaranteed to stay within the CONTENT
+ * buffer because we left enough room after BUFFER_END and we know
+ * we will always see a newline as the last non-NUL char. */
+ buffer += min_filename_len;
+ while (*buffer != '\n')
+ ++buffer;
+
+ /* Found EOL. Turn it into the filename terminator and move BUFFER
+ * to the start of the next line or CONTENT buffer end. */
+ *buffer = '\0';
+ ++buffer;
+ }
+
+ /* We must have reached the end of both buffers. */
+ if (buffer < content->data + content->len)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld "
+ "has too many entries"), revprops->revision);
+
+ if (filenames < filenames_end)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop manifest for r%ld "
+ "has too few entries"), revprops->revision);
+
+ /* The target array has now exactly one entry per revision. */
+ revprops->manifest->nelts = rev_count;
+
+ /* Now get the file name */
+ idx = (int)(revprops->revision - revprops->manifest_start);
+ revprops->filename = APR_ARRAY_IDX(revprops->manifest, idx, const char*);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE, if revision R1 and R2 refer to the same shard in FS.
+ */
+static svn_boolean_t
+same_shard(svn_fs_t *fs,
+ svn_revnum_t r1,
+ svn_revnum_t r2)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ return (r1 / ffd->max_files_per_dir) == (r2 / ffd->max_files_per_dir);
+}
+
+/* Given FS and the full packed file content in REVPROPS->PACKED_REVPROPS,
+ * fill the START_REVISION member, and make PACKED_REVPROPS point to the
+ * first serialized revprop. If READ_ALL is set, initialize the SIZES
+ * and OFFSETS members as well.
+ *
+ * Parse the revprops for REVPROPS->REVISION and set the PROPERTIES as
+ * well as the SERIALIZED_SIZE member. If revprop caching has been
+ * enabled, parse all revprops in the pack and cache them.
+ */
+static svn_error_t *
+parse_packed_revprops(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ svn_boolean_t read_all,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream;
+ apr_int64_t first_rev, count, i;
+ apr_off_t offset;
+ const char *header_end;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_boolean_t cache_all = has_revprop_cache(fs, scratch_pool);
+
+ /* decompress (even if the data is only "stored", there is still a
+ * length header to remove) */
+ svn_stringbuf_t *compressed = revprops->packed_revprops;
+ svn_stringbuf_t *uncompressed = svn_stringbuf_create_empty(result_pool);
+ SVN_ERR(svn__decompress(compressed, uncompressed, APR_SIZE_MAX));
+
+ /* read first revision number and number of revisions in the pack */
+ stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
+ SVN_ERR(svn_fs_x__read_number_from_stream(&first_rev, NULL, stream,
+ iterpool));
+ SVN_ERR(svn_fs_x__read_number_from_stream(&count, NULL, stream, iterpool));
+
+ /* Check revision range for validity. */
+ if ( !same_shard(fs, revprops->revision, first_rev)
+ || !same_shard(fs, revprops->revision, first_rev + count - 1)
+ || count < 1)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revprop pack for revision r%ld"
+ " contains revprops for r%ld .. r%ld"),
+ revprops->revision,
+ (svn_revnum_t)first_rev,
+ (svn_revnum_t)(first_rev + count -1));
+
+ /* Since start & end are in the same shard, it is enough to just test
+ * the FIRST_REV for being actually packed. That will also cover the
+ * special case of rev 0 never being packed. */
+ if (!svn_fs_x__is_packed_revprop(fs, first_rev))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Revprop pack for revision r%ld"
+ " starts at non-packed revisions r%ld"),
+ revprops->revision, (svn_revnum_t)first_rev);
+
+ /* make PACKED_REVPROPS point to the first char after the header.
+ * This is where the serialized revprops are. */
+ header_end = strstr(uncompressed->data, "\n\n");
+ if (header_end == NULL)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Header end not found"));
+
+ offset = header_end - uncompressed->data + 2;
+
+ revprops->packed_revprops = svn_stringbuf_create_empty(result_pool);
+ revprops->packed_revprops->data = uncompressed->data + offset;
+ revprops->packed_revprops->len = (apr_size_t)(uncompressed->len - offset);
+ revprops->packed_revprops->blocksize = (apr_size_t)(uncompressed->blocksize - offset);
+
+ /* STREAM still points to the first entry in the sizes list. */
+ revprops->start_revision = (svn_revnum_t)first_rev;
+ if (read_all)
+ {
+ /* Init / construct REVPROPS members. */
+ revprops->sizes = apr_array_make(result_pool, (int)count,
+ sizeof(offset));
+ revprops->offsets = apr_array_make(result_pool, (int)count,
+ sizeof(offset));
+ }
+
+ /* Now parse, revision by revision, the size and content of each
+ * revisions' revprops. */
+ for (i = 0, offset = 0, revprops->total_size = 0; i < count; ++i)
+ {
+ apr_int64_t size;
+ svn_string_t serialized;
+ svn_revnum_t revision = (svn_revnum_t)(first_rev + i);
+ svn_pool_clear(iterpool);
+
+ /* read & check the serialized size */
+ SVN_ERR(svn_fs_x__read_number_from_stream(&size, NULL, stream,
+ iterpool));
+ if (size + offset > (apr_int64_t)revprops->packed_revprops->len)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed revprop size exceeds pack file size"));
+
+ /* Parse this revprops list, if necessary */
+ serialized.data = revprops->packed_revprops->data + offset;
+ serialized.len = (apr_size_t)size;
+
+ if (revision == revprops->revision)
+ {
+ /* Parse (and possibly cache) the one revprop list we care about. */
+ SVN_ERR(parse_revprop(&revprops->properties, fs, revision,
+ revprops->generation, &serialized,
+ result_pool, iterpool));
+ revprops->serialized_size = serialized.len;
+
+ /* If we only wanted the revprops for REVISION then we are done. */
+ if (!read_all && !cache_all)
+ break;
+ }
+ else if (cache_all)
+ {
+ /* Parse and cache all other revprop lists. */
+ apr_hash_t *properties;
+ SVN_ERR(parse_revprop(&properties, fs, revision,
+ revprops->generation, &serialized,
+ iterpool, iterpool));
+ }
+
+ if (read_all)
+ {
+ /* fill REVPROPS data structures */
+ APR_ARRAY_PUSH(revprops->sizes, apr_off_t) = serialized.len;
+ APR_ARRAY_PUSH(revprops->offsets, apr_off_t) = offset;
+ }
+ revprops->total_size += serialized.len;
+
+ offset += serialized.len;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* In filesystem FS, read the packed revprops for revision REV into
+ * *REVPROPS. Use GENERATION to populate the revprop cache, if enabled.
+ * If you want to modify revprop contents / update REVPROPS, READ_ALL
+ * must be set. Otherwise, only the properties of REV are being provided.
+ *
+ * Allocate *PROPERTIES in RESULT_POOL and temporaries in SCRATCH_POOL.
+ */
+static svn_error_t *
+read_pack_revprop(packed_revprops_t **revprops,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_int64_t generation,
+ svn_boolean_t read_all,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_boolean_t missing = FALSE;
+ svn_error_t *err;
+ packed_revprops_t *result;
+ int i;
+
+ /* someone insisted that REV is packed. Double-check if necessary */
+ if (!svn_fs_x__is_packed_revprop(fs, rev))
+ SVN_ERR(svn_fs_x__update_min_unpacked_rev(fs, iterpool));
+
+ if (!svn_fs_x__is_packed_revprop(fs, rev))
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such packed revision %ld"), rev);
+
+ /* initialize the result data structure */
+ result = apr_pcalloc(result_pool, sizeof(*result));
+ result->revision = rev;
+ result->generation = generation;
+
+ /* try to read the packed revprops. This may require retries if we have
+ * concurrent writers. */
+ for (i = 0;
+ i < SVN_FS_X__RECOVERABLE_RETRY_COUNT && !result->packed_revprops;
+ ++i)
+ {
+ const char *file_path;
+ svn_pool_clear(iterpool);
+
+ /* there might have been concurrent writes.
+ * Re-read the manifest and the pack file.
+ */
+ SVN_ERR(get_revprop_packname(fs, result, result_pool, iterpool));
+ file_path = svn_dirent_join(result->folder,
+ result->filename,
+ iterpool);
+ SVN_ERR(svn_fs_x__try_stringbuf_from_file(&result->packed_revprops,
+ &missing,
+ file_path,
+ i + 1 < SVN_FS_X__RECOVERABLE_RETRY_COUNT,
+ result_pool));
+
+ /* If we could not find the file, there was a write.
+ * So, we should refresh our revprop generation info as well such
+ * that others may find data we will put into the cache. They would
+ * consider it outdated, otherwise.
+ */
+ if (missing && has_revprop_cache(fs, iterpool))
+ SVN_ERR(read_revprop_generation(&result->generation, fs, iterpool));
+ }
+
+ /* the file content should be available now */
+ if (!result->packed_revprops)
+ return svn_error_createf(SVN_ERR_FS_PACKED_REVPROP_READ_FAILURE, NULL,
+ _("Failed to read revprop pack file for r%ld"), rev);
+
+ /* parse it. RESULT will be complete afterwards. */
+ err = parse_packed_revprops(fs, result, read_all, result_pool, iterpool);
+ svn_pool_destroy(iterpool);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ _("Revprop pack file for r%ld is corrupt"), rev);
+
+ *revprops = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the revprops for revision REV in FS and return them in *PROPERTIES_P.
+ *
+ * Allocations will be done in POOL.
+ */
+svn_error_t *
+svn_fs_x__get_revision_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t bypass_cache,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_int64_t generation = 0;
+
+ /* not found, yet */
+ *proplist_p = NULL;
+
+ /* should they be available at all? */
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
+
+ /* Try cache lookup first. */
+ if (!bypass_cache && has_revprop_cache(fs, scratch_pool))
+ {
+ svn_boolean_t is_cached;
+ svn_fs_x__pair_cache_key_t key = { 0 };
+
+ SVN_ERR(read_revprop_generation(&generation, fs, scratch_pool));
+
+ key.revision = rev;
+ key.second = generation;
+ SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
+ ffd->revprop_cache, &key, result_pool));
+ if (is_cached)
+ return SVN_NO_ERROR;
+ }
+
+ /* if REV had not been packed when we began, try reading it from the
+ * non-packed shard. If that fails, we will fall through to packed
+ * shard reads. */
+ if (!svn_fs_x__is_packed_revprop(fs, rev))
+ {
+ svn_error_t *err = read_non_packed_revprop(proplist_p, fs, rev,
+ generation, result_pool,
+ scratch_pool);
+ if (err)
+ {
+ if (!APR_STATUS_IS_ENOENT(err->apr_err))
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ *proplist_p = NULL; /* in case read_non_packed_revprop changed it */
+ }
+ }
+
+ /* if revprop packing is available and we have not read the revprops, yet,
+ * try reading them from a packed shard. If that fails, REV is most
+ * likely invalid (or its revprops highly contested). */
+ if (!*proplist_p)
+ {
+ packed_revprops_t *revprops;
+ SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, FALSE,
+ result_pool, scratch_pool));
+ *proplist_p = revprops->properties;
+ }
+
+ /* The revprops should have been there. Did we get them? */
+ if (!*proplist_p)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("Could not read revprops for revision %ld"),
+ rev);
+
+ return SVN_NO_ERROR;
+}
+
+/* Serialize the revision property list PROPLIST of revision REV in
+ * filesystem FS to a non-packed file. Return the name of that temporary
+ * file in *TMP_PATH and the file path that it must be moved to in
+ * *FINAL_PATH.
+ *
+ * Allocate *FINAL_PATH and *TMP_PATH in RESULT_POOL. Use SCRATCH_POOL
+ * for temporary allocations.
+ */
+static svn_error_t *
+write_non_packed_revprop(const char **final_path,
+ const char **tmp_path,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *stream;
+ *final_path = svn_fs_x__path_revprops(fs, rev, result_pool);
+
+ /* ### do we have a directory sitting around already? we really shouldn't
+ ### have to get the dirname here. */
+ SVN_ERR(svn_stream_open_unique(&stream, tmp_path,
+ svn_dirent_dirname(*final_path,
+ scratch_pool),
+ svn_io_file_del_none,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ return SVN_NO_ERROR;
+}
+
+/* After writing the new revprop file(s), call this function to move the
+ * file at TMP_PATH to FINAL_PATH and give it the permissions from
+ * PERMS_REFERENCE.
+ *
+ * If indicated in BUMP_GENERATION, increase FS' revprop generation.
+ * Finally, delete all the temporary files given in FILES_TO_DELETE.
+ * The latter may be NULL.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+switch_to_new_revprop(svn_fs_t *fs,
+ const char *final_path,
+ const char *tmp_path,
+ const char *perms_reference,
+ apr_array_header_t *files_to_delete,
+ svn_boolean_t bump_generation,
+ apr_pool_t *scratch_pool)
+{
+ apr_int64_t generation;
+
+ /* Now, we may actually be replacing revprops. Make sure that all other
+ threads and processes will know about this. */
+ if (bump_generation)
+ SVN_ERR(begin_revprop_change(&generation, fs, scratch_pool));
+
+ SVN_ERR(svn_fs_x__move_into_place(tmp_path, final_path, perms_reference,
+ scratch_pool));
+
+ /* Indicate that the update (if relevant) has been completed. */
+ if (bump_generation)
+ SVN_ERR(end_revprop_change(fs, generation, scratch_pool));
+
+ /* Clean up temporary files, if necessary. */
+ if (files_to_delete)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ for (i = 0; i < files_to_delete->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(files_to_delete, i, const char*);
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+ return SVN_NO_ERROR;
+}
+
+/* Write a pack file header to STREAM that starts at revision START_REVISION
+ * and contains the indexes [START,END) of SIZES.
+ */
+static svn_error_t *
+serialize_revprops_header(svn_stream_t *stream,
+ svn_revnum_t start_revision,
+ apr_array_header_t *sizes,
+ int start,
+ int end,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ SVN_ERR_ASSERT(start < end);
+
+ /* start revision and entry count */
+ SVN_ERR(svn_stream_printf(stream, scratch_pool, "%ld\n", start_revision));
+ SVN_ERR(svn_stream_printf(stream, scratch_pool, "%d\n", end - start));
+
+ /* the sizes array */
+ for (i = start; i < end; ++i)
+ {
+ /* Non-standard pool usage.
+ *
+ * We only allocate a few bytes each iteration -- even with a
+ * million iterations we would still be in good shape memory-wise.
+ */
+ apr_off_t size = APR_ARRAY_IDX(sizes, i, apr_off_t);
+ SVN_ERR(svn_stream_printf(stream, iterpool, "%" APR_OFF_T_FMT "\n",
+ size));
+ }
+
+ /* the double newline char indicates the end of the header */
+ SVN_ERR(svn_stream_printf(stream, iterpool, "\n"));
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Writes the a pack file to FILE_STREAM. It copies the serialized data
+ * from REVPROPS for the indexes [START,END) except for index CHANGED_INDEX.
+ *
+ * The data for the latter is taken from NEW_SERIALIZED. Note, that
+ * CHANGED_INDEX may be outside the [START,END) range, i.e. no new data is
+ * taken in that case but only a subset of the old data will be copied.
+ *
+ * NEW_TOTAL_SIZE is a hint for pre-allocating buffers of appropriate size.
+ * SCRATCH_POOL is used for temporary allocations.
+ */
+static svn_error_t *
+repack_revprops(svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ int start,
+ int end,
+ int changed_index,
+ svn_stringbuf_t *new_serialized,
+ apr_off_t new_total_size,
+ svn_stream_t *file_stream,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stream_t *stream;
+ int i;
+
+ /* create data empty buffers and the stream object */
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure((apr_size_t)new_total_size, scratch_pool);
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_empty(scratch_pool);
+ stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
+
+ /* write the header*/
+ SVN_ERR(serialize_revprops_header(stream, revprops->start_revision + start,
+ revprops->sizes, start, end,
+ scratch_pool));
+
+ /* append the serialized revprops */
+ for (i = start; i < end; ++i)
+ if (i == changed_index)
+ {
+ SVN_ERR(svn_stream_write(stream,
+ new_serialized->data,
+ &new_serialized->len));
+ }
+ else
+ {
+ apr_size_t size
+ = (apr_size_t)APR_ARRAY_IDX(revprops->sizes, i, apr_off_t);
+ apr_size_t offset
+ = (apr_size_t)APR_ARRAY_IDX(revprops->offsets, i, apr_off_t);
+
+ SVN_ERR(svn_stream_write(stream,
+ revprops->packed_revprops->data + offset,
+ &size));
+ }
+
+ /* flush the stream buffer (if any) to our underlying data buffer */
+ SVN_ERR(svn_stream_close(stream));
+
+ /* compress / store the data */
+ SVN_ERR(svn__compress(uncompressed,
+ compressed,
+ ffd->compress_packed_revprops
+ ? SVN_DELTA_COMPRESSION_LEVEL_DEFAULT
+ : SVN_DELTA_COMPRESSION_LEVEL_NONE));
+
+ /* finally, write the content to the target stream and close it */
+ SVN_ERR(svn_stream_write(file_stream, compressed->data, &compressed->len));
+ SVN_ERR(svn_stream_close(file_stream));
+
+ return SVN_NO_ERROR;
+}
+
+/* Allocate a new pack file name for revisions
+ * [REVPROPS->START_REVISION + START, REVPROPS->START_REVISION + END - 1]
+ * of REVPROPS->MANIFEST. Add the name of old file to FILES_TO_DELETE,
+ * auto-create that array if necessary. Return an open file stream to
+ * the new file in *STREAM allocated in RESULT_POOL. Allocate the paths
+ * in *FILES_TO_DELETE from the same pool that contains the array itself.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+repack_stream_open(svn_stream_t **stream,
+ svn_fs_t *fs,
+ packed_revprops_t *revprops,
+ int start,
+ int end,
+ apr_array_header_t **files_to_delete,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_int64_t tag;
+ const char *tag_string;
+ svn_string_t *new_filename;
+ int i;
+ apr_file_t *file;
+ int manifest_offset
+ = (int)(revprops->start_revision - revprops->manifest_start);
+
+ /* get the old (= current) file name and enlist it for later deletion */
+ const char *old_filename = APR_ARRAY_IDX(revprops->manifest,
+ start + manifest_offset,
+ const char*);
+
+ if (*files_to_delete == NULL)
+ *files_to_delete = apr_array_make(result_pool, 3, sizeof(const char*));
+
+ APR_ARRAY_PUSH(*files_to_delete, const char*)
+ = svn_dirent_join(revprops->folder, old_filename,
+ (*files_to_delete)->pool);
+
+ /* increase the tag part, i.e. the counter after the dot */
+ tag_string = strchr(old_filename, '.');
+ if (tag_string == NULL)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Packed file '%s' misses a tag"),
+ old_filename);
+
+ SVN_ERR(svn_cstring_atoi64(&tag, tag_string + 1));
+ new_filename = svn_string_createf((*files_to_delete)->pool,
+ "%ld.%" APR_INT64_T_FMT,
+ revprops->start_revision + start,
+ ++tag);
+
+ /* update the manifest to point to the new file */
+ for (i = start; i < end; ++i)
+ APR_ARRAY_IDX(revprops->manifest, i + manifest_offset, const char*)
+ = new_filename->data;
+
+ /* create a file stream for the new file */
+ SVN_ERR(svn_io_file_open(&file, svn_dirent_join(revprops->folder,
+ new_filename->data,
+ scratch_pool),
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
+ result_pool));
+ *stream = svn_stream_from_aprfile2(file, FALSE, result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* For revision REV in filesystem FS, set the revision properties to
+ * PROPLIST. Return a new file in *TMP_PATH that the caller shall move
+ * to *FINAL_PATH to make the change visible. Files to be deleted will
+ * be listed in *FILES_TO_DELETE which may remain unchanged / unallocated.
+ *
+ * Allocate output values in RESULT_POOL and temporaries from SCRATCH_POOL.
+ */
+static svn_error_t *
+write_packed_revprop(const char **final_path,
+ const char **tmp_path,
+ apr_array_header_t **files_to_delete,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ packed_revprops_t *revprops;
+ apr_int64_t generation = 0;
+ svn_stream_t *stream;
+ svn_stringbuf_t *serialized;
+ apr_off_t new_total_size;
+ int changed_index;
+
+ /* read the current revprop generation. This value will not change
+ * while we hold the global write lock to this FS. */
+ if (has_revprop_cache(fs, scratch_pool))
+ SVN_ERR(read_revprop_generation(&generation, fs, scratch_pool));
+
+ /* read contents of the current pack file */
+ SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, TRUE,
+ scratch_pool, scratch_pool));
+
+ /* serialize the new revprops */
+ serialized = svn_stringbuf_create_empty(scratch_pool);
+ stream = svn_stream_from_stringbuf(serialized, scratch_pool);
+ SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* calculate the size of the new data */
+ changed_index = (int)(rev - revprops->start_revision);
+ new_total_size = revprops->total_size - revprops->serialized_size
+ + serialized->len
+ + (revprops->offsets->nelts + 2) * SVN_INT64_BUFFER_SIZE;
+
+ APR_ARRAY_IDX(revprops->sizes, changed_index, apr_off_t) = serialized->len;
+
+ /* can we put the new data into the same pack as the before? */
+ if ( new_total_size < ffd->revprop_pack_size
+ || revprops->sizes->nelts == 1)
+ {
+ /* simply replace the old pack file with new content as we do it
+ * in the non-packed case */
+
+ *final_path = svn_dirent_join(revprops->folder, revprops->filename,
+ result_pool);
+ SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder,
+ svn_io_file_del_none, result_pool,
+ scratch_pool));
+ SVN_ERR(repack_revprops(fs, revprops, 0, revprops->sizes->nelts,
+ changed_index, serialized, new_total_size,
+ stream, scratch_pool));
+ }
+ else
+ {
+ /* split the pack file into two of roughly equal size */
+ int right_count, left_count, i;
+
+ int left = 0;
+ int right = revprops->sizes->nelts - 1;
+ apr_off_t left_size = 2 * SVN_INT64_BUFFER_SIZE;
+ apr_off_t right_size = 2 * SVN_INT64_BUFFER_SIZE;
+
+ /* let left and right side grow such that their size difference
+ * is minimal after each step. */
+ while (left <= right)
+ if ( left_size + APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
+ < right_size + APR_ARRAY_IDX(revprops->sizes, right, apr_off_t))
+ {
+ left_size += APR_ARRAY_IDX(revprops->sizes, left, apr_off_t)
+ + SVN_INT64_BUFFER_SIZE;
+ ++left;
+ }
+ else
+ {
+ right_size += APR_ARRAY_IDX(revprops->sizes, right, apr_off_t)
+ + SVN_INT64_BUFFER_SIZE;
+ --right;
+ }
+
+ /* since the items need much less than SVN_INT64_BUFFER_SIZE
+ * bytes to represent their length, the split may not be optimal */
+ left_count = left;
+ right_count = revprops->sizes->nelts - left;
+
+ /* if new_size is large, one side may exceed the pack size limit.
+ * In that case, split before and after the modified revprop.*/
+ if ( left_size > ffd->revprop_pack_size
+ || right_size > ffd->revprop_pack_size)
+ {
+ left_count = changed_index;
+ right_count = revprops->sizes->nelts - left_count - 1;
+ }
+
+ /* Allocate this here such that we can call the repack functions with
+ * the scratch pool alone. */
+ if (*files_to_delete == NULL)
+ *files_to_delete = apr_array_make(result_pool, 3,
+ sizeof(const char*));
+
+ /* write the new, split files */
+ if (left_count)
+ {
+ SVN_ERR(repack_stream_open(&stream, fs, revprops, 0,
+ left_count, files_to_delete,
+ scratch_pool, scratch_pool));
+ SVN_ERR(repack_revprops(fs, revprops, 0, left_count,
+ changed_index, serialized, new_total_size,
+ stream, scratch_pool));
+ }
+
+ if (left_count + right_count < revprops->sizes->nelts)
+ {
+ SVN_ERR(repack_stream_open(&stream, fs, revprops, changed_index,
+ changed_index + 1, files_to_delete,
+ scratch_pool, scratch_pool));
+ SVN_ERR(repack_revprops(fs, revprops, changed_index,
+ changed_index + 1,
+ changed_index, serialized, new_total_size,
+ stream, scratch_pool));
+ }
+
+ if (right_count)
+ {
+ SVN_ERR(repack_stream_open(&stream, fs, revprops,
+ revprops->sizes->nelts - right_count,
+ revprops->sizes->nelts,
+ files_to_delete, scratch_pool,
+ scratch_pool));
+ SVN_ERR(repack_revprops(fs, revprops,
+ revprops->sizes->nelts - right_count,
+ revprops->sizes->nelts, changed_index,
+ serialized, new_total_size, stream,
+ scratch_pool));
+ }
+
+ /* write the new manifest */
+ *final_path = svn_dirent_join(revprops->folder, PATH_MANIFEST,
+ result_pool);
+ SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder,
+ svn_io_file_del_none, result_pool,
+ scratch_pool));
+
+ for (i = 0; i < revprops->manifest->nelts; ++i)
+ {
+ const char *filename = APR_ARRAY_IDX(revprops->manifest, i,
+ const char*);
+ SVN_ERR(svn_stream_printf(stream, scratch_pool, "%s\n", filename));
+ }
+
+ SVN_ERR(svn_stream_close(stream));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set the revision property list of revision REV in filesystem FS to
+ PROPLIST. Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__set_revision_proplist(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t is_packed;
+ svn_boolean_t bump_generation = FALSE;
+ const char *final_path;
+ const char *tmp_path;
+ const char *perms_reference;
+ apr_array_header_t *files_to_delete = NULL;
+
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
+
+ /* this info will not change while we hold the global FS write lock */
+ is_packed = svn_fs_x__is_packed_revprop(fs, rev);
+
+ /* Test whether revprops already exist for this revision.
+ * Only then will we need to bump the revprop generation.
+ * The fact that they did not yet exist is never cached. */
+ if (is_packed)
+ {
+ bump_generation = TRUE;
+ }
+ else
+ {
+ svn_node_kind_t kind;
+ SVN_ERR(svn_io_check_path(svn_fs_x__path_revprops(fs, rev,
+ scratch_pool),
+ &kind, scratch_pool));
+ bump_generation = kind != svn_node_none;
+ }
+
+ /* Serialize the new revprop data */
+ if (is_packed)
+ SVN_ERR(write_packed_revprop(&final_path, &tmp_path, &files_to_delete,
+ fs, rev, proplist, scratch_pool,
+ scratch_pool));
+ else
+ SVN_ERR(write_non_packed_revprop(&final_path, &tmp_path,
+ fs, rev, proplist, scratch_pool,
+ scratch_pool));
+
+ /* We use the rev file of this revision as the perms reference,
+ * because when setting revprops for the first time, the revprop
+ * file won't exist and therefore can't serve as its own reference.
+ * (Whereas the rev file should already exist at this point.)
+ */
+ perms_reference = svn_fs_x__path_rev_absolute(fs, rev, scratch_pool);
+
+ /* Now, switch to the new revprop data. */
+ SVN_ERR(switch_to_new_revprop(fs, final_path, tmp_path, perms_reference,
+ files_to_delete, bump_generation,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE, if for REVISION in FS, we can find the revprop pack file.
+ * Use SCRATCH_POOL for temporary allocations.
+ * Set *MISSING, if the reason is a missing manifest or pack file.
+ */
+svn_boolean_t
+svn_fs_x__packed_revprop_available(svn_boolean_t *missing,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_stringbuf_t *content = NULL;
+
+ /* try to read the manifest file */
+ const char *folder = svn_fs_x__path_revprops_pack_shard(fs, revision,
+ scratch_pool);
+ const char *manifest_path = svn_dirent_join(folder, PATH_MANIFEST,
+ scratch_pool);
+
+ svn_error_t *err = svn_fs_x__try_stringbuf_from_file(&content,
+ missing,
+ manifest_path,
+ FALSE,
+ scratch_pool);
+
+ /* if the manifest cannot be read, consider the pack files inaccessible
+ * even if the file itself exists. */
+ if (err)
+ {
+ svn_error_clear(err);
+ return FALSE;
+ }
+
+ if (*missing)
+ return FALSE;
+
+ /* parse manifest content until we find the entry for REVISION.
+ * Revision 0 is never packed. */
+ revision = revision < ffd->max_files_per_dir
+ ? revision - 1
+ : revision % ffd->max_files_per_dir;
+ while (content->data)
+ {
+ char *next = strchr(content->data, '\n');
+ if (next)
+ {
+ *next = 0;
+ ++next;
+ }
+
+ if (revision-- == 0)
+ {
+ /* the respective pack file must exist (and be a file) */
+ svn_node_kind_t kind;
+ err = svn_io_check_path(svn_dirent_join(folder, content->data,
+ scratch_pool),
+ &kind, scratch_pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ return FALSE;
+ }
+
+ *missing = kind == svn_node_none;
+ return kind == svn_node_file;
+ }
+
+ content->data = next;
+ }
+
+ return FALSE;
+}
+
+
+/****** Packing FSX shards *********/
+
+svn_error_t *
+svn_fs_x__copy_revprops(const char *pack_file_dir,
+ const char *pack_filename,
+ const char *shard_path,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ apr_array_header_t *sizes,
+ apr_size_t total_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_stream_t *pack_stream;
+ apr_file_t *pack_file;
+ svn_revnum_t rev;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_stream_t *stream;
+
+ /* create empty data buffer and a write stream on top of it */
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure(total_size, scratch_pool);
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_empty(scratch_pool);
+ pack_stream = svn_stream_from_stringbuf(uncompressed, scratch_pool);
+
+ /* write the pack file header */
+ SVN_ERR(serialize_revprops_header(pack_stream, start_rev, sizes, 0,
+ sizes->nelts, iterpool));
+
+ /* Some useful paths. */
+ SVN_ERR(svn_io_file_open(&pack_file, svn_dirent_join(pack_file_dir,
+ pack_filename,
+ scratch_pool),
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
+ scratch_pool));
+
+ /* Iterate over the revisions in this shard, squashing them together. */
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ const char *path;
+
+ svn_pool_clear(iterpool);
+
+ /* Construct the file name. */
+ path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
+ iterpool);
+
+ /* Copy all the bits from the non-packed revprop file to the end of
+ * the pack file. */
+ SVN_ERR(svn_stream_open_readonly(&stream, path, iterpool, iterpool));
+ SVN_ERR(svn_stream_copy3(stream, pack_stream,
+ cancel_func, cancel_baton, iterpool));
+ }
+
+ /* flush stream buffers to content buffer */
+ SVN_ERR(svn_stream_close(pack_stream));
+
+ /* compress the content (or just store it for COMPRESSION_LEVEL 0) */
+ SVN_ERR(svn__compress(uncompressed, compressed, compression_level));
+
+ /* write the pack file content to disk */
+ stream = svn_stream_from_aprfile2(pack_file, FALSE, scratch_pool);
+ SVN_ERR(svn_stream_write(stream, compressed->data, &compressed->len));
+ SVN_ERR(svn_stream_close(stream));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__pack_revprops_shard(const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_off_t max_pack_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *manifest_file_path, *pack_filename = NULL;
+ svn_stream_t *manifest_stream;
+ svn_revnum_t start_rev, end_rev, rev;
+ apr_off_t total_size;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *sizes;
+
+ /* Some useful paths. */
+ manifest_file_path = svn_dirent_join(pack_file_dir, PATH_MANIFEST,
+ scratch_pool);
+
+ /* Remove any existing pack file for this shard, since it is incomplete. */
+ SVN_ERR(svn_io_remove_dir2(pack_file_dir, TRUE, cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* Create the new directory and manifest file stream. */
+ SVN_ERR(svn_io_dir_make(pack_file_dir, APR_OS_DEFAULT, scratch_pool));
+ SVN_ERR(svn_stream_open_writable(&manifest_stream, manifest_file_path,
+ scratch_pool, scratch_pool));
+
+ /* revisions to handle. Special case: revision 0 */
+ start_rev = (svn_revnum_t) (shard * max_files_per_dir);
+ end_rev = (svn_revnum_t) ((shard + 1) * (max_files_per_dir) - 1);
+ if (start_rev == 0)
+ ++start_rev;
+ /* Special special case: if max_files_per_dir is 1, then at this point
+ start_rev == 1 and end_rev == 0 (!). Fortunately, everything just
+ works. */
+
+ /* initialize the revprop size info */
+ sizes = apr_array_make(scratch_pool, max_files_per_dir, sizeof(apr_off_t));
+ total_size = 2 * SVN_INT64_BUFFER_SIZE;
+
+ /* Iterate over the revisions in this shard, determine their size and
+ * squashing them together into pack files. */
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ apr_finfo_t finfo;
+ const char *path;
+
+ svn_pool_clear(iterpool);
+
+ /* Get the size of the file. */
+ path = svn_dirent_join(shard_path, apr_psprintf(iterpool, "%ld", rev),
+ iterpool);
+ SVN_ERR(svn_io_stat(&finfo, path, APR_FINFO_SIZE, iterpool));
+
+ /* if we already have started a pack file and this revprop cannot be
+ * appended to it, write the previous pack file. */
+ if (sizes->nelts != 0 &&
+ total_size + SVN_INT64_BUFFER_SIZE + finfo.size > max_pack_size)
+ {
+ SVN_ERR(svn_fs_x__copy_revprops(pack_file_dir, pack_filename,
+ shard_path, start_rev, rev-1,
+ sizes, (apr_size_t)total_size,
+ compression_level, cancel_func,
+ cancel_baton, iterpool));
+
+ /* next pack file starts empty again */
+ apr_array_clear(sizes);
+ total_size = 2 * SVN_INT64_BUFFER_SIZE;
+ start_rev = rev;
+ }
+
+ /* Update the manifest. Allocate a file name for the current pack
+ * file if it is a new one */
+ if (sizes->nelts == 0)
+ pack_filename = apr_psprintf(scratch_pool, "%ld.0", rev);
+
+ SVN_ERR(svn_stream_printf(manifest_stream, iterpool, "%s\n",
+ pack_filename));
+
+ /* add to list of files to put into the current pack file */
+ APR_ARRAY_PUSH(sizes, apr_off_t) = finfo.size;
+ total_size += SVN_INT64_BUFFER_SIZE + finfo.size;
+ }
+
+ /* write the last pack file */
+ if (sizes->nelts != 0)
+ SVN_ERR(svn_fs_x__copy_revprops(pack_file_dir, pack_filename, shard_path,
+ start_rev, rev-1, sizes,
+ (apr_size_t)total_size, compression_level,
+ cancel_func, cancel_baton, iterpool));
+
+ /* flush the manifest file and update permissions */
+ SVN_ERR(svn_stream_close(manifest_stream));
+ SVN_ERR(svn_io_copy_perms(shard_path, pack_file_dir, iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__delete_revprops_shard(const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ if (shard == 0)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* delete all files except the one for revision 0 */
+ for (i = 1; i < max_files_per_dir; ++i)
+ {
+ const char *path;
+ svn_pool_clear(iterpool);
+
+ path = svn_dirent_join(shard_path,
+ apr_psprintf(iterpool, "%d", i),
+ iterpool);
+ if (cancel_func)
+ SVN_ERR((*cancel_func)(cancel_baton));
+
+ SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+ else
+ SVN_ERR(svn_io_remove_dir2(shard_path, TRUE,
+ cancel_func, cancel_baton, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
diff --git a/subversion/libsvn_fs_x/revprops.h b/subversion/libsvn_fs_x/revprops.h
new file mode 100644
index 0000000..c4827c4
--- /dev/null
+++ b/subversion/libsvn_fs_x/revprops.h
@@ -0,0 +1,184 @@
+/* revprops.h --- everything needed to handle revprops in FSX
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__REVPROPS_H
+#define SVN_LIBSVN_FS__REVPROPS_H
+
+#include "svn_fs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Auto-create / replace the revprop generation file in FS with its
+ * initial contents. In any case, FS will not hold an open handle to
+ * it after this function succeeds.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__reset_revprop_generation_file(svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* In the filesystem FS, pack all revprop shards up to min_unpacked_rev.
+ *
+ * NOTE: Keep the old non-packed shards around until after the format bump.
+ * Otherwise, re-running upgrade will drop the packed revprop shard but
+ * have no unpacked data anymore. Call upgrade_cleanup_pack_revprops after
+ * the bump.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Temporary allocations are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__upgrade_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* In the filesystem FS, remove all non-packed revprop shards up to
+ * min_unpacked_rev. Temporary allocations are done in SCRATCH_POOL.
+ *
+ * NOTIFY_FUNC and NOTIFY_BATON as well as CANCEL_FUNC and CANCEL_BATON are
+ * used in the usual way. Cancellation is supported in the sense that we
+ * will cleanly abort the operation. However, there will be remnant shards
+ * that must be removed manually.
+ *
+ * See upgrade_pack_revprops for more info.
+ */
+svn_error_t *
+svn_fs_x__upgrade_cleanup_pack_revprops(svn_fs_t *fs,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* Read the revprops for revision REV in FS and return them in *PROPLIST_P.
+ * If BYPASS_CACHE is set, don't consult the disks but always read from disk.
+ *
+ * Allocate the *PROPLIST_P in RESULT_POOL and use SCRATCH_POOL for temporary
+ * allocations.
+ */
+svn_error_t *
+svn_fs_x__get_revision_proplist(apr_hash_t **proplist_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t bypass_cache,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Set the revision property list of revision REV in filesystem FS to
+ PROPLIST. Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__set_revision_proplist(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool);
+
+
+/* Return TRUE, if for REVISION in FS, we can find the revprop pack file.
+ * Use SCRATCH_POOL for temporary allocations.
+ * Set *MISSING, if the reason is a missing manifest or pack file.
+ */
+svn_boolean_t
+svn_fs_x__packed_revprop_available(svn_boolean_t *missing,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+
+
+/****** Packing FSX shards *********/
+
+/* Copy revprop files for revisions [START_REV, END_REV) from SHARD_PATH
+ * to the pack file at PACK_FILE_NAME in PACK_FILE_DIR.
+ *
+ * The file sizes have already been determined and written to SIZES.
+ * Please note that this function will be executed while the filesystem
+ * has been locked and that revprops files will therefore not be modified
+ * while the pack is in progress.
+ *
+ * COMPRESSION_LEVEL defines how well the resulting pack file shall be
+ * compressed or whether is shall be compressed at all. TOTAL_SIZE is
+ * a hint on which initial buffer size we should use to hold the pack file
+ * content.
+ *
+ * CANCEL_FUNC and CANCEL_BATON are used as usual. Temporary allocations
+ * are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__copy_revprops(const char *pack_file_dir,
+ const char *pack_filename,
+ const char *shard_path,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ apr_array_header_t *sizes,
+ apr_size_t total_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* For the revprop SHARD at SHARD_PATH with exactly MAX_FILES_PER_DIR
+ * revprop files in it, create a packed shared at PACK_FILE_DIR.
+ *
+ * COMPRESSION_LEVEL defines how well the resulting pack file shall be
+ * compressed or whether is shall be compressed at all. Individual pack
+ * file containing more than one revision will be limited to a size of
+ * MAX_PACK_SIZE bytes before compression.
+ *
+ * CANCEL_FUNC and CANCEL_BATON are used in the usual way. Temporary
+ * allocations are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__pack_revprops_shard(const char *pack_file_dir,
+ const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ apr_off_t max_pack_size,
+ int compression_level,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/* Delete the non-packed revprop SHARD at SHARD_PATH with exactly
+ * MAX_FILES_PER_DIR revprop files in it. If this is shard 0, keep the
+ * revprop file for revision 0.
+ *
+ * CANCEL_FUNC and CANCEL_BATON are used in the usual way. Temporary
+ * allocations are done in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__delete_revprops_shard(const char *shard_path,
+ apr_int64_t shard,
+ int max_files_per_dir,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS__REVPROPS_H */
diff --git a/subversion/libsvn_fs_x/string_table.c b/subversion/libsvn_fs_x/string_table.c
new file mode 100644
index 0000000..7b3b645
--- /dev/null
+++ b/subversion/libsvn_fs_x/string_table.c
@@ -0,0 +1,904 @@
+/* string_table.c : operations on string tables
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <apr_tables.h>
+
+#include "svn_string.h"
+#include "svn_sorts.h"
+#include "private/svn_dep_compat.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_packed_data.h"
+#include "string_table.h"
+
+
+
+#define MAX_DATA_SIZE 0xffff
+#define MAX_SHORT_STRING_LEN (MAX_DATA_SIZE / 4)
+#define TABLE_SHIFT 13
+#define MAX_STRINGS_PER_TABLE (1 << (TABLE_SHIFT - 1))
+#define LONG_STRING_MASK (1 << (TABLE_SHIFT - 1))
+#define STRING_INDEX_MASK ((1 << (TABLE_SHIFT - 1)) - 1)
+#define PADDING (sizeof(apr_uint64_t))
+
+
+typedef struct builder_string_t
+{
+ svn_string_t string;
+ int position;
+ apr_size_t depth;
+ struct builder_string_t *previous;
+ struct builder_string_t *next;
+ apr_size_t previous_match_len;
+ apr_size_t next_match_len;
+ struct builder_string_t *left;
+ struct builder_string_t *right;
+} builder_string_t;
+
+typedef struct builder_table_t
+{
+ apr_size_t max_data_size;
+ builder_string_t *top;
+ builder_string_t *first;
+ builder_string_t *last;
+ apr_array_header_t *short_strings;
+ apr_array_header_t *long_strings;
+ apr_hash_t *long_string_dict;
+ apr_size_t long_string_size;
+} builder_table_t;
+
+struct string_table_builder_t
+{
+ apr_pool_t *pool;
+ apr_array_header_t *tables;
+};
+
+typedef struct string_header_t
+{
+ apr_uint16_t head_string;
+ apr_uint16_t head_length;
+ apr_uint16_t tail_start;
+ apr_uint16_t tail_length;
+} string_header_t;
+
+typedef struct string_sub_table_t
+{
+ const char *data;
+ apr_size_t data_size;
+
+ string_header_t *short_strings;
+ apr_size_t short_string_count;
+
+ svn_string_t *long_strings;
+ apr_size_t long_string_count;
+} string_sub_table_t;
+
+struct string_table_t
+{
+ apr_size_t size;
+ string_sub_table_t *sub_tables;
+};
+
+
+/* Accessing ID Pieces. */
+
+static builder_table_t *
+add_table(string_table_builder_t *builder)
+{
+ builder_table_t *table = apr_pcalloc(builder->pool, sizeof(*table));
+ table->max_data_size = MAX_DATA_SIZE - PADDING; /* ensure there remain a few
+ unused bytes at the end */
+ table->short_strings = apr_array_make(builder->pool, 64,
+ sizeof(builder_string_t *));
+ table->long_strings = apr_array_make(builder->pool, 0,
+ sizeof(svn_string_t));
+ table->long_string_dict = svn_hash__make(builder->pool);
+
+ APR_ARRAY_PUSH(builder->tables, builder_table_t *) = table;
+
+ return table;
+}
+
+string_table_builder_t *
+svn_fs_x__string_table_builder_create(apr_pool_t *result_pool)
+{
+ string_table_builder_t *result = apr_palloc(result_pool, sizeof(*result));
+ result->pool = result_pool;
+ result->tables = apr_array_make(result_pool, 1, sizeof(builder_table_t *));
+
+ add_table(result);
+
+ return result;
+}
+
+static void
+balance(builder_table_t *table,
+ builder_string_t **parent,
+ builder_string_t *node)
+{
+ apr_size_t left_height = node->left ? node->left->depth + 1 : 0;
+ apr_size_t right_height = node->right ? node->right->depth + 1 : 0;
+
+ if (left_height > right_height + 1)
+ {
+ builder_string_t *temp = node->left->right;
+ node->left->right = node;
+ *parent = node->left;
+ node->left = temp;
+
+ --left_height;
+ }
+ else if (left_height + 1 < right_height)
+ {
+ builder_string_t *temp = node->right->left;
+ *parent = node->right;
+ node->right->left = node;
+ node->right = temp;
+
+ --right_height;
+ }
+
+ node->depth = MAX(left_height, right_height);
+}
+
+static apr_uint16_t
+match_length(const svn_string_t *lhs,
+ const svn_string_t *rhs)
+{
+ apr_size_t len = MIN(lhs->len, rhs->len);
+ return (apr_uint16_t)svn_cstring__match_length(lhs->data, rhs->data, len);
+}
+
+static apr_uint16_t
+insert_string(builder_table_t *table,
+ builder_string_t **parent,
+ builder_string_t *to_insert)
+{
+ apr_uint16_t result;
+ builder_string_t *current = *parent;
+ int diff = strcmp(current->string.data, to_insert->string.data);
+ if (diff == 0)
+ {
+ apr_array_pop(table->short_strings);
+ return current->position;
+ }
+
+ if (diff < 0)
+ {
+ if (current->left == NULL)
+ {
+ current->left = to_insert;
+
+ to_insert->previous = current->previous;
+ to_insert->next = current;
+
+ if (to_insert->previous == NULL)
+ {
+ table->first = to_insert;
+ }
+ else
+ {
+ builder_string_t *previous = to_insert->previous;
+ to_insert->previous_match_len
+ = match_length(&previous->string, &to_insert->string);
+
+ previous->next = to_insert;
+ previous->next_match_len = to_insert->previous_match_len;
+ }
+
+ current->previous = to_insert;
+ to_insert->next_match_len
+ = match_length(&current->string, &to_insert->string);
+ current->previous_match_len = to_insert->next_match_len;
+
+ table->max_data_size -= to_insert->string.len;
+ if (to_insert->previous == NULL)
+ table->max_data_size += to_insert->next_match_len;
+ else
+ table->max_data_size += MIN(to_insert->previous_match_len,
+ to_insert->next_match_len);
+
+ return to_insert->position;
+ }
+ else
+ result = insert_string(table, &current->left, to_insert);
+ }
+ else
+ {
+ if (current->right == NULL)
+ {
+ current->right = to_insert;
+
+ to_insert->next = current->next;
+ to_insert->previous = current;
+
+ if (to_insert->next == NULL)
+ {
+ table->last = to_insert;
+ }
+ else
+ {
+ builder_string_t *next = to_insert->next;
+ to_insert->next_match_len
+ = match_length(&next->string, &to_insert->string);
+
+ next->previous = to_insert;
+ next->previous_match_len = to_insert->next_match_len;
+ }
+
+ current->next = current->right;
+ to_insert->previous_match_len
+ = match_length(&current->string, &to_insert->string);
+ current->next_match_len = to_insert->previous_match_len;
+
+ table->max_data_size -= to_insert->string.len;
+ if (to_insert->next == NULL)
+ table->max_data_size += to_insert->previous_match_len;
+ else
+ table->max_data_size += MIN(to_insert->previous_match_len,
+ to_insert->next_match_len);
+
+ return to_insert->position;
+ }
+ else
+ result = insert_string(table, &current->right, to_insert);
+ }
+
+ balance(table, parent, current);
+ return result;
+}
+
+apr_size_t
+svn_fs_x__string_table_builder_add(string_table_builder_t *builder,
+ const char *string,
+ apr_size_t len)
+{
+ apr_size_t result;
+ builder_table_t *table = APR_ARRAY_IDX(builder->tables,
+ builder->tables->nelts - 1,
+ builder_table_t *);
+ if (len == 0)
+ len = strlen(string);
+
+ string = apr_pstrmemdup(builder->pool, string, len);
+ if (len > MAX_SHORT_STRING_LEN)
+ {
+ void *idx_void;
+ svn_string_t item;
+ item.data = string;
+ item.len = len;
+
+ idx_void = apr_hash_get(table->long_string_dict, string, len);
+ result = (apr_uintptr_t)idx_void;
+ if (result)
+ return result - 1
+ + LONG_STRING_MASK
+ + (((apr_size_t)builder->tables->nelts - 1) << TABLE_SHIFT);
+
+ if (table->long_strings->nelts == MAX_STRINGS_PER_TABLE)
+ table = add_table(builder);
+
+ result = table->long_strings->nelts
+ + LONG_STRING_MASK
+ + (((apr_size_t)builder->tables->nelts - 1) << TABLE_SHIFT);
+ APR_ARRAY_PUSH(table->long_strings, svn_string_t) = item;
+ apr_hash_set(table->long_string_dict, string, len,
+ (void*)(apr_uintptr_t)table->long_strings->nelts);
+
+ table->long_string_size += len;
+ }
+ else
+ {
+ builder_string_t *item = apr_pcalloc(builder->pool, sizeof(*item));
+ item->string.data = string;
+ item->string.len = len;
+ item->previous_match_len = 0;
+ item->next_match_len = 0;
+
+ if ( table->short_strings->nelts == MAX_STRINGS_PER_TABLE
+ || table->max_data_size < len)
+ table = add_table(builder);
+
+ item->position = table->short_strings->nelts;
+ APR_ARRAY_PUSH(table->short_strings, builder_string_t *) = item;
+
+ if (table->top == NULL)
+ {
+ table->max_data_size -= len;
+ table->top = item;
+ table->first = item;
+ table->last = item;
+
+ result = ((apr_size_t)builder->tables->nelts - 1) << TABLE_SHIFT;
+ }
+ else
+ {
+ result = insert_string(table, &table->top, item)
+ + (((apr_size_t)builder->tables->nelts - 1) << TABLE_SHIFT);
+ }
+ }
+
+ return result;
+}
+
+apr_size_t
+svn_fs_x__string_table_builder_estimate_size(string_table_builder_t *builder)
+{
+ apr_size_t total = 0;
+ int i;
+
+ for (i = 0; i < builder->tables->nelts; ++i)
+ {
+ builder_table_t *table
+ = APR_ARRAY_IDX(builder->tables, i, builder_table_t*);
+
+ /* total number of chars to store,
+ * 8 bytes per short string table entry
+ * 4 bytes per long string table entry
+ * some static overhead */
+ apr_size_t table_size
+ = MAX_DATA_SIZE - table->max_data_size
+ + table->long_string_size
+ + table->short_strings->nelts * 8
+ + table->long_strings->nelts * 4
+ + 10;
+
+ total += table_size;
+ }
+
+ /* ZIP compression should give us a 50% reduction.
+ * add some static overhead */
+ return 200 + total / 2;
+
+}
+
+static void
+create_table(string_sub_table_t *target,
+ builder_table_t *source,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool)
+{
+ int i = 0;
+ apr_hash_t *tails = svn_hash__make(scratch_pool);
+ svn_stringbuf_t *data
+ = svn_stringbuf_create_ensure(MAX_DATA_SIZE - source->max_data_size,
+ scratch_pool);
+
+ /* pack sub-strings */
+ target->short_string_count = (apr_size_t)source->short_strings->nelts;
+ target->short_strings = apr_palloc(pool, sizeof(*target->short_strings) *
+ target->short_string_count);
+ for (i = 0; i < source->short_strings->nelts; ++i)
+ {
+ const builder_string_t *string
+ = APR_ARRAY_IDX(source->short_strings, i, const builder_string_t *);
+
+ string_header_t *entry = &target->short_strings[i];
+ const char *tail = string->string.data + string->previous_match_len;
+ string_header_t *tail_match;
+ apr_size_t head_length = string->previous_match_len;
+
+ /* Minimize the number of strings to visit when reconstructing the
+ string head. So, skip all predecessors that don't contribute to
+ first HEAD_LENGTH chars of our string. */
+ if (head_length)
+ {
+ const builder_string_t *furthest_prev = string->previous;
+ while (furthest_prev->previous_match_len >= head_length)
+ furthest_prev = furthest_prev->previous;
+ entry->head_string = furthest_prev->position;
+ }
+ else
+ entry->head_string = 0;
+
+ /* head & tail length are known */
+ entry->head_length = (apr_uint16_t)head_length;
+ entry->tail_length
+ = (apr_uint16_t)(string->string.len - entry->head_length);
+
+ /* try to reuse an existing tail segment */
+ tail_match = apr_hash_get(tails, tail, entry->tail_length);
+ if (tail_match)
+ {
+ entry->tail_start = tail_match->tail_start;
+ }
+ else
+ {
+ entry->tail_start = (apr_uint16_t)data->len;
+ svn_stringbuf_appendbytes(data, tail, entry->tail_length);
+ apr_hash_set(tails, tail, entry->tail_length, entry);
+ }
+ }
+
+ /* pack long strings */
+ target->long_string_count = (apr_size_t)source->long_strings->nelts;
+ target->long_strings = apr_palloc(pool, sizeof(*target->long_strings) *
+ target->long_string_count);
+ for (i = 0; i < source->long_strings->nelts; ++i)
+ {
+ svn_string_t *string = &target->long_strings[i];
+ *string = APR_ARRAY_IDX(source->long_strings, i, svn_string_t);
+ string->data = apr_pstrmemdup(pool, string->data, string->len);
+ }
+
+ data->len += PADDING; /* add a few extra bytes at the end of the buffer
+ that we want to keep valid for chunky access */
+ assert(data->len < data->blocksize);
+ memset(data->data + data->len - PADDING, 0, PADDING);
+
+ target->data = apr_pmemdup(pool, data->data, data->len);
+ target->data_size = data->len;
+}
+
+string_table_t *
+svn_fs_x__string_table_create(const string_table_builder_t *builder,
+ apr_pool_t *pool)
+{
+ apr_size_t i;
+
+ string_table_t *result = apr_pcalloc(pool, sizeof(*result));
+ result->size = (apr_size_t)builder->tables->nelts;
+ result->sub_tables
+ = apr_pcalloc(pool, result->size * sizeof(*result->sub_tables));
+
+ for (i = 0; i < result->size; ++i)
+ create_table(&result->sub_tables[i],
+ APR_ARRAY_IDX(builder->tables, i, builder_table_t*),
+ pool,
+ builder->pool);
+
+ return result;
+}
+
+/* Masks used by table_copy_string. copy_mask[I] is used if the target
+ content to be preserved starts at byte I within the current chunk.
+ This is used to work around alignment issues.
+ */
+#if SVN_UNALIGNED_ACCESS_IS_OK
+static const char *copy_masks[8] = { "\xff\xff\xff\xff\xff\xff\xff\xff",
+ "\x00\xff\xff\xff\xff\xff\xff\xff",
+ "\x00\x00\xff\xff\xff\xff\xff\xff",
+ "\x00\x00\x00\xff\xff\xff\xff\xff",
+ "\x00\x00\x00\x00\xff\xff\xff\xff",
+ "\x00\x00\x00\x00\x00\xff\xff\xff",
+ "\x00\x00\x00\x00\x00\x00\xff\xff",
+ "\x00\x00\x00\x00\x00\x00\x00\xff" };
+#endif
+
+static void
+table_copy_string(char *buffer,
+ apr_size_t len,
+ const string_sub_table_t *table,
+ string_header_t *header)
+{
+ buffer[len] = '\0';
+ do
+ {
+ assert(header->head_length <= len);
+ {
+#if SVN_UNALIGNED_ACCESS_IS_OK
+ /* the sections that we copy tend to be short but we can copy
+ *all* of it chunky because we made sure that source and target
+ buffer have some extra padding to prevent segfaults. */
+ apr_uint64_t mask;
+ apr_size_t to_copy = len - header->head_length;
+ apr_size_t copied = 0;
+
+ const char *source = table->data + header->tail_start;
+ char *target = buffer + header->head_length;
+ len = header->head_length;
+
+ /* copy whole chunks */
+ while (to_copy >= copied + sizeof(apr_uint64_t))
+ {
+ *(apr_uint64_t *)(target + copied)
+ = *(const apr_uint64_t *)(source + copied);
+ copied += sizeof(apr_uint64_t);
+ }
+
+ /* copy the remainder assuming that we have up to 8 extra bytes
+ of addressable buffer on the source and target sides.
+ Now, we simply copy 8 bytes and use a mask to filter & merge
+ old with new data. */
+ mask = *(const apr_uint64_t *)copy_masks[to_copy - copied];
+ *(apr_uint64_t *)(target + copied)
+ = (*(apr_uint64_t *)(target + copied) & mask)
+ | (*(const apr_uint64_t *)(source + copied) & ~mask);
+#else
+ memcpy(buffer + header->head_length,
+ table->data + header->tail_start,
+ len - header->head_length);
+ len = header->head_length;
+#endif
+ }
+
+ header = &table->short_strings[header->head_string];
+ }
+ while (len);
+}
+
+const char*
+svn_fs_x__string_table_get(const string_table_t *table,
+ apr_size_t idx,
+ apr_size_t *length,
+ apr_pool_t *pool)
+{
+ apr_size_t table_number = idx >> TABLE_SHIFT;
+ apr_size_t sub_index = idx & STRING_INDEX_MASK;
+
+ if (table_number < table->size)
+ {
+ string_sub_table_t *sub_table = &table->sub_tables[table_number];
+ if (idx & LONG_STRING_MASK)
+ {
+ if (sub_index < sub_table->long_string_count)
+ {
+ if (length)
+ *length = sub_table->long_strings[sub_index].len;
+
+ return apr_pstrmemdup(pool,
+ sub_table->long_strings[sub_index].data,
+ sub_table->long_strings[sub_index].len);
+ }
+ }
+ else
+ {
+ if (sub_index < sub_table->short_string_count)
+ {
+ string_header_t *header = sub_table->short_strings + sub_index;
+ apr_size_t len = header->head_length + header->tail_length;
+ char *result = apr_palloc(pool, len + PADDING);
+
+ if (length)
+ *length = len;
+ table_copy_string(result, len, sub_table, header);
+
+ return result;
+ }
+ }
+ }
+
+ return apr_pstrmemdup(pool, "", 0);
+}
+
+svn_error_t *
+svn_fs_x__write_string_table(svn_stream_t *stream,
+ const string_table_t *table,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t i, k;
+
+ svn_packed__data_root_t *root = svn_packed__data_create_root(scratch_pool);
+
+ svn_packed__int_stream_t *table_sizes
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+ svn_packed__int_stream_t *small_strings_headers
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+ svn_packed__byte_stream_t *large_strings
+ = svn_packed__create_bytes_stream(root);
+ svn_packed__byte_stream_t *small_strings_data
+ = svn_packed__create_bytes_stream(root);
+
+ svn_packed__create_int_substream(small_strings_headers, TRUE, FALSE);
+ svn_packed__create_int_substream(small_strings_headers, FALSE, FALSE);
+ svn_packed__create_int_substream(small_strings_headers, TRUE, FALSE);
+ svn_packed__create_int_substream(small_strings_headers, FALSE, FALSE);
+
+ /* number of sub-tables */
+
+ svn_packed__add_uint(table_sizes, table->size);
+
+ /* all short-string char data sizes */
+
+ for (i = 0; i < table->size; ++i)
+ svn_packed__add_uint(table_sizes,
+ table->sub_tables[i].short_string_count);
+
+ for (i = 0; i < table->size; ++i)
+ svn_packed__add_uint(table_sizes,
+ table->sub_tables[i].long_string_count);
+
+ /* all strings */
+
+ for (i = 0; i < table->size; ++i)
+ {
+ string_sub_table_t *sub_table = &table->sub_tables[i];
+ svn_packed__add_bytes(small_strings_data,
+ sub_table->data,
+ sub_table->data_size);
+
+ for (k = 0; k < sub_table->short_string_count; ++k)
+ {
+ string_header_t *string = &sub_table->short_strings[k];
+
+ svn_packed__add_uint(small_strings_headers, string->head_string);
+ svn_packed__add_uint(small_strings_headers, string->head_length);
+ svn_packed__add_uint(small_strings_headers, string->tail_start);
+ svn_packed__add_uint(small_strings_headers, string->tail_length);
+ }
+
+ for (k = 0; k < sub_table->long_string_count; ++k)
+ svn_packed__add_bytes(large_strings,
+ sub_table->long_strings[k].data,
+ sub_table->long_strings[k].len + 1);
+ }
+
+ /* write to target stream */
+
+ SVN_ERR(svn_packed__data_write(stream, root, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_string_table(string_table_t **table_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t i, k;
+
+ string_table_t *table = apr_palloc(result_pool, sizeof(*table));
+
+ svn_packed__data_root_t *root;
+ svn_packed__int_stream_t *table_sizes;
+ svn_packed__byte_stream_t *large_strings;
+ svn_packed__byte_stream_t *small_strings_data;
+ svn_packed__int_stream_t *headers;
+
+ SVN_ERR(svn_packed__data_read(&root, stream, result_pool, scratch_pool));
+ table_sizes = svn_packed__first_int_stream(root);
+ headers = svn_packed__next_int_stream(table_sizes);
+ large_strings = svn_packed__first_byte_stream(root);
+ small_strings_data = svn_packed__next_byte_stream(large_strings);
+
+ /* create sub-tables */
+
+ table->size = (apr_size_t)svn_packed__get_uint(table_sizes);
+ table->sub_tables = apr_pcalloc(result_pool,
+ table->size * sizeof(*table->sub_tables));
+
+ /* read short strings */
+
+ for (i = 0; i < table->size; ++i)
+ {
+ string_sub_table_t *sub_table = &table->sub_tables[i];
+
+ sub_table->short_string_count
+ = (apr_size_t)svn_packed__get_uint(table_sizes);
+ if (sub_table->short_string_count)
+ {
+ sub_table->short_strings
+ = apr_pcalloc(result_pool, sub_table->short_string_count
+ * sizeof(*sub_table->short_strings));
+
+ /* read short string headers */
+
+ for (k = 0; k < sub_table->short_string_count; ++k)
+ {
+ string_header_t *string = &sub_table->short_strings[k];
+
+ string->head_string = (apr_uint16_t)svn_packed__get_uint(headers);
+ string->head_length = (apr_uint16_t)svn_packed__get_uint(headers);
+ string->tail_start = (apr_uint16_t)svn_packed__get_uint(headers);
+ string->tail_length = (apr_uint16_t)svn_packed__get_uint(headers);
+ }
+ }
+
+ sub_table->data = svn_packed__get_bytes(small_strings_data,
+ &sub_table->data_size);
+ }
+
+ /* read long strings */
+
+ for (i = 0; i < table->size; ++i)
+ {
+ /* initialize long string table */
+ string_sub_table_t *sub_table = &table->sub_tables[i];
+
+ sub_table->long_string_count = svn_packed__get_uint(table_sizes);
+ if (sub_table->long_string_count)
+ {
+ sub_table->long_strings
+ = apr_pcalloc(result_pool, sub_table->long_string_count
+ * sizeof(*sub_table->long_strings));
+
+ /* read long strings */
+
+ for (k = 0; k < sub_table->long_string_count; ++k)
+ {
+ svn_string_t *string = &sub_table->long_strings[k];
+ string->data = svn_packed__get_bytes(large_strings,
+ &string->len);
+ string->len--;
+ }
+ }
+ }
+
+ /* done */
+
+ *table_p = table;
+
+ return SVN_NO_ERROR;
+}
+
+void
+svn_fs_x__serialize_string_table(svn_temp_serializer__context_t *context,
+ string_table_t **st)
+{
+ apr_size_t i, k;
+ string_table_t *string_table = *st;
+ if (string_table == NULL)
+ return;
+
+ /* string table struct */
+ svn_temp_serializer__push(context,
+ (const void * const *)st,
+ sizeof(*string_table));
+
+ /* sub-table array (all structs in a single memory block) */
+ svn_temp_serializer__push(context,
+ (const void * const *)&string_table->sub_tables,
+ sizeof(*string_table->sub_tables) *
+ string_table->size);
+
+ /* sub-elements of all sub-tables */
+ for (i = 0; i < string_table->size; ++i)
+ {
+ string_sub_table_t *sub_table = &string_table->sub_tables[i];
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&sub_table->data,
+ sub_table->data_size);
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&sub_table->short_strings,
+ sub_table->short_string_count * sizeof(string_header_t));
+
+ /* all "long string" instances form a single memory block */
+ svn_temp_serializer__push(context,
+ (const void * const *)&sub_table->long_strings,
+ sub_table->long_string_count * sizeof(svn_string_t));
+
+ /* serialize actual long string contents */
+ for (k = 0; k < sub_table->long_string_count; ++k)
+ {
+ svn_string_t *string = &sub_table->long_strings[k];
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&string->data,
+ string->len + 1);
+ }
+
+ svn_temp_serializer__pop(context);
+ }
+
+ /* back to the caller's nesting level */
+ svn_temp_serializer__pop(context);
+ svn_temp_serializer__pop(context);
+}
+
+void
+svn_fs_x__deserialize_string_table(void *buffer,
+ string_table_t **table)
+{
+ apr_size_t i, k;
+ string_sub_table_t *sub_tables;
+
+ svn_temp_deserializer__resolve(buffer, (void **)table);
+ if (*table == NULL)
+ return;
+
+ svn_temp_deserializer__resolve(*table, (void **)&(*table)->sub_tables);
+ sub_tables = (*table)->sub_tables;
+ for (i = 0; i < (*table)->size; ++i)
+ {
+ string_sub_table_t *sub_table = sub_tables + i;
+
+ svn_temp_deserializer__resolve(sub_tables,
+ (void **)&sub_table->data);
+ svn_temp_deserializer__resolve(sub_tables,
+ (void **)&sub_table->short_strings);
+ svn_temp_deserializer__resolve(sub_tables,
+ (void **)&sub_table->long_strings);
+
+ for (k = 0; k < sub_table->long_string_count; ++k)
+ svn_temp_deserializer__resolve(sub_table->long_strings,
+ (void **)&sub_table->long_strings[k].data);
+ }
+}
+
+const char*
+svn_fs_x__string_table_get_func(const string_table_t *table,
+ apr_size_t idx,
+ apr_size_t *length,
+ apr_pool_t *pool)
+{
+ apr_size_t table_number = idx >> TABLE_SHIFT;
+ apr_size_t sub_index = idx & STRING_INDEX_MASK;
+
+ if (table_number < table->size)
+ {
+ /* resolve TABLE->SUB_TABLES pointer and select sub-table */
+ string_sub_table_t *sub_tables
+ = (string_sub_table_t *)svn_temp_deserializer__ptr(table,
+ (const void *const *)&table->sub_tables);
+ string_sub_table_t *sub_table = sub_tables + table_number;
+
+ /* pick the right kind of string */
+ if (idx & LONG_STRING_MASK)
+ {
+ if (sub_index < sub_table->long_string_count)
+ {
+ /* resolve SUB_TABLE->LONG_STRINGS, select the string we want
+ and resolve the pointer to its char data */
+ svn_string_t *long_strings
+ = (svn_string_t *)svn_temp_deserializer__ptr(sub_table,
+ (const void *const *)&sub_table->long_strings);
+ const char *str_data
+ = (const char*)svn_temp_deserializer__ptr(long_strings,
+ (const void *const *)&long_strings[sub_index].data);
+
+ /* return a copy of the char data */
+ if (length)
+ *length = long_strings[sub_index].len;
+
+ return apr_pstrmemdup(pool,
+ str_data,
+ long_strings[sub_index].len);
+ }
+ }
+ else
+ {
+ if (sub_index < sub_table->short_string_count)
+ {
+ string_header_t *header;
+ apr_size_t len;
+ char *result;
+
+ /* construct a copy of our sub-table struct with SHORT_STRINGS
+ and DATA pointers resolved. Leave all other pointers as
+ they are. This allows us to use the same code for string
+ reconstruction here as in the non-serialized case. */
+ string_sub_table_t table_copy = *sub_table;
+ table_copy.data
+ = (const char *)svn_temp_deserializer__ptr(sub_tables,
+ (const void *const *)&sub_table->data);
+ table_copy.short_strings
+ = (string_header_t *)svn_temp_deserializer__ptr(sub_tables,
+ (const void *const *)&sub_table->short_strings);
+
+ /* reconstruct the char data and return it */
+ header = table_copy.short_strings + sub_index;
+ len = header->head_length + header->tail_length;
+ result = apr_palloc(pool, len + PADDING);
+ if (length)
+ *length = len;
+
+ table_copy_string(result, len, &table_copy, header);
+
+ return result;
+ }
+ }
+ }
+
+ return "";
+}
diff --git a/subversion/libsvn_fs_x/string_table.h b/subversion/libsvn_fs_x/string_table.h
new file mode 100644
index 0000000..f7ab476
--- /dev/null
+++ b/subversion/libsvn_fs_x/string_table.h
@@ -0,0 +1,133 @@
+/* string_table.h : interface to string tables, private to libsvn_fs_x
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_X_STRING_TABLE_H
+#define SVN_LIBSVN_FS_X_STRING_TABLE_H
+
+#include "svn_io.h"
+#include "private/svn_temp_serializer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* A string table is a very space efficient, read-only representation for
+ * a set of strings with high degreed of prefix and postfix overhead.
+ *
+ * Creating a string table is a two-stage process: Use a builder class,
+ * stuff all the strings in there and let it then do the heavy lifting of
+ * classification and compression to create the actual string table object.
+ *
+ * We will use this for the various path values in FSX change lists and
+ * node revision items.
+ */
+
+/* the string table builder */
+typedef struct string_table_builder_t string_table_builder_t;
+
+/* the string table */
+typedef struct string_table_t string_table_t;
+
+/* Returns a new string table builder object, allocated in RESULT_POOL.
+ */
+string_table_builder_t *
+svn_fs_x__string_table_builder_create(apr_pool_t *result_pool);
+
+/* Add an arbitrary NUL-terminated C-string STRING of the given length LEN
+ * to BUILDER. Return the index of that string in the future string table.
+ * If LEN is 0, determine the length of the C-string internally.
+ */
+apr_size_t
+svn_fs_x__string_table_builder_add(string_table_builder_t *builder,
+ const char *string,
+ apr_size_t len);
+
+/* Return an estimate for the on-disk size of the resulting string table.
+ * The estimate may err in both directions but tends to overestimate the
+ * space requirements for larger tables.
+ */
+apr_size_t
+svn_fs_x__string_table_builder_estimate_size(string_table_builder_t *builder);
+
+/* From the given BUILDER object, create a string table object allocated
+ * in POOL that contains all strings previously added to BUILDER.
+ */
+string_table_t *
+svn_fs_x__string_table_create(const string_table_builder_t *builder,
+ apr_pool_t *pool);
+
+/* Extract string number INDEX from TABLE and return a copy of it allocated
+ * in POOL. If LENGTH is not NULL, set *LENGTH to strlen() of the result
+ * string. Returns an empty string for invalid indexes.
+ */
+const char*
+svn_fs_x__string_table_get(const string_table_t *table,
+ apr_size_t index,
+ apr_size_t *length,
+ apr_pool_t *pool);
+
+/* Write a serialized representation of the string table TABLE to STREAM.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__write_string_table(svn_stream_t *stream,
+ const string_table_t *table,
+ apr_pool_t *scratch_pool);
+
+/* Read the serialized string table representation from STREAM and return
+ * the resulting runtime representation in *TABLE_P. Allocate it in
+ * RESULT_POOL and use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_string_table(string_table_t **table_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Serialize string table *ST within the serialization CONTEXT.
+ */
+void
+svn_fs_x__serialize_string_table(svn_temp_serializer__context_t *context,
+ string_table_t **st);
+
+/* Deserialize string table *TABLE within the BUFFER.
+ */
+void
+svn_fs_x__deserialize_string_table(void *buffer,
+ string_table_t **table);
+
+/* Extract string number INDEX from the cache serialized representation at
+ * TABLE and return a copy of it allocated in POOL. If LENGTH is not NULL,
+ * set *LENGTH to strlen() of the result string. Returns an empty string
+ * for invalid indexes.
+ */
+const char*
+svn_fs_x__string_table_get_func(const string_table_t *table,
+ apr_size_t idx,
+ apr_size_t *length,
+ apr_pool_t *pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_X_STRING_TABLE_H */
diff --git a/subversion/libsvn_fs_x/structure b/subversion/libsvn_fs_x/structure
new file mode 100644
index 0000000..8d10c3d
--- /dev/null
+++ b/subversion/libsvn_fs_x/structure
@@ -0,0 +1,336 @@
+This file will describe the design, layouts, and file formats of a
+libsvn_fs_x repository.
+
+Since FSX is still in a very early phase of its development, all sections
+either subject to major change or simply "TBD".
+
+Design
+------
+
+TBD.
+
+Similar to FSFS format 7 but using a radically different on-disk format.
+
+In FSFS, each committed revision is represented as an immutable file
+containing the new node-revisions, contents, and changed-path
+information for the revision, plus a second, changeable file
+containing the revision properties.
+
+To reduce the size of the on-disk representation, revision data gets
+packed, i.e. multiple revision files get combined into a single pack
+file of smaller total size. The same strategy is applied to revprops.
+
+In-progress transactions are represented with a prototype rev file
+containing only the new text representations of files (appended to as
+changed file contents come in), along with a separate file for each
+node-revision, directory representation, or property representation
+which has been changed or added in the transaction. During the final
+stage of the commit, these separate files are marshalled onto the end
+of the prototype rev file to form the immutable revision file.
+
+Layout of the FS directory
+--------------------------
+
+The layout of the FS directory (the "db" subdirectory of the
+repository) is:
+
+ revs/ Subdirectory containing revs
+ <shard>/ Shard directory, if sharding is in use (see below)
+ <revnum> File containing rev <revnum>
+ <shard>.pack/ Pack directory, if the repo has been packed (see below)
+ pack Pack file, if the repository has been packed (see below)
+ manifest Pack manifest file, if a pack file exists (see below)
+ revprops/ Subdirectory containing rev-props
+ <shard>/ Shard directory, if sharding is in use (see below)
+ <revnum> File containing rev-props for <revnum>
+ <shard>.pack/ Pack directory, if the repo has been packed (see below)
+ <rev>.<count> Pack file, if the repository has been packed (see below)
+ manifest Pack manifest file, if a pack file exists (see below)
+ revprops.db SQLite database of the packed revision properties
+ transactions/ Subdirectory containing transactions
+ <txnid>.txn/ Directory containing transaction <txnid>
+ txn-protorevs/ Subdirectory containing transaction proto-revision files
+ <txnid>.rev Proto-revision file for transaction <txnid>
+ <txnid>.rev-lock Write lock for proto-rev file
+ txn-current File containing the next transaction key
+ locks/ Subdirectory containing locks
+ <partial-digest>/ Subdirectory named for first 3 letters of an MD5 digest
+ <digest> File containing locks/children for path with <digest>
+ current File specifying current revision and next node/copy id
+ fs-type File identifying this filesystem as an FSFS filesystem
+ write-lock Empty file, locked to serialise writers
+ pack-lock Empty file, locked to serialise 'svnadmin pack' (f. 7+)
+ txn-current-lock Empty file, locked to serialise 'txn-current'
+ uuid File containing the UUID of the repository
+ format File containing the format number of this filesystem
+ fsx.conf Configuration file
+ min-unpacked-rev File containing the oldest revision not in a pack file
+ min-unpacked-revprop File containing the oldest revision of unpacked revprop
+ rep-cache.db SQLite database mapping rep checksums to locations
+
+Files in the revprops directory are in the hash dump format used by
+svn_hash_write.
+
+The format of the "current" file is a single line of the form
+"<youngest-revision>\n" giving the youngest revision for the
+repository.
+
+The "write-lock" file is an empty file which is locked before the
+final stage of a commit and unlocked after the new "current" file has
+been moved into place to indicate that a new revision is present. It
+is also locked during a revprop propchange while the revprop file is
+read in, mutated, and written out again. Furthermore, it will be used
+to serialize the repository structure changes during 'svnadmin pack'
+(see also next section). Note that readers are never blocked by any
+operation - writers must ensure that the filesystem is always in a
+consistent state.
+
+The "pack-lock" file is an empty file which is locked before an 'svnadmin
+pack' operation commences. Thus, only one process may attempt to modify
+the repository structure at a time while other processes may still read
+and write (commit) to the repository during most of the pack procedure.
+It is only available with format 7 and newer repositories. Older formats
+use the global write-lock instead which disables commits completely
+for the duration of the pack process.
+
+The "txn-current" file is a file with a single line of text that
+contains only a base-36 number. The current value will be used in the
+next transaction name, along with the revision number the transaction
+is based on. This sequence number ensures that transaction names are
+not reused, even if the transaction is aborted and a new transaction
+based on the same revision is begun. The only operation that FSFS
+performs on this file is "get and increment"; the "txn-current-lock"
+file is locked during this operation.
+
+"fsx.conf" is a configuration file in the standard Subversion/Python
+config format. It is automatically generated when you create a new
+repository; read the generated file for details on what it controls.
+
+When representation sharing is enabled, the filesystem tracks
+representation checksum and location mappings using a SQLite database in
+"rep-cache.db". The database has a single table, which stores the sha1
+hash text as the primary key, mapped to the representation revision, offset,
+size and expanded size. This file is only consulted during writes and never
+during reads. Consequently, it is not required, and may be removed at an
+abritrary time, with the subsequent loss of rep-sharing capabilities for
+revisions written thereafter.
+
+Filesystem formats
+------------------
+
+TBD.
+
+The "format" file defines what features are permitted within the
+filesystem, and indicates changes that are not backward-compatible.
+It serves the same purpose as the repository file of the same name.
+
+So far, there is only format 1.
+
+
+Node-revision IDs
+-----------------
+
+A node-rev ID consists of the following three fields:
+
+ node_revision_id ::= node_id '.' copy_id '.' txn_id
+
+At this level, the form of the ID is the same as for BDB - see the
+section called "ID's" in <../libsvn_fs_base/notes/structure>.
+
+In order to support efficient lookup of node-revisions by their IDs
+and to simplify the allocation of fresh node-IDs during a transaction,
+we treat the fields of a node-rev ID in new and interesting ways.
+
+Within a new transaction:
+
+ New node-revision IDs assigned within a transaction have a txn-id
+ field of the form "t<txnid>".
+
+ When a new node-id or copy-id is assigned in a transaction, the ID
+ used is a "_" followed by a base36 number unique to the transaction.
+
+Within a revision:
+
+ Within a revision file, node-revs have a txn-id field of the form
+ "r<rev>/<offset>", to support easy lookup. The <offset> is the (ASCII
+ decimal) number of bytes from the start of the revision file to the
+ start of the node-rev.
+
+ During the final phase of a commit, node-revision IDs are rewritten
+ to have repository-wide unique node-ID and copy-ID fields, and to have
+ "r<rev>/<offset>" txn-id fields.
+
+ This uniqueness is done by changing a temporary
+ id of "_<base36>" to "<base36>-<rev>". Note that this means that the
+ originating revision of a line of history or a copy can be determined
+ by looking at the node ID.
+
+The temporary assignment of node-ID and copy-ID fields has
+implications for svn_fs_compare_ids and svn_fs_check_related. The ID
+_1.0.t1 is not related to the ID _1.0.t2 even though they have the
+same node-ID, because temporary node-IDs are restricted in scope to
+the transactions they belong to.
+
+Copy-IDs and copy roots
+-----------------------
+
+Copy-IDs are assigned in the same manner as they are in the BDB
+implementation:
+
+ * A node-rev resulting from a creation operation (with no copy
+ history) receives the copy-ID of its parent directory.
+
+ * A node-rev resulting from a copy operation receives a fresh
+ copy-ID, as one would expect.
+
+ * A node-rev resulting from a modification operation receives a
+ copy-ID depending on whether its predecessor derives from a
+ copy operation or whether it derives from a creation operation
+ with no intervening copies:
+
+ - If the predecessor does not derive from a copy, the new
+ node-rev receives the copy-ID of its parent directory. If the
+ node-rev is being modified through its created-path, this will
+ be the same copy-ID as the predecessor node-rev has; however,
+ if the node-rev is being modified through a copied ancestor
+ directory (i.e. we are performing a "lazy copy"), this will be
+ a different copy-ID.
+
+ - If the predecessor derives from a copy and the node-rev is
+ being modified through its created-path, the new node-rev
+ receives the copy-ID of the predecessor.
+
+ - If the predecessor derives from a copy and the node-rev is not
+ being modified through its created path, the new node-rev
+ receives a fresh copy-ID. This is called a "soft copy"
+ operation, as distinct from a "true copy" operation which was
+ actually requested through the svn_fs interface. Soft copies
+ exist to ensure that the same <node-ID,copy-ID> pair is not
+ used twice within a transaction.
+
+Unlike the BDB implementation, we do not have a "copies" table.
+Instead, each node-revision record contains a "copyroot" field
+identifying the node-rev resulting from the true copy operation most
+proximal to the node-rev. If the node-rev does not itself derive from
+a copy operation, then the copyroot field identifies the copy of an
+ancestor directory; if no ancestor directories derive from a copy
+operation, then the copyroot field identifies the root directory of
+rev 0.
+
+Revision file format
+--------------------
+
+TBD
+
+A revision file contains a concatenation of various kinds of data:
+
+ * Text and property representations
+ * Node-revisions
+ * The changed-path data
+
+That data is aggregated in compressed containers with a binary on-disk
+representation.
+
+Transaction layout
+------------------
+
+A transaction directory has the following layout:
+
+ props Transaction props
+ props-final Final transaction props (optional)
+ next-ids Next temporary node-ID and copy-ID
+ changes Changed-path information so far
+ node.<nid>.<cid> New node-rev data for node
+ node.<nid>.<cid>.props Props for new node-rev, if changed
+ node.<nid>.<cid>.children Directory contents for node-rev
+ <sha1> Text representation of that sha1
+
+ txn-protorevs/rev Prototype rev file with new text reps
+ txn-protorevs/rev-lock Lockfile for writing to the above
+
+The prototype rev file is used to store the text representations as
+they are received from the client. To ensure that only one client is
+writing to the file at a given time, the "rev-lock" file is locked for
+the duration of each write.
+
+The three kinds of props files are all in hash dump format. The "props"
+file will always be present. The "node.<nid>.<cid>.props" file will
+only be present if the node-rev properties have been changed. The
+"props-final" only exists while converting the transaction into a revision.
+
+The <sha1> files' content is that of text rep references:
+"<rev> <offset> <length> <size> <digest>"
+They will be written for text reps in the current transaction and be
+used to eliminate duplicate reps within that transaction.
+
+The "next-ids" file contains a single line "<next-temp-node-id>
+<next-temp-copy-id>\n" giving the next temporary node-ID and copy-ID
+assignments (without the leading underscores). The next node-ID is
+also used as a uniquifier for representations which may share the same
+underlying rep.
+
+The "children" file for a node-revision begins with a copy of the hash
+dump representation of the directory entries from the old node-rev (or
+a dump of the empty hash for new directories), and then an incremental
+hash dump entry for each change made to the directory.
+
+The "changes" file contains changed-path entries in the same form as
+the changed-path entries in a rev file, except that <id> and <action>
+may both be "reset" (in which case <text-mod> and <prop-mod> are both
+always "false") to indicate that all changes to a path should be
+considered undone. Reset entries are only used during the final merge
+phase of a transaction. Actions in the "changes" file always contain
+a node kind.
+
+The node-rev files have the same format as node-revs in a revision
+file, except that the "text" and "props" fields are augmented as
+follows:
+
+ * The "props" field may have the value "-1" if properties have
+ been changed and are contained in a "props" file within the
+ node-rev subdirectory.
+
+ * For directory node-revs, the "text" field may have the value
+ "-1" if entries have been changed and are contained in a
+ "contents" file in the node-rev subdirectory.
+
+ * For the directory node-rev representing the root of the
+ transaction, the "is-fresh-txn-root" field indicates that it has
+ not been made mutable yet (see Issue #2608).
+
+ * For file node-revs, the "text" field may have the value "-1
+ <offset> <length> <size> <digest>" if the text representation is
+ within the prototype rev file.
+
+ * The "copyroot" field may have the value "-1 <created-path>" if the
+ copy root of the node-rev is part of the transaction in process.
+
+
+Locks layout
+------------
+
+Locks in FSX are stored in serialized hash format in files whose
+names are MD5 digests of the FS path which the lock is associated
+with. For the purposes of keeping directory inode usage down, these
+digest files live in subdirectories of the main lock directory whose
+names are the first 3 characters of the digest filename.
+
+Also stored in the digest file for a given FS path are pointers to
+other digest files which contain information associated with other FS
+paths that are beneath our path (an immediate child thereof, or a
+grandchild, or a great-grandchild, ...).
+
+To answer the question, "Does path FOO have a lock associated with
+it?", one need only generate the MD5 digest of FOO's
+absolute-in-the-FS path (say, 3b1b011fed614a263986b5c4869604e8), look
+for a file located like so:
+
+ /path/to/repos/locks/3b1/3b1b011fed614a263986b5c4869604e8
+
+And then see if that file contains lock information.
+
+To inquire about locks on children of the path FOO, you would
+reference the same path as above, but look for a list of children in
+that file (instead of lock information). Children are listed as MD5
+digests, too, so you would simply iterate over those digests and
+consult the files they reference for lock information.
diff --git a/subversion/libsvn_fs_x/temp_serializer.c b/subversion/libsvn_fs_x/temp_serializer.c
new file mode 100644
index 0000000..65a2c3f
--- /dev/null
+++ b/subversion/libsvn_fs_x/temp_serializer.c
@@ -0,0 +1,1337 @@
+/* temp_serializer.c: serialization functions for caching of FSX structures
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <apr_pools.h>
+
+#include "svn_pools.h"
+#include "svn_hash.h"
+#include "svn_sorts.h"
+#include "svn_fs.h"
+
+#include "private/svn_fs_util.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_temp_serializer.h"
+#include "private/svn_subr_private.h"
+
+#include "id.h"
+#include "temp_serializer.h"
+#include "low_level.h"
+#include "cached_data.h"
+
+/* Utility to encode a signed NUMBER into a variable-length sequence of
+ * 8-bit chars in KEY_BUFFER and return the last writen position.
+ *
+ * Numbers will be stored in 7 bits / byte and using byte values above
+ * 32 (' ') to make them combinable with other string by simply separating
+ * individual parts with spaces.
+ */
+static char*
+encode_number(apr_int64_t number, char *key_buffer)
+{
+ /* encode the sign in the first byte */
+ if (number < 0)
+ {
+ number = -number;
+ *key_buffer = (char)((number & 63) + ' ' + 65);
+ }
+ else
+ *key_buffer = (char)((number & 63) + ' ' + 1);
+ number /= 64;
+
+ /* write 7 bits / byte until no significant bits are left */
+ while (number)
+ {
+ *++key_buffer = (char)((number & 127) + ' ' + 1);
+ number /= 128;
+ }
+
+ /* return the last written position */
+ return key_buffer;
+}
+
+const char*
+svn_fs_x__combine_number_and_string(apr_int64_t number,
+ const char *string,
+ apr_pool_t *pool)
+{
+ apr_size_t len = strlen(string);
+
+ /* number part requires max. 10x7 bits + 1 space.
+ * Add another 1 for the terminal 0 */
+ char *key_buffer = apr_palloc(pool, len + 12);
+ const char *key = key_buffer;
+
+ /* Prepend the number to the string and separate them by space. No other
+ * number can result in the same prefix, no other string in the same
+ * postfix nor can the boundary between them be ambiguous. */
+ key_buffer = encode_number(number, key_buffer);
+ *++key_buffer = ' ';
+ memcpy(++key_buffer, string, len+1);
+
+ /* return the start of the key */
+ return key;
+}
+
+/* Utility function to serialize string S in the given serialization CONTEXT.
+ */
+static void
+serialize_svn_string(svn_temp_serializer__context_t *context,
+ const svn_string_t * const *s)
+{
+ const svn_string_t *string = *s;
+
+ /* Nothing to do for NULL string references. */
+ if (string == NULL)
+ return;
+
+ svn_temp_serializer__push(context,
+ (const void * const *)s,
+ sizeof(*string));
+
+ /* the "string" content may actually be arbitrary binary data.
+ * Thus, we cannot use svn_temp_serializer__add_string. */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&string->data,
+ string->len + 1);
+
+ /* back to the caller's nesting level */
+ svn_temp_serializer__pop(context);
+}
+
+/* Utility function to deserialize the STRING inside the BUFFER.
+ */
+static void
+deserialize_svn_string(void *buffer, svn_string_t **string)
+{
+ svn_temp_deserializer__resolve(buffer, (void **)string);
+ if (*string == NULL)
+ return;
+
+ svn_temp_deserializer__resolve(*string, (void **)&(*string)->data);
+}
+
+/* Utility function to serialize the REPRESENTATION within the given
+ * serialization CONTEXT.
+ */
+static void
+serialize_representation(svn_temp_serializer__context_t *context,
+ svn_fs_x__representation_t * const *representation)
+{
+ const svn_fs_x__representation_t * rep = *representation;
+ if (rep == NULL)
+ return;
+
+ /* serialize the representation struct itself */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)representation,
+ sizeof(*rep));
+}
+
+void
+svn_fs_x__serialize_apr_array(svn_temp_serializer__context_t *context,
+ apr_array_header_t **a)
+{
+ const apr_array_header_t *array = *a;
+
+ /* Nothing to do for NULL string references. */
+ if (array == NULL)
+ return;
+
+ /* array header struct */
+ svn_temp_serializer__push(context,
+ (const void * const *)a,
+ sizeof(*array));
+
+ /* contents */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&array->elts,
+ (apr_size_t)array->nelts * array->elt_size);
+
+ /* back to the caller's nesting level */
+ svn_temp_serializer__pop(context);
+}
+
+void
+svn_fs_x__deserialize_apr_array(void *buffer,
+ apr_array_header_t **array,
+ apr_pool_t *pool)
+{
+ svn_temp_deserializer__resolve(buffer, (void **)array);
+ if (*array == NULL)
+ return;
+
+ svn_temp_deserializer__resolve(*array, (void **)&(*array)->elts);
+ (*array)->pool = pool;
+}
+
+/* auxilliary structure representing the content of a directory array */
+typedef struct dir_data_t
+{
+ /* number of entries in the directory
+ * (it's int because the directory is an APR array) */
+ int count;
+
+ /* number of unused dir entry buckets in the index */
+ apr_size_t over_provision;
+
+ /* internal modifying operations counter
+ * (used to repack data once in a while) */
+ apr_size_t operations;
+
+ /* size of the serialization buffer actually used.
+ * (we will allocate more than we actually need such that we may
+ * append more data in situ later) */
+ apr_size_t len;
+
+ /* reference to the entries */
+ svn_fs_x__dirent_t **entries;
+
+ /* size of the serialized entries and don't be too wasteful
+ * (needed since the entries are no longer in sequence) */
+ apr_uint32_t *lengths;
+} dir_data_t;
+
+/* Utility function to serialize the *ENTRY_P into a the given
+ * serialization CONTEXT. Return the serialized size of the
+ * dir entry in *LENGTH.
+ */
+static void
+serialize_dir_entry(svn_temp_serializer__context_t *context,
+ svn_fs_x__dirent_t **entry_p,
+ apr_uint32_t *length)
+{
+ svn_fs_x__dirent_t *entry = *entry_p;
+ apr_size_t initial_length = svn_temp_serializer__get_length(context);
+
+ svn_temp_serializer__push(context,
+ (const void * const *)entry_p,
+ sizeof(svn_fs_x__dirent_t));
+
+ svn_temp_serializer__add_string(context, &entry->name);
+
+ *length = (apr_uint32_t)( svn_temp_serializer__get_length(context)
+ - APR_ALIGN_DEFAULT(initial_length));
+
+ svn_temp_serializer__pop(context);
+}
+
+/* Utility function to serialize the ENTRIES into a new serialization
+ * context to be returned.
+ *
+ * Temporary allocation will be made form SCRATCH_POOL.
+ */
+static svn_temp_serializer__context_t *
+serialize_dir(apr_array_header_t *entries,
+ apr_pool_t *scratch_pool)
+{
+ dir_data_t dir_data;
+ int i = 0;
+ svn_temp_serializer__context_t *context;
+
+ /* calculate sizes */
+ int count = entries->nelts;
+ apr_size_t over_provision = 2 + count / 4;
+ apr_size_t entries_len = (count + over_provision)
+ * sizeof(svn_fs_x__dirent_t*);
+ apr_size_t lengths_len = (count + over_provision) * sizeof(apr_uint32_t);
+
+ /* copy the hash entries to an auxiliary struct of known layout */
+ dir_data.count = count;
+ dir_data.over_provision = over_provision;
+ dir_data.operations = 0;
+ dir_data.entries = apr_palloc(scratch_pool, entries_len);
+ dir_data.lengths = apr_palloc(scratch_pool, lengths_len);
+
+ for (i = 0; i < count; ++i)
+ dir_data.entries[i] = APR_ARRAY_IDX(entries, i, svn_fs_x__dirent_t *);
+
+ /* Serialize that aux. structure into a new one. Also, provide a good
+ * estimate for the size of the buffer that we will need. */
+ context = svn_temp_serializer__init(&dir_data,
+ sizeof(dir_data),
+ 50 + count * 200 + entries_len,
+ scratch_pool);
+
+ /* serialize entries references */
+ svn_temp_serializer__push(context,
+ (const void * const *)&dir_data.entries,
+ entries_len);
+
+ /* serialize the individual entries and their sub-structures */
+ for (i = 0; i < count; ++i)
+ serialize_dir_entry(context,
+ &dir_data.entries[i],
+ &dir_data.lengths[i]);
+
+ svn_temp_serializer__pop(context);
+
+ /* serialize entries references */
+ svn_temp_serializer__push(context,
+ (const void * const *)&dir_data.lengths,
+ lengths_len);
+
+ return context;
+}
+
+/* Utility function to reconstruct a dir entries array from serialized data
+ * in BUFFER and DIR_DATA. Allocation will be made form POOL.
+ */
+static apr_array_header_t *
+deserialize_dir(void *buffer, dir_data_t *dir_data, apr_pool_t *pool)
+{
+ apr_array_header_t *result
+ = apr_array_make(pool, dir_data->count, sizeof(svn_fs_x__dirent_t *));
+ apr_size_t i;
+ apr_size_t count;
+ svn_fs_x__dirent_t *entry;
+ svn_fs_x__dirent_t **entries;
+
+ /* resolve the reference to the entries array */
+ svn_temp_deserializer__resolve(buffer, (void **)&dir_data->entries);
+ entries = dir_data->entries;
+
+ /* fixup the references within each entry and add it to the hash */
+ for (i = 0, count = dir_data->count; i < count; ++i)
+ {
+ svn_temp_deserializer__resolve(entries, (void **)&entries[i]);
+ entry = dir_data->entries[i];
+
+ /* pointer fixup */
+ svn_temp_deserializer__resolve(entry, (void **)&entry->name);
+
+ /* add the entry to the hash */
+ APR_ARRAY_PUSH(result, svn_fs_x__dirent_t *) = entry;
+ }
+
+ /* return the now complete hash */
+ return result;
+}
+
+void
+svn_fs_x__noderev_serialize(svn_temp_serializer__context_t *context,
+ svn_fs_x__noderev_t * const *noderev_p)
+{
+ const svn_fs_x__noderev_t *noderev = *noderev_p;
+ if (noderev == NULL)
+ return;
+
+ /* serialize the representation struct itself */
+ svn_temp_serializer__push(context,
+ (const void * const *)noderev_p,
+ sizeof(*noderev));
+
+ /* serialize sub-structures */
+ serialize_representation(context, &noderev->prop_rep);
+ serialize_representation(context, &noderev->data_rep);
+
+ svn_temp_serializer__add_string(context, &noderev->copyfrom_path);
+ svn_temp_serializer__add_string(context, &noderev->copyroot_path);
+ svn_temp_serializer__add_string(context, &noderev->created_path);
+
+ /* return to the caller's nesting level */
+ svn_temp_serializer__pop(context);
+}
+
+
+void
+svn_fs_x__noderev_deserialize(void *buffer,
+ svn_fs_x__noderev_t **noderev_p,
+ apr_pool_t *pool)
+{
+ svn_fs_x__noderev_t *noderev;
+
+ /* fixup the reference to the representation itself,
+ * if this is part of a parent structure. */
+ if (buffer != *noderev_p)
+ svn_temp_deserializer__resolve(buffer, (void **)noderev_p);
+
+ noderev = *noderev_p;
+ if (noderev == NULL)
+ return;
+
+ /* fixup of sub-structures */
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->prop_rep);
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->data_rep);
+
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->copyfrom_path);
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->copyroot_path);
+ svn_temp_deserializer__resolve(noderev, (void **)&noderev->created_path);
+}
+
+
+/* Utility function to serialize COUNT svn_txdelta_op_t objects
+ * at OPS in the given serialization CONTEXT.
+ */
+static void
+serialize_txdelta_ops(svn_temp_serializer__context_t *context,
+ const svn_txdelta_op_t * const * ops,
+ apr_size_t count)
+{
+ if (*ops == NULL)
+ return;
+
+ /* the ops form a contiguous chunk of memory with no further references */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)ops,
+ count * sizeof(svn_txdelta_op_t));
+}
+
+/* Utility function to serialize W in the given serialization CONTEXT.
+ */
+static void
+serialize_txdeltawindow(svn_temp_serializer__context_t *context,
+ svn_txdelta_window_t * const * w)
+{
+ svn_txdelta_window_t *window = *w;
+
+ /* serialize the window struct itself */
+ svn_temp_serializer__push(context,
+ (const void * const *)w,
+ sizeof(svn_txdelta_window_t));
+
+ /* serialize its sub-structures */
+ serialize_txdelta_ops(context, &window->ops, window->num_ops);
+ serialize_svn_string(context, &window->new_data);
+
+ svn_temp_serializer__pop(context);
+}
+
+svn_error_t *
+svn_fs_x__serialize_txdelta_window(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool)
+{
+ svn_fs_x__txdelta_cached_window_t *window_info = item;
+ svn_stringbuf_t *serialized;
+
+ /* initialize the serialization process and allocate a buffer large
+ * enough to do without the need of re-allocations in most cases. */
+ apr_size_t text_len = window_info->window->new_data
+ ? window_info->window->new_data->len
+ : 0;
+ svn_temp_serializer__context_t *context =
+ svn_temp_serializer__init(window_info,
+ sizeof(*window_info),
+ 500 + text_len,
+ pool);
+
+ /* serialize the sub-structure(s) */
+ serialize_txdeltawindow(context, &window_info->window);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *buffer = serialized->data;
+ *buffer_size = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_txdelta_window(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool)
+{
+ svn_txdelta_window_t *window;
+
+ /* Copy the _full_ buffer as it also contains the sub-structures. */
+ svn_fs_x__txdelta_cached_window_t *window_info =
+ (svn_fs_x__txdelta_cached_window_t *)buffer;
+
+ /* pointer reference fixup */
+ svn_temp_deserializer__resolve(window_info,
+ (void **)&window_info->window);
+ window = window_info->window;
+
+ svn_temp_deserializer__resolve(window, (void **)&window->ops);
+
+ deserialize_svn_string(window, (svn_string_t**)&window->new_data);
+
+ /* done */
+ *item = window_info;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_manifest(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *manifest = in;
+
+ *data_len = sizeof(apr_off_t) *manifest->nelts;
+ *data = apr_palloc(pool, *data_len);
+ memcpy(*data, manifest->elts, *data_len);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_manifest(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *manifest = apr_array_make(pool, 1, sizeof(apr_off_t));
+
+ manifest->nelts = (int) (data_len / sizeof(apr_off_t));
+ manifest->nalloc = (int) (data_len / sizeof(apr_off_t));
+ manifest->elts = (char*)data;
+
+ *out = manifest;
+
+ return SVN_NO_ERROR;
+}
+
+/* Auxiliary structure representing the content of a properties hash.
+ This structure is much easier to (de-)serialize than an apr_hash.
+ */
+typedef struct properties_data_t
+{
+ /* number of entries in the hash */
+ apr_size_t count;
+
+ /* reference to the keys */
+ const char **keys;
+
+ /* reference to the values */
+ const svn_string_t **values;
+} properties_data_t;
+
+/* Serialize COUNT C-style strings from *STRINGS into CONTEXT. */
+static void
+serialize_cstring_array(svn_temp_serializer__context_t *context,
+ const char ***strings,
+ apr_size_t count)
+{
+ apr_size_t i;
+ const char **entries = *strings;
+
+ /* serialize COUNT entries pointers (the array) */
+ svn_temp_serializer__push(context,
+ (const void * const *)strings,
+ count * sizeof(const char*));
+
+ /* serialize array elements */
+ for (i = 0; i < count; ++i)
+ svn_temp_serializer__add_string(context, &entries[i]);
+
+ svn_temp_serializer__pop(context);
+}
+
+/* Serialize COUNT svn_string_t* items from *STRINGS into CONTEXT. */
+static void
+serialize_svn_string_array(svn_temp_serializer__context_t *context,
+ const svn_string_t ***strings,
+ apr_size_t count)
+{
+ apr_size_t i;
+ const svn_string_t **entries = *strings;
+
+ /* serialize COUNT entries pointers (the array) */
+ svn_temp_serializer__push(context,
+ (const void * const *)strings,
+ count * sizeof(const char*));
+
+ /* serialize array elements */
+ for (i = 0; i < count; ++i)
+ serialize_svn_string(context, &entries[i]);
+
+ svn_temp_serializer__pop(context);
+}
+
+svn_error_t *
+svn_fs_x__serialize_properties(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_hash_t *hash = in;
+ properties_data_t properties;
+ svn_temp_serializer__context_t *context;
+ apr_hash_index_t *hi;
+ svn_stringbuf_t *serialized;
+ apr_size_t i;
+
+ /* create our auxiliary data structure */
+ properties.count = apr_hash_count(hash);
+ properties.keys = apr_palloc(pool, sizeof(const char*) * (properties.count + 1));
+ properties.values = apr_palloc(pool, sizeof(const char*) * properties.count);
+
+ /* populate it with the hash entries */
+ for (hi = apr_hash_first(pool, hash), i=0; hi; hi = apr_hash_next(hi), ++i)
+ {
+ properties.keys[i] = apr_hash_this_key(hi);
+ properties.values[i] = apr_hash_this_val(hi);
+ }
+
+ /* serialize it */
+ context = svn_temp_serializer__init(&properties,
+ sizeof(properties),
+ properties.count * 100,
+ pool);
+
+ properties.keys[i] = "";
+ serialize_cstring_array(context, &properties.keys, properties.count + 1);
+ serialize_svn_string_array(context, &properties.values, properties.count);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_properties(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ apr_hash_t *hash = svn_hash__make(pool);
+ properties_data_t *properties = (properties_data_t *)data;
+ size_t i;
+
+ /* de-serialize our auxiliary data structure */
+ svn_temp_deserializer__resolve(properties, (void**)&properties->keys);
+ svn_temp_deserializer__resolve(properties, (void**)&properties->values);
+
+ /* de-serialize each entry and put it into the hash */
+ for (i = 0; i < properties->count; ++i)
+ {
+ apr_size_t len = properties->keys[i+1] - properties->keys[i] - 1;
+ svn_temp_deserializer__resolve(properties->keys,
+ (void**)&properties->keys[i]);
+
+ deserialize_svn_string(properties->values,
+ (svn_string_t **)&properties->values[i]);
+
+ apr_hash_set(hash,
+ properties->keys[i], len,
+ properties->values[i]);
+ }
+
+ /* done */
+ *out = hash;
+
+ return SVN_NO_ERROR;
+}
+
+/** Caching svn_fs_x__noderev_t objects. **/
+
+svn_error_t *
+svn_fs_x__serialize_node_revision(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *serialized;
+ svn_fs_x__noderev_t *noderev = item;
+
+ /* create an (empty) serialization context with plenty of (initial)
+ * buffer space. */
+ svn_temp_serializer__context_t *context =
+ svn_temp_serializer__init(NULL, 0,
+ 1024 - SVN_TEMP_SERIALIZER__OVERHEAD,
+ pool);
+
+ /* serialize the noderev */
+ svn_fs_x__noderev_serialize(context, &noderev);
+
+ /* return serialized data */
+ serialized = svn_temp_serializer__get(context);
+ *buffer = serialized->data;
+ *buffer_size = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_node_revision(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool)
+{
+ /* Copy the _full_ buffer as it also contains the sub-structures. */
+ svn_fs_x__noderev_t *noderev = (svn_fs_x__noderev_t *)buffer;
+
+ /* fixup of all pointers etc. */
+ svn_fs_x__noderev_deserialize(noderev, &noderev, pool);
+
+ /* done */
+ *item = noderev;
+ return SVN_NO_ERROR;
+}
+
+/* Utility function that returns the directory serialized inside CONTEXT
+ * to DATA and DATA_LEN. */
+static svn_error_t *
+return_serialized_dir_context(svn_temp_serializer__context_t *context,
+ void **data,
+ apr_size_t *data_len)
+{
+ svn_stringbuf_t *serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->blocksize;
+ ((dir_data_t *)serialized->data)->len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_dir_entries(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *dir = in;
+
+ /* serialize the dir content into a new serialization context
+ * and return the serialized data */
+ return return_serialized_dir_context(serialize_dir(dir, pool),
+ data,
+ data_len);
+}
+
+svn_error_t *
+svn_fs_x__deserialize_dir_entries(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ /* Copy the _full_ buffer as it also contains the sub-structures. */
+ dir_data_t *dir_data = (dir_data_t *)data;
+
+ /* reconstruct the hash from the serialized data */
+ *out = deserialize_dir(dir_data, dir_data, pool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_sharded_offset(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ const apr_off_t *manifest = data;
+ apr_int64_t shard_pos = *(apr_int64_t *)baton;
+
+ *(apr_off_t *)out = manifest[shard_pos];
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility function that returns the lowest index of the first entry in
+ * *ENTRIES that points to a dir entry with a name equal or larger than NAME.
+ * If an exact match has been found, *FOUND will be set to TRUE. COUNT is
+ * the number of valid entries in ENTRIES.
+ */
+static apr_size_t
+find_entry(svn_fs_x__dirent_t **entries,
+ const char *name,
+ apr_size_t count,
+ svn_boolean_t *found)
+{
+ /* binary search for the desired entry by name */
+ apr_size_t lower = 0;
+ apr_size_t upper = count;
+ apr_size_t middle;
+
+ for (middle = upper / 2; lower < upper; middle = (upper + lower) / 2)
+ {
+ const svn_fs_x__dirent_t *entry =
+ svn_temp_deserializer__ptr(entries, (const void *const *)&entries[middle]);
+ const char* entry_name =
+ svn_temp_deserializer__ptr(entry, (const void *const *)&entry->name);
+
+ int diff = strcmp(entry_name, name);
+ if (diff < 0)
+ lower = middle + 1;
+ else
+ upper = middle;
+ }
+
+ /* check whether we actually found a match */
+ *found = FALSE;
+ if (lower < count)
+ {
+ const svn_fs_x__dirent_t *entry =
+ svn_temp_deserializer__ptr(entries, (const void *const *)&entries[lower]);
+ const char* entry_name =
+ svn_temp_deserializer__ptr(entry, (const void *const *)&entry->name);
+
+ if (strcmp(entry_name, name) == 0)
+ *found = TRUE;
+ }
+
+ return lower;
+}
+
+/* Utility function that returns TRUE if entry number IDX in ENTRIES has the
+ * name NAME.
+ */
+static svn_boolean_t
+found_entry(const svn_fs_x__dirent_t * const *entries,
+ const char *name,
+ apr_size_t idx)
+{
+ /* check whether we actually found a match */
+ const svn_fs_x__dirent_t *entry =
+ svn_temp_deserializer__ptr(entries, (const void *const *)&entries[idx]);
+ const char* entry_name =
+ svn_temp_deserializer__ptr(entry, (const void *const *)&entry->name);
+
+ return strcmp(entry_name, name) == 0;
+}
+
+svn_error_t *
+svn_fs_x__extract_dir_entry(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ const dir_data_t *dir_data = data;
+ svn_fs_x__ede_baton_t *b = baton;
+ svn_boolean_t found;
+ apr_size_t pos;
+
+ /* resolve the reference to the entries array */
+ const svn_fs_x__dirent_t * const *entries =
+ svn_temp_deserializer__ptr(data, (const void *const *)&dir_data->entries);
+
+ /* resolve the reference to the lengths array */
+ const apr_uint32_t *lengths =
+ svn_temp_deserializer__ptr(data, (const void *const *)&dir_data->lengths);
+
+ /* Special case: Early out for empty directories.
+ That simplifies tests further down the road. */
+ *out = NULL;
+ if (dir_data->count == 0)
+ return SVN_NO_ERROR;
+
+ /* HINT _might_ be the position we hit last time.
+ If within valid range, check whether HINT+1 is a hit. */
+ if ( b->hint < dir_data->count - 1
+ && found_entry(entries, b->name, b->hint + 1))
+ {
+ /* Got lucky. */
+ pos = b->hint + 1;
+ found = TRUE;
+ }
+ else
+ {
+ /* Binary search for the desired entry by name. */
+ pos = find_entry((svn_fs_x__dirent_t **)entries, b->name,
+ dir_data->count, &found);
+ }
+
+ /* Remember the hit index - if we FOUND the entry. */
+ if (found)
+ b->hint = pos;
+
+ /* de-serialize that entry or return NULL, if no match has been found */
+ if (found)
+ {
+ const svn_fs_x__dirent_t *source =
+ svn_temp_deserializer__ptr(entries, (const void *const *)&entries[pos]);
+
+ /* Entries have been serialized one-by-one, each time including all
+ * nested structures and strings. Therefore, they occupy a single
+ * block of memory whose end-offset is either the beginning of the
+ * next entry or the end of the buffer
+ */
+ apr_size_t size = lengths[pos];
+
+ /* copy & deserialize the entry */
+ svn_fs_x__dirent_t *new_entry = apr_palloc(pool, size);
+ memcpy(new_entry, source, size);
+
+ svn_temp_deserializer__resolve(new_entry, (void **)&new_entry->name);
+ *(svn_fs_x__dirent_t **)out = new_entry;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility function for svn_fs_x__replace_dir_entry that implements the
+ * modification as a simply deserialize / modify / serialize sequence.
+ */
+static svn_error_t *
+slowly_replace_dir_entry(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ replace_baton_t *replace_baton = (replace_baton_t *)baton;
+ dir_data_t *dir_data = (dir_data_t *)*data;
+ apr_array_header_t *dir;
+ int idx = -1;
+ svn_fs_x__dirent_t *entry;
+
+ SVN_ERR(svn_fs_x__deserialize_dir_entries((void **)&dir,
+ *data,
+ dir_data->len,
+ pool));
+
+ entry = svn_fs_x__find_dir_entry(dir, replace_baton->name, &idx);
+
+ /* Replacement or removal? */
+ if (replace_baton->new_entry)
+ {
+ /* Replace ENTRY with / insert the NEW_ENTRY */
+ if (entry)
+ APR_ARRAY_IDX(dir, idx, svn_fs_x__dirent_t *)
+ = replace_baton->new_entry;
+ else
+ svn_sort__array_insert(dir, &replace_baton->new_entry, idx);
+ }
+ else
+ {
+ /* Remove the old ENTRY. */
+ if (entry)
+ svn_sort__array_delete(dir, idx, 1);
+ }
+
+ return svn_fs_x__serialize_dir_entries(data, data_len, dir, pool);
+}
+
+svn_error_t *
+svn_fs_x__replace_dir_entry(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *pool)
+{
+ replace_baton_t *replace_baton = (replace_baton_t *)baton;
+ dir_data_t *dir_data = (dir_data_t *)*data;
+ svn_boolean_t found;
+ svn_fs_x__dirent_t **entries;
+ apr_uint32_t *lengths;
+ apr_uint32_t length;
+ apr_size_t pos;
+
+ svn_temp_serializer__context_t *context;
+
+ /* after quite a number of operations, let's re-pack everything.
+ * This is to limit the number of wasted space as we cannot overwrite
+ * existing data but must always append. */
+ if (dir_data->operations > 2 + dir_data->count / 4)
+ return slowly_replace_dir_entry(data, data_len, baton, pool);
+
+ /* resolve the reference to the entries array */
+ entries = (svn_fs_x__dirent_t **)
+ svn_temp_deserializer__ptr((const char *)dir_data,
+ (const void *const *)&dir_data->entries);
+
+ /* resolve the reference to the lengths array */
+ lengths = (apr_uint32_t *)
+ svn_temp_deserializer__ptr((const char *)dir_data,
+ (const void *const *)&dir_data->lengths);
+
+ /* binary search for the desired entry by name */
+ pos = find_entry(entries, replace_baton->name, dir_data->count, &found);
+
+ /* handle entry removal (if found at all) */
+ if (replace_baton->new_entry == NULL)
+ {
+ if (found)
+ {
+ /* remove reference to the entry from the index */
+ memmove(&entries[pos],
+ &entries[pos + 1],
+ sizeof(entries[pos]) * (dir_data->count - pos));
+ memmove(&lengths[pos],
+ &lengths[pos + 1],
+ sizeof(lengths[pos]) * (dir_data->count - pos));
+
+ dir_data->count--;
+ dir_data->over_provision++;
+ dir_data->operations++;
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+ /* if not found, prepare to insert the new entry */
+ if (!found)
+ {
+ /* fallback to slow operation if there is no place left to insert an
+ * new entry to index. That will automatically give add some spare
+ * entries ("overprovision"). */
+ if (dir_data->over_provision == 0)
+ return slowly_replace_dir_entry(data, data_len, baton, pool);
+
+ /* make entries[index] available for pointing to the new entry */
+ memmove(&entries[pos + 1],
+ &entries[pos],
+ sizeof(entries[pos]) * (dir_data->count - pos));
+ memmove(&lengths[pos + 1],
+ &lengths[pos],
+ sizeof(lengths[pos]) * (dir_data->count - pos));
+
+ dir_data->count++;
+ dir_data->over_provision--;
+ dir_data->operations++;
+ }
+
+ /* de-serialize the new entry */
+ entries[pos] = replace_baton->new_entry;
+ context = svn_temp_serializer__init_append(dir_data,
+ entries,
+ dir_data->len,
+ *data_len,
+ pool);
+ serialize_dir_entry(context, &entries[pos], &length);
+
+ /* return the updated serialized data */
+ SVN_ERR (return_serialized_dir_context(context,
+ data,
+ data_len));
+
+ /* since the previous call may have re-allocated the buffer, the lengths
+ * pointer may no longer point to the entry in that buffer. Therefore,
+ * re-map it again and store the length value after that. */
+
+ dir_data = (dir_data_t *)*data;
+ lengths = (apr_uint32_t *)
+ svn_temp_deserializer__ptr((const char *)dir_data,
+ (const void *const *)&dir_data->lengths);
+ lengths[pos] = length;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__serialize_rep_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_fs_x__rep_header_t *copy = apr_palloc(pool, sizeof(*copy));
+ *copy = *(svn_fs_x__rep_header_t *)in;
+
+ *data_len = sizeof(svn_fs_x__rep_header_t);
+ *data = copy;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_rep_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ svn_fs_x__rep_header_t *copy = apr_palloc(pool, sizeof(*copy));
+ SVN_ERR_ASSERT(data_len == sizeof(*copy));
+
+ *copy = *(svn_fs_x__rep_header_t *)data;
+ *out = data;
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility function to serialize change CHANGE_P in the given serialization
+ * CONTEXT.
+ */
+static void
+serialize_change(svn_temp_serializer__context_t *context,
+ svn_fs_x__change_t * const *change_p)
+{
+ const svn_fs_x__change_t * change = *change_p;
+ if (change == NULL)
+ return;
+
+ /* serialize the change struct itself */
+ svn_temp_serializer__push(context,
+ (const void * const *)change_p,
+ sizeof(*change));
+
+ /* serialize sub-structures */
+ svn_temp_serializer__add_string(context, &change->path.data);
+ svn_temp_serializer__add_string(context, &change->copyfrom_path);
+
+ /* return to the caller's nesting level */
+ svn_temp_serializer__pop(context);
+}
+
+/* Utility function to serialize the CHANGE_P within the given
+ * serialization CONTEXT.
+ */
+static void
+deserialize_change(void *buffer,
+ svn_fs_x__change_t **change_p,
+ apr_pool_t *pool)
+{
+ svn_fs_x__change_t * change;
+
+ /* fix-up of the pointer to the struct in question */
+ svn_temp_deserializer__resolve(buffer, (void **)change_p);
+
+ change = *change_p;
+ if (change == NULL)
+ return;
+
+ /* fix-up of sub-structures */
+ svn_temp_deserializer__resolve(change, (void **)&change->path.data);
+ svn_temp_deserializer__resolve(change, (void **)&change->copyfrom_path);
+}
+
+/* Auxiliary structure representing the content of a svn_fs_x__change_t array.
+ This structure is much easier to (de-)serialize than an APR array.
+ */
+typedef struct changes_data_t
+{
+ /* number of entries in the array */
+ int count;
+
+ /* reference to the changes */
+ svn_fs_x__change_t **changes;
+} changes_data_t;
+
+svn_error_t *
+svn_fs_x__serialize_changes(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *array = in;
+ changes_data_t changes;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ int i;
+
+ /* initialize our auxiliary data structure and link it to the
+ * array elements */
+ changes.count = array->nelts;
+ changes.changes = (svn_fs_x__change_t **)array->elts;
+
+ /* serialize it and all its elements */
+ context = svn_temp_serializer__init(&changes,
+ sizeof(changes),
+ changes.count * 250,
+ pool);
+
+ svn_temp_serializer__push(context,
+ (const void * const *)&changes.changes,
+ changes.count * sizeof(svn_fs_x__change_t*));
+
+ for (i = 0; i < changes.count; ++i)
+ serialize_change(context, &changes.changes[i]);
+
+ svn_temp_serializer__pop(context);
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_changes(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ int i;
+ changes_data_t *changes = (changes_data_t *)data;
+ apr_array_header_t *array = apr_array_make(pool, 0,
+ sizeof(svn_fs_x__change_t *));
+
+ /* de-serialize our auxiliary data structure */
+ svn_temp_deserializer__resolve(changes, (void**)&changes->changes);
+
+ /* de-serialize each entry and add it to the array */
+ for (i = 0; i < changes->count; ++i)
+ deserialize_change(changes->changes,
+ (svn_fs_x__change_t **)&changes->changes[i],
+ pool);
+
+ /* Use the changes buffer as the array's data buffer
+ * (DATA remains valid for at least as long as POOL). */
+ array->elts = (char *)changes->changes;
+ array->nelts = changes->count;
+ array->nalloc = changes->count;
+
+ /* done */
+ *out = array;
+
+ return SVN_NO_ERROR;
+}
+
+/* Auxiliary structure representing the content of a svn_mergeinfo_t hash.
+ This structure is much easier to (de-)serialize than an APR array.
+ */
+typedef struct mergeinfo_data_t
+{
+ /* number of paths in the hash */
+ unsigned count;
+
+ /* COUNT keys (paths) */
+ const char **keys;
+
+ /* COUNT keys lengths (strlen of path) */
+ apr_ssize_t *key_lengths;
+
+ /* COUNT entries, each giving the number of ranges for the key */
+ int *range_counts;
+
+ /* all ranges in a single, concatenated buffer */
+ svn_merge_range_t *ranges;
+} mergeinfo_data_t;
+
+svn_error_t *
+svn_fs_x__serialize_mergeinfo(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool)
+{
+ svn_mergeinfo_t mergeinfo = in;
+ mergeinfo_data_t merges;
+ svn_temp_serializer__context_t *context;
+ svn_stringbuf_t *serialized;
+ apr_hash_index_t *hi;
+ unsigned i;
+ int k;
+ apr_size_t range_count;
+
+ /* initialize our auxiliary data structure */
+ merges.count = apr_hash_count(mergeinfo);
+ merges.keys = apr_palloc(pool, sizeof(*merges.keys) * merges.count);
+ merges.key_lengths = apr_palloc(pool, sizeof(*merges.key_lengths) *
+ merges.count);
+ merges.range_counts = apr_palloc(pool, sizeof(*merges.range_counts) *
+ merges.count);
+
+ i = 0;
+ range_count = 0;
+ for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi), ++i)
+ {
+ svn_rangelist_t *ranges;
+ apr_hash_this(hi, (const void**)&merges.keys[i],
+ &merges.key_lengths[i],
+ (void **)&ranges);
+ merges.range_counts[i] = ranges->nelts;
+ range_count += ranges->nelts;
+ }
+
+ merges.ranges = apr_palloc(pool, sizeof(*merges.ranges) * range_count);
+
+ i = 0;
+ for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
+ {
+ svn_rangelist_t *ranges = apr_hash_this_val(hi);
+ for (k = 0; k < ranges->nelts; ++k, ++i)
+ merges.ranges[i] = *APR_ARRAY_IDX(ranges, k, svn_merge_range_t*);
+ }
+
+ /* serialize it and all its elements */
+ context = svn_temp_serializer__init(&merges,
+ sizeof(merges),
+ range_count * 30,
+ pool);
+
+ /* keys array */
+ svn_temp_serializer__push(context,
+ (const void * const *)&merges.keys,
+ merges.count * sizeof(*merges.keys));
+
+ for (i = 0; i < merges.count; ++i)
+ svn_temp_serializer__add_string(context, &merges.keys[i]);
+
+ svn_temp_serializer__pop(context);
+
+ /* key lengths array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.key_lengths,
+ merges.count * sizeof(*merges.key_lengths));
+
+ /* range counts array */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.range_counts,
+ merges.count * sizeof(*merges.range_counts));
+
+ /* ranges */
+ svn_temp_serializer__add_leaf(context,
+ (const void * const *)&merges.ranges,
+ range_count * sizeof(*merges.ranges));
+
+ /* return the serialized result */
+ serialized = svn_temp_serializer__get(context);
+
+ *data = serialized->data;
+ *data_len = serialized->len;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deserialize_mergeinfo(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool)
+{
+ unsigned i;
+ int k, n;
+ mergeinfo_data_t *merges = (mergeinfo_data_t *)data;
+ svn_mergeinfo_t mergeinfo;
+
+ /* de-serialize our auxiliary data structure */
+ svn_temp_deserializer__resolve(merges, (void**)&merges->keys);
+ svn_temp_deserializer__resolve(merges, (void**)&merges->key_lengths);
+ svn_temp_deserializer__resolve(merges, (void**)&merges->range_counts);
+ svn_temp_deserializer__resolve(merges, (void**)&merges->ranges);
+
+ /* de-serialize keys and add entries to the result */
+ n = 0;
+ mergeinfo = svn_hash__make(pool);
+ for (i = 0; i < merges->count; ++i)
+ {
+ svn_rangelist_t *ranges = apr_array_make(pool,
+ merges->range_counts[i],
+ sizeof(svn_merge_range_t*));
+ for (k = 0; k < merges->range_counts[i]; ++k, ++n)
+ APR_ARRAY_PUSH(ranges, svn_merge_range_t*) = &merges->ranges[n];
+
+ svn_temp_deserializer__resolve(merges->keys,
+ (void**)&merges->keys[i]);
+ apr_hash_set(mergeinfo, merges->keys[i], merges->key_lengths[i], ranges);
+ }
+
+ /* done */
+ *out = mergeinfo;
+
+ return SVN_NO_ERROR;
+}
+
diff --git a/subversion/libsvn_fs_x/temp_serializer.h b/subversion/libsvn_fs_x/temp_serializer.h
new file mode 100644
index 0000000..80f5004
--- /dev/null
+++ b/subversion/libsvn_fs_x/temp_serializer.h
@@ -0,0 +1,301 @@
+/* temp_serializer.h : serialization functions for caching of FSX structures
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__TEMP_SERIALIZER_H
+#define SVN_LIBSVN_FS__TEMP_SERIALIZER_H
+
+#include "private/svn_temp_serializer.h"
+#include "fs.h"
+
+/**
+ * Prepend the @a number to the @a string in a space efficient way such that
+ * no other (number,string) combination can produce the same result.
+ * Allocate temporaries as well as the result from @a pool.
+ */
+const char*
+svn_fs_x__combine_number_and_string(apr_int64_t number,
+ const char *string,
+ apr_pool_t *pool);
+
+/**
+ * Serialize a @a noderev_p within the serialization @a context.
+ */
+void
+svn_fs_x__noderev_serialize(struct svn_temp_serializer__context_t *context,
+ svn_fs_x__noderev_t * const *noderev_p);
+
+/**
+ * Deserialize a @a noderev_p within the @a buffer and associate it with
+ * @a pool.
+ */
+void
+svn_fs_x__noderev_deserialize(void *buffer,
+ svn_fs_x__noderev_t **noderev_p,
+ apr_pool_t *pool);
+
+/**
+ * Serialize APR array @a *a within the serialization @a context.
+ * The elements within the array must not contain pointers.
+ */
+void
+svn_fs_x__serialize_apr_array(struct svn_temp_serializer__context_t *context,
+ apr_array_header_t **a);
+
+/**
+ * Deserialize APR @a *array within the @a buffer. Set its pool member to
+ * @a pool. The elements within the array must not contain pointers.
+ */
+void
+svn_fs_x__deserialize_apr_array(void *buffer,
+ apr_array_header_t **array,
+ apr_pool_t *pool);
+
+
+/**
+ * #svn_txdelta_window_t is not sufficient for caching the data it
+ * represents because data read process needs auxiliary information.
+ */
+typedef struct
+{
+ /* the txdelta window information cached / to be cached */
+ svn_txdelta_window_t *window;
+
+ /* the revision file read pointer position before reading the window */
+ apr_off_t start_offset;
+
+ /* the revision file read pointer position right after reading the window */
+ apr_off_t end_offset;
+} svn_fs_x__txdelta_cached_window_t;
+
+/**
+ * Implements #svn_cache__serialize_func_t for
+ * #svn_fs_x__txdelta_cached_window_t.
+ */
+svn_error_t *
+svn_fs_x__serialize_txdelta_window(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for
+ * #svn_fs_x__txdelta_cached_window_t.
+ */
+svn_error_t *
+svn_fs_x__deserialize_txdelta_window(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for a manifest
+ * (@a in is an #apr_array_header_t of apr_off_t elements).
+ */
+svn_error_t *
+svn_fs_x__serialize_manifest(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for a manifest
+ * (@a *out is an #apr_array_header_t of apr_off_t elements).
+ */
+svn_error_t *
+svn_fs_x__deserialize_manifest(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for a properties hash
+ * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
+ */
+svn_error_t *
+svn_fs_x__serialize_properties(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for a properties hash
+ * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
+ */
+svn_error_t *
+svn_fs_x__deserialize_properties(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for #svn_fs_x__noderev_t
+ */
+svn_error_t *
+svn_fs_x__serialize_node_revision(void **buffer,
+ apr_size_t *buffer_size,
+ void *item,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for #svn_fs_x__noderev_t
+ */
+svn_error_t *
+svn_fs_x__deserialize_node_revision(void **item,
+ void *buffer,
+ apr_size_t buffer_size,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for a directory contents array
+ */
+svn_error_t *
+svn_fs_x__serialize_dir_entries(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for a directory contents array
+ */
+svn_error_t *
+svn_fs_x__deserialize_dir_entries(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__partial_getter_func_t. Set (apr_off_t) @a *out
+ * to the element indexed by (apr_int64_t) @a *baton within the
+ * serialized manifest array @a data and @a data_len. */
+svn_error_t *
+svn_fs_x__get_sharded_offset(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+/**
+ * Baton type to be used with svn_fs_x__extract_dir_entry. */
+typedef struct svn_fs_x__ede_baton_t
+{
+ /* Name of the directory entry to find. */
+ const char *name;
+
+ /* Lookup hint [in / out] */
+ apr_size_t hint;
+} svn_fs_x__ede_baton_t;
+
+/**
+ * Implements #svn_cache__partial_getter_func_t for a single
+ * #svn_fs_x__dirent_t within a serialized directory contents hash,
+ * identified by its name (given in @a svn_fs_x__ede_baton_t @a *baton).
+ */
+svn_error_t *
+svn_fs_x__extract_dir_entry(void **out,
+ const void *data,
+ apr_size_t data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+/**
+ * Describes the change to be done to a directory: Set the entry
+ * identify by @a name to the value @a new_entry. If the latter is
+ * @c NULL, the entry shall be removed if it exists. Otherwise it
+ * will be replaced or automatically added, respectively.
+ */
+typedef struct replace_baton_t
+{
+ /** name of the directory entry to modify */
+ const char *name;
+
+ /** directory entry to insert instead */
+ svn_fs_x__dirent_t *new_entry;
+} replace_baton_t;
+
+/**
+ * Implements #svn_cache__partial_setter_func_t for a single
+ * #svn_fs_x__dirent_t within a serialized directory contents hash,
+ * identified by its name in the #replace_baton_t in @a baton.
+ */
+svn_error_t *
+svn_fs_x__replace_dir_entry(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for a #svn_fs_x__rep_header_t.
+ */
+svn_error_t *
+svn_fs_x__serialize_rep_header(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for a #svn_fs_x__rep_header_t.
+ */
+svn_error_t *
+svn_fs_x__deserialize_rep_header(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for an #apr_array_header_t of
+ * #svn_fs_x__change_t *.
+ */
+svn_error_t *
+svn_fs_x__serialize_changes(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for an #apr_array_header_t of
+ * #svn_fs_x__change_t *.
+ */
+svn_error_t *
+svn_fs_x__deserialize_changes(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__serialize_func_t for #svn_mergeinfo_t objects.
+ */
+svn_error_t *
+svn_fs_x__serialize_mergeinfo(void **data,
+ apr_size_t *data_len,
+ void *in,
+ apr_pool_t *pool);
+
+/**
+ * Implements #svn_cache__deserialize_func_t for #svn_mergeinfo_t objects.
+ */
+svn_error_t *
+svn_fs_x__deserialize_mergeinfo(void **out,
+ void *data,
+ apr_size_t data_len,
+ apr_pool_t *pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/transaction.c b/subversion/libsvn_fs_x/transaction.c
new file mode 100644
index 0000000..5f3adc5
--- /dev/null
+++ b/subversion/libsvn_fs_x/transaction.c
@@ -0,0 +1,3782 @@
+/* transaction.c --- transaction-related functions of FSX
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "transaction.h"
+
+#include <assert.h>
+#include <apr_sha1.h>
+
+#include "svn_hash.h"
+#include "svn_props.h"
+#include "svn_sorts.h"
+#include "svn_time.h"
+#include "svn_dirent_uri.h"
+
+#include "fs_x.h"
+#include "tree.h"
+#include "util.h"
+#include "id.h"
+#include "low_level.h"
+#include "temp_serializer.h"
+#include "cached_data.h"
+#include "lock.h"
+#include "rep-cache.h"
+#include "index.h"
+
+#include "private/svn_fs_util.h"
+#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_io_private.h"
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* The vtable associated with an open transaction object. */
+static txn_vtable_t txn_vtable = {
+ svn_fs_x__commit_txn,
+ svn_fs_x__abort_txn,
+ svn_fs_x__txn_prop,
+ svn_fs_x__txn_proplist,
+ svn_fs_x__change_txn_prop,
+ svn_fs_x__txn_root,
+ svn_fs_x__change_txn_props
+};
+
+/* FSX-specific data being attached to svn_fs_txn_t.
+ */
+typedef struct fs_txn_data_t
+{
+ /* Strongly typed representation of the TXN's ID member. */
+ svn_fs_x__txn_id_t txn_id;
+} fs_txn_data_t;
+
+svn_fs_x__txn_id_t
+svn_fs_x__txn_get_id(svn_fs_txn_t *txn)
+{
+ fs_txn_data_t *ftd = txn->fsap_data;
+ return ftd->txn_id;
+}
+
+/* Functions for working with shared transaction data. */
+
+/* Return the transaction object for transaction TXN_ID from the
+ transaction list of filesystem FS (which must already be locked via the
+ txn_list_lock mutex). If the transaction does not exist in the list,
+ then create a new transaction object and return it (if CREATE_NEW is
+ true) or return NULL (otherwise). */
+static svn_fs_x__shared_txn_data_t *
+get_shared_txn(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_boolean_t create_new)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__shared_data_t *ffsd = ffd->shared;
+ svn_fs_x__shared_txn_data_t *txn;
+
+ for (txn = ffsd->txns; txn; txn = txn->next)
+ if (txn->txn_id == txn_id)
+ break;
+
+ if (txn || !create_new)
+ return txn;
+
+ /* Use the transaction object from the (single-object) freelist,
+ if one is available, or otherwise create a new object. */
+ if (ffsd->free_txn)
+ {
+ txn = ffsd->free_txn;
+ ffsd->free_txn = NULL;
+ }
+ else
+ {
+ apr_pool_t *subpool = svn_pool_create(ffsd->common_pool);
+ txn = apr_palloc(subpool, sizeof(*txn));
+ txn->pool = subpool;
+ }
+
+ txn->txn_id = txn_id;
+ txn->being_written = FALSE;
+
+ /* Link this transaction into the head of the list. We will typically
+ be dealing with only one active transaction at a time, so it makes
+ sense for searches through the transaction list to look at the
+ newest transactions first. */
+ txn->next = ffsd->txns;
+ ffsd->txns = txn;
+
+ return txn;
+}
+
+/* Free the transaction object for transaction TXN_ID, and remove it
+ from the transaction list of filesystem FS (which must already be
+ locked via the txn_list_lock mutex). Do nothing if the transaction
+ does not exist. */
+static void
+free_shared_txn(svn_fs_t *fs, svn_fs_x__txn_id_t txn_id)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__shared_data_t *ffsd = ffd->shared;
+ svn_fs_x__shared_txn_data_t *txn, *prev = NULL;
+
+ for (txn = ffsd->txns; txn; prev = txn, txn = txn->next)
+ if (txn->txn_id == txn_id)
+ break;
+
+ if (!txn)
+ return;
+
+ if (prev)
+ prev->next = txn->next;
+ else
+ ffsd->txns = txn->next;
+
+ /* As we typically will be dealing with one transaction after another,
+ we will maintain a single-object free list so that we can hopefully
+ keep reusing the same transaction object. */
+ if (!ffsd->free_txn)
+ ffsd->free_txn = txn;
+ else
+ svn_pool_destroy(txn->pool);
+}
+
+
+/* Obtain a lock on the transaction list of filesystem FS, call BODY
+ with FS, BATON, and POOL, and then unlock the transaction list.
+ Return what BODY returned. */
+static svn_error_t *
+with_txnlist_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(svn_fs_t *fs,
+ const void *baton,
+ apr_pool_t *pool),
+ const void *baton,
+ apr_pool_t *pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__shared_data_t *ffsd = ffd->shared;
+
+ SVN_MUTEX__WITH_LOCK(ffsd->txn_list_lock,
+ body(fs, baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Get a lock on empty file LOCK_FILENAME, creating it in RESULT_POOL. */
+static svn_error_t *
+get_lock_on_filesystem(const char *lock_filename,
+ apr_pool_t *result_pool)
+{
+ return svn_error_trace(svn_io__file_lock_autocreate(lock_filename,
+ result_pool));
+}
+
+/* Reset the HAS_WRITE_LOCK member in the FFD given as BATON_VOID.
+ When registered with the pool holding the lock on the lock file,
+ this makes sure the flag gets reset just before we release the lock. */
+static apr_status_t
+reset_lock_flag(void *baton_void)
+{
+ svn_fs_x__data_t *ffd = baton_void;
+ ffd->has_write_lock = FALSE;
+ return APR_SUCCESS;
+}
+
+/* Structure defining a file system lock to be acquired and the function
+ to be executed while the lock is held.
+
+ Instances of this structure may be nested to allow for multiple locks to
+ be taken out before executing the user-provided body. In that case, BODY
+ and BATON of the outer instances will be with_lock and a with_lock_baton_t
+ instance (transparently, no special treatment is required.). It is
+ illegal to attempt to acquire the same lock twice within the same lock
+ chain or via nesting calls using separate lock chains.
+
+ All instances along the chain share the same LOCK_POOL such that only one
+ pool needs to be created and cleared for all locks. We also allocate as
+ much data from that lock pool as possible to minimize memory usage in
+ caller pools. */
+typedef struct with_lock_baton_t
+{
+ /* The filesystem we operate on. Same for all instances along the chain. */
+ svn_fs_t *fs;
+
+ /* Mutex to complement the lock file in an APR threaded process.
+ No-op object for non-threaded processes but never NULL. */
+ svn_mutex__t *mutex;
+
+ /* Path to the file to lock. */
+ const char *lock_path;
+
+ /* If true, set FS->HAS_WRITE_LOCK after we acquired the lock. */
+ svn_boolean_t is_global_lock;
+
+ /* Function body to execute after we acquired the lock.
+ This may be user-provided or a nested call to with_lock(). */
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool);
+
+ /* Baton to pass to BODY; possibly NULL.
+ This may be user-provided or a nested lock baton instance. */
+ void *baton;
+
+ /* Pool for all allocations along the lock chain and BODY. Will hold the
+ file locks and gets destroyed after the outermost BODY returned,
+ releasing all file locks.
+ Same for all instances along the chain. */
+ apr_pool_t *lock_pool;
+
+ /* TRUE, iff BODY is the user-provided body. */
+ svn_boolean_t is_inner_most_lock;
+
+ /* TRUE, iff this is not a nested lock.
+ Then responsible for destroying LOCK_POOL. */
+ svn_boolean_t is_outer_most_lock;
+} with_lock_baton_t;
+
+/* Obtain a write lock on the file BATON->LOCK_PATH and call BATON->BODY
+ with BATON->BATON. If this is the outermost lock call, release all file
+ locks after the body returned. If BATON->IS_GLOBAL_LOCK is set, set the
+ HAS_WRITE_LOCK flag while we keep the write lock. */
+static svn_error_t *
+with_some_lock_file(with_lock_baton_t *baton)
+{
+ apr_pool_t *pool = baton->lock_pool;
+ svn_error_t *err = get_lock_on_filesystem(baton->lock_path, pool);
+
+ if (!err)
+ {
+ svn_fs_t *fs = baton->fs;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ if (baton->is_global_lock)
+ {
+ /* set the "got the lock" flag and register reset function */
+ apr_pool_cleanup_register(pool,
+ ffd,
+ reset_lock_flag,
+ apr_pool_cleanup_null);
+ ffd->has_write_lock = TRUE;
+ }
+
+ /* nobody else will modify the repo state
+ => read HEAD & pack info once */
+ if (baton->is_inner_most_lock)
+ {
+ err = svn_fs_x__update_min_unpacked_rev(fs, pool);
+ if (!err)
+ err = svn_fs_x__youngest_rev(&ffd->youngest_rev_cache, fs, pool);
+ }
+
+ if (!err)
+ err = baton->body(baton->baton, pool);
+ }
+
+ if (baton->is_outer_most_lock)
+ svn_pool_destroy(pool);
+
+ return svn_error_trace(err);
+}
+
+/* Wraps with_some_lock_file, protecting it with BATON->MUTEX.
+
+ SCRATCH_POOL is unused here and only provided for signature compatibility
+ with WITH_LOCK_BATON_T.BODY. */
+static svn_error_t *
+with_lock(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ with_lock_baton_t *lock_baton = baton;
+ SVN_MUTEX__WITH_LOCK(lock_baton->mutex, with_some_lock_file(lock_baton));
+
+ return SVN_NO_ERROR;
+}
+
+/* Enum identifying a filesystem lock. */
+typedef enum lock_id_t
+{
+ write_lock,
+ txn_lock,
+ pack_lock
+} lock_id_t;
+
+/* Initialize BATON->MUTEX, BATON->LOCK_PATH and BATON->IS_GLOBAL_LOCK
+ according to the LOCK_ID. All other members of BATON must already be
+ valid. */
+static void
+init_lock_baton(with_lock_baton_t *baton,
+ lock_id_t lock_id)
+{
+ svn_fs_x__data_t *ffd = baton->fs->fsap_data;
+ svn_fs_x__shared_data_t *ffsd = ffd->shared;
+
+ switch (lock_id)
+ {
+ case write_lock:
+ baton->mutex = ffsd->fs_write_lock;
+ baton->lock_path = svn_fs_x__path_lock(baton->fs, baton->lock_pool);
+ baton->is_global_lock = TRUE;
+ break;
+
+ case txn_lock:
+ baton->mutex = ffsd->txn_current_lock;
+ baton->lock_path = svn_fs_x__path_txn_current_lock(baton->fs,
+ baton->lock_pool);
+ baton->is_global_lock = FALSE;
+ break;
+
+ case pack_lock:
+ baton->mutex = ffsd->fs_pack_lock;
+ baton->lock_path = svn_fs_x__path_pack_lock(baton->fs,
+ baton->lock_pool);
+ baton->is_global_lock = FALSE;
+ break;
+ }
+}
+
+/* Return the baton for the innermost lock of a (potential) lock chain.
+ The baton shall take out LOCK_ID from FS and execute BODY with BATON
+ while the lock is being held. Allocate the result in a sub-pool of
+ RESULT_POOL.
+ */
+static with_lock_baton_t *
+create_lock_baton(svn_fs_t *fs,
+ lock_id_t lock_id,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ /* Allocate everything along the lock chain into a single sub-pool.
+ This minimizes memory usage and cleanup overhead. */
+ apr_pool_t *lock_pool = svn_pool_create(result_pool);
+ with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
+
+ /* Store parameters. */
+ result->fs = fs;
+ result->body = body;
+ result->baton = baton;
+
+ /* File locks etc. will use this pool as well for easy cleanup. */
+ result->lock_pool = lock_pool;
+
+ /* Right now, we are the first, (only, ) and last struct in the chain. */
+ result->is_inner_most_lock = TRUE;
+ result->is_outer_most_lock = TRUE;
+
+ /* Select mutex and lock file path depending on LOCK_ID.
+ Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
+ init_lock_baton(result, lock_id);
+
+ return result;
+}
+
+/* Return a baton that wraps NESTED and requests LOCK_ID as additional lock.
+ *
+ * That means, when you create a lock chain, start with the last / innermost
+ * lock to take out and add the first / outermost lock last.
+ */
+static with_lock_baton_t *
+chain_lock_baton(lock_id_t lock_id,
+ with_lock_baton_t *nested)
+{
+ /* Use the same pool for batons along the lock chain. */
+ apr_pool_t *lock_pool = nested->lock_pool;
+ with_lock_baton_t *result = apr_pcalloc(lock_pool, sizeof(*result));
+
+ /* All locks along the chain operate on the same FS. */
+ result->fs = nested->fs;
+
+ /* Execution of this baton means acquiring the nested lock and its
+ execution. */
+ result->body = with_lock;
+ result->baton = nested;
+
+ /* Shared among all locks along the chain. */
+ result->lock_pool = lock_pool;
+
+ /* We are the new outermost lock but surely not the innermost lock. */
+ result->is_inner_most_lock = FALSE;
+ result->is_outer_most_lock = TRUE;
+ nested->is_outer_most_lock = FALSE;
+
+ /* Select mutex and lock file path depending on LOCK_ID.
+ Also, initialize dependent members (IS_GLOBAL_LOCK only, ATM). */
+ init_lock_baton(result, lock_id);
+
+ return result;
+}
+
+svn_error_t *
+svn_fs_x__with_write_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, write_lock, body, baton,
+ scratch_pool),
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__with_pack_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, pack_lock, body, baton,
+ scratch_pool),
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__with_txn_current_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ with_lock(create_lock_baton(fs, txn_lock, body, baton,
+ scratch_pool),
+ scratch_pool));
+}
+
+svn_error_t *
+svn_fs_x__with_all_locks(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ /* Be sure to use the correct lock ordering as documented in
+ fs_fs_shared_data_t. The lock chain is being created in
+ innermost (last to acquire) -> outermost (first to acquire) order. */
+ with_lock_baton_t *lock_baton
+ = create_lock_baton(fs, write_lock, body, baton, scratch_pool);
+
+ lock_baton = chain_lock_baton(pack_lock, lock_baton);
+ lock_baton = chain_lock_baton(txn_lock, lock_baton);
+
+ return svn_error_trace(with_lock(lock_baton, scratch_pool));
+}
+
+
+/* A structure used by unlock_proto_rev() and unlock_proto_rev_body(),
+ which see. */
+typedef struct unlock_proto_rev_baton_t
+{
+ svn_fs_x__txn_id_t txn_id;
+ void *lockcookie;
+} unlock_proto_rev_baton_t;
+
+/* Callback used in the implementation of unlock_proto_rev(). */
+static svn_error_t *
+unlock_proto_rev_body(svn_fs_t *fs,
+ const void *baton,
+ apr_pool_t *scratch_pool)
+{
+ const unlock_proto_rev_baton_t *b = baton;
+ apr_file_t *lockfile = b->lockcookie;
+ svn_fs_x__shared_txn_data_t *txn = get_shared_txn(fs, b->txn_id, FALSE);
+ apr_status_t apr_err;
+
+ if (!txn)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't unlock unknown transaction '%s'"),
+ svn_fs_x__txn_name(b->txn_id, scratch_pool));
+ if (!txn->being_written)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't unlock nonlocked transaction '%s'"),
+ svn_fs_x__txn_name(b->txn_id, scratch_pool));
+
+ apr_err = apr_file_unlock(lockfile);
+ if (apr_err)
+ return svn_error_wrap_apr
+ (apr_err,
+ _("Can't unlock prototype revision lockfile for transaction '%s'"),
+ svn_fs_x__txn_name(b->txn_id, scratch_pool));
+ apr_err = apr_file_close(lockfile);
+ if (apr_err)
+ return svn_error_wrap_apr
+ (apr_err,
+ _("Can't close prototype revision lockfile for transaction '%s'"),
+ svn_fs_x__txn_name(b->txn_id, scratch_pool));
+
+ txn->being_written = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
+/* Unlock the prototype revision file for transaction TXN_ID in filesystem
+ FS using cookie LOCKCOOKIE. The original prototype revision file must
+ have been closed _before_ calling this function.
+
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+unlock_proto_rev(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ void *lockcookie,
+ apr_pool_t *scratch_pool)
+{
+ unlock_proto_rev_baton_t b;
+
+ b.txn_id = txn_id;
+ b.lockcookie = lockcookie;
+ return with_txnlist_lock(fs, unlock_proto_rev_body, &b, scratch_pool);
+}
+
+/* A structure used by get_writable_proto_rev() and
+ get_writable_proto_rev_body(), which see. */
+typedef struct get_writable_proto_rev_baton_t
+{
+ void **lockcookie;
+ svn_fs_x__txn_id_t txn_id;
+} get_writable_proto_rev_baton_t;
+
+/* Callback used in the implementation of get_writable_proto_rev(). */
+static svn_error_t *
+get_writable_proto_rev_body(svn_fs_t *fs,
+ const void *baton,
+ apr_pool_t *scratch_pool)
+{
+ const get_writable_proto_rev_baton_t *b = baton;
+ void **lockcookie = b->lockcookie;
+ svn_fs_x__shared_txn_data_t *txn = get_shared_txn(fs, b->txn_id, TRUE);
+
+ /* First, ensure that no thread in this process (including this one)
+ is currently writing to this transaction's proto-rev file. */
+ if (txn->being_written)
+ return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
+ _("Cannot write to the prototype revision file "
+ "of transaction '%s' because a previous "
+ "representation is currently being written by "
+ "this process"),
+ svn_fs_x__txn_name(b->txn_id, scratch_pool));
+
+
+ /* We know that no thread in this process is writing to the proto-rev
+ file, and by extension, that no thread in this process is holding a
+ lock on the prototype revision lock file. It is therefore safe
+ for us to attempt to lock this file, to see if any other process
+ is holding a lock. */
+
+ {
+ apr_file_t *lockfile;
+ apr_status_t apr_err;
+ const char *lockfile_path
+ = svn_fs_x__path_txn_proto_rev_lock(fs, b->txn_id, scratch_pool);
+
+ /* Open the proto-rev lockfile, creating it if necessary, as it may
+ not exist if the transaction dates from before the lockfiles were
+ introduced.
+
+ ### We'd also like to use something like svn_io_file_lock2(), but
+ that forces us to create a subpool just to be able to unlock
+ the file, which seems a waste. */
+ SVN_ERR(svn_io_file_open(&lockfile, lockfile_path,
+ APR_WRITE | APR_CREATE, APR_OS_DEFAULT,
+ scratch_pool));
+
+ apr_err = apr_file_lock(lockfile,
+ APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);
+ if (apr_err)
+ {
+ svn_error_clear(svn_io_file_close(lockfile, scratch_pool));
+
+ if (APR_STATUS_IS_EAGAIN(apr_err))
+ return svn_error_createf(SVN_ERR_FS_REP_BEING_WRITTEN, NULL,
+ _("Cannot write to the prototype revision "
+ "file of transaction '%s' because a "
+ "previous representation is currently "
+ "being written by another process"),
+ svn_fs_x__txn_name(b->txn_id,
+ scratch_pool));
+
+ return svn_error_wrap_apr(apr_err,
+ _("Can't get exclusive lock on file '%s'"),
+ svn_dirent_local_style(lockfile_path,
+ scratch_pool));
+ }
+
+ *lockcookie = lockfile;
+ }
+
+ /* We've successfully locked the transaction; mark it as such. */
+ txn->being_written = TRUE;
+
+ return SVN_NO_ERROR;
+}
+
+/* Make sure the length ACTUAL_LENGTH of the proto-revision file PROTO_REV
+ of transaction TXN_ID in filesystem FS matches the proto-index file.
+ Trim any crash / failure related extra data from the proto-rev file.
+
+ If the prototype revision file is too short, we can't do much but bail out.
+
+ Perform all allocations in SCRATCH_POOL. */
+static svn_error_t *
+auto_truncate_proto_rev(svn_fs_t *fs,
+ apr_file_t *proto_rev,
+ apr_off_t actual_length,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ /* Determine file range covered by the proto-index so far. Note that
+ we always append to both file, i.e. the last index entry also
+ corresponds to the last addition in the rev file. */
+ const char *path = svn_fs_x__path_p2l_proto_index(fs, txn_id, scratch_pool);
+ apr_file_t *file;
+ apr_off_t indexed_length;
+
+ SVN_ERR(svn_fs_x__p2l_proto_index_open(&file, path, scratch_pool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_next_offset(&indexed_length, file,
+ scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ /* Handle mismatches. */
+ if (indexed_length < actual_length)
+ SVN_ERR(svn_io_file_trunc(proto_rev, indexed_length, scratch_pool));
+ else if (indexed_length > actual_length)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l proto index offset %s beyond proto"
+ "rev file size %s for TXN %s"),
+ apr_off_t_toa(scratch_pool, indexed_length),
+ apr_off_t_toa(scratch_pool, actual_length),
+ svn_fs_x__txn_name(txn_id, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Get a handle to the prototype revision file for transaction TXN_ID in
+ filesystem FS, and lock it for writing. Return FILE, a file handle
+ positioned at the end of the file, and LOCKCOOKIE, a cookie that
+ should be passed to unlock_proto_rev() to unlock the file once FILE
+ has been closed.
+
+ If the prototype revision file is already locked, return error
+ SVN_ERR_FS_REP_BEING_WRITTEN.
+
+ Perform all allocations in POOL. */
+static svn_error_t *
+get_writable_proto_rev(apr_file_t **file,
+ void **lockcookie,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool)
+{
+ get_writable_proto_rev_baton_t b;
+ svn_error_t *err;
+ apr_off_t end_offset = 0;
+
+ b.lockcookie = lockcookie;
+ b.txn_id = txn_id;
+
+ SVN_ERR(with_txnlist_lock(fs, get_writable_proto_rev_body, &b, pool));
+
+ /* Now open the prototype revision file and seek to the end. */
+ err = svn_io_file_open(file,
+ svn_fs_x__path_txn_proto_rev(fs, txn_id, pool),
+ APR_WRITE | APR_BUFFERED, APR_OS_DEFAULT, pool);
+
+ /* You might expect that we could dispense with the following seek
+ and achieve the same thing by opening the file using APR_APPEND.
+ Unfortunately, APR's buffered file implementation unconditionally
+ places its initial file pointer at the start of the file (even for
+ files opened with APR_APPEND), so we need this seek to reconcile
+ the APR file pointer to the OS file pointer (since we need to be
+ able to read the current file position later). */
+ if (!err)
+ err = svn_io_file_seek(*file, APR_END, &end_offset, pool);
+
+ /* We don't want unused sections (such as leftovers from failed delta
+ stream) in our file. If we use log addressing, we would need an
+ index entry for the unused section and that section would need to
+ be all NUL by convention. So, detect and fix those cases by truncating
+ the protorev file. */
+ if (!err)
+ err = auto_truncate_proto_rev(fs, *file, end_offset, txn_id, pool);
+
+ if (err)
+ {
+ err = svn_error_compose_create(
+ err,
+ unlock_proto_rev(fs, txn_id, *lockcookie, pool));
+
+ *lockcookie = NULL;
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Callback used in the implementation of purge_shared_txn(). */
+static svn_error_t *
+purge_shared_txn_body(svn_fs_t *fs,
+ const void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__txn_id_t txn_id = *(const svn_fs_x__txn_id_t *)baton;
+
+ free_shared_txn(fs, txn_id);
+
+ return SVN_NO_ERROR;
+}
+
+/* Purge the shared data for transaction TXN_ID in filesystem FS.
+ Perform all temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+purge_shared_txn(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ return with_txnlist_lock(fs, purge_shared_txn_body, &txn_id, scratch_pool);
+}
+
+
+svn_boolean_t
+svn_fs_x__is_fresh_txn_root(svn_fs_x__noderev_t *noderev)
+{
+ /* Is it a root node? */
+ if (noderev->noderev_id.number != SVN_FS_X__ITEM_INDEX_ROOT_NODE)
+ return FALSE;
+
+ /* ... in a transaction? */
+ if (!svn_fs_x__is_txn(noderev->noderev_id.change_set))
+ return FALSE;
+
+ /* ... with no prop change in that txn?
+ (Once we set a property, the prop rep will never become NULL again.) */
+ if (noderev->prop_rep && svn_fs_x__is_txn(noderev->prop_rep->id.change_set))
+ return FALSE;
+
+ /* ... and no sub-tree change?
+ (Once we set a text, the data rep will never become NULL again.) */
+ if (noderev->data_rep && svn_fs_x__is_txn(noderev->data_rep->id.change_set))
+ return FALSE;
+
+ /* Root node of a txn with no changes. */
+ return TRUE;
+}
+
+svn_error_t *
+svn_fs_x__put_node_revision(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *noderev_file;
+ const svn_fs_x__id_t *id = &noderev->noderev_id;
+
+ if (! svn_fs_x__is_txn(id->change_set))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Attempted to write to non-transaction '%s'"),
+ svn_fs_x__id_unparse(id, scratch_pool)->data);
+
+ SVN_ERR(svn_io_file_open(&noderev_file,
+ svn_fs_x__path_txn_node_rev(fs, id, scratch_pool,
+ scratch_pool),
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, scratch_pool));
+
+ SVN_ERR(svn_fs_x__write_noderev(svn_stream_from_aprfile2(noderev_file, TRUE,
+ scratch_pool),
+ noderev, scratch_pool));
+
+ SVN_ERR(svn_io_file_close(noderev_file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For the in-transaction NODEREV within FS, write the sha1->rep mapping
+ * file in the respective transaction, if rep sharing has been enabled etc.
+ * Use SCATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+store_sha1_rep_mapping(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* if rep sharing has been enabled and the noderev has a data rep and
+ * its SHA-1 is known, store the rep struct under its SHA1. */
+ if ( ffd->rep_sharing_allowed
+ && noderev->data_rep
+ && noderev->data_rep->has_sha1)
+ {
+ apr_file_t *rep_file;
+ apr_int64_t txn_id
+ = svn_fs_x__get_txn_id(noderev->data_rep->id.change_set);
+ const char *file_name
+ = svn_fs_x__path_txn_sha1(fs, txn_id,
+ noderev->data_rep->sha1_digest,
+ scratch_pool);
+ svn_stringbuf_t *rep_string
+ = svn_fs_x__unparse_representation(noderev->data_rep,
+ (noderev->kind == svn_node_dir),
+ scratch_pool, scratch_pool);
+
+ SVN_ERR(svn_io_file_open(&rep_file, file_name,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, scratch_pool));
+
+ SVN_ERR(svn_io_file_write_full(rep_file, rep_string->data,
+ rep_string->len, NULL, scratch_pool));
+
+ SVN_ERR(svn_io_file_close(rep_file, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+unparse_dir_entry(svn_fs_x__dirent_t *dirent,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ const char *val
+ = apr_psprintf(scratch_pool, "%s %s",
+ (dirent->kind == svn_node_file) ? SVN_FS_X__KIND_FILE
+ : SVN_FS_X__KIND_DIR,
+ svn_fs_x__id_unparse(&dirent->id, scratch_pool)->data);
+
+ SVN_ERR(svn_stream_printf(stream, scratch_pool, "K %" APR_SIZE_T_FMT
+ "\n%s\nV %" APR_SIZE_T_FMT "\n%s\n",
+ strlen(dirent->name), dirent->name,
+ strlen(val), val));
+ return SVN_NO_ERROR;
+}
+
+/* Write the directory given as array of dirent structs in ENTRIES to STREAM.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+unparse_dir_entries(apr_array_header_t *entries,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *dirent;
+
+ svn_pool_clear(iterpool);
+ dirent = APR_ARRAY_IDX(entries, i, svn_fs_x__dirent_t *);
+ SVN_ERR(unparse_dir_entry(dirent, stream, iterpool));
+ }
+
+ SVN_ERR(svn_stream_printf(stream, scratch_pool, "%s\n",
+ SVN_HASH_TERMINATOR));
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Return a deep copy of SOURCE and allocate it in RESULT_POOL.
+ */
+static svn_fs_x__change_t *
+path_change_dup(const svn_fs_x__change_t *source,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__change_t *result
+ = apr_pmemdup(result_pool, source, sizeof(*source));
+ result->path.data
+ = apr_pstrmemdup(result_pool, source->path.data, source->path.len);
+
+ if (source->copyfrom_path)
+ result->copyfrom_path = apr_pstrdup(result_pool, source->copyfrom_path);
+
+ return result;
+}
+
+/* Merge the internal-use-only CHANGE into a hash of public-FS
+ svn_fs_x__change_t CHANGED_PATHS, collapsing multiple changes into a
+ single summarical (is that real word?) change per path. DELETIONS is
+ also a path->svn_fs_x__change_t hash and contains all the deletions
+ that got turned into a replacement. */
+static svn_error_t *
+fold_change(apr_hash_t *changed_paths,
+ apr_hash_t *deletions,
+ const svn_fs_x__change_t *change)
+{
+ apr_pool_t *pool = apr_hash_pool_get(changed_paths);
+ svn_fs_x__change_t *old_change, *new_change;
+ const svn_string_t *path = &change->path;
+
+ if ((old_change = apr_hash_get(changed_paths, path->data, path->len)))
+ {
+ /* This path already exists in the hash, so we have to merge
+ this change into the already existing one. */
+
+ /* Sanity check: only allow unused node revision IDs in the
+ `reset' case. */
+ if ((! svn_fs_x__id_used(&change->noderev_id))
+ && (change->change_kind != svn_fs_path_change_reset))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Missing required node revision ID"));
+
+ /* Sanity check: we should be talking about the same node
+ revision ID as our last change except where the last change
+ was a deletion. */
+ if (svn_fs_x__id_used(&change->noderev_id)
+ && (!svn_fs_x__id_eq(&old_change->noderev_id, &change->noderev_id))
+ && (old_change->change_kind != svn_fs_path_change_delete))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: new node revision ID "
+ "without delete"));
+
+ /* Sanity check: an add, replacement, or reset must be the first
+ thing to follow a deletion. */
+ if ((old_change->change_kind == svn_fs_path_change_delete)
+ && (! ((change->change_kind == svn_fs_path_change_replace)
+ || (change->change_kind == svn_fs_path_change_reset)
+ || (change->change_kind == svn_fs_path_change_add))))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: non-add change on deleted path"));
+
+ /* Sanity check: an add can't follow anything except
+ a delete or reset. */
+ if ((change->change_kind == svn_fs_path_change_add)
+ && (old_change->change_kind != svn_fs_path_change_delete)
+ && (old_change->change_kind != svn_fs_path_change_reset))
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Invalid change ordering: add change on preexisting path"));
+
+ /* Now, merge that change in. */
+ switch (change->change_kind)
+ {
+ case svn_fs_path_change_reset:
+ /* A reset here will simply remove the path change from the
+ hash. */
+ apr_hash_set(changed_paths, path->data, path->len, NULL);
+ break;
+
+ case svn_fs_path_change_delete:
+ if (old_change->change_kind == svn_fs_path_change_add)
+ {
+ /* If the path was introduced in this transaction via an
+ add, and we are deleting it, just remove the path
+ altogether. (The caller will delete any child paths.) */
+ apr_hash_set(changed_paths, path->data, path->len, NULL);
+ }
+ else if (old_change->change_kind == svn_fs_path_change_replace)
+ {
+ /* A deleting a 'replace' restore the original deletion. */
+ new_change = apr_hash_get(deletions, path->data, path->len);
+ SVN_ERR_ASSERT(new_change);
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+ }
+ else
+ {
+ /* A deletion overrules a previous change (modify). */
+ new_change = path_change_dup(change, pool);
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+ }
+ break;
+
+ case svn_fs_path_change_add:
+ case svn_fs_path_change_replace:
+ /* An add at this point must be following a previous delete,
+ so treat it just like a replace. Remember the original
+ deletion such that we are able to delete this path again
+ (the replacement may have changed node kind and id). */
+ new_change = path_change_dup(change, pool);
+ new_change->change_kind = svn_fs_path_change_replace;
+
+ apr_hash_set(changed_paths, path->data, path->len, new_change);
+
+ /* Remember the original change.
+ * Make sure to allocate the hash key in a durable pool. */
+ apr_hash_set(deletions,
+ apr_pstrmemdup(apr_hash_pool_get(deletions),
+ path->data, path->len),
+ path->len, old_change);
+ break;
+
+ case svn_fs_path_change_modify:
+ default:
+ /* If the new change modifies some attribute of the node, set
+ the corresponding flag, whether it already was set or not.
+ Note: We do not reset a flag to FALSE if a change is undone. */
+ if (change->text_mod)
+ old_change->text_mod = TRUE;
+ if (change->prop_mod)
+ old_change->prop_mod = TRUE;
+ if (change->mergeinfo_mod == svn_tristate_true)
+ old_change->mergeinfo_mod = svn_tristate_true;
+ break;
+ }
+ }
+ else
+ {
+ /* Add this path. The API makes no guarantees that this (new) key
+ will not be retained. Thus, we copy the key into the target pool
+ to ensure a proper lifetime. */
+ new_change = path_change_dup(change, pool);
+ apr_hash_set(changed_paths, new_change->path.data,
+ new_change->path.len, new_change);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton type to be used with process_changes(). */
+typedef struct process_changes_baton_t
+{
+ /* Folded list of path changes. */
+ apr_hash_t *changed_paths;
+
+ /* Path changes that are deletions and have been turned into
+ replacements. If those replacements get deleted again, this
+ container contains the record that we have to revert to. */
+ apr_hash_t *deletions;
+} process_changes_baton_t;
+
+/* An implementation of svn_fs_x__change_receiver_t.
+ Examine all the changed path entries in CHANGES and store them in
+ *CHANGED_PATHS. Folding is done to remove redundant or unnecessary
+ data. Use SCRATCH_POOL for temporary allocations. */
+static svn_error_t *
+process_changes(void *baton_p,
+ svn_fs_x__change_t *change,
+ apr_pool_t *scratch_pool)
+{
+ process_changes_baton_t *baton = baton_p;
+
+ SVN_ERR(fold_change(baton->changed_paths, baton->deletions, change));
+
+ /* Now, if our change was a deletion or replacement, we have to
+ blow away any changes thus far on paths that are (or, were)
+ children of this path.
+ ### i won't bother with another iteration pool here -- at
+ most we talking about a few extra dups of paths into what
+ is already a temporary subpool.
+ */
+
+ if ((change->change_kind == svn_fs_path_change_delete)
+ || (change->change_kind == svn_fs_path_change_replace))
+ {
+ apr_hash_index_t *hi;
+
+ /* a potential child path must contain at least 2 more chars
+ (the path separator plus at least one char for the name).
+ Also, we should not assume that all paths have been normalized
+ i.e. some might have trailing path separators.
+ */
+ apr_ssize_t path_len = change->path.len;
+ apr_ssize_t min_child_len = path_len == 0
+ ? 1
+ : change->path.data[path_len-1] == '/'
+ ? path_len + 1
+ : path_len + 2;
+
+ /* CAUTION: This is the inner loop of an O(n^2) algorithm.
+ The number of changes to process may be >> 1000.
+ Therefore, keep the inner loop as tight as possible.
+ */
+ for (hi = apr_hash_first(scratch_pool, baton->changed_paths);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ /* KEY is the path. */
+ const void *path;
+ apr_ssize_t klen;
+ apr_hash_this(hi, &path, &klen, NULL);
+
+ /* If we come across a child of our path, remove it.
+ Call svn_fspath__skip_ancestor only if there is a chance that
+ this is actually a sub-path.
+ */
+ if (klen >= min_child_len)
+ {
+ const char *child;
+
+ child = svn_fspath__skip_ancestor(change->path.data, path);
+ if (child && child[0] != '\0')
+ apr_hash_set(baton->changed_paths, path, klen, NULL);
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__txn_changes_fetch(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool)
+{
+ apr_file_t *file;
+ apr_hash_t *changed_paths = apr_hash_make(pool);
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ process_changes_baton_t baton;
+
+ baton.changed_paths = changed_paths;
+ baton.deletions = apr_hash_make(scratch_pool);
+
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_txn_changes(fs, txn_id, scratch_pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_x__read_changes_incrementally(
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ process_changes, &baton,
+ scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ *changed_paths_p = changed_paths;
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy a revision node-rev SRC into the current transaction TXN_ID in
+ the filesystem FS. This is only used to create the root of a transaction.
+ Temporary allocations are from SCRATCH_POOL. */
+static svn_error_t *
+create_new_txn_noderev_from_rev(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_fs_x__id_t *src,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, src, scratch_pool,
+ scratch_pool));
+
+ /* This must be a root node. */
+ SVN_ERR_ASSERT( noderev->node_id.number == 0
+ && noderev->copy_id.number == 0);
+
+ if (svn_fs_x__is_txn(noderev->noderev_id.change_set))
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Copying from transactions not allowed"));
+
+ noderev->predecessor_id = noderev->noderev_id;
+ noderev->predecessor_count++;
+ noderev->copyfrom_path = NULL;
+ noderev->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ /* For the transaction root, the copyroot never changes. */
+ svn_fs_x__init_txn_root(&noderev->noderev_id, txn_id);
+
+ return svn_fs_x__put_node_revision(fs, noderev, scratch_pool);
+}
+
+/* A structure used by get_and_increment_txn_key_body(). */
+typedef struct get_and_increment_txn_key_baton_t
+{
+ svn_fs_t *fs;
+ apr_uint64_t txn_number;
+} get_and_increment_txn_key_baton_t;
+
+/* Callback used in the implementation of create_txn_dir(). This gets
+ the current base 36 value in PATH_TXN_CURRENT and increments it.
+ It returns the original value by the baton. */
+static svn_error_t *
+get_and_increment_txn_key_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ get_and_increment_txn_key_baton_t *cb = baton;
+ const char *txn_current_filename = svn_fs_x__path_txn_current(cb->fs,
+ scratch_pool);
+ const char *tmp_filename;
+ char new_id_str[SVN_INT64_BUFFER_SIZE];
+
+ svn_stringbuf_t *buf;
+ SVN_ERR(svn_fs_x__read_content(&buf, txn_current_filename, scratch_pool));
+
+ /* remove trailing newlines */
+ cb->txn_number = svn__base36toui64(NULL, buf->data);
+
+ /* Increment the key and add a trailing \n to the string so the
+ txn-current file has a newline in it. */
+ SVN_ERR(svn_io_write_unique(&tmp_filename,
+ svn_dirent_dirname(txn_current_filename,
+ scratch_pool),
+ new_id_str,
+ svn__ui64tobase36(new_id_str, cb->txn_number+1),
+ svn_io_file_del_none, scratch_pool));
+ SVN_ERR(svn_fs_x__move_into_place(tmp_filename, txn_current_filename,
+ txn_current_filename, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Create a unique directory for a transaction in FS based on revision REV.
+ Return the ID for this transaction in *ID_P and *TXN_ID. Use a sequence
+ value in the transaction ID to prevent reuse of transaction IDs. */
+static svn_error_t *
+create_txn_dir(const char **id_p,
+ svn_fs_x__txn_id_t *txn_id,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ get_and_increment_txn_key_baton_t cb;
+ const char *txn_dir;
+
+ /* Get the current transaction sequence value, which is a base-36
+ number, from the txn-current file, and write an
+ incremented value back out to the file. Place the revision
+ number the transaction is based off into the transaction id. */
+ cb.fs = fs;
+ SVN_ERR(svn_fs_x__with_txn_current_lock(fs,
+ get_and_increment_txn_key_body,
+ &cb,
+ scratch_pool));
+ *txn_id = cb.txn_number;
+
+ *id_p = svn_fs_x__txn_name(*txn_id, result_pool);
+ txn_dir = svn_fs_x__path_txn_dir(fs, *txn_id, scratch_pool);
+
+ return svn_io_dir_make(txn_dir, APR_OS_DEFAULT, scratch_pool);
+}
+
+/* Create a new transaction in filesystem FS, based on revision REV,
+ and store it in *TXN_P, allocated in RESULT_POOL. Allocate necessary
+ temporaries from SCRATCH_POOL. */
+static svn_error_t *
+create_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_txn_t *txn;
+ fs_txn_data_t *ftd;
+ svn_fs_x__id_t root_id;
+
+ txn = apr_pcalloc(result_pool, sizeof(*txn));
+ ftd = apr_pcalloc(result_pool, sizeof(*ftd));
+
+ /* Valid revision number? */
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
+
+ /* Get the txn_id. */
+ SVN_ERR(create_txn_dir(&txn->id, &ftd->txn_id, fs, result_pool,
+ scratch_pool));
+
+ txn->fs = fs;
+ txn->base_rev = rev;
+
+ txn->vtable = &txn_vtable;
+ txn->fsap_data = ftd;
+ *txn_p = txn;
+
+ /* Create a new root node for this transaction. */
+ svn_fs_x__init_rev_root(&root_id, rev);
+ SVN_ERR(create_new_txn_noderev_from_rev(fs, ftd->txn_id, &root_id,
+ scratch_pool));
+
+ /* Create an empty rev file. */
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_x__path_txn_proto_rev(fs, ftd->txn_id, scratch_pool),
+ scratch_pool));
+
+ /* Create an empty rev-lock file. */
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_x__path_txn_proto_rev_lock(fs, ftd->txn_id, scratch_pool),
+ scratch_pool));
+
+ /* Create an empty changes file. */
+ SVN_ERR(svn_io_file_create_empty(
+ svn_fs_x__path_txn_changes(fs, ftd->txn_id, scratch_pool),
+ scratch_pool));
+
+ /* Create the next-ids file. */
+ SVN_ERR(svn_io_file_create(
+ svn_fs_x__path_txn_next_ids(fs, ftd->txn_id, scratch_pool),
+ "0 0\n", scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Store the property list for transaction TXN_ID in PROPLIST.
+ Perform temporary allocations in POOL. */
+static svn_error_t *
+get_txn_proplist(apr_hash_t *proplist,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool)
+{
+ svn_stream_t *stream;
+
+ /* Check for issue #3696. (When we find and fix the cause, we can change
+ * this to an assertion.) */
+ if (txn_id == SVN_FS_X__INVALID_TXN_ID)
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Internal error: a null transaction id was "
+ "passed to get_txn_proplist()"));
+
+ /* Open the transaction properties file. */
+ SVN_ERR(svn_stream_open_readonly(&stream,
+ svn_fs_x__path_txn_props(fs, txn_id, pool),
+ pool, pool));
+
+ /* Read in the property list. */
+ SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+
+ return svn_stream_close(stream);
+}
+
+/* Save the property list PROPS as the revprops for transaction TXN_ID
+ in FS. Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+set_txn_proplist(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_hash_t *props,
+ svn_boolean_t final,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *buf;
+ svn_stream_t *stream;
+
+ /* Write out the new file contents to BUF. */
+ buf = svn_stringbuf_create_ensure(1024, scratch_pool);
+ stream = svn_stream_from_stringbuf(buf, scratch_pool);
+ SVN_ERR(svn_hash_write2(props, stream, SVN_HASH_TERMINATOR, scratch_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Open the transaction properties file and write new contents to it. */
+ SVN_ERR(svn_io_write_atomic((final
+ ? svn_fs_x__path_txn_props_final(fs, txn_id,
+ scratch_pool)
+ : svn_fs_x__path_txn_props(fs, txn_id,
+ scratch_pool)),
+ buf->data, buf->len,
+ NULL /* copy_perms_path */, scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__change_txn_prop(svn_fs_txn_t *txn,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *props = apr_array_make(scratch_pool, 1,
+ sizeof(svn_prop_t));
+ svn_prop_t prop;
+
+ prop.name = name;
+ prop.value = value;
+ APR_ARRAY_PUSH(props, svn_prop_t) = prop;
+
+ return svn_fs_x__change_txn_props(txn, props, scratch_pool);
+}
+
+svn_error_t *
+svn_fs_x__change_txn_props(svn_fs_txn_t *txn,
+ const apr_array_header_t *props,
+ apr_pool_t *scratch_pool)
+{
+ fs_txn_data_t *ftd = txn->fsap_data;
+ apr_hash_t *txn_prop = apr_hash_make(scratch_pool);
+ int i;
+ svn_error_t *err;
+
+ err = get_txn_proplist(txn_prop, txn->fs, ftd->txn_id, scratch_pool);
+ /* Here - and here only - we need to deal with the possibility that the
+ transaction property file doesn't yet exist. The rest of the
+ implementation assumes that the file exists, but we're called to set the
+ initial transaction properties as the transaction is being created. */
+ if (err && (APR_STATUS_IS_ENOENT(err->apr_err)))
+ svn_error_clear(err);
+ else if (err)
+ return svn_error_trace(err);
+
+ for (i = 0; i < props->nelts; i++)
+ {
+ svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
+
+ if (svn_hash_gets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE)
+ && !strcmp(prop->name, SVN_PROP_REVISION_DATE))
+ svn_hash_sets(txn_prop, SVN_FS__PROP_TXN_CLIENT_DATE,
+ svn_string_create("1", scratch_pool));
+
+ svn_hash_sets(txn_prop, prop->name, prop->value);
+ }
+
+ /* Create a new version of the file and write out the new props. */
+ /* Open the transaction properties file. */
+ SVN_ERR(set_txn_proplist(txn->fs, ftd->txn_id, txn_prop, FALSE,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__get_txn(svn_fs_x__transaction_t **txn_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool)
+{
+ svn_fs_x__transaction_t *txn;
+ svn_fs_x__noderev_t *noderev;
+ svn_fs_x__id_t root_id;
+
+ txn = apr_pcalloc(pool, sizeof(*txn));
+ txn->proplist = apr_hash_make(pool);
+
+ SVN_ERR(get_txn_proplist(txn->proplist, fs, txn_id, pool));
+ svn_fs_x__init_txn_root(&root_id, txn_id);
+
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, &root_id, pool, pool));
+
+ txn->base_rev = svn_fs_x__get_revnum(noderev->predecessor_id.change_set);
+ txn->copies = NULL;
+
+ *txn_p = txn;
+
+ return SVN_NO_ERROR;
+}
+
+/* If it is supported by the format of file system FS, store the (ITEM_INDEX,
+ * OFFSET) pair in the log-to-phys proto index file of transaction TXN_ID.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+store_l2p_index_entry(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_off_t offset,
+ apr_uint64_t item_index,
+ apr_pool_t *scratch_pool)
+{
+ const char *path = svn_fs_x__path_l2p_proto_index(fs, txn_id, scratch_pool);
+ apr_file_t *file;
+ SVN_ERR(svn_fs_x__l2p_proto_index_open(&file, path, scratch_pool));
+ SVN_ERR(svn_fs_x__l2p_proto_index_add_entry(file, offset, 0,
+ item_index, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* If it is supported by the format of file system FS, store ENTRY in the
+ * phys-to-log proto index file of transaction TXN_ID.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+store_p2l_index_entry(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ const char *path = svn_fs_x__path_p2l_proto_index(fs, txn_id, scratch_pool);
+ apr_file_t *file;
+ SVN_ERR(svn_fs_x__p2l_proto_index_open(&file, path, scratch_pool));
+ SVN_ERR(svn_fs_x__p2l_proto_index_add_entry(file, entry, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Allocate an item index in the transaction TXN_ID of file system FS and
+ * return it in *ITEM_INDEX. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+allocate_item_index(apr_uint64_t *item_index,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *file;
+ char buffer[SVN_INT64_BUFFER_SIZE] = { 0 };
+ svn_boolean_t eof = FALSE;
+ apr_size_t to_write;
+ apr_size_t read;
+ apr_off_t offset = 0;
+
+ /* read number */
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_txn_item_index(fs, txn_id,
+ scratch_pool),
+ APR_READ | APR_WRITE
+ | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, scratch_pool));
+ SVN_ERR(svn_io_file_read_full2(file, buffer, sizeof(buffer)-1,
+ &read, &eof, scratch_pool));
+ if (read)
+ SVN_ERR(svn_cstring_atoui64(item_index, buffer));
+ else
+ *item_index = SVN_FS_X__ITEM_INDEX_FIRST_USER;
+
+ /* increment it */
+ to_write = svn__ui64toa(buffer, *item_index + 1);
+
+ /* write it back to disk */
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, scratch_pool));
+ SVN_ERR(svn_io_file_write_full(file, buffer, to_write, NULL, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Write out the currently available next node_id NODE_ID and copy_id
+ COPY_ID for transaction TXN_ID in filesystem FS. The next node-id is
+ used both for creating new unique nodes for the given transaction, as
+ well as uniquifying representations. Perform temporary allocations in
+ SCRATCH_POOL. */
+static svn_error_t *
+write_next_ids(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_uint64_t node_id,
+ apr_uint64_t copy_id,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *file;
+ char buffer[2 * SVN_INT64_BUFFER_SIZE + 2];
+ char *p = buffer;
+
+ p += svn__ui64tobase36(p, node_id);
+ *(p++) = ' ';
+ p += svn__ui64tobase36(p, copy_id);
+ *(p++) = '\n';
+ *(p++) = '\0';
+
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_txn_next_ids(fs, txn_id,
+ scratch_pool),
+ APR_WRITE | APR_TRUNCATE,
+ APR_OS_DEFAULT, scratch_pool));
+ SVN_ERR(svn_io_file_write_full(file, buffer, p - buffer, NULL,
+ scratch_pool));
+ return svn_io_file_close(file, scratch_pool);
+}
+
+/* Find out what the next unique node-id and copy-id are for
+ transaction TXN_ID in filesystem FS. Store the results in *NODE_ID
+ and *COPY_ID. The next node-id is used both for creating new unique
+ nodes for the given transaction, as well as uniquifying representations.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+read_next_ids(apr_uint64_t *node_id,
+ apr_uint64_t *copy_id,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *buf;
+ const char *str;
+ SVN_ERR(svn_fs_x__read_content(&buf,
+ svn_fs_x__path_txn_next_ids(fs, txn_id,
+ scratch_pool),
+ scratch_pool));
+
+ /* Parse this into two separate strings. */
+
+ str = buf->data;
+ *node_id = svn__base36toui64(&str, str);
+ if (*str != ' ')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("next-id file corrupt"));
+
+ ++str;
+ *copy_id = svn__base36toui64(&str, str);
+ if (*str != '\n')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("next-id file corrupt"));
+
+ return SVN_NO_ERROR;
+}
+
+/* Get a new and unique to this transaction node-id for transaction
+ TXN_ID in filesystem FS. Store the new node-id in *NODE_ID_P.
+ Node-ids are guaranteed to be unique to this transction, but may
+ not necessarily be sequential.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+get_new_txn_node_id(svn_fs_x__id_t *node_id_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t node_id, copy_id;
+
+ /* First read in the current next-ids file. */
+ SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, scratch_pool));
+
+ node_id_p->change_set = svn_fs_x__change_set_by_txn(txn_id);
+ node_id_p->number = node_id;
+
+ SVN_ERR(write_next_ids(fs, txn_id, ++node_id, copy_id, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__reserve_copy_id(svn_fs_x__id_t *copy_id_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ apr_uint64_t node_id, copy_id;
+
+ /* First read in the current next-ids file. */
+ SVN_ERR(read_next_ids(&node_id, &copy_id, fs, txn_id, scratch_pool));
+
+ copy_id_p->change_set = svn_fs_x__change_set_by_txn(txn_id);
+ copy_id_p->number = copy_id;
+
+ SVN_ERR(write_next_ids(fs, txn_id, node_id, ++copy_id, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__create_node(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ /* Get a new node-id for this node. */
+ SVN_ERR(get_new_txn_node_id(&noderev->node_id, fs, txn_id, scratch_pool));
+
+ /* Assign copy-id. */
+ noderev->copy_id = *copy_id;
+
+ /* Noderev-id = Change set and item number within this change set. */
+ noderev->noderev_id.change_set = svn_fs_x__change_set_by_txn(txn_id);
+ SVN_ERR(allocate_item_index(&noderev->noderev_id.number, fs, txn_id,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_x__put_node_revision(fs, noderev, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__purge_txn(svn_fs_t *fs,
+ const char *txn_id_str,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__txn_id_t txn_id;
+ SVN_ERR(svn_fs_x__txn_by_name(&txn_id, txn_id_str));
+
+ /* Remove the shared transaction object associated with this transaction. */
+ SVN_ERR(purge_shared_txn(fs, txn_id, scratch_pool));
+ /* Remove the directory associated with this transaction. */
+ SVN_ERR(svn_io_remove_dir2(svn_fs_x__path_txn_dir(fs, txn_id, scratch_pool),
+ FALSE, NULL, NULL, scratch_pool));
+
+ /* Delete protorev and its lock, which aren't in the txn
+ directory. It's OK if they don't exist (for example, if this
+ is post-commit and the proto-rev has been moved into
+ place). */
+ SVN_ERR(svn_io_remove_file2(
+ svn_fs_x__path_txn_proto_rev(fs, txn_id, scratch_pool),
+ TRUE, scratch_pool));
+ SVN_ERR(svn_io_remove_file2(
+ svn_fs_x__path_txn_proto_rev_lock(fs, txn_id, scratch_pool),
+ TRUE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__abort_txn(svn_fs_txn_t *txn,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(svn_fs__check_fs(txn->fs, TRUE));
+
+ /* Now, purge the transaction. */
+ SVN_ERR_W(svn_fs_x__purge_txn(txn->fs, txn->id, scratch_pool),
+ apr_psprintf(scratch_pool, _("Transaction '%s' cleanup failed"),
+ txn->id));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__set_entry(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_fs_x__noderev_t *parent_noderev,
+ const char *name,
+ const svn_fs_x__id_t *id,
+ svn_node_kind_t kind,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__representation_t *rep = parent_noderev->data_rep;
+ const char *filename
+ = svn_fs_x__path_txn_node_children(fs, &parent_noderev->noderev_id,
+ scratch_pool, scratch_pool);
+ apr_file_t *file;
+ svn_stream_t *out;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ if (!rep || !svn_fs_x__is_txn(rep->id.change_set))
+ {
+ apr_array_header_t *entries;
+
+ /* Before we can modify the directory, we need to dump its old
+ contents into a mutable representation file. */
+ SVN_ERR(svn_fs_x__rep_contents_dir(&entries, fs, parent_noderev,
+ subpool, subpool));
+ SVN_ERR(svn_io_file_open(&file, filename,
+ APR_WRITE | APR_CREATE | APR_BUFFERED,
+ APR_OS_DEFAULT, scratch_pool));
+ out = svn_stream_from_aprfile2(file, TRUE, scratch_pool);
+ SVN_ERR(unparse_dir_entries(entries, out, subpool));
+
+ svn_pool_clear(subpool);
+
+ /* Provide the parent with a data rep if it had none before
+ (directories so far empty). */
+ if (!rep)
+ {
+ rep = apr_pcalloc(result_pool, sizeof(*rep));
+ parent_noderev->data_rep = rep;
+ }
+
+ /* Mark the node-rev's data rep as mutable. */
+ rep->id.change_set = svn_fs_x__change_set_by_txn(txn_id);
+ rep->id.number = SVN_FS_X__ITEM_INDEX_UNUSED;
+
+ /* Save noderev to disk. */
+ SVN_ERR(svn_fs_x__put_node_revision(fs, parent_noderev, subpool));
+ }
+ else
+ {
+ /* The directory rep is already mutable, so just open it for append. */
+ SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_APPEND,
+ APR_OS_DEFAULT, scratch_pool));
+ out = svn_stream_from_aprfile2(file, TRUE, scratch_pool);
+ }
+
+ /* update directory cache */
+ {
+ /* build parameters: (name, new entry) pair */
+ const svn_fs_x__id_t *key = &(parent_noderev->noderev_id);
+ replace_baton_t baton;
+
+ baton.name = name;
+ baton.new_entry = NULL;
+
+ if (id)
+ {
+ baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
+ baton.new_entry->name = name;
+ baton.new_entry->kind = kind;
+ baton.new_entry->id = *id;
+ }
+
+ /* actually update the cached directory (if cached) */
+ SVN_ERR(svn_cache__set_partial(ffd->dir_cache, key,
+ svn_fs_x__replace_dir_entry, &baton,
+ subpool));
+ }
+ svn_pool_clear(subpool);
+
+ /* Append an incremental hash entry for the entry change. */
+ if (id)
+ {
+ svn_fs_x__dirent_t entry;
+ entry.name = name;
+ entry.id = *id;
+ entry.kind = kind;
+
+ SVN_ERR(unparse_dir_entry(&entry, out, subpool));
+ }
+ else
+ {
+ SVN_ERR(svn_stream_printf(out, subpool, "D %" APR_SIZE_T_FMT "\n%s\n",
+ strlen(name), name));
+ }
+
+ SVN_ERR(svn_io_file_close(file, subpool));
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__add_change(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const char *path,
+ const svn_fs_x__id_t *id,
+ svn_fs_path_change_kind_t change_kind,
+ svn_boolean_t text_mod,
+ svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
+ svn_node_kind_t node_kind,
+ svn_revnum_t copyfrom_rev,
+ const char *copyfrom_path,
+ apr_pool_t *scratch_pool)
+{
+ apr_file_t *file;
+ svn_fs_x__change_t change;
+ apr_hash_t *changes = apr_hash_make(scratch_pool);
+
+ /* Not using APR_BUFFERED to append change in one atomic write operation. */
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_txn_changes(fs, txn_id,
+ scratch_pool),
+ APR_APPEND | APR_WRITE | APR_CREATE,
+ APR_OS_DEFAULT, scratch_pool));
+
+ change.path.data = path;
+ change.path.len = strlen(path);
+ change.noderev_id = *id;
+ change.change_kind = change_kind;
+ change.text_mod = text_mod;
+ change.prop_mod = prop_mod;
+ change.mergeinfo_mod = mergeinfo_mod ? svn_tristate_true
+ : svn_tristate_false;
+ change.node_kind = node_kind;
+ change.copyfrom_known = TRUE;
+ change.copyfrom_rev = copyfrom_rev;
+ if (copyfrom_path)
+ change.copyfrom_path = apr_pstrdup(scratch_pool, copyfrom_path);
+
+ svn_hash_sets(changes, path, &change);
+ SVN_ERR(svn_fs_x__write_changes(svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ fs, changes, FALSE, scratch_pool));
+
+ return svn_io_file_close(file, scratch_pool);
+}
+
+/* This baton is used by the representation writing streams. It keeps
+ track of the checksum information as well as the total size of the
+ representation so far. */
+typedef struct rep_write_baton_t
+{
+ /* The FS we are writing to. */
+ svn_fs_t *fs;
+
+ /* Actual file to which we are writing. */
+ svn_stream_t *rep_stream;
+
+ /* A stream from the delta combiner. Data written here gets
+ deltified, then eventually written to rep_stream. */
+ svn_stream_t *delta_stream;
+
+ /* Where is this representation header stored. */
+ apr_off_t rep_offset;
+
+ /* Start of the actual data. */
+ apr_off_t delta_start;
+
+ /* How many bytes have been written to this rep already. */
+ svn_filesize_t rep_size;
+
+ /* The node revision for which we're writing out info. */
+ svn_fs_x__noderev_t *noderev;
+
+ /* Actual output file. */
+ apr_file_t *file;
+ /* Lock 'cookie' used to unlock the output file once we've finished
+ writing to it. */
+ void *lockcookie;
+
+ svn_checksum_ctx_t *md5_checksum_ctx;
+ svn_checksum_ctx_t *sha1_checksum_ctx;
+
+ /* Receives the low-level checksum when closing REP_STREAM. */
+ apr_uint32_t fnv1a_checksum;
+
+ /* Local pool, available for allocations that must remain valid as long
+ as this baton is used but may be cleaned up immediately afterwards. */
+ apr_pool_t *local_pool;
+
+ /* Outer / result pool. */
+ apr_pool_t *result_pool;
+} rep_write_baton_t;
+
+/* Handler for the write method of the representation writable stream.
+ BATON is a rep_write_baton_t, DATA is the data to write, and *LEN is
+ the length of this data. */
+static svn_error_t *
+rep_write_contents(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ rep_write_baton_t *b = baton;
+
+ SVN_ERR(svn_checksum_update(b->md5_checksum_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(b->sha1_checksum_ctx, data, *len));
+ b->rep_size += *len;
+
+ return svn_stream_write(b->delta_stream, data, len);
+}
+
+/* Set *SPANNED to the number of shards touched when walking WALK steps on
+ * NODEREV's predecessor chain in FS.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+shards_spanned(int *spanned,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ int walk,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ int shard_size = ffd->max_files_per_dir;
+ apr_pool_t *iterpool;
+
+ int count = walk ? 1 : 0; /* The start of a walk already touches a shard. */
+ svn_revnum_t shard, last_shard = ffd->youngest_rev_cache / shard_size;
+ iterpool = svn_pool_create(scratch_pool);
+ while (walk-- && noderev->predecessor_count)
+ {
+ svn_fs_x__id_t id = noderev->predecessor_id;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, &id, scratch_pool,
+ iterpool));
+ shard = svn_fs_x__get_revnum(id.change_set) / shard_size;
+ if (shard != last_shard)
+ {
+ ++count;
+ last_shard = shard;
+ }
+ }
+ svn_pool_destroy(iterpool);
+
+ *spanned = count;
+ return SVN_NO_ERROR;
+}
+
+/* Given a node-revision NODEREV in filesystem FS, return the
+ representation in *REP to use as the base for a text representation
+ delta if PROPS is FALSE. If PROPS has been set, a suitable props
+ base representation will be returned. Perform temporary allocations
+ in *POOL. */
+static svn_error_t *
+choose_delta_base(svn_fs_x__representation_t **rep,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ svn_boolean_t props,
+ apr_pool_t *pool)
+{
+ /* The zero-based index (counting from the "oldest" end), along NODEREVs line
+ * predecessors, of the node-rev we will use as delta base. */
+ int count;
+ /* The length of the linear part of a delta chain. (Delta chains use
+ * skip-delta bits for the high-order bits and are linear in the low-order
+ * bits.) */
+ int walk;
+ svn_fs_x__noderev_t *base;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool;
+
+ /* If we have no predecessors, or that one is empty, then use the empty
+ * stream as a base. */
+ if (! noderev->predecessor_count)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* Flip the rightmost '1' bit of the predecessor count to determine
+ which file rev (counting from 0) we want to use. (To see why
+ count & (count - 1) unsets the rightmost set bit, think about how
+ you decrement a binary number.) */
+ count = noderev->predecessor_count;
+ count = count & (count - 1);
+
+ /* Finding the delta base over a very long distance can become extremely
+ expensive for very deep histories, possibly causing client timeouts etc.
+ OTOH, this is a rare operation and its gains are minimal. Lets simply
+ start deltification anew close every other 1000 changes or so. */
+ walk = noderev->predecessor_count - count;
+ if (walk > (int)ffd->max_deltification_walk)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* We use skip delta for limiting the number of delta operations
+ along very long node histories. Close to HEAD however, we create
+ a linear history to minimize delta size. */
+ if (walk < (int)ffd->max_linear_deltification)
+ {
+ int shards;
+ SVN_ERR(shards_spanned(&shards, fs, noderev, walk, pool));
+
+ /* We also don't want the linear deltification to span more shards
+ than if deltas we used in a simple skip-delta scheme. */
+ if ((1 << (--shards)) <= walk)
+ count = noderev->predecessor_count - 1;
+ }
+
+ /* Walk back a number of predecessors equal to the difference
+ between count and the original predecessor count. (For example,
+ if noderev has ten predecessors and we want the eighth file rev,
+ walk back two predecessors.) */
+ base = noderev;
+ iterpool = svn_pool_create(pool);
+ while ((count++) < noderev->predecessor_count)
+ {
+ svn_fs_x__id_t id = noderev->predecessor_id;
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_x__get_node_revision(&base, fs, &id, pool, iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ /* return a suitable base representation */
+ *rep = props ? base->prop_rep : base->data_rep;
+
+ /* if we encountered a shared rep, its parent chain may be different
+ * from the node-rev parent chain. */
+ if (*rep)
+ {
+ int chain_length = 0;
+ int shard_count = 0;
+
+ /* Very short rep bases are simply not worth it as we are unlikely
+ * to re-coup the deltification space overhead of 20+ bytes. */
+ svn_filesize_t rep_size = (*rep)->expanded_size
+ ? (*rep)->expanded_size
+ : (*rep)->size;
+ if (rep_size < 64)
+ {
+ *rep = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* Check whether the length of the deltification chain is acceptable.
+ * Otherwise, shared reps may form a non-skipping delta chain in
+ * extreme cases. */
+ SVN_ERR(svn_fs_x__rep_chain_length(&chain_length, &shard_count,
+ *rep, fs, pool));
+
+ /* Some reasonable limit, depending on how acceptable longer linear
+ * chains are in this repo. Also, allow for some minimal chain. */
+ if (chain_length >= 2 * (int)ffd->max_linear_deltification + 2)
+ *rep = NULL;
+ else
+ /* To make it worth opening additional shards / pack files, we
+ * require that the reps have a certain minimal size. To deltify
+ * against a rep in different shard, the lower limit is 512 bytes
+ * and doubles with every extra shard to visit along the delta
+ * chain. */
+ if ( shard_count > 1
+ && ((svn_filesize_t)128 << shard_count) >= rep_size)
+ *rep = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Something went wrong and the pool for the rep write is being
+ cleared before we've finished writing the rep. So we need
+ to remove the rep from the protorevfile and we need to unlock
+ the protorevfile. */
+static apr_status_t
+rep_write_cleanup(void *data)
+{
+ svn_error_t *err;
+ rep_write_baton_t *b = data;
+ svn_fs_x__txn_id_t txn_id
+ = svn_fs_x__get_txn_id(b->noderev->noderev_id.change_set);
+
+ /* Truncate and close the protorevfile. */
+ err = svn_io_file_trunc(b->file, b->rep_offset, b->local_pool);
+ err = svn_error_compose_create(err, svn_io_file_close(b->file,
+ b->local_pool));
+
+ /* Remove our lock regardless of any preceding errors so that the
+ being_written flag is always removed and stays consistent with the
+ file lock which will be removed no matter what since the pool is
+ going away. */
+ err = svn_error_compose_create(err,
+ unlock_proto_rev(b->fs, txn_id,
+ b->lockcookie,
+ b->local_pool));
+ if (err)
+ {
+ apr_status_t rc = err->apr_err;
+ svn_error_clear(err);
+ return rc;
+ }
+
+ return APR_SUCCESS;
+}
+
+/* Get a rep_write_baton_t, allocated from RESULT_POOL, and store it in
+ WB_P for the representation indicated by NODEREV in filesystem FS.
+ Only appropriate for file contents, not for props or directory contents.
+ */
+static svn_error_t *
+rep_write_get_baton(rep_write_baton_t **wb_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ rep_write_baton_t *b;
+ apr_file_t *file;
+ svn_fs_x__representation_t *base_rep;
+ svn_stream_t *source;
+ svn_txdelta_window_handler_t wh;
+ void *whb;
+ int diff_version = 1;
+ svn_fs_x__rep_header_t header = { 0 };
+ svn_fs_x__txn_id_t txn_id
+ = svn_fs_x__get_txn_id(noderev->noderev_id.change_set);
+
+ b = apr_pcalloc(result_pool, sizeof(*b));
+
+ b->sha1_checksum_ctx = svn_checksum_ctx_create(svn_checksum_sha1,
+ result_pool);
+ b->md5_checksum_ctx = svn_checksum_ctx_create(svn_checksum_md5,
+ result_pool);
+
+ b->fs = fs;
+ b->result_pool = result_pool;
+ b->local_pool = svn_pool_create(result_pool);
+ b->rep_size = 0;
+ b->noderev = noderev;
+
+ /* Open the prototype rev file and seek to its end. */
+ SVN_ERR(get_writable_proto_rev(&file, &b->lockcookie, fs, txn_id,
+ b->local_pool));
+
+ b->file = file;
+ b->rep_stream = svn_checksum__wrap_write_stream_fnv1a_32x4(
+ &b->fnv1a_checksum,
+ svn_stream_from_aprfile2(file, TRUE,
+ b->local_pool),
+ b->local_pool);
+
+ SVN_ERR(svn_fs_x__get_file_offset(&b->rep_offset, file, b->local_pool));
+
+ /* Get the base for this delta. */
+ SVN_ERR(choose_delta_base(&base_rep, fs, noderev, FALSE, b->local_pool));
+ SVN_ERR(svn_fs_x__get_contents(&source, fs, base_rep, TRUE,
+ b->local_pool));
+
+ /* Write out the rep header. */
+ if (base_rep)
+ {
+ header.base_revision = svn_fs_x__get_revnum(base_rep->id.change_set);
+ header.base_item_index = base_rep->id.number;
+ header.base_length = base_rep->size;
+ header.type = svn_fs_x__rep_delta;
+ }
+ else
+ {
+ header.type = svn_fs_x__rep_self_delta;
+ }
+ SVN_ERR(svn_fs_x__write_rep_header(&header, b->rep_stream,
+ b->local_pool));
+
+ /* Now determine the offset of the actual svndiff data. */
+ SVN_ERR(svn_fs_x__get_file_offset(&b->delta_start, file,
+ b->local_pool));
+
+ /* Cleanup in case something goes wrong. */
+ apr_pool_cleanup_register(b->local_pool, b, rep_write_cleanup,
+ apr_pool_cleanup_null);
+
+ /* Prepare to write the svndiff data. */
+ svn_txdelta_to_svndiff3(&wh,
+ &whb,
+ svn_stream_disown(b->rep_stream, b->result_pool),
+ diff_version,
+ ffd->delta_compression_level,
+ result_pool);
+
+ b->delta_stream = svn_txdelta_target_push(wh, whb, source,
+ b->result_pool);
+
+ *wb_p = b;
+
+ return SVN_NO_ERROR;
+}
+
+/* For REP->SHA1_CHECKSUM, try to find an already existing representation
+ in FS and return it in *OUT_REP. If no such representation exists or
+ if rep sharing has been disabled for FS, NULL will be returned. Since
+ there may be new duplicate representations within the same uncommitted
+ revision, those can be passed in REPS_HASH (maps a sha1 digest onto
+ svn_fs_x__representation_t*), otherwise pass in NULL for REPS_HASH.
+ Use RESULT_POOL for *OLD_REP allocations and SCRATCH_POOL for temporaries.
+ The lifetime of *OLD_REP is limited by both, RESULT_POOL and REP lifetime.
+ */
+static svn_error_t *
+get_shared_rep(svn_fs_x__representation_t **old_rep,
+ svn_fs_t *fs,
+ svn_fs_x__representation_t *rep,
+ apr_hash_t *reps_hash,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* Return NULL, if rep sharing has been disabled. */
+ *old_rep = NULL;
+ if (!ffd->rep_sharing_allowed)
+ return SVN_NO_ERROR;
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. Start with the hash lookup
+ because it is cheepest. */
+ if (reps_hash)
+ *old_rep = apr_hash_get(reps_hash,
+ rep->sha1_digest,
+ APR_SHA1_DIGESTSIZE);
+
+ /* If we haven't found anything yet, try harder and consult our DB. */
+ if (*old_rep == NULL)
+ {
+ svn_checksum_t checksum;
+ checksum.digest = rep->sha1_digest;
+ checksum.kind = svn_checksum_sha1;
+ err = svn_fs_x__get_rep_reference(old_rep, fs, &checksum, result_pool,
+ scratch_pool);
+
+ /* ### Other error codes that we shouldn't mask out? */
+ if (err == SVN_NO_ERROR)
+ {
+ if (*old_rep)
+ SVN_ERR(svn_fs_x__check_rep(*old_rep, fs, scratch_pool));
+ }
+ else if (err->apr_err == SVN_ERR_FS_CORRUPT
+ || SVN_ERROR_IN_CATEGORY(err->apr_err,
+ SVN_ERR_MALFUNC_CATEGORY_START))
+ {
+ /* Fatal error; don't mask it.
+
+ In particular, this block is triggered when the rep-cache refers
+ to revisions in the future. We signal that as a corruption situation
+ since, once those revisions are less than youngest (because of more
+ commits), the rep-cache would be invalid.
+ */
+ SVN_ERR(err);
+ }
+ else
+ {
+ /* Something's wrong with the rep-sharing index. We can continue
+ without rep-sharing, but warn.
+ */
+ (fs->warning)(fs->warning_baton, err);
+ svn_error_clear(err);
+ *old_rep = NULL;
+ }
+ }
+
+ /* look for intra-revision matches (usually data reps but not limited
+ to them in case props happen to look like some data rep)
+ */
+ if (*old_rep == NULL && svn_fs_x__is_txn(rep->id.change_set))
+ {
+ svn_node_kind_t kind;
+ const char *file_name
+ = svn_fs_x__path_txn_sha1(fs,
+ svn_fs_x__get_txn_id(rep->id.change_set),
+ rep->sha1_digest, scratch_pool);
+
+ /* in our txn, is there a rep file named with the wanted SHA1?
+ If so, read it and use that rep.
+ */
+ SVN_ERR(svn_io_check_path(file_name, &kind, scratch_pool));
+ if (kind == svn_node_file)
+ {
+ svn_stringbuf_t *rep_string;
+ SVN_ERR(svn_stringbuf_from_file2(&rep_string, file_name,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__parse_representation(old_rep, rep_string,
+ result_pool, scratch_pool));
+ }
+ }
+
+ /* Add information that is missing in the cached data. */
+ if (*old_rep)
+ {
+ /* Use the old rep for this content. */
+ memcpy((*old_rep)->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Copy the hash sum calculation results from MD5_CTX, SHA1_CTX into REP.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+digests_final(svn_fs_x__representation_t *rep,
+ const svn_checksum_ctx_t *md5_ctx,
+ const svn_checksum_ctx_t *sha1_ctx,
+ apr_pool_t *scratch_pool)
+{
+ svn_checksum_t *checksum;
+
+ SVN_ERR(svn_checksum_final(&checksum, md5_ctx, scratch_pool));
+ memcpy(rep->md5_digest, checksum->digest, svn_checksum_size(checksum));
+ SVN_ERR(svn_checksum_final(&checksum, sha1_ctx, scratch_pool));
+ rep->has_sha1 = checksum != NULL;
+ if (rep->has_sha1)
+ memcpy(rep->sha1_digest, checksum->digest, svn_checksum_size(checksum));
+
+ return SVN_NO_ERROR;
+}
+
+/* Close handler for the representation write stream. BATON is a
+ rep_write_baton_t. Writes out a new node-rev that correctly
+ references the representation we just finished writing. */
+static svn_error_t *
+rep_write_contents_close(void *baton)
+{
+ rep_write_baton_t *b = baton;
+ svn_fs_x__representation_t *rep;
+ svn_fs_x__representation_t *old_rep;
+ apr_off_t offset;
+ apr_int64_t txn_id;
+
+ rep = apr_pcalloc(b->result_pool, sizeof(*rep));
+
+ /* Close our delta stream so the last bits of svndiff are written
+ out. */
+ SVN_ERR(svn_stream_close(b->delta_stream));
+
+ /* Determine the length of the svndiff data. */
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, b->file, b->local_pool));
+ rep->size = offset - b->delta_start;
+
+ /* Fill in the rest of the representation field. */
+ rep->expanded_size = b->rep_size;
+ txn_id = svn_fs_x__get_txn_id(b->noderev->noderev_id.change_set);
+ rep->id.change_set = svn_fs_x__change_set_by_txn(txn_id);
+
+ /* Finalize the checksum. */
+ SVN_ERR(digests_final(rep, b->md5_checksum_ctx, b->sha1_checksum_ctx,
+ b->result_pool));
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, NULL, b->result_pool,
+ b->local_pool));
+
+ if (old_rep)
+ {
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(b->file, b->rep_offset, b->local_pool));
+
+ /* Use the old rep for this content. */
+ b->noderev->data_rep = old_rep;
+ }
+ else
+ {
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_stream_puts(b->rep_stream, "ENDREP\n"));
+ SVN_ERR(allocate_item_index(&rep->id.number, b->fs, txn_id,
+ b->local_pool));
+ SVN_ERR(store_l2p_index_entry(b->fs, txn_id, b->rep_offset,
+ rep->id.number, b->local_pool));
+
+ b->noderev->data_rep = rep;
+ }
+
+ SVN_ERR(svn_stream_close(b->rep_stream));
+
+ /* Remove cleanup callback. */
+ apr_pool_cleanup_kill(b->local_pool, b, rep_write_cleanup);
+
+ /* Write out the new node-rev information. */
+ SVN_ERR(svn_fs_x__put_node_revision(b->fs, b->noderev, b->local_pool));
+ if (!old_rep)
+ {
+ svn_fs_x__p2l_entry_t entry;
+ svn_fs_x__id_t noderev_id;
+ noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
+ noderev_id.number = rep->id.number;
+
+ entry.offset = b->rep_offset;
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, b->file, b->local_pool));
+ entry.size = offset - b->rep_offset;
+ entry.type = SVN_FS_X__ITEM_TYPE_FILE_REP;
+ entry.item_count = 1;
+ entry.items = &noderev_id;
+ entry.fnv1_checksum = b->fnv1a_checksum;
+
+ SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->local_pool));
+ SVN_ERR(store_p2l_index_entry(b->fs, txn_id, &entry, b->local_pool));
+ }
+
+ SVN_ERR(svn_io_file_close(b->file, b->local_pool));
+ SVN_ERR(unlock_proto_rev(b->fs, txn_id, b->lockcookie, b->local_pool));
+ svn_pool_destroy(b->local_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Store a writable stream in *CONTENTS_P, allocated in RESULT_POOL, that
+ will receive all data written and store it as the file data representation
+ referenced by NODEREV in filesystem FS. Only appropriate for file data,
+ not props or directory contents. */
+static svn_error_t *
+set_representation(svn_stream_t **contents_p,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool)
+{
+ rep_write_baton_t *wb;
+
+ if (! svn_fs_x__is_txn(noderev->noderev_id.change_set))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Attempted to write to non-transaction '%s'"),
+ svn_fs_x__id_unparse(&noderev->noderev_id,
+ result_pool)->data);
+
+ SVN_ERR(rep_write_get_baton(&wb, fs, noderev, result_pool));
+
+ *contents_p = svn_stream_create(wb, result_pool);
+ svn_stream_set_write(*contents_p, rep_write_contents);
+ svn_stream_set_close(*contents_p, rep_write_contents_close);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__set_contents(svn_stream_t **stream,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool)
+{
+ if (noderev->kind != svn_node_file)
+ return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't set text contents of a directory"));
+
+ return set_representation(stream, fs, noderev, result_pool);
+}
+
+svn_error_t *
+svn_fs_x__create_successor(svn_fs_t *fs,
+ svn_fs_x__noderev_t *new_noderev,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ new_noderev->copy_id = *copy_id;
+ new_noderev->noderev_id.change_set = svn_fs_x__change_set_by_txn(txn_id);
+ SVN_ERR(allocate_item_index(&new_noderev->noderev_id.number, fs, txn_id,
+ scratch_pool));
+
+ if (! new_noderev->copyroot_path)
+ {
+ new_noderev->copyroot_path
+ = apr_pstrdup(scratch_pool, new_noderev->created_path);
+ new_noderev->copyroot_rev
+ = svn_fs_x__get_revnum(new_noderev->noderev_id.change_set);
+ }
+
+ SVN_ERR(svn_fs_x__put_node_revision(fs, new_noderev, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__set_proplist(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool)
+{
+ const svn_fs_x__id_t *id = &noderev->noderev_id;
+ const char *filename = svn_fs_x__path_txn_node_props(fs, id, scratch_pool,
+ scratch_pool);
+ apr_file_t *file;
+ svn_stream_t *out;
+
+ /* Dump the property list to the mutable property file. */
+ SVN_ERR(svn_io_file_open(&file, filename,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, scratch_pool));
+ out = svn_stream_from_aprfile2(file, TRUE, scratch_pool);
+ SVN_ERR(svn_hash_write2(proplist, out, SVN_HASH_TERMINATOR, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ /* Mark the node-rev's prop rep as mutable, if not already done. */
+ if (!noderev->prop_rep
+ || svn_fs_x__is_revision(noderev->prop_rep->id.change_set))
+ {
+ svn_fs_x__txn_id_t txn_id
+ = svn_fs_x__get_txn_id(noderev->noderev_id.change_set);
+ noderev->prop_rep = apr_pcalloc(scratch_pool, sizeof(*noderev->prop_rep));
+ noderev->prop_rep->id.change_set = id->change_set;
+ SVN_ERR(allocate_item_index(&noderev->prop_rep->id.number, fs,
+ txn_id, scratch_pool));
+ SVN_ERR(svn_fs_x__put_node_revision(fs, noderev, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* This baton is used by the stream created for write_container_rep. */
+typedef struct write_container_baton_t
+{
+ svn_stream_t *stream;
+
+ apr_size_t size;
+
+ svn_checksum_ctx_t *md5_ctx;
+ svn_checksum_ctx_t *sha1_ctx;
+} write_container_baton_t;
+
+/* The handler for the write_container_rep stream. BATON is a
+ write_container_baton_t, DATA has the data to write and *LEN is the number
+ of bytes to write. */
+static svn_error_t *
+write_container_handler(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ write_container_baton_t *whb = baton;
+
+ SVN_ERR(svn_checksum_update(whb->md5_ctx, data, *len));
+ SVN_ERR(svn_checksum_update(whb->sha1_ctx, data, *len));
+
+ SVN_ERR(svn_stream_write(whb->stream, data, len));
+ whb->size += *len;
+
+ return SVN_NO_ERROR;
+}
+
+/* Callback function type. Write the data provided by BATON into STREAM. */
+typedef svn_error_t *
+(* collection_writer_t)(svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Implement collection_writer_t writing the C string->svn_string_t hash
+ given as BATON. */
+static svn_error_t *
+write_hash_to_stream(svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *hash = baton;
+ SVN_ERR(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement collection_writer_t writing the svn_fs_x__dirent_t* array given
+ as BATON. */
+static svn_error_t *
+write_directory_to_stream(svn_stream_t *stream,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *dir = baton;
+ SVN_ERR(unparse_dir_entries(dir, stream, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Write out the COLLECTION pertaining to the NODEREV in FS as a deltified
+ text representation to file FILE using WRITER. In the process, record the
+ total size and the md5 digest in REP and add the representation of type
+ ITEM_TYPE to the indexes if necessary. If rep sharing has been enabled and
+ REPS_HASH is not NULL, it will be used in addition to the on-disk cache to
+ find earlier reps with the same content. When such existing reps can be
+ found, we will truncate the one just written from the file and return the
+ existing rep.
+
+ If ITEM_TYPE is IS_PROPS equals SVN_FS_FS__ITEM_TYPE_*_PROPS, assume
+ that we want to a props representation as the base for our delta.
+ If FINAL_REVISION is not SVN_INVALID_REVNUM, use it to determine whether
+ to write to the proto-index files.
+ Perform temporary allocations in SCRATCH_POOL.
+ */
+static svn_error_t *
+write_container_delta_rep(svn_fs_x__representation_t *rep,
+ apr_file_t *file,
+ void *collection,
+ collection_writer_t writer,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_fs_x__noderev_t *noderev,
+ apr_hash_t *reps_hash,
+ apr_uint32_t item_type,
+ svn_revnum_t final_revision,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_txdelta_window_handler_t diff_wh;
+ void *diff_whb;
+
+ svn_stream_t *file_stream;
+ svn_stream_t *stream;
+ svn_fs_x__representation_t *base_rep;
+ svn_fs_x__representation_t *old_rep;
+ svn_fs_x__p2l_entry_t entry;
+ svn_stream_t *source;
+ svn_fs_x__rep_header_t header = { 0 };
+
+ apr_off_t rep_end = 0;
+ apr_off_t delta_start = 0;
+ apr_off_t offset = 0;
+
+ write_container_baton_t *whb;
+ int diff_version = 1;
+ svn_boolean_t is_props = (item_type == SVN_FS_X__ITEM_TYPE_FILE_PROPS)
+ || (item_type == SVN_FS_X__ITEM_TYPE_DIR_PROPS);
+
+ /* Get the base for this delta. */
+ SVN_ERR(choose_delta_base(&base_rep, fs, noderev, is_props, scratch_pool));
+ SVN_ERR(svn_fs_x__get_contents(&source, fs, base_rep, FALSE, scratch_pool));
+
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, file, scratch_pool));
+
+ /* Write out the rep header. */
+ if (base_rep)
+ {
+ header.base_revision = svn_fs_x__get_revnum(base_rep->id.change_set);
+ header.base_item_index = base_rep->id.number;
+ header.base_length = base_rep->size;
+ header.type = svn_fs_x__rep_delta;
+ }
+ else
+ {
+ header.type = svn_fs_x__rep_self_delta;
+ }
+
+ file_stream = svn_checksum__wrap_write_stream_fnv1a_32x4(
+ &entry.fnv1_checksum,
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ scratch_pool);
+ SVN_ERR(svn_fs_x__write_rep_header(&header, file_stream, scratch_pool));
+ SVN_ERR(svn_fs_x__get_file_offset(&delta_start, file, scratch_pool));
+
+ /* Prepare to write the svndiff data. */
+ svn_txdelta_to_svndiff3(&diff_wh,
+ &diff_whb,
+ svn_stream_disown(file_stream, scratch_pool),
+ diff_version,
+ ffd->delta_compression_level,
+ scratch_pool);
+
+ whb = apr_pcalloc(scratch_pool, sizeof(*whb));
+ whb->stream = svn_txdelta_target_push(diff_wh, diff_whb, source,
+ scratch_pool);
+ whb->size = 0;
+ whb->md5_ctx = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
+ whb->sha1_ctx = svn_checksum_ctx_create(svn_checksum_sha1, scratch_pool);
+
+ /* serialize the hash */
+ stream = svn_stream_create(whb, scratch_pool);
+ svn_stream_set_write(stream, write_container_handler);
+
+ SVN_ERR(writer(stream, collection, scratch_pool));
+ SVN_ERR(svn_stream_close(whb->stream));
+
+ /* Store the results. */
+ SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
+
+ /* Check and see if we already have a representation somewhere that's
+ identical to the one we just wrote out. */
+ SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, scratch_pool,
+ scratch_pool));
+
+ if (old_rep)
+ {
+ SVN_ERR(svn_stream_close(file_stream));
+
+ /* We need to erase from the protorev the data we just wrote. */
+ SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
+
+ /* Use the old rep for this content. */
+ memcpy(rep, old_rep, sizeof (*rep));
+ }
+ else
+ {
+ svn_fs_x__id_t noderev_id;
+
+ /* Write out our cosmetic end marker. */
+ SVN_ERR(svn_fs_x__get_file_offset(&rep_end, file, scratch_pool));
+ SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
+ SVN_ERR(svn_stream_close(file_stream));
+
+ SVN_ERR(allocate_item_index(&rep->id.number, fs, txn_id,
+ scratch_pool));
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, offset, rep->id.number,
+ scratch_pool));
+
+ noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
+ noderev_id.number = rep->id.number;
+
+ entry.offset = offset;
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, file, scratch_pool));
+ entry.size = offset - entry.offset;
+ entry.type = item_type;
+ entry.item_count = 1;
+ entry.items = &noderev_id;
+
+ SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, scratch_pool));
+
+ /* update the representation */
+ rep->expanded_size = whb->size;
+ rep->size = rep_end - delta_start;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Sanity check ROOT_NODEREV, a candidate for being the root node-revision
+ of (not yet committed) revision REV in FS. Use SCRATCH_POOL for temporary
+ allocations.
+
+ If you change this function, consider updating svn_fs_x__verify() too.
+ */
+static svn_error_t *
+validate_root_noderev(svn_fs_t *fs,
+ svn_fs_x__noderev_t *root_noderev,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool)
+{
+ svn_revnum_t head_revnum = rev-1;
+ int head_predecessor_count;
+
+ SVN_ERR_ASSERT(rev > 0);
+
+ /* Compute HEAD_PREDECESSOR_COUNT. */
+ {
+ svn_fs_x__id_t head_root_id;
+ svn_fs_x__noderev_t *head_root_noderev;
+
+ /* Get /@HEAD's noderev. */
+ svn_fs_x__init_rev_root(&head_root_id, head_revnum);
+ SVN_ERR(svn_fs_x__get_node_revision(&head_root_noderev, fs,
+ &head_root_id, scratch_pool,
+ scratch_pool));
+
+ head_predecessor_count = head_root_noderev->predecessor_count;
+ }
+
+ /* Check that the root noderev's predecessor count equals REV.
+
+ This kind of corruption was seen on svn.apache.org (both on
+ the root noderev and on other fspaths' noderevs); see
+ issue #4129.
+
+ Normally (rev == root_noderev->predecessor_count), but here we
+ use a more roundabout check that should only trigger on new instances
+ of the corruption, rather then trigger on each and every new commit
+ to a repository that has triggered the bug somewhere in its root
+ noderev's history.
+ */
+ if ((root_noderev->predecessor_count - head_predecessor_count)
+ != (rev - head_revnum))
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("predecessor count for "
+ "the root node-revision is wrong: "
+ "found (%d+%ld != %d), committing r%ld"),
+ head_predecessor_count,
+ rev - head_revnum, /* This is equal to 1. */
+ root_noderev->predecessor_count,
+ rev);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Given the potentially txn-local id PART, update that to a permanent ID
+ * based on the REVISION.
+ */
+static void
+get_final_id(svn_fs_x__id_t *part,
+ svn_revnum_t revision)
+{
+ if (!svn_fs_x__is_revision(part->change_set))
+ part->change_set = svn_fs_x__change_set_by_rev(revision);
+}
+
+/* Copy a node-revision specified by id ID in fileystem FS from a
+ transaction into the proto-rev-file FILE. Set *NEW_ID_P to a
+ pointer to the new noderev-id. If this is a directory, copy all
+ children as well.
+
+ START_NODE_ID and START_COPY_ID are
+ the first available node and copy ids for this filesystem, for older
+ FS formats.
+
+ REV is the revision number that this proto-rev-file will represent.
+
+ INITIAL_OFFSET is the offset of the proto-rev-file on entry to
+ commit_body.
+
+ If REPS_TO_CACHE is not NULL, append to it a copy (allocated in
+ REPS_POOL) of each data rep that is new in this revision.
+
+ If REPS_HASH is not NULL, append copies (allocated in REPS_POOL)
+ of the representations of each property rep that is new in this
+ revision.
+
+ AT_ROOT is true if the node revision being written is the root
+ node-revision. It is only controls additional sanity checking
+ logic.
+
+ Temporary allocations are also from SCRATCH_POOL. */
+static svn_error_t *
+write_final_rev(svn_fs_x__id_t *new_id_p,
+ apr_file_t *file,
+ svn_revnum_t rev,
+ svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_off_t initial_offset,
+ apr_array_header_t *reps_to_cache,
+ apr_hash_t *reps_hash,
+ apr_pool_t *reps_pool,
+ svn_boolean_t at_root,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ apr_off_t my_offset;
+ svn_fs_x__id_t new_id;
+ svn_fs_x__id_t noderev_id;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_x__txn_id_t txn_id = svn_fs_x__get_txn_id(id->change_set);
+ svn_fs_x__p2l_entry_t entry;
+ svn_fs_x__change_set_t change_set = svn_fs_x__change_set_by_rev(rev);
+ svn_stream_t *file_stream;
+ apr_pool_t *subpool;
+
+ /* Check to see if this is a transaction node. */
+ if (txn_id == SVN_FS_X__INVALID_TXN_ID)
+ {
+ svn_fs_x__id_reset(new_id_p);
+ return SVN_NO_ERROR;
+ }
+
+ subpool = svn_pool_create(scratch_pool);
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, scratch_pool,
+ subpool));
+
+ if (noderev->kind == svn_node_dir)
+ {
+ apr_array_header_t *entries;
+ int i;
+
+ /* This is a directory. Write out all the children first. */
+
+ SVN_ERR(svn_fs_x__rep_contents_dir(&entries, fs, noderev, scratch_pool,
+ subpool));
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *dirent = APR_ARRAY_IDX(entries, i,
+ svn_fs_x__dirent_t *);
+
+ svn_pool_clear(subpool);
+ SVN_ERR(write_final_rev(&new_id, file, rev, fs, &dirent->id,
+ initial_offset, reps_to_cache, reps_hash,
+ reps_pool, FALSE, subpool));
+ if ( svn_fs_x__id_used(&new_id)
+ && (svn_fs_x__get_revnum(new_id.change_set) == rev))
+ dirent->id = new_id;
+ }
+
+ if (noderev->data_rep
+ && ! svn_fs_x__is_revision(noderev->data_rep->id.change_set))
+ {
+ /* Write out the contents of this directory as a text rep. */
+ noderev->data_rep->id.change_set = change_set;
+ SVN_ERR(write_container_delta_rep(noderev->data_rep, file,
+ entries,
+ write_directory_to_stream,
+ fs, txn_id, noderev, NULL,
+ SVN_FS_X__ITEM_TYPE_DIR_REP,
+ rev, scratch_pool));
+ }
+ }
+ else
+ {
+ /* This is a file. We should make sure the data rep, if it
+ exists in a "this" state, gets rewritten to our new revision
+ num. */
+
+ if (noderev->data_rep
+ && svn_fs_x__is_txn(noderev->data_rep->id.change_set))
+ {
+ noderev->data_rep->id.change_set = change_set;
+ }
+ }
+
+ svn_pool_destroy(subpool);
+
+ /* Fix up the property reps. */
+ if (noderev->prop_rep
+ && svn_fs_x__is_txn(noderev->prop_rep->id.change_set))
+ {
+ apr_hash_t *proplist;
+ apr_uint32_t item_type = noderev->kind == svn_node_dir
+ ? SVN_FS_X__ITEM_TYPE_DIR_PROPS
+ : SVN_FS_X__ITEM_TYPE_FILE_PROPS;
+ SVN_ERR(svn_fs_x__get_proplist(&proplist, fs, noderev, scratch_pool,
+ scratch_pool));
+
+ noderev->prop_rep->id.change_set = change_set;
+
+ SVN_ERR(write_container_delta_rep(noderev->prop_rep, file, proplist,
+ write_hash_to_stream, fs, txn_id,
+ noderev, reps_hash, item_type, rev,
+ scratch_pool));
+ }
+
+ /* Convert our temporary ID into a permanent revision one. */
+ get_final_id(&noderev->node_id, rev);
+ get_final_id(&noderev->copy_id, rev);
+ get_final_id(&noderev->noderev_id, rev);
+
+ if (noderev->copyroot_rev == SVN_INVALID_REVNUM)
+ noderev->copyroot_rev = rev;
+
+ SVN_ERR(svn_fs_x__get_file_offset(&my_offset, file, scratch_pool));
+
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset,
+ noderev->noderev_id.number, scratch_pool));
+ new_id = noderev->noderev_id;
+
+ if (ffd->rep_sharing_allowed)
+ {
+ /* Save the data representation's hash in the rep cache. */
+ if ( noderev->data_rep && noderev->kind == svn_node_file
+ && svn_fs_x__get_revnum(noderev->data_rep->id.change_set) == rev)
+ {
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, svn_fs_x__representation_t *)
+ = svn_fs_x__rep_copy(noderev->data_rep, reps_pool);
+ }
+
+ if ( noderev->prop_rep
+ && svn_fs_x__get_revnum(noderev->prop_rep->id.change_set) == rev)
+ {
+ /* Add new property reps to hash and on-disk cache. */
+ svn_fs_x__representation_t *copy
+ = svn_fs_x__rep_copy(noderev->prop_rep, reps_pool);
+
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, svn_fs_x__representation_t *) = copy;
+
+ apr_hash_set(reps_hash,
+ copy->sha1_digest,
+ APR_SHA1_DIGESTSIZE,
+ copy);
+ }
+ }
+
+ /* don't serialize SHA1 for dirs to disk (waste of space) */
+ if (noderev->data_rep && noderev->kind == svn_node_dir)
+ noderev->data_rep->has_sha1 = FALSE;
+
+ /* don't serialize SHA1 for props to disk (waste of space) */
+ if (noderev->prop_rep)
+ noderev->prop_rep->has_sha1 = FALSE;
+
+ /* Write out our new node-revision. */
+ if (at_root)
+ SVN_ERR(validate_root_noderev(fs, noderev, rev, scratch_pool));
+
+ file_stream = svn_checksum__wrap_write_stream_fnv1a_32x4(
+ &entry.fnv1_checksum,
+ svn_stream_from_aprfile2(file, TRUE,
+ scratch_pool),
+ scratch_pool);
+ SVN_ERR(svn_fs_x__write_noderev(file_stream, noderev, scratch_pool));
+ SVN_ERR(svn_stream_close(file_stream));
+
+ /* reference the root noderev from the log-to-phys index */
+ noderev_id = noderev->noderev_id;
+ noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
+
+ entry.offset = my_offset;
+ SVN_ERR(svn_fs_x__get_file_offset(&my_offset, file, scratch_pool));
+ entry.size = my_offset - entry.offset;
+ entry.type = SVN_FS_X__ITEM_TYPE_NODEREV;
+ entry.item_count = 1;
+ entry.items = &noderev_id;
+
+ SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, scratch_pool));
+
+ /* Return our ID that references the revision file. */
+ *new_id_p = new_id;
+
+ return SVN_NO_ERROR;
+}
+
+/* Write the changed path info CHANGED_PATHS from transaction TXN_ID to the
+ permanent rev-file FILE representing NEW_REV in filesystem FS. *OFFSET_P
+ is set the to offset in the file of the beginning of this information.
+ NEW_REV is the revision currently being committed.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+write_final_changed_path_info(apr_off_t *offset_p,
+ apr_file_t *file,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_hash_t *changed_paths,
+ svn_revnum_t new_rev,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset;
+ svn_stream_t *stream;
+ svn_fs_x__p2l_entry_t entry;
+ svn_fs_x__id_t rev_item
+ = {SVN_INVALID_REVNUM, SVN_FS_X__ITEM_INDEX_CHANGES};
+
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, file, scratch_pool));
+
+ /* write to target file & calculate checksum */
+ stream = svn_checksum__wrap_write_stream_fnv1a_32x4(&entry.fnv1_checksum,
+ svn_stream_from_aprfile2(file, TRUE, scratch_pool),
+ scratch_pool);
+ SVN_ERR(svn_fs_x__write_changes(stream, fs, changed_paths, TRUE,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ *offset_p = offset;
+
+ /* reference changes from the indexes */
+ entry.offset = offset;
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, file, scratch_pool));
+ entry.size = offset - entry.offset;
+ entry.type = SVN_FS_X__ITEM_TYPE_CHANGES;
+ entry.item_count = 1;
+ entry.items = &rev_item;
+
+ SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, scratch_pool));
+ SVN_ERR(store_l2p_index_entry(fs, txn_id, entry.offset,
+ SVN_FS_X__ITEM_INDEX_CHANGES, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Open a new svn_fs_t handle to FS, set that handle's concept of "current
+ youngest revision" to NEW_REV, and call svn_fs_x__verify_root() on
+ NEW_REV's revision root.
+
+ Intended to be called as the very last step in a commit before 'current'
+ is bumped. This implies that we are holding the write lock. */
+static svn_error_t *
+verify_as_revision_before_current_plus_plus(svn_fs_t *fs,
+ svn_revnum_t new_rev,
+ apr_pool_t *scratch_pool)
+{
+#ifdef SVN_DEBUG
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_fs_t *ft; /* fs++ == ft */
+ svn_fs_root_t *root;
+ svn_fs_x__data_t *ft_ffd;
+ apr_hash_t *fs_config;
+
+ SVN_ERR_ASSERT(ffd->svn_fs_open_);
+
+ /* make sure FT does not simply return data cached by other instances
+ * but actually retrieves it from disk at least once.
+ */
+ fs_config = apr_hash_make(scratch_pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(scratch_pool));
+ SVN_ERR(ffd->svn_fs_open_(&ft, fs->path,
+ fs_config,
+ scratch_pool,
+ scratch_pool));
+ ft_ffd = ft->fsap_data;
+ /* Don't let FT consult rep-cache.db, either. */
+ ft_ffd->rep_sharing_allowed = FALSE;
+
+ /* Time travel! */
+ ft_ffd->youngest_rev_cache = new_rev;
+
+ SVN_ERR(svn_fs_x__revision_root(&root, ft, new_rev, scratch_pool));
+ SVN_ERR_ASSERT(root->is_txn_root == FALSE && root->rev == new_rev);
+ SVN_ERR_ASSERT(ft_ffd->youngest_rev_cache == new_rev);
+ SVN_ERR(svn_fs_x__verify_root(root, scratch_pool));
+#endif /* SVN_DEBUG */
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the user registered with FS has all the locks necessary to
+ permit all the changes associated with TXN_NAME.
+ The FS write lock is assumed to be held by the caller. */
+static svn_error_t *
+verify_locks(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_hash_t *changed_paths,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool;
+ apr_array_header_t *changed_paths_sorted;
+ svn_stringbuf_t *last_recursed = NULL;
+ int i;
+
+ /* Make an array of the changed paths, and sort them depth-first-ily. */
+ changed_paths_sorted = svn_sort__hash(changed_paths,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+
+ /* Now, traverse the array of changed paths, verify locks. Note
+ that if we need to do a recursive verification a path, we'll skip
+ over children of that path when we get to them. */
+ iterpool = svn_pool_create(scratch_pool);
+ for (i = 0; i < changed_paths_sorted->nelts; i++)
+ {
+ const svn_sort__item_t *item;
+ const char *path;
+ svn_fs_x__change_t *change;
+ svn_boolean_t recurse = TRUE;
+
+ svn_pool_clear(iterpool);
+
+ item = &APR_ARRAY_IDX(changed_paths_sorted, i, svn_sort__item_t);
+
+ /* Fetch the change associated with our path. */
+ path = item->key;
+ change = item->value;
+
+ /* If this path has already been verified as part of a recursive
+ check of one of its parents, no need to do it again. */
+ if (last_recursed
+ && svn_fspath__skip_ancestor(last_recursed->data, path))
+ continue;
+
+ /* What does it mean to succeed at lock verification for a given
+ path? For an existing file or directory getting modified
+ (text, props), it means we hold the lock on the file or
+ directory. For paths being added or removed, we need to hold
+ the locks for that path and any children of that path.
+
+ WHEW! We have no reliable way to determine the node kind
+ of deleted items, but fortunately we are going to do a
+ recursive check on deleted paths regardless of their kind. */
+ if (change->change_kind == svn_fs_path_change_modify)
+ recurse = FALSE;
+ SVN_ERR(svn_fs_x__allow_locked_operation(path, fs, recurse, TRUE,
+ iterpool));
+
+ /* If we just did a recursive check, remember the path we
+ checked (so children can be skipped). */
+ if (recurse)
+ {
+ if (! last_recursed)
+ last_recursed = svn_stringbuf_create(path, scratch_pool);
+ else
+ svn_stringbuf_set(last_recursed, path);
+ }
+ }
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Return in *PATH the path to a file containing the properties that
+ make up the final revision properties file. This involves setting
+ svn:date and removing any temporary properties associated with the
+ commit flags. */
+static svn_error_t *
+write_final_revprop(const char **path,
+ svn_fs_txn_t *txn,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool)
+{
+ apr_hash_t *txnprops;
+ svn_boolean_t final_mods = FALSE;
+ svn_string_t date;
+ svn_string_t *client_date;
+
+ SVN_ERR(svn_fs_x__txn_proplist(&txnprops, txn, pool));
+
+ /* Remove any temporary txn props representing 'flags'. */
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
+ final_mods = TRUE;
+ }
+
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
+ final_mods = TRUE;
+ }
+
+ client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
+ if (client_date)
+ {
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
+ final_mods = TRUE;
+ }
+
+ /* Update commit time to ensure that svn:date revprops remain ordered if
+ requested. */
+ if (!client_date || strcmp(client_date->data, "1"))
+ {
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
+ svn_hash_sets(txnprops, SVN_PROP_REVISION_DATE, &date);
+ final_mods = TRUE;
+ }
+
+ if (final_mods)
+ {
+ SVN_ERR(set_txn_proplist(txn->fs, txn_id, txnprops, TRUE, pool));
+ *path = svn_fs_x__path_txn_props_final(txn->fs, txn_id, pool);
+ }
+ else
+ {
+ *path = svn_fs_x__path_txn_props(txn->fs, txn_id, pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__add_index_data(svn_fs_t *fs,
+ apr_file_t *file,
+ const char *l2p_proto_index,
+ const char *p2l_proto_index,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t l2p_offset;
+ apr_off_t p2l_offset;
+ svn_stringbuf_t *footer;
+ unsigned char footer_length;
+ svn_checksum_t *l2p_checksum;
+ svn_checksum_t *p2l_checksum;
+
+ /* Append the actual index data to the pack file. */
+ l2p_offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_END, &l2p_offset, scratch_pool));
+ SVN_ERR(svn_fs_x__l2p_index_append(&l2p_checksum, fs, file,
+ l2p_proto_index, revision,
+ scratch_pool, scratch_pool));
+
+ p2l_offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_END, &p2l_offset, scratch_pool));
+ SVN_ERR(svn_fs_x__p2l_index_append(&p2l_checksum, fs, file,
+ p2l_proto_index, revision,
+ scratch_pool, scratch_pool));
+
+ /* Append footer. */
+ footer = svn_fs_x__unparse_footer(l2p_offset, l2p_checksum,
+ p2l_offset, p2l_checksum, scratch_pool,
+ scratch_pool);
+ SVN_ERR(svn_io_file_write_full(file, footer->data, footer->len, NULL,
+ scratch_pool));
+
+ footer_length = footer->len;
+ SVN_ERR_ASSERT(footer_length == footer->len);
+ SVN_ERR(svn_io_file_write_full(file, &footer_length, 1, NULL,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton used for commit_body below. */
+typedef struct commit_baton_t {
+ svn_revnum_t *new_rev_p;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ apr_array_header_t *reps_to_cache;
+ apr_hash_t *reps_hash;
+ apr_pool_t *reps_pool;
+} commit_baton_t;
+
+/* The work-horse for svn_fs_x__commit, called with the FS write lock.
+ This implements the svn_fs_x__with_write_lock() 'body' callback
+ type. BATON is a 'commit_baton_t *'. */
+static svn_error_t *
+commit_body(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ commit_baton_t *cb = baton;
+ svn_fs_x__data_t *ffd = cb->fs->fsap_data;
+ const char *old_rev_filename, *rev_filename, *proto_filename;
+ const char *revprop_filename, *final_revprop;
+ svn_fs_x__id_t root_id, new_root_id;
+ svn_revnum_t old_rev, new_rev;
+ apr_file_t *proto_file;
+ void *proto_file_lockcookie;
+ apr_off_t initial_offset, changed_path_offset;
+ svn_fs_x__txn_id_t txn_id = svn_fs_x__txn_get_id(cb->txn);
+ apr_hash_t *changed_paths;
+
+ /* Re-Read the current repository format. All our repo upgrade and
+ config evaluation strategies are such that existing information in
+ FS and FFD remains valid.
+
+ Although we don't recommend upgrading hot repositories, people may
+ still do it and we must make sure to either handle them gracefully
+ or to error out.
+
+ Committing pre-format 3 txns will fail after upgrade to format 3+
+ because the proto-rev cannot be found; no further action needed.
+ Upgrades from pre-f7 to f7+ means a potential change in addressing
+ mode for the final rev. We must be sure to detect that cause because
+ the failure would only manifest once the new revision got committed.
+ */
+ SVN_ERR(svn_fs_x__read_format_file(cb->fs, scratch_pool));
+
+ /* Get the current youngest revision. */
+ SVN_ERR(svn_fs_x__youngest_rev(&old_rev, cb->fs, scratch_pool));
+
+ /* Check to make sure this transaction is based off the most recent
+ revision. */
+ if (cb->txn->base_rev != old_rev)
+ return svn_error_create(SVN_ERR_FS_TXN_OUT_OF_DATE, NULL,
+ _("Transaction out of date"));
+
+ /* We need the changes list for verification as well as for writing it
+ to the final rev file. */
+ SVN_ERR(svn_fs_x__txn_changes_fetch(&changed_paths, cb->fs, txn_id,
+ scratch_pool));
+
+ /* Locks may have been added (or stolen) between the calling of
+ previous svn_fs.h functions and svn_fs_commit_txn(), so we need
+ to re-examine every changed-path in the txn and re-verify all
+ discovered locks. */
+ SVN_ERR(verify_locks(cb->fs, txn_id, changed_paths, scratch_pool));
+
+ /* We are going to be one better than this puny old revision. */
+ new_rev = old_rev + 1;
+
+ /* Get a write handle on the proto revision file. */
+ SVN_ERR(get_writable_proto_rev(&proto_file, &proto_file_lockcookie,
+ cb->fs, txn_id, scratch_pool));
+ SVN_ERR(svn_fs_x__get_file_offset(&initial_offset, proto_file,
+ scratch_pool));
+
+ /* Write out all the node-revisions and directory contents. */
+ svn_fs_x__init_txn_root(&root_id, txn_id);
+ SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, &root_id,
+ initial_offset, cb->reps_to_cache, cb->reps_hash,
+ cb->reps_pool, TRUE, scratch_pool));
+
+ /* Write the changed-path information. */
+ SVN_ERR(write_final_changed_path_info(&changed_path_offset, proto_file,
+ cb->fs, txn_id, changed_paths,
+ new_rev, scratch_pool));
+
+ /* Append the index data to the rev file. */
+ SVN_ERR(svn_fs_x__add_index_data(cb->fs, proto_file,
+ svn_fs_x__path_l2p_proto_index(cb->fs, txn_id, scratch_pool),
+ svn_fs_x__path_p2l_proto_index(cb->fs, txn_id, scratch_pool),
+ new_rev, scratch_pool));
+
+ SVN_ERR(svn_io_file_flush_to_disk(proto_file, scratch_pool));
+ SVN_ERR(svn_io_file_close(proto_file, scratch_pool));
+
+ /* We don't unlock the prototype revision file immediately to avoid a
+ race with another caller writing to the prototype revision file
+ before we commit it. */
+
+ /* Create the shard for the rev and revprop file, if we're sharding and
+ this is the first revision of a new shard. We don't care if this
+ fails because the shard already existed for some reason. */
+ if (new_rev % ffd->max_files_per_dir == 0)
+ {
+ /* Create the revs shard. */
+ {
+ const char *new_dir
+ = svn_fs_x__path_rev_shard(cb->fs, new_rev, scratch_pool);
+ svn_error_t *err = svn_io_dir_make(new_dir, APR_OS_DEFAULT,
+ scratch_pool);
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
+ PATH_REVS_DIR,
+ scratch_pool),
+ new_dir, scratch_pool));
+ }
+
+ /* Create the revprops shard. */
+ SVN_ERR_ASSERT(! svn_fs_x__is_packed_revprop(cb->fs, new_rev));
+ {
+ const char *new_dir
+ = svn_fs_x__path_revprops_shard(cb->fs, new_rev, scratch_pool);
+ svn_error_t *err = svn_io_dir_make(new_dir, APR_OS_DEFAULT,
+ scratch_pool);
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ SVN_ERR(svn_io_copy_perms(svn_dirent_join(cb->fs->path,
+ PATH_REVPROPS_DIR,
+ scratch_pool),
+ new_dir, scratch_pool));
+ }
+ }
+
+ /* Move the finished rev file into place.
+
+ ### This "breaks" the transaction by removing the protorev file
+ ### but the revision is not yet complete. If this commit does
+ ### not complete for any reason the transaction will be lost. */
+ old_rev_filename = svn_fs_x__path_rev_absolute(cb->fs, old_rev,
+ scratch_pool);
+
+ rev_filename = svn_fs_x__path_rev(cb->fs, new_rev, scratch_pool);
+ proto_filename = svn_fs_x__path_txn_proto_rev(cb->fs, txn_id,
+ scratch_pool);
+ SVN_ERR(svn_fs_x__move_into_place(proto_filename, rev_filename,
+ old_rev_filename, scratch_pool));
+
+ /* Now that we've moved the prototype revision file out of the way,
+ we can unlock it (since further attempts to write to the file
+ will fail as it no longer exists). We must do this so that we can
+ remove the transaction directory later. */
+ SVN_ERR(unlock_proto_rev(cb->fs, txn_id, proto_file_lockcookie,
+ scratch_pool));
+
+ /* Move the revprops file into place. */
+ SVN_ERR_ASSERT(! svn_fs_x__is_packed_revprop(cb->fs, new_rev));
+ SVN_ERR(write_final_revprop(&revprop_filename, cb->txn, txn_id,
+ scratch_pool));
+ final_revprop = svn_fs_x__path_revprops(cb->fs, new_rev, scratch_pool);
+ SVN_ERR(svn_fs_x__move_into_place(revprop_filename, final_revprop,
+ old_rev_filename, scratch_pool));
+
+ /* Update the 'current' file. */
+ SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev,
+ scratch_pool));
+ SVN_ERR(svn_fs_x__write_current(cb->fs, new_rev, scratch_pool));
+
+ /* At this point the new revision is committed and globally visible
+ so let the caller know it succeeded by giving it the new revision
+ number, which fulfills svn_fs_commit_txn() contract. Any errors
+ after this point do not change the fact that a new revision was
+ created. */
+ *cb->new_rev_p = new_rev;
+
+ ffd->youngest_rev_cache = new_rev;
+
+ /* Remove this transaction directory. */
+ SVN_ERR(svn_fs_x__purge_txn(cb->fs, cb->txn->id, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Add the representations in REPS_TO_CACHE (an array of
+ * svn_fs_x__representation_t *) to the rep-cache database of FS. */
+static svn_error_t *
+write_reps_to_cache(svn_fs_t *fs,
+ const apr_array_header_t *reps_to_cache,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ for (i = 0; i < reps_to_cache->nelts; i++)
+ {
+ svn_fs_x__representation_t *rep
+ = APR_ARRAY_IDX(reps_to_cache, i, svn_fs_x__representation_t *);
+
+ /* FALSE because we don't care if another parallel commit happened to
+ * collide with us. (Non-parallel collisions will not be detected.) */
+ SVN_ERR(svn_fs_x__set_rep_reference(fs, rep, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__commit(svn_revnum_t *new_rev_p,
+ svn_fs_t *fs,
+ svn_fs_txn_t *txn,
+ apr_pool_t *scratch_pool)
+{
+ commit_baton_t cb;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ cb.new_rev_p = new_rev_p;
+ cb.fs = fs;
+ cb.txn = txn;
+
+ if (ffd->rep_sharing_allowed)
+ {
+ cb.reps_to_cache = apr_array_make(scratch_pool, 5,
+ sizeof(svn_fs_x__representation_t *));
+ cb.reps_hash = apr_hash_make(scratch_pool);
+ cb.reps_pool = scratch_pool;
+ }
+ else
+ {
+ cb.reps_to_cache = NULL;
+ cb.reps_hash = NULL;
+ cb.reps_pool = NULL;
+ }
+
+ SVN_ERR(svn_fs_x__with_write_lock(fs, commit_body, &cb, scratch_pool));
+
+ /* At this point, *NEW_REV_P has been set, so errors below won't affect
+ the success of the commit. (See svn_fs_commit_txn().) */
+
+ if (ffd->rep_sharing_allowed)
+ {
+ SVN_ERR(svn_fs_x__open_rep_cache(fs, scratch_pool));
+
+ /* Write new entries to the rep-sharing database.
+ *
+ * We use an sqlite transaction to speed things up;
+ * see <http://www.sqlite.org/faq.html#q19>.
+ */
+ /* ### A commit that touches thousands of files will starve other
+ (reader/writer) commits for the duration of the below call.
+ Maybe write in batches? */
+ SVN_SQLITE__WITH_TXN(
+ write_reps_to_cache(fs, cb.reps_to_cache, scratch_pool),
+ ffd->rep_cache_db);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__list_transactions(apr_array_header_t **names_p,
+ svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ const char *txn_dir;
+ apr_hash_t *dirents;
+ apr_hash_index_t *hi;
+ apr_array_header_t *names;
+ apr_size_t ext_len = strlen(PATH_EXT_TXN);
+
+ names = apr_array_make(pool, 1, sizeof(const char *));
+
+ /* Get the transactions directory. */
+ txn_dir = svn_fs_x__path_txns_dir(fs, pool);
+
+ /* Now find a listing of this directory. */
+ SVN_ERR(svn_io_get_dirents3(&dirents, txn_dir, TRUE, pool, pool));
+
+ /* Loop through all the entries and return anything that ends with '.txn'. */
+ for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
+ {
+ const char *name = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ const char *id;
+
+ /* The name must end with ".txn" to be considered a transaction. */
+ if ((apr_size_t) klen <= ext_len
+ || (strcmp(name + klen - ext_len, PATH_EXT_TXN)) != 0)
+ continue;
+
+ /* Truncate the ".txn" extension and store the ID. */
+ id = apr_pstrndup(pool, name, strlen(name) - ext_len);
+ APR_ARRAY_PUSH(names, const char *) = id;
+ }
+
+ *names_p = names;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__open_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ const char *name,
+ apr_pool_t *pool)
+{
+ svn_fs_txn_t *txn;
+ fs_txn_data_t *ftd;
+ svn_node_kind_t kind;
+ svn_fs_x__transaction_t *local_txn;
+ svn_fs_x__txn_id_t txn_id;
+
+ SVN_ERR(svn_fs_x__txn_by_name(&txn_id, name));
+
+ /* First check to see if the directory exists. */
+ SVN_ERR(svn_io_check_path(svn_fs_x__path_txn_dir(fs, txn_id, pool),
+ &kind, pool));
+
+ /* Did we find it? */
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_TRANSACTION, NULL,
+ _("No such transaction '%s'"),
+ name);
+
+ txn = apr_pcalloc(pool, sizeof(*txn));
+ ftd = apr_pcalloc(pool, sizeof(*ftd));
+ ftd->txn_id = txn_id;
+
+ /* Read in the root node of this transaction. */
+ txn->id = apr_pstrdup(pool, name);
+ txn->fs = fs;
+
+ SVN_ERR(svn_fs_x__get_txn(&local_txn, fs, txn_id, pool));
+
+ txn->base_rev = local_txn->base_rev;
+
+ txn->vtable = &txn_vtable;
+ txn->fsap_data = ftd;
+ *txn_p = txn;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__txn_proplist(apr_hash_t **table_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ apr_hash_t *proplist = apr_hash_make(pool);
+ SVN_ERR(get_txn_proplist(proplist, txn->fs, svn_fs_x__txn_get_id(txn),
+ pool));
+ *table_p = proplist;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__delete_node_revision(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__noderev_t *noderev;
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, scratch_pool,
+ scratch_pool));
+
+ /* Delete any mutable property representation. */
+ if (noderev->prop_rep
+ && svn_fs_x__is_txn(noderev->prop_rep->id.change_set))
+ SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_props(fs, id,
+ scratch_pool,
+ scratch_pool),
+ FALSE, scratch_pool));
+
+ /* Delete any mutable data representation. */
+ if (noderev->data_rep
+ && svn_fs_x__is_txn(noderev->data_rep->id.change_set)
+ && noderev->kind == svn_node_dir)
+ {
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ const svn_fs_x__id_t *key = id;
+
+ SVN_ERR(svn_io_remove_file2(
+ svn_fs_x__path_txn_node_children(fs, id, scratch_pool,
+ scratch_pool),
+ FALSE, scratch_pool));
+
+ /* remove the corresponding entry from the cache, if such exists */
+ SVN_ERR(svn_cache__set(ffd->dir_cache, key, NULL, scratch_pool));
+ }
+
+ return svn_io_remove_file2(svn_fs_x__path_txn_node_rev(fs, id,
+ scratch_pool,
+ scratch_pool),
+ FALSE, scratch_pool);
+}
+
+
+
+/*** Transactions ***/
+
+svn_error_t *
+svn_fs_x__get_base_rev(svn_revnum_t *revnum,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__transaction_t *txn;
+ SVN_ERR(svn_fs_x__get_txn(&txn, fs, txn_id, scratch_pool));
+ *revnum = txn->base_rev;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Generic transaction operations. */
+
+svn_error_t *
+svn_fs_x__txn_prop(svn_string_t **value_p,
+ svn_fs_txn_t *txn,
+ const char *propname,
+ apr_pool_t *pool)
+{
+ apr_hash_t *table;
+ svn_fs_t *fs = txn->fs;
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_x__txn_proplist(&table, txn, pool));
+
+ *value_p = svn_hash_gets(table, propname);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__begin_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint32_t flags,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_string_t date;
+ fs_txn_data_t *ftd;
+ apr_hash_t *props = apr_hash_make(scratch_pool);
+
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ SVN_ERR(create_txn(txn_p, fs, rev, result_pool, scratch_pool));
+
+ /* Put a datestamp on the newly created txn, so we always know
+ exactly how old it is. (This will help sysadmins identify
+ long-abandoned txns that may need to be manually removed.) When
+ a txn is promoted to a revision, this property will be
+ automatically overwritten with a revision datestamp. */
+ date.data = svn_time_to_cstring(apr_time_now(), scratch_pool);
+ date.len = strlen(date.data);
+
+ svn_hash_sets(props, SVN_PROP_REVISION_DATE, &date);
+
+ /* Set temporary txn props that represent the requested 'flags'
+ behaviors. */
+ if (flags & SVN_FS_TXN_CHECK_OOD)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_OOD,
+ svn_string_create("true", scratch_pool));
+
+ if (flags & SVN_FS_TXN_CHECK_LOCKS)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CHECK_LOCKS,
+ svn_string_create("true", scratch_pool));
+
+ if (flags & SVN_FS_TXN_CLIENT_DATE)
+ svn_hash_sets(props, SVN_FS__PROP_TXN_CLIENT_DATE,
+ svn_string_create("0", scratch_pool));
+
+ ftd = (*txn_p)->fsap_data;
+ SVN_ERR(set_txn_proplist(fs, ftd->txn_id, props, FALSE, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/transaction.h b/subversion/libsvn_fs_x/transaction.h
new file mode 100644
index 0000000..490f716
--- /dev/null
+++ b/subversion/libsvn_fs_x/transaction.h
@@ -0,0 +1,316 @@
+/* transaction.h --- transaction-related functions of FSX
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__TRANSACTION_H
+#define SVN_LIBSVN_FS__TRANSACTION_H
+
+#include "fs.h"
+
+/* Return the transaction ID of TXN.
+ */
+svn_fs_x__txn_id_t
+svn_fs_x__txn_get_id(svn_fs_txn_t *txn);
+
+/* Obtain a write lock on the filesystem FS in a subpool of SCRATCH_POOL,
+ call BODY with BATON and that subpool, destroy the subpool (releasing the
+ write lock) and return what BODY returned. */
+svn_error_t *
+svn_fs_x__with_write_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Obtain a pack operation lock on the filesystem FS in a subpool of
+ SCRATCH_POOL, call BODY with BATON and that subpool, destroy the subpool
+ (releasing the write lock) and return what BODY returned. */
+svn_error_t *
+svn_fs_x__with_pack_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Obtain the txn-current file lock on the filesystem FS in a subpool of
+ SCRATCH_POOL, call BODY with BATON and that subpool, destroy the subpool
+ (releasing the write lock) and return what BODY returned. */
+svn_error_t *
+svn_fs_x__with_txn_current_lock(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Obtain all locks on the filesystem FS in a subpool of SCRATCH_POOL,
+ call BODY with BATON and that subpool, destroy the subpool (releasing
+ the locks) and return what BODY returned.
+
+ This combines svn_fs_fs__with_write_lock, svn_fs_fs__with_pack_lock,
+ and svn_fs_fs__with_txn_current_lock, ensuring correct lock ordering. */
+svn_error_t *
+svn_fs_x__with_all_locks(svn_fs_t *fs,
+ svn_error_t *(*body)(void *baton,
+ apr_pool_t *scratch_pool),
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Return TRUE, iff NODEREV is the root node of a transaction that has not
+ seen any modifications, yet. */
+svn_boolean_t
+svn_fs_x__is_fresh_txn_root(svn_fs_x__noderev_t *noderev);
+
+/* Store NODEREV as the node-revision in the transaction defined by NODEREV's
+ ID within FS. Do any necessary temporary allocation in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__put_node_revision(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *scratch_pool);
+
+/* Find the paths which were changed in transaction TXN_ID of
+ filesystem FS and store them in *CHANGED_PATHS_P.
+ Get any temporary allocations from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__txn_changes_fetch(apr_hash_t **changed_paths_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Set the transaction property NAME to the value VALUE in transaction
+ TXN. Perform temporary allocations from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__change_txn_prop(svn_fs_txn_t *txn,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool);
+
+/* Change transaction properties in transaction TXN based on PROPS.
+ Perform temporary allocations from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__change_txn_props(svn_fs_txn_t *txn,
+ const apr_array_header_t *props,
+ apr_pool_t *scratch_pool);
+
+/* Store a transaction record in *TXN_P for the transaction identified
+ by TXN_ID in filesystem FS. Allocate everything from POOL. */
+svn_error_t *
+svn_fs_x__get_txn(svn_fs_x__transaction_t **txn_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *pool);
+
+/* Return the next available copy_id in *COPY_ID for the transaction
+ TXN_ID in filesystem FS. Allocate temporaries in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__reserve_copy_id(svn_fs_x__id_t *copy_id_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Create an entirely new mutable node in the filesystem FS, whose
+ node-revision is NODEREV. COPY_ID is the copy_id to use in the
+ node revision ID. TXN_ID is the Subversion transaction under
+ which this occurs. */
+svn_error_t *
+svn_fs_x__create_node(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Remove all references to the transaction TXN_ID from filesystem FS.
+ Temporary allocations are from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__purge_txn(svn_fs_t *fs,
+ const char *txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Abort the existing transaction TXN, performing any temporary
+ allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__abort_txn(svn_fs_txn_t *txn,
+ apr_pool_t *scratch_pool);
+
+/* Add or set in filesystem FS, transaction TXN_ID, in directory
+ PARENT_NODEREV a directory entry for NAME pointing to ID of type
+ KIND. The PARENT_NODEREV's DATA_REP will be redirected to the in-txn
+ representation, if it had not been mutable before.
+
+ If PARENT_NODEREV does not have a DATA_REP, allocate one in RESULT_POOL.
+ Temporary allocations are done in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__set_entry(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_fs_x__noderev_t *parent_noderev,
+ const char *name,
+ const svn_fs_x__id_t *id,
+ svn_node_kind_t kind,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Add a change to the changes record for filesystem FS in transaction
+ TXN_ID. Mark path PATH, having noderev-id ID, as changed according to
+ the type in CHANGE_KIND. If the text representation was changed set
+ TEXT_MOD to TRUE, and likewise for PROP_MOD as well as MERGEINFO_MOD.
+ If this change was the result of a copy, set COPYFROM_REV and
+ COPYFROM_PATH to the revision and path of the copy source, otherwise
+ they should be set to SVN_INVALID_REVNUM and NULL. Perform any
+ temporary allocations from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__add_change(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const char *path,
+ const svn_fs_x__id_t *id,
+ svn_fs_path_change_kind_t change_kind,
+ svn_boolean_t text_mod,
+ svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
+ svn_node_kind_t node_kind,
+ svn_revnum_t copyfrom_rev,
+ const char *copyfrom_path,
+ apr_pool_t *scratch_pool);
+
+/* Return a writable stream in *STREAM, allocated in RESULT_POOL, that
+ allows storing the text representation of node-revision NODEREV in
+ filesystem FS. */
+svn_error_t *
+svn_fs_x__set_contents(svn_stream_t **stream,
+ svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_pool_t *result_pool);
+
+/* Create a node revision in FS which is an immediate successor of
+ NEW_NODEREV's predecessor. Use SCRATCH_POOL for any temporary allocation.
+
+ COPY_ID, is a key into the `copies' table, and
+ indicates that this new node is being created as the result of a
+ copy operation, and specifically which operation that was.
+
+ TXN_ID is the Subversion transaction under which this occurs.
+
+ After this call, the deltification code assumes that the new node's
+ contents will change frequently, and will avoid representing other
+ nodes as deltas against this node's contents. */
+svn_error_t *
+svn_fs_x__create_successor(svn_fs_t *fs,
+ svn_fs_x__noderev_t *new_noderev,
+ const svn_fs_x__id_t *copy_id,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Write a new property list PROPLIST for node-revision NODEREV in
+ filesystem FS. Perform any temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__set_proplist(svn_fs_t *fs,
+ svn_fs_x__noderev_t *noderev,
+ apr_hash_t *proplist,
+ apr_pool_t *scratch_pool);
+
+/* Append the L2P and P2L indexes given by their proto index file names
+ * L2P_PROTO_INDEX and P2L_PROTO_INDEX to the revision / pack FILE.
+ * The latter contains revision(s) starting at REVISION in FS.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__add_index_data(svn_fs_t *fs,
+ apr_file_t *file,
+ const char *l2p_proto_index,
+ const char *p2l_proto_index,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+
+/* Commit the transaction TXN in filesystem FS and return its new
+ revision number in *REV. If the transaction is out of date, return
+ the error SVN_ERR_FS_TXN_OUT_OF_DATE. Use SCRATCH_POOL for temporary
+ allocations. */
+svn_error_t *
+svn_fs_x__commit(svn_revnum_t *new_rev_p,
+ svn_fs_t *fs,
+ svn_fs_txn_t *txn,
+ apr_pool_t *scratch_pool);
+
+/* Set *NAMES_P to an array of names which are all the active
+ transactions in filesystem FS. Allocate the array from POOL. */
+svn_error_t *
+svn_fs_x__list_transactions(apr_array_header_t **names_p,
+ svn_fs_t *fs,
+ apr_pool_t *pool);
+
+/* Open the transaction named NAME in filesystem FS. Set *TXN_P to
+ * the transaction. If there is no such transaction, return
+` * SVN_ERR_FS_NO_SUCH_TRANSACTION. Allocate the new transaction in
+ * POOL. */
+svn_error_t *
+svn_fs_x__open_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ const char *name,
+ apr_pool_t *pool);
+
+/* Return the property list from transaction TXN and store it in
+ *PROPLIST. Allocate the property list from POOL. */
+svn_error_t *
+svn_fs_x__txn_proplist(apr_hash_t **table_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+/* Delete the mutable node-revision referenced by ID, along with any
+ mutable props or directory contents associated with it. Perform
+ temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__delete_node_revision(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *scratch_pool);
+
+/* Retrieve information about the Subversion transaction TXN_ID from
+ the `transactions' table of FS, using SCRATCH_POOL for temporary
+ allocations. Set *RENUM to the transaction's base revision.
+
+ If there is no such transaction, SVN_ERR_FS_NO_SUCH_TRANSACTION is
+ the error returned.
+
+ Returns SVN_ERR_FS_TRANSACTION_NOT_MUTABLE if TXN_NAME refers to a
+ transaction that has already been committed. */
+svn_error_t *
+svn_fs_x__get_base_rev(svn_revnum_t *revnum,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *scratch_pool);
+
+/* Find the value of the property named PROPNAME in transaction TXN.
+ Return the contents in *VALUE_P. The contents will be allocated
+ from POOL. */
+svn_error_t *
+svn_fs_x__txn_prop(svn_string_t **value_p,
+ svn_fs_txn_t *txn,
+ const char *propname,
+ apr_pool_t *pool);
+
+/* Begin a new transaction in filesystem FS, based on existing
+ revision REV. The new transaction is returned in *TXN_P, allocated
+ in RESULT_POOL. Allocate temporaries from SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__begin_txn(svn_fs_txn_t **txn_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_uint32_t flags,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/tree.c b/subversion/libsvn_fs_x/tree.c
new file mode 100644
index 0000000..ce24765
--- /dev/null
+++ b/subversion/libsvn_fs_x/tree.c
@@ -0,0 +1,4542 @@
+/* tree.c : tree-like filesystem, built on DAG filesystem
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+/* The job of this layer is to take a filesystem with lots of node
+ sharing going on --- the real DAG filesystem as it appears in the
+ database --- and make it look and act like an ordinary tree
+ filesystem, with no sharing.
+
+ We do just-in-time cloning: you can walk from some unfinished
+ transaction's root down into directories and files shared with
+ committed revisions; as soon as you try to change something, the
+ appropriate nodes get cloned (and parent directory entries updated)
+ invisibly, behind your back. Any other references you have to
+ nodes that have been cloned by other changes, even made by other
+ processes, are automatically updated to point to the right clones. */
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <apr_pools.h>
+#include <apr_hash.h>
+
+#include "svn_hash.h"
+#include "svn_private_config.h"
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_path.h"
+#include "svn_mergeinfo.h"
+#include "svn_fs.h"
+#include "svn_props.h"
+#include "svn_sorts.h"
+
+#include "fs.h"
+#include "dag.h"
+#include "lock.h"
+#include "tree.h"
+#include "fs_x.h"
+#include "fs_id.h"
+#include "temp_serializer.h"
+#include "cached_data.h"
+#include "transaction.h"
+#include "pack.h"
+#include "util.h"
+
+#include "private/svn_mergeinfo_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_fs_util.h"
+#include "private/svn_fspath.h"
+#include "../libsvn_fs/fs-loader.h"
+
+
+
+/* The root structures.
+
+ Why do they contain different data? Well, transactions are mutable
+ enough that it isn't safe to cache the DAG node for the root
+ directory or the hash of copyfrom data: somebody else might modify
+ them concurrently on disk! (Why is the DAG node cache safer than
+ the root DAG node? When cloning transaction DAG nodes in and out
+ of the cache, all of the possibly-mutable data from the
+ svn_fs_x__noderev_t inside the dag_node_t is dropped.) Additionally,
+ revisions are immutable enough that their DAG node cache can be
+ kept in the FS object and shared among multiple revision root
+ objects.
+*/
+typedef dag_node_t fs_rev_root_data_t;
+
+typedef struct fs_txn_root_data_t
+{
+ /* TXN_ID value from the main struct but as a struct instead of a string */
+ svn_fs_x__txn_id_t txn_id;
+
+ /* Cache of txn DAG nodes (without their nested noderevs, because
+ * it's mutable). Same keys/values as ffd->rev_node_cache. */
+ svn_cache__t *txn_node_cache;
+} fs_txn_root_data_t;
+
+/* Declared here to resolve the circular dependencies. */
+static svn_error_t *
+get_dag(dag_node_t **dag_node_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool);
+
+static svn_fs_root_t *
+make_revision_root(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+static svn_error_t *
+make_txn_root(svn_fs_root_t **root_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_revnum_t base_rev,
+ apr_uint32_t flags,
+ apr_pool_t *result_pool);
+
+static svn_error_t *
+x_closest_copy(svn_fs_root_t **root_p,
+ const char **path_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool);
+
+
+/*** Node Caching ***/
+
+/* 1st level cache */
+
+/* An entry in the first-level cache. REVISION and PATH form the key that
+ will ultimately be matched.
+ */
+typedef struct cache_entry_t
+{
+ /* hash value derived from PATH, REVISION.
+ Used to short-circuit failed lookups. */
+ apr_uint32_t hash_value;
+
+ /* revision to which the NODE belongs */
+ svn_revnum_t revision;
+
+ /* path of the NODE */
+ char *path;
+
+ /* cached value of strlen(PATH). */
+ apr_size_t path_len;
+
+ /* the node allocated in the cache's pool. NULL for empty entries. */
+ dag_node_t *node;
+} cache_entry_t;
+
+/* Number of entries in the cache. Keep this low to keep pressure on the
+ CPU caches low as well. A binary value is most efficient. If we walk
+ a directory tree, we want enough entries to store nodes for all files
+ without overwriting the nodes for the parent folder. That way, there
+ will be no unnecessary misses (except for a few random ones caused by
+ hash collision).
+
+ The actual number of instances may be higher but entries that got
+ overwritten are no longer visible.
+ */
+enum { BUCKET_COUNT = 256 };
+
+/* The actual cache structure. All nodes will be allocated in POOL.
+ When the number of INSERTIONS (i.e. objects created form that pool)
+ exceeds a certain threshold, the pool will be cleared and the cache
+ with it.
+ */
+struct svn_fs_x__dag_cache_t
+{
+ /* fixed number of (possibly empty) cache entries */
+ cache_entry_t buckets[BUCKET_COUNT];
+
+ /* pool used for all node allocation */
+ apr_pool_t *pool;
+
+ /* number of entries created from POOL since the last cleanup */
+ apr_size_t insertions;
+
+ /* Property lookups etc. have a very high locality (75% re-hit).
+ Thus, remember the last hit location for optimistic lookup. */
+ apr_size_t last_hit;
+
+ /* Position of the last bucket hit that actually had a DAG node in it.
+ LAST_HIT may refer to a bucket that matches path@rev but has not
+ its NODE element set, yet.
+ This value is a mere hint for optimistic lookup and any value is
+ valid (as long as it is < BUCKET_COUNT). */
+ apr_size_t last_non_empty;
+};
+
+svn_fs_x__dag_cache_t*
+svn_fs_x__create_dag_cache(apr_pool_t *result_pool)
+{
+ svn_fs_x__dag_cache_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ result->pool = svn_pool_create(result_pool);
+
+ return result;
+}
+
+/* Clears the CACHE at regular intervals (destroying all cached nodes)
+ */
+static void
+auto_clear_dag_cache(svn_fs_x__dag_cache_t* cache)
+{
+ if (cache->insertions > BUCKET_COUNT)
+ {
+ svn_pool_clear(cache->pool);
+
+ memset(cache->buckets, 0, sizeof(cache->buckets));
+ cache->insertions = 0;
+ }
+}
+
+/* For the given REVISION and PATH, return the respective entry in CACHE.
+ If the entry is empty, its NODE member will be NULL and the caller
+ may then set it to the corresponding DAG node allocated in CACHE->POOL.
+ */
+static cache_entry_t *
+cache_lookup( svn_fs_x__dag_cache_t *cache
+ , svn_revnum_t revision
+ , const char *path)
+{
+ apr_size_t i, bucket_index;
+ apr_size_t path_len = strlen(path);
+ apr_uint32_t hash_value = (apr_uint32_t)revision;
+
+#if SVN_UNALIGNED_ACCESS_IS_OK
+ /* "randomizing" / distributing factor used in our hash function */
+ const apr_uint32_t factor = 0xd1f3da69;
+#endif
+
+ /* optimistic lookup: hit the same bucket again? */
+ cache_entry_t *result = &cache->buckets[cache->last_hit];
+ if ( (result->revision == revision)
+ && (result->path_len == path_len)
+ && !memcmp(result->path, path, path_len))
+ {
+ /* Remember the position of the last node we found in this cache. */
+ if (result->node)
+ cache->last_non_empty = cache->last_hit;
+
+ return result;
+ }
+
+ /* need to do a full lookup. Calculate the hash value
+ (HASH_VALUE has been initialized to REVISION). */
+ i = 0;
+#if SVN_UNALIGNED_ACCESS_IS_OK
+ /* We relax the dependency chain between iterations by processing
+ two chunks from the input per hash_value self-multiplication.
+ The HASH_VALUE update latency is now 1 MUL latency + 1 ADD latency
+ per 2 chunks instead of 1 chunk.
+ */
+ for (; i + 8 <= path_len; i += 8)
+ hash_value = hash_value * factor * factor
+ + ( *(const apr_uint32_t*)(path + i) * factor
+ + *(const apr_uint32_t*)(path + i + 4));
+#endif
+
+ for (; i < path_len; ++i)
+ /* Help GCC to minimize the HASH_VALUE update latency by splitting the
+ MUL 33 of the naive implementation: h = h * 33 + path[i]. This
+ shortens the dependency chain from 1 shift + 2 ADDs to 1 shift + 1 ADD.
+ */
+ hash_value = hash_value * 32 + (hash_value + (unsigned char)path[i]);
+
+ bucket_index = hash_value + (hash_value >> 16);
+ bucket_index = (bucket_index + (bucket_index >> 8)) % BUCKET_COUNT;
+
+ /* access the corresponding bucket and remember its location */
+ result = &cache->buckets[bucket_index];
+ cache->last_hit = bucket_index;
+
+ /* if it is *NOT* a match, clear the bucket, expect the caller to fill
+ in the node and count it as an insertion */
+ if ( (result->hash_value != hash_value)
+ || (result->revision != revision)
+ || (result->path_len != path_len)
+ || memcmp(result->path, path, path_len))
+ {
+ result->hash_value = hash_value;
+ result->revision = revision;
+ if (result->path_len < path_len)
+ result->path = apr_palloc(cache->pool, path_len + 1);
+ result->path_len = path_len;
+ memcpy(result->path, path, path_len + 1);
+
+ result->node = NULL;
+
+ cache->insertions++;
+ }
+ else if (result->node)
+ {
+ /* This bucket is valid & has a suitable DAG node in it.
+ Remember its location. */
+ cache->last_non_empty = bucket_index;
+ }
+
+ return result;
+}
+
+/* Optimistic lookup using the last seen non-empty location in CACHE.
+ Return the node of that entry, if it is still in use and matches PATH.
+ Return NULL otherwise. Since the caller usually already knows the path
+ length, provide it in PATH_LEN. */
+static dag_node_t *
+cache_lookup_last_path(svn_fs_x__dag_cache_t *cache,
+ const char *path,
+ apr_size_t path_len)
+{
+ cache_entry_t *result = &cache->buckets[cache->last_non_empty];
+ assert(strlen(path) == path_len);
+
+ if ( result->node
+ && (result->path_len == path_len)
+ && !memcmp(result->path, path, path_len))
+ {
+ return result->node;
+ }
+
+ return NULL;
+}
+
+/* 2nd level cache */
+
+/* Find and return the DAG node cache for ROOT and the key that
+ should be used for PATH.
+
+ RESULT_POOL will only be used for allocating a new keys if necessary. */
+static void
+locate_cache(svn_cache__t **cache,
+ const char **key,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *result_pool)
+{
+ if (root->is_txn_root)
+ {
+ fs_txn_root_data_t *frd = root->fsap_data;
+
+ if (cache)
+ *cache = frd->txn_node_cache;
+ if (key && path)
+ *key = path;
+ }
+ else
+ {
+ svn_fs_x__data_t *ffd = root->fs->fsap_data;
+
+ if (cache)
+ *cache = ffd->rev_node_cache;
+ if (key && path)
+ *key = svn_fs_x__combine_number_and_string(root->rev, path,
+ result_pool);
+ }
+}
+
+/* Return NODE for PATH from ROOT's node cache, or NULL if the node
+ isn't cached; read it from the FS. *NODE remains valid until either
+ POOL or the FS gets cleared or destroyed (whichever comes first).
+ */
+static svn_error_t *
+dag_node_cache_get(dag_node_t **node_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ svn_boolean_t found;
+ dag_node_t *node = NULL;
+ svn_cache__t *cache;
+ const char *key;
+
+ SVN_ERR_ASSERT(*path == '/');
+
+ if (!root->is_txn_root)
+ {
+ /* immutable DAG node. use the global caches for it */
+
+ svn_fs_x__data_t *ffd = root->fs->fsap_data;
+ cache_entry_t *bucket;
+
+ auto_clear_dag_cache(ffd->dag_node_cache);
+ bucket = cache_lookup(ffd->dag_node_cache, root->rev, path);
+ if (bucket->node == NULL)
+ {
+ locate_cache(&cache, &key, root, path, pool);
+ SVN_ERR(svn_cache__get((void **)&node, &found, cache, key,
+ ffd->dag_node_cache->pool));
+ if (found && node)
+ {
+ /* Patch up the FS, since this might have come from an old FS
+ * object. */
+ svn_fs_x__dag_set_fs(node, root->fs);
+ bucket->node = node;
+ }
+ }
+ else
+ {
+ node = bucket->node;
+ }
+ }
+ else
+ {
+ /* DAG is mutable / may become invalid. Use the TXN-local cache */
+
+ locate_cache(&cache, &key, root, path, pool);
+
+ SVN_ERR(svn_cache__get((void **) &node, &found, cache, key, pool));
+ if (found && node)
+ {
+ /* Patch up the FS, since this might have come from an old FS
+ * object. */
+ svn_fs_x__dag_set_fs(node, root->fs);
+ }
+ }
+
+ *node_p = node;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Add the NODE for PATH to ROOT's node cache. */
+static svn_error_t *
+dag_node_cache_set(svn_fs_root_t *root,
+ const char *path,
+ dag_node_t *node,
+ apr_pool_t *scratch_pool)
+{
+ svn_cache__t *cache;
+ const char *key;
+
+ SVN_ERR_ASSERT(*path == '/');
+
+ /* Do *not* attempt to dup and put the node into L1.
+ * dup() is twice as expensive as an L2 lookup (which will set also L1).
+ */
+ locate_cache(&cache, &key, root, path, scratch_pool);
+
+ return svn_cache__set(cache, key, node, scratch_pool);
+}
+
+
+/* Baton for find_descendants_in_cache. */
+typedef struct fdic_baton_t
+{
+ const char *path;
+ apr_array_header_t *list;
+ apr_pool_t *pool;
+} fdic_baton_t;
+
+/* If the given item is a descendant of BATON->PATH, push
+ * it onto BATON->LIST (copying into BATON->POOL). Implements
+ * the svn_iter_apr_hash_cb_t prototype. */
+static svn_error_t *
+find_descendants_in_cache(void *baton,
+ const void *key,
+ apr_ssize_t klen,
+ void *val,
+ apr_pool_t *pool)
+{
+ fdic_baton_t *b = baton;
+ const char *item_path = key;
+
+ if (svn_fspath__skip_ancestor(b->path, item_path))
+ APR_ARRAY_PUSH(b->list, const char *) = apr_pstrdup(b->pool, item_path);
+
+ return SVN_NO_ERROR;
+}
+
+/* Invalidate cache entries for PATH and any of its children. This
+ should *only* be called on a transaction root! */
+static svn_error_t *
+dag_node_cache_invalidate(svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ fdic_baton_t b;
+ svn_cache__t *cache;
+ apr_pool_t *iterpool;
+ int i;
+
+ b.path = path;
+ b.pool = svn_pool_create(scratch_pool);
+ b.list = apr_array_make(b.pool, 1, sizeof(const char *));
+
+ SVN_ERR_ASSERT(root->is_txn_root);
+ locate_cache(&cache, NULL, root, NULL, b.pool);
+
+
+ SVN_ERR(svn_cache__iter(NULL, cache, find_descendants_in_cache,
+ &b, b.pool));
+
+ iterpool = svn_pool_create(b.pool);
+
+ for (i = 0; i < b.list->nelts; i++)
+ {
+ const char *descendant = APR_ARRAY_IDX(b.list, i, const char *);
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_cache__set(cache, descendant, NULL, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(b.pool);
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Creating transaction and revision root nodes. */
+
+svn_error_t *
+svn_fs_x__txn_root(svn_fs_root_t **root_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ apr_uint32_t flags = 0;
+ apr_hash_t *txnprops;
+
+ /* Look for the temporary txn props representing 'flags'. */
+ SVN_ERR(svn_fs_x__txn_proplist(&txnprops, txn, pool));
+ if (txnprops)
+ {
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
+ flags |= SVN_FS_TXN_CHECK_OOD;
+
+ if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
+ flags |= SVN_FS_TXN_CHECK_LOCKS;
+ }
+
+ return make_txn_root(root_p, txn->fs, svn_fs_x__txn_get_id(txn),
+ txn->base_rev, flags, pool);
+}
+
+
+svn_error_t *
+svn_fs_x__revision_root(svn_fs_root_t **root_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, pool));
+
+ *root_p = make_revision_root(fs, rev, pool);
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Getting dag nodes for roots. */
+
+/* Return the transaction ID to a given transaction ROOT. */
+static svn_fs_x__txn_id_t
+root_txn_id(svn_fs_root_t *root)
+{
+ fs_txn_root_data_t *frd = root->fsap_data;
+ assert(root->is_txn_root);
+
+ return frd->txn_id;
+}
+
+/* Set *NODE_P to a freshly opened dag node referring to the root
+ directory of ROOT, allocating from RESULT_POOL. Use SCRATCH_POOL
+ for temporary allocations. */
+static svn_error_t *
+root_node(dag_node_t **node_p,
+ svn_fs_root_t *root,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (root->is_txn_root)
+ {
+ /* It's a transaction root. Open a fresh copy. */
+ return svn_fs_x__dag_txn_root(node_p, root->fs, root_txn_id(root),
+ result_pool, scratch_pool);
+ }
+ else
+ {
+ /* It's a revision root, so we already have its root directory
+ opened. */
+ return svn_fs_x__dag_revision_root(node_p, root->fs, root->rev,
+ result_pool, scratch_pool);
+ }
+}
+
+
+/* Set *NODE_P to a mutable root directory for ROOT, cloning if
+ necessary, allocating in RESULT_POOL. ROOT must be a transaction root.
+ Use ERROR_PATH in error messages. Use SCRATCH_POOL for temporaries.*/
+static svn_error_t *
+mutable_root_node(dag_node_t **node_p,
+ svn_fs_root_t *root,
+ const char *error_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (root->is_txn_root)
+ {
+ /* It's a transaction root. Open a fresh copy. */
+ return svn_fs_x__dag_txn_root(node_p, root->fs, root_txn_id(root),
+ result_pool, scratch_pool);
+ }
+ else
+ /* If it's not a transaction root, we can't change its contents. */
+ return SVN_FS__ERR_NOT_MUTABLE(root->fs, root->rev, error_path);
+}
+
+
+
+/* Traversing directory paths. */
+
+typedef enum copy_id_inherit_t
+{
+ copy_id_inherit_unknown = 0,
+ copy_id_inherit_self,
+ copy_id_inherit_parent,
+ copy_id_inherit_new
+
+} copy_id_inherit_t;
+
+/* A linked list representing the path from a node up to a root
+ directory. We use this for cloning, and for operations that need
+ to deal with both a node and its parent directory. For example, a
+ `delete' operation needs to know that the node actually exists, but
+ also needs to change the parent directory. */
+typedef struct parent_path_t
+{
+
+ /* A node along the path. This could be the final node, one of its
+ parents, or the root. Every parent path ends with an element for
+ the root directory. */
+ dag_node_t *node;
+
+ /* The name NODE has in its parent directory. This is zero for the
+ root directory, which (obviously) has no name in its parent. */
+ char *entry;
+
+ /* The parent of NODE, or zero if NODE is the root directory. */
+ struct parent_path_t *parent;
+
+ /* The copy ID inheritance style. */
+ copy_id_inherit_t copy_inherit;
+
+ /* If copy ID inheritance style is copy_id_inherit_new, this is the
+ path which should be implicitly copied; otherwise, this is NULL. */
+ const char *copy_src_path;
+
+} parent_path_t;
+
+/* Return a text string describing the absolute path of parent_path
+ PARENT_PATH. It will be allocated in POOL. */
+static const char *
+parent_path_path(parent_path_t *parent_path,
+ apr_pool_t *pool)
+{
+ const char *path_so_far = "/";
+ if (parent_path->parent)
+ path_so_far = parent_path_path(parent_path->parent, pool);
+ return parent_path->entry
+ ? svn_fspath__join(path_so_far, parent_path->entry, pool)
+ : path_so_far;
+}
+
+
+/* Return the FS path for the parent path chain object CHILD relative
+ to its ANCESTOR in the same chain, allocated in POOL. */
+static const char *
+parent_path_relpath(parent_path_t *child,
+ parent_path_t *ancestor,
+ apr_pool_t *pool)
+{
+ const char *path_so_far = "";
+ parent_path_t *this_node = child;
+ while (this_node != ancestor)
+ {
+ assert(this_node != NULL);
+ path_so_far = svn_relpath_join(this_node->entry, path_so_far, pool);
+ this_node = this_node->parent;
+ }
+ return path_so_far;
+}
+
+
+
+/* Choose a copy ID inheritance method *INHERIT_P to be used in the
+ event that immutable node CHILD in FS needs to be made mutable. If
+ the inheritance method is copy_id_inherit_new, also return a
+ *COPY_SRC_PATH on which to base the new copy ID (else return NULL
+ for that path). CHILD must have a parent (it cannot be the root
+ node). Allocations are taken from POOL. */
+static svn_error_t *
+get_copy_inheritance(copy_id_inherit_t *inherit_p,
+ const char **copy_src_path,
+ svn_fs_t *fs,
+ parent_path_t *child,
+ apr_pool_t *pool)
+{
+ svn_fs_x__id_t child_copy_id, parent_copy_id;
+ svn_boolean_t related;
+ const char *id_path = NULL;
+ svn_fs_root_t *copyroot_root;
+ dag_node_t *copyroot_node;
+ svn_revnum_t copyroot_rev;
+ const char *copyroot_path;
+
+ SVN_ERR_ASSERT(child && child->parent);
+
+ /* Initialize some convenience variables. */
+ SVN_ERR(svn_fs_x__dag_get_copy_id(&child_copy_id, child->node));
+ SVN_ERR(svn_fs_x__dag_get_copy_id(&parent_copy_id, child->parent->node));
+
+ /* If this child is already mutable, we have nothing to do. */
+ if (svn_fs_x__dag_check_mutable(child->node))
+ {
+ *inherit_p = copy_id_inherit_self;
+ *copy_src_path = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ /* From this point on, we'll assume that the child will just take
+ its copy ID from its parent. */
+ *inherit_p = copy_id_inherit_parent;
+ *copy_src_path = NULL;
+
+ /* Special case: if the child's copy ID is '0', use the parent's
+ copy ID. */
+ if (svn_fs_x__id_is_root(&child_copy_id))
+ return SVN_NO_ERROR;
+
+ /* Compare the copy IDs of the child and its parent. If they are
+ the same, then the child is already on the same branch as the
+ parent, and should use the same mutability copy ID that the
+ parent will use. */
+ if (svn_fs_x__id_eq(&child_copy_id, &parent_copy_id))
+ return SVN_NO_ERROR;
+
+ /* If the child is on the same branch that the parent is on, the
+ child should just use the same copy ID that the parent would use.
+ Else, the child needs to generate a new copy ID to use should it
+ need to be made mutable. We will claim that child is on the same
+ branch as its parent if the child itself is not a branch point,
+ or if it is a branch point that we are accessing via its original
+ copy destination path. */
+ SVN_ERR(svn_fs_x__dag_get_copyroot(&copyroot_rev, &copyroot_path,
+ child->node));
+ SVN_ERR(svn_fs_x__revision_root(&copyroot_root, fs, copyroot_rev, pool));
+ SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
+
+ SVN_ERR(svn_fs_x__dag_related_node(&related, copyroot_node, child->node));
+ if (!related)
+ return SVN_NO_ERROR;
+
+ /* Determine if we are looking at the child via its original path or
+ as a subtree item of a copied tree. */
+ id_path = svn_fs_x__dag_get_created_path(child->node);
+ if (strcmp(id_path, parent_path_path(child, pool)) == 0)
+ {
+ *inherit_p = copy_id_inherit_self;
+ return SVN_NO_ERROR;
+ }
+
+ /* We are pretty sure that the child node is an unedited nested
+ branched node. When it needs to be made mutable, it should claim
+ a new copy ID. */
+ *inherit_p = copy_id_inherit_new;
+ *copy_src_path = id_path;
+ return SVN_NO_ERROR;
+}
+
+/* Allocate a new parent_path_t node from RESULT_POOL, referring to NODE,
+ ENTRY, PARENT, and COPY_ID. */
+static parent_path_t *
+make_parent_path(dag_node_t *node,
+ char *entry,
+ parent_path_t *parent,
+ apr_pool_t *result_pool)
+{
+ parent_path_t *parent_path = apr_pcalloc(result_pool, sizeof(*parent_path));
+ if (node)
+ parent_path->node = svn_fs_x__dag_copy_into_pool(node, result_pool);
+ parent_path->entry = entry;
+ parent_path->parent = parent;
+ parent_path->copy_inherit = copy_id_inherit_unknown;
+ parent_path->copy_src_path = NULL;
+ return parent_path;
+}
+
+
+/* Flags for open_path. */
+typedef enum open_path_flags_t {
+
+ /* The last component of the PATH need not exist. (All parent
+ directories must exist, as usual.) If the last component doesn't
+ exist, simply leave the `node' member of the bottom parent_path
+ component zero. */
+ open_path_last_optional = 1,
+
+ /* When this flag is set, don't bother to lookup the DAG node in
+ our caches because we already tried this. Ignoring this flag
+ has no functional impact. */
+ open_path_uncached = 2,
+
+ /* The caller does not care about the parent node chain but only
+ the final DAG node. */
+ open_path_node_only = 4,
+
+ /* The caller wants a NULL path object instead of an error if the
+ path cannot be found. */
+ open_path_allow_null = 8
+} open_path_flags_t;
+
+/* Try a short-cut for the open_path() function using the last node accessed.
+ * If that ROOT is that nodes's "created rev" and PATH of PATH_LEN chars is
+ * its "created path", return the node in *NODE_P. Set it to NULL otherwise.
+ *
+ * This function is used to support ra_serf-style access patterns where we
+ * are first asked for path@rev and then for path@c_rev of the same node.
+ * The shortcut works by ignoring the "rev" part of the cache key and then
+ * checking whether we got lucky. Lookup and verification are both quick
+ * plus there are many early outs for common types of mismatch.
+ */
+static svn_error_t *
+try_match_last_node(dag_node_t **node_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_size_t path_len,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = root->fs->fsap_data;
+
+ /* Optimistic lookup: if the last node returned from the cache applied to
+ the same PATH, return it in NODE. */
+ dag_node_t *node
+ = cache_lookup_last_path(ffd->dag_node_cache, path, path_len);
+
+ /* Did we get a bucket with a committed node? */
+ if (node && !svn_fs_x__dag_check_mutable(node))
+ {
+ /* Get the path&rev pair at which this node was created.
+ This is repository location for which this node is _known_ to be
+ the right lookup result irrespective of how we found it. */
+ const char *created_path
+ = svn_fs_x__dag_get_created_path(node);
+ svn_revnum_t revision = svn_fs_x__dag_get_revision(node);
+
+ /* Is it an exact match? */
+ if (revision == root->rev && strcmp(created_path, path) == 0)
+ {
+ /* Cache it under its full path@rev access path. */
+ SVN_ERR(dag_node_cache_set(root, path, node, scratch_pool));
+
+ *node_p = node;
+ return SVN_NO_ERROR;
+ }
+ }
+
+ *node_p = NULL;
+ return SVN_NO_ERROR;
+}
+
+
+/* Open the node identified by PATH in ROOT, allocating in POOL. Set
+ *PARENT_PATH_P to a path from the node up to ROOT. The resulting
+ **PARENT_PATH_P value is guaranteed to contain at least one
+ *element, for the root directory. PATH must be in canonical form.
+
+ If resulting *PARENT_PATH_P will eventually be made mutable and
+ modified, or if copy ID inheritance information is otherwise needed,
+ IS_TXN_PATH must be set. If IS_TXN_PATH is FALSE, no copy ID
+ inheritance information will be calculated for the *PARENT_PATH_P chain.
+
+ If FLAGS & open_path_last_optional is zero, return the error
+ SVN_ERR_FS_NOT_FOUND if the node PATH refers to does not exist. If
+ non-zero, require all the parent directories to exist as normal,
+ but if the final path component doesn't exist, simply return a path
+ whose bottom `node' member is zero. This option is useful for
+ callers that create new nodes --- we find the parent directory for
+ them, and tell them whether the entry exists already.
+
+ The remaining bits in FLAGS are hints that allow this function
+ to take shortcuts based on knowledge that the caller provides,
+ such as the caller is not actually being interested in PARENT_PATH_P,
+ but only in (*PARENT_PATH_P)->NODE.
+
+ NOTE: Public interfaces which only *read* from the filesystem
+ should not call this function directly, but should instead use
+ get_dag().
+*/
+static svn_error_t *
+open_path(parent_path_t **parent_path_p,
+ svn_fs_root_t *root,
+ const char *path,
+ int flags,
+ svn_boolean_t is_txn_path,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs = root->fs;
+ dag_node_t *here = NULL; /* The directory we're currently looking at. */
+ parent_path_t *parent_path; /* The path from HERE up to the root. */
+ const char *rest = NULL; /* The portion of PATH we haven't traversed yet. */
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* path to the currently processed entry without trailing '/'.
+ We will reuse this across iterations by simply putting a NUL terminator
+ at the respective position and replacing that with a '/' in the next
+ iteration. This is correct as we assert() PATH to be canonical. */
+ svn_stringbuf_t *path_so_far = svn_stringbuf_create(path, pool);
+ apr_size_t path_len = path_so_far->len;
+
+ /* Callers often traverse the DAG in some path-based order or along the
+ history segments. That allows us to try a few guesses about where to
+ find the next item. This is only useful if the caller didn't request
+ the full parent chain. */
+ assert(svn_fs__is_canonical_abspath(path));
+ path_so_far->len = 0; /* "" */
+ if (flags & open_path_node_only)
+ {
+ const char *directory;
+
+ /* First attempt: Assume that we access the DAG for the same path as
+ in the last lookup but for a different revision that happens to be
+ the last revision that touched the respective node. This is a
+ common pattern when e.g. checking out over ra_serf. Note that this
+ will only work for committed data as the revision info for nodes in
+ txns is bogus.
+
+ This shortcut is quick and will exit this function upon success.
+ So, try it first. */
+ if (!root->is_txn_root)
+ {
+ dag_node_t *node;
+ SVN_ERR(try_match_last_node(&node, root, path, path_len, iterpool));
+
+ /* Did the shortcut work? */
+ if (node)
+ {
+ /* Construct and return the result. */
+ svn_pool_destroy(iterpool);
+
+ parent_path = make_parent_path(node, 0, 0, pool);
+ parent_path->copy_inherit = copy_id_inherit_self;
+ *parent_path_p = parent_path;
+
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Second attempt: Try starting the lookup immediately at the parent
+ node. We will often have recently accessed either a sibling or
+ said parent DIRECTORY itself for the same revision. */
+ directory = svn_dirent_dirname(path, pool);
+ if (directory[1] != 0) /* root nodes are covered anyway */
+ {
+ SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
+
+ /* Did the shortcut work? */
+ if (here)
+ {
+ apr_size_t dirname_len = strlen(directory);
+ path_so_far->len = dirname_len;
+ rest = path + dirname_len + 1;
+ }
+ }
+ }
+
+ /* did the shortcut work? */
+ if (!here)
+ {
+ /* Make a parent_path item for the root node, using its own current
+ copy id. */
+ SVN_ERR(root_node(&here, root, pool, iterpool));
+ rest = path + 1; /* skip the leading '/', it saves in iteration */
+ }
+
+ path_so_far->data[path_so_far->len] = '\0';
+ parent_path = make_parent_path(here, 0, 0, pool);
+ parent_path->copy_inherit = copy_id_inherit_self;
+
+ /* Whenever we are at the top of this loop:
+ - HERE is our current directory,
+ - ID is the node revision ID of HERE,
+ - REST is the path we're going to find in HERE, and
+ - PARENT_PATH includes HERE and all its parents. */
+ for (;;)
+ {
+ const char *next;
+ char *entry;
+ dag_node_t *child;
+
+ svn_pool_clear(iterpool);
+
+ /* The NODE in PARENT_PATH always lives in POOL, i.e. it will
+ * survive the cleanup of ITERPOOL and the DAG cache.*/
+ here = parent_path->node;
+
+ /* Parse out the next entry from the path. */
+ entry = svn_fs__next_entry_name(&next, rest, pool);
+
+ /* Update the path traversed thus far. */
+ path_so_far->data[path_so_far->len] = '/';
+ path_so_far->len += strlen(entry) + 1;
+ path_so_far->data[path_so_far->len] = '\0';
+
+ /* Given the behavior of svn_fs__next_entry_name(), ENTRY may be an
+ empty string when the path either starts or ends with a slash.
+ In either case, we stay put: the current directory stays the
+ same, and we add nothing to the parent path. We only need to
+ process non-empty path segments. */
+ if (*entry != '\0')
+ {
+ copy_id_inherit_t inherit;
+ const char *copy_path = NULL;
+ dag_node_t *cached_node = NULL;
+
+ /* If we found a directory entry, follow it. First, we
+ check our node cache, and, failing that, we hit the DAG
+ layer. Don't bother to contact the cache for the last
+ element if we already know the lookup to fail for the
+ complete path. */
+ if (next || !(flags & open_path_uncached))
+ SVN_ERR(dag_node_cache_get(&cached_node, root, path_so_far->data,
+ pool));
+ if (cached_node)
+ child = cached_node;
+ else
+ SVN_ERR(svn_fs_x__dag_open(&child, here, entry, pool, iterpool));
+
+ /* "file not found" requires special handling. */
+ if (child == NULL)
+ {
+ /* If this was the last path component, and the caller
+ said it was optional, then don't return an error;
+ just put a NULL node pointer in the path. */
+
+ if ((flags & open_path_last_optional)
+ && (! next || *next == '\0'))
+ {
+ parent_path = make_parent_path(NULL, entry, parent_path,
+ pool);
+ break;
+ }
+ else if (flags & open_path_allow_null)
+ {
+ parent_path = NULL;
+ break;
+ }
+ else
+ {
+ /* Build a better error message than svn_fs_x__dag_open
+ can provide, giving the root and full path name. */
+ return SVN_FS__NOT_FOUND(root, path);
+ }
+ }
+
+ if (flags & open_path_node_only)
+ {
+ /* Shortcut: the caller only wants the final DAG node. */
+ parent_path->node = svn_fs_x__dag_copy_into_pool(child, pool);
+ }
+ else
+ {
+ /* Now, make a parent_path item for CHILD. */
+ parent_path = make_parent_path(child, entry, parent_path, pool);
+ if (is_txn_path)
+ {
+ SVN_ERR(get_copy_inheritance(&inherit, &copy_path, fs,
+ parent_path, iterpool));
+ parent_path->copy_inherit = inherit;
+ parent_path->copy_src_path = apr_pstrdup(pool, copy_path);
+ }
+ }
+
+ /* Cache the node we found (if it wasn't already cached). */
+ if (! cached_node)
+ SVN_ERR(dag_node_cache_set(root, path_so_far->data, child,
+ iterpool));
+ }
+
+ /* Are we finished traversing the path? */
+ if (! next)
+ break;
+
+ /* The path isn't finished yet; we'd better be in a directory. */
+ if (svn_fs_x__dag_node_kind(child) != svn_node_dir)
+ SVN_ERR_W(SVN_FS__ERR_NOT_DIRECTORY(fs, path_so_far->data),
+ apr_psprintf(iterpool, _("Failure opening '%s'"), path));
+
+ rest = next;
+ }
+
+ svn_pool_destroy(iterpool);
+ *parent_path_p = parent_path;
+ return SVN_NO_ERROR;
+}
+
+
+/* Make the node referred to by PARENT_PATH mutable, if it isn't already,
+ allocating from RESULT_POOL. ROOT must be the root from which
+ PARENT_PATH descends. Clone any parent directories as needed.
+ Adjust the dag nodes in PARENT_PATH to refer to the clones. Use
+ ERROR_PATH in error messages. Use SCRATCH_POOL for temporaries. */
+static svn_error_t *
+make_path_mutable(svn_fs_root_t *root,
+ parent_path_t *parent_path,
+ const char *error_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *clone;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(root);
+
+ /* Is the node mutable already? */
+ if (svn_fs_x__dag_check_mutable(parent_path->node))
+ return SVN_NO_ERROR;
+
+ /* Are we trying to clone the root, or somebody's child node? */
+ if (parent_path->parent)
+ {
+ svn_fs_x__id_t copy_id = { SVN_INVALID_REVNUM, 0 };
+ svn_fs_x__id_t *copy_id_ptr = &copy_id;
+ copy_id_inherit_t inherit = parent_path->copy_inherit;
+ const char *clone_path, *copyroot_path;
+ svn_revnum_t copyroot_rev;
+ svn_boolean_t is_parent_copyroot = FALSE;
+ svn_fs_root_t *copyroot_root;
+ dag_node_t *copyroot_node;
+ svn_boolean_t related;
+
+ /* We're trying to clone somebody's child. Make sure our parent
+ is mutable. */
+ SVN_ERR(make_path_mutable(root, parent_path->parent,
+ error_path, result_pool, scratch_pool));
+
+ switch (inherit)
+ {
+ case copy_id_inherit_parent:
+ SVN_ERR(svn_fs_x__dag_get_copy_id(&copy_id,
+ parent_path->parent->node));
+ break;
+
+ case copy_id_inherit_new:
+ SVN_ERR(svn_fs_x__reserve_copy_id(&copy_id, root->fs, txn_id,
+ scratch_pool));
+ break;
+
+ case copy_id_inherit_self:
+ copy_id_ptr = NULL;
+ break;
+
+ case copy_id_inherit_unknown:
+ default:
+ SVN_ERR_MALFUNCTION(); /* uh-oh -- somebody didn't calculate copy-ID
+ inheritance data. */
+ }
+
+ /* Determine what copyroot our new child node should use. */
+ SVN_ERR(svn_fs_x__dag_get_copyroot(&copyroot_rev, &copyroot_path,
+ parent_path->node));
+ SVN_ERR(svn_fs_x__revision_root(&copyroot_root, root->fs,
+ copyroot_rev, scratch_pool));
+ SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path,
+ result_pool));
+
+ SVN_ERR(svn_fs_x__dag_related_node(&related, copyroot_node,
+ parent_path->node));
+ if (!related)
+ is_parent_copyroot = TRUE;
+
+ /* Now make this node mutable. */
+ clone_path = parent_path_path(parent_path->parent, scratch_pool);
+ SVN_ERR(svn_fs_x__dag_clone_child(&clone,
+ parent_path->parent->node,
+ clone_path,
+ parent_path->entry,
+ copy_id_ptr, txn_id,
+ is_parent_copyroot,
+ result_pool,
+ scratch_pool));
+
+ /* Update the path cache. */
+ SVN_ERR(dag_node_cache_set(root,
+ parent_path_path(parent_path, scratch_pool),
+ clone, scratch_pool));
+ }
+ else
+ {
+ /* We're trying to clone the root directory. */
+ SVN_ERR(mutable_root_node(&clone, root, error_path, result_pool,
+ scratch_pool));
+ }
+
+ /* Update the PARENT_PATH link to refer to the clone. */
+ parent_path->node = clone;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Open the node identified by PATH in ROOT. Set DAG_NODE_P to the
+ node we find, allocated in POOL. Return the error
+ SVN_ERR_FS_NOT_FOUND if this node doesn't exist.
+ */
+static svn_error_t *
+get_dag(dag_node_t **dag_node_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ parent_path_t *parent_path;
+ dag_node_t *node = NULL;
+
+ /* First we look for the DAG in our cache
+ (if the path may be canonical). */
+ if (*path == '/')
+ SVN_ERR(dag_node_cache_get(&node, root, path, pool));
+
+ if (! node)
+ {
+ /* Canonicalize the input PATH. As it turns out, >95% of all paths
+ * seen here during e.g. svnadmin verify are non-canonical, i.e.
+ * miss the leading '/'. Unconditional canonicalization has a net
+ * performance benefit over previously checking path for being
+ * canonical. */
+ path = svn_fs__canonicalize_abspath(path, pool);
+ SVN_ERR(dag_node_cache_get(&node, root, path, pool));
+
+ if (! node)
+ {
+ /* Call open_path with no flags, as we want this to return an
+ * error if the node for which we are searching doesn't exist. */
+ SVN_ERR(open_path(&parent_path, root, path,
+ open_path_uncached | open_path_node_only,
+ FALSE, pool));
+ node = parent_path->node;
+
+ /* No need to cache our find -- open_path() will do that for us. */
+ }
+ }
+
+ *dag_node_p = svn_fs_x__dag_copy_into_pool(node, pool);
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Populating the `changes' table. */
+
+/* Add a change to the changes table in FS, keyed on transaction id
+ TXN_ID, and indicated that a change of kind CHANGE_KIND occurred on
+ PATH (whose node revision id is--or was, in the case of a
+ deletion--NODEREV_ID), and optionally that TEXT_MODs, PROP_MODs or
+ MERGEINFO_MODs occurred. If the change resulted from a copy,
+ COPYFROM_REV and COPYFROM_PATH specify under which revision and path
+ the node was copied from. If this was not part of a copy, COPYFROM_REV
+ should be SVN_INVALID_REVNUM. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+add_change(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const char *path,
+ const svn_fs_x__id_t *noderev_id,
+ svn_fs_path_change_kind_t change_kind,
+ svn_boolean_t text_mod,
+ svn_boolean_t prop_mod,
+ svn_boolean_t mergeinfo_mod,
+ svn_node_kind_t node_kind,
+ svn_revnum_t copyfrom_rev,
+ const char *copyfrom_path,
+ apr_pool_t *scratch_pool)
+{
+ return svn_fs_x__add_change(fs, txn_id,
+ svn_fs__canonicalize_abspath(path,
+ scratch_pool),
+ noderev_id, change_kind,
+ text_mod, prop_mod, mergeinfo_mod,
+ node_kind, copyfrom_rev, copyfrom_path,
+ scratch_pool);
+}
+
+
+
+/* Generic node operations. */
+
+/* Get the id of a node referenced by path PATH in ROOT. Return the
+ id in *ID_P allocated in POOL. */
+static svn_error_t *
+x_node_id(const svn_fs_id_t **id_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ svn_fs_x__id_t noderev_id;
+
+ if ((! root->is_txn_root)
+ && (path[0] == '\0' || ((path[0] == '/') && (path[1] == '\0'))))
+ {
+ /* Optimize the case where we don't need any db access at all.
+ The root directory ("" or "/") node is stored in the
+ svn_fs_root_t object, and never changes when it's a revision
+ root, so we can just reach in and grab it directly. */
+ svn_fs_x__init_rev_root(&noderev_id, root->rev);
+ }
+ else
+ {
+ dag_node_t *node;
+
+ SVN_ERR(get_dag(&node, root, path, pool));
+ noderev_id = *svn_fs_x__dag_get_id(node);
+ }
+
+ *id_p = svn_fs_x__id_create(svn_fs_x__id_create_context(root->fs, pool),
+ &noderev_id, pool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_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)
+{
+ dag_node_t *node;
+ svn_fs_x__id_t noderev_id_a, noderev_id_b, node_id_a, node_id_b;
+
+ /* Root paths are a common special case. */
+ svn_boolean_t a_is_root_dir
+ = (path_a[0] == '\0') || ((path_a[0] == '/') && (path_a[1] == '\0'));
+ svn_boolean_t b_is_root_dir
+ = (path_b[0] == '\0') || ((path_b[0] == '/') && (path_b[1] == '\0'));
+
+ /* Path from different repository are always unrelated. */
+ if (root_a->fs != root_b->fs)
+ {
+ *relation = svn_fs_node_unrelated;
+ return SVN_NO_ERROR;
+ }
+
+ /* Are both (!) root paths? Then, they are related and we only test how
+ * direct the relation is. */
+ if (a_is_root_dir && b_is_root_dir)
+ {
+ svn_boolean_t different_txn
+ = root_a->is_txn_root && root_b->is_txn_root
+ && strcmp(root_a->txn, root_b->txn);
+
+ /* For txn roots, root->REV is the base revision of that TXN. */
+ *relation = ( (root_a->rev == root_b->rev)
+ && (root_a->is_txn_root == root_b->is_txn_root)
+ && !different_txn)
+ ? svn_fs_node_unchanged
+ : svn_fs_node_common_ancestor;
+ return SVN_NO_ERROR;
+ }
+
+ /* We checked for all separations between ID spaces (repos, txn).
+ * Now, we can simply test for the ID values themselves. */
+ SVN_ERR(get_dag(&node, root_a, path_a, scratch_pool));
+ noderev_id_a = *svn_fs_x__dag_get_id(node);
+ SVN_ERR(svn_fs_x__dag_get_node_id(&node_id_a, node));
+
+ SVN_ERR(get_dag(&node, root_b, path_b, scratch_pool));
+ noderev_id_b = *svn_fs_x__dag_get_id(node);
+ SVN_ERR(svn_fs_x__dag_get_node_id(&node_id_b, node));
+
+ /* In FSX, even in-txn IDs are globally unique.
+ * So, we can simply compare them. */
+ if (svn_fs_x__id_eq(&noderev_id_a, &noderev_id_b))
+ *relation = svn_fs_node_unchanged;
+ else if (svn_fs_x__id_eq(&node_id_a, &node_id_b))
+ *relation = svn_fs_node_common_ancestor;
+ else
+ *relation = svn_fs_node_unrelated;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__node_created_rev(svn_revnum_t *revision,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node;
+
+ SVN_ERR(get_dag(&node, root, path, scratch_pool));
+ *revision = svn_fs_x__dag_get_revision(node);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *CREATED_PATH to the path at which PATH under ROOT was created.
+ Return a string allocated in POOL. */
+static svn_error_t *
+x_node_created_path(const char **created_path,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+
+ SVN_ERR(get_dag(&node, root, path, pool));
+ *created_path = svn_fs_x__dag_get_created_path(node);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *KIND_P to the type of node located at PATH under ROOT.
+ Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+node_kind(svn_node_kind_t *kind_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node;
+
+ /* Get the node id. */
+ SVN_ERR(get_dag(&node, root, path, scratch_pool));
+
+ /* Use the node id to get the real kind. */
+ *kind_p = svn_fs_x__dag_node_kind(node);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *KIND_P to the type of node present at PATH under ROOT. If
+ PATH does not exist under ROOT, set *KIND_P to svn_node_none. Use
+ SCRATCH_POOL for temporary allocation. */
+svn_error_t *
+svn_fs_x__check_path(svn_node_kind_t *kind_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err = node_kind(kind_p, root, path, scratch_pool);
+ if (err &&
+ ((err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ || (err->apr_err == SVN_ERR_FS_NOT_DIRECTORY)))
+ {
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ *kind_p = svn_node_none;
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Set *VALUE_P to the value of the property named PROPNAME of PATH in
+ ROOT. If the node has no property by that name, set *VALUE_P to
+ zero. Allocate the result in POOL. */
+static svn_error_t *
+x_node_prop(svn_string_t **value_p,
+ svn_fs_root_t *root,
+ const char *path,
+ const char *propname,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+ apr_hash_t *proplist;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ SVN_ERR(get_dag(&node, root, path, pool));
+ SVN_ERR(svn_fs_x__dag_get_proplist(&proplist, node, pool, scratch_pool));
+ *value_p = NULL;
+ if (proplist)
+ *value_p = svn_hash_gets(proplist, propname);
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *TABLE_P to the entire property list of PATH under ROOT, as an
+ APR hash table allocated in POOL. The resulting property table
+ maps property names to pointers to svn_string_t objects containing
+ the property value. */
+static svn_error_t *
+x_node_proplist(apr_hash_t **table_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ SVN_ERR(get_dag(&node, root, path, pool));
+ SVN_ERR(svn_fs_x__dag_get_proplist(table_p, node, pool, scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_node_has_props(svn_boolean_t *has_props,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *props;
+
+ SVN_ERR(x_node_proplist(&props, root, path, scratch_pool));
+
+ *has_props = (0 < apr_hash_count(props));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+increment_mergeinfo_up_tree(parent_path_t *pp,
+ apr_int64_t increment,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ for (; pp; pp = pp->parent)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_x__dag_increment_mergeinfo_count(pp->node,
+ increment,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Change, add, or delete a node's property value. The affected node
+ is PATH under ROOT, the property value to modify is NAME, and VALUE
+ points to either a string value to set the new contents to, or NULL
+ if the property should be deleted. Perform temporary allocations
+ in SCRATCH_POOL. */
+static svn_error_t *
+x_change_node_prop(svn_fs_root_t *root,
+ const char *path,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ parent_path_t *parent_path;
+ apr_hash_t *proplist;
+ svn_fs_x__txn_id_t txn_id;
+ svn_boolean_t mergeinfo_mod = FALSE;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ if (! root->is_txn_root)
+ return SVN_FS__NOT_TXN(root);
+ txn_id = root_txn_id(root);
+
+ path = svn_fs__canonicalize_abspath(path, subpool);
+ SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, subpool));
+
+ /* Check (non-recursively) to see if path is locked; if so, check
+ that we can use it. */
+ if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(path, root->fs, FALSE, FALSE,
+ subpool));
+
+ SVN_ERR(make_path_mutable(root, parent_path, path, subpool, subpool));
+ SVN_ERR(svn_fs_x__dag_get_proplist(&proplist, parent_path->node, subpool,
+ subpool));
+
+ /* If there's no proplist, but we're just deleting a property, exit now. */
+ if ((! proplist) && (! value))
+ return SVN_NO_ERROR;
+
+ /* Now, if there's no proplist, we know we need to make one. */
+ if (! proplist)
+ proplist = apr_hash_make(subpool);
+
+ if (strcmp(name, SVN_PROP_MERGEINFO) == 0)
+ {
+ apr_int64_t increment = 0;
+ svn_boolean_t had_mergeinfo;
+ SVN_ERR(svn_fs_x__dag_has_mergeinfo(&had_mergeinfo, parent_path->node));
+
+ if (value && !had_mergeinfo)
+ increment = 1;
+ else if (!value && had_mergeinfo)
+ increment = -1;
+
+ if (increment != 0)
+ {
+ SVN_ERR(increment_mergeinfo_up_tree(parent_path, increment, subpool));
+ SVN_ERR(svn_fs_x__dag_set_has_mergeinfo(parent_path->node,
+ (value != NULL), subpool));
+ }
+
+ mergeinfo_mod = TRUE;
+ }
+
+ /* Set the property. */
+ svn_hash_sets(proplist, name, value);
+
+ /* Overwrite the node's proplist. */
+ SVN_ERR(svn_fs_x__dag_set_proplist(parent_path->node, proplist,
+ subpool));
+
+ /* Make a record of this modification in the changes table. */
+ SVN_ERR(add_change(root->fs, txn_id, path,
+ svn_fs_x__dag_get_id(parent_path->node),
+ svn_fs_path_change_modify, FALSE, TRUE, mergeinfo_mod,
+ svn_fs_x__dag_node_kind(parent_path->node),
+ SVN_INVALID_REVNUM, NULL, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Determine if the properties of two path/root combinations are
+ different. Set *CHANGED_P to TRUE if the properties at PATH1 under
+ ROOT1 differ from those at PATH2 under ROOT2, or FALSE otherwise.
+ Both roots must be in the same filesystem. */
+static svn_error_t *
+x_props_changed(svn_boolean_t *changed_p,
+ svn_fs_root_t *root1,
+ const char *path1,
+ svn_fs_root_t *root2,
+ const char *path2,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node1, *node2;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ /* Check that roots are in the same fs. */
+ if (root1->fs != root2->fs)
+ return svn_error_create
+ (SVN_ERR_FS_GENERAL, NULL,
+ _("Cannot compare property value between two different filesystems"));
+
+ SVN_ERR(get_dag(&node1, root1, path1, subpool));
+ SVN_ERR(get_dag(&node2, root2, path2, subpool));
+ SVN_ERR(svn_fs_x__dag_things_different(changed_p, NULL, node1, node2,
+ strict, subpool));
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Merges and commits. */
+
+/* Set *NODE to the root node of ROOT. */
+static svn_error_t *
+get_root(dag_node_t **node, svn_fs_root_t *root, apr_pool_t *pool)
+{
+ return get_dag(node, root, "/", pool);
+}
+
+
+/* Set the contents of CONFLICT_PATH to PATH, and return an
+ SVN_ERR_FS_CONFLICT error that indicates that there was a conflict
+ at PATH. Perform all allocations in POOL (except the allocation of
+ CONFLICT_PATH, which should be handled outside this function). */
+static svn_error_t *
+conflict_err(svn_stringbuf_t *conflict_path,
+ const char *path)
+{
+ svn_stringbuf_set(conflict_path, path);
+ return svn_error_createf(SVN_ERR_FS_CONFLICT, NULL,
+ _("Conflict at '%s'"), path);
+}
+
+/* Compare the directory representations at nodes LHS and RHS in FS and set
+ * *CHANGED to TRUE, if at least one entry has been added or removed them.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+compare_dir_structure(svn_boolean_t *changed,
+ svn_fs_t *fs,
+ dag_node_t *lhs,
+ dag_node_t *rhs,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *lhs_entries;
+ apr_array_header_t *rhs_entries;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_fs_x__dag_dir_entries(&lhs_entries, lhs, scratch_pool,
+ iterpool));
+ SVN_ERR(svn_fs_x__dag_dir_entries(&rhs_entries, rhs, scratch_pool,
+ iterpool));
+
+ /* different number of entries -> some addition / removal */
+ if (lhs_entries->nelts != rhs_entries->nelts)
+ {
+ svn_pool_destroy(iterpool);
+ *changed = TRUE;
+
+ return SVN_NO_ERROR;
+ }
+
+ /* Since directories are sorted by name, we can simply compare their
+ entries one-by-one without binary lookup etc. */
+ for (i = 0; i < lhs_entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *lhs_entry
+ = APR_ARRAY_IDX(lhs_entries, i, svn_fs_x__dirent_t *);
+ svn_fs_x__dirent_t *rhs_entry
+ = APR_ARRAY_IDX(rhs_entries, i, svn_fs_x__dirent_t *);
+
+ if (strcmp(lhs_entry->name, rhs_entry->name) == 0)
+ {
+ svn_boolean_t same_history;
+ dag_node_t *lhs_node, *rhs_node;
+
+ /* Unchanged entry? */
+ if (!svn_fs_x__id_eq(&lhs_entry->id, &rhs_entry->id))
+ continue;
+
+ /* We get here rarely. */
+ svn_pool_clear(iterpool);
+
+ /* Modified but not copied / replaced or anything? */
+ SVN_ERR(svn_fs_x__dag_get_node(&lhs_node, fs, &lhs_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&rhs_node, fs, &rhs_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&same_history,
+ lhs_node, rhs_node));
+ if (same_history)
+ continue;
+ }
+
+ /* This is a different entry. */
+ *changed = TRUE;
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+ }
+
+ svn_pool_destroy(iterpool);
+ *changed = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
+/* Merge changes between ANCESTOR and SOURCE into TARGET. ANCESTOR
+ * and TARGET must be distinct node revisions. TARGET_PATH should
+ * correspond to TARGET's full path in its filesystem, and is used for
+ * reporting conflict location.
+ *
+ * SOURCE, TARGET, and ANCESTOR are generally directories; this
+ * function recursively merges the directories' contents. If any are
+ * files, this function simply returns an error whenever SOURCE,
+ * TARGET, and ANCESTOR are all distinct node revisions.
+ *
+ * If there are differences between ANCESTOR and SOURCE that conflict
+ * with changes between ANCESTOR and TARGET, this function returns an
+ * SVN_ERR_FS_CONFLICT error, and updates CONFLICT_P to the name of the
+ * conflicting node in TARGET, with TARGET_PATH prepended as a path.
+ *
+ * If there are no conflicting differences, CONFLICT_P is updated to
+ * the empty string.
+ *
+ * CONFLICT_P must point to a valid svn_stringbuf_t.
+ *
+ * Do any necessary temporary allocation in POOL.
+ */
+static svn_error_t *
+merge(svn_stringbuf_t *conflict_p,
+ const char *target_path,
+ dag_node_t *target,
+ dag_node_t *source,
+ dag_node_t *ancestor,
+ svn_fs_x__txn_id_t txn_id,
+ apr_int64_t *mergeinfo_increment_out,
+ apr_pool_t *pool)
+{
+ const svn_fs_x__id_t *source_id, *target_id, *ancestor_id;
+ apr_array_header_t *s_entries, *t_entries, *a_entries;
+ int i, s_idx = -1, t_idx = -1;
+ svn_fs_t *fs;
+ apr_pool_t *iterpool;
+ apr_int64_t mergeinfo_increment = 0;
+
+ /* Make sure everyone comes from the same filesystem. */
+ fs = svn_fs_x__dag_get_fs(ancestor);
+ if ((fs != svn_fs_x__dag_get_fs(source))
+ || (fs != svn_fs_x__dag_get_fs(target)))
+ {
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Bad merge; ancestor, source, and target not all in same fs"));
+ }
+
+ /* We have the same fs, now check it. */
+ SVN_ERR(svn_fs__check_fs(fs, TRUE));
+
+ source_id = svn_fs_x__dag_get_id(source);
+ target_id = svn_fs_x__dag_get_id(target);
+ ancestor_id = svn_fs_x__dag_get_id(ancestor);
+
+ /* It's improper to call this function with ancestor == target. */
+ if (svn_fs_x__id_eq(ancestor_id, target_id))
+ {
+ svn_string_t *id_str = svn_fs_x__id_unparse(target_id, pool);
+ return svn_error_createf
+ (SVN_ERR_FS_GENERAL, NULL,
+ _("Bad merge; target '%s' has id '%s', same as ancestor"),
+ target_path, id_str->data);
+ }
+
+ svn_stringbuf_setempty(conflict_p);
+
+ /* Base cases:
+ * Either no change made in source, or same change as made in target.
+ * Both mean nothing to merge here.
+ */
+ if (svn_fs_x__id_eq(ancestor_id, source_id)
+ || (svn_fs_x__id_eq(source_id, target_id)))
+ return SVN_NO_ERROR;
+
+ /* Else proceed, knowing all three are distinct node revisions.
+ *
+ * How to merge from this point:
+ *
+ * if (not all 3 are directories)
+ * {
+ * early exit with conflict;
+ * }
+ *
+ * // Property changes may only be made to up-to-date
+ * // directories, because once the client commits the prop
+ * // change, it bumps the directory's revision, and therefore
+ * // must be able to depend on there being no other changes to
+ * // that directory in the repository.
+ * if (target's property list differs from ancestor's)
+ * conflict;
+ *
+ * For each entry NAME in the directory ANCESTOR:
+ *
+ * Let ANCESTOR-ENTRY, SOURCE-ENTRY, and TARGET-ENTRY be the IDs of
+ * the name within ANCESTOR, SOURCE, and TARGET respectively.
+ * (Possibly null if NAME does not exist in SOURCE or TARGET.)
+ *
+ * If ANCESTOR-ENTRY == SOURCE-ENTRY, then:
+ * No changes were made to this entry while the transaction was in
+ * progress, so do nothing to the target.
+ *
+ * Else if ANCESTOR-ENTRY == TARGET-ENTRY, then:
+ * A change was made to this entry while the transaction was in
+ * process, but the transaction did not touch this entry. Replace
+ * TARGET-ENTRY with SOURCE-ENTRY.
+ *
+ * Else:
+ * Changes were made to this entry both within the transaction and
+ * to the repository while the transaction was in progress. They
+ * must be merged or declared to be in conflict.
+ *
+ * If SOURCE-ENTRY and TARGET-ENTRY are both null, that's a
+ * double delete; flag a conflict.
+ *
+ * If any of the three entries is of type file, declare a conflict.
+ *
+ * If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
+ * modification of ANCESTOR-ENTRY (determine by comparing the
+ * node-id fields), declare a conflict. A replacement is
+ * incompatible with a modification or other replacement--even
+ * an identical replacement.
+ *
+ * Direct modifications were made to the directory ANCESTOR-ENTRY
+ * in both SOURCE and TARGET. Recursively merge these
+ * modifications.
+ *
+ * For each leftover entry NAME in the directory SOURCE:
+ *
+ * If NAME exists in TARGET, declare a conflict. Even if SOURCE and
+ * TARGET are adding exactly the same thing, two additions are not
+ * auto-mergeable with each other.
+ *
+ * Add NAME to TARGET with the entry from SOURCE.
+ *
+ * Now that we are done merging the changes from SOURCE into the
+ * directory TARGET, update TARGET's predecessor to be SOURCE.
+ */
+
+ if ((svn_fs_x__dag_node_kind(source) != svn_node_dir)
+ || (svn_fs_x__dag_node_kind(target) != svn_node_dir)
+ || (svn_fs_x__dag_node_kind(ancestor) != svn_node_dir))
+ {
+ return conflict_err(conflict_p, target_path);
+ }
+
+
+ /* Possible early merge failure: if target and ancestor have
+ different property lists, then the merge should fail.
+ Propchanges can *only* be committed on an up-to-date directory.
+ ### TODO: see issue #418 about the inelegance of this.
+
+ Another possible, similar, early merge failure: if source and
+ ancestor have different property lists (meaning someone else
+ changed directory properties while our commit transaction was
+ happening), the merge should fail. See issue #2751.
+ */
+ {
+ svn_fs_x__noderev_t *tgt_nr, *anc_nr, *src_nr;
+ svn_boolean_t same;
+ apr_pool_t *scratch_pool;
+
+ /* Get node revisions for our id's. */
+ scratch_pool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_x__get_node_revision(&tgt_nr, fs, target_id,
+ pool, scratch_pool));
+ svn_pool_clear(scratch_pool);
+ SVN_ERR(svn_fs_x__get_node_revision(&anc_nr, fs, ancestor_id,
+ pool, scratch_pool));
+ svn_pool_clear(scratch_pool);
+ SVN_ERR(svn_fs_x__get_node_revision(&src_nr, fs, source_id,
+ pool, scratch_pool));
+ svn_pool_destroy(scratch_pool);
+
+ /* Now compare the prop-keys of the skels. Note that just because
+ the keys are different -doesn't- mean the proplists have
+ different contents. */
+ SVN_ERR(svn_fs_x__prop_rep_equal(&same, fs, src_nr, anc_nr, TRUE, pool));
+ if (! same)
+ return conflict_err(conflict_p, target_path);
+
+ /* The directory entries got changed in the repository but the directory
+ properties did not. */
+ SVN_ERR(svn_fs_x__prop_rep_equal(&same, fs, tgt_nr, anc_nr, TRUE, pool));
+ if (! same)
+ {
+ /* There is an incoming prop change for this directory.
+ We will accept it only if the directory changes were mere updates
+ to its entries, i.e. there were no additions or removals.
+ Those could cause update problems to the working copy. */
+ svn_boolean_t changed;
+ SVN_ERR(compare_dir_structure(&changed, fs, source, ancestor, pool));
+
+ if (changed)
+ return conflict_err(conflict_p, target_path);
+ }
+ }
+
+ /* ### todo: it would be more efficient to simply check for a NULL
+ entries hash where necessary below than to allocate an empty hash
+ here, but another day, another day... */
+ iterpool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_x__dag_dir_entries(&s_entries, source, pool, iterpool));
+ SVN_ERR(svn_fs_x__dag_dir_entries(&t_entries, target, pool, iterpool));
+ SVN_ERR(svn_fs_x__dag_dir_entries(&a_entries, ancestor, pool, iterpool));
+
+ /* for each entry E in a_entries... */
+ for (i = 0; i < a_entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *s_entry, *t_entry, *a_entry;
+ svn_pool_clear(iterpool);
+
+ a_entry = APR_ARRAY_IDX(a_entries, i, svn_fs_x__dirent_t *);
+ s_entry = svn_fs_x__find_dir_entry(s_entries, a_entry->name, &s_idx);
+ t_entry = svn_fs_x__find_dir_entry(t_entries, a_entry->name, &t_idx);
+
+ /* No changes were made to this entry while the transaction was
+ in progress, so do nothing to the target. */
+ if (s_entry && svn_fs_x__id_eq(&a_entry->id, &s_entry->id))
+ continue;
+
+ /* A change was made to this entry while the transaction was in
+ process, but the transaction did not touch this entry. */
+ else if (t_entry && svn_fs_x__id_eq(&a_entry->id, &t_entry->id))
+ {
+ apr_int64_t mergeinfo_start;
+ apr_int64_t mergeinfo_end;
+
+ dag_node_t *t_ent_node;
+ SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_start,
+ t_ent_node));
+ mergeinfo_increment -= mergeinfo_start;
+
+ if (s_entry)
+ {
+ dag_node_t *s_ent_node;
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+ iterpool, iterpool));
+
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_end,
+ s_ent_node));
+ mergeinfo_increment += mergeinfo_end;
+
+ SVN_ERR(svn_fs_x__dag_set_entry(target, a_entry->name,
+ &s_entry->id,
+ s_entry->kind,
+ txn_id,
+ iterpool));
+ }
+ else
+ {
+ SVN_ERR(svn_fs_x__dag_delete(target, a_entry->name, txn_id,
+ iterpool));
+ }
+ }
+
+ /* Changes were made to this entry both within the transaction
+ and to the repository while the transaction was in progress.
+ They must be merged or declared to be in conflict. */
+ else
+ {
+ dag_node_t *s_ent_node, *t_ent_node, *a_ent_node;
+ const char *new_tpath;
+ apr_int64_t sub_mergeinfo_increment;
+ svn_boolean_t s_a_same, t_a_same;
+
+ /* If SOURCE-ENTRY and TARGET-ENTRY are both null, that's a
+ double delete; if one of them is null, that's a delete versus
+ a modification. In any of these cases, flag a conflict. */
+ if (s_entry == NULL || t_entry == NULL)
+ return conflict_err(conflict_p,
+ svn_fspath__join(target_path,
+ a_entry->name,
+ iterpool));
+
+ /* If any of the three entries is of type file, flag a conflict. */
+ if (s_entry->kind == svn_node_file
+ || t_entry->kind == svn_node_file
+ || a_entry->kind == svn_node_file)
+ return conflict_err(conflict_p,
+ svn_fspath__join(target_path,
+ a_entry->name,
+ iterpool));
+
+ /* Fetch DAG nodes to efficiently access ID parts. */
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs, &a_entry->id,
+ iterpool, iterpool));
+
+ /* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
+ modification of ANCESTOR-ENTRY, declare a conflict. */
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&s_a_same, s_ent_node,
+ a_ent_node));
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&t_a_same, t_ent_node,
+ a_ent_node));
+ if (!s_a_same || !t_a_same)
+ return conflict_err(conflict_p,
+ svn_fspath__join(target_path,
+ a_entry->name,
+ iterpool));
+
+ /* Direct modifications were made to the directory
+ ANCESTOR-ENTRY in both SOURCE and TARGET. Recursively
+ merge these modifications. */
+ new_tpath = svn_fspath__join(target_path, t_entry->name, iterpool);
+ SVN_ERR(merge(conflict_p, new_tpath,
+ t_ent_node, s_ent_node, a_ent_node,
+ txn_id,
+ &sub_mergeinfo_increment,
+ iterpool));
+ mergeinfo_increment += sub_mergeinfo_increment;
+ }
+ }
+
+ /* For each entry E in source but not in ancestor */
+ for (i = 0; i < s_entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *a_entry, *s_entry, *t_entry;
+ dag_node_t *s_ent_node;
+ apr_int64_t mergeinfo_s;
+
+ svn_pool_clear(iterpool);
+
+ s_entry = APR_ARRAY_IDX(s_entries, i, svn_fs_x__dirent_t *);
+ a_entry = svn_fs_x__find_dir_entry(a_entries, s_entry->name, &s_idx);
+ t_entry = svn_fs_x__find_dir_entry(t_entries, s_entry->name, &t_idx);
+
+ /* Process only entries in source that are NOT in ancestor. */
+ if (a_entry)
+ continue;
+
+ /* If NAME exists in TARGET, declare a conflict. */
+ if (t_entry)
+ return conflict_err(conflict_p,
+ svn_fspath__join(target_path,
+ t_entry->name,
+ iterpool));
+
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+ iterpool, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_s, s_ent_node));
+ mergeinfo_increment += mergeinfo_s;
+
+ SVN_ERR(svn_fs_x__dag_set_entry
+ (target, s_entry->name, &s_entry->id, s_entry->kind,
+ txn_id, iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_x__dag_update_ancestry(target, source, pool));
+
+ SVN_ERR(svn_fs_x__dag_increment_mergeinfo_count(target,
+ mergeinfo_increment,
+ pool));
+
+ if (mergeinfo_increment_out)
+ *mergeinfo_increment_out = mergeinfo_increment;
+
+ return SVN_NO_ERROR;
+}
+
+/* Merge changes between an ancestor and SOURCE_NODE into
+ TXN. The ancestor is either ANCESTOR_NODE, or if
+ that is null, TXN's base node.
+
+ If the merge is successful, TXN's base will become
+ SOURCE_NODE, and its root node will have a new ID, a
+ successor of SOURCE_NODE.
+
+ If a conflict results, update *CONFLICT to the path in the txn that
+ conflicted; see the CONFLICT_P parameter of merge() for details. */
+static svn_error_t *
+merge_changes(dag_node_t *ancestor_node,
+ dag_node_t *source_node,
+ svn_fs_txn_t *txn,
+ svn_stringbuf_t *conflict,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *txn_root_node;
+ svn_fs_t *fs = txn->fs;
+ svn_fs_x__txn_id_t txn_id = svn_fs_x__txn_get_id(txn);
+ svn_boolean_t related;
+
+ SVN_ERR(svn_fs_x__dag_txn_root(&txn_root_node, fs, txn_id, scratch_pool,
+ scratch_pool));
+
+ if (ancestor_node == NULL)
+ {
+ svn_revnum_t base_rev;
+ SVN_ERR(svn_fs_x__get_base_rev(&base_rev, fs, txn_id, scratch_pool));
+ SVN_ERR(svn_fs_x__dag_revision_root(&ancestor_node, fs, base_rev,
+ scratch_pool, scratch_pool));
+ }
+
+ SVN_ERR(svn_fs_x__dag_related_node(&related, ancestor_node, txn_root_node));
+ if (!related)
+ {
+ /* If no changes have been made in TXN since its current base,
+ then it can't conflict with any changes since that base.
+ The caller isn't supposed to call us in that case. */
+ SVN_ERR_MALFUNCTION();
+ }
+ else
+ SVN_ERR(merge(conflict, "/", txn_root_node,
+ source_node, ancestor_node, txn_id, NULL, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_fs_x__commit_txn(const char **conflict_p,
+ svn_revnum_t *new_rev,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool)
+{
+ /* How do commits work in Subversion?
+ *
+ * When you're ready to commit, here's what you have:
+ *
+ * 1. A transaction, with a mutable tree hanging off it.
+ * 2. A base revision, against which TXN_TREE was made.
+ * 3. A latest revision, which may be newer than the base rev.
+ *
+ * The problem is that if latest != base, then one can't simply
+ * attach the txn root as the root of the new revision, because that
+ * would lose all the changes between base and latest. It is also
+ * not acceptable to insist that base == latest; in a busy
+ * repository, commits happen too fast to insist that everyone keep
+ * their entire tree up-to-date at all times. Non-overlapping
+ * changes should not interfere with each other.
+ *
+ * The solution is to merge the changes between base and latest into
+ * the txn tree [see the function merge()]. The txn tree is the
+ * only one of the three trees that is mutable, so it has to be the
+ * one to adjust.
+ *
+ * You might have to adjust it more than once, if a new latest
+ * revision gets committed while you were merging in the previous
+ * one. For example:
+ *
+ * 1. Jane starts txn T, based at revision 6.
+ * 2. Someone commits (or already committed) revision 7.
+ * 3. Jane's starts merging the changes between 6 and 7 into T.
+ * 4. Meanwhile, someone commits revision 8.
+ * 5. Jane finishes the 6-->7 merge. T could now be committed
+ * against a latest revision of 7, if only that were still the
+ * latest. Unfortunately, 8 is now the latest, so...
+ * 6. Jane starts merging the changes between 7 and 8 into T.
+ * 7. Meanwhile, no one commits any new revisions. Whew.
+ * 8. Jane commits T, creating revision 9, whose tree is exactly
+ * T's tree, except immutable now.
+ *
+ * Lather, rinse, repeat.
+ */
+
+ svn_error_t *err = SVN_NO_ERROR;
+ svn_stringbuf_t *conflict = svn_stringbuf_create_empty(pool);
+ svn_fs_t *fs = txn->fs;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* Limit memory usage when the repository has a high commit rate and
+ needs to run the following while loop multiple times. The memory
+ growth without an iteration pool is very noticeable when the
+ transaction modifies a node that has 20,000 sibling nodes. */
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Initialize output params. */
+ *new_rev = SVN_INVALID_REVNUM;
+ if (conflict_p)
+ *conflict_p = NULL;
+
+ while (1729)
+ {
+ svn_revnum_t youngish_rev;
+ svn_fs_root_t *youngish_root;
+ dag_node_t *youngish_root_node;
+
+ svn_pool_clear(iterpool);
+
+ /* Get the *current* youngest revision. We call it "youngish"
+ because new revisions might get committed after we've
+ obtained it. */
+
+ SVN_ERR(svn_fs_x__youngest_rev(&youngish_rev, fs, iterpool));
+ SVN_ERR(svn_fs_x__revision_root(&youngish_root, fs, youngish_rev,
+ iterpool));
+
+ /* Get the dag node for the youngest revision. Later we'll use
+ it as the SOURCE argument to a merge, and if the merge
+ succeeds, this youngest root node will become the new base
+ root for the svn txn that was the target of the merge (but
+ note that the youngest rev may have changed by then -- that's
+ why we're careful to get this root in its own bdb txn
+ here). */
+ SVN_ERR(get_root(&youngish_root_node, youngish_root, iterpool));
+
+ /* Try to merge. If the merge succeeds, the base root node of
+ TARGET's txn will become the same as youngish_root_node, so
+ any future merges will only be between that node and whatever
+ the root node of the youngest rev is by then. */
+ err = merge_changes(NULL, youngish_root_node, txn, conflict, iterpool);
+ if (err)
+ {
+ if ((err->apr_err == SVN_ERR_FS_CONFLICT) && conflict_p)
+ *conflict_p = conflict->data;
+ goto cleanup;
+ }
+ txn->base_rev = youngish_rev;
+
+ /* Try to commit. */
+ err = svn_fs_x__commit(new_rev, fs, txn, iterpool);
+ if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))
+ {
+ /* Did someone else finish committing a new revision while we
+ were in mid-merge or mid-commit? If so, we'll need to
+ loop again to merge the new changes in, then try to
+ commit again. Or if that's not what happened, then just
+ return the error. */
+ svn_revnum_t youngest_rev;
+ SVN_ERR(svn_fs_x__youngest_rev(&youngest_rev, fs, iterpool));
+ if (youngest_rev == youngish_rev)
+ goto cleanup;
+ else
+ svn_error_clear(err);
+ }
+ else if (err)
+ {
+ goto cleanup;
+ }
+ else
+ {
+ err = SVN_NO_ERROR;
+ goto cleanup;
+ }
+ }
+
+ cleanup:
+
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(err);
+
+ if (ffd->pack_after_commit)
+ {
+ SVN_ERR(svn_fs_x__pack(fs, NULL, NULL, NULL, NULL, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Merge changes between two nodes into a third node. Given nodes
+ SOURCE_PATH under SOURCE_ROOT, TARGET_PATH under TARGET_ROOT and
+ ANCESTOR_PATH under ANCESTOR_ROOT, modify target to contain all the
+ changes between the ancestor and source. If there are conflicts,
+ return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a textual
+ description of the offending changes. Perform any temporary
+ allocations in POOL. */
+static svn_error_t *
+x_merge(const char **conflict_p,
+ svn_fs_root_t *source_root,
+ const char *source_path,
+ svn_fs_root_t *target_root,
+ const char *target_path,
+ svn_fs_root_t *ancestor_root,
+ const char *ancestor_path,
+ apr_pool_t *pool)
+{
+ dag_node_t *source, *ancestor;
+ svn_fs_txn_t *txn;
+ svn_error_t *err;
+ svn_stringbuf_t *conflict = svn_stringbuf_create_empty(pool);
+
+ if (! target_root->is_txn_root)
+ return SVN_FS__NOT_TXN(target_root);
+
+ /* Paranoia. */
+ if ((source_root->fs != ancestor_root->fs)
+ || (target_root->fs != ancestor_root->fs))
+ {
+ return svn_error_create
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Bad merge; ancestor, source, and target not all in same fs"));
+ }
+
+ /* ### kff todo: is there any compelling reason to get the nodes in
+ one db transaction? Right now we don't; txn_body_get_root() gets
+ one node at a time. This will probably need to change:
+
+ Jim Blandy <jimb@zwingli.cygnus.com> writes:
+ > svn_fs_merge needs to be a single transaction, to protect it against
+ > people deleting parents of nodes it's working on, etc.
+ */
+
+ /* Get the ancestor node. */
+ SVN_ERR(get_root(&ancestor, ancestor_root, pool));
+
+ /* Get the source node. */
+ SVN_ERR(get_root(&source, source_root, pool));
+
+ /* Open a txn for the txn root into which we're merging. */
+ SVN_ERR(svn_fs_x__open_txn(&txn, ancestor_root->fs, target_root->txn,
+ pool));
+
+ /* Merge changes between ANCESTOR and SOURCE into TXN. */
+ err = merge_changes(ancestor, source, txn, conflict, pool);
+ if (err)
+ {
+ if ((err->apr_err == SVN_ERR_FS_CONFLICT) && conflict_p)
+ *conflict_p = conflict->data;
+ return svn_error_trace(err);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__deltify(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ /* Deltify is a no-op for fs_x. */
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Directories. */
+
+/* Set *TABLE_P to a newly allocated APR hash table containing the
+ entries of the directory at PATH in ROOT. The keys of the table
+ are entry names, as byte strings, excluding the final null
+ character; the table's values are pointers to svn_fs_svn_fs_x__dirent_t
+ structures. Allocate the table and its contents in POOL. */
+static svn_error_t *
+x_dir_entries(apr_hash_t **table_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+ apr_hash_t *hash = svn_hash__make(pool);
+ apr_array_header_t *table;
+ int i;
+ svn_fs_x__id_context_t *context = NULL;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ /* Get the entries for this path in the caller's pool. */
+ SVN_ERR(get_dag(&node, root, path, scratch_pool));
+ SVN_ERR(svn_fs_x__dag_dir_entries(&table, node, scratch_pool,
+ scratch_pool));
+
+ if (table->nelts)
+ context = svn_fs_x__id_create_context(root->fs, pool);
+
+ /* Convert directory array to hash. */
+ for (i = 0; i < table->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *entry
+ = APR_ARRAY_IDX(table, i, svn_fs_x__dirent_t *);
+ apr_size_t len = strlen(entry->name);
+
+ svn_fs_dirent_t *api_dirent = apr_pcalloc(pool, sizeof(*api_dirent));
+ api_dirent->name = apr_pstrmemdup(pool, entry->name, len);
+ api_dirent->kind = entry->kind;
+ api_dirent->id = svn_fs_x__id_create(context, &entry->id, pool);
+
+ apr_hash_set(hash, api_dirent->name, len, api_dirent);
+ }
+
+ *table_p = hash;
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x_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)
+{
+ *ordered_p = svn_fs_x__order_dir_entries(root->fs, entries, result_pool,
+ scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Create a new directory named PATH in ROOT. The new directory has
+ no entries, and no properties. ROOT must be the root of a
+ transaction, not a revision. Do any necessary temporary allocation
+ in SCRATCH_POOL. */
+static svn_error_t *
+x_make_dir(svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ parent_path_t *parent_path;
+ dag_node_t *sub_dir;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(root);
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ path = svn_fs__canonicalize_abspath(path, subpool);
+ SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
+ TRUE, subpool));
+
+ /* Check (recursively) to see if some lock is 'reserving' a path at
+ that location, or even some child-path; if so, check that we can
+ use it. */
+ if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(path, root->fs, TRUE, FALSE,
+ subpool));
+
+ /* If there's already a sub-directory by that name, complain. This
+ also catches the case of trying to make a subdirectory named `/'. */
+ if (parent_path->node)
+ return SVN_FS__ALREADY_EXISTS(root, path);
+
+ /* Create the subdirectory. */
+ SVN_ERR(make_path_mutable(root, parent_path->parent, path, subpool,
+ subpool));
+ SVN_ERR(svn_fs_x__dag_make_dir(&sub_dir,
+ parent_path->parent->node,
+ parent_path_path(parent_path->parent,
+ subpool),
+ parent_path->entry,
+ txn_id,
+ subpool, subpool));
+
+ /* Add this directory to the path cache. */
+ SVN_ERR(dag_node_cache_set(root, parent_path_path(parent_path, subpool),
+ sub_dir, subpool));
+
+ /* Make a record of this modification in the changes table. */
+ SVN_ERR(add_change(root->fs, txn_id, path, svn_fs_x__dag_get_id(sub_dir),
+ svn_fs_path_change_add, FALSE, FALSE, FALSE,
+ svn_node_dir, SVN_INVALID_REVNUM, NULL, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Delete the node at PATH under ROOT. ROOT must be a transaction
+ root. Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+x_delete_node(svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ parent_path_t *parent_path;
+ svn_fs_x__txn_id_t txn_id;
+ apr_int64_t mergeinfo_count = 0;
+ svn_node_kind_t kind;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ if (! root->is_txn_root)
+ return SVN_FS__NOT_TXN(root);
+
+ txn_id = root_txn_id(root);
+ path = svn_fs__canonicalize_abspath(path, subpool);
+ SVN_ERR(open_path(&parent_path, root, path, 0, TRUE, subpool));
+ kind = svn_fs_x__dag_node_kind(parent_path->node);
+
+ /* We can't remove the root of the filesystem. */
+ if (! parent_path->parent)
+ return svn_error_create(SVN_ERR_FS_ROOT_DIR, NULL,
+ _("The root directory cannot be deleted"));
+
+ /* Check to see if path (or any child thereof) is locked; if so,
+ check that we can use the existing lock(s). */
+ if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(path, root->fs, TRUE, FALSE,
+ subpool));
+
+ /* Make the parent directory mutable, and do the deletion. */
+ SVN_ERR(make_path_mutable(root, parent_path->parent, path, subpool,
+ subpool));
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_count,
+ parent_path->node));
+ SVN_ERR(svn_fs_x__dag_delete(parent_path->parent->node,
+ parent_path->entry,
+ txn_id, subpool));
+
+ /* Remove this node and any children from the path cache. */
+ SVN_ERR(dag_node_cache_invalidate(root, parent_path_path(parent_path,
+ subpool),
+ subpool));
+
+ /* Update mergeinfo counts for parents */
+ if (mergeinfo_count > 0)
+ SVN_ERR(increment_mergeinfo_up_tree(parent_path->parent,
+ -mergeinfo_count,
+ subpool));
+
+ /* Make a record of this modification in the changes table. */
+ SVN_ERR(add_change(root->fs, txn_id, path,
+ svn_fs_x__dag_get_id(parent_path->node),
+ svn_fs_path_change_delete, FALSE, FALSE, FALSE, kind,
+ SVN_INVALID_REVNUM, NULL, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *SAME_P to TRUE if FS1 and FS2 have the same UUID, else set to FALSE.
+ Use SCRATCH_POOL for temporary allocation only.
+ Note: this code is duplicated between libsvn_fs_x and libsvn_fs_base. */
+static svn_error_t *
+x_same_p(svn_boolean_t *same_p,
+ svn_fs_t *fs1,
+ svn_fs_t *fs2,
+ apr_pool_t *scratch_pool)
+{
+ *same_p = ! strcmp(fs1->uuid, fs2->uuid);
+ return SVN_NO_ERROR;
+}
+
+/* Copy the node at FROM_PATH under FROM_ROOT to TO_PATH under
+ TO_ROOT. If PRESERVE_HISTORY is set, then the copy is recorded in
+ the copies table. Perform temporary allocations in SCRATCH_POOL. */
+static svn_error_t *
+copy_helper(svn_fs_root_t *from_root,
+ const char *from_path,
+ svn_fs_root_t *to_root,
+ const char *to_path,
+ svn_boolean_t preserve_history,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *from_node;
+ parent_path_t *to_parent_path;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(to_root);
+ svn_boolean_t same_p;
+
+ /* Use an error check, not an assert, because even the caller cannot
+ guarantee that a filesystem's UUID has not changed "on the fly". */
+ SVN_ERR(x_same_p(&same_p, from_root->fs, to_root->fs, scratch_pool));
+ if (! same_p)
+ return svn_error_createf
+ (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Cannot copy between two different filesystems ('%s' and '%s')"),
+ from_root->fs->path, to_root->fs->path);
+
+ /* more things that we can't do ATM */
+ if (from_root->is_txn_root)
+ return svn_error_create
+ (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Copy from mutable tree not currently supported"));
+
+ if (! to_root->is_txn_root)
+ return svn_error_create
+ (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Copy immutable tree not supported"));
+
+ /* Get the NODE for FROM_PATH in FROM_ROOT.*/
+ SVN_ERR(get_dag(&from_node, from_root, from_path, scratch_pool));
+
+ /* Build up the parent path from TO_PATH in TO_ROOT. If the last
+ component does not exist, it's not that big a deal. We'll just
+ make one there. */
+ SVN_ERR(open_path(&to_parent_path, to_root, to_path,
+ open_path_last_optional, TRUE, scratch_pool));
+
+ /* Check to see if path (or any child thereof) is locked; if so,
+ check that we can use the existing lock(s). */
+ if (to_root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(to_path, to_root->fs,
+ TRUE, FALSE, scratch_pool));
+
+ /* If the destination node already exists as the same node as the
+ source (in other words, this operation would result in nothing
+ happening at all), just do nothing an return successfully,
+ proud that you saved yourself from a tiresome task. */
+ if (to_parent_path->node &&
+ svn_fs_x__id_eq(svn_fs_x__dag_get_id(from_node),
+ svn_fs_x__dag_get_id(to_parent_path->node)))
+ return SVN_NO_ERROR;
+
+ if (! from_root->is_txn_root)
+ {
+ svn_fs_path_change_kind_t kind;
+ dag_node_t *new_node;
+ const char *from_canonpath;
+ apr_int64_t mergeinfo_start;
+ apr_int64_t mergeinfo_end;
+
+ /* If TO_PATH already existed prior to the copy, note that this
+ operation is a replacement, not an addition. */
+ if (to_parent_path->node)
+ {
+ kind = svn_fs_path_change_replace;
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_start,
+ to_parent_path->node));
+ }
+ else
+ {
+ kind = svn_fs_path_change_add;
+ mergeinfo_start = 0;
+ }
+
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_end, from_node));
+
+ /* Make sure the target node's parents are mutable. */
+ SVN_ERR(make_path_mutable(to_root, to_parent_path->parent,
+ to_path, scratch_pool, scratch_pool));
+
+ /* Canonicalize the copyfrom path. */
+ from_canonpath = svn_fs__canonicalize_abspath(from_path, scratch_pool);
+
+ SVN_ERR(svn_fs_x__dag_copy(to_parent_path->parent->node,
+ to_parent_path->entry,
+ from_node,
+ preserve_history,
+ from_root->rev,
+ from_canonpath,
+ txn_id, scratch_pool));
+
+ if (kind != svn_fs_path_change_add)
+ SVN_ERR(dag_node_cache_invalidate(to_root,
+ parent_path_path(to_parent_path,
+ scratch_pool),
+ scratch_pool));
+
+ if (mergeinfo_start != mergeinfo_end)
+ SVN_ERR(increment_mergeinfo_up_tree(to_parent_path->parent,
+ mergeinfo_end - mergeinfo_start,
+ scratch_pool));
+
+ /* Make a record of this modification in the changes table. */
+ SVN_ERR(get_dag(&new_node, to_root, to_path, scratch_pool));
+ SVN_ERR(add_change(to_root->fs, txn_id, to_path,
+ svn_fs_x__dag_get_id(new_node), kind, FALSE,
+ FALSE, FALSE, svn_fs_x__dag_node_kind(from_node),
+ from_root->rev, from_canonpath, scratch_pool));
+ }
+ else
+ {
+ /* See IZ Issue #436 */
+ /* Copying from transaction roots not currently available.
+
+ ### cmpilato todo someday: make this not so. :-) Note that
+ when copying from mutable trees, you have to make sure that
+ you aren't creating a cyclic graph filesystem, and a simple
+ referencing operation won't cut it. Currently, we should not
+ be able to reach this clause, and the interface reports that
+ this only works from immutable trees anyway, but JimB has
+ stated that this requirement need not be necessary in the
+ future. */
+
+ SVN_ERR_MALFUNCTION();
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Create a copy of FROM_PATH in FROM_ROOT named TO_PATH in TO_ROOT.
+ If FROM_PATH is a directory, copy it recursively. Temporary
+ allocations are from SCRATCH_POOL.*/
+static svn_error_t *
+x_copy(svn_fs_root_t *from_root,
+ const char *from_path,
+ svn_fs_root_t *to_root,
+ const char *to_path,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(copy_helper(from_root,
+ svn_fs__canonicalize_abspath(from_path, subpool),
+ to_root,
+ svn_fs__canonicalize_abspath(to_path, subpool),
+ TRUE, subpool));
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Create a copy of FROM_PATH in FROM_ROOT named TO_PATH in TO_ROOT.
+ If FROM_PATH is a directory, copy it recursively. No history is
+ preserved. Temporary allocations are from SCRATCH_POOL. */
+static svn_error_t *
+x_revision_link(svn_fs_root_t *from_root,
+ svn_fs_root_t *to_root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *subpool;
+
+ if (! to_root->is_txn_root)
+ return SVN_FS__NOT_TXN(to_root);
+
+ subpool = svn_pool_create(scratch_pool);
+
+ path = svn_fs__canonicalize_abspath(path, subpool);
+ SVN_ERR(copy_helper(from_root, path, to_root, path, FALSE, subpool));
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Discover the copy ancestry of PATH under ROOT. Return a relevant
+ ancestor/revision combination in *PATH_P and *REV_P. Temporary
+ allocations are in POOL. */
+static svn_error_t *
+x_copied_from(svn_revnum_t *rev_p,
+ const char **path_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+
+ /* There is no cached entry, look it up the old-fashioned
+ way. */
+ SVN_ERR(get_dag(&node, root, path, pool));
+ SVN_ERR(svn_fs_x__dag_get_copyfrom_rev(rev_p, node));
+ SVN_ERR(svn_fs_x__dag_get_copyfrom_path(path_p, node));
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Files. */
+
+/* Create the empty file PATH under ROOT. Temporary allocations are
+ in SCRATCH_POOL. */
+static svn_error_t *
+x_make_file(svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ parent_path_t *parent_path;
+ dag_node_t *child;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(root);
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ path = svn_fs__canonicalize_abspath(path, subpool);
+ SVN_ERR(open_path(&parent_path, root, path, open_path_last_optional,
+ TRUE, subpool));
+
+ /* If there's already a file by that name, complain.
+ This also catches the case of trying to make a file named `/'. */
+ if (parent_path->node)
+ return SVN_FS__ALREADY_EXISTS(root, path);
+
+ /* Check (non-recursively) to see if path is locked; if so, check
+ that we can use it. */
+ if (root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(path, root->fs, FALSE, FALSE,
+ subpool));
+
+ /* Create the file. */
+ SVN_ERR(make_path_mutable(root, parent_path->parent, path, subpool,
+ subpool));
+ SVN_ERR(svn_fs_x__dag_make_file(&child,
+ parent_path->parent->node,
+ parent_path_path(parent_path->parent,
+ subpool),
+ parent_path->entry,
+ txn_id,
+ subpool, subpool));
+
+ /* Add this file to the path cache. */
+ SVN_ERR(dag_node_cache_set(root, parent_path_path(parent_path, subpool),
+ child, subpool));
+
+ /* Make a record of this modification in the changes table. */
+ SVN_ERR(add_change(root->fs, txn_id, path, svn_fs_x__dag_get_id(child),
+ svn_fs_path_change_add, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *LENGTH_P to the size of the file PATH under ROOT. Temporary
+ allocations are in SCRATCH_POOL. */
+static svn_error_t *
+x_file_length(svn_filesize_t *length_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *file;
+
+ /* First create a dag_node_t from the root/path pair. */
+ SVN_ERR(get_dag(&file, root, path, scratch_pool));
+
+ /* Now fetch its length */
+ return svn_fs_x__dag_file_length(length_p, file);
+}
+
+
+/* Set *CHECKSUM to the checksum of type KIND for PATH under ROOT, or
+ NULL if that information isn't available. Temporary allocations
+ are from POOL. */
+static svn_error_t *
+x_file_checksum(svn_checksum_t **checksum,
+ svn_checksum_kind_t kind,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *file;
+
+ SVN_ERR(get_dag(&file, root, path, pool));
+ return svn_fs_x__dag_file_checksum(checksum, file, kind, pool);
+}
+
+
+/* --- Machinery for svn_fs_file_contents() --- */
+
+/* Set *CONTENTS to a readable stream that will return the contents of
+ PATH under ROOT. The stream is allocated in POOL. */
+static svn_error_t *
+x_file_contents(svn_stream_t **contents,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+ svn_stream_t *file_stream;
+
+ /* First create a dag_node_t from the root/path pair. */
+ SVN_ERR(get_dag(&node, root, path, pool));
+
+ /* Then create a readable stream from the dag_node_t. */
+ SVN_ERR(svn_fs_x__dag_get_contents(&file_stream, node, pool));
+
+ *contents = file_stream;
+ return SVN_NO_ERROR;
+}
+
+/* --- End machinery for svn_fs_file_contents() --- */
+
+
+/* --- Machinery for svn_fs_try_process_file_contents() --- */
+
+static svn_error_t *
+x_try_process_file_contents(svn_boolean_t *success,
+ svn_fs_root_t *root,
+ const char *path,
+ svn_fs_process_contents_func_t processor,
+ void* baton,
+ apr_pool_t *pool)
+{
+ dag_node_t *node;
+ SVN_ERR(get_dag(&node, root, path, pool));
+
+ return svn_fs_x__dag_try_process_file_contents(success, node,
+ processor, baton, pool);
+}
+
+/* --- End machinery for svn_fs_try_process_file_contents() --- */
+
+
+/* --- Machinery for svn_fs_apply_textdelta() --- */
+
+
+/* Local baton type for all the helper functions below. */
+typedef struct txdelta_baton_t
+{
+ /* This is the custom-built window consumer given to us by the delta
+ library; it uniquely knows how to read data from our designated
+ "source" stream, interpret the window, and write data to our
+ designated "target" stream (in this case, our repos file.) */
+ svn_txdelta_window_handler_t interpreter;
+ void *interpreter_baton;
+
+ /* The original file info */
+ svn_fs_root_t *root;
+ const char *path;
+
+ /* Derived from the file info */
+ dag_node_t *node;
+
+ svn_stream_t *source_stream;
+ svn_stream_t *target_stream;
+
+ /* MD5 digest for the base text against which a delta is to be
+ applied, and for the resultant fulltext, respectively. Either or
+ both may be null, in which case ignored. */
+ svn_checksum_t *base_checksum;
+ svn_checksum_t *result_checksum;
+
+ /* Pool used by db txns */
+ apr_pool_t *pool;
+
+} txdelta_baton_t;
+
+
+/* The main window handler returned by svn_fs_apply_textdelta. */
+static svn_error_t *
+window_consumer(svn_txdelta_window_t *window, void *baton)
+{
+ txdelta_baton_t *tb = (txdelta_baton_t *) baton;
+
+ /* Send the window right through to the custom window interpreter.
+ In theory, the interpreter will then write more data to
+ cb->target_string. */
+ SVN_ERR(tb->interpreter(window, tb->interpreter_baton));
+
+ /* Is the window NULL? If so, we're done. The stream has already been
+ closed by the interpreter. */
+ if (! window)
+ SVN_ERR(svn_fs_x__dag_finalize_edits(tb->node, tb->result_checksum,
+ tb->pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Helper function for fs_apply_textdelta. BATON is of type
+ txdelta_baton_t. */
+static svn_error_t *
+apply_textdelta(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ txdelta_baton_t *tb = (txdelta_baton_t *) baton;
+ parent_path_t *parent_path;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(tb->root);
+
+ /* Call open_path with no flags, as we want this to return an error
+ if the node for which we are searching doesn't exist. */
+ SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, scratch_pool));
+
+ /* Check (non-recursively) to see if path is locked; if so, check
+ that we can use it. */
+ if (tb->root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(tb->path, tb->root->fs,
+ FALSE, FALSE, scratch_pool));
+
+ /* Now, make sure this path is mutable. */
+ SVN_ERR(make_path_mutable(tb->root, parent_path, tb->path, scratch_pool,
+ scratch_pool));
+ tb->node = svn_fs_x__dag_dup(parent_path->node, tb->pool);
+
+ if (tb->base_checksum)
+ {
+ svn_checksum_t *checksum;
+
+ /* Until we finalize the node, its data_key points to the old
+ contents, in other words, the base text. */
+ SVN_ERR(svn_fs_x__dag_file_checksum(&checksum, tb->node,
+ tb->base_checksum->kind,
+ scratch_pool));
+ if (!svn_checksum_match(tb->base_checksum, checksum))
+ return svn_checksum_mismatch_err(tb->base_checksum, checksum,
+ scratch_pool,
+ _("Base checksum mismatch on '%s'"),
+ tb->path);
+ }
+
+ /* Make a readable "source" stream out of the current contents of
+ ROOT/PATH; obviously, this must done in the context of a db_txn.
+ The stream is returned in tb->source_stream. */
+ SVN_ERR(svn_fs_x__dag_get_contents(&(tb->source_stream),
+ tb->node, tb->pool));
+
+ /* Make a writable "target" stream */
+ SVN_ERR(svn_fs_x__dag_get_edit_stream(&(tb->target_stream), tb->node,
+ tb->pool));
+
+ /* Now, create a custom window handler that uses our two streams. */
+ svn_txdelta_apply(tb->source_stream,
+ tb->target_stream,
+ NULL,
+ tb->path,
+ tb->pool,
+ &(tb->interpreter),
+ &(tb->interpreter_baton));
+
+ /* Make a record of this modification in the changes table. */
+ return add_change(tb->root->fs, txn_id, tb->path,
+ svn_fs_x__dag_get_id(tb->node),
+ svn_fs_path_change_modify, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, scratch_pool);
+}
+
+
+/* Set *CONTENTS_P and *CONTENTS_BATON_P to a window handler and baton
+ that will accept text delta windows to modify the contents of PATH
+ under ROOT. Allocations are in POOL. */
+static svn_error_t *
+x_apply_textdelta(svn_txdelta_window_handler_t *contents_p,
+ void **contents_baton_p,
+ svn_fs_root_t *root,
+ const char *path,
+ svn_checksum_t *base_checksum,
+ svn_checksum_t *result_checksum,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ txdelta_baton_t *tb = apr_pcalloc(pool, sizeof(*tb));
+
+ tb->root = root;
+ tb->path = svn_fs__canonicalize_abspath(path, pool);
+ tb->pool = pool;
+ tb->base_checksum = svn_checksum_dup(base_checksum, pool);
+ tb->result_checksum = svn_checksum_dup(result_checksum, pool);
+
+ SVN_ERR(apply_textdelta(tb, scratch_pool));
+
+ *contents_p = window_consumer;
+ *contents_baton_p = tb;
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+/* --- End machinery for svn_fs_apply_textdelta() --- */
+
+/* --- Machinery for svn_fs_apply_text() --- */
+
+/* Baton for svn_fs_apply_text(). */
+typedef struct text_baton_t
+{
+ /* The original file info */
+ svn_fs_root_t *root;
+ const char *path;
+
+ /* Derived from the file info */
+ dag_node_t *node;
+
+ /* The returned stream that will accept the file's new contents. */
+ svn_stream_t *stream;
+
+ /* The actual fs stream that the returned stream will write to. */
+ svn_stream_t *file_stream;
+
+ /* MD5 digest for the final fulltext written to the file. May
+ be null, in which case ignored. */
+ svn_checksum_t *result_checksum;
+
+ /* Pool used by db txns */
+ apr_pool_t *pool;
+} text_baton_t;
+
+
+/* A wrapper around svn_fs_x__dag_finalize_edits, but for
+ * fulltext data, not text deltas. Closes BATON->file_stream.
+ *
+ * Note: If you're confused about how this function relates to another
+ * of similar name, think of it this way:
+ *
+ * svn_fs_apply_textdelta() ==> ... ==> txn_body_txdelta_finalize_edits()
+ * svn_fs_apply_text() ==> ... ==> txn_body_fulltext_finalize_edits()
+ */
+
+/* Write function for the publically returned stream. */
+static svn_error_t *
+text_stream_writer(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ text_baton_t *tb = baton;
+
+ /* Psst, here's some data. Pass it on to the -real- file stream. */
+ return svn_stream_write(tb->file_stream, data, len);
+}
+
+/* Close function for the publically returned stream. */
+static svn_error_t *
+text_stream_closer(void *baton)
+{
+ text_baton_t *tb = baton;
+
+ /* Close the internal-use stream. ### This used to be inside of
+ txn_body_fulltext_finalize_edits(), but that invoked a nested
+ Berkeley DB transaction -- scandalous! */
+ SVN_ERR(svn_stream_close(tb->file_stream));
+
+ /* Need to tell fs that we're done sending text */
+ return svn_fs_x__dag_finalize_edits(tb->node, tb->result_checksum,
+ tb->pool);
+}
+
+
+/* Helper function for fs_apply_text. BATON is of type
+ text_baton_t. */
+static svn_error_t *
+apply_text(void *baton,
+ apr_pool_t *scratch_pool)
+{
+ text_baton_t *tb = baton;
+ parent_path_t *parent_path;
+ svn_fs_x__txn_id_t txn_id = root_txn_id(tb->root);
+
+ /* Call open_path with no flags, as we want this to return an error
+ if the node for which we are searching doesn't exist. */
+ SVN_ERR(open_path(&parent_path, tb->root, tb->path, 0, TRUE, scratch_pool));
+
+ /* Check (non-recursively) to see if path is locked; if so, check
+ that we can use it. */
+ if (tb->root->txn_flags & SVN_FS_TXN_CHECK_LOCKS)
+ SVN_ERR(svn_fs_x__allow_locked_operation(tb->path, tb->root->fs,
+ FALSE, FALSE, scratch_pool));
+
+ /* Now, make sure this path is mutable. */
+ SVN_ERR(make_path_mutable(tb->root, parent_path, tb->path, scratch_pool,
+ scratch_pool));
+ tb->node = svn_fs_x__dag_dup(parent_path->node, tb->pool);
+
+ /* Make a writable stream for replacing the file's text. */
+ SVN_ERR(svn_fs_x__dag_get_edit_stream(&(tb->file_stream), tb->node,
+ tb->pool));
+
+ /* Create a 'returnable' stream which writes to the file_stream. */
+ tb->stream = svn_stream_create(tb, tb->pool);
+ svn_stream_set_write(tb->stream, text_stream_writer);
+ svn_stream_set_close(tb->stream, text_stream_closer);
+
+ /* Make a record of this modification in the changes table. */
+ return add_change(tb->root->fs, txn_id, tb->path,
+ svn_fs_x__dag_get_id(tb->node),
+ svn_fs_path_change_modify, TRUE, FALSE, FALSE,
+ svn_node_file, SVN_INVALID_REVNUM, NULL, scratch_pool);
+}
+
+
+/* Return a writable stream that will set the contents of PATH under
+ ROOT. RESULT_CHECKSUM is the MD5 checksum of the final result.
+ Temporary allocations are in POOL. */
+static svn_error_t *
+x_apply_text(svn_stream_t **contents_p,
+ svn_fs_root_t *root,
+ const char *path,
+ svn_checksum_t *result_checksum,
+ apr_pool_t *pool)
+{
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ text_baton_t *tb = apr_pcalloc(pool, sizeof(*tb));
+
+ tb->root = root;
+ tb->path = svn_fs__canonicalize_abspath(path, pool);
+ tb->pool = pool;
+ tb->result_checksum = svn_checksum_dup(result_checksum, pool);
+
+ SVN_ERR(apply_text(tb, scratch_pool));
+
+ *contents_p = tb->stream;
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+/* --- End machinery for svn_fs_apply_text() --- */
+
+
+/* Check if the contents of PATH1 under ROOT1 are different from the
+ contents of PATH2 under ROOT2. If they are different set
+ *CHANGED_P to TRUE, otherwise set it to FALSE. */
+static svn_error_t *
+x_contents_changed(svn_boolean_t *changed_p,
+ svn_fs_root_t *root1,
+ const char *path1,
+ svn_fs_root_t *root2,
+ const char *path2,
+ svn_boolean_t strict,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *node1, *node2;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+ /* Check that roots are in the same fs. */
+ if (root1->fs != root2->fs)
+ return svn_error_create
+ (SVN_ERR_FS_GENERAL, NULL,
+ _("Cannot compare file contents between two different filesystems"));
+
+ /* Check that both paths are files. */
+ {
+ svn_node_kind_t kind;
+
+ SVN_ERR(svn_fs_x__check_path(&kind, root1, path1, subpool));
+ if (kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_GENERAL, NULL, _("'%s' is not a file"), path1);
+
+ SVN_ERR(svn_fs_x__check_path(&kind, root2, path2, subpool));
+ if (kind != svn_node_file)
+ return svn_error_createf
+ (SVN_ERR_FS_GENERAL, NULL, _("'%s' is not a file"), path2);
+ }
+
+ SVN_ERR(get_dag(&node1, root1, path1, subpool));
+ SVN_ERR(get_dag(&node2, root2, path2, subpool));
+ SVN_ERR(svn_fs_x__dag_things_different(NULL, changed_p, node1, node2,
+ strict, subpool));
+
+ svn_pool_destroy(subpool);
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Public interface to computing file text deltas. */
+
+static svn_error_t *
+x_get_file_delta_stream(svn_txdelta_stream_t **stream_p,
+ svn_fs_root_t *source_root,
+ const char *source_path,
+ svn_fs_root_t *target_root,
+ const char *target_path,
+ apr_pool_t *pool)
+{
+ dag_node_t *source_node, *target_node;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ if (source_root && source_path)
+ SVN_ERR(get_dag(&source_node, source_root, source_path, scratch_pool));
+ else
+ source_node = NULL;
+ SVN_ERR(get_dag(&target_node, target_root, target_path, scratch_pool));
+
+ /* Create a delta stream that turns the source into the target. */
+ SVN_ERR(svn_fs_x__dag_get_file_delta_stream(stream_p, source_node,
+ target_node, pool,
+ scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Finding Changes */
+
+/* Copy CHANGE into a FS API object allocated in RESULT_POOL and return
+ it in *RESULT_P. Pass CONTEXT to the ID API object being created. */
+static svn_error_t *
+construct_fs_path_change(svn_fs_path_change2_t **result_p,
+ svn_fs_x__id_context_t *context,
+ svn_fs_x__change_t *change,
+ apr_pool_t *result_pool)
+{
+ const svn_fs_id_t *id
+ = svn_fs_x__id_create(context, &change->noderev_id, result_pool);
+ svn_fs_path_change2_t *result
+ = svn_fs__path_change_create_internal(id, change->change_kind,
+ result_pool);
+
+ result->text_mod = change->text_mod;
+ result->prop_mod = change->prop_mod;
+ result->node_kind = change->node_kind;
+
+ result->copyfrom_known = change->copyfrom_known;
+ result->copyfrom_rev = change->copyfrom_rev;
+ result->copyfrom_path = change->copyfrom_path;
+
+ result->mergeinfo_mod = change->mergeinfo_mod;
+
+ *result_p = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Set *CHANGED_PATHS_P to a newly allocated hash containing
+ descriptions of the paths changed under ROOT. The hash is keyed
+ with const char * paths and has svn_fs_path_change2_t * values. Use
+ POOL for all allocations. */
+static svn_error_t *
+x_paths_changed(apr_hash_t **changed_paths_p,
+ svn_fs_root_t *root,
+ apr_pool_t *pool)
+{
+ apr_hash_t *changed_paths;
+ svn_fs_path_change2_t *path_change;
+ svn_fs_x__id_context_t *context
+ = svn_fs_x__id_create_context(root->fs, pool);
+
+ if (root->is_txn_root)
+ {
+ apr_hash_index_t *hi;
+ SVN_ERR(svn_fs_x__txn_changes_fetch(&changed_paths, root->fs,
+ root_txn_id(root), pool));
+ for (hi = apr_hash_first(pool, changed_paths);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_fs_x__change_t *change = apr_hash_this_val(hi);
+ SVN_ERR(construct_fs_path_change(&path_change, context, change,
+ pool));
+ apr_hash_set(changed_paths,
+ apr_hash_this_key(hi), apr_hash_this_key_len(hi),
+ path_change);
+ }
+ }
+ else
+ {
+ apr_array_header_t *changes;
+ int i;
+
+ SVN_ERR(svn_fs_x__get_changes(&changes, root->fs, root->rev, pool));
+
+ changed_paths = svn_hash__make(pool);
+ for (i = 0; i < changes->nelts; ++i)
+ {
+ svn_fs_x__change_t *change = APR_ARRAY_IDX(changes, i,
+ svn_fs_x__change_t *);
+ SVN_ERR(construct_fs_path_change(&path_change, context, change,
+ pool));
+ apr_hash_set(changed_paths, change->path.data, change->path.len,
+ path_change);
+ }
+ }
+
+ *changed_paths_p = changed_paths;
+
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Our coolio opaque history object. */
+typedef struct fs_history_data_t
+{
+ /* filesystem object */
+ svn_fs_t *fs;
+
+ /* path and revision of historical location */
+ const char *path;
+ svn_revnum_t revision;
+
+ /* internal-use hints about where to resume the history search. */
+ const char *path_hint;
+ svn_revnum_t rev_hint;
+
+ /* FALSE until the first call to svn_fs_history_prev(). */
+ svn_boolean_t is_interesting;
+} fs_history_data_t;
+
+static svn_fs_history_t *
+assemble_history(svn_fs_t *fs,
+ const char *path,
+ svn_revnum_t revision,
+ svn_boolean_t is_interesting,
+ const char *path_hint,
+ svn_revnum_t rev_hint,
+ apr_pool_t *result_pool);
+
+
+/* Set *HISTORY_P to an opaque node history object which represents
+ PATH under ROOT. ROOT must be a revision root. Use POOL for all
+ allocations. */
+static svn_error_t *
+x_node_history(svn_fs_history_t **history_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind;
+
+ /* We require a revision root. */
+ if (root->is_txn_root)
+ return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
+
+ /* And we require that the path exist in the root. */
+ SVN_ERR(svn_fs_x__check_path(&kind, root, path, scratch_pool));
+ if (kind == svn_node_none)
+ return SVN_FS__NOT_FOUND(root, path);
+
+ /* Okay, all seems well. Build our history object and return it. */
+ *history_p = assemble_history(root->fs, path, root->rev, FALSE, NULL,
+ SVN_INVALID_REVNUM, result_pool);
+ return SVN_NO_ERROR;
+}
+
+/* Find the youngest copyroot for path PARENT_PATH or its parents in
+ filesystem FS, and store the copyroot in *REV_P and *PATH_P. */
+static svn_error_t *
+find_youngest_copyroot(svn_revnum_t *rev_p,
+ const char **path_p,
+ svn_fs_t *fs,
+ parent_path_t *parent_path)
+{
+ svn_revnum_t rev_mine;
+ svn_revnum_t rev_parent = SVN_INVALID_REVNUM;
+ const char *path_mine;
+ const char *path_parent = NULL;
+
+ /* First find our parent's youngest copyroot. */
+ if (parent_path->parent)
+ SVN_ERR(find_youngest_copyroot(&rev_parent, &path_parent, fs,
+ parent_path->parent));
+
+ /* Find our copyroot. */
+ SVN_ERR(svn_fs_x__dag_get_copyroot(&rev_mine, &path_mine,
+ parent_path->node));
+
+ /* If a parent and child were copied to in the same revision, prefer
+ the child copy target, since it is the copy relevant to the
+ history of the child. */
+ if (rev_mine >= rev_parent)
+ {
+ *rev_p = rev_mine;
+ *path_p = path_mine;
+ }
+ else
+ {
+ *rev_p = rev_parent;
+ *path_p = path_parent;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+x_closest_copy(svn_fs_root_t **root_p,
+ const char **path_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs = root->fs;
+ parent_path_t *parent_path, *copy_dst_parent_path;
+ svn_revnum_t copy_dst_rev, created_rev;
+ const char *copy_dst_path;
+ svn_fs_root_t *copy_dst_root;
+ dag_node_t *copy_dst_node;
+ svn_boolean_t related;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ /* Initialize return values. */
+ *root_p = NULL;
+ *path_p = NULL;
+
+ path = svn_fs__canonicalize_abspath(path, scratch_pool);
+ SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, scratch_pool));
+
+ /* Find the youngest copyroot in the path of this node-rev, which
+ will indicate the target of the innermost copy affecting the
+ node-rev. */
+ SVN_ERR(find_youngest_copyroot(&copy_dst_rev, &copy_dst_path,
+ fs, parent_path));
+ if (copy_dst_rev == 0) /* There are no copies affecting this node-rev. */
+ {
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+ }
+
+ /* It is possible that this node was created from scratch at some
+ revision between COPY_DST_REV and REV. Make sure that PATH
+ exists as of COPY_DST_REV and is related to this node-rev. */
+ SVN_ERR(svn_fs_x__revision_root(&copy_dst_root, fs, copy_dst_rev, pool));
+ SVN_ERR(open_path(&copy_dst_parent_path, copy_dst_root, path,
+ open_path_node_only | open_path_allow_null, FALSE,
+ scratch_pool));
+ if (copy_dst_parent_path == NULL)
+ {
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+ }
+
+ copy_dst_node = copy_dst_parent_path->node;
+ SVN_ERR(svn_fs_x__dag_related_node(&related, copy_dst_node,
+ parent_path->node));
+ if (!related)
+ {
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+ }
+
+ /* One final check must be done here. If you copy a directory and
+ create a new entity somewhere beneath that directory in the same
+ txn, then we can't claim that the copy affected the new entity.
+ For example, if you do:
+
+ copy dir1 dir2
+ create dir2/new-thing
+ commit
+
+ then dir2/new-thing was not affected by the copy of dir1 to dir2.
+ We detect this situation by asking if PATH@COPY_DST_REV's
+ created-rev is COPY_DST_REV, and that node-revision has no
+ predecessors, then there is no relevant closest copy.
+ */
+ created_rev = svn_fs_x__dag_get_revision(copy_dst_node);
+ if (created_rev == copy_dst_rev)
+ {
+ svn_fs_x__id_t pred;
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred, copy_dst_node));
+ if (!svn_fs_x__id_used(&pred))
+ {
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* The copy destination checks out. Return it. */
+ *root_p = copy_dst_root;
+ *path_p = apr_pstrdup(pool, copy_dst_path);
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+x_node_origin_rev(svn_revnum_t *revision,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__id_t node_id;
+ dag_node_t *node;
+
+ path = svn_fs__canonicalize_abspath(path, scratch_pool);
+
+ SVN_ERR(get_dag(&node, root, path, scratch_pool));
+ SVN_ERR(svn_fs_x__dag_get_node_id(&node_id, node));
+
+ *revision = svn_fs_x__get_revnum(node_id.change_set);
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+history_prev(svn_fs_history_t **prev_history,
+ svn_fs_history_t *history,
+ svn_boolean_t cross_copies,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ fs_history_data_t *fhd = history->fsap_data;
+ const char *commit_path, *src_path, *path = fhd->path;
+ svn_revnum_t commit_rev, src_rev, dst_rev;
+ svn_revnum_t revision = fhd->revision;
+ svn_fs_t *fs = fhd->fs;
+ parent_path_t *parent_path;
+ dag_node_t *node;
+ svn_fs_root_t *root;
+ svn_boolean_t reported = fhd->is_interesting;
+ svn_revnum_t copyroot_rev;
+ const char *copyroot_path;
+
+ /* Initialize our return value. */
+ *prev_history = NULL;
+
+ /* If our last history report left us hints about where to pickup
+ the chase, then our last report was on the destination of a
+ copy. If we are crossing copies, start from those locations,
+ otherwise, we're all done here. */
+ if (fhd->path_hint && SVN_IS_VALID_REVNUM(fhd->rev_hint))
+ {
+ reported = FALSE;
+ if (! cross_copies)
+ return SVN_NO_ERROR;
+ path = fhd->path_hint;
+ revision = fhd->rev_hint;
+ }
+
+ /* Construct a ROOT for the current revision. */
+ SVN_ERR(svn_fs_x__revision_root(&root, fs, revision, scratch_pool));
+
+ /* Open PATH/REVISION, and get its node and a bunch of other
+ goodies. */
+ SVN_ERR(open_path(&parent_path, root, path, 0, FALSE, scratch_pool));
+ node = parent_path->node;
+ commit_path = svn_fs_x__dag_get_created_path(node);
+ commit_rev = svn_fs_x__dag_get_revision(node);
+
+ /* The Subversion filesystem is written in such a way that a given
+ line of history may have at most one interesting history point
+ per filesystem revision. Either that node was edited (and
+ possibly copied), or it was copied but not edited. And a copy
+ source cannot be from the same revision as its destination. So,
+ if our history revision matches its node's commit revision, we
+ know that ... */
+ if (revision == commit_rev)
+ {
+ if (! reported)
+ {
+ /* ... we either have not yet reported on this revision (and
+ need now to do so) ... */
+ *prev_history = assemble_history(fs, commit_path,
+ commit_rev, TRUE, NULL,
+ SVN_INVALID_REVNUM, result_pool);
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ /* ... or we *have* reported on this revision, and must now
+ progress toward this node's predecessor (unless there is
+ no predecessor, in which case we're all done!). */
+ svn_fs_x__id_t pred_id;
+
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+ if (!svn_fs_x__id_used(&pred_id))
+ return SVN_NO_ERROR;
+
+ /* Replace NODE and friends with the information from its
+ predecessor. */
+ SVN_ERR(svn_fs_x__dag_get_node(&node, fs, &pred_id, scratch_pool,
+ scratch_pool));
+ commit_path = svn_fs_x__dag_get_created_path(node);
+ commit_rev = svn_fs_x__dag_get_revision(node);
+ }
+ }
+
+ /* Find the youngest copyroot in the path of this node, including
+ itself. */
+ SVN_ERR(find_youngest_copyroot(&copyroot_rev, &copyroot_path, fs,
+ parent_path));
+
+ /* Initialize some state variables. */
+ src_path = NULL;
+ src_rev = SVN_INVALID_REVNUM;
+ dst_rev = SVN_INVALID_REVNUM;
+
+ if (copyroot_rev > commit_rev)
+ {
+ const char *remainder_path;
+ const char *copy_dst, *copy_src;
+ svn_fs_root_t *copyroot_root;
+
+ SVN_ERR(svn_fs_x__revision_root(&copyroot_root, fs, copyroot_rev,
+ scratch_pool));
+ SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, scratch_pool));
+ copy_dst = svn_fs_x__dag_get_created_path(node);
+
+ /* If our current path was the very destination of the copy,
+ then our new current path will be the copy source. If our
+ current path was instead the *child* of the destination of
+ the copy, then figure out its previous location by taking its
+ path relative to the copy destination and appending that to
+ the copy source. Finally, if our current path doesn't meet
+ one of these other criteria ... ### for now just fallback to
+ the old copy hunt algorithm. */
+ remainder_path = svn_fspath__skip_ancestor(copy_dst, path);
+
+ if (remainder_path)
+ {
+ /* If we get here, then our current path is the destination
+ of, or the child of the destination of, a copy. Fill
+ in the return values and get outta here. */
+ SVN_ERR(svn_fs_x__dag_get_copyfrom_rev(&src_rev, node));
+ SVN_ERR(svn_fs_x__dag_get_copyfrom_path(&copy_src, node));
+
+ dst_rev = copyroot_rev;
+ src_path = svn_fspath__join(copy_src, remainder_path, scratch_pool);
+ }
+ }
+
+ /* If we calculated a copy source path and revision, we'll make a
+ 'copy-style' history object. */
+ if (src_path && SVN_IS_VALID_REVNUM(src_rev))
+ {
+ svn_boolean_t retry = FALSE;
+
+ /* It's possible for us to find a copy location that is the same
+ as the history point we've just reported. If that happens,
+ we simply need to take another trip through this history
+ search. */
+ if ((dst_rev == revision) && reported)
+ retry = TRUE;
+
+ *prev_history = assemble_history(fs, path, dst_rev, ! retry,
+ src_path, src_rev, result_pool);
+ }
+ else
+ {
+ *prev_history = assemble_history(fs, commit_path, commit_rev, TRUE,
+ NULL, SVN_INVALID_REVNUM, result_pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Implement svn_fs_history_prev, set *PREV_HISTORY_P to a new
+ svn_fs_history_t object that represents the predecessory of
+ HISTORY. If CROSS_COPIES is true, *PREV_HISTORY_P may be related
+ only through a copy operation. Perform all allocations in POOL. */
+static svn_error_t *
+fs_history_prev(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)
+{
+ svn_fs_history_t *prev_history = NULL;
+ fs_history_data_t *fhd = history->fsap_data;
+ svn_fs_t *fs = fhd->fs;
+
+ /* Special case: the root directory changes in every single
+ revision, no exceptions. And, the root can't be the target (or
+ child of a target -- duh) of a copy. So, if that's our path,
+ then we need only decrement our revision by 1, and there you go. */
+ if (strcmp(fhd->path, "/") == 0)
+ {
+ if (! fhd->is_interesting)
+ prev_history = assemble_history(fs, "/", fhd->revision,
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
+ else if (fhd->revision > 0)
+ prev_history = assemble_history(fs, "/", fhd->revision - 1,
+ 1, NULL, SVN_INVALID_REVNUM,
+ result_pool);
+ }
+ else
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ prev_history = history;
+
+ while (1)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(history_prev(&prev_history, prev_history, cross_copies,
+ result_pool, iterpool));
+
+ if (! prev_history)
+ break;
+ fhd = prev_history->fsap_data;
+ if (fhd->is_interesting)
+ break;
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ *prev_history_p = prev_history;
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *PATH and *REVISION to the path and revision for the HISTORY
+ object. Allocate *PATH in RESULT_POOL. */
+static svn_error_t *
+fs_history_location(const char **path,
+ svn_revnum_t *revision,
+ svn_fs_history_t *history,
+ apr_pool_t *result_pool)
+{
+ fs_history_data_t *fhd = history->fsap_data;
+
+ *path = apr_pstrdup(result_pool, fhd->path);
+ *revision = fhd->revision;
+ return SVN_NO_ERROR;
+}
+
+static history_vtable_t history_vtable = {
+ fs_history_prev,
+ fs_history_location
+};
+
+/* Return a new history object (marked as "interesting") for PATH and
+ REVISION, allocated in RESULT_POOL, and with its members set to the
+ values of the parameters provided. Note that PATH and PATH_HINT get
+ normalized and duplicated in RESULT_POOL. */
+static svn_fs_history_t *
+assemble_history(svn_fs_t *fs,
+ const char *path,
+ svn_revnum_t revision,
+ svn_boolean_t is_interesting,
+ const char *path_hint,
+ svn_revnum_t rev_hint,
+ apr_pool_t *result_pool)
+{
+ svn_fs_history_t *history = apr_pcalloc(result_pool, sizeof(*history));
+ fs_history_data_t *fhd = apr_pcalloc(result_pool, sizeof(*fhd));
+ fhd->path = svn_fs__canonicalize_abspath(path, result_pool);
+ fhd->revision = revision;
+ fhd->is_interesting = is_interesting;
+ fhd->path_hint = path_hint
+ ? svn_fs__canonicalize_abspath(path_hint, result_pool)
+ : NULL;
+ fhd->rev_hint = rev_hint;
+ fhd->fs = fs;
+
+ history->vtable = &history_vtable;
+ history->fsap_data = fhd;
+ return history;
+}
+
+
+/* mergeinfo queries */
+
+
+/* DIR_DAG is a directory DAG node which has mergeinfo in its
+ descendants. This function iterates over its children. For each
+ child with immediate mergeinfo, it adds its mergeinfo to
+ RESULT_CATALOG. appropriate arguments. For each child with
+ descendants with mergeinfo, it recurses. Note that it does *not*
+ call the action on the path for DIR_DAG itself.
+
+ POOL is used for temporary allocations, including the mergeinfo
+ hashes passed to actions; RESULT_POOL is used for the mergeinfo added
+ to RESULT_CATALOG.
+ */
+static svn_error_t *
+crawl_directory_dag_for_mergeinfo(svn_fs_root_t *root,
+ const char *this_path,
+ dag_node_t *dir_dag,
+ svn_mergeinfo_catalog_t result_catalog,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *entries;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_fs_x__dag_dir_entries(&entries, dir_dag, scratch_pool,
+ iterpool));
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *dirent = APR_ARRAY_IDX(entries, i, svn_fs_x__dirent_t *);
+ const char *kid_path;
+ dag_node_t *kid_dag;
+ svn_boolean_t has_mergeinfo, go_down;
+
+ svn_pool_clear(iterpool);
+
+ kid_path = svn_fspath__join(this_path, dirent->name, iterpool);
+ SVN_ERR(get_dag(&kid_dag, root, kid_path, iterpool));
+
+ SVN_ERR(svn_fs_x__dag_has_mergeinfo(&has_mergeinfo, kid_dag));
+ SVN_ERR(svn_fs_x__dag_has_descendants_with_mergeinfo(&go_down, kid_dag));
+
+ if (has_mergeinfo)
+ {
+ /* Save this particular node's mergeinfo. */
+ apr_hash_t *proplist;
+ svn_mergeinfo_t kid_mergeinfo;
+ svn_string_t *mergeinfo_string;
+ svn_error_t *err;
+
+ SVN_ERR(svn_fs_x__dag_get_proplist(&proplist, kid_dag, iterpool,
+ iterpool));
+ mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
+ if (!mergeinfo_string)
+ {
+ svn_string_t *idstr
+ = svn_fs_x__id_unparse(&dirent->id, iterpool);
+ return svn_error_createf
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Node-revision #'%s' claims to have mergeinfo but doesn't"),
+ idstr->data);
+ }
+
+ /* Issue #3896: If a node has syntactically invalid mergeinfo, then
+ treat it as if no mergeinfo is present rather than raising a parse
+ error. */
+ err = svn_mergeinfo_parse(&kid_mergeinfo,
+ mergeinfo_string->data,
+ result_pool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ svn_error_clear(err);
+ else
+ return svn_error_trace(err);
+ }
+ else
+ {
+ svn_hash_sets(result_catalog, apr_pstrdup(result_pool, kid_path),
+ kid_mergeinfo);
+ }
+ }
+
+ if (go_down)
+ SVN_ERR(crawl_directory_dag_for_mergeinfo(root,
+ kid_path,
+ kid_dag,
+ result_catalog,
+ result_pool,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+/* Return the cache key as a combination of REV_ROOT->REV, the inheritance
+ flags INHERIT and ADJUST_INHERITED_MERGEINFO, and the PATH. The result
+ will be allocated in RESULT_POOL.
+ */
+static const char *
+mergeinfo_cache_key(const char *path,
+ svn_fs_root_t *rev_root,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t adjust_inherited_mergeinfo,
+ apr_pool_t *result_pool)
+{
+ apr_int64_t number = rev_root->rev;
+ number = number * 4
+ + (inherit == svn_mergeinfo_nearest_ancestor ? 2 : 0)
+ + (adjust_inherited_mergeinfo ? 1 : 0);
+
+ return svn_fs_x__combine_number_and_string(number, path, result_pool);
+}
+
+/* Calculates the mergeinfo for PATH under REV_ROOT using inheritance
+ type INHERIT. Returns it in *MERGEINFO, or NULL if there is none.
+ The result is allocated in RESULT_POOL; SCRATCH_POOL is
+ used for temporary allocations.
+ */
+static svn_error_t *
+get_mergeinfo_for_path_internal(svn_mergeinfo_t *mergeinfo,
+ svn_fs_root_t *rev_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)
+{
+ parent_path_t *parent_path, *nearest_ancestor;
+ apr_hash_t *proplist;
+ svn_string_t *mergeinfo_string;
+
+ path = svn_fs__canonicalize_abspath(path, scratch_pool);
+
+ SVN_ERR(open_path(&parent_path, rev_root, path, 0, FALSE, scratch_pool));
+
+ if (inherit == svn_mergeinfo_nearest_ancestor && ! parent_path->parent)
+ return SVN_NO_ERROR;
+
+ if (inherit == svn_mergeinfo_nearest_ancestor)
+ nearest_ancestor = parent_path->parent;
+ else
+ nearest_ancestor = parent_path;
+
+ while (TRUE)
+ {
+ svn_boolean_t has_mergeinfo;
+
+ SVN_ERR(svn_fs_x__dag_has_mergeinfo(&has_mergeinfo,
+ nearest_ancestor->node));
+ if (has_mergeinfo)
+ break;
+
+ /* No need to loop if we're looking for explicit mergeinfo. */
+ if (inherit == svn_mergeinfo_explicit)
+ {
+ return SVN_NO_ERROR;
+ }
+
+ nearest_ancestor = nearest_ancestor->parent;
+
+ /* Run out? There's no mergeinfo. */
+ if (!nearest_ancestor)
+ {
+ return SVN_NO_ERROR;
+ }
+ }
+
+ SVN_ERR(svn_fs_x__dag_get_proplist(&proplist, nearest_ancestor->node,
+ scratch_pool, scratch_pool));
+ mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
+ if (!mergeinfo_string)
+ return svn_error_createf
+ (SVN_ERR_FS_CORRUPT, NULL,
+ _("Node-revision '%s@%ld' claims to have mergeinfo but doesn't"),
+ parent_path_path(nearest_ancestor, scratch_pool), rev_root->rev);
+
+ /* Parse the mergeinfo; store the result in *MERGEINFO. */
+ {
+ /* Issue #3896: If a node has syntactically invalid mergeinfo, then
+ treat it as if no mergeinfo is present rather than raising a parse
+ error. */
+ svn_error_t *err = svn_mergeinfo_parse(mergeinfo,
+ mergeinfo_string->data,
+ result_pool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ {
+ svn_error_clear(err);
+ err = NULL;
+ *mergeinfo = NULL;
+ }
+ return svn_error_trace(err);
+ }
+ }
+
+ /* If our nearest ancestor is the very path we inquired about, we
+ can return the mergeinfo results directly. Otherwise, we're
+ inheriting the mergeinfo, so we need to a) remove non-inheritable
+ ranges and b) telescope the merged-from paths. */
+ if (adjust_inherited_mergeinfo && (nearest_ancestor != parent_path))
+ {
+ svn_mergeinfo_t tmp_mergeinfo;
+
+ SVN_ERR(svn_mergeinfo_inheritable2(&tmp_mergeinfo, *mergeinfo,
+ NULL, SVN_INVALID_REVNUM,
+ SVN_INVALID_REVNUM, TRUE,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_fs__append_to_merged_froms(mergeinfo, tmp_mergeinfo,
+ parent_path_relpath(
+ parent_path, nearest_ancestor,
+ scratch_pool),
+ result_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Caching wrapper around get_mergeinfo_for_path_internal().
+ */
+static svn_error_t *
+get_mergeinfo_for_path(svn_mergeinfo_t *mergeinfo,
+ svn_fs_root_t *rev_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)
+{
+ svn_fs_x__data_t *ffd = rev_root->fs->fsap_data;
+ const char *cache_key;
+ svn_boolean_t found = FALSE;
+ svn_stringbuf_t *mergeinfo_exists;
+
+ *mergeinfo = NULL;
+
+ cache_key = mergeinfo_cache_key(path, rev_root, inherit,
+ adjust_inherited_mergeinfo, scratch_pool);
+ if (ffd->mergeinfo_existence_cache)
+ {
+ SVN_ERR(svn_cache__get((void **)&mergeinfo_exists, &found,
+ ffd->mergeinfo_existence_cache,
+ cache_key, result_pool));
+ if (found && mergeinfo_exists->data[0] == '1')
+ SVN_ERR(svn_cache__get((void **)mergeinfo, &found,
+ ffd->mergeinfo_cache,
+ cache_key, result_pool));
+ }
+
+ if (! found)
+ {
+ SVN_ERR(get_mergeinfo_for_path_internal(mergeinfo, rev_root, path,
+ inherit,
+ adjust_inherited_mergeinfo,
+ result_pool, scratch_pool));
+ if (ffd->mergeinfo_existence_cache)
+ {
+ mergeinfo_exists = svn_stringbuf_create(*mergeinfo ? "1" : "0",
+ scratch_pool);
+ SVN_ERR(svn_cache__set(ffd->mergeinfo_existence_cache,
+ cache_key, mergeinfo_exists, scratch_pool));
+ if (*mergeinfo)
+ SVN_ERR(svn_cache__set(ffd->mergeinfo_cache,
+ cache_key, *mergeinfo, scratch_pool));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Adds mergeinfo for each descendant of PATH (but not PATH itself)
+ under ROOT to RESULT_CATALOG. Returned values are allocated in
+ RESULT_POOL; temporary values in POOL. */
+static svn_error_t *
+add_descendant_mergeinfo(svn_mergeinfo_catalog_t result_catalog,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *this_dag;
+ svn_boolean_t go_down;
+
+ SVN_ERR(get_dag(&this_dag, root, path, scratch_pool));
+ SVN_ERR(svn_fs_x__dag_has_descendants_with_mergeinfo(&go_down,
+ this_dag));
+ if (go_down)
+ SVN_ERR(crawl_directory_dag_for_mergeinfo(root,
+ path,
+ this_dag,
+ result_catalog,
+ result_pool,
+ scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+
+/* Get the mergeinfo for a set of paths, returned in
+ *MERGEINFO_CATALOG. Returned values are allocated in
+ POOL, while temporary values are allocated in a sub-pool. */
+static svn_error_t *
+get_mergeinfos_for_paths(svn_fs_root_t *root,
+ svn_mergeinfo_catalog_t *mergeinfo_catalog,
+ const apr_array_header_t *paths,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t include_descendants,
+ svn_boolean_t adjust_inherited_mergeinfo,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_mergeinfo_catalog_t result_catalog = svn_hash__make(result_pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ for (i = 0; i < paths->nelts; i++)
+ {
+ svn_error_t *err;
+ svn_mergeinfo_t path_mergeinfo;
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+
+ svn_pool_clear(iterpool);
+
+ err = get_mergeinfo_for_path(&path_mergeinfo, root, path,
+ inherit, adjust_inherited_mergeinfo,
+ result_pool, iterpool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ {
+ svn_error_clear(err);
+ err = NULL;
+ path_mergeinfo = NULL;
+ }
+ else
+ {
+ return svn_error_trace(err);
+ }
+ }
+
+ if (path_mergeinfo)
+ svn_hash_sets(result_catalog, path, path_mergeinfo);
+ if (include_descendants)
+ SVN_ERR(add_descendant_mergeinfo(result_catalog, root, path,
+ result_pool, scratch_pool));
+ }
+ svn_pool_destroy(iterpool);
+
+ *mergeinfo_catalog = result_catalog;
+ return SVN_NO_ERROR;
+}
+
+
+/* Implements svn_fs_get_mergeinfo. */
+static svn_error_t *
+x_get_mergeinfo(svn_mergeinfo_catalog_t *catalog,
+ svn_fs_root_t *root,
+ const apr_array_header_t *paths,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t include_descendants,
+ svn_boolean_t adjust_inherited_mergeinfo,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* We require a revision root. */
+ if (root->is_txn_root)
+ return svn_error_create(SVN_ERR_FS_NOT_REVISION_ROOT, NULL, NULL);
+
+ /* Retrieve a path -> mergeinfo hash mapping. */
+ return get_mergeinfos_for_paths(root, catalog, paths,
+ inherit,
+ include_descendants,
+ adjust_inherited_mergeinfo,
+ result_pool, scratch_pool);
+}
+
+
+/* The vtable associated with root objects. */
+static root_vtable_t root_vtable = {
+ x_paths_changed,
+ svn_fs_x__check_path,
+ x_node_history,
+ x_node_id,
+ x_node_relation,
+ svn_fs_x__node_created_rev,
+ x_node_origin_rev,
+ x_node_created_path,
+ x_delete_node,
+ x_copy,
+ x_revision_link,
+ x_copied_from,
+ x_closest_copy,
+ x_node_prop,
+ x_node_proplist,
+ x_node_has_props,
+ x_change_node_prop,
+ x_props_changed,
+ x_dir_entries,
+ x_dir_optimal_order,
+ x_make_dir,
+ x_file_length,
+ x_file_checksum,
+ x_file_contents,
+ x_try_process_file_contents,
+ x_make_file,
+ x_apply_textdelta,
+ x_apply_text,
+ x_contents_changed,
+ x_get_file_delta_stream,
+ x_merge,
+ x_get_mergeinfo,
+};
+
+/* Construct a new root object in FS, allocated from RESULT_POOL. */
+static svn_fs_root_t *
+make_root(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ svn_fs_root_t *root = apr_pcalloc(result_pool, sizeof(*root));
+
+ root->fs = fs;
+ root->pool = result_pool;
+ root->vtable = &root_vtable;
+
+ return root;
+}
+
+
+/* Construct a root object referring to the root of revision REV in FS.
+ Create the new root in RESULT_POOL. */
+static svn_fs_root_t *
+make_revision_root(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ svn_fs_root_t *root = make_root(fs, result_pool);
+
+ root->is_txn_root = FALSE;
+ root->rev = rev;
+
+ return root;
+}
+
+
+/* Construct a root object referring to the root of the transaction
+ named TXN and based on revision BASE_REV in FS, with FLAGS to
+ describe transaction's behavior. Create the new root in RESULT_POOL. */
+static svn_error_t *
+make_txn_root(svn_fs_root_t **root_p,
+ svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ svn_revnum_t base_rev,
+ apr_uint32_t flags,
+ apr_pool_t *result_pool)
+{
+ svn_fs_root_t *root = make_root(fs, result_pool);
+ fs_txn_root_data_t *frd = apr_pcalloc(root->pool, sizeof(*frd));
+ frd->txn_id = txn_id;
+
+ root->is_txn_root = TRUE;
+ root->txn = svn_fs_x__txn_name(txn_id, root->pool);
+ root->txn_flags = flags;
+ root->rev = base_rev;
+
+ /* Because this cache actually tries to invalidate elements, keep
+ the number of elements per page down.
+
+ Note that since dag_node_cache_invalidate uses svn_cache__iter,
+ this *cannot* be a memcache-based cache. */
+ SVN_ERR(svn_cache__create_inprocess(&(frd->txn_node_cache),
+ svn_fs_x__dag_serialize,
+ svn_fs_x__dag_deserialize,
+ APR_HASH_KEY_STRING,
+ 32, 20, FALSE,
+ root->txn,
+ root->pool));
+
+ root->fsap_data = frd;
+
+ *root_p = root;
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Verify. */
+static const char *
+stringify_node(dag_node_t *node,
+ apr_pool_t *result_pool)
+{
+ /* ### TODO: print some PATH@REV to it, too. */
+ return svn_fs_x__id_unparse(svn_fs_x__dag_get_id(node), result_pool)->data;
+}
+
+/* Check metadata sanity on NODE, and on its children. Manually verify
+ information for DAG nodes in revision REV, and trust the metadata
+ accuracy for nodes belonging to older revisions. To detect cycles,
+ provide all parent dag_node_t * in PARENT_NODES. */
+static svn_error_t *
+verify_node(dag_node_t *node,
+ svn_revnum_t rev,
+ apr_array_header_t *parent_nodes,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t has_mergeinfo;
+ apr_int64_t mergeinfo_count;
+ svn_fs_x__id_t pred_id;
+ svn_fs_t *fs = svn_fs_x__dag_get_fs(node);
+ int pred_count;
+ svn_node_kind_t kind;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* Detect (non-)DAG cycles. */
+ for (i = 0; i < parent_nodes->nelts; ++i)
+ {
+ dag_node_t *parent = APR_ARRAY_IDX(parent_nodes, i, dag_node_t *);
+ if (svn_fs_x__id_eq(svn_fs_x__dag_get_id(parent),
+ svn_fs_x__dag_get_id(node)))
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Node is its own direct or indirect parent '%s'",
+ stringify_node(node, iterpool));
+ }
+
+ /* Fetch some data. */
+ SVN_ERR(svn_fs_x__dag_has_mergeinfo(&has_mergeinfo, node));
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_count, node));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_count, node));
+ kind = svn_fs_x__dag_node_kind(node);
+
+ /* Sanity check. */
+ if (mergeinfo_count < 0)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Negative mergeinfo-count %" APR_INT64_T_FMT
+ " on node '%s'",
+ mergeinfo_count, stringify_node(node, iterpool));
+
+ /* Issue #4129. (This check will explicitly catch non-root instances too.) */
+ if (svn_fs_x__id_used(&pred_id))
+ {
+ dag_node_t *pred;
+ int pred_pred_count;
+ SVN_ERR(svn_fs_x__dag_get_node(&pred, fs, &pred_id, iterpool,
+ iterpool));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_pred_count, pred));
+ if (pred_pred_count+1 != pred_count)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Predecessor count mismatch: "
+ "%s has %d, but %s has %d",
+ stringify_node(node, iterpool), pred_count,
+ stringify_node(pred, iterpool),
+ pred_pred_count);
+ }
+
+ /* Kind-dependent verifications. */
+ if (kind == svn_node_none)
+ {
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Node '%s' has kind 'none'",
+ stringify_node(node, iterpool));
+ }
+ if (kind == svn_node_file)
+ {
+ if (has_mergeinfo != mergeinfo_count) /* comparing int to bool */
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "File node '%s' has inconsistent mergeinfo: "
+ "has_mergeinfo=%d, "
+ "mergeinfo_count=%" APR_INT64_T_FMT,
+ stringify_node(node, iterpool),
+ has_mergeinfo, mergeinfo_count);
+ }
+ if (kind == svn_node_dir)
+ {
+ apr_array_header_t *entries;
+ apr_int64_t children_mergeinfo = 0;
+ APR_ARRAY_PUSH(parent_nodes, dag_node_t*) = node;
+
+ SVN_ERR(svn_fs_x__dag_dir_entries(&entries, node, scratch_pool,
+ iterpool));
+
+ /* Compute CHILDREN_MERGEINFO. */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__dirent_t *dirent
+ = APR_ARRAY_IDX(entries, i, svn_fs_x__dirent_t *);
+ dag_node_t *child;
+ apr_int64_t child_mergeinfo;
+
+ svn_pool_clear(iterpool);
+
+ /* Compute CHILD_REV. */
+ if (svn_fs_x__get_revnum(dirent->id.change_set) == rev)
+ {
+ SVN_ERR(svn_fs_x__dag_get_node(&child, fs, &dirent->id,
+ iterpool, iterpool));
+ SVN_ERR(verify_node(child, rev, parent_nodes, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&child_mergeinfo,
+ child));
+ }
+ else
+ {
+ SVN_ERR(svn_fs_x__get_mergeinfo_count(&child_mergeinfo, fs,
+ &dirent->id, iterpool));
+ }
+
+ children_mergeinfo += child_mergeinfo;
+ }
+
+ /* Side-effect of issue #4129. */
+ if (children_mergeinfo+has_mergeinfo != mergeinfo_count)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Mergeinfo-count discrepancy on '%s': "
+ "expected %" APR_INT64_T_FMT "+%d, "
+ "counted %" APR_INT64_T_FMT,
+ stringify_node(node, iterpool),
+ mergeinfo_count, has_mergeinfo,
+ children_mergeinfo);
+
+ /* If we don't make it here, there was an error / corruption.
+ * In that case, nobody will need PARENT_NODES anymore. */
+ apr_array_pop(parent_nodes);
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__verify_root(svn_fs_root_t *root,
+ apr_pool_t *scratch_pool)
+{
+ dag_node_t *root_dir;
+ apr_array_header_t *parent_nodes;
+
+ /* Issue #4129: bogus pred-counts and minfo-cnt's on the root node-rev
+ (and elsewhere). This code makes more thorough checks than the
+ commit-time checks in validate_root_noderev(). */
+
+ /* Callers should disable caches by setting SVN_FS_CONFIG_FSX_CACHE_NS;
+ see r1462436.
+
+ When this code is called in the library, we want to ensure we
+ use the on-disk data --- rather than some data that was read
+ in the possibly-distance past and cached since. */
+ SVN_ERR(root_node(&root_dir, root, scratch_pool, scratch_pool));
+
+ /* Recursively verify ROOT_DIR. */
+ parent_nodes = apr_array_make(scratch_pool, 16, sizeof(dag_node_t *));
+ SVN_ERR(verify_node(root_dir, root->rev, parent_nodes, scratch_pool));
+
+ /* Verify explicitly the predecessor of the root. */
+ {
+ svn_fs_x__id_t pred_id;
+ svn_boolean_t has_predecessor;
+
+ /* Only r0 should have no predecessor. */
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, root_dir));
+ has_predecessor = svn_fs_x__id_used(&pred_id);
+ if (!root->is_txn_root && has_predecessor != !!root->rev)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "r%ld's root node's predecessor is "
+ "unexpectedly '%s'",
+ root->rev,
+ (has_predecessor
+ ? svn_fs_x__id_unparse(&pred_id,
+ scratch_pool)->data
+ : "(null)"));
+ if (root->is_txn_root && !has_predecessor)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Transaction '%s''s root node's predecessor is "
+ "unexpectedly NULL",
+ root->txn);
+
+ /* Check the predecessor's revision. */
+ if (has_predecessor)
+ {
+ svn_revnum_t pred_rev = svn_fs_x__get_revnum(pred_id.change_set);
+ if (! root->is_txn_root && pred_rev+1 != root->rev)
+ /* Issue #4129. */
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "r%ld's root node's predecessor is r%ld"
+ " but should be r%ld",
+ root->rev, pred_rev, root->rev - 1);
+ if (root->is_txn_root && pred_rev != root->rev)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ "Transaction '%s''s root node's predecessor"
+ " is r%ld"
+ " but should be r%ld",
+ root->txn, pred_rev, root->rev);
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/tree.h b/subversion/libsvn_fs_x/tree.h
new file mode 100644
index 0000000..9c5d44a
--- /dev/null
+++ b/subversion/libsvn_fs_x/tree.h
@@ -0,0 +1,112 @@
+/* tree.h : internal interface to tree node functions
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS_TREE_H
+#define SVN_LIBSVN_FS_TREE_H
+
+#include "fs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* In RESULT_POOL, create an instance of a DAG node 1st level cache. */
+svn_fs_x__dag_cache_t*
+svn_fs_x__create_dag_cache(apr_pool_t *result_pool);
+
+/* Set *ROOT_P to the root directory of revision REV in filesystem FS.
+ Allocate the structure in POOL. */
+svn_error_t *
+svn_fs_x__revision_root(svn_fs_root_t **root_p,
+ svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *pool);
+
+/* Does nothing, but included for Subversion 1.0.x compatibility. */
+svn_error_t *
+svn_fs_x__deltify(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool);
+
+/* Commit the transaction TXN as a new revision. Return the new
+ revision in *NEW_REV. If the transaction conflicts with other
+ changes return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a string
+ that details the cause of the conflict. */
+svn_error_t *
+svn_fs_x__commit_txn(const char **conflict_p,
+ svn_revnum_t *new_rev,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+/* Set ROOT_P to the root directory of transaction TXN. Allocate the
+ structure in POOL. */
+svn_error_t *
+svn_fs_x__txn_root(svn_fs_root_t **root_p,
+ svn_fs_txn_t *txn,
+ apr_pool_t *pool);
+
+
+/* Set KIND_P to the node kind of the node at PATH in ROOT.
+ Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__check_path(svn_node_kind_t *kind_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool);
+
+/* Set *REVISION to the revision in which PATH under ROOT was created.
+ Use SCRATCH_POOL for any temporary allocations. If PATH is in an
+ uncommitted transaction, *REVISION will be set to
+ SVN_INVALID_REVNUM. */
+svn_error_t *
+svn_fs_x__node_created_rev(svn_revnum_t *revision,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool);
+
+/* Verify metadata for ROOT.
+ ### Currently only implemented for revision roots. */
+svn_error_t *
+svn_fs_x__verify_root(svn_fs_root_t *root,
+ apr_pool_t *scratch_pool);
+
+svn_error_t *
+svn_fs_x__info_format(int *fs_format,
+ svn_version_t **supports_version,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+svn_error_t *
+svn_fs_x__info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_TREE_H */
diff --git a/subversion/libsvn_fs_x/util.c b/subversion/libsvn_fs_x/util.c
new file mode 100644
index 0000000..da004ad
--- /dev/null
+++ b/subversion/libsvn_fs_x/util.c
@@ -0,0 +1,777 @@
+/* util.c --- utility functions for FSX repo access
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_ctype.h"
+#include "svn_dirent_uri.h"
+#include "private/svn_string_private.h"
+
+#include "fs_x.h"
+#include "id.h"
+#include "util.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+/* Following are defines that specify the textual elements of the
+ native filesystem directories and revision files. */
+
+/* Notes:
+
+To avoid opening and closing the rev-files all the time, it would
+probably be advantageous to keep each rev-file open for the
+lifetime of the transaction object. I'll leave that as a later
+optimization for now.
+
+I didn't keep track of pool lifetimes at all in this code. There
+are likely some errors because of that.
+
+*/
+
+/* Pathname helper functions */
+
+/* Return TRUE is REV is packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_x__is_packed_rev(svn_fs_t *fs, svn_revnum_t rev)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ return (rev < ffd->min_unpacked_rev);
+}
+
+/* Return TRUE is REV is packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_x__is_packed_revprop(svn_fs_t *fs, svn_revnum_t rev)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ /* rev 0 will not be packed */
+ return (rev < ffd->min_unpacked_rev) && (rev != 0);
+}
+
+svn_revnum_t
+svn_fs_x__packed_base_rev(svn_fs_t *fs, svn_revnum_t rev)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ return rev < ffd->min_unpacked_rev
+ ? rev - (rev % ffd->max_files_per_dir)
+ : rev;
+}
+
+svn_revnum_t
+svn_fs_x__pack_size(svn_fs_t *fs, svn_revnum_t rev)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+
+ return rev < ffd->min_unpacked_rev ? ffd->max_files_per_dir : 1;
+}
+
+const char *
+svn_fs_x__path_format(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_FORMAT, result_pool);
+}
+
+const char *
+svn_fs_x__path_uuid(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_UUID, result_pool);
+}
+
+const char *
+svn_fs_x__path_current(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_CURRENT, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_current(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_CURRENT,
+ result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_current_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_CURRENT_LOCK, result_pool);
+}
+
+const char *
+svn_fs_x__path_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_LOCK_FILE, result_pool);
+}
+
+const char *
+svn_fs_x__path_pack_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_PACK_LOCK_FILE, result_pool);
+}
+
+const char *
+svn_fs_x__path_revprop_generation(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_REVPROP_GENERATION, result_pool);
+}
+
+/* Return the full path of the file FILENAME within revision REV's shard in
+ * FS. If FILENAME is NULL, return the shard directory directory itself.
+ * REVPROPS indicates the parent of the shard parent folder ("revprops" or
+ * "revs"). PACKED says whether we want the packed shard's name.
+ *
+ * Allocate the result in RESULT_POOL.
+ */static const char*
+construct_shard_sub_path(svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_boolean_t revprops,
+ svn_boolean_t packed,
+ const char *filename,
+ apr_pool_t *result_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ char buffer[SVN_INT64_BUFFER_SIZE + sizeof(PATH_EXT_PACKED_SHARD)] = { 0 };
+
+ /* Select the appropriate parent path constant. */
+ const char *parent = revprops ? PATH_REVPROPS_DIR : PATH_REVS_DIR;
+
+ /* String containing the shard number. */
+ apr_size_t len = svn__i64toa(buffer, rev / ffd->max_files_per_dir);
+
+ /* Append the suffix. Limit it to the buffer size (should never hit it). */
+ if (packed)
+ strncpy(buffer + len, PATH_EXT_PACKED_SHARD, sizeof(buffer) - len - 1);
+
+ /* This will also work for NULL FILENAME as well. */
+ return svn_dirent_join_many(result_pool, fs->path, parent, buffer,
+ filename, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_x__path_rev_packed(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *kind,
+ apr_pool_t *result_pool)
+{
+ assert(svn_fs_x__is_packed_rev(fs, rev));
+ return construct_shard_sub_path(fs, rev, FALSE, TRUE, kind, result_pool);
+}
+
+const char *
+svn_fs_x__path_rev_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ return construct_shard_sub_path(fs, rev, FALSE, FALSE, NULL, result_pool);
+}
+
+const char *
+svn_fs_x__path_rev(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ svn__i64toa(buffer, rev);
+
+ assert(! svn_fs_x__is_packed_rev(fs, rev));
+ return construct_shard_sub_path(fs, rev, FALSE, FALSE, buffer, result_pool);
+}
+
+const char *
+svn_fs_x__path_rev_absolute(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ return svn_fs_x__is_packed_rev(fs, rev)
+ ? svn_fs_x__path_rev_packed(fs, rev, PATH_PACKED, result_pool)
+ : svn_fs_x__path_rev(fs, rev, result_pool);
+}
+
+const char *
+svn_fs_x__path_revprops_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ return construct_shard_sub_path(fs, rev, TRUE, FALSE, NULL, result_pool);
+}
+
+const char *
+svn_fs_x__path_revprops_pack_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ return construct_shard_sub_path(fs, rev, TRUE, TRUE, NULL, result_pool);
+}
+
+const char *
+svn_fs_x__path_revprops(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool)
+{
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ svn__i64toa(buffer, rev);
+
+ assert(! svn_fs_x__is_packed_revprop(fs, rev));
+ return construct_shard_sub_path(fs, rev, TRUE, FALSE, buffer, result_pool);
+}
+
+const char *
+svn_fs_x__txn_name(svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ char *p = apr_palloc(result_pool, SVN_INT64_BUFFER_SIZE);
+ svn__ui64tobase36(p, txn_id);
+ return p;
+}
+
+svn_error_t *
+svn_fs_x__txn_by_name(svn_fs_x__txn_id_t *txn_id,
+ const char *txn_name)
+{
+ const char *next;
+ apr_uint64_t id = svn__base36toui64(&next, txn_name);
+ if (next == NULL || *next != 0 || *txn_name == 0)
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "Malformed TXN name '%s'", txn_name);
+
+ *txn_id = id;
+ return SVN_NO_ERROR;
+}
+
+const char *
+svn_fs_x__path_txns_dir(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXNS_DIR, result_pool);
+}
+
+/* Return the full path of the file FILENAME within transaction TXN_ID's
+ * transaction directory in FS. If FILENAME is NULL, return the transaction
+ * directory itself.
+ *
+ * Allocate the result in RESULT_POOL.
+ */
+static const char *
+construct_txn_path(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const char *filename,
+ apr_pool_t *result_pool)
+{
+ /* Construct the transaction directory name without temp. allocations. */
+ char buffer[SVN_INT64_BUFFER_SIZE + sizeof(PATH_EXT_TXN)] = { 0 };
+ apr_size_t len = svn__ui64tobase36(buffer, txn_id);
+ strncpy(buffer + len, PATH_EXT_TXN, sizeof(buffer) - len - 1);
+
+ /* If FILENAME is NULL, it will terminate the list of segments
+ to concatenate. */
+ return svn_dirent_join_many(result_pool, fs->path, PATH_TXNS_DIR,
+ buffer, filename, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_x__path_txn_dir(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, NULL, result_pool);
+}
+
+/* Return the name of the sha1->rep mapping file in transaction TXN_ID
+ * within FS for the given SHA1 checksum. Use POOL for allocations.
+ */
+const char *
+svn_fs_x__path_txn_sha1(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const unsigned char *sha1,
+ apr_pool_t *pool)
+{
+ svn_checksum_t checksum;
+ checksum.digest = sha1;
+ checksum.kind = svn_checksum_sha1;
+
+ return svn_dirent_join(svn_fs_x__path_txn_dir(fs, txn_id, pool),
+ svn_checksum_to_cstring(&checksum, pool),
+ pool);
+}
+
+const char *
+svn_fs_x__path_txn_changes(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_CHANGES, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_props(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_TXN_PROPS, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_props_final(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_TXN_PROPS_FINAL, result_pool);
+}
+
+const char*
+svn_fs_x__path_l2p_proto_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_INDEX PATH_EXT_L2P_INDEX,
+ result_pool);
+}
+
+const char*
+svn_fs_x__path_p2l_proto_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_INDEX PATH_EXT_P2L_INDEX,
+ result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_next_ids(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_NEXT_IDS, result_pool);
+}
+
+const char *
+svn_fs_x__path_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_MIN_UNPACKED_REV, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_proto_revs(svn_fs_t *fs,
+ apr_pool_t *result_pool)
+{
+ return svn_dirent_join(fs->path, PATH_TXN_PROTOS_DIR, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_item_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_txn_path(fs, txn_id, PATH_TXN_ITEM_INDEX, result_pool);
+}
+
+/* Return the full path of the proto-rev file / lock file for transaction
+ * TXN_ID in FS. The SUFFIX determines what file (rev / lock) it will be.
+ *
+ * Allocate the result in RESULT_POOL.
+ */
+static const char *
+construct_proto_rev_path(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const char *suffix,
+ apr_pool_t *result_pool)
+{
+ /* Construct the file name without temp. allocations. */
+ char buffer[SVN_INT64_BUFFER_SIZE + sizeof(PATH_EXT_REV_LOCK)] = { 0 };
+ apr_size_t len = svn__ui64tobase36(buffer, txn_id);
+ strncpy(buffer + len, suffix, sizeof(buffer) - len - 1);
+
+ /* If FILENAME is NULL, it will terminate the list of segments
+ to concatenate. */
+ return svn_dirent_join_many(result_pool, fs->path, PATH_TXN_PROTOS_DIR,
+ buffer, SVN_VA_NULL);
+}
+
+const char *
+svn_fs_x__path_txn_proto_rev(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_proto_rev_path(fs, txn_id, PATH_EXT_REV, result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_proto_rev_lock(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool)
+{
+ return construct_proto_rev_path(fs, txn_id, PATH_EXT_REV_LOCK, result_pool);
+}
+
+/* Return the full path of the noderev-related file with the extension SUFFIX
+ * for noderev *ID in transaction TXN_ID in FS.
+ *
+ * Allocate the result in RESULT_POOL and temporaries in SCRATCH_POOL.
+ */
+static const char *
+construct_txn_node_path(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ const char *suffix,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *filename = svn_fs_x__id_unparse(id, result_pool)->data;
+ apr_int64_t txn_id = svn_fs_x__get_txn_id(id->change_set);
+
+ return svn_dirent_join(svn_fs_x__path_txn_dir(fs, txn_id, scratch_pool),
+ apr_psprintf(scratch_pool, PATH_PREFIX_NODE "%s%s",
+ filename, suffix),
+ result_pool);
+}
+
+const char *
+svn_fs_x__path_txn_node_rev(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return construct_txn_node_path(fs, id, "", result_pool, scratch_pool);
+}
+
+const char *
+svn_fs_x__path_txn_node_props(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return construct_txn_node_path(fs, id, PATH_EXT_PROPS, result_pool,
+ scratch_pool);
+}
+
+const char *
+svn_fs_x__path_txn_node_children(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return construct_txn_node_path(fs, id, PATH_EXT_CHILDREN, result_pool,
+ scratch_pool);
+}
+
+svn_error_t *
+svn_fs_x__check_file_buffer_numeric(const char *buf,
+ apr_off_t offset,
+ const char *path,
+ const char *title,
+ apr_pool_t *scratch_pool)
+{
+ const char *p;
+
+ for (p = buf + offset; *p; p++)
+ if (!svn_ctype_isdigit(*p))
+ return svn_error_createf(SVN_ERR_BAD_VERSION_FILE_FORMAT, NULL,
+ _("%s file '%s' contains unexpected non-digit '%c' within '%s'"),
+ title, svn_dirent_local_style(path, scratch_pool), *p, buf);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ char buf[80];
+ apr_file_t *file;
+ apr_size_t len;
+
+ SVN_ERR(svn_io_file_open(&file,
+ svn_fs_x__path_min_unpacked_rev(fs, scratch_pool),
+ APR_READ | APR_BUFFERED,
+ APR_OS_DEFAULT,
+ scratch_pool));
+ len = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(file, buf, &len, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+
+ SVN_ERR(svn_revnum_parse(min_unpacked_rev, buf, NULL));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__update_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ return svn_fs_x__read_min_unpacked_rev(&ffd->min_unpacked_rev, fs,
+ scratch_pool);
+}
+
+/* Write a file FILENAME in directory FS_PATH, containing a single line
+ * with the number REVNUM in ASCII decimal. Move the file into place
+ * atomically, overwriting any existing file.
+ *
+ * Similar to write_current(). */
+svn_error_t *
+svn_fs_x__write_min_unpacked_rev(svn_fs_t *fs,
+ svn_revnum_t revnum,
+ apr_pool_t *scratch_pool)
+{
+ const char *final_path;
+ char buf[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__i64toa(buf, revnum);
+ buf[len] = '\n';
+
+ final_path = svn_fs_x__path_min_unpacked_rev(fs, scratch_pool);
+
+ SVN_ERR(svn_io_write_atomic(final_path, buf, len + 1,
+ final_path /* copy_perms */, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_current(svn_revnum_t *rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ const char *str;
+ svn_stringbuf_t *content;
+ SVN_ERR(svn_fs_x__read_content(&content,
+ svn_fs_x__path_current(fs, scratch_pool),
+ scratch_pool));
+ SVN_ERR(svn_revnum_parse(rev, content->data, &str));
+ if (*str != '\n')
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
+ _("Corrupt 'current' file"));
+
+ return SVN_NO_ERROR;
+}
+
+/* Atomically update the 'current' file to hold the specifed REV.
+ Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__write_current(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool)
+{
+ char *buf;
+ const char *tmp_name, *name;
+
+ /* Now we can just write out this line. */
+ buf = apr_psprintf(scratch_pool, "%ld\n", rev);
+
+ name = svn_fs_x__path_current(fs, scratch_pool);
+ SVN_ERR(svn_io_write_unique(&tmp_name,
+ svn_dirent_dirname(name, scratch_pool),
+ buf, strlen(buf),
+ svn_io_file_del_none, scratch_pool));
+
+ return svn_fs_x__move_into_place(tmp_name, name, name, scratch_pool);
+}
+
+
+svn_error_t *
+svn_fs_x__try_stringbuf_from_file(svn_stringbuf_t **content,
+ svn_boolean_t *missing,
+ const char *path,
+ svn_boolean_t last_attempt,
+ apr_pool_t *result_pool)
+{
+ svn_error_t *err = svn_stringbuf_from_file2(content, path, result_pool);
+ if (missing)
+ *missing = FALSE;
+
+ if (err)
+ {
+ *content = NULL;
+
+ if (APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ if (!last_attempt)
+ {
+ svn_error_clear(err);
+ if (missing)
+ *missing = TRUE;
+ return SVN_NO_ERROR;
+ }
+ }
+#ifdef ESTALE
+ else if (APR_TO_OS_ERROR(err->apr_err) == ESTALE
+ || APR_TO_OS_ERROR(err->apr_err) == EIO)
+ {
+ if (!last_attempt)
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ }
+#endif
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Fetch the current offset of FILE into *OFFSET_P. */
+svn_error_t *
+svn_fs_x__get_file_offset(apr_off_t *offset_p,
+ apr_file_t *file,
+ apr_pool_t *scratch_pool)
+{
+ apr_off_t offset;
+
+ /* Note that, for buffered files, one (possibly surprising) side-effect
+ of this call is to flush any unwritten data to disk. */
+ offset = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_CUR, &offset, scratch_pool));
+ *offset_p = offset;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__read_content(svn_stringbuf_t **content,
+ const char *fname,
+ apr_pool_t *result_pool)
+{
+ int i;
+ *content = NULL;
+
+ for (i = 0; !*content && (i < SVN_FS_X__RECOVERABLE_RETRY_COUNT); ++i)
+ SVN_ERR(svn_fs_x__try_stringbuf_from_file(content, NULL,
+ fname, i + 1 < SVN_FS_X__RECOVERABLE_RETRY_COUNT,
+ result_pool));
+
+ if (!*content)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Can't read '%s'"),
+ svn_dirent_local_style(fname, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Reads a line from STREAM and converts it to a 64 bit integer to be
+ * returned in *RESULT. If we encounter eof, set *HIT_EOF and leave
+ * *RESULT unchanged. If HIT_EOF is NULL, EOF causes an "corrupt FS"
+ * error return.
+ * SCRATCH_POOL is used for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_number_from_stream(apr_int64_t *result,
+ svn_boolean_t *hit_eof,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *sb;
+ svn_boolean_t eof;
+ svn_error_t *err;
+
+ SVN_ERR(svn_stream_readline(stream, &sb, "\n", &eof, scratch_pool));
+ if (hit_eof)
+ *hit_eof = eof;
+ else
+ if (eof)
+ return svn_error_create(SVN_ERR_FS_CORRUPT, NULL, _("Unexpected EOF"));
+
+ if (!eof)
+ {
+ err = svn_cstring_atoi64(result, sb->data);
+ if (err)
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
+ _("Number '%s' invalid or too large"),
+ sb->data);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Move a file into place from OLD_FILENAME in the transactions
+ directory to its final location NEW_FILENAME in the repository. On
+ Unix, match the permissions of the new file to the permissions of
+ PERMS_REFERENCE. Temporary allocations are from SCRATCH_POOL.
+
+ This function almost duplicates svn_io_file_move(), but it tries to
+ guarantee a flush. */
+svn_error_t *
+svn_fs_x__move_into_place(const char *old_filename,
+ const char *new_filename,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+
+ SVN_ERR(svn_io_copy_perms(perms_reference, old_filename, scratch_pool));
+
+ /* Move the file into place. */
+ err = svn_io_file_rename(old_filename, new_filename, scratch_pool);
+ if (err && APR_STATUS_IS_EXDEV(err->apr_err))
+ {
+ apr_file_t *file;
+
+ /* Can't rename across devices; fall back to copying. */
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ SVN_ERR(svn_io_copy_file(old_filename, new_filename, TRUE,
+ scratch_pool));
+
+ /* Flush the target of the copy to disk. */
+ SVN_ERR(svn_io_file_open(&file, new_filename, APR_READ,
+ APR_OS_DEFAULT, scratch_pool));
+ /* ### BH: Does this really guarantee a flush of the data written
+ ### via a completely different handle on all operating systems?
+ ###
+ ### Maybe we should perform the copy ourselves instead of making
+ ### apr do that and flush the real handle? */
+ SVN_ERR(svn_io_file_flush_to_disk(file, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+ }
+ if (err)
+ return svn_error_trace(err);
+
+#ifdef __linux__
+ {
+ /* Linux has the unusual feature that fsync() on a file is not
+ enough to ensure that a file's directory entries have been
+ flushed to disk; you have to fsync the directory as well.
+ On other operating systems, we'd only be asking for trouble
+ by trying to open and fsync a directory. */
+ const char *dirname;
+ apr_file_t *file;
+
+ dirname = svn_dirent_dirname(new_filename, scratch_pool);
+ SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT,
+ scratch_pool));
+ SVN_ERR(svn_io_file_flush_to_disk(file, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+ }
+#endif
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/util.h b/subversion/libsvn_fs_x/util.h
new file mode 100644
index 0000000..0010723
--- /dev/null
+++ b/subversion/libsvn_fs_x/util.h
@@ -0,0 +1,476 @@
+/* util.h --- utility functions for FSX repo access
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__UTIL_H
+#define SVN_LIBSVN_FS__UTIL_H
+
+#include "svn_fs.h"
+#include "id.h"
+
+/* Functions for dealing with recoverable errors on mutable files
+ *
+ * Revprops, current, and txn-current files are mutable; that is, they
+ * change as part of normal fsx operation, in constrat to revs files, or
+ * the format file, which are written once at create (or upgrade) time.
+ * When more than one host writes to the same repository, we will
+ * sometimes see these recoverable errors when accesssing these files.
+ *
+ * These errors all relate to NFS, and thus we only use this retry code if
+ * ESTALE is defined.
+ *
+ ** ESTALE
+ *
+ * In NFS v3 and under, the server doesn't track opened files. If you
+ * unlink(2) or rename(2) a file held open by another process *on the
+ * same host*, that host's kernel typically renames the file to
+ * .nfsXXXX and automatically deletes that when it's no longer open,
+ * but this behavior is not required.
+ *
+ * For obvious reasons, this does not work *across hosts*. No one
+ * knows about the opened file; not the server, and not the deleting
+ * client. So the file vanishes, and the reader gets stale NFS file
+ * handle.
+ *
+ ** EIO, ENOENT
+ *
+ * Some client implementations (at least the 2.6.18.5 kernel that ships
+ * with Ubuntu Dapper) sometimes give spurious ENOENT (only on open) or
+ * even EIO errors when trying to read these files that have been renamed
+ * over on some other host.
+ *
+ ** Solution
+ *
+ * Try open and read of such files in try_stringbuf_from_file(). Call
+ * this function within a loop of SVN_FS_X__RECOVERABLE_RETRY_COUNT
+ * iterations (though, realistically, the second try will succeed).
+ */
+
+#define SVN_FS_X__RECOVERABLE_RETRY_COUNT 10
+
+/* Pathname helper functions */
+
+/* Return TRUE is REV is packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_x__is_packed_rev(svn_fs_t *fs,
+ svn_revnum_t rev);
+
+/* Return TRUE is REV is packed in FS, FALSE otherwise. */
+svn_boolean_t
+svn_fs_x__is_packed_revprop(svn_fs_t *fs,
+ svn_revnum_t rev);
+
+/* Return the first revision in the pack / rev file containing REV in
+ * filesystem FS. For non-packed revs, this will simply be REV. */
+svn_revnum_t
+svn_fs_x__packed_base_rev(svn_fs_t *fs,
+ svn_revnum_t rev);
+
+/* Return the number of revisions in the pack / rev file in FS that contains
+ * revision REV. */
+svn_revnum_t
+svn_fs_x__pack_size(svn_fs_t *fs, svn_revnum_t rev);
+
+/* Return the full path of the "format" file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_format(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the path to the 'current' file in FS.
+ Perform allocation in RESULT_POOL. */
+const char *
+svn_fs_x__path_current(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the "uuid" file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_uuid(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the "txn-current" file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_current(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the "txn-current-lock" file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_current_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the global write lock file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the pack operation lock file in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_pack_lock(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the revprop generation file in FS.
+ * Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_revprop_generation(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the path of the pack-related file that for revision REV in FS.
+ * KIND specifies the file name base, e.g. "pack".
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_rev_packed(svn_fs_t *fs,
+ svn_revnum_t rev,
+ const char *kind,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the rev shard directory that will contain
+ * revision REV in FS. Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_rev_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the non-packed rev file containing revision REV
+ * in FS. Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_rev(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Set *PATH to the path of REV in FS, whether in a pack file or not.
+ Allocate *PATH in RESULT_POOL.
+
+ Note: If the caller does not have the write lock on FS, then the path is
+ not guaranteed to be correct or to remain correct after the function
+ returns, because the revision might become packed before or after this
+ call. If a file exists at that path, then it is correct; if not, then
+ the caller should call update_min_unpacked_rev() and re-try once. */
+const char *
+svn_fs_x__path_rev_absolute(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the revision properties shard directory that
+ * will contain the properties of revision REV in FS.
+ * Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_revprops_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the revision properties pack shard directory
+ * that will contain the packed properties of revision REV in FS.
+ * Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_revprops_pack_shard(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Return the full path of the non-packed revision properties file that
+ * contains the props for revision REV in FS.
+ * Allocate the result in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_revprops(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool);
+
+/* Convert the TXN_ID into a string, allocated from RESULT_POOL.
+ */
+const char *
+svn_fs_x__txn_name(svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Convert TXN_NAME into an ID and return it in *TXN_ID. */
+svn_error_t *
+svn_fs_x__txn_by_name(svn_fs_x__txn_id_t *txn_id,
+ const char *txn_name);
+
+/* Return the path of the directory containing the transaction TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_dir(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the 'transactions' directory in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txns_dir(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the name of the sha1->rep mapping file in transaction TXN_ID
+ * within FS for the given SHA1 checksum. Use POOL for allocations.
+ */
+const char *
+svn_fs_x__path_txn_sha1(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ const unsigned char *sha1,
+ apr_pool_t *pool);
+
+/* Return the path of the 'txn-protorevs' directory in FS, even if that
+ * folder may not exist in FS. The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_proto_revs(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the path of the changes file for transaction TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_changes(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the log-to-phys index for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char*
+svn_fs_x__path_l2p_proto_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the phys-to-log index for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char*
+svn_fs_x__path_p2l_proto_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the transaction properties for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_props(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the "final" transaction
+ * properties for the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_props_final(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the node and copy ID counters for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_next_ids(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file storing the oldest non-packed revision in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing item_index counter for
+ * the transaction identified by TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_item_index(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the proto-revision file for transaction TXN_ID in FS.
+ * The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_proto_rev(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the proto-revision lock file for transaction TXN_ID
+ * in FS. The result will be allocated in RESULT_POOL.
+ */
+const char *
+svn_fs_x__path_txn_proto_rev_lock(svn_fs_t *fs,
+ svn_fs_x__txn_id_t txn_id,
+ apr_pool_t *result_pool);
+
+/* Return the path of the file containing the in-transaction node revision
+ * identified by ID in FS.
+ * The result will be allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
+ */
+const char *
+svn_fs_x__path_txn_node_rev(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return the path of the file containing the in-transaction properties of
+ * the node identified by ID in FS.
+ * The result will be allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
+ */
+const char *
+svn_fs_x__path_txn_node_props(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Return the path of the file containing the directory entries of the
+ * in-transaction directory node identified by ID in FS.
+ * The result will be allocated in RESULT_POOL, temporaries in SCRATCH_POOL.
+ */
+const char *
+svn_fs_x__path_txn_node_children(svn_fs_t *fs,
+ const svn_fs_x__id_t *id,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Check that BUF, a nul-terminated buffer of text from file PATH,
+ contains only digits at OFFSET and beyond, raising an error if not.
+ TITLE contains a user-visible description of the file, usually the
+ short file name.
+
+ Uses SCRATCH_POOL for temporary allocation. */
+svn_error_t *
+svn_fs_x__check_file_buffer_numeric(const char *buf,
+ apr_off_t offset,
+ const char *path,
+ const char *title,
+ apr_pool_t *scratch_pool);
+
+/* Set *MIN_UNPACKED_REV to the integer value read from the file returned
+ * by #svn_fs_fs__path_min_unpacked_rev() for FS.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_min_unpacked_rev(svn_revnum_t *min_unpacked_rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Re-read the MIN_UNPACKED_REV member of FS from disk.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__update_min_unpacked_rev(svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Atomically update the 'min-unpacked-rev' file in FS to hold the specifed
+ * REVNUM. Perform temporary allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__write_min_unpacked_rev(svn_fs_t *fs,
+ svn_revnum_t revnum,
+ apr_pool_t *scratch_pool);
+
+/* Set *REV to the value read from the 'current' file. Perform temporary
+ * allocations in SCRATCH_POOL.
+ */
+svn_error_t *
+svn_fs_x__read_current(svn_revnum_t *rev,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool);
+
+/* Atomically update the 'current' file to hold the specifed REV.
+ Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__write_current(svn_fs_t *fs,
+ svn_revnum_t rev,
+ apr_pool_t *scratch_pool);
+
+/* Read the file at PATH and return its content in *CONTENT, allocated in
+ * RESULT_POOL. *CONTENT will not be modified unless the whole file was
+ * read successfully.
+ *
+ * ESTALE, EIO and ENOENT will not cause this function to return an error
+ * unless LAST_ATTEMPT has been set. If MISSING is not NULL, indicate
+ * missing files (ENOENT) there.
+ */
+svn_error_t *
+svn_fs_x__try_stringbuf_from_file(svn_stringbuf_t **content,
+ svn_boolean_t *missing,
+ const char *path,
+ svn_boolean_t last_attempt,
+ apr_pool_t *result_pool);
+
+/* Fetch the current offset of FILE into *OFFSET_P.
+ * Perform temporary allocations in SCRATCH_POOL. */
+svn_error_t *
+svn_fs_x__get_file_offset(apr_off_t *offset_p,
+ apr_file_t *file,
+ apr_pool_t *scratch_pool);
+
+/* Read the file FNAME and store the contents in *BUF.
+ Allocations are performed in RESULT_POOL. */
+svn_error_t *
+svn_fs_x__read_content(svn_stringbuf_t **content,
+ const char *fname,
+ apr_pool_t *result_pool);
+
+/* Reads a line from STREAM and converts it to a 64 bit integer to be
+ * returned in *RESULT. If we encounter eof, set *HIT_EOF and leave
+ * *RESULT unchanged. If HIT_EOF is NULL, EOF causes an "corrupt FS"
+ * error return.
+ * SCRATCH_POOL is used for temporary allocations.
+ */
+svn_error_t *
+svn_fs_x__read_number_from_stream(apr_int64_t *result,
+ svn_boolean_t *hit_eof,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool);
+
+/* Move a file into place from OLD_FILENAME in the transactions
+ directory to its final location NEW_FILENAME in the repository. On
+ Unix, match the permissions of the new file to the permissions of
+ PERMS_REFERENCE. Temporary allocations are from SCRATCH_POOL.
+
+ This function almost duplicates svn_io_file_move(), but it tries to
+ guarantee a flush. */
+svn_error_t *
+svn_fs_x__move_into_place(const char *old_filename,
+ const char *new_filename,
+ const char *perms_reference,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_fs_x/verify.c b/subversion/libsvn_fs_x/verify.c
new file mode 100644
index 0000000..4ea0728
--- /dev/null
+++ b/subversion/libsvn_fs_x/verify.c
@@ -0,0 +1,850 @@
+/* verify.c --- verification of FSX filesystems
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "verify.h"
+#include "fs_x.h"
+#include "svn_time.h"
+#include "private/svn_subr_private.h"
+
+#include "cached_data.h"
+#include "rep-cache.h"
+#include "util.h"
+#include "index.h"
+
+#include "../libsvn_fs/fs-loader.h"
+
+#include "svn_private_config.h"
+
+
+/** Verifying. **/
+
+/* Baton type expected by verify_walker(). The purpose is to limit the
+ * number of notifications sent.
+ */
+typedef struct verify_walker_baton_t
+{
+ /* number of calls to verify_walker() since the last clean */
+ int iteration_count;
+
+ /* progress notification callback to invoke periodically (may be NULL) */
+ svn_fs_progress_notify_func_t notify_func;
+
+ /* baton to use with NOTIFY_FUNC */
+ void *notify_baton;
+
+ /* remember the last revision for which we called notify_func */
+ svn_revnum_t last_notified_revision;
+} verify_walker_baton_t;
+
+/* Used by svn_fs_x__verify().
+ Implements svn_fs_x__walk_rep_reference().walker. */
+static svn_error_t *
+verify_walker(svn_fs_x__representation_t *rep,
+ void *baton,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ verify_walker_baton_t *walker_baton = baton;
+
+ /* notify and free resources periodically */
+ if (walker_baton->iteration_count > 1000)
+ {
+ svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
+ if ( walker_baton->notify_func
+ && revision != walker_baton->last_notified_revision)
+ {
+ walker_baton->notify_func(revision,
+ walker_baton->notify_baton,
+ scratch_pool);
+ walker_baton->last_notified_revision = revision;
+ }
+
+ walker_baton->iteration_count = 0;
+ }
+
+ /* access the repo data */
+ SVN_ERR(svn_fs_x__check_rep(rep, fs, scratch_pool));
+
+ /* update resource usage counters */
+ walker_baton->iteration_count++;
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify the rep cache DB's consistency with our rev / pack data.
+ * The function signature is similar to svn_fs_x__verify.
+ * The values of START and END have already been auto-selected and
+ * verified.
+ */
+static svn_error_t *
+verify_rep_cache(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t exists;
+
+ /* rep-cache verification. */
+ SVN_ERR(svn_fs_x__exists_rep_cache(&exists, fs, scratch_pool));
+ if (exists)
+ {
+ /* provide a baton to allow the reuse of open file handles between
+ iterations (saves 2/3 of OS level file operations). */
+ verify_walker_baton_t *baton
+ = apr_pcalloc(scratch_pool, sizeof(*baton));
+
+ baton->last_notified_revision = SVN_INVALID_REVNUM;
+ baton->notify_func = notify_func;
+ baton->notify_baton = notify_baton;
+
+ /* tell the user that we are now ready to do *something* */
+ if (notify_func)
+ notify_func(SVN_INVALID_REVNUM, notify_baton, scratch_pool);
+
+ /* Do not attempt to walk the rep-cache database if its file does
+ not exist, since doing so would create it --- which may confuse
+ the administrator. Don't take any lock. */
+ SVN_ERR(svn_fs_x__walk_rep_reference(fs, start, end,
+ verify_walker, baton,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the MD5 checksum of the data between offsets START and END
+ * in FILE matches the EXPECTED checksum. If there is a mismatch use the
+ * indedx NAME in the error message. Supports cancellation with CANCEL_FUNC
+ * and CANCEL_BATON. SCRATCH_POOL is for temporary allocations. */
+static svn_error_t *
+verify_index_checksum(apr_file_t *file,
+ const char *name,
+ apr_off_t start,
+ apr_off_t end,
+ svn_checksum_t *expected,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[SVN__STREAM_CHUNK_SIZE];
+ apr_off_t size = end - start;
+ svn_checksum_t *actual;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_md5, scratch_pool);
+
+ /* Calculate the index checksum. */
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &start, scratch_pool));
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(file, buffer, to_read, NULL, NULL,
+ scratch_pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ SVN_ERR(svn_checksum_final(&actual, context, scratch_pool));
+
+ /* Verify that it matches the expected checksum. */
+ if (!svn_checksum_match(expected, actual))
+ {
+ const char *file_name;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, scratch_pool));
+ SVN_ERR(svn_checksum_mismatch_err(expected, actual, scratch_pool,
+ _("%s checksum mismatch in file %s"),
+ name, file_name));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify the MD5 checksums of the index data in the rev / pack file
+ * containing revision START in FS. If given, invoke CANCEL_FUNC with
+ * CANCEL_BATON at regular intervals. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+verify_index_checksums(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__revision_file_t *rev_file;
+
+ /* Open the rev / pack file and read the footer */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, start,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_fs_x__auto_read_footer(rev_file));
+
+ /* Verify the index contents against the checksum from the footer. */
+ SVN_ERR(verify_index_checksum(rev_file->file, "L2P index",
+ rev_file->l2p_offset, rev_file->p2l_offset,
+ rev_file->l2p_checksum,
+ cancel_func, cancel_baton, scratch_pool));
+ SVN_ERR(verify_index_checksum(rev_file->file, "P2L index",
+ rev_file->p2l_offset, rev_file->footer_offset,
+ rev_file->p2l_checksum,
+ cancel_func, cancel_baton, scratch_pool));
+
+ /* Done. */
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all log-to-phys index entries for revisions START to
+ * START + COUNT-1 in FS there is a consistent entry in the phys-to-log
+ * index. If given, invoke CANCEL_FUNC with CANCEL_BATON at regular
+ * intervals. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+compare_l2p_to_p2l_index(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_revnum_t i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_array_header_t *max_ids;
+
+ /* common file access structure */
+ svn_fs_x__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, start, scratch_pool,
+ iterpool));
+
+ /* determine the range of items to check for each revision */
+ SVN_ERR(svn_fs_x__l2p_get_max_ids(&max_ids, fs, start, count, scratch_pool,
+ iterpool));
+
+ /* check all items in all revisions if the given range */
+ for (i = 0; i < max_ids->nelts; ++i)
+ {
+ apr_uint64_t k;
+ apr_uint64_t max_id = APR_ARRAY_IDX(max_ids, i, apr_uint64_t);
+ svn_revnum_t revision = start + i;
+
+ for (k = 0; k < max_id; ++k)
+ {
+ apr_off_t offset;
+ apr_uint32_t sub_item;
+ svn_fs_x__id_t l2p_item;
+ svn_fs_x__id_t *p2l_item;
+
+ l2p_item.change_set = svn_fs_x__change_set_by_rev(revision);
+ l2p_item.number = k;
+
+ /* get L2P entry. Ignore unused entries. */
+ SVN_ERR(svn_fs_x__item_offset(&offset, &sub_item, fs, rev_file,
+ &l2p_item, iterpool));
+ if (offset == -1)
+ continue;
+
+ /* find the corresponding P2L entry */
+ SVN_ERR(svn_fs_x__p2l_item_lookup(&p2l_item, fs, rev_file,
+ revision, offset, sub_item,
+ iterpool, iterpool));
+
+ if (p2l_item == NULL)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index entry not found for "
+ "PHYS o%s:s%ld returned by "
+ "l2p index for LOG r%ld:i%ld"),
+ apr_off_t_toa(scratch_pool, offset),
+ (long)sub_item, revision, (long)k);
+
+ if (!svn_fs_x__id_eq(&l2p_item, p2l_item))
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index info LOG r%ld:i%ld"
+ " does not match "
+ "l2p index for LOG r%ld:i%ld"),
+ svn_fs_x__get_revnum(p2l_item->change_set),
+ (long)p2l_item->number, revision,
+ (long)k);
+
+ svn_pool_clear(iterpool);
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all phys-to-log index entries for revisions START to
+ * START + COUNT-1 in FS there is a consistent entry in the log-to-phys
+ * index. If given, invoke CANCEL_FUNC with CANCEL_BATON at regular
+ * intervals. Use SCRATCH_POOL for temporary allocations.
+ *
+ * Please note that we can only check on pack / rev file granularity and
+ * must only be called for a single rev / pack file.
+ */
+static svn_error_t *
+compare_p2l_to_l2p_index(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool2 = svn_pool_create(scratch_pool);
+ apr_off_t max_offset;
+ apr_off_t offset = 0;
+
+ /* common file access structure */
+ svn_fs_x__revision_file_t *rev_file;
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, start, scratch_pool,
+ iterpool));
+
+ /* get the size of the rev / pack file as covered by the P2L index */
+ SVN_ERR(svn_fs_x__p2l_get_max_offset(&max_offset, fs, rev_file, start,
+ scratch_pool));
+
+ /* for all offsets in the file, get the P2L index entries and check
+ them against the L2P index */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+ svn_fs_x__p2l_entry_t *last_entry;
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ /* get all entries for the current block */
+ SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, fs, rev_file, start,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+ if (entries->nelts == 0)
+ return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION,
+ NULL,
+ _("p2l does not cover offset %s"
+ " for revision %ld"),
+ apr_off_t_toa(scratch_pool, offset), start);
+
+ /* process all entries (and later continue with the next block) */
+ last_entry
+ = &APR_ARRAY_IDX(entries, entries->nelts-1, svn_fs_x__p2l_entry_t);
+ offset = last_entry->offset + last_entry->size;
+
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ apr_uint32_t k;
+ svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t);
+
+ /* check all sub-items for consist entries in the L2P index */
+ for (k = 0; k < entry->item_count; ++k)
+ {
+ apr_off_t l2p_offset;
+ apr_uint32_t sub_item;
+ svn_fs_x__id_t *p2l_item = &entry->items[k];
+ svn_revnum_t revision
+ = svn_fs_x__get_revnum(p2l_item->change_set);
+
+ svn_pool_clear(iterpool2);
+ SVN_ERR(svn_fs_x__item_offset(&l2p_offset, &sub_item, fs,
+ rev_file, p2l_item, iterpool2));
+
+ if (sub_item != k || l2p_offset != entry->offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("l2p index entry PHYS o%s:s%ld "
+ "does not match p2l index value "
+ "LOG r%ld:i%ld for PHYS o%s:s%ld"),
+ apr_off_t_toa(scratch_pool,
+ l2p_offset),
+ (long)sub_item,
+ revision,
+ (long)p2l_item->number,
+ apr_off_t_toa(scratch_pool,
+ entry->offset),
+ (long)k);
+ }
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool2);
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_fs_x__close_revision_file(rev_file));
+
+ return SVN_NO_ERROR;
+}
+
+/* Items smaller than this can be read at once into a buffer and directly
+ * be checksummed. Larger items require stream processing.
+ * Must be a multiple of 8. */
+#define STREAM_THRESHOLD 4096
+
+/* Verify that the next SIZE bytes read from FILE are NUL. SIZE must not
+ * exceed STREAM_THRESHOLD. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+expect_buffer_nul(apr_file_t *file,
+ apr_off_t size,
+ apr_pool_t *scratch_pool)
+{
+ union
+ {
+ unsigned char buffer[STREAM_THRESHOLD];
+ apr_uint64_t chunks[STREAM_THRESHOLD / sizeof(apr_uint64_t)];
+ } data;
+
+ apr_size_t i;
+ SVN_ERR_ASSERT(size <= STREAM_THRESHOLD);
+
+ /* read the whole data block; error out on failure */
+ data.chunks[(size - 1)/ sizeof(apr_uint64_t)] = 0;
+ SVN_ERR(svn_io_file_read_full2(file, data.buffer, size, NULL, NULL,
+ scratch_pool));
+
+ /* chunky check */
+ for (i = 0; i < size / sizeof(apr_uint64_t); ++i)
+ if (data.chunks[i] != 0)
+ break;
+
+ /* byte-wise check upon mismatch or at the end of the block */
+ for (i *= sizeof(apr_uint64_t); i < size; ++i)
+ if (data.buffer[i] != 0)
+ {
+ const char *file_name;
+ apr_off_t offset;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, scratch_pool));
+ SVN_ERR(svn_fs_x__get_file_offset(&offset, file, scratch_pool));
+ offset -= size - i;
+
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Empty section in file %s contains "
+ "non-NUL data at offset %s"),
+ file_name,
+ apr_off_t_toa(scratch_pool, offset));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the next SIZE bytes read from FILE are NUL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+read_all_nul(apr_file_t *file,
+ apr_off_t size,
+ apr_pool_t *scratch_pool)
+{
+ for (; size >= STREAM_THRESHOLD; size -= STREAM_THRESHOLD)
+ SVN_ERR(expect_buffer_nul(file, STREAM_THRESHOLD, scratch_pool));
+
+ if (size)
+ SVN_ERR(expect_buffer_nul(file, size, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Compare the ACTUAL checksum with the one expected by ENTRY.
+ * Return an error in case of mismatch. Use the name of FILE
+ * in error message. Allocate temporary data in SCRATCH_POOL.
+ */
+static svn_error_t *
+expected_checksum(apr_file_t *file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_uint32_t actual,
+ apr_pool_t *scratch_pool)
+{
+ if (actual != entry->fnv1_checksum)
+ {
+ const char *file_name;
+
+ SVN_ERR(svn_io_file_name_get(&file_name, file, scratch_pool));
+ SVN_ERR(svn_io_file_name_get(&file_name, file, scratch_pool));
+ return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
+ _("Checksum mismatch in item at offset %s of "
+ "length %s bytes in file %s"),
+ apr_off_t_toa(scratch_pool, entry->offset),
+ apr_off_t_toa(scratch_pool, entry->size),
+ file_name);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the FNV checksum over the next ENTRY->SIZE bytes read
+ * from FILE will match ENTRY's expected checksum. SIZE must not
+ * exceed STREAM_THRESHOLD. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+expected_buffered_checksum(apr_file_t *file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[STREAM_THRESHOLD];
+ SVN_ERR_ASSERT(entry->size <= STREAM_THRESHOLD);
+
+ SVN_ERR(svn_io_file_read_full2(file, buffer, (apr_size_t)entry->size,
+ NULL, NULL, scratch_pool));
+ SVN_ERR(expected_checksum(file, entry,
+ svn__fnv1a_32x4(buffer, (apr_size_t)entry->size),
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the FNV checksum over the next ENTRY->SIZE bytes read from
+ * FILE will match ENTRY's expected checksum.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+expected_streamed_checksum(apr_file_t *file,
+ svn_fs_x__p2l_entry_t *entry,
+ apr_pool_t *scratch_pool)
+{
+ unsigned char buffer[STREAM_THRESHOLD];
+ svn_checksum_t *checksum;
+ svn_checksum_ctx_t *context
+ = svn_checksum_ctx_create(svn_checksum_fnv1a_32x4, scratch_pool);
+ apr_off_t size = entry->size;
+
+ while (size > 0)
+ {
+ apr_size_t to_read = size > sizeof(buffer)
+ ? sizeof(buffer)
+ : (apr_size_t)size;
+ SVN_ERR(svn_io_file_read_full2(file, buffer, to_read, NULL, NULL,
+ scratch_pool));
+ SVN_ERR(svn_checksum_update(context, buffer, to_read));
+ size -= to_read;
+ }
+
+ SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
+ SVN_ERR(expected_checksum(file, entry,
+ ntohl(*(const apr_uint32_t *)checksum->digest),
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that for all phys-to-log index entries for revisions START to
+ * START + COUNT-1 in FS match the actual pack / rev file contents.
+ * If given, invoke CANCEL_FUNC with CANCEL_BATON at regular intervals.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * Please note that we can only check on pack / rev file granularity and
+ * must only be called for a single rev / pack file.
+ */
+static svn_error_t *
+compare_p2l_to_rev(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t count,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_off_t max_offset;
+ apr_off_t offset = 0;
+ svn_fs_x__revision_file_t *rev_file;
+
+ /* open the pack / rev file that is covered by the p2l index */
+ SVN_ERR(svn_fs_x__open_pack_or_rev_file(&rev_file, fs, start, scratch_pool,
+ iterpool));
+
+ /* check file size vs. range covered by index */
+ SVN_ERR(svn_fs_x__auto_read_footer(rev_file));
+ SVN_ERR(svn_fs_x__p2l_get_max_offset(&max_offset, fs, rev_file, start,
+ scratch_pool));
+
+ if (rev_file->l2p_offset != max_offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT, NULL,
+ _("File size of %s for revision r%ld does "
+ "not match p2l index size of %s"),
+ apr_off_t_toa(scratch_pool,
+ rev_file->l2p_offset),
+ start,
+ apr_off_t_toa(scratch_pool,
+ max_offset));
+
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size, NULL, 0,
+ scratch_pool));
+
+ /* for all offsets in the file, get the P2L index entries and check
+ them against the L2P index */
+ for (offset = 0; offset < max_offset; )
+ {
+ apr_array_header_t *entries;
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ /* get all entries for the current block */
+ SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, fs, rev_file, start,
+ offset, ffd->p2l_page_size,
+ iterpool, iterpool));
+
+ /* The above might have moved the file pointer.
+ * Ensure we actually start reading at OFFSET. */
+ SVN_ERR(svn_io_file_aligned_seek(rev_file->file, ffd->block_size,
+ NULL, offset, iterpool));
+
+ /* process all entries (and later continue with the next block) */
+ for (i = 0; i < entries->nelts; ++i)
+ {
+ svn_fs_x__p2l_entry_t *entry
+ = &APR_ARRAY_IDX(entries, i, svn_fs_x__p2l_entry_t);
+
+ /* skip bits we previously checked */
+ if (i == 0 && entry->offset < offset)
+ continue;
+
+ /* skip zero-sized entries */
+ if (entry->size == 0)
+ continue;
+
+ /* p2l index must cover all rev / pack file offsets exactly once */
+ if (entry->offset != offset)
+ return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
+ NULL,
+ _("p2l index entry for revision r%ld"
+ " is non-contiguous between offsets "
+ " %s and %s"),
+ start,
+ apr_off_t_toa(scratch_pool, offset),
+ apr_off_t_toa(scratch_pool,
+ entry->offset));
+
+ /* empty sections must contain NUL bytes only */
+ if (entry->type == SVN_FS_X__ITEM_TYPE_UNUSED)
+ {
+ /* skip filler entry at the end of the p2l index */
+ if (entry->offset != max_offset)
+ SVN_ERR(read_all_nul(rev_file->file, entry->size, iterpool));
+ }
+ else
+ {
+ if (entry->size < STREAM_THRESHOLD)
+ SVN_ERR(expected_buffered_checksum(rev_file->file, entry,
+ iterpool));
+ else
+ SVN_ERR(expected_streamed_checksum(rev_file->file, entry,
+ iterpool));
+ }
+
+ /* advance offset */
+ offset += entry->size;
+ }
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that the revprops of the revisions START to END in FS can be
+ * accessed. Invoke CANCEL_FUNC with CANCEL_BATON at regular intervals.
+ *
+ * The values of START and END have already been auto-selected and
+ * verified.
+ */
+static svn_error_t *
+verify_revprops(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_revnum_t revision;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ for (revision = start; revision < end; ++revision)
+ {
+ svn_string_t *date;
+ apr_time_t timetemp;
+
+ svn_pool_clear(iterpool);
+
+ /* Access the svn:date revprop.
+ * This implies parsing all revprops for that revision. */
+ SVN_ERR(svn_fs_x__revision_prop(&date, fs, revision,
+ SVN_PROP_REVISION_DATE,
+ iterpool, iterpool));
+
+ /* The time stamp is the only revprop that, if given, needs to
+ * have a valid content. */
+ if (date)
+ SVN_ERR(svn_time_from_cstring(&timetemp, date->data, iterpool));
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that on-disk representation has not been tempered with (in a way
+ * that leaves the repository in a corrupted state). This compares log-to-
+ * phys with phys-to-log indexes, verifies the low-level checksums and
+ * checks that all revprops are available. The function signature is
+ * similar to svn_fs_x__verify.
+ *
+ * The values of START and END have already been auto-selected and
+ * verified.
+ */
+static svn_error_t *
+verify_metadata_consistency(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_revnum_t revision, next_revision;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ for (revision = start; revision <= end; revision = next_revision)
+ {
+ svn_revnum_t count = svn_fs_x__packed_base_rev(fs, revision);
+ svn_revnum_t pack_start = count;
+ svn_revnum_t pack_end = pack_start + svn_fs_x__pack_size(fs, revision);
+
+ svn_pool_clear(iterpool);
+
+ if (notify_func && (pack_start % ffd->max_files_per_dir == 0))
+ notify_func(pack_start, notify_baton, iterpool);
+
+ /* Check for external corruption to the indexes. */
+ err = verify_index_checksums(fs, pack_start, cancel_func,
+ cancel_baton, iterpool);
+
+ /* two-way index check */
+ if (!err)
+ err = compare_l2p_to_p2l_index(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+ if (!err)
+ err = compare_p2l_to_l2p_index(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+
+ /* verify in-index checksums and types vs. actual rev / pack files */
+ if (!err)
+ err = compare_p2l_to_rev(fs, pack_start, pack_end - pack_start,
+ cancel_func, cancel_baton, iterpool);
+
+ /* ensure that revprops are available and accessible */
+ if (!err)
+ err = verify_revprops(fs, pack_start, pack_end,
+ cancel_func, cancel_baton, iterpool);
+
+ /* concurrent packing is one of the reasons why verification may fail.
+ Make sure, we operate on up-to-date information. */
+ if (err)
+ SVN_ERR(svn_fs_x__read_min_unpacked_rev(&ffd->min_unpacked_rev,
+ fs, scratch_pool));
+
+ /* retry the whole shard if it got packed in the meantime */
+ if (err && count != svn_fs_x__pack_size(fs, revision))
+ {
+ svn_error_clear(err);
+
+ /* We could simply assign revision here but the code below is
+ more intuitive to maintainers. */
+ next_revision = svn_fs_x__packed_base_rev(fs, revision);
+ }
+ else
+ {
+ SVN_ERR(err);
+ next_revision = pack_end;
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_x__verify(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_x__data_t *ffd = fs->fsap_data;
+ svn_revnum_t youngest = ffd->youngest_rev_cache; /* cache is current */
+
+ /* Input validation. */
+ if (! SVN_IS_VALID_REVNUM(start))
+ start = 0;
+ if (! SVN_IS_VALID_REVNUM(end))
+ end = youngest;
+ SVN_ERR(svn_fs_x__ensure_revision_exists(start, fs, scratch_pool));
+ SVN_ERR(svn_fs_x__ensure_revision_exists(end, fs, scratch_pool));
+
+ /* log/phys index consistency. We need to check them first to make
+ sure we can access the rev / pack files in format7. */
+ SVN_ERR(verify_metadata_consistency(fs, start, end,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ /* rep cache consistency */
+ SVN_ERR(verify_rep_cache(fs, start, end, notify_func, notify_baton,
+ cancel_func, cancel_baton, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_fs_x/verify.h b/subversion/libsvn_fs_x/verify.h
new file mode 100644
index 0000000..805f654
--- /dev/null
+++ b/subversion/libsvn_fs_x/verify.h
@@ -0,0 +1,43 @@
+/* verify.h : verification interface of the native filesystem layer
+ *
+ * ====================================================================
+ * 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_LIBSVN_FS__VERIFY_H
+#define SVN_LIBSVN_FS__VERIFY_H
+
+#include "fs.h"
+
+/* Verify metadata in fsx filesystem FS. Limit the checks to revisions
+ * START to END where possible. Indicate progress via the optional
+ * NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC
+ * will periodically be called with CANCEL_BATON to allow for preemption.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_x__verify(svn_fs_t *fs,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+#endif
diff --git a/subversion/libsvn_ra/compat.c b/subversion/libsvn_ra/compat.c
index b16bbef..f7307bf 100644
--- a/subversion/libsvn_ra/compat.c
+++ b/subversion/libsvn_ra/compat.c
@@ -35,6 +35,7 @@
#include "svn_props.h"
#include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
#include "ra_loader.h"
#include "svn_private_config.h"
@@ -315,6 +316,7 @@ svn_ra__locations_from_log(svn_ra_session_t *session,
svn_revnum_t youngest_requested, oldest_requested, youngest, oldest;
svn_node_kind_t kind;
const char *fs_path;
+ apr_array_header_t *sorted_location_revisions;
/* Fetch the absolute FS path associated with PATH. */
SVN_ERR(get_fs_path(&fs_path, session, path, pool));
@@ -336,11 +338,11 @@ svn_ra__locations_from_log(svn_ra_session_t *session,
/* Figure out the youngest and oldest revs (amongst the set of
requested revisions + the peg revision) so we can avoid
unnecessary log parsing. */
- qsort(location_revisions->elts, location_revisions->nelts,
- location_revisions->elt_size, compare_revisions);
- oldest_requested = APR_ARRAY_IDX(location_revisions, 0, svn_revnum_t);
- youngest_requested = APR_ARRAY_IDX(location_revisions,
- location_revisions->nelts - 1,
+ sorted_location_revisions = apr_array_copy(pool, location_revisions);
+ svn_sort__array(sorted_location_revisions, compare_revisions);
+ oldest_requested = APR_ARRAY_IDX(sorted_location_revisions, 0, svn_revnum_t);
+ youngest_requested = APR_ARRAY_IDX(sorted_location_revisions,
+ sorted_location_revisions->nelts - 1,
svn_revnum_t);
youngest = peg_revision;
youngest = (oldest_requested > youngest) ? oldest_requested : youngest;
@@ -352,7 +354,7 @@ svn_ra__locations_from_log(svn_ra_session_t *session,
/* Populate most of our log receiver baton structure. */
lrb.kind = kind;
lrb.last_path = fs_path;
- lrb.location_revisions = apr_array_copy(pool, location_revisions);
+ lrb.location_revisions = apr_array_copy(pool, sorted_location_revisions);
lrb.peg_revision = peg_revision;
lrb.peg_path = NULL;
lrb.locations = locations;
@@ -378,9 +380,9 @@ svn_ra__locations_from_log(svn_ra_session_t *session,
if (lrb.last_path)
{
int i;
- for (i = 0; i < location_revisions->nelts; i++)
+ for (i = 0; i < sorted_location_revisions->nelts; i++)
{
- svn_revnum_t rev = APR_ARRAY_IDX(location_revisions, i,
+ svn_revnum_t rev = APR_ARRAY_IDX(sorted_location_revisions, i,
svn_revnum_t);
if (! apr_hash_get(locations, &rev, sizeof(rev)))
apr_hash_set(locations, apr_pmemdup(pool, &rev, sizeof(rev)),
@@ -920,9 +922,9 @@ svn_ra__get_inherited_props_walk(svn_ra_session_t *session,
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- apr_ssize_t klen = svn__apr_hash_index_klen(hi);
- svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ svn_string_t *value = apr_hash_this_val(hi);
if (svn_property_kind2(name) == svn_prop_regular_kind)
{
@@ -940,7 +942,7 @@ svn_ra__get_inherited_props_walk(svn_ra_session_t *session,
parent_url,
result_pool);
new_iprop->prop_hash = final_hash;
- svn_sort__array_insert(&new_iprop, *inherited_props, 0);
+ svn_sort__array_insert(*inherited_props, &new_iprop, 0);
}
}
diff --git a/subversion/libsvn_ra/libsvn_ra.pc.in b/subversion/libsvn_ra/libsvn_ra.pc.in
new file mode 100644
index 0000000..b7ef131
--- /dev/null
+++ b/subversion/libsvn_ra/libsvn_ra.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_ra
+Description: Subversion General Repository Access Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr
+Libs: -L${libdir} -lsvn_ra
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_ra/ra_loader.c b/subversion/libsvn_ra/ra_loader.c
index d9cb96b..3a782f2 100644
--- a/subversion/libsvn_ra/ra_loader.c
+++ b/subversion/libsvn_ra/ra_loader.c
@@ -35,6 +35,7 @@
#include "svn_hash.h"
#include "svn_version.h"
+#include "svn_time.h"
#include "svn_types.h"
#include "svn_error.h"
#include "svn_error_codes.h"
@@ -51,6 +52,7 @@
#include "ra_loader.h"
#include "deprecated.h"
+#include "private/svn_auth_private.h"
#include "private/svn_ra_private.h"
#include "svn_private_config.h"
@@ -230,6 +232,11 @@ check_ra_version(const svn_version_t *ra_version, const char *scheme)
svn_error_t *svn_ra_initialize(apr_pool_t *pool)
{
+#if defined(SVN_USE_DSO) && APR_HAS_DSO
+ /* Ensure that DSO subsystem is initialized early as possible if
+ we're going to use it. */
+ SVN_ERR(svn_dso_initialize2());
+#endif
return SVN_NO_ERROR;
}
@@ -259,25 +266,17 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
apr_pool_t *pool)
{
apr_pool_t *sesspool = svn_pool_create(pool);
+ apr_pool_t *scratch_pool = svn_pool_create(sesspool);
svn_ra_session_t *session;
const struct ra_lib_defn *defn;
const svn_ra__vtable_t *vtable = NULL;
- svn_config_t *servers = NULL;
- const char *server_group;
apr_uri_t repos_URI;
apr_status_t apr_err;
+ svn_error_t *err;
#ifdef CHOOSABLE_DAV_MODULE
const char *http_library = DEFAULT_HTTP_LIBRARY;
#endif
- /* Auth caching parameters. */
- svn_boolean_t store_passwords = SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS;
- svn_boolean_t store_auth_creds = SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS;
- const char *store_plaintext_passwords
- = SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS;
- svn_boolean_t store_pp = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP;
- const char *store_pp_plaintext
- = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT;
- const char *corrected_url;
+ svn_auth_baton_t *auth_baton;
/* Initialize the return variable. */
*session_p = NULL;
@@ -293,100 +292,31 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
repos_URL);
if (callbacks->auth_baton)
- {
- /* The 'store-passwords' and 'store-auth-creds' parameters used to
- * live in SVN_CONFIG_CATEGORY_CONFIG. For backward compatibility,
- * if values for these parameters have already been set by our
- * callers, we use those values as defaults.
- *
- * Note that we can only catch the case where users explicitly set
- * "store-passwords = no" or 'store-auth-creds = no".
- *
- * However, since the default value for both these options is
- * currently (and has always been) "yes", users won't know
- * the difference if they set "store-passwords = yes" or
- * "store-auth-creds = yes" -- they'll get the expected behaviour.
- */
-
- if (svn_auth_get_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL)
- store_passwords = FALSE;
-
- if (svn_auth_get_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL)
- store_auth_creds = FALSE;
- }
+ SVN_ERR(svn_auth__make_session_auth(&auth_baton,
+ callbacks->auth_baton, config,
+ repos_URI.hostname,
+ sesspool, scratch_pool));
+ else
+ auth_baton = NULL;
+#ifdef CHOOSABLE_DAV_MODULE
if (config)
{
+ svn_config_t *servers = NULL;
+ const char *server_group = NULL;
+
/* Grab the 'servers' config. */
servers = svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS);
if (servers)
{
/* First, look in the global section. */
- SVN_ERR(svn_config_get_bool
- (servers, &store_passwords, SVN_CONFIG_SECTION_GLOBAL,
- SVN_CONFIG_OPTION_STORE_PASSWORDS,
- store_passwords));
-
- SVN_ERR(svn_config_get_yes_no_ask
- (servers, &store_plaintext_passwords, SVN_CONFIG_SECTION_GLOBAL,
- SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS,
- SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS));
-
- SVN_ERR(svn_config_get_bool
- (servers, &store_pp, SVN_CONFIG_SECTION_GLOBAL,
- SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP,
- store_pp));
-
- SVN_ERR(svn_config_get_yes_no_ask
- (servers, &store_pp_plaintext,
- SVN_CONFIG_SECTION_GLOBAL,
- SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
- SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT));
-
- SVN_ERR(svn_config_get_bool
- (servers, &store_auth_creds, SVN_CONFIG_SECTION_GLOBAL,
- SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
- store_auth_creds));
-
/* Find out where we're about to connect to, and
* try to pick a server group based on the destination. */
server_group = svn_config_find_group(servers, repos_URI.hostname,
SVN_CONFIG_SECTION_GROUPS,
sesspool);
- if (server_group)
- {
- /* Override global auth caching parameters with the ones
- * for the server group, if any. */
- SVN_ERR(svn_config_get_bool(servers, &store_auth_creds,
- server_group,
- SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
- store_auth_creds));
-
- SVN_ERR(svn_config_get_bool(servers, &store_passwords,
- server_group,
- SVN_CONFIG_OPTION_STORE_PASSWORDS,
- store_passwords));
-
- SVN_ERR(svn_config_get_yes_no_ask
- (servers, &store_plaintext_passwords, server_group,
- SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS,
- store_plaintext_passwords));
-
- SVN_ERR(svn_config_get_bool
- (servers, &store_pp,
- server_group, SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP,
- store_pp));
-
- SVN_ERR(svn_config_get_yes_no_ask
- (servers, &store_pp_plaintext, server_group,
- SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
- store_pp_plaintext));
- }
-#ifdef CHOOSABLE_DAV_MODULE
/* Now, which DAV-based RA method do we want to use today? */
http_library
= svn_config_get_server_setting(servers,
@@ -399,34 +329,9 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
_("Invalid config: unknown HTTP library "
"'%s'"),
http_library);
-#endif
}
}
-
- if (callbacks->auth_baton)
- {
- /* Save auth caching parameters in the auth parameter hash. */
- if (! store_passwords)
- svn_auth_set_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, "");
-
- svn_auth_set_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS,
- store_plaintext_passwords);
-
- if (! store_pp)
- svn_auth_set_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP,
- "");
-
- svn_auth_set_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
- store_pp_plaintext);
-
- if (! store_auth_creds)
- svn_auth_set_parameter(callbacks->auth_baton,
- SVN_AUTH_PARAM_NO_AUTH_CACHE, "");
- }
+#endif
/* Find the library. */
for (defn = ra_libraries; defn->ra_name != NULL; ++defn)
@@ -445,16 +350,16 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
if (! initfunc)
SVN_ERR(load_ra_module(&initfunc, NULL, defn->ra_name,
- sesspool));
+ scratch_pool));
if (! initfunc)
/* Library not found. */
continue;
- SVN_ERR(initfunc(svn_ra_version(), &vtable, sesspool));
+ SVN_ERR(initfunc(svn_ra_version(), &vtable, scratch_pool));
SVN_ERR(check_ra_version(vtable->get_version(), scheme));
- if (! has_scheme_of(vtable->get_schemes(sesspool), repos_URL))
+ if (! has_scheme_of(vtable->get_schemes(scratch_pool), repos_URL))
/* Library doesn't support the scheme at runtime. */
continue;
@@ -476,31 +381,32 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
session->pool = sesspool;
/* Ask the library to open the session. */
- SVN_ERR_W(vtable->open_session(session, &corrected_url, repos_URL,
- callbacks, callback_baton, config, sesspool),
- apr_psprintf(pool, "Unable to connect to a repository at URL '%s'",
- repos_URL));
+ err = vtable->open_session(session, corrected_url_p,
+ repos_URL,
+ callbacks, callback_baton, auth_baton,
+ config, sesspool, scratch_pool);
+
+ if (err)
+ {
+ svn_pool_destroy(sesspool); /* Includes scratch_pool */
+ if (err->apr_err == SVN_ERR_RA_SESSION_URL_MISMATCH)
+ return svn_error_trace(err);
+
+ return svn_error_createf(
+ SVN_ERR_RA_CANNOT_CREATE_SESSION, err,
+ _("Unable to connect to a repository at URL '%s'"),
+ repos_URL);
+ }
/* If the session open stuff detected a server-provided URL
correction (a 301 or 302 redirect response during the initial
OPTIONS request), then kill the session so the caller can decide
what to do. */
- if (corrected_url_p && corrected_url)
+ if (corrected_url_p && *corrected_url_p)
{
- if (! svn_path_is_url(corrected_url))
- {
- /* RFC1945 and RFC2616 state that the Location header's
- value (from whence this CORRECTED_URL ultimately comes),
- if present, must be an absolute URI. But some Apache
- versions (those older than 2.2.11, it seems) transmit
- only the path portion of the URI. See issue #3775 for
- details. */
- apr_uri_t corrected_URI = repos_URI;
- corrected_URI.path = (char *)corrected_url;
- corrected_url = apr_uri_unparse(pool, &corrected_URI, 0);
- }
- *corrected_url_p = svn_uri_canonicalize(corrected_url, pool);
- svn_pool_destroy(sesspool);
+ /* *session_p = NULL; */
+ *corrected_url_p = apr_pstrdup(pool, *corrected_url_p);
+ svn_pool_destroy(sesspool); /* Includes scratch_pool */
return SVN_NO_ERROR;
}
@@ -514,7 +420,7 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
{
/* Duplicate the uuid as it is allocated in sesspool */
repository_uuid = apr_pstrdup(pool, repository_uuid);
- svn_pool_destroy(sesspool);
+ svn_pool_destroy(sesspool); /* includes scratch_pool */
return svn_error_createf(SVN_ERR_RA_UUID_MISMATCH, NULL,
_("Repository UUID '%s' doesn't match "
"expected UUID '%s'"),
@@ -522,10 +428,50 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **session_p,
}
}
+ svn_pool_destroy(scratch_pool);
*session_p = session;
return SVN_NO_ERROR;
}
+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)
+{
+ svn_ra_session_t *session;
+
+ if (session_url)
+ {
+ const char *dummy;
+
+ /* This verifies in new_session_url is in the repository */
+ SVN_ERR(svn_ra_get_path_relative_to_root(old_session,
+ &dummy,
+ session_url,
+ scratch_pool));
+ }
+ else
+ SVN_ERR(svn_ra_get_session_url(old_session, &session_url, scratch_pool));
+
+ /* Create the session object. */
+ session = apr_pcalloc(result_pool, sizeof(*session));
+ session->cancel_func = old_session->cancel_func;
+ session->cancel_baton = old_session->cancel_baton;
+ session->vtable = old_session->vtable;
+ session->pool = result_pool;
+
+ SVN_ERR(old_session->vtable->dup_session(session,
+ old_session,
+ session_url,
+ result_pool,
+ scratch_pool));
+
+ *new_session = session;
+ return SVN_NO_ERROR;
+}
+
svn_error_t *svn_ra_reparent(svn_ra_session_t *session,
const char *url,
apr_pool_t *pool)
@@ -650,61 +596,6 @@ svn_error_t *svn_ra_rev_prop(svn_ra_session_t *session,
return session->vtable->rev_prop(session, rev, name, value, pool);
}
-struct ccw_baton
-{
- svn_commit_callback2_t original_callback;
- void *original_baton;
-
- svn_ra_session_t *session;
-};
-
-/* Wrapper which populates the repos_root field of the commit_info struct */
-static svn_error_t *
-commit_callback_wrapper(const svn_commit_info_t *commit_info,
- void *baton,
- apr_pool_t *pool)
-{
- struct ccw_baton *ccwb = baton;
- svn_commit_info_t *ci = svn_commit_info_dup(commit_info, pool);
-
- SVN_ERR(svn_ra_get_repos_root2(ccwb->session, &ci->repos_root, pool));
-
- return ccwb->original_callback(ci, ccwb->original_baton, pool);
-}
-
-
-/* Some RA layers do not correctly fill in REPOS_ROOT in commit_info, or
- they are third-party layers conforming to an older commit_info structure.
- Interpose a utility function to ensure the field is valid. */
-static void
-remap_commit_callback(svn_commit_callback2_t *callback,
- void **callback_baton,
- svn_ra_session_t *session,
- svn_commit_callback2_t original_callback,
- void *original_baton,
- apr_pool_t *result_pool)
-{
- if (original_callback == NULL)
- {
- *callback = NULL;
- *callback_baton = NULL;
- }
- else
- {
- /* Allocate this in RESULT_POOL, since the callback will be called
- long after this function has returned. */
- struct ccw_baton *ccwb = apr_palloc(result_pool, sizeof(*ccwb));
-
- ccwb->session = session;
- ccwb->original_callback = original_callback;
- ccwb->original_baton = original_baton;
-
- *callback = commit_callback_wrapper;
- *callback_baton = ccwb;
- }
-}
-
-
svn_error_t *svn_ra_get_commit_editor3(svn_ra_session_t *session,
const svn_delta_editor_t **editor,
void **edit_baton,
@@ -715,10 +606,6 @@ svn_error_t *svn_ra_get_commit_editor3(svn_ra_session_t *session,
svn_boolean_t keep_locks,
apr_pool_t *pool)
{
- remap_commit_callback(&commit_callback, &commit_baton,
- session, commit_callback, commit_baton,
- pool);
-
return session->vtable->get_commit_editor(session, editor, edit_baton,
revprop_table,
commit_callback, commit_baton,
@@ -925,8 +812,104 @@ svn_error_t *svn_ra_stat(svn_ra_session_t *session,
svn_dirent_t **dirent,
apr_pool_t *pool)
{
+ svn_error_t *err;
SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
- return session->vtable->stat(session, path, revision, dirent, pool);
+ err = session->vtable->stat(session, path, revision, dirent, pool);
+
+ /* svnserve before 1.2 doesn't support the above, so fall back on
+ a far less efficient, but still correct method. */
+ if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
+ {
+ /* ### TODO: Find out if we can somehow move this code in libsvn_ra_svn.
+ */
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ svn_node_kind_t kind;
+
+ svn_error_clear(err);
+
+ SVN_ERR(svn_ra_check_path(session, path, revision, &kind, scratch_pool));
+
+ if (kind != svn_node_none)
+ {
+ const char *repos_root_url;
+ const char *session_url;
+
+ SVN_ERR(svn_ra_get_repos_root2(session, &repos_root_url,
+ scratch_pool));
+ SVN_ERR(svn_ra_get_session_url(session, &session_url,
+ scratch_pool));
+
+ if (!svn_path_is_empty(path))
+ session_url = svn_path_url_add_component2(session_url, path,
+ scratch_pool);
+
+ if (strcmp(session_url, repos_root_url) != 0)
+ {
+ svn_ra_session_t *parent_session;
+ apr_hash_t *parent_ents;
+ const char *parent_url, *base_name;
+
+ /* Open another session to the path's parent. This server
+ doesn't support svn_ra_reparent anyway, so don't try it. */
+ svn_uri_split(&parent_url, &base_name, session_url,
+ scratch_pool);
+
+ SVN_ERR(svn_ra__dup_session(&parent_session, session, parent_url,
+ scratch_pool, scratch_pool));
+
+ /* Get all parent's entries, no props. */
+ SVN_ERR(svn_ra_get_dir2(parent_session, &parent_ents, NULL,
+ NULL, "", revision, SVN_DIRENT_ALL,
+ scratch_pool));
+
+ /* Get the relevant entry. */
+ *dirent = svn_hash_gets(parent_ents, base_name);
+
+ if (*dirent)
+ *dirent = svn_dirent_dup(*dirent, pool);
+ }
+ else
+ {
+ apr_hash_t *props;
+ const svn_string_t *val;
+
+ /* We can't get the directory entry for the repository root,
+ but we can still get the information we want.
+ The created-rev of the repository root must, by definition,
+ be rev. */
+ *dirent = apr_pcalloc(pool, sizeof(**dirent));
+ (*dirent)->kind = kind;
+ (*dirent)->size = SVN_INVALID_FILESIZE;
+
+ SVN_ERR(svn_ra_get_dir2(session, NULL, NULL, &props,
+ "", revision, 0 /* no dirent fields */,
+ scratch_pool));
+ (*dirent)->has_props = (apr_hash_count(props) != 0);
+
+ (*dirent)->created_rev = revision;
+
+ SVN_ERR(svn_ra_rev_proplist(session, revision, &props,
+ scratch_pool));
+
+ val = svn_hash_gets(props, SVN_PROP_REVISION_DATE);
+ if (val)
+ SVN_ERR(svn_time_from_cstring(&(*dirent)->time, val->data,
+ scratch_pool));
+
+ val = svn_hash_gets(props, SVN_PROP_REVISION_AUTHOR);
+ (*dirent)->last_author = val ? apr_pstrdup(pool, val->data)
+ : NULL;
+ }
+ }
+ else
+ *dirent = NULL;
+
+ svn_pool_clear(scratch_pool);
+ }
+ else
+ SVN_ERR(err);
+
+ return SVN_NO_ERROR;
}
svn_error_t *svn_ra_get_uuid2(svn_ra_session_t *session,
@@ -1030,7 +1013,7 @@ svn_error_t *svn_ra_get_file_revs2(svn_ra_session_t *session,
if (include_merged_revisions)
SVN_ERR(svn_ra__assert_mergeinfo_capable_server(session, NULL, pool));
- if (start > end)
+ if (start > end || !SVN_IS_VALID_REVNUM(start))
SVN_ERR(
svn_ra__assert_capable_server(session,
SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE,
@@ -1040,7 +1023,8 @@ svn_error_t *svn_ra_get_file_revs2(svn_ra_session_t *session,
err = session->vtable->get_file_revs(session, path, start, end,
include_merged_revisions,
handler, handler_baton, pool);
- if (err && (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED))
+ if (err && (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
+ && !include_merged_revisions)
{
svn_error_clear(err);
@@ -1048,7 +1032,7 @@ svn_error_t *svn_ra_get_file_revs2(svn_ra_session_t *session,
err = svn_ra__file_revs_from_log(session, path, start, end,
handler, handler_baton, pool);
}
- return err;
+ return svn_error_trace(err);
}
svn_error_t *svn_ra_lock(svn_ra_session_t *session,
@@ -1063,7 +1047,7 @@ svn_error_t *svn_ra_lock(svn_ra_session_t *session,
for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
}
@@ -1088,7 +1072,7 @@ svn_error_t *svn_ra_unlock(svn_ra_session_t *session,
for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
}
@@ -1320,27 +1304,24 @@ svn_ra_get_inherited_props(svn_ra_session_t *session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_boolean_t iprop_capable;
-
+ svn_error_t *err;
/* Path must be relative. */
SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
- SVN_ERR(svn_ra_has_capability(session, &iprop_capable,
- SVN_RA_CAPABILITY_INHERITED_PROPS,
- scratch_pool));
+ err = session->vtable->get_inherited_props(session, iprops, path,
+ revision, result_pool,
+ scratch_pool);
- if (iprop_capable)
- {
- SVN_ERR(session->vtable->get_inherited_props(session, iprops, path,
- revision, result_pool,
- scratch_pool));
- }
- else
+ if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
{
+ svn_error_clear(err);
+
/* Fallback for legacy servers. */
SVN_ERR(svn_ra__get_inherited_props_walk(session, path, revision, iprops,
result_pool, scratch_pool));
}
+ else
+ SVN_ERR(err);
return SVN_NO_ERROR;
}
@@ -1365,11 +1346,6 @@ svn_ra__get_commit_ev2(svn_editor_t **editor,
/* The specific RA layer does not have an implementation. Use our
default shim over the normal commit editor. */
- /* Remap for RA layers exposing Ev1. */
- remap_commit_callback(&commit_callback, &commit_baton,
- session, commit_callback, commit_baton,
- result_pool);
-
return svn_error_trace(svn_ra__use_commit_shim(
editor,
session,
diff --git a/subversion/libsvn_ra/ra_loader.h b/subversion/libsvn_ra/ra_loader.h
index 227730a..f371f27 100644
--- a/subversion/libsvn_ra/ra_loader.h
+++ b/subversion/libsvn_ra/ra_loader.h
@@ -61,8 +61,16 @@ typedef struct svn_ra__vtable_t {
const char *session_URL,
const svn_ra_callbacks2_t *callbacks,
void *callback_baton,
+ svn_auth_baton_t *auth_baton,
apr_hash_t *config,
- apr_pool_t *pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+ /* Backs svn_ra_dup_session */
+ svn_error_t * (*dup_session)(svn_ra_session_t *new_session,
+ svn_ra_session_t *old_session,
+ const char *new_session_url,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* See svn_ra_reparent(). */
/* URL is guaranteed to have what get_repos_root() returns as a prefix. */
svn_error_t *(*reparent)(svn_ra_session_t *session,
diff --git a/subversion/libsvn_ra/wrapper_template.h b/subversion/libsvn_ra/wrapper_template.h
index cee3fb3..0585ded 100644
--- a/subversion/libsvn_ra/wrapper_template.h
+++ b/subversion/libsvn_ra/wrapper_template.h
@@ -91,7 +91,9 @@ static svn_error_t *compat_open(void **session_baton,
callbacks2->progress_baton = NULL;
SVN_ERR(VTBL.open_session(sess, &session_url, repos_URL,
- callbacks2, callback_baton, config, sesspool));
+ callbacks2, callback_baton,
+ callbacks ? callbacks->auth_baton : NULL,
+ config, sesspool, sesspool));
if (strcmp(repos_URL, session_url) != 0)
{
diff --git a/subversion/libsvn_ra_local/libsvn_ra_local.pc.in b/subversion/libsvn_ra_local/libsvn_ra_local.pc.in
new file mode 100644
index 0000000..1333df0
--- /dev/null
+++ b/subversion/libsvn_ra_local/libsvn_ra_local.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_ra_local
+Description: Subversion Local Repository Access Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_repos libsvn_fs libsvn_delta libsvn_subr
+Libs: -L${libdir} -lsvn_ra_local
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_ra_local/ra_local.h b/subversion/libsvn_ra_local/ra_local.h
index df455da..344b68e 100644
--- a/subversion/libsvn_ra_local/ra_local.h
+++ b/subversion/libsvn_ra_local/ra_local.h
@@ -62,6 +62,11 @@ typedef struct svn_ra_local__session_baton_t
/* Callbacks/baton passed to svn_ra_open. */
const svn_ra_callbacks2_t *callbacks;
void *callback_baton;
+
+ /* Slave auth baton */
+ svn_auth_baton_t *auth_baton;
+
+ const char *useragent;
} svn_ra_local__session_baton_t;
diff --git a/subversion/libsvn_ra_local/ra_plugin.c b/subversion/libsvn_ra_local/ra_plugin.c
index 4ccc86d..bb09162 100644
--- a/subversion/libsvn_ra_local/ra_plugin.c
+++ b/subversion/libsvn_ra_local/ra_plugin.c
@@ -87,7 +87,7 @@ get_username(svn_ra_session_t *session,
{
/* Get a username somehow, so we have some svn:author property to
attach to a commit. */
- if (sess->callbacks->auth_baton)
+ if (sess->auth_baton)
{
void *creds;
svn_auth_cred_username_t *username_creds;
@@ -96,7 +96,7 @@ get_username(svn_ra_session_t *session,
SVN_ERR(svn_auth_first_credentials(&creds, &iterstate,
SVN_AUTH_CRED_USERNAME,
sess->uuid, /* realmstring */
- sess->callbacks->auth_baton,
+ sess->auth_baton,
scratch_pool));
/* No point in calling next_creds(), since that assumes that the
@@ -241,7 +241,7 @@ reporter_link_path(void *reporter_baton,
if (relpath[0] == '\0')
fs_path = "/";
else
- fs_path = apr_pstrcat(pool, "/", relpath, (char *)NULL);
+ fs_path = apr_pstrcat(pool, "/", relpath, SVN_VA_NULL);
return svn_repos_link_path3(rbaton->report_baton, path, fs_path, revision,
depth, start_empty, lock_token, pool);
@@ -328,7 +328,7 @@ make_reporter(svn_ra_session_t *session,
"'%s'"), other_url, sess->repos_url);
other_fs_path = apr_pstrcat(scratch_pool, "/", other_relpath,
- (char *)NULL);
+ SVN_VA_NULL);
}
/* Pass back our reporter */
@@ -360,8 +360,13 @@ make_reporter(svn_ra_session_t *session,
edit_baton,
NULL,
NULL,
- 1024 * 1024, /* process-local transfers
- should be fast */
+ 0, /* Disable zero-copy codepath, because
+ RA API users are unaware about the
+ zero-copy code path limitation (do
+ not access FSFS data structures
+ and, hence, caches). See notes
+ to svn_repos_begin_report3() for
+ additional details. */
result_pool));
/* Wrap the report baton given us by the repos layer with our own
@@ -410,28 +415,29 @@ deltify_etc(const svn_commit_info_t *commit_info,
/* Maybe unlock the paths. */
if (deb->lock_tokens)
{
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
+ apr_hash_t *targets = apr_hash_make(subpool);
apr_hash_index_t *hi;
- for (hi = apr_hash_first(scratch_pool, deb->lock_tokens); hi;
+ for (hi = apr_hash_first(subpool, deb->lock_tokens); hi;
hi = apr_hash_next(hi))
{
- const void *relpath = svn__apr_hash_index_key(hi);
- const char *token = svn__apr_hash_index_val(hi);
+ const void *relpath = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
const char *fspath;
- svn_pool_clear(iterpool);
-
- fspath = svn_fspath__join(deb->fspath_base, relpath, iterpool);
-
- /* We may get errors here if the lock was broken or stolen
- after the commit succeeded. This is fine and should be
- ignored. */
- svn_error_clear(svn_repos_fs_unlock(deb->repos, fspath, token,
- FALSE, iterpool));
+ fspath = svn_fspath__join(deb->fspath_base, relpath, subpool);
+ svn_hash_sets(targets, fspath, token);
}
- svn_pool_destroy(iterpool);
+ /* We may get errors here if the lock was broken or stolen
+ after the commit succeeded. This is fine and should be
+ ignored. */
+ svn_error_clear(svn_repos_fs_unlock_many(deb->repos, targets, FALSE,
+ NULL, NULL,
+ subpool, subpool));
+
+ svn_pool_destroy(subpool);
}
/* But, deltification shouldn't be stopped just because someone's
@@ -475,8 +481,8 @@ apply_lock_tokens(svn_fs_t *fs,
for (hi = apr_hash_first(scratch_pool, lock_tokens); hi;
hi = apr_hash_next(hi))
{
- const void *relpath = svn__apr_hash_index_key(hi);
- const char *token = svn__apr_hash_index_val(hi);
+ const void *relpath = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
const char *fspath;
/* The path needs to live as long as ACCESS_CTX. */
@@ -536,23 +542,31 @@ ignore_warnings(void *baton,
svn_error_t *err)
{
#ifdef SVN_DEBUG
- SVN_DBG(("Ignoring FS warning %d\n", err ? err->apr_err : 0));
+ SVN_DBG(("Ignoring FS warning %s\n",
+ svn_error_symbolic_name(err ? err->apr_err : 0)));
#endif
return;
}
+#define USER_AGENT "SVN/" SVN_VER_NUMBER " (" SVN_BUILD_TARGET ")" \
+ " ra_local"
+
static svn_error_t *
svn_ra_local__open(svn_ra_session_t *session,
const char **corrected_url,
const char *repos_URL,
const svn_ra_callbacks2_t *callbacks,
void *callback_baton,
+ svn_auth_baton_t *auth_baton,
apr_hash_t *config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
+ const char *client_string;
svn_ra_local__session_baton_t *sess;
const char *fs_path;
static volatile svn_atomic_t cache_init_state = 0;
+ apr_pool_t *pool = result_pool;
/* Initialise the FSFS memory cache size. We can only do this once
so one CONFIG will win the race and all others will be ignored
@@ -567,16 +581,16 @@ svn_ra_local__open(svn_ra_session_t *session,
sess = apr_pcalloc(pool, sizeof(*sess));
sess->callbacks = callbacks;
sess->callback_baton = callback_baton;
+ sess->auth_baton = auth_baton;
/* Look through the URL, figure out which part points to the
repository, and which part is the path *within* the
repository. */
- SVN_ERR_W(svn_ra_local__split_URL(&(sess->repos),
- &(sess->repos_url),
- &fs_path,
- repos_URL,
- session->pool),
- _("Unable to open an ra_local session to URL"));
+ SVN_ERR(svn_ra_local__split_URL(&(sess->repos),
+ &(sess->repos_url),
+ &fs_path,
+ repos_URL,
+ session->pool));
sess->fs_path = svn_stringbuf_create(fs_path, session->pool);
/* Cache the filesystem object from the repos here for
@@ -592,11 +606,70 @@ svn_ra_local__open(svn_ra_session_t *session,
/* Be sure username is NULL so we know to look it up / ask for it */
sess->username = NULL;
+ if (sess->callbacks->get_client_string != NULL)
+ SVN_ERR(sess->callbacks->get_client_string(sess->callback_baton,
+ &client_string, pool));
+ else
+ client_string = NULL;
+
+ if (client_string)
+ sess->useragent = apr_pstrcat(pool, USER_AGENT " ",
+ client_string, SVN_VA_NULL);
+ else
+ sess->useragent = USER_AGENT;
+
session->priv = sess;
return SVN_NO_ERROR;
}
static svn_error_t *
+svn_ra_local__dup_session(svn_ra_session_t *new_session,
+ svn_ra_session_t *session,
+ const char *new_session_url,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_local__session_baton_t *old_sess = session->priv;
+ svn_ra_local__session_baton_t *new_sess;
+ const char *fs_path;
+
+ /* Allocate and stash the session_sess args we have already. */
+ new_sess = apr_pcalloc(result_pool, sizeof(*new_sess));
+ new_sess->callbacks = old_sess->callbacks;
+ new_sess->callback_baton = old_sess->callback_baton;
+
+ /* ### Re-use existing FS handle? */
+
+ /* Reuse existing code */
+ SVN_ERR(svn_ra_local__split_URL(&(new_sess->repos),
+ &(new_sess->repos_url),
+ &fs_path,
+ new_session_url,
+ result_pool));
+
+ new_sess->fs_path = svn_stringbuf_create(fs_path, result_pool);
+
+ /* Cache the filesystem object from the repos here for
+ convenience. */
+ new_sess->fs = svn_repos_fs(new_sess->repos);
+
+ /* Ignore FS warnings. */
+ svn_fs_set_warning_func(new_sess->fs, ignore_warnings, NULL);
+
+ /* Cache the repository UUID as well */
+ new_sess->uuid = apr_pstrdup(result_pool, old_sess->uuid);
+
+ new_sess->username = old_sess->username
+ ? apr_pstrdup(result_pool, old_sess->username)
+ : NULL;
+
+ new_sess->useragent = apr_pstrdup(result_pool, old_sess->useragent);
+ new_session->priv = new_sess;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
svn_ra_local__reparent(svn_ra_session_t *session,
const char *url,
apr_pool_t *pool)
@@ -728,6 +801,62 @@ svn_ra_local__rev_prop(svn_ra_session_t *session,
NULL, NULL, pool);
}
+struct ccw_baton
+{
+ svn_commit_callback2_t original_callback;
+ void *original_baton;
+
+ svn_ra_session_t *session;
+};
+
+/* Wrapper which populates the repos_root field of the commit_info struct */
+static svn_error_t *
+commit_callback_wrapper(const svn_commit_info_t *commit_info,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ struct ccw_baton *ccwb = baton;
+ svn_commit_info_t *ci = svn_commit_info_dup(commit_info, scratch_pool);
+
+ SVN_ERR(svn_ra_local__get_repos_root(ccwb->session, &ci->repos_root,
+ scratch_pool));
+
+ return svn_error_trace(ccwb->original_callback(ci, ccwb->original_baton,
+ scratch_pool));
+}
+
+
+/* The repository layer does not correctly fill in REPOS_ROOT in
+ commit_info, as it doesn't know the url that is used to access
+ it. This hooks the callback to fill in the missing pieces. */
+static void
+remap_commit_callback(svn_commit_callback2_t *callback,
+ void **callback_baton,
+ svn_ra_session_t *session,
+ svn_commit_callback2_t original_callback,
+ void *original_baton,
+ apr_pool_t *result_pool)
+{
+ if (original_callback == NULL)
+ {
+ *callback = NULL;
+ *callback_baton = NULL;
+ }
+ else
+ {
+ /* Allocate this in RESULT_POOL, since the callback will be called
+ long after this function has returned. */
+ struct ccw_baton *ccwb = apr_palloc(result_pool, sizeof(*ccwb));
+
+ ccwb->session = session;
+ ccwb->original_callback = original_callback;
+ ccwb->original_baton = original_baton;
+
+ *callback = commit_callback_wrapper;
+ *callback_baton = ccwb;
+ }
+}
+
static svn_error_t *
svn_ra_local__get_commit_editor(svn_ra_session_t *session,
const svn_delta_editor_t **editor,
@@ -742,6 +871,10 @@ svn_ra_local__get_commit_editor(svn_ra_session_t *session,
svn_ra_local__session_baton_t *sess = session->priv;
struct deltify_etc_baton *deb = apr_palloc(pool, sizeof(*deb));
+ /* Set repos_root_url in commit info */
+ remap_commit_callback(&callback, &callback_baton, session,
+ callback, callback_baton, pool);
+
/* Prepare the baton for deltify_etc() */
deb->fs = sess->fs;
deb->repos = sess->repos;
@@ -765,6 +898,8 @@ svn_ra_local__get_commit_editor(svn_ra_session_t *session,
svn_string_create(sess->username, pool));
svn_hash_sets(revprop_table, SVN_PROP_TXN_CLIENT_COMPAT_VERSION,
svn_string_create(SVN_VER_NUMBER, pool));
+ svn_hash_sets(revprop_table, SVN_PROP_TXN_USER_AGENT,
+ svn_string_create(sess->useragent, pool));
/* Get the repos commit-editor */
return svn_repos_get_commit_editor5
@@ -1054,12 +1189,12 @@ svn_ra_local__stat(svn_ra_session_t *session,
+/* Obtain the properties for a node, including its 'entry props */
static svn_error_t *
get_node_props(apr_hash_t **props,
- apr_array_header_t **inherited_props,
- svn_ra_local__session_baton_t *sess,
svn_fs_root_t *root,
const char *path,
+ const char *uuid,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -1067,39 +1202,25 @@ get_node_props(apr_hash_t **props,
const char *cmt_date, *cmt_author;
/* Create a hash with props attached to the fs node. */
- if (props)
- {
- SVN_ERR(svn_fs_node_proplist(props, root, path, result_pool));
- }
-
- /* Get inherited properties if requested. */
- if (inherited_props)
- {
- SVN_ERR(svn_repos_fs_get_inherited_props(inherited_props, root, path,
- NULL, NULL, NULL,
- result_pool, scratch_pool));
- }
+ SVN_ERR(svn_fs_node_proplist(props, root, path, result_pool));
/* Now add some non-tweakable metadata to the hash as well... */
- if (props)
- {
- /* The so-called 'entryprops' with info about CR & friends. */
- SVN_ERR(svn_repos_get_committed_info(&cmt_rev, &cmt_date,
- &cmt_author, root, path,
- scratch_pool));
-
- svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_REV,
- svn_string_createf(result_pool, "%ld", cmt_rev));
- svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_DATE, cmt_date ?
- svn_string_create(cmt_date, result_pool) :NULL);
- svn_hash_sets(*props, SVN_PROP_ENTRY_LAST_AUTHOR, cmt_author ?
- svn_string_create(cmt_author, result_pool) :NULL);
- svn_hash_sets(*props, SVN_PROP_ENTRY_UUID,
- svn_string_create(sess->uuid, result_pool));
-
- /* We have no 'wcprops' in ra_local, but might someday. */
- }
+ /* The so-called 'entryprops' with info about CR & friends. */
+ SVN_ERR(svn_repos_get_committed_info(&cmt_rev, &cmt_date,
+ &cmt_author, root, path,
+ scratch_pool));
+
+ svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_REV,
+ svn_string_createf(result_pool, "%ld", cmt_rev));
+ svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_DATE, cmt_date ?
+ svn_string_create(cmt_date, result_pool) : NULL);
+ svn_hash_sets(*props, SVN_PROP_ENTRY_LAST_AUTHOR, cmt_author ?
+ svn_string_create(cmt_author, result_pool) : NULL);
+ svn_hash_sets(*props, SVN_PROP_ENTRY_UUID,
+ svn_string_create(uuid, result_pool));
+
+ /* We have no 'wcprops' in ra_local, but might someday. */
return SVN_NO_ERROR;
}
@@ -1171,7 +1292,7 @@ svn_ra_local__get_file(svn_ra_session_t *session,
/* Handle props if requested. */
if (props)
- SVN_ERR(get_node_props(props, NULL, sess, root, abs_path, pool, pool));
+ SVN_ERR(get_node_props(props, root, abs_path, sess->uuid, pool, pool));
return SVN_NO_ERROR;
}
@@ -1194,7 +1315,6 @@ svn_ra_local__get_dir(svn_ra_session_t *session,
apr_hash_t *entries;
apr_hash_index_t *hi;
svn_ra_local__session_baton_t *sess = session->priv;
- apr_pool_t *subpool;
const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
/* Open the revision's root. */
@@ -1210,29 +1330,28 @@ svn_ra_local__get_dir(svn_ra_session_t *session,
if (dirents)
{
+ apr_pool_t *iterpool = svn_pool_create(pool);
/* Get the dir's entries. */
SVN_ERR(svn_fs_dir_entries(&entries, root, abs_path, pool));
/* Loop over the fs dirents, and build a hash of general
svn_dirent_t's. */
*dirents = apr_hash_make(pool);
- subpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
const void *key;
void *val;
- apr_hash_t *prophash;
const char *datestring, *entryname, *fullpath;
svn_fs_dirent_t *fs_entry;
svn_dirent_t *entry = svn_dirent_create(pool);
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
apr_hash_this(hi, &key, NULL, &val);
entryname = (const char *) key;
fs_entry = (svn_fs_dirent_t *) val;
- fullpath = svn_dirent_join(abs_path, entryname, subpool);
+ fullpath = svn_dirent_join(abs_path, entryname, iterpool);
if (dirent_fields & SVN_DIRENT_KIND)
{
@@ -1247,15 +1366,15 @@ svn_ra_local__get_dir(svn_ra_session_t *session,
entry->size = 0;
else
SVN_ERR(svn_fs_file_length(&(entry->size), root,
- fullpath, subpool));
+ fullpath, iterpool));
}
if (dirent_fields & SVN_DIRENT_HAS_PROPS)
{
/* has_props? */
- SVN_ERR(svn_fs_node_proplist(&prophash, root, fullpath,
- subpool));
- entry->has_props = (apr_hash_count(prophash) != 0);
+ SVN_ERR(svn_fs_node_has_props(&entry->has_props,
+ root, fullpath,
+ iterpool));
}
if ((dirent_fields & SVN_DIRENT_TIME)
@@ -1266,7 +1385,7 @@ svn_ra_local__get_dir(svn_ra_session_t *session,
SVN_ERR(svn_repos_get_committed_info(&(entry->created_rev),
&datestring,
&(entry->last_author),
- root, fullpath, subpool));
+ root, fullpath, iterpool));
if (datestring)
SVN_ERR(svn_time_from_cstring(&(entry->time), datestring,
pool));
@@ -1277,12 +1396,12 @@ svn_ra_local__get_dir(svn_ra_session_t *session,
/* Store. */
svn_hash_sets(*dirents, entryname, entry);
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
}
/* Handle props if requested. */
if (props)
- SVN_ERR(get_node_props(props, NULL, sess, root, abs_path, pool, pool));
+ SVN_ERR(get_node_props(props, root, abs_path, sess->uuid, pool, pool));
return SVN_NO_ERROR;
}
@@ -1322,6 +1441,35 @@ svn_ra_local__get_location_segments(svn_ra_session_t *session,
NULL, NULL, pool);
}
+struct lock_baton_t {
+ svn_ra_lock_callback_t lock_func;
+ void *lock_baton;
+ const char *fs_path;
+ svn_boolean_t is_lock;
+ svn_error_t *cb_err;
+};
+
+/* Implements svn_fs_lock_callback_t. Used by svn_ra_local__lock and
+ svn_ra_local__unlock to forward to supplied callback and record any
+ callback error. */
+static svn_error_t *
+lock_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_baton_t *b = lock_baton;
+
+ if (b && !b->cb_err && b->lock_func)
+ {
+ path = svn_fspath__skip_ancestor(b->fs_path, path);
+ b->cb_err = b->lock_func(b->lock_baton, path, b->is_lock, lock, fs_err,
+ pool);
+ }
+
+ return SVN_NO_ERROR;
+}
static svn_error_t *
svn_ra_local__lock(svn_ra_session_t *session,
@@ -1333,51 +1481,44 @@ svn_ra_local__lock(svn_ra_session_t *session,
apr_pool_t *pool)
{
svn_ra_local__session_baton_t *sess = session->priv;
+ apr_hash_t *targets = apr_hash_make(pool);
apr_hash_index_t *hi;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_error_t *err;
+ struct lock_baton_t baton = {0};
/* A username is absolutely required to lock a path. */
SVN_ERR(get_username(session, pool));
for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi))
{
- svn_lock_t *lock;
- const void *key;
- const char *path;
- void *val;
- svn_revnum_t *revnum;
- const char *abs_path;
- svn_error_t *err, *callback_err = NULL;
-
- svn_pool_clear(iterpool);
- apr_hash_this(hi, &key, NULL, &val);
- path = key;
- revnum = val;
-
- abs_path = svn_fspath__join(sess->fs_path->data, path, iterpool);
-
- /* This wrapper will call pre- and post-lock hooks. */
- err = svn_repos_fs_lock(&lock, sess->repos, abs_path, NULL, comment,
- FALSE /* not DAV comment */,
- 0 /* no expiration */, *revnum, force,
- iterpool);
-
- if (err && !SVN_ERR_IS_LOCK_ERROR(err))
- return err;
-
- if (lock_func)
- callback_err = lock_func(lock_baton, path, TRUE, err ? NULL : lock,
- err, iterpool);
-
- svn_error_clear(err);
-
- if (callback_err)
- return callback_err;
+ const char *abs_path = svn_fspath__join(sess->fs_path->data,
+ apr_hash_this_key(hi), pool);
+ svn_revnum_t current_rev = *(svn_revnum_t *)apr_hash_this_val(hi);
+ svn_fs_lock_target_t *target = svn_fs_lock_target_create(NULL,
+ current_rev,
+ pool);
+
+ svn_hash_sets(targets, abs_path, target);
}
- svn_pool_destroy(iterpool);
+ baton.lock_func = lock_func;
+ baton.lock_baton = lock_baton;
+ baton.fs_path = sess->fs_path->data;
+ baton.is_lock = TRUE;
+ baton.cb_err = SVN_NO_ERROR;
- return SVN_NO_ERROR;
+ err = svn_repos_fs_lock_many(sess->repos, targets, comment,
+ FALSE /* not DAV comment */,
+ 0 /* no expiration */, force,
+ lock_cb, &baton,
+ pool, pool);
+
+ if (err && baton.cb_err)
+ svn_error_compose(err, baton.cb_err);
+ else if (!err)
+ err = baton.cb_err;
+
+ return svn_error_trace(err);
}
@@ -1390,51 +1531,38 @@ svn_ra_local__unlock(svn_ra_session_t *session,
apr_pool_t *pool)
{
svn_ra_local__session_baton_t *sess = session->priv;
+ apr_hash_t *targets = apr_hash_make(pool);
apr_hash_index_t *hi;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ svn_error_t *err;
+ struct lock_baton_t baton = {0};
/* A username is absolutely required to unlock a path. */
SVN_ERR(get_username(session, pool));
for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))
{
- const void *key;
- const char *path;
- void *val;
- const char *abs_path, *token;
- svn_error_t *err, *callback_err = NULL;
-
- svn_pool_clear(iterpool);
- apr_hash_this(hi, &key, NULL, &val);
- path = key;
- /* Since we can't store NULL values in a hash, we turn "" to
- NULL here. */
- if (strcmp(val, "") != 0)
- token = val;
- else
- token = NULL;
-
- abs_path = svn_fspath__join(sess->fs_path->data, path, iterpool);
-
- /* This wrapper will call pre- and post-unlock hooks. */
- err = svn_repos_fs_unlock(sess->repos, abs_path, token, force,
- iterpool);
+ const char *abs_path = svn_fspath__join(sess->fs_path->data,
+ apr_hash_this_key(hi), pool);
+ const char *token = apr_hash_this_val(hi);
- if (err && !SVN_ERR_IS_UNLOCK_ERROR(err))
- return err;
-
- if (lock_func)
- callback_err = lock_func(lock_baton, path, FALSE, NULL, err, iterpool);
+ svn_hash_sets(targets, abs_path, token);
+ }
- svn_error_clear(err);
+ baton.lock_func = lock_func;
+ baton.lock_baton = lock_baton;
+ baton.fs_path = sess->fs_path->data;
+ baton.is_lock = FALSE;
+ baton.cb_err = SVN_NO_ERROR;
- if (callback_err)
- return callback_err;
- }
+ err = svn_repos_fs_unlock_many(sess->repos, targets, force, lock_cb, &baton,
+ pool, pool);
- svn_pool_destroy(iterpool);
+ if (err && baton.cb_err)
+ svn_error_compose(err, baton.cb_err);
+ else if (!err)
+ err = baton.cb_err;
- return SVN_NO_ERROR;
+ return svn_error_trace(err);
}
@@ -1597,8 +1725,11 @@ svn_ra_local__get_inherited_props(svn_ra_session_t *session,
_("'%s' path not found"), abs_path);
}
- return svn_error_trace(get_node_props(NULL, iprops, sess, root, abs_path,
- result_pool, scratch_pool));
+ return svn_error_trace(
+ svn_repos_fs_get_inherited_props(iprops, root, abs_path,
+ NULL /* propname */,
+ NULL, NULL /* auth */,
+ result_pool, scratch_pool));
}
static svn_error_t *
@@ -1631,6 +1762,9 @@ svn_ra_local__get_commit_ev2(svn_editor_t **editor,
svn_ra_local__session_baton_t *sess = session->priv;
struct deltify_etc_baton *deb = apr_palloc(result_pool, sizeof(*deb));
+ remap_commit_callback(&commit_cb, &commit_baton, session,
+ commit_cb, commit_baton, result_pool);
+
/* NOTE: the RA callbacks are ignored. We pass everything directly to
the REPOS editor. */
@@ -1682,6 +1816,7 @@ static const svn_ra__vtable_t ra_local_vtable =
svn_ra_local__get_description,
svn_ra_local__get_schemes,
svn_ra_local__open,
+ svn_ra_local__dup_session,
svn_ra_local__reparent,
svn_ra_local__get_session_url,
svn_ra_local__get_latest_revnum,
@@ -1749,8 +1884,8 @@ svn_ra_local__init(const svn_version_t *loader_version,
SVN_ERR(svn_ver_check_list2(ra_local_version(), checklist, svn_ver_equal));
#ifndef SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL
- /* This assumes that POOL was the pool used to load the dso. */
- SVN_ERR(svn_fs_initialize(pool));
+ /* This means the library was loaded as a DSO, so use the DSO pool. */
+ SVN_ERR(svn_fs_initialize(svn_dso__pool()));
#endif
*vtable = &ra_local_vtable;
diff --git a/subversion/libsvn_ra_local/split_url.c b/subversion/libsvn_ra_local/split_url.c
index ec6cb68..5b17ef0 100644
--- a/subversion/libsvn_ra_local/split_url.c
+++ b/subversion/libsvn_ra_local/split_url.c
@@ -30,7 +30,7 @@
svn_error_t *
svn_ra_local__split_URL(svn_repos_t **repos,
- const char **repos_url,
+ const char **repos_root_url,
const char **fs_path,
const char *URL,
apr_pool_t *pool)
@@ -50,7 +50,7 @@ svn_ra_local__split_URL(svn_repos_t **repos,
_("Unable to open repository '%s'"), URL);
/* Attempt to open a repository at URL. */
- err = svn_repos_open2(repos, repos_root_dirent, NULL, pool);
+ err = svn_repos_open3(repos, repos_root_dirent, NULL, pool, pool);
if (err)
return svn_error_createf(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED, err,
_("Unable to open repository '%s'"), URL);
@@ -96,7 +96,7 @@ svn_ra_local__split_URL(svn_repos_t **repos,
svn_path_remove_components(urlbuf,
svn_path_component_count(repos_dirent)
- svn_path_component_count(repos_root_dirent));
- *repos_url = urlbuf->data;
+ *repos_root_url = urlbuf->data;
/* Configure hook script environment variables. */
SVN_ERR(svn_repos_hooks_setenv(*repos, NULL, pool));
diff --git a/subversion/libsvn_ra_serf/README b/subversion/libsvn_ra_serf/README
index d3baf33..98a48a6 100644
--- a/subversion/libsvn_ra_serf/README
+++ b/subversion/libsvn_ra_serf/README
@@ -22,7 +22,7 @@ support for ra_serf:
For more about how ra_serf/ra_neon talk WebDAV, consult notes/webdav-protocol.
-Working copies are interchangable between ra_serf and ra_neon. (They both use
+Working copies are interchangeable between ra_serf and ra_neon. (They both use
the svn:wc:ra_dav:version-url property to store the latest revision of a file.)
Completed tasks
diff --git a/subversion/libsvn_ra_serf/blame.c b/subversion/libsvn_ra_serf/blame.c
index b6f136a..d915a19 100644
--- a/subversion/libsvn_ra_serf/blame.c
+++ b/subversion/libsvn_ra_serf/blame.c
@@ -47,7 +47,7 @@
* This enum represents the current state of our XML parsing for a REPORT.
*/
typedef enum blame_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
FILE_REVS_REPORT,
FILE_REV,
REV_PROP,
@@ -111,7 +111,6 @@ static const svn_ra_serf__xml_transition_t blame_ttable[] = {
{ 0 }
};
-
/* Conforms to svn_ra_serf__xml_opened_t */
static svn_error_t *
blame_opened(svn_ra_serf__xml_estate_t *xes,
@@ -140,17 +139,20 @@ blame_opened(svn_ra_serf__xml_estate_t *xes,
apr_pool_t *state_pool = svn_ra_serf__xml_state_pool(xes);
apr_hash_t *gathered = svn_ra_serf__xml_gather_since(xes, FILE_REV);
const char *path;
- const char *rev;
+ const char *rev_str;
const char *merged_revision;
svn_txdelta_window_handler_t txdelta;
void *txdelta_baton;
+ apr_int64_t rev;
path = svn_hash_gets(gathered, "path");
- rev = svn_hash_gets(gathered, "rev");
+ rev_str = svn_hash_gets(gathered, "rev");
+
+ SVN_ERR(svn_cstring_atoi64(&rev, rev_str));
merged_revision = svn_hash_gets(gathered, "merged-revision");
SVN_ERR(blame_ctx->file_rev(blame_ctx->file_rev_baton,
- path, SVN_STR_TO_REV(rev),
+ path, (svn_revnum_t)rev,
blame_ctx->rev_props,
merged_revision != NULL,
&txdelta, &txdelta_baton,
@@ -278,7 +280,8 @@ static svn_error_t *
create_file_revs_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
blame_context_t *blame_ctx = baton;
@@ -288,7 +291,7 @@ create_file_revs_body(serf_bucket_t **body_bkt,
svn_ra_serf__add_open_tag_buckets(buckets, alloc,
"S:file-revs-report",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"S:start-revision", apr_ltoa(pool, blame_ctx->start),
@@ -300,9 +303,8 @@ create_file_revs_body(serf_bucket_t **body_bkt,
if (blame_ctx->include_merged_revisions)
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:include-merged-revisions", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:include-merged-revisions", SVN_VA_NULL);
}
svn_ra_serf__add_tag_buckets(buckets,
@@ -331,7 +333,7 @@ svn_ra_serf__get_file_revs(svn_ra_session_t *ra_session,
svn_ra_serf__handler_t *handler;
svn_ra_serf__xml_context_t *xmlctx;
const char *req_url;
- svn_error_t *err;
+ svn_revnum_t peg_rev;
blame_ctx = apr_pcalloc(pool, sizeof(*blame_ctx));
blame_ctx->pool = pool;
@@ -342,9 +344,16 @@ svn_ra_serf__get_file_revs(svn_ra_session_t *ra_session,
blame_ctx->end = end;
blame_ctx->include_merged_revisions = include_merged_revisions;
+ /* Since Subversion 1.8 we allow retrieving blames backwards. So we can't
+ just unconditionally use end_rev as the peg revision as before */
+ if (end > start)
+ peg_rev = end;
+ else
+ peg_rev = start;
+
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- session, NULL /* conn */,
- NULL /* url */, end,
+ session,
+ NULL /* url */, peg_rev,
pool, pool));
xmlctx = svn_ra_serf__xml_context_create(blame_ttable,
@@ -353,23 +362,18 @@ svn_ra_serf__get_file_revs(svn_ra_session_t *ra_session,
blame_cdata,
blame_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_type = "text/xml";
handler->body_delegate = create_file_revs_body;
handler->body_delegate_baton = blame_ctx;
- handler->conn = session->conns[0];
- handler->session = session;
- err = svn_ra_serf__context_run_one(handler, pool);
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- err = svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location),
- err);
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- return svn_error_trace(err);
+ return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_serf/blncache.c b/subversion/libsvn_ra_serf/blncache.c
index d6abcdf..6fefa93 100644
--- a/subversion/libsvn_ra_serf/blncache.c
+++ b/subversion/libsvn_ra_serf/blncache.c
@@ -112,7 +112,7 @@ svn_ra_serf__blncache_set(svn_ra_serf__blncache_t *blncache,
const char *baseline_url,
svn_revnum_t revision,
const char *bc_url,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
if (bc_url && SVN_IS_VALID_REVNUM(revision))
{
@@ -147,11 +147,11 @@ svn_error_t *
svn_ra_serf__blncache_get_bc_url(const char **bc_url_p,
svn_ra_serf__blncache_t *blncache,
svn_revnum_t revnum,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
const char *value = apr_hash_get(blncache->revnum_to_bc,
&revnum, sizeof(revnum));
- *bc_url_p = value ? apr_pstrdup(pool, value) : NULL;
+ *bc_url_p = value ? apr_pstrdup(result_pool, value) : NULL;
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_serf/blncache.h b/subversion/libsvn_ra_serf/blncache.h
index 5ad4eba..fe14799 100644
--- a/subversion/libsvn_ra_serf/blncache.h
+++ b/subversion/libsvn_ra_serf/blncache.h
@@ -59,7 +59,7 @@ svn_ra_serf__blncache_set(svn_ra_serf__blncache_t *blncache,
const char *baseline_url,
svn_revnum_t revnum,
const char *bc_url,
- apr_pool_t *pool);
+ apr_pool_t *scratch_pool);
/* Sets *BC_URL_P with a pointer to baseline collection URL for the given
* REVNUM. *BC_URL_P will be NULL if cache doesn't have information about
@@ -69,7 +69,7 @@ svn_error_t *
svn_ra_serf__blncache_get_bc_url(const char **bc_url_p,
svn_ra_serf__blncache_t *blncache,
svn_revnum_t revnum,
- apr_pool_t *pool);
+ apr_pool_t *result_pool);
/* Sets *BC_URL_P with pointer to baseline collection URL and *REVISION_P
* with revision number of baseline BASELINE_URL. *BC_URL_P will be NULL,
diff --git a/subversion/libsvn_ra_serf/commit.c b/subversion/libsvn_ra_serf/commit.c
index 9d48d41..b1e81c7 100644
--- a/subversion/libsvn_ra_serf/commit.c
+++ b/subversion/libsvn_ra_serf/commit.c
@@ -51,7 +51,6 @@ typedef struct commit_context_t {
apr_pool_t *pool;
svn_ra_serf__session_t *session;
- svn_ra_serf__connection_t *conn;
apr_hash_t *revprop_table;
@@ -83,15 +82,13 @@ typedef struct proppatch_context_t {
const char *relpath;
const char *path;
- commit_context_t *commit;
+ commit_context_t *commit_ctx;
- /* Changed and removed properties. */
- apr_hash_t *changed_props;
- apr_hash_t *removed_props;
+ /* Changed properties. const char * -> svn_prop_t * */
+ apr_hash_t *prop_changes;
- /* Same, for the old value (*old_value_p). */
- apr_hash_t *previous_changed_props;
- apr_hash_t *previous_removed_props;
+ /* Same, for the old value, or NULL. */
+ apr_hash_t *old_props;
/* In HTTP v2, this is the file/directory version we think we're changing. */
svn_revnum_t base_revision;
@@ -103,7 +100,9 @@ typedef struct delete_context_t {
svn_revnum_t revision;
- commit_context_t *commit;
+ commit_context_t *commit_ctx;
+
+ svn_boolean_t non_recursive_if; /* Only create a non-recursive If header */
} delete_context_t;
/* Represents a directory. */
@@ -112,7 +111,7 @@ typedef struct dir_context_t {
apr_pool_t *pool;
/* The root commit we're in progress for. */
- commit_context_t *commit;
+ commit_context_t *commit_ctx;
/* URL to operate against (used for CHECKOUT and PROPPATCH before
HTTP v2, for PROPPATCH in HTTP v2). */
@@ -139,9 +138,8 @@ typedef struct dir_context_t {
const char *copy_path;
svn_revnum_t copy_revision;
- /* Changed and removed properties */
- apr_hash_t *changed_props;
- apr_hash_t *removed_props;
+ /* Changed properties (const char * -> svn_prop_t *) */
+ apr_hash_t *prop_changes;
/* The checked-out working resource for this directory. May be NULL; if so
call checkout_dir() first. */
@@ -154,7 +152,7 @@ typedef struct file_context_t {
apr_pool_t *pool;
/* The root commit we're in progress for. */
- commit_context_t *commit;
+ commit_context_t *commit_ctx;
/* Is this file being added? (Otherwise, just opened.) */
svn_boolean_t added;
@@ -186,9 +184,8 @@ typedef struct file_context_t {
/* Our resulting checksum as reported by the WC. */
const char *result_checksum;
- /* Changed and removed properties. */
- apr_hash_t *changed_props;
- apr_hash_t *removed_props;
+ /* Changed properties (const char * -> svn_prop_t *) */
+ apr_hash_t *prop_changes;
/* URL to PUT the file at. */
const char *url;
@@ -198,39 +195,13 @@ typedef struct file_context_t {
/* Setup routines and handlers for various requests we'll invoke. */
-static svn_error_t *
-return_response_err(svn_ra_serf__handler_t *handler)
-{
- svn_error_t *err;
-
- /* We should have captured SLINE and LOCATION in the HANDLER. */
- SVN_ERR_ASSERT(handler->handler_pool != NULL);
-
- /* Ye Olde Fallback Error */
- err = svn_error_compose_create(
- handler->server_error != NULL
- ? handler->server_error->error
- : SVN_NO_ERROR,
- svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("%s of '%s': %d %s"),
- handler->method, handler->path,
- handler->sline.code, handler->sline.reason));
-
- /* Try to return one of the standard errors for 301, 404, etc.,
- then look for an error embedded in the response. */
- return svn_error_compose_create(svn_ra_serf__error_on_status(
- handler->sline,
- handler->path,
- handler->location),
- err);
-}
-
/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_checkout_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
const char *activity_url = baton;
serf_bucket_t *body_bkt;
@@ -240,9 +211,11 @@ create_checkout_body(serf_bucket_t **bkt,
svn_ra_serf__add_xml_header_buckets(body_bkt, alloc);
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:checkout",
"xmlns:D", "DAV:",
- NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:activity-set", NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:href", NULL);
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:activity-set",
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:href",
+ SVN_VA_NULL);
SVN_ERR_ASSERT(activity_url != NULL);
svn_ra_serf__add_cdata_len_buckets(body_bkt, alloc,
@@ -251,7 +224,8 @@ create_checkout_body(serf_bucket_t **bkt,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:href");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:activity-set");
- svn_ra_serf__add_tag_buckets(body_bkt, "D:apply-to-version", NULL, alloc);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:apply-to-version", SVN_VA_NULL);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:checkout");
*bkt = body_bkt;
@@ -285,32 +259,30 @@ checkout_node(const char **working_url,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_ra_serf__handler_t handler = { 0 };
+ svn_ra_serf__handler_t *handler;
apr_status_t status;
apr_uri_t uri;
/* HANDLER_POOL is the scratch pool since we don't need to remember
anything from the handler. We just want the working resource. */
- handler.handler_pool = scratch_pool;
- handler.session = commit_ctx->session;
- handler.conn = commit_ctx->conn;
+ handler = svn_ra_serf__create_handler(commit_ctx->session, scratch_pool);
- handler.body_delegate = create_checkout_body;
- handler.body_delegate_baton = (/* const */ void *)commit_ctx->activity_url;
- handler.body_type = "text/xml";
+ handler->body_delegate = create_checkout_body;
+ handler->body_delegate_baton = (/* const */ void *)commit_ctx->activity_url;
+ handler->body_type = "text/xml";
- handler.response_handler = svn_ra_serf__expect_empty_body;
- handler.response_baton = &handler;
+ handler->response_handler = svn_ra_serf__expect_empty_body;
+ handler->response_baton = handler;
- handler.method = "CHECKOUT";
- handler.path = node_url;
+ handler->method = "CHECKOUT";
+ handler->path = node_url;
- SVN_ERR(svn_ra_serf__context_run_one(&handler, scratch_pool));
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
- if (handler.sline.code != 201)
- return svn_error_trace(return_response_err(&handler));
+ if (handler->sline.code != 201)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- if (handler.location == NULL)
+ if (handler->location == NULL)
return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
_("No Location header received"));
@@ -319,7 +291,7 @@ checkout_node(const char **working_url,
'https:' transaction ... we'll work around that by stripping the
scheme, host, and port here and re-adding the correct ones
later. */
- status = apr_uri_parse(scratch_pool, handler.location, &uri);
+ status = apr_uri_parse(scratch_pool, handler->location, &uri);
if (status)
return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
_("Error parsing Location header value"));
@@ -365,11 +337,11 @@ retry_checkout_node(const char **working_url,
error and retry a few times, asking for the latest baseline
again. */
if (err && (err->apr_err != SVN_ERR_APMOD_BAD_BASELINE))
- return err;
+ return svn_error_trace(err);
}
while (err && retry_count--);
- return err;
+ return svn_error_trace(err);
}
@@ -377,8 +349,7 @@ static svn_error_t *
checkout_dir(dir_context_t *dir,
apr_pool_t *scratch_pool)
{
- svn_error_t *err;
- dir_context_t *p_dir = dir;
+ dir_context_t *c_dir = dir;
const char *checkout_url;
const char **working;
@@ -389,35 +360,35 @@ checkout_dir(dir_context_t *dir,
/* Is this directory or one of our parent dirs newly added?
* If so, we're already implicitly checked out. */
- while (p_dir)
+ while (c_dir)
{
- if (p_dir->added)
+ if (c_dir->added)
{
- /* Calculate the working_url by skipping the shared ancestor bewteen
- * the parent->relpath and dir->relpath. This is safe since an
+ /* Calculate the working_url by skipping the shared ancestor between
+ * the c_dir_parent->relpath and dir->relpath. This is safe since an
* add is guaranteed to have a parent that is checked out. */
- dir_context_t *parent = p_dir->parent_dir;
- const char *relpath = svn_relpath_skip_ancestor(parent->relpath,
+ dir_context_t *c_dir_parent = c_dir->parent_dir;
+ const char *relpath = svn_relpath_skip_ancestor(c_dir_parent->relpath,
dir->relpath);
/* Implicitly checkout this dir now. */
- SVN_ERR_ASSERT(parent->working_url);
+ SVN_ERR_ASSERT(c_dir_parent->working_url);
dir->working_url = svn_path_url_add_component2(
- parent->working_url,
+ c_dir_parent->working_url,
relpath, dir->pool);
return SVN_NO_ERROR;
}
- p_dir = p_dir->parent_dir;
+ c_dir = c_dir->parent_dir;
}
/* We could be called twice for the root: once to checkout the baseline;
* once to checkout the directory itself if we need to do so.
* Note: CHECKOUT_URL should live longer than HANDLER.
*/
- if (!dir->parent_dir && !dir->commit->baseline_url)
+ if (!dir->parent_dir && !dir->commit_ctx->baseline_url)
{
- checkout_url = dir->commit->vcc_url;
- working = &dir->commit->baseline_url;
+ checkout_url = dir->commit_ctx->vcc_url;
+ working = &dir->commit_ctx->baseline_url;
}
else
{
@@ -426,18 +397,9 @@ checkout_dir(dir_context_t *dir,
}
/* Checkout our directory into the activity URL now. */
- err = retry_checkout_node(working, dir->commit, checkout_url,
- dir->pool, scratch_pool);
- if (err)
- {
- if (err->apr_err == SVN_ERR_FS_CONFLICT)
- SVN_ERR_W(err, apr_psprintf(scratch_pool,
- _("Directory '%s' is out of date; try updating"),
- svn_dirent_local_style(dir->relpath, scratch_pool)));
- return err;
- }
-
- return SVN_NO_ERROR;
+ return svn_error_trace(retry_checkout_node(working, dir->commit_ctx,
+ checkout_url,
+ dir->pool, scratch_pool));
}
@@ -493,7 +455,6 @@ get_version_url(const char **checked_in_url,
else
{
const char *propfind_url;
- svn_ra_serf__connection_t *conn = session->conns[0];
if (SVN_IS_VALID_REVNUM(base_revision))
{
@@ -502,10 +463,9 @@ get_version_url(const char **checked_in_url,
this lookup, so we'll do things the hard(er) way, by
looking up the version URL from a resource in the
baseline collection. */
- /* ### conn==NULL for session->conns[0]. same as CONN. */
SVN_ERR(svn_ra_serf__get_stable_url(&propfind_url,
NULL /* latest_revnum */,
- session, NULL /* conn */,
+ session,
NULL /* url */, base_revision,
scratch_pool, scratch_pool));
}
@@ -514,8 +474,8 @@ get_version_url(const char **checked_in_url,
propfind_url = session->session_url.path;
}
- SVN_ERR(svn_ra_serf__fetch_dav_prop(&root_checkout,
- conn, propfind_url, base_revision,
+ SVN_ERR(svn_ra_serf__fetch_dav_prop(&root_checkout, session,
+ propfind_url, base_revision,
"checked-in",
scratch_pool, scratch_pool));
if (!root_checkout)
@@ -536,7 +496,6 @@ static svn_error_t *
checkout_file(file_context_t *file,
apr_pool_t *scratch_pool)
{
- svn_error_t *err;
dir_context_t *parent_dir = file->parent_dir;
const char *checkout_url;
@@ -548,6 +507,7 @@ checkout_file(file_context_t *file,
if (parent_dir->added)
{
/* Implicitly checkout this file now. */
+ SVN_ERR_ASSERT(parent_dir->working_url);
file->working_url = svn_path_url_add_component2(
parent_dir->working_url,
svn_relpath_skip_ancestor(
@@ -559,23 +519,14 @@ checkout_file(file_context_t *file,
}
SVN_ERR(get_version_url(&checkout_url,
- file->commit->session,
+ file->commit_ctx->session,
file->relpath, file->base_revision,
NULL, scratch_pool, scratch_pool));
/* Checkout our file into the activity URL now. */
- err = retry_checkout_node(&file->working_url, file->commit, checkout_url,
- file->pool, scratch_pool);
- if (err)
- {
- if (err->apr_err == SVN_ERR_FS_CONFLICT)
- SVN_ERR_W(err, apr_psprintf(scratch_pool,
- _("File '%s' is out of date; try updating"),
- svn_dirent_local_style(file->relpath, scratch_pool)));
- return err;
- }
-
- return SVN_NO_ERROR;
+ return svn_error_trace(retry_checkout_node(&file->working_url,
+ file->commit_ctx, checkout_url,
+ file->pool, scratch_pool));
}
/* Helper function for proppatch_walker() below. */
@@ -612,101 +563,23 @@ get_encoding_and_cdata(const char **encoding_p,
return SVN_NO_ERROR;
}
-typedef struct walker_baton_t {
- serf_bucket_t *body_bkt;
- apr_pool_t *body_pool;
-
- apr_hash_t *previous_changed_props;
- apr_hash_t *previous_removed_props;
-
- const char *path;
-
- /* Hack, since change_rev_prop(old_value_p != NULL, value = NULL) uses D:set
- rather than D:remove... (see notes/http-and-webdav/webdav-protocol) */
- enum {
- filter_all_props,
- filter_props_with_old_value,
- filter_props_without_old_value
- } filter;
-
- /* Is the property being deleted? */
- svn_boolean_t deleting;
-} walker_baton_t;
-
-/* If we have (recorded in WB) the old value of the property named NS:NAME,
- * then set *HAVE_OLD_VAL to TRUE and set *OLD_VAL_P to that old value
- * (which may be NULL); else set *HAVE_OLD_VAL to FALSE. */
-static svn_error_t *
-derive_old_val(svn_boolean_t *have_old_val,
- const svn_string_t **old_val_p,
- walker_baton_t *wb,
- const char *ns,
- const char *name)
-{
- *have_old_val = FALSE;
-
- if (wb->previous_changed_props)
- {
- const svn_string_t *val;
- val = svn_ra_serf__get_prop_string(wb->previous_changed_props,
- wb->path, ns, name);
- if (val)
- {
- *have_old_val = TRUE;
- *old_val_p = val;
- }
- }
-
- if (wb->previous_removed_props)
- {
- const svn_string_t *val;
- val = svn_ra_serf__get_prop_string(wb->previous_removed_props,
- wb->path, ns, name);
- if (val)
- {
- *have_old_val = TRUE;
- *old_val_p = NULL;
- }
- }
-
- return SVN_NO_ERROR;
-}
-
+/* Helper for create_proppatch_body. Writes per property xml to body */
static svn_error_t *
-proppatch_walker(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
+write_prop_xml(const proppatch_context_t *proppatch,
+ serf_bucket_t *body_bkt,
+ serf_bucket_alloc_t *alloc,
+ const svn_prop_t *prop,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- walker_baton_t *wb = baton;
- serf_bucket_t *body_bkt = wb->body_bkt;
serf_bucket_t *cdata_bkt;
- serf_bucket_alloc_t *alloc;
const char *encoding;
- svn_boolean_t have_old_val;
- const svn_string_t *old_val;
const svn_string_t *encoded_value;
const char *prop_name;
+ const svn_prop_t *old_prop;
- SVN_ERR(derive_old_val(&have_old_val, &old_val, wb, ns, name));
-
- /* Jump through hoops to work with D:remove and its val = (""-for-NULL)
- * representation. */
- if (wb->filter != filter_all_props)
- {
- if (wb->filter == filter_props_with_old_value && ! have_old_val)
- return SVN_NO_ERROR;
- if (wb->filter == filter_props_without_old_value && have_old_val)
- return SVN_NO_ERROR;
- }
- if (wb->deleting)
- val = NULL;
-
- alloc = body_bkt->allocator;
-
- SVN_ERR(get_encoding_and_cdata(&encoding, &encoded_value, alloc, val,
- wb->body_pool, scratch_pool));
+ SVN_ERR(get_encoding_and_cdata(&encoding, &encoded_value, alloc, prop->value,
+ result_pool, scratch_pool));
if (encoded_value)
{
cdata_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(encoded_value->data,
@@ -720,29 +593,40 @@ proppatch_walker(void *baton,
/* Use the namespace prefix instead of adding the xmlns attribute to support
property names containing ':' */
- if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
- prop_name = apr_pstrcat(wb->body_pool, "S:", name, (char *)NULL);
- else if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
- prop_name = apr_pstrcat(wb->body_pool, "C:", name, (char *)NULL);
+ if (strncmp(prop->name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX) - 1) == 0)
+ {
+ prop_name = apr_pstrcat(result_pool,
+ "S:", prop->name + sizeof(SVN_PROP_PREFIX) - 1,
+ SVN_VA_NULL);
+ }
+ else
+ {
+ prop_name = apr_pstrcat(result_pool,
+ "C:", prop->name,
+ SVN_VA_NULL);
+ }
if (cdata_bkt)
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, prop_name,
"V:encoding", encoding,
- NULL);
+ SVN_VA_NULL);
else
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, prop_name,
"V:" SVN_DAV__OLD_VALUE__ABSENT, "1",
- NULL);
+ SVN_VA_NULL);
- if (have_old_val)
+ old_prop = proppatch->old_props
+ ? svn_hash_gets(proppatch->old_props, prop->name)
+ : NULL;
+ if (old_prop)
{
const char *encoding2;
const svn_string_t *encoded_value2;
serf_bucket_t *cdata_bkt2;
SVN_ERR(get_encoding_and_cdata(&encoding2, &encoded_value2,
- alloc, old_val,
- wb->body_pool, scratch_pool));
+ alloc, old_prop->value,
+ result_pool, scratch_pool));
if (encoded_value2)
{
@@ -759,12 +643,12 @@ proppatch_walker(void *baton,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc,
"V:" SVN_DAV__OLD_VALUE,
"V:encoding", encoding2,
- NULL);
+ SVN_VA_NULL);
else
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc,
"V:" SVN_DAV__OLD_VALUE,
"V:" SVN_DAV__OLD_VALUE__ABSENT, "1",
- NULL);
+ SVN_VA_NULL);
if (cdata_bkt2)
serf_bucket_aggregate_append(body_bkt, cdata_bkt2);
@@ -799,7 +683,7 @@ maybe_set_lock_token_header(serf_bucket_t *headers,
{
const char *token;
- if (! (relpath && commit_ctx->lock_tokens))
+ if (! (*relpath && commit_ctx->lock_tokens))
return SVN_NO_ERROR;
if (! svn_hash_gets(commit_ctx->deleted_entries, relpath))
@@ -819,7 +703,7 @@ maybe_set_lock_token_header(serf_bucket_t *headers,
token_uri = apr_uri_unparse(pool, &uri, 0);
token_header = apr_pstrcat(pool, "<", token_uri, "> (<", token, ">)",
- (char *)NULL);
+ SVN_VA_NULL);
serf_bucket_headers_set(headers, "If", token_header);
}
}
@@ -830,7 +714,8 @@ maybe_set_lock_token_header(serf_bucket_t *headers,
static svn_error_t *
setup_proppatch_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
proppatch_context_t *proppatch = baton;
@@ -841,31 +726,26 @@ setup_proppatch_headers(serf_bucket_t *headers,
proppatch->base_revision));
}
- SVN_ERR(maybe_set_lock_token_header(headers, proppatch->commit,
- proppatch->relpath, pool));
+ if (proppatch->relpath && proppatch->commit_ctx)
+ SVN_ERR(maybe_set_lock_token_header(headers, proppatch->commit_ctx,
+ proppatch->relpath, pool));
return SVN_NO_ERROR;
}
-struct proppatch_body_baton_t {
- proppatch_context_t *proppatch;
-
- /* Content in the body should be allocated here, to live long enough. */
- apr_pool_t *body_pool;
-};
-
/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_proppatch_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
+ apr_pool_t *pool /* request pool */,
apr_pool_t *scratch_pool)
{
- struct proppatch_body_baton_t *pbb = baton;
- proppatch_context_t *ctx = pbb->proppatch;
+ proppatch_context_t *ctx = baton;
serf_bucket_t *body_bkt;
- walker_baton_t wb = { 0 };
+ svn_boolean_t opened = FALSE;
+ apr_hash_index_t *hi;
body_bkt = serf_bucket_aggregate_create(alloc);
@@ -875,58 +755,66 @@ create_proppatch_body(serf_bucket_t **bkt,
"xmlns:V", SVN_DAV_PROP_NS_DAV,
"xmlns:C", SVN_DAV_PROP_NS_CUSTOM,
"xmlns:S", SVN_DAV_PROP_NS_SVN,
- NULL);
+ SVN_VA_NULL);
- wb.body_bkt = body_bkt;
- wb.body_pool = pbb->body_pool;
- wb.previous_changed_props = ctx->previous_changed_props;
- wb.previous_removed_props = ctx->previous_removed_props;
- wb.path = ctx->path;
-
- if (apr_hash_count(ctx->changed_props) > 0)
+ /* First we write property SETs */
+ for (hi = apr_hash_first(scratch_pool, ctx->prop_changes);
+ hi;
+ hi = apr_hash_next(hi))
{
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:set", NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
+ svn_prop_t *prop = apr_hash_this_val(hi);
- wb.filter = filter_all_props;
- wb.deleting = FALSE;
- SVN_ERR(svn_ra_serf__walk_all_props(ctx->changed_props, ctx->path,
- SVN_INVALID_REVNUM,
- proppatch_walker, &wb,
- scratch_pool));
+ if (prop->value
+ || (ctx->old_props && svn_hash_gets(ctx->old_props, prop->name)))
+ {
+ if (!opened)
+ {
+ opened = TRUE;
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:set",
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop",
+ SVN_VA_NULL);
+ }
- svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
- svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:set");
+ SVN_ERR(write_prop_xml(ctx, body_bkt, alloc, prop,
+ pool, scratch_pool));
+ }
}
- if (apr_hash_count(ctx->removed_props) > 0)
+ if (opened)
{
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:set", NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
-
- wb.filter = filter_props_with_old_value;
- wb.deleting = TRUE;
- SVN_ERR(svn_ra_serf__walk_all_props(ctx->removed_props, ctx->path,
- SVN_INVALID_REVNUM,
- proppatch_walker, &wb,
- scratch_pool));
-
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:set");
}
- if (apr_hash_count(ctx->removed_props) > 0)
+ /* And then property REMOVEs */
+ opened = FALSE;
+
+ for (hi = apr_hash_first(scratch_pool, ctx->prop_changes);
+ hi;
+ hi = apr_hash_next(hi))
{
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:remove", NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
+ svn_prop_t *prop = apr_hash_this_val(hi);
- wb.filter = filter_props_without_old_value;
- wb.deleting = TRUE;
- SVN_ERR(svn_ra_serf__walk_all_props(ctx->removed_props, ctx->path,
- SVN_INVALID_REVNUM,
- proppatch_walker, &wb,
- scratch_pool));
+ if (!prop->value
+ && !(ctx->old_props && svn_hash_gets(ctx->old_props, prop->name)))
+ {
+ if (!opened)
+ {
+ opened = TRUE;
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:remove",
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop",
+ SVN_VA_NULL);
+ }
+ SVN_ERR(write_prop_xml(ctx, body_bkt, alloc, prop,
+ pool, scratch_pool));
+ }
+ }
+
+ if (opened)
+ {
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:remove");
}
@@ -938,45 +826,47 @@ create_proppatch_body(serf_bucket_t **bkt,
}
static svn_error_t*
-proppatch_resource(proppatch_context_t *proppatch,
- commit_context_t *commit,
+proppatch_resource(svn_ra_serf__session_t *session,
+ proppatch_context_t *proppatch,
apr_pool_t *pool)
{
svn_ra_serf__handler_t *handler;
- struct proppatch_body_baton_t pbb;
+ svn_error_t *err;
+
+ handler = svn_ra_serf__create_handler(session, pool);
- handler = apr_pcalloc(pool, sizeof(*handler));
- handler->handler_pool = pool;
handler->method = "PROPPATCH";
handler->path = proppatch->path;
- handler->conn = commit->conn;
- handler->session = commit->session;
handler->header_delegate = setup_proppatch_headers;
handler->header_delegate_baton = proppatch;
- pbb.proppatch = proppatch;
- pbb.body_pool = pool;
handler->body_delegate = create_proppatch_body;
- handler->body_delegate_baton = &pbb;
+ handler->body_delegate_baton = proppatch;
+ handler->body_type = "text/xml";
handler->response_handler = svn_ra_serf__handle_multistatus_only;
handler->response_baton = handler;
- SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
+ err = svn_ra_serf__context_run_one(handler, pool);
- if (handler->sline.code != 207
- || (handler->server_error != NULL
- && handler->server_error->error != NULL))
+ if (!err && handler->sline.code != 207)
+ err = svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
+ /* Use specific error code for property handling errors.
+ Use loop to provide the right result with tracing */
+ if (err && err->apr_err == SVN_ERR_RA_DAV_REQUEST_FAILED)
{
- return svn_error_create(
- SVN_ERR_RA_DAV_PROPPATCH_FAILED,
- return_response_err(handler),
- _("At least one property change failed; repository"
- " is unchanged"));
+ svn_error_t *e = err;
+
+ while (e && e->apr_err == SVN_ERR_RA_DAV_REQUEST_FAILED)
+ {
+ e->apr_err = SVN_ERR_RA_DAV_PROPPATCH_FAILED;
+ e = e->child;
+ }
}
- return SVN_NO_ERROR;
+ return svn_error_trace(err);
}
/* Implements svn_ra_serf__request_body_delegate_t */
@@ -984,7 +874,8 @@ static svn_error_t *
create_put_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
file_context_t *ctx = baton;
apr_off_t offset;
@@ -998,12 +889,10 @@ create_put_body(serf_bucket_t **body_bkt,
* check the buffer status; but serf will fall through and create a file
* bucket for us on the buffered svndiff handle.
*/
- apr_file_flush(ctx->svndiff);
-#if APR_VERSION_AT_LEAST(1, 3, 0)
+ SVN_ERR(svn_io_file_flush(ctx->svndiff, pool));
apr_file_buffer_set(ctx->svndiff, NULL, 0);
-#endif
offset = 0;
- apr_file_seek(ctx->svndiff, APR_SET, &offset);
+ SVN_ERR(svn_io_file_seek(ctx->svndiff, APR_SET, &offset, pool));
*body_bkt = serf_bucket_file_create(ctx->svndiff, alloc);
return SVN_NO_ERROR;
@@ -1014,7 +903,8 @@ static svn_error_t *
create_empty_put_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
*body_bkt = SERF_BUCKET_SIMPLE_STRING("", alloc);
return SVN_NO_ERROR;
@@ -1023,7 +913,8 @@ create_empty_put_body(serf_bucket_t **body_bkt,
static svn_error_t *
setup_put_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
file_context_t *ctx = baton;
@@ -1045,7 +936,7 @@ setup_put_headers(serf_bucket_t *headers,
ctx->result_checksum);
}
- SVN_ERR(maybe_set_lock_token_header(headers, ctx->commit,
+ SVN_ERR(maybe_set_lock_token_header(headers, ctx->commit_ctx,
ctx->relpath, pool));
return APR_SUCCESS;
@@ -1054,21 +945,21 @@ setup_put_headers(serf_bucket_t *headers,
static svn_error_t *
setup_copy_file_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
file_context_t *file = baton;
apr_uri_t uri;
const char *absolute_uri;
/* The Dest URI must be absolute. Bummer. */
- uri = file->commit->session->session_url;
+ uri = file->commit_ctx->session->session_url;
uri.path = (char*)file->url;
absolute_uri = apr_uri_unparse(pool, &uri, 0);
serf_bucket_headers_set(headers, "Destination", absolute_uri);
- serf_bucket_headers_setn(headers, "Depth", "0");
- serf_bucket_headers_setn(headers, "Overwrite", "T");
+ serf_bucket_headers_setn(headers, "Overwrite", "F");
return SVN_NO_ERROR;
}
@@ -1102,7 +993,7 @@ setup_if_header_recursive(svn_boolean_t *added,
hi;
hi = apr_hash_next(hi))
{
- const char *relpath = svn__apr_hash_index_key(hi);
+ const char *relpath = apr_hash_this_key(hi);
apr_uri_t uri;
if (!svn_relpath_skip_ancestor(rq_relpath, relpath))
@@ -1132,7 +1023,7 @@ setup_if_header_recursive(svn_boolean_t *added,
svn_stringbuf_appendbyte(sb, '<');
svn_stringbuf_appendcstr(sb, apr_uri_unparse(iterpool, &uri, 0));
svn_stringbuf_appendcstr(sb, "> (<");
- svn_stringbuf_appendcstr(sb, svn__apr_hash_index_val(hi));
+ svn_stringbuf_appendcstr(sb, apr_hash_this_val(hi));
svn_stringbuf_appendcstr(sb, ">)");
}
@@ -1153,29 +1044,31 @@ setup_if_header_recursive(svn_boolean_t *added,
static svn_error_t *
setup_add_dir_common_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
dir_context_t *dir = baton;
svn_boolean_t added;
return svn_error_trace(
- setup_if_header_recursive(&added, headers, dir->commit, dir->relpath,
+ setup_if_header_recursive(&added, headers, dir->commit_ctx, dir->relpath,
pool));
}
static svn_error_t *
setup_copy_dir_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
dir_context_t *dir = baton;
apr_uri_t uri;
const char *absolute_uri;
/* The Dest URI must be absolute. Bummer. */
- uri = dir->commit->session->session_url;
+ uri = dir->commit_ctx->session->session_url;
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
uri.path = (char *)dir->url;
}
@@ -1190,18 +1083,20 @@ setup_copy_dir_headers(serf_bucket_t *headers,
serf_bucket_headers_set(headers, "Destination", absolute_uri);
serf_bucket_headers_setn(headers, "Depth", "infinity");
- serf_bucket_headers_setn(headers, "Overwrite", "T");
+ serf_bucket_headers_setn(headers, "Overwrite", "F");
/* Implicitly checkout this dir now. */
dir->working_url = apr_pstrdup(dir->pool, uri.path);
- return svn_error_trace(setup_add_dir_common_headers(headers, baton, pool));
+ return svn_error_trace(setup_add_dir_common_headers(headers, baton, pool,
+ scratch_pool));
}
static svn_error_t *
setup_delete_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
delete_context_t *del = baton;
svn_boolean_t added;
@@ -1209,34 +1104,23 @@ setup_delete_headers(serf_bucket_t *headers,
serf_bucket_headers_set(headers, SVN_DAV_VERSION_NAME_HEADER,
apr_ltoa(pool, del->revision));
- SVN_ERR(setup_if_header_recursive(&added, headers, del->commit,
- del->relpath, pool));
+ if (! del->non_recursive_if)
+ SVN_ERR(setup_if_header_recursive(&added, headers, del->commit_ctx,
+ del->relpath, pool));
+ else
+ {
+ SVN_ERR(maybe_set_lock_token_header(headers, del->commit_ctx,
+ del->relpath, pool));
+ added = TRUE;
+ }
- if (added && del->commit->keep_locks)
+ if (added && del->commit_ctx->keep_locks)
serf_bucket_headers_setn(headers, SVN_DAV_OPTIONS_HEADER,
SVN_DAV_OPTION_KEEP_LOCKS);
return SVN_NO_ERROR;
}
-/* Helper function to write the svndiff stream to temporary file. */
-static svn_error_t *
-svndiff_stream_write(void *file_baton,
- const char *data,
- apr_size_t *len)
-{
- file_context_t *ctx = file_baton;
- apr_status_t status;
-
- status = apr_file_write_full(ctx->svndiff, data, *len, NULL);
- if (status)
- return svn_error_wrap_apr(status, _("Failed writing updated file"));
-
- return SVN_NO_ERROR;
-}
-
-
-
/* POST against 'me' resource handlers. */
/* Implements svn_ra_serf__request_body_delegate_t */
@@ -1244,7 +1128,8 @@ static svn_error_t *
create_txn_post_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
apr_hash_t *revprops = baton;
svn_skel_t *request_skel;
@@ -1273,7 +1158,8 @@ create_txn_post_body(serf_bucket_t **body_bkt,
static svn_error_t *
setup_post_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
#ifdef SVN_DAV_SEND_VTXN_NAME
/* Enable this to exercise the VTXN-NAME code based on a client
@@ -1365,66 +1251,47 @@ open_root(void *edit_baton,
apr_pool_t *dir_pool,
void **root_baton)
{
- commit_context_t *ctx = edit_baton;
+ commit_context_t *commit_ctx = edit_baton;
svn_ra_serf__handler_t *handler;
proppatch_context_t *proppatch_ctx;
dir_context_t *dir;
apr_hash_index_t *hi;
const char *proppatch_target = NULL;
+ apr_pool_t *scratch_pool = svn_pool_create(dir_pool);
- if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(ctx->session))
+ if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(commit_ctx->session))
{
post_response_ctx_t *prc;
const char *rel_path;
svn_boolean_t post_with_revprops
- = (NULL != svn_hash_gets(ctx->session->supported_posts,
+ = (NULL != svn_hash_gets(commit_ctx->session->supported_posts,
"create-txn-with-props"));
/* Create our activity URL now on the server. */
- handler = apr_pcalloc(ctx->pool, sizeof(*handler));
- handler->handler_pool = ctx->pool;
+ handler = svn_ra_serf__create_handler(commit_ctx->session, scratch_pool);
+
handler->method = "POST";
handler->body_type = SVN_SKEL_MIME_TYPE;
handler->body_delegate = create_txn_post_body;
handler->body_delegate_baton =
- post_with_revprops ? ctx->revprop_table : NULL;
+ post_with_revprops ? commit_ctx->revprop_table : NULL;
handler->header_delegate = setup_post_headers;
handler->header_delegate_baton = NULL;
- handler->path = ctx->session->me_resource;
- handler->conn = ctx->session->conns[0];
- handler->session = ctx->session;
+ handler->path = commit_ctx->session->me_resource;
- prc = apr_pcalloc(ctx->pool, sizeof(*prc));
+ prc = apr_pcalloc(scratch_pool, sizeof(*prc));
prc->handler = handler;
- prc->commit_ctx = ctx;
+ prc->commit_ctx = commit_ctx;
handler->response_handler = post_response_handler;
handler->response_baton = prc;
- SVN_ERR(svn_ra_serf__context_run_one(handler, ctx->pool));
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
if (handler->sline.code != 201)
- {
- apr_status_t status = SVN_ERR_RA_DAV_REQUEST_FAILED;
-
- switch (handler->sline.code)
- {
- case 403:
- status = SVN_ERR_RA_DAV_FORBIDDEN;
- break;
- case 404:
- status = SVN_ERR_FS_NOT_FOUND;
- break;
- }
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- return svn_error_createf(status, NULL,
- _("%s of '%s': %d %s (%s://%s)"),
- handler->method, handler->path,
- handler->sline.code, handler->sline.reason,
- ctx->session->session_url.scheme,
- ctx->session->session_url.hostinfo);
- }
- if (! (ctx->txn_root_url && ctx->txn_url))
+ if (! (commit_ctx->txn_root_url && commit_ctx->txn_url))
{
return svn_error_createf(
SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
@@ -1432,114 +1299,82 @@ open_root(void *edit_baton,
}
/* Fixup the txn_root_url to point to the anchor of the commit. */
- SVN_ERR(svn_ra_serf__get_relative_path(&rel_path,
- ctx->session->session_url.path,
- ctx->session, NULL, dir_pool));
- ctx->txn_root_url = svn_path_url_add_component2(ctx->txn_root_url,
- rel_path, ctx->pool);
+ SVN_ERR(svn_ra_serf__get_relative_path(
+ &rel_path,
+ commit_ctx->session->session_url.path,
+ commit_ctx->session,
+ scratch_pool));
+ commit_ctx->txn_root_url = svn_path_url_add_component2(
+ commit_ctx->txn_root_url,
+ rel_path, commit_ctx->pool);
/* Build our directory baton. */
dir = apr_pcalloc(dir_pool, sizeof(*dir));
dir->pool = dir_pool;
- dir->commit = ctx;
+ dir->commit_ctx = commit_ctx;
dir->base_revision = base_revision;
dir->relpath = "";
dir->name = "";
- dir->changed_props = apr_hash_make(dir->pool);
- dir->removed_props = apr_hash_make(dir->pool);
- dir->url = apr_pstrdup(dir->pool, ctx->txn_root_url);
+ dir->prop_changes = apr_hash_make(dir->pool);
+ dir->url = apr_pstrdup(dir->pool, commit_ctx->txn_root_url);
/* If we included our revprops in the POST, we need not
PROPPATCH them. */
- proppatch_target = post_with_revprops ? NULL : ctx->txn_url;
+ proppatch_target = post_with_revprops ? NULL : commit_ctx->txn_url;
}
else
{
- const char *activity_str = ctx->session->activity_collection_url;
+ const char *activity_str = commit_ctx->session->activity_collection_url;
if (!activity_str)
- SVN_ERR(svn_ra_serf__v1_get_activity_collection(&activity_str,
- ctx->session->conns[0],
- ctx->pool,
- ctx->pool));
-
- /* Cache the result. */
- if (activity_str)
- {
- ctx->session->activity_collection_url =
- apr_pstrdup(ctx->session->pool, activity_str);
- }
- else
- {
- return svn_error_create(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED, NULL,
- _("The OPTIONS response did not include the "
- "requested activity-collection-set value"));
- }
+ SVN_ERR(svn_ra_serf__v1_get_activity_collection(
+ &activity_str,
+ commit_ctx->session,
+ scratch_pool, scratch_pool));
- ctx->activity_url =
- svn_path_url_add_component2(activity_str, svn_uuid_generate(ctx->pool),
- ctx->pool);
+ commit_ctx->activity_url = svn_path_url_add_component2(
+ activity_str,
+ svn_uuid_generate(scratch_pool),
+ commit_ctx->pool);
/* Create our activity URL now on the server. */
- handler = apr_pcalloc(ctx->pool, sizeof(*handler));
- handler->handler_pool = ctx->pool;
+ handler = svn_ra_serf__create_handler(commit_ctx->session, scratch_pool);
+
handler->method = "MKACTIVITY";
- handler->path = ctx->activity_url;
- handler->conn = ctx->session->conns[0];
- handler->session = ctx->session;
+ handler->path = commit_ctx->activity_url;
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
- SVN_ERR(svn_ra_serf__context_run_one(handler, ctx->pool));
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
if (handler->sline.code != 201)
- {
- apr_status_t status = SVN_ERR_RA_DAV_REQUEST_FAILED;
-
- switch (handler->sline.code)
- {
- case 403:
- status = SVN_ERR_RA_DAV_FORBIDDEN;
- break;
- case 404:
- status = SVN_ERR_FS_NOT_FOUND;
- break;
- }
-
- return svn_error_createf(status, NULL,
- _("%s of '%s': %d %s (%s://%s)"),
- handler->method, handler->path,
- handler->sline.code, handler->sline.reason,
- ctx->session->session_url.scheme,
- ctx->session->session_url.hostinfo);
- }
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
/* Now go fetch our VCC and baseline so we can do a CHECKOUT. */
- SVN_ERR(svn_ra_serf__discover_vcc(&(ctx->vcc_url), ctx->session,
- ctx->conn, ctx->pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&(commit_ctx->vcc_url),
+ commit_ctx->session, scratch_pool));
/* Build our directory baton. */
dir = apr_pcalloc(dir_pool, sizeof(*dir));
dir->pool = dir_pool;
- dir->commit = ctx;
+ dir->commit_ctx = commit_ctx;
dir->base_revision = base_revision;
dir->relpath = "";
dir->name = "";
- dir->changed_props = apr_hash_make(dir->pool);
- dir->removed_props = apr_hash_make(dir->pool);
+ dir->prop_changes = apr_hash_make(dir->pool);
- SVN_ERR(get_version_url(&dir->url, dir->commit->session,
+ SVN_ERR(get_version_url(&dir->url, dir->commit_ctx->session,
dir->relpath,
- dir->base_revision, ctx->checked_in_url,
- dir->pool, dir->pool /* scratch_pool */));
- ctx->checked_in_url = dir->url;
+ dir->base_revision, commit_ctx->checked_in_url,
+ dir->pool, scratch_pool));
+ commit_ctx->checked_in_url = apr_pstrdup(commit_ctx->pool, dir->url);
/* Checkout our root dir */
- SVN_ERR(checkout_dir(dir, dir->pool /* scratch_pool */));
+ SVN_ERR(checkout_dir(dir, scratch_pool));
- proppatch_target = ctx->baseline_url;
+ proppatch_target = commit_ctx->baseline_url;
}
/* Unless this is NULL -- which means we don't need to PROPPATCH the
@@ -1547,44 +1382,58 @@ open_root(void *edit_baton,
transaction with our revprops. */
if (proppatch_target)
{
- proppatch_ctx = apr_pcalloc(ctx->pool, sizeof(*proppatch_ctx));
- proppatch_ctx->pool = dir_pool;
- proppatch_ctx->commit = ctx;
+ proppatch_ctx = apr_pcalloc(scratch_pool, sizeof(*proppatch_ctx));
+ proppatch_ctx->pool = scratch_pool;
+ proppatch_ctx->commit_ctx = NULL; /* No lock info */
proppatch_ctx->path = proppatch_target;
- proppatch_ctx->changed_props = apr_hash_make(proppatch_ctx->pool);
- proppatch_ctx->removed_props = apr_hash_make(proppatch_ctx->pool);
+ proppatch_ctx->prop_changes = apr_hash_make(proppatch_ctx->pool);
proppatch_ctx->base_revision = SVN_INVALID_REVNUM;
- for (hi = apr_hash_first(ctx->pool, ctx->revprop_table); hi;
+ for (hi = apr_hash_first(scratch_pool, commit_ctx->revprop_table);
+ hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_string_t *value = svn__apr_hash_index_val(hi);
- const char *ns;
+ svn_prop_t *prop = apr_palloc(scratch_pool, sizeof(*prop));
- if (strncmp(name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX) - 1) == 0)
- {
- ns = SVN_DAV_PROP_NS_SVN;
- name += sizeof(SVN_PROP_PREFIX) - 1;
- }
- else
- {
- ns = SVN_DAV_PROP_NS_CUSTOM;
- }
+ prop->name = apr_hash_this_key(hi);
+ prop->value = apr_hash_this_val(hi);
- svn_ra_serf__set_prop(proppatch_ctx->changed_props,
- proppatch_ctx->path,
- ns, name, value, proppatch_ctx->pool);
+ svn_hash_sets(proppatch_ctx->prop_changes, prop->name, prop);
}
- SVN_ERR(proppatch_resource(proppatch_ctx, dir->commit, ctx->pool));
+ SVN_ERR(proppatch_resource(commit_ctx->session,
+ proppatch_ctx, scratch_pool));
}
+ svn_pool_destroy(scratch_pool);
+
*root_baton = dir;
return SVN_NO_ERROR;
}
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_delete_body(serf_bucket_t **body_bkt,
+ void *baton,
+ serf_bucket_alloc_t *alloc,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ delete_context_t *ctx = baton;
+ serf_bucket_t *body;
+
+ body = serf_bucket_aggregate_create(alloc);
+
+ svn_ra_serf__add_xml_header_buckets(body, alloc);
+
+ svn_ra_serf__merge_lock_token_list(ctx->commit_ctx->lock_tokens,
+ ctx->relpath, body, alloc, pool);
+
+ *body_bkt = body;
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
delete_entry(const char *path,
svn_revnum_t revision,
@@ -1596,10 +1445,11 @@ delete_entry(const char *path,
svn_ra_serf__handler_t *handler;
const char *delete_target;
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
- delete_target = svn_path_url_add_component2(dir->commit->txn_root_url,
- path, dir->pool);
+ delete_target = svn_path_url_add_component2(
+ dir->commit_ctx->txn_root_url,
+ path, dir->pool);
}
else
{
@@ -1615,12 +1465,9 @@ delete_entry(const char *path,
delete_ctx = apr_pcalloc(pool, sizeof(*delete_ctx));
delete_ctx->relpath = apr_pstrdup(pool, path);
delete_ctx->revision = revision;
- delete_ctx->commit = dir->commit;
+ delete_ctx->commit_ctx = dir->commit_ctx;
- handler = apr_pcalloc(pool, sizeof(*handler));
- handler->handler_pool = pool;
- handler->session = dir->commit->session;
- handler->conn = dir->commit->conn;
+ handler = svn_ra_serf__create_handler(dir->commit_ctx->session, pool);
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
@@ -1630,17 +1477,43 @@ delete_entry(const char *path,
handler->method = "DELETE";
handler->path = delete_target;
+ handler->no_fail_on_http_failure_status = TRUE;
SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- /* 204 No Content: item successfully deleted */
- if (handler->sline.code != 204)
+ if (handler->sline.code == 400)
{
- return svn_error_trace(return_response_err(handler));
+ /* Try again with non-standard body to overcome Apache Httpd
+ header limit */
+ delete_ctx->non_recursive_if = TRUE;
+
+ handler = svn_ra_serf__create_handler(dir->commit_ctx->session, pool);
+
+ handler->response_handler = svn_ra_serf__expect_empty_body;
+ handler->response_baton = handler;
+
+ handler->header_delegate = setup_delete_headers;
+ handler->header_delegate_baton = delete_ctx;
+
+ handler->method = "DELETE";
+ handler->path = delete_target;
+
+ handler->body_type = "text/xml";
+ handler->body_delegate = create_delete_body;
+ handler->body_delegate_baton = delete_ctx;
+
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
}
- svn_hash_sets(dir->commit->deleted_entries,
- apr_pstrdup(dir->commit->pool, path), (void *)1);
+ if (handler->server_error)
+ return svn_ra_serf__server_error_create(handler, pool);
+
+ /* 204 No Content: item successfully deleted */
+ if (handler->sline.code != 204)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
+ svn_hash_sets(dir->commit_ctx->deleted_entries,
+ apr_pstrdup(dir->commit_ctx->pool, path), (void *)1);
return SVN_NO_ERROR;
}
@@ -1663,19 +1536,18 @@ add_directory(const char *path,
dir->pool = dir_pool;
dir->parent_dir = parent;
- dir->commit = parent->commit;
+ dir->commit_ctx = parent->commit_ctx;
dir->added = TRUE;
dir->base_revision = SVN_INVALID_REVNUM;
dir->copy_revision = copyfrom_revision;
dir->copy_path = apr_pstrdup(dir->pool, copyfrom_path);
dir->relpath = apr_pstrdup(dir->pool, path);
dir->name = svn_relpath_basename(dir->relpath, NULL);
- dir->changed_props = apr_hash_make(dir->pool);
- dir->removed_props = apr_hash_make(dir->pool);
+ dir->prop_changes = apr_hash_make(dir->pool);
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
- dir->url = svn_path_url_add_component2(parent->commit->txn_root_url,
+ dir->url = svn_path_url_add_component2(parent->commit_ctx->txn_root_url,
path, dir->pool);
mkcol_target = dir->url;
}
@@ -1684,17 +1556,14 @@ add_directory(const char *path,
/* Ensure our parent is checked out. */
SVN_ERR(checkout_dir(parent, dir->pool /* scratch_pool */));
- dir->url = svn_path_url_add_component2(parent->commit->checked_in_url,
+ dir->url = svn_path_url_add_component2(parent->commit_ctx->checked_in_url,
dir->name, dir->pool);
mkcol_target = svn_path_url_add_component2(
parent->working_url,
dir->name, dir->pool);
}
- handler = apr_pcalloc(dir->pool, sizeof(*handler));
- handler->handler_pool = dir->pool;
- handler->conn = dir->commit->conn;
- handler->session = dir->commit->session;
+ handler = svn_ra_serf__create_handler(dir->commit_ctx->session, dir->pool);
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
@@ -1719,10 +1588,8 @@ add_directory(const char *path,
dir->copy_path);
}
- /* ### conn==NULL for session->conns[0]. same as commit->conn. */
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- dir->commit->session,
- NULL /* conn */,
+ dir->commit_ctx->session,
uri.path, dir->copy_revision,
dir_pool, dir_pool));
@@ -1732,26 +1599,13 @@ add_directory(const char *path,
handler->header_delegate = setup_copy_dir_headers;
handler->header_delegate_baton = dir;
}
-
+ /* We have the same problem as with DELETE here: if there are too many
+ locks, the request fails. But in this case there is no way to retry
+ with a non-standard request. #### How to fix? */
SVN_ERR(svn_ra_serf__context_run_one(handler, dir->pool));
- switch (handler->sline.code)
- {
- case 201: /* Created: item was successfully copied */
- case 204: /* No Content: item successfully replaced an existing target */
- break;
-
- case 403:
- return svn_error_createf(SVN_ERR_RA_DAV_FORBIDDEN, NULL,
- _("Access to '%s' forbidden"),
- handler->path);
- default:
- return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("Adding directory failed: %s on %s "
- "(%d %s)"),
- handler->method, handler->path,
- handler->sline.code, handler->sline.reason);
- }
+ if (handler->sline.code != 201)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
*child_baton = dir;
@@ -1773,26 +1627,25 @@ open_directory(const char *path,
dir->pool = dir_pool;
dir->parent_dir = parent;
- dir->commit = parent->commit;
+ dir->commit_ctx = parent->commit_ctx;
dir->added = FALSE;
dir->base_revision = base_revision;
dir->relpath = apr_pstrdup(dir->pool, path);
dir->name = svn_relpath_basename(dir->relpath, NULL);
- dir->changed_props = apr_hash_make(dir->pool);
- dir->removed_props = apr_hash_make(dir->pool);
+ dir->prop_changes = apr_hash_make(dir->pool);
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
- dir->url = svn_path_url_add_component2(parent->commit->txn_root_url,
+ dir->url = svn_path_url_add_component2(parent->commit_ctx->txn_root_url,
path, dir->pool);
}
else
{
SVN_ERR(get_version_url(&dir->url,
- dir->commit->session,
+ dir->commit_ctx->session,
dir->relpath, dir->base_revision,
- dir->commit->checked_in_url,
+ dir->commit_ctx->checked_in_url,
dir->pool, dir->pool /* scratch_pool */));
}
*child_baton = dir;
@@ -1804,48 +1657,23 @@ static svn_error_t *
change_dir_prop(void *dir_baton,
const char *name,
const svn_string_t *value,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
dir_context_t *dir = dir_baton;
- const char *ns;
- const char *proppatch_target;
+ svn_prop_t *prop;
-
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
- {
- proppatch_target = dir->url;
- }
- else
+ if (! USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
/* Ensure we have a checked out dir. */
- SVN_ERR(checkout_dir(dir, pool /* scratch_pool */));
-
- proppatch_target = dir->working_url;
+ SVN_ERR(checkout_dir(dir, scratch_pool));
}
- name = apr_pstrdup(dir->pool, name);
- if (strncmp(name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX) - 1) == 0)
- {
- ns = SVN_DAV_PROP_NS_SVN;
- name += sizeof(SVN_PROP_PREFIX) - 1;
- }
- else
- {
- ns = SVN_DAV_PROP_NS_CUSTOM;
- }
+ prop = apr_palloc(dir->pool, sizeof(*prop));
- if (value)
- {
- value = svn_string_dup(value, dir->pool);
- svn_ra_serf__set_prop(dir->changed_props, proppatch_target,
- ns, name, value, dir->pool);
- }
- else
- {
- value = svn_string_create_empty(dir->pool);
- svn_ra_serf__set_prop(dir->removed_props, proppatch_target,
- ns, name, value, dir->pool);
- }
+ prop->name = apr_pstrdup(dir->pool, name);
+ prop->value = svn_string_dup(value, dir->pool);
+
+ svn_hash_sets(dir->prop_changes, prop->name, prop);
return SVN_NO_ERROR;
}
@@ -1861,20 +1689,18 @@ close_directory(void *dir_baton,
*/
/* PROPPATCH our prop change and pass it along. */
- if (apr_hash_count(dir->changed_props) ||
- apr_hash_count(dir->removed_props))
+ if (apr_hash_count(dir->prop_changes))
{
proppatch_context_t *proppatch_ctx;
proppatch_ctx = apr_pcalloc(pool, sizeof(*proppatch_ctx));
proppatch_ctx->pool = pool;
- proppatch_ctx->commit = dir->commit;
+ proppatch_ctx->commit_ctx = NULL /* No lock tokens necessary */;
proppatch_ctx->relpath = dir->relpath;
- proppatch_ctx->changed_props = dir->changed_props;
- proppatch_ctx->removed_props = dir->removed_props;
+ proppatch_ctx->prop_changes = dir->prop_changes;
proppatch_ctx->base_revision = dir->base_revision;
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
proppatch_ctx->path = dir->url;
}
@@ -1883,7 +1709,8 @@ close_directory(void *dir_baton,
proppatch_ctx->path = dir->working_url;
}
- SVN_ERR(proppatch_resource(proppatch_ctx, dir->commit, dir->pool));
+ SVN_ERR(proppatch_resource(dir->commit_ctx->session,
+ proppatch_ctx, dir->pool));
}
return SVN_NO_ERROR;
@@ -1900,6 +1727,7 @@ add_file(const char *path,
dir_context_t *dir = parent_baton;
file_context_t *new_file;
const char *deleted_parent = path;
+ apr_pool_t *scratch_pool = svn_pool_create(file_pool);
new_file = apr_pcalloc(file_pool, sizeof(*new_file));
new_file->pool = file_pool;
@@ -1907,28 +1735,27 @@ add_file(const char *path,
dir->ref_count++;
new_file->parent_dir = dir;
- new_file->commit = dir->commit;
+ new_file->commit_ctx = dir->commit_ctx;
new_file->relpath = apr_pstrdup(new_file->pool, path);
new_file->name = svn_relpath_basename(new_file->relpath, NULL);
new_file->added = TRUE;
new_file->base_revision = SVN_INVALID_REVNUM;
new_file->copy_path = apr_pstrdup(new_file->pool, copy_path);
new_file->copy_revision = copy_revision;
- new_file->changed_props = apr_hash_make(new_file->pool);
- new_file->removed_props = apr_hash_make(new_file->pool);
+ new_file->prop_changes = apr_hash_make(new_file->pool);
/* Ensure that the file doesn't exist by doing a HEAD on the
resource. If we're using HTTP v2, we'll just look into the
transaction root tree for this thing. */
- if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(dir->commit_ctx))
{
- new_file->url = svn_path_url_add_component2(dir->commit->txn_root_url,
+ new_file->url = svn_path_url_add_component2(dir->commit_ctx->txn_root_url,
path, new_file->pool);
}
else
{
/* Ensure our parent directory has been checked out */
- SVN_ERR(checkout_dir(dir, new_file->pool /* scratch_pool */));
+ SVN_ERR(checkout_dir(dir, scratch_pool));
new_file->url =
svn_path_url_add_component2(dir->working_url,
@@ -1937,49 +1764,78 @@ add_file(const char *path,
while (deleted_parent && deleted_parent[0] != '\0')
{
- if (svn_hash_gets(dir->commit->deleted_entries, deleted_parent))
+ if (svn_hash_gets(dir->commit_ctx->deleted_entries, deleted_parent))
{
break;
}
deleted_parent = svn_relpath_dirname(deleted_parent, file_pool);
}
- if (! ((dir->added && !dir->copy_path) ||
- (deleted_parent && deleted_parent[0] != '\0')))
+ if (copy_path)
{
svn_ra_serf__handler_t *handler;
+ apr_uri_t uri;
+ const char *req_url;
+ apr_status_t status;
+
+ /* Create the copy directly as cheap 'does exist/out of date'
+ check. We update the copy (if needed) from close_file() */
+
+ status = apr_uri_parse(scratch_pool, copy_path, &uri);
+ if (status)
+ return svn_ra_serf__wrap_err(status, NULL);
+
+ SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
+ dir->commit_ctx->session,
+ uri.path, copy_revision,
+ scratch_pool, scratch_pool));
+
+ handler = svn_ra_serf__create_handler(dir->commit_ctx->session,
+ scratch_pool);
+ handler->method = "COPY";
+ handler->path = req_url;
- handler = apr_pcalloc(new_file->pool, sizeof(*handler));
- handler->handler_pool = new_file->pool;
- handler->session = new_file->commit->session;
- handler->conn = new_file->commit->conn;
- handler->method = "HEAD";
- handler->path = svn_path_url_add_component2(
- dir->commit->session->session_url.path,
- path, new_file->pool);
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
- SVN_ERR(svn_ra_serf__context_run_one(handler, new_file->pool));
+ handler->header_delegate = setup_copy_file_headers;
+ handler->header_delegate_baton = new_file;
- if (handler->sline.code != 404)
- {
- if (handler->sline.code != 200)
- {
- svn_error_t *err;
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
- err = svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location);
+ if (handler->sline.code != 201)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+ }
+ else if (! ((dir->added && !dir->copy_path) ||
+ (deleted_parent && deleted_parent[0] != '\0')))
+ {
+ svn_ra_serf__handler_t *handler;
+ svn_error_t *err;
- SVN_ERR(err);
- }
+ handler = svn_ra_serf__create_handler(dir->commit_ctx->session,
+ scratch_pool);
+ handler->method = "HEAD";
+ handler->path = svn_path_url_add_component2(
+ dir->commit_ctx->session->session_url.path,
+ path, scratch_pool);
+ handler->response_handler = svn_ra_serf__expect_empty_body;
+ handler->response_baton = handler;
+ handler->no_dav_headers = TRUE; /* Read only operation outside txn */
+
+ err = svn_ra_serf__context_run_one(handler, scratch_pool);
- return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
- _("File '%s' already exists"), path);
+ if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err); /* Great. We can create a new file! */
}
+ else if (err)
+ return svn_error_trace(err);
+ else
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("File '%s' already exists"), path);
}
+ svn_pool_destroy(scratch_pool);
*file_baton = new_file;
return SVN_NO_ERROR;
@@ -2001,17 +1857,16 @@ open_file(const char *path,
parent->ref_count++;
new_file->parent_dir = parent;
- new_file->commit = parent->commit;
+ new_file->commit_ctx = parent->commit_ctx;
new_file->relpath = apr_pstrdup(new_file->pool, path);
new_file->name = svn_relpath_basename(new_file->relpath, NULL);
new_file->added = FALSE;
new_file->base_revision = base_revision;
- new_file->changed_props = apr_hash_make(new_file->pool);
- new_file->removed_props = apr_hash_make(new_file->pool);
+ new_file->prop_changes = apr_hash_make(new_file->pool);
- if (USING_HTTPV2_COMMIT_SUPPORT(parent->commit))
+ if (USING_HTTPV2_COMMIT_SUPPORT(parent->commit_ctx))
{
- new_file->url = svn_path_url_add_component2(parent->commit->txn_root_url,
+ new_file->url = svn_path_url_add_component2(parent->commit_ctx->txn_root_url,
path, new_file->pool);
}
else
@@ -2027,6 +1882,23 @@ open_file(const char *path,
return SVN_NO_ERROR;
}
+/* Implements svn_stream_lazyopen_func_t for apply_textdelta */
+static svn_error_t *
+delayed_commit_stream_open(svn_stream_t **stream,
+ void *baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ file_context_t *file_ctx = baton;
+
+ SVN_ERR(svn_io_open_unique_file3(&file_ctx->svndiff, NULL, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ file_ctx->pool, scratch_pool));
+
+ *stream = svn_stream_from_aprfile2(file_ctx->svndiff, TRUE, result_pool);
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
apply_textdelta(void *file_baton,
const char *base_checksum,
@@ -2043,18 +1915,10 @@ apply_textdelta(void *file_baton,
* writing to a temporary file (ugh). A special svn stream serf bucket
* that returns EAGAIN until we receive the done call? But, when
* would we run through the serf context? Grr.
- *
- * ctx->pool is the same for all files in the commit that send a
- * textdelta so this file is explicitly closed in close_file to
- * avoid too many simultaneously open files.
*/
- SVN_ERR(svn_io_open_unique_file3(&ctx->svndiff, NULL, NULL,
- svn_io_file_del_on_pool_cleanup,
- ctx->pool, pool));
-
- ctx->stream = svn_stream_create(ctx, pool);
- svn_stream_set_write(ctx->stream, svndiff_stream_write);
+ ctx->stream = svn_stream_lazyopen_create(delayed_commit_stream_open,
+ ctx, FALSE, ctx->pool);
svn_txdelta_to_svndiff3(handler, handler_baton, ctx->stream, 0,
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, pool);
@@ -2072,33 +1936,14 @@ change_file_prop(void *file_baton,
apr_pool_t *pool)
{
file_context_t *file = file_baton;
- const char *ns;
+ svn_prop_t *prop;
- name = apr_pstrdup(file->pool, name);
+ prop = apr_palloc(file->pool, sizeof(*prop));
- if (strncmp(name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX) - 1) == 0)
- {
- ns = SVN_DAV_PROP_NS_SVN;
- name += sizeof(SVN_PROP_PREFIX) - 1;
- }
- else
- {
- ns = SVN_DAV_PROP_NS_CUSTOM;
- }
-
- if (value)
- {
- value = svn_string_dup(value, file->pool);
- svn_ra_serf__set_prop(file->changed_props, file->url,
- ns, name, value, file->pool);
- }
- else
- {
- value = svn_string_create_empty(file->pool);
+ prop->name = apr_pstrdup(file->pool, name);
+ prop->value = svn_string_dup(value, file->pool);
- svn_ra_serf__set_prop(file->removed_props, file->url,
- ns, name, value, file->pool);
- }
+ svn_hash_sets(file->prop_changes, prop->name, prop);
return SVN_NO_ERROR;
}
@@ -2110,69 +1955,26 @@ close_file(void *file_baton,
{
file_context_t *ctx = file_baton;
svn_boolean_t put_empty_file = FALSE;
- apr_status_t status;
ctx->result_checksum = text_checksum;
- if (ctx->copy_path)
- {
- svn_ra_serf__handler_t *handler;
- apr_uri_t uri;
- const char *req_url;
-
- status = apr_uri_parse(scratch_pool, ctx->copy_path, &uri);
- if (status)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Unable to parse URL '%s'"),
- ctx->copy_path);
- }
-
- /* ### conn==NULL for session->conns[0]. same as commit->conn. */
- SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- ctx->commit->session,
- NULL /* conn */,
- uri.path, ctx->copy_revision,
- scratch_pool, scratch_pool));
-
- handler = apr_pcalloc(scratch_pool, sizeof(*handler));
- handler->handler_pool = scratch_pool;
- handler->method = "COPY";
- handler->path = req_url;
- handler->conn = ctx->commit->conn;
- handler->session = ctx->commit->session;
-
- handler->response_handler = svn_ra_serf__expect_empty_body;
- handler->response_baton = handler;
-
- handler->header_delegate = setup_copy_file_headers;
- handler->header_delegate_baton = ctx;
-
- SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
-
- if (handler->sline.code != 201 && handler->sline.code != 204)
- {
- return svn_error_trace(return_response_err(handler));
- }
- }
-
/* If we got no stream of changes, but this is an added-without-history
* file, make a note that we'll be PUTting a zero-byte file to the server.
*/
- if ((!ctx->stream) && ctx->added && (!ctx->copy_path))
+ if ((!ctx->svndiff) && ctx->added && (!ctx->copy_path))
put_empty_file = TRUE;
/* If we had a stream of changes, push them to the server... */
- if (ctx->stream || put_empty_file)
+ if (ctx->svndiff || put_empty_file)
{
svn_ra_serf__handler_t *handler;
+ int expected_result;
+
+ handler = svn_ra_serf__create_handler(ctx->commit_ctx->session,
+ scratch_pool);
- handler = apr_pcalloc(scratch_pool, sizeof(*handler));
- handler->handler_pool = scratch_pool;
handler->method = "PUT";
handler->path = ctx->url;
- handler->conn = ctx->commit->conn;
- handler->session = ctx->commit->session;
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
@@ -2195,31 +1997,33 @@ close_file(void *file_baton,
SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
- if (handler->sline.code != 204 && handler->sline.code != 201)
- {
- return svn_error_trace(return_response_err(handler));
- }
+ if (ctx->added && ! ctx->copy_path)
+ expected_result = 201; /* Created */
+ else
+ expected_result = 204; /* Updated */
+
+ if (handler->sline.code != expected_result)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
if (ctx->svndiff)
SVN_ERR(svn_io_file_close(ctx->svndiff, scratch_pool));
/* If we had any prop changes, push them via PROPPATCH. */
- if (apr_hash_count(ctx->changed_props) ||
- apr_hash_count(ctx->removed_props))
+ if (apr_hash_count(ctx->prop_changes))
{
proppatch_context_t *proppatch;
- proppatch = apr_pcalloc(ctx->pool, sizeof(*proppatch));
- proppatch->pool = ctx->pool;
+ proppatch = apr_pcalloc(scratch_pool, sizeof(*proppatch));
+ proppatch->pool = scratch_pool;
proppatch->relpath = ctx->relpath;
proppatch->path = ctx->url;
- proppatch->commit = ctx->commit;
- proppatch->changed_props = ctx->changed_props;
- proppatch->removed_props = ctx->removed_props;
+ proppatch->commit_ctx = ctx->commit_ctx;
+ proppatch->prop_changes = ctx->prop_changes;
proppatch->base_revision = ctx->base_revision;
- SVN_ERR(proppatch_resource(proppatch, ctx->commit, ctx->pool));
+ SVN_ERR(proppatch_resource(ctx->commit_ctx->session,
+ proppatch, scratch_pool));
}
return SVN_NO_ERROR;
@@ -2233,26 +2037,16 @@ close_edit(void *edit_baton,
const char *merge_target =
ctx->activity_url ? ctx->activity_url : ctx->txn_url;
const svn_commit_info_t *commit_info;
- int response_code;
svn_error_t *err = NULL;
/* MERGE our activity */
- SVN_ERR(svn_ra_serf__run_merge(&commit_info, &response_code,
+ SVN_ERR(svn_ra_serf__run_merge(&commit_info,
ctx->session,
- ctx->session->conns[0],
merge_target,
ctx->lock_tokens,
ctx->keep_locks,
pool, pool));
- if (response_code != 200)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("MERGE request failed: returned %d "
- "(during commit)"),
- response_code);
- }
-
ctx->txn_url = NULL; /* If HTTPv2, the txn is now done */
/* Inform the WC that we did a commit. */
@@ -2264,12 +2058,10 @@ close_edit(void *edit_baton,
{
svn_ra_serf__handler_t *handler;
- handler = apr_pcalloc(pool, sizeof(*handler));
- handler->handler_pool = pool;
+ handler = svn_ra_serf__create_handler(ctx->session, pool);
+
handler->method = "DELETE";
handler->path = ctx->activity_url;
- handler->conn = ctx->conn;
- handler->session = ctx->session;
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
@@ -2280,7 +2072,8 @@ close_edit(void *edit_baton,
err,
svn_ra_serf__context_run_one(handler, pool)));
- SVN_ERR_ASSERT(handler->sline.code == 204);
+ if (handler->sline.code != 204)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
SVN_ERR(err);
@@ -2305,14 +2098,13 @@ abort_edit(void *edit_baton,
serf_connection_reset(ctx->session->conns[0]->conn);
/* DELETE our aborted activity */
- handler = apr_pcalloc(pool, sizeof(*handler));
- handler->handler_pool = pool;
+ handler = svn_ra_serf__create_handler(ctx->session, pool);
+
handler->method = "DELETE";
- handler->conn = ctx->session->conns[0];
- handler->session = ctx->session;
handler->response_handler = svn_ra_serf__expect_empty_body;
handler->response_baton = handler;
+ handler->no_fail_on_http_failure_status = TRUE;
if (USING_HTTPV2_COMMIT_SUPPORT(ctx)) /* HTTP v2 */
handler->path = ctx->txn_url;
@@ -2326,14 +2118,15 @@ abort_edit(void *edit_baton,
404 if the activity wasn't found. */
if (handler->sline.code != 204
&& handler->sline.code != 403
- && handler->sline.code != 404
- )
+ && handler->sline.code != 404)
{
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("DELETE returned unexpected status: %d"),
- handler->sline.code);
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
+ /* Don't delete again if somebody aborts twice */
+ ctx->activity_url = NULL;
+ ctx->txn_url = NULL;
+
return SVN_NO_ERROR;
}
@@ -2360,7 +2153,6 @@ svn_ra_serf__get_commit_editor(svn_ra_session_t *ra_session,
ctx->pool = pool;
ctx->session = session;
- ctx->conn = session->conns[0];
ctx->revprop_table = svn_prop_hash_dup(revprop_table, pool);
@@ -2427,28 +2219,43 @@ svn_ra_serf__change_rev_prop(svn_ra_session_t *ra_session,
{
svn_ra_serf__session_t *session = ra_session->priv;
proppatch_context_t *proppatch_ctx;
- commit_context_t *commit;
const char *proppatch_target;
- const char *ns;
+ const svn_string_t *tmp_old_value;
+ svn_boolean_t atomic_capable = FALSE;
+ svn_prop_t *prop;
svn_error_t *err;
+ if (old_value_p || !value)
+ SVN_ERR(svn_ra_serf__has_capability(ra_session, &atomic_capable,
+ SVN_RA_CAPABILITY_ATOMIC_REVPROPS,
+ pool));
+
if (old_value_p)
{
- svn_boolean_t capable;
- SVN_ERR(svn_ra_serf__has_capability(ra_session, &capable,
- SVN_RA_CAPABILITY_ATOMIC_REVPROPS,
- pool));
-
/* How did you get past the same check in svn_ra_change_rev_prop2()? */
- SVN_ERR_ASSERT(capable);
+ SVN_ERR_ASSERT(atomic_capable);
}
+ else if (! value && atomic_capable)
+ {
+ svn_string_t *old_value;
+ /* mod_dav_svn doesn't report a failure when a property delete fails. The
+ atomic revprop change behavior is a nice workaround, to allow getting
+ access to the error anyway.
- commit = apr_pcalloc(pool, sizeof(*commit));
+ Somehow the mod_dav maintainers think that returning an error from
+ mod_dav's property delete is an RFC violation.
+ See https://issues.apache.org/bugzilla/show_bug.cgi?id=53525 */
- commit->pool = pool;
+ SVN_ERR(svn_ra_serf__rev_prop(ra_session, rev, name, &old_value,
+ pool));
- commit->session = session;
- commit->conn = session->conns[0];
+ if (!old_value)
+ return SVN_NO_ERROR; /* Nothing to delete */
+
+ /* The api expects a double const pointer. Let's make one */
+ tmp_old_value = old_value;
+ old_value_p = &tmp_old_value;
+ }
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
{
@@ -2458,74 +2265,52 @@ svn_ra_serf__change_rev_prop(svn_ra_session_t *ra_session,
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, commit->session,
- commit->conn, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
SVN_ERR(svn_ra_serf__fetch_dav_prop(&proppatch_target,
- commit->conn, vcc_url, rev,
- "href",
+ session, vcc_url, rev, "href",
pool, pool));
}
- if (strncmp(name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX) - 1) == 0)
- {
- ns = SVN_DAV_PROP_NS_SVN;
- name += sizeof(SVN_PROP_PREFIX) - 1;
- }
- else
- {
- ns = SVN_DAV_PROP_NS_CUSTOM;
- }
-
/* PROPPATCH our log message and pass it along. */
proppatch_ctx = apr_pcalloc(pool, sizeof(*proppatch_ctx));
proppatch_ctx->pool = pool;
- proppatch_ctx->commit = commit;
+ proppatch_ctx->commit_ctx = NULL; /* No lock headers */
proppatch_ctx->path = proppatch_target;
- proppatch_ctx->changed_props = apr_hash_make(proppatch_ctx->pool);
- proppatch_ctx->removed_props = apr_hash_make(proppatch_ctx->pool);
- if (old_value_p)
- {
- proppatch_ctx->previous_changed_props = apr_hash_make(proppatch_ctx->pool);
- proppatch_ctx->previous_removed_props = apr_hash_make(proppatch_ctx->pool);
- }
+ proppatch_ctx->prop_changes = apr_hash_make(pool);
proppatch_ctx->base_revision = SVN_INVALID_REVNUM;
- if (old_value_p && *old_value_p)
- {
- svn_ra_serf__set_prop(proppatch_ctx->previous_changed_props,
- proppatch_ctx->path,
- ns, name, *old_value_p, proppatch_ctx->pool);
- }
- else if (old_value_p)
+ if (old_value_p)
{
- svn_string_t *dummy_value = svn_string_create_empty(proppatch_ctx->pool);
+ prop = apr_palloc(pool, sizeof (*prop));
- svn_ra_serf__set_prop(proppatch_ctx->previous_removed_props,
- proppatch_ctx->path,
- ns, name, dummy_value, proppatch_ctx->pool);
- }
+ prop->name = name;
+ prop->value = *old_value_p;
- if (value)
- {
- svn_ra_serf__set_prop(proppatch_ctx->changed_props, proppatch_ctx->path,
- ns, name, value, proppatch_ctx->pool);
+ proppatch_ctx->old_props = apr_hash_make(pool);
+ svn_hash_sets(proppatch_ctx->old_props, prop->name, prop);
}
- else
+
+ prop = apr_palloc(pool, sizeof (*prop));
+
+ prop->name = name;
+ prop->value = value;
+ svn_hash_sets(proppatch_ctx->prop_changes, prop->name, prop);
+
+ err = proppatch_resource(session, proppatch_ctx, pool);
+
+ /* Use specific error code for old property value mismatch.
+ Use loop to provide the right result with tracing */
+ if (err && err->apr_err == SVN_ERR_RA_DAV_PRECONDITION_FAILED)
{
- value = svn_string_create_empty(proppatch_ctx->pool);
+ svn_error_t *e = err;
- svn_ra_serf__set_prop(proppatch_ctx->removed_props, proppatch_ctx->path,
- ns, name, value, proppatch_ctx->pool);
+ while (e && e->apr_err == SVN_ERR_RA_DAV_PRECONDITION_FAILED)
+ {
+ e->apr_err = SVN_ERR_FS_PROP_BASEVALUE_MISMATCH;
+ e = e->child;
+ }
}
- err = proppatch_resource(proppatch_ctx, commit, proppatch_ctx->pool);
- if (err)
- return
- svn_error_create
- (SVN_ERR_RA_DAV_REQUEST_FAILED, err,
- _("DAV request failed; it's possible that the repository's "
- "pre-revprop-change hook either failed or is non-existent"));
-
- return SVN_NO_ERROR;
+ return svn_error_trace(err);
}
diff --git a/subversion/libsvn_ra_serf/eagain_bucket.c b/subversion/libsvn_ra_serf/eagain_bucket.c
new file mode 100644
index 0000000..16387be
--- /dev/null
+++ b/subversion/libsvn_ra_serf/eagain_bucket.c
@@ -0,0 +1,122 @@
+/*
+ * eagain_bucket.c : a serf bucket that handles slowing down data
+ * for specific readers that would have unwanted
+ * behavior if they read everything too fast
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <serf.h>
+#include <serf_bucket_util.h>
+
+#include "svn_private_config.h"
+
+#include "ra_serf.h"
+
+typedef struct eagain_baton_t
+{
+ const char *data;
+ apr_size_t remaining;
+} eagain_baton_t;
+
+static apr_status_t
+eagain_bucket_read(serf_bucket_t *bucket,
+ apr_size_t requested,
+ const char **data,
+ apr_size_t *len)
+{
+ eagain_baton_t *eab = bucket->data;
+
+ if (eab->remaining > 0)
+ {
+ *data = eab->data;
+ if (requested > eab->remaining || requested == SERF_READ_ALL_AVAIL)
+ {
+ *len = eab->remaining;
+ eab->data = NULL;
+ eab->remaining = 0;
+ }
+ else
+ {
+ *len = requested;
+ eab->data += requested;
+ eab->remaining -= requested;
+ }
+
+ if (eab->remaining)
+ return APR_SUCCESS;
+ }
+
+ return APR_EAGAIN;
+}
+
+
+static apr_status_t
+eagain_bucket_readline(serf_bucket_t *bucket,
+ int acceptable,
+ int *found,
+ const char **data,
+ apr_size_t *len)
+{
+ /* ### for now, we know callers won't use this function. */
+ svn_error_clear(svn_error__malfunction(TRUE, __FILE__, __LINE__,
+ "Not implemented."));
+ return APR_ENOTIMPL;
+}
+
+
+static apr_status_t
+eagain_bucket_peek(serf_bucket_t *bucket,
+ const char **data,
+ apr_size_t *len)
+{
+ const eagain_baton_t *eab = bucket->data;
+
+ *data = eab->data ? eab->data : "";
+ *len = eab->remaining;
+
+ return APR_SUCCESS;
+}
+
+
+static const serf_bucket_type_t delay_bucket_vtable = {
+ "BUF-EAGAIN",
+ eagain_bucket_read,
+ eagain_bucket_readline,
+ serf_default_read_iovec,
+ serf_default_read_for_sendfile,
+ serf_default_read_bucket,
+ eagain_bucket_peek,
+ serf_default_destroy_and_data,
+};
+
+
+serf_bucket_t *
+svn_ra_serf__create_bucket_with_eagain(const char *data,
+ apr_size_t len,
+ serf_bucket_alloc_t *allocator)
+{
+ eagain_baton_t *eab;
+
+ eab = serf_bucket_mem_alloc(allocator, sizeof(*eab));
+ eab->data = data;
+ eab->remaining = len;
+
+ return serf_bucket_create(&delay_bucket_vtable, allocator, eab);
+}
diff --git a/subversion/libsvn_ra_serf/get_deleted_rev.c b/subversion/libsvn_ra_serf/get_deleted_rev.c
index 40f6b1d..624854d 100644
--- a/subversion/libsvn_ra_serf/get_deleted_rev.c
+++ b/subversion/libsvn_ra_serf/get_deleted_rev.c
@@ -36,7 +36,7 @@
* This enum represents the current state of our XML parsing for a REPORT.
*/
enum drev_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
REPORT,
VERSION_NAME
};
@@ -75,11 +75,13 @@ getdrev_closed(svn_ra_serf__xml_estate_t *xes,
apr_pool_t *scratch_pool)
{
drev_context_t *drev_ctx = baton;
+ apr_int64_t rev;
SVN_ERR_ASSERT(leaving_state == VERSION_NAME);
SVN_ERR_ASSERT(cdata != NULL);
- *drev_ctx->revision_deleted = SVN_STR_TO_REV(cdata->data);
+ SVN_ERR(svn_cstring_atoi64(&rev, cdata->data));
+ *drev_ctx->revision_deleted = (svn_revnum_t)rev;
return SVN_NO_ERROR;
}
@@ -90,7 +92,8 @@ static svn_error_t *
create_getdrev_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
drev_context_t *drev_ctx = baton;
@@ -101,7 +104,7 @@ create_getdrev_body(serf_bucket_t **body_bkt,
"S:get-deleted-rev-report",
"xmlns:S", SVN_XML_NAMESPACE,
"xmlns:D", "DAV:",
- NULL, NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"S:path", drev_ctx->path,
@@ -146,23 +149,20 @@ svn_ra_serf__get_deleted_rev(svn_ra_session_t *session,
drev_ctx->revision_deleted = revision_deleted;
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- ras, NULL /* conn */,
- NULL /* url */, peg_revision,
+ ras, NULL /* url */, peg_revision,
pool, pool));
xmlctx = svn_ra_serf__xml_context_create(getdrev_ttable,
NULL, getdrev_closed, NULL,
drev_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(ras, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_type = "text/xml";
handler->body_delegate = create_getdrev_body;
handler->body_delegate_baton = drev_ctx;
- handler->conn = ras->conns[0];
- handler->session = ras;
err = svn_ra_serf__context_run_one(handler, pool);
diff --git a/subversion/libsvn_ra_serf/get_file.c b/subversion/libsvn_ra_serf/get_file.c
new file mode 100644
index 0000000..cb63b7d
--- /dev/null
+++ b/subversion/libsvn_ra_serf/get_file.c
@@ -0,0 +1,425 @@
+/*
+ * get_file.c : entry point for update RA functions for ra_serf
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#define APR_WANT_STRFUNC
+#include <apr_version.h>
+#include <apr_want.h>
+
+#include <apr_uri.h>
+
+#include <serf.h>
+
+#include "svn_private_config.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_ra.h"
+#include "svn_delta.h"
+#include "svn_path.h"
+#include "svn_props.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_string_private.h"
+
+#include "ra_serf.h"
+#include "../libsvn_ra/ra_loader.h"
+
+
+
+
+/*
+ * This structure represents a single request to GET (fetch) a file with
+ * its associated Serf session/connection.
+ */
+typedef struct stream_ctx_t {
+
+ /* The handler representing this particular fetch. */
+ svn_ra_serf__handler_t *handler;
+
+ /* Have we read our response headers yet? */
+ svn_boolean_t read_headers;
+
+ svn_boolean_t using_compression;
+
+ /* This flag is set when our response is aborted before we reach the
+ * end and we decide to requeue this request.
+ */
+ svn_boolean_t aborted_read;
+ apr_off_t aborted_read_size;
+
+ /* This is the amount of data that we have read so far. */
+ apr_off_t read_size;
+
+ /* If we're writing this file to a stream, this will be non-NULL. */
+ svn_stream_t *result_stream;
+
+} stream_ctx_t;
+
+
+
+/** Routines called when we are fetching a file */
+
+static svn_error_t *
+headers_fetch(serf_bucket_t *headers,
+ void *baton,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ stream_ctx_t *fetch_ctx = baton;
+
+ if (fetch_ctx->using_compression)
+ {
+ serf_bucket_headers_setn(headers, "Accept-Encoding", "gzip");
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+cancel_fetch(serf_request_t *request,
+ serf_bucket_t *response,
+ int status_code,
+ void *baton)
+{
+ stream_ctx_t *fetch_ctx = baton;
+
+ /* Uh-oh. Our connection died on us.
+ *
+ * The core ra_serf layer will requeue our request - we just need to note
+ * that we got cut off in the middle of our song.
+ */
+ if (!response)
+ {
+ /* If we already started the fetch and opened the file handle, we need
+ * to hold subsequent read() ops until we get back to where we were
+ * before the close and we can then resume the textdelta() calls.
+ */
+ if (fetch_ctx->read_headers)
+ {
+ if (!fetch_ctx->aborted_read && fetch_ctx->read_size)
+ {
+ fetch_ctx->aborted_read = TRUE;
+ fetch_ctx->aborted_read_size = fetch_ctx->read_size;
+ }
+ fetch_ctx->read_size = 0;
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+ /* We have no idea what went wrong. */
+ SVN_ERR_MALFUNCTION();
+}
+
+
+/* Helper svn_ra_serf__get_file(). Attempts to fetch file contents
+ * using SESSION->wc_callbacks->get_wc_contents() if sha1 property is
+ * present in PROPS.
+ *
+ * Sets *FOUND_P to TRUE if file contents was successfuly fetched.
+ *
+ * Performs all temporary allocations in POOL.
+ */
+static svn_error_t *
+try_get_wc_contents(svn_boolean_t *found_p,
+ svn_ra_serf__session_t *session,
+ const char *sha1_checksum_prop,
+ svn_stream_t *dst_stream,
+ apr_pool_t *pool)
+{
+ svn_checksum_t *checksum;
+ svn_stream_t *wc_stream;
+ svn_error_t *err;
+
+ /* No contents found by default. */
+ *found_p = FALSE;
+
+ if (!session->wc_callbacks->get_wc_contents
+ || sha1_checksum_prop == NULL)
+ {
+ /* Nothing to do. */
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
+ sha1_checksum_prop, pool));
+
+ err = session->wc_callbacks->get_wc_contents(
+ session->wc_callback_baton, &wc_stream, checksum, pool);
+
+ if (err)
+ {
+ svn_error_clear(err);
+
+ /* Ignore errors for now. */
+ return SVN_NO_ERROR;
+ }
+
+ if (wc_stream)
+ {
+ SVN_ERR(svn_stream_copy3(wc_stream,
+ svn_stream_disown(dst_stream, pool),
+ NULL, NULL, pool));
+ *found_p = TRUE;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* -----------------------------------------------------------------------
+ svn_ra_get_file() specific */
+
+/* Implements svn_ra_serf__response_handler_t */
+static svn_error_t *
+handle_stream(serf_request_t *request,
+ serf_bucket_t *response,
+ void *handler_baton,
+ apr_pool_t *pool)
+{
+ stream_ctx_t *fetch_ctx = handler_baton;
+ apr_status_t status;
+
+ if (fetch_ctx->handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(fetch_ctx->handler));
+
+ while (1)
+ {
+ const char *data;
+ apr_size_t len;
+
+ status = serf_bucket_read(response, 8000, &data, &len);
+ if (SERF_BUCKET_READ_ERROR(status))
+ {
+ return svn_ra_serf__wrap_err(status, NULL);
+ }
+
+ fetch_ctx->read_size += len;
+
+ if (fetch_ctx->aborted_read)
+ {
+ apr_off_t skip;
+
+ /* We haven't caught up to where we were before. */
+ if (fetch_ctx->read_size < fetch_ctx->aborted_read_size)
+ {
+ /* Eek. What did the file shrink or something? */
+ if (APR_STATUS_IS_EOF(status))
+ {
+ SVN_ERR_MALFUNCTION();
+ }
+
+ /* Skip on to the next iteration of this loop. */
+ if (APR_STATUS_IS_EAGAIN(status))
+ {
+ return svn_ra_serf__wrap_err(status, NULL);
+ }
+ continue;
+ }
+
+ /* Woo-hoo. We're back. */
+ fetch_ctx->aborted_read = FALSE;
+
+ /* Increment data and len by the difference. */
+ skip = len - (fetch_ctx->read_size - fetch_ctx->aborted_read_size);
+ data += skip;
+ len -= (apr_size_t)skip;
+ }
+
+ if (len)
+ {
+ apr_size_t written_len;
+
+ written_len = len;
+
+ SVN_ERR(svn_stream_write(fetch_ctx->result_stream, data,
+ &written_len));
+ }
+
+ if (status)
+ {
+ return svn_ra_serf__wrap_err(status, NULL);
+ }
+ }
+ /* not reached */
+}
+
+/* Baton for get_file_prop_cb */
+struct file_prop_baton_t
+{
+ apr_pool_t *result_pool;
+ svn_node_kind_t kind;
+ apr_hash_t *props;
+ const char *sha1_checksum;
+};
+
+/* Implements svn_ra_serf__prop_func_t for svn_ra_serf__get_file */
+static svn_error_t *
+get_file_prop_cb(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ struct file_prop_baton_t *fb = baton;
+ const char *svn_name;
+
+ if (strcmp(ns, "DAV:") == 0 && strcmp(name, "resourcetype") == 0)
+ {
+ const char *val = value->data;
+
+ if (strcmp(val, "collection") == 0)
+ fb->kind = svn_node_dir;
+ else
+ fb->kind = svn_node_file;
+
+ return SVN_NO_ERROR;
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_DAV) == 0
+ && strcmp(name, "sha1-checksum") == 0)
+ {
+ fb->sha1_checksum = apr_pstrdup(fb->result_pool, value->data);
+ }
+
+ if (!fb->props)
+ return SVN_NO_ERROR;
+
+ svn_name = svn_ra_serf__svnname_from_wirename(ns, name, fb->result_pool);
+ if (svn_name)
+ {
+ svn_hash_sets(fb->props, svn_name,
+ svn_string_dup(value, fb->result_pool));
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__get_file(svn_ra_session_t *ra_session,
+ const char *path,
+ svn_revnum_t revision,
+ svn_stream_t *stream,
+ svn_revnum_t *fetched_rev,
+ apr_hash_t **props,
+ apr_pool_t *pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ const char *fetch_url;
+ const svn_ra_serf__dav_props_t *which_props;
+ svn_ra_serf__handler_t *propfind_handler;
+ struct file_prop_baton_t fb;
+
+ /* Fetch properties. */
+
+ fetch_url = svn_path_url_add_component2(session->session_url.path, path, pool);
+
+ /* The simple case is if we want HEAD - then a GET on the fetch_url is fine.
+ *
+ * Otherwise, we need to get the baseline version for this particular
+ * revision and then fetch that file.
+ */
+ if (SVN_IS_VALID_REVNUM(revision) || fetched_rev)
+ {
+ SVN_ERR(svn_ra_serf__get_stable_url(&fetch_url, fetched_rev,
+ session,
+ fetch_url, revision,
+ pool, pool));
+ revision = SVN_INVALID_REVNUM;
+ }
+ /* REVISION is always SVN_INVALID_REVNUM */
+ SVN_ERR_ASSERT(!SVN_IS_VALID_REVNUM(revision));
+
+ if (props)
+ which_props = all_props;
+ else if (stream && session->wc_callbacks->get_wc_contents)
+ which_props = type_and_checksum_props;
+ else
+ which_props = check_path_props;
+
+ fb.result_pool = pool;
+ fb.props = props ? apr_hash_make(pool) : NULL;
+ fb.kind = svn_node_unknown;
+ fb.sha1_checksum = NULL;
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&propfind_handler, session,
+ fetch_url, SVN_INVALID_REVNUM,
+ "0", which_props,
+ get_file_prop_cb, &fb,
+ pool));
+
+ SVN_ERR(svn_ra_serf__context_run_one(propfind_handler, pool));
+
+ /* Verify that resource type is not collection. */
+ if (fb.kind != svn_node_file)
+ {
+ return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't get text contents of a directory"));
+ }
+
+ if (props)
+ *props = fb.props;
+
+ if (stream)
+ {
+ svn_boolean_t found;
+ SVN_ERR(try_get_wc_contents(&found, session, fb.sha1_checksum, stream, pool));
+
+ /* No contents found in the WC, let's fetch from server. */
+ if (!found)
+ {
+ stream_ctx_t *stream_ctx;
+ svn_ra_serf__handler_t *handler;
+
+ /* Create the fetch context. */
+ stream_ctx = apr_pcalloc(pool, sizeof(*stream_ctx));
+ stream_ctx->result_stream = stream;
+ stream_ctx->using_compression = session->using_compression;
+
+ handler = svn_ra_serf__create_handler(session, pool);
+
+ handler->method = "GET";
+ handler->path = fetch_url;
+
+ handler->custom_accept_encoding = TRUE;
+ handler->no_dav_headers = TRUE;
+
+ handler->header_delegate = headers_fetch;
+ handler->header_delegate_baton = stream_ctx;
+
+ handler->response_handler = handle_stream;
+ handler->response_baton = stream_ctx;
+
+ handler->response_error = cancel_fetch;
+ handler->response_error_baton = stream_ctx;
+
+ stream_ctx->handler = handler;
+
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
+
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/get_lock.c b/subversion/libsvn_ra_serf/get_lock.c
new file mode 100644
index 0000000..24d7100
--- /dev/null
+++ b/subversion/libsvn_ra_serf/get_lock.c
@@ -0,0 +1,337 @@
+/*
+ * get_lock.c : obtain single lock information functions for ra_serf
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include <apr_uri.h>
+#include <serf.h>
+
+#include "svn_dav.h"
+#include "svn_pools.h"
+#include "svn_ra.h"
+
+#include "../libsvn_ra/ra_loader.h"
+#include "svn_config.h"
+#include "svn_path.h"
+#include "svn_time.h"
+#include "svn_private_config.h"
+
+#include "ra_serf.h"
+
+
+/*
+ * This enum represents the current state of our XML parsing for a REPORT.
+ */
+enum {
+ INITIAL = 0,
+ MULTISTATUS,
+ RESPONSE,
+ PROPSTAT,
+ PROP,
+ LOCK_DISCOVERY,
+ ACTIVE_LOCK,
+ LOCK_TYPE,
+ LOCK_SCOPE,
+ DEPTH,
+ TIMEOUT,
+ LOCK_TOKEN,
+ OWNER,
+ HREF
+};
+
+typedef struct lock_info_t {
+ apr_pool_t *pool;
+
+ const char *path;
+
+ svn_lock_t *lock;
+
+ svn_boolean_t read_headers;
+
+ svn_ra_serf__handler_t *handler;
+
+ /* The expat handler. We wrap this to do a bit more work. */
+ svn_ra_serf__response_handler_t inner_handler;
+ void *inner_baton;
+
+} lock_info_t;
+
+#define D_ "DAV:"
+#define S_ SVN_XML_NAMESPACE
+static const svn_ra_serf__xml_transition_t locks_ttable[] = {
+ /* The INITIAL state can transition into D:prop (LOCK) or
+ to D:multistatus (PROPFIND) */
+ { INITIAL, D_, "multistatus", MULTISTATUS,
+ FALSE, { NULL }, FALSE },
+
+ { MULTISTATUS, D_, "response", RESPONSE,
+ FALSE, { NULL }, FALSE },
+
+ { RESPONSE, D_, "propstat", PROPSTAT,
+ FALSE, { NULL }, FALSE },
+
+ { PROPSTAT, D_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+
+ { PROP, D_, "lockdiscovery", LOCK_DISCOVERY,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_DISCOVERY, D_, "activelock", ACTIVE_LOCK,
+ FALSE, { NULL }, FALSE },
+
+#if 0
+ /* ### we don't really need to parse locktype/lockscope. we know what
+ ### the values are going to be. we *could* validate that the only
+ ### possible children are D:write and D:exclusive. we'd need to
+ ### modify the state transition to tell us about all children
+ ### (ie. maybe support "*" for the name) and then validate. but it
+ ### just isn't important to validate, so disable this for now... */
+
+ { ACTIVE_LOCK, D_, "locktype", LOCK_TYPE,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_TYPE, D_, "write", WRITE,
+ FALSE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "lockscope", LOCK_SCOPE,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_SCOPE, D_, "exclusive", EXCLUSIVE,
+ FALSE, { NULL }, TRUE },
+#endif /* 0 */
+
+ { ACTIVE_LOCK, D_, "timeout", TIMEOUT,
+ TRUE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "locktoken", LOCK_TOKEN,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_TOKEN, D_, "href", HREF,
+ TRUE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "owner", OWNER,
+ TRUE, { NULL }, TRUE },
+
+ /* ACTIVE_LOCK has a D:depth child, but we can ignore that. */
+
+ { 0 }
+};
+
+static const int locks_expected_status[] = {
+ 207,
+ 0
+};
+
+/* Conforms to svn_ra_serf__xml_closed_t */
+static svn_error_t *
+locks_closed(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int leaving_state,
+ const svn_string_t *cdata,
+ apr_hash_t *attrs,
+ apr_pool_t *scratch_pool)
+{
+ lock_info_t *lock_ctx = baton;
+
+ if (leaving_state == TIMEOUT)
+ {
+ if (strcasecmp(cdata->data, "Infinite") == 0)
+ lock_ctx->lock->expiration_date = 0;
+ else if (strncasecmp(cdata->data, "Second-", 7) == 0)
+ {
+ unsigned n;
+ SVN_ERR(svn_cstring_atoui(&n, cdata->data+7));
+
+ lock_ctx->lock->expiration_date = apr_time_now() +
+ apr_time_from_sec(n);
+ }
+ else
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Invalid LOCK timeout value '%s'"),
+ cdata->data);
+ }
+ else if (leaving_state == HREF)
+ {
+ if (cdata->len)
+ {
+ char *buf = apr_pstrmemdup(lock_ctx->pool, cdata->data, cdata->len);
+
+ apr_collapse_spaces(buf, buf);
+ lock_ctx->lock->token = buf;
+ }
+ }
+ else if (leaving_state == OWNER)
+ {
+ if (cdata->len)
+ {
+ lock_ctx->lock->comment = apr_pstrmemdup(lock_ctx->pool,
+ cdata->data, cdata->len);
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_ra_serf__response_handler_t */
+static svn_error_t *
+handle_lock(serf_request_t *request,
+ serf_bucket_t *response,
+ void *handler_baton,
+ apr_pool_t *pool)
+{
+ lock_info_t *ctx = handler_baton;
+
+ if (!ctx->read_headers)
+ {
+ serf_bucket_t *headers;
+ const char *val;
+
+ headers = serf_bucket_response_get_headers(response);
+
+ val = serf_bucket_headers_get(headers, SVN_DAV_LOCK_OWNER_HEADER);
+ if (val)
+ {
+ ctx->lock->owner = apr_pstrdup(ctx->pool, val);
+ }
+
+ val = serf_bucket_headers_get(headers, SVN_DAV_CREATIONDATE_HEADER);
+ if (val)
+ {
+ SVN_ERR(svn_time_from_cstring(&ctx->lock->creation_date, val,
+ ctx->pool));
+ }
+
+ ctx->read_headers = TRUE;
+ }
+
+ return ctx->inner_handler(request, response, ctx->inner_baton, pool);
+}
+
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_getlock_body(serf_bucket_t **body_bkt,
+ void *baton,
+ serf_bucket_alloc_t *alloc,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ serf_bucket_t *buckets;
+
+ buckets = serf_bucket_aggregate_create(alloc);
+
+ svn_ra_serf__add_xml_header_buckets(buckets, alloc);
+ svn_ra_serf__add_open_tag_buckets(buckets, alloc, "propfind",
+ "xmlns", "DAV:",
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(buckets, alloc, "prop", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "lockdiscovery", SVN_VA_NULL);
+ svn_ra_serf__add_close_tag_buckets(buckets, alloc, "prop");
+ svn_ra_serf__add_close_tag_buckets(buckets, alloc, "propfind");
+
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+setup_getlock_headers(serf_bucket_t *headers,
+ void *baton,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ serf_bucket_headers_setn(headers, "Depth", "0");
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__get_lock(svn_ra_session_t *ra_session,
+ svn_lock_t **lock,
+ const char *path,
+ apr_pool_t *result_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ svn_ra_serf__handler_t *handler;
+ svn_ra_serf__xml_context_t *xmlctx;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
+ lock_info_t *lock_ctx;
+ const char *req_url;
+ svn_error_t *err;
+
+ req_url = svn_path_url_add_component2(session->session_url.path, path,
+ scratch_pool);
+
+ lock_ctx = apr_pcalloc(scratch_pool, sizeof(*lock_ctx));
+ lock_ctx->pool = result_pool;
+ lock_ctx->path = req_url;
+ lock_ctx->lock = svn_lock_create(result_pool);
+ lock_ctx->lock->path = apr_pstrdup(result_pool, path);
+
+ xmlctx = svn_ra_serf__xml_context_create(locks_ttable,
+ NULL, locks_closed, NULL,
+ lock_ctx,
+ scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx,
+ locks_expected_status,
+ scratch_pool);
+
+ handler->method = "PROPFIND";
+ handler->path = req_url;
+ handler->body_type = "text/xml";
+
+ handler->body_delegate = create_getlock_body;
+ handler->body_delegate_baton = lock_ctx;
+
+ handler->header_delegate = setup_getlock_headers;
+ handler->header_delegate_baton = lock_ctx;
+
+ handler->no_dav_headers = TRUE;
+
+ lock_ctx->inner_handler = handler->response_handler;
+ lock_ctx->inner_baton = handler->response_baton;
+ handler->response_handler = handle_lock;
+ handler->response_baton = lock_ctx;
+
+ lock_ctx->handler = handler;
+
+ err = svn_ra_serf__context_run_one(handler, scratch_pool);
+
+ if ((err && (handler->sline.code == 500 || handler->sline.code == 501))
+ || svn_error_find_cause(err, SVN_ERR_UNSUPPORTED_FEATURE))
+ return svn_error_trace(
+ svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err,
+ _("Server does not support locking features")));
+ else if (svn_error_find_cause(err, SVN_ERR_FS_NOT_FOUND))
+ svn_error_clear(err); /* Behave like the other RA layers */
+ else if (handler->sline.code != 207)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
+ if (lock_ctx->lock && lock_ctx->lock->token)
+ *lock = lock_ctx->lock;
+ else
+ *lock = NULL;
+
+ svn_pool_destroy(scratch_pool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/getdate.c b/subversion/libsvn_ra_serf/getdate.c
index cc1014e..30d57f3 100644
--- a/subversion/libsvn_ra_serf/getdate.c
+++ b/subversion/libsvn_ra_serf/getdate.c
@@ -44,7 +44,7 @@
* This enum represents the current state of our XML parsing for a REPORT.
*/
enum date_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
REPORT,
VERSION_NAME
};
@@ -82,11 +82,14 @@ date_closed(svn_ra_serf__xml_estate_t *xes,
apr_pool_t *scratch_pool)
{
date_context_t *date_ctx = baton;
+ apr_int64_t rev;
SVN_ERR_ASSERT(leaving_state == VERSION_NAME);
SVN_ERR_ASSERT(cdata != NULL);
- *date_ctx->revision = SVN_STR_TO_REV(cdata->data);
+ SVN_ERR(svn_cstring_atoi64(&rev, cdata->data));
+
+ *date_ctx->revision = (svn_revnum_t)rev;
return SVN_NO_ERROR;
}
@@ -97,7 +100,8 @@ static svn_error_t *
create_getdate_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
date_context_t *date_ctx = baton;
@@ -107,7 +111,7 @@ create_getdate_body(serf_bucket_t **body_bkt,
svn_ra_serf__add_open_tag_buckets(buckets, alloc, "S:dated-rev-report",
"xmlns:S", SVN_XML_NAMESPACE,
"xmlns:D", "DAV:",
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"D:" SVN_DAV__CREATIONDATE,
@@ -131,40 +135,37 @@ svn_ra_serf__get_dated_revision(svn_ra_session_t *ra_session,
svn_ra_serf__handler_t *handler;
svn_ra_serf__xml_context_t *xmlctx;
const char *report_target;
- svn_error_t *err;
date_ctx = apr_palloc(pool, sizeof(*date_ctx));
date_ctx->time = tm;
date_ctx->revision = revision;
- SVN_ERR(svn_ra_serf__report_resource(&report_target, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, session, pool));
xmlctx = svn_ra_serf__xml_context_create(date_ttable,
NULL, date_closed, NULL,
date_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = report_target;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
handler->body_delegate = create_getdate_body;
handler->body_delegate_baton = date_ctx;
*date_ctx->revision = SVN_INVALID_REVNUM;
- err = svn_ra_serf__context_run_one(handler, pool);
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- SVN_ERR(svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- report_target,
- handler->location),
- err));
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(*revision));
+ if (!SVN_IS_VALID_REVNUM(*revision))
+ return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
+ _("The REPORT response did not include "
+ "the requested properties"));
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_serf/getlocations.c b/subversion/libsvn_ra_serf/getlocations.c
index 1ae4f82..063272e 100644
--- a/subversion/libsvn_ra_serf/getlocations.c
+++ b/subversion/libsvn_ra_serf/getlocations.c
@@ -43,7 +43,7 @@
* This enum represents the current state of our XML parsing for a REPORT.
*/
enum loc_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
REPORT,
LOCATION
};
@@ -94,7 +94,12 @@ getloc_closed(svn_ra_serf__xml_estate_t *xes,
path = svn_hash_gets(attrs, "path");
if (revstr != NULL && path != NULL)
{
- svn_revnum_t rev = SVN_STR_TO_REV(revstr);
+ apr_int64_t rev_val;
+ svn_revnum_t rev;
+
+ SVN_ERR(svn_cstring_atoi64(&rev_val, revstr));
+ rev = (svn_revnum_t)rev_val;
+
apr_hash_set(loc_ctx->paths,
apr_pmemdup(loc_ctx->pool, &rev, sizeof(rev)), sizeof(rev),
apr_pstrdup(loc_ctx->pool, path));
@@ -109,7 +114,8 @@ static svn_error_t *
create_get_locations_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
loc_context_t *loc_ctx = baton;
@@ -121,7 +127,7 @@ create_get_locations_body(serf_bucket_t **body_bkt,
"S:get-locations",
"xmlns:S", SVN_XML_NAMESPACE,
"xmlns:D", "DAV:",
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"S:path", loc_ctx->path,
@@ -159,7 +165,6 @@ svn_ra_serf__get_locations(svn_ra_session_t *ra_session,
svn_ra_serf__handler_t *handler;
svn_ra_serf__xml_context_t *xmlctx;
const char *req_url;
- svn_error_t *err;
loc_ctx = apr_pcalloc(pool, sizeof(*loc_ctx));
loc_ctx->pool = pool;
@@ -171,31 +176,26 @@ svn_ra_serf__get_locations(svn_ra_session_t *ra_session,
*locations = loc_ctx->paths;
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- session, NULL /* conn */,
- NULL /* url */, peg_revision,
+ session, NULL /* url */, peg_revision,
pool, pool));
xmlctx = svn_ra_serf__xml_context_create(getloc_ttable,
NULL, getloc_closed, NULL,
loc_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_delegate = create_get_locations_body;
handler->body_delegate_baton = loc_ctx;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
- err = svn_ra_serf__context_run_one(handler, pool);
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- SVN_ERR(svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- req_url,
- handler->location),
- err));
+ SVN_ERR(svn_ra_serf__error_on_status(handler->sline,
+ handler->path,
+ handler->location));
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_serf/getlocationsegments.c b/subversion/libsvn_ra_serf/getlocationsegments.c
index e5c58a9..884ab5d 100644
--- a/subversion/libsvn_ra_serf/getlocationsegments.c
+++ b/subversion/libsvn_ra_serf/getlocationsegments.c
@@ -52,8 +52,8 @@ typedef struct gls_context_t {
} gls_context_t;
-enum {
- INITIAL = 0,
+enum locseg_state_e {
+ INITIAL = XML_STATE_INITIAL,
REPORT,
SEGMENT
};
@@ -84,6 +84,8 @@ gls_closed(svn_ra_serf__xml_estate_t *xes,
const char *path;
const char *start_str;
const char *end_str;
+ apr_int64_t start_val;
+ apr_int64_t end_val;
svn_location_segment_t segment;
SVN_ERR_ASSERT(leaving_state == SEGMENT);
@@ -95,9 +97,12 @@ gls_closed(svn_ra_serf__xml_estate_t *xes,
/* The transition table said these must exist. */
SVN_ERR_ASSERT(start_str && end_str);
+ SVN_ERR(svn_cstring_atoi64(&start_val, start_str));
+ SVN_ERR(svn_cstring_atoi64(&end_val, end_str));
+
segment.path = path; /* may be NULL */
- segment.range_start = SVN_STR_TO_REV(start_str);
- segment.range_end = SVN_STR_TO_REV(end_str);
+ segment.range_start = (svn_revnum_t)start_val;
+ segment.range_end = (svn_revnum_t)end_val;
SVN_ERR(gls_ctx->receiver(&segment, gls_ctx->receiver_baton, scratch_pool));
return SVN_NO_ERROR;
@@ -109,7 +114,8 @@ static svn_error_t *
create_gls_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
gls_context_t *gls_ctx = baton;
@@ -119,7 +125,7 @@ create_gls_body(serf_bucket_t **body_bkt,
svn_ra_serf__add_open_tag_buckets(buckets, alloc,
"S:get-location-segments",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"S:path", gls_ctx->path,
@@ -173,31 +179,29 @@ svn_ra_serf__get_location_segments(svn_ra_session_t *ra_session,
gls_ctx->receiver_baton = receiver_baton;
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- session, NULL /* conn */,
- NULL /* url */, peg_revision,
+ session, NULL /* url */, peg_revision,
pool, pool));
xmlctx = svn_ra_serf__xml_context_create(gls_ttable,
NULL, gls_closed, NULL,
gls_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_delegate = create_gls_body;
handler->body_delegate_baton = gls_ctx;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
err = svn_ra_serf__context_run_one(handler, pool);
- err = svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location),
- err);
+ if (!err)
+ {
+ err = svn_ra_serf__error_on_status(handler->sline,
+ handler->path,
+ handler->location);
+ }
if (err && (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE))
return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, NULL);
diff --git a/subversion/libsvn_ra_serf/getlocks.c b/subversion/libsvn_ra_serf/getlocks.c
index df201a7..518d2aa 100644
--- a/subversion/libsvn_ra_serf/getlocks.c
+++ b/subversion/libsvn_ra_serf/getlocks.c
@@ -47,8 +47,8 @@
/*
* This enum represents the current state of our XML parsing for a REPORT.
*/
-enum {
- INITIAL = 0,
+enum getlocks_state_e {
+ INITIAL = XML_STATE_INITIAL,
REPORT,
LOCK,
PATH,
@@ -213,7 +213,8 @@ static svn_error_t *
create_getlocks_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
lock_context_t *lock_ctx = baton;
serf_bucket_t *buckets;
@@ -222,7 +223,7 @@ create_getlocks_body(serf_bucket_t **body_bkt,
svn_ra_serf__add_open_tag_buckets(
buckets, alloc, "S:get-locks-report", "xmlns:S", SVN_XML_NAMESPACE,
- "depth", svn_depth_to_word(lock_ctx->requested_depth), NULL);
+ "depth", svn_depth_to_word(lock_ctx->requested_depth), SVN_VA_NULL);
svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:get-locks-report");
*body_bkt = buckets;
@@ -244,12 +245,11 @@ svn_ra_serf__get_locks(svn_ra_session_t *ra_session,
svn_error_t *err;
req_url = svn_path_url_add_component2(session->session_url.path, path, pool);
- SVN_ERR(svn_ra_serf__get_relative_path(&rel_path, req_url, session,
- NULL, pool));
+ SVN_ERR(svn_ra_serf__get_relative_path(&rel_path, req_url, session, pool));
lock_ctx = apr_pcalloc(pool, sizeof(*lock_ctx));
lock_ctx->pool = pool;
- lock_ctx->path = apr_pstrcat(pool, "/", rel_path, (char *)NULL);
+ lock_ctx->path = apr_pstrcat(pool, "/", rel_path, SVN_VA_NULL);
lock_ctx->requested_depth = depth;
lock_ctx->hash = apr_hash_make(pool);
@@ -257,33 +257,41 @@ svn_ra_serf__get_locks(svn_ra_session_t *ra_session,
NULL, getlocks_closed, NULL,
lock_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
handler->body_delegate = create_getlocks_body;
handler->body_delegate_baton = lock_ctx;
err = svn_ra_serf__context_run_one(handler, pool);
-
- /* Wrap the server generated error for an unsupported report with the
- documented error for this ra function. */
- if (svn_error_find_cause(err, SVN_ERR_UNSUPPORTED_FEATURE))
- err = svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, NULL);
-
- SVN_ERR(err);
+
+ if (err)
+ {
+ if (svn_error_find_cause(err, SVN_ERR_UNSUPPORTED_FEATURE))
+ {
+ /* The server told us that it doesn't support this report type.
+ We return the documented error for svn_ra_get_locks(), but
+ with the original error report */
+ return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, NULL);
+ }
+ else if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ /* File doesn't exist in HEAD: Not an error */
+ svn_error_clear(err);
+ }
+ else
+ return svn_error_trace(err);
+ }
/* We get a 404 when a path doesn't exist in HEAD, but it might
have existed earlier (E.g. 'svn ls http://s/svn/trunk/file@1' */
- if (handler->sline.code != 404)
+ if (handler->sline.code != 200
+ && handler->sline.code != 404)
{
- SVN_ERR(svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location));
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
*locks = lock_ctx->hash;
diff --git a/subversion/libsvn_ra_serf/inherited_props.c b/subversion/libsvn_ra_serf/inherited_props.c
index f1172e7..6edafb1 100644
--- a/subversion/libsvn_ra_serf/inherited_props.c
+++ b/subversion/libsvn_ra_serf/inherited_props.c
@@ -28,12 +28,14 @@
#include "svn_hash.h"
#include "svn_path.h"
#include "svn_ra.h"
+#include "svn_sorts.h"
#include "svn_string.h"
#include "svn_xml.h"
#include "svn_props.h"
#include "svn_base64.h"
#include "private/svn_dav_protocol.h"
+#include "private/svn_sorts_private.h"
#include "../libsvn_ra/ra_loader.h"
#include "svn_private_config.h"
#include "ra_serf.h"
@@ -41,7 +43,7 @@
/* The current state of our XML parsing. */
typedef enum iprops_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
IPROPS_REPORT,
IPROPS_ITEM,
IPROPS_PATH,
@@ -141,9 +143,7 @@ iprops_closed(svn_ra_serf__xml_estate_t *xes,
return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
iprops_ctx->curr_iprop->path_or_url =
- svn_path_url_add_component2(iprops_ctx->repos_root_url,
- cdata->data,
- iprops_ctx->pool);
+ apr_pstrdup(iprops_ctx->pool, cdata->data);
}
else if (leaving_state == IPROPS_PROPNAME)
{
@@ -197,7 +197,8 @@ static svn_error_t *
create_iprops_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
iprops_context_t *iprops_ctx = baton;
serf_bucket_t *body_bkt;
@@ -207,7 +208,7 @@ create_iprops_body(serf_bucket_t **bkt,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc,
"S:" SVN_DAV__INHERITED_PROPS_REPORT,
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(body_bkt,
"S:" SVN_DAV__REVISION,
apr_ltoa(pool, iprops_ctx->revision),
@@ -220,6 +221,131 @@ create_iprops_body(serf_bucket_t **bkt,
return SVN_NO_ERROR;
}
+/* Per request information for get_iprops_via_more_requests */
+typedef struct iprop_rq_info_t
+{
+ const char *relpath;
+ const char *urlpath;
+ apr_hash_t *props;
+ svn_ra_serf__handler_t *handler;
+} iprop_rq_info_t;
+
+
+/* Assumes session reparented to the repository root. The old session
+ root is passed as session_url */
+static svn_error_t *
+get_iprops_via_more_requests(svn_ra_session_t *ra_session,
+ apr_array_header_t **iprops,
+ const char *session_url,
+ const char *path,
+ svn_revnum_t revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ const char *url;
+ const char *relpath;
+ apr_array_header_t *rq_info;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_interval_time_t waittime_left = session->timeout;
+ const svn_revnum_t rev_marker = SVN_INVALID_REVNUM;
+ int i;
+
+ rq_info = apr_array_make(scratch_pool, 16, sizeof(iprop_rq_info_t *));
+
+ if (!svn_path_is_empty(path))
+ url = svn_path_url_add_component2(session_url, path, scratch_pool);
+ else
+ url = session_url;
+
+ relpath = svn_uri_skip_ancestor(session->repos_root_str, url, scratch_pool);
+
+ /* Create all requests */
+ while (relpath[0] != '\0')
+ {
+ iprop_rq_info_t *rq = apr_pcalloc(scratch_pool, sizeof(*rq));
+
+ relpath = svn_relpath_dirname(relpath, scratch_pool);
+
+ rq->relpath = relpath;
+ rq->props = apr_hash_make(scratch_pool);
+
+ SVN_ERR(svn_ra_serf__get_stable_url(&rq->urlpath, NULL, session,
+ svn_path_url_add_component2(
+ session->repos_root.path,
+ relpath, scratch_pool),
+ revision,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &rq->handler, session,
+ rq->urlpath,
+ rev_marker, "0", all_props,
+ svn_ra_serf__deliver_svn_props,
+ rq->props,
+ scratch_pool));
+
+ /* Allow ignoring authz problems */
+ rq->handler->no_fail_on_http_failure_status = TRUE;
+
+ svn_ra_serf__request_create(rq->handler);
+
+ APR_ARRAY_PUSH(rq_info, iprop_rq_info_t *) = rq;
+ }
+
+ while (TRUE)
+ {
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_ra_serf__context_run(session, &waittime_left, iterpool));
+
+ for (i = 0; i < rq_info->nelts; i++)
+ {
+ iprop_rq_info_t *rq = APR_ARRAY_IDX(rq_info, i, iprop_rq_info_t *);
+
+ if (!rq->handler->done)
+ break;
+ }
+
+ if (i >= rq_info->nelts)
+ break; /* All requests done */
+ }
+
+ *iprops = apr_array_make(result_pool, rq_info->nelts,
+ sizeof(svn_prop_inherited_item_t *));
+
+ /* And now create the result set */
+ for (i = 0; i < rq_info->nelts; i++)
+ {
+ iprop_rq_info_t *rq = APR_ARRAY_IDX(rq_info, i, iprop_rq_info_t *);
+ apr_hash_t *node_props;
+ svn_prop_inherited_item_t *new_iprop;
+
+ if (rq->handler->sline.code != 207 && rq->handler->sline.code != 403)
+ {
+ if (rq->handler->server_error)
+ SVN_ERR(svn_ra_serf__server_error_create(rq->handler,
+ scratch_pool));
+
+ return svn_error_trace(svn_ra_serf__unexpected_status(rq->handler));
+ }
+
+ node_props = rq->props;
+
+ svn_ra_serf__keep_only_regular_props(node_props, scratch_pool);
+
+ if (!apr_hash_count(node_props))
+ continue;
+
+ new_iprop = apr_palloc(result_pool, sizeof(*new_iprop));
+ new_iprop->path_or_url = apr_pstrdup(result_pool, rq->relpath);
+ new_iprop->prop_hash = svn_prop_hash_dup(node_props, result_pool);
+ svn_sort__array_insert(*iprops, &new_iprop, 0);
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* Request a inherited-props-report from the URL attached to RA_SESSION,
and fill the IPROPS array hash with the results. */
svn_error_t *
@@ -230,20 +356,53 @@ svn_ra_serf__get_inherited_props(svn_ra_session_t *ra_session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_error_t *err;
iprops_context_t *iprops_ctx;
svn_ra_serf__session_t *session = ra_session->priv;
svn_ra_serf__handler_t *handler;
svn_ra_serf__xml_context_t *xmlctx;
const char *req_url;
+ svn_boolean_t iprop_capable;
+
+ SVN_ERR(svn_ra_serf__has_capability(ra_session, &iprop_capable,
+ SVN_RA_CAPABILITY_INHERITED_PROPS,
+ scratch_pool));
+
+ if (!iprop_capable)
+ {
+ svn_error_t *err;
+ const char *reparent_uri = NULL;
+ const char *session_uri;
+ const char *repos_root_url;
+
+ SVN_ERR(svn_ra_serf__get_repos_root(ra_session, &repos_root_url,
+ scratch_pool));
+
+ session_uri = apr_pstrdup(scratch_pool, session->session_url_str);
+ if (strcmp(repos_root_url, session->session_url_str) != 0)
+ {
+ reparent_uri = session_uri;
+ SVN_ERR(svn_ra_serf__reparent(ra_session, repos_root_url,
+ scratch_pool));
+ }
+
+ err = get_iprops_via_more_requests(ra_session, iprops, session_uri, path,
+ revision, result_pool, scratch_pool);
+
+ if (reparent_uri)
+ err = svn_error_compose_create(err,
+ svn_ra_serf__reparent(ra_session,
+ reparent_uri ,
+ scratch_pool));
+
+ return svn_error_trace(err);
+ }
SVN_ERR(svn_ra_serf__get_stable_url(&req_url,
NULL /* latest_revnum */,
session,
- NULL /* conn */,
NULL /* url */,
revision,
- result_pool, scratch_pool));
+ scratch_pool, scratch_pool));
SVN_ERR_ASSERT(session->repos_root_str);
@@ -258,26 +417,24 @@ svn_ra_serf__get_inherited_props(svn_ra_session_t *ra_session,
iprops_ctx->revision = revision;
xmlctx = svn_ra_serf__xml_context_create(iprops_table,
- iprops_opened, iprops_closed, NULL,
+ iprops_opened, iprops_closed,
+ NULL,
iprops_ctx,
scratch_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ scratch_pool);
handler->method = "REPORT";
handler->path = req_url;
- handler->conn = session->conns[0];
- handler->session = session;
+
handler->body_delegate = create_iprops_body;
handler->body_delegate_baton = iprops_ctx;
handler->body_type = "text/xml";
- handler->handler_pool = scratch_pool;
-
- err = svn_ra_serf__context_run_one(handler, scratch_pool);
- SVN_ERR(svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location),
- err));
+
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
+
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
*iprops = iprops_ctx->iprops;
diff --git a/subversion/libsvn_ra_serf/libsvn_ra_serf.pc.in b/subversion/libsvn_ra_serf/libsvn_ra_serf.pc.in
new file mode 100644
index 0000000..e02ef12
--- /dev/null
+++ b/subversion/libsvn_ra_serf/libsvn_ra_serf.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_ra_serf
+Description: Subversion HTTP/WebDAV Protocol Repository Access Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr serf-1
+Libs: -L${libdir} -lsvn_ra_serf @SVN_XML_LIBS@ @SVN_ZLIB_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_ra_serf/lock.c b/subversion/libsvn_ra_serf/lock.c
new file mode 100644
index 0000000..dd045e3
--- /dev/null
+++ b/subversion/libsvn_ra_serf/lock.c
@@ -0,0 +1,679 @@
+/*
+ * lock.c : entry point for locking RA functions for ra_serf
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include <apr_uri.h>
+#include <serf.h>
+#include <assert.h>
+
+#include "svn_dav.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_ra.h"
+
+#include "../libsvn_ra/ra_loader.h"
+#include "svn_config.h"
+#include "svn_path.h"
+#include "svn_sorts.h"
+#include "svn_time.h"
+#include "svn_private_config.h"
+#include "private/svn_sorts_private.h"
+
+#include "ra_serf.h"
+
+
+/*
+ * This enum represents the current state of our XML parsing for a REPORT.
+ */
+enum {
+ INITIAL = 0,
+ PROP,
+ LOCK_DISCOVERY,
+ ACTIVE_LOCK,
+ LOCK_TYPE,
+ LOCK_SCOPE,
+ DEPTH,
+ TIMEOUT,
+ LOCK_TOKEN,
+ OWNER,
+ HREF
+};
+
+
+typedef struct lock_ctx_t {
+ apr_pool_t *pool;
+
+ const char *path;
+
+ const char *token; /* For unlock */
+ svn_lock_t *lock; /* For lock */
+
+ svn_boolean_t force;
+ svn_revnum_t revision;
+
+ svn_boolean_t read_headers;
+
+ svn_ra_serf__handler_t *handler;
+
+ /* The expat handler. We wrap this to do a bit more work. */
+ svn_ra_serf__response_handler_t inner_handler;
+ void *inner_baton;
+
+} lock_ctx_t;
+
+
+#define D_ "DAV:"
+#define S_ SVN_XML_NAMESPACE
+static const svn_ra_serf__xml_transition_t locks_ttable[] = {
+ /* The INITIAL state can transition into D:prop (LOCK) or
+ to D:multistatus (PROPFIND) */
+ { INITIAL, D_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+
+ { PROP, D_, "lockdiscovery", LOCK_DISCOVERY,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_DISCOVERY, D_, "activelock", ACTIVE_LOCK,
+ FALSE, { NULL }, FALSE },
+
+#if 0
+ /* ### we don't really need to parse locktype/lockscope. we know what
+ ### the values are going to be. we *could* validate that the only
+ ### possible children are D:write and D:exclusive. we'd need to
+ ### modify the state transition to tell us about all children
+ ### (ie. maybe support "*" for the name) and then validate. but it
+ ### just isn't important to validate, so disable this for now... */
+
+ { ACTIVE_LOCK, D_, "locktype", LOCK_TYPE,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_TYPE, D_, "write", WRITE,
+ FALSE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "lockscope", LOCK_SCOPE,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_SCOPE, D_, "exclusive", EXCLUSIVE,
+ FALSE, { NULL }, TRUE },
+#endif /* 0 */
+
+ { ACTIVE_LOCK, D_, "timeout", TIMEOUT,
+ TRUE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "locktoken", LOCK_TOKEN,
+ FALSE, { NULL }, FALSE },
+
+ { LOCK_TOKEN, D_, "href", HREF,
+ TRUE, { NULL }, TRUE },
+
+ { ACTIVE_LOCK, D_, "owner", OWNER,
+ TRUE, { NULL }, TRUE },
+
+ /* ACTIVE_LOCK has a D:depth child, but we can ignore that. */
+
+ { 0 }
+};
+
+/* Conforms to svn_ra_serf__xml_closed_t */
+static svn_error_t *
+locks_closed(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int leaving_state,
+ const svn_string_t *cdata,
+ apr_hash_t *attrs,
+ apr_pool_t *scratch_pool)
+{
+ lock_ctx_t *lock_ctx = baton;
+
+ if (leaving_state == TIMEOUT)
+ {
+ /* This function just parses the result of our own lock request,
+ so on a normal server we will only encounter 'Infinite' here. */
+ if (strcasecmp(cdata->data, "Infinite") == 0)
+ lock_ctx->lock->expiration_date = 0;
+ else if (strncasecmp(cdata->data, "Second-", 7) == 0)
+ {
+ unsigned n;
+ SVN_ERR(svn_cstring_atoui(&n, cdata->data+7));
+
+ lock_ctx->lock->expiration_date = apr_time_now() +
+ apr_time_from_sec(n);
+ }
+ else
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Invalid LOCK timeout value '%s'"),
+ cdata->data);
+ }
+ else if (leaving_state == HREF)
+ {
+ if (cdata->len)
+ {
+ char *buf = apr_pstrmemdup(lock_ctx->pool, cdata->data, cdata->len);
+
+ apr_collapse_spaces(buf, buf);
+ lock_ctx->lock->token = buf;
+ }
+ }
+ else if (leaving_state == OWNER)
+ {
+ if (cdata->len)
+ {
+ lock_ctx->lock->comment = apr_pstrmemdup(lock_ctx->pool,
+ cdata->data, cdata->len);
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+set_lock_headers(serf_bucket_t *headers,
+ void *baton,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ lock_ctx_t *lock_ctx = baton;
+
+ if (lock_ctx->force)
+ {
+ serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,
+ SVN_DAV_OPTION_LOCK_STEAL);
+ }
+
+ if (SVN_IS_VALID_REVNUM(lock_ctx->revision))
+ {
+ serf_bucket_headers_set(headers, SVN_DAV_VERSION_NAME_HEADER,
+ apr_ltoa(pool, lock_ctx->revision));
+ }
+
+ return APR_SUCCESS;
+}
+
+/* Helper function for svn_ra_serf__lock and svn_ra_serf__unlock */
+static svn_error_t *
+run_locks(svn_ra_serf__session_t *sess,
+ apr_array_header_t *lock_ctxs,
+ svn_boolean_t locking,
+ svn_ra_lock_callback_t lock_func,
+ void *lock_baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool;
+ apr_interval_time_t waittime_left = sess->timeout;
+
+ assert(sess->pending_error == SVN_NO_ERROR);
+
+ iterpool = svn_pool_create(scratch_pool);
+ while (lock_ctxs->nelts)
+ {
+ int i;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_ra_serf__context_run(sess, &waittime_left, iterpool));
+
+ for (i = 0; i < lock_ctxs->nelts; i++)
+ {
+ lock_ctx_t *ctx = APR_ARRAY_IDX(lock_ctxs, i, lock_ctx_t *);
+
+ if (ctx->handler->done)
+ {
+ svn_error_t *server_err = NULL;
+ svn_error_t *cb_err = NULL;
+ svn_error_t *err;
+
+ if (ctx->handler->server_error)
+ server_err = svn_ra_serf__server_error_create(ctx->handler, iterpool);
+
+ /* Api users expect specific error code to detect failures,
+ pass the rest to svn_ra_serf__error_on_status */
+ switch (ctx->handler->sline.code)
+ {
+ case 200:
+ case 204:
+ err = NULL; /* (un)lock succeeded */
+ break;
+
+ case 400:
+ err = svn_error_createf(SVN_ERR_FS_NO_SUCH_LOCK, NULL,
+ _("No lock on path '%s' (%d %s)"),
+ ctx->path,
+ ctx->handler->sline.code,
+ ctx->handler->sline.reason);
+ break;
+ case 403:
+ /* ### Authz can also lead to 403. */
+ err = svn_error_createf(SVN_ERR_FS_LOCK_OWNER_MISMATCH,
+ NULL,
+ _("Unlock of '%s' failed (%d %s)"),
+ ctx->path,
+ ctx->handler->sline.code,
+ ctx->handler->sline.reason);
+ break;
+ case 405:
+ err = svn_error_createf(SVN_ERR_FS_OUT_OF_DATE,
+ NULL,
+ _("Path '%s' doesn't exist in "
+ "HEAD revision (%d %s)"),
+ ctx->path,
+ ctx->handler->sline.code,
+ ctx->handler->sline.reason);
+ break;
+ case 423:
+ err = svn_error_createf(SVN_ERR_FS_PATH_ALREADY_LOCKED,
+ NULL,
+ _("Path '%s' already locked "
+ "(%d %s)"),
+ ctx->path,
+ ctx->handler->sline.code,
+ ctx->handler->sline.reason);
+ break;
+
+ case 404:
+ case 409:
+ case 500:
+ if (server_err)
+ {
+ /* Handle out of date, etc by just passing the server
+ error */
+ err = NULL;
+ break;
+ }
+
+ /* Fall through */
+ default:
+ err = svn_ra_serf__unexpected_status(ctx->handler);
+ break;
+ }
+
+ if (server_err && err && server_err->apr_err == err->apr_err)
+ err = svn_error_compose_create(server_err, err);
+ else
+ err = svn_error_compose_create(err, server_err);
+
+ if (err
+ && !SVN_ERR_IS_UNLOCK_ERROR(err)
+ && !SVN_ERR_IS_LOCK_ERROR(err))
+ {
+ /* If the error that we are going to report is just about the
+ POST unlock hook, we should first report that the operation
+ succeeded, or the repository and working copy will be
+ out of sync... */
+
+ if (lock_func &&
+ err->apr_err == SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED)
+ {
+ err = svn_error_compose_create(
+ err, lock_func(lock_baton, ctx->path, locking,
+ NULL, NULL, ctx->pool));
+ }
+
+ return svn_error_trace(err); /* Don't go through callbacks */
+ }
+
+ if (lock_func)
+ {
+ svn_lock_t *report_lock = NULL;
+
+ if (locking && ctx->lock->token)
+ report_lock = ctx->lock;
+
+ cb_err = lock_func(lock_baton, ctx->path, locking,
+ report_lock, err, ctx->pool);
+ }
+ svn_error_clear(err);
+
+ SVN_ERR(cb_err);
+
+ waittime_left = sess->timeout;
+ svn_sort__array_delete(lock_ctxs, i, 1);
+ i--;
+
+ svn_pool_destroy(ctx->pool);
+ continue;
+ }
+ }
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_ra_serf__response_handler_t */
+static svn_error_t *
+handle_lock(serf_request_t *request,
+ serf_bucket_t *response,
+ void *handler_baton,
+ apr_pool_t *pool)
+{
+ lock_ctx_t *ctx = handler_baton;
+
+ if (!ctx->read_headers)
+ {
+ serf_bucket_t *headers;
+ const char *val;
+
+ headers = serf_bucket_response_get_headers(response);
+
+ val = serf_bucket_headers_get(headers, SVN_DAV_LOCK_OWNER_HEADER);
+ if (val)
+ {
+ ctx->lock->owner = apr_pstrdup(ctx->pool, val);
+ }
+
+ val = serf_bucket_headers_get(headers, SVN_DAV_CREATIONDATE_HEADER);
+ if (val)
+ {
+ SVN_ERR(svn_time_from_cstring(&ctx->lock->creation_date, val,
+ ctx->pool));
+ }
+
+ ctx->read_headers = TRUE;
+ }
+
+ return ctx->inner_handler(request, response, ctx->inner_baton, pool);
+}
+
+/* Implements svn_ra_serf__request_body_delegate_t */
+static svn_error_t *
+create_lock_body(serf_bucket_t **body_bkt,
+ void *baton,
+ serf_bucket_alloc_t *alloc,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ lock_ctx_t *ctx = baton;
+ serf_bucket_t *buckets;
+
+ buckets = serf_bucket_aggregate_create(alloc);
+
+ svn_ra_serf__add_xml_header_buckets(buckets, alloc);
+ svn_ra_serf__add_open_tag_buckets(buckets, alloc, "lockinfo",
+ "xmlns", "DAV:",
+ SVN_VA_NULL);
+
+ svn_ra_serf__add_open_tag_buckets(buckets, alloc, "lockscope", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc, "exclusive", SVN_VA_NULL);
+ svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockscope");
+
+ svn_ra_serf__add_open_tag_buckets(buckets, alloc, "locktype", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc, "write", SVN_VA_NULL);
+ svn_ra_serf__add_close_tag_buckets(buckets, alloc, "locktype");
+
+ if (ctx->lock->comment)
+ {
+ svn_ra_serf__add_tag_buckets(buckets, "owner", ctx->lock->comment,
+ alloc);
+ }
+
+ svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockinfo");
+
+ *body_bkt = buckets;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__lock(svn_ra_session_t *ra_session,
+ apr_hash_t *path_revs,
+ const char *comment,
+ svn_boolean_t force,
+ svn_ra_lock_callback_t lock_func,
+ void *lock_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ apr_array_header_t *lock_requests;
+
+ lock_requests = apr_array_make(scratch_pool, apr_hash_count(path_revs),
+ sizeof(lock_ctx_t*));
+
+ /* ### Perhaps we should open more connections than just one? See update.c */
+
+ iterpool = svn_pool_create(scratch_pool);
+
+ for (hi = apr_hash_first(scratch_pool, path_revs);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_ra_serf__handler_t *handler;
+ svn_ra_serf__xml_context_t *xmlctx;
+ const char *req_url;
+ lock_ctx_t *lock_ctx;
+ apr_pool_t *lock_pool;
+
+ svn_pool_clear(iterpool);
+
+ lock_pool = svn_pool_create(scratch_pool);
+ lock_ctx = apr_pcalloc(scratch_pool, sizeof(*lock_ctx));
+
+ lock_ctx->pool = lock_pool;
+ lock_ctx->path = apr_hash_this_key(hi);
+ lock_ctx->revision = *((svn_revnum_t*)apr_hash_this_val(hi));
+ lock_ctx->lock = svn_lock_create(lock_pool);
+ lock_ctx->lock->path = lock_ctx->path;
+ lock_ctx->lock->comment = comment;
+
+ lock_ctx->force = force;
+ req_url = svn_path_url_add_component2(session->session_url.path,
+ lock_ctx->path, lock_pool);
+
+ xmlctx = svn_ra_serf__xml_context_create(locks_ttable,
+ NULL, locks_closed, NULL,
+ lock_ctx,
+ lock_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ lock_pool);
+
+ handler->method = "LOCK";
+ handler->path = req_url;
+ handler->body_type = "text/xml";
+
+ /* Same stupid algorithm from get_best_connection() in update.c */
+ handler->conn = session->conns[session->cur_conn];
+ session->cur_conn++;
+
+ if (session->cur_conn >= session->num_conns)
+ session->cur_conn = 0;
+
+ handler->header_delegate = set_lock_headers;
+ handler->header_delegate_baton = lock_ctx;
+
+ handler->body_delegate = create_lock_body;
+ handler->body_delegate_baton = lock_ctx;
+
+ lock_ctx->inner_handler = handler->response_handler;
+ lock_ctx->inner_baton = handler->response_baton;
+ handler->response_handler = handle_lock;
+ handler->response_baton = lock_ctx;
+
+ handler->no_fail_on_http_failure_status = TRUE;
+
+ lock_ctx->handler = handler;
+
+ APR_ARRAY_PUSH(lock_requests, lock_ctx_t *) = lock_ctx;
+
+ svn_ra_serf__request_create(handler);
+ }
+
+ SVN_ERR(run_locks(session, lock_requests, TRUE, lock_func, lock_baton,
+ iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+set_unlock_headers(serf_bucket_t *headers,
+ void *baton,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
+{
+ lock_ctx_t *ctx = baton;
+
+ serf_bucket_headers_set(headers, "Lock-Token", ctx->token);
+ if (ctx->force)
+ {
+ serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,
+ SVN_DAV_OPTION_LOCK_BREAK);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__unlock(svn_ra_session_t *ra_session,
+ apr_hash_t *path_tokens,
+ svn_boolean_t force,
+ svn_ra_lock_callback_t lock_func,
+ void *lock_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+ apr_array_header_t *lock_requests;
+
+ iterpool = svn_pool_create(scratch_pool);
+
+ /* If we are stealing locks we need the lock tokens */
+ if (force)
+ {
+ /* Theoretically this part can be improved (for performance) by using
+ svn_ra_get_locks() to obtain all the locks in a single request, but
+ do we really want to improve the performance of
+ $ svn unlock --force *
+ */
+
+ for (hi = apr_hash_first(scratch_pool, path_tokens);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *path;
+ const char *token;
+ svn_lock_t *existing_lock;
+ svn_error_t *err;
+
+ svn_pool_clear(iterpool);
+
+ path = apr_hash_this_key(hi);
+ token = apr_hash_this_val(hi);
+
+ if (token && token[0])
+ continue;
+
+ if (session->cancel_func)
+ SVN_ERR(session->cancel_func(session->cancel_baton));
+
+ err = svn_ra_serf__get_lock(ra_session, &existing_lock, path,
+ iterpool);
+
+ if (!err && existing_lock)
+ {
+ svn_hash_sets(path_tokens, path,
+ apr_pstrdup(scratch_pool, existing_lock->token));
+ continue;
+ }
+
+ err = svn_error_createf(SVN_ERR_RA_NOT_LOCKED, err,
+ _("'%s' is not locked in the repository"),
+ path);
+
+ if (lock_func)
+ {
+ svn_error_t *err2;
+ err2 = lock_func(lock_baton, path, FALSE, NULL, err, iterpool);
+ svn_error_clear(err);
+
+ SVN_ERR(err2);
+ }
+ else
+ {
+ svn_error_clear(err);
+ }
+
+ svn_hash_sets(path_tokens, path, NULL);
+ }
+ }
+
+ /* ### Perhaps we should open more connections than just one? See update.c */
+
+ lock_requests = apr_array_make(scratch_pool, apr_hash_count(path_tokens),
+ sizeof(lock_ctx_t*));
+
+ for (hi = apr_hash_first(scratch_pool, path_tokens);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_ra_serf__handler_t *handler;
+ const char *req_url, *token;
+ lock_ctx_t *lock_ctx;
+ apr_pool_t *lock_pool;
+
+ svn_pool_clear(iterpool);
+
+ lock_pool = svn_pool_create(scratch_pool);
+ lock_ctx = apr_pcalloc(lock_pool, sizeof(*lock_ctx));
+
+ lock_ctx->pool = lock_pool;
+
+ lock_ctx->path = apr_hash_this_key(hi);
+ token = apr_hash_this_val(hi);
+
+ lock_ctx->force = force;
+ lock_ctx->token = apr_pstrcat(lock_pool, "<", token, ">", SVN_VA_NULL);
+
+ req_url = svn_path_url_add_component2(session->session_url.path, lock_ctx->path,
+ lock_pool);
+
+ handler = svn_ra_serf__create_handler(session, lock_pool);
+
+ handler->method = "UNLOCK";
+ handler->path = req_url;
+
+ handler->header_delegate = set_unlock_headers;
+ handler->header_delegate_baton = lock_ctx;
+
+ handler->response_handler = svn_ra_serf__expect_empty_body;
+ handler->response_baton = handler;
+
+ handler->no_fail_on_http_failure_status = TRUE;
+
+ lock_ctx->handler = handler;
+
+ APR_ARRAY_PUSH(lock_requests, lock_ctx_t *) = lock_ctx;
+
+ svn_ra_serf__request_create(handler);
+ }
+
+ SVN_ERR(run_locks(session, lock_requests, FALSE, lock_func, lock_baton,
+ iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/locks.c b/subversion/libsvn_ra_serf/locks.c
deleted file mode 100644
index 252c301..0000000
--- a/subversion/libsvn_ra_serf/locks.c
+++ /dev/null
@@ -1,669 +0,0 @@
-/*
- * locks.c : entry point for locking RA functions for ra_serf
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-
-
-#include <apr_uri.h>
-#include <serf.h>
-
-#include "svn_dav.h"
-#include "svn_pools.h"
-#include "svn_ra.h"
-
-#include "../libsvn_ra/ra_loader.h"
-#include "svn_config.h"
-#include "svn_path.h"
-#include "svn_time.h"
-#include "svn_private_config.h"
-
-#include "ra_serf.h"
-
-
-/*
- * This enum represents the current state of our XML parsing for a REPORT.
- */
-enum {
- INITIAL = 0,
- MULTISTATUS,
- RESPONSE,
- PROPSTAT,
- PROP,
- LOCK_DISCOVERY,
- ACTIVE_LOCK,
- LOCK_TYPE,
- LOCK_SCOPE,
- DEPTH,
- TIMEOUT,
- LOCK_TOKEN,
- OWNER,
- HREF
-};
-
-typedef struct lock_info_t {
- apr_pool_t *pool;
-
- const char *path;
-
- svn_lock_t *lock;
-
- svn_boolean_t force;
- svn_revnum_t revision;
-
- svn_boolean_t read_headers;
-
- svn_ra_serf__handler_t *handler;
-
- /* The expat handler. We wrap this to do a bit more work. */
- svn_ra_serf__response_handler_t inner_handler;
- void *inner_baton;
-
-} lock_info_t;
-
-#define D_ "DAV:"
-#define S_ SVN_XML_NAMESPACE
-static const svn_ra_serf__xml_transition_t locks_ttable[] = {
- /* The INITIAL state can transition into D:prop (LOCK) or
- to D:multistatus (PROPFIND) */
- { INITIAL, D_, "prop", PROP,
- FALSE, { NULL }, FALSE },
- { INITIAL, D_, "multistatus", MULTISTATUS,
- FALSE, { NULL }, FALSE },
-
- { MULTISTATUS, D_, "response", RESPONSE,
- FALSE, { NULL }, FALSE },
-
- { RESPONSE, D_, "propstat", PROPSTAT,
- FALSE, { NULL }, FALSE },
-
- { PROPSTAT, D_, "prop", PROP,
- FALSE, { NULL }, FALSE },
-
- { PROP, D_, "lockdiscovery", LOCK_DISCOVERY,
- FALSE, { NULL }, FALSE },
-
- { LOCK_DISCOVERY, D_, "activelock", ACTIVE_LOCK,
- FALSE, { NULL }, FALSE },
-
-#if 0
- /* ### we don't really need to parse locktype/lockscope. we know what
- ### the values are going to be. we *could* validate that the only
- ### possible children are D:write and D:exclusive. we'd need to
- ### modify the state transition to tell us about all children
- ### (ie. maybe support "*" for the name) and then validate. but it
- ### just isn't important to validate, so disable this for now... */
-
- { ACTIVE_LOCK, D_, "locktype", LOCK_TYPE,
- FALSE, { NULL }, FALSE },
-
- { LOCK_TYPE, D_, "write", WRITE,
- FALSE, { NULL }, TRUE },
-
- { ACTIVE_LOCK, D_, "lockscope", LOCK_SCOPE,
- FALSE, { NULL }, FALSE },
-
- { LOCK_SCOPE, D_, "exclusive", EXCLUSIVE,
- FALSE, { NULL }, TRUE },
-#endif /* 0 */
-
- { ACTIVE_LOCK, D_, "timeout", TIMEOUT,
- TRUE, { NULL }, TRUE },
-
- { ACTIVE_LOCK, D_, "locktoken", LOCK_TOKEN,
- FALSE, { NULL }, FALSE },
-
- { LOCK_TOKEN, D_, "href", HREF,
- TRUE, { NULL }, TRUE },
-
- { ACTIVE_LOCK, D_, "owner", OWNER,
- TRUE, { NULL }, TRUE },
-
- /* ACTIVE_LOCK has a D:depth child, but we can ignore that. */
-
- { 0 }
-};
-
-
-/* Conforms to svn_ra_serf__xml_closed_t */
-static svn_error_t *
-locks_closed(svn_ra_serf__xml_estate_t *xes,
- void *baton,
- int leaving_state,
- const svn_string_t *cdata,
- apr_hash_t *attrs,
- apr_pool_t *scratch_pool)
-{
- lock_info_t *lock_ctx = baton;
-
- if (leaving_state == TIMEOUT)
- {
- if (strcasecmp(cdata->data, "Infinite") == 0)
- lock_ctx->lock->expiration_date = 0;
- else if (strncasecmp(cdata->data, "Second-", 7) == 0)
- {
- unsigned n;
- SVN_ERR(svn_cstring_atoui(&n, cdata->data+7));
-
- lock_ctx->lock->expiration_date = apr_time_now() +
- apr_time_from_sec(n);
- }
- else
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Invalid LOCK timeout value '%s'"),
- cdata->data);
- }
- else if (leaving_state == HREF)
- {
- if (cdata->len)
- {
- char *buf = apr_pstrmemdup(lock_ctx->pool, cdata->data, cdata->len);
-
- apr_collapse_spaces(buf, buf);
- lock_ctx->lock->token = buf;
- }
- }
- else if (leaving_state == OWNER)
- {
- if (cdata->len)
- {
- lock_ctx->lock->comment = apr_pstrmemdup(lock_ctx->pool,
- cdata->data, cdata->len);
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-
-static svn_error_t *
-set_lock_headers(serf_bucket_t *headers,
- void *baton,
- apr_pool_t *pool)
-{
- lock_info_t *lock_ctx = baton;
-
- if (lock_ctx->force)
- {
- serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,
- SVN_DAV_OPTION_LOCK_STEAL);
- }
-
- if (SVN_IS_VALID_REVNUM(lock_ctx->revision))
- {
- serf_bucket_headers_set(headers, SVN_DAV_VERSION_NAME_HEADER,
- apr_ltoa(pool, lock_ctx->revision));
- }
-
- return APR_SUCCESS;
-}
-
-
-/* Register an error within the session. If something is already there,
- then it will take precedence. */
-static svn_error_t *
-determine_error(svn_ra_serf__handler_t *handler,
- svn_error_t *err)
-{
- {
- apr_status_t errcode;
-
- if (handler->sline.code == 423)
- errcode = SVN_ERR_FS_PATH_ALREADY_LOCKED;
- else if (handler->sline.code == 403)
- errcode = SVN_ERR_RA_DAV_FORBIDDEN;
- else
- return err;
-
- /* Client-side or server-side error already. Return it. */
- if (err != NULL)
- return err;
-
- /* The server did not send us a detailed human-readable error.
- Provide a generic error. */
- err = svn_error_createf(errcode, NULL,
- _("Lock request failed: %d %s"),
- handler->sline.code,
- handler->sline.reason);
- }
-
- return err;
-}
-
-
-/* Implements svn_ra_serf__response_handler_t */
-static svn_error_t *
-handle_lock(serf_request_t *request,
- serf_bucket_t *response,
- void *handler_baton,
- apr_pool_t *pool)
-{
- lock_info_t *ctx = handler_baton;
-
- /* 403 (Forbidden) when a lock doesn't exist.
- 423 (Locked) when a lock already exists. */
- if (ctx->handler->sline.code == 403
- || ctx->handler->sline.code == 423)
- {
- /* Go look in the body for a server-provided error. This will
- reset flags for the core handler to Do The Right Thing. We
- won't be back to this handler again. */
- return svn_error_trace(svn_ra_serf__expect_empty_body(
- request, response, ctx->handler, pool));
- }
-
- if (!ctx->read_headers)
- {
- serf_bucket_t *headers;
- const char *val;
-
- headers = serf_bucket_response_get_headers(response);
-
- val = serf_bucket_headers_get(headers, SVN_DAV_LOCK_OWNER_HEADER);
- if (val)
- {
- ctx->lock->owner = apr_pstrdup(ctx->pool, val);
- }
-
- val = serf_bucket_headers_get(headers, SVN_DAV_CREATIONDATE_HEADER);
- if (val)
- {
- SVN_ERR(svn_time_from_cstring(&ctx->lock->creation_date, val,
- ctx->pool));
- }
-
- ctx->read_headers = TRUE;
- }
-
- return ctx->inner_handler(request, response, ctx->inner_baton, pool);
-}
-
-/* Implements svn_ra_serf__request_body_delegate_t */
-static svn_error_t *
-create_getlock_body(serf_bucket_t **body_bkt,
- void *baton,
- serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
-{
- serf_bucket_t *buckets;
-
- buckets = serf_bucket_aggregate_create(alloc);
-
- svn_ra_serf__add_xml_header_buckets(buckets, alloc);
- svn_ra_serf__add_open_tag_buckets(buckets, alloc, "propfind",
- "xmlns", "DAV:",
- NULL);
- svn_ra_serf__add_open_tag_buckets(buckets, alloc, "prop", NULL);
- svn_ra_serf__add_tag_buckets(buckets, "lockdiscovery", NULL, alloc);
- svn_ra_serf__add_close_tag_buckets(buckets, alloc, "prop");
- svn_ra_serf__add_close_tag_buckets(buckets, alloc, "propfind");
-
- *body_bkt = buckets;
- return SVN_NO_ERROR;
-}
-
-static svn_error_t*
-setup_getlock_headers(serf_bucket_t *headers,
- void *baton,
- apr_pool_t *pool)
-{
- serf_bucket_headers_setn(headers, "Depth", "0");
-
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_ra_serf__request_body_delegate_t */
-static svn_error_t *
-create_lock_body(serf_bucket_t **body_bkt,
- void *baton,
- serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
-{
- lock_info_t *ctx = baton;
- serf_bucket_t *buckets;
-
- buckets = serf_bucket_aggregate_create(alloc);
-
- svn_ra_serf__add_xml_header_buckets(buckets, alloc);
- svn_ra_serf__add_open_tag_buckets(buckets, alloc, "lockinfo",
- "xmlns", "DAV:",
- NULL);
-
- svn_ra_serf__add_open_tag_buckets(buckets, alloc, "lockscope", NULL);
- svn_ra_serf__add_tag_buckets(buckets, "exclusive", NULL, alloc);
- svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockscope");
-
- svn_ra_serf__add_open_tag_buckets(buckets, alloc, "locktype", NULL);
- svn_ra_serf__add_tag_buckets(buckets, "write", NULL, alloc);
- svn_ra_serf__add_close_tag_buckets(buckets, alloc, "locktype");
-
- if (ctx->lock->comment)
- {
- svn_ra_serf__add_tag_buckets(buckets, "owner", ctx->lock->comment,
- alloc);
- }
-
- svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockinfo");
-
- *body_bkt = buckets;
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_ra_serf__get_lock(svn_ra_session_t *ra_session,
- svn_lock_t **lock,
- const char *path,
- apr_pool_t *result_pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- svn_ra_serf__handler_t *handler;
- svn_ra_serf__xml_context_t *xmlctx;
- apr_pool_t *scratch_pool = svn_pool_create(result_pool);
- lock_info_t *lock_ctx;
- const char *req_url;
- svn_error_t *err;
-
- req_url = svn_path_url_add_component2(session->session_url.path, path,
- scratch_pool);
-
- lock_ctx = apr_pcalloc(scratch_pool, sizeof(*lock_ctx));
- lock_ctx->pool = result_pool;
- lock_ctx->path = req_url;
- lock_ctx->lock = svn_lock_create(result_pool);
- lock_ctx->lock->path = apr_pstrdup(result_pool, path);
-
- xmlctx = svn_ra_serf__xml_context_create(locks_ttable,
- NULL, locks_closed, NULL,
- lock_ctx,
- scratch_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, scratch_pool);
-
- handler->method = "PROPFIND";
- handler->path = req_url;
- handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
-
- handler->body_delegate = create_getlock_body;
- handler->body_delegate_baton = lock_ctx;
-
- handler->header_delegate = setup_getlock_headers;
- handler->header_delegate_baton = lock_ctx;
-
- lock_ctx->inner_handler = handler->response_handler;
- lock_ctx->inner_baton = handler->response_baton;
- handler->response_handler = handle_lock;
- handler->response_baton = lock_ctx;
-
- lock_ctx->handler = handler;
-
- err = svn_ra_serf__context_run_one(handler, scratch_pool);
- err = determine_error(handler, err);
-
- if (handler->sline.code == 404)
- {
- return svn_error_create(SVN_ERR_RA_ILLEGAL_URL, err,
- _("Malformed URL for repository"));
- }
- if (err)
- {
- /* TODO Shh. We're telling a white lie for now. */
- return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err,
- _("Server does not support locking features"));
- }
-
- if (lock_ctx->lock && lock_ctx->lock->token)
- *lock = lock_ctx->lock;
- else
- *lock = NULL;
-
- svn_pool_destroy(scratch_pool);
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_ra_serf__lock(svn_ra_session_t *ra_session,
- apr_hash_t *path_revs,
- const char *comment,
- svn_boolean_t force,
- svn_ra_lock_callback_t lock_func,
- void *lock_baton,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_index_t *hi;
- apr_pool_t *iterpool;
-
- iterpool = svn_pool_create(scratch_pool);
-
- /* ### TODO for issue 2263: Send all the locks over the wire at once. This
- ### loop is just a temporary shim.
- ### an alternative, which is backwards-compat with all servers is to
- ### pipeline these requests. ie. stop using run_wait/run_one. */
-
- for (hi = apr_hash_first(scratch_pool, path_revs);
- hi;
- hi = apr_hash_next(hi))
- {
- svn_ra_serf__handler_t *handler;
- svn_ra_serf__xml_context_t *xmlctx;
- const char *req_url;
- lock_info_t *lock_ctx;
- svn_error_t *err;
- svn_error_t *new_err = NULL;
-
- svn_pool_clear(iterpool);
-
- lock_ctx = apr_pcalloc(iterpool, sizeof(*lock_ctx));
-
- lock_ctx->pool = iterpool;
- lock_ctx->path = svn__apr_hash_index_key(hi);
- lock_ctx->revision = *((svn_revnum_t*)svn__apr_hash_index_val(hi));
- lock_ctx->lock = svn_lock_create(iterpool);
- lock_ctx->lock->path = lock_ctx->path;
- lock_ctx->lock->comment = comment;
-
- lock_ctx->force = force;
- req_url = svn_path_url_add_component2(session->session_url.path,
- lock_ctx->path, iterpool);
-
- xmlctx = svn_ra_serf__xml_context_create(locks_ttable,
- NULL, locks_closed, NULL,
- lock_ctx,
- iterpool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, iterpool);
-
- handler->method = "LOCK";
- handler->path = req_url;
- handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
-
- handler->header_delegate = set_lock_headers;
- handler->header_delegate_baton = lock_ctx;
-
- handler->body_delegate = create_lock_body;
- handler->body_delegate_baton = lock_ctx;
-
- lock_ctx->inner_handler = handler->response_handler;
- lock_ctx->inner_baton = handler->response_baton;
- handler->response_handler = handle_lock;
- handler->response_baton = lock_ctx;
-
- lock_ctx->handler = handler;
-
- err = svn_ra_serf__context_run_one(handler, iterpool);
- err = determine_error(handler, err);
-
- if (lock_func)
- new_err = lock_func(lock_baton, lock_ctx->path, TRUE, lock_ctx->lock,
- err, iterpool);
- svn_error_clear(err);
-
- SVN_ERR(new_err);
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-struct unlock_context_t {
- const char *token;
- svn_boolean_t force;
-};
-
-static svn_error_t *
-set_unlock_headers(serf_bucket_t *headers,
- void *baton,
- apr_pool_t *pool)
-{
- struct unlock_context_t *ctx = baton;
-
- serf_bucket_headers_set(headers, "Lock-Token", ctx->token);
- if (ctx->force)
- {
- serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,
- SVN_DAV_OPTION_LOCK_BREAK);
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_ra_serf__unlock(svn_ra_session_t *ra_session,
- apr_hash_t *path_tokens,
- svn_boolean_t force,
- svn_ra_lock_callback_t lock_func,
- void *lock_baton,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_index_t *hi;
- apr_pool_t *iterpool;
-
- iterpool = svn_pool_create(scratch_pool);
-
- /* ### TODO for issue 2263: Send all the locks over the wire at once. This
- ### loop is just a temporary shim.
- ### an alternative, which is backwards-compat with all servers is to
- ### pipeline these requests. ie. stop using run_wait/run_one. */
-
- for (hi = apr_hash_first(scratch_pool, path_tokens);
- hi;
- hi = apr_hash_next(hi))
- {
- svn_ra_serf__handler_t *handler;
- const char *req_url, *path, *token;
- svn_lock_t *existing_lock = NULL;
- struct unlock_context_t unlock_ctx;
- svn_error_t *err = NULL;
- svn_error_t *new_err = NULL;
-
-
- svn_pool_clear(iterpool);
-
- path = svn__apr_hash_index_key(hi);
- token = svn__apr_hash_index_val(hi);
-
- if (force && (!token || token[0] == '\0'))
- {
- SVN_ERR(svn_ra_serf__get_lock(ra_session, &existing_lock, path,
- iterpool));
- token = existing_lock ? existing_lock->token : NULL;
- if (!token)
- {
- err = svn_error_createf(SVN_ERR_RA_NOT_LOCKED, NULL,
- _("'%s' is not locked in the repository"),
- path);
-
- if (lock_func)
- {
- svn_error_t *err2;
- err2 = lock_func(lock_baton, path, FALSE, NULL, err,
- iterpool);
- svn_error_clear(err);
- err = NULL;
- if (err2)
- return svn_error_trace(err2);
- }
- else
- {
- svn_error_clear(err);
- err = NULL;
- }
- continue;
- }
- }
-
- unlock_ctx.force = force;
- unlock_ctx.token = apr_pstrcat(iterpool, "<", token, ">", (char *)NULL);
-
- req_url = svn_path_url_add_component2(session->session_url.path, path,
- iterpool);
-
- handler = apr_pcalloc(iterpool, sizeof(*handler));
-
- handler->handler_pool = iterpool;
- handler->method = "UNLOCK";
- handler->path = req_url;
- handler->conn = session->conns[0];
- handler->session = session;
-
- handler->header_delegate = set_unlock_headers;
- handler->header_delegate_baton = &unlock_ctx;
-
- handler->response_handler = svn_ra_serf__expect_empty_body;
- handler->response_baton = handler;
-
- SVN_ERR(svn_ra_serf__context_run_one(handler, iterpool));
-
- switch (handler->sline.code)
- {
- case 204:
- break; /* OK */
- case 403:
- /* Api users expect this specific error code to detect failures */
- err = svn_error_createf(SVN_ERR_FS_LOCK_OWNER_MISMATCH, NULL,
- _("Unlock request failed: %d %s"),
- handler->sline.code,
- handler->sline.reason);
- break;
- default:
- err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("Unlock request failed: %d %s"),
- handler->sline.code,
- handler->sline.reason);
- }
-
- if (lock_func)
- new_err = lock_func(lock_baton, path, FALSE, existing_lock, err,
- iterpool);
-
- svn_error_clear(err);
- SVN_ERR(new_err);
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
diff --git a/subversion/libsvn_ra_serf/log.c b/subversion/libsvn_ra_serf/log.c
index 02f2f29..773ae5c 100644
--- a/subversion/libsvn_ra_serf/log.c
+++ b/subversion/libsvn_ra_serf/log.c
@@ -22,7 +22,8 @@
*/
-
+
+
#include <apr_uri.h>
#include <serf.h>
@@ -44,12 +45,13 @@
#include "ra_serf.h"
#include "../libsvn_ra/ra_loader.h"
-
+
+
/*
* This enum represents the current state of our XML parsing for a REPORT.
*/
-enum {
- INITIAL = 0,
+enum log_state_e {
+ INITIAL = XML_STATE_INITIAL,
REPORT,
ITEM,
VERSION,
@@ -145,7 +147,8 @@ static const svn_ra_serf__xml_transition_t log_ttable[] = {
{ 0 }
};
-
+
+
/* Store CDATA into REVPROPS, associated with PROPNAME. If ENCODING is not
NULL, then it must base "base64" and CDATA will be decoded first.
@@ -207,12 +210,14 @@ collect_path(apr_hash_t *paths,
copyfrom_rev = svn_hash_gets(attrs, "copyfrom-rev");
if (copyfrom_path && copyfrom_rev)
{
- svn_revnum_t rev = SVN_STR_TO_REV(copyfrom_rev);
+ apr_int64_t rev;
+
+ SVN_ERR(svn_cstring_atoi64(&rev, copyfrom_rev));
- if (SVN_IS_VALID_REVNUM(rev))
+ if (SVN_IS_VALID_REVNUM((svn_revnum_t)rev))
{
lcp->copyfrom_path = apr_pstrdup(result_pool, copyfrom_path);
- lcp->copyfrom_rev = rev;
+ lcp->copyfrom_rev = (svn_revnum_t)rev;
}
}
@@ -296,7 +301,12 @@ log_closed(svn_ra_serf__xml_estate_t *xes,
rev_str = svn_hash_gets(attrs, "revision");
if (rev_str)
- log_entry->revision = SVN_STR_TO_REV(rev_str);
+ {
+ apr_int64_t rev;
+
+ SVN_ERR(svn_cstring_atoi64(&rev, rev_str));
+ log_entry->revision = (svn_revnum_t)rev;
+ }
else
log_entry->revision = SVN_INVALID_REVNUM;
@@ -397,12 +407,13 @@ log_closed(svn_ra_serf__xml_estate_t *xes,
return SVN_NO_ERROR;
}
-
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_log_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *buckets;
log_context_t *log_ctx = baton;
@@ -412,7 +423,7 @@ create_log_body(serf_bucket_t **body_bkt,
svn_ra_serf__add_open_tag_buckets(buckets, alloc,
"S:log-report",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(buckets,
"S:start-revision",
@@ -432,23 +443,22 @@ create_log_body(serf_bucket_t **body_bkt,
if (log_ctx->changed_paths)
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:discover-changed-paths", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:discover-changed-paths",
+ SVN_VA_NULL);
}
if (log_ctx->strict_node_history)
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:strict-node-history", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:strict-node-history", SVN_VA_NULL);
}
if (log_ctx->include_merged_revisions)
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:include-merged-revisions", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:include-merged-revisions",
+ SVN_VA_NULL);
}
if (log_ctx->revprops)
@@ -463,16 +473,14 @@ create_log_body(serf_bucket_t **body_bkt,
}
if (log_ctx->revprops->nelts == 0)
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:no-revprops", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:no-revprops", SVN_VA_NULL);
}
}
else
{
- svn_ra_serf__add_tag_buckets(buckets,
- "S:all-revprops", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:all-revprops", SVN_VA_NULL);
}
if (log_ctx->paths)
@@ -487,9 +495,8 @@ create_log_body(serf_bucket_t **body_bkt,
}
}
- svn_ra_serf__add_tag_buckets(buckets,
- "S:encode-binary-props", NULL,
- alloc);
+ svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+ "S:encode-binary-props", SVN_VA_NULL);
svn_ra_serf__add_close_tag_buckets(buckets, alloc,
"S:log-report");
@@ -518,7 +525,6 @@ svn_ra_serf__get_log(svn_ra_session_t *ra_session,
svn_ra_serf__xml_context_t *xmlctx;
svn_boolean_t want_custom_revprops;
svn_revnum_t peg_rev;
- svn_error_t *err;
const char *req_url;
log_ctx = apr_pcalloc(pool, sizeof(*log_ctx));
@@ -574,7 +580,7 @@ svn_ra_serf__get_log(svn_ra_session_t *ra_session,
peg_rev = (start == SVN_INVALID_REVNUM || start > end) ? start : end;
SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */,
- session, NULL /* conn */,
+ session,
NULL /* url */, peg_rev,
pool, pool));
@@ -582,23 +588,18 @@ svn_ra_serf__get_log(svn_ra_session_t *ra_session,
log_opened, log_closed, NULL,
log_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = req_url;
handler->body_delegate = create_log_body;
handler->body_delegate_baton = log_ctx;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
- err = svn_ra_serf__context_run_one(handler, pool);
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- SVN_ERR(svn_error_compose_create(
+ return svn_error_trace(
svn_ra_serf__error_on_status(handler->sline,
req_url,
- handler->location),
- err));
-
- return SVN_NO_ERROR;
+ handler->location));
}
diff --git a/subversion/libsvn_ra_serf/merge.c b/subversion/libsvn_ra_serf/merge.c
index 670e421..0a2fd54 100644
--- a/subversion/libsvn_ra_serf/merge.c
+++ b/subversion/libsvn_ra_serf/merge.c
@@ -48,7 +48,7 @@
* This enum represents the current state of our XML parsing for a MERGE.
*/
typedef enum merge_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
MERGE_RESPONSE,
UPDATED_SET,
RESPONSE,
@@ -65,7 +65,7 @@ typedef enum merge_state_e {
AUTHOR,
POST_COMMIT_ERR,
- PROP_VAL
+ STATUS
} merge_state_e;
@@ -171,7 +171,12 @@ merge_closed(svn_ra_serf__xml_estate_t *xes,
rev_str = svn_hash_gets(attrs, "revision");
if (rev_str)
- merge_ctx->commit_info->revision = SVN_STR_TO_REV(rev_str);
+ {
+ apr_int64_t rev;
+
+ SVN_ERR(svn_cstring_atoi64(&rev, rev_str));
+ merge_ctx->commit_info->revision = (svn_revnum_t)rev;
+ }
else
merge_ctx->commit_info->revision = SVN_INVALID_REVNUM;
@@ -266,7 +271,8 @@ merge_closed(svn_ra_serf__xml_estate_t *xes,
static svn_error_t *
setup_merge_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
merge_context_t *ctx = baton;
@@ -294,7 +300,7 @@ svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens,
svn_ra_serf__add_open_tag_buckets(body, alloc,
"S:lock-token-list",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
for (hi = apr_hash_first(pool, lock_tokens);
hi;
@@ -313,9 +319,9 @@ svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens,
if (parent && !svn_relpath_skip_ancestor(parent, key))
continue;
- svn_ra_serf__add_open_tag_buckets(body, alloc, "S:lock", NULL);
+ svn_ra_serf__add_open_tag_buckets(body, alloc, "S:lock", SVN_VA_NULL);
- svn_ra_serf__add_open_tag_buckets(body, alloc, "lock-path", NULL);
+ svn_ra_serf__add_open_tag_buckets(body, alloc, "lock-path", SVN_VA_NULL);
svn_ra_serf__add_cdata_len_buckets(body, alloc, path.data, path.len);
svn_ra_serf__add_close_tag_buckets(body, alloc, "lock-path");
@@ -327,11 +333,13 @@ svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens,
svn_ra_serf__add_close_tag_buckets(body, alloc, "S:lock-token-list");
}
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t*
create_merge_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
merge_context_t *ctx = baton;
serf_bucket_t *body_bkt;
@@ -341,9 +349,9 @@ create_merge_body(serf_bucket_t **bkt,
svn_ra_serf__add_xml_header_buckets(body_bkt, alloc);
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:merge",
"xmlns:D", "DAV:",
- NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:source", NULL);
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:href", NULL);
+ SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:source", SVN_VA_NULL);
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:href", SVN_VA_NULL);
svn_ra_serf__add_cdata_len_buckets(body_bkt, alloc,
ctx->merge_resource_url,
@@ -352,19 +360,26 @@ create_merge_body(serf_bucket_t **bkt,
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:href");
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:source");
- svn_ra_serf__add_tag_buckets(body_bkt, "D:no-auto-merge", NULL, alloc);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:no-checkout", NULL, alloc);
-
- svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", NULL);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:checked-in", NULL, alloc);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:" SVN_DAV__VERSION_NAME, NULL, alloc);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:resourcetype", NULL, alloc);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:" SVN_DAV__CREATIONDATE, NULL, alloc);
- svn_ra_serf__add_tag_buckets(body_bkt, "D:creator-displayname", NULL, alloc);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:no-auto-merge", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:no-checkout", SVN_VA_NULL);
+
+ svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:checked-in", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:" SVN_DAV__VERSION_NAME, SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:resourcetype", SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:" SVN_DAV__CREATIONDATE, SVN_VA_NULL);
+ svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+ "D:creator-displayname", SVN_VA_NULL);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
- svn_ra_serf__merge_lock_token_list(ctx->lock_tokens, NULL, body_bkt, alloc,
- pool);
+ svn_ra_serf__merge_lock_token_list(ctx->lock_tokens, NULL, body_bkt,
+ alloc, pool);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:merge");
@@ -376,9 +391,7 @@ create_merge_body(serf_bucket_t **bkt,
svn_error_t *
svn_ra_serf__run_merge(const svn_commit_info_t **commit_info,
- int *response_code,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
const char *merge_resource_url,
apr_hash_t *lock_tokens,
svn_boolean_t keep_locks,
@@ -407,14 +420,14 @@ svn_ra_serf__run_merge(const svn_commit_info_t **commit_info,
NULL, merge_closed, NULL,
merge_ctx,
scratch_pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ scratch_pool);
handler->method = "MERGE";
handler->path = merge_ctx->merge_url;
handler->body_delegate = create_merge_body;
handler->body_delegate_baton = merge_ctx;
- handler->conn = conn;
- handler->session = session;
+ handler->body_type = "text/xml";
handler->header_delegate = setup_merge_headers;
handler->header_delegate_baton = merge_ctx;
@@ -423,8 +436,21 @@ svn_ra_serf__run_merge(const svn_commit_info_t **commit_info,
SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
*commit_info = merge_ctx->commit_info;
- *response_code = handler->sline.code;
+
+ /* Sanity check (Reported to be triggered by CodePlex's svnbridge) */
+ if (! SVN_IS_VALID_REVNUM(merge_ctx->commit_info->revision))
+ {
+ return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
+ _("The MERGE response did not include "
+ "a new revision"));
+ }
+
+ merge_ctx->commit_info->repos_root = apr_pstrdup(result_pool,
+ session->repos_root_str);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_serf/mergeinfo.c b/subversion/libsvn_ra_serf/mergeinfo.c
index bd4fcba..589ff07 100644
--- a/subversion/libsvn_ra_serf/mergeinfo.c
+++ b/subversion/libsvn_ra_serf/mergeinfo.c
@@ -41,7 +41,7 @@
/* The current state of our XML parsing. */
typedef enum mergeinfo_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
MERGEINFO_REPORT,
MERGEINFO_ITEM,
MERGEINFO_PATH,
@@ -130,12 +130,13 @@ mergeinfo_closed(svn_ra_serf__xml_estate_t *xes,
return SVN_NO_ERROR;
}
-
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_mergeinfo_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
mergeinfo_context_t *mergeinfo_ctx = baton;
serf_bucket_t *body_bkt;
@@ -145,7 +146,7 @@ create_mergeinfo_body(serf_bucket_t **bkt,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc,
"S:" SVN_DAV__MERGEINFO_REPORT,
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(body_bkt,
"S:" SVN_DAV__REVISION,
@@ -191,7 +192,6 @@ svn_ra_serf__get_mergeinfo(svn_ra_session_t *ra_session,
svn_boolean_t include_descendants,
apr_pool_t *pool)
{
- svn_error_t *err;
mergeinfo_context_t *mergeinfo_ctx;
svn_ra_serf__session_t *session = ra_session->priv;
svn_ra_serf__handler_t *handler;
@@ -201,7 +201,7 @@ svn_ra_serf__get_mergeinfo(svn_ra_session_t *ra_session,
*catalog = NULL;
SVN_ERR(svn_ra_serf__get_stable_url(&path, NULL /* latest_revnum */,
- session, NULL /* conn */,
+ session,
NULL /* url */, revision,
pool, pool));
@@ -217,24 +217,21 @@ svn_ra_serf__get_mergeinfo(svn_ra_session_t *ra_session,
NULL, mergeinfo_closed, NULL,
mergeinfo_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "REPORT";
handler->path = path;
- handler->conn = session->conns[0];
- handler->session = session;
+
handler->body_delegate = create_mergeinfo_body;
handler->body_delegate_baton = mergeinfo_ctx;
handler->body_type = "text/xml";
- err = svn_ra_serf__context_run_one(handler, pool);
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
- SVN_ERR(svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline, handler->path,
- handler->location),
- err));
+ SVN_ERR(svn_ra_serf__error_on_status(handler->sline, handler->path,
+ handler->location));
- if (handler->done && apr_hash_count(mergeinfo_ctx->result_catalog))
+ if (apr_hash_count(mergeinfo_ctx->result_catalog))
*catalog = mergeinfo_ctx->result_catalog;
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_ra_serf/multistatus.c b/subversion/libsvn_ra_serf/multistatus.c
new file mode 100644
index 0000000..9c269c3
--- /dev/null
+++ b/subversion/libsvn_ra_serf/multistatus.c
@@ -0,0 +1,750 @@
+/*
+ * multistatus.c : parse multistatus (error) responses.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include <assert.h>
+
+#include <apr.h>
+
+#include <serf.h>
+#include <serf_bucket_types.h>
+
+#include "svn_private_config.h"
+#include "svn_hash.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_string.h"
+#include "svn_xml.h"
+#include "svn_props.h"
+#include "svn_dirent_uri.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_fspath.h"
+
+#include "ra_serf.h"
+
+/* The current state of our XML parsing. */
+typedef enum iprops_state_e {
+ INITIAL = XML_STATE_INITIAL,
+ MS_MULTISTATUS,
+
+ MS_RESPONSE,
+ MS_RESPONSE_HREF,
+
+ MS_PROPSTAT,
+ MS_PROPSTAT_PROP,
+ MS_PROPSTAT_PROP_NAME,
+ MS_PROPSTAT_STATUS,
+ MS_PROPSTAT_RESPONSEDESCRIPTION,
+ MS_PROPSTAT_ERROR,
+ MS_PROPSTAT_ERROR_HUMANREADABLE,
+
+ MS_RESPONSE_STATUS,
+ MS_RESPONSE_RESPONSEDESCRIPTION,
+ MS_RESPONSE_ERROR,
+ MS_RESPONSE_ERROR_HUMANREADABLE,
+
+ MS_MULTISTATUS_RESPONSEDESCRIPTION,
+
+ D_ERROR,
+ S_ERROR,
+ M_ERROR_HUMANREADABLE
+} iprops_state_e;
+
+/*
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://something</D:href>
+ <!-- Possibly multiple D:href elements -->
+ <D:status>HTTP/1.1 500 failed</D:status>
+ <D:error>
+ <S:human-readable code="12345">
+ Some Subversion error
+ </S:human-readable>
+ </D:error>
+ <D:responsedescription>
+ Human readable description
+ </D:responsedescription>
+ <D:location>http://redirected</D:location>
+ </D:response>
+ ...
+ </D:multistatus>
+
+ Or for property operations:
+
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://somewhere-else</D:href>
+ <D:propstat>
+ <D:propname><C:myprop /></D:propname>
+ <D:status>HTTP/1.1 499 failed</D:status>
+ <D:error>
+ <S:human-readable code="12345">
+ Some Subversion error
+ </S:human-readable>
+ </D:error>
+ <D:responsedescription>
+ Human readable description
+ </D:responsedescription>
+ </D:propstat>
+ <D:status>HTTP/1.1 499 failed</D:status>
+ <D:error>
+ <S:human-readable code="12345">
+ Some Subversion error
+ </S:human-readable>
+ </D:error>
+ <D:responsedescription>
+ Human readable description
+ </D:responsedescription>
+ <D:location>http://redirected</D:location>
+ <D:responsedescription>
+ Global description
+ <D:responsedescription>
+ </D:multistatus>
+
+ Or on request failures
+ <D:error>
+ <X:some-error xmlns="QQ" />
+ <D:human-readable code="12345">
+ Some Subversion error
+ </D:human-readable>
+ </D:error>
+ */
+
+#define D_ "DAV:"
+#define S_ SVN_XML_NAMESPACE
+#define M_ "http://apache.org/dav/xmlns"
+static const svn_ra_serf__xml_transition_t multistatus_ttable[] = {
+ { INITIAL, D_, "multistatus", MS_MULTISTATUS,
+ FALSE, { NULL }, FALSE },
+
+ { MS_MULTISTATUS, D_, "responsedescription", MS_MULTISTATUS_RESPONSEDESCRIPTION,
+ TRUE, { NULL }, TRUE },
+
+ /* <response> */
+ { MS_MULTISTATUS, D_, "response", MS_RESPONSE,
+ FALSE, { NULL }, TRUE },
+
+ { MS_RESPONSE, D_, "href", MS_RESPONSE_HREF,
+ TRUE, { NULL }, TRUE },
+
+ /* <propstat> */
+ { MS_RESPONSE, D_, "propstat", MS_PROPSTAT,
+ FALSE, { NULL }, TRUE },
+
+ { MS_PROPSTAT, D_, "prop", MS_PROPSTAT_PROP,
+ FALSE, { NULL }, FALSE },
+
+ { MS_PROPSTAT_PROP, "", "*", MS_PROPSTAT_PROP_NAME,
+ FALSE, { NULL }, FALSE },
+
+ { MS_PROPSTAT, D_, "status", MS_PROPSTAT_STATUS,
+ TRUE, { NULL }, TRUE },
+
+ { MS_PROPSTAT, D_, "responsedescription", MS_PROPSTAT_RESPONSEDESCRIPTION,
+ TRUE, { NULL }, TRUE },
+
+ { MS_PROPSTAT, D_, "error", MS_PROPSTAT_ERROR,
+ FALSE, { NULL }, FALSE },
+
+ { MS_PROPSTAT_ERROR, M_, "human-readable", MS_PROPSTAT_ERROR_HUMANREADABLE,
+ TRUE, { "?errcode", NULL }, TRUE },
+ /* </propstat> */
+
+
+ { MS_RESPONSE, D_, "status", MS_RESPONSE_STATUS,
+ TRUE, { NULL }, TRUE },
+
+ { MS_RESPONSE, D_, "responsedescription", MS_RESPONSE_RESPONSEDESCRIPTION,
+ TRUE, { NULL }, TRUE },
+
+ { MS_RESPONSE, D_, "error", MS_RESPONSE_ERROR,
+ FALSE, { NULL }, TRUE },
+
+ { MS_RESPONSE_ERROR, M_, "human-readable", MS_RESPONSE_ERROR_HUMANREADABLE,
+ TRUE, { "?errcode", NULL }, TRUE },
+
+ /* </response> */
+
+ { MS_MULTISTATUS, D_, "responsedescription", MS_MULTISTATUS_RESPONSEDESCRIPTION,
+ TRUE, { NULL }, TRUE },
+
+
+ { INITIAL, D_, "error", D_ERROR,
+ FALSE, { NULL }, TRUE },
+
+ { D_ERROR, S_, "error", S_ERROR,
+ FALSE, { NULL }, FALSE },
+
+ { D_ERROR, M_, "human-readable", M_ERROR_HUMANREADABLE,
+ TRUE, { "?errcode", NULL }, TRUE },
+
+ { 0 }
+};
+
+/* Given a string like "HTTP/1.1 500 (status)" in BUF, parse out the numeric
+ status code into *STATUS_CODE_OUT. Ignores leading whitespace. */
+static svn_error_t *
+parse_status_line(int *status_code_out,
+ const char **reason,
+ const char *status_line,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ const char *token;
+ char *tok_status;
+ svn_stringbuf_t *temp_buf = svn_stringbuf_create(status_line, scratch_pool);
+
+ svn_stringbuf_strip_whitespace(temp_buf);
+ token = apr_strtok(temp_buf->data, " \t\r\n", &tok_status);
+ if (token)
+ token = apr_strtok(NULL, " \t\r\n", &tok_status);
+ if (!token)
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Malformed DAV:status '%s'"),
+ status_line);
+ err = svn_cstring_atoi(status_code_out, token);
+ if (err)
+ return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, err,
+ _("Malformed DAV:status '%s'"),
+ status_line);
+
+ token = apr_strtok(NULL, " \t\r\n", &tok_status);
+
+ *reason = apr_pstrdup(result_pool, token);
+
+ return SVN_NO_ERROR;
+}
+
+
+typedef struct error_item_t
+{
+ const char *path;
+ const char *propname;
+
+ int http_status;
+ const char *http_reason;
+ apr_status_t apr_err;
+
+ const char *message;
+} error_item_t;
+
+static svn_error_t *
+multistatus_opened(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int entered_state,
+ const svn_ra_serf__dav_props_t *tag,
+ apr_pool_t *scratch_pool)
+{
+ /*struct svn_ra_serf__server_error_t *server_error = baton;*/
+ const char *propname;
+
+ switch (entered_state)
+ {
+ case MS_PROPSTAT_PROP_NAME:
+ if (strcmp(tag->xmlns, SVN_DAV_PROP_NS_SVN) == 0)
+ propname = apr_pstrcat(scratch_pool, SVN_PROP_PREFIX, tag->name,
+ SVN_VA_NULL);
+ else
+ propname = tag->name;
+ svn_ra_serf__xml_note(xes, MS_PROPSTAT, "propname", propname);
+ break;
+ case S_ERROR:
+ /* This toggles an has error boolean in libsvn_ra_neon in 1.7 */
+ break;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+multistatus_closed(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int leaving_state,
+ const svn_string_t *cdata,
+ apr_hash_t *attrs,
+ apr_pool_t *scratch_pool)
+{
+ struct svn_ra_serf__server_error_t *server_error = baton;
+ const char *errcode;
+ const char *status;
+
+ switch (leaving_state)
+ {
+ case MS_RESPONSE_HREF:
+ {
+ apr_status_t result;
+ apr_uri_t uri;
+
+ result = apr_uri_parse(scratch_pool, cdata->data, &uri);
+ if (result)
+ return svn_ra_serf__wrap_err(result, NULL);
+ svn_ra_serf__xml_note(xes, MS_RESPONSE, "path",
+ svn_urlpath__canonicalize(uri.path, scratch_pool));
+ }
+ break;
+ case MS_RESPONSE_STATUS:
+ svn_ra_serf__xml_note(xes, MS_RESPONSE, "status", cdata->data);
+ break;
+ case MS_RESPONSE_ERROR_HUMANREADABLE:
+ svn_ra_serf__xml_note(xes, MS_RESPONSE, "human-readable", cdata->data);
+ errcode = svn_hash_gets(attrs, "errcode");
+ if (errcode)
+ svn_ra_serf__xml_note(xes, MS_RESPONSE, "errcode", errcode);
+ break;
+ case MS_RESPONSE:
+ if ((status = svn_hash__get_cstring(attrs, "status", NULL)) != NULL)
+ {
+ error_item_t *item;
+
+ item = apr_pcalloc(server_error->pool, sizeof(*item));
+
+ item->path = apr_pstrdup(server_error->pool,
+ svn_hash_gets(attrs, "path"));
+
+ SVN_ERR(parse_status_line(&item->http_status,
+ &item->http_reason,
+ status,
+ server_error->pool,
+ scratch_pool));
+
+ /* Do we have a mod_dav specific message? */
+ item->message = svn_hash_gets(attrs, "human-readable");
+
+ if (item->message)
+ {
+ if ((errcode = svn_hash_gets(attrs, "errcode")) != NULL)
+ {
+ apr_int64_t val;
+
+ SVN_ERR(svn_cstring_atoi64(&val, errcode));
+ item->apr_err = (apr_status_t)val;
+ }
+
+ item->message = apr_pstrdup(server_error->pool, item->message);
+ }
+ else
+ item->message = apr_pstrdup(server_error->pool,
+ svn_hash_gets(attrs, "description"));
+
+ APR_ARRAY_PUSH(server_error->items, error_item_t *) = item;
+ }
+ break;
+
+
+ case MS_PROPSTAT_STATUS:
+ svn_ra_serf__xml_note(xes, MS_PROPSTAT, "status", cdata->data);
+ break;
+ case MS_PROPSTAT_ERROR_HUMANREADABLE:
+ svn_ra_serf__xml_note(xes, MS_PROPSTAT, "human-readable", cdata->data);
+ errcode = svn_hash_gets(attrs, "errcode");
+ if (errcode)
+ svn_ra_serf__xml_note(xes, MS_PROPSTAT, "errcode", errcode);
+ break;
+ case MS_PROPSTAT_RESPONSEDESCRIPTION:
+ svn_ra_serf__xml_note(xes, MS_PROPSTAT, "description",
+ cdata->data);
+ break;
+
+ case MS_PROPSTAT:
+ if ((status = svn_hash__get_cstring(attrs, "status", NULL)) != NULL)
+ {
+ apr_hash_t *response_attrs;
+ error_item_t *item;
+
+ response_attrs = svn_ra_serf__xml_gather_since(xes, MS_RESPONSE);
+ item = apr_pcalloc(server_error->pool, sizeof(*item));
+
+ item->path = apr_pstrdup(server_error->pool,
+ svn_hash_gets(response_attrs, "path"));
+ item->propname = apr_pstrdup(server_error->pool,
+ svn_hash_gets(attrs, "propname"));
+
+ SVN_ERR(parse_status_line(&item->http_status,
+ &item->http_reason,
+ status,
+ server_error->pool,
+ scratch_pool));
+
+ /* Do we have a mod_dav specific message? */
+ item->message = svn_hash_gets(attrs, "human-readable");
+
+ if (item->message)
+ {
+ if ((errcode = svn_hash_gets(attrs, "errcode")) != NULL)
+ {
+ apr_int64_t val;
+
+ SVN_ERR(svn_cstring_atoi64(&val, errcode));
+ item->apr_err = (apr_status_t)val;
+ }
+
+ item->message = apr_pstrdup(server_error->pool, item->message);
+ }
+ else
+ item->message = apr_pstrdup(server_error->pool,
+ svn_hash_gets(attrs, "description"));
+
+
+ APR_ARRAY_PUSH(server_error->items, error_item_t *) = item;
+ }
+ break;
+
+ case M_ERROR_HUMANREADABLE:
+ svn_ra_serf__xml_note(xes, D_ERROR, "human-readable", cdata->data);
+ errcode = svn_hash_gets(attrs, "errcode");
+ if (errcode)
+ svn_ra_serf__xml_note(xes, D_ERROR, "errcode", errcode);
+ break;
+
+ case D_ERROR:
+ {
+ error_item_t *item;
+
+ item = apr_pcalloc(server_error->pool, sizeof(*item));
+
+ item->http_status = server_error->handler->sline.code;
+
+ /* Do we have a mod_dav specific message? */
+ item->message = svn_hash__get_cstring(attrs, "human-readable",
+ NULL);
+
+ if (item->message)
+ {
+ if ((errcode = svn_hash_gets(attrs, "errcode")) != NULL)
+ {
+ apr_int64_t val;
+
+ SVN_ERR(svn_cstring_atoi64(&val, errcode));
+ item->apr_err = (apr_status_t)val;
+ }
+
+ item->message = apr_pstrdup(server_error->pool, item->message);
+ }
+
+
+ APR_ARRAY_PUSH(server_error->items, error_item_t *) = item;
+ }
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__server_error_create(svn_ra_serf__handler_t *handler,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__server_error_t *server_error = handler->server_error;
+ svn_error_t *err = NULL;
+ int i;
+
+ for (i = 0; i < server_error->items->nelts; i++)
+ {
+ const error_item_t *item;
+ apr_status_t status;
+ const char *message;
+ svn_error_t *new_err;
+
+ item = APR_ARRAY_IDX(server_error->items, i, error_item_t *);
+
+ if (!item->apr_err && item->http_status == 200)
+ {
+ continue; /* Success code */
+ }
+ else if (!item->apr_err && item->http_status == 424 && item->propname)
+ {
+ continue; /* Failed because other PROPPATCH operations failed */
+ }
+
+ if (item->apr_err)
+ status = item->apr_err;
+ else
+ switch (item->http_status)
+ {
+ case 0:
+ continue; /* Not an error */
+ case 301:
+ case 302:
+ case 303:
+ case 307:
+ case 308:
+ status = SVN_ERR_RA_DAV_RELOCATED;
+ break;
+ case 403:
+ status = SVN_ERR_RA_DAV_FORBIDDEN;
+ break;
+ case 404:
+ status = SVN_ERR_FS_NOT_FOUND;
+ break;
+ case 409:
+ status = SVN_ERR_FS_CONFLICT;
+ break;
+ case 412:
+ status = SVN_ERR_RA_DAV_PRECONDITION_FAILED;
+ break;
+ case 423:
+ status = SVN_ERR_FS_NO_LOCK_TOKEN;
+ break;
+ case 500:
+ status = SVN_ERR_RA_DAV_REQUEST_FAILED;
+ break;
+ case 501:
+ status = SVN_ERR_UNSUPPORTED_FEATURE;
+ break;
+ default:
+ if (err)
+ status = err->apr_err; /* Just use previous */
+ else
+ status = SVN_ERR_RA_DAV_REQUEST_FAILED;
+ break;
+ }
+
+ if (item->message && *item->message)
+ {
+ svn_stringbuf_t *sb = svn_stringbuf_create(item->message,
+ scratch_pool);
+
+ svn_stringbuf_strip_whitespace(sb);
+ message = sb->data;
+ }
+ else if (item->propname)
+ {
+ message = apr_psprintf(scratch_pool,
+ _("Property operation on '%s' failed"),
+ item->propname);
+ }
+ else
+ {
+ /* Yuck: Older servers sometimes assume that we get convertable
+ apr error codes, while mod_dav_svn just produces a blank
+ text error, because err->message is NULL. */
+ serf_status_line sline;
+ svn_error_t *tmp_err;
+
+ memset(&sline, 0, sizeof(sline));
+ sline.code = item->http_status;
+ sline.reason = item->http_reason;
+
+ tmp_err = svn_ra_serf__error_on_status(sline, item->path, NULL);
+
+ message = (tmp_err && tmp_err->message)
+ ? apr_pstrdup(scratch_pool, tmp_err->message)
+ : _("<blank error>");
+ svn_error_clear(tmp_err);
+ }
+
+ SVN_ERR_ASSERT(status > 0);
+ new_err = svn_error_create(status, NULL, message);
+
+ if (item->propname)
+ new_err = svn_error_createf(new_err->apr_err, new_err,
+ _("While handling the '%s' property on '%s':"),
+ item->propname, item->path);
+ else if (item->path)
+ new_err = svn_error_createf(new_err->apr_err, new_err,
+ _("While handling the '%s' path:"),
+ item->path);
+
+ err = svn_error_compose_create(
+ err,
+ new_err);
+ }
+
+ /* Theoretically a 207 status can have a 'global' description without a
+ global STATUS that summarizes the final result of property/href
+ operations.
+
+ We should wrap that around the existing errors if there is one.
+
+ But currently I don't see how mod_dav ever sets that value */
+
+ if (!err)
+ {
+ /* We should fail.... but why... Who installed us? */
+ err = svn_error_trace(svn_ra_serf__unexpected_status(handler));
+ }
+
+ return err;
+}
+
+
+svn_error_t *
+svn_ra_serf__setup_error_parsing(svn_ra_serf__server_error_t **server_err,
+ svn_ra_serf__handler_t *handler,
+ svn_boolean_t expect_207_only,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__server_error_t *ms_baton;
+ svn_ra_serf__handler_t *tmp_handler;
+
+ int *expected_status = apr_pcalloc(result_pool,
+ 2 * sizeof(expected_status[0]));
+
+ expected_status[0] = handler->sline.code;
+
+ ms_baton = apr_pcalloc(result_pool, sizeof(*ms_baton));
+ ms_baton->pool = result_pool;
+
+ ms_baton->items = apr_array_make(result_pool, 4, sizeof(error_item_t *));
+ ms_baton->handler = handler;
+
+ ms_baton->xmlctx = svn_ra_serf__xml_context_create(multistatus_ttable,
+ multistatus_opened,
+ multistatus_closed,
+ NULL,
+ ms_baton,
+ ms_baton->pool);
+
+ tmp_handler = svn_ra_serf__create_expat_handler(handler->session,
+ ms_baton->xmlctx,
+ expected_status,
+ result_pool);
+
+ /* Ugly way to obtain expat_handler() */
+ tmp_handler->sline = handler->sline;
+ ms_baton->response_handler = tmp_handler->response_handler;
+ ms_baton->response_baton = tmp_handler->response_baton;
+
+ *server_err = ms_baton;
+ return SVN_NO_ERROR;
+}
+
+
+
+/* Implements svn_ra_serf__response_handler_t */
+svn_error_t *
+svn_ra_serf__handle_multistatus_only(serf_request_t *request,
+ serf_bucket_t *response,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__handler_t *handler = baton;
+
+ /* This function is just like expect_empty_body() except for the
+ XML parsing callbacks. We are looking for very limited pieces of
+ the multistatus response. */
+
+ /* We should see this just once, in order to initialize SERVER_ERROR.
+ At that point, the core error processing will take over. If we choose
+ not to parse an error, then we'll never return here (because we
+ change the response handler). */
+ SVN_ERR_ASSERT(handler->server_error == NULL);
+
+ {
+ serf_bucket_t *hdrs;
+ const char *val;
+
+ hdrs = serf_bucket_response_get_headers(response);
+ val = serf_bucket_headers_get(hdrs, "Content-Type");
+ if (val && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
+ {
+ svn_ra_serf__server_error_t *server_err;
+
+ SVN_ERR(svn_ra_serf__setup_error_parsing(&server_err,
+ handler,
+ TRUE,
+ handler->handler_pool,
+ handler->handler_pool));
+
+ handler->server_error = server_err;
+ }
+ else
+ {
+ /* The body was not text/xml, so we don't know what to do with it.
+ Toss anything that arrives. */
+ handler->discard_body = TRUE;
+ }
+ }
+
+ /* Returning SVN_NO_ERROR will return APR_SUCCESS to serf, which tells it
+ to call the response handler again. That will start up the XML parsing,
+ or it will be dropped on the floor (per the decision above). */
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__handle_server_error(svn_ra_serf__server_error_t *server_error,
+ svn_ra_serf__handler_t *handler,
+ serf_request_t *request,
+ serf_bucket_t *response,
+ apr_status_t *serf_status,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+
+ err = server_error->response_handler(request, response,
+ server_error->response_baton,
+ scratch_pool);
+ /* If we do not receive an error or it is a non-transient error, return
+ immediately.
+
+ APR_EOF will be returned when parsing is complete.
+
+ APR_EAGAIN & WAIT_CONN may be intermittently returned as we proceed through
+ parsing and the network has no more data right now. If we receive that,
+ clear the error and return - allowing serf to wait for more data.
+ */
+ if (!err || SERF_BUCKET_READ_ERROR(err->apr_err))
+ return svn_error_trace(err);
+
+ if (!APR_STATUS_IS_EOF(err->apr_err))
+ {
+ *serf_status = err->apr_err;
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+
+ /* Clear the EOF. We don't need it as subversion error. */
+ svn_error_clear(err);
+ *serf_status = APR_EOF;
+
+ /* On PROPPATCH we always get status 207, which may or may not imply an
+ error status, but let's keep it generic and just do the check for
+ any multistatus */
+ if (handler->sline.code == 207 /* MULTISTATUS */)
+ {
+ svn_boolean_t have_error = FALSE;
+ int i;
+
+ for (i = 0; i < server_error->items->nelts; i++)
+ {
+ const error_item_t *item;
+ item = APR_ARRAY_IDX(server_error->items, i, error_item_t *);
+
+ if (!item->apr_err && item->http_status == 200)
+ {
+ continue; /* Success code */
+ }
+
+ have_error = TRUE;
+ break;
+ }
+
+ if (! have_error)
+ handler->server_error = NULL; /* We didn't have a server error */
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/options.c b/subversion/libsvn_ra_serf/options.c
index 5389b04..a52977b 100644
--- a/subversion/libsvn_ra_serf/options.c
+++ b/subversion/libsvn_ra_serf/options.c
@@ -30,6 +30,7 @@
#include "svn_dirent_uri.h"
#include "svn_hash.h"
#include "svn_pools.h"
+#include "svn_path.h"
#include "svn_ra.h"
#include "svn_dav.h"
#include "svn_xml.h"
@@ -51,7 +52,7 @@
* This enum represents the current state of our XML parsing for an OPTIONS.
*/
enum options_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
OPTIONS,
ACTIVITY_COLLECTION,
HREF
@@ -65,7 +66,6 @@ typedef struct options_context_t {
svn_boolean_t headers_processed;
svn_ra_serf__session_t *session;
- svn_ra_serf__connection_t *conn;
svn_ra_serf__handler_t *handler;
svn_ra_serf__response_handler_t inner_handler;
@@ -112,19 +112,20 @@ options_closed(svn_ra_serf__xml_estate_t *xes,
return SVN_NO_ERROR;
}
-
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_options_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *body;
body = serf_bucket_aggregate_create(alloc);
svn_ra_serf__add_xml_header_buckets(body, alloc);
svn_ra_serf__add_open_tag_buckets(body, alloc, "D:options",
"xmlns:D", "DAV:",
- NULL);
+ SVN_VA_NULL);
svn_ra_serf__add_tag_buckets(body, "D:activity-collection-set", NULL, alloc);
svn_ra_serf__add_close_tag_buckets(body, alloc, "D:options");
@@ -372,7 +373,7 @@ options_response_handler(serf_request_t *request,
serf_bucket_headers_do(hdrs, capabilities_headers_iterator_callback,
opt_ctx);
- /* Assume mergeinfo capability unsupported, if didn't recieve information
+ /* Assume mergeinfo capability unsupported, if didn't receive information
about server or repository mergeinfo capability. */
if (!svn_hash_gets(session->capabilities, SVN_RA_CAPABILITY_MERGEINFO))
svn_hash_sets(session->capabilities, SVN_RA_CAPABILITY_MERGEINFO,
@@ -389,7 +390,6 @@ options_response_handler(serf_request_t *request,
static svn_error_t *
create_options_req(options_context_t **opt_ctx,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool)
{
options_context_t *new_ctx;
@@ -399,7 +399,6 @@ create_options_req(options_context_t **opt_ctx,
new_ctx = apr_pcalloc(pool, sizeof(*new_ctx));
new_ctx->pool = pool;
new_ctx->session = session;
- new_ctx->conn = conn;
new_ctx->youngest_rev = SVN_INVALID_REVNUM;
@@ -407,14 +406,12 @@ create_options_req(options_context_t **opt_ctx,
NULL, options_closed, NULL,
new_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool);
handler->method = "OPTIONS";
handler->path = session->session_url.path;
handler->body_delegate = create_options_body;
handler->body_type = "text/xml";
- handler->conn = conn;
- handler->session = session;
new_ctx->handler = handler;
@@ -431,22 +428,25 @@ create_options_req(options_context_t **opt_ctx,
svn_error_t *
svn_ra_serf__v2_get_youngest_revnum(svn_revnum_t *youngest,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
apr_pool_t *scratch_pool)
{
- svn_ra_serf__session_t *session = conn->session;
options_context_t *opt_ctx;
SVN_ERR_ASSERT(SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session));
- SVN_ERR(create_options_req(&opt_ctx, session, conn, scratch_pool));
+ SVN_ERR(create_options_req(&opt_ctx, session, scratch_pool));
SVN_ERR(svn_ra_serf__context_run_one(opt_ctx->handler, scratch_pool));
- SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline,
- opt_ctx->handler->path,
- opt_ctx->handler->location));
+
+ if (opt_ctx->handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(opt_ctx->handler));
+
+ if (! SVN_IS_VALID_REVNUM(opt_ctx->youngest_rev))
+ return svn_error_create(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED, NULL,
+ _("The OPTIONS response did not include "
+ "the youngest revision"));
*youngest = opt_ctx->youngest_rev;
- SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(*youngest));
return SVN_NO_ERROR;
}
@@ -454,21 +454,39 @@ svn_ra_serf__v2_get_youngest_revnum(svn_revnum_t *youngest,
svn_error_t *
svn_ra_serf__v1_get_activity_collection(const char **activity_url,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_ra_serf__session_t *session = conn->session;
options_context_t *opt_ctx;
SVN_ERR_ASSERT(!SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session));
- SVN_ERR(create_options_req(&opt_ctx, session, conn, scratch_pool));
+ if (session->activity_collection_url)
+ {
+ *activity_url = apr_pstrdup(result_pool,
+ session->activity_collection_url);
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(create_options_req(&opt_ctx, session, scratch_pool));
SVN_ERR(svn_ra_serf__context_run_one(opt_ctx->handler, scratch_pool));
- SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline,
- opt_ctx->handler->path,
- opt_ctx->handler->location));
+ if (opt_ctx->handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(opt_ctx->handler));
+
+ /* Cache the result. */
+ if (opt_ctx->activity_collection)
+ {
+ session->activity_collection_url =
+ apr_pstrdup(session->pool, opt_ctx->activity_collection);
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED, NULL,
+ _("The OPTIONS response did not include the "
+ "requested activity-collection-set value"));
+ }
*activity_url = apr_pstrdup(result_pool, opt_ctx->activity_collection);
@@ -483,15 +501,20 @@ svn_ra_serf__v1_get_activity_collection(const char **activity_url,
svn_error_t *
svn_ra_serf__exchange_capabilities(svn_ra_serf__session_t *serf_sess,
const char **corrected_url,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
options_context_t *opt_ctx;
- svn_error_t *err;
+
+ if (corrected_url)
+ *corrected_url = NULL;
/* This routine automatically fills in serf_sess->capabilities */
- SVN_ERR(create_options_req(&opt_ctx, serf_sess, serf_sess->conns[0], pool));
+ SVN_ERR(create_options_req(&opt_ctx, serf_sess, scratch_pool));
- err = svn_ra_serf__context_run_one(opt_ctx->handler, pool);
+ opt_ctx->handler->no_fail_on_http_redirect_status = TRUE;
+
+ SVN_ERR(svn_ra_serf__context_run_one(opt_ctx->handler, scratch_pool));
/* If our caller cares about server redirections, and our response
carries such a thing, report as much. We'll disregard ERR --
@@ -499,16 +522,47 @@ svn_ra_serf__exchange_capabilities(svn_ra_serf__session_t *serf_sess,
successfully parsing as XML or somesuch. */
if (corrected_url && (opt_ctx->handler->sline.code == 301))
{
- svn_error_clear(err);
- *corrected_url = opt_ctx->handler->location;
+ if (!opt_ctx->handler->location || !*opt_ctx->handler->location)
+ {
+ return svn_error_create(
+ SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS, NULL,
+ _("Location header not set on redirect response"));
+ }
+ else if (svn_path_is_url(opt_ctx->handler->location))
+ {
+ *corrected_url = svn_uri_canonicalize(opt_ctx->handler->location,
+ result_pool);
+ }
+ else
+ {
+ /* RFC1945 and RFC2616 state that the Location header's value
+ (from whence this CORRECTED_URL comes), if present, must be an
+ absolute URI. But some Apache versions (those older than 2.2.11,
+ it seems) transmit only the path portion of the URI.
+ See issue #3775 for details. */
+
+ apr_uri_t corrected_URI = serf_sess->session_url;
+
+ corrected_URI.path = (char *)corrected_url;
+ *corrected_url = svn_uri_canonicalize(
+ apr_uri_unparse(scratch_pool, &corrected_URI, 0),
+ result_pool);
+ }
+
return SVN_NO_ERROR;
}
+ else if (opt_ctx->handler->sline.code >= 300
+ && opt_ctx->handler->sline.code < 399)
+ {
+ return svn_error_createf(SVN_ERR_RA_SESSION_URL_MISMATCH, NULL,
+ (opt_ctx->handler->sline.code == 301
+ ? _("Repository moved permanently to '%s'")
+ : _("Repository moved temporarily to '%s'")),
+ opt_ctx->handler->location);
+ }
- SVN_ERR(svn_error_compose_create(
- svn_ra_serf__error_on_status(opt_ctx->handler->sline,
- serf_sess->session_url.path,
- opt_ctx->handler->location),
- err));
+ if (opt_ctx->handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(opt_ctx->handler));
/* Opportunistically cache any reported activity URL. (We don't
want to have to ask for this again later, potentially against an
@@ -522,12 +576,13 @@ svn_ra_serf__exchange_capabilities(svn_ra_serf__session_t *serf_sess,
return SVN_NO_ERROR;
}
-
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_simple_options_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
serf_bucket_t *body;
serf_bucket_t *s;
@@ -549,18 +604,16 @@ svn_ra_serf__probe_proxy(svn_ra_serf__session_t *serf_sess,
{
svn_ra_serf__handler_t *handler;
- handler = apr_pcalloc(scratch_pool, sizeof(*handler));
- handler->handler_pool = scratch_pool;
+ handler = svn_ra_serf__create_handler(serf_sess, scratch_pool);
handler->method = "OPTIONS";
handler->path = serf_sess->session_url.path;
- handler->conn = serf_sess->conns[0];
- handler->session = serf_sess;
/* We don't care about the response body, so discard it. */
handler->response_handler = svn_ra_serf__handle_discard_body;
/* We need a simple body, in order to send it in chunked format. */
handler->body_delegate = create_simple_options_body;
+ handler->no_fail_on_http_failure_status = TRUE;
/* No special headers. */
@@ -574,9 +627,8 @@ svn_ra_serf__probe_proxy(svn_ra_serf__session_t *serf_sess,
return SVN_NO_ERROR;
}
- SVN_ERR(svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location));
+ if (handler->sline.code != 200)
+ SVN_ERR(svn_ra_serf__unexpected_status(handler));
return SVN_NO_ERROR;
}
@@ -602,7 +654,7 @@ svn_ra_serf__has_capability(svn_ra_session_t *ra_session,
/* If any capability is unknown, they're all unknown, so ask. */
if (cap_result == NULL)
- SVN_ERR(svn_ra_serf__exchange_capabilities(serf_sess, NULL, pool));
+ SVN_ERR(svn_ra_serf__exchange_capabilities(serf_sess, NULL, pool, pool));
/* Try again, now that we've fetched the capabilities. */
cap_result = svn_hash_gets(serf_sess->capabilities, capability);
@@ -628,7 +680,9 @@ svn_ra_serf__has_capability(svn_ra_session_t *ra_session,
APR_ARRAY_PUSH(paths, const char *) = "";
err = svn_ra_serf__get_mergeinfo(ra_session, &ignored, paths, 0,
- FALSE, FALSE, pool);
+ svn_mergeinfo_explicit,
+ FALSE /* include_descendants */,
+ pool);
if (err)
{
@@ -646,7 +700,7 @@ svn_ra_serf__has_capability(svn_ra_session_t *ra_session,
cap_result = capability_yes;
}
else
- return err;
+ return svn_error_trace(err);
}
else
cap_result = capability_yes;
diff --git a/subversion/libsvn_ra_serf/property.c b/subversion/libsvn_ra_serf/property.c
index 586d38f..b7e0318 100644
--- a/subversion/libsvn_ra_serf/property.c
+++ b/subversion/libsvn_ra_serf/property.c
@@ -42,7 +42,7 @@
/* Our current parsing state we're in for the PROPFIND response. */
typedef enum prop_state_e {
- INITIAL = 0,
+ INITIAL = XML_STATE_INITIAL,
MULTISTATUS,
RESPONSE,
HREF,
@@ -59,20 +59,12 @@ typedef enum prop_state_e {
* This structure represents a pending PROPFIND response.
*/
typedef struct propfind_context_t {
- /* pool to issue allocations from */
- apr_pool_t *pool;
-
svn_ra_serf__handler_t *handler;
- /* associated serf session */
- svn_ra_serf__session_t *sess;
- svn_ra_serf__connection_t *conn;
-
/* the requested path */
const char *path;
- /* the requested version (number and string form) */
- svn_revnum_t rev;
+ /* the requested version (in string form) */
const char *label;
/* the request depth */
@@ -81,12 +73,8 @@ typedef struct propfind_context_t {
/* the list of requested properties */
const svn_ra_serf__dav_props_t *find_props;
- /* hash table that will be updated with the properties
- *
- * This can be shared between multiple propfind_context_t
- * structures
- */
- apr_hash_t *ret_props;
+ svn_ra_serf__prop_func_t prop_func;
+ void *prop_func_baton;
/* hash table containing all the properties associated with the
* "current" <propstat> tag. These will get copied into RET_PROPS
@@ -94,12 +82,6 @@ typedef struct propfind_context_t {
* "good"; otherwise, they'll get discarded.
*/
apr_hash_t *ps_props;
-
- /* If not-NULL, add us to this list when we're done. */
- svn_ra_serf__list_t **done_list;
-
- svn_ra_serf__list_t done_item;
-
} propfind_context_t;
@@ -136,10 +118,14 @@ static const svn_ra_serf__xml_transition_t propfind_ttable[] = {
{ 0 }
};
+static const int propfind_expected_status[] = {
+ 207,
+ 0
+};
/* Return the HTTP status code contained in STATUS_LINE, or 0 if
there's a problem parsing it. */
-static int parse_status_code(const char *status_line)
+static apr_int64_t parse_status_code(const char *status_line)
{
/* STATUS_LINE should be of form: "HTTP/1.1 200 OK" */
if (status_line[0] == 'H' &&
@@ -159,24 +145,6 @@ static int parse_status_code(const char *status_line)
return 0;
}
-
-/* Conforms to svn_ra_serf__path_rev_walker_t */
-static svn_error_t *
-copy_into_ret_props(void *baton,
- const char *path, apr_ssize_t path_len,
- const char *ns, apr_ssize_t ns_len,
- const char *name, apr_ssize_t name_len,
- const svn_string_t *val,
- apr_pool_t *pool)
-{
- propfind_context_t *ctx = baton;
-
- svn_ra_serf__set_ver_prop(ctx->ret_props, path, ctx->rev, ns, name,
- val, ctx->pool);
- return SVN_NO_ERROR;
-}
-
-
/* Conforms to svn_ra_serf__xml_opened_t */
static svn_error_t *
propfind_opened(svn_ra_serf__xml_estate_t *xes,
@@ -189,17 +157,40 @@ propfind_opened(svn_ra_serf__xml_estate_t *xes,
if (entered_state == PROPVAL)
{
- svn_ra_serf__xml_note(xes, PROPVAL, "ns", tag->namespace);
+ svn_ra_serf__xml_note(xes, PROPVAL, "ns", tag->xmlns);
svn_ra_serf__xml_note(xes, PROPVAL, "name", tag->name);
}
else if (entered_state == PROPSTAT)
{
- ctx->ps_props = apr_hash_make(ctx->pool);
+ ctx->ps_props = apr_hash_make(svn_ra_serf__xml_state_pool(xes));
}
return SVN_NO_ERROR;
}
+/* Set PROPS for NS:NAME VAL. Helper for propfind_closed */
+static void
+set_ns_prop(apr_hash_t *ns_props,
+ const char *ns, const char *name,
+ const svn_string_t *val, apr_pool_t *result_pool)
+{
+ apr_hash_t *props = svn_hash_gets(ns_props, ns);
+
+ if (!props)
+ {
+ props = apr_hash_make(result_pool);
+ ns = apr_pstrdup(result_pool, ns);
+ svn_hash_sets(ns_props, ns, props);
+ }
+
+ if (val)
+ {
+ name = apr_pstrdup(result_pool, name);
+ val = svn_string_dup(val, result_pool);
+ }
+
+ svn_hash_sets(props, name, val);
+}
/* Conforms to svn_ra_serf__xml_closed_t */
static svn_error_t *
@@ -218,17 +209,10 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
onto the "done list". External callers will then know this
request has been completed (tho stray response bytes may still
arrive). */
- if (ctx->done_list)
- {
- ctx->done_item.data = ctx->handler;
- ctx->done_item.next = *ctx->done_list;
- *ctx->done_list = &ctx->done_item;
- }
}
else if (leaving_state == HREF)
{
const char *path;
- const svn_string_t *val_str;
if (strcmp(ctx->depth, "1") == 0)
path = svn_urlpath__canonicalize(cdata->data, scratch_pool);
@@ -237,11 +221,10 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
svn_ra_serf__xml_note(xes, RESPONSE, "path", path);
- /* Copy the value into the right pool, then save the HREF. */
- val_str = svn_string_dup(cdata, ctx->pool);
- svn_ra_serf__set_ver_prop(ctx->ret_props,
- path, ctx->rev, D_, "href", val_str,
- ctx->pool);
+ SVN_ERR(ctx->prop_func(ctx->prop_func_baton,
+ path,
+ D_, "href",
+ cdata, scratch_pool));
}
else if (leaving_state == COLLECTION)
{
@@ -257,21 +240,23 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
that we wish to ignore. (Typically, if it's not a 200, the
status will be 404 to indicate that a property we
specifically requested from the server doesn't exist.) */
- int status = parse_status_code(cdata->data);
+ apr_int64_t status = parse_status_code(cdata->data);
if (status != 200)
svn_ra_serf__xml_note(xes, PROPSTAT, "ignore-prop", "*");
}
else if (leaving_state == PROPVAL)
{
- const char *encoding = svn_hash_gets(attrs, "V:encoding");
+ const char *encoding;
const svn_string_t *val_str;
- apr_hash_t *gathered;
- const char *path;
const char *ns;
const char *name;
const char *altvalue;
- if (encoding)
+ if ((altvalue = svn_hash_gets(attrs, "altvalue")) != NULL)
+ {
+ val_str = svn_string_create(altvalue, scratch_pool);
+ }
+ else if ((encoding = svn_hash_gets(attrs, "V:encoding")) != NULL)
{
if (strcmp(encoding, "base64") != 0)
return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA,
@@ -280,17 +265,15 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
encoding);
/* Decode into the right pool. */
- val_str = svn_base64_decode_string(cdata, ctx->pool);
+ val_str = svn_base64_decode_string(cdata, scratch_pool);
}
else
{
/* Copy into the right pool. */
- val_str = svn_string_dup(cdata, ctx->pool);
+ val_str = cdata;
}
- /* The current path sits on the RESPONSE state. Gather up all the
- state from this PROPVAL to the (grandparent) RESPONSE state,
- and grab the path from there.
+ /* The current path sits on the RESPONSE state.
Now, it would be nice if we could, at this point, know that
the status code for this property indicated a problem -- then
@@ -300,24 +283,12 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
here, setting the property and value as expected. Once we
know for sure the status code associate with the property,
we'll decide its fate. */
- gathered = svn_ra_serf__xml_gather_since(xes, RESPONSE);
-
- /* These will be dup'd into CTX->POOL, as necessary. */
- path = svn_hash_gets(gathered, "path");
- if (path == NULL)
- path = ctx->path;
ns = svn_hash_gets(attrs, "ns");
- name = apr_pstrdup(ctx->pool,
- svn_hash_gets(attrs, "name"));
-
- altvalue = svn_hash_gets(attrs, "altvalue");
- if (altvalue != NULL)
- val_str = svn_string_create(altvalue, ctx->pool);
+ name = svn_hash_gets(attrs, "name");
- svn_ra_serf__set_ver_prop(ctx->ps_props,
- path, ctx->rev, ns, name, val_str,
- ctx->pool);
+ set_ns_prop(ctx->ps_props, ns, name, val_str,
+ apr_hash_pool_get(ctx->ps_props));
}
else
{
@@ -325,146 +296,60 @@ propfind_closed(svn_ra_serf__xml_estate_t *xes,
SVN_ERR_ASSERT(leaving_state == PROPSTAT);
- gathered = svn_ra_serf__xml_gather_since(xes, PROPSTAT);
+ gathered = svn_ra_serf__xml_gather_since(xes, RESPONSE);
/* If we've squirreled away a note that says we want to ignore
these properties, we'll do so. Otherwise, we need to copy
them from the temporary hash into the ctx->ret_props hash. */
if (! svn_hash_gets(gathered, "ignore-prop"))
{
- SVN_ERR(svn_ra_serf__walk_all_paths(ctx->ps_props, ctx->rev,
- copy_into_ret_props, ctx,
- scratch_pool));
- }
+ apr_hash_index_t *hi_ns;
+ const char *path;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- ctx->ps_props = NULL;
- }
-
- return SVN_NO_ERROR;
-}
+ path = svn_hash_gets(gathered, "path");
+ if (!path)
+ path = ctx->path;
-const svn_string_t *
-svn_ra_serf__get_ver_prop_string(apr_hash_t *props,
- const char *path,
- svn_revnum_t rev,
- const char *ns,
- const char *name)
-{
- apr_hash_t *ver_props, *path_props, *ns_props;
- void *val = NULL;
-
- ver_props = apr_hash_get(props, &rev, sizeof(rev));
- if (ver_props)
- {
- path_props = svn_hash_gets(ver_props, path);
-
- if (path_props)
- {
- ns_props = svn_hash_gets(path_props, ns);
- if (ns_props)
+ for (hi_ns = apr_hash_first(scratch_pool, ctx->ps_props);
+ hi_ns;
+ hi_ns = apr_hash_next(hi_ns))
{
- val = svn_hash_gets(ns_props, name);
+ const char *ns = apr_hash_this_key(hi_ns);
+ apr_hash_t *props = apr_hash_this_val(hi_ns);
+ apr_hash_index_t *hi_prop;
+
+ svn_pool_clear(iterpool);
+
+ for (hi_prop = apr_hash_first(iterpool, props);
+ hi_prop;
+ hi_prop = apr_hash_next(hi_prop))
+ {
+ const char *name = apr_hash_this_key(hi_prop);
+ const svn_string_t *value = apr_hash_this_val(hi_prop);
+
+ SVN_ERR(ctx->prop_func(ctx->prop_func_baton, path,
+ ns, name, value, iterpool));
+ }
}
- }
- }
-
- return val;
-}
-
-const char *
-svn_ra_serf__get_ver_prop(apr_hash_t *props,
- const char *path,
- svn_revnum_t rev,
- const char *ns,
- const char *name)
-{
- const svn_string_t *val;
- val = svn_ra_serf__get_ver_prop_string(props, path, rev, ns, name);
-
- if (val)
- {
- return val->data;
- }
-
- return NULL;
-}
-
-const svn_string_t *
-svn_ra_serf__get_prop_string(apr_hash_t *props,
- const char *path,
- const char *ns,
- const char *name)
-{
- return svn_ra_serf__get_ver_prop_string(props, path, SVN_INVALID_REVNUM,
- ns, name);
-}
-
-const char *
-svn_ra_serf__get_prop(apr_hash_t *props,
- const char *path,
- const char *ns,
- const char *name)
-{
- return svn_ra_serf__get_ver_prop(props, path, SVN_INVALID_REVNUM, ns, name);
-}
-
-void
-svn_ra_serf__set_ver_prop(apr_hash_t *props,
- const char *path, svn_revnum_t rev,
- const char *ns, const char *name,
- const svn_string_t *val, apr_pool_t *pool)
-{
- apr_hash_t *ver_props, *path_props, *ns_props;
-
- ver_props = apr_hash_get(props, &rev, sizeof(rev));
- if (!ver_props)
- {
- ver_props = apr_hash_make(pool);
- apr_hash_set(props, apr_pmemdup(pool, &rev, sizeof(rev)), sizeof(rev),
- ver_props);
- }
-
- path_props = svn_hash_gets(ver_props, path);
-
- if (!path_props)
- {
- path_props = apr_hash_make(pool);
- path = apr_pstrdup(pool, path);
- svn_hash_sets(ver_props, path, path_props);
-
- /* todo: we know that we'll fail the next check, but fall through
- * for now for simplicity's sake.
- */
- }
+ svn_pool_destroy(iterpool);
+ }
- ns_props = svn_hash_gets(path_props, ns);
- if (!ns_props)
- {
- ns_props = apr_hash_make(pool);
- ns = apr_pstrdup(pool, ns);
- svn_hash_sets(path_props, ns, ns_props);
+ ctx->ps_props = NULL; /* Allocated in PROPSTAT state pool */
}
- svn_hash_sets(ns_props, name, val);
+ return SVN_NO_ERROR;
}
-void
-svn_ra_serf__set_prop(apr_hash_t *props,
- const char *path,
- const char *ns, const char *name,
- const svn_string_t *val, apr_pool_t *pool)
-{
- svn_ra_serf__set_ver_prop(props, path, SVN_INVALID_REVNUM, ns, name,
- val, pool);
-}
static svn_error_t *
setup_propfind_headers(serf_bucket_t *headers,
- void *setup_baton,
- apr_pool_t *pool)
+ void *setup_baton,
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
propfind_context_t *ctx = setup_baton;
@@ -480,11 +365,13 @@ setup_propfind_headers(serf_bucket_t *headers,
#define PROPFIND_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><propfind xmlns=\"DAV:\">"
#define PROPFIND_TRAILER "</propfind>"
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_propfind_body(serf_bucket_t **bkt,
void *setup_baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
propfind_context_t *ctx = setup_baton;
@@ -495,7 +382,7 @@ create_propfind_body(serf_bucket_t **bkt,
body_bkt = serf_bucket_aggregate_create(alloc);
prop = ctx->find_props;
- while (prop && prop->namespace)
+ while (prop && prop->xmlns)
{
/* special case the allprop case. */
if (strcmp(prop->name, "allprop") == 0)
@@ -515,7 +402,7 @@ create_propfind_body(serf_bucket_t **bkt,
alloc);
serf_bucket_aggregate_append(body_bkt, tmp);
- tmp = SERF_BUCKET_SIMPLE_STRING(prop->namespace, alloc);
+ tmp = SERF_BUCKET_SIMPLE_STRING(prop->xmlns, alloc);
serf_bucket_aggregate_append(body_bkt, tmp);
tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"/>", sizeof("\"/>")-1,
@@ -559,16 +446,15 @@ create_propfind_body(serf_bucket_t **bkt,
svn_error_t *
-svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
- apr_hash_t *ret_props,
- svn_ra_serf__session_t *sess,
- svn_ra_serf__connection_t *conn,
- const char *path,
- svn_revnum_t rev,
- const char *depth,
- const svn_ra_serf__dav_props_t *find_props,
- svn_ra_serf__list_t **done_list,
- apr_pool_t *pool)
+svn_ra_serf__create_propfind_handler(svn_ra_serf__handler_t **propfind_handler,
+ svn_ra_serf__session_t *sess,
+ const char *path,
+ svn_revnum_t rev,
+ const char *depth,
+ const svn_ra_serf__dav_props_t *find_props,
+ svn_ra_serf__prop_func_t prop_func,
+ void *prop_func_baton,
+ apr_pool_t *pool)
{
propfind_context_t *new_prop_ctx;
svn_ra_serf__handler_t *handler;
@@ -576,15 +462,11 @@ svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
new_prop_ctx = apr_pcalloc(pool, sizeof(*new_prop_ctx));
- new_prop_ctx->pool = apr_hash_pool_get(ret_props);
new_prop_ctx->path = path;
new_prop_ctx->find_props = find_props;
- new_prop_ctx->ret_props = ret_props;
+ new_prop_ctx->prop_func = prop_func;
+ new_prop_ctx->prop_func_baton = prop_func_baton;
new_prop_ctx->depth = depth;
- new_prop_ctx->sess = sess;
- new_prop_ctx->conn = conn;
- new_prop_ctx->rev = rev;
- new_prop_ctx->done_list = done_list;
if (SVN_IS_VALID_REVNUM(rev))
{
@@ -601,7 +483,9 @@ svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
NULL,
new_prop_ctx,
pool);
- handler = svn_ra_serf__create_expat_handler(xmlctx, pool);
+ handler = svn_ra_serf__create_expat_handler(sess, xmlctx,
+ propfind_expected_status,
+ pool);
handler->method = "PROPFIND";
handler->path = path;
@@ -611,8 +495,7 @@ svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
handler->header_delegate = setup_propfind_headers;
handler->header_delegate_baton = new_prop_ctx;
- handler->session = new_prop_ctx->sess;
- handler->conn = new_prop_ctx->conn;
+ handler->no_dav_headers = TRUE;
new_prop_ctx->handler = handler;
@@ -621,208 +504,85 @@ svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
return SVN_NO_ERROR;
}
-
-/*
- * This helper function will block until the PROP_CTX indicates that is done
- * or another error is returned.
- */
svn_error_t *
-svn_ra_serf__wait_for_props(svn_ra_serf__handler_t *handler,
- apr_pool_t *scratch_pool)
+svn_ra_serf__deliver_svn_props(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
{
- svn_error_t *err;
- svn_error_t *err2;
+ apr_hash_t *props = baton;
+ apr_pool_t *result_pool = apr_hash_pool_get(props);
+ const char *prop_name;
- err = svn_ra_serf__context_run_one(handler, scratch_pool);
+ prop_name = svn_ra_serf__svnname_from_wirename(ns, name, result_pool);
+ if (prop_name == NULL)
+ return SVN_NO_ERROR;
- err2 = svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location);
+ svn_hash_sets(props, prop_name, svn_string_dup(value, result_pool));
- return svn_error_compose_create(err2, err);
+ return SVN_NO_ERROR;
}
/*
- * This is a blocking version of deliver_props.
+ * Implementation of svn_ra_serf__prop_func_t that delivers all DAV properties
+ * in (const char * -> apr_hash_t *) on Namespace pointing to a second hash
+ * (const char * -> svn_string_t *) to the values.
*/
-svn_error_t *
-svn_ra_serf__retrieve_props(apr_hash_t **results,
- svn_ra_serf__session_t *sess,
- svn_ra_serf__connection_t *conn,
- const char *url,
- svn_revnum_t rev,
- const char *depth,
- const svn_ra_serf__dav_props_t *props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+deliver_node_props(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
{
- svn_ra_serf__handler_t *handler;
+ apr_hash_t *nss = baton;
+ apr_hash_t *props;
+ apr_pool_t *result_pool = apr_hash_pool_get(nss);
- *results = apr_hash_make(result_pool);
+ props = svn_hash_gets(nss, ns);
- SVN_ERR(svn_ra_serf__deliver_props(&handler, *results, sess, conn, url,
- rev, depth, props, NULL, result_pool));
- SVN_ERR(svn_ra_serf__wait_for_props(handler, scratch_pool));
+ if (!props)
+ {
+ props = apr_hash_make(result_pool);
+
+ ns = apr_pstrdup(result_pool, ns);
+ svn_hash_sets(nss, ns, props);
+ }
+
+ name = apr_pstrdup(result_pool, name);
+ svn_hash_sets(props, name, svn_string_dup(value, result_pool));
return SVN_NO_ERROR;
}
-
svn_error_t *
svn_ra_serf__fetch_node_props(apr_hash_t **results,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *url,
svn_revnum_t revision,
const svn_ra_serf__dav_props_t *which_props,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- apr_hash_t *multiprops;
- apr_hash_t *ver_props;
-
- /* Note: a couple extra hash tables and whatnot get into RESULT_POOL.
- Not a big deal at this point. Theoretically, we could fetch all
- props into SCRATCH_POOL, then copy just the REVISION/URL props
- into RESULT_POOL. Too much work for too little gain... */
- SVN_ERR(svn_ra_serf__retrieve_props(&multiprops, conn->session, conn,
- url, revision, "0", which_props,
- result_pool, scratch_pool));
-
- ver_props = apr_hash_get(multiprops, &revision, sizeof(revision));
- if (ver_props != NULL)
- {
- *results = svn_hash_gets(ver_props, url);
- if (*results != NULL)
- return SVN_NO_ERROR;
- }
-
- return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
- _("The PROPFIND response did not include "
- "the requested properties"));
-}
-
-
-svn_error_t *
-svn_ra_serf__walk_node_props(apr_hash_t *props,
- svn_ra_serf__walker_visitor_t walker,
- void *baton,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool;
- apr_hash_index_t *ns_hi;
-
- iterpool = svn_pool_create(scratch_pool);
- for (ns_hi = apr_hash_first(scratch_pool, props); ns_hi;
- ns_hi = apr_hash_next(ns_hi))
- {
- void *ns_val;
- const void *ns_name;
- apr_hash_index_t *name_hi;
-
- /* NOTE: We do not clear ITERPOOL in this loop. Generally, there are
- very few namespaces, so this loop will not have many iterations.
- Instead, ITERPOOL is used for the inner loop. */
-
- apr_hash_this(ns_hi, &ns_name, NULL, &ns_val);
-
- for (name_hi = apr_hash_first(scratch_pool, ns_val); name_hi;
- name_hi = apr_hash_next(name_hi))
- {
- void *prop_val;
- const void *prop_name;
-
- /* See note above, regarding clearing of this pool. */
- svn_pool_clear(iterpool);
-
- apr_hash_this(name_hi, &prop_name, NULL, &prop_val);
-
- SVN_ERR(walker(baton, ns_name, prop_name, prop_val, iterpool));
- }
- }
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_ra_serf__walk_all_props(apr_hash_t *props,
- const char *name,
- svn_revnum_t rev,
- svn_ra_serf__walker_visitor_t walker,
- void *baton,
- apr_pool_t *scratch_pool)
-{
- apr_hash_t *ver_props;
- apr_hash_t *path_props;
-
- ver_props = apr_hash_get(props, &rev, sizeof(rev));
- if (!ver_props)
- return SVN_NO_ERROR;
-
- path_props = svn_hash_gets(ver_props, name);
- if (!path_props)
- return SVN_NO_ERROR;
-
- return svn_error_trace(svn_ra_serf__walk_node_props(path_props,
- walker, baton,
- scratch_pool));
-}
-
-
-svn_error_t *
-svn_ra_serf__walk_all_paths(apr_hash_t *props,
- svn_revnum_t rev,
- svn_ra_serf__path_rev_walker_t walker,
- void *baton,
- apr_pool_t *pool)
-{
- apr_hash_index_t *path_hi;
- apr_hash_t *ver_props;
+ apr_hash_t *props;
+ svn_ra_serf__handler_t *handler;
- ver_props = apr_hash_get(props, &rev, sizeof(rev));
+ props = apr_hash_make(result_pool);
- if (!ver_props)
- {
- return SVN_NO_ERROR;
- }
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&handler, session,
+ url, revision, "0", which_props,
+ deliver_node_props,
+ props, scratch_pool));
- for (path_hi = apr_hash_first(pool, ver_props); path_hi;
- path_hi = apr_hash_next(path_hi))
- {
- void *path_props;
- const void *path_name;
- apr_ssize_t path_len;
- apr_hash_index_t *ns_hi;
-
- apr_hash_this(path_hi, &path_name, &path_len, &path_props);
- for (ns_hi = apr_hash_first(pool, path_props); ns_hi;
- ns_hi = apr_hash_next(ns_hi))
- {
- void *ns_val;
- const void *ns_name;
- apr_ssize_t ns_len;
- apr_hash_index_t *name_hi;
- apr_hash_this(ns_hi, &ns_name, &ns_len, &ns_val);
- for (name_hi = apr_hash_first(pool, ns_val); name_hi;
- name_hi = apr_hash_next(name_hi))
- {
- void *prop_val;
- const void *prop_name;
- apr_ssize_t prop_len;
-
- apr_hash_this(name_hi, &prop_name, &prop_len, &prop_val);
- /* use a subpool? */
- SVN_ERR(walker(baton, path_name, path_len, ns_name, ns_len,
- prop_name, prop_len, prop_val, pool));
- }
- }
- }
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
+ *results = props;
return SVN_NO_ERROR;
}
-
const char *
svn_ra_serf__svnname_from_wirename(const char *ns,
const char *name,
@@ -832,10 +592,10 @@ svn_ra_serf__svnname_from_wirename(const char *ns,
return apr_pstrdup(result_pool, name);
if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
- return apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, (char *)NULL);
+ return apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, SVN_VA_NULL);
if (strcmp(ns, SVN_PROP_PREFIX) == 0)
- return apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, (char *)NULL);
+ return apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, SVN_VA_NULL);
if (strcmp(name, SVN_DAV__VERSION_NAME) == 0)
return SVN_PROP_ENTRY_COMMITTED_REV;
@@ -863,99 +623,9 @@ svn_ra_serf__svnname_from_wirename(const char *ns,
}
/* An unknown namespace, must be a custom property. */
- return apr_pstrcat(result_pool, ns, name, (char *)NULL);
+ return apr_pstrcat(result_pool, ns, name, SVN_VA_NULL);
}
-
-/* Conforms to svn_ra_serf__walker_visitor_t */
-static svn_error_t *
-set_flat_props(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool)
-{
- apr_hash_t *props = baton;
- apr_pool_t *result_pool = apr_hash_pool_get(props);
- const char *prop_name;
-
- /* ### is VAL in the proper pool? */
-
- prop_name = svn_ra_serf__svnname_from_wirename(ns, name, result_pool);
- if (prop_name != NULL)
- svn_hash_sets(props, prop_name, value);
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_ra_serf__flatten_props(apr_hash_t **flat_props,
- apr_hash_t *props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- *flat_props = apr_hash_make(result_pool);
-
- return svn_error_trace(svn_ra_serf__walk_node_props(
- props,
- set_flat_props,
- *flat_props /* baton */,
- scratch_pool));
-}
-
-
-static svn_error_t *
-select_revprops(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- apr_hash_t *revprops = baton;
- apr_pool_t *result_pool = apr_hash_pool_get(revprops);
- const char *prop_name;
-
- /* ### copy NAME into the RESULT_POOL? */
- /* ### copy VAL into the RESULT_POOL? */
-
- if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
- prop_name = name;
- else if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
- prop_name = apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, (char *)NULL);
- else if (strcmp(ns, SVN_PROP_PREFIX) == 0)
- prop_name = apr_pstrcat(result_pool, SVN_PROP_PREFIX, name, (char *)NULL);
- else if (strcmp(ns, "") == 0)
- prop_name = name;
- else
- {
- /* do nothing for now? */
- return SVN_NO_ERROR;
- }
-
- svn_hash_sets(revprops, prop_name, val);
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_ra_serf__select_revprops(apr_hash_t **revprops,
- const char *name,
- svn_revnum_t rev,
- apr_hash_t *all_revprops,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- *revprops = apr_hash_make(result_pool);
-
- return svn_error_trace(svn_ra_serf__walk_all_props(
- all_revprops, name, rev,
- select_revprops, *revprops,
- scratch_pool));
-}
-
-
/*
* Contact the server (using CONN) to calculate baseline
* information for BASELINE_URL at REVISION (which may be
@@ -969,7 +639,7 @@ svn_ra_serf__select_revprops(apr_hash_t **revprops,
static svn_error_t *
retrieve_baseline_info(svn_revnum_t *actual_revision,
const char **basecoll_url_p,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *baseline_url,
svn_revnum_t revision,
apr_pool_t *result_pool,
@@ -979,7 +649,7 @@ retrieve_baseline_info(svn_revnum_t *actual_revision,
apr_hash_t *dav_props;
const char *basecoll_url;
- SVN_ERR(svn_ra_serf__fetch_node_props(&props, conn,
+ SVN_ERR(svn_ra_serf__fetch_node_props(&props, session,
baseline_url, revision,
baseline_props,
scratch_pool, scratch_pool));
@@ -1000,12 +670,18 @@ retrieve_baseline_info(svn_revnum_t *actual_revision,
const char *version_name;
version_name = svn_prop_get_value(dav_props, SVN_DAV__VERSION_NAME);
- if (!version_name)
+ if (version_name)
+ {
+ apr_int64_t rev;
+
+ SVN_ERR(svn_cstring_atoi64(&rev, version_name));
+ *actual_revision = (svn_revnum_t)rev;
+ }
+
+ if (!version_name || !SVN_IS_VALID_REVNUM(*actual_revision))
return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
_("The PROPFIND response did not include "
"the requested version-name value"));
-
- *actual_revision = SVN_STR_TO_REV(version_name);
}
return SVN_NO_ERROR;
@@ -1023,7 +699,7 @@ retrieve_baseline_info(svn_revnum_t *actual_revision,
static svn_error_t *
v1_get_youngest_revnum(svn_revnum_t *youngest,
const char **basecoll_url,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *vcc_url,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
@@ -1033,7 +709,7 @@ v1_get_youngest_revnum(svn_revnum_t *youngest,
/* Fetching DAV:checked-in from the VCC (with no Label: to specify a
revision) will return the latest Baseline resource's URL. */
- SVN_ERR(svn_ra_serf__fetch_dav_prop(&baseline_url, conn, vcc_url,
+ SVN_ERR(svn_ra_serf__fetch_dav_prop(&baseline_url, session, vcc_url,
SVN_INVALID_REVNUM,
"checked-in",
scratch_pool, scratch_pool));
@@ -1052,15 +728,15 @@ v1_get_youngest_revnum(svn_revnum_t *youngest,
/* First check baseline information cache. */
SVN_ERR(svn_ra_serf__blncache_get_baseline_info(&bc_url,
youngest,
- conn->session->blncache,
+ session->blncache,
baseline_url,
scratch_pool));
if (!bc_url)
{
- SVN_ERR(retrieve_baseline_info(youngest, &bc_url, conn,
+ SVN_ERR(retrieve_baseline_info(youngest, &bc_url, session,
baseline_url, SVN_INVALID_REVNUM,
scratch_pool, scratch_pool));
- SVN_ERR(svn_ra_serf__blncache_set(conn->session->blncache,
+ SVN_ERR(svn_ra_serf__blncache_set(session->blncache,
baseline_url, *youngest,
bc_url, scratch_pool));
}
@@ -1081,12 +757,12 @@ svn_ra_serf__get_youngest_revnum(svn_revnum_t *youngest,
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
return svn_error_trace(svn_ra_serf__v2_get_youngest_revnum(
- youngest, session->conns[0], scratch_pool));
+ youngest, session, scratch_pool));
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, scratch_pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, scratch_pool));
return svn_error_trace(v1_get_youngest_revnum(youngest, NULL,
- session->conns[0], vcc_url,
+ session, vcc_url,
scratch_pool, scratch_pool));
}
@@ -1103,9 +779,9 @@ static svn_error_t *
get_baseline_info(const char **bc_url,
svn_revnum_t *revnum_used,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
svn_revnum_t revision,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
/* If we detected HTTP v2 support on the server, we can construct
the baseline collection URL ourselves, and fetch the latest
@@ -1119,14 +795,10 @@ get_baseline_info(const char **bc_url,
else
{
SVN_ERR(svn_ra_serf__v2_get_youngest_revnum(
- revnum_used, conn, pool));
- if (! SVN_IS_VALID_REVNUM(*revnum_used))
- return svn_error_create(SVN_ERR_RA_DAV_OPTIONS_REQ_FAILED, NULL,
- _("The OPTIONS response did not include "
- "the youngest revision"));
+ revnum_used, session, scratch_pool));
}
- *bc_url = apr_psprintf(pool, "%s/%ld",
+ *bc_url = apr_psprintf(result_pool, "%s/%ld",
session->rev_root_stub, *revnum_used);
}
@@ -1135,20 +807,22 @@ get_baseline_info(const char **bc_url,
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, conn, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, scratch_pool));
if (SVN_IS_VALID_REVNUM(revision))
{
/* First check baseline information cache. */
SVN_ERR(svn_ra_serf__blncache_get_bc_url(bc_url,
session->blncache,
- revision, pool));
+ revision, result_pool));
if (!*bc_url)
{
- SVN_ERR(retrieve_baseline_info(NULL, bc_url, conn,
- vcc_url, revision, pool, pool));
+ SVN_ERR(retrieve_baseline_info(NULL, bc_url, session,
+ vcc_url, revision,
+ result_pool, scratch_pool));
SVN_ERR(svn_ra_serf__blncache_set(session->blncache, NULL,
- revision, *bc_url, pool));
+ revision, *bc_url,
+ scratch_pool));
}
*revnum_used = revision;
@@ -1156,8 +830,8 @@ get_baseline_info(const char **bc_url,
else
{
SVN_ERR(v1_get_youngest_revnum(revnum_used, bc_url,
- conn, vcc_url,
- pool, pool));
+ session, vcc_url,
+ result_pool, scratch_pool));
}
}
@@ -1169,7 +843,6 @@ svn_error_t *
svn_ra_serf__get_stable_url(const char **stable_url,
svn_revnum_t *latest_revnum,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
const char *url,
svn_revnum_t revision,
apr_pool_t *result_pool,
@@ -1183,15 +856,10 @@ svn_ra_serf__get_stable_url(const char **stable_url,
if (! url)
url = session->session_url.path;
- /* If the caller didn't provide a specific connection for us to use,
- we'll use the default connection. */
- if (! conn)
- conn = session->conns[0];
-
SVN_ERR(get_baseline_info(&basecoll_url, &revnum_used,
- session, conn, revision, scratch_pool));
+ session, revision, scratch_pool, scratch_pool));
SVN_ERR(svn_ra_serf__get_relative_path(&repos_relpath, url,
- session, conn, scratch_pool));
+ session, scratch_pool));
*stable_url = svn_path_url_add_component2(basecoll_url, repos_relpath,
result_pool);
@@ -1203,38 +871,8 @@ svn_ra_serf__get_stable_url(const char **stable_url,
svn_error_t *
-svn_ra_serf__get_resource_type(svn_node_kind_t *kind,
- apr_hash_t *props)
-{
- apr_hash_t *dav_props;
- const char *res_type;
-
- dav_props = apr_hash_get(props, "DAV:", 4);
- res_type = svn_prop_get_value(dav_props, "resourcetype");
- if (!res_type)
- {
- /* How did this happen? */
- return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
- _("The PROPFIND response did not include the "
- "requested resourcetype value"));
- }
-
- if (strcmp(res_type, "collection") == 0)
- {
- *kind = svn_node_dir;
- }
- else
- {
- *kind = svn_node_file;
- }
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
svn_ra_serf__fetch_dav_prop(const char **value,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *url,
svn_revnum_t revision,
const char *propname,
@@ -1244,7 +882,7 @@ svn_ra_serf__fetch_dav_prop(const char **value,
apr_hash_t *props;
apr_hash_t *dav_props;
- SVN_ERR(svn_ra_serf__fetch_node_props(&props, conn, url, revision,
+ SVN_ERR(svn_ra_serf__fetch_node_props(&props, session, url, revision,
checked_in_props,
scratch_pool, scratch_pool));
dav_props = apr_hash_get(props, "DAV:", 4);
@@ -1261,3 +899,19 @@ svn_ra_serf__fetch_dav_prop(const char **value,
return SVN_NO_ERROR;
}
+
+/* Removes all non regular properties from PROPS */
+void
+svn_ra_serf__keep_only_regular_props(apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(scratch_pool, props); hi; hi = apr_hash_next(hi))
+ {
+ const char *propname = apr_hash_this_key(hi);
+
+ if (svn_property_kind2(propname) != svn_prop_regular_kind)
+ svn_hash_sets(props, propname, NULL);
+ }
+}
diff --git a/subversion/libsvn_ra_serf/ra_serf.h b/subversion/libsvn_ra_serf/ra_serf.h
index 335a9e3..fcef737 100644
--- a/subversion/libsvn_ra_serf/ra_serf.h
+++ b/subversion/libsvn_ra_serf/ra_serf.h
@@ -54,9 +54,6 @@ extern "C" {
#error Please update your version of serf to at least 1.2.1.
#endif
-/** Use this to silence compiler warnings about unused parameters. */
-#define UNUSED_CTX(x) ((void)(x))
-
/** Wait duration (in microseconds) used in calls to serf_context_run() */
#define SVN_RA_SERF__CONTEXT_RUN_DURATION 500000
@@ -99,10 +96,13 @@ typedef struct svn_ra_serf__connection_t {
* The master serf RA session.
*
* This is stored in the ra session ->priv field.
+ *
+ * ### Check ra_serf_dup_session when adding fields.
*/
struct svn_ra_serf__session_t {
/* Pool for allocations during this session */
apr_pool_t *pool;
+ apr_hash_t *config; /* For duplicating */
/* The current context */
serf_context_t *context;
@@ -154,6 +154,7 @@ struct svn_ra_serf__session_t {
/* Callback functions to get info from WC */
const svn_ra_callbacks2_t *wc_callbacks;
void *wc_callback_baton;
+ svn_auth_baton_t *auth_baton;
/* Callback function to send progress info to the client */
svn_ra_progress_notify_func_t progress_func;
@@ -263,31 +264,11 @@ struct svn_ra_serf__session_t {
*/
typedef struct svn_ra_serf__dav_props_t {
/* Element namespace */
- const char *namespace;
+ const char *xmlns;
/* Element name */
const char *name;
} svn_ra_serf__dav_props_t;
-/*
- * Structure which represents an XML namespace.
- */
-typedef struct ns_t {
- /* The assigned name. */
- const char *namespace;
- /* The full URL for this namespace. */
- const char *url;
- /* The next namespace in our list. */
- struct ns_t *next;
-} svn_ra_serf__ns_t;
-
-/*
- * An incredibly simple list.
- */
-typedef struct ra_serf_list_t {
- void *data;
- struct ra_serf_list_t *next;
-} svn_ra_serf__list_t;
-
/** DAV property sets **/
static const svn_ra_serf__dav_props_t base_props[] =
@@ -378,6 +359,16 @@ svn_ra_serf__context_run_wait(svn_boolean_t *done,
svn_ra_serf__session_t *sess,
apr_pool_t *scratch_pool);
+/* Run the context once. Manage waittime_left to handle timing out when
+ nothing happens over the session->timout.
+ */
+svn_error_t *
+svn_ra_serf__context_run(svn_ra_serf__session_t *sess,
+ apr_interval_time_t *waittime_left,
+ apr_pool_t *scratch_pool);
+
+
+
/* Callback for response handlers */
typedef svn_error_t *
(*svn_ra_serf__response_handler_t)(serf_request_t *request,
@@ -385,20 +376,26 @@ typedef svn_error_t *
void *handler_baton,
apr_pool_t *scratch_pool);
+/* Callback when the request is done */
+typedef svn_error_t *
+(*svn_ra_serf__response_done_delegate_t)(serf_request_t *request,
+ void *done_baton,
+ apr_pool_t *scratch_pool);
+
/* Callback for when a request body is needed. */
-/* ### should pass a scratch_pool */
typedef svn_error_t *
(*svn_ra_serf__request_body_delegate_t)(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *request_pool);
+ apr_pool_t *request_pool,
+ apr_pool_t *scratch_pool);
/* Callback for when request headers are needed. */
-/* ### should pass a scratch_pool */
typedef svn_error_t *
(*svn_ra_serf__request_header_delegate_t)(serf_bucket_t *headers,
void *baton,
- apr_pool_t *request_pool);
+ apr_pool_t *request_pool,
+ apr_pool_t *scratch_pool);
/* Callback for when a response has an error. */
typedef svn_error_t *
@@ -413,6 +410,8 @@ typedef struct svn_ra_serf__server_error_t svn_ra_serf__server_error_t;
/*
* Structure that can be passed to our default handler to guide the
* execution of the request through its lifecycle.
+ *
+ * Use svn_ra_serf__create_handler() to create instances of this struct.
*/
typedef struct svn_ra_serf__handler_t {
/* The HTTP method string of the request */
@@ -429,8 +428,20 @@ typedef struct svn_ra_serf__handler_t {
enabled. */
svn_boolean_t custom_accept_encoding;
+ /* If TRUE then default DAV: capabilities request headers is not configured
+ for request. */
+ svn_boolean_t no_dav_headers;
+
+ /* If TRUE doesn't fail requests on HTTP error statuses like 405, 408, 500
+ (see util.c response_done()) */
+ svn_boolean_t no_fail_on_http_failure_status;
+
+ /* If TRUE doesn't fail requests on HTTP redirect statuses like 301, 307 */
+ svn_boolean_t no_fail_on_http_redirect_status;
+
/* Has the request/response been completed? */
svn_boolean_t done;
+ svn_boolean_t scheduled; /* Is the request scheduled in a context */
/* If we captured an error from the server, then this will be non-NULL.
It will be allocated from HANDLER_POOL. */
@@ -447,6 +458,19 @@ typedef struct svn_ra_serf__handler_t {
serf_status_line sline; /* The parsed Status-Line */
const char *location; /* The Location: header, if any */
+ /* This function and baton pair allows handling the completion of request.
+ *
+ * The default handler is responsible for the HTTP failure processing.
+ *
+ * If no_fail_on_http_failure_status is not TRUE, then the callback will
+ * return recorded server errors or if there is none and the http status
+ * specifies an error returns an error for that.
+ *
+ * The default baton is the handler itself.
+ */
+ svn_ra_serf__response_done_delegate_t done_delegate;
+ void *done_delegate_baton;
+
/* The handler and baton pair to be executed when a non-recoverable error
* is detected. If it is NULL in the presence of an error, an abort() may
* be triggered.
@@ -490,7 +514,6 @@ typedef struct svn_ra_serf__handler_t {
/* Pool for allocating SLINE.REASON and LOCATION. If this pool is NULL,
then the requestor does not care about SLINE and LOCATION. */
apr_pool_t *handler_pool;
-
} svn_ra_serf__handler_t;
@@ -511,149 +534,6 @@ svn_ra_serf__context_run_one(svn_ra_serf__handler_t *handler,
*/
void svn_ra_serf__request_create(svn_ra_serf__handler_t *handler);
-/* XML helper callbacks. */
-
-typedef struct svn_ra_serf__xml_state_t {
- /* A numeric value that represents the current state in parsing.
- *
- * Value 0 is reserved for use as the default state.
- */
- int current_state;
-
- /* Private pointer set by the parsing code. */
- void *private;
-
- /* Allocations should be made in this pool to match the lifetime of the
- * state.
- */
- apr_pool_t *pool;
-
- /* The currently-declared namespace for this state. */
- svn_ra_serf__ns_t *ns_list;
-
- /* Our previous states. */
- struct svn_ra_serf__xml_state_t *prev;
-} svn_ra_serf__xml_state_t;
-
-/* Forward declaration of the XML parser structure. */
-typedef struct svn_ra_serf__xml_parser_t svn_ra_serf__xml_parser_t;
-
-/* Callback invoked with @a baton by our XML @a parser when an element with
- * the @a name containing @a attrs is opened.
- */
-typedef svn_error_t *
-(*svn_ra_serf__xml_start_element_t)(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- const char **attrs,
- apr_pool_t *scratch_pool);
-
-/* Callback invoked with @a baton by our XML @a parser when an element with
- * the @a name is closed.
- */
-typedef svn_error_t *
-(*svn_ra_serf__xml_end_element_t)(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- apr_pool_t *scratch_pool);
-
-/* Callback invoked with @a baton by our XML @a parser when a CDATA portion
- * of @a data with size @a len is encountered.
- *
- * This may be invoked multiple times for the same tag.
- */
-typedef svn_error_t *
-(*svn_ra_serf__xml_cdata_chunk_handler_t)(svn_ra_serf__xml_parser_t *parser,
- const char *data,
- apr_size_t len,
- apr_pool_t *scratch_pool);
-
-/*
- * Helper structure associated with handle_xml_parser handler that will
- * specify how an XML response will be processed.
- */
-struct svn_ra_serf__xml_parser_t {
- /* Temporary allocations should be made in this pool. */
- apr_pool_t *pool;
-
- /* What kind of response are we parsing? If set, this should typically
- define the report name. */
- const char *response_type;
-
- /* Caller-specific data passed to the start, end, cdata callbacks. */
- void *user_data;
-
- /* Callback invoked when a tag is opened. */
- svn_ra_serf__xml_start_element_t start;
-
- /* Callback invoked when a tag is closed. */
- svn_ra_serf__xml_end_element_t end;
-
- /* Callback invoked when a cdata chunk is received. */
- svn_ra_serf__xml_cdata_chunk_handler_t cdata;
-
- /* Our associated expat-based XML parser. */
- XML_Parser xmlp;
-
- /* Our current state. */
- svn_ra_serf__xml_state_t *state;
-
- /* Our previously used states (will be reused). */
- svn_ra_serf__xml_state_t *free_state;
-
- /* If non-NULL, this value will be set to TRUE when the response is
- * completed.
- */
- svn_boolean_t *done;
-
- /* If non-NULL, when this parser completes, it will add done_item to
- * the list.
- */
- svn_ra_serf__list_t **done_list;
-
- /* A pointer to the item that will be inserted into the list upon
- * completeion.
- */
- svn_ra_serf__list_t *done_item;
-
- /* If this flag is TRUE, errors during parsing will be ignored.
- *
- * This is mainly used when we are processing an error XML response to
- * avoid infinite loops.
- */
- svn_boolean_t ignore_errors;
-
- /* If an error occurred, this value will be non-NULL. */
- svn_error_t *error;
-
- /* Deciding whether to pause, or not, is performed within the parsing
- callbacks. If a callback decides to set this flag, then the loop
- driving the parse (generally, a series of calls to serf_context_run())
- is going to need to coordinate the un-pausing of the parser by
- processing pending content. Thus, deciding to pause the parser is a
- coordinate effort rather than merely setting this flag.
-
- When an XML parsing callback sets this flag, note that additional
- elements may be parsed (as the current buffer is consumed). At some
- point, the flag will be recognized and arriving network content will
- be stashed away in the PENDING structure (see below).
-
- At some point, the controlling loop should clear this value. The
- underlying network processing will note the change and begin passing
- content into the XML callbacks.
-
- Note that the controlling loop should also process pending content
- since the arriving network content will typically finish first. */
- svn_boolean_t paused;
-
- /* While the XML parser is paused, content arriving from the server
- must be saved locally. We cannot stop reading, or the server may
- decide to drop the connection. The content will be stored in memory
- up to a certain limit, and will then be spilled over to disk.
-
- See libsvn_ra_serf/util.c */
- struct svn_ra_serf__pending_t *pending;
-};
-
-
/* v2 of the XML parsing functions */
/* The XML parsing context. */
@@ -719,6 +599,10 @@ typedef svn_error_t *
apr_pool_t *scratch_pool);
+/* Magic state value for the initial state in a svn_ra_serf__xml_transition_t
+ table */
+#define XML_STATE_INITIAL 0
+
/* State transition table.
When the XML Context is constructed, it is in state 0. User states are
@@ -727,6 +611,8 @@ typedef svn_error_t *
In a list of transitions, use { 0 } to indicate the end. Specifically,
the code looks for NS == NULL.
+ The initial state for each transition table is XML_STATE_INITIAL.
+
### more docco
*/
typedef struct svn_ra_serf__xml_transition_t {
@@ -757,6 +643,11 @@ typedef struct svn_ra_serf__xml_transition_t {
} svn_ra_serf__xml_transition_t;
+/* Constructor for svn_ra_serf__handler_t. Initializes a new handler
+ with default settings for SESSION. */
+svn_ra_serf__handler_t *
+svn_ra_serf__create_handler(svn_ra_serf__session_t *session,
+ apr_pool_t *result_pool);
/* Construct an XML parsing context, based on the TTABLE transition table.
As content is parsed, the CLOSED_CB callback will be invoked according
@@ -783,18 +674,26 @@ svn_ra_serf__xml_context_create(
void *baton,
apr_pool_t *result_pool);
-/* Destroy all subpools for this structure. */
-void
-svn_ra_serf__xml_context_destroy(
- svn_ra_serf__xml_context_t *xmlctx);
+/* Verifies if the parsing completed successfully and destroys
+ all subpools. */
+svn_error_t *
+svn_ra_serf__xml_context_done(svn_ra_serf__xml_context_t *xmlctx);
/* Construct a handler with the response function/baton set up to parse
a response body using the given XML context. The handler and its
internal structures are allocated in RESULT_POOL.
+ As part of the handling the http status value is compared to 200, or
+ if EXPECTED_STATUS is not NULL to all the values in EXPECTED_STATUS.
+ EXPECTED_STATUS is expected to be a list of integers ending with a 0
+ that lives at least as long as RESULT_POOL. If the status doesn't
+ match the request has failed and will be parsed as en error response.
+
This also initializes HANDLER_POOL to the given RESULT_POOL. */
svn_ra_serf__handler_t *
-svn_ra_serf__create_expat_handler(svn_ra_serf__xml_context_t *xmlctx,
+svn_ra_serf__create_expat_handler(svn_ra_serf__session_t *session,
+ svn_ra_serf__xml_context_t *xmlctx,
+ const int *expected_status,
apr_pool_t *result_pool);
@@ -833,57 +732,25 @@ svn_ra_serf__xml_note(svn_ra_serf__xml_estate_t *xes,
apr_pool_t *
svn_ra_serf__xml_state_pool(svn_ra_serf__xml_estate_t *xes);
-
-/* Any XML parser may be used. When an opening tag is seen, call this
- function to feed the information into XMLCTX. */
-svn_error_t *
-svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
- const char *raw_name,
- const char *const *attrs);
-
-
-/* When a close tag is seen, call this function to feed the information
- into XMLCTX. */
-svn_error_t *
-svn_ra_serf__xml_cb_end(svn_ra_serf__xml_context_t *xmlctx,
- const char *raw_name);
-
-
-/* When cdata is parsed by the wrapping XML parser, call this function to
- feed the cdata into the XMLCTX. */
-svn_error_t *
-svn_ra_serf__xml_cb_cdata(svn_ra_serf__xml_context_t *xmlctx,
- const char *data,
- apr_size_t len);
-
-
/*
* Parses a server-side error message into a local Subversion error.
*/
struct svn_ra_serf__server_error_t {
- /* Our local representation of the error. */
- svn_error_t *error;
-
- /* Are we done with the response? */
- svn_boolean_t done;
-
- /* Have we seen an error tag? */
- svn_boolean_t in_error;
+ apr_pool_t *pool;
- /* Have we seen a HTTP "412 Precondition Failed" error? */
- svn_boolean_t contains_precondition_error;
+ /* XML parser and namespace used to parse the remote response */
+ svn_ra_serf__xml_context_t *xmlctx;
- /* Should we be collecting the XML cdata? */
- svn_boolean_t collect_cdata;
+ svn_ra_serf__response_handler_t response_handler;
+ void *response_baton;
- /* Collected cdata. NULL if cdata not needed. */
- svn_stringbuf_t *cdata;
+ /* The partial errors to construct the final error from */
+ apr_array_header_t *items;
- /* XML parser and namespace used to parse the remote response */
- svn_ra_serf__xml_parser_t parser;
+ /* The hooked handler */
+ svn_ra_serf__handler_t *handler;
};
-
/*
* Handler that discards the entire @a response body associated with a
* @a request. Implements svn_ra_serf__response_handler_t.
@@ -940,20 +807,33 @@ svn_ra_serf__expect_empty_body(serf_request_t *request,
/*
- * This function will feed the RESPONSE body into XMLP. When parsing is
- * completed (i.e. an EOF is received), *DONE is set to TRUE.
- * Implements svn_ra_serf__response_handler_t.
- *
- * If an error occurs during processing RESP_ERR is invoked with the
- * RESP_ERR_BATON.
- *
- * Temporary allocations are made in POOL.
+ * This function sets up error parsing for an existing request
*/
svn_error_t *
-svn_ra_serf__handle_xml_parser(serf_request_t *request,
- serf_bucket_t *response,
- void *handler_baton,
- apr_pool_t *pool);
+svn_ra_serf__setup_error_parsing(svn_ra_serf__server_error_t **server_err,
+ svn_ra_serf__handler_t *handler,
+ svn_boolean_t expect_207_only,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/*
+ * Forwards response data to the server error parser
+ */
+svn_error_t *
+svn_ra_serf__handle_server_error(svn_ra_serf__server_error_t *server_error,
+ svn_ra_serf__handler_t *handler,
+ serf_request_t *request,
+ serf_bucket_t *response,
+ apr_status_t *serf_status,
+ apr_pool_t *scratch_pool);
+
+/*
+ * Creates the svn_error_t * instance from the error recorded in
+ * HANDLER->server_error
+ */
+svn_error_t *
+svn_ra_serf__server_error_create(svn_ra_serf__handler_t *handler,
+ apr_pool_t *scratch_pool);
/* serf_response_handler_t implementation that completely discards
* the response.
@@ -967,28 +847,6 @@ svn_ra_serf__response_discard_handler(serf_request_t *request,
apr_pool_t *pool);
-/** XML helper functions. **/
-
-/*
- * Advance the internal XML @a parser to the @a state.
- */
-void
-svn_ra_serf__xml_push_state(svn_ra_serf__xml_parser_t *parser,
- int state);
-
-/*
- * Return to the previous internal XML @a parser state.
- */
-void
-svn_ra_serf__xml_pop_state(svn_ra_serf__xml_parser_t *parser);
-
-
-svn_error_t *
-svn_ra_serf__process_pending(svn_ra_serf__xml_parser_t *parser,
- svn_boolean_t *network_eof,
- apr_pool_t *scratch_pool);
-
-
/*
* Add the appropriate serf buckets to @a agg_bucket represented by
* the XML * @a tag and @a value.
@@ -1028,7 +886,7 @@ void
svn_ra_serf__add_open_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag,
- ...);
+ ...) SVN_NEEDS_SENTINEL_NULL;
/*
* Add the appropriate serf buckets to AGG_BUCKET representing xml tag close
@@ -1041,6 +899,16 @@ svn_ra_serf__add_close_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag);
+/* Add the appropriate serf buckets to AGG_BUCKET representing the XML
+ * open tag with name TAG, and then immediately closes the tag using the />
+ * notation
+ */
+void
+svn_ra_serf__add_empty_tag_buckets(serf_bucket_t *agg_bucket,
+ serf_bucket_alloc_t *bkt_alloc,
+ const char *tag,
+ ...) SVN_NEEDS_SENTINEL_NULL;
+
/*
* Add the appropriate serf buckets to AGG_BUCKET with xml-escaped
* version of DATA.
@@ -1051,82 +919,55 @@ void
svn_ra_serf__add_cdata_len_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *data, apr_size_t len);
-/*
- * Look up the @a attrs array for namespace definitions and add each one
- * to the @a ns_list of namespaces.
- *
- * New namespaces will be allocated in RESULT_POOL.
- */
-void
-svn_ra_serf__define_ns(svn_ra_serf__ns_t **ns_list,
- const char *const *attrs,
- apr_pool_t *result_pool);
-/*
- * Look up @a name in the @a ns_list list for previously declared namespace
- * definitions.
- *
- * Return (in @a *returned_prop_name) a #svn_ra_serf__dav_props_t tuple
- * representing the expanded name.
- */
+
+/** PROPFIND-related functions **/
+
+/* Removes all non regular properties from PROPS */
void
-svn_ra_serf__expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
- const svn_ra_serf__ns_t *ns_list,
- const char *name);
+svn_ra_serf__keep_only_regular_props(apr_hash_t *props,
+ apr_pool_t *scratch_pool);
-/** PROPFIND-related functions **/
+/* Callback used via svn_ra_serf__deliver_props2 */
+typedef svn_error_t *
+(*svn_ra_serf__prop_func_t)(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool);
/*
- * This function will deliver a PROP_CTX PROPFIND request in the SESS
- * serf context for the properties listed in LOOKUP_PROPS at URL for
- * DEPTH ("0","1","infinity").
- *
- * This function will not block waiting for the response. Callers are
- * expected to call svn_ra_serf__wait_for_props().
+ * Implementation of svn_ra_serf__prop_func_t that just delivers svn compatible
+ * properties in the apr_hash_t * that is used as baton.
*/
svn_error_t *
-svn_ra_serf__deliver_props(svn_ra_serf__handler_t **propfind_handler,
- apr_hash_t *prop_vals,
- svn_ra_serf__session_t *sess,
- svn_ra_serf__connection_t *conn,
- const char *url,
- svn_revnum_t rev,
- const char *depth,
- const svn_ra_serf__dav_props_t *lookup_props,
- svn_ra_serf__list_t **done_list,
- apr_pool_t *pool);
+svn_ra_serf__deliver_svn_props(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool);
/*
- * This helper function will block until PROPFIND_HANDLER indicates that is
- * done or another error is returned.
+ * This function will create a handler for a PROPFIND request, which will deliver
+ * properties to PROP_FUNC() with PROP_BATON for the properties listed in LOOKUP_PROPS
+ * at URL for DEPTH ("0","1","infinity").
*/
svn_error_t *
-svn_ra_serf__wait_for_props(svn_ra_serf__handler_t *handler,
- apr_pool_t *scratch_pool);
-
-/* This is a blocking version of deliver_props.
-
- The properties are fetched and placed into RESULTS, allocated in
- RESULT_POOL.
-
- ### more docco about the other params.
-
- Temporary allocations are made in SCRATCH_POOL.
-*/
-svn_error_t *
-svn_ra_serf__retrieve_props(apr_hash_t **results,
- svn_ra_serf__session_t *sess,
- svn_ra_serf__connection_t *conn,
- const char *url,
- svn_revnum_t rev,
- const char *depth,
- const svn_ra_serf__dav_props_t *props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
-/* Using CONN, fetch the properties specified by WHICH_PROPS using CONN
+svn_ra_serf__create_propfind_handler(svn_ra_serf__handler_t **handler,
+ svn_ra_serf__session_t *session,
+ const char *path,
+ svn_revnum_t rev,
+ const char *depth,
+ const svn_ra_serf__dav_props_t *find_props,
+ svn_ra_serf__prop_func_t prop_func,
+ void *prop_func_baton,
+ apr_pool_t *result_pool);
+
+
+/* Using SESSION, fetch the properties specified by WHICH_PROPS using CONN
for URL at REVISION. The resulting properties are placed into a 2-level
hash in RESULTS, mapping NAMESPACE -> hash<PROPNAME, PROPVALUE>, which
is allocated in RESULT_POOL.
@@ -1139,7 +980,7 @@ svn_ra_serf__retrieve_props(apr_hash_t **results,
Temporary allocations are made in SCRATCH_POOL. */
svn_error_t *
svn_ra_serf__fetch_node_props(apr_hash_t **results,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *url,
svn_revnum_t revision,
const svn_ra_serf__dav_props_t *which_props,
@@ -1147,7 +988,7 @@ svn_ra_serf__fetch_node_props(apr_hash_t **results,
apr_pool_t *scratch_pool);
-/* Using CONN, fetch a DAV: property from the resource identified by URL
+/* Using SESSION, fetch a DAV: property from the resource identified by URL
within REVISION. The PROPNAME may be one of:
"checked-in"
@@ -1161,66 +1002,13 @@ svn_ra_serf__fetch_node_props(apr_hash_t **results,
Temporary allocations are made in SCRATCH_POOL. */
svn_error_t *
svn_ra_serf__fetch_dav_prop(const char **value,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
const char *url,
svn_revnum_t revision,
const char *propname,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-
-/* Set PROPS for PATH at REV revision with a NS:NAME VAL.
- *
- * The POOL governs allocation.
- */
-void
-svn_ra_serf__set_ver_prop(apr_hash_t *props,
- const char *path, svn_revnum_t rev,
- const char *ns, const char *name,
- const svn_string_t *val, apr_pool_t *pool);
-#define svn_ra_serf__set_rev_prop svn_ra_serf__set_ver_prop
-
-/** Property walker functions **/
-
-typedef svn_error_t *
-(*svn_ra_serf__walker_visitor_t)(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *pool);
-
-svn_error_t *
-svn_ra_serf__walk_all_props(apr_hash_t *props,
- const char *name,
- svn_revnum_t rev,
- svn_ra_serf__walker_visitor_t walker,
- void *baton,
- apr_pool_t *pool);
-
-
-/* Like walk_all_props(), but a 2-level hash. */
-svn_error_t *
-svn_ra_serf__walk_node_props(apr_hash_t *props,
- svn_ra_serf__walker_visitor_t walker,
- void *baton,
- apr_pool_t *scratch_pool);
-
-
-typedef svn_error_t *
-(*svn_ra_serf__path_rev_walker_t)(void *baton,
- const char *path, apr_ssize_t path_len,
- const char *ns, apr_ssize_t ns_len,
- const char *name, apr_ssize_t name_len,
- const svn_string_t *val,
- apr_pool_t *pool);
-svn_error_t *
-svn_ra_serf__walk_all_paths(apr_hash_t *props,
- svn_revnum_t rev,
- svn_ra_serf__path_rev_walker_t walker,
- void *baton,
- apr_pool_t *pool);
-
-
/* Map a property name, as passed over the wire, into its corresponding
Subversion-internal name. The returned name will be a static value,
or allocated within RESULT_POOL.
@@ -1232,75 +1020,6 @@ svn_ra_serf__svnname_from_wirename(const char *ns,
const char *name,
apr_pool_t *result_pool);
-
-/* Select the basic revision properties from the set of "all" properties.
- Return these in *REVPROPS, allocated from RESULT_POOL. */
-svn_error_t *
-svn_ra_serf__select_revprops(apr_hash_t **revprops,
- const char *name,
- svn_revnum_t rev,
- apr_hash_t *all_revprops,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
-/* PROPS is nested hash tables mapping NS -> NAME -> VALUE.
- This function takes the NS:NAME:VALUE hashes and flattens them into a set of
- names to VALUE. The names are composed of NS:NAME, with specific
- rewrite from wire names (DAV) to SVN names. This mapping is managed
- by the svn_ra_serf__set_baton_props() function.
-
- FLAT_PROPS is allocated in RESULT_POOL.
- ### right now, we do a shallow copy from PROPS to FLAT_PROPS. therefore,
- ### the names and values in PROPS must be in the proper pool.
-
- Temporary allocations are made in SCRATCH_POOL. */
-svn_error_t *
-svn_ra_serf__flatten_props(apr_hash_t **flat_props,
- apr_hash_t *props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
-/* Return the property value for PATH at REV revision with a NS:NAME.
- * PROPS is a four-level nested hash: (svn_revnum_t => char *path =>
- * char *ns => char *name => svn_string_t *). */
-const svn_string_t *
-svn_ra_serf__get_ver_prop_string(apr_hash_t *props,
- const char *path, svn_revnum_t rev,
- const char *ns, const char *name);
-
-/* Same as svn_ra_serf__get_ver_prop_string(), but returns a C string. */
-const char *
-svn_ra_serf__get_ver_prop(apr_hash_t *props,
- const char *path, svn_revnum_t rev,
- const char *ns, const char *name);
-
-/* Same as svn_ra_serf__get_ver_prop_string(), but for the unknown revision. */
-const svn_string_t *
-svn_ra_serf__get_prop_string(apr_hash_t *props,
- const char *path,
- const char *ns,
- const char *name);
-
-/* Same as svn_ra_serf__get_ver_prop(), but for the unknown revision. */
-const char *
-svn_ra_serf__get_prop(apr_hash_t *props,
- const char *path,
- const char *ns,
- const char *name);
-
-/* Same as svn_ra_serf__set_rev_prop(), but for the unknown revision. */
-void
-svn_ra_serf__set_prop(apr_hash_t *props, const char *path,
- const char *ns, const char *name,
- const svn_string_t *val, apr_pool_t *pool);
-
-svn_error_t *
-svn_ra_serf__get_resource_type(svn_node_kind_t *kind,
- apr_hash_t *props);
-
-
/** MERGE-related functions **/
void
@@ -1317,9 +1036,7 @@ svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens,
locks set on the paths included in this commit. */
svn_error_t *
svn_ra_serf__run_merge(const svn_commit_info_t **commit_info,
- int *response_code,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
const char *merge_resource_url,
apr_hash_t *lock_tokens,
svn_boolean_t keep_locks,
@@ -1347,7 +1064,7 @@ svn_ra_serf__probe_proxy(svn_ra_serf__session_t *serf_sess,
All temporary allocations will be made in SCRATCH_POOL. */
svn_error_t *
svn_ra_serf__v2_get_youngest_revnum(svn_revnum_t *youngest,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
apr_pool_t *scratch_pool);
@@ -1362,35 +1079,29 @@ svn_ra_serf__v2_get_youngest_revnum(svn_revnum_t *youngest,
All temporary allocations will be made in SCRATCH_POOL. */
svn_error_t *
svn_ra_serf__v1_get_activity_collection(const char **activity_url,
- svn_ra_serf__connection_t *conn,
+ svn_ra_serf__session_t *session,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Set @a VCC_URL to the default VCC for our repository based on @a
* ORIG_PATH for the session @a SESSION, ensuring that the VCC URL and
- * repository root URLs are cached in @a SESSION. Use @a CONN for any
- * required network communications if it is non-NULL; otherwise use the
- * default connection.
+ * repository root URLs are cached in @a SESSION.
*
- * All temporary allocations will be made in @a POOL. */
+ * All temporary allocations will be made in @a SCRATCH_POOL. */
svn_error_t *
svn_ra_serf__discover_vcc(const char **vcc_url,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
- apr_pool_t *pool);
+ apr_pool_t *scratch_pool);
/* Set @a REPORT_TARGET to the URI of the resource at which generic
- * (path-agnostic) REPORTs should be aimed for @a SESSION. Use @a
- * CONN for any required network communications if it is non-NULL;
- * otherwise use the default connection.
+ * (path-agnostic) REPORTs should be aimed for @a SESSION.
*
* All temporary allocations will be made in @a POOL.
*/
svn_error_t *
svn_ra_serf__report_resource(const char **report_target,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool);
/* Set @a REL_PATH to a path (not URI-encoded) relative to the root of
@@ -1402,7 +1113,6 @@ svn_error_t *
svn_ra_serf__get_relative_path(const char **rel_path,
const char *orig_path,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool);
@@ -1429,11 +1139,9 @@ svn_ra_serf__get_youngest_revnum(svn_revnum_t *youngest,
The DAV RA provider(s) solve this by generating a URL that is specific
to a revision by using a URL into a "baseline collection".
- For a specified SESSION, with an optional CONN (if NULL, then the
- session's default connection will be used; specifically SESSION->conns[0]),
- generate a revision-stable URL for URL at REVISION. If REVISION is
- SVN_INVALID_REVNUM, then the stable URL will refer to the youngest
- revision at the time this function was called.
+ For a specified SESSION, generate a revision-stable URL for URL at
+ REVISION. If REVISION is SVN_INVALID_REVNUM, then the stable URL will
+ refer to the youngest revision at the time this function was called.
If URL is NULL, then the session root will be used.
@@ -1452,7 +1160,6 @@ svn_error_t *
svn_ra_serf__get_stable_url(const char **stable_url,
svn_revnum_t *latest_revnum,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
const char *url,
svn_revnum_t revision,
apr_pool_t *result_pool,
@@ -1461,6 +1168,20 @@ svn_ra_serf__get_stable_url(const char **stable_url,
/** RA functions **/
+/* Implements svn_ra__vtable_t.reparent(). */
+svn_error_t *
+svn_ra_serf__reparent(svn_ra_session_t *ra_session,
+ const char *url,
+ apr_pool_t *pool);
+
+/* Implements svn_ra__vtable_t.rev_prop(). */
+svn_error_t *
+svn_ra_serf__rev_prop(svn_ra_session_t *session,
+ svn_revnum_t rev,
+ const char *name,
+ svn_string_t **value,
+ apr_pool_t *pool);
+
/* Implements svn_ra__vtable_t.get_log(). */
svn_error_t *
svn_ra_serf__get_log(svn_ra_session_t *session,
@@ -1476,6 +1197,22 @@ svn_ra_serf__get_log(svn_ra_session_t *session,
void *receiver_baton,
apr_pool_t *pool);
+/* Implements svn_ra__vtable_t.check_path(). */
+svn_error_t *
+svn_ra_serf__check_path(svn_ra_session_t *ra_session,
+ const char *rel_path,
+ svn_revnum_t revision,
+ svn_node_kind_t *kind,
+ apr_pool_t *pool);
+
+/* Implements svn_ra__vtable_t.stat(). */
+svn_error_t *
+svn_ra_serf__stat(svn_ra_session_t *ra_session,
+ const char *rel_path,
+ svn_revnum_t revision,
+ svn_dirent_t **dirent,
+ apr_pool_t *pool);
+
/* Implements svn_ra__vtable_t.get_locations(). */
svn_error_t *
svn_ra_serf__get_locations(svn_ra_session_t *session,
@@ -1572,7 +1309,12 @@ svn_ra_serf__get_dated_revision(svn_ra_session_t *session,
apr_time_t tm,
apr_pool_t *pool);
-/* Implements svn_ra__vtable_t.get_commit_editor(). */
+/* Implements svn_ra__vtable_t.get_commit_editor().
+ *
+ * Note: Like other 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_serf__get_commit_editor(svn_ra_session_t *session,
const svn_delta_editor_t **editor,
@@ -1594,6 +1336,17 @@ svn_ra_serf__get_file(svn_ra_session_t *session,
apr_hash_t **props,
apr_pool_t *pool);
+/* Implements svn_ra__vtable_t.get_dir(). */
+svn_error_t *
+svn_ra_serf__get_dir(svn_ra_session_t *ra_session,
+ apr_hash_t **dirents,
+ svn_revnum_t *fetched_rev,
+ apr_hash_t **ret_props,
+ const char *rel_path,
+ svn_revnum_t revision,
+ apr_uint32_t dirent_fields,
+ apr_pool_t *result_pool);
+
/* Implements svn_ra__vtable_t.change_rev_prop(). */
svn_error_t *
svn_ra_serf__change_rev_prop(svn_ra_session_t *session,
@@ -1688,7 +1441,8 @@ svn_ra_serf__get_mergeinfo(svn_ra_session_t *ra_session,
svn_error_t *
svn_ra_serf__exchange_capabilities(svn_ra_serf__session_t *serf_sess,
const char **corrected_url,
- apr_pool_t *pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Implements svn_ra__vtable_t.has_capability(). */
svn_error_t *
@@ -1745,12 +1499,23 @@ svn_ra_serf__credentials_callback(char **username, char **password,
* Convert an HTTP STATUS_CODE resulting from a WebDAV request against
* PATH to the relevant error code. Use the response-supplied LOCATION
* where it necessary.
+ *
+ * Returns SVN_NO_ERROR if sline doesn't specify an error condition
*/
svn_error_t *
svn_ra_serf__error_on_status(serf_status_line sline,
const char *path,
const char *location);
+/**
+ * Convert an unexpected HTTP STATUS_CODE from a request to the relevant error
+ * code. Unlike svn_ra_serf__error_on_status() this function creates an error
+ * for any result
+ */
+svn_error_t *
+svn_ra_serf__unexpected_status(svn_ra_serf__handler_t *handler);
+
+
/* ###? */
svn_error_t *
svn_ra_serf__copy_into_spillbuf(svn_spillbuf_t **spillbuf,
@@ -1773,6 +1538,25 @@ svn_ra_serf__wrap_err(apr_status_t status,
const char *fmt,
...);
+/* Create a bucket that just returns DATA (with length LEN) and then returns
+ the APR_EAGAIN status */
+serf_bucket_t *
+svn_ra_serf__create_bucket_with_eagain(const char *data,
+ apr_size_t len,
+ serf_bucket_alloc_t *allocator);
+
+/* Parse a given URL_STR, fill in all supplied fields of URI
+ * structure.
+ *
+ * This function is a compatibility wrapper around apr_uri_parse().
+ * Different apr-util versions set apr_uri_t.path to either NULL or ""
+ * for root paths, and serf expects to see "/". This function always
+ * sets URI.path to "/" for these paths. */
+svn_error_t *
+svn_ra_serf__uri_parse(apr_uri_t *uri,
+ const char *url_str,
+ apr_pool_t *result_pool);
+
#if defined(SVN_DEBUG)
/* Wrapper macros to collect file and line information */
diff --git a/subversion/libsvn_ra_serf/replay.c b/subversion/libsvn_ra_serf/replay.c
index 66e2f58..8d2da69 100644
--- a/subversion/libsvn_ra_serf/replay.c
+++ b/subversion/libsvn_ra_serf/replay.c
@@ -29,6 +29,7 @@
#include "svn_pools.h"
#include "svn_ra.h"
#include "svn_dav.h"
+#include "svn_hash.h"
#include "svn_xml.h"
#include "../libsvn_ra/ra_loader.h"
#include "svn_config.h"
@@ -46,55 +47,93 @@
* This enum represents the current state of our XML parsing.
*/
typedef enum replay_state_e {
- NONE = 0,
- REPORT,
- OPEN_DIR,
- ADD_DIR,
- OPEN_FILE,
- ADD_FILE,
- DELETE_ENTRY,
- APPLY_TEXTDELTA,
- CHANGE_PROP
+ INITIAL = XML_STATE_INITIAL,
+
+ REPLAY_REPORT,
+ REPLAY_TARGET_REVISION,
+ REPLAY_OPEN_ROOT,
+ REPLAY_OPEN_DIRECTORY,
+ REPLAY_OPEN_FILE,
+ REPLAY_ADD_DIRECTORY,
+ REPLAY_ADD_FILE,
+ REPLAY_DELETE_ENTRY,
+ REPLAY_CLOSE_FILE,
+ REPLAY_CLOSE_DIRECTORY,
+ REPLAY_CHANGE_DIRECTORY_PROP,
+ REPLAY_CHANGE_FILE_PROP,
+ REPLAY_APPLY_TEXTDELTA
} replay_state_e;
-typedef struct replay_info_t replay_info_t;
+#define S_ SVN_XML_NAMESPACE
+static const svn_ra_serf__xml_transition_t replay_ttable[] = {
+ { INITIAL, S_, "editor-report", REPLAY_REPORT,
+ FALSE, { NULL }, TRUE },
-struct replay_info_t {
- apr_pool_t *pool;
+ /* Replay just throws every operation as xml element directly
+ in the replay report, so we can't really use the nice exit
+ handling of the transition parser to handle clean callbacks */
- void *baton;
- svn_stream_t *stream;
+ { REPLAY_REPORT, S_, "target-revision", REPLAY_TARGET_REVISION,
+ FALSE, { "rev", NULL }, TRUE },
- replay_info_t *parent;
-};
+ { REPLAY_REPORT, S_, "open-root", REPLAY_OPEN_ROOT,
+ FALSE, { "rev", NULL }, TRUE },
-typedef svn_error_t *
-(*change_prop_t)(void *baton,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool);
+ { REPLAY_REPORT, S_, "open-directory", REPLAY_OPEN_DIRECTORY,
+ FALSE, { "name", "rev", NULL }, TRUE },
-typedef struct prop_info_t {
- apr_pool_t *pool;
+ { REPLAY_REPORT, S_, "open-file", REPLAY_OPEN_FILE,
+ FALSE, { "name", "rev", NULL }, TRUE },
- change_prop_t change;
+ { REPLAY_REPORT, S_, "add-directory", REPLAY_ADD_DIRECTORY,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev", NULL}, TRUE },
- const char *name;
- svn_boolean_t del_prop;
+ { REPLAY_REPORT, S_, "add-file", REPLAY_ADD_FILE,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev", NULL}, TRUE },
- svn_stringbuf_t *prop_value;
+ { REPLAY_REPORT, S_, "delete-entry", REPLAY_DELETE_ENTRY,
+ FALSE, { "name", "rev", NULL }, TRUE },
- replay_info_t *parent;
-} prop_info_t;
+ { REPLAY_REPORT, S_, "close-file", REPLAY_CLOSE_FILE,
+ FALSE, { "?checksum", NULL }, TRUE },
-typedef struct replay_context_t {
- apr_pool_t *src_rev_pool;
- apr_pool_t *dst_rev_pool;
+ { REPLAY_REPORT, S_, "close-directory", REPLAY_CLOSE_DIRECTORY,
+ FALSE, { NULL }, TRUE },
- /* Are we done fetching this file? */
- svn_boolean_t done;
- svn_ra_serf__list_t **done_list;
- svn_ra_serf__list_t done_item;
+ { REPLAY_REPORT, S_, "change-dir-prop", REPLAY_CHANGE_DIRECTORY_PROP,
+ TRUE, { "name", "?del", NULL }, TRUE },
+
+ { REPLAY_REPORT, S_, "change-file-prop", REPLAY_CHANGE_FILE_PROP,
+ TRUE, { "name", "?del", NULL }, TRUE },
+
+ { REPLAY_REPORT, S_, "apply-textdelta", REPLAY_APPLY_TEXTDELTA,
+ FALSE, { "?checksum", NULL }, TRUE },
+
+ { 0 }
+};
+
+/* Per directory/file state */
+typedef struct replay_node_t {
+ apr_pool_t *pool; /* pool allocating this node's data */
+ svn_boolean_t file; /* file or dir */
+
+ void *baton; /* node baton */
+ svn_stream_t *stream; /* stream while handling txdata */
+
+ struct replay_node_t *parent; /* parent node or NULL */
+} replay_node_t;
+
+/* Per revision replay report state */
+typedef struct revision_report_t {
+ apr_pool_t *pool; /* per revision pool */
+
+ struct replay_node_t *current_node;
+ struct replay_node_t *root_node;
+
+ /* Are we done fetching this file?
+ Handles book-keeping in multi-report case */
+ svn_boolean_t *done;
+ int *replay_reports; /* NULL or number of outstanding reports */
/* callback to get an editor */
svn_ra_replay_revstart_callback_t revstart_func;
@@ -121,479 +160,324 @@ typedef struct replay_context_t {
svn_revnum_t revprop_rev;
/* Revision properties for this revision. */
- apr_hash_t *revs_props;
- apr_hash_t *props;
-
- /* Keep a reference to the XML parser ctx to report any errors. */
- svn_ra_serf__xml_parser_t *parser_ctx;
+ apr_hash_t *rev_props;
/* Handlers for the PROPFIND and REPORT for the current revision. */
svn_ra_serf__handler_t *propfind_handler;
- svn_ra_serf__handler_t *report_handler;
-
-} replay_context_t;
-
-
-static void *
-push_state(svn_ra_serf__xml_parser_t *parser,
- replay_context_t *replay_ctx,
- replay_state_e state)
-{
- svn_ra_serf__xml_push_state(parser, state);
-
- if (state == OPEN_DIR || state == ADD_DIR ||
- state == OPEN_FILE || state == ADD_FILE)
- {
- replay_info_t *info;
- apr_pool_t *pool = svn_pool_create(replay_ctx->dst_rev_pool);
-
- info = apr_palloc(pool, sizeof(*info));
-
- info->pool = pool;
- info->parent = parser->state->private;
- info->baton = NULL;
- info->stream = NULL;
+ svn_ra_serf__handler_t *report_handler; /* For done handler */
- parser->state->private = info;
- }
- else if (state == CHANGE_PROP)
- {
- prop_info_t *info;
- apr_pool_t *pool = svn_pool_create(replay_ctx->dst_rev_pool);
-
- info = apr_pcalloc(pool, sizeof(*info));
-
- info->pool = pool;
- info->parent = parser->state->private;
- info->prop_value = svn_stringbuf_create_empty(pool);
-
- parser->state->private = info;
- }
-
- return parser->state->private;
-}
+} revision_report_t;
+/* Conforms to svn_ra_serf__xml_opened_t */
static svn_error_t *
-start_replay(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- const char **attrs,
- apr_pool_t *scratch_pool)
+replay_opened(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int entered_state,
+ const svn_ra_serf__dav_props_t *tag,
+ apr_pool_t *scratch_pool)
{
- replay_context_t *ctx = parser->user_data;
- replay_state_e state;
+ struct revision_report_t *ctx = baton;
- state = parser->state->current_state;
-
- if (state == NONE &&
- strcmp(name.name, "editor-report") == 0)
+ if (entered_state == REPLAY_REPORT)
{
- push_state(parser, ctx, REPORT);
-
/* Before we can continue, we need the revision properties. */
SVN_ERR_ASSERT(!ctx->propfind_handler || ctx->propfind_handler->done);
- /* Create a pool for the commit editor. */
- ctx->dst_rev_pool = svn_pool_create(ctx->src_rev_pool);
-
- SVN_ERR(svn_ra_serf__select_revprops(&ctx->props,
- ctx->revprop_target,
- ctx->revprop_rev,
- ctx->revs_props,
- ctx->dst_rev_pool,
- scratch_pool));
+ svn_ra_serf__keep_only_regular_props(ctx->rev_props, scratch_pool);
if (ctx->revstart_func)
{
SVN_ERR(ctx->revstart_func(ctx->revision, ctx->replay_baton,
&ctx->editor, &ctx->editor_baton,
- ctx->props,
- ctx->dst_rev_pool));
+ ctx->rev_props,
+ ctx->pool));
}
}
- else if (state == REPORT &&
- strcmp(name.name, "target-revision") == 0)
+ else if (entered_state == REPLAY_APPLY_TEXTDELTA)
{
- const char *rev;
-
- rev = svn_xml_get_attr_value("rev", attrs);
- if (!rev)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in target-revision element"));
- }
-
- SVN_ERR(ctx->editor->set_target_revision(ctx->editor_baton,
- SVN_STR_TO_REV(rev),
- scratch_pool));
+ struct replay_node_t *node = ctx->current_node;
+ apr_hash_t *attrs;
+ const char *checksum;
+ svn_txdelta_window_handler_t handler;
+ void *handler_baton;
+
+ if (! node || ! node->file || node->stream)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
+
+ /* ### Is there a better way to access a specific attr here? */
+ attrs = svn_ra_serf__xml_gather_since(xes, REPLAY_APPLY_TEXTDELTA);
+ checksum = svn_hash_gets(attrs, "checksum");
+
+ SVN_ERR(ctx->editor->apply_textdelta(node->baton, checksum, node->pool,
+ &handler, &handler_baton));
+
+ if (handler != svn_delta_noop_window_handler)
+ {
+ node->stream = svn_base64_decode(
+ svn_txdelta_parse_svndiff(handler,
+ handler_baton,
+ TRUE,
+ node->pool),
+ node->pool);
+ }
}
- else if (state == REPORT &&
- strcmp(name.name, "open-root") == 0)
- {
- const char *rev;
- replay_info_t *info;
- rev = svn_xml_get_attr_value("rev", attrs);
-
- if (!rev)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-root element"));
- }
+ return SVN_NO_ERROR;
+}
- info = push_state(parser, ctx, OPEN_DIR);
+/* Conforms to svn_ra_serf__xml_closed_t */
+static svn_error_t *
+replay_closed(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int leaving_state,
+ const svn_string_t *cdata,
+ apr_hash_t *attrs,
+ apr_pool_t *scratch_pool)
+{
+ struct revision_report_t *ctx = baton;
- SVN_ERR(ctx->editor->open_root(ctx->editor_baton,
- SVN_STR_TO_REV(rev),
- ctx->dst_rev_pool,
- &info->baton));
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "delete-entry") == 0)
+ if (leaving_state == REPLAY_REPORT)
{
- const char *file_name, *rev;
- replay_info_t *info;
+ if (ctx->current_node)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- file_name = svn_xml_get_attr_value("name", attrs);
- if (!file_name)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in delete-entry element"));
- }
- rev = svn_xml_get_attr_value("rev", attrs);
- if (!rev)
+ if (ctx->revfinish_func)
{
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in delete-entry element"));
+ SVN_ERR(ctx->revfinish_func(ctx->revision, ctx->replay_baton,
+ ctx->editor, ctx->editor_baton,
+ ctx->rev_props, scratch_pool));
}
+ }
+ else if (leaving_state == REPLAY_TARGET_REVISION)
+ {
+ const char *revstr = svn_hash_gets(attrs, "rev");
+ apr_int64_t rev;
- info = push_state(parser, ctx, DELETE_ENTRY);
-
- SVN_ERR(ctx->editor->delete_entry(file_name, SVN_STR_TO_REV(rev),
- info->baton, scratch_pool));
-
- svn_ra_serf__xml_pop_state(parser);
+ SVN_ERR(svn_cstring_atoi64(&rev, revstr));
+ SVN_ERR(ctx->editor->set_target_revision(ctx->editor_baton,
+ (svn_revnum_t)rev,
+ scratch_pool));
}
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "open-directory") == 0)
+ else if (leaving_state == REPLAY_OPEN_ROOT)
{
- const char *rev, *dir_name;
- replay_info_t *info;
+ const char *revstr = svn_hash_gets(attrs, "rev");
+ apr_int64_t rev;
+ apr_pool_t *root_pool = svn_pool_create(ctx->pool);
- dir_name = svn_xml_get_attr_value("name", attrs);
- if (!dir_name)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in open-directory element"));
- }
- rev = svn_xml_get_attr_value("rev", attrs);
- if (!rev)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-directory element"));
- }
+ if (ctx->current_node || ctx->root_node)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- info = push_state(parser, ctx, OPEN_DIR);
+ ctx->root_node = apr_pcalloc(root_pool, sizeof(*ctx->root_node));
+ ctx->root_node->pool = root_pool;
- SVN_ERR(ctx->editor->open_directory(dir_name, info->parent->baton,
- SVN_STR_TO_REV(rev),
- ctx->dst_rev_pool, &info->baton));
+ ctx->current_node = ctx->root_node;
+
+ SVN_ERR(svn_cstring_atoi64(&rev, revstr));
+ SVN_ERR(ctx->editor->open_root(ctx->editor_baton, (svn_revnum_t)rev,
+ root_pool,
+ &ctx->current_node->baton));
}
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "add-directory") == 0)
+ else if (leaving_state == REPLAY_OPEN_DIRECTORY
+ || leaving_state == REPLAY_OPEN_FILE
+ || leaving_state == REPLAY_ADD_DIRECTORY
+ || leaving_state == REPLAY_ADD_FILE)
{
- const char *dir_name, *copyfrom, *copyrev;
- svn_revnum_t rev;
- replay_info_t *info;
-
- dir_name = svn_xml_get_attr_value("name", attrs);
- if (!dir_name)
+ struct replay_node_t *node;
+ apr_pool_t *node_pool;
+ const char *name = svn_hash_gets(attrs, "name");
+ const char *rev_str;
+ apr_int64_t rev;
+
+ if (!ctx->current_node || ctx->current_node->file)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
+
+ node_pool = svn_pool_create(ctx->current_node->pool);
+ node = apr_pcalloc(node_pool, sizeof(*node));
+ node->pool = node_pool;
+ node->parent = ctx->current_node;
+
+ if (leaving_state == REPLAY_OPEN_DIRECTORY
+ || leaving_state == REPLAY_OPEN_FILE)
{
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in add-directory element"));
+ rev_str = svn_hash_gets(attrs, "rev");
}
- copyfrom = svn_xml_get_attr_value("copyfrom-path", attrs);
- copyrev = svn_xml_get_attr_value("copyfrom-rev", attrs);
+ else
+ rev_str = svn_hash_gets(attrs, "copyfrom-rev");
- if (copyrev)
- rev = SVN_STR_TO_REV(copyrev);
+ if (rev_str)
+ SVN_ERR(svn_cstring_atoi64(&rev, rev_str));
else
rev = SVN_INVALID_REVNUM;
- info = push_state(parser, ctx, ADD_DIR);
-
- SVN_ERR(ctx->editor->add_directory(dir_name, info->parent->baton,
- copyfrom, rev,
- ctx->dst_rev_pool, &info->baton));
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "close-directory") == 0)
- {
- replay_info_t *info = parser->state->private;
-
- SVN_ERR(ctx->editor->close_directory(info->baton, scratch_pool));
-
- svn_ra_serf__xml_pop_state(parser);
-
- svn_pool_destroy(info->pool);
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "open-file") == 0)
- {
- const char *file_name, *rev;
- replay_info_t *info;
-
- file_name = svn_xml_get_attr_value("name", attrs);
- if (!file_name)
+ switch (leaving_state)
{
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in open-file element"));
+ case REPLAY_OPEN_DIRECTORY:
+ node->file = FALSE;
+ SVN_ERR(ctx->editor->open_directory(name,
+ ctx->current_node->baton,
+ (svn_revnum_t)rev,
+ node->pool,
+ &node->baton));
+ break;
+ case REPLAY_OPEN_FILE:
+ node->file = TRUE;
+ SVN_ERR(ctx->editor->open_file(name,
+ ctx->current_node->baton,
+ (svn_revnum_t)rev,
+ node->pool,
+ &node->baton));
+ break;
+ case REPLAY_ADD_DIRECTORY:
+ node->file = FALSE;
+ SVN_ERR(ctx->editor->add_directory(
+ name,
+ ctx->current_node->baton,
+ SVN_IS_VALID_REVNUM(rev)
+ ? svn_hash_gets(attrs, "copyfrom-path")
+ : NULL,
+ (svn_revnum_t)rev,
+ node->pool,
+ &node->baton));
+ break;
+ case REPLAY_ADD_FILE:
+ node->file = TRUE;
+ SVN_ERR(ctx->editor->add_file(
+ name,
+ ctx->current_node->baton,
+ SVN_IS_VALID_REVNUM(rev)
+ ? svn_hash_gets(attrs, "copyfrom-path")
+ : NULL,
+ (svn_revnum_t)rev,
+ node->pool,
+ &node->baton));
+ break;
+ /* default: unreachable */
}
- rev = svn_xml_get_attr_value("rev", attrs);
- if (!rev)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-file element"));
- }
-
- info = push_state(parser, ctx, OPEN_FILE);
-
- SVN_ERR(ctx->editor->open_file(file_name, info->parent->baton,
- SVN_STR_TO_REV(rev),
- info->pool, &info->baton));
+ ctx->current_node = node;
}
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "add-file") == 0)
+ else if (leaving_state == REPLAY_CLOSE_FILE)
{
- const char *file_name, *copyfrom, *copyrev;
- svn_revnum_t rev;
- replay_info_t *info;
-
- file_name = svn_xml_get_attr_value("name", attrs);
- if (!file_name)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in add-file element"));
- }
- copyfrom = svn_xml_get_attr_value("copyfrom-path", attrs);
- copyrev = svn_xml_get_attr_value("copyfrom-rev", attrs);
-
- info = push_state(parser, ctx, ADD_FILE);
+ struct replay_node_t *node = ctx->current_node;
- if (copyrev)
- rev = SVN_STR_TO_REV(copyrev);
- else
- rev = SVN_INVALID_REVNUM;
+ if (! node || ! node->file)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- SVN_ERR(ctx->editor->add_file(file_name, info->parent->baton,
- copyfrom, rev,
- info->pool, &info->baton));
+ SVN_ERR(ctx->editor->close_file(node->baton,
+ svn_hash_gets(attrs, "checksum"),
+ node->pool));
+ ctx->current_node = node->parent;
+ svn_pool_destroy(node->pool);
}
- else if ((state == OPEN_FILE || state == ADD_FILE) &&
- strcmp(name.name, "apply-textdelta") == 0)
+ else if (leaving_state == REPLAY_CLOSE_DIRECTORY)
{
- const char *checksum;
- replay_info_t *info;
- svn_txdelta_window_handler_t textdelta;
- void *textdelta_baton;
- svn_stream_t *delta_stream;
-
- info = push_state(parser, ctx, APPLY_TEXTDELTA);
-
- checksum = svn_xml_get_attr_value("checksum", attrs);
- if (checksum)
- {
- checksum = apr_pstrdup(info->pool, checksum);
- }
+ struct replay_node_t *node = ctx->current_node;
- SVN_ERR(ctx->editor->apply_textdelta(info->baton, checksum,
- info->pool,
- &textdelta,
- &textdelta_baton));
+ if (! node || node->file)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- delta_stream = svn_txdelta_parse_svndiff(textdelta, textdelta_baton,
- TRUE, info->pool);
- info->stream = svn_base64_decode(delta_stream, info->pool);
+ SVN_ERR(ctx->editor->close_directory(node->baton, node->pool));
+ ctx->current_node = node->parent;
+ svn_pool_destroy(node->pool);
}
- else if ((state == OPEN_FILE || state == ADD_FILE) &&
- strcmp(name.name, "close-file") == 0)
+ else if (leaving_state == REPLAY_DELETE_ENTRY)
{
- replay_info_t *info = parser->state->private;
- const char *checksum;
-
- checksum = svn_xml_get_attr_value("checksum", attrs);
-
- SVN_ERR(ctx->editor->close_file(info->baton, checksum, scratch_pool));
-
- svn_ra_serf__xml_pop_state(parser);
-
- svn_pool_destroy(info->pool);
+ struct replay_node_t *parent_node = ctx->current_node;
+ const char *name = svn_hash_gets(attrs, "name");
+ const char *revstr = svn_hash_gets(attrs, "rev");
+ apr_int64_t rev;
+
+ if (! parent_node || parent_node->file)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
+
+ SVN_ERR(svn_cstring_atoi64(&rev, revstr));
+ SVN_ERR(ctx->editor->delete_entry(name,
+ (svn_revnum_t)rev,
+ parent_node->baton,
+ scratch_pool));
}
- else if (((state == OPEN_FILE || state == ADD_FILE) &&
- strcmp(name.name, "change-file-prop") == 0) ||
- ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "change-dir-prop") == 0))
+ else if (leaving_state == REPLAY_CHANGE_FILE_PROP
+ || leaving_state == REPLAY_CHANGE_DIRECTORY_PROP)
{
- const char *prop_name;
- prop_info_t *info;
+ struct replay_node_t *node = ctx->current_node;
+ const char *name;
+ const svn_string_t *value;
- prop_name = svn_xml_get_attr_value("name", attrs);
- if (!prop_name)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in %s element"),
- name.name);
- }
-
- info = push_state(parser, ctx, CHANGE_PROP);
+ if (! node || node->file != (leaving_state == REPLAY_CHANGE_FILE_PROP))
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
+ name = svn_hash_gets(attrs, "name");
- if (svn_xml_get_attr_value("del", attrs))
- info->del_prop = TRUE;
+ if (svn_hash_gets(attrs, "del"))
+ value = NULL;
else
- info->del_prop = FALSE;
+ value = svn_base64_decode_string(cdata, scratch_pool);
- info->name = apr_pstrdup(info->pool, prop_name);
- if (state == OPEN_FILE || state == ADD_FILE)
+ if (node->file)
{
- info->change = ctx->editor->change_file_prop;
+ SVN_ERR(ctx->editor->change_file_prop(node->baton, name, value,
+ scratch_pool));
}
else
{
- info->change = ctx->editor->change_dir_prop;
- }
-
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-end_replay(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- apr_pool_t *scratch_pool)
-{
- replay_context_t *ctx = parser->user_data;
- replay_state_e state;
-
- state = parser->state->current_state;
-
- if (state == REPORT &&
- strcmp(name.name, "editor-report") == 0)
- {
- svn_ra_serf__xml_pop_state(parser);
- if (ctx->revfinish_func)
- {
- SVN_ERR(ctx->revfinish_func(ctx->revision, ctx->replay_baton,
- ctx->editor, ctx->editor_baton,
- ctx->props,
- ctx->dst_rev_pool));
+ SVN_ERR(ctx->editor->change_dir_prop(node->baton, name, value,
+ scratch_pool));
}
- svn_pool_destroy(ctx->dst_rev_pool);
- }
- else if (state == OPEN_DIR && strcmp(name.name, "open-directory") == 0)
- {
- /* Don't do anything. */
- }
- else if (state == ADD_DIR && strcmp(name.name, "add-directory") == 0)
- {
- /* Don't do anything. */
- }
- else if (state == OPEN_FILE && strcmp(name.name, "open-file") == 0)
- {
- /* Don't do anything. */
- }
- else if (state == ADD_FILE && strcmp(name.name, "add-file") == 0)
- {
- /* Don't do anything. */
- }
- else if ((state == OPEN_FILE || state == ADD_FILE) &&
- strcmp(name.name, "close-file") == 0)
- {
- /* Don't do anything. */
- }
- else if ((state == APPLY_TEXTDELTA) &&
- strcmp(name.name, "apply-textdelta") == 0)
- {
- replay_info_t *info = parser->state->private;
- SVN_ERR(svn_stream_close(info->stream));
- svn_ra_serf__xml_pop_state(parser);
}
- else if (state == CHANGE_PROP &&
- (strcmp(name.name, "change-file-prop") == 0 ||
- strcmp(name.name, "change-dir-prop") == 0))
+ else if (leaving_state == REPLAY_APPLY_TEXTDELTA)
{
- prop_info_t *info = parser->state->private;
- const svn_string_t *prop_val;
+ struct replay_node_t *node = ctx->current_node;
- if (info->del_prop)
- {
- prop_val = NULL;
- }
- else
- {
- const svn_string_t *morph;
-
- morph = svn_stringbuf__morph_into_string(info->prop_value);
-#ifdef SVN_DEBUG
- info->prop_value = NULL; /* morph killed the stringbuf. */
-#endif
+ if (! node || ! node->file || ! node->stream)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- prop_val = svn_base64_decode_string(morph, info->pool);
- }
+ SVN_ERR(svn_stream_close(node->stream));
- SVN_ERR(info->change(info->parent->baton, info->name, prop_val,
- info->parent->pool));
- svn_ra_serf__xml_pop_state(parser);
-
- svn_pool_destroy(info->pool);
+ node->stream = NULL;
}
-
return SVN_NO_ERROR;
}
+/* Conforms to svn_ra_serf__xml_cdata_t */
static svn_error_t *
-cdata_replay(svn_ra_serf__xml_parser_t *parser,
+replay_cdata(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int current_state,
const char *data,
apr_size_t len,
apr_pool_t *scratch_pool)
{
- replay_context_t *replay_ctx = parser->user_data;
- replay_state_e state;
-
- UNUSED_CTX(replay_ctx);
+ struct revision_report_t *ctx = baton;
- state = parser->state->current_state;
-
- if (state == APPLY_TEXTDELTA)
+ if (current_state == REPLAY_APPLY_TEXTDELTA)
{
- replay_info_t *info = parser->state->private;
- apr_size_t written;
-
- written = len;
+ struct replay_node_t *node = ctx->current_node;
- SVN_ERR(svn_stream_write(info->stream, data, &written));
+ if (! node || ! node->file)
+ return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
- if (written != len)
- return svn_error_create(SVN_ERR_STREAM_UNEXPECTED_EOF, NULL,
- _("Error writing stream: unexpected EOF"));
- }
- else if (state == CHANGE_PROP)
- {
- prop_info_t *info = parser->state->private;
+ if (node->stream)
+ {
+ apr_size_t written = len;
- svn_stringbuf_appendbytes(info->prop_value, data, len);
+ SVN_ERR(svn_stream_write(node->stream, data, &written));
+ if (written != len)
+ return svn_error_create(SVN_ERR_STREAM_UNEXPECTED_EOF, NULL,
+ _("Error writing stream: unexpected EOF"));
+ }
}
return SVN_NO_ERROR;
}
+/* Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_replay_body(serf_bucket_t **bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
- replay_context_t *ctx = baton;
+ struct revision_report_t *ctx = baton;
serf_bucket_t *body_bkt;
body_bkt = serf_bucket_aggregate_create(alloc);
@@ -601,7 +485,7 @@ create_replay_body(serf_bucket_t **bkt,
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc,
"S:replay-report",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
/* If we have a non-NULL include path, we add it to the body and
omit the revision; otherwise, the reverse. */
@@ -616,17 +500,17 @@ create_replay_body(serf_bucket_t **bkt,
{
svn_ra_serf__add_tag_buckets(body_bkt,
"S:revision",
- apr_ltoa(ctx->src_rev_pool, ctx->revision),
+ apr_ltoa(pool, ctx->revision),
alloc);
}
svn_ra_serf__add_tag_buckets(body_bkt,
"S:low-water-mark",
- apr_ltoa(ctx->src_rev_pool, ctx->low_water_mark),
+ apr_ltoa(pool, ctx->low_water_mark),
alloc);
svn_ra_serf__add_tag_buckets(body_bkt,
"S:send-deltas",
- apr_ltoa(ctx->src_rev_pool, ctx->send_deltas),
+ apr_ltoa(pool, ctx->send_deltas),
alloc);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "S:replay-report");
@@ -642,65 +526,49 @@ svn_ra_serf__replay(svn_ra_session_t *ra_session,
svn_boolean_t send_deltas,
const svn_delta_editor_t *editor,
void *edit_baton,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
- replay_context_t *replay_ctx;
+ struct revision_report_t ctx = { NULL };
svn_ra_serf__session_t *session = ra_session->priv;
svn_ra_serf__handler_t *handler;
- svn_ra_serf__xml_parser_t *parser_ctx;
- svn_error_t *err;
+ svn_ra_serf__xml_context_t *xmlctx;
const char *report_target;
- SVN_ERR(svn_ra_serf__report_resource(&report_target, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, session,
+ scratch_pool));
+
+ ctx.pool = svn_pool_create(scratch_pool);
+ ctx.editor = editor;
+ ctx.editor_baton = edit_baton;
+ ctx.done = FALSE;
+ ctx.revision = revision;
+ ctx.low_water_mark = low_water_mark;
+ ctx.send_deltas = send_deltas;
+ ctx.rev_props = apr_hash_make(scratch_pool);
- replay_ctx = apr_pcalloc(pool, sizeof(*replay_ctx));
- replay_ctx->src_rev_pool = pool;
- replay_ctx->editor = editor;
- replay_ctx->editor_baton = edit_baton;
- replay_ctx->done = FALSE;
- replay_ctx->revision = revision;
- replay_ctx->low_water_mark = low_water_mark;
- replay_ctx->send_deltas = send_deltas;
- replay_ctx->revs_props = apr_hash_make(replay_ctx->src_rev_pool);
+ xmlctx = svn_ra_serf__xml_context_create(replay_ttable,
+ replay_opened, replay_closed,
+ replay_cdata,
+ &ctx,
+ scratch_pool);
- handler = apr_pcalloc(pool, sizeof(*handler));
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ scratch_pool);
- handler->handler_pool = pool;
handler->method = "REPORT";
handler->path = session->session_url.path;
handler->body_delegate = create_replay_body;
- handler->body_delegate_baton = replay_ctx;
+ handler->body_delegate_baton = &ctx;
handler->body_type = "text/xml";
- handler->conn = session->conns[0];
- handler->session = session;
- parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx));
+ /* Not setting up done handler as we don't use a global context */
- parser_ctx->pool = pool;
- parser_ctx->user_data = replay_ctx;
- parser_ctx->start = start_replay;
- parser_ctx->end = end_replay;
- parser_ctx->cdata = cdata_replay;
- parser_ctx->done = &replay_ctx->done;
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
- handler->response_handler = svn_ra_serf__handle_xml_parser;
- handler->response_baton = parser_ctx;
-
- /* This is only needed to handle errors during XML parsing. */
- replay_ctx->parser_ctx = parser_ctx;
- replay_ctx->report_handler = handler; /* unused */
-
- svn_ra_serf__request_create(handler);
-
- err = svn_ra_serf__context_run_wait(&replay_ctx->done, session, pool);
-
- SVN_ERR(svn_error_compose_create(
+ return svn_error_trace(
svn_ra_serf__error_on_status(handler->sline,
handler->path,
- handler->location),
- err));
-
- return SVN_NO_ERROR;
+ handler->location));
}
/* The maximum number of outstanding requests at any time. When this
@@ -734,6 +602,33 @@ svn_ra_serf__replay(svn_ra_session_t *ra_session,
*/
#define MAX_OUTSTANDING_REQUESTS 50
+/* Implements svn_ra_serf__response_done_delegate_t for svn_ra_serf__replay_range */
+static svn_error_t *
+replay_done(serf_request_t *request,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ struct revision_report_t *ctx = baton;
+ svn_ra_serf__handler_t *handler = ctx->report_handler;
+
+ if (handler->server_error)
+ return svn_ra_serf__server_error_create(handler, scratch_pool);
+ else if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
+
+ *ctx->done = TRUE; /* Breaks out svn_ra_serf__context_run_wait */
+
+ /* Are re replaying multiple revisions? */
+ if (ctx->replay_reports)
+ {
+ (*ctx->replay_reports)--;
+ }
+
+ svn_pool_destroy(ctx->pool); /* Destroys handler and request! */
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
svn_revnum_t start_revision,
@@ -743,15 +638,17 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
svn_ra_replay_revstart_callback_t revstart_func,
svn_ra_replay_revfinish_callback_t revfinish_func,
void *replay_baton,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
svn_ra_serf__session_t *session = ra_session->priv;
svn_revnum_t rev = start_revision;
const char *report_target;
int active_reports = 0;
const char *include_path;
+ svn_boolean_t done;
- SVN_ERR(svn_ra_serf__report_resource(&report_target, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, session,
+ scratch_pool));
/* Prior to 1.8, mod_dav_svn expect to get replay REPORT requests
aimed at the session URL. But that's incorrect -- these reports
@@ -774,8 +671,7 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
{
SVN_ERR(svn_ra_serf__get_relative_path(&include_path,
session->session_url.path,
- session, session->conns[0],
- pool));
+ session, scratch_pool));
}
else
{
@@ -784,10 +680,6 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
while (active_reports || rev <= end_revision)
{
- svn_ra_serf__list_t *done_list;
- svn_ra_serf__list_t *done_reports = NULL;
- replay_context_t *replay_ctx;
-
if (session->cancel_func)
SVN_ERR(session->cancel_func(session->cancel_baton));
@@ -795,54 +687,56 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
requests to MAX_OUTSTANDING_REQUESTS. */
if (rev <= end_revision && active_reports < MAX_OUTSTANDING_REQUESTS)
{
+ struct revision_report_t *rev_ctx;
svn_ra_serf__handler_t *handler;
- svn_ra_serf__xml_parser_t *parser_ctx;
- apr_pool_t *ctx_pool = svn_pool_create(pool);
+ apr_pool_t *rev_pool = svn_pool_create(scratch_pool);
+ svn_ra_serf__xml_context_t *xmlctx;
const char *replay_target;
- replay_ctx = apr_pcalloc(ctx_pool, sizeof(*replay_ctx));
- replay_ctx->src_rev_pool = ctx_pool;
- replay_ctx->revstart_func = revstart_func;
- replay_ctx->revfinish_func = revfinish_func;
- replay_ctx->replay_baton = replay_baton;
- replay_ctx->done = FALSE;
- replay_ctx->include_path = include_path;
- replay_ctx->revision = rev;
- replay_ctx->low_water_mark = low_water_mark;
- replay_ctx->send_deltas = send_deltas;
- replay_ctx->done_item.data = replay_ctx;
+ rev_ctx = apr_pcalloc(rev_pool, sizeof(*rev_ctx));
+ rev_ctx->pool = rev_pool;
+ rev_ctx->revstart_func = revstart_func;
+ rev_ctx->revfinish_func = revfinish_func;
+ rev_ctx->replay_baton = replay_baton;
+ rev_ctx->done = &done;
+ rev_ctx->replay_reports = &active_reports;
+ rev_ctx->include_path = include_path;
+ rev_ctx->revision = rev;
+ rev_ctx->low_water_mark = low_water_mark;
+ rev_ctx->send_deltas = send_deltas;
/* Request all properties of a certain revision. */
- replay_ctx->revs_props = apr_hash_make(replay_ctx->src_rev_pool);
+ rev_ctx->rev_props = apr_hash_make(rev_ctx->pool);
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
{
- replay_ctx->revprop_target = apr_psprintf(pool, "%s/%ld",
- session->rev_stub, rev);
- replay_ctx->revprop_rev = SVN_INVALID_REVNUM;
+ rev_ctx->revprop_target = apr_psprintf(rev_pool, "%s/%ld",
+ session->rev_stub, rev);
+ rev_ctx->revprop_rev = SVN_INVALID_REVNUM;
}
else
{
- replay_ctx->revprop_target = report_target;
- replay_ctx->revprop_rev = rev;
+ rev_ctx->revprop_target = report_target;
+ rev_ctx->revprop_rev = rev;
}
- SVN_ERR(svn_ra_serf__deliver_props(&replay_ctx->propfind_handler,
- replay_ctx->revs_props, session,
- session->conns[0],
- replay_ctx->revprop_target,
- replay_ctx->revprop_rev,
- "0", all_props,
- NULL,
- replay_ctx->src_rev_pool));
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &rev_ctx->propfind_handler,
+ session,
+ rev_ctx->revprop_target,
+ rev_ctx->revprop_rev,
+ "0", all_props,
+ svn_ra_serf__deliver_svn_props,
+ rev_ctx->rev_props,
+ rev_pool));
/* Spin up the serf request for the PROPFIND. */
- svn_ra_serf__request_create(replay_ctx->propfind_handler);
+ svn_ra_serf__request_create(rev_ctx->propfind_handler);
/* Send the replay REPORT request. */
if (session->supports_rev_rsrc_replay)
{
- replay_target = apr_psprintf(pool, "%s/%ld",
+ replay_target = apr_psprintf(rev_pool, "%s/%ld",
session->rev_stub, rev);
}
else
@@ -850,41 +744,24 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
replay_target = session->session_url.path;
}
- handler = apr_pcalloc(replay_ctx->src_rev_pool, sizeof(*handler));
+ xmlctx = svn_ra_serf__xml_context_create(replay_ttable,
+ replay_opened, replay_closed,
+ replay_cdata, rev_ctx,
+ rev_pool);
+
+ handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL,
+ rev_pool);
- handler->handler_pool = replay_ctx->src_rev_pool;
handler->method = "REPORT";
handler->path = replay_target;
handler->body_delegate = create_replay_body;
- handler->body_delegate_baton = replay_ctx;
- handler->conn = session->conns[0];
- handler->session = session;
-
- parser_ctx = apr_pcalloc(replay_ctx->src_rev_pool,
- sizeof(*parser_ctx));
-
- /* Setup the XML parser context.
- Because we have not one but a list of requests, the 'done' property
- on the replay_ctx is not of much use. Instead, use 'done_list'.
- On each handled response (succesfully or not), the parser will add
- done_item to done_list, so by keeping track of the state of
- done_list we know how many requests have been handled completely.
- */
- parser_ctx->pool = replay_ctx->src_rev_pool;
- parser_ctx->user_data = replay_ctx;
- parser_ctx->start = start_replay;
- parser_ctx->end = end_replay;
- parser_ctx->cdata = cdata_replay;
- parser_ctx->done = &replay_ctx->done;
- parser_ctx->done_list = &done_reports;
- parser_ctx->done_item = &replay_ctx->done_item;
- handler->response_handler = svn_ra_serf__handle_xml_parser;
- handler->response_baton = parser_ctx;
- replay_ctx->report_handler = handler;
-
- /* This is only needed to handle errors during XML parsing. */
- replay_ctx->parser_ctx = parser_ctx;
+ handler->body_delegate_baton = rev_ctx;
+ handler->body_type = "text/xml";
+
+ handler->done_delegate = replay_done;
+ handler->done_delegate_baton = rev_ctx;
+ rev_ctx->report_handler = handler;
svn_ra_serf__request_create(handler);
rev++;
@@ -892,26 +769,12 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
}
/* Run the serf loop. */
- SVN_ERR(svn_ra_serf__context_run_wait(&replay_ctx->done, session, pool));
-
- /* Substract the number of completely handled responses from our
- total nr. of open requests', so we'll know when to stop this loop.
- Since the message is completely handled, we can destroy its pool. */
- done_list = done_reports;
- while (done_list)
- {
- replay_context_t *ctx = (replay_context_t *)done_list->data;
- svn_ra_serf__handler_t *done_handler = ctx->report_handler;
-
- done_list = done_list->next;
- SVN_ERR(svn_ra_serf__error_on_status(done_handler->sline,
- done_handler->path,
- done_handler->location));
- svn_pool_destroy(ctx->src_rev_pool);
- active_reports--;
- }
+ done = FALSE;
+ SVN_ERR(svn_ra_serf__context_run_wait(&done, session, scratch_pool));
- done_reports = NULL;
+ /* The done handler of reports decrements active_reports when a report
+ is done. This same handler reports (fatal) report errors, so we can
+ just loop here. */
}
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_ra_serf/serf.c b/subversion/libsvn_ra_serf/serf.c
index 66f9962..3c47d5e 100644
--- a/subversion/libsvn_ra_serf/serf.c
+++ b/subversion/libsvn_ra_serf/serf.c
@@ -39,6 +39,7 @@
#include "svn_dirent_uri.h"
#include "svn_hash.h"
#include "svn_path.h"
+#include "svn_props.h"
#include "svn_time.h"
#include "svn_version.h"
@@ -63,7 +64,7 @@ ra_serf_version(void)
#define RA_SERF_DESCRIPTION_VER \
N_("Module for accessing a repository via WebDAV protocol using serf.\n" \
- " - using serf %d.%d.%d")
+ " - using serf %d.%d.%d (compiled with %d.%d.%d)")
/* Implements svn_ra__vtable_t.get_description(). */
static const char *
@@ -72,7 +73,12 @@ ra_serf_get_description(apr_pool_t *pool)
int major, minor, patch;
serf_lib_version(&major, &minor, &patch);
- return apr_psprintf(pool, _(RA_SERF_DESCRIPTION_VER), major, minor, patch);
+ return apr_psprintf(pool, _(RA_SERF_DESCRIPTION_VER),
+ major, minor, patch,
+ SERF_MAJOR_VERSION,
+ SERF_MINOR_VERSION,
+ SERF_PATCH_VERSION
+ );
}
/* Implements svn_ra__vtable_t.get_schemes(). */
@@ -144,10 +150,6 @@ load_http_auth_types(apr_pool_t *pool, svn_config_t *config,
runtime configuration variable. */
#define DEFAULT_HTTP_TIMEOUT 600
-/* Private symbol for the 1.9-public SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS */
-#define OPTION_HTTP_CHUNKED_REQUESTS "http-chunked-requests"
-
-
static svn_error_t *
load_config(svn_ra_serf__session_t *session,
apr_hash_t *config_hash,
@@ -161,6 +163,10 @@ load_config(svn_ra_serf__session_t *session,
const char *exceptions;
apr_port_t proxy_port;
svn_tristate_t chunked_requests;
+#if SERF_VERSION_AT_LEAST(1, 4, 0) && !defined(SVN_SERF_NO_LOGGING)
+ apr_int64_t log_components;
+ apr_int64_t log_level;
+#endif
if (config_hash)
{
@@ -179,17 +185,17 @@ load_config(svn_ra_serf__session_t *session,
svn_config_get(config, &timeout_str, SVN_CONFIG_SECTION_GLOBAL,
SVN_CONFIG_OPTION_HTTP_TIMEOUT, NULL);
- if (session->wc_callbacks->auth_baton)
+ if (session->auth_baton)
{
if (config_client)
{
- svn_auth_set_parameter(session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(session->auth_baton,
SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG,
config_client);
}
if (config)
{
- svn_auth_set_parameter(session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(session->auth_baton,
SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS,
config);
}
@@ -237,18 +243,25 @@ load_config(svn_ra_serf__session_t *session,
SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS,
SVN_CONFIG_DEFAULT_OPTION_HTTP_MAX_CONNECTIONS));
- /* Should we use chunked transfer encoding. */
+ /* Should we use chunked transfer encoding. */
SVN_ERR(svn_config_get_tristate(config, &chunked_requests,
SVN_CONFIG_SECTION_GLOBAL,
- OPTION_HTTP_CHUNKED_REQUESTS,
+ SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS,
"auto", svn_tristate_unknown));
- if (config)
- server_group = svn_config_find_group(config,
- session->session_url.hostname,
- SVN_CONFIG_SECTION_GROUPS, pool);
- else
- server_group = NULL;
+#if SERF_VERSION_AT_LEAST(1, 4, 0) && !defined(SVN_SERF_NO_LOGGING)
+ SVN_ERR(svn_config_get_int64(config, &log_components,
+ SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS,
+ SERF_LOGCOMP_NONE));
+ SVN_ERR(svn_config_get_int64(config, &log_level,
+ SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_SERF_LOG_LEVEL,
+ SERF_LOG_INFO));
+#endif
+
+ server_group = svn_auth_get_parameter(session->auth_baton,
+ SVN_AUTH_PARAM_SERVER_GROUP);
if (server_group)
{
@@ -259,9 +272,6 @@ load_config(svn_ra_serf__session_t *session,
svn_config_get(config, &timeout_str, server_group,
SVN_CONFIG_OPTION_HTTP_TIMEOUT, timeout_str);
- svn_auth_set_parameter(session->wc_callbacks->auth_baton,
- SVN_AUTH_PARAM_SERVER_GROUP, server_group);
-
/* Load the group proxy server settings, overriding global
settings. We intentionally ignore 'http-proxy-exceptions'
here because, well, if this site was an exception, why is
@@ -300,12 +310,42 @@ load_config(svn_ra_serf__session_t *session,
SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS,
session->max_connections));
- /* Should we use chunked transfer encoding. */
+ /* Should we use chunked transfer encoding. */
SVN_ERR(svn_config_get_tristate(config, &chunked_requests,
server_group,
- OPTION_HTTP_CHUNKED_REQUESTS,
+ SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS,
"auto", chunked_requests));
+
+#if SERF_VERSION_AT_LEAST(1, 4, 0) && !defined(SVN_SERF_NO_LOGGING)
+ SVN_ERR(svn_config_get_int64(config, &log_components,
+ server_group,
+ SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS,
+ log_components));
+ SVN_ERR(svn_config_get_int64(config, &log_level,
+ server_group,
+ SVN_CONFIG_OPTION_SERF_LOG_LEVEL,
+ log_level));
+#endif
+ }
+
+#if SERF_VERSION_AT_LEAST(1, 4, 0) && !defined(SVN_SERF_NO_LOGGING)
+ if (log_components != SERF_LOGCOMP_NONE)
+ {
+ serf_log_output_t *output;
+ apr_status_t status;
+
+ status = serf_logging_create_stream_output(&output,
+ session->context,
+ (apr_uint32_t)log_level,
+ (apr_uint32_t)log_components,
+ SERF_LOG_DEFAULT_LAYOUT,
+ stderr,
+ pool);
+
+ if (!status)
+ serf_logging_add_output(session->context, output);
}
+#endif
/* Don't allow the http-max-connections value to be larger than our
compiled-in limit, or to be too small to operate. Broken
@@ -439,8 +479,10 @@ svn_ra_serf__open(svn_ra_session_t *session,
const char *session_URL,
const svn_ra_callbacks2_t *callbacks,
void *callback_baton,
+ svn_auth_baton_t *auth_baton,
apr_hash_t *config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
apr_status_t status;
svn_ra_serf__session_t *serf_sess;
@@ -451,10 +493,15 @@ svn_ra_serf__open(svn_ra_session_t *session,
if (corrected_url)
*corrected_url = NULL;
- serf_sess = apr_pcalloc(pool, sizeof(*serf_sess));
- serf_sess->pool = svn_pool_create(pool);
+ serf_sess = apr_pcalloc(result_pool, sizeof(*serf_sess));
+ serf_sess->pool = result_pool;
+ if (config)
+ SVN_ERR(svn_config_copy_config(&serf_sess->config, config, result_pool));
+ else
+ serf_sess->config = NULL;
serf_sess->wc_callbacks = callbacks;
serf_sess->wc_callback_baton = callback_baton;
+ serf_sess->auth_baton = auth_baton;
serf_sess->progress_func = callbacks->progress_func;
serf_sess->progress_baton = callbacks->progress_baton;
serf_sess->cancel_func = callbacks->cancel_func;
@@ -467,19 +514,8 @@ svn_ra_serf__open(svn_ra_session_t *session,
serf_sess->pool));
- status = apr_uri_parse(serf_sess->pool, session_URL, &url);
- if (status)
- {
- return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
- _("Illegal URL '%s'"),
- session_URL);
- }
- /* Depending the version of apr-util in use, for root paths url.path
- will be NULL or "", where serf requires "/". */
- if (url.path == NULL || url.path[0] == '\0')
- {
- url.path = apr_pstrdup(serf_sess->pool, "/");
- }
+ SVN_ERR(svn_ra_serf__uri_parse(&url, session_URL, serf_sess->pool));
+
if (!url.port)
{
url.port = apr_uri_port_of_scheme(url.scheme);
@@ -511,13 +547,16 @@ svn_ra_serf__open(svn_ra_session_t *session,
/* create the user agent string */
if (callbacks->get_client_string)
- SVN_ERR(callbacks->get_client_string(callback_baton, &client_string, pool));
+ SVN_ERR(callbacks->get_client_string(callback_baton, &client_string,
+ scratch_pool));
if (client_string)
- serf_sess->useragent = apr_pstrcat(pool, get_user_agent_string(pool), " ",
- client_string, (char *)NULL);
+ serf_sess->useragent = apr_pstrcat(result_pool,
+ get_user_agent_string(scratch_pool),
+ " ",
+ client_string, SVN_VA_NULL);
else
- serf_sess->useragent = get_user_agent_string(pool);
+ serf_sess->useragent = get_user_agent_string(result_pool);
/* go ahead and tell serf about the connection. */
status =
@@ -538,7 +577,24 @@ svn_ra_serf__open(svn_ra_session_t *session,
session->priv = serf_sess;
- err = svn_ra_serf__exchange_capabilities(serf_sess, corrected_url, pool);
+ /* The following code explicitly works around a bug in serf <= r2319 / 1.3.8
+ where serf doesn't report the request as failed/cancelled when the
+ authorization request handler fails to handle the request.
+
+ As long as we allocate the request in a subpool of the serf connection
+ pool, we know that the handler is always cleaned before the connection.
+
+ Luckily our caller now passes us two pools which handle this case.
+ */
+#if defined(SVN_DEBUG) && !SERF_VERSION_AT_LEAST(1,4,0)
+ /* Currently ensured by svn_ra_open4().
+ If failing causes segfault in basic_tests.py 48, "basic auth test" */
+ SVN_ERR_ASSERT((serf_sess->pool != scratch_pool)
+ && apr_pool_is_ancestor(serf_sess->pool, scratch_pool));
+#endif
+
+ err = svn_ra_serf__exchange_capabilities(serf_sess, corrected_url,
+ result_pool, scratch_pool);
/* serf should produce a usable error code instead of APR_EGENERAL */
if (err && err->apr_err == APR_EGENERAL)
@@ -552,20 +608,188 @@ svn_ra_serf__open(svn_ra_session_t *session,
problems in any proxy. */
if ((corrected_url == NULL || *corrected_url == NULL)
&& serf_sess->detect_chunking && !serf_sess->http10)
- SVN_ERR(svn_ra_serf__probe_proxy(serf_sess, pool));
+ SVN_ERR(svn_ra_serf__probe_proxy(serf_sess, scratch_pool));
return SVN_NO_ERROR;
}
-/* Implements svn_ra__vtable_t.reparent(). */
+/* Implements svn_ra__vtable_t.dup_session */
static svn_error_t *
+ra_serf_dup_session(svn_ra_session_t *new_session,
+ svn_ra_session_t *old_session,
+ const char *new_session_url,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *old_sess = old_session->priv;
+ svn_ra_serf__session_t *new_sess;
+ apr_status_t status;
+
+ new_sess = apr_pmemdup(result_pool, old_sess, sizeof(*new_sess));
+
+ new_sess->pool = result_pool;
+
+ if (new_sess->config)
+ SVN_ERR(svn_config_copy_config(&new_sess->config, new_sess->config,
+ result_pool));
+
+ /* max_connections */
+ /* using_ssl */
+ /* using_compression */
+ /* http10 */
+ /* using_chunked_requests */
+ /* detect_chunking */
+
+ if (new_sess->useragent)
+ new_sess->useragent = apr_pstrdup(result_pool, new_sess->useragent);
+
+ if (new_sess->vcc_url)
+ new_sess->vcc_url = apr_pstrdup(result_pool, new_sess->vcc_url);
+
+ new_sess->auth_state = NULL;
+ new_sess->auth_attempts = 0;
+
+ /* Callback functions to get info from WC */
+ /* wc_callbacks */
+ /* wc_callback_baton */
+
+ /* progress_func */
+ /* progress_baton */
+
+ /* cancel_func */
+ /* cancel_baton */
+
+ /* shim_callbacks */
+
+ new_sess->pending_error = NULL;
+
+ /* authn_types */
+
+ /* Keys and values are static */
+ if (new_sess->capabilities)
+ new_sess->capabilities = apr_hash_copy(result_pool, new_sess->capabilities);
+
+ if (new_sess->activity_collection_url)
+ {
+ new_sess->activity_collection_url
+ = apr_pstrdup(result_pool, new_sess->activity_collection_url);
+ }
+
+ /* using_proxy */
+
+ if (new_sess->proxy_username)
+ {
+ new_sess->proxy_username
+ = apr_pstrdup(result_pool, new_sess->proxy_username);
+ }
+
+ if (new_sess->proxy_password)
+ {
+ new_sess->proxy_username
+ = apr_pstrdup(result_pool, new_sess->proxy_password);
+ }
+
+ new_sess->proxy_auth_attempts = 0;
+
+ /* trust_default_ca */
+
+ if (new_sess->ssl_authorities)
+ {
+ new_sess->ssl_authorities = apr_pstrdup(result_pool,
+ new_sess->ssl_authorities);
+ }
+
+ if (new_sess->uuid)
+ new_sess->uuid = apr_pstrdup(result_pool, new_sess->uuid);
+
+ /* timeout */
+ /* supports_deadprop_count */
+
+ if (new_sess->me_resource)
+ new_sess->me_resource = apr_pstrdup(result_pool, new_sess->me_resource);
+ if (new_sess->rev_stub)
+ new_sess->rev_stub = apr_pstrdup(result_pool, new_sess->rev_stub);
+ if (new_sess->txn_stub)
+ new_sess->txn_stub = apr_pstrdup(result_pool, new_sess->txn_stub);
+ if (new_sess->txn_root_stub)
+ new_sess->txn_root_stub = apr_pstrdup(result_pool,
+ new_sess->txn_root_stub);
+ if (new_sess->vtxn_stub)
+ new_sess->vtxn_stub = apr_pstrdup(result_pool, new_sess->vtxn_stub);
+ if (new_sess->vtxn_root_stub)
+ new_sess->vtxn_root_stub = apr_pstrdup(result_pool,
+ new_sess->vtxn_root_stub);
+
+ /* Keys and values are static */
+ if (new_sess->supported_posts)
+ new_sess->supported_posts = apr_hash_copy(result_pool,
+ new_sess->supported_posts);
+
+ /* ### Can we copy this? */
+ SVN_ERR(svn_ra_serf__blncache_create(&new_sess->blncache,
+ new_sess->pool));
+
+ if (new_sess->server_allows_bulk)
+ new_sess->server_allows_bulk = apr_pstrdup(result_pool,
+ new_sess->server_allows_bulk);
+
+ new_sess->repos_root_str = apr_pstrdup(result_pool,
+ new_sess->repos_root_str);
+ SVN_ERR(svn_ra_serf__uri_parse(&new_sess->repos_root,
+ new_sess->repos_root_str,
+ result_pool));
+
+ new_sess->session_url_str = apr_pstrdup(result_pool, new_session_url);
+
+ SVN_ERR(svn_ra_serf__uri_parse(&new_sess->session_url,
+ new_sess->session_url_str,
+ result_pool));
+
+ /* svn_boolean_t supports_inline_props */
+ /* supports_rev_rsrc_replay */
+
+ new_sess->context = serf_context_create(result_pool);
+
+ SVN_ERR(load_config(new_sess, old_sess->config, result_pool));
+
+ new_sess->conns[0] = apr_pcalloc(result_pool,
+ sizeof(*new_sess->conns[0]));
+ new_sess->conns[0]->bkt_alloc =
+ serf_bucket_allocator_create(result_pool, NULL, NULL);
+ new_sess->conns[0]->session = new_sess;
+ new_sess->conns[0]->last_status_code = -1;
+
+ /* go ahead and tell serf about the connection. */
+ status =
+ serf_connection_create2(&new_sess->conns[0]->conn,
+ new_sess->context,
+ new_sess->session_url,
+ svn_ra_serf__conn_setup, new_sess->conns[0],
+ svn_ra_serf__conn_closed, new_sess->conns[0],
+ result_pool);
+ if (status)
+ return svn_ra_serf__wrap_err(status, NULL);
+
+ /* Set the progress callback. */
+ serf_context_set_progress_cb(new_sess->context, svn_ra_serf__progress,
+ new_sess);
+
+ new_sess->num_conns = 1;
+ new_sess->cur_conn = 0;
+
+ new_session->priv = new_sess;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_ra__vtable_t.reparent(). */
+svn_error_t *
svn_ra_serf__reparent(svn_ra_session_t *ra_session,
const char *url,
apr_pool_t *pool)
{
svn_ra_serf__session_t *session = ra_session->priv;
apr_uri_t new_url;
- apr_status_t status;
/* If it's the URL we already have, wave our hands and do nothing. */
if (strcmp(session->session_url_str, url) == 0)
@@ -576,7 +800,7 @@ svn_ra_serf__reparent(svn_ra_session_t *ra_session,
if (!session->repos_root_str)
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
}
if (!svn_uri__is_ancestor(session->repos_root_str, url))
@@ -587,25 +811,11 @@ svn_ra_serf__reparent(svn_ra_session_t *ra_session,
"URL '%s'"), url, session->repos_root_str);
}
- status = apr_uri_parse(pool, url, &new_url);
- if (status)
- {
- return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
- _("Illegal repository URL '%s'"), url);
- }
+ SVN_ERR(svn_ra_serf__uri_parse(&new_url, url, pool));
- /* Depending the version of apr-util in use, for root paths url.path
- will be NULL or "", where serf requires "/". */
/* ### Maybe we should use a string buffer for these strings so we
### don't allocate memory in the session on every reparent? */
- if (new_url.path == NULL || new_url.path[0] == '\0')
- {
- session->session_url.path = apr_pstrdup(session->pool, "/");
- }
- else
- {
- session->session_url.path = apr_pstrdup(session->pool, new_url.path);
- }
+ session->session_url.path = apr_pstrdup(session->pool, new_url.path);
session->session_url_str = apr_pstrdup(session->pool, url);
return SVN_NO_ERROR;
@@ -634,20 +844,24 @@ svn_ra_serf__get_latest_revnum(svn_ra_session_t *ra_session,
latest_revnum, session, pool));
}
-/* Implements svn_ra__vtable_t.rev_proplist(). */
+/* Implementation of svn_ra_serf__rev_proplist(). */
static svn_error_t *
-svn_ra_serf__rev_proplist(svn_ra_session_t *ra_session,
- svn_revnum_t rev,
- apr_hash_t **ret_props,
- apr_pool_t *pool)
+serf__rev_proplist(svn_ra_session_t *ra_session,
+ svn_revnum_t rev,
+ const svn_ra_serf__dav_props_t *fetch_props,
+ apr_hash_t **ret_props,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_ra_serf__session_t *session = ra_session->priv;
apr_hash_t *props;
const char *propfind_path;
+ svn_ra_serf__handler_t *handler;
if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(session))
{
- propfind_path = apr_psprintf(pool, "%s/%ld", session->rev_stub, rev);
+ propfind_path = apr_psprintf(scratch_pool, "%s/%ld", session->rev_stub,
+ rev);
/* svn_ra_serf__retrieve_props() wants to added the revision as
a Label to the PROPFIND, which isn't really necessary when
@@ -658,507 +872,79 @@ svn_ra_serf__rev_proplist(svn_ra_session_t *ra_session,
else
{
/* Use the VCC as the propfind target path. */
- SVN_ERR(svn_ra_serf__discover_vcc(&propfind_path, session, NULL, pool));
- }
-
- /* ### fix: fetch hash of *just* the PATH@REV props. no nested hash. */
- SVN_ERR(svn_ra_serf__retrieve_props(&props, session, session->conns[0],
- propfind_path, rev, "0", all_props,
- pool, pool));
-
- SVN_ERR(svn_ra_serf__select_revprops(ret_props, propfind_path, rev, props,
- pool, pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_ra__vtable_t.rev_prop(). */
-static svn_error_t *
-svn_ra_serf__rev_prop(svn_ra_session_t *session,
- svn_revnum_t rev,
- const char *name,
- svn_string_t **value,
- apr_pool_t *pool)
-{
- apr_hash_t *props;
-
- SVN_ERR(svn_ra_serf__rev_proplist(session, rev, &props, pool));
-
- *value = svn_hash_gets(props, name);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_path_props(apr_hash_t **props,
- svn_ra_serf__session_t *session,
- const char *session_relpath,
- svn_revnum_t revision,
- const svn_ra_serf__dav_props_t *desired_props,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const char *url;
-
- url = session->session_url.path;
-
- /* If we have a relative path, append it. */
- if (session_relpath)
- url = svn_path_url_add_component2(url, session_relpath, scratch_pool);
-
- /* If we were given a specific revision, get a URL that refers to that
- specific revision (rather than floating with HEAD). */
- if (SVN_IS_VALID_REVNUM(revision))
- {
- SVN_ERR(svn_ra_serf__get_stable_url(&url, NULL /* latest_revnum */,
- session, NULL /* conn */,
- url, revision,
- scratch_pool, scratch_pool));
- }
-
- /* URL is stable, so we use SVN_INVALID_REVNUM since it is now irrelevant.
- Or we started with SVN_INVALID_REVNUM and URL may be floating. */
- SVN_ERR(svn_ra_serf__fetch_node_props(props, session->conns[0],
- url, SVN_INVALID_REVNUM,
- desired_props,
- result_pool, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_ra__vtable_t.check_path(). */
-static svn_error_t *
-svn_ra_serf__check_path(svn_ra_session_t *ra_session,
- const char *rel_path,
- svn_revnum_t revision,
- svn_node_kind_t *kind,
- apr_pool_t *pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_t *props;
-
- svn_error_t *err = fetch_path_props(&props, session, rel_path,
- revision, check_path_props,
- pool, pool);
-
- if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- *kind = svn_node_none;
+ SVN_ERR(svn_ra_serf__discover_vcc(&propfind_path, session,
+ scratch_pool));
}
- else
- {
- /* Any other error, raise to caller. */
- if (err)
- return svn_error_trace(err);
- SVN_ERR(svn_ra_serf__get_resource_type(kind, props));
- }
-
- return SVN_NO_ERROR;
-}
+ props = apr_hash_make(result_pool);
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&handler, session,
+ propfind_path, rev, "0",
+ fetch_props,
+ svn_ra_serf__deliver_svn_props,
+ props,
+ scratch_pool));
+ SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool));
-struct dirent_walker_baton_t {
- /* Update the fields in this entry. */
- svn_dirent_t *entry;
+ svn_ra_serf__keep_only_regular_props(props, scratch_pool);
- svn_tristate_t *supports_deadprop_count;
-
- /* If allocations are necessary, then use this pool. */
- apr_pool_t *result_pool;
-};
-
-static svn_error_t *
-dirent_walker(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- struct dirent_walker_baton_t *dwb = baton;
-
- if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
- {
- dwb->entry->has_props = TRUE;
- }
- else if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
- {
- dwb->entry->has_props = TRUE;
- }
- else if (strcmp(ns, SVN_DAV_PROP_NS_DAV) == 0)
- {
- if(strcmp(name, "deadprop-count") == 0)
- {
- if (*val->data)
- {
- apr_int64_t deadprop_count;
- SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
- dwb->entry->has_props = deadprop_count > 0;
- if (dwb->supports_deadprop_count)
- *dwb->supports_deadprop_count = svn_tristate_true;
- }
- else if (dwb->supports_deadprop_count)
- *dwb->supports_deadprop_count = svn_tristate_false;
- }
- }
- else if (strcmp(ns, "DAV:") == 0)
- {
- if (strcmp(name, SVN_DAV__VERSION_NAME) == 0)
- {
- dwb->entry->created_rev = SVN_STR_TO_REV(val->data);
- }
- else if (strcmp(name, "creator-displayname") == 0)
- {
- dwb->entry->last_author = val->data;
- }
- else if (strcmp(name, SVN_DAV__CREATIONDATE) == 0)
- {
- SVN_ERR(svn_time_from_cstring(&dwb->entry->time,
- val->data,
- dwb->result_pool));
- }
- else if (strcmp(name, "getcontentlength") == 0)
- {
- /* 'getcontentlength' property is empty for directories. */
- if (val->len)
- {
- SVN_ERR(svn_cstring_atoi64(&dwb->entry->size, val->data));
- }
- }
- else if (strcmp(name, "resourcetype") == 0)
- {
- if (strcmp(val->data, "collection") == 0)
- {
- dwb->entry->kind = svn_node_dir;
- }
- else
- {
- dwb->entry->kind = svn_node_file;
- }
- }
- }
+ *ret_props = props;
return SVN_NO_ERROR;
}
-struct path_dirent_visitor_t {
- apr_hash_t *full_paths;
- apr_hash_t *base_paths;
- const char *orig_path;
- svn_tristate_t supports_deadprop_count;
- apr_pool_t *result_pool;
-};
-
-static svn_error_t *
-path_dirent_walker(void *baton,
- const char *path, apr_ssize_t path_len,
- const char *ns, apr_ssize_t ns_len,
- const char *name, apr_ssize_t name_len,
- const svn_string_t *val,
- apr_pool_t *pool)
-{
- struct path_dirent_visitor_t *dirents = baton;
- struct dirent_walker_baton_t dwb;
- svn_dirent_t *entry;
-
- /* Skip our original path. */
- if (strcmp(path, dirents->orig_path) == 0)
- {
- return SVN_NO_ERROR;
- }
-
- entry = apr_hash_get(dirents->full_paths, path, path_len);
-
- if (!entry)
- {
- const char *base_name;
-
- entry = svn_dirent_create(pool);
-
- apr_hash_set(dirents->full_paths, path, path_len, entry);
-
- base_name = svn_path_uri_decode(svn_urlpath__basename(path, pool),
- pool);
-
- svn_hash_sets(dirents->base_paths, base_name, entry);
- }
-
- dwb.entry = entry;
- dwb.supports_deadprop_count = &dirents->supports_deadprop_count;
- dwb.result_pool = dirents->result_pool;
- return svn_error_trace(dirent_walker(&dwb, ns, name, val, pool));
-}
-
-static const svn_ra_serf__dav_props_t *
-get_dirent_props(apr_uint32_t dirent_fields,
- svn_ra_serf__session_t *session,
- apr_pool_t *pool)
-{
- svn_ra_serf__dav_props_t *prop;
- apr_array_header_t *props = apr_array_make
- (pool, 7, sizeof(svn_ra_serf__dav_props_t));
-
- if (session->supports_deadprop_count != svn_tristate_false
- || ! (dirent_fields & SVN_DIRENT_HAS_PROPS))
- {
- if (dirent_fields & SVN_DIRENT_KIND)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "resourcetype";
- }
-
- if (dirent_fields & SVN_DIRENT_SIZE)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "getcontentlength";
- }
-
- if (dirent_fields & SVN_DIRENT_HAS_PROPS)
- {
- prop = apr_array_push(props);
- prop->namespace = SVN_DAV_PROP_NS_DAV;
- prop->name = "deadprop-count";
- }
-
- if (dirent_fields & SVN_DIRENT_CREATED_REV)
- {
- svn_ra_serf__dav_props_t *p = apr_array_push(props);
- p->namespace = "DAV:";
- p->name = SVN_DAV__VERSION_NAME;
- }
-
- if (dirent_fields & SVN_DIRENT_TIME)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = SVN_DAV__CREATIONDATE;
- }
-
- if (dirent_fields & SVN_DIRENT_LAST_AUTHOR)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "creator-displayname";
- }
- }
- else
- {
- /* We found an old subversion server that can't handle
- the deadprop-count property in the way we expect.
-
- The neon behavior is to retrieve all properties in this case */
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "allprop";
- }
-
- prop = apr_array_push(props);
- prop->namespace = NULL;
- prop->name = NULL;
-
- return (svn_ra_serf__dav_props_t *) props->elts;
-}
-
-/* Implements svn_ra__vtable_t.stat(). */
+/* Implements svn_ra__vtable_t.rev_proplist(). */
static svn_error_t *
-svn_ra_serf__stat(svn_ra_session_t *ra_session,
- const char *rel_path,
- svn_revnum_t revision,
- svn_dirent_t **dirent,
- apr_pool_t *pool)
+svn_ra_serf__rev_proplist(svn_ra_session_t *ra_session,
+ svn_revnum_t rev,
+ apr_hash_t **ret_props,
+ apr_pool_t *result_pool)
{
- svn_ra_serf__session_t *session = ra_session->priv;
- apr_hash_t *props;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
svn_error_t *err;
- struct dirent_walker_baton_t dwb;
- svn_tristate_t deadprop_count = svn_tristate_unknown;
-
- err = fetch_path_props(&props,
- session, rel_path, revision,
- get_dirent_props(SVN_DIRENT_ALL, session, pool),
- pool, pool);
- if (err)
- {
- if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- *dirent = NULL;
- return SVN_NO_ERROR;
- }
- else
- return svn_error_trace(err);
- }
- dwb.entry = svn_dirent_create(pool);
- dwb.supports_deadprop_count = &deadprop_count;
- dwb.result_pool = pool;
- SVN_ERR(svn_ra_serf__walk_node_props(props, dirent_walker, &dwb, pool));
+ err = serf__rev_proplist(ra_session, rev, all_props, ret_props,
+ result_pool, scratch_pool);
- if (deadprop_count == svn_tristate_false
- && session->supports_deadprop_count == svn_tristate_unknown
- && !dwb.entry->has_props)
- {
- /* We have to requery as the server didn't give us the right
- information */
- session->supports_deadprop_count = svn_tristate_false;
-
- SVN_ERR(fetch_path_props(&props,
- session, rel_path, SVN_INVALID_REVNUM,
- get_dirent_props(SVN_DIRENT_ALL, session, pool),
- pool, pool));
-
- SVN_ERR(svn_ra_serf__walk_node_props(props, dirent_walker, &dwb, pool));
- }
-
- if (deadprop_count != svn_tristate_unknown)
- session->supports_deadprop_count = deadprop_count;
-
- *dirent = dwb.entry;
-
- return SVN_NO_ERROR;
+ svn_pool_destroy(scratch_pool);
+ return svn_error_trace(err);
}
-/* Reads the 'resourcetype' property from the list PROPS and checks if the
- * resource at PATH@REVISION really is a directory. Returns
- * SVN_ERR_FS_NOT_DIRECTORY if not.
- */
-static svn_error_t *
-resource_is_directory(apr_hash_t *props)
-{
- svn_node_kind_t kind;
-
- SVN_ERR(svn_ra_serf__get_resource_type(&kind, props));
-
- if (kind != svn_node_dir)
- {
- return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
- _("Can't get entries of non-directory"));
- }
-
- return SVN_NO_ERROR;
-}
-/* Implements svn_ra__vtable_t.get_dir(). */
-static svn_error_t *
-svn_ra_serf__get_dir(svn_ra_session_t *ra_session,
- apr_hash_t **dirents,
- svn_revnum_t *fetched_rev,
- apr_hash_t **ret_props,
- const char *rel_path,
- svn_revnum_t revision,
- apr_uint32_t dirent_fields,
- apr_pool_t *pool)
+/* Implements svn_ra__vtable_t.rev_prop(). */
+svn_error_t *
+svn_ra_serf__rev_prop(svn_ra_session_t *session,
+ svn_revnum_t rev,
+ const char *name,
+ svn_string_t **value,
+ apr_pool_t *result_pool)
{
- svn_ra_serf__session_t *session = ra_session->priv;
- const char *path;
-
- path = session->session_url.path;
-
- /* If we have a relative path, URI encode and append it. */
- if (rel_path)
- {
- path = svn_path_url_add_component2(path, rel_path, pool);
- }
-
- /* If the user specified a peg revision other than HEAD, we have to fetch
- the baseline collection url for that revision. If not, we can use the
- public url. */
- if (SVN_IS_VALID_REVNUM(revision) || fetched_rev)
- {
- SVN_ERR(svn_ra_serf__get_stable_url(&path, fetched_rev,
- session, NULL /* conn */,
- path, revision,
- pool, pool));
- revision = SVN_INVALID_REVNUM;
- }
- /* REVISION is always SVN_INVALID_REVNUM */
- SVN_ERR_ASSERT(!SVN_IS_VALID_REVNUM(revision));
-
- /* If we're asked for children, fetch them now. */
- if (dirents)
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
+ apr_hash_t *props;
+ svn_ra_serf__dav_props_t specific_props[2];
+ const svn_ra_serf__dav_props_t *fetch_props = all_props;
+
+ /* The DAV propfind doesn't allow property fetches for any property name
+ as there is no defined way to quote values. If we are just fetching a
+ "svn:property" we can safely do this. In other cases we just fetch all
+ revision properties and filter the right one out */
+ if (strncmp(name, SVN_PROP_PREFIX, sizeof(SVN_PROP_PREFIX)-1) == 0
+ && !strchr(name + sizeof(SVN_PROP_PREFIX)-1, ':'))
{
- struct path_dirent_visitor_t dirent_walk;
- apr_hash_t *props;
- const char *rtype;
-
- /* Always request node kind to check that path is really a
- * directory.
- */
- dirent_fields |= SVN_DIRENT_KIND;
- SVN_ERR(svn_ra_serf__retrieve_props(&props, session, session->conns[0],
- path, SVN_INVALID_REVNUM, "1",
- get_dirent_props(dirent_fields,
- session, pool),
- pool, pool));
-
- /* Check if the path is really a directory. */
- rtype = svn_ra_serf__get_prop(props, path, "DAV:", "resourcetype");
- if (rtype == NULL || strcmp(rtype, "collection") != 0)
- return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
- _("Can't get entries of non-directory"));
-
- /* We're going to create two hashes to help the walker along.
- * We're going to return the 2nd one back to the caller as it
- * will have the basenames it expects.
- */
- dirent_walk.full_paths = apr_hash_make(pool);
- dirent_walk.base_paths = apr_hash_make(pool);
- dirent_walk.orig_path = svn_urlpath__canonicalize(path, pool);
- dirent_walk.supports_deadprop_count = svn_tristate_unknown;
- dirent_walk.result_pool = pool;
-
- SVN_ERR(svn_ra_serf__walk_all_paths(props, SVN_INVALID_REVNUM,
- path_dirent_walker, &dirent_walk,
- pool));
-
- if (dirent_walk.supports_deadprop_count == svn_tristate_false
- && session->supports_deadprop_count == svn_tristate_unknown
- && dirent_fields & SVN_DIRENT_HAS_PROPS)
- {
- /* We have to requery as the server didn't give us the right
- information */
- session->supports_deadprop_count = svn_tristate_false;
- SVN_ERR(svn_ra_serf__retrieve_props(&props, session,
- session->conns[0],
- path, SVN_INVALID_REVNUM, "1",
- get_dirent_props(dirent_fields,
- session, pool),
- pool, pool));
-
- apr_hash_clear(dirent_walk.full_paths);
- apr_hash_clear(dirent_walk.base_paths);
-
- SVN_ERR(svn_ra_serf__walk_all_paths(props, SVN_INVALID_REVNUM,
- path_dirent_walker,
- &dirent_walk, pool));
- }
-
- *dirents = dirent_walk.base_paths;
+ specific_props[0].xmlns = SVN_DAV_PROP_NS_SVN;
+ specific_props[0].name = name + sizeof(SVN_PROP_PREFIX)-1;
+ specific_props[1].xmlns = NULL;
+ specific_props[1].name = NULL;
- if (dirent_walk.supports_deadprop_count != svn_tristate_unknown)
- session->supports_deadprop_count = dirent_walk.supports_deadprop_count;
+ fetch_props = specific_props;
}
- /* If we're asked for the directory properties, fetch them too. */
- if (ret_props)
- {
- apr_hash_t *props;
-
- SVN_ERR(svn_ra_serf__fetch_node_props(&props, session->conns[0],
- path, SVN_INVALID_REVNUM,
- all_props,
- pool, pool));
+ SVN_ERR(serf__rev_proplist(session, rev, fetch_props, &props,
+ result_pool, scratch_pool));
- /* Check if the path is really a directory. */
- SVN_ERR(resource_is_directory(props));
+ *value = svn_hash_gets(props, name);
- /* ### flatten_props() does not copy PROPVALUE, but fetch_node_props()
- ### put them into POOL, so we're okay. */
- SVN_ERR(svn_ra_serf__flatten_props(ret_props, props, pool, pool));
- }
+ svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
@@ -1173,7 +959,7 @@ svn_ra_serf__get_repos_root(svn_ra_session_t *ra_session,
if (!session->repos_root_str)
{
const char *vcc_url;
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
}
*url = session->repos_root_str;
@@ -1209,7 +995,7 @@ svn_ra_serf__get_uuid(svn_ra_session_t *ra_session,
/* We're not interested in vcc_url and relative_url, but this call also
stores the repository's uuid in the session. */
- SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, pool));
if (!session->uuid)
{
return svn_error_create(SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS, NULL,
@@ -1229,6 +1015,7 @@ static const svn_ra__vtable_t serf_vtable = {
ra_serf_get_description,
ra_serf_get_schemes,
svn_ra_serf__open,
+ ra_serf_dup_session,
svn_ra_serf__reparent,
svn_ra_serf__get_session_url,
svn_ra_serf__get_latest_revnum,
diff --git a/subversion/libsvn_ra_serf/stat.c b/subversion/libsvn_ra_serf/stat.c
new file mode 100644
index 0000000..b6d10c5
--- /dev/null
+++ b/subversion/libsvn_ra_serf/stat.c
@@ -0,0 +1,615 @@
+/*
+ * stat.c : file and directory stat and read functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#define APR_WANT_STRFUNC
+#include <apr_want.h>
+
+#include <serf.h>
+
+#include "svn_private_config.h"
+#include "svn_pools.h"
+#include "svn_xml.h"
+#include "../libsvn_ra/ra_loader.h"
+#include "svn_config.h"
+#include "svn_dirent_uri.h"
+#include "svn_hash.h"
+#include "svn_path.h"
+#include "svn_props.h"
+#include "svn_time.h"
+#include "svn_version.h"
+
+#include "private/svn_dav_protocol.h"
+#include "private/svn_dep_compat.h"
+#include "private/svn_fspath.h"
+
+#include "ra_serf.h"
+
+
+
+/* Implements svn_ra__vtable_t.check_path(). */
+svn_error_t *
+svn_ra_serf__check_path(svn_ra_session_t *ra_session,
+ const char *relpath,
+ svn_revnum_t revision,
+ svn_node_kind_t *kind,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ apr_hash_t *props;
+ svn_error_t *err;
+ const char *url;
+
+ url = session->session_url.path;
+
+ /* If we have a relative path, append it. */
+ if (relpath)
+ url = svn_path_url_add_component2(url, relpath, scratch_pool);
+
+ /* If we were given a specific revision, get a URL that refers to that
+ specific revision (rather than floating with HEAD). */
+ if (SVN_IS_VALID_REVNUM(revision))
+ {
+ SVN_ERR(svn_ra_serf__get_stable_url(&url, NULL /* latest_revnum */,
+ session,
+ url, revision,
+ scratch_pool, scratch_pool));
+ }
+
+ /* URL is stable, so we use SVN_INVALID_REVNUM since it is now irrelevant.
+ Or we started with SVN_INVALID_REVNUM and URL may be floating. */
+ err = svn_ra_serf__fetch_node_props(&props, session,
+ url, SVN_INVALID_REVNUM,
+ check_path_props,
+ scratch_pool, scratch_pool);
+
+ if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ *kind = svn_node_none;
+ }
+ else
+ {
+ apr_hash_t *dav_props;
+ const char *res_type;
+
+ /* Any other error, raise to caller. */
+ SVN_ERR(err);
+
+ dav_props = apr_hash_get(props, "DAV:", 4);
+ res_type = svn_prop_get_value(dav_props, "resourcetype");
+ if (!res_type)
+ {
+ /* How did this happen? */
+ return svn_error_create(SVN_ERR_RA_DAV_PROPS_NOT_FOUND, NULL,
+ _("The PROPFIND response did not include the "
+ "requested resourcetype value"));
+ }
+
+ if (strcmp(res_type, "collection") == 0)
+ *kind = svn_node_dir;
+ else
+ *kind = svn_node_file;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Baton for fill_dirent_propfunc() */
+struct fill_dirent_baton_t
+{
+ /* Update the fields in this entry. */
+ svn_dirent_t *entry;
+
+ svn_tristate_t *supports_deadprop_count;
+
+ /* If allocations are necessary, then use this pool. */
+ apr_pool_t *result_pool;
+};
+
+/* Implements svn_ra_serf__prop_func_t */
+static svn_error_t *
+fill_dirent_propfunc(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *val,
+ apr_pool_t *scratch_pool)
+{
+ struct fill_dirent_baton_t *fdb = baton;
+
+ if (strcmp(ns, "DAV:") == 0)
+ {
+ if (strcmp(name, SVN_DAV__VERSION_NAME) == 0)
+ {
+ apr_int64_t rev;
+ SVN_ERR(svn_cstring_atoi64(&rev, val->data));
+
+ fdb->entry->created_rev = (svn_revnum_t)rev;
+ }
+ else if (strcmp(name, "creator-displayname") == 0)
+ {
+ fdb->entry->last_author = apr_pstrdup(fdb->result_pool, val->data);
+ }
+ else if (strcmp(name, SVN_DAV__CREATIONDATE) == 0)
+ {
+ SVN_ERR(svn_time_from_cstring(&fdb->entry->time,
+ val->data,
+ fdb->result_pool));
+ }
+ else if (strcmp(name, "getcontentlength") == 0)
+ {
+ /* 'getcontentlength' property is empty for directories. */
+ if (val->len)
+ {
+ SVN_ERR(svn_cstring_atoi64(&fdb->entry->size, val->data));
+ }
+ }
+ else if (strcmp(name, "resourcetype") == 0)
+ {
+ if (strcmp(val->data, "collection") == 0)
+ {
+ fdb->entry->kind = svn_node_dir;
+ }
+ else
+ {
+ fdb->entry->kind = svn_node_file;
+ }
+ }
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_CUSTOM) == 0)
+ {
+ fdb->entry->has_props = TRUE;
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
+ {
+ fdb->entry->has_props = TRUE;
+ }
+ else if (strcmp(ns, SVN_DAV_PROP_NS_DAV) == 0)
+ {
+ if(strcmp(name, "deadprop-count") == 0)
+ {
+ if (*val->data)
+ {
+ apr_int64_t deadprop_count;
+ SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
+ fdb->entry->has_props = deadprop_count > 0;
+ if (fdb->supports_deadprop_count)
+ *fdb->supports_deadprop_count = svn_tristate_true;
+ }
+ else if (fdb->supports_deadprop_count)
+ *fdb->supports_deadprop_count = svn_tristate_false;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static const svn_ra_serf__dav_props_t *
+get_dirent_props(apr_uint32_t dirent_fields,
+ svn_ra_serf__session_t *session,
+ apr_pool_t *pool)
+{
+ svn_ra_serf__dav_props_t *prop;
+ apr_array_header_t *props = apr_array_make
+ (pool, 7, sizeof(svn_ra_serf__dav_props_t));
+
+ if (session->supports_deadprop_count != svn_tristate_false
+ || ! (dirent_fields & SVN_DIRENT_HAS_PROPS))
+ {
+ if (dirent_fields & SVN_DIRENT_KIND)
+ {
+ prop = apr_array_push(props);
+ prop->xmlns = "DAV:";
+ prop->name = "resourcetype";
+ }
+
+ if (dirent_fields & SVN_DIRENT_SIZE)
+ {
+ prop = apr_array_push(props);
+ prop->xmlns = "DAV:";
+ prop->name = "getcontentlength";
+ }
+
+ if (dirent_fields & SVN_DIRENT_HAS_PROPS)
+ {
+ prop = apr_array_push(props);
+ prop->xmlns = SVN_DAV_PROP_NS_DAV;
+ prop->name = "deadprop-count";
+ }
+
+ if (dirent_fields & SVN_DIRENT_CREATED_REV)
+ {
+ svn_ra_serf__dav_props_t *p = apr_array_push(props);
+ p->xmlns = "DAV:";
+ p->name = SVN_DAV__VERSION_NAME;
+ }
+
+ if (dirent_fields & SVN_DIRENT_TIME)
+ {
+ prop = apr_array_push(props);
+ prop->xmlns = "DAV:";
+ prop->name = SVN_DAV__CREATIONDATE;
+ }
+
+ if (dirent_fields & SVN_DIRENT_LAST_AUTHOR)
+ {
+ prop = apr_array_push(props);
+ prop->xmlns = "DAV:";
+ prop->name = "creator-displayname";
+ }
+ }
+ else
+ {
+ /* We found an old subversion server that can't handle
+ the deadprop-count property in the way we expect.
+
+ The neon behavior is to retrieve all properties in this case */
+ prop = apr_array_push(props);
+ prop->xmlns = "DAV:";
+ prop->name = "allprop";
+ }
+
+ prop = apr_array_push(props);
+ prop->xmlns = NULL;
+ prop->name = NULL;
+
+ return (svn_ra_serf__dav_props_t *) props->elts;
+}
+
+/* Implements svn_ra__vtable_t.stat(). */
+svn_error_t *
+svn_ra_serf__stat(svn_ra_session_t *ra_session,
+ const char *relpath,
+ svn_revnum_t revision,
+ svn_dirent_t **dirent,
+ apr_pool_t *pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ svn_error_t *err;
+ struct fill_dirent_baton_t fdb;
+ svn_tristate_t deadprop_count = svn_tristate_unknown;
+ svn_ra_serf__handler_t *handler;
+ const char *url;
+
+ url = session->session_url.path;
+
+ /* If we have a relative path, append it. */
+ if (relpath)
+ url = svn_path_url_add_component2(url, relpath, pool);
+
+ /* If we were given a specific revision, get a URL that refers to that
+ specific revision (rather than floating with HEAD). */
+ if (SVN_IS_VALID_REVNUM(revision))
+ {
+ SVN_ERR(svn_ra_serf__get_stable_url(&url, NULL /* latest_revnum */,
+ session,
+ url, revision,
+ pool, pool));
+ }
+
+ fdb.entry = svn_dirent_create(pool);
+ fdb.supports_deadprop_count = &deadprop_count;
+ fdb.result_pool = pool;
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&handler, session, url,
+ SVN_INVALID_REVNUM, "0",
+ get_dirent_props(SVN_DIRENT_ALL,
+ session,
+ pool),
+ fill_dirent_propfunc, &fdb, pool));
+
+ err = svn_ra_serf__context_run_one(handler, pool);
+
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ *dirent = NULL;
+ return SVN_NO_ERROR;
+ }
+ else
+ return svn_error_trace(err);
+ }
+
+ if (deadprop_count == svn_tristate_false
+ && session->supports_deadprop_count == svn_tristate_unknown
+ && !fdb.entry->has_props)
+ {
+ /* We have to requery as the server didn't give us the right
+ information */
+ session->supports_deadprop_count = svn_tristate_false;
+
+ /* Run the same handler again */
+ SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
+ }
+
+ if (deadprop_count != svn_tristate_unknown)
+ session->supports_deadprop_count = deadprop_count;
+
+ *dirent = fdb.entry;
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for get_dir_dirents_cb and get_dir_props_cb */
+struct get_dir_baton_t
+{
+ apr_pool_t *result_pool;
+ apr_hash_t *dirents;
+ apr_hash_t *ret_props;
+ svn_boolean_t is_directory;
+ svn_tristate_t supports_deadprop_count;
+ const char *path;
+};
+
+/* Implements svn_ra_serf__prop_func_t */
+static svn_error_t *
+get_dir_dirents_cb(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ struct get_dir_baton_t *db = baton;
+ const char *relpath;
+
+ relpath = svn_fspath__skip_ancestor(db->path, path);
+
+ if (relpath && relpath[0] != '\0')
+ {
+ struct fill_dirent_baton_t fdb;
+
+ relpath = svn_path_uri_decode(relpath, scratch_pool);
+ fdb.entry = svn_hash_gets(db->dirents, relpath);
+
+ if (!fdb.entry)
+ {
+ fdb.entry = svn_dirent_create(db->result_pool);
+ svn_hash_sets(db->dirents,
+ apr_pstrdup(db->result_pool, relpath),
+ fdb.entry);
+ }
+
+ fdb.result_pool = db->result_pool;
+ fdb.supports_deadprop_count = &db->supports_deadprop_count;
+ SVN_ERR(fill_dirent_propfunc(&fdb, path, ns, name, value, scratch_pool));
+ }
+ else if (relpath && !db->is_directory)
+ {
+ if (strcmp(ns, "DAV:") == 0 && strcmp(name, "resourcetype") == 0)
+ {
+ if (strcmp(value->data, "collection") != 0)
+ {
+ /* Tell a lie to exit early */
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't get properties of non-directory"));
+ }
+ else
+ db->is_directory = TRUE;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_ra_serf__prop_func */
+static svn_error_t *
+get_dir_props_cb(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *scratch_pool)
+{
+ struct get_dir_baton_t *db = baton;
+ const char *propname;
+
+ propname = svn_ra_serf__svnname_from_wirename(ns, name, db->result_pool);
+ if (propname)
+ {
+ svn_hash_sets(db->ret_props, propname,
+ svn_string_dup(value, db->result_pool));
+ return SVN_NO_ERROR;
+ }
+
+ if (!db->is_directory)
+ {
+ if (strcmp(ns, "DAV:") == 0 && strcmp(name, "resourcetype") == 0)
+ {
+ if (strcmp(value->data, "collection") != 0)
+ {
+ /* Tell a lie to exit early */
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't get properties of non-directory"));
+ }
+ else
+ db->is_directory = TRUE;
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_ra__vtable_t.get_dir(). */
+svn_error_t *
+svn_ra_serf__get_dir(svn_ra_session_t *ra_session,
+ apr_hash_t **dirents,
+ svn_revnum_t *fetched_rev,
+ apr_hash_t **ret_props,
+ const char *rel_path,
+ svn_revnum_t revision,
+ apr_uint32_t dirent_fields,
+ apr_pool_t *result_pool)
+{
+ svn_ra_serf__session_t *session = ra_session->priv;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
+ svn_ra_serf__handler_t *dirent_handler = NULL;
+ svn_ra_serf__handler_t *props_handler = NULL;
+ const char *path;
+ struct get_dir_baton_t gdb;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ gdb.result_pool = result_pool;
+ gdb.is_directory = FALSE;
+ gdb.supports_deadprop_count = svn_tristate_unknown;
+
+ path = session->session_url.path;
+
+ /* If we have a relative path, URI encode and append it. */
+ if (rel_path)
+ {
+ path = svn_path_url_add_component2(path, rel_path, scratch_pool);
+ }
+
+ /* If the user specified a peg revision other than HEAD, we have to fetch
+ the baseline collection url for that revision. If not, we can use the
+ public url. */
+ if (SVN_IS_VALID_REVNUM(revision) || fetched_rev)
+ {
+ SVN_ERR(svn_ra_serf__get_stable_url(&path, fetched_rev,
+ session,
+ path, revision,
+ scratch_pool, scratch_pool));
+ revision = SVN_INVALID_REVNUM;
+ }
+ /* REVISION is always SVN_INVALID_REVNUM */
+ SVN_ERR_ASSERT(!SVN_IS_VALID_REVNUM(revision));
+
+ gdb.path = path;
+
+ /* If we're asked for children, fetch them now. */
+ if (dirents)
+ {
+ /* Always request node kind to check that path is really a
+ * directory. */
+ if (!ret_props)
+ dirent_fields |= SVN_DIRENT_KIND;
+
+ gdb.dirents = apr_hash_make(result_pool);
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &dirent_handler, session,
+ path, SVN_INVALID_REVNUM, "1",
+ get_dirent_props(dirent_fields,
+ session,
+ scratch_pool),
+ get_dir_dirents_cb, &gdb,
+ scratch_pool));
+
+ svn_ra_serf__request_create(dirent_handler);
+ }
+ else
+ gdb.dirents = NULL;
+
+ if (ret_props)
+ {
+ gdb.ret_props = apr_hash_make(result_pool);
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &props_handler, session,
+ path, SVN_INVALID_REVNUM, "0",
+ all_props,
+ get_dir_props_cb, &gdb,
+ scratch_pool));
+
+ svn_ra_serf__request_create(props_handler);
+ }
+ else
+ gdb.ret_props = NULL;
+
+ if (dirent_handler)
+ {
+ err = svn_error_trace(
+ svn_ra_serf__context_run_wait(&dirent_handler->done,
+ session,
+ scratch_pool));
+
+ if (err)
+ {
+ svn_pool_clear(scratch_pool); /* Unregisters outstanding requests */
+ return err;
+ }
+
+ if (gdb.supports_deadprop_count == svn_tristate_false
+ && session->supports_deadprop_count == svn_tristate_unknown
+ && dirent_fields & SVN_DIRENT_HAS_PROPS)
+ {
+ /* We have to requery as the server didn't give us the right
+ information */
+ session->supports_deadprop_count = svn_tristate_false;
+
+ apr_hash_clear(gdb.dirents);
+
+ SVN_ERR(svn_ra_serf__create_propfind_handler(
+ &dirent_handler, session,
+ path, SVN_INVALID_REVNUM, "1",
+ get_dirent_props(dirent_fields,
+ session,
+ scratch_pool),
+ get_dir_dirents_cb, &gdb,
+ scratch_pool));
+
+ svn_ra_serf__request_create(dirent_handler);
+ }
+ }
+
+ if (props_handler)
+ {
+ err = svn_error_trace(
+ svn_ra_serf__context_run_wait(&props_handler->done,
+ session,
+ scratch_pool));
+ }
+
+ /* And dirent again for the case when we had to send the request again */
+ if (! err && dirent_handler)
+ {
+ err = svn_error_trace(
+ svn_ra_serf__context_run_wait(&dirent_handler->done,
+ session,
+ scratch_pool));
+ }
+
+ if (!err && gdb.supports_deadprop_count != svn_tristate_unknown)
+ session->supports_deadprop_count = gdb.supports_deadprop_count;
+
+ svn_pool_destroy(scratch_pool); /* Unregisters outstanding requests */
+
+ SVN_ERR(err);
+
+ if (!gdb.is_directory)
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't get entries of non-directory"));
+
+ if (ret_props)
+ *ret_props = gdb.ret_props;
+
+ if (dirents)
+ *dirents = gdb.dirents;
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/update.c b/subversion/libsvn_ra_serf/update.c
index 88488ff..8313af0 100644
--- a/subversion/libsvn_ra_serf/update.c
+++ b/subversion/libsvn_ra_serf/update.c
@@ -49,6 +49,7 @@
#include "ra_serf.h"
#include "../libsvn_ra/ra_loader.h"
+
/*
* This enum represents the current state of our XML parsing for a REPORT.
@@ -63,23 +64,180 @@
* the tag is 'closed', the pool will be reused.
*/
typedef enum report_state_e {
- NONE = 0,
- INITIAL = 0,
- UPDATE_REPORT,
- TARGET_REVISION,
- OPEN_DIR,
- ADD_DIR,
- ABSENT_DIR,
- OPEN_FILE,
- ADD_FILE,
- ABSENT_FILE,
- PROP,
- IGNORE_PROP_NAME,
- NEED_PROP_NAME,
- TXDELTA
+ INITIAL = XML_STATE_INITIAL /* = 0 */,
+ UPDATE_REPORT,
+ TARGET_REVISION,
+
+ OPEN_DIR,
+ ADD_DIR,
+
+ OPEN_FILE,
+ ADD_FILE,
+
+ DELETE_ENTRY,
+ ABSENT_DIR,
+ ABSENT_FILE,
+
+ SET_PROP,
+ REMOVE_PROP,
+
+ PROP,
+
+ FETCH_FILE,
+ FETCH_PROPS,
+ TXDELTA,
+
+ CHECKED_IN,
+ CHECKED_IN_HREF,
+
+ MD5_CHECKSUM,
+
+ VERSION_NAME,
+ CREATIONDATE,
+ CREATOR_DISPLAYNAME
} report_state_e;
+#define D_ "DAV:"
+#define S_ SVN_XML_NAMESPACE
+#define V_ SVN_DAV_PROP_NS_DAV
+static const svn_ra_serf__xml_transition_t update_ttable[] = {
+ { INITIAL, S_, "update-report", UPDATE_REPORT,
+ FALSE, { "?inline-props", "?send-all", NULL }, TRUE },
+
+ { UPDATE_REPORT, S_, "target-revision", TARGET_REVISION,
+ FALSE, { "rev", NULL }, TRUE },
+
+ { UPDATE_REPORT, S_, "open-directory", OPEN_DIR,
+ FALSE, { "rev", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "open-directory", OPEN_DIR,
+ FALSE, { "rev", "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "open-directory", OPEN_DIR,
+ FALSE, { "rev", "name", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "add-directory", ADD_DIR,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev", /*"?bc-url",*/
+ NULL }, TRUE },
+
+ { ADD_DIR, S_, "add-directory", ADD_DIR,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev", /*"?bc-url",*/
+ NULL }, TRUE },
+
+ { OPEN_DIR, S_, "open-file", OPEN_FILE,
+ FALSE, { "rev", "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "open-file", OPEN_FILE,
+ FALSE, { "rev", "name", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "add-file", ADD_FILE,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev",
+ "?sha1-checksum", NULL }, TRUE },
+
+ { ADD_DIR, S_, "add-file", ADD_FILE,
+ FALSE, { "name", "?copyfrom-path", "?copyfrom-rev",
+ "?sha1-checksum", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "delete-entry", DELETE_ENTRY,
+ FALSE, { "?rev", "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "delete-entry", DELETE_ENTRY,
+ FALSE, { "?rev", "name", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "absent-directory", ABSENT_DIR,
+ FALSE, { "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "absent-directory", ABSENT_DIR,
+ FALSE, { "name", NULL }, TRUE },
+
+ { OPEN_DIR, S_, "absent-file", ABSENT_FILE,
+ FALSE, { "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "absent-file", ABSENT_FILE,
+ FALSE, { "name", NULL }, TRUE },
+
+
+ { OPEN_DIR, D_, "checked-in", CHECKED_IN,
+ FALSE, { NULL }, FALSE },
+
+ { ADD_DIR, D_, "checked-in", CHECKED_IN,
+ FALSE, { NULL }, FALSE },
+
+ { OPEN_FILE, D_, "checked-in", CHECKED_IN,
+ FALSE, { NULL }, FALSE },
+
+ { ADD_FILE, D_, "checked-in", CHECKED_IN,
+ FALSE, { NULL }, FALSE },
+
+
+ { OPEN_DIR, S_, "set-prop", SET_PROP,
+ TRUE, { "name", "?encoding", NULL }, TRUE },
+
+ { ADD_DIR, S_, "set-prop", SET_PROP,
+ TRUE, { "name", "?encoding", NULL }, TRUE },
+
+ { OPEN_FILE, S_, "set-prop", SET_PROP,
+ TRUE, { "name", "?encoding", NULL }, TRUE },
+
+ { ADD_FILE, S_, "set-prop", SET_PROP,
+ TRUE, { "name", "?encoding", NULL }, TRUE },
+
+
+ { OPEN_DIR, S_, "remove-prop", REMOVE_PROP,
+ TRUE, { "name", NULL }, TRUE },
+
+ { ADD_DIR, S_, "remove-prop", REMOVE_PROP,
+ TRUE, { "name", NULL }, TRUE },
+
+ { OPEN_FILE, S_, "remove-prop", REMOVE_PROP,
+ TRUE, { "name", NULL }, TRUE },
+
+ { ADD_FILE, S_, "remove-prop", REMOVE_PROP,
+ TRUE, { "name", NULL }, TRUE },
+
+ { OPEN_FILE, S_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+ { OPEN_DIR, S_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+ { ADD_FILE, S_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+ { ADD_DIR, S_, "prop", PROP,
+ FALSE, { NULL }, FALSE },
+
+ { OPEN_FILE, S_, "txdelta", TXDELTA,
+ FALSE, { "?base-checksum" }, TRUE },
+
+ { ADD_FILE, S_, "txdelta", TXDELTA,
+ FALSE, { "?base-checksum" }, TRUE },
+
+ { OPEN_FILE, S_, "fetch-file", FETCH_FILE,
+ FALSE, { "?base-checksum", "?sha1-checksum", NULL }, TRUE},
+
+ { ADD_FILE, S_, "fetch-file", FETCH_FILE,
+ FALSE, { "?base-checksum", "?sha1-checksum", NULL }, TRUE },
+
+ { CHECKED_IN, D_, "href", CHECKED_IN_HREF,
+ TRUE, { NULL }, TRUE },
+
+ { PROP, V_, "md5-checksum", MD5_CHECKSUM,
+ TRUE, { NULL }, TRUE },
+
+ /* These are only reported for <= 1.6.x mod_dav_svn */
+ { OPEN_DIR, S_, "fetch-props", FETCH_PROPS,
+ FALSE, { NULL }, FALSE },
+ { OPEN_FILE, S_, "fetch-props", FETCH_PROPS,
+ FALSE, { NULL }, FALSE },
+
+ { PROP, D_, "version-name", VERSION_NAME,
+ TRUE, { NULL }, TRUE },
+ { PROP, D_, "creationdate", CREATIONDATE,
+ TRUE, { NULL }, TRUE },
+ { PROP, D_, "creator-displayname", CREATOR_DISPLAYNAME,
+ TRUE, { NULL }, TRUE },
+ { 0 }
+};
+
/* While we process the REPORT response, we will queue up GET and PROPFIND
requests. For a very large checkout, it is very easy to queue requests
faster than they are resolved. Thus, we need to pause the XML processing
@@ -97,175 +255,120 @@ typedef enum report_state_e {
#define REQUEST_COUNT_TO_PAUSE 50
#define REQUEST_COUNT_TO_RESUME 40
+#define SPILLBUF_BLOCKSIZE 4096
+#define SPILLBUF_MAXBUFFSIZE 131072
+
+#define PARSE_CHUNK_SIZE 8000 /* Copied from xml.c ### Needs tuning */
/* Forward-declare our report context. */
typedef struct report_context_t report_context_t;
-
+typedef struct body_create_baton_t body_create_baton_t;
/*
* This structure represents the information for a directory.
*/
-typedef struct report_dir_t
+typedef struct dir_baton_t
{
- /* Our parent directory.
- *
- * This value is NULL when we are the root.
- */
- struct report_dir_t *parent_dir;
+ struct dir_baton_t *parent_dir; /* NULL when root */
- apr_pool_t *pool;
+ apr_pool_t *pool; /* Subpool for this directory */
/* Pointer back to our original report context. */
- report_context_t *report_context;
-
- /* Our name sans any parents. */
- const char *base_name;
+ report_context_t *ctx;
- /* the expanded directory name (including all parent names) */
- const char *name;
+ const char *relpath; /* session relative path */
+ const char *base_name; /* Name of item "" for root */
/* the canonical url for this directory after updating. (received) */
const char *url;
- /* The original repos_relpath of this url (from the working copy)
- or NULL if the repos_relpath can be calculated from the edit root. */
+ /* The original repos_relpath of this url (via the reporter)
+ directly, or via an ancestor. */
const char *repos_relpath;
- /* Our base revision - SVN_INVALID_REVNUM if we're adding this dir. */
- svn_revnum_t base_rev;
+ svn_revnum_t base_rev; /* base revision or NULL for Add */
+
+ const char *copyfrom_path; /* NULL for open */
+ svn_revnum_t copyfrom_rev; /* SVN_INVALID_REVNUM for open */
/* controlling dir baton - this is only created in ensure_dir_opened() */
+ svn_boolean_t dir_opened;
void *dir_baton;
- apr_pool_t *dir_baton_pool;
/* How many references to this directory do we still have open? */
apr_size_t ref_count;
- /* Namespace list allocated out of this ->pool. */
- svn_ra_serf__ns_t *ns_list;
-
- /* hashtable for all of the properties (shared within a dir) */
- apr_hash_t *props;
-
- /* hashtable for all to-be-removed properties (shared within a dir) */
- apr_hash_t *removed_props;
-
- /* The propfind request for our current directory */
+ svn_boolean_t fetch_props; /* Use PROPFIND request? */
svn_ra_serf__handler_t *propfind_handler;
+ apr_hash_t *remove_props;
- /* Has the server told us to fetch the dir props? */
- svn_boolean_t fetch_props;
-
- /* Have we closed the directory tag (meaning no more additions)? */
- svn_boolean_t tag_closed;
-
- /* The children of this directory */
- struct report_dir_t *children;
-
- /* The next sibling of this directory */
- struct report_dir_t *sibling;
-} report_dir_t;
+} dir_baton_t;
/*
- * This structure represents the information for a file.
- *
- * A directory may have a report_info_t associated with it as well.
- *
- * This structure is created as we parse the REPORT response and
- * once the element is completed, we create a report_fetch_t structure
- * to give to serf to retrieve this file.
- */
-typedef struct report_info_t
+* This structure represents the information for a file.
+*
+* This structure is created as we parse the REPORT response and
+* once the element is completed, we may create a fetch_ctx_t structure
+* to give to serf to retrieve this file.
+*/
+typedef struct file_baton_t
{
- apr_pool_t *pool;
-
- /* The enclosing directory.
- *
- * If this structure refers to a directory, the dir it points to will be
- * itself.
- */
- report_dir_t *dir;
+ dir_baton_t *parent_dir; /* The parent */
+ apr_pool_t *pool; /* Subpool for this file*/
- /* Our name sans any directory info. */
+ const char *relpath; /* session relative path */
const char *base_name;
- /* the expanded file name (including all parent directory names) */
- const char *name;
-
- /* the canonical url for this file. */
+ /* the canonical url for this directory after updating. (received) */
const char *url;
+ /* The original repos_relpath of this url as reported. */
+ const char *repos_relpath;
+
/* lock token, if we had one to start off with. */
const char *lock_token;
- /* Our base revision - SVN_INVALID_REVNUM if we're adding this file. */
- svn_revnum_t base_rev;
-
- /* our delta base, if present (NULL if we're adding the file) */
- const char *delta_base;
+ svn_revnum_t base_rev; /* SVN_INVALID_REVNUM for Add */
- /* Path of original item if add with history */
- const char *copyfrom_path;
+ const char *copyfrom_path; /* NULL for open */
+ svn_revnum_t copyfrom_rev; /* SVN_INVALID_REVNUM for open */
- /* Revision of original item if add with history */
- svn_revnum_t copyfrom_rev;
+ /* controlling dir baton - this is only created in ensure_file_opened() */
+ svn_boolean_t file_opened;
+ void *file_baton;
- /* The propfind request for our current file (if present) */
+ svn_boolean_t fetch_props; /* Use PROPFIND request? */
svn_ra_serf__handler_t *propfind_handler;
-
- /* Has the server told us to fetch the file props? */
- svn_boolean_t fetch_props;
+ svn_boolean_t found_lock_prop;
+ apr_hash_t *remove_props;
/* Has the server told us to go fetch - only valid if we had it already */
svn_boolean_t fetch_file;
- /* The properties for this file */
- apr_hash_t *props;
+ /* controlling file_baton and textdelta handler */
+ svn_txdelta_window_handler_t txdelta;
+ void *txdelta_baton;
- /* pool passed to update->add_file, etc. */
- apr_pool_t *editor_pool;
+ svn_checksum_t *base_md5_checksum;
+ svn_checksum_t *final_md5_checksum;
+ svn_checksum_t *final_sha1_checksum;
- /* controlling file_baton and textdelta handler */
- void *file_baton;
- const char *base_checksum;
- const char *final_sha1_checksum;
- svn_txdelta_window_handler_t textdelta;
- void *textdelta_baton;
- svn_stream_t *svndiff_decoder;
- svn_stream_t *base64_decoder;
-
- /* Checksum for close_file */
- const char *final_checksum;
-
- /* Stream containing file contents already cached in the working
- copy (which may be used to avoid a GET request for the same). */
- svn_stream_t *cached_contents;
-
- /* temporary property for this file which is currently being parsed
- * It will eventually be stored in our parent directory's property hash.
- */
- const char *prop_ns;
- const char *prop_name;
- svn_stringbuf_t *prop_value;
- const char *prop_encoding;
-} report_info_t;
+ svn_stream_t *txdelta_stream; /* Stream that feeds windows when
+ written to within txdelta*/
+} file_baton_t;
/*
* This structure represents a single request to GET (fetch) a file with
* its associated Serf session/connection.
*/
-typedef struct report_fetch_t {
+typedef struct fetch_ctx_t {
/* The handler representing this particular fetch. */
svn_ra_serf__handler_t *handler;
- /* The session we should use to fetch the file. */
- svn_ra_serf__session_t *sess;
-
- /* The connection we should use to fetch file. */
- svn_ra_serf__connection_t *conn;
+ svn_boolean_t using_compression;
/* Stores the information for the file we want to fetch. */
- report_info_t *info;
+ file_baton_t *file;
/* Have we read our response headers yet? */
svn_boolean_t read_headers;
@@ -279,22 +382,13 @@ typedef struct report_fetch_t {
/* This is the amount of data that we have read so far. */
apr_off_t read_size;
- /* If we're receiving an svndiff, this will be non-NULL. */
- svn_stream_t *delta_stream;
-
/* If we're writing this file to a stream, this will be non-NULL. */
- svn_stream_t *target_stream;
-
- /* Are we done fetching this file? */
- svn_boolean_t done;
-
- /* Discard the rest of the content? */
- svn_boolean_t discard;
+ svn_stream_t *result_stream;
- svn_ra_serf__list_t **done_list;
- svn_ra_serf__list_t done_item;
+ /* The base-rev header */
+ const char *delta_base;
-} report_fetch_t;
+} fetch_ctx_t;
/*
* The master structure for a REPORT request and response.
@@ -303,7 +397,6 @@ struct report_context_t {
apr_pool_t *pool;
svn_ra_serf__session_t *sess;
- svn_ra_serf__connection_t *conn;
/* Source path and destination path */
const char *source;
@@ -315,6 +408,10 @@ struct report_context_t {
/* What is the target revision that we want for this REPORT? */
svn_revnum_t target_rev;
+ /* Where are we (used while parsing) */
+ dir_baton_t *cur_dir;
+ file_baton_t *cur_file;
+
/* Have we been asked to ignore ancestry or textdeltas? */
svn_boolean_t ignore_ancestry;
svn_boolean_t text_deltas;
@@ -332,170 +429,305 @@ struct report_context_t {
/* Path -> const char *repos_relpath mapping */
apr_hash_t *switched_paths;
- /* Boolean indicating whether "" is switched.
- (This indicates that the we are updating a single file) */
- svn_boolean_t root_is_switched;
-
/* Our master update editor and baton. */
- const svn_delta_editor_t *update_editor;
- void *update_baton;
+ const svn_delta_editor_t *editor;
+ void *editor_baton;
/* The file holding request body for the REPORT.
*
* ### todo: It will be better for performance to store small
* request bodies (like 4k) in memory and bigger bodies on disk.
*/
- apr_file_t *body_file;
-
- /* root directory object */
- report_dir_t *root_dir;
+ svn_stream_t *body_template;
+ body_create_baton_t *body;
/* number of pending GET requests */
unsigned int num_active_fetches;
- /* completed fetches (contains report_fetch_t) */
- svn_ra_serf__list_t *done_fetches;
-
/* number of pending PROPFIND requests */
unsigned int num_active_propfinds;
- /* completed PROPFIND requests (contains svn_ra_serf__handler_t) */
- svn_ra_serf__list_t *done_propfinds;
- svn_ra_serf__list_t *done_dir_propfinds;
-
- /* list of outstanding prop changes (contains report_dir_t) */
- svn_ra_serf__list_t *active_dir_propfinds;
-
- /* list of files that only have prop changes (contains report_info_t) */
- svn_ra_serf__list_t *file_propchanges_only;
-
- /* The path to the REPORT request */
- const char *path;
-
/* Are we done parsing the REPORT response? */
svn_boolean_t done;
/* Did we receive all data from the network? */
svn_boolean_t report_received;
- /* Did we get a complete (non-truncated) report? */
- svn_boolean_t report_completed;
-
- /* The XML parser context for the REPORT response. */
- svn_ra_serf__xml_parser_t *parser_ctx;
-
/* Did we close the root directory? */
svn_boolean_t closed_root;
};
+/* Baton for collecting REPORT body. Depending on the size this
+ work is backed by a memory buffer (via serf buckets) or by
+ a file */
+struct body_create_baton_t
+{
+ apr_pool_t *result_pool;
+ apr_size_t total_bytes;
-#ifdef NOT_USED_YET
+ apr_pool_t *scratch_pool;
-#define D_ "DAV:"
-#define S_ SVN_XML_NAMESPACE
-static const svn_ra_serf__xml_transition_t update_ttable[] = {
- { INITIAL, S_, "update-report", UPDATE_REPORT,
- FALSE, { NULL }, FALSE },
+ serf_bucket_alloc_t *alloc;
+ serf_bucket_t *collect_bucket;
- { UPDATE_REPORT, S_, "target-revision", TARGET_REVISION,
- FALSE, { "rev", NULL }, TRUE },
+ const void *all_data;
+ apr_file_t *file;
+};
- { UPDATE_REPORT, S_, "open-directory", OPEN_DIR,
- FALSE, { "rev", NULL }, TRUE },
- { OPEN_DIR, S_, "open-directory", OPEN_DIR,
- FALSE, { "rev", "name", NULL }, TRUE },
+#define MAX_BODY_IN_RAM (256*1024)
- { OPEN_DIR, S_, "add-directory", ADD_DIR,
- FALSE, { "rev", "name", "?copyfrom-path", "?copyfrom-rev", NULL }, TRUE },
+/* Fold all previously collected data in a single buffer allocated in
+ RESULT_POOL and clear all intermediate state */
+static const char *
+body_allocate_all(body_create_baton_t *body,
+ apr_pool_t *result_pool)
+{
+ char *buffer = apr_pcalloc(result_pool, body->total_bytes);
+ const char *data;
+ apr_size_t sz;
+ apr_status_t s;
+ apr_size_t remaining = body->total_bytes;
+ char *next = buffer;
- { ADD_DIR, S_, "add-directory", ADD_DIR,
- FALSE, { "rev", "name", "?copyfrom-path", "?copyfrom-rev", NULL }, TRUE },
+ while (!(s = serf_bucket_read(body->collect_bucket, remaining, &data, &sz)))
+ {
+ memcpy(next, data, sz);
+ remaining -= sz;
+ next += sz;
- { OPEN_DIR, S_, "open-file", OPEN_FILE,
- FALSE, { "rev", "name", NULL }, TRUE },
+ if (! remaining)
+ break;
+ }
- { OPEN_DIR, S_, "add-file", ADD_FILE,
- FALSE, { "rev", "name", "?copyfrom-path", "?copyfrom-rev", NULL }, TRUE },
+ if (!SERF_BUCKET_READ_ERROR(s))
+ {
+ memcpy(next, data, sz);
+ }
- { ADD_DIR, S_, "add-file", ADD_FILE,
- FALSE, { "rev", "name", "?copyfrom-path", "?copyfrom-rev", NULL }, TRUE },
+ serf_bucket_destroy(body->collect_bucket);
+ body->collect_bucket = NULL;
- { OPEN_DIR, S_, "delete-entry", OPEN_FILE,
- FALSE, { "?rev", "name", NULL }, TRUE },
+ return (s != APR_EOF) ? NULL : buffer;
+}
- { OPEN_DIR, S_, "absent-directory", ABSENT_DIR,
- FALSE, { "name", NULL }, TRUE },
+/* Noop function. Make serf take care of freeing in error situations */
+static void serf_free_no_error(void *unfreed_baton, void *block) {}
- { ADD_DIR, S_, "absent-directory", ABSENT_DIR,
- FALSE, { "name", NULL }, TRUE },
+/* Stream write function for body creation */
+static svn_error_t *
+body_write_fn(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ body_create_baton_t *bcb = baton;
- { OPEN_DIR, S_, "absent-file", ABSENT_FILE,
- FALSE, { "name", NULL }, TRUE },
+ if (!bcb->scratch_pool)
+ bcb->scratch_pool = svn_pool_create(bcb->result_pool);
- { ADD_DIR, S_, "absent-file", ABSENT_FILE,
- FALSE, { "name", NULL }, TRUE },
+ if (bcb->file)
+ {
+ SVN_ERR(svn_io_file_write_full(bcb->file, data, *len, NULL,
+ bcb->scratch_pool));
+ svn_pool_clear(bcb->scratch_pool);
- { 0 }
-};
+ bcb->total_bytes += *len;
+ }
+ else if (*len + bcb->total_bytes > MAX_BODY_IN_RAM)
+ {
+ SVN_ERR(svn_io_open_unique_file3(&bcb->file, NULL, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ bcb->result_pool, bcb->scratch_pool));
+ if (bcb->total_bytes)
+ {
+ const char *all = body_allocate_all(bcb, bcb->scratch_pool);
+ SVN_ERR(svn_io_file_write_full(bcb->file, all, bcb->total_bytes,
+ NULL, bcb->scratch_pool));
+ }
-/* Conforms to svn_ra_serf__xml_opened_t */
-static svn_error_t *
-update_opened(svn_ra_serf__xml_estate_t *xes,
- void *baton,
- int entered_state,
- const svn_ra_serf__dav_props_t *tag,
- apr_pool_t *scratch_pool)
-{
- report_context_t *ctx = baton;
+ SVN_ERR(svn_io_file_write_full(bcb->file, data, *len, NULL,
+ bcb->scratch_pool));
+ bcb->total_bytes += *len;
+ }
+ else
+ {
+ if (!bcb->alloc)
+ bcb->alloc = serf_bucket_allocator_create(bcb->scratch_pool,
+ serf_free_no_error, NULL);
+
+ if (!bcb->collect_bucket)
+ bcb->collect_bucket = serf_bucket_aggregate_create(bcb->alloc);
+
+ serf_bucket_aggregate_append(bcb->collect_bucket,
+ serf_bucket_simple_copy_create(data, *len,
+ bcb->alloc));
+
+ bcb->total_bytes += *len;
+ }
return SVN_NO_ERROR;
}
+/* Stream close function for collecting body */
+static svn_error_t *
+body_done_fn(void *baton)
+{
+ body_create_baton_t *bcb = baton;
+ if (bcb->file)
+ {
+ /* We need to flush the file, make it unbuffered (so that it can be
+ * zero-copied via mmap), and reset the position before attempting
+ * to deliver the file.
+ *
+ * N.B. If we have APR 1.3+, we can unbuffer the file to let us use
+ * mmap and zero-copy the PUT body. However, on older APR versions,
+ * we can't check the buffer status; but serf will fall through and
+ * create a file bucket for us on the buffered handle.
+ */
+ SVN_ERR(svn_io_file_flush(bcb->file, bcb->scratch_pool));
+ apr_file_buffer_set(bcb->file, NULL, 0);
+ }
+ else if (bcb->collect_bucket)
+ bcb->all_data = body_allocate_all(bcb, bcb->result_pool);
+
+ if (bcb->scratch_pool)
+ svn_pool_destroy(bcb->scratch_pool);
+
+ return SVN_NO_ERROR;
+}
-/* Conforms to svn_ra_serf__xml_closed_t */
static svn_error_t *
-update_closed(svn_ra_serf__xml_estate_t *xes,
- void *baton,
- int leaving_state,
- const svn_string_t *cdata,
- apr_hash_t *attrs,
- apr_pool_t *scratch_pool)
+create_dir_baton(dir_baton_t **new_dir,
+ report_context_t *ctx,
+ const char *name,
+ apr_pool_t *scratch_pool)
{
- report_context_t *ctx = baton;
+ dir_baton_t *parent = ctx->cur_dir;
+ apr_pool_t *dir_pool;
+ dir_baton_t *dir;
- if (leaving_state == TARGET_REVISION)
+ if (parent)
+ dir_pool = svn_pool_create(parent->pool);
+ else
+ dir_pool = svn_pool_create(ctx->pool);
+
+ dir = apr_pcalloc(dir_pool, sizeof(*dir));
+ dir->pool = dir_pool;
+ dir->ctx = ctx;
+
+ if (parent)
{
- const char *rev = svn_hash_gets(attrs, "rev");
+ dir->parent_dir = parent;
+ parent->ref_count++;
+ }
- SVN_ERR(ctx->update_editor->set_target_revision(ctx->update_baton,
- SVN_STR_TO_REV(rev),
- ctx->sess->pool));
+ dir->relpath = parent ? svn_relpath_join(parent->relpath, name, dir_pool)
+ : apr_pstrdup(dir_pool, name);
+ dir->base_name = svn_relpath_basename(dir->relpath, NULL);
+
+ dir->repos_relpath = svn_hash_gets(ctx->switched_paths, dir->relpath);
+ if (!dir->repos_relpath)
+ {
+ if (parent)
+ dir->repos_relpath = svn_relpath_join(parent->repos_relpath, name,
+ dir_pool);
+ else
+ dir->repos_relpath = svn_uri_skip_ancestor(ctx->sess->repos_root_str,
+ ctx->sess->session_url_str,
+ dir_pool);
}
+ dir->base_rev = SVN_INVALID_REVNUM;
+ dir->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ dir->ref_count = 1;
+
+ ctx->cur_dir = dir;
+
+ *new_dir = dir;
return SVN_NO_ERROR;
}
-
-/* Conforms to svn_ra_serf__xml_cdata_t */
static svn_error_t *
-update_cdata(svn_ra_serf__xml_estate_t *xes,
- void *baton,
- int current_state,
- const char *data,
- apr_size_t len,
- apr_pool_t *scratch_pool)
+create_file_baton(file_baton_t **new_file,
+ report_context_t *ctx,
+ const char *name,
+ apr_pool_t *scratch_pool)
{
- report_context_t *ctx = baton;
+ dir_baton_t *parent = ctx->cur_dir;
+ apr_pool_t *file_pool;
+ file_baton_t *file;
+
+ file_pool = svn_pool_create(parent->pool);
+
+ file = apr_pcalloc(file_pool, sizeof(*file));
+ file->pool = file_pool;
+
+ file->parent_dir = parent;
+ parent->ref_count++;
+
+ file->relpath = svn_relpath_join(parent->relpath, name, file_pool);
+ file->base_name = svn_relpath_basename(file->relpath, NULL);
+
+ file->repos_relpath = svn_hash_gets(ctx->switched_paths, file->relpath);
+ if (!file->repos_relpath)
+ file->repos_relpath = svn_relpath_join(parent->repos_relpath, name,
+ file_pool);
+
+ /* Sane defaults */
+ file->base_rev = SVN_INVALID_REVNUM;
+ file->copyfrom_rev = SVN_INVALID_REVNUM;
+
+ *new_file = file;
+
+ ctx->cur_file = file;
return SVN_NO_ERROR;
}
-#endif /* NOT_USED_YET */
+/** Minimum nr. of outstanding requests needed before a new connection is
+ * opened. */
+#define REQS_PER_CONN 8
+/** This function creates a new connection for this serf session, but only
+ * if the number of NUM_ACTIVE_REQS > REQS_PER_CONN or if there currently is
+ * only one main connection open.
+ */
+static svn_error_t *
+open_connection_if_needed(svn_ra_serf__session_t *sess, int num_active_reqs)
+{
+ /* For each REQS_PER_CONN outstanding requests open a new connection, with
+ * a minimum of 1 extra connection. */
+ if (sess->num_conns == 1 ||
+ ((num_active_reqs / REQS_PER_CONN) > sess->num_conns))
+ {
+ int cur = sess->num_conns;
+ apr_status_t status;
+
+ sess->conns[cur] = apr_pcalloc(sess->pool, sizeof(*sess->conns[cur]));
+ sess->conns[cur]->bkt_alloc = serf_bucket_allocator_create(sess->pool,
+ NULL, NULL);
+ sess->conns[cur]->last_status_code = -1;
+ sess->conns[cur]->session = sess;
+ status = serf_connection_create2(&sess->conns[cur]->conn,
+ sess->context,
+ sess->session_url,
+ svn_ra_serf__conn_setup,
+ sess->conns[cur],
+ svn_ra_serf__conn_closed,
+ sess->conns[cur],
+ sess->pool);
+ if (status)
+ return svn_ra_serf__wrap_err(status, NULL);
+
+ sess->num_conns++;
+ }
+
+ return SVN_NO_ERROR;
+}
/* Returns best connection for fetching files/properties. */
static svn_ra_serf__connection_t *
@@ -520,391 +752,199 @@ get_best_connection(report_context_t *ctx)
if (ctx->report_received && (ctx->sess->max_connections > 2))
first_conn = 0;
- /* Currently, we just cycle connections. In the future we could
- store the number of pending requests on each connection, or
- perform other heuristics, to achieve better connection usage.
- (As an optimization, if there's only one available auxiliary
- connection to use, don't bother doing all the cur_conn math --
- just return that one connection.) */
+ /* If there's only one available auxiliary connection to use, don't bother
+ doing all the cur_conn math -- just return that one connection. */
if (ctx->sess->num_conns - first_conn == 1)
{
conn = ctx->sess->conns[first_conn];
}
else
{
+#if SERF_VERSION_AT_LEAST(1, 4, 0)
+ /* Often one connection is slower than others, e.g. because the server
+ process/thread has to do more work for the particular set of requests.
+ In the worst case, when REQUEST_COUNT_TO_RESUME requests are queued
+ on such a slow connection, ra_serf will completely stop sending
+ requests.
+
+ The method used here selects the connection with the least amount of
+ pending requests, thereby giving more work to lightly loaded server
+ processes.
+ */
+ int i, best_conn = first_conn;
+ unsigned int min = INT_MAX;
+ for (i = first_conn; i < ctx->sess->num_conns; i++)
+ {
+ serf_connection_t *sc = ctx->sess->conns[i]->conn;
+ unsigned int pending = serf_connection_pending_requests(sc);
+ if (pending < min)
+ {
+ min = pending;
+ best_conn = i;
+ }
+ }
+ conn = ctx->sess->conns[best_conn];
+#else
+ /* We don't know how many requests are pending per connection, so just
+ cycle them. */
conn = ctx->sess->conns[ctx->sess->cur_conn];
ctx->sess->cur_conn++;
if (ctx->sess->cur_conn >= ctx->sess->num_conns)
ctx->sess->cur_conn = first_conn;
+#endif
}
return conn;
}
-
-
-/** Report state management helper **/
-
-static report_info_t *
-push_state(svn_ra_serf__xml_parser_t *parser,
- report_context_t *ctx,
- report_state_e state)
-{
- report_info_t *info;
- apr_pool_t *info_parent_pool;
-
- svn_ra_serf__xml_push_state(parser, state);
-
- info = parser->state->private;
-
- /* Our private pool needs to be disjoint from the state pool. */
- if (!info)
- {
- info_parent_pool = ctx->pool;
- }
- else
- {
- info_parent_pool = info->pool;
- }
-
- if (state == OPEN_DIR || state == ADD_DIR)
- {
- report_info_t *new_info;
-
- new_info = apr_pcalloc(info_parent_pool, sizeof(*new_info));
- new_info->pool = svn_pool_create(info_parent_pool);
- new_info->lock_token = NULL;
- new_info->prop_value = svn_stringbuf_create_empty(new_info->pool);
-
- new_info->dir = apr_pcalloc(new_info->pool, sizeof(*new_info->dir));
- new_info->dir->pool = new_info->pool;
-
- /* Create the root property tree. */
- new_info->dir->props = apr_hash_make(new_info->pool);
- new_info->props = new_info->dir->props;
- new_info->dir->removed_props = apr_hash_make(new_info->pool);
-
- new_info->dir->report_context = ctx;
-
- if (info)
- {
- info->dir->ref_count++;
-
- new_info->dir->parent_dir = info->dir;
-
- /* Point our ns_list at our parents to try to reuse it. */
- new_info->dir->ns_list = info->dir->ns_list;
-
- /* Add ourselves to our parent's list */
- new_info->dir->sibling = info->dir->children;
- info->dir->children = new_info->dir;
- }
- else
- {
- /* Allow us to be found later. */
- ctx->root_dir = new_info->dir;
- }
-
- parser->state->private = new_info;
- }
- else if (state == OPEN_FILE || state == ADD_FILE)
- {
- report_info_t *new_info;
-
- new_info = apr_pcalloc(info_parent_pool, sizeof(*new_info));
- new_info->pool = svn_pool_create(info_parent_pool);
- new_info->file_baton = NULL;
- new_info->lock_token = NULL;
- new_info->fetch_file = FALSE;
- new_info->prop_value = svn_stringbuf_create_empty(new_info->pool);
-
- /* Point at our parent's directory state. */
- new_info->dir = info->dir;
- info->dir->ref_count++;
-
- new_info->props = apr_hash_make(new_info->pool);
-
- parser->state->private = new_info;
- }
-
- return parser->state->private;
-}
-
-
-/** Wrappers around our various property walkers **/
-
-static svn_error_t *
-set_file_props(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- report_info_t *info = baton;
- const svn_delta_editor_t *editor = info->dir->report_context->update_editor;
- const char *prop_name;
-
- prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
- if (prop_name != NULL)
- return svn_error_trace(editor->change_file_prop(info->file_baton,
- prop_name,
- val,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-
-static svn_error_t *
-set_dir_props(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- report_dir_t *dir = baton;
- const svn_delta_editor_t *editor = dir->report_context->update_editor;
- const char *prop_name;
-
- prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
- if (prop_name != NULL)
- return svn_error_trace(editor->change_dir_prop(dir->dir_baton,
- prop_name,
- val,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-
-static svn_error_t *
-remove_file_props(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- report_info_t *info = baton;
- const svn_delta_editor_t *editor = info->dir->report_context->update_editor;
- const char *prop_name;
-
- prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
- if (prop_name != NULL)
- return svn_error_trace(editor->change_file_prop(info->file_baton,
- prop_name,
- NULL,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-
-static svn_error_t *
-remove_dir_props(void *baton,
- const char *ns,
- const char *name,
- const svn_string_t *val,
- apr_pool_t *scratch_pool)
-{
- report_dir_t *dir = baton;
- const svn_delta_editor_t *editor = dir->report_context->update_editor;
- const char *prop_name;
-
- prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
- if (prop_name != NULL)
- return svn_error_trace(editor->change_dir_prop(dir->dir_baton,
- prop_name,
- NULL,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
/** Helpers to open and close directories */
static svn_error_t*
-ensure_dir_opened(report_dir_t *dir)
+ensure_dir_opened(dir_baton_t *dir,
+ apr_pool_t *scratch_pool)
{
- report_context_t *ctx = dir->report_context;
+ report_context_t *ctx = dir->ctx;
- /* if we're already open, return now */
- if (dir->dir_baton)
- {
- return SVN_NO_ERROR;
- }
+ if (dir->dir_opened)
+ return SVN_NO_ERROR;
if (dir->base_name[0] == '\0')
{
- dir->dir_baton_pool = svn_pool_create(dir->pool);
-
if (ctx->destination
&& ctx->sess->wc_callbacks->invalidate_wc_props)
{
SVN_ERR(ctx->sess->wc_callbacks->invalidate_wc_props(
ctx->sess->wc_callback_baton,
ctx->update_target,
- SVN_RA_SERF__WC_CHECKED_IN_URL, dir->pool));
+ SVN_RA_SERF__WC_CHECKED_IN_URL, scratch_pool));
}
- SVN_ERR(ctx->update_editor->open_root(ctx->update_baton, dir->base_rev,
- dir->dir_baton_pool,
- &dir->dir_baton));
+ SVN_ERR(ctx->editor->open_root(ctx->editor_baton, dir->base_rev,
+ dir->pool,
+ &dir->dir_baton));
}
else
{
- SVN_ERR(ensure_dir_opened(dir->parent_dir));
-
- dir->dir_baton_pool = svn_pool_create(dir->parent_dir->dir_baton_pool);
+ SVN_ERR(ensure_dir_opened(dir->parent_dir, scratch_pool));
if (SVN_IS_VALID_REVNUM(dir->base_rev))
{
- SVN_ERR(ctx->update_editor->open_directory(dir->name,
- dir->parent_dir->dir_baton,
- dir->base_rev,
- dir->dir_baton_pool,
- &dir->dir_baton));
+ SVN_ERR(ctx->editor->open_directory(dir->relpath,
+ dir->parent_dir->dir_baton,
+ dir->base_rev,
+ dir->pool,
+ &dir->dir_baton));
}
else
{
- SVN_ERR(ctx->update_editor->add_directory(dir->name,
- dir->parent_dir->dir_baton,
- NULL, SVN_INVALID_REVNUM,
- dir->dir_baton_pool,
- &dir->dir_baton));
+ SVN_ERR(ctx->editor->add_directory(dir->relpath,
+ dir->parent_dir->dir_baton,
+ dir->copyfrom_path,
+ dir->copyfrom_rev,
+ dir->pool,
+ &dir->dir_baton));
}
}
+ dir->dir_opened = TRUE;
+
return SVN_NO_ERROR;
}
static svn_error_t *
-close_dir(report_dir_t *dir)
+maybe_close_dir(dir_baton_t *dir)
{
- report_dir_t *prev;
- report_dir_t *sibling;
-
- /* ### is there a better pool... this is tossed at end-of-func */
- apr_pool_t *scratch_pool = dir->dir_baton_pool;
+ apr_pool_t *scratch_pool = dir->pool;
+ dir_baton_t *parent = dir->parent_dir;
+ report_context_t *ctx = dir->ctx;
- SVN_ERR_ASSERT(! dir->ref_count);
-
- SVN_ERR(svn_ra_serf__walk_all_props(dir->props, dir->base_name,
- dir->base_rev,
- set_dir_props, dir,
- scratch_pool));
-
- SVN_ERR(svn_ra_serf__walk_all_props(dir->removed_props, dir->base_name,
- dir->base_rev, remove_dir_props, dir,
- scratch_pool));
-
- if (dir->fetch_props)
+ if (--dir->ref_count)
{
- SVN_ERR(svn_ra_serf__walk_all_props(dir->props, dir->url,
- dir->report_context->target_rev,
- set_dir_props, dir,
- scratch_pool));
+ return SVN_NO_ERROR;
}
- SVN_ERR(dir->report_context->update_editor->close_directory(
- dir->dir_baton, scratch_pool));
+ SVN_ERR(ensure_dir_opened(dir, dir->pool));
- /* remove us from our parent's children list */
- if (dir->parent_dir)
+ if (dir->remove_props)
{
- prev = NULL;
- sibling = dir->parent_dir->children;
+ apr_hash_index_t *hi;
- while (sibling != dir)
+ for (hi = apr_hash_first(scratch_pool, dir->remove_props);
+ hi;
+ hi = apr_hash_next(hi))
{
- prev = sibling;
- sibling = sibling->sibling;
- if (!sibling)
- SVN_ERR_MALFUNCTION();
- }
-
- if (!prev)
- {
- dir->parent_dir->children = dir->sibling;
- }
- else
- {
- prev->sibling = dir->sibling;
+ SVN_ERR(ctx->editor->change_file_prop(dir->dir_baton,
+ apr_hash_this_key(hi),
+ NULL /* value */,
+ scratch_pool));
}
}
- svn_pool_destroy(dir->dir_baton_pool);
- svn_pool_destroy(dir->pool);
+ SVN_ERR(dir->ctx->editor->close_directory(dir->dir_baton, scratch_pool));
- return SVN_NO_ERROR;
-}
+ svn_pool_destroy(dir->pool /* scratch_pool */);
-static svn_error_t *close_all_dirs(report_dir_t *dir)
-{
- while (dir->children)
- {
- SVN_ERR(close_all_dirs(dir->children));
- dir->ref_count--;
- }
-
- SVN_ERR_ASSERT(! dir->ref_count);
-
- SVN_ERR(ensure_dir_opened(dir));
-
- return close_dir(dir);
+ if (parent)
+ return svn_error_trace(maybe_close_dir(parent));
+ else
+ return SVN_NO_ERROR;
}
-
-/** Routines called when we are fetching a file */
-
-/* This function works around a bug in some older versions of
- * mod_dav_svn in that it will not send remove-prop in the update
- * report when a lock property disappears when send-all is false.
- *
- * Therefore, we'll try to look at our properties and see if there's
- * an active lock. If not, then we'll assume there isn't a lock
- * anymore.
- */
-static void
-check_lock(report_info_t *info)
+static svn_error_t *
+ensure_file_opened(file_baton_t *file,
+ apr_pool_t *scratch_pool)
{
- const char *lock_val;
+ const svn_delta_editor_t *editor = file->parent_dir->ctx->editor;
- lock_val = svn_ra_serf__get_ver_prop(info->props, info->url,
- info->dir->report_context->target_rev,
- "DAV:", "lockdiscovery");
+ if (file->file_opened)
+ return SVN_NO_ERROR;
- if (lock_val)
+ /* Ensure our parent is open. */
+ SVN_ERR(ensure_dir_opened(file->parent_dir, scratch_pool));
+
+ /* Open (or add) the file. */
+ if (SVN_IS_VALID_REVNUM(file->base_rev))
{
- char *new_lock;
- new_lock = apr_pstrdup(info->editor_pool, lock_val);
- apr_collapse_spaces(new_lock, new_lock);
- lock_val = new_lock;
+ SVN_ERR(editor->open_file(file->relpath,
+ file->parent_dir->dir_baton,
+ file->base_rev,
+ file->pool,
+ &file->file_baton));
}
-
- if (!lock_val || lock_val[0] == '\0')
+ else
{
- svn_string_t *str;
+ SVN_ERR(editor->add_file(file->relpath,
+ file->parent_dir->dir_baton,
+ file->copyfrom_path,
+ file->copyfrom_rev,
+ file->pool,
+ &file->file_baton));
+ }
- str = svn_string_ncreate("", 1, info->editor_pool);
+ file->file_opened = TRUE;
- svn_ra_serf__set_ver_prop(info->dir->removed_props, info->base_name,
- info->base_rev, "DAV:", "lock-token",
- str, info->dir->pool);
- }
+ return SVN_NO_ERROR;
}
+
+/** Routines called when we are fetching a file */
+
static svn_error_t *
headers_fetch(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
- report_fetch_t *fetch_ctx = baton;
+ fetch_ctx_t *fetch_ctx = baton;
/* note that we have old VC URL */
- if (SVN_IS_VALID_REVNUM(fetch_ctx->info->base_rev) &&
- fetch_ctx->info->delta_base)
+ if (fetch_ctx->delta_base)
{
serf_bucket_headers_setn(headers, SVN_DAV_DELTA_BASE_HEADER,
- fetch_ctx->info->delta_base);
+ fetch_ctx->delta_base);
serf_bucket_headers_setn(headers, "Accept-Encoding",
"svndiff1;q=0.9,svndiff;q=0.8");
}
- else if (fetch_ctx->sess->using_compression)
+ else if (fetch_ctx->using_compression)
{
serf_bucket_headers_setn(headers, "Accept-Encoding", "gzip");
}
@@ -918,7 +958,7 @@ cancel_fetch(serf_request_t *request,
int status_code,
void *baton)
{
- report_fetch_t *fetch_ctx = baton;
+ fetch_ctx_t *fetch_ctx = baton;
/* Uh-oh. Our connection died on us.
*
@@ -948,30 +988,6 @@ cancel_fetch(serf_request_t *request,
SVN_ERR_MALFUNCTION();
}
-static svn_error_t *
-error_fetch(serf_request_t *request,
- report_fetch_t *fetch_ctx,
- svn_error_t *err)
-{
- fetch_ctx->done = TRUE;
-
- fetch_ctx->done_item.data = fetch_ctx;
- fetch_ctx->done_item.next = *fetch_ctx->done_list;
- *fetch_ctx->done_list = &fetch_ctx->done_item;
-
- /* Discard the rest of this request
- (This makes sure it doesn't error when the request is aborted later) */
- serf_request_set_handler(request,
- svn_ra_serf__response_discard_handler, NULL);
-
- /* Some errors would be handled by serf; make sure they really make
- the update fail by wrapping it in a different error. */
- if (!SERF_BUCKET_READ_ERROR(err->apr_err))
- return svn_error_create(SVN_ERR_RA_SERF_WRAPPED_ERROR, err, NULL);
-
- return err;
-}
-
/* Wield the editor referenced by INFO to open (or add) the file
file also associated with INFO, setting properties on the file and
calling the editor's apply_textdelta() function on it if necessary
@@ -980,95 +996,92 @@ error_fetch(serf_request_t *request,
Callers will probably want to also see the function that serves
the opposite purpose of this one, close_updated_file(). */
static svn_error_t *
-open_updated_file(report_info_t *info,
- svn_boolean_t force_apply_textdelta,
+open_file_txdelta(file_baton_t *file,
apr_pool_t *scratch_pool)
{
- report_context_t *ctx = info->dir->report_context;
- const svn_delta_editor_t *update_editor = ctx->update_editor;
+ const svn_delta_editor_t *editor = file->parent_dir->ctx->editor;
- /* Ensure our parent is open. */
- SVN_ERR(ensure_dir_opened(info->dir));
- info->editor_pool = svn_pool_create(info->dir->dir_baton_pool);
+ SVN_ERR_ASSERT(file->txdelta == NULL);
- /* Expand our full name now if we haven't done so yet. */
- if (!info->name)
- {
- info->name = svn_relpath_join(info->dir->name, info->base_name,
- info->editor_pool);
- }
-
- /* Open (or add) the file. */
- if (SVN_IS_VALID_REVNUM(info->base_rev))
- {
- SVN_ERR(update_editor->open_file(info->name,
- info->dir->dir_baton,
- info->base_rev,
- info->editor_pool,
- &info->file_baton));
- }
- else
- {
- SVN_ERR(update_editor->add_file(info->name,
- info->dir->dir_baton,
- info->copyfrom_path,
- info->copyfrom_rev,
- info->editor_pool,
- &info->file_baton));
- }
-
- /* Check for lock information. */
- if (info->lock_token)
- check_lock(info);
+ SVN_ERR(ensure_file_opened(file, scratch_pool));
/* Get (maybe) a textdelta window handler for transmitting file
content changes. */
- if (info->fetch_file || force_apply_textdelta)
- {
- SVN_ERR(update_editor->apply_textdelta(info->file_baton,
- info->base_checksum,
- info->editor_pool,
- &info->textdelta,
- &info->textdelta_baton));
- }
+ SVN_ERR(editor->apply_textdelta(file->file_baton,
+ svn_checksum_to_cstring(
+ file->base_md5_checksum,
+ scratch_pool),
+ file->pool,
+ &file->txdelta,
+ &file->txdelta_baton));
return SVN_NO_ERROR;
}
-/* Close the file associated with INFO->file_baton, and cleanup other
- bits of that structure managed by open_updated_file(). */
+/* Close the file, handling loose ends and cleanup */
static svn_error_t *
-close_updated_file(report_info_t *info,
- apr_pool_t *scratch_pool)
+close_file(file_baton_t *file,
+ apr_pool_t *scratch_pool)
{
- report_context_t *ctx = info->dir->report_context;
+ dir_baton_t *parent_dir = file->parent_dir;
+ report_context_t *ctx = parent_dir->ctx;
+
+ SVN_ERR(ensure_file_opened(file, scratch_pool));
/* Set all of the properties we received */
- SVN_ERR(svn_ra_serf__walk_all_props(info->props,
- info->base_name,
- info->base_rev,
- set_file_props, info,
- scratch_pool));
- SVN_ERR(svn_ra_serf__walk_all_props(info->dir->removed_props,
- info->base_name,
- info->base_rev,
- remove_file_props, info,
- scratch_pool));
- if (info->fetch_props)
+ if (file->remove_props)
+ {
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(scratch_pool, file->remove_props);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ SVN_ERR(ctx->editor->change_file_prop(file->file_baton,
+ apr_hash_this_key(hi),
+ NULL /* value */,
+ scratch_pool));
+ }
+ }
+
+ /* Check for lock information. */
+
+ /* This works around a bug in some older versions of mod_dav_svn in that it
+ * will not send remove-prop in the update report when a lock property
+ * disappears when send-all is false.
+
+ ### Given that we only fetch props on additions, is this really necessary?
+ Or is it covering up old local copy bugs where we copied locks to other
+ paths? */
+ if (!ctx->add_props_included
+ && file->lock_token && !file->found_lock_prop
+ && SVN_IS_VALID_REVNUM(file->base_rev) /* file_is_added */)
+ {
+ SVN_ERR(ctx->editor->change_file_prop(file->file_baton,
+ SVN_PROP_ENTRY_LOCK_TOKEN,
+ NULL,
+ scratch_pool));
+ }
+
+ if (file->url)
{
- SVN_ERR(svn_ra_serf__walk_all_props(info->props,
- info->url,
- ctx->target_rev,
- set_file_props, info,
- scratch_pool));
+ SVN_ERR(ctx->editor->change_file_prop(file->file_baton,
+ SVN_RA_SERF__WC_CHECKED_IN_URL,
+ svn_string_create(file->url,
+ scratch_pool),
+ scratch_pool));
}
/* Close the file via the editor. */
- SVN_ERR(info->dir->report_context->update_editor->close_file(
- info->file_baton, info->final_checksum, scratch_pool));
+ SVN_ERR(ctx->editor->close_file(file->file_baton,
+ svn_checksum_to_cstring(
+ file->final_md5_checksum,
+ scratch_pool),
+ scratch_pool));
+
+ svn_pool_destroy(file->pool);
- /* We're done with our editor pool. */
- svn_pool_destroy(info->editor_pool);
+ SVN_ERR(maybe_close_dir(parent_dir)); /* Remove reference */
return SVN_NO_ERROR;
}
@@ -1083,8 +1096,8 @@ handle_fetch(serf_request_t *request,
const char *data;
apr_size_t len;
apr_status_t status;
- report_fetch_t *fetch_ctx = handler_baton;
- svn_error_t *err;
+ fetch_ctx_t *fetch_ctx = handler_baton;
+ file_baton_t *file = fetch_ctx->file;
/* ### new field. make sure we didn't miss some initialization. */
SVN_ERR_ASSERT(fetch_ctx->handler != NULL);
@@ -1093,50 +1106,53 @@ handle_fetch(serf_request_t *request,
{
serf_bucket_t *hdrs;
const char *val;
- report_info_t *info;
+
+ /* If the error code wasn't 200, something went wrong. Don't use the
+ * returned data as its probably an error message. Just bail out instead.
+ */
+ if (fetch_ctx->handler->sline.code != 200)
+ {
+ fetch_ctx->handler->discard_body = TRUE;
+ return SVN_NO_ERROR; /* Will return an error in the DONE handler */
+ }
hdrs = serf_bucket_response_get_headers(response);
val = serf_bucket_headers_get(hdrs, "Content-Type");
- info = fetch_ctx->info;
if (val && svn_cstring_casecmp(val, SVN_SVNDIFF_MIME_TYPE) == 0)
{
- fetch_ctx->delta_stream =
- svn_txdelta_parse_svndiff(info->textdelta,
- info->textdelta_baton,
- TRUE, info->editor_pool);
+ fetch_ctx->result_stream =
+ svn_txdelta_parse_svndiff(file->txdelta,
+ file->txdelta_baton,
+ TRUE, file->pool);
/* Validate the delta base claimed by the server matches
what we asked for! */
val = serf_bucket_headers_get(hdrs, SVN_DAV_DELTA_BASE_HEADER);
- if (val && (strcmp(val, info->delta_base) != 0))
+ if (val && fetch_ctx->delta_base == NULL)
+ {
+ /* We recieved response with delta base header while we didn't
+ requested it -- report it as error. */
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("GET request returned unexpected "
+ "delta base: %s"), val);
+ }
+ else if (val && (strcmp(val, fetch_ctx->delta_base) != 0))
{
- err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("GET request returned unexpected "
- "delta base: %s"), val);
- return error_fetch(request, fetch_ctx, err);
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("GET request returned unexpected "
+ "delta base: %s"), val);
}
}
else
{
- fetch_ctx->delta_stream = NULL;
+ fetch_ctx->result_stream = NULL;
}
fetch_ctx->read_headers = TRUE;
}
- /* If the error code wasn't 200, something went wrong. Don't use the returned
- data as its probably an error message. Just bail out instead. */
- if (fetch_ctx->handler->sline.code != 200)
- {
- err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("GET request failed: %d %s"),
- fetch_ctx->handler->sline.code,
- fetch_ctx->handler->sline.reason);
- return error_fetch(request, fetch_ctx, err);
- }
-
- while (1)
+ while (TRUE)
{
svn_txdelta_window_t delta_window = { 0 };
svn_txdelta_op_t delta_op;
@@ -1163,10 +1179,9 @@ handle_fetch(serf_request_t *request,
}
/* Skip on to the next iteration of this loop. */
- if (APR_STATUS_IS_EAGAIN(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
+ if (status /* includes EAGAIN */)
+ return svn_ra_serf__wrap_err(status, NULL);
+
continue;
}
@@ -1176,17 +1191,12 @@ handle_fetch(serf_request_t *request,
/* Update data and len to just provide the new data. */
skip = len - (fetch_ctx->read_size - fetch_ctx->aborted_read_size);
data += skip;
- len -= skip;
+ len -= (apr_size_t)skip;
}
- if (fetch_ctx->delta_stream)
- {
- err = svn_stream_write(fetch_ctx->delta_stream, data, &len);
- if (err)
- {
- return error_fetch(request, fetch_ctx, err);
- }
- }
+ if (fetch_ctx->result_stream)
+ SVN_ERR(svn_stream_write(fetch_ctx->result_stream, data, &len));
+
/* otherwise, manually construct the text delta window. */
else if (len)
{
@@ -1203,378 +1213,271 @@ handle_fetch(serf_request_t *request,
delta_window.new_data = &window_data;
/* write to the file located in the info. */
- err = fetch_ctx->info->textdelta(&delta_window,
- fetch_ctx->info->textdelta_baton);
- if (err)
- {
- return error_fetch(request, fetch_ctx, err);
- }
+ SVN_ERR(file->txdelta(&delta_window, file->txdelta_baton));
}
if (APR_STATUS_IS_EOF(status))
{
- report_info_t *info = fetch_ctx->info;
-
- if (fetch_ctx->delta_stream)
- err = svn_error_trace(svn_stream_close(fetch_ctx->delta_stream));
+ if (fetch_ctx->result_stream)
+ SVN_ERR(svn_stream_close(fetch_ctx->result_stream));
else
- err = svn_error_trace(info->textdelta(NULL,
- info->textdelta_baton));
- if (err)
- {
- return error_fetch(request, fetch_ctx, err);
- }
-
- err = close_updated_file(info, info->pool);
- if (err)
- {
- return svn_error_trace(error_fetch(request, fetch_ctx, err));
- }
-
- fetch_ctx->done = TRUE;
-
- fetch_ctx->done_item.data = fetch_ctx;
- fetch_ctx->done_item.next = *fetch_ctx->done_list;
- *fetch_ctx->done_list = &fetch_ctx->done_item;
-
- /* We're done with our pool. */
- svn_pool_destroy(info->pool);
-
- if (status)
- return svn_ra_serf__wrap_err(status, NULL);
- }
- if (APR_STATUS_IS_EAGAIN(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
+ SVN_ERR(file->txdelta(NULL, file->txdelta_baton));
}
+
+ /* Report EOF, EEAGAIN and other special errors to serf */
+ if (status)
+ return svn_ra_serf__wrap_err(status, NULL);
}
- /* not reached */
}
-/* Implements svn_ra_serf__response_handler_t */
-static svn_error_t *
-handle_stream(serf_request_t *request,
- serf_bucket_t *response,
- void *handler_baton,
- apr_pool_t *pool)
-{
- report_fetch_t *fetch_ctx = handler_baton;
- svn_error_t *err;
- apr_status_t status;
-
- /* ### new field. make sure we didn't miss some initialization. */
- SVN_ERR_ASSERT(fetch_ctx->handler != NULL);
+/* --------------------------------------------------------- */
- err = svn_ra_serf__error_on_status(fetch_ctx->handler->sline,
- fetch_ctx->info->name,
- fetch_ctx->handler->location);
- if (err)
- {
- fetch_ctx->handler->done = TRUE;
+/** Wrappers around our various property walkers **/
- err = svn_error_compose_create(
- err,
- svn_ra_serf__handle_discard_body(request, response, NULL, pool));
+/* Implements svn_ra_serf__prop_func */
+static svn_error_t *
+set_file_props(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *val,
+ apr_pool_t *scratch_pool)
+{
+ file_baton_t *file = baton;
+ report_context_t *ctx = file->parent_dir->ctx;
+ const char *prop_name;
- return svn_error_trace(err);
- }
+ prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
- while (1)
+ if (!prop_name)
{
- const char *data;
- apr_size_t len;
-
- status = serf_bucket_read(response, 8000, &data, &len);
- if (SERF_BUCKET_READ_ERROR(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
-
- fetch_ctx->read_size += len;
-
- if (fetch_ctx->aborted_read)
+ /* This works around a bug in some older versions of
+ * mod_dav_svn in that it will not send remove-prop in the update
+ * report when a lock property disappears when send-all is false.
+ *
+ * Therefore, we'll try to look at our properties and see if there's
+ * an active lock. If not, then we'll assume there isn't a lock
+ * anymore.
+ */
+ /* assert(!ctx->add_props_included); // Or we wouldn't be here */
+ if (file->lock_token
+ && !file->found_lock_prop
+ && val
+ && strcmp(ns, "DAV:") == 0
+ && strcmp(name, "lockdiscovery") == 0)
{
- /* We haven't caught up to where we were before. */
- if (fetch_ctx->read_size < fetch_ctx->aborted_read_size)
- {
- /* Eek. What did the file shrink or something? */
- if (APR_STATUS_IS_EOF(status))
- {
- SVN_ERR_MALFUNCTION();
- }
-
- /* Skip on to the next iteration of this loop. */
- if (APR_STATUS_IS_EAGAIN(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
- continue;
- }
+ char *new_lock;
+ new_lock = apr_pstrdup(scratch_pool, val->data);
+ apr_collapse_spaces(new_lock, new_lock);
- /* Woo-hoo. We're back. */
- fetch_ctx->aborted_read = FALSE;
-
- /* Increment data and len by the difference. */
- data += fetch_ctx->read_size - fetch_ctx->aborted_read_size;
- len += fetch_ctx->read_size - fetch_ctx->aborted_read_size;
+ if (new_lock[0] != '\0')
+ file->found_lock_prop = TRUE;
}
- if (len)
- {
- apr_size_t written_len;
-
- written_len = len;
+ return SVN_NO_ERROR;
+ }
- SVN_ERR(svn_stream_write(fetch_ctx->target_stream, data,
- &written_len));
- }
+ SVN_ERR(ensure_file_opened(file, scratch_pool));
- if (APR_STATUS_IS_EOF(status))
- {
- fetch_ctx->done = TRUE;
- }
+ SVN_ERR(ctx->editor->change_file_prop(file->file_baton,
+ prop_name, val,
+ scratch_pool));
- if (status)
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
- }
- /* not reached */
+ return SVN_NO_ERROR;
}
-/* Close the directory represented by DIR -- and any suitable parents
- thereof -- if we are able to do so. This is the case whenever:
-
- - there are no remaining open items within the directory, and
- - the directory's XML close tag has been processed (so we know
- there are no more children to worry about in the future), and
- - either:
- - we aren't fetching properties for this directory, or
- - we've already finished fetching those properties.
-*/
+/* Implements svn_ra_serf__response_done_delegate_t */
static svn_error_t *
-maybe_close_dir_chain(report_dir_t *dir)
+file_props_done(serf_request_t *request,
+ void *baton,
+ apr_pool_t *scratch_pool)
{
- report_dir_t *cur_dir = dir;
+ file_baton_t *file = baton;
+ svn_ra_serf__handler_t *handler = file->propfind_handler;
- SVN_ERR(ensure_dir_opened(cur_dir));
+ if (handler->server_error)
+ return svn_error_trace(svn_ra_serf__server_error_create(handler,
+ scratch_pool));
- while (cur_dir
- && !cur_dir->ref_count
- && cur_dir->tag_closed
- && (!cur_dir->fetch_props || cur_dir->propfind_handler->done))
- {
- report_dir_t *parent = cur_dir->parent_dir;
- report_context_t *report_context = cur_dir->report_context;
- svn_boolean_t propfind_in_done_list = FALSE;
- svn_ra_serf__list_t *done_list;
-
- /* Make sure there are no references to this dir in the
- active_dir_propfinds list. If there are, don't close the
- directory -- which would delete the pool from which the
- relevant active_dir_propfinds list item is allocated -- and
- of course don't crawl upward to check the parents for
- a closure opportunity, either. */
- done_list = report_context->active_dir_propfinds;
- while (done_list)
- {
- if (done_list->data == cur_dir)
- {
- propfind_in_done_list = TRUE;
- break;
- }
- done_list = done_list->next;
- }
- if (propfind_in_done_list)
- break;
+ if (handler->sline.code != 207)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- SVN_ERR(close_dir(cur_dir));
- if (parent)
- {
- parent->ref_count--;
- }
- else
- {
- report_context->closed_root = TRUE;
- }
- cur_dir = parent;
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Open the file associated with INFO for editing, pass along any
- propchanges we've recorded for it, and then close the file. */
-static svn_error_t *
-handle_propchange_only(report_info_t *info,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR(open_updated_file(info, FALSE, scratch_pool));
- SVN_ERR(close_updated_file(info, scratch_pool));
+ file->parent_dir->ctx->num_active_propfinds--;
- /* We're done with our pool. */
- svn_pool_destroy(info->pool);
+ file->fetch_props = FALSE;
- info->dir->ref_count--;
+ if (file->fetch_file)
+ return SVN_NO_ERROR; /* Still processing file request */
- /* See if the parent directory of this file (and perhaps even
- parents of that) can be closed now. */
- SVN_ERR(maybe_close_dir_chain(info->dir));
+ /* Closing the file will automatically deliver the propfind props.
+ *
+ * Note that closing the directory may dispose the pool containing the
+ * handler, which is only a valid operation in this callback, as only
+ * after this callback our serf plumbing assumes the request is done. */
- return SVN_NO_ERROR;
+ return svn_error_trace(close_file(file, scratch_pool));
}
-/* "Fetch" a file whose contents were made available via the
- get_wc_contents() callback (as opposed to requiring a GET to the
- server), and feed the information through the associated update
- editor. In editor-speak, this will add/open the file, transmit any
- property changes, handle the contents, and then close the file. */
static svn_error_t *
-handle_local_content(report_info_t *info,
- apr_pool_t *scratch_pool)
+file_fetch_done(serf_request_t *request,
+ void *baton,
+ apr_pool_t *scratch_pool)
{
- SVN_ERR(svn_txdelta_send_stream(info->cached_contents, info->textdelta,
- info->textdelta_baton, NULL, scratch_pool));
- SVN_ERR(svn_stream_close(info->cached_contents));
- info->cached_contents = NULL;
- SVN_ERR(close_updated_file(info, scratch_pool));
+ fetch_ctx_t *fetch_ctx = baton;
+ file_baton_t *file = fetch_ctx->file;
+ svn_ra_serf__handler_t *handler = fetch_ctx->handler;
- /* We're done with our pool. */
- svn_pool_destroy(info->pool);
+ if (handler->server_error)
+ return svn_error_trace(svn_ra_serf__server_error_create(handler,
+ scratch_pool));
- info->dir->ref_count--;
+ if (handler->sline.code != 200)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- /* See if the parent directory of this fetched item (and
- perhaps even parents of that) can be closed now. */
- SVN_ERR(maybe_close_dir_chain(info->dir));
+ file->parent_dir->ctx->num_active_fetches--;
- return SVN_NO_ERROR;
-}
+ file->fetch_file = FALSE;
-/* --------------------------------------------------------- */
+ if (file->fetch_props)
+ return SVN_NO_ERROR; /* Still processing PROPFIND request */
+ /* Closing the file will automatically deliver the propfind props.
+ *
+ * Note that closing the directory may dispose the pool containing the
+ * handler, fetch_ctx, etc. which is only a valid operation in this
+ * callback, as only after this callback our serf plumbing assumes the
+ * request is done. */
+ return svn_error_trace(close_file(file, scratch_pool));
+}
+
+/* Initiates additional requests needed for a file when not in "send-all" mode.
+ */
static svn_error_t *
-fetch_file(report_context_t *ctx, report_info_t *info)
+fetch_for_file(file_baton_t *file,
+ apr_pool_t *scratch_pool)
{
+ report_context_t *ctx = file->parent_dir->ctx;
svn_ra_serf__connection_t *conn;
svn_ra_serf__handler_t *handler;
+ /* Open extra connections if we have enough requests to send. */
+ if (ctx->sess->num_conns < ctx->sess->max_connections)
+ SVN_ERR(open_connection_if_needed(ctx->sess, ctx->num_active_fetches +
+ ctx->num_active_propfinds));
+
/* What connection should we go on? */
conn = get_best_connection(ctx);
- /* If needed, create the PROPFIND to retrieve the file's properties. */
- info->propfind_handler = NULL;
- if (info->fetch_props)
- {
- SVN_ERR(svn_ra_serf__deliver_props(&info->propfind_handler, info->props,
- ctx->sess, conn, info->url,
- ctx->target_rev, "0", all_props,
- &ctx->done_propfinds,
- info->dir->pool));
- SVN_ERR_ASSERT(info->propfind_handler);
-
- /* Create a serf request for the PROPFIND. */
- svn_ra_serf__request_create(info->propfind_handler);
-
- ctx->num_active_propfinds++;
- }
+ /* Note that we (still) use conn for both requests.. Should we send
+ them out on different connections? */
- /* If we've been asked to fetch the file or it's an add, do so.
- * Otherwise, handle the case where only the properties changed.
- */
- if (info->fetch_file && ctx->text_deltas)
+ if (file->fetch_file)
{
- svn_stream_t *contents = NULL;
+ SVN_ERR(open_file_txdelta(file, scratch_pool));
- /* Open the file for editing. */
- SVN_ERR(open_updated_file(info, FALSE, info->pool));
-
- if (info->textdelta == svn_delta_noop_window_handler)
+ if (!ctx->text_deltas
+ || file->txdelta == svn_delta_noop_window_handler)
{
- /* There is nobody looking for an actual stream.
-
- Just report an empty stream instead of fetching
- to be ingored data */
- info->cached_contents = svn_stream_empty(info->pool);
+ SVN_ERR(file->txdelta(NULL, file->txdelta_baton));
+ file->fetch_file = FALSE;
}
- else if (ctx->sess->wc_callbacks->get_wc_contents
- && info->final_sha1_checksum)
- {
- svn_error_t *err = NULL;
- svn_checksum_t *checksum = NULL;
-
- /* Parse the optional SHA1 checksum (1.7+) */
- err = svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
- info->final_sha1_checksum,
- info->pool);
- /* Okay so far? Let's try to get a stream on some readily
- available matching content. */
- if (!err && checksum)
- {
- err = ctx->sess->wc_callbacks->get_wc_contents(
- ctx->sess->wc_callback_baton, &contents,
- checksum, info->pool);
+ if (file->fetch_file
+ && file->final_sha1_checksum
+ && ctx->sess->wc_callbacks->get_wc_contents)
+ {
+ svn_error_t *err;
+ svn_stream_t *cached_contents = NULL;
- if (! err)
- info->cached_contents = contents;
- }
+ err = ctx->sess->wc_callbacks->get_wc_contents(
+ ctx->sess->wc_callback_baton,
+ &cached_contents,
+ file->final_sha1_checksum,
+ scratch_pool);
- if (err)
+ if (err || !cached_contents)
+ svn_error_clear(err); /* ### Can we return some/most errors? */
+ else
{
- /* Meh. Maybe we'll care one day why we're in an
- errorful state, but this codepath is optional. */
- svn_error_clear(err);
+ /* ### For debugging purposes we could validate the md5 here,
+ but our implementations in libsvn_client already do that
+ for us... */
+ SVN_ERR(svn_txdelta_send_stream(cached_contents,
+ file->txdelta,
+ file->txdelta_baton,
+ NULL, scratch_pool));
+ SVN_ERR(svn_stream_close(cached_contents));
+ file->fetch_file = FALSE;
}
}
- /* If the working copy can provide cached contents for this
- file, we don't have to fetch them from the server. */
- if (info->cached_contents)
+ if (file->fetch_file)
{
- /* If we'll be doing a PROPFIND for this file... */
- if (info->propfind_handler)
+ fetch_ctx_t *fetch_ctx;
+
+ /* Let's fetch the file with a GET request... */
+ SVN_ERR_ASSERT(file->url && file->repos_relpath);
+
+ /* Otherwise, we use a GET request for the file's contents. */
+
+ fetch_ctx = apr_pcalloc(file->pool, sizeof(*fetch_ctx));
+ fetch_ctx->file = file;
+ fetch_ctx->using_compression = ctx->sess->using_compression;
+
+ /* Can we somehow get away with just obtaining a DIFF? */
+ if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(ctx->sess))
{
- /* ... then we'll just leave ourselves a little "todo"
- about that fact (and we'll deal with the file content
- stuff later, after we've handled that PROPFIND
- response. */
- svn_ra_serf__list_t *list_item;
-
- list_item = apr_pcalloc(info->dir->pool, sizeof(*list_item));
- list_item->data = info;
- list_item->next = ctx->file_propchanges_only;
- ctx->file_propchanges_only = list_item;
+ /* If this file is switched vs the editor root we should provide
+ its real url instead of the one calculated from the session root.
+ */
+ if (SVN_IS_VALID_REVNUM(file->base_rev))
+ {
+ fetch_ctx->delta_base = apr_psprintf(file->pool, "%s/%ld/%s",
+ ctx->sess->rev_root_stub,
+ file->base_rev,
+ svn_path_uri_encode(
+ file->repos_relpath,
+ scratch_pool));
+ }
+ else if (file->copyfrom_path)
+ {
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(file->copyfrom_rev));
+
+ fetch_ctx->delta_base = apr_psprintf(file->pool, "%s/%ld/%s",
+ ctx->sess->rev_root_stub,
+ file->copyfrom_rev,
+ svn_path_uri_encode(
+ file->copyfrom_path+1,
+ scratch_pool));
+ }
}
- else
+ else if (ctx->sess->wc_callbacks->get_wc_prop)
{
- /* Otherwise, if we've no PROPFIND to do, we might as
- well take care of those locally accessible file
- contents now. */
- SVN_ERR(handle_local_content(info, info->pool));
+ /* If we have a WC, we might be able to dive all the way into the WC
+ * to get the previous URL so we can do a differential GET with the
+ * base URL.
+ */
+ const svn_string_t *value = NULL;
+ SVN_ERR(ctx->sess->wc_callbacks->get_wc_prop(
+ ctx->sess->wc_callback_baton,
+ file->relpath,
+ SVN_RA_SERF__WC_CHECKED_IN_URL,
+ &value, scratch_pool));
+
+ fetch_ctx->delta_base = value
+ ? apr_pstrdup(file->pool, value->data)
+ : NULL;
}
- }
- else
- {
- /* Otherwise, we use a GET request for the file's contents. */
- report_fetch_t *fetch_ctx;
- fetch_ctx = apr_pcalloc(info->dir->pool, sizeof(*fetch_ctx));
- fetch_ctx->info = info;
- fetch_ctx->done_list = &ctx->done_fetches;
- fetch_ctx->sess = ctx->sess;
- fetch_ctx->conn = conn;
+ handler = svn_ra_serf__create_handler(ctx->sess, file->pool);
- handler = apr_pcalloc(info->dir->pool, sizeof(*handler));
-
- handler->handler_pool = info->dir->pool;
handler->method = "GET";
- handler->path = fetch_ctx->info->url;
+ handler->path = file->url;
- handler->conn = conn;
- handler->session = ctx->sess;
+ handler->conn = conn; /* Explicit scheduling */
handler->custom_accept_encoding = TRUE;
+ handler->no_dav_headers = TRUE;
handler->header_delegate = headers_fetch;
handler->header_delegate_baton = fetch_ctx;
@@ -1584,6 +1487,9 @@ fetch_file(report_context_t *ctx, report_info_t *info)
handler->response_error = cancel_fetch;
handler->response_error_baton = fetch_ctx;
+ handler->done_delegate = file_fetch_done;
+ handler->done_delegate_baton = fetch_ctx;
+
fetch_ctx->handler = handler;
svn_ra_serf__request_create(handler);
@@ -1591,944 +1497,691 @@ fetch_file(report_context_t *ctx, report_info_t *info)
ctx->num_active_fetches++;
}
}
- else if (info->propfind_handler)
- {
- svn_ra_serf__list_t *list_item;
- list_item = apr_pcalloc(info->dir->pool, sizeof(*list_item));
- list_item->data = info;
- list_item->next = ctx->file_propchanges_only;
- ctx->file_propchanges_only = list_item;
- }
- else
+ /* If needed, create the PROPFIND to retrieve the file's properties. */
+ if (file->fetch_props)
{
- /* No propfind or GET request. Just handle the prop changes now. */
- SVN_ERR(handle_propchange_only(info, info->pool));
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&file->propfind_handler,
+ ctx->sess, file->url,
+ ctx->target_rev, "0",
+ all_props,
+ set_file_props, file,
+ file->pool));
+ file->propfind_handler->conn = conn; /* Explicit scheduling */
+
+ file->propfind_handler->done_delegate = file_props_done;
+ file->propfind_handler->done_delegate_baton = file;
+
+ /* Create a serf request for the PROPFIND. */
+ svn_ra_serf__request_create(file->propfind_handler);
+
+ ctx->num_active_propfinds++;
}
- if (ctx->num_active_fetches + ctx->num_active_propfinds
- > REQUEST_COUNT_TO_PAUSE)
- ctx->parser_ctx->paused = TRUE;
+ if (file->fetch_props || file->fetch_file)
+ return SVN_NO_ERROR;
- return SVN_NO_ERROR;
-}
-
-/** XML callbacks for our update-report response parsing */
+ /* Somehow we are done; probably via the local cache.
+ Close the file and release memory, etc. */
+ return svn_error_trace(close_file(file, scratch_pool));
+}
+
+/* Implements svn_ra_serf__prop_func */
static svn_error_t *
-start_report(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- const char **attrs,
+set_dir_prop(void *baton,
+ const char *path,
+ const char *ns,
+ const char *name,
+ const svn_string_t *val,
apr_pool_t *scratch_pool)
{
- report_context_t *ctx = parser->user_data;
- report_state_e state;
+ dir_baton_t *dir = baton;
+ report_context_t *ctx = dir->ctx;
+ const char *prop_name;
- state = parser->state->current_state;
+ prop_name = svn_ra_serf__svnname_from_wirename(ns, name, scratch_pool);
+ if (prop_name == NULL)
+ return SVN_NO_ERROR;
- if (state == NONE && strcmp(name.name, "update-report") == 0)
- {
- const char *val;
+ SVN_ERR(ensure_dir_opened(dir, scratch_pool));
- val = svn_xml_get_attr_value("inline-props", attrs);
- if (val && (strcmp(val, "true") == 0))
- ctx->add_props_included = TRUE;
+ SVN_ERR(ctx->editor->change_dir_prop(dir->dir_baton,
+ prop_name, val,
+ scratch_pool));
+ return SVN_NO_ERROR;
+}
- val = svn_xml_get_attr_value("send-all", attrs);
- if (val && (strcmp(val, "true") == 0))
- {
- ctx->send_all_mode = TRUE;
+/* Implements svn_ra_serf__response_done_delegate_t */
+static svn_error_t *
+dir_props_done(serf_request_t *request,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ dir_baton_t *dir = baton;
+ svn_ra_serf__handler_t *handler = dir->propfind_handler;
- /* All properties are included in send-all mode. */
- ctx->add_props_included = TRUE;
- }
- }
- else if (state == NONE && strcmp(name.name, "target-revision") == 0)
- {
- const char *rev;
+ if (handler->server_error)
+ return svn_ra_serf__server_error_create(handler, scratch_pool);
- rev = svn_xml_get_attr_value("rev", attrs);
+ if (handler->sline.code != 207)
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
- if (!rev)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in target-revision element"));
- }
+ dir->ctx->num_active_propfinds--;
- SVN_ERR(ctx->update_editor->set_target_revision(ctx->update_baton,
- SVN_STR_TO_REV(rev),
- ctx->sess->pool));
- }
- else if (state == NONE && strcmp(name.name, "open-directory") == 0)
- {
- const char *rev;
- report_info_t *info;
+ /* Closing the directory will automatically deliver the propfind props.
+ *
+ * Note that closing the directory may dispose the pool containing the
+ * handler, which is only a valid operation in this callback, as after
+ * this callback serf assumes the request is done. */
- rev = svn_xml_get_attr_value("rev", attrs);
+ return svn_error_trace(maybe_close_dir(dir));
+}
- if (!rev)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-directory element"));
- }
+/* Initiates additional requests needed for a directory when not in "send-all"
+ * mode */
+static svn_error_t *
+fetch_for_dir(dir_baton_t *dir,
+ apr_pool_t *scratch)
+{
+ report_context_t *ctx = dir->ctx;
+ svn_ra_serf__connection_t *conn;
- info = push_state(parser, ctx, OPEN_DIR);
+ /* Open extra connections if we have enough requests to send. */
+ if (ctx->sess->num_conns < ctx->sess->max_connections)
+ SVN_ERR(open_connection_if_needed(ctx->sess, ctx->num_active_fetches +
+ ctx->num_active_propfinds));
- info->base_rev = SVN_STR_TO_REV(rev);
- info->dir->base_rev = info->base_rev;
- info->fetch_props = TRUE;
+ /* What connection should we go on? */
+ conn = get_best_connection(ctx);
- info->dir->base_name = "";
- info->dir->name = "";
+ /* If needed, create the PROPFIND to retrieve the file's properties. */
+ if (dir->fetch_props)
+ {
+ SVN_ERR(svn_ra_serf__create_propfind_handler(&dir->propfind_handler,
+ ctx->sess, dir->url,
+ ctx->target_rev, "0",
+ all_props,
+ set_dir_prop, dir,
+ dir->pool));
- info->base_name = info->dir->base_name;
- info->name = info->dir->name;
+ dir->propfind_handler->conn = conn;
+ dir->propfind_handler->done_delegate = dir_props_done;
+ dir->propfind_handler->done_delegate_baton = dir;
- info->dir->repos_relpath = svn_hash_gets(ctx->switched_paths, "");
+ /* Create a serf request for the PROPFIND. */
+ svn_ra_serf__request_create(dir->propfind_handler);
- if (!info->dir->repos_relpath)
- SVN_ERR(svn_ra_serf__get_relative_path(&info->dir->repos_relpath,
- ctx->sess->session_url.path,
- ctx->sess, ctx->conn,
- info->dir->pool));
- }
- else if (state == NONE)
- {
- /* do nothing as we haven't seen our valid start tag yet. */
+ ctx->num_active_propfinds++;
}
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "open-directory") == 0)
- {
- const char *rev, *dirname;
- report_dir_t *dir;
- report_info_t *info;
+ else
+ SVN_ERR_MALFUNCTION();
- rev = svn_xml_get_attr_value("rev", attrs);
+ return SVN_NO_ERROR;
+}
- if (!rev)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-directory element"));
- }
+
+/** XML callbacks for our update-report response parsing */
- dirname = svn_xml_get_attr_value("name", attrs);
+/* Conforms to svn_ra_serf__xml_opened_t */
+static svn_error_t *
+update_opened(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int entered_state,
+ const svn_ra_serf__dav_props_t *tag,
+ apr_pool_t *scratch_pool)
+{
+ report_context_t *ctx = baton;
+ apr_hash_t *attrs;
- if (!dirname)
+ switch (entered_state)
+ {
+ case UPDATE_REPORT:
{
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in open-directory element"));
- }
-
- info = push_state(parser, ctx, OPEN_DIR);
-
- dir = info->dir;
+ const char *val;
- info->base_rev = SVN_STR_TO_REV(rev);
- dir->base_rev = info->base_rev;
+ attrs = svn_ra_serf__xml_gather_since(xes, UPDATE_REPORT);
+ val = svn_hash_gets(attrs, "inline-props");
- info->fetch_props = FALSE;
+ if (val && (strcmp(val, "true") == 0))
+ ctx->add_props_included = TRUE;
- dir->base_name = apr_pstrdup(dir->pool, dirname);
- info->base_name = dir->base_name;
+ val = svn_hash_gets(attrs, "send-all");
- /* Expand our name. */
- dir->name = svn_relpath_join(dir->parent_dir->name, dir->base_name,
- dir->pool);
- info->name = dir->name;
-
- dir->repos_relpath = svn_hash_gets(ctx->switched_paths, dir->name);
+ if (val && (strcmp(val, "true") == 0))
+ {
+ ctx->send_all_mode = TRUE;
- if (!dir->repos_relpath)
- dir->repos_relpath = svn_relpath_join(dir->parent_dir->repos_relpath,
- dir->base_name, dir->pool);
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "add-directory") == 0)
- {
- const char *dir_name, *cf, *cr;
- report_dir_t *dir;
- report_info_t *info;
+ /* All properties are included in send-all mode. */
+ ctx->add_props_included = TRUE;
+ }
+ }
+ break;
- dir_name = svn_xml_get_attr_value("name", attrs);
- if (!dir_name)
+ case OPEN_DIR:
+ case ADD_DIR:
{
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in add-directory element"));
- }
- cf = svn_xml_get_attr_value("copyfrom-path", attrs);
- cr = svn_xml_get_attr_value("copyfrom-rev", attrs);
+ dir_baton_t *dir;
+ const char *name;
+ attrs = svn_ra_serf__xml_gather_since(xes, entered_state);
- info = push_state(parser, ctx, ADD_DIR);
+ name = svn_hash_gets(attrs, "name");
+ if (!name)
+ name = "";
- dir = info->dir;
+ SVN_ERR(create_dir_baton(&dir, ctx, name, scratch_pool));
- dir->base_name = apr_pstrdup(dir->pool, dir_name);
- info->base_name = dir->base_name;
+ if (entered_state == OPEN_DIR)
+ {
+ apr_int64_t base_rev;
- /* Expand our name. */
- dir->name = svn_relpath_join(dir->parent_dir->name, dir->base_name,
- dir->pool);
- info->name = dir->name;
+ SVN_ERR(svn_cstring_atoi64(&base_rev,
+ svn_hash_gets(attrs, "rev")));
+ dir->base_rev = (svn_revnum_t)base_rev;
+ }
+ else
+ {
+ dir->copyfrom_path = svn_hash_gets(attrs, "copyfrom-path");
- info->copyfrom_path = cf ? apr_pstrdup(info->pool, cf) : NULL;
- info->copyfrom_rev = cr ? SVN_STR_TO_REV(cr) : SVN_INVALID_REVNUM;
+ if (dir->copyfrom_path)
+ {
+ apr_int64_t copyfrom_rev;
+ const char *copyfrom_rev_str;
+ dir->copyfrom_path = svn_fspath__canonicalize(
+ dir->copyfrom_path,
+ dir->pool);
- /* Mark that we don't have a base. */
- info->base_rev = SVN_INVALID_REVNUM;
- dir->base_rev = info->base_rev;
+ copyfrom_rev_str = svn_hash_gets(attrs, "copyfrom-rev");
- /* If the server isn't included properties for added items,
- we'll need to fetch them ourselves. */
- if (! ctx->add_props_included)
- dir->fetch_props = TRUE;
+ if (!copyfrom_rev_str)
+ return svn_error_createf(SVN_ERR_XML_ATTRIB_NOT_FOUND,
+ NULL,
+ _("Missing '%s' attribute"),
+ "copyfrom-rev");
- dir->repos_relpath = svn_relpath_join(dir->parent_dir->repos_relpath,
- dir->base_name, dir->pool);
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "open-file") == 0)
- {
- const char *file_name, *rev;
- report_info_t *info;
+ SVN_ERR(svn_cstring_atoi64(&copyfrom_rev, copyfrom_rev_str));
- file_name = svn_xml_get_attr_value("name", attrs);
+ dir->copyfrom_rev = (svn_revnum_t)copyfrom_rev;
+ }
- if (!file_name)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in open-file element"));
+ if (! ctx->add_props_included)
+ dir->fetch_props = TRUE;
+ }
}
-
- rev = svn_xml_get_attr_value("rev", attrs);
-
- if (!rev)
+ break;
+ case OPEN_FILE:
+ case ADD_FILE:
{
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing revision attr in open-file element"));
- }
+ file_baton_t *file;
- info = push_state(parser, ctx, OPEN_FILE);
+ attrs = svn_ra_serf__xml_gather_since(xes, entered_state);
- info->base_rev = SVN_STR_TO_REV(rev);
- info->fetch_props = FALSE;
+ SVN_ERR(create_file_baton(&file, ctx, svn_hash_gets(attrs, "name"),
+ scratch_pool));
- info->base_name = apr_pstrdup(info->pool, file_name);
- info->name = NULL;
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "add-file") == 0)
- {
- const char *file_name, *cf, *cr;
- report_info_t *info;
-
- file_name = svn_xml_get_attr_value("name", attrs);
- cf = svn_xml_get_attr_value("copyfrom-path", attrs);
- cr = svn_xml_get_attr_value("copyfrom-rev", attrs);
+ if (entered_state == OPEN_FILE)
+ {
+ apr_int64_t base_rev;
- if (!file_name)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in add-file element"));
- }
+ SVN_ERR(svn_cstring_atoi64(&base_rev,
+ svn_hash_gets(attrs, "rev")));
+ file->base_rev = (svn_revnum_t)base_rev;
+ }
+ else
+ {
+ const char *sha1_checksum;
+ file->copyfrom_path = svn_hash_gets(attrs, "copyfrom-path");
- info = push_state(parser, ctx, ADD_FILE);
+ if (file->copyfrom_path)
+ {
+ apr_int64_t copyfrom_rev;
+ const char *copyfrom_rev_str;
- info->base_rev = SVN_INVALID_REVNUM;
+ file->copyfrom_path = svn_fspath__canonicalize(
+ file->copyfrom_path,
+ file->pool);
- /* If the server isn't in "send-all" mode, we should expect to
- fetch contents for added files. */
- if (! ctx->send_all_mode)
- info->fetch_file = TRUE;
+ copyfrom_rev_str = svn_hash_gets(attrs, "copyfrom-rev");
- /* If the server isn't included properties for added items,
- we'll need to fetch them ourselves. */
- if (! ctx->add_props_included)
- info->fetch_props = TRUE;
+ if (!copyfrom_rev_str)
+ return svn_error_createf(SVN_ERR_XML_ATTRIB_NOT_FOUND,
+ NULL,
+ _("Missing '%s' attribute"),
+ "copyfrom-rev");
- info->base_name = apr_pstrdup(info->pool, file_name);
- info->name = NULL;
+ SVN_ERR(svn_cstring_atoi64(&copyfrom_rev, copyfrom_rev_str));
- info->copyfrom_path = cf ? apr_pstrdup(info->pool, cf) : NULL;
- info->copyfrom_rev = cr ? SVN_STR_TO_REV(cr) : SVN_INVALID_REVNUM;
+ file->copyfrom_rev = (svn_revnum_t)copyfrom_rev;
+ }
- info->final_sha1_checksum =
- svn_xml_get_attr_value("sha1-checksum", attrs);
- if (info->final_sha1_checksum)
- info->final_sha1_checksum = apr_pstrdup(info->pool,
- info->final_sha1_checksum);
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "delete-entry") == 0)
- {
- const char *file_name;
- const char *rev_str;
- report_info_t *info;
- apr_pool_t *tmppool;
- const char *full_path;
- svn_revnum_t delete_rev = SVN_INVALID_REVNUM;
+ sha1_checksum = svn_hash_gets(attrs, "sha1-checksum");
+ if (sha1_checksum)
+ {
+ SVN_ERR(svn_checksum_parse_hex(&file->final_sha1_checksum,
+ svn_checksum_sha1,
+ sha1_checksum,
+ file->pool));
+ }
- file_name = svn_xml_get_attr_value("name", attrs);
+ /* If the server isn't in "send-all" mode, we should expect to
+ fetch contents for added files. */
+ if (! ctx->send_all_mode)
+ file->fetch_file = TRUE;
- if (!file_name)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in delete-entry element"));
+ /* If the server isn't included properties for added items,
+ we'll need to fetch them ourselves. */
+ if (! ctx->add_props_included)
+ file->fetch_props = TRUE;
+ }
}
+ break;
- rev_str = svn_xml_get_attr_value("rev", attrs);
- if (rev_str) /* Not available on older repositories! */
- delete_rev = SVN_STR_TO_REV(rev_str);
+ case TXDELTA:
+ {
+ file_baton_t *file = ctx->cur_file;
+ const char *base_checksum;
- info = parser->state->private;
+ /* Pre 1.2, mod_dav_svn was using <txdelta> tags (in
+ addition to <fetch-file>s and such) when *not* in
+ "send-all" mode. As a client, we're smart enough to know
+ that's wrong, so we'll just ignore these tags. */
+ if (! ctx->send_all_mode)
+ break;
- SVN_ERR(ensure_dir_opened(info->dir));
+ file->fetch_file = FALSE;
- tmppool = svn_pool_create(info->dir->dir_baton_pool);
+ attrs = svn_ra_serf__xml_gather_since(xes, entered_state);
+ base_checksum = svn_hash_gets(attrs, "base-checksum");
- full_path = svn_relpath_join(info->dir->name, file_name, tmppool);
+ if (base_checksum)
+ SVN_ERR(svn_checksum_parse_hex(&file->base_md5_checksum,
+ svn_checksum_md5, base_checksum,
+ file->pool));
- SVN_ERR(ctx->update_editor->delete_entry(full_path,
- delete_rev,
- info->dir->dir_baton,
- tmppool));
+ SVN_ERR(open_file_txdelta(ctx->cur_file, scratch_pool));
- svn_pool_destroy(tmppool);
- }
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "absent-directory") == 0)
- {
- const char *file_name;
- report_info_t *info;
+ if (ctx->cur_file->txdelta != svn_delta_noop_window_handler)
+ {
+ svn_stream_t *decoder;
- file_name = svn_xml_get_attr_value("name", attrs);
+ decoder = svn_txdelta_parse_svndiff(file->txdelta,
+ file->txdelta_baton,
+ TRUE /* error early close*/,
+ file->pool);
- if (!file_name)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in absent-directory element"));
+ file->txdelta_stream = svn_base64_decode(decoder, file->pool);
+ }
}
+ break;
- info = parser->state->private;
+ case FETCH_PROPS:
+ {
+ /* Subversion <= 1.6 servers will return a fetch-props element on
+ open-file and open-dir when non entry props were changed in
+ !send-all mode. In turn we fetch the full set of properties
+ and send all of those as *changes* to the editor. So these
+ editors have to be aware that they receive-non property changes.
+ (In case of incomplete directories they have to be aware anyway)
- SVN_ERR(ensure_dir_opened(info->dir));
+ In r1063337 this behavior was changed in mod_dav_svn to always
+ send property changes inline in these cases. (See issue #3657)
- SVN_ERR(ctx->update_editor->absent_directory(
- svn_relpath_join(info->name, file_name,
- info->dir->pool),
- info->dir->dir_baton,
- info->dir->pool));
+ Note that before that change the property changes to the last_*
+ entry props were already inlined via specific xml elements. */
+ if (ctx->cur_file)
+ ctx->cur_file->fetch_props = TRUE;
+ else if (ctx->cur_dir)
+ ctx->cur_dir->fetch_props = TRUE;
+ }
+ break;
}
- else if ((state == OPEN_DIR || state == ADD_DIR) &&
- strcmp(name.name, "absent-file") == 0)
- {
- const char *file_name;
- report_info_t *info;
- file_name = svn_xml_get_attr_value("name", attrs);
+ return SVN_NO_ERROR;
+}
- if (!file_name)
- {
- return svn_error_create(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in absent-file element"));
- }
- info = parser->state->private;
- SVN_ERR(ensure_dir_opened(info->dir));
+/* Conforms to svn_ra_serf__xml_closed_t */
+static svn_error_t *
+update_closed(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int leaving_state,
+ const svn_string_t *cdata,
+ apr_hash_t *attrs,
+ apr_pool_t *scratch_pool)
+{
+ report_context_t *ctx = baton;
- SVN_ERR(ctx->update_editor->absent_file(
- svn_relpath_join(info->name, file_name,
- info->dir->pool),
- info->dir->dir_baton,
- info->dir->pool));
- }
- else if (state == OPEN_DIR || state == ADD_DIR)
+ switch (leaving_state)
{
- report_info_t *info;
-
- if (strcmp(name.name, "checked-in") == 0)
- {
- info = push_state(parser, ctx, IGNORE_PROP_NAME);
- info->prop_ns = name.namespace;
- info->prop_name = apr_pstrdup(parser->state->pool, name.name);
- info->prop_encoding = NULL;
- svn_stringbuf_setempty(info->prop_value);
- }
- else if (strcmp(name.name, "set-prop") == 0 ||
- strcmp(name.name, "remove-prop") == 0)
+ case UPDATE_REPORT:
+ ctx->done = TRUE;
+ break;
+ case TARGET_REVISION:
{
- const char *full_prop_name;
- const char *colon;
-
- info = push_state(parser, ctx, PROP);
-
- full_prop_name = svn_xml_get_attr_value("name", attrs);
- if (!full_prop_name)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in %s element"),
- name.name);
- }
-
- colon = strchr(full_prop_name, ':');
-
- if (colon)
- colon++;
- else
- colon = full_prop_name;
+ const char *revstr = svn_hash_gets(attrs, "rev");
+ apr_int64_t rev;
- info->prop_ns = apr_pstrmemdup(info->dir->pool, full_prop_name,
- colon - full_prop_name);
- info->prop_name = apr_pstrdup(parser->state->pool, colon);
- info->prop_encoding = svn_xml_get_attr_value("encoding", attrs);
- svn_stringbuf_setempty(info->prop_value);
- }
- else if (strcmp(name.name, "prop") == 0)
- {
- /* need to fetch it. */
- push_state(parser, ctx, NEED_PROP_NAME);
- }
- else if (strcmp(name.name, "fetch-props") == 0)
- {
- info = parser->state->private;
+ SVN_ERR(svn_cstring_atoi64(&rev, revstr));
- info->dir->fetch_props = TRUE;
- }
- else
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Unknown tag '%s' while at state %d"),
- name.name, state);
+ SVN_ERR(ctx->editor->set_target_revision(ctx->editor_baton,
+ (svn_revnum_t)rev,
+ scratch_pool));
}
+ break;
- }
- else if (state == OPEN_FILE || state == ADD_FILE)
- {
- report_info_t *info;
+ case CHECKED_IN_HREF:
+ if (ctx->cur_file)
+ ctx->cur_file->url = apr_pstrdup(ctx->cur_file->pool, cdata->data);
+ else
+ ctx->cur_dir->url = apr_pstrdup(ctx->cur_dir->pool, cdata->data);
+ break;
- if (strcmp(name.name, "checked-in") == 0)
- {
- info = push_state(parser, ctx, IGNORE_PROP_NAME);
- info->prop_ns = name.namespace;
- info->prop_name = apr_pstrdup(parser->state->pool, name.name);
- info->prop_encoding = NULL;
- svn_stringbuf_setempty(info->prop_value);
- }
- else if (strcmp(name.name, "prop") == 0)
- {
- /* need to fetch it. */
- push_state(parser, ctx, NEED_PROP_NAME);
- }
- else if (strcmp(name.name, "fetch-props") == 0)
+ case SET_PROP:
+ case REMOVE_PROP:
{
- info = parser->state->private;
+ const char *name = svn_hash_gets(attrs, "name");
+ const char *encoding;
+ const svn_string_t *value;
- info->fetch_props = TRUE;
- }
- else if (strcmp(name.name, "fetch-file") == 0)
- {
- info = parser->state->private;
- info->base_checksum = svn_xml_get_attr_value("base-checksum", attrs);
+ if (leaving_state == REMOVE_PROP)
+ value = NULL;
+ else if ((encoding = svn_hash_gets(attrs, "encoding")))
+ {
+ if (strcmp(encoding, "base64") != 0)
+ return svn_error_createf(SVN_ERR_XML_UNKNOWN_ENCODING, NULL,
+ _("Got unrecognized encoding '%s'"),
+ encoding);
- if (info->base_checksum)
- info->base_checksum = apr_pstrdup(info->pool, info->base_checksum);
+ value = svn_base64_decode_string(cdata, scratch_pool);
+ }
+ else
+ value = cdata;
- info->final_sha1_checksum =
- svn_xml_get_attr_value("sha1-checksum", attrs);
- if (info->final_sha1_checksum)
- info->final_sha1_checksum = apr_pstrdup(info->pool,
- info->final_sha1_checksum);
+ if (ctx->cur_file)
+ {
+ file_baton_t *file = ctx->cur_file;
- info->fetch_file = TRUE;
- }
- else if (strcmp(name.name, "set-prop") == 0 ||
- strcmp(name.name, "remove-prop") == 0)
- {
- const char *full_prop_name;
- const char *colon;
+ if (value
+ || ctx->add_props_included
+ || SVN_IS_VALID_REVNUM(file->base_rev))
+ {
+ SVN_ERR(ensure_file_opened(file, scratch_pool));
- info = push_state(parser, ctx, PROP);
+ SVN_ERR(ctx->editor->change_file_prop(file->file_baton,
+ name,
+ value,
+ scratch_pool));
+ }
+ else
+ {
+ if (!file->remove_props)
+ file->remove_props = apr_hash_make(file->pool);
- full_prop_name = svn_xml_get_attr_value("name", attrs);
- if (!full_prop_name)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Missing name attr in %s element"),
- name.name);
+ svn_hash_sets(file->remove_props,
+ apr_pstrdup(file->pool, name),
+ "");
+ }
}
- colon = strchr(full_prop_name, ':');
-
- if (colon)
- colon++;
else
- colon = full_prop_name;
-
- info->prop_ns = apr_pstrmemdup(info->dir->pool, full_prop_name,
- colon - full_prop_name);
- info->prop_name = apr_pstrdup(parser->state->pool, colon);
- info->prop_encoding = svn_xml_get_attr_value("encoding", attrs);
- svn_stringbuf_setempty(info->prop_value);
- }
- else if (strcmp(name.name, "txdelta") == 0)
- {
- /* Pre 1.2, mod_dav_svn was using <txdelta> tags (in
- addition to <fetch-file>s and such) when *not* in
- "send-all" mode. As a client, we're smart enough to know
- that's wrong, so we'll just ignore these tags. */
- if (ctx->send_all_mode)
{
- const svn_delta_editor_t *update_editor = ctx->update_editor;
-
- info = push_state(parser, ctx, TXDELTA);
+ dir_baton_t *dir = ctx->cur_dir;
- if (! info->file_baton)
+ if (value
+ || ctx->add_props_included
+ || SVN_IS_VALID_REVNUM(dir->base_rev))
{
- SVN_ERR(open_updated_file(info, FALSE, info->pool));
+ SVN_ERR(ensure_dir_opened(dir, scratch_pool));
+
+ SVN_ERR(ctx->editor->change_dir_prop(dir->dir_baton,
+ name,
+ value,
+ scratch_pool));
}
+ else
+ {
+ if (!dir->remove_props)
+ dir->remove_props = apr_hash_make(dir->pool);
- info->base_checksum = svn_xml_get_attr_value("base-checksum",
- attrs);
- SVN_ERR(update_editor->apply_textdelta(info->file_baton,
- info->base_checksum,
- info->editor_pool,
- &info->textdelta,
- &info->textdelta_baton));
- info->svndiff_decoder = svn_txdelta_parse_svndiff(
- info->textdelta,
- info->textdelta_baton,
- TRUE, info->pool);
- info->base64_decoder = svn_base64_decode(info->svndiff_decoder,
- info->pool);
+ svn_hash_sets(dir->remove_props,
+ apr_pstrdup(dir->pool, name),
+ "");
+ }
}
}
- else
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Unknown tag '%s' while at state %d"),
- name.name, state);
- }
- }
- else if (state == IGNORE_PROP_NAME)
- {
- report_info_t *info = push_state(parser, ctx, PROP);
- info->prop_encoding = svn_xml_get_attr_value("encoding", attrs);
- }
- else if (state == NEED_PROP_NAME)
- {
- report_info_t *info;
-
- info = push_state(parser, ctx, PROP);
-
- info->prop_ns = name.namespace;
- info->prop_name = apr_pstrdup(parser->state->pool, name.name);
- info->prop_encoding = svn_xml_get_attr_value("encoding", attrs);
- svn_stringbuf_setempty(info->prop_value);
- }
-
- return SVN_NO_ERROR;
-}
+ break;
-static svn_error_t *
-end_report(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- apr_pool_t *scratch_pool)
-{
- report_context_t *ctx = parser->user_data;
- report_state_e state;
+ case OPEN_DIR:
+ case ADD_DIR:
+ {
+ dir_baton_t *dir = ctx->cur_dir;
+ ctx->cur_dir = ctx->cur_dir->parent_dir;
- state = parser->state->current_state;
+ if (dir->fetch_props && ! dir->url)
+ {
+ return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("The REPORT response did not "
+ "include the requested checked-in "
+ "value"));
+ }
- if (state == NONE)
- {
- if (strcmp(name.name, "update-report") == 0)
- {
- ctx->report_completed = TRUE;
- }
- else
- {
- /* nothing to close yet. */
- return SVN_NO_ERROR;
+ if (!dir->fetch_props)
+ {
+ SVN_ERR(maybe_close_dir(dir));
+ break; /* dir potentially no longer valid */
+ }
+ else
+ {
+ /* Otherwise, if the server is *not* in "send-all" mode, we
+ are at a point where we can queue up the PROPFIND request */
+ SVN_ERR(fetch_for_dir(dir, scratch_pool));
+ }
}
- }
+ break;
- if (((state == OPEN_DIR && (strcmp(name.name, "open-directory") == 0)) ||
- (state == ADD_DIR && (strcmp(name.name, "add-directory") == 0))))
- {
- const char *checked_in_url;
- report_info_t *info = parser->state->private;
+ case OPEN_FILE:
+ case ADD_FILE:
+ {
+ file_baton_t *file = ctx->cur_file;
- /* We've now closed this directory; note it. */
- info->dir->tag_closed = TRUE;
+ ctx->cur_file = NULL;
+ /* go fetch info->name from DAV:checked-in */
- /* go fetch info->file_name from DAV:checked-in */
- checked_in_url =
- svn_ra_serf__get_ver_prop(info->dir->props, info->base_name,
- info->base_rev, "DAV:", "checked-in");
+ if ((file->fetch_file || file->fetch_props) && ! file->url)
+ {
+ return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("The REPORT response did not "
+ "include the requested checked-in "
+ "value"));
+ }
- /* If we were expecting to have the properties and we aren't able to
- * get it, bail.
- */
- if (!checked_in_url &&
- (!SVN_IS_VALID_REVNUM(info->dir->base_rev) || info->dir->fetch_props))
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("The REPORT or PROPFIND response did not "
- "include the requested checked-in value"));
+ /* If the server is in "send-all" mode or didn't get further work,
+ we can now close the file */
+ if (! file->fetch_file && ! file->fetch_props)
+ {
+ SVN_ERR(close_file(file, scratch_pool));
+ break; /* file is no longer valid */
+ }
+ else
+ {
+ /* Otherwise, if the server is *not* in "send-all" mode, we
+ should be at a point where we can queue up any auxiliary
+ content-fetching requests. */
+ SVN_ERR(fetch_for_file(file, scratch_pool));
+ }
}
+ break;
- info->dir->url = checked_in_url;
+ case MD5_CHECKSUM:
+ SVN_ERR(svn_checksum_parse_hex(&ctx->cur_file->final_md5_checksum,
+ svn_checksum_md5,
+ cdata->data,
+ ctx->cur_file->pool));
+ break;
- /* At this point, we should have the checked-in href.
- * If needed, create the PROPFIND to retrieve the dir's properties.
- */
- if (info->dir->fetch_props)
- {
- svn_ra_serf__list_t *list_item;
-
- SVN_ERR(svn_ra_serf__deliver_props(&info->dir->propfind_handler,
- info->dir->props, ctx->sess,
- get_best_connection(ctx),
- info->dir->url,
- ctx->target_rev, "0",
- all_props,
- &ctx->done_dir_propfinds,
- info->dir->pool));
- SVN_ERR_ASSERT(info->dir->propfind_handler);
-
- /* Create a serf request for the PROPFIND. */
- svn_ra_serf__request_create(info->dir->propfind_handler);
-
- ctx->num_active_propfinds++;
-
- list_item = apr_pcalloc(info->dir->pool, sizeof(*list_item));
- list_item->data = info->dir;
- list_item->next = ctx->active_dir_propfinds;
- ctx->active_dir_propfinds = list_item;
-
- if (ctx->num_active_fetches + ctx->num_active_propfinds
- > REQUEST_COUNT_TO_PAUSE)
- ctx->parser_ctx->paused = TRUE;
- }
- else
+ case FETCH_FILE:
{
- info->dir->propfind_handler = NULL;
- }
+ file_baton_t *file = ctx->cur_file;
+ const char *base_checksum = svn_hash_gets(attrs, "base-checksum");
+ const char *sha1_checksum = svn_hash_gets(attrs, "sha1-checksum");
- /* See if this directory (and perhaps even parents of that) can
- be closed now. This is likely to be the case only if we
- didn't need to contact the server for supplemental
- information required to handle any of this directory's
- children. */
- SVN_ERR(maybe_close_dir_chain(info->dir));
- svn_ra_serf__xml_pop_state(parser);
- }
- else if (state == OPEN_FILE && strcmp(name.name, "open-file") == 0)
- {
- report_info_t *info = parser->state->private;
+ if (base_checksum)
+ SVN_ERR(svn_checksum_parse_hex(&file->base_md5_checksum,
+ svn_checksum_md5, base_checksum,
+ file->pool));
- /* Expand our full name now if we haven't done so yet. */
- if (!info->name)
- {
- info->name = svn_relpath_join(info->dir->name, info->base_name,
- info->pool);
- }
+ /* Property is duplicated between add-file and fetch-file */
+ if (sha1_checksum && !file->final_sha1_checksum)
+ SVN_ERR(svn_checksum_parse_hex(&file->final_sha1_checksum,
+ svn_checksum_sha1,
+ sha1_checksum,
+ file->pool));
- if (info->lock_token && !info->fetch_props)
- info->fetch_props = TRUE;
+ /* Some 0.3x mod_dav_svn wrote both txdelta and fetch-file
+ elements in send-all mode. (See neon for history) */
+ if (! ctx->send_all_mode)
+ file->fetch_file = TRUE;
+ }
+ break;
- /* If possible, we'd like to fetch only a delta against a
- * version of the file we already have in our working copy,
- * rather than fetching a fulltext.
- *
- * In HTTP v2, we can simply construct the URL we need given the
- * repos_relpath and base revision number.
- */
- if (SVN_RA_SERF__HAVE_HTTPV2_SUPPORT(ctx->sess))
+ case DELETE_ENTRY:
{
- const char *repos_relpath;
+ const char *name = svn_hash_gets(attrs, "name");
+ const char *revstr;
+ apr_int64_t delete_rev;
- /* If this file is switched vs the editor root we should provide
- its real url instead of the one calculated from the session root.
- */
- repos_relpath = svn_hash_gets(ctx->switched_paths, info->name);
+ SVN_ERR(ensure_dir_opened(ctx->cur_dir, scratch_pool));
- if (!repos_relpath)
- {
- if (ctx->root_is_switched)
- {
- /* We are updating a direct target (most likely a file)
- that is switched vs its parent url */
- SVN_ERR_ASSERT(*svn_relpath_dirname(info->name, info->pool)
- == '\0');
+ revstr = svn_hash_gets(attrs, "rev");
- repos_relpath = svn_hash_gets(ctx->switched_paths, "");
- }
- else
- repos_relpath = svn_relpath_join(info->dir->repos_relpath,
- info->base_name, info->pool);
- }
-
- info->delta_base = apr_psprintf(info->pool, "%s/%ld/%s",
- ctx->sess->rev_root_stub,
- info->base_rev,
- svn_path_uri_encode(repos_relpath,
- info->pool));
- }
- else if (ctx->sess->wc_callbacks->get_wc_prop)
- {
- /* If we have a WC, we might be able to dive all the way into the WC
- * to get the previous URL so we can do a differential GET with the
- * base URL.
- */
- const svn_string_t *value = NULL;
- SVN_ERR(ctx->sess->wc_callbacks->get_wc_prop(
- ctx->sess->wc_callback_baton, info->name,
- SVN_RA_SERF__WC_CHECKED_IN_URL, &value, info->pool));
+ if (revstr)
+ SVN_ERR(svn_cstring_atoi64(&delete_rev, revstr));
+ else
+ delete_rev = SVN_INVALID_REVNUM;
- info->delta_base = value ? value->data : NULL;
+ SVN_ERR(ctx->editor->delete_entry(
+ svn_relpath_join(ctx->cur_dir->relpath,
+ name,
+ scratch_pool),
+ (svn_revnum_t)delete_rev,
+ ctx->cur_dir->dir_baton,
+ scratch_pool));
}
+ break;
- /* go fetch info->name from DAV:checked-in */
- info->url = svn_ra_serf__get_ver_prop(info->props, info->base_name,
- info->base_rev, "DAV:", "checked-in");
- if (!info->url)
+ case ABSENT_DIR:
{
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("The REPORT or PROPFIND response did not "
- "include the requested checked-in value"));
- }
+ const char *name = svn_hash_gets(attrs, "name");
- /* If the server is in "send-all" mode, we might have opened the
- file when we started seeing content for it. If we didn't get
- any content for it, we still need to open the file. But in
- any case, we can then immediately close it. */
- if (ctx->send_all_mode)
- {
- if (! info->file_baton)
- {
- SVN_ERR(open_updated_file(info, FALSE, info->pool));
- }
- SVN_ERR(close_updated_file(info, info->pool));
- info->dir->ref_count--;
- }
- /* Otherwise, if the server is *not* in "send-all" mode, we
- should be at a point where we can queue up any auxiliary
- content-fetching requests. */
- else
- {
- SVN_ERR(fetch_file(ctx, info));
- }
-
- svn_ra_serf__xml_pop_state(parser);
- }
- else if (state == ADD_FILE && strcmp(name.name, "add-file") == 0)
- {
- report_info_t *info = parser->state->private;
-
- /* go fetch info->name from DAV:checked-in */
- info->url = svn_ra_serf__get_ver_prop(info->props, info->base_name,
- info->base_rev, "DAV:", "checked-in");
- if (!info->url)
- {
- return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("The REPORT or PROPFIND response did not "
- "include the requested checked-in value"));
- }
+ SVN_ERR(ensure_dir_opened(ctx->cur_dir, scratch_pool));
- /* If the server is in "send-all" mode, we might have opened the
- file when we started seeing content for it. If we didn't get
- any content for it, we still need to open the file. But in
- any case, we can then immediately close it. */
- if (ctx->send_all_mode)
- {
- if (! info->file_baton)
- {
- SVN_ERR(open_updated_file(info, FALSE, info->pool));
- }
- SVN_ERR(close_updated_file(info, info->pool));
- info->dir->ref_count--;
+ SVN_ERR(ctx->editor->absent_directory(
+ svn_relpath_join(ctx->cur_dir->relpath,
+ name, scratch_pool),
+ ctx->cur_dir->dir_baton,
+ scratch_pool));
}
- /* Otherwise, if the server is *not* in "send-all" mode, we
- should be at a point where we can queue up any auxiliary
- content-fetching requests. */
- else
+ break;
+ case ABSENT_FILE:
{
- SVN_ERR(fetch_file(ctx, info));
- }
+ const char *name = svn_hash_gets(attrs, "name");
- svn_ra_serf__xml_pop_state(parser);
- }
- else if (state == TXDELTA && strcmp(name.name, "txdelta") == 0)
- {
- report_info_t *info = parser->state->private;
+ SVN_ERR(ensure_dir_opened(ctx->cur_dir, scratch_pool));
- /* Pre 1.2, mod_dav_svn was using <txdelta> tags (in addition to
- <fetch-file>s and such) when *not* in "send-all" mode. As a
- client, we're smart enough to know that's wrong, so when not
- in "receiving-all" mode, we'll ignore these tags. */
- if (ctx->send_all_mode)
- {
- SVN_ERR(svn_stream_close(info->base64_decoder));
+ SVN_ERR(ctx->editor->absent_file(
+ svn_relpath_join(ctx->cur_dir->relpath,
+ name, scratch_pool),
+ ctx->cur_dir->dir_baton,
+ scratch_pool));
}
+ break;
- svn_ra_serf__xml_pop_state(parser);
- }
- else if (state == PROP)
- {
- /* We need to move the prop_ns, prop_name, and prop_value into the
- * same lifetime as the dir->pool.
- */
- svn_ra_serf__ns_t *ns, *ns_name_match;
- svn_boolean_t found = FALSE;
- report_info_t *info;
- report_dir_t *dir;
- apr_hash_t *props;
- const svn_string_t *set_val_str;
- apr_pool_t *pool;
-
- info = parser->state->private;
- dir = info->dir;
-
- /* We're going to be slightly tricky. We don't care what the ->url
- * field is here at this point. So, we're going to stick a single
- * copy of the property name inside of the ->url field.
- */
- ns_name_match = NULL;
- for (ns = dir->ns_list; ns; ns = ns->next)
+ case TXDELTA:
{
- if (strcmp(ns->namespace, info->prop_ns) == 0)
- {
- ns_name_match = ns;
- if (strcmp(ns->url, info->prop_name) == 0)
- {
- found = TRUE;
- break;
- }
- }
- }
+ file_baton_t *file = ctx->cur_file;
- if (!found)
- {
- ns = apr_palloc(dir->pool, sizeof(*ns));
- if (!ns_name_match)
+ if (file->txdelta_stream)
{
- ns->namespace = apr_pstrdup(dir->pool, info->prop_ns);
+ SVN_ERR(svn_stream_close(file->txdelta_stream));
+ file->txdelta_stream = NULL;
}
- else
- {
- ns->namespace = ns_name_match->namespace;
- }
- ns->url = apr_pstrdup(dir->pool, info->prop_name);
-
- ns->next = dir->ns_list;
- dir->ns_list = ns;
}
+ break;
- if (strcmp(name.name, "remove-prop") != 0)
+ case VERSION_NAME:
+ case CREATIONDATE:
+ case CREATOR_DISPLAYNAME:
{
- props = info->props;
- pool = info->pool;
- }
- else
- {
- props = dir->removed_props;
- pool = dir->pool;
- svn_stringbuf_setempty(info->prop_value);
- }
+ /* Subversion <= 1.6 servers would return a fetch-props element on
+ open-file and open-dir when non entry props were changed in
+ !send-all mode. In turn we fetch the full set of properties and
+ send those as *changes* to the editor. So these editors have to
+ be aware that they receive non property changes.
+ (In case of incomplete directories they have to be aware anyway)
- if (info->prop_encoding)
- {
- if (strcmp(info->prop_encoding, "base64") == 0)
- {
- svn_string_t tmp;
+ In that case the last_* entry props are posted as 3 specific xml
+ elements, which we handle here.
- /* Don't use morph_info_string cuz we need prop_value to
- remain usable. */
- tmp.data = info->prop_value->data;
- tmp.len = info->prop_value->len;
+ In r1063337 this behavior was changed in mod_dav_svn to always
+ send property changes inline in these cases. (See issue #3657)
+ */
- set_val_str = svn_base64_decode_string(&tmp, pool);
- }
+ const char *propname;
+
+ if (ctx->cur_file)
+ SVN_ERR(ensure_file_opened(ctx->cur_file, scratch_pool));
+ else if (ctx->cur_dir)
+ SVN_ERR(ensure_dir_opened(ctx->cur_dir, scratch_pool));
else
+ break;
+
+ switch (leaving_state)
{
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA,
- NULL,
- _("Got unrecognized encoding '%s'"),
- info->prop_encoding);
+ case VERSION_NAME:
+ propname = SVN_PROP_ENTRY_COMMITTED_REV;
+ break;
+ case CREATIONDATE:
+ propname = SVN_PROP_ENTRY_COMMITTED_DATE;
+ break;
+ case CREATOR_DISPLAYNAME:
+ propname = SVN_PROP_ENTRY_LAST_AUTHOR;
+ break;
+ default:
+ SVN_ERR_MALFUNCTION(); /* Impossible to reach */
}
- }
- else
- {
- set_val_str = svn_string_create_from_buf(info->prop_value, pool);
- }
-
- svn_ra_serf__set_ver_prop(props, info->base_name, info->base_rev,
- ns->namespace, ns->url, set_val_str, pool);
- /* Advance handling: if we spotted the md5-checksum property on
- the wire, remember it's value. */
- if (strcmp(ns->url, "md5-checksum") == 0
- && strcmp(ns->namespace, SVN_DAV_PROP_NS_DAV) == 0)
- info->final_checksum = apr_pstrdup(info->pool, set_val_str->data);
-
- svn_ra_serf__xml_pop_state(parser);
- }
- else if (state == IGNORE_PROP_NAME || state == NEED_PROP_NAME)
- {
- svn_ra_serf__xml_pop_state(parser);
+ if (ctx->cur_file)
+ SVN_ERR(ctx->editor->change_file_prop(ctx->cur_file->file_baton,
+ propname, cdata,
+ scratch_pool));
+ else
+ SVN_ERR(ctx->editor->change_dir_prop(ctx->cur_dir->dir_baton,
+ propname, cdata,
+ scratch_pool));
+ }
+ break;
}
return SVN_NO_ERROR;
}
+
+/* Conforms to svn_ra_serf__xml_cdata_t */
static svn_error_t *
-cdata_report(svn_ra_serf__xml_parser_t *parser,
+update_cdata(svn_ra_serf__xml_estate_t *xes,
+ void *baton,
+ int current_state,
const char *data,
apr_size_t len,
apr_pool_t *scratch_pool)
{
- report_context_t *ctx = parser->user_data;
-
- UNUSED_CTX(ctx);
-
- if (parser->state->current_state == PROP)
- {
- report_info_t *info = parser->state->private;
+ report_context_t *ctx = baton;
- svn_stringbuf_appendbytes(info->prop_value, data, len);
- }
- else if (parser->state->current_state == TXDELTA)
+ if (current_state == TXDELTA && ctx->cur_file
+ && ctx->cur_file->txdelta_stream)
{
- /* Pre 1.2, mod_dav_svn was using <txdelta> tags (in addition to
- <fetch-file>s and such) when *not* in "send-all" mode. As a
- client, we're smart enough to know that's wrong, so when not
- in "receiving-all" mode, we'll ignore these tags. */
- if (ctx->send_all_mode)
- {
- apr_size_t nlen = len;
- report_info_t *info = parser->state->private;
-
- SVN_ERR(svn_stream_write(info->base64_decoder, data, &nlen));
- if (nlen != len)
- {
- /* Short write without associated error? "Can't happen." */
- return svn_error_createf(SVN_ERR_STREAM_UNEXPECTED_EOF, NULL,
- _("Error writing to '%s': unexpected EOF"),
- info->name);
- }
- }
+ SVN_ERR(svn_stream_write(ctx->cur_file->txdelta_stream, data, &len));
}
return SVN_NO_ERROR;
@@ -2544,7 +2197,8 @@ make_simple_xml_tag(svn_stringbuf_t **buf_p,
const char *cdata,
apr_pool_t *pool)
{
- svn_xml_make_open_tag(buf_p, pool, svn_xml_protect_pcdata, tagname, NULL);
+ svn_xml_make_open_tag(buf_p, pool, svn_xml_protect_pcdata, tagname,
+ SVN_VA_NULL);
svn_xml_escape_cdata_cstring(buf_p, cdata, pool);
svn_xml_make_close_tag(buf_p, pool, tagname);
}
@@ -2566,12 +2220,11 @@ set_path(void *report_baton,
"lock-token", lock_token,
"depth", svn_depth_to_word(depth),
"start-empty", start_empty ? "true" : NULL,
- NULL);
+ SVN_VA_NULL);
svn_xml_escape_cdata_cstring(&buf, path, pool);
svn_xml_make_close_tag(&buf, pool, "S:entry");
- SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
- NULL, pool));
+ SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
return SVN_NO_ERROR;
}
@@ -2586,8 +2239,7 @@ delete_path(void *report_baton,
make_simple_xml_tag(&buf, "S:missing", path, pool);
- SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
- NULL, pool));
+ SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
return SVN_NO_ERROR;
}
@@ -2619,12 +2271,10 @@ link_path(void *report_baton,
_("Unable to parse URL '%s'"), url);
}
- SVN_ERR(svn_ra_serf__report_resource(&report_target, report->sess,
- NULL, pool));
- SVN_ERR(svn_ra_serf__get_relative_path(&link, uri.path, report->sess,
- NULL, pool));
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, report->sess, pool));
+ SVN_ERR(svn_ra_serf__get_relative_path(&link, uri.path, report->sess, pool));
- link = apr_pstrcat(pool, "/", link, (char *)NULL);
+ link = apr_pstrcat(pool, "/", link, SVN_VA_NULL);
svn_xml_make_open_tag(&buf, pool, svn_xml_protect_pcdata, "S:entry",
"rev", apr_ltoa(pool, revision),
@@ -2632,80 +2282,55 @@ link_path(void *report_baton,
"depth", svn_depth_to_word(depth),
"linkpath", link,
"start-empty", start_empty ? "true" : NULL,
- NULL);
+ SVN_VA_NULL);
svn_xml_escape_cdata_cstring(&buf, path, pool);
svn_xml_make_close_tag(&buf, pool, "S:entry");
- SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
- NULL, pool));
+ SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
/* Store the switch roots to allow generating repos_relpaths from just
the working copy paths. (Needed for HTTPv2) */
path = apr_pstrdup(report->pool, path);
- svn_hash_sets(report->switched_paths,
- path, apr_pstrdup(report->pool, link + 1));
+ link = apr_pstrdup(report->pool, link + 1);
+ svn_hash_sets(report->switched_paths, path, link);
- if (!*path)
- report->root_is_switched = TRUE;
-
- return APR_SUCCESS;
-}
-
-/** Minimum nr. of outstanding requests needed before a new connection is
- * opened. */
-#define REQS_PER_CONN 8
-
-/** This function creates a new connection for this serf session, but only
- * if the number of NUM_ACTIVE_REQS > REQS_PER_CONN or if there currently is
- * only one main connection open.
- */
-static svn_error_t *
-open_connection_if_needed(svn_ra_serf__session_t *sess, int num_active_reqs)
-{
- /* For each REQS_PER_CONN outstanding requests open a new connection, with
- * a minimum of 1 extra connection. */
- if (sess->num_conns == 1 ||
- ((num_active_reqs / REQS_PER_CONN) > sess->num_conns))
+ if (!path[0] && report->update_target[0])
{
- int cur = sess->num_conns;
- apr_status_t status;
-
- sess->conns[cur] = apr_pcalloc(sess->pool, sizeof(*sess->conns[cur]));
- sess->conns[cur]->bkt_alloc = serf_bucket_allocator_create(sess->pool,
- NULL, NULL);
- sess->conns[cur]->last_status_code = -1;
- sess->conns[cur]->session = sess;
- status = serf_connection_create2(&sess->conns[cur]->conn,
- sess->context,
- sess->session_url,
- svn_ra_serf__conn_setup,
- sess->conns[cur],
- svn_ra_serf__conn_closed,
- sess->conns[cur],
- sess->pool);
- if (status)
- return svn_ra_serf__wrap_err(status, NULL);
-
- sess->num_conns++;
+ /* The update root is switched. Make sure we store it the way
+ we expect it to find */
+ svn_hash_sets(report->switched_paths, report->update_target, link);
}
- return SVN_NO_ERROR;
+ return APR_SUCCESS;
}
-/* Serf callback to create update request body bucket. */
+/* Serf callback to create update request body bucket.
+ Implements svn_ra_serf__request_body_delegate_t */
static svn_error_t *
create_update_report_body(serf_bucket_t **body_bkt,
void *baton,
serf_bucket_alloc_t *alloc,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
report_context_t *report = baton;
- apr_off_t offset;
+ body_create_baton_t *body = report->body;
- offset = 0;
- apr_file_seek(report->body_file, APR_SET, &offset);
+ if (body->file)
+ {
+ apr_off_t offset;
+
+ offset = 0;
+ SVN_ERR(svn_io_file_seek(body->file, APR_SET, &offset, pool));
- *body_bkt = serf_bucket_file_create(report->body_file, alloc);
+ *body_bkt = serf_bucket_file_create(report->body->file, alloc);
+ }
+ else
+ {
+ *body_bkt = serf_bucket_simple_create(body->all_data,
+ body->total_bytes,
+ NULL, NULL, alloc);
+ }
return SVN_NO_ERROR;
}
@@ -2714,7 +2339,8 @@ create_update_report_body(serf_bucket_t **body_bkt,
static svn_error_t *
setup_update_report_headers(serf_bucket_t *headers,
void *baton,
- apr_pool_t *pool)
+ apr_pool_t *pool /* request pool */,
+ apr_pool_t *scratch_pool)
{
report_context_t *report = baton;
@@ -2732,368 +2358,347 @@ setup_update_report_headers(serf_bucket_t *headers,
return SVN_NO_ERROR;
}
+/* Baton for update_delay_handler */
+typedef struct update_delay_baton_t
+{
+ report_context_t *report;
+ svn_spillbuf_t *spillbuf;
+ svn_ra_serf__response_handler_t inner_handler;
+ void *inner_handler_baton;
+} update_delay_baton_t;
+
+/* Helper for update_delay_handler() and process_pending() to
+ call UDB->INNER_HANDLER with buffer pointed by DATA. */
static svn_error_t *
-finish_report(void *report_baton,
- apr_pool_t *pool)
+process_buffer(update_delay_baton_t *udb,
+ serf_request_t *request,
+ const void *data,
+ apr_size_t len,
+ svn_boolean_t at_eof,
+ serf_bucket_alloc_t *alloc,
+ apr_pool_t *pool)
{
- report_context_t *report = report_baton;
- svn_ra_serf__session_t *sess = report->sess;
- svn_ra_serf__handler_t *handler;
- svn_ra_serf__xml_parser_t *parser_ctx;
- const char *report_target;
- svn_stringbuf_t *buf = NULL;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ serf_bucket_t *tmp_bucket;
svn_error_t *err;
- apr_interval_time_t waittime_left = sess->timeout;
- svn_xml_make_close_tag(&buf, iterpool, "S:update-report");
- SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
- NULL, iterpool));
+ /* ### This code (and the eagain bucket code) can probably be
+ ### simplified by using a bit of aggregate bucket magic.
+ ### See mail from Ivan to dev@s.a.o. */
+ if (at_eof)
+ {
+ tmp_bucket = serf_bucket_simple_create(data, len, NULL, NULL,
+ alloc);
+ }
+ else
+ {
+ tmp_bucket = svn_ra_serf__create_bucket_with_eagain(data, len,
+ alloc);
+ }
- /* We need to flush the file, make it unbuffered (so that it can be
- * zero-copied via mmap), and reset the position before attempting to
- * deliver the file.
- *
- * N.B. If we have APR 1.3+, we can unbuffer the file to let us use mmap
- * and zero-copy the PUT body. However, on older APR versions, we can't
- * check the buffer status; but serf will fall through and create a file
- * bucket for us on the buffered svndiff handle.
- */
- apr_file_flush(report->body_file);
-#if APR_VERSION_AT_LEAST(1, 3, 0)
- apr_file_buffer_set(report->body_file, NULL, 0);
-#endif
+ /* If not at EOF create a bucket that finishes with EAGAIN, otherwise
+ use a standard bucket with default EOF handling */
+ err = udb->inner_handler(request, tmp_bucket,
+ udb->inner_handler_baton, pool);
- SVN_ERR(svn_ra_serf__report_resource(&report_target, sess, NULL, pool));
+ /* And free the bucket explicitly to avoid growing request allocator
+ storage (in a loop) */
+ serf_bucket_destroy(tmp_bucket);
- /* create and deliver request */
- report->path = report_target;
+ return svn_error_trace(err);
+}
- handler = apr_pcalloc(pool, sizeof(*handler));
- handler->handler_pool = pool;
- handler->method = "REPORT";
- handler->path = report->path;
- handler->body_delegate = create_update_report_body;
- handler->body_delegate_baton = report;
- handler->body_type = "text/xml";
- handler->custom_accept_encoding = TRUE;
- handler->header_delegate = setup_update_report_headers;
- handler->header_delegate_baton = report;
- handler->conn = sess->conns[0];
- handler->session = sess;
+/* Delaying wrapping reponse handler, to avoid creating too many
+ requests to deliver efficiently */
+static svn_error_t *
+update_delay_handler(serf_request_t *request,
+ serf_bucket_t *response,
+ void *handler_baton,
+ apr_pool_t *scratch_pool)
+{
+ update_delay_baton_t *udb = handler_baton;
+ apr_status_t status;
+ apr_pool_t *iterpool = NULL;
- parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx));
+ if (! udb->spillbuf)
+ {
+ if (udb->report->send_all_mode)
+ {
+ /* Easy out... We only have one request, so avoid everything and just
+ call the inner handler.
- parser_ctx->pool = pool;
- parser_ctx->response_type = "update-report";
- parser_ctx->user_data = report;
- parser_ctx->start = start_report;
- parser_ctx->end = end_report;
- parser_ctx->cdata = cdata_report;
- parser_ctx->done = &report->done;
+ We will always get in the loop (below) on the first chunk, as only
+ the server can get us in true send-all mode */
- handler->response_handler = svn_ra_serf__handle_xml_parser;
- handler->response_baton = parser_ctx;
+ return svn_error_trace(udb->inner_handler(request, response,
+ udb->inner_handler_baton,
+ scratch_pool));
+ }
- report->parser_ctx = parser_ctx;
+ while ((udb->report->num_active_fetches + udb->report->num_active_propfinds)
+ < REQUEST_COUNT_TO_RESUME)
+ {
+ const char *data;
+ apr_size_t len;
+ svn_boolean_t at_eof = FALSE;
+ svn_error_t *err;
- svn_ra_serf__request_create(handler);
+ status = serf_bucket_read(response, PARSE_CHUNK_SIZE, &data, &len);
+ if (SERF_BUCKET_READ_ERROR(status))
+ return svn_ra_serf__wrap_err(status, NULL);
+ else if (APR_STATUS_IS_EOF(status))
+ udb->report->report_received = at_eof = TRUE;
- /* Open the first extra connection. */
- SVN_ERR(open_connection_if_needed(sess, 0));
+ if (!iterpool)
+ iterpool = svn_pool_create(scratch_pool);
+ else
+ svn_pool_clear(iterpool);
- sess->cur_conn = 1;
+ if (len == 0 && !at_eof)
+ return svn_ra_serf__wrap_err(status, NULL);
- /* Note that we may have no active GET or PROPFIND requests, yet the
- processing has not been completed. This could be from a delay on the
- network or because we've spooled the entire response into our "pending"
- content of the XML parser. The DONE flag will get set when all the
- XML content has been received *and* parsed. */
- while (!report->done
- || report->num_active_fetches
- || report->num_active_propfinds)
+ err = process_buffer(udb, request, data, len, at_eof,
+ serf_request_get_alloc(request),
+ iterpool);
+
+ if (err && SERF_BUCKET_READ_ERROR(err->apr_err))
+ return svn_error_trace(err);
+ else if (err && APR_STATUS_IS_EAGAIN(err->apr_err))
+ {
+ svn_error_clear(err); /* Throttling is working ok */
+ }
+ else if (err && (APR_STATUS_IS_EOF(err->apr_err)))
+ {
+ svn_pool_destroy(iterpool);
+ return svn_error_trace(err); /* No buffering was necessary */
+ }
+ else
+ {
+ /* SERF_ERROR_WAIT_CONN should be impossible? */
+ return svn_error_trace(err);
+ }
+ }
+
+ /* Let's start using the spill infrastructure */
+ udb->spillbuf = svn_spillbuf__create(SPILLBUF_BLOCKSIZE,
+ SPILLBUF_MAXBUFFSIZE,
+ udb->report->pool);
+ }
+
+ /* Read everything we can to a spillbuffer */
+ do
{
- apr_pool_t *iterpool_inner;
- svn_ra_serf__list_t *done_list;
- int i;
- apr_status_t status;
+ const char *data;
+ apr_size_t len;
- /* Note: this throws out the old ITERPOOL_INNER. */
- svn_pool_clear(iterpool);
+ /* ### What blocksize should we pass? */
+ status = serf_bucket_read(response, 8*PARSE_CHUNK_SIZE, &data, &len);
- if (sess->cancel_func)
- SVN_ERR(sess->cancel_func(sess->cancel_baton));
+ if (!SERF_BUCKET_READ_ERROR(status))
+ SVN_ERR(svn_spillbuf__write(udb->spillbuf, data, len, scratch_pool));
+ }
+ while (status == APR_SUCCESS);
- /* We need to be careful between the outer and inner ITERPOOLs,
- and what items are allocated within. */
- iterpool_inner = svn_pool_create(iterpool);
+ if (APR_STATUS_IS_EOF(status))
+ udb->report->report_received = TRUE;
- status = serf_context_run(sess->context,
- SVN_RA_SERF__CONTEXT_RUN_DURATION,
- iterpool_inner);
+ /* We handle feeding the data from the main context loop, which will be right
+ after processing the pending data */
- err = sess->pending_error;
- sess->pending_error = SVN_NO_ERROR;
+ if (status)
+ return svn_ra_serf__wrap_err(status, NULL);
+ else
+ return SVN_NO_ERROR;
+}
+
+/* Process pending data from the update report, if any */
+static svn_error_t *
+process_pending(update_delay_baton_t *udb,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = NULL;
+ serf_bucket_alloc_t *alloc = NULL;
+
+ while ((udb->report->num_active_fetches + udb->report->num_active_propfinds)
+ < REQUEST_COUNT_TO_RESUME)
+ {
+ const char *data;
+ apr_size_t len;
+ svn_boolean_t at_eof;
+ svn_error_t *err;
- if (!err && handler->done && handler->server_error)
+ if (!iterpool)
{
- err = handler->server_error->error;
+ iterpool = svn_pool_create(scratch_pool);
+ alloc = serf_bucket_allocator_create(scratch_pool, NULL, NULL);
}
+ else
+ svn_pool_clear(iterpool);
- /* If the context duration timeout is up, we'll subtract that
- duration from the total time alloted for such things. If
- there's no time left, we fail with a message indicating that
- the connection timed out. */
- if (APR_STATUS_IS_TIMEUP(status))
- {
- svn_error_clear(err);
- err = SVN_NO_ERROR;
- status = 0;
+ SVN_ERR(svn_spillbuf__read(&data, &len, udb->spillbuf, iterpool));
- if (sess->timeout)
- {
- if (waittime_left > SVN_RA_SERF__CONTEXT_RUN_DURATION)
- {
- waittime_left -= SVN_RA_SERF__CONTEXT_RUN_DURATION;
- }
- else
- {
- return svn_error_create(SVN_ERR_RA_DAV_CONN_TIMEOUT, NULL,
- _("Connection timed out"));
- }
- }
- }
+ if (data == NULL && !udb->report->report_received)
+ break;
+ else if (data == NULL)
+ at_eof = TRUE;
else
- {
- waittime_left = sess->timeout;
- }
+ at_eof = FALSE;
+
+ err = process_buffer(udb, NULL /* allowed? */, data, len,
+ at_eof, alloc, iterpool);
- if (status && handler->sline.code != 200)
+ if (err && APR_STATUS_IS_EAGAIN(err->apr_err))
{
- return svn_error_trace(
- svn_error_compose_create(
- svn_ra_serf__error_on_status(handler->sline,
- handler->path,
- handler->location),
- err));
+ svn_error_clear(err); /* Throttling is working */
}
- SVN_ERR(err);
- if (status)
+ else if (err && APR_STATUS_IS_EOF(err->apr_err))
{
- return svn_ra_serf__wrap_err(status, _("Error retrieving REPORT"));
+ svn_error_clear(err);
+
+ svn_pool_destroy(iterpool);
+ udb->spillbuf = NULL;
+ return SVN_NO_ERROR;
}
+ else if (err)
+ return svn_error_trace(err);
+ }
- /* Open extra connections if we have enough requests to send. */
- if (sess->num_conns < sess->max_connections)
- SVN_ERR(open_connection_if_needed(sess, report->num_active_fetches +
- report->num_active_propfinds));
+ if (iterpool)
+ svn_pool_destroy(iterpool);
- /* Prune completed file PROPFINDs. */
- done_list = report->done_propfinds;
- while (done_list)
- {
- svn_ra_serf__list_t *next_done = done_list->next;
+ return SVN_NO_ERROR;
+}
- svn_pool_clear(iterpool_inner);
+/* Process the 'update' editor report */
+static svn_error_t *
+process_editor_report(report_context_t *ctx,
+ svn_ra_serf__handler_t *handler,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_serf__session_t *sess = ctx->sess;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_interval_time_t waittime_left = sess->timeout;
+ update_delay_baton_t *ud;
- report->num_active_propfinds--;
+ /* Now wrap the response handler with delay support to avoid sending
+ out too many requests at once */
+ ud = apr_pcalloc(scratch_pool, sizeof(*ud));
+ ud->report = ctx;
- /* If we have some files that we won't be fetching the content
- * for, ensure that we update the file with any altered props.
- */
- if (report->file_propchanges_only)
- {
- svn_ra_serf__list_t *cur, *prev;
+ ud->inner_handler = handler->response_handler;
+ ud->inner_handler_baton = handler->response_baton;
- prev = NULL;
- cur = report->file_propchanges_only;
+ handler->response_handler = update_delay_handler;
+ handler->response_baton = ud;
- while (cur)
- {
- report_info_t *item = cur->data;
+ /* Open the first extra connection. */
+ SVN_ERR(open_connection_if_needed(sess, 0));
- if (item->propfind_handler == done_list->data)
- {
- break;
- }
+ sess->cur_conn = 1;
- prev = cur;
- cur = cur->next;
- }
+ /* Note that we may have no active GET or PROPFIND requests, yet the
+ processing has not been completed. This could be from a delay on the
+ network or because we've spooled the entire response into our "pending"
+ content of the XML parser. The DONE flag will get set when all the
+ XML content has been received *and* parsed. */
+ while (!handler->done
+ || ctx->num_active_fetches
+ || ctx->num_active_propfinds
+ || !ctx->done)
+ {
+ svn_error_t *err;
+ int i;
- /* If we found a match, set the new props and remove this
- * propchange from our list.
- */
- if (cur)
- {
- report_info_t *info = cur->data;
-
- if (!prev)
- {
- report->file_propchanges_only = cur->next;
- }
- else
- {
- prev->next = cur->next;
- }
-
- /* If we've got cached file content for this file,
- take care of the locally collected properties and
- file content at once. Otherwise, just deal with
- the collected properties.
-
- NOTE: These functions below could delete
- info->dir->pool (via maybe_close_dir_chain()),
- from which is allocated the list item in
- report->file_propchanges_only.
- */
- if (info->cached_contents)
- {
- SVN_ERR(handle_local_content(info, iterpool_inner));
- }
- else
- {
- SVN_ERR(handle_propchange_only(info, iterpool_inner));
- }
- }
- }
+ svn_pool_clear(iterpool);
- done_list = next_done;
- }
- report->done_propfinds = NULL;
+ err = svn_ra_serf__context_run(sess, &waittime_left, iterpool);
- /* Prune completed fetches from our list. */
- done_list = report->done_fetches;
- while (done_list)
+ if (handler->done && handler->server_error)
{
- report_fetch_t *done_fetch = done_list->data;
- svn_ra_serf__list_t *next_done = done_list->next;
- report_dir_t *cur_dir;
-
- /* Decrease the refcount in the parent directory of the file
- whose fetch has completed. */
- cur_dir = done_fetch->info->dir;
- cur_dir->ref_count--;
+ svn_error_clear(err);
+ err = svn_ra_serf__server_error_create(handler, iterpool);
- /* Decrement our active fetch count. */
- report->num_active_fetches--;
+ SVN_ERR_ASSERT(err != NULL);
+ }
- /* See if the parent directory of this fetched item (and
- perhaps even parents of that) can be closed now.
+ SVN_ERR(err);
- NOTE: This could delete cur_dir->pool, from which is
- allocated the list item in report->done_fetches.
- */
- SVN_ERR(maybe_close_dir_chain(cur_dir));
+ /* If there is pending REPORT data, process it now. */
+ if (ud->spillbuf)
+ SVN_ERR(process_pending(ud, iterpool));
- done_list = next_done;
+ /* Debugging purposes only! */
+ for (i = 0; i < sess->num_conns; i++)
+ {
+ serf_debug__closed_conn(sess->conns[i]->bkt_alloc);
}
- report->done_fetches = NULL;
+ }
- /* Prune completed directory PROPFINDs. */
- done_list = report->done_dir_propfinds;
- while (done_list)
- {
- svn_ra_serf__list_t *next_done = done_list->next;
+ svn_pool_clear(iterpool);
- report->num_active_propfinds--;
+ /* If we got a complete report, close the edit. Otherwise, abort it. */
+ if (ctx->done)
+ SVN_ERR(ctx->editor->close_edit(ctx->editor_baton, iterpool));
+ else
+ return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ _("Missing update-report close tag"));
- if (report->active_dir_propfinds)
- {
- svn_ra_serf__list_t *cur, *prev;
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
- prev = NULL;
- cur = report->active_dir_propfinds;
+static svn_error_t *
+finish_report(void *report_baton,
+ apr_pool_t *pool)
+{
+ report_context_t *report = report_baton;
+ svn_ra_serf__session_t *sess = report->sess;
+ svn_ra_serf__handler_t *handler;
+ svn_ra_serf__xml_context_t *xmlctx;
+ const char *report_target;
+ svn_stringbuf_t *buf = NULL;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ svn_error_t *err;
- while (cur)
- {
- report_dir_t *item = cur->data;
+ svn_xml_make_close_tag(&buf, scratch_pool, "S:update-report");
+ SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
+ SVN_ERR(svn_stream_close(report->body_template));
- if (item->propfind_handler == done_list->data)
- {
- break;
- }
+ SVN_ERR(svn_ra_serf__report_resource(&report_target, sess, scratch_pool));
- prev = cur;
- cur = cur->next;
- }
- SVN_ERR_ASSERT(cur); /* we expect to find a matching propfind! */
+ xmlctx = svn_ra_serf__xml_context_create(update_ttable,
+ update_opened, update_closed,
+ update_cdata,
+ report,
+ scratch_pool);
+ handler = svn_ra_serf__create_expat_handler(sess, xmlctx, NULL,
+ scratch_pool);
- /* If we found a match, set the new props and remove this
- * propchange from our list.
- */
- if (cur)
- {
- report_dir_t *cur_dir = cur->data;
-
- if (!prev)
- {
- report->active_dir_propfinds = cur->next;
- }
- else
- {
- prev->next = cur->next;
- }
-
- /* See if this directory (and perhaps even parents of that)
- can be closed now.
-
- NOTE: This could delete cur_dir->pool, from which is
- allocated the list item in report->active_dir_propfinds.
- */
- SVN_ERR(maybe_close_dir_chain(cur_dir));
- }
- }
+ handler->method = "REPORT";
+ handler->path = report_target;
+ handler->body_delegate = create_update_report_body;
+ handler->body_delegate_baton = report;
+ handler->body_type = "text/xml";
+ handler->custom_accept_encoding = TRUE;
+ handler->header_delegate = setup_update_report_headers;
+ handler->header_delegate_baton = report;
- done_list = next_done;
- }
- report->done_dir_propfinds = NULL;
-
- /* If the parser is paused, and the number of active requests has
- dropped far enough, then resume parsing. */
- if (parser_ctx->paused
- && (report->num_active_fetches + report->num_active_propfinds
- < REQUEST_COUNT_TO_RESUME))
- parser_ctx->paused = FALSE;
-
- /* If we have not paused the parser and it looks like data MAY be
- present (we can't know for sure because of the private structure),
- then go process the pending content. */
- if (!parser_ctx->paused && parser_ctx->pending != NULL)
- SVN_ERR(svn_ra_serf__process_pending(parser_ctx,
- &report->report_received,
- iterpool_inner));
+ svn_ra_serf__request_create(handler);
- /* Debugging purposes only! */
- for (i = 0; i < sess->num_conns; i++)
- {
- serf_debug__closed_conn(sess->conns[i]->bkt_alloc);
- }
- }
+ err = process_editor_report(report, handler, scratch_pool);
- /* If we got a complete report, close the edit. Otherwise, abort it. */
- if (report->report_completed)
+ if (err)
{
- /* Ensure that we opened and closed our root dir and that we closed
- * all of our children. */
- if (!report->closed_root && report->root_dir != NULL)
- {
- SVN_ERR(close_all_dirs(report->root_dir));
- }
-
- err = report->update_editor->close_edit(report->update_baton, iterpool);
+ err = svn_error_trace(err);
+ err = svn_error_compose_create(
+ err,
+ svn_error_trace(
+ report->editor->abort_edit(report->editor_baton,
+ scratch_pool)));
}
- else
- {
- /* Tell the editor that something failed */
- err = report->update_editor->abort_edit(report->update_baton, iterpool);
- err = svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, err,
- _("Missing update-report close tag"));
- }
+ svn_pool_destroy(scratch_pool);
- svn_pool_destroy(iterpool);
return svn_error_trace(err);
}
@@ -3162,7 +2767,7 @@ make_update_reporter(svn_ra_session_t *ra_session,
update_editor,
update_baton,
depth, has_target,
- sess->pool));
+ result_pool));
update_editor = filter_editor;
update_baton = filter_baton;
}
@@ -3170,7 +2775,6 @@ make_update_reporter(svn_ra_session_t *ra_session,
report = apr_pcalloc(result_pool, sizeof(*report));
report->pool = result_pool;
report->sess = sess;
- report->conn = report->sess->conns[0];
report->target_rev = revision;
report->ignore_ancestry = ignore_ancestry;
report->send_copyfrom_args = send_copyfrom_args;
@@ -3181,16 +2785,18 @@ make_update_reporter(svn_ra_session_t *ra_session,
report->destination = dest_path;
report->update_target = update_target;
- report->update_editor = update_editor;
- report->update_baton = update_baton;
+ report->editor = update_editor;
+ report->editor_baton = update_baton;
report->done = FALSE;
*reporter = &ra_serf_reporter;
*report_baton = report;
- SVN_ERR(svn_io_open_unique_file3(&report->body_file, NULL, NULL,
- svn_io_file_del_on_pool_cleanup,
- report->pool, scratch_pool));
+ report->body = apr_pcalloc(report->pool, sizeof(*report->body));
+ report->body->result_pool = report->pool;
+ report->body_template = svn_stream_create(report->body, report->pool);
+ svn_stream_set_write(report->body_template, body_write_fn);
+ svn_stream_set_close(report->body_template, body_done_fn);
if (sess->bulk_updates == svn_tristate_true)
{
@@ -3231,6 +2837,14 @@ make_update_reporter(svn_ra_session_t *ra_session,
supports inlining properties in update editor report. */
if (sess->supports_inline_props)
{
+ /* NOTE: both inlined properties and server->allows_bulk_update
+ (flag SVN_DAV_ALLOW_BULK_UPDATES) were added in 1.8.0, so
+ this code is never reached with a released version of
+ mod_dav_svn.
+
+ Basically by default a 1.8.0 client connecting to a 1.7.x or
+ older server will always use bulk updates. */
+
/* Inline props supported: do not use bulk updates. */
use_bulk_updates = FALSE;
}
@@ -3248,14 +2862,14 @@ make_update_reporter(svn_ra_session_t *ra_session,
svn_xml_make_open_tag(&buf, scratch_pool, svn_xml_normal,
"S:update-report",
"xmlns:S", SVN_XML_NAMESPACE, "send-all", "true",
- NULL);
+ SVN_VA_NULL);
}
else
{
svn_xml_make_open_tag(&buf, scratch_pool, svn_xml_normal,
"S:update-report",
"xmlns:S", SVN_XML_NAMESPACE,
- NULL);
+ SVN_VA_NULL);
/* Subversion 1.8+ servers can be told to send properties for newly
added items inline even when doing a skelta response. */
make_simple_xml_tag(&buf, "S:include-props", "yes", scratch_pool);
@@ -3315,8 +2929,7 @@ make_update_reporter(svn_ra_session_t *ra_session,
make_simple_xml_tag(&buf, "S:depth", svn_depth_to_word(depth), scratch_pool);
- SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
- NULL, scratch_pool));
+ SVN_ERR(svn_stream_write(report->body_template, buf->data, &buf->len));
return SVN_NO_ERROR;
}
@@ -3367,7 +2980,8 @@ svn_ra_serf__do_diff(svn_ra_session_t *ra_session,
SVN_ERR(make_update_reporter(ra_session, reporter, report_baton,
revision,
session->session_url.path, versus_url, diff_target,
- depth, ignore_ancestry, text_deltas, FALSE,
+ depth, ignore_ancestry, text_deltas,
+ FALSE /* send_copyfrom */,
diff_editor, diff_baton,
pool, scratch_pool));
svn_pool_destroy(scratch_pool);
@@ -3426,195 +3040,3 @@ svn_ra_serf__do_switch(svn_ra_session_t *ra_session,
switch_editor, switch_baton,
result_pool, scratch_pool);
}
-
-/* Helper svn_ra_serf__get_file(). Attempts to fetch file contents
- * using SESSION->wc_callbacks->get_wc_contents() if sha1 property is
- * present in PROPS.
- *
- * Sets *FOUND_P to TRUE if file contents was successfuly fetched.
- *
- * Performs all temporary allocations in POOL.
- */
-static svn_error_t *
-try_get_wc_contents(svn_boolean_t *found_p,
- svn_ra_serf__session_t *session,
- apr_hash_t *props,
- svn_stream_t *dst_stream,
- apr_pool_t *pool)
-{
- apr_hash_t *svn_props;
- const char *sha1_checksum_prop;
- svn_checksum_t *checksum;
- svn_stream_t *wc_stream;
- svn_error_t *err;
-
- /* No contents found by default. */
- *found_p = FALSE;
-
- if (!session->wc_callbacks->get_wc_contents)
- {
- /* No callback, nothing to do. */
- return SVN_NO_ERROR;
- }
-
-
- svn_props = svn_hash_gets(props, SVN_DAV_PROP_NS_DAV);
- if (!svn_props)
- {
- /* No properties -- therefore no checksum property -- in response. */
- return SVN_NO_ERROR;
- }
-
- sha1_checksum_prop = svn_prop_get_value(svn_props, "sha1-checksum");
- if (sha1_checksum_prop == NULL)
- {
- /* No checksum property in response. */
- return SVN_NO_ERROR;
- }
-
- SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1,
- sha1_checksum_prop, pool));
-
- err = session->wc_callbacks->get_wc_contents(
- session->wc_callback_baton, &wc_stream, checksum, pool);
-
- if (err)
- {
- svn_error_clear(err);
-
- /* Ignore errors for now. */
- return SVN_NO_ERROR;
- }
-
- if (wc_stream)
- {
- SVN_ERR(svn_stream_copy3(wc_stream,
- svn_stream_disown(dst_stream, pool),
- NULL, NULL, pool));
- *found_p = TRUE;
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_ra_serf__get_file(svn_ra_session_t *ra_session,
- const char *path,
- svn_revnum_t revision,
- svn_stream_t *stream,
- svn_revnum_t *fetched_rev,
- apr_hash_t **props,
- apr_pool_t *pool)
-{
- svn_ra_serf__session_t *session = ra_session->priv;
- svn_ra_serf__connection_t *conn;
- const char *fetch_url;
- apr_hash_t *fetch_props;
- svn_node_kind_t res_kind;
- const svn_ra_serf__dav_props_t *which_props;
-
- /* What connection should we go on? */
- conn = session->conns[session->cur_conn];
-
- /* Fetch properties. */
-
- fetch_url = svn_path_url_add_component2(session->session_url.path, path, pool);
-
- /* The simple case is if we want HEAD - then a GET on the fetch_url is fine.
- *
- * Otherwise, we need to get the baseline version for this particular
- * revision and then fetch that file.
- */
- if (SVN_IS_VALID_REVNUM(revision) || fetched_rev)
- {
- SVN_ERR(svn_ra_serf__get_stable_url(&fetch_url, fetched_rev,
- session, conn,
- fetch_url, revision,
- pool, pool));
- revision = SVN_INVALID_REVNUM;
- }
- /* REVISION is always SVN_INVALID_REVNUM */
- SVN_ERR_ASSERT(!SVN_IS_VALID_REVNUM(revision));
-
- if (props)
- {
- which_props = all_props;
- }
- else if (stream && session->wc_callbacks->get_wc_contents)
- {
- which_props = type_and_checksum_props;
- }
- else
- {
- which_props = check_path_props;
- }
-
- SVN_ERR(svn_ra_serf__fetch_node_props(&fetch_props, conn, fetch_url,
- SVN_INVALID_REVNUM,
- which_props,
- pool, pool));
-
- /* Verify that resource type is not collection. */
- SVN_ERR(svn_ra_serf__get_resource_type(&res_kind, fetch_props));
- if (res_kind != svn_node_file)
- {
- return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
- _("Can't get text contents of a directory"));
- }
-
- /* TODO Filter out all of our props into a usable format. */
- if (props)
- {
- /* ### flatten_props() does not copy PROPVALUE, but fetch_node_props()
- ### put them into POOL, so we're okay. */
- SVN_ERR(svn_ra_serf__flatten_props(props, fetch_props,
- pool, pool));
- }
-
- if (stream)
- {
- svn_boolean_t found;
- SVN_ERR(try_get_wc_contents(&found, session, fetch_props, stream, pool));
-
- /* No contents found in the WC, let's fetch from server. */
- if (!found)
- {
- report_fetch_t *stream_ctx;
- svn_ra_serf__handler_t *handler;
-
- /* Create the fetch context. */
- stream_ctx = apr_pcalloc(pool, sizeof(*stream_ctx));
- stream_ctx->target_stream = stream;
- stream_ctx->sess = session;
- stream_ctx->conn = conn;
- stream_ctx->info = apr_pcalloc(pool, sizeof(*stream_ctx->info));
- stream_ctx->info->name = fetch_url;
-
- handler = apr_pcalloc(pool, sizeof(*handler));
-
- handler->handler_pool = pool;
- handler->method = "GET";
- handler->path = fetch_url;
- handler->conn = conn;
- handler->session = session;
-
- handler->custom_accept_encoding = TRUE;
- handler->header_delegate = headers_fetch;
- handler->header_delegate_baton = stream_ctx;
-
- handler->response_handler = handle_stream;
- handler->response_baton = stream_ctx;
-
- handler->response_error = cancel_fetch;
- handler->response_error_baton = stream_ctx;
-
- stream_ctx->handler = handler;
-
- svn_ra_serf__request_create(handler);
-
- SVN_ERR(svn_ra_serf__context_run_wait(&stream_ctx->done, session, pool));
- }
- }
-
- return SVN_NO_ERROR;
-}
diff --git a/subversion/libsvn_ra_serf/util.c b/subversion/libsvn_ra_serf/util.c
index 8f6c1bb..5490dde 100644
--- a/subversion/libsvn_ra_serf/util.c
+++ b/subversion/libsvn_ra_serf/util.c
@@ -32,83 +32,22 @@
#include <serf.h>
#include <serf_bucket_types.h>
-#include <expat.h>
-
#include "svn_hash.h"
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_private_config.h"
#include "svn_string.h"
-#include "svn_xml.h"
#include "svn_props.h"
#include "svn_dirent_uri.h"
#include "../libsvn_ra/ra_loader.h"
#include "private/svn_dep_compat.h"
#include "private/svn_fspath.h"
-#include "private/svn_subr_private.h"
#include "private/svn_auth_private.h"
#include "private/svn_cert.h"
#include "ra_serf.h"
-
-/* Fix for older expat 1.95.x's that do not define
- * XML_STATUS_OK/XML_STATUS_ERROR
- */
-#ifndef XML_STATUS_OK
-#define XML_STATUS_OK 1
-#define XML_STATUS_ERROR 0
-#endif
-
-#ifndef XML_VERSION_AT_LEAST
-#define XML_VERSION_AT_LEAST(major,minor,patch) \
-(((major) < XML_MAJOR_VERSION) \
- || ((major) == XML_MAJOR_VERSION && (minor) < XML_MINOR_VERSION) \
- || ((major) == XML_MAJOR_VERSION && (minor) == XML_MINOR_VERSION && \
- (patch) <= XML_MICRO_VERSION))
-#endif /* APR_VERSION_AT_LEAST */
-
-#if XML_VERSION_AT_LEAST(1, 95, 8)
-#define EXPAT_HAS_STOPPARSER
-#endif
-
-/* Read/write chunks of this size into the spillbuf. */
-#define PARSE_CHUNK_SIZE 8000
-
-/* We will store one megabyte in memory, before switching to store content
- into a temporary file. */
-#define SPILL_SIZE 1000000
-
-
-/* This structure records pending data for the parser in memory blocks,
- and possibly into a temporary file if "too much" content arrives. */
-struct svn_ra_serf__pending_t {
- /* The spillbuf where we record the pending data. */
- svn_spillbuf_t *buf;
-
- /* This flag is set when the network has reached EOF. The PENDING
- processing can then properly detect when parsing has completed. */
- svn_boolean_t network_eof;
-};
-
-#define HAS_PENDING_DATA(p) ((p) != NULL && (p)->buf != NULL \
- && svn_spillbuf__get_size((p)->buf) != 0)
-
-
-struct expat_ctx_t {
- svn_ra_serf__xml_context_t *xmlctx;
- XML_Parser parser;
- svn_ra_serf__handler_t *handler;
-
- svn_error_t *inner_error;
-
- /* Do not use this pool for allocation. It is merely recorded for running
- the cleanup handler. */
- apr_pool_t *cleanup_pool;
-};
-
-
static const apr_uint32_t serf_failure_map[][2] =
{
{ SERF_SSL_CERT_NOTYETVALID, SVN_AUTH_SSL_NOTYETVALID },
@@ -192,6 +131,7 @@ construct_realm(svn_ra_serf__session_t *session,
static char *
convert_organisation_to_str(apr_hash_t *org, apr_pool_t *pool)
{
+ const char *cn = svn_hash_gets(org, "CN");
const char *org_unit = svn_hash_gets(org, "OU");
const char *org_name = svn_hash_gets(org, "O");
const char *locality = svn_hash_gets(org, "L");
@@ -200,6 +140,12 @@ convert_organisation_to_str(apr_hash_t *org, apr_pool_t *pool)
const char *email = svn_hash_gets(org, "E");
svn_stringbuf_t *buf = svn_stringbuf_create_empty(pool);
+ if (cn)
+ {
+ svn_stringbuf_appendcstr(buf, cn);
+ svn_stringbuf_appendcstr(buf, ", ");
+ }
+
if (org_unit)
{
svn_stringbuf_appendcstr(buf, org_unit);
@@ -285,7 +231,6 @@ ssl_server_cert(void *baton, int failures,
### This should really be handled by serf, which should pass an error
for this case, but that has backwards compatibility issues. */
apr_array_header_t *san;
- svn_boolean_t found_san_entry = FALSE;
svn_boolean_t found_matching_hostname = FALSE;
svn_string_t *actual_hostname =
svn_string_create(conn->session->session_url.hostname, scratch_pool);
@@ -293,11 +238,16 @@ ssl_server_cert(void *baton, int failures,
serf_cert = serf_ssl_cert_certificate(cert, scratch_pool);
san = svn_hash_gets(serf_cert, "subjectAltName");
- /* Try to find matching server name via subjectAltName first... */
- if (san)
+ /* Match server certificate CN with the hostname of the server iff
+ * we didn't find any subjectAltName fields and try to match them.
+ * Per RFC 2818 they are authoritative if present and CommonName
+ * should be ignored. NOTE: This isn't 100% correct since serf
+ * only loads the subjectAltName hash with dNSNames, technically
+ * we should ignore the CommonName if any subjectAltName entry
+ * exists even if it is one we don't support. */
+ if (san && san->nelts > 0)
{
int i;
- found_san_entry = san->nelts > 0;
for (i = 0; i < san->nelts; i++)
{
const char *s = APR_ARRAY_IDX(san, i, const char*);
@@ -310,12 +260,7 @@ ssl_server_cert(void *baton, int failures,
}
}
}
-
- /* Match server certificate CN with the hostname of the server iff
- * we didn't find any subjectAltName fields and try to match them.
- * Per RFC 2818 they are authoritative if present and CommonName
- * should be ignored. */
- if (!found_matching_hostname && !found_san_entry)
+ else
{
const char *hostname = NULL;
@@ -368,11 +313,11 @@ ssl_server_cert(void *baton, int failures,
{
svn_error_t *err;
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO,
&cert_info);
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_FAILURES,
&svn_failures);
@@ -382,13 +327,13 @@ ssl_server_cert(void *baton, int failures,
err = svn_auth_first_credentials(&creds, &state,
SVN_AUTH_CRED_SSL_SERVER_AUTHORITY,
realmstring,
- conn->session->wc_callbacks->auth_baton,
+ conn->session->auth_baton,
scratch_pool);
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO, NULL);
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_FAILURES, NULL);
if (err)
@@ -415,11 +360,11 @@ ssl_server_cert(void *baton, int failures,
return APR_SUCCESS;
}
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_FAILURES,
&svn_failures);
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO,
&cert_info);
@@ -428,7 +373,7 @@ ssl_server_cert(void *baton, int failures,
SVN_ERR(svn_auth_first_credentials(&creds, &state,
SVN_AUTH_CRED_SSL_SERVER_TRUST,
realmstring,
- conn->session->wc_callbacks->auth_baton,
+ conn->session->auth_baton,
scratch_pool));
if (creds)
{
@@ -449,7 +394,7 @@ ssl_server_cert(void *baton, int failures,
}
}
- svn_auth_set_parameter(conn->session->wc_callbacks->auth_baton,
+ svn_auth_set_parameter(conn->session->auth_baton,
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO, NULL);
/* Are there non accepted failures left? */
@@ -622,6 +567,7 @@ accept_response(serf_request_t *request,
void *acceptor_baton,
apr_pool_t *pool)
{
+ /* svn_ra_serf__handler_t *handler = acceptor_baton; */
serf_bucket_t *c;
serf_bucket_alloc_t *bkt_alloc;
@@ -639,6 +585,7 @@ accept_head(serf_request_t *request,
void *acceptor_baton,
apr_pool_t *pool)
{
+ /* svn_ra_serf__handler_t *handler = acceptor_baton; */
serf_bucket_t *response;
response = accept_response(request, stream, acceptor_baton, pool);
@@ -656,7 +603,7 @@ connection_closed(svn_ra_serf__connection_t *conn,
{
if (why)
{
- return svn_error_wrap_apr(why, NULL);
+ return svn_ra_serf__wrap_err(why, NULL);
}
if (conn->session->using_ssl)
@@ -701,7 +648,7 @@ handle_client_cert(void *data,
&conn->ssl_client_auth_state,
SVN_AUTH_CRED_SSL_CLIENT_CERT,
realm,
- session->wc_callbacks->auth_baton,
+ session->auth_baton,
pool));
}
else
@@ -753,7 +700,7 @@ handle_client_cert_pw(void *data,
&conn->ssl_client_pw_auth_state,
SVN_AUTH_CRED_SSL_CLIENT_CERT_PW,
cert_path,
- session->wc_callbacks->auth_baton,
+ session->auth_baton,
pool));
}
else
@@ -804,6 +751,9 @@ apr_status_t svn_ra_serf__handle_client_cert_pw(void *data,
*
* If CONTENT_TYPE is not-NULL, it will be sent as the Content-Type header.
*
+ * If DAV_HEADERS is non-zero, it will add standard DAV capabilites headers
+ * to request.
+ *
* REQUEST_POOL should live for the duration of the request. Serf will
* construct this and provide it to the request_setup callback, so we
* should just use that one.
@@ -816,6 +766,7 @@ setup_serf_req(serf_request_t *request,
const char *method, const char *url,
serf_bucket_t *body_bkt, const char *content_type,
const char *accept_encoding,
+ svn_boolean_t dav_headers,
apr_pool_t *request_pool,
apr_pool_t *scratch_pool)
{
@@ -882,12 +833,86 @@ setup_serf_req(serf_request_t *request,
serf_bucket_headers_setn(*hdrs_bkt, "Accept-Encoding", accept_encoding);
}
- /* These headers need to be sent with every request; see issue #3255
- ("mod_dav_svn does not pass client capabilities to start-commit
- hooks") for why. */
- serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_DEPTH);
- serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_MERGEINFO);
- serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_LOG_REVPROPS);
+ /* These headers need to be sent with every request that might need
+ capability processing (e.g. during commit, reports, etc.), see
+ issue #3255 ("mod_dav_svn does not pass client capabilities to
+ start-commit hooks") for why.
+
+ Some request types like GET/HEAD/PROPFIND are unaware of capability
+ handling; and in some cases the responses can even be cached by
+ proxies, so we don't have to send these hearders there. */
+ if (dav_headers)
+ {
+ serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_DEPTH);
+ serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_MERGEINFO);
+ serf_bucket_headers_setn(*hdrs_bkt, "DAV", SVN_DAV_NS_DAV_SVN_LOG_REVPROPS);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_serf__context_run(svn_ra_serf__session_t *sess,
+ apr_interval_time_t *waittime_left,
+ apr_pool_t *scratch_pool)
+{
+ apr_status_t status;
+ svn_error_t *err;
+ assert(sess->pending_error == SVN_NO_ERROR);
+
+ if (sess->cancel_func)
+ SVN_ERR(sess->cancel_func(sess->cancel_baton));
+
+ status = serf_context_run(sess->context,
+ SVN_RA_SERF__CONTEXT_RUN_DURATION,
+ scratch_pool);
+
+ err = sess->pending_error;
+ sess->pending_error = SVN_NO_ERROR;
+
+ /* If the context duration timeout is up, we'll subtract that
+ duration from the total time alloted for such things. If
+ there's no time left, we fail with a message indicating that
+ the connection timed out. */
+ if (APR_STATUS_IS_TIMEUP(status))
+ {
+ status = 0;
+
+ if (sess->timeout)
+ {
+ if (*waittime_left > SVN_RA_SERF__CONTEXT_RUN_DURATION)
+ {
+ *waittime_left -= SVN_RA_SERF__CONTEXT_RUN_DURATION;
+ }
+ else
+ {
+ return
+ svn_error_compose_create(
+ err,
+ svn_error_create(SVN_ERR_RA_DAV_CONN_TIMEOUT, NULL,
+ _("Connection timed out")));
+ }
+ }
+ }
+ else
+ {
+ *waittime_left = sess->timeout;
+ }
+
+ SVN_ERR(err);
+ if (status)
+ {
+ /* ### This omits SVN_WARNING, and possibly relies on the fact that
+ ### MAX(SERF_ERROR_*) < SVN_ERR_BAD_CATEGORY_START? */
+ if (status >= SVN_ERR_BAD_CATEGORY_START && status < SVN_ERR_LAST)
+ {
+ /* apr can't translate subversion errors to text */
+ SVN_ERR_W(svn_error_create(status, NULL, NULL),
+ _("Error running context"));
+ }
+
+ return svn_ra_serf__wrap_err(status, _("Error running context"));
+ }
return SVN_NO_ERROR;
}
@@ -905,63 +930,11 @@ svn_ra_serf__context_run_wait(svn_boolean_t *done,
iterpool = svn_pool_create(scratch_pool);
while (!*done)
{
- apr_status_t status;
- svn_error_t *err;
int i;
svn_pool_clear(iterpool);
- if (sess->cancel_func)
- SVN_ERR((*sess->cancel_func)(sess->cancel_baton));
-
- status = serf_context_run(sess->context,
- SVN_RA_SERF__CONTEXT_RUN_DURATION,
- iterpool);
-
- err = sess->pending_error;
- sess->pending_error = SVN_NO_ERROR;
-
- /* If the context duration timeout is up, we'll subtract that
- duration from the total time alloted for such things. If
- there's no time left, we fail with a message indicating that
- the connection timed out. */
- if (APR_STATUS_IS_TIMEUP(status))
- {
- status = 0;
-
- if (sess->timeout)
- {
- if (waittime_left > SVN_RA_SERF__CONTEXT_RUN_DURATION)
- {
- waittime_left -= SVN_RA_SERF__CONTEXT_RUN_DURATION;
- }
- else
- {
- return
- svn_error_compose_create(
- err,
- svn_error_create(SVN_ERR_RA_DAV_CONN_TIMEOUT, NULL,
- _("Connection timed out")));
- }
- }
- }
- else
- {
- waittime_left = sess->timeout;
- }
-
- SVN_ERR(err);
- if (status)
- {
- if (status >= SVN_ERR_BAD_CATEGORY_START && status < SVN_ERR_LAST)
- {
- /* apr can't translate subversion errors to text */
- SVN_ERR_W(svn_error_create(status, NULL, NULL),
- _("Error running context"));
- }
-
- return svn_ra_serf__wrap_err(status, _("Error running context"));
- }
+ SVN_ERR(svn_ra_serf__context_run(sess, &waittime_left, iterpool));
/* Debugging purposes only! */
for (i = 0; i < sess->num_conns; i++)
@@ -974,6 +947,22 @@ svn_ra_serf__context_run_wait(svn_boolean_t *done,
return SVN_NO_ERROR;
}
+/* Ensure that a handler is no longer scheduled on the connection.
+
+ Eventually serf will have a reliable way to cancel existing requests,
+ but currently it doesn't even have a way to relyable identify a request
+ after rescheduling, for auth reasons.
+
+ So the only thing we can do today is reset the connection, which
+ will cancel all outstanding requests and prepare the connection
+ for re-use.
+*/
+static void
+svn_ra_serf__unschedule_handler(svn_ra_serf__handler_t *handler)
+{
+ serf_connection_reset(handler->conn->conn);
+ handler->scheduled = FALSE;
+}
svn_error_t *
svn_ra_serf__context_run_one(svn_ra_serf__handler_t *handler,
@@ -988,130 +977,18 @@ svn_ra_serf__context_run_one(svn_ra_serf__handler_t *handler,
err = svn_ra_serf__context_run_wait(&handler->done, handler->session,
scratch_pool);
- /* A callback invocation has been canceled. In this simple case of
- context_run_one, we can keep the ra-session operational by resetting
- the connection.
-
- If we don't do this, the next context run will notice that the connection
- is still in the error state and will just return SVN_ERR_CEASE_INVOCATION
- (=the last error for the connection) again */
- if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
- {
- apr_status_t status = serf_connection_reset(handler->conn->conn);
-
- if (status)
- err = svn_error_compose_create(err,
- svn_ra_serf__wrap_err(status, NULL));
- }
-
- if (handler->server_error)
+ if (handler->scheduled)
{
- err = svn_error_compose_create(err, handler->server_error->error);
- handler->server_error = NULL;
+ /* We reset the connection (breaking pipelining, etc.), as
+ if we didn't the next data would still be handled by this handler,
+ which is done as far as our caller is concerned. */
+ svn_ra_serf__unschedule_handler(handler);
}
return svn_error_trace(err);
}
-/*
- * Expat callback invoked on a start element tag for an error response.
- */
-static svn_error_t *
-start_error(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- const char **attrs,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (!ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "error") == 0)
- {
- ctx->in_error = TRUE;
- }
- else if (ctx->in_error && strcmp(name.name, "human-readable") == 0)
- {
- const char *err_code;
-
- err_code = svn_xml_get_attr_value("errcode", attrs);
- if (err_code)
- {
- apr_int64_t val;
-
- SVN_ERR(svn_cstring_atoi64(&val, err_code));
- ctx->error->apr_err = (apr_status_t)val;
- }
-
- /* If there's no error code provided, or if the provided code is
- 0 (which can happen sometimes depending on how the error is
- constructed on the server-side), just pick a generic error
- code to run with. */
- if (! ctx->error->apr_err)
- {
- ctx->error->apr_err = SVN_ERR_RA_DAV_REQUEST_FAILED;
- }
-
- /* Start collecting cdata. */
- svn_stringbuf_setempty(ctx->cdata);
- ctx->collect_cdata = TRUE;
- }
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Expat callback invoked on an end element tag for a PROPFIND response.
- */
-static svn_error_t *
-end_error(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "error") == 0)
- {
- ctx->in_error = FALSE;
- }
- if (ctx->in_error && strcmp(name.name, "human-readable") == 0)
- {
- /* On the server dav_error_response_tag() will add a leading
- and trailing newline if DEBUG_CR is defined in mod_dav.h,
- so remove any such characters here. */
- svn_stringbuf_strip_whitespace(ctx->cdata);
-
- ctx->error->message = apr_pstrmemdup(ctx->error->pool, ctx->cdata->data,
- ctx->cdata->len);
- ctx->collect_cdata = FALSE;
- }
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Expat callback invoked on CDATA elements in an error response.
- *
- * This callback can be called multiple times.
- */
-static svn_error_t *
-cdata_error(svn_ra_serf__xml_parser_t *parser,
- const char *data,
- apr_size_t len,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (ctx->collect_cdata)
- {
- svn_stringbuf_appendbytes(ctx->cdata, data, len);
- }
-
- return SVN_NO_ERROR;
-}
static apr_status_t
@@ -1131,28 +1008,7 @@ drain_bucket(serf_bucket_t *bucket)
}
-static svn_ra_serf__server_error_t *
-begin_error_parsing(svn_ra_serf__xml_start_element_t start,
- svn_ra_serf__xml_end_element_t end,
- svn_ra_serf__xml_cdata_chunk_handler_t cdata,
- apr_pool_t *result_pool)
-{
- svn_ra_serf__server_error_t *server_err;
-
- server_err = apr_pcalloc(result_pool, sizeof(*server_err));
- server_err->error = svn_error_create(APR_SUCCESS, NULL, NULL);
- server_err->contains_precondition_error = FALSE;
- server_err->cdata = svn_stringbuf_create_empty(server_err->error->pool);
- server_err->collect_cdata = FALSE;
- server_err->parser.pool = server_err->error->pool;
- server_err->parser.user_data = server_err;
- server_err->parser.start = start;
- server_err->parser.end = end;
- server_err->parser.cdata = cdata;
- server_err->parser.ignore_errors = TRUE;
-
- return server_err;
-}
+
/* Implements svn_ra_serf__response_handler_t */
svn_error_t *
@@ -1241,7 +1097,7 @@ svn_ra_serf__expect_empty_body(serf_request_t *request,
const char *val;
/* This function is just like handle_multistatus_only() except for the
- XML parsing callbacks. We want to look for the human-readable element. */
+ XML parsing callbacks. We want to look for the -readable element. */
/* We should see this just once, in order to initialize SERVER_ERROR.
At that point, the core error processing will take over. If we choose
@@ -1251,21 +1107,22 @@ svn_ra_serf__expect_empty_body(serf_request_t *request,
hdrs = serf_bucket_response_get_headers(response);
val = serf_bucket_headers_get(hdrs, "Content-Type");
- if (val && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
+ if (val
+ && (handler->sline.code < 200 || handler->sline.code >= 300)
+ && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
{
svn_ra_serf__server_error_t *server_err;
- server_err = begin_error_parsing(start_error, end_error, cdata_error,
- handler->handler_pool);
-
- /* Get the parser to set our DONE flag. */
- server_err->parser.done = &handler->done;
+ SVN_ERR(svn_ra_serf__setup_error_parsing(&server_err, handler,
+ FALSE,
+ handler->handler_pool,
+ handler->handler_pool));
handler->server_error = server_err;
}
else
{
- /* The body was not text/xml, so we don't know what to do with it.
+ /* The body was not text/xml, or we got a success code.
Toss anything that arrives. */
handler->discard_body = TRUE;
}
@@ -1277,631 +1134,6 @@ svn_ra_serf__expect_empty_body(serf_request_t *request,
}
-/* Given a string like "HTTP/1.1 500 (status)" in BUF, parse out the numeric
- status code into *STATUS_CODE_OUT. Ignores leading whitespace. */
-static svn_error_t *
-parse_dav_status(int *status_code_out, svn_stringbuf_t *buf,
- apr_pool_t *scratch_pool)
-{
- svn_error_t *err;
- const char *token;
- char *tok_status;
- svn_stringbuf_t *temp_buf = svn_stringbuf_dup(buf, scratch_pool);
-
- svn_stringbuf_strip_whitespace(temp_buf);
- token = apr_strtok(temp_buf->data, " \t\r\n", &tok_status);
- if (token)
- token = apr_strtok(NULL, " \t\r\n", &tok_status);
- if (!token)
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("Malformed DAV:status CDATA '%s'"),
- buf->data);
- err = svn_cstring_atoi(status_code_out, token);
- if (err)
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, err,
- _("Malformed DAV:status CDATA '%s'"),
- buf->data);
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Expat callback invoked on a start element tag for a 207 response.
- */
-static svn_error_t *
-start_207(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- const char **attrs,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (!ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "multistatus") == 0)
- {
- ctx->in_error = TRUE;
- }
- else if (ctx->in_error && strcmp(name.name, "responsedescription") == 0)
- {
- /* Start collecting cdata. */
- svn_stringbuf_setempty(ctx->cdata);
- ctx->collect_cdata = TRUE;
- }
- else if (ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "status") == 0)
- {
- /* Start collecting cdata. */
- svn_stringbuf_setempty(ctx->cdata);
- ctx->collect_cdata = TRUE;
- }
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Expat callback invoked on an end element tag for a 207 response.
- */
-static svn_error_t *
-end_207(svn_ra_serf__xml_parser_t *parser,
- svn_ra_serf__dav_props_t name,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "multistatus") == 0)
- {
- ctx->in_error = FALSE;
- }
- if (ctx->in_error && strcmp(name.name, "responsedescription") == 0)
- {
- /* Remove leading newline added by DEBUG_CR on server */
- svn_stringbuf_strip_whitespace(ctx->cdata);
-
- ctx->collect_cdata = FALSE;
- ctx->error->message = apr_pstrmemdup(ctx->error->pool, ctx->cdata->data,
- ctx->cdata->len);
- if (ctx->contains_precondition_error)
- ctx->error->apr_err = SVN_ERR_FS_PROP_BASEVALUE_MISMATCH;
- else
- ctx->error->apr_err = SVN_ERR_RA_DAV_REQUEST_FAILED;
- }
- else if (ctx->in_error &&
- strcmp(name.namespace, "DAV:") == 0 &&
- strcmp(name.name, "status") == 0)
- {
- int status_code;
-
- ctx->collect_cdata = FALSE;
-
- SVN_ERR(parse_dav_status(&status_code, ctx->cdata, parser->pool));
- if (status_code == 412)
- ctx->contains_precondition_error = TRUE;
- }
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Expat callback invoked on CDATA elements in a 207 response.
- *
- * This callback can be called multiple times.
- */
-static svn_error_t *
-cdata_207(svn_ra_serf__xml_parser_t *parser,
- const char *data,
- apr_size_t len,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t *ctx = parser->user_data;
-
- if (ctx->collect_cdata)
- {
- svn_stringbuf_appendbytes(ctx->cdata, data, len);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_ra_serf__response_handler_t */
-svn_error_t *
-svn_ra_serf__handle_multistatus_only(serf_request_t *request,
- serf_bucket_t *response,
- void *baton,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__handler_t *handler = baton;
-
- /* This function is just like expect_empty_body() except for the
- XML parsing callbacks. We are looking for very limited pieces of
- the multistatus response. */
-
- /* We should see this just once, in order to initialize SERVER_ERROR.
- At that point, the core error processing will take over. If we choose
- not to parse an error, then we'll never return here (because we
- change the response handler). */
- SVN_ERR_ASSERT(handler->server_error == NULL);
-
- {
- serf_bucket_t *hdrs;
- const char *val;
-
- hdrs = serf_bucket_response_get_headers(response);
- val = serf_bucket_headers_get(hdrs, "Content-Type");
- if (val && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
- {
- svn_ra_serf__server_error_t *server_err;
-
- server_err = begin_error_parsing(start_207, end_207, cdata_207,
- handler->handler_pool);
-
- /* Get the parser to set our DONE flag. */
- server_err->parser.done = &handler->done;
-
- handler->server_error = server_err;
- }
- else
- {
- /* The body was not text/xml, so we don't know what to do with it.
- Toss anything that arrives. */
- handler->discard_body = TRUE;
- }
- }
-
- /* Returning SVN_NO_ERROR will return APR_SUCCESS to serf, which tells it
- to call the response handler again. That will start up the XML parsing,
- or it will be dropped on the floor (per the decision above). */
- return SVN_NO_ERROR;
-}
-
-
-/* Conforms to Expat's XML_StartElementHandler */
-static void
-start_xml(void *userData, const char *raw_name, const char **attrs)
-{
- svn_ra_serf__xml_parser_t *parser = userData;
- svn_ra_serf__dav_props_t name;
- apr_pool_t *scratch_pool;
- svn_error_t *err;
-
- if (parser->error)
- return;
-
- if (!parser->state)
- svn_ra_serf__xml_push_state(parser, 0);
-
- /* ### get a real scratch_pool */
- scratch_pool = parser->state->pool;
-
- svn_ra_serf__define_ns(&parser->state->ns_list, attrs, parser->state->pool);
-
- svn_ra_serf__expand_ns(&name, parser->state->ns_list, raw_name);
-
- err = parser->start(parser, name, attrs, scratch_pool);
- if (err && !SERF_BUCKET_READ_ERROR(err->apr_err))
- err = svn_error_create(SVN_ERR_RA_SERF_WRAPPED_ERROR, err, NULL);
-
- parser->error = err;
-}
-
-
-/* Conforms to Expat's XML_EndElementHandler */
-static void
-end_xml(void *userData, const char *raw_name)
-{
- svn_ra_serf__xml_parser_t *parser = userData;
- svn_ra_serf__dav_props_t name;
- svn_error_t *err;
- apr_pool_t *scratch_pool;
-
- if (parser->error)
- return;
-
- /* ### get a real scratch_pool */
- scratch_pool = parser->state->pool;
-
- svn_ra_serf__expand_ns(&name, parser->state->ns_list, raw_name);
-
- err = parser->end(parser, name, scratch_pool);
- if (err && !SERF_BUCKET_READ_ERROR(err->apr_err))
- err = svn_error_create(SVN_ERR_RA_SERF_WRAPPED_ERROR, err, NULL);
-
- parser->error = err;
-}
-
-
-/* Conforms to Expat's XML_CharacterDataHandler */
-static void
-cdata_xml(void *userData, const char *data, int len)
-{
- svn_ra_serf__xml_parser_t *parser = userData;
- svn_error_t *err;
- apr_pool_t *scratch_pool;
-
- if (parser->error)
- return;
-
- if (!parser->state)
- svn_ra_serf__xml_push_state(parser, 0);
-
- /* ### get a real scratch_pool */
- scratch_pool = parser->state->pool;
-
- err = parser->cdata(parser, data, len, scratch_pool);
- if (err && !SERF_BUCKET_READ_ERROR(err->apr_err))
- err = svn_error_create(SVN_ERR_RA_SERF_WRAPPED_ERROR, err, NULL);
-
- parser->error = err;
-}
-
-/* Flip the requisite bits in CTX to indicate that processing of the
- response is complete, adding the current "done item" to the list of
- completed items. */
-static void
-add_done_item(svn_ra_serf__xml_parser_t *ctx)
-{
- /* Make sure we don't add to DONE_LIST twice. */
- if (!*ctx->done)
- {
- *ctx->done = TRUE;
- if (ctx->done_list)
- {
- ctx->done_item->data = ctx->user_data;
- ctx->done_item->next = *ctx->done_list;
- *ctx->done_list = ctx->done_item;
- }
- }
-}
-
-
-static svn_error_t *
-write_to_pending(svn_ra_serf__xml_parser_t *ctx,
- const char *data,
- apr_size_t len,
- apr_pool_t *scratch_pool)
-{
- if (ctx->pending == NULL)
- {
- ctx->pending = apr_pcalloc(ctx->pool, sizeof(*ctx->pending));
- ctx->pending->buf = svn_spillbuf__create(PARSE_CHUNK_SIZE,
- SPILL_SIZE,
- ctx->pool);
- }
-
- /* Copy the data into one or more chunks in the spill buffer. */
- return svn_error_trace(svn_spillbuf__write(ctx->pending->buf,
- data, len,
- scratch_pool));
-}
-
-
-static svn_error_t *
-inject_to_parser(svn_ra_serf__xml_parser_t *ctx,
- const char *data,
- apr_size_t len,
- const serf_status_line *sl)
-{
- int xml_status;
-
- xml_status = XML_Parse(ctx->xmlp, data, (int) len, 0);
-
- if (! ctx->ignore_errors)
- {
- SVN_ERR(ctx->error);
-
- if (xml_status != XML_STATUS_OK)
- {
- if (sl == NULL)
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("XML parsing failed"));
-
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("XML parsing failed: (%d %s)"),
- sl->code, sl->reason);
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Apr pool cleanup handler to release an XML_Parser in success and error
- conditions */
-static apr_status_t
-xml_parser_cleanup(void *baton)
-{
- XML_Parser *xmlp = baton;
-
- if (*xmlp)
- {
- (void) XML_ParserFree(*xmlp);
- *xmlp = NULL;
- }
-
- return APR_SUCCESS;
-}
-
-/* Limit the amount of pending content to parse at once to < 100KB per
- iteration. This number is chosen somewhat arbitrarely. Making it lower
- will have a drastical negative impact on performance, whereas increasing it
- increases the risk for connection timeouts.
- */
-#define PENDING_TO_PARSE PARSE_CHUNK_SIZE * 5
-
-svn_error_t *
-svn_ra_serf__process_pending(svn_ra_serf__xml_parser_t *parser,
- svn_boolean_t *network_eof,
- apr_pool_t *scratch_pool)
-{
- svn_boolean_t pending_empty = FALSE;
- apr_size_t cur_read = 0;
-
- /* Fast path exit: already paused, nothing to do, or already done. */
- if (parser->paused || parser->pending == NULL || *parser->done)
- {
- *network_eof = parser->pending ? parser->pending->network_eof : FALSE;
- return SVN_NO_ERROR;
- }
-
- /* Parsing the pending conten in the spillbuf will result in many disc i/o
- operations. This can be so slow that we don't run the network event
- processing loop often enough, resulting in timed out connections.
-
- So we limit the amounts of bytes parsed per iteration.
- */
- while (cur_read < PENDING_TO_PARSE)
- {
- const char *data;
- apr_size_t len;
-
- /* Get a block of content, stopping the loop when we run out. */
- SVN_ERR(svn_spillbuf__read(&data, &len, parser->pending->buf,
- scratch_pool));
- if (data)
- {
- /* Inject the content into the XML parser. */
- SVN_ERR(inject_to_parser(parser, data, len, NULL));
-
- /* If the XML parsing callbacks paused us, then we're done for now. */
- if (parser->paused)
- break;
-
- cur_read += len;
- }
- else
- {
- /* The buffer is empty. */
- pending_empty = TRUE;
- break;
- }
- }
-
- /* If the PENDING structures are empty *and* we consumed all content from
- the network, then we're completely done with the parsing. */
- if (pending_empty &&
- parser->pending->network_eof)
- {
- int xml_status;
- SVN_ERR_ASSERT(parser->xmlp != NULL);
-
- /* Tell the parser that no more content will be parsed. */
- xml_status = XML_Parse(parser->xmlp, NULL, 0, 1);
-
- apr_pool_cleanup_run(parser->pool, &parser->xmlp, xml_parser_cleanup);
- parser->xmlp = NULL;
-
- if (! parser->ignore_errors)
- {
- SVN_ERR(parser->error);
-
- if (xml_status != XML_STATUS_OK)
- {
- return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
- _("XML parsing failed"));
- }
- }
-
- add_done_item(parser);
- }
-
- *network_eof = parser->pending ? parser->pending->network_eof : FALSE;
-
- return SVN_NO_ERROR;
-}
-#undef PENDING_TO_PARSE
-
-
-/* ### this is still broken conceptually. just shifting incrementally... */
-static svn_error_t *
-handle_server_error(serf_request_t *request,
- serf_bucket_t *response,
- apr_pool_t *scratch_pool)
-{
- svn_ra_serf__server_error_t server_err = { 0 };
- serf_bucket_t *hdrs;
- const char *val;
- apr_status_t err;
-
- hdrs = serf_bucket_response_get_headers(response);
- val = serf_bucket_headers_get(hdrs, "Content-Type");
- if (val && strncasecmp(val, "text/xml", sizeof("text/xml") - 1) == 0)
- {
- /* ### we should figure out how to reuse begin_error_parsing */
-
- server_err.error = svn_error_create(APR_SUCCESS, NULL, NULL);
- server_err.contains_precondition_error = FALSE;
- server_err.cdata = svn_stringbuf_create_empty(scratch_pool);
- server_err.collect_cdata = FALSE;
- server_err.parser.pool = server_err.error->pool;
- server_err.parser.user_data = &server_err;
- server_err.parser.start = start_error;
- server_err.parser.end = end_error;
- server_err.parser.cdata = cdata_error;
- server_err.parser.done = &server_err.done;
- server_err.parser.ignore_errors = TRUE;
-
- /* We don't care about any errors except for SERVER_ERR.ERROR */
- svn_error_clear(svn_ra_serf__handle_xml_parser(request,
- response,
- &server_err.parser,
- scratch_pool));
-
- /* ### checking DONE is silly. the above only parses whatever has
- ### been received at the network interface. totally wrong. but
- ### it is what we have for now (maintaining historical code),
- ### until we fully migrate. */
- if (server_err.done && server_err.error->apr_err == APR_SUCCESS)
- {
- svn_error_clear(server_err.error);
- server_err.error = SVN_NO_ERROR;
- }
-
- return svn_error_trace(server_err.error);
- }
-
- /* The only error that we will return is from the XML response body.
- Otherwise, ignore the entire body but allow SUCCESS/EOF/EAGAIN to
- surface. */
- err = drain_bucket(response);
- if (err && !SERF_BUCKET_READ_ERROR(err))
- return svn_ra_serf__wrap_err(err, NULL);
-
- return SVN_NO_ERROR;
-}
-
-
-/* Implements svn_ra_serf__response_handler_t */
-svn_error_t *
-svn_ra_serf__handle_xml_parser(serf_request_t *request,
- serf_bucket_t *response,
- void *baton,
- apr_pool_t *pool)
-{
- serf_status_line sl;
- apr_status_t status;
- svn_ra_serf__xml_parser_t *ctx = baton;
- svn_error_t *err;
-
- /* ### get the HANDLER rather than fetching this. */
- status = serf_bucket_response_status(response, &sl);
- if (SERF_BUCKET_READ_ERROR(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
-
- /* Woo-hoo. Nothing here to see. */
- if (sl.code == 404 && !ctx->ignore_errors)
- {
- err = handle_server_error(request, response, pool);
-
- if (err && APR_STATUS_IS_EOF(err->apr_err))
- add_done_item(ctx);
-
- return svn_error_trace(err);
- }
-
- if (!ctx->xmlp)
- {
- ctx->xmlp = XML_ParserCreate(NULL);
- apr_pool_cleanup_register(ctx->pool, &ctx->xmlp, xml_parser_cleanup,
- apr_pool_cleanup_null);
- XML_SetUserData(ctx->xmlp, ctx);
- XML_SetElementHandler(ctx->xmlp, start_xml, end_xml);
- if (ctx->cdata)
- {
- XML_SetCharacterDataHandler(ctx->xmlp, cdata_xml);
- }
- }
-
- while (1)
- {
- const char *data;
- apr_size_t len;
-
- status = serf_bucket_read(response, PARSE_CHUNK_SIZE, &data, &len);
- if (SERF_BUCKET_READ_ERROR(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
-
- /* Note: once the callbacks invoked by inject_to_parser() sets the
- PAUSED flag, then it will not be cleared. write_to_pending() will
- only save the content. Logic outside of serf_context_run() will
- clear that flag, as appropriate, along with processing the
- content that we have placed into the PENDING buffer.
-
- We want to save arriving content into the PENDING structures if
- the parser has been paused, or we already have data in there (so
- the arriving data is appended, rather than injected out of order) */
- if (ctx->paused || HAS_PENDING_DATA(ctx->pending))
- {
- err = write_to_pending(ctx, data, len, pool);
- }
- else
- {
- err = inject_to_parser(ctx, data, len, &sl);
- if (err)
- {
- /* Should have no errors if IGNORE_ERRORS is set. */
- SVN_ERR_ASSERT(!ctx->ignore_errors);
- }
- }
- if (err)
- {
- SVN_ERR_ASSERT(ctx->xmlp != NULL);
-
- apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
- add_done_item(ctx);
- return svn_error_trace(err);
- }
-
- if (APR_STATUS_IS_EAGAIN(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
-
- if (APR_STATUS_IS_EOF(status))
- {
- if (ctx->pending != NULL)
- ctx->pending->network_eof = TRUE;
-
- /* We just hit the end of the network content. If we have nothing
- in the PENDING structures, then we're completely done. */
- if (!HAS_PENDING_DATA(ctx->pending))
- {
- int xml_status;
- SVN_ERR_ASSERT(ctx->xmlp != NULL);
-
- xml_status = XML_Parse(ctx->xmlp, NULL, 0, 1);
-
- apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
-
- if (! ctx->ignore_errors)
- {
- SVN_ERR(ctx->error);
-
- if (xml_status != XML_STATUS_OK)
- {
- return svn_error_create(
- SVN_ERR_XML_MALFORMED, NULL,
- _("The XML response contains invalid XML"));
- }
- }
-
- add_done_item(ctx);
- }
-
- return svn_ra_serf__wrap_err(status, NULL);
- }
-
- /* feed me! */
- }
- /* not reached */
-}
-
-
apr_status_t
svn_ra_serf__credentials_callback(char **username, char **password,
serf_request_t *request, void *baton,
@@ -1927,7 +1159,7 @@ svn_ra_serf__credentials_callback(char **username, char **password,
&session->auth_state,
SVN_AUTH_CRED_SIMPLE,
realm,
- session->wc_callbacks->auth_baton,
+ session->auth_baton,
session->pool);
}
else
@@ -2008,6 +1240,8 @@ handle_response(serf_request_t *request,
if (!response)
{
/* Uh-oh. Our connection died. */
+ handler->scheduled = FALSE;
+
if (handler->response_error)
{
/* Give a handler chance to prevent request requeue. */
@@ -2126,10 +1360,7 @@ handle_response(serf_request_t *request,
}
handler->conn->last_status_code = handler->sline.code;
- if (handler->sline.code == 405
- || handler->sline.code == 408
- || handler->sline.code == 409
- || handler->sline.code >= 500)
+ if (handler->sline.code >= 400)
{
/* 405 Method Not allowed.
408 Request Timeout
@@ -2144,35 +1375,22 @@ handle_response(serf_request_t *request,
{
svn_ra_serf__server_error_t *server_err;
- server_err = begin_error_parsing(start_error, end_error, cdata_error,
- handler->handler_pool);
- /* Get the parser to set our DONE flag. */
- server_err->parser.done = &handler->done;
+ SVN_ERR(svn_ra_serf__setup_error_parsing(&server_err, handler,
+ FALSE,
+ handler->handler_pool,
+ handler->handler_pool));
handler->server_error = server_err;
}
else
{
handler->discard_body = TRUE;
-
- if (!handler->session->pending_error)
- {
- apr_status_t apr_err = SVN_ERR_RA_DAV_REQUEST_FAILED;
-
- /* 405 == Method Not Allowed (Occurs when trying to lock a working
- copy path which no longer exists at HEAD in the repository. */
- if (handler->sline.code == 405
- && strcmp(handler->method, "LOCK") == 0)
- apr_err = SVN_ERR_FS_OUT_OF_DATE;
-
- handler->session->pending_error =
- svn_error_createf(apr_err, NULL,
- _("%s request on '%s' failed: %d %s"),
- handler->method, handler->path,
- handler->sline.code, handler->sline.reason);
- }
}
}
+ else if (handler->sline.code <= 199)
+ {
+ handler->discard_body = TRUE;
+ }
/* Stop processing the above, on every packet arrival. */
handler->reading_body = TRUE;
@@ -2184,13 +1402,6 @@ handle_response(serf_request_t *request,
{
*serf_status = drain_bucket(response);
- /* If the handler hasn't set done (which it shouldn't have) and
- we now have the EOF, go ahead and set it so that we can stop
- our context loops.
- */
- if (!handler->done && APR_STATUS_IS_EOF(*serf_status))
- handler->done = TRUE;
-
return SVN_NO_ERROR;
}
@@ -2198,50 +1409,12 @@ handle_response(serf_request_t *request,
that now. */
if (handler->server_error != NULL)
{
- err = svn_ra_serf__handle_xml_parser(request, response,
- &handler->server_error->parser,
- scratch_pool);
-
- /* If we do not receive an error or it is a non-transient error, return
- immediately.
-
- APR_EOF will be returned when parsing is complete.
-
- APR_EAGAIN & WAIT_CONN may be intermittently returned as we proceed through
- parsing and the network has no more data right now. If we receive that,
- clear the error and return - allowing serf to wait for more data.
- */
- if (!err || SERF_BUCKET_READ_ERROR(err->apr_err))
- return svn_error_trace(err);
-
- if (!APR_STATUS_IS_EOF(err->apr_err))
- {
- *serf_status = err->apr_err;
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
-
- /* Clear the EOF. We don't need it. */
- svn_error_clear(err);
-
- /* If the parsing is done, and we did not extract an error, then
- simply toss everything, and anything else that might arrive.
- The higher-level code will need to investigate HANDLER->SLINE,
- as we have no further information for them. */
- if (handler->done
- && handler->server_error->error->apr_err == APR_SUCCESS)
- {
- svn_error_clear(handler->server_error->error);
-
- /* Stop parsing for a server error. */
- handler->server_error = NULL;
-
- /* If anything arrives after this, then just discard it. */
- handler->discard_body = TRUE;
- }
-
- *serf_status = APR_EOF;
- return SVN_NO_ERROR;
+ return svn_error_trace(
+ svn_ra_serf__handle_server_error(handler->server_error,
+ handler,
+ request, response,
+ serf_status,
+ scratch_pool));
}
/* Pass the body along to the registered response handler. */
@@ -2271,12 +1444,13 @@ static apr_status_t
handle_response_cb(serf_request_t *request,
serf_bucket_t *response,
void *baton,
- apr_pool_t *scratch_pool)
+ apr_pool_t *response_pool)
{
svn_ra_serf__handler_t *handler = baton;
svn_error_t *err;
apr_status_t inner_status;
apr_status_t outer_status;
+ apr_pool_t *scratch_pool = response_pool; /* Scratch pool needed? */
err = svn_error_trace(handle_response(request, response,
handler, &inner_status,
@@ -2287,9 +1461,34 @@ handle_response_cb(serf_request_t *request,
if (!outer_status)
outer_status = inner_status;
- /* Make sure the DONE flag is set properly. */
+ /* Make sure the DONE flag is set properly and requests are cleaned up. */
if (APR_STATUS_IS_EOF(outer_status) || APR_STATUS_IS_EOF(inner_status))
- handler->done = TRUE;
+ {
+ svn_ra_serf__session_t *sess = handler->session;
+ handler->done = TRUE;
+ handler->scheduled = FALSE;
+ outer_status = APR_EOF;
+
+ /* We use a cached handler->session here to allow handler to free the
+ memory containing the handler */
+ save_error(sess,
+ handler->done_delegate(request, handler->done_delegate_baton,
+ scratch_pool));
+ }
+ else if (SERF_BUCKET_READ_ERROR(outer_status)
+ && handler->session->pending_error)
+ {
+ handler->discard_body = TRUE; /* Discard further data */
+ handler->done = TRUE; /* Mark as done */
+ /* handler->scheduled is still TRUE, as we still expect data.
+ If we would return an error outer-status the connection
+ would have to be restarted. With scheduled still TRUE
+ destroying the handler's pool will still reset the
+ connection, avoiding the posibility of returning
+ an error for this handler when a new request is
+ scheduled. */
+ outer_status = APR_EAGAIN; /* Exit context loop */
+ }
return outer_status;
}
@@ -2312,9 +1511,8 @@ setup_request(serf_request_t *request,
{
serf_bucket_alloc_t *bkt_alloc = serf_request_get_alloc(request);
- /* ### should pass the scratch_pool */
SVN_ERR(handler->body_delegate(&body_bkt, handler->body_delegate_baton,
- bkt_alloc, request_pool));
+ bkt_alloc, request_pool, scratch_pool));
}
else
{
@@ -2338,17 +1536,17 @@ setup_request(serf_request_t *request,
SVN_ERR(setup_serf_req(request, req_bkt, &headers_bkt,
handler->session, handler->method, handler->path,
body_bkt, handler->body_type, accept_encoding,
- request_pool, scratch_pool));
+ !handler->no_dav_headers, request_pool,
+ scratch_pool));
if (handler->header_delegate)
{
- /* ### should pass the scratch_pool */
SVN_ERR(handler->header_delegate(headers_bkt,
handler->header_delegate_baton,
- request_pool));
+ request_pool, scratch_pool));
}
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
/* Implements the serf_request_setup_t interface (which sets up both a
@@ -2362,51 +1560,58 @@ setup_request_cb(serf_request_t *request,
void **acceptor_baton,
serf_response_handler_t *s_handler,
void **s_handler_baton,
- apr_pool_t *pool)
+ apr_pool_t *request_pool)
{
svn_ra_serf__handler_t *handler = setup_baton;
+ apr_pool_t *scratch_pool;
svn_error_t *err;
- /* ### construct a scratch_pool? serf gives us a pool that will live for
- ### the duration of the request. */
- apr_pool_t *scratch_pool = pool;
+ /* Construct a scratch_pool? serf gives us a pool that will live for
+ the duration of the request. But requests are retried in some cases */
+ scratch_pool = svn_pool_create(request_pool);
if (strcmp(handler->method, "HEAD") == 0)
*acceptor = accept_head;
else
*acceptor = accept_response;
- *acceptor_baton = handler->session;
+ *acceptor_baton = handler;
*s_handler = handle_response_cb;
*s_handler_baton = handler;
err = svn_error_trace(setup_request(request, handler, req_bkt,
- pool /* request_pool */, scratch_pool));
+ request_pool, scratch_pool));
+ svn_pool_destroy(scratch_pool);
return save_error(handler->session, err);
}
void
svn_ra_serf__request_create(svn_ra_serf__handler_t *handler)
{
- SVN_ERR_ASSERT_NO_RETURN(handler->handler_pool != NULL);
-
- /* In case HANDLER is re-queued, reset the various transient fields.
+ SVN_ERR_ASSERT_NO_RETURN(handler->handler_pool != NULL
+ && !handler->scheduled);
- ### prior to recent changes, HANDLER was constant. maybe we should
- ### break out these processing fields, apart from the request
- ### definition. */
+ /* In case HANDLER is re-queued, reset the various transient fields. */
handler->done = FALSE;
handler->server_error = NULL;
handler->sline.version = 0;
handler->location = NULL;
handler->reading_body = FALSE;
handler->discard_body = FALSE;
+ handler->scheduled = TRUE;
+
+ /* Keeping track of the returned request object would be nice, but doesn't
+ work the way we would expect in ra_serf..
+
+ Serf sometimes creates a new request for us (and destroys the old one)
+ without telling, like when authentication failed (401/407 response.
- /* ### do we ever alter the >response_handler? */
+ We 'just' trust serf to do the right thing and expect it to tell us
+ when the state of the request changes.
- /* ### do we need to hold onto the returned request object, or just
- ### not worry about it (the serf ctx will manage it). */
+ ### I fixed a request leak in serf in r2258 on auth failures.
+ */
(void) serf_connection_request_create(handler->conn->conn,
setup_request_cb, handler);
}
@@ -2415,8 +1620,7 @@ svn_ra_serf__request_create(svn_ra_serf__handler_t *handler)
svn_error_t *
svn_ra_serf__discover_vcc(const char **vcc_url,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
const char *path;
const char *relative_path;
@@ -2429,12 +1633,6 @@ svn_ra_serf__discover_vcc(const char **vcc_url,
return SVN_NO_ERROR;
}
- /* If no connection is provided, use the default one. */
- if (! conn)
- {
- conn = session->conns[0];
- }
-
path = session->session_url.path;
*vcc_url = NULL;
uuid = NULL;
@@ -2444,9 +1642,10 @@ svn_ra_serf__discover_vcc(const char **vcc_url,
apr_hash_t *props;
svn_error_t *err;
- err = svn_ra_serf__fetch_node_props(&props, conn,
+ err = svn_ra_serf__fetch_node_props(&props, session,
path, SVN_INVALID_REVNUM,
- base_props, pool, pool);
+ base_props,
+ scratch_pool, scratch_pool);
if (! err)
{
apr_hash_t *ns_props;
@@ -2474,12 +1673,7 @@ svn_ra_serf__discover_vcc(const char **vcc_url,
svn_error_clear(err);
/* Okay, strip off a component from PATH. */
- path = svn_urlpath__dirname(path, pool);
-
- /* An error occurred on conns. serf 0.4.0 remembers that
- the connection had a problem. We need to reset it, in
- order to use it again. */
- serf_connection_reset(conn->conn);
+ path = svn_urlpath__dirname(path, scratch_pool);
}
}
}
@@ -2505,7 +1699,7 @@ svn_ra_serf__discover_vcc(const char **vcc_url,
{
svn_stringbuf_t *url_buf;
- url_buf = svn_stringbuf_create(path, pool);
+ url_buf = svn_stringbuf_create(path, scratch_pool);
svn_path_remove_components(url_buf,
svn_path_component_count(relative_path));
@@ -2533,7 +1727,6 @@ svn_error_t *
svn_ra_serf__get_relative_path(const char **rel_path,
const char *orig_path,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool)
{
const char *decoded_root, *decoded_orig;
@@ -2550,7 +1743,6 @@ svn_ra_serf__get_relative_path(const char **rel_path,
promises to populate the session's root-url cache, and that's
what we really want. */
SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session,
- conn ? conn : session->conns[0],
pool));
}
@@ -2564,7 +1756,6 @@ svn_ra_serf__get_relative_path(const char **rel_path,
svn_error_t *
svn_ra_serf__report_resource(const char **report_target,
svn_ra_serf__session_t *session,
- svn_ra_serf__connection_t *conn,
apr_pool_t *pool)
{
/* If we have HTTP v2 support, we want to report against the 'me'
@@ -2574,7 +1765,7 @@ svn_ra_serf__report_resource(const char **report_target,
/* Otherwise, we'll use the default VCC. */
else
- SVN_ERR(svn_ra_serf__discover_vcc(report_target, session, conn, pool));
+ SVN_ERR(svn_ra_serf__discover_vcc(report_target, session, pool));
return SVN_NO_ERROR;
}
@@ -2588,13 +1779,14 @@ svn_ra_serf__error_on_status(serf_status_line sline,
{
case 301:
case 302:
+ case 303:
case 307:
+ case 308:
return svn_error_createf(SVN_ERR_RA_DAV_RELOCATED, NULL,
(sline.code == 301)
- ? _("Repository moved permanently to '%s';"
- " please relocate")
- : _("Repository moved temporarily to '%s';"
- " please relocate"), location);
+ ? _("Repository moved permanently to '%s'")
+ : _("Repository moved temporarily to '%s'"),
+ location);
case 403:
return svn_error_createf(SVN_ERR_RA_DAV_FORBIDDEN, NULL,
_("Access to '%s' forbidden"), path);
@@ -2602,6 +1794,16 @@ svn_ra_serf__error_on_status(serf_status_line sline,
case 404:
return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
_("'%s' path not found"), path);
+ case 405:
+ return svn_error_createf(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED, NULL,
+ _("HTTP method is not allowed on '%s'"),
+ path);
+ case 409:
+ return svn_error_createf(SVN_ERR_FS_CONFLICT, NULL,
+ _("'%s' conflicts"), path);
+ case 412:
+ return svn_error_createf(SVN_ERR_RA_DAV_PRECONDITION_FAILED, NULL,
+ _("Precondition on '%s' failed"), path);
case 423:
return svn_error_createf(SVN_ERR_FS_NO_LOCK_TOKEN, NULL,
_("'%s': no lock token available"), path);
@@ -2612,21 +1814,59 @@ svn_ra_serf__error_on_status(serf_status_line sline,
"server or an intermediate proxy does not accept "
"chunked encoding. Try setting 'http-chunked-requests' "
"to 'auto' or 'no' in your client configuration."));
+ case 500:
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("Unexpected server error %d '%s' on '%s'"),
+ sline.code, sline.reason, path);
case 501:
return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("The requested feature is not supported by "
"'%s'"), path);
}
- if (sline.code >= 300)
+ if (sline.code >= 300 || sline.code <= 199)
return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
- _("Unexpected HTTP status %d '%s' on '%s'\n"),
+ _("Unexpected HTTP status %d '%s' on '%s'"),
sline.code, sline.reason, path);
return SVN_NO_ERROR;
}
svn_error_t *
+svn_ra_serf__unexpected_status(svn_ra_serf__handler_t *handler)
+{
+ /* Is it a standard error status? */
+ if (handler->sline.code != 405)
+ SVN_ERR(svn_ra_serf__error_on_status(handler->sline,
+ handler->path,
+ handler->location));
+
+ switch (handler->sline.code)
+ {
+ case 201:
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("Path '%s' unexpectedly created"),
+ handler->path);
+ case 204:
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Path '%s' already exists"),
+ handler->path);
+
+ case 405:
+ return svn_error_createf(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED, NULL,
+ _("The HTTP method '%s' is not allowed"
+ " on '%s'"),
+ handler->method, handler->path);
+ default:
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("Unexpected HTTP status %d '%s' on '%s' "
+ "request to '%s'"),
+ handler->sline.code, handler->sline.reason,
+ handler->method, handler->path);
+ }
+}
+
+svn_error_t *
svn_ra_serf__register_editor_shim_callbacks(svn_ra_session_t *ra_session,
svn_delta_shim_callbacks_t *callbacks)
{
@@ -2636,185 +1876,102 @@ svn_ra_serf__register_editor_shim_callbacks(svn_ra_session_t *ra_session,
return SVN_NO_ERROR;
}
-
-/* Conforms to Expat's XML_StartElementHandler */
-static void
-expat_start(void *userData, const char *raw_name, const char **attrs)
-{
- struct expat_ctx_t *ectx = userData;
-
- if (ectx->inner_error != NULL)
- return;
-
- ectx->inner_error = svn_error_trace(
- svn_ra_serf__xml_cb_start(ectx->xmlctx,
- raw_name, attrs));
-
-#ifdef EXPAT_HAS_STOPPARSER
- if (ectx->inner_error)
- (void) XML_StopParser(ectx->parser, 0 /* resumable */);
-#endif
-}
-
-
-/* Conforms to Expat's XML_EndElementHandler */
-static void
-expat_end(void *userData, const char *raw_name)
-{
- struct expat_ctx_t *ectx = userData;
-
- if (ectx->inner_error != NULL)
- return;
-
- ectx->inner_error = svn_error_trace(
- svn_ra_serf__xml_cb_end(ectx->xmlctx, raw_name));
-
-#ifdef EXPAT_HAS_STOPPARSER
- if (ectx->inner_error)
- (void) XML_StopParser(ectx->parser, 0 /* resumable */);
-#endif
-}
-
-
-/* Conforms to Expat's XML_CharacterDataHandler */
-static void
-expat_cdata(void *userData, const char *data, int len)
+/* Shared/standard done_delegate handler */
+static svn_error_t *
+response_done(serf_request_t *request,
+ void *handler_baton,
+ apr_pool_t *scratch_pool)
{
- struct expat_ctx_t *ectx = userData;
+ svn_ra_serf__handler_t *handler = handler_baton;
- if (ectx->inner_error != NULL)
- return;
-
- ectx->inner_error = svn_error_trace(
- svn_ra_serf__xml_cb_cdata(ectx->xmlctx, data, len));
-
-#ifdef EXPAT_HAS_STOPPARSER
- if (ectx->inner_error)
- (void) XML_StopParser(ectx->parser, 0 /* resumable */);
-#endif
-}
+ assert(handler->done);
+ if (handler->no_fail_on_http_failure_status)
+ return SVN_NO_ERROR;
-/* Implements svn_ra_serf__response_handler_t */
-static svn_error_t *
-expat_response_handler(serf_request_t *request,
- serf_bucket_t *response,
- void *baton,
- apr_pool_t *scratch_pool)
-{
- struct expat_ctx_t *ectx = baton;
+ if (handler->server_error)
+ return svn_ra_serf__server_error_create(handler, scratch_pool);
- if (!ectx->parser)
+ if (handler->sline.code >= 400 || handler->sline.code <= 199)
{
- ectx->parser = XML_ParserCreate(NULL);
- apr_pool_cleanup_register(ectx->cleanup_pool, &ectx->parser,
- xml_parser_cleanup, apr_pool_cleanup_null);
- XML_SetUserData(ectx->parser, ectx);
- XML_SetElementHandler(ectx->parser, expat_start, expat_end);
- XML_SetCharacterDataHandler(ectx->parser, expat_cdata);
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
- /* ### TODO: sline.code < 200 should really be handled by the core */
- if ((ectx->handler->sline.code < 200) || (ectx->handler->sline.code >= 300))
+ if ((handler->sline.code >= 300 && handler->sline.code < 399)
+ && !handler->no_fail_on_http_redirect_status)
{
- /* By deferring to expect_empty_body(), it will make a choice on
- how to handle the body. Whatever the decision, the core handler
- will take over, and we will not be called again. */
- return svn_error_trace(svn_ra_serf__expect_empty_body(
- request, response, ectx->handler,
- scratch_pool));
+ return svn_error_trace(svn_ra_serf__unexpected_status(handler));
}
- while (1)
- {
- apr_status_t status;
- const char *data;
- apr_size_t len;
- int expat_status;
-
- status = serf_bucket_read(response, PARSE_CHUNK_SIZE, &data, &len);
- if (SERF_BUCKET_READ_ERROR(status))
- return svn_ra_serf__wrap_err(status, NULL);
-
-#if 0
- /* ### move restart/skip into the core handler */
- ectx->handler->read_size += len;
-#endif
-
- /* ### move PAUSED behavior to a new response handler that can feed
- ### an inner handler, or can pause for a while. */
-
- /* ### should we have an IGNORE_ERRORS flag like the v1 parser? */
-
- expat_status = XML_Parse(ectx->parser, data, (int)len, 0 /* isFinal */);
-
- /* We need to check INNER_ERROR first. This is an error from the
- callbacks that has been "dropped off" for us to retrieve. On
- current Expat parsers, we stop the parser when an error occurs,
- so we want to ignore EXPAT_STATUS (which reports the stoppage).
-
- If an error is not present, THEN we go ahead and look for parsing
- errors. */
- if (ectx->inner_error)
- {
- apr_pool_cleanup_run(ectx->cleanup_pool, &ectx->parser,
- xml_parser_cleanup);
- return svn_error_trace(ectx->inner_error);
- }
- if (expat_status == XML_STATUS_ERROR)
- return svn_error_createf(SVN_ERR_XML_MALFORMED,
- ectx->inner_error,
- _("The %s response contains invalid XML"
- " (%d %s)"),
- ectx->handler->method,
- ectx->handler->sline.code,
- ectx->handler->sline.reason);
-
- /* The parsing went fine. What has the bucket told us? */
-
- if (APR_STATUS_IS_EOF(status))
- {
- /* Tell expat we've reached the end of the content. Ignore the
- return status. We just don't care. */
- (void) XML_Parse(ectx->parser, NULL, 0, 1 /* isFinal */);
+ return SVN_NO_ERROR;
+}
- svn_ra_serf__xml_context_destroy(ectx->xmlctx);
- apr_pool_cleanup_run(ectx->cleanup_pool, &ectx->parser,
- xml_parser_cleanup);
+/* Pool cleanup handler for request handlers.
- /* ### should check XMLCTX to see if it has returned to the
- ### INITIAL state. we may have ended early... */
- }
+ If a serf context run stops for some outside error, like when the user
+ cancels a request via ^C in the context loop, the handler is still
+ registered in the serf context. With the pool cleanup there would be
+ handlers registered in no freed memory.
- if (status && !SERF_BUCKET_READ_ERROR(status))
- {
- return svn_ra_serf__wrap_err(status, NULL);
- }
+ This fallback kills the connection for this case, which will make serf
+ unregister any outstanding requests on it. */
+static apr_status_t
+handler_cleanup(void *baton)
+{
+ svn_ra_serf__handler_t *handler = baton;
+ if (handler->scheduled)
+ {
+ svn_ra_serf__unschedule_handler(handler);
}
- /* NOTREACHED */
+ return APR_SUCCESS;
}
-
svn_ra_serf__handler_t *
-svn_ra_serf__create_expat_handler(svn_ra_serf__xml_context_t *xmlctx,
- apr_pool_t *result_pool)
+svn_ra_serf__create_handler(svn_ra_serf__session_t *session,
+ apr_pool_t *result_pool)
{
svn_ra_serf__handler_t *handler;
- struct expat_ctx_t *ectx;
-
- ectx = apr_pcalloc(result_pool, sizeof(*ectx));
- ectx->xmlctx = xmlctx;
- ectx->parser = NULL;
- ectx->cleanup_pool = result_pool;
-
handler = apr_pcalloc(result_pool, sizeof(*handler));
handler->handler_pool = result_pool;
- handler->response_handler = expat_response_handler;
- handler->response_baton = ectx;
- ectx->handler = handler;
+ apr_pool_cleanup_register(result_pool, handler, handler_cleanup,
+ apr_pool_cleanup_null);
+
+ handler->session = session;
+ handler->conn = session->conns[0];
+
+ /* Setup the default done handler, to handle server errors */
+ handler->done_delegate_baton = handler;
+ handler->done_delegate = response_done;
return handler;
}
+
+svn_error_t *
+svn_ra_serf__uri_parse(apr_uri_t *uri,
+ const char *url_str,
+ apr_pool_t *result_pool)
+{
+ apr_status_t status;
+
+ status = apr_uri_parse(result_pool, url_str, uri);
+ if (status)
+ {
+ /* Do not use returned error status in error message because currently
+ apr_uri_parse() returns APR_EGENERAL for all parsing errors. */
+ return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+ _("Illegal URL '%s'"),
+ url_str);
+ }
+
+ /* Depending the version of apr-util in use, for root paths uri.path
+ will be NULL or "", where serf requires "/". */
+ if (uri->path == NULL || uri->path[0] == '\0')
+ {
+ uri->path = apr_pstrdup(result_pool, "/");
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_ra_serf/util_error.c b/subversion/libsvn_ra_serf/util_error.c
index da66091..bce935a 100644
--- a/subversion/libsvn_ra_serf/util_error.c
+++ b/subversion/libsvn_ra_serf/util_error.c
@@ -88,7 +88,8 @@ svn_ra_serf__wrap_err(apr_status_t status,
}
if (err_msg)
{
- err->message = apr_pstrcat(err->pool, msg, ": ", err_msg, NULL);
+ err->message = apr_pstrcat(err->pool, msg, ": ", err_msg,
+ SVN_VA_NULL);
}
else
{
diff --git a/subversion/libsvn_ra_serf/xml.c b/subversion/libsvn_ra_serf/xml.c
index a95eacc..1a98857 100644
--- a/subversion/libsvn_ra_serf/xml.c
+++ b/subversion/libsvn_ra_serf/xml.c
@@ -24,6 +24,7 @@
#include <apr_uri.h>
+#include <expat.h>
#include <serf.h>
#include "svn_hash.h"
@@ -42,13 +43,35 @@
#include "ra_serf.h"
+/* Fix for older expat 1.95.x's that do not define
+ * XML_STATUS_OK/XML_STATUS_ERROR
+ */
+#ifndef XML_STATUS_OK
+#define XML_STATUS_OK 1
+#define XML_STATUS_ERROR 0
+#endif
+
+#ifndef XML_VERSION_AT_LEAST
+#define XML_VERSION_AT_LEAST(major,minor,patch) \
+(((major) < XML_MAJOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) < XML_MINOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) == XML_MINOR_VERSION && \
+ (patch) <= XML_MICRO_VERSION))
+#endif /* XML_VERSION_AT_LEAST */
+
+/* Read/write chunks of this size into the spillbuf. */
+#define PARSE_CHUNK_SIZE 8000
+
+
struct svn_ra_serf__xml_context_t {
/* Current state information. */
svn_ra_serf__xml_estate_t *current;
- /* If WAITING.NAMESPACE != NULL, wait for NAMESPACE:NAME element to be
- closed before looking for transitions from CURRENT->STATE. */
- svn_ra_serf__dav_props_t waiting;
+ /* If WAITING >= then we are waiting for an element to close before
+ resuming events. The number stored here is the amount of nested
+ elements open. The Xml parser will make sure the document is well
+ formed. */
+ int waiting;
/* The transition table. */
const svn_ra_serf__xml_transition_t *ttable;
@@ -83,6 +106,16 @@ struct svn_ra_serf__xml_context_t {
};
+/* Structure which represents an XML namespace. */
+typedef struct svn_ra_serf__ns_t {
+ /* The assigned name. */
+ const char *xmlns;
+ /* The full URL for this namespace. */
+ const char *url;
+ /* The next namespace in our list. */
+ struct svn_ra_serf__ns_t *next;
+} svn_ra_serf__ns_t;
+
struct svn_ra_serf__xml_estate_t {
/* The current state value. */
int state;
@@ -114,6 +147,19 @@ struct svn_ra_serf__xml_estate_t {
};
+struct expat_ctx_t {
+ svn_ra_serf__xml_context_t *xmlctx;
+ XML_Parser parser;
+ svn_ra_serf__handler_t *handler;
+ const int *expected_status;
+
+ svn_error_t *inner_error;
+
+ /* Do not use this pool for allocation. It is merely recorded for running
+ the cleanup handler. */
+ apr_pool_t *cleanup_pool;
+};
+
static void
define_namespaces(svn_ra_serf__ns_t **ns_list,
@@ -140,7 +186,7 @@ define_namespaces(svn_ra_serf__ns_t **ns_list,
/* Have we already defined this ns previously? */
for (cur_ns = *ns_list; cur_ns; cur_ns = cur_ns->next)
{
- if (strcmp(cur_ns->namespace, prefix) == 0)
+ if (strcmp(cur_ns->xmlns, prefix) == 0)
{
found = TRUE;
break;
@@ -157,7 +203,7 @@ define_namespaces(svn_ra_serf__ns_t **ns_list,
else
pool = baton;
new_ns = apr_palloc(pool, sizeof(*new_ns));
- new_ns->namespace = apr_pstrdup(pool, prefix);
+ new_ns->xmlns = apr_pstrdup(pool, prefix);
new_ns->url = apr_pstrdup(pool, tmp_attrs[1]);
/* Push into the front of NS_LIST. Parent states will point
@@ -170,22 +216,15 @@ define_namespaces(svn_ra_serf__ns_t **ns_list,
}
}
-
-void
-svn_ra_serf__define_ns(svn_ra_serf__ns_t **ns_list,
- const char *const *attrs,
- apr_pool_t *result_pool)
-{
- define_namespaces(ns_list, attrs, NULL /* get_pool */, result_pool);
-}
-
-
/*
- * Look up NAME in the NS_LIST list for previously declared namespace
- * definitions and return a DAV_PROPS_T-tuple that has values.
+ * Look up @a name in the @a ns_list list for previously declared namespace
+ * definitions.
+ *
+ * Return (in @a *returned_prop_name) a #svn_ra_serf__dav_props_t tuple
+ * representing the expanded name.
*/
-void
-svn_ra_serf__expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
+static void
+expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
const svn_ra_serf__ns_t *ns_list,
const char *name)
{
@@ -198,9 +237,9 @@ svn_ra_serf__expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
for (ns = ns_list; ns; ns = ns->next)
{
- if (strncmp(ns->namespace, name, colon - name) == 0)
+ if (strncmp(ns->xmlns, name, colon - name) == 0)
{
- returned_prop_name->namespace = ns->url;
+ returned_prop_name->xmlns = ns->url;
returned_prop_name->name = colon + 1;
return;
}
@@ -212,9 +251,9 @@ svn_ra_serf__expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
for (ns = ns_list; ns; ns = ns->next)
{
- if (! ns->namespace[0])
+ if (! ns->xmlns[0])
{
- returned_prop_name->namespace = ns->url;
+ returned_prop_name->xmlns = ns->url;
returned_prop_name->name = name;
return;
}
@@ -223,7 +262,7 @@ svn_ra_serf__expand_ns(svn_ra_serf__dav_props_t *returned_prop_name,
/* If the prefix is not found, then the name is NOT within a
namespace. */
- returned_prop_name->namespace = "";
+ returned_prop_name->xmlns = "";
returned_prop_name->name = name;
}
@@ -285,6 +324,49 @@ svn_ra_serf__add_open_tag_buckets(serf_bucket_t *agg_bucket,
}
void
+svn_ra_serf__add_empty_tag_buckets(serf_bucket_t *agg_bucket,
+ serf_bucket_alloc_t *bkt_alloc,
+ const char *tag, ...)
+{
+ va_list ap;
+ const char *key;
+ serf_bucket_t *tmp;
+
+ tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<", 1, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING(tag, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ va_start(ap, tag);
+ while ((key = va_arg(ap, char *)) != NULL)
+ {
+ const char *val = va_arg(ap, const char *);
+ if (val)
+ {
+ tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" ", 1, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING(key, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING_LEN("=\"", 2, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING(val, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", 1, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+ }
+ }
+ va_end(ap);
+
+ tmp = SERF_BUCKET_SIMPLE_STRING_LEN("/>", 2, bkt_alloc);
+ serf_bucket_aggregate_append(agg_bucket, tmp);
+}
+
+void
svn_ra_serf__add_close_tag_buckets(serf_bucket_t *agg_bucket,
serf_bucket_alloc_t *bkt_alloc,
const char *tag)
@@ -368,7 +450,7 @@ void svn_ra_serf__add_tag_buckets(serf_bucket_t *agg_bucket, const char *tag,
const char *value,
serf_bucket_alloc_t *bkt_alloc)
{
- svn_ra_serf__add_open_tag_buckets(agg_bucket, bkt_alloc, tag, NULL);
+ svn_ra_serf__add_open_tag_buckets(agg_bucket, bkt_alloc, tag, SVN_VA_NULL);
if (value)
{
@@ -379,54 +461,6 @@ void svn_ra_serf__add_tag_buckets(serf_bucket_t *agg_bucket, const char *tag,
svn_ra_serf__add_close_tag_buckets(agg_bucket, bkt_alloc, tag);
}
-void
-svn_ra_serf__xml_push_state(svn_ra_serf__xml_parser_t *parser,
- int state)
-{
- svn_ra_serf__xml_state_t *new_state;
-
- if (!parser->free_state)
- {
- new_state = apr_palloc(parser->pool, sizeof(*new_state));
- new_state->pool = svn_pool_create(parser->pool);
- }
- else
- {
- new_state = parser->free_state;
- parser->free_state = parser->free_state->prev;
-
- svn_pool_clear(new_state->pool);
- }
-
- if (parser->state)
- {
- new_state->private = parser->state->private;
- new_state->ns_list = parser->state->ns_list;
- }
- else
- {
- new_state->private = NULL;
- new_state->ns_list = NULL;
- }
-
- new_state->current_state = state;
-
- /* Add it to the state chain. */
- new_state->prev = parser->state;
- parser->state = new_state;
-}
-
-void svn_ra_serf__xml_pop_state(svn_ra_serf__xml_parser_t *parser)
-{
- svn_ra_serf__xml_state_t *cur_state;
-
- cur_state = parser->state;
- parser->state = cur_state->prev;
- cur_state->prev = parser->free_state;
- parser->free_state = cur_state;
-}
-
-
/* Return a pool for XES to use for self-alloc (and other specifics). */
static apr_pool_t *
xes_pool(const svn_ra_serf__xml_estate_t *xes)
@@ -458,11 +492,50 @@ lazy_create_pool(void *baton)
return xes->state_pool;
}
-void
-svn_ra_serf__xml_context_destroy(
- svn_ra_serf__xml_context_t *xmlctx)
+svn_error_t *
+svn_ra_serf__xml_context_done(svn_ra_serf__xml_context_t *xmlctx)
{
+ if (xmlctx->current->prev)
+ {
+ /* Probably unreachable as this would be an xml parser error */
+ return svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
+ _("XML stream truncated: closing '%s' missing"),
+ xmlctx->current->tag.name);
+ }
+ else if (! xmlctx->free_states)
+ {
+ /* If we have no items on the free_states list, we didn't push anything,
+ which tells us that we found an empty xml body */
+ const svn_ra_serf__xml_transition_t *scan;
+ const svn_ra_serf__xml_transition_t *document = NULL;
+ const char *msg;
+
+ for (scan = xmlctx->ttable; scan->ns != NULL; ++scan)
+ {
+ if (scan->from_state == XML_STATE_INITIAL)
+ {
+ if (document != NULL)
+ {
+ document = NULL; /* Multiple document elements defined */
+ break;
+ }
+ document = scan;
+ }
+ }
+
+ if (document)
+ msg = apr_psprintf(xmlctx->scratch_pool, "'%s' element not found",
+ document->name);
+ else
+ msg = _("document element not found");
+
+ return svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
+ _("XML stream truncated: %s"),
+ msg);
+ }
+
svn_pool_destroy(xmlctx->scratch_pool);
+ return SVN_NO_ERROR;
}
svn_ra_serf__xml_context_t *
@@ -577,10 +650,10 @@ svn_ra_serf__xml_state_pool(svn_ra_serf__xml_estate_t *xes)
}
-svn_error_t *
-svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
- const char *raw_name,
- const char *const *attrs)
+static svn_error_t *
+xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
+ const char *raw_name,
+ const char *const *attrs)
{
svn_ra_serf__xml_estate_t *current = xmlctx->current;
svn_ra_serf__dav_props_t elemname;
@@ -590,14 +663,17 @@ svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
/* If we're waiting for an element to close, then just ignore all
other element-opens. */
- if (xmlctx->waiting.namespace != NULL)
- return SVN_NO_ERROR;
+ if (xmlctx->waiting > 0)
+ {
+ xmlctx->waiting++;
+ return SVN_NO_ERROR;
+ }
/* Look for xmlns: attributes. Lazily create the state pool if any
were found. */
define_namespaces(&current->ns_list, attrs, lazy_create_pool, current);
- svn_ra_serf__expand_ns(&elemname, current->ns_list, raw_name);
+ expand_ns(&elemname, current->ns_list, raw_name);
for (scan = xmlctx->ttable; scan->ns != NULL; ++scan)
{
@@ -610,21 +686,20 @@ svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
/* Found a specific transition. */
if (strcmp(elemname.name, scan->name) == 0
- && strcmp(elemname.namespace, scan->ns) == 0)
+ && strcmp(elemname.xmlns, scan->ns) == 0)
break;
}
if (scan->ns == NULL)
{
- if (current->state == 0)
+ if (current->state == XML_STATE_INITIAL)
{
return svn_error_createf(
- SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
+ SVN_ERR_XML_UNEXPECTED_ELEMENT, NULL,
_("XML Parsing failed: Unexpected root element '%s'"),
elemname.name);
}
- xmlctx->waiting = elemname;
- /* ### return? */
+ xmlctx->waiting++; /* Start waiting for the close tag */
return SVN_NO_ERROR;
}
@@ -677,10 +752,11 @@ svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
name = *saveattr;
value = svn_xml_get_attr_value(name, attrs);
if (value == NULL)
- return svn_error_createf(SVN_ERR_XML_ATTRIB_NOT_FOUND,
- NULL,
- _("Missing XML attribute: '%s'"),
- name);
+ return svn_error_createf(
+ SVN_ERR_XML_ATTRIB_NOT_FOUND,
+ NULL,
+ _("Missing XML attribute '%s' on '%s' element"),
+ name, scan->name);
}
if (value)
@@ -699,7 +775,7 @@ svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
/* Some basic copies to set up the new estate. */
new_xes->state = scan->to_state;
new_xes->tag.name = apr_pstrdup(new_pool, elemname.name);
- new_xes->tag.namespace = apr_pstrdup(new_pool, elemname.namespace);
+ new_xes->tag.xmlns = apr_pstrdup(new_pool, elemname.xmlns);
new_xes->custom_close = scan->custom_close;
/* Start with the parent's namespace set. */
@@ -723,39 +799,18 @@ svn_ra_serf__xml_cb_start(svn_ra_serf__xml_context_t *xmlctx,
}
-svn_error_t *
-svn_ra_serf__xml_cb_end(svn_ra_serf__xml_context_t *xmlctx,
- const char *raw_name)
+static svn_error_t *
+xml_cb_end(svn_ra_serf__xml_context_t *xmlctx,
+ const char *raw_name)
{
svn_ra_serf__xml_estate_t *xes = xmlctx->current;
- svn_ra_serf__dav_props_t elemname;
- svn_ra_serf__expand_ns(&elemname, xes->ns_list, raw_name);
-
- if (xmlctx->waiting.namespace != NULL)
+ if (xmlctx->waiting > 0)
{
- /* If this element is not the closer, then keep waiting... */
- if (strcmp(elemname.name, xmlctx->waiting.name) != 0
- || strcmp(elemname.namespace, xmlctx->waiting.namespace) != 0)
- return SVN_NO_ERROR;
-
- /* Found it. Stop waiting, and go back for more. */
- xmlctx->waiting.namespace = NULL;
+ xmlctx->waiting--;
return SVN_NO_ERROR;
}
- /* We should be looking at the same tag that opened the current state.
-
- Unknown elements are simply skipped, so we wouldn't reach this check.
-
- Known elements push a new state for a given tag. Some other elemname
- would imply closing an ancestor tag (where did ours go?) or a spurious
- tag closure. */
- if (strcmp(elemname.name, xes->tag.name) != 0
- || strcmp(elemname.namespace, xes->tag.namespace) != 0)
- return svn_error_create(SVN_ERR_XML_MALFORMED, NULL,
- _("The response contains invalid XML"));
-
if (xes->custom_close)
{
const svn_string_t *cdata;
@@ -799,14 +854,14 @@ svn_ra_serf__xml_cb_end(svn_ra_serf__xml_context_t *xmlctx,
}
-svn_error_t *
-svn_ra_serf__xml_cb_cdata(svn_ra_serf__xml_context_t *xmlctx,
- const char *data,
- apr_size_t len)
+static svn_error_t *
+xml_cb_cdata(svn_ra_serf__xml_context_t *xmlctx,
+ const char *data,
+ apr_size_t len)
{
/* If we are waiting for a closing tag, then we are uninterested in
the cdata. Just return. */
- if (xmlctx->waiting.namespace != NULL)
+ if (xmlctx->waiting > 0)
return SVN_NO_ERROR;
/* If the current state is collecting cdata, then copy the cdata. */
@@ -831,3 +886,256 @@ svn_ra_serf__xml_cb_cdata(svn_ra_serf__xml_context_t *xmlctx,
return SVN_NO_ERROR;
}
+/* svn_error_t * wrapper around XML_Parse */
+static APR_INLINE svn_error_t *
+parse_xml(struct expat_ctx_t *ectx, const char *data, apr_size_t len, svn_boolean_t is_final)
+{
+ int xml_status = XML_Parse(ectx->parser, data, (int)len, is_final);
+ const char *msg;
+ int xml_code;
+
+ if (xml_status == XML_STATUS_OK)
+ return ectx->inner_error;
+
+ xml_code = XML_GetErrorCode(ectx->parser);
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ /* If we called XML_StopParser() expat will return an abort error. If we
+ have a better error stored we should ignore it as it will not help
+ the end-user to store it in the error chain. */
+ if (xml_code == XML_ERROR_ABORTED && ectx->inner_error)
+ return ectx->inner_error;
+#endif
+
+ msg = XML_ErrorString(xml_code);
+
+ return svn_error_compose_create(
+ ectx->inner_error,
+ svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA,
+ svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
+ _("Malformed XML: %s"),
+ msg),
+ _("The XML response contains invalid XML")));
+}
+
+/* Apr pool cleanup handler to release an XML_Parser in success and error
+ conditions */
+static apr_status_t
+xml_parser_cleanup(void *baton)
+{
+ XML_Parser *xmlp = baton;
+
+ if (*xmlp)
+ {
+ (void) XML_ParserFree(*xmlp);
+ *xmlp = NULL;
+ }
+
+ return APR_SUCCESS;
+}
+
+/* Conforms to Expat's XML_StartElementHandler */
+static void
+expat_start(void *userData, const char *raw_name, const char **attrs)
+{
+ struct expat_ctx_t *ectx = userData;
+
+ if (ectx->inner_error != NULL)
+ return;
+
+ ectx->inner_error = svn_error_trace(xml_cb_start(ectx->xmlctx,
+ raw_name, attrs));
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ if (ectx->inner_error)
+ (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+#endif
+}
+
+
+/* Conforms to Expat's XML_EndElementHandler */
+static void
+expat_end(void *userData, const char *raw_name)
+{
+ struct expat_ctx_t *ectx = userData;
+
+ if (ectx->inner_error != NULL)
+ return;
+
+ ectx->inner_error = svn_error_trace(xml_cb_end(ectx->xmlctx, raw_name));
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ if (ectx->inner_error)
+ (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+#endif
+}
+
+
+/* Conforms to Expat's XML_CharacterDataHandler */
+static void
+expat_cdata(void *userData, const char *data, int len)
+{
+ struct expat_ctx_t *ectx = userData;
+
+ if (ectx->inner_error != NULL)
+ return;
+
+ ectx->inner_error = svn_error_trace(xml_cb_cdata(ectx->xmlctx, data, len));
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ if (ectx->inner_error)
+ (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+#endif
+}
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+static void
+expat_entity_declaration(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity,
+ const XML_Char *value,
+ int value_length,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName)
+{
+ struct expat_ctx_t *ectx = userData;
+
+ /* Stop the parser if an entity declaration is hit. */
+ XML_StopParser(ectx->parser, 0 /* resumable */);
+}
+#else
+/* A noop default_handler. */
+static void
+expat_default_handler(void *userData, const XML_Char *s, int len)
+{
+}
+#endif
+
+/* Implements svn_ra_serf__response_handler_t */
+static svn_error_t *
+expat_response_handler(serf_request_t *request,
+ serf_bucket_t *response,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ struct expat_ctx_t *ectx = baton;
+ svn_boolean_t got_expected_status;
+
+ if (ectx->expected_status)
+ {
+ const int *status = ectx->expected_status;
+ got_expected_status = FALSE;
+
+ while (*status && ectx->handler->sline.code != *status)
+ status++;
+
+ got_expected_status = (*status) != 0;
+ }
+ else
+ got_expected_status = (ectx->handler->sline.code == 200);
+
+ if (!ectx->handler->server_error
+ && ((ectx->handler->sline.code < 200) || (ectx->handler->sline.code >= 300)
+ || ! got_expected_status))
+ {
+ /* By deferring to expect_empty_body(), it will make a choice on
+ how to handle the body. Whatever the decision, the core handler
+ will take over, and we will not be called again. */
+
+ /* ### This handles xml bodies as svn-errors (returned via serf context
+ ### loop), but ignores non-xml errors.
+
+ Current code depends on this behavior and checks itself while other
+ continues, and then verifies if work has been performed.
+
+ ### TODO: Make error checking consistent */
+
+ /* ### If !GOT_EXPECTED_STATUS, this should always produce an error */
+ return svn_error_trace(svn_ra_serf__expect_empty_body(
+ request, response, ectx->handler,
+ scratch_pool));
+ }
+
+ if (!ectx->parser)
+ {
+ ectx->parser = XML_ParserCreate(NULL);
+ apr_pool_cleanup_register(ectx->cleanup_pool, &ectx->parser,
+ xml_parser_cleanup, apr_pool_cleanup_null);
+ XML_SetUserData(ectx->parser, ectx);
+ XML_SetElementHandler(ectx->parser, expat_start, expat_end);
+ XML_SetCharacterDataHandler(ectx->parser, expat_cdata);
+
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(ectx->parser, expat_entity_declaration);
+#else
+ XML_SetDefaultHandler(ectx->parser, expat_default_handler);
+#endif
+ }
+
+ while (1)
+ {
+ apr_status_t status;
+ const char *data;
+ apr_size_t len;
+ svn_error_t *err;
+ svn_boolean_t at_eof = FALSE;
+
+ status = serf_bucket_read(response, PARSE_CHUNK_SIZE, &data, &len);
+ if (SERF_BUCKET_READ_ERROR(status))
+ return svn_ra_serf__wrap_err(status, NULL);
+ else if (APR_STATUS_IS_EOF(status))
+ at_eof = TRUE;
+
+ err = parse_xml(ectx, data, len, at_eof /* isFinal */);
+
+ if (at_eof || err)
+ {
+ /* Release xml parser state/tables. */
+ apr_pool_cleanup_run(ectx->cleanup_pool, &ectx->parser,
+ xml_parser_cleanup);
+ }
+
+ SVN_ERR(err);
+
+ /* The parsing went fine. What has the bucket told us? */
+ if (at_eof)
+ {
+ /* Make sure we actually got xml and clean up after parsing */
+ SVN_ERR(svn_ra_serf__xml_context_done(ectx->xmlctx));
+ }
+
+ if (status && !SERF_BUCKET_READ_ERROR(status))
+ {
+ return svn_ra_serf__wrap_err(status, NULL);
+ }
+ }
+
+ /* NOTREACHED */
+}
+
+
+svn_ra_serf__handler_t *
+svn_ra_serf__create_expat_handler(svn_ra_serf__session_t *session,
+ svn_ra_serf__xml_context_t *xmlctx,
+ const int *expected_status,
+ apr_pool_t *result_pool)
+{
+ svn_ra_serf__handler_t *handler;
+ struct expat_ctx_t *ectx;
+
+ ectx = apr_pcalloc(result_pool, sizeof(*ectx));
+ ectx->xmlctx = xmlctx;
+ ectx->parser = NULL;
+ ectx->expected_status = expected_status;
+ ectx->cleanup_pool = result_pool;
+
+ handler = svn_ra_serf__create_handler(session, result_pool);
+ handler->response_handler = expat_response_handler;
+ handler->response_baton = ectx;
+
+ ectx->handler = handler;
+
+ return handler;
+}
diff --git a/subversion/libsvn_ra_svn/client.c b/subversion/libsvn_ra_svn/client.c
index 335f321..a4939ab 100644
--- a/subversion/libsvn_ra_svn/client.c
+++ b/subversion/libsvn_ra_svn/client.c
@@ -46,6 +46,7 @@
#include "svn_props.h"
#include "svn_mergeinfo.h"
#include "svn_version.h"
+#include "svn_ctype.h"
#include "svn_private_config.h"
@@ -233,7 +234,7 @@ svn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *mech, const char *mech_arg)
{
- return svn_ra_svn__write_tuple(conn, pool, "w(?c)", mech, mech_arg);
+ return svn_error_trace(svn_ra_svn__write_tuple(conn, pool, "w(?c)", mech, mech_arg));
}
static svn_error_t *handle_auth_request(svn_ra_svn__session_baton_t *sess,
@@ -368,15 +369,16 @@ ra_svn_get_reporter(svn_ra_svn__session_baton_t *sess_baton,
/* --- RA LAYER IMPLEMENTATION --- */
-/* (Note: *ARGV is an output parameter.) */
+/* (Note: *ARGV_P is an output parameter.) */
static svn_error_t *find_tunnel_agent(const char *tunnel,
const char *hostinfo,
- const char ***argv,
+ const char ***argv_p,
apr_hash_t *config, apr_pool_t *pool)
{
svn_config_t *cfg;
const char *val, *var, *cmd;
char **cmd_argv;
+ const char **argv;
apr_size_t len;
apr_status_t status;
int n;
@@ -395,7 +397,7 @@ static svn_error_t *find_tunnel_agent(const char *tunnel,
* versions have it too. If the user is using some other ssh
* implementation that doesn't accept it, they can override it
* in the [tunnels] section of the config. */
- val = "$SVN_SSH ssh -q";
+ val = "$SVN_SSH ssh -q --";
}
if (!val || !*val)
@@ -430,16 +432,22 @@ static svn_error_t *find_tunnel_agent(const char *tunnel,
if (status != APR_SUCCESS)
return svn_error_wrap_apr(status, _("Can't tokenize command '%s'"), cmd);
- /* Append the fixed arguments to the result. */
+ /* Calc number of the fixed arguments. */
for (n = 0; cmd_argv[n] != NULL; n++)
;
- *argv = apr_palloc(pool, (n + 4) * sizeof(char *));
- memcpy((void *) *argv, cmd_argv, n * sizeof(char *));
- (*argv)[n++] = svn_path_uri_decode(hostinfo, pool);
- (*argv)[n++] = "svnserve";
- (*argv)[n++] = "-t";
- (*argv)[n] = NULL;
+ argv = apr_palloc(pool, (n + 4) * sizeof(char *));
+
+ /* Append the fixed arguments to the result. */
+ for (n = 0; cmd_argv[n] != NULL; n++)
+ argv[n] = cmd_argv[n];
+
+ argv[n++] = hostinfo;
+ argv[n++] = "svnserve";
+ argv[n++] = "-t";
+ argv[n] = NULL;
+
+ *argv_p = argv;
return SVN_NO_ERROR;
}
@@ -452,13 +460,17 @@ static void handle_child_process_error(apr_pool_t *pool, apr_status_t status,
{
svn_ra_svn_conn_t *conn;
apr_file_t *in_file, *out_file;
+ svn_stream_t *in_stream, *out_stream;
svn_error_t *err;
if (apr_file_open_stdin(&in_file, pool)
|| apr_file_open_stdout(&out_file, pool))
return;
- conn = svn_ra_svn_create_conn3(NULL, in_file, out_file,
+ in_stream = svn_stream_from_aprfile2(in_file, FALSE, pool);
+ out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool);
+
+ conn = svn_ra_svn_create_conn4(NULL, in_stream, out_stream,
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0,
0, pool);
err = svn_error_wrap_apr(status, _("Error in child process: %s"), desc);
@@ -529,7 +541,11 @@ static svn_error_t *make_tunnel(const char **args, svn_ra_svn_conn_t **conn,
apr_file_inherit_unset(proc->out);
/* Guard against dotfile output to stdout on the server. */
- *conn = svn_ra_svn_create_conn3(NULL, proc->out, proc->in,
+ *conn = svn_ra_svn_create_conn4(NULL,
+ svn_stream_from_aprfile2(proc->out, FALSE,
+ pool),
+ svn_stream_from_aprfile2(proc->in, FALSE,
+ pool),
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT,
0, 0, pool);
err = svn_ra_svn__skip_leading_garbage(*conn, pool);
@@ -556,24 +572,54 @@ static svn_error_t *parse_url(const char *url, apr_uri_t *uri,
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
_("Illegal svn repository URL '%s'"), url);
- if (! uri->port)
- uri->port = SVN_RA_SVN_PORT;
-
return SVN_NO_ERROR;
}
+/* This structure is used as a baton for the pool cleanup function to
+ store tunnel parameters used by the close-tunnel callback. */
+struct tunnel_data_t {
+ void *tunnel_context;
+ void *tunnel_baton;
+ svn_ra_close_tunnel_func_t close_tunnel;
+ svn_stream_t *request;
+ svn_stream_t *response;
+};
+
+/* Pool cleanup function that invokes the close-tunnel callback. */
+static apr_status_t close_tunnel_cleanup(void *baton)
+{
+ const struct tunnel_data_t *const td = baton;
+
+ if (td->close_tunnel)
+ td->close_tunnel(td->tunnel_context, td->tunnel_baton);
+
+ svn_error_clear(svn_stream_close(td->request));
+
+ /* We might have one stream to use for both request and response! */
+ if (td->request != td->response)
+ svn_error_clear(svn_stream_close(td->response));
+
+ return APR_SUCCESS; /* ignored */
+}
+
/* Open a session to URL, returning it in *SESS_P, allocating it in POOL.
URI is a parsed version of URL. CALLBACKS and CALLBACKS_BATON
- are provided by the caller of ra_svn_open. If tunnel_argv is non-null,
- it points to a program argument list to use when invoking the tunnel agent.
+ are provided by the caller of ra_svn_open. If TUNNEL_NAME is not NULL,
+ it is the name of the tunnel type parsed from the URL scheme.
+ If TUNNEL_ARGV is not NULL, it points to a program argument list to use
+ when invoking the tunnel agent.
*/
static svn_error_t *open_session(svn_ra_svn__session_baton_t **sess_p,
const char *url,
const apr_uri_t *uri,
+ const char *tunnel_name,
const char **tunnel_argv,
+ apr_hash_t *config,
const svn_ra_callbacks2_t *callbacks,
void *callbacks_baton,
- apr_pool_t *pool)
+ svn_auth_baton_t *auth_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_ra_svn__session_baton_t *sess;
svn_ra_svn_conn_t *conn;
@@ -581,26 +627,67 @@ static svn_error_t *open_session(svn_ra_svn__session_baton_t **sess_p,
apr_uint64_t minver, maxver;
apr_array_header_t *mechlist, *server_caplist, *repos_caplist;
const char *client_string = NULL;
+ apr_pool_t *pool = result_pool;
sess = apr_palloc(pool, sizeof(*sess));
sess->pool = pool;
- sess->is_tunneled = (tunnel_argv != NULL);
+ sess->is_tunneled = (tunnel_name != NULL);
sess->url = apr_pstrdup(pool, url);
sess->user = uri->user;
sess->hostname = uri->hostname;
- sess->realm_prefix = apr_psprintf(pool, "<svn://%s:%d>", uri->hostname,
- uri->port);
+ sess->tunnel_name = tunnel_name;
sess->tunnel_argv = tunnel_argv;
sess->callbacks = callbacks;
sess->callbacks_baton = callbacks_baton;
sess->bytes_read = sess->bytes_written = 0;
+ sess->auth_baton = auth_baton;
- if (tunnel_argv)
- SVN_ERR(make_tunnel(tunnel_argv, &conn, pool));
+ if (config)
+ SVN_ERR(svn_config_copy_config(&sess->config, config, pool));
else
+ sess->config = NULL;
+
+ if (tunnel_name)
{
- SVN_ERR(make_connection(uri->hostname, uri->port, &sock, pool));
- conn = svn_ra_svn_create_conn3(sock, NULL, NULL,
+ sess->realm_prefix = apr_psprintf(pool, "<svn+%s://%s:%d>",
+ tunnel_name,
+ uri->hostname, uri->port);
+
+ if (tunnel_argv)
+ SVN_ERR(make_tunnel(tunnel_argv, &conn, pool));
+ else
+ {
+ struct tunnel_data_t *const td = apr_palloc(pool, sizeof(*td));
+
+ td->tunnel_baton = callbacks->tunnel_baton;
+ td->close_tunnel = NULL;
+
+ SVN_ERR(callbacks->open_tunnel_func(
+ &td->request, &td->response,
+ &td->close_tunnel, &td->tunnel_context,
+ callbacks->tunnel_baton, tunnel_name,
+ uri->user, uri->hostname, uri->port,
+ callbacks->cancel_func, callbacks_baton,
+ pool));
+
+ apr_pool_cleanup_register(pool, td, close_tunnel_cleanup,
+ apr_pool_cleanup_null);
+
+ conn = svn_ra_svn_create_conn4(NULL, td->response, td->request,
+ SVN_DELTA_COMPRESSION_LEVEL_DEFAULT,
+ 0, 0, pool);
+ SVN_ERR(svn_ra_svn__skip_leading_garbage(conn, pool));
+ }
+ }
+ else
+ {
+ sess->realm_prefix = apr_psprintf(pool, "<svn://%s:%d>", uri->hostname,
+ uri->port ? uri->port : SVN_RA_SVN_PORT);
+
+ SVN_ERR(make_connection(uri->hostname,
+ uri->port ? uri->port : SVN_RA_SVN_PORT,
+ &sock, pool));
+ conn = svn_ra_svn_create_conn4(sock, NULL, NULL,
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT,
0, 0, pool);
}
@@ -618,7 +705,7 @@ static svn_error_t *open_session(svn_ra_svn__session_baton_t **sess_p,
&client_string, pool));
if (client_string)
sess->useragent = apr_pstrcat(pool, SVN_RA_SVN__DEFAULT_USERAGENT " ",
- client_string, (char *)NULL);
+ client_string, SVN_VA_NULL);
else
sess->useragent = SVN_RA_SVN__DEFAULT_USERAGENT;
@@ -716,16 +803,44 @@ ra_svn_get_schemes(apr_pool_t *pool)
}
+/* A simple whitelist to ensure the following are valid:
+ * user@server
+ * [::1]:22
+ * server-name
+ * server_name
+ * 127.0.0.1
+ * with an extra restriction that a leading '-' is invalid.
+ */
+static svn_boolean_t
+is_valid_hostinfo(const char *hostinfo)
+{
+ const char *p = hostinfo;
+
+ if (p[0] == '-')
+ return FALSE;
+
+ while (*p)
+ {
+ if (!svn_ctype_isalnum(*p) && !strchr(":.-_[]@", *p))
+ return FALSE;
+
+ ++p;
+ }
+
+ return TRUE;
+}
static svn_error_t *ra_svn_open(svn_ra_session_t *session,
const char **corrected_url,
const char *url,
const svn_ra_callbacks2_t *callbacks,
void *callback_baton,
+ svn_auth_baton_t *auth_baton,
apr_hash_t *config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *sess_pool = svn_pool_create(pool);
+ apr_pool_t *sess_pool = svn_pool_create(result_pool);
svn_ra_svn__session_baton_t *sess;
const char *tunnel, **tunnel_argv;
apr_uri_t uri;
@@ -737,11 +852,28 @@ static svn_error_t *ra_svn_open(svn_ra_session_t *session,
SVN_ERR(parse_url(url, &uri, sess_pool));
- parse_tunnel(url, &tunnel, pool);
+ parse_tunnel(url, &tunnel, result_pool);
- if (tunnel)
- SVN_ERR(find_tunnel_agent(tunnel, uri.hostinfo, &tunnel_argv, config,
- pool));
+ /* Use the default tunnel implementation if we got a tunnel name,
+ but either do not have tunnel handler callbacks installed, or
+ the handlers don't like the tunnel name. */
+ if (tunnel
+ && (!callbacks->open_tunnel_func
+ || (callbacks->check_tunnel_func && callbacks->open_tunnel_func
+ && !callbacks->check_tunnel_func(callbacks->tunnel_baton,
+ tunnel))))
+ {
+ const char *decoded_hostinfo;
+
+ decoded_hostinfo = svn_path_uri_decode(uri.hostinfo, result_pool);
+
+ if (!is_valid_hostinfo(decoded_hostinfo))
+ return svn_error_createf(SVN_ERR_BAD_URL, NULL, _("Invalid host '%s'"),
+ uri.hostinfo);
+
+ SVN_ERR(find_tunnel_agent(tunnel, decoded_hostinfo, &tunnel_argv,
+ config, result_pool));
+ }
else
tunnel_argv = NULL;
@@ -749,20 +881,37 @@ static svn_error_t *ra_svn_open(svn_ra_session_t *session,
? svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG)
: NULL;
cfg = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS) : NULL;
- svn_auth_set_parameter(callbacks->auth_baton,
+ svn_auth_set_parameter(auth_baton,
SVN_AUTH_PARAM_CONFIG_CATEGORY_CONFIG, cfg_client);
- svn_auth_set_parameter(callbacks->auth_baton,
+ svn_auth_set_parameter(auth_baton,
SVN_AUTH_PARAM_CONFIG_CATEGORY_SERVERS, cfg);
/* We open the session in a subpool so we can get rid of it if we
reparent with a server that doesn't support reparenting. */
- SVN_ERR(open_session(&sess, url, &uri, tunnel_argv,
- callbacks, callback_baton, sess_pool));
+ SVN_ERR(open_session(&sess, url, &uri, tunnel, tunnel_argv, config,
+ callbacks, callback_baton,
+ auth_baton, sess_pool, scratch_pool));
session->priv = sess;
return SVN_NO_ERROR;
}
+static svn_error_t *ra_svn_dup_session(svn_ra_session_t *new_session,
+ svn_ra_session_t *old_session,
+ const char *new_session_url,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_ra_svn__session_baton_t *old_sess = old_session->priv;
+
+ SVN_ERR(ra_svn_open(new_session, NULL, new_session_url,
+ old_sess->callbacks, old_sess->callbacks_baton,
+ old_sess->auth_baton, old_sess->config,
+ result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *ra_svn_reparent(svn_ra_session_t *ra_session,
const char *url,
apr_pool_t *pool)
@@ -792,8 +941,9 @@ static svn_error_t *ra_svn_reparent(svn_ra_session_t *ra_session,
sess_pool = svn_pool_create(ra_session->pool);
err = parse_url(url, &uri, sess_pool);
if (! err)
- err = open_session(&new_sess, url, &uri, sess->tunnel_argv,
- sess->callbacks, sess->callbacks_baton, sess_pool);
+ err = open_session(&new_sess, url, &uri, sess->tunnel_name, sess->tunnel_argv,
+ sess->config, sess->callbacks, sess->callbacks_baton,
+ sess->auth_baton, sess_pool, sess_pool);
/* We destroy the new session pool on error, since it is allocated in
the main session pool. */
if (err)
@@ -954,6 +1104,9 @@ static svn_error_t *ra_svn_end_commit(void *baton)
&(commit_info->author),
&(commit_info->post_commit_err)));
+ commit_info->repos_root = apr_pstrdup(ccb->pool,
+ ccb->sess_baton->conn->repos_root);
+
if (ccb->callback)
SVN_ERR(ccb->callback(commit_info, ccb->callback_baton, ccb->pool));
@@ -986,11 +1139,11 @@ static svn_error_t *ra_svn_commit(svn_ra_session_t *session,
"a log message with pre-1.5 servers; "
"consider passing an empty one, or upgrading "
"the server"));
- }
+ }
else if (log_msg == NULL)
/* 1.5+ server. Set LOG_MSG to something, since the 'logmsg' argument
to the 'commit' protocol command is non-optional; on the server side,
- only REVPROP_TABLE will be used, and LOG_MSG will be ignored. The
+ only REVPROP_TABLE will be used, and LOG_MSG will be ignored. The
"svn:log" member of REVPROP_TABLE table is NULL, therefore the commit
will have a NULL log message (not just "", really NULL).
@@ -1075,7 +1228,6 @@ parse_iproplist(apr_array_header_t **inherited_props,
{
int i;
- const char *repos_root_url;
apr_pool_t *iterpool;
if (iproplist == NULL)
@@ -1088,8 +1240,6 @@ parse_iproplist(apr_array_header_t **inherited_props,
return SVN_NO_ERROR;
}
- SVN_ERR(ra_svn_get_repos_root(session, &repos_root_url, scratch_pool));
-
*inherited_props = apr_array_make(
result_pool, iproplist->nelts, sizeof(svn_prop_inherited_item_t *));
@@ -1115,16 +1265,14 @@ parse_iproplist(apr_array_header_t **inherited_props,
SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "cl",
&parent_rel_path, &iprop_list));
SVN_ERR(svn_ra_svn__parse_proplist(iprop_list, iterpool, &iprops));
- new_iprop->path_or_url = svn_path_url_add_component2(repos_root_url,
- parent_rel_path,
- result_pool);
- new_iprop->prop_hash = apr_hash_make(result_pool);
+ new_iprop->path_or_url = apr_pstrdup(result_pool, parent_rel_path);
+ new_iprop->prop_hash = svn_hash__make(result_pool);
for (hi = apr_hash_first(iterpool, iprops);
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_string_t *value = apr_hash_this_val(hi);
svn_hash_sets(new_iprop->prop_hash,
apr_pstrdup(result_pool, name),
svn_string_dup(value, result_pool));
@@ -1241,7 +1389,10 @@ static svn_error_t *ra_svn_get_dir(svn_ra_session_t *session,
if (dirent_fields & SVN_DIRENT_LAST_AUTHOR)
SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_DIRENT_LAST_AUTHOR));
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
+ /* Always send the, nominally optional, want-iprops as "false" to
+ workaround a bug in svnserve 1.8.0-1.8.8 that causes the server
+ to see "true" if it is omitted. */
+ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)b)", FALSE));
SVN_ERR(handle_auth_request(sess_baton, pool));
SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "rll", &rev, &proplist,
@@ -1257,7 +1408,7 @@ static svn_error_t *ra_svn_get_dir(svn_ra_session_t *session,
return SVN_NO_ERROR;
/* Interpret the directory list. */
- *dirents = apr_hash_make(pool);
+ *dirents = svn_hash__make(pool);
for (i = 0; i < dirlist->nelts; i++)
{
const char *name, *kind, *cdate, *cauthor;
@@ -1273,7 +1424,14 @@ static svn_error_t *ra_svn_get_dir(svn_ra_session_t *session,
SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cwnbr(?c)(?c)",
&name, &kind, &size, &has_props,
&crev, &cdate, &cauthor));
- name = svn_relpath_canonicalize(name, pool);
+
+ /* Nothing to sanitize here. Any multi-segment path is simply
+ illegal in the hash returned by svn_ra_get_dir2. */
+ if (strchr(name, '/'))
+ return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
+ _("Invalid directory entry name '%s'"),
+ name);
+
dirent = svn_dirent_create(pool);
dirent->kind = svn_node_kind_from_word(kind);
dirent->size = size;/* FIXME: svn_filesize_t */
@@ -1345,7 +1503,7 @@ static svn_error_t *ra_svn_get_mergeinfo(svn_ra_session_t *session,
*catalog = NULL;
if (mergeinfo_tuple->nelts > 0)
{
- *catalog = apr_hash_make(pool);
+ *catalog = svn_hash__make(pool);
for (i = 0; i < mergeinfo_tuple->nelts; i++)
{
svn_mergeinfo_t for_path;
@@ -1501,6 +1659,10 @@ perform_ra_svn_log(svn_error_t **outer_error,
const char *path;
char *name;
svn_boolean_t want_custom_revprops;
+ svn_boolean_t want_author = FALSE;
+ svn_boolean_t want_message = FALSE;
+ svn_boolean_t want_date = FALSE;
+ int nreceived = 0;
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "log"));
if (paths)
@@ -1523,10 +1685,14 @@ perform_ra_svn_log(svn_error_t **outer_error,
{
name = APR_ARRAY_IDX(revprops, i, char *);
SVN_ERR(svn_ra_svn__write_cstring(conn, pool, name));
- if (!want_custom_revprops
- && strcmp(name, SVN_PROP_REVISION_AUTHOR) != 0
- && strcmp(name, SVN_PROP_REVISION_DATE) != 0
- && strcmp(name, SVN_PROP_REVISION_LOG) != 0)
+
+ if (strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0)
+ want_author = TRUE;
+ else if (strcmp(name, SVN_PROP_REVISION_DATE) == 0)
+ want_date = TRUE;
+ else if (strcmp(name, SVN_PROP_REVISION_LOG) == 0)
+ want_message = TRUE;
+ else
want_custom_revprops = TRUE;
}
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
@@ -1534,6 +1700,10 @@ perform_ra_svn_log(svn_error_t **outer_error,
else
{
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!w())", "all-revprops"));
+
+ want_author = TRUE;
+ want_date = TRUE;
+ want_message = TRUE;
want_custom_revprops = TRUE;
}
@@ -1554,7 +1724,6 @@ perform_ra_svn_log(svn_error_t **outer_error,
svn_ra_svn_item_t *item;
apr_hash_t *cphash;
svn_revnum_t rev;
- int nreceived;
svn_pool_clear(iterpool);
SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &item));
@@ -1597,11 +1766,12 @@ perform_ra_svn_log(svn_error_t **outer_error,
if (cplist->nelts > 0)
{
/* Interpret the changed-paths list. */
- cphash = apr_hash_make(iterpool);
+ cphash = svn_hash__make(iterpool);
for (i = 0; i < cplist->nelts; i++)
{
svn_log_changed_path2_t *change;
- const char *copy_path, *action, *cpath, *kind_str;
+ svn_string_t *cpath;
+ const char *copy_path, *action, *kind_str;
apr_uint64_t text_mods, prop_mods;
svn_revnum_t copy_rev;
svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(cplist, i,
@@ -1610,14 +1780,19 @@ perform_ra_svn_log(svn_error_t **outer_error,
if (elt->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Changed-path entry not a list"));
- SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool,
- "cw(?cr)?(?c?BB)",
+ SVN_ERR(svn_ra_svn__read_data_log_changed_entry(elt->u.list,
&cpath, &action, &copy_path,
&copy_rev, &kind_str,
&text_mods, &prop_mods));
- cpath = svn_fspath__canonicalize(cpath, iterpool);
- if (copy_path)
+
+ if (!svn_fspath__is_canonical(cpath->data))
+ {
+ cpath->data = svn_fspath__canonicalize(cpath->data, iterpool);
+ cpath->len = strlen(cpath->data);
+ }
+ if (copy_path && !svn_fspath__is_canonical(copy_path))
copy_path = svn_fspath__canonicalize(copy_path, iterpool);
+
change = svn_log_changed_path2_create(iterpool);
change->action = *action;
change->copyfrom_path = copy_path;
@@ -1625,13 +1800,16 @@ perform_ra_svn_log(svn_error_t **outer_error,
change->node_kind = svn_node_kind_from_word(kind_str);
change->text_modified = optbool_to_tristate(text_mods);
change->props_modified = optbool_to_tristate(prop_mods);
- svn_hash_sets(cphash, cpath, change);
+ apr_hash_set(cphash, cpath->data, cpath->len, change);
}
}
else
cphash = NULL;
- nreceived = 0;
+ /* Invoke RECEIVER
+ - Except if the server sends more than a >= 1 limit top level items
+ - Or when the callback reported a SVN_ERR_CEASE_INVOCATION
+ in an earlier invocation. */
if (! (limit && (nest_level == 0) && (++nreceived > limit))
&& ! *outer_error)
{
@@ -1647,37 +1825,18 @@ perform_ra_svn_log(svn_error_t **outer_error,
SVN_ERR(svn_ra_svn__parse_proplist(rplist, iterpool,
&log_entry->revprops));
if (log_entry->revprops == NULL)
- log_entry->revprops = apr_hash_make(iterpool);
- if (revprops == NULL)
- {
- /* Caller requested all revprops; set author/date/log. */
- if (author)
- svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_AUTHOR,
- author);
- if (date)
- svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_DATE,
- date);
- if (message)
- svn_hash_sets(log_entry->revprops, SVN_PROP_REVISION_LOG,
- message);
- }
- else
- {
- /* Caller requested some; maybe set author/date/log. */
- for (i = 0; i < revprops->nelts; i++)
- {
- name = APR_ARRAY_IDX(revprops, i, char *);
- if (author && strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0)
- svn_hash_sets(log_entry->revprops,
- SVN_PROP_REVISION_AUTHOR, author);
- if (date && strcmp(name, SVN_PROP_REVISION_DATE) == 0)
- svn_hash_sets(log_entry->revprops,
- SVN_PROP_REVISION_DATE, date);
- if (message && strcmp(name, SVN_PROP_REVISION_LOG) == 0)
- svn_hash_sets(log_entry->revprops,
- SVN_PROP_REVISION_LOG, message);
- }
- }
+ log_entry->revprops = svn_hash__make(iterpool);
+
+ if (author && want_author)
+ svn_hash_sets(log_entry->revprops,
+ SVN_PROP_REVISION_AUTHOR, author);
+ if (date && want_date)
+ svn_hash_sets(log_entry->revprops,
+ SVN_PROP_REVISION_DATE, date);
+ if (message && want_message)
+ svn_hash_sets(log_entry->revprops,
+ SVN_PROP_REVISION_LOG, message);
+
err = receiver(receiver_baton, log_entry, iterpool);
if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
{
@@ -1863,7 +2022,7 @@ static svn_error_t *ra_svn_get_locations(svn_ra_session_t *session,
/* Read the response. This is so the server would have a chance to
* report an error. */
- return svn_ra_svn__read_cmd_response(conn, pool, "");
+ return svn_error_trace(svn_ra_svn__read_cmd_response(conn, pool, ""));
}
static svn_error_t *
@@ -2009,7 +2168,7 @@ static svn_error_t *ra_svn_get_file_revs(svn_ra_session_t *session,
{
svn_stream_t *stream;
- if (d_handler)
+ if (d_handler && d_handler != svn_delta_noop_window_handler)
stream = svn_txdelta_parse_svndiff(d_handler, d_baton, TRUE,
rev_pool);
else
@@ -2552,7 +2711,7 @@ static svn_error_t *ra_svn_replay(svn_ra_session_t *session,
SVN_ERR(svn_ra_svn_drive_editor2(sess->conn, pool, editor, edit_baton,
NULL, TRUE));
- return svn_ra_svn__read_cmd_response(sess->conn, pool, "");
+ return svn_error_trace(svn_ra_svn__read_cmd_response(sess->conn, pool, ""));
}
@@ -2621,7 +2780,7 @@ ra_svn_replay_range(svn_ra_session_t *session,
}
svn_pool_destroy(iterpool);
- return svn_ra_svn__read_cmd_response(sess->conn, pool, "");
+ return svn_error_trace(svn_ra_svn__read_cmd_response(sess->conn, pool, ""));
}
@@ -2687,7 +2846,8 @@ ra_svn_get_deleted_rev(svn_ra_session_t *session,
SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool),
N_("'get-deleted-rev' not implemented")));
- return svn_ra_svn__read_cmd_response(conn, pool, "r", revision_deleted);
+ return svn_error_trace(svn_ra_svn__read_cmd_response(conn, pool, "r",
+ revision_deleted));
}
static svn_error_t *
@@ -2713,6 +2873,16 @@ ra_svn_get_inherited_props(svn_ra_session_t *session,
svn_ra_svn__session_baton_t *sess_baton = session->priv;
svn_ra_svn_conn_t *conn = sess_baton->conn;
apr_array_header_t *iproplist;
+ svn_boolean_t iprop_capable;
+
+ SVN_ERR(ra_svn_has_capability(session, &iprop_capable,
+ SVN_RA_CAPABILITY_INHERITED_PROPS,
+ scratch_pool));
+
+ /* If we don't support native iprop handling, use the implementation
+ in libsvn_ra */
+ if (!iprop_capable)
+ return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, NULL, NULL);
SVN_ERR(svn_ra_svn__write_cmd_get_iprops(conn, scratch_pool,
path, revision));
@@ -2729,6 +2899,7 @@ static const svn_ra__vtable_t ra_svn_vtable = {
ra_svn_get_description,
ra_svn_get_schemes,
ra_svn_open,
+ ra_svn_dup_session,
ra_svn_reparent,
ra_svn_get_session_url,
ra_svn_get_latest_rev,
diff --git a/subversion/libsvn_ra_svn/cram.c b/subversion/libsvn_ra_svn/cram.c
index 1e54ac8..b92f37b 100644
--- a/subversion/libsvn_ra_svn/cram.c
+++ b/subversion/libsvn_ra_svn/cram.c
@@ -114,7 +114,7 @@ static svn_error_t *fail(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
const char *msg)
{
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(c)", "failure", msg));
- return svn_ra_svn__flush(conn, pool);
+ return svn_error_trace(svn_ra_svn__flush(conn, pool));
}
/* If we can, make the nonce with random bytes. If we can't... well,
diff --git a/subversion/libsvn_ra_svn/cyrus_auth.c b/subversion/libsvn_ra_svn/cyrus_auth.c
index 82e33d3..ac94a48 100644
--- a/subversion/libsvn_ra_svn/cyrus_auth.c
+++ b/subversion/libsvn_ra_svn/cyrus_auth.c
@@ -488,7 +488,7 @@ static svn_error_t *try_auth(svn_ra_svn__session_baton_t *sess,
pmech - mechstring);
const char *tail = pmech + strlen(mech);
- mechstring = apr_pstrcat(pool, head, tail, (char *)NULL);
+ mechstring = apr_pstrcat(pool, head, tail, SVN_VA_NULL);
again = TRUE;
}
}
@@ -704,11 +704,13 @@ static void sasl_timeout_cb(void *baton, apr_interval_time_t interval)
svn_ra_svn__stream_timeout(sasl_baton->stream, interval);
}
-/* Implements ra_svn_pending_fn_t. */
-static svn_boolean_t sasl_pending_cb(void *baton)
+/* Implements svn_stream_data_available_fn_t. */
+static svn_error_t *
+sasl_data_available_cb(void *baton, svn_boolean_t *data_available)
{
sasl_baton_t *sasl_baton = baton;
- return svn_ra_svn__stream_pending(sasl_baton->stream);
+ return svn_error_trace(svn_ra_svn__stream_data_available(sasl_baton->stream,
+ data_available));
}
svn_error_t *svn_ra_svn__enable_sasl_encryption(svn_ra_svn_conn_t *conn,
@@ -766,10 +768,19 @@ svn_error_t *svn_ra_svn__enable_sasl_encryption(svn_ra_svn_conn_t *conn,
/* Wrap the existing stream. */
sasl_baton->stream = conn->stream;
- conn->stream = svn_ra_svn__stream_create(sasl_baton, sasl_read_cb,
- sasl_write_cb,
- sasl_timeout_cb,
- sasl_pending_cb, conn->pool);
+ {
+ svn_stream_t *sasl_in = svn_stream_create(sasl_baton, conn->pool);
+ svn_stream_t *sasl_out = svn_stream_create(sasl_baton, conn->pool);
+
+ svn_stream_set_read2(sasl_in, sasl_read_cb, NULL /* use default */);
+ svn_stream_set_data_available(sasl_in, sasl_data_available_cb);
+ svn_stream_set_write(sasl_out, sasl_write_cb);
+
+ conn->stream = svn_ra_svn__stream_create(sasl_in, sasl_out,
+ sasl_baton,
+ sasl_timeout_cb,
+ conn->pool);
+ }
/* Yay, we have a security layer! */
conn->encrypted = TRUE;
}
@@ -807,10 +818,10 @@ svn_error_t *svn_ra_svn__get_addresses(const char **local_addrport,
/* Format the IP address and port number like this: a.b.c.d;port */
*local_addrport = apr_pstrcat(pool, local_addr, ";",
apr_itoa(pool, (int)local_sa->port),
- (char *)NULL);
+ SVN_VA_NULL);
*remote_addrport = apr_pstrcat(pool, remote_addr, ";",
apr_itoa(pool, (int)remote_sa->port),
- (char *)NULL);
+ SVN_VA_NULL);
}
return SVN_NO_ERROR;
}
@@ -849,14 +860,14 @@ svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess,
mechstring = apr_pstrcat(pool,
mechstring,
i == 0 ? "" : " ",
- elt->u.word, (char *)NULL);
+ elt->u.word, SVN_VA_NULL);
}
}
realmstring = apr_psprintf(pool, "%s %s", sess->realm_prefix, realm);
/* Initialize the credential baton. */
- cred_baton.auth_baton = sess->callbacks->auth_baton;
+ cred_baton.auth_baton = sess->auth_baton;
cred_baton.realmstring = realmstring;
cred_baton.pool = pool;
@@ -935,8 +946,8 @@ svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess,
the CRAM-MD5 or ANONYMOUS plugins, in which case we can simply use
the built-in implementation. In all other cases this call will be
useless, but hey, at least we'll get consistent error messages. */
- return svn_ra_svn__do_internal_auth(sess, mechlist,
- realm, pool);
+ return svn_error_trace(svn_ra_svn__do_internal_auth(sess, mechlist,
+ realm, pool));
}
return err;
}
diff --git a/subversion/libsvn_ra_svn/deprecated.c b/subversion/libsvn_ra_svn/deprecated.c
index 8182a4d..7f0c8fd 100644
--- a/subversion/libsvn_ra_svn/deprecated.c
+++ b/subversion/libsvn_ra_svn/deprecated.c
@@ -21,6 +21,10 @@
* ====================================================================
*/
+/* We define this here to remove any further warnings about the usage of
+ deprecated functions in this file. */
+#define SVN_DEPRECATED
+
#include "svn_ra_svn.h"
#include "private/svn_ra_svn_private.h"
@@ -232,3 +236,49 @@ svn_ra_svn_write_cmd_failure(svn_ra_svn_conn_t *conn,
{
return svn_error_trace(svn_ra_svn__write_cmd_failure(conn, pool, err));
}
+
+/* From marshal.c */
+svn_ra_svn_conn_t *
+svn_ra_svn_create_conn3(apr_socket_t *sock,
+ apr_file_t *in_file,
+ apr_file_t *out_file,
+ int compression_level,
+ apr_size_t zero_copy_limit,
+ apr_size_t error_check_interval,
+ apr_pool_t *pool)
+{
+ svn_stream_t *in_stream = NULL;
+ svn_stream_t *out_stream = NULL;
+
+ if (in_file)
+ in_stream = svn_stream_from_aprfile2(in_file, FALSE, pool);
+ if (out_file)
+ out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool);
+
+ return svn_ra_svn_create_conn4(sock, in_stream, out_stream,
+ compression_level, zero_copy_limit,
+ error_check_interval, pool);
+}
+
+svn_ra_svn_conn_t *
+svn_ra_svn_create_conn2(apr_socket_t *sock,
+ apr_file_t *in_file,
+ apr_file_t *out_file,
+ int compression_level,
+ apr_pool_t *pool)
+{
+ return svn_ra_svn_create_conn3(sock, in_file, out_file,
+ compression_level, 0, 0, pool);
+}
+
+/* backward-compatible implementation using the default compression level */
+svn_ra_svn_conn_t *
+svn_ra_svn_create_conn(apr_socket_t *sock,
+ apr_file_t *in_file,
+ apr_file_t *out_file,
+ apr_pool_t *pool)
+{
+ return svn_ra_svn_create_conn3(sock, in_file, out_file,
+ SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0,
+ pool);
+}
diff --git a/subversion/libsvn_ra_svn/editorp.c b/subversion/libsvn_ra_svn/editorp.c
index cc1d8ab..88af898 100644
--- a/subversion/libsvn_ra_svn/editorp.c
+++ b/subversion/libsvn_ra_svn/editorp.c
@@ -91,7 +91,7 @@ typedef struct ra_svn_driver_state_t {
different purpose instead: at apply-textdelta time, we set it to a
subpool of the file pool, which is destroyed in textdelta-end. */
typedef struct ra_svn_token_entry_t {
- const char *token;
+ svn_string_t *token;
void *baton;
svn_boolean_t is_file;
svn_stream_t *dstream; /* svndiff stream for apply_textdelta */
@@ -126,6 +126,7 @@ static ra_svn_baton_t *ra_svn_make_baton(svn_ra_svn_conn_t *conn,
static svn_error_t *
check_for_error_internal(ra_svn_edit_baton_t *eb, apr_pool_t *pool)
{
+ svn_boolean_t available;
SVN_ERR_ASSERT(!eb->got_status);
/* reset TX counter */
@@ -135,7 +136,8 @@ check_for_error_internal(ra_svn_edit_baton_t *eb, apr_pool_t *pool)
eb->conn->may_check_for_error = eb->conn->error_check_interval == 0;
/* any incoming data? */
- if (svn_ra_svn__input_waiting(eb->conn, pool))
+ SVN_ERR(svn_ra_svn__data_available(eb->conn, &available));
+ if (available)
{
eb->got_status = TRUE;
SVN_ERR(svn_ra_svn__write_cmd_abort_edit(eb->conn, pool));
@@ -393,11 +395,13 @@ static svn_error_t *ra_svn_close_edit(void *edit_baton, apr_pool_t *pool)
SVN_ERR_ASSERT(!eb->got_status);
eb->got_status = TRUE;
SVN_ERR(svn_ra_svn__write_cmd_close_edit(eb->conn, pool));
- err = svn_ra_svn__read_cmd_response(eb->conn, pool, "");
+ err = svn_error_trace(svn_ra_svn__read_cmd_response(eb->conn, pool, ""));
if (err)
{
- svn_error_clear(svn_ra_svn__write_cmd_abort_edit(eb->conn, pool));
- return err;
+ return svn_error_compose_create(
+ err,
+ svn_error_trace(
+ svn_ra_svn__write_cmd_abort_edit(eb->conn, pool)));
}
if (eb->callback)
SVN_ERR(eb->callback(eb->callback_baton));
@@ -461,27 +465,31 @@ void svn_ra_svn_get_editor(const svn_delta_editor_t **editor,
/* Store a token entry. The token string will be copied into pool. */
static ra_svn_token_entry_t *store_token(ra_svn_driver_state_t *ds,
- void *baton, const char *token,
+ void *baton,
+ svn_string_t *token,
svn_boolean_t is_file,
apr_pool_t *pool)
{
ra_svn_token_entry_t *entry;
entry = apr_palloc(pool, sizeof(*entry));
- entry->token = apr_pstrdup(pool, token);
+ entry->token = svn_string_dup(token, pool);
entry->baton = baton;
entry->is_file = is_file;
entry->dstream = NULL;
entry->pool = pool;
- svn_hash_sets(ds->tokens, entry->token, entry);
+
+ apr_hash_set(ds->tokens, entry->token->data, entry->token->len, entry);
+
return entry;
}
-static svn_error_t *lookup_token(ra_svn_driver_state_t *ds, const char *token,
+static svn_error_t *lookup_token(ra_svn_driver_state_t *ds,
+ svn_string_t *token,
svn_boolean_t is_file,
ra_svn_token_entry_t **entry)
{
- *entry = svn_hash_gets(ds->tokens, token);
+ *entry = apr_hash_get(ds->tokens, token->data, token->len);
if (!*entry || (*entry)->is_file != is_file)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Invalid file or dir token during edit"));
@@ -507,10 +515,10 @@ static svn_error_t *ra_svn_handle_open_root(svn_ra_svn_conn_t *conn,
{
svn_revnum_t rev;
apr_pool_t *subpool;
- const char *token;
+ svn_string_t *token;
void *root_baton;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)c", &rev, &token));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)s", &rev, &token));
subpool = svn_pool_create(ds->pool);
SVN_CMD_ERR(ds->editor->open_root(ds->edit_baton, rev, subpool,
&root_baton));
@@ -523,11 +531,12 @@ static svn_error_t *ra_svn_handle_delete_entry(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *path, *token;
+ const char *path;
+ svn_string_t *token;
svn_revnum_t rev;
ra_svn_token_entry_t *entry;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)c",
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)s",
&path, &rev, &token));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
path = svn_relpath_canonicalize(path, pool);
@@ -540,13 +549,14 @@ static svn_error_t *ra_svn_handle_add_dir(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *path, *token, *child_token, *copy_path;
+ const char *path, *copy_path;
+ svn_string_t *token, *child_token;
svn_revnum_t copy_rev;
ra_svn_token_entry_t *entry;
apr_pool_t *subpool;
void *child_baton;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ccc(?cr)", &path, &token,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "css(?cr)", &path, &token,
&child_token, &copy_path, &copy_rev));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
subpool = svn_pool_create(entry->pool);
@@ -573,13 +583,14 @@ static svn_error_t *ra_svn_handle_open_dir(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *path, *token, *child_token;
+ const char *path;
+ svn_string_t *token, *child_token;
svn_revnum_t rev;
ra_svn_token_entry_t *entry;
apr_pool_t *subpool;
void *child_baton;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ccc(?r)", &path, &token,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "css(?r)", &path, &token,
&child_token, &rev));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
subpool = svn_pool_create(entry->pool);
@@ -595,11 +606,12 @@ static svn_error_t *ra_svn_handle_change_dir_prop(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token, *name;
+ svn_string_t *token;
+ const char *name;
svn_string_t *value;
ra_svn_token_entry_t *entry;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cc(?s)", &token, &name,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "sc(?s)", &token, &name,
&value));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
SVN_CMD_ERR(ds->editor->change_dir_prop(entry->baton, name, value,
@@ -612,16 +624,16 @@ static svn_error_t *ra_svn_handle_close_dir(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
/* Parse and look up the directory token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &token));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "s", &token));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
/* Close the directory and destroy the baton. */
SVN_CMD_ERR(ds->editor->close_directory(entry->baton, pool));
- svn_hash_sets(ds->tokens, token, NULL);
+ apr_hash_set(ds->tokens, token->data, token->len, NULL);
svn_pool_destroy(entry->pool);
return SVN_NO_ERROR;
}
@@ -632,11 +644,11 @@ static svn_error_t *ra_svn_handle_absent_dir(svn_ra_svn_conn_t *conn,
ra_svn_driver_state_t *ds)
{
const char *path;
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
/* Parse parameters and look up the directory token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cc", &path, &token));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cs", &path, &token));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
/* Call the editor. */
@@ -649,15 +661,19 @@ static svn_error_t *ra_svn_handle_add_file(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *path, *token, *file_token, *copy_path;
+ const char *path, *copy_path;
+ svn_string_t *token, *file_token;
svn_revnum_t copy_rev;
ra_svn_token_entry_t *entry, *file_entry;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ccc(?cr)", &path, &token,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "css(?cr)", &path, &token,
&file_token, &copy_path, &copy_rev));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
ds->file_refs++;
- path = svn_relpath_canonicalize(path, pool);
+
+ /* The PATH should be canonical .. but never trust incoming data. */
+ if (!svn_relpath_is_canonical(path))
+ path = svn_relpath_canonicalize(path, pool);
/* Some operations pass COPY_PATH as a full URL (commits, etc.).
Others (replay, e.g.) deliver an fspath. That's ... annoying. */
@@ -680,15 +696,20 @@ static svn_error_t *ra_svn_handle_open_file(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *path, *token, *file_token;
+ const char *path;
+ svn_string_t *token, *file_token;
svn_revnum_t rev;
ra_svn_token_entry_t *entry, *file_entry;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ccc(?r)", &path, &token,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "css(?r)", &path, &token,
&file_token, &rev));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
ds->file_refs++;
- path = svn_relpath_canonicalize(path, pool);
+
+ /* The PATH should be canonical .. but never trust incoming data. */
+ if (!svn_relpath_is_canonical(path))
+ path = svn_relpath_canonicalize(path, pool);
+
file_entry = store_token(ds, NULL, file_token, TRUE, ds->file_pool);
SVN_CMD_ERR(ds->editor->open_file(path, entry->baton, rev, ds->file_pool,
&file_entry->baton));
@@ -700,14 +721,14 @@ static svn_error_t *ra_svn_handle_apply_textdelta(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
svn_txdelta_window_handler_t wh;
void *wh_baton;
char *base_checksum;
/* Parse arguments and look up the token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)",
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "s(?c)",
&token, &base_checksum));
SVN_ERR(lookup_token(ds, token, TRUE, &entry));
if (entry->dstream)
@@ -725,12 +746,12 @@ static svn_error_t *ra_svn_handle_textdelta_chunk(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
svn_string_t *str;
/* Parse arguments and look up the token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cs", &token, &str));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "ss", &token, &str));
SVN_ERR(lookup_token(ds, token, TRUE, &entry));
if (!entry->dstream)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
@@ -744,11 +765,11 @@ static svn_error_t *ra_svn_handle_textdelta_end(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
/* Parse arguments and look up the token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &token));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "s", &token));
SVN_ERR(lookup_token(ds, token, TRUE, &entry));
if (!entry->dstream)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
@@ -764,11 +785,11 @@ static svn_error_t *ra_svn_handle_change_file_prop(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token, *name;
- svn_string_t *value;
+ const char *name;
+ svn_string_t *token, *value;
ra_svn_token_entry_t *entry;
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cc(?s)", &token, &name,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "sc(?s)", &token, &name,
&value));
SVN_ERR(lookup_token(ds, token, TRUE, &entry));
SVN_CMD_ERR(ds->editor->change_file_prop(entry->baton, name, value, pool));
@@ -780,18 +801,18 @@ static svn_error_t *ra_svn_handle_close_file(svn_ra_svn_conn_t *conn,
const apr_array_header_t *params,
ra_svn_driver_state_t *ds)
{
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
const char *text_checksum;
/* Parse arguments and look up the file token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)",
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "s(?c)",
&token, &text_checksum));
SVN_ERR(lookup_token(ds, token, TRUE, &entry));
/* Close the file and destroy the baton. */
SVN_CMD_ERR(ds->editor->close_file(entry->baton, text_checksum, pool));
- svn_hash_sets(ds->tokens, token, NULL);
+ apr_hash_set(ds->tokens, token->data, token->len, NULL);
if (--ds->file_refs == 0)
svn_pool_clear(ds->file_pool);
return SVN_NO_ERROR;
@@ -803,11 +824,11 @@ static svn_error_t *ra_svn_handle_absent_file(svn_ra_svn_conn_t *conn,
ra_svn_driver_state_t *ds)
{
const char *path;
- const char *token;
+ svn_string_t *token;
ra_svn_token_entry_t *entry;
/* Parse parameters and look up the parent directory token. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cc", &path, &token));
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "cs", &path, &token));
SVN_ERR(lookup_token(ds, token, FALSE, &entry));
/* Call the editor. */
@@ -978,7 +999,12 @@ svn_error_t *svn_ra_svn_drive_editor2(svn_ra_svn_conn_t *conn,
{
/* Abort the edit and use non-blocking I/O to write the error. */
if (editor)
- svn_error_clear(editor->abort_edit(edit_baton, subpool));
+ {
+ err = svn_error_compose_create(
+ err,
+ svn_error_trace(editor->abort_edit(edit_baton,
+ subpool)));
+ }
svn_ra_svn__set_block_handler(conn, blocked_write, &state);
}
write_err = svn_ra_svn__write_cmd_failure(
@@ -987,7 +1013,7 @@ svn_error_t *svn_ra_svn_drive_editor2(svn_ra_svn_conn_t *conn,
if (!write_err)
write_err = svn_ra_svn__flush(conn, subpool);
svn_ra_svn__set_block_handler(conn, NULL, NULL);
- svn_error_clear(err);
+ svn_error_clear(err); /* We just sent this error */
SVN_ERR(write_err);
break;
}
diff --git a/subversion/libsvn_ra_svn/internal_auth.c b/subversion/libsvn_ra_svn/internal_auth.c
index eac2ccd..8e63ab5 100644
--- a/subversion/libsvn_ra_svn/internal_auth.c
+++ b/subversion/libsvn_ra_svn/internal_auth.c
@@ -95,7 +95,7 @@ svn_ra_svn__do_internal_auth(svn_ra_svn__session_baton_t *sess,
{
SVN_ERR(svn_auth_first_credentials(&creds, &iterstate,
SVN_AUTH_CRED_SIMPLE, realmstring,
- sess->callbacks->auth_baton, pool));
+ sess->auth_baton, pool));
if (!creds)
return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
_("Can't get password"));
diff --git a/subversion/libsvn_ra_svn/libsvn_ra_svn.pc.in b/subversion/libsvn_ra_svn/libsvn_ra_svn.pc.in
new file mode 100644
index 0000000..4d67689
--- /dev/null
+++ b/subversion/libsvn_ra_svn/libsvn_ra_svn.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_ra_svn
+Description: Subversion SVN Protocol Repository Access Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_subr
+Libs: -L${libdir} -lsvn_ra_svn @SVN_SASL_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_ra_svn/marshal.c b/subversion/libsvn_ra_svn/marshal.c
index 7cf483f..0778269 100644
--- a/subversion/libsvn_ra_svn/marshal.c
+++ b/subversion/libsvn_ra_svn/marshal.c
@@ -40,6 +40,7 @@
#include "svn_ra_svn.h"
#include "svn_private_config.h"
#include "svn_ctype.h"
+#include "svn_sorts.h"
#include "svn_time.h"
#include "ra_svn.h"
@@ -47,6 +48,7 @@
#include "private/svn_string_private.h"
#include "private/svn_dep_compat.h"
#include "private/svn_error_private.h"
+#include "private/svn_subr_private.h"
#define svn_iswhitespace(c) ((c) == ' ' || (c) == '\n')
@@ -56,6 +58,19 @@
#define SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD (0x100000)
+/* We don't use "words" longer than this in our protocol. The longest word
+ * we are currently using is only about 16 chars long but we leave room for
+ * longer future capability and command names.
+ */
+#define MAX_WORD_LENGTH 31
+
+/* The generic parsers will use the following value to limit the recursion
+ * depth to some reasonable value. The current protocol implementation
+ * actually uses only maximum item nesting level of around 5. So, there is
+ * plenty of headroom here.
+ */
+#define ITEM_NESTING_LIMIT 64
+
/* Return the APR socket timeout to be used for the connection depending
* on whether there is a blockage handler or zero copy has been activated. */
static apr_interval_time_t
@@ -66,19 +81,20 @@ get_timeout(svn_ra_svn_conn_t *conn)
/* --- CONNECTION INITIALIZATION --- */
-svn_ra_svn_conn_t *svn_ra_svn_create_conn3(apr_socket_t *sock,
- apr_file_t *in_file,
- apr_file_t *out_file,
+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 *pool)
+ apr_pool_t *result_pool)
{
svn_ra_svn_conn_t *conn;
- void *mem = apr_palloc(pool, sizeof(*conn) + SVN_RA_SVN__PAGE_SIZE);
+ void *mem = apr_palloc(result_pool, sizeof(*conn) + SVN_RA_SVN__PAGE_SIZE);
conn = (void*)APR_ALIGN((apr_uintptr_t)mem, SVN_RA_SVN__PAGE_SIZE);
- assert((sock && !in_file && !out_file) || (!sock && in_file && out_file));
+ assert((sock && !in_stream && !out_stream)
+ || (!sock && in_stream && out_stream));
#ifdef SVN_HAVE_SASL
conn->sock = sock;
conn->encrypted = FALSE;
@@ -92,15 +108,15 @@ svn_ra_svn_conn_t *svn_ra_svn_create_conn3(apr_socket_t *sock,
conn->may_check_for_error = error_check_interval == 0;
conn->block_handler = NULL;
conn->block_baton = NULL;
- conn->capabilities = apr_hash_make(pool);
+ conn->capabilities = apr_hash_make(result_pool);
conn->compression_level = compression_level;
conn->zero_copy_limit = zero_copy_limit;
- conn->pool = pool;
+ conn->pool = result_pool;
if (sock != NULL)
{
apr_sockaddr_t *sa;
- conn->stream = svn_ra_svn__stream_from_sock(sock, pool);
+ conn->stream = svn_ra_svn__stream_from_sock(sock, result_pool);
if (!(apr_socket_addr_get(&sa, APR_REMOTE, sock) == APR_SUCCESS
&& apr_sockaddr_ip_get(&conn->remote_ip, sa) == APR_SUCCESS))
conn->remote_ip = NULL;
@@ -108,34 +124,14 @@ svn_ra_svn_conn_t *svn_ra_svn_create_conn3(apr_socket_t *sock,
}
else
{
- conn->stream = svn_ra_svn__stream_from_files(in_file, out_file, pool);
+ conn->stream = svn_ra_svn__stream_from_streams(in_stream, out_stream,
+ result_pool);
conn->remote_ip = NULL;
}
return conn;
}
-svn_ra_svn_conn_t *svn_ra_svn_create_conn2(apr_socket_t *sock,
- apr_file_t *in_file,
- apr_file_t *out_file,
- int compression_level,
- apr_pool_t *pool)
-{
- return svn_ra_svn_create_conn3(sock, in_file, out_file,
- compression_level, 0, 0, pool);
-}
-
-/* backward-compatible implementation using the default compression level */
-svn_ra_svn_conn_t *svn_ra_svn_create_conn(apr_socket_t *sock,
- apr_file_t *in_file,
- apr_file_t *out_file,
- apr_pool_t *pool)
-{
- return svn_ra_svn_create_conn3(sock, in_file, out_file,
- SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, 0, 0,
- pool);
-}
-
svn_error_t *svn_ra_svn_set_capabilities(svn_ra_svn_conn_t *conn,
const apr_array_header_t *list)
{
@@ -155,6 +151,12 @@ svn_error_t *svn_ra_svn_set_capabilities(svn_ra_svn_conn_t *conn,
return SVN_NO_ERROR;
}
+apr_pool_t *
+svn_ra_svn__get_pool(svn_ra_svn_conn_t *conn)
+{
+ return conn->pool;
+}
+
svn_error_t *
svn_ra_svn__set_shim_callbacks(svn_ra_svn_conn_t *conn,
svn_delta_shim_callbacks_t *shim_callbacks)
@@ -196,10 +198,10 @@ svn_ra_svn__set_block_handler(svn_ra_svn_conn_t *conn,
svn_ra_svn__stream_timeout(conn->stream, get_timeout(conn));
}
-svn_boolean_t svn_ra_svn__input_waiting(svn_ra_svn_conn_t *conn,
- apr_pool_t *pool)
+svn_error_t *svn_ra_svn__data_available(svn_ra_svn_conn_t *conn,
+ svn_boolean_t *data_available)
{
- return svn_ra_svn__stream_pending(conn->stream);
+ return svn_ra_svn__stream_data_available(conn->stream, data_available);
}
/* --- WRITE BUFFER MANAGEMENT --- */
@@ -285,20 +287,13 @@ static svn_error_t *writebuf_write(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return SVN_NO_ERROR;
}
-static svn_error_t *
-writebuf_write_short_string(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
- const char *data, apr_size_t len)
-{
- apr_size_t left = sizeof(conn->write_buf) - conn->write_pos;
- if (len <= left)
- {
- memcpy(conn->write_buf + conn->write_pos, data, len);
- conn->write_pos += len;
- return SVN_NO_ERROR;
- }
- else
- return writebuf_write(conn, pool, data, len);
-}
+/* Write STRING_LITERAL, which is a string literal argument.
+
+ Note: The purpose of the empty string "" in the macro definition is to
+ assert that STRING_LITERAL is in fact a string literal. Otherwise, the
+ string concatenation attempt should produce a compile-time error. */
+#define writebuf_write_literal(conn, pool, string_literal) \
+ writebuf_write(conn, pool, string_literal, sizeof(string_literal "") - 1)
static APR_INLINE svn_error_t *
writebuf_writechar(svn_ra_svn_conn_t *conn, apr_pool_t *pool, char data)
@@ -389,7 +384,9 @@ static svn_error_t *readbuf_fill(svn_ra_svn_conn_t *conn, apr_pool_t *pool)
apr_size_t len;
SVN_ERR_ASSERT(conn->read_ptr == conn->read_end);
- SVN_ERR(writebuf_flush(conn, pool));
+ if (conn->write_pos)
+ SVN_ERR(writebuf_flush(conn, pool));
+
len = sizeof(conn->read_buf);
SVN_ERR(readbuf_input(conn, conn->read_buf, &len, pool));
conn->read_ptr = conn->read_buf;
@@ -397,7 +394,11 @@ static svn_error_t *readbuf_fill(svn_ra_svn_conn_t *conn, apr_pool_t *pool)
return SVN_NO_ERROR;
}
-static APR_INLINE svn_error_t *
+/* This is a hot function calling a cold function. GCC and others tend to
+ * inline the cold sub-function instead of this hot one. Therefore, be
+ * very insistent on lining this one. It is not a correctness issue, though.
+ */
+static SVN__FORCE_INLINE svn_error_t *
readbuf_getchar(svn_ra_svn_conn_t *conn, apr_pool_t *pool, char *result)
{
if (conn->read_ptr == conn->read_end)
@@ -511,21 +512,32 @@ svn_ra_svn__write_number(svn_ra_svn_conn_t *conn,
return write_number(conn, pool, number, ' ');
}
-svn_error_t *
-svn_ra_svn__write_string(svn_ra_svn_conn_t *conn,
- apr_pool_t *pool,
- const svn_string_t *str)
+static svn_error_t *
+svn_ra_svn__write_ncstring(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ const char *s,
+ apr_size_t len)
{
- if (str->len < 10)
+ if (len < 10)
{
- SVN_ERR(writebuf_writechar(conn, pool, (char)(str->len + '0')));
+ SVN_ERR(writebuf_writechar(conn, pool, (char)(len + '0')));
SVN_ERR(writebuf_writechar(conn, pool, ':'));
}
else
- SVN_ERR(write_number(conn, pool, str->len, ':'));
+ SVN_ERR(write_number(conn, pool, len, ':'));
- SVN_ERR(writebuf_write(conn, pool, str->data, str->len));
+ SVN_ERR(writebuf_write(conn, pool, s, len));
SVN_ERR(writebuf_writechar(conn, pool, ' '));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_svn__write_string(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ const svn_string_t *str)
+{
+ SVN_ERR(svn_ra_svn__write_ncstring(conn, pool, str->data, str->len));
return SVN_NO_ERROR;
}
@@ -534,19 +546,7 @@ svn_ra_svn__write_cstring(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *s)
{
- apr_size_t len = strlen(s);
-
- if (len < 10)
- {
- SVN_ERR(writebuf_writechar(conn, pool, (char)(len + '0')));
- SVN_ERR(writebuf_writechar(conn, pool, ':'));
- }
- else
- SVN_ERR(write_number(conn, pool, len, ':'));
-
- SVN_ERR(writebuf_write(conn, pool, s, len));
- SVN_ERR(writebuf_writechar(conn, pool, ' '));
-
+ SVN_ERR(svn_ra_svn__write_ncstring(conn, pool, s, strlen(s)));
return SVN_NO_ERROR;
}
@@ -555,38 +555,52 @@ svn_ra_svn__write_word(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *word)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, word, strlen(word)));
+ SVN_ERR(writebuf_write(conn, pool, word, strlen(word)));
SVN_ERR(writebuf_writechar(conn, pool, ' '));
return SVN_NO_ERROR;
}
svn_error_t *
+svn_ra_svn__write_boolean(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ svn_boolean_t value)
+{
+ if (value)
+ SVN_ERR(writebuf_write_literal(conn, pool, "true "));
+ else
+ SVN_ERR(writebuf_write_literal(conn, pool, "false "));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_ra_svn__write_proplist(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
apr_hash_t *props)
{
- apr_pool_t *iterpool;
apr_hash_index_t *hi;
- const void *key;
- void *val;
const char *propname;
svn_string_t *propval;
+ apr_size_t len;
+ /* One might use an iterpool here but that would only be used when the
+ send buffer gets flushed and only by the CONN's progress callback.
+ That should happen at most once for typical prop lists and even then
+ use only a few bytes at best.
+ */
if (props)
- {
- iterpool = svn_pool_create(pool);
- for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
- {
- svn_pool_clear(iterpool);
- apr_hash_this(hi, &key, NULL, &val);
- propname = key;
- propval = val;
- SVN_ERR(svn_ra_svn__write_tuple(conn, iterpool, "cs",
- propname, propval));
- }
- svn_pool_destroy(iterpool);
- }
+ for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
+ {
+ apr_hash_this(hi, (const void **)&propname,
+ (apr_ssize_t *)&len,
+ (void **)&propval);
+
+ SVN_ERR(svn_ra_svn__start_list(conn, pool));
+ SVN_ERR(svn_ra_svn__write_ncstring(conn, pool, propname, len));
+ SVN_ERR(svn_ra_svn__write_string(conn, pool, propval));
+ SVN_ERR(svn_ra_svn__end_list(conn, pool));
+ }
return SVN_NO_ERROR;
}
@@ -704,8 +718,7 @@ vwrite_tuple_number(svn_ra_svn_conn_t *conn, apr_pool_t *pool, va_list *ap)
static svn_error_t *
vwrite_tuple_boolean(svn_ra_svn_conn_t *conn, apr_pool_t *pool, va_list *ap)
{
- const char *cstr = va_arg(*ap, svn_boolean_t) ? "true" : "false";
- return svn_ra_svn__write_word(conn, pool, cstr);
+ return svn_ra_svn__write_boolean(conn, pool, va_arg(*ap, svn_boolean_t));
}
static svn_error_t *
@@ -780,8 +793,7 @@ write_tuple_boolean(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
svn_boolean_t value)
{
- const char *cstr = value ? "true" : "false";
- return svn_ra_svn__write_word(conn, pool, cstr);
+ return svn_ra_svn__write_boolean(conn, pool, value);
}
static svn_error_t *
@@ -929,10 +941,10 @@ svn_ra_svn__write_tuple(svn_ra_svn_conn_t *conn,
static svn_error_t *read_string(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_ra_svn_item_t *item, apr_uint64_t len64)
{
- svn_stringbuf_t *stringbuf;
apr_size_t len = (apr_size_t)len64;
apr_size_t readbuf_len;
char *dest;
+ apr_size_t buflen;
/* We can't store strings longer than the maximum size of apr_size_t,
* so check for wrapping */
@@ -940,58 +952,61 @@ static svn_error_t *read_string(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("String length larger than maximum"));
- /* Read the string in chunks. The chunk size is large enough to avoid
- * re-allocation in typical cases, and small enough to ensure we do not
- * pre-allocate an unreasonable amount of memory if (perhaps due to
- * network data corruption or a DOS attack), we receive a bogus claim that
- * a very long string is going to follow. In that case, we start small
- * and wait for all that data to actually show up. This does not fully
- * prevent DOS attacks but makes them harder (you have to actually send
- * gigabytes of data). */
- readbuf_len = len < SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD
- ? len
- : SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD;
- stringbuf = svn_stringbuf_create_ensure(readbuf_len, pool);
- dest = stringbuf->data;
-
- /* Read remaining string data directly into the string structure.
- * Do it iteratively, if necessary. */
- while (readbuf_len)
+ buflen = conn->read_end - conn->read_ptr;
+ /* Shorter strings can be copied directly from the read buffer. */
+ if (len <= buflen)
{
- SVN_ERR(readbuf_read(conn, pool, dest, readbuf_len));
-
- stringbuf->len += readbuf_len;
- len -= readbuf_len;
+ item->kind = SVN_RA_SVN_STRING;
+ item->u.string = svn_string_ncreate(conn->read_ptr, len, pool);
+ conn->read_ptr += len;
+ }
+ else
+ {
+ /* Read the string in chunks. The chunk size is large enough to avoid
+ * re-allocation in typical cases, and small enough to ensure we do
+ * not pre-allocate an unreasonable amount of memory if (perhaps due
+ * to network data corruption or a DOS attack), we receive a bogus
+ * claim that a very long string is going to follow. In that case, we
+ * start small and wait for all that data to actually show up. This
+ * does not fully prevent DOS attacks but makes them harder (you have
+ * to actually send gigabytes of data). */
+ svn_stringbuf_t *stringbuf = svn_stringbuf_create_empty(pool);
+
+ /* Read string data directly into the string structure.
+ * Do it iteratively. */
+ do
+ {
+ /* Determine length of chunk to read and re-alloc the buffer. */
+ readbuf_len
+ = len < SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD
+ ? len
+ : SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD;
- /* Early exit. In most cases, strings can be read in the first
- * iteration. */
- if (len == 0)
- break;
+ svn_stringbuf_ensure(stringbuf, stringbuf->len + readbuf_len);
+ dest = stringbuf->data + stringbuf->len;
- /* Prepare next iteration: determine length of chunk to read
- * and re-alloc the string buffer. */
- readbuf_len
- = len < SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD
- ? len
- : SUSPICIOUSLY_HUGE_STRING_SIZE_THRESHOLD;
+ /* read data & update length info */
+ SVN_ERR(readbuf_read(conn, pool, dest, readbuf_len));
- svn_stringbuf_ensure(stringbuf, stringbuf->len + readbuf_len);
- dest = stringbuf->data + stringbuf->len;
- }
+ stringbuf->len += readbuf_len;
+ len -= readbuf_len;
+ }
+ while (len);
- /* zero-terminate the string */
- stringbuf->data[stringbuf->len] = '\0';
+ /* zero-terminate the string */
+ stringbuf->data[stringbuf->len] = '\0';
- /* Return the string properly wrapped into an RA_SVN item. */
- item->kind = SVN_RA_SVN_STRING;
- item->u.string = svn_stringbuf__morph_into_string(stringbuf);
+ /* Return the string properly wrapped into an RA_SVN item. */
+ item->kind = SVN_RA_SVN_STRING;
+ item->u.string = svn_stringbuf__morph_into_string(stringbuf);
+ }
return SVN_NO_ERROR;
}
/* Given the first non-whitespace character FIRST_CHAR, read an item
* into the already allocated structure ITEM. LEVEL should be set
- * to 0 for the first call and is used to enforce a recurssion limit
+ * to 0 for the first call and is used to enforce a recursion limit
* on the parser. */
static svn_error_t *read_item(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_ra_svn_item_t *item, char first_char,
@@ -999,12 +1014,11 @@ static svn_error_t *read_item(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
{
char c = first_char;
apr_uint64_t val;
- svn_stringbuf_t *str;
svn_ra_svn_item_t *listitem;
- if (++level >= 64)
+ if (++level >= ITEM_NESTING_LIMIT)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
- _("Too many nested items"));
+ _("Items are nested too deeply"));
/* Determine the item type and read it in. Make sure that c is the
@@ -1022,7 +1036,8 @@ static svn_error_t *read_item(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
break;
val = val * 10 + (c - '0');
/* val wrapped past maximum value? */
- if (prev_val >= (APR_UINT64_MAX / 10) && (val / 10) != prev_val)
+ if ((prev_val >= (APR_UINT64_MAX / 10))
+ && (val < APR_UINT64_MAX - 10))
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Number is larger than maximum"));
}
@@ -1041,18 +1056,28 @@ static svn_error_t *read_item(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
}
else if (svn_ctype_isalpha(c))
{
- /* It's a word. */
- str = svn_stringbuf_create_ensure(16, pool);
- svn_stringbuf_appendbyte(str, c);
+ /* It's a word. Read it into a buffer of limited size. */
+ char *buffer = apr_palloc(pool, MAX_WORD_LENGTH + 1);
+ char *end = buffer + MAX_WORD_LENGTH;
+ char *p = buffer + 1;
+
+ buffer[0] = c;
while (1)
{
- SVN_ERR(readbuf_getchar(conn, pool, &c));
- if (!svn_ctype_isalnum(c) && c != '-')
+ SVN_ERR(readbuf_getchar(conn, pool, p));
+ if (!svn_ctype_isalnum(*p) && *p != '-')
break;
- svn_stringbuf_appendbyte(str, c);
+
+ if (++p == end)
+ return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
+ _("Word is too long"));
}
+
+ c = *p;
+ *p = '\0';
+
item->kind = SVN_RA_SVN_WORD;
- item->u.word = str->data;
+ item->u.word = buffer;
}
else if (c == '(')
{
@@ -1179,6 +1204,36 @@ svn_ra_svn__read_item(svn_ra_svn_conn_t *conn,
return read_item(conn, pool, *item, c, 0);
}
+/* Drain existing whitespace from the receive buffer of CONN until either
+ there is no data in the underlying receive socket anymore or we found
+ a non-whitespace char. Set *HAS_ITEM to TRUE in the latter case.
+ */
+static svn_error_t *
+svn_ra_svn__has_item(svn_boolean_t *has_item,
+ svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool)
+{
+ do
+ {
+ if (conn->read_ptr == conn->read_end)
+ {
+ svn_boolean_t available;
+ if (conn->write_pos)
+ SVN_ERR(writebuf_flush(conn, pool));
+
+ SVN_ERR(svn_ra_svn__data_available(conn, &available));
+ if (!available)
+ break;
+
+ SVN_ERR(readbuf_fill(conn, pool));
+ }
+ }
+ while (svn_iswhitespace(*conn->read_ptr) && ++conn->read_ptr);
+
+ *has_item = conn->read_ptr != conn->read_end;
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_ra_svn__skip_leading_garbage(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
@@ -1202,14 +1257,15 @@ static svn_error_t *vparse_tuple(const apr_array_header_t *items, apr_pool_t *po
if (**fmt == '?')
(*fmt)++;
elt = &APR_ARRAY_IDX(items, count, svn_ra_svn_item_t);
- if (**fmt == 'n' && elt->kind == SVN_RA_SVN_NUMBER)
- *va_arg(*ap, apr_uint64_t *) = elt->u.number;
- else if (**fmt == 'r' && elt->kind == SVN_RA_SVN_NUMBER)
- *va_arg(*ap, svn_revnum_t *) = (svn_revnum_t) elt->u.number;
- else if (**fmt == 's' && elt->kind == SVN_RA_SVN_STRING)
- *va_arg(*ap, svn_string_t **) = elt->u.string;
+ if (**fmt == '(' && elt->kind == SVN_RA_SVN_LIST)
+ {
+ (*fmt)++;
+ SVN_ERR(vparse_tuple(elt->u.list, pool, fmt, ap));
+ }
else if (**fmt == 'c' && elt->kind == SVN_RA_SVN_STRING)
*va_arg(*ap, const char **) = elt->u.string->data;
+ else if (**fmt == 's' && elt->kind == SVN_RA_SVN_STRING)
+ *va_arg(*ap, svn_string_t **) = elt->u.string;
else if (**fmt == 'w' && elt->kind == SVN_RA_SVN_WORD)
*va_arg(*ap, const char **) = elt->u.word;
else if (**fmt == 'b' && elt->kind == SVN_RA_SVN_WORD)
@@ -1221,6 +1277,10 @@ static svn_error_t *vparse_tuple(const apr_array_header_t *items, apr_pool_t *po
else
break;
}
+ else if (**fmt == 'n' && elt->kind == SVN_RA_SVN_NUMBER)
+ *va_arg(*ap, apr_uint64_t *) = elt->u.number;
+ else if (**fmt == 'r' && elt->kind == SVN_RA_SVN_NUMBER)
+ *va_arg(*ap, svn_revnum_t *) = (svn_revnum_t) elt->u.number;
else if (**fmt == 'B' && elt->kind == SVN_RA_SVN_WORD)
{
if (strcmp(elt->u.word, "true") == 0)
@@ -1230,13 +1290,17 @@ static svn_error_t *vparse_tuple(const apr_array_header_t *items, apr_pool_t *po
else
break;
}
- else if (**fmt == 'l' && elt->kind == SVN_RA_SVN_LIST)
- *va_arg(*ap, apr_array_header_t **) = elt->u.list;
- else if (**fmt == '(' && elt->kind == SVN_RA_SVN_LIST)
+ else if (**fmt == '3' && elt->kind == SVN_RA_SVN_WORD)
{
- (*fmt)++;
- SVN_ERR(vparse_tuple(elt->u.list, pool, fmt, ap));
+ if (strcmp(elt->u.word, "true") == 0)
+ *va_arg(*ap, svn_tristate_t *) = svn_tristate_true;
+ else if (strcmp(elt->u.word, "false") == 0)
+ *va_arg(*ap, svn_tristate_t *) = svn_tristate_false;
+ else
+ break;
}
+ else if (**fmt == 'l' && elt->kind == SVN_RA_SVN_LIST)
+ *va_arg(*ap, apr_array_header_t **) = elt->u.list;
else if (**fmt == ')')
return SVN_NO_ERROR;
else
@@ -1268,6 +1332,9 @@ static svn_error_t *vparse_tuple(const apr_array_header_t *items, apr_pool_t *po
case 'n':
*va_arg(*ap, apr_uint64_t *) = SVN_RA_SVN_UNSPECIFIED_NUMBER;
break;
+ case '3':
+ *va_arg(*ap, svn_tristate_t *) = svn_tristate_unknown;
+ break;
case '(':
nesting_level++;
break;
@@ -1337,21 +1404,21 @@ svn_ra_svn__parse_proplist(const apr_array_header_t *list,
apr_pool_t *pool,
apr_hash_t **props)
{
- char *name;
+ svn_string_t *name;
svn_string_t *value;
svn_ra_svn_item_t *elt;
int i;
- *props = apr_hash_make(pool);
+ *props = svn_hash__make(pool);
for (i = 0; i < list->nelts; i++)
{
elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Proplist element not a list"));
- SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cs",
+ SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "ss",
&name, &value));
- svn_hash_sets(*props, name, value);
+ apr_hash_set(*props, name->data, name->len, value);
}
return SVN_NO_ERROR;
@@ -1447,7 +1514,7 @@ svn_ra_svn__read_cmd_response(svn_ra_svn_conn_t *conn,
}
else if (strcmp(status, "failure") == 0)
{
- return svn_ra_svn__handle_failure_status(params, pool);
+ return svn_error_trace(svn_ra_svn__handle_failure_status(params, pool));
}
return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
@@ -1456,6 +1523,76 @@ svn_ra_svn__read_cmd_response(svn_ra_svn_conn_t *conn,
}
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)
+{
+ svn_error_t *err = svn_ra_svn__has_item(has_command, conn, pool);
+ if (err && err->apr_err == SVN_ERR_RA_SVN_CONNECTION_CLOSED)
+ {
+ *terminated = TRUE;
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+
+ *terminated = FALSE;
+ return svn_error_trace(err);
+}
+
+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)
+{
+ const char *cmdname;
+ svn_error_t *err, *write_err;
+ apr_array_header_t *params;
+ const svn_ra_svn_cmd_entry_t *command;
+
+ *terminate = FALSE;
+ err = svn_ra_svn__read_tuple(conn, pool, "wl", &cmdname, &params);
+ if (err)
+ {
+ if (!error_on_disconnect
+ && err->apr_err == SVN_ERR_RA_SVN_CONNECTION_CLOSED)
+ {
+ svn_error_clear(err);
+ *terminate = TRUE;
+ return SVN_NO_ERROR;
+ }
+ return err;
+ }
+
+ command = svn_hash_gets(cmd_hash, cmdname);
+ if (command)
+ {
+ err = (*command->handler)(conn, pool, params, baton);
+ *terminate = command->terminate;
+ }
+ else
+ {
+ err = svn_error_createf(SVN_ERR_RA_SVN_UNKNOWN_CMD, NULL,
+ _("Unknown editor command '%s'"), cmdname);
+ err = svn_error_create(SVN_ERR_RA_SVN_CMD_ERR, err, NULL);
+ }
+
+ if (err && err->apr_err == SVN_ERR_RA_SVN_CMD_ERR)
+ {
+ write_err = svn_ra_svn__write_cmd_failure(
+ conn, pool,
+ svn_ra_svn__locate_real_error_child(err));
+ svn_error_clear(err);
+ return write_err ? write_err : SVN_NO_ERROR;
+ }
+
+ return err;
+}
+
+svn_error_t *
svn_ra_svn__handle_commands2(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const svn_ra_svn_cmd_entry_t *commands,
@@ -1464,10 +1601,7 @@ svn_ra_svn__handle_commands2(svn_ra_svn_conn_t *conn,
{
apr_pool_t *subpool = svn_pool_create(pool);
apr_pool_t *iterpool = svn_pool_create(subpool);
- const char *cmdname;
const svn_ra_svn_cmd_entry_t *command;
- svn_error_t *err, *write_err;
- apr_array_header_t *params;
apr_hash_t *cmd_hash = apr_hash_make(subpool);
for (command = commands; command->cmdname; command++)
@@ -1475,43 +1609,18 @@ svn_ra_svn__handle_commands2(svn_ra_svn_conn_t *conn,
while (1)
{
+ svn_boolean_t terminate;
+ svn_error_t *err;
svn_pool_clear(iterpool);
- err = svn_ra_svn__read_tuple(conn, iterpool, "wl", &cmdname, &params);
- if (err)
- {
- if (!error_on_disconnect
- && err->apr_err == SVN_ERR_RA_SVN_CONNECTION_CLOSED)
- {
- svn_error_clear(err);
- svn_pool_destroy(subpool);
- return SVN_NO_ERROR;
- }
- return err;
- }
- command = svn_hash_gets(cmd_hash, cmdname);
- if (command)
- err = (*command->handler)(conn, iterpool, params, baton);
- else
- {
- err = svn_error_createf(SVN_ERR_RA_SVN_UNKNOWN_CMD, NULL,
- _("Unknown editor command '%s'"), cmdname);
- err = svn_error_create(SVN_ERR_RA_SVN_CMD_ERR, err, NULL);
- }
-
- if (err && err->apr_err == SVN_ERR_RA_SVN_CMD_ERR)
+ err = svn_ra_svn__handle_command(&terminate, cmd_hash, baton, conn,
+ error_on_disconnect, iterpool);
+ if (err)
{
- write_err = svn_ra_svn__write_cmd_failure(
- conn, iterpool,
- svn_ra_svn__locate_real_error_child(err));
- svn_error_clear(err);
- if (write_err)
- return write_err;
+ svn_pool_destroy(subpool);
+ return svn_error_trace(err);
}
- else if (err)
- return err;
-
- if (command && command->terminate)
+ if (terminate)
break;
}
svn_pool_destroy(iterpool);
@@ -1524,9 +1633,9 @@ svn_ra_svn__write_cmd_target_rev(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( target-rev ( ", 15));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( target-rev ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1537,12 +1646,12 @@ svn_ra_svn__write_cmd_open_root(svn_ra_svn_conn_t *conn,
svn_revnum_t rev,
const char *token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( open-root ( ", 14));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( open-root ( "));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_cstring(conn, pool, token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1554,13 +1663,13 @@ svn_ra_svn__write_cmd_delete_entry(svn_ra_svn_conn_t *conn,
svn_revnum_t rev,
const char *token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( delete-entry ( ", 17));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( delete-entry ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_cstring(conn, pool, token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1574,10 +1683,10 @@ svn_ra_svn__write_cmd_add_dir(svn_ra_svn_conn_t *conn,
const char *copy_path,
svn_revnum_t copy_rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( add-dir ( ", 12));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( add-dir ( "));
SVN_ERR(write_cmd_add_node(conn, pool, path, parent_token, token,
copy_path, copy_rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1590,9 +1699,9 @@ svn_ra_svn__write_cmd_open_dir(svn_ra_svn_conn_t *conn,
const char *token,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( open-dir ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( open-dir ( "));
SVN_ERR(write_cmd_open_node(conn, pool, path, parent_token, token, rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1604,9 +1713,9 @@ svn_ra_svn__write_cmd_change_dir_prop(svn_ra_svn_conn_t *conn,
const char *name,
const svn_string_t *value)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( change-dir-prop ( ", 20));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( change-dir-prop ( "));
SVN_ERR(write_cmd_change_node_prop(conn, pool, token, name, value));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1616,9 +1725,9 @@ svn_ra_svn__write_cmd_close_dir(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( close-dir ( ", 14));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( close-dir ( "));
SVN_ERR(write_tuple_cstring(conn, pool, token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1629,9 +1738,9 @@ svn_ra_svn__write_cmd_absent_dir(svn_ra_svn_conn_t *conn,
const char *path,
const char *parent_token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( absent-dir ( ", 15));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( absent-dir ( "));
SVN_ERR(write_cmd_absent_node(conn, pool, path, parent_token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1645,10 +1754,10 @@ svn_ra_svn__write_cmd_add_file(svn_ra_svn_conn_t *conn,
const char *copy_path,
svn_revnum_t copy_rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( add-file ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( add-file ( "));
SVN_ERR(write_cmd_add_node(conn, pool, path, parent_token, token,
copy_path, copy_rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1661,9 +1770,9 @@ svn_ra_svn__write_cmd_open_file(svn_ra_svn_conn_t *conn,
const char *token,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( open-file ( ", 14));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( open-file ( "));
SVN_ERR(write_cmd_open_node(conn, pool, path, parent_token, token, rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1675,9 +1784,9 @@ svn_ra_svn__write_cmd_change_file_prop(svn_ra_svn_conn_t *conn,
const char *name,
const svn_string_t *value)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( change-file-prop ( ", 21));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( change-file-prop ( "));
SVN_ERR(write_cmd_change_node_prop(conn, pool, token, name, value));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1688,12 +1797,12 @@ svn_ra_svn__write_cmd_close_file(svn_ra_svn_conn_t *conn,
const char *token,
const char *text_checksum)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( close-file ( ", 15));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( close-file ( "));
SVN_ERR(write_tuple_cstring(conn, pool, token));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_cstring_opt(conn, pool, text_checksum));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1704,9 +1813,9 @@ svn_ra_svn__write_cmd_absent_file(svn_ra_svn_conn_t *conn,
const char *path,
const char *parent_token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( absent-file ( ", 16));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( absent-file ( "));
SVN_ERR(write_cmd_absent_node(conn, pool, path, parent_token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1717,10 +1826,10 @@ svn_ra_svn__write_cmd_textdelta_chunk(svn_ra_svn_conn_t *conn,
const char *token,
const svn_string_t *chunk)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( textdelta-chunk ( ", 20));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( textdelta-chunk ( "));
SVN_ERR(write_tuple_cstring(conn, pool, token));
SVN_ERR(write_tuple_string(conn, pool, chunk));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1730,9 +1839,9 @@ svn_ra_svn__write_cmd_textdelta_end(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *token)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( textdelta-end ( ", 18));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( textdelta-end ( "));
SVN_ERR(write_tuple_cstring(conn, pool, token));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1743,12 +1852,12 @@ svn_ra_svn__write_cmd_apply_textdelta(svn_ra_svn_conn_t *conn,
const char *token,
const char *base_checksum)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( apply-textdelta ( ", 20));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( apply-textdelta ( "));
SVN_ERR(write_tuple_cstring(conn, pool, token));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_cstring_opt(conn, pool, base_checksum));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1757,14 +1866,14 @@ svn_error_t *
svn_ra_svn__write_cmd_close_edit(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( close-edit ( ) ) ", 19);
+ return writebuf_write_literal(conn, pool, "( close-edit ( ) ) ");
}
svn_error_t *
svn_ra_svn__write_cmd_abort_edit(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( abort-edit ( ) ) ", 19);
+ return writebuf_write_literal(conn, pool, "( abort-edit ( ) ) ");
}
svn_error_t *
@@ -1776,7 +1885,7 @@ svn_ra_svn__write_cmd_set_path(svn_ra_svn_conn_t *conn,
const char *lock_token,
svn_depth_t depth)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( set-path ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( set-path ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_revision(conn, pool, rev));
SVN_ERR(write_tuple_boolean(conn, pool, start_empty));
@@ -1784,7 +1893,7 @@ svn_ra_svn__write_cmd_set_path(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_cstring_opt(conn, pool, lock_token));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_depth(conn, pool, depth));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1794,9 +1903,9 @@ svn_ra_svn__write_cmd_delete_path(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *path)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( delete-path ( ", 16));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( delete-path ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1811,7 +1920,7 @@ svn_ra_svn__write_cmd_link_path(svn_ra_svn_conn_t *conn,
const char *lock_token,
svn_depth_t depth)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( link-path ( ", 14));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( link-path ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_cstring(conn, pool, url));
SVN_ERR(write_tuple_revision(conn, pool, rev));
@@ -1820,7 +1929,7 @@ svn_ra_svn__write_cmd_link_path(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_cstring_opt(conn, pool,lock_token));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_depth(conn, pool, depth));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1829,14 +1938,14 @@ svn_error_t *
svn_ra_svn__write_cmd_finish_report(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( finish-report ( ) ) ", 22);
+ return writebuf_write_literal(conn, pool, "( finish-report ( ) ) ");
}
svn_error_t *
svn_ra_svn__write_cmd_abort_report(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( abort-report ( ) ) ", 21);
+ return writebuf_write_literal(conn, pool, "( abort-report ( ) ) ");
}
svn_error_t *
@@ -1844,9 +1953,9 @@ svn_ra_svn__write_cmd_reparent(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *url)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( reparent ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( reparent ( "));
SVN_ERR(write_tuple_cstring(conn, pool, url));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1855,7 +1964,7 @@ svn_error_t *
svn_ra_svn__write_cmd_get_latest_rev(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( get-latest-rev ( ) ) ", 23);
+ return writebuf_write_literal(conn, pool, "( get-latest-rev ( ) ) ");
}
svn_error_t *
@@ -1863,9 +1972,9 @@ svn_ra_svn__write_cmd_get_dated_rev(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
apr_time_t tm)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-dated-rev ( ", 18));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-dated-rev ( "));
SVN_ERR(write_tuple_cstring(conn, pool, svn_time_to_cstring(tm, pool)));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1879,7 +1988,7 @@ svn_ra_svn__write_cmd_change_rev_prop2(svn_ra_svn_conn_t *conn,
svn_boolean_t dont_care,
const svn_string_t *old_value)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( change-rev-prop2 ( ", 21));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( change-rev-prop2 ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
SVN_ERR(write_tuple_cstring(conn, pool, name));
SVN_ERR(write_tuple_start_list(conn, pool));
@@ -1889,7 +1998,7 @@ svn_ra_svn__write_cmd_change_rev_prop2(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_boolean(conn, pool, dont_care));
SVN_ERR(write_tuple_string_opt(conn, pool, old_value));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1901,11 +2010,11 @@ svn_ra_svn__write_cmd_change_rev_prop(svn_ra_svn_conn_t *conn,
const char *name,
const svn_string_t *value)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( change-rev-prop ( ", 20));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( change-rev-prop ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
SVN_ERR(write_tuple_cstring(conn, pool, name));
SVN_ERR(write_tuple_string_opt(conn, pool, value));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1915,9 +2024,9 @@ svn_ra_svn__write_cmd_rev_proplist(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( rev-proplist ( ", 17));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( rev-proplist ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1928,10 +2037,10 @@ svn_ra_svn__write_cmd_rev_prop(svn_ra_svn_conn_t *conn,
svn_revnum_t rev,
const char *name)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( rev-prop ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( rev-prop ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
SVN_ERR(write_tuple_cstring(conn, pool, name));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1944,14 +2053,18 @@ svn_ra_svn__write_cmd_get_file(svn_ra_svn_conn_t *conn,
svn_boolean_t props,
svn_boolean_t stream)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-file ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-file ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_boolean(conn, pool, props));
SVN_ERR(write_tuple_boolean(conn, pool, stream));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+
+ /* Always send the, nominally optional, want-iprops as "false" to
+ workaround a bug in svnserve 1.8.0-1.8.8 that causes the server
+ to see "true" if it is omitted. */
+ SVN_ERR(writebuf_write_literal(conn, pool, " false ) ) "));
return SVN_NO_ERROR;
}
@@ -1966,7 +2079,7 @@ svn_ra_svn__write_cmd_update(svn_ra_svn_conn_t *conn,
svn_boolean_t send_copyfrom_args,
svn_boolean_t ignore_ancestry)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( update ( ", 11));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( update ( "));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
@@ -1975,7 +2088,7 @@ svn_ra_svn__write_cmd_update(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_depth(conn, pool, depth));
SVN_ERR(write_tuple_boolean(conn, pool, send_copyfrom_args));
SVN_ERR(write_tuple_boolean(conn, pool, ignore_ancestry));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -1991,7 +2104,7 @@ svn_ra_svn__write_cmd_switch(svn_ra_svn_conn_t *conn,
svn_boolean_t send_copyfrom_args,
svn_boolean_t ignore_ancestry)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( switch ( ", 11));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( switch ( "));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
@@ -2001,7 +2114,7 @@ svn_ra_svn__write_cmd_switch(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_depth(conn, pool, depth));
SVN_ERR(write_tuple_boolean(conn, pool, send_copyfrom_args));
SVN_ERR(write_tuple_boolean(conn, pool, ignore_ancestry));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2014,14 +2127,14 @@ svn_ra_svn__write_cmd_status(svn_ra_svn_conn_t *conn,
svn_revnum_t rev,
svn_depth_t depth)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( status ( ", 11));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( status ( "));
SVN_ERR(write_tuple_cstring(conn, pool, target));
SVN_ERR(write_tuple_boolean(conn, pool, recurse));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_depth(conn, pool, depth));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2037,7 +2150,7 @@ svn_ra_svn__write_cmd_diff(svn_ra_svn_conn_t *conn,
svn_boolean_t text_deltas,
svn_depth_t depth)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( diff ( ", 9));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( diff ( "));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
@@ -2047,7 +2160,7 @@ svn_ra_svn__write_cmd_diff(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_cstring(conn, pool, versus_url));
SVN_ERR(write_tuple_boolean(conn, pool, text_deltas));
SVN_ERR(write_tuple_depth(conn, pool, depth));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2058,12 +2171,12 @@ svn_ra_svn__write_cmd_check_path(svn_ra_svn_conn_t *conn,
const char *path,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( check-path ( ", 15));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( check-path ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2074,12 +2187,12 @@ svn_ra_svn__write_cmd_stat(svn_ra_svn_conn_t *conn,
const char *path,
svn_revnum_t rev)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( stat ( ", 9));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( stat ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, rev));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2092,7 +2205,7 @@ svn_ra_svn__write_cmd_get_file_revs(svn_ra_svn_conn_t *conn,
svn_revnum_t end,
svn_boolean_t include_merged_revisions)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-file-revs ( ", 18));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-file-revs ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, start));
@@ -2101,7 +2214,7 @@ svn_ra_svn__write_cmd_get_file_revs(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_revision_opt(conn, pool, end));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_boolean(conn, pool, include_merged_revisions));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2114,7 +2227,7 @@ svn_ra_svn__write_cmd_lock(svn_ra_svn_conn_t *conn,
svn_boolean_t steal_lock,
svn_revnum_t revnum)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( lock ( ", 9));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( lock ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_cstring_opt(conn, pool, comment));
@@ -2123,7 +2236,7 @@ svn_ra_svn__write_cmd_lock(svn_ra_svn_conn_t *conn,
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, revnum));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2135,13 +2248,13 @@ svn_ra_svn__write_cmd_unlock(svn_ra_svn_conn_t *conn,
const char *token,
svn_boolean_t break_lock)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( unlock ( ", 11));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( unlock ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_cstring_opt(conn, pool, token));
SVN_ERR(write_tuple_end_list(conn, pool));
SVN_ERR(write_tuple_boolean(conn, pool, break_lock));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2151,9 +2264,9 @@ svn_ra_svn__write_cmd_get_lock(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *path)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-lock ( ", 13));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-lock ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2164,12 +2277,12 @@ svn_ra_svn__write_cmd_get_locks(svn_ra_svn_conn_t *conn,
const char *path,
svn_depth_t depth)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-locks ( ", 14));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-locks ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_depth(conn, pool, depth));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2181,11 +2294,11 @@ svn_ra_svn__write_cmd_replay(svn_ra_svn_conn_t *conn,
svn_revnum_t low_water_mark,
svn_boolean_t send_deltas)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( replay ( ", 11));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( replay ( "));
SVN_ERR(write_tuple_revision(conn, pool, rev));
SVN_ERR(write_tuple_revision(conn, pool, low_water_mark));
SVN_ERR(write_tuple_boolean(conn, pool, send_deltas));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2198,12 +2311,12 @@ svn_ra_svn__write_cmd_replay_range(svn_ra_svn_conn_t *conn,
svn_revnum_t low_water_mark,
svn_boolean_t send_deltas)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( replay-range ( ", 17));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( replay-range ( "));
SVN_ERR(write_tuple_revision(conn, pool, start_revision));
SVN_ERR(write_tuple_revision(conn, pool, end_revision));
SVN_ERR(write_tuple_revision(conn, pool, low_water_mark));
SVN_ERR(write_tuple_boolean(conn, pool, send_deltas));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2215,11 +2328,11 @@ svn_ra_svn__write_cmd_get_deleted_rev(svn_ra_svn_conn_t *conn,
svn_revnum_t peg_revision,
svn_revnum_t end_revision)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-deleted-rev ( ", 20));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-deleted-rev ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_revision(conn, pool, peg_revision));
SVN_ERR(write_tuple_revision(conn, pool, end_revision));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2230,12 +2343,12 @@ svn_ra_svn__write_cmd_get_iprops(svn_ra_svn_conn_t *conn,
const char *path,
svn_revnum_t revision)
{
- SVN_ERR(writebuf_write_short_string(conn, pool, "( get-iprops ( ", 15));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( get-iprops ( "));
SVN_ERR(write_tuple_cstring(conn, pool, path));
SVN_ERR(write_tuple_start_list(conn, pool));
SVN_ERR(write_tuple_revision_opt(conn, pool, revision));
SVN_ERR(write_tuple_end_list(conn, pool));
- SVN_ERR(writebuf_write_short_string(conn, pool, ") ) ", 4));
+ SVN_ERR(writebuf_write_literal(conn, pool, ") ) "));
return SVN_NO_ERROR;
}
@@ -2244,7 +2357,7 @@ svn_error_t *
svn_ra_svn__write_cmd_finish_replay(svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
- return writebuf_write_short_string(conn, pool, "( finish-replay ( ) ) ", 22);
+ return writebuf_write_literal(conn, pool, "( finish-replay ( ) ) ");
}
svn_error_t *svn_ra_svn__write_cmd_response(svn_ra_svn_conn_t *conn,
@@ -2254,7 +2367,7 @@ svn_error_t *svn_ra_svn__write_cmd_response(svn_ra_svn_conn_t *conn,
va_list ap;
svn_error_t *err;
- SVN_ERR(writebuf_write_short_string(conn, pool, "( success ", 10));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( success "));
va_start(ap, fmt);
err = vwrite_tuple(conn, pool, fmt, &ap);
va_end(ap);
@@ -2262,10 +2375,11 @@ svn_error_t *svn_ra_svn__write_cmd_response(svn_ra_svn_conn_t *conn,
}
svn_error_t *svn_ra_svn__write_cmd_failure(svn_ra_svn_conn_t *conn,
- apr_pool_t *pool, svn_error_t *err)
+ apr_pool_t *pool,
+ const svn_error_t *err)
{
char buffer[128];
- SVN_ERR(writebuf_write_short_string(conn, pool, "( failure ( ", 12));
+ SVN_ERR(writebuf_write_literal(conn, pool, "( failure ( "));
for (; err; err = err->child)
{
const char *msg;
@@ -2285,5 +2399,217 @@ svn_error_t *svn_ra_svn__write_cmd_failure(svn_ra_svn_conn_t *conn,
err->file ? err->file : "",
(apr_uint64_t) err->line));
}
- return writebuf_write_short_string(conn, pool, ") ) ", 4);
+ return writebuf_write_literal(conn, pool, ") ) ");
+}
+
+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)
+{
+ SVN_ERR(write_tuple_start_list(conn, pool));
+
+ SVN_ERR(write_tuple_cstring(conn, pool, path));
+ SVN_ERR(writebuf_writechar(conn, pool, action));
+ SVN_ERR(writebuf_writechar(conn, pool, ' '));
+ SVN_ERR(write_tuple_start_list(conn, pool));
+ SVN_ERR(write_tuple_cstring_opt(conn, pool, copyfrom_path));
+ SVN_ERR(write_tuple_revision_opt(conn, pool, copyfrom_rev));
+ SVN_ERR(write_tuple_end_list(conn, pool));
+ SVN_ERR(write_tuple_start_list(conn, pool));
+ SVN_ERR(write_tuple_cstring(conn, pool, svn_node_kind_to_word(node_kind)));
+ SVN_ERR(write_tuple_boolean(conn, pool, text_modified));
+ SVN_ERR(write_tuple_boolean(conn, pool, props_modified));
+
+ return writebuf_write_literal(conn, pool, ") ) ");
+}
+
+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)
+{
+ SVN_ERR(write_tuple_revision(conn, pool, revision));
+ SVN_ERR(write_tuple_start_list(conn, pool));
+ SVN_ERR(write_tuple_string_opt(conn, pool, author));
+ SVN_ERR(write_tuple_end_list(conn, pool));
+ SVN_ERR(write_tuple_start_list(conn, pool));
+ SVN_ERR(write_tuple_string_opt(conn, pool, date));
+ SVN_ERR(write_tuple_end_list(conn, pool));
+ SVN_ERR(write_tuple_start_list(conn, pool));
+ SVN_ERR(write_tuple_string_opt(conn, pool, message));
+ SVN_ERR(write_tuple_end_list(conn, pool));
+ SVN_ERR(write_tuple_boolean(conn, pool, has_children));
+ SVN_ERR(write_tuple_boolean(conn, pool, invalid_revnum));
+ SVN_ERR(svn_ra_svn__write_number(conn, pool, revprop_count));
+
+ return SVN_NO_ERROR;
+}
+
+/* If condition COND is not met, return a "malformed network data" error.
+ */
+#define CHECK_PROTOCOL_COND(cond)\
+ if (!(cond)) \
+ return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, \
+ _("Malformed network data"));
+
+/* In *RESULT, return the SVN-style string at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_string(const apr_array_header_t *items,
+ int idx,
+ svn_string_t **result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_STRING);
+ *result = elt->u.string;
+
+ return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the C-style string at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_cstring(const apr_array_header_t *items,
+ int idx,
+ const char **result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_STRING);
+ *result = elt->u.string->data;
+
+ return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the word at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_word(const apr_array_header_t *items,
+ int idx,
+ const char **result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_WORD);
+ *result = elt->u.word;
+
+ return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the revision at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_revision(const apr_array_header_t *items,
+ int idx,
+ svn_revnum_t *result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_NUMBER);
+ *result = (svn_revnum_t)elt->u.number;
+
+ return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the boolean at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_boolean(const apr_array_header_t *items,
+ int idx,
+ apr_uint64_t *result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_WORD);
+ if (elt->u.word[0] == 't' && strcmp(elt->u.word, "true") == 0)
+ *result = TRUE;
+ else if (strcmp(elt->u.word, "false") == 0)
+ *result = FALSE;
+ else
+ CHECK_PROTOCOL_COND(FALSE);
+
+ return SVN_NO_ERROR;
+}
+
+/* In *RESULT, return the tuple at index IDX in tuple ITEMS.
+ */
+static svn_error_t *
+svn_ra_svn__read_list(const apr_array_header_t *items,
+ int idx,
+ const apr_array_header_t **result)
+{
+ svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(items, idx, svn_ra_svn_item_t);
+ CHECK_PROTOCOL_COND(elt->kind == SVN_RA_SVN_LIST);
+
+ *result = elt->u.list;
+ return SVN_NO_ERROR;
+}
+
+/* Verify the tuple ITEMS contains at least MIN and at most MAX elements.
+ */
+static svn_error_t *
+svn_ra_svn__read_check_array_size(const apr_array_header_t *items,
+ int min,
+ int max)
+{
+ CHECK_PROTOCOL_COND(items->nelts >= min && items->nelts <= max);
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ const apr_array_header_t *sub_items;
+
+ /* initialize optional values */
+ *copy_path = NULL;
+ *copy_rev = SVN_INVALID_REVNUM;
+ *kind_str = NULL;
+ *text_mods = SVN_RA_SVN_UNSPECIFIED_NUMBER;
+ *prop_mods = SVN_RA_SVN_UNSPECIFIED_NUMBER;
+
+ /* top-level elements (mandatory) */
+ SVN_ERR(svn_ra_svn__read_check_array_size(items, 3, INT_MAX));
+ SVN_ERR(svn_ra_svn__read_string(items, 0, cpath));
+ SVN_ERR(svn_ra_svn__read_word(items, 1, action));
+
+ /* first sub-structure (mandatory) */
+ SVN_ERR(svn_ra_svn__read_list(items, 2, &sub_items));
+ if (sub_items->nelts)
+ {
+ SVN_ERR(svn_ra_svn__read_check_array_size(sub_items, 2, 2));
+ SVN_ERR(svn_ra_svn__read_cstring(sub_items, 0, copy_path));
+ SVN_ERR(svn_ra_svn__read_revision(sub_items, 1, copy_rev));
+ }
+
+ /* second sub-structure (optional) */
+ if (items->nelts >= 4)
+ {
+ SVN_ERR(svn_ra_svn__read_list(items, 3, &sub_items));
+ switch (MIN(3, sub_items->nelts))
+ {
+ case 3 : SVN_ERR(svn_ra_svn__read_boolean(sub_items, 2, prop_mods));
+ case 2 : SVN_ERR(svn_ra_svn__read_boolean(sub_items, 1, text_mods));
+ case 1 : SVN_ERR(svn_ra_svn__read_cstring(sub_items, 0, kind_str));
+ default: break;
+ }
+ }
+
+ return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_ra_svn/protocol b/subversion/libsvn_ra_svn/protocol
index 4d98b2b..dfc1f3d 100644
--- a/subversion/libsvn_ra_svn/protocol
+++ b/subversion/libsvn_ra_svn/protocol
@@ -303,18 +303,20 @@ second place for auth-request point as noted below.
get-file
params: ( path:string [ rev:number ] want-props:bool want-contents:bool
- [ want-iprops:bool ] )
+ ? want-iprops:bool )
response: ( [ checksum:string ] rev:number props:proplist
[ inherited-props:iproplist ] )
If want-contents is specified, then after sending response, server
sends file contents as a series of strings, terminated by the empty
string, followed by a second empty command response to indicate
whether an error occurred during the sending of the file.
- NOTE: the standard client never sends want-iprops, it uses get-iprops.
+ NOTE: the standard client doesn't send want-iprops as true, it uses
+ get-iprops, but does send want-iprops as false to workaround a server
+ bug in 1.8.0-1.8.8.
get-dir
params: ( path:string [ rev:number ] want-props:bool want-contents:bool
- ? ( field:dirent-field ... ) [ want-iprops:bool ] )
+ ? ( field:dirent-field ... ) ? want-iprops:bool )
response: ( rev:number props:proplist ( entry:dirent ... )
[ inherited-props:iproplist ] )]
dirent: ( name:string kind:node-kind size:number has-props:bool
@@ -322,7 +324,9 @@ second place for auth-request point as noted below.
[ last-author:string ] )
dirent-field: kind | size | has-props | created-rev | time | last-author
| word
- NOTE: the standard client never sends want-iprops, it uses get-iprops.
+ NOTE: the standard client doesn't send want-iprops as true, it uses
+ get-iprops, but does send want-iprops as false to workaround a server
+ bug in 1.8.0-1.8.8.
check-path
params: ( path:string [ rev:number ] )
@@ -339,7 +343,7 @@ second place for auth-request point as noted below.
get-mergeinfo
params: ( ( path:string ... ) [ rev:number ] inherit:word
- descendents:bool)
+ descendants:bool)
response: ( ( ( path:string merge-info:string ) ... ) )
New in svn 1.5. If no paths are specified, an empty response is
returned. If rev is not specified, the youngest revision is used.
@@ -597,7 +601,13 @@ desirability:
* The protocol version may be bumped. Clients and servers can then
choose to any range of protocol versions.
-4.1. Extending existing commands
+4.1. Limitations
+
+The current implementation limits the length of a word to 31 characters.
+Longer words, such as capability names, will be cause an error on the
+receiver side.
+
+4.2. Extending existing commands
Extending an existing command is normally done by indicating that its
tuple is allowed to end where it currently ends, for backwards
diff --git a/subversion/libsvn_ra_svn/ra_svn.h b/subversion/libsvn_ra_svn/ra_svn.h
index dc70eb7..d9fe1b2 100644
--- a/subversion/libsvn_ra_svn/ra_svn.h
+++ b/subversion/libsvn_ra_svn/ra_svn.h
@@ -123,13 +123,16 @@ struct svn_ra_svn__session_baton_t {
apr_pool_t *pool;
svn_ra_svn_conn_t *conn;
svn_boolean_t is_tunneled;
+ svn_auth_baton_t *auth_baton;
const char *url;
const char *user;
const char *hostname; /* The remote hostname. */
const char *realm_prefix;
+ const char *tunnel_name;
const char **tunnel_argv;
const svn_ra_callbacks2_t *callbacks;
void *callbacks_baton;
+ apr_hash_t *config;
apr_off_t bytes_read, bytes_written; /* apr_off_t's because that's what
the callback interface uses */
const char *useragent;
@@ -145,8 +148,8 @@ void svn_ra_svn__set_block_handler(svn_ra_svn_conn_t *conn,
void *baton);
/* Return true if there is input waiting on conn. */
-svn_boolean_t svn_ra_svn__input_waiting(svn_ra_svn_conn_t *conn,
- apr_pool_t *pool);
+svn_error_t *svn_ra_svn__data_available(svn_ra_svn_conn_t *conn,
+ svn_boolean_t *data_available);
/* CRAM-MD5 client implementation. */
svn_error_t *svn_ra_svn__cram_client(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
@@ -169,20 +172,20 @@ svn_error_t *svn_ra_svn__handle_failure_status(const apr_array_header_t *params,
svn_ra_svn__stream_t *svn_ra_svn__stream_from_sock(apr_socket_t *sock,
apr_pool_t *pool);
-/* Returns a stream that reads from IN_FILE and writes to OUT_FILE. */
-svn_ra_svn__stream_t *svn_ra_svn__stream_from_files(apr_file_t *in_file,
- apr_file_t *out_file,
- apr_pool_t *pool);
+/* Returns a stream that reads from IN_STREAM and writes to OUT_STREAM,
+ creating a timeout callback for OUT_STREAM if possible */
+svn_ra_svn__stream_t *svn_ra_svn__stream_from_streams(svn_stream_t *in_stream,
+ svn_stream_t *out_stream,
+ apr_pool_t *pool);
/* Create an svn_ra_svn__stream_t using READ_CB, WRITE_CB, TIMEOUT_CB,
* PENDING_CB, and BATON.
*/
-svn_ra_svn__stream_t *svn_ra_svn__stream_create(void *baton,
- svn_read_fn_t read_cb,
- svn_write_fn_t write_cb,
+svn_ra_svn__stream_t *svn_ra_svn__stream_create(svn_stream_t *in_stream,
+ svn_stream_t *out_stream,
+ void *timeout_baton,
ra_svn_timeout_fn_t timeout_cb,
- ra_svn_pending_fn_t pending_cb,
- apr_pool_t *pool);
+ apr_pool_t *result_pool);
/* Write *LEN bytes from DATA to STREAM, returning the number of bytes
* written in *LEN.
@@ -208,7 +211,9 @@ void svn_ra_svn__stream_timeout(svn_ra_svn__stream_t *stream,
apr_interval_time_t interval);
/* Return whether or not there is data pending on STREAM. */
-svn_boolean_t svn_ra_svn__stream_pending(svn_ra_svn__stream_t *stream);
+svn_error_t *
+svn_ra_svn__stream_data_available(svn_ra_svn__stream_t *stream,
+ svn_boolean_t *data_available);
/* Respond to an auth request and perform authentication. Use the Cyrus
* SASL library for mechanism negotiation and for creating authentication
diff --git a/subversion/libsvn_ra_svn/streams.c b/subversion/libsvn_ra_svn/streams.c
index 4ae93d5..3ad792b 100644
--- a/subversion/libsvn_ra_svn/streams.c
+++ b/subversion/libsvn_ra_svn/streams.c
@@ -33,12 +33,14 @@
#include "svn_io.h"
#include "svn_private_config.h"
+#include "private/svn_io_private.h"
+
#include "ra_svn.h"
struct svn_ra_svn__stream_st {
- svn_stream_t *stream;
- void *baton;
- ra_svn_pending_fn_t pending_fn;
+ svn_stream_t *in_stream;
+ svn_stream_t *out_stream;
+ void *timeout_baton;
ra_svn_timeout_fn_t timeout_fn;
};
@@ -47,11 +49,6 @@ typedef struct sock_baton_t {
apr_pool_t *pool;
} sock_baton_t;
-typedef struct file_baton_t {
- apr_file_t *in_file;
- apr_file_t *out_file;
- apr_pool_t *pool;
-} file_baton_t;
/* Returns TRUE if PFD has pending data, FALSE otherwise. */
static svn_boolean_t pending(apr_pollfd_t *pfd, apr_pool_t *pool)
@@ -67,65 +64,34 @@ static svn_boolean_t pending(apr_pollfd_t *pfd, apr_pool_t *pool)
/* Functions to implement a file backed svn_ra_svn__stream_t. */
-/* Implements svn_read_fn_t */
-static svn_error_t *
-file_read_cb(void *baton, char *buffer, apr_size_t *len)
-{
- file_baton_t *b = baton;
- apr_status_t status = apr_file_read(b->in_file, buffer, len);
-
- if (status && !APR_STATUS_IS_EOF(status))
- return svn_error_wrap_apr(status, _("Can't read from connection"));
- if (*len == 0)
- return svn_error_create(SVN_ERR_RA_SVN_CONNECTION_CLOSED, NULL, NULL);
- return SVN_NO_ERROR;
-}
-
-/* Implements svn_write_fn_t */
-static svn_error_t *
-file_write_cb(void *baton, const char *buffer, apr_size_t *len)
-{
- file_baton_t *b = baton;
- apr_status_t status = apr_file_write(b->out_file, buffer, len);
- if (status)
- return svn_error_wrap_apr(status, _("Can't write to connection"));
- return SVN_NO_ERROR;
-}
-
/* Implements ra_svn_timeout_fn_t */
static void
file_timeout_cb(void *baton, apr_interval_time_t interval)
{
- file_baton_t *b = baton;
- apr_file_pipe_timeout_set(b->out_file, interval);
-}
-
-/* Implements ra_svn_pending_fn_t */
-static svn_boolean_t
-file_pending_cb(void *baton)
-{
- file_baton_t *b = baton;
- apr_pollfd_t pfd;
-
- pfd.desc_type = APR_POLL_FILE;
- pfd.desc.f = b->in_file;
+ apr_file_t *f = baton;
- return pending(&pfd, b->pool);
+ if (f)
+ apr_file_pipe_timeout_set(f, interval);
}
svn_ra_svn__stream_t *
-svn_ra_svn__stream_from_files(apr_file_t *in_file,
- apr_file_t *out_file,
- apr_pool_t *pool)
+svn_ra_svn__stream_from_streams(svn_stream_t *in_stream,
+ svn_stream_t *out_stream,
+ apr_pool_t *pool)
{
- file_baton_t *b = apr_palloc(pool, sizeof(*b));
+ apr_file_t *file;
+
+ /* If out_stream is backed by an apr_file (e.g. an PIPE) we
+ provide a working callback, otherwise the callback ignores
+ the timeout.
- b->in_file = in_file;
- b->out_file = out_file;
- b->pool = pool;
+ The callback is used to make the write non-blocking on
+ some error scenarios. ### This (legacy) usage
+ breaks the stream promise */
+ file = svn_stream__aprfile(out_stream);
- return svn_ra_svn__stream_create(b, file_read_cb, file_write_cb,
- file_timeout_cb, file_pending_cb,
+ return svn_ra_svn__stream_create(in_stream, out_stream,
+ file, file_timeout_cb,
pool);
}
@@ -155,8 +121,6 @@ sock_read_cb(void *baton, char *buffer, apr_size_t *len)
if (status && !APR_STATUS_IS_EOF(status))
return svn_error_wrap_apr(status, _("Can't read from connection"));
- if (*len == 0)
- return svn_error_create(SVN_ERR_RA_SVN_CONNECTION_CLOSED, NULL, NULL);
return SVN_NO_ERROR;
}
@@ -179,9 +143,10 @@ sock_timeout_cb(void *baton, apr_interval_time_t interval)
apr_socket_timeout_set(b->sock, interval);
}
-/* Implements ra_svn_pending_fn_t */
-static svn_boolean_t
-sock_pending_cb(void *baton)
+/* Implements svn_stream_data_available_fn_t */
+static svn_error_t *
+sock_pending_cb(void *baton,
+ svn_boolean_t *data_available)
{
sock_baton_t *b = baton;
apr_pollfd_t pfd;
@@ -189,41 +154,45 @@ sock_pending_cb(void *baton)
pfd.desc_type = APR_POLL_SOCKET;
pfd.desc.s = b->sock;
- return pending(&pfd, b->pool);
+ *data_available = pending(&pfd, b->pool);
+
+ svn_pool_clear(b->pool);
+
+ return SVN_NO_ERROR;
}
svn_ra_svn__stream_t *
svn_ra_svn__stream_from_sock(apr_socket_t *sock,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
- sock_baton_t *b = apr_palloc(pool, sizeof(*b));
+ sock_baton_t *b = apr_palloc(result_pool, sizeof(*b));
+ svn_stream_t *sock_stream;
b->sock = sock;
- b->pool = pool;
+ b->pool = svn_pool_create(result_pool);
- return svn_ra_svn__stream_create(b, sock_read_cb, sock_write_cb,
- sock_timeout_cb, sock_pending_cb,
- pool);
+ sock_stream = svn_stream_create(b, result_pool);
+
+ svn_stream_set_read2(sock_stream, sock_read_cb, NULL /* use default */);
+ svn_stream_set_write(sock_stream, sock_write_cb);
+ svn_stream_set_data_available(sock_stream, sock_pending_cb);
+
+ return svn_ra_svn__stream_create(sock_stream, sock_stream,
+ b, sock_timeout_cb, result_pool);
}
svn_ra_svn__stream_t *
-svn_ra_svn__stream_create(void *baton,
- svn_read_fn_t read_cb,
- svn_write_fn_t write_cb,
+svn_ra_svn__stream_create(svn_stream_t *in_stream,
+ svn_stream_t *out_stream,
+ void *timeout_baton,
ra_svn_timeout_fn_t timeout_cb,
- ra_svn_pending_fn_t pending_cb,
apr_pool_t *pool)
{
svn_ra_svn__stream_t *s = apr_palloc(pool, sizeof(*s));
- s->stream = svn_stream_empty(pool);
- svn_stream_set_baton(s->stream, baton);
- if (read_cb)
- svn_stream_set_read(s->stream, read_cb);
- if (write_cb)
- svn_stream_set_write(s->stream, write_cb);
- s->baton = baton;
+ s->in_stream = in_stream;
+ s->out_stream = out_stream;
+ s->timeout_baton = timeout_baton;
s->timeout_fn = timeout_cb;
- s->pending_fn = pending_cb;
return s;
}
@@ -231,25 +200,33 @@ svn_error_t *
svn_ra_svn__stream_write(svn_ra_svn__stream_t *stream,
const char *data, apr_size_t *len)
{
- return svn_stream_write(stream->stream, data, len);
+ return svn_error_trace(svn_stream_write(stream->out_stream, data, len));
}
svn_error_t *
svn_ra_svn__stream_read(svn_ra_svn__stream_t *stream, char *data,
apr_size_t *len)
{
- return svn_stream_read(stream->stream, data, len);
+ SVN_ERR(svn_stream_read2(stream->in_stream, data, len));
+
+ if (*len == 0)
+ return svn_error_create(SVN_ERR_RA_SVN_CONNECTION_CLOSED, NULL, NULL);
+
+ return SVN_NO_ERROR;
}
void
svn_ra_svn__stream_timeout(svn_ra_svn__stream_t *stream,
apr_interval_time_t interval)
{
- stream->timeout_fn(stream->baton, interval);
+ stream->timeout_fn(stream->timeout_baton, interval);
}
-svn_boolean_t
-svn_ra_svn__stream_pending(svn_ra_svn__stream_t *stream)
+svn_error_t *
+svn_ra_svn__stream_data_available(svn_ra_svn__stream_t *stream,
+ svn_boolean_t *data_available)
{
- return stream->pending_fn(stream->baton);
+ return svn_error_trace(
+ svn_stream_data_available(stream->in_stream,
+ data_available));
}
diff --git a/subversion/libsvn_repos/authz.c b/subversion/libsvn_repos/authz.c
index af4a1f2..20f9231 100644
--- a/subversion/libsvn_repos/authz.c
+++ b/subversion/libsvn_repos/authz.c
@@ -35,6 +35,7 @@
#include "svn_config.h"
#include "svn_ctype.h"
#include "private/svn_fspath.h"
+#include "private/svn_repos_private.h"
#include "repos.h"
@@ -76,8 +77,8 @@ struct authz_validate_baton {
enumerator, if any. */
};
-/* Currently this structure is just a wrapper around a
- svn_config_t. */
+/* Currently this structure is just a wrapper around a svn_config_t.
+ Please update authz_pool if you modify this structure. */
struct svn_authz_t
{
svn_config_t *cfg;
@@ -351,7 +352,7 @@ authz_get_path_access(svn_config_t *cfg, const char *repos_name,
baton.user = user;
/* Try to locate a repository-specific block first. */
- qualified_path = apr_pstrcat(pool, repos_name, ":", path, (char *)NULL);
+ qualified_path = apr_pstrcat(pool, repos_name, ":", path, SVN_VA_NULL);
svn_config_enumerate2(cfg, qualified_path,
authz_parse_line, &baton, pool);
@@ -394,7 +395,7 @@ authz_get_tree_access(svn_config_t *cfg, const char *repos_name,
baton.required_access = required_access;
baton.repos_path = path;
baton.qualified_repos_path = apr_pstrcat(pool, repos_name,
- ":", path, (char *)NULL);
+ ":", path, SVN_VA_NULL);
/* Default to access granted if no rules say otherwise. */
baton.access = TRUE;
@@ -453,7 +454,7 @@ authz_get_any_access(svn_config_t *cfg, const char *repos_name,
baton.access = FALSE; /* Deny access by default. */
baton.repos_path = "/";
baton.qualified_repos_path = apr_pstrcat(pool, repos_name,
- ":/", (char *)NULL);
+ ":/", SVN_VA_NULL);
/* We could have used svn_config_enumerate2 for "repos_name:/".
* However, this requires access for root explicitly (which the user
@@ -748,9 +749,8 @@ static svn_boolean_t authz_validate_section(const char *name,
}
-/* Walk the configuration in AUTHZ looking for any errors. */
-static svn_error_t *
-authz_validate(svn_authz_t *authz, apr_pool_t *pool)
+svn_error_t *
+svn_repos__authz_validate(svn_authz_t *authz, apr_pool_t *pool)
{
struct authz_validate_baton baton = { 0 };
@@ -771,13 +771,17 @@ authz_validate(svn_authz_t *authz, apr_pool_t *pool)
*
* If DIRENT 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.
+ * authz file is also an error. The CASE_SENSITIVE controls the lookup
+ * behavior for section and option names alike.
*
* SCRATCH_POOL will be used for temporary allocations. */
static svn_error_t *
-authz_retrieve_config_repo(svn_config_t **cfg_p, const char *dirent,
- svn_boolean_t must_exist,
- apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+authz_retrieve_config_repo(svn_config_t **cfg_p,
+ const char *dirent,
+ svn_boolean_t must_exist,
+ svn_boolean_t case_sensitive,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_error_t *err;
svn_repos_t *repos;
@@ -796,7 +800,8 @@ authz_retrieve_config_repo(svn_config_t **cfg_p, const char *dirent,
"Unable to find repository at '%s'", dirent);
/* Attempt to open a repository at repos_root_dirent. */
- SVN_ERR(svn_repos_open2(&repos, repos_root_dirent, NULL, scratch_pool));
+ SVN_ERR(svn_repos_open3(&repos, repos_root_dirent, NULL, scratch_pool,
+ scratch_pool));
fs_path = &dirent[strlen(repos_root_dirent)];
@@ -824,7 +829,8 @@ authz_retrieve_config_repo(svn_config_t **cfg_p, const char *dirent,
{
if (!must_exist)
{
- SVN_ERR(svn_config_create2(cfg_p, TRUE, TRUE, result_pool));
+ SVN_ERR(svn_config_create2(cfg_p, case_sensitive, case_sensitive,
+ result_pool));
return SVN_NO_ERROR;
}
else
@@ -842,7 +848,8 @@ authz_retrieve_config_repo(svn_config_t **cfg_p, const char *dirent,
}
SVN_ERR(svn_fs_file_contents(&contents, root, fs_path, scratch_pool));
- err = svn_config_parse(cfg_p, contents, TRUE, TRUE, result_pool);
+ err = svn_config_parse(cfg_p, contents, case_sensitive, case_sensitive,
+ result_pool);
/* Add the URL to the error stack since the parser doesn't have it. */
if (err != SVN_NO_ERROR)
@@ -853,23 +860,12 @@ authz_retrieve_config_repo(svn_config_t **cfg_p, const char *dirent,
return SVN_NO_ERROR;
}
-/* 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.
- *
- * 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. */
-static svn_error_t *
-authz_retrieve_config(svn_config_t **cfg_p, const char *path,
- svn_boolean_t must_exist, apr_pool_t *pool)
+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)
{
if (svn_path_is_url(path))
{
@@ -880,8 +876,8 @@ authz_retrieve_config(svn_config_t **cfg_p, const char *path,
err = svn_uri_get_dirent_from_file_url(&dirent, path, scratch_pool);
if (err == SVN_NO_ERROR)
- err = authz_retrieve_config_repo(cfg_p, dirent, must_exist, pool,
- scratch_pool);
+ err = authz_retrieve_config_repo(cfg_p, dirent, must_exist,
+ case_sensitive, pool, scratch_pool);
/* Close the repos and streams we opened. */
svn_pool_destroy(scratch_pool);
@@ -891,7 +887,8 @@ authz_retrieve_config(svn_config_t **cfg_p, const char *path,
else
{
/* Outside of repo file or Windows registry*/
- SVN_ERR(svn_config_read3(cfg_p, path, must_exist, TRUE, TRUE, pool));
+ SVN_ERR(svn_config_read3(cfg_p, path, must_exist, case_sensitive,
+ case_sensitive, pool));
}
return SVN_NO_ERROR;
@@ -942,9 +939,11 @@ svn_repos__authz_read(svn_authz_t **authz_p, const char *path,
/* Load the authz file */
if (accept_urls)
- SVN_ERR(authz_retrieve_config(&authz->cfg, path, must_exist, pool));
+ SVN_ERR(svn_repos__retrieve_config(&authz->cfg, path, must_exist, TRUE,
+ pool));
else
- SVN_ERR(svn_config_read3(&authz->cfg, path, must_exist, TRUE, TRUE, pool));
+ SVN_ERR(svn_config_read3(&authz->cfg, path, must_exist, TRUE, TRUE,
+ pool));
if (groups_path)
{
@@ -953,8 +952,8 @@ svn_repos__authz_read(svn_authz_t **authz_p, const char *path,
/* Load the groups file */
if (accept_urls)
- SVN_ERR(authz_retrieve_config(&groups_cfg, groups_path, must_exist,
- pool));
+ SVN_ERR(svn_repos__retrieve_config(&groups_cfg, groups_path,
+ must_exist, TRUE, pool));
else
SVN_ERR(svn_config_read3(&groups_cfg, groups_path, must_exist,
TRUE, TRUE, pool));
@@ -971,7 +970,7 @@ svn_repos__authz_read(svn_authz_t **authz_p, const char *path,
}
/* Make sure there are no errors in the configuration. */
- SVN_ERR(authz_validate(authz, pool));
+ SVN_ERR(svn_repos__authz_validate(authz, pool));
*authz_p = authz;
return SVN_NO_ERROR;
@@ -1011,7 +1010,7 @@ svn_repos_authz_parse(svn_authz_t **authz_p, svn_stream_t *stream,
}
/* Make sure there are no errors in the configuration. */
- SVN_ERR(authz_validate(authz, pool));
+ SVN_ERR(svn_repos__authz_validate(authz, pool));
*authz_p = authz;
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_repos/authz_pool.c b/subversion/libsvn_repos/authz_pool.c
new file mode 100644
index 0000000..f8ac528
--- /dev/null
+++ b/subversion/libsvn_repos/authz_pool.c
@@ -0,0 +1,226 @@
+/*
+ * authz_pool.c : pool of authorization objects
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include "svn_checksum.h"
+#include "svn_config.h"
+#include "svn_error.h"
+#include "svn_pools.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_mutex.h"
+#include "private/svn_object_pool.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_repos_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+
+#include "repos.h"
+
+/* Currently this structure is just a wrapper around a svn_config_t.
+ */
+struct svn_authz_t
+{
+ svn_config_t *cfg;
+};
+
+/* The wrapper object structure that we store in the object pool. It
+ * combines the authz with the underlying config structures and their
+ * identifying keys.
+ */
+typedef struct authz_object_t
+{
+ /* key = concatenation of AUTHZ_KEY and GROUPS_KEY */
+ svn_membuf_t *key;
+
+ /* keys used to identify AUTHZ_CFG and GROUPS_CFG */
+ svn_membuf_t *authz_key;
+ svn_membuf_t *groups_key;
+
+ /* r/o references to configurations from the configuration pool.
+ GROUPS_CFG may be NULL. */
+ svn_config_t *authz_cfg;
+ svn_config_t *groups_cfg;
+
+ /* Case-sensitive config. */
+ svn_authz_t *authz;
+} authz_object_t;
+
+/* Root data structure simply adding the config_pool to the basic object pool.
+ */
+struct svn_repos__authz_pool_t
+{
+ /* authz_object_t object storage */
+ svn_object_pool__t *object_pool;
+
+ /* factory and storage of (shared) configuration objects */
+ svn_repos__config_pool_t *config_pool;
+};
+
+/* Return a combination of AUTHZ_KEY and GROUPS_KEY, allocated in POOL.
+ * GROUPS_KEY may be NULL.
+ */
+static svn_membuf_t *
+construct_key(svn_membuf_t *authz_key,
+ svn_membuf_t *groups_key,
+ apr_pool_t *pool)
+{
+ svn_membuf_t *result = apr_pcalloc(pool, sizeof(*result));
+ apr_size_t size;
+ if (groups_key)
+ {
+ size = authz_key->size + groups_key->size;
+ svn_membuf__create(result,size, pool);
+ memcpy(result->data, authz_key->data, authz_key->size);
+ memcpy((char *)result->data + authz_key->size,
+ groups_key->data, groups_key->size);
+ }
+ else
+ {
+ size = authz_key->size;
+ svn_membuf__create(result, size, pool);
+ memcpy(result->data, authz_key->data, authz_key->size);
+ }
+
+ result->size = size;
+ return result;
+}
+
+/* Implement svn_object_pool__getter_t on authz_object_t structures.
+ */
+static void *
+getter(void *object,
+ void *baton,
+ apr_pool_t *pool)
+{
+ return ((authz_object_t *)object)->authz;
+}
+
+/* API implementation */
+
+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)
+{
+ svn_repos__authz_pool_t *result;
+ svn_object_pool__t *object_pool;
+
+ /* there is no setter as we don't need to update existing authz */
+ SVN_ERR(svn_object_pool__create(&object_pool, getter, NULL, thread_safe,
+ pool));
+
+ result = apr_pcalloc(pool, sizeof(*result));
+ result->object_pool = object_pool;
+ result->config_pool = config_pool;
+
+ *authz_pool = result;
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ apr_pool_t *authz_ref_pool
+ = svn_object_pool__new_wrapper_pool(authz_pool->object_pool);
+ authz_object_t *authz_ref
+ = apr_pcalloc(authz_ref_pool, sizeof(*authz_ref));
+ svn_boolean_t have_all_keys;
+
+ /* read the configurations */
+ SVN_ERR(svn_repos__config_pool_get(&authz_ref->authz_cfg,
+ &authz_ref->authz_key,
+ authz_pool->config_pool,
+ path, must_exist, TRUE,
+ preferred_repos, authz_ref_pool));
+ have_all_keys = authz_ref->authz_key != NULL;
+
+ if (groups_path)
+ {
+ SVN_ERR(svn_repos__config_pool_get(&authz_ref->groups_cfg,
+ &authz_ref->groups_key,
+ authz_pool->config_pool,
+ groups_path, must_exist, TRUE,
+ preferred_repos, authz_ref_pool));
+ have_all_keys &= authz_ref->groups_key != NULL;
+ }
+
+ /* fall back to standard implementation in case we don't have all the
+ * facts (i.e. keys). */
+ if (!have_all_keys)
+ return svn_error_trace(svn_repos_authz_read2(authz_p, path, groups_path,
+ must_exist, pool));
+
+ /* all keys are known and lookup is unambigious. */
+ authz_ref->key = construct_key(authz_ref->authz_key,
+ authz_ref->groups_key,
+ authz_ref_pool);
+
+ SVN_ERR(svn_object_pool__lookup((void **)authz_p, authz_pool->object_pool,
+ authz_ref->key, NULL, pool));
+ if (*authz_p)
+ {
+ svn_pool_destroy(authz_ref_pool);
+ return SVN_NO_ERROR;
+ }
+
+ authz_ref->authz = apr_palloc(authz_ref_pool, sizeof(*authz_ref->authz));
+ authz_ref->authz->cfg = authz_ref->authz_cfg;
+
+ if (groups_path)
+ {
+ /* Easy out: we prohibit local groups in the authz file when global
+ groups are being used. */
+ if (svn_config_has_section(authz_ref->authz->cfg,
+ SVN_CONFIG_SECTION_GROUPS))
+ return svn_error_createf(SVN_ERR_AUTHZ_INVALID_CONFIG, NULL,
+ "Error reading authz file '%s' with "
+ "groups file '%s':"
+ "Authz file cannot contain any groups "
+ "when global groups are being used.",
+ path, groups_path);
+
+ /* We simply need to add the [Groups] section to the authz config.
+ */
+ svn_config__shallow_replace_section(authz_ref->authz->cfg,
+ authz_ref->groups_cfg,
+ SVN_CONFIG_SECTION_GROUPS);
+ }
+
+ /* Make sure there are no errors in the configuration. */
+ SVN_ERR(svn_repos__authz_validate(authz_ref->authz, authz_ref_pool));
+
+ SVN_ERR(svn_object_pool__insert((void **)authz_p, authz_pool->object_pool,
+ authz_ref->key, authz_ref, NULL,
+ authz_ref_pool, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_repos/commit.c b/subversion/libsvn_repos/commit.c
index 22cf873..1190acc 100644
--- a/subversion/libsvn_repos/commit.c
+++ b/subversion/libsvn_repos/commit.c
@@ -73,7 +73,7 @@ struct edit_baton
svn_repos_t *repos;
/* URL to the root of the open repository. */
- const char *repos_url;
+ const char *repos_url_decoded;
/* The name of the repository (here for convenience). */
const char *repos_name;
@@ -201,6 +201,7 @@ invoke_commit_cb(svn_commit_callback2_t commit_cb,
commit_info->date = date ? date->data : NULL;
commit_info->author = author ? author->data : NULL;
commit_info->post_commit_err = post_commit_errstr;
+ /* commit_info->repos_root is not set by the repos layer, only by RA layers */
return svn_error_trace(commit_cb(commit_info, commit_baton, scratch_pool));
}
@@ -262,7 +263,9 @@ make_dir_baton(struct edit_baton *edit_baton,
/* This function is the shared guts of add_file() and add_directory(),
which see for the meanings of the parameters. The only extra
parameter here is IS_DIR, which is TRUE when adding a directory,
- and FALSE when adding a file. */
+ and FALSE when adding a file.
+
+ COPY_PATH must be a full URL, not a relative path. */
static svn_error_t *
add_file_or_directory(const char *path,
void *parent_baton,
@@ -317,8 +320,8 @@ add_file_or_directory(const char *path,
/* For now, require that the url come from the same repository
that this commit is operating on. */
copy_path = svn_path_uri_decode(copy_path, subpool);
- repos_url_len = strlen(eb->repos_url);
- if (strncmp(copy_path, eb->repos_url, repos_url_len) != 0)
+ repos_url_len = strlen(eb->repos_url_decoded);
+ if (strncmp(copy_path, eb->repos_url_decoded, repos_url_len) != 0)
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL,
_("Source url '%s' is from different repository"), copy_path);
@@ -394,6 +397,11 @@ open_root(void *edit_baton,
dateness checks. */
SVN_ERR(svn_fs_youngest_rev(&youngest, eb->fs, eb->pool));
+ if (base_revision > youngest)
+ return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ _("No such revision %ld (HEAD is %ld)"),
+ base_revision, youngest);
+
/* Unless we've been instructed to use a specific transaction, we'll
make our own. */
if (eb->txn_owner)
@@ -939,7 +947,7 @@ 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,
@@ -953,6 +961,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor,
struct edit_baton *eb;
svn_delta_shim_callbacks_t *shim_callbacks =
svn_delta_shim_callbacks_default(pool);
+ const char *repos_url = svn_path_uri_encode(repos_url_decoded, pool);
/* Do a global authz access lookup. Users with no write access
whatsoever to the repository don't get a commit editor. */
@@ -994,7 +1003,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor,
eb->authz_baton = authz_baton;
eb->base_path = svn_fspath__canonicalize(base_path, subpool);
eb->repos = repos;
- eb->repos_url = repos_url;
+ eb->repos_url_decoded = repos_url_decoded;
eb->repos_name = svn_dirent_basename(svn_repos_path(repos, subpool),
subpool);
eb->fs = svn_repos_fs(repos);
@@ -1010,7 +1019,7 @@ svn_repos_get_commit_editor5(const svn_delta_editor_t **editor,
shim_callbacks->fetch_baton = eb;
SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton,
- eb->repos_url, eb->base_path,
+ repos_url, eb->base_path,
shim_callbacks, pool, pool));
return SVN_NO_ERROR;
@@ -1031,7 +1040,7 @@ ev2_check_authz(const struct ev2_baton *eb,
return SVN_NO_ERROR;
if (relpath)
- fspath = apr_pstrcat(scratch_pool, "/", relpath, NULL);
+ fspath = apr_pstrcat(scratch_pool, "/", relpath, SVN_VA_NULL);
else
fspath = NULL;
@@ -1138,15 +1147,15 @@ static svn_error_t *
alter_file_cb(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)
{
struct ev2_baton *eb = baton;
- SVN_ERR(svn_editor_alter_file(eb->inner, relpath, revision, props,
- checksum, contents));
+ SVN_ERR(svn_editor_alter_file(eb->inner, relpath, revision,
+ checksum, contents, props));
return SVN_NO_ERROR;
}
@@ -1156,14 +1165,14 @@ static svn_error_t *
alter_symlink_cb(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)
{
struct ev2_baton *eb = baton;
- SVN_ERR(svn_editor_alter_symlink(eb->inner, relpath, revision, props,
- target));
+ SVN_ERR(svn_editor_alter_symlink(eb->inner, relpath, revision,
+ target, props));
return SVN_NO_ERROR;
}
@@ -1216,20 +1225,6 @@ move_cb(void *baton,
}
-/* This implements svn_editor_cb_rotate_t */
-static svn_error_t *
-rotate_cb(void *baton,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions,
- apr_pool_t *scratch_pool)
-{
- struct ev2_baton *eb = baton;
-
- SVN_ERR(svn_editor_rotate(eb->inner, relpaths, revisions));
- return SVN_NO_ERROR;
-}
-
-
/* This implements svn_editor_cb_complete_t */
static svn_error_t *
complete_cb(void *baton,
@@ -1351,7 +1346,6 @@ svn_repos__get_commit_ev2(svn_editor_t **editor,
delete_cb,
copy_cb,
move_cb,
- rotate_cb,
complete_cb,
abort_cb
};
diff --git a/subversion/libsvn_repos/config_pool.c b/subversion/libsvn_repos/config_pool.c
new file mode 100644
index 0000000..164bd98
--- /dev/null
+++ b/subversion/libsvn_repos/config_pool.c
@@ -0,0 +1,531 @@
+/*
+ * config_pool.c : pool of configuration objects
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+
+#include "svn_checksum.h"
+#include "svn_config.h"
+#include "svn_error.h"
+#include "svn_hash.h"
+#include "svn_path.h"
+#include "svn_pools.h"
+#include "svn_repos.h"
+
+#include "private/svn_dep_compat.h"
+#include "private/svn_mutex.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_repos_private.h"
+#include "private/svn_object_pool.h"
+
+#include "svn_private_config.h"
+
+
+/* Our wrapper structure for parsed svn_config_t* instances. All data in
+ * CS_CFG and CI_CFG is expanded (to make it thread-safe) and considered
+ * read-only.
+ */
+typedef struct config_object_t
+{
+ /* UUID of the configuration contents.
+ * This is a SHA1 checksum of the parsed textual representation of CFG. */
+ svn_checksum_t *key;
+
+ /* Parsed and expanded configuration. At least one of the following
+ * must not be NULL. */
+
+ /* Case-sensitive config. May be NULL */
+ svn_config_t *cs_cfg;
+
+ /* Case-insensitive config. May be NULL */
+ svn_config_t *ci_cfg;
+} config_object_t;
+
+
+/* Data structure used to short-circuit the repository access for configs
+ * read via URL. After reading such a config successfully, we store key
+ * repository information here and will validate it without actually opening
+ * the repository.
+ *
+ * As this is only an optimization and may create many entries in
+ * svn_repos__config_pool_t's IN_REPO_HASH_POOL index, we clean them up
+ * once in a while.
+ */
+typedef struct in_repo_config_t
+{
+ /* URL used to open the configuration */
+ const char *url;
+
+ /* Path of the repository that contained URL */
+ const char *repo_root;
+
+ /* Head revision of that repository when last read */
+ svn_revnum_t revision;
+
+ /* Contents checksum of the file stored under URL@REVISION */
+ svn_checksum_t *key;
+} in_repo_config_t;
+
+
+/* Core data structure extending the encapsulated OBJECT_POOL. All access
+ * to it must be serialized using the OBJECT_POOL->MUTEX.
+ *
+ * To speed up URL@HEAD lookups, we maintain IN_REPO_CONFIGS as a secondary
+ * hash index. It maps URLs as provided by the caller onto in_repo_config_t
+ * instances. If that is still up-to-date, a further lookup into CONFIG
+ * may yield the desired configuration without the need to actually open
+ * the respective repository.
+ *
+ * Unused configurations that are kept in the IN_REPO_CONFIGS hash and may
+ * be cleaned up when the hash is about to grow.
+ */
+struct svn_repos__config_pool_t
+{
+ svn_object_pool__t *object_pool;
+
+ /* URL -> in_repo_config_t* mapping.
+ * This is only a partial index and will get cleared regularly. */
+ apr_hash_t *in_repo_configs;
+
+ /* allocate the IN_REPO_CONFIGS index and in_repo_config_t here */
+ apr_pool_t *in_repo_hash_pool;
+};
+
+
+/* Return an automatic reference to the CFG member in CONFIG that will be
+ * released when POOL gets cleaned up. The case sensitivity flag in *BATON
+ * selects the desired option and section name matching mode.
+ */
+static void *
+getter(void *object,
+ void *baton,
+ apr_pool_t *pool)
+{
+ config_object_t *wrapper = object;
+ svn_boolean_t *case_sensitive = baton;
+ svn_config_t *config = *case_sensitive ? wrapper->cs_cfg : wrapper->ci_cfg;
+
+ /* we need to duplicate the root structure as it contains temp. buffers */
+ return config ? svn_config__shallow_copy(config, pool) : NULL;
+}
+
+/* Return a memory buffer structure allocated in POOL and containing the
+ * data from CHECKSUM.
+ */
+static svn_membuf_t *
+checksum_as_key(svn_checksum_t *checksum,
+ apr_pool_t *pool)
+{
+ svn_membuf_t *result = apr_pcalloc(pool, sizeof(*result));
+ apr_size_t size = svn_checksum_size(checksum);
+
+ svn_membuf__create(result, size, pool);
+ result->size = size; /* exact length is required! */
+ memcpy(result->data, checksum->digest, size);
+
+ return result;
+}
+
+/* Copy the configuration from the wrapper in SOURCE to the wrapper in
+ * *TARGET with the case sensitivity flag in *BATON selecting the config
+ * to copy. This is usually done to add the missing case-(in)-sensitive
+ * variant. Since we must hold all data in *TARGET from the same POOL,
+ * a deep copy is required.
+ */
+static svn_error_t *
+setter(void **target,
+ void *source,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_boolean_t *case_sensitive = baton;
+ config_object_t *target_cfg = *(config_object_t **)target;
+ config_object_t *source_cfg = source;
+
+ /* Maybe, we created a variant with different case sensitivity? */
+ if (*case_sensitive && target_cfg->cs_cfg == NULL)
+ {
+ SVN_ERR(svn_config_dup(&target_cfg->cs_cfg, source_cfg->cs_cfg, pool));
+ svn_config__set_read_only(target_cfg->cs_cfg, pool);
+ }
+ else if (!*case_sensitive && target_cfg->ci_cfg == NULL)
+ {
+ SVN_ERR(svn_config_dup(&target_cfg->ci_cfg, source_cfg->ci_cfg, pool));
+ svn_config__set_read_only(target_cfg->ci_cfg, pool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set *CFG to the configuration passed in as text in CONTENTS and *KEY to
+ * the corresponding object pool key. If no such configuration exists in
+ * CONFIG_POOL, yet, parse CONTENTS and cache the result. CASE_SENSITIVE
+ * controls option and section name matching.
+ *
+ * RESULT_POOL determines the lifetime of the returned reference and
+ * SCRATCH_POOL is being used for temporary allocations.
+ */
+static svn_error_t *
+auto_parse(svn_config_t **cfg,
+ svn_membuf_t **key,
+ svn_repos__config_pool_t *config_pool,
+ svn_stringbuf_t *contents,
+ svn_boolean_t case_sensitive,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_checksum_t *checksum;
+ config_object_t *config_object;
+ apr_pool_t *cfg_pool;
+
+ /* calculate SHA1 over the whole file contents */
+ SVN_ERR(svn_stream_close
+ (svn_stream_checksummed2
+ (svn_stream_from_stringbuf(contents, scratch_pool),
+ &checksum, NULL, svn_checksum_sha1, TRUE, scratch_pool)));
+
+ /* return reference to suitable config object if that already exists */
+ *key = checksum_as_key(checksum, result_pool);
+ SVN_ERR(svn_object_pool__lookup((void **)cfg, config_pool->object_pool,
+ *key, &case_sensitive, result_pool));
+ if (*cfg)
+ return SVN_NO_ERROR;
+
+ /* create a pool for the new config object and parse the data into it */
+ cfg_pool = svn_object_pool__new_wrapper_pool(config_pool->object_pool);
+
+ config_object = apr_pcalloc(cfg_pool, sizeof(*config_object));
+
+ SVN_ERR(svn_config_parse(case_sensitive ? &config_object->cs_cfg
+ : &config_object->ci_cfg,
+ svn_stream_from_stringbuf(contents, scratch_pool),
+ case_sensitive, case_sensitive, cfg_pool));
+
+ /* switch config data to r/o mode to guarantee thread-safe access */
+ svn_config__set_read_only(case_sensitive ? config_object->cs_cfg
+ : config_object->ci_cfg,
+ cfg_pool);
+
+ /* add config in pool, handle loads races and return the right config */
+ SVN_ERR(svn_object_pool__insert((void **)cfg, config_pool->object_pool,
+ *key, config_object, &case_sensitive,
+ cfg_pool, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Store a URL@REVISION to CHECKSUM, REPOS_ROOT in CONFIG_POOL.
+ */
+static svn_error_t *
+add_checksum(svn_repos__config_pool_t *config_pool,
+ const char *url,
+ const char *repos_root,
+ svn_revnum_t revision,
+ svn_checksum_t *checksum)
+{
+ apr_size_t path_len = strlen(url);
+ apr_pool_t *pool = config_pool->in_repo_hash_pool;
+ in_repo_config_t *config = apr_hash_get(config_pool->in_repo_configs,
+ url, path_len);
+ if (config)
+ {
+ /* update the existing entry */
+ memcpy((void *)config->key->digest, checksum->digest,
+ svn_checksum_size(checksum));
+ config->revision = revision;
+
+ /* duplicate the string only if necessary */
+ if (strcmp(config->repo_root, repos_root))
+ config->repo_root = apr_pstrdup(pool, repos_root);
+ }
+ else
+ {
+ /* insert a new entry.
+ * Limit memory consumption by cyclically clearing pool and hash. */
+ if (2 * svn_object_pool__count(config_pool->object_pool)
+ < apr_hash_count(config_pool->in_repo_configs))
+ {
+ svn_pool_clear(pool);
+ config_pool->in_repo_configs = svn_hash__make(pool);
+ }
+
+ /* construct the new entry */
+ config = apr_pcalloc(pool, sizeof(*config));
+ config->key = svn_checksum_dup(checksum, pool);
+ config->url = apr_pstrmemdup(pool, url, path_len);
+ config->repo_root = apr_pstrdup(pool, repos_root);
+ config->revision = revision;
+
+ /* add to index */
+ apr_hash_set(config_pool->in_repo_configs, url, path_len, config);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Set *CFG to the configuration stored in URL@HEAD and cache it in
+ * CONFIG_POOL. CASE_SENSITIVE controls
+ * option and section name matching. If PREFERRED_REPOS is given,
+ * use that if it also matches URL.
+ *
+ * RESULT_POOL determines the lifetime of the returned reference and
+ * SCRATCH_POOL is being used for temporary allocations.
+ */
+static svn_error_t *
+find_repos_config(svn_config_t **cfg,
+ svn_membuf_t **key,
+ svn_repos__config_pool_t *config_pool,
+ const char *url,
+ svn_boolean_t case_sensitive,
+ svn_repos_t *preferred_repos,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_repos_t *repos = NULL;
+ svn_fs_t *fs;
+ svn_fs_root_t *root;
+ svn_revnum_t youngest_rev;
+ svn_node_kind_t node_kind;
+ const char *dirent;
+ svn_stream_t *stream;
+ const char *fs_path;
+ const char *repos_root_dirent;
+ svn_checksum_t *checksum;
+ svn_stringbuf_t *contents;
+
+ *cfg = NULL;
+ SVN_ERR(svn_uri_get_dirent_from_file_url(&dirent, url, scratch_pool));
+
+ /* maybe we can use the preferred repos instance instead of creating a
+ * new one */
+ if (preferred_repos)
+ {
+ repos_root_dirent = svn_repos_path(preferred_repos, scratch_pool);
+ if (!svn_dirent_is_absolute(repos_root_dirent))
+ SVN_ERR(svn_dirent_get_absolute(&repos_root_dirent,
+ repos_root_dirent,
+ scratch_pool));
+
+ if (svn_dirent_is_ancestor(repos_root_dirent, dirent))
+ repos = preferred_repos;
+ }
+
+ /* open repos if no suitable preferred repos was provided. */
+ if (!repos)
+ {
+ /* Search for a repository in the full path. */
+ repos_root_dirent = svn_repos_find_root_path(dirent, scratch_pool);
+
+ /* Attempt to open a repository at repos_root_dirent. */
+ SVN_ERR(svn_repos_open3(&repos, repos_root_dirent, NULL,
+ scratch_pool, scratch_pool));
+ }
+
+ fs_path = &dirent[strlen(repos_root_dirent)];
+
+ /* Get the filesystem. */
+ fs = svn_repos_fs(repos);
+
+ /* Find HEAD and the revision root */
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, scratch_pool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, youngest_rev, scratch_pool));
+
+ /* Fetch checksum and see whether we already have a matching config */
+ SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1, root, fs_path,
+ FALSE, scratch_pool));
+ if (checksum)
+ {
+ *key = checksum_as_key(checksum, scratch_pool);
+ SVN_ERR(svn_object_pool__lookup((void **)cfg, config_pool->object_pool,
+ *key, &case_sensitive, result_pool));
+ }
+
+ /* not parsed, yet? */
+ if (!*cfg)
+ {
+ svn_filesize_t length;
+
+ /* fetch the file contents */
+ SVN_ERR(svn_fs_check_path(&node_kind, root, fs_path, scratch_pool));
+ if (node_kind != svn_node_file)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_file_length(&length, root, fs_path, scratch_pool));
+ SVN_ERR(svn_fs_file_contents(&stream, root, fs_path, scratch_pool));
+ SVN_ERR(svn_stringbuf_from_stream(&contents, stream,
+ (apr_size_t)length, scratch_pool));
+
+ /* handle it like ordinary file contents and cache it */
+ SVN_ERR(auto_parse(cfg, key, config_pool, contents, case_sensitive,
+ result_pool, scratch_pool));
+ }
+
+ /* store the (path,rev) -> checksum mapping as well */
+ if (*cfg && checksum)
+ SVN_MUTEX__WITH_LOCK(svn_object_pool__mutex(config_pool->object_pool),
+ add_checksum(config_pool, url, repos_root_dirent,
+ youngest_rev, checksum));
+
+ return SVN_NO_ERROR;
+}
+
+/* Given the URL, search the CONFIG_POOL for an entry that maps it URL to
+ * a content checksum and is still up-to-date. If this could be found,
+ * return the object's *KEY. Use POOL for allocations.
+ *
+ * Requires external serialization on CONFIG_POOL.
+ *
+ * Note that this is only the URL(+rev) -> Checksum lookup and does not
+ * guarantee that there is actually a config object available for *KEY.
+ */
+static svn_error_t *
+key_by_url(svn_membuf_t **key,
+ svn_repos__config_pool_t *config_pool,
+ const char *url,
+ apr_pool_t *pool)
+{
+ svn_error_t *err;
+ svn_stringbuf_t *contents;
+ apr_int64_t current;
+
+ /* hash lookup url -> sha1 -> config */
+ in_repo_config_t *config = svn_hash_gets(config_pool->in_repo_configs, url);
+ *key = NULL;
+ if (!config)
+ return SVN_NO_ERROR;
+
+ /* found *some* reference to a configuration.
+ * Verify that it is still current. Will fail for BDB repos. */
+ err = svn_stringbuf_from_file2(&contents,
+ svn_dirent_join(config->repo_root,
+ "db/current", pool),
+ pool);
+ if (!err)
+ err = svn_cstring_atoi64(&current, contents->data);
+
+ if (err)
+ svn_error_clear(err);
+ else if (current == config->revision)
+ *key = checksum_as_key(config->key, pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* API implementation */
+
+svn_error_t *
+svn_repos__config_pool_create(svn_repos__config_pool_t **config_pool,
+ svn_boolean_t thread_safe,
+ apr_pool_t *pool)
+{
+ svn_repos__config_pool_t *result;
+ svn_object_pool__t *object_pool;
+
+ SVN_ERR(svn_object_pool__create(&object_pool, getter, setter,
+ thread_safe, pool));
+
+ /* construct the config pool in our private ROOT_POOL to survive POOL
+ * cleanup and to prevent threading issues with the allocator */
+ result = apr_pcalloc(pool, sizeof(*result));
+
+ result->object_pool = object_pool;
+ result->in_repo_hash_pool = svn_pool_create(pool);
+ result->in_repo_configs = svn_hash__make(result->in_repo_hash_pool);
+
+ *config_pool = result;
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ svn_error_t *err = SVN_NO_ERROR;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+
+ /* make sure we always have a *KEY object */
+ svn_membuf_t *local_key = NULL;
+ if (key == NULL)
+ key = &local_key;
+ else
+ *key = NULL;
+
+ if (svn_path_is_url(path))
+ {
+ /* Read config file from repository.
+ * Attempt a quick lookup first. */
+ SVN_MUTEX__WITH_LOCK(svn_object_pool__mutex(config_pool->object_pool),
+ key_by_url(key, config_pool, path, pool));
+ if (*key)
+ {
+ SVN_ERR(svn_object_pool__lookup((void **)cfg,
+ config_pool->object_pool,
+ *key, &case_sensitive, pool));
+ if (*cfg)
+ {
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Read and cache the configuration. This may fail. */
+ err = find_repos_config(cfg, key, config_pool, path, case_sensitive,
+ preferred_repos, pool, scratch_pool);
+ if (err || !*cfg)
+ {
+ /* let the standard implementation handle all the difficult cases */
+ svn_error_clear(err);
+ err = svn_repos__retrieve_config(cfg, path, must_exist,
+ case_sensitive, pool);
+ }
+ }
+ else
+ {
+ /* Outside of repo file. Read it. */
+ svn_stringbuf_t *contents;
+ err = svn_stringbuf_from_file2(&contents, path, scratch_pool);
+ if (err)
+ {
+ /* let the standard implementation handle all the difficult cases */
+ svn_error_clear(err);
+ err = svn_config_read3(cfg, path, must_exist, case_sensitive,
+ case_sensitive, pool);
+ }
+ else
+ {
+ /* parsing and caching will always succeed */
+ err = auto_parse(cfg, key, config_pool, contents, case_sensitive,
+ pool, scratch_pool);
+ }
+ }
+
+ svn_pool_destroy(scratch_pool);
+
+ return err;
+}
diff --git a/subversion/libsvn_repos/delta.c b/subversion/libsvn_repos/delta.c
index 51cfda7..3e28c70 100644
--- a/subversion/libsvn_repos/delta.c
+++ b/subversion/libsvn_repos/delta.c
@@ -196,17 +196,6 @@ authz_root_check(svn_fs_root_t *root,
}
-static svn_error_t *
-not_a_dir_error(const char *role,
- const char *path)
-{
- return svn_error_createf
- (SVN_ERR_FS_NOT_DIRECTORY, 0,
- "Invalid %s directory '%s'",
- role, path ? path : "(null)");
-}
-
-
/* Public interface to computing directory deltas. */
svn_error_t *
svn_repos_dir_delta2(svn_fs_root_t *src_root,
@@ -227,17 +216,17 @@ svn_repos_dir_delta2(svn_fs_root_t *src_root,
void *root_baton = NULL;
struct context c;
const char *src_fullpath;
- const svn_fs_id_t *src_id, *tgt_id;
svn_node_kind_t src_kind, tgt_kind;
svn_revnum_t rootrev;
- int distance;
+ svn_fs_node_relation_t relation;
const char *authz_root_path;
/* SRC_PARENT_DIR must be valid. */
if (src_parent_dir)
src_parent_dir = svn_relpath_canonicalize(src_parent_dir, pool);
else
- return not_a_dir_error("source parent", src_parent_dir);
+ return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, 0,
+ "Invalid source parent directory '(null)'");
/* TGT_FULLPATH must be valid. */
if (tgt_fullpath)
@@ -329,11 +318,10 @@ svn_repos_dir_delta2(svn_fs_root_t *src_root,
}
/* Get and compare the node IDs for the source and target. */
- SVN_ERR(svn_fs_node_id(&tgt_id, tgt_root, tgt_fullpath, pool));
- SVN_ERR(svn_fs_node_id(&src_id, src_root, src_fullpath, pool));
- distance = svn_fs_compare_ids(src_id, tgt_id);
+ SVN_ERR(svn_fs_node_relation(&relation, tgt_root, tgt_fullpath,
+ src_root, src_fullpath, pool));
- if (distance == 0)
+ if (relation == svn_fs_node_unchanged)
{
/* They are the same node! No-op (you gotta love those). */
goto cleanup;
@@ -344,7 +332,7 @@ svn_repos_dir_delta2(svn_fs_root_t *src_root,
add the other. Also, if they are completely unrelated and
our caller is interested in relatedness, we do the same thing. */
if ((src_kind != tgt_kind)
- || ((distance == -1) && (! ignore_ancestry)))
+ || ((relation == svn_fs_node_unrelated) && (! ignore_ancestry)))
{
SVN_ERR(authz_root_check(tgt_root, authz_root_path,
authz_read_func, authz_read_baton, pool));
@@ -535,8 +523,8 @@ delta_proplists(struct context *c,
svn_boolean_t changed;
/* Is this deltification worth our time? */
- SVN_ERR(svn_fs_props_changed(&changed, c->target_root, target_path,
- c->source_root, source_path, subpool));
+ SVN_ERR(svn_fs_props_different(&changed, c->target_root, target_path,
+ c->source_root, source_path, subpool));
if (! changed)
goto cleanup;
@@ -616,62 +604,8 @@ svn_repos__compare_files(svn_boolean_t *changed_p,
const char *path2,
apr_pool_t *pool)
{
- svn_filesize_t size1, size2;
- svn_checksum_t *checksum1, *checksum2;
- svn_stream_t *stream1, *stream2;
- svn_boolean_t same;
-
- /* If the filesystem claims the things haven't changed, then they
- haven't changed. */
- SVN_ERR(svn_fs_contents_changed(changed_p, root1, path1,
- root2, path2, pool));
- if (!*changed_p)
- return SVN_NO_ERROR;
-
- /* If the SHA1 checksums match for these things, we'll claim they
- have the same contents. (We don't give quite as much weight to
- MD5 checksums.) */
- SVN_ERR(svn_fs_file_checksum(&checksum1, svn_checksum_sha1,
- root1, path1, FALSE, pool));
- SVN_ERR(svn_fs_file_checksum(&checksum2, svn_checksum_sha1,
- root2, path2, FALSE, pool));
- if (checksum1 && checksum2)
- {
- *changed_p = !svn_checksum_match(checksum1, checksum2);
- return SVN_NO_ERROR;
- }
-
- /* From this point on, our default answer is "Nothing's changed". */
- *changed_p = FALSE;
-
- /* Different filesizes means the contents are different. */
- SVN_ERR(svn_fs_file_length(&size1, root1, path1, pool));
- SVN_ERR(svn_fs_file_length(&size2, root2, path2, pool));
- if (size1 != size2)
- {
- *changed_p = TRUE;
- return SVN_NO_ERROR;
- }
-
- /* Different MD5 checksums means the contents are different. */
- SVN_ERR(svn_fs_file_checksum(&checksum1, svn_checksum_md5, root1, path1,
- FALSE, pool));
- SVN_ERR(svn_fs_file_checksum(&checksum2, svn_checksum_md5, root2, path2,
- FALSE, pool));
- if (! svn_checksum_match(checksum1, checksum2))
- {
- *changed_p = TRUE;
- return SVN_NO_ERROR;
- }
-
- /* And finally, different contents means the ... uh ... contents are
- different. */
- SVN_ERR(svn_fs_file_contents(&stream1, root1, path1, pool));
- SVN_ERR(svn_fs_file_contents(&stream2, root2, path2, pool));
- SVN_ERR(svn_stream_contents_same2(&same, stream1, stream2, pool));
- *changed_p = !same;
-
- return SVN_NO_ERROR;
+ return svn_error_trace(svn_fs_contents_different(changed_p, root1, path1,
+ root2, path2, pool));
}
@@ -698,19 +632,7 @@ delta_files(struct context *c,
if (source_path)
{
- /* Is this delta calculation worth our time? If we are ignoring
- ancestry, then our editor implementor isn't concerned by the
- theoretical differences between "has contents which have not
- changed with respect to" and "has the same actual contents
- as". We'll do everything we can to avoid transmitting even
- an empty text-delta in that case. */
- if (c->ignore_ancestry)
- SVN_ERR(svn_repos__compare_files(&changed,
- c->target_root, target_path,
- c->source_root, source_path,
- subpool));
- else
- SVN_ERR(svn_fs_contents_changed(&changed,
+ SVN_ERR(svn_fs_contents_different(&changed,
c->target_root, target_path,
c->source_root, source_path,
subpool));
@@ -953,10 +875,10 @@ delta_dirs(struct context *c,
from the target tree. */
for (hi = apr_hash_first(pool, t_entries); hi; hi = apr_hash_next(hi))
{
- const svn_fs_dirent_t *s_entry, *t_entry;
- const void *key;
- void *val;
- apr_ssize_t klen;
+ const void *key = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ const svn_fs_dirent_t *t_entry = apr_hash_this_val(hi);
+ const svn_fs_dirent_t *s_entry;
const char *t_fullpath;
const char *e_fullpath;
const char *s_fullpath;
@@ -965,9 +887,6 @@ delta_dirs(struct context *c,
/* Clear out our subpool for the next iteration... */
svn_pool_clear(subpool);
- /* KEY is the entry name in target, VAL the dirent */
- apr_hash_this(hi, &key, &klen, &val);
- t_entry = val;
tgt_kind = t_entry->kind;
t_fullpath = svn_relpath_join(target_path, t_entry->name, subpool);
e_fullpath = svn_relpath_join(edit_path, t_entry->name, subpool);
@@ -1042,17 +961,13 @@ delta_dirs(struct context *c,
{
for (hi = apr_hash_first(pool, s_entries); hi; hi = apr_hash_next(hi))
{
- const svn_fs_dirent_t *s_entry;
- void *val;
+ const svn_fs_dirent_t *s_entry = apr_hash_this_val(hi);
const char *e_fullpath;
svn_node_kind_t src_kind;
/* Clear out our subpool for the next iteration... */
svn_pool_clear(subpool);
- /* KEY is the entry name in source, VAL the dirent */
- apr_hash_this(hi, NULL, NULL, &val);
- s_entry = val;
src_kind = s_entry->kind;
e_fullpath = svn_relpath_join(edit_path, s_entry->name, subpool);
diff --git a/subversion/libsvn_repos/deprecated.c b/subversion/libsvn_repos/deprecated.c
index 7208ba6..fe9d1d2 100644
--- a/subversion/libsvn_repos/deprecated.c
+++ b/subversion/libsvn_repos/deprecated.c
@@ -138,6 +138,15 @@ svn_repos_get_commit_editor(const svn_delta_editor_t **editor,
}
svn_error_t *
+svn_repos_open2(svn_repos_t **repos_p,
+ const char *path,
+ apr_hash_t *fs_config,
+ apr_pool_t *pool)
+{
+ return svn_repos_open3(repos_p, path, fs_config, pool, pool);
+}
+
+svn_error_t *
svn_repos_open(svn_repos_t **repos_p,
const char *path,
apr_pool_t *pool)
@@ -217,6 +226,30 @@ svn_repos_upgrade(const char *path,
return svn_repos_upgrade2(path, nonblocking, recovery_started, &rb, pool);
}
+svn_error_t *
+svn_repos_hotcopy2(const char *src_path,
+ const char *dst_path,
+ svn_boolean_t clean_logs,
+ svn_boolean_t incremental,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_repos_hotcopy3(src_path, dst_path, clean_logs,
+ incremental, NULL, NULL,
+ cancel_func, cancel_baton, pool));
+}
+
+svn_error_t *
+svn_repos_hotcopy(const char *src_path,
+ const char *dst_path,
+ svn_boolean_t clean_logs,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_repos_hotcopy2(src_path, dst_path, clean_logs,
+ FALSE, NULL, NULL, pool));
+}
+
/*** From reporter.c ***/
svn_error_t *
svn_repos_begin_report(void **report_baton,
@@ -727,6 +760,29 @@ svn_repos_dump_fs2(svn_repos_t *repos,
}
svn_error_t *
+svn_repos_verify_fs2(svn_repos_t *repos,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_repos_verify_fs3(repos,
+ start_rev,
+ end_rev,
+ FALSE,
+ FALSE,
+ notify_func,
+ notify_baton,
+ NULL, NULL,
+ cancel_func,
+ cancel_baton,
+ pool));
+}
+
+svn_error_t *
svn_repos_verify_fs(svn_repos_t *repos,
svn_stream_t *feedback_stream,
svn_revnum_t start_rev,
@@ -750,6 +806,30 @@ svn_repos_verify_fs(svn_repos_t *repos,
/*** From load.c ***/
svn_error_t *
+svn_repos_load_fs4(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_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ return svn_repos_load_fs5(repos, dumpstream, start_rev, end_rev,
+ uuid_action, parent_dir,
+ use_post_commit_hook, use_post_commit_hook,
+ validate_props, FALSE,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton, pool);
+}
+
+svn_error_t *
svn_repos_load_fs3(svn_repos_t *repos,
svn_stream_t *dumpstream,
enum svn_repos_load_uuid uuid_action,
@@ -917,6 +997,35 @@ svn_repos_load_fs(svn_repos_t *repos,
}
svn_error_t *
+svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks,
+ 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_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_repos_get_fs_build_parser5(callbacks, parse_baton,
+ repos,
+ start_rev, end_rev,
+ use_history,
+ validate_props,
+ uuid_action,
+ parent_dir,
+ FALSE, FALSE, /*hooks */
+ FALSE /*ignore_dates*/,
+ notify_func,
+ notify_baton,
+ pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_repos_get_fs_build_parser3(const svn_repos_parse_fns2_t **callbacks,
void **parse_baton,
svn_repos_t *repos,
diff --git a/subversion/libsvn_repos/dump.c b/subversion/libsvn_repos/dump.c
index a64b180..189d724 100644
--- a/subversion/libsvn_repos/dump.c
+++ b/subversion/libsvn_repos/dump.c
@@ -21,6 +21,8 @@
*/
+#include <stdarg.h>
+
#include "svn_private_config.h"
#include "svn_pools.h"
#include "svn_error.h"
@@ -36,14 +38,281 @@
#include "svn_props.h"
#include "svn_sorts.h"
+#include "private/svn_repos_private.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_fs_private.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_utf_private.h"
+#include "private/svn_cache.h"
#define ARE_VALID_COPY_ARGS(p,r) ((p) && SVN_IS_VALID_REVNUM(r))
/*----------------------------------------------------------------------*/
+/* To be able to check whether a path exists in the current revision
+ (as changes come in), we need to track the relevant tree changes.
+
+ In particular, we remember deletions, additions and copies including
+ their copy-from info. Since the dump performs a pre-order tree walk,
+ we only need to store the data for the stack of parent folders.
+
+ The problem that we are trying to solve is that the dump receives
+ transforming operations whose validity depends on previous operations
+ in the same revision but cannot be checked against the final state
+ as stored in the repository as that is the state *after* we applied
+ the respective tree changes.
+
+ Note that the tracker functions don't perform any sanity or validity
+ checks. Those higher-level tests have to be done in the calling code.
+ However, there is no way to corrupt the data structure using the
+ provided functions.
+ */
+
+/* Single entry in the path tracker. Not all levels along the path
+ hierarchy do need to have an instance of this struct but only those
+ that got changed by a tree modification.
+
+ Please note that the path info in this struct is stored in re-usable
+ stringbuf objects such that we don't need to allocate more memory than
+ the longest path we encounter.
+ */
+typedef struct path_tracker_entry_t
+{
+ /* path in the current tree */
+ svn_stringbuf_t *path;
+
+ /* copy-from path (must be empty if COPYFROM_REV is SVN_INVALID_REVNUM) */
+ svn_stringbuf_t *copyfrom_path;
+
+ /* copy-from revision (SVN_INVALID_REVNUM for additions / replacements
+ that don't copy history, i.e. with no sub-tree) */
+ svn_revnum_t copyfrom_rev;
+
+ /* if FALSE, PATH has been deleted */
+ svn_boolean_t exists;
+} path_tracker_entry_t;
+
+/* Tracks all tree modifications above the current path.
+ */
+typedef struct path_tracker_t
+{
+ /* Container for all relevant tree changes in depth order.
+ May contain more entries than DEPTH to allow for reusing memory.
+ Only entries 0 .. DEPTH-1 are valid.
+ */
+ apr_array_header_t *stack;
+
+ /* Number of relevant entries in STACK. May be 0 */
+ int depth;
+
+ /* Revision that we current track. If DEPTH is 0, paths are exist in
+ REVISION exactly when they exist in REVISION-1. This applies only
+ to the current state of our tree walk.
+ */
+ svn_revnum_t revision;
+
+ /* Allocate container entries here. */
+ apr_pool_t *pool;
+} path_tracker_t;
+
+/* Return a new path tracker object for REVISION, allocated in POOL.
+ */
+static path_tracker_t *
+tracker_create(svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ path_tracker_t *result = apr_pcalloc(pool, sizeof(*result));
+ result->stack = apr_array_make(pool, 16, sizeof(path_tracker_entry_t));
+ result->revision = revision;
+ result->pool = pool;
+
+ return result;
+}
+
+/* Remove all entries from TRACKER that are not relevant to PATH anymore.
+ * If ALLOW_EXACT_MATCH is FALSE, keep only entries that pertain to
+ * parent folders but not to PATH itself.
+ *
+ * This internal function implicitly updates the tracker state during the
+ * tree by removing "past" entries. Other functions will add entries when
+ * we encounter a new tree change.
+ */
+static void
+tracker_trim(path_tracker_t *tracker,
+ const char *path,
+ svn_boolean_t allow_exact_match)
+{
+ /* remove everything that is unrelated to PATH.
+ Note that TRACKER->STACK is depth-ordered,
+ i.e. stack[N] is a (maybe indirect) parent of stack[N+1]
+ for N+1 < DEPTH.
+ */
+ for (; tracker->depth; --tracker->depth)
+ {
+ path_tracker_entry_t *parent = &APR_ARRAY_IDX(tracker->stack,
+ tracker->depth - 1,
+ path_tracker_entry_t);
+ const char *rel_path
+ = svn_dirent_skip_ancestor(parent->path->data, path);
+
+ /* always keep parents. Keep exact matches when allowed. */
+ if (rel_path && (allow_exact_match || *rel_path != '\0'))
+ break;
+ }
+}
+
+/* Using TRACKER, check what path at what revision in the repository must
+ be checked to decide that whether PATH exists. Return the info in
+ *ORIG_PATH and *ORIG_REV, respectively.
+
+ If the path is known to not exist, *ORIG_PATH will be NULL and *ORIG_REV
+ will be SVN_INVALID_REVNUM. If *ORIG_REV is SVN_INVALID_REVNUM, PATH
+ has just been added in the revision currently being tracked.
+
+ Use POOL for allocations. Note that *ORIG_PATH may be allocated in POOL,
+ a reference to internal data with the same lifetime as TRACKER or just
+ PATH.
+ */
+static void
+tracker_lookup(const char **orig_path,
+ svn_revnum_t *orig_rev,
+ path_tracker_t *tracker,
+ const char *path,
+ apr_pool_t *pool)
+{
+ tracker_trim(tracker, path, TRUE);
+ if (tracker->depth == 0)
+ {
+ /* no tree changes -> paths are the same as in the previous rev. */
+ *orig_path = path;
+ *orig_rev = tracker->revision - 1;
+ }
+ else
+ {
+ path_tracker_entry_t *parent = &APR_ARRAY_IDX(tracker->stack,
+ tracker->depth - 1,
+ path_tracker_entry_t);
+ if (parent->exists)
+ {
+ const char *rel_path
+ = svn_dirent_skip_ancestor(parent->path->data, path);
+
+ if (parent->copyfrom_rev != SVN_INVALID_REVNUM)
+ {
+ /* parent is a copy with history. Translate path. */
+ *orig_path = svn_dirent_join(parent->copyfrom_path->data,
+ rel_path, pool);
+ *orig_rev = parent->copyfrom_rev;
+ }
+ else if (*rel_path == '\0')
+ {
+ /* added in this revision with no history */
+ *orig_path = path;
+ *orig_rev = tracker->revision;
+ }
+ else
+ {
+ /* parent got added but not this path */
+ *orig_path = NULL;
+ *orig_rev = SVN_INVALID_REVNUM;
+ }
+ }
+ else
+ {
+ /* (maybe parent) path has been deleted */
+ *orig_path = NULL;
+ *orig_rev = SVN_INVALID_REVNUM;
+ }
+ }
+}
+
+/* Return a reference to the stack entry in TRACKER for PATH. If no
+ suitable entry exists, add one. Implicitly updates the tracked tree
+ location.
+
+ Only the PATH member of the result is being updated. All other members
+ will have undefined values.
+ */
+static path_tracker_entry_t *
+tracker_add_entry(path_tracker_t *tracker,
+ const char *path)
+{
+ path_tracker_entry_t *entry;
+ tracker_trim(tracker, path, FALSE);
+
+ if (tracker->depth == tracker->stack->nelts)
+ {
+ entry = apr_array_push(tracker->stack);
+ entry->path = svn_stringbuf_create_empty(tracker->pool);
+ entry->copyfrom_path = svn_stringbuf_create_empty(tracker->pool);
+ }
+ else
+ {
+ entry = &APR_ARRAY_IDX(tracker->stack, tracker->depth,
+ path_tracker_entry_t);
+ }
+
+ svn_stringbuf_set(entry->path, path);
+ ++tracker->depth;
+
+ return entry;
+}
+
+/* Update the TRACKER with a copy from COPYFROM_PATH@COPYFROM_REV to
+ PATH in the tracked revision.
+ */
+static void
+tracker_path_copy(path_tracker_t *tracker,
+ const char *path,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_rev)
+{
+ path_tracker_entry_t *entry = tracker_add_entry(tracker, path);
+
+ svn_stringbuf_set(entry->copyfrom_path, copyfrom_path);
+ entry->copyfrom_rev = copyfrom_rev;
+ entry->exists = TRUE;
+}
+
+/* Update the TRACKER with a plain addition of PATH (without history).
+ */
+static void
+tracker_path_add(path_tracker_t *tracker,
+ const char *path)
+{
+ path_tracker_entry_t *entry = tracker_add_entry(tracker, path);
+
+ svn_stringbuf_setempty(entry->copyfrom_path);
+ entry->copyfrom_rev = SVN_INVALID_REVNUM;
+ entry->exists = TRUE;
+}
+
+/* Update the TRACKER with a replacement of PATH with a plain addition
+ (without history).
+ */
+static void
+tracker_path_replace(path_tracker_t *tracker,
+ const char *path)
+{
+ /* this will implicitly purge all previous sub-tree info from STACK.
+ Thus, no need to tack the deletion explicitly. */
+ tracker_path_add(tracker, path);
+}
+
+/* Update the TRACKER with a deletion of PATH.
+ */
+static void
+tracker_path_delete(path_tracker_t *tracker,
+ const char *path)
+{
+ path_tracker_entry_t *entry = tracker_add_entry(tracker, path);
+
+ svn_stringbuf_setempty(entry->copyfrom_path);
+ entry->copyfrom_rev = SVN_INVALID_REVNUM;
+ entry->exists = FALSE;
+}
+
/* Compute the delta between OLDROOT/OLDPATH and NEWROOT/NEWPATH and
store it into a new temporary file *TEMPFILE. OLDROOT may be NULL,
@@ -84,6 +353,269 @@ store_delta(apr_file_t **tempfile, svn_filesize_t *len,
}
+/* Send a notification of type #svn_repos_notify_warning, subtype WARNING,
+ with message WARNING_FMT formatted with the remaining variable arguments.
+ Send it by calling NOTIFY_FUNC (if not null) with NOTIFY_BATON.
+ */
+__attribute__((format(printf, 5, 6)))
+static void
+notify_warning(apr_pool_t *scratch_pool,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_repos_notify_warning_t warning,
+ const char *warning_fmt,
+ ...)
+{
+ va_list va;
+ svn_repos_notify_t *notify;
+
+ if (notify_func == NULL)
+ return;
+
+ notify = svn_repos_notify_create(svn_repos_notify_warning, scratch_pool);
+ notify->warning = warning;
+ va_start(va, warning_fmt);
+ notify->warning_str = apr_pvsprintf(scratch_pool, warning_fmt, va);
+ va_end(va);
+
+ notify_func(notify_baton, notify, scratch_pool);
+}
+
+
+/*----------------------------------------------------------------------*/
+
+/* Write to STREAM the header in HEADERS named KEY, if present.
+ */
+static svn_error_t *
+write_header(svn_stream_t *stream,
+ apr_hash_t *headers,
+ const char *key,
+ apr_pool_t *scratch_pool)
+{
+ const char *val = svn_hash_gets(headers, key);
+
+ if (val)
+ {
+ SVN_ERR(svn_stream_printf(stream, scratch_pool,
+ "%s: %s\n", key, val));
+ }
+ return SVN_NO_ERROR;
+}
+
+/* Write headers, in arbitrary order.
+ * ### TODO: use a stable order
+ * ### Modifies HEADERS.
+ */
+static svn_error_t *
+write_revision_headers(svn_stream_t *stream,
+ apr_hash_t *headers,
+ apr_pool_t *scratch_pool)
+{
+ const char **h;
+ apr_hash_index_t *hi;
+
+ static const char *revision_headers_order[] =
+ {
+ SVN_REPOS_DUMPFILE_REVISION_NUMBER, /* must be first */
+ NULL
+ };
+
+ /* Write some headers in a given order */
+ for (h = revision_headers_order; *h; h++)
+ {
+ SVN_ERR(write_header(stream, headers, *h, scratch_pool));
+ svn_hash_sets(headers, *h, NULL);
+ }
+
+ /* Write any and all remaining headers except Content-length.
+ * ### TODO: use a stable order
+ */
+ for (hi = apr_hash_first(scratch_pool, headers); hi; hi = apr_hash_next(hi))
+ {
+ const char *key = apr_hash_this_key(hi);
+
+ if (strcmp(key, SVN_REPOS_DUMPFILE_CONTENT_LENGTH) != 0)
+ SVN_ERR(write_header(stream, headers, key, scratch_pool));
+ }
+
+ /* Content-length must be last */
+ SVN_ERR(write_header(stream, headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* A header entry: the element type of the apr_array_header_t which is
+ * the real type of svn_repos__dumpfile_headers_t.
+ */
+typedef struct svn_repos__dumpfile_header_entry_t {
+ const char *key, *val;
+} svn_repos__dumpfile_header_entry_t;
+
+svn_repos__dumpfile_headers_t *
+svn_repos__dumpfile_headers_create(apr_pool_t *pool)
+{
+ svn_repos__dumpfile_headers_t *headers
+ = apr_array_make(pool, 5, sizeof(svn_repos__dumpfile_header_entry_t));
+
+ return headers;
+}
+
+void
+svn_repos__dumpfile_header_push(svn_repos__dumpfile_headers_t *headers,
+ const char *key,
+ const char *val)
+{
+ svn_repos__dumpfile_header_entry_t *h
+ = &APR_ARRAY_PUSH(headers, svn_repos__dumpfile_header_entry_t);
+
+ h->key = apr_pstrdup(headers->pool, key);
+ h->val = apr_pstrdup(headers->pool, val);
+}
+
+void
+svn_repos__dumpfile_header_pushf(svn_repos__dumpfile_headers_t *headers,
+ const char *key,
+ const char *val_fmt,
+ ...)
+{
+ va_list ap;
+ svn_repos__dumpfile_header_entry_t *h
+ = &APR_ARRAY_PUSH(headers, svn_repos__dumpfile_header_entry_t);
+
+ h->key = apr_pstrdup(headers->pool, key);
+ va_start(ap, val_fmt);
+ h->val = apr_pvsprintf(headers->pool, val_fmt, ap);
+ va_end(ap);
+}
+
+svn_error_t *
+svn_repos__dump_headers(svn_stream_t *stream,
+ svn_repos__dumpfile_headers_t *headers,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+
+ for (i = 0; i < headers->nelts; i++)
+ {
+ svn_repos__dumpfile_header_entry_t *h
+ = &APR_ARRAY_IDX(headers, i, svn_repos__dumpfile_header_entry_t);
+
+ SVN_ERR(svn_stream_printf(stream, scratch_pool,
+ "%s: %s\n", h->key, h->val));
+ }
+
+ /* End of headers */
+ SVN_ERR(svn_stream_puts(stream, "\n"));
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ svn_stringbuf_t *propstring = NULL;
+ apr_hash_t *headers;
+
+ if (extra_headers)
+ headers = apr_hash_copy(scratch_pool, extra_headers);
+ else
+ headers = apr_hash_make(scratch_pool);
+
+ /* ### someday write a revision-content-checksum */
+
+ svn_hash_sets(headers, SVN_REPOS_DUMPFILE_REVISION_NUMBER,
+ apr_psprintf(scratch_pool, "%ld", revision));
+
+ if (apr_hash_count(revprops) || props_section_always)
+ {
+ svn_stream_t *propstream;
+
+ propstring = svn_stringbuf_create_empty(scratch_pool);
+ propstream = svn_stream_from_stringbuf(propstring, scratch_pool);
+ SVN_ERR(svn_hash_write2(revprops, propstream, "PROPS-END", scratch_pool));
+ SVN_ERR(svn_stream_close(propstream));
+
+ svn_hash_sets(headers, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH,
+ apr_psprintf(scratch_pool,
+ "%" APR_SIZE_T_FMT, propstring->len));
+ }
+
+ if (propstring)
+ {
+ /* Write out a regular Content-length header for the benefit of
+ non-Subversion RFC-822 parsers. */
+ svn_hash_sets(headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH,
+ apr_psprintf(scratch_pool,
+ "%" APR_SIZE_T_FMT, propstring->len));
+ }
+
+ SVN_ERR(write_revision_headers(dump_stream, headers, scratch_pool));
+
+ /* End of headers */
+ SVN_ERR(svn_stream_puts(dump_stream, "\n"));
+
+ /* Property data. */
+ if (propstring)
+ {
+ SVN_ERR(svn_stream_write(dump_stream, propstring->data, &propstring->len));
+ }
+
+ /* put an end to revision */
+ SVN_ERR(svn_stream_puts(dump_stream, "\n"));
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ svn_filesize_t content_length = 0;
+
+ /* add content-length headers */
+ if (props_str)
+ {
+ svn_repos__dumpfile_header_pushf(
+ headers, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH,
+ "%" APR_SIZE_T_FMT, props_str->len);
+ content_length += props_str->len;
+ }
+ if (has_text)
+ {
+ svn_repos__dumpfile_header_pushf(
+ headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH,
+ "%" SVN_FILESIZE_T_FMT, text_content_length);
+ content_length += text_content_length;
+ }
+ if (content_length_always || props_str || has_text)
+ {
+ svn_repos__dumpfile_header_pushf(
+ headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH,
+ "%" SVN_FILESIZE_T_FMT, content_length);
+ }
+
+ /* write the headers */
+ SVN_ERR(svn_repos__dump_headers(dump_stream, headers, scratch_pool));
+
+ /* write the props */
+ if (props_str)
+ {
+ SVN_ERR(svn_stream_write(dump_stream, props_str->data, &props_str->len));
+ }
+ return SVN_NO_ERROR;
+}
+
/*----------------------------------------------------------------------*/
/** An editor which dumps node-data in 'dumpfile format' to a file. **/
@@ -116,6 +648,9 @@ struct edit_baton
/* True if this "dump" is in fact a verify. */
svn_boolean_t verify;
+ /* True if checking UCS normalization during a verify. */
+ svn_boolean_t check_normalization;
+
/* The first revision dumped in this dumpstream. */
svn_revnum_t oldest_dumped_rev;
@@ -127,18 +662,14 @@ struct edit_baton
revisions older than OLDEST_DUMPED_REV. */
svn_boolean_t *found_old_mergeinfo;
- /* reusable buffer for writing file contents */
- char buffer[SVN__STREAM_CHUNK_SIZE];
- apr_size_t bufsize;
+ /* Structure allows us to verify the paths currently being dumped.
+ If NULL, validity checks are being skipped. */
+ path_tracker_t *path_tracker;
};
struct dir_baton
{
struct edit_baton *edit_baton;
- struct dir_baton *parent_dir_baton;
-
- /* is this directory a new addition to this revision? */
- svn_boolean_t added;
/* has this directory been written to the output stream? */
svn_boolean_t written_out;
@@ -159,6 +690,12 @@ struct dir_baton
really, they're all within this directory.) */
apr_hash_t *deleted_entries;
+ /* A flag indicating that new entries have been added to this
+ directory in this revision. Used to optimize detection of UCS
+ representation collisions; we will only check for that in
+ revisions where new names appear in the directory. */
+ svn_boolean_t check_name_collision;
+
/* pool to be used for deleting the hash items */
apr_pool_t *pool;
};
@@ -172,21 +709,19 @@ struct dir_baton
path, SVN_INVALID_REVNUM for the rev), just compare this directory
PATH against itself in the previous revision.
- PARENT_DIR_BATON is the directory baton of this directory's parent,
- or NULL if this is the top-level directory of the edit. ADDED
- indicated if this directory is newly added in this revision.
+ PB is the directory baton of this directory's parent,
+ or NULL if this is the top-level directory of the edit.
+
Perform all allocations in POOL. */
static struct dir_baton *
make_dir_baton(const char *path,
const char *cmp_path,
svn_revnum_t cmp_rev,
void *edit_baton,
- void *parent_dir_baton,
- svn_boolean_t added,
+ struct dir_baton *pb,
apr_pool_t *pool)
{
struct edit_baton *eb = edit_baton;
- struct dir_baton *pb = parent_dir_baton;
struct dir_baton *new_db = apr_pcalloc(pool, sizeof(*new_db));
const char *full_path;
@@ -204,18 +739,106 @@ make_dir_baton(const char *path,
cmp_path = svn_relpath_canonicalize(cmp_path, pool);
new_db->edit_baton = eb;
- new_db->parent_dir_baton = pb;
new_db->path = full_path;
new_db->cmp_path = cmp_path;
new_db->cmp_rev = cmp_rev;
- new_db->added = added;
new_db->written_out = FALSE;
new_db->deleted_entries = apr_hash_make(pool);
+ new_db->check_name_collision = FALSE;
new_db->pool = pool;
return new_db;
}
+static svn_error_t *
+fetch_kind_func(svn_node_kind_t *kind,
+ void *baton,
+ const char *path,
+ svn_revnum_t base_revision,
+ apr_pool_t *scratch_pool);
+
+/* Return an error when PATH in REVISION does not exist or is of a
+ different kind than EXPECTED_KIND. If the latter is svn_node_unknown,
+ skip that check. Use EB for context information. If REVISION is the
+ current revision, use EB's path tracker to follow renames, deletions,
+ etc.
+
+ Use SCRATCH_POOL for temporary allocations.
+ No-op if EB's path tracker has not been initialized.
+ */
+static svn_error_t *
+node_must_exist(struct edit_baton *eb,
+ const char *path,
+ svn_revnum_t revision,
+ svn_node_kind_t expected_kind,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind = svn_node_none;
+
+ /* in case the caller is trying something stupid ... */
+ if (eb->path_tracker == NULL)
+ return SVN_NO_ERROR;
+
+ /* paths pertaining to the revision currently being processed must
+ be translated / checked using our path tracker. */
+ if (revision == eb->path_tracker->revision)
+ tracker_lookup(&path, &revision, eb->path_tracker, path, scratch_pool);
+
+ /* determine the node type (default: no such node) */
+ if (path)
+ SVN_ERR(fetch_kind_func(&kind, eb, path, revision, scratch_pool));
+
+ /* check results */
+ if (kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+ _("Path '%s' not found in r%ld."),
+ path, revision);
+
+ if (expected_kind != kind && expected_kind != svn_node_unknown)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Unexpected node kind %d for '%s' at r%ld. "
+ "Expected kind was %d."),
+ kind, path, revision, expected_kind);
+
+ return SVN_NO_ERROR;
+}
+
+/* Return an error when PATH exists in REVISION. Use EB for context
+ information. If REVISION is the current revision, use EB's path
+ tracker to follow renames, deletions, etc.
+
+ Use SCRATCH_POOL for temporary allocations.
+ No-op if EB's path tracker has not been initialized.
+ */
+static svn_error_t *
+node_must_not_exist(struct edit_baton *eb,
+ const char *path,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ svn_node_kind_t kind = svn_node_none;
+
+ /* in case the caller is trying something stupid ... */
+ if (eb->path_tracker == NULL)
+ return SVN_NO_ERROR;
+
+ /* paths pertaining to the revision currently being processed must
+ be translated / checked using our path tracker. */
+ if (revision == eb->path_tracker->revision)
+ tracker_lookup(&path, &revision, eb->path_tracker, path, scratch_pool);
+
+ /* determine the node type (default: no such node) */
+ if (path)
+ SVN_ERR(fetch_kind_func(&kind, eb, path, revision, scratch_pool));
+
+ /* check results */
+ if (kind != svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Path '%s' exists in r%ld."),
+ path, revision);
+
+ return SVN_NO_ERROR;
+}
/* If the mergeinfo in MERGEINFO_STR refers to any revisions older than
* OLDEST_DUMPED_REV, issue a warning and set *FOUND_OLD_MERGEINFO to TRUE,
@@ -239,33 +862,222 @@ verify_mergeinfo_revisions(svn_boolean_t *found_old_mergeinfo,
if (apr_hash_count(old_mergeinfo))
{
- svn_repos_notify_t *notify =
- svn_repos_notify_create(svn_repos_notify_warning, pool);
-
- notify->warning = svn_repos_notify_warning_found_old_mergeinfo;
- notify->warning_str = apr_psprintf(
- pool,
- _("Mergeinfo referencing revision(s) prior "
- "to the oldest dumped revision (r%ld). "
- "Loading this dump may result in invalid "
- "mergeinfo."),
- oldest_dumped_rev);
+ notify_warning(pool, notify_func, notify_baton,
+ svn_repos_notify_warning_found_old_mergeinfo,
+ _("Mergeinfo referencing revision(s) prior "
+ "to the oldest dumped revision (r%ld). "
+ "Loading this dump may result in invalid "
+ "mergeinfo."),
+ oldest_dumped_rev);
if (found_old_mergeinfo)
*found_old_mergeinfo = TRUE;
- notify_func(notify_baton, notify, pool);
}
return SVN_NO_ERROR;
}
+/* Unique string pointers used by verify_mergeinfo_normalization()
+ and check_name_collision() */
+static const char normalized_unique[] = "normalized_unique";
+static const char normalized_collision[] = "normalized_collision";
+
+
+/* Baton for extract_mergeinfo_paths */
+struct extract_mergeinfo_paths_baton
+{
+ apr_hash_t *result;
+ svn_boolean_t normalize;
+ svn_membuf_t buffer;
+};
+
+/* Hash iterator that uniquifies all keys into a single hash table,
+ optionally normalizing them first. */
+static svn_error_t *
+extract_mergeinfo_paths(void *baton, const void *key, apr_ssize_t klen,
+ void *val, apr_pool_t *iterpool)
+{
+ struct extract_mergeinfo_paths_baton *const xb = baton;
+ if (xb->normalize)
+ {
+ const char *normkey;
+ SVN_ERR(svn_utf__normalize(&normkey, key, klen, &xb->buffer));
+ svn_hash_sets(xb->result,
+ apr_pstrdup(xb->buffer.pool, normkey),
+ normalized_unique);
+ }
+ else
+ apr_hash_set(xb->result,
+ apr_pmemdup(xb->buffer.pool, key, klen + 1), klen,
+ normalized_unique);
+ return SVN_NO_ERROR;
+}
+
+/* Baton for filter_mergeinfo_paths */
+struct filter_mergeinfo_paths_baton
+{
+ apr_hash_t *paths;
+};
+
+/* Compare two sets of denormalized paths from mergeinfo entries,
+ removing duplicates. */
+static svn_error_t *
+filter_mergeinfo_paths(void *baton, const void *key, apr_ssize_t klen,
+ void *val, apr_pool_t *iterpool)
+{
+ struct filter_mergeinfo_paths_baton *const fb = baton;
+
+ if (apr_hash_get(fb->paths, key, klen))
+ apr_hash_set(fb->paths, key, klen, NULL);
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton used by the check_mergeinfo_normalization hash iterator. */
+struct verify_mergeinfo_normalization_baton
+{
+ const char* path;
+ apr_hash_t *normalized_paths;
+ svn_membuf_t buffer;
+ svn_repos_notify_func_t notify_func;
+ void *notify_baton;
+};
+
+/* Hash iterator that verifies normalization and collision of paths in
+ an svn:mergeinfo property. */
+static svn_error_t *
+verify_mergeinfo_normalization(void *baton, const void *key, apr_ssize_t klen,
+ void *val, apr_pool_t *iterpool)
+{
+ struct verify_mergeinfo_normalization_baton *const vb = baton;
+
+ const char *const path = key;
+ const char *normpath;
+ const char *found;
+
+ SVN_ERR(svn_utf__normalize(&normpath, path, klen, &vb->buffer));
+ found = svn_hash_gets(vb->normalized_paths, normpath);
+ if (!found)
+ svn_hash_sets(vb->normalized_paths,
+ apr_pstrdup(vb->buffer.pool, normpath),
+ normalized_unique);
+ else if (found == normalized_collision)
+ /* Skip already reported collision */;
+ else
+ {
+ /* Report path collision in mergeinfo */
+ svn_hash_sets(vb->normalized_paths,
+ apr_pstrdup(vb->buffer.pool, normpath),
+ normalized_collision);
+
+ notify_warning(iterpool, vb->notify_func, vb->notify_baton,
+ svn_repos_notify_warning_mergeinfo_collision,
+ _("Duplicate representation of path '%s'"
+ " in %s property of '%s'"),
+ normpath, SVN_PROP_MERGEINFO, vb->path);
+ }
+ return SVN_NO_ERROR;
+}
+
+/* Check UCS normalization of mergeinfo for PATH. NEW_MERGEINFO is the
+ svn:mergeinfo property value being set; OLD_MERGEINFO is the
+ previous property value, which may be NULL. Only the paths that
+ were added in are checked, including collision checks. This
+ minimizes the number of notifications we generate for a given
+ mergeinfo property. */
+static svn_error_t *
+check_mergeinfo_normalization(const char *path,
+ const char *new_mergeinfo,
+ const char *old_mergeinfo,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *pool)
+{
+ svn_mergeinfo_t mergeinfo;
+ apr_hash_t *normalized_paths;
+ apr_hash_t *added_paths;
+ struct extract_mergeinfo_paths_baton extract_baton;
+ struct verify_mergeinfo_normalization_baton verify_baton;
+
+ SVN_ERR(svn_mergeinfo_parse(&mergeinfo, new_mergeinfo, pool));
+
+ extract_baton.result = apr_hash_make(pool);
+ extract_baton.normalize = FALSE;
+ svn_membuf__create(&extract_baton.buffer, 0, pool);
+ SVN_ERR(svn_iter_apr_hash(NULL, mergeinfo,
+ extract_mergeinfo_paths,
+ &extract_baton, pool));
+ added_paths = extract_baton.result;
+
+ if (old_mergeinfo)
+ {
+ struct filter_mergeinfo_paths_baton filter_baton;
+ svn_mergeinfo_t oldinfo;
+
+ extract_baton.result = apr_hash_make(pool);
+ extract_baton.normalize = TRUE;
+ SVN_ERR(svn_mergeinfo_parse(&oldinfo, old_mergeinfo, pool));
+ SVN_ERR(svn_iter_apr_hash(NULL, oldinfo,
+ extract_mergeinfo_paths,
+ &extract_baton, pool));
+ normalized_paths = extract_baton.result;
+
+ filter_baton.paths = added_paths;
+ SVN_ERR(svn_iter_apr_hash(NULL, oldinfo,
+ filter_mergeinfo_paths,
+ &filter_baton, pool));
+ }
+ else
+ normalized_paths = apr_hash_make(pool);
+
+ verify_baton.path = path;
+ verify_baton.normalized_paths = normalized_paths;
+ verify_baton.buffer = extract_baton.buffer;
+ verify_baton.notify_func = notify_func;
+ verify_baton.notify_baton = notify_baton;
+ SVN_ERR(svn_iter_apr_hash(NULL, added_paths,
+ verify_mergeinfo_normalization,
+ &verify_baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* A special case of dump_node(), for a delete record.
+ *
+ * The only thing special about this version is it only writes one blank
+ * line, not two, after the headers. Why? Historical precedent for the
+ * case where a delete record is used as part of a (delete + add-with-history)
+ * in implementing a replacement.
+ *
+ * Also it doesn't do a path-tracker check.
+ */
+static svn_error_t *
+dump_node_delete(svn_stream_t *stream,
+ const char *node_relpath,
+ apr_pool_t *pool)
+{
+ svn_repos__dumpfile_headers_t *headers
+ = svn_repos__dumpfile_headers_create(pool);
+
+ /* Node-path: ... */
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_PATH, node_relpath);
+
+ /* Node-action: delete */
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete");
+
+ SVN_ERR(svn_repos__dump_headers(stream, headers, pool));
+ return SVN_NO_ERROR;
+}
/* This helper is the main "meat" of the editor -- it does all the
work of writing a node record.
Write out a node record for PATH of type KIND under EB->FS_ROOT.
ACTION describes what is happening to the node (see enum svn_node_action).
- Write record to writable EB->STREAM, using EB->BUFFER to write in chunks.
+ Write record to writable EB->STREAM.
If the node was itself copied, IS_COPY is TRUE and the
path/revision of the copy source are in CMP_PATH/CMP_REV. If
@@ -283,13 +1095,15 @@ dump_node(struct edit_baton *eb,
apr_pool_t *pool)
{
svn_stringbuf_t *propstring;
- svn_filesize_t content_length = 0;
apr_size_t len;
svn_boolean_t must_dump_text = FALSE, must_dump_props = FALSE;
const char *compare_path = path;
svn_revnum_t compare_rev = eb->current_rev - 1;
svn_fs_root_t *compare_root = NULL;
apr_file_t *delta_file = NULL;
+ svn_repos__dumpfile_headers_t *headers
+ = svn_repos__dumpfile_headers_create(pool);
+ svn_filesize_t textlen;
/* Maybe validate the path. */
if (eb->verify || eb->notify_func)
@@ -301,17 +1115,12 @@ dump_node(struct edit_baton *eb,
if (eb->notify_func)
{
char errbuf[512]; /* ### svn_strerror() magic number */
- svn_repos_notify_t *notify;
- notify = svn_repos_notify_create(svn_repos_notify_warning, pool);
-
- notify->warning = svn_repos_notify_warning_invalid_fspath;
- notify->warning_str = apr_psprintf(
- pool,
- _("E%06d: While validating fspath '%s': %s"),
- err->apr_err, path,
- svn_err_best_message(err, errbuf, sizeof(errbuf)));
- eb->notify_func(eb->notify_baton, notify, pool);
+ notify_warning(pool, eb->notify_func, eb->notify_baton,
+ svn_repos_notify_warning_invalid_fspath,
+ _("E%06d: While validating fspath '%s': %s"),
+ err->apr_err, path,
+ svn_err_best_message(err, errbuf, sizeof(errbuf)));
}
/* Return the error in addition to notifying about it. */
@@ -323,15 +1132,14 @@ dump_node(struct edit_baton *eb,
}
/* Write out metadata headers for this file node. */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_PATH ": %s\n",
- path));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_PATH, path);
if (kind == svn_node_file)
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_KIND ": file\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_KIND, "file");
else if (kind == svn_node_dir)
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_KIND ": dir\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_KIND, "dir");
/* Remove leading slashes from copyfrom paths. */
if (cmp_path)
@@ -344,10 +1152,16 @@ dump_node(struct edit_baton *eb,
compare_rev = cmp_rev;
}
- if (action == svn_node_action_change)
+ switch (action)
{
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": change\n"));
+ case svn_node_action_change:
+ if (eb->path_tracker)
+ SVN_ERR_W(node_must_exist(eb, path, eb->current_rev, kind, pool),
+ apr_psprintf(pool, _("Change invalid path '%s' in r%ld"),
+ path, eb->current_rev));
+
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "change");
/* either the text or props changed, or possibly both. */
SVN_ERR(svn_fs_revision_root(&compare_root,
@@ -361,58 +1175,83 @@ dump_node(struct edit_baton *eb,
SVN_ERR(svn_fs_contents_changed(&must_dump_text,
compare_root, compare_path,
eb->fs_root, path, pool));
- }
- else if (action == svn_node_action_replace)
- {
+ break;
+
+ case svn_node_action_delete:
+ if (eb->path_tracker)
+ {
+ SVN_ERR_W(node_must_exist(eb, path, eb->current_rev, kind, pool),
+ apr_psprintf(pool, _("Deleting invalid path '%s' in r%ld"),
+ path, eb->current_rev));
+ tracker_path_delete(eb->path_tracker, path);
+ }
+
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete");
+
+ /* we can leave this routine quietly now, don't need to dump
+ any content. */
+ must_dump_text = FALSE;
+ must_dump_props = FALSE;
+ break;
+
+ case svn_node_action_replace:
+ if (eb->path_tracker)
+ SVN_ERR_W(node_must_exist(eb, path, eb->current_rev,
+ svn_node_unknown, pool),
+ apr_psprintf(pool,
+ _("Replacing non-existent path '%s' in r%ld"),
+ path, eb->current_rev));
+
if (! is_copy)
{
+ if (eb->path_tracker)
+ tracker_path_replace(eb->path_tracker, path);
+
/* a simple delete+add, implied by a single 'replace' action. */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION
- ": replace\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "replace");
/* definitely need to dump all content for a replace. */
if (kind == svn_node_file)
must_dump_text = TRUE;
must_dump_props = TRUE;
+ break;
}
else
{
/* more complex: delete original, then add-with-history. */
+ /* ### Why not write a 'replace' record? Don't know. */
- /* the path & kind headers have already been printed; just
- add a delete action, and end the current record.*/
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION
- ": delete\n\n"));
+ if (eb->path_tracker)
+ {
+ tracker_path_delete(eb->path_tracker, path);
+ }
- /* recurse: print an additional add-with-history record. */
- SVN_ERR(dump_node(eb, path, kind, svn_node_action_add,
- is_copy, compare_path, compare_rev, pool));
+ /* ### Unusually, we end this 'delete' node record with only a single
+ blank line after the header block -- no extra blank line. */
+ SVN_ERR(dump_node_delete(eb->stream, path, pool));
- /* we can leave this routine quietly now, don't need to dump
- any content; that was already done in the second record. */
- must_dump_text = FALSE;
- must_dump_props = FALSE;
+ /* The remaining action is a non-replacing add-with-history */
+ /* action = svn_node_action_add; */
}
- }
- else if (action == svn_node_action_delete)
- {
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": delete\n"));
+ /* FALL THROUGH to 'add' */
- /* we can leave this routine quietly now, don't need to dump
- any content. */
- must_dump_text = FALSE;
- must_dump_props = FALSE;
- }
- else if (action == svn_node_action_add)
- {
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": add\n"));
+ case svn_node_action_add:
+ if (eb->path_tracker)
+ SVN_ERR_W(node_must_not_exist(eb, path, eb->current_rev, pool),
+ apr_psprintf(pool,
+ _("Adding already existing path '%s' in r%ld"),
+ path, eb->current_rev));
+
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "add");
if (! is_copy)
{
+ if (eb->path_tracker)
+ tracker_path_add(eb->path_tracker, path);
+
/* Dump all contents for a simple 'add'. */
if (kind == svn_node_file)
must_dump_text = TRUE;
@@ -420,32 +1259,37 @@ dump_node(struct edit_baton *eb,
}
else
{
+ if (eb->path_tracker)
+ {
+ SVN_ERR_W(node_must_exist(eb, compare_path, compare_rev,
+ kind, pool),
+ apr_psprintf(pool,
+ _("Copying from invalid path to "
+ "'%s' in r%ld"),
+ path, eb->current_rev));
+ tracker_path_copy(eb->path_tracker, path, compare_path,
+ compare_rev);
+ }
+
if (!eb->verify && cmp_rev < eb->oldest_dumped_rev
&& eb->notify_func)
{
- svn_repos_notify_t *notify =
- svn_repos_notify_create(svn_repos_notify_warning, pool);
-
- notify->warning = svn_repos_notify_warning_found_old_reference;
- notify->warning_str = apr_psprintf(
- pool,
- _("Referencing data in revision %ld,"
- " which is older than the oldest"
- " dumped revision (r%ld). Loading this dump"
- " into an empty repository"
- " will fail."),
- cmp_rev, eb->oldest_dumped_rev);
+ notify_warning(pool, eb->notify_func, eb->notify_baton,
+ svn_repos_notify_warning_found_old_reference,
+ _("Referencing data in revision %ld,"
+ " which is older than the oldest"
+ " dumped revision (r%ld). Loading this dump"
+ " into an empty repository"
+ " will fail."),
+ cmp_rev, eb->oldest_dumped_rev);
if (eb->found_old_reference)
*eb->found_old_reference = TRUE;
- eb->notify_func(eb->notify_baton, notify, pool);
}
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV
- ": %ld\n"
- SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH
- ": %s\n",
- cmp_rev, cmp_path));
+ svn_repos__dumpfile_header_pushf(
+ headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV, "%ld", cmp_rev);
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH, cmp_path);
SVN_ERR(svn_fs_revision_root(&compare_root,
svn_fs_root_fs(eb->fs_root),
@@ -469,20 +1313,19 @@ dump_node(struct edit_baton *eb,
FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5, hex_digest);
SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1,
compare_root, compare_path,
FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_SHA1
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_SHA1, hex_digest);
}
}
+ break;
}
if ((! must_dump_text) && (! must_dump_props))
@@ -492,8 +1335,9 @@ dump_node(struct edit_baton *eb,
then our dumpstream format demands that at a *minimum*, we
see a lone "PROPS-END" as a divider between text and props
content within the content-block. */
- len = 2;
- return svn_stream_write(eb->stream, "\n\n", &len); /* ### needed? */
+ SVN_ERR(svn_repos__dump_headers(eb->stream, headers, pool));
+ len = 1;
+ return svn_stream_write(eb->stream, "\n", &len); /* ### needed? */
}
/*** Start prepping content to dump... ***/
@@ -504,7 +1348,6 @@ dump_node(struct edit_baton *eb,
if (must_dump_props)
{
apr_hash_t *prophash, *oldhash = NULL;
- apr_size_t proplen;
svn_stream_t *propstream;
SVN_ERR(svn_fs_node_proplist(&prophash, eb->fs_root, path, pool));
@@ -528,14 +1371,42 @@ dump_node(struct edit_baton *eb,
}
}
+ /* If we're checking UCS normalization, also parse any changed
+ mergeinfo and warn about denormalized paths and name
+ collisions there. */
+ if (eb->verify && eb->check_normalization && eb->notify_func)
+ {
+ /* N.B.: This hash lookup happens only once; the conditions
+ for verifying historic mergeinfo references and checking
+ UCS normalization are mutually exclusive. */
+ svn_string_t *mergeinfo_str = svn_hash_gets(prophash,
+ SVN_PROP_MERGEINFO);
+ if (mergeinfo_str)
+ {
+ svn_string_t *oldinfo_str = NULL;
+ if (compare_root)
+ {
+ SVN_ERR(svn_fs_node_proplist(&oldhash,
+ compare_root, compare_path,
+ pool));
+ oldinfo_str = svn_hash_gets(oldhash, SVN_PROP_MERGEINFO);
+ }
+ SVN_ERR(check_mergeinfo_normalization(
+ path, mergeinfo_str->data,
+ (oldinfo_str ? oldinfo_str->data : NULL),
+ eb->notify_func, eb->notify_baton, pool));
+ }
+ }
+
if (eb->use_deltas && compare_root)
{
/* Fetch the old property hash to diff against and output a header
saying that our property contents are a delta. */
- SVN_ERR(svn_fs_node_proplist(&oldhash, compare_root, compare_path,
- pool));
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_PROP_DELTA ": true\n"));
+ if (!oldhash) /* May have been set for normalization check */
+ SVN_ERR(svn_fs_node_proplist(&oldhash, compare_root, compare_path,
+ pool));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_PROP_DELTA, "true");
}
else
oldhash = apr_hash_make(pool);
@@ -544,11 +1415,6 @@ dump_node(struct edit_baton *eb,
SVN_ERR(svn_hash_write_incremental(prophash, oldhash, propstream,
"PROPS-END", pool));
SVN_ERR(svn_stream_close(propstream));
- proplen = propstring->len;
- content_length += proplen;
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n", proplen));
}
/* If we are supposed to dump text, write out a text length header
@@ -557,7 +1423,6 @@ dump_node(struct edit_baton *eb,
{
svn_checksum_t *checksum;
const char *hex_digest;
- svn_filesize_t textlen;
if (eb->use_deltas)
{
@@ -566,8 +1431,8 @@ dump_node(struct edit_baton *eb,
saying our text contents are a delta. */
SVN_ERR(store_delta(&delta_file, &textlen, compare_root,
compare_path, eb->fs_root, path, pool));
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_TEXT_DELTA ": true\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_DELTA, "true");
if (compare_root)
{
@@ -576,18 +1441,16 @@ dump_node(struct edit_baton *eb,
FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5, hex_digest);
SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1,
compare_root, compare_path,
FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1, hex_digest);
}
}
else
@@ -596,42 +1459,30 @@ dump_node(struct edit_baton *eb,
SVN_ERR(svn_fs_file_length(&textlen, eb->fs_root, path, pool));
}
- content_length += textlen;
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH
- ": %" SVN_FILESIZE_T_FMT "\n", textlen));
-
SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5,
eb->fs_root, path, FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5, hex_digest);
SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_sha1,
eb->fs_root, path, FALSE, pool));
hex_digest = svn_checksum_to_cstring(checksum, pool);
if (hex_digest)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_SHA1
- ": %s\n", hex_digest));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_SHA1, hex_digest);
}
/* 'Content-length:' is the last header before we dump the content,
and is the sum of the text and prop contents lengths. We write
this only for the benefit of non-Subversion RFC-822 parsers. */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" SVN_FILESIZE_T_FMT "\n\n",
- content_length));
-
- /* Dump property content if we're supposed to do so. */
- if (must_dump_props)
- {
- len = propstring->len;
- SVN_ERR(svn_stream_write(eb->stream, propstring->data, &len));
- }
+ SVN_ERR(svn_repos__dump_node_record(eb->stream, headers,
+ must_dump_props ? propstring : NULL,
+ must_dump_text,
+ must_dump_text ? textlen : 0,
+ TRUE /*content_length_always*/,
+ pool));
/* Dump text content */
if (must_dump_text && (kind == svn_node_file))
@@ -663,7 +1514,7 @@ open_root(void *edit_baton,
void **root_baton)
{
*root_baton = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM,
- edit_baton, NULL, FALSE, pool);
+ edit_baton, NULL, pool);
return SVN_NO_ERROR;
}
@@ -694,13 +1545,13 @@ add_directory(const char *path,
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
- void *val;
+ void *was_deleted;
svn_boolean_t is_copy = FALSE;
struct dir_baton *new_db
- = make_dir_baton(path, copyfrom_path, copyfrom_rev, eb, pb, TRUE, pool);
+ = make_dir_baton(path, copyfrom_path, copyfrom_rev, eb, pb, pool);
/* This might be a replacement -- is the path already deleted? */
- val = svn_hash_gets(pb->deleted_entries, path);
+ was_deleted = svn_hash_gets(pb->deleted_entries, path);
/* Detect an add-with-history. */
is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev);
@@ -708,16 +1559,23 @@ add_directory(const char *path,
/* Dump the node. */
SVN_ERR(dump_node(eb, path,
svn_node_dir,
- val ? svn_node_action_replace : svn_node_action_add,
+ was_deleted ? svn_node_action_replace : svn_node_action_add,
is_copy,
is_copy ? copyfrom_path : NULL,
is_copy ? copyfrom_rev : SVN_INVALID_REVNUM,
pool));
- if (val)
+ if (was_deleted)
/* Delete the path, it's now been dumped. */
svn_hash_sets(pb->deleted_entries, path, NULL);
+ /* Check for normalized name clashes, but only if this is actually a
+ new name in the parent, not a replacement. */
+ if (!was_deleted && eb->verify && eb->check_normalization && eb->notify_func)
+ {
+ pb->check_name_collision = TRUE;
+ }
+
new_db->written_out = TRUE;
*child_baton = new_db;
@@ -747,7 +1605,7 @@ open_directory(const char *path,
cmp_rev = pb->cmp_rev;
}
- new_db = make_dir_baton(path, cmp_path, cmp_rev, eb, pb, FALSE, pool);
+ new_db = make_dir_baton(path, cmp_path, cmp_rev, eb, pb, pool);
*child_baton = new_db;
return SVN_NO_ERROR;
}
@@ -799,11 +1657,11 @@ add_file(const char *path,
{
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
- void *val;
+ void *was_deleted;
svn_boolean_t is_copy = FALSE;
/* This might be a replacement -- is the path already deleted? */
- val = svn_hash_gets(pb->deleted_entries, path);
+ was_deleted = svn_hash_gets(pb->deleted_entries, path);
/* Detect add-with-history. */
is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev);
@@ -811,16 +1669,23 @@ add_file(const char *path,
/* Dump the node. */
SVN_ERR(dump_node(eb, path,
svn_node_file,
- val ? svn_node_action_replace : svn_node_action_add,
+ was_deleted ? svn_node_action_replace : svn_node_action_add,
is_copy,
is_copy ? copyfrom_path : NULL,
is_copy ? copyfrom_rev : SVN_INVALID_REVNUM,
pool));
- if (val)
+ if (was_deleted)
/* delete the path, it's now been dumped. */
svn_hash_sets(pb->deleted_entries, path, NULL);
+ /* Check for normalized name clashes, but only if this is actually a
+ new name in the parent, not a replacement. */
+ if (!was_deleted && eb->verify && eb->check_normalization && eb->notify_func)
+ {
+ pb->check_name_collision = TRUE;
+ }
+
*file_baton = NULL; /* muhahahaha */
return SVN_NO_ERROR;
}
@@ -867,11 +1732,16 @@ change_dir_prop(void *parent_baton,
/* This function is what distinguishes between a directory that is
opened to merely get somewhere, vs. one that is opened because it
- *actually* changed by itself. */
+ *actually* changed by itself.
+
+ Instead of recording the prop changes here, we just use this method
+ to trigger writing the node; dump_node() finds all the changes. */
if (! db->written_out)
{
SVN_ERR(dump_node(eb, db->path,
svn_node_dir, svn_node_action_change,
+ /* ### We pass is_copy=FALSE; this might be wrong
+ but the parameter isn't used when action=change. */
FALSE, db->cmp_path, db->cmp_rev, pool));
db->written_out = TRUE;
}
@@ -984,6 +1854,7 @@ get_dump_editor(const svn_delta_editor_t **editor,
svn_revnum_t oldest_dumped_rev,
svn_boolean_t use_deltas,
svn_boolean_t verify,
+ svn_boolean_t check_normalization,
apr_pool_t *pool)
{
/* Allocate an edit baton to be stored in every directory baton.
@@ -999,16 +1870,24 @@ get_dump_editor(const svn_delta_editor_t **editor,
eb->notify_func = notify_func;
eb->notify_baton = notify_baton;
eb->oldest_dumped_rev = oldest_dumped_rev;
- eb->bufsize = sizeof(eb->buffer);
eb->path = apr_pstrdup(pool, root_path);
SVN_ERR(svn_fs_revision_root(&(eb->fs_root), fs, to_rev, pool));
eb->fs = fs;
eb->current_rev = to_rev;
eb->use_deltas = use_deltas;
eb->verify = verify;
+ eb->check_normalization = check_normalization;
eb->found_old_reference = found_old_reference;
eb->found_old_mergeinfo = found_old_mergeinfo;
+ /* In non-verification mode, we will allow anything to be dumped because
+ it might be an incremental dump with possible manual intervention.
+ Also, this might be the last resort when it comes to data recovery.
+
+ Else, make sure that all paths exists at their respective revisions.
+ */
+ eb->path_tracker = verify ? tracker_create(to_rev, pool) : NULL;
+
/* Set up the editor. */
dump_editor->open_root = open_root;
dump_editor->delete_entry = delete_entry;
@@ -1051,15 +1930,10 @@ write_revision_record(svn_stream_t *stream,
svn_revnum_t rev,
apr_pool_t *pool)
{
- apr_size_t len;
apr_hash_t *props;
- svn_stringbuf_t *encoded_prophash;
apr_time_t timetemp;
svn_string_t *datevalue;
- svn_stream_t *propstream;
- /* Read the revision props even if we're aren't going to dump
- them for verification purposes */
SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, pool));
/* Run revision date properties through the time conversion to
@@ -1074,33 +1948,10 @@ write_revision_record(svn_stream_t *stream,
svn_hash_sets(props, SVN_PROP_REVISION_DATE, datevalue);
}
- encoded_prophash = svn_stringbuf_create_ensure(0, pool);
- propstream = svn_stream_from_stringbuf(encoded_prophash, pool);
- SVN_ERR(svn_hash_write2(props, propstream, "PROPS-END", pool));
- SVN_ERR(svn_stream_close(propstream));
-
- /* ### someday write a revision-content-checksum */
-
- SVN_ERR(svn_stream_printf(stream, pool,
- SVN_REPOS_DUMPFILE_REVISION_NUMBER
- ": %ld\n", rev));
- SVN_ERR(svn_stream_printf(stream, pool,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n",
- encoded_prophash->len));
-
- /* Write out a regular Content-length header for the benefit of
- non-Subversion RFC-822 parsers. */
- SVN_ERR(svn_stream_printf(stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n\n",
- encoded_prophash->len));
-
- len = encoded_prophash->len;
- SVN_ERR(svn_stream_write(stream, encoded_prophash->data, &len));
-
- len = 1;
- return svn_stream_write(stream, "\n", &len);
+ SVN_ERR(svn_repos__dump_revision_record(stream, rev, NULL, props,
+ TRUE /*props_section_always*/,
+ pool));
+ return SVN_NO_ERROR;
}
@@ -1121,7 +1972,7 @@ svn_repos_dump_fs3(svn_repos_t *repos,
{
const svn_delta_editor_t *dump_editor;
void *dump_edit_baton = NULL;
- svn_revnum_t i;
+ svn_revnum_t rev;
svn_fs_t *fs = svn_repos_fs(repos);
apr_pool_t *subpool = svn_pool_create(pool);
svn_revnum_t youngest;
@@ -1153,10 +2004,6 @@ svn_repos_dump_fs3(svn_repos_t *repos,
_("End revision %ld is invalid "
"(youngest revision is %ld)"),
end_rev, youngest);
- if ((start_rev == 0) && incremental)
- incremental = FALSE; /* revision 0 looks the same regardless of
- whether or not this is an incremental
- dump, so just simplify things. */
/* Write out the UUID. */
SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool));
@@ -1180,10 +2027,9 @@ svn_repos_dump_fs3(svn_repos_t *repos,
notify = svn_repos_notify_create(svn_repos_notify_dump_rev_end,
pool);
- /* Main loop: we're going to dump revision i. */
- for (i = start_rev; i <= end_rev; i++)
+ /* Main loop: we're going to dump revision REV. */
+ for (rev = start_rev; rev <= end_rev; rev++)
{
- svn_revnum_t from_rev, to_rev;
svn_fs_root_t *to_root;
svn_boolean_t use_deltas_for_rev;
@@ -1193,56 +2039,36 @@ svn_repos_dump_fs3(svn_repos_t *repos,
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- /* Special-case the initial revision dump: it needs to contain
- *all* nodes, because it's the foundation of all future
- revisions in the dumpfile. */
- if ((i == start_rev) && (! incremental))
- {
- /* Special-special-case a dump of revision 0. */
- if (i == 0)
- {
- /* Just write out the one revision 0 record and move on.
- The parser might want to use its properties. */
- SVN_ERR(write_revision_record(stream, fs, 0, subpool));
- to_rev = 0;
- goto loop_end;
- }
-
- /* Compare START_REV to revision 0, so that everything
- appears to be added. */
- from_rev = 0;
- to_rev = i;
- }
- else
- {
- /* In the normal case, we want to compare consecutive revs. */
- from_rev = i - 1;
- to_rev = i;
- }
-
/* Write the revision record. */
- SVN_ERR(write_revision_record(stream, fs, to_rev, subpool));
+ SVN_ERR(write_revision_record(stream, fs, rev, subpool));
+
+ /* When dumping revision 0, we just write out the revision record.
+ The parser might want to use its properties. */
+ if (rev == 0)
+ goto loop_end;
/* Fetch the editor which dumps nodes to a file. Regardless of
what we've been told, don't use deltas for the first rev of a
non-incremental dump. */
- use_deltas_for_rev = use_deltas && (incremental || i != start_rev);
- SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton, fs, to_rev,
+ use_deltas_for_rev = use_deltas && (incremental || rev != start_rev);
+ SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton, fs, rev,
"", stream, &found_old_reference,
&found_old_mergeinfo, NULL,
notify_func, notify_baton,
- start_rev, use_deltas_for_rev, FALSE, subpool));
+ start_rev, use_deltas_for_rev, FALSE, FALSE,
+ subpool));
/* Drive the editor in one way or another. */
- SVN_ERR(svn_fs_revision_root(&to_root, fs, to_rev, subpool));
+ SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, subpool));
/* If this is the first revision of a non-incremental dump,
we're in for a full tree dump. Otherwise, we want to simply
replay the revision. */
- if ((i == start_rev) && (! incremental))
+ if ((rev == start_rev) && (! incremental))
{
+ /* Compare against revision 0, so everything appears to be added. */
svn_fs_root_t *from_root;
- SVN_ERR(svn_fs_revision_root(&from_root, fs, from_rev, subpool));
+ SVN_ERR(svn_fs_revision_root(&from_root, fs, 0, subpool));
SVN_ERR(svn_repos_dir_delta2(from_root, "", "",
to_root, "",
dump_editor, dump_edit_baton,
@@ -1256,6 +2082,7 @@ svn_repos_dump_fs3(svn_repos_t *repos,
}
else
{
+ /* The normal case: compare consecutive revs. */
SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE,
dump_editor, dump_edit_baton,
NULL, NULL, subpool));
@@ -1268,7 +2095,7 @@ svn_repos_dump_fs3(svn_repos_t *repos,
loop_end:
if (notify_func)
{
- notify->revision = to_rev;
+ notify->revision = rev;
notify_func(notify_baton, notify, subpool);
}
}
@@ -1285,28 +2112,24 @@ svn_repos_dump_fs3(svn_repos_t *repos,
if (found_old_reference)
{
- notify = svn_repos_notify_create(svn_repos_notify_warning, subpool);
-
- notify->warning = svn_repos_notify_warning_found_old_reference;
- notify->warning_str = _("The range of revisions dumped "
- "contained references to "
- "copy sources outside that "
- "range.");
- notify_func(notify_baton, notify, subpool);
+ notify_warning(subpool, notify_func, notify_baton,
+ svn_repos_notify_warning_found_old_reference,
+ _("The range of revisions dumped "
+ "contained references to "
+ "copy sources outside that "
+ "range."));
}
/* Ditto if we issued any warnings about old revisions referenced
in dumped mergeinfo. */
if (found_old_mergeinfo)
{
- notify = svn_repos_notify_create(svn_repos_notify_warning, subpool);
-
- notify->warning = svn_repos_notify_warning_found_old_mergeinfo;
- notify->warning_str = _("The range of revisions dumped "
- "contained mergeinfo "
- "which reference revisions outside "
- "that range.");
- notify_func(notify_baton, notify, subpool);
+ notify_warning(subpool, notify_func, notify_baton,
+ svn_repos_notify_warning_found_old_mergeinfo,
+ _("The range of revisions dumped "
+ "contained mergeinfo "
+ "which reference revisions outside "
+ "that range."));
}
}
@@ -1341,23 +2164,32 @@ verify_directory_entry(void *baton, const void *key, apr_ssize_t klen,
{
struct dir_baton *db = baton;
svn_fs_dirent_t *dirent = (svn_fs_dirent_t *)val;
- char *path = svn_relpath_join(db->path, (const char *)key, pool);
- apr_hash_t *dirents;
- svn_filesize_t len;
+ char *path;
+ svn_boolean_t right_kind;
+
+ path = svn_relpath_join(db->path, (const char *)key, pool);
/* since we can't access the directory entries directly by their ID,
we need to navigate from the FS_ROOT to them (relatively expensive
- because we may start at a never rev than the last change to node). */
+ because we may start at a never rev than the last change to node).
+ We check that the node kind stored in the noderev matches the dir
+ entry. This also ensures that all entries point to valid noderevs.
+ */
switch (dirent->kind) {
case svn_node_dir:
- /* Getting this directory's contents is enough to ensure that our
- link to it is correct. */
- SVN_ERR(svn_fs_dir_entries(&dirents, db->edit_baton->fs_root, path, pool));
+ SVN_ERR(svn_fs_is_dir(&right_kind, db->edit_baton->fs_root, path, pool));
+ if (!right_kind)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Node '%s' is not a directory."),
+ path);
+
break;
case svn_node_file:
- /* Getting this file's size is enough to ensure that our link to it
- is correct. */
- SVN_ERR(svn_fs_file_length(&len, db->edit_baton->fs_root, path, pool));
+ SVN_ERR(svn_fs_is_file(&right_kind, db->edit_baton->fs_root, path, pool));
+ if (!right_kind)
+ return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
+ _("Node '%s' is not a file."),
+ path);
break;
default:
return svn_error_createf(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
@@ -1368,9 +2200,54 @@ verify_directory_entry(void *baton, const void *key, apr_ssize_t klen,
return SVN_NO_ERROR;
}
+/* Baton used by the check_name_collision hash iterator. */
+struct check_name_collision_baton
+{
+ struct dir_baton *dir_baton;
+ apr_hash_t *normalized;
+ svn_membuf_t buffer;
+};
+
+/* Scan the directory and report all entry names that differ only in
+ Unicode character representation. */
static svn_error_t *
-verify_close_directory(void *dir_baton,
- apr_pool_t *pool)
+check_name_collision(void *baton, const void *key, apr_ssize_t klen,
+ void *val, apr_pool_t *iterpool)
+{
+ struct check_name_collision_baton *const cb = baton;
+ const char *name;
+ const char *found;
+
+ SVN_ERR(svn_utf__normalize(&name, key, klen, &cb->buffer));
+
+ found = svn_hash_gets(cb->normalized, name);
+ if (!found)
+ svn_hash_sets(cb->normalized, apr_pstrdup(cb->buffer.pool, name),
+ normalized_unique);
+ else if (found == normalized_collision)
+ /* Skip already reported collision */;
+ else
+ {
+ struct dir_baton *const db = cb->dir_baton;
+ struct edit_baton *const eb = db->edit_baton;
+ const char* normpath;
+
+ svn_hash_sets(cb->normalized, apr_pstrdup(cb->buffer.pool, name),
+ normalized_collision);
+
+ SVN_ERR(svn_utf__normalize(
+ &normpath, svn_relpath_join(db->path, name, iterpool),
+ SVN_UTF__UNKNOWN_LENGTH, &cb->buffer));
+ notify_warning(iterpool, eb->notify_func, eb->notify_baton,
+ svn_repos_notify_warning_name_collision,
+ _("Duplicate representation of path '%s'"), normpath);
+ }
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+verify_close_directory(void *dir_baton, apr_pool_t *pool)
{
struct dir_baton *db = dir_baton;
apr_hash_t *dirents;
@@ -1378,11 +2255,72 @@ verify_close_directory(void *dir_baton,
db->path, pool));
SVN_ERR(svn_iter_apr_hash(NULL, dirents, verify_directory_entry,
dir_baton, pool));
+
+ if (db->check_name_collision)
+ {
+ struct check_name_collision_baton check_baton;
+ check_baton.dir_baton = db;
+ check_baton.normalized = apr_hash_make(pool);
+ svn_membuf__create(&check_baton.buffer, 0, pool);
+ SVN_ERR(svn_iter_apr_hash(NULL, dirents, check_name_collision,
+ &check_baton, pool));
+ }
+
return close_directory(dir_baton, pool);
}
+/* Verify revision REV in file system FS. */
+static svn_error_t *
+verify_one_revision(svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_revnum_t start_rev,
+ svn_boolean_t check_normalization,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const svn_delta_editor_t *dump_editor;
+ void *dump_edit_baton;
+ svn_fs_root_t *to_root;
+ apr_hash_t *props;
+ const svn_delta_editor_t *cancel_editor;
+ void *cancel_edit_baton;
+
+ /* Get cancellable dump editor, but with our close_directory handler.*/
+ SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton,
+ fs, rev, "",
+ svn_stream_empty(scratch_pool),
+ NULL, NULL,
+ verify_close_directory,
+ notify_func, notify_baton,
+ start_rev,
+ FALSE, TRUE, /* use_deltas, verify */
+ check_normalization,
+ scratch_pool));
+ SVN_ERR(svn_delta_get_cancellation_editor(cancel_func, cancel_baton,
+ dump_editor, dump_edit_baton,
+ &cancel_editor,
+ &cancel_edit_baton,
+ scratch_pool));
+ SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, scratch_pool));
+ SVN_ERR(svn_fs_verify_root(to_root, scratch_pool));
+ SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE,
+ cancel_editor, cancel_edit_baton,
+ NULL, NULL, scratch_pool));
+
+ /* While our editor close_edit implementation is a no-op, we still
+ do this for completeness. */
+ SVN_ERR(cancel_editor->close_edit(cancel_edit_baton, scratch_pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
/* Baton type used for forwarding notifications from FS API to REPOS API. */
-struct verify_fs2_notify_func_baton_t
+struct verify_fs_notify_func_baton_t
{
/* notification function to call (must not be NULL) */
svn_repos_notify_func_t notify_func;
@@ -1396,23 +2334,53 @@ struct verify_fs2_notify_func_baton_t
/* Forward the notification to BATON. */
static void
-verify_fs2_notify_func(svn_revnum_t revision,
+verify_fs_notify_func(svn_revnum_t revision,
void *baton,
apr_pool_t *pool)
{
- struct verify_fs2_notify_func_baton_t *notify_baton = baton;
+ struct verify_fs_notify_func_baton_t *notify_baton = baton;
notify_baton->notify->revision = revision;
notify_baton->notify_func(notify_baton->notify_baton,
notify_baton->notify, pool);
}
+static svn_error_t *
+report_error(svn_revnum_t revision,
+ svn_error_t *verify_err,
+ svn_repos_verify_callback_t verify_callback,
+ void *verify_baton,
+ apr_pool_t *pool)
+{
+ if (verify_callback)
+ {
+ svn_error_t *cb_err;
+
+ /* The caller provided us with a callback, so make him responsible
+ for what's going to happen with the error. */
+ cb_err = verify_callback(verify_baton, revision, verify_err, pool);
+ svn_error_clear(verify_err);
+ SVN_ERR(cb_err);
+
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ /* No callback -- no second guessing. Just return the error. */
+ return svn_error_trace(verify_err);
+ }
+}
+
svn_error_t *
-svn_repos_verify_fs2(svn_repos_t *repos,
+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_func,
void *cancel_baton,
apr_pool_t *pool)
@@ -1423,7 +2391,8 @@ svn_repos_verify_fs2(svn_repos_t *repos,
apr_pool_t *iterpool = svn_pool_create(pool);
svn_repos_notify_t *notify;
svn_fs_progress_notify_func_t verify_notify = NULL;
- struct verify_fs2_notify_func_baton_t *verify_notify_baton = NULL;
+ struct verify_fs_notify_func_baton_t *verify_notify_baton = NULL;
+ svn_error_t *err;
/* Determine the current youngest revision of the filesystem. */
SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
@@ -1450,10 +2419,9 @@ svn_repos_verify_fs2(svn_repos_t *repos,
forwarding structure for notifications from inside svn_fs_verify(). */
if (notify_func)
{
- notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end,
- pool);
+ notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end, pool);
- verify_notify = verify_fs2_notify_func;
+ verify_notify = verify_fs_notify_func;
verify_notify_baton = apr_palloc(pool, sizeof(*verify_notify_baton));
verify_notify_baton->notify_func = notify_func;
verify_notify_baton->notify_baton = notify_baton;
@@ -1462,56 +2430,48 @@ svn_repos_verify_fs2(svn_repos_t *repos,
}
/* Verify global metadata and backend-specific data first. */
- SVN_ERR(svn_fs_verify(svn_fs_path(fs, pool), svn_fs_config(fs, pool),
- start_rev, end_rev,
- verify_notify, verify_notify_baton,
- cancel_func, cancel_baton, pool));
+ err = svn_fs_verify(svn_fs_path(fs, pool), svn_fs_config(fs, pool),
+ start_rev, end_rev,
+ verify_notify, verify_notify_baton,
+ cancel_func, cancel_baton, pool);
- for (rev = start_rev; rev <= end_rev; rev++)
+ if (err && err->apr_err == SVN_ERR_CANCELLED)
{
- const svn_delta_editor_t *dump_editor;
- void *dump_edit_baton;
- const svn_delta_editor_t *cancel_editor;
- void *cancel_edit_baton;
- svn_fs_root_t *to_root;
- apr_hash_t *props;
+ return svn_error_trace(err);
+ }
+ else if (err)
+ {
+ SVN_ERR(report_error(SVN_INVALID_REVNUM, err, verify_callback,
+ verify_baton, iterpool));
+ }
- svn_pool_clear(iterpool);
+ if (!metadata_only)
+ for (rev = start_rev; rev <= end_rev; rev++)
+ {
+ svn_pool_clear(iterpool);
- /* Get cancellable dump editor, but with our close_directory handler. */
- SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton,
- fs, rev, "",
- svn_stream_empty(iterpool),
- NULL, NULL,
- verify_close_directory,
- notify_func, notify_baton,
- start_rev,
- FALSE, TRUE, /* use_deltas, verify */
- iterpool));
- SVN_ERR(svn_delta_get_cancellation_editor(cancel_func, cancel_baton,
- dump_editor, dump_edit_baton,
- &cancel_editor,
- &cancel_edit_baton,
- iterpool));
-
- SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, iterpool));
- SVN_ERR(svn_fs_verify_root(to_root, iterpool));
-
- SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE,
- cancel_editor, cancel_edit_baton,
- NULL, NULL, iterpool));
- /* While our editor close_edit implementation is a no-op, we still
- do this for completeness. */
- SVN_ERR(cancel_editor->close_edit(cancel_edit_baton, iterpool));
-
- SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, iterpool));
+ /* Wrapper function to catch the possible errors. */
+ err = verify_one_revision(fs, rev, notify_func, notify_baton,
+ start_rev, check_normalization,
+ cancel_func, cancel_baton,
+ iterpool);
- if (notify_func)
- {
- notify->revision = rev;
- notify_func(notify_baton, notify, iterpool);
- }
- }
+ if (err && err->apr_err == SVN_ERR_CANCELLED)
+ {
+ return svn_error_trace(err);
+ }
+ else if (err)
+ {
+ SVN_ERR(report_error(rev, err, verify_callback, verify_baton,
+ iterpool));
+ }
+ else if (notify_func)
+ {
+ /* Tell the caller that we're done with this revision. */
+ notify->revision = rev;
+ notify_func(notify_baton, notify, iterpool);
+ }
+ }
/* We're done. */
if (notify_func)
@@ -1520,7 +2480,6 @@ svn_repos_verify_fs2(svn_repos_t *repos,
notify_func(notify_baton, notify, iterpool);
}
- /* Per-backend verification. */
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_repos/fs-wrap.c b/subversion/libsvn_repos/fs-wrap.c
index 006b286..b46cda6 100644
--- a/subversion/libsvn_repos/fs-wrap.c
+++ b/subversion/libsvn_repos/fs-wrap.c
@@ -36,6 +36,7 @@
#include "repos.h"
#include "svn_private_config.h"
#include "private/svn_repos_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_utf_private.h"
#include "private/svn_fspath.h"
@@ -66,13 +67,14 @@ svn_repos_fs_commit_txn(const char **conflict_p,
SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
SVN_ERR(svn_repos__hooks_pre_commit(repos, hooks_env, txn_name, pool));
- /* Remove any ephemeral transaction properties. */
+ /* Remove any ephemeral transaction properties. If the commit fails
+ we will attempt to restore the properties but if that fails, or
+ the process is killed, the properties will be lost. */
SVN_ERR(svn_fs_txn_proplist(&props, txn, pool));
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
{
- const void *key;
- apr_hash_this(hi, &key, NULL, NULL);
+ const char *key = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
@@ -87,7 +89,24 @@ svn_repos_fs_commit_txn(const char **conflict_p,
/* Commit. */
err = svn_fs_commit_txn(conflict_p, new_rev, txn, pool);
if (! SVN_IS_VALID_REVNUM(*new_rev))
- return err;
+ {
+ /* The commit failed, try to restore the ephemeral properties. */
+ iterpool = svn_pool_create(pool);
+ for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
+ {
+ const char *key = apr_hash_this_key(hi);
+ svn_string_t *val = apr_hash_this_val(hi);
+
+ svn_pool_clear(iterpool);
+
+ if (strncmp(key, SVN_PROP_TXN_PREFIX,
+ (sizeof(SVN_PROP_TXN_PREFIX) - 1)) == 0)
+ svn_error_clear(svn_fs_change_txn_prop(txn, key, val, iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ return err;
+ }
/* Run post-commit hooks. */
if ((err2 = svn_repos__hooks_post_commit(repos, hooks_env,
@@ -148,7 +167,7 @@ svn_repos_fs_begin_txn_for_commit2(svn_fs_txn_t **txn_p,
if (err)
return svn_error_compose_create(err, svn_fs_abort_txn(txn, pool));
- /* We have API promise that *TXN_P is unaffected on faulure. */
+ /* We have API promise that *TXN_P is unaffected on failure. */
*txn_p = txn;
return SVN_NO_ERROR;
}
@@ -488,115 +507,319 @@ svn_repos_fs_revision_proplist(apr_hash_t **table_p,
return SVN_NO_ERROR;
}
+struct lock_many_baton_t {
+ svn_boolean_t need_lock;
+ apr_array_header_t *paths;
+ svn_fs_lock_callback_t lock_callback;
+ void *lock_baton;
+ svn_error_t *cb_err;
+ apr_pool_t *pool;
+};
+
+/* Implements svn_fs_lock_callback_t. Used by svn_repos_fs_lock_many
+ and svn_repos_fs_unlock_many to record the paths for use by post-
+ hooks, forward to the supplied callback and record any callback
+ error. */
+static svn_error_t *
+lock_many_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_many_baton_t *b = lock_baton;
+
+ if (!b->cb_err && b->lock_callback)
+ b->cb_err = b->lock_callback(b->lock_baton, path, lock, fs_err, pool);
+
+ if ((b->need_lock && lock) || (!b->need_lock && !fs_err))
+ APR_ARRAY_PUSH(b->paths, const char *) = apr_pstrdup(b->pool, path);
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
-svn_repos_fs_lock(svn_lock_t **lock,
- svn_repos_t *repos,
- const char *path,
- const char *token,
- const char *comment,
- svn_boolean_t is_dav_comment,
- apr_time_t expiration_date,
- svn_revnum_t current_rev,
- svn_boolean_t steal_lock,
- apr_pool_t *pool)
+svn_repos_fs_lock_many(svn_repos_t *repos,
+ apr_hash_t *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)
{
- svn_error_t *err;
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
svn_fs_access_t *access_ctx = NULL;
const char *username = NULL;
- const char *new_token;
- apr_array_header_t *paths;
apr_hash_t *hooks_env;
+ apr_hash_t *pre_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct lock_many_baton_t baton;
+
+ if (!apr_hash_count(targets))
+ return SVN_NO_ERROR;
/* Parse the hooks-env file (if any). */
SVN_ERR(svn_repos__parse_hooks_env(&hooks_env, repos->hooks_env_path,
- pool, pool));
-
- /* Setup an array of paths in anticipation of the ra layers handling
- multiple locks in one request (1.3 most likely). This is only
- used by svn_repos__hooks_post_lock. */
- paths = apr_array_make(pool, 1, sizeof(const char *));
- APR_ARRAY_PUSH(paths, const char *) = path;
+ scratch_pool, scratch_pool));
SVN_ERR(svn_fs_get_access(&access_ctx, repos->fs));
if (access_ctx)
SVN_ERR(svn_fs_access_get_username(&username, access_ctx));
if (! username)
- return svn_error_createf
+ return svn_error_create
(SVN_ERR_FS_NO_USER, NULL,
- "Cannot lock path '%s', no authenticated username available.", path);
+ "Cannot lock path, no authenticated username available.");
/* Run pre-lock hook. This could throw error, preventing
- svn_fs_lock() from happening. */
- SVN_ERR(svn_repos__hooks_pre_lock(repos, hooks_env, &new_token, path,
- username, comment, steal_lock, pool));
- if (*new_token)
- token = new_token;
-
- /* Lock. */
- SVN_ERR(svn_fs_lock(lock, repos->fs, path, token, comment, is_dav_comment,
- expiration_date, current_rev, steal_lock, pool));
-
- /* Run post-lock hook. */
- if ((err = svn_repos__hooks_post_lock(repos, hooks_env,
- paths, username, pool)))
- return svn_error_create
- (SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED, err,
- "Lock succeeded, but post-lock hook failed");
+ svn_fs_lock2() from happening for that path. */
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *new_token;
+ svn_fs_lock_target_t *target;
+ const char *path = apr_hash_this_key(hi);
- return SVN_NO_ERROR;
+ svn_pool_clear(iterpool);
+
+ err = svn_repos__hooks_pre_lock(repos, hooks_env, &new_token, path,
+ username, comment, steal_lock, iterpool);
+ if (err)
+ {
+ if (!cb_err && lock_callback)
+ cb_err = lock_callback(lock_baton, path, NULL, err, iterpool);
+ svn_error_clear(err);
+
+ continue;
+ }
+
+ target = apr_hash_this_val(hi);
+ if (*new_token)
+ svn_fs_lock_target_set_token(target, new_token);
+ svn_hash_sets(pre_targets, path, target);
+ }
+
+ if (!apr_hash_count(pre_targets))
+ return svn_error_trace(cb_err);
+
+ baton.need_lock = TRUE;
+ baton.paths = apr_array_make(scratch_pool, apr_hash_count(pre_targets),
+ sizeof(const char *));
+ baton.lock_callback = lock_callback;
+ baton.lock_baton = lock_baton;
+ baton.cb_err = cb_err;
+ baton.pool = scratch_pool;
+
+ err = svn_fs_lock_many(repos->fs, pre_targets, comment,
+ is_dav_comment, expiration_date, steal_lock,
+ lock_many_cb, &baton, result_pool, iterpool);
+
+ /* If there are locks run the post-lock even if there is an error. */
+ if (baton.paths->nelts)
+ {
+ svn_error_t *perr = svn_repos__hooks_post_lock(repos, hooks_env,
+ baton.paths, username,
+ iterpool);
+ if (perr)
+ {
+ perr = svn_error_create(SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED, perr,
+ _("Locking succeeded, but post-lock hook failed"));
+ err = svn_error_compose_create(err, perr);
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
+
+ return svn_error_trace(err);
}
+struct lock_baton_t {
+ const svn_lock_t *lock;
+ svn_error_t *fs_err;
+};
+
+/* Implements svn_fs_lock_callback_t. Used by svn_repos_fs_lock and
+ svn_repos_fs_unlock to record the lock and error from
+ svn_repos_fs_lock_many and svn_repos_fs_unlock_many. */
+static svn_error_t *
+lock_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_baton_t *b = lock_baton;
+
+ b->lock = lock;
+ b->fs_err = svn_error_dup(fs_err);
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
-svn_repos_fs_unlock(svn_repos_t *repos,
- const char *path,
- const char *token,
- svn_boolean_t break_lock,
- apr_pool_t *pool)
+svn_repos_fs_lock(svn_lock_t **lock,
+ svn_repos_t *repos,
+ const char *path,
+ const char *token,
+ const char *comment,
+ svn_boolean_t is_dav_comment,
+ apr_time_t expiration_date,
+ svn_revnum_t current_rev,
+ svn_boolean_t steal_lock,
+ apr_pool_t *pool)
{
+ apr_hash_t *targets = apr_hash_make(pool);
+ svn_fs_lock_target_t *target = svn_fs_lock_target_create(token, current_rev,
+ pool);
svn_error_t *err;
+ struct lock_baton_t baton = {0};
+
+ svn_hash_sets(targets, path, target);
+
+ err = svn_repos_fs_lock_many(repos, targets, comment, is_dav_comment,
+ expiration_date, steal_lock, lock_cb, &baton,
+ pool, pool);
+
+ if (baton.lock)
+ *lock = (svn_lock_t*)baton.lock;
+
+ if (err && baton.fs_err)
+ svn_error_compose(err, baton.fs_err);
+ else if (!err)
+ err = baton.fs_err;
+
+ return svn_error_trace(err);
+}
+
+
+svn_error_t *
+svn_repos_fs_unlock_many(svn_repos_t *repos,
+ apr_hash_t *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)
+{
+ svn_error_t *err, *cb_err = SVN_NO_ERROR;
svn_fs_access_t *access_ctx = NULL;
const char *username = NULL;
- apr_array_header_t *paths;
apr_hash_t *hooks_env;
+ apr_hash_t *pre_targets = apr_hash_make(scratch_pool);
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct lock_many_baton_t baton;
+
+ if (!apr_hash_count(targets))
+ return SVN_NO_ERROR;
/* Parse the hooks-env file (if any). */
SVN_ERR(svn_repos__parse_hooks_env(&hooks_env, repos->hooks_env_path,
- pool, pool));
-
- /* Setup an array of paths in anticipation of the ra layers handling
- multiple locks in one request (1.3 most likely). This is only
- used by svn_repos__hooks_post_lock. */
- paths = apr_array_make(pool, 1, sizeof(const char *));
- APR_ARRAY_PUSH(paths, const char *) = path;
+ scratch_pool, scratch_pool));
SVN_ERR(svn_fs_get_access(&access_ctx, repos->fs));
if (access_ctx)
SVN_ERR(svn_fs_access_get_username(&username, access_ctx));
if (! break_lock && ! username)
- return svn_error_createf
+ return svn_error_create
(SVN_ERR_FS_NO_USER, NULL,
- _("Cannot unlock path '%s', no authenticated username available"),
- path);
+ _("Cannot unlock, no authenticated username available"));
/* Run pre-unlock hook. This could throw error, preventing
- svn_fs_unlock() from happening. */
- SVN_ERR(svn_repos__hooks_pre_unlock(repos, hooks_env, path, username, token,
- break_lock, pool));
+ svn_fs_unlock_many() from happening for that path. */
+ for (hi = apr_hash_first(scratch_pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *path = apr_hash_this_key(hi);
+ const char *token = apr_hash_this_val(hi);
- /* Unlock. */
- SVN_ERR(svn_fs_unlock(repos->fs, path, token, break_lock, pool));
+ svn_pool_clear(iterpool);
- /* Run post-unlock hook. */
- if ((err = svn_repos__hooks_post_unlock(repos, hooks_env, paths,
- username, pool)))
- return svn_error_create
- (SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED, err,
- _("Unlock succeeded, but post-unlock hook failed"));
+ err = svn_repos__hooks_pre_unlock(repos, hooks_env, path, username, token,
+ break_lock, iterpool);
+ if (err)
+ {
+ if (!cb_err && lock_callback)
+ cb_err = lock_callback(lock_baton, path, NULL, err, iterpool);
+ svn_error_clear(err);
- return SVN_NO_ERROR;
+ continue;
+ }
+
+ svn_hash_sets(pre_targets, path, token);
+ }
+
+ if (!apr_hash_count(pre_targets))
+ return svn_error_trace(cb_err);
+
+ baton.need_lock = FALSE;
+ baton.paths = apr_array_make(scratch_pool, apr_hash_count(pre_targets),
+ sizeof(const char *));
+ baton.lock_callback = lock_callback;
+ baton.lock_baton = lock_baton;
+ baton.cb_err = cb_err;
+ baton.pool = scratch_pool;
+
+ err = svn_fs_unlock_many(repos->fs, pre_targets, break_lock,
+ lock_many_cb, &baton, result_pool, iterpool);
+
+ /* If there are 'unlocks' run the post-unlock even if there is an error. */
+ if (baton.paths->nelts)
+ {
+ svn_error_t *perr = svn_repos__hooks_post_unlock(repos, hooks_env,
+ baton.paths,
+ username, iterpool);
+ if (perr)
+ {
+ perr = svn_error_create(SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED, perr,
+ _("Unlock succeeded, but post-unlock hook failed"));
+ err = svn_error_compose_create(err, perr);
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ if (err && cb_err)
+ svn_error_compose(err, cb_err);
+ else if (!err)
+ err = cb_err;
+
+ return svn_error_trace(err);
+}
+
+svn_error_t *
+svn_repos_fs_unlock(svn_repos_t *repos,
+ const char *path,
+ const char *token,
+ svn_boolean_t break_lock,
+ apr_pool_t *pool)
+{
+ apr_hash_t *targets = apr_hash_make(pool);
+ svn_error_t *err;
+ struct lock_baton_t baton = {0};
+
+ if (!token)
+ token = "";
+
+ svn_hash_sets(targets, path, token);
+
+ err = svn_repos_fs_unlock_many(repos, targets, break_lock, lock_cb, &baton,
+ pool, pool);
+
+ if (err && baton.fs_err)
+ svn_error_compose(err, baton.fs_err);
+ else if (!err)
+ err = baton.fs_err;
+
+ return svn_error_trace(err);
}
@@ -841,7 +1064,7 @@ svn_repos_fs_get_inherited_props(apr_array_header_t **inherited_props_p,
apr_pstrdup(result_pool, parent_path + 1);
i_props->prop_hash = parent_properties;
/* Build the output array in depth-first order. */
- svn_sort__array_insert(&i_props, inherited_props, 0);
+ svn_sort__array_insert(inherited_props, &i_props, 0);
}
}
}
diff --git a/subversion/libsvn_repos/hooks.c b/subversion/libsvn_repos/hooks.c
index 9727599..a4cc249 100644
--- a/subversion/libsvn_repos/hooks.c
+++ b/subversion/libsvn_repos/hooks.c
@@ -184,8 +184,8 @@ env_from_env_hash(apr_hash_t *env_hash,
for (hi = apr_hash_first(scratch_pool, env_hash); hi; hi = apr_hash_next(hi))
{
*envp = apr_psprintf(result_pool, "%s=%s",
- (const char *)svn__apr_hash_index_key(hi),
- (const char *)svn__apr_hash_index_val(hi));
+ (const char *)apr_hash_this_key(hi),
+ (const char *)apr_hash_this_val(hi));
envp++;
}
*envp = NULL;
@@ -318,7 +318,7 @@ check_hook_cmd(const char *hook, svn_boolean_t *broken_link, apr_pool_t *pool)
#ifdef WIN32
/* For WIN32, we need to check with file name extension(s) added.
- As Windows Scripting Host (.wsf) files can accomodate (at least)
+ As Windows Scripting Host (.wsf) files can accommodate (at least)
JavaScript (.js) and VB Script (.vbs) code, extensions for the
corresponding file types need not be enumerated explicitly. */
".exe", ".cmd", ".bat", ".wsf", /* ### Any other extensions? */
@@ -334,7 +334,7 @@ check_hook_cmd(const char *hook, svn_boolean_t *broken_link, apr_pool_t *pool)
for (extn = check_extns; *extn; ++extn)
{
const char *const hook_path =
- (**extn ? apr_pstrcat(pool, hook, *extn, (char *)NULL) : hook);
+ (**extn ? apr_pstrcat(pool, hook, *extn, SVN_VA_NULL) : hook);
svn_node_kind_t kind;
if (!(err = svn_io_check_resolved_path(hook_path, &kind, pool))
@@ -363,7 +363,7 @@ struct parse_hooks_env_option_baton {
* options apply. */
const char *section;
apr_hash_t *hooks_env;
-} parse_hooks_env_option_baton;
+};
/* An implementation of svn_config_enumerator2_t.
* Set environment variable NAME to value VALUE in the environment for
@@ -393,7 +393,7 @@ parse_hooks_env_option(const char *name, const char *value,
struct parse_hooks_env_section_baton {
svn_config_t *cfg;
apr_hash_t *hooks_env;
-} parse_hooks_env_section_baton;
+};
/* An implementation of svn_config_section_enumerator2_t. */
static svn_boolean_t
@@ -416,17 +416,25 @@ svn_repos__parse_hooks_env(apr_hash_t **hooks_env_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_config_t *cfg;
struct parse_hooks_env_section_baton b;
-
if (local_abspath)
{
- SVN_ERR(svn_config_read3(&cfg, local_abspath, FALSE,
- TRUE, TRUE, scratch_pool));
- b.cfg = cfg;
+ svn_node_kind_t kind;
+ SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
+
b.hooks_env = apr_hash_make(result_pool);
- (void)svn_config_enumerate_sections2(cfg, parse_hooks_env_section, &b,
- scratch_pool);
+
+ if (kind != svn_node_none)
+ {
+ svn_config_t *cfg;
+ SVN_ERR(svn_config_read3(&cfg, local_abspath, FALSE,
+ TRUE, TRUE, scratch_pool));
+ b.cfg = cfg;
+
+ (void)svn_config_enumerate_sections2(cfg, parse_hooks_env_section,
+ &b, scratch_pool);
+ }
+
*hooks_env_p = b.hooks_env;
}
else
@@ -511,15 +519,22 @@ lock_token_content(apr_file_t **handle, apr_hash_t *lock_tokens,
for (hi = apr_hash_first(pool, lock_tokens); hi;
hi = apr_hash_next(hi))
{
- void *val;
- const char *path, *token;
+ const char *token = apr_hash_this_key(hi);
+ const char *path = apr_hash_this_val(hi);
+
+ if (path == (const char *) 1)
+ {
+ /* Special handling for svn_fs_access_t * created by using deprecated
+ svn_fs_access_add_lock_token() function. */
+ path = "";
+ }
+ else
+ {
+ path = svn_path_uri_autoescape(path, pool);
+ }
- apr_hash_this(hi, (void *)&token, NULL, &val);
- path = val;
svn_stringbuf_appendstr(lock_str,
- svn_stringbuf_createf(pool, "%s|%s\n",
- svn_path_uri_autoescape(path, pool),
- token));
+ svn_stringbuf_createf(pool, "%s|%s\n", path, token));
}
svn_stringbuf_appendcstr(lock_str, "\n");
diff --git a/subversion/libsvn_repos/libsvn_repos.pc.in b/subversion/libsvn_repos/libsvn_repos.pc.in
new file mode 100644
index 0000000..af70b94
--- /dev/null
+++ b/subversion/libsvn_repos/libsvn_repos.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_repos
+Description: Subversion Repository Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_fs libsvn_delta libsvn_subr
+Libs: -L${libdir} -lsvn_repos
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_repos/load-fs-vtable.c b/subversion/libsvn_repos/load-fs-vtable.c
index d1aa339..ca3a5cd 100644
--- a/subversion/libsvn_repos/load-fs-vtable.c
+++ b/subversion/libsvn_repos/load-fs-vtable.c
@@ -31,19 +31,17 @@
#include "svn_string.h"
#include "svn_props.h"
#include "repos.h"
-#include "svn_private_config.h"
#include "svn_mergeinfo.h"
#include "svn_checksum.h"
#include "svn_subst.h"
-#include "svn_ctype.h"
#include "svn_dirent_uri.h"
#include <apr_lib.h>
-#include "private/svn_repos_private.h"
#include "private/svn_fspath.h"
#include "private/svn_dep_compat.h"
#include "private/svn_mergeinfo_private.h"
+#include "private/svn_repos_private.h"
/*----------------------------------------------------------------------*/
@@ -56,6 +54,7 @@ struct parse_baton
svn_boolean_t use_history;
svn_boolean_t validate_props;
+ svn_boolean_t ignore_dates;
svn_boolean_t use_pre_commit_hook;
svn_boolean_t use_post_commit_hook;
enum svn_repos_load_uuid uuid_action;
@@ -84,22 +83,27 @@ struct parse_baton
SVN_INVALID_REVNUM. */
svn_revnum_t last_rev_mapped;
- /* The oldest old revision loaded from the dump stream. If no revisions
+ /* The oldest revision loaded from the dump stream. If no revisions
have been loaded yet, this is set to SVN_INVALID_REVNUM. */
- svn_revnum_t oldest_old_rev;
+ svn_revnum_t oldest_dumpstream_rev;
};
struct revision_baton
{
+ /* rev num from dump file */
svn_revnum_t rev;
svn_fs_txn_t *txn;
svn_fs_root_t *txn_root;
const svn_string_t *datestamp;
+ /* (rev num from dump file) minus (rev num to be committed) */
apr_int32_t rev_offset;
svn_boolean_t skipped;
+ /* Array of svn_prop_t with revision properties. */
+ apr_array_header_t *revprops;
+
struct parse_baton *pb;
apr_pool_t *pool;
};
@@ -189,8 +193,6 @@ change_node_prop(svn_fs_root_t *txn_root,
/* Prepend the mergeinfo source paths in MERGEINFO_ORIG with PARENT_DIR, and
return it in *MERGEINFO_VAL. */
-/* ### FIXME: Consider somehow sharing code with
- ### svnrdump/load_editor.c:prefix_mergeinfo_paths() */
static svn_error_t *
prefix_mergeinfo_paths(svn_string_t **mergeinfo_val,
const svn_string_t *mergeinfo_orig,
@@ -199,17 +201,16 @@ prefix_mergeinfo_paths(svn_string_t **mergeinfo_val,
{
apr_hash_t *prefixed_mergeinfo, *mergeinfo;
apr_hash_index_t *hi;
- void *rangelist;
SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_orig->data, pool));
prefixed_mergeinfo = apr_hash_make(pool);
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const void *key;
- const char *path, *merge_source;
+ const char *merge_source = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
+ const char *path;
- apr_hash_this(hi, &key, NULL, &rangelist);
- merge_source = svn_relpath_canonicalize(key, pool);
+ merge_source = svn_relpath_canonicalize(merge_source, pool);
/* The svn:mergeinfo property syntax demands a repos abspath */
path = svn_fspath__canonicalize(svn_relpath_join(parent_dir,
@@ -223,13 +224,20 @@ prefix_mergeinfo_paths(svn_string_t **mergeinfo_val,
/* Examine the mergeinfo in INITIAL_VAL, renumber revisions in rangelists
as appropriate, and return the (possibly new) mergeinfo in *FINAL_VAL
- (allocated from POOL). */
-/* ### FIXME: Consider somehow sharing code with
- ### svnrdump/load_editor.c:renumber_mergeinfo_revs() */
+ (allocated from POOL).
+
+ 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 that become <= 0.
+ */
static svn_error_t *
renumber_mergeinfo_revs(svn_string_t **final_val,
const svn_string_t *initial_val,
- struct revision_baton *rb,
+ apr_hash_t *rev_map,
+ svn_revnum_t oldest_dumpstream_rev,
+ apr_int32_t older_revs_offset,
apr_pool_t *pool)
{
apr_pool_t *subpool = svn_pool_create(pool);
@@ -244,19 +252,22 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
Remove mergeinfo older than the oldest revision in the dump stream
and adjust its revisions by the difference between the head rev of
the target repository and the current dump stream rev. */
- if (rb->pb->oldest_old_rev > 1)
+ if (oldest_dumpstream_rev > 1)
{
+ /* predates_stream_mergeinfo := mergeinfo that refers to revs before
+ oldest_dumpstream_rev */
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
&predates_stream_mergeinfo, mergeinfo,
- rb->pb->oldest_old_rev - 1, 0,
+ oldest_dumpstream_rev - 1, 0,
TRUE, subpool, subpool));
+ /* mergeinfo := mergeinfo that refers to revs >= oldest_dumpstream_rev */
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
&mergeinfo, mergeinfo,
- rb->pb->oldest_old_rev - 1, 0,
+ oldest_dumpstream_rev - 1, 0,
FALSE, subpool, subpool));
SVN_ERR(svn_mergeinfo__adjust_mergeinfo_rangelists(
&predates_stream_mergeinfo, predates_stream_mergeinfo,
- -rb->rev_offset, subpool, subpool));
+ -older_revs_offset, subpool, subpool));
}
else
{
@@ -265,16 +276,9 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
for (hi = apr_hash_first(subpool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *merge_source;
- svn_rangelist_t *rangelist;
- struct parse_baton *pb = rb->pb;
+ const char *merge_source = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
int i;
- const void *key;
- void *val;
-
- apr_hash_this(hi, &key, NULL, &val);
- merge_source = key;
- rangelist = val;
/* Possibly renumber revisions in merge source's rangelist. */
for (i = 0; i < rangelist->nelts; i++)
@@ -282,27 +286,27 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
svn_revnum_t rev_from_map;
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, i,
svn_merge_range_t *);
- rev_from_map = get_revision_mapping(pb->rev_map, range->start);
+ rev_from_map = get_revision_mapping(rev_map, range->start);
if (SVN_IS_VALID_REVNUM(rev_from_map))
{
range->start = rev_from_map;
}
- else if (range->start == pb->oldest_old_rev - 1)
+ else if (range->start == oldest_dumpstream_rev - 1)
{
/* Since the start revision of svn_merge_range_t are not
inclusive there is one possible valid start revision that
- won't be found in the PB->REV_MAP mapping of load stream
+ won't be found in the REV_MAP mapping of load stream
revsions to loaded revisions: The revision immediately
- preceeding the oldest revision from the load stream.
+ preceding the oldest revision from the load stream.
This is a valid revision for mergeinfo, but not a valid
- copy from revision (which PB->REV_MAP also maps for) so it
+ copy from revision (which REV_MAP also maps for) so it
will never be in the mapping.
If that is what we have here, then find the mapping for the
oldest rev from the load stream and subtract 1 to get the
renumbered, non-inclusive, start revision. */
- rev_from_map = get_revision_mapping(pb->rev_map,
- pb->oldest_old_rev);
+ rev_from_map = get_revision_mapping(rev_map,
+ oldest_dumpstream_rev);
if (SVN_IS_VALID_REVNUM(rev_from_map))
range->start = rev_from_map - 1;
}
@@ -319,7 +323,7 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
continue;
}
- rev_from_map = get_revision_mapping(pb->rev_map, range->end);
+ rev_from_map = get_revision_mapping(rev_map, range->end);
if (SVN_IS_VALID_REVNUM(rev_from_map))
range->end = rev_from_map;
}
@@ -327,8 +331,10 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
}
if (predates_stream_mergeinfo)
+ {
SVN_ERR(svn_mergeinfo_merge2(final_mergeinfo, predates_stream_mergeinfo,
subpool, subpool));
+ }
SVN_ERR(svn_mergeinfo__canonicalize_ranges(final_mergeinfo, subpool));
@@ -343,6 +349,12 @@ renumber_mergeinfo_revs(svn_string_t **final_val,
/** vtable for doing commits to a fs **/
+/* Make a node baton, parsing the relevant HEADERS.
+ *
+ * If RB->pb->parent_dir:
+ * prefix it to NB->path
+ * prefix it to NB->copyfrom_path (if present)
+ */
static svn_error_t *
make_node_baton(struct node_baton **node_baton_p,
apr_hash_t *headers,
@@ -429,6 +441,10 @@ make_node_baton(struct node_baton **node_baton_p,
return SVN_NO_ERROR;
}
+/* Make a revision baton, parsing the relevant HEADERS.
+ *
+ * Set RB->skipped iff the revision number is outside the range given in PB.
+ */
static struct revision_baton *
make_revision_baton(apr_hash_t *headers,
struct parse_baton *pb,
@@ -440,6 +456,7 @@ make_revision_baton(apr_hash_t *headers,
rb->pb = pb;
rb->pool = pool;
rb->rev = SVN_INVALID_REVNUM;
+ rb->revprops = apr_array_make(rb->pool, 8, sizeof(svn_prop_t));
if ((val = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_REVISION_NUMBER)))
{
@@ -489,7 +506,8 @@ new_revision_record(void **revision_baton,
if ((rb->rev > 0) && (! rb->skipped))
{
/* Create a new fs txn. */
- SVN_ERR(svn_fs_begin_txn2(&(rb->txn), pb->fs, head_rev, 0, pool));
+ SVN_ERR(svn_fs_begin_txn2(&(rb->txn), pb->fs, head_rev,
+ SVN_FS_TXN_CLIENT_DATE, pool));
SVN_ERR(svn_fs_txn_root(&(rb->txn_root), rb->txn, pool));
if (pb->notify_func)
@@ -505,8 +523,8 @@ new_revision_record(void **revision_baton,
}
/* Stash the oldest "old" revision committed from the load stream. */
- if (!SVN_IS_VALID_REVNUM(pb->oldest_old_rev))
- pb->oldest_old_rev = rb->rev;
+ if (!SVN_IS_VALID_REVNUM(pb->oldest_dumpstream_rev))
+ pb->oldest_dumpstream_rev = rb->rev;
}
/* If we're skipping this revision, try to notify someone. */
@@ -522,7 +540,7 @@ new_revision_record(void **revision_baton,
svn_pool_clear(pb->notify_pool);
}
- /* If we're parsing revision 0, only the revision are (possibly)
+ /* If we're parsing revision 0, only the revision props are (possibly)
interesting to us: when loading the stream into an empty
filesystem, then we want new filesystem's revision 0 to have the
same props. Otherwise, we just ignore revision 0 in the stream. */
@@ -533,7 +551,11 @@ new_revision_record(void **revision_baton,
-/* Factorized helper func for new_node_record() */
+/* Perform a copy or a plain add.
+ *
+ * For a copy, also adjust the copy-from rev, check any copy-source checksum,
+ * and send a notification.
+ */
static svn_error_t *
maybe_add_with_history(struct node_baton *nb,
struct revision_baton *rb,
@@ -702,59 +724,50 @@ set_revision_property(void *baton,
const svn_string_t *value)
{
struct revision_baton *rb = baton;
+ struct parse_baton *pb = rb->pb;
+ svn_boolean_t is_date = strcmp(name, SVN_PROP_REVISION_DATE) == 0;
+ svn_prop_t *prop;
/* If we're skipping this revision, we're done here. */
if (rb->skipped)
return SVN_NO_ERROR;
- if (rb->rev > 0)
- {
- if (rb->pb->validate_props)
- SVN_ERR(svn_repos_fs_change_txn_prop(rb->txn, name, value, rb->pool));
- else
- SVN_ERR(svn_fs_change_txn_prop(rb->txn, name, value, rb->pool));
+ /* If we're ignoring dates, and this is one, we're done here. */
+ if (is_date && pb->ignore_dates)
+ return SVN_NO_ERROR;
- /* Remember any datestamp that passes through! (See comment in
- close_revision() below.) */
- if (! strcmp(name, SVN_PROP_REVISION_DATE))
- rb->datestamp = svn_string_dup(value, rb->pool);
- }
- else if (rb->rev == 0)
- {
- /* Special case: set revision 0 properties when loading into an
- 'empty' filesystem. */
- struct parse_baton *pb = rb->pb;
- svn_revnum_t youngest_rev;
+ /* Collect property changes to apply them in one FS call in
+ close_revision. */
+ prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t);
+ prop->name = apr_pstrdup(rb->pool, name);
+ prop->value = svn_string_dup(value, rb->pool);
- SVN_ERR(svn_fs_youngest_rev(&youngest_rev, pb->fs, rb->pool));
-
- if (youngest_rev == 0)
- SVN_ERR(change_rev_prop(pb->repos, 0, name, value,
- pb->validate_props, rb->pool));
- }
+ /* Remember any datestamp that passes through! (See comment in
+ close_revision() below.) */
+ if (is_date)
+ rb->datestamp = svn_string_dup(value, rb->pool);
return SVN_NO_ERROR;
}
-/* Adjust mergeinfo:
- * - normalize line endings (if all CRLF, change to LF; but error if mixed);
- * - adjust revision numbers (see renumber_mergeinfo_revs());
- * - adjust paths (see prefix_mergeinfo_paths()).
- */
-static svn_error_t *
-adjust_mergeinfo_property(struct revision_baton *rb,
- svn_string_t **new_value_p,
- const svn_string_t *old_value,
- apr_pool_t *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)
{
- struct parse_baton *pb = rb->pb;
svn_string_t prop_val = *old_value;
/* Tolerate mergeinfo with "\r\n" line endings because some
dumpstream sources might contain as much. If so normalize
- the line endings to '\n' and make a notification to
- PARSE_BATON->FEEDBACK_STREAM that we have made this
+ the line endings to '\n' and notify that we have made this
correction. */
if (strstr(prop_val.data, "\r"))
{
@@ -770,28 +783,29 @@ adjust_mergeinfo_property(struct revision_baton *rb,
prop_val.data = prop_eol_normalized;
prop_val.len = strlen(prop_eol_normalized);
- if (pb->notify_func)
+ if (notify_func)
{
- /* ### TODO: Use proper scratch pool instead of pb->notify_pool */
svn_repos_notify_t *notify
= svn_repos_notify_create(
svn_repos_notify_load_normalized_mergeinfo,
- pb->notify_pool);
+ scratch_pool);
- pb->notify_func(pb->notify_baton, notify, pb->notify_pool);
- svn_pool_clear(pb->notify_pool);
+ notify_func(notify_baton, notify, scratch_pool);
}
}
/* Renumber mergeinfo as appropriate. */
- SVN_ERR(renumber_mergeinfo_revs(new_value_p, &prop_val, rb,
+ SVN_ERR(renumber_mergeinfo_revs(new_value_p, &prop_val,
+ rev_map, oldest_dumpstream_rev,
+ older_revs_offset,
result_pool));
- if (pb->parent_dir)
+
+ if (parent_dir)
{
- /* Prefix the merge source paths with PB->parent_dir. */
+ /* Prefix the merge source paths with PARENT_DIR. */
/* ASSUMPTION: All source paths are included in the dump stream. */
SVN_ERR(prefix_mergeinfo_paths(new_value_p, *new_value_p,
- pb->parent_dir, result_pool));
+ parent_dir, result_pool));
}
return SVN_NO_ERROR;
@@ -821,7 +835,14 @@ set_node_property(void *baton,
svn_string_t *new_value;
svn_error_t *err;
- err = adjust_mergeinfo_property(rb, &new_value, value, nb->pool);
+ err = svn_repos__adjust_mergeinfo_property(&new_value, value,
+ pb->parent_dir,
+ pb->rev_map,
+ pb->oldest_dumpstream_rev,
+ rb->rev_offset,
+ pb->notify_func, pb->notify_baton,
+ nb->pool, pb->notify_pool);
+ svn_pool_clear(pb->notify_pool);
if (err)
{
if (pb->validate_props)
@@ -836,7 +857,7 @@ set_node_property(void *baton,
= svn_repos_notify_create(svn_repos_notify_warning,
pb->notify_pool);
- notify->warning = svn_repos__notify_warning_invalid_mergeinfo;
+ notify->warning = svn_repos_notify_warning_invalid_mergeinfo;
notify->warning_str = _("Invalid svn:mergeinfo value; "
"leaving unchanged");
pb->notify_func(pb->notify_baton, notify, pb->notify_pool);
@@ -888,9 +909,8 @@ remove_node_props(void *baton)
for (hi = apr_hash_first(nb->pool, proplist); hi; hi = apr_hash_next(hi))
{
- const void *key;
+ const char *key = apr_hash_this_key(hi);
- apr_hash_this(hi, &key, NULL, NULL);
SVN_ERR(change_node_prop(rb->txn_root, nb->path, key, NULL,
rb->pb->validate_props, nb->pool));
}
@@ -983,11 +1003,58 @@ close_revision(void *baton)
const char *txn_name = NULL;
apr_hash_t *hooks_env;
- /* If we're skipping this revision or it has an invalid revision
- number, we're done here. */
- if (rb->skipped || (rb->rev <= 0))
+ /* If we're skipping this revision we're done here. */
+ if (rb->skipped)
return SVN_NO_ERROR;
+ if (rb->rev == 0)
+ {
+ /* Special case: set revision 0 properties when loading into an
+ 'empty' filesystem. */
+ svn_revnum_t youngest_rev;
+
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, pb->fs, rb->pool));
+
+ if (youngest_rev == 0)
+ {
+ apr_hash_t *orig_props;
+ apr_hash_t *new_props;
+ apr_array_header_t *diff;
+ int i;
+
+ SVN_ERR(svn_fs_revision_proplist(&orig_props, pb->fs, 0, rb->pool));
+ new_props = svn_prop_array_to_hash(rb->revprops, rb->pool);
+ SVN_ERR(svn_prop_diffs(&diff, new_props, orig_props, rb->pool));
+
+ for (i = 0; i < diff->nelts; i++)
+ {
+ const svn_prop_t *prop = &APR_ARRAY_IDX(diff, i, svn_prop_t);
+
+ SVN_ERR(change_rev_prop(pb->repos, 0, prop->name, prop->value,
+ pb->validate_props, rb->pool));
+ }
+ }
+
+ return SVN_NO_ERROR;
+ }
+
+ /* If the dumpstream doesn't have an 'svn:date' property and we
+ aren't ignoring the dates in the dumpstream altogether, remove
+ any 'svn:date' revision property that was set by FS layer when
+ the TXN was created. */
+ if (! (pb->ignore_dates || rb->datestamp))
+ {
+ svn_prop_t *prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t);
+ prop->name = SVN_PROP_REVISION_DATE;
+ prop->value = NULL;
+ }
+
+ /* Apply revision property changes. */
+ if (rb->pb->validate_props)
+ SVN_ERR(svn_repos_fs_change_txn_props(rb->txn, rb->revprops, rb->pool));
+ else
+ SVN_ERR(svn_fs_change_txn_props(rb->txn, rb->revprops, rb->pool));
+
/* Get the txn name and hooks environment if they will be needed. */
if (pb->use_pre_commit_hook || pb->use_post_commit_hook)
{
@@ -1073,15 +1140,6 @@ close_revision(void *baton)
/* Deltify the predecessors of paths changed in this revision. */
SVN_ERR(svn_fs_deltify_revision(pb->fs, committed_rev, rb->pool));
- /* Grrr, svn_fs_commit_txn rewrites the datestamp property to the
- current clock-time. We don't want that, we want to preserve
- history exactly. Good thing revision props aren't versioned!
- Note that if rb->datestamp is NULL, that's fine -- if the dump
- data doesn't carry a datestamp, we want to preserve that fact in
- the load. */
- SVN_ERR(change_rev_prop(pb->repos, committed_rev, SVN_PROP_REVISION_DATE,
- rb->datestamp, pb->validate_props, rb->pool));
-
if (pb->notify_func)
{
/* ### TODO: Use proper scratch pool instead of pb->notify_pool */
@@ -1107,7 +1165,7 @@ close_revision(void *baton)
svn_error_t *
-svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks,
+svn_repos_get_fs_build_parser5(const svn_repos_parse_fns3_t **callbacks,
void **parse_baton,
svn_repos_t *repos,
svn_revnum_t start_rev,
@@ -1116,6 +1174,9 @@ svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks,
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)
@@ -1157,10 +1218,13 @@ svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks,
pb->pool = pool;
pb->notify_pool = svn_pool_create(pool);
pb->rev_map = apr_hash_make(pool);
- pb->oldest_old_rev = SVN_INVALID_REVNUM;
+ pb->oldest_dumpstream_rev = SVN_INVALID_REVNUM;
pb->last_rev_mapped = SVN_INVALID_REVNUM;
pb->start_rev = start_rev;
pb->end_rev = end_rev;
+ pb->use_pre_commit_hook = use_pre_commit_hook;
+ pb->use_post_commit_hook = use_post_commit_hook;
+ pb->ignore_dates = ignore_dates;
*callbacks = parser;
*parse_baton = pb;
@@ -1168,9 +1232,8 @@ svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **callbacks,
}
-
svn_error_t *
-svn_repos_load_fs4(svn_repos_t *repos,
+svn_repos_load_fs5(svn_repos_t *repos,
svn_stream_t *dumpstream,
svn_revnum_t start_rev,
svn_revnum_t end_rev,
@@ -1179,6 +1242,7 @@ svn_repos_load_fs4(svn_repos_t *repos,
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,
@@ -1187,27 +1251,23 @@ svn_repos_load_fs4(svn_repos_t *repos,
{
const svn_repos_parse_fns3_t *parser;
void *parse_baton;
- struct parse_baton *pb;
/* This is really simple. */
- SVN_ERR(svn_repos_get_fs_build_parser4(&parser, &parse_baton,
+ SVN_ERR(svn_repos_get_fs_build_parser5(&parser, &parse_baton,
repos,
start_rev, end_rev,
TRUE, /* look for copyfrom revs */
validate_props,
uuid_action,
parent_dir,
+ use_pre_commit_hook,
+ use_post_commit_hook,
+ ignore_dates,
notify_func,
notify_baton,
pool));
- /* Heh. We know this is a parse_baton. This file made it. So
- cast away, and set our hook booleans. */
- pb = parse_baton;
- pb->use_pre_commit_hook = use_pre_commit_hook;
- pb->use_post_commit_hook = use_post_commit_hook;
-
return svn_repos_parse_dumpstream3(dumpstream, parser, parse_baton, FALSE,
cancel_func, cancel_baton, pool);
}
diff --git a/subversion/libsvn_repos/load.c b/subversion/libsvn_repos/load.c
index 691ff92..96eda85 100644
--- a/subversion/libsvn_repos/load.c
+++ b/subversion/libsvn_repos/load.c
@@ -21,26 +21,18 @@
*/
-#include "svn_private_config.h"
+#include <apr.h>
+
#include "svn_hash.h"
#include "svn_pools.h"
#include "svn_error.h"
-#include "svn_fs.h"
#include "svn_repos.h"
#include "svn_string.h"
-#include "svn_path.h"
-#include "svn_props.h"
#include "repos.h"
#include "svn_private_config.h"
-#include "svn_mergeinfo.h"
-#include "svn_checksum.h"
-#include "svn_subst.h"
#include "svn_ctype.h"
-#include <apr_lib.h>
-
#include "private/svn_dep_compat.h"
-#include "private/svn_mergeinfo_private.h"
/*----------------------------------------------------------------------*/
@@ -150,7 +142,7 @@ read_key_or_val(char **pbuf,
char c;
numread = len;
- SVN_ERR(svn_stream_read(stream, buf, &numread));
+ SVN_ERR(svn_stream_read_full(stream, buf, &numread));
*actual_length += numread;
if (numread != len)
return svn_error_trace(stream_ran_dry());
@@ -158,7 +150,7 @@ read_key_or_val(char **pbuf,
/* Suck up extra newline after key data */
numread = 1;
- SVN_ERR(svn_stream_read(stream, &c, &numread));
+ SVN_ERR(svn_stream_read_full(stream, &c, &numread));
*actual_length += numread;
if (numread != 1)
return svn_error_trace(stream_ran_dry());
@@ -291,7 +283,8 @@ parse_property_block(svn_stream_t *stream,
}
-/* Read CONTENT_LENGTH bytes from STREAM, and use
+/* Read CONTENT_LENGTH bytes from STREAM. If IS_DELTA is true, use
+ PARSE_FNS->apply_textdelta to push a text delta, otherwise use
PARSE_FNS->set_fulltext to push those bytes as replace fulltext for
a node. Use BUFFER/BUFLEN to push the fulltext in "chunks".
@@ -324,15 +317,6 @@ parse_text_block(svn_stream_t *stream,
SVN_ERR(parse_fns->set_fulltext(&text_stream, record_baton));
}
- /* If there are no contents to read, just write an empty buffer
- through our callback. */
- if (content_length == 0)
- {
- wlen = 0;
- if (text_stream)
- SVN_ERR(svn_stream_write(text_stream, "", &wlen));
- }
-
/* Regardless of whether or not we have a sink for our data, we
need to read it. */
while (content_length)
@@ -343,7 +327,7 @@ parse_text_block(svn_stream_t *stream,
rlen = (apr_size_t) content_length;
num_to_read = rlen;
- SVN_ERR(svn_stream_read(stream, buffer, &rlen));
+ SVN_ERR(svn_stream_read_full(stream, buffer, &rlen));
content_length -= rlen;
if (rlen != num_to_read)
return stream_ran_dry();
@@ -654,7 +638,7 @@ svn_repos_parse_dumpstream3(svn_stream_t *stream,
rlen = (apr_size_t) remaining;
num_to_read = rlen;
- SVN_ERR(svn_stream_read(stream, buffer, &rlen));
+ SVN_ERR(svn_stream_read_full(stream, buffer, &rlen));
remaining -= rlen;
if (rlen != num_to_read)
return stream_ran_dry();
diff --git a/subversion/libsvn_repos/log.c b/subversion/libsvn_repos/log.c
index 8ca870b..82caf02 100644
--- a/subversion/libsvn_repos/log.c
+++ b/subversion/libsvn_repos/log.c
@@ -39,8 +39,10 @@
#include "svn_mergeinfo.h"
#include "repos.h"
#include "private/svn_fspath.h"
+#include "private/svn_fs_private.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_subr_private.h"
+#include "private/svn_sorts_private.h"
@@ -80,14 +82,11 @@ svn_repos_check_revision_access(svn_repos_revision_access_level_t *access_level,
subpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
{
- const void *key;
- void *val;
- svn_fs_path_change2_t *change;
+ const char *key = apr_hash_this_key(hi);
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
svn_boolean_t readable;
svn_pool_clear(subpool);
- apr_hash_this(hi, &key, NULL, &val);
- change = val;
SVN_ERR(authz_read_func(&readable, rev_root, key,
authz_read_baton, subpool));
@@ -169,18 +168,23 @@ svn_repos_check_revision_access(svn_repos_revision_access_level_t *access_level,
* AUTHZ_READ_BATON and FS) to check whether each changed-path (and
* copyfrom_path) is readable:
*
+ * - If absolutely every changed-path (and copyfrom_path) is
+ * readable, then return the full CHANGED hash, and set
+ * *ACCESS_LEVEL to svn_repos_revision_access_full.
+ *
* - If some paths are readable and some are not, then silently
- * omit the unreadable paths from the CHANGED hash, and return
- * SVN_ERR_AUTHZ_PARTIALLY_READABLE.
+ * omit the unreadable paths from the CHANGED hash, and set
+ * *ACCESS_LEVEL to svn_repos_revision_access_partial.
*
* - If absolutely every changed-path (and copyfrom_path) is
- * unreadable, then return an empty CHANGED hash and
- * SVN_ERR_AUTHZ_UNREADABLE. (This is to distinguish a revision
- * which truly has no changed paths from a revision in which all
- * paths are unreadable.)
+ * unreadable, then return an empty CHANGED hash, and set
+ * *ACCESS_LEVEL to svn_repos_revision_access_none. (This is
+ * to distinguish a revision which truly has no changed paths
+ * from a revision in which all paths are unreadable.)
*/
static svn_error_t *
-detect_changed(apr_hash_t **changed,
+detect_changed(svn_repos_revision_access_level_t *access_level,
+ apr_hash_t **changed,
svn_fs_root_t *root,
svn_fs_t *fs,
apr_hash_t *prefetched_changes,
@@ -190,39 +194,50 @@ detect_changed(apr_hash_t **changed,
{
apr_hash_t *changes = prefetched_changes;
apr_hash_index_t *hi;
- apr_pool_t *subpool;
+ apr_pool_t *iterpool;
svn_boolean_t found_readable = FALSE;
svn_boolean_t found_unreadable = FALSE;
- *changed = svn_hash__make(pool);
+ /* If we create the CHANGES hash ourselves, we can reuse it as the
+ * result hash as it contains the exact same keys - but with _all_
+ * values being replaced by structs of a different type. */
if (changes == NULL)
- SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ {
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
- if (apr_hash_count(changes) == 0)
- /* No paths changed in this revision? Uh, sure, I guess the
- revision is readable, then. */
- return SVN_NO_ERROR;
+ /* If we are going to filter the results, we won't use the exact
+ * same keys but put them into a new hash. */
+ if (authz_read_func)
+ *changed = svn_hash__make(pool);
+ else
+ *changed = changes;
+ }
+ else
+ {
+ *changed = svn_hash__make(pool);
+ }
- subpool = svn_pool_create(pool);
+ if (apr_hash_count(changes) == 0)
+ {
+ /* No paths changed in this revision? Uh, sure, I guess the
+ revision is readable, then. */
+ *access_level = svn_repos_revision_access_full;
+ return SVN_NO_ERROR;
+ }
+ iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
{
/* NOTE: Much of this loop is going to look quite similar to
svn_repos_check_revision_access(), but we have to do more things
here, so we'll live with the duplication. */
- const void *key;
- void *val;
- svn_fs_path_change2_t *change;
- const char *path;
+ const char *path = apr_hash_this_key(hi);
+ apr_ssize_t path_len = apr_hash_this_key_len(hi);
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
char action;
svn_log_changed_path2_t *item;
- svn_pool_clear(subpool);
-
- /* KEY will be the path, VAL the change. */
- apr_hash_this(hi, &key, NULL, &val);
- path = (const char *) key;
- change = val;
+ svn_pool_clear(iterpool);
/* Skip path if unreadable. */
if (authz_read_func)
@@ -230,7 +245,7 @@ detect_changed(apr_hash_t **changed,
svn_boolean_t readable;
SVN_ERR(authz_read_func(&readable,
root, path,
- authz_read_baton, subpool));
+ authz_read_baton, iterpool));
if (! readable)
{
found_unreadable = TRUE;
@@ -288,24 +303,26 @@ detect_changed(apr_hash_t **changed,
svn_revnum_t prev_rev;
const char *parent_path, *name;
- svn_fspath__split(&parent_path, &name, path, subpool);
+ svn_fspath__split(&parent_path, &name, path, iterpool);
- SVN_ERR(svn_fs_node_history(&history, root, parent_path,
- subpool));
+ SVN_ERR(svn_fs_node_history2(&history, root, parent_path,
+ iterpool, iterpool));
/* Two calls because the first call returns the original
revision as the deleted child means it is 'interesting' */
- SVN_ERR(svn_fs_history_prev(&history, history, TRUE, subpool));
- SVN_ERR(svn_fs_history_prev(&history, history, TRUE, subpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, TRUE, iterpool,
+ iterpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, TRUE, iterpool,
+ iterpool));
SVN_ERR(svn_fs_history_location(&parent_path, &prev_rev, history,
- subpool));
- SVN_ERR(svn_fs_revision_root(&check_root, fs, prev_rev, subpool));
- check_path = svn_fspath__join(parent_path, name, subpool);
+ iterpool));
+ SVN_ERR(svn_fs_revision_root(&check_root, fs, prev_rev, iterpool));
+ check_path = svn_fspath__join(parent_path, name, iterpool);
}
SVN_ERR(svn_fs_check_path(&item->node_kind, check_root, check_path,
- subpool));
+ iterpool));
}
@@ -318,8 +335,11 @@ detect_changed(apr_hash_t **changed,
we will follow the DAG from ROOT to PATH and that requires
actually reading the directories along the way. */
if (!change->copyfrom_known)
- SVN_ERR(svn_fs_copied_from(&copyfrom_rev, &copyfrom_path,
- root, path, subpool));
+ {
+ SVN_ERR(svn_fs_copied_from(&copyfrom_rev, &copyfrom_path,
+ root, path, iterpool));
+ copyfrom_path = apr_pstrdup(pool, copyfrom_path);
+ }
if (copyfrom_path && SVN_IS_VALID_REVNUM(copyfrom_rev))
{
@@ -330,37 +350,43 @@ detect_changed(apr_hash_t **changed,
svn_fs_root_t *copyfrom_root;
SVN_ERR(svn_fs_revision_root(&copyfrom_root, fs,
- copyfrom_rev, subpool));
+ copyfrom_rev, iterpool));
SVN_ERR(authz_read_func(&readable,
copyfrom_root, copyfrom_path,
- authz_read_baton, subpool));
+ authz_read_baton, iterpool));
if (! readable)
found_unreadable = TRUE;
}
if (readable)
{
- item->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
+ item->copyfrom_path = copyfrom_path;
item->copyfrom_rev = copyfrom_rev;
}
}
}
- svn_hash_sets(*changed, apr_pstrdup(pool, path), item);
+
+ apr_hash_set(*changed, path, path_len, item);
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
if (! found_readable)
- /* Every changed-path was unreadable. */
- return svn_error_create(SVN_ERR_AUTHZ_UNREADABLE,
- NULL, NULL);
-
- if (found_unreadable)
- /* At least one changed-path was unreadable. */
- return svn_error_create(SVN_ERR_AUTHZ_PARTIALLY_READABLE,
- NULL, NULL);
+ {
+ /* Every changed-path was unreadable. */
+ *access_level = svn_repos_revision_access_none;
+ }
+ else if (found_unreadable)
+ {
+ /* At least one changed-path was unreadable. */
+ *access_level = svn_repos_revision_access_partial;
+ }
+ else
+ {
+ /* Every changed-path was readable. */
+ *access_level = svn_repos_revision_access_full;
+ }
- /* Every changed-path was readable. */
return SVN_NO_ERROR;
}
@@ -410,7 +436,8 @@ get_history(struct path_info *info,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
svn_revnum_t start,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_fs_root_t *history_root = NULL;
svn_fs_history_t *hist;
@@ -421,27 +448,30 @@ get_history(struct path_info *info,
{
subpool = info->newpool;
- SVN_ERR(svn_fs_history_prev(&info->hist, info->hist, ! strict, subpool));
+ SVN_ERR(svn_fs_history_prev2(&info->hist, info->hist, ! strict,
+ subpool, scratch_pool));
hist = info->hist;
}
else
{
- subpool = svn_pool_create(pool);
+ subpool = svn_pool_create(result_pool);
/* Open the history located at the last rev we were at. */
SVN_ERR(svn_fs_revision_root(&history_root, fs, info->history_rev,
subpool));
- SVN_ERR(svn_fs_node_history(&hist, history_root, info->path->data,
- subpool));
+ SVN_ERR(svn_fs_node_history2(&hist, history_root, info->path->data,
+ subpool, scratch_pool));
- SVN_ERR(svn_fs_history_prev(&hist, hist, ! strict, subpool));
+ SVN_ERR(svn_fs_history_prev2(&hist, hist, ! strict, subpool,
+ scratch_pool));
if (info->first_time)
info->first_time = FALSE;
else
- SVN_ERR(svn_fs_history_prev(&hist, hist, ! strict, subpool));
+ SVN_ERR(svn_fs_history_prev2(&hist, hist, ! strict, subpool,
+ scratch_pool));
}
if (! hist)
@@ -476,11 +506,11 @@ get_history(struct path_info *info,
svn_boolean_t readable;
SVN_ERR(svn_fs_revision_root(&history_root, fs,
info->history_rev,
- subpool));
+ scratch_pool));
SVN_ERR(authz_read_func(&readable, history_root,
info->path->data,
authz_read_baton,
- subpool));
+ scratch_pool));
if (! readable)
info->done = TRUE;
}
@@ -518,7 +548,8 @@ check_history(svn_boolean_t *changed,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
svn_revnum_t start,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
/* If we're already done with histories for this path,
don't try to fetch any more. */
@@ -537,7 +568,7 @@ check_history(svn_boolean_t *changed,
rev where this path was changed. */
*changed = TRUE;
return get_history(info, fs, strict, authz_read_func,
- authz_read_baton, start, pool);
+ authz_read_baton, start, result_pool, scratch_pool);
}
/* Return the next interesting revision in our list of HISTORIES. */
@@ -562,7 +593,7 @@ next_history_rev(const apr_array_header_t *histories)
/* Set *DELETED_MERGEINFO_CATALOG and *ADDED_MERGEINFO_CATALOG to
catalogs describing how mergeinfo values on paths (which are the
- keys of those catalogs) were changed in REV. If *PREFETCHED_CAHNGES
+ keys of those catalogs) were changed in REV. If *PREFETCHED_CHANGES
already contains the changed paths for REV, use that. Otherwise,
request that data and return it in *PREFETCHED_CHANGES. */
/* ### TODO: This would make a *great*, useful public function,
@@ -575,11 +606,12 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
svn_revnum_t rev,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
-
{
svn_fs_root_t *root;
apr_pool_t *iterpool;
apr_hash_index_t *hi;
+ svn_boolean_t any_mergeinfo = FALSE;
+ svn_boolean_t any_copy = FALSE;
/* Initialize return variables. */
*deleted_mergeinfo_catalog = svn_hash__make(result_pool);
@@ -595,8 +627,33 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
if (*prefetched_changes == NULL)
SVN_ERR(svn_fs_paths_changed2(prefetched_changes, root, scratch_pool));
- /* No changed paths? We're done. */
- if (apr_hash_count(*prefetched_changes) == 0)
+ /* Look for copies and (potential) mergeinfo changes.
+ We will use both flags to take shortcuts further down the road. */
+ for (hi = apr_hash_first(scratch_pool, *prefetched_changes);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
+
+ /* If there was a prop change and we are not positive that _no_
+ mergeinfo change happened, we must assume that it might have. */
+ if (change->mergeinfo_mod != svn_tristate_false && change->prop_mod)
+ any_mergeinfo = TRUE;
+
+ switch (change->change_kind)
+ {
+ case svn_fs_path_change_add:
+ case svn_fs_path_change_replace:
+ any_copy = TRUE;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /* No potential mergeinfo changes? We're done. */
+ if (! any_mergeinfo)
return SVN_NO_ERROR;
/* Loop over changes, looking for anything that might carry an
@@ -607,25 +664,27 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
hi;
hi = apr_hash_next(hi))
{
- const void *key;
- void *val;
- svn_fs_path_change2_t *change;
- const char *changed_path, *base_path = NULL;
+ const char *changed_path;
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
+ const char *base_path = NULL;
svn_revnum_t base_rev = SVN_INVALID_REVNUM;
svn_fs_root_t *base_root = NULL;
svn_string_t *prev_mergeinfo_value = NULL, *mergeinfo_value;
- svn_pool_clear(iterpool);
+ /* Cheap pre-checks that don't require memory allocation etc. */
- /* KEY will be the path, VAL the change. */
- apr_hash_this(hi, &key, NULL, &val);
- changed_path = key;
- change = val;
+ /* No mergeinfo change? -> nothing to do here. */
+ if (change->mergeinfo_mod == svn_tristate_false)
+ continue;
/* If there was no property change on this item, ignore it. */
if (! change->prop_mod)
continue;
+ /* Begin actual processing */
+ changed_path = apr_hash_this_key(hi);
+ svn_pool_clear(iterpool);
+
switch (change->change_kind)
{
@@ -634,25 +693,6 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
### difference would be the fallback case (path/rev-1 for
### modifies, NULL otherwise). -- cmpilato */
- /* If the path was added or replaced, see if it was created via
- copy. If so, that will tell us where its previous location
- was. If not, there's no previous location to examine. */
- case svn_fs_path_change_add:
- case svn_fs_path_change_replace:
- {
- const char *copyfrom_path;
- svn_revnum_t copyfrom_rev;
-
- SVN_ERR(svn_fs_copied_from(&copyfrom_rev, &copyfrom_path,
- root, changed_path, iterpool));
- if (copyfrom_path && SVN_IS_VALID_REVNUM(copyfrom_rev))
- {
- base_path = apr_pstrdup(scratch_pool, copyfrom_path);
- base_rev = copyfrom_rev;
- }
- break;
- }
-
/* If the path was merely modified, see if its previous
location was affected by a copy which happened in this
revision before assuming it holds the same path it did the
@@ -661,15 +701,26 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
{
svn_revnum_t appeared_rev;
- SVN_ERR(svn_repos__prev_location(&appeared_rev, &base_path,
- &base_rev, fs, rev,
- changed_path, iterpool));
-
- /* If this path isn't the result of a copy that occurred
- in this revision, we can find the previous version of
- it in REV - 1 at the same path. */
- if (! (base_path && SVN_IS_VALID_REVNUM(base_rev)
- && (appeared_rev == rev)))
+ /* If there were no copies in this revision, the path will have
+ existed in the previous rev. Otherwise, we might just got
+ copied here and need to check for that eventuality. */
+ if (any_copy)
+ {
+ SVN_ERR(svn_repos__prev_location(&appeared_rev, &base_path,
+ &base_rev, fs, rev,
+ changed_path, iterpool));
+
+ /* If this path isn't the result of a copy that occurred
+ in this revision, we can find the previous version of
+ it in REV - 1 at the same path. */
+ if (! (base_path && SVN_IS_VALID_REVNUM(base_rev)
+ && (appeared_rev == rev)))
+ {
+ base_path = changed_path;
+ base_rev = rev - 1;
+ }
+ }
+ else
{
base_path = changed_path;
base_rev = rev - 1;
@@ -677,6 +728,26 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
break;
}
+ /* If the path was added or replaced, see if it was created via
+ copy. If so, set BASE_REV/BASE_PATH to its previous location.
+ If not, there's no previous location to examine -- leave
+ BASE_REV/BASE_PATH = -1/NULL. */
+ case svn_fs_path_change_add:
+ case svn_fs_path_change_replace:
+ {
+ if (change->copyfrom_known)
+ {
+ base_rev = change->copyfrom_rev;
+ base_path = change->copyfrom_path;
+ }
+ else
+ {
+ SVN_ERR(svn_fs_copied_from(&base_rev, &base_path,
+ root, changed_path, iterpool));
+ }
+ break;
+ }
+
/* We don't care about any of the other cases. */
case svn_fs_path_change_delete:
case svn_fs_path_change_reset:
@@ -704,22 +775,23 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
if (! (mergeinfo_value || prev_mergeinfo_value))
continue;
+ /* Mergeinfo on both sides but it did not change? Skip that too. */
+ if ( mergeinfo_value && prev_mergeinfo_value
+ && svn_string_compare(mergeinfo_value, prev_mergeinfo_value))
+ continue;
+
/* If mergeinfo was explicitly added or removed on this path, we
need to check to see if that was a real semantic change of
meaning. So, fill in the "missing" mergeinfo value with the
inherited mergeinfo for that path/revision. */
if (prev_mergeinfo_value && (! mergeinfo_value))
{
- apr_array_header_t *query_paths =
- apr_array_make(iterpool, 1, sizeof(const char *));
svn_mergeinfo_t tmp_mergeinfo;
- svn_mergeinfo_catalog_t tmp_catalog;
- APR_ARRAY_PUSH(query_paths, const char *) = changed_path;
- SVN_ERR(svn_fs_get_mergeinfo2(&tmp_catalog, root,
- query_paths, svn_mergeinfo_inherited,
- FALSE, TRUE, iterpool, iterpool));
- tmp_mergeinfo = svn_hash_gets(tmp_catalog, changed_path);
+ SVN_ERR(svn_fs__get_mergeinfo_for_path(&tmp_mergeinfo,
+ root, changed_path,
+ svn_mergeinfo_inherited, TRUE,
+ iterpool, iterpool));
if (tmp_mergeinfo)
SVN_ERR(svn_mergeinfo_to_string(&mergeinfo_value,
tmp_mergeinfo,
@@ -728,29 +800,23 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
else if (mergeinfo_value && (! prev_mergeinfo_value)
&& base_path && SVN_IS_VALID_REVNUM(base_rev))
{
- apr_array_header_t *query_paths =
- apr_array_make(iterpool, 1, sizeof(const char *));
svn_mergeinfo_t tmp_mergeinfo;
- svn_mergeinfo_catalog_t tmp_catalog;
- APR_ARRAY_PUSH(query_paths, const char *) = base_path;
- SVN_ERR(svn_fs_get_mergeinfo2(&tmp_catalog, base_root,
- query_paths, svn_mergeinfo_inherited,
- FALSE, TRUE, iterpool, iterpool));
- tmp_mergeinfo = svn_hash_gets(tmp_catalog, base_path);
+ SVN_ERR(svn_fs__get_mergeinfo_for_path(&tmp_mergeinfo,
+ base_root, base_path,
+ svn_mergeinfo_inherited, TRUE,
+ iterpool, iterpool));
if (tmp_mergeinfo)
SVN_ERR(svn_mergeinfo_to_string(&prev_mergeinfo_value,
tmp_mergeinfo,
iterpool));
}
- /* If the old and new mergeinfo differ in any way, store the
- before and after mergeinfo values in our return hashes. */
- if ((prev_mergeinfo_value && (! mergeinfo_value))
- || ((! prev_mergeinfo_value) && mergeinfo_value)
- || (prev_mergeinfo_value && mergeinfo_value
- && (! svn_string_compare(mergeinfo_value,
- prev_mergeinfo_value))))
+ /* Old and new mergeinfo probably differ in some way (we already
+ checked for textual equality further up). Store the before and
+ after mergeinfo values in our return hashes. They may still be
+ equal as manual intervention may have only changed the formatting
+ but not the relevant contents. */
{
svn_mergeinfo_t prev_mergeinfo = NULL, mergeinfo = NULL;
svn_mergeinfo_t deleted, added;
@@ -781,10 +847,9 @@ fs_mergeinfo_changed(svn_mergeinfo_catalog_t *deleted_mergeinfo_catalog,
/* Determine what (if any) mergeinfo for PATHS was modified in
revision REV, returning the differences for added mergeinfo in
*ADDED_MERGEINFO and deleted mergeinfo in *DELETED_MERGEINFO.
- If *PREFETCHED_CAHNGES already contains the changed paths for
+ If *PREFETCHED_CHANGES already contains the changed paths for
REV, use that. Otherwise, request that data and return it in
- *PREFETCHED_CHANGES.
- Use POOL for all allocations. */
+ *PREFETCHED_CHANGES. */
static svn_error_t *
get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
svn_mergeinfo_t *deleted_mergeinfo,
@@ -814,14 +879,12 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
if (! paths->nelts)
return SVN_NO_ERROR;
- /* Create a work subpool and get a root for REV. */
- SVN_ERR(svn_fs_revision_root(&root, fs, rev, scratch_pool));
-
/* Fetch the mergeinfo changes for REV. */
err = fs_mergeinfo_changed(&deleted_mergeinfo_catalog,
&added_mergeinfo_catalog,
prefetched_changes,
- fs, rev, scratch_pool, scratch_pool);
+ fs, rev,
+ scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
@@ -842,7 +905,10 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
if ( apr_hash_count(deleted_mergeinfo_catalog) == 0
&& apr_hash_count(added_mergeinfo_catalog) == 0)
return SVN_NO_ERROR;
-
+
+ /* Create a work subpool and get a root for REV. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, scratch_pool));
+
/* Check our PATHS for any changes to their inherited mergeinfo.
(We deal with changes to mergeinfo directly *on* the paths in the
following loop.) */
@@ -851,13 +917,10 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
{
const char *path = APR_ARRAY_IDX(paths, i, const char *);
const char *prev_path;
- apr_ssize_t klen;
svn_revnum_t appeared_rev, prev_rev;
svn_fs_root_t *prev_root;
- svn_mergeinfo_catalog_t catalog, inherited_catalog;
svn_mergeinfo_t prev_mergeinfo, mergeinfo, deleted, added,
prev_inherited_mergeinfo, inherited_mergeinfo;
- apr_array_header_t *query_paths;
svn_pool_clear(iterpool);
@@ -893,11 +956,10 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
this path. Ignore not-found errors returned by the
filesystem or invalid mergeinfo (Issue #3896).*/
SVN_ERR(svn_fs_revision_root(&prev_root, fs, prev_rev, iterpool));
- query_paths = apr_array_make(iterpool, 1, sizeof(const char *));
- APR_ARRAY_PUSH(query_paths, const char *) = prev_path;
- err = svn_fs_get_mergeinfo2(&catalog, prev_root, query_paths,
- svn_mergeinfo_inherited, FALSE, TRUE,
- iterpool, iterpool);
+ err = svn_fs__get_mergeinfo_for_path(&prev_mergeinfo,
+ prev_root, prev_path,
+ svn_mergeinfo_inherited, TRUE,
+ iterpool, iterpool);
if (err && (err->apr_err == SVN_ERR_FS_NOT_FOUND ||
err->apr_err == SVN_ERR_FS_NOT_DIRECTORY ||
err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR))
@@ -917,31 +979,25 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
To check for this we must fetch the "raw" previous inherited
mergeinfo and the "raw" mergeinfo @REV then compare these. */
- SVN_ERR(svn_fs_get_mergeinfo2(&inherited_catalog, prev_root, query_paths,
- svn_mergeinfo_nearest_ancestor, FALSE,
- FALSE, /* adjust_inherited_mergeinfo */
- iterpool, iterpool));
-
- klen = strlen(prev_path);
- prev_mergeinfo = apr_hash_get(catalog, prev_path, klen);
- prev_inherited_mergeinfo = apr_hash_get(inherited_catalog, prev_path, klen);
+ SVN_ERR(svn_fs__get_mergeinfo_for_path(&prev_inherited_mergeinfo,
+ prev_root, prev_path,
+ svn_mergeinfo_nearest_ancestor,
+ FALSE, /* adjust_inherited_mergeinfo */
+ iterpool, iterpool));
/* Fetch the current mergeinfo (as of REV, and including
inherited stuff) for this path. */
- APR_ARRAY_IDX(query_paths, 0, const char *) = path;
- SVN_ERR(svn_fs_get_mergeinfo2(&catalog, root, query_paths,
- svn_mergeinfo_inherited, FALSE, TRUE,
- iterpool, iterpool));
+ SVN_ERR(svn_fs__get_mergeinfo_for_path(&mergeinfo,
+ root, path,
+ svn_mergeinfo_inherited, TRUE,
+ iterpool, iterpool));
/* Issue #4022 again, fetch the raw inherited mergeinfo. */
- SVN_ERR(svn_fs_get_mergeinfo2(&inherited_catalog, root, query_paths,
- svn_mergeinfo_nearest_ancestor, FALSE,
- FALSE, /* adjust_inherited_mergeinfo */
- iterpool, iterpool));
-
- klen = strlen(path);
- mergeinfo = apr_hash_get(catalog, path, klen);
- inherited_mergeinfo = apr_hash_get(inherited_catalog, path, klen);
+ SVN_ERR(svn_fs__get_mergeinfo_for_path(&inherited_mergeinfo,
+ root, path,
+ svn_mergeinfo_nearest_ancestor,
+ FALSE, /* adjust_inherited_mergeinfo */
+ iterpool, iterpool));
if (!prev_mergeinfo && !mergeinfo)
continue;
@@ -965,7 +1021,7 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
svn_boolean_t same_mergeinfo;
SVN_ERR(svn_mergeinfo__equals(&same_mergeinfo,
prev_inherited_mergeinfo,
- FALSE,
+ NULL,
TRUE, iterpool));
if (same_mergeinfo)
continue;
@@ -985,16 +1041,10 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
for (hi = apr_hash_first(scratch_pool, added_mergeinfo_catalog);
hi; hi = apr_hash_next(hi))
{
- const void *key;
- apr_ssize_t klen;
- void *val;
- const char *changed_path;
- svn_mergeinfo_t added, deleted;
-
- /* The path is the key, the mergeinfo delta is the value. */
- apr_hash_this(hi, &key, &klen, &val);
- changed_path = key;
- added = val;
+ const char *changed_path = apr_hash_this_key(hi);
+ apr_ssize_t klen = apr_hash_this_key_len(hi);
+ svn_mergeinfo_t added = apr_hash_this_val(hi);
+ svn_mergeinfo_t deleted;
for (i = 0; i < paths->nelts; i++)
{
@@ -1002,7 +1052,7 @@ get_combined_mergeinfo_changes(svn_mergeinfo_t *added_mergeinfo,
if (! svn_fspath__skip_ancestor(path, changed_path))
continue;
svn_pool_clear(iterpool);
- deleted = apr_hash_get(deleted_mergeinfo_catalog, key, klen);
+ deleted = apr_hash_get(deleted_mergeinfo_catalog, changed_path, klen);
SVN_ERR(svn_mergeinfo_merge2(*deleted_mergeinfo,
svn_mergeinfo_dup(deleted, result_pool),
result_pool, iterpool));
@@ -1033,6 +1083,7 @@ fill_log_entry(svn_log_entry_t *log_entry,
{
apr_hash_t *r_props, *changed_paths = NULL;
svn_boolean_t get_revprops = TRUE, censor_revprops = FALSE;
+ svn_boolean_t want_revprops = !revprops || revprops->nelts;
/* Discover changed paths if the user requested them
or if we need to check that they are readable. */
@@ -1040,33 +1091,27 @@ fill_log_entry(svn_log_entry_t *log_entry,
&& (authz_read_func || discover_changed_paths))
{
svn_fs_root_t *newroot;
- svn_error_t *patherr;
+ svn_repos_revision_access_level_t access_level;
SVN_ERR(svn_fs_revision_root(&newroot, fs, rev, pool));
- patherr = detect_changed(&changed_paths,
- newroot, fs, prefetched_changes,
- authz_read_func, authz_read_baton,
- pool);
+ SVN_ERR(detect_changed(&access_level, &changed_paths,
+ newroot, fs, prefetched_changes,
+ authz_read_func, authz_read_baton,
+ pool));
- if (patherr
- && patherr->apr_err == SVN_ERR_AUTHZ_UNREADABLE)
+ if (access_level == svn_repos_revision_access_none)
{
/* All changed-paths are unreadable, so clear all fields. */
- svn_error_clear(patherr);
changed_paths = NULL;
get_revprops = FALSE;
}
- else if (patherr
- && patherr->apr_err == SVN_ERR_AUTHZ_PARTIALLY_READABLE)
+ else if (access_level == svn_repos_revision_access_partial)
{
/* At least one changed-path was unreadable, so censor all
but author and date. (The unreadable paths are already
missing from the hash.) */
- svn_error_clear(patherr);
censor_revprops = TRUE;
}
- else if (patherr)
- return patherr;
/* It may be the case that an authz func was passed in, but
the user still doesn't want to see any changed-paths. */
@@ -1074,7 +1119,7 @@ fill_log_entry(svn_log_entry_t *log_entry,
changed_paths = NULL;
}
- if (get_revprops)
+ if (get_revprops && want_revprops)
{
/* User is allowed to see at least some revprops. */
SVN_ERR(svn_fs_revision_proplist(&r_props, fs, rev, pool));
@@ -1096,21 +1141,54 @@ fill_log_entry(svn_log_entry_t *log_entry,
}
else
{
- /* Requested only some revprops... */
int i;
- for (i = 0; i < revprops->nelts; i++)
+
+ /* Requested only some revprops... */
+
+ /* Make "svn:author" and "svn:date" available as svn_string_t
+ for efficient comparison via svn_string_compare(). Note that
+ we want static initialization here and must therefore emulate
+ strlen(x) by sizeof(x)-1. */
+ static const svn_string_t svn_prop_revision_author
+ = {SVN_PROP_REVISION_AUTHOR, sizeof(SVN_PROP_REVISION_AUTHOR)-1};
+ static const svn_string_t svn_prop_revision_date
+ = {SVN_PROP_REVISION_DATE, sizeof(SVN_PROP_REVISION_DATE)-1};
+
+ /* often only the standard revprops got requested and delivered.
+ In that case, we can simply pass the hash on. */
+ if (revprops->nelts == apr_hash_count(r_props) && !censor_revprops)
{
- char *name = APR_ARRAY_IDX(revprops, i, char *);
- svn_string_t *value = svn_hash_gets(r_props, name);
- if (censor_revprops
- && !(strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0
- || strcmp(name, SVN_PROP_REVISION_DATE) == 0))
- /* ... but we can only return author/date. */
- continue;
- if (log_entry->revprops == NULL)
- log_entry->revprops = svn_hash__make(pool);
- svn_hash_sets(log_entry->revprops, name, value);
+ log_entry->revprops = r_props;
+ for (i = 0; i < revprops->nelts; i++)
+ {
+ const svn_string_t *name
+ = APR_ARRAY_IDX(revprops, i, const svn_string_t *);
+ if (!apr_hash_get(r_props, name->data, name->len))
+ {
+ /* hash does not match list of revprops we want */
+ log_entry->revprops = NULL;
+ break;
+ }
+ }
}
+
+ /* slow, revprop-by-revprop filtering */
+ if (log_entry->revprops == NULL)
+ for (i = 0; i < revprops->nelts; i++)
+ {
+ const svn_string_t *name
+ = APR_ARRAY_IDX(revprops, i, const svn_string_t *);
+ svn_string_t *value
+ = apr_hash_get(r_props, name->data, name->len);
+ if (censor_revprops
+ && !svn_string_compare(name, &svn_prop_revision_author)
+ && !svn_string_compare(name, &svn_prop_revision_date))
+ /* ... but we can only return author/date. */
+ continue;
+ if (log_entry->revprops == NULL)
+ log_entry->revprops = svn_hash__make(pool);
+ apr_hash_set(log_entry->revprops, name->data, name->len, value);
+ }
}
}
@@ -1136,8 +1214,8 @@ fill_log_entry(svn_log_entry_t *log_entry,
(i.e. retrieve none if the array is empty).
LOG_TARGET_HISTORY_AS_MERGEINFO, HANDLING_MERGED_REVISION, and
- NESTED_MERGES are as per the arguments of the same name to DO_LOGS. If
- HANDLING_MERGED_REVISION is true and *all* changed paths within REV are
+ NESTED_MERGES are as per the arguments of the same name to DO_LOGS.
+ If HANDLING_MERGED_REVISION is true and *all* changed paths within REV are
already represented in LOG_TARGET_HISTORY_AS_MERGEINFO, then don't send
the log message for REV. If SUBTRACTIVE_MERGE is true, then REV was
reverse merged.
@@ -1151,7 +1229,7 @@ send_log(svn_revnum_t rev,
svn_fs_t *fs,
apr_hash_t *prefetched_changes,
svn_mergeinfo_t log_target_history_as_mergeinfo,
- apr_hash_t *nested_merges,
+ svn_bit_array__t *nested_merges,
svn_boolean_t discover_changed_paths,
svn_boolean_t subtractive_merge,
svn_boolean_t handling_merged_revision,
@@ -1170,8 +1248,7 @@ send_log(svn_revnum_t rev,
log_entry = svn_log_entry_create(pool);
SVN_ERR(fill_log_entry(log_entry, rev, fs, prefetched_changes,
discover_changed_paths || handling_merged_revision,
- revprops, authz_read_func, authz_read_baton,
- pool));
+ revprops, authz_read_func, authz_read_baton, pool));
log_entry->has_children = has_children;
log_entry->subtractive_merge = subtractive_merge;
@@ -1184,32 +1261,29 @@ send_log(svn_revnum_t rev,
&& apr_hash_count(log_target_history_as_mergeinfo))
{
apr_hash_index_t *hi;
- apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
/* REV was merged in, but it might already be part of the log target's
natural history, so change our starting assumption. */
found_rev_of_interest = FALSE;
/* Look at each changed path in REV. */
- for (hi = apr_hash_first(subpool, log_entry->changed_paths2);
+ for (hi = apr_hash_first(pool, log_entry->changed_paths2);
hi;
hi = apr_hash_next(hi))
{
svn_boolean_t path_is_in_history = FALSE;
- const char *changed_path = svn__apr_hash_index_key(hi);
+ const char *changed_path = apr_hash_this_key(hi);
apr_hash_index_t *hi2;
- apr_pool_t *inner_subpool = svn_pool_create(subpool);
/* Look at each path on the log target's mergeinfo. */
- for (hi2 = apr_hash_first(inner_subpool,
+ for (hi2 = apr_hash_first(iterpool,
log_target_history_as_mergeinfo);
hi2;
hi2 = apr_hash_next(hi2))
{
- const char *mergeinfo_path =
- svn__apr_hash_index_key(hi2);
- svn_rangelist_t *rangelist =
- svn__apr_hash_index_val(hi2);
+ const char *mergeinfo_path = apr_hash_this_key(hi2);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi2);
/* Check whether CHANGED_PATH at revision REV is a child of
a (path, revision) tuple in LOG_TARGET_HISTORY_AS_MERGEINFO. */
@@ -1232,7 +1306,7 @@ send_log(svn_revnum_t rev,
if (path_is_in_history)
break;
}
- svn_pool_destroy(inner_subpool);
+ svn_pool_clear(iterpool);
if (!path_is_in_history)
{
@@ -1243,7 +1317,7 @@ send_log(svn_revnum_t rev,
break;
}
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
}
/* If we only got changed paths the sake of detecting redundant merged
@@ -1255,13 +1329,12 @@ send_log(svn_revnum_t rev,
revision. */
if (found_rev_of_interest)
{
+ apr_pool_t *scratch_pool;
+
/* Is REV a merged revision we've already sent? */
if (nested_merges && handling_merged_revision)
{
- svn_revnum_t *merged_rev = apr_hash_get(nested_merges, &rev,
- sizeof(svn_revnum_t *));
-
- if (merged_rev)
+ if (svn_bit_array__get(nested_merges, rev))
{
/* We already sent REV. */
return SVN_NO_ERROR;
@@ -1271,21 +1344,18 @@ send_log(svn_revnum_t rev,
/* NESTED_REVS needs to last across all the send_log, do_logs,
handle_merged_revisions() recursions, so use the pool it
was created in at the top of the recursion. */
- apr_pool_t *hash_pool = apr_hash_pool_get(nested_merges);
- svn_revnum_t *long_lived_rev = apr_palloc(hash_pool,
- sizeof(svn_revnum_t));
- *long_lived_rev = rev;
- apr_hash_set(nested_merges, long_lived_rev,
- sizeof(svn_revnum_t *), long_lived_rev);
+ svn_bit_array__set(nested_merges, rev, TRUE);
}
}
- return (*receiver)(receiver_baton, log_entry, pool);
- }
- else
- {
- return SVN_NO_ERROR;
+ /* Pass a scratch pool to ensure no temporary state stored
+ by the receiver callback persists. */
+ scratch_pool = svn_pool_create(pool);
+ SVN_ERR(receiver(receiver_baton, log_entry, scratch_pool));
+ svn_pool_destroy(scratch_pool);
}
+
+ return SVN_NO_ERROR;
}
/* This controls how many history objects we keep open. For any targets
@@ -1334,13 +1404,11 @@ get_path_histories(apr_array_header_t **histories,
const char *this_path = APR_ARRAY_IDX(paths, i, const char *);
struct path_info *info = apr_palloc(pool,
sizeof(struct path_info));
+ svn_pool_clear(iterpool);
if (authz_read_func)
{
svn_boolean_t readable;
-
- svn_pool_clear(iterpool);
-
SVN_ERR(authz_read_func(&readable, root, this_path,
authz_read_baton, iterpool));
if (! readable)
@@ -1354,7 +1422,8 @@ get_path_histories(apr_array_header_t **histories,
if (i < MAX_OPEN_HISTORIES)
{
- err = svn_fs_node_history(&info->hist, root, this_path, pool);
+ err = svn_fs_node_history2(&info->hist, root, this_path, pool,
+ iterpool);
if (err
&& ignore_missing_locations
&& (err->apr_err == SVN_ERR_FS_NOT_FOUND ||
@@ -1378,7 +1447,7 @@ get_path_histories(apr_array_header_t **histories,
err = get_history(info, fs,
strict_node_history,
authz_read_func, authz_read_baton,
- hist_start, pool);
+ hist_start, pool, iterpool);
if (err
&& ignore_missing_locations
&& (err->apr_err == SVN_ERR_FS_NOT_FOUND ||
@@ -1486,8 +1555,9 @@ combine_mergeinfo_path_lists(apr_array_header_t **combined_list,
{
int i;
struct rangelist_path *rp = apr_palloc(subpool, sizeof(*rp));
- apr_hash_this(hi, (void *) &rp->path, NULL,
- (void *) &rp->rangelist);
+
+ rp->path = apr_hash_this_key(hi);
+ rp->rangelist = apr_hash_this_val(hi);
APR_ARRAY_PUSH(rangelist_paths, struct rangelist_path *) = rp;
/* We need to make local copies of the rangelist, since we will be
@@ -1515,8 +1585,7 @@ combine_mergeinfo_path_lists(apr_array_header_t **combined_list,
/* First, sort the list such that the start revision of the first
revision arrays are sorted. */
- qsort(rangelist_paths->elts, rangelist_paths->nelts,
- rangelist_paths->elt_size, compare_rangelist_paths);
+ svn_sort__array(rangelist_paths, compare_rangelist_paths);
/* Next, find the number of revision ranges which start with the same
revision. */
@@ -1627,7 +1696,7 @@ do_logs(svn_fs_t *fs,
const apr_array_header_t *paths,
svn_mergeinfo_t log_target_history_as_mergeinfo,
svn_mergeinfo_t processed,
- apr_hash_t *nested_merges,
+ svn_bit_array__t *nested_merges,
svn_revnum_t hist_start,
svn_revnum_t hist_end,
int limit,
@@ -1680,7 +1749,7 @@ static svn_error_t *
handle_merged_revisions(svn_revnum_t rev,
svn_fs_t *fs,
svn_mergeinfo_t log_target_history_as_mergeinfo,
- apr_hash_t *nested_merges,
+ svn_bit_array__t *nested_merges,
svn_mergeinfo_t processed,
svn_mergeinfo_t added_mergeinfo,
svn_mergeinfo_t deleted_mergeinfo,
@@ -1711,8 +1780,7 @@ handle_merged_revisions(svn_revnum_t rev,
TRUE, pool));
SVN_ERR_ASSERT(combined_list != NULL);
- qsort(combined_list->elts, combined_list->nelts,
- combined_list->elt_size, compare_path_list_range);
+ svn_sort__array(combined_list, compare_path_list_range);
/* Because the combined_lists are ordered youngest to oldest,
iterate over them in reverse. */
@@ -1889,7 +1957,7 @@ do_logs(svn_fs_t *fs,
const apr_array_header_t *paths,
svn_mergeinfo_t log_target_history_as_mergeinfo,
svn_mergeinfo_t processed,
- apr_hash_t *nested_merges,
+ svn_bit_array__t *nested_merges,
svn_revnum_t hist_start,
svn_revnum_t hist_end,
int limit,
@@ -1907,7 +1975,7 @@ do_logs(svn_fs_t *fs,
void *authz_read_baton,
apr_pool_t *pool)
{
- apr_pool_t *iterpool;
+ apr_pool_t *iterpool, *iterpool2;
apr_pool_t *subpool = NULL;
apr_array_header_t *revs = NULL;
apr_hash_t *rev_mergeinfo = NULL;
@@ -1943,6 +2011,7 @@ do_logs(svn_fs_t *fs,
where a path was changed to the array, or if they wanted
history in reverse order just send it to them right away. */
iterpool = svn_pool_create(pool);
+ iterpool2 = svn_pool_create(pool);
for (current = hist_end;
any_histories_left;
current = next_history_rev(histories))
@@ -1956,14 +2025,19 @@ do_logs(svn_fs_t *fs,
struct path_info *info = APR_ARRAY_IDX(histories, i,
struct path_info *);
+ svn_pool_clear(iterpool2);
+
/* Check history for this path in current rev. */
SVN_ERR(check_history(&changed, info, fs, current,
strict_node_history, authz_read_func,
- authz_read_baton, hist_start, pool));
+ authz_read_baton, hist_start, pool,
+ iterpool2));
if (! info->done)
any_histories_left = TRUE;
}
+ svn_pool_clear(iterpool2);
+
/* If any of the paths changed in this rev then add or send it. */
if (changed)
{
@@ -1993,8 +2067,8 @@ do_logs(svn_fs_t *fs,
&deleted_mergeinfo,
&changes,
fs, cur_paths,
- current, iterpool,
- iterpool));
+ current,
+ iterpool, iterpool));
has_children = (apr_hash_count(added_mergeinfo) > 0
|| apr_hash_count(deleted_mergeinfo) > 0);
}
@@ -2020,7 +2094,7 @@ do_logs(svn_fs_t *fs,
single hash to be shared across all of the merged
recursions so we can track and squelch duplicates. */
subpool = svn_pool_create(pool);
- nested_merges = svn_hash__make(subpool);
+ nested_merges = svn_bit_array__create(hist_end, subpool);
processed = svn_hash__make(subpool);
}
@@ -2052,19 +2126,18 @@ do_logs(svn_fs_t *fs,
if (added_mergeinfo || deleted_mergeinfo)
{
- svn_revnum_t *cur_rev = apr_pcalloc(pool, sizeof(*cur_rev));
+ svn_revnum_t *cur_rev =
+ apr_pmemdup(pool, &current, sizeof(*cur_rev));
struct added_deleted_mergeinfo *add_and_del_mergeinfo =
apr_palloc(pool, sizeof(*add_and_del_mergeinfo));
- if (added_mergeinfo)
- add_and_del_mergeinfo->added_mergeinfo =
- svn_mergeinfo_dup(added_mergeinfo, pool);
-
- if (deleted_mergeinfo)
- add_and_del_mergeinfo->deleted_mergeinfo =
- svn_mergeinfo_dup(deleted_mergeinfo, pool);
+ /* If we have added or deleted mergeinfo, both are non-null */
+ SVN_ERR_ASSERT(added_mergeinfo && deleted_mergeinfo);
+ add_and_del_mergeinfo->added_mergeinfo =
+ svn_mergeinfo_dup(added_mergeinfo, pool);
+ add_and_del_mergeinfo->deleted_mergeinfo =
+ svn_mergeinfo_dup(deleted_mergeinfo, pool);
- *cur_rev = current;
if (! rev_mergeinfo)
rev_mergeinfo = svn_hash__make(pool);
apr_hash_set(rev_mergeinfo, cur_rev, sizeof(*cur_rev),
@@ -2073,6 +2146,7 @@ do_logs(svn_fs_t *fs,
}
}
}
+ svn_pool_destroy(iterpool2);
svn_pool_destroy(iterpool);
if (subpool)
@@ -2112,7 +2186,8 @@ do_logs(svn_fs_t *fs,
SVN_ERR(send_log(current, fs, NULL,
log_target_history_as_mergeinfo, nested_merges,
discover_changed_paths, subtractive_merge,
- handling_merged_revisions, revprops, has_children,
+ handling_merged_revisions,
+ revprops, has_children,
receiver, receiver_baton, authz_read_func,
authz_read_baton, iterpool));
if (has_children)
@@ -2120,7 +2195,7 @@ do_logs(svn_fs_t *fs,
if (!nested_merges)
{
subpool = svn_pool_create(pool);
- nested_merges = svn_hash__make(subpool);
+ nested_merges = svn_bit_array__create(current, subpool);
}
SVN_ERR(handle_merged_revisions(current, fs,
@@ -2130,7 +2205,8 @@ do_logs(svn_fs_t *fs,
added_mergeinfo,
deleted_mergeinfo,
discover_changed_paths,
- strict_node_history, revprops,
+ strict_node_history,
+ revprops,
receiver, receiver_baton,
authz_read_func,
authz_read_baton,
@@ -2252,6 +2328,19 @@ svn_repos_get_logs4(svn_repos_t *repos,
svn_boolean_t descending_order;
svn_mergeinfo_t paths_history_mergeinfo = NULL;
+ if (revprops)
+ {
+ int i;
+ apr_array_header_t *new_revprops
+ = apr_array_make(pool, revprops->nelts, sizeof(svn_string_t *));
+
+ for (i = 0; i < revprops->nelts; ++i)
+ APR_ARRAY_PUSH(new_revprops, svn_string_t *)
+ = svn_string_create(APR_ARRAY_IDX(revprops, i, const char *), pool);
+
+ revprops = new_revprops;
+ }
+
/* Setup log range. */
SVN_ERR(svn_fs_youngest_rev(&head, fs, pool));
@@ -2321,7 +2410,7 @@ svn_repos_get_logs4(svn_repos_t *repos,
}
send_count = end - start + 1;
- if (limit && send_count > limit)
+ if (limit > 0 && send_count > limit)
send_count = limit;
for (i = 0; i < send_count; ++i)
{
@@ -2335,9 +2424,8 @@ svn_repos_get_logs4(svn_repos_t *repos,
rev = start + i;
SVN_ERR(send_log(rev, fs, NULL, NULL, NULL,
discover_changed_paths, FALSE,
- FALSE, revprops, FALSE, receiver,
- receiver_baton, authz_read_func,
- authz_read_baton, iterpool));
+ FALSE, revprops, FALSE, receiver, receiver_baton,
+ authz_read_func, authz_read_baton, iterpool));
}
svn_pool_destroy(iterpool);
@@ -2363,7 +2451,7 @@ svn_repos_get_logs4(svn_repos_t *repos,
return do_logs(repos->fs, paths, paths_history_mergeinfo, NULL, NULL, start, end,
limit, discover_changed_paths, strict_node_history,
- include_merged_revisions, FALSE, FALSE, FALSE, revprops,
- descending_order, receiver, receiver_baton,
+ include_merged_revisions, FALSE, FALSE, FALSE,
+ revprops, descending_order, receiver, receiver_baton,
authz_read_func, authz_read_baton, pool);
}
diff --git a/subversion/libsvn_repos/replay.c b/subversion/libsvn_repos/replay.c
index 985a673..bcf260c 100644
--- a/subversion/libsvn_repos/replay.c
+++ b/subversion/libsvn_repos/replay.c
@@ -39,6 +39,7 @@
#include "private/svn_fspath.h"
#include "private/svn_repos_private.h"
#include "private/svn_delta_private.h"
+#include "private/svn_sorts_private.h"
/*** Backstory ***/
@@ -183,11 +184,10 @@ add_subdir(svn_fs_root_t *source_root,
for (phi = apr_hash_first(pool, props); phi; phi = apr_hash_next(phi))
{
- const void *key;
- void *val;
+ const char *key = apr_hash_this_key(phi);
+ svn_string_t *val = apr_hash_this_val(phi);
svn_pool_clear(subpool);
- apr_hash_this(phi, &key, NULL, &val);
SVN_ERR(editor->change_dir_prop(*dir_baton, key, val, subpool));
}
@@ -200,18 +200,13 @@ add_subdir(svn_fs_root_t *source_root,
{
svn_fs_path_change2_t *change;
svn_boolean_t readable = TRUE;
- svn_fs_dirent_t *dent;
+ svn_fs_dirent_t *dent = apr_hash_this_val(hi);
const char *copyfrom_path = NULL;
svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
const char *new_edit_path;
- void *val;
svn_pool_clear(subpool);
- apr_hash_this(hi, NULL, NULL, &val);
-
- dent = val;
-
new_edit_path = svn_relpath_join(edit_path, dent->name, subpool);
/* If a file or subdirectory of the copied directory is listed as a
@@ -308,9 +303,9 @@ add_subdir(svn_fs_root_t *source_root,
for (phi = apr_hash_first(pool, props); phi; phi = apr_hash_next(phi))
{
- const void *key;
+ const char *key = apr_hash_this_key(phi);
+ svn_string_t *val = apr_hash_this_val(phi);
- apr_hash_this(phi, &key, NULL, &val);
SVN_ERR(editor->change_file_prop(file_baton, key, val, subpool));
}
@@ -553,6 +548,17 @@ path_driver_cb_func(void **dir_baton,
svn_boolean_t src_readable;
svn_fs_root_t *copyfrom_root;
+ /* E.g. when verifying corrupted repositories, their changed path
+ lists may contain an ADD for "/". The delta path driver will
+ call us with a NULL parent in that case. */
+ if (*edit_path == 0)
+ return svn_error_create(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ _("Root directory already exists."));
+
+ /* A NULL parent_baton will cause a segfault. It should never be
+ NULL for non-root paths. */
+ SVN_ERR_ASSERT(parent_baton);
+
/* Was this node copied? */
SVN_ERR(fill_copyfrom(&copyfrom_root, &copyfrom_path, &copyfrom_rev,
&src_readable, root, change,
@@ -882,17 +888,11 @@ svn_repos_replay2(svn_fs_root_t *root,
changed_paths = apr_hash_make(pool);
for (hi = apr_hash_first(pool, fs_changes); hi; hi = apr_hash_next(hi))
{
- const void *key;
- void *val;
- apr_ssize_t keylen;
- const char *path;
- svn_fs_path_change2_t *change;
+ const char *path = apr_hash_this_key(hi);
+ apr_ssize_t keylen = apr_hash_this_key_len(hi);
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
svn_boolean_t allowed = TRUE;
- apr_hash_this(hi, &key, &keylen, &val);
- path = key;
- change = val;
-
if (authz_read_func)
SVN_ERR(authz_read_func(&allowed, root, path, authz_read_baton,
pool));
@@ -1063,7 +1063,7 @@ add_subdir_ev2(svn_fs_root_t *source_root,
{
svn_fs_path_change2_t *change;
svn_boolean_t readable = TRUE;
- svn_fs_dirent_t *dent = svn__apr_hash_index_val(hi);
+ svn_fs_dirent_t *dent = apr_hash_this_val(hi);
const char *copyfrom_path = NULL;
svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
const char *child_relpath;
@@ -1457,8 +1457,8 @@ replay_node(svn_fs_root_t *root,
}
SVN_ERR(svn_editor_alter_file(editor, repos_relpath,
- SVN_INVALID_REVNUM, props, checksum,
- contents));
+ SVN_INVALID_REVNUM,
+ checksum, contents, props));
}
if (change->node_kind == svn_node_dir
@@ -1514,17 +1514,11 @@ svn_repos__replay_ev2(svn_fs_root_t *root,
for (hi = apr_hash_first(scratch_pool, fs_changes); hi;
hi = apr_hash_next(hi))
{
- const void *key;
- void *val;
- apr_ssize_t keylen;
- const char *path;
- svn_fs_path_change2_t *change;
+ const char *path = apr_hash_this_key(hi);
+ apr_ssize_t keylen = apr_hash_this_key_len(hi);
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
svn_boolean_t allowed = TRUE;
- apr_hash_this(hi, &key, &keylen, &val);
- path = key;
- change = val;
-
if (authz_read_func)
SVN_ERR(authz_read_func(&allowed, root, path, authz_read_baton,
scratch_pool));
@@ -1564,7 +1558,7 @@ svn_repos__replay_ev2(svn_fs_root_t *root,
/* Sort the paths. Although not strictly required by the API, this has
the pleasant side effect of maintaining a consistent ordering of
dumpfile contents. */
- qsort(paths->elts, paths->nelts, paths->elt_size, svn_sort_compare_paths);
+ svn_sort__array(paths, svn_sort_compare_paths);
/* Now actually handle the various paths. */
iterpool = svn_pool_create(scratch_pool);
diff --git a/subversion/libsvn_repos/reporter.c b/subversion/libsvn_repos/reporter.c
index de46858..76c7201 100644
--- a/subversion/libsvn_repos/reporter.c
+++ b/subversion/libsvn_repos/reporter.c
@@ -495,11 +495,11 @@ get_revision_info(report_baton_t *b,
/* Create a result object */
info = apr_palloc(b->pool, sizeof(*info));
info->rev = rev;
- info->date = cdate ? svn_string_dup(cdate, b->pool) : NULL;
- info->author = author ? svn_string_dup(author, b->pool) : NULL;
+ info->date = svn_string_dup(cdate, b->pool);
+ info->author = svn_string_dup(author, b->pool);
/* Cache it */
- apr_hash_set(b->revision_infos, &info->rev, sizeof(rev), info);
+ apr_hash_set(b->revision_infos, &info->rev, sizeof(info->rev), info);
}
*revision_info = info;
@@ -576,8 +576,8 @@ delta_proplists(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
SVN_ERR(get_source_root(b, &s_root, s_rev));
/* Is this deltification worth our time? */
- SVN_ERR(svn_fs_props_changed(&changed, b->t_root, t_path, s_root,
- s_path, pool));
+ SVN_ERR(svn_fs_props_different(&changed, b->t_root, t_path, s_root,
+ s_path, pool));
if (! changed)
return SVN_NO_ERROR;
@@ -603,10 +603,9 @@ delta_proplists(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
/* So source, i.e. all new. Transmit all target props. */
for (hi = apr_hash_first(pool, t_props); hi; hi = apr_hash_next(hi))
{
- const void *key;
- void *val;
+ const char *key = apr_hash_this_key(hi);
+ svn_string_t *val = apr_hash_this_val(hi);
- apr_hash_this(hi, &key, NULL, &val);
SVN_ERR(change_fn(b, object, key, val, pool));
}
}
@@ -842,7 +841,7 @@ add_file_smartly(report_baton_t *b,
starting with '/', so make sure o_path always starts with a '/'
too. */
if (*o_path != '/')
- o_path = apr_pstrcat(pool, "/", o_path, (char *)NULL);
+ o_path = apr_pstrcat(pool, "/", o_path, SVN_VA_NULL);
SVN_ERR(svn_fs_closest_copy(&closest_copy_root, &closest_copy_path,
b->t_root, o_path, pool));
@@ -917,7 +916,7 @@ update_entry(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
const char *e_path, path_info_t *info, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
- svn_fs_root_t *s_root;
+ svn_fs_root_t *s_root = NULL;
svn_boolean_t allowed, related;
void *new_baton;
svn_checksum_t *checksum;
@@ -960,7 +959,26 @@ update_entry(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
if (s_entry && t_entry && s_entry->kind == t_entry->kind)
{
int distance = svn_fs_compare_ids(s_entry->id, t_entry->id);
- if (distance == 0 && !any_path_info(b, e_path)
+ svn_boolean_t changed = TRUE;
+
+ /* Check related files for content changes to avoid reporting
+ * unchanged copies of files to the client as an open_file() call
+ * and change_file_prop()/apply_textdelta() calls with no-op changes.
+ * The client will otherwise raise unnecessary tree conflicts. */
+ if (!b->ignore_ancestry && t_entry->kind == svn_node_file &&
+ distance == 1)
+ {
+ if (s_root == NULL)
+ SVN_ERR(get_source_root(b, &s_root, s_rev));
+
+ SVN_ERR(svn_fs_props_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ if (!changed)
+ SVN_ERR(svn_fs_contents_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ }
+
+ if ((distance == 0 || !changed) && !any_path_info(b, e_path)
&& (requested_depth <= wc_depth || t_entry->kind == svn_node_file))
{
if (!info)
@@ -1140,13 +1158,11 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
svn_boolean_t start_empty, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
- svn_fs_root_t *s_root;
apr_hash_t *s_entries = NULL, *t_entries;
apr_hash_index_t *hi;
apr_pool_t *subpool = svn_pool_create(pool);
- apr_pool_t *iterpool;
- const char *name, *s_fullpath, *t_fullpath, *e_fullpath;
- path_info_t *info;
+ apr_array_header_t *t_ordered_entries = NULL;
+ int i;
/* Compare the property lists. If we're starting empty, pass a NULL
source path so that we add all the properties.
@@ -1159,19 +1175,25 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
if (requested_depth > svn_depth_empty
|| requested_depth == svn_depth_unknown)
{
+ apr_pool_t *iterpool;
+
/* Get the list of entries in each of source and target. */
if (s_path && !start_empty)
{
+ svn_fs_root_t *s_root;
+
SVN_ERR(get_source_root(b, &s_root, s_rev));
SVN_ERR(svn_fs_dir_entries(&s_entries, s_root, s_path, subpool));
}
SVN_ERR(svn_fs_dir_entries(&t_entries, b->t_root, t_path, subpool));
/* Iterate over the report information for this directory. */
- iterpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(subpool);
while (1)
{
+ path_info_t *info;
+ const char *name, *s_fullpath, *t_fullpath, *e_fullpath;
const svn_fs_dirent_t *s_entry, *t_entry;
svn_pool_clear(iterpool);
@@ -1192,6 +1214,8 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
but don't update the entry yet. */
if (s_entries)
svn_hash_sets(s_entries, name, NULL);
+
+ svn_pool_destroy(info->pool);
continue;
}
@@ -1199,10 +1223,9 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
t_fullpath = svn_fspath__join(t_path, name, iterpool);
t_entry = svn_hash_gets(t_entries, name);
s_fullpath = s_path ? svn_fspath__join(s_path, name, iterpool) : NULL;
- s_entry = s_entries ?
- svn_hash_gets(s_entries, name) : NULL;
+ s_entry = s_entries ? svn_hash_gets(s_entries, name) : NULL;
- /* The only special cases here are
+ /* The only special cases where we don't process the entry are
- When requested_depth is files but the reported path is
a directory. This is technically a client error, but we
@@ -1210,10 +1233,10 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
- When the reported depth is svn_depth_exclude.
*/
- if ((! info || info->depth != svn_depth_exclude)
- && (requested_depth != svn_depth_files
- || ((! t_entry || t_entry->kind != svn_node_dir)
- && (! s_entry || s_entry->kind != svn_node_dir))))
+ if (! ((requested_depth == svn_depth_files
+ && ((t_entry && t_entry->kind == svn_node_dir)
+ || (s_entry && s_entry->kind == svn_node_dir)))
+ || (info && info->depth == svn_depth_exclude)))
SVN_ERR(update_entry(b, s_rev, s_fullpath, s_entry, t_fullpath,
t_entry, dir_baton, e_fullpath, info,
info ? info->depth
@@ -1242,13 +1265,13 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
hi;
hi = apr_hash_next(hi))
{
- const svn_fs_dirent_t *s_entry;
+ const svn_fs_dirent_t *s_entry = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
- s_entry = svn__apr_hash_index_val(hi);
if (svn_hash_gets(t_entries, s_entry->name) == NULL)
{
+ const char *e_fullpath;
svn_revnum_t deleted_rev;
if (s_entry->kind == svn_node_file
@@ -1277,14 +1300,16 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
}
/* Loop over the dirents in the target. */
- for (hi = apr_hash_first(subpool, t_entries);
- hi;
- hi = apr_hash_next(hi))
+ SVN_ERR(svn_fs_dir_optimal_order(&t_ordered_entries, b->t_root,
+ t_entries, subpool, iterpool));
+ for (i = 0; i < t_ordered_entries->nelts; ++i)
{
- const svn_fs_dirent_t *s_entry, *t_entry;
+ const svn_fs_dirent_t *t_entry
+ = APR_ARRAY_IDX(t_ordered_entries, i, svn_fs_dirent_t *);
+ const svn_fs_dirent_t *s_entry;
+ const char *s_fullpath, *t_fullpath, *e_fullpath;
svn_pool_clear(iterpool);
- t_entry = svn__apr_hash_index_val(hi);
if (is_depth_upgrade(wc_depth, requested_depth, t_entry->kind))
{
@@ -1305,11 +1330,9 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
|| requested_depth == svn_depth_files))
continue;
- /* Look for an entry with the same name
- in the source dirents. */
+ /* Look for an entry with the same name in the source dirents. */
s_entry = s_entries ?
- svn_hash_gets(s_entries, t_entry->name)
- : NULL;
+ svn_hash_gets(s_entries, t_entry->name) : NULL;
s_fullpath = s_entry ?
svn_fspath__join(s_path, t_entry->name, iterpool) : NULL;
}
@@ -1325,9 +1348,7 @@ delta_dirs(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
iterpool));
}
-
- /* Destroy iteration subpool. */
- svn_pool_destroy(iterpool);
+ /* iterpool is destroyed by destroying its parent (subpool) below */
}
svn_pool_destroy(subpool);
diff --git a/subversion/libsvn_repos/repos.c b/subversion/libsvn_repos/repos.c
index 9f10c06..1d62aeb 100644
--- a/subversion/libsvn_repos/repos.c
+++ b/subversion/libsvn_repos/repos.c
@@ -267,9 +267,9 @@ create_locks(svn_repos_t *repos, apr_pool_t *pool)
#define HOOKS_ENVIRONMENT_TEXT \
- "# The hook program typically does not inherit the environment of" NL \
- "# its parent process. For example, a common problem is for the" NL \
- "# PATH environment variable to not be set to its usual value, so" NL \
+ "# The hook program runs in an empty environment, unless the server is" NL \
+ "# explicitly configured otherwise. For example, a common problem is for" NL \
+ "# the PATH environment variable to not be set to its usual value, so" NL \
"# that subprograms fail to launch unless invoked via absolute path." NL \
"# If you're having unexpected problems with a hook program, the" NL \
"# culprit may be unusual (or missing) environment variables." NL
@@ -280,11 +280,87 @@ create_locks(svn_repos_t *repos, apr_pool_t *pool)
"# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and" NL \
"# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/" NL
+#define HOOKS_QUOTE_ARGUMENTS_TEXT \
+ "# CAUTION:" NL \
+ "# For security reasons, you MUST always properly quote arguments when" NL \
+ "# you use them, as those arguments could contain whitespace or other" NL \
+ "# problematic characters. Additionally, you should delimit the list" NL \
+ "# of options with \"--\" before passing the arguments, so malicious" NL \
+ "# clients cannot bootleg unexpected options to the commands your" NL \
+ "# script aims to execute." NL \
+ "# For similar reasons, you should also add a trailing @ to URLs which" NL \
+ "# are passed to SVN commands accepting URLs with peg revisions." NL
+
+/* Return template text for a hook script named SCRIPT_NAME. Include
+ * DESCRIPTION and SCRIPT in the template text.
+ */
+static const char *
+hook_template_text(const char *script_name,
+ const char *description,
+ const char *script,
+ apr_pool_t *result_pool)
+{
+ return apr_pstrcat(result_pool,
+"#!/bin/sh" NL
+"" NL,
+ description,
+"#" NL
+"# The default working directory for the invocation is undefined, so" NL
+"# the program should set one explicitly if it cares." NL
+"#" NL
+"# On a Unix system, the normal procedure is to have '", script_name, "'" NL
+"# invoke other programs to do the real work, though it may do the" NL
+"# work itself too." NL
+"#" NL
+"# Note that '", script_name, "' must be executable by the user(s) who will" NL
+"# invoke it (typically the user httpd runs as), and that user must" NL
+"# have filesystem-level permission to access the repository." NL
+"#" NL
+"# On a Windows system, you should name the hook program" NL
+"# '", script_name, ".bat' or '", script_name, ".exe'," NL
+"# but the basic idea is the same." NL
+"#" NL
+HOOKS_ENVIRONMENT_TEXT
+"#" NL
+HOOKS_QUOTE_ARGUMENTS_TEXT
+"#" NL
+"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
+PREWRITTEN_HOOKS_TEXT
+"" NL
+"" NL,
+ script,
+ SVN_VA_NULL);
+}
+
+/* Write a template file for a hook script named SCRIPT_NAME (appending
+ * '.tmpl' to that name) in REPOS. Include DESCRIPTION and SCRIPT in the
+ * template text.
+ */
+static svn_error_t *
+write_hook_template_file(svn_repos_t *repos, const char *script_name,
+ const char *description,
+ const char *script,
+ apr_pool_t *pool)
+{
+ const char *template_path
+ = svn_dirent_join(repos->hook_path,
+ apr_psprintf(pool, "%s%s",
+ script_name, SVN_REPOS__HOOK_DESC_EXT),
+ pool);
+ const char *contents
+ = hook_template_text(script_name, description, script, pool);
+
+ SVN_ERR(svn_io_file_create(template_path, contents, pool));
+ SVN_ERR(svn_io_set_file_executable(template_path, TRUE, FALSE, pool));
+ return SVN_NO_ERROR;
+}
+/* Write the hook template files in REPOS.
+ */
static svn_error_t *
create_hooks(svn_repos_t *repos, apr_pool_t *pool)
{
- const char *this_path, *contents;
+ const char *description, *script;
/* Create the hook directory. */
SVN_ERR_W(create_repos_dir(repos->hook_path, pool),
@@ -293,16 +369,9 @@ create_hooks(svn_repos_t *repos, apr_pool_t *pool)
/*** Write a default template for each standard hook file. */
/* Start-commit hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_start_commit_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_START_COMMIT
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# START-COMMIT HOOK" NL
"#" NL
"# The start-commit hook is invoked immediately after a Subversion txn is" NL
@@ -333,31 +402,10 @@ create_hooks(svn_repos_t *repos, apr_pool_t *pool)
"# make security assumptions based on the capabilities list, nor should" NL
"# you assume that clients reliably report every capability they have." NL
"#" NL
-"# The working directory for this hook program's invocation is undefined," NL
-"# so the program should set one explicitly if it cares." NL
-"#" NL
"# If the hook program exits with success, the commit continues; but" NL
"# if it exits with failure (non-zero), the commit is stopped before" NL
-"# a Subversion txn is created, and STDERR is returned to the client." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"# " NL
-HOOKS_ENVIRONMENT_TEXT
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
-PREWRITTEN_HOOKS_TEXT
-"" NL
-"" NL
+"# a Subversion txn is created, and STDERR is returned to the client." NL;
+ script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
@@ -367,25 +415,17 @@ PREWRITTEN_HOOKS_TEXT
"# All checks passed, so allow the commit." NL
"exit 0" NL;
-#undef SCRIPT_NAME
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating start-commit hook"));
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- _("Creating start-commit hook"));
+#undef SCRIPT_NAME
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end start-commit hook */
/* Pre-commit hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_pre_commit_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_COMMIT
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# PRE-COMMIT HOOK" NL
"#" NL
"# The pre-commit hook is invoked before a Subversion txn is" NL
@@ -407,18 +447,11 @@ PREWRITTEN_HOOKS_TEXT
"# by the separator character '|', followed by the lock token string," NL
"# followed by a newline." NL
"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
-"#" NL
"# If the hook program exits with success, the txn is committed; but" NL
"# if it exits with failure (non-zero), the txn is aborted, no commit" NL
"# takes place, and STDERR is returned to the client. The hook" NL
"# program can use the 'svnlook' utility to help it examine the txn." NL
"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
"# *** NOTE: THE HOOK PROGRAM MUST NOT MODIFY THE TXN, EXCEPT ***" NL
"# *** FOR REVISION PROPERTIES (like svn:log or svn:author). ***" NL
"#" NL
@@ -427,22 +460,8 @@ PREWRITTEN_HOOKS_TEXT
"# hooks should not modify the versioned data in txns, or else come" NL
"# up with a mechanism to make it safe to do so (by informing the" NL
"# committing client of the changes). However, right now neither" NL
-"# mechanism is implemented, so hook writers just have to be careful." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"#" NL
-HOOKS_ENVIRONMENT_TEXT
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
-PREWRITTEN_HOOKS_TEXT
-"" NL
-"" NL
+"# mechanism is implemented, so hook writers just have to be careful." NL;
+ script =
"REPOS=\"$1\"" NL
"TXN=\"$2\"" NL
"" NL
@@ -459,26 +478,17 @@ PREWRITTEN_HOOKS_TEXT
"# All checks passed, so allow the commit." NL
"exit 0" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- _("Creating pre-commit hook"));
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating pre-commit hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end pre-commit hook */
+#undef SCRIPT_NAME
/* Pre-revprop-change hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_pre_revprop_change_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_REVPROP_CHANGE
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# PRE-REVPROP-CHANGE HOOK" NL
"#" NL
"# The pre-revprop-change hook is invoked before a revision property" NL
@@ -506,26 +516,8 @@ PREWRITTEN_HOOKS_TEXT
"# will behave as if the hook were present, but failed. The reason" NL
"# for this is that revision properties are UNVERSIONED, meaning that" NL
"# a successful propchange is destructive; the old value is gone" NL
-"# forever. We recommend the hook back up the old value somewhere." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"#" NL
-HOOKS_ENVIRONMENT_TEXT
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
-PREWRITTEN_HOOKS_TEXT
-"" NL
-"" NL
+"# forever. We recommend the hook back up the old value somewhere." NL;
+ script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"USER=\"$3\"" NL
@@ -537,26 +529,17 @@ PREWRITTEN_HOOKS_TEXT
"echo \"Changing revision properties other than svn:log is prohibited\" >&2" NL
"exit 1" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- _("Creating pre-revprop-change hook"));
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating pre-revprop-change hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end pre-revprop-change hook */
+#undef SCRIPT_NAME
/* Pre-lock hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_pre_lock_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_LOCK
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# PRE-LOCK HOOK" NL
"#" NL
"# The pre-lock hook is invoked before an exclusive lock is" NL
@@ -575,27 +558,10 @@ PREWRITTEN_HOOKS_TEXT
"# this feature, you must guarantee the tokens generated are unique across" NL
"# the repository each time." NL
"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
-"#" NL
"# If the hook program exits with success, the lock is created; but" NL
"# if it exits with failure (non-zero), the lock action is aborted" NL
-"# and STDERR is returned to the client." NL
-"" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"#" NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter:" NL
-"" NL
+"# and STDERR is returned to the client." NL;
+ script =
"REPOS=\"$1\"" NL
"PATH=\"$2\"" NL
"USER=\"$3\"" NL
@@ -629,26 +595,17 @@ PREWRITTEN_HOOKS_TEXT
"echo \"Error: $PATH already locked by ${LOCK_OWNER}.\" 1>&2" NL
"exit 1" NL;
-#undef SCRIPT_NAME
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating pre-lock hook"));
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- "Creating pre-lock hook");
-
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end pre-lock hook */
+#undef SCRIPT_NAME
/* Pre-unlock hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_pre_unlock_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_PRE_UNLOCK
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# PRE-UNLOCK HOOK" NL
"#" NL
"# The pre-unlock hook is invoked before an exclusive lock is" NL
@@ -662,27 +619,10 @@ PREWRITTEN_HOOKS_TEXT
"# [4] TOKEN (the lock token to be destroyed)" NL
"# [5] BREAK-UNLOCK (1 if the user is breaking the lock, else 0)" NL
"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
-"#" NL
"# If the hook program exits with success, the lock is destroyed; but" NL
"# if it exits with failure (non-zero), the unlock action is aborted" NL
-"# and STDERR is returned to the client." NL
-"" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"#" NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter:" NL
-"" NL
+"# and STDERR is returned to the client." NL;
+ script =
"REPOS=\"$1\"" NL
"PATH=\"$2\"" NL
"USER=\"$3\"" NL
@@ -713,27 +653,17 @@ PREWRITTEN_HOOKS_TEXT
"echo \"Error: $PATH locked by ${LOCK_OWNER}.\" 1>&2" NL
"exit 1" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- "Creating pre-unlock hook");
-
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end pre-unlock hook */
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating pre-unlock hook"));
+#undef SCRIPT_NAME
/* Post-commit hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_post_commit_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_COMMIT
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# POST-COMMIT HOOK" NL
"#" NL
"# The post-commit hook is invoked after a commit. Subversion runs" NL
@@ -745,58 +675,28 @@ PREWRITTEN_HOOKS_TEXT
"# [2] REV (the number of the revision just committed)" NL
"# [3] TXN-NAME (the name of the transaction that has become REV)" NL
"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
-"#" NL
"# Because the commit has already completed and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to help it examine the" NL
-"# newly-committed tree." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"# " NL
-HOOKS_ENVIRONMENT_TEXT
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
-PREWRITTEN_HOOKS_TEXT
-"" NL
-"" NL
+"# newly-committed tree." NL;
+ script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"TXN_NAME=\"$3\"" NL
NL
"mailer.py commit \"$REPOS\" \"$REV\" /path/to/mailer.conf" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- _("Creating post-commit hook"));
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating post-commit hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end post-commit hook */
+#undef SCRIPT_NAME
/* Post-lock hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_post_lock_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_LOCK
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# POST-LOCK HOOK" NL
"#" NL
"# The post-lock hook is run after a path is locked. Subversion runs" NL
@@ -807,59 +707,31 @@ PREWRITTEN_HOOKS_TEXT
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] USER (the user who created the lock)" NL
"#" NL
-"# The paths that were just locked are passed to the hook via STDIN (as" NL
-"# of Subversion 1.2, only one path is passed per invocation, but the" NL
-"# plan is to pass all locked paths at once, so the hook program" NL
-"# should be written accordingly)." NL
-"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
+"# The paths that were just locked are passed to the hook via STDIN." NL
"#" NL
-"# Because the lock has already been created and cannot be undone," NL
+"# Because the locks have already been created and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
-"# can use the 'svnlook' utility to help it examine the" NL
-"# newly-created lock." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter:" NL
-"" NL
+"# can use the 'svnlook' utility to examine the paths in the repository" NL
+"# but since the hook is invoked asynchronously the newly-created locks" NL
+"# may no longer be present." NL;
+ script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
"# Send email to interested parties, let them know a lock was created:" NL
"mailer.py lock \"$REPOS\" \"$USER\" /path/to/mailer.conf" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- "Creating post-lock hook");
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating post-lock hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end post-lock hook */
+#undef SCRIPT_NAME
/* Post-unlock hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_post_unlock_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_UNLOCK
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# POST-UNLOCK HOOK" NL
"#" NL
"# The post-unlock hook runs after a path is unlocked. Subversion runs" NL
@@ -870,57 +742,28 @@ PREWRITTEN_HOOKS_TEXT
"# [1] REPOS-PATH (the path to this repository)" NL
"# [2] USER (the user who destroyed the lock)" NL
"#" NL
-"# The paths that were just unlocked are passed to the hook via STDIN" NL
-"# (as of Subversion 1.2, only one path is passed per invocation, but" NL
-"# the plan is to pass all unlocked paths at once, so the hook program" NL
-"# should be written accordingly)." NL
-"#" NL
-"# The default working directory for the invocation is undefined, so" NL
-"# the program should set one explicitly if it cares." NL
+"# The paths that were just unlocked are passed to the hook via STDIN." NL
"#" NL
"# Because the lock has already been destroyed and cannot be undone," NL
-"# the exit code of the hook program is ignored." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter:" NL
-"" NL
+"# the exit code of the hook program is ignored." NL;
+ script =
"REPOS=\"$1\"" NL
"USER=\"$2\"" NL
"" NL
"# Send email to interested parties, let them know a lock was removed:" NL
"mailer.py unlock \"$REPOS\" \"$USER\" /path/to/mailer.conf" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- "Creating post-unlock hook");
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating post-unlock hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end post-unlock hook */
+#undef SCRIPT_NAME
/* Post-revprop-change hook. */
- {
- this_path = apr_psprintf(pool, "%s%s",
- svn_repos_post_revprop_change_hook(repos, pool),
- SVN_REPOS__HOOK_DESC_EXT);
-
#define SCRIPT_NAME SVN_REPOS__HOOK_POST_REVPROP_CHANGE
- contents =
-"#!/bin/sh" NL
-"" NL
+ description =
"# POST-REVPROP-CHANGE HOOK" NL
"#" NL
"# The post-revprop-change hook is invoked after a revision property" NL
@@ -940,26 +783,8 @@ PREWRITTEN_HOOKS_TEXT
"# Because the propchange has already completed and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to help it examine the" NL
-"# new property value." NL
-"#" NL
-"# On a Unix system, the normal procedure is to have '"SCRIPT_NAME"'" NL
-"# invoke other programs to do the real work, though it may do the" NL
-"# work itself too." NL
-"#" NL
-"# Note that '"SCRIPT_NAME"' must be executable by the user(s) who will" NL
-"# invoke it (typically the user httpd runs as), and that user must" NL
-"# have filesystem-level permission to access the repository." NL
-"#" NL
-"# On a Windows system, you should name the hook program" NL
-"# '"SCRIPT_NAME".bat' or '"SCRIPT_NAME".exe'," NL
-"# but the basic idea is the same." NL
-"# " NL
-HOOKS_ENVIRONMENT_TEXT
-"# " NL
-"# Here is an example hook script, for a Unix /bin/sh interpreter." NL
-PREWRITTEN_HOOKS_TEXT
-"" NL
-"" NL
+"# new property value." NL;
+ script =
"REPOS=\"$1\"" NL
"REV=\"$2\"" NL
"USER=\"$3\"" NL
@@ -969,13 +794,11 @@ PREWRITTEN_HOOKS_TEXT
"mailer.py propchange2 \"$REPOS\" \"$REV\" \"$USER\" \"$PROPNAME\" "
"\"$ACTION\" /path/to/mailer.conf" NL;
-#undef SCRIPT_NAME
-
- SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
- _("Creating post-revprop-change hook"));
+ SVN_ERR_W(write_hook_template_file(repos, SCRIPT_NAME,
+ description, script, pool),
+ _("Creating post-revprop-change hook"));
- SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
- } /* end post-revprop-change hook */
+#undef SCRIPT_NAME
return SVN_NO_ERROR;
}
@@ -1025,11 +848,16 @@ create_conf(svn_repos_t *repos, apr_pool_t *pool)
"### no path-based access control is done." NL
"### Uncomment the line below to use the default authorization file." NL
"# authz-db = " SVN_REPOS__CONF_AUTHZ NL
-"### The groups-db option controls the location of the groups file." NL
-"### Unless you specify a path starting with a /, the file's location is" NL
-"### relative to the directory containing this file. The specified path" NL
-"### may be a repository relative URL (^/) or an absolute file:// URL to a" NL
-"### text file in a Subversion repository." NL
+"### The groups-db option controls the location of the file with the" NL
+"### group definitions and allows maintaining groups separately from the" NL
+"### authorization rules. The groups-db file is of the same format as the" NL
+"### authz-db file and should contain a single [groups] section with the" NL
+"### group definitions. If the option is enabled, the authz-db file cannot" NL
+"### contain a [groups] section. Unless you specify a path starting with" NL
+"### a /, the file's location is relative to the directory containing this" NL
+"### file. The specified path may be a repository relative URL (^/) or an" NL
+"### absolute file:// URL to a text file in a Subversion repository." NL
+"### This option is not being used by default." NL
"# groups-db = " SVN_REPOS__CONF_GROUPS NL
"### This option specifies the authentication realm of the repository." NL
"### If two repositories have the same authentication realm, they should" NL
@@ -1306,15 +1134,16 @@ svn_repos_create(svn_repos_t **repos_p,
const char *unused_2,
apr_hash_t *config,
apr_hash_t *fs_config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
svn_repos_t *repos;
svn_error_t *err;
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
const char *root_path;
const char *local_abspath;
/* Allocate a repository object, filling in the format we will create. */
- repos = create_svn_repos_t(path, pool);
+ repos = create_svn_repos_t(path, result_pool);
repos->format = SVN_REPOS__FORMAT_NUMBER;
/* Discover the type of the filesystem we are about to create. */
@@ -1324,48 +1153,56 @@ svn_repos_create(svn_repos_t **repos_p,
repos->format = SVN_REPOS__FORMAT_NUMBER_LEGACY;
/* Don't create a repository inside another repository. */
- SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
- root_path = svn_repos_find_root_path(local_abspath, pool);
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
+ root_path = svn_repos_find_root_path(local_abspath, scratch_pool);
if (root_path != NULL)
{
if (strcmp(root_path, local_abspath) == 0)
return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("'%s' is an existing repository"),
- svn_dirent_local_style(root_path, pool));
+ svn_dirent_local_style(root_path,
+ scratch_pool));
else
return svn_error_createf(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("'%s' is a subdirectory of an existing "
"repository " "rooted at '%s'"),
- svn_dirent_local_style(local_abspath, pool),
- svn_dirent_local_style(root_path, pool));
+ svn_dirent_local_style(local_abspath,
+ scratch_pool),
+ svn_dirent_local_style(root_path,
+ scratch_pool));
}
/* Create the various files and subdirectories for the repository. */
- SVN_ERR_W(create_repos_structure(repos, path, fs_config, pool),
+ SVN_ERR_W(create_repos_structure(repos, path, fs_config, scratch_pool),
_("Repository creation failed"));
/* Lock if needed. */
- SVN_ERR(lock_repos(repos, FALSE, FALSE, pool));
+ SVN_ERR(lock_repos(repos, FALSE, FALSE, scratch_pool));
/* Create an environment for the filesystem. */
- if ((err = svn_fs_create(&repos->fs, repos->db_path, fs_config, pool)))
+ if ((err = svn_fs_create(&repos->fs, repos->db_path, fs_config,
+ result_pool)))
{
/* If there was an error making the filesytem, e.g. unknown/supported
* filesystem type. Clean up after ourselves. Yes this is safe because
* create_repos_structure will fail if the path existed before we started
* so we can't accidentally remove a directory that previously existed.
*/
+ svn_pool_destroy(scratch_pool); /* Release lock to allow deleting dir */
return svn_error_trace(
svn_error_compose_create(
err,
- svn_io_remove_dir2(path, FALSE, NULL, NULL, pool)));
+ svn_io_remove_dir2(path, FALSE, NULL, NULL,
+ result_pool)));
}
/* This repository is ready. Stamp it with a format number. */
SVN_ERR(svn_io_write_version_file
- (svn_dirent_join(path, SVN_REPOS__FORMAT, pool),
- repos->format, pool));
+ (svn_dirent_join(path, SVN_REPOS__FORMAT, scratch_pool),
+ repos->format, scratch_pool));
+
+ svn_pool_destroy(scratch_pool); /* Release lock */
*repos_p = repos;
return SVN_NO_ERROR;
@@ -1450,25 +1287,29 @@ get_repos(svn_repos_t **repos_p,
svn_boolean_t nonblocking,
svn_boolean_t open_fs,
apr_hash_t *fs_config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_repos_t *repos;
+ const char *fs_type;
/* Allocate a repository object. */
- repos = create_svn_repos_t(path, pool);
+ repos = create_svn_repos_t(path, result_pool);
/* Verify the validity of our repository format. */
- SVN_ERR(check_repos_format(repos, pool));
+ SVN_ERR(check_repos_format(repos, scratch_pool));
/* Discover the FS type. */
- SVN_ERR(svn_fs_type(&repos->fs_type, repos->db_path, pool));
+ SVN_ERR(svn_fs_type(&fs_type, repos->db_path, scratch_pool));
+ repos->fs_type = apr_pstrdup(result_pool, fs_type);
/* Lock if needed. */
- SVN_ERR(lock_repos(repos, exclusive, nonblocking, pool));
+ SVN_ERR(lock_repos(repos, exclusive, nonblocking, result_pool));
/* Open up the filesystem only after obtaining the lock. */
if (open_fs)
- SVN_ERR(svn_fs_open(&repos->fs, repos->db_path, fs_config, pool));
+ SVN_ERR(svn_fs_open2(&repos->fs, repos->db_path, fs_config,
+ result_pool, scratch_pool));
#ifdef SVN_DEBUG_CRASH_AT_REPOS_OPEN
/* If $PATH/config/debug-abort exists, crash the server here.
@@ -1479,8 +1320,8 @@ get_repos(svn_repos_t **repos_p,
{
svn_node_kind_t kind;
svn_error_t *err = svn_io_check_path(
- svn_dirent_join(repos->conf_path, "debug-abort", pool),
- &kind, pool);
+ svn_dirent_join(repos->conf_path, "debug-abort", scratch_pool),
+ &kind, scratch_pool);
svn_error_clear(err);
if (!err && kind == svn_node_file)
SVN_ERR_MALFUNCTION_NO_RETURN();
@@ -1521,19 +1362,68 @@ svn_repos_find_root_path(const char *path,
return candidate;
}
-
svn_error_t *
-svn_repos_open2(svn_repos_t **repos_p,
+svn_repos_open3(svn_repos_t **repos_p,
const char *path,
apr_hash_t *fs_config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
/* Fetch a repository object initialized with a shared read/write
lock on the database. */
- return get_repos(repos_p, path, FALSE, FALSE, TRUE, fs_config, pool);
+ return get_repos(repos_p, path, FALSE, FALSE, TRUE, fs_config,
+ result_pool, scratch_pool);
}
+/* Baton used with fs_upgrade_notify, specifying the svn_repos layer
+ * notification parameters.
+ */
+struct fs_upgrade_notify_baton_t
+{
+ svn_repos_notify_func_t notify_func;
+ void *notify_baton;
+};
+
+/* Implements svn_fs_upgrade_notify_t as forwarding to a
+ * svn_repos_notify_func_t passed in a fs_upgrade_notify_baton_t* BATON.
+ */
+static svn_error_t *
+fs_upgrade_notify(void *baton,
+ apr_uint64_t number,
+ svn_fs_upgrade_notify_action_t action,
+ apr_pool_t *pool)
+{
+ struct fs_upgrade_notify_baton_t *fs_baton = baton;
+
+ svn_repos_notify_t *notify = svn_repos_notify_create(
+ svn_repos_notify_mutex_acquired, pool);
+ switch(action)
+ {
+ case svn_fs_upgrade_pack_revprops:
+ notify->shard = number;
+ notify->action = svn_repos_notify_pack_revprops;
+ break;
+
+ case svn_fs_upgrade_cleanup_revprops:
+ notify->shard = number;
+ notify->action = svn_repos_notify_cleanup_revprops;
+ break;
+
+ case svn_fs_upgrade_format_bumped:
+ notify->revision = number;
+ notify->action = svn_repos_notify_format_bumped;
+ break;
+
+ default:
+ /* unknown notification */
+ SVN_ERR_MALFUNCTION();
+ }
+
+ fs_baton->notify_func(fs_baton->notify_baton, notify, pool);
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
svn_repos_upgrade2(const char *path,
@@ -1547,12 +1437,17 @@ svn_repos_upgrade2(const char *path,
int format;
apr_pool_t *subpool = svn_pool_create(pool);
+ struct fs_upgrade_notify_baton_t fs_notify_baton;
+ fs_notify_baton.notify_func = notify_func;
+ fs_notify_baton.notify_baton = notify_baton;
+
/* Fetch a repository object; for the Berkeley DB backend, it is
initialized with an EXCLUSIVE lock on the database. This will at
least prevent others from trying to read or write to it while we
run recovery. (Other backends should do their own locking; see
lock_repos.) */
- SVN_ERR(get_repos(&repos, path, TRUE, nonblocking, FALSE, NULL, subpool));
+ SVN_ERR(get_repos(&repos, path, TRUE, nonblocking, FALSE, NULL, subpool,
+ subpool));
if (notify_func)
{
@@ -1575,7 +1470,9 @@ svn_repos_upgrade2(const char *path,
SVN_ERR(svn_io_write_version_file(format_path, format, subpool));
/* Try to upgrade the filesystem. */
- SVN_ERR(svn_fs_upgrade(repos->db_path, subpool));
+ SVN_ERR(svn_fs_upgrade2(repos->db_path,
+ notify_func ? fs_upgrade_notify : NULL,
+ &fs_notify_baton, NULL, NULL, subpool));
/* Now overwrite our format file with the latest version. */
SVN_ERR(svn_io_write_version_file(format_path, SVN_REPOS__FORMAT_NUMBER,
@@ -1598,7 +1495,7 @@ svn_repos_delete(const char *path,
SVN_ERR(svn_fs_delete_fs(db_path, pool));
/* ...then blow away everything else. */
- return svn_io_remove_dir2(path, FALSE, NULL, NULL, pool);
+ return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
}
@@ -1677,6 +1574,63 @@ svn_repos_has_capability(svn_repos_t *repos,
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_repos_capabilities(apr_hash_t **capabilities,
+ svn_repos_t *repos,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ static const char *const queries[] = {
+ SVN_REPOS_CAPABILITY_MERGEINFO,
+ NULL
+ };
+ const char *const *i;
+
+ *capabilities = apr_hash_make(result_pool);
+
+ for (i = queries; *i; i++)
+ {
+ svn_boolean_t has;
+ SVN_ERR(svn_repos_has_capability(repos, &has, *i, scratch_pool));
+ if (has)
+ svn_hash_sets(*capabilities, *i, *i);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ *repos_format = repos->format;
+ *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+ (*supports_version)->major = SVN_VER_MAJOR;
+ (*supports_version)->minor = 0;
+ (*supports_version)->patch = 0;
+ (*supports_version)->tag = "";
+
+ switch (repos->format)
+ {
+ case SVN_REPOS__FORMAT_NUMBER_LEGACY:
+ break;
+ case SVN_REPOS__FORMAT_NUMBER_1_4:
+ (*supports_version)->minor = 4;
+ break;
+#ifdef SVN_DEBUG
+# if SVN_REPOS__FORMAT_NUMBER != SVN_REPOS__FORMAT_NUMBER_1_4
+# error "Need to add a 'case' statement here"
+# endif
+#endif
+ }
+
+ return SVN_NO_ERROR;
+}
+
svn_fs_t *
svn_repos_fs(svn_repos_t *repos)
{
@@ -1685,6 +1639,12 @@ svn_repos_fs(svn_repos_t *repos)
return repos->fs;
}
+const char *
+svn_repos_fs_type(svn_repos_t *repos,
+ apr_pool_t *result_pool)
+{
+ return apr_pstrdup(result_pool, repos->fs_type);
+}
/* For historical reasons, for the Berkeley DB backend, this code uses
* repository locking, which is motivated by the need to support the
@@ -1728,7 +1688,7 @@ svn_repos_recover4(const char *path,
SVN_ERR(get_repos(&repos, path, TRUE, nonblocking,
FALSE, /* don't try to open the db yet. */
NULL,
- subpool));
+ subpool, subpool));
if (notify_func)
{
@@ -1756,6 +1716,9 @@ struct freeze_baton_t {
int counter;
svn_repos_freeze_func_t freeze_func;
void *freeze_baton;
+
+ /* Scratch pool used for every freeze callback invocation. */
+ apr_pool_t *scratch_pool;
};
static svn_error_t *
@@ -1764,6 +1727,7 @@ multi_freeze(void *baton,
{
struct freeze_baton_t *fb = baton;
+ svn_pool_clear(fb->scratch_pool);
if (fb->counter == fb->paths->nelts)
{
SVN_ERR(fb->freeze_func(fb->freeze_baton, pool));
@@ -1783,7 +1747,7 @@ multi_freeze(void *baton,
TRUE /* exclusive (only applies to BDB) */,
FALSE /* non-blocking */,
FALSE /* open-fs */,
- NULL, subpool));
+ NULL, subpool, fb->scratch_pool));
if (strcmp(repos->fs_type, SVN_FS_TYPE_BDB) == 0)
@@ -1796,7 +1760,8 @@ multi_freeze(void *baton,
}
else
{
- SVN_ERR(svn_fs_open(&repos->fs, repos->db_path, NULL, subpool));
+ SVN_ERR(svn_fs_open2(&repos->fs, repos->db_path, NULL, subpool,
+ fb->scratch_pool));
SVN_ERR(svn_fs_freeze(svn_repos_fs(repos), multi_freeze, fb,
subpool));
}
@@ -1825,9 +1790,11 @@ svn_repos_freeze(apr_array_header_t *paths,
fb.counter = 0;
fb.freeze_func = freeze_func;
fb.freeze_baton = freeze_baton;
+ fb.scratch_pool = svn_pool_create(pool);
SVN_ERR(multi_freeze(&fb, pool));
+ svn_pool_destroy(fb.scratch_pool);
return SVN_NO_ERROR;
}
@@ -1843,7 +1810,7 @@ svn_error_t *svn_repos_db_logfiles(apr_array_header_t **logfiles,
FALSE, FALSE,
FALSE, /* Do not open fs. */
NULL,
- pool));
+ pool, pool));
SVN_ERR(svn_fs_berkeley_logfiles(logfiles,
svn_repos_db_env(repos, pool),
@@ -1958,25 +1925,57 @@ lock_db_logs_file(svn_repos_t *repos,
}
+/* Baton used with fs_hotcopy_notify(), specifying the svn_repos layer
+ * notification parameters.
+ */
+struct fs_hotcopy_notify_baton_t
+{
+ svn_repos_notify_func_t notify_func;
+ void *notify_baton;
+};
+
+/* Implements svn_fs_hotcopy_notify_t as forwarding to a
+ * svn_repos_notify_func_t passed in a fs_hotcopy_notify_baton_t* BATON.
+ */
+static void
+fs_hotcopy_notify(void *baton,
+ svn_revnum_t start_revision,
+ svn_revnum_t end_revision,
+ apr_pool_t *pool)
+{
+ struct fs_hotcopy_notify_baton_t *fs_baton = baton;
+ svn_repos_notify_t *notify;
+
+ notify = svn_repos_notify_create(svn_repos_notify_hotcopy_rev_range, pool);
+ notify->start_revision = start_revision;
+ notify->end_revision = end_revision;
+
+ fs_baton->notify_func(fs_baton->notify_baton, notify, pool);
+}
+
/* Make a copy of a repository with hot backup of fs. */
svn_error_t *
-svn_repos_hotcopy2(const char *src_path,
+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 *pool)
+ apr_pool_t *scratch_pool)
{
- svn_repos_t *src_repos;
- svn_repos_t *dst_repos;
+ svn_fs_hotcopy_notify_t fs_notify_func;
+ struct fs_hotcopy_notify_baton_t fs_notify_baton;
struct hotcopy_ctx_t hotcopy_context;
- svn_error_t *err;
const char *src_abspath;
const char *dst_abspath;
+ svn_repos_t *src_repos;
+ svn_repos_t *dst_repos;
+ svn_error_t *err;
- SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path, pool));
- SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path, pool));
+ SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path, scratch_pool));
+ SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path, scratch_pool));
if (strcmp(src_abspath, dst_abspath) == 0)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Hotcopy source and destination are equal"));
@@ -1986,7 +1985,7 @@ svn_repos_hotcopy2(const char *src_path,
FALSE, FALSE,
FALSE, /* don't try to open the db yet. */
NULL,
- pool));
+ scratch_pool, scratch_pool));
/* If we are going to clean logs, then get an exclusive lock on
db-logs.lock, to ensure that no one else will work with logs.
@@ -1994,7 +1993,7 @@ svn_repos_hotcopy2(const char *src_path,
If we are just copying, then get a shared lock to ensure that
no one else will clean logs while we copying them */
- SVN_ERR(lock_db_logs_file(src_repos, clean_logs, pool));
+ SVN_ERR(lock_db_logs_file(src_repos, clean_logs, scratch_pool));
/* Copy the repository to a new path, with exception of
specially handled directories */
@@ -2008,16 +2007,16 @@ svn_repos_hotcopy2(const char *src_path,
0,
hotcopy_structure,
&hotcopy_context,
- pool));
+ scratch_pool));
/* Prepare dst_repos object so that we may create locks,
so that we may open repository */
- dst_repos = create_svn_repos_t(dst_abspath, pool);
+ dst_repos = create_svn_repos_t(dst_abspath, scratch_pool);
dst_repos->fs_type = src_repos->fs_type;
dst_repos->format = src_repos->format;
- err = create_locks(dst_repos, pool);
+ err = create_locks(dst_repos, scratch_pool);
if (err)
{
if (incremental && err->apr_err == SVN_ERR_DIR_NOT_EMPTY)
@@ -2026,7 +2025,8 @@ svn_repos_hotcopy2(const char *src_path,
return svn_error_trace(err);
}
- err = svn_io_dir_make_sgid(dst_repos->db_path, APR_OS_DEFAULT, pool);
+ err = svn_io_dir_make_sgid(dst_repos->db_path, APR_OS_DEFAULT,
+ scratch_pool);
if (err)
{
if (incremental && APR_STATUS_IS_EEXIST(err->apr_err))
@@ -2037,26 +2037,21 @@ svn_repos_hotcopy2(const char *src_path,
/* Exclusively lock the new repository.
No one should be accessing it at the moment */
- SVN_ERR(lock_repos(dst_repos, TRUE, FALSE, pool));
+ SVN_ERR(lock_repos(dst_repos, TRUE, FALSE, scratch_pool));
- SVN_ERR(svn_fs_hotcopy2(src_repos->db_path, dst_repos->db_path,
+ fs_notify_func = notify_func ? fs_hotcopy_notify : NULL;
+ fs_notify_baton.notify_func = notify_func;
+ fs_notify_baton.notify_baton = notify_baton;
+
+ SVN_ERR(svn_fs_hotcopy3(src_repos->db_path, dst_repos->db_path,
clean_logs, incremental,
- cancel_func, cancel_baton, pool));
+ fs_notify_func, &fs_notify_baton,
+ cancel_func, cancel_baton, scratch_pool));
/* Destination repository is ready. Stamp it with a format number. */
return svn_io_write_version_file
- (svn_dirent_join(dst_repos->path, SVN_REPOS__FORMAT, pool),
- dst_repos->format, pool);
-}
-
-svn_error_t *
-svn_repos_hotcopy(const char *src_path,
- const char *dst_path,
- svn_boolean_t clean_logs,
- apr_pool_t *pool)
-{
- return svn_error_trace(svn_repos_hotcopy2(src_path, dst_path, clean_logs,
- FALSE, NULL, NULL, pool));
+ (svn_dirent_join(dst_repos->path, SVN_REPOS__FORMAT, scratch_pool),
+ dst_repos->format, scratch_pool);
}
/* Return the library version number. */
@@ -2077,7 +2072,6 @@ svn_repos_stat(svn_dirent_t **dirent,
svn_node_kind_t kind;
svn_dirent_t *ent;
const char *datestring;
- apr_hash_t *prophash;
SVN_ERR(svn_fs_check_path(&kind, root, path, pool));
@@ -2093,9 +2087,7 @@ svn_repos_stat(svn_dirent_t **dirent,
if (kind == svn_node_file)
SVN_ERR(svn_fs_file_length(&(ent->size), root, path, pool));
- SVN_ERR(svn_fs_node_proplist(&prophash, root, path, pool));
- if (apr_hash_count(prophash) > 0)
- ent->has_props = TRUE;
+ SVN_ERR(svn_fs_node_has_props(&ent->has_props, root, path, pool));
SVN_ERR(svn_repos_get_committed_info(&(ent->created_rev),
&datestring,
diff --git a/subversion/libsvn_repos/repos.h b/subversion/libsvn_repos/repos.h
index fd5b0b4..b1039ac 100644
--- a/subversion/libsvn_repos/repos.h
+++ b/subversion/libsvn_repos/repos.h
@@ -382,6 +382,11 @@ svn_repos__authz_read(svn_authz_t **authz_p,
svn_boolean_t accept_urls,
apr_pool_t *pool);
+/* Walk the configuration in AUTHZ looking for any errors. */
+svn_error_t *
+svn_repos__authz_validate(svn_authz_t *authz,
+ apr_pool_t *pool);
+
/*** Utility Functions ***/
diff --git a/subversion/libsvn_repos/rev_hunt.c b/subversion/libsvn_repos/rev_hunt.c
index 77b1f2a..d6cc495 100644
--- a/subversion/libsvn_repos/rev_hunt.c
+++ b/subversion/libsvn_repos/rev_hunt.c
@@ -38,6 +38,8 @@
#include "svn_mergeinfo.h"
#include "repos.h"
#include "private/svn_fspath.h"
+#include "private/svn_fs_private.h"
+#include "private/svn_sorts_private.h"
/* Note: this binary search assumes that the datestamp properties on
@@ -171,12 +173,8 @@ svn_repos_get_committed_info(svn_revnum_t *committed_rev,
SVN_ERR(svn_fs_revision_proplist(&revprops, fs, *committed_rev, pool));
/* Extract date and author from these revprops. */
- committed_date_s = apr_hash_get(revprops,
- SVN_PROP_REVISION_DATE,
- sizeof(SVN_PROP_REVISION_DATE)-1);
- last_author_s = apr_hash_get(revprops,
- SVN_PROP_REVISION_AUTHOR,
- sizeof(SVN_PROP_REVISION_AUTHOR)-1);
+ committed_date_s = svn_hash_gets(revprops, SVN_PROP_REVISION_DATE);
+ last_author_s = svn_hash_gets(revprops, SVN_PROP_REVISION_AUTHOR);
*committed_date = committed_date_s ? committed_date_s->data : NULL;
*last_author = last_author_s ? last_author_s->data : NULL;
@@ -233,7 +231,7 @@ svn_repos_history2(svn_fs_t *fs,
return svn_error_create(SVN_ERR_AUTHZ_UNREADABLE, NULL, NULL);
}
- SVN_ERR(svn_fs_node_history(&history, root, path, oldpool));
+ SVN_ERR(svn_fs_node_history2(&history, root, path, oldpool, oldpool));
/* Now, we loop over the history items, calling svn_fs_history_prev(). */
do
@@ -244,7 +242,8 @@ svn_repos_history2(svn_fs_t *fs,
apr_pool_t *tmppool;
svn_error_t *err;
- SVN_ERR(svn_fs_history_prev(&history, history, cross_copies, newpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, cross_copies, newpool,
+ oldpool));
/* Only continue if there is further history to deal with. */
if (! history)
@@ -311,12 +310,11 @@ svn_repos_deleted_rev(svn_fs_t *fs,
svn_revnum_t *deleted,
apr_pool_t *pool)
{
- apr_pool_t *subpool;
- svn_fs_root_t *root, *copy_root;
- const char *copy_path;
+ apr_pool_t *iterpool;
+ svn_fs_root_t *start_root, *root;
svn_revnum_t mid_rev;
- const svn_fs_id_t *start_node_id, *curr_node_id;
- svn_error_t *err;
+ svn_node_kind_t kind;
+ svn_fs_node_relation_t node_relation;
/* Validate the revision range. */
if (! SVN_IS_VALID_REVNUM(start))
@@ -337,32 +335,19 @@ svn_repos_deleted_rev(svn_fs_t *fs,
}
/* Ensure path exists in fs at start revision. */
- SVN_ERR(svn_fs_revision_root(&root, fs, start, pool));
- err = svn_fs_node_id(&start_node_id, root, path, pool);
- if (err)
+ SVN_ERR(svn_fs_revision_root(&start_root, fs, start, pool));
+ SVN_ERR(svn_fs_check_path(&kind, start_root, path, pool));
+ if (kind == svn_node_none)
{
- if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- /* Path must exist in fs at start rev. */
- *deleted = SVN_INVALID_REVNUM;
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
- return svn_error_trace(err);
+ /* Path must exist in fs at start rev. */
+ *deleted = SVN_INVALID_REVNUM;
+ return SVN_NO_ERROR;
}
/* Ensure path was deleted at or before end revision. */
SVN_ERR(svn_fs_revision_root(&root, fs, end, pool));
- err = svn_fs_node_id(&curr_node_id, root, path, pool);
- if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- }
- else if (err)
- {
- return svn_error_trace(err);
- }
- else
+ SVN_ERR(svn_fs_check_path(&kind, root, path, pool));
+ if (kind != svn_node_none)
{
/* path exists in the end node and the end node is equivalent
or otherwise equivalent to the start node. This can mean
@@ -389,9 +374,12 @@ svn_repos_deleted_rev(svn_fs_t *fs,
5) The start node was deleted and replaced by a node which
it does not share any history with.
*/
- SVN_ERR(svn_fs_node_id(&curr_node_id, root, path, pool));
- if (svn_fs_compare_ids(start_node_id, curr_node_id) != -1)
+ SVN_ERR(svn_fs_node_relation(&node_relation, start_root, path,
+ root, path, pool));
+ if (node_relation != svn_fs_node_unrelated)
{
+ svn_fs_root_t *copy_root;
+ const char *copy_path;
SVN_ERR(svn_fs_closest_copy(&copy_root, &copy_path, root,
path, pool));
if (!copy_root ||
@@ -445,36 +433,33 @@ svn_repos_deleted_rev(svn_fs_t *fs,
*/
mid_rev = (start + end) / 2;
- subpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(pool);
while (1)
{
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
/* Get revision root and node id for mid_rev at that revision. */
- SVN_ERR(svn_fs_revision_root(&root, fs, mid_rev, subpool));
- err = svn_fs_node_id(&curr_node_id, root, path, subpool);
-
- if (err)
+ SVN_ERR(svn_fs_revision_root(&root, fs, mid_rev, iterpool));
+ SVN_ERR(svn_fs_check_path(&kind, root, path, iterpool));
+ if (kind == svn_node_none)
{
- if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- /* Case D: Look lower in the range. */
- svn_error_clear(err);
- end = mid_rev;
- mid_rev = (start + mid_rev) / 2;
- }
- else
- return svn_error_trace(err);
+ /* Case D: Look lower in the range. */
+ end = mid_rev;
+ mid_rev = (start + mid_rev) / 2;
}
else
{
+ svn_fs_root_t *copy_root;
+ const char *copy_path;
/* Determine the relationship between the start node
and the current node. */
- int cmp = svn_fs_compare_ids(start_node_id, curr_node_id);
- SVN_ERR(svn_fs_closest_copy(&copy_root, &copy_path, root,
- path, subpool));
- if (cmp == -1 ||
+ SVN_ERR(svn_fs_node_relation(&node_relation, start_root, path,
+ root, path, iterpool));
+ if (node_relation != svn_fs_node_unrelated)
+ SVN_ERR(svn_fs_closest_copy(&copy_root, &copy_path, root,
+ path, iterpool));
+ if (node_relation == svn_fs_node_unrelated ||
(copy_root &&
(svn_fs_revision_root_revision(copy_root) > start)))
{
@@ -497,7 +482,7 @@ svn_repos_deleted_rev(svn_fs_t *fs,
}
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
@@ -542,7 +527,7 @@ check_ancestry_of_peg_path(svn_boolean_t *is_ancestor,
SVN_ERR(svn_fs_revision_root(&root, fs, future_revision, pool));
- SVN_ERR(svn_fs_node_history(&history, root, fs_path, lastpool));
+ SVN_ERR(svn_fs_node_history2(&history, root, fs_path, lastpool, lastpool));
/* Since paths that are different according to strcmp may still be
equivalent (due to number of consecutive slashes and the fact that
@@ -555,7 +540,8 @@ check_ancestry_of_peg_path(svn_boolean_t *is_ancestor,
{
apr_pool_t *tmppool;
- SVN_ERR(svn_fs_history_prev(&history, history, TRUE, currpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, TRUE, currpool,
+ lastpool));
if (!history)
break;
@@ -657,14 +643,13 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
svn_revnum_t revision;
svn_boolean_t is_ancestor;
apr_pool_t *lastpool, *currpool;
- const svn_fs_id_t *id;
SVN_ERR_ASSERT(location_revisions_orig->elt_size == sizeof(svn_revnum_t));
/* Ensure that FS_PATH is absolute, because our path-math below will
depend on that being the case. */
if (*fs_path != '/')
- fs_path = apr_pstrcat(pool, "/", fs_path, (char *)NULL);
+ fs_path = apr_pstrcat(pool, "/", fs_path, SVN_VA_NULL);
/* Another sanity check. */
if (authz_read_func)
@@ -726,23 +711,6 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
if (! prev_path)
break;
- if (authz_read_func)
- {
- svn_boolean_t readable;
- svn_fs_root_t *tmp_root;
-
- SVN_ERR(svn_fs_revision_root(&tmp_root, fs, revision, currpool));
- SVN_ERR(authz_read_func(&readable, tmp_root, path,
- authz_read_baton, currpool));
- if (! readable)
- {
- svn_pool_destroy(lastpool);
- svn_pool_destroy(currpool);
-
- return SVN_NO_ERROR;
- }
- }
-
/* Assign the current path to all younger revisions until we reach
the copy target rev. */
while ((revision_ptr < revision_ptr_end)
@@ -765,6 +733,20 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
path = prev_path;
revision = prev_rev;
+ if (authz_read_func)
+ {
+ svn_boolean_t readable;
+ SVN_ERR(svn_fs_revision_root(&root, fs, revision, currpool));
+ SVN_ERR(authz_read_func(&readable, root, path,
+ authz_read_baton, currpool));
+ if (!readable)
+ {
+ svn_pool_destroy(lastpool);
+ svn_pool_destroy(currpool);
+ return SVN_NO_ERROR;
+ }
+ }
+
/* Clear last pool and switch. */
svn_pool_clear(lastpool);
tmppool = lastpool;
@@ -777,20 +759,22 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
the node existing at the same path. We will look up path@lrev
for each remaining location-revision and make sure it is related
to path@revision. */
- SVN_ERR(svn_fs_revision_root(&root, fs, revision, currpool));
- SVN_ERR(svn_fs_node_id(&id, root, path, pool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, revision, lastpool));
while (revision_ptr < revision_ptr_end)
{
svn_node_kind_t kind;
- const svn_fs_id_t *lrev_id;
+ svn_fs_node_relation_t node_relation;
+ svn_fs_root_t *cur_rev_root;
svn_pool_clear(currpool);
- SVN_ERR(svn_fs_revision_root(&root, fs, *revision_ptr, currpool));
- SVN_ERR(svn_fs_check_path(&kind, root, path, currpool));
+ SVN_ERR(svn_fs_revision_root(&cur_rev_root, fs, *revision_ptr,
+ currpool));
+ SVN_ERR(svn_fs_check_path(&kind, cur_rev_root, path, currpool));
if (kind == svn_node_none)
break;
- SVN_ERR(svn_fs_node_id(&lrev_id, root, path, currpool));
- if (! svn_fs_check_related(id, lrev_id))
+ SVN_ERR(svn_fs_node_relation(&node_relation, root, path,
+ cur_rev_root, path, currpool));
+ if (node_relation == svn_fs_node_unrelated)
break;
/* The node exists at the same path; record that and advance. */
@@ -881,7 +865,7 @@ svn_repos_node_location_segments(svn_repos_t *repos,
/* Ensure that PATH is absolute, because our path-math will depend
on that being the case. */
if (*path != '/')
- path = apr_pstrcat(pool, "/", path, (char *)NULL);
+ path = apr_pstrcat(pool, "/", path, SVN_VA_NULL);
/* Auth check. */
if (authz_read_func)
@@ -945,7 +929,7 @@ svn_repos_node_location_segments(svn_repos_t *repos,
/* authz_read_func requires path to have a leading slash. */
const char *abs_path = apr_pstrcat(subpool, "/", segment->path,
- (char *)NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_fs_revision_root(&cur_rev_root, fs,
segment->range_end, subpool));
@@ -982,37 +966,6 @@ svn_repos_node_location_segments(svn_repos_t *repos,
return SVN_NO_ERROR;
}
-/* Get the mergeinfo for PATH in REPOS at REVNUM and store it in MERGEINFO. */
-static svn_error_t *
-get_path_mergeinfo(apr_hash_t **mergeinfo,
- svn_fs_t *fs,
- const char *path,
- svn_revnum_t revnum,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_mergeinfo_catalog_t tmp_catalog;
- svn_fs_root_t *root;
- apr_array_header_t *paths = apr_array_make(scratch_pool, 1,
- sizeof(const char *));
-
- APR_ARRAY_PUSH(paths, const char *) = path;
-
- SVN_ERR(svn_fs_revision_root(&root, fs, revnum, scratch_pool));
- /* We do not need to call svn_repos_fs_get_mergeinfo() (which performs authz)
- because we will filter out unreadable revisions in
- find_interesting_revision(), above */
- SVN_ERR(svn_fs_get_mergeinfo2(&tmp_catalog, root, paths,
- svn_mergeinfo_inherited, FALSE, TRUE,
- result_pool, scratch_pool));
-
- *mergeinfo = svn_hash_gets(tmp_catalog, path);
- if (!*mergeinfo)
- *mergeinfo = apr_hash_make(result_pool);
-
- return SVN_NO_ERROR;
-}
-
static APR_INLINE svn_boolean_t
is_path_in_hash(apr_hash_t *duplicate_path_revs,
const char *path,
@@ -1031,7 +984,8 @@ struct path_revision
svn_revnum_t revnum;
const char *path;
- /* Does this path_rev have merges to also be included? */
+ /* Does this path_rev have merges to also be included? If so, this is
+ the union of both additions and (negated) deletions of mergeinfo. */
apr_hash_t *merged_mergeinfo;
/* Is this a merged revision? */
@@ -1040,6 +994,7 @@ struct path_revision
/* Check for merges in OLD_PATH_REV->PATH at OLD_PATH_REV->REVNUM. Store
the mergeinfo difference in *MERGED_MERGEINFO, allocated in POOL. The
+ difference is the union of both additions and (negated) deletions. The
returned *MERGED_MERGEINFO will be NULL if there are no changes. */
static svn_error_t *
get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
@@ -1050,7 +1005,7 @@ get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
{
apr_hash_t *curr_mergeinfo, *prev_mergeinfo, *deleted, *changed;
svn_error_t *err;
- svn_fs_root_t *root;
+ svn_fs_root_t *root, *prev_root;
apr_hash_t *changed_paths;
const char *path = old_path_rev->path;
@@ -1062,7 +1017,8 @@ get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
while (1)
{
svn_fs_path_change2_t *changed_path = svn_hash_gets(changed_paths, path);
- if (changed_path && changed_path->prop_mod)
+ if (changed_path && changed_path->prop_mod
+ && changed_path->mergeinfo_mod != svn_tristate_false)
break;
if (svn_fspath__is_root(path, strlen(path)))
{
@@ -1074,9 +1030,13 @@ get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
/* First, find the mergeinfo difference for old_path_rev->revnum, and
old_path_rev->revnum - 1. */
- err = get_path_mergeinfo(&curr_mergeinfo, repos->fs, old_path_rev->path,
- old_path_rev->revnum, scratch_pool,
- scratch_pool);
+ /* We do not need to call svn_repos_fs_get_mergeinfo() (which performs authz)
+ because we will filter out unreadable revisions in
+ find_interesting_revision() */
+ err = svn_fs__get_mergeinfo_for_path(&curr_mergeinfo,
+ root, old_path_rev->path,
+ svn_mergeinfo_inherited, TRUE,
+ scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
@@ -1094,9 +1054,12 @@ get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
}
}
- err = get_path_mergeinfo(&prev_mergeinfo, repos->fs, old_path_rev->path,
- old_path_rev->revnum - 1, scratch_pool,
- scratch_pool);
+ SVN_ERR(svn_fs_revision_root(&prev_root, repos->fs, old_path_rev->revnum - 1,
+ scratch_pool));
+ err = svn_fs__get_mergeinfo_for_path(&prev_mergeinfo,
+ prev_root, old_path_rev->path,
+ svn_mergeinfo_inherited, TRUE,
+ scratch_pool, scratch_pool);
if (err && (err->apr_err == SVN_ERR_FS_NOT_FOUND
|| err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR))
{
@@ -1109,7 +1072,8 @@ get_merged_mergeinfo(apr_hash_t **merged_mergeinfo,
else
SVN_ERR(err);
- /* Then calculate and merge the differences. */
+ /* Then calculate and merge the differences, combining additions and
+ (negated) deletions as all positive changes in CHANGES. */
SVN_ERR(svn_mergeinfo_diff2(&deleted, &changed, prev_mergeinfo,
curr_mergeinfo, FALSE, result_pool,
scratch_pool));
@@ -1157,7 +1121,8 @@ find_interesting_revisions(apr_array_header_t *path_revisions,
path, end);
/* Open a history object. */
- SVN_ERR(svn_fs_node_history(&history, root, path, scratch_pool));
+ SVN_ERR(svn_fs_node_history2(&history, root, path, scratch_pool,
+ scratch_pool));
while (1)
{
struct path_revision *path_rev;
@@ -1168,7 +1133,8 @@ find_interesting_revisions(apr_array_header_t *path_revisions,
svn_pool_clear(iterpool);
/* Fetch the history object to walk through. */
- SVN_ERR(svn_fs_history_prev(&history, history, TRUE, iterpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, TRUE, iterpool,
+ iterpool));
if (!history)
break;
SVN_ERR(svn_fs_history_location(&tmp_path, &tmp_revnum,
@@ -1290,16 +1256,14 @@ find_merged_revisions(apr_array_header_t **merged_path_revisions_out,
for (hi = apr_hash_first(iterpool, old_pr->merged_mergeinfo); hi;
hi = apr_hash_next(hi))
{
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
apr_pool_t *iterpool3;
- svn_rangelist_t *rangelist;
- const char *path;
int j;
svn_pool_clear(iterpool2);
iterpool3 = svn_pool_create(iterpool2);
- apr_hash_this(hi, (void *) &path, NULL, (void *) &rangelist);
-
for (j = 0; j < rangelist->nelts; j++)
{
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, j,
@@ -1346,8 +1310,7 @@ find_merged_revisions(apr_array_header_t **merged_path_revisions_out,
while (new_merged_path_revs->nelts > 0);
/* Sort MERGED_PATH_REVISIONS in increasing order by REVNUM. */
- qsort(merged_path_revisions->elts, merged_path_revisions->nelts,
- sizeof(struct path_revision *), compare_path_revisions);
+ svn_sort__array(merged_path_revisions, compare_path_revisions);
/* Copy to the output array. */
*merged_path_revisions_out = apr_array_copy(result_pool,
@@ -1366,6 +1329,7 @@ struct send_baton
apr_hash_t *last_props;
const char *last_path;
svn_fs_root_t *last_root;
+ svn_boolean_t include_merged_revisions;
};
/* Send PATH_REV to HANDLER and HANDLER_BATON, using information provided by
@@ -1403,14 +1367,32 @@ send_path_revision(struct path_revision *path_rev,
SVN_ERR(svn_prop_diffs(&prop_diffs, props, sb->last_props,
sb->iterpool));
- /* Check if the contents changed. */
- /* Special case: In the first revision, we always provide a delta. */
- if (sb->last_root)
- SVN_ERR(svn_fs_contents_changed(&contents_changed, sb->last_root,
- sb->last_path, root, path_rev->path,
- sb->iterpool));
+ /* Check if the contents *may* have changed. */
+ if (! sb->last_root)
+ {
+ /* Special case: In the first revision, we always provide a delta. */
+ contents_changed = TRUE;
+ }
+ else if (sb->include_merged_revisions
+ && strcmp(sb->last_path, path_rev->path))
+ {
+ /* ### This is a HACK!!!
+ * Blame -g, in older clients anyways, relies on getting a notification
+ * whenever the path changes - even if there was no content change.
+ *
+ * TODO: A future release should take an extra parameter and depending
+ * on that either always send a text delta or only send it if there
+ * is a difference. */
+ contents_changed = TRUE;
+ }
else
- contents_changed = TRUE;
+ {
+ /* Did the file contents actually change?
+ * It could e.g. be a property-only change. */
+ SVN_ERR(svn_fs_contents_different(&contents_changed, sb->last_root,
+ sb->last_path, root, path_rev->path,
+ sb->iterpool));
+ }
/* We have all we need, give to the handler. */
SVN_ERR(handler(handler_baton, path_rev->path, path_rev->revnum,
@@ -1422,7 +1404,7 @@ send_path_revision(struct path_revision *path_rev,
/* Compute and send delta if client asked for it.
Note that this was initialized to NULL, so if !contents_changed,
no deltas will be computed. */
- if (delta_handler)
+ if (delta_handler && delta_handler != svn_delta_noop_window_handler)
{
/* Get the content delta. */
SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream,
@@ -1479,6 +1461,7 @@ get_file_revs_backwards(svn_repos_t *repos,
last_pool = svn_pool_create(scratch_pool);
sb.iterpool = svn_pool_create(scratch_pool);
sb.last_pool = svn_pool_create(scratch_pool);
+ sb.include_merged_revisions = FALSE;
/* We want the first txdelta to be against the empty file. */
sb.last_root = NULL;
@@ -1496,7 +1479,7 @@ get_file_revs_backwards(svn_repos_t *repos,
path, end);
/* Open a history object. */
- SVN_ERR(svn_fs_node_history(&history, root, path, scratch_pool));
+ SVN_ERR(svn_fs_node_history2(&history, root, path, scratch_pool, iterpool));
while (1)
{
struct path_revision *path_rev;
@@ -1506,7 +1489,8 @@ get_file_revs_backwards(svn_repos_t *repos,
svn_pool_clear(iterpool);
/* Fetch the history object to walk through. */
- SVN_ERR(svn_fs_history_prev(&history, history, TRUE, iterpool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, TRUE, iterpool,
+ iterpool));
if (!history)
break;
SVN_ERR(svn_fs_history_location(&tmp_path, &tmp_revnum,
@@ -1594,6 +1578,18 @@ svn_repos_get_file_revs2(svn_repos_t *repos,
struct send_baton sb;
int mainline_pos, merged_pos;
+ if (!SVN_IS_VALID_REVNUM(start)
+ || !SVN_IS_VALID_REVNUM(end))
+ {
+ svn_revnum_t youngest_rev;
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, repos->fs, scratch_pool));
+
+ if (!SVN_IS_VALID_REVNUM(start))
+ start = youngest_rev;
+ if (!SVN_IS_VALID_REVNUM(end))
+ end = youngest_rev;
+ }
+
if (end < start)
{
if (include_merged_revisions)
@@ -1621,6 +1617,9 @@ svn_repos_get_file_revs2(svn_repos_t *repos,
/* Create an empty hash table for the first property diff. */
sb.last_props = apr_hash_make(sb.last_pool);
+ /* Inform send_path_revision() whether workarounds / special behavior
+ * may be needed. */
+ sb.include_merged_revisions = include_merged_revisions;
/* Get the revisions we are interested in. */
duplicate_path_revs = apr_hash_make(scratch_pool);
diff --git a/subversion/libsvn_subr/adler32.c b/subversion/libsvn_subr/adler32.c
index e290e68..63dbb44 100644
--- a/subversion/libsvn_subr/adler32.c
+++ b/subversion/libsvn_subr/adler32.c
@@ -57,7 +57,7 @@ svn__adler32(apr_uint32_t checksum, const char *data, apr_off_t len)
*/
if (len >= 80)
{
- /* Larger buffers can be effiently handled by Marc Adler's
+ /* Larger buffers can be efficiently handled by Marc Adler's
* optimized code. Also, new zlib versions will come with
* SIMD code for x86 and x64.
*/
@@ -76,16 +76,16 @@ svn__adler32(apr_uint32_t checksum, const char *data, apr_off_t len)
* (approx. one clock tick per byte + 2 ticks loop overhead)
*/
for (; len >= 8; len -= 8, input += 8)
- {
- s1 += input[0]; s2 += s1;
- s1 += input[1]; s2 += s1;
- s1 += input[2]; s2 += s1;
- s1 += input[3]; s2 += s1;
- s1 += input[4]; s2 += s1;
- s1 += input[5]; s2 += s1;
- s1 += input[6]; s2 += s1;
- s1 += input[7]; s2 += s1;
- }
+ {
+ s1 += input[0]; s2 += s1;
+ s1 += input[1]; s2 += s1;
+ s1 += input[2]; s2 += s1;
+ s1 += input[3]; s2 += s1;
+ s1 += input[4]; s2 += s1;
+ s1 += input[5]; s2 += s1;
+ s1 += input[6]; s2 += s1;
+ s1 += input[7]; s2 += s1;
+ }
/* Adler-32 calculation as a simple two ticks per iteration loop.
*/
diff --git a/subversion/libsvn_subr/auth.c b/subversion/libsvn_subr/auth.c
index 3c874cf..303c41e 100644
--- a/subversion/libsvn_subr/auth.c
+++ b/subversion/libsvn_subr/auth.c
@@ -37,7 +37,6 @@
#include "svn_version.h"
#include "private/svn_auth_private.h"
#include "private/svn_dep_compat.h"
-#include "private/svn_subr_private.h"
#include "auth.h"
@@ -110,10 +109,10 @@ struct svn_auth_baton_t
/* run-time parameters needed by providers. */
apr_hash_t *parameters;
+ apr_hash_t *slave_parameters;
/* run-time credentials cache. */
apr_hash_t *creds_cache;
-
};
/* Abstracted iteration baton */
@@ -126,6 +125,7 @@ struct svn_auth_iterstate_t
const char *realmstring; /* The original realmstring passed in */
const char *cache_key; /* key to use in auth_baton's creds_cache */
svn_auth_baton_t *auth_baton; /* the original auth_baton. */
+ apr_hash_t *parameters;
};
@@ -143,6 +143,7 @@ svn_auth_open(svn_auth_baton_t **auth_baton,
ab = apr_pcalloc(pool, sizeof(*ab));
ab->tables = apr_hash_make(pool);
ab->parameters = apr_hash_make(pool);
+ /* ab->slave_parameters = NULL; */
ab->creds_cache = apr_hash_make(pool);
ab->pool = pool;
@@ -171,20 +172,44 @@ svn_auth_open(svn_auth_baton_t **auth_baton,
*auth_baton = ab;
}
-
+/* Magic pointer value to allow storing 'NULL' in an apr_hash_t */
+static const void *auth_NULL = NULL;
void
svn_auth_set_parameter(svn_auth_baton_t *auth_baton,
const char *name,
const void *value)
{
- svn_hash_sets(auth_baton->parameters, name, value);
+ if (auth_baton)
+ {
+ if (auth_baton->slave_parameters)
+ {
+ if (!value)
+ value = &auth_NULL;
+
+ svn_hash_sets(auth_baton->slave_parameters, name, value);
+ }
+ else
+ svn_hash_sets(auth_baton->parameters, name, value);
+ }
}
const void *
svn_auth_get_parameter(svn_auth_baton_t *auth_baton,
const char *name)
{
+ const void *value;
+ if (!auth_baton)
+ return NULL;
+ else if (!auth_baton->slave_parameters)
+ return svn_hash_gets(auth_baton->parameters, name);
+
+ value = svn_hash_gets(auth_baton->slave_parameters, name);
+
+ if (value)
+ return (value == &auth_NULL) ? NULL
+ : value;
+
return svn_hash_gets(auth_baton->parameters, name);
}
@@ -196,7 +221,7 @@ make_cache_key(const char *cred_kind,
const char *realmstring,
apr_pool_t *pool)
{
- return apr_pstrcat(pool, cred_kind, ":", realmstring, (char *)NULL);
+ return apr_pstrcat(pool, cred_kind, ":", realmstring, SVN_VA_NULL);
}
svn_error_t *
@@ -215,6 +240,11 @@ svn_auth_first_credentials(void **credentials,
svn_boolean_t got_first = FALSE;
svn_auth_iterstate_t *iterstate;
const char *cache_key;
+ apr_hash_t *parameters;
+
+ if (! auth_baton)
+ return svn_error_create(SVN_ERR_AUTHN_NO_PROVIDER, NULL,
+ _("No authentication providers registered"));
/* Get the appropriate table of providers for CRED_KIND. */
table = svn_hash_gets(auth_baton->tables, cred_kind);
@@ -223,6 +253,26 @@ svn_auth_first_credentials(void **credentials,
_("No provider registered for '%s' credentials"),
cred_kind);
+ if (auth_baton->slave_parameters)
+ {
+ apr_hash_index_t *hi;
+ parameters = apr_hash_copy(pool, auth_baton->parameters);
+
+ for (hi = apr_hash_first(pool, auth_baton->slave_parameters);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const void *value = apr_hash_this_val(hi);
+
+ if (value == &auth_NULL)
+ value = NULL;
+
+ svn_hash_sets(parameters, apr_hash_this_key(hi), value);
+ }
+ }
+ else
+ parameters = auth_baton->parameters;
+
/* First, see if we have cached creds in the auth_baton. */
cache_key = make_cache_key(cred_kind, realmstring, pool);
creds = svn_hash_gets(auth_baton->creds_cache, cache_key);
@@ -240,7 +290,7 @@ svn_auth_first_credentials(void **credentials,
svn_auth_provider_object_t *);
SVN_ERR(provider->vtable->first_credentials(&creds, &iter_baton,
provider->provider_baton,
- auth_baton->parameters,
+ parameters,
realmstring,
auth_baton->pool));
@@ -253,7 +303,9 @@ svn_auth_first_credentials(void **credentials,
}
if (! creds)
- *state = NULL;
+ {
+ *state = NULL;
+ }
else
{
/* Build an abstract iteration state. */
@@ -265,6 +317,7 @@ svn_auth_first_credentials(void **credentials,
iterstate->realmstring = apr_pstrdup(pool, realmstring);
iterstate->cache_key = cache_key;
iterstate->auth_baton = auth_baton;
+ iterstate->parameters = parameters;
*state = iterstate;
/* Put the creds in the cache */
@@ -301,22 +354,26 @@ svn_auth_next_credentials(void **credentials,
{
SVN_ERR(provider->vtable->first_credentials(
&creds, &(state->provider_iter_baton),
- provider->provider_baton, auth_baton->parameters,
+ provider->provider_baton, state->parameters,
state->realmstring, auth_baton->pool));
state->got_first = TRUE;
}
else if (provider->vtable->next_credentials)
{
- SVN_ERR(provider->vtable->next_credentials(
- &creds, state->provider_iter_baton,
- provider->provider_baton, auth_baton->parameters,
- state->realmstring, auth_baton->pool));
+ SVN_ERR(provider->vtable->next_credentials(&creds,
+ state->provider_iter_baton,
+ provider->provider_baton,
+ state->parameters,
+ state->realmstring,
+ auth_baton->pool));
}
if (creds != NULL)
{
/* Put the creds in the cache */
- svn_hash_sets(auth_baton->creds_cache, state->cache_key, creds);
+ svn_hash_sets(auth_baton->creds_cache,
+ apr_pstrdup(auth_baton->pool, state->cache_key),
+ creds);
break;
}
@@ -349,7 +406,7 @@ svn_auth_save_credentials(svn_auth_iterstate_t *state,
return SVN_NO_ERROR;
/* Do not save the creds if SVN_AUTH_PARAM_NO_AUTH_CACHE is set */
- no_auth_cache = svn_hash_gets(auth_baton->parameters,
+ no_auth_cache = svn_hash_gets(state->parameters,
SVN_AUTH_PARAM_NO_AUTH_CACHE);
if (no_auth_cache)
return SVN_NO_ERROR;
@@ -362,7 +419,7 @@ svn_auth_save_credentials(svn_auth_iterstate_t *state,
SVN_ERR(provider->vtable->save_credentials(&save_succeeded,
creds,
provider->provider_baton,
- auth_baton->parameters,
+ state->parameters,
state->realmstring,
pool));
if (save_succeeded)
@@ -376,12 +433,11 @@ svn_auth_save_credentials(svn_auth_iterstate_t *state,
provider = APR_ARRAY_IDX(state->table->providers, i,
svn_auth_provider_object_t *);
if (provider->vtable->save_credentials)
- SVN_ERR(provider->vtable->save_credentials
- (&save_succeeded, creds,
- provider->provider_baton,
- auth_baton->parameters,
- state->realmstring,
- pool));
+ SVN_ERR(provider->vtable->save_credentials(&save_succeeded, creds,
+ provider->provider_baton,
+ state->parameters,
+ state->realmstring,
+ pool));
if (save_succeeded)
break;
@@ -509,19 +565,19 @@ svn_auth_get_platform_specific_provider(svn_auth_provider_object_t **provider,
if (strcmp(provider_name, "gpg_agent") == 0 &&
strcmp(provider_type, "simple") == 0)
{
- svn_auth_get_gpg_agent_simple_provider(provider, pool);
+ svn_auth__get_gpg_agent_simple_provider(provider, pool);
}
#endif
#ifdef SVN_HAVE_KEYCHAIN_SERVICES
if (strcmp(provider_name, "keychain") == 0 &&
strcmp(provider_type, "simple") == 0)
{
- svn_auth_get_keychain_simple_provider(provider, pool);
+ svn_auth__get_keychain_simple_provider(provider, pool);
}
else if (strcmp(provider_name, "keychain") == 0 &&
strcmp(provider_type, "ssl_client_cert_pw") == 0)
{
- svn_auth_get_keychain_ssl_client_cert_pw_provider(provider, pool);
+ svn_auth__get_keychain_ssl_client_cert_pw_provider(provider, pool);
}
#endif
@@ -529,20 +585,20 @@ svn_auth_get_platform_specific_provider(svn_auth_provider_object_t **provider,
if (strcmp(provider_name, "windows") == 0 &&
strcmp(provider_type, "simple") == 0)
{
- svn_auth_get_windows_simple_provider(provider, pool);
+ svn_auth__get_windows_simple_provider(provider, pool);
}
else if (strcmp(provider_name, "windows") == 0 &&
strcmp(provider_type, "ssl_client_cert_pw") == 0)
{
- svn_auth_get_windows_ssl_client_cert_pw_provider(provider, pool);
+ svn_auth__get_windows_ssl_client_cert_pw_provider(provider, pool);
}
else if (strcmp(provider_name, "windows") == 0 &&
strcmp(provider_type, "ssl_server_trust") == 0)
{
- svn_auth_get_windows_ssl_server_trust_provider(provider, pool);
+ svn_auth__get_windows_ssl_server_trust_provider(provider, pool);
}
else if (strcmp(provider_name, "windows") == 0 &&
- strcmp(provider_type, "ssl_server_authority") == 0)
+ strcmp(provider_type, "ssl_server_authority") == 0)
{
svn_auth__get_windows_ssl_server_authority_provider(provider, pool);
}
@@ -656,5 +712,210 @@ svn_auth_get_platform_specific_client_providers(apr_array_header_t **providers,
}
}
+ /* Windows has two providers without a store to allow easy access to
+ SSL servers. We enable these unconditionally.
+ (This behavior was moved here from svn_cmdline_create_auth_baton()) */
+ SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+ "windows",
+ "ssl_server_trust",
+ pool));
+ SVN__MAYBE_ADD_PROVIDER(*providers, provider);
+
+ /* The windows ssl authority certificate CRYPTOAPI provider. */
+ SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+ "windows",
+ "ssl_server_authority",
+ pool));
+
+ SVN__MAYBE_ADD_PROVIDER(*providers, provider);
+
return SVN_NO_ERROR;
}
+
+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)
+{
+ svn_boolean_t store_passwords = SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS;
+ svn_boolean_t store_auth_creds = SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS;
+ const char *store_plaintext_passwords
+ = SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS;
+ svn_boolean_t store_pp = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP;
+ const char *store_pp_plaintext
+ = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT;
+ svn_config_t *servers = NULL;
+ const char *server_group = NULL;
+
+ struct svn_auth_baton_t *ab;
+
+ ab = apr_pmemdup(result_pool, auth_baton, sizeof(*ab));
+
+ ab->slave_parameters = apr_hash_make(result_pool);
+
+ /* The 'store-passwords' and 'store-auth-creds' parameters used to
+ * live in SVN_CONFIG_CATEGORY_CONFIG. For backward compatibility,
+ * if values for these parameters have already been set by our
+ * callers, we use those values as defaults.
+ *
+ * Note that we can only catch the case where users explicitly set
+ * "store-passwords = no" or 'store-auth-creds = no".
+ *
+ * However, since the default value for both these options is
+ * currently (and has always been) "yes", users won't know
+ * the difference if they set "store-passwords = yes" or
+ * "store-auth-creds = yes" -- they'll get the expected behaviour.
+ */
+
+ if (svn_auth_get_parameter(ab,
+ SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL)
+ store_passwords = FALSE;
+
+ if (svn_auth_get_parameter(ab,
+ SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL)
+ store_auth_creds = FALSE;
+
+ /* All the svn_auth_set_parameter() calls below this not only affect the
+ to be created ra session, but also all the ra sessions that are already
+ use this auth baton!
+
+ Please try to key things based on the realm string instead of this
+ construct.
+ */
+
+ if (config)
+ {
+ /* Grab the 'servers' config. */
+ servers = svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS);
+ if (servers)
+ {
+ /* First, look in the global section. */
+
+ SVN_ERR(svn_config_get_bool
+ (servers, &store_passwords, SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_STORE_PASSWORDS,
+ store_passwords));
+
+ SVN_ERR(svn_config_get_yes_no_ask
+ (servers, &store_plaintext_passwords, SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS,
+ SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS));
+
+ SVN_ERR(svn_config_get_bool
+ (servers, &store_pp, SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP,
+ store_pp));
+
+ SVN_ERR(svn_config_get_yes_no_ask
+ (servers, &store_pp_plaintext,
+ SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
+ SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT));
+
+ SVN_ERR(svn_config_get_bool
+ (servers, &store_auth_creds, SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
+ store_auth_creds));
+
+ /* Find out where we're about to connect to, and
+ * try to pick a server group based on the destination. */
+ server_group = svn_config_find_group(servers, server_name,
+ SVN_CONFIG_SECTION_GROUPS,
+ scratch_pool);
+
+ if (server_group)
+ {
+ /* Override global auth caching parameters with the ones
+ * for the server group, if any. */
+ SVN_ERR(svn_config_get_bool(servers, &store_auth_creds,
+ server_group,
+ SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
+ store_auth_creds));
+
+ SVN_ERR(svn_config_get_bool(servers, &store_passwords,
+ server_group,
+ SVN_CONFIG_OPTION_STORE_PASSWORDS,
+ store_passwords));
+
+ SVN_ERR(svn_config_get_yes_no_ask
+ (servers, &store_plaintext_passwords, server_group,
+ SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS,
+ store_plaintext_passwords));
+
+ SVN_ERR(svn_config_get_bool
+ (servers, &store_pp,
+ server_group, SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP,
+ store_pp));
+
+ SVN_ERR(svn_config_get_yes_no_ask
+ (servers, &store_pp_plaintext, server_group,
+ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
+ store_pp_plaintext));
+ }
+ }
+ }
+
+ /* Save auth caching parameters in the auth parameter hash. */
+ if (! store_passwords)
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, "");
+
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS,
+ store_plaintext_passwords);
+
+ if (! store_pp)
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP,
+ "");
+
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
+ store_pp_plaintext);
+
+ if (! store_auth_creds)
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_NO_AUTH_CACHE, "");
+
+ if (server_group)
+ svn_auth_set_parameter(ab,
+ SVN_AUTH_PARAM_SERVER_GROUP,
+ apr_pstrdup(ab->pool, server_group));
+
+ *session_auth_baton = ab;
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+dummy_first_creds(void **credentials,
+ void **iter_baton,
+ void *provider_baton,
+ apr_hash_t *parameters,
+ const char *realmstring,
+ apr_pool_t *pool)
+{
+ *credentials = NULL;
+ *iter_baton = NULL;
+ return SVN_NO_ERROR;
+}
+
+void
+svn_auth__get_dummmy_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+ static const svn_auth_provider_t vtable = {
+ SVN_AUTH_CRED_SIMPLE,
+ dummy_first_creds,
+ NULL, NULL
+ };
+
+ svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
+
+ po->vtable = &vtable;
+ *provider = po;
+}
diff --git a/subversion/libsvn_subr/auth.h b/subversion/libsvn_subr/auth.h
index 0885f6d..bf8dfc9 100644
--- a/subversion/libsvn_subr/auth.h
+++ b/subversion/libsvn_subr/auth.h
@@ -41,6 +41,130 @@ svn_auth__file_path(const char **path,
const char *config_dir,
apr_pool_t *pool);
+#if (defined(WIN32) && !defined(__MINGW32__)) || defined(DOXYGEN)
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_simple_t that gets/sets information from the user's
+ * ~/.subversion configuration directory. Allocate @a *provider in
+ * @a pool.
+ *
+ * This is like svn_auth_get_simple_provider(), except that, when
+ * running on Window 2000 or newer (or any other Windows version that
+ * includes the CryptoAPI), the provider encrypts the password before
+ * storing it to disk. On earlier versions of Windows, the provider
+ * does nothing.
+ *
+ * @note This function is only available on Windows.
+ *
+ * @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.
+ */
+void
+svn_auth__get_windows_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
+ * user's ~/.subversion configuration directory. Allocate @a *provider in
+ * @a pool.
+ *
+ * This is like svn_auth_get_ssl_client_cert_pw_file_provider(), except that
+ * when running on Window 2000 or newer, the provider encrypts the password
+ * before storing it to disk. On earlier versions of Windows, the provider
+ * does nothing.
+ *
+ * @note This function is only available on Windows.
+ *
+ * @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.
+ */
+void
+svn_auth__get_windows_ssl_client_cert_pw_provider(
+ svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
+ *
+ * This provider automatically validates ssl server certificates with
+ * the CryptoApi, like Internet Explorer and the Windows network API do.
+ * This allows the rollout of root certificates via Windows Domain
+ * policies, instead of Subversion specific configuration.
+ *
+ * @note This function is only available on Windows.
+ */
+void
+svn_auth__get_windows_ssl_server_trust_provider(
+ svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+#endif /* WIN32 && !__MINGW32__ || DOXYGEN */
+
+#if defined(DARWIN) || defined(DOXYGEN)
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_simple_t that gets/sets information from the user's
+ * ~/.subversion configuration directory. Allocate @a *provider in
+ * @a pool.
+ *
+ * This is like svn_auth_get_simple_provider(), except that the
+ * password is stored in the Mac OS KeyChain.
+ *
+ * @note This function is only available on Mac OS 10.2 and higher.
+ */
+void
+svn_auth__get_keychain_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_ssl_client_cert_pw_t that gets/sets information from the
+ * user's ~/.subversion configuration directory. Allocate @a *provider in
+ * @a pool.
+ *
+ * This is like svn_auth_get_ssl_client_cert_pw_file_provider(), except
+ * that the password is stored in the Mac OS KeyChain.
+ *
+ * @note This function is only available on Mac OS 10.2 and higher.
+ */
+void
+svn_auth__get_keychain_ssl_client_cert_pw_provider(
+ svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+#endif /* DARWIN || DOXYGEN */
+
+#if !defined(WIN32) || defined(DOXYGEN)
+/**
+ * Set @a *provider to an authentication provider of type @c
+ * svn_auth_cred_simple_t that gets/sets information from the user's
+ * ~/.subversion configuration directory.
+ *
+ * This is like svn_client_get_simple_provider(), except that the
+ * password is obtained from gpg_agent, which will keep it in
+ * a memory cache.
+ *
+ * Allocate @a *provider in @a pool.
+ *
+ * @note This function actually works only on systems with
+ * GNU Privacy Guard installed.
+ */
+void
+svn_auth__get_gpg_agent_simple_provider
+ (svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
+#endif /* !defined(WIN32) || defined(DOXYGEN) */
+
+/**
+ * Set @a *provider to a dummy provider of type @c
+ * svn_auth_cred_simple_t that never returns or stores any
+ * credentials.
+ */
+void
+svn_auth__get_dummmy_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool);
#ifdef __cplusplus
}
diff --git a/subversion/libsvn_subr/bit_array.c b/subversion/libsvn_subr/bit_array.c
new file mode 100644
index 0000000..c239d1c
--- /dev/null
+++ b/subversion/libsvn_subr/bit_array.c
@@ -0,0 +1,194 @@
+/*
+ * bit_array.c : implement a simple packed bit array
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+#include "svn_sorts.h"
+#include "private/svn_subr_private.h"
+
+/* We allocate our data buffer in blocks of this size (in bytes).
+ * For performance reasons, this shall be a power of two.
+ * It should also not exceed 80kB (to prevent APR pool fragmentation) and
+ * not be too small (to keep the number of OS-side memory allocations low -
+ * avoiding hitting system-specific limits).
+ */
+#define BLOCK_SIZE 0x10000
+
+/* Number of bits in each block.
+ */
+#define BLOCK_SIZE_BITS (8 * BLOCK_SIZE)
+
+/* Initial array size (covers INITIAL_BLOCK_COUNT * BLOCK_SIZE_BITS bits).
+ * For performance reasons, this shall be a power of two.
+ */
+#define INITIAL_BLOCK_COUNT 16
+
+/* We store the bits in a lazily allocated two-dimensional array.
+ * For every BLOCK_SIZE_BITS range of indexes, there is one entry in the
+ * BLOCKS array. If index / BLOCK_SIZE_BITS exceeds BLOCK_COUNT-1, the
+ * blocks are implicitly empty. Only if a bit will be set to 1, will the
+ * BLOCKS array be auto-expanded.
+ *
+ * As long as no bit got set in a particular block, the respective entry in
+ * BLOCKS entry will be NULL, implying that all block contents is 0.
+ */
+struct svn_bit_array__t
+{
+ /* Data buffer of BLOCK_COUNT blocks, BLOCK_SIZE_BITS each. Never NULL.
+ * Every block may be NULL, though. */
+ unsigned char **blocks;
+
+ /* Number of bytes allocated to DATA. Never shrinks. */
+ apr_size_t block_count;
+
+ /* Reallocate DATA form this POOL when growing. */
+ apr_pool_t *pool;
+};
+
+/* Given that MAX shall be an actual bit index in a packed bit array,
+ * return the number of blocks entries to allocate for the data buffer. */
+static apr_size_t
+select_data_size(apr_size_t max)
+{
+ /* We allocate a power of two of bytes but at least 16 blocks. */
+ apr_size_t size = INITIAL_BLOCK_COUNT;
+
+ /* Caution:
+ * MAX / BLOCK_SIZE_BITS == SIZE still means that MAX is out of bounds.
+ * OTOH, 2 * (MAX/BLOCK_SIZE_BITS) is always within the value range of
+ * APR_SIZE_T. */
+ while (size <= max / BLOCK_SIZE_BITS)
+ size *= 2;
+
+ return size;
+}
+
+svn_bit_array__t *
+svn_bit_array__create(apr_size_t max,
+ apr_pool_t *pool)
+{
+ svn_bit_array__t *array = apr_pcalloc(pool, sizeof(*array));
+
+ array->block_count = select_data_size(max);
+ array->pool = pool;
+ array->blocks = apr_pcalloc(pool,
+ array->block_count * sizeof(*array->blocks));
+
+ return array;
+}
+
+void
+svn_bit_array__set(svn_bit_array__t *array,
+ apr_size_t idx,
+ svn_boolean_t value)
+{
+ unsigned char *block;
+
+ /* Index within ARRAY->BLOCKS for the block containing bit IDX. */
+ apr_size_t block_idx = idx / BLOCK_SIZE_BITS;
+
+ /* Within that block, index of the byte containing IDX. */
+ apr_size_t byte_idx = (idx % BLOCK_SIZE_BITS) / 8;
+
+ /* Within that byte, index of the bit corresponding to IDX. */
+ apr_size_t bit_idx = (idx % BLOCK_SIZE_BITS) % 8;
+
+ /* If IDX is outside the allocated range, we _may_ have to grow it.
+ *
+ * Be sure to use division instead of multiplication as we need to cover
+ * the full value range of APR_SIZE_T for the bit indexes.
+ */
+ if (block_idx >= array->block_count)
+ {
+ apr_size_t new_count;
+ unsigned char **new_blocks;
+
+ /* Unallocated indexes are implicitly 0, so no actual allocation
+ * required in that case.
+ */
+ if (!value)
+ return;
+
+ /* Grow block list to cover IDX.
+ * Clear the new entries to guarantee our array[idx]==0 default.
+ */
+ new_count = select_data_size(idx);
+ new_blocks = apr_pcalloc(array->pool, new_count * sizeof(*new_blocks));
+ memcpy(new_blocks, array->blocks,
+ array->block_count * sizeof(*new_blocks));
+ array->blocks = new_blocks;
+ array->block_count = new_count;
+ }
+
+ /* IDX is covered by ARRAY->BLOCKS now. */
+
+ /* Get the block that contains IDX. Auto-allocate it if missing. */
+ block = array->blocks[block_idx];
+ if (block == NULL)
+ {
+ /* Unallocated indexes are implicitly 0, so no actual allocation
+ * required in that case.
+ */
+ if (!value)
+ return;
+
+ /* Allocate the previously missing block and clear it for our
+ * array[idx] == 0 default. */
+ block = apr_pcalloc(array->pool, BLOCK_SIZE);
+ array->blocks[block_idx] = block;
+ }
+
+ /* Set / reset one bit. Be sure to use unsigned shifts. */
+ if (value)
+ block[byte_idx] |= (unsigned char)(1u << bit_idx);
+ else
+ block[byte_idx] &= ~(unsigned char)(1u << bit_idx);
+}
+
+svn_boolean_t
+svn_bit_array__get(svn_bit_array__t *array,
+ apr_size_t idx)
+{
+ unsigned char *block;
+
+ /* Index within ARRAY->BLOCKS for the block containing bit IDX. */
+ apr_size_t block_idx = idx / BLOCK_SIZE_BITS;
+
+ /* Within that block, index of the byte containing IDX. */
+ apr_size_t byte_idx = (idx % BLOCK_SIZE_BITS) / 8;
+
+ /* Within that byte, index of the bit corresponding to IDX. */
+ apr_size_t bit_idx = (idx % BLOCK_SIZE_BITS) % 8;
+
+ /* Indexes outside the allocated range are implicitly 0. */
+ if (block_idx >= array->block_count)
+ return 0;
+
+ /* Same if the respective block has not been allocated. */
+ block = array->blocks[block_idx];
+ if (block == NULL)
+ return 0;
+
+ /* Extract one bit (get the byte, shift bit to LSB, extract it). */
+ return (block[byte_idx] >> bit_idx) & 1;
+}
+
diff --git a/subversion/libsvn_subr/cache-inprocess.c b/subversion/libsvn_subr/cache-inprocess.c
index 6401f9f..a0e0bbf 100644
--- a/subversion/libsvn_subr/cache-inprocess.c
+++ b/subversion/libsvn_subr/cache-inprocess.c
@@ -190,17 +190,22 @@ inprocess_cache_get_internal(char **buffer,
{
struct cache_entry *entry = apr_hash_get(cache->hash, key, cache->klen);
- *buffer = NULL;
if (entry)
{
SVN_ERR(move_page_to_front(cache, entry->page));
/* duplicate the buffer entry */
*buffer = apr_palloc(result_pool, entry->size);
- memcpy(*buffer, entry->value, entry->size);
+ if (entry->size)
+ memcpy(*buffer, entry->value, entry->size);
*size = entry->size;
}
+ else
+ {
+ *buffer = NULL;
+ *size = 0;
+ }
return SVN_NO_ERROR;
}
@@ -213,25 +218,64 @@ inprocess_cache_get(void **value_p,
apr_pool_t *result_pool)
{
inprocess_cache_t *cache = cache_void;
- char* buffer = NULL;
- apr_size_t size;
+
+ if (key)
+ {
+ char* buffer;
+ apr_size_t size;
+
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ inprocess_cache_get_internal(&buffer,
+ &size,
+ cache,
+ key,
+ result_pool));
+ /* deserialize the buffer content. Usually, this will directly
+ modify the buffer content directly. */
+ *found = (buffer != NULL);
+ if (!buffer || !size)
+ *value_p = NULL;
+ else
+ return cache->deserialize_func(value_p, buffer, size, result_pool);
+ }
+ else
+ {
+ *value_p = NULL;
+ *found = FALSE;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+inprocess_cache_has_key_internal(svn_boolean_t *found,
+ inprocess_cache_t *cache,
+ const void *key,
+ apr_pool_t *scratch_pool)
+{
+ *found = apr_hash_get(cache->hash, key, cache->klen) != NULL;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+inprocess_cache_has_key(svn_boolean_t *found,
+ void *cache_void,
+ const void *key,
+ apr_pool_t *scratch_pool)
+{
+ inprocess_cache_t *cache = cache_void;
if (key)
SVN_MUTEX__WITH_LOCK(cache->mutex,
- inprocess_cache_get_internal(&buffer,
- &size,
- cache,
- key,
- result_pool));
+ inprocess_cache_has_key_internal(found,
+ cache,
+ key,
+ scratch_pool));
+ else
+ *found = FALSE;
- /* deserialize the buffer content. Usually, this will directly
- modify the buffer content directly.
- */
- *value_p = NULL;
- *found = buffer != NULL;
- return buffer && size
- ? cache->deserialize_func(value_p, buffer, size, result_pool)
- : SVN_NO_ERROR;
+ return SVN_NO_ERROR;
}
/* Removes PAGE from the LRU list, removes all of its entries from
@@ -592,6 +636,7 @@ inprocess_cache_get_info(void *cache_void,
static svn_cache__vtable_t inprocess_cache_vtable = {
inprocess_cache_get,
+ inprocess_cache_has_key,
inprocess_cache_set,
inprocess_cache_iter,
inprocess_cache_is_cachable,
@@ -642,6 +687,7 @@ svn_cache__create_inprocess(svn_cache__t **cache_p,
wrapper->vtable = &inprocess_cache_vtable;
wrapper->cache_internal = cache;
+ wrapper->pretend_empty = !!getenv("SVN_X_DOES_NOT_MARK_THE_SPOT");
*cache_p = wrapper;
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_subr/cache-membuffer.c b/subversion/libsvn_subr/cache-membuffer.c
index 7aa90cd..87ac961 100644
--- a/subversion/libsvn_subr/cache-membuffer.c
+++ b/subversion/libsvn_subr/cache-membuffer.c
@@ -27,13 +27,17 @@
#include "svn_pools.h"
#include "svn_checksum.h"
-#include "md5.h"
#include "svn_private_config.h"
-#include "cache.h"
#include "svn_string.h"
+#include "svn_sorts.h" /* get the MIN macro */
+
+#include "private/svn_atomic.h"
#include "private/svn_dep_compat.h"
#include "private/svn_mutex.h"
-#include "private/svn_pseudo_md5.h"
+#include "private/svn_string_private.h"
+
+#include "cache.h"
+#include "fnv1a.h"
/*
* This svn_cache__t implementation actually consists of two parts:
@@ -44,11 +48,15 @@
* A membuffer cache consists of two parts:
*
* 1. A linear data buffer containing cached items in a serialized
- * representation. There may be arbitrary gaps between entries.
+ * representation, prefixed by their full cache keys. There may be
+ * arbitrary gaps between entries. This buffer is sub-devided into
+ * (currently two) cache levels.
+ *
* 2. A directory of cache entries. This is organized similar to CPU
* data caches: for every possible key, there is exactly one group
* of entries that may contain the header info for an item with
- * that given key. The result is a GROUP_SIZE-way associative cache.
+ * that given key. The result is a GROUP_SIZE+-way associative cache
+ * whose associativity can be dynamically increased.
*
* Only the start address of these two data parts are given as a native
* pointer. All other references are expressed as offsets to these pointers.
@@ -56,23 +64,31 @@
* between different processes and / or to persist them on disk. These
* out-of-process features have not been implemented, yet.
*
+ * Superficially, cache levels are being used as usual: insertion happens
+ * into L1 and evictions will promote items to L2. But their whole point
+ * is a different one. L1 uses a circular buffer, i.e. we have perfect
+ * caching for the last N bytes where N is the size of L1. L2 uses a more
+ * elaborate scheme based on priorities and hit counts as described below.
+ *
* The data buffer usage information is implicitly given by the directory
* entries. Every USED entry has a reference to the previous and the next
* used dictionary entry and this double-linked list is ordered by the
* offsets of their item data within the data buffer. So removing data,
* for instance, is done simply by unlinking it from the chain, implicitly
* marking the entry as well as the data buffer section previously
- * associated to it as unused.
+ * associated to it as unused. First and last element of that chain are
+ * being referenced from the respective cache level.
*
- * Insertion can occur at only one, sliding position. It is marked by its
- * offset in the data buffer plus the index of the first used entry at or
- * behind that position. If this gap is too small to accommodate the new
- * item, the insertion window is extended as described below. The new entry
- * will always be inserted at the bottom end of the window and since the
- * next used entry is known, properly sorted insertion is possible.
+ * Insertion can occur at only one, sliding position per cache level. It is
+ * marked by its offset in the data buffer and the index of the first used
+ * entry at or behind that position. If this gap is too small to accommodate
+ * the new item (plus its full key), the insertion window is extended as
+ * described below. The new entry will always be inserted at the bottom end
+ * of the window and since the next used entry is known, properly sorted
+ * insertion is possible.
*
* To make the cache perform robustly in a wide range of usage scenarios,
- * a randomized variant of LFU is used (see ensure_data_insertable for
+ * L2 uses a randomized variant of LFU (see ensure_data_insertable_l2 for
* details). Every item holds a read hit counter and there is a global read
* hit counter. The more hits an entry has in relation to the average, the
* more it is likely to be kept using a rand()-based condition. The test is
@@ -86,14 +102,20 @@
* they get not used for a while. Also, even a cache thrashing situation
* about 50% of the content survives every 50% of the cache being re-written
* with new entries. For details on the fine-tuning involved, see the
- * comments in ensure_data_insertable().
+ * comments in ensure_data_insertable_l2().
+ *
+ * Due to the randomized mapping of keys to entry groups, some groups may
+ * overflow. In that case, there are spare groups that can be chained to
+ * an already used group to extend it.
*
* To limit the entry size and management overhead, not the actual item keys
- * but only their MD5 checksums will not be stored. This is reasonably safe
- * to do since users have only limited control over the full keys, even if
- * these contain folder paths. So, it is very hard to deliberately construct
- * colliding keys. Random checksum collisions can be shown to be extremely
- * unlikely.
+ * but only their hashed "fingerprint" will be stored. These are reasonably
+ * unique to prevent collisions, so we only need to support up to one entry
+ * per entry key. To guarantee that there are no conflicts, however, we
+ * store the actual full key immediately in front of the serialized item
+ * data. That is, the entry offset actually points to the full key and the
+ * key length stored in the entry acts as an additional offset to find the
+ * actual item.
*
* All access to the cached data needs to be serialized. Because we want
* to scale well despite that bottleneck, we simply segment the cache into
@@ -108,7 +130,7 @@
* Use a simple mutex on Windows. Because there is one mutex per segment,
* large machines should (and usually can) be configured with large caches
* such that read contention is kept low. This is basically the situation
- * we head before 1.8.
+ * we had before 1.8.
*/
#ifdef WIN32
# define USE_SIMPLE_MUTEX 1
@@ -116,14 +138,11 @@
# define USE_SIMPLE_MUTEX 0
#endif
-/* A 16-way associative cache seems to be a good compromise between
- * performance (worst-case lookups) and efficiency-loss due to collisions.
- *
- * This value may be changed to any positive integer.
- */
-#define GROUP_SIZE 16
-
/* For more efficient copy operations, let's align all data items properly.
+ * Since we can't portably align pointers, this is rather the item size
+ * granularity which ensures *relative* alignment within the cache - still
+ * giving us decent copy speeds on most machines.
+ *
* Must be a power of 2.
*/
#define ITEM_ALIGNMENT 16
@@ -170,11 +189,34 @@
*/
#define MAX_ITEM_SIZE ((apr_uint32_t)(0 - ITEM_ALIGNMENT))
-/* A 16 byte key type. We use that to identify cache entries.
- * The notation as just two integer values will cause many compilers
- * to create better code.
+/* We use this structure to identify cache entries. There cannot be two
+ * entries with the same entry key. However unlikely, though, two different
+ * full keys (see full_key_t) may have the same entry key. That is a
+ * collision and at most one of them can be stored in the cache at any time.
+ */
+typedef struct entry_key_t
+{
+ /* 16 byte finger print of the full key. */
+ apr_uint64_t fingerprint[2];
+
+ /* Length of the full key. This value is aligned to ITEM_ALIGNMENT to
+ * make sure the subsequent item content is properly aligned. */
+ apr_size_t key_len;
+} entry_key_t;
+
+/* A full key, i.e. the combination of the cache's key prefix with some
+ * dynamic part appended to it. It also contains its ENTRY_KEY.
*/
-typedef apr_uint64_t entry_key_t[2];
+typedef struct full_key_t
+{
+ /* Reduced form identifying the cache entry (if such an entry exists). */
+ entry_key_t entry_key;
+
+ /* This contains the full combination. Note that the SIZE element may
+ * be larger than ENTRY_KEY.KEY_LEN, but only the latter determines the
+ * valid key size. */
+ svn_membuf_t full_key;
+} full_key_t;
/* Debugging / corruption detection support.
* If you define this macro, the getter functions will performed expensive
@@ -186,9 +228,9 @@ typedef apr_uint64_t entry_key_t[2];
/* The prefix passed to svn_cache__create_membuffer_cache() effectively
* defines the type of all items stored by that cache instance. We'll take
- * the last 7 bytes + \0 as plaintext for easy identification by the dev.
+ * the last 15 bytes + \0 as plaintext for easy identification by the dev.
*/
-#define PREFIX_TAIL_LEN 8
+#define PREFIX_TAIL_LEN 16
/* This record will be attached to any cache entry. It tracks item data
* (content), key and type as hash values and is the baseline against which
@@ -196,20 +238,20 @@ typedef apr_uint64_t entry_key_t[2];
*/
typedef struct entry_tag_t
{
- /* MD5 checksum over the serialized the item data.
+ /* MD5 checksum over the serialized item data.
*/
- unsigned char content_hash [APR_MD5_DIGESTSIZE];
+ unsigned char content_hash[APR_MD5_DIGESTSIZE];
/* Hash value of the svn_cache_t instance that wrote the item
* (i.e. a combination of type and repository)
*/
- unsigned char prefix_hash [APR_MD5_DIGESTSIZE];
+ unsigned char prefix_hash[APR_MD5_DIGESTSIZE];
/* Note that this only covers the variable part of the key,
* i.e. it will be different from the full key hash used for
* cache indexing.
*/
- unsigned char key_hash [APR_MD5_DIGESTSIZE];
+ unsigned char key_hash[APR_MD5_DIGESTSIZE];
/* Last letters from of the key in human readable format
* (ends with the type identifier, e.g. "DAG")
@@ -222,36 +264,36 @@ typedef struct entry_tag_t
} entry_tag_t;
-/* Per svn_cache_t instance initialization helper.
- */
-static void get_prefix_tail(const char *prefix, char *prefix_tail)
-{
- apr_size_t len = strlen(prefix);
- apr_size_t to_copy = len > PREFIX_TAIL_LEN-1 ? PREFIX_TAIL_LEN-1 : len;
-
- memset(prefix_tail, 0, PREFIX_TAIL_LEN);
- memcpy(prefix_tail, prefix + len - to_copy, to_copy);
-}
-
/* Initialize all members of TAG except for the content hash.
*/
static svn_error_t *store_key_part(entry_tag_t *tag,
- entry_key_t prefix_hash,
- char *prefix_tail,
+ const full_key_t *prefix_key,
const void *key,
apr_size_t key_len,
apr_pool_t *pool)
{
svn_checksum_t *checksum;
+ const char *prefix = prefix_key->full_key.data;
+ apr_size_t prefix_len = strlen(prefix);
+
+ if (prefix_len > sizeof(tag->prefix_tail))
+ {
+ prefix += prefix_len - (sizeof(tag->prefix_tail) - 1);
+ prefix_len = sizeof(tag->prefix_tail) - 1;
+ }
+
SVN_ERR(svn_checksum(&checksum,
svn_checksum_md5,
key,
key_len,
pool));
- memcpy(tag->prefix_hash, prefix_hash, sizeof(tag->prefix_hash));
+ memcpy(tag->prefix_hash, prefix_key->entry_key.fingerprint,
+ sizeof(tag->prefix_hash));
memcpy(tag->key_hash, checksum->digest, sizeof(tag->key_hash));
- memcpy(tag->prefix_tail, prefix_tail, sizeof(tag->prefix_tail));
+
+ memset(tag->prefix_tail, 0, sizeof(tag->key_hash));
+ memcpy(tag->prefix_tail, prefix, prefix_len + 1);
tag->key_len = key_len;
@@ -261,7 +303,7 @@ static svn_error_t *store_key_part(entry_tag_t *tag,
/* Initialize the content hash member of TAG.
*/
static svn_error_t* store_content_part(entry_tag_t *tag,
- const char *data,
+ const void *data,
apr_size_t size,
apr_pool_t *pool)
{
@@ -303,17 +345,17 @@ static svn_error_t* assert_equal_tags(const entry_tag_t *lhs,
#define DEBUG_CACHE_MEMBUFFER_TAG tag,
-#define DEBUG_CACHE_MEMBUFFER_INIT_TAG \
- entry_tag_t _tag; \
- entry_tag_t *tag = &_tag; \
- SVN_ERR(store_key_part(tag, \
- cache->prefix, \
- cache->prefix_tail, \
- key, \
- cache->key_len == APR_HASH_KEY_STRING \
- ? strlen((const char *) key) \
- : cache->key_len, \
- cache->pool));
+#define DEBUG_CACHE_MEMBUFFER_INIT_TAG(pool) \
+ entry_tag_t _tag; \
+ entry_tag_t *tag = &_tag; \
+ if (key) \
+ SVN_ERR(store_key_part(tag, \
+ &cache->prefix, \
+ key, \
+ cache->key_len == APR_HASH_KEY_STRING \
+ ? strlen((const char *) key) \
+ : cache->key_len, \
+ pool));
#else
@@ -321,14 +363,14 @@ static svn_error_t* assert_equal_tags(const entry_tag_t *lhs,
*/
#define DEBUG_CACHE_MEMBUFFER_TAG_ARG
#define DEBUG_CACHE_MEMBUFFER_TAG
-#define DEBUG_CACHE_MEMBUFFER_INIT_TAG
+#define DEBUG_CACHE_MEMBUFFER_INIT_TAG(pool)
#endif /* SVN_DEBUG_CACHE_MEMBUFFER */
/* A single dictionary entry. Since all entries will be allocated once
* during cache creation, those entries might be either used or unused.
* An entry is used if and only if it is contained in the doubly-linked
- * list of used entries.
+ * list of used entries per cache level.
*/
typedef struct entry_t
{
@@ -336,11 +378,13 @@ typedef struct entry_t
*/
entry_key_t key;
- /* The offset of the cached item's serialized data within the data buffer.
+ /* The offset of the cached item's serialized data within the caches
+ * DATA buffer.
*/
apr_uint64_t offset;
- /* Size of the serialized item data. May be 0.
+ /* Size of the serialized item data. May be 0. The MAX_ITEM_SIZE macro
+ * above ensures that there will be no overflows.
* Only valid for used entries.
*/
apr_size_t size;
@@ -348,23 +392,27 @@ typedef struct entry_t
/* Number of (read) hits for this entry. Will be reset upon write.
* Only valid for used entries.
*/
- apr_uint32_t hit_count;
+ svn_atomic_t hit_count;
/* Reference to the next used entry in the order defined by offset.
* NO_INDEX indicates the end of the list; this entry must be referenced
- * by the caches membuffer_cache_t.last member. NO_INDEX also implies
- * that the data buffer is not used beyond offset+size.
+ * by the caches cache_level_t.last member. NO_INDEX also implies that
+ * the data buffer is not used beyond offset+size.
* Only valid for used entries.
*/
apr_uint32_t next;
/* Reference to the previous used entry in the order defined by offset.
* NO_INDEX indicates the end of the list; this entry must be referenced
- * by the caches membuffer_cache_t.first member.
+ * by the caches cache_level_t.first member.
* Only valid for used entries.
*/
apr_uint32_t previous;
+ /* Priority of this entry. This entry will not be replaced by lower-
+ * priority items.
+ */
+ apr_uint32_t priority;
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
/* Remember type, content and key hashes.
*/
@@ -372,39 +420,68 @@ typedef struct entry_t
#endif
} entry_t;
-/* We group dictionary entries to make this GROUP-SIZE-way associative.
+/* Group header struct.
*/
-typedef struct entry_group_t
+typedef struct group_header_t
{
/* number of entries used [0 .. USED-1] */
apr_uint32_t used;
- /* the actual entries */
- entry_t entries[GROUP_SIZE];
-} entry_group_t;
+ /* next group in the chain or NO_INDEX for the last.
+ * For recycleable unused spare groups, this points to the next
+ * unused spare group */
+ apr_uint32_t next;
-/* The cache header structure.
+ /* previously group in the chain or NO_INDEX for the first */
+ apr_uint32_t previous;
+
+ /* number of elements in the chain from start to here.
+ * >= 1 for used groups, 0 for unused spare groups */
+ apr_uint32_t chain_length;
+
+} group_header_t;
+
+/* The size of the group struct should be a power of two make sure it does
+ * not cross memory page boundaries. Since we already access the cache
+ * randomly, having two page table lookups instead of one is bad.
*/
-struct svn_membuffer_t
+#define GROUP_BLOCK_SIZE 512
+
+/* A ~10-way associative cache seems to be a good compromise between
+ * performance (worst-case lookups) and efficiency-loss due to collisions.
+ *
+ * This value may be changed to any positive integer.
+ */
+#define GROUP_SIZE \
+ ((GROUP_BLOCK_SIZE - sizeof(group_header_t)) / sizeof(entry_t))
+
+/* Maximum number of groups in a chain, i.e. a cache index group can hold
+ * up to GROUP_SIZE * MAX_GROUP_CHAIN_LENGTH entries.
+ */
+#define MAX_GROUP_CHAIN_LENGTH 8
+
+/* We group dictionary entries to make this GROUP-SIZE-way associative.
+ */
+typedef struct entry_group_t
{
- /* Number of cache segments. Must be a power of 2.
- Please note that this structure represents only one such segment
- and that all segments must / will report the same values here. */
- apr_uint32_t segment_count;
+ /* group globals */
+ group_header_t header;
- /* The dictionary, GROUP_SIZE * group_count entries long. Never NULL.
- */
- entry_group_t *directory;
+ /* padding and also room for future extensions */
+ char padding[GROUP_BLOCK_SIZE - sizeof(group_header_t)
+ - sizeof(entry_t) * GROUP_SIZE];
- /* Flag array with group_count / GROUP_INIT_GRANULARITY _bit_ elements.
- * Allows for efficiently marking groups as "not initialized".
- */
- unsigned char *group_initialized;
+ /* the actual entries */
+ entry_t entries[GROUP_SIZE];
- /* Size of dictionary in groups. Must be > 0.
- */
- apr_uint32_t group_count;
+} entry_group_t;
+/* Per-cache level header structure. Instances of this are members of
+ * svn_membuffer_t and will use non-overlapping sections of its DATA buffer.
+ * All offset values are global / absolute to that whole buffer.
+ */
+typedef struct cache_level_t
+{
/* Reference to the first (defined by the order content in the data
* buffer) dictionary entry used by any data item.
* NO_INDEX for an empty cache.
@@ -425,18 +502,61 @@ struct svn_membuffer_t
apr_uint32_t next;
- /* Pointer to the data buffer, data_size bytes long. Never NULL.
+ /* First offset in the caches DATA buffer that belongs to this level.
*/
- unsigned char *data;
+ apr_uint64_t start_offset;
- /* Size of data buffer in bytes. Must be > 0.
+ /* Size of data buffer allocated to this level in bytes. Must be > 0.
*/
- apr_uint64_t data_size;
+ apr_uint64_t size;
/* Offset in the data buffer where the next insertion shall occur.
*/
apr_uint64_t current_data;
+} cache_level_t;
+
+/* The cache header structure.
+ */
+struct svn_membuffer_t
+{
+ /* Number of cache segments. Must be a power of 2.
+ Please note that this structure represents only one such segment
+ and that all segments must / will report the same values here. */
+ apr_uint32_t segment_count;
+
+ /* The dictionary, GROUP_SIZE * (group_count + spare_group_count)
+ * entries long. Never NULL.
+ */
+ entry_group_t *directory;
+
+ /* Flag array with group_count / GROUP_INIT_GRANULARITY _bit_ elements.
+ * Allows for efficiently marking groups as "not initialized".
+ */
+ unsigned char *group_initialized;
+
+ /* Size of dictionary in groups. Must be > 0.
+ */
+ apr_uint32_t group_count;
+
+ /* Total number of spare groups.
+ */
+ apr_uint32_t spare_group_count;
+
+ /* First recycleable spare group.
+ */
+ apr_uint32_t first_spare_group;
+
+ /* Maximum number of spare groups ever used. I.e. group index
+ * group_count + max_spare_used is the first unused spare group
+ * if first_spare_group is NO_INDEX.
+ */
+ apr_uint32_t max_spare_used;
+
+ /* Pointer to the data buffer, data_size bytes long. Never NULL.
+ */
+ unsigned char *data;
+
/* Total number of data buffer bytes in use.
*/
apr_uint64_t data_used;
@@ -446,45 +566,63 @@ struct svn_membuffer_t
*/
apr_uint64_t max_entry_size;
+ /* The cache levels, organized as sub-buffers. Since entries in the
+ * DIRECTORY use offsets in DATA for addressing, a cache lookup does
+ * not need to know the cache level of a specific item. Cache levels
+ * are only used to implement a hybrid insertion / eviction strategy.
+ */
- /* Number of used dictionary entries, i.e. number of cached items.
- * In conjunction with hit_count, this is used calculate the average
- * hit count as part of the randomized LFU algorithm.
+ /* First cache level, i.e. most insertions happen here. Very large
+ * items might get inserted directly into L2. L1 is a strict FIFO
+ * ring buffer that does not care about item priorities. All evicted
+ * items get a chance to be promoted to L2.
*/
- apr_uint32_t used_entries;
+ cache_level_t l1;
- /* Sum of (read) hit counts of all used dictionary entries.
- * In conjunction used_entries used_entries, this is used calculate
- * the average hit count as part of the randomized LFU algorithm.
+ /* Second cache level, i.e. data evicted from L1 will be added here
+ * if the item is "important" enough or the L2 insertion window is large
+ * enough.
*/
- apr_uint64_t hit_count;
+ cache_level_t l2;
+
+ /* Number of used dictionary entries, i.e. number of cached items.
+ * Purely statistical information that may be used for profiling only.
+ * Updates are not synchronized and values may be nonsensicle on some
+ * platforms.
+ */
+ apr_uint32_t used_entries;
/* Total number of calls to membuffer_cache_get.
- * Purely statistical information that may be used for profiling.
+ * Purely statistical information that may be used for profiling only.
+ * Updates are not synchronized and values may be nonsensicle on some
+ * platforms.
*/
apr_uint64_t total_reads;
/* Total number of calls to membuffer_cache_set.
- * Purely statistical information that may be used for profiling.
+ * Purely statistical information that may be used for profiling only.
+ * Updates are not synchronized and values may be nonsensicle on some
+ * platforms.
*/
apr_uint64_t total_writes;
/* Total number of hits since the cache's creation.
- * Purely statistical information that may be used for profiling.
+ * Purely statistical information that may be used for profiling only.
+ * Updates are not synchronized and values may be nonsensicle on some
+ * platforms.
*/
apr_uint64_t total_hits;
-#if APR_HAS_THREADS
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
/* A lock for intra-process synchronization to the cache, or NULL if
* the cache's creator doesn't feel the cache needs to be
* thread-safe.
*/
-# if USE_SIMPLE_MUTEX
svn_mutex__t *lock;
-# else
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
+ /* Same for read-write lock. */
apr_thread_rwlock_t *lock;
-# endif
/* If set, write access will wait until they get exclusive access.
* Otherwise, they will become no-ops if the segment is currently
@@ -498,42 +636,37 @@ struct svn_membuffer_t
*/
#define ALIGN_VALUE(value) (((value) + ITEM_ALIGNMENT-1) & -ITEM_ALIGNMENT)
-/* Align POINTER value to the next ITEM_ALIGNMENT boundary.
- */
-#define ALIGN_POINTER(pointer) ((void*)ALIGN_VALUE((apr_size_t)(char*)(pointer)))
-
/* If locking is supported for CACHE, acquire a read lock for it.
*/
static svn_error_t *
read_lock_cache(svn_membuffer_t *cache)
{
-#if APR_HAS_THREADS
-# if USE_SIMPLE_MUTEX
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
return svn_mutex__lock(cache->lock);
-# else
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
if (cache->lock)
{
apr_status_t status = apr_thread_rwlock_rdlock(cache->lock);
if (status)
return svn_error_wrap_apr(status, _("Can't lock cache mutex"));
}
-# endif
-#endif
+
return SVN_NO_ERROR;
+#else
+ return SVN_NO_ERROR;
+#endif
}
/* If locking is supported for CACHE, acquire a write lock for it.
+ * Set *SUCCESS to FALSE, if we couldn't acquire the write lock;
+ * leave it untouched otherwise.
*/
static svn_error_t *
write_lock_cache(svn_membuffer_t *cache, svn_boolean_t *success)
{
-#if APR_HAS_THREADS
-# if USE_SIMPLE_MUTEX
-
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
return svn_mutex__lock(cache->lock);
-
-# else
-
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
if (cache->lock)
{
apr_status_t status;
@@ -556,9 +689,10 @@ write_lock_cache(svn_membuffer_t *cache, svn_boolean_t *success)
_("Can't write-lock cache mutex"));
}
-# endif
-#endif
return SVN_NO_ERROR;
+#else
+ return SVN_NO_ERROR;
+#endif
}
/* If locking is supported for CACHE, acquire an unconditional write lock
@@ -567,36 +701,29 @@ write_lock_cache(svn_membuffer_t *cache, svn_boolean_t *success)
static svn_error_t *
force_write_lock_cache(svn_membuffer_t *cache)
{
-#if APR_HAS_THREADS
-# if USE_SIMPLE_MUTEX
-
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
return svn_mutex__lock(cache->lock);
-
-# else
-
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
apr_status_t status = apr_thread_rwlock_wrlock(cache->lock);
if (status)
return svn_error_wrap_apr(status,
_("Can't write-lock cache mutex"));
-# endif
-#endif
return SVN_NO_ERROR;
+#else
+ return SVN_NO_ERROR;
+#endif
}
/* If locking is supported for CACHE, release the current lock
- * (read or write).
+ * (read or write). Return ERR upon success.
*/
static svn_error_t *
unlock_cache(svn_membuffer_t *cache, svn_error_t *err)
{
-#if APR_HAS_THREADS
-# if USE_SIMPLE_MUTEX
-
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
return svn_mutex__unlock(cache->lock, err);
-
-# else
-
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
if (cache->lock)
{
apr_status_t status = apr_thread_rwlock_unlock(cache->lock);
@@ -607,13 +734,14 @@ unlock_cache(svn_membuffer_t *cache, svn_error_t *err)
return svn_error_wrap_apr(status, _("Can't unlock cache mutex"));
}
-# endif
-#endif
return err;
+#else
+ return err;
+#endif
}
-/* If supported, guard the execution of EXPR with a read lock to cache.
- * Macro has been modeled after SVN_MUTEX__WITH_LOCK.
+/* If supported, guard the execution of EXPR with a read lock to CACHE.
+ * The macro has been modeled after SVN_MUTEX__WITH_LOCK.
*/
#define WITH_READ_LOCK(cache, expr) \
do { \
@@ -621,8 +749,8 @@ do { \
SVN_ERR(unlock_cache(cache, (expr))); \
} while (0)
-/* If supported, guard the execution of EXPR with a write lock to cache.
- * Macro has been modeled after SVN_MUTEX__WITH_LOCK.
+/* If supported, guard the execution of EXPR with a write lock to CACHE.
+ * The macro has been modeled after SVN_MUTEX__WITH_LOCK.
*
* The write lock process is complicated if we don't allow to wait for
* the lock: If we didn't get the lock, we may still need to remove an
@@ -647,6 +775,132 @@ do { \
SVN_ERR(unlock_cache(cache, (expr))); \
} while (0)
+/* Returns 0 if the entry group identified by GROUP_INDEX in CACHE has not
+ * been initialized, yet. In that case, this group can not data. Otherwise,
+ * a non-zero value is returned.
+ */
+static APR_INLINE unsigned char
+is_group_initialized(svn_membuffer_t *cache, apr_uint32_t group_index)
+{
+ unsigned char flags
+ = cache->group_initialized[group_index / (8 * GROUP_INIT_GRANULARITY)];
+ unsigned char bit_mask
+ = (unsigned char)(1 << ((group_index / GROUP_INIT_GRANULARITY) % 8));
+
+ return flags & bit_mask;
+}
+
+/* Initializes the section of the directory in CACHE that contains
+ * the entry group identified by GROUP_INDEX. */
+static void
+initialize_group(svn_membuffer_t *cache, apr_uint32_t group_index)
+{
+ unsigned char bit_mask;
+ apr_uint32_t i;
+
+ /* range of groups to initialize due to GROUP_INIT_GRANULARITY */
+ apr_uint32_t first_index =
+ (group_index / GROUP_INIT_GRANULARITY) * GROUP_INIT_GRANULARITY;
+ apr_uint32_t last_index = first_index + GROUP_INIT_GRANULARITY;
+ if (last_index > cache->group_count + cache->spare_group_count)
+ last_index = cache->group_count + cache->spare_group_count;
+
+ for (i = first_index; i < last_index; ++i)
+ {
+ group_header_t *header = &cache->directory[i].header;
+ header->used = 0;
+ header->chain_length = 1;
+ header->next = NO_INDEX;
+ header->previous = NO_INDEX;
+ }
+
+ /* set the "initialized" bit for these groups */
+ bit_mask
+ = (unsigned char)(1 << ((group_index / GROUP_INIT_GRANULARITY) % 8));
+ cache->group_initialized[group_index / (8 * GROUP_INIT_GRANULARITY)]
+ |= bit_mask;
+}
+
+/* Return the next available spare group from CACHE and mark it as used.
+ * May return NULL.
+ */
+static entry_group_t *
+allocate_spare_group(svn_membuffer_t *cache)
+{
+ entry_group_t *group = NULL;
+
+ /* is there some ready-to-use group? */
+ if (cache->first_spare_group != NO_INDEX)
+ {
+ group = &cache->directory[cache->first_spare_group];
+ cache->first_spare_group = group->header.next;
+ }
+
+ /* any so far untouched spares available? */
+ else if (cache->max_spare_used < cache->spare_group_count)
+ {
+ apr_uint32_t group_index = cache->group_count + cache->max_spare_used;
+ ++cache->max_spare_used;
+
+ if (!is_group_initialized(cache, group_index))
+ initialize_group(cache, group_index);
+
+ group = &cache->directory[group_index];
+ }
+
+ /* spare groups must be empty */
+ assert(!group || !group->header.used);
+ return group;
+}
+
+/* Mark previously allocated spare group GROUP in CACHE as "unused".
+ */
+static void
+free_spare_group(svn_membuffer_t *cache,
+ entry_group_t *group)
+{
+ assert(group->header.used == 0);
+ assert(group->header.previous != NO_INDEX);
+ assert(group - cache->directory >= (apr_ssize_t)cache->group_count);
+
+ /* unchain */
+ cache->directory[group->header.previous].header.next = NO_INDEX;
+ group->header.chain_length = 0;
+ group->header.previous = NO_INDEX;
+
+ /* add to chain of spares */
+ group->header.next = cache->first_spare_group;
+ cache->first_spare_group = (apr_uint32_t) (group - cache->directory);
+}
+
+/* Follow the group chain from GROUP in CACHE to its end and return the last
+ * group. May return GROUP.
+ */
+static entry_group_t *
+last_group_in_chain(svn_membuffer_t *cache,
+ entry_group_t *group)
+{
+ while (group->header.next != NO_INDEX)
+ group = &cache->directory[group->header.next];
+
+ return group;
+}
+
+/* Return the CHAIN_INDEX-th element in the group chain starting from group
+ * START_GROUP_INDEX in CACHE.
+ */
+static entry_group_t *
+get_group(svn_membuffer_t *cache,
+ apr_uint32_t start_group_index,
+ apr_uint32_t chain_index)
+{
+ entry_group_t *group = &cache->directory[start_group_index];
+ for (; chain_index; --chain_index)
+ group = &cache->directory[group->header.next];
+
+ return group;
+}
+
/* Resolve a dictionary entry reference, i.e. return the entry
* for the given IDX.
*/
@@ -668,6 +922,96 @@ get_index(svn_membuffer_t *cache, entry_t *entry)
+ (apr_uint32_t)(entry - cache->directory[group_index].entries);
}
+/* Return the cache level of ENTRY in CACHE.
+ */
+static cache_level_t *
+get_cache_level(svn_membuffer_t *cache, entry_t *entry)
+{
+ return entry->offset < cache->l1.size ? &cache->l1
+ : &cache->l2;
+}
+
+/* Insert ENTRY to the chain of items that belong to LEVEL in CACHE. IDX
+ * is ENTRY's item index and is only given for efficiency. The insertion
+ * takes place just before LEVEL->NEXT. *CACHE will not be modified.
+ */
+static void
+chain_entry(svn_membuffer_t *cache,
+ cache_level_t *level,
+ entry_t *entry,
+ apr_uint32_t idx)
+{
+ /* insert ENTRY before this item */
+ entry_t *next = level->next == NO_INDEX
+ ? NULL
+ : get_entry(cache, level->next);
+ assert(idx == get_index(cache, entry));
+
+ /* update entry chain
+ */
+ entry->next = level->next;
+ if (level->first == NO_INDEX)
+ {
+ /* insert as the first entry and only in the chain
+ */
+ entry->previous = NO_INDEX;
+ level->last = idx;
+ level->first = idx;
+ }
+ else if (next == NULL)
+ {
+ /* insert as the last entry in the chain.
+ * Note that it cannot also be at the beginning of the chain.
+ */
+ entry->previous = level->last;
+ get_entry(cache, level->last)->next = idx;
+ level->last = idx;
+ }
+ else
+ {
+ /* insert either at the start of a non-empty list or
+ * somewhere in the middle
+ */
+ entry->previous = next->previous;
+ next->previous = idx;
+
+ if (entry->previous != NO_INDEX)
+ get_entry(cache, entry->previous)->next = idx;
+ else
+ level->first = idx;
+ }
+}
+
+/* Remove ENTRY from the chain of items that belong to LEVEL in CACHE. IDX
+ * is ENTRY's item index and is only given for efficiency. Please note
+ * that neither *CACHE nor *ENTRY will not be modified.
+ */
+static void
+unchain_entry(svn_membuffer_t *cache,
+ cache_level_t *level,
+ entry_t *entry,
+ apr_uint32_t idx)
+{
+ assert(idx == get_index(cache, entry));
+
+ /* update
+ */
+ if (level->next == idx)
+ level->next = entry->next;
+
+ /* unlink it from the chain of used entries
+ */
+ if (entry->previous == NO_INDEX)
+ level->first = entry->next;
+ else
+ get_entry(cache, entry->previous)->next = entry->next;
+
+ if (entry->next == NO_INDEX)
+ level->last = entry->previous;
+ else
+ get_entry(cache, entry->next)->previous = entry->previous;
+}
+
/* Remove the used ENTRY from the CACHE, i.e. make it "unused".
* In contrast to insertion, removal is possible for any entry.
*/
@@ -678,83 +1022,84 @@ drop_entry(svn_membuffer_t *cache, entry_t *entry)
*/
apr_uint32_t idx = get_index(cache, entry);
apr_uint32_t group_index = idx / GROUP_SIZE;
- entry_group_t *group = &cache->directory[group_index];
- apr_uint32_t last_in_group = group_index * GROUP_SIZE + group->used - 1;
+ entry_group_t *last_group
+ = last_group_in_chain(cache, &cache->directory[group_index]);
+ apr_uint32_t last_in_group
+ = (apr_uint32_t) ((last_group - cache->directory) * GROUP_SIZE
+ + last_group->header.used - 1);
- /* Only valid to be called for used entries.
- */
- assert(idx <= last_in_group);
+ cache_level_t *level = get_cache_level(cache, entry);
/* update global cache usage counters
*/
cache->used_entries--;
- cache->hit_count -= entry->hit_count;
cache->data_used -= entry->size;
/* extend the insertion window, if the entry happens to border it
*/
- if (idx == cache->next)
- cache->next = entry->next;
+ if (idx == level->next)
+ level->next = entry->next;
else
- if (entry->next == cache->next)
+ if (entry->next == level->next)
{
/* insertion window starts right behind the entry to remove
*/
if (entry->previous == NO_INDEX)
{
/* remove the first entry -> insertion may start at pos 0, now */
- cache->current_data = 0;
+ level->current_data = level->start_offset;
}
else
{
/* insertion may start right behind the previous entry */
entry_t *previous = get_entry(cache, entry->previous);
- cache->current_data = ALIGN_VALUE( previous->offset
+ level->current_data = ALIGN_VALUE( previous->offset
+ previous->size);
}
}
/* unlink it from the chain of used entries
*/
- if (entry->previous == NO_INDEX)
- cache->first = entry->next;
- else
- get_entry(cache, entry->previous)->next = entry->next;
-
- if (entry->next == NO_INDEX)
- cache->last = entry->previous;
- else
- get_entry(cache, entry->next)->previous = entry->previous;
+ unchain_entry(cache, level, entry, idx);
/* Move last entry into hole (if the removed one is not the last used).
* We need to do this since all used entries are at the beginning of
* the group's entries array.
*/
- if (idx < last_in_group)
+ if (idx != last_in_group)
{
/* copy the last used entry to the removed entry's index
*/
- *entry = group->entries[group->used-1];
+ *entry = last_group->entries[last_group->header.used-1];
+
+ /* this ENTRY may belong to a different cache level than the entry
+ * we have just removed */
+ level = get_cache_level(cache, entry);
/* update foreign links to new index
*/
- if (last_in_group == cache->next)
- cache->next = idx;
+ if (last_in_group == level->next)
+ level->next = idx;
if (entry->previous == NO_INDEX)
- cache->first = idx;
+ level->first = idx;
else
get_entry(cache, entry->previous)->next = idx;
if (entry->next == NO_INDEX)
- cache->last = idx;
+ level->last = idx;
else
get_entry(cache, entry->next)->previous = idx;
}
/* Update the number of used entries.
*/
- group->used--;
+ last_group->header.used--;
+
+ /* Release the last group in the chain if it is a spare group
+ */
+ if (!last_group->header.used && last_group->header.previous != NO_INDEX)
+ free_spare_group(cache, last_group);
}
/* Insert ENTRY into the chain of used dictionary entries. The entry's
@@ -769,62 +1114,30 @@ insert_entry(svn_membuffer_t *cache, entry_t *entry)
apr_uint32_t idx = get_index(cache, entry);
apr_uint32_t group_index = idx / GROUP_SIZE;
entry_group_t *group = &cache->directory[group_index];
- entry_t *next = cache->next == NO_INDEX
- ? NULL
- : get_entry(cache, cache->next);
+ cache_level_t *level = get_cache_level(cache, entry);
/* The entry must start at the beginning of the insertion window.
* It must also be the first unused entry in the group.
*/
- assert(entry->offset == cache->current_data);
- assert(idx == group_index * GROUP_SIZE + group->used);
- cache->current_data = ALIGN_VALUE(entry->offset + entry->size);
+ assert(entry->offset == level->current_data);
+ assert(idx == group_index * GROUP_SIZE + group->header.used);
+ level->current_data = ALIGN_VALUE(entry->offset + entry->size);
/* update usage counters
*/
cache->used_entries++;
cache->data_used += entry->size;
entry->hit_count = 0;
- group->used++;
+ group->header.used++;
/* update entry chain
*/
- entry->next = cache->next;
- if (cache->first == NO_INDEX)
- {
- /* insert as the first entry and only in the chain
- */
- entry->previous = NO_INDEX;
- cache->last = idx;
- cache->first = idx;
- }
- else if (next == NULL)
- {
- /* insert as the last entry in the chain.
- * Note that it cannot also be at the beginning of the chain.
- */
- entry->previous = cache->last;
- get_entry(cache, cache->last)->next = idx;
- cache->last = idx;
- }
- else
- {
- /* insert either at the start of a non-empty list or
- * somewhere in the middle
- */
- entry->previous = next->previous;
- next->previous = idx;
-
- if (entry->previous != NO_INDEX)
- get_entry(cache, entry->previous)->next = idx;
- else
- cache->first = idx;
- }
+ chain_entry(cache, level, entry, idx);
/* The current insertion position must never point outside our
* data buffer.
*/
- assert(cache->current_data <= cache->data_size);
+ assert(level->current_data <= level->start_offset + level->size);
}
/* Map a KEY of 16 bytes to the CACHE and group that shall contain the
@@ -832,13 +1145,19 @@ insert_entry(svn_membuffer_t *cache, entry_t *entry)
*/
static apr_uint32_t
get_group_index(svn_membuffer_t **cache,
- entry_key_t key)
+ const entry_key_t *key)
{
svn_membuffer_t *segment0 = *cache;
-
- /* select the cache segment to use. they have all the same group_count */
- *cache = &segment0[key[0] & (segment0->segment_count -1)];
- return key[1] % segment0->group_count;
+ apr_uint64_t key0 = key->fingerprint[0];
+ apr_uint64_t key1 = key->fingerprint[1];
+
+ /* select the cache segment to use. they have all the same group_count.
+ * Since key may not be well-distributed, pre-fold it to a smaller but
+ * "denser" ranger. The modulus is a prime larger than the largest
+ * counts. */
+ *cache = &segment0[(key1 % APR_UINT64_C(2809637) + (key0 / 37))
+ & (segment0->segment_count - 1)];
+ return (key0 % APR_UINT64_C(5030895599)) % segment0->group_count;
}
/* Reduce the hit count of ENTRY and update the accumulated hit info
@@ -849,48 +1168,25 @@ let_entry_age(svn_membuffer_t *cache, entry_t *entry)
{
apr_uint32_t hits_removed = (entry->hit_count + 1) >> 1;
- cache->hit_count -= hits_removed;
- entry->hit_count -= hits_removed;
+ if (hits_removed)
+ {
+ entry->hit_count -= hits_removed;
+ }
+ else
+ {
+ entry->priority /= 2;
+ }
}
-/* Returns 0 if the entry group identified by GROUP_INDEX in CACHE has not
- * been initialized, yet. In that case, this group can not data. Otherwise,
- * a non-zero value is returned.
+/* Return whether the keys in LHS and RHS match.
*/
-static APR_INLINE unsigned char
-is_group_initialized(svn_membuffer_t *cache, apr_uint32_t group_index)
-{
- unsigned char flags
- = cache->group_initialized[group_index / (8 * GROUP_INIT_GRANULARITY)];
- unsigned char bit_mask
- = (unsigned char)(1 << ((group_index / GROUP_INIT_GRANULARITY) % 8));
-
- return flags & bit_mask;
-}
-
-/* Initializes the section of the directory in CACHE that contains
- * the entry group identified by GROUP_INDEX. */
-static void
-initialize_group(svn_membuffer_t *cache, apr_uint32_t group_index)
+static svn_boolean_t
+entry_keys_match(const entry_key_t *lhs,
+ const entry_key_t *rhs)
{
- unsigned char bit_mask;
- apr_uint32_t i;
-
- /* range of groups to initialize due to GROUP_INIT_GRANULARITY */
- apr_uint32_t first_index =
- (group_index / GROUP_INIT_GRANULARITY) * GROUP_INIT_GRANULARITY;
- apr_uint32_t last_index = first_index + GROUP_INIT_GRANULARITY;
- if (last_index > cache->group_count)
- last_index = cache->group_count;
-
- for (i = first_index; i < last_index; ++i)
- cache->directory[i].used = 0;
-
- /* set the "initialized" bit for these groups */
- bit_mask
- = (unsigned char)(1 << ((group_index / GROUP_INIT_GRANULARITY) % 8));
- cache->group_initialized[group_index / (8 * GROUP_INIT_GRANULARITY)]
- |= bit_mask;
+ return (lhs->fingerprint[0] == rhs->fingerprint[0])
+ && (lhs->fingerprint[1] == rhs->fingerprint[1])
+ && (lhs->key_len == rhs->key_len);
}
/* Given the GROUP_INDEX that shall contain an entry with the hash key
@@ -904,11 +1200,15 @@ initialize_group(svn_membuffer_t *cache, apr_uint32_t group_index)
* new content), an unused entry or a forcibly removed entry (if all
* group entries are currently in use). The entries' hash value will be
* initialized with TO_FIND.
+ *
+ * Note: This function requires the caller to appropriately lock the CACHE.
+ * For FIND_EMPTY==FALSE, a read lock is required, for FIND_EMPTY==TRUE,
+ * the write lock must have been acquired.
*/
static entry_t *
find_entry(svn_membuffer_t *cache,
apr_uint32_t group_index,
- const apr_uint64_t to_find[2],
+ const full_key_t *to_find,
svn_boolean_t find_empty)
{
entry_group_t *group;
@@ -929,8 +1229,7 @@ find_entry(svn_membuffer_t *cache,
entry = &group->entries[0];
/* initialize entry for the new key */
- entry->key[0] = to_find[0];
- entry->key[1] = to_find[1];
+ entry->key = to_find->entry_key;
}
return entry;
@@ -938,43 +1237,116 @@ find_entry(svn_membuffer_t *cache,
/* try to find the matching entry
*/
- for (i = 0; i < group->used; ++i)
- if ( to_find[0] == group->entries[i].key[0]
- && to_find[1] == group->entries[i].key[1])
- {
- /* found it
- */
- entry = &group->entries[i];
- if (find_empty)
- drop_entry(cache, entry);
- else
- return entry;
- }
+ while (1)
+ {
+ for (i = 0; i < group->header.used; ++i)
+ if (entry_keys_match(&group->entries[i].key, &to_find->entry_key))
+ {
+ /* This is the only entry that _may_ contain the correct data. */
+ entry = &group->entries[i];
+
+ /* If we want to preserve it, check that it is actual a match. */
+ if (!find_empty)
+ {
+ /* If there is no full key to compare, we are done. */
+ if (!entry->key.key_len)
+ return entry;
+
+ /* Compare the full key. */
+ if (memcmp(to_find->full_key.data,
+ cache->data + entry->offset,
+ entry->key.key_len) == 0)
+ return entry;
+
+ /* Key conflict. The entry to find cannot be anywhere else.
+ * Therefore, it is not cached. */
+ return NULL;
+ }
+
+ /* need to empty that entry */
+ drop_entry(cache, entry);
+ if (group->header.used == GROUP_SIZE)
+ group = last_group_in_chain(cache, group);
+ else if (group->header.chain_length == 0)
+ group = last_group_in_chain(cache,
+ &cache->directory[group_index]);
+
+ /* No entry found (actually, none left to find). */
+ entry = NULL;
+ break;
+ }
+
+ /* end of chain? */
+ if (group->header.next == NO_INDEX)
+ break;
+
+ /* only full groups may chain */
+ assert(group->header.used == GROUP_SIZE);
+ group = &cache->directory[group->header.next];
+ }
/* None found. Are we looking for a free entry?
*/
if (find_empty)
{
- /* if there is no empty entry, delete the oldest entry
+ /* There is no empty entry in the chain, try chaining a spare group.
*/
- if (group->used == GROUP_SIZE)
+ if ( group->header.used == GROUP_SIZE
+ && group->header.chain_length < MAX_GROUP_CHAIN_LENGTH)
+ {
+ entry_group_t *new_group = allocate_spare_group(cache);
+ if (new_group)
+ {
+ /* chain groups
+ */
+ new_group->header.chain_length = group->header.chain_length + 1;
+ new_group->header.previous = (apr_uint32_t) (group -
+ cache->directory);
+ new_group->header.next = NO_INDEX;
+ group->header.next = (apr_uint32_t) (new_group -
+ cache->directory);
+ group = new_group;
+ }
+ }
+
+ /* if GROUP is still filled, we need to remove a random entry */
+ if (group->header.used == GROUP_SIZE)
{
/* every entry gets the same chance of being removed.
* Otherwise, we free the first entry, fill it and
* remove it again on the next occasion without considering
* the other entries in this group.
+ *
+ * We hit only one random group instead of processing all
+ * groups in the chain.
*/
- entry = &group->entries[rand() % GROUP_SIZE];
- for (i = 1; i < GROUP_SIZE; ++i)
- if (entry->hit_count > group->entries[i].hit_count)
- entry = &group->entries[i];
+ cache_level_t *entry_level;
+ int to_remove = rand() % (GROUP_SIZE * group->header.chain_length);
+ entry_group_t *to_shrink
+ = get_group(cache, group_index, to_remove / GROUP_SIZE);
+
+ entry = &to_shrink->entries[to_remove % GROUP_SIZE];
+ entry_level = get_cache_level(cache, entry);
+ for (i = 0; i < GROUP_SIZE; ++i)
+ {
+ /* keep L1 entries whenever possible */
+
+ cache_level_t *level
+ = get_cache_level(cache, &to_shrink->entries[i]);
+ if ( (level != entry_level && entry_level == &cache->l1)
+ || (entry->hit_count > to_shrink->entries[i].hit_count))
+ {
+ entry_level = level;
+ entry = &to_shrink->entries[i];
+ }
+ }
/* for the entries that don't have been removed,
* reduce their hit counts to put them at a relative
* disadvantage the next time.
*/
for (i = 0; i < GROUP_SIZE; ++i)
- if (entry != &group->entries[i])
+ if (entry != &to_shrink->entries[i])
let_entry_age(cache, entry);
drop_entry(cache, entry);
@@ -982,9 +1354,8 @@ find_entry(svn_membuffer_t *cache,
/* initialize entry for the new key
*/
- entry = &group->entries[group->used];
- entry->key[0] = to_find[0];
- entry->key[1] = to_find[1];
+ entry = &group->entries[group->header.used];
+ entry->key = to_find->entry_key;
}
return entry;
@@ -997,6 +1368,7 @@ static void
move_entry(svn_membuffer_t *cache, entry_t *entry)
{
apr_size_t size = ALIGN_VALUE(entry->size);
+ cache_level_t *level = get_cache_level(cache, entry);
/* This entry survived this cleansing run. Reset half of its
* hit count so that its removal gets more likely in the next
@@ -1010,141 +1382,191 @@ move_entry(svn_membuffer_t *cache, entry_t *entry)
* Size-aligned moves tend to be faster than non-aligned ones
* because no "odd" bytes at the end need to special treatment.
*/
- if (entry->offset != cache->current_data)
+ if (entry->offset != level->current_data)
{
- memmove(cache->data + cache->current_data,
+ memmove(cache->data + level->current_data,
cache->data + entry->offset,
size);
- entry->offset = cache->current_data;
+ entry->offset = level->current_data;
}
/* The insertion position is now directly behind this entry.
*/
- cache->current_data = entry->offset + size;
- cache->next = entry->next;
+ level->current_data = entry->offset + size;
+ level->next = entry->next;
/* The current insertion position must never point outside our
* data buffer.
*/
- assert(cache->current_data <= cache->data_size);
+ assert(level->current_data <= level->start_offset + level->size);
+}
+
+/* Move ENTRY in CACHE from L1 to L2.
+ */
+static void
+promote_entry(svn_membuffer_t *cache, entry_t *entry)
+{
+ apr_uint32_t idx = get_index(cache, entry);
+ apr_size_t size = ALIGN_VALUE(entry->size);
+ assert(get_cache_level(cache, entry) == &cache->l1);
+ assert(idx == cache->l1.next);
+
+ /* copy item from the current location in L1 to the start of L2's
+ * insertion window */
+ memmove(cache->data + cache->l2.current_data,
+ cache->data + entry->offset,
+ size);
+ entry->offset = cache->l2.current_data;
+
+ /* The insertion position is now directly behind this entry.
+ */
+ cache->l2.current_data += size;
+
+ /* remove ENTRY from chain of L1 entries and put it into L2
+ */
+ unchain_entry(cache, &cache->l1, entry, idx);
+ chain_entry(cache, &cache->l2, entry, idx);
}
-/* If necessary, enlarge the insertion window until it is at least
- * SIZE bytes long. SIZE must not exceed the data buffer size.
- * Return TRUE if enough room could be found or made. A FALSE result
+/* This function implements the cache insertion / eviction strategy for L2.
+ *
+ * If necessary, enlarge the insertion window of CACHE->L2 until it is at
+ * least TO_FIT_IN->SIZE bytes long. TO_FIT_IN->SIZE must not exceed the
+ * data buffer size allocated to CACHE->L2. IDX is the item index of
+ * TO_FIT_IN and is given for performance reasons.
+ *
+ * Return TRUE if enough room could be found or made. A FALSE result
* indicates that the respective item shall not be added.
*/
static svn_boolean_t
-ensure_data_insertable(svn_membuffer_t *cache, apr_size_t size)
+ensure_data_insertable_l2(svn_membuffer_t *cache,
+ entry_t *to_fit_in)
{
entry_t *entry;
- apr_uint64_t average_hit_value;
- apr_uint64_t threshold;
/* accumulated size of the entries that have been removed to make
* room for the new one.
*/
- apr_size_t drop_size = 0;
+ apr_size_t moved_size = 0;
+
+ /* count the number of entries that got moved. A single large entry
+ * being moved is not enough to reject an insertion.
+ */
+ apr_size_t moved_count = 0;
+
+ /* accumulated "worth" of items dropped so far */
+ apr_uint64_t drop_hits = 0;
+
+ /* estimated "worth" of the new entry */
+ apr_uint64_t drop_hits_limit = (to_fit_in->hit_count + 1)
+ * (apr_uint64_t)to_fit_in->priority;
/* This loop will eventually terminate because every cache entry
* would get dropped eventually:
- * - hit counts become 0 after the got kept for 32 full scans
- * - larger elements get dropped as soon as their hit count is 0
- * - smaller and smaller elements get removed as the average
- * entry size drops (average drops by a factor of 8 per scan)
- * - after no more than 43 full scans, all elements would be removed
*
- * Since size is < 4th of the cache size and about 50% of all
- * entries get removed by a scan, it is very unlikely that more
- * than a fractional scan will be necessary.
+ * - the incoming entry is small enough to fit into L2
+ * - every iteration either frees parts of L2 or counts the moved size
+ * - eventually, we either moved too many items with too much total size
+ * to accept the new entry, or made enough room in L2 for the new entry
+ *
+ * Low-prio items get rejected even sooner.
*/
while (1)
{
/* first offset behind the insertion window
*/
- apr_uint64_t end = cache->next == NO_INDEX
- ? cache->data_size
- : get_entry(cache, cache->next)->offset;
+ apr_uint64_t end = cache->l2.next == NO_INDEX
+ ? cache->l2.start_offset + cache->l2.size
+ : get_entry(cache, cache->l2.next)->offset;
/* leave function as soon as the insertion window is large enough
*/
- if (end >= size + cache->current_data)
+ if (end >= to_fit_in->size + cache->l2.current_data)
return TRUE;
- /* Don't be too eager to cache data. Smaller items will fit into
- * the cache after dropping a single item. Of the larger ones, we
- * will only accept about 50%. They are also likely to get evicted
- * soon due to their notoriously low hit counts.
- *
- * As long as enough similarly or even larger sized entries already
- * exist in the cache, much less insert requests will be rejected.
+ /* Don't be too eager to cache data. If a lot of data has been moved
+ * around, the current item has probably a relatively low priority.
+ * We must also limit the effort spent here (if even in case of faulty
+ * heuristics). Therefore, give up after some time.
*/
- if (2 * drop_size > size)
+ if (moved_size > 4 * to_fit_in->size && moved_count > 7)
+ return FALSE;
+
+ /* if the net worth (in weighted hits) of items removed is already
+ * larger than what we want to insert, reject TO_FIT_IN because it
+ * still does not fit in. */
+ if (drop_hits > drop_hits_limit)
return FALSE;
/* try to enlarge the insertion window
*/
- if (cache->next == NO_INDEX)
+ if (cache->l2.next == NO_INDEX)
{
/* We reached the end of the data buffer; restart at the beginning.
* Due to the randomized nature of our LFU implementation, very
* large data items may require multiple passes. Therefore, SIZE
* should be restricted to significantly less than data_size.
*/
- cache->current_data = 0;
- cache->next = cache->first;
+ cache->l2.current_data = cache->l2.start_offset;
+ cache->l2.next = cache->l2.first;
}
else
{
- entry = get_entry(cache, cache->next);
+ svn_boolean_t keep;
+ entry = get_entry(cache, cache->l2.next);
- /* Keep entries that are very small. Those are likely to be data
- * headers or similar management structures. So, they are probably
- * important while not occupying much space.
- * But keep them only as long as they are a minority.
- */
- if ( (apr_uint64_t)entry->size * cache->used_entries
- < cache->data_used / 8)
+ if (to_fit_in->priority < SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY)
{
- move_entry(cache, entry);
+ /* Low prio items can only be accepted only if the current
+ * entry is of even lower prio and has fewer hits.
+ */
+ if ( entry->priority > to_fit_in->priority
+ || entry->hit_count > to_fit_in->hit_count)
+ return FALSE;
+ }
+
+ if (entry->priority <= SVN_CACHE__MEMBUFFER_LOW_PRIORITY)
+ {
+ /* Be quick to remove low-prio entries - even if the incoming
+ * one is low-prio as well. This makes room for more important
+ * data and replaces existing data with newly read information.
+ */
+ keep = FALSE;
}
else
{
- svn_boolean_t keep;
+ /* If the existing data is the same prio as the incoming data,
+ * drop the existing entry if it had seen fewer (probably 0)
+ * hits than the entry coming in from L1. In case of different
+ * priorities, keep the current entry of it has higher prio.
+ * The new entry may still find room by ousting other entries.
+ */
+ keep = to_fit_in->priority == entry->priority
+ ? entry->hit_count >= to_fit_in->hit_count
+ : entry->priority > to_fit_in->priority;
+ }
- if (cache->hit_count > cache->used_entries)
- {
- /* Roll the dice and determine a threshold somewhere from 0 up
- * to 2 times the average hit count.
- */
- average_hit_value = cache->hit_count / cache->used_entries;
- threshold = (average_hit_value+1) * (rand() % 4096) / 2048;
+ /* keepers or destroyers? */
+ if (keep)
+ {
+ /* Moving entries around is not for free -> track costs. */
+ moved_size += entry->size;
+ moved_count++;
- keep = entry->hit_count >= threshold;
- }
- else
- {
- /* general hit count is low. Keep everything that got hit
- * at all and assign some 50% survival chance to everything
- * else.
- */
- keep = (entry->hit_count > 0) || (rand() & 1);
- }
+ move_entry(cache, entry);
+ }
+ else
+ {
+ /* Drop the entry from the end of the insertion window.
+ * Count the "hit importance" such that we are not sacrificing
+ * too much of the high-hit contents. However, don't count
+ * low-priority hits because higher prio entries will often
+ * provide the same data but in a further stage of processing.
+ */
+ if (entry->priority > SVN_CACHE__MEMBUFFER_LOW_PRIORITY)
+ drop_hits += entry->hit_count * (apr_uint64_t)entry->priority;
- /* keepers or destroyers? */
- if (keep)
- {
- move_entry(cache, entry);
- }
- else
- {
- /* Drop the entry from the end of the insertion window, if it
- * has been hit less than the threshold. Otherwise, keep it and
- * move the insertion window one entry further.
- */
- drop_size += entry->size;
- drop_entry(cache, entry);
- }
+ drop_entry(cache, entry);
}
}
}
@@ -1153,26 +1575,72 @@ ensure_data_insertable(svn_membuffer_t *cache, apr_size_t size)
* right answer. */
}
-/* Mimic apr_pcalloc in APR_POOL_DEBUG mode, i.e. handle failed allocations
- * (e.g. OOM) properly: Allocate at least SIZE bytes from POOL and zero
- * the content of the allocated memory if ZERO has been set. Return NULL
- * upon failed allocations.
+/* This function implements the cache insertion / eviction strategy for L1.
+ *
+ * If necessary, enlarge the insertion window of CACHE->L1 by promoting
+ * entries to L2 until it is at least SIZE bytes long.
*
- * Also, satisfy our buffer alignment needs for performance reasons.
+ * Return TRUE if enough room could be found or made. A FALSE result
+ * indicates that the respective item shall not be added because it is
+ * too large.
*/
-static void* secure_aligned_alloc(apr_pool_t *pool,
- apr_size_t size,
- svn_boolean_t zero)
+static svn_boolean_t
+ensure_data_insertable_l1(svn_membuffer_t *cache, apr_size_t size)
{
- void* memory = apr_palloc(pool, size + ITEM_ALIGNMENT);
- if (memory != NULL)
+ /* Guarantees that the while loop will terminate. */
+ if (size > cache->l1.size)
+ return FALSE;
+
+ /* This loop will eventually terminate because every cache entry
+ * would get dropped eventually.
+ */
+ while (1)
{
- memory = ALIGN_POINTER(memory);
- if (zero)
- memset(memory, 0, size);
+ /* first offset behind the insertion window
+ */
+ apr_uint32_t entry_index = cache->l1.next;
+ entry_t *entry = get_entry(cache, entry_index);
+ apr_uint64_t end = cache->l1.next == NO_INDEX
+ ? cache->l1.start_offset + cache->l1.size
+ : entry->offset;
+
+ /* leave function as soon as the insertion window is large enough
+ */
+ if (end >= size + cache->l1.current_data)
+ return TRUE;
+
+ /* Enlarge the insertion window
+ */
+ if (cache->l1.next == NO_INDEX)
+ {
+ /* We reached the end of the data buffer; restart at the beginning.
+ * Due to the randomized nature of our LFU implementation, very
+ * large data items may require multiple passes. Therefore, SIZE
+ * should be restricted to significantly less than data_size.
+ */
+ cache->l1.current_data = cache->l1.start_offset;
+ cache->l1.next = cache->l1.first;
+ }
+ else
+ {
+ /* Remove the entry from the end of insertion window and promote
+ * it to L2, if it is important enough.
+ */
+ svn_boolean_t keep = ensure_data_insertable_l2(cache, entry);
+
+ /* We might have touched the group that contains ENTRY. Recheck. */
+ if (entry_index == cache->l1.next)
+ {
+ if (keep)
+ promote_entry(cache, entry);
+ else
+ drop_entry(cache, entry);
+ }
+ }
}
- return memory;
+ /* This will never be reached. But if it was, "can't insert" was the
+ * right answer. */
}
svn_error_t *
@@ -1188,6 +1656,8 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
apr_uint32_t seg;
apr_uint32_t group_count;
+ apr_uint32_t main_group_count;
+ apr_uint32_t spare_group_count;
apr_uint32_t group_init_size;
apr_uint64_t data_size;
apr_uint64_t max_entry_size;
@@ -1262,8 +1732,8 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
*/
if (directory_size > total_size - sizeof(entry_group_t))
directory_size = total_size - sizeof(entry_group_t);
- if (directory_size < sizeof(entry_group_t))
- directory_size = sizeof(entry_group_t);
+ if (directory_size < 2 * sizeof(entry_group_t))
+ directory_size = 2 * sizeof(entry_group_t);
/* limit the data size to what we can address.
* Note that this cannot overflow since all values are of size_t.
@@ -1272,13 +1742,13 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
*/
data_size = ALIGN_VALUE(total_size - directory_size + 1) - ITEM_ALIGNMENT;
- /* For cache sizes > 4TB, individual cache segments will be larger
- * than 16GB allowing for >4GB entries. But caching chunks larger
- * than 4GB is simply not supported.
+ /* For cache sizes > 16TB, individual cache segments will be larger
+ * than 32GB allowing for >4GB entries. But caching chunks larger
+ * than 4GB are simply not supported.
*/
- max_entry_size = data_size / 4 > MAX_ITEM_SIZE
+ max_entry_size = data_size / 8 > MAX_ITEM_SIZE
? MAX_ITEM_SIZE
- : data_size / 4;
+ : data_size / 8;
/* to keep the entries small, we use 32 bit indexes only
* -> we need to ensure that no more then 4G entries exist.
@@ -1291,6 +1761,11 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
? (APR_UINT32_MAX / GROUP_SIZE) - 1
: (apr_uint32_t)(directory_size / sizeof(entry_group_t));
+ /* set some of the index directory aside as over-flow (spare) buffers */
+ spare_group_count = MAX(group_count / 4, 1);
+ main_group_count = group_count - spare_group_count;
+ assert(spare_group_count > 0 && main_group_count > 0);
+
group_init_size = 1 + group_count / (8 * GROUP_INIT_GRANULARITY);
for (seg = 0; seg < segment_count; ++seg)
{
@@ -1298,7 +1773,11 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
*/
c[seg].segment_count = (apr_uint32_t)segment_count;
- c[seg].group_count = group_count;
+ c[seg].group_count = main_group_count;
+ c[seg].spare_group_count = spare_group_count;
+ c[seg].first_spare_group = NO_INDEX;
+ c[seg].max_spare_used = 0;
+
c[seg].directory = apr_pcalloc(pool,
group_count * sizeof(entry_group_t));
@@ -1306,18 +1785,30 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
hence "unused" */
c[seg].group_initialized = apr_pcalloc(pool, group_init_size);
- c[seg].first = NO_INDEX;
- c[seg].last = NO_INDEX;
- c[seg].next = NO_INDEX;
-
- c[seg].data_size = data_size;
- c[seg].data = secure_aligned_alloc(pool, (apr_size_t)data_size, FALSE);
- c[seg].current_data = 0;
+ /* Allocate 1/4th of the data buffer to L1
+ */
+ c[seg].l1.first = NO_INDEX;
+ c[seg].l1.last = NO_INDEX;
+ c[seg].l1.next = NO_INDEX;
+ c[seg].l1.start_offset = 0;
+ c[seg].l1.size = ALIGN_VALUE(data_size / 4);
+ c[seg].l1.current_data = 0;
+
+ /* The remaining 3/4th will be used as L2
+ */
+ c[seg].l2.first = NO_INDEX;
+ c[seg].l2.last = NO_INDEX;
+ c[seg].l2.next = NO_INDEX;
+ c[seg].l2.start_offset = c[seg].l1.size;
+ c[seg].l2.size = ALIGN_VALUE(data_size) - c[seg].l1.size;
+ c[seg].l2.current_data = c[seg].l2.start_offset;
+
+ /* This cast is safe because DATA_SIZE <= MAX_SEGMENT_SIZE. */
+ c[seg].data = apr_palloc(pool, (apr_size_t)ALIGN_VALUE(data_size));
c[seg].data_used = 0;
c[seg].max_entry_size = max_entry_size;
c[seg].used_entries = 0;
- c[seg].hit_count = 0;
c[seg].total_reads = 0;
c[seg].total_writes = 0;
c[seg].total_hits = 0;
@@ -1332,17 +1823,14 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
return svn_error_wrap_apr(APR_ENOMEM, "OOM");
}
-#if APR_HAS_THREADS
+#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX)
/* A lock for intra-process synchronization to the cache, or NULL if
* the cache's creator doesn't feel the cache needs to be
* thread-safe.
*/
-# if USE_SIMPLE_MUTEX
-
SVN_ERR(svn_mutex__init(&c[seg].lock, thread_safe, pool));
-
-# else
-
+#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX)
+ /* Same for read-write lock. */
c[seg].lock = NULL;
if (thread_safe)
{
@@ -1352,8 +1840,6 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
return svn_error_wrap_apr(status, _("Can't create cache mutex"));
}
-# endif
-
/* Select the behavior of write operations.
*/
c[seg].allow_blocking_writes = allow_blocking_writes;
@@ -1366,6 +1852,61 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_cache__membuffer_clear(svn_membuffer_t *cache)
+{
+ apr_size_t seg;
+ apr_size_t segment_count = cache->segment_count;
+
+ /* Length of the group_initialized array in bytes.
+ See also svn_cache__membuffer_cache_create(). */
+ apr_size_t group_init_size
+ = 1 + (cache->group_count + cache->spare_group_count)
+ / (8 * GROUP_INIT_GRANULARITY);
+
+ /* Clear segment by segment. This implies that other thread may read
+ and write to other segments after we cleared them and before the
+ last segment is done.
+
+ However, that is no different from a write request coming through
+ right after we cleared all segments because dependencies between
+ cache entries (recursive lookup / access locks) are not allowed.
+ */
+ for (seg = 0; seg < segment_count; ++seg)
+ {
+ /* Unconditionally acquire the write lock. */
+ SVN_ERR(force_write_lock_cache(&cache[seg]));
+
+ /* Mark all groups as "not initialized", which implies "empty". */
+ cache[seg].first_spare_group = NO_INDEX;
+ cache[seg].max_spare_used = 0;
+
+ memset(cache[seg].group_initialized, 0, group_init_size);
+
+ /* Unlink L1 contents. */
+ cache[seg].l1.first = NO_INDEX;
+ cache[seg].l1.last = NO_INDEX;
+ cache[seg].l1.next = NO_INDEX;
+ cache[seg].l1.current_data = cache[seg].l1.start_offset;
+
+ /* Unlink L2 contents. */
+ cache[seg].l2.first = NO_INDEX;
+ cache[seg].l2.last = NO_INDEX;
+ cache[seg].l2.next = NO_INDEX;
+ cache[seg].l2.current_data = cache[seg].l2.start_offset;
+
+ /* Reset content counters. */
+ cache[seg].data_used = 0;
+ cache[seg].used_entries = 0;
+
+ /* Segment may be used again. */
+ SVN_ERR(unlock_cache(&cache[seg], SVN_NO_ERROR));
+ }
+
+ /* done here */
+ return SVN_NO_ERROR;
+}
+
/* Look for the cache entry in group GROUP_INDEX of CACHE, identified
* by the hash value TO_FIND and set *FOUND accordingly.
*
@@ -1375,7 +1916,7 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
static svn_error_t *
entry_exists_internal(svn_membuffer_t *cache,
apr_uint32_t group_index,
- entry_key_t to_find,
+ const full_key_t *to_find,
svn_boolean_t *found)
{
*found = find_entry(cache, group_index, to_find, FALSE) != NULL;
@@ -1388,7 +1929,7 @@ entry_exists_internal(svn_membuffer_t *cache,
static svn_error_t *
entry_exists(svn_membuffer_t *cache,
apr_uint32_t group_index,
- entry_key_t to_find,
+ const full_key_t *to_find,
svn_boolean_t *found)
{
WITH_READ_LOCK(cache,
@@ -1400,10 +1941,43 @@ entry_exists(svn_membuffer_t *cache,
return SVN_NO_ERROR;
}
+/* Given the SIZE and PRIORITY of a new item, return the cache level
+ (L1 or L2) in fragment CACHE that this item shall be inserted into.
+ If we can't find nor make enough room for the item, return NULL.
+ */
+static cache_level_t *
+select_level(svn_membuffer_t *cache,
+ apr_size_t size,
+ apr_uint32_t priority)
+{
+ if (cache->max_entry_size >= size)
+ {
+ /* Small items go into L1. */
+ return ensure_data_insertable_l1(cache, size)
+ ? &cache->l1
+ : NULL;
+ }
+ else if ( cache->l2.size >= size
+ && MAX_ITEM_SIZE >= size
+ && priority > SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY)
+ {
+ /* Large but important items go into L2. */
+ entry_t dummy_entry = { { { 0 } } };
+ dummy_entry.priority = priority;
+ dummy_entry.size = size;
+
+ return ensure_data_insertable_l2(cache, &dummy_entry)
+ ? &cache->l2
+ : NULL;
+ }
-/* Try to insert the serialized item given in BUFFER with SIZE into
- * the group GROUP_INDEX of CACHE and uniquely identify it by hash
- * value TO_FIND.
+ /* Don't cache large, unimportant items. */
+ return NULL;
+}
+
+/* Try to insert the serialized item given in BUFFER with ITEM_SIZE
+ * into the group GROUP_INDEX of CACHE and uniquely identify it by
+ * hash value TO_FIND.
*
* However, there is no guarantee that it will actually be put into
* the cache. If there is already some data associated with TO_FIND,
@@ -1411,17 +1985,21 @@ entry_exists(svn_membuffer_t *cache,
* be inserted.
*
* Note: This function requires the caller to serialization access.
- * Don't call it directly, call membuffer_cache_get_partial instead.
+ * Don't call it directly, call membuffer_cache_set instead.
*/
static svn_error_t *
membuffer_cache_set_internal(svn_membuffer_t *cache,
- entry_key_t to_find,
+ const full_key_t *to_find,
apr_uint32_t group_index,
char *buffer,
- apr_size_t size,
+ apr_size_t item_size,
+ apr_uint32_t priority,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
apr_pool_t *scratch_pool)
{
+ cache_level_t *level;
+ apr_size_t size = item_size + to_find->entry_key.key_len;
+
/* first, look for a previous entry for the given key */
entry_t *entry = find_entry(cache, group_index, to_find, FALSE);
@@ -1435,18 +2013,23 @@ membuffer_cache_set_internal(svn_membuffer_t *cache,
*/
cache->data_used += (apr_uint64_t)size - entry->size;
entry->size = size;
+ entry->priority = priority;
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
/* Remember original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag, buffer, size, scratch_pool));
+ SVN_ERR(store_content_part(tag, buffer, item_size, scratch_pool));
memcpy(&entry->tag, tag, sizeof(*tag));
#endif
- if (size)
- memcpy(cache->data + entry->offset, buffer, size);
+ if (entry->key.key_len)
+ memcpy(cache->data + entry->offset, to_find->full_key.data,
+ entry->key.key_len);
+ if (item_size)
+ memcpy(cache->data + entry->offset + entry->key.key_len, buffer,
+ item_size);
cache->total_writes++;
return SVN_NO_ERROR;
@@ -1454,9 +2037,8 @@ membuffer_cache_set_internal(svn_membuffer_t *cache,
/* if necessary, enlarge the insertion window.
*/
- if ( buffer != NULL
- && cache->max_entry_size >= size
- && ensure_data_insertable(cache, size))
+ level = buffer ? select_level(cache, size, priority) : NULL;
+ if (level)
{
/* Remove old data for this key, if that exists.
* Get an unused entry for the key and and initialize it with
@@ -1464,13 +2046,14 @@ membuffer_cache_set_internal(svn_membuffer_t *cache,
*/
entry = find_entry(cache, group_index, to_find, TRUE);
entry->size = size;
- entry->offset = cache->current_data;
+ entry->offset = level->current_data;
+ entry->priority = priority;
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
/* Remember original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag, buffer, size, scratch_pool));
+ SVN_ERR(store_content_part(tag, buffer, item_size, scratch_pool));
memcpy(&entry->tag, tag, sizeof(*tag));
#endif
@@ -1481,8 +2064,12 @@ membuffer_cache_set_internal(svn_membuffer_t *cache,
/* Copy the serialized item data into the cache.
*/
- if (size)
- memcpy(cache->data + entry->offset, buffer, size);
+ if (entry->key.key_len)
+ memcpy(cache->data + entry->offset, to_find->full_key.data,
+ entry->key.key_len);
+ if (item_size)
+ memcpy(cache->data + entry->offset + entry->key.key_len, buffer,
+ item_size);
cache->total_writes++;
}
@@ -1511,9 +2098,10 @@ membuffer_cache_set_internal(svn_membuffer_t *cache,
*/
static svn_error_t *
membuffer_cache_set(svn_membuffer_t *cache,
- entry_key_t key,
+ const full_key_t *key,
void *item,
svn_cache__serialize_func_t serializer,
+ apr_uint32_t priority,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
apr_pool_t *scratch_pool)
{
@@ -1523,7 +2111,7 @@ membuffer_cache_set(svn_membuffer_t *cache,
/* find the entry group that will hold the key.
*/
- group_index = get_group_index(&cache, key);
+ group_index = get_group_index(&cache, &key->entry_key);
/* Serialize data data.
*/
@@ -1538,11 +2126,27 @@ membuffer_cache_set(svn_membuffer_t *cache,
group_index,
buffer,
size,
+ priority,
DEBUG_CACHE_MEMBUFFER_TAG
scratch_pool));
return SVN_NO_ERROR;
}
+/* Count a hit in ENTRY within CACHE.
+ */
+static void
+increment_hit_counters(svn_membuffer_t *cache, entry_t *entry)
+{
+ /* To minimize the memory footprint of the cache index, we limit local
+ * hit counters to 32 bits. These may overflow but we don't really
+ * care because at worst, ENTRY will be dropped from cache once every
+ * few billion hits. */
+ svn_atomic_inc(&entry->hit_count);
+
+ /* That one is for stats only. */
+ cache->total_hits++;
+}
+
/* Look for the cache entry in group GROUP_INDEX of CACHE, identified
* by the hash value TO_FIND. If no item has been stored for KEY,
* *BUFFER will be NULL. Otherwise, return a copy of the serialized
@@ -1550,12 +2154,12 @@ membuffer_cache_set(svn_membuffer_t *cache,
* be done in POOL.
*
* Note: This function requires the caller to serialization access.
- * Don't call it directly, call membuffer_cache_get_partial instead.
+ * Don't call it directly, call membuffer_cache_get instead.
*/
static svn_error_t *
membuffer_cache_get_internal(svn_membuffer_t *cache,
apr_uint32_t group_index,
- entry_key_t to_find,
+ const full_key_t *to_find,
char **buffer,
apr_size_t *item_size,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
@@ -1578,9 +2182,9 @@ membuffer_cache_get_internal(svn_membuffer_t *cache,
return SVN_NO_ERROR;
}
- size = ALIGN_VALUE(entry->size);
- *buffer = ALIGN_POINTER(apr_palloc(result_pool, size + ITEM_ALIGNMENT-1));
- memcpy(*buffer, (const char*)cache->data + entry->offset, size);
+ size = ALIGN_VALUE(entry->size) - entry->key.key_len;
+ *buffer = apr_palloc(result_pool, size);
+ memcpy(*buffer, cache->data + entry->offset + entry->key.key_len, size);
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
@@ -1592,18 +2196,16 @@ membuffer_cache_get_internal(svn_membuffer_t *cache,
/* Compare original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag, *buffer, entry->size, result_pool));
+ SVN_ERR(store_content_part(tag, *buffer, entry->size - entry->key.key_len,
+ result_pool));
SVN_ERR(assert_equal_tags(&entry->tag, tag));
#endif
/* update hit statistics
*/
- entry->hit_count++;
- cache->hit_count++;
- cache->total_hits++;
-
- *item_size = entry->size;
+ increment_hit_counters(cache, entry);
+ *item_size = entry->size - entry->key.key_len;
return SVN_NO_ERROR;
}
@@ -1615,7 +2217,7 @@ membuffer_cache_get_internal(svn_membuffer_t *cache,
*/
static svn_error_t *
membuffer_cache_get(svn_membuffer_t *cache,
- entry_key_t key,
+ const full_key_t *key,
void **item,
svn_cache__deserialize_func_t deserializer,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
@@ -1627,7 +2229,7 @@ membuffer_cache_get(svn_membuffer_t *cache,
/* find the entry group that will hold the key.
*/
- group_index = get_group_index(&cache, key);
+ group_index = get_group_index(&cache, &key->entry_key);
WITH_READ_LOCK(cache,
membuffer_cache_get_internal(cache,
group_index,
@@ -1649,6 +2251,59 @@ membuffer_cache_get(svn_membuffer_t *cache,
}
/* Look for the cache entry in group GROUP_INDEX of CACHE, identified
+ * by the hash value TO_FIND. If no item has been stored for KEY, *FOUND
+ * will be FALSE and TRUE otherwise.
+ */
+static svn_error_t *
+membuffer_cache_has_key_internal(svn_membuffer_t *cache,
+ apr_uint32_t group_index,
+ const full_key_t *to_find,
+ svn_boolean_t *found)
+{
+ entry_t *entry = find_entry(cache, group_index, to_find, FALSE);
+ if (entry)
+ {
+ /* This often be called by "block read" when most data is already
+ in L2 and only a few previously evicted items are added to L1
+ again. While items in L1 are well protected for a while, L2
+ items may get evicted soon. Thus, mark all them as "hit" to give
+ them a higher chance of survival. */
+ increment_hit_counters(cache, entry);
+ *found = TRUE;
+ }
+ else
+ {
+ *found = FALSE;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Look for an entry identified by KEY. If no item has been stored
+ * for KEY, *FOUND will be set to FALSE and TRUE otherwise.
+ */
+/* Implements svn_cache__has_key for membuffer caches.
+ */
+static svn_error_t *
+membuffer_cache_has_key(svn_membuffer_t *cache,
+ const full_key_t *key,
+ svn_boolean_t *found)
+{
+ /* find the entry group that will hold the key.
+ */
+ apr_uint32_t group_index = get_group_index(&cache, &key->entry_key);
+ cache->total_reads++;
+
+ WITH_READ_LOCK(cache,
+ membuffer_cache_has_key_internal(cache,
+ group_index,
+ key,
+ found));
+
+ return SVN_NO_ERROR;
+}
+
+/* Look for the cache entry in group GROUP_INDEX of CACHE, identified
* by the hash value TO_FIND. FOUND indicates whether that entry exists.
* If not found, *ITEM will be NULL.
*
@@ -1662,7 +2317,7 @@ membuffer_cache_get(svn_membuffer_t *cache,
static svn_error_t *
membuffer_cache_get_partial_internal(svn_membuffer_t *cache,
apr_uint32_t group_index,
- entry_key_t to_find,
+ const full_key_t *to_find,
void **item,
svn_boolean_t *found,
svn_cache__partial_getter_func_t deserializer,
@@ -1681,11 +2336,10 @@ membuffer_cache_get_partial_internal(svn_membuffer_t *cache,
}
else
{
+ const void *item_data = cache->data + entry->offset + entry->key.key_len;
+ apr_size_t item_size = entry->size - entry->key.key_len;
*found = TRUE;
-
- entry->hit_count++;
- cache->hit_count++;
- cache->total_hits++;
+ increment_hit_counters(cache, entry);
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
@@ -1697,19 +2351,12 @@ membuffer_cache_get_partial_internal(svn_membuffer_t *cache,
/* Compare original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag,
- (const char*)cache->data + entry->offset,
- entry->size,
- result_pool));
+ SVN_ERR(store_content_part(tag, item_data, item_size, result_pool));
SVN_ERR(assert_equal_tags(&entry->tag, tag));
#endif
- return deserializer(item,
- (const char*)cache->data + entry->offset,
- entry->size,
- baton,
- result_pool);
+ return deserializer(item, item_data, item_size, baton, result_pool);
}
}
@@ -1721,7 +2368,7 @@ membuffer_cache_get_partial_internal(svn_membuffer_t *cache,
*/
static svn_error_t *
membuffer_cache_get_partial(svn_membuffer_t *cache,
- entry_key_t key,
+ const full_key_t *key,
void **item,
svn_boolean_t *found,
svn_cache__partial_getter_func_t deserializer,
@@ -1729,7 +2376,7 @@ membuffer_cache_get_partial(svn_membuffer_t *cache,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
apr_pool_t *result_pool)
{
- apr_uint32_t group_index = get_group_index(&cache, key);
+ apr_uint32_t group_index = get_group_index(&cache, &key->entry_key);
WITH_READ_LOCK(cache,
membuffer_cache_get_partial_internal
@@ -1753,7 +2400,7 @@ membuffer_cache_get_partial(svn_membuffer_t *cache,
static svn_error_t *
membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
apr_uint32_t group_index,
- entry_key_t to_find,
+ const full_key_t *to_find,
svn_cache__partial_setter_func_t func,
void *baton,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
@@ -1771,12 +2418,12 @@ membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
svn_error_t *err;
/* access the serialized cache item */
- char *data = (char*)cache->data + entry->offset;
- char *orig_data = data;
- apr_size_t size = entry->size;
+ apr_size_t key_len = entry->key.key_len;
+ void *item_data = cache->data + entry->offset + key_len;
+ void *orig_data = item_data;
+ apr_size_t item_size = entry->size - key_len;
- entry->hit_count++;
- cache->hit_count++;
+ increment_hit_counters(cache, entry);
cache->total_writes++;
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
@@ -1784,19 +2431,19 @@ membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
/* Check for overlapping entries.
*/
SVN_ERR_ASSERT(entry->next == NO_INDEX ||
- entry->offset + size
+ entry->offset + entry->size
<= get_entry(cache, entry->next)->offset);
/* Compare original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag, data, size, scratch_pool));
+ SVN_ERR(store_content_part(tag, item_data, item_size, scratch_pool));
SVN_ERR(assert_equal_tags(&entry->tag, tag));
#endif
/* modify it, preferably in-situ.
*/
- err = func((void **)&data, &size, baton, scratch_pool);
+ err = func(&item_data, &item_size, baton, scratch_pool);
if (err)
{
@@ -1805,27 +2452,34 @@ membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
* We better drop that.
*/
drop_entry(cache, entry);
+
+ return err;
}
else
{
/* if the modification caused a re-allocation, we need to remove
* the old entry and to copy the new data back into cache.
*/
- if (data != orig_data)
+ if (item_data != orig_data)
{
/* Remove the old entry and try to make space for the new one.
*/
drop_entry(cache, entry);
- if ( (cache->max_entry_size >= size)
- && ensure_data_insertable(cache, size))
+ if ( (cache->max_entry_size >= item_size + key_len)
+ && ensure_data_insertable_l1(cache, item_size + key_len))
{
/* Write the new entry.
*/
entry = find_entry(cache, group_index, to_find, TRUE);
- entry->size = size;
- entry->offset = cache->current_data;
- if (size)
- memcpy(cache->data + entry->offset, data, size);
+ entry->size = item_size + key_len;
+ entry->offset = cache->l1.current_data;
+
+ if (key_len)
+ memcpy(cache->data + entry->offset,
+ to_find->full_key.data, key_len);
+ if (item_size)
+ memcpy(cache->data + entry->offset + key_len, item_data,
+ item_size);
/* Link the entry properly.
*/
@@ -1837,7 +2491,7 @@ membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
/* Remember original content, type and key (hashes)
*/
- SVN_ERR(store_content_part(tag, data, size, scratch_pool));
+ SVN_ERR(store_content_part(tag, item_data, item_size, scratch_pool));
memcpy(&entry->tag, tag, sizeof(*tag));
#endif
@@ -1854,7 +2508,7 @@ membuffer_cache_set_partial_internal(svn_membuffer_t *cache,
*/
static svn_error_t *
membuffer_cache_set_partial(svn_membuffer_t *cache,
- entry_key_t key,
+ const full_key_t *key,
svn_cache__partial_setter_func_t func,
void *baton,
DEBUG_CACHE_MEMBUFFER_TAG_ARG
@@ -1862,7 +2516,7 @@ membuffer_cache_set_partial(svn_membuffer_t *cache,
{
/* cache item lookup
*/
- apr_uint32_t group_index = get_group_index(&cache, key);
+ apr_uint32_t group_index = get_group_index(&cache, &key->entry_key);
WITH_WRITE_LOCK(cache,
membuffer_cache_set_partial_internal
(cache, group_index, key, func, baton,
@@ -1907,44 +2561,26 @@ typedef struct svn_membuffer_cache_t
svn_cache__deserialize_func_t deserializer;
/* Prepend this byte sequence to any key passed to us.
- * This makes (very likely) our keys different from all keys used
- * by other svn_membuffer_cache_t instances.
+ * This makes our keys different from all keys used by svn_membuffer_cache_t
+ * instances that we don't want to share cached data with.
*/
- entry_key_t prefix;
-
- /* A copy of the unmodified prefix. It is being used as a user-visible
- * ID for this cache instance.
- */
- const char* full_prefix;
+ full_key_t prefix;
/* length of the keys that will be passed to us through the
* svn_cache_t interface. May be APR_HASH_KEY_STRING.
*/
apr_ssize_t key_len;
- /* Temporary buffer containing the hash key for the current access
- */
- entry_key_t combined_key;
-
- /* a pool for temporary allocations during get() and set()
- */
- apr_pool_t *pool;
+ /* priority class for all items written through this interface */
+ apr_uint32_t priority;
- /* an internal counter that is used to clear the pool from time to time
- * but not too frequently.
+ /* Temporary buffer containing the hash key for the current access
*/
- int alloc_counter;
+ full_key_t combined_key;
/* if enabled, this will serialize the access to this instance.
*/
svn_mutex__t *mutex;
-#ifdef SVN_DEBUG_CACHE_MEMBUFFER
-
- /* Invariant tag info for all items stored by this cache instance.
- */
- char prefix_tail[PREFIX_TAIL_LEN];
-
-#endif
} svn_membuffer_cache_t;
/* After an estimated ALLOCATIONS_PER_POOL_CLEAR allocations, we should
@@ -1952,46 +2588,89 @@ typedef struct svn_membuffer_cache_t
*/
#define ALLOCATIONS_PER_POOL_CLEAR 10
-
/* Basically calculate a hash value for KEY of length KEY_LEN, combine it
* with the CACHE->PREFIX and write the result in CACHE->COMBINED_KEY.
+ * This could replace combine_key() entirely but we actually use it only
+ * when the quick path failed.
*/
static void
-combine_key(svn_membuffer_cache_t *cache,
- const void *key,
- apr_ssize_t key_len)
+combine_long_key(svn_membuffer_cache_t *cache,
+ const void *key,
+ apr_ssize_t key_len)
{
+ apr_uint32_t *digest_buffer;
+ char *key_copy;
+ apr_size_t prefix_len = cache->prefix.entry_key.key_len;
+ apr_size_t aligned_key_len;
+
+ /* handle variable-length keys */
if (key_len == APR_HASH_KEY_STRING)
key_len = strlen((const char *) key);
- if (key_len < 16)
- {
- apr_uint32_t data[4] = { 0 };
- memcpy(data, key, key_len);
+ aligned_key_len = ALIGN_VALUE(key_len);
- svn__pseudo_md5_15((apr_uint32_t *)cache->combined_key, data);
- }
- else if (key_len < 32)
- {
- apr_uint32_t data[8] = { 0 };
- memcpy(data, key, key_len);
+ /* Combine keys. */
+ svn_membuf__ensure(&cache->combined_key.full_key,
+ aligned_key_len + prefix_len);
- svn__pseudo_md5_31((apr_uint32_t *)cache->combined_key, data);
- }
- else if (key_len < 64)
+ key_copy = (char *)cache->combined_key.full_key.data + prefix_len;
+ cache->combined_key.entry_key.key_len = aligned_key_len + prefix_len;
+ memcpy(key_copy, key, key_len);
+ memset(key_copy + key_len, 0, aligned_key_len - key_len);
+
+ /* Hash key into 16 bytes. */
+ digest_buffer = (apr_uint32_t *)cache->combined_key.entry_key.fingerprint;
+ svn__fnv1a_32x4_raw(digest_buffer, key, key_len);
+
+ /* Combine with prefix. */
+ cache->combined_key.entry_key.fingerprint[0]
+ ^= cache->prefix.entry_key.fingerprint[0];
+ cache->combined_key.entry_key.fingerprint[1]
+ ^= cache->prefix.entry_key.fingerprint[1];
+}
+
+/* Basically calculate a hash value for KEY of length KEY_LEN, combine it
+ * with the CACHE->PREFIX and write the result in CACHE->COMBINED_KEY.
+ */
+static void
+combine_key(svn_membuffer_cache_t *cache,
+ const void *key,
+ apr_ssize_t key_len)
+{
+ /* short, fixed-size keys are the most common case */
+ if (key_len != APR_HASH_KEY_STRING && key_len <= 16)
{
- apr_uint32_t data[16] = { 0 };
+ const apr_size_t prefix_len = cache->prefix.entry_key.key_len;
+
+ /* Copy of *key, padded with 0.
+ * We put it just behind the prefix already copied into the COMBINED_KEY.
+ * The buffer space has been allocated when the cache was created. */
+ apr_uint64_t *data = (void *)((char *)cache->combined_key.full_key.data +
+ prefix_len);
+ assert(prefix_len <= cache->combined_key.full_key.size - 16);
+ cache->combined_key.entry_key.key_len = prefix_len + 16;
+
+ data[0] = 0;
+ data[1] = 0;
memcpy(data, key, key_len);
- svn__pseudo_md5_63((apr_uint32_t *)cache->combined_key, data);
+ /* scramble key DATA. All of this must be reversible to prevent key
+ * collisions. So, we limit ourselves to xor and permutations. */
+ data[1] = (data[1] << 27) | (data[1] >> 37);
+ data[1] ^= data[0] & 0xffff;
+ data[0] ^= data[1] & APR_UINT64_C(0xffffffffffff0000);
+
+ /* combine with this cache's namespace */
+ cache->combined_key.entry_key.fingerprint[0]
+ = data[0] ^ cache->prefix.entry_key.fingerprint[0];
+ cache->combined_key.entry_key.fingerprint[1]
+ = data[1] ^ cache->prefix.entry_key.fingerprint[1];
}
else
{
- apr_md5((unsigned char*)cache->combined_key, key, key_len);
+ /* longer or variably sized keys */
+ combine_long_key(cache, key, key_len);
}
-
- cache->combined_key[0] ^= cache->prefix[0];
- cache->combined_key[1] ^= cache->prefix[1];
}
/* Implement svn_cache__vtable_t.get (not thread-safe)
@@ -2005,7 +2684,7 @@ svn_membuffer_cache_get(void **value_p,
{
svn_membuffer_cache_t *cache = cache_void;
- DEBUG_CACHE_MEMBUFFER_INIT_TAG
+ DEBUG_CACHE_MEMBUFFER_INIT_TAG(result_pool)
/* special case */
if (key == NULL)
@@ -2023,7 +2702,7 @@ svn_membuffer_cache_get(void **value_p,
/* Look the item up. */
SVN_ERR(membuffer_cache_get(cache->membuffer,
- cache->combined_key,
+ &cache->combined_key,
value_p,
cache->deserializer,
DEBUG_CACHE_MEMBUFFER_TAG
@@ -2031,6 +2710,39 @@ svn_membuffer_cache_get(void **value_p,
/* return result */
*found = *value_p != NULL;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_cache__vtable_t.has_key (not thread-safe)
+ */
+static svn_error_t *
+svn_membuffer_cache_has_key(svn_boolean_t *found,
+ void *cache_void,
+ const void *key,
+ apr_pool_t *scratch_pool)
+{
+ svn_membuffer_cache_t *cache = cache_void;
+
+ /* special case */
+ if (key == NULL)
+ {
+ *found = FALSE;
+
+ return SVN_NO_ERROR;
+ }
+
+ /* construct the full, i.e. globally unique, key by adding
+ * this cache instances' prefix
+ */
+ combine_key(cache, key, cache->key_len);
+
+ /* Look the item up. */
+ SVN_ERR(membuffer_cache_has_key(cache->membuffer,
+ &cache->combined_key,
+ found));
+
+ /* return result */
return SVN_NO_ERROR;
}
@@ -2044,22 +2756,12 @@ svn_membuffer_cache_set(void *cache_void,
{
svn_membuffer_cache_t *cache = cache_void;
- DEBUG_CACHE_MEMBUFFER_INIT_TAG
+ DEBUG_CACHE_MEMBUFFER_INIT_TAG(scratch_pool)
/* special case */
if (key == NULL)
return SVN_NO_ERROR;
- /* we do some allocations below, so increase the allocation counter
- * by a slightly larger amount. Free allocated memory every now and then.
- */
- cache->alloc_counter += 3;
- if (cache->alloc_counter > ALLOCATIONS_PER_POOL_CLEAR)
- {
- svn_pool_clear(cache->pool);
- cache->alloc_counter = 0;
- }
-
/* construct the full, i.e. globally unique, key by adding
* this cache instances' prefix
*/
@@ -2069,11 +2771,12 @@ svn_membuffer_cache_set(void *cache_void,
* that the item will actually be cached afterwards.
*/
return membuffer_cache_set(cache->membuffer,
- cache->combined_key,
+ &cache->combined_key,
value,
cache->serializer,
+ cache->priority,
DEBUG_CACHE_MEMBUFFER_TAG
- cache->pool);
+ scratch_pool);
}
/* Implement svn_cache__vtable_t.iter as "not implemented"
@@ -2102,7 +2805,7 @@ svn_membuffer_cache_get_partial(void **value_p,
{
svn_membuffer_cache_t *cache = cache_void;
- DEBUG_CACHE_MEMBUFFER_INIT_TAG
+ DEBUG_CACHE_MEMBUFFER_INIT_TAG(result_pool)
if (key == NULL)
{
@@ -2114,7 +2817,7 @@ svn_membuffer_cache_get_partial(void **value_p,
combine_key(cache, key, cache->key_len);
SVN_ERR(membuffer_cache_get_partial(cache->membuffer,
- cache->combined_key,
+ &cache->combined_key,
value_p,
found,
func,
@@ -2136,13 +2839,13 @@ svn_membuffer_cache_set_partial(void *cache_void,
{
svn_membuffer_cache_t *cache = cache_void;
- DEBUG_CACHE_MEMBUFFER_INIT_TAG
+ DEBUG_CACHE_MEMBUFFER_INIT_TAG(scratch_pool)
if (key != NULL)
{
combine_key(cache, key, cache->key_len);
SVN_ERR(membuffer_cache_set_partial(cache->membuffer,
- cache->combined_key,
+ &cache->combined_key,
func,
baton,
DEBUG_CACHE_MEMBUFFER_TAG
@@ -2162,23 +2865,41 @@ svn_membuffer_cache_is_cachable(void *cache_void, apr_size_t size)
* must be small enough to be stored in a 32 bit value.
*/
svn_membuffer_cache_t *cache = cache_void;
- return size <= cache->membuffer->max_entry_size;
+ return cache->priority > SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY
+ ? cache->membuffer->l2.size >= size && MAX_ITEM_SIZE >= size
+ : size <= cache->membuffer->max_entry_size;
}
-/* Add statistics of SEGMENT to INFO.
+/* Add statistics of SEGMENT to INFO. If INCLUDE_HISTOGRAM is TRUE,
+ * accumulate index bucket fill levels in INFO->HISTOGRAM.
*/
static svn_error_t *
svn_membuffer_get_segment_info(svn_membuffer_t *segment,
- svn_cache__info_t *info)
+ svn_cache__info_t *info,
+ svn_boolean_t include_histogram)
{
- info->data_size += segment->data_size;
+ apr_uint32_t i;
+
+ info->data_size += segment->l1.size + segment->l2.size;
info->used_size += segment->data_used;
- info->total_size += segment->data_size +
+ info->total_size += segment->l1.size + segment->l2.size +
segment->group_count * GROUP_SIZE * sizeof(entry_t);
info->used_entries += segment->used_entries;
info->total_entries += segment->group_count * GROUP_SIZE;
+ if (include_histogram)
+ for (i = 0; i < segment->group_count; ++i)
+ if (is_group_initialized(segment, i))
+ {
+ entry_group_t *chain_end
+ = last_group_in_chain(segment, &segment->directory[i]);
+ apr_size_t use
+ = MIN(chain_end->header.used,
+ sizeof(info->histogram) / sizeof(info->histogram[0]) - 1);
+ info->histogram[use]++;
+ }
+
return SVN_NO_ERROR;
}
@@ -2196,22 +2917,15 @@ svn_membuffer_cache_get_info(void *cache_void,
/* cache front-end specific data */
- info->id = apr_pstrdup(result_pool, cache->full_prefix);
+ info->id = apr_pstrdup(result_pool, cache->prefix.full_key.data);
/* collect info from shared cache back-end */
- info->data_size = 0;
- info->used_size = 0;
- info->total_size = 0;
-
- info->used_entries = 0;
- info->total_entries = 0;
-
for (i = 0; i < cache->membuffer->segment_count; ++i)
{
svn_membuffer_t *segment = cache->membuffer + i;
WITH_READ_LOCK(segment,
- svn_membuffer_get_segment_info(segment, info));
+ svn_membuffer_get_segment_info(segment, info, FALSE));
}
return SVN_NO_ERROR;
@@ -2222,6 +2936,7 @@ svn_membuffer_cache_get_info(void *cache_void,
*/
static svn_cache__vtable_t membuffer_cache_vtable = {
svn_membuffer_cache_get,
+ svn_membuffer_cache_has_key,
svn_membuffer_cache_set,
svn_membuffer_cache_iter,
svn_membuffer_cache_is_cachable,
@@ -2250,6 +2965,24 @@ svn_membuffer_cache_get_synced(void **value_p,
return SVN_NO_ERROR;
}
+/* Implement svn_cache__vtable_t.has_key and serialize all cache access.
+ */
+static svn_error_t *
+svn_membuffer_cache_has_key_synced(svn_boolean_t *found,
+ void *cache_void,
+ const void *key,
+ apr_pool_t *result_pool)
+{
+ svn_membuffer_cache_t *cache = cache_void;
+ SVN_MUTEX__WITH_LOCK(cache->mutex,
+ svn_membuffer_cache_has_key(found,
+ cache_void,
+ key,
+ result_pool));
+
+ return SVN_NO_ERROR;
+}
+
/* Implement svn_cache__vtable_t.set and serialize all cache access.
*/
static svn_error_t *
@@ -2316,6 +3049,7 @@ svn_membuffer_cache_set_partial_synced(void *cache_void,
*/
static svn_cache__vtable_t membuffer_cache_synced_vtable = {
svn_membuffer_cache_get_synced,
+ svn_membuffer_cache_has_key_synced,
svn_membuffer_cache_set_synced,
svn_membuffer_cache_iter, /* no sync required */
svn_membuffer_cache_is_cachable, /* no sync required */
@@ -2370,15 +3104,18 @@ svn_cache__create_membuffer_cache(svn_cache__t **cache_p,
svn_cache__deserialize_func_t deserializer,
apr_ssize_t klen,
const char *prefix,
+ apr_uint32_t priority,
svn_boolean_t thread_safe,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_checksum_t *checksum;
+ apr_size_t prefix_len, prefix_orig_len;
/* allocate the cache header structures
*/
- svn_cache__t *wrapper = apr_pcalloc(pool, sizeof(*wrapper));
- svn_membuffer_cache_t *cache = apr_palloc(pool, sizeof(*cache));
+ svn_cache__t *wrapper = apr_pcalloc(result_pool, sizeof(*wrapper));
+ svn_membuffer_cache_t *cache = apr_pcalloc(result_pool, sizeof(*cache));
/* initialize our internal cache header
*/
@@ -2389,30 +3126,38 @@ svn_cache__create_membuffer_cache(svn_cache__t **cache_p,
cache->deserializer = deserializer
? deserializer
: deserialize_svn_stringbuf;
- cache->full_prefix = apr_pstrdup(pool, prefix);
+ cache->priority = priority;
cache->key_len = klen;
- cache->pool = svn_pool_create(pool);
- cache->alloc_counter = 0;
- SVN_ERR(svn_mutex__init(&cache->mutex, thread_safe, pool));
+ SVN_ERR(svn_mutex__init(&cache->mutex, thread_safe, result_pool));
- /* for performance reasons, we don't actually store the full prefix but a
- * hash value of it
- */
+ /* Copy the prefix into the prefix full key. Align it to ITEM_ALIGMENT.
+ * Don't forget to include the terminating NUL. */
+ prefix_orig_len = strlen(prefix) + 1;
+ prefix_len = ALIGN_VALUE(prefix_orig_len);
+
+ svn_membuf__create(&cache->prefix.full_key, prefix_len, result_pool);
+ memcpy((char *)cache->prefix.full_key.data, prefix, prefix_orig_len);
+ memset((char *)cache->prefix.full_key.data + prefix_orig_len, 0,
+ prefix_len - prefix_orig_len);
+
+ /* Construct the folded prefix key. */
SVN_ERR(svn_checksum(&checksum,
svn_checksum_md5,
prefix,
strlen(prefix),
- pool));
- memcpy(cache->prefix, checksum->digest, sizeof(cache->prefix));
-
-#ifdef SVN_DEBUG_CACHE_MEMBUFFER
-
- /* Initialize cache debugging support.
- */
- get_prefix_tail(prefix, cache->prefix_tail);
-
-#endif
+ scratch_pool));
+ memcpy(cache->prefix.entry_key.fingerprint, checksum->digest,
+ sizeof(cache->prefix.entry_key.fingerprint));
+ cache->prefix.entry_key.key_len = prefix_len;
+
+ /* Initialize the combined key. Pre-allocate some extra room in the full
+ * key such that we probably don't need to re-alloc. */
+ cache->combined_key.entry_key = cache->prefix.entry_key;
+ svn_membuf__create(&cache->combined_key.full_key, prefix_len + 200,
+ result_pool);
+ memcpy(cache->combined_key.full_key.data, cache->prefix.full_key.data,
+ prefix_len);
/* initialize the generic cache wrapper
*/
@@ -2421,8 +3166,43 @@ svn_cache__create_membuffer_cache(svn_cache__t **cache_p,
wrapper->cache_internal = cache;
wrapper->error_handler = 0;
wrapper->error_baton = 0;
+ wrapper->pretend_empty = !!getenv("SVN_X_DOES_NOT_MARK_THE_SPOT");
*cache_p = wrapper;
return SVN_NO_ERROR;
}
+static svn_error_t *
+svn_membuffer_get_global_segment_info(svn_membuffer_t *segment,
+ svn_cache__info_t *info)
+{
+ info->gets += segment->total_reads;
+ info->sets += segment->total_writes;
+ info->hits += segment->total_hits;
+
+ WITH_READ_LOCK(segment,
+ svn_membuffer_get_segment_info(segment, info, TRUE));
+
+ return SVN_NO_ERROR;
+}
+
+svn_cache__info_t *
+svn_cache__membuffer_get_global_info(apr_pool_t *pool)
+{
+ apr_uint32_t i;
+
+ svn_membuffer_t *membuffer = svn_cache__get_global_membuffer_cache();
+ svn_cache__info_t *info = apr_pcalloc(pool, sizeof(*info));
+
+ /* cache front-end specific data */
+
+ info->id = "membuffer globals";
+
+ /* collect info from shared cache back-end */
+
+ for (i = 0; i < membuffer->segment_count; ++i)
+ svn_error_clear(svn_membuffer_get_global_segment_info(membuffer + i,
+ info));
+
+ return info;
+}
diff --git a/subversion/libsvn_subr/cache-memcache.c b/subversion/libsvn_subr/cache-memcache.c
index 500426d..333eb44 100644
--- a/subversion/libsvn_subr/cache-memcache.c
+++ b/subversion/libsvn_subr/cache-memcache.c
@@ -99,7 +99,7 @@ build_key(const char **mc_key,
}
long_key = apr_pstrcat(pool, "SVN:", cache->prefix, ":", encoded_suffix,
- (char *)NULL);
+ SVN_VA_NULL);
long_key_len = strlen(long_key);
/* We don't want to have a key that's too big. If it was going to
@@ -120,7 +120,7 @@ build_key(const char **mc_key,
apr_pstrmemdup(pool, long_key,
MEMCACHED_KEY_UNHASHED_LEN),
svn_checksum_to_cstring_display(checksum, pool),
- (char *)NULL);
+ SVN_VA_NULL);
}
*mc_key = long_key;
@@ -214,6 +214,26 @@ memcache_get(void **value_p,
return SVN_NO_ERROR;
}
+/* Implement vtable.has_key in terms of the getter.
+ */
+static svn_error_t *
+memcache_has_key(svn_boolean_t *found,
+ void *cache_void,
+ const void *key,
+ apr_pool_t *scratch_pool)
+{
+ char *data;
+ apr_size_t data_len;
+ SVN_ERR(memcache_internal_get(&data,
+ &data_len,
+ found,
+ cache_void,
+ key,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
/* Core functionality of our setter functions: store LENGH bytes of DATA
* to be identified by KEY in the memcached given by CACHE_VOID. Use POOL
* for temporary allocations.
@@ -347,7 +367,7 @@ memcache_iter(svn_boolean_t *completed,
static svn_boolean_t
memcache_is_cachable(void *unused, apr_size_t size)
{
- (void)unused; /* silence gcc warning. */
+ SVN_UNUSED(unused);
/* The memcached cutoff seems to be a bit (header length?) under a megabyte.
* We round down a little to be safe.
@@ -367,17 +387,12 @@ memcache_get_info(void *cache_void,
/* we don't have any memory allocation info */
- info->used_size = 0;
- info->total_size = 0;
- info->data_size = 0;
- info->used_entries = 0;
- info->total_entries = 0;
-
return SVN_NO_ERROR;
}
static svn_cache__vtable_t memcache_vtable = {
memcache_get,
+ memcache_has_key,
memcache_set,
memcache_iter,
memcache_is_cachable,
@@ -408,6 +423,7 @@ svn_cache__create_memcache(svn_cache__t **cache_p,
wrapper->cache_internal = cache;
wrapper->error_handler = 0;
wrapper->error_baton = 0;
+ wrapper->pretend_empty = !!getenv("SVN_X_DOES_NOT_MARK_THE_SPOT");
*cache_p = wrapper;
return SVN_NO_ERROR;
@@ -528,20 +544,17 @@ nop_enumerator(const char *name,
svn_error_t *
svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p,
svn_config_t *config,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- int server_count;
- apr_pool_t *subpool = svn_pool_create(pool);
-
- server_count =
+ int server_count =
svn_config_enumerate2(config,
SVN_CACHE_CONFIG_CATEGORY_MEMCACHED_SERVERS,
- nop_enumerator, NULL, subpool);
+ nop_enumerator, NULL, scratch_pool);
if (server_count == 0)
{
*memcache_p = NULL;
- svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
@@ -551,8 +564,8 @@ svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p,
#ifdef SVN_HAVE_MEMCACHE
{
struct ams_baton b;
- svn_memcache_t *memcache = apr_pcalloc(pool, sizeof(*memcache));
- apr_status_t apr_err = apr_memcache_create(pool,
+ svn_memcache_t *memcache = apr_pcalloc(result_pool, sizeof(*memcache));
+ apr_status_t apr_err = apr_memcache_create(result_pool,
(apr_uint16_t)server_count,
0, /* flags */
&(memcache->c));
@@ -561,19 +574,18 @@ svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p,
_("Unknown error creating apr_memcache_t"));
b.memcache = memcache->c;
- b.memcache_pool = pool;
+ b.memcache_pool = result_pool;
b.err = SVN_NO_ERROR;
svn_config_enumerate2(config,
SVN_CACHE_CONFIG_CATEGORY_MEMCACHED_SERVERS,
add_memcache_server, &b,
- subpool);
+ scratch_pool);
if (b.err)
return b.err;
*memcache_p = memcache;
- svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
#else /* ! SVN_HAVE_MEMCACHE */
diff --git a/subversion/libsvn_subr/cache.c b/subversion/libsvn_subr/cache.c
index 70e189f..06bb454 100644
--- a/subversion/libsvn_subr/cache.c
+++ b/subversion/libsvn_subr/cache.c
@@ -76,7 +76,7 @@ svn_cache__get(void **value_p,
out with FOUND set to false. */
*found = FALSE;
#ifdef SVN_DEBUG
- if (getenv("SVN_X_DOES_NOT_MARK_THE_SPOT"))
+ if (cache->pretend_empty)
return SVN_NO_ERROR;
#endif
@@ -96,6 +96,26 @@ svn_cache__get(void **value_p,
}
svn_error_t *
+svn_cache__has_key(svn_boolean_t *found,
+ svn_cache__t *cache,
+ const void *key,
+ apr_pool_t *scratch_pool)
+{
+ *found = FALSE;
+#ifdef SVN_DEBUG
+ if (cache->pretend_empty)
+ return SVN_NO_ERROR;
+#endif
+
+ return handle_error(cache,
+ (cache->vtable->has_key)(found,
+ cache->cache_internal,
+ key,
+ scratch_pool),
+ scratch_pool);
+}
+
+svn_error_t *
svn_cache__set(svn_cache__t *cache,
const void *key,
void *value,
@@ -119,7 +139,7 @@ svn_cache__iter(svn_boolean_t *completed,
apr_pool_t *scratch_pool)
{
#ifdef SVN_DEBUG
- if (getenv("SVN_X_DOES_NOT_MARK_THE_SPOT"))
+ if (cache->pretend_empty)
/* Pretend CACHE is empty. */
return SVN_NO_ERROR;
#endif
@@ -146,7 +166,7 @@ svn_cache__get_partial(void **value,
out with FOUND set to false. */
*found = FALSE;
#ifdef SVN_DEBUG
- if (getenv("SVN_X_DOES_NOT_MARK_THE_SPOT"))
+ if (cache->pretend_empty)
return SVN_NO_ERROR;
#endif
@@ -192,6 +212,7 @@ svn_cache__get_info(svn_cache__t *cache,
{
/* write general statistics */
+ memset(info, 0, sizeof(*info));
info->gets = cache->reads;
info->hits = cache->hits;
info->sets = cache->writes;
@@ -221,6 +242,7 @@ svn_cache__get_info(svn_cache__t *cache,
svn_string_t *
svn_cache__format_info(const svn_cache__info_t *info,
+ svn_boolean_t access_only,
apr_pool_t *result_pool)
{
enum { _1MB = 1024 * 1024 };
@@ -235,9 +257,40 @@ svn_cache__format_info(const svn_cache__info_t *info,
double data_entry_rate = (100.0 * (double)info->used_entries)
/ (double)(info->total_entries ? info->total_entries : 1);
- return svn_string_createf(result_pool,
+ const char *histogram = "";
+ if (!access_only)
+ {
+ svn_stringbuf_t *text = svn_stringbuf_create_empty(result_pool);
+
+ int i;
+ int count = sizeof(info->histogram) / sizeof(info->histogram[0]);
+ for (i = count - 1; i >= 0; --i)
+ if (info->histogram[i] > 0 || text->len > 0)
+ text = svn_stringbuf_createf(result_pool,
+ i == count - 1
+ ? "%s%12" APR_UINT64_T_FMT
+ " buckets with >%d entries\n"
+ : "%s%12" APR_UINT64_T_FMT
+ " buckets with %d entries\n",
+ text->data, info->histogram[i], i);
+
+ histogram = text->data;
+ }
+
+ return access_only
+ ? svn_string_createf(result_pool,
+ "%s\n"
+ "gets : %" APR_UINT64_T_FMT
+ ", %" APR_UINT64_T_FMT " hits (%5.2f%%)\n"
+ "sets : %" APR_UINT64_T_FMT
+ " (%5.2f%% of misses)\n",
+ info->id,
+ info->gets,
+ info->hits, hit_rate,
+ info->sets, write_rate)
+ : svn_string_createf(result_pool,
- "prefix : %s\n"
+ "%s\n"
"gets : %" APR_UINT64_T_FMT
", %" APR_UINT64_T_FMT " hits (%5.2f%%)\n"
"sets : %" APR_UINT64_T_FMT
@@ -247,7 +300,7 @@ svn_cache__format_info(const svn_cache__info_t *info,
" of %" APR_UINT64_T_FMT " MB data cache"
" / %" APR_UINT64_T_FMT " MB total cache memory\n"
" %" APR_UINT64_T_FMT " entries (%5.2f%%)"
- " of %" APR_UINT64_T_FMT " total\n",
+ " of %" APR_UINT64_T_FMT " total\n%s",
info->id,
@@ -261,5 +314,6 @@ svn_cache__format_info(const svn_cache__info_t *info,
info->total_size / _1MB,
info->used_entries, data_entry_rate,
- info->total_entries);
+ info->total_entries,
+ histogram);
}
diff --git a/subversion/libsvn_subr/cache.h b/subversion/libsvn_subr/cache.h
index 5029cef..62a1f8e 100644
--- a/subversion/libsvn_subr/cache.h
+++ b/subversion/libsvn_subr/cache.h
@@ -38,6 +38,12 @@ typedef struct svn_cache__vtable_t {
const void *key,
apr_pool_t *result_pool);
+ /* See svn_cache__has_key(). */
+ svn_error_t *(*has_key)(svn_boolean_t *found,
+ void *cache_implementation,
+ const void *key,
+ apr_pool_t *scratch_pool);
+
/* See svn_cache__set(). */
svn_error_t *(*set)(void *cache_implementation,
const void *key,
@@ -99,6 +105,10 @@ struct svn_cache__t {
/* Total number of function calls that returned an error. */
apr_uint64_t failures;
+
+ /* Cause all getters to act as though the cache contains no data.
+ (Currently this never becomes set except in maintainer builds.) */
+ svn_boolean_t pretend_empty;
};
diff --git a/subversion/libsvn_subr/cache_config.c b/subversion/libsvn_subr/cache_config.c
index 17659f8..639124e 100644
--- a/subversion/libsvn_subr/cache_config.c
+++ b/subversion/libsvn_subr/cache_config.c
@@ -27,6 +27,7 @@
#include "private/svn_cache.h"
#include "svn_pools.h"
+#include "svn_sorts.h"
/* The cache settings as a process-wide singleton.
*/
@@ -80,7 +81,13 @@ initialize_cache(void *baton, apr_pool_t *unused_pool)
svn_membuffer_t **cache_p = baton;
svn_membuffer_t *cache = NULL;
- apr_uint64_t cache_size = cache_settings.cache_size;
+ /* Limit the cache size to about half the available address space
+ * (typ. 1G under 32 bits).
+ */
+ apr_uint64_t cache_size = MIN(cache_settings.cache_size,
+ (apr_uint64_t)SVN_MAX_OBJECT_SIZE / 2);
+
+ /* Create caches at all? */
if (cache_size)
{
svn_error_t *err;
@@ -116,7 +123,7 @@ initialize_cache(void *baton, apr_pool_t *unused_pool)
err = svn_cache__membuffer_cache_create(
&cache,
(apr_size_t)cache_size,
- (apr_size_t)(cache_size / 10),
+ (apr_size_t)(cache_size / 5),
0,
! svn_cache_config_get()->single_threaded,
FALSE,
diff --git a/subversion/libsvn_subr/checksum.c b/subversion/libsvn_subr/checksum.c
index e5d6a62..6b195f8 100644
--- a/subversion/libsvn_subr/checksum.c
+++ b/subversion/libsvn_subr/checksum.c
@@ -21,6 +21,7 @@
* ====================================================================
*/
+#define APR_WANT_BYTEFUNC
#include <ctype.h>
@@ -30,9 +31,10 @@
#include "svn_checksum.h"
#include "svn_error.h"
#include "svn_ctype.h"
+#include "svn_sorts.h"
-#include "sha1.h"
-#include "md5.h"
+#include "checksum.h"
+#include "fnv1a.h"
#include "private/svn_subr_private.h"
@@ -40,17 +42,117 @@
+/* The MD5 digest for the empty string. */
+static const unsigned char md5_empty_string_digest_array[] = {
+ 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
+ 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e
+};
+
+/* The SHA1 digest for the empty string. */
+static const unsigned char sha1_empty_string_digest_array[] = {
+ 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
+ 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
+};
+
+/* The FNV-1a digest for the empty string. */
+static const unsigned char fnv1a_32_empty_string_digest_array[] = {
+ 0x81, 0x1c, 0x9d, 0xc5
+};
+
+/* The FNV-1a digest for the empty string. */
+static const unsigned char fnv1a_32x4_empty_string_digest_array[] = {
+ 0xcd, 0x6d, 0x9a, 0x85
+};
+
+/* Digests for an empty string, indexed by checksum type */
+static const unsigned char * empty_string_digests[] = {
+ md5_empty_string_digest_array,
+ sha1_empty_string_digest_array,
+ fnv1a_32_empty_string_digest_array,
+ fnv1a_32x4_empty_string_digest_array
+};
+
+/* Digest sizes in bytes, indexed by checksum type */
+static const apr_size_t digest_sizes[] = {
+ APR_MD5_DIGESTSIZE,
+ APR_SHA1_DIGESTSIZE,
+ sizeof(apr_uint32_t),
+ sizeof(apr_uint32_t)
+};
+
+/* Checksum type prefixes used in serialized checksums. */
+static const char *ckind_str[] = {
+ "$md5 $",
+ "$sha1$",
+ "$fnv1$",
+ "$fnvm$",
+};
+
/* Returns the digest size of it's argument. */
-#define DIGESTSIZE(k) ((k) == svn_checksum_md5 ? APR_MD5_DIGESTSIZE : \
- (k) == svn_checksum_sha1 ? APR_SHA1_DIGESTSIZE : 0)
+#define DIGESTSIZE(k) \
+ (((k) < svn_checksum_md5 || (k) > svn_checksum_fnv1a_32x4) ? 0 : digest_sizes[k])
+
+/* Largest supported digest size */
+#define MAX_DIGESTSIZE (MAX(APR_MD5_DIGESTSIZE,APR_SHA1_DIGESTSIZE))
+
+const unsigned char *
+svn__empty_string_digest(svn_checksum_kind_t kind)
+{
+ return empty_string_digests[kind];
+}
+
+const char *
+svn__digest_to_cstring_display(const unsigned char digest[],
+ apr_size_t digest_size,
+ apr_pool_t *pool)
+{
+ static const char *hex = "0123456789abcdef";
+ char *str = apr_palloc(pool, (digest_size * 2) + 1);
+ apr_size_t i;
+
+ for (i = 0; i < digest_size; i++)
+ {
+ str[i*2] = hex[digest[i] >> 4];
+ str[i*2+1] = hex[digest[i] & 0x0f];
+ }
+ str[i*2] = '\0';
+
+ return str;
+}
+
+
+const char *
+svn__digest_to_cstring(const unsigned char digest[],
+ apr_size_t digest_size,
+ apr_pool_t *pool)
+{
+ static const unsigned char zeros_digest[MAX_DIGESTSIZE] = { 0 };
+
+ if (memcmp(digest, zeros_digest, digest_size) != 0)
+ return svn__digest_to_cstring_display(digest, digest_size, pool);
+ else
+ return NULL;
+}
+svn_boolean_t
+svn__digests_match(const unsigned char d1[],
+ const unsigned char d2[],
+ apr_size_t digest_size)
+{
+ static const unsigned char zeros[MAX_DIGESTSIZE] = { 0 };
+
+ return ((memcmp(d1, d2, digest_size) == 0)
+ || (memcmp(d2, zeros, digest_size) == 0)
+ || (memcmp(d1, zeros, digest_size) == 0));
+}
+
/* Check to see if KIND is something we recognize. If not, return
* SVN_ERR_BAD_CHECKSUM_KIND */
static svn_error_t *
validate_kind(svn_checksum_kind_t kind)
{
- if (kind == svn_checksum_md5 || kind == svn_checksum_sha1)
+ if (kind >= svn_checksum_md5 && kind <= svn_checksum_fnv1a_32x4)
return SVN_NO_ERROR;
else
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
@@ -71,12 +173,15 @@ checksum_create_without_digest(svn_checksum_kind_t kind,
return checksum;
}
+/* Return a checksum object, allocated in POOL. The checksum will be of
+ * type KIND and contain the given DIGEST.
+ */
static svn_checksum_t *
checksum_create(svn_checksum_kind_t kind,
- apr_size_t digest_size,
const unsigned char *digest,
apr_pool_t *pool)
{
+ apr_size_t digest_size = DIGESTSIZE(kind);
svn_checksum_t *checksum = checksum_create_without_digest(kind, digest_size,
pool);
memcpy((unsigned char *)checksum->digest, digest, digest_size);
@@ -93,11 +198,12 @@ svn_checksum_create(svn_checksum_kind_t kind,
switch (kind)
{
case svn_checksum_md5:
- digest_size = APR_MD5_DIGESTSIZE;
- break;
case svn_checksum_sha1:
- digest_size = APR_SHA1_DIGESTSIZE;
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ digest_size = digest_sizes[kind];
break;
+
default:
return NULL;
}
@@ -111,16 +217,28 @@ svn_checksum_t *
svn_checksum__from_digest_md5(const unsigned char *digest,
apr_pool_t *result_pool)
{
- return checksum_create(svn_checksum_md5, APR_MD5_DIGESTSIZE, digest,
- result_pool);
+ return checksum_create(svn_checksum_md5, digest, result_pool);
}
svn_checksum_t *
svn_checksum__from_digest_sha1(const unsigned char *digest,
apr_pool_t *result_pool)
{
- return checksum_create(svn_checksum_sha1, APR_SHA1_DIGESTSIZE, digest,
- result_pool);
+ return checksum_create(svn_checksum_sha1, digest, result_pool);
+}
+
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32(const unsigned char *digest,
+ apr_pool_t *result_pool)
+{
+ return checksum_create(svn_checksum_fnv1a_32, digest, result_pool);
+}
+
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32x4(const unsigned char *digest,
+ apr_pool_t *result_pool)
+{
+ return checksum_create(svn_checksum_fnv1a_32x4, digest, result_pool);
}
svn_error_t *
@@ -145,9 +263,13 @@ svn_checksum_match(const svn_checksum_t *checksum1,
switch (checksum1->kind)
{
case svn_checksum_md5:
- return svn_md5__digests_match(checksum1->digest, checksum2->digest);
case svn_checksum_sha1:
- return svn_sha1__digests_match(checksum1->digest, checksum2->digest);
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return svn__digests_match(checksum1->digest,
+ checksum2->digest,
+ digest_sizes[checksum1->kind]);
+
default:
/* We really shouldn't get here, but if we do... */
return FALSE;
@@ -161,9 +283,13 @@ svn_checksum_to_cstring_display(const svn_checksum_t *checksum,
switch (checksum->kind)
{
case svn_checksum_md5:
- return svn_md5__digest_to_cstring_display(checksum->digest, pool);
case svn_checksum_sha1:
- return svn_sha1__digest_to_cstring_display(checksum->digest, pool);
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return svn__digest_to_cstring_display(checksum->digest,
+ digest_sizes[checksum->kind],
+ pool);
+
default:
/* We really shouldn't get here, but if we do... */
return NULL;
@@ -180,9 +306,13 @@ svn_checksum_to_cstring(const svn_checksum_t *checksum,
switch (checksum->kind)
{
case svn_checksum_md5:
- return svn_md5__digest_to_cstring(checksum->digest, pool);
case svn_checksum_sha1:
- return svn_sha1__digest_to_cstring(checksum->digest, pool);
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return svn__digest_to_cstring(checksum->digest,
+ digest_sizes[checksum->kind],
+ pool);
+
default:
/* We really shouldn't get here, but if we do... */
return NULL;
@@ -195,15 +325,12 @@ svn_checksum_serialize(const svn_checksum_t *checksum,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- const char *ckind_str;
-
- SVN_ERR_ASSERT_NO_RETURN(checksum->kind == svn_checksum_md5
- || checksum->kind == svn_checksum_sha1);
- ckind_str = (checksum->kind == svn_checksum_md5 ? "$md5 $" : "$sha1$");
+ SVN_ERR_ASSERT_NO_RETURN(checksum->kind >= svn_checksum_md5
+ || checksum->kind <= svn_checksum_fnv1a_32x4);
return apr_pstrcat(result_pool,
- ckind_str,
+ ckind_str[checksum->kind],
svn_checksum_to_cstring(checksum, scratch_pool),
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -213,18 +340,29 @@ svn_checksum_deserialize(const svn_checksum_t **checksum,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_checksum_kind_t ckind;
+ svn_checksum_kind_t kind;
svn_checksum_t *parsed_checksum;
- /* "$md5 $..." or "$sha1$..." */
- SVN_ERR_ASSERT(strlen(data) > 6);
-
- ckind = (data[1] == 'm' ? svn_checksum_md5 : svn_checksum_sha1);
- SVN_ERR(svn_checksum_parse_hex(&parsed_checksum, ckind,
- data + 6, result_pool));
- *checksum = parsed_checksum;
-
- return SVN_NO_ERROR;
+ /* All prefixes have the same length. */
+ apr_size_t prefix_len = strlen(ckind_str[0]);
+
+ /* "$md5 $...", "$sha1$..." or ... */
+ if (strlen(data) <= prefix_len)
+ return svn_error_createf(SVN_ERR_BAD_CHECKSUM_PARSE, NULL,
+ _("Invalid prefix in checksum '%s'"),
+ data);
+
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ if (strncmp(ckind_str[kind], data, prefix_len) == 0)
+ {
+ SVN_ERR(svn_checksum_parse_hex(&parsed_checksum, kind,
+ data + prefix_len, result_pool));
+ *checksum = parsed_checksum;
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_createf(SVN_ERR_BAD_CHECKSUM_KIND, NULL,
+ "Unknown checksum kind in '%s'", data);
}
@@ -234,7 +372,7 @@ svn_checksum_parse_hex(svn_checksum_t **checksum,
const char *hex,
apr_pool_t *pool)
{
- int i, len;
+ apr_size_t i, len;
char is_nonzero = '\0';
char *digest;
static const char xdigitval[256] =
@@ -302,11 +440,11 @@ svn_checksum_dup(const svn_checksum_t *checksum,
switch (checksum->kind)
{
case svn_checksum_md5:
- return svn_checksum__from_digest_md5(checksum->digest, pool);
- break;
case svn_checksum_sha1:
- return svn_checksum__from_digest_sha1(checksum->digest, pool);
- break;
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return checksum_create(checksum->kind, checksum->digest, pool);
+
default:
SVN_ERR_MALFUNCTION_NO_RETURN();
break;
@@ -337,6 +475,16 @@ svn_checksum(svn_checksum_t **checksum,
apr_sha1_final((unsigned char *)(*checksum)->digest, &sha1_ctx);
break;
+ case svn_checksum_fnv1a_32:
+ *(apr_uint32_t *)(*checksum)->digest
+ = htonl(svn__fnv1a_32(data, len));
+ break;
+
+ case svn_checksum_fnv1a_32x4:
+ *(apr_uint32_t *)(*checksum)->digest
+ = htonl(svn__fnv1a_32x4(data, len));
+ break;
+
default:
/* We really shouldn't get here, but if we do... */
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
@@ -353,12 +501,10 @@ svn_checksum_empty_checksum(svn_checksum_kind_t kind,
switch (kind)
{
case svn_checksum_md5:
- return svn_checksum__from_digest_md5(svn_md5__empty_string_digest(),
- pool);
-
case svn_checksum_sha1:
- return svn_checksum__from_digest_sha1(svn_sha1__empty_string_digest(),
- pool);
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return checksum_create(kind, empty_string_digests[kind], pool);
default:
/* We really shouldn't get here, but if we do... */
@@ -391,6 +537,14 @@ svn_checksum_ctx_create(svn_checksum_kind_t kind,
apr_sha1_init(ctx->apr_ctx);
break;
+ case svn_checksum_fnv1a_32:
+ ctx->apr_ctx = svn_fnv1a_32__context_create(pool);
+ break;
+
+ case svn_checksum_fnv1a_32x4:
+ ctx->apr_ctx = svn_fnv1a_32x4__context_create(pool);
+ break;
+
default:
SVN_ERR_MALFUNCTION_NO_RETURN();
}
@@ -413,6 +567,14 @@ svn_checksum_update(svn_checksum_ctx_t *ctx,
apr_sha1_update(ctx->apr_ctx, data, (unsigned int)len);
break;
+ case svn_checksum_fnv1a_32:
+ svn_fnv1a_32__update(ctx->apr_ctx, data, len);
+ break;
+
+ case svn_checksum_fnv1a_32x4:
+ svn_fnv1a_32x4__update(ctx->apr_ctx, data, len);
+ break;
+
default:
/* We really shouldn't get here, but if we do... */
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
@@ -438,6 +600,16 @@ svn_checksum_final(svn_checksum_t **checksum,
apr_sha1_final((unsigned char *)(*checksum)->digest, ctx->apr_ctx);
break;
+ case svn_checksum_fnv1a_32:
+ *(apr_uint32_t *)(*checksum)->digest
+ = htonl(svn_fnv1a_32__finalize(ctx->apr_ctx));
+ break;
+
+ case svn_checksum_fnv1a_32x4:
+ *(apr_uint32_t *)(*checksum)->digest
+ = htonl(svn_fnv1a_32x4__finalize(ctx->apr_ctx));
+ break;
+
default:
/* We really shouldn't get here, but if we do... */
return svn_error_create(SVN_ERR_BAD_CHECKSUM_KIND, NULL, NULL);
@@ -486,15 +658,152 @@ svn_checksum_is_empty_checksum(svn_checksum_t *checksum)
switch (checksum->kind)
{
case svn_checksum_md5:
- return svn_md5__digests_match(checksum->digest,
- svn_md5__empty_string_digest());
-
case svn_checksum_sha1:
- return svn_sha1__digests_match(checksum->digest,
- svn_sha1__empty_string_digest());
+ case svn_checksum_fnv1a_32:
+ case svn_checksum_fnv1a_32x4:
+ return svn__digests_match(checksum->digest,
+ svn__empty_string_digest(checksum->kind),
+ digest_sizes[checksum->kind]);
default:
/* We really shouldn't get here, but if we do... */
SVN_ERR_MALFUNCTION_NO_RETURN();
}
}
+
+/* Checksum calculating stream wrappers.
+ */
+
+/* Baton used by write_handler and close_handler to calculate the checksum
+ * and return the result to the stream creator. It accommodates the data
+ * needed by svn_checksum__wrap_write_stream_fnv1a_32x4 as well as
+ * svn_checksum__wrap_write_stream.
+ */
+typedef struct stream_baton_t
+{
+ /* Stream we are wrapping. Forward write() and close() operations to it. */
+ svn_stream_t *inner_stream;
+
+ /* Build the checksum data in here. */
+ svn_checksum_ctx_t *context;
+
+ /* Write the final checksum here. May be NULL. */
+ svn_checksum_t **checksum;
+
+ /* Copy the digest of the final checksum. May be NULL. */
+ unsigned char *digest;
+
+ /* Allocate the resulting checksum here. */
+ apr_pool_t *pool;
+} stream_baton_t;
+
+/* Implement svn_write_fn_t.
+ * Update checksum and pass data on to inner stream.
+ */
+static svn_error_t *
+write_handler(void *baton,
+ const char *data,
+ apr_size_t *len)
+{
+ stream_baton_t *b = baton;
+
+ SVN_ERR(svn_checksum_update(b->context, data, *len));
+ SVN_ERR(svn_stream_write(b->inner_stream, data, len));
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_close_fn_t.
+ * Finalize checksum calculation and write results. Close inner stream.
+ */
+static svn_error_t *
+close_handler(void *baton)
+{
+ stream_baton_t *b = baton;
+ svn_checksum_t *local_checksum;
+
+ /* Ensure we can always write to *B->CHECKSUM. */
+ if (!b->checksum)
+ b->checksum = &local_checksum;
+
+ /* Get the final checksum. */
+ SVN_ERR(svn_checksum_final(b->checksum, b->context, b->pool));
+
+ /* Extract digest, if wanted. */
+ if (b->digest)
+ {
+ apr_size_t digest_size = DIGESTSIZE((*b->checksum)->kind);
+ memcpy(b->digest, (*b->checksum)->digest, digest_size);
+ }
+
+ /* Done here. Now, close the underlying stream as well. */
+ return svn_error_trace(svn_stream_close(b->inner_stream));
+}
+
+/* Common constructor function for svn_checksum__wrap_write_stream and
+ * svn_checksum__wrap_write_stream_fnv1a_32x4, taking the superset of their
+ * respecting parameters.
+ *
+ * In the current usage, either CHECKSUM or DIGEST will be NULL but this
+ * function does not enforce any such restriction. Also, the caller must
+ * make sure that DIGEST refers to a buffer of sufficient length.
+ */
+static svn_stream_t *
+wrap_write_stream(svn_checksum_t **checksum,
+ unsigned char *digest,
+ svn_stream_t *inner_stream,
+ svn_checksum_kind_t kind,
+ apr_pool_t *pool)
+{
+ svn_stream_t *outer_stream;
+
+ stream_baton_t *baton = apr_pcalloc(pool, sizeof(*baton));
+ baton->inner_stream = inner_stream;
+ baton->context = svn_checksum_ctx_create(kind, pool);
+ baton->checksum = checksum;
+ baton->digest = digest;
+ baton->pool = pool;
+
+ outer_stream = svn_stream_create(baton, pool);
+ svn_stream_set_write(outer_stream, write_handler);
+ svn_stream_set_close(outer_stream, close_handler);
+
+ return outer_stream;
+}
+
+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 wrap_write_stream(checksum, NULL, inner_stream, kind, pool);
+}
+
+/* Implement svn_close_fn_t.
+ * For FNV-1a-like checksums, we want the checksum as 32 bit integer instead
+ * of a big endian 4 byte sequence. This simply wraps close_handler adding
+ * the digest conversion.
+ */
+static svn_error_t *
+close_handler_fnv1a_32x4(void *baton)
+{
+ stream_baton_t *b = baton;
+ SVN_ERR(close_handler(baton));
+
+ *(apr_uint32_t *)b->digest = ntohl(*(apr_uint32_t *)b->digest);
+ return SVN_NO_ERROR;
+}
+
+svn_stream_t *
+svn_checksum__wrap_write_stream_fnv1a_32x4(apr_uint32_t *digest,
+ svn_stream_t *inner_stream,
+ apr_pool_t *pool)
+{
+ svn_stream_t *result
+ = wrap_write_stream(NULL, (unsigned char *)digest, inner_stream,
+ svn_checksum_fnv1a_32x4, pool);
+ svn_stream_set_close(result, close_handler_fnv1a_32x4);
+
+ return result;
+}
diff --git a/subversion/libsvn_subr/md5.h b/subversion/libsvn_subr/checksum.h
index 0d83539..2a03cdf 100644
--- a/subversion/libsvn_subr/md5.h
+++ b/subversion/libsvn_subr/checksum.h
@@ -1,5 +1,5 @@
/*
- * md5.h: Converting and comparing MD5 checksums
+ * checksum.h: Converting and comparing checksums
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -21,12 +21,12 @@
* ====================================================================
*/
-#ifndef SVN_LIBSVN_SUBR_MD5_H
-#define SVN_LIBSVN_SUBR_MD5_H
+#ifndef SVN_LIBSVN_SUBR_CHECKSUM_H
+#define SVN_LIBSVN_SUBR_CHECKSUM_H
#include <apr_pools.h>
-#include "svn_types.h"
+#include "svn_checksum.h"
#ifdef __cplusplus
extern "C" {
@@ -34,38 +34,41 @@ extern "C" {
-/* The MD5 digest for the empty string. */
+/* The digest of the given KIND for the empty string. */
const unsigned char *
-svn_md5__empty_string_digest(void);
+svn__empty_string_digest(svn_checksum_kind_t kind);
/* Return the hex representation of DIGEST, which must be
- * APR_MD5_DIGESTSIZE bytes long, allocating the string in POOL.
+ * DIGEST_SIZE bytes long, allocating the string in POOL.
*/
const char *
-svn_md5__digest_to_cstring_display(const unsigned char digest[],
- apr_pool_t *pool);
+svn__digest_to_cstring_display(const unsigned char digest[],
+ apr_size_t digest_size,
+ apr_pool_t *pool);
/* Return the hex representation of DIGEST, which must be
- * APR_MD5_DIGESTSIZE bytes long, allocating the string in POOL.
+ * DIGEST_SIZE bytes long, allocating the string in POOL.
* If DIGEST is all zeros, then return NULL.
*/
const char *
-svn_md5__digest_to_cstring(const unsigned char digest[],
- apr_pool_t *pool);
+svn__digest_to_cstring(const unsigned char digest[],
+ apr_size_t digest_size,
+ apr_pool_t *pool);
-/** Compare digests D1 and D2, each APR_MD5_DIGESTSIZE bytes long.
+/* Compare digests D1 and D2, each DIGEST_SIZE bytes long.
* If neither is all zeros, and they do not match, then return FALSE;
* else return TRUE.
*/
svn_boolean_t
-svn_md5__digests_match(const unsigned char d1[],
- const unsigned char d2[]);
+svn__digests_match(const unsigned char d1[],
+ const unsigned char d2[],
+ apr_size_t digest_size);
#ifdef __cplusplus
}
#endif /* __cplusplus */
-#endif /* SVN_LIBSVN_SUBR_MD5_H */
+#endif /* SVN_LIBSVN_SUBR_CHECKSUM_H */
diff --git a/subversion/libsvn_subr/cmdline.c b/subversion/libsvn_subr/cmdline.c
index 89d1ff3..9e97bf7 100644
--- a/subversion/libsvn_subr/cmdline.c
+++ b/subversion/libsvn_subr/cmdline.c
@@ -34,6 +34,7 @@
#else
#include <crtdbg.h>
#include <io.h>
+#include <conio.h>
#endif
#include <apr.h> /* for STDIN_FILENO */
@@ -62,17 +63,32 @@
#include "private/svn_cmdline_private.h"
#include "private/svn_utf_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_string_private.h"
#include "svn_private_config.h"
#include "win32_crashrpt.h"
+#if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER < 1400)
+/* Before Visual Studio 2005, the C runtime didn't handle encodings for the
+ for the stdio output handling. */
+#define CMDLINE_USE_CUSTOM_ENCODING
+
/* The stdin encoding. If null, it's the same as the native encoding. */
static const char *input_encoding = NULL;
/* The stdout encoding. If null, it's the same as the native encoding. */
static const char *output_encoding = NULL;
+#elif defined(WIN32) && defined(_MSC_VER)
+/* For now limit this code to Visual C++, as the result is highly dependent
+ on the CRT implementation */
+#define USE_WIN32_CONSOLE_SHORTCUT
+
+/* When TRUE, stdout/stderr is directly connected to a console */
+static svn_boolean_t shortcut_stdout_to_console = FALSE;
+static svn_boolean_t shortcut_stderr_to_console = FALSE;
+#endif
int
@@ -114,7 +130,7 @@ svn_cmdline_init(const char *progname, FILE *error_stream)
#endif
#ifdef WIN32
-#if _MSC_VER < 1400
+#ifdef CMDLINE_USE_CUSTOM_ENCODING
/* Initialize the input and output encodings. */
{
static char input_encoding_buffer[16];
@@ -128,33 +144,35 @@ svn_cmdline_init(const char *progname, FILE *error_stream)
"CP%u", (unsigned) GetConsoleOutputCP());
output_encoding = output_encoding_buffer;
}
-#endif /* _MSC_VER < 1400 */
+#endif /* CMDLINE_USE_CUSTOM_ENCODING */
#ifdef SVN_USE_WIN32_CRASHHANDLER
- /* Attach (but don't load) the crash handler */
- SetUnhandledExceptionFilter(svn__unhandled_exception_filter);
+ if (!getenv("SVN_CMDLINE_DISABLE_CRASH_HANDLER"))
+ {
+ /* Attach (but don't load) the crash handler */
+ SetUnhandledExceptionFilter(svn__unhandled_exception_filter);
#if _MSC_VER >= 1400
- /* ### This should work for VC++ 2002 (=1300) and later */
- /* Show the abort message on STDERR instead of a dialog to allow
- scripts (e.g. our testsuite) to continue after an abort without
- user intervention. Allow overriding for easier debugging. */
- if (!getenv("SVN_CMDLINE_USE_DIALOG_FOR_ABORT"))
- {
- /* In release mode: Redirect abort() errors to stderr */
- _set_error_mode(_OUT_TO_STDERR);
-
- /* In _DEBUG mode: Redirect all debug output (E.g. assert() to stderr.
- (Ignored in release builds) */
- _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR);
- _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR);
- _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR);
- _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
- _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
- _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
- }
+ /* ### This should work for VC++ 2002 (=1300) and later */
+ /* Show the abort message on STDERR instead of a dialog to allow
+ scripts (e.g. our testsuite) to continue after an abort without
+ user intervention. Allow overriding for easier debugging. */
+ if (!getenv("SVN_CMDLINE_USE_DIALOG_FOR_ABORT"))
+ {
+ /* In release mode: Redirect abort() errors to stderr */
+ _set_error_mode(_OUT_TO_STDERR);
+
+ /* In _DEBUG mode: Redirect all debug output (E.g. assert() to stderr.
+ (Ignored in release builds) */
+ _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR);
+ _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR);
+ _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR);
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ }
#endif /* _MSC_VER >= 1400 */
-
+ }
#endif /* SVN_USE_WIN32_CRASHHANDLER */
#endif /* WIN32 */
@@ -247,6 +265,31 @@ svn_cmdline_init(const char *progname, FILE *error_stream)
return EXIT_FAILURE;
}
+#ifdef USE_WIN32_CONSOLE_SHORTCUT
+ if (_isatty(STDOUT_FILENO))
+ {
+ DWORD ignored;
+ HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ /* stdout is a char device handle, but is it the console? */
+ if (GetConsoleMode(stdout_handle, &ignored))
+ shortcut_stdout_to_console = TRUE;
+
+ /* Don't close stdout_handle */
+ }
+ if (_isatty(STDERR_FILENO))
+ {
+ DWORD ignored;
+ HANDLE stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
+
+ /* stderr is a char device handle, but is it the console? */
+ if (GetConsoleMode(stderr_handle, &ignored))
+ shortcut_stderr_to_console = TRUE;
+
+ /* Don't close stderr_handle */
+ }
+#endif
+
return EXIT_SUCCESS;
}
@@ -256,10 +299,12 @@ svn_cmdline_cstring_from_utf8(const char **dest,
const char *src,
apr_pool_t *pool)
{
- if (output_encoding == NULL)
- return svn_utf_cstring_from_utf8(dest, src, pool);
- else
+#ifdef CMDLINE_USE_CUSTOM_ENCODING
+ if (output_encoding != NULL)
return svn_utf_cstring_from_utf8_ex2(dest, src, output_encoding, pool);
+#endif
+
+ return svn_utf_cstring_from_utf8(dest, src, pool);
}
@@ -277,10 +322,12 @@ svn_cmdline_cstring_to_utf8(const char **dest,
const char *src,
apr_pool_t *pool)
{
- if (input_encoding == NULL)
- return svn_utf_cstring_to_utf8(dest, src, pool);
- else
+#ifdef CMDLINE_USE_CUSTOM_ENCODING
+ if (input_encoding != NULL)
return svn_utf_cstring_to_utf8_ex2(dest, src, input_encoding, pool);
+#endif
+
+ return svn_utf_cstring_to_utf8(dest, src, pool);
}
@@ -336,6 +383,45 @@ svn_cmdline_fputs(const char *string, FILE* stream, apr_pool_t *pool)
svn_error_t *err;
const char *out;
+#ifdef USE_WIN32_CONSOLE_SHORTCUT
+ /* For legacy reasons the Visual C++ runtime converts output to the console
+ from the native 'ansi' encoding, to unicode, then back to 'ansi' and then
+ onwards to the console which is implemented as unicode.
+
+ For operations like 'svn status -v' this may cause about 70% of the total
+ processing time, with absolutely no gain.
+
+ For this specific scenario this shortcut exists. It has the nice side
+ effect of allowing full unicode output to the console.
+
+ Note that this shortcut is not used when the output is redirected, as in
+ that case the data is put on the pipe/file after the first conversion to
+ ansi. In this case the most expensive conversion is already avoided.
+ */
+ if ((stream == stdout && shortcut_stdout_to_console)
+ || (stream == stderr && shortcut_stderr_to_console))
+ {
+ WCHAR *result;
+
+ if (string[0] == '\0')
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_cmdline_fflush(stream)); /* Flush existing output */
+
+ SVN_ERR(svn_utf__win32_utf8_to_utf16(&result, string, NULL, pool));
+
+ if (_cputws(result))
+ {
+ if (apr_get_os_error())
+ {
+ return svn_error_wrap_apr(apr_get_os_error(), _("Write error"));
+ }
+ }
+
+ return SVN_NO_ERROR;
+ }
+#endif
+
err = svn_cmdline_cstring_from_utf8(&out, string, pool);
if (err)
@@ -393,10 +479,12 @@ svn_cmdline_fflush(FILE *stream)
const char *svn_cmdline_output_encoding(apr_pool_t *pool)
{
+#ifdef CMDLINE_USE_CUSTOM_ENCODING
if (output_encoding)
return apr_pstrdup(pool, output_encoding);
- else
- return SVN_APR_LOCALE_CHARSET;
+#endif
+
+ return SVN_APR_LOCALE_CHARSET;
}
int
@@ -419,31 +507,51 @@ svn_cmdline_handle_exit_error(svn_error_t *err,
return EXIT_FAILURE;
}
+struct trust_server_cert_non_interactive_baton {
+ 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;
+};
+
/* This implements 'svn_auth_ssl_server_trust_prompt_func_t'.
Don't actually prompt. Instead, set *CRED_P to valid credentials
- iff FAILURES is empty or is exactly SVN_AUTH_SSL_UNKNOWNCA. If
- there are any other failure bits, then set *CRED_P to null (that
- is, reject the cert).
+ iff FAILURES is empty or may be accepted according to the flags
+ in BATON. If there are any other failure bits, then set *CRED_P
+ to null (that is, reject the cert).
Ignore MAY_SAVE; we don't save certs we never prompted for.
- Ignore BATON, REALM, and CERT_INFO,
+ Ignore REALM and CERT_INFO,
Ignore any further films by George Lucas. */
static svn_error_t *
-ssl_trust_unknown_server_cert
- (svn_auth_cred_ssl_server_trust_t **cred_p,
- void *baton,
- const char *realm,
- apr_uint32_t failures,
- const svn_auth_ssl_server_cert_info_t *cert_info,
- svn_boolean_t may_save,
- apr_pool_t *pool)
+trust_server_cert_non_interactive(svn_auth_cred_ssl_server_trust_t **cred_p,
+ void *baton,
+ const char *realm,
+ apr_uint32_t failures,
+ const svn_auth_ssl_server_cert_info_t
+ *cert_info,
+ svn_boolean_t may_save,
+ apr_pool_t *pool)
{
+ struct trust_server_cert_non_interactive_baton *b = baton;
+ apr_uint32_t non_ignored_failures;
*cred_p = NULL;
- if (failures == 0 || failures == SVN_AUTH_SSL_UNKNOWNCA)
+ /* Mask away bits we are instructed to ignore. */
+ non_ignored_failures = failures & ~(
+ (b->trust_server_cert_unknown_ca ? SVN_AUTH_SSL_UNKNOWNCA : 0)
+ | (b->trust_server_cert_cn_mismatch ? SVN_AUTH_SSL_CNMISMATCH : 0)
+ | (b->trust_server_cert_expired ? SVN_AUTH_SSL_EXPIRED : 0)
+ | (b->trust_server_cert_not_yet_valid ? SVN_AUTH_SSL_NOTYETVALID : 0)
+ | (b->trust_server_cert_other_failure ? SVN_AUTH_SSL_OTHER : 0)
+ );
+
+ /* If no failures remain, accept the certificate. */
+ if (non_ignored_failures == 0)
{
*cred_p = apr_pcalloc(pool, sizeof(**cred_p));
(*cred_p)->may_save = FALSE;
@@ -454,17 +562,22 @@ ssl_trust_unknown_server_cert
}
svn_error_t *
-svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
- svn_boolean_t non_interactive,
- const char *auth_username,
- const char *auth_password,
- const char *config_dir,
- svn_boolean_t no_auth_cache,
- svn_boolean_t trust_server_cert,
- svn_config_t *cfg,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
+svn_cmdline_create_auth_baton2(svn_auth_baton_t **ab,
+ svn_boolean_t non_interactive,
+ const char *auth_username,
+ const char *auth_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)
+
{
svn_boolean_t store_password_val = TRUE;
svn_boolean_t store_auth_creds_val = TRUE;
@@ -505,24 +618,6 @@ svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
svn_auth_get_username_provider(&provider, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
- /* The windows ssl server certificate CRYPTOAPI provider. */
- SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
- "windows",
- "ssl_server_trust",
- pool));
-
- if (provider)
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
- /* The windows ssl authority certificate CRYPTOAPI provider. */
- SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
- "windows",
- "ssl_server_authority",
- pool));
-
- if (provider)
- APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
-
svn_auth_get_ssl_server_trust_file_provider(&provider, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
svn_auth_get_ssl_client_cert_file_provider(&provider, pool);
@@ -583,11 +678,22 @@ svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
}
}
- else if (trust_server_cert)
+ else if (trust_server_cert_unknown_ca || trust_server_cert_cn_mismatch ||
+ trust_server_cert_expired || trust_server_cert_not_yet_valid ||
+ trust_server_cert_other_failure)
{
+ struct trust_server_cert_non_interactive_baton *b;
+
+ b = apr_palloc(pool, sizeof(*b));
+ b->trust_server_cert_unknown_ca = trust_server_cert_unknown_ca;
+ b->trust_server_cert_cn_mismatch = trust_server_cert_cn_mismatch;
+ b->trust_server_cert_expired = trust_server_cert_expired;
+ b->trust_server_cert_not_yet_valid = trust_server_cert_not_yet_valid;
+ b->trust_server_cert_other_failure = trust_server_cert_other_failure;
+
/* Remember, only register this provider if non_interactive. */
svn_auth_get_ssl_server_trust_prompt_provider
- (&provider, ssl_trust_unknown_server_cert, NULL, pool);
+ (&provider, trust_server_cert_non_interactive, b, pool);
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
}
@@ -689,12 +795,12 @@ svn_cmdline__print_xml_prop(svn_stringbuf_t **outstr,
outstr, pool, svn_xml_protect_pcdata,
inherited_prop ? "inherited_property" : "property",
"name", propname,
- "encoding", encoding, NULL);
+ "encoding", encoding, SVN_VA_NULL);
else
svn_xml_make_open_tag(
outstr, pool, svn_xml_protect_pcdata,
inherited_prop ? "inherited_property" : "property",
- "name", propname, NULL);
+ "name", propname, SVN_VA_NULL);
svn_stringbuf_appendcstr(*outstr, xml_safe);
@@ -705,9 +811,124 @@ svn_cmdline__print_xml_prop(svn_stringbuf_t **outstr,
return;
}
+/* Return the most similar string to NEEDLE in HAYSTACK, which contains
+ * HAYSTACK_LEN elements. Return NULL if no string is sufficiently similar.
+ */
+/* See svn_cl__similarity_check() for a more general solution. */
+static const char *
+most_similar(const char *needle_cstr,
+ const char **haystack,
+ apr_size_t haystack_len,
+ apr_pool_t *scratch_pool)
+{
+ const char *max_similar;
+ apr_size_t max_score = 0;
+ apr_size_t i;
+ svn_membuf_t membuf;
+ svn_string_t *needle_str = svn_string_create(needle_cstr, scratch_pool);
+
+ svn_membuf__create(&membuf, 64, scratch_pool);
+
+ for (i = 0; i < haystack_len; i++)
+ {
+ apr_size_t score;
+ svn_string_t *hay = svn_string_create(haystack[i], scratch_pool);
+
+ score = svn_string__similarity(needle_str, hay, &membuf, NULL);
+
+ /* If you update this factor, consider updating
+ * svn_cl__similarity_check(). */
+ if (score >= (2 * SVN_STRING__SIM_RANGE_MAX + 1) / 3
+ && score > max_score)
+ {
+ max_score = score;
+ max_similar = haystack[i];
+ }
+ }
+
+ if (max_score)
+ return max_similar;
+ else
+ return NULL;
+}
+
+/* Verify that NEEDLE is in HAYSTACK, which contains HAYSTACK_LEN elements. */
+static svn_error_t *
+string_in_array(const char *needle,
+ const char **haystack,
+ apr_size_t haystack_len,
+ apr_pool_t *scratch_pool)
+{
+ const char *next_of_kin;
+ apr_size_t i;
+ for (i = 0; i < haystack_len; i++)
+ {
+ if (!strcmp(needle, haystack[i]))
+ return SVN_NO_ERROR;
+ }
+
+ /* Error. */
+ next_of_kin = most_similar(needle, haystack, haystack_len, scratch_pool);
+ if (next_of_kin)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Ignoring unknown value '%s'; "
+ "did you mean '%s'?"),
+ needle, next_of_kin);
+ else
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Ignoring unknown value '%s'"),
+ needle);
+}
+
+#include "config_keys.inc"
+
+/* Validate the FILE, SECTION, and OPTION components of CONFIG_OPTION are
+ * known. Warn to stderr if not. (An unknown value may be either a typo
+ * or added in a newer minor version of Subversion.) */
+static svn_error_t *
+validate_config_option(svn_cmdline__config_argument_t *config_option,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t arbitrary_keys = FALSE;
+
+ /* TODO: some day, we could also verify that OPTION is valid for SECTION;
+ i.e., forbid invalid combinations such as config:auth:diff-extensions. */
+
+#define ARRAYLEN(x) ( sizeof((x)) / sizeof((x)[0]) )
+
+ SVN_ERR(string_in_array(config_option->file, svn__valid_config_files,
+ ARRAYLEN(svn__valid_config_files),
+ scratch_pool));
+ SVN_ERR(string_in_array(config_option->section, svn__valid_config_sections,
+ ARRAYLEN(svn__valid_config_sections),
+ scratch_pool));
+
+ /* Don't validate option names for sections such as servers[group],
+ * config[tunnels], and config[auto-props] that permit arbitrary options. */
+ {
+ int i;
+
+ for (i = 0; i < ARRAYLEN(svn__empty_config_sections); i++)
+ {
+ if (!strcmp(config_option->section, svn__empty_config_sections[i]))
+ arbitrary_keys = TRUE;
+ }
+ }
+
+ if (! arbitrary_keys)
+ SVN_ERR(string_in_array(config_option->option, svn__valid_config_options,
+ ARRAYLEN(svn__valid_config_options),
+ scratch_pool));
+
+#undef ARRAYLEN
+
+ return SVN_NO_ERROR;
+}
+
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)
{
svn_cmdline__config_argument_t *config_option;
@@ -721,6 +942,8 @@ svn_cmdline__parse_config_option(apr_array_header_t *config_options,
if ((equals_sign = strchr(second_colon + 1, '=')) &&
(equals_sign != second_colon + 1))
{
+ svn_error_t *warning;
+
config_option = apr_pcalloc(pool, sizeof(*config_option));
config_option->file = apr_pstrndup(pool, opt_arg,
first_colon - opt_arg);
@@ -729,6 +952,13 @@ svn_cmdline__parse_config_option(apr_array_header_t *config_options,
config_option->option = apr_pstrndup(pool, second_colon + 1,
equals_sign - second_colon - 1);
+ warning = validate_config_option(config_option, pool);
+ if (warning)
+ {
+ svn_handle_warning2(stderr, warning, prefix);
+ svn_error_clear(warning);
+ }
+
if (! (strchr(config_option->option, ':')))
{
config_option->value = apr_pstrndup(pool, equals_sign + 1,
@@ -920,7 +1150,7 @@ svn_cmdline__print_xml_prop_hash(svn_stringbuf_t **outstr,
svn_xml_make_open_tag(
outstr, pool, svn_xml_self_closing,
inherited_props ? "inherited_property" : "property",
- "name", pname, NULL);
+ "name", pname, SVN_VA_NULL);
}
else
{
@@ -1275,7 +1505,7 @@ svn_cmdline__edit_string_externally(svn_string_t **edited_contents /* UTF-8! */,
/* Translate back to UTF8/LF if desired. */
if (as_text)
{
- err = svn_subst_translate_string2(edited_contents, FALSE, FALSE,
+ err = svn_subst_translate_string2(edited_contents, NULL, NULL,
*edited_contents, encoding, FALSE,
pool, pool);
if (err)
@@ -1319,3 +1549,50 @@ svn_cmdline__edit_string_externally(svn_string_t **edited_contents /* UTF-8! */,
return svn_error_trace(err);
}
+
+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)
+{
+ apr_array_header_t *failures;
+ int i;
+
+ *trust_server_cert_unknown_ca = FALSE;
+ *trust_server_cert_cn_mismatch = FALSE;
+ *trust_server_cert_expired = FALSE;
+ *trust_server_cert_not_yet_valid = FALSE;
+ *trust_server_cert_other_failure = FALSE;
+
+ failures = svn_cstring_split(opt_arg, ", \n\r\t\v", TRUE, scratch_pool);
+
+ for (i = 0; i < failures->nelts; i++)
+ {
+ const char *value = APR_ARRAY_IDX(failures, i, const char *);
+ if (!strcmp(value, "unknown-ca"))
+ *trust_server_cert_unknown_ca = TRUE;
+ else if (!strcmp(value, "cn-mismatch"))
+ *trust_server_cert_cn_mismatch = TRUE;
+ else if (!strcmp(value, "expired"))
+ *trust_server_cert_expired = TRUE;
+ else if (!strcmp(value, "not-yet-valid"))
+ *trust_server_cert_not_yet_valid = TRUE;
+ else if (!strcmp(value, "other"))
+ *trust_server_cert_other_failure = TRUE;
+ else
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Unknown value '%s' for %s.\n"
+ "Supported values: %s"),
+ value,
+ "--trust-server-cert-failures",
+ "unknown-ca, cn-mismatch, expired, "
+ "not-yet-valid, other");
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_subr/compat.c b/subversion/libsvn_subr/compat.c
index 2089828..964361e 100644
--- a/subversion/libsvn_subr/compat.c
+++ b/subversion/libsvn_subr/compat.c
@@ -95,23 +95,33 @@ svn_compat_log_revprops_in(apr_pool_t *pool)
}
void
-svn_compat_log_revprops_out(const char **author, const char **date,
- const char **message, apr_hash_t *revprops)
+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)
{
- svn_string_t *author_s, *date_s, *message_s;
-
*author = *date = *message = NULL;
if (revprops)
{
- if ((author_s = svn_hash_gets(revprops, SVN_PROP_REVISION_AUTHOR)))
- *author = author_s->data;
- if ((date_s = svn_hash_gets(revprops, SVN_PROP_REVISION_DATE)))
- *date = date_s->data;
- if ((message_s = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG)))
- *message = message_s->data;
+ *author = svn_hash_gets(revprops, SVN_PROP_REVISION_AUTHOR);
+ *date = svn_hash_gets(revprops, SVN_PROP_REVISION_DATE);
+ *message = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG);
}
}
+void
+svn_compat_log_revprops_out(const char **author, const char **date,
+ const char **message, apr_hash_t *revprops)
+{
+ const svn_string_t *author_s, *date_s, *message_s;
+ svn_compat_log_revprops_out_string(&author_s, &date_s, &message_s,
+ revprops);
+
+ *author = author_s ? author_s->data : NULL;
+ *date = date_s ? date_s->data : NULL;
+ *message = message_s ? message_s->data : NULL;
+}
+
/* Baton for use with svn_compat_wrap_log_receiver */
struct log_wrapper_baton {
void *baton;
diff --git a/subversion/libsvn_subr/compress.c b/subversion/libsvn_subr/compress.c
new file mode 100644
index 0000000..004e443
--- /dev/null
+++ b/subversion/libsvn_subr/compress.c
@@ -0,0 +1,257 @@
+/*
+ * compress.c: various data compression routines
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+#include <string.h>
+#include <assert.h>
+#include <zlib.h>
+
+#include "private/svn_subr_private.h"
+#include "private/svn_error_private.h"
+
+#include "svn_private_config.h"
+
+const char *
+svn_zlib__compiled_version(void)
+{
+ static const char zlib_version_str[] = ZLIB_VERSION;
+
+ return zlib_version_str;
+}
+
+const char *
+svn_zlib__runtime_version(void)
+{
+ return zlibVersion();
+}
+
+
+/* The zlib compressBound function was not exported until 1.2.0. */
+#if ZLIB_VERNUM >= 0x1200
+#define svnCompressBound(LEN) compressBound(LEN)
+#else
+#define svnCompressBound(LEN) ((LEN) + ((LEN) >> 12) + ((LEN) >> 14) + 11)
+#endif
+
+/* For svndiff1, address/instruction/new data under this size will not
+ be compressed using zlib as a secondary compressor. */
+#define MIN_COMPRESS_SIZE 512
+
+unsigned char *
+svn__encode_uint(unsigned char *p, apr_uint64_t val)
+{
+ int n;
+ apr_uint64_t v;
+
+ /* Figure out how many bytes we'll need. */
+ v = val >> 7;
+ n = 1;
+ while (v > 0)
+ {
+ v = v >> 7;
+ n++;
+ }
+
+ /* Encode the remaining bytes; n is always the number of bytes
+ coming after the one we're encoding. */
+ while (--n >= 1)
+ *p++ = (unsigned char)(((val >> (n * 7)) | 0x80) & 0xff);
+
+ *p++ = (unsigned char)(val & 0x7f);
+
+ return p;
+}
+
+const unsigned char *
+svn__decode_uint(apr_uint64_t *val,
+ const unsigned char *p,
+ const unsigned char *end)
+{
+ apr_uint64_t temp = 0;
+
+ if (p + SVN__MAX_ENCODED_UINT_LEN < end)
+ end = p + SVN__MAX_ENCODED_UINT_LEN;
+
+ /* Decode bytes until we're done. */
+ while (SVN__PREDICT_TRUE(p < end))
+ {
+ unsigned int c = *p++;
+
+ if (c < 0x80)
+ {
+ *val = (temp << 7) | c;
+ return p;
+ }
+ else
+ {
+ temp = (temp << 7) | (c & 0x7f);
+ }
+ }
+
+ return NULL;
+}
+
+/* If IN is a string that is >= MIN_COMPRESS_SIZE and the COMPRESSION_LEVEL
+ is not SVN_DELTA_COMPRESSION_LEVEL_NONE, zlib compress it and places the
+ result in OUT, with an integer prepended specifying the original size.
+ If IN is < MIN_COMPRESS_SIZE, or if the compressed version of IN was no
+ smaller than the original IN, OUT will be a copy of IN with the size
+ prepended as an integer. */
+static svn_error_t *
+zlib_encode(const char *data,
+ apr_size_t len,
+ svn_stringbuf_t *out,
+ int compression_level)
+{
+ unsigned long endlen;
+ apr_size_t intlen;
+ unsigned char buf[SVN__MAX_ENCODED_UINT_LEN], *p;
+
+ svn_stringbuf_setempty(out);
+ p = svn__encode_uint(buf, (apr_uint64_t)len);
+ svn_stringbuf_appendbytes(out, (const char *)buf, p - buf);
+
+ intlen = out->len;
+
+ /* Compression initialization overhead is considered to large for
+ short buffers. Also, if we don't actually want to compress data,
+ ZLIB will produce an output no shorter than the input. Hence,
+ the DATA would directly appended to OUT, so we can do that directly
+ without calling ZLIB before. */
+ if (len < MIN_COMPRESS_SIZE || compression_level == SVN__COMPRESSION_NONE)
+ {
+ svn_stringbuf_appendbytes(out, data, len);
+ }
+ else
+ {
+ int zerr;
+
+ svn_stringbuf_ensure(out, svnCompressBound(len) + intlen);
+ endlen = out->blocksize;
+
+ zerr = compress2((unsigned char *)out->data + intlen, &endlen,
+ (const unsigned char *)data, len,
+ compression_level);
+ if (zerr != Z_OK)
+ return svn_error_trace(svn_error__wrap_zlib(
+ zerr, "compress2",
+ _("Compression of svndiff data failed")));
+
+ /* Compression didn't help :(, just append the original text */
+ if (endlen >= len)
+ {
+ svn_stringbuf_appendbytes(out, data, len);
+ return SVN_NO_ERROR;
+ }
+ out->len = endlen + intlen;
+ out->data[out->len] = 0;
+ }
+ return SVN_NO_ERROR;
+}
+
+/* Decode the possibly-zlib compressed string of length INLEN that is in
+ IN, into OUT. We expect an integer is prepended to IN that specifies
+ the original size, and that if encoded size == original size, that the
+ remaining data is not compressed.
+ In that case, we will simply return pointer into IN as data pointer for
+ OUT, COPYLESS_ALLOWED has been set. The, the caller is expected not to
+ modify the contents of OUT.
+ An error is returned if the decoded length exceeds the given LIMIT.
+ */
+static svn_error_t *
+zlib_decode(const unsigned char *in, apr_size_t inLen, svn_stringbuf_t *out,
+ apr_size_t limit)
+{
+ apr_size_t len;
+ apr_uint64_t size;
+ const unsigned char *oldplace = in;
+
+ /* First thing in the string is the original length. */
+ in = svn__decode_uint(&size, in, in + inLen);
+ len = (apr_size_t)size;
+ if (in == NULL || len != size)
+ return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA, NULL,
+ _("Decompression of zlib compressed data failed: no size"));
+ if (len > limit)
+ return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA, NULL,
+ _("Decompression of zlib compressed data failed: "
+ "size too large"));
+
+ /* We need to subtract the size of the encoded original length off the
+ * still remaining input length. */
+ inLen -= (in - oldplace);
+ if (inLen == len)
+ {
+ svn_stringbuf_ensure(out, len);
+ memcpy(out->data, in, len);
+ out->data[len] = 0;
+ out->len = len;
+
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ unsigned long zlen = len;
+ int zerr;
+
+ svn_stringbuf_ensure(out, len);
+ zerr = uncompress((unsigned char *)out->data, &zlen, in, inLen);
+ if (zerr != Z_OK)
+ return svn_error_trace(svn_error__wrap_zlib(
+ zerr, "uncompress",
+ _("Decompression of svndiff data failed")));
+
+ /* Zlib should not produce something that has a different size than the
+ original length we stored. */
+ if (zlen != len)
+ return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA,
+ NULL,
+ _("Size of uncompressed data "
+ "does not match stored original length"));
+ out->data[zlen] = 0;
+ out->len = zlen;
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn__compress(svn_stringbuf_t *in,
+ svn_stringbuf_t *out,
+ int compression_method)
+{
+ if ( compression_method < SVN__COMPRESSION_NONE
+ || compression_method > SVN__COMPRESSION_ZLIB_MAX)
+ return svn_error_createf(SVN_ERR_BAD_COMPRESSION_METHOD, NULL,
+ _("Unsupported compression method %d"),
+ compression_method);
+
+ return zlib_encode(in->data, in->len, out, compression_method);
+}
+
+svn_error_t *
+svn__decompress(svn_stringbuf_t *in,
+ svn_stringbuf_t *out,
+ apr_size_t limit)
+{
+ return zlib_decode((const unsigned char*)in->data, in->len, out, limit);
+}
diff --git a/subversion/libsvn_subr/config.c b/subversion/libsvn_subr/config.c
index cf97f0d..770d699 100644
--- a/subversion/libsvn_subr/config.c
+++ b/subversion/libsvn_subr/config.c
@@ -23,6 +23,8 @@
+#include <assert.h>
+
#define APR_WANT_STRFUNC
#define APR_WANT_MEMFUNC
#include <apr_want.h>
@@ -36,6 +38,7 @@
#include "svn_private_config.h"
#include "private/svn_dep_compat.h"
+#include "private/svn_subr_private.h"
@@ -92,6 +95,7 @@ svn_config_create2(svn_config_t **cfgp,
cfg->tmp_value = svn_stringbuf_create_empty(result_pool);
cfg->section_names_case_sensitive = section_names_case_sensitive;
cfg->option_names_case_sensitive = option_names_case_sensitive;
+ cfg->read_only = FALSE;
*cfgp = cfg;
return SVN_NO_ERROR;
@@ -188,7 +192,8 @@ read_all(svn_config_t **cfgp,
#ifdef WIN32
if (sys_registry_path)
{
- SVN_ERR(svn_config_read2(cfgp, sys_registry_path, FALSE, FALSE, pool));
+ SVN_ERR(svn_config_read3(cfgp, sys_registry_path, FALSE, FALSE, FALSE,
+ pool));
red_config = TRUE;
}
#endif /* WIN32 */
@@ -214,8 +219,8 @@ read_all(svn_config_t **cfgp,
SVN_ERR(svn_config_merge(*cfgp, usr_registry_path, FALSE));
else
{
- SVN_ERR(svn_config_read2(cfgp, usr_registry_path,
- FALSE, FALSE, pool));
+ SVN_ERR(svn_config_read3(cfgp, usr_registry_path,
+ FALSE, FALSE, FALSE, pool));
red_config = TRUE;
}
}
@@ -242,7 +247,7 @@ read_all(svn_config_t **cfgp,
/* CONFIG_DIR provides an override for the default behavior of reading
the default set of overlay files described by read_all()'s doc
- string. */
+ string. Returns non-NULL *CFG or an error. */
static svn_error_t *
get_category_config(svn_config_t **cfg,
const char *config_dir,
@@ -259,9 +264,9 @@ get_category_config(svn_config_t **cfg,
{
#ifdef WIN32
sys_reg_path = apr_pstrcat(pool, SVN_REGISTRY_SYS_CONFIG_PATH,
- category, NULL);
+ category, SVN_VA_NULL);
usr_reg_path = apr_pstrcat(pool, SVN_REGISTRY_USR_CONFIG_PATH,
- category, NULL);
+ category, SVN_VA_NULL);
#endif /* WIN32 */
err = svn_config__sys_config_path(&sys_cfg_path, category, pool);
@@ -291,19 +296,29 @@ svn_config_get_config(apr_hash_t **cfg_hash,
svn_config_t *cfg;
*cfg_hash = apr_hash_make(pool);
-#define CATLEN (sizeof(SVN_CONFIG_CATEGORY_SERVERS) - 1)
SVN_ERR(get_category_config(&cfg, config_dir, SVN_CONFIG_CATEGORY_SERVERS,
pool));
- if (cfg)
- apr_hash_set(*cfg_hash, SVN_CONFIG_CATEGORY_SERVERS, CATLEN, cfg);
-#undef CATLEN
+ svn_hash_sets(*cfg_hash, SVN_CONFIG_CATEGORY_SERVERS, cfg);
-#define CATLEN (sizeof(SVN_CONFIG_CATEGORY_CONFIG) - 1)
SVN_ERR(get_category_config(&cfg, config_dir, SVN_CONFIG_CATEGORY_CONFIG,
pool));
- if (cfg)
- apr_hash_set(*cfg_hash, SVN_CONFIG_CATEGORY_CONFIG, CATLEN, cfg);
-#undef CATLEN
+ svn_hash_sets(*cfg_hash, SVN_CONFIG_CATEGORY_CONFIG, cfg);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_config__get_default_config(apr_hash_t **cfg_hash,
+ apr_pool_t *pool)
+{
+ svn_config_t *empty_cfg;
+ *cfg_hash = apr_hash_make(pool);
+
+ SVN_ERR(svn_config_create2(&empty_cfg, FALSE, FALSE, pool));
+ svn_hash_sets(*cfg_hash, SVN_CONFIG_CATEGORY_CONFIG, empty_cfg);
+
+ SVN_ERR(svn_config_create2(&empty_cfg, FALSE, FALSE, pool));
+ svn_hash_sets(*cfg_hash, SVN_CONFIG_CATEGORY_SERVERS, empty_cfg);
return SVN_NO_ERROR;
}
@@ -415,6 +430,26 @@ make_hash_key(char *key)
return key;
}
+/* Return the value for KEY in HASH. If CASE_SENSITIVE is FALSE,
+ BUFFER will be used to construct the normalized hash key. */
+static void *
+get_hash_value(apr_hash_t *hash,
+ svn_stringbuf_t *buffer,
+ const char *key,
+ svn_boolean_t case_sensitive)
+{
+ apr_size_t i;
+ apr_size_t len = strlen(key);
+
+ if (case_sensitive)
+ return apr_hash_get(hash, key, len);
+
+ svn_stringbuf_ensure(buffer, len);
+ for (i = 0; i < len; ++i)
+ buffer->data[i] = (char)apr_tolower(key[i]);
+
+ return apr_hash_get(hash, buffer->data, len);
+}
/* Return a pointer to an option in CFG, or NULL if it doesn't exist.
if SECTIONP is non-null, return a pointer to the option's section.
@@ -423,30 +458,16 @@ static cfg_option_t *
find_option(svn_config_t *cfg, const char *section, const char *option,
cfg_section_t **sectionp)
{
- void *sec_ptr;
-
- /* Canonicalize the hash key */
- svn_stringbuf_set(cfg->tmp_key, section);
- if (! cfg->section_names_case_sensitive)
- make_hash_key(cfg->tmp_key->data);
-
- sec_ptr = apr_hash_get(cfg->sections, cfg->tmp_key->data,
- cfg->tmp_key->len);
+ void *sec_ptr = get_hash_value(cfg->sections, cfg->tmp_key, section,
+ cfg->section_names_case_sensitive);
if (sectionp != NULL)
*sectionp = sec_ptr;
if (sec_ptr != NULL && option != NULL)
{
cfg_section_t *sec = sec_ptr;
- cfg_option_t *opt;
-
- /* Canonicalize the option key */
- svn_stringbuf_set(cfg->tmp_key, option);
- if (! cfg->option_names_case_sensitive)
- make_hash_key(cfg->tmp_key->data);
-
- opt = apr_hash_get(sec->options, cfg->tmp_key->data,
- cfg->tmp_key->len);
+ cfg_option_t *opt = get_hash_value(sec->options, cfg->tmp_key, option,
+ cfg->option_names_case_sensitive);
/* NOTE: ConfigParser's sections are case sensitive. */
if (opt == NULL
&& apr_strnatcasecmp(section, SVN_CONFIG__DEFAULT_SECTION) != 0)
@@ -482,7 +503,13 @@ make_string_from_option(const char **valuep, svn_config_t *cfg,
*/
if (opt->value && strchr(opt->value, '%'))
{
- apr_pool_t *tmp_pool = (x_pool ? x_pool : svn_pool_create(cfg->x_pool));
+ apr_pool_t *tmp_pool;
+
+ /* setting read-only mode should have expanded all values
+ * automatically. */
+ assert(!cfg->read_only);
+
+ tmp_pool = (x_pool ? x_pool : svn_pool_create(cfg->x_pool));
expand_option_value(cfg, section, opt->value, &opt->x_value, tmp_pool);
opt->expanded = TRUE;
@@ -642,6 +669,33 @@ svn_config_create_option(cfg_option_t **opt,
*opt = o;
}
+svn_boolean_t
+svn_config__is_expanded(svn_config_t *cfg,
+ const char *section,
+ const char *option)
+{
+ cfg_option_t *opt;
+
+ if (cfg == NULL)
+ return FALSE;
+
+ /* does the option even exist? */
+ opt = find_option(cfg, section, option, NULL);
+ if (opt == NULL)
+ return FALSE;
+
+ /* already expanded? */
+ if (opt->expanded)
+ return TRUE;
+
+ /* needs expansion? */
+ if (opt->value && strchr(opt->value, '%'))
+ return FALSE;
+
+ /* no expansion necessary */
+ return TRUE;
+}
+
void
svn_config_get(svn_config_t *cfg, const char **valuep,
@@ -659,11 +713,11 @@ svn_config_get(svn_config_t *cfg, const char **valuep,
}
else
/* before attempting to expand an option, check for the placeholder.
- * If none is there, there is no point in calling expand_option_value.
+ * If there is none, there is no point in calling expand_option_value.
*/
if (default_value && strchr(default_value, '%'))
{
- apr_pool_t *tmp_pool = svn_pool_create(cfg->x_pool);
+ apr_pool_t *tmp_pool = svn_pool_create(cfg->pool);
const char *x_default;
expand_option_value(cfg, sec, default_value, &x_default, tmp_pool);
if (x_default)
@@ -686,6 +740,17 @@ svn_config_set(svn_config_t *cfg,
cfg_section_t *sec;
cfg_option_t *opt;
+ /* Ignore write attempts to r/o configurations.
+ *
+ * Since we should never try to modify r/o data, trigger an assertion
+ * in debug mode.
+ */
+#ifdef SVN_DEBUG
+ SVN_ERR_ASSERT_NO_RETURN(!cfg->read_only);
+#endif
+ if (cfg->read_only)
+ return;
+
remove_expansions(cfg);
opt = find_option(cfg, section, option, &sec);
@@ -930,7 +995,7 @@ svn_config_enumerate(svn_config_t *cfg, const char *section,
if (sec == NULL)
return 0;
- subpool = svn_pool_create(cfg->x_pool);
+ subpool = svn_pool_create(cfg->pool);
count = 0;
for (opt_ndx = apr_hash_first(subpool, sec->options);
opt_ndx != NULL;
@@ -1059,7 +1124,7 @@ svn_config_get_server_setting(svn_config_t *cfg,
svn_error_t *
svn_config_dup(svn_config_t **cfgp,
- svn_config_t *src,
+ const svn_config_t *src,
apr_pool_t *pool)
{
apr_hash_index_t *sectidx;
@@ -1197,13 +1262,6 @@ svn_config_get_server_setting_bool(svn_config_t *cfg,
svn_boolean_t
svn_config_has_section(svn_config_t *cfg, const char *section)
{
- cfg_section_t *sec;
-
- /* Canonicalize the hash key */
- svn_stringbuf_set(cfg->tmp_key, section);
- if (! cfg->section_names_case_sensitive)
- make_hash_key(cfg->tmp_key->data);
-
- sec = svn_hash_gets(cfg->sections, cfg->tmp_key->data);
- return sec != NULL;
+ return NULL != get_hash_value(cfg->sections, cfg->tmp_key, section,
+ cfg->section_names_case_sensitive);
}
diff --git a/subversion/libsvn_subr/config_auth.c b/subversion/libsvn_subr/config_auth.c
index ed26a58..90670f9 100644
--- a/subversion/libsvn_subr/config_auth.c
+++ b/subversion/libsvn_subr/config_auth.c
@@ -35,10 +35,6 @@
#include "private/svn_auth_private.h"
-/* Helper for svn_config_{read|write}_auth_data. Return a path to a
- file within ~/.subversion/auth/ that holds CRED_KIND credentials
- within REALMSTRING. If no path is available *PATH will be set to
- NULL. */
svn_error_t *
svn_auth__file_path(const char **path,
const char *cred_kind,
@@ -124,9 +120,8 @@ svn_config_write_auth_data(apr_hash_t *hash,
const char *config_dir,
apr_pool_t *pool)
{
- apr_file_t *authfile = NULL;
svn_stream_t *stream;
- const char *auth_path;
+ const char *auth_path, *tmp_path;
SVN_ERR(svn_auth__file_path(&auth_path, cred_kind, realmstring, config_dir,
pool));
@@ -135,25 +130,25 @@ svn_config_write_auth_data(apr_hash_t *hash,
_("Unable to locate auth file"));
/* Add the realmstring to the hash, so programs (or users) can
- verify exactly which set of credentials this file holds. */
+ verify exactly which set of credentials this file holds.
+ ### What if realmstring key is already in the hash? */
svn_hash_sets(hash, SVN_CONFIG_REALMSTRING_KEY,
svn_string_create(realmstring, pool));
- SVN_ERR_W(svn_io_file_open(&authfile, auth_path,
- (APR_WRITE | APR_CREATE | APR_TRUNCATE
- | APR_BUFFERED),
- APR_OS_DEFAULT, pool),
+ SVN_ERR_W(svn_stream_open_unique(&stream, &tmp_path,
+ svn_dirent_dirname(auth_path, pool),
+ svn_io_file_del_on_pool_cleanup,
+ pool, pool),
_("Unable to open auth file for writing"));
-
- stream = svn_stream_from_aprfile2(authfile, FALSE, pool);
SVN_ERR_W(svn_hash_write2(hash, stream, SVN_HASH_TERMINATOR, pool),
apr_psprintf(pool, _("Error writing hash to '%s'"),
svn_dirent_local_style(auth_path, pool)));
-
SVN_ERR(svn_stream_close(stream));
+ SVN_ERR(svn_io_file_rename(tmp_path, auth_path, pool));
/* To be nice, remove the realmstring from the hash again, just in
- case the caller wants their hash unchanged. */
+ case the caller wants their hash unchanged.
+ ### Should we also do this when a write error occurs? */
svn_hash_sets(hash, SVN_CONFIG_REALMSTRING_KEY, NULL);
return SVN_NO_ERROR;
@@ -213,7 +208,7 @@ svn_config_walk_auth_data(const char *config_dir,
itempool = svn_pool_create(iterpool);
for (hi = apr_hash_first(iterpool, nodes); hi; hi = apr_hash_next(hi))
{
- svn_io_dirent2_t *dirent = svn__apr_hash_index_val(hi);
+ svn_io_dirent2_t *dirent = apr_hash_this_val(hi);
svn_stream_t *stream;
apr_hash_t *creds_hash;
const svn_string_t *realm;
@@ -227,7 +222,7 @@ svn_config_walk_auth_data(const char *config_dir,
svn_pool_clear(itempool);
- item_path = svn_dirent_join(dir_path, svn__apr_hash_index_key(hi),
+ item_path = svn_dirent_join(dir_path, apr_hash_this_key(hi),
itempool);
err = svn_stream_open_readonly(&stream, item_path,
diff --git a/subversion/libsvn_subr/config_file.c b/subversion/libsvn_subr/config_file.c
index 9969b8e..e4a5936 100644
--- a/subversion/libsvn_subr/config_file.c
+++ b/subversion/libsvn_subr/config_file.c
@@ -30,6 +30,7 @@
#include "svn_types.h"
#include "svn_dirent_uri.h"
#include "svn_auth.h"
+#include "svn_hash.h"
#include "svn_subst.h"
#include "svn_utf.h"
#include "svn_pools.h"
@@ -37,6 +38,7 @@
#include "svn_ctype.h"
#include "svn_private_config.h"
+#include "private/svn_subr_private.h"
#ifdef __HAIKU__
# include <FindDirectory.h>
@@ -72,6 +74,9 @@ typedef struct parse_context_t
char parser_buffer[SVN__STREAM_CHUNK_SIZE]; /* Larger than most config files */
size_t buffer_pos; /* Current position within parser_buffer */
size_t buffer_size; /* parser_buffer contains this many bytes */
+
+ /* Non-zero if we hit EOF on the stream. */
+ svn_boolean_t hit_stream_eof;
} parse_context_t;
@@ -99,11 +104,15 @@ parser_getc(parse_context_t *ctx, int *c)
}
else
{
- ctx->buffer_pos = 0;
- ctx->buffer_size = sizeof(ctx->parser_buffer);
+ if (!ctx->hit_stream_eof)
+ {
+ ctx->buffer_pos = 0;
+ ctx->buffer_size = sizeof(ctx->parser_buffer);
- SVN_ERR(svn_stream_read(ctx->stream, ctx->parser_buffer,
- &(ctx->buffer_size)));
+ SVN_ERR(svn_stream_read_full(ctx->stream, ctx->parser_buffer,
+ &(ctx->buffer_size)));
+ ctx->hit_stream_eof = (ctx->buffer_size != sizeof(ctx->parser_buffer));
+ }
if (ctx->buffer_pos < ctx->buffer_size)
{
@@ -183,7 +192,25 @@ skip_to_eoln(parse_context_t *ctx, int *c)
SVN_ERR(parser_getc(ctx, &ch));
while (ch != '\n' && ch != EOF)
- SVN_ERR(parser_getc_plain(ctx, &ch));
+ {
+ /* This is much faster than checking individual bytes.
+ * We use this function a lot when skipping comment lines.
+ *
+ * This assumes that the ungetc buffer is empty, but that is a
+ * safe assumption right after reading a character (which would
+ * clear the buffer. */
+ const char *newline = memchr(ctx->parser_buffer + ctx->buffer_pos, '\n',
+ ctx->buffer_size - ctx->buffer_pos);
+ if (newline)
+ {
+ ch = '\n';
+ ctx->buffer_pos = newline - ctx->parser_buffer + 1;
+ break;
+ }
+
+ /* refill buffer, check for EOF */
+ SVN_ERR(parser_getc_plain(ctx, &ch));
+ }
*c = ch;
return SVN_NO_ERROR;
@@ -204,8 +231,10 @@ skip_bom(parse_context_t *ctx)
* of the BOM characters into the parse_context_t buffer. This can
* safely be assumed as long as we only try to use skip_bom() at the
* start of the stream and the buffer is longer than 3 characters. */
- SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1);
- if (buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
+ SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1 ||
+ ctx->hit_stream_eof);
+ if (ctx->buffer_size > ctx->buffer_pos + 1 &&
+ buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
ctx->buffer_pos += 2;
else
SVN_ERR(parser_ungetc(ctx, ch));
@@ -321,7 +350,7 @@ parse_option(int *pch, parse_context_t *ctx, apr_pool_t *scratch_pool)
{
ch = EOF;
err = svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Option must end with ':' or '='",
+ _("line %d: Option must end with ':' or '='"),
ctx->line);
}
else
@@ -364,7 +393,7 @@ parse_section_name(int *pch, parse_context_t *ctx,
{
ch = EOF;
err = svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Section header must end with ']'",
+ _("line %d: Section header must end with ']'"),
ctx->line);
}
else
@@ -392,9 +421,10 @@ svn_config__sys_config_path(const char **path_p,
#ifdef WIN32
{
const char *folder;
- SVN_ERR(svn_config__win_config_path(&folder, TRUE, pool));
+ SVN_ERR(svn_config__win_config_path(&folder, TRUE, pool, pool));
*path_p = svn_dirent_join_many(pool, folder,
- SVN_CONFIG__SUBDIRECTORY, fname, NULL);
+ SVN_CONFIG__SUBDIRECTORY, fname,
+ SVN_VA_NULL);
}
#elif defined(__HAIKU__)
@@ -407,30 +437,112 @@ svn_config__sys_config_path(const char **path_p,
return SVN_NO_ERROR;
*path_p = svn_dirent_join_many(pool, folder,
- SVN_CONFIG__SYS_DIRECTORY, fname, NULL);
+ SVN_CONFIG__SYS_DIRECTORY, fname,
+ SVN_VA_NULL);
}
#else /* ! WIN32 && !__HAIKU__ */
- *path_p = svn_dirent_join_many(pool, SVN_CONFIG__SYS_DIRECTORY, fname, NULL);
+ *path_p = svn_dirent_join_many(pool, SVN_CONFIG__SYS_DIRECTORY, fname,
+ SVN_VA_NULL);
#endif /* WIN32 */
return SVN_NO_ERROR;
}
+/* Callback for svn_config_enumerate2: Continue to next value. */
+static svn_boolean_t
+expand_value(const char *name,
+ const char *value,
+ void *baton,
+ apr_pool_t *pool)
+{
+ return TRUE;
+}
+
+/* Callback for svn_config_enumerate_sections2:
+ * Enumerate and implicitly expand all values in this section.
+ */
+static svn_boolean_t
+expand_values_in_section(const char *name,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_config_t *cfg = baton;
+ svn_config_enumerate2(cfg, name, expand_value, NULL, pool);
+
+ return TRUE;
+}
+
/*** Exported interfaces. ***/
+void
+svn_config__set_read_only(svn_config_t *cfg,
+ apr_pool_t *scratch_pool)
+{
+ /* expand all items such that later calls to getters won't need to
+ * change internal state */
+ svn_config_enumerate_sections2(cfg, expand_values_in_section,
+ cfg, scratch_pool);
+
+ /* now, any modification attempt will be ignored / trigger an assertion
+ * in debug mode */
+ cfg->read_only = TRUE;
+}
+
+svn_boolean_t
+svn_config__is_read_only(svn_config_t *cfg)
+{
+ return cfg->read_only;
+}
+
+svn_config_t *
+svn_config__shallow_copy(svn_config_t *src,
+ apr_pool_t *pool)
+{
+ svn_config_t *cfg = apr_palloc(pool, sizeof(*cfg));
+
+ cfg->sections = src->sections;
+ cfg->pool = pool;
+
+ /* r/o configs are fully expanded and don't need the x_pool anymore */
+ cfg->x_pool = src->read_only ? NULL : svn_pool_create(pool);
+ cfg->x_values = src->x_values;
+ cfg->tmp_key = svn_stringbuf_create_empty(pool);
+ cfg->tmp_value = svn_stringbuf_create_empty(pool);
+ cfg->section_names_case_sensitive = src->section_names_case_sensitive;
+ cfg->option_names_case_sensitive = src->option_names_case_sensitive;
+ cfg->read_only = src->read_only;
+
+ return cfg;
+}
+
+void
+svn_config__shallow_replace_section(svn_config_t *target,
+ svn_config_t *source,
+ const char *section)
+{
+ if (target->read_only)
+ target->sections = apr_hash_copy(target->pool, target->sections);
+
+ svn_hash_sets(target->sections, section,
+ svn_hash_gets(source->sections, section));
+}
+
svn_error_t *
svn_config__parse_file(svn_config_t *cfg, const char *file,
svn_boolean_t must_exist, apr_pool_t *result_pool)
{
svn_error_t *err = SVN_NO_ERROR;
+ apr_file_t *apr_file;
svn_stream_t *stream;
apr_pool_t *scratch_pool = svn_pool_create(result_pool);
- err = svn_stream_open_readonly(&stream, file, scratch_pool, scratch_pool);
+ /* Use unbuffered IO since we use our own buffering. */
+ err = svn_io_file_open(&apr_file, file, APR_READ, APR_OS_DEFAULT,
+ scratch_pool);
if (! must_exist && err && APR_STATUS_IS_ENOENT(err->apr_err))
{
@@ -441,13 +553,14 @@ svn_config__parse_file(svn_config_t *cfg, const char *file,
else
SVN_ERR(err);
+ stream = svn_stream_from_aprfile2(apr_file, FALSE, scratch_pool);
err = svn_config__parse_stream(cfg, stream, result_pool, scratch_pool);
if (err != SVN_NO_ERROR)
{
/* Add the filename to the error stack. */
err = svn_error_createf(err->apr_err, err,
- "Error while parsing config file: %s:",
+ _("Error while parsing config file: %s:"),
svn_dirent_local_style(file, scratch_pool));
}
@@ -475,6 +588,7 @@ svn_config__parse_stream(svn_config_t *cfg, svn_stream_t *stream,
ctx->value = svn_stringbuf_create_empty(scratch_pool);
ctx->buffer_pos = 0;
ctx->buffer_size = 0;
+ ctx->hit_stream_eof = FALSE;
SVN_ERR(skip_bom(ctx));
@@ -489,8 +603,8 @@ svn_config__parse_stream(svn_config_t *cfg, svn_stream_t *stream,
SVN_ERR(parse_section_name(&ch, ctx, scratch_pool));
else
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Section header"
- " must start in the first column",
+ _("line %d: Section header"
+ " must start in the first column"),
ctx->line);
break;
@@ -502,8 +616,8 @@ svn_config__parse_stream(svn_config_t *cfg, svn_stream_t *stream,
}
else
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Comment"
- " must start in the first column",
+ _("line %d: Comment"
+ " must start in the first column"),
ctx->line);
break;
@@ -517,11 +631,11 @@ svn_config__parse_stream(svn_config_t *cfg, svn_stream_t *stream,
default:
if (svn_stringbuf_isempty(ctx->section))
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Section header expected",
+ _("line %d: Section header expected"),
ctx->line);
else if (count != 0)
return svn_error_createf(SVN_ERR_MALFORMED_FILE, NULL,
- "line %d: Option expected",
+ _("line %d: Option expected"),
ctx->line);
else
SVN_ERR(parse_option(&ch, ctx, scratch_pool));
@@ -1134,12 +1248,12 @@ svn_config_ensure(const char *config_dir, apr_pool_t *pool)
"### passed to the tunnel agent as <user>@<hostname>.) If the" NL
"### built-in ssh scheme were not predefined, it could be defined" NL
"### as:" NL
- "# ssh = $SVN_SSH ssh -q" NL
+ "# ssh = $SVN_SSH ssh -q --" NL
"### If you wanted to define a new 'rsh' scheme, to be used with" NL
"### 'svn+rsh:' URLs, you could do so as follows:" NL
- "# rsh = rsh" NL
+ "# rsh = rsh --" NL
"### Or, if you wanted to specify a full path and arguments:" NL
- "# rsh = /path/to/rsh -l myusername" NL
+ "# rsh = /path/to/rsh -l myusername --" NL
"### On Windows, if you are specifying a full path to a command," NL
"### use a forward slash (/) or a paired backslash (\\\\) as the" NL
"### path separator. A single backslash will be treated as an" NL
@@ -1174,6 +1288,12 @@ svn_config_ensure(const char *config_dir, apr_pool_t *pool)
"### for 'svn add' and 'svn import', it defaults to 'no'." NL
"### Automatic properties are defined in the section 'auto-props'." NL
"# enable-auto-props = yes" NL
+#ifdef SVN_HAVE_LIBMAGIC
+ "### Set enable-magic-file to 'no' to disable magic file detection" NL
+ "### of the file type when automatically setting svn:mime-type. It" NL
+ "### defaults to 'yes' if magic file support is possible." NL
+ "# enable-magic-file = yes" NL
+#endif
"### Set interactive-conflicts to 'no' to disable interactive" NL
"### conflict resolution prompting. It defaults to 'yes'." NL
"# interactive-conflicts = no" NL
@@ -1182,6 +1302,16 @@ svn_config_ensure(const char *config_dir, apr_pool_t *pool)
"### ra_local (the file:// scheme). The value represents the number" NL
"### of MB used by the cache." NL
"# memory-cache-size = 16" NL
+ "### Set diff-ignore-content-type to 'yes' to cause 'svn diff' to" NL
+ "### attempt to show differences of all modified files regardless" NL
+ "### of their MIME content type. By default, Subversion will only" NL
+ "### attempt to show differences for files believed to have human-" NL
+ "### readable (non-binary) content. This option is especially" NL
+ "### useful when Subversion is configured (via the 'diff-cmd'" NL
+ "### option) to employ an external differencing tool which is able" NL
+ "### to show meaningful differences for binary file formats. [New" NL
+ "### in 1.9]" NL
+ "# diff-ignore-content-type = no" NL
"" NL
"### Section for configuring automatic properties." NL
"[auto-props]" NL
@@ -1217,7 +1347,13 @@ svn_config_ensure(const char *config_dir, apr_pool_t *pool)
"### copies by all clients using the 1.8 APIs. Enabling this may" NL
"### cause some clients to fail to work properly. This does not have"NL
"### to be set for exclusive-locking-clients to work." NL
- "# exclusive-locking = false" NL;
+ "# exclusive-locking = false" NL
+ "### Set the SQLite busy timeout in milliseconds: the maximum time" NL
+ "### the client waits to get access to the SQLite database before" NL
+ "### returning an error. The default is 10000, i.e. 10 seconds." NL
+ "### Longer values may be useful when exclusive locking is enabled." NL
+ "# busy-timeout = 10000" NL
+ ;
err = svn_io_file_open(&f, path,
(APR_WRITE | APR_CREATE | APR_EXCL),
@@ -1249,16 +1385,20 @@ svn_config_get_user_config_path(const char **path,
if (config_dir)
{
- *path = svn_dirent_join_many(pool, config_dir, fname, NULL);
+ *path = svn_dirent_join_many(pool, config_dir, fname, SVN_VA_NULL);
return SVN_NO_ERROR;
}
#ifdef WIN32
{
const char *folder;
- SVN_ERR(svn_config__win_config_path(&folder, FALSE, pool));
+ SVN_ERR(svn_config__win_config_path(&folder, FALSE, pool, pool));
+
+ if (! folder)
+ return SVN_NO_ERROR;
+
*path = svn_dirent_join_many(pool, folder,
- SVN_CONFIG__SUBDIRECTORY, fname, NULL);
+ SVN_CONFIG__SUBDIRECTORY, fname, SVN_VA_NULL);
}
#elif defined(__HAIKU__)
@@ -1271,7 +1411,8 @@ svn_config_get_user_config_path(const char **path,
return SVN_NO_ERROR;
*path = svn_dirent_join_many(pool, folder,
- SVN_CONFIG__USR_DIRECTORY, fname, NULL);
+ SVN_CONFIG__USR_DIRECTORY, fname,
+ SVN_VA_NULL);
}
#else /* ! WIN32 && !__HAIKU__ */
@@ -1281,7 +1422,7 @@ svn_config_get_user_config_path(const char **path,
return SVN_NO_ERROR;
*path = svn_dirent_join_many(pool,
svn_dirent_canonicalize(homedir, pool),
- SVN_CONFIG__USR_DIRECTORY, fname, NULL);
+ SVN_CONFIG__USR_DIRECTORY, fname, SVN_VA_NULL);
}
#endif /* WIN32 */
diff --git a/subversion/libsvn_subr/config_impl.h b/subversion/libsvn_subr/config_impl.h
index a3ab8fa..529d7d5 100644
--- a/subversion/libsvn_subr/config_impl.h
+++ b/subversion/libsvn_subr/config_impl.h
@@ -34,7 +34,6 @@
#include "svn_string.h"
#include "svn_io.h"
#include "svn_config.h"
-#include "svn_private_config.h"
#ifdef __cplusplus
extern "C" {
@@ -47,7 +46,8 @@ struct svn_config_t
/* Table of cfg_section_t's. */
apr_hash_t *sections;
- /* Pool for hash tables, table entries and unexpanded values */
+ /* Pool for hash tables, table entries and unexpanded values.
+ Also, parent pool for temporary pools. */
apr_pool_t *pool;
/* Pool for expanded values -- this is separate, so that we can
@@ -70,8 +70,11 @@ struct svn_config_t
/* Specifies whether option names are populated case sensitively. */
svn_boolean_t option_names_case_sensitive;
-};
+ /* When set, all modification attempts will be ignored.
+ * In debug mode, we will trigger an assertion. */
+ svn_boolean_t read_only;
+};
/* Read sections and options from a file. */
svn_error_t *svn_config__parse_file(svn_config_t *cfg,
@@ -92,8 +95,9 @@ svn_error_t *svn_config__parse_stream(svn_config_t *cfg,
#ifdef WIN32
/* Get the common or user-specific AppData folder */
svn_error_t *svn_config__win_config_path(const char **folder,
- int system_path,
- apr_pool_t *pool);
+ svn_boolean_t system_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Read sections and options from the Windows Registry. */
svn_error_t *svn_config__parse_registry(svn_config_t *cfg,
diff --git a/subversion/libsvn_subr/config_keys.inc b/subversion/libsvn_subr/config_keys.inc
new file mode 100644
index 0000000..d9f4484
--- /dev/null
+++ b/subversion/libsvn_subr/config_keys.inc
@@ -0,0 +1,77 @@
+/* Automatically generated by build/generator/gen_base.pyc:write_config_keys() */
+
+static const char *svn__valid_config_files[] = {
+ SVN_CONFIG_CATEGORY_SERVERS,
+ SVN_CONFIG_CATEGORY_CONFIG
+};
+
+static const char *svn__valid_config_sections[] = {
+ SVN_CONFIG_SECTION_GROUPS,
+ SVN_CONFIG_SECTION_GLOBAL,
+ SVN_CONFIG_SECTION_AUTH,
+ SVN_CONFIG_SECTION_HELPERS,
+ SVN_CONFIG_SECTION_MISCELLANY,
+ SVN_CONFIG_SECTION_TUNNELS,
+ SVN_CONFIG_SECTION_AUTO_PROPS,
+ SVN_CONFIG_SECTION_WORKING_COPY
+};
+
+static const char *svn__valid_config_options[] = {
+ SVN_CONFIG_OPTION_HTTP_PROXY_HOST,
+ SVN_CONFIG_OPTION_HTTP_PROXY_PORT,
+ SVN_CONFIG_OPTION_HTTP_PROXY_USERNAME,
+ SVN_CONFIG_OPTION_HTTP_PROXY_PASSWORD,
+ SVN_CONFIG_OPTION_HTTP_PROXY_EXCEPTIONS,
+ SVN_CONFIG_OPTION_HTTP_TIMEOUT,
+ SVN_CONFIG_OPTION_HTTP_COMPRESSION,
+ SVN_CONFIG_OPTION_NEON_DEBUG_MASK,
+ SVN_CONFIG_OPTION_HTTP_AUTH_TYPES,
+ SVN_CONFIG_OPTION_SSL_AUTHORITY_FILES,
+ SVN_CONFIG_OPTION_SSL_TRUST_DEFAULT_CA,
+ SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE,
+ SVN_CONFIG_OPTION_SSL_CLIENT_CERT_PASSWORD,
+ SVN_CONFIG_OPTION_SSL_PKCS11_PROVIDER,
+ SVN_CONFIG_OPTION_HTTP_LIBRARY,
+ SVN_CONFIG_OPTION_STORE_PASSWORDS,
+ SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS,
+ SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
+ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP,
+ SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT,
+ SVN_CONFIG_OPTION_USERNAME,
+ SVN_CONFIG_OPTION_HTTP_BULK_UPDATES,
+ SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS,
+ SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS,
+ SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS,
+ SVN_CONFIG_OPTION_SERF_LOG_LEVEL,
+ SVN_CONFIG_OPTION_PASSWORD_STORES,
+ SVN_CONFIG_OPTION_KWALLET_WALLET,
+ SVN_CONFIG_OPTION_KWALLET_SVN_APPLICATION_NAME_WITH_PID,
+ SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE_PROMPT,
+ SVN_CONFIG_OPTION_EDITOR_CMD,
+ SVN_CONFIG_OPTION_DIFF_CMD,
+ SVN_CONFIG_OPTION_DIFF_EXTENSIONS,
+ SVN_CONFIG_OPTION_DIFF3_CMD,
+ SVN_CONFIG_OPTION_DIFF3_HAS_PROGRAM_ARG,
+ SVN_CONFIG_OPTION_MERGE_TOOL_CMD,
+ SVN_CONFIG_OPTION_GLOBAL_IGNORES,
+ SVN_CONFIG_OPTION_LOG_ENCODING,
+ SVN_CONFIG_OPTION_USE_COMMIT_TIMES,
+ SVN_CONFIG_OPTION_TEMPLATE_ROOT,
+ SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS,
+ SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE,
+ SVN_CONFIG_OPTION_NO_UNLOCK,
+ SVN_CONFIG_OPTION_MIMETYPES_FILE,
+ SVN_CONFIG_OPTION_PRESERVED_CF_EXTS,
+ SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS,
+ SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE,
+ SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE,
+ SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE,
+ SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS,
+ SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT
+};
+
+static const char *svn__empty_config_sections[] = {
+ SVN_CONFIG_SECTION_GROUPS,
+ SVN_CONFIG_SECTION_TUNNELS,
+ SVN_CONFIG_SECTION_AUTO_PROPS
+};
diff --git a/subversion/libsvn_subr/config_win.c b/subversion/libsvn_subr/config_win.c
index 0a15129..77f7ce4 100644
--- a/subversion/libsvn_subr/config_win.c
+++ b/subversion/libsvn_subr/config_win.c
@@ -44,10 +44,15 @@
#include "svn_path.h"
#include "svn_pools.h"
#include "svn_utf.h"
+#include "private/svn_utf_private.h"
+
+#include "config_impl.h"
svn_error_t *
-svn_config__win_config_path(const char **folder, int system_path,
- apr_pool_t *pool)
+svn_config__win_config_path(const char **folder,
+ svn_boolean_t system_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
/* ### Adding CSIDL_FLAG_CREATE here, because those folders really
must exist. I'm not too sure about the SHGFP_TYPE_CURRENT
@@ -56,47 +61,54 @@ svn_config__win_config_path(const char **folder, int system_path,
| CSIDL_FLAG_CREATE);
WCHAR folder_ucs2[MAX_PATH];
- int inwords, outbytes, outlength;
- char *folder_utf8;
+ const char *folder_utf8;
- if (S_OK != SHGetFolderPathW(NULL, csidl, NULL, SHGFP_TYPE_CURRENT,
- folder_ucs2))
- return svn_error_create(SVN_ERR_BAD_FILENAME, NULL,
- (system_path
- ? "Can't determine the system config path"
- : "Can't determine the user's config path"));
+ if (! system_path)
+ {
+ HKEY hkey_tmp;
- /* ### When mapping from UCS-2 to UTF-8, we need at most 3 bytes
- per wide char, plus extra space for the nul terminator. */
- inwords = lstrlenW(folder_ucs2);
- outbytes = outlength = 3 * (inwords + 1);
+ /* Verify if we actually have a *per user* profile to read from */
+ if (ERROR_SUCCESS == RegOpenCurrentUser(KEY_SET_VALUE, &hkey_tmp))
+ RegCloseKey(hkey_tmp); /* We have a profile */
+ else
+ {
+ /* The user is not properly logged in. (Most likely we are running
+ in a service process). In this case Windows will return a default
+ read only 'roaming profile' directory, which we assume to be
+ writable. We will then spend many seconds trying to create a
+ configuration and then fail, because we are not allowed to write
+ there, but the retry loop in io.c doesn't know that.
- folder_utf8 = apr_palloc(pool, outlength);
+ We just answer that there is no user configuration directory. */
- outbytes = WideCharToMultiByte(CP_UTF8, 0, folder_ucs2, inwords,
- folder_utf8, outbytes, NULL, NULL);
+ *folder = NULL;
+ return SVN_NO_ERROR;
+ }
+ }
- if (outbytes == 0)
- return svn_error_wrap_apr(apr_get_os_error(),
- "Can't convert config path to UTF-8");
+ if (S_OK != SHGetFolderPathW(NULL, csidl, NULL, SHGFP_TYPE_CURRENT,
+ folder_ucs2))
+ return svn_error_create(SVN_ERR_BAD_FILENAME, NULL,
+ (system_path
+ ? _("Can't determine the system config path")
+ : _("Can't determine the user's config path")));
- /* Note that WideCharToMultiByte does _not_ terminate the
- outgoing buffer. */
- folder_utf8[outbytes] = '\0';
- *folder = folder_utf8;
+ SVN_ERR(svn_utf__win32_utf16_to_utf8(&folder_utf8, folder_ucs2,
+ NULL, scratch_pool));
+ *folder = svn_dirent_internal_style(folder_utf8, result_pool);
return SVN_NO_ERROR;
}
-#include "config_impl.h"
-/* ### These constants are insanely large, but (a) we want to avoid
- reallocating strings if possible, and (b) the realloc logic might
- not actually work -- you never know with Win32 ... */
+/* ### These constants are insanely large, but we want to avoid
+ reallocating strings if possible. */
#define SVN_REG_DEFAULT_NAME_SIZE 2048
#define SVN_REG_DEFAULT_VALUE_SIZE 8192
+/* ### This function should be converted to use the unicode functions
+ ### instead of the ansi functions */
static svn_error_t *
parse_section(svn_config_t *cfg, HKEY hkey, const char *section,
svn_stringbuf_t *option, svn_stringbuf_t *value)
@@ -122,7 +134,7 @@ parse_section(svn_config_t *cfg, HKEY hkey, const char *section,
}
if (err != ERROR_SUCCESS)
return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- "Can't enumerate registry values");
+ _("Can't enumerate registry values"));
/* Ignore option names that start with '#', see
http://subversion.tigris.org/issues/show_bug.cgi?id=671 */
@@ -139,7 +151,7 @@ parse_section(svn_config_t *cfg, HKEY hkey, const char *section,
}
if (err != ERROR_SUCCESS)
return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- "Can't read registry value data");
+ _("Can't read registry value data"));
svn_config_set(cfg, section, option->data, value->data);
}
@@ -176,7 +188,7 @@ svn_config__parse_registry(svn_config_t *cfg, const char *file,
else
{
return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
- "Unrecognised registry path '%s'",
+ _("Unrecognised registry path '%s'"),
svn_dirent_local_style(file, pool));
}
@@ -185,14 +197,15 @@ svn_config__parse_registry(svn_config_t *cfg, const char *file,
&hkey);
if (err != ERROR_SUCCESS)
{
- const int is_enoent = APR_STATUS_IS_ENOENT(APR_FROM_OS_ERROR(err));
- if (!is_enoent)
- return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
- "Can't open registry key '%s'",
- svn_dirent_local_style(file, pool));
- else if (must_exist && is_enoent)
- return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
- "Can't find registry key '%s'",
+ apr_status_t apr_err = APR_FROM_OS_ERROR(err);
+ svn_boolean_t is_enoent = APR_STATUS_IS_ENOENT(apr_err)
+ || (err == ERROR_INVALID_HANDLE);
+
+ if (must_exist || !is_enoent)
+ return svn_error_createf(SVN_ERR_BAD_FILENAME,
+ is_enoent ? NULL
+ : svn_error_wrap_apr(apr_err, NULL),
+ _("Can't open registry key '%s'"),
svn_dirent_local_style(file, pool));
else
return SVN_NO_ERROR;
@@ -230,7 +243,7 @@ svn_config__parse_registry(svn_config_t *cfg, const char *file,
if (err != ERROR_SUCCESS)
{
svn_err = svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- "Can't enumerate registry keys");
+ _("Can't enumerate registry keys"));
goto cleanup;
}
@@ -240,7 +253,7 @@ svn_config__parse_registry(svn_config_t *cfg, const char *file,
if (err != ERROR_SUCCESS)
{
svn_err = svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- "Can't open existing subkey");
+ _("Can't open existing subkey"));
goto cleanup;
}
diff --git a/subversion/libsvn_subr/ctype.c b/subversion/libsvn_subr/ctype.c
index 0dd5d5b..1d4c30b 100644
--- a/subversion/libsvn_subr/ctype.c
+++ b/subversion/libsvn_subr/ctype.c
@@ -25,6 +25,23 @@
#include "svn_ctype.h"
+#ifndef WIN32
+static
+#else
+/* This variable is exported as 'CONSTANT' in our .def file for libsvn_subr,
+ with the name svn_ctype_table.
+
+ This long deprecated construct will export *a pointer to* the
+ variable exported.
+
+ See http://support.microsoft.com/kb/90530/en-us for the ugly details on
+ this system that was already deprecated when we started Subversion and
+ on why we should have used __declspec(dllexport) when initially exporting
+ this variable. (It would allow avoiding the pointer transformation).
+
+ But to keep backwards compatibility this symbol will have to stay public
+ on Windows until Subversion 2.0. */
+#endif
const apr_uint32_t svn_ctype_table_internal[256] =
{
/* **** DO NOT EDIT! ****
diff --git a/subversion/libsvn_subr/debug.c b/subversion/libsvn_subr/debug.c
index be331ed..4681fa4 100644
--- a/subversion/libsvn_subr/debug.c
+++ b/subversion/libsvn_subr/debug.c
@@ -80,7 +80,7 @@ static void
debug_vprintf(const char *fmt, va_list ap)
{
FILE *output = debug_output;
- char prefix[80], buffer[1000];
+ char prefix[80], buffer[4096];
char *s = buffer;
int n;
@@ -145,8 +145,8 @@ svn_dbg__print_props(apr_hash_t *props,
for (hi = apr_hash_first(apr_hash_pool_get(props), props); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_string_t *val = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_string_t *val = apr_hash_this_val(hi);
svn_dbg__printf(" '%s' -> '%s'\n", name, val->data);
}
diff --git a/subversion/libsvn_subr/deprecated.c b/subversion/libsvn_subr/deprecated.c
index 93bd89d..68e3bd2 100644
--- a/subversion/libsvn_subr/deprecated.c
+++ b/subversion/libsvn_subr/deprecated.c
@@ -28,6 +28,8 @@
#include <assert.h>
+#include <apr_md5.h>
+
/* We define this here to remove any further warnings about the usage of
deprecated functions in this file. */
#define SVN_DEPRECATED
@@ -43,11 +45,12 @@
#include "svn_mergeinfo.h"
#include "svn_utf.h"
#include "svn_xml.h"
+#include "svn_auth.h"
#include "opt.h"
+#include "auth.h"
#include "private/svn_opt_private.h"
#include "private/svn_mergeinfo_private.h"
-#include "private/svn_subr_private.h"
#include "svn_private_config.h"
@@ -1067,6 +1070,119 @@ svn_stream_contents_same(svn_boolean_t *same,
pool));
}
+void
+svn_stream_set_read(svn_stream_t *stream,
+ svn_read_fn_t read_fn)
+{
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_fn);
+}
+
+svn_error_t *
+svn_stream_read(svn_stream_t *stream,
+ char *buffer,
+ apr_size_t *len)
+{
+ return svn_error_trace(svn_stream_read_full(stream, buffer, len));
+}
+
+struct md5_stream_baton
+{
+ const unsigned char **read_digest;
+ const unsigned char **write_digest;
+ svn_checksum_t *read_checksum;
+ svn_checksum_t *write_checksum;
+ svn_stream_t *proxy;
+ apr_pool_t *pool;
+};
+
+static svn_error_t *
+read_handler_md5(void *baton, char *buffer, apr_size_t *len)
+{
+ struct md5_stream_baton *btn = baton;
+ return svn_error_trace(svn_stream_read2(btn->proxy, buffer, len));
+}
+
+static svn_error_t *
+read_full_handler_md5(void *baton, char *buffer, apr_size_t *len)
+{
+ struct md5_stream_baton *btn = baton;
+ return svn_error_trace(svn_stream_read_full(btn->proxy, buffer, len));
+}
+
+static svn_error_t *
+skip_handler_md5(void *baton, apr_size_t len)
+{
+ struct md5_stream_baton *btn = baton;
+ return svn_error_trace(svn_stream_skip(btn->proxy, len));
+}
+
+static svn_error_t *
+write_handler_md5(void *baton, const char *buffer, apr_size_t *len)
+{
+ struct md5_stream_baton *btn = baton;
+ return svn_error_trace(svn_stream_write(btn->proxy, buffer, len));
+}
+
+static svn_error_t *
+close_handler_md5(void *baton)
+{
+ struct md5_stream_baton *btn = baton;
+
+ SVN_ERR(svn_stream_close(btn->proxy));
+
+ if (btn->read_digest)
+ *btn->read_digest
+ = apr_pmemdup(btn->pool, btn->read_checksum->digest,
+ APR_MD5_DIGESTSIZE);
+
+ if (btn->write_digest)
+ *btn->write_digest
+ = apr_pmemdup(btn->pool, btn->write_checksum->digest,
+ APR_MD5_DIGESTSIZE);
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_stream_t *
+svn_stream_checksummed(svn_stream_t *stream,
+ const unsigned char **read_digest,
+ const unsigned char **write_digest,
+ svn_boolean_t read_all,
+ apr_pool_t *pool)
+{
+ svn_stream_t *s;
+ struct md5_stream_baton *baton;
+
+ if (! read_digest && ! write_digest)
+ return stream;
+
+ baton = apr_palloc(pool, sizeof(*baton));
+ baton->read_digest = read_digest;
+ baton->write_digest = write_digest;
+ baton->pool = pool;
+
+ /* Set BATON->proxy to a stream that will fill in BATON->read_checksum
+ * and BATON->write_checksum (if we want them) when it is closed. */
+ baton->proxy
+ = svn_stream_checksummed2(stream,
+ read_digest ? &baton->read_checksum : NULL,
+ write_digest ? &baton->write_checksum : NULL,
+ svn_checksum_md5,
+ read_all, pool);
+
+ /* Create a stream that will forward its read/write/close operations to
+ * BATON->proxy and will fill in *READ_DIGEST and *WRITE_DIGEST (if we
+ * want them) after it closes BATON->proxy. */
+ s = svn_stream_create(baton, pool);
+ svn_stream_set_read2(s, read_handler_md5, read_full_handler_md5);
+ svn_stream_set_skip(s, skip_handler_md5);
+ svn_stream_set_write(s, write_handler_md5);
+ svn_stream_set_close(s, close_handler_md5);
+ return s;
+}
+
/*** From path.c ***/
const char *
@@ -1253,6 +1369,8 @@ svn_xml_make_header(svn_stringbuf_t **str, apr_pool_t *pool)
svn_xml_make_header2(str, NULL, pool);
}
+
+/*** From utf.c ***/
void
svn_utf_initialize(apr_pool_t *pool)
{
@@ -1260,6 +1378,31 @@ svn_utf_initialize(apr_pool_t *pool)
}
svn_error_t *
+svn_utf_cstring_from_utf8_ex(const char **dest,
+ const char *src,
+ const char *topage,
+ const char *convset_key,
+ apr_pool_t *pool)
+{
+ return svn_utf_cstring_from_utf8_ex2(dest, src, topage, pool);
+}
+
+/*** From error.c ***/
+void
+svn_handle_error(svn_error_t *err, FILE *stream, svn_boolean_t fatal)
+{
+ svn_handle_error2(err, stream, fatal, "svn: ");
+}
+
+void
+svn_handle_warning(FILE *stream, svn_error_t *err)
+{
+ svn_handle_warning2(stream, err, "svn: ");
+}
+
+
+/*** From subst.c ***/
+svn_error_t *
svn_subst_build_keywords(svn_subst_keywords_t *kw,
const char *keywords_val,
const char *rev,
@@ -1309,3 +1452,99 @@ svn_ver_check_list(const svn_version_t *my_version,
{
return svn_ver_check_list2(my_version, checklist, svn_ver_compatible);
}
+
+/*** From win32_crypto.c ***/
+#if defined(WIN32) && !defined(__MINGW32__)
+void
+svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+ svn_auth__get_windows_simple_provider(provider, pool);
+}
+
+void
+svn_auth_get_windows_ssl_client_cert_pw_provider
+ (svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+ svn_auth__get_windows_ssl_client_cert_pw_provider(provider, pool);
+}
+
+void
+svn_auth_get_windows_ssl_server_trust_provider
+ (svn_auth_provider_object_t **provider, apr_pool_t *pool)
+{
+ svn_auth__get_windows_ssl_server_trust_provider(provider, pool);
+}
+#endif /* WIN32 && !__MINGW32__ */
+
+/*** From macos_keychain.c ***/
+#if defined(DARWIN)
+void
+svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
+ svn_auth__get_keychain_simple_provider(provider, pool);
+#else
+ svn_auth__get_dummmy_simple_provider(provider, pool);
+#endif
+}
+
+void
+svn_auth_get_keychain_ssl_client_cert_pw_provider
+ (svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
+ svn_auth__get_keychain_ssl_client_cert_pw_provider(provider, pool);
+#else
+ /* Not really the right type of dummy provider, but doesn't throw NULL
+ errors as just returning NULL would */
+ svn_auth__get_dummmy_simple_provider(provider, pool);
+#endif
+}
+#endif /* DARWIN */
+
+#if !defined(WIN32)
+void
+svn_auth_get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
+ apr_pool_t *pool)
+{
+#ifdef SVN_HAVE_GPG_AGENT
+ svn_auth__get_gpg_agent_simple_provider(provider, pool);
+#else
+ svn_auth__get_dummmy_simple_provider(provider, pool);
+#endif /* SVN_HAVE_GPG_AGENT */
+}
+#endif /* !WIN32 */
+
+svn_error_t *
+svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
+ svn_boolean_t non_interactive,
+ const char *auth_username,
+ const char *auth_password,
+ const char *config_dir,
+ svn_boolean_t no_auth_cache,
+ svn_boolean_t trust_server_cert,
+ svn_config_t *cfg,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_cmdline_create_auth_baton2(ab,
+ non_interactive,
+ auth_username,
+ auth_password,
+ config_dir,
+ no_auth_cache,
+ trust_server_cert,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ cfg,
+ cancel_func,
+ cancel_baton,
+ pool));
+}
diff --git a/subversion/libsvn_subr/dirent_uri.c b/subversion/libsvn_subr/dirent_uri.c
index 6886a3e..a009145 100644
--- a/subversion/libsvn_subr/dirent_uri.c
+++ b/subversion/libsvn_subr/dirent_uri.c
@@ -1294,6 +1294,29 @@ svn_relpath_split(const char **dirpath,
*base_name = svn_relpath_basename(relpath, pool);
}
+const char *
+svn_relpath_prefix(const char *relpath,
+ int max_components,
+ apr_pool_t *result_pool)
+{
+ const char *end;
+ assert(relpath_is_canonical(relpath));
+
+ if (max_components <= 0)
+ return "";
+
+ for (end = relpath; *end; end++)
+ {
+ if (*end == '/')
+ {
+ if (!--max_components)
+ break;
+ }
+ }
+
+ return apr_pstrmemdup(result_pool, relpath, end-relpath);
+}
+
char *
svn_uri_dirname(const char *uri, apr_pool_t *pool)
{
@@ -1689,7 +1712,9 @@ svn_dirent_is_canonical(const char *dirent, apr_pool_t *scratch_pool)
static svn_boolean_t
relpath_is_canonical(const char *relpath)
{
- const char *ptr = relpath, *seg = relpath;
+ const char *dot_pos, *ptr = relpath;
+ apr_size_t i, len;
+ unsigned pattern = 0;
/* RELPATH is canonical if it has:
* - no '.' segments
@@ -1697,35 +1722,38 @@ relpath_is_canonical(const char *relpath)
* - no '//'
*/
- if (*relpath == '\0')
- return TRUE;
-
+ /* invalid beginnings */
if (*ptr == '/')
return FALSE;
- /* Now validate the rest of the path. */
- while(1)
- {
- apr_size_t seglen = ptr - seg;
-
- if (seglen == 1 && *seg == '.')
- return FALSE; /* /./ */
-
- if (*ptr == '/' && *(ptr+1) == '/')
- return FALSE; /* // */
+ if (ptr[0] == '.' && (ptr[1] == '/' || ptr[1] == '\0'))
+ return FALSE;
- if (! *ptr && *(ptr - 1) == '/')
- return FALSE; /* foo/ */
+ /* valid special cases */
+ len = strlen(ptr);
+ if (len < 2)
+ return TRUE;
- if (! *ptr)
- break;
+ /* invalid endings */
+ if (ptr[len-1] == '/' || (ptr[len-1] == '.' && ptr[len-2] == '/'))
+ return FALSE;
- if (*ptr == '/')
- ptr++;
- seg = ptr;
+ /* '.' are rare. So, search for them globally. There will often be no
+ * more than one hit. Also note that we already checked for invalid
+ * starts and endings, i.e. we only need to check for "/./"
+ */
+ for (dot_pos = memchr(ptr, '.', len);
+ dot_pos;
+ dot_pos = strchr(dot_pos+1, '.'))
+ if (dot_pos > ptr && dot_pos[-1] == '/' && dot_pos[1] == '/')
+ return FALSE;
- while (*ptr && (*ptr != '/'))
- ptr++;
+ /* Now validate the rest of the path. */
+ for (i = 0; i < len - 1; ++i)
+ {
+ pattern = ((pattern & 0xff) << 8) + (unsigned char)ptr[i];
+ if (pattern == 0x101 * (unsigned char)('/'))
+ return FALSE;
}
return TRUE;
@@ -2315,7 +2343,7 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
"prefix"), url);
/* Find the HOSTNAME portion and the PATH portion of the URL. The host
- name is between the "file://" prefix and the next occurence of '/'. We
+ name is between the "file://" prefix and the next occurrence of '/'. We
are considering everything from that '/' until the end of the URL to be
the absolute path portion of the URL.
If we got just "file://", treat it the same as "file:///". */
@@ -2394,7 +2422,7 @@ svn_uri_get_dirent_from_file_url(const char **dirent,
"no path"), url);
/* We still know that the path starts with a slash. */
- *dirent = apr_pstrcat(pool, "//", hostname, dup_path, NULL);
+ *dirent = apr_pstrcat(pool, "//", hostname, dup_path, SVN_VA_NULL);
}
else
*dirent = dup_path;
@@ -2427,18 +2455,18 @@ svn_uri_get_file_url_from_dirent(const char **url,
if (dirent[0] == '/' && dirent[1] == '\0')
dirent = NULL; /* "file://" is the canonical form of "file:///" */
- *url = apr_pstrcat(pool, "file://", dirent, (char *)NULL);
+ *url = apr_pstrcat(pool, "file://", dirent, SVN_VA_NULL);
#else
if (dirent[0] == '/')
{
/* Handle UNC paths //server/share -> file://server/share */
assert(dirent[1] == '/'); /* Expect UNC, not non-absolute */
- *url = apr_pstrcat(pool, "file:", dirent, NULL);
+ *url = apr_pstrcat(pool, "file:", dirent, SVN_VA_NULL);
}
else
{
- char *uri = apr_pstrcat(pool, "file:///", dirent, NULL);
+ char *uri = apr_pstrcat(pool, "file:///", dirent, SVN_VA_NULL);
apr_size_t len = 8 /* strlen("file:///") */ + strlen(dirent);
/* "C:/" is a canonical dirent on Windows,
@@ -2472,7 +2500,7 @@ svn_fspath__canonicalize(const char *fspath,
return "/";
return apr_pstrcat(pool, "/", svn_relpath_canonicalize(fspath, pool),
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -2505,7 +2533,7 @@ svn_fspath__dirname(const char *fspath,
return apr_pstrdup(pool, fspath);
else
return apr_pstrcat(pool, "/", svn_relpath_dirname(fspath + 1, pool),
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -2549,9 +2577,9 @@ svn_fspath__join(const char *fspath,
if (relpath[0] == '\0')
result = apr_pstrdup(result_pool, fspath);
else if (fspath[1] == '\0')
- result = apr_pstrcat(result_pool, "/", relpath, (char *)NULL);
+ result = apr_pstrcat(result_pool, "/", relpath, SVN_VA_NULL);
else
- result = apr_pstrcat(result_pool, fspath, "/", relpath, (char *)NULL);
+ result = apr_pstrcat(result_pool, fspath, "/", relpath, SVN_VA_NULL);
assert(svn_fspath__is_canonical(result));
return result;
@@ -2570,7 +2598,7 @@ svn_fspath__get_longest_ancestor(const char *fspath1,
svn_relpath_get_longest_ancestor(fspath1 + 1,
fspath2 + 1,
result_pool),
- (char *)NULL);
+ SVN_VA_NULL);
assert(svn_fspath__is_canonical(result));
return result;
diff --git a/subversion/libsvn_subr/dso.c b/subversion/libsvn_subr/dso.c
index 7cce2fd..46af549 100644
--- a/subversion/libsvn_subr/dso.c
+++ b/subversion/libsvn_subr/dso.c
@@ -29,6 +29,7 @@
#include "private/svn_mutex.h"
#include "private/svn_atomic.h"
+#include "private/svn_subr_private.h"
/* A mutex to protect our global pool and cache. */
static svn_mutex__t *dso_mutex = NULL;
@@ -123,4 +124,11 @@ svn_dso_load(apr_dso_handle_t **dso, const char *fname)
return SVN_NO_ERROR;
}
+
+apr_pool_t *
+svn_dso__pool(void)
+{
+ return dso_pool;
+}
+
#endif /* APR_HAS_DSO */
diff --git a/subversion/libsvn_subr/eol.c b/subversion/libsvn_subr/eol.c
index 88a6a37..e63cf11 100644
--- a/subversion/libsvn_subr/eol.c
+++ b/subversion/libsvn_subr/eol.c
@@ -30,25 +30,10 @@
#include "private/svn_eol_private.h"
#include "private/svn_dep_compat.h"
-/* Machine-word-sized masks used in svn_eol__find_eol_start.
- */
char *
svn_eol__find_eol_start(char *buf, apr_size_t len)
{
-#if !SVN_UNALIGNED_ACCESS_IS_OK
-
- /* On some systems, we need to make sure that buf is properly aligned
- * for chunky data access. This overhead is still justified because
- * only lines tend to be tens of chars long.
- */
- for (; (len > 0) && ((apr_uintptr_t)buf) & (sizeof(apr_uintptr_t)-1)
- ; ++buf, --len)
- {
- if (*buf == '\n' || *buf == '\r')
- return buf;
- }
-
-#endif
+#if SVN_UNALIGNED_ACCESS_IS_OK
/* Scan the input one machine word at a time. */
for (; len > sizeof(apr_uintptr_t)
@@ -62,8 +47,8 @@ svn_eol__find_eol_start(char *buf, apr_size_t len)
apr_uintptr_t r_test = chunk ^ SVN__R_MASK;
apr_uintptr_t n_test = chunk ^ SVN__N_MASK;
- /* A byte in SVN__R_TEST can by < 0x80, iff it has been \0 before
- * (i.e. \r in *BUF). Dito for SVN__N_TEST. */
+ /* A byte in SVN__R_TEST can only be < 0x80, iff it has been \0 before
+ * (i.e. \r in *BUF). Ditto for SVN__N_TEST. */
r_test |= (r_test & SVN__LOWER_7BITS_SET) + SVN__LOWER_7BITS_SET;
n_test |= (n_test & SVN__LOWER_7BITS_SET) + SVN__LOWER_7BITS_SET;
@@ -73,6 +58,8 @@ svn_eol__find_eol_start(char *buf, apr_size_t len)
break;
}
+#endif
+
/* The remaining odd bytes will be examined the naive way: */
for (; len > 0; ++buf, --len)
{
diff --git a/subversion/libsvn_subr/error.c b/subversion/libsvn_subr/error.c
index 48ac906..ffb2495 100644
--- a/subversion/libsvn_subr/error.c
+++ b/subversion/libsvn_subr/error.c
@@ -67,6 +67,7 @@ static const char SVN_FILE_LINE_UNDEFINED[] = "svn:<undefined>";
#undef svn_error_create
#undef svn_error_createf
#undef svn_error_quick_wrap
+#undef svn_error_quick_wrapf
#undef svn_error_wrap_apr
/* Note: Although this is a "__" function, it was historically in the
@@ -85,17 +86,15 @@ svn_error__locate(const char *file, long line)
/* Cleanup function for errors. svn_error_clear () removes this so
errors that are properly handled *don't* hit this code. */
-#if defined(SVN_DEBUG)
static apr_status_t err_abort(void *data)
{
svn_error_t *err = data; /* For easy viewing in a debugger */
- err = err; /* Fake a use for the variable to avoid compiler warnings */
+ SVN_UNUSED(err);
if (!getenv("SVN_DBG_NO_ABORT_ON_ERROR_LEAK"))
abort();
return APR_SUCCESS;
}
-#endif
static svn_error_t *
@@ -110,7 +109,8 @@ make_error_internal(apr_status_t apr_err,
pool = child->pool;
else
{
- if (apr_pool_create(&pool, NULL))
+ pool = svn_pool_create(NULL);
+ if (!pool)
abort();
}
@@ -201,7 +201,8 @@ svn_error_wrap_apr(apr_status_t status,
va_end(ap);
if (msg_apr)
{
- err->message = apr_pstrcat(err->pool, msg, ": ", msg_apr, NULL);
+ err->message = apr_pstrcat(err->pool, msg, ": ", msg_apr,
+ SVN_VA_NULL);
}
else
{
@@ -224,6 +225,26 @@ svn_error_quick_wrap(svn_error_t *child, const char *new_msg)
new_msg);
}
+svn_error_t *
+svn_error_quick_wrapf(svn_error_t *child,
+ const char *fmt,
+ ...)
+{
+ svn_error_t *err;
+ va_list ap;
+
+ if (child == SVN_NO_ERROR)
+ return SVN_NO_ERROR;
+
+ err = make_error_internal(child->apr_err, child);
+
+ va_start(ap, fmt);
+ err->message = apr_pvsprintf(err->pool, fmt, ap);
+ va_end(ap);
+
+ return err;
+}
+
/* Messages in tracing errors all point to this static string. */
static const char error_tracing_link[] = "traced call";
@@ -259,8 +280,7 @@ svn_error_compose_create(svn_error_t *err1,
if (err1 && err2)
{
svn_error_compose(err1,
- svn_error_quick_wrap(err2,
- _("Additional errors:")));
+ svn_error_create(SVN_ERR_COMPOSED_ERROR, err2, NULL));
return err1;
}
return err1 ? err1 : err2;
@@ -314,7 +334,10 @@ svn_error_root_cause(svn_error_t *err)
{
while (err)
{
- if (err->child)
+ /* I don't think we can change the behavior here, but the additional
+ error chain doesn't define the root cause. Perhaps we should rev
+ this function. */
+ if (err->child /*&& err->child->apr_err != SVN_ERR_COMPOSED_ERROR*/)
err = err->child;
else
break;
@@ -336,12 +359,16 @@ svn_error_find_cause(svn_error_t *err, apr_status_t apr_err)
}
svn_error_t *
-svn_error_dup(svn_error_t *err)
+svn_error_dup(const svn_error_t *err)
{
apr_pool_t *pool;
svn_error_t *new_err = NULL, *tmp_err = NULL;
- if (apr_pool_create(&pool, NULL))
+ if (!err)
+ return SVN_NO_ERROR;
+
+ pool = svn_pool_create(NULL);
+ if (!pool)
abort();
for (; err; err = err->child)
@@ -388,7 +415,7 @@ svn_error_clear(svn_error_t *err)
}
svn_boolean_t
-svn_error__is_tracing_link(svn_error_t *err)
+svn_error__is_tracing_link(const svn_error_t *err)
{
#ifdef SVN_ERR__TRACING
/* ### A strcmp()? Really? I think it's the best we can do unless
@@ -423,10 +450,8 @@ svn_error_purge_tracing(svn_error_t *err)
if (! err)
return svn_error_create(
SVN_ERR_ASSERTION_ONLY_TRACING_LINKS,
- svn_error_compose_create(
- svn_error__malfunction(TRUE, __FILE__, __LINE__,
- NULL /* ### say something? */),
- err),
+ svn_error__malfunction(TRUE, __FILE__, __LINE__,
+ NULL /* ### say something? */),
NULL);
/* Copy the current error except for its child error pointer
@@ -535,12 +560,6 @@ print_error(svn_error_t *err, FILE *stream, const char *prefix)
}
void
-svn_handle_error(svn_error_t *err, FILE *stream, svn_boolean_t fatal)
-{
- svn_handle_error2(err, stream, fatal, "svn: ");
-}
-
-void
svn_handle_error2(svn_error_t *err,
FILE *stream,
svn_boolean_t fatal,
@@ -559,11 +578,7 @@ svn_handle_error2(svn_error_t *err,
apr_array_header_t *empties;
svn_error_t *tmp_err;
- /* ### The rest of this file carefully avoids using svn_pool_*(),
- preferring apr_pool_*() instead. I can't remember why -- it may
- be an artifact of r843793, or it may be for some deeper reason --
- but I'm playing it safe and using apr_pool_*() here too. */
- apr_pool_create(&subpool, err->pool);
+ subpool = svn_pool_create(err->pool);
empties = apr_array_make(subpool, 0, sizeof(apr_status_t));
tmp_err = err;
@@ -611,17 +626,20 @@ svn_handle_error2(svn_error_t *err,
}
}
-
-void
-svn_handle_warning(FILE *stream, svn_error_t *err)
-{
- svn_handle_warning2(stream, err, "svn: ");
-}
-
void
-svn_handle_warning2(FILE *stream, svn_error_t *err, const char *prefix)
+svn_handle_warning2(FILE *stream, const svn_error_t *err, const char *prefix)
{
char buf[256];
+#ifdef SVN_DEBUG
+ const char *symbolic_name = svn_error_symbolic_name(err->apr_err);
+#endif
+
+#ifdef SVN_DEBUG
+ if (symbolic_name)
+ svn_error_clear(
+ svn_cmdline_fprintf(stream, err->pool, "%swarning: apr_err=%s\n",
+ prefix, symbolic_name));
+#endif
svn_error_clear(svn_cmdline_fprintf
(stream, err->pool,
@@ -632,7 +650,7 @@ svn_handle_warning2(FILE *stream, svn_error_t *err, const char *prefix)
}
const char *
-svn_err_best_message(svn_error_t *err, char *buf, apr_size_t bufsize)
+svn_err_best_message(const svn_error_t *err, char *buf, apr_size_t bufsize)
{
/* Skip over any trace records. */
while (svn_error__is_tracing_link(err))
@@ -672,19 +690,43 @@ svn_strerror(apr_status_t statcode, char *buf, apr_size_t bufsize)
return apr_strerror(statcode, buf, bufsize);
}
+#ifdef SVN_DEBUG
+/* Defines svn__errno and svn__apr_errno */
+#include "errorcode.inc"
+#endif
+
const char *
svn_error_symbolic_name(apr_status_t statcode)
{
const err_defn *defn;
+#ifdef SVN_DEBUG
+ int i;
+#endif /* SVN_DEBUG */
for (defn = error_table; defn->errdesc != NULL; ++defn)
if (defn->errcode == (svn_errno_t)statcode)
return defn->errname;
/* "No error" is not in error_table. */
- if (statcode == SVN_NO_ERROR)
+ if (statcode == APR_SUCCESS)
return "SVN_NO_ERROR";
+#ifdef SVN_DEBUG
+ /* Try errno.h symbols. */
+ /* Linear search through a sorted array */
+ for (i = 0; i < sizeof(svn__errno) / sizeof(svn__errno[0]); i++)
+ if (svn__errno[i].errcode == (int)statcode)
+ return svn__errno[i].errname;
+
+ /* Try APR errors. */
+ /* Linear search through a sorted array */
+ for (i = 0; i < sizeof(svn__apr_errno) / sizeof(svn__apr_errno[0]); i++)
+ if (svn__apr_errno[i].errcode == (int)statcode)
+ return svn__apr_errno[i].errname;
+#endif /* SVN_DEBUG */
+
+ /* ### TODO: do we need APR_* error macros? What about APR_TO_OS_ERROR()? */
+
return NULL;
}
@@ -741,6 +783,12 @@ svn_error_set_malfunction_handler(svn_error_malfunction_handler_t func)
return old_malfunction_handler;
}
+svn_error_malfunction_handler_t
+svn_error_get_malfunction_handler(void)
+{
+ return malfunction_handler;
+}
+
/* Note: Although this is a "__" function, it is in the public ABI, so
* we can never remove it or change its signature. */
svn_error_t *
diff --git a/subversion/libsvn_subr/errorcode.inc b/subversion/libsvn_subr/errorcode.inc
new file mode 100644
index 0000000..a02cd4e
--- /dev/null
+++ b/subversion/libsvn_subr/errorcode.inc
@@ -0,0 +1,271 @@
+/* This file was generated by build/generator/gen_base.py */
+
+static struct {
+ int errcode;
+ const char *errname;
+} svn__errno[] = {
+ { 1, "EPERM" },
+ { 2, "ENOENT" },
+ { 3, "ESRCH" },
+ { 4, "EINTR" },
+ { 5, "EIO" },
+ { 6, "ENXIO" },
+ { 7, "E2BIG" },
+ { 8, "ENOEXEC" },
+ { 9, "EBADF" },
+ { 10, "ECHILD" },
+ { 11, "EAGAIN" },
+ { 12, "ENOMEM" },
+ { 13, "EACCES" },
+ { 14, "EFAULT" },
+ { 15, "ENOTBLK" },
+ { 16, "EBUSY" },
+ { 17, "EEXIST" },
+ { 18, "EXDEV" },
+ { 19, "ENODEV" },
+ { 20, "ENOTDIR" },
+ { 21, "EISDIR" },
+ { 22, "EINVAL" },
+ { 23, "ENFILE" },
+ { 24, "EMFILE" },
+ { 25, "ENOTTY" },
+ { 26, "ETXTBSY" },
+ { 27, "EFBIG" },
+ { 28, "ENOSPC" },
+ { 29, "ESPIPE" },
+ { 30, "EROFS" },
+ { 31, "EMLINK" },
+ { 32, "EPIPE" },
+ { 33, "EDOM" },
+ { 34, "ERANGE" },
+ { 35, "EDEADLOCK" },
+ { 36, "ENAMETOOLONG" },
+ { 37, "ENOLCK" },
+ { 38, "ENOSYS" },
+ { 39, "ENOTEMPTY" },
+ { 40, "ELOOP" },
+ { 42, "ENOMSG" },
+ { 43, "EIDRM" },
+ { 44, "ECHRNG" },
+ { 45, "EL2NSYNC" },
+ { 46, "EL3HLT" },
+ { 47, "EL3RST" },
+ { 48, "ELNRNG" },
+ { 49, "EUNATCH" },
+ { 50, "ENOCSI" },
+ { 51, "EL2HLT" },
+ { 52, "EBADE" },
+ { 53, "EBADR" },
+ { 54, "EXFULL" },
+ { 55, "ENOANO" },
+ { 56, "EBADRQC" },
+ { 57, "EBADSLT" },
+ { 59, "EBFONT" },
+ { 60, "ENOSTR" },
+ { 61, "ENODATA" },
+ { 62, "ETIME" },
+ { 63, "ENOSR" },
+ { 64, "ENONET" },
+ { 65, "ENOPKG" },
+ { 66, "EREMOTE" },
+ { 67, "ENOLINK" },
+ { 68, "EADV" },
+ { 69, "ESRMNT" },
+ { 70, "ECOMM" },
+ { 71, "EPROTO" },
+ { 72, "EMULTIHOP" },
+ { 73, "EDOTDOT" },
+ { 74, "EBADMSG" },
+ { 75, "EOVERFLOW" },
+ { 76, "ENOTUNIQ" },
+ { 77, "EBADFD" },
+ { 78, "EREMCHG" },
+ { 79, "ELIBACC" },
+ { 80, "ELIBBAD" },
+ { 81, "ELIBSCN" },
+ { 82, "ELIBMAX" },
+ { 83, "ELIBEXEC" },
+ { 84, "EILSEQ" },
+ { 85, "ERESTART" },
+ { 86, "ESTRPIPE" },
+ { 87, "EUSERS" },
+ { 88, "ENOTSOCK" },
+ { 89, "EDESTADDRREQ" },
+ { 90, "EMSGSIZE" },
+ { 91, "EPROTOTYPE" },
+ { 92, "ENOPROTOOPT" },
+ { 93, "EPROTONOSUPPORT" },
+ { 94, "ESOCKTNOSUPPORT" },
+ { 95, "ENOTSUP" },
+ { 96, "EPFNOSUPPORT" },
+ { 97, "EAFNOSUPPORT" },
+ { 98, "EADDRINUSE" },
+ { 99, "EADDRNOTAVAIL" },
+ { 100, "ENETDOWN" },
+ { 101, "ENETUNREACH" },
+ { 102, "ENETRESET" },
+ { 103, "ECONNABORTED" },
+ { 104, "ECONNRESET" },
+ { 105, "ENOBUFS" },
+ { 106, "EISCONN" },
+ { 107, "ENOTCONN" },
+ { 108, "ESHUTDOWN" },
+ { 109, "ETOOMANYREFS" },
+ { 110, "ETIMEDOUT" },
+ { 111, "ECONNREFUSED" },
+ { 112, "EHOSTDOWN" },
+ { 113, "EHOSTUNREACH" },
+ { 114, "EALREADY" },
+ { 115, "EINPROGRESS" },
+ { 116, "ESTALE" },
+ { 117, "EUCLEAN" },
+ { 118, "ENOTNAM" },
+ { 119, "ENAVAIL" },
+ { 120, "EISNAM" },
+ { 121, "EREMOTEIO" },
+ { 122, "EDQUOT" }
+};
+
+static struct {
+ int errcode;
+ const char *errname;
+} svn__apr_errno[] = {
+ { 0, "APR_SUCCESS" },
+ { 10000, "SOCBASEERR" },
+ { 10001, "SOCEPERM" },
+ { 10003, "SOCESRCH" },
+ { 10004, "SOCEINTR" },
+ { 10006, "SOCENXIO" },
+ { 10009, "SOCEBADF" },
+ { 10013, "SOCEACCES" },
+ { 10014, "SOCEFAULT" },
+ { 10022, "SOCEINVAL" },
+ { 10024, "SOCEMFILE" },
+ { 10032, "SOCEPIPE" },
+ { 10035, "SOCEWOULDBLOCK" },
+ { 10036, "SOCEINPROGRESS" },
+ { 10037, "SOCEALREADY" },
+ { 10038, "SOCENOTSOCK" },
+ { 10039, "SOCEDESTADDRREQ" },
+ { 10040, "SOCEMSGSIZE" },
+ { 10041, "SOCEPROTOTYPE" },
+ { 10042, "SOCENOPROTOOPT" },
+ { 10043, "SOCEPROTONOSUPPORT" },
+ { 10044, "SOCESOCKTNOSUPPORT" },
+ { 10045, "SOCEOPNOTSUPP" },
+ { 10046, "SOCEPFNOSUPPORT" },
+ { 10047, "SOCEAFNOSUPPORT" },
+ { 10048, "SOCEADDRINUSE" },
+ { 10049, "SOCEADDRNOTAVAIL" },
+ { 10050, "SOCENETDOWN" },
+ { 10051, "SOCENETUNREACH" },
+ { 10052, "SOCENETRESET" },
+ { 10053, "SOCECONNABORTED" },
+ { 10054, "SOCECONNRESET" },
+ { 10055, "SOCENOBUFS" },
+ { 10056, "SOCEISCONN" },
+ { 10057, "SOCENOTCONN" },
+ { 10058, "SOCESHUTDOWN" },
+ { 10059, "SOCETOOMANYREFS" },
+ { 10060, "SOCETIMEDOUT" },
+ { 10061, "SOCECONNREFUSED" },
+ { 10062, "SOCELOOP" },
+ { 10063, "SOCENAMETOOLONG" },
+ { 10064, "SOCEHOSTDOWN" },
+ { 10065, "SOCEHOSTUNREACH" },
+ { 10066, "SOCENOTEMPTY" },
+ { 20000, "APR_OS_START_ERROR" },
+ { 20000, "APR_UTIL_ERRSPACE_SIZE" },
+ { 20001, "APR_ENOSTAT" },
+ { 20002, "APR_ENOPOOL" },
+ { 20004, "APR_EBADDATE" },
+ { 20005, "APR_EINVALSOCK" },
+ { 20006, "APR_ENOPROC" },
+ { 20007, "APR_ENOTIME" },
+ { 20008, "APR_ENODIR" },
+ { 20009, "APR_ENOLOCK" },
+ { 20010, "APR_ENOPOLL" },
+ { 20011, "APR_ENOSOCKET" },
+ { 20012, "APR_ENOTHREAD" },
+ { 20013, "APR_ENOTHDKEY" },
+ { 20014, "APR_EGENERAL" },
+ { 20015, "APR_ENOSHMAVAIL" },
+ { 20016, "APR_EBADIP" },
+ { 20017, "APR_EBADMASK" },
+ { 20019, "APR_EDSOOPEN" },
+ { 20020, "APR_EABSOLUTE" },
+ { 20021, "APR_ERELATIVE" },
+ { 20022, "APR_EINCOMPLETE" },
+ { 20023, "APR_EABOVEROOT" },
+ { 20024, "APR_EBADPATH" },
+ { 20025, "APR_EPATHWILD" },
+ { 20026, "APR_ESYMNOTFOUND" },
+ { 20027, "APR_EPROC_UNKNOWN" },
+ { 20028, "APR_ENOTENOUGHENTROPY" },
+ { 50000, "APR_OS_ERRSPACE_SIZE" },
+ { 70000, "APR_OS_START_STATUS" },
+ { 70001, "APR_INCHILD" },
+ { 70002, "APR_INPARENT" },
+ { 70003, "APR_DETACH" },
+ { 70004, "APR_NOTDETACH" },
+ { 70005, "APR_CHILD_DONE" },
+ { 70006, "APR_CHILD_NOTDONE" },
+ { 70007, "APR_TIMEUP" },
+ { 70008, "APR_INCOMPLETE" },
+ { 70012, "APR_BADCH" },
+ { 70013, "APR_BADARG" },
+ { 70014, "APR_EOF" },
+ { 70015, "APR_NOTFOUND" },
+ { 70019, "APR_ANONYMOUS" },
+ { 70020, "APR_FILEBASED" },
+ { 70021, "APR_KEYBASED" },
+ { 70022, "APR_EINIT" },
+ { 70023, "APR_ENOTIMPL" },
+ { 70024, "APR_EMISMATCH" },
+ { 70025, "APR_EBUSY" },
+ { 100000, "APR_UTIL_START_STATUS" },
+ { 100001, "APR_ENOKEY" },
+ { 100002, "APR_ENOIV" },
+ { 100003, "APR_EKEYTYPE" },
+ { 100004, "APR_ENOSPACE" },
+ { 100005, "APR_ECRYPT" },
+ { 100006, "APR_EPADDING" },
+ { 100007, "APR_EKEYLENGTH" },
+ { 100008, "APR_ENOCIPHER" },
+ { 100009, "APR_ENODIGEST" },
+ { 100010, "APR_ENOENGINE" },
+ { 100011, "APR_EINITENGINE" },
+ { 100012, "APR_EREINIT" },
+ { 120000, "APR_OS_START_USEERR" },
+ { 120000, "APR_OS_START_USERERR" },
+ { 620000, "APR_OS_START_CANONERR" },
+ { 620001, "APR_EACCES" },
+ { 620002, "APR_EEXIST" },
+ { 620003, "APR_ENAMETOOLONG" },
+ { 620004, "APR_ENOENT" },
+ { 620005, "APR_ENOTDIR" },
+ { 620006, "APR_ENOSPC" },
+ { 620007, "APR_ENOMEM" },
+ { 620008, "APR_EMFILE" },
+ { 620009, "APR_ENFILE" },
+ { 620010, "APR_EBADF" },
+ { 620011, "APR_EINVAL" },
+ { 620012, "APR_ESPIPE" },
+ { 620013, "APR_EAGAIN" },
+ { 620014, "APR_EINTR" },
+ { 620015, "APR_ENOTSOCK" },
+ { 620016, "APR_ECONNREFUSED" },
+ { 620017, "APR_EINPROGRESS" },
+ { 620018, "APR_ECONNABORTED" },
+ { 620019, "APR_ECONNRESET" },
+ { 620020, "APR_ETIMEDOUT" },
+ { 620021, "APR_EHOSTUNREACH" },
+ { 620022, "APR_ENETUNREACH" },
+ { 620023, "APR_EFTYPE" },
+ { 620024, "APR_EPIPE" },
+ { 620025, "APR_EXDEV" },
+ { 620026, "APR_ENOTEMPTY" },
+ { 620027, "APR_EAFNOSUPPORT" },
+ { 670000, "APR_OS_START_EAIERR" },
+ { 720000, "APR_OS_START_SYSERR" }
+};
diff --git a/subversion/libsvn_subr/fnv1a.c b/subversion/libsvn_subr/fnv1a.c
new file mode 100644
index 0000000..458bdd2
--- /dev/null
+++ b/subversion/libsvn_subr/fnv1a.c
@@ -0,0 +1,246 @@
+/*
+ * fnv1a.c : routines to create checksums derived from FNV-1a
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#define APR_WANT_BYTEFUNC
+
+#include <assert.h>
+#include <apr.h>
+
+#include "private/svn_subr_private.h"
+#include "fnv1a.h"
+
+/**
+ * See http://www.isthe.com/chongo/tech/comp/fnv/ for more info on FNV-1
+ */
+
+/* FNV-1 32 bit constants taken from
+ * http://www.isthe.com/chongo/tech/comp/fnv/
+ */
+#define FNV1_PRIME_32 0x01000193
+#define FNV1_BASE_32 2166136261U
+
+/* FNV-1a core implementation returning a 32 bit checksum over the first
+ * LEN bytes in INPUT. HASH is the checksum over preceding data (if any).
+ */
+static apr_uint32_t
+fnv1a_32(apr_uint32_t hash, const void *input, apr_size_t len)
+{
+ const unsigned char *data = input;
+ const unsigned char *end = data + len;
+
+ for (; data != end; ++data)
+ {
+ hash ^= *data;
+ hash *= FNV1_PRIME_32;
+ }
+
+ return hash;
+}
+
+/* Number of interleaved FVN-1a checksums we calculate for the modified
+ * checksum algorithm.
+ */
+enum { SCALING = 4 };
+
+/* FNV-1a core implementation updating 4 interleaved checksums in HASHES
+ * over the first LEN bytes in INPUT. This will only process multiples
+ * of 4 and return the number of bytes processed. LEN - ReturnValue < 4.
+ */
+static apr_size_t
+fnv1a_32x4(apr_uint32_t hashes[SCALING], const void *input, apr_size_t len)
+{
+ /* calculate SCALING interleaved FNV-1a hashes while the input
+ is large enough */
+ const unsigned char *data = input;
+ const unsigned char *end = data + len;
+ for (; data + SCALING <= end; data += SCALING)
+ {
+ hashes[0] ^= data[0];
+ hashes[0] *= FNV1_PRIME_32;
+ hashes[1] ^= data[1];
+ hashes[1] *= FNV1_PRIME_32;
+ hashes[2] ^= data[2];
+ hashes[2] *= FNV1_PRIME_32;
+ hashes[3] ^= data[3];
+ hashes[3] *= FNV1_PRIME_32;
+ }
+
+ return data - (const unsigned char *)input;
+}
+
+/* Combine interleaved HASHES plus LEN bytes from INPUT into a single
+ * 32 bit hash value and return that. LEN must be < 4.
+ */
+static apr_uint32_t
+finalize_fnv1a_32x4(apr_uint32_t hashes[SCALING],
+ const void *input,
+ apr_size_t len)
+{
+ char final_data[sizeof(apr_uint32_t) * SCALING + SCALING - 1];
+ apr_size_t i;
+ assert(len < SCALING);
+
+ for (i = 0; i < SCALING; ++i)
+ hashes[i] = htonl(hashes[i]);
+
+ /* run FNV-1a over the interleaved checksums plus the remaining
+ (odd-lotted) input data */
+ memcpy(final_data, hashes, sizeof(apr_uint32_t) * SCALING);
+ if (len)
+ memcpy(final_data + sizeof(apr_uint32_t) * SCALING, input, len);
+
+ return fnv1a_32(FNV1_BASE_32,
+ final_data,
+ sizeof(apr_uint32_t) * SCALING + len);
+}
+
+apr_uint32_t
+svn__fnv1a_32(const void *input, apr_size_t len)
+{
+ return fnv1a_32(FNV1_BASE_32, input, len);
+}
+
+apr_uint32_t
+svn__fnv1a_32x4(const void *input, apr_size_t len)
+{
+ apr_uint32_t hashes[SCALING]
+ = { FNV1_BASE_32, FNV1_BASE_32, FNV1_BASE_32, FNV1_BASE_32 };
+ apr_size_t processed = fnv1a_32x4(hashes, input, len);
+
+ return finalize_fnv1a_32x4(hashes,
+ (const char *)input + processed,
+ len - processed);
+}
+
+void
+svn__fnv1a_32x4_raw(apr_uint32_t hashes[4],
+ const void *input,
+ apr_size_t len)
+{
+ apr_size_t processed;
+
+ apr_size_t i;
+ for (i = 0; i < SCALING; ++i)
+ hashes[i] = FNV1_BASE_32;
+
+ /* Process full 16 byte chunks. */
+ processed = fnv1a_32x4(hashes, input, len);
+
+ /* Fold the remainder (if any) into the first hash. */
+ hashes[0] = fnv1a_32(hashes[0], (const char *)input + processed,
+ len - processed);
+}
+
+struct svn_fnv1a_32__context_t
+{
+ apr_uint32_t hash;
+};
+
+svn_fnv1a_32__context_t *
+svn_fnv1a_32__context_create(apr_pool_t *pool)
+{
+ svn_fnv1a_32__context_t *context = apr_palloc(pool, sizeof(*context));
+ context->hash = FNV1_BASE_32;
+
+ return context;
+}
+
+void
+svn_fnv1a_32__update(svn_fnv1a_32__context_t *context,
+ const void *data,
+ apr_size_t len)
+{
+ context->hash = fnv1a_32(context->hash, data, len);
+}
+
+apr_uint32_t
+svn_fnv1a_32__finalize(svn_fnv1a_32__context_t *context)
+{
+ return context->hash;
+}
+
+
+struct svn_fnv1a_32x4__context_t
+{
+ apr_uint32_t hashes[SCALING];
+ apr_size_t buffered;
+ char buffer[SCALING];
+};
+
+svn_fnv1a_32x4__context_t *
+svn_fnv1a_32x4__context_create(apr_pool_t *pool)
+{
+ svn_fnv1a_32x4__context_t *context = apr_palloc(pool, sizeof(*context));
+
+ context->hashes[0] = FNV1_BASE_32;
+ context->hashes[1] = FNV1_BASE_32;
+ context->hashes[2] = FNV1_BASE_32;
+ context->hashes[3] = FNV1_BASE_32;
+
+ context->buffered = 0;
+
+ return context;
+}
+
+void
+svn_fnv1a_32x4__update(svn_fnv1a_32x4__context_t *context,
+ const void *data,
+ apr_size_t len)
+{
+ apr_size_t processed;
+
+ if (context->buffered)
+ {
+ apr_size_t to_copy = SCALING - context->buffered;
+ if (to_copy > len)
+ {
+ memcpy(context->buffer + context->buffered, data, len);
+ context->buffered += len;
+ return;
+ }
+
+ memcpy(context->buffer + context->buffered, data, to_copy);
+ data = (const char *)data + to_copy;
+ len -= to_copy;
+
+ fnv1a_32x4(context->hashes, context->buffer, SCALING);
+ context->buffered = 0;
+ }
+
+ processed = fnv1a_32x4(context->hashes, data, len);
+ if (processed != len)
+ {
+ context->buffered = len - processed;
+ memcpy(context->buffer,
+ (const char*)data + processed,
+ len - processed);
+ }
+}
+
+apr_uint32_t
+svn_fnv1a_32x4__finalize(svn_fnv1a_32x4__context_t *context)
+{
+ return finalize_fnv1a_32x4(context->hashes,
+ context->buffer,
+ context->buffered);
+}
diff --git a/subversion/libsvn_subr/fnv1a.h b/subversion/libsvn_subr/fnv1a.h
new file mode 100644
index 0000000..4bb0b12
--- /dev/null
+++ b/subversion/libsvn_subr/fnv1a.h
@@ -0,0 +1,91 @@
+/*
+ * fnv1a.h : routines to create checksums derived from FNV-1a
+ *
+ * ====================================================================
+ * 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_LIBSVN_SUBR_FNV1A_H
+#define SVN_LIBSVN_SUBR_FNV1A_H
+
+#include <apr_pools.h>
+
+#include "svn_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Opaque FNV-1a checksum creation context type.
+ */
+typedef struct svn_fnv1a_32__context_t svn_fnv1a_32__context_t;
+
+/* Return a new FNV-1a checksum creation context allocated in POOL.
+ */
+svn_fnv1a_32__context_t *
+svn_fnv1a_32__context_create(apr_pool_t *pool);
+
+/* Feed LEN bytes from DATA into the FNV-1a checksum creation CONTEXT.
+ */
+void
+svn_fnv1a_32__update(svn_fnv1a_32__context_t *context,
+ const void *data,
+ apr_size_t len);
+
+/* Return the FNV-1a checksum over all data fed into CONTEXT.
+ */
+apr_uint32_t
+svn_fnv1a_32__finalize(svn_fnv1a_32__context_t *context);
+
+
+/* Opaque modified FNV-1a checksum creation context type.
+ */
+typedef struct svn_fnv1a_32x4__context_t svn_fnv1a_32x4__context_t;
+
+/* Return a new modified FNV-1a checksum creation context allocated in POOL.
+ */
+svn_fnv1a_32x4__context_t *
+svn_fnv1a_32x4__context_create(apr_pool_t *pool);
+
+/* Feed LEN bytes from DATA into the modified FNV-1a checksum creation
+ * CONTEXT.
+ */
+void
+svn_fnv1a_32x4__update(svn_fnv1a_32x4__context_t *context,
+ const void *data,
+ apr_size_t len);
+
+/* Return the modified FNV-1a checksum over all data fed into CONTEXT.
+ */
+apr_uint32_t
+svn_fnv1a_32x4__finalize(svn_fnv1a_32x4__context_t *context);
+
+/* Set HASHES to the 4 partial hash sums produced by the modified FVN-1a
+ * over INPUT of LEN bytes.
+ */
+void
+svn__fnv1a_32x4_raw(apr_uint32_t hashes[4],
+ const void *input,
+ apr_size_t len);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_SUBR_FNV1A_H */
diff --git a/subversion/libsvn_subr/gpg_agent.c b/subversion/libsvn_subr/gpg_agent.c
index 4dbf118..36fe30d 100644
--- a/subversion/libsvn_subr/gpg_agent.c
+++ b/subversion/libsvn_subr/gpg_agent.c
@@ -76,6 +76,7 @@
#include "svn_user.h"
#include "svn_dirent_uri.h"
+#include "auth.h"
#include "private/svn_auth_private.h"
#include "svn_private_config.h"
@@ -102,12 +103,46 @@ escape_blanks(char *str)
return str;
}
+#define is_hex(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'A' && (c) <= 'F'))
+#define hex_to_int(c) ((c) < '9' ? (c) - '0' : (c) - 'A' + 10)
+
+/* Modify STR in-place. '%', CR and LF are always percent escaped,
+ other characters may be percent escaped, always using uppercase
+ hex, see https://www.gnupg.org/documentation/manuals/assuan.pdf */
+static char *
+unescape_assuan(char *str)
+{
+ char *s = str;
+
+ while (s[0])
+ {
+ if (s[0] == '%' && is_hex(s[1]) && is_hex(s[2]))
+ {
+ char *s2 = s;
+ char val = hex_to_int(s[1]) * 16 + hex_to_int(s[2]);
+
+ s2[0] = val;
+ ++s2;
+
+ while (s2[2])
+ {
+ s2[0] = s2[2];
+ ++s2;
+ }
+ s2[0] = '\0';
+ }
+ ++s;
+ }
+
+ return str;
+}
+
/* Generate the string CACHE_ID_P based on the REALMSTRING allocated in
* RESULT_POOL using SCRATCH_POOL for temporary allocations. This is similar
* to other password caching mechanisms. */
static svn_error_t *
get_cache_id(const char **cache_id_p, const char *realmstring,
- apr_pool_t *scratch_pool, apr_pool_t *result_pool)
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
const char *cache_id = NULL;
svn_checksum_t *digest = NULL;
@@ -198,6 +233,7 @@ find_running_gpg_agent(int *new_sd, apr_pool_t *pool)
{
char *buffer;
char *gpg_agent_info = NULL;
+ char *gnupghome = NULL;
const char *socket_name = NULL;
const char *request = NULL;
const char *p = NULL;
@@ -208,22 +244,26 @@ find_running_gpg_agent(int *new_sd, apr_pool_t *pool)
/* This implements the method of finding the socket as described in
* the gpg-agent man page under the --use-standard-socket option.
- * The manage page misleadingly says the standard socket is
- * "named 'S.gpg-agent' located in the home directory." The standard
- * socket path is actually in the .gnupg directory in the home directory,
- * i.e. ~/.gnupg/S.gpg-agent */
+ * The manage page says the standard socket is "named 'S.gpg-agent' located
+ * in the home directory." GPG's home directory is either the directory
+ * specified by $GNUPGHOME or ~/.gnupg. */
gpg_agent_info = getenv("GPG_AGENT_INFO");
if (gpg_agent_info != NULL)
{
apr_array_header_t *socket_details;
/* For reference GPG_AGENT_INFO consists of 3 : separated fields.
- * The path to the socket, the pid of the gpg-agent process and
+ * The path to the socket, the pid of the gpg-agent process and
* finally the version of the protocol the agent talks. */
socket_details = svn_cstring_split(gpg_agent_info, ":", TRUE,
pool);
socket_name = APR_ARRAY_IDX(socket_details, 0, const char *);
}
+ else if ((gnupghome = getenv("GNUPGHOME")) != NULL)
+ {
+ const char *homedir = svn_dirent_canonicalize(gnupghome, pool);
+ socket_name = svn_dirent_join(homedir, "S.gpg-agent", pool);
+ }
else
{
const char *homedir = svn_user_get_homedir(pool);
@@ -231,8 +271,9 @@ find_running_gpg_agent(int *new_sd, apr_pool_t *pool)
if (!homedir)
return SVN_NO_ERROR;
+ homedir = svn_dirent_canonicalize(homedir, pool);
socket_name = svn_dirent_join_many(pool, homedir, ".gnupg",
- "S.gpg-agent", NULL);
+ "S.gpg-agent", SVN_VA_NULL);
}
if (socket_name != NULL)
@@ -377,7 +418,7 @@ password_get_gpg_agent(svn_boolean_t *done,
apr_pool_t *pool)
{
int sd;
- const char *p = NULL;
+ char *p = NULL;
char *ep = NULL;
char *buffer;
const char *request = NULL;
@@ -450,7 +491,7 @@ password_get_gpg_agent(svn_boolean_t *done,
if (ep != NULL)
*ep = '\0';
- *password = p;
+ *password = unescape_assuan(p);
*done = TRUE;
return SVN_NO_ERROR;
@@ -575,11 +616,10 @@ simple_gpg_agent_next_creds(void **credentials,
return SVN_NO_ERROR;
}
+ bye_gpg_agent(sd);
+
if (strncmp(buffer, "OK\n", 3) != 0)
- {
- bye_gpg_agent(sd);
- return SVN_NO_ERROR;
- }
+ return SVN_NO_ERROR;
/* TODO: This attempt limit hard codes it at 3 attempts (or 2 retries)
* which matches svn command line client's retry_limit as set in
@@ -629,7 +669,7 @@ static const svn_auth_provider_t gpg_agent_simple_provider = {
/* Public API */
void
-svn_auth_get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
+svn_auth__get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
diff --git a/subversion/libsvn_subr/hash.c b/subversion/libsvn_subr/hash.c
index 7868cac..f58c43c 100644
--- a/subversion/libsvn_subr/hash.c
+++ b/subversion/libsvn_subr/hash.c
@@ -40,6 +40,7 @@
#include "svn_pools.h"
#include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
#include "svn_private_config.h"
@@ -89,119 +90,156 @@
/*** Dumping and loading hash files. */
/* Implements svn_hash_read2 and svn_hash_read_incremental. */
-static svn_error_t *
-hash_read(apr_hash_t *hash, svn_stream_t *stream, const char *terminator,
- svn_boolean_t incremental, apr_pool_t *pool)
+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)
{
svn_stringbuf_t *buf;
svn_boolean_t eof;
- apr_size_t len, keylen, vallen;
- char c, *keybuf, *valbuf;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_size_t len;
+ char c;
- while (1)
- {
- svn_error_t *err;
- apr_uint64_t ui64;
+ svn_error_t *err;
+ apr_uint64_t ui64;
- svn_pool_clear(iterpool);
+ /* Read a key length line. Might be END, though. */
+ SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eof, pool));
- /* Read a key length line. Might be END, though. */
- SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eof, iterpool));
+ /* Check for the end of the hash. */
+ if ((!terminator && eof && buf->len == 0)
+ || (terminator && (strcmp(buf->data, terminator) == 0)))
+ {
+ entry->key = NULL;
+ entry->keylen = 0;
+ entry->val = NULL;
+ entry->vallen = 0;
- /* Check for the end of the hash. */
- if ((!terminator && eof && buf->len == 0)
- || (terminator && (strcmp(buf->data, terminator) == 0)))
- break;
+ return SVN_NO_ERROR;
+ }
- /* Check for unexpected end of stream */
- if (eof)
+ /* Check for unexpected end of stream */
+ if (eof)
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
+ _("Serialized hash missing terminator"));
+
+ if ((buf->len >= 3) && (buf->data[0] == 'K') && (buf->data[1] == ' '))
+ {
+ /* Get the length of the key */
+ err = svn_cstring_strtoui64(&ui64, buf->data + 2,
+ 0, APR_SIZE_MAX, 10);
+ if (err)
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, err,
+ _("Serialized hash malformed key length"));
+ entry->keylen = (apr_size_t)ui64;
+
+ /* Now read that much into a buffer. */
+ entry->key = apr_palloc(pool, entry->keylen + 1);
+ SVN_ERR(svn_stream_read_full(stream, entry->key, &entry->keylen));
+ entry->key[entry->keylen] = '\0';
+
+ /* Suck up extra newline after key data */
+ len = 1;
+ SVN_ERR(svn_stream_read_full(stream, &c, &len));
+ if (c != '\n')
return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash missing terminator"));
+ _("Serialized hash malformed key data"));
- if ((buf->len >= 3) && (buf->data[0] == 'K') && (buf->data[1] == ' '))
+ /* Read a val length line */
+ SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eof, pool));
+
+ if ((buf->data[0] == 'V') && (buf->data[1] == ' '))
{
- /* Get the length of the key */
+ /* Get the length of the val */
err = svn_cstring_strtoui64(&ui64, buf->data + 2,
0, APR_SIZE_MAX, 10);
if (err)
return svn_error_create(SVN_ERR_MALFORMED_FILE, err,
- _("Serialized hash malformed"));
- keylen = (apr_size_t)ui64;
+ _("Serialized hash malformed value length"));
+ entry->vallen = (apr_size_t)ui64;
- /* Now read that much into a buffer. */
- keybuf = apr_palloc(pool, keylen + 1);
- SVN_ERR(svn_stream_read(stream, keybuf, &keylen));
- keybuf[keylen] = '\0';
+ entry->val = apr_palloc(pool, entry->vallen + 1);
+ SVN_ERR(svn_stream_read_full(stream, entry->val, &entry->vallen));
+ entry->val[entry->vallen] = '\0';
- /* Suck up extra newline after key data */
+ /* Suck up extra newline after val data */
len = 1;
- SVN_ERR(svn_stream_read(stream, &c, &len));
+ SVN_ERR(svn_stream_read_full(stream, &c, &len));
if (c != '\n')
return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash malformed"));
-
- /* Read a val length line */
- SVN_ERR(svn_stream_readline(stream, &buf, "\n", &eof, iterpool));
+ _("Serialized hash malformed value data"));
+ }
+ else
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
+ _("Serialized hash malformed"));
+ }
+ else if (incremental && (buf->len >= 3)
+ && (buf->data[0] == 'D') && (buf->data[1] == ' '))
+ {
+ /* Get the length of the key */
+ err = svn_cstring_strtoui64(&ui64, buf->data + 2,
+ 0, APR_SIZE_MAX, 10);
+ if (err)
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, err,
+ _("Serialized hash malformed key length"));
+ entry->keylen = (apr_size_t)ui64;
+
+ /* Now read that much into a buffer. */
+ entry->key = apr_palloc(pool, entry->keylen + 1);
+ SVN_ERR(svn_stream_read_full(stream, entry->key, &entry->keylen));
+ entry->key[entry->keylen] = '\0';
+
+ /* Suck up extra newline after key data */
+ len = 1;
+ SVN_ERR(svn_stream_read_full(stream, &c, &len));
+ if (c != '\n')
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
+ _("Serialized hash malformed key data"));
- if ((buf->data[0] == 'V') && (buf->data[1] == ' '))
- {
- err = svn_cstring_strtoui64(&ui64, buf->data + 2,
- 0, APR_SIZE_MAX, 10);
- if (err)
- return svn_error_create(SVN_ERR_MALFORMED_FILE, err,
- _("Serialized hash malformed"));
- vallen = (apr_size_t)ui64;
+ /* Remove this hash entry. */
+ entry->vallen = 0;
+ entry->val = NULL;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
+ _("Serialized hash malformed"));
+ }
- valbuf = apr_palloc(iterpool, vallen + 1);
- SVN_ERR(svn_stream_read(stream, valbuf, &vallen));
- valbuf[vallen] = '\0';
+ return SVN_NO_ERROR;
+}
- /* Suck up extra newline after val data */
- len = 1;
- SVN_ERR(svn_stream_read(stream, &c, &len));
- if (c != '\n')
- return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash malformed"));
+static svn_error_t *
+hash_read(apr_hash_t *hash, svn_stream_t *stream, const char *terminator,
+ svn_boolean_t incremental, apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
- /* Add a new hash entry. */
- apr_hash_set(hash, keybuf, keylen,
- svn_string_ncreate(valbuf, vallen, pool));
- }
- else
- return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash malformed"));
- }
- else if (incremental && (buf->len >= 3)
- && (buf->data[0] == 'D') && (buf->data[1] == ' '))
- {
- /* Get the length of the key */
- err = svn_cstring_strtoui64(&ui64, buf->data + 2,
- 0, APR_SIZE_MAX, 10);
- if (err)
- return svn_error_create(SVN_ERR_MALFORMED_FILE, err,
- _("Serialized hash malformed"));
- keylen = (apr_size_t)ui64;
+ while (1)
+ {
+ svn_hash__entry_t entry;
- /* Now read that much into a buffer. */
- keybuf = apr_palloc(iterpool, keylen + 1);
- SVN_ERR(svn_stream_read(stream, keybuf, &keylen));
- keybuf[keylen] = '\0';
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_hash__read_entry(&entry, stream, terminator,
+ incremental, iterpool));
- /* Suck up extra newline after key data */
- len = 1;
- SVN_ERR(svn_stream_read(stream, &c, &len));
- if (c != '\n')
- return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash malformed"));
+ /* end of hash? */
+ if (entry.key == NULL)
+ break;
- /* Remove this hash entry. */
- apr_hash_set(hash, keybuf, keylen, NULL);
+ if (entry.val)
+ {
+ /* Add a new hash entry. */
+ apr_hash_set(hash, apr_pstrmemdup(pool, entry.key, entry.keylen),
+ entry.keylen,
+ svn_string_ncreate(entry.val, entry.vallen, pool));
}
else
{
- return svn_error_create(SVN_ERR_MALFORMED_FILE, NULL,
- _("Serialized hash malformed"));
+ /* Remove this hash entry. */
+ apr_hash_set(hash, entry.key, entry.keylen, NULL);
}
}
@@ -497,7 +535,7 @@ svn_hash_keys(apr_array_header_t **array,
for (hi = apr_hash_first(pool, hash); hi; hi = apr_hash_next(hi))
{
- APR_ARRAY_PUSH(*array, const char *) = svn__apr_hash_index_key(hi);
+ APR_ARRAY_PUSH(*array, const char *) = apr_hash_this_key(hi);
}
return SVN_NO_ERROR;
@@ -522,23 +560,6 @@ svn_hash_from_cstring_keys(apr_hash_t **hash_p,
}
-#if !APR_VERSION_AT_LEAST(1, 3, 0)
-void
-svn_hash__clear(apr_hash_t *hash)
-{
- apr_hash_index_t *hi;
- const void *key;
- apr_ssize_t klen;
-
- for (hi = apr_hash_first(NULL, hash); hi; hi = apr_hash_next(hi))
- {
- apr_hash_this(hi, &key, &klen, NULL);
- apr_hash_set(hash, key, klen, NULL);
- }
-}
-#endif
-
-
/*** Specialized getter APIs ***/
@@ -576,20 +597,16 @@ svn_hash__get_bool(apr_hash_t *hash, const char *key,
/*** Optimized hash function ***/
-/* Optimized version of apr_hashfunc_default in APR 1.4.5 and earlier.
- * It assumes that the CPU has 32-bit multiplications with high throughput
- * of at least 1 operation every 3 cycles. Latency is not an issue. Another
- * optimization is a mildly unrolled main loop and breaking the dependency
- * chain within the loop.
+/* apr_hashfunc_t optimized for the key that we use in SVN: paths and
+ * property names. Its primary goal is speed for keys of known length.
*
- * Note that most CPUs including Intel Atom, VIA Nano, ARM feature the
- * assumed pipelined multiplication circuitry. They can do one MUL every
- * or every other cycle.
- *
- * The performance is ultimately limited by the fact that most CPUs can
- * do only one LOAD and only one BRANCH operation per cycle. The best we
- * can do is to process one character per cycle - provided the processor
- * is wide enough to do 1 LOAD, COMPARE, BRANCH, MUL and ADD per cycle.
+ * Since strings tend to spawn large value spaces (usually differ in many
+ * bits with differences spanning a larger section of the key), we can be
+ * quite sloppy extracting a hash value. The more keys there are in a
+ * hash container, the more bits of the value returned by this function
+ * will be used. For a small number of string keys, choosing bits from any
+ * any fix location close to the tail of those keys would usually be good
+ * enough to prevent high collision rates.
*/
static unsigned int
hashfunc_compatible(const char *char_key, apr_ssize_t *klen)
@@ -600,37 +617,29 @@ hashfunc_compatible(const char *char_key, apr_ssize_t *klen)
apr_ssize_t i;
if (*klen == APR_HASH_KEY_STRING)
+ *klen = strlen(char_key);
+
+#if SVN_UNALIGNED_ACCESS_IS_OK
+ for (p = key, i = *klen; i >= 4; i-=4, p+=4)
{
- for (p = key; ; p+=4)
- {
- unsigned int new_hash = hash * 33 * 33 * 33 * 33;
- if (!p[0]) break;
- new_hash += p[0] * 33 * 33 * 33;
- if (!p[1]) break;
- new_hash += p[1] * 33 * 33;
- if (!p[2]) break;
- new_hash += p[2] * 33;
- if (!p[3]) break;
- hash = new_hash + p[3];
- }
- for (; *p; p++)
- hash = hash * 33 + *p;
-
- *klen = p - key;
+ apr_uint32_t chunk = *(const apr_uint32_t *)p;
+
+ /* the ">> 17" part gives upper bits in the chunk a chance to make
+ some impact as well */
+ hash = hash * 33 * 33 * 33 * 33 + chunk + (chunk >> 17);
}
- else
+#else
+ for (p = key, i = *klen; i >= 4; i-=4, p+=4)
{
- for (p = key, i = *klen; i >= 4; i-=4, p+=4)
- {
- hash = hash * 33 * 33 * 33 * 33
- + p[0] * 33 * 33 * 33
- + p[1] * 33 * 33
- + p[2] * 33
- + p[3];
- }
- for (; i; i--, p++)
- hash = hash * 33 + *p;
+ hash = hash * 33 * 33 * 33 * 33
+ + p[0] * 33 * 33 * 33
+ + p[1] * 33 * 33
+ + p[2] * 33
+ + p[3];
}
+#endif
+ for (; i; i--, p++)
+ hash = hash * 33 + *p;
return hash;
}
diff --git a/subversion/libsvn_subr/internal_statements.h b/subversion/libsvn_subr/internal_statements.h
index 3aa2169..1d0a3f8 100644
--- a/subversion/libsvn_subr/internal_statements.h
+++ b/subversion/libsvn_subr/internal_statements.h
@@ -1,4 +1,4 @@
-/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.8.13/subversion/libsvn_subr/token-map.h.
+/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_subr/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_INTERNAL_SAVEPOINT_SVN 0
diff --git a/subversion/libsvn_subr/io.c b/subversion/libsvn_subr/io.c
index e27411e..468dd17 100644
--- a/subversion/libsvn_subr/io.c
+++ b/subversion/libsvn_subr/io.c
@@ -47,8 +47,8 @@
#include <apr_portable.h>
#include <apr_md5.h>
-#ifdef WIN32
-#include <arch/win32/apr_arch_file_io.h>
+#if APR_HAVE_FCNTL_H
+#include <fcntl.h>
#endif
#include "svn_hash.h"
@@ -66,6 +66,8 @@
#include "private/svn_atomic.h"
#include "private/svn_io_private.h"
+#include "private/svn_utf_private.h"
+#include "private/svn_dep_compat.h"
#define SVN_SLEEP_ENV_VAR "SVN_I_LOVE_CORRUPTED_WORKING_COPIES_SO_DISABLE_SLEEP_FOR_TIMESTAMPS"
@@ -139,6 +141,49 @@
#endif
#endif
+#ifdef WIN32
+
+#if _WIN32_WINNT < 0x600 /* Does the SDK assume Windows Vista+? */
+typedef struct _FILE_RENAME_INFO {
+ BOOL ReplaceIfExists;
+ HANDLE RootDirectory;
+ DWORD FileNameLength;
+ WCHAR FileName[1];
+} FILE_RENAME_INFO, *PFILE_RENAME_INFO;
+
+typedef struct _FILE_DISPOSITION_INFO {
+ BOOL DeleteFile;
+} FILE_DISPOSITION_INFO, *PFILE_DISPOSITION_INFO;
+
+#define FileRenameInfo 3
+#define FileDispositionInfo 4
+#endif /* WIN32 < Vista */
+
+/* One-time initialization of the late bound Windows API functions. */
+static volatile svn_atomic_t win_dynamic_imports_state = 0;
+
+/* Pointer to GetFinalPathNameByHandleW function from kernel32.dll. */
+typedef DWORD (WINAPI *GETFINALPATHNAMEBYHANDLE)(
+ HANDLE hFile,
+ WCHAR *lpszFilePath,
+ DWORD cchFilePath,
+ DWORD dwFlags);
+
+typedef BOOL (WINAPI *SetFileInformationByHandle_t)(HANDLE hFile,
+ int FileInformationClass,
+ LPVOID lpFileInformation,
+ DWORD dwBufferSize);
+
+static GETFINALPATHNAMEBYHANDLE get_final_path_name_by_handle_proc = NULL;
+static SetFileInformationByHandle_t set_file_information_by_handle_proc = NULL;
+
+/* Forward declaration. */
+static svn_error_t * io_win_read_link(svn_string_t **dest,
+ const char *path,
+ apr_pool_t *pool);
+
+#endif
+
/* Forward declaration */
static apr_status_t
dir_is_empty(const char *dir, apr_pool_t *pool);
@@ -330,6 +375,25 @@ file_open(apr_file_t **f,
if (retry_on_failure)
{
+#ifdef WIN32
+ if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED))
+ {
+ if ((flag & (APR_CREATE | APR_EXCL)) == (APR_CREATE | APR_EXCL))
+ return status; /* Can't create if there is something */
+
+ if (flag & (APR_WRITE | APR_CREATE))
+ {
+ apr_finfo_t finfo;
+
+ if (!apr_stat(&finfo, fname_apr, SVN__APR_FINFO_READONLY, pool))
+ {
+ if (finfo.protection & APR_FREADONLY)
+ return status; /* Retrying won't fix this */
+ }
+ }
+ }
+#endif
+
WIN32_RETRY_LOOP(status, apr_file_open(f, fname_apr, flag, perm, pool));
}
return status;
@@ -660,7 +724,7 @@ svn_io_read_link(svn_string_t **dest,
const char *path,
apr_pool_t *pool)
{
-#ifdef HAVE_READLINK
+#if defined(HAVE_READLINK)
svn_string_t dest_apr;
const char *path_apr;
char buf[1025];
@@ -681,6 +745,8 @@ svn_io_read_link(svn_string_t **dest,
/* ### Cast needed, one of these interfaces is wrong */
return svn_utf_string_to_utf8((const svn_string_t **)dest, &dest_apr, pool);
+#elif defined(WIN32)
+ return io_win_read_link(dest, path, pool);
#else
return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Symbolic links are not supported on this "
@@ -959,10 +1025,9 @@ svn_io_copy_perms(const char *src,
svn_error_clear(err);
else
{
- const char *message;
- message = apr_psprintf(pool, _("Can't set permissions on '%s'"),
- svn_dirent_local_style(dst, pool));
- return svn_error_quick_wrap(err, message);
+ return svn_error_quick_wrapf(
+ err, _("Can't set permissions on '%s'"),
+ svn_dirent_local_style(dst, pool));
}
}
}
@@ -1130,8 +1195,13 @@ svn_io_make_dir_recursively(const char *path, apr_pool_t *pool)
SVN_ERR(cstring_from_utf8(&path_apr, path, pool));
apr_err = apr_dir_make_recursive(path_apr, APR_OS_DEFAULT, pool);
- WIN32_RETRY_LOOP(apr_err, apr_dir_make_recursive(path_apr,
- APR_OS_DEFAULT, pool));
+#ifdef WIN32
+ /* Don't retry on ERROR_ACCESS_DENIED, as that typically signals a
+ permanent error */
+ if (apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION))
+ WIN32_RETRY_LOOP(apr_err, apr_dir_make_recursive(path_apr,
+ APR_OS_DEFAULT, pool));
+#endif
if (apr_err)
return svn_error_wrap_apr(apr_err, _("Can't make directory '%s'"),
@@ -1140,9 +1210,11 @@ svn_io_make_dir_recursively(const char *path, apr_pool_t *pool)
return SVN_NO_ERROR;
}
-svn_error_t *svn_io_file_create(const char *file,
- const char *contents,
- apr_pool_t *pool)
+svn_error_t *
+svn_io_file_create_bytes(const char *file,
+ const void *contents,
+ apr_size_t length,
+ apr_pool_t *scratch_pool)
{
apr_file_t *f;
apr_size_t written;
@@ -1151,26 +1223,59 @@ svn_error_t *svn_io_file_create(const char *file,
SVN_ERR(svn_io_file_open(&f, file,
(APR_WRITE | APR_CREATE | APR_EXCL),
APR_OS_DEFAULT,
- pool));
- if (contents && *contents)
- err = svn_io_file_write_full(f, contents, strlen(contents),
- &written, pool);
+ scratch_pool));
+ if (length)
+ err = svn_io_file_write_full(f, contents, length, &written,
+ scratch_pool);
+ err = svn_error_compose_create(
+ err,
+ svn_io_file_close(f, scratch_pool));
- return svn_error_trace(
- svn_error_compose_create(err,
- svn_io_file_close(f, pool)));
+ if (err)
+ {
+ /* Our caller doesn't know if we left a file or not if we return
+ an error. Better to cleanup after ourselves if we created the
+ file. */
+ return svn_error_trace(
+ svn_error_compose_create(
+ err,
+ svn_io_remove_file2(file, TRUE, scratch_pool)));
+ }
+
+ return SVN_NO_ERROR;
}
-svn_error_t *svn_io_dir_file_copy(const char *src_path,
- const char *dest_path,
- const char *file,
- apr_pool_t *pool)
+svn_error_t *
+svn_io_file_create(const char *file,
+ const char *contents,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_io_file_create_bytes(file, contents,
+ contents ? strlen(contents)
+ : 0,
+ pool));
+}
+
+svn_error_t *
+svn_io_file_create_empty(const char *file,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_io_file_create_bytes(file, NULL, 0,
+ scratch_pool));
+}
+
+svn_error_t *
+svn_io_dir_file_copy(const char *src_path,
+ const char *dest_path,
+ const char *file,
+ apr_pool_t *pool)
{
const char *file_dest_path = svn_dirent_join(dest_path, file, pool);
const char *file_src_path = svn_dirent_join(src_path, file, pool);
- return svn_io_copy_file(file_src_path, file_dest_path, TRUE, pool);
+ return svn_error_trace(
+ svn_io_copy_file(file_src_path, file_dest_path, TRUE, pool));
}
@@ -1456,7 +1561,7 @@ get_default_file_perms(apr_fileperms_t *perms, apr_pool_t *scratch_pool)
/* Get the perms for a newly created file to find out what bits
should be set.
- Explictly delete the file because we want this file to be as
+ Explicitly delete the file because we want this file to be as
short-lived as possible since its presence means other
processes may have to try multiple names.
@@ -1528,7 +1633,8 @@ io_set_file_perms(const char *path,
status = apr_stat(&finfo, path_apr, APR_FINFO_PROT | APR_FINFO_LINK, pool);
if (status)
{
- if (ignore_enoent && APR_STATUS_IS_ENOENT(status))
+ if (ignore_enoent && (APR_STATUS_IS_ENOENT(status)
+ || SVN__APR_STATUS_IS_ENOTDIR(status)))
return SVN_NO_ERROR;
else if (status != APR_ENOTIMPL)
return svn_error_wrap_apr(status,
@@ -1640,27 +1746,13 @@ io_set_file_perms(const char *path,
#endif /* !WIN32 && !__OS2__ */
#ifdef WIN32
-#if APR_HAS_UNICODE_FS
-/* copy of the apr function utf8_to_unicode_path since apr doesn't export this one */
-static apr_status_t io_utf8_to_unicode_path(apr_wchar_t* retstr, apr_size_t retlen,
- const char* srcstr)
+/* This is semantically the same as the APR utf8_to_unicode_path
+ function, but reimplemented here because APR does not export it. */
+svn_error_t*
+svn_io__utf8_to_unicode_longpath(const WCHAR **result,
+ const char *source,
+ apr_pool_t *result_pool)
{
- /* TODO: The computations could preconvert the string to determine
- * the true size of the retstr, but that's a memory over speed
- * tradeoff that isn't appropriate this early in development.
- *
- * Allocate the maximum string length based on leading 4
- * characters of \\?\ (allowing nearly unlimited path lengths)
- * plus the trailing null, then transform /'s into \\'s since
- * the \\?\ form doesn't allow '/' path separators.
- *
- * Note that the \\?\ form only works for local drive paths, and
- * \\?\UNC\ is needed UNC paths.
- */
- apr_size_t srcremains = strlen(srcstr) + 1;
- apr_wchar_t *t = retstr;
- apr_status_t rv;
-
/* This is correct, we don't twist the filename if it will
* definitely be shorter than 248 characters. It merits some
* performance testing to see if this has any effect, but there
@@ -1675,95 +1767,331 @@ static apr_status_t io_utf8_to_unicode_path(apr_wchar_t* retstr, apr_size_t retl
* Note that a utf-8 name can never result in more wide chars
* than the original number of utf-8 narrow chars.
*/
- if (srcremains > 248) {
- if (srcstr[1] == ':' && (srcstr[2] == '/' || srcstr[2] == '\\')) {
- wcscpy (retstr, L"\\\\?\\");
- retlen -= 4;
- t += 4;
+ const WCHAR *prefix = NULL;
+ const int srclen = strlen(source);
+ WCHAR *buffer;
+
+ if (srclen > 248)
+ {
+ if (svn_ctype_isalpha(source[0]) && source[1] == ':'
+ && (source[2] == '/' || source[2] == '\\'))
+ {
+ /* This is an ordinary absolute path. */
+ prefix = L"\\\\?\\";
}
- else if ((srcstr[0] == '/' || srcstr[0] == '\\')
- && (srcstr[1] == '/' || srcstr[1] == '\\')
- && (srcstr[2] != '?')) {
- /* Skip the slashes */
- srcstr += 2;
- srcremains -= 2;
- wcscpy (retstr, L"\\\\?\\UNC\\");
- retlen -= 8;
- t += 8;
+ else if ((source[0] == '/' || source[0] == '\\')
+ && (source[1] == '/' || source[1] == '\\')
+ && source[2] != '?')
+ {
+ /* This is a UNC path */
+ source += 2; /* Skip the leading slashes */
+ prefix = L"\\\\?\\UNC\\";
}
}
- if (rv = apr_conv_utf8_to_ucs2(srcstr, &srcremains, t, &retlen)) {
- return (rv == APR_INCOMPLETE) ? APR_EINVAL : rv;
+ SVN_ERR(svn_utf__win32_utf8_to_utf16(&(const WCHAR*)buffer, source,
+ prefix, result_pool));
+
+ /* Convert slashes to backslashes because the \\?\ path format
+ does not allow backslashes as path separators. */
+ *result = buffer;
+ for (; *buffer; ++buffer)
+ {
+ if (*buffer == '/')
+ *buffer = '\\';
}
- if (srcremains) {
- return APR_ENAMETOOLONG;
+ return SVN_NO_ERROR;
+}
+
+/* This is semantically the same as the APR unicode_to_utf8_path
+ function, but reimplemented here because APR does not export it. */
+static svn_error_t *
+io_unicode_to_utf8_path(const char **result,
+ const WCHAR *source,
+ apr_pool_t *result_pool)
+{
+ const char *utf8_buffer;
+ char *buffer;
+
+ SVN_ERR(svn_utf__win32_utf16_to_utf8(&utf8_buffer, source,
+ NULL, result_pool));
+ if (!*utf8_buffer)
+ {
+ *result = utf8_buffer;
+ return SVN_NO_ERROR;
+ }
+
+ /* We know that the non-empty buffer returned from the UTF-16 to
+ UTF-8 conversion function is in fact writable. */
+ buffer = (char*)utf8_buffer;
+
+ /* Skip the leading 4 characters if the path begins \\?\, or substitute
+ * // for the \\?\UNC\ path prefix, allocating the maximum string
+ * length based on the remaining string, plus the trailing null.
+ * then transform \\'s back into /'s since the \\?\ form never
+ * allows '/' path separators, and APR always uses '/'s.
+ */
+ if (0 == strncmp(buffer, "\\\\?\\", 4))
+ {
+ buffer += 4;
+ if (0 == strncmp(buffer, "UNC\\", 4))
+ {
+ buffer += 2;
+ *buffer = '/';
+ }
}
- for (; *t; ++t)
- if (*t == L'/')
- *t = L'\\';
- return APR_SUCCESS;
+
+ *result = buffer;
+ for (; *buffer; ++buffer)
+ {
+ if (*buffer == '\\')
+ *buffer = '/';
+ }
+ return SVN_NO_ERROR;
}
-#endif
-static apr_status_t io_win_file_attrs_set(const char *fname,
- DWORD attributes,
- DWORD attr_mask,
- apr_pool_t *pool)
+static svn_error_t *
+io_win_file_attrs_set(const char *fname,
+ DWORD attributes,
+ DWORD attr_mask,
+ apr_pool_t *pool)
{
/* this is an implementation of apr_file_attrs_set() but one
that uses the proper Windows attributes instead of the apr
attributes. This way, we can apply any Windows file and
folder attributes even if apr doesn't implement them */
DWORD flags;
- apr_status_t rv;
-#if APR_HAS_UNICODE_FS
- apr_wchar_t wfname[APR_PATH_MAX];
-#endif
+ const WCHAR *wfname;
+
+ SVN_ERR(svn_io__utf8_to_unicode_longpath(&wfname, fname, pool));
+
+ flags = GetFileAttributesW(wfname);
+ if (flags == 0xFFFFFFFF)
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Can't get attributes of file '%s'"),
+ svn_dirent_local_style(fname, pool));
+
+ flags &= ~attr_mask;
+ flags |= (attributes & attr_mask);
-#if APR_HAS_UNICODE_FS
- IF_WIN_OS_IS_UNICODE
+ if (!SetFileAttributesW(wfname, flags))
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Can't set attributes of file '%s'"),
+ svn_dirent_local_style(fname, pool));
+
+ return SVN_NO_ERROR;;
+}
+
+static svn_error_t *win_init_dynamic_imports(void *baton, apr_pool_t *pool)
+{
+ HMODULE kernel32 = GetModuleHandleA("kernel32.dll");
+
+ if (kernel32)
{
- if (rv = io_utf8_to_unicode_path(wfname,
- sizeof(wfname) / sizeof(wfname[0]),
- fname))
- return rv;
- flags = GetFileAttributesW(wfname);
+ get_final_path_name_by_handle_proc = (GETFINALPATHNAMEBYHANDLE)
+ GetProcAddress(kernel32, "GetFinalPathNameByHandleW");
+
+ set_file_information_by_handle_proc = (SetFileInformationByHandle_t)
+ GetProcAddress(kernel32, "SetFileInformationByHandle");
}
-#endif
-#if APR_HAS_ANSI_FS
- ELSE_WIN_OS_IS_ANSI
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t * io_win_read_link(svn_string_t **dest,
+ const char *path,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_atomic__init_once(&win_dynamic_imports_state,
+ win_init_dynamic_imports, NULL, pool));
+
+ if (get_final_path_name_by_handle_proc)
+ {
+ DWORD rv;
+ apr_status_t status;
+ apr_file_t *file;
+ apr_os_file_t filehand;
+ WCHAR wdest[APR_PATH_MAX];
+ const char *data;
+
+ /* reserve one char for terminating zero. */
+ DWORD wdest_len = sizeof(wdest)/sizeof(wdest[0]) - 1;
+
+ status = apr_file_open(&file, path, APR_OPENINFO, APR_OS_DEFAULT, pool);
+
+ if (status)
+ return svn_error_wrap_apr(status,
+ _("Can't read contents of link"));
+
+ apr_os_file_get(&filehand, file);
+
+ rv = get_final_path_name_by_handle_proc(
+ filehand, wdest, wdest_len,
+ FILE_NAME_NORMALIZED | VOLUME_NAME_DOS);
+
+ /* Save error code. */
+ status = apr_get_os_error();
+
+ /* Close file/directory handle in any case. */
+ apr_file_close(file);
+
+ /* GetFinaPathNameByHandleW returns number of characters copied to
+ * output buffer. Returns zero on error. Returns required buffer size
+ * if supplied buffer is not enough. */
+ if (rv > wdest_len || rv == 0)
+ {
+ return svn_error_wrap_apr(status,
+ _("Can't read contents of link"));
+ }
+
+ /* GetFinaPathNameByHandleW doesn't add terminating NUL. */
+ wdest[rv] = 0;
+ SVN_ERR(io_unicode_to_utf8_path(&data, wdest, pool));
+
+ /* The result is already in the correct pool, so avoid copying
+ it to create the string. */
+ *dest = svn_string_create_empty(pool);
+ if (*data)
+ {
+ (*dest)->data = data;
+ (*dest)->len = strlen(data);
+ }
+
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Symbolic links are not supported on this "
+ "platform"));
+ }
+}
+
+/* Wrapper around Windows API function SetFileInformationByHandle() that
+ * returns APR status instead of boolean flag. */
+static apr_status_t
+win32_set_file_information_by_handle(HANDLE hFile,
+ int FileInformationClass,
+ LPVOID lpFileInformation,
+ DWORD dwBufferSize)
+{
+ svn_error_clear(svn_atomic__init_once(&win_dynamic_imports_state,
+ win_init_dynamic_imports,
+ NULL, NULL));
+
+ if (!set_file_information_by_handle_proc)
{
- flags = GetFileAttributesA(fname);
+ return SVN_ERR_UNSUPPORTED_FEATURE;
}
-#endif
- if (flags == 0xFFFFFFFF)
- return apr_get_os_error();
+ if (!set_file_information_by_handle_proc(hFile, FileInformationClass,
+ lpFileInformation,
+ dwBufferSize))
+ {
+ return apr_get_os_error();
+ }
- flags &= ~attr_mask;
- flags |= (attributes & attr_mask);
+ return APR_SUCCESS;
+}
-#if APR_HAS_UNICODE_FS
- IF_WIN_OS_IS_UNICODE
+svn_error_t *
+svn_io__win_delete_file_on_close(apr_file_t *file,
+ const char *path,
+ apr_pool_t *pool)
+{
+ FILE_DISPOSITION_INFO disposition_info;
+ HANDLE hFile;
+ apr_status_t status;
+
+ apr_os_file_get(&hFile, file);
+
+ disposition_info.DeleteFile = TRUE;
+
+ status = win32_set_file_information_by_handle(hFile, FileDispositionInfo,
+ &disposition_info,
+ sizeof(disposition_info));
+
+ if (status)
{
- rv = SetFileAttributesW(wfname, flags);
+ return svn_error_wrap_apr(status, _("Can't remove file '%s'"),
+ svn_dirent_local_style(path, pool));
}
-#endif
-#if APR_HAS_ANSI_FS
- ELSE_WIN_OS_IS_ANSI
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ WCHAR *w_final_abspath;
+ size_t path_len;
+ size_t rename_size;
+ FILE_RENAME_INFO *rename_info;
+ HANDLE hFile;
+ apr_status_t status;
+
+ apr_os_file_get(&hFile, file);
+
+ SVN_ERR(svn_io__utf8_to_unicode_longpath(
+ &w_final_abspath, svn_dirent_local_style(to_path,pool),
+ pool));
+
+ path_len = wcslen(w_final_abspath);
+ rename_size = sizeof(*rename_info) + sizeof(WCHAR) * path_len;
+
+ /* The rename info struct doesn't need hacks for long paths,
+ so no ugly escaping calls here */
+ rename_info = apr_pcalloc(pool, rename_size);
+ rename_info->ReplaceIfExists = TRUE;
+ rename_info->FileNameLength = path_len;
+ memcpy(rename_info->FileName, w_final_abspath, path_len * sizeof(WCHAR));
+
+ status = win32_set_file_information_by_handle(hFile, FileRenameInfo,
+ rename_info,
+ rename_size);
+
+ if (APR_STATUS_IS_EACCES(status) || APR_STATUS_IS_EEXIST(status))
+ {
+ /* Set the destination file writable because Windows will not allow
+ us to rename when final_abspath is read-only. */
+ SVN_ERR(svn_io_set_file_read_write(to_path, TRUE, pool));
+
+ status = win32_set_file_information_by_handle(hFile,
+ FileRenameInfo,
+ rename_info,
+ rename_size);
+ }
+
+ /* Windows returns Vista+ client accessing network share stored on Windows
+ Server 2003 returns ERROR_ACCESS_DENIED. The same happens when Vista+
+ client access Windows Server 2008 with disabled SMBv2 protocol.
+
+ So return SVN_ERR_UNSUPPORTED_FEATURE in this case like we do when
+ SetFileInformationByHandle() is not available and let caller to
+ handle it.
+
+ See "Access denied error on checkout-commit after updating to 1.9.X"
+ discussion on dev@s.a.o:
+ http://svn.haxx.se/dev/archive-2015-09/0054.shtml */
+ if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED))
{
- rv = SetFileAttributesA(fname, flags);
+ status = SVN_ERR_UNSUPPORTED_FEATURE;
}
-#endif
- if (rv == 0)
- return apr_get_os_error();
+ if (status)
+ {
+ return svn_error_wrap_apr(status, _("Can't move '%s' to '%s'"),
+ svn_dirent_local_style(from_path, pool),
+ svn_dirent_local_style(to_path, pool));
+ }
- return APR_SUCCESS;
+ return SVN_NO_ERROR;
}
-#endif
+#endif /* WIN32 */
svn_error_t *
svn_io_set_file_read_write_carefully(const char *path,
@@ -1798,7 +2126,8 @@ svn_io_set_file_read_only(const char *path,
pool);
if (status && status != APR_ENOTIMPL)
- if (!ignore_enoent || !APR_STATUS_IS_ENOENT(status))
+ if (!(ignore_enoent && (APR_STATUS_IS_ENOENT(status)
+ || SVN__APR_STATUS_IS_ENOTDIR(status))))
return svn_error_wrap_apr(status,
_("Can't set file '%s' read-only"),
svn_dirent_local_style(path, pool));
@@ -2089,6 +2418,35 @@ svn_io_file_lock2(const char *lock_file,
return svn_io_lock_open_file(lockfile_handle, exclusive, nonblocking, pool);
}
+svn_error_t *
+svn_io__file_lock_autocreate(const char *lock_file,
+ apr_pool_t *pool)
+{
+ svn_error_t *err
+ = svn_io_file_lock2(lock_file, TRUE, FALSE, pool);
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ /* No lock file? No big deal; these are just empty files anyway.
+ Create it and try again. */
+ svn_error_clear(err);
+
+ /* This file creation is racy.
+ We don't care as long as file gets created at all. */
+ err = svn_io_file_create_empty(lock_file, pool);
+ if (err && APR_STATUS_IS_EEXIST(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = NULL;
+ }
+
+ /* Finally, lock the file - if it exists */
+ if (!err)
+ err = svn_io_file_lock2(lock_file, TRUE, FALSE, pool);
+ }
+
+ return svn_error_trace(err);
+}
+
/* Data consistency/coherency operations. */
@@ -2098,11 +2456,12 @@ svn_error_t *svn_io_file_flush_to_disk(apr_file_t *file,
{
apr_os_file_t filehand;
+ /* ### In apr 1.4+ we could delegate most of this function to
+ apr_file_sync(). The only major difference is that this doesn't
+ contain the retry loop for EINTR on linux. */
+
/* First make sure that any user-space buffered data is flushed. */
- SVN_ERR(do_io_file_wrapper_cleanup(file, apr_file_flush(file),
- N_("Can't flush file '%s'"),
- N_("Can't flush stream"),
- pool));
+ SVN_ERR(svn_io_file_flush(file, pool));
apr_os_file_get(&filehand, file);
@@ -2119,7 +2478,11 @@ svn_error_t *svn_io_file_flush_to_disk(apr_file_t *file,
int rv;
do {
+#ifdef F_FULLFSYNC
+ rv = fcntl(filehand, F_FULLFSYNC, 0);
+#else
rv = fsync(filehand);
+#endif
} while (rv == -1 && APR_STATUS_IS_EINTR(apr_get_os_error()));
/* If the file is in a memory filesystem, fsync() may return
@@ -2159,36 +2522,34 @@ stringbuf_from_aprfile(svn_stringbuf_t **result,
svn_error_t *err;
svn_stringbuf_t *res = NULL;
apr_size_t res_initial_len = SVN__STREAM_CHUNK_SIZE;
- char *buf = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE);
+ char *buf;
/* If our caller wants us to check the size of the file for
efficient memory handling, we'll try to do so. */
if (check_size)
{
- apr_status_t status;
+ apr_finfo_t finfo = { 0 };
- /* If our caller didn't tell us the file's name, we'll ask APR
- if it knows the name. No problem if we can't figure it out. */
- if (! filename)
+ /* In some cases we get size 0 and no error for non files,
+ so we also check for the name. (= cached in apr_file_t) */
+ if (! apr_file_info_get(&finfo, APR_FINFO_SIZE, file) && finfo.fname)
{
- const char *filename_apr;
- if (! (status = apr_file_name_get(&filename_apr, file)))
- filename = filename_apr;
- }
-
- /* If we now know the filename, try to stat(). If we succeed,
- we know how to allocate our stringbuf. */
- if (filename)
- {
- apr_finfo_t finfo;
- if (! (status = apr_stat(&finfo, filename, APR_FINFO_MIN, pool)))
- res_initial_len = (apr_size_t)finfo.size;
+ /* we've got the file length. Now, read it in one go. */
+ svn_boolean_t eof;
+ res_initial_len = (apr_size_t)finfo.size;
+ res = svn_stringbuf_create_ensure(res_initial_len, pool);
+ SVN_ERR(svn_io_file_read_full2(file, res->data,
+ res_initial_len, &res->len,
+ &eof, pool));
+ res->data[res->len] = 0;
+
+ *result = res;
+ return SVN_NO_ERROR;
}
}
-
/* XXX: We should check the incoming data for being of type binary. */
-
+ buf = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE);
res = svn_stringbuf_create_ensure(res_initial_len, pool);
/* apr_file_read will not return data and eof in the same call. So this loop
@@ -2204,7 +2565,7 @@ stringbuf_from_aprfile(svn_stringbuf_t **result,
/* Having read all the data we *expect* EOF */
if (err && !APR_STATUS_IS_EOF(err->apr_err))
- return err;
+ return svn_error_trace(err);
svn_error_clear(err);
*result = res;
@@ -2269,11 +2630,6 @@ svn_io_remove_file2(const char *path,
SVN_ERR(cstring_from_utf8(&path_apr, path, scratch_pool));
apr_err = apr_file_remove(path_apr, scratch_pool);
- if (!apr_err
- || (ignore_enoent
- && (APR_STATUS_IS_ENOENT(apr_err)
- || SVN__APR_STATUS_IS_ENOTDIR(apr_err))))
- return SVN_NO_ERROR;
#ifdef WIN32
/* If the target is read only NTFS reports EACCESS and FAT/FAT32
@@ -2289,30 +2645,36 @@ svn_io_remove_file2(const char *path,
return SVN_NO_ERROR;
}
+ /* Check to make sure we aren't trying to delete a directory */
+ if (apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED)
+ || apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION))
{
- apr_status_t os_err = APR_TO_OS_ERROR(apr_err);
- /* Check to make sure we aren't trying to delete a directory */
- if (os_err == ERROR_ACCESS_DENIED || os_err == ERROR_SHARING_VIOLATION)
- {
- apr_finfo_t finfo;
+ apr_finfo_t finfo;
- if (!apr_stat(&finfo, path_apr, APR_FINFO_TYPE, scratch_pool)
- && finfo.filetype == APR_REG)
- {
- WIN32_RETRY_LOOP(apr_err, apr_file_remove(path_apr,
- scratch_pool));
- }
+ if (!apr_stat(&finfo, path_apr, APR_FINFO_TYPE, scratch_pool)
+ && finfo.filetype == APR_REG)
+ {
+ WIN32_RETRY_LOOP(apr_err, apr_file_remove(path_apr, scratch_pool));
}
-
- /* Just return the delete error */
}
-#endif
- if (apr_err)
- return svn_error_wrap_apr(apr_err, _("Can't remove file '%s'"),
- svn_dirent_local_style(path, scratch_pool));
+ /* Just return the delete error */
+#endif
- return SVN_NO_ERROR;
+ if (!apr_err)
+ {
+ return SVN_NO_ERROR;
+ }
+ else if (ignore_enoent && (APR_STATUS_IS_ENOENT(apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(apr_err)))
+ {
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ return svn_error_wrap_apr(apr_err, _("Can't remove file '%s'"),
+ svn_dirent_local_style(path, scratch_pool));
+ }
}
@@ -2367,7 +2729,8 @@ svn_io_remove_dir2(const char *path, svn_boolean_t ignore_enoent,
if (err)
{
/* if the directory doesn't exist, our mission is accomplished */
- if (ignore_enoent && APR_STATUS_IS_ENOENT(err->apr_err))
+ if (ignore_enoent && (APR_STATUS_IS_ENOENT(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)))
{
svn_error_clear(err);
return SVN_NO_ERROR;
@@ -2377,8 +2740,8 @@ svn_io_remove_dir2(const char *path, svn_boolean_t ignore_enoent,
for (hi = apr_hash_first(subpool, dirents); hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_io_dirent2_t *dirent = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_io_dirent2_t *dirent = apr_hash_this_val(hi);
const char *fullpath;
fullpath = svn_dirent_join(path, name, subpool);
@@ -2687,6 +3050,10 @@ svn_io_start_cmd3(apr_proc_t *cmd_proc,
{
const char *path_apr;
+ /* APR doesn't like our canonical path format for current directory */
+ if (path[0] == '\0')
+ path = ".";
+
SVN_ERR(cstring_from_utf8(&path_apr, path, pool));
apr_err = apr_procattr_dir_set(cmdproc_attr, path_apr);
if (apr_err)
@@ -3025,7 +3392,8 @@ svn_io_run_diff3_3(int *exitcode,
svn_config_get(cfg, &diff_cmd, SVN_CONFIG_SECTION_HELPERS,
SVN_CONFIG_OPTION_DIFF_CMD, SVN_CLIENT_DIFF);
SVN_ERR(cstring_to_utf8(&diff_utf8, diff_cmd, pool));
- args[i++] = apr_pstrcat(pool, "--diff-program=", diff_utf8, NULL);
+ args[i++] = apr_pstrcat(pool, "--diff-program=", diff_utf8,
+ SVN_VA_NULL);
#ifndef NDEBUG
++nargs;
#endif
@@ -3416,6 +3784,100 @@ svn_io_file_seek(apr_file_t *file, apr_seek_where_t where,
pool);
}
+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)
+{
+ const apr_size_t apr_default_buffer_size = 4096;
+ apr_size_t file_buffer_size = apr_default_buffer_size;
+ apr_off_t desired_offset = 0;
+ apr_off_t current = 0;
+ apr_off_t aligned_offset = 0;
+ svn_boolean_t fill_buffer = FALSE;
+
+ /* paranoia check: huge blocks on 32 bit machines may cause overflows */
+ SVN_ERR_ASSERT(block_size == (apr_size_t)block_size);
+
+ /* default for invalid block sizes */
+ if (block_size == 0)
+ block_size = apr_default_buffer_size;
+
+ file_buffer_size = apr_file_buffer_size_get(file);
+
+ /* don't try to set a buffer size for non-buffered files! */
+ if (file_buffer_size == 0)
+ {
+ aligned_offset = offset;
+ }
+ else if (file_buffer_size != (apr_size_t)block_size)
+ {
+ /* FILE has the wrong buffer size. correct it */
+ char *buffer;
+ file_buffer_size = (apr_size_t)block_size;
+ buffer = apr_palloc(apr_file_pool_get(file), file_buffer_size);
+ apr_file_buffer_set(file, buffer, file_buffer_size);
+
+ /* seek to the start of the block and cause APR to read 1 block */
+ aligned_offset = offset - (offset % block_size);
+ fill_buffer = TRUE;
+ }
+ else
+ {
+ aligned_offset = offset - (offset % file_buffer_size);
+
+ /* We have no way to determine the block start of an APR file.
+ Furthermore, we don't want to throw away the current buffer
+ contents. Thus, we re-align the buffer only if the CURRENT
+ offset definitely lies outside the desired, aligned buffer.
+ This covers the typical case of linear reads getting very
+ close to OFFSET but reading the previous / following block.
+
+ Note that ALIGNED_OFFSET may still be within the current
+ buffer and no I/O will actually happen in the FILL_BUFFER
+ section below.
+ */
+ SVN_ERR(svn_io_file_seek(file, APR_CUR, &current, scratch_pool));
+ fill_buffer = aligned_offset + file_buffer_size <= current
+ || current <= aligned_offset;
+ }
+
+ if (fill_buffer)
+ {
+ char dummy;
+ apr_status_t status;
+
+ /* seek to the start of the block and cause APR to read 1 block */
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &aligned_offset,
+ scratch_pool));
+ status = apr_file_getc(&dummy, file);
+
+ /* read may fail if we seek to or behind EOF. That's ok then. */
+ if (status != APR_SUCCESS && !APR_STATUS_IS_EOF(status))
+ return do_io_file_wrapper_cleanup(file, status,
+ N_("Can't read file '%s'"),
+ N_("Can't read stream"),
+ scratch_pool);
+ }
+
+ /* finally, seek to the OFFSET the caller wants */
+ desired_offset = offset;
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, scratch_pool));
+ if (desired_offset != offset)
+ return do_io_file_wrapper_cleanup(file, APR_EOF,
+ N_("Can't seek in file '%s'"),
+ N_("Can't seek in stream"),
+ scratch_pool);
+
+ /* return the buffer start that we (probably) enforced */
+ if (buffer_start)
+ *buffer_start = aligned_offset;
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_io_file_write(apr_file_t *file, const void *buf,
@@ -3428,6 +3890,16 @@ svn_io_file_write(apr_file_t *file, const void *buf,
pool));
}
+svn_error_t *
+svn_io_file_flush(apr_file_t *file,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(do_io_file_wrapper_cleanup(
+ file, apr_file_flush(file),
+ N_("Can't flush file '%s'"),
+ N_("Can't flush stream"),
+ scratch_pool));
+}
svn_error_t *
svn_io_file_write_full(apr_file_t *file, const void *buf,
@@ -3493,17 +3965,105 @@ svn_io_write_unique(const char **tmp_path,
err = svn_io_file_write_full(new_file, buf, nbytes, NULL, pool);
if (!err)
- err = svn_io_file_flush_to_disk(new_file, pool);
+ {
+ /* svn_io_file_flush_to_disk() can be very expensive, so use the
+ cheaper standard flush if the file is created as temporary file
+ anyway */
+ if (delete_when == svn_io_file_del_none)
+ err = svn_io_file_flush_to_disk(new_file, pool);
+ else
+ err = svn_io_file_flush(new_file, pool);
+ }
return svn_error_trace(
svn_error_compose_create(err,
svn_io_file_close(new_file, pool)));
}
+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)
+{
+ apr_file_t *tmp_file;
+ const char *tmp_path;
+ svn_error_t *err;
+ const char *dirname = svn_dirent_dirname(final_path, scratch_pool);
+
+ SVN_ERR(svn_io_open_unique_file3(&tmp_file, &tmp_path, dirname,
+ svn_io_file_del_none,
+ scratch_pool, scratch_pool));
+
+ err = svn_io_file_write_full(tmp_file, buf, nbytes, NULL, scratch_pool);
+
+ if (!err)
+ err = svn_io_file_flush_to_disk(tmp_file, scratch_pool);
+
+ err = svn_error_compose_create(err,
+ svn_io_file_close(tmp_file, scratch_pool));
+
+ if (!err && copy_perms_path)
+ err = svn_io_copy_perms(copy_perms_path, tmp_path, scratch_pool);
+
+ if (!err)
+ err = svn_io_file_rename(tmp_path, final_path, scratch_pool);
+
+ if (err)
+ {
+ err = svn_error_compose_create(err,
+ svn_io_remove_file2(tmp_path, TRUE,
+ scratch_pool));
+
+ return svn_error_createf(err->apr_err, err,
+ _("Can't write '%s' atomically"),
+ svn_dirent_local_style(final_path,
+ scratch_pool));
+ }
+
+#ifdef __linux__
+ {
+ /* Linux has the unusual feature that fsync() on a file is not
+ enough to ensure that a file's directory entries have been
+ flushed to disk; you have to fsync the directory as well.
+ On other operating systems, we'd only be asking for trouble
+ by trying to open and fsync a directory. */
+ apr_file_t *file;
+
+ SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT,
+ scratch_pool));
+ SVN_ERR(svn_io_file_flush_to_disk(file, scratch_pool));
+ SVN_ERR(svn_io_file_close(file, scratch_pool));
+ }
+#endif
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool)
{
+ /* Workaround for yet another APR issue with trunc.
+
+ If the APR file internally is in read mode, the current buffer pointer
+ will not be clipped to the valid data range. get_file_offset may then
+ return an invalid position *after* new data was written to it.
+
+ To prevent this, write 1 dummy byte just after the OFFSET at which we
+ will trunc it. That will force the APR file into write mode
+ internally and the flush() work-around below becomes affective. */
+ apr_off_t position = 0;
+
+ /* A frequent usage is OFFSET==0, in which case we don't need to preserve
+ any file content or file pointer. */
+ if (offset)
+ {
+ SVN_ERR(svn_io_file_seek(file, APR_CUR, &position, pool));
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool));
+ }
+ SVN_ERR(svn_io_file_putc(0, file, pool));
+
/* This is a work-around. APR would flush the write buffer
_after_ truncating the file causing now invalid buffered
data to be written behind OFFSET. */
@@ -3512,10 +4072,17 @@ svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool)
N_("Can't flush stream"),
pool));
- return do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset),
- N_("Can't truncate file '%s'"),
- N_("Can't truncate stream"),
- pool);
+ SVN_ERR(do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset),
+ N_("Can't truncate file '%s'"),
+ N_("Can't truncate stream"),
+ pool));
+
+ /* Restore original file pointer, if necessary.
+ It's currently at OFFSET. */
+ if (position < offset)
+ SVN_ERR(svn_io_file_seek(file, APR_SET, &position, pool));
+
+ return SVN_NO_ERROR;
}
@@ -3726,7 +4293,13 @@ dir_make(const char *path, apr_fileperms_t perm,
#endif
status = apr_dir_make(path_apr, perm, pool);
- WIN32_RETRY_LOOP(status, apr_dir_make(path_apr, perm, pool));
+
+#ifdef WIN32
+ /* Don't retry on ERROR_ACCESS_DENIED, as that typically signals a
+ permanent error */
+ if (status == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION))
+ WIN32_RETRY_LOOP(status, apr_dir_make(path_apr, perm, pool));
+#endif
if (status)
return svn_error_wrap_apr(status, _("Can't create directory '%s'"),
@@ -3740,22 +4313,26 @@ dir_make(const char *path, apr_fileperms_t perm,
APR_FILE_ATTR_HIDDEN,
APR_FILE_ATTR_HIDDEN,
pool);
-#else
- /* on Windows, use our wrapper so we can also set the
- FILE_ATTRIBUTE_NOT_CONTENT_INDEXED attribute */
- status = io_win_file_attrs_set(path_apr,
- FILE_ATTRIBUTE_HIDDEN |
- FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
- FILE_ATTRIBUTE_HIDDEN |
- FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
- pool);
-
-#endif
if (status)
return svn_error_wrap_apr(status, _("Can't hide directory '%s'"),
svn_dirent_local_style(path, pool));
+#else
+ /* on Windows, use our wrapper so we can also set the
+ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED attribute */
+ svn_error_t *err =
+ io_win_file_attrs_set(path_apr,
+ FILE_ATTRIBUTE_HIDDEN |
+ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
+ FILE_ATTRIBUTE_HIDDEN |
+ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
+ pool);
+ if (err)
+ return svn_error_createf(err->apr_err, err,
+ _("Can't hide directory '%s'"),
+ svn_dirent_local_style(path, pool));
+#endif /* WIN32 */
}
-#endif
+#endif /* APR_FILE_ATTR_HIDDEN */
/* Windows does not implement sgid. Skip here because retrieving
the file permissions via APR_FINFO_PROT | APR_FINFO_OWNER is documented
@@ -4173,7 +4750,6 @@ svn_io_read_version_file(int *version,
}
-
/* Do a byte-for-byte comparison of FILE1 and FILE2. */
static svn_error_t *
contents_identical_p(svn_boolean_t *identical_p,
@@ -4248,7 +4824,6 @@ contents_three_identical_p(svn_boolean_t *identical_p12,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
- apr_size_t bytes_read1, bytes_read2, bytes_read3;
char *buf1 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE);
char *buf2 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE);
char *buf3 = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE);
@@ -4258,7 +4833,6 @@ contents_three_identical_p(svn_boolean_t *identical_p12,
svn_boolean_t eof1 = FALSE;
svn_boolean_t eof2 = FALSE;
svn_boolean_t eof3 = FALSE;
- svn_boolean_t read_1, read_2, read_3;
SVN_ERR(svn_io_file_open(&file1_h, file1, APR_READ, APR_OS_DEFAULT,
scratch_pool));
@@ -4292,6 +4866,9 @@ contents_three_identical_p(svn_boolean_t *identical_p12,
|| (*identical_p23 && !eof2 && !eof3)
|| (*identical_p13 && !eof1 && !eof3)))
{
+ apr_size_t bytes_read1, bytes_read2, bytes_read3;
+ svn_boolean_t read_1, read_2, read_3;
+
read_1 = read_2 = read_3 = FALSE;
/* As long as a file is not at the end yet, and it is still
@@ -4686,12 +5263,9 @@ svn_io_open_unique_file3(apr_file_t **file,
svn_error_clear(err);
else
{
- const char *message;
- message = apr_psprintf(scratch_pool,
- _("Can't set permissions on '%s'"),
- svn_dirent_local_style(tempname,
- scratch_pool));
- return svn_error_quick_wrap(err, message);
+ return svn_error_quick_wrapf(
+ err, _("Can't set permissions on '%s'"),
+ svn_dirent_local_style(tempname, scratch_pool));
}
}
}
diff --git a/subversion/libsvn_subr/iter.c b/subversion/libsvn_subr/iter.c
index 45ec489..ebccb66 100644
--- a/subversion/libsvn_subr/iter.c
+++ b/subversion/libsvn_subr/iter.c
@@ -184,14 +184,8 @@ svn_iter__break(void)
return &internal_break_error;
}
-/* Note about the type casts: apr_hash_this() does not expect a const hash
- * index pointer even though it does not modify the hash index. In
- * Subversion we're trying to be const-correct, so these functions all take
- * a const hash index and we cast away the const when passing it down to
- * APR. (A compiler may warn about casting away 'const', but at least this
- * cast is explicit and gathered in one place.) */
-
-const void *svn__apr_hash_index_key(const apr_hash_index_t *hi)
+#if !APR_VERSION_AT_LEAST(1, 5, 0)
+const void *apr_hash_this_key(apr_hash_index_t *hi)
{
const void *key;
@@ -199,7 +193,7 @@ const void *svn__apr_hash_index_key(const apr_hash_index_t *hi)
return key;
}
-apr_ssize_t svn__apr_hash_index_klen(const apr_hash_index_t *hi)
+apr_ssize_t apr_hash_this_key_len(apr_hash_index_t *hi)
{
apr_ssize_t klen;
@@ -207,10 +201,11 @@ apr_ssize_t svn__apr_hash_index_klen(const apr_hash_index_t *hi)
return klen;
}
-void *svn__apr_hash_index_val(const apr_hash_index_t *hi)
+void *apr_hash_this_val(apr_hash_index_t *hi)
{
void *val;
apr_hash_this((apr_hash_index_t *)hi, NULL, NULL, &val);
return val;
}
+#endif
diff --git a/subversion/libsvn_subr/libsvn_subr.pc.in b/subversion/libsvn_subr/libsvn_subr.pc.in
new file mode 100644
index 0000000..309b697
--- /dev/null
+++ b/subversion/libsvn_subr/libsvn_subr.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_subr
+Description: Subversion General Utility Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: sqlite3
+Libs: -L${libdir} -lsvn_subr @SVN_XML_LIBS@ @SVN_ZLIB_LIBS@ @SVN_APR_MEMCACHE_LIBS@ @SVN_MAGIC_LIBS@ @SVN_INTL_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_subr/log.c b/subversion/libsvn_subr/log.c
index 9e0b22a..be6d77a 100644
--- a/subversion/libsvn_subr/log.c
+++ b/subversion/libsvn_subr/log.c
@@ -36,6 +36,7 @@
#include "svn_path.h"
#include "svn_pools.h"
#include "svn_string.h"
+#include "svn_hash.h"
#include "private/svn_log.h"
@@ -45,7 +46,7 @@ log_depth(svn_depth_t depth, apr_pool_t *pool)
{
if (depth == svn_depth_unknown)
return "";
- return apr_pstrcat(pool, " depth=", svn_depth_to_word(depth), (char *)NULL);
+ return apr_pstrcat(pool, " depth=", svn_depth_to_word(depth), SVN_VA_NULL);
}
static const char *
@@ -306,18 +307,18 @@ svn_log__get_file_revs(const char *path, svn_revnum_t start, svn_revnum_t end,
}
const char *
-svn_log__lock(const apr_array_header_t *paths,
+svn_log__lock(apr_hash_t *targets,
svn_boolean_t steal, apr_pool_t *pool)
{
- int i;
+ apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(pool);
svn_stringbuf_t *space_separated_paths = svn_stringbuf_create_empty(pool);
- for (i = 0; i < paths->nelts; i++)
+ for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
{
- const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ const char *path = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
- if (i != 0)
+ if (space_separated_paths->len)
svn_stringbuf_appendcstr(space_separated_paths, " ");
svn_stringbuf_appendcstr(space_separated_paths,
svn_path_uri_encode(path, iterpool));
@@ -329,18 +330,18 @@ svn_log__lock(const apr_array_header_t *paths,
}
const char *
-svn_log__unlock(const apr_array_header_t *paths,
+svn_log__unlock(apr_hash_t *targets,
svn_boolean_t break_lock, apr_pool_t *pool)
{
- int i;
+ apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(pool);
svn_stringbuf_t *space_separated_paths = svn_stringbuf_create_empty(pool);
- for (i = 0; i < paths->nelts; i++)
+ for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
{
- const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ const char *path = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
- if (i != 0)
+ if (space_separated_paths->len)
svn_stringbuf_appendcstr(space_separated_paths, " ");
svn_stringbuf_appendcstr(space_separated_paths,
svn_path_uri_encode(path, iterpool));
@@ -355,18 +356,18 @@ const char *
svn_log__lock_one_path(const char *path, svn_boolean_t steal,
apr_pool_t *pool)
{
- apr_array_header_t *paths = apr_array_make(pool, 1, sizeof(path));
- APR_ARRAY_PUSH(paths, const char *) = path;
- return svn_log__lock(paths, steal, pool);
+ apr_hash_t *paths = apr_hash_make(pool);
+ svn_hash_sets(paths, path, path);
+ return svn_log__lock(paths, steal, pool);
}
const char *
svn_log__unlock_one_path(const char *path, svn_boolean_t break_lock,
apr_pool_t *pool)
{
- apr_array_header_t *paths = apr_array_make(pool, 1, sizeof(path));
- APR_ARRAY_PUSH(paths, const char *) = path;
- return svn_log__unlock(paths, break_lock, pool);
+ apr_hash_t *paths = apr_hash_make(pool);
+ svn_hash_sets(paths, path, path);
+ return svn_log__unlock(paths, break_lock, pool);
}
const char *
diff --git a/subversion/libsvn_subr/macos_keychain.c b/subversion/libsvn_subr/macos_keychain.c
index f15324e..8ef0c29 100644
--- a/subversion/libsvn_subr/macos_keychain.c
+++ b/subversion/libsvn_subr/macos_keychain.c
@@ -32,6 +32,7 @@
#include "svn_config.h"
#include "svn_user.h"
+#include "auth.h"
#include "private/svn_auth_private.h"
#include "svn_private_config.h"
@@ -241,7 +242,7 @@ static const svn_auth_provider_t keychain_ssl_client_cert_pw_provider = {
/* Public API */
void
-svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
+svn_auth__get_keychain_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
@@ -251,7 +252,7 @@ svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
}
void
-svn_auth_get_keychain_ssl_client_cert_pw_provider
+svn_auth__get_keychain_ssl_client_cert_pw_provider
(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
diff --git a/subversion/libsvn_subr/magic.c b/subversion/libsvn_subr/magic.c
index 812a263..7f5e95d 100644
--- a/subversion/libsvn_subr/magic.c
+++ b/subversion/libsvn_subr/magic.c
@@ -33,6 +33,8 @@
#include "svn_types.h"
#include "svn_pools.h"
#include "svn_error.h"
+#include "svn_config.h"
+#include "svn_hash.h"
#include "svn_private_config.h"
@@ -61,14 +63,30 @@ close_magic_cookie(void *baton)
}
#endif
-void
+svn_error_t *
svn_magic__init(svn_magic__cookie_t **magic_cookie,
+ apr_hash_t *config,
apr_pool_t *result_pool)
{
-
svn_magic__cookie_t *mc = NULL;
#ifdef SVN_HAVE_LIBMAGIC
+ if (config)
+ {
+ svn_boolean_t enable;
+ svn_config_t *cfg = svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG);
+
+ SVN_ERR(svn_config_get_bool(cfg, &enable,
+ SVN_CONFIG_SECTION_MISCELLANY,
+ SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE,
+ TRUE));
+ if (!enable)
+ {
+ *magic_cookie = NULL;
+ return SVN_NO_ERROR;
+ }
+ }
+
mc = apr_palloc(result_pool, sizeof(*mc));
/* Initialise libmagic. */
@@ -97,6 +115,8 @@ svn_magic__init(svn_magic__cookie_t **magic_cookie,
#endif
*magic_cookie = mc;
+
+ return SVN_NO_ERROR;
}
svn_error_t *
diff --git a/subversion/libsvn_subr/md5.c b/subversion/libsvn_subr/md5.c
index a707a71..c47b4da 100644
--- a/subversion/libsvn_subr/md5.c
+++ b/subversion/libsvn_subr/md5.c
@@ -23,88 +23,36 @@
#include <apr_md5.h>
-#include "md5.h"
+
+#include "svn_checksum.h"
#include "svn_md5.h"
+#include "checksum.h"
-/* The MD5 digest for the empty string. */
-static const unsigned char svn_md5__empty_string_digest_array[] = {
- 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
- 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e
-};
-
-const unsigned char *
-svn_md5__empty_string_digest(void)
-{
- return svn_md5__empty_string_digest_array;
-}
-
-
-const char *
-svn_md5__digest_to_cstring_display(const unsigned char digest[],
- apr_pool_t *pool)
-{
- static const char *hex = "0123456789abcdef";
- char *str = apr_palloc(pool, (APR_MD5_DIGESTSIZE * 2) + 1);
- int i;
-
- for (i = 0; i < APR_MD5_DIGESTSIZE; i++)
- {
- str[i*2] = hex[digest[i] >> 4];
- str[i*2+1] = hex[digest[i] & 0x0f];
- }
- str[i*2] = '\0';
-
- return str;
-}
-
-
-const char *
-svn_md5__digest_to_cstring(const unsigned char digest[], apr_pool_t *pool)
-{
- static const unsigned char zeros_digest[APR_MD5_DIGESTSIZE] = { 0 };
-
- if (memcmp(digest, zeros_digest, APR_MD5_DIGESTSIZE) != 0)
- return svn_md5__digest_to_cstring_display(digest, pool);
- else
- return NULL;
-}
-
-
-svn_boolean_t
-svn_md5__digests_match(const unsigned char d1[], const unsigned char d2[])
-{
- static const unsigned char zeros[APR_MD5_DIGESTSIZE] = { 0 };
-
- return ((memcmp(d1, zeros, APR_MD5_DIGESTSIZE) == 0)
- || (memcmp(d2, zeros, APR_MD5_DIGESTSIZE) == 0)
- || (memcmp(d1, d2, APR_MD5_DIGESTSIZE) == 0));
-}
-
/* These are all deprecated, and just wrap the internal functions defined
above. */
const unsigned char *
svn_md5_empty_string_digest(void)
{
- return svn_md5__empty_string_digest();
+ return svn__empty_string_digest(svn_checksum_md5);
}
const char *
svn_md5_digest_to_cstring_display(const unsigned char digest[],
apr_pool_t *pool)
{
- return svn_md5__digest_to_cstring_display(digest, pool);
+ return svn__digest_to_cstring_display(digest, APR_MD5_DIGESTSIZE, pool);
}
const char *
svn_md5_digest_to_cstring(const unsigned char digest[], apr_pool_t *pool)
{
- return svn_md5__digest_to_cstring(digest, pool);
+ return svn__digest_to_cstring(digest, APR_MD5_DIGESTSIZE, pool);
}
svn_boolean_t
svn_md5_digests_match(const unsigned char d1[], const unsigned char d2[])
{
- return svn_md5__digests_match(d1, d2);
+ return svn__digests_match(d1, d2, APR_MD5_DIGESTSIZE);
}
diff --git a/subversion/libsvn_subr/mergeinfo.c b/subversion/libsvn_subr/mergeinfo.c
index 131fe59..e46d672 100644
--- a/subversion/libsvn_subr/mergeinfo.c
+++ b/subversion/libsvn_subr/mergeinfo.c
@@ -34,6 +34,7 @@
#include "svn_mergeinfo.h"
#include "private/svn_fspath.h"
#include "private/svn_mergeinfo_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
#include "svn_private_config.h"
@@ -48,7 +49,7 @@
of IN1 and IN2 when trying to combine ranges. If ranges with different
inheritability are combined (CONSIDER_INHERITANCE must be FALSE for this
to happen) the result is inheritable. If both ranges are inheritable the
- result is inheritable. Only and if both ranges are non-inheritable is
+ result is inheritable. And only if both ranges are non-inheritable
the result is non-inheritable.
Range overlapping detection algorithm from
@@ -98,9 +99,6 @@ parse_pathname(const char **input,
if (!last_colon)
return svn_error_create(SVN_ERR_MERGEINFO_PARSE_ERROR, NULL,
_("Pathname not terminated by ':'"));
- if (last_colon == *input)
- return svn_error_create(SVN_ERR_MERGEINFO_PARSE_ERROR, NULL,
- _("No pathname preceding ':'"));
/* Tolerate relative repository paths, but convert them to absolute.
### Efficiency? 1 string duplication here, 2 in canonicalize. */
@@ -269,7 +267,7 @@ combine_with_lastrange(const svn_merge_range_t *new_range,
{
/* We are not considering inheritance so we can merge intersecting
ranges of different inheritability. Of course if the ranges
- don't intersect at all we simply push NEW_RANGE only RANGELIST. */
+ don't intersect at all we simply push NEW_RANGE onto RANGELIST. */
if (combine_ranges(&combined_range, lastrange, new_range, FALSE))
{
*lastrange = combined_range;
@@ -303,7 +301,7 @@ combine_with_lastrange(const svn_merge_range_t *new_range,
{
case svn__no_intersection:
/* NEW_RANGE and *LASTRANGE *really* don't intersect so
- just push NEW_RANGE only RANGELIST. */
+ just push NEW_RANGE onto RANGELIST. */
APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) =
svn_merge_range_dup(new_range, result_pool);
sorted = (svn_sort_compare_ranges(&lastrange,
@@ -454,8 +452,7 @@ combine_with_lastrange(const svn_merge_range_t *new_range,
/* Some of the above cases might have put *RANGELIST out of
order, so re-sort.*/
if (!sorted)
- qsort(rangelist->elts, rangelist->nelts, rangelist->elt_size,
- svn_sort_compare_ranges);
+ svn_sort__array(rangelist, svn_sort_compare_ranges);
}
}
@@ -639,8 +636,7 @@ svn_rangelist__canonicalize(svn_rangelist_t *rangelist,
{
if (! is_rangelist_normalized(rangelist))
{
- qsort(rangelist->elts, rangelist->nelts, rangelist->elt_size,
- svn_sort_compare_ranges);
+ svn_sort__array(rangelist, svn_sort_compare_ranges);
SVN_ERR(svn_rangelist__combine_adjacent_ranges(rangelist, scratch_pool));
}
@@ -696,7 +692,11 @@ svn_rangelist__combine_adjacent_ranges(svn_rangelist_t *rangelist,
return SVN_NO_ERROR;
}
-/* revisionline -> PATHNAME COLON revisionlist */
+/* revisionline -> PATHNAME COLON revisionlist
+ *
+ * Parse one line of mergeinfo starting at INPUT, not reading beyond END,
+ * into HASH. Allocate the new entry in HASH deeply from HASH's pool.
+ */
static svn_error_t *
parse_revision_line(const char **input, const char *end, svn_mergeinfo_t hash,
apr_pool_t *scratch_pool)
@@ -753,12 +753,16 @@ parse_revision_line(const char **input, const char *end, svn_mergeinfo_t hash,
return SVN_NO_ERROR;
}
-/* top -> revisionline (NEWLINE revisionline)* */
+/* top -> revisionline (NEWLINE revisionline)*
+ *
+ * Parse mergeinfo starting at INPUT, not reading beyond END, into HASH.
+ * Allocate all the new entries in HASH deeply from HASH's pool.
+ */
static svn_error_t *
parse_top(const char **input, const char *end, svn_mergeinfo_t hash,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
while (*input < end)
{
@@ -871,7 +875,7 @@ adjust_remaining_ranges(svn_rangelist_t *rangelist,
______________________________________________
| |
M MODIFIED_RANGE N
- | (!inhertiable) |
+ | (!inheritable) |
|______________________________________________|
| |
O NEXT_RANGE P
@@ -882,7 +886,7 @@ adjust_remaining_ranges(svn_rangelist_t *rangelist,
_______________________________________________
| | | |
M MODIFIED_RANGE O NEXT_RANGE P NEW_RANGE N
- | (!inhertiable) | (inheritable)| (!inheritable)|
+ | (!inheritable) | (inheritable)| (!inheritable)|
|________________|______________|_______________|
*/
svn_merge_range_t *new_modified_range =
@@ -892,7 +896,7 @@ adjust_remaining_ranges(svn_rangelist_t *rangelist,
new_modified_range->inheritable = FALSE;
modified_range->end = next_range->start;
(*range_index)+=2;
- svn_sort__array_insert(&new_modified_range, rangelist,
+ svn_sort__array_insert(rangelist, &new_modified_range,
*range_index);
/* Recurse with the new range. */
adjust_remaining_ranges(rangelist, range_index, result_pool);
@@ -974,7 +978,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
if (res == 0)
{
/* Only when merging two non-inheritable ranges is the result also
- non-inheritable. In all other cases ensure an inheritiable
+ non-inheritable. In all other cases ensure an inheritable
result. */
if (range->inheritable || change->inheritable)
range->inheritable = TRUE;
@@ -1033,7 +1037,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
svn_merge_range_dup(range, result_pool);
range_copy->end = change->start;
range->start = change->start;
- svn_sort__array_insert(&range_copy, rangelist, i++);
+ svn_sort__array_insert(rangelist, &range_copy, i++);
}
else
{
@@ -1055,7 +1059,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
into RANGELIST. */
svn_merge_range_t *change_copy =
svn_merge_range_dup(change, result_pool);
- svn_sort__array_insert(&change_copy, rangelist, i++);
+ svn_sort__array_insert(rangelist, &change_copy, i++);
j++;
}
else if (change->end == range->start)
@@ -1074,7 +1078,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
a copy of CHANGE into RANGELIST. */
svn_merge_range_t *change_copy =
svn_merge_range_dup(change, result_pool);
- svn_sort__array_insert(&change_copy, rangelist, i);
+ svn_sort__array_insert(rangelist, &change_copy, i);
j++;
}
}
@@ -1106,7 +1110,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
svn_merge_range_dup(change, result_pool);
change_copy->end = range->start;
change->start = range->start;
- svn_sort__array_insert(&change_copy, rangelist, i++);
+ svn_sort__array_insert(rangelist, &change_copy, i++);
}
else
{
@@ -1149,7 +1153,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
range->start = change->start;
range->end = change->end;
range->inheritable = TRUE;
- svn_sort__array_insert(&range_copy, rangelist, ++i);
+ svn_sort__array_insert(rangelist, &range_copy, ++i);
j++;
}
}
@@ -1167,7 +1171,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
range_copy->end = change->end;
range_copy->inheritable = TRUE;
range->start = change->end;
- svn_sort__array_insert(&range_copy, rangelist, i++);
+ svn_sort__array_insert(rangelist, &range_copy, i++);
j++;
}
}
@@ -1182,7 +1186,7 @@ svn_rangelist_merge2(svn_rangelist_t *rangelist,
APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
svn_merge_range_t *change_copy = svn_merge_range_dup(change,
result_pool);
- svn_sort__array_insert(&change_copy, rangelist, rangelist->nelts);
+ svn_sort__array_insert(rangelist, &change_copy, rangelist->nelts);
}
return SVN_NO_ERROR;
@@ -1273,7 +1277,7 @@ svn_mergeinfo__set_inheritance(svn_mergeinfo_t mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
if (rangelist)
svn_rangelist__set_inheritance(rangelist, inheritable);
@@ -1871,14 +1875,14 @@ svn_mergeinfo_intersect2(svn_mergeinfo_t *mergeinfo,
/* ### TODO(reint): Do we care about the case when a path in one
### mergeinfo hash has inheritable mergeinfo, and in the other
- ### has non-inhertiable mergeinfo? It seems like that path
+ ### has non-inheritable mergeinfo? It seems like that path
### itself should really be an intersection, while child paths
### should not be... */
for (hi = apr_hash_first(scratch_pool, mergeinfo1);
hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist1 = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist1 = apr_hash_this_val(hi);
svn_rangelist_t *rangelist2;
svn_pool_clear(iterpool);
@@ -1999,9 +2003,9 @@ svn_mergeinfo_sort(svn_mergeinfo_t input, apr_pool_t *pool)
for (hi = apr_hash_first(pool, input); hi; hi = apr_hash_next(hi))
{
- apr_array_header_t *rl = svn__apr_hash_index_val(hi);
+ apr_array_header_t *rl = apr_hash_this_val(hi);
- qsort(rl->elts, rl->nelts, rl->elt_size, svn_sort_compare_ranges);
+ svn_sort__array(rl, svn_sort_compare_ranges);
}
return SVN_NO_ERROR;
}
@@ -2014,7 +2018,7 @@ svn_mergeinfo__canonicalize_ranges(svn_mergeinfo_t mergeinfo,
for (hi = apr_hash_first(scratch_pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- apr_array_header_t *rl = svn__apr_hash_index_val(hi);
+ apr_array_header_t *rl = apr_hash_this_val(hi);
SVN_ERR(svn_rangelist__canonicalize(rl, scratch_pool));
}
@@ -2033,8 +2037,8 @@ svn_mergeinfo_catalog_dup(svn_mergeinfo_catalog_t mergeinfo_catalog,
hi;
hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t val = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ svn_mergeinfo_t val = apr_hash_this_val(hi);
svn_hash_sets(new_mergeinfo_catalog, apr_pstrdup(pool, key),
svn_mergeinfo_dup(val, pool));
@@ -2051,9 +2055,9 @@ svn_mergeinfo_dup(svn_mergeinfo_t mergeinfo, apr_pool_t *pool)
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- apr_ssize_t pathlen = svn__apr_hash_index_klen(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ apr_ssize_t pathlen = apr_hash_this_key_len(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
apr_hash_set(new_mergeinfo, apr_pstrmemdup(pool, path, pathlen), pathlen,
svn_rangelist_dup(rangelist, pool));
@@ -2079,9 +2083,9 @@ svn_mergeinfo_inheritable2(svn_mergeinfo_t *output,
hi;
hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- apr_ssize_t keylen = svn__apr_hash_index_klen(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ apr_ssize_t keylen = apr_hash_this_key_len(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_rangelist_t *inheritable_rangelist;
if (!path || svn_path_compare_paths(path, key) == 0)
@@ -2120,28 +2124,24 @@ svn_rangelist_inheritable2(svn_rangelist_t **inheritable_rangelist,
|| !SVN_IS_VALID_REVNUM(end)
|| end < start)
{
+ /* We want all (non-inheritable or inheritable) ranges removed. */
int i;
- /* We want all non-inheritable ranges removed. */
+
for (i = 0; i < rangelist->nelts; i++)
{
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, i,
svn_merge_range_t *);
if (range->inheritable == inheritable)
{
- svn_merge_range_t *inheritable_range =
- apr_palloc(result_pool, sizeof(*inheritable_range));
- inheritable_range->start = range->start;
- inheritable_range->end = range->end;
- inheritable_range->inheritable = TRUE;
- APR_ARRAY_PUSH(*inheritable_rangelist,
- svn_merge_range_t *) = range;
+ APR_ARRAY_PUSH(*inheritable_rangelist, svn_merge_range_t *)
+ = svn_merge_range_dup(range, result_pool);
}
}
}
else
{
- /* We want only the non-inheritable ranges bound by START
- and END removed. */
+ /* We want only the (non-inheritable or inheritable) ranges
+ bound by START and END removed. */
svn_rangelist_t *ranges_inheritable =
svn_rangelist__initialize(start, end, inheritable, scratch_pool);
@@ -2158,17 +2158,18 @@ svn_rangelist_inheritable2(svn_rangelist_t **inheritable_rangelist,
svn_boolean_t
svn_mergeinfo__remove_empty_rangelists(svn_mergeinfo_t mergeinfo,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
svn_boolean_t removed_some_ranges = FALSE;
if (mergeinfo)
{
- for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
+ for (hi = apr_hash_first(scratch_pool, mergeinfo); hi;
+ hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
if (rangelist->nelts == 0)
{
@@ -2194,8 +2195,8 @@ svn_mergeinfo__remove_prefix_from_catalog(svn_mergeinfo_catalog_t *out_catalog,
for (hi = apr_hash_first(pool, in_catalog); hi; hi = apr_hash_next(hi))
{
- const char *original_path = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t value = svn__apr_hash_index_val(hi);
+ const char *original_path = apr_hash_this_key(hi);
+ svn_mergeinfo_t value = apr_hash_this_val(hi);
const char *new_path;
new_path = svn_fspath__skip_ancestor(prefix_path, original_path);
@@ -2222,8 +2223,8 @@ svn_mergeinfo__add_prefix_to_catalog(svn_mergeinfo_catalog_t *out_catalog,
hi;
hi = apr_hash_next(hi))
{
- const char *original_path = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t value = svn__apr_hash_index_val(hi);
+ const char *original_path = apr_hash_this_key(hi);
+ svn_mergeinfo_t value = apr_hash_this_val(hi);
if (original_path[0] == '/')
original_path++;
@@ -2253,8 +2254,8 @@ svn_mergeinfo__add_suffix_to_mergeinfo(svn_mergeinfo_t *out_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *fspath = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *fspath = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_hash_sets(*out_mergeinfo,
svn_fspath__join(fspath, suffix_relpath, result_pool),
@@ -2264,26 +2265,42 @@ svn_mergeinfo__add_suffix_to_mergeinfo(svn_mergeinfo_t *out_mergeinfo,
return SVN_NO_ERROR;
}
-svn_rangelist_t *
-svn_rangelist_dup(const svn_rangelist_t *rangelist, apr_pool_t *pool)
+/* Deep-copy an array of pointers to simple objects.
+ *
+ * Return a duplicate in POOL of the array ARRAY of pointers to objects
+ * of size OBJECT_SIZE bytes. Duplicate each object bytewise.
+ */
+static apr_array_header_t *
+ptr_array_dup(const apr_array_header_t *array,
+ size_t object_size,
+ apr_pool_t *pool)
{
- svn_rangelist_t *new_rl = apr_array_make(pool, rangelist->nelts,
- sizeof(svn_merge_range_t *));
+ apr_array_header_t *new_array = apr_array_make(pool, array->nelts,
+ sizeof(void *));
/* allocate target range buffer with a single operation */
- svn_merge_range_t *copy = apr_palloc(pool, sizeof(*copy) * rangelist->nelts);
+ char *copy = apr_palloc(pool, object_size * array->nelts);
+
+ /* for efficiency, directly address source and target reference buffers */
+ void **source = (void **)(array->elts);
+ void **target = (void **)(new_array->elts);
int i;
- /* fill it iteratively and link it into the range list */
- for (i = 0; i < rangelist->nelts; i++)
+ /* copy ranges iteratively and link them into the target range list */
+ for (i = 0; i < array->nelts; i++)
{
- memcpy(copy + i,
- APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *),
- sizeof(*copy));
- APR_ARRAY_PUSH(new_rl, svn_merge_range_t *) = copy + i;
+ target[i] = &copy[i * object_size];
+ memcpy(target[i], source[i], object_size);
}
+ new_array->nelts = array->nelts;
+
+ return new_array;
+}
- return new_rl;
+svn_rangelist_t *
+svn_rangelist_dup(const svn_rangelist_t *rangelist, apr_pool_t *pool)
+{
+ return ptr_array_dup(rangelist, sizeof(svn_merge_range_t), pool);
}
svn_merge_range_t *
@@ -2380,7 +2397,7 @@ svn_mergeinfo__get_range_endpoints(svn_revnum_t *youngest_rev,
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
if (rangelist->nelts)
{
@@ -2417,8 +2434,8 @@ svn_mergeinfo__filter_catalog_by_ranges(svn_mergeinfo_catalog_t *filtered_cat,
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t mergeinfo = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_mergeinfo_t mergeinfo = apr_hash_this_val(hi);
svn_mergeinfo_t filtered_mergeinfo;
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(&filtered_mergeinfo,
@@ -2462,8 +2479,8 @@ svn_mergeinfo__filter_mergeinfo_by_ranges(svn_mergeinfo_t *filtered_mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
if (rangelist->nelts)
{
@@ -2499,8 +2516,8 @@ svn_mergeinfo__adjust_mergeinfo_rangelists(svn_mergeinfo_t *adjusted_mergeinfo,
hi = apr_hash_next(hi))
{
int i;
- const char *path = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
svn_rangelist_t *adjusted_rangelist =
apr_array_make(result_pool, rangelist->nelts,
sizeof(svn_merge_range_t *));
@@ -2512,15 +2529,8 @@ svn_mergeinfo__adjust_mergeinfo_rangelists(svn_mergeinfo_t *adjusted_mergeinfo,
if (range->start + offset > 0 && range->end + offset > 0)
{
- if (range->start + offset < 0)
- range->start = 0;
- else
- range->start = range->start + offset;
-
- if (range->end + offset < 0)
- range->end = 0;
- else
- range->end = range->end + offset;
+ range->start = range->start + offset;
+ range->end = range->end + offset;
APR_ARRAY_PUSH(adjusted_rangelist, svn_merge_range_t *) =
range;
}
@@ -2546,7 +2556,7 @@ svn_mergeinfo__is_noninheritable(svn_mergeinfo_t mergeinfo,
hi;
hi = apr_hash_next(hi))
{
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
int i;
for (i = 0; i < rangelist->nelts; i++)
@@ -2600,7 +2610,7 @@ svn_mergeinfo__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p,
continue;
/* Prepend a leading slash to our path. */
- source_path = apr_pstrcat(pool, "/", segment->path, (char *)NULL);
+ source_path = apr_pstrcat(pool, "/", segment->path, SVN_VA_NULL);
/* See if we already stored ranges for this path. If not, make
a new list. */
@@ -2643,7 +2653,7 @@ svn_rangelist__merge_many(svn_rangelist_t *merged_rangelist,
hi;
hi = apr_hash_next(hi))
{
- svn_rangelist_t *subtree_rangelist = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *subtree_rangelist = apr_hash_this_val(hi);
svn_pool_clear(iterpool);
SVN_ERR(svn_rangelist_merge2(merged_rangelist, subtree_rangelist,
diff --git a/subversion/libsvn_subr/mutex.c b/subversion/libsvn_subr/mutex.c
index 04988eb..3c348df 100644
--- a/subversion/libsvn_subr/mutex.c
+++ b/subversion/libsvn_subr/mutex.c
@@ -21,9 +21,32 @@
* ====================================================================
*/
+#include <apr_portable.h>
+
#include "svn_private_config.h"
+#include "private/svn_atomic.h"
#include "private/svn_mutex.h"
+/* With CHECKED set to TRUE, LOCKED and OWNER must be set *after* acquiring
+ * the MUTEX and be reset *before* releasing it again. This is sufficient
+ * because we only want to check whether the current thread already holds
+ * the lock. And the current thread cannot be acquiring / releasing a lock
+ * *while* checking for recursion at the same time.
+ */
+struct svn_mutex__t
+{
+#if APR_HAS_THREADS
+
+ apr_thread_mutex_t *mutex;
+
+#else
+
+ /* Truly empty structs are not allowed. */
+ int dummy;
+
+#endif
+};
+
svn_error_t *
svn_mutex__init(svn_mutex__t **mutex_p,
svn_boolean_t mutex_required,
@@ -33,20 +56,21 @@ svn_mutex__init(svn_mutex__t **mutex_p,
strictly necessary if APR_HAS_THREADS has not been set */
*mutex_p = NULL;
-#if APR_HAS_THREADS
if (mutex_required)
{
- apr_thread_mutex_t *apr_mutex;
+ svn_mutex__t *mutex = apr_pcalloc(result_pool, sizeof(*mutex));
+
+#if APR_HAS_THREADS
apr_status_t status =
- apr_thread_mutex_create(&apr_mutex,
+ apr_thread_mutex_create(&mutex->mutex,
APR_THREAD_MUTEX_DEFAULT,
result_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't create mutex"));
+#endif
- *mutex_p = apr_mutex;
+ *mutex_p = mutex;
}
-#endif
return SVN_NO_ERROR;
}
@@ -54,14 +78,14 @@ svn_mutex__init(svn_mutex__t **mutex_p,
svn_error_t *
svn_mutex__lock(svn_mutex__t *mutex)
{
-#if APR_HAS_THREADS
if (mutex)
{
- apr_status_t status = apr_thread_mutex_lock(mutex);
+#if APR_HAS_THREADS
+ apr_status_t status = apr_thread_mutex_lock(mutex->mutex);
if (status)
return svn_error_wrap_apr(status, _("Can't lock mutex"));
- }
#endif
+ }
return SVN_NO_ERROR;
}
@@ -70,14 +94,14 @@ svn_error_t *
svn_mutex__unlock(svn_mutex__t *mutex,
svn_error_t *err)
{
-#if APR_HAS_THREADS
if (mutex)
{
- apr_status_t status = apr_thread_mutex_unlock(mutex);
+#if APR_HAS_THREADS
+ apr_status_t status = apr_thread_mutex_unlock(mutex->mutex);
if (status && !err)
return svn_error_wrap_apr(status, _("Can't unlock mutex"));
- }
#endif
+ }
return err;
}
diff --git a/subversion/libsvn_subr/named_atomic.c b/subversion/libsvn_subr/named_atomic.c
deleted file mode 100644
index cd58bbb..0000000
--- a/subversion/libsvn_subr/named_atomic.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * svn_named_atomic.c: routines for machine-wide named atomics.
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-#include "private/svn_named_atomic.h"
-
-#include <apr_global_mutex.h>
-#include <apr_mmap.h>
-
-#include "svn_private_config.h"
-#include "private/svn_atomic.h"
-#include "private/svn_mutex.h"
-#include "svn_pools.h"
-#include "svn_dirent_uri.h"
-#include "svn_io.h"
-
-/* Implementation aspects.
- *
- * We use a single shared memory block (memory mapped file) that will be
- * created by the first user and merely mapped by all subsequent ones.
- * The memory block contains an short header followed by a fixed-capacity
- * array of named atomics. The number of entries currently in use is stored
- * in the header part.
- *
- * Finding / creating the MMAP object as well as adding new array entries
- * is being guarded by an APR global mutex. Since releasing the MMAP
- * structure and closing the underlying does not affect other users of the
- * same, cleanup will not be synchronized.
- *
- * The array is append-only. Once a process mapped the block into its
- * address space, it may freely access any of the used entries. However,
- * it must synchronize access to the volatile data within the entries.
- * On Windows and where otherwise supported by GCC, lightweight "lock-free"
- * synchronization will be used. Other targets serialize all access using
- * a global mutex.
- *
- * Atomics will be identified by their name (a short string) and lookup
- * takes linear time. But even that takes only about 10 microseconds for a
- * full array scan -- which is in the same order of magnitude than e.g. a
- * single global mutex lock / unlock pair.
- */
-
-/* Capacity of our shared memory object, i.e. max number of named atomics
- * that may be created. Should have the form 2**N - 1.
- */
-#define MAX_ATOMIC_COUNT 1023
-
-/* We choose the size of a single named atomic object to fill a complete
- * cache line (on most architectures). Thereby, we minimize the cache
- * sync. overhead between different CPU cores.
- */
-#define CACHE_LINE_LENGTH 64
-
-/* We need 8 bytes for the actual value and the remainder is used to
- * store the NUL-terminated name.
- *
- * Must not be smaller than SVN_NAMED_ATOMIC__MAX_NAME_LENGTH.
- */
-#define MAX_NAME_LENGTH (CACHE_LINE_LENGTH - sizeof(apr_int64_t) - 1)
-
-/* Particle that will be appended to the namespace name to form the
- * name of the mutex / lock file used for that namespace.
- */
-#define MUTEX_NAME_SUFFIX ".mutex"
-
-/* Particle that will be appended to the namespace name to form the
- * name of the shared memory file that backs that namespace.
- */
-#define SHM_NAME_SUFFIX ".shm"
-
-/* Platform-dependent implementations of our basic atomic operations.
- * NA_SYNCHRONIZE(op) will ensure that the OP gets executed atomically.
- * This will be zero-overhead if OP itself is already atomic.
- *
- * (We don't call it SYNCHRONIZE because Windows has a preprocess macro by
- * that name.)
- *
- * The default implementation will use the same mutex for initialization
- * as well as any type of data access. This is quite expensive and we
- * can do much better on most platforms.
- */
-#if defined(WIN32) && ((_WIN32_WINNT >= 0x0502) || defined(InterlockedExchangeAdd64))
-
-/* Interlocked API / intrinsics guarantee full data synchronization
- */
-#define synched_read(mem) *mem
-#define synched_write(mem, value) InterlockedExchange64(mem, value)
-#define synched_add(mem, delta) InterlockedExchangeAdd64(mem, delta)
-#define synched_cmpxchg(mem, value, comperand) \
- InterlockedCompareExchange64(mem, value, comperand)
-
-#define NA_SYNCHRONIZE(_atomic,op) op;
-#define NA_SYNCHRONIZE_IS_FAST TRUE
-
-#elif SVN_HAS_ATOMIC_BUILTINS
-
-/* GCC provides atomic intrinsics for most common CPU types
- */
-#define synched_read(mem) *mem
-#define synched_write(mem, value) __sync_lock_test_and_set(mem, value)
-#define synched_add(mem, delta) __sync_add_and_fetch(mem, delta)
-#define synched_cmpxchg(mem, value, comperand) \
- __sync_val_compare_and_swap(mem, comperand, value)
-
-#define NA_SYNCHRONIZE(_atomic,op) op;
-#define NA_SYNCHRONIZE_IS_FAST TRUE
-
-#else
-
-/* Default implementation
- */
-static apr_int64_t
-synched_read(volatile apr_int64_t *mem)
-{
- return *mem;
-}
-
-static apr_int64_t
-synched_write(volatile apr_int64_t *mem, apr_int64_t value)
-{
- apr_int64_t old_value = *mem;
- *mem = value;
-
- return old_value;
-}
-
-static apr_int64_t
-synched_add(volatile apr_int64_t *mem, apr_int64_t delta)
-{
- return *mem += delta;
-}
-
-static apr_int64_t
-synched_cmpxchg(volatile apr_int64_t *mem,
- apr_int64_t value,
- apr_int64_t comperand)
-{
- apr_int64_t old_value = *mem;
- if (old_value == comperand)
- *mem = value;
-
- return old_value;
-}
-
-#define NA_SYNCHRONIZE(_atomic,op)\
- do{\
- SVN_ERR(lock(_atomic->mutex));\
- op;\
- SVN_ERR(unlock(_atomic->mutex,SVN_NO_ERROR));\
- }while(0)
-
-#define NA_SYNCHRONIZE_IS_FAST FALSE
-
-#endif
-
-/* Structure describing a single atomic: its VALUE and NAME.
- */
-struct named_atomic_data_t
-{
- volatile apr_int64_t value;
- char name[MAX_NAME_LENGTH + 1];
-};
-
-/* Content of our shared memory buffer. COUNT is the number
- * of used entries in ATOMICS. Insertion is append-only.
- * PADDING is used to align the header information with the
- * atomics to create a favorable data alignment.
- */
-struct shared_data_t
-{
- volatile apr_uint32_t count;
- char padding [sizeof(struct named_atomic_data_t) - sizeof(apr_uint32_t)];
-
- struct named_atomic_data_t atomics[MAX_ATOMIC_COUNT];
-};
-
-/* Structure combining all objects that we need for access serialization.
- */
-struct mutex_t
-{
- /* Inter-process sync. is handled by through lock file. */
- apr_file_t *lock_file;
-
- /* Pool to be used with lock / unlock functions */
- apr_pool_t *pool;
-};
-
-/* API structure combining the atomic data and the access mutex
- */
-struct svn_named_atomic__t
-{
- /* pointer into the shared memory */
- struct named_atomic_data_t *data;
-
- /* sync. object; never NULL (even if unused) */
- struct mutex_t *mutex;
-};
-
-/* This is intended to be a singleton struct. It contains all
- * information necessary to initialize and access the shared
- * memory.
- */
-struct svn_atomic_namespace__t
-{
- /* Pointer to the shared data mapped into our process */
- struct shared_data_t *data;
-
- /* Last time we checked, this was the number of used
- * (i.e. fully initialized) items. I.e. we can read
- * their names without further sync. */
- volatile svn_atomic_t min_used;
-
- /* for each atomic in the shared memory, we hand out
- * at most one API-level object. */
- struct svn_named_atomic__t atomics[MAX_ATOMIC_COUNT];
-
- /* Synchronization object for this namespace */
- struct mutex_t mutex;
-};
-
-/* On most operating systems APR implements file locks per process, not
- * per file. I.e. the lock file will only sync. among processes but within
- * a process, we must use a mutex to sync the threads. */
-/* Compare ../libsvn_fs_fs/fs.h:SVN_FS_FS__USE_LOCK_MUTEX */
-#if APR_HAS_THREADS && !defined(WIN32)
-#define USE_THREAD_MUTEX 1
-#else
-#define USE_THREAD_MUTEX 0
-#endif
-
-/* Used for process-local thread sync.
- */
-static svn_mutex__t *thread_mutex = NULL;
-
-#if APR_HAS_MMAP
-/* Initialization flag for the above used by svn_atomic__init_once.
- */
-static volatile svn_atomic_t mutex_initialized = FALSE;
-
-/* Initialize the thread sync. structures.
- * To be called by svn_atomic__init_once.
- */
-static svn_error_t *
-init_thread_mutex(void *baton, apr_pool_t *pool)
-{
- /* let the mutex live as long as the APR */
- apr_pool_t *global_pool = svn_pool_create(NULL);
-
- return svn_mutex__init(&thread_mutex, USE_THREAD_MUTEX, global_pool);
-}
-#endif /* APR_HAS_MMAP */
-
-/* Utility that acquires our global mutex and converts error types.
- */
-static svn_error_t *
-lock(struct mutex_t *mutex)
-{
- svn_error_t *err;
-
- /* Get lock on the filehandle. */
- SVN_ERR(svn_mutex__lock(thread_mutex));
- err = svn_io_lock_open_file(mutex->lock_file, TRUE, FALSE, mutex->pool);
-
- return err
- ? svn_mutex__unlock(thread_mutex, err)
- : err;
-}
-
-/* Utility that releases the lock previously acquired via lock(). If the
- * unlock succeeds and OUTER_ERR is not NULL, OUTER_ERR will be returned.
- * Otherwise, return the result of the unlock operation.
- */
-static svn_error_t *
-unlock(struct mutex_t *mutex, svn_error_t * outer_err)
-{
- svn_error_t *unlock_err
- = svn_io_unlock_open_file(mutex->lock_file, mutex->pool);
- return svn_mutex__unlock(thread_mutex,
- svn_error_compose_create(outer_err,
- unlock_err));
-}
-
-#if APR_HAS_MMAP
-/* The last user to close a particular namespace should also remove the
- * lock file. Failure to do so, however, does not affect further uses
- * of the same namespace.
- */
-static apr_status_t
-delete_lock_file(void *arg)
-{
- struct mutex_t *mutex = arg;
- const char *lock_name = NULL;
-
- /* locks have already been cleaned up. Simply close the file */
- apr_status_t status = apr_file_close(mutex->lock_file);
-
- /* Remove the file from disk. This will fail if there ares still other
- * users of this lock file, i.e. namespace. */
- apr_file_name_get(&lock_name, mutex->lock_file);
- if (lock_name)
- apr_file_remove(lock_name, mutex->pool);
-
- return status;
-}
-#endif /* APR_HAS_MMAP */
-
-/* Validate the ATOMIC parameter, i.e it's address. Correct code will
- * never need this but if someone should accidentally to use a NULL or
- * incomplete structure, let's catch that here instead of segfaulting.
- */
-static svn_error_t *
-validate(svn_named_atomic__t *atomic)
-{
- return atomic && atomic->data && atomic->mutex
- ? SVN_NO_ERROR
- : svn_error_create(SVN_ERR_BAD_ATOMIC, 0, _("Not a valid atomic"));
-}
-
-/* Auto-initialize and return in *ATOMIC the API-level object for the
- * atomic with index I within NS. */
-static void
-return_atomic(svn_named_atomic__t **atomic,
- svn_atomic_namespace__t *ns,
- int i)
-{
- *atomic = &ns->atomics[i];
- if (ns->atomics[i].data == NULL)
- {
- (*atomic)->mutex = &ns->mutex;
- (*atomic)->data = &ns->data->atomics[i];
- }
-}
-
-/* Implement API */
-
-svn_boolean_t
-svn_named_atomic__is_supported(void)
-{
-#if !APR_HAS_MMAP
- return FALSE;
-#elif !defined(_WIN32)
- return TRUE;
-#else
- static svn_tristate_t result = svn_tristate_unknown;
-
- if (result == svn_tristate_unknown)
- {
- /* APR SHM implementation requires the creation of global objects */
- HANDLE handle = CreateFileMappingA(INVALID_HANDLE_VALUE,
- NULL,
- PAGE_READONLY,
- 0,
- 1,
- "Global\\__RandomXZY_svn");
- if (handle != NULL)
- {
- CloseHandle(handle);
- result = svn_tristate_true;
- }
- else
- result = svn_tristate_false;
- }
-
- return result == svn_tristate_true;
-#endif /* _WIN32 */
-}
-
-svn_boolean_t
-svn_named_atomic__is_efficient(void)
-{
- return NA_SYNCHRONIZE_IS_FAST;
-}
-
-svn_error_t *
-svn_atomic_namespace__create(svn_atomic_namespace__t **ns,
- const char *name,
- apr_pool_t *result_pool)
-{
-#if !APR_HAS_MMAP
- return svn_error_create(APR_ENOTIMPL, NULL, NULL);
-#else
- apr_status_t apr_err;
- svn_error_t *err;
- apr_file_t *file;
- apr_mmap_t *mmap;
- const char *shm_name, *lock_name;
- apr_finfo_t finfo;
-
- apr_pool_t *subpool = svn_pool_create(result_pool);
-
- /* allocate the namespace data structure
- */
- svn_atomic_namespace__t *new_ns = apr_pcalloc(result_pool, sizeof(**ns));
-
- /* construct the names of the system objects that we need
- */
- shm_name = apr_pstrcat(subpool, name, SHM_NAME_SUFFIX, NULL);
- lock_name = apr_pstrcat(subpool, name, MUTEX_NAME_SUFFIX, NULL);
-
- /* initialize the lock objects
- */
- SVN_ERR(svn_atomic__init_once(&mutex_initialized, init_thread_mutex, NULL,
- result_pool));
-
- new_ns->mutex.pool = result_pool;
- SVN_ERR(svn_io_file_open(&new_ns->mutex.lock_file, lock_name,
- APR_READ | APR_WRITE | APR_CREATE,
- APR_OS_DEFAULT,
- result_pool));
-
- /* Make sure the last user of our lock file will actually remove it.
- * Please note that only the last file handle begin closed will actually
- * remove the underlying file (see docstring for apr_file_remove).
- */
- apr_pool_cleanup_register(result_pool, &new_ns->mutex,
- delete_lock_file,
- apr_pool_cleanup_null);
-
- /* Prevent concurrent initialization.
- */
- SVN_ERR(lock(&new_ns->mutex));
-
- /* First, make sure that the underlying file exists. If it doesn't
- * exist, create one and initialize its content.
- */
- err = svn_io_file_open(&file, shm_name,
- APR_READ | APR_WRITE | APR_CREATE,
- APR_OS_DEFAULT,
- result_pool);
- if (!err)
- {
- err = svn_io_stat(&finfo, shm_name, APR_FINFO_SIZE, subpool);
- if (!err && finfo.size < sizeof(struct shared_data_t))
- {
- /* Zero all counters, values and names.
- */
- struct shared_data_t initial_data;
- memset(&initial_data, 0, sizeof(initial_data));
- err = svn_io_file_write_full(file, &initial_data,
- sizeof(initial_data), NULL,
- subpool);
- }
- }
-
- /* Now, map it into memory.
- */
- if (!err)
- {
- apr_err = apr_mmap_create(&mmap, file, 0, sizeof(*new_ns->data),
- APR_MMAP_READ | APR_MMAP_WRITE , result_pool);
- if (!apr_err)
- new_ns->data = mmap->mm;
- else
- err = svn_error_createf(apr_err, NULL,
- _("MMAP failed for file '%s'"), shm_name);
- }
-
- svn_pool_destroy(subpool);
-
- if (!err && new_ns->data)
- {
- /* Detect severe cases of corruption (i.e. when some outsider messed
- * with our data file)
- */
- if (new_ns->data->count > MAX_ATOMIC_COUNT)
- return svn_error_create(SVN_ERR_CORRUPTED_ATOMIC_STORAGE, 0,
- _("Number of atomics in namespace is too large."));
-
- /* Cache the number of existing, complete entries. There can't be
- * incomplete ones from other processes because we hold the mutex.
- * Our process will also not access this information since we are
- * either being called from within svn_atomic__init_once or by
- * svn_atomic_namespace__create for a new object.
- */
- new_ns->min_used = new_ns->data->count;
- *ns = new_ns;
- }
-
- /* Unlock to allow other processes may access the shared memory as well.
- */
- return unlock(&new_ns->mutex, err);
-#endif /* APR_HAS_MMAP */
-}
-
-svn_error_t *
-svn_atomic_namespace__cleanup(const char *name,
- apr_pool_t *pool)
-{
- const char *shm_name, *lock_name;
-
- /* file names used for the specified namespace */
- shm_name = apr_pstrcat(pool, name, SHM_NAME_SUFFIX, NULL);
- lock_name = apr_pstrcat(pool, name, MUTEX_NAME_SUFFIX, NULL);
-
- /* remove these files if they exist */
- SVN_ERR(svn_io_remove_file2(shm_name, TRUE, pool));
- SVN_ERR(svn_io_remove_file2(lock_name, TRUE, pool));
-
- return SVN_NO_ERROR;
-}
-
-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)
-{
- apr_uint32_t i, count;
- svn_error_t *error = SVN_NO_ERROR;
- apr_size_t len = strlen(name);
-
- /* Check parameters and make sure we return a NULL atomic
- * in case of failure.
- */
- *atomic = NULL;
- if (len > SVN_NAMED_ATOMIC__MAX_NAME_LENGTH)
- return svn_error_create(SVN_ERR_BAD_ATOMIC, 0,
- _("Atomic's name is too long."));
-
- /* If no namespace has been provided, bail out.
- */
- if (ns == NULL || ns->data == NULL)
- return svn_error_create(SVN_ERR_BAD_ATOMIC, 0,
- _("Namespace has not been initialized."));
-
- /* Optimistic lookup.
- * Because we never change the name of existing atomics and may only
- * append new ones, we can safely compare the name of existing ones
- * with the name that we are looking for.
- */
- for (i = 0, count = svn_atomic_read(&ns->min_used); i < count; ++i)
- if (strncmp(ns->data->atomics[i].name, name, len + 1) == 0)
- {
- return_atomic(atomic, ns, i);
- return SVN_NO_ERROR;
- }
-
- /* Try harder:
- * Serialize all lookup and insert the item, if necessary and allowed.
- */
- SVN_ERR(lock(&ns->mutex));
-
- /* We only need to check for new entries.
- */
- for (i = count; i < ns->data->count; ++i)
- if (strncmp(ns->data->atomics[i].name, name, len + 1) == 0)
- {
- return_atomic(atomic, ns, i);
-
- /* Update our cached number of complete entries. */
- svn_atomic_set(&ns->min_used, ns->data->count);
-
- return unlock(&ns->mutex, error);
- }
-
- /* Not found. Append a new entry, if allowed & possible.
- */
- if (auto_create)
- {
- if (ns->data->count < MAX_ATOMIC_COUNT)
- {
- ns->data->atomics[ns->data->count].value = 0;
- memcpy(ns->data->atomics[ns->data->count].name,
- name,
- len+1);
-
- return_atomic(atomic, ns, ns->data->count);
- ++ns->data->count;
- }
- else
- error = svn_error_create(SVN_ERR_BAD_ATOMIC, 0,
- _("Out of slots for named atomic."));
- }
-
- /* We are mainly done here. Let others continue their work.
- */
- SVN_ERR(unlock(&ns->mutex, error));
-
- /* Only now can we be sure that a full memory barrier has been set
- * and that the new entry has been written to memory in full.
- */
- svn_atomic_set(&ns->min_used, ns->data->count);
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_named_atomic__read(apr_int64_t *value,
- svn_named_atomic__t *atomic)
-{
- SVN_ERR(validate(atomic));
- NA_SYNCHRONIZE(atomic, *value = synched_read(&atomic->data->value));
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_named_atomic__write(apr_int64_t *old_value,
- apr_int64_t new_value,
- svn_named_atomic__t *atomic)
-{
- apr_int64_t temp;
-
- SVN_ERR(validate(atomic));
- NA_SYNCHRONIZE(atomic, temp = synched_write(&atomic->data->value, new_value));
-
- if (old_value)
- *old_value = temp;
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_named_atomic__add(apr_int64_t *new_value,
- apr_int64_t delta,
- svn_named_atomic__t *atomic)
-{
- apr_int64_t temp;
-
- SVN_ERR(validate(atomic));
- NA_SYNCHRONIZE(atomic, temp = synched_add(&atomic->data->value, delta));
-
- if (new_value)
- *new_value = temp;
-
- return SVN_NO_ERROR;
-}
-
-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)
-{
- apr_int64_t temp;
-
- SVN_ERR(validate(atomic));
- NA_SYNCHRONIZE(atomic, temp = synched_cmpxchg(&atomic->data->value,
- new_value,
- comperand));
-
- if (old_value)
- *old_value = temp;
-
- return SVN_NO_ERROR;
-}
diff --git a/subversion/libsvn_subr/nls.c b/subversion/libsvn_subr/nls.c
index b026e39..2be97a7 100644
--- a/subversion/libsvn_subr/nls.c
+++ b/subversion/libsvn_subr/nls.c
@@ -37,6 +37,8 @@
#include "svn_pools.h"
#include "svn_path.h"
+#include "private/svn_utf_private.h"
+
#include "svn_private_config.h"
svn_error_t *
@@ -53,69 +55,38 @@ svn_nls_init(void)
{
#ifdef WIN32
WCHAR ucs2_path[MAX_PATH];
- char* utf8_path;
+ const char* utf8_path;
const char* internal_path;
- apr_pool_t* pool;
- apr_size_t inwords, outbytes, outlength;
+ apr_pool_t* scratch_pool;
- apr_pool_create(&pool, 0);
+ scratch_pool = svn_pool_create(NULL);
/* get exe name - our locale info will be in '../share/locale' */
- inwords = GetModuleFileNameW(0, ucs2_path,
- sizeof(ucs2_path) / sizeof(ucs2_path[0]));
- if (! inwords)
+ GetModuleFileNameW(NULL, ucs2_path,
+ sizeof(ucs2_path) / sizeof(ucs2_path[0]));
+ if (apr_get_os_error())
{
- /* We must be on a Win9x machine, so attempt to get an ANSI path,
- and convert it to Unicode. */
- CHAR ansi_path[MAX_PATH];
-
- if (GetModuleFileNameA(0, ansi_path, sizeof(ansi_path)))
- {
- inwords =
- MultiByteToWideChar(CP_ACP, 0, ansi_path, -1, ucs2_path,
- sizeof(ucs2_path) / sizeof(ucs2_path[0]));
- if (! inwords)
- {
- err =
- svn_error_createf(APR_EINVAL, NULL,
- _("Can't convert string to UCS-2: '%s'"),
- ansi_path);
- }
- }
- else
- {
- err = svn_error_create(APR_EINVAL, NULL,
- _("Can't get module file name"));
- }
+ err = svn_error_wrap_apr(apr_get_os_error(),
+ _("Can't get module file name"));
}
if (! err)
- {
- outbytes = outlength = 3 * (inwords + 1);
- utf8_path = apr_palloc(pool, outlength);
-
- outbytes = WideCharToMultiByte(CP_UTF8, 0, ucs2_path, inwords,
- utf8_path, outbytes, NULL, NULL);
+ err = svn_utf__win32_utf16_to_utf8(&utf8_path, ucs2_path,
+ NULL, scratch_pool);
- if (outbytes == 0)
- {
- err = svn_error_wrap_apr(apr_get_os_error(),
- _("Can't convert module path "
- "to UTF-8 from UCS-2: '%s'"),
- ucs2_path);
- }
- else
- {
- utf8_path[outlength - outbytes] = '\0';
- internal_path = svn_dirent_internal_style(utf8_path, pool);
- /* get base path name */
- internal_path = svn_dirent_dirname(internal_path, pool);
- internal_path = svn_dirent_join(internal_path,
- SVN_LOCALE_RELATIVE_PATH,
- pool);
- bindtextdomain(PACKAGE_NAME, internal_path);
- }
+ if (! err)
+ {
+ internal_path = svn_dirent_internal_style(utf8_path, scratch_pool);
+ /* get base path name */
+ internal_path = svn_dirent_dirname(internal_path, scratch_pool);
+ internal_path = svn_dirent_join(internal_path,
+ SVN_LOCALE_RELATIVE_PATH,
+ scratch_pool);
+ SVN_ERR(svn_dirent_get_absolute(&internal_path, internal_path,
+ scratch_pool));
+ bindtextdomain(PACKAGE_NAME, internal_path);
}
- svn_pool_destroy(pool);
+
+ svn_pool_destroy(scratch_pool);
}
#else /* ! WIN32 */
bindtextdomain(PACKAGE_NAME, SVN_LOCALE_DIR);
diff --git a/subversion/libsvn_subr/object_pool.c b/subversion/libsvn_subr/object_pool.c
new file mode 100644
index 0000000..782ffa2
--- /dev/null
+++ b/subversion/libsvn_subr/object_pool.c
@@ -0,0 +1,398 @@
+/*
+ * config_pool.c : pool of configuration objects
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+
+#include <assert.h>
+
+#include "svn_error.h"
+#include "svn_hash.h"
+#include "svn_pools.h"
+
+#include "private/svn_atomic.h"
+#include "private/svn_object_pool.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_dep_compat.h"
+
+
+
+/* A reference counting wrapper around the user-provided object.
+ */
+typedef struct object_ref_t
+{
+ /* reference to the parent container */
+ svn_object_pool__t *object_pool;
+
+ /* identifies the bucket in OBJECT_POOL->OBJECTS in which this entry
+ * belongs. */
+ svn_membuf_t key;
+
+ /* User provided object. Usually a wrapper. */
+ void *wrapper;
+
+ /* private pool. This instance and its other members got allocated in it.
+ * Will be destroyed when this instance is cleaned up. */
+ apr_pool_t *pool;
+
+ /* Number of references to this data struct */
+ volatile svn_atomic_t ref_count;
+} object_ref_t;
+
+
+/* Core data structure. All access to it must be serialized using MUTEX.
+ */
+struct svn_object_pool__t
+{
+ /* serialization object for all non-atomic data in this struct */
+ svn_mutex__t *mutex;
+
+ /* object_ref_t.KEY -> object_ref_t* mapping.
+ *
+ * In shared object mode, there is at most one such entry per key and it
+ * may or may not be in use. In exclusive mode, only unused references
+ * will be put here and they form chains if there are multiple unused
+ * instances for the key. */
+ apr_hash_t *objects;
+
+ /* same as objects->count but allows for non-sync'ed access */
+ volatile svn_atomic_t object_count;
+
+ /* Number of entries in OBJECTS with a reference count 0.
+ Due to races, this may be *temporarily* off by one or more.
+ Hence we must not strictly depend on it. */
+ volatile svn_atomic_t unused_count;
+
+ /* the root pool owning this structure */
+ apr_pool_t *pool;
+
+ /* extractor and updater for the user object wrappers */
+ svn_object_pool__getter_t getter;
+ svn_object_pool__setter_t setter;
+};
+
+
+/* Pool cleanup function for the whole object pool.
+ */
+static apr_status_t
+object_pool_cleanup(void *baton)
+{
+ svn_object_pool__t *object_pool = baton;
+
+ /* all entries must have been released up by now */
+ SVN_ERR_ASSERT_NO_RETURN( object_pool->object_count
+ == object_pool->unused_count);
+
+ return APR_SUCCESS;
+}
+
+/* Remove entries from OBJECTS in OBJECT_POOL that have a ref-count of 0.
+ *
+ * Requires external serialization on OBJECT_POOL.
+ */
+static void
+remove_unused_objects(svn_object_pool__t *object_pool)
+{
+ apr_pool_t *subpool = svn_pool_create(object_pool->pool);
+
+ /* process all hash buckets */
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(subpool, object_pool->objects);
+ hi != NULL;
+ hi = apr_hash_next(hi))
+ {
+ object_ref_t *object_ref = apr_hash_this_val(hi);
+
+ /* note that we won't hand out new references while access
+ to the hash is serialized */
+ if (svn_atomic_read(&object_ref->ref_count) == 0)
+ {
+ apr_hash_set(object_pool->objects, object_ref->key.data,
+ object_ref->key.size, NULL);
+ svn_atomic_dec(&object_pool->object_count);
+ svn_atomic_dec(&object_pool->unused_count);
+
+ svn_pool_destroy(object_ref->pool);
+ }
+ }
+
+ svn_pool_destroy(subpool);
+}
+
+/* Cleanup function called when an object_ref_t gets released.
+ */
+static apr_status_t
+object_ref_cleanup(void *baton)
+{
+ object_ref_t *object = baton;
+ svn_object_pool__t *object_pool = object->object_pool;
+
+ /* If we released the last reference to object, there is one more
+ unused entry.
+
+ Note that unused_count does not need to be always exact but only
+ needs to become exact *eventually* (we use it to check whether we
+ should remove unused objects every now and then). I.e. it must
+ never drift off / get stuck but always reflect the true value once
+ all threads left the racy sections.
+ */
+ if (svn_atomic_dec(&object->ref_count) == 0)
+ svn_atomic_inc(&object_pool->unused_count);
+
+ return APR_SUCCESS;
+}
+
+/* Handle reference counting for the OBJECT_REF that the caller is about
+ * to return. The reference will be released when POOL gets cleaned up.
+ *
+ * Requires external serialization on OBJECT_REF->OBJECT_POOL.
+ */
+static void
+add_object_ref(object_ref_t *object_ref,
+ apr_pool_t *pool)
+{
+ /* Update ref counter.
+ Note that this is racy with object_ref_cleanup; see comment there. */
+ if (svn_atomic_inc(&object_ref->ref_count) == 0)
+ svn_atomic_dec(&object_ref->object_pool->unused_count);
+
+ /* make sure the reference gets released automatically */
+ apr_pool_cleanup_register(pool, object_ref, object_ref_cleanup,
+ apr_pool_cleanup_null);
+}
+
+/* Actual implementation of svn_object_pool__lookup.
+ *
+ * Requires external serialization on OBJECT_POOL.
+ */
+static svn_error_t *
+lookup(void **object,
+ svn_object_pool__t *object_pool,
+ svn_membuf_t *key,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ object_ref_t *object_ref
+ = apr_hash_get(object_pool->objects, key->data, key->size);
+
+ if (object_ref)
+ {
+ *object = object_pool->getter(object_ref->wrapper, baton, result_pool);
+ add_object_ref(object_ref, result_pool);
+ }
+ else
+ {
+ *object = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Actual implementation of svn_object_pool__insert.
+ *
+ * Requires external serialization on OBJECT_POOL.
+ */
+static svn_error_t *
+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)
+{
+ object_ref_t *object_ref
+ = apr_hash_get(object_pool->objects, key->data, key->size);
+ if (object_ref)
+ {
+ /* entry already exists (e.g. race condition) */
+ svn_error_t *err = object_pool->setter(&object_ref->wrapper,
+ wrapper, baton,
+ object_ref->pool);
+ if (err)
+ {
+ /* if we had an issue in the setter, then OBJECT_REF is in an
+ * unknown state now. Keep it around for the current users
+ * (i.e. don't clean the pool) but remove it from the list of
+ * available ones.
+ */
+ apr_hash_set(object_pool->objects, key->data, key->size, NULL);
+ svn_atomic_dec(&object_pool->object_count);
+
+ /* for the unlikely case that the object got created _and_
+ * already released since we last checked: */
+ if (svn_atomic_read(&object_ref->ref_count) == 0)
+ svn_atomic_dec(&object_pool->unused_count);
+
+ /* cleanup the new data as well because it's not safe to use
+ * either.
+ */
+ svn_pool_destroy(wrapper_pool);
+
+ /* propagate error */
+ return svn_error_trace(err);
+ }
+
+ /* Destroy the new one and return a reference to the existing one
+ * because the existing one may already have references on it.
+ */
+ svn_pool_destroy(wrapper_pool);
+ }
+ else
+ {
+ /* add new index entry */
+ object_ref = apr_pcalloc(wrapper_pool, sizeof(*object_ref));
+ object_ref->object_pool = object_pool;
+ object_ref->wrapper = wrapper;
+ object_ref->pool = wrapper_pool;
+
+ svn_membuf__create(&object_ref->key, key->size, wrapper_pool);
+ object_ref->key.size = key->size;
+ memcpy(object_ref->key.data, key->data, key->size);
+
+ apr_hash_set(object_pool->objects, object_ref->key.data,
+ object_ref->key.size, object_ref);
+ svn_atomic_inc(&object_pool->object_count);
+
+ /* the new entry is *not* in use yet.
+ * add_object_ref will update counters again.
+ */
+ svn_atomic_inc(&object_ref->object_pool->unused_count);
+ }
+
+ /* return a reference to the object we just added */
+ *object = object_pool->getter(object_ref->wrapper, baton, result_pool);
+ add_object_ref(object_ref, result_pool);
+
+ /* limit memory usage */
+ if (svn_atomic_read(&object_pool->unused_count) * 2
+ > apr_hash_count(object_pool->objects) + 2)
+ remove_unused_objects(object_pool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Implement svn_object_pool__getter_t as no-op.
+ */
+static void *
+default_getter(void *object,
+ void *baton,
+ apr_pool_t *pool)
+{
+ return object;
+}
+
+/* Implement svn_object_pool__setter_t as no-op.
+ */
+static svn_error_t *
+default_setter(void **target,
+ void *source,
+ void *baton,
+ apr_pool_t *pool)
+{
+ return SVN_NO_ERROR;
+}
+
+
+/* API implementation */
+
+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)
+{
+ svn_object_pool__t *result;
+
+ /* construct the object pool in our private ROOT_POOL to survive POOL
+ * cleanup and to prevent threading issues with the allocator
+ */
+ result = apr_pcalloc(pool, sizeof(*result));
+ SVN_ERR(svn_mutex__init(&result->mutex, thread_safe, pool));
+
+ result->pool = pool;
+ result->objects = svn_hash__make(result->pool);
+ result->getter = getter ? getter : default_getter;
+ result->setter = setter ? setter : default_setter;
+
+ /* make sure we clean up nicely.
+ * We need two cleanup functions of which exactly one will be run
+ * (disabling the respective other as the first step). If the owning
+ * pool does not cleaned up / destroyed explicitly, it may live longer
+ * than our allocator. So, we need do act upon cleanup requests from
+ * either side - owning_pool and root_pool.
+ */
+ apr_pool_cleanup_register(pool, result, object_pool_cleanup,
+ apr_pool_cleanup_null);
+
+ *object_pool = result;
+ return SVN_NO_ERROR;
+}
+
+apr_pool_t *
+svn_object_pool__new_wrapper_pool(svn_object_pool__t *object_pool)
+{
+ return svn_pool_create(object_pool->pool);
+}
+
+svn_mutex__t *
+svn_object_pool__mutex(svn_object_pool__t *object_pool)
+{
+ return object_pool->mutex;
+}
+
+unsigned
+svn_object_pool__count(svn_object_pool__t *object_pool)
+{
+ return svn_atomic_read(&object_pool->object_count);
+}
+
+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)
+{
+ *object = NULL;
+ SVN_MUTEX__WITH_LOCK(object_pool->mutex,
+ lookup(object, object_pool, key, baton, result_pool));
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ *object = NULL;
+ SVN_MUTEX__WITH_LOCK(object_pool->mutex,
+ insert(object, object_pool, key, wrapper, baton,
+ wrapper_pool, result_pool));
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_subr/opt.c b/subversion/libsvn_subr/opt.c
index bfaa8b4..7b108e5 100644
--- a/subversion/libsvn_subr/opt.c
+++ b/subversion/libsvn_subr/opt.c
@@ -186,7 +186,7 @@ format_option(const char **string,
opts = apr_psprintf(pool, "--%s", opt->name);
if (opt->has_arg)
- opts = apr_pstrcat(pool, opts, _(" ARG"), (char *)NULL);
+ opts = apr_pstrcat(pool, opts, _(" ARG"), SVN_VA_NULL);
if (doc)
opts = apr_psprintf(pool, "%-24s : %s", opts, _(opt->description));
@@ -783,7 +783,7 @@ svn_opt_parse_path(svn_opt_revision_t *rev,
if (svn_path_is_url(path))
{
/* URLs are URI-encoded, so we look for dates with
- URI-encoded delimeters. */
+ URI-encoded delimiters. */
size_t rev_len = strlen(rev_str);
if (rev_len > 6
&& rev_str[0] == '%'
@@ -935,7 +935,7 @@ svn_opt__args_to_target_array(apr_array_header_t **targets_p,
}
}
- target = apr_pstrcat(pool, true_target, peg_rev, (char *)NULL);
+ target = apr_pstrcat(pool, true_target, peg_rev, SVN_VA_NULL);
APR_ARRAY_PUSH(output_targets, const char *) = target;
}
@@ -1012,13 +1012,6 @@ svn_opt__split_arg_at_peg_revision(const char **true_target,
if (peg_start)
{
- /* Error out if target is the empty string. */
- if (ptr == utf8_target)
- return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
- _("'%s' is just a peg revision. "
- "Maybe try '%s@' instead?"),
- utf8_target, utf8_target);
-
*true_target = apr_pstrmemdup(pool, utf8_target, ptr - utf8_target);
if (peg_revision)
*peg_revision = apr_pstrdup(pool, peg_start);
diff --git a/subversion/libsvn_subr/packed_data.c b/subversion/libsvn_subr/packed_data.c
new file mode 100644
index 0000000..27651ff
--- /dev/null
+++ b/subversion/libsvn_subr/packed_data.c
@@ -0,0 +1,1099 @@
+/* packed_data.c : implement 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.
+ * ====================================================================
+ */
+
+#include <apr_tables.h>
+
+#include "svn_string.h"
+#include "svn_sorts.h"
+#include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_delta_private.h"
+#include "private/svn_packed_data.h"
+
+#include "svn_private_config.h"
+
+
+
+/* Private int stream data referenced by svn_packed__int_stream_t.
+ */
+typedef struct packed_int_private_t
+{
+ /* First sub-stream, if any. NULL otherwise. */
+ svn_packed__int_stream_t *first_substream;
+
+ /* Last sub-stream, if any. NULL otherwise. */
+ svn_packed__int_stream_t *last_substream;
+
+ /* Current sub-stream to read from / write to, if any. NULL otherwise.
+ This will be initialized to FIRST_SUBSTREAM and then advanced in a
+ round-robin scheme after each number being read. */
+ svn_packed__int_stream_t *current_substream;
+
+ /* Number of sub-streams. */
+ apr_size_t substream_count;
+
+ /* Next (sibling) integer stream. If this is the last one, points to
+ the first in the list (i.e. this forms a ring list). Never NULL. */
+ svn_packed__int_stream_t *next;
+
+ /* 7b/8b encoded integer values (previously diff'ed and sign-handled,
+ if indicated by the flags below). The contents are disjoint from
+ the unparsed number buffer. May be NULL while not written to. */
+ svn_stringbuf_t *packed;
+
+ /* Initialized to 0. Latest value written to / read from PACKED.
+ Undefined if DIFF is FALSE. */
+ apr_uint64_t last_value;
+
+ /* Deltify data before storing it in PACKED. */
+ svn_boolean_t diff;
+
+ /* Numbers are likely to contain negative values with small absolutes.
+ If TRUE, store the signed bit in LSB before encoding. */
+ svn_boolean_t is_signed;
+
+ /* Number of integers in this stream. */
+ apr_size_t item_count;
+
+ /* TRUE for the last stream in a list of siblings. */
+ svn_boolean_t is_last;
+
+ /* Pool to use for allocations. */
+ apr_pool_t *pool;
+} packed_int_private_t;
+
+/* A byte sequence stream. Please note that NEXT is defined different
+ * from the NEXT member in integer streams.
+ */
+struct svn_packed__byte_stream_t
+{
+ /* First sub-stream, if any. NULL otherwise. */
+ svn_packed__byte_stream_t *first_substream;
+
+ /* Last sub-stream, if any. NULL otherwise. */
+ svn_packed__byte_stream_t *last_substream;
+
+ /* Next (sibling) byte sequence stream, if any. NULL otherwise. */
+ svn_packed__byte_stream_t *next;
+
+ /* Stream to store the sequence lengths. */
+ svn_packed__int_stream_t *lengths_stream;
+
+ /* It's index (relative to its parent). */
+ apr_size_t lengths_stream_index;
+
+ /* Concatenated byte sequences. */
+ svn_stringbuf_t *packed;
+
+ /* Pool to use for allocations. */
+ apr_pool_t *pool;
+};
+
+/* The serialization root object. It references the top-level streams.
+ */
+struct svn_packed__data_root_t
+{
+ /* First top-level integer stream, if any. NULL otherwise. */
+ svn_packed__int_stream_t *first_int_stream;
+
+ /* Last top-level integer stream, if any. NULL otherwise. */
+ svn_packed__int_stream_t *last_int_stream;
+
+ /* Number of top-level integer streams. */
+ apr_size_t int_stream_count;
+
+ /* First top-level byte sequence stream, if any. NULL otherwise. */
+ svn_packed__byte_stream_t *first_byte_stream;
+
+ /* Last top-level byte sequence stream, if any. NULL otherwise. */
+ svn_packed__byte_stream_t *last_byte_stream;
+
+ /* Number of top-level byte sequence streams. */
+ apr_size_t byte_stream_count;
+
+ /* Pool to use for allocations. */
+ apr_pool_t *pool;
+};
+
+/* Write access. */
+
+svn_packed__data_root_t *
+svn_packed__data_create_root(apr_pool_t *pool)
+{
+ svn_packed__data_root_t *root = apr_pcalloc(pool, sizeof(*root));
+ root->pool = pool;
+
+ return root;
+}
+
+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)
+{
+ /* allocate and initialize the stream node */
+ packed_int_private_t *private_data
+ = apr_pcalloc(root->pool, sizeof(*private_data));
+ svn_packed__int_stream_t *stream
+ = apr_palloc(root->pool, sizeof(*stream));
+
+ private_data->diff = diff;
+ private_data->is_signed = signed_ints;
+ private_data->is_last = TRUE;
+ private_data->pool = root->pool;
+
+ stream->buffer_used = 0;
+ stream->private_data = private_data;
+
+ /* maintain the ring list */
+ if (root->last_int_stream)
+ {
+ packed_int_private_t *previous_private_data
+ = root->last_int_stream->private_data;
+ previous_private_data->next = stream;
+ previous_private_data->is_last = FALSE;
+ }
+ else
+ {
+ root->first_int_stream = stream;
+ }
+
+ root->last_int_stream = stream;
+ root->int_stream_count++;
+
+ return stream;
+}
+
+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)
+{
+ packed_int_private_t *parent_private = parent->private_data;
+
+ /* allocate and initialize the stream node */
+ packed_int_private_t *private_data
+ = apr_pcalloc(parent_private->pool, sizeof(*private_data));
+ svn_packed__int_stream_t *stream
+ = apr_palloc(parent_private->pool, sizeof(*stream));
+
+ private_data->diff = diff;
+ private_data->is_signed = signed_ints;
+ private_data->is_last = TRUE;
+ private_data->pool = parent_private->pool;
+
+ stream->buffer_used = 0;
+ stream->private_data = private_data;
+
+ /* maintain the ring list */
+ if (parent_private->last_substream)
+ {
+ packed_int_private_t *previous_private_data
+ = parent_private->last_substream->private_data;
+ previous_private_data->next = stream;
+ previous_private_data->is_last = FALSE;
+ }
+ else
+ {
+ parent_private->first_substream = stream;
+ parent_private->current_substream = stream;
+ }
+
+ parent_private->last_substream = stream;
+ parent_private->substream_count++;
+ private_data->next = parent_private->first_substream;
+
+ return stream;
+}
+
+/* Returns a new top-level byte sequence stream for ROOT but does not
+ * initialize the LENGTH_STREAM member.
+ */
+static svn_packed__byte_stream_t *
+create_bytes_stream_body(svn_packed__data_root_t *root)
+{
+ svn_packed__byte_stream_t *stream
+ = apr_pcalloc(root->pool, sizeof(*stream));
+
+ stream->packed = svn_stringbuf_create_empty(root->pool);
+
+ if (root->last_byte_stream)
+ root->last_byte_stream->next = stream;
+ else
+ root->first_byte_stream = stream;
+
+ root->last_byte_stream = stream;
+ root->byte_stream_count++;
+
+ return stream;
+}
+
+svn_packed__byte_stream_t *
+svn_packed__create_bytes_stream(svn_packed__data_root_t *root)
+{
+ svn_packed__byte_stream_t *stream
+ = create_bytes_stream_body(root);
+
+ stream->lengths_stream_index = root->int_stream_count;
+ stream->lengths_stream = svn_packed__create_int_stream(root, FALSE, FALSE);
+
+ return stream;
+}
+
+/* Write the 7b/8b representation of VALUE into BUFFER. BUFFER must
+ * provide at least 10 bytes space.
+ * Returns the first position behind the written data.
+ */
+static unsigned char *
+write_packed_uint_body(unsigned char *buffer, apr_uint64_t value)
+{
+ while (value >= 0x80)
+ {
+ *(buffer++) = (unsigned char)((value % 0x80) + 0x80);
+ value /= 0x80;
+ }
+
+ *(buffer++) = (unsigned char)value;
+ return buffer;
+}
+
+/* Return remapped VALUE.
+ *
+ * Due to sign conversion and diff underflow, values close to UINT64_MAX
+ * are almost as frequent as those close to 0. Remap them such that the
+ * MSB is stored in the LSB and the remainder stores the absolute distance
+ * to 0.
+ *
+ * This minimizes the absolute value to store in many scenarios.
+ * Hence, the variable-length representation on disk is shorter, too.
+ */
+static apr_uint64_t
+remap_uint(apr_uint64_t value)
+{
+ return value & APR_UINT64_C(0x8000000000000000)
+ ? APR_UINT64_MAX - (2 * value)
+ : 2 * value;
+}
+
+/* Invert remap_uint. */
+static apr_uint64_t
+unmap_uint(apr_uint64_t value)
+{
+ return value & 1
+ ? (APR_UINT64_MAX - value / 2)
+ : value / 2;
+}
+
+/* Empty the unprocessed integer buffer in STREAM by either pushing the
+ * data to the sub-streams or writing to the packed data (in case there
+ * are no sub-streams).
+ */
+static void
+svn_packed__data_flush_buffer(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ apr_size_t i;
+
+ /* if we have sub-streams, push the data down to them */
+ if (private_data->current_substream)
+ for (i = 0; i < stream->buffer_used; ++i)
+ {
+ packed_int_private_t *current_private_data
+ = private_data->current_substream->private_data;
+
+ svn_packed__add_uint(private_data->current_substream,
+ stream->buffer[i]);
+ private_data->current_substream = current_private_data->next;
+ }
+ else
+ {
+ /* pack the numbers into our local PACKED buffer */
+
+ /* temporary buffer, max 10 bytes required per 7b/8b encoded number */
+ unsigned char local_buffer[10 * SVN__PACKED_DATA_BUFFER_SIZE];
+ unsigned char *p = local_buffer;
+
+ /* if configured, deltify numbers before packing them.
+ Since delta may be negative, always use the 'signed' encoding. */
+ if (private_data->diff)
+ {
+ apr_uint64_t last_value = private_data->last_value;
+ for (i = 0; i < stream->buffer_used; ++i)
+ {
+ apr_uint64_t temp = stream->buffer[i];
+ stream->buffer[i] = remap_uint(temp - last_value);
+ last_value = temp;
+ }
+
+ private_data->last_value = last_value;
+ }
+
+ /* if configured and not already done by the deltification above,
+ transform to 'signed' encoding. Store the sign in the LSB and
+ the absolute value (-1 for negative values) in the remaining
+ 63 bits. */
+ if (!private_data->diff && private_data->is_signed)
+ for (i = 0; i < stream->buffer_used; ++i)
+ stream->buffer[i] = remap_uint(stream->buffer[i]);
+
+ /* auto-create packed data buffer. Give it some reasonable initial
+ size - just enough for a few tens of values. */
+ if (private_data->packed == NULL)
+ private_data->packed
+ = svn_stringbuf_create_ensure(256, private_data->pool);
+
+ /* encode numbers into our temp buffer. */
+ for (i = 0; i < stream->buffer_used; ++i)
+ p = write_packed_uint_body(p, stream->buffer[i]);
+
+ /* append them to the final packed data */
+ svn_stringbuf_appendbytes(private_data->packed,
+ (char *)local_buffer,
+ p - local_buffer);
+ }
+
+ /* maintain counters */
+ private_data->item_count += stream->buffer_used;
+ stream->buffer_used = 0;
+}
+
+void
+svn_packed__add_uint(svn_packed__int_stream_t *stream,
+ apr_uint64_t value)
+{
+ stream->buffer[stream->buffer_used] = value;
+ if (++stream->buffer_used == SVN__PACKED_DATA_BUFFER_SIZE)
+ svn_packed__data_flush_buffer(stream);
+}
+
+void
+svn_packed__add_int(svn_packed__int_stream_t *stream,
+ apr_int64_t value)
+{
+ svn_packed__add_uint(stream, (apr_uint64_t)value);
+}
+
+void
+svn_packed__add_bytes(svn_packed__byte_stream_t *stream,
+ const char *data,
+ apr_size_t len)
+{
+ svn_packed__add_uint(stream->lengths_stream, len);
+ svn_stringbuf_appendbytes(stream->packed, data, len);
+}
+
+/* Append the 7b/8b encoded representation of VALUE to PACKED.
+ */
+static void
+write_packed_uint(svn_stringbuf_t* packed, apr_uint64_t value)
+{
+ if (value < 0x80)
+ {
+ svn_stringbuf_appendbyte(packed, (char)value);
+ }
+ else
+ {
+ unsigned char buffer[10];
+ unsigned char *p = write_packed_uint_body(buffer, value);
+
+ svn_stringbuf_appendbytes(packed, (char *)buffer, p - buffer);
+ }
+}
+
+/* Recursively write the structure (config parameters, sub-streams, data
+ * sizes) of the STREAM and all its siblings to the TREE_STRUCT buffer.
+ */
+static void
+write_int_stream_structure(svn_stringbuf_t* tree_struct,
+ svn_packed__int_stream_t* stream)
+{
+ while (stream)
+ {
+ /* store config parameters and number of sub-streams in 1 number */
+ packed_int_private_t *private_data = stream->private_data;
+ write_packed_uint(tree_struct, (private_data->substream_count << 2)
+ + (private_data->diff ? 1 : 0)
+ + (private_data->is_signed ? 2 : 0));
+
+ /* store item count and length their of packed representation */
+ svn_packed__data_flush_buffer(stream);
+
+ write_packed_uint(tree_struct, private_data->item_count);
+ write_packed_uint(tree_struct, private_data->packed
+ ? private_data->packed->len
+ : 0);
+
+ /* append all sub-stream structures */
+ write_int_stream_structure(tree_struct, private_data->first_substream);
+
+ /* continue with next sibling */
+ stream = private_data->is_last ? NULL : private_data->next;
+ }
+}
+
+/* Recursively write the structure (sub-streams, data sizes) of the STREAM
+ * and all its siblings to the TREE_STRUCT buffer.
+ */
+static void
+write_byte_stream_structure(svn_stringbuf_t* tree_struct,
+ svn_packed__byte_stream_t* stream)
+{
+ /* for this and all siblings */
+ for (; stream; stream = stream->next)
+ {
+ /* this stream's structure and size */
+ write_packed_uint(tree_struct, 0);
+ write_packed_uint(tree_struct, stream->lengths_stream_index);
+ write_packed_uint(tree_struct, stream->packed->len);
+
+ /* followed by all its sub-streams */
+ write_byte_stream_structure(tree_struct, stream->first_substream);
+ }
+}
+
+/* Write the 7b/8b encoded representation of VALUE to STREAM.
+ */
+static svn_error_t *
+write_stream_uint(svn_stream_t *stream,
+ apr_uint64_t value)
+{
+ unsigned char buffer[10];
+ apr_size_t count = write_packed_uint_body(buffer, value) - buffer;
+
+ SVN_ERR(svn_stream_write(stream, (char *)buffer, &count));
+
+ return SVN_NO_ERROR;
+}
+
+/* Return the total size of all packed data in STREAM, its siblings and
+ * all sub-streams. To get an accurate value, flush all buffers prior to
+ * calling this function.
+ */
+static apr_size_t
+packed_int_stream_length(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ apr_size_t result = private_data->packed ? private_data->packed->len : 0;
+
+ stream = private_data->first_substream;
+ while (stream)
+ {
+ private_data = stream->private_data;
+ result += packed_int_stream_length(stream);
+ stream = private_data->is_last ? NULL : private_data->next;
+ }
+
+ return result;
+}
+
+/* Return the total size of all byte sequences data in STREAM, its siblings
+ * and all sub-streams.
+ */
+static apr_size_t
+packed_byte_stream_length(svn_packed__byte_stream_t *stream)
+{
+ apr_size_t result = stream->packed->len;
+
+ for (stream = stream->first_substream; stream; stream = stream->next)
+ result += packed_byte_stream_length(stream);
+
+ return result;
+}
+
+/* Append all packed data in STREAM, its siblings and all sub-streams to
+ * COMBINED.
+ */
+static void
+append_int_stream(svn_packed__int_stream_t *stream,
+ svn_stringbuf_t *combined)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ if (private_data->packed)
+ svn_stringbuf_appendstr(combined, private_data->packed);
+
+ stream = private_data->first_substream;
+ while (stream)
+ {
+ private_data = stream->private_data;
+ append_int_stream(stream, combined);
+ stream = private_data->is_last ? NULL : private_data->next;
+ }
+}
+
+/* Append all byte sequences in STREAM, its siblings and all sub-streams
+ * to COMBINED.
+ */
+static void
+append_byte_stream(svn_packed__byte_stream_t *stream,
+ svn_stringbuf_t *combined)
+{
+ svn_stringbuf_appendstr(combined, stream->packed);
+
+ for (stream = stream->first_substream; stream; stream = stream->next)
+ append_byte_stream(stream, combined);
+}
+
+/* Take the binary data in UNCOMPRESSED, zip it into COMPRESSED and write
+ * it to STREAM. COMPRESSED simply acts as a re-usable memory buffer.
+ * Clear all buffers (COMPRESSED, UNCOMPRESSED) at the end of the function.
+ */
+static svn_error_t *
+write_stream_data(svn_stream_t *stream,
+ svn_stringbuf_t *uncompressed,
+ svn_stringbuf_t *compressed)
+{
+ SVN_ERR(svn__compress(uncompressed,
+ compressed,
+ SVN_DELTA_COMPRESSION_LEVEL_DEFAULT));
+
+ SVN_ERR(write_stream_uint(stream, compressed->len));
+ SVN_ERR(svn_stream_write(stream, compressed->data, &compressed->len));
+
+ svn_stringbuf_setempty(uncompressed);
+ svn_stringbuf_setempty(compressed);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_packed__data_write(svn_stream_t *stream,
+ svn_packed__data_root_t *root,
+ apr_pool_t *scratch_pool)
+{
+ svn_packed__int_stream_t *int_stream;
+ svn_packed__byte_stream_t *byte_stream;
+
+ /* re-usable data buffers */
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_ensure(1024, scratch_pool);
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure(1024, scratch_pool);
+
+ /* write tree structure */
+ svn_stringbuf_t *tree_struct
+ = svn_stringbuf_create_ensure(127, scratch_pool);
+
+ write_packed_uint(tree_struct, root->int_stream_count);
+ write_int_stream_structure(tree_struct, root->first_int_stream);
+
+ write_packed_uint(tree_struct, root->byte_stream_count);
+ write_byte_stream_structure(tree_struct, root->first_byte_stream);
+
+ SVN_ERR(write_stream_uint(stream, tree_struct->len));
+ SVN_ERR(svn_stream_write(stream, tree_struct->data, &tree_struct->len));
+
+ /* flatten sub-streams, zip them and write them to disk */
+
+ for (int_stream = root->first_int_stream;
+ int_stream;
+ int_stream = ((packed_int_private_t*)int_stream->private_data)->next)
+ {
+ apr_size_t len = packed_int_stream_length(int_stream);
+ svn_stringbuf_ensure(uncompressed, len);
+
+ append_int_stream(int_stream, uncompressed);
+ SVN_ERR(write_stream_data(stream, uncompressed, compressed));
+ }
+
+ for (byte_stream = root->first_byte_stream;
+ byte_stream;
+ byte_stream = byte_stream->next)
+ {
+ apr_size_t len = packed_byte_stream_length(byte_stream);
+ svn_stringbuf_ensure(uncompressed, len);
+
+ append_byte_stream(byte_stream, uncompressed);
+ SVN_ERR(write_stream_data(stream, uncompressed, compressed));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Read access. */
+
+svn_packed__int_stream_t *
+svn_packed__first_int_stream(svn_packed__data_root_t *root)
+{
+ return root->first_int_stream;
+}
+
+svn_packed__byte_stream_t *
+svn_packed__first_byte_stream(svn_packed__data_root_t *root)
+{
+ return root->first_byte_stream;
+}
+
+svn_packed__int_stream_t *
+svn_packed__next_int_stream(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ return private_data->is_last ? NULL : private_data->next;
+}
+
+svn_packed__byte_stream_t *
+svn_packed__next_byte_stream(svn_packed__byte_stream_t *stream)
+{
+ return stream->next;
+}
+
+svn_packed__int_stream_t *
+svn_packed__first_int_substream(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ return private_data->first_substream;
+}
+
+apr_size_t
+svn_packed__int_count(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ return private_data->item_count + stream->buffer_used;
+}
+
+apr_size_t
+svn_packed__byte_count(svn_packed__byte_stream_t *stream)
+{
+ return stream->packed->len;
+}
+
+/* Read one 7b/8b encoded value from *P and return it in *RESULT. Returns
+ * the first position after the parsed data.
+ *
+ * Overflows will be detected in the sense that it will end parsing the
+ * input but the result is undefined.
+ */
+static unsigned char *
+read_packed_uint_body(unsigned char *p, apr_uint64_t *result)
+{
+ if (*p < 0x80)
+ {
+ *result = *p;
+ }
+ else
+ {
+ apr_uint64_t shift = 0;
+ apr_uint64_t value = 0;
+ while (*p >= 0x80)
+ {
+ value += (apr_uint64_t)(*p & 0x7f) << shift;
+ ++p;
+
+ shift += 7;
+ if (shift > 64)
+ {
+ /* a definite overflow. Note, that numbers of 65 .. 70
+ bits will not be detected as an overflow as they don't
+ threaten to exceed the input buffer. */
+ *result = 0;
+ return p;
+ }
+ }
+
+ *result = value + ((apr_uint64_t)*p << shift);
+ }
+
+ return ++p;
+}
+
+/* Read one 7b/8b encoded value from STREAM and return it in *RESULT.
+ *
+ * Overflows will be detected in the sense that it will end parsing the
+ * input but the result is undefined.
+ */
+static svn_error_t *
+read_stream_uint(svn_stream_t *stream, apr_uint64_t *result)
+{
+ apr_uint64_t shift = 0;
+ apr_uint64_t value = 0;
+ unsigned char c;
+
+ do
+ {
+ apr_size_t len = 1;
+ SVN_ERR(svn_stream_read_full(stream, (char *)&c, &len));
+ if (len != 1)
+ return svn_error_create(SVN_ERR_CORRUPT_PACKED_DATA, NULL,
+ _("Unexpected end of stream"));
+
+ value += (apr_uint64_t)(c & 0x7f) << shift;
+ shift += 7;
+ if (shift > 64)
+ return svn_error_create(SVN_ERR_CORRUPT_PACKED_DATA, NULL,
+ _("Integer representation too long"));
+ }
+ while (c >= 0x80);
+
+ *result = value;
+ return SVN_NO_ERROR;
+}
+
+/* Extract and return the next integer from PACKED and make PACKED point
+ * to the next integer.
+ */
+static apr_uint64_t
+read_packed_uint(svn_stringbuf_t *packed)
+{
+ apr_uint64_t result = 0;
+ unsigned char *p = (unsigned char *)packed->data;
+ apr_size_t read = read_packed_uint_body(p, &result) - p;
+
+ if (read > packed->len)
+ read = packed->len;
+
+ packed->data += read;
+ packed->blocksize -= read;
+ packed->len -= read;
+
+ return result;
+}
+
+/* Ensure that STREAM contains at least one item in its buffer.
+ */
+static void
+svn_packed__data_fill_buffer(svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ apr_size_t i;
+ apr_size_t end = MIN(SVN__PACKED_DATA_BUFFER_SIZE,
+ private_data->item_count);
+
+ /* in case, some user calls us explicitly without a good reason ... */
+ if (stream->buffer_used)
+ return;
+
+ /* can we get data from the sub-streams or do we have to decode it from
+ our local packed container? */
+ if (private_data->current_substream)
+ for (i = end; i > 0; --i)
+ {
+ packed_int_private_t *current_private_data
+ = private_data->current_substream->private_data;
+ stream->buffer[i-1]
+ = svn_packed__get_uint(private_data->current_substream);
+ private_data->current_substream = current_private_data->next;
+ }
+ else
+ {
+ /* use this local buffer only if the packed data is shorter than this.
+ The goal is that read_packed_uint_body doesn't need check for
+ overflows. */
+ unsigned char local_buffer[10 * SVN__PACKED_DATA_BUFFER_SIZE];
+ unsigned char *p;
+ unsigned char *start;
+ apr_size_t packed_read;
+
+ if (private_data->packed->len < sizeof(local_buffer))
+ {
+ apr_size_t trail = sizeof(local_buffer) - private_data->packed->len;
+ memcpy(local_buffer,
+ private_data->packed->data,
+ private_data->packed->len);
+ memset(local_buffer + private_data->packed->len, 0, MIN(trail, end));
+
+ p = local_buffer;
+ }
+ else
+ p = (unsigned char *)private_data->packed->data;
+
+ /* unpack numbers */
+ start = p;
+ for (i = end; i > 0; --i)
+ p = read_packed_uint_body(p, &stream->buffer[i-1]);
+
+ /* adjust remaining packed data buffer */
+ packed_read = p - start;
+ private_data->packed->data += packed_read;
+ private_data->packed->len -= packed_read;
+ private_data->packed->blocksize -= packed_read;
+
+ /* undeltify numbers, if configured */
+ if (private_data->diff)
+ {
+ apr_uint64_t last_value = private_data->last_value;
+ for (i = end; i > 0; --i)
+ {
+ last_value += unmap_uint(stream->buffer[i-1]);
+ stream->buffer[i-1] = last_value;
+ }
+
+ private_data->last_value = last_value;
+ }
+
+ /* handle signed values, if configured and not handled already */
+ if (!private_data->diff && private_data->is_signed)
+ for (i = 0; i < end; ++i)
+ stream->buffer[i] = unmap_uint(stream->buffer[i]);
+ }
+
+ stream->buffer_used = end;
+ private_data->item_count -= end;
+}
+
+apr_uint64_t
+svn_packed__get_uint(svn_packed__int_stream_t *stream)
+{
+ if (stream->buffer_used == 0)
+ svn_packed__data_fill_buffer(stream);
+
+ return stream->buffer_used ? stream->buffer[--stream->buffer_used] : 0;
+}
+
+apr_int64_t
+svn_packed__get_int(svn_packed__int_stream_t *stream)
+{
+ return (apr_int64_t)svn_packed__get_uint(stream);
+}
+
+const char *
+svn_packed__get_bytes(svn_packed__byte_stream_t *stream,
+ apr_size_t *len)
+{
+ const char *result = stream->packed->data;
+ apr_size_t count = (apr_size_t)svn_packed__get_uint(stream->lengths_stream);
+
+ if (count > stream->packed->len)
+ count = stream->packed->len;
+
+ /* advance packed buffer */
+ stream->packed->data += count;
+ stream->packed->len -= count;
+ stream->packed->blocksize -= count;
+
+ *len = count;
+ return result;
+}
+
+/* Read the integer stream structure and recreate it in STREAM, including
+ * sub-streams, from TREE_STRUCT.
+ */
+static void
+read_int_stream_structure(svn_stringbuf_t *tree_struct,
+ svn_packed__int_stream_t *stream)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ apr_uint64_t value = read_packed_uint(tree_struct);
+ apr_size_t substream_count;
+ apr_size_t i;
+
+ /* extract local parameters */
+ private_data->diff = (value & 1) != 0;
+ private_data->is_signed = (value & 2) != 0;
+ substream_count = (apr_size_t)(value >> 2);
+
+ /* read item count & packed size; allocate packed data buffer */
+ private_data->item_count = (apr_size_t)read_packed_uint(tree_struct);
+ value = read_packed_uint(tree_struct);
+ if (value)
+ {
+ private_data->packed = svn_stringbuf_create_ensure((apr_size_t)value,
+ private_data->pool);
+ private_data->packed->len = (apr_size_t)value;
+ }
+
+ /* add sub-streams and read their config, too */
+ for (i = 0; i < substream_count; ++i)
+ read_int_stream_structure(tree_struct,
+ svn_packed__create_int_substream(stream,
+ FALSE,
+ FALSE));
+}
+
+/* Read the integer stream structure and recreate it in STREAM, including
+ * sub-streams, from TREE_STRUCT. FIRST_INT_STREAM is the integer stream
+ * that would correspond to lengths_stream_index 0.
+ */
+static void
+read_byte_stream_structure(svn_stringbuf_t *tree_struct,
+ svn_packed__byte_stream_t *stream,
+ svn_packed__int_stream_t *first_int_stream)
+{
+ apr_size_t lengths_stream_index;
+ apr_size_t packed_size;
+ apr_size_t i;
+
+ /* read parameters from the TREE_STRUCT buffer */
+ (void) (apr_size_t)read_packed_uint(tree_struct); /* discard first uint */
+ lengths_stream_index = (apr_size_t)read_packed_uint(tree_struct);
+ packed_size = (apr_size_t)read_packed_uint(tree_struct);
+
+ /* allocate byte sequence buffer size */
+ svn_stringbuf_ensure(stream->packed, packed_size);
+ stream->packed->len = packed_size;
+
+ /* navigate to the (already existing) lengths_stream */
+ stream->lengths_stream_index = lengths_stream_index;
+ stream->lengths_stream = first_int_stream;
+ for (i = 0; i < lengths_stream_index; ++i)
+ {
+ packed_int_private_t *length_private
+ = stream->lengths_stream->private_data;
+ stream->lengths_stream = length_private->next;
+ }
+}
+
+/* Read a compressed block from STREAM and uncompress it into UNCOMPRESSED.
+ * UNCOMPRESSED_LEN is the expected size of the stream. COMPRESSED is a
+ * re-used buffer for temporary data.
+ */
+static svn_error_t *
+read_stream_data(svn_stream_t *stream,
+ apr_size_t uncompressed_len,
+ svn_stringbuf_t *uncompressed,
+ svn_stringbuf_t *compressed)
+{
+ apr_uint64_t len;
+ apr_size_t compressed_len;
+
+ SVN_ERR(read_stream_uint(stream, &len));
+ compressed_len = (apr_size_t)len;
+
+ svn_stringbuf_ensure(compressed, compressed_len);
+ compressed->len = compressed_len;
+ SVN_ERR(svn_stream_read_full(stream, compressed->data, &compressed->len));
+ compressed->data[compressed_len] = '\0';
+
+ SVN_ERR(svn__decompress(compressed, uncompressed, uncompressed_len));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the packed contents from COMBINED, starting at *OFFSET and store
+ * it in STREAM. Update *OFFSET to point to the next stream's data and
+ * continue with the sub-streams.
+ */
+static void
+unflatten_int_stream(svn_packed__int_stream_t *stream,
+ svn_stringbuf_t *combined,
+ apr_size_t *offset)
+{
+ packed_int_private_t *private_data = stream->private_data;
+ if (private_data->packed)
+ {
+ memcpy(private_data->packed->data,
+ combined->data + *offset,
+ private_data->packed->len);
+
+ private_data->packed->data[private_data->packed->len] = '\0';
+ *offset += private_data->packed->len;
+ }
+
+ stream = private_data->first_substream;
+ while (stream)
+ {
+ private_data = stream->private_data;
+ unflatten_int_stream(stream, combined, offset);
+ stream = private_data->is_last ? NULL : private_data->next;
+ }
+}
+
+/* Read the packed contents from COMBINED, starting at *OFFSET and store
+ * it in STREAM. Update *OFFSET to point to the next stream's data and
+ * continue with the sub-streams.
+ */
+static void
+unflatten_byte_stream(svn_packed__byte_stream_t *stream,
+ svn_stringbuf_t *combined,
+ apr_size_t *offset)
+{
+ memcpy(stream->packed->data,
+ combined->data + *offset,
+ stream->packed->len);
+ stream->packed->data[stream->packed->len] = '\0';
+
+ *offset += stream->packed->len;
+ for (stream = stream->first_substream; stream; stream = stream->next)
+ unflatten_byte_stream(stream, combined, offset);
+}
+
+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)
+{
+ apr_uint64_t i;
+ apr_uint64_t count;
+
+ svn_packed__int_stream_t *int_stream;
+ svn_packed__byte_stream_t *byte_stream;
+ svn_packed__data_root_t *root = svn_packed__data_create_root(result_pool);
+
+ svn_stringbuf_t *compressed
+ = svn_stringbuf_create_ensure(1024, scratch_pool);
+ svn_stringbuf_t *uncompressed
+ = svn_stringbuf_create_ensure(1024, scratch_pool);
+
+ /* read tree structure */
+
+ apr_uint64_t tree_struct_size;
+ svn_stringbuf_t *tree_struct;
+
+ SVN_ERR(read_stream_uint(stream, &tree_struct_size));
+ tree_struct
+ = svn_stringbuf_create_ensure((apr_size_t)tree_struct_size, scratch_pool);
+ tree_struct->len = (apr_size_t)tree_struct_size;
+
+ SVN_ERR(svn_stream_read_full(stream, tree_struct->data, &tree_struct->len));
+ tree_struct->data[tree_struct->len] = '\0';
+
+ /* reconstruct tree structure */
+
+ count = read_packed_uint(tree_struct);
+ for (i = 0; i < count; ++i)
+ read_int_stream_structure(tree_struct,
+ svn_packed__create_int_stream(root, FALSE,
+ FALSE));
+
+ count = read_packed_uint(tree_struct);
+ for (i = 0; i < count; ++i)
+ read_byte_stream_structure(tree_struct,
+ create_bytes_stream_body(root),
+ root->first_int_stream);
+
+ /* read sub-stream data from disk, unzip it and buffer it */
+
+ for (int_stream = root->first_int_stream;
+ int_stream;
+ int_stream = ((packed_int_private_t*)int_stream->private_data)->next)
+ {
+ apr_size_t offset = 0;
+ SVN_ERR(read_stream_data(stream,
+ packed_int_stream_length(int_stream),
+ uncompressed, compressed));
+ unflatten_int_stream(int_stream, uncompressed, &offset);
+ }
+
+ for (byte_stream = root->first_byte_stream;
+ byte_stream;
+ byte_stream = byte_stream->next)
+ {
+ apr_size_t offset = 0;
+ SVN_ERR(read_stream_data(stream,
+ packed_byte_stream_length(byte_stream),
+ uncompressed, compressed));
+ unflatten_byte_stream(byte_stream, uncompressed, &offset);
+ }
+
+ *root_p = root;
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_subr/path.c b/subversion/libsvn_subr/path.c
index 84368f3..aaeee75 100644
--- a/subversion/libsvn_subr/path.c
+++ b/subversion/libsvn_subr/path.c
@@ -1164,9 +1164,6 @@ svn_path_cstring_to_utf8(const char **path_utf8,
}
-/* Return a copy of PATH, allocated from POOL, for which control
- characters have been escaped using the form \NNN (where NNN is the
- octal representation of the byte's ordinal value). */
const char *
svn_path_illegal_path_escape(const char *path, apr_pool_t *pool)
{
@@ -1228,8 +1225,7 @@ svn_path_check_valid(const char *path, apr_pool_t *pool)
{
if (svn_ctype_iscntrl(*c))
{
- return svn_error_createf
- (SVN_ERR_FS_PATH_SYNTAX, NULL,
+ return svn_error_createf(SVN_ERR_FS_PATH_SYNTAX, NULL,
_("Invalid control character '0x%02x' in path '%s'"),
(unsigned char)*c,
svn_path_illegal_path_escape(svn_dirent_local_style(path, pool),
@@ -1256,7 +1252,7 @@ svn_path_splitext(const char **path_root,
anything after it? We look for the "rightmost" period in the
string. */
last_dot = strrchr(path, '.');
- if (last_dot && (last_dot + 1 != '\0'))
+ if (last_dot && (*(last_dot + 1) != '\0'))
{
/* If we have a period, we need to make sure it occurs in the
final path component -- that there's no path separator
@@ -1303,12 +1299,12 @@ svn_path_resolve_repos_relative_url(const char **absolute_url,
_("Improper relative URL '%s'"),
relative_url);
- /* No assumptions are made about the canonicalization of the inut
+ /* No assumptions are made about the canonicalization of the input
* arguments, it is presumed that the output will be canonicalized after
* this function, which will remove any duplicate path separator.
*/
*absolute_url = apr_pstrcat(pool, repos_root_url, relative_url + 1,
- (char *)NULL);
+ SVN_VA_NULL);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_subr/pool.c b/subversion/libsvn_subr/pool.c
index 179ef79..db57a6e 100644
--- a/subversion/libsvn_subr/pool.c
+++ b/subversion/libsvn_subr/pool.c
@@ -51,7 +51,7 @@ abort_on_pool_failure(int retcode)
{
/* Don't translate this string! It requires memory allocation to do so!
And we don't have any of it... */
- printf("Out of memory - terminating application.\n");
+ printf("libsvn: Out of memory - terminating application.\n");
abort();
return 0; /* not reached */
}
diff --git a/subversion/libsvn_subr/prefix_string.c b/subversion/libsvn_subr/prefix_string.c
new file mode 100644
index 0000000..fcf11bd
--- /dev/null
+++ b/subversion/libsvn_subr/prefix_string.c
@@ -0,0 +1,315 @@
+/* prefix_string.c --- implement strings based on a prefix tree
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+#include "private/svn_string_private.h"
+
+/* A node in the tree represents a common prefix. The root node is the
+ * empty prefix. Nodes may have up to 256 sub-nodes, each starting with
+ * a different character (possibly '\0').
+ *
+ * The nodes in the tree store only up to 8 chars of the respective common
+ * prefix, i.e. longer common prefixes must be drawn out over multiple
+ * hierarchy levels. This is a space <-> efficiency trade-off.
+ *
+ * Strings are the leaf nodes in the tree and use a specialized, smaller
+ * data structure. They may add 0 to 7 extra chars to the prefix. Both
+ * data types can be discerned by the last char in the data buffer. This
+ * must be 0 for strings (leaves) and non-0 otherwise. Please note that
+ * ordinary nodes have a length information so that no terminating 0 is
+ * required for them.
+ */
+
+/* forward declaration */
+typedef struct node_t node_t;
+
+/* String type and tree leaf.
+ */
+struct svn_prefix_string__t
+{
+ /* mandatory prefix */
+ node_t *prefix;
+
+ /* 0 ..7 chars to add the the prefix. NUL-terminated. */
+ char data[8];
+};
+
+/* A node inside the tree, i.e. not a string and not a leaf (unless this is
+ * the root node).
+ *
+ * Note: keep the ordering to minimize size / alignment overhead on 64 bit
+ * machines.
+ */
+struct node_t
+{
+ /* pointer to the parent prefix plus the 1 .. 8 extra chars.
+ * Only the root will provide 0 extra chars. */
+ svn_prefix_string__t key;
+
+ /* Length of the prefix from the root down to and including this one.
+ * 0 for the root node. Only then will key.prefix be NULL. */
+ apr_uint32_t length;
+
+ /* Number of entries used in SUB_NODES. */
+ apr_uint32_t sub_node_count;
+
+ /* The sub-nodes, ordered by first char. node_t and svn_prefix_string__t
+ * may be mixed here. May be NULL.
+ * The number of allocated entries is always a power-of-two and only
+ * given implicitly by SUB_NODE_COUNT. */
+ struct node_t **sub_nodes;
+};
+
+/* The actual tree structure. */
+struct svn_prefix_tree__t
+{
+ /* the common tree root (represents the empty prefix). */
+ node_t *root;
+
+ /* all sub-nodes & strings will be allocated from this pool */
+ apr_pool_t *pool;
+};
+
+/* Return TRUE, iff NODE is a leaf node.
+ */
+static svn_boolean_t
+is_leaf(node_t *node)
+{
+ return node->key.data[7] == 0;
+}
+
+/* Ensure that the sub-nodes array of NODE within TREE has at least one
+ * unused entry. Re-allocate as necessary.
+ */
+static void
+auto_realloc_sub_nodes(svn_prefix_tree__t *tree,
+ node_t *node)
+{
+ if (node->sub_node_count & (node->sub_node_count - 1))
+ return;
+
+ if (node->sub_node_count == 0)
+ {
+ node->sub_nodes = apr_pcalloc(tree->pool, sizeof(*node->sub_nodes));
+ }
+ else
+ {
+ node_t **sub_nodes
+ = apr_pcalloc(tree->pool,
+ 2 * node->sub_node_count * sizeof(*sub_nodes));
+ memcpy(sub_nodes, node->sub_nodes,
+ node->sub_node_count * sizeof(*sub_nodes));
+ node->sub_nodes = sub_nodes;
+ }
+}
+
+/* Given the COUNT pointers in the SUB_NODES array, return the location at
+ * which KEY is either located or would be inserted.
+ */
+static int
+search_lower_bound(node_t **sub_nodes,
+ unsigned char key,
+ int count)
+{
+ int lower = 0;
+ int upper = count - 1;
+
+ /* Binary search for the lowest position at which to insert KEY. */
+ while (lower <= upper)
+ {
+ int current = lower + (upper - lower) / 2;
+
+ if ((unsigned char)sub_nodes[current]->key.data[0] < key)
+ lower = current + 1;
+ else
+ upper = current - 1;
+ }
+
+ return lower;
+}
+
+svn_prefix_tree__t *
+svn_prefix_tree__create(apr_pool_t *pool)
+{
+ svn_prefix_tree__t *tree = apr_pcalloc(pool, sizeof(*tree));
+ tree->pool = pool;
+
+ tree->root = apr_pcalloc(pool, sizeof(*tree->root));
+ tree->root->key.data[7] = '\xff';
+
+ return tree;
+}
+
+svn_prefix_string__t *
+svn_prefix_string__create(svn_prefix_tree__t *tree,
+ const char *s)
+{
+ svn_prefix_string__t *new_string;
+ apr_size_t len = strlen(s);
+ node_t *node = tree->root;
+ node_t *new_node;
+ int idx;
+
+ /* walk the existing tree until we either find S or the node at which S
+ * has to be inserted */
+ while (TRUE)
+ {
+ node_t *sub_node;
+ int match = 1;
+
+ /* index of the matching sub-node */
+ idx = node->sub_node_count
+ ? search_lower_bound(node->sub_nodes,
+ (unsigned char)s[node->length],
+ node->sub_node_count)
+ : 0;
+
+ /* any (partially) matching sub-nodes? */
+ if (idx == (int)node->sub_node_count
+ || node->sub_nodes[idx]->key.data[0] != s[node->length])
+ break;
+
+ sub_node = node->sub_nodes[idx];
+
+ /* fully matching sub-node? */
+ if (is_leaf(sub_node))
+ {
+ if (strcmp(sub_node->key.data, s + node->length) == 0)
+ return &sub_node->key;
+ }
+ else
+ {
+ apr_size_t sub_node_len = sub_node->length - node->length;
+ if (strncmp(sub_node->key.data, s + node->length,
+ sub_node_len) == 0)
+ {
+ node = sub_node;
+ continue;
+ }
+ }
+
+ /* partial match -> split */
+ while (sub_node->key.data[match] == s[node->length + match])
+ ++match;
+
+ new_node = apr_pcalloc(tree->pool, sizeof(*new_node));
+ new_node->key = sub_node->key;
+ new_node->length = node->length + match;
+ new_node->key.data[7] = '\xff';
+ new_node->sub_node_count = 1;
+ new_node->sub_nodes = apr_palloc(tree->pool, sizeof(node_t *));
+ new_node->sub_nodes[0] = sub_node;
+
+ memmove(sub_node->key.data, sub_node->key.data + match, 8 - match);
+
+ /* replace old sub-node with new one and continue lookup */
+ sub_node->key.prefix = new_node;
+ node->sub_nodes[idx] = new_node;
+ node = new_node;
+ }
+
+ /* add sub-node(s) and final string */
+ while (node->length + 7 < len)
+ {
+ new_node = apr_pcalloc(tree->pool, sizeof(*new_node));
+ new_node->key.prefix = node;
+ new_node->length = node->length + 8;
+ memcpy(new_node->key.data, s + node->length, 8);
+
+ auto_realloc_sub_nodes(tree, node);
+ memmove(node->sub_nodes + idx + 1, node->sub_nodes + idx,
+ (node->sub_node_count - idx) * sizeof(node_t *));
+
+ /* replace old sub-node with new one and continue lookup */
+ node->sub_nodes[idx] = new_node;
+ node->sub_node_count++;
+ node = new_node;
+ idx = 0;
+ }
+
+ new_string = apr_pcalloc(tree->pool, sizeof(*new_string));
+ new_string->prefix = node;
+ memcpy(new_string->data, s + node->length, len - node->length);
+
+ auto_realloc_sub_nodes(tree, node);
+ memmove(node->sub_nodes + idx + 1, node->sub_nodes + idx,
+ (node->sub_node_count - idx) * sizeof(node_t *));
+
+ node->sub_nodes[idx] = (node_t *)new_string;
+ node->sub_node_count++;
+ return new_string;
+}
+
+svn_string_t *
+svn_prefix_string__expand(const svn_prefix_string__t *s,
+ apr_pool_t *pool)
+{
+ apr_size_t s_len = strlen(s->data);
+ apr_size_t len = s->prefix->length + s_len;
+ char *buffer = apr_palloc(pool, len + 1);
+
+ svn_string_t *result = apr_pcalloc(pool, sizeof(*result));
+ result->data = buffer;
+ result->len = len;
+ buffer[len] = '\0';
+
+ while (s->prefix)
+ {
+ memcpy(buffer + s->prefix->length, s->data, len - s->prefix->length);
+ len = s->prefix->length;
+ s = &s->prefix->key;
+ }
+
+ return result;
+}
+
+int
+svn_prefix_string__compare(const svn_prefix_string__t *lhs,
+ const svn_prefix_string__t *rhs)
+{
+ const node_t *lhs_parent = lhs->prefix;
+ const node_t *rhs_parent = rhs->prefix;
+
+ if (lhs == rhs)
+ return 0;
+
+ /* find the common root */
+ while (lhs_parent != rhs_parent)
+ {
+ if (lhs_parent->length <= rhs_parent->length)
+ {
+ rhs = &rhs_parent->key;
+ rhs_parent = rhs_parent->key.prefix;
+ }
+ else if (rhs_parent->length <= lhs_parent->length)
+ {
+ lhs = &lhs_parent->key;
+ lhs_parent = lhs_parent->key.prefix;
+ }
+
+ /* same tree? */
+ assert(lhs_parent && rhs_parent);
+ }
+
+ /* at the common root, strings will differ in the first follow-up char */
+ return (int)(unsigned char)lhs->data[0] - (int)(unsigned char)rhs->data[0];
+}
diff --git a/subversion/libsvn_subr/prompt.c b/subversion/libsvn_subr/prompt.c
index d0c29d0..8f24b42 100644
--- a/subversion/libsvn_subr/prompt.c
+++ b/subversion/libsvn_subr/prompt.c
@@ -177,7 +177,7 @@ terminal_open(terminal_handle_t **terminal, svn_boolean_t noecho,
and stderr for prompting. */
apr_file_t *tmpfd;
status = apr_file_open(&tmpfd, "/dev/tty",
- APR_READ | APR_WRITE,
+ APR_FOPEN_READ | APR_FOPEN_WRITE,
APR_OS_DEFAULT, pool);
*terminal = apr_palloc(pool, sizeof(terminal_handle_t));
if (!status)
@@ -236,7 +236,6 @@ terminal_puts(const char *string, terminal_handle_t *terminal,
apr_pool_t *pool)
{
svn_error_t *err;
- apr_status_t status;
const char *converted;
err = svn_cmdline_cstring_from_utf8(&converted, string, pool);
@@ -255,13 +254,10 @@ terminal_puts(const char *string, terminal_handle_t *terminal,
}
#endif
- status = apr_file_write_full(terminal->outfd, converted,
- strlen(converted), NULL);
- if (!status)
- status = apr_file_flush(terminal->outfd);
- if (status)
- return svn_error_wrap_apr(status, _("Can't write to terminal"));
- return SVN_NO_ERROR;
+ SVN_ERR(svn_io_file_write_full(terminal->outfd, converted,
+ strlen(converted), NULL, pool));
+
+ return svn_error_trace(svn_io_file_flush(terminal->outfd, pool));
}
/* These codes can be returned from terminal_getc instead of a character. */
@@ -835,9 +831,8 @@ plaintext_prompt_helper(svn_boolean_t *may_save_plaintext,
{
if (err->apr_err == SVN_ERR_CANCELLED)
{
- svn_error_clear(err);
*may_save_plaintext = FALSE;
- return SVN_NO_ERROR;
+ return err;
}
else
return err;
diff --git a/subversion/libsvn_subr/pseudo_md5.c b/subversion/libsvn_subr/pseudo_md5.c
deleted file mode 100644
index 8c194f7..0000000
--- a/subversion/libsvn_subr/pseudo_md5.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * This is work is derived from material Copyright RSA Data Security, Inc.
- *
- * The RSA copyright statement and Licence for that original material is
- * included below. This is followed by the Apache copyright statement and
- * licence for the modifications made to that material.
- */
-
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
- rights reserved.
-
- License to copy and use this software is granted provided that it
- is identified as the "RSA Data Security, Inc. MD5 Message-Digest
- Algorithm" in all material mentioning or referencing this software
- or this function.
-
- License is also granted to make and use derivative works provided
- that such works are identified as "derived from the RSA Data
- Security, Inc. MD5 Message-Digest Algorithm" in all material
- mentioning or referencing the derived work.
-
- RSA Data Security, Inc. makes no representations concerning either
- the merchantability of this software or the suitability of this
- software for any particular purpose. It is provided "as is"
- without express or implied warranty of any kind.
-
- These notices must be retained in any copies of any part of this
- documentation and/or software.
- */
-
-/* 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.
- */
-
-/*
- * The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
- * MD5 crypt() function, which is licenced as follows:
- * ----------------------------------------------------------------------------
- * "THE BEER-WARE LICENSE" (Revision 42):
- * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
- * ----------------------------------------------------------------------------
- */
-
-/*
- * pseudo_md5.c: md5-esque hash sum calculation for short data blocks.
- * Code taken and adapted from the APR (see licenses above).
- */
-#include "private/svn_pseudo_md5.h"
-
-/* Constants for MD5 calculation.
- */
-
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-#if defined(_MSC_VER) && _MSC_VER >= 1310
-#pragma intrinsic(_rotl)
-#define ROTATE_LEFT(x, n) (_rotl(x,n))
-#else
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-#endif
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
- * Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-/* The idea of the functions below is as follows:
- *
- * - The core MD5 algorithm does not assume that the "important" data
- * is at the begin of the encryption block, followed by e.g. 0.
- * Instead, all bits are equally relevant.
- *
- * - If some bytes in the input are known to be 0, we may hard-code them.
- * With the previous property, it is safe to move them to the upper end
- * of the encryption block to maximize the number of steps that can be
- * pre-calculated.
- *
- * - Variable-length streams will use the upper 8 byte of the last
- * encryption block to store the stream length in bits (to make 0, 00,
- * 000, ... etc. produce different hash sums).
- *
- * - We will hash at most 63 bytes, i.e. 504 bits. In the standard stream
- * implementation, the upper 6 bytes of the last encryption block would
- * be 0. We will put at least one non-NULL value in the last 4 bytes.
- * Therefore, our input will always be different to a standard MD5 stream
- * implementation in either block count, content or both.
- *
- * - Our length indicator also varies with the number bytes in the input.
- * Hence, different pseudo-MD5 input length produces different output
- * (with "cryptographic probability") even if the content is all 0 or
- * otherwise identical.
- *
- * - Collisions between pseudo-MD5 and pseudo-MD5 as well as pseudo-MD5
- * and standard MD5 are as likely as any other MD5 collision.
- */
-
-void svn__pseudo_md5_15(apr_uint32_t digest[4],
- const apr_uint32_t x[4])
-{
- apr_uint32_t a = 0x67452301;
- apr_uint32_t b = 0xefcdab89;
- apr_uint32_t c = 0x98badcfe;
- apr_uint32_t d = 0x10325476;
-
- /* make sure byte 63 gets the marker independently of BE / LE */
- apr_uint32_t x3n = x[3] ^ 0xffffffff;
-
- /* Round 1 */
- FF(a, b, c, d, 0, S11, 0xd76aa478); /* 1 */
- FF(d, a, b, c, 0, S12, 0xe8c7b756); /* 2 */
- FF(c, d, a, b, 0, S13, 0x242070db); /* 3 */
- FF(b, c, d, a, 0, S14, 0xc1bdceee); /* 4 */
- FF(a, b, c, d, 0, S11, 0xf57c0faf); /* 5 */
- FF(d, a, b, c, 0, S12, 0x4787c62a); /* 6 */
- FF(c, d, a, b, 0, S13, 0xa8304613); /* 7 */
- FF(b, c, d, a, 0, S14, 0xfd469501); /* 8 */
- FF(a, b, c, d, 0, S11, 0x698098d8); /* 9 */
- FF(d, a, b, c, 0, S12, 0x8b44f7af); /* 10 */
- FF(c, d, a, b, 0, S13, 0xffff5bb1); /* 11 */
- FF(b, c, d, a, 0, S14, 0x895cd7be); /* 12 */
- FF(a, b, c, d, x[0], S11, 0x6b901122); /* 13 */
- FF(d, a, b, c, x[1], S12, 0xfd987193); /* 14 */
- FF(c, d, a, b, x[2], S13, 0xa679438e); /* 15 */
- FF(b, c, d, a, x3n, S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG(a, b, c, d, 0, S21, 0xf61e2562); /* 17 */
- GG(d, a, b, c, 0, S22, 0xc040b340); /* 18 */
- GG(c, d, a, b, 0, S23, 0x265e5a51); /* 19 */
- GG(b, c, d, a, 0, S24, 0xe9b6c7aa); /* 20 */
- GG(a, b, c, d, 0, S21, 0xd62f105d); /* 21 */
- GG(d, a, b, c, 0, S22, 0x2441453); /* 22 */
- GG(c, d, a, b, x3n, S23, 0xd8a1e681); /* 23 */
- GG(b, c, d, a, 0, S24, 0xe7d3fbc8); /* 24 */
- GG(a, b, c, d, 0, S21, 0x21e1cde6); /* 25 */
- GG(d, a, b, c, x[2], S22, 0xc33707d6); /* 26 */
- GG(c, d, a, b, 0, S23, 0xf4d50d87); /* 27 */
- GG(b, c, d, a, 0, S24, 0x455a14ed); /* 28 */
- GG(a, b, c, d, x[1], S21, 0xa9e3e905); /* 29 */
- GG(d, a, b, c, 0, S22, 0xfcefa3f8); /* 30 */
- GG(c, d, a, b, 0, S23, 0x676f02d9); /* 31 */
- GG(b, c, d, a, x[0], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH(a, b, c, d, 0, S31, 0xfffa3942); /* 33 */
- HH(d, a, b, c, 0, S32, 0x8771f681); /* 34 */
- HH(c, d, a, b, 0, S33, 0x6d9d6122); /* 35 */
- HH(b, c, d, a, x[2], S34, 0xfde5380c); /* 36 */
- HH(a, b, c, d, 0, S31, 0xa4beea44); /* 37 */
- HH(d, a, b, c, 0, S32, 0x4bdecfa9); /* 38 */
- HH(c, d, a, b, 0, S33, 0xf6bb4b60); /* 39 */
- HH(b, c, d, a, 0, S34, 0xbebfbc70); /* 40 */
- HH(a, b, c, d, x[1], S31, 0x289b7ec6); /* 41 */
- HH(d, a, b, c, 0, S32, 0xeaa127fa); /* 42 */
- HH(c, d, a, b, 0, S33, 0xd4ef3085); /* 43 */
- HH(b, c, d, a, 0, S34, 0x4881d05); /* 44 */
- HH(a, b, c, d, 0, S31, 0xd9d4d039); /* 45 */
- HH(d, a, b, c, x[0], S32, 0xe6db99e5); /* 46 */
- HH(c, d, a, b, x3n, S33, 0x1fa27cf8); /* 47 */
- HH(b, c, d, a, 0, S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II(a, b, c, d, 0, S41, 0xf4292244); /* 49 */
- II(d, a, b, c, 0, S42, 0x432aff97); /* 50 */
- II(c, d, a, b, x[2], S43, 0xab9423a7); /* 51 */
- II(b, c, d, a, 0, S44, 0xfc93a039); /* 52 */
- II(a, b, c, d, x[0], S41, 0x655b59c3); /* 53 */
- II(d, a, b, c, 0, S42, 0x8f0ccc92); /* 54 */
- II(c, d, a, b, 0, S43, 0xffeff47d); /* 55 */
- II(b, c, d, a, 0, S44, 0x85845dd1); /* 56 */
- II(a, b, c, d, 0, S41, 0x6fa87e4f); /* 57 */
- II(d, a, b, c, x3n, S42, 0xfe2ce6e0); /* 58 */
- II(c, d, a, b, 0, S43, 0xa3014314); /* 59 */
- II(b, c, d, a, x[1], S44, 0x4e0811a1); /* 60 */
- II(a, b, c, d, 0, S41, 0xf7537e82); /* 61 */
- II(d, a, b, c, 0, S42, 0xbd3af235); /* 62 */
- II(c, d, a, b, 0, S43, 0x2ad7d2bb); /* 63 */
- II(b, c, d, a, 0, S44, 0xeb86d391); /* 64 */
-
- digest[0] = a;
- digest[1] = b;
- digest[2] = c;
- digest[3] = d;
-}
-
-void svn__pseudo_md5_31(apr_uint32_t digest[4],
- const apr_uint32_t x[8])
-{
- apr_uint32_t a = 0x67452301;
- apr_uint32_t b = 0xefcdab89;
- apr_uint32_t c = 0x98badcfe;
- apr_uint32_t d = 0x10325476;
-
- /* make sure byte 63 gets the marker independently of BE / LE */
- apr_uint32_t x7n = x[7] ^ 0xfefefefe;
-
- /* Round 1 */
- FF(a, b, c, d, 0, S11, 0xd76aa478); /* 1 */
- FF(d, a, b, c, 0, S12, 0xe8c7b756); /* 2 */
- FF(c, d, a, b, 0, S13, 0x242070db); /* 3 */
- FF(b, c, d, a, 0, S14, 0xc1bdceee); /* 4 */
- FF(a, b, c, d, 0, S11, 0xf57c0faf); /* 5 */
- FF(d, a, b, c, 0, S12, 0x4787c62a); /* 6 */
- FF(c, d, a, b, 0, S13, 0xa8304613); /* 7 */
- FF(b, c, d, a, 0, S14, 0xfd469501); /* 8 */
- FF(a, b, c, d, x[0], S11, 0x698098d8); /* 9 */
- FF(d, a, b, c, x[1], S12, 0x8b44f7af); /* 10 */
- FF(c, d, a, b, x[2], S13, 0xffff5bb1); /* 11 */
- FF(b, c, d, a, x[3], S14, 0x895cd7be); /* 12 */
- FF(a, b, c, d, x[4], S11, 0x6b901122); /* 13 */
- FF(d, a, b, c, x[5], S12, 0xfd987193); /* 14 */
- FF(c, d, a, b, x[6], S13, 0xa679438e); /* 15 */
- FF(b, c, d, a, x7n, S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG(a, b, c, d, 0, S21, 0xf61e2562); /* 17 */
- GG(d, a, b, c, 0, S22, 0xc040b340); /* 18 */
- GG(c, d, a, b, x[3], S23, 0x265e5a51); /* 19 */
- GG(b, c, d, a, 0, S24, 0xe9b6c7aa); /* 20 */
- GG(a, b, c, d, 0, S21, 0xd62f105d); /* 21 */
- GG(d, a, b, c, x[2], S22, 0x2441453); /* 22 */
- GG(c, d, a, b, x7n, S23, 0xd8a1e681); /* 23 */
- GG(b, c, d, a, 0, S24, 0xe7d3fbc8); /* 24 */
- GG(a, b, c, d, x[1], S21, 0x21e1cde6); /* 25 */
- GG(d, a, b, c, x[6], S22, 0xc33707d6); /* 26 */
- GG(c, d, a, b, 0, S23, 0xf4d50d87); /* 27 */
- GG(b, c, d, a, x[0], S24, 0x455a14ed); /* 28 */
- GG(a, b, c, d, x[5], S21, 0xa9e3e905); /* 29 */
- GG(d, a, b, c, 0, S22, 0xfcefa3f8); /* 30 */
- GG(c, d, a, b, 0, S23, 0x676f02d9); /* 31 */
- GG(b, c, d, a, x[4], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH(a, b, c, d, 0, S31, 0xfffa3942); /* 33 */
- HH(d, a, b, c, x[0], S32, 0x8771f681); /* 34 */
- HH(c, d, a, b, x[3], S33, 0x6d9d6122); /* 35 */
- HH(b, c, d, a, x[6], S34, 0xfde5380c); /* 36 */
- HH(a, b, c, d, 0, S31, 0xa4beea44); /* 37 */
- HH(d, a, b, c, 0, S32, 0x4bdecfa9); /* 38 */
- HH(c, d, a, b, 0, S33, 0xf6bb4b60); /* 39 */
- HH(b, c, d, a, x[2], S34, 0xbebfbc70); /* 40 */
- HH(a, b, c, d, x[5], S31, 0x289b7ec6); /* 41 */
- HH(d, a, b, c, 0, S32, 0xeaa127fa); /* 42 */
- HH(c, d, a, b, 0, S33, 0xd4ef3085); /* 43 */
- HH(b, c, d, a, 0, S34, 0x4881d05); /* 44 */
- HH(a, b, c, d, x[1], S31, 0xd9d4d039); /* 45 */
- HH(d, a, b, c, x[4], S32, 0xe6db99e5); /* 46 */
- HH(c, d, a, b, x7n, S33, 0x1fa27cf8); /* 47 */
- HH(b, c, d, a, 0, S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II(a, b, c, d, 0, S41, 0xf4292244); /* 49 */
- II(d, a, b, c, 0, S42, 0x432aff97); /* 50 */
- II(c, d, a, b, x[6], S43, 0xab9423a7); /* 51 */
- II(b, c, d, a, 0, S44, 0xfc93a039); /* 52 */
- II(a, b, c, d, x[4], S41, 0x655b59c3); /* 53 */
- II(d, a, b, c, 0, S42, 0x8f0ccc92); /* 54 */
- II(c, d, a, b, x[2], S43, 0xffeff47d); /* 55 */
- II(b, c, d, a, 0, S44, 0x85845dd1); /* 56 */
- II(a, b, c, d, x[0], S41, 0x6fa87e4f); /* 57 */
- II(d, a, b, c, x7n, S42, 0xfe2ce6e0); /* 58 */
- II(c, d, a, b, 0, S43, 0xa3014314); /* 59 */
- II(b, c, d, a, x[5], S44, 0x4e0811a1); /* 60 */
- II(a, b, c, d, 0, S41, 0xf7537e82); /* 61 */
- II(d, a, b, c, x[3], S42, 0xbd3af235); /* 62 */
- II(c, d, a, b, 0, S43, 0x2ad7d2bb); /* 63 */
- II(b, c, d, a, x[1], S44, 0xeb86d391); /* 64 */
-
- digest[0] = a;
- digest[1] = b;
- digest[2] = c;
- digest[3] = d;
-}
-
-void svn__pseudo_md5_63(apr_uint32_t digest[4],
- const apr_uint32_t x[16])
-{
- apr_uint32_t a = 0x67452301;
- apr_uint32_t b = 0xefcdab89;
- apr_uint32_t c = 0x98badcfe;
- apr_uint32_t d = 0x10325476;
-
- /* make sure byte 63 gets the marker independently of BE / LE */
- apr_uint32_t x15n = x[15] ^ 0xfcfcfcfc;
-
- /* Round 1 */
- FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
- FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
- FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
- FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
- FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
- FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
- FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
- FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
- FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
- FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
- FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF(b, c, d, a, x15n, S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
- GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
- GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
- GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
- GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG(c, d, a, b, x15n, S23, 0xd8a1e681); /* 23 */
- GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
- GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
- GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
- GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
- GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
- GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
- GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
- HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
- HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
- HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
- HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
- HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
- HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
- HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
- HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
- HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH(c, d, a, b, x15n, S33, 0x1fa27cf8); /* 47 */
- HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
- II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
- II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
- II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
- II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
- II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
- II(d, a, b, c, x15n, S42, 0xfe2ce6e0); /* 58 */
- II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
- II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
- II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
- II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
-
- digest[0] = a;
- digest[1] = b;
- digest[2] = c;
- digest[3] = d;
-}
diff --git a/subversion/libsvn_subr/root_pools.c b/subversion/libsvn_subr/root_pools.c
new file mode 100644
index 0000000..12096d9
--- /dev/null
+++ b/subversion/libsvn_subr/root_pools.c
@@ -0,0 +1,110 @@
+/*
+ * root_pools.c : Implement svn_root_pools__* API
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+
+#include "private/svn_subr_private.h"
+#include "private/svn_mutex.h"
+
+struct svn_root_pools__t
+{
+ /* unused pools.
+ * Use MUTEX to serialize access to this collection.
+ */
+ apr_array_header_t *unused_pools;
+
+ /* Mutex to serialize access to UNUSED_POOLS */
+ svn_mutex__t *mutex;
+
+};
+
+svn_error_t *
+svn_root_pools__create(svn_root_pools__t **pools)
+{
+ /* the collection of root pools must be managed independently from
+ any other pool */
+ apr_pool_t *pool
+ = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ /* construct result object */
+ svn_root_pools__t *result = apr_pcalloc(pool, sizeof(*result));
+ SVN_ERR(svn_mutex__init(&result->mutex, TRUE, pool));
+ result->unused_pools = apr_array_make(pool, 16, sizeof(apr_pool_t *));
+
+ /* done */
+ *pools = result;
+
+ return SVN_NO_ERROR;
+}
+
+/* Return a currently unused connection pool in *POOL. If no such pool
+ * exists, create a new root pool and return that in *POOL.
+ */
+static svn_error_t *
+acquire_pool_internal(apr_pool_t **pool,
+ svn_root_pools__t *pools)
+{
+ SVN_ERR(svn_mutex__lock(pools->mutex));
+ *pool = pools->unused_pools->nelts
+ ? *(apr_pool_t **)apr_array_pop(pools->unused_pools)
+ : apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+ SVN_ERR(svn_mutex__unlock(pools->mutex, SVN_NO_ERROR));
+
+ return SVN_NO_ERROR;
+}
+
+apr_pool_t *
+svn_root_pools__acquire_pool(svn_root_pools__t *pools)
+{
+ apr_pool_t *pool;
+ svn_error_t *err = acquire_pool_internal(&pool, pools);
+ if (err)
+ {
+ /* Mutex failure?! Well, try to continue with unrecycled data. */
+ svn_error_clear(err);
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+ }
+
+ return pool;
+}
+
+void
+svn_root_pools__release_pool(apr_pool_t *pool,
+ svn_root_pools__t *pools)
+{
+ svn_error_t *err;
+
+ svn_pool_clear(pool);
+
+ err = svn_mutex__lock(pools->mutex);
+ if (err)
+ {
+ svn_error_clear(err);
+ svn_pool_destroy(pool);
+ }
+ else
+ {
+ APR_ARRAY_PUSH(pools->unused_pools, apr_pool_t *) = pool;
+ svn_error_clear(svn_mutex__unlock(pools->mutex, SVN_NO_ERROR));
+ }
+}
diff --git a/subversion/libsvn_subr/sha1.c b/subversion/libsvn_subr/sha1.c
deleted file mode 100644
index 45470cb..0000000
--- a/subversion/libsvn_subr/sha1.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * sha1.c: SHA1 checksum routines
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-#include <apr_sha1.h>
-
-#include "sha1.h"
-
-
-
-/* The SHA1 digest for the empty string. */
-static const unsigned char svn_sha1__empty_string_digest_array[] = {
- 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
- 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
-};
-
-const unsigned char *
-svn_sha1__empty_string_digest(void)
-{
- return svn_sha1__empty_string_digest_array;
-}
-
-
-const char *
-svn_sha1__digest_to_cstring_display(const unsigned char digest[],
- apr_pool_t *pool)
-{
- static const char *hex = "0123456789abcdef";
- char *str = apr_palloc(pool, (APR_SHA1_DIGESTSIZE * 2) + 1);
- int i;
-
- for (i = 0; i < APR_SHA1_DIGESTSIZE; i++)
- {
- str[i*2] = hex[digest[i] >> 4];
- str[i*2+1] = hex[digest[i] & 0x0f];
- }
- str[i*2] = '\0';
-
- return str;
-}
-
-
-const char *
-svn_sha1__digest_to_cstring(const unsigned char digest[], apr_pool_t *pool)
-{
- static const unsigned char zeros_digest[APR_SHA1_DIGESTSIZE] = { 0 };
-
- if (memcmp(digest, zeros_digest, APR_SHA1_DIGESTSIZE) != 0)
- return svn_sha1__digest_to_cstring_display(digest, pool);
- else
- return NULL;
-}
-
-
-svn_boolean_t
-svn_sha1__digests_match(const unsigned char d1[], const unsigned char d2[])
-{
- static const unsigned char zeros[APR_SHA1_DIGESTSIZE] = { 0 };
-
- return ((memcmp(d1, zeros, APR_SHA1_DIGESTSIZE) == 0)
- || (memcmp(d2, zeros, APR_SHA1_DIGESTSIZE) == 0)
- || (memcmp(d1, d2, APR_SHA1_DIGESTSIZE) == 0));
-}
diff --git a/subversion/libsvn_subr/sha1.h b/subversion/libsvn_subr/sha1.h
deleted file mode 100644
index 976810b..0000000
--- a/subversion/libsvn_subr/sha1.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * sha1.h: Converting and comparing SHA1 checksums
- *
- * ====================================================================
- * 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_LIBSVN_SUBR_SHA1_H
-#define SVN_LIBSVN_SUBR_SHA1_H
-
-#include <apr_pools.h>
-#include "svn_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-
-/* The SHA1 digest for the empty string. */
-const unsigned char *
-svn_sha1__empty_string_digest(void);
-
-
-/* Return the hex representation of DIGEST, which must be
- * APR_SHA1_DIGESTSIZE bytes long, allocating the string in POOL.
- */
-const char *
-svn_sha1__digest_to_cstring_display(const unsigned char digest[],
- apr_pool_t *pool);
-
-
-/* Return the hex representation of DIGEST, which must be
- * APR_SHA1_DIGESTSIZE bytes long, allocating the string in POOL.
- * If DIGEST is all zeros, then return NULL.
- */
-const char *
-svn_sha1__digest_to_cstring(const unsigned char digest[],
- apr_pool_t *pool);
-
-
-/** Compare digests D1 and D2, each APR_SHA1_DIGESTSIZE bytes long.
- * If neither is all zeros, and they do not match, then return FALSE;
- * else return TRUE.
- */
-svn_boolean_t
-svn_sha1__digests_match(const unsigned char d1[],
- const unsigned char d2[]);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* SVN_LIBSVN_SUBR_SHA1_H */
diff --git a/subversion/libsvn_subr/simple_providers.c b/subversion/libsvn_subr/simple_providers.c
index e70770a..7e29be7 100644
--- a/subversion/libsvn_subr/simple_providers.c
+++ b/subversion/libsvn_subr/simple_providers.c
@@ -47,12 +47,6 @@
/* File provider */
/*-----------------------------------------------------------------------*/
-/* The keys that will be stored on disk. These serve the same role as
- similar constants in other providers. */
-#define AUTHN_USERNAME_KEY "username"
-#define AUTHN_PASSWORD_KEY "password"
-#define AUTHN_PASSTYPE_KEY "passtype"
-
/* Baton type for the simple provider. */
typedef struct simple_provider_baton_t
{
@@ -81,10 +75,10 @@ svn_auth__simple_password_get(svn_boolean_t *done,
*done = FALSE;
- str = svn_hash_gets(creds, AUTHN_USERNAME_KEY);
+ str = svn_hash_gets(creds, SVN_CONFIG_AUTHN_USERNAME_KEY);
if (str && username && strcmp(str->data, username) == 0)
{
- str = svn_hash_gets(creds, AUTHN_PASSWORD_KEY);
+ str = svn_hash_gets(creds, SVN_CONFIG_AUTHN_PASSWORD_KEY);
if (str && str->data)
{
*password = str->data;
@@ -107,7 +101,8 @@ svn_auth__simple_password_set(svn_boolean_t *done,
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
- svn_hash_sets(creds, AUTHN_PASSWORD_KEY, svn_string_create(password, pool));
+ svn_hash_sets(creds, SVN_CONFIG_AUTHN_PASSWORD_KEY,
+ svn_string_create(password, pool));
*done = TRUE;
return SVN_NO_ERROR;
@@ -122,7 +117,7 @@ simple_username_get(const char **username,
svn_boolean_t non_interactive)
{
svn_string_t *str;
- str = svn_hash_gets(creds, AUTHN_USERNAME_KEY);
+ str = svn_hash_gets(creds, SVN_CONFIG_AUTHN_USERNAME_KEY);
if (str && str->data)
{
*username = str->data;
@@ -184,7 +179,7 @@ svn_auth__simple_creds_cache_get(void **credentials,
/* The password type in the auth data must match the
mangler's type, otherwise the password must be
interpreted by another provider. */
- str = svn_hash_gets(creds_hash, AUTHN_PASSTYPE_KEY);
+ str = svn_hash_gets(creds_hash, SVN_CONFIG_AUTHN_PASSTYPE_KEY);
if (str && str->data)
if (passtype && (0 == strcmp(str->data, passtype)))
have_passtype = TRUE;
@@ -333,7 +328,7 @@ svn_auth__simple_creds_cache_set(svn_boolean_t *saved,
/* Put the username into the credentials hash. */
creds_hash = apr_hash_make(pool);
- svn_hash_sets(creds_hash, AUTHN_USERNAME_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_USERNAME_KEY,
svn_string_create(creds->username, pool));
/* Don't store passwords in any form if the user has told
@@ -461,7 +456,7 @@ svn_auth__simple_creds_cache_set(svn_boolean_t *saved,
if (*saved && passtype)
/* Store the password type with the auth data, so that we
know which provider owns the password. */
- svn_hash_sets(creds_hash, AUTHN_PASSTYPE_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_PASSTYPE_KEY,
svn_string_create(passtype, pool));
}
}
@@ -600,7 +595,7 @@ prompt_for_simple_creds(svn_auth_cred_simple_t **cred_p,
svn_error_clear(err);
if (! err && creds_hash)
{
- str = svn_hash_gets(creds_hash, AUTHN_USERNAME_KEY);
+ str = svn_hash_gets(creds_hash, SVN_CONFIG_AUTHN_USERNAME_KEY);
if (str && str->data)
default_username = str->data;
}
diff --git a/subversion/libsvn_subr/sorts.c b/subversion/libsvn_subr/sorts.c
index bdec8e4..06a4964 100644
--- a/subversion/libsvn_subr/sorts.c
+++ b/subversion/libsvn_subr/sorts.c
@@ -32,6 +32,7 @@
#include "svn_path.h"
#include "svn_sorts.h"
#include "svn_error.h"
+#include "private/svn_sorts_private.h"
@@ -133,6 +134,14 @@ svn_sort_compare_ranges(const void *a, const void *b)
return item1->start < item2->start ? -1 : 1;
}
+void
+svn_sort__array(apr_array_header_t *array,
+ int (*comparison_func)(const void *,
+ const void *))
+{
+ qsort(array->elts, array->nelts, array->elt_size, comparison_func);
+}
+
apr_array_header_t *
svn_sort__hash(apr_hash_t *ht,
int (*comparison_func)(const svn_sort__item_t *,
@@ -171,7 +180,7 @@ svn_sort__hash(apr_hash_t *ht,
/* quicksort the array if it isn't already sorted. */
if (!sorted)
- qsort(ary->elts, ary->nelts, ary->elt_size,
+ svn_sort__array(ary,
(int (*)(const void *, const void *))comparison_func);
return ary;
@@ -213,8 +222,8 @@ bsearch_lower_bound(const void *key,
}
int
-svn_sort__bsearch_lower_bound(const void *key,
- const apr_array_header_t *array,
+svn_sort__bsearch_lower_bound(const apr_array_header_t *array,
+ const void *key,
int (*compare_func)(const void *, const void *))
{
return bsearch_lower_bound(key,
@@ -222,9 +231,77 @@ svn_sort__bsearch_lower_bound(const void *key,
compare_func);
}
+void *
+svn_sort__array_lookup(const apr_array_header_t *array,
+ const void *key,
+ int *hint,
+ int (*compare_func)(const void *, const void *))
+{
+ void *result;
+ int idx;
+
+ /* If provided, try the index following *HINT (i.e. probably the last
+ * hit location) first. This speeds up linear scans. */
+ if (hint)
+ {
+ /* We intend to insert right behind *HINT.
+ * Exit this function early, if we actually can. */
+ idx = *hint + 1;
+ if (idx >= array->nelts)
+ {
+ /* We intend to insert after the last entry.
+ * That is only allowed if that last entry is smaller than KEY.
+ * In that case, there will be no current entry, i.e. we must
+ * return NULL. */
+ apr_size_t offset;
+
+ *hint = array->nelts;
+ if (array->nelts == 0)
+ return NULL;
+
+ offset = (array->nelts - 1) * array->elt_size;
+ if (compare_func(array->elts + offset, key) < 0)
+ return NULL;
+ }
+ else if (idx > 0)
+ {
+ /* Intend to insert at a position inside the array, i.e. not
+ * at one of the boundaries. The predecessor must be smaller
+ * and the current entry at IDX must be larger than KEY. */
+ void *previous;
+
+ *hint = idx;
+ previous = array->elts + (idx-1) * array->elt_size;
+ result = array->elts + idx * array->elt_size;
+ if (compare_func(previous, key) && !compare_func(result, key))
+ return result;
+ }
+ else if (idx <= 0)
+ {
+ /* Intend to insert at the beginning of an non-empty array.
+ * That requires the first entry to be larger than KEY. */
+ *hint = 0;
+ if (!compare_func(array->elts, key))
+ return array->elts;
+ }
+
+ /* The HINT did not help. */
+ }
+
+ idx = bsearch_lower_bound(key, array->elts, array->nelts, array->elt_size,
+ compare_func);
+ if (hint)
+ *hint = idx;
+ if (idx >= array->nelts)
+ return NULL;
+
+ result = array->elts + idx * array->elt_size;
+ return compare_func(result, key) ? NULL : result;
+}
+
void
-svn_sort__array_insert(const void *new_element,
- apr_array_header_t *array,
+svn_sort__array_insert(apr_array_header_t *array,
+ const void *new_element,
int insert_index)
{
int elements_to_move;
@@ -307,3 +384,149 @@ svn_sort__array_reverse(apr_array_header_t *array,
}
}
}
+
+/* Our priority queue data structure:
+ * Simply remember the constructor parameters.
+ */
+struct svn_priority_queue__t
+{
+ /* the queue elements, ordered as a heap according to COMPARE_FUNC */
+ apr_array_header_t *elements;
+
+ /* predicate used to order the heap */
+ int (*compare_func)(const void *, const void *);
+};
+
+/* Return TRUE, if heap element number LHS in QUEUE is smaller than element
+ * number RHS according to QUEUE->COMPARE_FUNC
+ */
+static int
+heap_is_less(svn_priority_queue__t *queue,
+ apr_size_t lhs,
+ apr_size_t rhs)
+{
+ char *lhs_value = queue->elements->elts + lhs * queue->elements->elt_size;
+ char *rhs_value = queue->elements->elts + rhs * queue->elements->elt_size;
+
+ /* nelts is never negative */
+ assert(lhs < (apr_size_t)queue->elements->nelts);
+ assert(rhs < (apr_size_t)queue->elements->nelts);
+ return queue->compare_func(lhs_value, rhs_value) < 0;
+}
+
+/* Exchange elements number LHS and RHS in QUEUE.
+ */
+static void
+heap_swap(svn_priority_queue__t *queue,
+ apr_size_t lhs,
+ apr_size_t rhs)
+{
+ int i;
+ char *lhs_value = queue->elements->elts + lhs * queue->elements->elt_size;
+ char *rhs_value = queue->elements->elts + rhs * queue->elements->elt_size;
+
+ for (i = 0; i < queue->elements->elt_size; ++i)
+ {
+ char temp = lhs_value[i];
+ lhs_value[i] = rhs_value[i];
+ rhs_value[i] = temp;
+ }
+}
+
+/* Move element number IDX to lower indexes until the heap criterion is
+ * fulfilled again.
+ */
+static void
+heap_bubble_down(svn_priority_queue__t *queue,
+ int idx)
+{
+ while (idx > 0 && heap_is_less(queue, idx, (idx - 1) / 2))
+ {
+ heap_swap(queue, idx, (idx - 1) / 2);
+ idx = (idx - 1) / 2;
+ }
+}
+
+/* Move element number IDX to higher indexes until the heap criterion is
+ * fulfilled again.
+ */
+static void
+heap_bubble_up(svn_priority_queue__t *queue,
+ int idx)
+{
+ while (2 * idx + 2 < queue->elements->nelts)
+ {
+ int child = heap_is_less(queue, 2 * idx + 1, 2 * idx + 2)
+ ? 2 * idx + 1
+ : 2 * idx + 2;
+
+ if (heap_is_less(queue, idx, child))
+ return;
+
+ heap_swap(queue, idx, child);
+ idx = child;
+ }
+
+ if ( 2 * idx + 1 < queue->elements->nelts
+ && heap_is_less(queue, 2 * idx + 1, idx))
+ heap_swap(queue, 2 * idx + 1, idx);
+}
+
+svn_priority_queue__t *
+svn_priority_queue__create(apr_array_header_t *elements,
+ int (*compare_func)(const void *, const void *))
+{
+ int i;
+
+ svn_priority_queue__t *queue = apr_pcalloc(elements->pool, sizeof(*queue));
+ queue->elements = elements;
+ queue->compare_func = compare_func;
+
+ for (i = elements->nelts / 2; i >= 0; --i)
+ heap_bubble_up(queue, i);
+
+ return queue;
+}
+
+apr_size_t
+svn_priority_queue__size(svn_priority_queue__t *queue)
+{
+ return queue->elements->nelts;
+}
+
+void *
+svn_priority_queue__peek(svn_priority_queue__t *queue)
+{
+ return queue->elements->nelts ? queue->elements->elts : NULL;
+}
+
+void
+svn_priority_queue__update(svn_priority_queue__t *queue)
+{
+ heap_bubble_up(queue, 0);
+}
+
+void
+svn_priority_queue__pop(svn_priority_queue__t *queue)
+{
+ if (queue->elements->nelts)
+ {
+ memmove(queue->elements->elts,
+ queue->elements->elts
+ + (queue->elements->nelts - 1) * queue->elements->elt_size,
+ queue->elements->elt_size);
+ --queue->elements->nelts;
+ heap_bubble_up(queue, 0);
+ }
+}
+
+void
+svn_priority_queue__push(svn_priority_queue__t *queue,
+ const void *element)
+{
+ /* we cannot duplicate elements due to potential array re-allocs */
+ assert(element && element != queue->elements->elts);
+
+ memcpy(apr_array_push(queue->elements), element, queue->elements->elt_size);
+ heap_bubble_down(queue, queue->elements->nelts - 1);
+}
diff --git a/subversion/libsvn_subr/spillbuf.c b/subversion/libsvn_subr/spillbuf.c
index e028741..6b8d15b 100644
--- a/subversion/libsvn_subr/spillbuf.c
+++ b/subversion/libsvn_subr/spillbuf.c
@@ -73,12 +73,26 @@ struct svn_spillbuf_t {
/* How much content remains in SPILL. */
svn_filesize_t spill_size;
+
+ /* When false, do not delete the spill file when it is closed. */
+ svn_boolean_t delete_on_close;
+
+ /* When true, and the amount of data written to the spillbuf is
+ larger than MAXSIZE, all spillbuf contents will be written to the
+ spill file. */
+ svn_boolean_t spill_all_contents;
+
+ /* The directory in which the spill file is created. */
+ const char *dirpath;
+
+ /* The name of the temporary spill file. */
+ const char *filename;
};
struct svn_spillbuf_reader_t {
/* Embed the spill-buffer within the reader. */
- struct svn_spillbuf_t buf;
+ struct svn_spillbuf_t *buf;
/* When we read content from the underlying spillbuf, these fields store
the ptr/len pair. The ptr will be incremented as we "read" out of this
@@ -99,28 +113,86 @@ struct svn_spillbuf_reader_t {
};
+/* Extended spillbuf initialization. */
+static void
+init_spillbuf_extended(svn_spillbuf_t *buf,
+ 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)
+{
+ buf->pool = result_pool;
+ buf->blocksize = blocksize;
+ buf->maxsize = maxsize;
+ buf->delete_on_close = delete_on_close;
+ buf->spill_all_contents = spill_all_contents;
+ buf->dirpath = dirpath;
+}
+
+/* Common constructor for initializing spillbufs.
+ Used by svn_spillbuf__create, svn_spilbuff__reader_create. */
+static void
+init_spillbuf(svn_spillbuf_t *buf,
+ apr_size_t blocksize,
+ apr_size_t maxsize,
+ apr_pool_t *result_pool)
+{
+ init_spillbuf_extended(buf, blocksize, maxsize,
+ TRUE, FALSE, NULL,
+ result_pool);
+}
+
svn_spillbuf_t *
svn_spillbuf__create(apr_size_t blocksize,
apr_size_t maxsize,
apr_pool_t *result_pool)
{
svn_spillbuf_t *buf = apr_pcalloc(result_pool, sizeof(*buf));
+ init_spillbuf(buf, blocksize, maxsize, result_pool);
+ return buf;
+}
- buf->pool = result_pool;
- buf->blocksize = blocksize;
- buf->maxsize = maxsize;
- /* Note: changes here should also go into svn_spillbuf__reader_create() */
+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)
+{
+ svn_spillbuf_t *buf = apr_pcalloc(result_pool, sizeof(*buf));
+ init_spillbuf_extended(buf, blocksize, maxsize,
+ delete_on_close, spill_all_contents, dirpath,
+ result_pool);
return buf;
}
-
svn_filesize_t
svn_spillbuf__get_size(const svn_spillbuf_t *buf)
{
return buf->memory_size + buf->spill_size;
}
+svn_filesize_t
+svn_spillbuf__get_memory_size(const svn_spillbuf_t *buf)
+{
+ return buf->memory_size;
+}
+
+const char *
+svn_spillbuf__get_filename(const svn_spillbuf_t *buf)
+{
+ return buf->filename;
+}
+
+apr_file_t *
+svn_spillbuf__get_file(const svn_spillbuf_t *buf)
+{
+ return buf->spill;
+}
/* Get a memblock from the spill-buffer. It will be the block that we
passed out for reading, come from the free list, or allocated. */
@@ -173,10 +245,32 @@ svn_spillbuf__write(svn_spillbuf_t *buf,
&& (buf->memory_size + len) > buf->maxsize)
{
SVN_ERR(svn_io_open_unique_file3(&buf->spill,
- NULL /* temp_path */,
- NULL /* dirpath */,
- svn_io_file_del_on_close,
+ &buf->filename,
+ buf->dirpath,
+ (buf->delete_on_close
+ ? svn_io_file_del_on_close
+ : svn_io_file_del_none),
buf->pool, scratch_pool));
+
+ /* Optionally write the memory contents into the file. */
+ if (buf->spill_all_contents)
+ {
+ mem = buf->head;
+ while (mem != NULL)
+ {
+ SVN_ERR(svn_io_file_write_full(buf->spill, mem->data, mem->size,
+ NULL, scratch_pool));
+ mem = mem->next;
+ }
+
+ /* Adjust the start offset for reading from the spill file.
+
+ ### FIXME: Instead, we should simply discard the memory
+ buffers; but currently some tests expect to read data in
+ the same chunk sizes as were written, so we'll leave this
+ change for later.*/
+ buf->spill_start = buf->memory_size;
+ }
}
/* Once a spill file has been constructed, then we need to put all
@@ -440,16 +534,10 @@ svn_spillbuf__reader_create(apr_size_t blocksize,
apr_pool_t *result_pool)
{
svn_spillbuf_reader_t *sbr = apr_pcalloc(result_pool, sizeof(*sbr));
-
- /* See svn_spillbuf__create() */
- sbr->buf.pool = result_pool;
- sbr->buf.blocksize = blocksize;
- sbr->buf.maxsize = maxsize;
-
+ sbr->buf = svn_spillbuf__create(blocksize, maxsize, result_pool);
return sbr;
}
-
svn_error_t *
svn_spillbuf__reader_read(apr_size_t *amt,
svn_spillbuf_reader_t *reader,
@@ -488,7 +576,7 @@ svn_spillbuf__reader_read(apr_size_t *amt,
if (reader->sb_len == 0)
{
SVN_ERR(svn_spillbuf__read(&reader->sb_ptr, &reader->sb_len,
- &reader->buf,
+ reader->buf,
scratch_pool));
/* We've run out of content, so return with whatever has
@@ -547,7 +635,8 @@ svn_spillbuf__reader_write(svn_spillbuf_reader_t *reader,
if (reader->sb_len > 0)
{
if (reader->save_ptr == NULL)
- reader->save_ptr = apr_palloc(reader->buf.pool, reader->buf.blocksize);
+ reader->save_ptr = apr_palloc(reader->buf->pool,
+ reader->buf->blocksize);
memcpy(reader->save_ptr, reader->sb_ptr, reader->sb_len);
reader->save_len = reader->sb_len;
@@ -557,7 +646,7 @@ svn_spillbuf__reader_write(svn_spillbuf_reader_t *reader,
reader->sb_len = 0;
}
- return svn_error_trace(svn_spillbuf__write(&reader->buf, data, len,
+ return svn_error_trace(svn_spillbuf__write(reader->buf, data, len,
scratch_pool));
}
@@ -596,19 +685,20 @@ write_handler_spillbuf(void *baton, const char *data, apr_size_t *len)
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)
{
svn_stream_t *stream;
struct spillbuf_baton *sb = apr_palloc(result_pool, sizeof(*sb));
- sb->reader = svn_spillbuf__reader_create(blocksize, maxsize, result_pool);
+ sb->reader = apr_pcalloc(result_pool, sizeof(*sb->reader));
+ sb->reader->buf = buf;
sb->scratch_pool = svn_pool_create(result_pool);
stream = svn_stream_create(sb, result_pool);
- svn_stream_set_read(stream, read_handler_spillbuf);
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_handler_spillbuf);
svn_stream_set_write(stream, write_handler_spillbuf);
return stream;
diff --git a/subversion/libsvn_subr/sqlite.c b/subversion/libsvn_subr/sqlite.c
index 295a11c..18124a3 100644
--- a/subversion/libsvn_subr/sqlite.c
+++ b/subversion/libsvn_subr/sqlite.c
@@ -37,6 +37,15 @@
#include "private/svn_atomic.h"
#include "private/svn_skel.h"
#include "private/svn_token.h"
+#ifdef WIN32
+#include "private/svn_io_private.h"
+#include "private/svn_utf_private.h"
+#endif
+
+#ifdef SVN_UNICODE_NORMALIZATION_FIXES
+#include "private/svn_utf_private.h"
+#include "private/svn_string_private.h"
+#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
#ifdef SQLITE3_DEBUG
#include "private/svn_debug.h"
@@ -60,6 +69,17 @@ extern int (*const svn_sqlite3__api_config)(int, ...);
#error SQLite is too old -- version 3.7.12 is the minimum required version
#endif
+#ifndef SQLITE_DETERMINISTIC
+#define SQLITE_DETERMINISTIC 0
+#endif
+
+#ifdef SVN_UNICODE_NORMALIZATION_FIXES
+/* Limit the length of a GLOB or LIKE pattern. */
+#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
+# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
+#endif
+#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
+
const char *
svn_sqlite__compiled_version(void)
{
@@ -97,6 +117,23 @@ sqlite_profiler(void *data, const char *sql, sqlite3_uint64 duration)
}
#endif
+#if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
+static void
+sqlite_error_log(void* baton, int err, const char* msg)
+{
+ fprintf(SVN_DBG_OUTPUT, "DBG: sqlite[S%d]: %s\n", err, msg);
+}
+#endif
+
+void
+svn_sqlite__dbg_enable_errorlog(void)
+{
+#if defined(SVN_DEBUG) && defined(SQLITE_CONFIG_LOG)
+ sqlite3_config(SQLITE_CONFIG_LOG, sqlite_error_log, (void*)NULL /* baton */);
+#endif
+}
+
+
struct svn_sqlite__db_t
{
sqlite3 *db3;
@@ -104,6 +141,13 @@ struct svn_sqlite__db_t
int nbr_statements;
svn_sqlite__stmt_t **prepared_stmts;
apr_pool_t *state_pool;
+
+#ifdef SVN_UNICODE_NORMALIZATION_FIXES
+ /* Buffers for SQLite extensoins. */
+ svn_membuf_t sqlext_buf1;
+ svn_membuf_t sqlext_buf2;
+ svn_membuf_t sqlext_buf3;
+#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
};
struct svn_sqlite__stmt_t
@@ -145,6 +189,21 @@ struct svn_sqlite__value_t
sqlite3_errmsg((db)->db3)); \
} while (0)
+#define SQLITE_ERR_CLOSE(x, db, pool) do \
+{ \
+ int sqlite_err__temp = (x); \
+ if (sqlite_err__temp != SQLITE_OK) \
+ { \
+ const char *sqlite_err__msg \
+ = apr_pstrdup(pool, sqlite3_errmsg((db)->db3)); \
+ return svn_error_compose_create( \
+ svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \
+ NULL, "sqlite[S%d]: %s", \
+ sqlite_err__temp, sqlite_err__msg), \
+ svn_sqlite__close(db)); \
+ } \
+} while (0)
+
#define SQLITE_ERR_MSG(x, msg) do \
{ \
int sqlite_err__temp = (x); \
@@ -154,6 +213,13 @@ struct svn_sqlite__value_t
sqlite_err__temp, msg); \
} while (0)
+#define SVN_ERR_CLOSE(x, db) do \
+{ \
+ svn_error_t *svn__err = (x); \
+ if (svn__err) \
+ return svn_error_compose_create(svn__err, svn_sqlite__close(db)); \
+} while (0)
+
/* Time (in milliseconds) to wait for sqlite locks before giving up. */
#define BUSY_TIMEOUT 10000
@@ -688,9 +754,20 @@ svn_sqlite__finalize(svn_sqlite__stmt_t *stmt)
svn_error_t *
svn_sqlite__reset(svn_sqlite__stmt_t *stmt)
{
- SQLITE_ERR(sqlite3_reset(stmt->s3stmt), stmt->db);
- SQLITE_ERR(sqlite3_clear_bindings(stmt->s3stmt), stmt->db);
+ /* No need to reset again after a first attempt */
stmt->needs_reset = FALSE;
+
+ /* Clear bindings first, as there are no documented reasons
+ why this would ever fail, but keeping variable bindings
+ when reset is not what we expect. */
+ SQLITE_ERR(sqlite3_clear_bindings(stmt->s3stmt), stmt->db);
+
+ /* Reset last, as this *will* fail if the statement failed since
+ the last time it was reset, while reporting just the same failure.
+ (In this case the statement is also properly reset).
+
+ See the sqlite3_reset() documentation for more details. */
+ SQLITE_ERR(sqlite3_reset(stmt->s3stmt), stmt->db);
return SVN_NO_ERROR;
}
@@ -754,8 +831,8 @@ init_sqlite(void *baton, apr_pool_t *pool)
}
static svn_error_t *
-internal_open(sqlite3 **db3, const char *path, svn_sqlite__mode_t mode,
- apr_pool_t *scratch_pool)
+internal_open(svn_sqlite__db_t *db, const char *path, svn_sqlite__mode_t mode,
+ apr_int32_t timeout, apr_pool_t *scratch_pool)
{
{
int flags;
@@ -789,36 +866,59 @@ internal_open(sqlite3 **db3, const char *path, svn_sqlite__mode_t mode,
We simply want umask permissions. */
SVN_ERR(svn_io_check_path(path, &kind, scratch_pool));
if (kind == svn_node_none)
- SVN_ERR(svn_io_file_create(path, "", scratch_pool));
+ {
+ /* Another thread may have created the file, that's OK. */
+ svn_error_t *err = svn_io_file_create_empty(path, scratch_pool);
+ if (err && !APR_STATUS_IS_EEXIST(err->apr_err))
+ return svn_error_trace(err);
+ svn_error_clear(err);
+ }
}
#endif
/* Open the database. Note that a handle is returned, even when an error
occurs (except for out-of-memory); thus, we can safely use it to
- extract an error message and construct an svn_error_t. */
+ extract an error message and construct an svn_error_t. SQLite always
+ requires sqlite3_close() after sqlite3_open_v2() while Subversion
+ typically does not require close() after an open() that returns an
+ error. So we must ensure we close the handle if this function, or
+ the caller svn_sqlite__open, returns an error to the application. */
{
- /* We'd like to use SQLITE_ERR here, but we can't since it would
- just return an error and leave the database open. So, we need to
- do this manually. */
- /* ### SQLITE_CANTOPEN */
- int err_code = sqlite3_open_v2(path, db3, flags, NULL);
- if (err_code != SQLITE_OK)
+ const char *vFs = NULL;
+
+#if defined(WIN32) && SQLITE_VERSION_AT_LEAST(3, 8, 1)
+ if (strlen(path) > 248)
{
- /* Save the error message before closing the SQLite handle. */
- char *msg = apr_pstrdup(scratch_pool, sqlite3_errmsg(*db3));
+ WCHAR *win_path;
+ vFs = "win32-longpath"; /* Enable long paths in sqlite */
+
+ /* Long paths must be absolute */
+ if (!svn_dirent_is_absolute(path))
+ SVN_ERR(svn_dirent_get_absolute(&path, path, scratch_pool));
- /* We don't catch the error here, since we care more about the open
- error than the close error at this point. */
- sqlite3_close(*db3);
+ /* Convert the path to a properly canonicalized \\?\C:\long\path */
+ SVN_ERR(svn_io__utf8_to_unicode_longpath(&win_path, path,
+ scratch_pool));
- SQLITE_ERR_MSG(err_code, msg);
+ /* And convert it back to UTF-8 because there is no
+ sqlite3_open16_v2() yet */
+ SVN_ERR(svn_utf__win32_utf16_to_utf8(&path, win_path, NULL,
+ scratch_pool));
}
+#endif
+
+ /* ### SQLITE_CANTOPEN */
+ SQLITE_ERR_CLOSE(sqlite3_open_v2(path, &db->db3, flags, vFs),
+ db, scratch_pool);
}
}
+ if (timeout <= 0)
+ timeout = BUSY_TIMEOUT;
+
/* Retry until timeout when database is busy. */
- SQLITE_ERR_MSG(sqlite3_busy_timeout(*db3, BUSY_TIMEOUT),
- sqlite3_errmsg(*db3));
+ SQLITE_ERR_CLOSE(sqlite3_busy_timeout(db->db3, timeout),
+ db, scratch_pool);
return SVN_NO_ERROR;
}
@@ -838,35 +938,29 @@ close_apr(void *data)
if (db->db3 == NULL)
return APR_SUCCESS;
- /* Finalize any existing prepared statements. */
- for (i = 0; i < db->nbr_statements; i++)
+ /* Finalize any prepared statements. */
+ if (db->prepared_stmts)
{
- if (db->prepared_stmts[i])
+ for (i = 0; i < db->nbr_statements + STMT_INTERNAL_LAST; i++)
{
- if (db->prepared_stmts[i]->needs_reset)
+ if (db->prepared_stmts[i])
{
+ if (i < db->nbr_statements
+ && db->prepared_stmts[i]->needs_reset)
+ {
#ifdef SVN_DEBUG
- const char *stmt_text = db->statement_strings[i];
- stmt_text = stmt_text; /* Provide value for debugger */
+ const char *stmt_text = db->statement_strings[i];
+ SVN_UNUSED(stmt_text);
- SVN_ERR_MALFUNCTION_NO_RETURN();
+ SVN_ERR_MALFUNCTION_NO_RETURN();
#else
- err = svn_error_compose_create(
- err,
+ err = svn_error_compose_create(err,
svn_sqlite__reset(db->prepared_stmts[i]));
#endif
- }
- err = svn_error_compose_create(
- svn_sqlite__finalize(db->prepared_stmts[i]), err);
- }
- }
- /* And finalize any used internal statements */
- for (; i < db->nbr_statements + STMT_INTERNAL_LAST; i++)
- {
- if (db->prepared_stmts[i])
- {
- err = svn_error_compose_create(
+ }
+ err = svn_error_compose_create(
svn_sqlite__finalize(db->prepared_stmts[i]), err);
+ }
}
}
@@ -888,11 +982,105 @@ close_apr(void *data)
return APR_SUCCESS;
}
+#ifdef SVN_UNICODE_NORMALIZATION_FIXES
+/* Unicode normalizing collation for WC paths */
+static int
+collate_ucs_nfd(void *baton,
+ int len1, const void *key1,
+ int len2, const void *key2)
+{
+ svn_sqlite__db_t *db = baton;
+ int result;
+
+ if (svn_utf__normcmp(key1, len1, key2, len2,
+ &db->sqlext_buf1, &db->sqlext_buf2, &result))
+ {
+ /* There is really nothing we can do here if an error occurs
+ during Unicode normalizetion, and attempting to recover could
+ result in the wc.db index being corrupted. Presumably this
+ can only happen if the index already contains invalid UTF-8
+ strings, which should never happen in any case ... */
+ SVN_ERR_MALFUNCTION_NO_RETURN();
+ }
+
+ return result;
+}
+
+static void
+glob_like_ucs_nfd_common(sqlite3_context *context,
+ int argc, sqlite3_value **argv,
+ svn_boolean_t sql_like)
+{
+ svn_sqlite__db_t *const db = sqlite3_user_data(context);
+
+ const char *const pattern = (void*)sqlite3_value_text(argv[0]);
+ const apr_size_t pattern_len = sqlite3_value_bytes(argv[0]);
+ const char *const string = (void*)sqlite3_value_text(argv[1]);
+ const apr_size_t string_len = sqlite3_value_bytes(argv[1]);
+
+ const char *escape = NULL;
+ apr_size_t escape_len = 0;
+
+ svn_boolean_t match;
+ svn_error_t *err;
+
+ if (pattern_len > SQLITE_MAX_LIKE_PATTERN_LENGTH)
+ {
+ sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
+ return;
+ }
+
+ if (argc == 3 && sql_like)
+ {
+ escape = (void*)sqlite3_value_text(argv[2]);
+ escape_len = sqlite3_value_bytes(argv[2]);
+ }
+
+ if (pattern && string)
+ {
+ err = svn_utf__glob(pattern, pattern_len, string, string_len,
+ escape, escape_len, sql_like,
+ &db->sqlext_buf1, &db->sqlext_buf2, &db->sqlext_buf3,
+ &match);
+
+ if (err)
+ {
+ const char *errmsg;
+ svn_membuf__ensure(&db->sqlext_buf1, 512);
+ errmsg = svn_err_best_message(err,
+ db->sqlext_buf1.data,
+ db->sqlext_buf1.size - 1);
+ svn_error_clear(err);
+ sqlite3_result_error(context, errmsg, -1);
+ return;
+ }
+
+ sqlite3_result_int(context, match);
+ }
+}
+
+/* Unicode normalizing implementation of GLOB */
+static void
+glob_ucs_nfd(sqlite3_context *context,
+ int argc, sqlite3_value **argv)
+{
+ glob_like_ucs_nfd_common(context, argc, argv, FALSE);
+}
+
+/* Unicode normalizing implementation of LIKE */
+static void
+like_ucs_nfd(sqlite3_context *context,
+ int argc, sqlite3_value **argv)
+{
+ glob_like_ucs_nfd_common(context, argc, argv, TRUE);
+}
+#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
svn_error_t *
svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
svn_sqlite__mode_t mode, const char * const statements[],
int unused1, const char * const *unused2,
+ apr_int32_t timeout,
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
{
SVN_ERR(svn_atomic__init_once(&sqlite_init_state,
@@ -900,7 +1088,7 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
*db = apr_pcalloc(result_pool, sizeof(**db));
- SVN_ERR(internal_open(&(*db)->db3, path, mode, scratch_pool));
+ SVN_ERR(internal_open(*db, path, mode, timeout, scratch_pool));
#if SQLITE_VERSION_NUMBER >= 3008000 && SQLITE_VERSION_NUMBER < 3009000
/* disable SQLITE_ENABLE_STAT3/4 from 3.8.1 - 3.8.3 (but not 3.8.3.1+)
@@ -914,6 +1102,38 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
}
#endif
+#ifdef SVN_UNICODE_NORMALIZATION_FIXES
+ /* Create extension buffers with space for 200 UCS-4 characters. */
+ svn_membuf__create(&(*db)->sqlext_buf1, 800, result_pool);
+ svn_membuf__create(&(*db)->sqlext_buf2, 800, result_pool);
+ svn_membuf__create(&(*db)->sqlext_buf3, 800, result_pool);
+
+ /* Register collation and LIKE and GLOB operator replacements. */
+ SQLITE_ERR_CLOSE(sqlite3_create_collation((*db)->db3,
+ "svn-ucs-nfd", SQLITE_UTF8,
+ *db, collate_ucs_nfd),
+ db, scratch_pool);
+ /* ### Is it really necessary to override these functions?
+ I would assume the default implementation to be collation agnostic?
+ And otherwise our implementation should be...
+
+ The default implementation is in some cases index backed, while our
+ implementation can't be. With an index based on the collation it could
+ be. */
+ SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "glob", 2,
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC,
+ *db, glob_ucs_nfd, NULL, NULL),
+ db, scratch_pool);
+ SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 2,
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC,
+ *db, like_ucs_nfd, NULL, NULL),
+ db, scratch_pool);
+ SQLITE_ERR_CLOSE(sqlite3_create_function((*db)->db3, "like", 3,
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC,
+ *db, like_ucs_nfd, NULL, NULL),
+ db, scratch_pool);
+#endif /* SVN_UNICODE_NORMALIZATION_FIXES */
+
#ifdef SQLITE3_DEBUG
sqlite3_trace((*db)->db3, sqlite_tracer, (*db)->db3);
#endif
@@ -921,14 +1141,14 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
sqlite3_profile((*db)->db3, sqlite_profiler, (*db)->db3);
#endif
- /* ### simplify this. remnants of some old SQLite compat code. */
- {
- int ignored_err = SQLITE_OK;
-
- SVN_ERR(exec_sql2(*db, "PRAGMA case_sensitive_like=1;", ignored_err));
- }
-
- SVN_ERR(exec_sql(*db,
+ SVN_ERR_CLOSE(exec_sql(*db,
+ /* The default behavior of the LIKE operator is to ignore case
+ for ASCII characters. Hence, by default 'a' LIKE 'A' is true.
+ The case_sensitive_like pragma installs a new application-
+ defined LIKE function that is either case sensitive or
+ insensitive depending on the value of the case_sensitive_like
+ pragma. */
+ "PRAGMA case_sensitive_like=1;"
/* Disable synchronization to disable the explicit disk flushes
that make Sqlite up to 50 times slower; especially on small
transactions.
@@ -951,13 +1171,17 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
affects application(read: Subversion) performance/behavior. */
"PRAGMA foreign_keys=OFF;" /* SQLITE_DEFAULT_FOREIGN_KEYS*/
"PRAGMA locking_mode = NORMAL;" /* SQLITE_DEFAULT_LOCKING_MODE */
- ));
+ /* Testing shows TRUNCATE is faster than DELETE on Windows. */
+ "PRAGMA journal_mode = TRUNCATE;"
+ ),
+ *db);
#if defined(SVN_DEBUG)
/* When running in debug mode, enable the checking of foreign key
constraints. This has possible performance implications, so we don't
bother to do it for production...for now. */
- SVN_ERR(exec_sql(*db, "PRAGMA foreign_keys=ON;"));
+ SVN_ERR_CLOSE(exec_sql(*db, "PRAGMA foreign_keys=ON;"),
+ *db);
#endif
#ifdef SVN_SQLITE_REVERSE_UNORDERED_SELECTS
@@ -965,7 +1189,8 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
clause to emit their results in the reverse order of what they normally
would. This can help detecting invalid assumptions about the result
order.*/
- SVN_ERR(exec_sql(*db, "PRAGMA reverse_unordered_selects=ON;"));
+ SVN_ERR_CLOSE(exec_sql(*db, "PRAGMA reverse_unordered_selects=ON;"),
+ *db);
#endif
/* Store temporary tables in RAM instead of in temporary files, but don't
@@ -1036,6 +1261,55 @@ reset_all_statements(svn_sqlite__db_t *db,
return err;
}
+static svn_error_t *
+rollback_transaction(svn_sqlite__db_t *db,
+ svn_error_t *error_to_wrap)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_error_t *err;
+
+ err = get_internal_statement(&stmt, db, STMT_INTERNAL_ROLLBACK_TRANSACTION);
+ if (!err)
+ {
+ err = svn_error_trace(svn_sqlite__step_done(stmt));
+
+ if (err && err->apr_err == SVN_ERR_SQLITE_BUSY)
+ {
+ /* ### Houston, we have a problem!
+
+ We are trying to rollback but we can't because some
+ statements are still busy. This leaves the database
+ unusable for future transactions as the current transaction
+ is still open.
+
+ As we are returning the actual error as the most relevant
+ error in the chain, our caller might assume that it can
+ retry/compensate on this error (e.g. SVN_WC_LOCKED), while
+ in fact the SQLite database is unusable until the statements
+ started within this transaction are reset and the transaction
+ aborted.
+
+ We try to compensate by resetting all prepared but unreset
+ statements; but we leave the busy error in the chain anyway to
+ help diagnosing the original error and help in finding where
+ a reset statement is missing. */
+ err = svn_error_trace(reset_all_statements(db, err));
+ err = svn_error_compose_create(
+ svn_error_trace(svn_sqlite__step_done(stmt)),
+ err);
+ }
+ }
+
+ if (err)
+ {
+ /* Rollback failed, use a specific error code. */
+ err = svn_error_create(SVN_SQLITE__ERR_ROLLBACK_FAILED, err,
+ _("SQLite transaction rollback failed"));
+ }
+
+ return svn_error_compose_create(error_to_wrap, err);
+}
+
svn_error_t *
svn_sqlite__begin_transaction(svn_sqlite__db_t *db)
{
@@ -1078,46 +1352,37 @@ svn_sqlite__finish_transaction(svn_sqlite__db_t *db,
/* Commit or rollback the sqlite transaction. */
if (err)
{
- svn_error_t *err2;
-
- err2 = get_internal_statement(&stmt, db,
- STMT_INTERNAL_ROLLBACK_TRANSACTION);
- if (!err2)
- err2 = svn_sqlite__step_done(stmt);
-
- if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
- {
- /* ### Houston, we have a problem!
-
- We are trying to rollback but we can't because some
- statements are still busy. This leaves the database
- unusable for future transactions as the current transaction
- is still open.
-
- As we are returning the actual error as the most relevant
- error in the chain, our caller might assume that it can
- retry/compensate on this error (e.g. SVN_WC_LOCKED), while
- in fact the SQLite database is unusable until the statements
- started within this transaction are reset and the transaction
- aborted.
-
- We try to compensate by resetting all prepared but unreset
- statements; but we leave the busy error in the chain anyway to
- help diagnosing the original error and help in finding where
- a reset statement is missing. */
-
- err2 = reset_all_statements(db, err2);
- err2 = svn_error_compose_create(
- svn_sqlite__step_done(stmt),
- err2);
- }
-
- return svn_error_compose_create(err,
- err2);
+ return svn_error_trace(rollback_transaction(db, err));
+ }
+ else
+ {
+ err = get_internal_statement(&stmt, db,
+ STMT_INTERNAL_COMMIT_TRANSACTION);
+ if (!err)
+ err = svn_error_trace(svn_sqlite__step_done(stmt));
+
+ /* Need to rollback if the commit fails as well, because otherwise the
+ db connection will be left in an unusable state.
+
+ One important case to keep in mind is trying to COMMIT with concurrent
+ readers. In case the commit fails, because someone else is holding a
+ shared lock, sqlite keeps the transaction, and *also* keeps the file
+ locks on the database. While the first part only prevents from using
+ this connection, the second part prevents everyone else from accessing
+ the database while the connection is open.
+
+ See https://www.sqlite.org/lang_transaction.html
+
+ COMMIT might also result in an SQLITE_BUSY return code if an another
+ thread or process has a shared lock on the database that prevented
+ the database from being updated. When COMMIT fails in this way, the
+ transaction remains active and the COMMIT can be retried later after
+ the reader has had a chance to clear. */
+ if (err)
+ return svn_error_trace(rollback_transaction(db, err));
}
- SVN_ERR(get_internal_statement(&stmt, db, STMT_INTERNAL_COMMIT_TRANSACTION));
- return svn_error_trace(svn_sqlite__step_done(stmt));
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -1134,18 +1399,22 @@ svn_sqlite__finish_savepoint(svn_sqlite__db_t *db,
STMT_INTERNAL_ROLLBACK_TO_SAVEPOINT_SVN);
if (!err2)
- err2 = svn_sqlite__step_done(stmt);
-
- if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
{
- /* Ok, we have a major problem. Some statement is still open, which
- makes it impossible to release this savepoint.
+ err2 = svn_error_trace(svn_sqlite__step_done(stmt));
- ### See huge comment in svn_sqlite__finish_transaction for
- further details */
+ if (err2 && err2->apr_err == SVN_ERR_SQLITE_BUSY)
+ {
+ /* Ok, we have a major problem. Some statement is still open,
+ which makes it impossible to release this savepoint.
+
+ ### See huge comment in svn_sqlite__finish_transaction for
+ further details */
- err2 = reset_all_statements(db, err2);
- err2 = svn_error_compose_create(svn_sqlite__step_done(stmt), err2);
+ err2 = svn_error_trace(reset_all_statements(db, err2));
+ err2 = svn_error_compose_create(
+ svn_error_trace(svn_sqlite__step_done(stmt)),
+ err2);
+ }
}
err = svn_error_compose_create(err, err2);
@@ -1153,9 +1422,9 @@ svn_sqlite__finish_savepoint(svn_sqlite__db_t *db,
STMT_INTERNAL_RELEASE_SAVEPOINT_SVN);
if (!err2)
- err2 = svn_sqlite__step_done(stmt);
+ err2 = svn_error_trace(svn_sqlite__step_done(stmt));
- return svn_error_trace(svn_error_compose_create(err, err2));
+ return svn_error_compose_create(err, err2);
}
SVN_ERR(get_internal_statement(&stmt, db,
@@ -1203,7 +1472,7 @@ svn_sqlite__hotcopy(const char *src_path,
svn_sqlite__db_t *src_db;
SVN_ERR(svn_sqlite__open(&src_db, src_path, svn_sqlite__mode_readonly,
- NULL, 0, NULL,
+ NULL, 0, NULL, 0,
scratch_pool, scratch_pool));
{
@@ -1212,7 +1481,7 @@ svn_sqlite__hotcopy(const char *src_path,
int rc1, rc2;
SVN_ERR(svn_sqlite__open(&dst_db, dst_path, svn_sqlite__mode_rwcreate,
- NULL, 0, NULL, scratch_pool, scratch_pool));
+ NULL, 0, NULL, 0, scratch_pool, scratch_pool));
backup = sqlite3_backup_init(dst_db->db3, "main", src_db->db3, "main");
if (!backup)
return svn_error_createf(SVN_ERR_SQLITE_ERROR, NULL,
@@ -1244,6 +1513,8 @@ svn_sqlite__hotcopy(const char *src_path,
SVN_ERR(svn_sqlite__close(src_db));
+ SVN_ERR(svn_io_copy_perms(src_path, dst_path, scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -1251,8 +1522,6 @@ struct function_wrapper_baton_t
{
svn_sqlite__func_t func;
void *baton;
-
- apr_pool_t *scratch_pool;
};
static void
@@ -1262,22 +1531,12 @@ wrapped_func(sqlite3_context *context,
{
struct function_wrapper_baton_t *fwb = sqlite3_user_data(context);
svn_sqlite__context_t sctx;
- svn_sqlite__value_t **local_vals =
- apr_palloc(fwb->scratch_pool,
- sizeof(svn_sqlite__value_t *) * argc);
svn_error_t *err;
- int i;
+ void *void_values = values;
sctx.context = context;
- for (i = 0; i < argc; i++)
- {
- local_vals[i] = apr_palloc(fwb->scratch_pool, sizeof(*local_vals[i]));
- local_vals[i]->value = values[i];
- }
-
- err = fwb->func(&sctx, argc, local_vals, fwb->scratch_pool);
- svn_pool_clear(fwb->scratch_pool);
+ err = fwb->func(&sctx, argc, void_values, fwb->baton);
if (err)
{
@@ -1289,21 +1548,27 @@ wrapped_func(sqlite3_context *context,
}
}
+
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)
{
+ int eTextRep;
struct function_wrapper_baton_t *fwb = apr_pcalloc(db->state_pool,
sizeof(*fwb));
- fwb->scratch_pool = svn_pool_create(db->state_pool);
fwb->func = func;
fwb->baton = baton;
- SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, SQLITE_ANY,
+ eTextRep = SQLITE_ANY;
+ if (deterministic)
+ eTextRep |= SQLITE_DETERMINISTIC;
+
+ SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, eTextRep,
fwb, wrapped_func, NULL, NULL),
db);
@@ -1313,13 +1578,15 @@ svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
int
svn_sqlite__value_type(svn_sqlite__value_t *val)
{
- return sqlite3_value_type(val->value);
+ void *v = val;
+ return sqlite3_value_type(v);
}
const char *
svn_sqlite__value_text(svn_sqlite__value_t *val)
{
- return (const char *) sqlite3_value_text(val->value);
+ void *v = val;
+ return (const char *) sqlite3_value_text(v);
}
void
@@ -1333,3 +1600,9 @@ svn_sqlite__result_int64(svn_sqlite__context_t *sctx, apr_int64_t val)
{
sqlite3_result_int64(sctx->context, val);
}
+
+void
+svn_sqlite__result_error(svn_sqlite__context_t *sctx, const char *msg, int num)
+{
+ sqlite3_result_error(sctx->context, msg, num);
+}
diff --git a/subversion/libsvn_subr/sqlite3wrapper.c b/subversion/libsvn_subr/sqlite3wrapper.c
index 4bbb619..76e182f 100644
--- a/subversion/libsvn_subr/sqlite3wrapper.c
+++ b/subversion/libsvn_subr/sqlite3wrapper.c
@@ -26,18 +26,19 @@
#ifdef SVN_SQLITE_INLINE
# define SQLITE_OMIT_DEPRECATED 1
# define SQLITE_API static
-# if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 6 || __APPLE_CC__))
-# if !__APPLE_CC__ || __GNUC_MINOR__ >= 6
-# pragma GCC diagnostic push
-# endif
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
# pragma GCC diagnostic ignored "-Wunreachable-code"
# pragma GCC diagnostic ignored "-Wunused-function"
# pragma GCC diagnostic ignored "-Wcast-qual"
# pragma GCC diagnostic ignored "-Wunused"
# pragma GCC diagnostic ignored "-Wshadow"
-# if __APPLE_CC__
+# if defined(__APPLE_CC__) || defined(__clang__)
# pragma GCC diagnostic ignored "-Wshorten-64-to-32"
# endif
+# if defined(__clang__)
+# pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
+# pragma clang diagnostic ignored "-Wmissing-variable-declarations"
+# endif
# endif
# ifdef __APPLE__
# include <Availability.h>
@@ -52,9 +53,6 @@
# endif
# define SQLITE_DEFAULT_FILE_PERMISSIONS 0666
# include <sqlite3.c>
-# if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 6))
-# pragma GCC diagnostic pop
-# endif
/* Expose the sqlite API vtable and the two missing functions */
const sqlite3_api_routines *const svn_sqlite3__api_funcs = &sqlite3Apis;
diff --git a/subversion/libsvn_subr/ssl_client_cert_providers.c b/subversion/libsvn_subr/ssl_client_cert_providers.c
index cf86fa1..7fd81d0 100644
--- a/subversion/libsvn_subr/ssl_client_cert_providers.c
+++ b/subversion/libsvn_subr/ssl_client_cert_providers.c
@@ -79,13 +79,12 @@ ssl_client_cert_file_first_credentials(void **credentials_p,
}
-static const svn_auth_provider_t ssl_client_cert_file_provider =
- {
- SVN_AUTH_CRED_SSL_CLIENT_CERT,
- ssl_client_cert_file_first_credentials,
- NULL,
- NULL
- };
+static const svn_auth_provider_t ssl_client_cert_file_provider = {
+ SVN_AUTH_CRED_SSL_CLIENT_CERT,
+ ssl_client_cert_file_first_credentials,
+ NULL,
+ NULL
+};
/*** Public API to SSL file providers. ***/
diff --git a/subversion/libsvn_subr/ssl_client_cert_pw_providers.c b/subversion/libsvn_subr/ssl_client_cert_pw_providers.c
index 6c1bcf1..1626750 100644
--- a/subversion/libsvn_subr/ssl_client_cert_pw_providers.c
+++ b/subversion/libsvn_subr/ssl_client_cert_pw_providers.c
@@ -39,16 +39,6 @@
/* File provider */
/*-----------------------------------------------------------------------*/
-/* The keys that will be stored on disk. These serve the same role as
- * similar constants in other providers.
- *
- * AUTHN_PASSTYPE_KEY just records the passphrase type next to the
- * passphrase, so that anyone who is manually editing their authn
- * files can know which provider owns the password.
- */
-#define AUTHN_PASSPHRASE_KEY "passphrase"
-#define AUTHN_PASSTYPE_KEY "passtype"
-
/* Baton type for the ssl client cert passphrase provider. */
typedef struct ssl_client_cert_pw_file_provider_baton_t
{
@@ -75,7 +65,7 @@ svn_auth__ssl_client_cert_pw_get(svn_boolean_t *done,
apr_pool_t *pool)
{
svn_string_t *str;
- str = svn_hash_gets(creds, AUTHN_PASSPHRASE_KEY);
+ str = svn_hash_gets(creds, SVN_CONFIG_AUTHN_PASSPHRASE_KEY);
if (str && str->data)
{
*passphrase = str->data;
@@ -98,7 +88,7 @@ svn_auth__ssl_client_cert_pw_set(svn_boolean_t *done,
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
- svn_hash_sets(creds, AUTHN_PASSPHRASE_KEY,
+ svn_hash_sets(creds, SVN_CONFIG_AUTHN_PASSPHRASE_KEY,
svn_string_create(passphrase, pool));
*done = TRUE;
return SVN_NO_ERROR;
@@ -308,7 +298,7 @@ svn_auth__ssl_client_cert_pw_cache_set(svn_boolean_t *saved,
if (*saved && passtype)
{
- svn_hash_sets(creds_hash, AUTHN_PASSTYPE_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_PASSTYPE_KEY,
svn_string_create(passtype, pool));
}
diff --git a/subversion/libsvn_subr/ssl_server_trust_providers.c b/subversion/libsvn_subr/ssl_server_trust_providers.c
index c69be77..a8d4414 100644
--- a/subversion/libsvn_subr/ssl_server_trust_providers.c
+++ b/subversion/libsvn_subr/ssl_server_trust_providers.c
@@ -35,12 +35,6 @@
/* File provider */
/*-----------------------------------------------------------------------*/
-/* The keys that will be stored on disk. These serve the same role as
- similar constants in other providers. */
-#define AUTHN_ASCII_CERT_KEY "ascii_cert"
-#define AUTHN_FAILURES_KEY "failures"
-
-
/* retrieve ssl server CA failure overrides (if any) from servers
config */
static svn_error_t *
@@ -73,18 +67,12 @@ ssl_server_trust_file_first_credentials(void **credentials,
svn_string_t *trusted_cert, *this_cert, *failstr;
apr_uint32_t last_failures = 0;
- trusted_cert = svn_hash_gets(creds_hash, AUTHN_ASCII_CERT_KEY);
+ trusted_cert = svn_hash_gets(creds_hash, SVN_CONFIG_AUTHN_ASCII_CERT_KEY);
this_cert = svn_string_create(cert_info->ascii_cert, pool);
- failstr = svn_hash_gets(creds_hash, AUTHN_FAILURES_KEY);
+ failstr = svn_hash_gets(creds_hash, SVN_CONFIG_AUTHN_FAILURES_KEY);
if (failstr)
- {
- char *endptr;
- unsigned long tmp_ulong = strtoul(failstr->data, &endptr, 10);
-
- if (*endptr == '\0')
- last_failures = (apr_uint32_t) tmp_ulong;
- }
+ SVN_ERR(svn_cstring_atoui(&last_failures, failstr->data));
/* If the cert is trusted and there are no new failures, we
* accept it by clearing all failures. */
@@ -130,10 +118,9 @@ ssl_server_trust_file_save_credentials(svn_boolean_t *saved,
cert_info = svn_hash_gets(parameters, SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO);
creds_hash = apr_hash_make(pool);
- svn_hash_sets(creds_hash, AUTHN_ASCII_CERT_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_ASCII_CERT_KEY,
svn_string_create(cert_info->ascii_cert, pool));
- svn_hash_sets(creds_hash,
- AUTHN_FAILURES_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_FAILURES_KEY,
svn_string_createf(pool, "%lu",
(unsigned long)creds->accepted_failures));
@@ -149,9 +136,9 @@ ssl_server_trust_file_save_credentials(svn_boolean_t *saved,
static const svn_auth_provider_t ssl_server_trust_file_provider = {
SVN_AUTH_CRED_SSL_SERVER_TRUST,
- &ssl_server_trust_file_first_credentials,
+ ssl_server_trust_file_first_credentials,
NULL,
- &ssl_server_trust_file_save_credentials,
+ ssl_server_trust_file_save_credentials,
};
diff --git a/subversion/libsvn_subr/stream.c b/subversion/libsvn_subr/stream.c
index 93a4c42..2f803b8 100644
--- a/subversion/libsvn_subr/stream.c
+++ b/subversion/libsvn_subr/stream.c
@@ -29,7 +29,8 @@
#include <apr_strings.h>
#include <apr_file_io.h>
#include <apr_errno.h>
-#include <apr_md5.h>
+#include <apr_poll.h>
+#include <apr_portable.h>
#include <zlib.h>
@@ -41,20 +42,24 @@
#include "svn_checksum.h"
#include "svn_path.h"
#include "svn_private_config.h"
+#include "private/svn_atomic.h"
#include "private/svn_error_private.h"
#include "private/svn_eol_private.h"
#include "private/svn_io_private.h"
#include "private/svn_subr_private.h"
+#include "private/svn_utf_private.h"
struct svn_stream_t {
void *baton;
svn_read_fn_t read_fn;
+ svn_read_fn_t read_full_fn;
svn_stream_skip_fn_t skip_fn;
svn_write_fn_t write_fn;
svn_close_fn_t close_fn;
svn_stream_mark_fn_t mark_fn;
svn_stream_seek_fn_t seek_fn;
+ svn_stream_data_available_fn_t data_available_fn;
svn_stream__is_buffered_fn_t is_buffered_fn;
apr_file_t *file; /* Maybe NULL */
};
@@ -63,7 +68,7 @@ struct svn_stream_t {
/*** Forward declarations. ***/
static svn_error_t *
-skip_default_handler(void *baton, apr_size_t len, svn_read_fn_t read_fn);
+skip_default_handler(void *baton, apr_size_t len, svn_read_fn_t read_full_fn);
/*** Generic streams. ***/
@@ -73,16 +78,8 @@ svn_stream_create(void *baton, apr_pool_t *pool)
{
svn_stream_t *stream;
- stream = apr_palloc(pool, sizeof(*stream));
+ stream = apr_pcalloc(pool, sizeof(*stream));
stream->baton = baton;
- stream->read_fn = NULL;
- stream->skip_fn = NULL;
- stream->write_fn = NULL;
- stream->close_fn = NULL;
- stream->mark_fn = NULL;
- stream->seek_fn = NULL;
- stream->is_buffered_fn = NULL;
- stream->file = NULL;
return stream;
}
@@ -95,9 +92,12 @@ svn_stream_set_baton(svn_stream_t *stream, void *baton)
void
-svn_stream_set_read(svn_stream_t *stream, svn_read_fn_t read_fn)
+svn_stream_set_read2(svn_stream_t *stream,
+ svn_read_fn_t read_fn,
+ svn_read_fn_t read_full_fn)
{
stream->read_fn = read_fn;
+ stream->read_full_fn = read_full_fn;
}
void
@@ -131,26 +131,74 @@ svn_stream_set_seek(svn_stream_t *stream, svn_stream_seek_fn_t seek_fn)
}
void
+svn_stream_set_data_available(svn_stream_t *stream,
+ svn_stream_data_available_fn_t data_available_fn)
+{
+ stream->data_available_fn = data_available_fn;
+}
+
+void
svn_stream__set_is_buffered(svn_stream_t *stream,
svn_stream__is_buffered_fn_t is_buffered_fn)
{
stream->is_buffered_fn = is_buffered_fn;
}
+/* Standard implementation for svn_stream_read_full() based on
+ multiple svn_stream_read2() calls (in separate function to make
+ it more likely for svn_stream_read_full to be inlined) */
+static svn_error_t *
+full_read_fallback(svn_stream_t *stream, char *buffer, apr_size_t *len)
+{
+ apr_size_t remaining = *len;
+ while (remaining > 0)
+ {
+ apr_size_t length = remaining;
+ SVN_ERR(svn_stream_read2(stream, buffer, &length));
+
+ if (length == 0)
+ {
+ *len -= remaining;
+ return SVN_NO_ERROR;
+ }
+
+ remaining -= length;
+ buffer += length;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_stream_supports_partial_read(svn_stream_t *stream)
+{
+ return stream->read_fn != NULL;
+}
+
svn_error_t *
-svn_stream_read(svn_stream_t *stream, char *buffer, apr_size_t *len)
+svn_stream_read2(svn_stream_t *stream, char *buffer, apr_size_t *len)
{
- SVN_ERR_ASSERT(stream->read_fn != NULL);
+ if (stream->read_fn == NULL)
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED, NULL, NULL);
+
return svn_error_trace(stream->read_fn(stream->baton, buffer, len));
}
+svn_error_t *
+svn_stream_read_full(svn_stream_t *stream, char *buffer, apr_size_t *len)
+{
+ if (stream->read_full_fn == NULL)
+ return svn_error_trace(full_read_fallback(stream, buffer, len));
+
+ return svn_error_trace(stream->read_full_fn(stream->baton, buffer, len));
+}
svn_error_t *
svn_stream_skip(svn_stream_t *stream, apr_size_t len)
{
if (stream->skip_fn == NULL)
return svn_error_trace(
- skip_default_handler(stream->baton, len, stream->read_fn));
+ skip_default_handler(stream->baton, len, stream->read_full_fn));
return svn_error_trace(stream->skip_fn(stream->baton, len));
}
@@ -159,7 +207,9 @@ svn_stream_skip(svn_stream_t *stream, apr_size_t len)
svn_error_t *
svn_stream_write(svn_stream_t *stream, const char *data, apr_size_t *len)
{
- SVN_ERR_ASSERT(stream->write_fn != NULL);
+ if (stream->write_fn == NULL)
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED, NULL, NULL);
+
return svn_error_trace(stream->write_fn(stream->baton, data, len));
}
@@ -196,6 +246,17 @@ svn_stream_seek(svn_stream_t *stream, const svn_stream_mark_t *mark)
return svn_error_trace(stream->seek_fn(stream->baton, mark));
}
+svn_error_t *
+svn_stream_data_available(svn_stream_t *stream,
+ svn_boolean_t *data_available)
+{
+ if (stream->data_available_fn == NULL)
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED, NULL, NULL);
+
+ return svn_error_trace(stream->data_available_fn(stream->baton,
+ data_available));
+}
+
svn_boolean_t
svn_stream__is_buffered(svn_stream_t *stream)
{
@@ -259,11 +320,6 @@ svn_stream_printf_from_utf8(svn_stream_t *stream,
return svn_error_trace(svn_stream_puts(stream, translated));
}
-/* Size that 90% of the lines we encounter will be not longer than.
- used by stream_readline_bytewise() and stream_readline_chunky().
- */
-#define LINE_CHUNK_SIZE 80
-
/* Guts of svn_stream_readline().
* Returns the line read from STREAM in *STRINGBUF, and indicates
* end-of-file in *EOF. If DETECT_EOL is TRUE, the end-of-line indicator
@@ -286,14 +342,14 @@ stream_readline_bytewise(svn_stringbuf_t **stringbuf,
optimize for the 90% case. 90% of the time, we can avoid the
stringbuf ever having to realloc() itself if we start it out at
80 chars. */
- str = svn_stringbuf_create_ensure(LINE_CHUNK_SIZE, pool);
+ str = svn_stringbuf_create_ensure(SVN__LINE_CHUNK_SIZE, pool);
/* Read into STR up to and including the next EOL sequence. */
match = eol;
while (*match)
{
numbytes = 1;
- SVN_ERR(svn_stream_read(stream, &c, &numbytes));
+ SVN_ERR(svn_stream_read_full(stream, &c, &numbytes));
if (numbytes != 1)
{
/* a 'short' read means the stream has run out. */
@@ -330,7 +386,7 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
* larger value because filling the buffer from the stream takes
* time as well.
*/
- char buffer[LINE_CHUNK_SIZE+1];
+ char buffer[SVN__LINE_CHUNK_SIZE+1];
/* variables */
svn_stream_mark_t *mark;
@@ -347,8 +403,8 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
SVN_ERR(svn_stream_mark(stream, &mark, pool));
/* Read the first chunk. */
- numbytes = LINE_CHUNK_SIZE;
- SVN_ERR(svn_stream_read(stream, buffer, &numbytes));
+ numbytes = SVN__LINE_CHUNK_SIZE;
+ SVN_ERR(svn_stream_read_full(stream, buffer, &numbytes));
buffer[numbytes] = '\0';
/* Look for the EOL in this first chunk. If we find it, we are done here.
@@ -359,7 +415,7 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
*stringbuf = svn_stringbuf_ncreate(buffer, eol_pos - buffer, pool);
total_parsed = eol_pos - buffer + eol_len;
}
- else if (numbytes < LINE_CHUNK_SIZE)
+ else if (numbytes < SVN__LINE_CHUNK_SIZE)
{
/* We hit EOF but not EOL.
*/
@@ -371,7 +427,7 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
{
/* A larger buffer for the string is needed. */
svn_stringbuf_t *str;
- str = svn_stringbuf_create_ensure(2*LINE_CHUNK_SIZE, pool);
+ str = svn_stringbuf_create_ensure(2*SVN__LINE_CHUNK_SIZE, pool);
svn_stringbuf_appendbytes(str, buffer, numbytes);
*stringbuf = str;
@@ -381,9 +437,9 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
{
/* Append the next chunk to the string read so far.
*/
- svn_stringbuf_ensure(str, str->len + LINE_CHUNK_SIZE);
- numbytes = LINE_CHUNK_SIZE;
- SVN_ERR(svn_stream_read(stream, str->data + str->len, &numbytes));
+ svn_stringbuf_ensure(str, str->len + SVN__LINE_CHUNK_SIZE);
+ numbytes = SVN__LINE_CHUNK_SIZE;
+ SVN_ERR(svn_stream_read_full(stream, str->data + str->len, &numbytes));
str->len += numbytes;
str->data[str->len] = '\0';
@@ -393,7 +449,7 @@ stream_readline_chunky(svn_stringbuf_t **stringbuf,
*/
eol_pos = strstr(str->data + str->len - numbytes - (eol_len-1), eol);
- if ((numbytes < LINE_CHUNK_SIZE) && (eol_pos == NULL))
+ if ((numbytes < SVN__LINE_CHUNK_SIZE) && (eol_pos == NULL))
{
/* We hit EOF instead of EOL. */
*eof = TRUE;
@@ -495,7 +551,7 @@ svn_error_t *svn_stream_copy3(svn_stream_t *from, svn_stream_t *to,
break;
}
- err = svn_stream_read(from, buf, &len);
+ err = svn_stream_read_full(from, buf, &len);
if (err)
break;
@@ -528,10 +584,10 @@ svn_stream_contents_same2(svn_boolean_t *same,
while (bytes_read1 == SVN__STREAM_CHUNK_SIZE
&& bytes_read2 == SVN__STREAM_CHUNK_SIZE)
{
- err = svn_stream_read(stream1, buf1, &bytes_read1);
+ err = svn_stream_read_full(stream1, buf1, &bytes_read1);
if (err)
break;
- err = svn_stream_read(stream2, buf2, &bytes_read2);
+ err = svn_stream_read_full(stream2, buf2, &bytes_read2);
if (err)
break;
@@ -554,7 +610,7 @@ svn_stream_contents_same2(svn_boolean_t *same,
/* Skip data from any stream by reading and simply discarding it. */
static svn_error_t *
-skip_default_handler(void *baton, apr_size_t len, svn_read_fn_t read_fn)
+skip_default_handler(void *baton, apr_size_t len, svn_read_fn_t read_full_fn)
{
apr_size_t bytes_read = 1;
char buffer[4096];
@@ -563,7 +619,7 @@ skip_default_handler(void *baton, apr_size_t len, svn_read_fn_t read_fn)
while ((to_read > 0) && (bytes_read > 0))
{
bytes_read = sizeof(buffer) < to_read ? sizeof(buffer) : to_read;
- SVN_ERR(read_fn(baton, buffer, &bytes_read));
+ SVN_ERR(read_full_fn(baton, buffer, &bytes_read));
to_read -= bytes_read;
}
@@ -613,7 +669,7 @@ svn_stream_empty(apr_pool_t *pool)
svn_stream_t *stream;
stream = svn_stream_create(NULL, pool);
- svn_stream_set_read(stream, read_handler_empty);
+ svn_stream_set_read2(stream, read_handler_empty, read_handler_empty);
svn_stream_set_write(stream, write_handler_empty);
svn_stream_set_mark(stream, mark_handler_empty);
svn_stream_set_seek(stream, seek_handler_empty);
@@ -685,7 +741,13 @@ svn_stream_tee(svn_stream_t *out1,
static svn_error_t *
read_handler_disown(void *baton, char *buffer, apr_size_t *len)
{
- return svn_error_trace(svn_stream_read(baton, buffer, len));
+ return svn_error_trace(svn_stream_read2(baton, buffer, len));
+}
+
+static svn_error_t *
+read_full_handler_disown(void *baton, char *buffer, apr_size_t *len)
+{
+ return svn_error_trace(svn_stream_read_full(baton, buffer, len));
}
static svn_error_t *
@@ -712,6 +774,12 @@ seek_handler_disown(void *baton, const svn_stream_mark_t *mark)
return svn_error_trace(svn_stream_seek(baton, mark));
}
+static svn_error_t *
+data_available_disown(void *baton, svn_boolean_t *data_available)
+{
+ return svn_error_trace(svn_stream_data_available(baton, data_available));
+}
+
static svn_boolean_t
is_buffered_handler_disown(void *baton)
{
@@ -723,11 +791,12 @@ svn_stream_disown(svn_stream_t *stream, apr_pool_t *pool)
{
svn_stream_t *s = svn_stream_create(stream, pool);
- svn_stream_set_read(s, read_handler_disown);
+ svn_stream_set_read2(s, read_handler_disown, read_full_handler_disown);
svn_stream_set_skip(s, skip_handler_disown);
svn_stream_set_write(s, write_handler_disown);
svn_stream_set_mark(s, mark_handler_disown);
svn_stream_set_seek(s, seek_handler_disown);
+ svn_stream_set_data_available(s, data_available_disown);
svn_stream__set_is_buffered(s, is_buffered_handler_disown);
return s;
@@ -751,6 +820,38 @@ read_handler_apr(void *baton, char *buffer, apr_size_t *len)
{
struct baton_apr *btn = baton;
svn_error_t *err;
+
+ if (*len == 1)
+ {
+ err = svn_io_file_getc(buffer, btn->file, btn->pool);
+ if (err)
+ {
+ *len = 0;
+ if (APR_STATUS_IS_EOF(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ }
+ }
+ }
+ else
+ {
+ err = svn_io_file_read(btn->file, buffer, len, btn->pool);
+ if (err && APR_STATUS_IS_EOF(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = NULL;
+ }
+ }
+
+ return svn_error_trace(err);
+}
+
+static svn_error_t *
+read_full_handler_apr(void *baton, char *buffer, apr_size_t *len)
+{
+ struct baton_apr *btn = baton;
+ svn_error_t *err;
svn_boolean_t eof;
if (*len == 1)
@@ -833,6 +934,62 @@ seek_handler_apr(void *baton, const svn_stream_mark_t *mark)
return SVN_NO_ERROR;
}
+static svn_error_t *
+data_available_handler_apr(void *baton, svn_boolean_t *data_available)
+{
+ struct baton_apr *btn = baton;
+ apr_status_t status;
+#if !defined(WIN32) || APR_FILES_AS_SOCKETS
+ apr_pollfd_t pfd;
+ int n;
+
+ pfd.desc_type = APR_POLL_FILE;
+ pfd.desc.f = btn->file;
+ pfd.p = btn->pool; /* If we had a scratch pool... Luckily apr doesn't
+ store anything in this pool at this time */
+ pfd.reqevents = APR_POLLIN;
+
+ status = apr_poll(&pfd, 1, &n, 0);
+
+ if (status == APR_SUCCESS)
+ {
+ *data_available = (n > 0);
+ return SVN_NO_ERROR;
+ }
+ else if (APR_STATUS_IS_EOF(status) || APR_STATUS_IS_TIMEUP(status))
+ {
+ *data_available = FALSE;
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED,
+ svn_error_wrap_apr(
+ status,
+ _("Polling for available data on filestream "
+ "failed")),
+ NULL);
+ }
+#else
+ HANDLE h;
+ DWORD dwAvail;
+ status = apr_os_file_get(&h, btn->file);
+
+ if (status)
+ return svn_error_wrap_apr(status, NULL);
+
+ if (PeekNamedPipe(h, NULL, 0, NULL, &dwAvail, NULL))
+ {
+ *data_available = (dwAvail > 0);
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED,
+ svn_error_wrap_apr(apr_get_os_error(), NULL),
+ _("Windows doesn't support polling on files"));
+#endif
+}
+
static svn_boolean_t
is_buffered_handler_apr(void *baton)
{
@@ -894,10 +1051,12 @@ svn_stream_open_unique(svn_stream_t **stream,
}
-svn_stream_t *
-svn_stream_from_aprfile2(apr_file_t *file,
- svn_boolean_t disown,
- apr_pool_t *pool)
+/* Helper function that creates a stream from an APR file. */
+static svn_stream_t *
+make_stream_from_apr_file(apr_file_t *file,
+ svn_boolean_t disown,
+ svn_boolean_t supports_seek,
+ apr_pool_t *pool)
{
struct baton_apr *baton;
svn_stream_t *stream;
@@ -909,11 +1068,17 @@ svn_stream_from_aprfile2(apr_file_t *file,
baton->file = file;
baton->pool = pool;
stream = svn_stream_create(baton, pool);
- svn_stream_set_read(stream, read_handler_apr);
+ svn_stream_set_read2(stream, read_handler_apr, read_full_handler_apr);
svn_stream_set_write(stream, write_handler_apr);
- svn_stream_set_skip(stream, skip_handler_apr);
- svn_stream_set_mark(stream, mark_handler_apr);
- svn_stream_set_seek(stream, seek_handler_apr);
+
+ if (supports_seek)
+ {
+ svn_stream_set_skip(stream, skip_handler_apr);
+ svn_stream_set_mark(stream, mark_handler_apr);
+ svn_stream_set_seek(stream, seek_handler_apr);
+ }
+
+ svn_stream_set_data_available(stream, data_available_handler_apr);
svn_stream__set_is_buffered(stream, is_buffered_handler_apr);
stream->file = file;
@@ -923,6 +1088,14 @@ svn_stream_from_aprfile2(apr_file_t *file,
return stream;
}
+svn_stream_t *
+svn_stream_from_aprfile2(apr_file_t *file,
+ svn_boolean_t disown,
+ apr_pool_t *pool)
+{
+ return make_stream_from_apr_file(file, disown, TRUE, pool);
+}
+
apr_file_t *
svn_stream__aprfile(svn_stream_t *stream)
{
@@ -941,16 +1114,13 @@ svn_stream__aprfile(svn_stream_t *stream)
struct zbaton {
z_stream *in; /* compressed stream for reading */
z_stream *out; /* compressed stream for writing */
- svn_read_fn_t read; /* substream's read function */
- svn_write_fn_t write; /* substream's write function */
- svn_close_fn_t close; /* substream's close function */
+ void *substream; /* The substream */
void *read_buffer; /* buffer used for reading from
substream */
int read_flush; /* what flush mode to use while
reading */
apr_pool_t *pool; /* The pool this baton is allocated
on */
- void *subbaton; /* The substream's baton */
};
/* zlib alloc function. opaque is the pool we need. */
@@ -971,8 +1141,7 @@ zfree(voidpf opaque, voidpf address)
/* Helper function to figure out the sync mode */
static svn_error_t *
-read_helper_gz(svn_read_fn_t read_fn,
- void *baton,
+read_helper_gz(svn_stream_t *substream,
char *buffer,
uInt *len, int *zflush)
{
@@ -982,7 +1151,7 @@ read_helper_gz(svn_read_fn_t read_fn,
uInt, but Subversion's API requires apr_size_t. */
apr_size_t apr_len = (apr_size_t) *len;
- SVN_ERR((*read_fn)(baton, buffer, &apr_len));
+ SVN_ERR(svn_stream_read_full(substream, buffer, &apr_len));
/* Type cast back to uInt type that zlib uses. On LP64 platforms
apr_size_t will be bigger than uInt. */
@@ -1012,7 +1181,7 @@ read_handler_gz(void *baton, char *buffer, apr_size_t *len)
btn->in->next_in = btn->read_buffer;
btn->in->avail_in = ZBUFFER_SIZE;
- SVN_ERR(read_helper_gz(btn->read, btn->subbaton, btn->read_buffer,
+ SVN_ERR(read_helper_gz(btn->substream, btn->read_buffer,
&btn->in->avail_in, &btn->read_flush));
zerr = inflateInit(btn->in);
@@ -1028,7 +1197,7 @@ read_handler_gz(void *baton, char *buffer, apr_size_t *len)
{
btn->in->avail_in = ZBUFFER_SIZE;
btn->in->next_in = btn->read_buffer;
- SVN_ERR(read_helper_gz(btn->read, btn->subbaton, btn->read_buffer,
+ SVN_ERR(read_helper_gz(btn->substream, btn->read_buffer,
&btn->in->avail_in, &btn->read_flush));
}
@@ -1090,7 +1259,7 @@ write_handler_gz(void *baton, const char *buffer, apr_size_t *len)
SVN_ERR(svn_error__wrap_zlib(zerr, "deflate", btn->out->msg));
write_len = buf_size - btn->out->avail_out;
if (write_len > 0)
- SVN_ERR(btn->write(btn->subbaton, write_buf, &write_len));
+ SVN_ERR(svn_stream_write(btn->substream, write_buf, &write_len));
}
svn_pool_destroy(subpool);
@@ -1129,7 +1298,7 @@ close_handler_gz(void *baton)
btn->out->msg));
write_len = ZBUFFER_SIZE - btn->out->avail_out;
if (write_len > 0)
- SVN_ERR(btn->write(btn->subbaton, buf, &write_len));
+ SVN_ERR(svn_stream_write(btn->substream, buf, &write_len));
if (zerr == Z_STREAM_END)
break;
}
@@ -1138,10 +1307,7 @@ close_handler_gz(void *baton)
SVN_ERR(svn_error__wrap_zlib(zerr, "deflateEnd", btn->out->msg));
}
- if (btn->close != NULL)
- return svn_error_trace(btn->close(btn->subbaton));
- else
- return SVN_NO_ERROR;
+ return svn_error_trace(svn_stream_close(btn->substream));
}
@@ -1155,16 +1321,14 @@ svn_stream_compressed(svn_stream_t *stream, apr_pool_t *pool)
baton = apr_palloc(pool, sizeof(*baton));
baton->in = baton->out = NULL;
- baton->read = stream->read_fn;
- baton->write = stream->write_fn;
- baton->close = stream->close_fn;
- baton->subbaton = stream->baton;
+ baton->substream = stream;
baton->pool = pool;
baton->read_buffer = NULL;
baton->read_flush = Z_SYNC_FLUSH;
zstream = svn_stream_create(baton, pool);
- svn_stream_set_read(zstream, read_handler_gz);
+ svn_stream_set_read2(zstream, NULL /* only full read support */,
+ read_handler_gz);
svn_stream_set_write(zstream, write_handler_gz);
svn_stream_set_close(zstream, close_handler_gz);
@@ -1192,9 +1356,22 @@ static svn_error_t *
read_handler_checksum(void *baton, char *buffer, apr_size_t *len)
{
struct checksum_stream_baton *btn = baton;
+
+ SVN_ERR(svn_stream_read2(btn->proxy, buffer, len));
+
+ if (btn->read_checksum)
+ SVN_ERR(svn_checksum_update(btn->read_ctx, buffer, *len));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+read_full_handler_checksum(void *baton, char *buffer, apr_size_t *len)
+{
+ struct checksum_stream_baton *btn = baton;
apr_size_t saved_len = *len;
- SVN_ERR(svn_stream_read(btn->proxy, buffer, len));
+ SVN_ERR(svn_stream_read_full(btn->proxy, buffer, len));
if (btn->read_checksum)
SVN_ERR(svn_checksum_update(btn->read_ctx, buffer, *len));
@@ -1217,6 +1394,14 @@ write_handler_checksum(void *baton, const char *buffer, apr_size_t *len)
return svn_error_trace(svn_stream_write(btn->proxy, buffer, len));
}
+static svn_error_t *
+data_available_handler_checksum(void *baton, svn_boolean_t *data_available)
+{
+ struct checksum_stream_baton *btn = baton;
+
+ return svn_error_trace(svn_stream_data_available(btn->proxy,
+ data_available));
+}
static svn_error_t *
close_handler_checksum(void *baton)
@@ -1232,7 +1417,7 @@ close_handler_checksum(void *baton)
do
{
- SVN_ERR(read_handler_checksum(baton, buf, &len));
+ SVN_ERR(read_full_handler_checksum(baton, buf, &len));
}
while (btn->read_more);
}
@@ -1279,106 +1464,45 @@ svn_stream_checksummed2(svn_stream_t *stream,
baton->pool = pool;
s = svn_stream_create(baton, pool);
- svn_stream_set_read(s, read_handler_checksum);
+ svn_stream_set_read2(s, read_handler_checksum, read_full_handler_checksum);
svn_stream_set_write(s, write_handler_checksum);
+ svn_stream_set_data_available(s, data_available_handler_checksum);
svn_stream_set_close(s, close_handler_checksum);
return s;
}
-struct md5_stream_baton
-{
- const unsigned char **read_digest;
- const unsigned char **write_digest;
- svn_checksum_t *read_checksum;
- svn_checksum_t *write_checksum;
- svn_stream_t *proxy;
- apr_pool_t *pool;
-};
-
-static svn_error_t *
-read_handler_md5(void *baton, char *buffer, apr_size_t *len)
-{
- struct md5_stream_baton *btn = baton;
- return svn_error_trace(svn_stream_read(btn->proxy, buffer, len));
-}
-
-static svn_error_t *
-skip_handler_md5(void *baton, apr_size_t len)
-{
- struct md5_stream_baton *btn = baton;
- return svn_error_trace(svn_stream_skip(btn->proxy, len));
-}
+/* Miscellaneous stream functions. */
-static svn_error_t *
-write_handler_md5(void *baton, const char *buffer, apr_size_t *len)
+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)
{
- struct md5_stream_baton *btn = baton;
- return svn_error_trace(svn_stream_write(btn->proxy, buffer, len));
-}
+#define MIN_READ_SIZE 64
-static svn_error_t *
-close_handler_md5(void *baton)
-{
- struct md5_stream_baton *btn = baton;
+ apr_size_t to_read = 0;
+ svn_stringbuf_t *text
+ = svn_stringbuf_create_ensure(len_hint ? len_hint : MIN_READ_SIZE,
+ result_pool);
- SVN_ERR(svn_stream_close(btn->proxy));
+ do
+ {
+ to_read = text->blocksize - 1 - text->len;
+ SVN_ERR(svn_stream_read_full(stream, text->data + text->len, &to_read));
+ text->len += to_read;
- if (btn->read_digest)
- *btn->read_digest
- = apr_pmemdup(btn->pool, btn->read_checksum->digest,
- APR_MD5_DIGESTSIZE);
+ if (to_read && text->blocksize < text->len + MIN_READ_SIZE)
+ svn_stringbuf_ensure(text, text->blocksize * 2);
+ }
+ while (to_read);
- if (btn->write_digest)
- *btn->write_digest
- = apr_pmemdup(btn->pool, btn->write_checksum->digest,
- APR_MD5_DIGESTSIZE);
+ text->data[text->len] = '\0';
+ *str = text;
return SVN_NO_ERROR;
}
-
-svn_stream_t *
-svn_stream_checksummed(svn_stream_t *stream,
- const unsigned char **read_digest,
- const unsigned char **write_digest,
- svn_boolean_t read_all,
- apr_pool_t *pool)
-{
- svn_stream_t *s;
- struct md5_stream_baton *baton;
-
- if (! read_digest && ! write_digest)
- return stream;
-
- baton = apr_palloc(pool, sizeof(*baton));
- baton->read_digest = read_digest;
- baton->write_digest = write_digest;
- baton->pool = pool;
-
- /* Set BATON->proxy to a stream that will fill in BATON->read_checksum
- * and BATON->write_checksum (if we want them) when it is closed. */
- baton->proxy
- = svn_stream_checksummed2(stream,
- read_digest ? &baton->read_checksum : NULL,
- write_digest ? &baton->write_checksum : NULL,
- svn_checksum_md5,
- read_all, pool);
-
- /* Create a stream that will forward its read/write/close operations to
- * BATON->proxy and will fill in *READ_DIGEST and *WRITE_DIGEST (if we
- * want them) after it closes BATON->proxy. */
- s = svn_stream_create(baton, pool);
- svn_stream_set_read(s, read_handler_md5);
- svn_stream_set_skip(s, skip_handler_md5);
- svn_stream_set_write(s, write_handler_md5);
- svn_stream_set_close(s, close_handler_md5);
- return s;
-}
-
-
-
-
-/* Miscellaneous stream functions. */
struct stringbuf_stream_baton
{
svn_stringbuf_t *str;
@@ -1454,6 +1578,15 @@ seek_handler_stringbuf(void *baton, const svn_stream_mark_t *mark)
return SVN_NO_ERROR;
}
+static svn_error_t *
+data_available_handler_stringbuf(void *baton, svn_boolean_t *data_available)
+{
+ struct stringbuf_stream_baton *btn = baton;
+
+ *data_available = ((btn->str->len - btn->amt_read) > 0);
+ return SVN_NO_ERROR;
+}
+
static svn_boolean_t
is_buffered_handler_stringbuf(void *baton)
{
@@ -1474,11 +1607,12 @@ svn_stream_from_stringbuf(svn_stringbuf_t *str,
baton->str = str;
baton->amt_read = 0;
stream = svn_stream_create(baton, pool);
- svn_stream_set_read(stream, read_handler_stringbuf);
+ svn_stream_set_read2(stream, read_handler_stringbuf, read_handler_stringbuf);
svn_stream_set_skip(stream, skip_handler_stringbuf);
svn_stream_set_write(stream, write_handler_stringbuf);
svn_stream_set_mark(stream, mark_handler_stringbuf);
svn_stream_set_seek(stream, seek_handler_stringbuf);
+ svn_stream_set_data_available(stream, data_available_handler_stringbuf);
svn_stream__set_is_buffered(stream, is_buffered_handler_stringbuf);
return stream;
}
@@ -1549,6 +1683,15 @@ skip_handler_string(void *baton, apr_size_t len)
return SVN_NO_ERROR;
}
+static svn_error_t *
+data_available_handler_string(void *baton, svn_boolean_t *data_available)
+{
+ struct string_stream_baton *btn = baton;
+
+ *data_available = ((btn->str->len - btn->amt_read) > 0);
+ return SVN_NO_ERROR;
+}
+
static svn_boolean_t
is_buffered_handler_string(void *baton)
{
@@ -1569,10 +1712,11 @@ svn_stream_from_string(const svn_string_t *str,
baton->str = str;
baton->amt_read = 0;
stream = svn_stream_create(baton, pool);
- svn_stream_set_read(stream, read_handler_string);
+ svn_stream_set_read2(stream, read_handler_string, read_handler_string);
svn_stream_set_mark(stream, mark_handler_string);
svn_stream_set_seek(stream, seek_handler_string);
svn_stream_set_skip(stream, skip_handler_string);
+ svn_stream_set_data_available(stream, data_available_handler_string);
svn_stream__set_is_buffered(stream, is_buffered_handler_string);
return stream;
}
@@ -1588,7 +1732,11 @@ svn_stream_for_stdin(svn_stream_t **in, apr_pool_t *pool)
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stdin");
- *in = svn_stream_from_aprfile2(stdin_file, TRUE, pool);
+ /* STDIN may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *in = make_stream_from_apr_file(stdin_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -1604,7 +1752,11 @@ svn_stream_for_stdout(svn_stream_t **out, apr_pool_t *pool)
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stdout");
- *out = svn_stream_from_aprfile2(stdout_file, TRUE, pool);
+ /* STDOUT may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *out = make_stream_from_apr_file(stdout_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -1620,7 +1772,11 @@ svn_stream_for_stderr(svn_stream_t **err, apr_pool_t *pool)
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stderr");
- *err = svn_stream_from_aprfile2(stderr_file, TRUE, pool);
+ /* STDERR may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *err = make_stream_from_apr_file(stderr_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -1640,7 +1796,7 @@ svn_string_from_stream(svn_string_t **result,
{
apr_size_t len = SVN__STREAM_CHUNK_SIZE;
- SVN_ERR(svn_stream_read(stream, buffer, &len));
+ SVN_ERR(svn_stream_read_full(stream, buffer, &len));
svn_stringbuf_appendbytes(work, buffer, len);
if (len < SVN__STREAM_CHUNK_SIZE)
@@ -1657,7 +1813,7 @@ svn_string_from_stream(svn_string_t **result,
}
-/* These are somewhat arbirary, if we ever get good empirical data as to
+/* These are somewhat arbitrary, if we ever get good empirical data as to
actually valid values, feel free to update them. */
#define BUFFER_BLOCK_SIZE 1024
#define BUFFER_MAX_SIZE 100000
@@ -1665,7 +1821,9 @@ svn_string_from_stream(svn_string_t **result,
svn_stream_t *
svn_stream_buffered(apr_pool_t *result_pool)
{
- return svn_stream__from_spillbuf(BUFFER_BLOCK_SIZE, BUFFER_MAX_SIZE,
+ return svn_stream__from_spillbuf(svn_spillbuf__create(BUFFER_BLOCK_SIZE,
+ BUFFER_MAX_SIZE,
+ result_pool),
result_pool);
}
@@ -1721,7 +1879,21 @@ read_handler_lazyopen(void *baton,
lazyopen_baton_t *b = baton;
SVN_ERR(lazyopen_if_unopened(b));
- SVN_ERR(svn_stream_read(b->real_stream, buffer, len));
+ SVN_ERR(svn_stream_read2(b->real_stream, buffer, len));
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_read_fn_t */
+static svn_error_t *
+read_full_handler_lazyopen(void *baton,
+ char *buffer,
+ apr_size_t *len)
+{
+ lazyopen_baton_t *b = baton;
+
+ SVN_ERR(lazyopen_if_unopened(b));
+ SVN_ERR(svn_stream_read_full(b->real_stream, buffer, len));
return SVN_NO_ERROR;
}
@@ -1794,6 +1966,17 @@ seek_handler_lazyopen(void *baton,
return SVN_NO_ERROR;
}
+static svn_error_t *
+data_available_handler_lazyopen(void *baton,
+ svn_boolean_t *data_available)
+{
+ lazyopen_baton_t *b = baton;
+
+ SVN_ERR(lazyopen_if_unopened(b));
+ return svn_error_trace(svn_stream_data_available(b->real_stream,
+ data_available));
+}
+
/* Implements svn_stream__is_buffered_fn_t */
static svn_boolean_t
is_buffered_lazyopen(void *baton)
@@ -1823,13 +2006,300 @@ svn_stream_lazyopen_create(svn_stream_lazyopen_func_t open_func,
lob->open_on_close = open_on_close;
stream = svn_stream_create(lob, result_pool);
- svn_stream_set_read(stream, read_handler_lazyopen);
+ svn_stream_set_read2(stream, read_handler_lazyopen,
+ read_full_handler_lazyopen);
svn_stream_set_skip(stream, skip_handler_lazyopen);
svn_stream_set_write(stream, write_handler_lazyopen);
svn_stream_set_close(stream, close_handler_lazyopen);
svn_stream_set_mark(stream, mark_handler_lazyopen);
svn_stream_set_seek(stream, seek_handler_lazyopen);
+ svn_stream_set_data_available(stream, data_available_handler_lazyopen);
svn_stream__set_is_buffered(stream, is_buffered_lazyopen);
return stream;
}
+
+/* Baton for install streams */
+struct install_baton_t
+{
+ struct baton_apr baton_apr;
+ const char *tmp_path;
+};
+
+#ifdef WIN32
+
+/* Create and open a tempfile in DIRECTORY. Return its handle and path */
+static svn_error_t *
+create_tempfile(HANDLE *hFile,
+ const char **file_path,
+ const char *directory,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *unique_name;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ static svn_atomic_t tempname_counter;
+ int baseNr = (GetTickCount() << 11) + 13 * svn_atomic_inc(&tempname_counter)
+ + GetCurrentProcessId();
+ int i = 0;
+ HANDLE h;
+
+ /* Shares common idea with io.c's temp_file_create */
+
+ do
+ {
+ apr_uint32_t unique_nr;
+ WCHAR *w_name;
+
+ /* Generate a number that should be unique for this application and
+ usually for the entire computer to reduce the number of cycles
+ through this loop. (A bit of calculation is much cheaper than
+ disk io) */
+ unique_nr = baseNr + 7 * i++;
+
+
+ svn_pool_clear(iterpool);
+ unique_name = svn_dirent_join(directory,
+ apr_psprintf(iterpool, "svn-%X",
+ unique_nr),
+ iterpool);
+
+ SVN_ERR(svn_io__utf8_to_unicode_longpath(&w_name, unique_name,
+ iterpool));
+
+ /* Create a completely not-sharable file to avoid indexers, and other
+ filesystem watchers locking the file while we are still writing.
+
+ We need DELETE privileges to move the file. */
+ h = CreateFileW(w_name, GENERIC_WRITE | DELETE, 0 /* share */,
+ NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ apr_status_t status = apr_get_os_error();
+ if (i > 1000)
+ return svn_error_createf(SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED,
+ svn_error_wrap_apr(status, NULL),
+ _("Unable to make name in '%s'"),
+ svn_dirent_local_style(directory, scratch_pool));
+
+ if (!APR_STATUS_IS_EEXIST(status) && !APR_STATUS_IS_EACCES(status))
+ return svn_error_wrap_apr(status, NULL);
+ }
+ }
+ while (h == INVALID_HANDLE_VALUE);
+
+ *hFile = h;
+ *file_path = apr_pstrdup(result_pool, unique_name);
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_close_fn_t */
+static svn_error_t *
+install_close(void *baton)
+{
+ struct install_baton_t *ib = baton;
+
+ /* Flush the data cached in APR, but don't close the file yet */
+ SVN_ERR(svn_io_file_flush(ib->baton_apr.file, ib->baton_apr.pool));
+
+ return SVN_NO_ERROR;
+}
+
+#endif /* WIN32 */
+
+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)
+{
+ apr_file_t *file;
+ struct install_baton_t *ib;
+ const char *tmp_path;
+
+#ifdef WIN32
+ HANDLE hInstall;
+ apr_status_t status;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(tmp_abspath));
+
+ SVN_ERR(create_tempfile(&hInstall, &tmp_path, tmp_abspath,
+ scratch_pool, scratch_pool));
+
+ /* Wrap as a standard APR file to allow sharing implementation.
+
+ But do note that some file functions (such as retrieving the name)
+ don't work on this wrapper. */
+ /* ### Buffered, or not? */
+ status = apr_os_file_put(&file, &hInstall,
+ APR_WRITE | APR_BINARY | APR_BUFFERED,
+ result_pool);
+
+ if (status)
+ {
+ CloseHandle(hInstall);
+ return svn_error_wrap_apr(status, NULL);
+ }
+
+ tmp_path = svn_dirent_internal_style(tmp_path, result_pool);
+#else
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(tmp_abspath));
+
+ SVN_ERR(svn_io_open_unique_file3(&file, &tmp_path, tmp_abspath,
+ svn_io_file_del_none,
+ result_pool, scratch_pool));
+#endif
+ *install_stream = svn_stream_from_aprfile2(file, FALSE, result_pool);
+
+ ib = apr_pcalloc(result_pool, sizeof(*ib));
+ ib->baton_apr = *(struct baton_apr*)(*install_stream)->baton;
+
+ assert((void*)&ib->baton_apr == (void*)ib); /* baton pointer is the same */
+
+ (*install_stream)->baton = ib;
+
+ ib->tmp_path = tmp_path;
+
+#ifdef WIN32
+ /* Don't close the file on stream close; flush instead */
+ svn_stream_set_close(*install_stream, install_close);
+#else
+ /* ### Install pool cleanup handler for tempfile? */
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ struct install_baton_t *ib = install_stream->baton;
+ svn_error_t *err;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(final_abspath));
+#ifdef WIN32
+ err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path,
+ final_abspath, scratch_pool);
+ if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_t *err2;
+
+ err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath,
+ scratch_pool),
+ scratch_pool);
+
+ if (err2)
+ return svn_error_trace(svn_error_compose_create(err, err2));
+ else
+ svn_error_clear(err);
+
+ err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path,
+ final_abspath, scratch_pool);
+ }
+
+ /* ### rhuijben: I wouldn't be surprised if we later find out that we
+ have to fall back to close+rename on some specific
+ error values here, to support some non standard NAS
+ and filesystem scenarios. */
+ if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
+ {
+ /* Rename open files is not supported on this platform: fallback to
+ svn_io_file_rename2(). */
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+
+ SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+ }
+ else
+ {
+ return svn_error_compose_create(err,
+ svn_io_file_close(ib->baton_apr.file,
+ scratch_pool));
+ }
+#endif
+
+ err = svn_io_file_rename(ib->tmp_path, final_abspath, scratch_pool);
+
+ /* A missing directory is too common to not cover here. */
+ if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_t *err2;
+
+ err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath,
+ scratch_pool),
+ scratch_pool);
+
+ if (err2)
+ /* Creating directory didn't work: Return all errors */
+ return svn_error_trace(svn_error_compose_create(err, err2));
+ else
+ /* We could create a directory: retry install */
+ svn_error_clear(err);
+
+ SVN_ERR(svn_io_file_rename(ib->tmp_path, final_abspath, scratch_pool));
+ }
+ else
+ SVN_ERR(err);
+
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ struct install_baton_t *ib = install_stream->baton;
+
+#ifdef WIN32
+ /* On WIN32 the file is still open, so we can obtain the information
+ from the handle without race conditions */
+ apr_status_t status;
+
+ status = apr_file_info_get(finfo, wanted, ib->baton_apr.file);
+
+ if (status)
+ return svn_error_wrap_apr(status, NULL);
+#else
+ SVN_ERR(svn_io_stat(finfo, ib->tmp_path, wanted, scratch_pool));
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_stream__install_delete(svn_stream_t *install_stream,
+ apr_pool_t *scratch_pool)
+{
+ struct install_baton_t *ib = install_stream->baton;
+
+#ifdef WIN32
+ svn_error_t *err;
+
+ /* Mark the file as delete on close to avoid having to reopen
+ the file as part of the delete handling. */
+ err = svn_io__win_delete_file_on_close(ib->baton_apr.file, ib->tmp_path,
+ scratch_pool);
+ if (err == SVN_NO_ERROR)
+ {
+ SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+ return SVN_NO_ERROR; /* File is already gone */
+ }
+
+ /* Deleting file on close may be unsupported, so ignore errors and
+ fallback to svn_io_remove_file2(). */
+ svn_error_clear(err);
+ SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+#endif
+
+ return svn_error_trace(svn_io_remove_file2(ib->tmp_path, FALSE,
+ scratch_pool));
+}
diff --git a/subversion/libsvn_subr/string.c b/subversion/libsvn_subr/string.c
index c3d7fec..43a1a4e 100644
--- a/subversion/libsvn_subr/string.c
+++ b/subversion/libsvn_subr/string.c
@@ -26,6 +26,7 @@
#include <apr.h>
+#include <assert.h>
#include <string.h> /* for memcpy(), memcmp(), strlen() */
#include <apr_fnmatch.h>
@@ -53,9 +54,9 @@ membuf_create(void **data, apr_size_t *size,
/* apr_palloc will allocate multiples of 8.
* Thus, we would waste some of that memory if we stuck to the
* smaller size. Note that this is safe even if apr_palloc would
- * use some other aligment or none at all. */
+ * use some other alignment or none at all. */
minimum_size = APR_ALIGN_DEFAULT(minimum_size);
- *data = (!minimum_size ? NULL : apr_palloc(pool, minimum_size));
+ *data = apr_palloc(pool, minimum_size);
*size = minimum_size;
}
@@ -78,14 +79,10 @@ membuf_ensure(void **data, apr_size_t *size,
apr_size_t new_size = *size;
if (new_size == 0)
- /* APR will increase odd allocation sizes to the next
- * multiple for 8, for instance. Take advantage of that
- * knowledge and allow for the extra size to be used. */
new_size = minimum_size;
else
while (new_size < minimum_size)
{
- /* new_size is aligned; doubling it should keep it aligned */
const apr_size_t prev_size = new_size;
new_size *= 2;
@@ -121,7 +118,10 @@ svn_membuf__resize(svn_membuf_t *membuf, apr_size_t size)
const apr_size_t old_size = membuf->size;
membuf_ensure(&membuf->data, &membuf->size, size, membuf->pool);
- if (membuf->data && old_data && old_data != membuf->data)
+
+ /* If we re-allocated MEMBUF->DATA, it cannot be NULL.
+ * Statically initialized membuffers (OLD_DATA) may be NULL, though. */
+ if (old_data && old_data != membuf->data)
memcpy(membuf->data, old_data, old_size);
}
@@ -151,7 +151,7 @@ string_compare(const char *str1,
if (len1 != len2)
return FALSE;
- /* now the strings must have identical lenghths */
+ /* now the strings must have identical lengths */
if ((memcmp(str1, str2, len1)) == 0)
return TRUE;
@@ -240,7 +240,9 @@ svn_string_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool)
new_string->data = data;
new_string->len = size;
- memcpy(data, bytes, size);
+ /* If SIZE is 0, NULL is valid for BYTES. */
+ if (size)
+ memcpy(data, bytes, size);
/* Null termination is the convention -- even if we suspect the data
to be binary, it's not up to us to decide, it's the caller's
@@ -299,8 +301,9 @@ svn_string_isempty(const svn_string_t *str)
svn_string_t *
svn_string_dup(const svn_string_t *original_string, apr_pool_t *pool)
{
- return (svn_string_ncreate(original_string->data,
- original_string->len, pool));
+ return (original_string ? svn_string_ncreate(original_string->data,
+ original_string->len, pool)
+ : NULL);
}
@@ -393,7 +396,10 @@ svn_stringbuf_t *
svn_stringbuf_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool)
{
svn_stringbuf_t *strbuf = svn_stringbuf_create_ensure(size, pool);
- memcpy(strbuf->data, bytes, size);
+
+ /* If SIZE is 0, NULL is valid for BYTES. */
+ if (size)
+ memcpy(strbuf->data, bytes, size);
/* Null termination is the convention -- even if we suspect the data
to be binary, it's not up to us to decide, it's the caller's
@@ -418,6 +424,17 @@ svn_stringbuf_create_from_string(const svn_string_t *str, apr_pool_t *pool)
return svn_stringbuf_ncreate(str->data, str->len, pool);
}
+svn_stringbuf_t *
+svn_stringbuf_create_wrap(char *str, apr_pool_t *pool)
+{
+ svn_stringbuf_t *result = apr_palloc(pool, sizeof(*result));
+ result->pool = pool;
+ result->data = str;
+ result->len = strlen(str);
+ result->blocksize = result->len + 1;
+
+ return result;
+}
svn_stringbuf_t *
svn_stringbuf_createv(apr_pool_t *pool, const char *fmt, va_list ap)
@@ -579,6 +596,10 @@ svn_stringbuf_appendbytes(svn_stringbuf_t *str, const char *bytes,
apr_size_t total_len;
void *start_address;
+ if (!count)
+ /* Allow BYTES to be NULL by avoiding passing it to memcpy. */
+ return;
+
total_len = str->len + count; /* total size needed */
/* svn_stringbuf_ensure adds 1 for null terminator. */
@@ -595,6 +616,21 @@ svn_stringbuf_appendbytes(svn_stringbuf_t *str, const char *bytes,
to null-terminate. */
}
+void
+svn_stringbuf_appendfill(svn_stringbuf_t *str,
+ char byte,
+ apr_size_t count)
+{
+ apr_size_t new_len = str->len + count;
+ svn_stringbuf_ensure(str, new_len);
+
+ memset(str->data + str->len, byte, count);
+
+ /* update buffer length and always NUL-terminate it */
+ str->len = new_len;
+ str->data[new_len] = '\0';
+}
+
void
svn_stringbuf_appendstr(svn_stringbuf_t *targetstr,
@@ -616,23 +652,22 @@ svn_stringbuf_insert(svn_stringbuf_t *str,
const char *bytes,
apr_size_t count)
{
+ /* For COUNT==0, we allow BYTES to be NULL. It's a no-op in that case. */
+ if (count == 0)
+ return;
+
+ /* special case: BYTES overlaps with this string -> copy the source */
if (bytes + count > str->data && bytes < str->data + str->blocksize)
- {
- /* special case: BYTES overlaps with this string -> copy the source */
- const char *temp = apr_pmemdup(str->pool, bytes, count);
- svn_stringbuf_insert(str, pos, temp, count);
- }
- else
- {
- if (pos > str->len)
- pos = str->len;
+ bytes = apr_pmemdup(str->pool, bytes, count);
- svn_stringbuf_ensure(str, str->len + count);
- memmove(str->data + pos + count, str->data + pos, str->len - pos + 1);
- memcpy(str->data + pos, bytes, count);
+ if (pos > str->len)
+ pos = str->len;
- str->len += count;
- }
+ svn_stringbuf_ensure(str, str->len + count);
+ memmove(str->data + pos + count, str->data + pos, str->len - pos + 1);
+ memcpy(str->data + pos, bytes, count);
+
+ str->len += count;
}
void
@@ -642,7 +677,7 @@ svn_stringbuf_remove(svn_stringbuf_t *str,
{
if (pos > str->len)
pos = str->len;
- if (pos + count > str->len)
+ if (count > str->len - pos)
count = str->len - pos;
memmove(str->data + pos, str->data + pos + count, str->len - pos - count + 1);
@@ -656,32 +691,35 @@ svn_stringbuf_replace(svn_stringbuf_t *str,
const char *bytes,
apr_size_t new_count)
{
- if (bytes + new_count > str->data && bytes < str->data + str->blocksize)
+ /* For COUNT==0, we allow BYTES to be NULL.
+ * In that case, this is just a substring removal. */
+ if (new_count == 0)
{
- /* special case: BYTES overlaps with this string -> copy the source */
- const char *temp = apr_pmemdup(str->pool, bytes, new_count);
- svn_stringbuf_replace(str, pos, old_count, temp, new_count);
+ svn_stringbuf_remove(str, pos, old_count);
+ return;
}
- else
- {
- if (pos > str->len)
- pos = str->len;
- if (pos + old_count > str->len)
- old_count = str->len - pos;
- if (old_count < new_count)
- {
- apr_size_t delta = new_count - old_count;
- svn_stringbuf_ensure(str, str->len + delta);
- }
+ /* special case: BYTES overlaps with this string -> copy the source */
+ if (bytes + new_count > str->data && bytes < str->data + str->blocksize)
+ bytes = apr_pmemdup(str->pool, bytes, new_count);
- if (old_count != new_count)
- memmove(str->data + pos + new_count, str->data + pos + old_count,
- str->len - pos - old_count + 1);
+ if (pos > str->len)
+ pos = str->len;
+ if (old_count > str->len - pos)
+ old_count = str->len - pos;
- memcpy(str->data + pos, bytes, new_count);
- str->len += new_count - old_count;
+ if (old_count < new_count)
+ {
+ apr_size_t delta = new_count - old_count;
+ svn_stringbuf_ensure(str, str->len + delta);
}
+
+ if (old_count != new_count)
+ memmove(str->data + pos + new_count, str->data + pos + old_count,
+ str->len - pos - old_count + 1);
+
+ memcpy(str->data + pos, bytes, new_count);
+ str->len += new_count - old_count;
}
@@ -832,7 +870,7 @@ char *
svn_cstring_tokenize(const char *sep, char **str)
{
char *token;
- const char * next;
+ char *next;
char csep;
/* check parameters */
@@ -862,8 +900,8 @@ svn_cstring_tokenize(const char *sep, char **str)
}
else
{
- *(char *)next = '\0';
- *str = (char *)next + 1;
+ *next = '\0';
+ *str = next + 1;
}
return token;
@@ -1014,17 +1052,33 @@ svn_cstring_atoi(int *n, const char *str)
return SVN_NO_ERROR;
}
-
-apr_status_t
-svn__strtoff(apr_off_t *offset, const char *buf, char **end, int base)
+unsigned long
+svn__strtoul(const char* buffer, const char** end)
{
-#if !APR_VERSION_AT_LEAST(1,0,0)
- errno = 0;
- *offset = strtol(buf, end, base);
- return APR_FROM_OS_ERROR(errno);
-#else
- return apr_strtoff(offset, buf, end, base);
-#endif
+ unsigned long result = 0;
+
+ /* this loop will execute in just 2 CPU cycles, confirmed by measurement:
+ 7 macro-ops (max 4 / cycle => 2 cycles)
+ 1 load (max 1 / cycle)
+ 1 jumps (compare + conditional jump == 1 macro op; max 1 / cycle)
+ 2 arithmetic ops (subtract, increment; max 3 / cycle)
+ 2 scale-and-add AGU ops (max 3 / cycle)
+ 1 compiler-generated move operation
+ dependency chain: temp = result * 4 + result; result = temp * 2 + c
+ (2 ops with latency 1 => 2 cycles)
+ */
+ while (1)
+ {
+ unsigned long c = (unsigned char)*buffer - (unsigned char)'0';
+ if (c > 9)
+ break;
+
+ result = result * 10 + c;
+ ++buffer;
+ }
+
+ *end = buffer;
+ return result;
}
/* "Precalculated" itoa values for 2 places (including leading zeros).
@@ -1123,11 +1177,11 @@ svn__i64toa(char * dest, apr_int64_t number)
return svn__ui64toa(dest, (apr_uint64_t)number);
*dest = '-';
- return svn__ui64toa(dest + 1, (apr_uint64_t)(0-number)) + 1;
+ return svn__ui64toa(dest + 1, 0 - (apr_uint64_t)number) + 1;
}
static void
-ui64toa_sep(apr_uint64_t number, char seperator, char *buffer)
+ui64toa_sep(apr_uint64_t number, char separator, char *buffer)
{
apr_size_t length = svn__ui64toa(buffer, number);
apr_size_t i;
@@ -1135,7 +1189,7 @@ ui64toa_sep(apr_uint64_t number, char seperator, char *buffer)
for (i = length; i > 3; i -= 3)
{
memmove(&buffer[i - 2], &buffer[i - 3], length - i + 3);
- buffer[i-3] = seperator;
+ buffer[i-3] = separator;
length++;
}
@@ -1143,30 +1197,110 @@ ui64toa_sep(apr_uint64_t number, char seperator, char *buffer)
}
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)
{
char buffer[2 * SVN_INT64_BUFFER_SIZE];
- ui64toa_sep(number, seperator, buffer);
+ ui64toa_sep(number, separator, buffer);
return apr_pstrdup(pool, buffer);
}
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)
{
char buffer[2 * SVN_INT64_BUFFER_SIZE];
if (number < 0)
{
buffer[0] = '-';
- ui64toa_sep((apr_uint64_t)(-number), seperator, &buffer[1]);
+ ui64toa_sep((apr_uint64_t)(-number), separator, &buffer[1]);
}
else
- ui64toa_sep((apr_uint64_t)(number), seperator, buffer);
+ ui64toa_sep((apr_uint64_t)(number), separator, buffer);
return apr_pstrdup(pool, buffer);
}
-unsigned int
+apr_size_t
+svn__ui64tobase36(char *dest, apr_uint64_t value)
+{
+ char *dest_start = dest;
+ if (value < 10)
+ {
+ /* pretty frequent and trivial case. Make it fast. */
+ *(dest++) = (char)(value) + '0';
+ }
+ else
+ {
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ char *p = buffer;
+
+ /* write result as little-endian to buffer */
+ while (value > 0)
+ {
+ char c = (char)(value % 36);
+ value /= 36;
+
+ *p = (c <= 9) ? (c + '0') : (c - 10 + 'a');
+ ++p;
+ }
+
+ /* copy as big-endian to DEST */
+ while (p > buffer)
+ *(dest++) = *(--p);
+ }
+
+ *dest = '\0';
+ return dest - dest_start;
+}
+
+apr_uint64_t
+svn__base36toui64(const char **next, const char *source)
+{
+ apr_uint64_t result = 0;
+ apr_uint64_t factor = 1;
+ int i = 0;
+ char digits[SVN_INT64_BUFFER_SIZE];
+
+ /* convert digits to numerical values and count the number of places.
+ * Also, prevent buffer overflow. */
+ while (i < sizeof(digits))
+ {
+ char c = *source;
+ if (c < 'a')
+ {
+ /* includes detection of NUL terminator */
+ if (c < '0' || c > '9')
+ break;
+
+ c -= '0';
+ }
+ else
+ {
+ if (c < 'a' || c > 'z')
+ break;
+
+ c -= 'a' - 10;
+ }
+
+ digits[i++] = c;
+ source++;
+ }
+
+ /* fold digits into the result */
+ while (i > 0)
+ {
+ result += factor * (apr_uint64_t)digits[--i];
+ factor *= 36;
+ }
+
+ if (next)
+ *next = source;
+
+ return result;
+}
+
+
+apr_size_t
svn_cstring__similarity(const char *stra, const char *strb,
svn_membuf_t *buffer, apr_size_t *rlcs)
{
@@ -1178,7 +1312,7 @@ svn_cstring__similarity(const char *stra, const char *strb,
return svn_string__similarity(&stringa, &stringb, buffer, rlcs);
}
-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)
@@ -1242,7 +1376,7 @@ svn_string__similarity(const svn_string_t *stringa,
/* Calculate LCS length of the remainder */
for (pstr = stra; pstr < enda; ++pstr)
{
- int i;
+ apr_size_t i;
for (i = 1; i <= slots; ++i)
{
if (*pstr == strb[i-1])
@@ -1267,7 +1401,84 @@ svn_string__similarity(const svn_string_t *stringa,
/* Return similarity ratio rounded to 4 significant digits */
if (total)
- return(unsigned int)((2000 * lcs + total/2) / total);
+ return ((2 * SVN_STRING__SIM_RANGE_MAX * lcs + total/2) / total);
else
- return 1000;
+ return SVN_STRING__SIM_RANGE_MAX;
+}
+
+apr_size_t
+svn_cstring__match_length(const char *a,
+ const char *b,
+ apr_size_t max_len)
+{
+ apr_size_t pos = 0;
+
+#if SVN_UNALIGNED_ACCESS_IS_OK
+
+ /* Chunky processing is so much faster ...
+ *
+ * We can't make this work on architectures that require aligned access
+ * because A and B will probably have different alignment. So, skipping
+ * the first few chars until alignment is reached is not an option.
+ */
+ for (; pos + sizeof(apr_size_t) <= max_len; pos += sizeof(apr_size_t))
+ if (*(const apr_size_t*)(a + pos) != *(const apr_size_t*)(b + pos))
+ break;
+
+#endif
+
+ for (; pos < max_len; ++pos)
+ if (a[pos] != b[pos])
+ break;
+
+ return pos;
+}
+
+apr_size_t
+svn_cstring__reverse_match_length(const char *a,
+ const char *b,
+ apr_size_t max_len)
+{
+ apr_size_t pos = 0;
+
+#if SVN_UNALIGNED_ACCESS_IS_OK
+
+ /* Chunky processing is so much faster ...
+ *
+ * We can't make this work on architectures that require aligned access
+ * because A and B will probably have different alignment. So, skipping
+ * the first few chars until alignment is reached is not an option.
+ */
+ for (pos = sizeof(apr_size_t); pos <= max_len; pos += sizeof(apr_size_t))
+ if (*(const apr_size_t*)(a - pos) != *(const apr_size_t*)(b - pos))
+ break;
+
+ pos -= sizeof(apr_size_t);
+
+#endif
+
+ /* If we find a mismatch at -pos, pos-1 characters matched.
+ */
+ while (++pos <= max_len)
+ if (a[0-pos] != b[0-pos])
+ return pos - 1;
+
+ /* No mismatch found -> at least MAX_LEN matching chars.
+ */
+ return max_len;
+}
+
+const char *
+svn_cstring_skip_prefix(const char *str, const char *prefix)
+{
+ apr_size_t len = strlen(prefix);
+
+ if (strncmp(str, prefix, len) == 0)
+ {
+ return str + len;
+ }
+ else
+ {
+ return NULL;
+ }
}
diff --git a/subversion/libsvn_subr/subst.c b/subversion/libsvn_subr/subst.c
index 223b269..388c31a 100644
--- a/subversion/libsvn_subr/subst.c
+++ b/subversion/libsvn_subr/subst.c
@@ -50,6 +50,7 @@
#include "svn_private_config.h"
#include "private/svn_string_private.h"
+#include "private/svn_eol_private.h"
/**
* The textual elements of a detranslated special file. One of these
@@ -127,7 +128,7 @@ svn_subst_translation_required(svn_subst_eol_style_t style,
*
* Important API note: This function is the core of the implementation of
* svn_subst_build_keywords (all versions), and as such must implement the
- * tolerance of NULL and zero inputs that that function's documention
+ * tolerance of NULL and zero inputs that that function's documentation
* stipulates.
*
* The format codes:
@@ -158,7 +159,7 @@ keyword_printf(const char *fmt,
const char *author,
apr_pool_t *pool)
{
- svn_stringbuf_t *value = svn_stringbuf_ncreate("", 0, pool);
+ svn_stringbuf_t *value = svn_stringbuf_create_empty(pool);
const char *cur;
size_t n;
@@ -1122,28 +1123,42 @@ translate_chunk(svn_stream_t *dst,
/* skip current EOL */
len += b->eol_str_len;
- /* Check 4 bytes at once to allow for efficient pipelining
- and to reduce loop condition overhead. */
- while ((p + len + 4) <= end)
+ if (b->keywords)
{
- if (interesting[(unsigned char)p[len]]
- || interesting[(unsigned char)p[len+1]]
- || interesting[(unsigned char)p[len+2]]
- || interesting[(unsigned char)p[len+3]])
- break;
-
- len += 4;
+ /* Check 4 bytes at once to allow for efficient pipelining
+ and to reduce loop condition overhead. */
+ while ((p + len + 4) <= end)
+ {
+ if (interesting[(unsigned char)p[len]]
+ || interesting[(unsigned char)p[len+1]]
+ || interesting[(unsigned char)p[len+2]]
+ || interesting[(unsigned char)p[len+3]])
+ break;
+
+ len += 4;
+ }
+
+ /* Found an interesting char or EOF in the next 4 bytes.
+ Find its exact position. */
+ while ((p + len) < end
+ && !interesting[(unsigned char)p[len]])
+ ++len;
}
+ else
+ {
+ /* use our optimized sub-routine to find the next EOL */
+ const char *start = p + len;
+ const char *eol
+ = svn_eol__find_eol_start((char *)start, end - start);
- /* Found an interesting char or EOF in the next 4 bytes.
- Find its exact position. */
- while ((p + len) < end && !interesting[(unsigned char)p[len]])
- ++len;
+ /* EOL will be NULL if we did not find a line ending */
+ len += (eol ? eol : end) - start;
+ }
}
while (b->nl_translation_skippable ==
svn_tristate_true && /* can potentially skip EOLs */
p + len + 2 < end && /* not too close to EOF */
- eol_unchanged (b, p + len)); /* EOL format already ok */
+ eol_unchanged(b, p + len)); /* EOL format already ok */
while ((p + len) < end && !interesting[(unsigned char)p[len]])
len++;
@@ -1276,7 +1291,7 @@ translated_stream_read(void *baton,
svn_stringbuf_setempty(b->readbuf);
b->readbuf_off = 0;
- SVN_ERR(svn_stream_read(b->stream, b->buf, &readlen));
+ SVN_ERR(svn_stream_read_full(b->stream, b->buf, &readlen));
buf_stream = svn_stream_from_stringbuf(b->readbuf, b->iterpool);
SVN_ERR(translate_chunk(buf_stream, b->in_baton, b->buf,
@@ -1527,7 +1542,8 @@ stream_translated(svn_stream_t *stream,
baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE);
/* Setup the stream methods */
- svn_stream_set_read(s, translated_stream_read);
+ svn_stream_set_read2(s, NULL /* only full read support */,
+ translated_stream_read);
svn_stream_set_write(s, translated_stream_write);
svn_stream_set_close(s, translated_stream_close);
svn_stream_set_mark(s, translated_stream_mark);
@@ -1697,27 +1713,27 @@ create_special_file_from_stream(svn_stream_t *source, const char *dst,
}
/* If nothing else worked, write out the internal representation to
- a file that can be edited by the user.
-
- ### this only writes the first line!
- */
+ a file that can be edited by the user. */
if (create_using_internal_representation)
{
- apr_file_t *new_file;
- SVN_ERR(svn_io_open_unique_file3(&new_file, &dst_tmp,
- svn_dirent_dirname(dst, pool),
- svn_io_file_del_none,
- pool, pool));
-
- SVN_ERR(svn_io_file_write_full(new_file,
- contents->data, contents->len, NULL,
- pool));
-
- SVN_ERR(svn_io_file_close(new_file, pool));
+ svn_stream_t *new_stream;
+ apr_size_t len;
+
+ SVN_ERR(svn_stream_open_unique(&new_stream, &dst_tmp,
+ svn_dirent_dirname(dst, pool),
+ svn_io_file_del_none,
+ pool, pool));
+
+ if (!eof)
+ svn_stringbuf_appendcstr(contents, "\n");
+ len = contents->len;
+ SVN_ERR(svn_stream_write(new_stream, contents->data, &len));
+ SVN_ERR(svn_stream_copy3(svn_stream_disown(source, pool), new_stream,
+ NULL, NULL, pool));
}
/* Do the atomic rename from our temporary location. */
- return svn_io_file_rename(dst_tmp, dst, pool);
+ return svn_error_trace(svn_io_file_rename(dst_tmp, dst, pool));
}
@@ -1765,8 +1781,9 @@ svn_subst_copy_and_translate4(const char *src,
SVN_ERR(svn_stream_open_readonly(&src_stream, src, pool, pool));
}
- return svn_error_trace(create_special_file_from_stream(src_stream,
- dst, pool));
+ SVN_ERR(create_special_file_from_stream(src_stream, dst, pool));
+
+ return svn_error_trace(svn_stream_close(src_stream));
}
/* else !expand */
@@ -1835,10 +1852,10 @@ read_handler_special(void *baton, char *buffer, apr_size_t *len)
if (btn->read_stream)
/* We actually found a file to read from */
- return svn_stream_read(btn->read_stream, buffer, len);
+ return svn_stream_read_full(btn->read_stream, buffer, len);
else
return svn_error_createf(APR_ENOENT, NULL,
- "Can't read special file: File '%s' not found",
+ _("Can't read special file: File '%s' not found"),
svn_dirent_local_style(btn->path, btn->pool));
}
@@ -1925,7 +1942,8 @@ svn_subst_stream_from_specialfile(svn_stream_t **stream,
baton->write_stream = svn_stream_from_stringbuf(baton->write_content, pool);
*stream = svn_stream_create(baton, pool);
- svn_stream_set_read(*stream, read_handler_special);
+ svn_stream_set_read2(*stream, NULL /* only full read support */,
+ read_handler_special);
svn_stream_set_write(*stream, write_handler_special);
svn_stream_set_close(*stream, close_handler_special);
@@ -1954,7 +1972,7 @@ svn_subst_translate_string2(svn_string_t **new_value,
return SVN_NO_ERROR;
}
- if (encoding && !strcmp(encoding, "UTF-8"))
+ if (encoding && !strcmp(encoding, "UTF-8"))
{
val_utf8 = value->data;
}
diff --git a/subversion/libsvn_subr/sysinfo.c b/subversion/libsvn_subr/sysinfo.c
index f20050c..4ac923c 100644
--- a/subversion/libsvn_subr/sysinfo.c
+++ b/subversion/libsvn_subr/sysinfo.c
@@ -23,14 +23,6 @@
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#define PSAPI_VERSION 1
-#include <windows.h>
-#include <psapi.h>
-#include <Ws2tcpip.h>
-#endif
-
#define APR_WANT_STRFUNC
#include <apr_want.h>
@@ -53,6 +45,8 @@
#include "svn_version.h"
#include "private/svn_sqlite.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_utf_private.h"
#include "sysinfo.h"
#include "svn_private_config.h"
@@ -63,6 +57,10 @@
#ifdef SVN_HAVE_MACOS_PLIST
#include <CoreFoundation/CoreFoundation.h>
+#include <AvailabilityMacros.h>
+# ifndef MAC_OS_X_VERSION_10_6
+# define MAC_OS_X_VERSION_10_6 1060
+# endif
#endif
#ifdef SVN_HAVE_MACHO_ITERATE
@@ -129,7 +127,7 @@ const apr_array_header_t *
svn_sysinfo__linked_libs(apr_pool_t *pool)
{
svn_version_ext_linked_lib_t *lib;
- apr_array_header_t *array = apr_array_make(pool, 3, sizeof(*lib));
+ apr_array_header_t *array = apr_array_make(pool, 6, sizeof(*lib));
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "APR";
@@ -146,6 +144,11 @@ svn_sysinfo__linked_libs(apr_pool_t *pool)
#endif
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
+ lib->name = "Expat";
+ lib->compiled_version = apr_pstrdup(pool, svn_xml__compiled_version());
+ lib->runtime_version = apr_pstrdup(pool, svn_xml__runtime_version());
+
+ lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "SQLite";
lib->compiled_version = apr_pstrdup(pool, svn_sqlite__compiled_version());
#ifdef SVN_SQLITE_INLINE
@@ -154,6 +157,16 @@ svn_sysinfo__linked_libs(apr_pool_t *pool)
lib->runtime_version = apr_pstrdup(pool, svn_sqlite__runtime_version());
#endif
+ lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
+ lib->name = "Utf8proc";
+ lib->compiled_version = apr_pstrdup(pool, svn_utf__utf8proc_compiled_version());
+ lib->runtime_version = apr_pstrdup(pool, svn_utf__utf8proc_runtime_version());
+
+ lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
+ lib->name = "ZLib";
+ lib->compiled_version = apr_pstrdup(pool, svn_zlib__compiled_version());
+ lib->runtime_version = apr_pstrdup(pool, svn_zlib__runtime_version());
+
return array;
}
@@ -278,7 +291,7 @@ release_name_from_uname(apr_pool_t *pool)
#if __linux__
/* Split a stringbuf into a key/value pair.
- Return the key, leaving the striped value in the stringbuf. */
+ Return the key, leaving the stripped value in the stringbuf. */
static const char *
stringbuf_split_key(svn_stringbuf_t *buffer, char delim)
{
@@ -414,6 +427,63 @@ lsb_release(apr_pool_t *pool)
return NULL;
}
+/* Read /etc/os-release, as documented here:
+ * http://www.freedesktop.org/software/systemd/man/os-release.html
+ */
+static const char *
+systemd_release(apr_pool_t *pool)
+{
+ svn_error_t *err;
+ svn_stream_t *stream;
+
+ /* Open the file. */
+ err = svn_stream_open_readonly(&stream, "/etc/os-release", pool, pool);
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = svn_stream_open_readonly(&stream, "/usr/lib/os-release", pool,
+ pool);
+ }
+ if (err)
+ {
+ svn_error_clear(err);
+ return NULL;
+ }
+
+ /* Look for the PRETTY_NAME line. */
+ while (TRUE)
+ {
+ svn_stringbuf_t *line;
+ svn_boolean_t eof;
+
+ err = svn_stream_readline(stream, &line, "\n", &eof, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ return NULL;
+ }
+
+ if (!strncmp(line->data, "PRETTY_NAME=", 12))
+ {
+ svn_stringbuf_t *release_name;
+
+ /* The value may or may not be enclosed by double quotes. We don't
+ * attempt to strip them. */
+ release_name = svn_stringbuf_create(line->data + 12, pool);
+ svn_error_clear(svn_stream_close(stream));
+ svn_stringbuf_strip_whitespace(release_name);
+ return release_name->data;
+ }
+
+ if (eof)
+ break;
+ }
+
+ /* The file did not contain a PRETTY_NAME line. */
+ svn_error_clear(svn_stream_close(stream));
+ return NULL;
+}
+
/* Read the whole contents of a file. */
static svn_stringbuf_t *
read_file_contents(const char *filename, apr_pool_t *pool)
@@ -518,7 +588,7 @@ debian_release(apr_pool_t *pool)
return NULL;
stringbuf_first_line_only(buffer);
- return apr_pstrcat(pool, "Debian ", buffer->data, NULL);
+ return apr_pstrcat(pool, "Debian ", buffer->data, SVN_VA_NULL);
}
/* Try to find the Linux distribution name, or return info from uname. */
@@ -531,6 +601,10 @@ linux_release_name(apr_pool_t *pool)
Covers, for example, Debian, Ubuntu and SuSE. */
const char *release_name = lsb_release(pool);
+ /* Try the systemd way (covers Arch). */
+ if (!release_name)
+ release_name = systemd_release(pool);
+
/* Try RHEL/Fedora/CentOS */
if (!release_name)
release_name = redhat_release(pool);
@@ -558,22 +632,46 @@ linux_release_name(apr_pool_t *pool)
typedef DWORD (WINAPI *FNGETNATIVESYSTEMINFO)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *FNENUMPROCESSMODULES) (HANDLE, HMODULE*, DWORD, LPDWORD);
-/* Get system and version info, and try to tell the difference
- between the native system type and the runtime environment of the
- current process. Populate results in SYSINFO, LOCAL_SYSINFO
- (optional) and OSINFO. */
+svn_boolean_t
+svn_sysinfo___fill_windows_version(OSVERSIONINFOEXW *version_info)
+{
+ memset(version_info, 0, sizeof(*version_info));
+
+ version_info->dwOSVersionInfoSize = sizeof(*version_info);
+
+ /* Kill warnings with the Windows 8 and later platform SDK */
+#if _MSC_VER > 1600 && NTDDI_VERSION >= _0x06020000
+ /* Windows 8 deprecated the API to retrieve the Windows version to avoid
+ backwards compatibility problems... It might return a constant version
+ in future Windows versions... But let's kill the warning.
+
+ We can implementation this using a different function later. */
+#pragma warning(push)
+#pragma warning(disable: 4996)
+#endif
+
+ /* Prototype supports OSVERSIONINFO */
+ return GetVersionExW((LPVOID)version_info);
+#if _MSC_VER > 1600 && NTDDI_VERSION >= _0x06020000
+#pragma warning(pop)
+#pragma warning(disable: 4996)
+#endif
+}
+
+/* Get system info, and try to tell the difference between the native
+ system type and the runtime environment of the current process.
+ Populate results in SYSINFO and LOCAL_SYSINFO (optional). */
static BOOL
system_info(SYSTEM_INFO *sysinfo,
- SYSTEM_INFO *local_sysinfo,
- OSVERSIONINFOEXW *osinfo)
+ SYSTEM_INFO *local_sysinfo)
{
FNGETNATIVESYSTEMINFO GetNativeSystemInfo_ = (FNGETNATIVESYSTEMINFO)
GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetNativeSystemInfo");
- ZeroMemory(sysinfo, sizeof *sysinfo);
+ memset(sysinfo, 0, sizeof *sysinfo);
if (local_sysinfo)
{
- ZeroMemory(local_sysinfo, sizeof *local_sysinfo);
+ memset(local_sysinfo, 0, sizeof *local_sysinfo);
GetSystemInfo(local_sysinfo);
if (GetNativeSystemInfo_)
GetNativeSystemInfo_(sysinfo);
@@ -583,11 +681,6 @@ system_info(SYSTEM_INFO *sysinfo,
else
GetSystemInfo(sysinfo);
- ZeroMemory(osinfo, sizeof *osinfo);
- osinfo->dwOSVersionInfoSize = sizeof *osinfo;
- if (!GetVersionExW((LPVOID)osinfo))
- return FALSE;
-
return TRUE;
}
@@ -620,7 +713,8 @@ win32_canonical_host(apr_pool_t *pool)
SYSTEM_INFO local_sysinfo;
OSVERSIONINFOEXW osinfo;
- if (system_info(&sysinfo, &local_sysinfo, &osinfo))
+ if (system_info(&sysinfo, &local_sysinfo)
+ && svn_sysinfo___fill_windows_version(&osinfo))
{
const char *arch = processor_name(&local_sysinfo);
const char *machine = processor_name(&sysinfo);
@@ -684,7 +778,8 @@ win32_release_name(apr_pool_t *pool)
OSVERSIONINFOEXW osinfo;
HKEY hkcv;
- if (!system_info(&sysinfo, NULL, &osinfo))
+ if (!system_info(&sysinfo, NULL)
+ || !svn_sysinfo___fill_windows_version(&osinfo))
return NULL;
if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE,
@@ -888,71 +983,95 @@ win32_shared_libs(apr_pool_t *pool)
#ifdef SVN_HAVE_MACOS_PLIST
+/* implements svn_write_fn_t to copy the data into a CFMutableDataRef that's
+ * in the baton. */
+static svn_error_t *
+write_to_cfmutabledata(void *baton, const char *data, apr_size_t *len)
+{
+ CFMutableDataRef *resource = (CFMutableDataRef *) baton;
+
+ CFDataAppendBytes(*resource, (UInt8 *)data, *len);
+
+ return SVN_NO_ERROR;
+}
+
/* Load the SystemVersion.plist or ServerVersion.plist file into a
property list. Set SERVER to TRUE if the file read was
ServerVersion.plist. */
static CFDictionaryRef
system_version_plist(svn_boolean_t *server, apr_pool_t *pool)
{
- static const UInt8 server_version[] =
+ static const char server_version[] =
"/System/Library/CoreServices/ServerVersion.plist";
- static const UInt8 system_version[] =
+ static const char system_version[] =
"/System/Library/CoreServices/SystemVersion.plist";
-
+ svn_stream_t *read_stream, *write_stream;
+ svn_error_t *err;
CFPropertyListRef plist = NULL;
- CFDataRef resource = NULL;
- CFStringRef errstr = NULL;
- CFURLRef url = NULL;
- SInt32 errcode;
-
- url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
- server_version,
- sizeof(server_version) - 1,
- FALSE);
- if (!url)
+ CFMutableDataRef resource = CFDataCreateMutable(kCFAllocatorDefault, 0);
+
+ /* failed getting the CFMutableDataRef, shouldn't happen */
+ if (!resource)
return NULL;
- if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
- url, &resource,
- NULL, NULL, &errcode))
+ /* Try to open the plist files to get the data */
+ err = svn_stream_open_readonly(&read_stream, server_version, pool, pool);
+ if (err)
{
- CFRelease(url);
- url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
- system_version,
- sizeof(system_version) - 1,
- FALSE);
- if (!url)
- return NULL;
-
- if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
- url, &resource,
- NULL, NULL, &errcode))
+ if (!APR_STATUS_IS_ENOENT(err->apr_err))
{
- CFRelease(url);
+ svn_error_clear(err);
+ CFRelease(resource);
return NULL;
}
else
{
- CFRelease(url);
+ svn_error_clear(err);
+ err = svn_stream_open_readonly(&read_stream, system_version,
+ pool, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ CFRelease(resource);
+ return NULL;
+ }
+
*server = FALSE;
}
}
else
{
- CFRelease(url);
*server = TRUE;
}
- /* ### CFPropertyListCreateFromXMLData is obsolete, but its
- replacement CFPropertyListCreateWithData is only available
- from Mac OS 1.6 onward. */
+ /* copy the data onto the CFMutableDataRef to allow us to provide it to
+ * the CoreFoundation functions that parse proprerty lists */
+ write_stream = svn_stream_create(&resource, pool);
+ svn_stream_set_write(write_stream, write_to_cfmutabledata);
+ err = svn_stream_copy3(read_stream, write_stream, NULL, NULL, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ return NULL;
+ }
+
+#if __MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ /* This function is only available from Mac OS 10.6 onward. */
+ plist = CFPropertyListCreateWithData(kCFAllocatorDefault, resource,
+ kCFPropertyListImmutable,
+ NULL, NULL);
+#else /* Mac OS 10.5 or earlier */
+ /* This function obsolete and deprecated since Mac OS 10.10. */
plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resource,
kCFPropertyListImmutable,
- &errstr);
+ NULL);
+#endif /* MAC_OS_X_VERSION_10_6 */
+
if (resource)
CFRelease(resource);
- if (errstr)
- CFRelease(errstr);
+
+ if (!plist)
+ return NULL;
if (CFDictionaryGetTypeID() != CFGetTypeID(plist))
{
@@ -1013,16 +1132,19 @@ release_name_from_version(const char *osver)
/* See http://en.wikipedia.org/wiki/History_of_OS_X#Release_timeline */
switch(num)
{
- case 0: return "Cheetah";
- case 1: return "Puma";
- case 2: return "Jaguar";
- case 3: return "Panther";
- case 4: return "Tiger";
- case 5: return "Leopard";
- case 6: return "Snow Leopard";
- case 7: return "Lion";
- case 8: return "Mountain Lion";
- case 9: return "Mavericks";
+ case 0: return "Cheetah";
+ case 1: return "Puma";
+ case 2: return "Jaguar";
+ case 3: return "Panther";
+ case 4: return "Tiger";
+ case 5: return "Leopard";
+ case 6: return "Snow Leopard";
+ case 7: return "Lion";
+ case 8: return "Mountain Lion";
+ case 9: return "Mavericks";
+ case 10: return "Yosemite";
+ case 11: return "El Capitan";
+ case 12: return "Sierra";
}
return NULL;
diff --git a/subversion/libsvn_subr/sysinfo.h b/subversion/libsvn_subr/sysinfo.h
index 6a6e74d..5493e4b 100644
--- a/subversion/libsvn_subr/sysinfo.h
+++ b/subversion/libsvn_subr/sysinfo.h
@@ -62,6 +62,17 @@ const apr_array_header_t *svn_sysinfo__linked_libs(apr_pool_t *pool);
*/
const apr_array_header_t *svn_sysinfo__loaded_libs(apr_pool_t *pool);
+#ifdef WIN32
+/* Obtain the Windows version information as OSVERSIONINFOEXW structure.
+ *
+ * !!! Unlike other apis the caller is expected to pre-allocate the buffer
+ * !!! to allow using this api from the crash handler.
+ */
+svn_boolean_t
+svn_sysinfo___fill_windows_version(OSVERSIONINFOEXW *version_info);
+#endif
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/libsvn_subr/temp_serializer.c b/subversion/libsvn_subr/temp_serializer.c
index 261267a..c6286a6 100644
--- a/subversion/libsvn_subr/temp_serializer.c
+++ b/subversion/libsvn_subr/temp_serializer.c
@@ -279,6 +279,26 @@ svn_temp_serializer__pop(svn_temp_serializer__context_t *context)
context->recycler = old;
}
+void
+svn_temp_serializer__add_leaf(svn_temp_serializer__context_t *context,
+ const void * const * source_struct,
+ apr_size_t struct_size)
+{
+ const void *source = *source_struct;
+
+ /* the serialized structure must be properly aligned */
+ if (source)
+ align_buffer_end(context);
+
+ /* Store the offset at which the struct data that will the appended.
+ * Write 0 for NULL pointers. */
+ store_current_end_pointer(context, source_struct);
+
+ /* finally, actually append the struct contents */
+ if (*source_struct)
+ svn_stringbuf_appendbytes(context->buffer, source, struct_size);
+}
+
/* Serialize a string referenced from the current structure within the
* serialization CONTEXT. S must be a reference to the char* pointer in
* the original structure so that the correspondence in the serialized
@@ -292,7 +312,7 @@ svn_temp_serializer__add_string(svn_temp_serializer__context_t *context,
/* Store the offset at which the string data that will the appended.
* Write 0 for NULL pointers. Strings don't need special alignment. */
- store_current_end_pointer(context, (const void **)s);
+ store_current_end_pointer(context, (const void *const *)s);
/* append the string data */
if (string)
diff --git a/subversion/libsvn_subr/time.c b/subversion/libsvn_subr/time.c
index ccd6269..7fd6da0 100644
--- a/subversion/libsvn_subr/time.c
+++ b/subversion/libsvn_subr/time.c
@@ -34,6 +34,8 @@
#include "svn_error.h"
#include "svn_private_config.h"
+#include "private/svn_string_private.h"
+
/*** Code. ***/
@@ -82,7 +84,7 @@
/* Machine parseable part, generated by apr_snprintf. */
#define HUMAN_TIMESTAMP_FORMAT "%.4d-%.2d-%.2d %.2d:%.2d:%.2d %+.2d%.2d"
/* Human explanatory part, generated by apr_strftime as "Sat, 01 Jan 2000" */
-#define human_timestamp_format_suffix _(" (%a, %d %b %Y)")
+#define HUMAN_TIMESTAMP_FORMAT_SUFFIX _(" (%a, %d %b %Y)")
const char *
svn_time_to_cstring(apr_time_t when, apr_pool_t *pool)
@@ -135,24 +137,24 @@ svn_time_from_cstring(apr_time_t *when, const char *data, apr_pool_t *pool)
apr_time_exp_t exploded_time;
apr_status_t apr_err;
char wday[4], month[4];
- char *c;
+ const char *c;
/* Open-code parsing of the new timestamp format, as this
is a hot path for reading the entries file. This format looks
like: "2001-08-31T04:24:14.966996Z" */
- exploded_time.tm_year = (apr_int32_t) strtol(data, &c, 10);
+ exploded_time.tm_year = (apr_int32_t) svn__strtoul(data, &c);
if (*c++ != '-') goto fail;
- exploded_time.tm_mon = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_mon = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != '-') goto fail;
- exploded_time.tm_mday = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_mday = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != 'T') goto fail;
- exploded_time.tm_hour = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_hour = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != ':') goto fail;
- exploded_time.tm_min = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_min = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != ':') goto fail;
- exploded_time.tm_sec = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_sec = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != '.') goto fail;
- exploded_time.tm_usec = (apr_int32_t) strtol(c, &c, 10);
+ exploded_time.tm_usec = (apr_int32_t) svn__strtoul(c, &c);
if (*c++ != 'Z') goto fail;
exploded_time.tm_year -= 1900;
@@ -245,7 +247,7 @@ svn_time_to_human_cstring(apr_time_t when, apr_pool_t *pool)
ret = apr_strftime(human_datestr,
&retlen,
SVN_TIME__MAX_LENGTH - len,
- human_timestamp_format_suffix,
+ HUMAN_TIMESTAMP_FORMAT_SUFFIX,
&exploded_time);
/* If there was an error, ensure that the string is zero-terminated. */
diff --git a/subversion/libsvn_subr/types.c b/subversion/libsvn_subr/types.c
index 30ebb65..dba5ee8 100644
--- a/subversion/libsvn_subr/types.c
+++ b/subversion/libsvn_subr/types.c
@@ -31,36 +31,48 @@
#include "svn_props.h"
#include "svn_private_config.h"
+#include "private/svn_dep_compat.h"
+#include "private/svn_string_private.h"
+
svn_error_t *
svn_revnum_parse(svn_revnum_t *rev,
const char *str,
const char **endptr)
{
- char *end;
+ const char *end;
- svn_revnum_t result = strtol(str, &end, 10);
+ svn_revnum_t result = (svn_revnum_t)svn__strtoul(str, &end);
if (endptr)
- *endptr = end;
+ *endptr = str;
if (str == end)
- return svn_error_createf(SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
- _("Invalid revision number found parsing '%s'"),
- str);
-
- if (result < 0)
+ return svn_error_createf
+ (SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
+ *str == '-' ? _("Negative revision number found parsing '%s'")
+ : _("Invalid revision number found parsing '%s'"),
+ str);
+
+ /* a revision number with more than 9 digits is suspicious.
+ Have a closer look at those. */
+ if (str + 10 <= end)
{
- /* The end pointer from strtol() is valid, but a negative revision
- number is invalid, so move the end pointer back to the
- beginning of the string. */
- if (endptr)
- *endptr = str;
-
- return svn_error_createf(SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
- _("Negative revision number found parsing '%s'"),
- str);
+ /* we support 32 bit revision numbers only. check for overflows */
+ if (str + 10 < end)
+ return svn_error_createf
+ (SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
+ _("Revision number longer than 10 digits '%s'"), str);
+
+ /* we support 32 bit revision numbers only. check for overflows */
+ if (*str > '2' || (apr_uint32_t)result > APR_INT32_MAX)
+ return svn_error_createf
+ (SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
+ _("Revision number too large '%s'"), str);
}
+ if (endptr)
+ *endptr = end;
+
*rev = result;
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_subr/username_providers.c b/subversion/libsvn_subr/username_providers.c
index a6ef5b3..7a4095b 100644
--- a/subversion/libsvn_subr/username_providers.c
+++ b/subversion/libsvn_subr/username_providers.c
@@ -40,12 +40,6 @@
/* File provider */
/*-----------------------------------------------------------------------*/
-/* The key that will be stored on disk. Serves the same role as similar
- constants in other providers. */
-#define AUTHN_USERNAME_KEY "username"
-
-
-
/*** Username-only Provider ***/
static svn_error_t *
username_first_creds(void **credentials,
@@ -77,7 +71,8 @@ username_first_creds(void **credentials,
svn_error_clear(err);
if (! err && creds_hash)
{
- svn_string_t *str = svn_hash_gets(creds_hash, AUTHN_USERNAME_KEY);
+ svn_string_t *str = svn_hash_gets(creds_hash,
+ SVN_CONFIG_AUTHN_USERNAME_KEY);
if (str && str->data)
username = str->data;
}
@@ -125,7 +120,7 @@ username_save_creds(svn_boolean_t *saved,
/* Put the credentials in a hash and save it to disk */
creds_hash = apr_hash_make(pool);
- svn_hash_sets(creds_hash, AUTHN_USERNAME_KEY,
+ svn_hash_sets(creds_hash, SVN_CONFIG_AUTHN_USERNAME_KEY,
svn_string_create(creds->username, pool));
err = svn_config_write_auth_data(creds_hash, SVN_AUTH_CRED_USERNAME,
realmstring, config_dir, pool);
diff --git a/subversion/libsvn_subr/utf.c b/subversion/libsvn_subr/utf.c
index 4f9102d..7d20d24 100644
--- a/subversion/libsvn_subr/utf.c
+++ b/subversion/libsvn_subr/utf.c
@@ -59,6 +59,12 @@ static const char *SVN_APR_UTF8_CHARSET = "UTF-8";
static svn_mutex__t *xlate_handle_mutex = NULL;
static svn_boolean_t assume_native_charset_is_utf8 = FALSE;
+#if defined(WIN32)
+typedef svn_subr__win32_xlate_t xlate_handle_t;
+#else
+typedef apr_xlate_t xlate_handle_t;
+#endif
+
/* The xlate handle cache is a global hash table with linked lists of xlate
* handles. In multi-threaded environments, a thread "borrows" an xlate
* handle from the cache during a translation and puts it back afterwards.
@@ -69,7 +75,7 @@ static svn_boolean_t assume_native_charset_is_utf8 = FALSE;
* is the number of simultanous handles in use for that key. */
typedef struct xlate_handle_node_t {
- apr_xlate_t *handle;
+ xlate_handle_t *handle;
/* FALSE if the handle is not valid, since its pool is being
destroyed. */
svn_boolean_t valid;
@@ -172,7 +178,7 @@ get_xlate_key(const char *topage,
topage = "APR_DEFAULT_CHARSET";
return apr_pstrcat(pool, "svn-utf-", frompage, "to", topage,
- "-xlate-handle", (char *)NULL);
+ "-xlate-handle", SVN_VA_NULL);
}
/* Atomically replace the content in *MEM with NEW_VALUE and return
@@ -184,16 +190,10 @@ static APR_INLINE void*
atomic_swap(void * volatile * mem, void *new_value)
{
#if APR_HAS_THREADS
-#if APR_VERSION_AT_LEAST(1,3,0)
/* Cast is necessary because of APR bug:
https://issues.apache.org/bugzilla/show_bug.cgi?id=50731 */
return apr_atomic_xchgptr((volatile void **)mem, new_value);
#else
- /* old APRs don't support atomic swaps. Simply return the
- * input to the caller for further proccessing. */
- return new_value;
-#endif
-#else
/* no threads - no sync. necessary */
void *old_value = (void*)*mem;
*mem = new_value;
@@ -211,7 +211,7 @@ xlate_alloc_handle(xlate_handle_node_t **ret,
apr_pool_t *pool)
{
apr_status_t apr_err;
- apr_xlate_t *handle;
+ xlate_handle_t *handle;
const char *name;
/* The error handling doesn't support the following cases, since we don't
@@ -223,7 +223,7 @@ xlate_alloc_handle(xlate_handle_node_t **ret,
/* Try to create a handle. */
#if defined(WIN32)
- apr_err = svn_subr__win32_xlate_open((win32_xlate_t **)&handle, topage,
+ apr_err = svn_subr__win32_xlate_open(&handle, topage,
frompage, pool);
name = "win32-xlate: ";
#else
@@ -257,7 +257,7 @@ xlate_alloc_handle(xlate_handle_node_t **ret,
later. APR_STRERR will be in the local encoding, not in UTF-8, though.
*/
svn_strerror(apr_err, apr_strerr, sizeof(apr_strerr));
- return svn_error_createf(SVN_ERR_PLUGIN_LOAD_FAILURE,
+ return svn_error_createf(SVN_ERR_PLUGIN_LOAD_FAILURE,
svn_error_create(apr_err, NULL, apr_strerr),
"%s%s", name, errstr);
}
@@ -480,58 +480,6 @@ get_uton_xlate_handle_node(xlate_handle_node_t **ret, apr_pool_t *pool)
}
-/* Copy LEN bytes of SRC, converting non-ASCII and zero bytes to ?\nnn
- sequences, allocating the result in POOL. */
-static const char *
-fuzzy_escape(const char *src, apr_size_t len, apr_pool_t *pool)
-{
- const char *src_orig = src, *src_end = src + len;
- apr_size_t new_len = 0;
- char *new;
- const char *new_orig;
-
- /* First count how big a dest string we'll need. */
- while (src < src_end)
- {
- if (! svn_ctype_isascii(*src) || *src == '\0')
- new_len += 5; /* 5 slots, for "?\XXX" */
- else
- new_len += 1; /* one slot for the 7-bit char */
-
- src++;
- }
-
- /* Allocate that amount, plus one slot for '\0' character. */
- new = apr_palloc(pool, new_len + 1);
-
- new_orig = new;
-
- /* And fill it up. */
- while (src_orig < src_end)
- {
- if (! svn_ctype_isascii(*src_orig) || src_orig == '\0')
- {
- /* This is the same format as svn_xml_fuzzy_escape uses, but that
- function escapes different characters. Please keep in sync!
- ### If we add another fuzzy escape somewhere, we should abstract
- ### this out to a common function. */
- apr_snprintf(new, 6, "?\\%03u", (unsigned char) *src_orig);
- new += 5;
- }
- else
- {
- *new = *src_orig;
- new += 1;
- }
-
- src_orig++;
- }
-
- *new = '\0';
-
- return new_orig;
-}
-
/* Convert SRC_LENGTH bytes of SRC_DATA in NODE->handle, store the result
in *DEST, which is allocated in POOL. */
static svn_error_t *
@@ -544,9 +492,8 @@ convert_to_stringbuf(xlate_handle_node_t *node,
#ifdef WIN32
apr_status_t apr_err;
- apr_err = svn_subr__win32_xlate_to_stringbuf((win32_xlate_t *) node->handle,
- src_data, src_length,
- dest, pool);
+ apr_err = svn_subr__win32_xlate_to_stringbuf(node->handle, src_data,
+ src_length, dest, pool);
#else
apr_size_t buflen = src_length * 2;
apr_status_t apr_err;
@@ -609,8 +556,8 @@ convert_to_stringbuf(xlate_handle_node_t *node,
(pool, _("Can't convert string from '%s' to '%s':"),
node->frompage, node->topage);
- err = svn_error_create(apr_err, NULL, fuzzy_escape(src_data,
- src_length, pool));
+ err = svn_error_create(
+ apr_err, NULL, svn_utf__fuzzy_escape(src_data, src_length, pool));
return svn_error_create(apr_err, err, errstr);
}
/* Else, exited due to success. Trim the result buffer down to the
@@ -691,7 +638,7 @@ invalid_utf8(const char *data, apr_size_t len, apr_pool_t *pool)
valid_txt = apr_pstrcat(pool, valid_txt,
apr_psprintf(pool, " %02x",
(unsigned char)last[i-valid]),
- (char *)NULL);
+ SVN_VA_NULL);
/* 4 invalid octets will guarantee that the faulty octet is displayed */
invalid = data + len - last;
@@ -701,7 +648,7 @@ invalid_utf8(const char *data, apr_size_t len, apr_pool_t *pool)
invalid_txt = apr_pstrcat(pool, invalid_txt,
apr_psprintf(pool, " %02x",
(unsigned char)last[i]),
- (char *)NULL);
+ SVN_VA_NULL);
return svn_error_createf(APR_EINVAL, NULL,
_("Valid UTF-8 data\n(hex:%s)\n"
@@ -986,18 +933,6 @@ svn_utf_cstring_from_utf8_ex2(const char **dest,
return err;
}
-
-svn_error_t *
-svn_utf_cstring_from_utf8_ex(const char **dest,
- const char *src,
- const char *topage,
- const char *convset_key,
- apr_pool_t *pool)
-{
- return svn_utf_cstring_from_utf8_ex2(dest, src, topage, pool);
-}
-
-
const char *
svn_utf__cstring_from_utf8_fuzzy(const char *src,
apr_pool_t *pool,
@@ -1007,7 +942,7 @@ svn_utf__cstring_from_utf8_fuzzy(const char *src,
const char *escaped, *converted;
svn_error_t *err;
- escaped = fuzzy_escape(src, strlen(src), pool);
+ escaped = svn_utf__fuzzy_escape(src, strlen(src), pool);
/* Okay, now we have a *new* UTF-8 string, one that's guaranteed to
contain only 7-bit bytes :-). Recode to native... */
@@ -1084,3 +1019,240 @@ svn_utf_cstring_from_utf8_string(const char **dest,
return err;
}
+
+
+/* Insert the given UCS-4 VALUE into BUF at the given OFFSET. */
+static void
+membuf_insert_ucs4(svn_membuf_t *buf, apr_size_t offset, apr_int32_t value)
+{
+ svn_membuf__resize(buf, (offset + 1) * sizeof(value));
+ ((apr_int32_t*)buf->data)[offset] = value;
+}
+
+/* TODO: Use compiler intrinsics for byte swaps. */
+#define SWAP_SHORT(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
+#define SWAP_LONG(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \
+ | (((x) >> 8) & 0xff00) | (((x) >> 24) & 0xff))
+
+#define IS_UTF16_LEAD_SURROGATE(c) ((c) >= 0xd800 && (c) <= 0xdbff)
+#define IS_UTF16_TRAIL_SURROGATE(c) ((c) >= 0xdc00 && (c) <= 0xdfff)
+
+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)
+{
+ static const apr_uint16_t endiancheck = 0xa55a;
+ const svn_boolean_t arch_big_endian =
+ (((const char*)&endiancheck)[sizeof(endiancheck) - 1] == '\x5a');
+ const svn_boolean_t swap_order = (!big_endian != !arch_big_endian);
+
+ apr_uint16_t lead_surrogate;
+ apr_size_t length;
+ apr_size_t offset;
+ svn_membuf_t ucs4buf;
+ svn_membuf_t resultbuf;
+ svn_string_t *res;
+
+ if (utf16len == SVN_UTF__UNKNOWN_LENGTH)
+ {
+ const apr_uint16_t *endp = utf16str;
+ while (*endp++)
+ ;
+ utf16len = (endp - utf16str);
+ }
+
+ svn_membuf__create(&ucs4buf, utf16len * sizeof(apr_int32_t), scratch_pool);
+
+ for (lead_surrogate = 0, length = 0, offset = 0;
+ offset < utf16len; ++offset)
+ {
+ const apr_uint16_t code =
+ (swap_order ? SWAP_SHORT(utf16str[offset]) : utf16str[offset]);
+
+ if (lead_surrogate)
+ {
+ if (IS_UTF16_TRAIL_SURROGATE(code))
+ {
+ /* Combine the lead and trail currogates into a 32-bit code. */
+ membuf_insert_ucs4(&ucs4buf, length++,
+ (0x010000
+ + (((lead_surrogate & 0x03ff) << 10)
+ | (code & 0x03ff))));
+ lead_surrogate = 0;
+ continue;
+ }
+ else
+ {
+ /* If we didn't find a surrogate pair, just dump the
+ lead surrogate into the stream. */
+ membuf_insert_ucs4(&ucs4buf, length++, lead_surrogate);
+ lead_surrogate = 0;
+ }
+ }
+
+ if ((offset + 1) < utf16len && IS_UTF16_LEAD_SURROGATE(code))
+ {
+ /* Store a lead surrogate that is followed by at least one
+ code for the next iteration. */
+ lead_surrogate = code;
+ continue;
+ }
+ else
+ membuf_insert_ucs4(&ucs4buf, length++, code);
+ }
+
+ /* Convert the UCS-4 buffer to UTF-8, assuming an average of 2 bytes
+ per code point for encoding. The buffer will grow as
+ necessary. */
+ svn_membuf__create(&resultbuf, length * 2, result_pool);
+ SVN_ERR(svn_utf__encode_ucs4_string(
+ &resultbuf, ucs4buf.data, length, &length));
+
+ res = apr_palloc(result_pool, sizeof(*res));
+ res->data = resultbuf.data;
+ res->len = length;
+ *result = res;
+ return SVN_NO_ERROR;
+}
+
+
+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)
+{
+ static const apr_int32_t endiancheck = 0xa5cbbc5a;
+ const svn_boolean_t arch_big_endian =
+ (((const char*)&endiancheck)[sizeof(endiancheck) - 1] == '\x5a');
+ const svn_boolean_t swap_order = (!big_endian != !arch_big_endian);
+
+ apr_size_t length;
+ svn_membuf_t resultbuf;
+ svn_string_t *res;
+
+ if (utf32len == SVN_UTF__UNKNOWN_LENGTH)
+ {
+ const apr_int32_t *endp = utf32str;
+ while (*endp++)
+ ;
+ utf32len = (endp - utf32str);
+ }
+
+ if (swap_order)
+ {
+ apr_size_t offset;
+ svn_membuf_t ucs4buf;
+
+ svn_membuf__create(&ucs4buf, utf32len * sizeof(apr_int32_t),
+ scratch_pool);
+
+ for (offset = 0; offset < utf32len; ++offset)
+ {
+ const apr_int32_t code = SWAP_LONG(utf32str[offset]);
+ membuf_insert_ucs4(&ucs4buf, offset, code);
+ }
+ utf32str = ucs4buf.data;
+ }
+
+ /* Convert the UCS-4 buffer to UTF-8, assuming an average of 2 bytes
+ per code point for encoding. The buffer will grow as
+ necessary. */
+ svn_membuf__create(&resultbuf, utf32len * 2, result_pool);
+ SVN_ERR(svn_utf__encode_ucs4_string(
+ &resultbuf, utf32str, utf32len, &length));
+
+ res = apr_palloc(result_pool, sizeof(*res));
+ res->data = resultbuf.data;
+ res->len = length;
+ *result = res;
+ return SVN_NO_ERROR;
+}
+
+
+#ifdef WIN32
+
+
+svn_error_t *
+svn_utf__win32_utf8_to_utf16(const WCHAR **result,
+ const char *src,
+ const WCHAR *prefix,
+ apr_pool_t *result_pool)
+{
+ const int utf8_count = strlen(src);
+ const int prefix_len = (prefix ? lstrlenW(prefix) : 0);
+ WCHAR *wide_str;
+ int wide_count;
+
+ if (0 == prefix_len + utf8_count)
+ {
+ *result = L"";
+ return SVN_NO_ERROR;
+ }
+
+ wide_count = MultiByteToWideChar(CP_UTF8, 0, src, utf8_count, NULL, 0);
+ if (wide_count == 0)
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Conversion to UTF-16 failed"));
+
+ wide_str = apr_palloc(result_pool,
+ (prefix_len + wide_count + 1) * sizeof(*wide_str));
+ if (prefix_len)
+ memcpy(wide_str, prefix, prefix_len * sizeof(*wide_str));
+ if (0 == MultiByteToWideChar(CP_UTF8, 0, src, utf8_count,
+ wide_str + prefix_len, wide_count))
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Conversion to UTF-16 failed"));
+
+ wide_str[prefix_len + wide_count] = 0;
+ *result = wide_str;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_utf__win32_utf16_to_utf8(const char **result,
+ const WCHAR *src,
+ const char *prefix,
+ apr_pool_t *result_pool)
+{
+ const int wide_count = lstrlenW(src);
+ const int prefix_len = (prefix ? strlen(prefix) : 0);
+ char *utf8_str;
+ int utf8_count;
+
+ if (0 == prefix_len + wide_count)
+ {
+ *result = "";
+ return SVN_NO_ERROR;
+ }
+
+ utf8_count = WideCharToMultiByte(CP_UTF8, 0, src, wide_count,
+ NULL, 0, NULL, FALSE);
+ if (utf8_count == 0)
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Conversion from UTF-16 failed"));
+
+ utf8_str = apr_palloc(result_pool,
+ (prefix_len + utf8_count + 1) * sizeof(*utf8_str));
+ if (prefix_len)
+ memcpy(utf8_str, prefix, prefix_len * sizeof(*utf8_str));
+ if (0 == WideCharToMultiByte(CP_UTF8, 0, src, wide_count,
+ utf8_str + prefix_len, utf8_count,
+ NULL, FALSE))
+ return svn_error_wrap_apr(apr_get_os_error(),
+ _("Conversion from UTF-16 failed"));
+
+ utf8_str[prefix_len + utf8_count] = 0;
+ *result = utf8_str;
+
+ return SVN_NO_ERROR;
+}
+
+#endif /* WIN32 */
diff --git a/subversion/libsvn_subr/utf8proc.c b/subversion/libsvn_subr/utf8proc.c
new file mode 100644
index 0000000..1e705f5
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc.c
@@ -0,0 +1,530 @@
+/*
+ * utf8proc.c: Wrappers for the utf8proc library
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include <apr_fnmatch.h>
+
+#include "private/svn_string_private.h"
+#include "private/svn_utf_private.h"
+#include "svn_private_config.h"
+
+#define UTF8PROC_INLINE
+/* Somehow utf8proc thinks it is nice to use strlen as an argument name,
+ while this function is already defined via apr.h */
+#define strlen svn__strlen_var
+#include "utf8proc/utf8proc.c"
+#undef strlen
+
+
+
+const char *
+svn_utf__utf8proc_compiled_version(void)
+{
+ static const char utf8proc_version[] =
+ APR_STRINGIFY(UTF8PROC_VERSION_MAJOR) "."
+ APR_STRINGIFY(UTF8PROC_VERSION_MINOR) "."
+ APR_STRINGIFY(UTF8PROC_VERSION_PATCH);
+ return utf8proc_version;
+}
+
+const char *
+svn_utf__utf8proc_runtime_version(void)
+{
+ /* Unused static function warning removal hack. */
+ SVN_UNUSED(utf8proc_NFD);
+ SVN_UNUSED(utf8proc_NFC);
+ SVN_UNUSED(utf8proc_NFKD);
+ SVN_UNUSED(utf8proc_NFKC);
+
+ return utf8proc_version();
+}
+
+
+
+/* Fill the given BUFFER with decomposed UCS-4 representation of the
+ * UTF-8 STRING. If LENGTH is SVN_UTF__UNKNOWN_LENGTH, assume STRING
+ * is NUL-terminated; otherwise look only at the first LENGTH bytes in
+ * STRING. Upon return, BUFFER->data points at an array of UCS-4
+ * characters, and return the length of the array. TRANSFORM_FLAGS
+ * define exactly how the decomposition is performed.
+ *
+ * A negative return value is an utf8proc error code and may indicate
+ * that STRING contains invalid UTF-8 or was so long that an overflow
+ * occurred.
+ */
+static ssize_t
+unicode_decomposition(int transform_flags,
+ const char *string, apr_size_t length,
+ svn_membuf_t *buffer)
+{
+ const int nullterm = (length == SVN_UTF__UNKNOWN_LENGTH
+ ? UTF8PROC_NULLTERM : 0);
+
+ for (;;)
+ {
+ apr_int32_t *const ucs4buf = buffer->data;
+ const ssize_t ucs4len = buffer->size / sizeof(*ucs4buf);
+ const ssize_t result =
+ utf8proc_decompose((const void*) string, length, ucs4buf, ucs4len,
+ UTF8PROC_DECOMPOSE | UTF8PROC_STABLE
+ | transform_flags | nullterm);
+
+ if (result < 0 || result <= ucs4len)
+ return result;
+
+ /* Increase the decomposition buffer size and retry */
+ svn_membuf__ensure(buffer, result * sizeof(*ucs4buf));
+ }
+}
+
+/* Fill the given BUFFER with an NFD UCS-4 representation of the UTF-8
+ * STRING. If LENGTH is SVN_UTF__UNKNOWN_LENGTH, assume STRING is
+ * NUL-terminated; otherwise look only at the first LENGTH bytes in
+ * STRING. Upon return, BUFFER->data points at an array of UCS-4
+ * characters and *RESULT_LENGTH contains the length of the array.
+ *
+ * A returned error may indicate that STRING contains invalid UTF-8 or
+ * invalid Unicode codepoints. Any error message comes from utf8proc.
+ */
+static svn_error_t *
+decompose_normalized(apr_size_t *result_length,
+ const char *string, apr_size_t length,
+ svn_membuf_t *buffer)
+{
+ ssize_t result = unicode_decomposition(0, string, length, buffer);
+ if (result < 0)
+ return svn_error_create(SVN_ERR_UTF8PROC_ERROR, NULL,
+ gettext(utf8proc_errmsg(result)));
+ *result_length = result;
+ return SVN_NO_ERROR;
+}
+
+/* Fill the given BUFFER with an NFC UTF-8 representation of the UTF-8
+ * STRING. If LENGTH is SVN_UTF__UNKNOWN_LENGTH, assume STRING is
+ * NUL-terminated; otherwise look only at the first LENGTH bytes in
+ * STRING. Upon return, BUFFER->data points at a NUL-terminated string
+ * of UTF-8 characters.
+ *
+ * A returned error may indicate that STRING contains invalid UTF-8 or
+ * invalid Unicode codepoints. Any error message comes from utf8proc.
+ */
+static svn_error_t *
+normalize_cstring(apr_size_t *result_length,
+ const char *string, apr_size_t length,
+ svn_membuf_t *buffer)
+{
+ ssize_t result = unicode_decomposition(0, string, length, buffer);
+ if (result >= 0)
+ {
+ svn_membuf__resize(buffer, result * sizeof(apr_int32_t) + 1);
+ result = utf8proc_reencode(buffer->data, result,
+ UTF8PROC_COMPOSE | UTF8PROC_STABLE);
+ }
+ if (result < 0)
+ return svn_error_create(SVN_ERR_UTF8PROC_ERROR, NULL,
+ gettext(utf8proc_errmsg(result)));
+ *result_length = result;
+ return SVN_NO_ERROR;
+}
+
+/* Compare two arrays of UCS-4 codes, BUFA of length LENA and BUFB of
+ * length LENB. Return 0 if they're equal, a negative value if BUFA is
+ * less than BUFB, otherwise a positive value.
+ *
+ * Yes, this is strcmp for known-length UCS-4 strings.
+ */
+static int
+ucs4cmp(const apr_int32_t *bufa, apr_size_t lena,
+ const apr_int32_t *bufb, apr_size_t lenb)
+{
+ const apr_size_t len = (lena < lenb ? lena : lenb);
+ apr_size_t i;
+
+ for (i = 0; i < len; ++i)
+ {
+ const int diff = bufa[i] - bufb[i];
+ if (diff)
+ return diff;
+ }
+ return (lena == lenb ? 0 : (lena < lenb ? -1 : 1));
+}
+
+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)
+{
+ apr_size_t buflen1;
+ apr_size_t buflen2;
+
+ /* Shortcut-circuit the decision if at least one of the strings is empty. */
+ const svn_boolean_t empty1 =
+ (0 == len1 || (len1 == SVN_UTF__UNKNOWN_LENGTH && !*str1));
+ const svn_boolean_t empty2 =
+ (0 == len2 || (len2 == SVN_UTF__UNKNOWN_LENGTH && !*str2));
+ if (empty1 || empty2)
+ {
+ *result = (empty1 == empty2 ? 0 : (empty1 ? -1 : 1));
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(decompose_normalized(&buflen1, str1, len1, buf1));
+ SVN_ERR(decompose_normalized(&buflen2, str2, len2, buf2));
+ *result = ucs4cmp(buf1->data, buflen1, buf2->data, buflen2);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t*
+svn_utf__normalize(const char **result,
+ const char *str, apr_size_t len,
+ svn_membuf_t *buf)
+{
+ apr_size_t result_length;
+ SVN_ERR(normalize_cstring(&result_length, str, len, buf));
+ *result = (const char*)(buf->data);
+ return SVN_NO_ERROR;
+}
+
+/* Decode a single UCS-4 code point to UTF-8, appending the result to BUFFER.
+ * Assume BUFFER is already filled to *LENGTH and return the new size there.
+ * This function does *not* nul-terminate the stringbuf!
+ *
+ * A returned error indicates that the codepoint is invalid.
+ */
+static svn_error_t *
+encode_ucs4(svn_membuf_t *buffer, apr_int32_t ucs4chr, apr_size_t *length)
+{
+ apr_size_t utf8len;
+
+ if (buffer->size - *length < 4)
+ svn_membuf__resize(buffer, buffer->size + 4);
+
+ utf8len = utf8proc_encode_char(ucs4chr, ((uint8_t*)buffer->data + *length));
+ if (!utf8len)
+ return svn_error_createf(SVN_ERR_UTF8PROC_ERROR, NULL,
+ _("Invalid Unicode character U+%04lX"),
+ (long)ucs4chr);
+ *length += utf8len;
+ return SVN_NO_ERROR;
+}
+
+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)
+{
+ *result_length = 0;
+ while (length-- > 0)
+ SVN_ERR(encode_ucs4(buffer, *ucs4str++, result_length));
+ svn_membuf__resize(buffer, *result_length + 1);
+ ((char*)buffer->data)[*result_length] = '\0';
+ return SVN_NO_ERROR;
+}
+
+
+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)
+{
+ apr_size_t patternbuf_len;
+ apr_size_t tempbuf_len;
+
+ /* If we're in GLOB mode, we don't do custom escape chars. */
+ if (escape && !sql_like)
+ return svn_error_create(SVN_ERR_UTF8_GLOB, NULL,
+ _("Cannot use a custom escape token"
+ " in glob matching mode"));
+
+ /* Convert the patern to NFD UTF-8. We can't use the UCS-4 result
+ because apr_fnmatch can't handle it.*/
+ SVN_ERR(decompose_normalized(&tempbuf_len, pattern, pattern_len, temp_buf));
+ if (!sql_like)
+ SVN_ERR(svn_utf__encode_ucs4_string(pattern_buf, temp_buf->data,
+ tempbuf_len, &patternbuf_len));
+ else
+ {
+ /* Convert a LIKE pattern to a GLOB pattern that apr_fnmatch can use. */
+ const apr_int32_t *like = temp_buf->data;
+ apr_int32_t ucs4esc;
+ svn_boolean_t escaped;
+ apr_size_t i;
+
+ if (!escape)
+ ucs4esc = -1; /* Definitely an invalid UCS-4 character. */
+ else
+ {
+ const int nullterm = (escape_len == SVN_UTF__UNKNOWN_LENGTH
+ ? UTF8PROC_NULLTERM : 0);
+ ssize_t result =
+ utf8proc_decompose((const void*) escape, escape_len, &ucs4esc, 1,
+ UTF8PROC_DECOMPOSE | UTF8PROC_STABLE | nullterm);
+ if (result < 0)
+ return svn_error_create(SVN_ERR_UTF8PROC_ERROR, NULL,
+ gettext(utf8proc_errmsg(result)));
+ if (result == 0 || result > 1)
+ return svn_error_create(SVN_ERR_UTF8_GLOB, NULL,
+ _("Escape token must be one character"));
+ if ((ucs4esc & 0xFF) != ucs4esc)
+ return svn_error_createf(SVN_ERR_UTF8_GLOB, NULL,
+ _("Invalid escape character U+%04lX"),
+ (long)ucs4esc);
+ }
+
+ patternbuf_len = 0;
+ svn_membuf__ensure(pattern_buf, tempbuf_len + 1);
+ for (i = 0, escaped = FALSE; i < tempbuf_len; ++i, ++like)
+ {
+ if (*like == ucs4esc && !escaped)
+ {
+ svn_membuf__resize(pattern_buf, patternbuf_len + 1);
+ ((char*)pattern_buf->data)[patternbuf_len++] = '\\';
+ escaped = TRUE;
+ }
+ else if (escaped)
+ {
+ SVN_ERR(encode_ucs4(pattern_buf, *like, &patternbuf_len));
+ escaped = FALSE;
+ }
+ else
+ {
+ if ((*like == '[' || *like == '\\') && !escaped)
+ {
+ /* Escape brackets and backslashes which are always
+ literals in LIKE patterns. */
+ svn_membuf__resize(pattern_buf, patternbuf_len + 1);
+ ((char*)pattern_buf->data)[patternbuf_len++] = '\\';
+ escaped = TRUE;
+ --i; --like;
+ continue;
+ }
+
+ /* Replace LIKE wildcards with their GLOB equivalents. */
+ if (*like == '%' || *like == '_')
+ {
+ const char wildcard = (*like == '%' ? '*' : '?');
+ svn_membuf__resize(pattern_buf, patternbuf_len + 1);
+ ((char*)pattern_buf->data)[patternbuf_len++] = wildcard;
+ }
+ else
+ SVN_ERR(encode_ucs4(pattern_buf, *like, &patternbuf_len));
+ }
+ }
+ svn_membuf__resize(pattern_buf, patternbuf_len + 1);
+ ((char*)pattern_buf->data)[patternbuf_len] = '\0';
+ }
+
+ /* Now normalize the string */
+ SVN_ERR(decompose_normalized(&tempbuf_len, string, string_len, temp_buf));
+ SVN_ERR(svn_utf__encode_ucs4_string(string_buf, temp_buf->data,
+ tempbuf_len, &tempbuf_len));
+
+ *match = !apr_fnmatch(pattern_buf->data, string_buf->data, 0);
+ return SVN_NO_ERROR;
+}
+
+svn_boolean_t
+svn_utf__is_normalized(const char *string, apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ svn_membuf_t buffer;
+ apr_size_t result_length;
+ const apr_size_t length = strlen(string);
+ svn_membuf__create(&buffer, length * sizeof(apr_int32_t), scratch_pool);
+ err = normalize_cstring(&result_length, string, length, &buffer);
+ if (err)
+ {
+ svn_error_clear(err);
+ return FALSE;
+ }
+ return (length == result_length && 0 == strcmp(string, buffer.data));
+}
+
+const char *
+svn_utf__fuzzy_escape(const char *src, apr_size_t length, apr_pool_t *pool)
+{
+ /* Hexadecimal digits for code conversion. */
+ static const char digits[] = "0123456789ABCDEF";
+
+ /* Flags used for Unicode decomposition. */
+ static const int decomp_flags = (
+ UTF8PROC_COMPAT | UTF8PROC_STABLE | UTF8PROC_LUMP
+ | UTF8PROC_NLF2LF | UTF8PROC_STRIPCC | UTF8PROC_STRIPMARK);
+
+ svn_stringbuf_t *result;
+ svn_membuf_t buffer;
+ ssize_t decomp_length;
+ ssize_t len;
+
+ /* Decompose to a non-reversible compatibility format. */
+ svn_membuf__create(&buffer, length * sizeof(apr_int32_t), pool);
+ decomp_length = unicode_decomposition(decomp_flags, src, length, &buffer);
+ if (decomp_length < 0)
+ {
+ svn_membuf_t part;
+ apr_size_t done, prev;
+
+ /* The only other error we can receive here indicates an integer
+ overflow due to the length of the input string. Not very
+ likely, but we certainly shouldn't continue in that case. */
+ SVN_ERR_ASSERT_NO_RETURN(decomp_length == UTF8PROC_ERROR_INVALIDUTF8);
+
+ /* Break the decomposition into parts that are valid UTF-8, and
+ bytes that are not. Represent the invalid bytes in the target
+ erray by their negative value. This works because utf8proc
+ will not generate Unicode code points with values larger than
+ U+10FFFF. */
+ svn_membuf__create(&part, sizeof(apr_int32_t), pool);
+ decomp_length = 0;
+ done = prev = 0;
+ while (done < length)
+ {
+ apr_int32_t uc;
+
+ while (done < length)
+ {
+ len = utf8proc_iterate((uint8_t*)src + done, length - done, &uc);
+ if (len < 0)
+ break;
+ done += len;
+ }
+
+ /* Decompose the valid part */
+ if (done > prev)
+ {
+ len = unicode_decomposition(
+ decomp_flags, src + prev, done - prev, &part);
+ SVN_ERR_ASSERT_NO_RETURN(len > 0);
+ svn_membuf__resize(
+ &buffer, (decomp_length + len) * sizeof(apr_int32_t));
+ memcpy((apr_int32_t*)buffer.data + decomp_length,
+ part.data, len * sizeof(apr_int32_t));
+ decomp_length += len;
+ prev = done;
+ }
+
+ /* What follows could be a valid UTF-8 sequence, but not
+ a valid Unicode character. */
+ if (done < length)
+ {
+ const char *last;
+
+ /* Determine the length of the UTF-8 sequence */
+ const char *const p = src + done;
+ len = utf8proc_utf8class[(uint8_t)*p];
+
+ /* Check if the multi-byte sequence is valid UTF-8. */
+ if (len > 1 && len <= (apr_ssize_t)(length - done))
+ last = svn_utf__last_valid(p, len);
+ else
+ last = NULL;
+
+ /* Might not be a valid UTF-8 sequence at all */
+ if (!last || (last && last - p < len))
+ {
+ uc = -((apr_int32_t)(*p & 0xff));
+ len = 1;
+ }
+ else
+ {
+ switch (len)
+ {
+ /* Decode the UTF-8 sequence without validation. */
+ case 2:
+ uc = ((p[0] & 0x1f) << 6) + (p[1] & 0x3f);
+ break;
+ case 3:
+ uc = (((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6)
+ + (p[2] & 0x3f));
+ break;
+ case 4:
+ uc = (((p[0] & 0x07) << 18) + ((p[1] & 0x3f) << 12)
+ + ((p[2] & 0x3f) << 6) + (p[3] & 0x3f));
+ break;
+ default:
+ SVN_ERR_ASSERT_NO_RETURN(
+ !"Unexpected invalid UTF-8 byte");
+ }
+
+ }
+
+ svn_membuf__resize(
+ &buffer, (decomp_length + 1) * sizeof(apr_int32_t));
+ ((apr_int32_t*)buffer.data)[decomp_length++] = uc;
+ done += len;
+ prev = done;
+ }
+ }
+ }
+
+ /* Scan the result and deleting any combining diacriticals and
+ inserting placeholders where any non-ascii characters remain. */
+ result = svn_stringbuf_create_ensure(decomp_length, pool);
+ for (len = 0; len < decomp_length; ++len)
+ {
+ const apr_int32_t cp = ((apr_int32_t*)buffer.data)[len];
+ if (cp > 0 && cp < 127)
+ svn_stringbuf_appendbyte(result, (char)cp);
+ else if (cp == 0)
+ svn_stringbuf_appendcstr(result, "\\0");
+ else if (cp < 0)
+ {
+ const apr_int32_t rcp = ((-cp) & 0xff);
+ svn_stringbuf_appendcstr(result, "?\\");
+ svn_stringbuf_appendbyte(result, digits[(rcp & 0x00f0) >> 4]);
+ svn_stringbuf_appendbyte(result, digits[(rcp & 0x000f)]);
+ }
+ else
+ {
+ if (utf8proc_codepoint_valid(cp))
+ {
+ const utf8proc_property_t *prop = utf8proc_get_property(cp);
+ if (prop->combining_class != 0)
+ continue; /* Combining mark; ignore */
+ svn_stringbuf_appendcstr(result, "{U+");
+ }
+ else
+ svn_stringbuf_appendcstr(result, "{U?");
+ if (cp > 0xffff)
+ {
+ svn_stringbuf_appendbyte(result, digits[(cp & 0xf00000) >> 20]);
+ svn_stringbuf_appendbyte(result, digits[(cp & 0x0f0000) >> 16]);
+ }
+ svn_stringbuf_appendbyte(result, digits[(cp & 0xf000) >> 12]);
+ svn_stringbuf_appendbyte(result, digits[(cp & 0x0f00) >> 8]);
+ svn_stringbuf_appendbyte(result, digits[(cp & 0x00f0) >> 4]);
+ svn_stringbuf_appendbyte(result, digits[(cp & 0x000f)]);
+ svn_stringbuf_appendbyte(result, '}');
+ }
+ }
+
+ return result->data;
+}
diff --git a/subversion/libsvn_subr/utf8proc/LICENSE b/subversion/libsvn_subr/utf8proc/LICENSE
new file mode 100644
index 0000000..504e4c5
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc/LICENSE
@@ -0,0 +1,64 @@
+
+Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+This software distribution contains derived data from a modified version of
+the Unicode data files. The following license applies to that data:
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed
+under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of the Unicode data files and any associated documentation (the "Data
+Files") or Unicode software and any associated documentation (the
+"Software") to deal in the Data Files or Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, and/or sell copies of the Data Files or Software, and
+to permit persons to whom the Data Files or Software are furnished to do
+so, provided that (a) the above copyright notice(s) and this permission
+notice appear with all copies of the Data Files or Software, (b) both the
+above copyright notice(s) and this permission notice appear in associated
+documentation, and (c) there is clear notice in each modified Data File or
+in the Software as well as in the documentation associated with the Data
+File(s) or Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
+CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall
+not be used in advertising or otherwise to promote the sale, use or other
+dealings in these Data Files or Software without prior written
+authorization of the copyright holder.
+
+
+Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be
+registered in some jurisdictions. All other trademarks and registered
+trademarks mentioned herein are the property of their respective owners.
+
diff --git a/subversion/libsvn_subr/utf8proc/README b/subversion/libsvn_subr/utf8proc/README
new file mode 100644
index 0000000..e72ffff
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc/README
@@ -0,0 +1,116 @@
+
+Please read the LICENSE file, which is shipping with this software.
+
+
+*** QUICK START ***
+
+For compilation of the C library call "make c-library", for compilation of
+the ruby library call "make ruby-library" and for compilation of the
+PostgreSQL extension call "make pgsql-library".
+
+For ruby you can also create a gem-file by calling "make ruby-gem".
+
+"make all" can be used to build everything, but both ruby and PostgreSQL
+installations are required in this case.
+
+
+*** GENERAL INFORMATION ***
+
+The C library is found in this directory after successful compilation and
+is named "libutf8proc.a" and "libutf8proc.so". The ruby library consists of
+the files "utf8proc.rb" and "utf8proc_native.so", which are found in the
+subdirectory "ruby/". If you chose to create a gem-file it is placed in the
+"ruby/gem" directory. The PostgreSQL extension is named "utf8proc_pgsql.so"
+and resides in the "pgsql/" directory.
+
+Both the ruby library and the PostgreSQL extension are built as stand-alone
+libraries and are therefore not dependent the dynamic version of the
+C library files, but this behaviour might change in future releases.
+
+The Unicode version being supported is 5.0.0.
+Note: Version 4.1.0 of Unicode Standard Annex #29 was used, as
+ version 5.0.0 had not been available at the time of implementation.
+
+For Unicode normalizations, the following options have to be used:
+Normalization Form C: STABLE, COMPOSE
+Normalization Form D: STABLE, DECOMPOSE
+Normalization Form KC: STABLE, COMPOSE, COMPAT
+Normalization Form KD: STABLE, DECOMPOSE, COMPAT
+
+
+*** C LIBRARY ***
+
+The documentation for the C library is found in the utf8proc.h header file.
+"utf8proc_map" is most likely function you will be using for mapping UTF-8
+strings, unless you want to allocate memory yourself.
+
+
+*** RUBY API ***
+
+The ruby library adds the methods "utf8map" and "utf8map!" to the String
+class, and the method "utf8" to the Integer class.
+
+The String#utf8map method does the same as the "utf8proc_map" C function.
+Options for the mapping procedure are passed as symbols, i.e:
+"Hello".utf8map(:casefold) => "hello"
+
+The descriptions of all options are found in the C header file
+"utf8proc.h". Please notice that the according symbols in ruby are all
+lowercase.
+
+String#utf8map! is the destructive function in the meaning that the string
+is replaced by the result.
+
+There are shortcuts for the 4 normalization forms specified by Unicode:
+String#utf8nfd, String#utf8nfd!,
+String#utf8nfc, String#utf8nfc!,
+String#utf8nfkd, String#utf8nfkd!,
+String#utf8nfkc, String#utf8nfkc!
+
+The method Integer#utf8 returns a UTF-8 string, which is containing the
+unicode char given by the code point.
+0x000A.utf8 => "\n"
+0x2028.utf8 => "\342\200\250"
+
+
+*** POSTGRESQL API ***
+
+For PostgreSQL there are two SQL functions supplied named "unifold" and
+"unistrip". These functions function can be used to prepare index fields in
+order to be folded in a way where string-comparisons make more sense, e.g.
+where "bathtub" == "bath<soft hyphen>tub"
+or "Hello World" == "hello world".
+
+CREATE TABLE people (
+ id serial8 primary key,
+ name text,
+ CHECK (unifold(name) NOTNULL)
+);
+CREATE INDEX name_idx ON people (unifold(name));
+SELECT * FROM people WHERE unifold(name) = unifold('John Doe');
+
+The function "unistrip" removes character marks like accents or diaeresis,
+while "unifold" keeps then.
+
+NOTICE: The outputs of the function can change between releases, as
+ utf8proc does not follow a versioning stability policy. You have to
+ rebuild your database indicies, if you upgrade to a newer version
+ of utf8proc.
+
+
+*** TODO ***
+
+- detect stable code points and process segments independently in order to
+ save memory
+- do a quick check before normalizing strings to optimize speed
+- support stream processing
+
+
+*** CONTACT ***
+
+If you find any bugs or experience difficulties in compiling this software,
+please contact us:
+
+Project page: http://www.public-software-group.org/utf8proc
+
+
diff --git a/subversion/libsvn_subr/utf8proc/utf8proc.c b/subversion/libsvn_subr/utf8proc/utf8proc.c
new file mode 100644
index 0000000..2993c8f
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc/utf8proc.c
@@ -0,0 +1,611 @@
+/*
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This library contains derived data from a modified version of the
+ * Unicode data files.
+ *
+ * The original data files are available at
+ * http://www.unicode.org/Public/UNIDATA/
+ *
+ * Please notice the copyright statement in the file "utf8proc_data.c".
+ */
+
+
+/*
+ * File name: utf8proc.c
+ *
+ * Description:
+ * Implementation of libutf8proc.
+ */
+
+
+#include "utf8proc.h"
+#include "utf8proc_data.c"
+
+
+UTF8PROC_DATA
+const int8_t utf8proc_utf8class[256] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+#define UTF8PROC_HANGUL_SBASE 0xAC00
+#define UTF8PROC_HANGUL_LBASE 0x1100
+#define UTF8PROC_HANGUL_VBASE 0x1161
+#define UTF8PROC_HANGUL_TBASE 0x11A7
+#define UTF8PROC_HANGUL_LCOUNT 19
+#define UTF8PROC_HANGUL_VCOUNT 21
+#define UTF8PROC_HANGUL_TCOUNT 28
+#define UTF8PROC_HANGUL_NCOUNT 588
+#define UTF8PROC_HANGUL_SCOUNT 11172
+/* END is exclusive */
+#define UTF8PROC_HANGUL_L_START 0x1100
+#define UTF8PROC_HANGUL_L_END 0x115A
+#define UTF8PROC_HANGUL_L_FILLER 0x115F
+#define UTF8PROC_HANGUL_V_START 0x1160
+#define UTF8PROC_HANGUL_V_END 0x11A3
+#define UTF8PROC_HANGUL_T_START 0x11A8
+#define UTF8PROC_HANGUL_T_END 0x11FA
+#define UTF8PROC_HANGUL_S_START 0xAC00
+#define UTF8PROC_HANGUL_S_END 0xD7A4
+
+
+#define UTF8PROC_BOUNDCLASS_START 0
+#define UTF8PROC_BOUNDCLASS_OTHER 1
+#define UTF8PROC_BOUNDCLASS_CR 2
+#define UTF8PROC_BOUNDCLASS_LF 3
+#define UTF8PROC_BOUNDCLASS_CONTROL 4
+#define UTF8PROC_BOUNDCLASS_EXTEND 5
+#define UTF8PROC_BOUNDCLASS_L 6
+#define UTF8PROC_BOUNDCLASS_V 7
+#define UTF8PROC_BOUNDCLASS_T 8
+#define UTF8PROC_BOUNDCLASS_LV 9
+#define UTF8PROC_BOUNDCLASS_LVT 10
+
+
+UTF8PROC_API
+const char *utf8proc_version(void) {
+ return "1.1.5";
+}
+
+/*
+ * This macro tells translators that string X should be translated,
+ * but does not look up the translation at run time. This is standard
+ * GNU gettext notation for annotating compile-time constant strings.
+ */
+#ifndef N_
+#define N_(x) x
+#endif
+
+UTF8PROC_API
+const char *utf8proc_errmsg(ssize_t errcode) {
+ switch (errcode) {
+ case UTF8PROC_ERROR_NOMEM:
+ return N_("Memory for processing UTF-8 data could not be allocated.");
+ case UTF8PROC_ERROR_OVERFLOW:
+ return N_("UTF-8 string is too long to be processed.");
+ case UTF8PROC_ERROR_INVALIDUTF8:
+ return N_("Invalid UTF-8 string");
+ case UTF8PROC_ERROR_NOTASSIGNED:
+ return N_("Unassigned Unicode code point found in UTF-8 string.");
+ case UTF8PROC_ERROR_INVALIDOPTS:
+ return N_("Invalid options for UTF-8 processing chosen.");
+ default:
+ return N_("An unknown error occured while processing UTF-8 data.");
+ }
+}
+
+UTF8PROC_API
+ssize_t utf8proc_iterate(
+ const uint8_t *str, ssize_t strlen, int32_t *dst
+) {
+ int length;
+ int i;
+ int32_t uc = -1;
+ *dst = -1;
+ if (!strlen) return 0;
+ length = utf8proc_utf8class[str[0]];
+ if (!length) return UTF8PROC_ERROR_INVALIDUTF8;
+ if (strlen >= 0 && length > strlen) return UTF8PROC_ERROR_INVALIDUTF8;
+ for (i=1; i<length; i++) {
+ if ((str[i] & 0xC0) != 0x80) return UTF8PROC_ERROR_INVALIDUTF8;
+ }
+ switch (length) {
+ case 1:
+ uc = str[0];
+ break;
+ case 2:
+ uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F);
+ if (uc < 0x80) uc = -1;
+ break;
+ case 3:
+ uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6)
+ + (str[2] & 0x3F);
+ if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000) ||
+ (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1;
+ break;
+ case 4:
+ uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12)
+ + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F);
+ if (uc < 0x10000 || uc >= 0x110000) uc = -1;
+ break;
+ }
+ if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE))
+ return UTF8PROC_ERROR_INVALIDUTF8;
+ *dst = uc;
+ return length;
+}
+
+UTF8PROC_API
+bool utf8proc_codepoint_valid(int32_t uc) {
+ if (uc < 0 || uc >= 0x110000 ||
+ ((uc & 0xFFFF) >= 0xFFFE) || (uc >= 0xD800 && uc < 0xE000) ||
+ (uc >= 0xFDD0 && uc < 0xFDF0)) return false;
+ else return true;
+}
+
+UTF8PROC_API
+ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst) {
+ if (uc < 0x00) {
+ return 0;
+ } else if (uc < 0x80) {
+ dst[0] = (uint8_t)uc;
+ return 1;
+ } else if (uc < 0x800) {
+ dst[0] = 0xC0 + (uint8_t)(uc >> 6);
+ dst[1] = 0x80 + (uc & 0x3F);
+ return 2;
+ } else if (uc == 0xFFFF) {
+ dst[0] = 0xFF;
+ return 1;
+ } else if (uc == 0xFFFE) {
+ dst[0] = 0xFE;
+ return 1;
+ } else if (uc < 0x10000) {
+ dst[0] = 0xE0 + (uint8_t)(uc >> 12);
+ dst[1] = 0x80 + ((uc >> 6) & 0x3F);
+ dst[2] = 0x80 + (uc & 0x3F);
+ return 3;
+ } else if (uc < 0x110000) {
+ dst[0] = 0xF0 + (uint8_t)(uc >> 18);
+ dst[1] = 0x80 + ((uc >> 12) & 0x3F);
+ dst[2] = 0x80 + ((uc >> 6) & 0x3F);
+ dst[3] = 0x80 + (uc & 0x3F);
+ return 4;
+ } else return 0;
+}
+
+UTF8PROC_API
+const utf8proc_property_t *utf8proc_get_property(int32_t uc) {
+ /* ASSERT: uc >= 0 && uc < 0x110000 */
+ return utf8proc_properties + (
+ utf8proc_stage2table[
+ utf8proc_stage1table[uc >> 8] + (uc & 0xFF)
+ ]
+ );
+}
+
+#define utf8proc_decompose_lump(replacement_uc) \
+ return utf8proc_decompose_char((replacement_uc), dst, bufsize, \
+ options & ~UTF8PROC_LUMP, last_boundclass)
+
+UTF8PROC_API
+ssize_t utf8proc_decompose_char(int32_t uc, int32_t *dst, ssize_t bufsize,
+ int options, int *last_boundclass) {
+ /* ASSERT: uc >= 0 && uc < 0x110000 */
+ const utf8proc_property_t *property;
+ utf8proc_propval_t category;
+ int32_t hangul_sindex;
+ property = utf8proc_get_property(uc);
+ category = property->category;
+ hangul_sindex = uc - UTF8PROC_HANGUL_SBASE;
+ if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+ if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) {
+ int32_t hangul_tindex;
+ if (bufsize >= 1) {
+ dst[0] = UTF8PROC_HANGUL_LBASE +
+ hangul_sindex / UTF8PROC_HANGUL_NCOUNT;
+ if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE +
+ (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT;
+ }
+ hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT;
+ if (!hangul_tindex) return 2;
+ if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex;
+ return 3;
+ }
+ }
+ if (options & UTF8PROC_REJECTNA) {
+ if (!category) return UTF8PROC_ERROR_NOTASSIGNED;
+ }
+ if (options & UTF8PROC_IGNORE) {
+ if (property->ignorable) return 0;
+ }
+ if (options & UTF8PROC_LUMP) {
+ if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020);
+ if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8)
+ utf8proc_decompose_lump(0x0027);
+ if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212)
+ utf8proc_decompose_lump(0x002D);
+ if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F);
+ if (uc == 0x2236) utf8proc_decompose_lump(0x003A);
+ if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008)
+ utf8proc_decompose_lump(0x003C);
+ if (uc == 0x203A || uc == 0x232A || uc == 0x3009)
+ utf8proc_decompose_lump(0x003E);
+ if (uc == 0x2216) utf8proc_decompose_lump(0x005C);
+ if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303)
+ utf8proc_decompose_lump(0x005E);
+ if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD)
+ utf8proc_decompose_lump(0x005F);
+ if (uc == 0x02CB) utf8proc_decompose_lump(0x0060);
+ if (uc == 0x2223) utf8proc_decompose_lump(0x007C);
+ if (uc == 0x223C) utf8proc_decompose_lump(0x007E);
+ if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) {
+ if (category == UTF8PROC_CATEGORY_ZL ||
+ category == UTF8PROC_CATEGORY_ZP)
+ utf8proc_decompose_lump(0x000A);
+ }
+ }
+ if (options & UTF8PROC_STRIPMARK) {
+ if (category == UTF8PROC_CATEGORY_MN ||
+ category == UTF8PROC_CATEGORY_MC ||
+ category == UTF8PROC_CATEGORY_ME) return 0;
+ }
+ if (options & UTF8PROC_CASEFOLD) {
+ if (property->casefold_mapping) {
+ const int32_t *casefold_entry;
+ ssize_t written = 0;
+ for (casefold_entry = property->casefold_mapping;
+ *casefold_entry >= 0; casefold_entry++) {
+ written += utf8proc_decompose_char(*casefold_entry, dst+written,
+ (bufsize > written) ? (bufsize - written) : 0, options,
+ last_boundclass);
+ if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+ }
+ return written;
+ }
+ }
+ if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+ if (property->decomp_mapping &&
+ (!property->decomp_type || (options & UTF8PROC_COMPAT))) {
+ const int32_t *decomp_entry;
+ ssize_t written = 0;
+ for (decomp_entry = property->decomp_mapping;
+ *decomp_entry >= 0; decomp_entry++) {
+ written += utf8proc_decompose_char(*decomp_entry, dst+written,
+ (bufsize > written) ? (bufsize - written) : 0, options,
+ last_boundclass);
+ if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+ }
+ return written;
+ }
+ }
+ if (options & UTF8PROC_CHARBOUND) {
+ bool boundary;
+ int tbc, lbc;
+ tbc =
+ (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR :
+ (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF :
+ ((category == UTF8PROC_CATEGORY_ZL ||
+ category == UTF8PROC_CATEGORY_ZP ||
+ category == UTF8PROC_CATEGORY_CC ||
+ category == UTF8PROC_CATEGORY_CF) &&
+ !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL :
+ property->extend ? UTF8PROC_BOUNDCLASS_EXTEND :
+ ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) ||
+ uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L :
+ (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ?
+ UTF8PROC_BOUNDCLASS_V :
+ (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ?
+ UTF8PROC_BOUNDCLASS_T :
+ (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? (
+ ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ?
+ UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT
+ ) :
+ UTF8PROC_BOUNDCLASS_OTHER;
+ lbc = *last_boundclass;
+ boundary =
+ (tbc == UTF8PROC_BOUNDCLASS_EXTEND) ? false :
+ (lbc == UTF8PROC_BOUNDCLASS_START) ? true :
+ (lbc == UTF8PROC_BOUNDCLASS_CR &&
+ tbc == UTF8PROC_BOUNDCLASS_LF) ? false :
+ (lbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
+ (tbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
+ (lbc == UTF8PROC_BOUNDCLASS_L &&
+ (tbc == UTF8PROC_BOUNDCLASS_L ||
+ tbc == UTF8PROC_BOUNDCLASS_V ||
+ tbc == UTF8PROC_BOUNDCLASS_LV ||
+ tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false :
+ ((lbc == UTF8PROC_BOUNDCLASS_LV ||
+ lbc == UTF8PROC_BOUNDCLASS_V) &&
+ (tbc == UTF8PROC_BOUNDCLASS_V ||
+ tbc == UTF8PROC_BOUNDCLASS_T)) ? false :
+ ((lbc == UTF8PROC_BOUNDCLASS_LVT ||
+ lbc == UTF8PROC_BOUNDCLASS_T) &&
+ tbc == UTF8PROC_BOUNDCLASS_T) ? false :
+ true;
+ *last_boundclass = tbc;
+ if (boundary) {
+ if (bufsize >= 1) dst[0] = 0xFFFF;
+ if (bufsize >= 2) dst[1] = uc;
+ return 2;
+ }
+ }
+ if (bufsize >= 1) *dst = uc;
+ return 1;
+}
+
+UTF8PROC_API
+ssize_t utf8proc_decompose(
+ const uint8_t *str, ssize_t strlen,
+ int32_t *buffer, ssize_t bufsize, int options
+) {
+ /* strlen will be ignored, if UTF8PROC_NULLTERM is set in options */
+ ssize_t wpos = 0;
+ if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE))
+ return UTF8PROC_ERROR_INVALIDOPTS;
+ if ((options & UTF8PROC_STRIPMARK) &&
+ !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE))
+ return UTF8PROC_ERROR_INVALIDOPTS;
+ {
+ int32_t uc;
+ ssize_t rpos = 0;
+ ssize_t decomp_result;
+ int boundclass = UTF8PROC_BOUNDCLASS_START;
+ while (1) {
+ if (options & UTF8PROC_NULLTERM) {
+ rpos += utf8proc_iterate(str + rpos, -1, &uc);
+ /* checking of return value is not neccessary,
+ as 'uc' is < 0 in case of error */
+ if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+ if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW;
+ if (uc == 0) break;
+ } else {
+ if (rpos >= strlen) break;
+ rpos += utf8proc_iterate(str + rpos, strlen - rpos, &uc);
+ if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+ }
+ decomp_result = utf8proc_decompose_char(
+ uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options,
+ &boundclass
+ );
+ if (decomp_result < 0) return decomp_result;
+ wpos += decomp_result;
+ /* prohibiting integer overflows due to too long strings: */
+ if (wpos < 0 || wpos > SSIZE_MAX/sizeof(int32_t)/2)
+ return UTF8PROC_ERROR_OVERFLOW;
+ }
+ }
+ if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) {
+ ssize_t pos = 0;
+ while (pos < wpos-1) {
+ int32_t uc1, uc2;
+ const utf8proc_property_t *property1, *property2;
+ uc1 = buffer[pos];
+ uc2 = buffer[pos+1];
+ property1 = utf8proc_get_property(uc1);
+ property2 = utf8proc_get_property(uc2);
+ if (property1->combining_class > property2->combining_class &&
+ property2->combining_class > 0) {
+ buffer[pos] = uc2;
+ buffer[pos+1] = uc1;
+ if (pos > 0) pos--; else pos++;
+ } else {
+ pos++;
+ }
+ }
+ }
+ return wpos;
+}
+
+UTF8PROC_API
+ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options) {
+ /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored
+ ASSERT: 'buffer' has one spare byte of free space at the end! */
+ if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) {
+ ssize_t rpos;
+ ssize_t wpos = 0;
+ int32_t uc;
+ for (rpos = 0; rpos < length; rpos++) {
+ uc = buffer[rpos];
+ if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++;
+ if (uc == 0x000A || uc == 0x000D || uc == 0x0085 ||
+ ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) {
+ if (options & UTF8PROC_NLF2LS) {
+ if (options & UTF8PROC_NLF2PS) {
+ buffer[wpos++] = 0x000A;
+ } else {
+ buffer[wpos++] = 0x2028;
+ }
+ } else {
+ if (options & UTF8PROC_NLF2PS) {
+ buffer[wpos++] = 0x2029;
+ } else {
+ buffer[wpos++] = 0x0020;
+ }
+ }
+ } else if ((options & UTF8PROC_STRIPCC) &&
+ (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) {
+ if (uc == 0x0009) buffer[wpos++] = 0x0020;
+ } else {
+ buffer[wpos++] = uc;
+ }
+ }
+ length = wpos;
+ }
+ if (options & UTF8PROC_COMPOSE) {
+ int32_t *starter = NULL;
+ int32_t current_char;
+ const utf8proc_property_t *starter_property = NULL, *current_property;
+ utf8proc_propval_t max_combining_class = -1;
+ ssize_t rpos;
+ ssize_t wpos = 0;
+ int32_t composition;
+ for (rpos = 0; rpos < length; rpos++) {
+ current_char = buffer[rpos];
+ current_property = utf8proc_get_property(current_char);
+ if (starter && current_property->combining_class > max_combining_class) {
+ /* combination perhaps possible */
+ int32_t hangul_lindex;
+ int32_t hangul_sindex;
+ hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE;
+ if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) {
+ int32_t hangul_vindex;
+ hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE;
+ if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) {
+ *starter = UTF8PROC_HANGUL_SBASE +
+ (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) *
+ UTF8PROC_HANGUL_TCOUNT;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE;
+ if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT &&
+ (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) {
+ int32_t hangul_tindex;
+ hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE;
+ if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) {
+ *starter += hangul_tindex;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ if (!starter_property) {
+ starter_property = utf8proc_get_property(*starter);
+ }
+ if (starter_property->comb1st_index >= 0 &&
+ current_property->comb2nd_index >= 0) {
+ composition = utf8proc_combinations[
+ starter_property->comb1st_index +
+ current_property->comb2nd_index
+ ];
+ if (composition >= 0 && (!(options & UTF8PROC_STABLE) ||
+ !(utf8proc_get_property(composition)->comp_exclusion))) {
+ *starter = composition;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ }
+ buffer[wpos] = current_char;
+ if (current_property->combining_class) {
+ if (current_property->combining_class > max_combining_class) {
+ max_combining_class = current_property->combining_class;
+ }
+ } else {
+ starter = buffer + wpos;
+ starter_property = NULL;
+ max_combining_class = -1;
+ }
+ wpos++;
+ }
+ length = wpos;
+ }
+ {
+ ssize_t rpos, wpos = 0;
+ int32_t uc;
+ for (rpos = 0; rpos < length; rpos++) {
+ uc = buffer[rpos];
+ wpos += utf8proc_encode_char(uc, ((uint8_t *)buffer) + wpos);
+ }
+ ((uint8_t *)buffer)[wpos] = 0;
+ return wpos;
+ }
+}
+
+UTF8PROC_API
+ssize_t utf8proc_map(
+ const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options
+) {
+ int32_t *buffer;
+ ssize_t result;
+ *dstptr = NULL;
+ result = utf8proc_decompose(str, strlen, NULL, 0, options);
+ if (result < 0) return result;
+ buffer = malloc(result * sizeof(int32_t) + 1);
+ if (!buffer) return UTF8PROC_ERROR_NOMEM;
+ result = utf8proc_decompose(str, strlen, buffer, result, options);
+ if (result < 0) {
+ free(buffer);
+ return result;
+ }
+ result = utf8proc_reencode(buffer, result, options);
+ if (result < 0) {
+ free(buffer);
+ return result;
+ }
+ {
+ int32_t *newptr;
+ newptr = realloc(buffer, (size_t)result+1);
+ if (newptr) buffer = newptr;
+ }
+ *dstptr = (uint8_t *)buffer;
+ return result;
+}
+
+UTF8PROC_API
+uint8_t *utf8proc_NFD(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_DECOMPOSE);
+ return retval;
+}
+
+UTF8PROC_API
+uint8_t *utf8proc_NFC(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_COMPOSE);
+ return retval;
+}
+
+UTF8PROC_API
+uint8_t *utf8proc_NFKD(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT);
+ return retval;
+}
+
+UTF8PROC_API
+uint8_t *utf8proc_NFKC(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_COMPOSE | UTF8PROC_COMPAT);
+ return retval;
+}
+
diff --git a/subversion/libsvn_subr/utf8proc/utf8proc.h b/subversion/libsvn_subr/utf8proc/utf8proc.h
new file mode 100644
index 0000000..25ca139
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc/utf8proc.h
@@ -0,0 +1,447 @@
+/*
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ * File name: utf8proc.h
+ *
+ * Description:
+ * Header files for libutf8proc, which is a mapping tool for UTF-8 strings
+ * with following features:
+ * - decomposing and composing of strings
+ * - replacing compatibility characters with their equivalents
+ * - stripping of "default ignorable characters"
+ * like SOFT-HYPHEN or ZERO-WIDTH-SPACE
+ * - folding of certain characters for string comparison
+ * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-")
+ * (see "LUMP" option)
+ * - optional rejection of strings containing non-assigned code points
+ * - stripping of control characters
+ * - stripping of character marks (accents, etc.)
+ * - transformation of LF, CRLF, CR and NEL to line-feed (LF)
+ * or to the unicode chararacters for paragraph separation (PS)
+ * or line separation (LS).
+ * - unicode case folding (for case insensitive string comparisons)
+ * - rejection of illegal UTF-8 data
+ * (i.e. UTF-8 encoded UTF-16 surrogates)
+ * - support for korean hangul characters
+ * Unicode Version 5.0.0 is supported.
+ */
+
+
+#ifndef UTF8PROC_H
+#define UTF8PROC_H
+
+/** @name API version
+ *
+ * The utf8proc API version MAJOR.MINOR.PATCH, following
+ * semantic-versioning rules (http://semver.org) based on API
+ * compatibility.
+ *
+ * This is also returned at runtime by @ref utf8proc_version; however, the
+ * runtime version may append a string like "-dev" to the version number
+ * for prerelease versions.
+ *
+ * @note The shared-library version number in the Makefile may be different,
+ * being based on ABI compatibility rather than API compatibility.
+ */
+/** @{ */
+/** The MAJOR version number (increased when backwards API compatibility is broken). */
+#define UTF8PROC_VERSION_MAJOR 1
+/** The MINOR version number (increased when new functionality is added in a backwards-compatible manner). */
+#define UTF8PROC_VERSION_MINOR 1
+/** The PATCH version (increased for fixes that do not change the API). */
+#define UTF8PROC_VERSION_PATCH 5
+/** @} */
+
+/*
+ * Define UTF8PROC_INLINE and include utf8proc.c to embed a static
+ * version of utf8proc in your program or library without exporting
+ * any of its symbols.
+ */
+#ifdef UTF8PROC_INLINE
+#define UTF8PROC_API static
+#undef UTF8PROC_DATA_EXPORT
+#define UTF8PROC_DATA static
+#else
+#define UTF8PROC_API
+#define UTF8PROC_DATA_EXPORT
+#define UTF8PROC_DATA
+#endif
+
+
+#include <stdlib.h>
+#include <sys/types.h>
+#ifdef _MSC_VER
+# if _MSC_VER >= 1900
+# include <stdbool.h>
+# include <stdint.h>
+# else
+ typedef signed char int8_t;
+ typedef unsigned char uint8_t;
+ typedef short int16_t;
+ typedef unsigned short uint16_t;
+ typedef int int32_t;
+ typedef unsigned char bool;
+ enum {false, true};
+# endif
+# ifdef _WIN64
+# define ssize_t __int64
+# else
+# define ssize_t int
+# endif
+#elif defined(HAVE_STDBOOL_H) && defined(HAVE_INTTYPES_H)
+#include <stdbool.h>
+#include <inttypes.h>
+#else
+#include <apr.h>
+typedef uint8_t bool;
+enum {false, true};
+#endif
+#include <limits.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SSIZE_MAX
+#define SSIZE_MAX ((size_t)SIZE_MAX/2)
+#endif
+
+#define UTF8PROC_NULLTERM (1<<0)
+#define UTF8PROC_STABLE (1<<1)
+#define UTF8PROC_COMPAT (1<<2)
+#define UTF8PROC_COMPOSE (1<<3)
+#define UTF8PROC_DECOMPOSE (1<<4)
+#define UTF8PROC_IGNORE (1<<5)
+#define UTF8PROC_REJECTNA (1<<6)
+#define UTF8PROC_NLF2LS (1<<7)
+#define UTF8PROC_NLF2PS (1<<8)
+#define UTF8PROC_NLF2LF (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS)
+#define UTF8PROC_STRIPCC (1<<9)
+#define UTF8PROC_CASEFOLD (1<<10)
+#define UTF8PROC_CHARBOUND (1<<11)
+#define UTF8PROC_LUMP (1<<12)
+#define UTF8PROC_STRIPMARK (1<<13)
+/*
+ * Flags being regarded by several functions in the library:
+ * NULLTERM: The given UTF-8 input is NULL terminated.
+ * STABLE: Unicode Versioning Stability has to be respected.
+ * COMPAT: Compatiblity decomposition
+ * (i.e. formatting information is lost)
+ * COMPOSE: Return a result with composed characters.
+ * DECOMPOSE: Return a result with decomposed characters.
+ * IGNORE: Strip "default ignorable characters"
+ * REJECTNA: Return an error, if the input contains unassigned
+ * code points.
+ * NLF2LS: Indicating that NLF-sequences (LF, CRLF, CR, NEL) are
+ * representing a line break, and should be converted to the
+ * unicode character for line separation (LS).
+ * NLF2PS: Indicating that NLF-sequences are representing a paragraph
+ * break, and should be converted to the unicode character for
+ * paragraph separation (PS).
+ * NLF2LF: Indicating that the meaning of NLF-sequences is unknown.
+ * STRIPCC: Strips and/or convers control characters.
+ * NLF-sequences are transformed into space, except if one of
+ * the NLF2LS/PS/LF options is given.
+ * HorizontalTab (HT) and FormFeed (FF) are treated as a
+ * NLF-sequence in this case.
+ * All other control characters are simply removed.
+ * CASEFOLD: Performs unicode case folding, to be able to do a
+ * case-insensitive string comparison.
+ * CHARBOUND: Inserts 0xFF bytes at the beginning of each sequence which
+ * is representing a single grapheme cluster (see UAX#29).
+ * LUMP: Lumps certain characters together
+ * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-").
+ * (See lump.txt for details.)
+ * If NLF2LF is set, this includes a transformation of
+ * paragraph and line separators to ASCII line-feed (LF).
+ * STRIPMARK: Strips all character markings
+ * (non-spacing, spacing and enclosing) (i.e. accents)
+ * NOTE: this option works only with COMPOSE or DECOMPOSE
+ */
+
+#define UTF8PROC_ERROR_NOMEM -1
+#define UTF8PROC_ERROR_OVERFLOW -2
+#define UTF8PROC_ERROR_INVALIDUTF8 -3
+#define UTF8PROC_ERROR_NOTASSIGNED -4
+#define UTF8PROC_ERROR_INVALIDOPTS -5
+/*
+ * Error codes being returned by almost all functions:
+ * ERROR_NOMEM: Memory could not be allocated.
+ * ERROR_OVERFLOW: The given string is too long to be processed.
+ * ERROR_INVALIDUTF8: The given string is not a legal UTF-8 string.
+ * ERROR_NOTASSIGNED: The REJECTNA flag was set,
+ * and an unassigned code point was found.
+ * ERROR_INVALIDOPTS: Invalid options have been used.
+ */
+
+typedef int16_t utf8proc_propval_t;
+typedef struct utf8proc_property_struct {
+ utf8proc_propval_t category;
+ utf8proc_propval_t combining_class;
+ utf8proc_propval_t bidi_class;
+ utf8proc_propval_t decomp_type;
+ const int32_t *decomp_mapping;
+ unsigned bidi_mirrored:1;
+ int32_t uppercase_mapping;
+ int32_t lowercase_mapping;
+ int32_t titlecase_mapping;
+ int32_t comb1st_index;
+ int32_t comb2nd_index;
+ unsigned comp_exclusion:1;
+ unsigned ignorable:1;
+ unsigned control_boundary:1;
+ unsigned extend:1;
+ const int32_t *casefold_mapping;
+} utf8proc_property_t;
+
+#define UTF8PROC_CATEGORY_LU 1
+#define UTF8PROC_CATEGORY_LL 2
+#define UTF8PROC_CATEGORY_LT 3
+#define UTF8PROC_CATEGORY_LM 4
+#define UTF8PROC_CATEGORY_LO 5
+#define UTF8PROC_CATEGORY_MN 6
+#define UTF8PROC_CATEGORY_MC 7
+#define UTF8PROC_CATEGORY_ME 8
+#define UTF8PROC_CATEGORY_ND 9
+#define UTF8PROC_CATEGORY_NL 10
+#define UTF8PROC_CATEGORY_NO 11
+#define UTF8PROC_CATEGORY_PC 12
+#define UTF8PROC_CATEGORY_PD 13
+#define UTF8PROC_CATEGORY_PS 14
+#define UTF8PROC_CATEGORY_PE 15
+#define UTF8PROC_CATEGORY_PI 16
+#define UTF8PROC_CATEGORY_PF 17
+#define UTF8PROC_CATEGORY_PO 18
+#define UTF8PROC_CATEGORY_SM 19
+#define UTF8PROC_CATEGORY_SC 20
+#define UTF8PROC_CATEGORY_SK 21
+#define UTF8PROC_CATEGORY_SO 22
+#define UTF8PROC_CATEGORY_ZS 23
+#define UTF8PROC_CATEGORY_ZL 24
+#define UTF8PROC_CATEGORY_ZP 25
+#define UTF8PROC_CATEGORY_CC 26
+#define UTF8PROC_CATEGORY_CF 27
+#define UTF8PROC_CATEGORY_CS 28
+#define UTF8PROC_CATEGORY_CO 29
+#define UTF8PROC_CATEGORY_CN 30
+#define UTF8PROC_BIDI_CLASS_L 1
+#define UTF8PROC_BIDI_CLASS_LRE 2
+#define UTF8PROC_BIDI_CLASS_LRO 3
+#define UTF8PROC_BIDI_CLASS_R 4
+#define UTF8PROC_BIDI_CLASS_AL 5
+#define UTF8PROC_BIDI_CLASS_RLE 6
+#define UTF8PROC_BIDI_CLASS_RLO 7
+#define UTF8PROC_BIDI_CLASS_PDF 8
+#define UTF8PROC_BIDI_CLASS_EN 9
+#define UTF8PROC_BIDI_CLASS_ES 10
+#define UTF8PROC_BIDI_CLASS_ET 11
+#define UTF8PROC_BIDI_CLASS_AN 12
+#define UTF8PROC_BIDI_CLASS_CS 13
+#define UTF8PROC_BIDI_CLASS_NSM 14
+#define UTF8PROC_BIDI_CLASS_BN 15
+#define UTF8PROC_BIDI_CLASS_B 16
+#define UTF8PROC_BIDI_CLASS_S 17
+#define UTF8PROC_BIDI_CLASS_WS 18
+#define UTF8PROC_BIDI_CLASS_ON 19
+#define UTF8PROC_DECOMP_TYPE_FONT 1
+#define UTF8PROC_DECOMP_TYPE_NOBREAK 2
+#define UTF8PROC_DECOMP_TYPE_INITIAL 3
+#define UTF8PROC_DECOMP_TYPE_MEDIAL 4
+#define UTF8PROC_DECOMP_TYPE_FINAL 5
+#define UTF8PROC_DECOMP_TYPE_ISOLATED 6
+#define UTF8PROC_DECOMP_TYPE_CIRCLE 7
+#define UTF8PROC_DECOMP_TYPE_SUPER 8
+#define UTF8PROC_DECOMP_TYPE_SUB 9
+#define UTF8PROC_DECOMP_TYPE_VERTICAL 10
+#define UTF8PROC_DECOMP_TYPE_WIDE 11
+#define UTF8PROC_DECOMP_TYPE_NARROW 12
+#define UTF8PROC_DECOMP_TYPE_SMALL 13
+#define UTF8PROC_DECOMP_TYPE_SQUARE 14
+#define UTF8PROC_DECOMP_TYPE_FRACTION 15
+#define UTF8PROC_DECOMP_TYPE_COMPAT 16
+
+#ifdef UTF8PROC_DATA_EXPORT
+extern const int8_t utf8proc_utf8class[256];
+#endif
+
+UTF8PROC_API
+const char *utf8proc_version(void);
+
+UTF8PROC_API
+const char *utf8proc_errmsg(ssize_t errcode);
+/*
+ * Returns a static error string for the given error code.
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_iterate(const uint8_t *str, ssize_t strlen, int32_t *dst);
+/*
+ * Reads a single char from the UTF-8 sequence being pointed to by 'str'.
+ * The maximum number of bytes read is 'strlen', unless 'strlen' is
+ * negative.
+ * If a valid unicode char could be read, it is stored in the variable
+ * being pointed to by 'dst', otherwise that variable will be set to -1.
+ * In case of success the number of bytes read is returned, otherwise a
+ * negative error code is returned.
+ */
+
+UTF8PROC_API
+bool utf8proc_codepoint_valid(int32_t uc);
+/*
+ * Returns 1, if the given unicode code-point is valid, otherwise 0.
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst);
+/*
+ * Encodes the unicode char with the code point 'uc' as an UTF-8 string in
+ * the byte array being pointed to by 'dst'. This array has to be at least
+ * 4 bytes long.
+ * In case of success the number of bytes written is returned,
+ * otherwise 0.
+ * This function does not check if 'uc' is a valid unicode code point.
+ */
+
+UTF8PROC_API
+const utf8proc_property_t *utf8proc_get_property(int32_t uc);
+/*
+ * Returns a pointer to a (constant) struct containing information about
+ * the unicode char with the given code point 'uc'.
+ * If the character is not existent a pointer to a special struct is
+ * returned, where 'category' is a NULL pointer.
+ * WARNING: The parameter 'uc' has to be in the range of 0x0000 to
+ * 0x10FFFF, otherwise the program might crash!
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_decompose_char(
+ int32_t uc, int32_t *dst, ssize_t bufsize,
+ int options, int *last_boundclass
+);
+/*
+ * Writes a decomposition of the unicode char 'uc' into the array being
+ * pointed to by 'dst'.
+ * Following flags in the 'options' field are regarded:
+ * REJECTNA: an unassigned unicode code point leads to an error
+ * IGNORE: "default ignorable" chars are stripped
+ * CASEFOLD: unicode casefolding is applied
+ * COMPAT: replace certain characters with their
+ * compatibility decomposition
+ * CHARBOUND: Inserts 0xFF bytes before each grapheme cluster
+ * LUMP: lumps certain different characters together
+ * STRIPMARK: removes all character marks
+ * The pointer 'last_boundclass' has to point to an integer variable which
+ * is storing the last character boundary class, if the CHARBOUND option
+ * is used.
+ * In case of success the number of chars written is returned,
+ * in case of an error, a negative error code is returned.
+ * If the number of written chars would be bigger than 'bufsize',
+ * the buffer (up to 'bufsize') has inpredictable data, and the needed
+ * buffer size is returned.
+ * WARNING: The parameter 'uc' has to be in the range of 0x0000 to
+ * 0x10FFFF, otherwise the program might crash!
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_decompose(
+ const uint8_t *str, ssize_t strlen,
+ int32_t *buffer, ssize_t bufsize, int options
+);
+/*
+ * Does the same as 'utf8proc_decompose_char', but acts on a whole UTF-8
+ * string, and orders the decomposed sequences correctly.
+ * If the NULLTERM flag in 'options' is set, processing will be stopped,
+ * when a NULL byte is encounted, otherwise 'strlen' bytes are processed.
+ * The result in form of unicode code points is written into the buffer
+ * being pointed to by 'buffer', having the length of 'bufsize' entries.
+ * In case of success the number of chars written is returned,
+ * in case of an error, a negative error code is returned.
+ * If the number of written chars would be bigger than 'bufsize',
+ * the buffer (up to 'bufsize') has inpredictable data, and the needed
+ * buffer size is returned.
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options);
+/*
+ * Reencodes the sequence of unicode characters given by the pointer
+ * 'buffer' and 'length' as UTF-8.
+ * The result is stored in the same memory area where the data is read.
+ * Following flags in the 'options' field are regarded:
+ * NLF2LS: converts LF, CRLF, CR and NEL into LS
+ * NLF2PS: converts LF, CRLF, CR and NEL into PS
+ * NLF2LF: converts LF, CRLF, CR and NEL into LF
+ * STRIPCC: strips or converts all non-affected control characters
+ * COMPOSE: tries to combine decomposed characters into composite
+ * characters
+ * STABLE: prohibits combining characters which would violate
+ * the unicode versioning stability
+ * In case of success the length of the resulting UTF-8 string is
+ * returned, otherwise a negative error code is returned.
+ * WARNING: The amount of free space being pointed to by 'buffer', has to
+ * exceed the amount of the input data by one byte, and the
+ * entries of the array pointed to by 'str' have to be in the
+ * range of 0x0000 to 0x10FFFF, otherwise the program might
+ * crash!
+ */
+
+UTF8PROC_API
+ssize_t utf8proc_map(
+ const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options
+);
+/*
+ * Maps the given UTF-8 string being pointed to by 'str' to a new UTF-8
+ * string, which is allocated dynamically, and afterwards pointed to by
+ * the pointer being pointed to by 'dstptr'.
+ * If the NULLTERM flag in the 'options' field is set, the length is
+ * determined by a NULL terminator, otherwise the parameter 'strlen' is
+ * evaluated to determine the string length, but in any case the result
+ * will be NULL terminated (though it might contain NULL characters
+ * before). Other flags in the 'options' field are passed to the functions
+ * defined above, and regarded as described.
+ * In case of success the length of the new string is returned,
+ * otherwise a negative error code is returned.
+ * NOTICE: The memory of the new UTF-8 string will have been allocated with
+ * 'malloc', and has theirfore to be freed with 'free'.
+ */
+
+UTF8PROC_API
+uint8_t *utf8proc_NFD(const uint8_t *str);
+UTF8PROC_API
+uint8_t *utf8proc_NFC(const uint8_t *str);
+UTF8PROC_API
+uint8_t *utf8proc_NFKD(const uint8_t *str);
+UTF8PROC_API
+uint8_t *utf8proc_NFKC(const uint8_t *str);
+/*
+ * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC
+ * normalized version of the null-terminated string 'str'.
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/subversion/libsvn_subr/utf8proc/utf8proc_data.c b/subversion/libsvn_subr/utf8proc/utf8proc_data.c
new file mode 100644
index 0000000..55ebb53
--- /dev/null
+++ b/subversion/libsvn_subr/utf8proc/utf8proc_data.c
@@ -0,0 +1,13388 @@
+/*
+ * This file contains derived data from a modified version of the
+ * Unicode data files.
+ *
+ * The original data files are available at
+ * http://www.unicode.org/Public/UNIDATA/
+ *
+ *
+ * COPYRIGHT AND PERMISSION NOTICE
+ *
+ * Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed
+ * under the Terms of Use in http://www.unicode.org/copyright.html.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of the Unicode data files and any associated documentation (the "Data
+ * Files") or Unicode software and any associated documentation (the
+ * "Software") to deal in the Data Files or Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, and/or sell copies of the Data Files or Software, and
+ * to permit persons to whom the Data Files or Software are furnished to do
+ * so, provided that (a) the above copyright notice(s) and this permission
+ * notice appear with all copies of the Data Files or Software, (b) both the
+ * above copyright notice(s) and this permission notice appear in associated
+ * documentation, and (c) there is clear notice in each modified Data File or
+ * in the Software as well as in the documentation associated with the Data
+ * File(s) or Software that the data or software has been modified.
+ *
+ * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+ * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
+ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in these Data Files or Software without prior written
+ * authorization of the copyright holder.
+ */
+
+
+UTF8PROC_DATA
+const int32_t utf8proc_sequences[] = {
+ 97, -1, 98, -1, 99, -1, 100,
+ -1, 101, -1, 102, -1, 103, -1, 104,
+ -1, 105, -1, 106, -1, 107, -1, 108,
+ -1, 109, -1, 110, -1, 111, -1, 112,
+ -1, 113, -1, 114, -1, 115, -1, 116,
+ -1, 117, -1, 118, -1, 119, -1, 120,
+ -1, 121, -1, 122, -1, 32, -1, 32,
+ 776, -1, 32, 772, -1, 50, -1, 51,
+ -1, 32, 769, -1, 956, -1, 32, 807,
+ -1, 49, -1, 49, 8260, 52, -1, 49,
+ 8260, 50, -1, 51, 8260, 52, -1, 65,
+ 768, -1, 224, -1, 65, 769, -1, 225,
+ -1, 65, 770, -1, 226, -1, 65, 771,
+ -1, 227, -1, 65, 776, -1, 228, -1,
+ 65, 778, -1, 229, -1, 230, -1, 67,
+ 807, -1, 231, -1, 69, 768, -1, 232,
+ -1, 69, 769, -1, 233, -1, 69, 770,
+ -1, 234, -1, 69, 776, -1, 235, -1,
+ 73, 768, -1, 236, -1, 73, 769, -1,
+ 237, -1, 73, 770, -1, 238, -1, 73,
+ 776, -1, 239, -1, 240, -1, 78, 771,
+ -1, 241, -1, 79, 768, -1, 242, -1,
+ 79, 769, -1, 243, -1, 79, 770, -1,
+ 244, -1, 79, 771, -1, 245, -1, 79,
+ 776, -1, 246, -1, 248, -1, 85, 768,
+ -1, 249, -1, 85, 769, -1, 250, -1,
+ 85, 770, -1, 251, -1, 85, 776, -1,
+ 252, -1, 89, 769, -1, 253, -1, 254,
+ -1, 115, 115, -1, 97, 768, -1, 97,
+ 769, -1, 97, 770, -1, 97, 771, -1,
+ 97, 776, -1, 97, 778, -1, 99, 807,
+ -1, 101, 768, -1, 101, 769, -1, 101,
+ 770, -1, 101, 776, -1, 105, 768, -1,
+ 105, 769, -1, 105, 770, -1, 105, 776,
+ -1, 110, 771, -1, 111, 768, -1, 111,
+ 769, -1, 111, 770, -1, 111, 771, -1,
+ 111, 776, -1, 117, 768, -1, 117, 769,
+ -1, 117, 770, -1, 117, 776, -1, 121,
+ 769, -1, 121, 776, -1, 65, 772, -1,
+ 257, -1, 97, 772, -1, 65, 774, -1,
+ 259, -1, 97, 774, -1, 65, 808, -1,
+ 261, -1, 97, 808, -1, 67, 769, -1,
+ 263, -1, 99, 769, -1, 67, 770, -1,
+ 265, -1, 99, 770, -1, 67, 775, -1,
+ 267, -1, 99, 775, -1, 67, 780, -1,
+ 269, -1, 99, 780, -1, 68, 780, -1,
+ 271, -1, 100, 780, -1, 273, -1, 69,
+ 772, -1, 275, -1, 101, 772, -1, 69,
+ 774, -1, 277, -1, 101, 774, -1, 69,
+ 775, -1, 279, -1, 101, 775, -1, 69,
+ 808, -1, 281, -1, 101, 808, -1, 69,
+ 780, -1, 283, -1, 101, 780, -1, 71,
+ 770, -1, 285, -1, 103, 770, -1, 71,
+ 774, -1, 287, -1, 103, 774, -1, 71,
+ 775, -1, 289, -1, 103, 775, -1, 71,
+ 807, -1, 291, -1, 103, 807, -1, 72,
+ 770, -1, 293, -1, 104, 770, -1, 295,
+ -1, 73, 771, -1, 297, -1, 105, 771,
+ -1, 73, 772, -1, 299, -1, 105, 772,
+ -1, 73, 774, -1, 301, -1, 105, 774,
+ -1, 73, 808, -1, 303, -1, 105, 808,
+ -1, 73, 775, -1, 105, 775, -1, 73,
+ 74, -1, 307, -1, 105, 106, -1, 74,
+ 770, -1, 309, -1, 106, 770, -1, 75,
+ 807, -1, 311, -1, 107, 807, -1, 76,
+ 769, -1, 314, -1, 108, 769, -1, 76,
+ 807, -1, 316, -1, 108, 807, -1, 76,
+ 780, -1, 318, -1, 108, 780, -1, 76,
+ 183, -1, 320, -1, 108, 183, -1, 322,
+ -1, 78, 769, -1, 324, -1, 110, 769,
+ -1, 78, 807, -1, 326, -1, 110, 807,
+ -1, 78, 780, -1, 328, -1, 110, 780,
+ -1, 700, 110, -1, 331, -1, 79, 772,
+ -1, 333, -1, 111, 772, -1, 79, 774,
+ -1, 335, -1, 111, 774, -1, 79, 779,
+ -1, 337, -1, 111, 779, -1, 339, -1,
+ 82, 769, -1, 341, -1, 114, 769, -1,
+ 82, 807, -1, 343, -1, 114, 807, -1,
+ 82, 780, -1, 345, -1, 114, 780, -1,
+ 83, 769, -1, 347, -1, 115, 769, -1,
+ 83, 770, -1, 349, -1, 115, 770, -1,
+ 83, 807, -1, 351, -1, 115, 807, -1,
+ 83, 780, -1, 353, -1, 115, 780, -1,
+ 84, 807, -1, 355, -1, 116, 807, -1,
+ 84, 780, -1, 357, -1, 116, 780, -1,
+ 359, -1, 85, 771, -1, 361, -1, 117,
+ 771, -1, 85, 772, -1, 363, -1, 117,
+ 772, -1, 85, 774, -1, 365, -1, 117,
+ 774, -1, 85, 778, -1, 367, -1, 117,
+ 778, -1, 85, 779, -1, 369, -1, 117,
+ 779, -1, 85, 808, -1, 371, -1, 117,
+ 808, -1, 87, 770, -1, 373, -1, 119,
+ 770, -1, 89, 770, -1, 375, -1, 121,
+ 770, -1, 89, 776, -1, 255, -1, 90,
+ 769, -1, 378, -1, 122, 769, -1, 90,
+ 775, -1, 380, -1, 122, 775, -1, 90,
+ 780, -1, 382, -1, 122, 780, -1, 595,
+ -1, 387, -1, 389, -1, 596, -1, 392,
+ -1, 598, -1, 599, -1, 396, -1, 477,
+ -1, 601, -1, 603, -1, 402, -1, 608,
+ -1, 611, -1, 617, -1, 616, -1, 409,
+ -1, 623, -1, 626, -1, 629, -1, 79,
+ 795, -1, 417, -1, 111, 795, -1, 419,
+ -1, 421, -1, 640, -1, 424, -1, 643,
+ -1, 429, -1, 648, -1, 85, 795, -1,
+ 432, -1, 117, 795, -1, 650, -1, 651,
+ -1, 436, -1, 438, -1, 658, -1, 441,
+ -1, 445, -1, 68, 381, -1, 454, -1,
+ 68, 382, -1, 100, 382, -1, 76, 74,
+ -1, 457, -1, 76, 106, -1, 108, 106,
+ -1, 78, 74, -1, 460, -1, 78, 106,
+ -1, 110, 106, -1, 65, 780, -1, 462,
+ -1, 97, 780, -1, 73, 780, -1, 464,
+ -1, 105, 780, -1, 79, 780, -1, 466,
+ -1, 111, 780, -1, 85, 780, -1, 468,
+ -1, 117, 780, -1, 220, 772, -1, 470,
+ -1, 252, 772, -1, 220, 769, -1, 472,
+ -1, 252, 769, -1, 220, 780, -1, 474,
+ -1, 252, 780, -1, 220, 768, -1, 476,
+ -1, 252, 768, -1, 196, 772, -1, 479,
+ -1, 228, 772, -1, 550, 772, -1, 481,
+ -1, 551, 772, -1, 198, 772, -1, 483,
+ -1, 230, 772, -1, 485, -1, 71, 780,
+ -1, 487, -1, 103, 780, -1, 75, 780,
+ -1, 489, -1, 107, 780, -1, 79, 808,
+ -1, 491, -1, 111, 808, -1, 490, 772,
+ -1, 493, -1, 491, 772, -1, 439, 780,
+ -1, 495, -1, 658, 780, -1, 106, 780,
+ -1, 68, 90, -1, 499, -1, 68, 122,
+ -1, 100, 122, -1, 71, 769, -1, 501,
+ -1, 103, 769, -1, 405, -1, 447, -1,
+ 78, 768, -1, 505, -1, 110, 768, -1,
+ 197, 769, -1, 507, -1, 229, 769, -1,
+ 198, 769, -1, 509, -1, 230, 769, -1,
+ 216, 769, -1, 511, -1, 248, 769, -1,
+ 65, 783, -1, 513, -1, 97, 783, -1,
+ 65, 785, -1, 515, -1, 97, 785, -1,
+ 69, 783, -1, 517, -1, 101, 783, -1,
+ 69, 785, -1, 519, -1, 101, 785, -1,
+ 73, 783, -1, 521, -1, 105, 783, -1,
+ 73, 785, -1, 523, -1, 105, 785, -1,
+ 79, 783, -1, 525, -1, 111, 783, -1,
+ 79, 785, -1, 527, -1, 111, 785, -1,
+ 82, 783, -1, 529, -1, 114, 783, -1,
+ 82, 785, -1, 531, -1, 114, 785, -1,
+ 85, 783, -1, 533, -1, 117, 783, -1,
+ 85, 785, -1, 535, -1, 117, 785, -1,
+ 83, 806, -1, 537, -1, 115, 806, -1,
+ 84, 806, -1, 539, -1, 116, 806, -1,
+ 541, -1, 72, 780, -1, 543, -1, 104,
+ 780, -1, 414, -1, 547, -1, 549, -1,
+ 65, 775, -1, 551, -1, 97, 775, -1,
+ 69, 807, -1, 553, -1, 101, 807, -1,
+ 214, 772, -1, 555, -1, 246, 772, -1,
+ 213, 772, -1, 557, -1, 245, 772, -1,
+ 79, 775, -1, 559, -1, 111, 775, -1,
+ 558, 772, -1, 561, -1, 559, 772, -1,
+ 89, 772, -1, 563, -1, 121, 772, -1,
+ 11365, -1, 572, -1, 410, -1, 11366, -1,
+ 578, -1, 384, -1, 649, -1, 652, -1,
+ 583, -1, 585, -1, 587, -1, 589, -1,
+ 591, -1, 614, -1, 633, -1, 635, -1,
+ 641, -1, 32, 774, -1, 32, 775, -1,
+ 32, 778, -1, 32, 808, -1, 32, 771,
+ -1, 32, 779, -1, 661, -1, 768, -1,
+ 769, -1, 787, -1, 776, 769, -1, 953,
+ -1, 697, -1, 32, 837, -1, 59, -1,
+ 168, 769, -1, 913, 769, -1, 940, -1,
+ 183, -1, 917, 769, -1, 941, -1, 919,
+ 769, -1, 942, -1, 921, 769, -1, 943,
+ -1, 927, 769, -1, 972, -1, 933, 769,
+ -1, 973, -1, 937, 769, -1, 974, -1,
+ 970, 769, -1, 953, 776, 769, -1, 945,
+ -1, 946, -1, 947, -1, 948, -1, 949,
+ -1, 950, -1, 951, -1, 952, -1, 954,
+ -1, 955, -1, 957, -1, 958, -1, 959,
+ -1, 960, -1, 961, -1, 963, -1, 964,
+ -1, 965, -1, 966, -1, 967, -1, 968,
+ -1, 969, -1, 921, 776, -1, 970, -1,
+ 933, 776, -1, 971, -1, 945, 769, -1,
+ 949, 769, -1, 951, 769, -1, 953, 769,
+ -1, 971, 769, -1, 965, 776, 769, -1,
+ 953, 776, -1, 965, 776, -1, 959, 769,
+ -1, 965, 769, -1, 969, 769, -1, 933,
+ -1, 978, 769, -1, 978, 776, -1, 985,
+ -1, 987, -1, 989, -1, 991, -1, 993,
+ -1, 995, -1, 997, -1, 999, -1, 1001,
+ -1, 1003, -1, 1005, -1, 1007, -1, 962,
+ -1, 920, -1, 1016, -1, 931, -1, 1010,
+ -1, 1019, -1, 891, -1, 892, -1, 893,
+ -1, 1045, 768, -1, 1104, -1, 1045, 776,
+ -1, 1105, -1, 1106, -1, 1043, 769, -1,
+ 1107, -1, 1108, -1, 1109, -1, 1110, -1,
+ 1030, 776, -1, 1111, -1, 1112, -1, 1113,
+ -1, 1114, -1, 1115, -1, 1050, 769, -1,
+ 1116, -1, 1048, 768, -1, 1117, -1, 1059,
+ 774, -1, 1118, -1, 1119, -1, 1072, -1,
+ 1073, -1, 1074, -1, 1075, -1, 1076, -1,
+ 1077, -1, 1078, -1, 1079, -1, 1080, -1,
+ 1048, 774, -1, 1081, -1, 1082, -1, 1083,
+ -1, 1084, -1, 1085, -1, 1086, -1, 1087,
+ -1, 1088, -1, 1089, -1, 1090, -1, 1091,
+ -1, 1092, -1, 1093, -1, 1094, -1, 1095,
+ -1, 1096, -1, 1097, -1, 1098, -1, 1099,
+ -1, 1100, -1, 1101, -1, 1102, -1, 1103,
+ -1, 1080, 774, -1, 1077, 768, -1, 1077,
+ 776, -1, 1075, 769, -1, 1110, 776, -1,
+ 1082, 769, -1, 1080, 768, -1, 1091, 774,
+ -1, 1121, -1, 1123, -1, 1125, -1, 1127,
+ -1, 1129, -1, 1131, -1, 1133, -1, 1135,
+ -1, 1137, -1, 1139, -1, 1141, -1, 1140,
+ 783, -1, 1143, -1, 1141, 783, -1, 1145,
+ -1, 1147, -1, 1149, -1, 1151, -1, 1153,
+ -1, 1163, -1, 1165, -1, 1167, -1, 1169,
+ -1, 1171, -1, 1173, -1, 1175, -1, 1177,
+ -1, 1179, -1, 1181, -1, 1183, -1, 1185,
+ -1, 1187, -1, 1189, -1, 1191, -1, 1193,
+ -1, 1195, -1, 1197, -1, 1199, -1, 1201,
+ -1, 1203, -1, 1205, -1, 1207, -1, 1209,
+ -1, 1211, -1, 1213, -1, 1215, -1, 1231,
+ -1, 1046, 774, -1, 1218, -1, 1078, 774,
+ -1, 1220, -1, 1222, -1, 1224, -1, 1226,
+ -1, 1228, -1, 1230, -1, 1040, 774, -1,
+ 1233, -1, 1072, 774, -1, 1040, 776, -1,
+ 1235, -1, 1072, 776, -1, 1237, -1, 1045,
+ 774, -1, 1239, -1, 1077, 774, -1, 1241,
+ -1, 1240, 776, -1, 1243, -1, 1241, 776,
+ -1, 1046, 776, -1, 1245, -1, 1078, 776,
+ -1, 1047, 776, -1, 1247, -1, 1079, 776,
+ -1, 1249, -1, 1048, 772, -1, 1251, -1,
+ 1080, 772, -1, 1048, 776, -1, 1253, -1,
+ 1080, 776, -1, 1054, 776, -1, 1255, -1,
+ 1086, 776, -1, 1257, -1, 1256, 776, -1,
+ 1259, -1, 1257, 776, -1, 1069, 776, -1,
+ 1261, -1, 1101, 776, -1, 1059, 772, -1,
+ 1263, -1, 1091, 772, -1, 1059, 776, -1,
+ 1265, -1, 1091, 776, -1, 1059, 779, -1,
+ 1267, -1, 1091, 779, -1, 1063, 776, -1,
+ 1269, -1, 1095, 776, -1, 1271, -1, 1067,
+ 776, -1, 1273, -1, 1099, 776, -1, 1275,
+ -1, 1277, -1, 1279, -1, 1281, -1, 1283,
+ -1, 1285, -1, 1287, -1, 1289, -1, 1291,
+ -1, 1293, -1, 1295, -1, 1297, -1, 1299,
+ -1, 1377, -1, 1378, -1, 1379, -1, 1380,
+ -1, 1381, -1, 1382, -1, 1383, -1, 1384,
+ -1, 1385, -1, 1386, -1, 1387, -1, 1388,
+ -1, 1389, -1, 1390, -1, 1391, -1, 1392,
+ -1, 1393, -1, 1394, -1, 1395, -1, 1396,
+ -1, 1397, -1, 1398, -1, 1399, -1, 1400,
+ -1, 1401, -1, 1402, -1, 1403, -1, 1404,
+ -1, 1405, -1, 1406, -1, 1407, -1, 1408,
+ -1, 1409, -1, 1410, -1, 1411, -1, 1412,
+ -1, 1413, -1, 1414, -1, 1381, 1410, -1,
+ 1575, 1619, -1, 1575, 1620, -1, 1608, 1620,
+ -1, 1575, 1621, -1, 1610, 1620, -1, 1575,
+ 1652, -1, 1608, 1652, -1, 1735, 1652, -1,
+ 1610, 1652, -1, 1749, 1620, -1, 1729, 1620,
+ -1, 1746, 1620, -1, 2344, 2364, -1, 2352,
+ 2364, -1, 2355, 2364, -1, 2325, 2364, -1,
+ 2326, 2364, -1, 2327, 2364, -1, 2332, 2364,
+ -1, 2337, 2364, -1, 2338, 2364, -1, 2347,
+ 2364, -1, 2351, 2364, -1, 2503, 2494, -1,
+ 2503, 2519, -1, 2465, 2492, -1, 2466, 2492,
+ -1, 2479, 2492, -1, 2610, 2620, -1, 2616,
+ 2620, -1, 2582, 2620, -1, 2583, 2620, -1,
+ 2588, 2620, -1, 2603, 2620, -1, 2887, 2902,
+ -1, 2887, 2878, -1, 2887, 2903, -1, 2849,
+ 2876, -1, 2850, 2876, -1, 2962, 3031, -1,
+ 3014, 3006, -1, 3015, 3006, -1, 3014, 3031,
+ -1, 3142, 3158, -1, 3263, 3285, -1, 3270,
+ 3285, -1, 3270, 3286, -1, 3270, 3266, -1,
+ 3274, 3285, -1, 3398, 3390, -1, 3399, 3390,
+ -1, 3398, 3415, -1, 3545, 3530, -1, 3545,
+ 3535, -1, 3548, 3530, -1, 3545, 3551, -1,
+ 3661, 3634, -1, 3789, 3762, -1, 3755, 3737,
+ -1, 3755, 3745, -1, 3851, -1, 3906, 4023,
+ -1, 3916, 4023, -1, 3921, 4023, -1, 3926,
+ 4023, -1, 3931, 4023, -1, 3904, 4021, -1,
+ 3953, 3954, -1, 3953, 3956, -1, 4018, 3968,
+ -1, 4018, 3969, -1, 4019, 3968, -1, 4019,
+ 3969, -1, 3953, 3968, -1, 3986, 4023, -1,
+ 3996, 4023, -1, 4001, 4023, -1, 4006, 4023,
+ -1, 4011, 4023, -1, 3984, 4021, -1, 4133,
+ 4142, -1, 11520, -1, 11521, -1, 11522, -1,
+ 11523, -1, 11524, -1, 11525, -1, 11526, -1,
+ 11527, -1, 11528, -1, 11529, -1, 11530, -1,
+ 11531, -1, 11532, -1, 11533, -1, 11534, -1,
+ 11535, -1, 11536, -1, 11537, -1, 11538, -1,
+ 11539, -1, 11540, -1, 11541, -1, 11542, -1,
+ 11543, -1, 11544, -1, 11545, -1, 11546, -1,
+ 11547, -1, 11548, -1, 11549, -1, 11550, -1,
+ 11551, -1, 11552, -1, 11553, -1, 11554, -1,
+ 11555, -1, 11556, -1, 11557, -1, 4316, -1,
+ 6917, 6965, -1, 6919, 6965, -1, 6921, 6965,
+ -1, 6923, 6965, -1, 6925, 6965, -1, 6929,
+ 6965, -1, 6970, 6965, -1, 6972, 6965, -1,
+ 6974, 6965, -1, 6975, 6965, -1, 6978, 6965,
+ -1, 65, -1, 198, -1, 66, -1, 68,
+ -1, 69, -1, 398, -1, 71, -1, 72,
+ -1, 73, -1, 74, -1, 75, -1, 76,
+ -1, 77, -1, 78, -1, 79, -1, 546,
+ -1, 80, -1, 82, -1, 84, -1, 85,
+ -1, 87, -1, 592, -1, 593, -1, 7426,
+ -1, 604, -1, 7446, -1, 7447, -1, 7453,
+ -1, 7461, -1, 594, -1, 597, -1, 607,
+ -1, 609, -1, 613, -1, 618, -1, 7547,
+ -1, 669, -1, 621, -1, 7557, -1, 671,
+ -1, 625, -1, 624, -1, 627, -1, 628,
+ -1, 632, -1, 642, -1, 427, -1, 7452,
+ -1, 656, -1, 657, -1, 65, 805, -1,
+ 7681, -1, 97, 805, -1, 66, 775, -1,
+ 7683, -1, 98, 775, -1, 66, 803, -1,
+ 7685, -1, 98, 803, -1, 66, 817, -1,
+ 7687, -1, 98, 817, -1, 199, 769, -1,
+ 7689, -1, 231, 769, -1, 68, 775, -1,
+ 7691, -1, 100, 775, -1, 68, 803, -1,
+ 7693, -1, 100, 803, -1, 68, 817, -1,
+ 7695, -1, 100, 817, -1, 68, 807, -1,
+ 7697, -1, 100, 807, -1, 68, 813, -1,
+ 7699, -1, 100, 813, -1, 274, 768, -1,
+ 7701, -1, 275, 768, -1, 274, 769, -1,
+ 7703, -1, 275, 769, -1, 69, 813, -1,
+ 7705, -1, 101, 813, -1, 69, 816, -1,
+ 7707, -1, 101, 816, -1, 552, 774, -1,
+ 7709, -1, 553, 774, -1, 70, 775, -1,
+ 7711, -1, 102, 775, -1, 71, 772, -1,
+ 7713, -1, 103, 772, -1, 72, 775, -1,
+ 7715, -1, 104, 775, -1, 72, 803, -1,
+ 7717, -1, 104, 803, -1, 72, 776, -1,
+ 7719, -1, 104, 776, -1, 72, 807, -1,
+ 7721, -1, 104, 807, -1, 72, 814, -1,
+ 7723, -1, 104, 814, -1, 73, 816, -1,
+ 7725, -1, 105, 816, -1, 207, 769, -1,
+ 7727, -1, 239, 769, -1, 75, 769, -1,
+ 7729, -1, 107, 769, -1, 75, 803, -1,
+ 7731, -1, 107, 803, -1, 75, 817, -1,
+ 7733, -1, 107, 817, -1, 76, 803, -1,
+ 7735, -1, 108, 803, -1, 7734, 772, -1,
+ 7737, -1, 7735, 772, -1, 76, 817, -1,
+ 7739, -1, 108, 817, -1, 76, 813, -1,
+ 7741, -1, 108, 813, -1, 77, 769, -1,
+ 7743, -1, 109, 769, -1, 77, 775, -1,
+ 7745, -1, 109, 775, -1, 77, 803, -1,
+ 7747, -1, 109, 803, -1, 78, 775, -1,
+ 7749, -1, 110, 775, -1, 78, 803, -1,
+ 7751, -1, 110, 803, -1, 78, 817, -1,
+ 7753, -1, 110, 817, -1, 78, 813, -1,
+ 7755, -1, 110, 813, -1, 213, 769, -1,
+ 7757, -1, 245, 769, -1, 213, 776, -1,
+ 7759, -1, 245, 776, -1, 332, 768, -1,
+ 7761, -1, 333, 768, -1, 332, 769, -1,
+ 7763, -1, 333, 769, -1, 80, 769, -1,
+ 7765, -1, 112, 769, -1, 80, 775, -1,
+ 7767, -1, 112, 775, -1, 82, 775, -1,
+ 7769, -1, 114, 775, -1, 82, 803, -1,
+ 7771, -1, 114, 803, -1, 7770, 772, -1,
+ 7773, -1, 7771, 772, -1, 82, 817, -1,
+ 7775, -1, 114, 817, -1, 83, 775, -1,
+ 7777, -1, 115, 775, -1, 83, 803, -1,
+ 7779, -1, 115, 803, -1, 346, 775, -1,
+ 7781, -1, 347, 775, -1, 352, 775, -1,
+ 7783, -1, 353, 775, -1, 7778, 775, -1,
+ 7785, -1, 7779, 775, -1, 84, 775, -1,
+ 7787, -1, 116, 775, -1, 84, 803, -1,
+ 7789, -1, 116, 803, -1, 84, 817, -1,
+ 7791, -1, 116, 817, -1, 84, 813, -1,
+ 7793, -1, 116, 813, -1, 85, 804, -1,
+ 7795, -1, 117, 804, -1, 85, 816, -1,
+ 7797, -1, 117, 816, -1, 85, 813, -1,
+ 7799, -1, 117, 813, -1, 360, 769, -1,
+ 7801, -1, 361, 769, -1, 362, 776, -1,
+ 7803, -1, 363, 776, -1, 86, 771, -1,
+ 7805, -1, 118, 771, -1, 86, 803, -1,
+ 7807, -1, 118, 803, -1, 87, 768, -1,
+ 7809, -1, 119, 768, -1, 87, 769, -1,
+ 7811, -1, 119, 769, -1, 87, 776, -1,
+ 7813, -1, 119, 776, -1, 87, 775, -1,
+ 7815, -1, 119, 775, -1, 87, 803, -1,
+ 7817, -1, 119, 803, -1, 88, 775, -1,
+ 7819, -1, 120, 775, -1, 88, 776, -1,
+ 7821, -1, 120, 776, -1, 89, 775, -1,
+ 7823, -1, 121, 775, -1, 90, 770, -1,
+ 7825, -1, 122, 770, -1, 90, 803, -1,
+ 7827, -1, 122, 803, -1, 90, 817, -1,
+ 7829, -1, 122, 817, -1, 104, 817, -1,
+ 116, 776, -1, 119, 778, -1, 121, 778,
+ -1, 97, 702, -1, 383, 775, -1, 65,
+ 803, -1, 7841, -1, 97, 803, -1, 65,
+ 777, -1, 7843, -1, 97, 777, -1, 194,
+ 769, -1, 7845, -1, 226, 769, -1, 194,
+ 768, -1, 7847, -1, 226, 768, -1, 194,
+ 777, -1, 7849, -1, 226, 777, -1, 194,
+ 771, -1, 7851, -1, 226, 771, -1, 7840,
+ 770, -1, 7853, -1, 7841, 770, -1, 258,
+ 769, -1, 7855, -1, 259, 769, -1, 258,
+ 768, -1, 7857, -1, 259, 768, -1, 258,
+ 777, -1, 7859, -1, 259, 777, -1, 258,
+ 771, -1, 7861, -1, 259, 771, -1, 7840,
+ 774, -1, 7863, -1, 7841, 774, -1, 69,
+ 803, -1, 7865, -1, 101, 803, -1, 69,
+ 777, -1, 7867, -1, 101, 777, -1, 69,
+ 771, -1, 7869, -1, 101, 771, -1, 202,
+ 769, -1, 7871, -1, 234, 769, -1, 202,
+ 768, -1, 7873, -1, 234, 768, -1, 202,
+ 777, -1, 7875, -1, 234, 777, -1, 202,
+ 771, -1, 7877, -1, 234, 771, -1, 7864,
+ 770, -1, 7879, -1, 7865, 770, -1, 73,
+ 777, -1, 7881, -1, 105, 777, -1, 73,
+ 803, -1, 7883, -1, 105, 803, -1, 79,
+ 803, -1, 7885, -1, 111, 803, -1, 79,
+ 777, -1, 7887, -1, 111, 777, -1, 212,
+ 769, -1, 7889, -1, 244, 769, -1, 212,
+ 768, -1, 7891, -1, 244, 768, -1, 212,
+ 777, -1, 7893, -1, 244, 777, -1, 212,
+ 771, -1, 7895, -1, 244, 771, -1, 7884,
+ 770, -1, 7897, -1, 7885, 770, -1, 416,
+ 769, -1, 7899, -1, 417, 769, -1, 416,
+ 768, -1, 7901, -1, 417, 768, -1, 416,
+ 777, -1, 7903, -1, 417, 777, -1, 416,
+ 771, -1, 7905, -1, 417, 771, -1, 416,
+ 803, -1, 7907, -1, 417, 803, -1, 85,
+ 803, -1, 7909, -1, 117, 803, -1, 85,
+ 777, -1, 7911, -1, 117, 777, -1, 431,
+ 769, -1, 7913, -1, 432, 769, -1, 431,
+ 768, -1, 7915, -1, 432, 768, -1, 431,
+ 777, -1, 7917, -1, 432, 777, -1, 431,
+ 771, -1, 7919, -1, 432, 771, -1, 431,
+ 803, -1, 7921, -1, 432, 803, -1, 89,
+ 768, -1, 7923, -1, 121, 768, -1, 89,
+ 803, -1, 7925, -1, 121, 803, -1, 89,
+ 777, -1, 7927, -1, 121, 777, -1, 89,
+ 771, -1, 7929, -1, 121, 771, -1, 945,
+ 787, -1, 945, 788, -1, 7936, 768, -1,
+ 7937, 768, -1, 7936, 769, -1, 7937, 769,
+ -1, 7936, 834, -1, 7937, 834, -1, 913,
+ 787, -1, 7936, -1, 913, 788, -1, 7937,
+ -1, 7944, 768, -1, 7938, -1, 7945, 768,
+ -1, 7939, -1, 7944, 769, -1, 7940, -1,
+ 7945, 769, -1, 7941, -1, 7944, 834, -1,
+ 7942, -1, 7945, 834, -1, 7943, -1, 949,
+ 787, -1, 949, 788, -1, 7952, 768, -1,
+ 7953, 768, -1, 7952, 769, -1, 7953, 769,
+ -1, 917, 787, -1, 7952, -1, 917, 788,
+ -1, 7953, -1, 7960, 768, -1, 7954, -1,
+ 7961, 768, -1, 7955, -1, 7960, 769, -1,
+ 7956, -1, 7961, 769, -1, 7957, -1, 951,
+ 787, -1, 951, 788, -1, 7968, 768, -1,
+ 7969, 768, -1, 7968, 769, -1, 7969, 769,
+ -1, 7968, 834, -1, 7969, 834, -1, 919,
+ 787, -1, 7968, -1, 919, 788, -1, 7969,
+ -1, 7976, 768, -1, 7970, -1, 7977, 768,
+ -1, 7971, -1, 7976, 769, -1, 7972, -1,
+ 7977, 769, -1, 7973, -1, 7976, 834, -1,
+ 7974, -1, 7977, 834, -1, 7975, -1, 953,
+ 787, -1, 953, 788, -1, 7984, 768, -1,
+ 7985, 768, -1, 7984, 769, -1, 7985, 769,
+ -1, 7984, 834, -1, 7985, 834, -1, 921,
+ 787, -1, 7984, -1, 921, 788, -1, 7985,
+ -1, 7992, 768, -1, 7986, -1, 7993, 768,
+ -1, 7987, -1, 7992, 769, -1, 7988, -1,
+ 7993, 769, -1, 7989, -1, 7992, 834, -1,
+ 7990, -1, 7993, 834, -1, 7991, -1, 959,
+ 787, -1, 959, 788, -1, 8000, 768, -1,
+ 8001, 768, -1, 8000, 769, -1, 8001, 769,
+ -1, 927, 787, -1, 8000, -1, 927, 788,
+ -1, 8001, -1, 8008, 768, -1, 8002, -1,
+ 8009, 768, -1, 8003, -1, 8008, 769, -1,
+ 8004, -1, 8009, 769, -1, 8005, -1, 965,
+ 787, -1, 965, 788, -1, 8016, 768, -1,
+ 965, 787, 768, -1, 8017, 768, -1, 8016,
+ 769, -1, 965, 787, 769, -1, 8017, 769,
+ -1, 8016, 834, -1, 965, 787, 834, -1,
+ 8017, 834, -1, 933, 788, -1, 8017, -1,
+ 8025, 768, -1, 8019, -1, 8025, 769, -1,
+ 8021, -1, 8025, 834, -1, 8023, -1, 969,
+ 787, -1, 969, 788, -1, 8032, 768, -1,
+ 8033, 768, -1, 8032, 769, -1, 8033, 769,
+ -1, 8032, 834, -1, 8033, 834, -1, 937,
+ 787, -1, 8032, -1, 937, 788, -1, 8033,
+ -1, 8040, 768, -1, 8034, -1, 8041, 768,
+ -1, 8035, -1, 8040, 769, -1, 8036, -1,
+ 8041, 769, -1, 8037, -1, 8040, 834, -1,
+ 8038, -1, 8041, 834, -1, 8039, -1, 945,
+ 768, -1, 949, 768, -1, 951, 768, -1,
+ 953, 768, -1, 959, 768, -1, 965, 768,
+ -1, 969, 768, -1, 7936, 837, -1, 7936,
+ 953, -1, 7937, 837, -1, 7937, 953, -1,
+ 7938, 837, -1, 7938, 953, -1, 7939, 837,
+ -1, 7939, 953, -1, 7940, 837, -1, 7940,
+ 953, -1, 7941, 837, -1, 7941, 953, -1,
+ 7942, 837, -1, 7942, 953, -1, 7943, 837,
+ -1, 7943, 953, -1, 7944, 837, -1, 8064,
+ -1, 7945, 837, -1, 8065, -1, 7946, 837,
+ -1, 8066, -1, 7947, 837, -1, 8067, -1,
+ 7948, 837, -1, 8068, -1, 7949, 837, -1,
+ 8069, -1, 7950, 837, -1, 8070, -1, 7951,
+ 837, -1, 8071, -1, 7968, 837, -1, 7968,
+ 953, -1, 7969, 837, -1, 7969, 953, -1,
+ 7970, 837, -1, 7970, 953, -1, 7971, 837,
+ -1, 7971, 953, -1, 7972, 837, -1, 7972,
+ 953, -1, 7973, 837, -1, 7973, 953, -1,
+ 7974, 837, -1, 7974, 953, -1, 7975, 837,
+ -1, 7975, 953, -1, 7976, 837, -1, 8080,
+ -1, 7977, 837, -1, 8081, -1, 7978, 837,
+ -1, 8082, -1, 7979, 837, -1, 8083, -1,
+ 7980, 837, -1, 8084, -1, 7981, 837, -1,
+ 8085, -1, 7982, 837, -1, 8086, -1, 7983,
+ 837, -1, 8087, -1, 8032, 837, -1, 8032,
+ 953, -1, 8033, 837, -1, 8033, 953, -1,
+ 8034, 837, -1, 8034, 953, -1, 8035, 837,
+ -1, 8035, 953, -1, 8036, 837, -1, 8036,
+ 953, -1, 8037, 837, -1, 8037, 953, -1,
+ 8038, 837, -1, 8038, 953, -1, 8039, 837,
+ -1, 8039, 953, -1, 8040, 837, -1, 8096,
+ -1, 8041, 837, -1, 8097, -1, 8042, 837,
+ -1, 8098, -1, 8043, 837, -1, 8099, -1,
+ 8044, 837, -1, 8100, -1, 8045, 837, -1,
+ 8101, -1, 8046, 837, -1, 8102, -1, 8047,
+ 837, -1, 8103, -1, 945, 774, -1, 945,
+ 772, -1, 8048, 837, -1, 8048, 953, -1,
+ 945, 837, -1, 945, 953, -1, 940, 837,
+ -1, 940, 953, -1, 945, 834, -1, 8118,
+ 837, -1, 945, 834, 953, -1, 913, 774,
+ -1, 8112, -1, 913, 772, -1, 8113, -1,
+ 913, 768, -1, 8048, -1, 902, -1, 8049,
+ -1, 913, 837, -1, 8115, -1, 32, 787,
+ -1, 32, 834, -1, 168, 834, -1, 8052,
+ 837, -1, 8052, 953, -1, 951, 837, -1,
+ 951, 953, -1, 942, 837, -1, 942, 953,
+ -1, 951, 834, -1, 8134, 837, -1, 951,
+ 834, 953, -1, 917, 768, -1, 8050, -1,
+ 904, -1, 8051, -1, 919, 768, -1, 8052,
+ -1, 905, -1, 8053, -1, 919, 837, -1,
+ 8131, -1, 8127, 768, -1, 8127, 769, -1,
+ 8127, 834, -1, 953, 774, -1, 953, 772,
+ -1, 970, 768, -1, 953, 776, 768, -1,
+ 912, -1, 953, 834, -1, 970, 834, -1,
+ 953, 776, 834, -1, 921, 774, -1, 8144,
+ -1, 921, 772, -1, 8145, -1, 921, 768,
+ -1, 8054, -1, 906, -1, 8055, -1, 8190,
+ 768, -1, 8190, 769, -1, 8190, 834, -1,
+ 965, 774, -1, 965, 772, -1, 971, 768,
+ -1, 965, 776, 768, -1, 944, -1, 961,
+ 787, -1, 961, 788, -1, 965, 834, -1,
+ 971, 834, -1, 965, 776, 834, -1, 933,
+ 774, -1, 8160, -1, 933, 772, -1, 8161,
+ -1, 933, 768, -1, 8058, -1, 910, -1,
+ 8059, -1, 929, 788, -1, 8165, -1, 168,
+ 768, -1, 901, -1, 96, -1, 8060, 837,
+ -1, 8060, 953, -1, 969, 837, -1, 969,
+ 953, -1, 974, 837, -1, 974, 953, -1,
+ 969, 834, -1, 8182, 837, -1, 969, 834,
+ 953, -1, 927, 768, -1, 8056, -1, 908,
+ -1, 8057, -1, 937, 768, -1, 8060, -1,
+ 911, -1, 8061, -1, 937, 837, -1, 8179,
+ -1, 180, -1, 32, 788, -1, 8194, -1,
+ 8195, -1, 8208, -1, 32, 819, -1, 46,
+ -1, 46, 46, -1, 46, 46, 46, -1,
+ 8242, 8242, -1, 8242, 8242, 8242, -1, 8245,
+ 8245, -1, 8245, 8245, 8245, -1, 33, 33,
+ -1, 32, 773, -1, 63, 63, -1, 63,
+ 33, -1, 33, 63, -1, 8242, 8242, 8242,
+ 8242, -1, 48, -1, 52, -1, 53, -1,
+ 54, -1, 55, -1, 56, -1, 57, -1,
+ 43, -1, 8722, -1, 61, -1, 40, -1,
+ 41, -1, 82, 115, -1, 97, 47, 99,
+ -1, 97, 47, 115, -1, 67, -1, 176,
+ 67, -1, 99, 47, 111, -1, 99, 47,
+ 117, -1, 400, -1, 176, 70, -1, 78,
+ 111, -1, 81, -1, 83, 77, -1, 84,
+ 69, 76, -1, 84, 77, -1, 90, -1,
+ 937, -1, 197, -1, 70, -1, 8526, -1,
+ 1488, -1, 1489, -1, 1490, -1, 1491, -1,
+ 70, 65, 88, -1, 915, -1, 928, -1,
+ 8721, -1, 49, 8260, 51, -1, 50, 8260,
+ 51, -1, 49, 8260, 53, -1, 50, 8260,
+ 53, -1, 51, 8260, 53, -1, 52, 8260,
+ 53, -1, 49, 8260, 54, -1, 53, 8260,
+ 54, -1, 49, 8260, 56, -1, 51, 8260,
+ 56, -1, 53, 8260, 56, -1, 55, 8260,
+ 56, -1, 49, 8260, -1, 8560, -1, 73,
+ 73, -1, 8561, -1, 73, 73, 73, -1,
+ 8562, -1, 73, 86, -1, 8563, -1, 86,
+ -1, 8564, -1, 86, 73, -1, 8565, -1,
+ 86, 73, 73, -1, 8566, -1, 86, 73,
+ 73, 73, -1, 8567, -1, 73, 88, -1,
+ 8568, -1, 88, -1, 8569, -1, 88, 73,
+ -1, 8570, -1, 88, 73, 73, -1, 8571,
+ -1, 8572, -1, 8573, -1, 8574, -1, 8575,
+ -1, 105, 105, -1, 105, 105, 105, -1,
+ 105, 118, -1, 118, 105, -1, 118, 105,
+ 105, -1, 118, 105, 105, 105, -1, 105,
+ 120, -1, 120, 105, -1, 120, 105, 105,
+ -1, 8580, -1, 8592, 824, -1, 8594, 824,
+ -1, 8596, 824, -1, 8656, 824, -1, 8660,
+ 824, -1, 8658, 824, -1, 8707, 824, -1,
+ 8712, 824, -1, 8715, 824, -1, 8739, 824,
+ -1, 8741, 824, -1, 8747, 8747, -1, 8747,
+ 8747, 8747, -1, 8750, 8750, -1, 8750, 8750,
+ 8750, -1, 8764, 824, -1, 8771, 824, -1,
+ 8773, 824, -1, 8776, 824, -1, 61, 824,
+ -1, 8801, 824, -1, 8781, 824, -1, 60,
+ 824, -1, 62, 824, -1, 8804, 824, -1,
+ 8805, 824, -1, 8818, 824, -1, 8819, 824,
+ -1, 8822, 824, -1, 8823, 824, -1, 8826,
+ 824, -1, 8827, 824, -1, 8834, 824, -1,
+ 8835, 824, -1, 8838, 824, -1, 8839, 824,
+ -1, 8866, 824, -1, 8872, 824, -1, 8873,
+ 824, -1, 8875, 824, -1, 8828, 824, -1,
+ 8829, 824, -1, 8849, 824, -1, 8850, 824,
+ -1, 8882, 824, -1, 8883, 824, -1, 8884,
+ 824, -1, 8885, 824, -1, 12296, -1, 12297,
+ -1, 49, 48, -1, 49, 49, -1, 49,
+ 50, -1, 49, 51, -1, 49, 52, -1,
+ 49, 53, -1, 49, 54, -1, 49, 55,
+ -1, 49, 56, -1, 49, 57, -1, 50,
+ 48, -1, 40, 49, 41, -1, 40, 50,
+ 41, -1, 40, 51, 41, -1, 40, 52,
+ 41, -1, 40, 53, 41, -1, 40, 54,
+ 41, -1, 40, 55, 41, -1, 40, 56,
+ 41, -1, 40, 57, 41, -1, 40, 49,
+ 48, 41, -1, 40, 49, 49, 41, -1,
+ 40, 49, 50, 41, -1, 40, 49, 51,
+ 41, -1, 40, 49, 52, 41, -1, 40,
+ 49, 53, 41, -1, 40, 49, 54, 41,
+ -1, 40, 49, 55, 41, -1, 40, 49,
+ 56, 41, -1, 40, 49, 57, 41, -1,
+ 40, 50, 48, 41, -1, 49, 46, -1,
+ 50, 46, -1, 51, 46, -1, 52, 46,
+ -1, 53, 46, -1, 54, 46, -1, 55,
+ 46, -1, 56, 46, -1, 57, 46, -1,
+ 49, 48, 46, -1, 49, 49, 46, -1,
+ 49, 50, 46, -1, 49, 51, 46, -1,
+ 49, 52, 46, -1, 49, 53, 46, -1,
+ 49, 54, 46, -1, 49, 55, 46, -1,
+ 49, 56, 46, -1, 49, 57, 46, -1,
+ 50, 48, 46, -1, 40, 97, 41, -1,
+ 40, 98, 41, -1, 40, 99, 41, -1,
+ 40, 100, 41, -1, 40, 101, 41, -1,
+ 40, 102, 41, -1, 40, 103, 41, -1,
+ 40, 104, 41, -1, 40, 105, 41, -1,
+ 40, 106, 41, -1, 40, 107, 41, -1,
+ 40, 108, 41, -1, 40, 109, 41, -1,
+ 40, 110, 41, -1, 40, 111, 41, -1,
+ 40, 112, 41, -1, 40, 113, 41, -1,
+ 40, 114, 41, -1, 40, 115, 41, -1,
+ 40, 116, 41, -1, 40, 117, 41, -1,
+ 40, 118, 41, -1, 40, 119, 41, -1,
+ 40, 120, 41, -1, 40, 121, 41, -1,
+ 40, 122, 41, -1, 9424, -1, 9425, -1,
+ 9426, -1, 9427, -1, 9428, -1, 9429, -1,
+ 9430, -1, 9431, -1, 9432, -1, 9433, -1,
+ 9434, -1, 9435, -1, 9436, -1, 9437, -1,
+ 9438, -1, 9439, -1, 9440, -1, 9441, -1,
+ 83, -1, 9442, -1, 9443, -1, 9444, -1,
+ 9445, -1, 9446, -1, 9447, -1, 89, -1,
+ 9448, -1, 9449, -1, 8747, 8747, 8747, 8747,
+ -1, 58, 58, 61, -1, 61, 61, -1,
+ 61, 61, 61, -1, 10973, 824, -1, 11312,
+ -1, 11313, -1, 11314, -1, 11315, -1, 11316,
+ -1, 11317, -1, 11318, -1, 11319, -1, 11320,
+ -1, 11321, -1, 11322, -1, 11323, -1, 11324,
+ -1, 11325, -1, 11326, -1, 11327, -1, 11328,
+ -1, 11329, -1, 11330, -1, 11331, -1, 11332,
+ -1, 11333, -1, 11334, -1, 11335, -1, 11336,
+ -1, 11337, -1, 11338, -1, 11339, -1, 11340,
+ -1, 11341, -1, 11342, -1, 11343, -1, 11344,
+ -1, 11345, -1, 11346, -1, 11347, -1, 11348,
+ -1, 11349, -1, 11350, -1, 11351, -1, 11352,
+ -1, 11353, -1, 11354, -1, 11355, -1, 11356,
+ -1, 11357, -1, 11358, -1, 11361, -1, 619,
+ -1, 7549, -1, 637, -1, 11368, -1, 11370,
+ -1, 11372, -1, 11382, -1, 11393, -1, 11395,
+ -1, 11397, -1, 11399, -1, 11401, -1, 11403,
+ -1, 11405, -1, 11407, -1, 11409, -1, 11411,
+ -1, 11413, -1, 11415, -1, 11417, -1, 11419,
+ -1, 11421, -1, 11423, -1, 11425, -1, 11427,
+ -1, 11429, -1, 11431, -1, 11433, -1, 11435,
+ -1, 11437, -1, 11439, -1, 11441, -1, 11443,
+ -1, 11445, -1, 11447, -1, 11449, -1, 11451,
+ -1, 11453, -1, 11455, -1, 11457, -1, 11459,
+ -1, 11461, -1, 11463, -1, 11465, -1, 11467,
+ -1, 11469, -1, 11471, -1, 11473, -1, 11475,
+ -1, 11477, -1, 11479, -1, 11481, -1, 11483,
+ -1, 11485, -1, 11487, -1, 11489, -1, 11491,
+ -1, 11617, -1, 27597, -1, 40863, -1, 19968,
+ -1, 20008, -1, 20022, -1, 20031, -1, 20057,
+ -1, 20101, -1, 20108, -1, 20128, -1, 20154,
+ -1, 20799, -1, 20837, -1, 20843, -1, 20866,
+ -1, 20886, -1, 20907, -1, 20960, -1, 20981,
+ -1, 20992, -1, 21147, -1, 21241, -1, 21269,
+ -1, 21274, -1, 21304, -1, 21313, -1, 21340,
+ -1, 21353, -1, 21378, -1, 21430, -1, 21448,
+ -1, 21475, -1, 22231, -1, 22303, -1, 22763,
+ -1, 22786, -1, 22794, -1, 22805, -1, 22823,
+ -1, 22899, -1, 23376, -1, 23424, -1, 23544,
+ -1, 23567, -1, 23586, -1, 23608, -1, 23662,
+ -1, 23665, -1, 24027, -1, 24037, -1, 24049,
+ -1, 24062, -1, 24178, -1, 24186, -1, 24191,
+ -1, 24308, -1, 24318, -1, 24331, -1, 24339,
+ -1, 24400, -1, 24417, -1, 24435, -1, 24515,
+ -1, 25096, -1, 25142, -1, 25163, -1, 25903,
+ -1, 25908, -1, 25991, -1, 26007, -1, 26020,
+ -1, 26041, -1, 26080, -1, 26085, -1, 26352,
+ -1, 26376, -1, 26408, -1, 27424, -1, 27490,
+ -1, 27513, -1, 27571, -1, 27595, -1, 27604,
+ -1, 27611, -1, 27663, -1, 27668, -1, 27700,
+ -1, 28779, -1, 29226, -1, 29238, -1, 29243,
+ -1, 29247, -1, 29255, -1, 29273, -1, 29275,
+ -1, 29356, -1, 29572, -1, 29577, -1, 29916,
+ -1, 29926, -1, 29976, -1, 29983, -1, 29992,
+ -1, 30000, -1, 30091, -1, 30098, -1, 30326,
+ -1, 30333, -1, 30382, -1, 30399, -1, 30446,
+ -1, 30683, -1, 30690, -1, 30707, -1, 31034,
+ -1, 31160, -1, 31166, -1, 31348, -1, 31435,
+ -1, 31481, -1, 31859, -1, 31992, -1, 32566,
+ -1, 32593, -1, 32650, -1, 32701, -1, 32769,
+ -1, 32780, -1, 32786, -1, 32819, -1, 32895,
+ -1, 32905, -1, 33251, -1, 33258, -1, 33267,
+ -1, 33276, -1, 33292, -1, 33307, -1, 33311,
+ -1, 33390, -1, 33394, -1, 33400, -1, 34381,
+ -1, 34411, -1, 34880, -1, 34892, -1, 34915,
+ -1, 35198, -1, 35211, -1, 35282, -1, 35328,
+ -1, 35895, -1, 35910, -1, 35925, -1, 35960,
+ -1, 35997, -1, 36196, -1, 36208, -1, 36275,
+ -1, 36523, -1, 36554, -1, 36763, -1, 36784,
+ -1, 36789, -1, 37009, -1, 37193, -1, 37318,
+ -1, 37324, -1, 37329, -1, 38263, -1, 38272,
+ -1, 38428, -1, 38582, -1, 38585, -1, 38632,
+ -1, 38737, -1, 38750, -1, 38754, -1, 38761,
+ -1, 38859, -1, 38893, -1, 38899, -1, 38913,
+ -1, 39080, -1, 39131, -1, 39135, -1, 39318,
+ -1, 39321, -1, 39340, -1, 39592, -1, 39640,
+ -1, 39647, -1, 39717, -1, 39727, -1, 39730,
+ -1, 39740, -1, 39770, -1, 40165, -1, 40565,
+ -1, 40575, -1, 40613, -1, 40635, -1, 40643,
+ -1, 40653, -1, 40657, -1, 40697, -1, 40701,
+ -1, 40718, -1, 40723, -1, 40736, -1, 40763,
+ -1, 40778, -1, 40786, -1, 40845, -1, 40860,
+ -1, 40864, -1, 12306, -1, 21316, -1, 21317,
+ -1, 12363, 12441, -1, 12365, 12441, -1, 12367,
+ 12441, -1, 12369, 12441, -1, 12371, 12441, -1,
+ 12373, 12441, -1, 12375, 12441, -1, 12377, 12441,
+ -1, 12379, 12441, -1, 12381, 12441, -1, 12383,
+ 12441, -1, 12385, 12441, -1, 12388, 12441, -1,
+ 12390, 12441, -1, 12392, 12441, -1, 12399, 12441,
+ -1, 12399, 12442, -1, 12402, 12441, -1, 12402,
+ 12442, -1, 12405, 12441, -1, 12405, 12442, -1,
+ 12408, 12441, -1, 12408, 12442, -1, 12411, 12441,
+ -1, 12411, 12442, -1, 12358, 12441, -1, 32,
+ 12441, -1, 32, 12442, -1, 12445, 12441, -1,
+ 12424, 12426, -1, 12459, 12441, -1, 12461, 12441,
+ -1, 12463, 12441, -1, 12465, 12441, -1, 12467,
+ 12441, -1, 12469, 12441, -1, 12471, 12441, -1,
+ 12473, 12441, -1, 12475, 12441, -1, 12477, 12441,
+ -1, 12479, 12441, -1, 12481, 12441, -1, 12484,
+ 12441, -1, 12486, 12441, -1, 12488, 12441, -1,
+ 12495, 12441, -1, 12495, 12442, -1, 12498, 12441,
+ -1, 12498, 12442, -1, 12501, 12441, -1, 12501,
+ 12442, -1, 12504, 12441, -1, 12504, 12442, -1,
+ 12507, 12441, -1, 12507, 12442, -1, 12454, 12441,
+ -1, 12527, 12441, -1, 12528, 12441, -1, 12529,
+ 12441, -1, 12530, 12441, -1, 12541, 12441, -1,
+ 12467, 12488, -1, 4352, -1, 4353, -1, 4522,
+ -1, 4354, -1, 4524, -1, 4525, -1, 4355,
+ -1, 4356, -1, 4357, -1, 4528, -1, 4529,
+ -1, 4530, -1, 4531, -1, 4532, -1, 4533,
+ -1, 4378, -1, 4358, -1, 4359, -1, 4360,
+ -1, 4385, -1, 4361, -1, 4362, -1, 4363,
+ -1, 4364, -1, 4365, -1, 4366, -1, 4367,
+ -1, 4368, -1, 4369, -1, 4370, -1, 4449,
+ -1, 4450, -1, 4451, -1, 4452, -1, 4453,
+ -1, 4454, -1, 4455, -1, 4456, -1, 4457,
+ -1, 4458, -1, 4459, -1, 4460, -1, 4461,
+ -1, 4462, -1, 4463, -1, 4464, -1, 4465,
+ -1, 4466, -1, 4467, -1, 4468, -1, 4469,
+ -1, 4448, -1, 4372, -1, 4373, -1, 4551,
+ -1, 4552, -1, 4556, -1, 4558, -1, 4563,
+ -1, 4567, -1, 4569, -1, 4380, -1, 4573,
+ -1, 4575, -1, 4381, -1, 4382, -1, 4384,
+ -1, 4386, -1, 4387, -1, 4391, -1, 4393,
+ -1, 4395, -1, 4396, -1, 4397, -1, 4398,
+ -1, 4399, -1, 4402, -1, 4406, -1, 4416,
+ -1, 4423, -1, 4428, -1, 4593, -1, 4594,
+ -1, 4439, -1, 4440, -1, 4441, -1, 4484,
+ -1, 4485, -1, 4488, -1, 4497, -1, 4498,
+ -1, 4500, -1, 4510, -1, 4513, -1, 19977,
+ -1, 22235, -1, 19978, -1, 20013, -1, 19979,
+ -1, 30002, -1, 19993, -1, 19969, -1, 22825,
+ -1, 22320, -1, 40, 4352, 41, -1, 40,
+ 4354, 41, -1, 40, 4355, 41, -1, 40,
+ 4357, 41, -1, 40, 4358, 41, -1, 40,
+ 4359, 41, -1, 40, 4361, 41, -1, 40,
+ 4363, 41, -1, 40, 4364, 41, -1, 40,
+ 4366, 41, -1, 40, 4367, 41, -1, 40,
+ 4368, 41, -1, 40, 4369, 41, -1, 40,
+ 4370, 41, -1, 40, 4352, 4449, 41, -1,
+ 40, 4354, 4449, 41, -1, 40, 4355, 4449,
+ 41, -1, 40, 4357, 4449, 41, -1, 40,
+ 4358, 4449, 41, -1, 40, 4359, 4449, 41,
+ -1, 40, 4361, 4449, 41, -1, 40, 4363,
+ 4449, 41, -1, 40, 4364, 4449, 41, -1,
+ 40, 4366, 4449, 41, -1, 40, 4367, 4449,
+ 41, -1, 40, 4368, 4449, 41, -1, 40,
+ 4369, 4449, 41, -1, 40, 4370, 4449, 41,
+ -1, 40, 4364, 4462, 41, -1, 40, 4363,
+ 4457, 4364, 4453, 4523, 41, -1, 40, 4363,
+ 4457, 4370, 4462, 41, -1, 40, 19968, 41,
+ -1, 40, 20108, 41, -1, 40, 19977, 41,
+ -1, 40, 22235, 41, -1, 40, 20116, 41,
+ -1, 40, 20845, 41, -1, 40, 19971, 41,
+ -1, 40, 20843, 41, -1, 40, 20061, 41,
+ -1, 40, 21313, 41, -1, 40, 26376, 41,
+ -1, 40, 28779, 41, -1, 40, 27700, 41,
+ -1, 40, 26408, 41, -1, 40, 37329, 41,
+ -1, 40, 22303, 41, -1, 40, 26085, 41,
+ -1, 40, 26666, 41, -1, 40, 26377, 41,
+ -1, 40, 31038, 41, -1, 40, 21517, 41,
+ -1, 40, 29305, 41, -1, 40, 36001, 41,
+ -1, 40, 31069, 41, -1, 40, 21172, 41,
+ -1, 40, 20195, 41, -1, 40, 21628, 41,
+ -1, 40, 23398, 41, -1, 40, 30435, 41,
+ -1, 40, 20225, 41, -1, 40, 36039, 41,
+ -1, 40, 21332, 41, -1, 40, 31085, 41,
+ -1, 40, 20241, 41, -1, 40, 33258, 41,
+ -1, 40, 33267, 41, -1, 80, 84, 69,
+ -1, 50, 49, -1, 50, 50, -1, 50,
+ 51, -1, 50, 52, -1, 50, 53, -1,
+ 50, 54, -1, 50, 55, -1, 50, 56,
+ -1, 50, 57, -1, 51, 48, -1, 51,
+ 49, -1, 51, 50, -1, 51, 51, -1,
+ 51, 52, -1, 51, 53, -1, 4352, 4449,
+ -1, 4354, 4449, -1, 4355, 4449, -1, 4357,
+ 4449, -1, 4358, 4449, -1, 4359, 4449, -1,
+ 4361, 4449, -1, 4363, 4449, -1, 4364, 4449,
+ -1, 4366, 4449, -1, 4367, 4449, -1, 4368,
+ 4449, -1, 4369, 4449, -1, 4370, 4449, -1,
+ 4366, 4449, 4535, 4352, 4457, -1, 4364, 4462,
+ 4363, 4468, -1, 4363, 4462, -1, 20116, -1,
+ 20845, -1, 19971, -1, 20061, -1, 26666, -1,
+ 26377, -1, 31038, -1, 21517, -1, 29305, -1,
+ 36001, -1, 31069, -1, 21172, -1, 31192, -1,
+ 30007, -1, 36969, -1, 20778, -1, 21360, -1,
+ 27880, -1, 38917, -1, 20241, -1, 20889, -1,
+ 27491, -1, 24038, -1, 21491, -1, 21307, -1,
+ 23447, -1, 23398, -1, 30435, -1, 20225, -1,
+ 36039, -1, 21332, -1, 22812, -1, 51, 54,
+ -1, 51, 55, -1, 51, 56, -1, 51,
+ 57, -1, 52, 48, -1, 52, 49, -1,
+ 52, 50, -1, 52, 51, -1, 52, 52,
+ -1, 52, 53, -1, 52, 54, -1, 52,
+ 55, -1, 52, 56, -1, 52, 57, -1,
+ 53, 48, -1, 49, 26376, -1, 50, 26376,
+ -1, 51, 26376, -1, 52, 26376, -1, 53,
+ 26376, -1, 54, 26376, -1, 55, 26376, -1,
+ 56, 26376, -1, 57, 26376, -1, 49, 48,
+ 26376, -1, 49, 49, 26376, -1, 49, 50,
+ 26376, -1, 72, 103, -1, 101, 114, 103,
+ -1, 101, 86, -1, 76, 84, 68, -1,
+ 12450, -1, 12452, -1, 12454, -1, 12456, -1,
+ 12458, -1, 12459, -1, 12461, -1, 12463, -1,
+ 12465, -1, 12467, -1, 12469, -1, 12471, -1,
+ 12473, -1, 12475, -1, 12477, -1, 12479, -1,
+ 12481, -1, 12484, -1, 12486, -1, 12488, -1,
+ 12490, -1, 12491, -1, 12492, -1, 12493, -1,
+ 12494, -1, 12495, -1, 12498, -1, 12501, -1,
+ 12504, -1, 12507, -1, 12510, -1, 12511, -1,
+ 12512, -1, 12513, -1, 12514, -1, 12516, -1,
+ 12518, -1, 12520, -1, 12521, -1, 12522, -1,
+ 12523, -1, 12524, -1, 12525, -1, 12527, -1,
+ 12528, -1, 12529, -1, 12530, -1, 12450, 12497,
+ 12540, 12488, -1, 12450, 12523, 12501, 12449, -1,
+ 12450, 12531, 12506, 12450, -1, 12450, 12540, 12523,
+ -1, 12452, 12491, 12531, 12464, -1, 12452, 12531,
+ 12481, -1, 12454, 12457, 12531, -1, 12456, 12473,
+ 12463, 12540, 12489, -1, 12456, 12540, 12459, 12540,
+ -1, 12458, 12531, 12473, -1, 12458, 12540, 12512,
+ -1, 12459, 12452, 12522, -1, 12459, 12521, 12483,
+ 12488, -1, 12459, 12525, 12522, 12540, -1, 12460,
+ 12525, 12531, -1, 12460, 12531, 12510, -1, 12462,
+ 12460, -1, 12462, 12491, 12540, -1, 12461, 12517,
+ 12522, 12540, -1, 12462, 12523, 12480, 12540, -1,
+ 12461, 12525, -1, 12461, 12525, 12464, 12521, 12512,
+ -1, 12461, 12525, 12513, 12540, 12488, 12523, -1,
+ 12461, 12525, 12527, 12483, 12488, -1, 12464, 12521,
+ 12512, -1, 12464, 12521, 12512, 12488, 12531, -1,
+ 12463, 12523, 12476, 12452, 12525, -1, 12463, 12525,
+ 12540, 12493, -1, 12465, 12540, 12473, -1, 12467,
+ 12523, 12490, -1, 12467, 12540, 12509, -1, 12469,
+ 12452, 12463, 12523, -1, 12469, 12531, 12481, 12540,
+ 12512, -1, 12471, 12522, 12531, 12464, -1, 12475,
+ 12531, 12481, -1, 12475, 12531, 12488, -1, 12480,
+ 12540, 12473, -1, 12487, 12471, -1, 12489, 12523,
+ -1, 12488, 12531, -1, 12490, 12494, -1, 12494,
+ 12483, 12488, -1, 12495, 12452, 12484, -1, 12497,
+ 12540, 12475, 12531, 12488, -1, 12497, 12540, 12484,
+ -1, 12496, 12540, 12524, 12523, -1, 12500, 12450,
+ 12473, 12488, 12523, -1, 12500, 12463, 12523, -1,
+ 12500, 12467, -1, 12499, 12523, -1, 12501, 12449,
+ 12521, 12483, 12489, -1, 12501, 12451, 12540, 12488,
+ -1, 12502, 12483, 12471, 12455, 12523, -1, 12501,
+ 12521, 12531, -1, 12504, 12463, 12479, 12540, 12523,
+ -1, 12506, 12477, -1, 12506, 12491, 12498, -1,
+ 12504, 12523, 12484, -1, 12506, 12531, 12473, -1,
+ 12506, 12540, 12472, -1, 12505, 12540, 12479, -1,
+ 12509, 12452, 12531, 12488, -1, 12508, 12523, 12488,
+ -1, 12507, 12531, -1, 12509, 12531, 12489, -1,
+ 12507, 12540, 12523, -1, 12507, 12540, 12531, -1,
+ 12510, 12452, 12463, 12525, -1, 12510, 12452, 12523,
+ -1, 12510, 12483, 12495, -1, 12510, 12523, 12463,
+ -1, 12510, 12531, 12471, 12519, 12531, -1, 12511,
+ 12463, 12525, 12531, -1, 12511, 12522, -1, 12511,
+ 12522, 12496, 12540, 12523, -1, 12513, 12460, -1,
+ 12513, 12460, 12488, 12531, -1, 12513, 12540, 12488,
+ 12523, -1, 12516, 12540, 12489, -1, 12516, 12540,
+ 12523, -1, 12518, 12450, 12531, -1, 12522, 12483,
+ 12488, 12523, -1, 12522, 12521, -1, 12523, 12500,
+ 12540, -1, 12523, 12540, 12502, 12523, -1, 12524,
+ 12512, -1, 12524, 12531, 12488, 12466, 12531, -1,
+ 12527, 12483, 12488, -1, 48, 28857, -1, 49,
+ 28857, -1, 50, 28857, -1, 51, 28857, -1,
+ 52, 28857, -1, 53, 28857, -1, 54, 28857,
+ -1, 55, 28857, -1, 56, 28857, -1, 57,
+ 28857, -1, 49, 48, 28857, -1, 49, 49,
+ 28857, -1, 49, 50, 28857, -1, 49, 51,
+ 28857, -1, 49, 52, 28857, -1, 49, 53,
+ 28857, -1, 49, 54, 28857, -1, 49, 55,
+ 28857, -1, 49, 56, 28857, -1, 49, 57,
+ 28857, -1, 50, 48, 28857, -1, 50, 49,
+ 28857, -1, 50, 50, 28857, -1, 50, 51,
+ 28857, -1, 50, 52, 28857, -1, 104, 80,
+ 97, -1, 100, 97, -1, 65, 85, -1,
+ 98, 97, 114, -1, 111, 86, -1, 112,
+ 99, -1, 100, 109, -1, 100, 109, 178,
+ -1, 100, 109, 179, -1, 73, 85, -1,
+ 24179, 25104, -1, 26157, 21644, -1, 22823, 27491,
+ -1, 26126, 27835, -1, 26666, 24335, 20250, 31038,
+ -1, 112, 65, -1, 110, 65, -1, 956,
+ 65, -1, 109, 65, -1, 107, 65, -1,
+ 75, 66, -1, 77, 66, -1, 71, 66,
+ -1, 99, 97, 108, -1, 107, 99, 97,
+ 108, -1, 112, 70, -1, 110, 70, -1,
+ 956, 70, -1, 956, 103, -1, 109, 103,
+ -1, 107, 103, -1, 72, 122, -1, 107,
+ 72, 122, -1, 77, 72, 122, -1, 71,
+ 72, 122, -1, 84, 72, 122, -1, 956,
+ 8467, -1, 109, 8467, -1, 100, 8467, -1,
+ 107, 8467, -1, 102, 109, -1, 110, 109,
+ -1, 956, 109, -1, 109, 109, -1, 99,
+ 109, -1, 107, 109, -1, 109, 109, 178,
+ -1, 99, 109, 178, -1, 109, 178, -1,
+ 107, 109, 178, -1, 109, 109, 179, -1,
+ 99, 109, 179, -1, 109, 179, -1, 107,
+ 109, 179, -1, 109, 8725, 115, -1, 109,
+ 8725, 115, 178, -1, 80, 97, -1, 107,
+ 80, 97, -1, 77, 80, 97, -1, 71,
+ 80, 97, -1, 114, 97, 100, -1, 114,
+ 97, 100, 8725, 115, -1, 114, 97, 100,
+ 8725, 115, 178, -1, 112, 115, -1, 110,
+ 115, -1, 956, 115, -1, 109, 115, -1,
+ 112, 86, -1, 110, 86, -1, 956, 86,
+ -1, 109, 86, -1, 107, 86, -1, 77,
+ 86, -1, 112, 87, -1, 110, 87, -1,
+ 956, 87, -1, 109, 87, -1, 107, 87,
+ -1, 77, 87, -1, 107, 937, -1, 77,
+ 937, -1, 97, 46, 109, 46, -1, 66,
+ 113, -1, 99, 99, -1, 99, 100, -1,
+ 67, 8725, 107, 103, -1, 67, 111, 46,
+ -1, 100, 66, -1, 71, 121, -1, 104,
+ 97, -1, 72, 80, -1, 105, 110, -1,
+ 75, 75, -1, 75, 77, -1, 107, 116,
+ -1, 108, 109, -1, 108, 110, -1, 108,
+ 111, 103, -1, 108, 120, -1, 109, 98,
+ -1, 109, 105, 108, -1, 109, 111, 108,
+ -1, 80, 72, -1, 112, 46, 109, 46,
+ -1, 80, 80, 77, -1, 80, 82, -1,
+ 115, 114, -1, 83, 118, -1, 87, 98,
+ -1, 86, 8725, 109, -1, 65, 8725, 109,
+ -1, 49, 26085, -1, 50, 26085, -1, 51,
+ 26085, -1, 52, 26085, -1, 53, 26085, -1,
+ 54, 26085, -1, 55, 26085, -1, 56, 26085,
+ -1, 57, 26085, -1, 49, 48, 26085, -1,
+ 49, 49, 26085, -1, 49, 50, 26085, -1,
+ 49, 51, 26085, -1, 49, 52, 26085, -1,
+ 49, 53, 26085, -1, 49, 54, 26085, -1,
+ 49, 55, 26085, -1, 49, 56, 26085, -1,
+ 49, 57, 26085, -1, 50, 48, 26085, -1,
+ 50, 49, 26085, -1, 50, 50, 26085, -1,
+ 50, 51, 26085, -1, 50, 52, 26085, -1,
+ 50, 53, 26085, -1, 50, 54, 26085, -1,
+ 50, 55, 26085, -1, 50, 56, 26085, -1,
+ 50, 57, 26085, -1, 51, 48, 26085, -1,
+ 51, 49, 26085, -1, 103, 97, 108, -1,
+ 35912, -1, 26356, -1, 36040, -1, 28369, -1,
+ 20018, -1, 21477, -1, 22865, -1, 21895, -1,
+ 22856, -1, 25078, -1, 30313, -1, 32645, -1,
+ 34367, -1, 34746, -1, 35064, -1, 37007, -1,
+ 27138, -1, 27931, -1, 28889, -1, 29662, -1,
+ 33853, -1, 37226, -1, 39409, -1, 20098, -1,
+ 21365, -1, 27396, -1, 29211, -1, 34349, -1,
+ 40478, -1, 23888, -1, 28651, -1, 34253, -1,
+ 35172, -1, 25289, -1, 33240, -1, 34847, -1,
+ 24266, -1, 26391, -1, 28010, -1, 29436, -1,
+ 37070, -1, 20358, -1, 20919, -1, 21214, -1,
+ 25796, -1, 27347, -1, 29200, -1, 30439, -1,
+ 34310, -1, 34396, -1, 36335, -1, 38706, -1,
+ 39791, -1, 40442, -1, 30860, -1, 31103, -1,
+ 32160, -1, 33737, -1, 37636, -1, 35542, -1,
+ 22751, -1, 24324, -1, 31840, -1, 32894, -1,
+ 29282, -1, 30922, -1, 36034, -1, 38647, -1,
+ 22744, -1, 23650, -1, 27155, -1, 28122, -1,
+ 28431, -1, 32047, -1, 32311, -1, 38475, -1,
+ 21202, -1, 32907, -1, 20956, -1, 20940, -1,
+ 31260, -1, 32190, -1, 33777, -1, 38517, -1,
+ 35712, -1, 25295, -1, 35582, -1, 20025, -1,
+ 23527, -1, 24594, -1, 29575, -1, 30064, -1,
+ 21271, -1, 30971, -1, 20415, -1, 24489, -1,
+ 19981, -1, 27852, -1, 25976, -1, 32034, -1,
+ 21443, -1, 22622, -1, 30465, -1, 33865, -1,
+ 35498, -1, 27578, -1, 27784, -1, 25342, -1,
+ 33509, -1, 25504, -1, 30053, -1, 20142, -1,
+ 20841, -1, 20937, -1, 26753, -1, 31975, -1,
+ 33391, -1, 35538, -1, 37327, -1, 21237, -1,
+ 21570, -1, 24300, -1, 26053, -1, 28670, -1,
+ 31018, -1, 38317, -1, 39530, -1, 40599, -1,
+ 40654, -1, 26310, -1, 27511, -1, 36706, -1,
+ 24180, -1, 24976, -1, 25088, -1, 25754, -1,
+ 28451, -1, 29001, -1, 29833, -1, 31178, -1,
+ 32244, -1, 32879, -1, 36646, -1, 34030, -1,
+ 36899, -1, 37706, -1, 21015, -1, 21155, -1,
+ 21693, -1, 28872, -1, 35010, -1, 24265, -1,
+ 24565, -1, 25467, -1, 27566, -1, 31806, -1,
+ 29557, -1, 20196, -1, 22265, -1, 23994, -1,
+ 24604, -1, 29618, -1, 29801, -1, 32666, -1,
+ 32838, -1, 37428, -1, 38646, -1, 38728, -1,
+ 38936, -1, 20363, -1, 31150, -1, 37300, -1,
+ 38584, -1, 24801, -1, 20102, -1, 20698, -1,
+ 23534, -1, 23615, -1, 26009, -1, 29134, -1,
+ 30274, -1, 34044, -1, 36988, -1, 26248, -1,
+ 38446, -1, 21129, -1, 26491, -1, 26611, -1,
+ 27969, -1, 28316, -1, 29705, -1, 30041, -1,
+ 30827, -1, 32016, -1, 39006, -1, 25134, -1,
+ 38520, -1, 20523, -1, 23833, -1, 28138, -1,
+ 36650, -1, 24459, -1, 24900, -1, 26647, -1,
+ 38534, -1, 21033, -1, 21519, -1, 23653, -1,
+ 26131, -1, 26446, -1, 26792, -1, 27877, -1,
+ 29702, -1, 30178, -1, 32633, -1, 35023, -1,
+ 35041, -1, 38626, -1, 21311, -1, 28346, -1,
+ 21533, -1, 29136, -1, 29848, -1, 34298, -1,
+ 38563, -1, 40023, -1, 40607, -1, 26519, -1,
+ 28107, -1, 33256, -1, 31520, -1, 31890, -1,
+ 29376, -1, 28825, -1, 35672, -1, 20160, -1,
+ 33590, -1, 21050, -1, 20999, -1, 24230, -1,
+ 25299, -1, 31958, -1, 23429, -1, 27934, -1,
+ 26292, -1, 36667, -1, 38477, -1, 24275, -1,
+ 20800, -1, 21952, -1, 22618, -1, 26228, -1,
+ 20958, -1, 29482, -1, 30410, -1, 31036, -1,
+ 31070, -1, 31077, -1, 31119, -1, 38742, -1,
+ 31934, -1, 34322, -1, 35576, -1, 36920, -1,
+ 37117, -1, 39151, -1, 39164, -1, 39208, -1,
+ 40372, -1, 20398, -1, 20711, -1, 20813, -1,
+ 21193, -1, 21220, -1, 21329, -1, 21917, -1,
+ 22022, -1, 22120, -1, 22592, -1, 22696, -1,
+ 23652, -1, 24724, -1, 24936, -1, 24974, -1,
+ 25074, -1, 25935, -1, 26082, -1, 26257, -1,
+ 26757, -1, 28023, -1, 28186, -1, 28450, -1,
+ 29038, -1, 29227, -1, 29730, -1, 30865, -1,
+ 31049, -1, 31048, -1, 31056, -1, 31062, -1,
+ 31117, -1, 31118, -1, 31296, -1, 31361, -1,
+ 31680, -1, 32265, -1, 32321, -1, 32626, -1,
+ 32773, -1, 33261, -1, 33401, -1, 33879, -1,
+ 35088, -1, 35222, -1, 35585, -1, 35641, -1,
+ 36051, -1, 36104, -1, 36790, -1, 38627, -1,
+ 38911, -1, 38971, -1, 20006, -1, 20917, -1,
+ 20840, -1, 20352, -1, 20805, -1, 20864, -1,
+ 21191, -1, 21242, -1, 21845, -1, 21913, -1,
+ 21986, -1, 22707, -1, 22852, -1, 22868, -1,
+ 23138, -1, 23336, -1, 24274, -1, 24281, -1,
+ 24425, -1, 24493, -1, 24792, -1, 24910, -1,
+ 24840, -1, 24928, -1, 25140, -1, 25540, -1,
+ 25628, -1, 25682, -1, 25942, -1, 26395, -1,
+ 26454, -1, 28379, -1, 28363, -1, 28702, -1,
+ 30631, -1, 29237, -1, 29359, -1, 29809, -1,
+ 29958, -1, 30011, -1, 30237, -1, 30239, -1,
+ 30427, -1, 30452, -1, 30538, -1, 30528, -1,
+ 30924, -1, 31409, -1, 31867, -1, 32091, -1,
+ 32574, -1, 33618, -1, 33775, -1, 34681, -1,
+ 35137, -1, 35206, -1, 35519, -1, 35531, -1,
+ 35565, -1, 35722, -1, 36664, -1, 36978, -1,
+ 37273, -1, 37494, -1, 38524, -1, 38875, -1,
+ 38923, -1, 39698, -1, 141386, -1, 141380, -1,
+ 144341, -1, 15261, -1, 16408, -1, 16441, -1,
+ 152137, -1, 154832, -1, 163539, -1, 40771, -1,
+ 40846, -1, 102, 102, -1, 102, 105, -1,
+ 102, 108, -1, 102, 102, 105, -1, 102,
+ 102, 108, -1, 383, 116, -1, 115, 116,
+ -1, 1396, 1398, -1, 1396, 1381, -1, 1396,
+ 1387, -1, 1406, 1398, -1, 1396, 1389, -1,
+ 1497, 1460, -1, 1522, 1463, -1, 1506, -1,
+ 1492, -1, 1499, -1, 1500, -1, 1501, -1,
+ 1512, -1, 1514, -1, 1513, 1473, -1, 1513,
+ 1474, -1, 64329, 1473, -1, 64329, 1474, -1,
+ 1488, 1463, -1, 1488, 1464, -1, 1488, 1468,
+ -1, 1489, 1468, -1, 1490, 1468, -1, 1491,
+ 1468, -1, 1492, 1468, -1, 1493, 1468, -1,
+ 1494, 1468, -1, 1496, 1468, -1, 1497, 1468,
+ -1, 1498, 1468, -1, 1499, 1468, -1, 1500,
+ 1468, -1, 1502, 1468, -1, 1504, 1468, -1,
+ 1505, 1468, -1, 1507, 1468, -1, 1508, 1468,
+ -1, 1510, 1468, -1, 1511, 1468, -1, 1512,
+ 1468, -1, 1513, 1468, -1, 1514, 1468, -1,
+ 1493, 1465, -1, 1489, 1471, -1, 1499, 1471,
+ -1, 1508, 1471, -1, 1488, 1500, -1, 1649,
+ -1, 1659, -1, 1662, -1, 1664, -1, 1658,
+ -1, 1663, -1, 1657, -1, 1700, -1, 1702,
+ -1, 1668, -1, 1667, -1, 1670, -1, 1671,
+ -1, 1677, -1, 1676, -1, 1678, -1, 1672,
+ -1, 1688, -1, 1681, -1, 1705, -1, 1711,
+ -1, 1715, -1, 1713, -1, 1722, -1, 1723,
+ -1, 1728, -1, 1729, -1, 1726, -1, 1746,
+ -1, 1747, -1, 1709, -1, 1735, -1, 1734,
+ -1, 1736, -1, 1655, -1, 1739, -1, 1733,
+ -1, 1737, -1, 1744, -1, 1609, -1, 1574,
+ 1575, -1, 1574, 1749, -1, 1574, 1608, -1,
+ 1574, 1735, -1, 1574, 1734, -1, 1574, 1736,
+ -1, 1574, 1744, -1, 1574, 1609, -1, 1740,
+ -1, 1574, 1580, -1, 1574, 1581, -1, 1574,
+ 1605, -1, 1574, 1610, -1, 1576, 1580, -1,
+ 1576, 1581, -1, 1576, 1582, -1, 1576, 1605,
+ -1, 1576, 1609, -1, 1576, 1610, -1, 1578,
+ 1580, -1, 1578, 1581, -1, 1578, 1582, -1,
+ 1578, 1605, -1, 1578, 1609, -1, 1578, 1610,
+ -1, 1579, 1580, -1, 1579, 1605, -1, 1579,
+ 1609, -1, 1579, 1610, -1, 1580, 1581, -1,
+ 1580, 1605, -1, 1581, 1580, -1, 1581, 1605,
+ -1, 1582, 1580, -1, 1582, 1581, -1, 1582,
+ 1605, -1, 1587, 1580, -1, 1587, 1581, -1,
+ 1587, 1582, -1, 1587, 1605, -1, 1589, 1581,
+ -1, 1589, 1605, -1, 1590, 1580, -1, 1590,
+ 1581, -1, 1590, 1582, -1, 1590, 1605, -1,
+ 1591, 1581, -1, 1591, 1605, -1, 1592, 1605,
+ -1, 1593, 1580, -1, 1593, 1605, -1, 1594,
+ 1580, -1, 1594, 1605, -1, 1601, 1580, -1,
+ 1601, 1581, -1, 1601, 1582, -1, 1601, 1605,
+ -1, 1601, 1609, -1, 1601, 1610, -1, 1602,
+ 1581, -1, 1602, 1605, -1, 1602, 1609, -1,
+ 1602, 1610, -1, 1603, 1575, -1, 1603, 1580,
+ -1, 1603, 1581, -1, 1603, 1582, -1, 1603,
+ 1604, -1, 1603, 1605, -1, 1603, 1609, -1,
+ 1603, 1610, -1, 1604, 1580, -1, 1604, 1581,
+ -1, 1604, 1582, -1, 1604, 1605, -1, 1604,
+ 1609, -1, 1604, 1610, -1, 1605, 1580, -1,
+ 1605, 1581, -1, 1605, 1582, -1, 1605, 1605,
+ -1, 1605, 1609, -1, 1605, 1610, -1, 1606,
+ 1580, -1, 1606, 1581, -1, 1606, 1582, -1,
+ 1606, 1605, -1, 1606, 1609, -1, 1606, 1610,
+ -1, 1607, 1580, -1, 1607, 1605, -1, 1607,
+ 1609, -1, 1607, 1610, -1, 1610, 1580, -1,
+ 1610, 1581, -1, 1610, 1582, -1, 1610, 1605,
+ -1, 1610, 1609, -1, 1610, 1610, -1, 1584,
+ 1648, -1, 1585, 1648, -1, 1609, 1648, -1,
+ 32, 1612, 1617, -1, 32, 1613, 1617, -1,
+ 32, 1614, 1617, -1, 32, 1615, 1617, -1,
+ 32, 1616, 1617, -1, 32, 1617, 1648, -1,
+ 1574, 1585, -1, 1574, 1586, -1, 1574, 1606,
+ -1, 1576, 1585, -1, 1576, 1586, -1, 1576,
+ 1606, -1, 1578, 1585, -1, 1578, 1586, -1,
+ 1578, 1606, -1, 1579, 1585, -1, 1579, 1586,
+ -1, 1579, 1606, -1, 1605, 1575, -1, 1606,
+ 1585, -1, 1606, 1586, -1, 1606, 1606, -1,
+ 1610, 1585, -1, 1610, 1586, -1, 1610, 1606,
+ -1, 1574, 1582, -1, 1574, 1607, -1, 1576,
+ 1607, -1, 1578, 1607, -1, 1589, 1582, -1,
+ 1604, 1607, -1, 1606, 1607, -1, 1607, 1648,
+ -1, 1610, 1607, -1, 1579, 1607, -1, 1587,
+ 1607, -1, 1588, 1605, -1, 1588, 1607, -1,
+ 1600, 1614, 1617, -1, 1600, 1615, 1617, -1,
+ 1600, 1616, 1617, -1, 1591, 1609, -1, 1591,
+ 1610, -1, 1593, 1609, -1, 1593, 1610, -1,
+ 1594, 1609, -1, 1594, 1610, -1, 1587, 1609,
+ -1, 1587, 1610, -1, 1588, 1609, -1, 1588,
+ 1610, -1, 1581, 1609, -1, 1581, 1610, -1,
+ 1580, 1609, -1, 1580, 1610, -1, 1582, 1609,
+ -1, 1582, 1610, -1, 1589, 1609, -1, 1589,
+ 1610, -1, 1590, 1609, -1, 1590, 1610, -1,
+ 1588, 1580, -1, 1588, 1581, -1, 1588, 1582,
+ -1, 1588, 1585, -1, 1587, 1585, -1, 1589,
+ 1585, -1, 1590, 1585, -1, 1575, 1611, -1,
+ 1578, 1580, 1605, -1, 1578, 1581, 1580, -1,
+ 1578, 1581, 1605, -1, 1578, 1582, 1605, -1,
+ 1578, 1605, 1580, -1, 1578, 1605, 1581, -1,
+ 1578, 1605, 1582, -1, 1580, 1605, 1581, -1,
+ 1581, 1605, 1610, -1, 1581, 1605, 1609, -1,
+ 1587, 1581, 1580, -1, 1587, 1580, 1581, -1,
+ 1587, 1580, 1609, -1, 1587, 1605, 1581, -1,
+ 1587, 1605, 1580, -1, 1587, 1605, 1605, -1,
+ 1589, 1581, 1581, -1, 1589, 1605, 1605, -1,
+ 1588, 1581, 1605, -1, 1588, 1580, 1610, -1,
+ 1588, 1605, 1582, -1, 1588, 1605, 1605, -1,
+ 1590, 1581, 1609, -1, 1590, 1582, 1605, -1,
+ 1591, 1605, 1581, -1, 1591, 1605, 1605, -1,
+ 1591, 1605, 1610, -1, 1593, 1580, 1605, -1,
+ 1593, 1605, 1605, -1, 1593, 1605, 1609, -1,
+ 1594, 1605, 1605, -1, 1594, 1605, 1610, -1,
+ 1594, 1605, 1609, -1, 1601, 1582, 1605, -1,
+ 1602, 1605, 1581, -1, 1602, 1605, 1605, -1,
+ 1604, 1581, 1605, -1, 1604, 1581, 1610, -1,
+ 1604, 1581, 1609, -1, 1604, 1580, 1580, -1,
+ 1604, 1582, 1605, -1, 1604, 1605, 1581, -1,
+ 1605, 1581, 1580, -1, 1605, 1581, 1605, -1,
+ 1605, 1581, 1610, -1, 1605, 1580, 1581, -1,
+ 1605, 1580, 1605, -1, 1605, 1582, 1580, -1,
+ 1605, 1582, 1605, -1, 1605, 1580, 1582, -1,
+ 1607, 1605, 1580, -1, 1607, 1605, 1605, -1,
+ 1606, 1581, 1605, -1, 1606, 1581, 1609, -1,
+ 1606, 1580, 1605, -1, 1606, 1580, 1609, -1,
+ 1606, 1605, 1610, -1, 1606, 1605, 1609, -1,
+ 1610, 1605, 1605, -1, 1576, 1582, 1610, -1,
+ 1578, 1580, 1610, -1, 1578, 1580, 1609, -1,
+ 1578, 1582, 1610, -1, 1578, 1582, 1609, -1,
+ 1578, 1605, 1610, -1, 1578, 1605, 1609, -1,
+ 1580, 1605, 1610, -1, 1580, 1581, 1609, -1,
+ 1580, 1605, 1609, -1, 1587, 1582, 1609, -1,
+ 1589, 1581, 1610, -1, 1588, 1581, 1610, -1,
+ 1590, 1581, 1610, -1, 1604, 1580, 1610, -1,
+ 1604, 1605, 1610, -1, 1610, 1581, 1610, -1,
+ 1610, 1580, 1610, -1, 1610, 1605, 1610, -1,
+ 1605, 1605, 1610, -1, 1602, 1605, 1610, -1,
+ 1606, 1581, 1610, -1, 1593, 1605, 1610, -1,
+ 1603, 1605, 1610, -1, 1606, 1580, 1581, -1,
+ 1605, 1582, 1610, -1, 1604, 1580, 1605, -1,
+ 1603, 1605, 1605, -1, 1580, 1581, 1610, -1,
+ 1581, 1580, 1610, -1, 1605, 1580, 1610, -1,
+ 1601, 1605, 1610, -1, 1576, 1581, 1610, -1,
+ 1587, 1582, 1610, -1, 1606, 1580, 1610, -1,
+ 1589, 1604, 1746, -1, 1602, 1604, 1746, -1,
+ 1575, 1604, 1604, 1607, -1, 1575, 1603, 1576,
+ 1585, -1, 1605, 1581, 1605, 1583, -1, 1589,
+ 1604, 1593, 1605, -1, 1585, 1587, 1608, 1604,
+ -1, 1593, 1604, 1610, 1607, -1, 1608, 1587,
+ 1604, 1605, -1, 1589, 1604, 1609, -1, 1589,
+ 1604, 1609, 32, 1575, 1604, 1604, 1607, 32,
+ 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604,
+ 1605, -1, 1580, 1604, 32, 1580, 1604, 1575,
+ 1604, 1607, -1, 1585, 1740, 1575, 1604, -1,
+ 44, -1, 12289, -1, 12290, -1, 58, -1,
+ 33, -1, 63, -1, 12310, -1, 12311, -1,
+ 8230, -1, 8229, -1, 8212, -1, 8211, -1,
+ 95, -1, 123, -1, 125, -1, 12308, -1,
+ 12309, -1, 12304, -1, 12305, -1, 12298, -1,
+ 12299, -1, 12300, -1, 12301, -1, 12302, -1,
+ 12303, -1, 91, -1, 93, -1, 8254, -1,
+ 35, -1, 38, -1, 42, -1, 45, -1,
+ 60, -1, 62, -1, 92, -1, 36, -1,
+ 37, -1, 64, -1, 32, 1611, -1, 1600,
+ 1611, -1, 32, 1612, -1, 32, 1613, -1,
+ 32, 1614, -1, 1600, 1614, -1, 32, 1615,
+ -1, 1600, 1615, -1, 32, 1616, -1, 1600,
+ 1616, -1, 32, 1617, -1, 1600, 1617, -1,
+ 32, 1618, -1, 1600, 1618, -1, 1569, -1,
+ 1570, -1, 1571, -1, 1572, -1, 1573, -1,
+ 1574, -1, 1575, -1, 1576, -1, 1577, -1,
+ 1578, -1, 1579, -1, 1580, -1, 1581, -1,
+ 1582, -1, 1583, -1, 1584, -1, 1585, -1,
+ 1586, -1, 1587, -1, 1588, -1, 1589, -1,
+ 1590, -1, 1591, -1, 1592, -1, 1593, -1,
+ 1594, -1, 1601, -1, 1602, -1, 1603, -1,
+ 1604, -1, 1605, -1, 1606, -1, 1607, -1,
+ 1608, -1, 1610, -1, 1604, 1570, -1, 1604,
+ 1571, -1, 1604, 1573, -1, 1604, 1575, -1,
+ 34, -1, 39, -1, 47, -1, 65345, -1,
+ 65346, -1, 65347, -1, 65348, -1, 65349, -1,
+ 65350, -1, 65351, -1, 65352, -1, 65353, -1,
+ 65354, -1, 65355, -1, 65356, -1, 65357, -1,
+ 65358, -1, 65359, -1, 65360, -1, 65361, -1,
+ 65362, -1, 65363, -1, 65364, -1, 65365, -1,
+ 65366, -1, 65367, -1, 65368, -1, 65369, -1,
+ 65370, -1, 94, -1, 124, -1, 126, -1,
+ 10629, -1, 10630, -1, 12539, -1, 12449, -1,
+ 12451, -1, 12453, -1, 12455, -1, 12457, -1,
+ 12515, -1, 12517, -1, 12519, -1, 12483, -1,
+ 12540, -1, 12531, -1, 12441, -1, 12442, -1,
+ 12644, -1, 12593, -1, 12594, -1, 12595, -1,
+ 12596, -1, 12597, -1, 12598, -1, 12599, -1,
+ 12600, -1, 12601, -1, 12602, -1, 12603, -1,
+ 12604, -1, 12605, -1, 12606, -1, 12607, -1,
+ 12608, -1, 12609, -1, 12610, -1, 12611, -1,
+ 12612, -1, 12613, -1, 12614, -1, 12615, -1,
+ 12616, -1, 12617, -1, 12618, -1, 12619, -1,
+ 12620, -1, 12621, -1, 12622, -1, 12623, -1,
+ 12624, -1, 12625, -1, 12626, -1, 12627, -1,
+ 12628, -1, 12629, -1, 12630, -1, 12631, -1,
+ 12632, -1, 12633, -1, 12634, -1, 12635, -1,
+ 12636, -1, 12637, -1, 12638, -1, 12639, -1,
+ 12640, -1, 12641, -1, 12642, -1, 12643, -1,
+ 162, -1, 163, -1, 172, -1, 175, -1,
+ 166, -1, 165, -1, 8361, -1, 9474, -1,
+ 8592, -1, 8593, -1, 8594, -1, 8595, -1,
+ 9632, -1, 9675, -1, 66600, -1, 66601, -1,
+ 66602, -1, 66603, -1, 66604, -1, 66605, -1,
+ 66606, -1, 66607, -1, 66608, -1, 66609, -1,
+ 66610, -1, 66611, -1, 66612, -1, 66613, -1,
+ 66614, -1, 66615, -1, 66616, -1, 66617, -1,
+ 66618, -1, 66619, -1, 66620, -1, 66621, -1,
+ 66622, -1, 66623, -1, 66624, -1, 66625, -1,
+ 66626, -1, 66627, -1, 66628, -1, 66629, -1,
+ 66630, -1, 66631, -1, 66632, -1, 66633, -1,
+ 66634, -1, 66635, -1, 66636, -1, 66637, -1,
+ 66638, -1, 66639, -1, 119127, 119141, -1, 119128,
+ 119141, -1, 119135, 119150, -1, 119135, 119151, -1,
+ 119135, 119152, -1, 119135, 119153, -1, 119135, 119154,
+ -1, 119225, 119141, -1, 119226, 119141, -1, 119227,
+ 119150, -1, 119228, 119150, -1, 119227, 119151, -1,
+ 119228, 119151, -1, 305, -1, 567, -1, 913,
+ -1, 914, -1, 916, -1, 917, -1, 918,
+ -1, 919, -1, 921, -1, 922, -1, 923,
+ -1, 924, -1, 925, -1, 926, -1, 927,
+ -1, 929, -1, 1012, -1, 932, -1, 934,
+ -1, 935, -1, 936, -1, 8711, -1, 8706,
+ -1, 1013, -1, 977, -1, 1008, -1, 981,
+ -1, 1009, -1, 982, -1, 988, -1, 20029,
+ -1, 20024, -1, 20033, -1, 131362, -1, 20320,
+ -1, 20411, -1, 20482, -1, 20602, -1, 20633,
+ -1, 20687, -1, 13470, -1, 132666, -1, 20820,
+ -1, 20836, -1, 20855, -1, 132380, -1, 13497,
+ -1, 20839, -1, 20877, -1, 132427, -1, 20887,
+ -1, 20900, -1, 20172, -1, 20908, -1, 168415,
+ -1, 20995, -1, 13535, -1, 21051, -1, 21062,
+ -1, 21106, -1, 21111, -1, 13589, -1, 21253,
+ -1, 21254, -1, 21321, -1, 21338, -1, 21363,
+ -1, 21373, -1, 21375, -1, 133676, -1, 28784,
+ -1, 21450, -1, 21471, -1, 133987, -1, 21483,
+ -1, 21489, -1, 21510, -1, 21662, -1, 21560,
+ -1, 21576, -1, 21608, -1, 21666, -1, 21750,
+ -1, 21776, -1, 21843, -1, 21859, -1, 21892,
+ -1, 21931, -1, 21939, -1, 21954, -1, 22294,
+ -1, 22295, -1, 22097, -1, 22132, -1, 22766,
+ -1, 22478, -1, 22516, -1, 22541, -1, 22411,
+ -1, 22578, -1, 22577, -1, 22700, -1, 136420,
+ -1, 22770, -1, 22775, -1, 22790, -1, 22810,
+ -1, 22818, -1, 22882, -1, 136872, -1, 136938,
+ -1, 23020, -1, 23067, -1, 23079, -1, 23000,
+ -1, 23142, -1, 14062, -1, 14076, -1, 23304,
+ -1, 23358, -1, 137672, -1, 23491, -1, 23512,
+ -1, 23539, -1, 138008, -1, 23551, -1, 23558,
+ -1, 24403, -1, 14209, -1, 23648, -1, 23744,
+ -1, 23693, -1, 138724, -1, 23875, -1, 138726,
+ -1, 23918, -1, 23915, -1, 23932, -1, 24033,
+ -1, 24034, -1, 14383, -1, 24061, -1, 24104,
+ -1, 24125, -1, 24169, -1, 14434, -1, 139651,
+ -1, 14460, -1, 24240, -1, 24243, -1, 24246,
+ -1, 172946, -1, 140081, -1, 33281, -1, 24354,
+ -1, 14535, -1, 144056, -1, 156122, -1, 24418,
+ -1, 24427, -1, 14563, -1, 24474, -1, 24525,
+ -1, 24535, -1, 24569, -1, 24705, -1, 14650,
+ -1, 14620, -1, 141012, -1, 24775, -1, 24904,
+ -1, 24908, -1, 24954, -1, 25010, -1, 24996,
+ -1, 25007, -1, 25054, -1, 25104, -1, 25115,
+ -1, 25181, -1, 25265, -1, 25300, -1, 25424,
+ -1, 142092, -1, 25405, -1, 25340, -1, 25448,
+ -1, 25475, -1, 25572, -1, 142321, -1, 25634,
+ -1, 25541, -1, 25513, -1, 14894, -1, 25705,
+ -1, 25726, -1, 25757, -1, 25719, -1, 14956,
+ -1, 25964, -1, 143370, -1, 26083, -1, 26360,
+ -1, 26185, -1, 15129, -1, 15112, -1, 15076,
+ -1, 20882, -1, 20885, -1, 26368, -1, 26268,
+ -1, 32941, -1, 17369, -1, 26401, -1, 26462,
+ -1, 26451, -1, 144323, -1, 15177, -1, 26618,
+ -1, 26501, -1, 26706, -1, 144493, -1, 26766,
+ -1, 26655, -1, 26900, -1, 26946, -1, 27043,
+ -1, 27114, -1, 27304, -1, 145059, -1, 27355,
+ -1, 15384, -1, 27425, -1, 145575, -1, 27476,
+ -1, 15438, -1, 27506, -1, 27551, -1, 27579,
+ -1, 146061, -1, 138507, -1, 146170, -1, 27726,
+ -1, 146620, -1, 27839, -1, 27853, -1, 27751,
+ -1, 27926, -1, 27966, -1, 28009, -1, 28024,
+ -1, 28037, -1, 146718, -1, 27956, -1, 28207,
+ -1, 28270, -1, 15667, -1, 28359, -1, 147153,
+ -1, 28153, -1, 28526, -1, 147294, -1, 147342,
+ -1, 28614, -1, 28729, -1, 28699, -1, 15766,
+ -1, 28746, -1, 28797, -1, 28791, -1, 28845,
+ -1, 132389, -1, 28997, -1, 148067, -1, 29084,
+ -1, 148395, -1, 29224, -1, 29264, -1, 149000,
+ -1, 29312, -1, 29333, -1, 149301, -1, 149524,
+ -1, 29562, -1, 29579, -1, 16044, -1, 29605,
+ -1, 16056, -1, 29767, -1, 29788, -1, 29829,
+ -1, 29898, -1, 16155, -1, 29988, -1, 150582,
+ -1, 30014, -1, 150674, -1, 139679, -1, 30224,
+ -1, 151457, -1, 151480, -1, 151620, -1, 16380,
+ -1, 16392, -1, 151795, -1, 151794, -1, 151833,
+ -1, 151859, -1, 30494, -1, 30495, -1, 30603,
+ -1, 16454, -1, 16534, -1, 152605, -1, 30798,
+ -1, 16611, -1, 153126, -1, 153242, -1, 153285,
+ -1, 31211, -1, 16687, -1, 31306, -1, 31311,
+ -1, 153980, -1, 154279, -1, 31470, -1, 16898,
+ -1, 154539, -1, 31686, -1, 31689, -1, 16935,
+ -1, 154752, -1, 31954, -1, 17056, -1, 31976,
+ -1, 31971, -1, 32000, -1, 155526, -1, 32099,
+ -1, 17153, -1, 32199, -1, 32258, -1, 32325,
+ -1, 17204, -1, 156200, -1, 156231, -1, 17241,
+ -1, 156377, -1, 32634, -1, 156478, -1, 32661,
+ -1, 32762, -1, 156890, -1, 156963, -1, 32864,
+ -1, 157096, -1, 32880, -1, 144223, -1, 17365,
+ -1, 32946, -1, 33027, -1, 17419, -1, 33086,
+ -1, 23221, -1, 157607, -1, 157621, -1, 144275,
+ -1, 144284, -1, 33284, -1, 36766, -1, 17515,
+ -1, 33425, -1, 33419, -1, 33437, -1, 21171,
+ -1, 33457, -1, 33459, -1, 33469, -1, 33510,
+ -1, 158524, -1, 33565, -1, 33635, -1, 33709,
+ -1, 33571, -1, 33725, -1, 33767, -1, 33619,
+ -1, 33738, -1, 33740, -1, 33756, -1, 158774,
+ -1, 159083, -1, 158933, -1, 17707, -1, 34033,
+ -1, 34035, -1, 34070, -1, 160714, -1, 34148,
+ -1, 159532, -1, 17757, -1, 17761, -1, 159665,
+ -1, 159954, -1, 17771, -1, 34384, -1, 34407,
+ -1, 34409, -1, 34473, -1, 34440, -1, 34574,
+ -1, 34530, -1, 34600, -1, 34667, -1, 34694,
+ -1, 17879, -1, 34785, -1, 34817, -1, 17913,
+ -1, 34912, -1, 161383, -1, 35031, -1, 35038,
+ -1, 17973, -1, 35066, -1, 13499, -1, 161966,
+ -1, 162150, -1, 18110, -1, 18119, -1, 35488,
+ -1, 162984, -1, 36011, -1, 36033, -1, 36123,
+ -1, 36215, -1, 163631, -1, 133124, -1, 36299,
+ -1, 36284, -1, 36336, -1, 133342, -1, 36564,
+ -1, 165330, -1, 165357, -1, 37012, -1, 37105,
+ -1, 37137, -1, 165678, -1, 37147, -1, 37432,
+ -1, 37591, -1, 37592, -1, 37500, -1, 37881,
+ -1, 37909, -1, 166906, -1, 38283, -1, 18837,
+ -1, 38327, -1, 167287, -1, 18918, -1, 38595,
+ -1, 23986, -1, 38691, -1, 168261, -1, 168474,
+ -1, 19054, -1, 19062, -1, 38880, -1, 168970,
+ -1, 19122, -1, 169110, -1, 38953, -1, 169398,
+ -1, 39138, -1, 19251, -1, 39209, -1, 39335,
+ -1, 39362, -1, 39422, -1, 19406, -1, 170800,
+ -1, 40000, -1, 40189, -1, 19662, -1, 19693,
+ -1, 40295, -1, 172238, -1, 19704, -1, 172293,
+ -1, 172558, -1, 172689, -1, 19798, -1, 40702,
+ -1, 40709, -1, 40719, -1, 40726, -1, 173568,
+ -1, };
+
+UTF8PROC_DATA
+const uint16_t utf8proc_stage1table[] = {
+ 0, 256, 512, 768, 1024, 1280, 1536,
+ 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584,
+ 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632,
+ 5888, 6144, 6400, 6656, 6912, 2048, 7168, 7424,
+ 7680, 7936, 8192, 8448, 8704, 8960, 9216, 9472,
+ 9728, 9984, 10240, 10496, 10752, 11008, 11264, 11520,
+ 11776, 12032, 12288, 12544, 12800, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 13056, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 13312, 13568, 5376, 5376, 5376, 13824, 2048, 2048,
+ 14080, 14336, 2048, 2048, 2048, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 14592, 14848, 14848, 14848, 14848, 14848, 14848, 14848,
+ 14848, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15360, 15616, 15872, 16128, 16384, 16640,
+ 16896, 17152, 17408, 2048, 17664, 17920, 2048, 2048,
+ 2048, 18176, 18432, 18688, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 5376, 5376, 5376, 18944, 19200, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 19456, 19712, 19968, 20224, 20480, 20736, 20992,
+ 21248, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 21504,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 21760, 22016, 22272, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 22528, 22784, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 23040, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 23040, };
+
+UTF8PROC_DATA
+const uint16_t utf8proc_stage2table[] = {
+ 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 3, 2, 4, 3, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 5, 5, 5,
+ 6, 7, 8, 8, 9, 10, 9, 8,
+ 8, 11, 12, 8, 13, 14, 15, 14,
+ 14, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 14, 8, 17, 18, 19,
+ 8, 8, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 11, 8, 12, 46,
+ 47, 46, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 11, 74, 12, 74,
+ 1, 1, 1, 1, 1, 1, 3, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 75, 8, 10, 10, 10, 10, 76,
+ 76, 77, 76, 78, 79, 74, 80, 76,
+ 81, 82, 83, 84, 85, 86, 87, 76,
+ 8, 88, 89, 90, 91, 92, 93, 94,
+ 8, 95, 96, 97, 98, 99, 100, 101,
+ 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117,
+ 74, 118, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140,
+ 141, 142, 143, 144, 145, 146, 147, 148,
+ 74, 149, 150, 151, 152, 153, 154, 155,
+ 156, 157, 158, 159, 160, 161, 162, 163,
+ 164, 165, 166, 167, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 190, 191, 192, 193, 194, 195,
+ 196, 197, 198, 199, 200, 201, 202, 203,
+ 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 218, 219,
+ 220, 221, 222, 223, 224, 225, 226, 227,
+ 228, 229, 230, 231, 232, 233, 234, 235,
+ 236, 237, 238, 239, 240, 241, 242, 243,
+ 244, 245, 246, 247, 248, 249, 250, 251,
+ 252, 253, 254, 255, 256, 257, 258, 259,
+ 260, 261, 262, 263, 264, 265, 266, 267,
+ 268, 269, 270, 271, 272, 273, 274, 275,
+ 276, 277, 278, 279, 280, 281, 282, 283,
+ 284, 285, 286, 287, 288, 289, 290, 291,
+ 292, 293, 294, 295, 296, 297, 213, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306,
+ 307, 308, 309, 310, 213, 311, 312, 313,
+ 314, 315, 316, 317, 318, 319, 320, 321,
+ 322, 323, 324, 213, 213, 325, 326, 327,
+ 328, 329, 330, 331, 332, 333, 334, 335,
+ 336, 337, 338, 213, 339, 340, 341, 213,
+ 342, 339, 339, 339, 339, 343, 344, 345,
+ 346, 347, 348, 349, 350, 351, 352, 353,
+ 354, 355, 356, 357, 358, 359, 360, 361,
+ 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 371, 372, 373, 374, 375, 376, 377,
+ 378, 379, 380, 381, 382, 383, 384, 385,
+ 386, 387, 388, 389, 390, 391, 392, 393,
+ 394, 395, 396, 397, 398, 399, 400, 401,
+ 402, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 413, 414, 415, 416, 417,
+ 418, 419, 420, 421, 422, 423, 424, 425,
+ 426, 427, 428, 429, 430, 431, 432, 433,
+ 434, 435, 213, 436, 437, 438, 439, 440,
+ 441, 442, 443, 444, 445, 446, 447, 448,
+ 449, 450, 451, 452, 453, 213, 213, 213,
+ 213, 213, 213, 454, 455, 456, 457, 458,
+ 213, 213, 459, 460, 461, 462, 463, 464,
+ 465, 466, 467, 468, 469, 470, 471, 472,
+ 473, 213, 213, 213, 474, 475, 213, 476,
+ 477, 213, 478, 213, 479, 213, 213, 213,
+ 213, 480, 213, 213, 481, 213, 213, 213,
+ 213, 482, 483, 213, 484, 213, 213, 213,
+ 485, 213, 213, 486, 213, 213, 487, 213,
+ 213, 213, 213, 213, 213, 213, 488, 213,
+ 213, 489, 213, 213, 490, 213, 213, 213,
+ 213, 491, 492, 493, 494, 495, 213, 213,
+ 213, 213, 213, 496, 213, 339, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 497, 498, 499, 500, 501, 502, 503,
+ 504, 505, 506, 506, 507, 507, 507, 507,
+ 507, 507, 507, 46, 46, 46, 46, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 507, 507, 46, 46, 46, 46, 46,
+ 46, 508, 509, 510, 511, 512, 513, 46,
+ 46, 514, 515, 516, 517, 518, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 507,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 519, 520, 521, 522, 523, 524, 525,
+ 526, 527, 528, 529, 530, 531, 524, 524,
+ 532, 524, 533, 524, 534, 535, 536, 537,
+ 537, 537, 537, 536, 538, 537, 537, 537,
+ 537, 537, 539, 539, 540, 541, 542, 543,
+ 544, 545, 537, 537, 537, 537, 546, 547,
+ 537, 548, 549, 537, 537, 550, 550, 550,
+ 550, 551, 537, 537, 537, 537, 524, 524,
+ 524, 552, 553, 554, 555, 556, 557, 524,
+ 537, 537, 537, 524, 524, 524, 537, 537,
+ 558, 524, 524, 524, 537, 537, 537, 537,
+ 524, 536, 537, 537, 524, 559, 560, 560,
+ 559, 560, 560, 559, 524, 524, 524, 524,
+ 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 0, 0, 0, 0, 561, 46, 0,
+ 0, 0, 0, 562, 563, 564, 565, 566,
+ 0, 0, 0, 0, 0, 86, 567, 568,
+ 569, 570, 571, 572, 0, 573, 0, 574,
+ 575, 576, 577, 578, 579, 580, 581, 582,
+ 583, 584, 585, 586, 587, 588, 589, 590,
+ 591, 592, 593, 0, 594, 595, 596, 597,
+ 598, 599, 600, 601, 602, 603, 604, 605,
+ 606, 607, 608, 609, 610, 611, 612, 613,
+ 614, 615, 616, 617, 618, 619, 620, 621,
+ 622, 623, 624, 625, 626, 627, 628, 629,
+ 630, 631, 632, 633, 634, 635, 636, 637,
+ 0, 638, 639, 640, 641, 642, 643, 644,
+ 213, 645, 646, 647, 648, 649, 650, 651,
+ 652, 653, 654, 655, 656, 657, 658, 659,
+ 660, 661, 662, 663, 664, 665, 666, 667,
+ 668, 669, 670, 671, 213, 672, 673, 74,
+ 674, 675, 676, 677, 678, 213, 679, 680,
+ 681, 682, 683, 684, 685, 686, 687, 688,
+ 689, 690, 691, 692, 693, 694, 695, 696,
+ 697, 698, 699, 700, 701, 702, 703, 704,
+ 705, 706, 707, 708, 709, 710, 711, 712,
+ 713, 714, 715, 716, 717, 718, 719, 720,
+ 721, 722, 723, 724, 725, 726, 727, 728,
+ 729, 730, 731, 732, 733, 734, 735, 736,
+ 737, 738, 739, 740, 741, 742, 743, 744,
+ 745, 746, 747, 748, 749, 750, 751, 752,
+ 753, 754, 755, 756, 757, 758, 759, 760,
+ 761, 762, 763, 764, 765, 766, 767, 768,
+ 769, 770, 771, 772, 773, 774, 775, 776,
+ 777, 778, 779, 780, 781, 782, 783, 784,
+ 785, 786, 787, 788, 789, 790, 791, 792,
+ 793, 794, 795, 796, 797, 798, 799, 800,
+ 801, 802, 803, 804, 805, 806, 807, 808,
+ 809, 810, 811, 812, 524, 524, 524, 524,
+ 0, 813, 813, 814, 815, 816, 817, 818,
+ 819, 820, 821, 822, 823, 824, 825, 826,
+ 827, 828, 829, 830, 831, 832, 833, 834,
+ 835, 836, 837, 838, 839, 840, 841, 842,
+ 843, 844, 845, 846, 847, 848, 849, 850,
+ 851, 852, 853, 854, 855, 856, 857, 858,
+ 859, 860, 861, 862, 863, 864, 865, 866,
+ 867, 868, 869, 870, 871, 872, 873, 874,
+ 875, 876, 877, 878, 879, 880, 881, 882,
+ 883, 884, 885, 886, 887, 888, 889, 890,
+ 891, 892, 893, 894, 895, 896, 897, 898,
+ 899, 900, 901, 902, 903, 904, 905, 906,
+ 907, 908, 909, 910, 911, 912, 913, 914,
+ 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930,
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 952, 953, 954, 955, 956, 957,
+ 958, 959, 960, 961, 962, 963, 964, 965,
+ 966, 967, 968, 969, 970, 971, 972, 973,
+ 974, 975, 976, 977, 978, 979, 980, 981,
+ 982, 983, 984, 985, 986, 987, 988, 989,
+ 0, 0, 507, 990, 990, 990, 990, 990,
+ 990, 0, 991, 992, 993, 994, 995, 996,
+ 997, 998, 999, 1000, 1001, 1002, 1003, 1004,
+ 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012,
+ 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,
+ 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028,
+ 1029, 0, 990, 1030, 0, 0, 0, 0,
+ 0, 0, 537, 524, 524, 524, 524, 537,
+ 524, 524, 524, 1031, 537, 524, 524, 524,
+ 524, 524, 524, 537, 537, 537, 537, 537,
+ 537, 524, 524, 537, 524, 524, 1031, 1032,
+ 524, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
+ 1040, 1041, 1042, 1042, 1043, 1044, 1045, 1046,
+ 1047, 1046, 1048, 1049, 1046, 524, 537, 1046,
+ 1041, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1046, 1046, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1051, 1051, 1051, 1051, 0, 0, 0,
+ 0, 0, 0, 0, 1052, 14, 1053, 76,
+ 76, 524, 524, 524, 524, 524, 524, 0,
+ 0, 0, 0, 0, 1053, 0, 0, 1053,
+ 1053, 0, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1060, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 0, 0, 0, 0,
+ 0, 1061, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1062, 1054, 1063, 1064, 1065, 1066, 1067,
+ 1068, 1069, 1070, 1071, 1072, 1073, 1074, 537,
+ 524, 524, 524, 524, 524, 537, 524, 524,
+ 0, 1075, 1075, 1075, 1075, 1075, 1075, 1075,
+ 1075, 1075, 1075, 9, 1076, 1076, 1053, 1054,
+ 1054, 1077, 1054, 1054, 1054, 1054, 1078, 1079,
+ 1080, 1081, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1082, 1083, 1084, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1085, 1086, 1053, 1087, 524,
+ 524, 524, 524, 524, 524, 524, 1051, 813,
+ 524, 524, 524, 524, 537, 524, 1061, 1061,
+ 524, 524, 76, 537, 524, 524, 537, 1054,
+ 1054, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 1054, 1054, 1054, 1088, 1088,
+ 1054, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 0,
+ 80, 1054, 1089, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 524, 537, 524, 524, 537, 524, 524,
+ 537, 537, 537, 524, 537, 537, 524, 537,
+ 524, 524, 524, 537, 524, 537, 524, 537,
+ 524, 537, 524, 524, 0, 0, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1090,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1054, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 524, 524, 524, 524,
+ 524, 524, 524, 537, 524, 1092, 1092, 76,
+ 8, 8, 8, 1092, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 1094, 1095, 339, 339, 339, 339, 339,
+ 339, 1096, 1097, 339, 1098, 1099, 339, 339,
+ 339, 339, 339, 0, 0, 1100, 339, 1093,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1093, 1093, 1093, 1093, 1101, 0,
+ 0, 339, 524, 537, 524, 524, 0, 0,
+ 0, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
+ 1109, 339, 339, 1090, 1090, 990, 990, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 990, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 339, 339, 339, 339,
+ 339, 0, 1090, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 0, 0, 0, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1112,
+ 1093, 1093, 1090, 1090, 1090, 1090, 0, 0,
+ 1113, 1093, 0, 0, 1114, 1115, 1101, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1116, 0, 0, 0, 0, 1117, 1118, 0,
+ 1119, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 339, 339, 10, 10, 1120, 1120, 1120,
+ 1120, 1120, 1120, 812, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 1121, 0, 339, 1122,
+ 0, 339, 339, 0, 0, 1111, 0, 1093,
+ 1093, 1093, 1090, 1090, 0, 0, 0, 0,
+ 1090, 1090, 0, 0, 1090, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1123, 1124, 1125, 339, 0, 1126,
+ 0, 0, 0, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1090, 1090, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 339, 339, 339, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1093,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 0,
+ 1090, 1090, 1093, 0, 1093, 1093, 1101, 0,
+ 0, 339, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1127,
+ 1090, 1093, 1090, 1090, 1090, 0, 0, 0,
+ 1128, 1129, 0, 0, 1130, 1131, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1132,
+ 1133, 0, 0, 0, 0, 1134, 1135, 0,
+ 339, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 812, 339, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1090, 339, 0, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 339,
+ 339, 339, 0, 1136, 339, 1137, 339, 0,
+ 0, 0, 339, 339, 0, 339, 0, 339,
+ 339, 0, 0, 0, 339, 339, 0, 0,
+ 0, 339, 339, 339, 0, 0, 0, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1138,
+ 1093, 1090, 1093, 1093, 0, 0, 0, 1139,
+ 1140, 1093, 0, 1141, 1142, 1143, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1144, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1120, 1120, 1120, 76, 76, 76, 76,
+ 76, 76, 10, 76, 0, 0, 0, 0,
+ 0, 0, 1093, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1090,
+ 1090, 1090, 1093, 1093, 1093, 1093, 0, 1145,
+ 1090, 1146, 0, 1090, 1090, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 1147, 1148,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1093,
+ 1149, 1150, 1093, 1151, 1093, 1093, 0, 1152,
+ 1153, 1154, 0, 1155, 1156, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 1157, 1158,
+ 0, 0, 0, 0, 0, 0, 0, 339,
+ 0, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1159,
+ 1093, 1093, 1090, 1090, 1090, 0, 0, 1160,
+ 1161, 1093, 0, 1162, 1163, 1164, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1165, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 1166, 0, 0, 0, 0,
+ 1167, 1093, 1093, 1090, 1090, 1090, 0, 1090,
+ 0, 1093, 1168, 1169, 1093, 1170, 1171, 1172,
+ 1173, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 990, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1090, 339, 1174, 1090, 1090, 1090,
+ 1090, 1175, 1175, 1101, 0, 0, 0, 0,
+ 10, 339, 339, 339, 339, 339, 339, 507,
+ 1090, 1176, 1176, 1176, 1176, 1090, 1090, 1090,
+ 990, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 0, 339, 0, 0,
+ 339, 339, 0, 339, 0, 0, 339, 0,
+ 0, 0, 0, 0, 0, 339, 339, 339,
+ 339, 0, 339, 339, 339, 339, 339, 339,
+ 339, 0, 339, 339, 339, 0, 339, 0,
+ 339, 0, 0, 339, 339, 0, 339, 339,
+ 339, 339, 1090, 339, 1177, 1090, 1090, 1090,
+ 1090, 1178, 1178, 0, 1090, 1090, 339, 0,
+ 0, 339, 339, 339, 339, 339, 0, 507,
+ 0, 1179, 1179, 1179, 1179, 1090, 1090, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 1180, 1181, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 812, 812, 812, 990, 990, 990,
+ 990, 990, 990, 990, 990, 1182, 990, 990,
+ 990, 990, 990, 990, 812, 812, 812, 812,
+ 812, 537, 537, 812, 812, 812, 812, 812,
+ 812, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 812, 537, 812,
+ 537, 812, 1183, 11, 12, 11, 12, 1093,
+ 1093, 339, 339, 339, 1184, 339, 339, 339,
+ 339, 0, 339, 339, 339, 339, 1185, 339,
+ 339, 339, 339, 1186, 339, 339, 339, 339,
+ 1187, 339, 339, 339, 339, 1188, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1189, 339, 0, 0, 0, 0,
+ 0, 0, 1190, 1191, 1192, 1193, 1194, 1195,
+ 1196, 1197, 1198, 1191, 1191, 1191, 1191, 1090,
+ 1093, 1191, 1199, 524, 524, 1101, 990, 524,
+ 524, 339, 339, 339, 339, 0, 0, 0,
+ 0, 1090, 1090, 1090, 1200, 1090, 1090, 1090,
+ 1090, 0, 1090, 1090, 1090, 1090, 1201, 1090,
+ 1090, 1090, 1090, 1202, 1090, 1090, 1090, 1090,
+ 1203, 1090, 1090, 1090, 1090, 1204, 1090, 1090,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1205, 1090, 1090, 1090, 0, 812,
+ 812, 812, 812, 812, 812, 812, 812, 537,
+ 812, 812, 812, 812, 812, 812, 0, 0,
+ 812, 990, 990, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 339, 339, 1206, 1207,
+ 339, 0, 339, 339, 0, 1093, 1090, 1208,
+ 1090, 1090, 1093, 1090, 0, 0, 0, 1090,
+ 1111, 1093, 1101, 0, 0, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 990, 990, 990,
+ 990, 339, 339, 339, 339, 339, 339, 1093,
+ 1093, 1090, 1090, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1209, 1210, 1211, 1212, 1213, 1214, 1215,
+ 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223,
+ 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231,
+ 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239,
+ 1240, 1241, 1242, 1243, 1244, 1245, 1246, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 990, 1247, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 1248, 1248, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 524, 812, 990, 990, 990, 990, 990, 990,
+ 990, 990, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 990, 990,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 11, 12, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 990, 990, 990, 1249,
+ 1249, 1249, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 339, 1090, 1090, 1101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1090, 1090, 1101, 990, 990,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1090, 1090, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 1090, 1090, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 1250, 1250, 1093,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1090,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1090, 1101, 1090, 990, 990, 990,
+ 507, 990, 990, 990, 10, 339, 524, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 0, 0, 0, 0, 0,
+ 0, 8, 8, 8, 8, 8, 8, 1030,
+ 8, 8, 8, 8, 558, 558, 558, 7,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 507, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1032, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 1090, 1090, 1090, 1093, 1093, 1093, 1093,
+ 1090, 1090, 1252, 1252, 1252, 0, 0, 0,
+ 0, 1093, 1093, 1090, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1031, 524, 537, 0, 0, 0,
+ 0, 76, 0, 0, 0, 8, 8, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 0, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 339, 339, 339, 339, 339, 339,
+ 339, 1093, 1093, 0, 0, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 8,
+ 8, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 524, 537, 1093, 1093, 1093, 0, 0, 990,
+ 990, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1090, 1090, 1090, 1090, 1093, 1253, 1254,
+ 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262,
+ 339, 339, 1263, 1264, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 1111, 1265, 1090,
+ 1090, 1090, 1090, 1266, 1267, 1268, 1269, 1270,
+ 1271, 1272, 1273, 1274, 1275, 1276, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 990, 990, 990,
+ 990, 990, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 524, 537, 524, 524,
+ 524, 524, 524, 524, 524, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 1277, 1278, 1279,
+ 507, 1280, 1281, 1282, 1283, 1284, 1285, 1286,
+ 1287, 1288, 1289, 1290, 507, 1291, 1292, 1293,
+ 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301,
+ 1302, 1303, 1304, 1305, 1306, 1307, 1308, 507,
+ 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316,
+ 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324,
+ 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332,
+ 1333, 1334, 1335, 1336, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 1337, 213, 213, 213, 213, 1338, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 1339, 1340, 1341, 1342,
+ 1307, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+ 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357,
+ 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365,
+ 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373,
+ 1374, 524, 524, 537, 524, 524, 524, 524,
+ 524, 524, 524, 537, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 524,
+ 537, 1375, 1376, 1377, 1378, 1379, 1380, 1381,
+ 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389,
+ 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397,
+ 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405,
+ 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413,
+ 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421,
+ 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429,
+ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437,
+ 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445,
+ 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453,
+ 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461,
+ 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469,
+ 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477,
+ 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485,
+ 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493,
+ 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501,
+ 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509,
+ 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517,
+ 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525,
+ 1526, 1527, 1528, 1529, 1530, 0, 0, 0,
+ 0, 1531, 1532, 1533, 1534, 1535, 1536, 1537,
+ 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545,
+ 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553,
+ 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561,
+ 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569,
+ 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577,
+ 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585,
+ 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593,
+ 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601,
+ 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
+ 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617,
+ 1618, 1619, 1620, 0, 0, 0, 0, 0,
+ 0, 1621, 1622, 1623, 1624, 1625, 1626, 1627,
+ 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635,
+ 1636, 1637, 1638, 1639, 1640, 1641, 1642, 0,
+ 0, 1643, 1644, 1645, 1646, 1647, 1648, 0,
+ 0, 1649, 1650, 1651, 1652, 1653, 1654, 1655,
+ 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663,
+ 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671,
+ 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679,
+ 1680, 1681, 1682, 1683, 1684, 1685, 1686, 0,
+ 0, 1687, 1688, 1689, 1690, 1691, 1692, 0,
+ 0, 1693, 1694, 1695, 1696, 1697, 1698, 1699,
+ 1700, 0, 1701, 0, 1702, 0, 1703, 0,
+ 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711,
+ 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719,
+ 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727,
+ 1728, 1729, 1730, 1731, 1732, 1733, 1734, 0,
+ 0, 1735, 1736, 1737, 1738, 1739, 1740, 1741,
+ 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749,
+ 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757,
+ 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765,
+ 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773,
+ 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781,
+ 1782, 1783, 1784, 1785, 1786, 1787, 0, 1788,
+ 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796,
+ 1797, 1798, 1799, 1800, 1801, 1802, 0, 1803,
+ 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811,
+ 1812, 1813, 1814, 1815, 1816, 0, 0, 1817,
+ 1818, 1819, 1820, 1821, 1822, 0, 1823, 1824,
+ 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832,
+ 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840,
+ 1841, 0, 0, 1842, 1843, 1844, 0, 1845,
+ 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853,
+ 0, 1854, 1855, 1856, 1856, 1856, 1856, 1856,
+ 1857, 1856, 1856, 1856, 80, 1858, 1858, 1250,
+ 1859, 1030, 1860, 1030, 1030, 1030, 1030, 8,
+ 1861, 79, 91, 11, 79, 79, 91, 11,
+ 79, 8, 8, 8, 8, 1862, 1863, 1864,
+ 8, 1865, 1866, 1867, 1868, 1869, 1870, 1871,
+ 75, 9, 9, 9, 1872, 1873, 8, 1874,
+ 1875, 8, 79, 91, 8, 1876, 8, 1877,
+ 47, 47, 8, 8, 8, 1878, 11, 12,
+ 1879, 1880, 1881, 8, 8, 8, 8, 8,
+ 8, 8, 8, 74, 8, 47, 8, 8,
+ 1882, 8, 8, 8, 8, 8, 8, 8,
+ 1856, 80, 80, 80, 80, 0, 0, 0,
+ 0, 0, 0, 80, 80, 80, 80, 80,
+ 80, 1883, 1884, 0, 0, 1885, 1886, 1887,
+ 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895,
+ 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903,
+ 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911,
+ 0, 1912, 1913, 1914, 1915, 1916, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 10, 1917, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 524, 524, 550, 550, 524, 524, 524,
+ 524, 550, 550, 550, 524, 524, 813, 813,
+ 813, 813, 524, 813, 813, 813, 550, 550,
+ 524, 537, 524, 550, 550, 537, 537, 537,
+ 537, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1918, 1919, 1920, 1921, 76, 1922, 1923,
+ 1924, 76, 1925, 1926, 1927, 1927, 1927, 1928,
+ 1929, 1930, 1930, 1931, 1932, 76, 1933, 1934,
+ 76, 76, 1935, 1936, 1937, 1937, 1937, 76,
+ 76, 1938, 1939, 1940, 76, 1941, 76, 1942,
+ 76, 1941, 76, 1943, 1944, 1945, 1920, 82,
+ 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953,
+ 1954, 1955, 1956, 76, 1957, 1958, 1959, 1960,
+ 1961, 1962, 74, 74, 74, 74, 1963, 1964,
+ 1946, 1956, 1965, 76, 74, 76, 76, 1966,
+ 0, 0, 0, 0, 1967, 1968, 1969, 1970,
+ 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978,
+ 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986,
+ 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+ 2011, 1249, 1249, 1249, 2012, 2013, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2014, 74, 2015, 74, 2016, 76, 76,
+ 76, 76, 76, 2017, 2018, 76, 76, 76,
+ 76, 74, 76, 76, 74, 76, 76, 74,
+ 76, 76, 76, 76, 76, 76, 76, 2019,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 2020, 2021,
+ 2022, 2023, 76, 2024, 76, 2025, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2026, 2026, 2027, 2028, 74, 74,
+ 74, 2029, 2030, 2026, 2031, 2032, 2026, 74,
+ 74, 74, 2026, 13, 83, 74, 2026, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 2026, 2026, 2033, 2034, 2035, 2036,
+ 74, 74, 74, 74, 2026, 2037, 2038, 2026,
+ 2039, 2040, 2026, 2026, 2026, 74, 74, 74,
+ 74, 74, 2026, 74, 2026, 2041, 2026, 2026,
+ 2026, 2026, 2042, 2026, 2043, 2044, 2045, 2026,
+ 2046, 2047, 2048, 2026, 2026, 2026, 2049, 74,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 2026, 2050, 2051, 2052, 74, 2053, 2054, 2026,
+ 2026, 2026, 2026, 2026, 2026, 74, 2055, 2056,
+ 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064,
+ 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2026,
+ 2026, 2072, 2073, 2074, 2075, 2076, 2077, 2078,
+ 2079, 2080, 2081, 2026, 2026, 2026, 74, 74,
+ 2026, 2026, 2082, 2083, 74, 74, 74, 74,
+ 74, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 2084, 2026, 74, 74, 2026,
+ 2026, 2085, 2086, 2026, 2087, 2088, 2089, 2090,
+ 2091, 2026, 2026, 2092, 2093, 2094, 2095, 2026,
+ 2026, 2026, 74, 74, 74, 74, 74, 2026,
+ 2026, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2026, 2026, 2026, 2026, 2026, 74,
+ 74, 2026, 2026, 74, 74, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2096, 2097, 2098, 2099, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2100, 2101, 2102, 2103, 74,
+ 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 76, 76, 76, 76, 76, 76, 76,
+ 76, 2026, 2026, 2026, 2026, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 2026, 2026, 76, 76, 76, 76, 76,
+ 76, 76, 2104, 2105, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 76, 74, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 812, 76,
+ 76, 76, 76, 76, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 74, 74, 74,
+ 74, 74, 74, 76, 76, 76, 76, 76,
+ 76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2106, 2107, 2108, 2109, 2110, 2111, 2112,
+ 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120,
+ 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128,
+ 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136,
+ 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144,
+ 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152,
+ 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160,
+ 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168,
+ 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176,
+ 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184,
+ 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192,
+ 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200,
+ 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208,
+ 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216,
+ 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224,
+ 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232,
+ 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240,
+ 2241, 2242, 2243, 2244, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 74, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 74, 74, 74, 74, 74, 74, 74,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 812, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 76, 76, 76, 76, 0, 76,
+ 76, 76, 76, 0, 0, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 0, 76, 0,
+ 76, 76, 76, 76, 0, 0, 0, 76,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 76, 76, 76, 76, 76, 76,
+ 76, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 11, 12, 11, 12, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 76, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 2026, 74, 74, 2026, 2026, 11, 12,
+ 74, 74, 74, 74, 0, 0, 0, 0,
+ 0, 74, 74, 74, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 11,
+ 12, 11, 12, 11, 12, 0, 0, 0,
+ 0, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 11, 12,
+ 11, 12, 74, 74, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 74, 74, 74, 74, 74, 74, 74,
+ 74, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 2026, 2026, 2026, 2026, 2026, 2026, 74,
+ 74, 74, 2026, 74, 74, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 74, 2026, 2026, 74,
+ 74, 11, 12, 11, 12, 2026, 74, 74,
+ 74, 74, 2026, 74, 2026, 2026, 2026, 74,
+ 74, 2026, 2026, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 2026, 2026, 2026, 74, 74, 11, 12, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 2026, 2026, 2245, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 74, 2026,
+ 2026, 2026, 2026, 74, 74, 2026, 74, 2026,
+ 74, 74, 2026, 74, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 2026, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 74,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 74, 74, 2026, 2246, 2247, 2248,
+ 74, 74, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2249, 2250, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 74, 2026, 74, 74, 74,
+ 2026, 2026, 2026, 2026, 2026, 74, 2026, 74,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2251, 2252, 2253, 2254, 2255, 2256, 2257,
+ 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+ 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+ 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+ 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297,
+ 0, 2298, 2299, 2300, 2301, 2302, 2303, 2304,
+ 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312,
+ 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320,
+ 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328,
+ 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336,
+ 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344,
+ 0, 2345, 2346, 2347, 2348, 2349, 2350, 2351,
+ 2352, 2353, 2354, 2355, 2356, 2357, 0, 0,
+ 0, 0, 0, 0, 0, 213, 2358, 2359,
+ 213, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2360, 2361, 2362, 2363, 2364, 2365, 2366,
+ 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374,
+ 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382,
+ 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390,
+ 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398,
+ 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406,
+ 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414,
+ 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422,
+ 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430,
+ 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438,
+ 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446,
+ 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454,
+ 2455, 2456, 2457, 2458, 2459, 213, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8, 8, 8, 8, 1251, 8,
+ 8, 2460, 2461, 2462, 2463, 2464, 2465, 2466,
+ 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474,
+ 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482,
+ 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490,
+ 2491, 2492, 2493, 2494, 2495, 2496, 2497, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2498, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 8, 79, 91, 79, 91, 8,
+ 8, 8, 79, 91, 8, 79, 91, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 1030, 0, 0, 0, 0, 79, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 0, 76, 76, 76, 76,
+ 2499, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 2500, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2501, 2502, 2503, 2504, 2505, 2506, 2507,
+ 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515,
+ 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523,
+ 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531,
+ 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539,
+ 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547,
+ 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555,
+ 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563,
+ 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571,
+ 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
+ 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587,
+ 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595,
+ 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603,
+ 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611,
+ 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619,
+ 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627,
+ 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635,
+ 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643,
+ 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651,
+ 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659,
+ 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667,
+ 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675,
+ 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683,
+ 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691,
+ 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699,
+ 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707,
+ 2708, 2709, 2710, 2711, 2712, 2713, 2714, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 0, 0, 0,
+ 0, 2715, 8, 8, 8, 76, 507, 339,
+ 1249, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 76, 76, 11, 12, 11,
+ 12, 11, 12, 11, 12, 1030, 11, 12,
+ 12, 76, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 2716, 1032, 536, 1031, 2717,
+ 2717, 1030, 507, 507, 507, 507, 507, 2718,
+ 76, 2719, 2720, 2721, 507, 339, 8, 76,
+ 76, 0, 339, 339, 339, 339, 339, 2722,
+ 339, 339, 339, 339, 2723, 2724, 2725, 2726,
+ 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734,
+ 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742,
+ 2743, 2744, 2745, 2746, 339, 2747, 2748, 2749,
+ 2750, 2751, 2752, 339, 339, 339, 339, 339,
+ 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760,
+ 2761, 2762, 2763, 2764, 2765, 2766, 2767, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 2768, 339, 339,
+ 0, 0, 2769, 2770, 2771, 2772, 2773, 2774,
+ 2775, 1030, 339, 339, 339, 339, 339, 2776,
+ 339, 339, 339, 339, 2777, 2778, 2779, 2780,
+ 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788,
+ 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796,
+ 2797, 2798, 2799, 2800, 339, 2801, 2802, 2803,
+ 2804, 2805, 2806, 339, 339, 339, 339, 339,
+ 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814,
+ 2815, 2816, 2817, 2818, 2819, 2820, 2821, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 2822, 2823, 2824, 2825, 339, 2826, 339, 339,
+ 2827, 2828, 2829, 2830, 8, 507, 2831, 2832,
+ 2833, 0, 0, 0, 0, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 2834, 2835, 2836, 2837, 2838, 2839,
+ 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847,
+ 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855,
+ 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863,
+ 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871,
+ 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879,
+ 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887,
+ 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895,
+ 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903,
+ 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911,
+ 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919,
+ 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927,
+ 0, 812, 812, 2928, 2929, 2930, 2931, 2932,
+ 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940,
+ 2941, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 2942, 2943, 2944, 2945, 2946, 2947, 2948,
+ 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956,
+ 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964,
+ 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972,
+ 0, 2973, 2974, 2975, 2976, 2977, 2978, 2979,
+ 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987,
+ 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995,
+ 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003,
+ 3004, 3005, 3006, 3007, 3008, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3009, 3010, 3011, 3012, 3013, 3014, 3015,
+ 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023,
+ 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031,
+ 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039,
+ 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047,
+ 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055,
+ 812, 3056, 3057, 3058, 3059, 3060, 3061, 3062,
+ 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070,
+ 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078,
+ 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086,
+ 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094,
+ 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102,
+ 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110,
+ 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118,
+ 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126,
+ 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134,
+ 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142,
+ 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150,
+ 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158,
+ 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166,
+ 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174,
+ 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182,
+ 0, 3183, 3184, 3185, 3186, 3187, 3188, 3189,
+ 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197,
+ 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205,
+ 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213,
+ 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221,
+ 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229,
+ 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237,
+ 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245,
+ 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253,
+ 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261,
+ 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269,
+ 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277,
+ 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285,
+ 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293,
+ 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301,
+ 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309,
+ 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317,
+ 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325,
+ 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333,
+ 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341,
+ 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349,
+ 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357,
+ 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365,
+ 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373,
+ 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381,
+ 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389,
+ 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397,
+ 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405,
+ 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413,
+ 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421,
+ 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429,
+ 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437,
+ 3438, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 507, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 506, 506, 506, 506, 0, 0, 0, 0,
+ 0, 46, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 1252, 339, 339, 339, 1101,
+ 339, 339, 339, 339, 1090, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 1093, 1093, 1090, 1090,
+ 1093, 76, 76, 76, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 8, 8, 8,
+ 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447,
+ 3448, 3448, 3449, 3450, 3451, 3452, 3453, 3454,
+ 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462,
+ 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470,
+ 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478,
+ 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486,
+ 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494,
+ 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502,
+ 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510,
+ 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518,
+ 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526,
+ 3527, 3528, 3529, 3530, 3531, 3460, 3532, 3533,
+ 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541,
+ 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549,
+ 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557,
+ 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565,
+ 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573,
+ 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581,
+ 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589,
+ 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597,
+ 3598, 3599, 3550, 3600, 3601, 3602, 3603, 3604,
+ 3605, 3606, 3607, 3534, 3608, 3609, 3610, 3611,
+ 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619,
+ 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627,
+ 3460, 3628, 3629, 3630, 3631, 3632, 3633, 3634,
+ 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642,
+ 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650,
+ 3651, 3652, 3653, 3654, 3536, 3655, 3656, 3657,
+ 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665,
+ 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+ 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681,
+ 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689,
+ 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697,
+ 3698, 3699, 3700, 3701, 3702, 3703, 3704, 339,
+ 339, 3705, 339, 3706, 339, 339, 3707, 3708,
+ 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716,
+ 339, 3717, 339, 3718, 339, 339, 3719, 3720,
+ 339, 339, 339, 3721, 3722, 3723, 3724, 0,
+ 0, 3725, 3726, 3727, 3728, 3729, 3730, 3731,
+ 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739,
+ 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747,
+ 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755,
+ 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763,
+ 3589, 3764, 3765, 3766, 3767, 3768, 3769, 3769,
+ 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777,
+ 3719, 3778, 3779, 3780, 0, 0, 0, 0,
+ 0, 3781, 3782, 3783, 3784, 3785, 3786, 3787,
+ 3788, 3731, 3789, 3790, 3791, 3705, 3792, 3793,
+ 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801,
+ 3802, 3803, 3740, 3804, 3741, 3805, 3806, 3807,
+ 3808, 3809, 3706, 3481, 3810, 3811, 3812, 3551,
+ 3638, 3813, 3814, 3748, 3815, 3749, 3816, 3817,
+ 3818, 3708, 3819, 3820, 3821, 3822, 3823, 3709,
+ 3824, 3825, 3826, 3827, 3828, 3829, 3763, 3830,
+ 3831, 3589, 3832, 3767, 3833, 3834, 3835, 3836,
+ 3837, 3772, 3838, 3718, 3839, 3773, 3532, 3840,
+ 3774, 3841, 3776, 3842, 3843, 3844, 3845, 3846,
+ 3778, 3714, 3847, 3779, 3848, 3780, 3849, 3448,
+ 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857,
+ 3858, 3859, 3860, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3861, 3862, 3863, 3864, 3865, 3866, 3867,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3868, 3869, 3870, 3871,
+ 3872, 0, 0, 0, 0, 0, 3873, 3874,
+ 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882,
+ 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890,
+ 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898,
+ 0, 3899, 3900, 3901, 3902, 3903, 0, 3904,
+ 0, 3905, 3906, 0, 3907, 3908, 0, 3909,
+ 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917,
+ 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925,
+ 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933,
+ 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941,
+ 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949,
+ 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957,
+ 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965,
+ 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973,
+ 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981,
+ 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989,
+ 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997,
+ 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005,
+ 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013,
+ 4014, 4015, 4016, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4017, 4018, 4019, 4020,
+ 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028,
+ 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036,
+ 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044,
+ 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052,
+ 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060,
+ 4061, 4062, 4063, 4064, 4055, 4065, 4066, 4067,
+ 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075,
+ 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083,
+ 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091,
+ 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099,
+ 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107,
+ 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115,
+ 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123,
+ 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131,
+ 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139,
+ 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147,
+ 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155,
+ 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163,
+ 4164, 4056, 4165, 4166, 4167, 4168, 4169, 4170,
+ 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178,
+ 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186,
+ 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194,
+ 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202,
+ 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210,
+ 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218,
+ 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226,
+ 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234,
+ 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242,
+ 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250,
+ 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258,
+ 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266,
+ 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274,
+ 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282,
+ 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290,
+ 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298,
+ 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306,
+ 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314,
+ 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322,
+ 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330,
+ 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338,
+ 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346,
+ 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354,
+ 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362,
+ 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370,
+ 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378,
+ 4379, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4380, 4381, 4382, 4383, 4384, 4385, 4386,
+ 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394,
+ 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402,
+ 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410,
+ 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418,
+ 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426,
+ 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434,
+ 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442,
+ 4443, 0, 0, 4444, 4445, 4446, 4447, 4448,
+ 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456,
+ 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464,
+ 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472,
+ 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480,
+ 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488,
+ 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496,
+ 4497, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4498, 4499, 4500, 4501, 4502, 4503, 4504,
+ 4505, 4506, 4507, 4508, 4509, 4510, 76, 0,
+ 0, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 4511, 4512, 4513, 4514, 4515, 4516, 4517,
+ 4518, 4519, 4520, 0, 0, 0, 0, 0,
+ 0, 524, 524, 524, 524, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4521, 4522, 4523, 4524, 4524, 4525, 4526,
+ 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534,
+ 4535, 4536, 4537, 4538, 4539, 4540, 8, 8,
+ 4541, 4542, 4543, 4543, 4543, 4543, 4544, 4544,
+ 4544, 4545, 4546, 4547, 0, 4548, 4549, 4550,
+ 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558,
+ 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566,
+ 0, 4567, 4568, 4569, 4570, 0, 0, 0,
+ 0, 4571, 4572, 4573, 1054, 4574, 0, 4575,
+ 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583,
+ 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591,
+ 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599,
+ 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607,
+ 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615,
+ 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623,
+ 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631,
+ 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639,
+ 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647,
+ 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655,
+ 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663,
+ 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671,
+ 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679,
+ 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687,
+ 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695,
+ 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703,
+ 4704, 4705, 4706, 4707, 4708, 4709, 0, 0,
+ 80, 0, 4710, 4711, 4712, 4713, 4714, 4715,
+ 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723,
+ 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731,
+ 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739,
+ 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747,
+ 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755,
+ 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763,
+ 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771,
+ 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+ 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787,
+ 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795,
+ 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803,
+ 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+ 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+ 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+ 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+ 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+ 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+ 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+ 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867,
+ 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875,
+ 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883,
+ 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891,
+ 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899,
+ 0, 0, 0, 4900, 4901, 4902, 4903, 4904,
+ 4905, 0, 0, 4906, 4907, 4908, 4909, 4910,
+ 4911, 0, 0, 4912, 4913, 4914, 4915, 4916,
+ 4917, 0, 0, 4918, 4919, 4920, 0, 0,
+ 0, 4921, 4922, 4923, 4924, 4925, 4926, 4927,
+ 0, 4928, 4929, 4930, 4931, 4932, 4933, 4934,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4935, 4935, 4935, 76, 76, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 339, 339, 0,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 0, 990, 8, 812, 0, 0, 0, 0,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 0, 0, 0,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 1251, 1251,
+ 1251, 1251, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 1251, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 1120, 1120, 1120, 1120, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1249, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1249, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 990, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 990, 1249, 1249, 1249, 1249, 1249, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4937, 4938, 4939, 4940, 4941, 4942, 4943,
+ 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951,
+ 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959,
+ 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967,
+ 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975,
+ 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983,
+ 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991,
+ 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999,
+ 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007,
+ 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015,
+ 5016, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 0,
+ 0, 1050, 0, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0,
+ 1050, 1050, 0, 0, 0, 1050, 0, 0,
+ 1050, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 5017,
+ 5017, 5017, 5017, 0, 0, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1090, 1090, 1090, 0, 1090, 1090,
+ 0, 0, 0, 0, 0, 1090, 537, 1090,
+ 524, 1050, 1050, 1050, 1050, 0, 1050, 1050,
+ 1050, 0, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 0, 0, 0,
+ 0, 524, 550, 537, 0, 0, 0, 0,
+ 1101, 5017, 5017, 5017, 5017, 5017, 5017, 5017,
+ 5017, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ 1046, 1046, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 990, 990, 990, 990, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 0, 0, 0, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 5018, 5019, 812, 812, 812, 812, 812, 5020,
+ 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028,
+ 550, 550, 550, 812, 812, 812, 5029, 5030,
+ 5031, 5032, 5033, 5034, 80, 80, 80, 80,
+ 80, 80, 80, 80, 537, 537, 537, 537,
+ 537, 537, 537, 537, 812, 812, 524, 524,
+ 524, 524, 524, 537, 537, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 524, 524, 524, 524, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 5035, 5036, 5037, 5038, 5039, 5040,
+ 5041, 5042, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 524, 524, 524, 76, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 0, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 0, 1920,
+ 1963, 0, 0, 5044, 0, 0, 5045, 5046,
+ 0, 0, 1933, 5047, 1935, 1936, 0, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 0, 5058, 0, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 0, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 0,
+ 1963, 1947, 1948, 5044, 0, 0, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 0, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 0, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 0, 1963, 1947, 1948, 5044,
+ 0, 1930, 5045, 5046, 1931, 1950, 0, 5047,
+ 0, 0, 0, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 0, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5073, 5074, 0,
+ 0, 5075, 5076, 1960, 5077, 5078, 5079, 5080,
+ 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088,
+ 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095,
+ 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102,
+ 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110,
+ 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117,
+ 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125,
+ 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078,
+ 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086,
+ 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093,
+ 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959,
+ 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108,
+ 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115,
+ 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123,
+ 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960,
+ 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084,
+ 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091,
+ 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099,
+ 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106,
+ 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113,
+ 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121,
+ 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075,
+ 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082,
+ 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089,
+ 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097,
+ 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104,
+ 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112,
+ 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119,
+ 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127,
+ 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080,
+ 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088,
+ 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095,
+ 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102,
+ 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110,
+ 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117,
+ 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125,
+ 5126, 5127, 5128, 5129, 5130, 0, 0, 5131,
+ 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139,
+ 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137,
+ 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135,
+ 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133,
+ 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131,
+ 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139,
+ 5140, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5141, 5142, 5143, 5144, 5145, 3725, 5146,
+ 5147, 5148, 5149, 3726, 5150, 5151, 5152, 3727,
+ 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160,
+ 5161, 5162, 5163, 5164, 3782, 5165, 5166, 5167,
+ 5168, 5169, 5170, 5171, 5172, 5173, 3787, 3728,
+ 3729, 3788, 5174, 5175, 3538, 5176, 3730, 5177,
+ 5178, 5179, 5180, 5180, 5180, 5181, 5182, 5183,
+ 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191,
+ 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5198,
+ 3790, 5199, 5200, 5201, 5202, 3732, 5203, 5204,
+ 5205, 3691, 5206, 5207, 5208, 5209, 5210, 5211,
+ 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219,
+ 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227,
+ 5228, 5229, 5230, 5231, 5231, 5232, 5233, 5234,
+ 3534, 5235, 5236, 5237, 5238, 5239, 5240, 5241,
+ 5242, 3737, 5243, 5244, 5245, 5246, 5247, 5248,
+ 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256,
+ 5257, 5258, 5259, 5260, 5261, 5262, 5263, 3480,
+ 5264, 5265, 5266, 5266, 5267, 5268, 5268, 5269,
+ 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277,
+ 5278, 5279, 5280, 5281, 3738, 5282, 5283, 5284,
+ 5285, 3802, 5285, 5286, 3740, 5287, 5288, 5289,
+ 5290, 3741, 3453, 5291, 5292, 5293, 5294, 5295,
+ 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303,
+ 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311,
+ 5312, 3742, 5313, 5314, 5315, 5316, 5317, 5318,
+ 3744, 5319, 5320, 5321, 5322, 5323, 5324, 5325,
+ 5326, 3481, 3810, 5327, 5328, 5329, 5330, 5331,
+ 5332, 5333, 5334, 3745, 5335, 5336, 5337, 5338,
+ 3853, 5339, 5340, 5341, 5342, 5343, 5344, 5345,
+ 5346, 5347, 5348, 5349, 5350, 5351, 3551, 5352,
+ 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360,
+ 5361, 5362, 3746, 3638, 5363, 5364, 5365, 5366,
+ 5367, 5368, 5369, 5370, 3814, 5371, 5372, 5373,
+ 5374, 5375, 5376, 5377, 5378, 3815, 5379, 5380,
+ 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388,
+ 5389, 5390, 3817, 5391, 5392, 5393, 5394, 5395,
+ 5396, 5397, 5398, 5399, 5400, 5401, 5401, 5402,
+ 5403, 3819, 5404, 5405, 5406, 5407, 5408, 5409,
+ 5410, 3537, 5411, 5412, 5413, 5414, 5415, 5416,
+ 5417, 3825, 5418, 5419, 5420, 5421, 5422, 5423,
+ 5423, 3826, 3855, 5424, 5425, 5426, 5427, 5428,
+ 3499, 3828, 5429, 5430, 3757, 5431, 5432, 3713,
+ 5433, 5434, 3761, 5435, 5436, 5437, 5438, 5438,
+ 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446,
+ 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454,
+ 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462,
+ 5463, 5464, 5465, 3767, 5466, 5467, 5468, 5469,
+ 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477,
+ 5478, 5479, 5480, 5481, 5267, 5482, 5483, 5484,
+ 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492,
+ 5493, 3555, 5494, 5495, 5496, 5497, 5498, 5499,
+ 3770, 5500, 5501, 5502, 5503, 5504, 5505, 5506,
+ 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514,
+ 5515, 5516, 5517, 5518, 5519, 3494, 5520, 5521,
+ 5522, 5523, 5524, 5525, 3835, 5526, 5527, 5528,
+ 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536,
+ 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544,
+ 5545, 3840, 3841, 5546, 5547, 5548, 5549, 5550,
+ 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558,
+ 3842, 5559, 5560, 5561, 5562, 5563, 5564, 5565,
+ 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573,
+ 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581,
+ 5582, 5583, 5584, 5585, 5586, 5587, 5588, 3848,
+ 3848, 5589, 5590, 5591, 5592, 5593, 5594, 5595,
+ 5596, 5597, 5598, 3849, 5599, 5600, 5601, 5602,
+ 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610,
+ 5611, 5612, 5613, 5614, 5615, 5616, 5617, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 80, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 0,
+ 0, };
+
+UTF8PROC_DATA
+const utf8proc_property_t utf8proc_properties[] = {
+ {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 97, -1, 0, -1, false, false, false, false, utf8proc_sequences + 0},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 98, -1, 8640, -1, false, false, false, false, utf8proc_sequences + 2},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 99, -1, 60, -1, false, false, false, false, utf8proc_sequences + 4},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 100, -1, 960, -1, false, false, false, false, utf8proc_sequences + 6},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 101, -1, 120, -1, false, false, false, false, utf8proc_sequences + 8},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 102, -1, 9120, -1, false, false, false, false, utf8proc_sequences + 10},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 103, -1, 1080, -1, false, false, false, false, utf8proc_sequences + 12},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 104, -1, 1200, -1, false, false, false, false, utf8proc_sequences + 14},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 105, -1, 180, -1, false, false, false, false, utf8proc_sequences + 16},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 106, -1, 1320, -1, false, false, false, false, utf8proc_sequences + 18},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 107, -1, 1440, -1, false, false, false, false, utf8proc_sequences + 20},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 108, -1, 1560, -1, false, false, false, false, utf8proc_sequences + 22},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 109, -1, 9480, -1, false, false, false, false, utf8proc_sequences + 24},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 110, -1, 240, -1, false, false, false, false, utf8proc_sequences + 26},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 111, -1, 300, -1, false, false, false, false, utf8proc_sequences + 28},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 112, -1, 9720, -1, false, false, false, false, utf8proc_sequences + 30},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 32},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 114, -1, 1680, -1, false, false, false, false, utf8proc_sequences + 34},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 115, -1, 1800, -1, false, false, false, false, utf8proc_sequences + 36},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 116, -1, 1920, -1, false, false, false, false, utf8proc_sequences + 38},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 117, -1, 360, -1, false, false, false, false, utf8proc_sequences + 40},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 118, -1, 10560, -1, false, false, false, false, utf8proc_sequences + 42},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 119, -1, 2040, -1, false, false, false, false, utf8proc_sequences + 44},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 120, -1, 10680, -1, false, false, false, false, utf8proc_sequences + 46},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 121, -1, 420, -1, false, false, false, false, utf8proc_sequences + 48},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 122, -1, 2160, -1, false, false, false, false, utf8proc_sequences + 50},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 65, -1, 65, 480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66, -1, 66, 8700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 67, -1, 67, 540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 68, -1, 68, 1020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 69, -1, 69, 600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 70, -1, 70, 9180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 71, -1, 71, 1140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 72, -1, 72, 1260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, 660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 74, -1, 74, 1380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 75, -1, 75, 1500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 76, -1, 76, 1620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 77, -1, 77, 9540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 78, -1, 78, 720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 79, -1, 79, 780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 80, -1, 80, 9780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 81, -1, 81, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 82, -1, 82, 1740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 83, -1, 83, 1860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 84, -1, 84, 1980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 85, -1, 85, 840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 86, -1, 86, 10620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 87, -1, 87, 2100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 88, -1, 88, 10740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 89, -1, 89, 900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 90, -1, 90, 2220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 54, false, -1, -1, -1, 3600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 57, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 64, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 67, false, 924, -1, 924, -1, -1, false, false, false, false, utf8proc_sequences + 67},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 69, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 74, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 78, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 82, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 86, false, -1, 224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 89},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 91, false, -1, 225, -1, -1, -1, false, false, false, false, utf8proc_sequences + 94},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 96, false, -1, 226, -1, 10860, -1, false, false, false, false, utf8proc_sequences + 99},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 101, false, -1, 227, -1, -1, -1, false, false, false, false, utf8proc_sequences + 104},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 106, false, -1, 228, -1, 2400, -1, false, false, false, false, utf8proc_sequences + 109},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 111, false, -1, 229, -1, 3000, -1, false, false, false, false, utf8proc_sequences + 114},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 230, -1, 2640, -1, false, false, false, false, utf8proc_sequences + 116},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 118, false, -1, 231, -1, 8760, -1, false, false, false, false, utf8proc_sequences + 121},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 123, false, -1, 232, -1, -1, -1, false, false, false, false, utf8proc_sequences + 126},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 128, false, -1, 233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 131},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 133, false, -1, 234, -1, 11220, -1, false, false, false, false, utf8proc_sequences + 136},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 138, false, -1, 235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 141},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 143, false, -1, 236, -1, -1, -1, false, false, false, false, utf8proc_sequences + 146},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 148, false, -1, 237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 151},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 153, false, -1, 238, -1, -1, -1, false, false, false, false, utf8proc_sequences + 156},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 158, false, -1, 239, -1, 9240, -1, false, false, false, false, utf8proc_sequences + 161},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 240, -1, -1, -1, false, false, false, false, utf8proc_sequences + 163},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 165, false, -1, 241, -1, -1, -1, false, false, false, false, utf8proc_sequences + 168},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 170, false, -1, 242, -1, -1, -1, false, false, false, false, utf8proc_sequences + 173},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 175, false, -1, 243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 178},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 180, false, -1, 244, -1, 11460, -1, false, false, false, false, utf8proc_sequences + 183},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 185, false, -1, 245, -1, 3360, -1, false, false, false, false, utf8proc_sequences + 188},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 190, false, -1, 246, -1, 3240, -1, false, false, false, false, utf8proc_sequences + 193},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 248, -1, 3120, -1, false, false, false, false, utf8proc_sequences + 195},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 197, false, -1, 249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 200},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 202, false, -1, 250, -1, -1, -1, false, false, false, false, utf8proc_sequences + 205},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 207, false, -1, 251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 210},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 212, false, -1, 252, -1, 2280, -1, false, false, false, false, utf8proc_sequences + 215},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 217, false, -1, 253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 220},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 254, -1, -1, -1, false, false, false, false, utf8proc_sequences + 222},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 224},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 227, false, 192, -1, 192, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 230, false, 193, -1, 193, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 233, false, 194, -1, 194, 10920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 236, false, 195, -1, 195, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 239, false, 196, -1, 196, 2460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 242, false, 197, -1, 197, 3060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 198, -1, 198, 2700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 245, false, 199, -1, 199, 8820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 248, false, 200, -1, 200, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 251, false, 201, -1, 201, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 254, false, 202, -1, 202, 11280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 257, false, 203, -1, 203, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 260, false, 204, -1, 204, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 263, false, 205, -1, 205, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 266, false, 206, -1, 206, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 269, false, 207, -1, 207, 9300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 208, -1, 208, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 272, false, 209, -1, 209, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 275, false, 210, -1, 210, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 278, false, 211, -1, 211, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 281, false, 212, -1, 212, 11520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 284, false, 213, -1, 213, 3420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 287, false, 214, -1, 214, 3300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 216, -1, 216, 3180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 290, false, 217, -1, 217, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 293, false, 218, -1, 218, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 296, false, 219, -1, 219, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 299, false, 220, -1, 220, 2340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 302, false, 221, -1, 221, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 222, -1, 222, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 305, false, 376, -1, 376, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 308, false, -1, 257, -1, -1, -1, false, false, false, false, utf8proc_sequences + 311},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 313, false, 256, -1, 256, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 316, false, -1, 259, -1, 11100, -1, false, false, false, false, utf8proc_sequences + 319},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 321, false, 258, -1, 258, 11160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 324, false, -1, 261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 327},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 329, false, 260, -1, 260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 332, false, -1, 263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 335},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 337, false, 262, -1, 262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 340, false, -1, 265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 343},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 345, false, 264, -1, 264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 348, false, -1, 267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 351},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 353, false, 266, -1, 266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 356, false, -1, 269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 359},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 361, false, 268, -1, 268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 364, false, -1, 271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 367},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 369, false, 270, -1, 270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 372},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 272, -1, 272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 374, false, -1, 275, -1, 8880, -1, false, false, false, false, utf8proc_sequences + 377},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 379, false, 274, -1, 274, 8940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 382, false, -1, 277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 385},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 387, false, 276, -1, 276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 390, false, -1, 279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 393},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 395, false, 278, -1, 278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 398, false, -1, 281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 401},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 403, false, 280, -1, 280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 406, false, -1, 283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 409},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 411, false, 282, -1, 282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 414, false, -1, 285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 417},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 419, false, 284, -1, 284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 422, false, -1, 287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 425},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 427, false, 286, -1, 286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 430, false, -1, 289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 433},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 435, false, 288, -1, 288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 438, false, -1, 291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 441},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 443, false, 290, -1, 290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 446, false, -1, 293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 449},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 451, false, 292, -1, 292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 454},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 294, -1, 294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 456, false, -1, 297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 459},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 461, false, 296, -1, 296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 464, false, -1, 299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 467},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 469, false, 298, -1, 298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 472, false, -1, 301, -1, -1, -1, false, false, false, false, utf8proc_sequences + 475},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 477, false, 300, -1, 300, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 480, false, -1, 303, -1, -1, -1, false, false, false, false, utf8proc_sequences + 483},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 485, false, 302, -1, 302, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 488, false, -1, 105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 491},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 494, false, -1, 307, -1, -1, -1, false, false, false, false, utf8proc_sequences + 497},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 499, false, 306, -1, 306, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 502, false, -1, 309, -1, -1, -1, false, false, false, false, utf8proc_sequences + 505},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 507, false, 308, -1, 308, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 510, false, -1, 311, -1, -1, -1, false, false, false, false, utf8proc_sequences + 513},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 515, false, 310, -1, 310, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 518, false, -1, 314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 521},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 523, false, 313, -1, 313, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 526, false, -1, 316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 529},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 531, false, 315, -1, 315, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 534, false, -1, 318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 537},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 539, false, 317, -1, 317, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 542, false, -1, 320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 545},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 547, false, 319, -1, 319, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 550},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 321, -1, 321, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 552, false, -1, 324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 555},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 557, false, 323, -1, 323, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 560, false, -1, 326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 563},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 565, false, 325, -1, 325, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 568, false, -1, 328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 571},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 573, false, 327, -1, 327, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 576, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 576},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 579},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 330, -1, 330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 581, false, -1, 333, -1, 9600, -1, false, false, false, false, utf8proc_sequences + 584},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 586, false, 332, -1, 332, 9660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 589, false, -1, 335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 592},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 594, false, 334, -1, 334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 597, false, -1, 337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 600},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 602, false, 336, -1, 336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 605},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 338, -1, 338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 607, false, -1, 341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 610},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 612, false, 340, -1, 340, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 615, false, -1, 343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 618},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 620, false, 342, -1, 342, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 623, false, -1, 345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 626},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 628, false, 344, -1, 344, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 631, false, -1, 347, -1, 9960, -1, false, false, false, false, utf8proc_sequences + 634},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 636, false, 346, -1, 346, 10020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 639, false, -1, 349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 642},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 644, false, 348, -1, 348, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 647, false, -1, 351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 650},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 652, false, 350, -1, 350, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 655, false, -1, 353, -1, 10080, -1, false, false, false, false, utf8proc_sequences + 658},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 660, false, 352, -1, 352, 10140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 663, false, -1, 355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 666},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 668, false, 354, -1, 354, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 671, false, -1, 357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 674},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 676, false, 356, -1, 356, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 679},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 358, -1, 358, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 681, false, -1, 361, -1, 10320, -1, false, false, false, false, utf8proc_sequences + 684},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 686, false, 360, -1, 360, 10380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 689, false, -1, 363, -1, 10440, -1, false, false, false, false, utf8proc_sequences + 692},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 694, false, 362, -1, 362, 10500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 697, false, -1, 365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 700},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 702, false, 364, -1, 364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 705, false, -1, 367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 708},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 710, false, 366, -1, 366, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 713, false, -1, 369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 716},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 718, false, 368, -1, 368, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 721, false, -1, 371, -1, -1, -1, false, false, false, false, utf8proc_sequences + 724},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 726, false, 370, -1, 370, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 729, false, -1, 373, -1, -1, -1, false, false, false, false, utf8proc_sequences + 732},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 734, false, 372, -1, 372, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 737, false, -1, 375, -1, -1, -1, false, false, false, false, utf8proc_sequences + 740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 742, false, 374, -1, 374, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 745, false, -1, 255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 748},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 750, false, -1, 378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 753},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 755, false, 377, -1, 377, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 758, false, -1, 380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 761},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 763, false, 379, -1, 379, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 766, false, -1, 382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 769},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 771, false, 381, -1, 381, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 36, false, 83, -1, 83, 10800, -1, false, false, false, false, utf8proc_sequences + 36},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 579, -1, 579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 595, -1, -1, -1, false, false, false, false, utf8proc_sequences + 774},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 776},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 386, -1, 386, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 778},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 388, -1, 388, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 596, -1, -1, -1, false, false, false, false, utf8proc_sequences + 780},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 782},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 391, -1, 391, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 598, -1, -1, -1, false, false, false, false, utf8proc_sequences + 784},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 599, -1, -1, -1, false, false, false, false, utf8proc_sequences + 786},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 788},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 395, -1, 395, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 790},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 792},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 794},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 401, -1, 401, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 798},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 800},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 502, -1, 502, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 802},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 804},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 806},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 408, -1, 408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 573, -1, 573, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 808},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 810},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 544, -1, 544, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 812},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 814, false, -1, 417, -1, 11700, -1, false, false, false, false, utf8proc_sequences + 817},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 819, false, 416, -1, 416, 11760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 822},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 418, -1, 418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 824},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 420, -1, 420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 640, -1, -1, -1, false, false, false, false, utf8proc_sequences + 826},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 828},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 423, -1, 423, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 643, -1, -1, -1, false, false, false, false, utf8proc_sequences + 830},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 832},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 428, -1, 428, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 648, -1, -1, -1, false, false, false, false, utf8proc_sequences + 834},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 836, false, -1, 432, -1, 11820, -1, false, false, false, false, utf8proc_sequences + 839},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 841, false, 431, -1, 431, 11880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 650, -1, -1, -1, false, false, false, false, utf8proc_sequences + 844},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 651, -1, -1, -1, false, false, false, false, utf8proc_sequences + 846},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 848},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 435, -1, 435, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 850},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 437, -1, 437, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 658, -1, 2880, -1, false, false, false, false, utf8proc_sequences + 852},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 854},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 440, -1, 440, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 856},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 444, -1, 444, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 503, -1, 503, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 858, false, -1, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 863, false, 452, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 866, false, 452, -1, 453, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 869, false, -1, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 874, false, 455, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 877, false, 455, -1, 456, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 880, false, -1, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 885, false, 458, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 888, false, 458, -1, 459, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 891, false, -1, 462, -1, -1, -1, false, false, false, false, utf8proc_sequences + 894},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 896, false, 461, -1, 461, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 899, false, -1, 464, -1, -1, -1, false, false, false, false, utf8proc_sequences + 902},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 904, false, 463, -1, 463, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 907, false, -1, 466, -1, -1, -1, false, false, false, false, utf8proc_sequences + 910},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 912, false, 465, -1, 465, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 915, false, -1, 468, -1, -1, -1, false, false, false, false, utf8proc_sequences + 918},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 920, false, 467, -1, 467, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 923, false, -1, 470, -1, -1, -1, false, false, false, false, utf8proc_sequences + 926},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 928, false, 469, -1, 469, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 931, false, -1, 472, -1, -1, -1, false, false, false, false, utf8proc_sequences + 934},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 936, false, 471, -1, 471, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 939, false, -1, 474, -1, -1, -1, false, false, false, false, utf8proc_sequences + 942},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 944, false, 473, -1, 473, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 947, false, -1, 476, -1, -1, -1, false, false, false, false, utf8proc_sequences + 950},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 952, false, 475, -1, 475, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 398, -1, 398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 955, false, -1, 479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 958},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 960, false, 478, -1, 478, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 963, false, -1, 481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 966},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 968, false, 480, -1, 480, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 971, false, -1, 483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 974},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 976, false, 482, -1, 482, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 979},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 484, -1, 484, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 981, false, -1, 487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 984},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 986, false, 486, -1, 486, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 989, false, -1, 489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 992},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 994, false, 488, -1, 488, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 997, false, -1, 491, -1, 2760, -1, false, false, false, false, utf8proc_sequences + 1000},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1002, false, 490, -1, 490, 2820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1005, false, -1, 493, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1008},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1010, false, 492, -1, 492, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1013, false, -1, 495, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1016},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1018, false, 494, -1, 494, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1021, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1021},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1024, false, -1, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1029, false, 497, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1032, false, 497, -1, 498, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1035, false, -1, 501, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1038},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1040, false, 500, -1, 500, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1043},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1045},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1047, false, -1, 505, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1050},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1052, false, 504, -1, 504, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1055, false, -1, 507, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1058},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1060, false, 506, -1, 506, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1063, false, -1, 509, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1066},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1068, false, 508, -1, 508, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1071, false, -1, 511, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1074},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1076, false, 510, -1, 510, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1079, false, -1, 513, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1082},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1084, false, 512, -1, 512, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1087, false, -1, 515, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1090},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1092, false, 514, -1, 514, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1095, false, -1, 517, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1098},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1100, false, 516, -1, 516, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1103, false, -1, 519, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1106},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1108, false, 518, -1, 518, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1111, false, -1, 521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1114},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1116, false, 520, -1, 520, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1119, false, -1, 523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1122},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1124, false, 522, -1, 522, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1127, false, -1, 525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1130},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1132, false, 524, -1, 524, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1135, false, -1, 527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1138},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1140, false, 526, -1, 526, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1143, false, -1, 529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1146},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1148, false, 528, -1, 528, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1151, false, -1, 531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1154},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1156, false, 530, -1, 530, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1159, false, -1, 533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1162},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1164, false, 532, -1, 532, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1167, false, -1, 535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1170},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1172, false, 534, -1, 534, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1175, false, -1, 537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1178},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1180, false, 536, -1, 536, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1183, false, -1, 539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1186},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1188, false, 538, -1, 538, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1191},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 540, -1, 540, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1193, false, -1, 543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1196},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1198, false, 542, -1, 542, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1201},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1203},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 546, -1, 546, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1205},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 548, -1, 548, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1207, false, -1, 551, -1, 2520, -1, false, false, false, false, utf8proc_sequences + 1210},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1212, false, 550, -1, 550, 2580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1215, false, -1, 553, -1, 9000, -1, false, false, false, false, utf8proc_sequences + 1218},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1220, false, 552, -1, 552, 9060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1223, false, -1, 555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1226},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1228, false, 554, -1, 554, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1231, false, -1, 557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1234},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1236, false, 556, -1, 556, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1239, false, -1, 559, -1, 3480, -1, false, false, false, false, utf8proc_sequences + 1242},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1244, false, 558, -1, 558, 3540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1247, false, -1, 561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1250},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1252, false, 560, -1, 560, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1255, false, -1, 563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1258},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1260, false, 562, -1, 562, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1263},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1265},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 571, -1, 571, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1267},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1269},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 578, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1271},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 577, -1, 577, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1273},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 649, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1275},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 652, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1277},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 583, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1279},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 582, -1, 582, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 585, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1281},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 584, -1, 584, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 587, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1283},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 586, -1, 586, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 589, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1285},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 588, -1, 588, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 591, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1287},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 590, -1, 590, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 385, -1, 385, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 390, -1, 390, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 393, -1, 393, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 394, -1, 394, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 399, -1, 399, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 400, -1, 400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 403, -1, 403, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 404, -1, 404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 407, -1, 407, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 406, -1, 406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11362, -1, 11362, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 412, -1, 412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 413, -1, 413, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 415, -1, 415, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11364, -1, 11364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 422, -1, 422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 425, -1, 425, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 430, -1, 430, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 580, -1, 580, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 433, -1, 433, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 434, -1, 434, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 581, -1, 581, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 439, -1, 439, 2940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 0, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 2, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 3, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 7, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 8, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 10, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 4, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 46, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 5, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 12, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 11, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 14, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 15, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 47, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 48, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 13, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 40, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 45, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 39, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 16, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 6, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 9, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 42, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 44, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 43, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 41, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 51, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1317, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1319, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 49, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1321, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1323, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, 921, -1, 921, -1, 50, false, false, false, true, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1021, -1, 1021, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1022, -1, 1022, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1023, -1, 1023, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1338, false, -1, 940, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1341},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1345, false, -1, 941, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1348},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1350, false, -1, 942, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1353},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1355, false, -1, 943, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1358},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1360, false, -1, 972, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1363},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1365, false, -1, 973, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1368},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1370, false, -1, 974, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1373},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1375, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 945, -1, 3660, -1, false, false, false, false, utf8proc_sequences + 1382},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 946, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 947, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1386},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 948, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1388},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 949, -1, 3720, -1, false, false, false, false, utf8proc_sequences + 1390},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 950, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1392},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 951, -1, 3780, -1, false, false, false, false, utf8proc_sequences + 1394},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 953, -1, 3840, -1, false, false, false, false, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1400},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 67},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1402},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 958, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1404},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 959, -1, 3900, -1, false, false, false, false, utf8proc_sequences + 1406},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 960, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 961, -1, 16260, -1, false, false, false, false, utf8proc_sequences + 1410},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 963, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 964, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1414},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 965, -1, 3960, -1, false, false, false, false, utf8proc_sequences + 1416},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 966, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 967, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1420},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 968, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1422},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 969, -1, 4020, -1, false, false, false, false, utf8proc_sequences + 1424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1426, false, -1, 970, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1431, false, -1, 971, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1434},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1436, false, 902, -1, 902, 15780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1439, false, 904, -1, 904, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1442, false, 905, -1, 905, 15960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1445, false, 906, -1, 906, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1448, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 913, -1, 913, 4140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 914, -1, 914, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 915, -1, 915, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 916, -1, 916, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 917, -1, 917, 4200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 918, -1, 918, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 919, -1, 919, 4260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 920, -1, 920, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 921, -1, 921, 4320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 922, -1, 922, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 923, -1, 923, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 924, -1, 924, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 925, -1, 925, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 926, -1, 926, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 927, -1, 927, 4500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 928, -1, 928, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 929, -1, 929, 16200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 932, -1, 932, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 933, -1, 933, 4440, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 934, -1, 934, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 935, -1, 935, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 936, -1, 936, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 937, -1, 937, 4560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1455, false, 938, -1, 938, 4080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1458, false, 939, -1, 939, 4380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1461, false, 908, -1, 908, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1464, false, 910, -1, 910, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1467, false, 911, -1, 911, 16380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1384, false, 914, -1, 914, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1396, false, 920, -1, 920, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1470, false, -1, -1, -1, 4620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1418, false, 934, -1, 934, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1408, false, 928, -1, 928, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 985, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1478},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 984, -1, 984, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1480},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 986, -1, 986, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1482},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 988, -1, 988, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1484},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 990, -1, 990, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 993, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1486},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 992, -1, 992, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 995, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1488},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 994, -1, 994, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 997, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1490},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 996, -1, 996, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 999, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1492},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 998, -1, 998, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1001, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1494},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1000, -1, 1000, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1496},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1002, -1, 1002, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1498},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1004, -1, 1004, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1007, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1500},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1006, -1, 1006, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1398, false, 922, -1, 922, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1410, false, 929, -1, 929, -1, -1, false, false, false, false, utf8proc_sequences + 1410},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1502, false, 1017, -1, 1017, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1504, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1390, false, 917, -1, 917, -1, -1, false, false, false, false, utf8proc_sequences + 1390},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1016, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1506},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1015, -1, 1015, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1508, false, -1, 1010, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1510},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1512},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1018, -1, 1018, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1514},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 892, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1516},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1518},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1520, false, -1, 1104, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1523},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1525, false, -1, 1105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1528},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1106, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1530},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1532, false, -1, 1107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1535},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1108, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1537},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1109, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1539},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1110, -1, 4800, -1, false, false, false, false, utf8proc_sequences + 1541},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1543, false, -1, 1111, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1546},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1548},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1550},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1114, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1552},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1554},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1556, false, -1, 1116, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1559},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1561, false, -1, 1117, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1564},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1566, false, -1, 1118, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1569},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1119, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1571},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1072, -1, 5640, -1, false, false, false, false, utf8proc_sequences + 1573},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1073, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1575},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1074, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1577},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1075, -1, 4740, -1, false, false, false, false, utf8proc_sequences + 1579},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1076, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1581},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1077, -1, 4680, -1, false, false, false, false, utf8proc_sequences + 1583},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1078, -1, 5520, -1, false, false, false, false, utf8proc_sequences + 1585},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1079, -1, 5880, -1, false, false, false, false, utf8proc_sequences + 1587},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1080, -1, 4920, -1, false, false, false, false, utf8proc_sequences + 1589},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1591, false, -1, 1081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1594},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1082, -1, 4860, -1, false, false, false, false, utf8proc_sequences + 1596},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1598},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1600},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1602},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1086, -1, 6000, -1, false, false, false, false, utf8proc_sequences + 1604},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1606},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1088, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1608},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1089, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1610},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1090, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1612},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1091, -1, 4980, -1, false, false, false, false, utf8proc_sequences + 1614},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1092, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1616},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1093, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1618},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1094, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1620},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1095, -1, 6360, -1, false, false, false, false, utf8proc_sequences + 1622},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1624},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1626},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1628},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1099, -1, 6480, -1, false, false, false, false, utf8proc_sequences + 1630},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1632},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1101, -1, 6240, -1, false, false, false, false, utf8proc_sequences + 1634},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1636},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1638},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1040, -1, 1040, 5700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1041, -1, 1041, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1042, -1, 1042, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1043, -1, 1043, 5160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1044, -1, 1044, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1045, -1, 1045, 5100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1046, -1, 1046, 5580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1047, -1, 1047, 5940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1048, -1, 1048, 5040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1640, false, 1049, -1, 1049, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1050, -1, 1050, 5280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1051, -1, 1051, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1052, -1, 1052, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1053, -1, 1053, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1054, -1, 1054, 6060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1055, -1, 1055, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1056, -1, 1056, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1057, -1, 1057, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1058, -1, 1058, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1059, -1, 1059, 5340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1060, -1, 1060, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1061, -1, 1061, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1062, -1, 1062, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1063, -1, 1063, 6420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1064, -1, 1064, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1065, -1, 1065, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1066, -1, 1066, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1067, -1, 1067, 6540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1068, -1, 1068, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1069, -1, 1069, 6300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1070, -1, 1070, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1071, -1, 1071, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1643, false, 1024, -1, 1024, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1646, false, 1025, -1, 1025, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1026, -1, 1026, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1649, false, 1027, -1, 1027, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1028, -1, 1028, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1029, -1, 1029, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1030, -1, 1030, 5220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1652, false, 1031, -1, 1031, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1032, -1, 1032, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1033, -1, 1033, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1034, -1, 1034, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1035, -1, 1035, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1655, false, 1036, -1, 1036, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1658, false, 1037, -1, 1037, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1661, false, 1038, -1, 1038, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1039, -1, 1039, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1121, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1664},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1120, -1, 1120, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1123, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1666},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1122, -1, 1122, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1125, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1668},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1124, -1, 1124, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1127, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1670},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1126, -1, 1126, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1129, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1672},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1128, -1, 1128, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1674},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1130, -1, 1130, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1133, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1676},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1132, -1, 1132, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1135, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1678},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1134, -1, 1134, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1137, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1680},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1136, -1, 1136, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1139, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1682},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1138, -1, 1138, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1141, -1, 5400, -1, false, false, false, false, utf8proc_sequences + 1684},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1140, -1, 1140, 5460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1686, false, -1, 1143, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1689},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1691, false, 1142, -1, 1142, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1694},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1144, -1, 1144, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1147, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1696},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1146, -1, 1146, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1149, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1698},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1148, -1, 1148, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1151, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1700},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1150, -1, 1150, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1153, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1702},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1152, -1, 1152, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1163, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1704},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1162, -1, 1162, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1706},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1164, -1, 1164, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1167, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1708},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1166, -1, 1166, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1169, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1710},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1168, -1, 1168, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1171, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1712},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1170, -1, 1170, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1173, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1714},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1172, -1, 1172, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1175, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1716},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1174, -1, 1174, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1177, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1718},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1176, -1, 1176, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1720},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1178, -1, 1178, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1181, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1722},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1180, -1, 1180, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1183, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1724},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1182, -1, 1182, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1185, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1726},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1184, -1, 1184, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1187, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1728},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1186, -1, 1186, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1189, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1730},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1188, -1, 1188, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1191, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1732},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1190, -1, 1190, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1193, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1734},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1192, -1, 1192, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1195, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1736},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1194, -1, 1194, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1197, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1738},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1196, -1, 1196, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1199, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1198, -1, 1198, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1201, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1742},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1200, -1, 1200, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1203, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1744},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1202, -1, 1202, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1205, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1746},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1204, -1, 1204, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1207, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1748},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1206, -1, 1206, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1209, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1750},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1208, -1, 1208, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1211, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1752},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1210, -1, 1210, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1213, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1754},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1212, -1, 1212, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1215, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1756},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1214, -1, 1214, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1231, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1758},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1760, false, -1, 1218, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1763},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1765, false, 1217, -1, 1217, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1220, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1768},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1219, -1, 1219, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1222, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1770},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1221, -1, 1221, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1772},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1223, -1, 1223, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1226, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1774},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1225, -1, 1225, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1228, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1776},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1227, -1, 1227, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1230, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1778},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1229, -1, 1229, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1216, -1, 1216, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1780, false, -1, 1233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1783},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1785, false, 1232, -1, 1232, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1788, false, -1, 1235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1791},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1793, false, 1234, -1, 1234, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1236, -1, 1236, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1798, false, -1, 1239, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1801},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1803, false, 1238, -1, 1238, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1241, -1, 5760, -1, false, false, false, false, utf8proc_sequences + 1806},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1240, -1, 1240, 5820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1808, false, -1, 1243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1811},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1813, false, 1242, -1, 1242, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1816, false, -1, 1245, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1819},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1821, false, 1244, -1, 1244, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1824, false, -1, 1247, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1827},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1829, false, 1246, -1, 1246, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1832},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1248, -1, 1248, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1834, false, -1, 1251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1837},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1839, false, 1250, -1, 1250, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1842, false, -1, 1253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1845},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1847, false, 1252, -1, 1252, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1850, false, -1, 1255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1853},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1855, false, 1254, -1, 1254, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1257, -1, 6120, -1, false, false, false, false, utf8proc_sequences + 1858},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1256, -1, 1256, 6180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1860, false, -1, 1259, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1863},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1865, false, 1258, -1, 1258, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1868, false, -1, 1261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1871},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1873, false, 1260, -1, 1260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1876, false, -1, 1263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1879},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1881, false, 1262, -1, 1262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1884, false, -1, 1265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1887},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1889, false, 1264, -1, 1264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1892, false, -1, 1267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1895},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1897, false, 1266, -1, 1266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1900, false, -1, 1269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1903},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1905, false, 1268, -1, 1268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1908},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1270, -1, 1270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1910, false, -1, 1273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1913},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1915, false, 1272, -1, 1272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1275, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1918},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1274, -1, 1274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1920},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1276, -1, 1276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1922},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1278, -1, 1278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1924},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1280, -1, 1280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1926},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1282, -1, 1282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1928},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1284, -1, 1284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1930},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1286, -1, 1286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1932},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1288, -1, 1288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1934},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1290, -1, 1290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1936},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1292, -1, 1292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1938},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1294, -1, 1294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1940},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1296, -1, 1296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1942},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1298, -1, 1298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1377, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1944},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1946},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1379, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1948},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1950},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1381, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1952},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1954},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1383, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1956},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1958},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1385, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1960},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1386, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1962},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1964},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1388, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1966},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1968},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1390, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1970},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1391, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1972},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1974},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1976},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1394, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1978},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1980},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1982},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1984},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1398, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1986},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1988},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1400, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1990},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1992},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1994},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1996},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1404, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1998},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2000},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1406, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2002},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2004},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1408, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2006},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2008},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2010},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2012},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1412, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2014},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2016},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2018},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1329, -1, 1329, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1330, -1, 1330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1331, -1, 1331, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1332, -1, 1332, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1333, -1, 1333, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1334, -1, 1334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1335, -1, 1335, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1336, -1, 1336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1337, -1, 1337, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1338, -1, 1338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1339, -1, 1339, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1340, -1, 1340, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1341, -1, 1341, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1342, -1, 1342, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1343, -1, 1343, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1344, -1, 1344, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1345, -1, 1345, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1346, -1, 1346, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1347, -1, 1347, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1348, -1, 1348, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1349, -1, 1349, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1350, -1, 1350, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1351, -1, 1351, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1352, -1, 1352, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1353, -1, 1353, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1354, -1, 1354, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1355, -1, 1355, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1356, -1, 1356, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1357, -1, 1357, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1358, -1, 1358, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1359, -1, 1359, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1360, -1, 1360, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1361, -1, 1361, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1362, -1, 1362, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1363, -1, 1363, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1364, -1, 1364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1365, -1, 1365, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1366, -1, 1366, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2020, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2020},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 17, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 18, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 19, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 6960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 20, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2068, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2071, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2074, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2077, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2080, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2083, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2086, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2089, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 21, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 22, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2098, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2101, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2104, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2107, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2110, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2113, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2116, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2119, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2122, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 24, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 23, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 25, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2134, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2137, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 27, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 26, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 7440, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2152, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 28, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7500, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 31, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7560, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2164, false, -1, -1, -1, 7620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 29, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 30, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 32, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 33, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 34, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 35, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2182, false, -1, -1, -1, 7860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 36, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 2203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2205, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2208, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2211, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2214, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2217, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2220, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2223, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2226, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2229, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2232, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2235, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2238, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2241, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2244, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2247, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2250, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2253, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2256, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2259, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 37, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11520, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2265},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2267},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11522, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2269},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2271},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11524, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2273},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2275},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2277},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2279},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11528, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2281},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2283},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11530, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2285},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2287},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11532, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2289},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2291},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11534, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2293},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2295},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11536, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2297},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2299},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11538, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2301},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2303},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11540, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2305},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2307},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11542, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2309},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2311},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11544, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2313},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11545, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2315},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11546, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2317},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2319},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11548, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2321},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2323},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11550, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2325},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11551, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2327},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11552, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2329},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11553, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2331},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11554, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2333},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2335},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11556, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2337},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2339},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 38, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8340, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8400, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8580, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11363, -1, 11363, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2476, false, -1, 7681, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2479},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2481, false, 7680, -1, 7680, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2484, false, -1, 7683, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2487},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2489, false, 7682, -1, 7682, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2492, false, -1, 7685, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2495},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2497, false, 7684, -1, 7684, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2500, false, -1, 7687, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2503},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2505, false, 7686, -1, 7686, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2508, false, -1, 7689, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2511},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2513, false, 7688, -1, 7688, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2516, false, -1, 7691, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2519},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2521, false, 7690, -1, 7690, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2524, false, -1, 7693, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2527},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2529, false, 7692, -1, 7692, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2532, false, -1, 7695, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2535},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2537, false, 7694, -1, 7694, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2540, false, -1, 7697, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2543},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2545, false, 7696, -1, 7696, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2548, false, -1, 7699, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2551},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2553, false, 7698, -1, 7698, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2556, false, -1, 7701, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2559},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2561, false, 7700, -1, 7700, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2564, false, -1, 7703, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2567},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2569, false, 7702, -1, 7702, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2572, false, -1, 7705, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2575},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2577, false, 7704, -1, 7704, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2580, false, -1, 7707, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2583},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2585, false, 7706, -1, 7706, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2588, false, -1, 7709, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2591},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2593, false, 7708, -1, 7708, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2596, false, -1, 7711, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2599},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2601, false, 7710, -1, 7710, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2604, false, -1, 7713, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2607},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2609, false, 7712, -1, 7712, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2612, false, -1, 7715, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2615},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2617, false, 7714, -1, 7714, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2620, false, -1, 7717, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2623},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2625, false, 7716, -1, 7716, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2628, false, -1, 7719, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2631},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2633, false, 7718, -1, 7718, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2636, false, -1, 7721, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2639},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2641, false, 7720, -1, 7720, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2644, false, -1, 7723, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2647},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2649, false, 7722, -1, 7722, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2652, false, -1, 7725, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2655},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2657, false, 7724, -1, 7724, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2660, false, -1, 7727, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2663},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2665, false, 7726, -1, 7726, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2668, false, -1, 7729, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2671},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2673, false, 7728, -1, 7728, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2676, false, -1, 7731, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2679},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2681, false, 7730, -1, 7730, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2684, false, -1, 7733, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2687},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2689, false, 7732, -1, 7732, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2692, false, -1, 7735, -1, 9360, -1, false, false, false, false, utf8proc_sequences + 2695},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2697, false, 7734, -1, 7734, 9420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2700, false, -1, 7737, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2703},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2705, false, 7736, -1, 7736, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2708, false, -1, 7739, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2711},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2713, false, 7738, -1, 7738, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2716, false, -1, 7741, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2719},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2721, false, 7740, -1, 7740, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2724, false, -1, 7743, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2727},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2729, false, 7742, -1, 7742, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2732, false, -1, 7745, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2735},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2737, false, 7744, -1, 7744, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2740, false, -1, 7747, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2743},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2745, false, 7746, -1, 7746, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2748, false, -1, 7749, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2753, false, 7748, -1, 7748, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2756, false, -1, 7751, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2759},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2761, false, 7750, -1, 7750, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2764, false, -1, 7753, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2767},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2769, false, 7752, -1, 7752, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2772, false, -1, 7755, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2775},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2777, false, 7754, -1, 7754, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2780, false, -1, 7757, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2783},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2785, false, 7756, -1, 7756, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2788, false, -1, 7759, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2791},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2793, false, 7758, -1, 7758, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2796, false, -1, 7761, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2799},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2801, false, 7760, -1, 7760, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2804, false, -1, 7763, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2807},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2809, false, 7762, -1, 7762, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2812, false, -1, 7765, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2815},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2817, false, 7764, -1, 7764, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2820, false, -1, 7767, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2823},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2825, false, 7766, -1, 7766, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2828, false, -1, 7769, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2831},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2833, false, 7768, -1, 7768, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2836, false, -1, 7771, -1, 9840, -1, false, false, false, false, utf8proc_sequences + 2839},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2841, false, 7770, -1, 7770, 9900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2844, false, -1, 7773, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2847},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2849, false, 7772, -1, 7772, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2852, false, -1, 7775, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2855},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2857, false, 7774, -1, 7774, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2860, false, -1, 7777, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2865, false, 7776, -1, 7776, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2868, false, -1, 7779, -1, 10200, -1, false, false, false, false, utf8proc_sequences + 2871},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2873, false, 7778, -1, 7778, 10260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2876, false, -1, 7781, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2879},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2881, false, 7780, -1, 7780, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2884, false, -1, 7783, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2887},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2889, false, 7782, -1, 7782, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2892, false, -1, 7785, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2895},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2897, false, 7784, -1, 7784, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2900, false, -1, 7787, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2903},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2905, false, 7786, -1, 7786, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2908, false, -1, 7789, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2911},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2913, false, 7788, -1, 7788, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2916, false, -1, 7791, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2919},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2921, false, 7790, -1, 7790, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2924, false, -1, 7793, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2927},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2929, false, 7792, -1, 7792, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2932, false, -1, 7795, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2935},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2937, false, 7794, -1, 7794, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2940, false, -1, 7797, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2943},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2945, false, 7796, -1, 7796, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2948, false, -1, 7799, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2951},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2953, false, 7798, -1, 7798, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2956, false, -1, 7801, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2959},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2961, false, 7800, -1, 7800, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2964, false, -1, 7803, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2967},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2969, false, 7802, -1, 7802, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2972, false, -1, 7805, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2975},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2977, false, 7804, -1, 7804, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2980, false, -1, 7807, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2983},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2985, false, 7806, -1, 7806, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2988, false, -1, 7809, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2991},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2993, false, 7808, -1, 7808, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2996, false, -1, 7811, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2999},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3001, false, 7810, -1, 7810, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3004, false, -1, 7813, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3007},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3009, false, 7812, -1, 7812, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3012, false, -1, 7815, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3015},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3017, false, 7814, -1, 7814, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3020, false, -1, 7817, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3023},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3025, false, 7816, -1, 7816, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3028, false, -1, 7819, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3031},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3033, false, 7818, -1, 7818, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3036, false, -1, 7821, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3039},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3041, false, 7820, -1, 7820, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3044, false, -1, 7823, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3047},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3049, false, 7822, -1, 7822, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3052, false, -1, 7825, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3055},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3057, false, 7824, -1, 7824, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3060, false, -1, 7827, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3063},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3065, false, 7826, -1, 7826, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3068, false, -1, 7829, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3071},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3073, false, 7828, -1, 7828, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3076, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3076},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3079, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3079},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3082, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3082},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3085, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3085},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 3088, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3088},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3091, false, 7776, -1, 7776, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3094, false, -1, 7841, -1, 10980, -1, false, false, false, false, utf8proc_sequences + 3097},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3099, false, 7840, -1, 7840, 11040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3102, false, -1, 7843, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3105},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3107, false, 7842, -1, 7842, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3110, false, -1, 7845, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3113},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3115, false, 7844, -1, 7844, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3118, false, -1, 7847, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3121},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3123, false, 7846, -1, 7846, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3126, false, -1, 7849, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3129},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3131, false, 7848, -1, 7848, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3134, false, -1, 7851, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3137},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3139, false, 7850, -1, 7850, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3142, false, -1, 7853, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3145},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3147, false, 7852, -1, 7852, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3150, false, -1, 7855, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3153},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3155, false, 7854, -1, 7854, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3158, false, -1, 7857, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3161},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3163, false, 7856, -1, 7856, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3166, false, -1, 7859, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3169},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3171, false, 7858, -1, 7858, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3174, false, -1, 7861, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3177},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3179, false, 7860, -1, 7860, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3182, false, -1, 7863, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3185},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3187, false, 7862, -1, 7862, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3190, false, -1, 7865, -1, 11340, -1, false, false, false, false, utf8proc_sequences + 3193},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3195, false, 7864, -1, 7864, 11400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3198, false, -1, 7867, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3201},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3203, false, 7866, -1, 7866, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3206, false, -1, 7869, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3209},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3211, false, 7868, -1, 7868, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3214, false, -1, 7871, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3217},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3219, false, 7870, -1, 7870, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3222, false, -1, 7873, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3225},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3227, false, 7872, -1, 7872, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3230, false, -1, 7875, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3233},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3235, false, 7874, -1, 7874, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3238, false, -1, 7877, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3241},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3243, false, 7876, -1, 7876, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3246, false, -1, 7879, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3249},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3251, false, 7878, -1, 7878, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3254, false, -1, 7881, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3257},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3259, false, 7880, -1, 7880, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3262, false, -1, 7883, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3265},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3267, false, 7882, -1, 7882, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3270, false, -1, 7885, -1, 11580, -1, false, false, false, false, utf8proc_sequences + 3273},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3275, false, 7884, -1, 7884, 11640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3278, false, -1, 7887, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3281},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3283, false, 7886, -1, 7886, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3286, false, -1, 7889, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3289},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3291, false, 7888, -1, 7888, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3294, false, -1, 7891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3297},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3299, false, 7890, -1, 7890, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3302, false, -1, 7893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3305},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3307, false, 7892, -1, 7892, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3310, false, -1, 7895, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3313},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3315, false, 7894, -1, 7894, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3318, false, -1, 7897, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3321},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3323, false, 7896, -1, 7896, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3326, false, -1, 7899, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3329},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3331, false, 7898, -1, 7898, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3334, false, -1, 7901, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3337},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3339, false, 7900, -1, 7900, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3342, false, -1, 7903, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3345},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3347, false, 7902, -1, 7902, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3350, false, -1, 7905, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3353},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3355, false, 7904, -1, 7904, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3358, false, -1, 7907, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3361},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3363, false, 7906, -1, 7906, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3366, false, -1, 7909, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3369},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3371, false, 7908, -1, 7908, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3374, false, -1, 7911, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3377},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3379, false, 7910, -1, 7910, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3382, false, -1, 7913, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3385},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3387, false, 7912, -1, 7912, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3390, false, -1, 7915, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3393},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3395, false, 7914, -1, 7914, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3398, false, -1, 7917, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3401},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3403, false, 7916, -1, 7916, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3406, false, -1, 7919, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3409},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3411, false, 7918, -1, 7918, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3414, false, -1, 7921, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3417},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3419, false, 7920, -1, 7920, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3422, false, -1, 7923, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3425},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3427, false, 7922, -1, 7922, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3430, false, -1, 7925, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3433},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3435, false, 7924, -1, 7924, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3438, false, -1, 7927, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3441},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3443, false, 7926, -1, 7926, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3446, false, -1, 7929, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3449},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3451, false, 7928, -1, 7928, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3454, false, 7944, -1, 7944, 11940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3457, false, 7945, -1, 7945, 12000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3460, false, 7946, -1, 7946, 13560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3463, false, 7947, -1, 7947, 13620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3466, false, 7948, -1, 7948, 13680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3469, false, 7949, -1, 7949, 13740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3472, false, 7950, -1, 7950, 13800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3475, false, 7951, -1, 7951, 13860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3478, false, -1, 7936, -1, 12060, -1, false, false, false, false, utf8proc_sequences + 3481},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3483, false, -1, 7937, -1, 12120, -1, false, false, false, false, utf8proc_sequences + 3486},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3488, false, -1, 7938, -1, 13920, -1, false, false, false, false, utf8proc_sequences + 3491},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3493, false, -1, 7939, -1, 13980, -1, false, false, false, false, utf8proc_sequences + 3496},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3498, false, -1, 7940, -1, 14040, -1, false, false, false, false, utf8proc_sequences + 3501},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3503, false, -1, 7941, -1, 14100, -1, false, false, false, false, utf8proc_sequences + 3506},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3508, false, -1, 7942, -1, 14160, -1, false, false, false, false, utf8proc_sequences + 3511},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3513, false, -1, 7943, -1, 14220, -1, false, false, false, false, utf8proc_sequences + 3516},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3518, false, 7960, -1, 7960, 12180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3521, false, 7961, -1, 7961, 12240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3524, false, 7962, -1, 7962, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3527, false, 7963, -1, 7963, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3530, false, 7964, -1, 7964, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3533, false, 7965, -1, 7965, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3536, false, -1, 7952, -1, 12300, -1, false, false, false, false, utf8proc_sequences + 3539},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3541, false, -1, 7953, -1, 12360, -1, false, false, false, false, utf8proc_sequences + 3544},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3546, false, -1, 7954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3549},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3551, false, -1, 7955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3554},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3556, false, -1, 7956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3559},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3561, false, -1, 7957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3564},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3566, false, 7976, -1, 7976, 12420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3569, false, 7977, -1, 7977, 12480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3572, false, 7978, -1, 7978, 14280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3575, false, 7979, -1, 7979, 14340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3578, false, 7980, -1, 7980, 14400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3581, false, 7981, -1, 7981, 14460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3584, false, 7982, -1, 7982, 14520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3587, false, 7983, -1, 7983, 14580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3590, false, -1, 7968, -1, 12540, -1, false, false, false, false, utf8proc_sequences + 3593},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3595, false, -1, 7969, -1, 12600, -1, false, false, false, false, utf8proc_sequences + 3598},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3600, false, -1, 7970, -1, 14640, -1, false, false, false, false, utf8proc_sequences + 3603},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3605, false, -1, 7971, -1, 14700, -1, false, false, false, false, utf8proc_sequences + 3608},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3610, false, -1, 7972, -1, 14760, -1, false, false, false, false, utf8proc_sequences + 3613},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3615, false, -1, 7973, -1, 14820, -1, false, false, false, false, utf8proc_sequences + 3618},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3620, false, -1, 7974, -1, 14880, -1, false, false, false, false, utf8proc_sequences + 3623},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3625, false, -1, 7975, -1, 14940, -1, false, false, false, false, utf8proc_sequences + 3628},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3630, false, 7992, -1, 7992, 12660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3633, false, 7993, -1, 7993, 12720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3636, false, 7994, -1, 7994, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3639, false, 7995, -1, 7995, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3642, false, 7996, -1, 7996, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3645, false, 7997, -1, 7997, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3648, false, 7998, -1, 7998, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3651, false, 7999, -1, 7999, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3654, false, -1, 7984, -1, 12780, -1, false, false, false, false, utf8proc_sequences + 3657},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3659, false, -1, 7985, -1, 12840, -1, false, false, false, false, utf8proc_sequences + 3662},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3664, false, -1, 7986, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3667},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3669, false, -1, 7987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3672},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3674, false, -1, 7988, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3677},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3679, false, -1, 7989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3682},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3684, false, -1, 7990, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3687},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3689, false, -1, 7991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3692},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3694, false, 8008, -1, 8008, 12900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3697, false, 8009, -1, 8009, 12960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3700, false, 8010, -1, 8010, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3703, false, 8011, -1, 8011, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3706, false, 8012, -1, 8012, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3709, false, 8013, -1, 8013, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3712, false, -1, 8000, -1, 13020, -1, false, false, false, false, utf8proc_sequences + 3715},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3717, false, -1, 8001, -1, 13080, -1, false, false, false, false, utf8proc_sequences + 3720},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3722, false, -1, 8002, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3725},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3727, false, -1, 8003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3730},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3732, false, -1, 8004, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3735},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3737, false, -1, 8005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3742, false, -1, -1, -1, 13140, -1, false, false, false, false, utf8proc_sequences + 3742},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3745, false, 8025, -1, 8025, 13200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3755, false, 8027, -1, 8027, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3761},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3765, false, 8029, -1, 8029, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3771},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3775, false, 8031, -1, 8031, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3778, false, -1, 8017, -1, 13260, -1, false, false, false, false, utf8proc_sequences + 3781},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3783, false, -1, 8019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3786},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3788, false, -1, 8021, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3791},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3793, false, -1, 8023, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3798, false, 8040, -1, 8040, 13320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3801, false, 8041, -1, 8041, 13380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3804, false, 8042, -1, 8042, 15000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3807, false, 8043, -1, 8043, 15060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3810, false, 8044, -1, 8044, 15120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3813, false, 8045, -1, 8045, 15180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3816, false, 8046, -1, 8046, 15240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3819, false, 8047, -1, 8047, 15300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3822, false, -1, 8032, -1, 13440, -1, false, false, false, false, utf8proc_sequences + 3825},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3827, false, -1, 8033, -1, 13500, -1, false, false, false, false, utf8proc_sequences + 3830},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3832, false, -1, 8034, -1, 15360, -1, false, false, false, false, utf8proc_sequences + 3835},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3837, false, -1, 8035, -1, 15420, -1, false, false, false, false, utf8proc_sequences + 3840},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3842, false, -1, 8036, -1, 15480, -1, false, false, false, false, utf8proc_sequences + 3845},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3847, false, -1, 8037, -1, 15540, -1, false, false, false, false, utf8proc_sequences + 3850},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3852, false, -1, 8038, -1, 15600, -1, false, false, false, false, utf8proc_sequences + 3855},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3857, false, -1, 8039, -1, 15660, -1, false, false, false, false, utf8proc_sequences + 3860},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3862, false, 8122, -1, 8122, 15720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1341, false, 8123, -1, 8123, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3865, false, 8136, -1, 8136, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1348, false, 8137, -1, 8137, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3868, false, 8138, -1, 8138, 15900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1353, false, 8139, -1, 8139, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3871, false, 8154, -1, 8154, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1358, false, 8155, -1, 8155, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3874, false, 8184, -1, 8184, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1363, false, 8185, -1, 8185, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3877, false, 8170, -1, 8170, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1368, false, 8171, -1, 8171, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3880, false, 8186, -1, 8186, 16320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1373, false, 8187, -1, 8187, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3883, false, 8072, -1, 8072, -1, -1, false, false, false, false, utf8proc_sequences + 3886},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3889, false, 8073, -1, 8073, -1, -1, false, false, false, false, utf8proc_sequences + 3892},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3895, false, 8074, -1, 8074, -1, -1, false, false, false, false, utf8proc_sequences + 3898},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3901, false, 8075, -1, 8075, -1, -1, false, false, false, false, utf8proc_sequences + 3904},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3907, false, 8076, -1, 8076, -1, -1, false, false, false, false, utf8proc_sequences + 3910},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3913, false, 8077, -1, 8077, -1, -1, false, false, false, false, utf8proc_sequences + 3916},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3919, false, 8078, -1, 8078, -1, -1, false, false, false, false, utf8proc_sequences + 3922},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3925, false, 8079, -1, 8079, -1, -1, false, false, false, false, utf8proc_sequences + 3928},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3931, false, -1, 8064, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3934},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3936, false, -1, 8065, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3939},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3941, false, -1, 8066, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3944},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3946, false, -1, 8067, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3949},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3951, false, -1, 8068, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3954},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3956, false, -1, 8069, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3959},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3961, false, -1, 8070, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3964},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3966, false, -1, 8071, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3969},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3971, false, 8088, -1, 8088, -1, -1, false, false, false, false, utf8proc_sequences + 3974},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3977, false, 8089, -1, 8089, -1, -1, false, false, false, false, utf8proc_sequences + 3980},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3983, false, 8090, -1, 8090, -1, -1, false, false, false, false, utf8proc_sequences + 3986},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3989, false, 8091, -1, 8091, -1, -1, false, false, false, false, utf8proc_sequences + 3992},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3995, false, 8092, -1, 8092, -1, -1, false, false, false, false, utf8proc_sequences + 3998},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4001, false, 8093, -1, 8093, -1, -1, false, false, false, false, utf8proc_sequences + 4004},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4007, false, 8094, -1, 8094, -1, -1, false, false, false, false, utf8proc_sequences + 4010},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4013, false, 8095, -1, 8095, -1, -1, false, false, false, false, utf8proc_sequences + 4016},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4019, false, -1, 8080, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4022},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4024, false, -1, 8081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4027},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4029, false, -1, 8082, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4032},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4034, false, -1, 8083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4037},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4039, false, -1, 8084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4042},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4044, false, -1, 8085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4047},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4049, false, -1, 8086, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4052},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4054, false, -1, 8087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4057},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4059, false, 8104, -1, 8104, -1, -1, false, false, false, false, utf8proc_sequences + 4062},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4065, false, 8105, -1, 8105, -1, -1, false, false, false, false, utf8proc_sequences + 4068},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4071, false, 8106, -1, 8106, -1, -1, false, false, false, false, utf8proc_sequences + 4074},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4077, false, 8107, -1, 8107, -1, -1, false, false, false, false, utf8proc_sequences + 4080},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4083, false, 8108, -1, 8108, -1, -1, false, false, false, false, utf8proc_sequences + 4086},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4089, false, 8109, -1, 8109, -1, -1, false, false, false, false, utf8proc_sequences + 4092},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4095, false, 8110, -1, 8110, -1, -1, false, false, false, false, utf8proc_sequences + 4098},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4101, false, 8111, -1, 8111, -1, -1, false, false, false, false, utf8proc_sequences + 4104},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4107, false, -1, 8096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4110},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4112, false, -1, 8097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4115},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4117, false, -1, 8098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4120},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4122, false, -1, 8099, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4125},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4127, false, -1, 8100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4130},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4132, false, -1, 8101, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4135},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4137, false, -1, 8102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4140},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4142, false, -1, 8103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4145},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4147, false, 8120, -1, 8120, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4150, false, 8121, -1, 8121, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4153, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4156},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4159, false, 8124, -1, 8124, -1, -1, false, false, false, false, utf8proc_sequences + 4162},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4165, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4168},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4171, false, -1, -1, -1, 15840, -1, false, false, false, false, utf8proc_sequences + 4171},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4174, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4177},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4181, false, -1, 8112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4184},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4186, false, -1, 8113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4189},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4191, false, -1, 8048, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4194},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4196, false, -1, 8049, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4198},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4200, false, -1, 8115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4203},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1326, false, 921, -1, 921, -1, -1, false, false, false, false, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, 16080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4214, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4217},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4220, false, 8140, -1, 8140, -1, -1, false, false, false, false, utf8proc_sequences + 4223},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4226, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4229},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4232, false, -1, -1, -1, 16020, -1, false, false, false, false, utf8proc_sequences + 4232},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4235, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4238},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4242, false, -1, 8050, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4245},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4247, false, -1, 8051, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4249},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4251, false, -1, 8052, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4254},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4256, false, -1, 8053, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4258},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4260, false, -1, 8131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4263},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4274, false, 8152, -1, 8152, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4277, false, 8153, -1, 8153, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4280, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4283},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4287, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4289, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4289},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4292, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4295},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4299, false, -1, 8144, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4302},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4304, false, -1, 8145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4307},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4309, false, -1, 8054, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4312},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4314, false, -1, 8055, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4316},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4327, false, 8168, -1, 8168, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4330, false, 8169, -1, 8169, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4333, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4336},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4340, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4342, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4342},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4345, false, 8172, -1, 8172, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4348, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4348},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4351, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4354},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4358, false, -1, 8160, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4361},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4363, false, -1, 8161, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4366},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4368, false, -1, 8058, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4371},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4373, false, -1, 8059, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4375},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4377, false, -1, 8165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4380},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4389, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4392},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4395, false, 8188, -1, 8188, -1, -1, false, false, false, false, utf8proc_sequences + 4398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4401, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4404},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4407, false, -1, -1, -1, 16440, -1, false, false, false, false, utf8proc_sequences + 4407},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4410, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4413},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4417, false, -1, 8056, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4420},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4422, false, -1, 8057, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4426, false, -1, 8060, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4431, false, -1, 8061, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4433},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4435, false, -1, 8179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4438},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4442, false, -1, -1, -1, 16140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, true, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 4449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4567, false, -1, 969, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2396, false, -1, 107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 20},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4569, false, -1, 229, -1, -1, -1, false, false, false, false, utf8proc_sequences + 114},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4573},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4591, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8498, -1, 8498, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2392, false, -1, 8560, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4644},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4646, false, -1, 8561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4649},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4651, false, -1, 8562, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4655},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4657, false, -1, 8563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4660},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4662, false, -1, 8564, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4664},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4666, false, -1, 8565, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4669},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4671, false, -1, 8566, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4675},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4677, false, -1, 8567, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4682},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4684, false, -1, 8568, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4687},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4689, false, -1, 8569, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4691},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4693, false, -1, 8570, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4696},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4698, false, -1, 8571, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4702},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2398, false, -1, 8572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4704},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4532, false, -1, 8573, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4706},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2382, false, -1, 8574, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4708},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2400, false, -1, 8575, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4710},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 16, false, 8544, -1, 8544, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4712, false, 8545, -1, 8545, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4715, false, 8546, -1, 8546, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4719, false, 8547, -1, 8547, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 42, false, 8548, -1, 8548, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4722, false, 8549, -1, 8549, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4725, false, 8550, -1, 8550, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4729, false, 8551, -1, 8551, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4734, false, 8552, -1, 8552, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 46, false, 8553, -1, 8553, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4737, false, 8554, -1, 8554, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4740, false, 8555, -1, 8555, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 22, false, 8556, -1, 8556, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4, false, 8557, -1, 8557, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6, false, 8558, -1, 8558, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 24, false, 8559, -1, 8559, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8580, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4744},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8579, -1, 8579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4764, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4767, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4770, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4773, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4776, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4779, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4782, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4786, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4789, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4793, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4796, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4799, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4802, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4805, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4808, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4814, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4817, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4820, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4823, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4826, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4829, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4832, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4835, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4838, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4841, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4844, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4847, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18360, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4850, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4853, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4856, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4859, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4862, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4865, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4868, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4871, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4874, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4877, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4880, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4883, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4886, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4889, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4892, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4894, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2376, false, -1, 9424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5195},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2380, false, -1, 9425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5197},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4532, false, -1, 9426, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5199},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2382, false, -1, 9427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5201},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2384, false, -1, 9428, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5203},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4571, false, -1, 9429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5205},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2388, false, -1, 9430, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5207},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2390, false, -1, 9431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5209},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2392, false, -1, 9432, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5211},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2394, false, -1, 9433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5213},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2396, false, -1, 9434, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5215},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2398, false, -1, 9435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5217},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2400, false, -1, 9436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5219},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2402, false, -1, 9437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5221},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2404, false, -1, 9438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5223},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2408, false, -1, 9439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5225},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4553, false, -1, 9440, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5227},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2410, false, -1, 9441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5229},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5231, false, -1, 9442, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5233},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2412, false, -1, 9443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5235},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2414, false, -1, 9444, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5237},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4662, false, -1, 9445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5239},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2416, false, -1, 9446, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5241},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4689, false, -1, 9447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5243},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5245, false, -1, 9448, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5247},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4565, false, -1, 9449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5249},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 0, false, 9398, -1, 9398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2, false, 9399, -1, 9399, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4, false, 9400, -1, 9400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6, false, 9401, -1, 9401, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 8, false, 9402, -1, 9402, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 10, false, 9403, -1, 9403, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 12, false, 9404, -1, 9404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 14, false, 9405, -1, 9405, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 16, false, 9406, -1, 9406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 18, false, 9407, -1, 9407, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 20, false, 9408, -1, 9408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 22, false, 9409, -1, 9409, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 24, false, 9410, -1, 9410, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 26, false, 9411, -1, 9411, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 28, false, 9412, -1, 9412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 30, false, 9413, -1, 9413, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 32, false, 9414, -1, 9414, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 34, false, 9415, -1, 9415, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 36, false, 9416, -1, 9416, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 38, false, 9417, -1, 9417, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 40, false, 9418, -1, 9418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 42, false, 9419, -1, 9419, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 44, false, 9420, -1, 9420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 46, false, 9421, -1, 9421, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 48, false, 9422, -1, 9422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 50, false, 9423, -1, 9423, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5251, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5256, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 5267, true, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 19140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11312, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5270},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11313, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5272},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5274},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11315, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5276},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5278},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11317, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5280},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5282},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11319, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5284},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5286},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11321, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5288},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5290},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11323, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5292},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5294},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11325, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5296},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5298},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11327, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5300},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5302},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11329, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5304},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11330, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5306},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5308},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11332, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5310},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11333, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5312},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11334, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5314},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5316},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11336, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5318},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5320},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11338, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5322},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5324},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11340, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5326},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5328},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11342, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5330},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5332},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11344, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5334},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5336},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5338},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5340},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5342},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5344},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5346},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5348},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5350},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5352},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5354},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5356},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5358},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5360},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5362},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11264, -1, 11264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11265, -1, 11265, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11266, -1, 11266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11267, -1, 11267, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11268, -1, 11268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11269, -1, 11269, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11270, -1, 11270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11271, -1, 11271, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11272, -1, 11272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11273, -1, 11273, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11274, -1, 11274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11275, -1, 11275, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11276, -1, 11276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11277, -1, 11277, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11278, -1, 11278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11279, -1, 11279, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11280, -1, 11280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11281, -1, 11281, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11282, -1, 11282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11283, -1, 11283, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11284, -1, 11284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11285, -1, 11285, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11286, -1, 11286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11287, -1, 11287, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11288, -1, 11288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11289, -1, 11289, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11290, -1, 11290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11291, -1, 11291, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11292, -1, 11292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11293, -1, 11293, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11294, -1, 11294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11295, -1, 11295, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11296, -1, 11296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11297, -1, 11297, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11298, -1, 11298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11299, -1, 11299, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11300, -1, 11300, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11301, -1, 11301, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11302, -1, 11302, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11303, -1, 11303, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11304, -1, 11304, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11305, -1, 11305, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11306, -1, 11306, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11307, -1, 11307, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11308, -1, 11308, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11309, -1, 11309, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11310, -1, 11310, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5364},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11360, -1, 11360, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5366},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 7549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5368},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5370},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 570, -1, 570, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 574, -1, 574, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5372},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11367, -1, 11367, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5374},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11369, -1, 11369, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11372, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5376},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11371, -1, 11371, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5378},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11381, -1, 11381, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5380},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11392, -1, 11392, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5382},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11394, -1, 11394, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5384},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11396, -1, 11396, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5386},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11398, -1, 11398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5388},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11400, -1, 11400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5390},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11402, -1, 11402, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5392},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11404, -1, 11404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5394},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11406, -1, 11406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5396},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11408, -1, 11408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11410, -1, 11410, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5400},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11412, -1, 11412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11415, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5402},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11414, -1, 11414, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11417, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5404},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11416, -1, 11416, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5406},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11418, -1, 11418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5408},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11420, -1, 11420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11423, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5410},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11422, -1, 11422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5412},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11424, -1, 11424, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5414},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11426, -1, 11426, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5416},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11428, -1, 11428, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5418},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11430, -1, 11430, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5420},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11432, -1, 11432, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5422},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11434, -1, 11434, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5424},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11436, -1, 11436, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5426},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11438, -1, 11438, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5428},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11440, -1, 11440, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5430},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11442, -1, 11442, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5432},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11444, -1, 11444, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5434},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11446, -1, 11446, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5436},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11448, -1, 11448, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11451, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5438},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11450, -1, 11450, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11453, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5440},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11452, -1, 11452, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11455, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5442},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11454, -1, 11454, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11457, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5444},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11456, -1, 11456, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11459, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5446},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11458, -1, 11458, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11461, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5448},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11460, -1, 11460, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11463, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5450},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11462, -1, 11462, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11465, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5452},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11464, -1, 11464, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11467, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5454},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11466, -1, 11466, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11469, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5456},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11468, -1, 11468, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11471, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5458},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11470, -1, 11470, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11473, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5460},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11472, -1, 11472, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11475, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5462},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11474, -1, 11474, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5464},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11476, -1, 11476, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5466},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11478, -1, 11478, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5468},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11480, -1, 11480, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5470},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11482, -1, 11482, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5472},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11484, -1, 11484, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5474},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11486, -1, 11486, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5476},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11488, -1, 11488, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11491, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5478},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11490, -1, 11490, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4256, -1, 4256, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4257, -1, 4257, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4258, -1, 4258, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4259, -1, 4259, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4260, -1, 4260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4261, -1, 4261, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4262, -1, 4262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4263, -1, 4263, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4264, -1, 4264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4265, -1, 4265, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4266, -1, 4266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4267, -1, 4267, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4268, -1, 4268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4269, -1, 4269, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4270, -1, 4270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4271, -1, 4271, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4272, -1, 4272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4273, -1, 4273, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4274, -1, 4274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4275, -1, 4275, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4276, -1, 4276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4277, -1, 4277, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4278, -1, 4278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4279, -1, 4279, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4280, -1, 4280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4281, -1, 4281, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4282, -1, 4282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4283, -1, 4283, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4284, -1, 4284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4285, -1, 4285, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4286, -1, 4286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4287, -1, 4287, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4288, -1, 4288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4289, -1, 4289, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4290, -1, 4290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4291, -1, 4291, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4292, -1, 4292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4293, -1, 4293, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 224, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19440, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 52, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 53, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21360, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6208, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6745, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6757, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6769, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6773, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6785, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6809, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6821, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6849, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6853, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6857, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7781, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7813, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8039, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8057, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8069, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8157, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8165, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8169, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8177, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8181, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8193, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8199, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8201, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8207, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8213, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8225, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8391, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8399, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8403, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8423, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8427, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8439, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8457, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8469, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8471, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8481, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8487, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8493, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8495, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8525, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8533, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8549, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8557, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8561, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8573, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8585, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8645, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8649, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8657, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8661, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8669, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8681, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8693, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8705, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8745, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8745},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8748},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8751, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8754, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8754},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8758},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8762, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8765, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8768},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8771, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8771},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8774, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8774},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8777, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8777},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8780, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8780},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8783, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8786, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8789, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8793, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8801, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8803, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8806, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8809, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8812, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8815, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8818, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8821, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8824, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8827, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8830, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8833, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8836, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8839, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8842, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8845, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8848, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8851, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8854, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8857, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8860, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8863, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8866, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8869, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8872, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8875, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8878, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8881, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8884, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8887, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8890, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8893, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8896, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9775, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9783, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9787, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9819, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9823, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9831, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 10013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9989, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9991, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2376, false, -1, 65345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10165},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2380, false, -1, 65346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10167},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4532, false, -1, 65347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10169},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2382, false, -1, 65348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10171},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2384, false, -1, 65349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10173},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4571, false, -1, 65350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10175},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2388, false, -1, 65351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10177},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2390, false, -1, 65352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10179},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2392, false, -1, 65353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10181},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2394, false, -1, 65354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10183},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2396, false, -1, 65355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10185},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2398, false, -1, 65356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10187},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2400, false, -1, 65357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10189},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2402, false, -1, 65358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10191},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2404, false, -1, 65359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10193},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2408, false, -1, 65360, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10195},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4553, false, -1, 65361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10197},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2410, false, -1, 65362, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10199},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5231, false, -1, 65363, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10201},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2412, false, -1, 65364, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10203},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2414, false, -1, 65365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10205},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4662, false, -1, 65366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10207},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2416, false, -1, 65367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10209},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4689, false, -1, 65368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10211},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5245, false, -1, 65369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10213},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4565, false, -1, 65370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10215},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10009, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10011, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 0, false, 65313, -1, 65313, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2, false, 65314, -1, 65314, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4, false, 65315, -1, 65315, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 6, false, 65316, -1, 65316, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 8, false, 65317, -1, 65317, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10, false, 65318, -1, 65318, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 12, false, 65319, -1, 65319, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 14, false, 65320, -1, 65320, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 16, false, 65321, -1, 65321, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 18, false, 65322, -1, 65322, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 20, false, 65323, -1, 65323, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 22, false, 65324, -1, 65324, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 24, false, 65325, -1, 65325, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 26, false, 65326, -1, 65326, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 28, false, 65327, -1, 65327, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 30, false, 65328, -1, 65328, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 32, false, 65329, -1, 65329, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 34, false, 65330, -1, 65330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 36, false, 65331, -1, 65331, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 38, false, 65332, -1, 65332, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 40, false, 65333, -1, 65333, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 42, false, 65334, -1, 65334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 44, false, 65335, -1, 65335, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 46, false, 65336, -1, 65336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 48, false, 65337, -1, 65337, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 50, false, 65338, -1, 65338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10223, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10225, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10001, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10003, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10255, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66600, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10387},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10389},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66602, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10391},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10393},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66604, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10395},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66605, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10397},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66606, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10399},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66607, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10401},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10403},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66609, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10405},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66610, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10407},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10409},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66612, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10411},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66613, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10413},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66614, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10415},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66615, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10417},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10419},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10421},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66618, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10423},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10425},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66620, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10427},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66621, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66622, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10431},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10433},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66624, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10435},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66625, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10437},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10439},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66627, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10441},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66628, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10443},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10445},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66630, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10447},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66631, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10449},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66632, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10451},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66633, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10453},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66634, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10455},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66635, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10457},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66636, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10459},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10461},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66638, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10463},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66639, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10465},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66560, -1, 66560, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66561, -1, 66561, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66562, -1, 66562, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66563, -1, 66563, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66564, -1, 66564, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66565, -1, 66565, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66566, -1, 66566, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66567, -1, 66567, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66568, -1, 66568, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66569, -1, 66569, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66570, -1, 66570, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66571, -1, 66571, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66572, -1, 66572, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66573, -1, 66573, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66574, -1, 66574, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66575, -1, 66575, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66576, -1, 66576, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66577, -1, 66577, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66578, -1, 66578, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66579, -1, 66579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66580, -1, 66580, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66581, -1, 66581, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66582, -1, 66582, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66583, -1, 66583, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66584, -1, 66584, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66585, -1, 66585, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66586, -1, 66586, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66587, -1, 66587, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66588, -1, 66588, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66589, -1, 66589, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66590, -1, 66590, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66591, -1, 66591, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66592, -1, 66592, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66593, -1, 66593, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66594, -1, 66594, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66595, -1, 66595, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66596, -1, 66596, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66597, -1, 66597, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66598, -1, 66598, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66599, -1, 66599, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10467, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10470, false, -1, -1, -1, 22200, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10473, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10476, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10479, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10482, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10485, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 54, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 55, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 56, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 57, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 58, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 59, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10488, false, -1, -1, -1, 22380, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10491, false, -1, -1, -1, 22440, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10494, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10497, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10500, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10503, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 32, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 67, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10550, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10996, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11002, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11018, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11024, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11036, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11042, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11048, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11054, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11060, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11066, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11072, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11078, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11084, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11090, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11096, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11316, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11336, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11340, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11348, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11360, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11372, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11478, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+};
+
+UTF8PROC_DATA
+const int32_t utf8proc_combinations[] = {
+ 192, 193, 194, 195, 196, 197, -1,
+ 256, 258, 260, 550, 461, -1, -1, 512,
+ 514, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7680, 7840, -1, -1, -1, -1, -1, 7842,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 262, 264,
+ -1, -1, -1, 199, -1, -1, -1, 266,
+ 268, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 200, 201, 202, 7868, 203, -1, 552,
+ 274, 276, 280, 278, 282, -1, -1, 516,
+ 518, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7864, -1, 7704, 7706, -1, -1, 7866,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 204, 205, 206,
+ 296, 207, -1, -1, 298, 300, 302, 304,
+ 463, -1, -1, 520, 522, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7882, -1, -1,
+ 7724, -1, -1, 7880, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 504, 323, -1, 209, -1, -1, 325,
+ -1, -1, -1, 7748, 327, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7750, 7752, 7754, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 210, 211, 212,
+ 213, 214, -1, -1, 332, 334, 490, 558,
+ 465, 336, 416, 524, 526, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7884, -1, -1,
+ -1, -1, -1, 7886, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 217, 218, 219, 360, 220, 366, -1,
+ 362, 364, 370, -1, 467, 368, 431, 532,
+ 534, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7908, -1, 7798, 7796, -1, 7794, 7910,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7922, 221, 374,
+ 7928, 376, -1, -1, 562, -1, -1, 7822,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7924, -1, -1,
+ -1, -1, -1, 7926, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 224, 225, 226, 227, 228, 229, -1,
+ 257, 259, 261, 551, 462, -1, -1, 513,
+ 515, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7681, 7841, -1, -1, -1, -1, -1, 7843,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 263, 265,
+ -1, -1, -1, 231, -1, -1, -1, 267,
+ 269, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 232, 233, 234, 7869, 235, -1, 553,
+ 275, 277, 281, 279, 283, -1, -1, 517,
+ 519, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7865, -1, 7705, 7707, -1, -1, 7867,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 236, 237, 238,
+ 297, 239, -1, -1, 299, 301, 303, -1,
+ 464, -1, -1, 521, 523, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7883, -1, -1,
+ 7725, -1, -1, 7881, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 505, 324, -1, 241, -1, -1, 326,
+ -1, -1, -1, 7749, 328, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7751, 7753, 7755, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 242, 243, 244,
+ 245, 246, -1, -1, 333, 335, 491, 559,
+ 466, 337, 417, 525, 527, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7885, -1, -1,
+ -1, -1, -1, 7887, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 249, 250, 251, 361, 252, 367, -1,
+ 363, 365, 371, -1, 468, 369, 432, 533,
+ 535, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7909, -1, 7799, 7797, -1, 7795, 7911,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7923, 253, 375,
+ 7929, 255, 7833, -1, 563, -1, -1, 7823,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7925, -1, -1,
+ -1, -1, -1, 7927, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7696,
+ -1, -1, -1, 7690, 270, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7692, 7694, 7698, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7697, -1, -1, -1, 7691,
+ 271, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7693, 7695, 7699,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 500, 284, -1, -1, -1, 290,
+ 7712, 286, -1, 288, 486, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 501, 285,
+ -1, -1, -1, 291, 7713, 287, -1, 289,
+ 487, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 292, -1, 7718, -1, 7720,
+ -1, -1, -1, 7714, 542, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7716, -1, -1, -1, 7722, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 293,
+ -1, 7719, -1, 7721, -1, -1, -1, 7715,
+ 543, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7717, 7830, -1,
+ -1, 7723, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 308, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 309,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 496, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7728, -1, -1, -1, -1, 310,
+ -1, -1, -1, -1, 488, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7730, 7732, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7729, -1,
+ -1, -1, -1, 311, -1, -1, -1, -1,
+ 489, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7731, 7733, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 313, -1, -1, -1, -1, 315,
+ -1, -1, -1, -1, 317, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7734, 7738, 7740, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 314, -1,
+ -1, -1, -1, 316, -1, -1, -1, -1,
+ 318, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7735, 7739, 7741,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 340, -1, -1, -1, -1, 342,
+ -1, -1, -1, 7768, 344, -1, -1, 528,
+ 530, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7770, 7774, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 341, -1,
+ -1, -1, -1, 343, -1, -1, -1, 7769,
+ 345, -1, -1, 529, 531, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7771, 7775, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 346, 348, -1, -1, -1, 350,
+ -1, -1, -1, 7776, 352, -1, -1, -1,
+ -1, 536, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7778, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 347, 349,
+ -1, -1, -1, 351, -1, -1, -1, 7777,
+ 353, -1, -1, -1, -1, 537, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7779, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 354,
+ -1, -1, -1, 7786, 356, -1, -1, -1,
+ -1, 538, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7788, 7790, 7792, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7831, -1, 355, -1, -1, -1, 7787,
+ 357, -1, -1, -1, -1, 539, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7789, 7791, 7793,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7808, 7810, 372, -1, 7812, -1, -1,
+ -1, -1, -1, 7814, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7816, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7809, 7811, 373,
+ -1, 7813, 7832, -1, -1, -1, -1, 7815,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7817, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 377, 7824, -1, -1, -1, -1,
+ -1, -1, -1, 379, 381, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7826, 7828, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 378, 7825,
+ -1, -1, -1, -1, -1, -1, -1, 380,
+ 382, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7827, 7829, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 475, 471, -1, -1, -1, -1, -1,
+ 469, -1, -1, -1, 473, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 476, 472, -1,
+ -1, -1, -1, -1, 470, -1, -1, -1,
+ 474, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 478, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 479, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 480, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 481, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 508, -1, -1, -1, -1, -1,
+ 482, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 509, -1,
+ -1, -1, -1, -1, 483, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 492, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 493, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 494, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 495, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 506, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 507, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 510, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 511, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 554, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 555, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7756, -1, -1, 7758, -1, -1,
+ 556, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7757, -1,
+ -1, 7759, -1, -1, 557, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 560, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 561, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8173, 901, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8129, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8122, 902, -1,
+ -1, -1, -1, -1, 8121, 8120, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7944, 7945, -1, 8124,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8136, 904, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7960, 7961, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8138, 905, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7976, 7977, -1, 8140,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8154, 906, -1, -1, 938, -1, -1,
+ 8153, 8152, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7992, 7993, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8184, 908, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8008, 8009, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8170, 910, -1, -1, 939, -1, -1,
+ 8169, 8168, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8025, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8186, 911, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8040, 8041, -1, 8188,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8146, 912, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8151, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8048, 940, -1,
+ -1, -1, -1, -1, 8113, 8112, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7936, 7937, 8118, 8115,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8050, 941, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7952, 7953, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8052, 942, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7968, 7969, 8134, 8131,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8054, 943, -1, -1, 970, -1, -1,
+ 8145, 8144, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7984, 7985, 8150, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8162, 944, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8167, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8058, 973, -1, -1, 971, -1, -1,
+ 8161, 8160, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8016, 8017, 8166, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8056, 972, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8000, 8001, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8060, 974, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8032, 8033, 8182, 8179, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 979, -1,
+ -1, 980, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1024, -1, -1, -1, 1025, -1, -1,
+ -1, 1238, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1027, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1031, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1036, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1037, -1, -1, -1, 1252, -1, -1,
+ 1250, 1049, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1264, -1, -1, 1262, 1038, -1, -1,
+ -1, 1266, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1117, -1, -1, -1, 1253, -1, -1,
+ 1251, 1081, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1104, -1, -1,
+ -1, 1105, -1, -1, -1, 1239, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1107, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1111, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1116, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1265, -1, -1, 1263, 1118, -1, -1,
+ -1, 1267, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1142,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1143, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1244, -1, -1,
+ -1, 1217, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1245, -1, -1, -1, 1218, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1234, -1, -1,
+ -1, 1232, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1235, -1, -1, -1, 1233, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1242, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1243, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1246, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1247, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1254, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1255, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1258, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1259, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1260, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1261, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1268, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1269, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1272, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1273, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1570, 1571, 1573, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1572,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1574, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1728,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1730, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1747,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2345, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2353, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2356, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 2507, 2508, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2888, 2891, 2892, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 2964,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3020, 3018, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3019, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 3144, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3264, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3271, 3272,
+ 3274, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3275, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3402, 3404, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 3403, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3546, 3548, 3550, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 3549,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 4134, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6918, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6920,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6922, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6924,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6926, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6930,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6971, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6973,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6976, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6977,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6979, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7682, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7684, 7686, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7683,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7685, 7687, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7688, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7689, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7700, 7702, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7701, 7703, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7708, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7709, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7710, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7711,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7726, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7727, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7736, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7737, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7742, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7744, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7746, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7743, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7745,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7747, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7760, 7762, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7761, 7763, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7764, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7766, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7765, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7767,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7772, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7773, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7780, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7781,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7782, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7783,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7784, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7785,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7800, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7801, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7802, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7803, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7804, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7806, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7805, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7807, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7820, -1, -1,
+ -1, -1, -1, 7818, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7821, -1, -1, -1, -1, -1, 7819,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7835, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7846, 7844, -1,
+ 7850, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7848, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7847, 7845, -1, 7851, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7849,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7852,
+ -1, -1, -1, -1, -1, 7862, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7853, -1, -1, -1, -1,
+ -1, 7863, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7856, 7854, -1,
+ 7860, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7858, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7857, 7855, -1, 7861, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7859,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7872, 7870, -1,
+ 7876, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7874, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7873, 7871, -1, 7877, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7875,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7878,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7879, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7890, 7888, -1,
+ 7894, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7892, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7891, 7889, -1, 7895, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7893,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7896,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7897, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7900, 7898, -1,
+ 7904, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7906, -1, -1,
+ -1, -1, -1, 7902, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7901, 7899, -1, 7905, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7907, -1, -1, -1, -1, -1, 7903,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7914, 7912, -1,
+ 7918, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7920, -1, -1,
+ -1, -1, -1, 7916, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7915, 7913, -1, 7919, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7921, -1, -1, -1, -1, -1, 7917,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7938, 7940, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7942, 8064,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7939, 7941, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7943, 8065, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7946, 7948, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7950, 8072,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7947, 7949, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7951, 8073, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7954, 7956, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7955, 7957, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7962, 7964, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7963, 7965, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7970, 7972, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7974, 8080,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7971, 7973, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7975, 8081, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7978, 7980, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7982, 8088,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7979, 7981, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7983, 8089, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7986, 7988, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7990, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7987, 7989, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7991, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7994, 7996, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7998, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7995, 7997, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7999, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8002, 8004, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8003, 8005, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8010, 8012, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8011, 8013, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8018, 8020, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8022, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8019, 8021, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8023, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8027, 8029, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8031, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8034, 8036, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8038, 8096, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8035, 8037, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8039, 8097,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8042, 8044, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8046, 8104, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8043, 8045, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8047, 8105,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8066, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8067,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8068, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8069,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8070, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8071,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8074, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8075,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8076, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8077,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8078, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8079,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8082, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8083,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8084, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8085,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8086, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8087,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8090, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8091,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8092, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8093,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8094, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8095,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8098, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8099,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8100, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8101,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8102, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8103,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8106, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8107,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8108, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8109,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8110, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8111,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8114, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8116,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8119, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8130,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8132, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8135,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8141, 8142, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8143, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8157, 8158, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8159, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8164, 8165, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8172, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8178, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8180,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8183, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8602, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8603, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8622, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8653, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8654, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8655, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8708, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8713, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8716, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8740, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8742, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8769, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8772, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8775, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8777, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8800, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8802, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8813, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8814, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8815, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8816, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8817, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8820, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8821, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8824, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8825, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8832, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8833, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8836, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8837, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8840, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8841, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8876, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8877, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8878, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8879, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8928, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8929, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8930, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8931, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8938, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8939, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8940, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8941, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 10972, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12364, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12366, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12368, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12370, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12372, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12374, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12376, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12378, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12380, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12382, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12384, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12386, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12389, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12391, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12393, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12400, 12401, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12403, 12404, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12406, 12407, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12409, 12410, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12412, 12413, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12436, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12446, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12460, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12462, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12464, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12466, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12468, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12470, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12472, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12474, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12476, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12478, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12480, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12482, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12485, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12487, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12489, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12496, 12497, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12499, 12500, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12502, 12503, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12505, 12506, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12508, 12509, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12532, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12535, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12536, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12537, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12538, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12542, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119134,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 119135, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 119136, 119137, 119138, 119139, 119140, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 119227, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119228,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 119229, 119231, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 119230, 119232, -1, -1, -1, };
+
diff --git a/subversion/libsvn_subr/utf_validate.c b/subversion/libsvn_subr/utf_validate.c
index 8311fd7..0aab81c 100644
--- a/subversion/libsvn_subr/utf_validate.c
+++ b/subversion/libsvn_subr/utf_validate.c
@@ -258,24 +258,7 @@ static const char machine [9][14] = {
static const char *
first_non_fsm_start_char(const char *data, apr_size_t max_len)
{
-#if !SVN_UNALIGNED_ACCESS_IS_OK
-
- /* On some systems, we need to make sure that buf is properly aligned
- * for chunky data access.
- */
- if ((apr_uintptr_t)data & (sizeof(apr_uintptr_t)-1))
- {
- apr_size_t len = (~(apr_uintptr_t)data) & (sizeof(apr_uintptr_t)-1);
- if (len > max_len)
- len = max_len;
- max_len -= len;
-
- for (; len > 0; ++data, --len)
- if (*data < 0 || *data >= 0x80)
- return data;
- }
-
-#endif
+#if SVN_UNALIGNED_ACCESS_IS_OK
/* Scan the input one machine word at a time. */
for (; max_len > sizeof(apr_uintptr_t)
@@ -283,55 +266,11 @@ first_non_fsm_start_char(const char *data, apr_size_t max_len)
if (*(const apr_uintptr_t *)data & SVN__BIT_7_SET)
break;
- /* The remaining odd bytes will be examined the naive way: */
- for (; max_len > 0; ++data, --max_len)
- if (*data < 0 || *data >= 0x80)
- break;
-
- return data;
-}
-
-/* Scan the C string in *DATA for chars that are not in the octet
- * category 0 (FSM_START). Return the position of either the such
- * char or of the terminating NUL.
- */
-static const char *
-first_non_fsm_start_char_cstring(const char *data)
-{
- /* We need to make sure that BUF is properly aligned for chunky data
- * access because we don't know the string's length. Unaligned chunk
- * read access beyond the NUL terminator could therefore result in a
- * segfault.
- */
- for (; (apr_uintptr_t)data & (sizeof(apr_uintptr_t)-1); ++data)
- if (*data <= 0 || *data >= 0x80)
- return data;
-
- /* Scan the input one machine word at a time. */
-#ifndef SVN_UTF_NO_UNINITIALISED_ACCESS
- /* This may read allocated but initialised bytes beyond the
- terminating null. Any such bytes are always readable and this
- code operates correctly whatever the uninitialised values happen
- to be. However memory checking tools such as valgrind and GCC
- 4.8's address santitizer will object so this bit of code can be
- disabled at compile time. */
- for (; ; data += sizeof(apr_uintptr_t))
- {
- /* Check for non-ASCII chars: */
- apr_uintptr_t chunk = *(const apr_uintptr_t *)data;
- if (chunk & SVN__BIT_7_SET)
- break;
-
- /* This is the well-known strlen test: */
- chunk |= (chunk & SVN__LOWER_7BITS_SET) + SVN__LOWER_7BITS_SET;
- if ((chunk & SVN__BIT_7_SET) != SVN__BIT_7_SET)
- break;
- }
#endif
/* The remaining odd bytes will be examined the naive way: */
- for (; ; ++data)
- if (*data <= 0 || *data >= 0x80)
+ for (; max_len > 0; ++data, --max_len)
+ if ((unsigned char)*data >= 0x80)
break;
return data;
@@ -359,20 +298,10 @@ svn_utf__last_valid(const char *data, apr_size_t len)
svn_boolean_t
svn_utf__cstring_is_valid(const char *data)
{
- int state = FSM_START;
-
if (!data)
return FALSE;
- data = first_non_fsm_start_char_cstring(data);
-
- while (*data)
- {
- unsigned char octet = *data++;
- int category = octet_category[octet];
- state = machine[state][category];
- }
- return state == FSM_START;
+ return svn_utf__is_valid(data, strlen(data));
}
svn_boolean_t
diff --git a/subversion/libsvn_subr/utf_width.c b/subversion/libsvn_subr/utf_width.c
index 3adff4c..30905a0 100644
--- a/subversion/libsvn_subr/utf_width.c
+++ b/subversion/libsvn_subr/utf_width.c
@@ -190,7 +190,7 @@ mk_wcwidth(apr_uint32_t ucs)
/* binary search in table of non-spacing characters */
if (bisearch(ucs, combining,
- sizeof(combining) / sizeof(struct interval) - 1))
+ sizeof(combining) / sizeof(struct interval) - 1))
return 0;
/* if we arrive here, ucs is not a combining or C0/C1 control character */
diff --git a/subversion/libsvn_subr/version.c b/subversion/libsvn_subr/version.c
index 0859489..0210fd8 100644
--- a/subversion/libsvn_subr/version.c
+++ b/subversion/libsvn_subr/version.c
@@ -75,10 +75,10 @@ svn_boolean_t svn_ver_equal(const svn_version_t *my_version,
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_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_error_t *err = SVN_NO_ERROR;
int i;
@@ -136,7 +136,7 @@ svn_version_extended(svn_boolean_t verbose,
info->build_time = __TIME__;
info->build_host = SVN_BUILD_HOST;
info->copyright = apr_pstrdup
- (pool, _("Copyright (C) 2014 The Apache Software Foundation.\n"
+ (pool, _("Copyright (C) 2017 The Apache Software Foundation.\n"
"This software consists of contributions made by many people;\n"
"see the NOTICE file for more information.\n"
"Subversion is open source software, see "
diff --git a/subversion/libsvn_subr/win32_crashrpt.c b/subversion/libsvn_subr/win32_crashrpt.c
index 4b665c1..1349d84 100644
--- a/subversion/libsvn_subr/win32_crashrpt.c
+++ b/subversion/libsvn_subr/win32_crashrpt.c
@@ -37,6 +37,8 @@ typedef int win32_crashrpt__dummy;
#include "svn_version.h"
+#include "sysinfo.h"
+
#include "win32_crashrpt.h"
#include "win32_crashrpt_dll.h"
@@ -51,19 +53,20 @@ HANDLE dbghelp_dll = INVALID_HANDLE_VALUE;
#define LOGFILE_PREFIX "svn-crash-log"
#if defined(_M_IX86)
-#define FORMAT_PTR "0x%08x"
+#define FORMAT_PTR "0x%08Ix"
#elif defined(_M_X64)
-#define FORMAT_PTR "0x%016I64x"
+#define FORMAT_PTR "0x%016Ix"
#endif
/*** Code. ***/
-/* Convert a wide-character string to utf-8. This function will create a buffer
- * large enough to hold the result string, the caller should free this buffer.
+/* Convert a wide-character string to the current windows locale, suitable
+ * for directly using stdio. This function will create a buffer large
+ * enough to hold the result string, the caller should free this buffer.
* If the string can't be converted, NULL is returned.
*/
static char *
-convert_wbcs_to_utf8(const wchar_t *str)
+convert_wbcs_to_ansi(const wchar_t *str)
{
size_t len = wcslen(str);
char *utf8_str = malloc(sizeof(wchar_t) * len + 1);
@@ -167,8 +170,8 @@ write_module_info_callback(void *data,
FILE *log_file = (FILE *)data;
MINIDUMP_MODULE_CALLBACK module = callback_input->Module;
- char *buf = convert_wbcs_to_utf8(module.FullPath);
- fprintf(log_file, FORMAT_PTR, module.BaseOfImage);
+ char *buf = convert_wbcs_to_ansi(module.FullPath);
+ fprintf(log_file, FORMAT_PTR, (UINT_PTR)module.BaseOfImage);
fprintf(log_file, " %s", buf);
free(buf);
@@ -188,7 +191,7 @@ static void
write_process_info(EXCEPTION_RECORD *exception, CONTEXT *context,
FILE *log_file)
{
- OSVERSIONINFO oi;
+ OSVERSIONINFOEXW oi;
const char *cmd_line;
char workingdir[8192];
@@ -207,13 +210,11 @@ write_process_info(EXCEPTION_RECORD *exception, CONTEXT *context,
SVN_VERSION, __DATE__, __TIME__);
/* write information about the OS */
- oi.dwOSVersionInfoSize = sizeof(oi);
- GetVersionEx(&oi);
-
- fprintf(log_file,
- "Platform: Windows OS version %d.%d build %d %s\n\n",
- oi.dwMajorVersion, oi.dwMinorVersion, oi.dwBuildNumber,
- oi.szCSDVersion);
+ if (svn_sysinfo___fill_windows_version(&oi))
+ fprintf(log_file,
+ "Platform: Windows OS version %d.%d build %d %S\n\n",
+ oi.dwMajorVersion, oi.dwMinorVersion, oi.dwBuildNumber,
+ oi.szCSDVersion);
/* write the exception code */
fprintf(log_file,
@@ -244,33 +245,34 @@ write_process_info(EXCEPTION_RECORD *exception, CONTEXT *context,
"Rsp=%016I64x Rbp=%016I64x Rsi=%016I64x Rdi=%016I64x\n",
context->Rsp, context->Rbp, context->Rsi, context->Rdi);
fprintf(log_file,
- "R8= %016I64x R9= %016I64x R10= %016I64x R11=%016I64x\n",
+ "R8= %016I64x R9= %016I64x R10=%016I64x R11=%016I64x\n",
context->R8, context->R9, context->R10, context->R11);
fprintf(log_file,
"R12=%016I64x R13=%016I64x R14=%016I64x R15=%016I64x\n",
context->R12, context->R13, context->R14, context->R15);
fprintf(log_file,
- "cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x\n",
- context->SegCs, context->SegDs, context->SegEs,
- context->SegFs, context->SegGs, context->SegSs);
+ "cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x\n",
+ context->SegCs, context->SegSs, context->SegDs,
+ context->SegEs, context->SegFs, context->SegGs);
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
}
-/* Formats the value at address based on the specified basic type
- * (char, int, long ...). */
+/* Writes the value at address based on the specified basic type
+ * (char, int, long ...) to LOG_FILE. */
static void
-format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address)
+write_basic_type(FILE *log_file, DWORD basic_type, DWORD64 length,
+ void *address)
{
switch(length)
{
case 1:
- sprintf(buf, "0x%02x", (int)*(unsigned char *)address);
+ fprintf(log_file, "0x%02x", (int)*(unsigned char *)address);
break;
case 2:
- sprintf(buf, "0x%04x", (int)*(unsigned short *)address);
+ fprintf(log_file, "0x%04x", (int)*(unsigned short *)address);
break;
case 4:
switch(basic_type)
@@ -278,38 +280,38 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address)
case 2: /* btChar */
{
if (!IsBadStringPtr(*(PSTR*)address, 32))
- sprintf(buf, "\"%.31s\"", *(const char **)address);
+ fprintf(log_file, "\"%.31s\"", *(const char **)address);
else
- sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)address);
}
case 6: /* btInt */
- sprintf(buf, "%d", *(int *)address);
+ fprintf(log_file, "%d", *(int *)address);
break;
case 8: /* btFloat */
- sprintf(buf, "%f", *(float *)address);
+ fprintf(log_file, "%f", *(float *)address);
break;
default:
- sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)address);
break;
}
break;
case 8:
if (basic_type == 8) /* btFloat */
- sprintf(buf, "%lf", *(double *)address);
+ fprintf(log_file, "%lf", *(double *)address);
else
- sprintf(buf, "0x%016I64X", *(unsigned __int64 *)address);
+ fprintf(log_file, "0x%016I64X", *(unsigned __int64 *)address);
break;
default:
- sprintf(buf, "[unhandled type 0x%08x of length " FORMAT_PTR "]",
- basic_type, length);
+ fprintf(log_file, "[unhandled type 0x%08x of length " FORMAT_PTR "]",
+ basic_type, (UINT_PTR)length);
break;
}
}
-/* Formats the value at address based on the type (pointer, user defined,
- * basic type). */
+/* Writes the value at address based on the type (pointer, user defined,
+ * basic type) to LOG_FILE. */
static void
-format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr)
+write_value(FILE *log_file, DWORD64 mod_base, DWORD type, void *value_addr)
{
DWORD tag = 0;
int ptr = 0;
@@ -335,23 +337,23 @@ format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr)
if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_SYMNAME,
&type_name_wbcs))
{
- char *type_name = convert_wbcs_to_utf8(type_name_wbcs);
+ char *type_name = convert_wbcs_to_ansi(type_name_wbcs);
LocalFree(type_name_wbcs);
if (ptr == 0)
- sprintf(value_str, "(%s) " FORMAT_PTR,
- type_name, (DWORD_PTR *)value_addr);
+ fprintf(log_file, "(%s) " FORMAT_PTR,
+ type_name, (UINT_PTR)(DWORD_PTR *)value_addr);
else if (ptr == 1)
- sprintf(value_str, "(%s *) " FORMAT_PTR,
+ fprintf(log_file, "(%s *) " FORMAT_PTR,
type_name, *(DWORD_PTR *)value_addr);
else
- sprintf(value_str, "(%s **) " FORMAT_PTR,
+ fprintf(log_file, "(%s **) " FORMAT_PTR,
type_name, *(DWORD_PTR *)value_addr);
free(type_name);
}
else
- sprintf(value_str, "[no symbol tag]");
+ fprintf(log_file, "[no symbol tag]");
}
break;
case 16: /* SymTagBaseType */
@@ -363,27 +365,27 @@ format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr)
/* print a char * as a string */
if (ptr == 1 && length == 1)
{
- sprintf(value_str, FORMAT_PTR " \"%s\"",
+ fprintf(log_file, FORMAT_PTR " \"%s\"",
*(DWORD_PTR *)value_addr, *(const char **)value_addr);
}
else if (ptr >= 1)
{
- sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)value_addr);
}
else if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_BASETYPE, &bt))
{
- format_basic_type(value_str, bt, length, value_addr);
+ write_basic_type(log_file, bt, length, value_addr);
}
}
break;
case 12: /* SymTagEnum */
- sprintf(value_str, "%d", *(DWORD_PTR *)value_addr);
+ fprintf(log_file, "%d", *(DWORD_PTR *)value_addr);
break;
case 13: /* SymTagFunctionType */
- sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr);
+ fprintf(log_file, FORMAT_PTR, *(DWORD_PTR *)value_addr);
break;
default:
- sprintf(value_str, "[unhandled tag: %d]", tag);
+ fprintf(log_file, "[unhandled tag: %d]", tag);
break;
}
}
@@ -407,7 +409,6 @@ write_var_values(PSYMBOL_INFO sym_info, ULONG sym_size, void *baton)
FILE *log_file = ((symbols_baton_t*)baton)->log_file;
int nr_of_frame = ((symbols_baton_t*)baton)->nr_of_frame;
BOOL log_params = ((symbols_baton_t*)baton)->log_params;
- char value_str[256] = "";
/* get the variable's data */
if (sym_info->Flags & SYMFLAG_REGREL)
@@ -421,21 +422,21 @@ write_var_values(PSYMBOL_INFO sym_info, ULONG sym_size, void *baton)
if (log_params && sym_info->Flags & SYMFLAG_PARAMETER)
{
if (last_nr_of_frame == nr_of_frame)
- fprintf(log_file, ", ", 2);
+ fprintf(log_file, ", ");
else
last_nr_of_frame = nr_of_frame;
- format_value(value_str, sym_info->ModBase, sym_info->TypeIndex,
- (void *)var_data);
- fprintf(log_file, "%.*s=%s", (int)sym_info->NameLen, sym_info->Name,
- value_str);
+ fprintf(log_file, "%.*s=", (int)sym_info->NameLen, sym_info->Name);
+ write_value(log_file, sym_info->ModBase, sym_info->TypeIndex,
+ (void *)var_data);
}
if (!log_params && sym_info->Flags & SYMFLAG_LOCAL)
{
- format_value(value_str, sym_info->ModBase, sym_info->TypeIndex,
- (void *)var_data);
- fprintf(log_file, " %.*s = %s\n", (int)sym_info->NameLen,
- sym_info->Name, value_str);
+ fprintf(log_file, " %.*s = ", (int)sym_info->NameLen,
+ sym_info->Name);
+ write_value(log_file, sym_info->ModBase, sym_info->TypeIndex,
+ (void *)var_data);
+ fprintf(log_file, "\n");
}
return TRUE;
diff --git a/subversion/libsvn_subr/win32_crypto.c b/subversion/libsvn_subr/win32_crypto.c
index e16866a..74bda1c 100644
--- a/subversion/libsvn_subr/win32_crypto.c
+++ b/subversion/libsvn_subr/win32_crypto.c
@@ -40,6 +40,7 @@ typedef int win32_crypto__dummy;
#include "svn_user.h"
#include "svn_base64.h"
+#include "auth.h"
#include "private/svn_auth_private.h"
#include "svn_private_config.h"
@@ -213,7 +214,7 @@ static const svn_auth_provider_t windows_simple_provider = {
/* Public API */
void
-svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
+svn_auth__get_windows_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
@@ -331,7 +332,7 @@ static const svn_auth_provider_t windows_ssl_client_cert_pw_provider = {
/* Public API */
void
-svn_auth_get_windows_ssl_client_cert_pw_provider
+svn_auth__get_windows_ssl_client_cert_pw_provider
(svn_auth_provider_object_t **provider,
apr_pool_t *pool)
{
@@ -482,7 +483,7 @@ static const svn_auth_provider_t windows_server_trust_provider = {
/* Public API */
void
-svn_auth_get_windows_ssl_server_trust_provider
+svn_auth__get_windows_ssl_server_trust_provider
(svn_auth_provider_object_t **provider, apr_pool_t *pool)
{
svn_auth_provider_object_t *po = apr_pcalloc(pool, sizeof(*po));
diff --git a/subversion/libsvn_subr/win32_xlate.c b/subversion/libsvn_subr/win32_xlate.c
index efe9c05..d95d62e 100644
--- a/subversion/libsvn_subr/win32_xlate.c
+++ b/subversion/libsvn_subr/win32_xlate.c
@@ -47,9 +47,12 @@ typedef int win32_xlate__dummy;
#include "svn_string.h"
#include "svn_utf.h"
#include "private/svn_atomic.h"
+#include "private/svn_subr_private.h"
#include "win32_xlate.h"
+#include "svn_private_config.h"
+
static svn_atomic_t com_initialized = 0;
/* Initializes COM and keeps COM available until process exit.
@@ -74,11 +77,11 @@ initialize_com(void *baton, apr_pool_t* pool)
return SVN_NO_ERROR;
}
-typedef struct win32_xlate_t
+struct svn_subr__win32_xlate_t
{
UINT from_page_id;
UINT to_page_id;
-} win32_xlate_t;
+};
static apr_status_t
get_page_id_from_name(UINT *page_id_p, const char *page_name, apr_pool_t *pool)
@@ -113,16 +116,26 @@ get_page_id_from_name(UINT *page_id_p, const char *page_name, apr_pool_t *pool)
if ((page_name[0] == 'c' || page_name[0] == 'C')
&& (page_name[1] == 'p' || page_name[1] == 'P'))
{
- *page_id_p = atoi(page_name + 2);
+ int page_id;
+
+ err = svn_cstring_atoi(&page_id, page_name + 2);
+ if (err)
+ {
+ apr_status_t saved = err->apr_err;
+ svn_error_clear(err);
+ return saved;
+ }
+
+ *page_id_p = page_id;
return APR_SUCCESS;
}
err = svn_atomic__init_once(&com_initialized, initialize_com, NULL, pool);
-
if (err)
{
+ apr_status_t saved = err->apr_err;
svn_error_clear(err);
- return APR_EGENERAL;
+ return saved; /* probably SVN_ERR_ATOMIC_INIT_FAILURE */
}
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
@@ -153,12 +166,12 @@ get_page_id_from_name(UINT *page_id_p, const char *page_name, apr_pool_t *pool)
}
apr_status_t
-svn_subr__win32_xlate_open(win32_xlate_t **xlate_p, const char *topage,
+svn_subr__win32_xlate_open(svn_subr__win32_xlate_t **xlate_p, const char *topage,
const char *frompage, apr_pool_t *pool)
{
UINT from_page_id, to_page_id;
apr_status_t apr_err = APR_SUCCESS;
- win32_xlate_t *xlate;
+ svn_subr__win32_xlate_t *xlate;
apr_err = get_page_id_from_name(&to_page_id, topage, pool);
if (apr_err == APR_SUCCESS)
@@ -177,7 +190,7 @@ svn_subr__win32_xlate_open(win32_xlate_t **xlate_p, const char *topage,
}
apr_status_t
-svn_subr__win32_xlate_to_stringbuf(win32_xlate_t *handle,
+svn_subr__win32_xlate_to_stringbuf(svn_subr__win32_xlate_t *handle,
const char *src_data,
apr_size_t src_length,
svn_stringbuf_t **dest,
diff --git a/subversion/libsvn_subr/win32_xlate.h b/subversion/libsvn_subr/win32_xlate.h
index 82fc832..ee23add 100644
--- a/subversion/libsvn_subr/win32_xlate.h
+++ b/subversion/libsvn_subr/win32_xlate.h
@@ -27,25 +27,27 @@
#ifdef WIN32
/* Opaque translation buffer. */
-typedef struct win32_xlate_t win32_xlate_t;
+typedef struct svn_subr__win32_xlate_t svn_subr__win32_xlate_t;
/* Set *XLATE_P to a handle node for converting from FROMPAGE to TOPAGE.
Returns APR_EINVAL or APR_ENOTIMPL, if a conversion isn't supported.
If fail for any other reason, return the error.
Allocate *RET in POOL. */
-apr_status_t svn_subr__win32_xlate_open(win32_xlate_t **xlate_p,
- const char *topage,
- const char *frompage,
- apr_pool_t *pool);
+apr_status_t
+svn_subr__win32_xlate_open(svn_subr__win32_xlate_t **xlate_p,
+ const char *topage,
+ const char *frompage,
+ apr_pool_t *pool);
/* Convert SRC_LENGTH bytes of SRC_DATA in NODE->handle, store the result
in *DEST, which is allocated in POOL. */
-apr_status_t svn_subr__win32_xlate_to_stringbuf(win32_xlate_t *handle,
- const char *src_data,
- apr_size_t src_length,
- svn_stringbuf_t **dest,
- apr_pool_t *pool);
+apr_status_t
+svn_subr__win32_xlate_to_stringbuf(svn_subr__win32_xlate_t *handle,
+ const char *src_data,
+ apr_size_t src_length,
+ svn_stringbuf_t **dest,
+ apr_pool_t *pool);
#endif /* WIN32 */
diff --git a/subversion/libsvn_subr/x509.h b/subversion/libsvn_subr/x509.h
new file mode 100644
index 0000000..9497f38
--- /dev/null
+++ b/subversion/libsvn_subr/x509.h
@@ -0,0 +1,134 @@
+/**
+ * \file x509.h
+ *
+ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
+ *
+ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef SVN_LIBSVN_SUBR_X509_H
+#define SVN_LIBSVN_SUBR_X509_H
+
+#include <stddef.h>
+#include <apr_time.h>
+
+#include "svn_x509.h"
+
+/*
+ * DER constants
+ */
+#define ASN1_BOOLEAN 0x01
+#define ASN1_INTEGER 0x02
+#define ASN1_BIT_STRING 0x03
+#define ASN1_OCTET_STRING 0x04
+#define ASN1_NULL 0x05
+#define ASN1_OID 0x06
+#define ASN1_UTF8_STRING 0x0C
+#define ASN1_SEQUENCE 0x10
+#define ASN1_SET 0x11
+#define ASN1_PRINTABLE_STRING 0x13
+#define ASN1_T61_STRING 0x14
+#define ASN1_IA5_STRING 0x16
+#define ASN1_UTC_TIME 0x17
+#define ASN1_GENERALIZED_TIME 0x18
+#define ASN1_UNIVERSAL_STRING 0x1C
+#define ASN1_BMP_STRING 0x1E
+#define ASN1_PRIMITIVE 0x00
+#define ASN1_CONSTRUCTED 0x20
+#define ASN1_CONTEXT_SPECIFIC 0x80
+
+/*
+ * various object identifiers
+ */
+#define OID_SUBJECT_ALT_NAME "\x55\x1D\x11"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Structures for parsing X.509 certificates
+ */
+typedef struct _x509_buf {
+ int tag;
+ ptrdiff_t len;
+ const unsigned char *p;
+} x509_buf;
+
+typedef struct _x509_name {
+ x509_buf oid;
+ x509_buf val;
+ struct _x509_name *next;
+} x509_name;
+
+typedef struct _x509_cert {
+ int version;
+ x509_buf serial;
+ x509_buf sig_oid1;
+
+ x509_name issuer;
+ x509_name subject;
+
+ apr_time_t valid_from;
+ apr_time_t valid_to;
+
+ x509_buf issuer_id;
+ x509_buf subject_id;
+ apr_array_header_t *dnsnames;
+
+ x509_buf sig_oid2;
+ x509_buf sig;
+
+} x509_cert;
+
+
+struct svn_x509_name_attr_t {
+ unsigned char *oid;
+ apr_size_t oid_len;
+ const char *utf8_value;
+};
+
+/*
+ * Certificate info, returned from the parser
+ */
+struct svn_x509_certinfo_t
+{
+ apr_array_header_t *issuer;
+ apr_array_header_t *subject;
+ apr_time_t valid_from;
+ apr_time_t valid_to;
+ svn_checksum_t *digest;
+ apr_array_header_t *hostnames;
+};
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_SUBR_X509_H */
diff --git a/subversion/libsvn_subr/x509info.c b/subversion/libsvn_subr/x509info.c
new file mode 100644
index 0000000..3514596
--- /dev/null
+++ b/subversion/libsvn_subr/x509info.c
@@ -0,0 +1,332 @@
+/*
+ * x509info.c: Accessors for svn_x509_certinfo_t
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#include <string.h>
+
+#include <apr_pools.h>
+#include <apr_tables.h>
+
+#include "svn_string.h"
+#include "svn_hash.h"
+#include "x509.h"
+
+
+
+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)
+{
+ svn_x509_name_attr_t *result = apr_palloc(result_pool, sizeof(*result));
+ result->oid_len = attr->oid_len;
+ result->oid = apr_palloc(result_pool, result->oid_len);
+ memcpy(result->oid, attr->oid, result->oid_len);
+ result->utf8_value = apr_pstrdup(result_pool, attr->utf8_value);
+
+ return result;
+}
+
+const unsigned char *
+svn_x509_name_attr_get_oid(const svn_x509_name_attr_t *attr, apr_size_t *len)
+{
+ *len = attr->oid_len;
+ return attr->oid;
+}
+
+const char *
+svn_x509_name_attr_get_value(const svn_x509_name_attr_t *attr)
+{
+ return attr->utf8_value;
+}
+
+/* Array elements are assumed to be nul-terminated C strings. */
+static apr_array_header_t *
+deep_copy_array(apr_array_header_t *s, apr_pool_t *result_pool)
+{
+ int i;
+ apr_array_header_t *d;
+
+ if (!s)
+ return NULL;
+
+ d = apr_array_copy(result_pool, s);
+
+ /* Make a deep copy of the strings in the array. */
+ for (i = 0; i < s->nelts; ++i)
+ {
+ APR_ARRAY_IDX(d, i, const char *) =
+ apr_pstrdup(result_pool, APR_ARRAY_IDX(s, i, const char *));
+ }
+
+ return d;
+}
+
+/* Copy an array with elements that are svn_x509_name_attr_t's */
+static apr_array_header_t *
+deep_copy_name_attrs(apr_array_header_t *s, apr_pool_t *result_pool)
+{
+ int i;
+ apr_array_header_t *d;
+
+ if (!s)
+ return NULL;
+
+ d = apr_array_copy(result_pool, s);
+
+ /* Make a deep copy of the svn_x509_name_attr_t's in the array. */
+ for (i = 0; i < s->nelts; ++i)
+ {
+ APR_ARRAY_IDX(d, i, const svn_x509_name_attr_t *) =
+ svn_x509_name_attr_dup(APR_ARRAY_IDX(s, i, svn_x509_name_attr_t *),
+ result_pool, result_pool);
+ }
+
+ return d;
+}
+
+svn_x509_certinfo_t *
+svn_x509_certinfo_dup(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_x509_certinfo_t *result = apr_palloc(result_pool, sizeof(*result));
+ result->subject = deep_copy_name_attrs(certinfo->subject, result_pool);
+ result->issuer = deep_copy_name_attrs(certinfo->issuer, result_pool);
+ result->valid_from = certinfo->valid_from;
+ result->valid_to = certinfo->valid_to;
+ result->digest = svn_checksum_dup(certinfo->digest, result_pool);
+ result->hostnames = deep_copy_array(certinfo->hostnames, result_pool);
+
+ return result;
+}
+
+typedef struct asn1_oid {
+ const unsigned char *oid;
+ const ptrdiff_t oid_len;
+ const char *short_label;
+ const char *long_label;
+} asn1_oid;
+
+#define CONSTANT_PAIR(c) (unsigned char *)(c), sizeof((c)) - 1
+
+static const asn1_oid asn1_oids[] = {
+ { CONSTANT_PAIR(SVN_X509_OID_COMMON_NAME), "CN", "commonName" },
+ { CONSTANT_PAIR(SVN_X509_OID_COUNTRY), "C", "countryName" },
+ { CONSTANT_PAIR(SVN_X509_OID_LOCALITY), "L", "localityName" },
+ { CONSTANT_PAIR(SVN_X509_OID_STATE), "ST", "stateOrProvinceName" },
+ { CONSTANT_PAIR(SVN_X509_OID_ORGANIZATION), "O", "organizationName" },
+ { CONSTANT_PAIR(SVN_X509_OID_ORG_UNIT), "OU", "organizationalUnitName"},
+ { CONSTANT_PAIR(SVN_X509_OID_EMAIL), NULL, "emailAddress" },
+ { NULL },
+};
+
+/* Given an 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". */
+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)
+{
+ svn_stringbuf_t *out = svn_stringbuf_create_empty(result_pool);
+ const unsigned char *p = oid;
+ const unsigned char *end = p + oid_len;
+ const char *temp;
+
+ while (p != end) {
+ if (p == oid)
+ {
+ /* Handle decoding the first two values of the OID. These values
+ * are encoded by taking the first value and adding 40 to it and
+ * adding the result to the second value, then placing this single
+ * value in the first byte of the output. This is unambiguous since
+ * the first value is apparently limited to 0, 1 or 2 and the second
+ * is limited to 0 to 39. */
+ temp = apr_psprintf(scratch_pool, "%d.%d", *p / 40, *p % 40);
+ p++;
+ }
+ else if (*p < 128)
+ {
+ /* The remaining values if they're less than 128 are just
+ * the number one to one encoded */
+ temp = apr_psprintf(scratch_pool, ".%d", *p);
+ p++;
+ }
+ else
+ {
+ /* Values greater than 128 are encoded as a series of 7 bit values
+ * with the left most bit set to indicate this encoding with the
+ * last octet missing the left most bit to finish out the series.. */
+ unsigned int collector = 0;
+ svn_boolean_t dot = FALSE;
+
+ do {
+ if (collector == 0 && *p == 0x80)
+ {
+ /* include leading zeros in the string representation
+ technically not legal, but this seems nicer than just
+ returning NULL */
+ if (!dot)
+ {
+ svn_stringbuf_appendbyte(out, '.');
+ dot = TRUE;
+ }
+ svn_stringbuf_appendbyte(out, '0');
+ }
+ else if (collector > UINT_MAX >> 7)
+ {
+ /* overflow */
+ return NULL;
+ }
+ collector = collector << 7 | (*(p++) & 0x7f);
+ } while (p != end && *p > 127);
+ if (collector > UINT_MAX >> 7)
+ return NULL; /* overflow */
+ collector = collector << 7 | *(p++);
+ temp = apr_psprintf(scratch_pool, "%s%d", dot ? "" : ".", collector);
+ }
+ svn_stringbuf_appendcstr(out, temp);
+ }
+
+ if (svn_stringbuf_isempty(out))
+ return NULL;
+
+ return out->data;
+}
+
+static const asn1_oid *oid_to_asn1_oid(unsigned char *oid, apr_size_t oid_len)
+{
+ const asn1_oid *entry;
+
+ for (entry = asn1_oids; entry->oid; entry++)
+ {
+ if (oid_len == entry->oid_len &&
+ memcmp(oid, entry->oid, oid_len) == 0)
+ return entry;
+ }
+
+ return NULL;
+}
+
+static const char *oid_to_best_label(unsigned char *oid, apr_size_t oid_len,
+ apr_pool_t *result_pool)
+{
+ const asn1_oid *entry = oid_to_asn1_oid(oid, oid_len);
+
+ if (entry)
+ {
+ if (entry->short_label)
+ return entry->short_label;
+
+ if (entry->long_label)
+ return entry->long_label;
+ }
+ else
+ {
+ const char *oid_string = svn_x509_oid_to_string(oid, oid_len,
+ result_pool, result_pool);
+ if (oid_string)
+ return oid_string;
+ }
+
+ return "??";
+}
+
+/*
+ * Store the name from dn in printable form into buf,
+ * using scratch_pool for any temporary allocations.
+ * If CN is not NULL, return any common name in CN
+ */
+static const char *
+get_dn(apr_array_header_t *name,
+ apr_pool_t *result_pool)
+{
+ svn_stringbuf_t *buf = svn_stringbuf_create_empty(result_pool);
+ int n;
+
+ for (n = 0; n < name->nelts; n++)
+ {
+ const svn_x509_name_attr_t *attr = APR_ARRAY_IDX(name, n, svn_x509_name_attr_t *);
+
+ if (n > 0)
+ svn_stringbuf_appendcstr(buf, ", ");
+
+ svn_stringbuf_appendcstr(buf, oid_to_best_label(attr->oid, attr->oid_len, result_pool));
+ svn_stringbuf_appendbyte(buf, '=');
+ svn_stringbuf_appendcstr(buf, attr->utf8_value);
+ }
+
+ return buf->data;
+}
+
+const char *
+svn_x509_certinfo_get_subject(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool)
+{
+ return get_dn(certinfo->subject, result_pool);
+}
+
+const apr_array_header_t *
+svn_x509_certinfo_get_subject_attrs(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->subject;
+}
+
+const char *
+svn_x509_certinfo_get_issuer(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool)
+{
+ return get_dn(certinfo->issuer, result_pool);
+}
+
+const apr_array_header_t *
+svn_x509_certinfo_get_issuer_attrs(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->issuer;
+}
+
+apr_time_t
+svn_x509_certinfo_get_valid_from(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->valid_from;
+}
+
+const apr_time_t
+svn_x509_certinfo_get_valid_to(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->valid_to;
+}
+
+const svn_checksum_t *
+svn_x509_certinfo_get_digest(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->digest;
+}
+
+const apr_array_header_t *
+svn_x509_certinfo_get_hostnames(const svn_x509_certinfo_t *certinfo)
+{
+ return certinfo->hostnames;
+}
+
diff --git a/subversion/libsvn_subr/x509parse.c b/subversion/libsvn_subr/x509parse.c
new file mode 100644
index 0000000..32af4a7
--- /dev/null
+++ b/subversion/libsvn_subr/x509parse.c
@@ -0,0 +1,1200 @@
+/*
+ * X.509 certificate and private key decoding
+ *
+ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
+ *
+ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * The ITU-T X.509 standard defines a certificate format for PKI.
+ *
+ * http://www.ietf.org/rfc/rfc5280.txt
+ * http://www.ietf.org/rfc/rfc3279.txt
+ * http://www.ietf.org/rfc/rfc6818.txt
+ *
+ * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
+ *
+ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
+ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
+ */
+
+#include <apr_pools.h>
+#include <apr_tables.h>
+#include "svn_hash.h"
+#include "svn_string.h"
+#include "svn_time.h"
+#include "svn_checksum.h"
+#include "svn_utf.h"
+#include "svn_ctype.h"
+#include "private/svn_utf_private.h"
+#include "private/svn_string_private.h"
+
+#include "x509.h"
+
+#include <string.h>
+#include <stdio.h>
+
+/*
+ * ASN.1 DER decoding routines
+ */
+static svn_error_t *
+asn1_get_len(const unsigned char **p, const unsigned char *end,
+ ptrdiff_t *len)
+{
+ if ((end - *p) < 1)
+ return svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+
+ if ((**p & 0x80) == 0)
+ *len = *(*p)++;
+ else
+ switch (**p & 0x7F)
+ {
+ case 1:
+ if ((end - *p) < 2)
+ return svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+
+ *len = (*p)[1];
+ (*p) += 2;
+ break;
+
+ case 2:
+ if ((end - *p) < 3)
+ return svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+
+ *len = ((*p)[1] << 8) | (*p)[2];
+ (*p) += 3;
+ break;
+
+ default:
+ return svn_error_create(SVN_ERR_ASN1_INVALID_LENGTH, NULL, NULL);
+ break;
+ }
+
+ if (*len > (end - *p))
+ return svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+asn1_get_tag(const unsigned char **p,
+ const unsigned char *end, ptrdiff_t *len, int tag)
+{
+ if ((end - *p) < 1)
+ return svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+
+ if (**p != tag)
+ return svn_error_create(SVN_ERR_ASN1_UNEXPECTED_TAG, NULL, NULL);
+
+ (*p)++;
+
+ return svn_error_trace(asn1_get_len(p, end, len));
+}
+
+static svn_error_t *
+asn1_get_int(const unsigned char **p, const unsigned char *end, int *val)
+{
+ ptrdiff_t len;
+
+ SVN_ERR(asn1_get_tag(p, end, &len, ASN1_INTEGER));
+
+ /* Reject bit patterns that would overflow the output and those that
+ represent negative values. */
+ if (len > (int)sizeof(int) || (**p & 0x80) != 0)
+ return svn_error_create(SVN_ERR_ASN1_INVALID_LENGTH, NULL, NULL);
+
+ *val = 0;
+
+ while (len-- > 0) {
+ /* This would be undefined for bit-patterns of negative values. */
+ *val = (*val << 8) | **p;
+ (*p)++;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_boolean_t
+equal(const void *left, apr_size_t left_len,
+ const void *right, apr_size_t right_len)
+{
+ if (left_len != right_len)
+ return FALSE;
+
+ return memcmp(left, right, right_len) == 0;
+}
+
+static svn_boolean_t
+oids_equal(x509_buf *left, x509_buf *right)
+{
+ return equal(left->p, left->len,
+ right->p, right->len);
+}
+
+/*
+ * Version ::= INTEGER { v1(0), v2(1), v3(2) }
+ */
+static svn_error_t *
+x509_get_version(const unsigned char **p, const unsigned char *end, int *ver)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+
+ /*
+ * As defined in the Basic Certificate fields:
+ * version [0] EXPLICIT Version DEFAULT v1,
+ * the version is the context specific tag 0.
+ */
+ err = asn1_get_tag(p, end, &len,
+ ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_ASN1_UNEXPECTED_TAG)
+ {
+ svn_error_clear(err);
+ *ver = 0;
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(err);
+ }
+
+ end = *p + len;
+
+ err = asn1_get_int(p, end, ver);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_VERSION, err, NULL);
+
+ if (*p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_VERSION, err, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * CertificateSerialNumber ::= INTEGER
+ */
+static svn_error_t *
+x509_get_serial(const unsigned char **p,
+ const unsigned char *end, x509_buf * serial)
+{
+ svn_error_t *err;
+
+ if ((end - *p) < 1)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_SERIAL, err, NULL);
+ }
+
+ if (**p != (ASN1_CONTEXT_SPECIFIC | ASN1_PRIMITIVE | 2) &&
+ **p != ASN1_INTEGER)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_UNEXPECTED_TAG, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_SERIAL, err, NULL);
+ }
+
+ serial->tag = *(*p)++;
+
+ err = asn1_get_len(p, end, &serial->len);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_SERIAL, err, NULL);
+
+ serial->p = *p;
+ *p += serial->len;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * AlgorithmIdentifier ::= SEQUENCE {
+ * algorithm OBJECT IDENTIFIER,
+ * parameters ANY DEFINED BY algorithm OPTIONAL }
+ */
+static svn_error_t *
+x509_get_alg(const unsigned char **p, const unsigned char *end, x509_buf * alg)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+
+ err = asn1_get_tag(p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_ALG, err, NULL);
+
+ end = *p + len;
+ alg->tag = **p;
+
+ err = asn1_get_tag(p, end, &alg->len, ASN1_OID);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_ALG, err, NULL);
+
+ alg->p = *p;
+ *p += alg->len;
+
+ if (*p == end)
+ return SVN_NO_ERROR;
+
+ /*
+ * assume the algorithm parameters must be NULL
+ */
+ err = asn1_get_tag(p, end, &len, ASN1_NULL);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_ALG, err, NULL);
+
+ if (*p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_ALG, err, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * AttributeTypeAndValue ::= SEQUENCE {
+ * type AttributeType,
+ * value AttributeValue }
+ *
+ * AttributeType ::= OBJECT IDENTIFIER
+ *
+ * AttributeValue ::= ANY DEFINED BY AttributeType
+ */
+static svn_error_t *
+x509_get_attribute(const unsigned char **p, const unsigned char *end,
+ x509_name *cur, apr_pool_t *result_pool)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+ x509_buf *oid;
+ x509_buf *val;
+
+ err = asn1_get_tag(p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+
+ end = *p + len;
+
+ oid = &cur->oid;
+
+ err = asn1_get_tag(p, end, &oid->len, ASN1_OID);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+
+ oid->tag = ASN1_OID;
+ oid->p = *p;
+ *p += oid->len;
+
+ if ((end - *p) < 1)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_OUT_OF_DATA, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+ }
+
+ if (**p != ASN1_BMP_STRING && **p != ASN1_UTF8_STRING &&
+ **p != ASN1_T61_STRING && **p != ASN1_PRINTABLE_STRING &&
+ **p != ASN1_IA5_STRING && **p != ASN1_UNIVERSAL_STRING)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_UNEXPECTED_TAG, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+ }
+
+ val = &cur->val;
+ val->tag = *(*p)++;
+
+ err = asn1_get_len(p, end, &val->len);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+
+ val->p = *p;
+ *p += val->len;
+
+ cur->next = NULL;
+
+ if (*p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * RelativeDistinguishedName ::=
+ * SET SIZE (1..MAX) OF AttributeTypeAndValue
+ */
+static svn_error_t *
+x509_get_name(const unsigned char **p, const unsigned char *name_end,
+ x509_name *name, apr_pool_t *result_pool)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+ const unsigned char *set_end;
+ x509_name *cur = NULL;
+
+ err = asn1_get_tag(p, name_end, &len, ASN1_CONSTRUCTED | ASN1_SET);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL);
+
+ set_end = *p + len;
+
+ /*
+ * iterate until the end of the SET is reached
+ */
+ while (*p < set_end)
+ {
+ if (!cur)
+ {
+ cur = name;
+ }
+ else
+ {
+ cur->next = apr_palloc(result_pool, sizeof(x509_name));
+ cur = cur->next;
+ }
+ SVN_ERR(x509_get_attribute(p, set_end, cur, result_pool));
+ }
+
+ /*
+ * recurse until end of SEQUENCE (name) is reached
+ */
+ if (*p == name_end)
+ return SVN_NO_ERROR;
+
+ cur->next = apr_palloc(result_pool, sizeof(x509_name));
+
+ return svn_error_trace(x509_get_name(p, name_end, cur->next, result_pool));
+}
+
+/* Retrieve the date from the X.509 cert data between *P and END in either
+ * UTCTime or GeneralizedTime format (as defined in RFC 5280 s. 4.1.2.5.1 and
+ * 4.1.2.5.2 respectively) and place the result in WHEN using SCRATCH_POOL
+ * for temporary allocations. */
+static svn_error_t *
+x509_get_date(apr_time_t *when,
+ const unsigned char **p,
+ const unsigned char *end,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ apr_status_t ret;
+ int tag;
+ ptrdiff_t len;
+ char *date;
+ apr_time_exp_t xt = { 0 };
+ char tz;
+
+ err = asn1_get_tag(p, end, &len, ASN1_UTC_TIME);
+ if (err && err->apr_err == SVN_ERR_ASN1_UNEXPECTED_TAG)
+ {
+ svn_error_clear(err);
+ err = asn1_get_tag(p, end, &len, ASN1_GENERALIZED_TIME);
+ tag = ASN1_GENERALIZED_TIME;
+ }
+ else
+ {
+ tag = ASN1_UTC_TIME;
+ }
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, err, NULL);
+
+ date = apr_pstrndup(scratch_pool, (const char *) *p, len);
+ switch (tag)
+ {
+ case ASN1_UTC_TIME:
+ if (sscanf(date, "%2d%2d%2d%2d%2d%2d%c",
+ &xt.tm_year, &xt.tm_mon, &xt.tm_mday,
+ &xt.tm_hour, &xt.tm_min, &xt.tm_sec, &tz) < 6)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, NULL, NULL);
+
+ /* UTCTime only provides a 2 digit year. X.509 specifies that years
+ * greater than or equal to 50 must be interpreted as 19YY and years
+ * less than 50 be interpreted as 20YY. This format is not used for
+ * years greater than 2049. apr_time_exp_t wants years as the number
+ * of years since 1900, so don't convert to 4 digits here. */
+ xt.tm_year += 100 * (xt.tm_year < 50);
+ break;
+
+ case ASN1_GENERALIZED_TIME:
+ if (sscanf(date, "%4d%2d%2d%2d%2d%2d%c",
+ &xt.tm_year, &xt.tm_mon, &xt.tm_mday,
+ &xt.tm_hour, &xt.tm_min, &xt.tm_sec, &tz) < 6)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, NULL, NULL);
+
+ /* GeneralizedTime has the full 4 digit year. But apr_time_exp_t
+ * wants years as the number of years since 1900. */
+ xt.tm_year -= 1900;
+ break;
+
+ default:
+ /* shouldn't ever get here because we should error out above in the
+ * asn1_get_tag() bits but doesn't hurt to be extra paranoid. */
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, NULL, NULL);
+ break;
+ }
+
+ /* check that the timezone is GMT
+ * ASN.1 allows for the timezone to be specified but X.509 says it must
+ * always be GMT. A little bit of extra paranoia here seems like a good
+ * idea. */
+ if (tz != 'Z')
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, NULL, NULL);
+
+ /* apr_time_exp_t expects months to be zero indexed, 0=Jan, 11=Dec. */
+ xt.tm_mon -= 1;
+
+ ret = apr_time_exp_gmt_get(when, &xt);
+ if (ret)
+ return svn_error_wrap_apr(ret, NULL);
+
+ *p += len;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * Validity ::= SEQUENCE {
+ * notBefore Time,
+ * notAfter Time }
+ *
+ * Time ::= CHOICE {
+ * utcTime UTCTime,
+ * generalTime GeneralizedTime }
+ */
+static svn_error_t *
+x509_get_dates(apr_time_t *from,
+ apr_time_t *to,
+ const unsigned char **p,
+ const unsigned char *end,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+
+ err = asn1_get_tag(p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, err, NULL);
+
+ end = *p + len;
+
+ SVN_ERR(x509_get_date(from, p, end, scratch_pool));
+
+ SVN_ERR(x509_get_date(to, p, end, scratch_pool));
+
+ if (*p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_DATE, err, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+x509_get_sig(const unsigned char **p, const unsigned char *end, x509_buf * sig)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+
+ err = asn1_get_tag(p, end, &len, ASN1_BIT_STRING);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_SIGNATURE, err, NULL);
+
+ sig->tag = ASN1_BIT_STRING;
+
+ if (--len < 1 || *(*p)++ != 0)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_SIGNATURE, NULL, NULL);
+
+ sig->len = len;
+ sig->p = *p;
+
+ *p += len;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * X.509 v2/v3 unique identifier (not parsed)
+ */
+static svn_error_t *
+x509_get_uid(const unsigned char **p,
+ const unsigned char *end, x509_buf * uid, int n)
+{
+ svn_error_t *err;
+
+ if (*p == end)
+ return SVN_NO_ERROR;
+
+ err = asn1_get_tag(p, end, &uid->len,
+ ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | n);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_ASN1_UNEXPECTED_TAG)
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(err);
+ }
+
+ uid->tag = ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | n;
+ uid->p = *p;
+ *p += uid->len;
+
+ return SVN_NO_ERROR;
+}
+
+/*
+ * X.509 v3 extensions (not parsed)
+ */
+static svn_error_t *
+x509_get_ext(apr_array_header_t *dnsnames,
+ const unsigned char **p,
+ const unsigned char *end)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+
+ if (*p == end)
+ return SVN_NO_ERROR;
+
+ err = asn1_get_tag(p, end, &len,
+ ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 3);
+ if (err)
+ {
+ /* If there aren't extensions that's ok they aren't required */
+ if (err->apr_err == SVN_ERR_ASN1_UNEXPECTED_TAG)
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_trace(err);
+ }
+
+ end = *p + len;
+
+ SVN_ERR(asn1_get_tag(p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE));
+
+ if (end != *p + len)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err, NULL);
+ }
+
+ while (*p < end)
+ {
+ ptrdiff_t ext_len;
+ const unsigned char *ext_start, *sna_end;
+ err = asn1_get_tag(p, end, &ext_len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err,
+ NULL);
+ ext_start = *p;
+
+ err = asn1_get_tag(p, end, &len, ASN1_OID);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err,
+ NULL);
+
+ /* skip all extensions except SubjectAltName */
+ if (!equal(*p, len,
+ OID_SUBJECT_ALT_NAME, sizeof(OID_SUBJECT_ALT_NAME) - 1))
+ {
+ *p += ext_len - (*p - ext_start);
+ continue;
+ }
+ *p += len;
+
+ err = asn1_get_tag(p, end, &len, ASN1_OCTET_STRING);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err,
+ NULL);
+
+ /* SubjectAltName ::= GeneralNames
+
+ GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
+
+ GeneralName ::= CHOICE {
+ other Name [0] OtherName,
+ rfc822Name [1] IA5String,
+ dNSName [2] IA5String,
+ x400Address [3] ORAddress,
+ directoryName [4] Name,
+ ediPartyName [5] EDIPartyName,
+ uniformResourceIdentifier [6] IA5String,
+ iPAddress [7] OCTET STRING,
+ registeredID [8] OBJECT IDENTIFIER } */
+ sna_end = *p + len;
+
+ err = asn1_get_tag(p, sna_end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err,
+ NULL);
+
+ if (sna_end != *p + len)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_EXTENSIONS, err, NULL);
+ }
+
+ while (*p < sna_end)
+ {
+ err = asn1_get_tag(p, sna_end, &len, ASN1_CONTEXT_SPECIFIC |
+ ASN1_PRIMITIVE | 2);
+ if (err)
+ {
+ /* not not a dNSName */
+ if (err->apr_err == SVN_ERR_ASN1_UNEXPECTED_TAG)
+ {
+ svn_error_clear(err);
+ /* need to skip the tag and then find the length to
+ * skip to ignore this SNA entry. */
+ (*p)++;
+ SVN_ERR(asn1_get_len(p, sna_end, &len));
+ *p += len;
+ continue;
+ }
+
+ return svn_error_trace(err);
+ }
+ else
+ {
+ /* We found a dNSName entry */
+ x509_buf *dnsname = apr_palloc(dnsnames->pool,
+ sizeof(x509_buf));
+ dnsname->tag = ASN1_IA5_STRING; /* implicit based on dNSName */
+ dnsname->len = len;
+ dnsname->p = *p;
+ APR_ARRAY_PUSH(dnsnames, x509_buf *) = dnsname;
+ }
+
+ *p += len;
+ }
+
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Escape all non-ascii or control characters similar to
+ * svn_xml_fuzzy_escape() and svn_utf_cstring_from_utf8_fuzzy().
+ * All of the encoding formats somewhat overlap with ascii (BMPString
+ * and UniversalString are actually always wider so you'll end up
+ * with a bunch of escaped nul bytes, but ideally we don't get here
+ * for those). The result is always a nul-terminated C string. */
+static const char *
+fuzzy_escape(const svn_string_t *src, apr_pool_t *result_pool)
+{
+ const char *end = src->data + src->len;
+ const char *p = src->data, *q;
+ svn_stringbuf_t *outstr;
+ char escaped_char[6]; /* ? \ u u u \0 */
+
+ for (q = p; q < end; q++)
+ {
+ if (!svn_ctype_isascii(*q) || svn_ctype_iscntrl(*q))
+ break;
+ }
+
+ if (q == end)
+ return src->data;
+
+ outstr = svn_stringbuf_create_empty(result_pool);
+ while (1)
+ {
+ q = p;
+
+ /* Traverse till either unsafe character or eos. */
+ while (q < end && svn_ctype_isascii(*q) && !svn_ctype_iscntrl(*q))
+ q++;
+
+ /* copy chunk before marker */
+ svn_stringbuf_appendbytes(outstr, p, q - p);
+
+ if (q == end)
+ break;
+
+ apr_snprintf(escaped_char, sizeof(escaped_char), "?\\%03u",
+ (unsigned char) *q);
+ svn_stringbuf_appendcstr(outstr, escaped_char);
+
+ p = q + 1;
+ }
+
+ return outstr->data;
+}
+
+/* Escape only NUL characters from a string that is presumed to
+ * be UTF-8 encoded and return a nul-terminated C string. */
+static const char *
+nul_escape(const svn_string_t *src, apr_pool_t *result_pool)
+{
+ const char *end = src->data + src->len;
+ const char *p = src->data, *q;
+ svn_stringbuf_t *outstr;
+
+ for (q = p; q < end; q++)
+ {
+ if (*q == '\0')
+ break;
+ }
+
+ if (q == end)
+ return src->data;
+
+ outstr = svn_stringbuf_create_empty(result_pool);
+ while (1)
+ {
+ q = p;
+
+ /* Traverse till either unsafe character or eos. */
+ while (q < end && *q != '\0')
+ q++;
+
+ /* copy chunk before marker */
+ svn_stringbuf_appendbytes(outstr, p, q - p);
+
+ if (q == end)
+ break;
+
+ svn_stringbuf_appendcstr(outstr, "?\\000");
+
+ p = q + 1;
+ }
+
+ return outstr->data;
+}
+
+
+/* Convert an ISO-8859-1 (Latin-1) string to UTF-8.
+ ISO-8859-1 is a strict subset of Unicode. */
+static svn_error_t *
+latin1_to_utf8(const svn_string_t **result, const svn_string_t *src,
+ apr_pool_t *result_pool)
+{
+ apr_int32_t *ucs4buf;
+ svn_membuf_t resultbuf;
+ apr_size_t length;
+ apr_size_t i;
+ svn_string_t *res;
+
+ ucs4buf = apr_palloc(result_pool, src->len * sizeof(*ucs4buf));
+ for (i = 0; i < src->len; ++i)
+ ucs4buf[i] = (unsigned char)(src->data[i]);
+
+ svn_membuf__create(&resultbuf, 2 * src->len, result_pool);
+ SVN_ERR(svn_utf__encode_ucs4_string(
+ &resultbuf, ucs4buf, src->len, &length));
+
+ res = apr_palloc(result_pool, sizeof(*res));
+ res->data = resultbuf.data;
+ res->len = length;
+ *result = res;
+ return SVN_NO_ERROR;
+}
+
+/* Make a best effort to convert a X.509 name to a UTF-8 encoded
+ * string and return it. If we can't properly convert just do a
+ * fuzzy conversion so we have something to display. */
+static const char *
+x509name_to_utf8_string(const x509_name *name, apr_pool_t *result_pool)
+{
+ const svn_string_t *src_string;
+ const svn_string_t *utf8_string;
+ svn_error_t *err;
+
+ src_string = svn_string_ncreate((const char *)name->val.p,
+ name->val.len,
+ result_pool);
+ switch (name->val.tag)
+ {
+ case ASN1_UTF8_STRING:
+ if (svn_utf__is_valid(src_string->data, src_string->len))
+ return nul_escape(src_string, result_pool);
+ else
+ /* not a valid UTF-8 string, who knows what it is,
+ * so run it through the fuzzy_escape code. */
+ return fuzzy_escape(src_string, result_pool);
+ break;
+
+ /* Both BMP and UNIVERSAL should always be in Big Endian (aka
+ * network byte order). But rumor has it that there are certs
+ * out there with other endianess and even Byte Order Marks.
+ * If we actually run into these, we might need to do something
+ * about it. */
+
+ case ASN1_BMP_STRING:
+ if (0 != src_string->len % sizeof(apr_uint16_t))
+ return fuzzy_escape(src_string, result_pool);
+ err = svn_utf__utf16_to_utf8(&utf8_string,
+ (const void*)(src_string->data),
+ src_string->len / sizeof(apr_uint16_t),
+ TRUE, result_pool, result_pool);
+ break;
+
+ case ASN1_UNIVERSAL_STRING:
+ if (0 != src_string->len % sizeof(apr_int32_t))
+ return fuzzy_escape(src_string, result_pool);
+ err = svn_utf__utf32_to_utf8(&utf8_string,
+ (const void*)(src_string->data),
+ src_string->len / sizeof(apr_int32_t),
+ TRUE, result_pool, result_pool);
+ break;
+
+ /* Despite what all the IETF, ISO, ITU bits say everything out
+ * on the Internet that I can find treats this as ISO-8859-1.
+ * Even the name is misleading, it's not actually T.61. All the
+ * gory details can be found in the Character Sets section of:
+ * https://www.cs.auckland.ac.nz/~pgut001/pubs/x509guide.txt
+ */
+ case ASN1_T61_STRING:
+ err = latin1_to_utf8(&utf8_string, src_string, result_pool);
+ break;
+
+ /* This leaves two types out there in the wild. PrintableString,
+ * which is just a subset of ASCII and IA5 which is ASCII (though
+ * 0x24 '$' and 0x23 '#' may be defined with differnet symbols
+ * depending on the location, in practice it seems everyone just
+ * treats it as ASCII). Since these are just ASCII run through
+ * the fuzzy_escape code to deal with anything that isn't actually
+ * ASCII. There shouldn't be any other types here but if we find
+ * a cert with some other encoding, the best we can do is the
+ * fuzzy_escape(). Note: Technically IA5 isn't valid in this
+ * context, however in the real world it may pop up. */
+ default:
+ return fuzzy_escape(src_string, result_pool);
+ }
+
+ if (err)
+ {
+ svn_error_clear(err);
+ return fuzzy_escape(src_string, result_pool);
+ }
+
+ return nul_escape(utf8_string, result_pool);
+}
+
+static svn_error_t *
+x509_name_to_certinfo(apr_array_header_t **result,
+ const x509_name *dn,
+ apr_pool_t *scratch_pool,
+ apr_pool_t *result_pool)
+{
+ const x509_name *name = dn;
+
+ *result = apr_array_make(result_pool, 6, sizeof(svn_x509_name_attr_t *));
+
+ while (name != NULL) {
+ svn_x509_name_attr_t *attr = apr_palloc(result_pool, sizeof(svn_x509_name_attr_t));
+
+ attr->oid_len = name->oid.len;
+ attr->oid = apr_palloc(result_pool, attr->oid_len);
+ memcpy(attr->oid, name->oid.p, attr->oid_len);
+ attr->utf8_value = x509name_to_utf8_string(name, result_pool);
+ if (!attr->utf8_value)
+ /* this should never happen */
+ attr->utf8_value = apr_pstrdup(result_pool, "??");
+ APR_ARRAY_PUSH(*result, const svn_x509_name_attr_t *) = attr;
+
+ name = name->next;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_boolean_t
+is_hostname(const char *str)
+{
+ apr_size_t i, len = strlen(str);
+
+ for (i = 0; i < len; i++)
+ {
+ char c = str[i];
+
+ /* '-' is only legal when not at the start or end of a label */
+ if (c == '-')
+ {
+ if (i + 1 != len)
+ {
+ if (str[i + 1] == '.')
+ return FALSE; /* '-' preceeds a '.' */
+ }
+ else
+ return FALSE; /* '-' is at end of string */
+
+ /* determine the previous character. */
+ if (i == 0)
+ return FALSE; /* '-' is at start of string */
+ else
+ if (str[i - 1] == '.')
+ return FALSE; /* '-' follows a '.' */
+ }
+ else if (c != '*' && c != '.' && !svn_ctype_isalnum(c))
+ return FALSE; /* some character not allowed */
+ }
+
+ return TRUE;
+}
+
+static const char *
+x509parse_get_cn(apr_array_header_t *subject)
+{
+ int i;
+
+ for (i = 0; i < subject->nelts; ++i)
+ {
+ const svn_x509_name_attr_t *attr = APR_ARRAY_IDX(subject, i, const svn_x509_name_attr_t *);
+ if (equal(attr->oid, attr->oid_len,
+ SVN_X509_OID_COMMON_NAME, sizeof(SVN_X509_OID_COMMON_NAME) - 1))
+ return attr->utf8_value;
+ }
+
+ return NULL;
+}
+
+
+static void
+x509parse_get_hostnames(svn_x509_certinfo_t *ci, x509_cert *crt,
+ apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+ ci->hostnames = NULL;
+
+ if (crt->dnsnames->nelts > 0)
+ {
+ int i;
+
+ ci->hostnames = apr_array_make(result_pool, crt->dnsnames->nelts,
+ sizeof(const char*));
+
+ /* Subject Alt Names take priority */
+ for (i = 0; i < crt->dnsnames->nelts; i++)
+ {
+ x509_buf *dnsname = APR_ARRAY_IDX(crt->dnsnames, i, x509_buf *);
+ const svn_string_t *temp = svn_string_ncreate((const char *)dnsname->p,
+ dnsname->len,
+ scratch_pool);
+
+ APR_ARRAY_PUSH(ci->hostnames, const char*)
+ = fuzzy_escape(temp, result_pool);
+ }
+ }
+ else
+ {
+ /* no SAN then get the hostname from the CommonName on the cert */
+ const char *utf8_value;
+
+ utf8_value = x509parse_get_cn(ci->subject);
+
+ if (utf8_value && is_hostname(utf8_value))
+ {
+ ci->hostnames = apr_array_make(result_pool, 1, sizeof(const char*));
+ APR_ARRAY_PUSH(ci->hostnames, const char*) = utf8_value;
+ }
+ }
+}
+
+/*
+ * Parse one certificate.
+ */
+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)
+{
+ svn_error_t *err;
+ ptrdiff_t len;
+ const unsigned char *p;
+ const unsigned char *end;
+ x509_cert *crt;
+ svn_x509_certinfo_t *ci;
+
+ crt = apr_pcalloc(scratch_pool, sizeof(*crt));
+ p = (const unsigned char *)buf;
+ len = buflen;
+ end = p + len;
+
+ /*
+ * Certificate ::= SEQUENCE {
+ * tbsCertificate TBSCertificate,
+ * signatureAlgorithm AlgorithmIdentifier,
+ * signatureValue BIT STRING }
+ */
+ err = asn1_get_tag(&p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+
+ if (len != (end - p))
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+ }
+
+ /*
+ * TBSCertificate ::= SEQUENCE {
+ */
+ err = asn1_get_tag(&p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+
+ end = p + len;
+
+ /*
+ * Version ::= INTEGER { v1(0), v2(1), v3(2) }
+ *
+ * CertificateSerialNumber ::= INTEGER
+ *
+ * signature AlgorithmIdentifier
+ */
+ SVN_ERR(x509_get_version(&p, end, &crt->version));
+ SVN_ERR(x509_get_serial(&p, end, &crt->serial));
+ SVN_ERR(x509_get_alg(&p, end, &crt->sig_oid1));
+
+ crt->version++;
+
+ if (crt->version > 3)
+ return svn_error_create(SVN_ERR_X509_CERT_UNKNOWN_VERSION, NULL, NULL);
+
+ /*
+ * issuer Name
+ */
+ err = asn1_get_tag(&p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+
+ SVN_ERR(x509_get_name(&p, p + len, &crt->issuer, scratch_pool));
+
+ /*
+ * Validity ::= SEQUENCE {
+ * notBefore Time,
+ * notAfter Time }
+ *
+ */
+ SVN_ERR(x509_get_dates(&crt->valid_from, &crt->valid_to, &p, end,
+ scratch_pool));
+
+ /*
+ * subject Name
+ */
+ err = asn1_get_tag(&p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+
+ SVN_ERR(x509_get_name(&p, p + len, &crt->subject, scratch_pool));
+
+ /*
+ * SubjectPublicKeyInfo ::= SEQUENCE
+ * algorithm AlgorithmIdentifier,
+ * subjectPublicKey BIT STRING }
+ */
+ err = asn1_get_tag(&p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE);
+ if (err)
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+
+ /* Skip pubkey. */
+ p += len;
+
+ /*
+ * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
+ * -- If present, version shall be v2 or v3
+ * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
+ * -- If present, version shall be v2 or v3
+ * extensions [3] EXPLICIT Extensions OPTIONAL
+ * -- If present, version shall be v3
+ */
+ crt->dnsnames = apr_array_make(scratch_pool, 3, sizeof(x509_buf *));
+
+ /* Try to parse issuerUniqueID, subjectUniqueID and extensions for *every*
+ * version (X.509 v1, v2 and v3), not just v2 or v3. If they aren't present,
+ * we are fine, but we don't want to throw an error if they are. v1 and v2
+ * certificates with the corresponding extra fields are ill-formed per RFC
+ * 5280 s. 4.1, but we suspect they could exist in the real world. Other
+ * X.509 parsers (e.g., within OpenSSL or Microsoft CryptoAPI) aren't picky
+ * about these certificates, and we also allow them. */
+ SVN_ERR(x509_get_uid(&p, end, &crt->issuer_id, 1));
+ SVN_ERR(x509_get_uid(&p, end, &crt->subject_id, 2));
+ SVN_ERR(x509_get_ext(crt->dnsnames, &p, end));
+
+ if (p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+ }
+
+ end = (const unsigned char*) buf + buflen;
+
+ /*
+ * signatureAlgorithm AlgorithmIdentifier,
+ * signatureValue BIT STRING
+ */
+ SVN_ERR(x509_get_alg(&p, end, &crt->sig_oid2));
+
+ if (!oids_equal(&crt->sig_oid1, &crt->sig_oid2))
+ return svn_error_create(SVN_ERR_X509_CERT_SIG_MISMATCH, NULL, NULL);
+
+ SVN_ERR(x509_get_sig(&p, end, &crt->sig));
+
+ if (p != end)
+ {
+ err = svn_error_create(SVN_ERR_ASN1_LENGTH_MISMATCH, NULL, NULL);
+ return svn_error_create(SVN_ERR_X509_CERT_INVALID_FORMAT, err, NULL);
+ }
+
+ ci = apr_pcalloc(result_pool, sizeof(*ci));
+
+ /* Get the subject name */
+ SVN_ERR(x509_name_to_certinfo(&ci->subject, &crt->subject,
+ scratch_pool, result_pool));
+
+ /* Get the issuer name */
+ SVN_ERR(x509_name_to_certinfo(&ci->issuer, &crt->issuer,
+ scratch_pool, result_pool));
+
+ /* Copy the validity range */
+ ci->valid_from = crt->valid_from;
+ ci->valid_to = crt->valid_to;
+
+ /* Calculate the SHA1 digest of the certificate, otherwise known as
+ the fingerprint */
+ SVN_ERR(svn_checksum(&ci->digest, svn_checksum_sha1, buf, buflen,
+ result_pool));
+
+ /* Construct the array of host names */
+ x509parse_get_hostnames(ci, crt, result_pool, scratch_pool);
+
+ *certinfo = ci;
+ return SVN_NO_ERROR;
+}
+
diff --git a/subversion/libsvn_subr/xml.c b/subversion/libsvn_subr/xml.c
index a9d834a..edf21aa 100644
--- a/subversion/libsvn_subr/xml.c
+++ b/subversion/libsvn_subr/xml.c
@@ -34,6 +34,7 @@
#include "svn_ctype.h"
#include "private/svn_utf_private.h"
+#include "private/svn_subr_private.h"
#ifdef SVN_HAVE_OLD_EXPAT
#include <xmlparse.h>
@@ -45,6 +46,36 @@
#error Expat is unusable -- it has been compiled for wide characters
#endif
+#ifndef XML_VERSION_AT_LEAST
+#define XML_VERSION_AT_LEAST(major,minor,patch) \
+(((major) < XML_MAJOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) < XML_MINOR_VERSION) \
+ || ((major) == XML_MAJOR_VERSION && (minor) == XML_MINOR_VERSION && \
+ (patch) <= XML_MICRO_VERSION))
+#endif /* XML_VERSION_AT_LEAST */
+
+const char *
+svn_xml__compiled_version(void)
+{
+ static const char xml_version_str[] = APR_STRINGIFY(XML_MAJOR_VERSION)
+ "." APR_STRINGIFY(XML_MINOR_VERSION)
+ "." APR_STRINGIFY(XML_MICRO_VERSION);
+
+ return xml_version_str;
+}
+
+const char *
+svn_xml__runtime_version(void)
+{
+ const char *expat_version = XML_ExpatVersion();
+
+ if (!strncmp(expat_version, "expat_", 6))
+ expat_version += 6;
+
+ return expat_version;
+}
+
+
/* The private internals for a parser object. */
struct svn_xml_parser_t
{
@@ -338,6 +369,28 @@ static void expat_data_handler(void *userData, const XML_Char *s, int len)
(*svn_parser->data_handler)(svn_parser->baton, s, (apr_size_t)len);
}
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+static void expat_entity_declaration(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity,
+ const XML_Char *value,
+ int value_length,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName)
+{
+ svn_xml_parser_t *svn_parser = userData;
+
+ /* Stop the parser if an entity declaration is hit. */
+ XML_StopParser(svn_parser->parser, 0 /* resumable */);
+}
+#else
+/* A noop default_handler. */
+static void expat_default_handler(void *userData, const XML_Char *s, int len)
+{
+}
+#endif
/*** Making a parser. ***/
@@ -359,6 +412,12 @@ svn_xml_make_parser(void *baton,
XML_SetCharacterDataHandler(parser,
data_handler ? expat_data_handler : NULL);
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(parser, expat_entity_declaration);
+#else
+ XML_SetDefaultHandler(parser, expat_default_handler);
+#endif
+
/* ### we probably don't want this pool; or at least we should pass it
### to the callbacks and clear it periodically. */
subpool = svn_pool_create(pool);
@@ -440,6 +499,9 @@ void svn_xml_signal_bailout(svn_error_t *error,
/* This will cause the current XML_Parse() call to finish quickly! */
XML_SetElementHandler(svn_parser->parser, NULL, NULL);
XML_SetCharacterDataHandler(svn_parser->parser, NULL);
+#if XML_VERSION_AT_LEAST(1, 95, 8)
+ XML_SetEntityDeclHandler(svn_parser->parser, NULL);
+#endif
/* Once outside of XML_Parse(), the existence of this field will
cause svn_delta_parse()'s main read-loop to return error. */
diff --git a/subversion/libsvn_wc/adm_crawler.c b/subversion/libsvn_wc/adm_crawler.c
index e5935a2..ebdc75e 100644
--- a/subversion/libsvn_wc/adm_crawler.c
+++ b/subversion/libsvn_wc/adm_crawler.c
@@ -69,6 +69,8 @@ restore_file(svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t use_commit_times,
svn_boolean_t mark_resolved_text_conflict,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_skel_t *work_item;
@@ -86,12 +88,14 @@ restore_file(svn_wc__db_t *db,
/* Run the work item immediately. */
SVN_ERR(svn_wc__wq_run(db, local_abspath,
- NULL, NULL, /* ### nice to have cancel_func/baton */
+ cancel_func, cancel_baton,
scratch_pool));
/* Remove any text conflict */
if (mark_resolved_text_conflict)
- SVN_ERR(svn_wc__mark_resolved_text_conflict(db, local_abspath, scratch_pool));
+ SVN_ERR(svn_wc__mark_resolved_text_conflict(db, local_abspath,
+ cancel_func, cancel_baton,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -102,6 +106,7 @@ svn_wc_restore(svn_wc_context_t *wc_ctx,
svn_boolean_t use_commit_times,
apr_pool_t *scratch_pool)
{
+ /* ### If ever revved: Add cancel func. */
svn_wc__db_status_t status;
svn_node_kind_t kind;
svn_node_kind_t disk_kind;
@@ -138,6 +143,7 @@ svn_wc_restore(svn_wc_context_t *wc_ctx,
if (kind == svn_node_file || kind == svn_node_symlink)
SVN_ERR(restore_file(wc_ctx->db, local_abspath, use_commit_times,
FALSE /*mark_resolved_text_conflict*/,
+ NULL, NULL /* cancel func, baton */,
scratch_pool));
else
SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool));
@@ -145,7 +151,7 @@ svn_wc_restore(svn_wc_context_t *wc_ctx,
return SVN_NO_ERROR;
}
-/* Try to restore LOCAL_ABSPATH of node type KIND and if successfull,
+/* Try to restore LOCAL_ABSPATH of node type KIND and if successful,
notify that the node is restored. Use DB for accessing the working copy.
If USE_COMMIT_TIMES is set, then set working file's timestamp to
last-commit-time.
@@ -156,7 +162,10 @@ static svn_error_t *
restore_node(svn_wc__db_t *db,
const char *local_abspath,
svn_node_kind_t kind,
+ svn_boolean_t mark_resolved_text_conflict,
svn_boolean_t use_commit_times,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
@@ -165,7 +174,8 @@ restore_node(svn_wc__db_t *db,
{
/* Recreate file from text-base; mark any text conflict as resolved */
SVN_ERR(restore_file(db, local_abspath, use_commit_times,
- TRUE /*mark_resolved_text_conflict*/,
+ mark_resolved_text_conflict,
+ cancel_func, cancel_baton,
scratch_pool));
}
else if (kind == svn_node_dir)
@@ -293,11 +303,11 @@ report_revisions_and_depths(svn_wc__db_t *db,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *child = svn__apr_hash_index_key(hi);
+ const char *child = apr_hash_this_key(hi);
const char *this_report_relpath;
const char *this_abspath;
svn_boolean_t this_switched = FALSE;
- struct svn_wc__db_base_info_t *ths = svn__apr_hash_index_val(hi);
+ struct svn_wc__db_base_info_t *ths = apr_hash_this_val(hi);
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
@@ -375,12 +385,13 @@ report_revisions_and_depths(svn_wc__db_t *db,
svn_wc__db_status_t wrk_status;
svn_node_kind_t wrk_kind;
const svn_checksum_t *checksum;
+ svn_boolean_t conflicted;
SVN_ERR(svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
&checksum, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, &conflicted,
NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
db, this_abspath, iterpool, iterpool));
if ((wrk_status == svn_wc__db_status_normal
@@ -399,8 +410,9 @@ report_revisions_and_depths(svn_wc__db_t *db,
if (dirent_kind == svn_node_none)
{
SVN_ERR(restore_node(db, this_abspath, wrk_kind,
- use_commit_times, notify_func,
- notify_baton, iterpool));
+ conflicted, use_commit_times,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton, iterpool));
}
}
}
@@ -708,12 +720,13 @@ svn_wc_crawl_revisions5(svn_wc_context_t *wc_ctx,
svn_wc__db_status_t wrk_status;
svn_node_kind_t wrk_kind;
const svn_checksum_t *checksum;
+ svn_boolean_t conflicted;
err = svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, &checksum, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL,
+ NULL, &conflicted, NULL, NULL, NULL, NULL,
+ NULL, NULL,
db, local_abspath,
scratch_pool, scratch_pool);
@@ -733,7 +746,8 @@ svn_wc_crawl_revisions5(svn_wc_context_t *wc_ctx,
&& (wrk_kind == svn_node_dir || checksum))
{
SVN_ERR(restore_node(wc_ctx->db, local_abspath,
- wrk_kind, use_commit_times,
+ wrk_kind, conflicted, use_commit_times,
+ cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool));
}
@@ -877,7 +891,7 @@ read_handler_copy(void *baton, char *buffer, apr_size_t *len)
{
struct copying_stream_baton *btn = baton;
- SVN_ERR(svn_stream_read(btn->source, buffer, len));
+ SVN_ERR(svn_stream_read_full(btn->source, buffer, len));
return svn_stream_write(btn->target, buffer, len);
}
@@ -910,7 +924,8 @@ copying_stream(svn_stream_t *source,
baton->target = target;
stream = svn_stream_create(baton, pool);
- svn_stream_set_read(stream, read_handler_copy);
+ svn_stream_set_read2(stream, NULL /* only full read support */,
+ read_handler_copy);
svn_stream_set_close(stream, close_handler_copy);
return stream;
@@ -999,8 +1014,9 @@ svn_wc__internal_transmit_text_deltas(const char **tempfile,
svn_checksum_t *verify_checksum; /* calc'd MD5 of BASE_STREAM */
svn_checksum_t *local_md5_checksum; /* calc'd MD5 of LOCAL_STREAM */
svn_checksum_t *local_sha1_checksum; /* calc'd SHA1 of LOCAL_STREAM */
- const char *new_pristine_tmp_abspath;
+ svn_wc__db_install_data_t *install_data = NULL;
svn_error_t *err;
+ svn_error_t *err2;
svn_stream_t *base_stream; /* delta source */
svn_stream_t *local_stream; /* delta target: LOCAL_ABSPATH transl. to NF */
@@ -1037,11 +1053,11 @@ svn_wc__internal_transmit_text_deltas(const char **tempfile,
{
svn_stream_t *new_pristine_stream;
- SVN_ERR(svn_wc__open_writable_base(&new_pristine_stream,
- &new_pristine_tmp_abspath,
- NULL, &local_sha1_checksum,
- db, local_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&new_pristine_stream,
+ &install_data,
+ &local_sha1_checksum, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
local_stream = copying_stream(local_stream, new_pristine_stream,
scratch_pool);
}
@@ -1097,7 +1113,15 @@ svn_wc__internal_transmit_text_deltas(const char **tempfile,
scratch_pool, scratch_pool);
/* Close the two streams to force writing the digest */
- err = svn_error_compose_create(err, svn_stream_close(base_stream));
+ err2 = svn_stream_close(base_stream);
+ if (err2)
+ {
+ /* Set verify_checksum to NULL if svn_stream_close() returns error
+ because checksum will be uninitialized in this case. */
+ verify_checksum = NULL;
+ err = svn_error_compose_create(err, err2);
+ }
+
err = svn_error_compose_create(err, svn_stream_close(local_stream));
/* If we have an error, it may be caused by a corrupt text base,
@@ -1145,7 +1169,7 @@ svn_wc__internal_transmit_text_deltas(const char **tempfile,
result_pool);
if (new_text_base_sha1_checksum)
{
- SVN_ERR(svn_wc__db_pristine_install(db, new_pristine_tmp_abspath,
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
local_sha1_checksum,
local_md5_checksum,
scratch_pool));
diff --git a/subversion/libsvn_wc/adm_files.c b/subversion/libsvn_wc/adm_files.c
index 11ad277..67a1357 100644
--- a/subversion/libsvn_wc/adm_files.c
+++ b/subversion/libsvn_wc/adm_files.c
@@ -117,7 +117,7 @@ svn_wc__adm_child(const char *path,
path,
adm_dir_name,
child,
- NULL);
+ SVN_VA_NULL);
}
@@ -295,38 +295,6 @@ svn_wc__open_adm_stream(svn_stream_t **stream,
}
-svn_error_t *
-svn_wc__open_writable_base(svn_stream_t **stream,
- const char **temp_base_abspath,
- svn_checksum_t **md5_checksum,
- svn_checksum_t **sha1_checksum,
- svn_wc__db_t *db,
- const char *wri_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const char *temp_dir_abspath;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
-
- SVN_ERR(svn_wc__db_pristine_get_tempdir(&temp_dir_abspath, db, wri_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_stream_open_unique(stream,
- temp_base_abspath,
- temp_dir_abspath,
- svn_io_file_del_none,
- result_pool, scratch_pool));
- if (md5_checksum)
- *stream = svn_stream_checksummed2(*stream, NULL, md5_checksum,
- svn_checksum_md5, FALSE, result_pool);
- if (sha1_checksum)
- *stream = svn_stream_checksummed2(*stream, NULL, sha1_checksum,
- svn_checksum_sha1, FALSE, result_pool);
-
- return SVN_NO_ERROR;
-}
-
-
-
/*** Checking for and creating administrative subdirs. ***/
@@ -464,11 +432,14 @@ svn_wc__internal_ensure_adm(svn_wc__db_t *db,
db, local_abspath,
scratch_pool, scratch_pool));
else
- SVN_ERR(svn_wc__db_scan_base_repos(&db_repos_relpath,
- &db_repos_root_url,
- &db_repos_uuid,
- db, local_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL,
+ &db_repos_relpath,
+ &db_repos_root_url,
+ &db_repos_uuid, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
}
/* The caller gives us a URL which should match the entry. However,
diff --git a/subversion/libsvn_wc/adm_files.h b/subversion/libsvn_wc/adm_files.h
index 3712149..8c94f74 100644
--- a/subversion/libsvn_wc/adm_files.h
+++ b/subversion/libsvn_wc/adm_files.h
@@ -112,30 +112,6 @@ svn_error_t *svn_wc__open_adm_stream(svn_stream_t **stream,
apr_pool_t *scratch_pool);
-/* Open a writable stream to a temporary (normal or revert) text base,
- associated with the versioned file LOCAL_ABSPATH in DB. Set *STREAM to
- the opened stream and *TEMP_BASE_ABSPATH to the path to the temporary
- file. The temporary file will have an arbitrary unique name, in contrast
- to the deterministic name that svn_wc__text_base_deterministic_tmp_path()
- returns.
-
- Arrange that, on stream closure, *MD5_CHECKSUM and *SHA1_CHECKSUM will be
- set to the MD-5 and SHA-1 checksums respectively of that file.
- MD5_CHECKSUM and/or SHA1_CHECKSUM may be NULL if not wanted.
-
- Allocate the new stream, path and checksums in RESULT_POOL.
- */
-svn_error_t *
-svn_wc__open_writable_base(svn_stream_t **stream,
- const char **temp_base_abspath,
- svn_checksum_t **md5_checksum,
- svn_checksum_t **sha1_checksum,
- svn_wc__db_t *db,
- const char *wri_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
/* Blow away the admistrative directory associated with DIR_ABSPATH.
For single-db this doesn't perform actual work unless the wcroot is passed.
*/
diff --git a/subversion/libsvn_wc/adm_ops.c b/subversion/libsvn_wc/adm_ops.c
index a0f8061..3ccd2e7 100644
--- a/subversion/libsvn_wc/adm_ops.c
+++ b/subversion/libsvn_wc/adm_ops.c
@@ -36,6 +36,7 @@
#include <apr_time.h>
#include <apr_errno.h>
+#include "svn_private_config.h"
#include "svn_types.h"
#include "svn_pools.h"
#include "svn_string.h"
@@ -53,32 +54,32 @@
#include "conflicts.h"
#include "workqueue.h"
-#include "svn_private_config.h"
-#include "private/svn_subr_private.h"
#include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
struct svn_wc_committed_queue_t
{
/* The pool in which ->queue is allocated. */
apr_pool_t *pool;
- /* Mapping (const char *) local_abspath to (committed_queue_item_t *). */
- apr_hash_t *queue;
- /* Is any item in the queue marked as 'recursive'? */
- svn_boolean_t have_recursive;
+ /* Mapping (const char *) wcroot_abspath to svn_wc__db_commit_queue_t * */
+ apr_hash_t *wc_queues;
};
typedef struct committed_queue_item_t
{
const char *local_abspath;
- svn_boolean_t recurse;
- svn_boolean_t no_unlock;
- svn_boolean_t keep_changelist;
+ svn_boolean_t recurse; /* Use legacy recursion */
+ svn_boolean_t committed; /* Process the node as committed */
+ svn_boolean_t remove_lock; /* Remove existing lock on node */
+ svn_boolean_t remove_changelist; /* Remove changelist on node */
- /* The pristine text checksum. */
- const svn_checksum_t *sha1_checksum;
+ /* The pristine text checksum. NULL if the old value should be kept
+ and for directories */
+ const svn_checksum_t *new_sha1_checksum;
- apr_hash_t *new_dav_cache;
+ apr_hash_t *new_dav_cache; /* New DAV cache for the node */
} committed_queue_item_t;
@@ -88,245 +89,6 @@ svn_wc__get_committed_queue_pool(const struct svn_wc_committed_queue_t *queue)
return queue->pool;
}
-
-
-/*** Finishing updates and commits. ***/
-
-/* Queue work items that will finish a commit of the file or directory
- * LOCAL_ABSPATH in DB:
- * - queue the removal of any "revert-base" props and text files;
- * - queue an update of the DB entry for this node
- *
- * ### The Pristine Store equivalent should be:
- * - remember the old BASE_NODE and WORKING_NODE pristine text c'sums;
- * - queue an update of the DB entry for this node (incl. updating the
- * BASE_NODE c'sum and setting the WORKING_NODE c'sum to NULL);
- * - queue deletion of the old pristine texts by the remembered checksums.
- *
- * CHECKSUM is the checksum of the new text base for LOCAL_ABSPATH, and must
- * be provided if there is one, else NULL.
- *
- * STATUS, KIND, PROP_MODS and OLD_CHECKSUM are the current in-db values of
- * the node LOCAL_ABSPATH.
- */
-static svn_error_t *
-process_committed_leaf(svn_wc__db_t *db,
- const char *local_abspath,
- svn_boolean_t via_recurse,
- svn_wc__db_status_t status,
- svn_node_kind_t kind,
- svn_boolean_t prop_mods,
- const svn_checksum_t *old_checksum,
- svn_revnum_t new_revnum,
- apr_time_t new_changed_date,
- const char *new_changed_author,
- apr_hash_t *new_dav_cache,
- svn_boolean_t no_unlock,
- svn_boolean_t keep_changelist,
- const svn_checksum_t *checksum,
- apr_pool_t *scratch_pool)
-{
- svn_revnum_t new_changed_rev = new_revnum;
- svn_skel_t *work_item = NULL;
-
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
-
- {
- const char *adm_abspath;
-
- if (kind == svn_node_dir)
- adm_abspath = local_abspath;
- else
- adm_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
- SVN_ERR(svn_wc__write_check(db, adm_abspath, scratch_pool));
- }
-
- if (status == svn_wc__db_status_deleted)
- {
- return svn_error_trace(
- svn_wc__db_base_remove(
- db, local_abspath,
- FALSE /* keep_as_working */,
- FALSE /* queue_deletes */,
- TRUE /* remove_locks */,
- (! via_recurse)
- ? new_revnum : SVN_INVALID_REVNUM,
- NULL, NULL,
- scratch_pool));
- }
- else if (status == svn_wc__db_status_not_present)
- {
- /* We are committing the leaf of a copy operation.
- We leave the not-present marker to allow pulling in excluded
- children of a copy.
-
- The next update will remove the not-present marker. */
-
- return SVN_NO_ERROR;
- }
-
- SVN_ERR_ASSERT(status == svn_wc__db_status_normal
- || status == svn_wc__db_status_incomplete
- || status == svn_wc__db_status_added);
-
- if (kind != svn_node_dir)
- {
- /* If we sent a delta (meaning: post-copy modification),
- then this file will appear in the queue and so we should have
- its checksum already. */
- if (checksum == NULL)
- {
- /* It was copied and not modified. We must have a text
- base for it. And the node should have a checksum. */
- SVN_ERR_ASSERT(old_checksum != NULL);
-
- checksum = old_checksum;
-
- /* Is the node completely unmodified and are we recursing? */
- if (via_recurse && !prop_mods)
- {
- /* If a copied node itself is not modified, but the op_root of
- the copy is committed we have to make sure that changed_rev,
- changed_date and changed_author don't change or the working
- copy used for committing will show different last modified
- information then a clean checkout of exactly the same
- revisions. (Issue #3676) */
-
- SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL, NULL, NULL,
- NULL, &new_changed_rev,
- &new_changed_date,
- &new_changed_author, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- NULL, NULL, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
- }
- }
-
- SVN_ERR(svn_wc__wq_build_file_commit(&work_item,
- db, local_abspath,
- prop_mods,
- scratch_pool, scratch_pool));
- }
-
- /* The new text base will be found in the pristine store by its checksum. */
- SVN_ERR(svn_wc__db_global_commit(db, local_abspath,
- new_revnum, new_changed_rev,
- new_changed_date, new_changed_author,
- checksum,
- NULL /* new_children */,
- new_dav_cache,
- keep_changelist,
- no_unlock,
- work_item,
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_wc__process_committed_internal(svn_wc__db_t *db,
- const char *local_abspath,
- svn_boolean_t recurse,
- svn_boolean_t top_of_recurse,
- svn_revnum_t new_revnum,
- apr_time_t new_date,
- const char *rev_author,
- apr_hash_t *new_dav_cache,
- svn_boolean_t no_unlock,
- svn_boolean_t keep_changelist,
- const svn_checksum_t *sha1_checksum,
- const svn_wc_committed_queue_t *queue,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_status_t status;
- svn_node_kind_t kind;
- const svn_checksum_t *old_checksum;
- svn_boolean_t prop_mods;
-
- SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, &old_checksum, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, &prop_mods, NULL, NULL, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
-
- /* NOTE: be wary of making crazy semantic changes in this function, since
- svn_wc_process_committed4() calls this. */
-
- SVN_ERR(process_committed_leaf(db, local_abspath, !top_of_recurse,
- status, kind, prop_mods, old_checksum,
- new_revnum, new_date, rev_author,
- new_dav_cache,
- no_unlock, keep_changelist,
- sha1_checksum,
- scratch_pool));
-
- /* Only check for recursion on nodes that have children */
- if (kind != svn_node_file
- || status == svn_wc__db_status_not_present
- || status == svn_wc__db_status_excluded
- || status == svn_wc__db_status_server_excluded
- /* Node deleted -> then no longer a directory */
- || status == svn_wc__db_status_deleted)
- {
- return SVN_NO_ERROR;
- }
-
- if (recurse)
- {
- const apr_array_header_t *children;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- int i;
-
- /* Read PATH's entries; this is the absolute path. */
- SVN_ERR(svn_wc__db_read_children(&children, db, local_abspath,
- scratch_pool, iterpool));
-
- /* Recursively loop over all children. */
- for (i = 0; i < children->nelts; i++)
- {
- const char *name = APR_ARRAY_IDX(children, i, const char *);
- const char *this_abspath;
- const committed_queue_item_t *cqi;
-
- svn_pool_clear(iterpool);
-
- this_abspath = svn_dirent_join(local_abspath, name, iterpool);
-
- sha1_checksum = NULL;
- cqi = svn_hash_gets(queue->queue, this_abspath);
-
- if (cqi != NULL)
- sha1_checksum = cqi->sha1_checksum;
-
- /* Recurse. Pass NULL for NEW_DAV_CACHE, because the
- ones present in the current call are only applicable to
- this one committed item. */
- SVN_ERR(svn_wc__process_committed_internal(
- db, this_abspath,
- TRUE /* recurse */,
- FALSE /* top_of_recurse */,
- new_revnum, new_date,
- rev_author,
- NULL /* new_dav_cache */,
- TRUE /* no_unlock */,
- keep_changelist,
- sha1_checksum,
- queue,
- iterpool));
- }
-
- svn_pool_destroy(iterpool);
- }
-
- return SVN_NO_ERROR;
-}
-
-
apr_hash_t *
svn_wc__prop_array_to_hash(const apr_array_header_t *props,
apr_pool_t *result_pool)
@@ -357,76 +119,56 @@ svn_wc_committed_queue_create(apr_pool_t *pool)
q = apr_palloc(pool, sizeof(*q));
q->pool = pool;
- q->queue = apr_hash_make(pool);
- q->have_recursive = FALSE;
+ q->wc_queues = apr_hash_make(pool);
return q;
}
svn_error_t *
-svn_wc_queue_committed3(svn_wc_committed_queue_t *queue,
+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)
{
- committed_queue_item_t *cqi;
+ const char *wcroot_abspath;
+ svn_wc__db_commit_queue_t *db_queue;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- queue->have_recursive |= recurse;
-
/* Use the same pool as the one QUEUE was allocated in,
to prevent lifetime issues. Intermediate operations
should use SCRATCH_POOL. */
- /* Add to the array with paths and options */
- cqi = apr_palloc(queue->pool, sizeof(*cqi));
- cqi->local_abspath = local_abspath;
- cqi->recurse = recurse;
- cqi->no_unlock = !remove_lock;
- cqi->keep_changelist = !remove_changelist;
- cqi->sha1_checksum = sha1_checksum;
- cqi->new_dav_cache = svn_wc__prop_array_to_hash(wcprop_changes, queue->pool);
-
- svn_hash_sets(queue->queue, local_abspath, cqi);
-
- return SVN_NO_ERROR;
-}
-
+ SVN_ERR(svn_wc__db_get_wcroot(&wcroot_abspath,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
-/* Return TRUE if any item of QUEUE is a parent of ITEM and will be
- processed recursively, return FALSE otherwise.
-
- The algorithmic complexity of this search implementation is O(queue
- length), but it's quite quick.
-*/
-static svn_boolean_t
-have_recursive_parent(apr_hash_t *queue,
- const committed_queue_item_t *item,
- apr_pool_t *scratch_pool)
-{
- apr_hash_index_t *hi;
- const char *local_abspath = item->local_abspath;
-
- for (hi = apr_hash_first(scratch_pool, queue); hi; hi = apr_hash_next(hi))
+ db_queue = svn_hash_gets(queue->wc_queues, wcroot_abspath);
+ if (! db_queue)
{
- const committed_queue_item_t *qi = svn__apr_hash_index_val(hi);
+ wcroot_abspath = apr_pstrdup(queue->pool, wcroot_abspath);
- if (qi == item)
- continue;
+ SVN_ERR(svn_wc__db_create_commit_queue(&db_queue,
+ wc_ctx->db, wcroot_abspath,
+ queue->pool, scratch_pool));
- if (qi->recurse && svn_dirent_is_child(qi->local_abspath, local_abspath,
- NULL))
- return TRUE;
+ svn_hash_sets(queue->wc_queues, wcroot_abspath, db_queue);
}
- return FALSE;
+ return svn_error_trace(
+ svn_wc__db_commit_queue_add(db_queue, local_abspath, recurse,
+ is_committed, remove_lock,
+ remove_changelist, sha1_checksum,
+ svn_wc__prop_array_to_hash(wcprop_changes,
+ queue->pool),
+ queue->pool, scratch_pool));
}
@@ -440,75 +182,44 @@ svn_wc_process_committed_queue2(svn_wc_committed_queue_t *queue,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
- apr_array_header_t *sorted_queue;
+ apr_array_header_t *wcs;
int i;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_time_t new_date;
- apr_hash_t *run_wqs = apr_hash_make(scratch_pool);
- apr_hash_index_t *hi;
if (rev_date)
SVN_ERR(svn_time_from_cstring(&new_date, rev_date, iterpool));
else
new_date = 0;
- /* Process the queued items in order of their paths. (The requirement is
- * probably just that a directory must be processed before its children.) */
- sorted_queue = svn_sort__hash(queue->queue, svn_sort_compare_items_as_paths,
- scratch_pool);
- for (i = 0; i < sorted_queue->nelts; i++)
+ /* Process the wc's in order of their paths. */
+ wcs = svn_sort__hash(queue->wc_queues, svn_sort_compare_items_as_paths,
+ scratch_pool);
+ for (i = 0; i < wcs->nelts; i++)
{
const svn_sort__item_t *sort_item
- = &APR_ARRAY_IDX(sorted_queue, i, svn_sort__item_t);
- const committed_queue_item_t *cqi = sort_item->value;
- const char *wcroot_abspath;
+ = &APR_ARRAY_IDX(wcs, i, svn_sort__item_t);
+ svn_wc__db_commit_queue_t *db_queue = sort_item->value;
svn_pool_clear(iterpool);
- /* Skip this item if it is a child of a recursive item, because it has
- been (or will be) accounted for when that recursive item was (or
- will be) processed. */
- if (queue->have_recursive && have_recursive_parent(queue->queue, cqi,
- iterpool))
- continue;
-
- SVN_ERR(svn_wc__process_committed_internal(
- wc_ctx->db, cqi->local_abspath,
- cqi->recurse,
- TRUE /* top_of_recurse */,
- new_revnum, new_date, rev_author,
- cqi->new_dav_cache,
- cqi->no_unlock,
- cqi->keep_changelist,
- cqi->sha1_checksum, queue,
- iterpool));
-
- /* Don't run the wq now, but remember that we must call it for this
- working copy */
- SVN_ERR(svn_wc__db_get_wcroot(&wcroot_abspath,
- wc_ctx->db, cqi->local_abspath,
- iterpool, iterpool));
-
- if (! svn_hash_gets(run_wqs, wcroot_abspath))
- {
- wcroot_abspath = apr_pstrdup(scratch_pool, wcroot_abspath);
- svn_hash_sets(run_wqs, wcroot_abspath, wcroot_abspath);
- }
+ SVN_ERR(svn_wc__db_process_commit_queue(wc_ctx->db, db_queue,
+ new_revnum, new_date, rev_author,
+ iterpool));
}
/* Make sure nothing happens if this function is called again. */
- apr_hash_clear(queue->queue);
+ apr_hash_clear(queue->wc_queues);
/* Ok; everything is committed now. Now we can start calling callbacks */
-
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- for (hi = apr_hash_first(scratch_pool, run_wqs);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < wcs->nelts; i++)
{
- const char *wcroot_abspath = svn__apr_hash_index_key(hi);
+ const svn_sort__item_t *sort_item
+ = &APR_ARRAY_IDX(wcs, i, svn_sort__item_t);
+ const char *wcroot_abspath = sort_item->key;
svn_pool_clear(iterpool);
@@ -631,10 +342,12 @@ check_can_add_to_parent(const char **repos_root_url,
db, parent_abspath,
result_pool, scratch_pool));
else
- SVN_ERR(svn_wc__db_scan_base_repos(NULL,
- repos_root_url, repos_uuid,
- db, parent_abspath,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL,
+ repos_root_url, repos_uuid, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ db, parent_abspath,
+ result_pool, scratch_pool));
}
return SVN_NO_ERROR;
@@ -887,11 +600,13 @@ svn_wc_add4(svn_wc_context_t *wc_ctx,
const char *repos_relpath, *inner_repos_root_url, *inner_repos_uuid;
const char *inner_url;
- SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath,
- &inner_repos_root_url,
- &inner_repos_uuid,
- db, local_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, &repos_relpath,
+ &inner_repos_root_url,
+ &inner_repos_uuid, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
if (strcmp(inner_repos_uuid, repos_uuid)
|| strcmp(repos_root_url, inner_repos_root_url))
@@ -993,9 +708,10 @@ svn_wc_add4(svn_wc_context_t *wc_ctx,
svn_error_t *
-svn_wc_add_from_disk2(svn_wc_context_t *wc_ctx,
+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)
@@ -1014,7 +730,7 @@ svn_wc_add_from_disk2(svn_wc_context_t *wc_ctx,
SVN_ERR(svn_wc__canonicalize_props(
&new_props,
- local_abspath, kind, props, FALSE /* skip_some_checks */,
+ local_abspath, kind, props, skip_checks,
scratch_pool, scratch_pool));
props = new_props;
}
@@ -1177,10 +893,9 @@ svn_wc_add_lock2(svn_wc_context_t *wc_ctx,
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- /* ### Enable after fixing callers */
- /*SVN_ERR(svn_wc__write_check(wc_ctx->db,
+ SVN_ERR(svn_wc__write_check(wc_ctx->db,
svn_dirent_dirname(local_abspath, scratch_pool),
- scratch_pool));*/
+ scratch_pool));
db_lock.token = lock->token;
db_lock.owner = lock->owner;
@@ -1227,16 +942,20 @@ svn_wc_remove_lock2(svn_wc_context_t *wc_ctx,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
- const svn_string_t *needs_lock;
+ svn_skel_t *work_item;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- /* ### Enable after fixing callers */
- /*SVN_ERR(svn_wc__write_check(wc_ctx->db,
+ SVN_ERR(svn_wc__write_check(wc_ctx->db,
svn_dirent_dirname(local_abspath, scratch_pool),
- scratch_pool));*/
+ scratch_pool));
- err = svn_wc__db_lock_remove(wc_ctx->db, local_abspath, scratch_pool);
+ SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ err = svn_wc__db_lock_remove(wc_ctx->db, local_abspath, work_item,
+ scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
@@ -1250,24 +969,9 @@ svn_wc_remove_lock2(svn_wc_context_t *wc_ctx,
scratch_pool));
}
- /* if svn:needs-lock is present, then make the file read-only. */
- err = svn_wc__internal_propget(&needs_lock, wc_ctx->db, local_abspath,
- SVN_PROP_NEEDS_LOCK, scratch_pool,
- scratch_pool);
- if (err)
- {
- if (err->apr_err != SVN_ERR_WC_PATH_UNEXPECTED_STATUS)
- return svn_error_trace(err);
-
- svn_error_clear(err);
- return SVN_NO_ERROR; /* Node is shadowed and/or deleted,
- so we shouldn't apply its lock */
- }
-
- if (needs_lock)
- SVN_ERR(svn_io_set_file_read_only(local_abspath, FALSE, scratch_pool));
-
- return SVN_NO_ERROR;
+ return svn_error_trace(svn_wc__wq_run(wc_ctx->db, local_abspath,
+ NULL, NULL /* cancel*/,
+ scratch_pool));
}
@@ -1321,9 +1025,8 @@ get_node_changelist(const char *local_abspath,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
b->db, local_abspath,
scratch_pool, scratch_pool));
-
- if (svn_wc__internal_changelist_match(b->db, local_abspath, b->clhash,
- scratch_pool))
+ if (!b->clhash
+ || (changelist && svn_hash_gets(b->clhash, changelist) != NULL))
SVN_ERR(b->callback_func(b->callback_baton, local_abspath,
changelist, scratch_pool));
diff --git a/subversion/libsvn_wc/cleanup.c b/subversion/libsvn_wc/cleanup.c
index afe7371..491ca93 100644
--- a/subversion/libsvn_wc/cleanup.c
+++ b/subversion/libsvn_wc/cleanup.c
@@ -81,6 +81,9 @@ status_dummy_callback(void *baton,
static svn_error_t *
cleanup_internal(svn_wc__db_t *db,
const char *dir_abspath,
+ svn_boolean_t break_locks,
+ svn_boolean_t fix_recorded_timestamps,
+ svn_boolean_t vacuum_pristines,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
@@ -98,7 +101,7 @@ cleanup_internal(svn_wc__db_t *db,
scratch_pool, scratch_pool));
if (lock_abspath)
dir_abspath = lock_abspath;
- SVN_ERR(svn_wc__db_wclock_obtain(db, dir_abspath, -1, TRUE, scratch_pool));
+ SVN_ERR(svn_wc__db_wclock_obtain(db, dir_abspath, -1, break_locks, scratch_pool));
/* Run our changes before the subdirectories. We may not have to recurse
if we blow away a subdir. */
@@ -117,7 +120,7 @@ cleanup_internal(svn_wc__db_t *db,
svn_wc__check_wcroot() as that function, will just return true
once we start sharing databases with externals.
*/
- if (is_wcroot)
+ if (is_wcroot && vacuum_pristines)
{
/* Cleanup the tmp area of the admin subdir, if running the log has not
removed it! The logs have been run, so anything left here has no hope
@@ -128,17 +131,20 @@ cleanup_internal(svn_wc__db_t *db,
SVN_ERR(svn_wc__db_pristine_cleanup(db, dir_abspath, scratch_pool));
}
- /* Instead of implementing a separate repair step here, use the standard
- status walker's optimized implementation, which performs repairs when
- there is a lock. */
- SVN_ERR(svn_wc__internal_walk_status(db, dir_abspath, svn_depth_infinity,
- FALSE /* get_all */,
- FALSE /* no_ignore */,
- FALSE /* ignore_text_mods */,
- NULL /* ignore patterns */,
- status_dummy_callback, NULL,
- cancel_func, cancel_baton,
- scratch_pool));
+ if (fix_recorded_timestamps)
+ {
+ /* Instead of implementing a separate repair step here, use the standard
+ status walker's optimized implementation, which performs repairs when
+ there is a lock. */
+ SVN_ERR(svn_wc__internal_walk_status(db, dir_abspath, svn_depth_infinity,
+ FALSE /* get_all */,
+ FALSE /* no_ignore */,
+ FALSE /* ignore_text_mods */,
+ NULL /* ignore patterns */,
+ status_dummy_callback, NULL,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ }
/* All done, toss the lock */
SVN_ERR(svn_wc__db_wclock_release(db, dir_abspath, scratch_pool));
@@ -146,39 +152,59 @@ cleanup_internal(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
-
-/* ### possibly eliminate the WC_CTX parameter? callers really shouldn't
- ### be doing anything *but* running a cleanup, and we need a special
- ### DB anyway. ... *shrug* ... consider later. */
svn_error_t *
-svn_wc_cleanup3(svn_wc_context_t *wc_ctx,
+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)
{
svn_wc__db_t *db;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+ SVN_ERR_ASSERT(wc_ctx != NULL);
- /* We need a DB that allows a non-empty work queue (though it *will*
- auto-upgrade). We'll handle everything manually. */
- SVN_ERR(svn_wc__db_open(&db,
- NULL /* ### config */, FALSE, FALSE,
- scratch_pool, scratch_pool));
+ if (break_locks)
+ {
+ /* We'll handle everything manually. */
- SVN_ERR(cleanup_internal(db, local_abspath, cancel_func, cancel_baton,
+ /* Close the existing database (if any) to avoid problems with
+ exclusive database usage */
+ SVN_ERR(svn_wc__db_drop_root(wc_ctx->db, local_abspath,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__db_open(&db,
+ NULL /* ### config */, FALSE, FALSE,
+ scratch_pool, scratch_pool));
+ }
+ else
+ db = wc_ctx->db;
+
+ SVN_ERR(cleanup_internal(db, local_abspath,
+ break_locks,
+ fix_recorded_timestamps,
+ vacuum_pristines,
+ cancel_func, cancel_baton,
scratch_pool));
/* The DAV cache suffers from flakiness from time to time, and the
pre-1.7 prescribed workarounds aren't as user-friendly in WC-NG. */
- SVN_ERR(svn_wc__db_base_clear_dav_cache_recursive(db, local_abspath,
- scratch_pool));
+ if (clear_dav_cache)
+ SVN_ERR(svn_wc__db_base_clear_dav_cache_recursive(db, local_abspath,
+ scratch_pool));
- SVN_ERR(svn_wc__db_vacuum(db, local_abspath, scratch_pool));
+ if (vacuum_pristines)
+ SVN_ERR(svn_wc__db_vacuum(db, local_abspath, scratch_pool));
/* We're done with this DB, so proactively close it. */
- SVN_ERR(svn_wc__db_close(db));
+ if (break_locks)
+ SVN_ERR(svn_wc__db_close(db));
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_wc/conflicts.c b/subversion/libsvn_wc/conflicts.c
index f2d6f3e..f04c6de 100644
--- a/subversion/libsvn_wc/conflicts.c
+++ b/subversion/libsvn_wc/conflicts.c
@@ -477,8 +477,7 @@ svn_wc__conflict_skel_add_prop_conflict(svn_skel_t *conflict_skel,
hi;
hi = apr_hash_next(hi))
{
- svn_skel__prepend_str(apr_pstrdup(result_pool,
- svn__apr_hash_index_key(hi)),
+ svn_skel__prepend_str(apr_pstrdup(result_pool, apr_hash_this_key(hi)),
conflict_names,
result_pool);
}
@@ -509,7 +508,7 @@ svn_wc__conflict_skel_add_prop_conflict(svn_skel_t *conflict_skel,
}
/* A map for svn_wc_conflict_reason_t values. */
-static const svn_token_map_t local_change_map[] =
+static const svn_token_map_t reason_map[] =
{
{ "edited", svn_wc_conflict_reason_edited },
{ "obstructed", svn_wc_conflict_reason_obstructed },
@@ -523,7 +522,7 @@ static const svn_token_map_t local_change_map[] =
{ NULL }
};
-static const svn_token_map_t incoming_change_map[] =
+static const svn_token_map_t action_map[] =
{
{ "edited", svn_wc_conflict_action_edit },
{ "added", svn_wc_conflict_action_add },
@@ -536,8 +535,8 @@ svn_error_t *
svn_wc__conflict_skel_add_tree_conflict(svn_skel_t *conflict_skel,
svn_wc__db_t *db,
const char *wri_abspath,
- svn_wc_conflict_reason_t local_change,
- svn_wc_conflict_action_t incoming_change,
+ svn_wc_conflict_reason_t reason,
+ svn_wc_conflict_action_t action,
const char *move_src_op_root_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
@@ -550,12 +549,12 @@ svn_wc__conflict_skel_add_tree_conflict(svn_skel_t *conflict_skel,
SVN_ERR_ASSERT(!tree_conflict); /* ### Use proper error? */
- SVN_ERR_ASSERT(local_change == svn_wc_conflict_reason_moved_away
+ SVN_ERR_ASSERT(reason == svn_wc_conflict_reason_moved_away
|| !move_src_op_root_abspath); /* ### Use proper error? */
tree_conflict = svn_skel__make_empty_list(result_pool);
- if (local_change == svn_wc_conflict_reason_moved_away
+ if (reason == svn_wc_conflict_reason_moved_away
&& move_src_op_root_abspath)
{
const char *move_src_op_root_relpath;
@@ -569,13 +568,11 @@ svn_wc__conflict_skel_add_tree_conflict(svn_skel_t *conflict_skel,
result_pool);
}
- svn_skel__prepend_str(
- svn_token__to_word(incoming_change_map, incoming_change),
- tree_conflict, result_pool);
+ svn_skel__prepend_str(svn_token__to_word(action_map, action),
+ tree_conflict, result_pool);
- svn_skel__prepend_str(
- svn_token__to_word(local_change_map, local_change),
- tree_conflict, result_pool);
+ svn_skel__prepend_str(svn_token__to_word(reason_map, reason),
+ tree_conflict, result_pool);
/* Tree conflicts have no marker files */
markers = svn_skel__make_empty_list(result_pool);
@@ -931,8 +928,8 @@ svn_wc__conflict_read_prop_conflict(const char **marker_abspath,
}
svn_error_t *
-svn_wc__conflict_read_tree_conflict(svn_wc_conflict_reason_t *local_change,
- svn_wc_conflict_action_t *incoming_change,
+svn_wc__conflict_read_tree_conflict(svn_wc_conflict_reason_t *reason,
+ svn_wc_conflict_action_t *action,
const char **move_src_op_root_abspath,
svn_wc__db_t *db,
const char *wri_abspath,
@@ -957,28 +954,28 @@ svn_wc__conflict_read_tree_conflict(svn_wc_conflict_reason_t *local_change,
c = c->next; /* Skip markers */
{
- int value = svn_token__from_mem(local_change_map, c->data, c->len);
+ int value = svn_token__from_mem(reason_map, c->data, c->len);
- if (local_change)
+ if (reason)
{
if (value != SVN_TOKEN_UNKNOWN)
- *local_change = value;
+ *reason = value;
else
- *local_change = svn_wc_conflict_reason_edited;
+ *reason = svn_wc_conflict_reason_edited;
}
is_moved_away = (value == svn_wc_conflict_reason_moved_away);
}
c = c->next;
- if (incoming_change)
+ if (action)
{
- int value = svn_token__from_mem(incoming_change_map, c->data, c->len);
+ int value = svn_token__from_mem(action_map, c->data, c->len);
if (value != SVN_TOKEN_UNKNOWN)
- *incoming_change = value;
+ *action = value;
else
- *incoming_change = svn_wc_conflict_action_edit;
+ *action = svn_wc_conflict_action_edit;
}
c = c->next;
@@ -1050,68 +1047,7 @@ svn_wc__conflict_read_markers(const apr_array_header_t **markers,
/* --------------------------------------------------------------------
*/
-/* Helper for svn_wc__conflict_create_markers */
-static svn_skel_t *
-prop_conflict_skel_new(apr_pool_t *result_pool)
-{
- svn_skel_t *operation = svn_skel__make_empty_list(result_pool);
- svn_skel_t *result = svn_skel__make_empty_list(result_pool);
-
- svn_skel__prepend(operation, result);
- return result;
-}
-
-
-/* Helper for prop_conflict_skel_add */
-static void
-prepend_prop_value(const svn_string_t *value,
- svn_skel_t *skel,
- apr_pool_t *result_pool)
-{
- svn_skel_t *value_skel = svn_skel__make_empty_list(result_pool);
-
- if (value != NULL)
- {
- const void *dup = apr_pmemdup(result_pool, value->data, value->len);
-
- svn_skel__prepend(svn_skel__mem_atom(dup, value->len, result_pool),
- value_skel);
- }
-
- svn_skel__prepend(value_skel, skel);
-}
-
-
-/* Helper for svn_wc__conflict_create_markers */
-static svn_error_t *
-prop_conflict_skel_add(
- svn_skel_t *skel,
- const char *prop_name,
- const svn_string_t *original_value,
- const svn_string_t *mine_value,
- const svn_string_t *incoming_value,
- const svn_string_t *incoming_base_value,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_skel_t *prop_skel = svn_skel__make_empty_list(result_pool);
-
- /* ### check that OPERATION has been filled in. */
-
- /* See notes/wc-ng/conflict-storage */
- prepend_prop_value(incoming_base_value, prop_skel, result_pool);
- prepend_prop_value(incoming_value, prop_skel, result_pool);
- prepend_prop_value(mine_value, prop_skel, result_pool);
- prepend_prop_value(original_value, prop_skel, result_pool);
- svn_skel__prepend_str(apr_pstrdup(result_pool, prop_name), prop_skel,
- result_pool);
- svn_skel__prepend_str(SVN_WC__CONFLICT_KIND_PROP, prop_skel, result_pool);
- /* Now we append PROP_SKEL to the end of the provided conflict SKEL. */
- svn_skel__append(skel, prop_skel);
-
- return SVN_NO_ERROR;
-}
svn_error_t *
svn_wc__conflict_create_markers(svn_skel_t **work_items,
@@ -1141,10 +1077,8 @@ svn_wc__conflict_create_markers(svn_skel_t **work_items,
/* Ok, currently we have to do a few things for property conflicts:
- Create a marker file
- - Create a WQ item that sets the marker name
- - Create a WQ item that fills the marker with the expected data
-
- This can be simplified once we really store conflict_skel in wc.db */
+ - Store the name in the conflict_skel
+ - Create a WQ item that fills the marker with the expected data */
SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
@@ -1176,65 +1110,9 @@ svn_wc__conflict_create_markers(svn_skel_t **work_items,
svn_skel__prepend_str(marker_relpath, prop_conflict->children->next,
result_pool);
}
-
- /* Store the data in the WQ item in the same format used as 1.7.
- Once we store the data in DB it is easier to just read it back
- from the workqueue */
- {
- svn_skel_t *prop_data;
- apr_hash_index_t *hi;
- apr_hash_t *old_props;
- apr_hash_t *mine_props;
- apr_hash_t *their_original_props;
- apr_hash_t *their_props;
- apr_hash_t *conflicted_props;
-
- SVN_ERR(svn_wc__conflict_read_prop_conflict(NULL,
- &mine_props,
- &their_original_props,
- &their_props,
- &conflicted_props,
- db, local_abspath,
- conflict_skel,
- scratch_pool,
- scratch_pool));
-
- if (operation == svn_wc_operation_merge)
- SVN_ERR(svn_wc__db_read_pristine_props(&old_props, db, local_abspath,
- scratch_pool, scratch_pool));
- else
- old_props = their_original_props;
-
- prop_data = prop_conflict_skel_new(result_pool);
-
- for (hi = apr_hash_first(scratch_pool, conflicted_props);
- hi;
- hi = apr_hash_next(hi))
- {
- const char *propname = svn__apr_hash_index_key(hi);
-
- SVN_ERR(prop_conflict_skel_add(
- prop_data, propname,
- old_props
- ? svn_hash_gets(old_props, propname)
- : NULL,
- mine_props
- ? svn_hash_gets(mine_props, propname)
- : NULL,
- their_props
- ? svn_hash_gets(their_props, propname)
- : NULL,
- their_original_props
- ? svn_hash_gets(their_original_props, propname)
- : NULL,
- result_pool, scratch_pool));
- }
-
- SVN_ERR(svn_wc__wq_build_prej_install(work_items,
- db, local_abspath,
- prop_data,
- scratch_pool, scratch_pool));
- }
+ SVN_ERR(svn_wc__wq_build_prej_install(work_items,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
}
return SVN_NO_ERROR;
@@ -1264,6 +1142,7 @@ static svn_error_t *
generate_propconflict(svn_boolean_t *conflict_remains,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_node_kind_t kind,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
const svn_wc_conflict_version_t *right_version,
@@ -1274,29 +1153,18 @@ generate_propconflict(svn_boolean_t *conflict_remains,
const svn_string_t *incoming_new_val,
svn_wc_conflict_resolver_func2_t conflict_func,
void *conflict_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc_conflict_result_t *result = NULL;
svn_wc_conflict_description2_t *cdesc;
const char *dirpath = svn_dirent_dirname(local_abspath, scratch_pool);
- svn_node_kind_t kind;
const svn_string_t *new_value = NULL;
- SVN_ERR(svn_wc__db_read_kind(&kind, db, local_abspath,
- FALSE /* allow_missing */,
- FALSE /* show_deleted */,
- FALSE /* show_hidden */,
- scratch_pool));
-
- if (kind == svn_node_none)
- return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
- _("The node '%s' was not found."),
- svn_dirent_local_style(local_abspath,
- scratch_pool));
-
cdesc = svn_wc_conflict_description_create_prop2(
local_abspath,
- (kind == svn_node_dir) ? svn_node_dir : svn_node_file,
+ kind,
propname, scratch_pool);
cdesc->operation = operation;
@@ -1313,6 +1181,7 @@ generate_propconflict(svn_boolean_t *conflict_remains,
svn_io_file_del_on_pool_cleanup,
scratch_pool));
cdesc->my_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
+ cdesc->prop_value_working = working_val;
}
if (incoming_new_val)
@@ -1323,7 +1192,11 @@ generate_propconflict(svn_boolean_t *conflict_remains,
incoming_new_val->len,
svn_io_file_del_on_pool_cleanup,
scratch_pool));
- cdesc->their_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
+
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ cdesc->merged_file = svn_dirent_join(dirpath, file_name, scratch_pool);
+ cdesc->prop_value_incoming_new = incoming_new_val;
}
if (!base_val && !incoming_old_val)
@@ -1332,7 +1205,6 @@ generate_propconflict(svn_boolean_t *conflict_remains,
base_file stay NULL as-is. Both agents are attempting to add a
new property. */
}
-
else if ((base_val && !incoming_old_val)
|| (!base_val && incoming_old_val))
{
@@ -1354,7 +1226,6 @@ generate_propconflict(svn_boolean_t *conflict_remains,
scratch_pool));
cdesc->base_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
}
-
else /* base and old are both non-NULL */
{
const svn_string_t *conflict_base_val;
@@ -1391,6 +1262,9 @@ generate_propconflict(svn_boolean_t *conflict_remains,
svn_io_file_del_on_pool_cleanup, scratch_pool));
cdesc->base_abspath = svn_dirent_join(dirpath, file_name, scratch_pool);
+ cdesc->prop_value_base = base_val;
+ cdesc->prop_value_incoming_old = incoming_old_val;
+
if (working_val && incoming_new_val)
{
svn_stream_t *mergestream;
@@ -1398,17 +1272,22 @@ generate_propconflict(svn_boolean_t *conflict_remains,
svn_diff_file_options_t *options =
svn_diff_file_options_create(scratch_pool);
- SVN_ERR(svn_stream_open_unique(&mergestream, &cdesc->merged_file,
+ SVN_ERR(svn_stream_open_unique(&mergestream, &cdesc->prop_reject_abspath,
NULL, svn_io_file_del_on_pool_cleanup,
scratch_pool, scratch_pool));
SVN_ERR(svn_diff_mem_string_diff3(&diff, conflict_base_val,
working_val,
incoming_new_val, options, scratch_pool));
- SVN_ERR(svn_diff_mem_string_output_merge2
- (mergestream, diff, conflict_base_val, working_val,
+ SVN_ERR(svn_diff_mem_string_output_merge3(mergestream, diff,
+ conflict_base_val, working_val,
incoming_new_val, NULL, NULL, NULL, NULL,
- svn_diff_conflict_display_modified_latest, scratch_pool));
+ svn_diff_conflict_display_modified_latest,
+ cancel_func, cancel_baton, scratch_pool));
SVN_ERR(svn_stream_close(mergestream));
+
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ cdesc->their_abspath = cdesc->prop_reject_abspath;
}
}
@@ -1427,10 +1306,8 @@ generate_propconflict(svn_boolean_t *conflict_remains,
cdesc->reason = svn_wc_conflict_reason_edited;
/* Invoke the interactive conflict callback. */
- {
- SVN_ERR(conflict_func(&result, cdesc, conflict_baton, scratch_pool,
- scratch_pool));
- }
+ SVN_ERR(conflict_func(&result, cdesc, conflict_baton, scratch_pool,
+ scratch_pool));
if (result == NULL)
{
*conflict_remains = TRUE;
@@ -1476,18 +1353,24 @@ generate_propconflict(svn_boolean_t *conflict_remains,
{
svn_stringbuf_t *merged_stringbuf;
- if (!cdesc->merged_file && !result->merged_file)
+ if (!cdesc->merged_file
+ && (!result->merged_file && !result->merged_value))
return svn_error_create
(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL, _("Conflict callback violated API:"
" returned no merged file"));
- SVN_ERR(svn_stringbuf_from_file2(&merged_stringbuf,
- result->merged_file ?
- result->merged_file :
- cdesc->merged_file,
- scratch_pool));
- new_value = svn_stringbuf__morph_into_string(merged_stringbuf);
+ if (result->merged_value)
+ new_value = result->merged_value;
+ else
+ {
+ SVN_ERR(svn_stringbuf_from_file2(&merged_stringbuf,
+ result->merged_file ?
+ result->merged_file :
+ cdesc->merged_file,
+ scratch_pool));
+ new_value = svn_stringbuf__morph_into_string(merged_stringbuf);
+ }
*conflict_remains = FALSE;
break;
}
@@ -1513,166 +1396,113 @@ generate_propconflict(svn_boolean_t *conflict_remains,
return SVN_NO_ERROR;
}
-/* Resolve the text conflict on DB/LOCAL_ABSPATH in the manner specified
- * by CHOICE.
+/* Perform a 3-way merge in which conflicts are expected, showing the
+ * conflicts in the way specified by STYLE, and using MERGE_OPTIONS.
*
- * Set *WORK_ITEMS to new work items that will make the on-disk changes
- * needed to complete the resolution (but not to mark it as resolved).
- * Set *IS_RESOLVED to true if the conflicts are resolved; otherwise
- * (which is only if CHOICE is 'postpone') to false.
+ * The three input files are LEFT_ABSPATH (the base), DETRANSLATED_TARGET
+ * and RIGHT_ABSPATH. The output is stored in a new temporary file,
+ * whose name is put into *CHOSEN_ABSPATH.
+ *
+ * The output file will be deleted according to DELETE_WHEN. If
+ * DELETE_WHEN is 'on pool cleanup', it refers to RESULT_POOL.
+ *
+ * DB and WRI_ABSPATH are used to choose a directory for the output file.
+ *
+ * Allocate *CHOSEN_ABSPATH in RESULT_POOL. Use SCRATCH_POOL for temporary
+ * allocations.
+ */
+static svn_error_t *
+merge_showing_conflicts(const char **chosen_abspath,
+ svn_wc__db_t *db,
+ const char *wri_abspath,
+ svn_diff_conflict_display_style_t style,
+ const apr_array_header_t *merge_options,
+ const char *left_abspath,
+ const char *detranslated_target,
+ const char *right_abspath,
+ svn_io_file_del_t delete_when,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *temp_dir;
+ svn_stream_t *chosen_stream;
+ svn_diff_t *diff;
+ svn_diff_file_options_t *diff3_options;
+
+ diff3_options = svn_diff_file_options_create(scratch_pool);
+ if (merge_options)
+ SVN_ERR(svn_diff_file_options_parse(diff3_options,
+ merge_options,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, db,
+ wri_abspath,
+ scratch_pool, scratch_pool));
+ /* We need to open the stream in RESULT_POOL because that controls the
+ * lifetime of the file if DELETE_WHEN is 'on pool cleanup'. (We also
+ * want to allocate CHOSEN_ABSPATH in RESULT_POOL, but we don't care
+ * about the stream itself.) */
+ SVN_ERR(svn_stream_open_unique(&chosen_stream, chosen_abspath,
+ temp_dir, delete_when,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_diff_file_diff3_2(&diff,
+ left_abspath,
+ detranslated_target, right_abspath,
+ diff3_options, scratch_pool));
+ SVN_ERR(svn_diff_file_output_merge3(chosen_stream, diff,
+ left_abspath,
+ detranslated_target,
+ right_abspath,
+ NULL, NULL, NULL, NULL, /* markers */
+ style, cancel_func, cancel_baton,
+ scratch_pool));
+ SVN_ERR(svn_stream_close(chosen_stream));
+
+ return SVN_NO_ERROR;
+}
+
+/* Prepare to delete an artifact file at ARTIFACT_FILE_ABSPATH in the
+ * working copy at DB/WRI_ABSPATH.
*
- * LEFT_ABSPATH, RIGHT_ABSPATH, and DETRANSLATED_TARGET are the
- * input files to the 3-way merge that will be performed if CHOICE is
- * 'theirs-conflict' or 'mine-conflict'. LEFT_ABSPATH is also the file
- * that will be used if CHOICE is 'base', and RIGHT_ABSPATH if CHOICE is
- * 'theirs-full'. MERGED_ABSPATH will be used if CHOICE is 'merged'.
+ * Set *WORK_ITEMS to a new work item that, when run, will delete the
+ * artifact file; or to NULL if there is no file to delete.
*
- * DETRANSLATED_TARGET is the detranslated version of 'mine' (see
- * detranslate_wc_file() above). MERGE_OPTIONS are passed to the
- * diff3 implementation in case a 3-way merge has to be carried out.
+ * Set *FILE_FOUND to TRUE if the artifact file is found on disk and its
+ * node kind is 'file'; otherwise do not change *FILE_FOUND. FILE_FOUND
+ * may be NULL if not required.
*/
static svn_error_t *
-eval_text_conflict_func_result(svn_skel_t **work_items,
- svn_boolean_t *is_resolved,
+remove_artifact_file_if_exists(svn_skel_t **work_items,
+ svn_boolean_t *file_found,
svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_conflict_choice_t choice,
- const apr_array_header_t *merge_options,
- const char *left_abspath,
- const char *right_abspath,
- const char *merged_abspath,
- const char *detranslated_target,
+ const char *wri_abspath,
+ const char *artifact_file_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- const char *install_from_abspath = NULL;
- svn_boolean_t remove_source = FALSE;
-
*work_items = NULL;
-
- switch (choice)
+ if (artifact_file_abspath)
{
- /* If the callback wants to use one of the fulltexts
- to resolve the conflict, so be it.*/
- case svn_wc_conflict_choose_base:
- {
- install_from_abspath = left_abspath;
- *is_resolved = TRUE;
- break;
- }
- case svn_wc_conflict_choose_theirs_full:
- {
- install_from_abspath = right_abspath;
- *is_resolved = TRUE;
- break;
- }
- case svn_wc_conflict_choose_mine_full:
- {
- install_from_abspath = detranslated_target;
- *is_resolved = TRUE;
- break;
- }
- case svn_wc_conflict_choose_theirs_conflict:
- case svn_wc_conflict_choose_mine_conflict:
- {
- const char *chosen_abspath;
- const char *temp_dir;
- svn_stream_t *chosen_stream;
- svn_diff_t *diff;
- svn_diff_conflict_display_style_t style;
- svn_diff_file_options_t *diff3_options;
-
- diff3_options = svn_diff_file_options_create(scratch_pool);
-
- if (merge_options)
- SVN_ERR(svn_diff_file_options_parse(diff3_options,
- merge_options,
- scratch_pool));
-
- style = choice == svn_wc_conflict_choose_theirs_conflict
- ? svn_diff_conflict_display_latest
- : svn_diff_conflict_display_modified;
-
- SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, db,
- local_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_stream_open_unique(&chosen_stream, &chosen_abspath,
- temp_dir, svn_io_file_del_none,
- scratch_pool, scratch_pool));
-
- SVN_ERR(svn_diff_file_diff3_2(&diff,
- left_abspath,
- detranslated_target, right_abspath,
- diff3_options, scratch_pool));
- SVN_ERR(svn_diff_file_output_merge2(chosen_stream, diff,
- left_abspath,
- detranslated_target,
- right_abspath,
- /* markers ignored */
- NULL, NULL,
- NULL, NULL,
- style,
- scratch_pool));
- SVN_ERR(svn_stream_close(chosen_stream));
-
- install_from_abspath = chosen_abspath;
- remove_source = TRUE;
- *is_resolved = TRUE;
- break;
- }
+ svn_node_kind_t node_kind;
- /* For the case of 3-way file merging, we don't
- really distinguish between these return values;
- if the callback claims to have "generally
- resolved" the situation, we still interpret
- that as "OK, we'll assume the merged version is
- good to use". */
- case svn_wc_conflict_choose_merged:
- {
- install_from_abspath = merged_abspath;
- *is_resolved = TRUE;
- break;
- }
- case svn_wc_conflict_choose_postpone:
- default:
+ SVN_ERR(svn_io_check_path(artifact_file_abspath, &node_kind,
+ scratch_pool));
+ if (node_kind == svn_node_file)
{
- /* Assume conflict remains. */
- *is_resolved = FALSE;
- return SVN_NO_ERROR;
+ SVN_ERR(svn_wc__wq_build_file_remove(work_items,
+ db, wri_abspath,
+ artifact_file_abspath,
+ result_pool, scratch_pool));
+ if (file_found)
+ *file_found = TRUE;
}
}
- SVN_ERR_ASSERT(install_from_abspath != NULL);
-
- {
- svn_skel_t *work_item;
-
- SVN_ERR(svn_wc__wq_build_file_install(&work_item,
- db, local_abspath,
- install_from_abspath,
- FALSE /* use_commit_times */,
- FALSE /* record_fileinfo */,
- result_pool, scratch_pool));
- *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
-
- SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, db, local_abspath,
- result_pool, scratch_pool));
- *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
-
- if (remove_source)
- {
- SVN_ERR(svn_wc__wq_build_file_remove(&work_item,
- db, local_abspath,
- install_from_abspath,
- result_pool, scratch_pool));
- *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
- }
- }
-
return SVN_NO_ERROR;
}
-
/* Create a new file in the same directory as LOCAL_ABSPATH, with the
same basename as LOCAL_ABSPATH, with a ".edited" extension, and set
*WORK_ITEM to a new work item that will copy and translate from the file
@@ -1715,152 +1545,310 @@ save_merge_result(svn_skel_t **work_item,
}
-/* Call the conflict resolver callback for a text conflict, and resolve
- * the conflict if it tells us to do so.
- *
- * Assume that there is a text conflict on the path DB/LOCAL_ABSPATH.
+
+/* Resolve the text conflict in CONFLICT, which is currently recorded
+ * on DB/LOCAL_ABSPATH in the manner specified by CHOICE.
*
- * Call CONFLICT_FUNC with CONFLICT_BATON to find out whether and how
- * it wants to resolve the conflict. Pass it a conflict description
- * containing OPERATION, LEFT/RIGHT_ABSPATH, LEFT/RIGHT_VERSION,
- * RESULT_TARGET and DETRANSLATED_TARGET.
+ * Set *WORK_ITEMS to new work items that will make the on-disk changes
+ * needed to complete the resolution (but not to mark it as resolved).
*
- * If the callback returns a resolution other than 'postpone', then
- * perform that requested resolution and prepare to mark the conflict
- * as resolved.
+ * Set *FOUND_ARTIFACT to true if conflict markers are removed; otherwise
+ * (which is only if CHOICE is 'postpone') to false.
*
- * Return *WORK_ITEMS that will do the on-disk work required to complete
- * the resolution (but not to mark the conflict as resolved), and set
- * *WAS_RESOLVED to true, if it was resolved. Set *WORK_ITEMS to NULL
- * and *WAS_RESOLVED to FALSE otherwise.
+ * CHOICE, MERGED_FILE and SAVE_MERGED are typically values provided by
+ * the conflict resolver.
*
- * RESULT_TARGET is the path to the merged file produced by the internal
- * or external 3-way merge, which may contain conflict markers, in
- * repository normal form. DETRANSLATED_TARGET is the 'mine' version of
- * the file, also in RNF.
+ * MERGE_OPTIONS allows customizing the diff handling when using
+ * per hunk conflict resolving.
*/
static svn_error_t *
-resolve_text_conflict(svn_skel_t **work_items,
- svn_boolean_t *was_resolved,
- svn_wc__db_t *db,
- const char *local_abspath,
- const apr_array_header_t *merge_options,
- svn_wc_operation_t operation,
- const char *left_abspath,
- const char *right_abspath,
- const svn_wc_conflict_version_t *left_version,
- const svn_wc_conflict_version_t *right_version,
- const char *result_target,
- const char *detranslated_target,
- svn_wc_conflict_resolver_func2_t conflict_func,
- void *conflict_baton,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+build_text_conflict_resolve_items(svn_skel_t **work_items,
+ svn_boolean_t *found_artifact,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ const svn_skel_t *conflict,
+ svn_wc_conflict_choice_t choice,
+ const char *merged_file,
+ svn_boolean_t save_merged,
+ const apr_array_header_t *merge_options,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- svn_wc_conflict_result_t *result;
+ const char *mine_abspath;
+ const char *their_old_abspath;
+ const char *their_abspath;
svn_skel_t *work_item;
- svn_wc_conflict_description2_t *cdesc;
- apr_hash_t *props;
+ const char *install_from_abspath = NULL;
+ svn_boolean_t remove_source = FALSE;
*work_items = NULL;
- *was_resolved = FALSE;
-
- /* Give the conflict resolution callback a chance to clean
- up the conflicts before we mark the file 'conflicted' */
-
- SVN_ERR(svn_wc__db_read_props(&props, db, local_abspath,
- scratch_pool, scratch_pool));
-
- cdesc = svn_wc_conflict_description_create_text2(local_abspath,
- scratch_pool);
- cdesc->is_binary = FALSE;
- cdesc->mime_type = svn_prop_get_value(props, SVN_PROP_MIME_TYPE);
- cdesc->base_abspath = left_abspath;
- cdesc->their_abspath = right_abspath;
- cdesc->my_abspath = detranslated_target;
- cdesc->merged_file = result_target;
- cdesc->operation = operation;
- cdesc->src_left_version = left_version;
- cdesc->src_right_version = right_version;
- SVN_ERR(conflict_func(&result, cdesc, conflict_baton, scratch_pool,
- scratch_pool));
- if (result == NULL)
- return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("Conflict callback violated API:"
- " returned no results"));
+ if (found_artifact)
+ *found_artifact = FALSE;
+
+ SVN_ERR(svn_wc__conflict_read_text_conflict(&mine_abspath,
+ &their_old_abspath,
+ &their_abspath,
+ db, local_abspath,
+ conflict,
+ scratch_pool, scratch_pool));
+
+ if (save_merged)
+ SVN_ERR(save_merge_result(work_items,
+ db, local_abspath,
+ merged_file
+ ? merged_file
+ : local_abspath,
+ result_pool, scratch_pool));
+
+ if (choice == svn_wc_conflict_choose_postpone)
+ return SVN_NO_ERROR;
- if (result->save_merged)
+ switch (choice)
{
- SVN_ERR(save_merge_result(work_items,
- db, local_abspath,
- /* Look for callback's own
- merged-file first: */
- result->merged_file
- ? result->merged_file
- : result_target,
- result_pool, scratch_pool));
+ /* If the callback wants to use one of the fulltexts
+ to resolve the conflict, so be it.*/
+ case svn_wc_conflict_choose_base:
+ {
+ install_from_abspath = their_old_abspath;
+ break;
+ }
+ case svn_wc_conflict_choose_theirs_full:
+ {
+ install_from_abspath = their_abspath;
+ break;
+ }
+ case svn_wc_conflict_choose_mine_full:
+ {
+ /* In case of selecting to resolve the conflict choosing the full
+ own file, allow the text conflict resolution to just take the
+ existing local file if no merged file was present (case: binary
+ file conflicts do not generate a locally merge file).
+ */
+ install_from_abspath = mine_abspath
+ ? mine_abspath
+ : local_abspath;
+ break;
+ }
+ case svn_wc_conflict_choose_theirs_conflict:
+ case svn_wc_conflict_choose_mine_conflict:
+ {
+ svn_diff_conflict_display_style_t style
+ = choice == svn_wc_conflict_choose_theirs_conflict
+ ? svn_diff_conflict_display_latest
+ : svn_diff_conflict_display_modified;
+
+ if (mine_abspath == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Conflict on '%s' cannot be resolved to "
+ "'theirs-conflict' or 'mine-conflict' "
+ "because a merged version of the file "
+ "cannot be created."),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+
+ SVN_ERR(merge_showing_conflicts(&install_from_abspath,
+ db, local_abspath,
+ style, merge_options,
+ their_old_abspath,
+ mine_abspath,
+ their_abspath,
+ /* ### why not same as other caller? */
+ svn_io_file_del_none,
+ cancel_func, cancel_baton,
+ scratch_pool, scratch_pool));
+ remove_source = TRUE;
+ break;
+ }
+
+ /* For the case of 3-way file merging, we don't
+ really distinguish between these return values;
+ if the callback claims to have "generally
+ resolved" the situation, we still interpret
+ that as "OK, we'll assume the merged version is
+ good to use". */
+ case svn_wc_conflict_choose_merged:
+ {
+ install_from_abspath = merged_file
+ ? merged_file
+ : local_abspath;
+ break;
+ }
+ case svn_wc_conflict_choose_postpone:
+ {
+ /* Assume conflict remains. */
+ return SVN_NO_ERROR;
+ }
+ default:
+ SVN_ERR_ASSERT(choice == svn_wc_conflict_choose_postpone);
}
- if (result->choice != svn_wc_conflict_choose_postpone)
+ if (install_from_abspath == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Conflict on '%s' could not be resolved "
+ "because the chosen version of the file "
+ "is not available."),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+
+ /* ### It would be nice if we could somehow pass RECORD_FILEINFO
+ as true in some easy cases. */
+ SVN_ERR(svn_wc__wq_build_file_install(&work_item,
+ db, local_abspath,
+ install_from_abspath,
+ FALSE /* use_commit_times */,
+ FALSE /* record_fileinfo */,
+ result_pool, scratch_pool));
+ *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
+
+ if (remove_source)
{
- SVN_ERR(eval_text_conflict_func_result(&work_item,
- was_resolved,
- db, local_abspath,
- result->choice,
- merge_options,
- left_abspath,
- right_abspath,
- /* ### Sure this is an abspath? */
- result->merged_file
- ? result->merged_file
- : result_target,
- detranslated_target,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__wq_build_file_remove(&work_item,
+ db, local_abspath,
+ install_from_abspath,
+ result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
}
- else
- *was_resolved = FALSE;
+
+ SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
+ db, local_abspath,
+ their_old_abspath,
+ result_pool, scratch_pool));
+ *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
+
+ SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
+ db, local_abspath,
+ their_abspath,
+ result_pool, scratch_pool));
+ *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
+
+ SVN_ERR(remove_artifact_file_if_exists(&work_item, found_artifact,
+ db, local_abspath,
+ mine_abspath,
+ result_pool, scratch_pool));
+ *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
return SVN_NO_ERROR;
}
+/* Set *DESC to a new description of the text conflict in
+ * CONFLICT_SKEL. If there is no text conflict in CONFLICT_SKEL, return
+ * an error.
+ *
+ * Use OPERATION and shallow copies of LEFT_VERSION and RIGHT_VERSION,
+ * rather than reading them from CONFLICT_SKEL. Use IS_BINARY and
+ * MIME_TYPE for the corresponding fields of *DESC.
+ *
+ * Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
+ * allocations. */
static svn_error_t *
-setup_tree_conflict_desc(svn_wc_conflict_description2_t **desc,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_operation_t operation,
- const svn_wc_conflict_version_t *left_version,
- const svn_wc_conflict_version_t *right_version,
- svn_wc_conflict_reason_t local_change,
- svn_wc_conflict_action_t incoming_change,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+read_text_conflict_desc(svn_wc_conflict_description2_t **desc,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ const svn_skel_t *conflict_skel,
+ const char *mime_type,
+ svn_wc_operation_t operation,
+ const svn_wc_conflict_version_t *left_version,
+ const svn_wc_conflict_version_t *right_version,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ *desc = svn_wc_conflict_description_create_text2(local_abspath, result_pool);
+ (*desc)->mime_type = mime_type;
+ (*desc)->is_binary = mime_type ? svn_mime_type_is_binary(mime_type) : FALSE;
+ (*desc)->operation = operation;
+ (*desc)->src_left_version = left_version;
+ (*desc)->src_right_version = right_version;
+
+ SVN_ERR(svn_wc__conflict_read_text_conflict(&(*desc)->my_abspath,
+ &(*desc)->base_abspath,
+ &(*desc)->their_abspath,
+ db, local_abspath,
+ conflict_skel,
+ result_pool, scratch_pool));
+ (*desc)->merged_file = apr_pstrdup(result_pool, local_abspath);
+
+ return SVN_NO_ERROR;
+}
+
+/* Set *CONFLICT_DESC to a new description of the tree conflict in
+ * CONFLICT_SKEL. If there is no tree conflict in CONFLICT_SKEL, return
+ * an error.
+ *
+ * Use OPERATION and shallow copies of LEFT_VERSION and RIGHT_VERSION,
+ * rather than reading them from CONFLICT_SKEL.
+ *
+ * Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
+ * allocations. */
+static svn_error_t *
+read_tree_conflict_desc(svn_wc_conflict_description2_t **desc,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_node_kind_t node_kind,
+ const svn_skel_t *conflict_skel,
+ svn_wc_operation_t operation,
+ const svn_wc_conflict_version_t *left_version,
+ const svn_wc_conflict_version_t *right_version,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- svn_node_kind_t tc_kind;
+ svn_node_kind_t local_kind;
+ svn_wc_conflict_reason_t reason;
+ svn_wc_conflict_action_t action;
- if (left_version)
- tc_kind = left_version->node_kind;
- else if (right_version)
- tc_kind = right_version->node_kind;
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(
+ &reason, &action, NULL,
+ db, local_abspath, conflict_skel, scratch_pool, scratch_pool));
+
+ if (reason == svn_wc_conflict_reason_missing)
+ local_kind = svn_node_none;
+ else if (reason == svn_wc_conflict_reason_unversioned ||
+ reason == svn_wc_conflict_reason_obstructed)
+ SVN_ERR(svn_io_check_path(local_abspath, &local_kind, scratch_pool));
+ else if (action == svn_wc_conflict_action_delete
+ && left_version
+ && (operation == svn_wc_operation_update
+ ||operation == svn_wc_operation_switch)
+ && (reason == svn_wc_conflict_reason_deleted
+ || reason == svn_wc_conflict_reason_moved_away))
+ {
+ /* We have nothing locally to take the kind from */
+ local_kind = left_version->node_kind;
+ }
else
- tc_kind = svn_node_file; /* Avoid assertion */
+ local_kind = node_kind;
- *desc = svn_wc_conflict_description_create_tree2(local_abspath, tc_kind,
+ *desc = svn_wc_conflict_description_create_tree2(local_abspath, local_kind,
operation,
left_version, right_version,
result_pool);
- (*desc)->reason = local_change;
- (*desc)->action = incoming_change;
+ (*desc)->reason = reason;
+ (*desc)->action = action;
return SVN_NO_ERROR;
}
+/* Forward definition */
+static svn_error_t *
+resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ const svn_skel_t *conflict,
+ svn_wc_conflict_choice_t conflict_choice,
+ apr_hash_t *resolve_later,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
svn_error_t *
svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
const char *local_abspath,
+ svn_node_kind_t kind,
const svn_skel_t *conflict_skel,
const apr_array_header_t *merge_options,
svn_wc_conflict_resolver_func2_t resolver_func,
@@ -1928,7 +1916,7 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
+ const char *propname = apr_hash_this_key(hi);
svn_boolean_t conflict_remains = TRUE;
svn_pool_clear(iterpool);
@@ -1937,7 +1925,7 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
SVN_ERR(cancel_func(cancel_baton));
SVN_ERR(generate_propconflict(&conflict_remains,
- db, local_abspath,
+ db, local_abspath, kind,
operation,
left_version,
right_version,
@@ -1955,6 +1943,7 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
? svn_hash_gets(their_props, propname)
: NULL,
resolver_func, resolver_baton,
+ cancel_func, cancel_baton,
iterpool));
if (conflict_remains)
@@ -1966,75 +1955,96 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
SVN_ERR(svn_wc__mark_resolved_prop_conflicts(db, local_abspath,
scratch_pool));
}
+ svn_pool_destroy(iterpool);
}
if (text_conflicted)
{
- const char *mine_abspath;
- const char *their_original_abspath;
- const char *their_abspath;
svn_skel_t *work_items;
svn_boolean_t was_resolved;
+ svn_wc_conflict_description2_t *desc;
+ apr_hash_t *props;
+ svn_wc_conflict_result_t *result;
- SVN_ERR(svn_wc__conflict_read_text_conflict(&mine_abspath,
- &their_original_abspath,
- &their_abspath,
- db, local_abspath,
- conflict_skel,
- scratch_pool, scratch_pool));
-
- SVN_ERR(resolve_text_conflict(&work_items, &was_resolved,
- db, local_abspath,
- merge_options,
- operation,
- their_original_abspath, their_abspath,
- left_version, right_version,
- local_abspath, mine_abspath,
- resolver_func, resolver_baton,
+ SVN_ERR(svn_wc__db_read_props(&props, db, local_abspath,
scratch_pool, scratch_pool));
- if (was_resolved)
+ SVN_ERR(read_text_conflict_desc(&desc,
+ db, local_abspath, conflict_skel,
+ svn_prop_get_value(props,
+ SVN_PROP_MIME_TYPE),
+ operation, left_version, right_version,
+ scratch_pool, scratch_pool));
+
+
+ work_items = NULL;
+ was_resolved = FALSE;
+
+ /* Give the conflict resolution callback a chance to clean
+ up the conflicts before we mark the file 'conflicted' */
+
+ SVN_ERR(resolver_func(&result, desc, resolver_baton, scratch_pool,
+ scratch_pool));
+ if (result == NULL)
+ return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Conflict callback violated API:"
+ " returned no results"));
+
+ SVN_ERR(build_text_conflict_resolve_items(&work_items, &was_resolved,
+ db, local_abspath,
+ conflict_skel, result->choice,
+ result->merged_file,
+ result->save_merged,
+ merge_options,
+ cancel_func, cancel_baton,
+ scratch_pool, scratch_pool));
+
+ if (result->choice != svn_wc_conflict_choose_postpone)
{
- if (work_items)
- {
- SVN_ERR(svn_wc__db_wq_add(db, local_abspath, work_items,
- scratch_pool));
- SVN_ERR(svn_wc__wq_run(db, local_abspath,
- cancel_func, cancel_baton,
- scratch_pool));
- }
- SVN_ERR(svn_wc__mark_resolved_text_conflict(db, local_abspath,
- scratch_pool));
+ SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
+ TRUE, FALSE, FALSE,
+ work_items, scratch_pool));
+ SVN_ERR(svn_wc__wq_run(db, local_abspath,
+ cancel_func, cancel_baton,
+ scratch_pool));
}
}
if (tree_conflicted)
{
- svn_wc_conflict_reason_t local_change;
- svn_wc_conflict_action_t incoming_change;
svn_wc_conflict_result_t *result;
svn_wc_conflict_description2_t *desc;
+ svn_boolean_t resolved;
+ svn_node_kind_t node_kind;
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&local_change,
- &incoming_change,
- NULL,
- db, local_abspath,
- conflict_skel,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_read_kind(&node_kind, db, local_abspath, TRUE,
+ TRUE, FALSE, scratch_pool));
- SVN_ERR(setup_tree_conflict_desc(&desc,
- db, local_abspath,
- operation, left_version, right_version,
- local_change, incoming_change,
- scratch_pool, scratch_pool));
+ SVN_ERR(read_tree_conflict_desc(&desc,
+ db, local_abspath, node_kind,
+ conflict_skel,
+ operation, left_version, right_version,
+ scratch_pool, scratch_pool));
/* Tell the resolver func about this conflict. */
SVN_ERR(resolver_func(&result, desc, resolver_baton, scratch_pool,
scratch_pool));
- /* Ignore the result. We cannot apply it here since this code runs
- * during an update or merge operation. Tree conflicts are always
- * postponed and resolved after the operation has completed. */
+ if (result == NULL)
+ return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Conflict callback violated API:"
+ " returned no results"));
+
+ /* Pass retry hash to avoid erroring out on cases where update
+ can continue safely. ### Need notify handling */
+ if (result->choice != svn_wc_conflict_choose_postpone)
+ SVN_ERR(resolve_tree_conflict_on_node(&resolved,
+ db, local_abspath, conflict_skel,
+ result->choice,
+ apr_hash_make(scratch_pool),
+ NULL, NULL, /* ### notify */
+ cancel_func, cancel_baton,
+ scratch_pool));
}
return SVN_NO_ERROR;
@@ -2042,7 +2052,8 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
/* Read all property conflicts contained in CONFLICT_SKEL into
* individual conflict descriptions, and append those descriptions
- * to the CONFLICTS array.
+ * to the CONFLICTS array. If there is no property conflict in
+ * CONFLICT_SKEL, return an error.
*
* If NOT create_tempfiles, always create a legacy property conflict
* descriptor.
@@ -2053,27 +2064,36 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
* Allocate results in RESULT_POOL. SCRATCH_POOL is used for temporary
* allocations. */
static svn_error_t *
-read_prop_conflicts(apr_array_header_t *conflicts,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_skel_t *conflict_skel,
- svn_boolean_t create_tempfiles,
- svn_node_kind_t node_kind,
- svn_wc_operation_t operation,
- const svn_wc_conflict_version_t *left_version,
- const svn_wc_conflict_version_t *right_version,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+read_prop_conflict_descs(apr_array_header_t *conflicts,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_skel_t *conflict_skel,
+ svn_boolean_t create_tempfiles,
+ svn_node_kind_t node_kind,
+ svn_wc_operation_t operation,
+ const svn_wc_conflict_version_t *left_version,
+ const svn_wc_conflict_version_t *right_version,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- const char *prop_reject_file;
+ const char *prop_reject_abspath;
+ apr_hash_t *base_props;
apr_hash_t *my_props;
apr_hash_t *their_old_props;
apr_hash_t *their_props;
apr_hash_t *conflicted_props;
apr_hash_index_t *hi;
apr_pool_t *iterpool;
+ svn_boolean_t prop_conflicted;
- SVN_ERR(svn_wc__conflict_read_prop_conflict(&prop_reject_file,
+ SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, &prop_conflicted,
+ NULL, db, local_abspath, conflict_skel,
+ scratch_pool, scratch_pool));
+
+ if (!prop_conflicted)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_wc__conflict_read_prop_conflict(&prop_reject_abspath,
&my_props,
&their_old_props,
&their_props,
@@ -2082,7 +2102,9 @@ read_prop_conflicts(apr_array_header_t *conflicts,
conflict_skel,
scratch_pool, scratch_pool));
- if ((! create_tempfiles) || apr_hash_count(conflicted_props) == 0)
+ prop_reject_abspath = apr_pstrdup(result_pool, prop_reject_abspath);
+
+ if (apr_hash_count(conflicted_props) == 0)
{
/* Legacy prop conflict with only a .reject file. */
svn_wc_conflict_description2_t *desc;
@@ -2091,26 +2113,31 @@ read_prop_conflicts(apr_array_header_t *conflicts,
node_kind,
"", result_pool);
- /* ### This should be changed. The prej file should be stored
- * ### separately from the other files. We need to rev the
- * ### conflict description struct for this. */
- desc->their_abspath = apr_pstrdup(result_pool, prop_reject_file);
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ desc->prop_reject_abspath = prop_reject_abspath; /* in result_pool */
+ desc->their_abspath = desc->prop_reject_abspath;
desc->operation = operation;
desc->src_left_version = left_version;
desc->src_right_version = right_version;
- APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t*) = desc;
+ APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t *) = desc;
return SVN_NO_ERROR;
}
+ if (operation == svn_wc_operation_merge)
+ SVN_ERR(svn_wc__db_read_pristine_props(&base_props, db, local_abspath,
+ result_pool, scratch_pool));
+ else
+ base_props = NULL;
iterpool = svn_pool_create(scratch_pool);
for (hi = apr_hash_first(scratch_pool, conflicted_props);
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
+ const char *propname = apr_hash_this_key(hi);
svn_string_t *old_value;
svn_string_t *my_value;
svn_string_t *their_value;
@@ -2118,10 +2145,10 @@ read_prop_conflicts(apr_array_header_t *conflicts,
svn_pool_clear(iterpool);
- desc = svn_wc_conflict_description_create_prop2(local_abspath,
- node_kind,
- propname,
- result_pool);
+ desc = svn_wc_conflict_description_create_prop2(local_abspath,
+ node_kind,
+ propname,
+ result_pool);
desc->operation = operation;
desc->src_left_version = left_version;
@@ -2149,26 +2176,30 @@ read_prop_conflicts(apr_array_header_t *conflicts,
else
desc->reason = svn_wc_conflict_reason_edited;
- /* ### This should be changed. The prej file should be stored
- * ### separately from the other files. We need to rev the
- * ### conflict description struct for this. */
- desc->their_abspath = apr_pstrdup(result_pool, prop_reject_file);
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ desc->prop_reject_abspath = prop_reject_abspath; /* in result_pool */
+ desc->their_abspath = desc->prop_reject_abspath;
+
+ desc->prop_value_base = base_props ? svn_hash_gets(base_props, propname)
+ : desc->prop_value_incoming_old;
- /* ### This should be changed. The conflict description for
- * ### props should contain these values as svn_string_t,
- * ### rather than in temporary files. We need to rev the
- * ### conflict description struct for this. */
if (my_value)
{
svn_stream_t *s;
apr_size_t len;
- SVN_ERR(svn_stream_open_unique(&s, &desc->my_abspath, NULL,
- svn_io_file_del_on_pool_cleanup,
- result_pool, iterpool));
- len = my_value->len;
- SVN_ERR(svn_stream_write(s, my_value->data, &len));
- SVN_ERR(svn_stream_close(s));
+ if (create_tempfiles)
+ {
+ SVN_ERR(svn_stream_open_unique(&s, &desc->my_abspath, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, iterpool));
+ len = my_value->len;
+ SVN_ERR(svn_stream_write(s, my_value->data, &len));
+ SVN_ERR(svn_stream_close(s));
+ }
+
+ desc->prop_value_working = svn_string_dup(my_value, result_pool);
}
if (their_value)
@@ -2176,15 +2207,19 @@ read_prop_conflicts(apr_array_header_t *conflicts,
svn_stream_t *s;
apr_size_t len;
- /* ### Currently, their_abspath is used for the prop reject file.
- * ### Put their value into merged instead...
- * ### We need to rev the conflict description struct to fix this. */
- SVN_ERR(svn_stream_open_unique(&s, &desc->merged_file, NULL,
- svn_io_file_del_on_pool_cleanup,
- result_pool, iterpool));
- len = their_value->len;
- SVN_ERR(svn_stream_write(s, their_value->data, &len));
- SVN_ERR(svn_stream_close(s));
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ if (create_tempfiles)
+ {
+ SVN_ERR(svn_stream_open_unique(&s, &desc->merged_file, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, iterpool));
+ len = their_value->len;
+ SVN_ERR(svn_stream_write(s, their_value->data, &len));
+ SVN_ERR(svn_stream_close(s));
+ }
+
+ desc->prop_value_incoming_new = svn_string_dup(their_value, result_pool);
}
if (old_value)
@@ -2192,15 +2227,20 @@ read_prop_conflicts(apr_array_header_t *conflicts,
svn_stream_t *s;
apr_size_t len;
- SVN_ERR(svn_stream_open_unique(&s, &desc->base_abspath, NULL,
- svn_io_file_del_on_pool_cleanup,
- result_pool, iterpool));
- len = old_value->len;
- SVN_ERR(svn_stream_write(s, old_value->data, &len));
- SVN_ERR(svn_stream_close(s));
+ if (create_tempfiles)
+ {
+ SVN_ERR(svn_stream_open_unique(&s, &desc->base_abspath, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, iterpool));
+ len = old_value->len;
+ SVN_ERR(svn_stream_write(s, old_value->data, &len));
+ SVN_ERR(svn_stream_close(s));
+ }
+
+ desc->prop_value_incoming_old = svn_string_dup(old_value, result_pool);
}
- APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t*) = desc;
+ APR_ARRAY_PUSH(conflicts, svn_wc_conflict_description2_t *) = desc;
}
svn_pool_destroy(iterpool);
@@ -2209,13 +2249,15 @@ read_prop_conflicts(apr_array_header_t *conflicts,
svn_error_t *
svn_wc__read_conflicts(const apr_array_header_t **conflicts,
+ svn_skel_t **conflict_skel,
svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t create_tempfiles,
+ svn_boolean_t only_tree_conflict,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_skel_t *conflict_skel;
+ svn_skel_t *the_conflict_skel;
apr_array_header_t *cflcts;
svn_boolean_t prop_conflicted;
svn_boolean_t text_conflicted;
@@ -2224,82 +2266,71 @@ svn_wc__read_conflicts(const apr_array_header_t **conflicts,
const apr_array_header_t *locations;
const svn_wc_conflict_version_t *left_version = NULL;
const svn_wc_conflict_version_t *right_version = NULL;
-
- SVN_ERR(svn_wc__db_read_conflict(&conflict_skel, db, local_abspath,
- scratch_pool, scratch_pool));
+ svn_node_kind_t node_kind;
+ apr_hash_t *props;
if (!conflict_skel)
+ conflict_skel = &the_conflict_skel;
+
+ SVN_ERR(svn_wc__db_read_conflict(conflict_skel, &node_kind, &props,
+ db, local_abspath,
+ (conflict_skel == &the_conflict_skel)
+ ? scratch_pool
+ : result_pool,
+ scratch_pool));
+
+ if (!*conflict_skel)
{
/* Some callers expect not NULL */
*conflicts = apr_array_make(result_pool, 0,
- sizeof(svn_wc_conflict_description2_t*));;
+ sizeof(svn_wc_conflict_description2_t *));
return SVN_NO_ERROR;
}
SVN_ERR(svn_wc__conflict_read_info(&operation, &locations, &text_conflicted,
&prop_conflicted, &tree_conflicted,
- db, local_abspath, conflict_skel,
+ db, local_abspath, *conflict_skel,
result_pool, scratch_pool));
cflcts = apr_array_make(result_pool, 4,
- sizeof(svn_wc_conflict_description2_t*));
+ sizeof(svn_wc_conflict_description2_t *));
if (locations && locations->nelts > 0)
left_version = APR_ARRAY_IDX(locations, 0, const svn_wc_conflict_version_t *);
if (locations && locations->nelts > 1)
right_version = APR_ARRAY_IDX(locations, 1, const svn_wc_conflict_version_t *);
- if (prop_conflicted)
+ if (prop_conflicted && !only_tree_conflict)
{
- svn_node_kind_t node_kind
- = left_version ? left_version->node_kind : svn_node_unknown;
-
- SVN_ERR(read_prop_conflicts(cflcts, db, local_abspath, conflict_skel,
- create_tempfiles, node_kind,
- operation, left_version, right_version,
- result_pool, scratch_pool));
+ SVN_ERR(read_prop_conflict_descs(cflcts,
+ db, local_abspath, *conflict_skel,
+ create_tempfiles, node_kind,
+ operation, left_version, right_version,
+ result_pool, scratch_pool));
}
- if (text_conflicted)
+ if (text_conflicted && !only_tree_conflict)
{
svn_wc_conflict_description2_t *desc;
- desc = svn_wc_conflict_description_create_text2(local_abspath,
- result_pool);
- desc->operation = operation;
- desc->src_left_version = left_version;
- desc->src_right_version = right_version;
-
- SVN_ERR(svn_wc__conflict_read_text_conflict(&desc->my_abspath,
- &desc->base_abspath,
- &desc->their_abspath,
- db, local_abspath,
- conflict_skel,
- result_pool, scratch_pool));
-
- desc->merged_file = apr_pstrdup(result_pool, local_abspath);
-
- APR_ARRAY_PUSH(cflcts, svn_wc_conflict_description2_t*) = desc;
+ SVN_ERR(read_text_conflict_desc(&desc,
+ db, local_abspath, *conflict_skel,
+ svn_prop_get_value(props,
+ SVN_PROP_MIME_TYPE),
+ operation, left_version, right_version,
+ result_pool, scratch_pool));
+ APR_ARRAY_PUSH(cflcts, svn_wc_conflict_description2_t *) = desc;
}
if (tree_conflicted)
{
- svn_wc_conflict_reason_t local_change;
- svn_wc_conflict_action_t incoming_change;
svn_wc_conflict_description2_t *desc;
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&local_change,
- &incoming_change,
- NULL,
- db, local_abspath,
- conflict_skel,
- scratch_pool, scratch_pool));
-
- SVN_ERR(setup_tree_conflict_desc(&desc,
- db, local_abspath,
- operation, left_version, right_version,
- local_change, incoming_change,
- result_pool, scratch_pool));
+ SVN_ERR(read_tree_conflict_desc(&desc,
+ db, local_abspath, node_kind,
+ *conflict_skel,
+ operation, left_version, right_version,
+ result_pool, scratch_pool));
APR_ARRAY_PUSH(cflcts, const svn_wc_conflict_description2_t *) = desc;
}
@@ -2311,206 +2342,6 @@ svn_wc__read_conflicts(const apr_array_header_t **conflicts,
/*** Resolving a conflict automatically ***/
-/* Prepare to delete an artifact file at ARTIFACT_FILE_ABSPATH in the
- * working copy at DB/WRI_ABSPATH.
- *
- * Set *WORK_ITEMS to a new work item that, when run, will delete the
- * artifact file; or to NULL if there is no file to delete.
- *
- * Set *FILE_FOUND to TRUE if the artifact file is found on disk and its
- * node kind is 'file'; otherwise do not change *FILE_FOUND. FILE_FOUND
- * may be NULL if not required.
- */
-static svn_error_t *
-remove_artifact_file_if_exists(svn_skel_t **work_items,
- svn_boolean_t *file_found,
- svn_wc__db_t *db,
- const char *wri_abspath,
- const char *artifact_file_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- *work_items = NULL;
- if (artifact_file_abspath)
- {
- svn_node_kind_t node_kind;
-
- SVN_ERR(svn_io_check_path(artifact_file_abspath, &node_kind,
- scratch_pool));
- if (node_kind == svn_node_file)
- {
- SVN_ERR(svn_wc__wq_build_file_remove(work_items,
- db, wri_abspath,
- artifact_file_abspath,
- result_pool, scratch_pool));
- if (file_found)
- *file_found = TRUE;
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/*
- * Resolve the text conflict found in DB/LOCAL_ABSPATH according
- * to CONFLICT_CHOICE.
- *
- * It is not an error if there is no text conflict. If a text conflict
- * existed and was resolved, set *DID_RESOLVE to TRUE, else set it to FALSE.
- *
- * Note: When there are no conflict markers to remove there is no existing
- * text conflict; just a database containing old information, which we should
- * remove to avoid checking all the time. Resolving a text conflict by
- * removing all the marker files is a fully supported scenario since
- * Subversion 1.0.
- */
-static svn_error_t *
-resolve_text_conflict_on_node(svn_boolean_t *did_resolve,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_conflict_choice_t conflict_choice,
- const char *merged_file,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- const char *conflict_old = NULL;
- const char *conflict_new = NULL;
- const char *conflict_working = NULL;
- const char *auto_resolve_src;
- svn_skel_t *work_item;
- svn_skel_t *work_items = NULL;
- svn_skel_t *conflicts;
- svn_wc_operation_t operation;
- svn_boolean_t text_conflicted;
-
- *did_resolve = FALSE;
-
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
- scratch_pool, scratch_pool));
- if (!conflicts)
- return SVN_NO_ERROR;
-
- SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, &text_conflicted,
- NULL, NULL, db, local_abspath, conflicts,
- scratch_pool, scratch_pool));
- if (!text_conflicted)
- return SVN_NO_ERROR;
-
- SVN_ERR(svn_wc__conflict_read_text_conflict(&conflict_working,
- &conflict_old,
- &conflict_new,
- db, local_abspath, conflicts,
- scratch_pool, scratch_pool));
-
- /* Handle automatic conflict resolution before the temporary files are
- * deleted, if necessary. */
- switch (conflict_choice)
- {
- case svn_wc_conflict_choose_base:
- auto_resolve_src = conflict_old;
- break;
- case svn_wc_conflict_choose_mine_full:
- auto_resolve_src = conflict_working;
- break;
- case svn_wc_conflict_choose_theirs_full:
- auto_resolve_src = conflict_new;
- break;
- case svn_wc_conflict_choose_merged:
- auto_resolve_src = merged_file;
- break;
- case svn_wc_conflict_choose_theirs_conflict:
- case svn_wc_conflict_choose_mine_conflict:
- {
- if (conflict_old && conflict_working && conflict_new)
- {
- const char *temp_dir;
- svn_stream_t *tmp_stream = NULL;
- svn_diff_t *diff;
- svn_diff_conflict_display_style_t style =
- conflict_choice == svn_wc_conflict_choose_theirs_conflict
- ? svn_diff_conflict_display_latest
- : svn_diff_conflict_display_modified;
-
- SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, db,
- local_abspath,
- scratch_pool,
- scratch_pool));
- SVN_ERR(svn_stream_open_unique(&tmp_stream,
- &auto_resolve_src,
- temp_dir,
- svn_io_file_del_on_pool_cleanup,
- scratch_pool, scratch_pool));
-
- SVN_ERR(svn_diff_file_diff3_2(&diff,
- conflict_old,
- conflict_working,
- conflict_new,
- svn_diff_file_options_create(
- scratch_pool),
- scratch_pool));
- SVN_ERR(svn_diff_file_output_merge2(tmp_stream, diff,
- conflict_old,
- conflict_working,
- conflict_new,
- /* markers ignored */
- NULL, NULL, NULL, NULL,
- style,
- scratch_pool));
- SVN_ERR(svn_stream_close(tmp_stream));
- }
- else
- auto_resolve_src = NULL;
- break;
- }
- default:
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Invalid 'conflict_result' argument"));
- }
-
- if (auto_resolve_src)
- {
- SVN_ERR(svn_wc__wq_build_file_copy_translated(
- &work_item, db, local_abspath,
- auto_resolve_src, local_abspath, scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
-
- SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, db,
- local_abspath,
- scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
- }
-
- /* Legacy behavior: Only report text conflicts as resolved when at least
- one conflict marker file exists.
-
- If not the UI shows the conflict as already resolved
- (and in this case we just remove the in-db conflict) */
-
- SVN_ERR(remove_artifact_file_if_exists(&work_item, did_resolve,
- db, local_abspath, conflict_old,
- scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
-
- SVN_ERR(remove_artifact_file_if_exists(&work_item, did_resolve,
- db, local_abspath, conflict_new,
- scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
-
- SVN_ERR(remove_artifact_file_if_exists(&work_item, did_resolve,
- db, local_abspath, conflict_working,
- scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
-
- SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
- TRUE, FALSE, FALSE,
- work_items, scratch_pool));
- SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
/*
* Resolve the property conflicts found in DB/LOCAL_ABSPATH according
* to CONFLICT_CHOICE.
@@ -2550,9 +2381,11 @@ static svn_error_t *
resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_skel_t *conflicts,
const char *conflicted_propname,
svn_wc_conflict_choice_t conflict_choice,
const char *merged_file,
+ const svn_string_t *merged_value,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
@@ -2565,18 +2398,13 @@ resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
apr_hash_t *old_props;
apr_hash_t *resolve_from = NULL;
svn_skel_t *work_items = NULL;
- svn_skel_t *conflicts;
svn_wc_operation_t operation;
svn_boolean_t prop_conflicted;
+ apr_hash_t *actual_props;
+ svn_boolean_t resolved_all, resolved_all_prop;
*did_resolve = FALSE;
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
- scratch_pool, scratch_pool));
-
- if (!conflicts)
- return SVN_NO_ERROR;
-
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, &prop_conflicted,
NULL, db, local_abspath, conflicts,
scratch_pool, scratch_pool));
@@ -2589,12 +2417,35 @@ resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
db, local_abspath, conflicts,
scratch_pool, scratch_pool));
+ if (!conflicted_props)
+ {
+ /* We have a pre 1.8 property conflict. Just mark it resolved */
+
+ SVN_ERR(remove_artifact_file_if_exists(&work_items, did_resolve,
+ db, local_abspath, prop_reject_file,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, FALSE, TRUE, FALSE,
+ work_items, scratch_pool));
+ SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
+ scratch_pool));
+ return SVN_NO_ERROR;
+ }
+
+ if (conflicted_propname[0] != '\0'
+ && !svn_hash_gets(conflicted_props, conflicted_propname))
+ {
+ return SVN_NO_ERROR; /* This property is not conflicted! */
+ }
+
if (operation == svn_wc_operation_merge)
SVN_ERR(svn_wc__db_read_pristine_props(&old_props, db, local_abspath,
scratch_pool, scratch_pool));
else
old_props = their_old_props;
+ SVN_ERR(svn_wc__db_read_props(&actual_props, db, local_abspath,
+ scratch_pool, scratch_pool));
+
/* We currently handle *_conflict as *_full as this argument is currently
always applied for all conflicts on a node at the same time. Giving
an error would break some tests that assumed that this would just
@@ -2620,21 +2471,23 @@ resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
resolve_from = their_props;
break;
case svn_wc_conflict_choose_merged:
- if (merged_file && conflicted_propname[0] != '\0')
+ if ((merged_file || merged_value) && conflicted_propname[0] != '\0')
{
- apr_hash_t *actual_props;
- svn_stream_t *stream;
- svn_string_t *merged_propval;
+ resolve_from = apr_hash_copy(scratch_pool, actual_props);
- SVN_ERR(svn_wc__db_read_props(&actual_props, db, local_abspath,
- scratch_pool, scratch_pool));
- resolve_from = actual_props;
+ if (!merged_value)
+ {
+ svn_stream_t *stream;
+ svn_string_t *merged_propval;
- SVN_ERR(svn_stream_open_readonly(&stream, merged_file,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_string_from_stream(&merged_propval, stream,
- scratch_pool, scratch_pool));
- svn_hash_sets(resolve_from, conflicted_propname, merged_propval);
+ SVN_ERR(svn_stream_open_readonly(&stream, merged_file,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_string_from_stream(&merged_propval, stream,
+ scratch_pool, scratch_pool));
+
+ merged_value = merged_propval;
+ }
+ svn_hash_sets(resolve_from, conflicted_propname, merged_value);
}
else
resolve_from = NULL;
@@ -2644,47 +2497,97 @@ resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
_("Invalid 'conflict_result' argument"));
}
- if (conflicted_props && apr_hash_count(conflicted_props) && resolve_from)
+
+ if (resolve_from)
{
apr_hash_index_t *hi;
- apr_hash_t *actual_props;
+ apr_hash_t *apply_on_props;
- SVN_ERR(svn_wc__db_read_props(&actual_props, db, local_abspath,
- scratch_pool, scratch_pool));
+ if (conflicted_propname[0] == '\0')
+ {
+ /* Apply to all conflicted properties */
+ apply_on_props = conflicted_props;
+ }
+ else
+ {
+ /* Apply to a single property */
+ apply_on_props = apr_hash_make(scratch_pool);
+ svn_hash_sets(apply_on_props, conflicted_propname, "");
+ }
- for (hi = apr_hash_first(scratch_pool, conflicted_props);
+ /* Apply the selected changes */
+ for (hi = apr_hash_first(scratch_pool, apply_on_props);
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
+ const char *propname = apr_hash_this_key(hi);
svn_string_t *new_value = NULL;
new_value = svn_hash_gets(resolve_from, propname);
svn_hash_sets(actual_props, propname, new_value);
}
- SVN_ERR(svn_wc__db_op_set_props(db, local_abspath, actual_props,
- FALSE, NULL, NULL,
- scratch_pool));
}
+ /*else the user accepted the properties as-is */
- /* Legacy behavior: Only report property conflicts as resolved when the
- property reject file exists
+ /* This function handles conflicted_propname "" as resolving
+ all property conflicts... Just what we need here */
+ SVN_ERR(svn_wc__conflict_skel_resolve(&resolved_all, conflicts,
+ db, local_abspath,
+ FALSE, conflicted_propname,
+ FALSE,
+ scratch_pool, scratch_pool));
- If not the UI shows the conflict as already resolved
- (and in this case we just remove the in-db conflict) */
+ if (!resolved_all)
+ {
+ /* Are there still property conflicts left? (or only...) */
+ SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, NULL, &prop_conflicted,
+ NULL, db, local_abspath, conflicts,
+ scratch_pool, scratch_pool));
- {
- svn_skel_t *work_item;
+ resolved_all_prop = (! prop_conflicted);
+ }
+ else
+ {
+ resolved_all_prop = TRUE;
+ conflicts = NULL;
+ }
- SVN_ERR(remove_artifact_file_if_exists(&work_item, did_resolve,
- db, local_abspath, prop_reject_file,
- scratch_pool, scratch_pool));
- work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
- }
+ if (resolved_all_prop)
+ {
+ /* Legacy behavior: Only report property conflicts as resolved when the
+ property reject file exists
+
+ If not the UI shows the conflict as already resolved
+ (and in this case we just remove the in-db conflict) */
+ SVN_ERR(remove_artifact_file_if_exists(&work_items, did_resolve,
+ db, local_abspath,
+ prop_reject_file,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ /* Create a new prej file, based on the remaining conflicts */
+ SVN_ERR(svn_wc__wq_build_prej_install(&work_items,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+ *did_resolve = TRUE; /* We resolved a property conflict */
+ }
+
+ /* This installs the updated conflict skel */
+ SVN_ERR(svn_wc__db_op_set_props(db, local_abspath, actual_props,
+ FALSE, conflicts, work_items,
+ scratch_pool));
+
+ if (resolved_all)
+ {
+ /* Remove the whole conflict. Should probably be integrated
+ into the op_set_props() call */
+ SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
+ FALSE, TRUE, FALSE,
+ NULL, scratch_pool));
+ }
- SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, FALSE, TRUE, FALSE,
- work_items, scratch_pool));
SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
scratch_pool));
@@ -2699,12 +2602,18 @@ resolve_prop_conflict_on_node(svn_boolean_t *did_resolve,
* existed and was resolved, set *DID_RESOLVE to TRUE, else set it to FALSE.
*
* It is not an error if there is no tree conflict.
+ *
+ * If the conflict can't be resolved yet because another tree conflict is
+ * blocking a storage location, store the tree conflict in the RESOLVE_LATER
+ * hash.
*/
static svn_error_t *
resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_wc__db_t *db,
const char *local_abspath,
+ const svn_skel_t *conflicts,
svn_wc_conflict_choice_t conflict_choice,
+ apr_hash_t *resolve_later,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
@@ -2713,24 +2622,20 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
{
svn_wc_conflict_reason_t reason;
svn_wc_conflict_action_t action;
- svn_skel_t *conflicts;
svn_wc_operation_t operation;
svn_boolean_t tree_conflicted;
+ const char *src_op_root_abspath;
*did_resolve = FALSE;
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
- scratch_pool, scratch_pool));
- if (!conflicts)
- return SVN_NO_ERROR;
-
SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, NULL,
&tree_conflicted, db, local_abspath,
conflicts, scratch_pool, scratch_pool));
if (!tree_conflicted)
return SVN_NO_ERROR;
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action, NULL,
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
+ &src_op_root_abspath,
db, local_abspath,
conflicts,
scratch_pool, scratch_pool));
@@ -2738,6 +2643,7 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
if (operation == svn_wc_operation_update
|| operation == svn_wc_operation_switch)
{
+ svn_error_t *err;
if (reason == svn_wc_conflict_reason_deleted ||
reason == svn_wc_conflict_reason_replaced)
{
@@ -2745,21 +2651,88 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
{
/* Break moves for any children moved out of this directory,
* and leave this directory deleted. */
- SVN_ERR(svn_wc__db_resolve_break_moved_away_children(
- db, local_abspath, notify_func, notify_baton,
- scratch_pool));
+
+ if (action != svn_wc_conflict_action_delete)
+ {
+ SVN_ERR(svn_wc__db_op_break_moved_away(
+ db, local_abspath, src_op_root_abspath, TRUE,
+ notify_func, notify_baton,
+ scratch_pool));
+ *did_resolve = TRUE;
+ return SVN_NO_ERROR; /* Marked resolved by function*/
+ }
+ /* else # The move is/moves are already broken */
+
+
*did_resolve = TRUE;
}
else if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
{
- /* Raised moved-away conflicts on any children moved out of
- * this directory, and leave this directory deleted.
+ svn_skel_t *new_conflicts;
+
+ /* Raise moved-away conflicts on any children moved out of
+ * this directory, and leave this directory as-is.
+ *
* The newly conflicted moved-away children will be updated
* if they are resolved with 'mine_conflict' as well. */
- SVN_ERR(svn_wc__db_resolve_delete_raise_moved_away(
+ err = svn_wc__db_op_raise_moved_away(
db, local_abspath, notify_func, notify_baton,
- scratch_pool));
- *did_resolve = TRUE;
+ scratch_pool);
+
+ if (err)
+ {
+ const char *dup_abspath;
+
+ if (!resolve_later
+ || err->apr_err != SVN_ERR_WC_OBSTRUCTED_UPDATE)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ dup_abspath = apr_pstrdup(apr_hash_pool_get(resolve_later),
+ local_abspath);
+
+ svn_hash_sets(resolve_later, dup_abspath, dup_abspath);
+
+ return SVN_NO_ERROR; /* Retry after other conflicts */
+ }
+
+ /* We might now have a moved-away on *this* path, let's
+ try to resolve that directly if that is the case */
+ SVN_ERR(svn_wc__db_read_conflict(&new_conflicts, NULL, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (new_conflicts)
+ SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, NULL, NULL,
+ &tree_conflicted,
+ db, local_abspath,
+ new_conflicts,
+ scratch_pool,
+ scratch_pool));
+
+ if (!new_conflicts || !tree_conflicted)
+ {
+ /* TC is marked resolved by calling
+ svn_wc__db_resolve_delete_raise_moved_away */
+ *did_resolve = TRUE;
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
+ &src_op_root_abspath,
+ db, local_abspath,
+ new_conflicts,
+ scratch_pool,
+ scratch_pool));
+
+ if (reason != svn_wc_conflict_reason_moved_away)
+ {
+ *did_resolve = TRUE;
+ return SVN_NO_ERROR; /* We fixed one, but... */
+ }
+
+ conflicts = new_conflicts;
+ /* Fall through in moved_away handling */
}
else
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
@@ -2770,8 +2743,9 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_dirent_local_style(local_abspath,
scratch_pool));
}
- else if (reason == svn_wc_conflict_reason_moved_away
- && action == svn_wc_conflict_action_edit)
+
+ if (reason == svn_wc_conflict_reason_moved_away
+ && action == svn_wc_conflict_action_edit)
{
/* After updates, we can resolve local moved-away
* vs. any incoming change, either by updating the
@@ -2779,12 +2753,31 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
* move (theirs-conflict). */
if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
{
- SVN_ERR(svn_wc__db_update_moved_away_conflict_victim(
- db, local_abspath,
- notify_func, notify_baton,
+ err = svn_wc__db_update_moved_away_conflict_victim(
+ db, local_abspath, src_op_root_abspath,
+ operation, action, reason,
cancel_func, cancel_baton,
- scratch_pool));
- *did_resolve = TRUE;
+ notify_func, notify_baton,
+ scratch_pool);
+
+ if (err)
+ {
+ const char *dup_abspath;
+
+ if (!resolve_later
+ || err->apr_err != SVN_ERR_WC_OBSTRUCTED_UPDATE)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ dup_abspath = apr_pstrdup(apr_hash_pool_get(resolve_later),
+ local_abspath);
+
+ svn_hash_sets(resolve_later, dup_abspath, dup_abspath);
+
+ return SVN_NO_ERROR; /* Retry after other conflicts */
+ }
+ else
+ *did_resolve = TRUE;
}
else if (conflict_choice == svn_wc_conflict_choose_merged)
{
@@ -2792,14 +2785,12 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
* working copy state instead of updating the move.
* Else the move would be left in an invalid state. */
- /* ### This breaks the move but leaves the conflict
- ### involving the move until
- ### svn_wc__db_op_mark_resolved. */
- SVN_ERR(svn_wc__db_resolve_break_moved_away(db, local_abspath,
- notify_func,
- notify_baton,
- scratch_pool));
+ SVN_ERR(svn_wc__db_op_break_moved_away(db, local_abspath,
+ src_op_root_abspath, TRUE,
+ notify_func, notify_baton,
+ scratch_pool));
*did_resolve = TRUE;
+ return SVN_NO_ERROR; /* Conflict is marked resolved */
}
else
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
@@ -2810,22 +2801,57 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_dirent_local_style(local_abspath,
scratch_pool));
}
+ else if (reason == svn_wc_conflict_reason_moved_away
+ && action != svn_wc_conflict_action_edit)
+ {
+ /* action added is impossible, because that would imply that
+ something was added, but before that already moved...
+ (which would imply a replace) */
+ SVN_ERR_ASSERT(action == svn_wc_conflict_action_delete
+ || action == svn_wc_conflict_action_replace);
+
+ if (conflict_choice == svn_wc_conflict_choose_merged)
+ {
+ /* Whatever was moved is removed at its original location by the
+ update. That must also remove the recording of the move, so
+ we don't have to do anything here. */
+
+ *did_resolve = TRUE;
+ }
+ else if (conflict_choice == svn_wc_conflict_choose_mine_conflict)
+ {
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
+ NULL,
+ _("Tree conflict can only be "
+ "resolved to 'working' state; "
+ "'%s' is no longer moved"),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+ }
+ }
}
- if (! *did_resolve && conflict_choice != svn_wc_conflict_choose_merged)
+ if (! *did_resolve)
{
- /* For other tree conflicts, there is no way to pick
- * theirs-full or mine-full, etc. Throw an error if the
- * user expects us to be smarter than we really are. */
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
- NULL,
- _("Tree conflict can only be "
- "resolved to 'working' state; "
- "'%s' not resolved"),
- svn_dirent_local_style(local_abspath,
- scratch_pool));
+ if (conflict_choice != svn_wc_conflict_choose_merged)
+ {
+ /* For other tree conflicts, there is no way to pick
+ * theirs-full or mine-full, etc. Throw an error if the
+ * user expects us to be smarter than we really are. */
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
+ NULL,
+ _("Tree conflict can only be "
+ "resolved to 'working' state; "
+ "'%s' not resolved"),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+ }
+ else
+ *did_resolve = TRUE;
}
+ SVN_ERR_ASSERT(*did_resolve);
+
SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, FALSE, FALSE, TRUE,
NULL, scratch_pool));
SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
@@ -2836,16 +2862,33 @@ resolve_tree_conflict_on_node(svn_boolean_t *did_resolve,
svn_error_t *
svn_wc__mark_resolved_text_conflict(svn_wc__db_t *db,
const char *local_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
- svn_boolean_t ignored_result;
+ svn_skel_t *work_items;
+ svn_skel_t *conflict;
- return svn_error_trace(resolve_text_conflict_on_node(
- &ignored_result,
- db, local_abspath,
- svn_wc_conflict_choose_merged, NULL,
- NULL, NULL,
- scratch_pool));
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (!conflict)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(build_text_conflict_resolve_items(&work_items, NULL,
+ db, local_abspath, conflict,
+ svn_wc_conflict_choose_merged,
+ NULL, FALSE, NULL,
+ cancel_func, cancel_baton,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath, TRUE, FALSE, FALSE,
+ work_items, scratch_pool));
+
+ return svn_error_trace(svn_wc__wq_run(db, local_abspath,
+ cancel_func, cancel_baton,
+ scratch_pool));
}
svn_error_t *
@@ -2854,11 +2897,20 @@ svn_wc__mark_resolved_prop_conflicts(svn_wc__db_t *db,
apr_pool_t *scratch_pool)
{
svn_boolean_t ignored_result;
+ svn_skel_t *conflicts;
+
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (!conflicts)
+ return SVN_NO_ERROR;
return svn_error_trace(resolve_prop_conflict_on_node(
&ignored_result,
- db, local_abspath, "",
- svn_wc_conflict_choose_merged, NULL,
+ db, local_abspath, conflicts, "",
+ svn_wc_conflict_choose_merged,
+ NULL, NULL,
NULL, NULL,
scratch_pool));
}
@@ -2878,8 +2930,39 @@ struct conflict_status_walker_baton
void *cancel_baton;
svn_wc_notify_func2_t notify_func;
void *notify_baton;
+ svn_boolean_t resolved_one;
+ apr_hash_t *resolve_later;
};
+/* Implements svn_wc_notify_func2_t to collect new conflicts caused by
+ resolving a tree conflict. */
+static void
+tree_conflict_collector(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *pool)
+{
+ struct conflict_status_walker_baton *cswb = baton;
+
+ if (cswb->notify_func)
+ cswb->notify_func(cswb->notify_baton, notify, pool);
+
+ if (cswb->resolve_later
+ && (notify->action == svn_wc_notify_tree_conflict
+ || notify->prop_state == svn_wc_notify_state_conflicted
+ || notify->content_state == svn_wc_notify_state_conflicted))
+ {
+ if (!svn_hash_gets(cswb->resolve_later, notify->path))
+ {
+ const char *dup_path;
+
+ dup_path = apr_pstrdup(apr_hash_pool_get(cswb->resolve_later),
+ notify->path);
+
+ svn_hash_sets(cswb->resolve_later, dup_path, dup_path);
+ }
+ }
+}
+
/* Implements svn_wc_status4_t to walk all conflicts to resolve.
*/
static svn_error_t *
@@ -2895,13 +2978,17 @@ conflict_status_walker(void *baton,
apr_pool_t *iterpool;
int i;
svn_boolean_t resolved = FALSE;
+ svn_skel_t *conflict;
if (!status->conflicted)
return SVN_NO_ERROR;
iterpool = svn_pool_create(scratch_pool);
- SVN_ERR(svn_wc__read_conflicts(&conflicts, db, local_abspath, TRUE,
+ SVN_ERR(svn_wc__read_conflicts(&conflicts, &conflict,
+ db, local_abspath,
+ (cswb->conflict_func != NULL) /* tmp files */,
+ FALSE /* only tree conflicts */,
scratch_pool, iterpool));
for (i = 0; i < conflicts->nelts; i++)
@@ -2909,11 +2996,15 @@ conflict_status_walker(void *baton,
const svn_wc_conflict_description2_t *cd;
svn_boolean_t did_resolve;
svn_wc_conflict_choice_t my_choice = cswb->conflict_choice;
- const char *merged_file = NULL;
+ svn_wc_conflict_result_t *result = NULL;
+ svn_skel_t *work_items;
cd = APR_ARRAY_IDX(conflicts, i, const svn_wc_conflict_description2_t *);
- if ((cd->kind == svn_wc_conflict_kind_property && !cswb->resolve_prop)
+ if ((cd->kind == svn_wc_conflict_kind_property
+ && (!cswb->resolve_prop
+ || (*cswb->resolve_prop != '\0'
+ && strcmp(cswb->resolve_prop, cd->property_name) != 0)))
|| (cd->kind == svn_wc_conflict_kind_text && !cswb->resolve_text)
|| (cd->kind == svn_wc_conflict_kind_tree && !cswb->resolve_tree))
{
@@ -2924,8 +3015,6 @@ conflict_status_walker(void *baton,
if (my_choice == svn_wc_conflict_choose_unspecified)
{
- svn_wc_conflict_result_t *result;
-
if (!cswb->conflict_func)
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("No conflict-callback and no "
@@ -2935,8 +3024,6 @@ conflict_status_walker(void *baton,
iterpool, iterpool));
my_choice = result->choice;
- merged_file = result->merged_file;
- /* ### Bug: ignores result->save_merged */
}
@@ -2946,54 +3033,57 @@ conflict_status_walker(void *baton,
switch (cd->kind)
{
case svn_wc_conflict_kind_tree:
- if (!cswb->resolve_tree)
- break;
SVN_ERR(resolve_tree_conflict_on_node(&did_resolve,
db,
- local_abspath,
+ local_abspath, conflict,
my_choice,
- cswb->notify_func,
- cswb->notify_baton,
+ cswb->resolve_later,
+ tree_conflict_collector,
+ cswb,
cswb->cancel_func,
cswb->cancel_baton,
iterpool));
- resolved = TRUE;
+ if (did_resolve)
+ resolved = TRUE;
break;
case svn_wc_conflict_kind_text:
- if (!cswb->resolve_text)
- break;
-
- SVN_ERR(resolve_text_conflict_on_node(&did_resolve,
- db,
- local_abspath,
- my_choice,
- merged_file,
- cswb->cancel_func,
- cswb->cancel_baton,
- iterpool));
-
- if (did_resolve)
- resolved = TRUE;
+ SVN_ERR(build_text_conflict_resolve_items(
+ &work_items,
+ &resolved,
+ db, local_abspath, conflict,
+ my_choice,
+ result ? result->merged_file
+ : NULL,
+ result ? result->save_merged
+ : FALSE,
+ NULL /* merge_options */,
+ cswb->cancel_func,
+ cswb->cancel_baton,
+ iterpool, iterpool));
+
+ SVN_ERR(svn_wc__db_op_mark_resolved(db, local_abspath,
+ TRUE, FALSE, FALSE,
+ work_items, iterpool));
+ SVN_ERR(svn_wc__wq_run(db, local_abspath,
+ cswb->cancel_func, cswb->cancel_baton,
+ iterpool));
break;
case svn_wc_conflict_kind_property:
- if (!cswb->resolve_prop)
- break;
-
- if (*cswb->resolve_prop != '\0' &&
- strcmp(cswb->resolve_prop, cd->property_name) != 0)
- {
- break; /* This is not the property we want to resolve. */
- }
-
SVN_ERR(resolve_prop_conflict_on_node(&did_resolve,
db,
local_abspath,
+ conflict,
cd->property_name,
my_choice,
- merged_file,
+ result
+ ? result->merged_file
+ : NULL,
+ result
+ ? result->merged_value
+ : NULL,
cswb->cancel_func,
cswb->cancel_baton,
iterpool));
@@ -3016,6 +3106,9 @@ conflict_status_walker(void *baton,
iterpool),
iterpool);
+ if (resolved)
+ cswb->resolved_one = TRUE;
+
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
@@ -3040,13 +3133,8 @@ svn_wc__resolve_conflicts(svn_wc_context_t *wc_ctx,
svn_node_kind_t kind;
svn_boolean_t conflicted;
struct conflict_status_walker_baton cswb;
-
- /* ### the underlying code does NOT support resolving individual
- ### properties. bail out if the caller tries it. */
- if (resolve_prop != NULL && *resolve_prop != '\0')
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- U_("Resolving a single property is not (yet) "
- "supported."));
+ apr_pool_t *iterpool = NULL;
+ svn_error_t *err;
/* ### Just a versioned check? */
/* Conflicted is set to allow invoking on actual only nodes */
@@ -3079,6 +3167,11 @@ svn_wc__resolve_conflicts(svn_wc_context_t *wc_ctx,
cswb.notify_func = notify_func;
cswb.notify_baton = notify_baton;
+ cswb.resolved_one = FALSE;
+ cswb.resolve_later = (depth != svn_depth_empty)
+ ? apr_hash_make(scratch_pool)
+ : NULL;
+
if (notify_func)
notify_func(notify_baton,
svn_wc_create_notify(local_abspath,
@@ -3086,16 +3179,103 @@ svn_wc__resolve_conflicts(svn_wc_context_t *wc_ctx,
scratch_pool),
scratch_pool);
- SVN_ERR(svn_wc_walk_status(wc_ctx,
- local_abspath,
- depth,
- FALSE /* get_all */,
- FALSE /* no_ignore */,
- TRUE /* ignore_text_mods */,
- NULL /* ignore_patterns */,
- conflict_status_walker, &cswb,
- cancel_func, cancel_baton,
- scratch_pool));
+ err = svn_wc_walk_status(wc_ctx,
+ local_abspath,
+ depth,
+ FALSE /* get_all */,
+ FALSE /* no_ignore */,
+ TRUE /* ignore_text_mods */,
+ NULL /* ignore_patterns */,
+ conflict_status_walker, &cswb,
+ cancel_func, cancel_baton,
+ scratch_pool);
+
+ /* If we got new tree conflicts (or delayed conflicts) during the initial
+ walk, we now walk them one by one as closure. */
+ while (!err && cswb.resolve_later && apr_hash_count(cswb.resolve_later))
+ {
+ apr_hash_index_t *hi;
+ svn_wc_status3_t *status = NULL;
+ const char *tc_abspath = NULL;
+
+ if (iterpool)
+ svn_pool_clear(iterpool);
+ else
+ iterpool = svn_pool_create(scratch_pool);
+
+ hi = apr_hash_first(scratch_pool, cswb.resolve_later);
+ cswb.resolve_later = apr_hash_make(scratch_pool);
+ cswb.resolved_one = FALSE;
+
+ for (; hi && !err; hi = apr_hash_next(hi))
+ {
+ const char *relpath;
+ svn_pool_clear(iterpool);
+
+ tc_abspath = apr_hash_this_key(hi);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ relpath = svn_dirent_skip_ancestor(local_abspath,
+ tc_abspath);
+
+ if (!relpath
+ || (depth >= svn_depth_empty
+ && depth < svn_depth_infinity
+ && strchr(relpath, '/')))
+ {
+ continue;
+ }
+
+ SVN_ERR(svn_wc_status3(&status, wc_ctx, tc_abspath,
+ iterpool, iterpool));
+
+ if (depth == svn_depth_files
+ && status->kind == svn_node_dir)
+ continue;
+
+ err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
+ status, scratch_pool));
+ }
+
+ /* None of the remaining conflicts got resolved, and non did provide
+ an error...
+
+ We can fix that if we disable the 'resolve_later' option...
+ */
+ if (!cswb.resolved_one && !err && tc_abspath
+ && apr_hash_count(cswb.resolve_later))
+ {
+ /* Run the last resolve operation again. We still have status
+ and tc_abspath for that one. */
+
+ cswb.resolve_later = NULL; /* Produce proper error! */
+
+ /* Recreate the error */
+ err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
+ status, scratch_pool));
+
+ SVN_ERR_ASSERT(err != NULL);
+
+ err = svn_error_createf(
+ SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
+ _("Unable to resolve pending conflict on '%s'"),
+ svn_dirent_local_style(tc_abspath, scratch_pool));
+ break;
+ }
+ }
+
+ if (iterpool)
+ svn_pool_destroy(iterpool);
+
+ if (err && err->apr_err != SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE)
+ err = svn_error_createf(
+ SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
+ _("Unable to resolve conflicts on '%s'"),
+ svn_dirent_local_style(local_abspath, scratch_pool));
+
+ SVN_ERR(err);
if (notify_func)
notify_func(notify_baton,
@@ -3139,7 +3319,7 @@ svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice,
{
svn_wc_conflict_result_t *result = apr_pcalloc(pool, sizeof(*result));
result->choice = choice;
- result->merged_file = merged_file;
+ result->merged_file = apr_pstrdup(pool, merged_file);
result->save_merged = FALSE;
/* If we add more fields to svn_wc_conflict_result_t, add them here. */
diff --git a/subversion/libsvn_wc/conflicts.h b/subversion/libsvn_wc/conflicts.h
index 839e8a0..0a9324b 100644
--- a/subversion/libsvn_wc/conflicts.h
+++ b/subversion/libsvn_wc/conflicts.h
@@ -419,6 +419,7 @@ svn_wc__conflict_create_markers(svn_skel_t **work_item,
svn_error_t *
svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
const char *local_abspath,
+ svn_node_kind_t kind,
const svn_skel_t *conflict_skel,
const apr_array_header_t *merge_options,
svn_wc_conflict_resolver_func2_t resolver_func,
@@ -432,6 +433,8 @@ svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
svn_error_t *
svn_wc__mark_resolved_text_conflict(svn_wc__db_t *db,
const char *local_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool);
/* Mark as resolved any prop conflicts on the node at DB/LOCAL_ABSPATH. */
diff --git a/subversion/libsvn_wc/copy.c b/subversion/libsvn_wc/copy.c
index 1e7d7cf..30a0db5 100644
--- a/subversion/libsvn_wc/copy.c
+++ b/subversion/libsvn_wc/copy.c
@@ -42,6 +42,7 @@
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
+/* #define RECORD_MIXED_MOVE */
/*** Code. ***/
@@ -50,7 +51,14 @@
TMPDIR_ABSPATH and return the absolute path of the copy in
*DST_ABSPATH. Return the node kind of SRC_ABSPATH in *KIND. If
SRC_ABSPATH doesn't exist then set *DST_ABSPATH to NULL to indicate
- that no copy was made. */
+ that no copy was made.
+
+ If DIRENT is not NULL, it contains the on-disk information of SRC_ABSPATH.
+ RECORDED_SIZE (if not SVN_INVALID_FILESIZE) contains the recorded size of
+ SRC_ABSPATH, and RECORDED_TIME the recorded size or 0.
+
+ These values will be used to avoid unneeded work.
+ */
static svn_error_t *
copy_to_tmpdir(svn_skel_t **work_item,
svn_node_kind_t *kind,
@@ -60,6 +68,9 @@ copy_to_tmpdir(svn_skel_t **work_item,
const char *tmpdir_abspath,
svn_boolean_t file_copy,
svn_boolean_t unversioned,
+ const svn_io_dirent2_t *dirent,
+ svn_filesize_t recorded_size,
+ apr_time_t recorded_time,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -74,8 +85,14 @@ copy_to_tmpdir(svn_skel_t **work_item,
*work_item = NULL;
- SVN_ERR(svn_io_check_special_path(src_abspath, kind, &is_special,
- scratch_pool));
+ if (dirent)
+ {
+ *kind = dirent->kind;
+ is_special = dirent->special;
+ }
+ else
+ SVN_ERR(svn_io_check_special_path(src_abspath, kind, &is_special,
+ scratch_pool));
if (*kind == svn_node_none)
{
return SVN_NO_ERROR;
@@ -104,9 +121,21 @@ copy_to_tmpdir(svn_skel_t **work_item,
the timestamp might match, than to examine the
destination later as the destination timestamp will
never match. */
- SVN_ERR(svn_wc__internal_file_modified_p(&modified,
- db, src_abspath,
- FALSE, scratch_pool));
+
+ if (dirent
+ && dirent->kind == svn_node_file
+ && recorded_size != SVN_INVALID_FILESIZE
+ && recorded_size == dirent->filesize
+ && recorded_time == dirent->mtime)
+ {
+ modified = FALSE; /* Recorded matches on-disk. Easy out */
+ }
+ else
+ {
+ SVN_ERR(svn_wc__internal_file_modified_p(&modified, db, src_abspath,
+ FALSE, scratch_pool));
+ }
+
if (!modified)
{
/* Why create a temp copy if we can just reinstall from pristine? */
@@ -117,6 +146,15 @@ copy_to_tmpdir(svn_skel_t **work_item,
return SVN_NO_ERROR;
}
}
+ else if (*kind == svn_node_dir && !file_copy)
+ {
+ /* Just build a new direcory from the workqueue */
+ SVN_ERR(svn_wc__wq_build_dir_install(work_item,
+ db, dst_abspath,
+ result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
+ }
/* Set DST_TMP_ABSPATH to a temporary unique path. If *KIND is file, leave
a file there and then overwrite it; otherwise leave no node on disk at
@@ -172,7 +210,14 @@ copy_to_tmpdir(svn_skel_t **work_item,
versioned file itself.
This also works for versioned symlinks that are stored in the db as
- svn_node_file with svn:special set. */
+ svn_node_file with svn:special set.
+
+ If DIRENT is not NULL, it contains the on-disk information of SRC_ABSPATH.
+ RECORDED_SIZE (if not SVN_INVALID_FILESIZE) contains the recorded size of
+ SRC_ABSPATH, and RECORDED_TIME the recorded size or 0.
+
+ These values will be used to avoid unneeded work.
+*/
static svn_error_t *
copy_versioned_file(svn_wc__db_t *db,
const char *src_abspath,
@@ -182,6 +227,9 @@ copy_versioned_file(svn_wc__db_t *db,
svn_boolean_t metadata_only,
svn_boolean_t conflicted,
svn_boolean_t is_move,
+ const svn_io_dirent2_t *dirent,
+ svn_filesize_t recorded_size,
+ apr_time_t recorded_time,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
@@ -210,8 +258,9 @@ copy_versioned_file(svn_wc__db_t *db,
svn_error_t *err;
/* Is there a text conflict at the source path? */
- SVN_ERR(svn_wc__db_read_conflict(&conflict, db, src_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ db, src_abspath,
+ scratch_pool, scratch_pool));
err = svn_wc__conflict_read_text_conflict(&conflict_working, NULL, NULL,
db, src_abspath, conflict,
@@ -248,6 +297,7 @@ copy_versioned_file(svn_wc__db_t *db,
dst_abspath, tmpdir_abspath,
TRUE /* file_copy */,
handle_as_unversioned /* unversioned */,
+ dirent, recorded_size, recorded_time,
cancel_func, cancel_baton,
scratch_pool, scratch_pool));
}
@@ -265,10 +315,6 @@ copy_versioned_file(svn_wc__db_t *db,
scratch_pool);
notify->kind = svn_node_file;
- /* When we notify that we performed a copy, make sure we already did */
- if (work_items != NULL)
- SVN_ERR(svn_wc__wq_run(db, dst_abspath,
- cancel_func, cancel_baton, scratch_pool));
(*notify_func)(notify_baton, notify, scratch_pool);
}
return SVN_NO_ERROR;
@@ -282,6 +328,8 @@ copy_versioned_file(svn_wc__db_t *db,
data in addition to copying the directory.
WITHIN_ONE_WC is TRUE if the copy/move is within a single working copy (root)
+
+ If DIRENT is not NULL, it contains the on-disk information of SRC_ABSPATH.
*/
static svn_error_t *
copy_versioned_dir(svn_wc__db_t *db,
@@ -291,6 +339,7 @@ copy_versioned_dir(svn_wc__db_t *db,
const char *tmpdir_abspath,
svn_boolean_t metadata_only,
svn_boolean_t is_move,
+ const svn_io_dirent2_t *dirent,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
@@ -314,6 +363,7 @@ copy_versioned_dir(svn_wc__db_t *db,
tmpdir_abspath,
FALSE /* file_copy */,
FALSE /* unversioned */,
+ dirent, SVN_INVALID_FILESIZE, 0,
cancel_func, cancel_baton,
scratch_pool, scratch_pool));
}
@@ -353,6 +403,7 @@ copy_versioned_dir(svn_wc__db_t *db,
SVN_ERR(svn_wc__db_read_children_info(&versioned_children,
&conflicted_children,
db, src_abspath,
+ FALSE /* base_tree_only */,
scratch_pool, iterpool));
for (hi = apr_hash_first(scratch_pool, versioned_children);
hi;
@@ -366,8 +417,8 @@ copy_versioned_dir(svn_wc__db_t *db,
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- child_name = svn__apr_hash_index_key(hi);
- info = svn__apr_hash_index_val(hi);
+ child_name = apr_hash_this_key(hi);
+ info = apr_hash_this_val(hi);
child_src_abspath = svn_dirent_join(src_abspath, child_name, iterpool);
child_dst_abspath = svn_dirent_join(dst_abspath, child_name, iterpool);
@@ -394,6 +445,12 @@ copy_versioned_dir(svn_wc__db_t *db,
tmpdir_abspath,
metadata_only, info->conflicted,
is_move,
+ disk_children
+ ? svn_hash_gets(disk_children,
+ child_name)
+ : NULL,
+ info->recorded_size,
+ info->recorded_time,
cancel_func, cancel_baton,
NULL, NULL,
iterpool));
@@ -403,6 +460,10 @@ copy_versioned_dir(svn_wc__db_t *db,
child_src_abspath, child_dst_abspath,
dst_op_root_abspath, tmpdir_abspath,
metadata_only, is_move,
+ disk_children
+ ? svn_hash_gets(disk_children,
+ child_name)
+ : NULL,
cancel_func, cancel_baton, NULL, NULL,
iterpool));
else
@@ -421,7 +482,7 @@ copy_versioned_dir(svn_wc__db_t *db,
child_dst_abspath, dst_op_root_abspath,
is_move, NULL, iterpool));
- /* Don't recurse on children while all we do is creating not-present
+ /* Don't recurse on children when all we do is creating not-present
children */
}
else if (info->status == svn_wc__db_status_incomplete)
@@ -467,7 +528,7 @@ copy_versioned_dir(svn_wc__db_t *db,
for (hi = apr_hash_first(scratch_pool, disk_children); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
+ const char *name = apr_hash_this_key(hi);
const char *unver_src_abspath, *unver_dst_abspath;
svn_skel_t *work_item;
@@ -488,6 +549,7 @@ copy_versioned_dir(svn_wc__db_t *db,
SVN_ERR(copy_to_tmpdir(&work_item, NULL, db, unver_src_abspath,
unver_dst_abspath, tmpdir_abspath,
TRUE /* recursive */, TRUE /* unversioned */,
+ NULL, SVN_INVALID_FILESIZE, 0,
cancel_func, cancel_baton,
scratch_pool, iterpool));
@@ -507,10 +569,10 @@ copy_versioned_dir(svn_wc__db_t *db,
* The additional parameter IS_MOVE indicates whether this is a copy or
* a move operation.
*
- * If MOVE_DEGRADED_TO_COPY is not NULL and a move had to be degraded
- * to a copy, then set *MOVE_DEGRADED_TO_COPY. */
+ * If RECORD_MOVE_ON_DELETE is not NULL and a move had to be degraded
+ * to a copy, then set *RECORD_MOVE_ON_DELETE to FALSE. */
static svn_error_t *
-copy_or_move(svn_boolean_t *move_degraded_to_copy,
+copy_or_move(svn_boolean_t *record_move_on_delete,
svn_wc_context_t *wc_ctx,
const char *src_abspath,
const char *dst_abspath,
@@ -533,6 +595,8 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
svn_boolean_t within_one_wc;
svn_wc__db_status_t src_status;
svn_error_t *err;
+ svn_filesize_t recorded_size;
+ apr_time_t recorded_time;
SVN_ERR_ASSERT(svn_dirent_is_absolute(src_abspath));
SVN_ERR_ASSERT(svn_dirent_is_absolute(dst_abspath));
@@ -550,7 +614,8 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
err = svn_wc__db_read_info(&src_status, &src_db_kind, NULL,
&src_repos_relpath, &src_repos_root_url,
&src_repos_uuid, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ &recorded_size, &recorded_time,
NULL, &conflicted, NULL, NULL, NULL, NULL,
NULL, NULL,
db, src_abspath, scratch_pool, scratch_pool);
@@ -643,10 +708,13 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
scratch_pool, scratch_pool));
else
/* If not added, the node must have a base or we can't copy */
- SVN_ERR(svn_wc__db_scan_base_repos(NULL, &src_repos_root_url,
- &src_repos_uuid,
- db, src_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL,
+ &src_repos_root_url,
+ &src_repos_uuid, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ db, src_abspath,
+ scratch_pool, scratch_pool));
}
if (!dst_repos_root_url)
@@ -660,10 +728,13 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
scratch_pool, scratch_pool));
else
/* If not added, the node must have a base or we can't copy */
- SVN_ERR(svn_wc__db_scan_base_repos(NULL, &dst_repos_root_url,
- &dst_repos_uuid,
- db, dstdir_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL,
+ &dst_repos_root_url,
+ &dst_repos_uuid, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ db, dstdir_abspath,
+ scratch_pool, scratch_pool));
}
if (strcmp(src_repos_root_url, dst_repos_root_url) != 0
@@ -751,8 +822,8 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
if (is_move
&& !within_one_wc)
{
- if (move_degraded_to_copy)
- *move_degraded_to_copy = TRUE;
+ if (record_move_on_delete)
+ *record_move_on_delete = FALSE;
is_move = FALSE;
}
@@ -768,6 +839,7 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
err = copy_versioned_file(db, src_abspath, dst_abspath, dst_abspath,
tmpdir_abspath,
metadata_only, conflicted, is_move,
+ NULL, recorded_size, recorded_time,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool);
@@ -795,14 +867,17 @@ copy_or_move(svn_boolean_t *move_degraded_to_copy,
scratch_pool),
min_rev, max_rev);
+#ifndef RECORD_MIXED_MOVE
is_move = FALSE;
- if (move_degraded_to_copy)
- *move_degraded_to_copy = TRUE;
+ if (record_move_on_delete)
+ *record_move_on_delete = FALSE;
+#endif
}
}
err = copy_versioned_dir(db, src_abspath, dst_abspath, dst_abspath,
tmpdir_abspath, metadata_only, is_move,
+ NULL /* dirent */,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool);
@@ -871,7 +946,8 @@ remove_node_conflict_markers(svn_wc__db_t *db,
{
svn_skel_t *conflict;
- SVN_ERR(svn_wc__db_read_conflict(&conflict, db, src_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ db, src_abspath,
scratch_pool, scratch_pool));
/* Do we have conflict markers that should be removed? */
@@ -923,6 +999,8 @@ static svn_error_t *
remove_all_conflict_markers(svn_wc__db_t *db,
const char *src_dir_abspath,
const char *dst_dir_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
@@ -936,14 +1014,18 @@ remove_all_conflict_markers(svn_wc__db_t *db,
artillery. */
SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts, db,
src_dir_abspath,
+ FALSE /* base_tree_only */,
scratch_pool, iterpool));
for (hi = apr_hash_first(scratch_pool, nodes);
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- struct svn_wc__db_info_t *info = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ struct svn_wc__db_info_t *info = apr_hash_this_val(hi);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
if (info->conflicted)
{
@@ -961,6 +1043,7 @@ remove_all_conflict_markers(svn_wc__db_t *db,
db,
svn_dirent_join(src_dir_abspath, name, iterpool),
svn_dirent_join(dst_dir_abspath, name, iterpool),
+ cancel_func, cancel_baton,
iterpool));
}
}
@@ -982,7 +1065,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx,
apr_pool_t *scratch_pool)
{
svn_wc__db_t *db = wc_ctx->db;
- svn_boolean_t move_degraded_to_copy = FALSE;
+ svn_boolean_t record_on_delete = TRUE;
svn_node_kind_t kind;
svn_boolean_t conflicted;
@@ -994,7 +1077,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx,
svn_dirent_dirname(dst_abspath, scratch_pool),
scratch_pool));
- SVN_ERR(copy_or_move(&move_degraded_to_copy,
+ SVN_ERR(copy_or_move(&record_on_delete,
wc_ctx, src_abspath, dst_abspath,
TRUE /* metadata_only */,
TRUE /* is_move */,
@@ -1018,7 +1101,25 @@ svn_wc__move2(svn_wc_context_t *wc_ctx,
is still in a valid state. So be careful when switching this over
to the workqueue. */
if (!metadata_only)
- SVN_ERR(svn_io_file_rename(src_abspath, dst_abspath, scratch_pool));
+ {
+ svn_error_t *err;
+
+ err = svn_error_trace(svn_io_file_rename(src_abspath, dst_abspath,
+ scratch_pool));
+
+ /* Let's try if we can keep wc.db consistent even when the move
+ fails. Deleting the target is a wc.db only operation, while
+ going forward (delaying the error) would try to change
+ conflict markers, which might also fail. */
+ if (err)
+ return svn_error_trace(
+ svn_error_compose_create(
+ err,
+ svn_wc__db_op_delete(wc_ctx->db, dst_abspath, NULL, TRUE,
+ NULL, NULL, cancel_func, cancel_baton,
+ NULL, NULL,
+ scratch_pool)));
+ }
SVN_ERR(svn_wc__db_read_info(NULL, &kind, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1030,6 +1131,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx,
if (kind == svn_node_dir)
SVN_ERR(remove_all_conflict_markers(db, src_abspath, dst_abspath,
+ cancel_func, cancel_baton,
scratch_pool));
if (conflicted)
@@ -1045,7 +1147,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx,
}
SVN_ERR(svn_wc__db_op_delete(db, src_abspath,
- move_degraded_to_copy ? NULL : dst_abspath,
+ record_on_delete ? dst_abspath : NULL,
TRUE /* delete_dir_externals */,
NULL /* conflict */, NULL /* work_items */,
cancel_func, cancel_baton,
diff --git a/subversion/libsvn_wc/crop.c b/subversion/libsvn_wc/crop.c
index a8d5ce2..3a46b42 100644
--- a/subversion/libsvn_wc/crop.c
+++ b/subversion/libsvn_wc/crop.c
@@ -53,7 +53,7 @@ crop_children(svn_wc__db_t *db,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
const apr_array_header_t *children;
apr_pool_t *iterpool;
@@ -65,7 +65,7 @@ crop_children(svn_wc__db_t *db,
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- iterpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(scratch_pool);
if (dir_depth == svn_depth_unknown)
dir_depth = svn_depth_infinity;
@@ -76,8 +76,8 @@ crop_children(svn_wc__db_t *db,
iterpool));
/* Looping over current directory's SVN entries: */
- SVN_ERR(svn_wc__db_read_children(&children, db, local_abspath, pool,
- iterpool));
+ SVN_ERR(svn_wc__db_base_get_children(&children, db, local_abspath,
+ scratch_pool, iterpool));
for (i = 0; i < children->nelts; i++)
{
@@ -86,6 +86,8 @@ crop_children(svn_wc__db_t *db,
svn_wc__db_status_t child_status;
svn_node_kind_t kind;
svn_depth_t child_depth;
+ svn_boolean_t have_work;
+ svn_depth_t remove_below;
svn_pool_clear(iterpool);
@@ -96,86 +98,80 @@ crop_children(svn_wc__db_t *db,
NULL,NULL, NULL, NULL, &child_depth,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, &have_work,
db, child_abspath, iterpool, iterpool));
- if (child_status == svn_wc__db_status_server_excluded ||
- child_status == svn_wc__db_status_excluded ||
- child_status == svn_wc__db_status_not_present)
+ if (have_work)
+ {
+ svn_boolean_t modified, all_deletes;
+
+ if (child_status != svn_wc__db_status_deleted)
+ continue; /* Leave local additions alone */
+
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ db, child_abspath, FALSE,
+ cancel_func, cancel_baton,
+ iterpool));
+
+ if (modified && !all_deletes)
+ continue; /* Something interesting is still there */
+ }
+
+ remove_below = (kind == svn_node_dir)
+ ? svn_depth_immediates
+ : svn_depth_files;
+
+ if ((child_status == svn_wc__db_status_server_excluded ||
+ child_status == svn_wc__db_status_excluded ||
+ child_status == svn_wc__db_status_not_present))
{
- svn_depth_t remove_below = (kind == svn_node_dir)
- ? svn_depth_immediates
- : svn_depth_files;
if (new_depth < remove_below)
SVN_ERR(svn_wc__db_base_remove(db, child_abspath,
FALSE /* keep_as_working */,
- FALSE /* queue_deletes */,
- FALSE /* remove_locks */,
+ FALSE, FALSE,
SVN_INVALID_REVNUM,
NULL, NULL, iterpool));
- continue;
+ continue; /* No recurse */
}
- else if (kind == svn_node_file)
+
+ if (new_depth < remove_below)
{
- if (new_depth == svn_depth_empty)
- SVN_ERR(svn_wc__db_op_remove_node(NULL,
- db, child_abspath,
- TRUE /* destroy */,
- FALSE /* destroy_changes */,
- SVN_INVALID_REVNUM,
- svn_wc__db_status_not_present,
- svn_node_none,
- NULL, NULL,
+ svn_boolean_t modified, all_deletes;
+
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ db, child_abspath, FALSE,
cancel_func, cancel_baton,
iterpool));
- else
- continue;
- }
- else if (kind == svn_node_dir)
- {
- if (new_depth < svn_depth_immediates)
- {
- SVN_ERR(svn_wc__db_op_remove_node(NULL,
- db, child_abspath,
- TRUE /* destroy */,
- FALSE /* destroy_changes */,
- SVN_INVALID_REVNUM,
- svn_wc__db_status_not_present,
- svn_node_none,
- NULL, NULL,
- cancel_func, cancel_baton,
- iterpool));
- }
- else
+ if (!modified || all_deletes)
{
- SVN_ERR(crop_children(db,
- child_abspath,
- child_depth,
- svn_depth_empty,
- notify_func,
- notify_baton,
- cancel_func,
- cancel_baton,
- iterpool));
- continue;
+ SVN_ERR(svn_wc__db_base_remove(db, child_abspath,
+ FALSE, FALSE, FALSE,
+ SVN_INVALID_REVNUM,
+ NULL, NULL, iterpool));
+ if (notify_func)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(child_abspath,
+ svn_wc_notify_delete,
+ iterpool);
+ (*notify_func)(notify_baton, notify, iterpool);
+ }
+
+ continue; /* No recurse */
}
- }
- else
- {
- return svn_error_createf
- (SVN_ERR_NODE_UNKNOWN_KIND, NULL, _("Unknown node kind for '%s'"),
- svn_dirent_local_style(child_abspath, iterpool));
+
+ /* Fall through: recurse:*/
}
- if (notify_func)
+ if (kind == svn_node_dir)
{
- svn_wc_notify_t *notify;
- notify = svn_wc_create_notify(child_abspath,
- svn_wc_notify_delete,
- iterpool);
- (*notify_func)(notify_baton, notify, iterpool);
+ SVN_ERR(crop_children(db, child_abspath,
+ child_depth, svn_depth_empty,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton,
+ iterpool));
}
}
@@ -197,6 +193,8 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
svn_wc__db_status_t status;
svn_node_kind_t kind;
svn_revnum_t revision;
+ svn_depth_t depth;
+ svn_boolean_t modified, all_deletes;
const char *repos_relpath, *repos_root, *repos_uuid;
SVN_ERR(svn_wc__db_is_switched(&is_root, &is_switched, NULL,
@@ -221,7 +219,7 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
SVN_ERR(svn_wc__db_read_info(&status, &kind, &revision, &repos_relpath,
&repos_root, &repos_uuid, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ &depth, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL,
wc_ctx->db, local_abspath,
@@ -258,29 +256,41 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
break; /* Ok to exclude */
}
- /* Remove all working copy data below local_abspath */
- SVN_ERR(svn_wc__db_op_remove_node(NULL,
- wc_ctx->db, local_abspath,
- TRUE /* destroy */,
- FALSE /* destroy_changes */,
- revision,
- svn_wc__db_status_excluded,
- kind,
- NULL, NULL,
- cancel_func, cancel_baton,
- scratch_pool));
-
- SVN_ERR(svn_wc__wq_run(wc_ctx->db, local_abspath,
- cancel_func, cancel_baton,
- scratch_pool));
-
- if (notify_func)
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ wc_ctx->db, local_abspath, FALSE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ if (!modified || all_deletes)
+ {
+ /* Remove all working copy data below local_abspath */
+ SVN_ERR(svn_wc__db_base_remove(wc_ctx->db, local_abspath,
+ FALSE /* keep_working */,
+ FALSE, TRUE,
+ revision,
+ NULL, NULL,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__wq_run(wc_ctx->db, local_abspath,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ if (notify_func)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(local_abspath,
+ svn_wc_notify_exclude,
+ scratch_pool);
+ notify_func(notify_baton, notify, scratch_pool);
+ }
+ }
+ else
{
- svn_wc_notify_t *notify;
- notify = svn_wc_create_notify(local_abspath,
- svn_wc_notify_exclude,
- scratch_pool);
- notify_func(notify_baton, notify, scratch_pool);
+ /* Do the next best thing: retry below this path */
+ SVN_ERR(crop_children(wc_ctx->db, local_abspath, depth, svn_depth_empty,
+ notify_func, notify_baton,
+ cancel_func, cancel_baton,
+ scratch_pool));
}
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_wc/delete.c b/subversion/libsvn_wc/delete.c
index 37c8af0..82ae938 100644
--- a/subversion/libsvn_wc/delete.c
+++ b/subversion/libsvn_wc/delete.c
@@ -135,7 +135,8 @@ create_delete_wq_items(svn_skel_t **work_items,
const apr_array_header_t *markers;
int i;
- SVN_ERR(svn_wc__db_read_conflict(&conflict, db, local_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ db, local_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__conflict_read_markers(&markers, db, local_abspath,
@@ -431,9 +432,6 @@ svn_wc__internal_remove_from_revision_control(svn_wc__db_t *db,
db, local_abspath,
destroy_wf /* destroy_wc */,
destroy_wf /* destroy_changes */,
- SVN_INVALID_REVNUM,
- svn_wc__db_status_not_present,
- svn_node_none,
NULL, NULL,
cancel_func, cancel_baton,
scratch_pool));
diff --git a/subversion/libsvn_wc/deprecated.c b/subversion/libsvn_wc/deprecated.c
index 79cdb30..dcb5e42 100644
--- a/subversion/libsvn_wc/deprecated.c
+++ b/subversion/libsvn_wc/deprecated.c
@@ -127,7 +127,7 @@ gather_traversal_info(svn_wc_context_t *wc_ctx,
hi;
hi = apr_hash_next(hi))
{
- const char *node_abspath = svn__apr_hash_index_key(hi);
+ const char *node_abspath = apr_hash_this_key(hi);
const char *relpath;
relpath = svn_dirent_join(path,
@@ -137,11 +137,11 @@ gather_traversal_info(svn_wc_context_t *wc_ctx,
if (gather_as_old)
svn_hash_sets(traversal_info->externals_old, relpath,
- svn__apr_hash_index_val(hi));
+ apr_hash_this_val(hi));
if (gather_as_new)
svn_hash_sets(traversal_info->externals_new, relpath,
- svn__apr_hash_index_val(hi));
+ apr_hash_this_val(hi));
svn_hash_sets(traversal_info->depths, relpath,
svn_hash_gets(ambient_depths, node_abspath));
@@ -652,6 +652,24 @@ svn_wc_get_pristine_contents(svn_stream_t **contents,
return svn_error_trace(svn_wc_context_destroy(wc_ctx));
}
+svn_error_t *
+svn_wc_queue_committed3(svn_wc_committed_queue_t *queue,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_boolean_t recurse,
+ 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)
+{
+ return svn_error_trace(
+ svn_wc_queue_committed4(queue, wc_ctx, local_abspath,
+ recurse, TRUE /* is_committed */,
+ wcprop_changes, remove_lock,
+ remove_changelist, sha1_checksum,
+ scratch_pool));
+}
svn_error_t *
svn_wc_queue_committed2(svn_wc_committed_queue_t *queue,
@@ -668,7 +686,9 @@ svn_wc_queue_committed2(svn_wc_committed_queue_t *queue,
const char *local_abspath;
const svn_checksum_t *sha1_checksum = NULL;
- SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL,
+ svn_wc__adm_get_db(adm_access),
+ scratch_pool));
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
if (md5_checksum != NULL)
@@ -759,15 +779,11 @@ svn_wc_process_committed4(const char *path,
const char *local_abspath;
const svn_checksum_t *md5_checksum;
const svn_checksum_t *sha1_checksum = NULL;
- apr_time_t new_date;
- apr_hash_t *wcprop_changes_hash;
+ svn_wc_context_t *wc_ctx;
+ svn_wc_committed_queue_t *queue;
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
-
- if (rev_date)
- SVN_ERR(svn_time_from_cstring(&new_date, rev_date, pool));
- else
- new_date = 0;
+ SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
if (digest)
md5_checksum = svn_checksum__from_digest_md5(digest, pool);
@@ -790,15 +806,20 @@ svn_wc_process_committed4(const char *path,
SVN_ERR(err);
}
- wcprop_changes_hash = svn_wc__prop_array_to_hash(wcprop_changes, pool);
- SVN_ERR(svn_wc__process_committed_internal(db, local_abspath, recurse, TRUE,
- new_revnum, new_date, rev_author,
- wcprop_changes_hash,
- !remove_lock, !remove_changelist,
- sha1_checksum, NULL, pool));
+ queue = svn_wc_committed_queue_create(pool);
+ SVN_ERR(svn_wc_queue_committed3(queue, wc_ctx, local_abspath, recurse,
+ wcprop_changes, remove_lock,
+ remove_changelist,
+ sha1_checksum /* or NULL if not modified
+ or directory */,
+ pool));
+
+ SVN_ERR(svn_wc_process_committed_queue2(queue, wc_ctx,
+ new_revnum, rev_date, rev_author,
+ NULL, NULL /* cancel */,
+ pool));
- /* Run the log file(s) we just created. */
- return svn_error_trace(svn_wc__wq_run(db, local_abspath, NULL, NULL, pool));
+ return svn_error_trace(svn_wc_context_destroy(wc_ctx));
}
@@ -925,6 +946,19 @@ svn_wc_delete(const char *path,
}
svn_error_t *
+svn_wc_add_from_disk2(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ const apr_hash_t *props,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(svn_wc_add_from_disk3(wc_ctx, local_abspath, props, FALSE,
+ notify_func, notify_baton, scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_wc_add_from_disk(svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_wc_notify_func2_t notify_func,
@@ -1025,6 +1059,30 @@ svn_wc_add(const char *path,
compat_call_notify_func, &nb, pool);
}
+/*** From revert.c ***/
+svn_error_t *
+svn_wc_revert4(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_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_wc_revert5(wc_ctx, local_abspath,
+ depth,
+ use_commit_times,
+ changelist_filter,
+ FALSE /* clear_changelists */,
+ FALSE /* metadata_only */,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ scratch_pool));
+}
+
svn_error_t *
svn_wc_revert3(const char *path,
svn_wc_adm_access_t *parent_access,
@@ -1966,16 +2024,37 @@ svn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ const svn_diff_tree_processor_t *diff_processor;
+
+ /* --git implies --show-copies-as-adds */
+ if (use_git_diff_format)
+ show_copies_as_adds = TRUE;
+
+ /* --show-copies-as-adds implies --notice-ancestry */
+ if (show_copies_as_adds)
+ ignore_ancestry = FALSE;
+
+ SVN_ERR(svn_wc__wrap_diff_callbacks(&diff_processor,
+ callbacks, callback_baton, TRUE,
+ result_pool, scratch_pool));
+
+ if (reverse_order)
+ diff_processor = svn_diff__tree_processor_reverse_create(
+ diff_processor, NULL, result_pool);
+
+ if (! show_copies_as_adds)
+ diff_processor = svn_diff__tree_processor_copy_as_changed_create(
+ diff_processor, result_pool);
+
return svn_error_trace(
svn_wc__get_diff_editor(editor, edit_baton,
wc_ctx,
anchor_abspath, target,
depth,
- ignore_ancestry, show_copies_as_adds,
- use_git_diff_format, use_text_base,
+ ignore_ancestry, use_text_base,
reverse_order, server_performs_filtering,
changelist_filter,
- callbacks, callback_baton,
+ diff_processor,
cancel_func, cancel_baton,
result_pool, scratch_pool));
}
@@ -2633,6 +2712,146 @@ svn_wc_props_modified_p(svn_boolean_t *modified_p,
}
+svn_error_t *
+svn_wc__status2_from_3(svn_wc_status2_t **status,
+ const svn_wc_status3_t *old_status,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const svn_wc_entry_t *entry = NULL;
+
+ if (old_status == NULL)
+ {
+ *status = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ *status = apr_pcalloc(result_pool, sizeof(**status));
+
+ if (old_status->versioned)
+ {
+ svn_error_t *err;
+ err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE,
+ svn_node_unknown, result_pool, scratch_pool);
+
+ if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
+ svn_error_clear(err);
+ else
+ SVN_ERR(err);
+ }
+
+ (*status)->entry = entry;
+ (*status)->copied = old_status->copied;
+ (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool);
+
+ if (old_status->repos_relpath)
+ (*status)->url = svn_path_url_add_component2(old_status->repos_root_url,
+ old_status->repos_relpath,
+ result_pool);
+ (*status)->ood_last_cmt_rev = old_status->ood_changed_rev;
+ (*status)->ood_last_cmt_date = old_status->ood_changed_date;
+ (*status)->ood_kind = old_status->ood_kind;
+ (*status)->ood_last_cmt_author = old_status->ood_changed_author;
+
+ if (old_status->conflicted)
+ {
+ const svn_wc_conflict_description2_t *tree_conflict2;
+ SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict2, wc_ctx, local_abspath,
+ scratch_pool, scratch_pool));
+ (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict2, result_pool);
+ }
+
+ (*status)->switched = old_status->switched;
+
+ (*status)->text_status = old_status->node_status;
+ (*status)->prop_status = old_status->prop_status;
+
+ (*status)->repos_text_status = old_status->repos_node_status;
+ (*status)->repos_prop_status = old_status->repos_prop_status;
+
+ /* Some values might be inherited from properties */
+ if (old_status->node_status == svn_wc_status_modified
+ || old_status->node_status == svn_wc_status_conflicted)
+ (*status)->text_status = old_status->text_status;
+
+ /* (Currently a no-op, but just make sure it is ok) */
+ if (old_status->repos_node_status == svn_wc_status_modified
+ || old_status->repos_node_status == svn_wc_status_conflicted)
+ (*status)->repos_text_status = old_status->repos_text_status;
+
+ if (old_status->node_status == svn_wc_status_added)
+ (*status)->prop_status = svn_wc_status_none; /* No separate info */
+
+ /* Find pristine_text_status value */
+ switch (old_status->text_status)
+ {
+ case svn_wc_status_none:
+ case svn_wc_status_normal:
+ case svn_wc_status_modified:
+ (*status)->pristine_text_status = old_status->text_status;
+ break;
+ case svn_wc_status_conflicted:
+ default:
+ /* ### Fetch compare data, or fall back to the documented
+ not retrieved behavior? */
+ (*status)->pristine_text_status = svn_wc_status_none;
+ break;
+ }
+
+ /* Find pristine_prop_status value */
+ switch (old_status->prop_status)
+ {
+ case svn_wc_status_none:
+ case svn_wc_status_normal:
+ case svn_wc_status_modified:
+ if (old_status->node_status != svn_wc_status_added
+ && old_status->node_status != svn_wc_status_deleted
+ && old_status->node_status != svn_wc_status_replaced)
+ {
+ (*status)->pristine_prop_status = old_status->prop_status;
+ }
+ else
+ (*status)->pristine_prop_status = svn_wc_status_none;
+ break;
+ case svn_wc_status_conflicted:
+ default:
+ /* ### Fetch compare data, or fall back to the documented
+ not retrieved behavior? */
+ (*status)->pristine_prop_status = svn_wc_status_none;
+ break;
+ }
+
+ if (old_status->versioned
+ && old_status->conflicted
+ && old_status->node_status != svn_wc_status_obstructed
+ && (old_status->kind == svn_node_file
+ || old_status->node_status != svn_wc_status_missing))
+ {
+ svn_boolean_t text_conflict_p, prop_conflict_p;
+
+ /* The entry says there was a conflict, but the user might have
+ marked it as resolved by deleting the artifact files, so check
+ for that. */
+ SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p,
+ &prop_conflict_p,
+ NULL,
+ wc_ctx->db, local_abspath,
+ scratch_pool));
+
+ if (text_conflict_p)
+ (*status)->text_status = svn_wc_status_conflicted;
+
+ if (prop_conflict_p)
+ (*status)->prop_status = svn_wc_status_conflicted;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+
/*** From status.c ***/
struct status4_wrapper_baton
@@ -2698,9 +2917,9 @@ svn_wc_get_status_editor5(const svn_delta_editor_t **editor,
wc_ctx,
anchor_abspath,
target_basename,
- depth,
- get_all, no_ignore,
- depth_as_sticky,
+ depth, get_all,
+ TRUE, /* check_working_copy */
+ no_ignore, depth_as_sticky,
server_performs_filtering,
ignore_patterns,
status_func, status_baton,
@@ -4044,7 +4263,26 @@ svn_wc_relocate(const char *path,
}
-/*** From log.c ***/
+/*** From log.c / cleanup.c ***/
+
+svn_error_t *
+svn_wc_cleanup3(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ svn_wc_cleanup4(wc_ctx,
+ local_abspath,
+ TRUE /* break_locks */,
+ TRUE /* fix_recorded_timestamps */,
+ TRUE /* clear_dav_cache */,
+ TRUE /* clean_pristines */,
+ cancel_func, cancel_baton,
+ NULL, NULL /* notify */,
+ scratch_pool));
+}
svn_error_t *
svn_wc_cleanup2(const char *path,
@@ -4570,13 +4808,11 @@ svn_wc_read_kind(svn_node_kind_t *kind,
TRUE /* show_deleted */,
show_hidden,
scratch_pool));
+}
- /*if (db_kind == svn_node_dir)
- *kind = svn_node_dir;
- else if (db_kind == svn_node_file || db_kind == svn_node_symlink)
- *kind = svn_node_file;
- else
- *kind = svn_node_none;*/
-
- return SVN_NO_ERROR;
+svn_wc_conflict_description2_t *
+svn_wc__conflict_description2_dup(const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *pool)
+{
+ return svn_wc_conflict_description2_dup(conflict, pool);
}
diff --git a/subversion/libsvn_wc/diff.h b/subversion/libsvn_wc/diff.h
index 3ddada6..2df88e1 100644
--- a/subversion/libsvn_wc/diff.h
+++ b/subversion/libsvn_wc/diff.h
@@ -39,7 +39,7 @@ extern "C" {
#endif /* __cplusplus */
/* A function to diff locally added and locally copied files.
-
+
Reports the file LOCAL_ABSPATH as ADDED file with relpath RELPATH to
PROCESSOR with as parent baton PROCESSOR_PARENT_BATON.
@@ -60,7 +60,7 @@ svn_wc__diff_local_only_file(svn_wc__db_t *db,
apr_pool_t *scratch_pool);
/* A function to diff locally added and locally copied directories.
-
+
Reports the directory LOCAL_ABSPATH and everything below it (limited by
DEPTH) as added with relpath RELPATH to PROCESSOR with as parent baton
PROCESSOR_PARENT_BATON.
diff --git a/subversion/libsvn_wc/diff_editor.c b/subversion/libsvn_wc/diff_editor.c
index c9078ed..fc059a5 100644
--- a/subversion/libsvn_wc/diff_editor.c
+++ b/subversion/libsvn_wc/diff_editor.c
@@ -64,10 +64,11 @@
#include "svn_hash.h"
#include "svn_sorts.h"
-#include "private/svn_subr_private.h"
-#include "private/svn_wc_private.h"
#include "private/svn_diff_tree.h"
#include "private/svn_editor.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_subr_private.h"
+#include "private/svn_wc_private.h"
#include "wc.h"
#include "props.h"
@@ -241,10 +242,9 @@ make_edit_baton(struct edit_baton_t **edit_baton,
svn_wc__db_t *db,
const char *anchor_abspath,
const char *target,
- const svn_diff_tree_processor_t *processor,
+ const svn_diff_tree_processor_t *diff_processor,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
svn_boolean_t use_text_base,
svn_boolean_t reverse_order,
svn_cancel_func_t cancel_func,
@@ -255,22 +255,11 @@ make_edit_baton(struct edit_baton_t **edit_baton,
SVN_ERR_ASSERT(svn_dirent_is_absolute(anchor_abspath));
- if (reverse_order)
- processor = svn_diff__tree_processor_reverse_create(processor, NULL, pool);
-
- /* --show-copies-as-adds implies --notice-ancestry */
- if (show_copies_as_adds)
- ignore_ancestry = FALSE;
-
- if (! show_copies_as_adds)
- processor = svn_diff__tree_processor_copy_as_changed_create(processor,
- pool);
-
eb = apr_pcalloc(pool, sizeof(*eb));
eb->db = db;
eb->anchor_abspath = apr_pstrdup(pool, anchor_abspath);
eb->target = apr_pstrdup(pool, target);
- eb->processor = processor;
+ eb->processor = diff_processor;
eb->depth = depth;
eb->ignore_ancestry = ignore_ancestry;
eb->local_before_remote = reverse_order;
@@ -566,6 +555,7 @@ ensure_local_info(struct dir_baton_t *db,
SVN_ERR(svn_wc__db_read_children_info(&db->local_info, &conflicts,
db->eb->db, db->local_abspath,
+ FALSE /* base_tree_only */,
db->pool, scratch_pool));
return SVN_NO_ERROR;
@@ -655,6 +645,7 @@ walk_local_nodes_diff(struct edit_baton_t *eb,
SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts,
db, local_abspath,
+ FALSE /* base_tree_only */,
scratch_pool, iterpool));
children = svn_sort__hash(nodes, svn_sort_compare_items_lexically,
@@ -703,6 +694,9 @@ walk_local_nodes_diff(struct edit_baton_t *eb,
if (!info->have_base)
{
local_only = TRUE; /* Only report additions */
+
+ if (info->status == svn_wc__db_status_deleted)
+ continue; /* Nothing added (deleted copy) */
}
else if (info->status == svn_wc__db_status_normal)
{
@@ -1042,9 +1036,6 @@ svn_wc__diff_local_only_dir(svn_wc__db_t *db,
svn_boolean_t skip_children = FALSE;
svn_diff_source_t *right_src = svn_diff__source_create(SVN_INVALID_REVNUM,
scratch_pool);
- svn_depth_t depth_below_here = depth;
- apr_hash_t *nodes;
- apr_hash_t *conflicts;
SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1098,70 +1089,82 @@ svn_wc__diff_local_only_dir(svn_wc__db_t *db,
processor_parent_baton,
processor,
scratch_pool, iterpool));
- /* ### skip_children is not used */
-
- SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts, db, local_abspath,
- scratch_pool, iterpool));
-
- if (depth_below_here == svn_depth_immediates)
- depth_below_here = svn_depth_empty;
- children = svn_sort__hash(nodes, svn_sort_compare_items_lexically,
- scratch_pool);
-
- for (i = 0; i < children->nelts; i++)
+ if ((depth > svn_depth_empty || depth == svn_depth_unknown)
+ && ! skip_children)
{
- svn_sort__item_t *item = &APR_ARRAY_IDX(children, i, svn_sort__item_t);
- const char *name = item->key;
- struct svn_wc__db_info_t *info = item->value;
- const char *child_abspath;
- const char *child_relpath;
+ svn_depth_t depth_below_here = depth;
+ apr_hash_t *nodes;
+ apr_hash_t *conflicts;
- svn_pool_clear(iterpool);
+ if (depth_below_here == svn_depth_immediates)
+ depth_below_here = svn_depth_empty;
+
+ SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts,
+ db, local_abspath,
+ FALSE /* base_tree_only */,
+ scratch_pool, iterpool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
- child_abspath = svn_dirent_join(local_abspath, name, iterpool);
+ children = svn_sort__hash(nodes, svn_sort_compare_items_lexically,
+ scratch_pool);
- if (NOT_PRESENT(info->status))
+ for (i = 0; i < children->nelts; i++)
{
- continue;
- }
+ svn_sort__item_t *item = &APR_ARRAY_IDX(children, i, svn_sort__item_t);
+ const char *name = item->key;
+ struct svn_wc__db_info_t *info = item->value;
+ const char *child_abspath;
+ const char *child_relpath;
- /* If comparing against WORKING, skip entries that are
- schedule-deleted - they don't really exist. */
- if (!diff_pristine && info->status == svn_wc__db_status_deleted)
- continue;
+ svn_pool_clear(iterpool);
- child_relpath = svn_relpath_join(relpath, name, iterpool);
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
- switch (info->kind)
- {
- case svn_node_file:
- case svn_node_symlink:
- SVN_ERR(svn_wc__diff_local_only_file(db, child_abspath,
- child_relpath,
- processor, pdb,
- diff_pristine,
- cancel_func, cancel_baton,
- scratch_pool));
- break;
+ child_abspath = svn_dirent_join(local_abspath, name, iterpool);
- case svn_node_dir:
- if (depth > svn_depth_files || depth == svn_depth_unknown)
+ if (NOT_PRESENT(info->status))
{
- SVN_ERR(svn_wc__diff_local_only_dir(db, child_abspath,
- child_relpath, depth_below_here,
- processor, pdb,
- diff_pristine,
- cancel_func, cancel_baton,
- iterpool));
+ continue;
}
- break;
- default:
- break;
+ /* If comparing against WORKING, skip entries that are
+ schedule-deleted - they don't really exist. */
+ if (!diff_pristine && info->status == svn_wc__db_status_deleted)
+ continue;
+
+ child_relpath = svn_relpath_join(relpath, name, iterpool);
+
+ switch (info->kind)
+ {
+ case svn_node_file:
+ case svn_node_symlink:
+ SVN_ERR(svn_wc__diff_local_only_file(db, child_abspath,
+ child_relpath,
+ processor, pdb,
+ diff_pristine,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ break;
+
+ case svn_node_dir:
+ if (depth > svn_depth_files || depth == svn_depth_unknown)
+ {
+ SVN_ERR(svn_wc__diff_local_only_dir(db, child_abspath,
+ child_relpath,
+ depth_below_here,
+ processor, pdb,
+ diff_pristine,
+ cancel_func,
+ cancel_baton,
+ iterpool));
+ }
+ break;
+
+ default:
+ break;
+ }
}
}
@@ -2193,7 +2196,7 @@ change_file_prop(void *file_baton,
propchange = apr_array_push(fb->propchanges);
propchange->name = apr_pstrdup(fb->pool, name);
- propchange->value = value ? svn_string_dup(value, fb->pool) : NULL;
+ propchange->value = svn_string_dup(value, fb->pool);
return SVN_NO_ERROR;
}
@@ -2218,7 +2221,7 @@ change_dir_prop(void *dir_baton,
propchange = apr_array_push(db->propchanges);
propchange->name = apr_pstrdup(db->pool, name);
- propchange->value = value ? svn_string_dup(value, db->pool) : NULL;
+ propchange->value = svn_string_dup(value, db->pool);
return SVN_NO_ERROR;
}
@@ -2257,14 +2260,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,
@@ -2277,18 +2277,9 @@ svn_wc__get_diff_editor(const svn_delta_editor_t **editor,
struct svn_wc__shim_fetch_baton_t *sfb;
svn_delta_shim_callbacks_t *shim_callbacks =
svn_delta_shim_callbacks_default(result_pool);
- const svn_diff_tree_processor_t *diff_processor;
SVN_ERR_ASSERT(svn_dirent_is_absolute(anchor_abspath));
- /* --git implies --show-copies-as-adds */
- if (use_git_diff_format)
- show_copies_as_adds = TRUE;
-
- SVN_ERR(svn_wc__wrap_diff_callbacks(&diff_processor,
- callbacks, callback_baton, TRUE,
- result_pool, scratch_pool));
-
/* Apply changelist filtering to the output */
if (changelist_filter && changelist_filter->nelts)
{
@@ -2305,7 +2296,7 @@ svn_wc__get_diff_editor(const svn_delta_editor_t **editor,
wc_ctx->db,
anchor_abspath, target,
diff_processor,
- depth, ignore_ancestry, show_copies_as_adds,
+ depth, ignore_ancestry,
use_text_base, reverse_order,
cancel_func, cancel_baton,
result_pool));
@@ -2458,8 +2449,8 @@ wrap_dir_opened(void **new_dir_baton,
/* svn_diff_tree_processor_t function */
static svn_error_t *
wrap_dir_added(const char *relpath,
- const svn_diff_source_t *right_source,
const svn_diff_source_t *copyfrom_source,
+ const svn_diff_source_t *right_source,
/*const*/ apr_hash_t *copyfrom_props,
/*const*/ apr_hash_t *right_props,
void *dir_baton,
diff --git a/subversion/libsvn_wc/diff_local.c b/subversion/libsvn_wc/diff_local.c
index 22b498f..e1cb329 100644
--- a/subversion/libsvn_wc/diff_local.c
+++ b/subversion/libsvn_wc/diff_local.c
@@ -1,6 +1,6 @@
/*
- * diff_pristine.c -- A simple diff walker which compares local files against
- * their pristine versions.
+ * diff_local.c -- A simple diff walker which compares local files against
+ * their pristine versions.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -41,8 +41,8 @@
#include "private/svn_diff_tree.h"
#include "wc.h"
+#include "wc_db.h"
#include "props.h"
-#include "translate.h"
#include "diff.h"
#include "svn_private_config.h"
@@ -89,9 +89,6 @@ struct diff_baton
/* Should this diff ignore node ancestry? */
svn_boolean_t ignore_ancestry;
- /* Should this diff not compare copied files with their source? */
- svn_boolean_t show_copies_as_adds;
-
/* Cancel function/baton */
svn_cancel_func_t cancel_func;
void *cancel_baton;
@@ -119,17 +116,17 @@ ensure_state(struct diff_baton *eb,
if (! relpath)
return SVN_NO_ERROR;
- /* Don't recurse on the anchor, as that might loop infinately because
+ /* Don't recurse on the anchor, as that might loop infinitely because
svn_dirent_dirname("/",...) -> "/"
svn_dirent_dirname("C:/",...) -> "C:/" (Windows) */
if (*relpath)
SVN_ERR(ensure_state(eb,
- svn_dirent_dirname(local_abspath,scratch_pool),
+ svn_dirent_dirname(local_abspath, scratch_pool),
FALSE,
scratch_pool));
}
else if (svn_dirent_is_child(eb->cur->local_abspath, local_abspath, NULL))
- SVN_ERR(ensure_state(eb, svn_dirent_dirname(local_abspath,scratch_pool),
+ SVN_ERR(ensure_state(eb, svn_dirent_dirname(local_abspath, scratch_pool),
FALSE,
scratch_pool));
else
@@ -421,23 +418,22 @@ diff_status_callback(void *baton,
/* Public Interface */
svn_error_t *
-svn_wc_diff6(svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *callback_baton,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t use_git_diff_format,
- const apr_array_header_t *changelist_filter,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
+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)
{
struct diff_baton eb = { 0 };
svn_node_kind_t kind;
svn_boolean_t get_all;
- const svn_diff_tree_processor_t *processor;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR(svn_wc__db_read_kind(&kind, wc_ctx->db, local_abspath,
@@ -446,30 +442,27 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
FALSE /* show_hidden */,
scratch_pool));
- if (kind == svn_node_dir)
- eb.anchor_abspath = local_abspath;
- else
- eb.anchor_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
-
- SVN_ERR(svn_wc__wrap_diff_callbacks(&processor,
- callbacks, callback_baton, TRUE,
- scratch_pool, scratch_pool));
-
- if (use_git_diff_format)
- show_copies_as_adds = TRUE;
- if (show_copies_as_adds)
- ignore_ancestry = FALSE;
+ eb.anchor_abspath = local_abspath;
+ if (root_relpath)
+ {
+ svn_boolean_t is_wcroot;
+ SVN_ERR(svn_wc__db_is_wcroot(&is_wcroot,
+ wc_ctx->db, local_abspath, scratch_pool));
- /*
- if (reverse_order)
- processor = svn_diff__tree_processor_reverse_create(processor, NULL, pool);
- */
+ if (!is_wcroot)
+ eb.anchor_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
+ }
+ else if (kind != svn_node_dir)
+ eb.anchor_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
- if (! show_copies_as_adds && !use_git_diff_format)
- processor = svn_diff__tree_processor_copy_as_changed_create(processor,
- scratch_pool);
+ if (root_relpath)
+ *root_relpath = apr_pstrdup(result_pool,
+ svn_dirent_skip_ancestor(eb.anchor_abspath,
+ local_abspath));
+ if (root_is_dir)
+ *root_is_dir = (kind == svn_node_dir);
/* Apply changelist filtering to the output */
if (changelist_filter && changelist_filter->nelts)
@@ -477,19 +470,18 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
apr_hash_t *changelist_hash;
SVN_ERR(svn_hash_from_cstring_keys(&changelist_hash, changelist_filter,
- scratch_pool));
- processor = svn_wc__changelist_filter_tree_processor_create(
- processor, wc_ctx, local_abspath,
- changelist_hash, scratch_pool);
+ result_pool));
+ diff_processor = svn_wc__changelist_filter_tree_processor_create(
+ diff_processor, wc_ctx, local_abspath,
+ changelist_hash, result_pool);
}
eb.db = wc_ctx->db;
- eb.processor = processor;
+ eb.processor = diff_processor;
eb.ignore_ancestry = ignore_ancestry;
- eb.show_copies_as_adds = show_copies_as_adds;
eb.pool = scratch_pool;
- if (show_copies_as_adds || use_git_diff_format || !ignore_ancestry)
+ if (ignore_ancestry)
get_all = TRUE; /* We need unmodified descendants of copies */
else
get_all = FALSE;
@@ -512,22 +504,22 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
if (!ns->skip)
{
if (ns->propchanges)
- SVN_ERR(processor->dir_changed(ns->relpath,
- ns->left_src,
- ns->right_src,
- ns->left_props,
- ns->right_props,
- ns->propchanges,
- ns->baton,
- processor,
- ns->pool));
+ SVN_ERR(diff_processor->dir_changed(ns->relpath,
+ ns->left_src,
+ ns->right_src,
+ ns->left_props,
+ ns->right_props,
+ ns->propchanges,
+ ns->baton,
+ diff_processor,
+ ns->pool));
else
- SVN_ERR(processor->dir_closed(ns->relpath,
- ns->left_src,
- ns->right_src,
- ns->baton,
- processor,
- ns->pool));
+ SVN_ERR(diff_processor->dir_closed(ns->relpath,
+ ns->left_src,
+ ns->right_src,
+ ns->baton,
+ diff_processor,
+ ns->pool));
}
eb.cur = ns->parent;
svn_pool_clear(ns->pool);
@@ -535,3 +527,43 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
return SVN_NO_ERROR;
}
+
+svn_error_t *
+svn_wc_diff6(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ const svn_wc_diff_callbacks4_t *callbacks,
+ void *callback_baton,
+ svn_depth_t depth,
+ svn_boolean_t ignore_ancestry,
+ svn_boolean_t show_copies_as_adds,
+ svn_boolean_t use_git_diff_format,
+ const apr_array_header_t *changelist_filter,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const svn_diff_tree_processor_t *processor;
+
+ SVN_ERR(svn_wc__wrap_diff_callbacks(&processor,
+ callbacks, callback_baton, TRUE,
+ scratch_pool, scratch_pool));
+
+ if (use_git_diff_format)
+ show_copies_as_adds = TRUE;
+ if (show_copies_as_adds)
+ ignore_ancestry = FALSE;
+
+ if (! show_copies_as_adds && !use_git_diff_format)
+ processor = svn_diff__tree_processor_copy_as_changed_create(processor,
+ scratch_pool);
+
+ return svn_error_trace(svn_wc__diff7(NULL, NULL,
+ wc_ctx, local_abspath,
+ depth,
+ ignore_ancestry,
+ changelist_filter,
+ processor,
+ cancel_func, cancel_baton,
+ scratch_pool, scratch_pool));
+}
+
diff --git a/subversion/libsvn_wc/entries.c b/subversion/libsvn_wc/entries.c
index 24dae50..1be6a8b 100644
--- a/subversion/libsvn_wc/entries.c
+++ b/subversion/libsvn_wc/entries.c
@@ -45,9 +45,14 @@
#include "wc_db.h"
#include "wc-queries.h" /* for STMT_* */
+#define SVN_WC__I_AM_WC_DB
+
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
#include "private/svn_sqlite.h"
+#include "token-map.h"
+
+#include "wc_db_private.h"
#define MAYBE_ALLOC(x,p) ((x) ? (x) : apr_pcalloc((p), sizeof(*(x))))
@@ -213,6 +218,8 @@ get_info_for_deleted(svn_wc_entry_t *entry,
svn_wc__db_lock_t **lock,
svn_wc__db_t *db,
const char *entry_abspath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *entry_relpath,
const svn_wc_entry_t *parent_entry,
svn_boolean_t have_base,
svn_boolean_t have_more_work,
@@ -221,12 +228,13 @@ get_info_for_deleted(svn_wc_entry_t *entry,
{
if (have_base && !have_more_work)
{
+ apr_int64_t repos_id;
/* This is the delete of a BASE node */
- SVN_ERR(svn_wc__db_base_get_info(NULL, kind,
+ SVN_ERR(svn_wc__db_base_get_info_internal(
+ NULL, kind,
&entry->revision,
repos_relpath,
- &entry->repos,
- &entry->uuid,
+ &repos_id,
&entry->cmt_rev,
&entry->cmt_date,
&entry->cmt_author,
@@ -236,16 +244,18 @@ get_info_for_deleted(svn_wc_entry_t *entry,
lock,
&entry->has_props, NULL,
NULL,
- db,
- entry_abspath,
+ wcroot, entry_relpath,
result_pool,
scratch_pool));
+ SVN_ERR(svn_wc__db_fetch_repos_info(&entry->repos, &entry->uuid,
+ wcroot, repos_id, result_pool));
}
else
{
- const char *work_del_abspath;
+ const char *work_del_relpath;
const char *parent_repos_relpath;
- const char *parent_abspath;
+ const char *parent_relpath;
+ apr_int64_t repos_id;
/* This is a deleted child of a copy/move-here,
so we need to scan up the WORKING tree to find the root of
@@ -265,30 +275,33 @@ get_info_for_deleted(svn_wc_entry_t *entry,
scratch_pool));
/* working_size and text_time unavailable */
- SVN_ERR(svn_wc__db_scan_deletion(NULL,
+ SVN_ERR(svn_wc__db_scan_deletion_internal(
NULL,
- &work_del_abspath, NULL,
- db, entry_abspath,
+ NULL,
+ &work_del_relpath, NULL,
+ wcroot, entry_relpath,
scratch_pool, scratch_pool));
- SVN_ERR_ASSERT(work_del_abspath != NULL);
- parent_abspath = svn_dirent_dirname(work_del_abspath, scratch_pool);
+ SVN_ERR_ASSERT(work_del_relpath != NULL);
+ parent_relpath = svn_relpath_dirname(work_del_relpath, scratch_pool);
/* The parent directory of the delete root must be added, so we
can find the required information there */
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL,
+ SVN_ERR(svn_wc__db_scan_addition_internal(
+ NULL, NULL,
&parent_repos_relpath,
- &entry->repos,
- &entry->uuid,
- NULL, NULL, NULL, NULL,
- db, parent_abspath,
+ &repos_id,
+ NULL, NULL, NULL,
+ wcroot, parent_relpath,
result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_fetch_repos_info(&entry->repos, &entry->uuid,
+ wcroot, repos_id, result_pool));
/* Now glue it all together */
*repos_relpath = svn_relpath_join(parent_repos_relpath,
- svn_dirent_is_child(parent_abspath,
- entry_abspath,
- NULL),
+ svn_relpath_skip_ancestor(
+ parent_relpath,
+ entry_relpath),
result_pool);
@@ -297,11 +310,12 @@ get_info_for_deleted(svn_wc_entry_t *entry,
if (have_base)
{
svn_wc__db_status_t status;
- SVN_ERR(svn_wc__db_base_get_info(&status, NULL, &entry->revision,
+ SVN_ERR(svn_wc__db_base_get_info_internal(
+ &status, NULL, &entry->revision,
NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, lock, NULL, NULL,
+ NULL, NULL, lock, NULL, NULL,
NULL,
- db, entry_abspath,
+ wcroot, entry_relpath,
result_pool, scratch_pool));
if (status == svn_wc__db_status_not_present)
@@ -346,7 +360,7 @@ write_tree_conflicts(const char **conflict_data,
{
svn_skel_t *c_skel;
- SVN_ERR(svn_wc__serialize_conflict(&c_skel, svn__apr_hash_index_val(hi),
+ SVN_ERR(svn_wc__serialize_conflict(&c_skel, apr_hash_this_val(hi),
pool, pool));
svn_skel__prepend(c_skel, skel);
}
@@ -369,12 +383,17 @@ write_tree_conflicts(const char **conflict_data,
If this node is "this dir", then PARENT_ENTRY should be NULL. Otherwise,
it should refer to the entry for the child's parent directory.
+ ### All database read operations should really use wcroot, dir_relpath,
+ as that restores obstruction compatibility with <= 1.6.0
+ but that has been the case since the introduction of WC-NG in 1.7.0
+
Temporary allocations are made in SCRATCH_POOL. */
static svn_error_t *
read_one_entry(const svn_wc_entry_t **new_entry,
svn_wc__db_t *db,
- apr_int64_t wc_id,
const char *dir_abspath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *dir_relpath,
const char *name,
const svn_wc_entry_t *parent_entry,
apr_pool_t *result_pool,
@@ -387,24 +406,28 @@ read_one_entry(const svn_wc_entry_t **new_entry,
const svn_checksum_t *checksum;
svn_filesize_t translated_size;
svn_wc_entry_t *entry = alloc_entry(result_pool);
+ const char *entry_relpath;
const char *entry_abspath;
+ apr_int64_t repos_id;
+ apr_int64_t original_repos_id;
const char *original_repos_relpath;
const char *original_root_url;
svn_boolean_t conflicted;
svn_boolean_t have_base;
svn_boolean_t have_more_work;
+ svn_boolean_t op_root;
- entry->name = name;
+ entry->name = apr_pstrdup(result_pool, name);
+ entry_relpath = svn_relpath_join(dir_relpath, entry->name, scratch_pool);
entry_abspath = svn_dirent_join(dir_abspath, entry->name, scratch_pool);
- SVN_ERR(svn_wc__db_read_info(
+ SVN_ERR(svn_wc__db_read_info_internal(
&status,
&kind,
&entry->revision,
&repos_relpath,
- &entry->repos,
- &entry->uuid,
+ &repos_id,
&entry->cmt_rev,
&entry->cmt_date,
&entry->cmt_author,
@@ -412,24 +435,27 @@ read_one_entry(const svn_wc_entry_t **new_entry,
&checksum,
NULL,
&original_repos_relpath,
- &original_root_url,
- NULL,
+ &original_repos_id,
&entry->copyfrom_rev,
&lock,
&translated_size,
&entry->text_time,
&entry->changelist,
&conflicted,
- NULL /* op_root */,
+ &op_root,
&entry->has_props /* have_props */,
&entry->has_prop_mods /* props_mod */,
&have_base,
&have_more_work,
NULL /* have_work */,
- db,
- entry_abspath,
- result_pool,
- scratch_pool));
+ wcroot, entry_relpath,
+ result_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__db_fetch_repos_info(&entry->repos, &entry->uuid,
+ wcroot, repos_id, result_pool));
+ SVN_ERR(svn_wc__db_fetch_repos_info(&original_root_url, NULL,
+ wcroot, original_repos_id,
+ result_pool));
if (entry->has_prop_mods)
entry->has_props = TRUE;
@@ -457,9 +483,10 @@ read_one_entry(const svn_wc_entry_t **new_entry,
child_abspath = svn_dirent_join(dir_abspath, child_name,
scratch_pool);
- SVN_ERR(svn_wc__read_conflicts(&child_conflicts,
+ SVN_ERR(svn_wc__read_conflicts(&child_conflicts, NULL,
db, child_abspath,
FALSE /* create tempfiles */,
+ TRUE /* tree_conflicts_only */,
scratch_pool, scratch_pool));
for (j = 0; j < child_conflicts->nelts; j++)
@@ -493,13 +520,15 @@ read_one_entry(const svn_wc_entry_t **new_entry,
/* Grab inherited repository information, if necessary. */
if (repos_relpath == NULL)
{
- SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath,
- &entry->repos,
- &entry->uuid,
- db,
- entry_abspath,
- result_pool,
- scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info_internal(
+ NULL, NULL, NULL, &repos_relpath,
+ &repos_id, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ wcroot, entry_relpath,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_fetch_repos_info(&entry->repos, &entry->uuid,
+ wcroot, repos_id, result_pool));
}
entry->incomplete = (status == svn_wc__db_status_incomplete);
@@ -519,13 +548,14 @@ read_one_entry(const svn_wc_entry_t **new_entry,
entry->copied = FALSE;
else
{
- const char *work_del_abspath;
- SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL,
- &work_del_abspath, NULL,
- db, entry_abspath,
+ const char *work_del_relpath;
+ SVN_ERR(svn_wc__db_scan_deletion_internal(
+ NULL, NULL,
+ &work_del_relpath, NULL,
+ wcroot, entry_relpath,
scratch_pool, scratch_pool));
- if (work_del_abspath)
+ if (work_del_relpath)
entry->copied = TRUE;
}
@@ -563,13 +593,14 @@ read_one_entry(const svn_wc_entry_t **new_entry,
/* ENTRY->REVISION is overloaded. When a node is schedule-add
or -replace, then REVISION refers to the BASE node's revision
that is being overwritten. We need to fetch it now. */
- SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL,
+ SVN_ERR(svn_wc__db_base_get_info_internal(
+ &base_status, NULL,
&entry->revision,
NULL, NULL, NULL,
NULL, NULL, NULL,
NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- db, entry_abspath,
+ NULL, NULL, NULL,
+ wcroot, entry_relpath,
scratch_pool,
scratch_pool));
@@ -603,18 +634,27 @@ read_one_entry(const svn_wc_entry_t **new_entry,
have important data. Set up stuff to kill that idea off,
and finish up this entry. */
{
- SVN_ERR(svn_wc__db_scan_addition(&work_status,
- &op_root_abspath,
+ const char *op_root_relpath;
+ SVN_ERR(svn_wc__db_scan_addition_internal(
+ &work_status,
+ &op_root_relpath,
&repos_relpath,
- &entry->repos,
- &entry->uuid,
+ &repos_id,
&scanned_original_relpath,
- NULL, NULL, /* original_root|uuid */
+ NULL /* original_repos_id */,
&original_revision,
- db,
- entry_abspath,
+ wcroot, entry_relpath,
result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_fetch_repos_info(&entry->repos, &entry->uuid,
+ wcroot, repos_id, result_pool));
+
+ if (!op_root_relpath)
+ op_root_abspath = NULL;
+ else
+ op_root_abspath = svn_dirent_join(wcroot->abspath, op_root_relpath,
+ scratch_pool);
+
/* In wc.db we want to keep the valid revision of the not-present
BASE_REV, but when we used entries we set the revision to 0
when adding a new node over a not present base node. */
@@ -633,7 +673,7 @@ read_one_entry(const svn_wc_entry_t **new_entry,
/* ### scan_addition may need to be updated to avoid returning
### status_copied in this case. */
}
- /* For backwards-compatiblity purposes we treat moves just like
+ /* For backwards-compatibility purposes we treat moves just like
* regular copies. */
else if (work_status == svn_wc__db_status_copied ||
work_status == svn_wc__db_status_moved_here)
@@ -675,10 +715,12 @@ read_one_entry(const svn_wc_entry_t **new_entry,
mixed-revision situation. */
if (!is_copied_child)
{
- const char *parent_abspath;
+ const char *parent_relpath;
svn_error_t *err;
const char *parent_repos_relpath;
const char *parent_root_url;
+ apr_int64_t parent_repos_id;
+ const char *op_root_relpath;
/* When we insert entries into the database, we will
construct additional copyfrom records for mixed-revision
@@ -705,15 +747,16 @@ read_one_entry(const svn_wc_entry_t **new_entry,
Note that the parent could be added/copied/moved-here.
There is no way for it to be deleted/moved-away and
have *this* node appear as copied. */
- parent_abspath = svn_dirent_dirname(entry_abspath,
- scratch_pool);
- err = svn_wc__db_scan_addition(NULL,
- &op_root_abspath,
- NULL, NULL, NULL,
- &parent_repos_relpath,
- &parent_root_url,
+ parent_relpath = svn_relpath_dirname(entry_relpath,
+ scratch_pool);
+ err = svn_wc__db_scan_addition_internal(
+ NULL,
+ &op_root_relpath,
NULL, NULL,
- db, parent_abspath,
+ &parent_repos_relpath,
+ &parent_repos_id,
+ NULL,
+ wcroot, parent_relpath,
scratch_pool,
scratch_pool);
if (err)
@@ -721,10 +764,24 @@ read_one_entry(const svn_wc_entry_t **new_entry,
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
svn_error_clear(err);
+ op_root_abspath = NULL;
+ parent_repos_relpath = NULL;
+ parent_root_url = NULL;
+ }
+ else
+ {
+ SVN_ERR(svn_wc__db_fetch_repos_info(&parent_root_url, NULL,
+ wcroot, parent_repos_id,
+ scratch_pool));
+ op_root_abspath = svn_dirent_join(wcroot->abspath,
+ op_root_relpath,
+ scratch_pool);
}
- else if (parent_root_url != NULL
+
+ if (parent_root_url != NULL
&& strcmp(original_root_url, parent_root_url) == 0)
{
+
const char *relpath_to_entry = svn_dirent_is_child(
op_root_abspath, entry_abspath, NULL);
const char *entry_repos_relpath = svn_relpath_join(
@@ -827,6 +884,7 @@ read_one_entry(const svn_wc_entry_t **new_entry,
&checksum,
&lock,
db, entry_abspath,
+ wcroot, entry_relpath,
parent_entry,
have_base, have_more_work,
result_pool, scratch_pool));
@@ -869,7 +927,7 @@ read_one_entry(const svn_wc_entry_t **new_entry,
/* We got a SHA-1, get the corresponding MD-5. */
if (checksum->kind != svn_checksum_md5)
SVN_ERR(svn_wc__db_pristine_get_md5(&checksum, db,
- entry_abspath, checksum,
+ dir_abspath, checksum,
scratch_pool, scratch_pool));
SVN_ERR_ASSERT(checksum->kind == svn_checksum_md5);
@@ -881,8 +939,9 @@ read_one_entry(const svn_wc_entry_t **new_entry,
svn_skel_t *conflict;
svn_boolean_t text_conflicted;
svn_boolean_t prop_conflicted;
- SVN_ERR(svn_wc__db_read_conflict(&conflict, db, entry_abspath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, NULL, NULL,
+ wcroot, entry_relpath,
+ scratch_pool, scratch_pool));
SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, &text_conflicted,
&prop_conflicted, NULL,
@@ -955,7 +1014,9 @@ read_one_entry(const svn_wc_entry_t **new_entry,
static svn_error_t *
read_entries_new(apr_hash_t **result_entries,
svn_wc__db_t *db,
- const char *local_abspath,
+ const char *dir_abspath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *dir_relpath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -964,11 +1025,12 @@ read_entries_new(apr_hash_t **result_entries,
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
const svn_wc_entry_t *parent_entry;
- apr_int64_t wc_id = 1; /* ### hacky. should remove. */
entries = apr_hash_make(result_pool);
- SVN_ERR(read_one_entry(&parent_entry, db, wc_id, local_abspath,
+ SVN_ERR(read_one_entry(&parent_entry,
+ db, dir_abspath,
+ wcroot, dir_relpath,
"" /* name */,
NULL /* parent_entry */,
result_pool, iterpool));
@@ -977,8 +1039,8 @@ read_entries_new(apr_hash_t **result_entries,
/* Use result_pool so that the child names (used by reference, rather
than copied) appear in result_pool. */
SVN_ERR(svn_wc__db_read_children(&children, db,
- local_abspath,
- result_pool, iterpool));
+ dir_abspath,
+ scratch_pool, iterpool));
for (i = children->nelts; i--; )
{
const char *name = APR_ARRAY_IDX(children, i, const char *);
@@ -987,7 +1049,9 @@ read_entries_new(apr_hash_t **result_entries,
svn_pool_clear(iterpool);
SVN_ERR(read_one_entry(&entry,
- db, wc_id, local_abspath, name, parent_entry,
+ db, dir_abspath,
+ wcroot, dir_relpath,
+ name, parent_entry,
result_pool, iterpool));
svn_hash_sets(entries, entry->name, entry);
}
@@ -1000,28 +1064,20 @@ read_entries_new(apr_hash_t **result_entries,
}
-/* Read a pair of entries from wc_db in the directory DIR_ABSPATH. Return
- the directory's entry in *PARENT_ENTRY and NAME's entry in *ENTRY. The
- two returned pointers will be the same if NAME=="" ("this dir").
-
- The parent entry must exist.
-
- The requested entry MAY exist. If it does not, then NULL will be returned.
-
- The resulting entries are allocated in RESULT_POOL, and all temporary
- allocations are made in SCRATCH_POOL. */
static svn_error_t *
-read_entry_pair(const svn_wc_entry_t **parent_entry,
- const svn_wc_entry_t **entry,
- svn_wc__db_t *db,
- const char *dir_abspath,
- const char *name,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+read_entry_pair_txn(const svn_wc_entry_t **parent_entry,
+ const svn_wc_entry_t **entry,
+ svn_wc__db_t *db,
+ const char *dir_abspath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *dir_relpath,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_int64_t wc_id = 1; /* ### hacky. should remove. */
-
- SVN_ERR(read_one_entry(parent_entry, db, wc_id, dir_abspath,
+ SVN_ERR(read_one_entry(parent_entry,
+ db, dir_abspath,
+ wcroot, dir_relpath,
"" /* name */,
NULL /* parent_entry */,
result_pool, scratch_pool));
@@ -1073,7 +1129,9 @@ read_entry_pair(const svn_wc_entry_t **parent_entry,
svn_error_t *err;
err = read_one_entry(entry,
- db, wc_id, dir_abspath, name, *parent_entry,
+ db, dir_abspath,
+ wcroot, dir_relpath,
+ name, *parent_entry,
result_pool, scratch_pool);
if (err)
{
@@ -1096,28 +1154,76 @@ read_entry_pair(const svn_wc_entry_t **parent_entry,
return SVN_NO_ERROR;
}
+/* Read a pair of entries from wc_db in the directory DIR_ABSPATH. Return
+ the directory's entry in *PARENT_ENTRY and NAME's entry in *ENTRY. The
+ two returned pointers will be the same if NAME=="" ("this dir").
+
+ The parent entry must exist.
+
+ The requested entry MAY exist. If it does not, then NULL will be returned.
+
+ The resulting entries are allocated in RESULT_POOL, and all temporary
+ allocations are made in SCRATCH_POOL. */
+static svn_error_t *
+read_entry_pair(const svn_wc_entry_t **parent_entry,
+ const svn_wc_entry_t **entry,
+ svn_wc__db_t *db,
+ const char *dir_abspath,
+ const char *name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *dir_relpath;
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &dir_relpath,
+ db, dir_abspath,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ SVN_WC__DB_WITH_TXN(read_entry_pair_txn(parent_entry, entry,
+ db, dir_abspath,
+ wcroot, dir_relpath,
+ name,
+ result_pool, scratch_pool),
+ wcroot);
+
+ return SVN_NO_ERROR;
+}
/* */
static svn_error_t *
read_entries(apr_hash_t **entries,
svn_wc__db_t *db,
- const char *wcroot_abspath,
+ const char *dir_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *dir_relpath;
int wc_format;
- SVN_ERR(svn_wc__db_temp_get_format(&wc_format, db, wcroot_abspath,
+ SVN_ERR(svn_wc__db_temp_get_format(&wc_format, db, dir_abspath,
scratch_pool));
if (wc_format < SVN_WC__WC_NG_VERSION)
return svn_error_trace(svn_wc__read_entries_old(entries,
- wcroot_abspath,
+ dir_abspath,
result_pool,
scratch_pool));
- return svn_error_trace(read_entries_new(entries, db, wcroot_abspath,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &dir_relpath,
+ db, dir_abspath,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ SVN_WC__DB_WITH_TXN(read_entries_new(entries,
+ db, dir_abspath,
+ wcroot, dir_relpath,
+ result_pool, scratch_pool),
+ wcroot);
+
+ return SVN_NO_ERROR;
}
@@ -1342,7 +1448,7 @@ prune_deleted(apr_hash_t **entries_pruned,
svn_boolean_t hidden;
SVN_ERR(svn_wc__entry_is_hidden(&hidden,
- svn__apr_hash_index_val(hi)));
+ apr_hash_this_val(hi)));
if (hidden)
break;
}
@@ -1360,8 +1466,8 @@ prune_deleted(apr_hash_t **entries_pruned,
hi;
hi = apr_hash_next(hi))
{
- const void *key = svn__apr_hash_index_key(hi);
- const svn_wc_entry_t *entry = svn__apr_hash_index_val(hi);
+ const void *key = apr_hash_this_key(hi);
+ const svn_wc_entry_t *entry = apr_hash_this_val(hi);
svn_boolean_t hidden;
SVN_ERR(svn_wc__entry_is_hidden(&hidden, entry));
@@ -1372,25 +1478,6 @@ prune_deleted(apr_hash_t **entries_pruned,
return SVN_NO_ERROR;
}
-struct entries_read_baton_t
-{
- apr_hash_t **new_entries;
- svn_wc__db_t *db;
- const char *local_abspath;
- apr_pool_t *result_pool;
-};
-
-static svn_error_t *
-entries_read_txn(void *baton, svn_sqlite__db_t *db, apr_pool_t *scratch_pool)
-{
- struct entries_read_baton_t *erb = baton;
-
- SVN_ERR(read_entries(erb->new_entries, erb->db, erb->local_abspath,
- erb->result_pool, scratch_pool));
-
- return NULL;
-}
-
svn_error_t *
svn_wc__entries_read_internal(apr_hash_t **entries,
svn_wc_adm_access_t *adm_access,
@@ -1405,21 +1492,9 @@ svn_wc__entries_read_internal(apr_hash_t **entries,
svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
const char *local_abspath = svn_wc__adm_access_abspath(adm_access);
apr_pool_t *result_pool = svn_wc__adm_access_pool_internal(adm_access);
- svn_sqlite__db_t *sdb;
- struct entries_read_baton_t erb;
-
- /* ### Use the borrow DB api to handle all calls in a single read
- ### transaction. This api is used extensively in our test suite
- ### via the entries-read application. */
- SVN_ERR(svn_wc__db_temp_borrow_sdb(&sdb, db, local_abspath, pool));
-
- erb.db = db;
- erb.local_abspath = local_abspath;
- erb.new_entries = &new_entries;
- erb.result_pool = result_pool;
-
- SVN_ERR(svn_sqlite__with_lock(sdb, entries_read_txn, &erb, pool));
+ SVN_ERR(read_entries(&new_entries, db, local_abspath,
+ result_pool, pool));
svn_wc__adm_access_set_entries(adm_access, new_entries);
}
@@ -1452,23 +1527,31 @@ insert_node(svn_sqlite__db_t *sdb,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
+ svn_boolean_t present = (node->presence == svn_wc__db_status_normal
+ || node->presence == svn_wc__db_status_incomplete);
SVN_ERR_ASSERT(node->op_depth > 0 || node->repos_relpath);
SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isdsnnnnsnrisnnni",
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdsnnnnsn",
node->wc_id,
node->local_relpath,
node->op_depth,
node->parent_relpath,
/* Setting depth for files? */
- svn_depth_to_word(node->depth),
- node->changed_rev,
- node->changed_date,
- node->changed_author,
- node->recorded_time));
+ (node->kind == svn_node_dir && present)
+ ? svn_depth_to_word(node->depth)
+ : NULL));
- if (node->repos_relpath)
+ if (present && node->repos_relpath)
+ {
+ SVN_ERR(svn_sqlite__bind_revnum(stmt, 11, node->changed_rev));
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 12, node->changed_date));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 13, node->changed_author));
+ }
+
+ if (node->repos_relpath
+ && node->presence != svn_wc__db_status_base_deleted)
{
SVN_ERR(svn_sqlite__bind_int64(stmt, 5,
node->repos_id));
@@ -1477,26 +1560,14 @@ insert_node(svn_sqlite__db_t *sdb,
SVN_ERR(svn_sqlite__bind_revnum(stmt, 7, node->revision));
}
- if (node->presence == svn_wc__db_status_normal)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "normal"));
- else if (node->presence == svn_wc__db_status_not_present)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "not-present"));
- else if (node->presence == svn_wc__db_status_base_deleted)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "base-deleted"));
- else if (node->presence == svn_wc__db_status_incomplete)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "incomplete"));
- else if (node->presence == svn_wc__db_status_excluded)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "excluded"));
- else if (node->presence == svn_wc__db_status_server_excluded)
- SVN_ERR(svn_sqlite__bind_text(stmt, 8, "server-excluded"));
+ SVN_ERR(svn_sqlite__bind_token(stmt, 8, presence_map, node->presence));
if (node->kind == svn_node_none)
SVN_ERR(svn_sqlite__bind_text(stmt, 10, "unknown"));
else
- SVN_ERR(svn_sqlite__bind_text(stmt, 10,
- svn_node_kind_to_word(node->kind)));
+ SVN_ERR(svn_sqlite__bind_token(stmt, 10, kind_map, node->kind));
- if (node->kind == svn_node_file)
+ if (node->kind == svn_node_file && present)
{
if (!node->checksum
&& node->op_depth == 0
@@ -1510,19 +1581,25 @@ insert_node(svn_sqlite__db_t *sdb,
SVN_ERR(svn_sqlite__bind_checksum(stmt, 14, node->checksum,
scratch_pool));
+
+ if (node->repos_relpath)
+ {
+ if (node->recorded_size != SVN_INVALID_FILESIZE)
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 16, node->recorded_size));
+
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 17, node->recorded_time));
+ }
}
- if (node->properties) /* ### Never set, props done later */
+ /* ### Never set, props done later */
+ if (node->properties && present && node->repos_relpath)
SVN_ERR(svn_sqlite__bind_properties(stmt, 15, node->properties,
scratch_pool));
- if (node->recorded_size != SVN_INVALID_FILESIZE)
- SVN_ERR(svn_sqlite__bind_int64(stmt, 16, node->recorded_size));
-
if (node->file_external)
SVN_ERR(svn_sqlite__bind_int(stmt, 20, 1));
- if (node->inherited_props)
+ if (node->inherited_props && present)
SVN_ERR(svn_sqlite__bind_iprops(stmt, 23, node->inherited_props,
scratch_pool));
@@ -1801,6 +1878,10 @@ write_entry(struct write_baton **entry_node,
if (entry->copied)
{
+ db_node_t *work = parent_node->work
+ ? parent_node->work
+ : parent_node->below_work;
+
if (entry->copyfrom_url)
{
working_node->repos_id = repos_id;
@@ -1810,20 +1891,37 @@ write_entry(struct write_baton **entry_node,
working_node->revision = entry->copyfrom_rev;
working_node->op_depth
= svn_wc__db_op_depth_for_upgrade(local_relpath);
+
+ if (work && work->repos_relpath
+ && work->repos_id == repos_id
+ && work->revision == entry->copyfrom_rev)
+ {
+ const char *name;
+
+ name = svn_relpath_skip_ancestor(work->repos_relpath,
+ working_node->repos_relpath);
+
+ if (name
+ && !strcmp(name, svn_relpath_basename(local_relpath, NULL)))
+ {
+ working_node->op_depth = work->op_depth;
+ }
+ }
}
- else if (parent_node->work && parent_node->work->repos_relpath)
+ else if (work && work->repos_relpath)
{
working_node->repos_id = repos_id;
working_node->repos_relpath
- = svn_relpath_join(parent_node->work->repos_relpath,
+ = svn_relpath_join(work->repos_relpath,
svn_relpath_basename(local_relpath, NULL),
result_pool);
- working_node->revision = parent_node->work->revision;
- working_node->op_depth = parent_node->work->op_depth;
+ working_node->revision = work->revision;
+ working_node->op_depth = work->op_depth;
}
else if (parent_node->below_work
&& parent_node->below_work->repos_relpath)
{
+ /* Parent deleted, this not-present or similar */
working_node->repos_id = repos_id;
working_node->repos_relpath
= svn_relpath_join(parent_node->below_work->repos_relpath,
@@ -1837,6 +1935,29 @@ write_entry(struct write_baton **entry_node,
_("No copyfrom URL for '%s'"),
svn_dirent_local_style(local_relpath,
scratch_pool));
+
+ if (work && work->op_depth != working_node->op_depth
+ && work->repos_relpath
+ && work->repos_id == working_node->repos_id
+ && work->presence == svn_wc__db_status_normal
+ && !below_working_node)
+ {
+ /* Introduce a not-present node! */
+ below_working_node = MAYBE_ALLOC(below_working_node, scratch_pool);
+
+ below_working_node->wc_id = wc_id;
+ below_working_node->op_depth = work->op_depth;
+ below_working_node->local_relpath = local_relpath;
+ below_working_node->parent_relpath = parent_relpath;
+
+ below_working_node->presence = svn_wc__db_status_not_present;
+ below_working_node->repos_id = repos_id;
+ below_working_node->repos_relpath = working_node->local_relpath;
+
+ SVN_ERR(insert_node(sdb, below_working_node, scratch_pool));
+
+ below_working_node = NULL; /* Don't write a present intermediate! */
+ }
}
if (entry->conflict_old)
@@ -1892,7 +2013,7 @@ write_entry(struct write_baton **entry_node,
scratch_pool);
tree_conflicts = apr_hash_make(result_pool);
skel = skel->children;
- while(skel)
+ while (skel)
{
svn_wc_conflict_description2_t *conflict;
svn_skel_t *new_skel;
@@ -1909,11 +2030,6 @@ write_entry(struct write_baton **entry_node,
WRITE_ENTRY_ASSERT(conflict->kind == svn_wc_conflict_kind_tree);
- /* Fix dubious data stored by old clients, local adds don't have
- a repository URL. */
- if (conflict->reason == svn_wc_conflict_reason_added)
- conflict->src_left_version = NULL;
-
SVN_ERR(svn_wc__serialize_conflict(&new_skel, conflict,
scratch_pool, scratch_pool));
@@ -2295,6 +2411,11 @@ write_entry(struct write_baton **entry_node,
{
working_node->op_depth = parent_node->work->op_depth;
}
+ else if (working_node->presence == svn_wc__db_status_excluded
+ && parent_node->work)
+ {
+ working_node->op_depth = parent_node->work->op_depth;
+ }
else if (!entry->copied)
{
working_node->op_depth
@@ -2358,9 +2479,9 @@ write_actual_only_entries(apr_hash_t *tree_conflicts,
actual_node = MAYBE_ALLOC(actual_node, scratch_pool);
actual_node->wc_id = wc_id;
- actual_node->local_relpath = svn__apr_hash_index_key(hi);
+ actual_node->local_relpath = apr_hash_this_key(hi);
actual_node->parent_relpath = parent_relpath;
- actual_node->tree_conflict_data = svn__apr_hash_index_val(hi);
+ actual_node->tree_conflict_data = apr_hash_this_val(hi);
SVN_ERR(insert_actual_node(sdb, db, wri_abspath, actual_node,
scratch_pool));
@@ -2418,8 +2539,8 @@ svn_wc__write_upgraded_entries(void **dir_baton,
for (hi = apr_hash_first(scratch_pool, entries); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_wc_entry_t *this_entry = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_wc_entry_t *this_entry = apr_hash_this_val(hi);
const char *child_abspath, *child_relpath;
svn_wc__text_base_info_t *text_base_info
= svn_hash_gets(text_bases_info, name);
@@ -2573,8 +2694,8 @@ walker_helper(const char *dirpath,
/* Loop over each of the other entries. */
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_wc_entry_t *current_entry = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_wc_entry_t *current_entry = apr_hash_this_val(hi);
const char *entrypath;
const char *entry_abspath;
svn_boolean_t hidden;
@@ -2661,11 +2782,11 @@ svn_wc_walk_entries3(const char *path,
svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
svn_error_t *err;
svn_node_kind_t kind;
- svn_depth_t depth;
+ svn_wc__db_status_t status;
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
- err = svn_wc__db_read_info(NULL, &kind, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, &depth, NULL, NULL,
+ err = svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL,
@@ -2684,7 +2805,9 @@ svn_wc_walk_entries3(const char *path,
walk_baton, pool);
}
- if (kind == svn_node_file || depth == svn_depth_exclude)
+ if (kind == svn_node_file
+ || status == svn_wc__db_status_excluded
+ || status == svn_wc__db_status_server_excluded)
{
const svn_wc_entry_t *entry;
@@ -2693,27 +2816,24 @@ svn_wc_walk_entries3(const char *path,
### we should not call handle_error for an error the *callback*
### gave us. let it deal with the problem before returning. */
- if (!show_hidden)
+ if (!show_hidden
+ && (status == svn_wc__db_status_not_present
+ || status == svn_wc__db_status_excluded
+ || status == svn_wc__db_status_server_excluded))
{
- svn_boolean_t hidden;
- SVN_ERR(svn_wc__db_node_hidden(&hidden, db, local_abspath, pool));
-
- if (hidden)
- {
- /* The fool asked to walk a "hidden" node. Report the node as
- unversioned.
-
- ### this is incorrect behavior. see depth_test 36. the walk
- ### API will be revamped to avoid entry structures. we should
- ### be able to solve the problem with the new API. (since we
- ### shouldn't return a hidden entry here) */
- return walk_callbacks->handle_error(
- path, svn_error_createf(
- SVN_ERR_UNVERSIONED_RESOURCE, NULL,
- _("'%s' is not under version control"),
- svn_dirent_local_style(local_abspath, pool)),
- walk_baton, pool);
- }
+ /* The fool asked to walk a "hidden" node. Report the node as
+ unversioned.
+
+ ### this is incorrect behavior. see depth_test 36. the walk
+ ### API will be revamped to avoid entry structures. we should
+ ### be able to solve the problem with the new API. (since we
+ ### shouldn't return a hidden entry here) */
+ return walk_callbacks->handle_error(
+ path, svn_error_createf(
+ SVN_ERR_UNVERSIONED_RESOURCE, NULL,
+ _("'%s' is not under version control"),
+ svn_dirent_local_style(local_abspath, pool)),
+ walk_baton, pool);
}
SVN_ERR(svn_wc__get_entry(&entry, db, local_abspath, FALSE,
diff --git a/subversion/libsvn_wc/externals.c b/subversion/libsvn_wc/externals.c
index 3725b22..4cbd4f0 100644
--- a/subversion/libsvn_wc/externals.c
+++ b/subversion/libsvn_wc/externals.c
@@ -68,6 +68,7 @@
* the revision if the revision is found. Set REV_IDX to the index in
* LINE_PARTS where the revision specification starts. Remove from
* LINE_PARTS the element(s) that specify the revision.
+ * Set REV_STR to the element that specifies the revision.
* PARENT_DIRECTORY_DISPLAY and LINE are given to return a nice error
* string.
*
@@ -76,6 +77,7 @@
*/
static svn_error_t *
find_and_remove_externals_revision(int *rev_idx,
+ const char **rev_str,
const char **line_parts,
int num_line_parts,
svn_wc_external_item2_t *item,
@@ -137,6 +139,8 @@ find_and_remove_externals_revision(int *rev_idx,
line_parts[j] = line_parts[j+shift_count];
line_parts[num_line_parts-shift_count] = NULL;
+ *rev_str = apr_psprintf(pool, "-r%s", digits_ptr);
+
/* Found the revision, so leave the function immediately, do
* not continue looking for additional revisions. */
return SVN_NO_ERROR;
@@ -158,23 +162,29 @@ find_and_remove_externals_revision(int *rev_idx,
}
svn_error_t *
-svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
- const char *parent_directory,
+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)
{
int i;
apr_array_header_t *externals = NULL;
+ apr_array_header_t *parser_infos = NULL;
apr_array_header_t *lines = svn_cstring_split(desc, "\n\r", TRUE, pool);
- const char *parent_directory_display = svn_path_is_url(parent_directory) ?
- parent_directory : svn_dirent_local_style(parent_directory, pool);
+ const char *defining_directory_display = svn_path_is_url(defining_directory) ?
+ defining_directory : svn_dirent_local_style(defining_directory, pool);
/* If an error occurs halfway through parsing, *externals_p should stay
* untouched. So, store the list in a local var first. */
if (externals_p)
externals = apr_array_make(pool, 1, sizeof(svn_wc_external_item2_t *));
+ if (parser_infos_p)
+ parser_infos =
+ apr_array_make(pool, 1, sizeof(svn_wc__externals_parser_info_t *));
+
for (i = 0; i < lines->nelts; i++)
{
const char *line = APR_ARRAY_IDX(lines, i, const char *);
@@ -186,10 +196,12 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
const char *token1;
svn_boolean_t token0_is_url;
svn_boolean_t token1_is_url;
+ svn_wc__externals_parser_info_t *info = NULL;
/* Index into line_parts where the revision specification
started. */
int rev_idx = -1;
+ const char *rev_str = NULL;
if ((! line) || (line[0] == '#'))
continue;
@@ -209,6 +221,9 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
item->revision.kind = svn_opt_revision_unspecified;
item->peg_revision.kind = svn_opt_revision_unspecified;
+ if (parser_infos)
+ info = apr_pcalloc(pool, sizeof(*info));
+
/*
* There are six different formats of externals:
*
@@ -231,7 +246,7 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
(SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION, NULL,
_("Error parsing %s property on '%s': '%s'"),
SVN_PROP_EXTERNALS,
- parent_directory_display,
+ defining_directory_display,
line);
/* To make it easy to check for the forms, find and remove -r N
@@ -240,9 +255,10 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
set item->revision to the parsed revision. */
/* ### ugh. stupid cast. */
SVN_ERR(find_and_remove_externals_revision(&rev_idx,
+ &rev_str,
(const char **)line_parts,
num_line_parts, item,
- parent_directory_display,
+ defining_directory_display,
line, pool));
token0 = line_parts[0];
@@ -258,7 +274,7 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
"cannot use two absolute URLs ('%s' and '%s') in an external; "
"one must be a path where an absolute or relative URL is "
"checked out to"),
- SVN_PROP_EXTERNALS, parent_directory_display, token0, token1);
+ SVN_PROP_EXTERNALS, defining_directory_display, token0, token1);
if (0 == rev_idx && token1_is_url)
return svn_error_createf
@@ -266,7 +282,7 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
_("Invalid %s property on '%s': "
"cannot use a URL '%s' as the target directory for an external "
"definition"),
- SVN_PROP_EXTERNALS, parent_directory_display, token1);
+ SVN_PROP_EXTERNALS, defining_directory_display, token1);
if (1 == rev_idx && token0_is_url)
return svn_error_createf
@@ -274,9 +290,9 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
_("Invalid %s property on '%s': "
"cannot use a URL '%s' as the target directory for an external "
"definition"),
- SVN_PROP_EXTERNALS, parent_directory_display, token0);
+ SVN_PROP_EXTERNALS, defining_directory_display, token0);
- /* The appearence of -r N or -rN forces the type of external.
+ /* The appearance of -r N or -rN forces the type of external.
If -r is at the beginning of the line or the first token is
an absolute URL or if the second token is not an absolute
URL, then the URL supports peg revisions. */
@@ -290,12 +306,34 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
SVN_ERR(svn_opt_parse_path(&item->peg_revision, &item->url,
token0, pool));
item->target_dir = token1;
+
+ if (info)
+ {
+ info->format = svn_wc__external_description_format_2;
+
+ if (rev_str)
+ info->rev_str = apr_pstrdup(pool, rev_str);
+
+ if (item->peg_revision.kind != svn_opt_revision_unspecified)
+ info->peg_rev_str = strrchr(token0, '@');
+ }
}
else
{
item->target_dir = token0;
item->url = token1;
item->peg_revision = item->revision;
+
+ if (info)
+ {
+ info->format = svn_wc__external_description_format_1;
+
+ if (rev_str)
+ {
+ info->rev_str = apr_pstrdup(pool, rev_str);
+ info->peg_rev_str = info->rev_str;
+ }
+ }
}
SVN_ERR(svn_opt_resolve_revisions(&item->peg_revision,
@@ -316,7 +354,7 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
_("Invalid %s property on '%s': "
"target '%s' is an absolute path or involves '..'"),
SVN_PROP_EXTERNALS,
- parent_directory_display,
+ defining_directory_display,
item->target_dir);
if (canonicalize_url)
@@ -333,15 +371,34 @@ svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
if (externals)
APR_ARRAY_PUSH(externals, svn_wc_external_item2_t *) = item;
+ if (parser_infos)
+ APR_ARRAY_PUSH(parser_infos, svn_wc__externals_parser_info_t *) = info;
}
if (externals_p)
*externals_p = externals;
+ if (parser_infos_p)
+ *parser_infos_p = parser_infos;
return SVN_NO_ERROR;
}
svn_error_t *
+svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
+ const char *defining_directory,
+ const char *desc,
+ svn_boolean_t canonicalize_url,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_wc__parse_externals_description(externals_p,
+ NULL,
+ defining_directory,
+ desc,
+ canonicalize_url,
+ pool));
+}
+
+svn_error_t *
svn_wc__externals_find_target_dups(apr_array_header_t **duplicate_targets,
apr_array_header_t *externals,
apr_pool_t *pool,
@@ -405,9 +462,10 @@ struct edit_baton
const apr_array_header_t *ext_patterns;
const char *diff3cmd;
- const char *url;
const char *repos_root_url;
const char *repos_uuid;
+ const char *old_repos_relpath;
+ const char *new_repos_relpath;
const char *record_ancestor_abspath;
const char *recorded_repos_relpath;
@@ -417,8 +475,6 @@ struct edit_baton
/* Introducing a new file external */
svn_boolean_t added;
- 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;
@@ -431,7 +487,7 @@ struct edit_baton
const svn_checksum_t *original_checksum;
/* What we are installing now */
- const char *new_pristine_abspath;
+ svn_wc__db_install_data_t *install_data;
svn_checksum_t *new_sha1_checksum;
svn_checksum_t *new_md5_checksum;
@@ -517,7 +573,8 @@ open_file(const char *path,
*file_baton = eb;
SVN_ERR(svn_wc__db_base_get_info(NULL, &kind, &eb->original_revision,
- NULL, NULL, NULL, &eb->changed_rev,
+ &eb->old_repos_relpath, NULL, NULL,
+ &eb->changed_rev,
&eb->changed_date, &eb->changed_author,
NULL, &eb->original_checksum, NULL, NULL,
&eb->had_props, NULL, NULL,
@@ -579,11 +636,12 @@ apply_textdelta(void *file_baton,
else
src_stream = svn_stream_empty(pool);
- SVN_ERR(svn_wc__open_writable_base(&dest_stream, &eb->new_pristine_abspath,
- &eb->new_md5_checksum,
- &eb->new_sha1_checksum,
- eb->db, eb->wri_abspath,
- eb->pool, pool));
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&dest_stream,
+ &eb->install_data,
+ &eb->new_sha1_checksum,
+ &eb->new_md5_checksum,
+ eb->db, eb->wri_abspath,
+ eb->pool, pool));
svn_txdelta_apply(src_stream, dest_stream, NULL, eb->local_abspath, pool,
handler, handler_baton);
@@ -603,7 +661,7 @@ change_file_prop(void *file_baton,
propchange = apr_array_push(eb->propchanges);
propchange->name = apr_pstrdup(eb->pool, name);
- propchange->value = value ? svn_string_dup(value, eb->pool) : NULL;
+ propchange->value = svn_string_dup(value, eb->pool);
return SVN_NO_ERROR;
}
@@ -656,11 +714,11 @@ close_file(void *file_baton,
behavior to the pristine store. */
if (eb->new_sha1_checksum)
{
- SVN_ERR(svn_wc__db_pristine_install(eb->db, eb->new_pristine_abspath,
+ SVN_ERR(svn_wc__db_pristine_install(eb->install_data,
eb->new_sha1_checksum,
eb->new_md5_checksum, pool));
- eb->new_pristine_abspath = NULL;
+ eb->install_data = NULL;
}
/* Merge the changes */
@@ -677,8 +735,6 @@ close_file(void *file_baton,
const svn_checksum_t *original_checksum = NULL;
svn_boolean_t added = !SVN_IS_VALID_REVNUM(eb->original_revision);
- const char *repos_relpath = svn_uri_skip_ancestor(eb->repos_root_url,
- eb->url, pool);
if (! added)
{
@@ -767,7 +823,6 @@ close_file(void *file_baton,
{
svn_node_kind_t disk_kind;
svn_boolean_t install_pristine = FALSE;
- const char *install_from = NULL;
SVN_ERR(svn_io_check_path(eb->local_abspath, &disk_kind, pool));
@@ -832,7 +887,7 @@ close_file(void *file_baton,
{
SVN_ERR(svn_wc__wq_build_file_install(&work_item, eb->db,
eb->local_abspath,
- install_from,
+ NULL,
eb->use_commit_times, TRUE,
pool, pool));
@@ -853,14 +908,14 @@ close_file(void *file_baton,
svn_wc_conflict_version_create2(
eb->repos_root_url,
eb->repos_uuid,
- repos_relpath,
+ eb->old_repos_relpath,
eb->original_revision,
svn_node_file,
pool),
svn_wc_conflict_version_create2(
eb->repos_root_url,
eb->repos_uuid,
- repos_relpath,
+ eb->new_repos_relpath,
*eb->target_revision,
svn_node_file,
pool),
@@ -878,7 +933,7 @@ close_file(void *file_baton,
eb->db,
eb->local_abspath,
eb->wri_abspath,
- repos_relpath,
+ eb->new_repos_relpath,
eb->repos_root_url,
eb->repos_uuid,
*eb->target_revision,
@@ -947,6 +1002,7 @@ close_edit(void *edit_baton,
if (!eb->file_closed)
{
+ apr_hash_t *wcroot_iprops = NULL;
/* The file wasn't updated, but its url or revision might have...
e.g. switch between branches for relative externals.
@@ -954,53 +1010,26 @@ close_edit(void *edit_baton,
investigating when we should and shouldn't update it...
and avoid hard to debug edge cases */
- svn_node_kind_t kind;
- const char *old_repos_relpath;
- svn_revnum_t changed_rev;
- apr_time_t changed_date;
- const char *changed_author;
- const svn_checksum_t *checksum;
- apr_hash_t *pristine_props;
- const char *repos_relpath = svn_uri_skip_ancestor(eb->repos_root_url,
- eb->url, pool);
-
- SVN_ERR(svn_wc__db_base_get_info(NULL, &kind, NULL, &old_repos_relpath,
- NULL, NULL, &changed_rev, &changed_date,
- &changed_author, NULL, &checksum, NULL,
- NULL, NULL, &pristine_props, NULL,
- eb->db, eb->local_abspath,
- pool, pool));
+ if (eb->iprops)
+ {
+ wcroot_iprops = apr_hash_make(pool);
+ svn_hash_sets(wcroot_iprops, eb->local_abspath, eb->iprops);
+ }
- if (kind != svn_node_file)
- return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
- _("Node '%s' is no existing file external"),
- svn_dirent_local_style(eb->local_abspath,
- pool));
-
- SVN_ERR(svn_wc__db_external_add_file(
- eb->db,
- eb->local_abspath,
- eb->wri_abspath,
- repos_relpath,
- eb->repos_root_url,
- eb->repos_uuid,
- *eb->target_revision,
- pristine_props,
- eb->iprops,
- eb->changed_rev,
- eb->changed_date,
- eb->changed_author,
- checksum,
- NULL /* clear dav props */,
- eb->record_ancestor_abspath,
- eb->recorded_repos_relpath,
- eb->recorded_peg_revision,
- eb->recorded_revision,
- FALSE, NULL,
- TRUE /* keep_recorded_info */,
- NULL /* conflict_skel */,
- NULL /* work_items */,
- pool));
+ SVN_ERR(svn_wc__db_op_bump_revisions_post_update(eb->db,
+ eb->local_abspath,
+ svn_depth_infinity,
+ eb->new_repos_relpath,
+ eb->repos_root_url,
+ eb->repos_uuid,
+ *eb->target_revision,
+ apr_hash_make(pool)
+ /* exclude_relpaths */,
+ wcroot_iprops,
+ TRUE /* empty update */,
+ eb->notify_func,
+ eb->notify_baton,
+ pool));
}
return SVN_NO_ERROR;
@@ -1024,8 +1053,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,
@@ -1048,9 +1075,12 @@ svn_wc__get_file_external_editor(const svn_delta_editor_t **editor,
eb->name = svn_dirent_basename(eb->local_abspath, NULL);
eb->target_revision = target_revision;
- eb->url = apr_pstrdup(edit_pool, url);
eb->repos_root_url = apr_pstrdup(edit_pool, repos_root_url);
eb->repos_uuid = apr_pstrdup(edit_pool, repos_uuid);
+ eb->new_repos_relpath = svn_uri_skip_ancestor(eb->repos_root_url, url, edit_pool);
+ eb->old_repos_relpath = eb->new_repos_relpath;
+
+ eb->original_revision = SVN_INVALID_REVNUM;
eb->iprops = iprops;
@@ -1074,8 +1104,6 @@ svn_wc__get_file_external_editor(const svn_delta_editor_t **editor,
else
eb->recorded_revision = SVN_INVALID_REVNUM; /* Not fixed/HEAD */
- eb->conflict_func = conflict_func;
- eb->conflict_baton = conflict_baton;
eb->cancel_func = cancel_func;
eb->cancel_baton = cancel_baton;
eb->notify_func = notify_func;
@@ -1445,10 +1473,8 @@ svn_wc__external_remove(svn_wc_context_t *wc_ctx,
else
{
SVN_ERR(svn_wc__db_base_remove(wc_ctx->db, local_abspath,
- FALSE /* keep_as_working */,
- TRUE /* queue_deletes */,
- FALSE /* remove_locks */,
- SVN_INVALID_REVNUM,
+ FALSE, TRUE, FALSE,
+ 0,
NULL, NULL, scratch_pool));
SVN_ERR(svn_wc__wq_run(wc_ctx->db, local_abspath,
cancel_func, cancel_baton,
@@ -1591,7 +1617,7 @@ svn_wc__resolve_relative_external_url(const char **resolved_url,
apr_pstrndup(scratch_pool, url, num_leading_slashes),
svn_relpath_canonicalize(url + num_leading_slashes,
scratch_pool),
- (char*)NULL);
+ SVN_VA_NULL);
}
else
{
@@ -1698,7 +1724,7 @@ svn_wc__resolve_relative_external_url(const char **resolved_url,
SVN_ERR(uri_scheme(&scheme, repos_root_url, scratch_pool));
*resolved_url = svn_uri_canonicalize(apr_pstrcat(scratch_pool, scheme,
- ":", url, (char *)NULL),
+ ":", url, SVN_VA_NULL),
result_pool);
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_wc/info.c b/subversion/libsvn_wc/info.c
index dc80ee7..78e5d7f 100644
--- a/subversion/libsvn_wc/info.c
+++ b/subversion/libsvn_wc/info.c
@@ -52,7 +52,7 @@ svn_wc_info_dup(const svn_wc_info_t *info,
for (i = 0; i < info->conflicts->nelts; i++)
{
APR_ARRAY_PUSH(new_conflicts, svn_wc_conflict_description2_t *)
- = svn_wc__conflict_description2_dup(
+ = svn_wc_conflict_description2_dup(
APR_ARRAY_IDX(info->conflicts, i,
const svn_wc_conflict_description2_t *),
pool);
@@ -141,7 +141,6 @@ build_info_for_node(svn_wc__info2_t **info,
{
/* Root or child of copy */
tmpinfo->rev = original_revision;
- repos_relpath = original_repos_relpath;
if (op_root)
{
@@ -167,34 +166,6 @@ build_info_for_node(svn_wc__info2_t **info,
}
}
}
- else if (op_root)
- {
- /* Local addition */
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, &repos_relpath,
- &tmpinfo->repos_root_URL,
- &tmpinfo->repos_UUID,
- NULL, NULL, NULL, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
-
- if (have_base)
- SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, &tmpinfo->rev, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
- }
- else
- {
- /* Child of copy. ### Not WC-NG like */
- SVN_ERR(svn_wc__internal_get_origin(NULL, &tmpinfo->rev,
- &repos_relpath,
- &tmpinfo->repos_root_URL,
- &tmpinfo->repos_UUID, NULL,
- db, local_abspath, TRUE,
- result_pool, scratch_pool));
- }
/* ### We should be able to avoid both these calls with the information
from read_info() in most cases */
@@ -222,14 +193,20 @@ build_info_for_node(svn_wc__info2_t **info,
else
wc_info->schedule = svn_wc_schedule_add;
}
- SVN_ERR(svn_wc__db_read_url(&tmpinfo->URL, db, local_abspath,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_read_repos_info(NULL, &repos_relpath,
+ &tmpinfo->repos_root_URL,
+ &tmpinfo->repos_UUID,
+ db, local_abspath,
+ result_pool, scratch_pool));
+
+ tmpinfo->URL = svn_path_url_add_component2(tmpinfo->repos_root_URL,
+ repos_relpath, result_pool);
}
else if (status == svn_wc__db_status_deleted)
{
- const char *work_del_abspath;
+ svn_wc__db_status_t w_status;
- SVN_ERR(svn_wc__db_read_pristine_info(NULL, NULL,
+ SVN_ERR(svn_wc__db_read_pristine_info(&w_status, &tmpinfo->kind,
&tmpinfo->last_changed_rev,
&tmpinfo->last_changed_date,
&tmpinfo->last_changed_author,
@@ -239,51 +216,32 @@ build_info_for_node(svn_wc__info2_t **info,
db, local_abspath,
result_pool, scratch_pool));
+ if (w_status == svn_wc__db_status_deleted)
+ {
+ /* We have a working not-present status. We don't know anything
+ about this node, but it *is visible* in STATUS.
+
+ Let's tell that it is excluded */
+
+ wc_info->depth = svn_depth_exclude;
+ tmpinfo->kind = svn_node_unknown;
+ }
+
/* And now fetch the url and revision of what will be deleted */
SVN_ERR(svn_wc__db_scan_deletion(NULL, &wc_info->moved_to_abspath,
- &work_del_abspath, NULL,
+ NULL, NULL,
db, local_abspath,
scratch_pool, scratch_pool));
- if (work_del_abspath != NULL)
- {
- /* This is a deletion within a copied subtree. Get the copied-from
- * revision. */
- const char *added_abspath = svn_dirent_dirname(work_del_abspath,
- scratch_pool);
-
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, &repos_relpath,
- &tmpinfo->repos_root_URL,
- &tmpinfo->repos_UUID,
- NULL, NULL, NULL,
- &tmpinfo->rev,
- db, added_abspath,
- result_pool, scratch_pool));
-
- tmpinfo->URL = svn_path_url_add_component2(
- tmpinfo->repos_root_URL,
- svn_relpath_join(repos_relpath,
- svn_dirent_skip_ancestor(added_abspath,
- local_abspath),
- scratch_pool),
- result_pool);
- }
- else
- {
- SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, &tmpinfo->rev,
- &repos_relpath,
- &tmpinfo->repos_root_URL,
- &tmpinfo->repos_UUID, NULL, NULL,
- NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
-
- tmpinfo->URL = svn_path_url_add_component2(tmpinfo->repos_root_URL,
- repos_relpath,
- result_pool);
- }
+
+ SVN_ERR(svn_wc__db_read_repos_info(&tmpinfo->rev, &repos_relpath,
+ &tmpinfo->repos_root_URL,
+ &tmpinfo->repos_UUID,
+ db, local_abspath,
+ result_pool, scratch_pool));
wc_info->schedule = svn_wc_schedule_delete;
+ tmpinfo->URL = svn_path_url_add_component2(tmpinfo->repos_root_URL,
+ repos_relpath, result_pool);
}
else if (status == svn_wc__db_status_not_present
|| status == svn_wc__db_status_server_excluded)
@@ -291,6 +249,21 @@ build_info_for_node(svn_wc__info2_t **info,
*info = NULL;
return SVN_NO_ERROR;
}
+ else if (status == svn_wc__db_status_excluded && !repos_relpath)
+ {
+ /* We have a WORKING exclude. Avoid segfault on no repos info */
+
+ SVN_ERR(svn_wc__db_read_repos_info(NULL, &repos_relpath,
+ &tmpinfo->repos_root_URL,
+ &tmpinfo->repos_UUID,
+ db, local_abspath,
+ result_pool, scratch_pool));
+
+ wc_info->schedule = svn_wc_schedule_normal;
+ tmpinfo->URL = svn_path_url_add_component2(tmpinfo->repos_root_URL,
+ repos_relpath, result_pool);
+ tmpinfo->wc_info->depth = svn_depth_exclude;
+ }
else
{
/* Just a BASE node. We have all the info we need */
@@ -298,10 +271,10 @@ build_info_for_node(svn_wc__info2_t **info,
repos_relpath,
result_pool);
wc_info->schedule = svn_wc_schedule_normal;
- }
- if (status == svn_wc__db_status_excluded)
- tmpinfo->wc_info->depth = svn_depth_exclude;
+ if (status == svn_wc__db_status_excluded)
+ wc_info->depth = svn_depth_exclude;
+ }
/* A default */
tmpinfo->size = SVN_INVALID_FILESIZE;
@@ -310,9 +283,10 @@ build_info_for_node(svn_wc__info2_t **info,
local_abspath, result_pool, scratch_pool));
if (conflicted)
- SVN_ERR(svn_wc__read_conflicts(&wc_info->conflicts, db,
- local_abspath,
- TRUE /* ### create tempfiles */,
+ SVN_ERR(svn_wc__read_conflicts(&wc_info->conflicts, NULL,
+ db, local_abspath,
+ FALSE /* create tempfiles */,
+ FALSE /* only tree conflicts */,
result_pool, scratch_pool));
else
wc_info->conflicts = NULL;
@@ -373,7 +347,7 @@ struct found_entry_baton
svn_boolean_t actual_only;
svn_boolean_t first;
/* The set of tree conflicts that have been found but not (yet) visited by
- * the tree walker. Map of abspath -> svn_wc_conflict_description2_t. */
+ * the tree walker. Map of abspath -> empty string. */
apr_hash_t *tree_conflicts;
apr_pool_t *pool;
};
@@ -533,9 +507,10 @@ svn_wc__get_info(svn_wc_context_t *wc_ctx,
for (hi = apr_hash_first(scratch_pool, fe_baton.tree_conflicts); hi;
hi = apr_hash_next(hi))
{
- const char *this_abspath = svn__apr_hash_index_key(hi);
+ const char *this_abspath = apr_hash_this_key(hi);
const svn_wc_conflict_description2_t *tree_conflict;
svn_wc__info2_t *info;
+ const apr_array_header_t *conflicts;
svn_pool_clear(iterpool);
@@ -543,35 +518,35 @@ svn_wc__get_info(svn_wc_context_t *wc_ctx,
if (!repos_root_url)
{
- SVN_ERR(svn_wc__internal_get_repos_info(NULL, NULL,
- &repos_root_url,
- &repos_uuid,
- wc_ctx->db,
- svn_dirent_dirname(
+ SVN_ERR(svn_wc__db_read_repos_info(NULL, NULL,
+ &repos_root_url,
+ &repos_uuid,
+ wc_ctx->db,
+ svn_dirent_dirname(
this_abspath,
iterpool),
- scratch_pool,
- iterpool));
+ scratch_pool, iterpool));
}
info->repos_root_URL = repos_root_url;
info->repos_UUID = repos_uuid;
- SVN_ERR(svn_wc__read_conflicts(&info->wc_info->conflicts,
+ SVN_ERR(svn_wc__read_conflicts(&conflicts, NULL,
wc_ctx->db, this_abspath,
- TRUE /* ### create tempfiles */,
+ FALSE /* create tempfiles */,
+ FALSE /* only tree conflicts */,
iterpool, iterpool));
-
- if (! info->wc_info->conflicts || ! info->wc_info->conflicts->nelts)
+ if (! conflicts || ! conflicts->nelts)
continue;
- tree_conflict = APR_ARRAY_IDX(info->wc_info->conflicts, 0,
- svn_wc_conflict_description2_t *);
+ tree_conflict = APR_ARRAY_IDX(conflicts, 0,
+ const svn_wc_conflict_description2_t *);
if (!depth_includes(local_abspath, depth, tree_conflict->local_abspath,
tree_conflict->node_kind, iterpool))
continue;
+ info->wc_info->conflicts = conflicts;
SVN_ERR(receiver(receiver_baton, this_abspath, info, iterpool));
}
svn_pool_destroy(iterpool);
diff --git a/subversion/libsvn_wc/libsvn_wc.pc.in b/subversion/libsvn_wc/libsvn_wc.pc.in
new file mode 100644
index 0000000..f44387e
--- /dev/null
+++ b/subversion/libsvn_wc/libsvn_wc.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_wc
+Description: Subversion Working Copy Library
+Version: @PACKAGE_VERSION@
+Requires: apr-util-@SVN_APR_MAJOR_VERSION@ apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_delta libsvn_diff libsvn_subr
+Libs: -L${libdir} -lsvn_wc
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_wc/lock.c b/subversion/libsvn_wc/lock.c
index 36fbb0e..2392c3f 100644
--- a/subversion/libsvn_wc/lock.c
+++ b/subversion/libsvn_wc/lock.c
@@ -1211,7 +1211,7 @@ open_anchor(svn_wc_adm_access_t **anchor_access,
if (disjoint)
{
/* Switched or disjoint, so drop P_ACCESS. Don't close any
- descendents, or we might blast the child. */
+ descendants, or we might blast the child. */
err = close_single(p_access, FALSE /* preserve_lock */, pool);
if (err)
{
@@ -1308,13 +1308,13 @@ do_close(svn_wc_adm_access_t *adm_access,
/* Gather all the opened access batons from the DB. */
opened = svn_wc__db_temp_get_all_access(adm_access->db, scratch_pool);
- /* Close any that are descendents of this baton. */
+ /* Close any that are descendants of this baton. */
for (hi = apr_hash_first(scratch_pool, opened);
hi;
hi = apr_hash_next(hi))
{
- const char *abspath = svn__apr_hash_index_key(hi);
- svn_wc_adm_access_t *child = svn__apr_hash_index_val(hi);
+ const char *abspath = apr_hash_this_key(hi);
+ svn_wc_adm_access_t *child = apr_hash_this_val(hi);
const char *path = child->path;
if (IS_MISSING(child))
@@ -1630,7 +1630,7 @@ svn_wc__acquire_write_lock_for_resolve(const char **lock_root_abspath,
scratch_pool, scratch_pool));
/* It's possible for the required lock path to be an ancestor
- of, a descendent of, or equal to, the obtained lock path. If
+ of, a descendant of, or equal to, the obtained lock path. If
it's an ancestor we have to try again, otherwise the obtained
lock will do. */
child = svn_dirent_skip_ancestor(required_abspath, obtained_abspath);
@@ -1643,7 +1643,7 @@ svn_wc__acquire_write_lock_for_resolve(const char **lock_root_abspath,
}
else
{
- /* required should be a descendent of, or equal to, obtained */
+ /* required should be a descendant of, or equal to, obtained */
SVN_ERR_ASSERT(!strcmp(required_abspath, obtained_abspath)
|| svn_dirent_skip_ancestor(obtained_abspath,
required_abspath));
diff --git a/subversion/libsvn_wc/merge.c b/subversion/libsvn_wc/merge.c
index 7cff3e4..85ec632 100644
--- a/subversion/libsvn_wc/merge.c
+++ b/subversion/libsvn_wc/merge.c
@@ -26,10 +26,11 @@
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_pools.h"
+#include "svn_props.h"
#include "wc.h"
-#include "adm_files.h"
#include "conflicts.h"
+#include "props.h"
#include "translate.h"
#include "workqueue.h"
@@ -179,7 +180,7 @@ detranslate_wc_file(const char **detranslated_abspath,
= prop ? (prop->value ? prop->value->data : NULL) : old_mime_value;
old_is_binary = old_mime_value && svn_mime_type_is_binary(old_mime_value);
- new_is_binary = new_mime_value && svn_mime_type_is_binary(new_mime_value);;
+ new_is_binary = new_mime_value && svn_mime_type_is_binary(new_mime_value);
}
/* See what translations we want to do */
@@ -391,6 +392,8 @@ do_text_merge(svn_boolean_t *contains_conflicts,
const char *target_label,
const char *left_label,
const char *right_label,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
svn_diff_t *diff;
@@ -415,13 +418,14 @@ do_text_merge(svn_boolean_t *contains_conflicts,
ostream = svn_stream_from_aprfile2(result_f, TRUE, pool);
- SVN_ERR(svn_diff_file_output_merge2(ostream, diff,
+ SVN_ERR(svn_diff_file_output_merge3(ostream, diff,
left, detranslated_target, right,
left_marker,
target_marker,
right_marker,
"=======", /* separator */
- svn_diff_conflict_display_modified_latest,
+ svn_diff_conflict_display_modified_original_latest,
+ cancel_func, cancel_baton,
pool));
SVN_ERR(svn_stream_close(ostream));
@@ -725,16 +729,20 @@ merge_file_trivial(svn_skel_t **work_items,
{
svn_stream_t *tmp_src;
svn_stream_t *tmp_dst;
+ const char *tmp_dir;
SVN_ERR(svn_stream_open_readonly(&tmp_src, right_abspath,
scratch_pool,
scratch_pool));
- SVN_ERR(svn_wc__open_writable_base(&tmp_dst, &right_abspath,
- NULL, NULL,
- db, target_abspath,
- scratch_pool,
- scratch_pool));
+ SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&tmp_dir, db,
+ target_abspath,
+ scratch_pool,
+ scratch_pool));
+
+ SVN_ERR(svn_stream_open_unique(&tmp_dst, &right_abspath,
+ tmp_dir, svn_io_file_del_none,
+ scratch_pool, scratch_pool));
SVN_ERR(svn_stream_copy3(tmp_src, tmp_dst,
cancel_func, cancel_baton,
@@ -866,15 +874,17 @@ merge_text_file(svn_skel_t **work_items,
target_label,
left_label,
right_label,
+ cancel_func, cancel_baton,
pool));
SVN_ERR(svn_io_file_close(result_f, pool));
/* Determine the MERGE_OUTCOME, and record any conflict. */
- if (contains_conflicts && ! dry_run)
+ if (contains_conflicts)
{
*merge_outcome = svn_wc_merge_conflict;
- if (*merge_outcome == svn_wc_merge_conflict)
+
+ if (! dry_run)
{
const char *left_copy, *right_copy, *target_copy;
@@ -902,12 +912,7 @@ merge_text_file(svn_skel_t **work_items,
result_pool,
scratch_pool));
}
-
- if (*merge_outcome == svn_wc_merge_merged)
- goto done;
}
- else if (contains_conflicts && dry_run)
- *merge_outcome = svn_wc_merge_conflict;
else
{
svn_boolean_t same, special;
@@ -941,7 +946,6 @@ merge_text_file(svn_skel_t **work_items,
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
}
-done:
/* Remove the tempfile after use */
SVN_ERR(svn_wc__wq_build_file_remove(&work_item, mt->db, mt->local_abspath,
result_target,
@@ -1226,6 +1230,7 @@ svn_wc_merge5(enum svn_wc_merge_outcome_t *merge_content_outcome,
apr_hash_t *pristine_props = NULL;
apr_hash_t *old_actual_props;
apr_hash_t *new_actual_props = NULL;
+ svn_node_kind_t kind;
SVN_ERR_ASSERT(svn_dirent_is_absolute(left_abspath));
SVN_ERR_ASSERT(svn_dirent_is_absolute(right_abspath));
@@ -1238,7 +1243,6 @@ svn_wc_merge5(enum svn_wc_merge_outcome_t *merge_content_outcome,
/* Sanity check: the merge target must be a file under revision control */
{
svn_wc__db_status_t status;
- svn_node_kind_t kind;
svn_boolean_t had_props;
svn_boolean_t props_mod;
svn_boolean_t conflicted;
@@ -1401,7 +1405,7 @@ svn_wc_merge5(enum svn_wc_merge_outcome_t *merge_content_outcome,
svn_boolean_t text_conflicted, prop_conflicted;
SVN_ERR(svn_wc__conflict_invoke_resolver(
- wc_ctx->db, target_abspath,
+ wc_ctx->db, target_abspath, kind,
conflict_skel, merge_options,
conflict_func, conflict_baton,
cancel_func, cancel_baton,
diff --git a/subversion/libsvn_wc/node.c b/subversion/libsvn_wc/node.c
index a1d6b02..560a899 100644
--- a/subversion/libsvn_wc/node.c
+++ b/subversion/libsvn_wc/node.c
@@ -54,18 +54,14 @@
/* Set *CHILDREN_ABSPATHS to a new array of the full paths formed by joining
- * each name in REL_CHILDREN onto DIR_ABSPATH. If SHOW_HIDDEN is false then
- * omit any paths that are reported as 'hidden' by svn_wc__db_node_hidden().
+ * each name in REL_CHILDREN onto DIR_ABSPATH.
*
* Allocate the output array and its elements in RESULT_POOL. */
-static svn_error_t *
-filter_and_make_absolute(const apr_array_header_t **children_abspaths,
- svn_wc_context_t *wc_ctx,
- const char *dir_abspath,
- const apr_array_header_t *rel_children,
- svn_boolean_t show_hidden,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+static void
+make_absolute(const apr_array_header_t **children_abspaths,
+ const char *dir_abspath,
+ const apr_array_header_t *rel_children,
+ apr_pool_t *result_pool)
{
apr_array_header_t *children;
int i;
@@ -74,29 +70,13 @@ filter_and_make_absolute(const apr_array_header_t **children_abspaths,
sizeof(const char *));
for (i = 0; i < rel_children->nelts; i++)
{
- const char *child_abspath = svn_dirent_join(dir_abspath,
- APR_ARRAY_IDX(rel_children,
- i,
- const char *),
- result_pool);
-
- /* Don't add hidden nodes to *CHILDREN if we don't want them. */
- if (!show_hidden)
- {
- svn_boolean_t child_is_hidden;
-
- SVN_ERR(svn_wc__db_node_hidden(&child_is_hidden, wc_ctx->db,
- child_abspath, scratch_pool));
- if (child_is_hidden)
- continue;
- }
-
- APR_ARRAY_PUSH(children, const char *) = child_abspath;
+ const char *name = APR_ARRAY_IDX(rel_children, i, const char *);
+ APR_ARRAY_PUSH(children, const char *) =
+ svn_dirent_join(dir_abspath, name,
+ result_pool);
}
*children_abspaths = children;
-
- return SVN_NO_ERROR;
}
@@ -104,139 +84,36 @@ 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)
{
- const apr_array_header_t *rel_children;
+ const apr_array_header_t *child_names;
- SVN_ERR(svn_wc__db_read_children_of_working_node(&rel_children,
+ SVN_ERR(svn_wc__db_read_children_of_working_node(&child_names,
wc_ctx->db, dir_abspath,
scratch_pool, scratch_pool));
- SVN_ERR(filter_and_make_absolute(children, wc_ctx, dir_abspath,
- rel_children, show_hidden,
- result_pool, scratch_pool));
+ make_absolute(children, dir_abspath, child_names, result_pool);
return SVN_NO_ERROR;
}
-
-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)
-{
- const apr_array_header_t *rel_children;
-
- SVN_ERR(svn_wc__db_read_children(&rel_children, wc_ctx->db, dir_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR(filter_and_make_absolute(children, wc_ctx, dir_abspath,
- rel_children, show_hidden,
- result_pool, scratch_pool));
- return SVN_NO_ERROR;
-}
-
svn_error_t *
-svn_wc__internal_get_repos_info(svn_revnum_t *revision,
- const char **repos_relpath,
- const char **repos_root_url,
- const char **repos_uuid,
- svn_wc__db_t *db,
- const char *local_abspath,
- 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)
{
- svn_wc__db_status_t status;
- svn_boolean_t have_work;
-
- SVN_ERR(svn_wc__db_read_info(&status, NULL, revision, repos_relpath,
- repos_root_url, repos_uuid,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, &have_work,
- db, local_abspath,
- result_pool, scratch_pool));
-
- if ((repos_relpath ? *repos_relpath != NULL : TRUE)
- && (repos_root_url ? *repos_root_url != NULL: TRUE)
- && (repos_uuid ? *repos_uuid != NULL : TRUE))
- return SVN_NO_ERROR; /* We got the requested information */
-
- if (!have_work) /* not-present, (server-)excluded? */
- {
- return SVN_NO_ERROR; /* Can't fetch more */
- }
-
- if (status == svn_wc__db_status_deleted)
- {
- const char *base_del_abspath, *wrk_del_abspath;
-
- SVN_ERR(svn_wc__db_scan_deletion(&base_del_abspath, NULL,
- &wrk_del_abspath, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
-
- if (base_del_abspath)
- {
- SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, repos_relpath,
- repos_root_url, repos_uuid, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL,
- db, base_del_abspath,
- result_pool, scratch_pool));
-
- /* If we have a repos_relpath, it is of the op-root */
- if (repos_relpath)
- *repos_relpath = svn_relpath_join(*repos_relpath,
- svn_dirent_skip_ancestor(base_del_abspath,
- local_abspath),
- result_pool);
- /* We keep revision as SVN_INVALID_REVNUM */
- }
- else if (wrk_del_abspath)
- {
- const char *op_root_abspath = NULL;
-
- SVN_ERR(svn_wc__db_scan_addition(NULL, repos_relpath
- ? &op_root_abspath : NULL,
- repos_relpath, repos_root_url,
- repos_uuid, NULL, NULL, NULL, NULL,
- db, svn_dirent_dirname(
- wrk_del_abspath,
- scratch_pool),
- result_pool, scratch_pool));
-
- /* If we have a repos_relpath, it is of the op-root */
- if (repos_relpath)
- *repos_relpath = svn_relpath_join(
- *repos_relpath,
- svn_dirent_skip_ancestor(op_root_abspath,
- local_abspath),
- result_pool);
- }
- }
- else /* added, or WORKING incomplete */
- {
- const char *op_root_abspath = NULL;
-
- /* We have an addition. scan_addition() will find the intended
- repository location by scanning up the tree. */
- SVN_ERR(svn_wc__db_scan_addition(NULL, repos_relpath
- ? &op_root_abspath : NULL,
- repos_relpath, repos_root_url,
- repos_uuid, NULL, NULL, NULL, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
- }
+ const apr_array_header_t *child_names;
- SVN_ERR_ASSERT(repos_root_url == NULL || *repos_root_url != NULL);
- SVN_ERR_ASSERT(repos_uuid == NULL || *repos_uuid != NULL);
+ SVN_ERR(svn_wc__db_base_read_not_present_children(
+ &child_names,
+ wc_ctx->db, dir_abspath,
+ scratch_pool, scratch_pool));
+ make_absolute(children, dir_abspath, child_names, result_pool);
return SVN_NO_ERROR;
}
+
svn_error_t *
svn_wc__node_get_repos_info(svn_revnum_t *revision,
const char **repos_relpath,
@@ -248,12 +125,12 @@ svn_wc__node_get_repos_info(svn_revnum_t *revision,
apr_pool_t *scratch_pool)
{
return svn_error_trace(
- svn_wc__internal_get_repos_info(revision,
- repos_relpath,
- repos_root_url,
- repos_uuid,
- wc_ctx->db, local_abspath,
- result_pool, scratch_pool));
+ svn_wc__db_read_repos_info(revision,
+ repos_relpath,
+ repos_root_url,
+ repos_uuid,
+ wc_ctx->db, local_abspath,
+ result_pool, scratch_pool));
}
/* Convert DB_KIND into the appropriate NODE_KIND value.
@@ -323,21 +200,6 @@ svn_wc_read_kind2(svn_node_kind_t *kind,
}
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)
-{
- return svn_error_trace(
- svn_wc__db_read_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, depth, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- wc_ctx->db, local_abspath, scratch_pool,
- scratch_pool));
-}
-
-svn_error_t *
svn_wc__node_get_changed_info(svn_revnum_t *changed_rev,
apr_time_t *changed_date,
const char **changed_author,
@@ -362,8 +224,18 @@ svn_wc__node_get_url(const char **url,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(svn_wc__db_read_url(url, wc_ctx->db, local_abspath,
- result_pool, scratch_pool));
+ const char *repos_root_url;
+ const char *repos_relpath;
+
+ SVN_ERR(svn_wc__db_read_repos_info(NULL, &repos_relpath, &repos_root_url,
+ NULL,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ *url = svn_path_url_add_component2(repos_root_url, repos_relpath,
+ result_pool);
+
+ return SVN_NO_ERROR;
}
/* A recursive node-walker, helper for svn_wc__internal_walk_children().
@@ -388,25 +260,24 @@ walker_helper(svn_wc__db_t *db,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
- apr_hash_t *rel_children_info;
- apr_hash_index_t *hi;
apr_pool_t *iterpool;
+ const apr_array_header_t *items;
+ int i;
if (depth == svn_depth_empty)
return SVN_NO_ERROR;
- SVN_ERR(svn_wc__db_read_children_walker_info(&rel_children_info, db,
- dir_abspath, scratch_pool,
- scratch_pool));
+ iterpool = svn_pool_create(scratch_pool);
+ SVN_ERR(svn_wc__db_read_children_walker_info(&items, db,
+ dir_abspath, scratch_pool,
+ iterpool));
- iterpool = svn_pool_create(scratch_pool);
- for (hi = apr_hash_first(scratch_pool, rel_children_info);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < items->nelts; i++)
{
- const char *child_name = svn__apr_hash_index_key(hi);
- struct svn_wc__db_walker_info_t *wi = svn__apr_hash_index_val(hi);
+ struct svn_wc__db_walker_info_t *wi =
+ APR_ARRAY_IDX(items, i, struct svn_wc__db_walker_info_t *);
+ const char *child_name = wi->name;
svn_node_kind_t child_kind = wi->kind;
svn_wc__db_status_t child_status = wi->status;
const char *child_abspath;
@@ -489,6 +360,7 @@ svn_wc__internal_walk_children(svn_wc__db_t *db,
svn_node_kind_t kind;
svn_wc__db_status_t status;
apr_hash_t *changelist_hash = NULL;
+ const char *changelist = NULL;
SVN_ERR_ASSERT(walk_depth >= svn_depth_empty
&& walk_depth <= svn_depth_infinity);
@@ -501,14 +373,17 @@ svn_wc__internal_walk_children(svn_wc__db_t *db,
SVN_ERR(svn_wc__db_read_info(&status, &db_kind, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ changelist_hash ? &changelist : NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
db, local_abspath, scratch_pool, scratch_pool));
SVN_ERR(convert_db_kind_to_node_kind(&kind, db_kind, status, show_hidden));
- if (svn_wc__internal_changelist_match(db, local_abspath,
- changelist_hash, scratch_pool))
- SVN_ERR(walk_callback(local_abspath, kind, walk_baton, scratch_pool));
+ if (!changelist_hash
+ || (changelist && svn_hash_gets(changelist_hash, changelist)))
+ {
+ SVN_ERR(walk_callback(local_abspath, kind, walk_baton, scratch_pool));
+ }
if (db_kind == svn_node_file
|| status == svn_wc__db_status_not_present
@@ -531,54 +406,6 @@ svn_wc__internal_walk_children(svn_wc__db_t *db,
}
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)
-{
- svn_wc__db_status_t status;
-
- SVN_ERR(svn_wc__db_read_info(&status,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- wc_ctx->db, local_abspath,
- scratch_pool, scratch_pool));
-
- *is_deleted = (status == svn_wc__db_status_deleted);
-
- return SVN_NO_ERROR;
-}
-
-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)
-{
- svn_wc__db_status_t status;
-
- *deleted_ancestor_abspath = NULL;
-
- SVN_ERR(svn_wc__db_read_info(&status,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- wc_ctx->db, local_abspath,
- scratch_pool, scratch_pool));
-
- if (status == svn_wc__db_status_deleted)
- SVN_ERR(svn_wc__db_scan_deletion(deleted_ancestor_abspath, NULL, NULL,
- NULL, wc_ctx->db, local_abspath,
- result_pool, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
svn_wc__node_is_not_present(svn_boolean_t *is_not_present,
svn_boolean_t *is_excluded,
svn_boolean_t *is_server_excluded,
@@ -671,7 +498,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)
{
@@ -691,9 +517,8 @@ svn_wc__node_get_base(svn_node_kind_t *kind,
if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
else if (err
- || (!err && !show_hidden
- && (status != svn_wc__db_status_normal
- && status != svn_wc__db_status_incomplete)))
+ || (status != svn_wc__db_status_normal
+ && status != svn_wc__db_status_incomplete))
{
if (!ignore_enoent)
{
@@ -783,133 +608,6 @@ svn_wc__node_get_pre_ng_status_data(svn_revnum_t *revision,
}
svn_error_t *
-svn_wc__internal_node_get_schedule(svn_wc_schedule_t *schedule,
- svn_boolean_t *copied,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_status_t status;
- svn_boolean_t op_root;
- svn_boolean_t have_base;
- svn_boolean_t have_work;
- svn_boolean_t have_more_work;
- const char *copyfrom_relpath;
-
- if (schedule)
- *schedule = svn_wc_schedule_normal;
- if (copied)
- *copied = FALSE;
-
- SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, &copyfrom_relpath,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- &op_root, NULL, NULL,
- &have_base, &have_more_work, &have_work,
- db, local_abspath, scratch_pool, scratch_pool));
-
- switch (status)
- {
- case svn_wc__db_status_not_present:
- case svn_wc__db_status_server_excluded:
- case svn_wc__db_status_excluded:
- /* We used status normal in the entries world. */
- if (schedule)
- *schedule = svn_wc_schedule_normal;
- break;
- case svn_wc__db_status_normal:
- case svn_wc__db_status_incomplete:
- break;
-
- case svn_wc__db_status_deleted:
- {
- if (schedule)
- *schedule = svn_wc_schedule_delete;
-
- if (!copied)
- break;
-
- if (have_more_work || !have_base)
- *copied = TRUE;
- else
- {
- const char *work_del_abspath;
-
- /* Find out details of our deletion. */
- SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL,
- &work_del_abspath, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
-
- if (work_del_abspath)
- *copied = TRUE; /* Working deletion */
- }
- break;
- }
- case svn_wc__db_status_added:
- {
- if (!op_root)
- {
- if (copied)
- *copied = TRUE;
-
- if (schedule)
- *schedule = svn_wc_schedule_normal;
-
- break;
- }
-
- if (copied)
- *copied = (copyfrom_relpath != NULL);
-
- if (schedule)
- *schedule = svn_wc_schedule_add;
- else
- break;
-
- /* Check for replaced */
- if (have_base || have_more_work)
- {
- svn_wc__db_status_t below_working;
- SVN_ERR(svn_wc__db_info_below_working(&have_base, &have_work,
- &below_working,
- db, local_abspath,
- scratch_pool));
-
- /* If the node is not present or deleted (read: not present
- in working), then the node is not a replacement */
- if (below_working != svn_wc__db_status_not_present
- && below_working != svn_wc__db_status_deleted)
- {
- *schedule = svn_wc_schedule_replace;
- break;
- }
- }
- break;
- }
- default:
- SVN_ERR_MALFUNCTION();
- }
-
- return SVN_NO_ERROR;
-}
-
-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)
-{
- return svn_error_trace(
- svn_wc__internal_node_get_schedule(schedule,
- copied,
- wc_ctx->db,
- local_abspath,
- scratch_pool));
-}
-
-svn_error_t *
svn_wc__node_clear_dav_cache_recursive(svn_wc_context_t *wc_ctx,
const char *local_abspath,
apr_pool_t *scratch_pool)
@@ -952,6 +650,7 @@ svn_wc__internal_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__db_t *db,
const char *local_abspath,
@@ -964,20 +663,24 @@ svn_wc__internal_get_origin(svn_boolean_t *is_copy,
const char *original_repos_uuid;
svn_revnum_t original_revision;
svn_wc__db_status_t status;
+ svn_boolean_t have_more_work;
+ svn_boolean_t op_root;
const char *tmp_repos_relpath;
+ if (copy_root_abspath)
+ *copy_root_abspath = NULL;
if (!repos_relpath)
repos_relpath = &tmp_repos_relpath;
SVN_ERR(svn_wc__db_read_info(&status, NULL, revision, repos_relpath,
repos_root_url, repos_uuid, NULL, NULL, NULL,
- NULL, NULL, NULL,
+ depth, NULL, NULL,
&original_repos_relpath,
&original_repos_root_url,
&original_repos_uuid, &original_revision,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, is_copy,
+ NULL, NULL, NULL, NULL, NULL, &op_root, NULL,
+ NULL, NULL, &have_more_work, is_copy,
db, local_abspath, result_pool, scratch_pool));
if (*repos_relpath)
@@ -995,6 +698,7 @@ svn_wc__internal_get_origin(svn_boolean_t *is_copy,
if (original_repos_relpath)
{
+ /* We an have a copy */
*repos_relpath = original_repos_relpath;
if (revision)
*revision = original_revision;
@@ -1005,21 +709,19 @@ svn_wc__internal_get_origin(svn_boolean_t *is_copy,
if (copy_root_abspath == NULL)
return SVN_NO_ERROR;
+ else if (op_root)
+ {
+ *copy_root_abspath = apr_pstrdup(result_pool, local_abspath);
+ return SVN_NO_ERROR;
+ }
}
{
svn_boolean_t scan_working = FALSE;
- if (status == svn_wc__db_status_added)
+ if (status == svn_wc__db_status_added
+ || (status == svn_wc__db_status_deleted && have_more_work))
scan_working = TRUE;
- else if (status == svn_wc__db_status_deleted)
- {
- svn_boolean_t have_base;
- /* Is this a BASE or a WORKING delete? */
- SVN_ERR(svn_wc__db_info_below_working(&have_base, &scan_working,
- &status, db, local_abspath,
- scratch_pool));
- }
if (scan_working)
{
@@ -1079,6 +781,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,
@@ -1088,7 +791,7 @@ svn_wc__node_get_origin(svn_boolean_t *is_copy,
{
return svn_error_trace(svn_wc__internal_get_origin(is_copy, revision,
repos_relpath, repos_root_url, repos_uuid,
- copy_root_abspath,
+ depth, copy_root_abspath,
wc_ctx->db, local_abspath, scan_deleted,
result_pool, scratch_pool));
}
@@ -1364,16 +1067,22 @@ svn_wc__node_was_moved_away(const char **moved_to_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_boolean_t is_deleted;
+ svn_wc__db_status_t status;
if (moved_to_abspath)
*moved_to_abspath = NULL;
if (op_root_abspath)
*op_root_abspath = NULL;
- SVN_ERR(svn_wc__node_is_status_deleted(&is_deleted, wc_ctx, local_abspath,
- scratch_pool));
- if (is_deleted)
+ SVN_ERR(svn_wc__db_read_info(&status,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (status == svn_wc__db_status_deleted)
SVN_ERR(svn_wc__db_scan_deletion(NULL, moved_to_abspath, NULL,
op_root_abspath, wc_ctx->db,
local_abspath,
diff --git a/subversion/libsvn_wc/old-and-busted.c b/subversion/libsvn_wc/old-and-busted.c
index b87be85..8cd94af 100644
--- a/subversion/libsvn_wc/old-and-busted.c
+++ b/subversion/libsvn_wc/old-and-busted.c
@@ -443,7 +443,7 @@ svn_wc__serialize_file_external(const char **str,
SVN_ERR(opt_revision_to_string(&s1, path, peg_rev, pool));
SVN_ERR(opt_revision_to_string(&s2, path, rev, pool));
- s = apr_pstrcat(pool, s1, ":", s2, ":", path, (char *)NULL);
+ s = apr_pstrcat(pool, s1, ":", s2, ":", path, SVN_VA_NULL);
}
else
s = NULL;
@@ -1154,7 +1154,7 @@ resolve_to_defaults(apr_hash_t *entries,
/* Then use it to fill in missing information in other entries. */
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
- svn_wc_entry_t *this_entry = svn__apr_hash_index_val(hi);
+ svn_wc_entry_t *this_entry = apr_hash_this_val(hi);
if (this_entry == default_entry)
/* THIS_DIR already has all the information it can possibly
diff --git a/subversion/libsvn_wc/props.c b/subversion/libsvn_wc/props.c
index a7b2339..664bcf1 100644
--- a/subversion/libsvn_wc/props.c
+++ b/subversion/libsvn_wc/props.c
@@ -62,31 +62,6 @@
#include "svn_private_config.h"
-/* Forward declaration. */
-static svn_error_t *
-prop_conflict_from_skel(const svn_string_t **conflict_desc,
- const svn_skel_t *skel,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-/* Given a *SINGLE* property conflict in PROP_SKEL, generate a description
- for it, and write it to STREAM, along with a trailing EOL sequence.
-
- See prop_conflict_from_skel() for details on PROP_SKEL. */
-static svn_error_t *
-append_prop_conflict(svn_stream_t *stream,
- const svn_skel_t *prop_skel,
- apr_pool_t *pool)
-{
- /* TODO: someday, perhaps prefix each conflict_description with a
- timestamp or something? */
- const svn_string_t *conflict_desc;
-
- SVN_ERR(prop_conflict_from_skel(&conflict_desc, prop_skel, pool, pool));
-
- return svn_stream_puts(stream, conflict_desc->data);
-}
-
/*---------------------------------------------------------------------*/
/*** Merging propchanges into the working copy ***/
@@ -352,7 +327,8 @@ svn_wc_merge_props3(svn_wc_notify_state_t *state,
{
svn_boolean_t prop_conflicted;
- SVN_ERR(svn_wc__conflict_invoke_resolver(db, local_abspath, conflict_skel,
+ SVN_ERR(svn_wc__conflict_invoke_resolver(db, local_abspath, kind,
+ conflict_skel,
NULL /* merge_options */,
conflict_func, conflict_baton,
cancel_func, cancel_baton,
@@ -531,89 +507,96 @@ maybe_prop_value(const svn_skel_t *skel,
}
-/* Parse a property conflict description from the provided SKEL.
- The result includes a descriptive message (see generate_conflict_message)
- and maybe a diff of property values containing conflict markers.
- The result will be allocated in RESULT_POOL.
-
- Note: SKEL is a single property conflict of the form:
-
- ("prop" ([ORIGINAL]) ([MINE]) ([INCOMING]) ([INCOMING_BASE]))
-
- See notes/wc-ng/conflict-storage for more information. */
+/* Create a property rejection description for the specified property.
+ The result will be allocated in RESULT_POOL. */
static svn_error_t *
-prop_conflict_from_skel(const svn_string_t **conflict_desc,
- const svn_skel_t *skel,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+prop_conflict_new(const svn_string_t **conflict_desc,
+ const char *propname,
+ const svn_string_t *original,
+ const svn_string_t *mine,
+ const svn_string_t *incoming,
+ const svn_string_t *incoming_base,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- const svn_string_t *original;
- const svn_string_t *mine;
- const svn_string_t *incoming;
- const svn_string_t *incoming_base;
- const char *propname;
svn_diff_t *diff;
svn_diff_file_options_t *diff_opts;
svn_stringbuf_t *buf;
- svn_boolean_t original_is_binary;
+ svn_boolean_t incoming_base_is_binary;
svn_boolean_t mine_is_binary;
svn_boolean_t incoming_is_binary;
- /* Navigate to the property name. */
- skel = skel->children->next;
-
- /* We need to copy these into SCRATCH_POOL in order to nul-terminate
- the values. */
- propname = apr_pstrmemdup(scratch_pool, skel->data, skel->len);
- original = maybe_prop_value(skel->next, scratch_pool);
- mine = maybe_prop_value(skel->next->next, scratch_pool);
- incoming = maybe_prop_value(skel->next->next->next, scratch_pool);
- incoming_base = maybe_prop_value(skel->next->next->next->next, scratch_pool);
-
buf = generate_conflict_message(propname, original, mine, incoming,
incoming_base, scratch_pool);
+ /* Convert deleted or not-yet-added values to empty-string values, for the
+ purposes of diff generation and binary detection. */
if (mine == NULL)
mine = svn_string_create_empty(scratch_pool);
if (incoming == NULL)
incoming = svn_string_create_empty(scratch_pool);
+ if (incoming_base == NULL)
+ incoming_base = svn_string_create_empty(scratch_pool);
- /* Pick a suitable base for the conflict diff.
- * The incoming value is always a change,
- * but the local value might not have changed. */
- if (original == NULL)
- {
- if (incoming_base)
- original = incoming_base;
- else
- original = svn_string_create_empty(scratch_pool);
- }
- else if (incoming_base && svn_string_compare(original, mine))
- original = incoming_base;
+ /* How we render the conflict:
+
+ We have four sides: original, mine, incoming_base, incoming.
+ We render the conflict as a 3-way diff. A diff3 API has three parts,
+ called:
+
+ <<< - original
+ ||| - modified (or "older")
+ === - latest (or "theirs")
+ >>>
+
+ We fill those parts as follows:
+
+ PART FILLED BY SKEL MEMBER USER-FACING ROLE
+ ==== ===================== ================
+ original mine was WORKING tree at conflict creation
+ modified incoming_base left-hand side of merge
+ latest incoming right-hand side of merge
+ (none) original was BASE tree at conflict creation
+
+ An 'update -r rN' is treated like a 'merge -r BASE:rN', i.e., in an
+ 'update' operation skel->original and skel->incoming_base coincide.
+
+ Note that the term "original" is used both in the skel and in diff3
+ with different meanings. Note also that the skel's ORIGINAL value was
+ at some point in the BASE tree, but the BASE tree need not have contained
+ the INCOMING_BASE value.
+
+ Yes, it's confusing. */
/* If any of the property values involved in the diff is binary data,
* do not generate a diff. */
- original_is_binary = svn_io_is_binary_data(original->data, original->len);
+ incoming_base_is_binary = svn_io_is_binary_data(incoming_base->data,
+ incoming_base->len);
mine_is_binary = svn_io_is_binary_data(mine->data, mine->len);
incoming_is_binary = svn_io_is_binary_data(incoming->data, incoming->len);
- if (!(original_is_binary || mine_is_binary || incoming_is_binary))
+ if (!(incoming_base_is_binary || mine_is_binary || incoming_is_binary))
{
diff_opts = svn_diff_file_options_create(scratch_pool);
diff_opts->ignore_space = svn_diff_file_ignore_space_none;
diff_opts->ignore_eol_style = FALSE;
diff_opts->show_c_function = FALSE;
- SVN_ERR(svn_diff_mem_string_diff3(&diff, original, mine, incoming,
+ /* Pass skel member INCOMING_BASE into the formal parameter ORIGINAL.
+ Ignore the skel member ORIGINAL. */
+ SVN_ERR(svn_diff_mem_string_diff3(&diff, incoming_base, mine, incoming,
diff_opts, scratch_pool));
if (svn_diff_contains_conflicts(diff))
{
svn_stream_t *stream;
svn_diff_conflict_display_style_t style;
const char *mine_marker = _("<<<<<<< (local property value)");
- const char *incoming_marker = _(">>>>>>> (incoming property value)");
+ const char *incoming_marker = _(">>>>>>> (incoming 'changed to' value)");
+ const char *incoming_base_marker = _("||||||| (incoming 'changed from' value)");
const char *separator = "=======";
- svn_string_t *original_ascii =
- svn_string_create(svn_utf_cstring_from_utf8_fuzzy(original->data,
+ svn_string_t *incoming_base_ascii =
+ svn_string_create(svn_utf_cstring_from_utf8_fuzzy(incoming_base->data,
scratch_pool),
scratch_pool);
svn_string_t *mine_ascii =
@@ -625,16 +608,18 @@ prop_conflict_from_skel(const svn_string_t **conflict_desc,
scratch_pool),
scratch_pool);
- style = svn_diff_conflict_display_modified_latest;
+ style = svn_diff_conflict_display_modified_original_latest;
stream = svn_stream_from_stringbuf(buf, scratch_pool);
SVN_ERR(svn_stream_skip(stream, buf->len));
- SVN_ERR(svn_diff_mem_string_output_merge2(stream, diff,
- original_ascii,
+ SVN_ERR(svn_diff_mem_string_output_merge3(stream, diff,
+ incoming_base_ascii,
mine_ascii,
incoming_ascii,
- NULL, mine_marker,
+ incoming_base_marker, mine_marker,
incoming_marker, separator,
- style, scratch_pool));
+ style,
+ cancel_func, cancel_baton,
+ scratch_pool));
SVN_ERR(svn_stream_close(stream));
*conflict_desc = svn_string_create_from_buf(buf, result_pool);
@@ -669,6 +654,49 @@ prop_conflict_from_skel(const svn_string_t **conflict_desc,
return SVN_NO_ERROR;
}
+/* Parse a property conflict description from the provided SKEL.
+ The result includes a descriptive message (see generate_conflict_message)
+ and maybe a diff of property values containing conflict markers.
+ The result will be allocated in RESULT_POOL.
+
+ Note: SKEL is a single property conflict of the form:
+
+ ("prop" ([ORIGINAL]) ([MINE]) ([INCOMING]) ([INCOMING_BASE]))
+
+ Note: This is not the same format as the property conflicts we store in
+ wc.db since 1.8. This is the legacy format used in the Workqueue in 1.7-1.8 */
+static svn_error_t *
+prop_conflict_from_skel(const svn_string_t **conflict_desc,
+ const svn_skel_t *skel,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const svn_string_t *original;
+ const svn_string_t *mine;
+ const svn_string_t *incoming;
+ const svn_string_t *incoming_base;
+ const char *propname;
+
+ /* Navigate to the property name. */
+ skel = skel->children->next;
+
+ /* We need to copy these into SCRATCH_POOL in order to nul-terminate
+ the values. */
+ propname = apr_pstrmemdup(scratch_pool, skel->data, skel->len);
+ original = maybe_prop_value(skel->next, scratch_pool);
+ mine = maybe_prop_value(skel->next->next, scratch_pool);
+ incoming = maybe_prop_value(skel->next->next->next, scratch_pool);
+ incoming_base = maybe_prop_value(skel->next->next->next->next, scratch_pool);
+
+ return svn_error_trace(prop_conflict_new(conflict_desc,
+ propname,
+ original, mine,
+ incoming, incoming_base,
+ cancel_func, cancel_baton,
+ result_pool, scratch_pool));
+}
/* Create a property conflict file at PREJFILE based on the property
conflicts in CONFLICT_SKEL. */
@@ -676,7 +704,9 @@ svn_error_t *
svn_wc__create_prejfile(const char **tmp_prejfile_abspath,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_skel_t *conflict_skel,
+ const svn_skel_t *prop_conflict_data,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -694,11 +724,88 @@ svn_wc__create_prejfile(const char **tmp_prejfile_abspath,
tempdir_abspath, svn_io_file_del_none,
scratch_pool, iterpool));
- for (scan = conflict_skel->children->next; scan != NULL; scan = scan->next)
+ if (prop_conflict_data)
{
- svn_pool_clear(iterpool);
+ for (scan = prop_conflict_data->children->next;
+ scan != NULL; scan = scan->next)
+ {
+ const svn_string_t *conflict_desc;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(prop_conflict_from_skel(&conflict_desc, scan,
+ cancel_func, cancel_baton,
+ iterpool, iterpool));
- SVN_ERR(append_prop_conflict(stream, scan, iterpool));
+ SVN_ERR(svn_stream_puts(stream, conflict_desc->data));
+ }
+ }
+ else
+ {
+ svn_wc_operation_t operation;
+ apr_hash_index_t *hi;
+ apr_hash_t *old_props;
+ apr_hash_t *mine_props;
+ apr_hash_t *their_original_props;
+ apr_hash_t *their_props;
+ apr_hash_t *conflicted_props;
+ svn_skel_t *conflicts;
+
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, NULL, NULL,
+ db, local_abspath,
+ conflicts,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__conflict_read_prop_conflict(NULL,
+ &mine_props,
+ &their_original_props,
+ &their_props,
+ &conflicted_props,
+ db, local_abspath,
+ conflicts,
+ scratch_pool,
+ scratch_pool));
+
+ if (operation == svn_wc_operation_merge)
+ SVN_ERR(svn_wc__db_read_pristine_props(&old_props, db, local_abspath,
+ scratch_pool, scratch_pool));
+ else
+ old_props = their_original_props;
+
+ /* ### TODO: Sort conflicts? */
+ for (hi = apr_hash_first(scratch_pool, conflicted_props);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const svn_string_t *conflict_desc;
+ const char *propname = apr_hash_this_key(hi);
+ const svn_string_t *old_value;
+ const svn_string_t *mine_value;
+ const svn_string_t *their_value;
+ const svn_string_t *their_original_value;
+
+ svn_pool_clear(iterpool);
+
+ old_value = old_props ? svn_hash_gets(old_props, propname) : NULL;
+ mine_value = mine_props ? svn_hash_gets(mine_props, propname) : NULL;
+ their_value = their_props ? svn_hash_gets(their_props, propname)
+ : NULL;
+ their_original_value = their_original_props
+ ? svn_hash_gets(their_original_props, propname)
+ : NULL;
+
+ SVN_ERR(prop_conflict_new(&conflict_desc,
+ propname, old_value, mine_value,
+ their_value, their_original_value,
+ cancel_func, cancel_baton,
+ iterpool, iterpool));
+
+ SVN_ERR(svn_stream_puts(stream, conflict_desc->data));
+ }
}
SVN_ERR(svn_stream_close(stream));
@@ -1167,7 +1274,7 @@ svn_wc__merge_props(svn_skel_t **conflict_skel,
svn_pool_clear(iterpool);
- to_val = to_val ? svn_string_dup(to_val, result_pool) : NULL;
+ to_val = svn_string_dup(to_val, result_pool);
svn_hash_sets(their_props, propname, to_val);
@@ -2030,8 +2137,8 @@ svn_wc__canonicalize_props(apr_hash_t **prepared_props,
for (hi = apr_hash_first(scratch_pool, (apr_hash_t *)props); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_string_t *value = apr_hash_this_val(hi);
if (strcmp(name, SVN_PROP_MIME_TYPE) == 0)
continue;
diff --git a/subversion/libsvn_wc/props.h b/subversion/libsvn_wc/props.h
index c648e3c..c33e13e 100644
--- a/subversion/libsvn_wc/props.h
+++ b/subversion/libsvn_wc/props.h
@@ -139,11 +139,17 @@ svn_wc__get_actual_props(apr_hash_t **props,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Creates a property reject file at *TMP_PREJFILE_ABSPATH, with
+ either the property conflict data from DB (when PROP_CONFLICT_DATA
+ is NULL) or the information in PROP_CONFLICT_DATA if it isn't.
+ */
svn_error_t *
svn_wc__create_prejfile(const char **tmp_prejfile_abspath,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_skel_t *conflict_skel,
+ const svn_skel_t *prop_conflict_data,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
diff --git a/subversion/libsvn_wc/questions.c b/subversion/libsvn_wc/questions.c
index c2a42b6..0858363 100644
--- a/subversion/libsvn_wc/questions.c
+++ b/subversion/libsvn_wc/questions.c
@@ -117,6 +117,7 @@ compare_and_verify(svn_boolean_t *modified_p,
apr_hash_t *keywords;
svn_boolean_t special = FALSE;
svn_boolean_t need_translation;
+ svn_stream_t *v_stream; /* versioned_file */
SVN_ERR_ASSERT(svn_dirent_is_absolute(versioned_file_abspath));
@@ -150,22 +151,24 @@ compare_and_verify(svn_boolean_t *modified_p,
/* ### Other checks possible? */
- if (need_translation)
+ /* Reading files is necessary. */
+ if (special && need_translation)
{
- /* Reading files is necessary. */
- svn_stream_t *v_stream; /* versioned_file */
-
- if (special)
- {
- SVN_ERR(svn_subst_read_specialfile(&v_stream, versioned_file_abspath,
- scratch_pool, scratch_pool));
- }
- else
+ SVN_ERR(svn_subst_read_specialfile(&v_stream, versioned_file_abspath,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ /* We don't use APR-level buffering because the comparison function
+ * will do its own buffering. */
+ apr_file_t *file;
+ SVN_ERR(svn_io_file_open(&file, versioned_file_abspath, APR_READ,
+ APR_OS_DEFAULT, scratch_pool));
+ v_stream = svn_stream_from_aprfile2(file, FALSE, scratch_pool);
+
+ if (need_translation)
{
- SVN_ERR(svn_stream_open_readonly(&v_stream, versioned_file_abspath,
- scratch_pool, scratch_pool));
-
- if (!exact_comparison && need_translation)
+ if (!exact_comparison)
{
if (eol_style == svn_subst_eol_style_native)
eol_str = SVN_SUBST_NATIVE_EOL_STR;
@@ -183,7 +186,7 @@ compare_and_verify(svn_boolean_t *modified_p,
FALSE /* expand */,
scratch_pool);
}
- else if (need_translation)
+ else
{
/* Wrap base stream to translate into working copy form, and
* arrange to throw an error if its EOL style is inconsistent. */
@@ -193,21 +196,10 @@ compare_and_verify(svn_boolean_t *modified_p,
scratch_pool);
}
}
-
- SVN_ERR(svn_stream_contents_same2(&same, pristine_stream, v_stream,
- scratch_pool));
}
- else
- {
- /* Translation would be a no-op, so compare the original file. */
- svn_stream_t *v_stream; /* versioned_file */
- SVN_ERR(svn_stream_open_readonly(&v_stream, versioned_file_abspath,
- scratch_pool, scratch_pool));
-
- SVN_ERR(svn_stream_contents_same2(&same, pristine_stream, v_stream,
- scratch_pool));
- }
+ SVN_ERR(svn_stream_contents_same2(&same, pristine_stream, v_stream,
+ scratch_pool));
*modified_p = (! same);
@@ -377,7 +369,8 @@ internal_conflicted_p(svn_boolean_t *text_conflicted_p,
svn_boolean_t resolved_text = FALSE;
svn_boolean_t resolved_props = FALSE;
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL,
+ db, local_abspath,
scratch_pool, scratch_pool));
if (!conflicts)
@@ -604,18 +597,150 @@ svn_wc__has_switched_subtrees(svn_boolean_t *is_switched,
}
+/* A baton for use with modcheck_found_entry(). */
+typedef struct modcheck_baton_t {
+ svn_boolean_t ignore_unversioned;
+ svn_boolean_t found_mod; /* whether a modification has been found */
+ svn_boolean_t found_not_delete; /* Found a not-delete modification */
+} modcheck_baton_t;
+
+/* An implementation of svn_wc_status_func4_t. */
+static svn_error_t *
+modcheck_callback(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool)
+{
+ modcheck_baton_t *mb = baton;
+
+ switch (status->node_status)
+ {
+ case svn_wc_status_normal:
+ case svn_wc_status_ignored:
+ case svn_wc_status_none:
+ case svn_wc_status_external:
+ break;
+
+ case svn_wc_status_incomplete:
+ if ((status->text_status != svn_wc_status_normal
+ && status->text_status != svn_wc_status_none)
+ || (status->prop_status != svn_wc_status_normal
+ && status->prop_status != svn_wc_status_none))
+ {
+ mb->found_mod = TRUE;
+ mb->found_not_delete = TRUE;
+ /* Incomplete, but local modifications */
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+ }
+ break;
+
+ case svn_wc_status_deleted:
+ mb->found_mod = TRUE;
+ if (!mb->ignore_unversioned
+ && status->actual_kind != svn_node_none
+ && status->actual_kind != svn_node_unknown)
+ {
+ /* The delete is obstructed by something unversioned */
+ mb->found_not_delete = TRUE;
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+ }
+ break;
+
+ case svn_wc_status_unversioned:
+ if (mb->ignore_unversioned)
+ break;
+ /* else fall through */
+ case svn_wc_status_missing:
+ case svn_wc_status_obstructed:
+ mb->found_mod = TRUE;
+ mb->found_not_delete = TRUE;
+ /* Exit from the status walker: We know what we want to know */
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+
+ default:
+ case svn_wc_status_added:
+ case svn_wc_status_replaced:
+ case svn_wc_status_modified:
+ mb->found_mod = TRUE;
+ mb->found_not_delete = TRUE;
+ /* Exit from the status walker: We know what we want to know */
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *MODIFIED to true iff there are any local modifications within the
+ * tree rooted at LOCAL_ABSPATH, using DB. If *MODIFIED
+ * is set to true and all the local modifications were deletes then set
+ * *ALL_EDITS_ARE_DELETES to true, set it to false otherwise. LOCAL_ABSPATH
+ * may be a file or a directory. */
+svn_error_t *
+svn_wc__node_has_local_mods(svn_boolean_t *modified,
+ svn_boolean_t *all_edits_are_deletes,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ modcheck_baton_t modcheck_baton = { FALSE, FALSE, FALSE };
+ svn_error_t *err;
+
+ if (!all_edits_are_deletes)
+ {
+ SVN_ERR(svn_wc__db_has_db_mods(modified, db, local_abspath,
+ scratch_pool));
+
+ if (*modified)
+ return SVN_NO_ERROR;
+ }
+
+ modcheck_baton.ignore_unversioned = ignore_unversioned;
+
+ /* Walk the WC tree for status with depth infinity, looking for any local
+ * modifications. If it's a "sparse" directory, that's OK: there can be
+ * no local mods in the pieces that aren't present in the WC. */
+
+ err = svn_wc__internal_walk_status(db, local_abspath,
+ svn_depth_infinity,
+ FALSE, FALSE, FALSE, NULL,
+ modcheck_callback, &modcheck_baton,
+ cancel_func, cancel_baton,
+ scratch_pool);
+
+ if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
+ svn_error_clear(err);
+ else
+ SVN_ERR(err);
+
+ *modified = modcheck_baton.found_mod;
+ if (all_edits_are_deletes)
+ *all_edits_are_deletes = (modcheck_baton.found_mod
+ && !modcheck_baton.found_not_delete);
+
+ return SVN_NO_ERROR;
+}
+
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)
{
- return svn_error_trace(svn_wc__db_has_local_mods(is_modified,
- wc_ctx->db,
- local_abspath,
- cancel_func,
- cancel_baton,
- scratch_pool));
+ svn_boolean_t modified;
+
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, NULL,
+ wc_ctx->db, local_abspath,
+ ignore_unversioned,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ *is_modified = modified;
+ return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_wc/relocate.c b/subversion/libsvn_wc/relocate.c
index 4a9df67..e4b335b 100644
--- a/subversion/libsvn_wc/relocate.c
+++ b/subversion/libsvn_wc/relocate.c
@@ -148,7 +148,7 @@ svn_wc_relocate4(svn_wc_context_t *wc_ctx,
if (old_url_len == from_len)
new_url = to;
else
- new_url = apr_pstrcat(scratch_pool, to, old_url + from_len, (char *)NULL);
+ new_url = apr_pstrcat(scratch_pool, to, old_url + from_len, SVN_VA_NULL);
if (! svn_path_is_url(new_url))
return svn_error_createf(SVN_ERR_WC_INVALID_RELOCATION, NULL,
_("Invalid relocation destination: '%s' "
diff --git a/subversion/libsvn_wc/revert.c b/subversion/libsvn_wc/revert.c
index 5e190e8..bba1799 100644
--- a/subversion/libsvn_wc/revert.c
+++ b/subversion/libsvn_wc/revert.c
@@ -46,6 +46,7 @@
#include "svn_private_config.h"
#include "private/svn_io_private.h"
#include "private/svn_wc_private.h"
+#include "private/svn_sorts_private.h"
/* Thoughts on Reversion.
@@ -154,7 +155,7 @@ revert_restore_handle_copied_dirs(svn_boolean_t *removed_self,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
- const apr_array_header_t *copied_children;
+ apr_array_header_t *copied_children;
svn_wc__db_revert_list_copied_child_info_t *child_info;
int i;
svn_node_kind_t on_disk;
@@ -198,9 +199,7 @@ revert_restore_handle_copied_dirs(svn_boolean_t *removed_self,
* that still exist on disk (e.g. unversioned files within the copied tree).
* So sort the children list such that longest paths come first and try to
* remove each child directory in order. */
- qsort(copied_children->elts, copied_children->nelts,
- sizeof(svn_wc__db_revert_list_copied_child_info_t *),
- compare_revert_list_copied_children);
+ svn_sort__array(copied_children, compare_revert_list_copied_children);
for (i = 0; i < copied_children->nelts; i++)
{
child_info = APR_ARRAY_IDX(
@@ -247,6 +246,22 @@ revert_restore_handle_copied_dirs(svn_boolean_t *removed_self,
return SVN_NO_ERROR;
}
+/* Forward definition */
+static svn_error_t *
+revert_wc_data(svn_boolean_t *run_wq,
+ svn_boolean_t *notify_required,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_wc__db_status_t status,
+ svn_node_kind_t kind,
+ svn_node_kind_t reverted_kind,
+ svn_filesize_t recorded_size,
+ apr_time_t recorded_time,
+ svn_boolean_t copied_here,
+ svn_boolean_t use_commit_times,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
/* Make the working tree under LOCAL_ABSPATH to depth DEPTH match the
versioned tree. This function is called after svn_wc__db_op_revert
@@ -255,56 +270,63 @@ revert_restore_handle_copied_dirs(svn_boolean_t *removed_self,
REVERT_ROOT is true for explicit revert targets and FALSE for targets
reached via recursion.
+
+ Sets *RUN_WQ to TRUE when the caller should (eventually) run the workqueue.
+ (The function sets it to FALSE when it has run the WQ itself)
+
+ If INFO is NULL, LOCAL_ABSPATH doesn't exist in DB. Otherwise INFO
+ specifies the state of LOCAL_ABSPATH in DB.
*/
static svn_error_t *
-revert_restore(svn_wc__db_t *db,
+revert_restore(svn_boolean_t *run_wq,
+ svn_wc__db_t *db,
const char *local_abspath,
svn_depth_t depth,
+ svn_boolean_t metadata_only,
svn_boolean_t use_commit_times,
svn_boolean_t revert_root,
+ const struct svn_wc__db_info_t *info,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
{
- svn_error_t *err;
svn_wc__db_status_t status;
svn_node_kind_t kind;
- svn_node_kind_t on_disk;
svn_boolean_t notify_required;
const apr_array_header_t *conflict_files;
svn_filesize_t recorded_size;
apr_time_t recorded_time;
- apr_finfo_t finfo;
-#ifdef HAVE_SYMLINK
- svn_boolean_t special;
-#endif
svn_boolean_t copied_here;
svn_node_kind_t reverted_kind;
- svn_boolean_t is_wcroot;
-
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- SVN_ERR(svn_wc__db_is_wcroot(&is_wcroot, db, local_abspath, scratch_pool));
- if (is_wcroot && !revert_root)
+ if (!revert_root)
{
- /* Issue #4162: Obstructing working copy. We can't access the working
- copy data from the parent working copy for this node by just using
- local_abspath */
+ svn_boolean_t is_wcroot;
- if (notify_func)
+ SVN_ERR(svn_wc__db_is_wcroot(&is_wcroot, db, local_abspath, scratch_pool));
+ if (is_wcroot)
{
- svn_wc_notify_t *notify = svn_wc_create_notify(
+ /* Issue #4162: Obstructing working copy. We can't access the working
+ copy data from the parent working copy for this node by just using
+ local_abspath */
+
+ if (notify_func)
+ {
+ svn_wc_notify_t *notify =
+ svn_wc_create_notify(
local_abspath,
svn_wc_notify_update_skip_obstruction,
scratch_pool);
- notify_func(notify_baton, notify, scratch_pool);
- }
+ notify_func(notify_baton, notify, scratch_pool);
+ }
- return SVN_NO_ERROR; /* We don't revert obstructing working copies */
+ return SVN_NO_ERROR; /* We don't revert obstructing working copies */
+ }
}
SVN_ERR(svn_wc__db_revert_list_read(&notify_required,
@@ -313,17 +335,15 @@ revert_restore(svn_wc__db_t *db,
db, local_abspath,
scratch_pool, scratch_pool));
- err = svn_wc__db_read_info(&status, &kind,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- &recorded_size, &recorded_time, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- db, local_abspath, scratch_pool, scratch_pool);
-
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ if (info)
+ {
+ status = info->status;
+ kind = info->kind;
+ recorded_size = info->recorded_size;
+ recorded_time = info->recorded_time;
+ }
+ else
{
- svn_error_clear(err);
-
if (!copied_here)
{
if (notify_func && notify_required)
@@ -350,9 +370,116 @@ revert_restore(svn_wc__db_t *db,
recorded_time = 0;
}
}
- else if (err)
- return svn_error_trace(err);
+ if (!metadata_only)
+ {
+ SVN_ERR(revert_wc_data(run_wq,
+ &notify_required,
+ db, local_abspath, status, kind,
+ reverted_kind, recorded_size, recorded_time,
+ copied_here, use_commit_times,
+ cancel_func, cancel_baton, scratch_pool));
+ }
+
+ /* We delete these marker files even though they are not strictly metadata.
+ But for users that use revert as an API with metadata_only, these are. */
+ if (conflict_files)
+ {
+ int i;
+ for (i = 0; i < conflict_files->nelts; i++)
+ {
+ SVN_ERR(remove_conflict_file(&notify_required,
+ APR_ARRAY_IDX(conflict_files, i,
+ const char *),
+ local_abspath, scratch_pool));
+ }
+ }
+
+ if (notify_func && notify_required)
+ notify_func(notify_baton,
+ svn_wc_create_notify(local_abspath, svn_wc_notify_revert,
+ scratch_pool),
+ scratch_pool);
+
+ if (depth == svn_depth_infinity && kind == svn_node_dir)
+ {
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_t *children, *conflicts;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(revert_restore_handle_copied_dirs(NULL, db, local_abspath, FALSE,
+ cancel_func, cancel_baton,
+ iterpool));
+
+ SVN_ERR(svn_wc__db_read_children_info(&children, &conflicts,
+ db, local_abspath, FALSE,
+ scratch_pool, iterpool));
+
+ for (hi = apr_hash_first(scratch_pool, children);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *child_name = apr_hash_this_key(hi);
+ const char *child_abspath;
+
+ svn_pool_clear(iterpool);
+
+ child_abspath = svn_dirent_join(local_abspath, child_name, iterpool);
+
+ SVN_ERR(revert_restore(run_wq,
+ db, child_abspath, depth, metadata_only,
+ use_commit_times, FALSE /* revert root */,
+ apr_hash_this_val(hi),
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ iterpool));
+ }
+
+ /* Run the queue per directory */
+ if (*run_wq)
+ {
+ SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
+ iterpool));
+ *run_wq = FALSE;
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ if (notify_func && (revert_root || kind == svn_node_dir))
+ SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
+ db, local_abspath, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Perform the in-working copy revert of LOCAL_ABSPATH, to what is stored in DB */
+static svn_error_t *
+revert_wc_data(svn_boolean_t *run_wq,
+ svn_boolean_t *notify_required,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_wc__db_status_t status,
+ svn_node_kind_t kind,
+ svn_node_kind_t reverted_kind,
+ svn_filesize_t recorded_size,
+ apr_time_t recorded_time,
+ svn_boolean_t copied_here,
+ svn_boolean_t use_commit_times,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_error_t *err;
+ apr_finfo_t finfo;
+ svn_node_kind_t on_disk;
+#ifdef HAVE_SYMLINK
+ svn_boolean_t special;
+#endif
+
+ /* Would be nice to use svn_io_dirent2_t here, but the performance
+ improvement that provides doesn't work, because we need the read
+ only and executable bits later on, in the most likely code path */
err = svn_io_stat(&finfo, local_abspath,
APR_FINFO_TYPE | APR_FINFO_LINK
| APR_FINFO_SIZE | APR_FINFO_MTIME
@@ -478,14 +605,14 @@ revert_restore(svn_wc__db_t *db,
modified = FALSE;
}
else
+ /* Side effect: fixes recorded timestamps */
SVN_ERR(svn_wc__internal_file_modified_p(&modified,
db, local_abspath,
TRUE, scratch_pool));
if (modified)
{
- SVN_ERR(svn_io_remove_file2(local_abspath, FALSE,
- scratch_pool));
+ /* Install will replace the file */
on_disk = svn_node_none;
}
else
@@ -505,14 +632,14 @@ revert_restore(svn_wc__db_t *db,
SVN_ERR(svn_io_set_file_read_only(local_abspath,
FALSE,
scratch_pool));
- notify_required = TRUE;
+ *notify_required = TRUE;
}
else if (!needs_lock_prop && read_only)
{
SVN_ERR(svn_io_set_file_read_write(local_abspath,
FALSE,
scratch_pool));
- notify_required = TRUE;
+ *notify_required = TRUE;
}
}
@@ -533,14 +660,14 @@ revert_restore(svn_wc__db_t *db,
SVN_ERR(svn_io_set_file_executable(local_abspath,
TRUE, FALSE,
scratch_pool));
- notify_required = TRUE;
+ *notify_required = TRUE;
}
else if (!executable_prop && executable)
{
SVN_ERR(svn_io_set_file_executable(local_abspath,
FALSE, FALSE,
scratch_pool));
- notify_required = TRUE;
+ *notify_required = TRUE;
}
}
#endif
@@ -564,90 +691,36 @@ revert_restore(svn_wc__db_t *db,
{
svn_skel_t *work_item;
- /* ### Get the checksum from read_info above and pass in here? */
SVN_ERR(svn_wc__wq_build_file_install(&work_item, db, local_abspath,
NULL, use_commit_times, TRUE,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_wq_add(db, local_abspath, work_item,
scratch_pool));
- SVN_ERR(svn_wc__wq_run(db, local_abspath, cancel_func, cancel_baton,
- scratch_pool));
+ *run_wq = TRUE;
}
- notify_required = TRUE;
+ *notify_required = TRUE;
}
- if (conflict_files)
- {
- int i;
- for (i = 0; i < conflict_files->nelts; i++)
- {
- SVN_ERR(remove_conflict_file(&notify_required,
- APR_ARRAY_IDX(conflict_files, i,
- const char *),
- local_abspath, scratch_pool));
- }
- }
-
- if (notify_func && notify_required)
- notify_func(notify_baton,
- svn_wc_create_notify(local_abspath, svn_wc_notify_revert,
- scratch_pool),
- scratch_pool);
-
- if (depth == svn_depth_infinity && kind == svn_node_dir)
- {
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- const apr_array_header_t *children;
- int i;
-
- SVN_ERR(revert_restore_handle_copied_dirs(NULL, db, local_abspath, FALSE,
- cancel_func, cancel_baton,
- iterpool));
-
- SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
- local_abspath,
- scratch_pool,
- iterpool));
- for (i = 0; i < children->nelts; ++i)
- {
- const char *child_abspath;
-
- svn_pool_clear(iterpool);
-
- child_abspath = svn_dirent_join(local_abspath,
- APR_ARRAY_IDX(children, i,
- const char *),
- iterpool);
-
- SVN_ERR(revert_restore(db, child_abspath, depth,
- use_commit_times, FALSE /* revert root */,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- iterpool));
- }
-
- svn_pool_destroy(iterpool);
- }
-
- if (notify_func)
- SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
- db, local_abspath, scratch_pool));
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_wc__revert_internal(svn_wc__db_t *db,
- const char *local_abspath,
- svn_depth_t depth,
- svn_boolean_t use_commit_times,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool)
+/* Revert tree LOCAL_ABSPATH to depth DEPTH and notify for all reverts. */
+static svn_error_t *
+revert(svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_depth_t depth,
+ svn_boolean_t use_commit_times,
+ 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)
{
svn_error_t *err;
+ const struct svn_wc__db_info_t *info = NULL;
+ svn_boolean_t run_queue = FALSE;
SVN_ERR_ASSERT(depth == svn_depth_empty || depth == svn_depth_infinity);
@@ -667,15 +740,37 @@ svn_wc__revert_internal(svn_wc__db_t *db,
SVN_ERR(svn_wc__write_check(db, dir_abspath, scratch_pool));
}
- err = svn_wc__db_op_revert(db, local_abspath, depth,
- scratch_pool, scratch_pool);
+ err = svn_error_trace(
+ svn_wc__db_op_revert(db, local_abspath, depth, clear_changelists,
+ scratch_pool, scratch_pool));
if (!err)
- err = revert_restore(db, local_abspath, depth,
- use_commit_times, TRUE /* revert root */,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- scratch_pool);
+ {
+ err = svn_error_trace(
+ svn_wc__db_read_single_info(&info, db, local_abspath, FALSE,
+ scratch_pool, scratch_pool));
+
+ if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ err = NULL;
+ info = NULL;
+ }
+ }
+
+ if (!err)
+ err = svn_error_trace(
+ revert_restore(&run_queue, db, local_abspath, depth, metadata_only,
+ use_commit_times, TRUE /* revert root */,
+ info, cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ scratch_pool));
+
+ if (run_queue)
+ err = svn_error_compose_create(err,
+ svn_wc__wq_run(db, local_abspath,
+ cancel_func, cancel_baton,
+ scratch_pool));
err = svn_error_compose_create(err,
svn_wc__db_revert_list_done(db,
@@ -694,6 +789,8 @@ revert_changelist(svn_wc__db_t *db,
svn_depth_t depth,
svn_boolean_t use_commit_times,
apr_hash_t *changelist_hash,
+ 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,
@@ -710,11 +807,12 @@ revert_changelist(svn_wc__db_t *db,
/* Revert this node (depth=empty) if it matches one of the changelists. */
if (svn_wc__internal_changelist_match(db, local_abspath, changelist_hash,
scratch_pool))
- SVN_ERR(svn_wc__revert_internal(db, local_abspath,
- svn_depth_empty, use_commit_times,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- scratch_pool));
+ SVN_ERR(revert(db, local_abspath,
+ svn_depth_empty, use_commit_times, clear_changelists,
+ metadata_only,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ scratch_pool));
if (depth == svn_depth_empty)
return SVN_NO_ERROR;
@@ -746,6 +844,7 @@ revert_changelist(svn_wc__db_t *db,
SVN_ERR(revert_changelist(db, child_abspath, depth,
use_commit_times, changelist_hash,
+ clear_changelists, metadata_only,
cancel_func, cancel_baton,
notify_func, notify_baton,
iterpool));
@@ -770,6 +869,8 @@ revert_partial(svn_wc__db_t *db,
const char *local_abspath,
svn_depth_t depth,
svn_boolean_t use_commit_times,
+ 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,
@@ -789,9 +890,10 @@ revert_partial(svn_wc__db_t *db,
/* Revert the root node itself (depth=empty), then move on to the
children. */
- SVN_ERR(svn_wc__revert_internal(db, local_abspath, svn_depth_empty,
- use_commit_times, cancel_func, cancel_baton,
- notify_func, notify_baton, iterpool));
+ SVN_ERR(revert(db, local_abspath, svn_depth_empty,
+ use_commit_times, clear_changelists, metadata_only,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton, iterpool));
SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
local_abspath,
@@ -822,11 +924,12 @@ revert_partial(svn_wc__db_t *db,
}
/* Revert just this node (depth=empty). */
- SVN_ERR(svn_wc__revert_internal(db, child_abspath,
- svn_depth_empty, use_commit_times,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- iterpool));
+ SVN_ERR(revert(db, child_abspath,
+ svn_depth_empty, use_commit_times, clear_changelists,
+ metadata_only,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ iterpool));
}
svn_pool_destroy(iterpool);
@@ -836,11 +939,13 @@ revert_partial(svn_wc__db_t *db,
svn_error_t *
-svn_wc_revert4(svn_wc_context_t *wc_ctx,
+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,
@@ -856,17 +961,20 @@ svn_wc_revert4(svn_wc_context_t *wc_ctx,
return svn_error_trace(revert_changelist(wc_ctx->db, local_abspath,
depth, use_commit_times,
changelist_hash,
+ clear_changelists,
+ metadata_only,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool));
}
if (depth == svn_depth_empty || depth == svn_depth_infinity)
- return svn_error_trace(svn_wc__revert_internal(wc_ctx->db, local_abspath,
- depth, use_commit_times,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- scratch_pool));
+ return svn_error_trace(revert(wc_ctx->db, local_abspath,
+ depth, use_commit_times, clear_changelists,
+ metadata_only,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ scratch_pool));
/* The user may expect svn_depth_files/svn_depth_immediates to work
on copied dirs with one level of children. It doesn't, the user
@@ -877,6 +985,7 @@ svn_wc_revert4(svn_wc_context_t *wc_ctx,
if (depth == svn_depth_files || depth == svn_depth_immediates)
return svn_error_trace(revert_partial(wc_ctx->db, local_abspath,
depth, use_commit_times,
+ clear_changelists, metadata_only,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool));
diff --git a/subversion/libsvn_wc/revision_status.c b/subversion/libsvn_wc/revision_status.c
index a4b9bea..c53c45e 100644
--- a/subversion/libsvn_wc/revision_status.c
+++ b/subversion/libsvn_wc/revision_status.c
@@ -60,8 +60,14 @@ svn_wc_revision_status2(svn_wc_revision_status_t **result_p,
&result->modified,
&result->switched,
wc_ctx->db, local_abspath, trail_url,
- committed, cancel_func, cancel_baton,
+ committed,
scratch_pool));
+ if (!result->modified)
+ SVN_ERR(svn_wc__node_has_local_mods(&result->modified, NULL,
+ wc_ctx->db, local_abspath, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_wc/status.c b/subversion/libsvn_wc/status.c
index fa57b0a..83fd3d4 100644
--- a/subversion/libsvn_wc/status.c
+++ b/subversion/libsvn_wc/status.c
@@ -36,7 +36,6 @@
#include "svn_string.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
-#include "svn_path.h"
#include "svn_io.h"
#include "svn_config.h"
#include "svn_time.h"
@@ -47,15 +46,33 @@
#include "wc.h"
#include "props.h"
-#include "entries.h"
-#include "translate.h"
-#include "tree_conflicts.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_wc_private.h"
#include "private/svn_fspath.h"
#include "private/svn_editor.h"
+/* The file internal variant of svn_wc_status3_t, with slightly more
+ data.
+
+ Instead of directly creating svn_wc_status3_t instances, we really
+ create instances of this struct with slightly more data for processing
+ by the status walker and status editor.
+
+ svn_wc_status3_dup() allocates space for this struct, but doesn't
+ copy the actual data. The remaining fields are copied by hash_stash(),
+ which is where the status editor stashes information for producing
+ later. */
+typedef struct svn_wc__internal_status_t
+{
+ svn_wc_status3_t s; /* First member; same pointer*/
+
+ svn_boolean_t has_descendants;
+
+ /* Make sure to update hash_stash() when adding values here */
+} svn_wc__internal_status_t;
+
/*** Baton used for walking the local status */
struct walk_status_baton
@@ -70,6 +87,9 @@ struct walk_status_baton
/* Should we ignore text modifications? */
svn_boolean_t ignore_text_mods;
+ /* Scan the working copy for local modifications and missing nodes. */
+ svn_boolean_t check_working_copy;
+
/* Externals info harvested during the status run. */
apr_hash_t *externals;
@@ -92,7 +112,6 @@ struct edit_baton
/* The DB handle for managing the working copy state. */
svn_wc__db_t *db;
- svn_wc_context_t *wc_ctx;
/* The overall depth of this edit (a dir baton may override this).
*
@@ -127,7 +146,7 @@ struct edit_baton
const apr_array_header_t *ignores;
/* Status item for the path represented by the anchor of the edit. */
- svn_wc_status3_t *anchor_status;
+ svn_wc__internal_status_t *anchor_status;
/* Was open_root() called for this edit drive? */
svn_boolean_t root_opened;
@@ -276,63 +295,23 @@ get_repos_root_url_relpath(const char **repos_relpath,
*repos_root_url = apr_pstrdup(result_pool, parent_repos_root_url);
*repos_uuid = apr_pstrdup(result_pool, parent_repos_uuid);
}
- else if (info->status == svn_wc__db_status_added)
- {
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL,
- repos_relpath, repos_root_url,
- repos_uuid, NULL, NULL, NULL, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
- }
- else if (info->status == svn_wc__db_status_deleted
- && !info->have_more_work
- && info->have_base)
+ else
{
- SVN_ERR(svn_wc__db_scan_base_repos(repos_relpath, repos_root_url,
+ SVN_ERR(svn_wc__db_read_repos_info(NULL,
+ repos_relpath, repos_root_url,
repos_uuid,
db, local_abspath,
result_pool, scratch_pool));
}
- else if (info->status == svn_wc__db_status_deleted)
- {
- const char *work_del_abspath;
- const char *add_abspath;
-
- /* Handles working DELETE and the special case where there is just
- svn_wc__db_status_not_present in WORKING */
-
- SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL, &work_del_abspath, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool));
-
- /* The parent of what has been deleted must be added */
- add_abspath = svn_dirent_dirname(work_del_abspath, scratch_pool);
-
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, repos_relpath,
- repos_root_url, repos_uuid, NULL,
- NULL, NULL, NULL,
- db, add_abspath,
- result_pool, scratch_pool));
- *repos_relpath = svn_relpath_join(*repos_relpath,
- svn_dirent_skip_ancestor(
- add_abspath,
- local_abspath),
- result_pool);
- }
- else
- {
- *repos_relpath = NULL;
- *repos_root_url = NULL;
- *repos_uuid = NULL;
- }
return SVN_NO_ERROR;
}
static svn_error_t *
-internal_status(svn_wc_status3_t **status,
+internal_status(svn_wc__internal_status_t **status,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t check_working_copy,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -350,12 +329,13 @@ internal_status(svn_wc_status3_t **status,
*STATUS will be set to NULL. If GET_ALL is non-zero, then *STATUS will be
allocated and returned no matter what. If IGNORE_TEXT_MODS is TRUE then
don't check for text mods, assume there are none and set and *STATUS
- returned to reflect that assumption.
+ returned to reflect that assumption. If CHECK_WORKING_COPY is FALSE,
+ do not adjust the result for missing working copy files.
The status struct's repos_lock field will be set to REPOS_LOCK.
*/
static svn_error_t *
-assemble_status(svn_wc_status3_t **status,
+assemble_status(svn_wc__internal_status_t **status,
svn_wc__db_t *db,
const char *local_abspath,
const char *parent_repos_root_url,
@@ -365,18 +345,17 @@ assemble_status(svn_wc_status3_t **status,
const svn_io_dirent2_t *dirent,
svn_boolean_t get_all,
svn_boolean_t ignore_text_mods,
+ svn_boolean_t check_working_copy,
const svn_lock_t *repos_lock,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ svn_wc__internal_status_t *inner_stat;
svn_wc_status3_t *stat;
svn_boolean_t switched_p = FALSE;
svn_boolean_t copied = FALSE;
svn_boolean_t conflicted;
const char *moved_from_abspath = NULL;
- svn_filesize_t filesize = (dirent && (dirent->kind == svn_node_file))
- ? dirent->filesize
- : SVN_INVALID_FILESIZE;
/* Defaults for two main variables. */
enum svn_wc_status_kind node_status = svn_wc_status_normal;
@@ -384,10 +363,6 @@ assemble_status(svn_wc_status3_t **status,
enum svn_wc_status_kind prop_status = svn_wc_status_none;
- if (!info)
- SVN_ERR(svn_wc__db_read_single_info(&info, db, local_abspath,
- result_pool, scratch_pool));
-
if (!info->repos_relpath || !parent_repos_relpath)
switched_p = FALSE;
else
@@ -426,7 +401,7 @@ assemble_status(svn_wc_status3_t **status,
copied = TRUE; /* Working deletion */
}
}
- else
+ else if (check_working_copy)
{
/* Examine whether our target is missing or obstructed. To detect
* obstructions, we have to look at the on-disk status in DIRENT. */
@@ -606,19 +581,21 @@ assemble_status(svn_wc_status3_t **status,
&& prop_status != svn_wc_status_none)
node_status = prop_status;
- /* 5. Easy out: unless we're fetching -every- entry, don't bother
- to allocate a struct for an uninteresting entry. */
+ /* 5. Easy out: unless we're fetching -every- node, don't bother
+ to allocate a struct for an uninteresting node.
+ This filter should match the filter in is_sendable_status() */
if (! get_all)
if (((node_status == svn_wc_status_none)
|| (node_status == svn_wc_status_normal))
&& (! switched_p)
- && (! info->locked )
+ && (! info->locked)
&& (! info->lock)
&& (! repos_lock)
&& (! info->changelist)
- && (! conflicted))
+ && (! conflicted)
+ && (! info->moved_to))
{
*status = NULL;
return SVN_NO_ERROR;
@@ -626,7 +603,9 @@ assemble_status(svn_wc_status3_t **status,
/* 6. Build and return a status structure. */
- stat = apr_pcalloc(result_pool, sizeof(**status));
+ inner_stat = apr_pcalloc(result_pool, sizeof(*inner_stat));
+ stat = &inner_stat->s;
+ inner_stat->has_descendants = info->has_descendants;
switch (info->kind)
{
@@ -642,7 +621,22 @@ assemble_status(svn_wc_status3_t **status,
stat->kind = svn_node_unknown;
}
stat->depth = info->depth;
- stat->filesize = filesize;
+
+ if (dirent)
+ {
+ stat->filesize = (dirent->kind == svn_node_file)
+ ? dirent->filesize
+ : SVN_INVALID_FILESIZE;
+ stat->actual_kind = dirent->special ? svn_node_symlink
+ : dirent->kind;
+ }
+ else
+ {
+ stat->filesize = SVN_INVALID_FILESIZE;
+ stat->actual_kind = ignore_text_mods ? svn_node_unknown
+ : svn_node_none;
+ }
+
stat->node_status = node_status;
stat->text_status = text_status;
stat->prop_status = prop_status;
@@ -700,7 +694,7 @@ assemble_status(svn_wc_status3_t **status,
stat->file_external = info->file_external;
- *status = stat;
+ *status = inner_stat;
return SVN_NO_ERROR;
}
@@ -714,7 +708,7 @@ assemble_status(svn_wc_status3_t **status,
node_status to svn_wc_status_unversioned.
*/
static svn_error_t *
-assemble_unversioned(svn_wc_status3_t **status,
+assemble_unversioned(svn_wc__internal_status_t **status,
svn_wc__db_t *db,
const char *local_abspath,
const svn_io_dirent2_t *dirent,
@@ -723,17 +717,30 @@ assemble_unversioned(svn_wc_status3_t **status,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ svn_wc__internal_status_t *inner_status;
svn_wc_status3_t *stat;
/* return a fairly blank structure. */
- stat = apr_pcalloc(result_pool, sizeof(*stat));
+ inner_status = apr_pcalloc(result_pool, sizeof(*inner_status));
+ stat = &inner_status->s;
/*stat->versioned = FALSE;*/
stat->kind = svn_node_unknown; /* not versioned */
stat->depth = svn_depth_unknown;
- stat->filesize = (dirent && dirent->kind == svn_node_file)
- ? dirent->filesize
- : SVN_INVALID_FILESIZE;
+ if (dirent)
+ {
+ stat->actual_kind = dirent->special ? svn_node_symlink
+ : dirent->kind;
+ stat->filesize = (dirent->kind == svn_node_file)
+ ? dirent->filesize
+ : SVN_INVALID_FILESIZE;
+ }
+ else
+ {
+ stat->actual_kind = svn_node_none;
+ stat->filesize = SVN_INVALID_FILESIZE;
+ }
+
stat->node_status = svn_wc_status_none;
stat->text_status = svn_wc_status_none;
stat->prop_status = svn_wc_status_none;
@@ -770,7 +777,7 @@ assemble_unversioned(svn_wc_status3_t **status,
stat->conflicted = tree_conflicted;
stat->changelist = NULL;
- *status = stat;
+ *status = inner_status;
return SVN_NO_ERROR;
}
@@ -791,7 +798,7 @@ send_status_structure(const struct walk_status_baton *wb,
void *status_baton,
apr_pool_t *scratch_pool)
{
- svn_wc_status3_t *statstruct;
+ svn_wc__internal_status_t *statstruct;
const svn_lock_t *repos_lock = NULL;
/* Check for a repository lock. */
@@ -819,12 +826,14 @@ send_status_structure(const struct walk_status_baton *wb,
SVN_ERR(assemble_status(&statstruct, wb->db, local_abspath,
parent_repos_root_url, parent_repos_relpath,
parent_repos_uuid,
- info, dirent, get_all, wb->ignore_text_mods,
+ info, dirent, get_all,
+ wb->ignore_text_mods, wb->check_working_copy,
repos_lock, scratch_pool, scratch_pool));
if (statstruct && status_func)
return svn_error_trace((*status_func)(status_baton, local_abspath,
- statstruct, scratch_pool));
+ &statstruct->s,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -940,7 +949,7 @@ is_external_path(apr_hash_t *externals,
hi;
hi = apr_hash_next(hi))
{
- const char *external_abspath = svn__apr_hash_index_key(hi);
+ const char *external_abspath = apr_hash_this_key(hi);
if (svn_dirent_is_child(local_abspath, external_abspath, NULL))
return TRUE;
@@ -980,7 +989,7 @@ send_unversioned_item(const struct walk_status_baton *wb,
{
svn_boolean_t is_ignored;
svn_boolean_t is_external;
- svn_wc_status3_t *status;
+ svn_wc__internal_status_t *status;
const char *base_name = svn_dirent_basename(local_abspath, NULL);
is_ignored = svn_wc_match_ignore_list(base_name, patterns, scratch_pool);
@@ -992,12 +1001,12 @@ send_unversioned_item(const struct walk_status_baton *wb,
is_external = is_external_path(wb->externals, local_abspath, scratch_pool);
if (is_external)
- status->node_status = svn_wc_status_external;
+ status->s.node_status = svn_wc_status_external;
/* We can have a tree conflict on an unversioned path, i.e. an incoming
* delete on a locally deleted path during an update. Don't ever ignore
* those! */
- if (status->conflicted)
+ if (status->s.conflicted)
is_ignored = FALSE;
/* If we aren't ignoring it, or if it's an externals path, pass this
@@ -1006,7 +1015,7 @@ send_unversioned_item(const struct walk_status_baton *wb,
|| !is_ignored
|| is_external)
return svn_error_trace((*status_func)(status_baton, local_abspath,
- status, scratch_pool));
+ &status->s, scratch_pool));
return SVN_NO_ERROR;
}
@@ -1109,7 +1118,7 @@ one_child_status(const struct walk_status_baton *wb,
/* Descend in subdirectories. */
if (depth == svn_depth_infinity
- && info->kind == svn_node_dir)
+ && info->has_descendants /* is dir, or was dir and tc descendants */)
{
SVN_ERR(get_dir_status(wb, local_abspath, TRUE,
dir_repos_root_url, dir_repos_relpath,
@@ -1132,11 +1141,16 @@ one_child_status(const struct walk_status_baton *wb,
* look up the kinds in the conflict ... just show all. */
if (! conflicted)
{
- /* Selected node, but not found */
- if (dirent == NULL)
- return SVN_NO_ERROR;
+ /* We have a node, but its not visible in the WC. It can be a marker
+ node (not present, (server) excluded), *or* it can be the explictly
+ passed target of the status walk operation that doesn't exist.
- if (depth == svn_depth_files && dirent->kind == svn_node_dir)
+ We only report the node when the caller explicitly as
+ */
+ if (dirent == NULL && strcmp(wb->target_abspath, local_abspath) != 0)
+ return SVN_NO_ERROR; /* Marker node */
+
+ if (depth == svn_depth_files && dirent && dirent->kind == svn_node_dir)
return SVN_NO_ERROR;
if (svn_wc_is_adm_dir(svn_dirent_basename(local_abspath, NULL),
@@ -1228,21 +1242,28 @@ get_dir_status(const struct walk_status_baton *wb,
iterpool = svn_pool_create(scratch_pool);
- err = svn_io_get_dirents3(&dirents, local_abspath, FALSE, scratch_pool,
- iterpool);
- if (err
- && (APR_STATUS_IS_ENOENT(err->apr_err)
- || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)))
+ if (wb->check_working_copy)
{
- svn_error_clear(err);
- dirents = apr_hash_make(scratch_pool);
+ err = svn_io_get_dirents3(&dirents, local_abspath,
+ wb->ignore_text_mods /* only_check_type*/,
+ scratch_pool, iterpool);
+ if (err
+ && (APR_STATUS_IS_ENOENT(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)))
+ {
+ svn_error_clear(err);
+ dirents = apr_hash_make(scratch_pool);
+ }
+ else
+ SVN_ERR(err);
}
else
- SVN_ERR(err);
+ dirents = apr_hash_make(scratch_pool);
if (!dir_info)
- SVN_ERR(svn_wc__db_read_single_info(&dir_info, wb->db, local_abspath,
- scratch_pool, iterpool));
+ SVN_ERR(svn_wc__db_read_single_info(&dir_info, wb->db, local_abspath,
+ !wb->check_working_copy,
+ scratch_pool, iterpool));
SVN_ERR(get_repos_root_url_relpath(&dir_repos_relpath, &dir_repos_root_url,
&dir_repos_uuid, dir_info,
@@ -1256,6 +1277,7 @@ get_dir_status(const struct walk_status_baton *wb,
hash are subsequently used. */
SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts,
wb->db, local_abspath,
+ !wb->check_working_copy,
scratch_pool, iterpool));
all_children = apr_hash_overlay(scratch_pool, nodes, dirents);
@@ -1404,6 +1426,7 @@ get_child_status(const struct walk_status_baton *wb,
SVN_ERR(svn_wc__db_read_single_info(&dir_info,
wb->db, parent_abspath,
+ !wb->check_working_copy,
scratch_pool, scratch_pool));
SVN_ERR(get_repos_root_url_relpath(&dir_repos_relpath, &dir_repos_root_url,
@@ -1455,9 +1478,15 @@ hash_stash(void *baton,
{
apr_hash_t *stat_hash = baton;
apr_pool_t *hash_pool = apr_hash_pool_get(stat_hash);
+ void *new_status = svn_wc_dup_status3(status, hash_pool);
+ const svn_wc__internal_status_t *old_status = (const void*)status;
+
+ /* Copy the internal/private data. */
+ svn_wc__internal_status_t *is = new_status;
+ is->has_descendants = old_status->has_descendants;
+
assert(! svn_hash_gets(stat_hash, path));
- svn_hash_sets(stat_hash, apr_pstrdup(hash_pool, path),
- svn_wc_dup_status3(status, hash_pool));
+ svn_hash_sets(stat_hash, apr_pstrdup(hash_pool, path), new_status);
return SVN_NO_ERROR;
}
@@ -1497,6 +1526,7 @@ tweak_statushash(void *baton,
void *this_dir_baton,
svn_boolean_t is_dir_baton,
svn_wc__db_t *db,
+ svn_boolean_t check_working_copy,
const char *local_abspath,
enum svn_wc_status_kind repos_node_status,
enum svn_wc_status_kind repos_text_status,
@@ -1521,6 +1551,7 @@ tweak_statushash(void *baton,
/* If not, make it so. */
if (! statstruct)
{
+ svn_wc__internal_status_t *i_stat;
/* If this item isn't being added, then we're most likely
dealing with a non-recursive (or at least partially
non-recursive) working copy. Due to bugs in how the client
@@ -1536,8 +1567,9 @@ tweak_statushash(void *baton,
return SVN_NO_ERROR;
/* Use the public API to get a statstruct, and put it into the hash. */
- SVN_ERR(internal_status(&statstruct, db, local_abspath, pool,
- scratch_pool));
+ SVN_ERR(internal_status(&i_stat, db, local_abspath,
+ check_working_copy, pool, scratch_pool));
+ statstruct = &i_stat->s;
statstruct->repos_lock = repos_lock;
svn_hash_sets(statushash, apr_pstrdup(pool, local_abspath), statstruct);
}
@@ -1576,9 +1608,9 @@ tweak_statushash(void *baton,
statstruct->repos_relpath = apr_pstrdup(pool, b->repos_relpath);
statstruct->repos_root_url =
- b->edit_baton->anchor_status->repos_root_url;
+ b->edit_baton->anchor_status->s.repos_root_url;
statstruct->repos_uuid =
- b->edit_baton->anchor_status->repos_uuid;
+ b->edit_baton->anchor_status->s.repos_uuid;
}
/* The last committed date, and author for deleted items
@@ -1618,9 +1650,9 @@ tweak_statushash(void *baton,
{
statstruct->repos_relpath = apr_pstrdup(pool, b->repos_relpath);
statstruct->repos_root_url =
- b->edit_baton->anchor_status->repos_root_url;
+ b->edit_baton->anchor_status->s.repos_root_url;
statstruct->repos_uuid =
- b->edit_baton->anchor_status->repos_uuid;
+ b->edit_baton->anchor_status->s.repos_uuid;
}
statstruct->ood_kind = b->ood_kind;
if (b->ood_changed_author)
@@ -1636,7 +1668,7 @@ find_dir_repos_relpath(const struct dir_baton *db, apr_pool_t *pool)
{
/* If we have no name, we're the root, return the anchor URL. */
if (! db->name)
- return db->edit_baton->anchor_status->repos_relpath;
+ return db->edit_baton->anchor_status->s.repos_relpath;
else
{
const char *repos_relpath;
@@ -1668,7 +1700,7 @@ make_dir_baton(void **dir_baton,
struct edit_baton *eb = edit_baton;
struct dir_baton *d;
const char *local_abspath;
- const svn_wc_status3_t *status_in_parent;
+ const svn_wc__internal_status_t *status_in_parent;
apr_pool_t *dir_pool;
if (parent_baton)
@@ -1727,8 +1759,7 @@ make_dir_baton(void **dir_baton,
status_in_parent = eb->anchor_status;
if (status_in_parent
- && status_in_parent->versioned
- && (status_in_parent->kind == svn_node_dir)
+ && (status_in_parent->has_descendants)
&& (! d->excluded)
&& (d->depth == svn_depth_unknown
|| d->depth == svn_depth_infinity
@@ -1740,9 +1771,9 @@ make_dir_baton(void **dir_baton,
const apr_array_header_t *ignores = eb->ignores;
SVN_ERR(get_dir_status(&eb->wb, local_abspath, TRUE,
- status_in_parent->repos_root_url,
+ status_in_parent->s.repos_root_url,
NULL /*parent_repos_relpath*/,
- status_in_parent->repos_uuid,
+ status_in_parent->s.repos_uuid,
NULL,
NULL /* dirent */, ignores,
d->depth == svn_depth_files
@@ -1757,7 +1788,7 @@ make_dir_baton(void **dir_baton,
this_dir_status = svn_hash_gets(d->statii, d->local_abspath);
if (this_dir_status && this_dir_status->versioned
&& (d->depth == svn_depth_unknown
- || d->depth > status_in_parent->depth))
+ || d->depth > status_in_parent->s.depth))
{
d->depth = this_dir_status->depth;
}
@@ -1799,12 +1830,15 @@ make_file_baton(struct dir_baton *parent_dir_baton,
* Return a boolean answer to the question "Is @a status something that
* should be reported?". @a no_ignore and @a get_all are the same as
* svn_wc_get_status_editor4().
+ *
+ * This implementation should match the filter in assemble_status()
*/
static svn_boolean_t
-is_sendable_status(const svn_wc_status3_t *status,
+is_sendable_status(const svn_wc__internal_status_t *i_status,
svn_boolean_t no_ignore,
svn_boolean_t get_all)
{
+ const svn_wc_status3_t *status = &i_status->s;
/* If the repository status was touched at all, it's interesting. */
if (status->repos_node_status != svn_wc_status_none)
return TRUE;
@@ -1830,8 +1864,8 @@ is_sendable_status(const svn_wc_status3_t *status,
return TRUE;
/* If the text, property or tree state is interesting, send it. */
- if ((status->node_status != svn_wc_status_none
- && (status->node_status != svn_wc_status_normal)))
+ if ((status->node_status != svn_wc_status_none)
+ && (status->node_status != svn_wc_status_normal))
return TRUE;
/* If it's switched, send it. */
@@ -1846,6 +1880,9 @@ is_sendable_status(const svn_wc_status3_t *status,
if (status->changelist)
return TRUE;
+ if (status->moved_to_abspath)
+ return TRUE;
+
/* Otherwise, don't send it. */
return FALSE;
}
@@ -1910,15 +1947,15 @@ handle_statii(struct edit_baton *eb,
/* Loop over all the statii still in our hash, handling each one. */
for (hi = apr_hash_first(pool, statii); hi; hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
- svn_wc_status3_t *status = svn__apr_hash_index_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
+ svn_wc__internal_status_t *status = apr_hash_this_val(hi);
/* Clear the subpool. */
svn_pool_clear(iterpool);
/* Now, handle the status. We don't recurse for svn_depth_immediates
because we already have the subdirectories' statii. */
- if (status->versioned && status->kind == svn_node_dir
+ if (status->has_descendants
&& (depth == svn_depth_unknown
|| depth == svn_depth_infinity))
{
@@ -1934,9 +1971,9 @@ handle_statii(struct edit_baton *eb,
iterpool));
}
if (dir_was_deleted)
- status->repos_node_status = svn_wc_status_deleted;
+ status->s.repos_node_status = svn_wc_status_deleted;
if (is_sendable_status(status, eb->no_ignore, eb->get_all))
- SVN_ERR((eb->status_func)(eb->status_baton, local_abspath, status,
+ SVN_ERR((eb->status_func)(eb->status_baton, local_abspath, &status->s,
iterpool));
}
@@ -1991,7 +2028,7 @@ delete_entry(const char *path,
statushash immediately. No need to wait until close_file or
close_dir, because there's no risk of having to honor the 'added'
flag. We already know this item exists in the working copy. */
- SVN_ERR(tweak_statushash(db, db, TRUE, eb->db,
+ SVN_ERR(tweak_statushash(db, db, TRUE, eb->db, eb->wb.check_working_copy,
local_abspath,
svn_wc_status_deleted, 0, 0, revision, NULL, pool));
@@ -1999,7 +2036,8 @@ delete_entry(const char *path,
is the root node and we're not supposed to report on the root
node). */
if (db->parent_baton && (! *eb->target_basename))
- SVN_ERR(tweak_statushash(db->parent_baton, db, TRUE,eb->db,
+ SVN_ERR(tweak_statushash(db->parent_baton, db, TRUE,
+ eb->db, eb->wb.check_working_copy,
db->local_abspath,
svn_wc_status_modified, svn_wc_status_modified,
0, SVN_INVALID_REVNUM, NULL, pool));
@@ -2123,7 +2161,9 @@ close_directory(void *dir_baton,
{
/* ### When we add directory locking, we need to find a
### directory lock here. */
- SVN_ERR(tweak_statushash(pb, db, TRUE, eb->db, db->local_abspath,
+ SVN_ERR(tweak_statushash(pb, db, TRUE,
+ eb->db, eb->wb.check_working_copy,
+ db->local_abspath,
repos_node_status, repos_text_status,
repos_prop_status, SVN_INVALID_REVNUM, NULL,
scratch_pool));
@@ -2133,17 +2173,17 @@ close_directory(void *dir_baton,
/* We're editing the root dir of the WC. As its repos
status info isn't otherwise set, set it directly to
trigger invocation of the status callback below. */
- eb->anchor_status->repos_node_status = repos_node_status;
- eb->anchor_status->repos_prop_status = repos_prop_status;
- eb->anchor_status->repos_text_status = repos_text_status;
+ eb->anchor_status->s.repos_node_status = repos_node_status;
+ eb->anchor_status->s.repos_prop_status = repos_prop_status;
+ eb->anchor_status->s.repos_text_status = repos_text_status;
/* If the root dir is out of date set the ood info directly too. */
- if (db->ood_changed_rev != eb->anchor_status->revision)
+ if (db->ood_changed_rev != eb->anchor_status->s.revision)
{
- eb->anchor_status->ood_changed_rev = db->ood_changed_rev;
- eb->anchor_status->ood_changed_date = db->ood_changed_date;
- eb->anchor_status->ood_kind = db->ood_kind;
- eb->anchor_status->ood_changed_author =
+ eb->anchor_status->s.ood_changed_rev = db->ood_changed_rev;
+ eb->anchor_status->s.ood_changed_date = db->ood_changed_date;
+ eb->anchor_status->s.ood_kind = db->ood_kind;
+ eb->anchor_status->s.ood_changed_author =
apr_pstrdup(pool, db->ood_changed_author);
}
}
@@ -2154,25 +2194,25 @@ close_directory(void *dir_baton,
if (pb && ! db->excluded)
{
svn_boolean_t was_deleted = FALSE;
- const svn_wc_status3_t *dir_status;
+ svn_wc__internal_status_t *dir_status;
/* See if the directory was deleted or replaced. */
dir_status = svn_hash_gets(pb->statii, db->local_abspath);
if (dir_status &&
- ((dir_status->repos_node_status == svn_wc_status_deleted)
- || (dir_status->repos_node_status == svn_wc_status_replaced)))
+ ((dir_status->s.repos_node_status == svn_wc_status_deleted)
+ || (dir_status->s.repos_node_status == svn_wc_status_replaced)))
was_deleted = TRUE;
/* Now do the status reporting. */
SVN_ERR(handle_statii(eb,
- dir_status ? dir_status->repos_root_url : NULL,
- dir_status ? dir_status->repos_relpath : NULL,
- dir_status ? dir_status->repos_uuid : NULL,
+ dir_status ? dir_status->s.repos_root_url : NULL,
+ dir_status ? dir_status->s.repos_relpath : NULL,
+ dir_status ? dir_status->s.repos_uuid : NULL,
db->statii, was_deleted, db->depth, scratch_pool));
if (dir_status && is_sendable_status(dir_status, eb->no_ignore,
eb->get_all))
SVN_ERR((eb->status_func)(eb->status_baton, db->local_abspath,
- dir_status, scratch_pool));
+ &dir_status->s, scratch_pool));
svn_hash_sets(pb->statii, db->local_abspath, NULL);
}
else if (! pb)
@@ -2181,13 +2221,12 @@ close_directory(void *dir_baton,
target, we should only report the target. */
if (*eb->target_basename)
{
- const svn_wc_status3_t *tgt_status;
+ const svn_wc__internal_status_t *tgt_status;
tgt_status = svn_hash_gets(db->statii, eb->target_abspath);
if (tgt_status)
{
- if (tgt_status->versioned
- && tgt_status->kind == svn_node_dir)
+ if (tgt_status->has_descendants)
{
SVN_ERR(get_dir_status(&eb->wb,
eb->target_abspath, TRUE,
@@ -2202,7 +2241,7 @@ close_directory(void *dir_baton,
}
if (is_sendable_status(tgt_status, eb->no_ignore, eb->get_all))
SVN_ERR((eb->status_func)(eb->status_baton, eb->target_abspath,
- tgt_status, scratch_pool));
+ &tgt_status->s, scratch_pool));
}
}
else
@@ -2211,15 +2250,15 @@ close_directory(void *dir_baton,
Note that our directory couldn't have been deleted,
because it is the root of the edit drive. */
SVN_ERR(handle_statii(eb,
- eb->anchor_status->repos_root_url,
- eb->anchor_status->repos_relpath,
- eb->anchor_status->repos_uuid,
+ eb->anchor_status->s.repos_root_url,
+ eb->anchor_status->s.repos_relpath,
+ eb->anchor_status->s.repos_uuid,
db->statii, FALSE, eb->default_depth,
scratch_pool));
if (is_sendable_status(eb->anchor_status, eb->no_ignore,
eb->get_all))
SVN_ERR((eb->status_func)(eb->status_baton, db->local_abspath,
- eb->anchor_status, scratch_pool));
+ &eb->anchor_status->s, scratch_pool));
eb->anchor_status = NULL;
}
}
@@ -2375,6 +2414,7 @@ close_file(void *file_baton,
}
return tweak_statushash(fb, NULL, FALSE, fb->edit_baton->db,
+ fb->edit_baton->wb.check_working_copy,
fb->local_abspath, repos_node_status,
repos_text_status, repos_prop_status,
SVN_INVALID_REVNUM, repos_lock, pool);
@@ -2393,18 +2433,18 @@ close_edit(void *edit_baton,
if (eb->root_opened)
return SVN_NO_ERROR;
- SVN_ERR(svn_wc_walk_status(eb->wc_ctx,
- eb->target_abspath,
- eb->default_depth,
- eb->get_all,
- eb->no_ignore,
- FALSE,
- eb->ignores,
- eb->status_func,
- eb->status_baton,
- eb->cancel_func,
- eb->cancel_baton,
- pool));
+ SVN_ERR(svn_wc__internal_walk_status(eb->db,
+ eb->target_abspath,
+ eb->default_depth,
+ eb->get_all,
+ eb->no_ignore,
+ FALSE,
+ eb->ignores,
+ eb->status_func,
+ eb->status_baton,
+ eb->cancel_func,
+ eb->cancel_baton,
+ pool));
return SVN_NO_ERROR;
}
@@ -2423,6 +2463,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,
@@ -2447,7 +2488,6 @@ svn_wc__get_status_editor(const svn_delta_editor_t **editor,
eb->default_depth = depth;
eb->target_revision = edit_revision;
eb->db = wc_ctx->db;
- eb->wc_ctx = wc_ctx;
eb->get_all = get_all;
eb->no_ignore = no_ignore;
eb->status_func = status_func;
@@ -2463,7 +2503,8 @@ svn_wc__get_status_editor(const svn_delta_editor_t **editor,
eb->wb.db = wc_ctx->db;
eb->wb.target_abspath = eb->target_abspath;
- eb->wb.ignore_text_mods = FALSE;
+ eb->wb.ignore_text_mods = !check_working_copy;
+ eb->wb.check_working_copy = check_working_copy;
eb->wb.repos_locks = NULL;
eb->wb.repos_root = NULL;
@@ -2488,7 +2529,7 @@ svn_wc__get_status_editor(const svn_delta_editor_t **editor,
/* The edit baton's status structure maps to PATH, and the editor
have to be aware of whether that is the anchor or the target. */
SVN_ERR(internal_status(&(eb->anchor_status), wc_ctx->db, anchor_abspath,
- result_pool, scratch_pool));
+ check_working_copy, result_pool, scratch_pool));
/* Construct an editor. */
tree_editor->set_target_revision = set_target_revision;
@@ -2594,6 +2635,7 @@ svn_wc__internal_walk_status(svn_wc__db_t *db,
wb.db = db;
wb.target_abspath = local_abspath;
wb.ignore_text_mods = ignore_text_mods;
+ wb.check_working_copy = TRUE;
wb.repos_root = NULL;
wb.repos_locks = NULL;
@@ -2608,6 +2650,7 @@ svn_wc__internal_walk_status(svn_wc__db_t *db,
}
err = svn_wc__db_read_single_info(&info, db, local_abspath,
+ FALSE /* base_tree_only */,
scratch_pool, scratch_pool);
if (err)
@@ -2636,7 +2679,7 @@ svn_wc__internal_walk_status(svn_wc__db_t *db,
}
if (info
- && info->kind == svn_node_dir
+ && info->has_descendants /* is dir, or was dir and has tc descendants */
&& info->status != svn_wc__db_status_not_present
&& info->status != svn_wc__db_status_excluded
&& info->status != svn_wc__db_status_server_excluded)
@@ -2756,30 +2799,26 @@ svn_wc_get_default_ignores(apr_array_header_t **patterns,
/* */
static svn_error_t *
-internal_status(svn_wc_status3_t **status,
+internal_status(svn_wc__internal_status_t **status,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t check_working_copy,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- const svn_io_dirent2_t *dirent;
- svn_node_kind_t node_kind;
+ const svn_io_dirent2_t *dirent = NULL;
const char *parent_repos_relpath;
const char *parent_repos_root_url;
const char *parent_repos_uuid;
- svn_wc__db_status_t node_status;
- svn_boolean_t conflicted;
+ const struct svn_wc__db_info_t *info;
svn_boolean_t is_root = FALSE;
svn_error_t *err;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- err = svn_wc__db_read_info(&node_status, &node_kind, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, &conflicted,
- NULL, NULL, NULL, NULL, NULL, NULL,
- db, local_abspath,
- scratch_pool, scratch_pool);
+ err = svn_wc__db_read_single_info(&info, db, local_abspath,
+ !check_working_copy,
+ scratch_pool, scratch_pool);
if (err)
{
@@ -2787,30 +2826,25 @@ internal_status(svn_wc_status3_t **status,
return svn_error_trace(err);
svn_error_clear(err);
- node_kind = svn_node_unknown;
- /* Ensure conflicted is always set, but don't hide tree conflicts
- on 'hidden' nodes. */
- conflicted = FALSE;
+ info = NULL;
- SVN_ERR(svn_io_stat_dirent2(&dirent, local_abspath, FALSE, TRUE,
- scratch_pool, scratch_pool));
+ if (check_working_copy)
+ SVN_ERR(svn_io_stat_dirent2(&dirent, local_abspath, FALSE, TRUE,
+ scratch_pool, scratch_pool));
}
- else
+ else if (check_working_copy)
SVN_ERR(stat_wc_dirent_case_sensitive(&dirent, db, local_abspath,
scratch_pool, scratch_pool));
- if (node_kind != svn_node_unknown
- && (node_status == svn_wc__db_status_not_present
- || node_status == svn_wc__db_status_server_excluded
- || node_status == svn_wc__db_status_excluded))
- {
- node_kind = svn_node_unknown;
- }
-
- if (node_kind == svn_node_unknown)
+ if (!info
+ || info->kind == svn_node_unknown
+ || info->status == svn_wc__db_status_not_present
+ || info->status == svn_wc__db_status_server_excluded
+ || info->status == svn_wc__db_status_excluded)
return svn_error_trace(assemble_unversioned(status,
db, local_abspath,
- dirent, conflicted,
+ dirent,
+ info ? info->conflicted : FALSE,
FALSE /* is_ignored */,
result_pool, scratch_pool));
@@ -2819,30 +2853,31 @@ internal_status(svn_wc_status3_t **status,
else
SVN_ERR(svn_wc__db_is_wcroot(&is_root, db, local_abspath, scratch_pool));
+ /* Even though passing parent_repos_* is not required, assemble_status needs
+ these values to determine if a node is switched */
if (!is_root)
{
- svn_wc__db_status_t parent_status;
- const char *parent_abspath = svn_dirent_dirname(local_abspath,
- scratch_pool);
-
- err = svn_wc__db_read_info(&parent_status, NULL, NULL,
- &parent_repos_relpath, &parent_repos_root_url,
- &parent_repos_uuid, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- db, parent_abspath,
- result_pool, scratch_pool);
-
- if (err && (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND
- || SVN_WC__ERR_IS_NOT_CURRENT_WC(err)))
- {
- svn_error_clear(err);
- parent_repos_root_url = NULL;
- parent_repos_relpath = NULL;
- parent_repos_uuid = NULL;
- }
- else SVN_ERR(err);
+ const char *const parent_abspath = svn_dirent_dirname(local_abspath,
+ scratch_pool);
+ if (check_working_copy)
+ SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL,
+ &parent_repos_relpath,
+ &parent_repos_root_url,
+ &parent_repos_uuid,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ db, parent_abspath,
+ result_pool, scratch_pool));
+ else
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL,
+ &parent_repos_relpath,
+ &parent_repos_root_url,
+ &parent_repos_uuid,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ db, parent_abspath,
+ result_pool, scratch_pool));
}
else
{
@@ -2855,10 +2890,10 @@ internal_status(svn_wc_status3_t **status,
parent_repos_root_url,
parent_repos_relpath,
parent_repos_uuid,
- NULL,
+ info,
dirent,
TRUE /* get_all */,
- FALSE,
+ FALSE, check_working_copy,
NULL /* repos_lock */,
result_pool, scratch_pool));
}
@@ -2871,16 +2906,21 @@ svn_wc_status3(svn_wc_status3_t **status,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(
- internal_status(status, wc_ctx->db, local_abspath, result_pool,
- scratch_pool));
+ svn_wc__internal_status_t *stat;
+ SVN_ERR(internal_status(&stat, wc_ctx->db, local_abspath,
+ TRUE /* check_working_copy */,
+ result_pool, scratch_pool));
+ *status = &stat->s;
+ return SVN_NO_ERROR;
}
svn_wc_status3_t *
svn_wc_dup_status3(const svn_wc_status3_t *orig_stat,
apr_pool_t *pool)
{
- svn_wc_status3_t *new_stat = apr_palloc(pool, sizeof(*new_stat));
+ /* Allocate slightly more room */
+ svn_wc__internal_status_t *new_istat = apr_palloc(pool, sizeof(*new_istat));
+ svn_wc_status3_t *new_stat = &new_istat->s;
/* Shallow copy all members. */
*new_stat = *orig_stat;
diff --git a/subversion/libsvn_wc/token-map.h b/subversion/libsvn_wc/token-map.h
index 9da12b8..9bf80d6 100644
--- a/subversion/libsvn_wc/token-map.h
+++ b/subversion/libsvn_wc/token-map.h
@@ -33,6 +33,7 @@
extern "C" {
#endif
+/* The kind values used on NODES */
static const svn_token_map_t kind_map[] = {
{ "file", svn_node_file }, /* MAP_FILE */
{ "dir", svn_node_dir }, /* MAP_DIR */
@@ -41,6 +42,16 @@ static const svn_token_map_t kind_map[] = {
{ NULL }
};
+/* Like kind_map, but also supports 'none' */
+static const svn_token_map_t kind_map_none[] = {
+ { "none", svn_node_none },
+ { "file", svn_node_file },
+ { "dir", svn_node_dir },
+ { "symlink", svn_node_symlink },
+ { "unknown", svn_node_unknown },
+ { NULL }
+};
+
/* Note: we only decode presence values from the database. These are a
subset of all the status values. */
static const svn_token_map_t presence_map[] = {
diff --git a/subversion/libsvn_wc/translate.c b/subversion/libsvn_wc/translate.c
index 9e0b265..0e16235 100644
--- a/subversion/libsvn_wc/translate.c
+++ b/subversion/libsvn_wc/translate.c
@@ -30,6 +30,7 @@
#include <apr_file_io.h>
#include <apr_strings.h>
+#include "svn_private_config.h"
#include "svn_types.h"
#include "svn_string.h"
#include "svn_dirent_uri.h"
@@ -45,25 +46,9 @@
#include "translate.h"
#include "props.h"
-#include "svn_private_config.h"
#include "private/svn_wc_private.h"
-
-/* */
-static svn_error_t *
-read_handler_unsupported(void *baton, char *buffer, apr_size_t *len)
-{
- SVN_ERR_MALFUNCTION();
-}
-
-/* */
-static svn_error_t *
-write_handler_unsupported(void *baton, const char *buffer, apr_size_t *len)
-{
- SVN_ERR_MALFUNCTION();
-}
-
svn_error_t *
svn_wc__internal_translated_stream(svn_stream_t **stream,
svn_wc__db_t *db,
@@ -133,16 +118,18 @@ svn_wc__internal_translated_stream(svn_stream_t **stream,
FALSE /* expand */,
result_pool);
- /* Enforce our contract. TO_NF streams are readonly */
- svn_stream_set_write(*stream, write_handler_unsupported);
+ /* streams enforce our contract that TO_NF streams are read-only
+ * by returning SVN_ERR_STREAM_NOT_SUPPORTED when trying to
+ * write to them. */
}
else
{
*stream = svn_subst_stream_translated(*stream, eol, TRUE,
keywords, TRUE, result_pool);
- /* Enforce our contract. FROM_NF streams are write-only */
- svn_stream_set_read(*stream, read_handler_unsupported);
+ /* streams enforce our contract that FROM_NF streams are write-only
+ * by returning SVN_ERR_STREAM_NOT_SUPPORTED when trying to
+ * read them. */
}
}
@@ -329,12 +316,15 @@ svn_wc__expand_keywords(apr_hash_t **keywords,
db, local_abspath,
scratch_pool, scratch_pool));
- if (repos_relpath)
- url = svn_path_url_add_component2(repos_root_url, repos_relpath,
- scratch_pool);
- else
- SVN_ERR(svn_wc__db_read_url(&url, db, local_abspath, scratch_pool,
- scratch_pool));
+ /* Handle special statuses (e.g. added) */
+ if (!repos_relpath)
+ SVN_ERR(svn_wc__db_read_repos_info(NULL, &repos_relpath,
+ &repos_root_url, NULL,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ url = svn_path_url_add_component2(repos_root_url, repos_relpath,
+ scratch_pool);
}
else
{
diff --git a/subversion/libsvn_wc/tree_conflicts.c b/subversion/libsvn_wc/tree_conflicts.c
index 4445c96..caf39ed 100644
--- a/subversion/libsvn_wc/tree_conflicts.c
+++ b/subversion/libsvn_wc/tree_conflicts.c
@@ -46,6 +46,7 @@ static const svn_token_map_t node_kind_map[] =
{ "file", svn_node_file },
{ "dir", svn_node_dir },
{ "", svn_node_unknown },
+ /* ### should also map svn_node_symlink */
{ NULL }
};
@@ -353,13 +354,13 @@ svn_wc__serialize_conflict(svn_skel_t **skel,
else
SVN_ERR(prepend_version_info_skel(c_skel, &null_version, result_pool));
- /* reason */
- skel_prepend_enum(c_skel, svn_wc__conflict_reason_map, conflict->reason,
- result_pool);
+ /* local change */
+ skel_prepend_enum(c_skel, svn_wc__conflict_reason_map,
+ conflict->reason, result_pool);
- /* action */
- skel_prepend_enum(c_skel, svn_wc__conflict_action_map, conflict->action,
- result_pool);
+ /* incoming change */
+ skel_prepend_enum(c_skel, svn_wc__conflict_action_map,
+ conflict->action, result_pool);
/* operation */
skel_prepend_enum(c_skel, svn_wc__operation_map, conflict->operation,
@@ -367,8 +368,10 @@ svn_wc__serialize_conflict(svn_skel_t **skel,
/* node_kind */
SVN_ERR_ASSERT(conflict->node_kind == svn_node_dir
- || conflict->node_kind == svn_node_file);
- skel_prepend_enum(c_skel, node_kind_map, conflict->node_kind, result_pool);
+ || conflict->node_kind == svn_node_file
+ || conflict->node_kind == svn_node_none);
+ skel_prepend_enum(c_skel, node_kind_map, conflict->node_kind,
+ result_pool);
/* Victim path (escaping separator chars). */
victim_basename = svn_dirent_basename(conflict->local_abspath, result_pool);
@@ -409,10 +412,9 @@ svn_wc__add_tree_conflict(svn_wc_context_t *wc_ctx,
svn_error_t *err;
SVN_ERR_ASSERT(conflict != NULL);
- SVN_ERR_ASSERT(conflict->operation == svn_wc_operation_merge
- || (conflict->reason != svn_wc_conflict_reason_moved_away
- && conflict->reason != svn_wc_conflict_reason_moved_here)
- );
+ SVN_ERR_ASSERT(conflict->operation == svn_wc_operation_merge ||
+ (conflict->reason != svn_wc_conflict_reason_moved_away &&
+ conflict->reason != svn_wc_conflict_reason_moved_here));
/* Re-adding an existing tree conflict victim is an error. */
err = svn_wc__internal_conflicted_p(NULL, NULL, &existing_conflict,
@@ -443,7 +445,7 @@ svn_wc__add_tree_conflict(svn_wc_context_t *wc_ctx,
NULL,
scratch_pool, scratch_pool));
- switch(conflict->operation)
+ switch (conflict->operation)
{
case svn_wc_operation_update:
default:
@@ -483,8 +485,10 @@ svn_wc__get_tree_conflict(const svn_wc_conflict_description2_t **tree_conflict,
int i;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- SVN_ERR(svn_wc__read_conflicts(&conflicts,
- wc_ctx->db, local_abspath, FALSE,
+ SVN_ERR(svn_wc__read_conflicts(&conflicts, NULL,
+ wc_ctx->db, local_abspath,
+ FALSE /* temp files */,
+ TRUE /* only tree conflicts */,
scratch_pool, scratch_pool));
if (!conflicts || conflicts->nelts == 0)
@@ -501,8 +505,7 @@ svn_wc__get_tree_conflict(const svn_wc_conflict_description2_t **tree_conflict,
if (desc->kind == svn_wc_conflict_kind_tree)
{
- *tree_conflict = svn_wc__conflict_description2_dup(desc,
- result_pool);
+ *tree_conflict = svn_wc_conflict_description2_dup(desc, result_pool);
return SVN_NO_ERROR;
}
}
diff --git a/subversion/libsvn_wc/update_editor.c b/subversion/libsvn_wc/update_editor.c
index fd3e9ca..4dca3af 100644
--- a/subversion/libsvn_wc/update_editor.c
+++ b/subversion/libsvn_wc/update_editor.c
@@ -211,7 +211,7 @@ struct edit_baton
/* If this is a 'switch' operation, the new relpath of target_abspath,
else NULL. */
- const char *switch_relpath;
+ const char *switch_repos_relpath;
/* The URL to the root of the repository. */
const char *repos_root;
@@ -258,6 +258,9 @@ struct edit_baton
/* Absolute path of the working copy root or NULL if not initialized yet */
const char *wcroot_abspath;
+ /* After closing the root directory a copy of its edited value */
+ svn_boolean_t edited;
+
apr_pool_t *pool;
};
@@ -295,7 +298,7 @@ struct dir_baton
const char *local_abspath;
/* The repository relative path this directory will correspond to. */
- const char *new_relpath;
+ const char *new_repos_relpath;
/* The revision of the directory before updating */
svn_revnum_t old_revision;
@@ -342,9 +345,10 @@ struct dir_baton
and reinstall it. */
apr_hash_t *deletion_conflicts;
- /* A hash of file names (only the hash key matters) seen by add_file
- and not yet added to the database by close_file. */
- apr_hash_t *not_present_files;
+ /* A hash of file names (only the hash key matters) seen by add_file and
+ add_directory and not yet added to the database, mapping to a const
+ char * node kind (via svn_node_kind_to_word(). */
+ apr_hash_t *not_present_nodes;
/* Set if an unversioned dir of the same name already existed in
this directory. */
@@ -398,7 +402,7 @@ struct handler_baton
struct file_baton *fb;
/* Where we are assembling the new file. */
- const char *new_text_base_tmp_abspath;
+ svn_wc__db_install_data_t *install_data;
/* The expected source checksum of the text source or NULL if no base
checksum is available (MD5 if the server provides a checksum, SHA1 if
@@ -412,7 +416,7 @@ struct handler_baton
provide a sha1, so we may not have to calculate both, but for the time
being, that's the way it is. */
- /* The calculated checksum of the text source or NULL if the acual
+ /* The calculated checksum of the text source or NULL if the actual
checksum is not being calculated. The checksum kind is identical to the
kind of expected_source_checksum. */
svn_checksum_t *actual_source_checksum;
@@ -486,47 +490,20 @@ cleanup_edit_baton(void *edit_baton)
return APR_SUCCESS;
}
-/* Make a new dir baton in a subpool of PB->pool. PB is the parent baton.
- If PATH and PB are NULL, this is the root directory of the edit; in this
- case, make the new dir baton in a subpool of EB->pool.
- ADDING should be TRUE if we are adding this directory. */
+/* Calculate the new repos_relpath for a directory or file */
static svn_error_t *
-make_dir_baton(struct dir_baton **d_p,
- const char *path,
- struct edit_baton *eb,
- struct dir_baton *pb,
- svn_boolean_t adding,
- apr_pool_t *scratch_pool)
+calculate_repos_relpath(const char **new_repos_relpath,
+ const char *local_abspath,
+ const char *old_repos_relpath,
+ struct edit_baton *eb,
+ struct dir_baton *pb,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *dir_pool;
- struct dir_baton *d;
-
- if (pb != NULL)
- dir_pool = svn_pool_create(pb->pool);
- else
- dir_pool = svn_pool_create(eb->pool);
-
- SVN_ERR_ASSERT(path || (! pb));
-
- /* Okay, no easy out, so allocate and initialize a dir baton. */
- d = apr_pcalloc(dir_pool, sizeof(*d));
+ const char *name = svn_dirent_basename(local_abspath, NULL);
- /* Construct the PATH and baseNAME of this directory. */
- if (path)
- {
- d->name = svn_dirent_basename(path, dir_pool);
- SVN_ERR(path_join_under_root(&d->local_abspath,
- pb->local_abspath, d->name, dir_pool));
- }
- else
- {
- /* This is the root baton. */
- d->name = NULL;
- d->local_abspath = eb->anchor_abspath;
- }
-
- /* Figure out the new_relpath for this directory. */
- if (eb->switch_relpath)
+ /* Figure out the new_repos_relpath for this directory. */
+ if (eb->switch_repos_relpath)
{
/* Handle switches... */
@@ -535,18 +512,16 @@ make_dir_baton(struct dir_baton **d_p,
if (*eb->target_basename == '\0')
{
/* No parent baton and target_basename=="" means that we are
- the target of the switch. Thus, our NEW_RELPATH will be
- the SWITCH_RELPATH. */
- d->new_relpath = eb->switch_relpath;
+ the target of the switch. Thus, our new_repos_relpath will be
+ the switch_repos_relpath. */
+ *new_repos_relpath = eb->switch_repos_relpath;
}
else
{
/* This node is NOT the target of the switch (one of our
children is the target); therefore, it must already exist.
Get its old REPOS_RELPATH, as it won't be changing. */
- SVN_ERR(svn_wc__db_scan_base_repos(&d->new_relpath, NULL, NULL,
- eb->db, d->local_abspath,
- dir_pool, scratch_pool));
+ *new_repos_relpath = apr_pstrdup(result_pool, old_repos_relpath);
}
}
else
@@ -554,36 +529,76 @@ make_dir_baton(struct dir_baton **d_p,
/* This directory is *not* the root (has a parent). If there is
no grandparent, then we may have anchored at the parent,
and self is the target. If we match the target, then set
- NEW_RELPATH to the SWITCH_RELPATH.
+ new_repos_relpath to the switch_repos_relpath.
+
+ Otherwise, we simply extend new_repos_relpath from the parent. */
- Otherwise, we simply extend NEW_RELPATH from the parent. */
if (pb->parent_baton == NULL
- && strcmp(eb->target_basename, d->name) == 0)
- d->new_relpath = eb->switch_relpath;
+ && strcmp(eb->target_basename, name) == 0)
+ *new_repos_relpath = eb->switch_repos_relpath;
else
- d->new_relpath = svn_relpath_join(pb->new_relpath, d->name,
- dir_pool);
+ *new_repos_relpath = svn_relpath_join(pb->new_repos_relpath, name,
+ result_pool);
}
}
else /* must be an update */
{
/* If we are adding the node, then simply extend the parent's
relpath for our own. */
- if (adding)
+ if (old_repos_relpath == NULL)
{
SVN_ERR_ASSERT(pb != NULL);
- d->new_relpath = svn_relpath_join(pb->new_relpath, d->name,
- dir_pool);
+ *new_repos_relpath = svn_relpath_join(pb->new_repos_relpath, name,
+ result_pool);
}
else
{
- SVN_ERR(svn_wc__db_scan_base_repos(&d->new_relpath, NULL, NULL,
- eb->db, d->local_abspath,
- dir_pool, scratch_pool));
- SVN_ERR_ASSERT(d->new_relpath);
+ *new_repos_relpath = apr_pstrdup(result_pool, old_repos_relpath);
}
}
+ return SVN_NO_ERROR;
+}
+
+/* Make a new dir baton in a subpool of PB->pool. PB is the parent baton.
+ If PATH and PB are NULL, this is the root directory of the edit; in this
+ case, make the new dir baton in a subpool of EB->pool.
+ ADDING should be TRUE if we are adding this directory. */
+static svn_error_t *
+make_dir_baton(struct dir_baton **d_p,
+ const char *path,
+ struct edit_baton *eb,
+ struct dir_baton *pb,
+ svn_boolean_t adding,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *dir_pool;
+ struct dir_baton *d;
+
+ if (pb != NULL)
+ dir_pool = svn_pool_create(pb->pool);
+ else
+ dir_pool = svn_pool_create(eb->pool);
+
+ SVN_ERR_ASSERT(path || (! pb));
+
+ /* Okay, no easy out, so allocate and initialize a dir baton. */
+ d = apr_pcalloc(dir_pool, sizeof(*d));
+
+ /* Construct the PATH and baseNAME of this directory. */
+ if (path)
+ {
+ d->name = svn_dirent_basename(path, dir_pool);
+ SVN_ERR(path_join_under_root(&d->local_abspath,
+ pb->local_abspath, d->name, dir_pool));
+ }
+ else
+ {
+ /* This is the root baton. */
+ d->name = NULL;
+ d->local_abspath = eb->anchor_abspath;
+ }
+
d->edit_baton = eb;
d->parent_baton = pb;
d->pool = dir_pool;
@@ -594,7 +609,7 @@ make_dir_baton(struct dir_baton **d_p,
d->old_revision = SVN_INVALID_REVNUM;
d->adding_dir = adding;
d->changed_rev = SVN_INVALID_REVNUM;
- d->not_present_files = apr_hash_make(dir_pool);
+ d->not_present_nodes = apr_hash_make(dir_pool);
/* Copy some flags from the parent baton */
if (pb)
@@ -614,7 +629,6 @@ make_dir_baton(struct dir_baton **d_p,
return SVN_NO_ERROR;
}
-
/* Forward declarations. */
static svn_error_t *
already_in_a_tree_conflict(svn_boolean_t *conflicted,
@@ -680,7 +694,7 @@ struct file_baton
const char *local_abspath;
/* The repository relative path this file will correspond to. */
- const char *new_relpath;
+ const char *new_repos_relpath;
/* The revision of the file before updating */
svn_revnum_t old_revision;
@@ -764,7 +778,6 @@ make_file_baton(struct file_baton **f_p,
svn_boolean_t adding,
apr_pool_t *scratch_pool)
{
- struct edit_baton *eb = pb->edit_baton;
apr_pool_t *file_pool = svn_pool_create(pb->pool);
struct file_baton *f = apr_pcalloc(file_pool, sizeof(*f));
@@ -776,37 +789,6 @@ make_file_baton(struct file_baton **f_p,
SVN_ERR(path_join_under_root(&f->local_abspath,
pb->local_abspath, f->name, file_pool));
- /* Figure out the new URL for this file. */
- if (eb->switch_relpath)
- {
- /* Handle switches... */
-
- /* This file has a parent directory. If there is
- no grandparent, then we may have anchored at the parent,
- and self is the target. If we match the target, then set
- NEW_RELPATH to the SWITCH_RELPATH.
-
- Otherwise, we simply extend NEW_RELPATH from the parent. */
- if (pb->parent_baton == NULL
- && strcmp(eb->target_basename, f->name) == 0)
- f->new_relpath = eb->switch_relpath;
- else
- f->new_relpath = svn_relpath_join(pb->new_relpath, f->name,
- file_pool);
- }
- else /* must be an update */
- {
- if (adding)
- f->new_relpath = svn_relpath_join(pb->new_relpath, f->name, file_pool);
- else
- {
- SVN_ERR(svn_wc__db_scan_base_repos(&f->new_relpath, NULL, NULL,
- eb->db, f->local_abspath,
- file_pool, scratch_pool));
- SVN_ERR_ASSERT(f->new_relpath);
- }
- }
-
f->pool = file_pool;
f->edit_baton = pb->edit_baton;
f->propchanges = apr_array_make(file_pool, 1, sizeof(svn_prop_t));
@@ -843,13 +825,16 @@ complete_conflict(svn_skel_t *conflict,
const char *new_repos_relpath,
svn_node_kind_t local_kind,
svn_node_kind_t target_kind,
+ const svn_skel_t *delete_conflict,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_wc_conflict_version_t *original_version;
+ const svn_wc_conflict_version_t *original_version = NULL;
svn_wc_conflict_version_t *target_version;
svn_boolean_t is_complete;
+ SVN_ERR_ASSERT(new_repos_relpath);
+
if (!conflict)
return SVN_NO_ERROR; /* Not conflicted */
@@ -865,20 +850,30 @@ complete_conflict(svn_skel_t *conflict,
old_revision,
local_kind,
result_pool);
- else
- original_version = NULL;
+ else if (delete_conflict)
+ {
+ const apr_array_header_t *locations;
- if (new_repos_relpath)
- target_version = svn_wc_conflict_version_create2(eb->repos_root,
- eb->repos_uuid,
- new_repos_relpath,
- *eb->target_revision,
- target_kind,
- result_pool);
- else
- target_version = NULL;
+ SVN_ERR(svn_wc__conflict_read_info(NULL, &locations, NULL, NULL, NULL,
+ eb->db, local_abspath,
+ delete_conflict,
+ scratch_pool, scratch_pool));
+
+ if (locations)
+ {
+ original_version = APR_ARRAY_IDX(locations, 0,
+ const svn_wc_conflict_version_t *);
+ }
+ }
- if (eb->switch_relpath)
+ target_version = svn_wc_conflict_version_create2(eb->repos_root,
+ eb->repos_uuid,
+ new_repos_relpath,
+ *eb->target_revision,
+ target_kind,
+ result_pool);
+
+ if (eb->switch_repos_relpath)
SVN_ERR(svn_wc__conflict_skel_set_op_switch(conflict,
original_version,
target_version,
@@ -913,8 +908,9 @@ mark_directory_edited(struct dir_baton *db, apr_pool_t *scratch_pool)
SVN_ERR(complete_conflict(db->edit_conflict, db->edit_baton,
db->local_abspath,
db->old_repos_relpath, db->old_revision,
- db->new_relpath,
+ db->new_repos_relpath,
svn_node_dir, svn_node_dir,
+ NULL,
db->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(db->edit_baton->db,
db->local_abspath,
@@ -924,7 +920,6 @@ mark_directory_edited(struct dir_baton *db, apr_pool_t *scratch_pool)
do_notification(db->edit_baton, db->local_abspath, svn_node_dir,
svn_wc_notify_tree_conflict, scratch_pool);
db->already_notified = TRUE;
-
}
return SVN_NO_ERROR;
@@ -948,8 +943,9 @@ mark_file_edited(struct file_baton *fb, apr_pool_t *scratch_pool)
SVN_ERR(complete_conflict(fb->edit_conflict, fb->edit_baton,
fb->local_abspath, fb->old_repos_relpath,
- fb->old_revision, fb->new_relpath,
+ fb->old_revision, fb->new_repos_relpath,
svn_node_file, svn_node_file,
+ NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(fb->edit_baton->db,
@@ -974,7 +970,6 @@ window_handler(svn_txdelta_window_t *window, void *baton)
{
struct handler_baton *hb = baton;
struct file_baton *fb = hb->fb;
- svn_wc__db_t *db = fb->edit_baton->db;
svn_error_t *err;
/* Apply this window. We may be done at that point. */
@@ -1014,10 +1009,10 @@ window_handler(svn_txdelta_window_t *window, void *baton)
{
/* We failed to apply the delta; clean up the temporary file if it
already created by lazy_open_target(). */
- if (hb->new_text_base_tmp_abspath)
+ if (hb->install_data)
{
- svn_error_clear(svn_io_remove_file2(hb->new_text_base_tmp_abspath,
- TRUE, hb->pool));
+ svn_error_clear(svn_wc__db_pristine_install_abort(hb->install_data,
+ hb->pool));
}
}
else
@@ -1031,7 +1026,7 @@ window_handler(svn_txdelta_window_t *window, void *baton)
/* Store the new pristine text in the pristine store now. Later, in a
single transaction we will update the BASE_NODE to include a
reference to this pristine text's checksum. */
- SVN_ERR(svn_wc__db_pristine_install(db, hb->new_text_base_tmp_abspath,
+ SVN_ERR(svn_wc__db_pristine_install(hb->install_data,
fb->new_text_base_sha1_checksum,
fb->new_text_base_md5_checksum,
hb->pool));
@@ -1154,17 +1149,6 @@ set_target_revision(void *edit_baton,
return SVN_NO_ERROR;
}
-static svn_error_t *
-check_tree_conflict(svn_skel_t **pconflict,
- struct edit_baton *eb,
- const char *local_abspath,
- svn_wc__db_status_t working_status,
- svn_boolean_t exists_in_repos,
- svn_node_kind_t expected_kind,
- svn_wc_conflict_action_t action,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
/* An svn_delta_editor_t function. */
static svn_error_t *
open_root(void *edit_baton,
@@ -1228,10 +1212,27 @@ open_root(void *edit_baton,
eb->db, db->local_abspath,
db->pool, pool));
- if (conflict_ignored)
+ if (have_work)
{
- db->shadowed = TRUE;
+ SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL,
+ &db->old_revision,
+ &db->old_repos_relpath, NULL, NULL,
+ &db->changed_rev, &db->changed_date,
+ &db->changed_author,
+ &db->ambient_depth,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ eb->db, db->local_abspath,
+ db->pool, pool));
}
+ else
+ base_status = status;
+
+ SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
+ db->old_repos_relpath, eb, NULL,
+ db->pool, pool));
+
+ if (conflict_ignored)
+ db->shadowed = TRUE;
else if (have_work)
{
const char *move_src_root_abspath;
@@ -1239,16 +1240,6 @@ open_root(void *edit_baton,
SVN_ERR(svn_wc__db_base_moved_to(NULL, NULL, &move_src_root_abspath,
NULL, eb->db, db->local_abspath,
pool, pool));
- if (move_src_root_abspath || *eb->target_basename == '\0')
- SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL,
- &db->old_revision,
- &db->old_repos_relpath, NULL, NULL,
- &db->changed_rev, &db->changed_date,
- &db->changed_author,
- &db->ambient_depth,
- NULL, NULL, NULL, NULL, NULL, NULL,
- eb->db, db->local_abspath,
- db->pool, pool));
if (move_src_root_abspath)
{
@@ -1271,9 +1262,10 @@ open_root(void *edit_baton,
SVN_ERR(complete_conflict(tree_conflict, eb,
move_src_root_abspath,
db->old_repos_relpath,
- db->old_revision, db->new_relpath,
+ db->old_revision,
+ db->new_repos_relpath,
svn_node_dir, svn_node_dir,
- pool, pool));
+ NULL, pool, pool));
SVN_ERR(svn_wc__db_op_mark_conflict(eb->db,
move_src_root_abspath,
tree_conflict,
@@ -1288,8 +1280,6 @@ open_root(void *edit_baton,
db->shadowed = TRUE; /* Needed for the close_directory() on the root, to
make sure it doesn't use the ACTUAL tree */
}
- else
- base_status = status;
if (*eb->target_basename == '\0')
{
@@ -1308,7 +1298,7 @@ open_root(void *edit_baton,
SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db,
db->local_abspath,
- db->new_relpath,
+ db->new_repos_relpath,
*eb->target_revision,
pool));
}
@@ -1320,99 +1310,6 @@ open_root(void *edit_baton,
/* ===================================================================== */
/* Checking for local modifications. */
-/* A baton for use with modcheck_found_entry(). */
-typedef struct modcheck_baton_t {
- svn_wc__db_t *db; /* wc_db to access nodes */
- svn_boolean_t found_mod; /* whether a modification has been found */
- svn_boolean_t found_not_delete; /* Found a not-delete modification */
-} modcheck_baton_t;
-
-/* An implementation of svn_wc_status_func4_t. */
-static svn_error_t *
-modcheck_callback(void *baton,
- const char *local_abspath,
- const svn_wc_status3_t *status,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t *mb = baton;
-
- switch (status->node_status)
- {
- case svn_wc_status_normal:
- case svn_wc_status_incomplete:
- case svn_wc_status_ignored:
- case svn_wc_status_none:
- case svn_wc_status_unversioned:
- case svn_wc_status_external:
- break;
-
- case svn_wc_status_deleted:
- mb->found_mod = TRUE;
- break;
-
- case svn_wc_status_missing:
- case svn_wc_status_obstructed:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
-
- default:
- case svn_wc_status_added:
- case svn_wc_status_replaced:
- case svn_wc_status_modified:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Set *MODIFIED to true iff there are any local modifications within the
- * tree rooted at LOCAL_ABSPATH, using DB. If *MODIFIED
- * is set to true and all the local modifications were deletes then set
- * *ALL_EDITS_ARE_DELETES to true, set it to false otherwise. LOCAL_ABSPATH
- * may be a file or a directory. */
-svn_error_t *
-svn_wc__node_has_local_mods(svn_boolean_t *modified,
- svn_boolean_t *all_edits_are_deletes,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t modcheck_baton = { NULL, FALSE, FALSE };
- svn_error_t *err;
-
- modcheck_baton.db = db;
-
- /* Walk the WC tree for status with depth infinity, looking for any local
- * modifications. If it's a "sparse" directory, that's OK: there can be
- * no local mods in the pieces that aren't present in the WC. */
-
- err = svn_wc__internal_walk_status(db, local_abspath,
- svn_depth_infinity,
- FALSE, FALSE, FALSE, NULL,
- modcheck_callback, &modcheck_baton,
- cancel_func, cancel_baton,
- scratch_pool);
-
- if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
- svn_error_clear(err);
- else
- SVN_ERR(err);
-
- *modified = modcheck_baton.found_mod;
- *all_edits_are_deletes = (modcheck_baton.found_mod
- && !modcheck_baton.found_not_delete);
-
- return SVN_NO_ERROR;
-}
-
/* Indicates an unset svn_wc_conflict_reason_t. */
#define SVN_WC_CONFLICT_REASON_NONE (svn_wc_conflict_reason_t)(-1)
@@ -1447,7 +1344,6 @@ check_tree_conflict(svn_skel_t **pconflict,
{
svn_wc_conflict_reason_t reason = SVN_WC_CONFLICT_REASON_NONE;
svn_boolean_t modified = FALSE;
- svn_boolean_t all_mods_are_deletes = FALSE;
const char *move_src_op_root_abspath = NULL;
*pconflict = NULL;
@@ -1486,15 +1382,15 @@ check_tree_conflict(svn_skel_t **pconflict,
}
else
{
- /* The node is locally replaced but could also be moved-away. */
- SVN_ERR(svn_wc__db_base_moved_to(NULL, NULL, NULL,
- &move_src_op_root_abspath,
- eb->db, local_abspath,
- scratch_pool, scratch_pool));
- if (move_src_op_root_abspath)
- reason = svn_wc_conflict_reason_moved_away;
- else
- reason = svn_wc_conflict_reason_replaced;
+ /* The node is locally replaced but could also be moved-away,
+ but we can't report that it is moved away and replaced.
+
+ And we wouldn't be able to store that each of a dozen
+ descendants was moved to other locations...
+
+ Replaced is what actually happened... */
+
+ reason = svn_wc_conflict_reason_replaced;
}
break;
@@ -1557,14 +1453,14 @@ check_tree_conflict(svn_skel_t **pconflict,
* not visit the subdirectories of a directory that it wants to delete.
* Therefore, we need to start a separate crawl here. */
- SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_mods_are_deletes,
- eb->db, local_abspath,
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, NULL,
+ eb->db, local_abspath, FALSE,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
if (modified)
{
- if (all_mods_are_deletes)
+ if (working_status == svn_wc__db_status_deleted)
reason = svn_wc_conflict_reason_deleted;
else
reason = svn_wc_conflict_reason_edited;
@@ -1711,7 +1607,8 @@ delete_entry(const char *path,
const char *base = svn_relpath_basename(path, NULL);
const char *local_abspath;
const char *repos_relpath;
- svn_node_kind_t kind, base_kind;
+ const char *deleted_repos_relpath;
+ svn_node_kind_t kind;
svn_revnum_t old_revision;
svn_boolean_t conflicted;
svn_boolean_t have_work;
@@ -1721,8 +1618,6 @@ delete_entry(const char *path,
apr_pool_t *scratch_pool;
svn_boolean_t deleting_target;
svn_boolean_t deleting_switched;
- svn_boolean_t keep_as_working = FALSE;
- svn_boolean_t queue_deletes = TRUE;
if (pb->skip_this)
return SVN_NO_ERROR;
@@ -1740,6 +1635,7 @@ delete_entry(const char *path,
{
svn_boolean_t is_root;
+
SVN_ERR(svn_wc__db_is_wcroot(&is_root, eb->db, local_abspath,
scratch_pool));
@@ -1767,10 +1663,9 @@ delete_entry(const char *path,
if (!have_work)
{
base_status = status;
- base_kind = kind;
}
else
- SVN_ERR(svn_wc__db_base_get_info(&base_status, &base_kind, &old_revision,
+ SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &old_revision,
&repos_relpath,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
@@ -1815,11 +1710,9 @@ delete_entry(const char *path,
|| base_status == svn_wc__db_status_excluded
|| base_status == svn_wc__db_status_server_excluded)
{
- SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath,
- FALSE /* keep_as_working */,
- FALSE /* queue_deletes */,
- FALSE /* remove_locks */,
- SVN_INVALID_REVNUM /* not_present_rev */,
+ SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath, TRUE,
+ deleting_target, FALSE,
+ *eb->target_revision,
NULL, NULL,
scratch_pool));
@@ -1842,18 +1735,13 @@ delete_entry(const char *path,
{
SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
status, TRUE,
- (kind == svn_node_dir)
- ? svn_node_dir
- : svn_node_file,
+ kind,
svn_wc_conflict_action_delete,
pb->pool, scratch_pool));
}
- else
- queue_deletes = FALSE; /* There is no in-wc representation */
if (tree_conflict != NULL)
{
- svn_wc_conflict_reason_t reason;
/* When we raise a tree conflict on a node, we don't want to mark the
* node as skipped, to allow a replacement to continue doing at least
* a bit of its work (possibly adding a not present node, for the
@@ -1864,45 +1752,19 @@ delete_entry(const char *path,
svn_hash_sets(pb->deletion_conflicts, apr_pstrdup(pb->pool, base),
tree_conflict);
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, NULL,
- eb->db, local_abspath,
- tree_conflict,
- scratch_pool, scratch_pool));
-
- if (reason == svn_wc_conflict_reason_edited
- || reason == svn_wc_conflict_reason_obstructed)
- {
- /* The item exists locally and has some sort of local mod.
- * It no longer exists in the repository at its target URL@REV.
- *
- * To prepare the "accept mine" resolution for the tree conflict,
- * we must schedule the existing content for re-addition as a copy
- * of what it was, but with its local modifications preserved. */
- keep_as_working = TRUE;
-
- /* Fall through to remove the BASE_NODEs properly, with potentially
- keeping a not-present marker */
- }
- else if (reason == svn_wc_conflict_reason_deleted
- || reason == svn_wc_conflict_reason_moved_away
- || reason == svn_wc_conflict_reason_replaced)
- {
- /* The item does not exist locally because it was already shadowed.
- * We must complete the deletion, leaving the tree conflict info
- * as the only difference from a normal deletion. */
-
- /* Fall through to the normal "delete" code path. */
- }
- else
- SVN_ERR_MALFUNCTION(); /* other reasons are not expected here */
+ /* Whatever the kind of conflict, we can just clear BASE
+ by turning whatever is there into a copy */
}
+ /* Calculate the repository-relative path of the entry which was
+ * deleted. For updates it's the same as REPOS_RELPATH but for
+ * switches it is within the switch target. */
+ SVN_ERR(calculate_repos_relpath(&deleted_repos_relpath, local_abspath,
+ repos_relpath, eb, pb, scratch_pool,
+ scratch_pool));
SVN_ERR(complete_conflict(tree_conflict, eb, local_abspath, repos_relpath,
- old_revision, NULL,
- (kind == svn_node_dir)
- ? svn_node_dir
- : svn_node_file,
- svn_node_none,
+ old_revision, deleted_repos_relpath,
+ kind, svn_node_none, NULL,
pb->pool, scratch_pool));
/* Issue a wq operation to delete the BASE_NODE data and to delete actual
@@ -1917,7 +1779,8 @@ delete_entry(const char *path,
{
/* Delete, and do not leave a not-present node. */
SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath,
- keep_as_working, queue_deletes, FALSE,
+ (tree_conflict != NULL),
+ FALSE, FALSE,
SVN_INVALID_REVNUM /* not_present_rev */,
tree_conflict, NULL,
scratch_pool));
@@ -1926,7 +1789,8 @@ delete_entry(const char *path,
{
/* Delete, leaving a not-present node. */
SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath,
- keep_as_working, queue_deletes, FALSE,
+ (tree_conflict != NULL),
+ TRUE, FALSE,
*eb->target_revision,
tree_conflict, NULL,
scratch_pool));
@@ -1948,6 +1812,7 @@ delete_entry(const char *path,
{
if (eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, local_abspath,
+ kind,
tree_conflict,
NULL /* merge_options */,
eb->conflict_func,
@@ -1955,23 +1820,17 @@ delete_entry(const char *path,
eb->cancel_func,
eb->cancel_baton,
scratch_pool));
- do_notification(eb, local_abspath, svn_node_unknown,
+ do_notification(eb, local_abspath, kind,
svn_wc_notify_tree_conflict, scratch_pool);
}
else
{
svn_wc_notify_action_t action = svn_wc_notify_update_delete;
- svn_node_kind_t node_kind;
if (pb->shadowed || pb->edit_obstructed)
action = svn_wc_notify_update_shadowed_delete;
- if (kind == svn_node_dir)
- node_kind = svn_node_dir;
- else
- node_kind = svn_node_file;
-
- do_notification(eb, local_abspath, node_kind, action, scratch_pool);
+ do_notification(eb, local_abspath, kind, action, scratch_pool);
}
svn_pool_destroy(scratch_pool);
@@ -1991,6 +1850,7 @@ add_directory(const char *path,
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
struct dir_baton *db;
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
svn_node_kind_t kind;
svn_wc__db_status_t status;
svn_node_kind_t wc_kind;
@@ -2008,6 +1868,9 @@ add_directory(const char *path,
if (db->skip_this)
return SVN_NO_ERROR;
+ SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
+ NULL, eb, pb, db->pool, scratch_pool));
+
SVN_ERR(mark_directory_edited(db, pool));
if (strcmp(eb->target_abspath, db->local_abspath) == 0)
@@ -2037,13 +1900,26 @@ add_directory(const char *path,
"administrative directory"),
svn_dirent_local_style(db->local_abspath, pool));
- SVN_ERR(svn_io_check_path(db->local_abspath, &kind, db->pool));
+ if (!eb->clean_checkout)
+ {
+ SVN_ERR(svn_io_check_path(db->local_abspath, &kind, db->pool));
+
+ err = svn_wc__db_read_info(&status, &wc_kind, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ &conflicted, NULL, NULL, NULL, NULL, NULL, NULL,
+ eb->db, db->local_abspath,
+ scratch_pool, scratch_pool);
+ }
+ else
+ {
+ kind = svn_node_none;
+ status = svn_wc__db_status_not_present;
+ wc_kind = svn_node_unknown;
+ conflicted = FALSE;
+ err = NULL;
+ }
- err = svn_wc__db_read_info(&status, &wc_kind, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- &conflicted, NULL, NULL, NULL, NULL, NULL, NULL,
- eb->db, db->local_abspath, db->pool, db->pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
@@ -2056,63 +1932,68 @@ add_directory(const char *path,
versioned_locally_and_present = FALSE;
}
- else if (wc_kind == svn_node_dir
- && status == svn_wc__db_status_normal)
+ else if (status == svn_wc__db_status_normal && wc_kind == svn_node_unknown)
{
- /* !! We found the root of a separate working copy obstructing the wc !!
-
- If the directory would be part of our own working copy then
- we wouldn't have been called as an add_directory().
-
- The only thing we can do is add a not-present node, to allow
- a future update to bring in the new files when the problem is
- resolved. Note that svn_wc__db_base_add_not_present_node()
- explicitly adds the node into the parent's node database. */
-
- SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, db->local_abspath,
- db->new_relpath,
- eb->repos_root,
- eb->repos_uuid,
- *eb->target_revision,
- svn_node_file,
- NULL, NULL,
- pool));
-
- SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
- db->skip_this = TRUE;
- db->already_notified = TRUE;
-
- do_notification(eb, db->local_abspath, svn_node_dir,
- svn_wc_notify_update_skip_obstruction, pool);
-
- return SVN_NO_ERROR;
+ SVN_ERR_ASSERT(conflicted);
+ versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
}
else if (status == svn_wc__db_status_normal
- && (wc_kind == svn_node_file
- || wc_kind == svn_node_symlink))
+ || status == svn_wc__db_status_incomplete)
{
- /* We found a file external occupating the place we need in BASE.
+ svn_boolean_t root;
- We can't add a not-present node in this case as that would overwrite
- the file external. Luckily the file external itself stops us from
- forgetting a child of this parent directory like an obstructing
- working copy would.
+ SVN_ERR(svn_wc__db_is_wcroot(&root, eb->db, db->local_abspath,
+ scratch_pool));
- The reason we get here is that the adm crawler doesn't report
- file externals.
- */
+ if (root)
+ {
+ /* !! We found the root of a working copy obstructing the wc !!
- SVN_ERR(remember_skipped_tree(eb, db->local_abspath, pool));
+ If the directory would be part of our own working copy then
+ we wouldn't have been called as an add_directory().
+
+ The only thing we can do is add a not-present node, to allow
+ a future update to bring in the new files when the problem is
+ resolved. Note that svn_wc__db_base_add_not_present_node()
+ explicitly adds the node into the parent's node database. */
+
+ svn_hash_sets(pb->not_present_nodes,
+ apr_pstrdup(pb->pool, db->name),
+ svn_node_kind_to_word(svn_node_dir));
+ }
+ else if (wc_kind == svn_node_dir)
+ {
+ /* We have an editor violation. Github sometimes does this
+ in its subversion compatibility code, when changing the
+ depth of a working copy, or on updates from incomplete */
+ }
+ else
+ {
+ /* We found a file external occupating the place we need in BASE.
+
+ We can't add a not-present node in this case as that would overwrite
+ the file external. Luckily the file external itself stops us from
+ forgetting a child of this parent directory like an obstructing
+ working copy would.
+
+ The reason we get here is that the adm crawler doesn't report
+ file externals.
+ */
+ SVN_ERR_ASSERT(wc_kind == svn_node_file
+ || wc_kind == svn_node_symlink);
+ }
+
+ SVN_ERR(remember_skipped_tree(eb, db->local_abspath, scratch_pool));
db->skip_this = TRUE;
db->already_notified = TRUE;
- do_notification(eb, db->local_abspath, svn_node_file,
- svn_wc_notify_update_skip_obstruction, pool);
+ do_notification(eb, db->local_abspath, wc_kind,
+ svn_wc_notify_update_skip_obstruction, scratch_pool);
+
+ svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
- else if (wc_kind == svn_node_unknown)
- versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
else
versioned_locally_and_present = IS_NODE_PRESENT(status);
@@ -2134,7 +2015,7 @@ add_directory(const char *path,
eb->db,
db->local_abspath,
tree_conflict,
- db->pool, db->pool));
+ db->pool, scratch_pool));
tree_conflict = svn_wc__conflict_skel_create(db->pool);
@@ -2143,7 +2024,7 @@ add_directory(const char *path,
eb->db, db->local_abspath,
reason, svn_wc_conflict_action_replace,
move_src_op_root_abspath,
- db->pool, db->pool));
+ db->pool, scratch_pool));
/* And now stop checking for conflicts here and just perform
a shadowed update */
@@ -2154,7 +2035,8 @@ add_directory(const char *path,
}
else
SVN_ERR(node_already_conflicted(&conflicted, &conflict_ignored,
- eb->db, db->local_abspath, pool));
+ eb->db, db->local_abspath,
+ scratch_pool));
}
/* Now the "usual" behaviour if already conflicted. Skip it. */
@@ -2177,18 +2059,13 @@ add_directory(const char *path,
Note that we can safely assume that no present base node exists,
because then we would not have received an add_directory.
*/
- SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, db->local_abspath,
- db->new_relpath,
- eb->repos_root,
- eb->repos_uuid,
- *eb->target_revision,
- svn_node_dir,
- NULL, NULL,
- pool));
+ svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, db->name),
+ svn_node_kind_to_word(svn_node_dir));
- /* ### TODO: Also print victim_path in the skip msg. */
do_notification(eb, db->local_abspath, svn_node_dir,
- svn_wc_notify_skip_conflicted, pool);
+ svn_wc_notify_skip_conflicted, scratch_pool);
+
+ svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
else if (conflict_ignored)
@@ -2221,7 +2098,7 @@ add_directory(const char *path,
SVN_ERR(svn_wc__db_scan_addition(&add_status, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
eb->db, db->local_abspath,
- pool, pool));
+ scratch_pool, scratch_pool));
/* Is there *something* that is not a dir? */
@@ -2244,7 +2121,7 @@ add_directory(const char *path,
db->local_abspath,
status, FALSE, svn_node_none,
svn_wc_conflict_action_add,
- pool, pool));
+ db->pool, scratch_pool));
}
if (tree_conflict == NULL)
@@ -2272,7 +2149,7 @@ add_directory(const char *path,
eb->db, db->local_abspath,
svn_wc_conflict_reason_unversioned,
svn_wc_conflict_action_add, NULL,
- db->pool, pool));
+ db->pool, scratch_pool));
db->edit_conflict = tree_conflict;
}
}
@@ -2280,14 +2157,17 @@ add_directory(const char *path,
if (tree_conflict)
SVN_ERR(complete_conflict(tree_conflict, eb, db->local_abspath,
db->old_repos_relpath, db->old_revision,
- db->new_relpath,
- wc_kind,
- svn_node_dir,
- db->pool, pool));
+ db->new_repos_relpath,
+ wc_kind, svn_node_dir,
+ pb->deletion_conflicts
+ ? svn_hash_gets(pb->deletion_conflicts,
+ db->name)
+ : NULL,
+ db->pool, scratch_pool));
SVN_ERR(svn_wc__db_base_add_incomplete_directory(
eb->db, db->local_abspath,
- db->new_relpath,
+ db->new_repos_relpath,
eb->repos_root,
eb->repos_uuid,
*eb->target_revision,
@@ -2296,28 +2176,20 @@ add_directory(const char *path,
(! db->shadowed
&& status == svn_wc__db_status_added),
tree_conflict, NULL,
- pool));
+ scratch_pool));
/* Make sure there is a real directory at LOCAL_ABSPATH, unless we are just
updating the DB */
if (!db->shadowed)
- SVN_ERR(svn_wc__ensure_directory(db->local_abspath, pool));
+ SVN_ERR(svn_wc__ensure_directory(db->local_abspath, scratch_pool));
if (tree_conflict != NULL)
{
- if (eb->conflict_func)
- SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, db->local_abspath,
- tree_conflict,
- NULL /* merge_options */,
- eb->conflict_func,
- eb->conflict_baton,
- eb->cancel_func,
- eb->cancel_baton,
- pool));
+ db->edit_conflict = tree_conflict;
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_dir,
- svn_wc_notify_tree_conflict, pool);
+ svn_wc_notify_tree_conflict, scratch_pool);
}
@@ -2339,9 +2211,12 @@ add_directory(const char *path,
db->already_notified = TRUE;
- do_notification(eb, db->local_abspath, svn_node_dir, action, pool);
+ do_notification(eb, db->local_abspath, svn_node_dir, action,
+ scratch_pool);
}
+ svn_pool_destroy(scratch_pool);
+
return SVN_NO_ERROR;
}
@@ -2416,6 +2291,10 @@ open_directory(const char *path,
db->was_incomplete = (base_status == svn_wc__db_status_incomplete);
+ SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
+ db->old_repos_relpath, eb, pb,
+ db->pool, pool));
+
/* Is this path a conflict victim? */
if (db->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
@@ -2475,7 +2354,7 @@ open_directory(const char *path,
/* Mark directory as being at target_revision and URL, but incomplete. */
SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, db->local_abspath,
- db->new_relpath,
+ db->new_repos_relpath,
*eb->target_revision,
pool));
@@ -2498,7 +2377,7 @@ change_dir_prop(void *dir_baton,
propchange = apr_array_push(db->propchanges);
propchange->name = apr_pstrdup(db->pool, name);
- propchange->value = value ? svn_string_dup(value, db->pool) : NULL;
+ propchange->value = svn_string_dup(value, db->pool);
if (!db->edited && svn_property_kind2(name) == svn_prop_regular_kind)
SVN_ERR(mark_directory_edited(db, pool));
@@ -2619,7 +2498,7 @@ close_directory(void *dir_baton,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
+ const char *propname = apr_hash_this_key(hi);
svn_prop_t *prop = apr_array_push(regular_prop_changes);
/* Record a deletion for PROPNAME. */
@@ -2702,7 +2581,8 @@ close_directory(void *dir_baton,
/* Check if we should add some not-present markers before marking the
directory complete (Issue #3569) */
{
- apr_hash_t *new_children = svn_hash_gets(eb->dir_dirents, db->new_relpath);
+ apr_hash_t *new_children = svn_hash_gets(eb->dir_dirents,
+ db->new_repos_relpath);
if (new_children != NULL)
{
@@ -2723,11 +2603,11 @@ close_directory(void *dir_baton,
svn_pool_clear(iterpool);
- child_name = svn__apr_hash_index_key(hi);
+ child_name = apr_hash_this_key(hi);
child_abspath = svn_dirent_join(db->local_abspath, child_name,
iterpool);
- dirent = svn__apr_hash_index_val(hi);
+ dirent = apr_hash_this_val(hi);
child_kind = (dirent->kind == svn_node_dir)
? svn_node_dir
: svn_node_file;
@@ -2758,7 +2638,7 @@ close_directory(void *dir_baton,
svn_error_clear(err);
- child_relpath = svn_relpath_join(db->new_relpath, child_name,
+ child_relpath = svn_relpath_join(db->new_repos_relpath, child_name,
iterpool);
SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db,
@@ -2776,7 +2656,7 @@ close_directory(void *dir_baton,
}
}
- if (apr_hash_count(db->not_present_files))
+ if (apr_hash_count(db->not_present_nodes))
{
apr_hash_index_t *hi;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
@@ -2786,17 +2666,18 @@ close_directory(void *dir_baton,
transaction, but I can't even trigger it. I've tried
ra_local, ra_svn, ra_neon, ra_serf and they all call
close_file before close_dir. */
- for (hi = apr_hash_first(scratch_pool, db->not_present_files);
+ for (hi = apr_hash_first(scratch_pool, db->not_present_nodes);
hi;
hi = apr_hash_next(hi))
{
- const char *child = svn__apr_hash_index_key(hi);
+ const char *child = apr_hash_this_key(hi);
const char *child_abspath, *child_relpath;
+ svn_node_kind_t kind = svn_node_kind_from_word(apr_hash_this_val(hi));
svn_pool_clear(iterpool);
child_abspath = svn_dirent_join(db->local_abspath, child, iterpool);
- child_relpath = svn_dirent_join(db->new_relpath, child, iterpool);
+ child_relpath = svn_dirent_join(db->new_repos_relpath, child, iterpool);
SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db,
child_abspath,
@@ -2804,7 +2685,7 @@ close_directory(void *dir_baton,
eb->repos_root,
eb->repos_uuid,
*eb->target_revision,
- svn_node_file,
+ kind,
NULL, NULL,
iterpool));
}
@@ -2872,8 +2753,14 @@ close_directory(void *dir_baton,
db->local_abspath,
db->old_repos_relpath,
db->old_revision,
- db->new_relpath,
+ db->new_repos_relpath,
svn_node_dir, svn_node_dir,
+ (db->parent_baton
+ && db->parent_baton->deletion_conflicts)
+ ? svn_hash_gets(
+ db->parent_baton->deletion_conflicts,
+ db->name)
+ : NULL,
db->pool, scratch_pool));
SVN_ERR(svn_wc__conflict_create_markers(&work_item,
@@ -2904,7 +2791,7 @@ close_directory(void *dir_baton,
SVN_ERR(svn_wc__db_base_add_directory(
eb->db, db->local_abspath,
eb->wcroot_abspath,
- db->new_relpath,
+ db->new_repos_relpath,
eb->repos_root, eb->repos_uuid,
*eb->target_revision,
props,
@@ -2914,10 +2801,9 @@ close_directory(void *dir_baton,
(dav_prop_changes->nelts > 0)
? svn_prop_array_to_hash(dav_prop_changes, pool)
: NULL,
- conflict_skel,
(! db->shadowed) && new_base_props != NULL,
- new_actual_props,
- iprops, all_work_items,
+ new_actual_props, iprops,
+ conflict_skel, all_work_items,
scratch_pool));
}
@@ -2926,8 +2812,12 @@ close_directory(void *dir_baton,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
+ if (db->parent_baton)
+ svn_hash_sets(db->parent_baton->not_present_nodes, db->name, NULL);
+
if (conflict_skel && eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, db->local_abspath,
+ svn_node_dir,
conflict_skel,
NULL /* merge_options */,
eb->conflict_func,
@@ -2962,6 +2852,9 @@ close_directory(void *dir_baton,
eb->notify_func(eb->notify_baton, notify, scratch_pool);
}
+ if (db->edited)
+ eb->edited = db->edited;
+
/* We're done with this directory, so remove one reference from the
bump information. */
SVN_ERR(maybe_release_dir_info(db));
@@ -2985,14 +2878,12 @@ absent_node(const char *path,
svn_error_t *err;
svn_wc__db_status_t status;
svn_node_kind_t kind;
+ svn_skel_t *tree_conflict = NULL;
if (pb->skip_this)
return SVN_NO_ERROR;
- SVN_ERR(mark_directory_edited(pb, scratch_pool));
-
local_abspath = svn_dirent_join(pb->local_abspath, name, scratch_pool);
-
/* If an item by this name is scheduled for addition that's a
genuine tree-conflict. */
err = svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
@@ -3012,6 +2903,10 @@ absent_node(const char *path,
kind = svn_node_unknown;
}
+ if (status != svn_wc__db_status_server_excluded)
+ SVN_ERR(mark_directory_edited(pb, scratch_pool));
+ /* Else fall through as we should update the revision anyway */
+
if (status == svn_wc__db_status_normal)
{
svn_boolean_t wcroot;
@@ -3035,31 +2930,53 @@ absent_node(const char *path,
}
else
{
- /* The server asks us to replace a file external
- (Existing BASE node; not reported by the working copy crawler or
- there would have been a delete_entry() call.
-
- There is no way we can store this state in the working copy as
- the BASE layer is already filled.
+ svn_boolean_t file_external;
+ svn_revnum_t revnum;
- We could error out, but that is not helping anybody; the user is not
- even seeing with what the file external would be replaced, so let's
- report a skip and continue the update.
- */
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, &revnum, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ &file_external,
+ eb->db, local_abspath,
+ scratch_pool, scratch_pool));
- if (eb->notify_func)
+ if (file_external)
{
- svn_wc_notify_t *notify;
- notify = svn_wc_create_notify(
+ /* The server asks us to replace a file external
+ (Existing BASE node; not reported by the working copy crawler
+ or there would have been a delete_entry() call.
+
+ There is no way we can store this state in the working copy as
+ the BASE layer is already filled.
+ We could error out, but that is not helping anybody; the user is not
+ even seeing with what the file external would be replaced, so let's
+ report a skip and continue the update.
+ */
+
+ if (eb->notify_func)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify(
local_abspath,
svn_wc_notify_update_skip_obstruction,
scratch_pool);
- eb->notify_func(eb->notify_baton, notify, scratch_pool);
+ eb->notify_func(eb->notify_baton, notify, scratch_pool);
+ }
+
+ svn_pool_destroy(scratch_pool);
+ return SVN_NO_ERROR;
}
+ else
+ {
+ /* We have a normal local node that will now be hidden for the
+ user. Let's try to delete what is there. This may introduce
+ tree conflicts if there are local changes */
+ SVN_ERR(delete_entry(path, revnum, pb, scratch_pool));
- svn_pool_destroy(scratch_pool);
- return SVN_NO_ERROR;
+ /* delete_entry() promises that BASE is empty after the operation,
+ so we can just fall through now */
+ }
}
}
else if (status == svn_wc__db_status_not_present
@@ -3073,24 +2990,26 @@ absent_node(const char *path,
{
/* We have a local addition. If this would be a BASE node it would have
been deleted before we get here. (Which might have turned it into
- a copy).
-
- ### This should be recorded as a tree conflict and the update
- ### can just continue, as we can just record the absent status
- ### in BASE.
- */
+ a copy). */
SVN_ERR_ASSERT(status != svn_wc__db_status_normal);
- return svn_error_createf(
- SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
- _("Failed to mark '%s' absent: item of the same name is already "
- "scheduled for addition"),
- svn_dirent_local_style(local_abspath, pool));
+ if (!pb->shadowed && !pb->edit_obstructed)
+ SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
+ status, FALSE, svn_node_unknown,
+ svn_wc_conflict_action_add,
+ scratch_pool, scratch_pool));
+
}
{
const char *repos_relpath;
- repos_relpath = svn_relpath_join(pb->new_relpath, name, scratch_pool);
+ repos_relpath = svn_relpath_join(pb->new_repos_relpath, name, scratch_pool);
+
+ if (tree_conflict)
+ SVN_ERR(complete_conflict(tree_conflict, eb, local_abspath,
+ NULL, SVN_INVALID_REVNUM, repos_relpath,
+ kind, svn_node_unknown, NULL,
+ scratch_pool, scratch_pool));
/* Insert an excluded node below the parent node to note that this child
is absent. (This puts it in the parent db if the child is obstructed) */
@@ -3100,8 +3019,24 @@ absent_node(const char *path,
*(eb->target_revision),
absent_kind,
svn_wc__db_status_server_excluded,
- NULL, NULL,
+ tree_conflict, NULL,
scratch_pool));
+
+ if (tree_conflict)
+ {
+ if (eb->conflict_func)
+ SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, local_abspath,
+ kind,
+ tree_conflict,
+ NULL /* merge_options */,
+ eb->conflict_func,
+ eb->conflict_baton,
+ eb->cancel_func,
+ eb->cancel_baton,
+ scratch_pool));
+ do_notification(eb, local_abspath, kind, svn_wc_notify_tree_conflict,
+ scratch_pool);
+ }
}
svn_pool_destroy(scratch_pool);
@@ -3142,13 +3077,13 @@ add_file(const char *path,
struct dir_baton *pb = parent_baton;
struct edit_baton *eb = pb->edit_baton;
struct file_baton *fb;
- svn_node_kind_t kind = svn_node_none;
- svn_node_kind_t wc_kind = svn_node_unknown;
- svn_wc__db_status_t status = svn_wc__db_status_normal;
+ svn_node_kind_t kind;
+ svn_node_kind_t wc_kind;
+ svn_wc__db_status_t status;
apr_pool_t *scratch_pool;
- svn_boolean_t conflicted = FALSE;
+ svn_boolean_t conflicted;
svn_boolean_t conflict_ignored = FALSE;
- svn_boolean_t versioned_locally_and_present = FALSE;
+ svn_boolean_t versioned_locally_and_present;
svn_skel_t *tree_conflict = NULL;
svn_error_t *err = SVN_NO_ERROR;
@@ -3160,6 +3095,8 @@ add_file(const char *path,
if (fb->skip_this)
return SVN_NO_ERROR;
+ SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
+ NULL, eb, pb, fb->pool, pool));
SVN_ERR(mark_file_edited(fb, pool));
/* The file_pool can stick around for a *long* time, so we want to
@@ -3186,6 +3123,13 @@ add_file(const char *path,
eb->db, fb->local_abspath,
scratch_pool, scratch_pool);
}
+ else
+ {
+ kind = svn_node_none;
+ status = svn_wc__db_status_not_present;
+ wc_kind = svn_node_unknown;
+ conflicted = FALSE;
+ }
if (err)
{
@@ -3198,58 +3142,68 @@ add_file(const char *path,
versioned_locally_and_present = FALSE;
}
- else if (wc_kind == svn_node_dir
- && status == svn_wc__db_status_normal)
+ else if (status == svn_wc__db_status_normal && wc_kind == svn_node_unknown)
{
- /* !! We found the root of a separate working copy obstructing the wc !!
+ SVN_ERR_ASSERT(conflicted);
+ versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
+ }
+ else if (status == svn_wc__db_status_normal
+ || status == svn_wc__db_status_incomplete)
+ {
+ svn_boolean_t root;
- If the directory would be part of our own working copy then
- we wouldn't have been called as an add_file().
+ SVN_ERR(svn_wc__db_is_wcroot(&root, eb->db, fb->local_abspath,
+ scratch_pool));
- The only thing we can do is add a not-present node, to allow
- a future update to bring in the new files when the problem is
- resolved. */
- svn_hash_sets(pb->not_present_files, apr_pstrdup(pb->pool, fb->name),
- (void *)1);
+ if (root)
+ {
+ /* !! We found the root of a working copy obstructing the wc !!
- SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
- fb->skip_this = TRUE;
- fb->already_notified = TRUE;
+ If the directory would be part of our own working copy then
+ we wouldn't have been called as an add_directory().
- do_notification(eb, fb->local_abspath, svn_node_file,
- svn_wc_notify_update_skip_obstruction, scratch_pool);
+ The only thing we can do is add a not-present node, to allow
+ a future update to bring in the new files when the problem is
+ resolved. Note that svn_wc__db_base_add_not_present_node()
+ explicitly adds the node into the parent's node database. */
- svn_pool_destroy(scratch_pool);
+ svn_hash_sets(pb->not_present_nodes,
+ apr_pstrdup(pb->pool, fb->name),
+ svn_node_kind_to_word(svn_node_dir));
+ }
+ else if (wc_kind == svn_node_dir)
+ {
+ /* We have an editor violation. Github sometimes does this
+ in its subversion compatibility code, when changing the
+ depth of a working copy, or on updates from incomplete */
+ }
+ else
+ {
+ /* We found a file external occupating the place we need in BASE.
- return SVN_NO_ERROR;
- }
- else if (status == svn_wc__db_status_normal
- && (wc_kind == svn_node_file
- || wc_kind == svn_node_symlink))
- {
- /* We found a file external occupating the place we need in BASE.
+ We can't add a not-present node in this case as that would overwrite
+ the file external. Luckily the file external itself stops us from
+ forgetting a child of this parent directory like an obstructing
+ working copy would.
- We can't add a not-present node in this case as that would overwrite
- the file external. Luckily the file external itself stops us from
- forgetting a child of this parent directory like an obstructing
- working copy would.
+ The reason we get here is that the adm crawler doesn't report
+ file externals.
+ */
+ SVN_ERR_ASSERT(wc_kind == svn_node_file
+ || wc_kind == svn_node_symlink);
+ }
- The reason we get here is that the adm crawler doesn't report
- file externals.
- */
SVN_ERR(remember_skipped_tree(eb, fb->local_abspath, pool));
fb->skip_this = TRUE;
fb->already_notified = TRUE;
- do_notification(eb, fb->local_abspath, svn_node_file,
+ do_notification(eb, fb->local_abspath, wc_kind,
svn_wc_notify_update_skip_obstruction, scratch_pool);
svn_pool_destroy(scratch_pool);
return SVN_NO_ERROR;
}
- else if (wc_kind == svn_node_unknown)
- versioned_locally_and_present = FALSE; /* Tree conflict ACTUAL-only node */
else
versioned_locally_and_present = IS_NODE_PRESENT(status);
@@ -3274,7 +3228,7 @@ add_file(const char *path,
eb->db,
fb->local_abspath,
tree_conflict,
- fb->pool, fb->pool));
+ fb->pool, scratch_pool));
tree_conflict = svn_wc__conflict_skel_create(fb->pool);
@@ -3283,7 +3237,7 @@ add_file(const char *path,
eb->db, fb->local_abspath,
reason, svn_wc_conflict_action_replace,
move_src_op_root_abspath,
- fb->pool, fb->pool));
+ fb->pool, scratch_pool));
/* And now stop checking for conflicts here and just perform
a shadowed update */
@@ -3316,10 +3270,10 @@ add_file(const char *path,
Note that we can safely assume that no present base node exists,
because then we would not have received an add_file.
*/
- svn_hash_sets(pb->not_present_files, apr_pstrdup(pb->pool, fb->name),
- (void *)1);
+ svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, fb->name),
+ svn_node_kind_to_word(svn_node_file));
- do_notification(eb, fb->local_abspath, svn_node_unknown,
+ do_notification(eb, fb->local_abspath, svn_node_file,
svn_wc_notify_skip_conflicted, scratch_pool);
svn_pool_destroy(scratch_pool);
@@ -3380,7 +3334,7 @@ add_file(const char *path,
fb->local_abspath,
status, FALSE, svn_node_none,
svn_wc_conflict_action_add,
- scratch_pool, scratch_pool));
+ fb->pool, scratch_pool));
}
if (tree_conflict == NULL)
@@ -3421,8 +3375,8 @@ add_file(const char *path,
|| *eb->target_basename == '\0'
|| (strcmp(fb->local_abspath, eb->target_abspath) != 0))
{
- svn_hash_sets(pb->not_present_files, apr_pstrdup(pb->pool, fb->name),
- (void *)1);
+ svn_hash_sets(pb->not_present_nodes, apr_pstrdup(pb->pool, fb->name),
+ svn_node_kind_to_word(svn_node_file));
}
if (tree_conflict != NULL)
@@ -3432,9 +3386,12 @@ add_file(const char *path,
fb->local_abspath,
fb->old_repos_relpath,
fb->old_revision,
- fb->new_relpath,
- wc_kind,
- svn_node_file,
+ fb->new_repos_relpath,
+ wc_kind, svn_node_file,
+ pb->deletion_conflicts
+ ? svn_hash_gets(pb->deletion_conflicts,
+ fb->name)
+ : NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__db_op_mark_conflict(eb->db,
@@ -3442,15 +3399,7 @@ add_file(const char *path,
tree_conflict, NULL,
scratch_pool));
- if (eb->conflict_func)
- SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, fb->local_abspath,
- tree_conflict,
- NULL /* merge_options */,
- eb->conflict_func,
- eb->conflict_baton,
- eb->cancel_func,
- eb->cancel_baton,
- scratch_pool));
+ fb->edit_conflict = tree_conflict;
fb->already_notified = TRUE;
do_notification(eb, fb->local_abspath, svn_node_file,
@@ -3514,7 +3463,6 @@ open_file(const char *path,
/* Sanity check. */
- /* If replacing, make sure the .svn entry already exists. */
SVN_ERR(svn_wc__db_read_info(&status, &wc_kind, &fb->old_revision,
&fb->old_repos_relpath, NULL, NULL,
&fb->changed_rev, &fb->changed_date,
@@ -3536,6 +3484,10 @@ open_file(const char *path,
eb->db, fb->local_abspath,
fb->pool, scratch_pool));
+ SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
+ fb->old_repos_relpath, eb, pb,
+ fb->pool, scratch_pool));
+
/* Is this path a conflict victim? */
if (fb->shadowed)
conflicted = FALSE; /* Conflict applies to WORKING */
@@ -3615,12 +3567,6 @@ lazy_open_source(svn_stream_t **stream,
return SVN_NO_ERROR;
}
-struct lazy_target_baton {
- struct file_baton *fb;
- struct handler_baton *hb;
- struct edit_baton *eb;
-};
-
/* Implements svn_stream_lazyopen_func_t. */
static svn_error_t *
lazy_open_target(svn_stream_t **stream,
@@ -3628,13 +3574,23 @@ lazy_open_target(svn_stream_t **stream,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- struct lazy_target_baton *tb = baton;
-
- SVN_ERR(svn_wc__open_writable_base(stream, &tb->hb->new_text_base_tmp_abspath,
- NULL, &tb->hb->new_text_base_sha1_checksum,
- tb->fb->edit_baton->db,
- tb->eb->wcroot_abspath,
- result_pool, scratch_pool));
+ struct handler_baton *hb = baton;
+ svn_wc__db_install_data_t *install_data;
+
+ /* By convention return value is undefined on error, but we rely
+ on HB->INSTALL_DATA value in window_handler() and abort
+ INSTALL_STREAM if is not NULL on error.
+ So we store INSTALL_DATA to local variable first, to leave
+ HB->INSTALL_DATA unchanged on error. */
+ SVN_ERR(svn_wc__db_pristine_prepare_install(stream,
+ &install_data,
+ &hb->new_text_base_sha1_checksum,
+ NULL,
+ hb->fb->edit_baton->db,
+ hb->fb->dir_baton->local_abspath,
+ result_pool, scratch_pool));
+
+ hb->install_data = install_data;
return SVN_NO_ERROR;
}
@@ -3654,7 +3610,6 @@ apply_textdelta(void *file_baton,
const svn_checksum_t *recorded_base_checksum;
svn_checksum_t *expected_base_checksum;
svn_stream_t *source;
- struct lazy_target_baton *tb;
svn_stream_t *target;
if (fb->skip_this)
@@ -3748,16 +3703,12 @@ apply_textdelta(void *file_baton,
hb->source_checksum_stream = source;
}
- tb = apr_palloc(handler_pool, sizeof(struct lazy_target_baton));
- tb->hb = hb;
- tb->fb = fb;
- tb->eb = eb;
- target = svn_stream_lazyopen_create(lazy_open_target, tb, TRUE, handler_pool);
+ target = svn_stream_lazyopen_create(lazy_open_target, hb, TRUE, handler_pool);
/* Prepare to apply the delta. */
svn_txdelta_apply(source, target,
hb->new_text_base_md5_digest,
- hb->new_text_base_tmp_abspath /* error_info */,
+ fb->local_abspath /* error_info */,
handler_pool,
&hb->apply_handler, &hb->apply_baton);
@@ -3788,7 +3739,7 @@ change_file_prop(void *file_baton,
/* Push a new propchange to the file baton's array of propchanges */
propchange = apr_array_push(fb->propchanges);
propchange->name = apr_pstrdup(fb->pool, name);
- propchange->value = value ? svn_string_dup(value, fb->pool) : NULL;
+ propchange->value = svn_string_dup(value, fb->pool);
if (!fb->edited && svn_property_kind2(name) == svn_prop_regular_kind)
SVN_ERR(mark_file_edited(fb, scratch_pool));
@@ -3851,9 +3802,9 @@ change_file_prop(void *file_baton,
SVN_ERR(complete_conflict(fb->edit_conflict, fb->edit_baton,
fb->local_abspath, fb->old_repos_relpath,
- fb->old_revision, fb->new_relpath,
+ fb->old_revision, fb->new_repos_relpath,
svn_node_file, svn_node_file,
- fb->pool, scratch_pool));
+ NULL, fb->pool, scratch_pool));
/* Create a copy of the existing (pre update) BASE node in WORKING,
mark a tree conflict and handle the rest of the update as
@@ -3913,13 +3864,13 @@ svn_wc__perform_file_merge(svn_skel_t **work_items,
const char *merge_left;
svn_boolean_t delete_left = FALSE;
const char *path_ext = "";
- const char *new_text_base_tmp_abspath;
+ const char *new_pristine_abspath;
enum svn_wc_merge_outcome_t merge_outcome = svn_wc_merge_unchanged;
svn_skel_t *work_item;
*work_items = NULL;
- SVN_ERR(svn_wc__db_pristine_get_path(&new_text_base_tmp_abspath,
+ SVN_ERR(svn_wc__db_pristine_get_path(&new_pristine_abspath,
db, wri_abspath, new_checksum,
scratch_pool, scratch_pool));
@@ -3972,7 +3923,7 @@ svn_wc__perform_file_merge(svn_skel_t **work_items,
&merge_outcome,
db,
merge_left,
- new_text_base_tmp_abspath,
+ new_pristine_abspath,
local_abspath,
wri_abspath,
oldrev_str, newrev_str, mine_str,
@@ -4321,11 +4272,11 @@ close_file(void *file_baton,
{
/* If we lose the lock, but not because we are switching to
another url, remove the state lock from the wc */
- if (! eb->switch_relpath
- || strcmp(fb->new_relpath, fb->old_repos_relpath) == 0)
+ if (! eb->switch_repos_relpath
+ || strcmp(fb->new_repos_relpath, fb->old_repos_relpath) == 0)
{
SVN_ERR_ASSERT(prop->value == NULL);
- SVN_ERR(svn_wc__db_lock_remove(eb->db, fb->local_abspath,
+ SVN_ERR(svn_wc__db_lock_remove(eb->db, fb->local_abspath, NULL,
scratch_pool));
lock_state = svn_wc_notify_lock_state_unlocked;
@@ -4564,8 +4515,13 @@ close_file(void *file_baton,
fb->local_abspath,
fb->old_repos_relpath,
fb->old_revision,
- fb->new_relpath,
+ fb->new_repos_relpath,
svn_node_file, svn_node_file,
+ fb->dir_baton->deletion_conflicts
+ ? svn_hash_gets(
+ fb->dir_baton->deletion_conflicts,
+ fb->name)
+ : NULL,
fb->pool, scratch_pool));
SVN_ERR(svn_wc__conflict_create_markers(&work_item,
@@ -4593,7 +4549,7 @@ close_file(void *file_baton,
SVN_ERR(svn_wc__db_base_add_file(eb->db, fb->local_abspath,
eb->wcroot_abspath,
- fb->new_relpath,
+ fb->new_repos_relpath,
eb->repos_root, eb->repos_uuid,
*eb->target_revision,
new_base_props,
@@ -4618,6 +4574,7 @@ close_file(void *file_baton,
if (conflict_skel && eb->conflict_func)
SVN_ERR(svn_wc__conflict_invoke_resolver(eb->db, fb->local_abspath,
+ svn_node_file,
conflict_skel,
NULL /* merge_options */,
eb->conflict_func,
@@ -4628,7 +4585,7 @@ close_file(void *file_baton,
/* Deal with the WORKING tree, based on updates to the BASE tree. */
- svn_hash_sets(fb->dir_baton->not_present_files, fb->name, NULL);
+ svn_hash_sets(fb->dir_baton->not_present_nodes, fb->name, NULL);
/* Send a notification to the callback function. (Skip notifications
about files which were already notified for another reason.) */
@@ -4687,6 +4644,78 @@ close_file(void *file_baton,
}
+/* Implements svn_wc__proplist_receiver_t.
+ * Check for the presence of an svn:keywords property and queues an install_file
+ * work queue item if present. Thus, when the work queue is run to complete the
+ * switch operation, all files with keywords will go through the translation
+ * process so URLs etc are updated. */
+static svn_error_t *
+update_keywords_after_switch_cb(void *baton,
+ const char *local_abspath,
+ apr_hash_t *props,
+ apr_pool_t *scratch_pool)
+{
+ struct edit_baton *eb = baton;
+ svn_string_t *propval;
+ svn_boolean_t modified;
+ svn_boolean_t record_fileinfo;
+ svn_skel_t *work_items;
+ const char *install_from;
+
+ propval = svn_hash_gets(props, SVN_PROP_KEYWORDS);
+ if (!propval)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_wc__internal_file_modified_p(&modified, eb->db,
+ local_abspath, FALSE,
+ scratch_pool));
+ if (modified)
+ {
+ const char *temp_dir_abspath;
+ svn_stream_t *working_stream;
+ svn_stream_t *install_from_stream;
+
+ SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir_abspath, eb->db,
+ local_abspath, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_stream_open_readonly(&working_stream, local_abspath,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream_open_unique(&install_from_stream, &install_from,
+ temp_dir_abspath, svn_io_file_del_none,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream_copy3(working_stream, install_from_stream,
+ eb->cancel_func, eb->cancel_baton,
+ scratch_pool));
+ record_fileinfo = FALSE;
+ }
+ else
+ {
+ install_from = NULL;
+ record_fileinfo = TRUE;
+ }
+
+ SVN_ERR(svn_wc__wq_build_file_install(&work_items, eb->db, local_abspath,
+ install_from,
+ eb->use_commit_times,
+ record_fileinfo,
+ scratch_pool, scratch_pool));
+ if (install_from)
+ {
+ svn_skel_t *work_item;
+
+ SVN_ERR(svn_wc__wq_build_file_remove(&work_item, eb->db,
+ local_abspath, install_from,
+ scratch_pool, scratch_pool));
+ work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
+ }
+
+ SVN_ERR(svn_wc__db_wq_add(eb->db, local_abspath, work_items,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+
/* An svn_delta_editor_t function. */
static svn_error_t *
close_edit(void *edit_baton,
@@ -4728,12 +4757,13 @@ close_edit(void *edit_baton,
SVN_ERR(svn_wc__db_op_bump_revisions_post_update(eb->db,
eb->target_abspath,
eb->requested_depth,
- eb->switch_relpath,
+ eb->switch_repos_relpath,
eb->repos_root,
eb->repos_uuid,
*(eb->target_revision),
eb->skipped_trees,
eb->wcroot_iprops,
+ ! eb->edited,
eb->notify_func,
eb->notify_baton,
eb->pool));
@@ -4773,15 +4803,36 @@ close_edit(void *edit_baton,
If so, we should get rid of this excluded node now. */
SVN_ERR(svn_wc__db_base_remove(eb->db, eb->target_abspath,
- FALSE /* keep_as_working */,
- FALSE /* queue_deletes */,
- FALSE /* remove_locks */,
+ TRUE, FALSE, FALSE,
SVN_INVALID_REVNUM,
NULL, NULL, scratch_pool));
}
}
}
+ /* Update keywords in switched files.
+ GOTO #1975 (the year of the Altair 8800). */
+ if (eb->switch_repos_relpath)
+ {
+ svn_depth_t depth;
+
+ if (eb->requested_depth > svn_depth_empty)
+ depth = eb->requested_depth;
+ else
+ depth = svn_depth_infinity;
+
+ SVN_ERR(svn_wc__db_read_props_streamily(eb->db,
+ eb->target_abspath,
+ depth,
+ FALSE, /* pristine */
+ NULL, /* changelists */
+ update_keywords_after_switch_cb,
+ eb,
+ eb->cancel_func,
+ eb->cancel_baton,
+ scratch_pool));
+ }
+
/* The edit is over: run the wq with proper cancel support,
but first kill the handler that would run it on the pool
cleanup at the end of this function. */
@@ -4854,9 +4905,11 @@ make_editor(svn_revnum_t *target_revision,
/* Get the anchor's repository root and uuid. The anchor must already exist
in BASE. */
- SVN_ERR(svn_wc__db_scan_base_repos(NULL, &repos_root, &repos_uuid,
- db, anchor_abspath,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, &repos_root,
+ &repos_uuid, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ db, anchor_abspath,
+ result_pool, scratch_pool));
/* With WC-NG we need a valid repository root */
SVN_ERR_ASSERT(repos_root != NULL && repos_uuid != NULL);
@@ -4884,10 +4937,10 @@ make_editor(svn_revnum_t *target_revision,
edit_pool, scratch_pool));
if (switch_url)
- eb->switch_relpath =
+ eb->switch_repos_relpath =
svn_uri_skip_ancestor(repos_root, switch_url, scratch_pool);
else
- eb->switch_relpath = NULL;
+ eb->switch_repos_relpath = NULL;
if (svn_path_is_empty(target_basename))
eb->target_abspath = eb->anchor_abspath;
@@ -4968,8 +5021,8 @@ make_editor(svn_revnum_t *target_revision,
apr_hash_t *dirents;
/* If we switch, we should look at the new relpath */
- if (eb->switch_relpath)
- dir_repos_relpath = eb->switch_relpath;
+ if (eb->switch_repos_relpath)
+ dir_repos_relpath = eb->switch_repos_relpath;
SVN_ERR(fetch_dirents_func(fetch_dirents_baton, &dirents,
repos_root, dir_repos_relpath,
@@ -5022,9 +5075,9 @@ make_editor(svn_revnum_t *target_revision,
apr_hash_t *dirents;
/* If we switch, we should look at the new relpath */
- if (eb->switch_relpath)
+ if (eb->switch_repos_relpath)
dir_repos_relpath = svn_relpath_join(
- eb->switch_relpath,
+ eb->switch_repos_relpath,
child_name, iterpool);
SVN_ERR(fetch_dirents_func(fetch_dirents_baton, &dirents,
@@ -5223,6 +5276,8 @@ svn_wc_add_repos_file4(svn_wc_context_t *wc_ctx,
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
+ svn_stream_t *tmp_base_contents;
+ svn_wc__db_install_data_t *install_data;
svn_error_t *err;
apr_pool_t *pool = scratch_pool;
@@ -5344,18 +5399,35 @@ svn_wc_add_repos_file4(svn_wc_context_t *wc_ctx,
/* Copy NEW_BASE_CONTENTS into a temporary file so our log can refer to
it, and set TMP_TEXT_BASE_ABSPATH to its path. Compute its
NEW_TEXT_BASE_MD5_CHECKSUM and NEW_TEXT_BASE_SHA1_CHECKSUM as we copy. */
- {
- svn_stream_t *tmp_base_contents;
+ if (copyfrom_url)
+ {
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&tmp_base_contents,
+ &install_data,
+ &new_text_base_sha1_checksum,
+ &new_text_base_md5_checksum,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ const char *tmp_dir_abspath;
- SVN_ERR(svn_wc__open_writable_base(&tmp_base_contents,
- &tmp_text_base_abspath,
- &new_text_base_md5_checksum,
- &new_text_base_sha1_checksum,
- wc_ctx->db, local_abspath,
- pool, pool));
- SVN_ERR(svn_stream_copy3(new_base_contents, tmp_base_contents,
- cancel_func, cancel_baton, pool));
- }
+ /* We are not installing a PRISTINE file, but we use the same code to
+ create whatever we want to install */
+
+ SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&tmp_dir_abspath,
+ db, dir_abspath,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_stream_open_unique(&tmp_base_contents, &tmp_text_base_abspath,
+ tmp_dir_abspath, svn_io_file_del_none,
+ scratch_pool, scratch_pool));
+
+ new_text_base_sha1_checksum = NULL;
+ new_text_base_md5_checksum = NULL;
+ }
+ SVN_ERR(svn_stream_copy3(new_base_contents, tmp_base_contents,
+ cancel_func, cancel_baton, pool));
/* If the caller gave us a new working file, copy it to a safe (temporary)
location and set SOURCE_ABSPATH to that path. We'll then translate/copy
@@ -5378,7 +5450,7 @@ svn_wc_add_repos_file4(svn_wc_context_t *wc_ctx,
text base. */
if (copyfrom_url != NULL)
{
- SVN_ERR(svn_wc__db_pristine_install(db, tmp_text_base_abspath,
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
new_text_base_sha1_checksum,
new_text_base_md5_checksum, pool));
}
@@ -5445,9 +5517,6 @@ svn_wc_add_repos_file4(svn_wc_context_t *wc_ctx,
}
}
- /* ### ideally, we would have a single DB operation, and queue the work
- ### items on that. for now, we'll queue them with the second call. */
-
SVN_ERR(svn_wc__db_op_copy_file(db, local_abspath,
new_base_props,
changed_rev,
diff --git a/subversion/libsvn_wc/upgrade.c b/subversion/libsvn_wc/upgrade.c
index af615fd..aebf4eb 100644
--- a/subversion/libsvn_wc/upgrade.c
+++ b/subversion/libsvn_wc/upgrade.c
@@ -37,6 +37,7 @@
#include "tree_conflicts.h"
#include "wc-queries.h" /* for STMT_* */
#include "workqueue.h"
+#include "token-map.h"
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
@@ -193,7 +194,7 @@ read_many_wcprops(apr_hash_t **all_wcprops,
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
+ const char *name = apr_hash_this_key(hi);
svn_pool_clear(iterpool);
@@ -293,15 +294,15 @@ get_versioned_subdirs(apr_array_header_t **children,
hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- const svn_wc_entry_t *entry = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ const svn_wc_entry_t *entry = apr_hash_this_val(hi);
const char *child_abspath;
svn_boolean_t hidden;
/* skip "this dir" */
if (*name == '\0')
{
- this_dir = svn__apr_hash_index_val(hi);
+ this_dir = apr_hash_this_val(hi);
continue;
}
else if (entry->kind != svn_node_dir)
@@ -400,7 +401,7 @@ build_lockfile_path(const char *local_dir_abspath,
local_dir_abspath,
svn_wc_get_adm_dir(result_pool),
ADM_LOCK,
- NULL);
+ SVN_VA_NULL);
}
@@ -612,13 +613,13 @@ ensure_repos_info(svn_wc_entry_t *entry,
for (hi = apr_hash_first(scratch_pool, repos_cache);
hi; hi = apr_hash_next(hi))
{
- if (svn_uri__is_ancestor(svn__apr_hash_index_key(hi), entry->url))
+ if (svn_uri__is_ancestor(apr_hash_this_key(hi), entry->url))
{
if (!entry->repos)
- entry->repos = svn__apr_hash_index_key(hi);
+ entry->repos = apr_hash_this_key(hi);
if (!entry->uuid)
- entry->uuid = svn__apr_hash_index_val(hi);
+ entry->uuid = apr_hash_this_val(hi);
return SVN_NO_ERROR;
}
@@ -727,8 +728,7 @@ migrate_single_tree_conflict_data(svn_sqlite__db_t *sdb,
hi;
hi = apr_hash_next(hi))
{
- const svn_wc_conflict_description2_t *conflict =
- svn__apr_hash_index_val(hi);
+ const svn_wc_conflict_description2_t *conflict = apr_hash_this_val(hi);
const char *conflict_relpath;
const char *conflict_data;
svn_sqlite__stmt_t *stmt;
@@ -755,13 +755,13 @@ migrate_single_tree_conflict_data(svn_sqlite__db_t *sdb,
{
/* There is an existing ACTUAL row, so just update it. */
SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_UPDATE_ACTUAL_CONFLICT_DATA));
+ STMT_UPDATE_ACTUAL_CONFLICT));
}
else
{
/* We need to insert an ACTUAL row with the tree conflict data. */
SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_INSERT_ACTUAL_CONFLICT_DATA));
+ STMT_INSERT_ACTUAL_CONFLICT));
}
SVN_ERR(svn_sqlite__bindf(stmt, "iss", wc_id, conflict_relpath,
@@ -825,6 +825,190 @@ migrate_tree_conflict_data(svn_sqlite__db_t *sdb, apr_pool_t *scratch_pool)
return SVN_NO_ERROR;
}
+/* ### need much more docco
+
+ ### this function should be called within a sqlite transaction. it makes
+ ### assumptions around this fact.
+
+ Apply the various sets of properties to the database nodes based on
+ their existence/presence, the current state of the node, and the original
+ format of the working copy which provided these property sets.
+*/
+static svn_error_t *
+upgrade_apply_props(svn_sqlite__db_t *sdb,
+ const char *dir_abspath,
+ const char *local_relpath,
+ apr_hash_t *base_props,
+ apr_hash_t *revert_props,
+ apr_hash_t *working_props,
+ int original_format,
+ apr_int64_t wc_id,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ int top_op_depth = -1;
+ int below_op_depth = -1;
+ svn_wc__db_status_t top_presence;
+ svn_wc__db_status_t below_presence;
+ int affected_rows;
+
+ /* ### working_props: use set_props_txn.
+ ### if working_props == NULL, then skip. what if they equal the
+ ### pristine props? we should probably do the compare here.
+ ###
+ ### base props go into WORKING_NODE if avail, otherwise BASE.
+ ###
+ ### revert only goes into BASE. (and WORKING better be there!)
+
+ Prior to 1.4.0 (ORIGINAL_FORMAT < 8), REVERT_PROPS did not exist. If a
+ file was deleted, then a copy (potentially with props) was disallowed
+ and could not replace the deletion. An addition *could* be performed,
+ but that would never bring its own props.
+
+ 1.4.0 through 1.4.5 created the concept of REVERT_PROPS, but had a
+ bug in svn_wc_add_repos_file2() whereby a copy-with-props did NOT
+ construct a REVERT_PROPS if the target had no props. Thus, reverting
+ the delete/copy would see no REVERT_PROPS to restore, leaving the
+ props from the copy source intact, and appearing as if they are (now)
+ the base props for the previously-deleted file. (wc corruption)
+
+ 1.4.6 ensured that an empty REVERT_PROPS would be established at all
+ times. See issue 2530, and r861670 as starting points.
+
+ We will use ORIGINAL_FORMAT and SVN_WC__NO_REVERT_FILES to determine
+ the handling of our inputs, relative to the state of this node.
+ */
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_NODE_INFO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ {
+ top_op_depth = svn_sqlite__column_int(stmt, 0);
+ top_presence = svn_sqlite__column_token(stmt, 3, presence_map);
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ {
+ below_presence = svn_sqlite__column_token(stmt, 3, presence_map);
+
+ /* There might be an intermediate layer on mixed-revision copies,
+ or when BASE is shadowed */
+ if (below_presence == svn_wc__db_status_not_present
+ || below_presence == svn_wc__db_status_deleted)
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ if (have_row)
+ {
+ below_presence = svn_sqlite__column_token(stmt, 3, presence_map);
+ below_op_depth = svn_sqlite__column_int(stmt, 0);
+ }
+ }
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ /* Detect the buggy scenario described above. We cannot upgrade this
+ working copy if we have no idea where BASE_PROPS should go. */
+ if (original_format > SVN_WC__NO_REVERT_FILES
+ && revert_props == NULL
+ && top_op_depth != -1
+ && top_presence == svn_wc__db_status_normal
+ && below_op_depth != -1
+ && below_presence != svn_wc__db_status_not_present)
+ {
+ /* There should be REVERT_PROPS, so it appears that we just ran into
+ the described bug. Sigh. */
+ return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
+ _("The properties of '%s' are in an "
+ "indeterminate state and cannot be "
+ "upgraded. See issue #2530."),
+ svn_dirent_local_style(
+ svn_dirent_join(dir_abspath, local_relpath,
+ scratch_pool), scratch_pool));
+ }
+
+ /* Need at least one row, or two rows if there are revert props */
+ if (top_op_depth == -1
+ || (below_op_depth == -1 && revert_props))
+ return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
+ _("Insufficient NODES rows for '%s'"),
+ svn_dirent_local_style(
+ svn_dirent_join(dir_abspath, local_relpath,
+ scratch_pool), scratch_pool));
+
+ /* one row, base props only: upper row gets base props
+ two rows, base props only: lower row gets base props
+ two rows, revert props only: lower row gets revert props
+ two rows, base and revert props: upper row gets base, lower gets revert */
+
+
+ if (revert_props || below_op_depth == -1)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_UPDATE_NODE_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd",
+ wc_id, local_relpath, top_op_depth));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 4, base_props, scratch_pool));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ SVN_ERR_ASSERT(affected_rows == 1);
+ }
+
+ if (below_op_depth != -1)
+ {
+ apr_hash_t *props = revert_props ? revert_props : base_props;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_UPDATE_NODE_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd",
+ wc_id, local_relpath, below_op_depth));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 4, props, scratch_pool));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ SVN_ERR_ASSERT(affected_rows == 1);
+ }
+
+ /* If there are WORKING_PROPS, then they always go into ACTUAL_NODE. */
+ if (working_props != NULL
+ && base_props != NULL)
+ {
+ apr_array_header_t *diffs;
+
+ SVN_ERR(svn_prop_diffs(&diffs, working_props, base_props, scratch_pool));
+
+ if (diffs->nelts == 0)
+ working_props = NULL; /* No differences */
+ }
+
+ if (working_props != NULL)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_UPDATE_ACTUAL_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 3, working_props,
+ scratch_pool));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ if (affected_rows == 0)
+ {
+ /* We have to insert a row in ACTUAL */
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_INSERT_ACTUAL_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ if (*local_relpath != '\0')
+ SVN_ERR(svn_sqlite__bind_text(stmt, 3,
+ svn_relpath_dirname(local_relpath,
+ scratch_pool)));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 4, working_props,
+ scratch_pool));
+ return svn_error_trace(svn_sqlite__step_done(stmt));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
struct bump_baton {
const char *wcroot_abspath;
@@ -875,21 +1059,21 @@ migrate_node_props(const char *dir_abspath,
apr_pstrcat(scratch_pool,
name,
SVN_WC__BASE_EXT,
- (char *)NULL),
+ SVN_VA_NULL),
scratch_pool);
revert_abspath = svn_dirent_join(basedir_abspath,
apr_pstrcat(scratch_pool,
name,
SVN_WC__REVERT_EXT,
- (char *)NULL),
+ SVN_VA_NULL),
scratch_pool);
working_abspath = svn_dirent_join(propsdir_abspath,
apr_pstrcat(scratch_pool,
name,
SVN_WC__WORK_EXT,
- (char *)NULL),
+ SVN_VA_NULL),
scratch_pool);
}
@@ -900,7 +1084,7 @@ migrate_node_props(const char *dir_abspath,
SVN_ERR(read_propfile(&working_props, working_abspath,
scratch_pool, scratch_pool));
- return svn_error_trace(svn_wc__db_upgrade_apply_props(
+ return svn_error_trace(upgrade_apply_props(
sdb, new_wcroot_abspath,
svn_relpath_join(dir_relpath, name, scratch_pool),
base_props, revert_props, working_props,
@@ -1017,7 +1201,7 @@ migrate_text_bases(apr_hash_t **text_bases_info,
for (hi = apr_hash_first(scratch_pool, dirents); hi;
hi = apr_hash_next(hi))
{
- const char *text_base_basename = svn__apr_hash_index_key(hi);
+ const char *text_base_basename = apr_hash_this_key(hi);
svn_checksum_t *md5_checksum;
svn_checksum_t *sha1_checksum;
@@ -1248,7 +1432,7 @@ rename_pristine_file(void *baton,
== PRISTINE_BASENAME_OLD_LEN))
{
const char *new_abspath
- = apr_pstrcat(pool, abspath, PRISTINE_STORAGE_EXT, (char *)NULL);
+ = apr_pstrcat(pool, abspath, PRISTINE_STORAGE_EXT, SVN_VA_NULL);
SVN_ERR(svn_io_file_rename(abspath, new_abspath, pool));
}
@@ -1349,7 +1533,8 @@ bump_to_29(void *baton, svn_sqlite__db_t *sdb, apr_pool_t *scratch_pool)
/* Rename all pristine files, adding a ".svn-base" suffix. */
pristine_dir_abspath = svn_dirent_join_many(scratch_pool, wcroot_abspath,
svn_wc_get_adm_dir(scratch_pool),
- PRISTINE_STORAGE_RELPATH, NULL);
+ PRISTINE_STORAGE_RELPATH,
+ SVN_VA_NULL);
SVN_ERR(svn_io_dir_walk2(pristine_dir_abspath, APR_FINFO_MIN,
rename_pristine_file, NULL, scratch_pool));
@@ -1671,6 +1856,43 @@ bump_to_31(void *baton,
return SVN_NO_ERROR;
}
+static svn_error_t *
+upgrade_apply_dav_cache(svn_sqlite__db_t *sdb,
+ const char *dir_relpath,
+ apr_int64_t wc_id,
+ apr_hash_t *cache_values,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_index_t *hi;
+ svn_sqlite__stmt_t *stmt;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_UPDATE_BASE_NODE_DAV_CACHE));
+
+ /* Iterate over all the wcprops, writing each one to the wc_db. */
+ for (hi = apr_hash_first(scratch_pool, cache_values);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *name = apr_hash_this_key(hi);
+ apr_hash_t *props = apr_hash_this_val(hi);
+ const char *local_relpath;
+
+ svn_pool_clear(iterpool);
+
+ local_relpath = svn_relpath_join(dir_relpath, name, iterpool);
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 3, props, iterpool));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
struct upgrade_data_t {
svn_sqlite__db_t *sdb;
@@ -1808,8 +2030,8 @@ upgrade_to_wcng(void **dir_baton,
SVN_ERR(read_wcprops(&all_wcprops, dir_abspath,
scratch_pool, scratch_pool));
- SVN_ERR(svn_wc__db_upgrade_apply_dav_cache(data->sdb, dir_relpath,
- all_wcprops, scratch_pool));
+ SVN_ERR(upgrade_apply_dav_cache(data->sdb, dir_relpath, wc_id,
+ all_wcprops, scratch_pool));
}
/* Upgrade all the properties (including "this dir").
@@ -2144,40 +2366,6 @@ is_old_wcroot(const char *local_abspath,
svn_dirent_local_style(parent_abspath, scratch_pool));
}
-/* Data for upgrade_working_copy_txn(). */
-typedef struct upgrade_working_copy_baton_t
-{
- svn_wc__db_t *db;
- const char *dir_abspath;
- svn_wc_upgrade_get_repos_info_t repos_info_func;
- void *repos_info_baton;
- apr_hash_t *repos_cache;
- const struct upgrade_data_t *data;
- svn_cancel_func_t cancel_func;
- void *cancel_baton;
- svn_wc_notify_func2_t notify_func;
- void *notify_baton;
- apr_pool_t *result_pool;
-} upgrade_working_copy_baton_t;
-
-
-/* Helper for svn_wc_upgrade. Implements svn_sqlite__transaction_callback_t */
-static svn_error_t *
-upgrade_working_copy_txn(void *baton,
- svn_sqlite__db_t *sdb,
- apr_pool_t *scratch_pool)
-{
- upgrade_working_copy_baton_t *b = baton;
-
- /* Upgrade the pre-wcng into a wcng in a temporary location. */
- return(upgrade_working_copy(NULL, b->db, b->dir_abspath,
- b->repos_info_func, b->repos_info_baton,
- b->repos_cache, b->data,
- b->cancel_func, b->cancel_baton,
- b->notify_func, b->notify_baton,
- b->result_pool, scratch_pool));
-}
-
svn_error_t *
svn_wc_upgrade(svn_wc_context_t *wc_ctx,
const char *local_abspath,
@@ -2197,7 +2385,6 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
svn_wc_entry_t *this_dir;
apr_hash_t *entries;
const char *root_adm_abspath;
- upgrade_working_copy_baton_t cb_baton;
svn_error_t *err;
int result_format;
svn_boolean_t bumped_format;
@@ -2295,22 +2482,14 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
SVN_ERR(svn_wc__db_wclock_obtain(db, data.root_abspath, 0, FALSE,
scratch_pool));
- cb_baton.db = db;
- cb_baton.dir_abspath = local_abspath;
- cb_baton.repos_info_func = repos_info_func;
- cb_baton.repos_info_baton = repos_info_baton;
- cb_baton.repos_cache = repos_cache;
- cb_baton.data = &data;
- cb_baton.cancel_func = cancel_func;
- cb_baton.cancel_baton = cancel_baton;
- cb_baton.notify_func = notify_func;
- cb_baton.notify_baton = notify_baton;
- cb_baton.result_pool = scratch_pool;
-
- SVN_ERR(svn_sqlite__with_lock(data.sdb,
- upgrade_working_copy_txn,
- &cb_baton,
- scratch_pool));
+ SVN_SQLITE__WITH_LOCK(
+ upgrade_working_copy(NULL, db, local_abspath,
+ repos_info_func, repos_info_baton,
+ repos_cache, &data,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ scratch_pool, scratch_pool),
+ data.sdb);
/* A workqueue item to move the pristine dir into place */
pristine_from = svn_wc__adm_child(data.root_abspath, PRISTINE_STORAGE_RELPATH,
diff --git a/subversion/libsvn_wc/util.c b/subversion/libsvn_wc/util.c
index a527eda..7bb2179 100644
--- a/subversion/libsvn_wc/util.c
+++ b/subversion/libsvn_wc/util.c
@@ -248,9 +248,34 @@ svn_wc_conflict_description_create_tree2(
return conflict;
}
+svn_wc_conflict_version_t *
+svn_wc_conflict_version_create2(const char *repos_url,
+ const char *repos_uuid,
+ const char *repos_relpath,
+ svn_revnum_t revision,
+ svn_node_kind_t kind,
+ apr_pool_t *result_pool)
+{
+ svn_wc_conflict_version_t *version;
+
+ version = apr_pcalloc(result_pool, sizeof(*version));
+
+ SVN_ERR_ASSERT_NO_RETURN(svn_uri_is_canonical(repos_url, result_pool)
+ && svn_relpath_is_canonical(repos_relpath)
+ && SVN_IS_VALID_REVNUM(revision)
+ /* ### repos_uuid can be NULL :( */);
+
+ version->repos_url = repos_url;
+ version->peg_rev = revision;
+ version->path_in_repos = repos_relpath;
+ version->node_kind = kind;
+ version->repos_uuid = repos_uuid;
+
+ return version;
+}
svn_wc_conflict_description2_t *
-svn_wc__conflict_description2_dup(const svn_wc_conflict_description2_t *conflict,
+svn_wc_conflict_description2_dup(const svn_wc_conflict_description2_t *conflict,
apr_pool_t *pool)
{
svn_wc_conflict_description2_t *new_conflict;
@@ -281,36 +306,27 @@ svn_wc__conflict_description2_dup(const svn_wc_conflict_description2_t *conflict
new_conflict->src_right_version =
svn_wc_conflict_version_dup(conflict->src_right_version, pool);
- return new_conflict;
-}
+ /* ### For property conflicts, cd2 stores prop_reject_abspath in
+ * ### their_abspath, and stores theirs_abspath in merged_file. */
+ if (conflict->prop_reject_abspath)
+ new_conflict->prop_reject_abspath = new_conflict->their_abspath;
+
+ if (conflict->prop_value_base)
+ new_conflict->prop_value_base =
+ svn_string_dup(conflict->prop_value_base, pool);
+ if (conflict->prop_value_working)
+ new_conflict->prop_value_working =
+ svn_string_dup(conflict->prop_value_working, pool);
+ if (conflict->prop_value_incoming_old)
+ new_conflict->prop_value_incoming_old =
+ svn_string_dup(conflict->prop_value_incoming_old, pool);
+ if (conflict->prop_value_incoming_new)
+ new_conflict->prop_value_incoming_new =
+ svn_string_dup(conflict->prop_value_incoming_new, pool);
-svn_wc_conflict_version_t *
-svn_wc_conflict_version_create2(const char *repos_url,
- const char *repos_uuid,
- const char *repos_relpath,
- svn_revnum_t revision,
- svn_node_kind_t kind,
- apr_pool_t *result_pool)
-{
- svn_wc_conflict_version_t *version;
-
- version = apr_pcalloc(result_pool, sizeof(*version));
-
- SVN_ERR_ASSERT_NO_RETURN(svn_uri_is_canonical(repos_url, result_pool)
- && svn_relpath_is_canonical(repos_relpath)
- && SVN_IS_VALID_REVNUM(revision)
- /* ### repos_uuid can be NULL :( */);
-
- version->repos_url = repos_url;
- version->peg_rev = revision;
- version->path_in_repos = repos_relpath;
- version->node_kind = kind;
- version->repos_uuid = repos_uuid;
-
- return version;
+ return new_conflict;
}
-
svn_wc_conflict_version_t *
svn_wc_conflict_version_dup(const svn_wc_conflict_version_t *version,
apr_pool_t *result_pool)
@@ -339,7 +355,6 @@ svn_wc_conflict_version_dup(const svn_wc_conflict_version_t *version,
return new_version;
}
-
svn_wc_conflict_description_t *
svn_wc__cd2_to_cd(const svn_wc_conflict_description2_t *conflict,
apr_pool_t *result_pool)
@@ -403,145 +418,6 @@ svn_wc__cd2_to_cd(const svn_wc_conflict_description2_t *conflict,
svn_error_t *
-svn_wc__status2_from_3(svn_wc_status2_t **status,
- const svn_wc_status3_t *old_status,
- svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const svn_wc_entry_t *entry = NULL;
-
- if (old_status == NULL)
- {
- *status = NULL;
- return SVN_NO_ERROR;
- }
-
- *status = apr_pcalloc(result_pool, sizeof(**status));
-
- if (old_status->versioned)
- {
- svn_error_t *err;
- err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE,
- svn_node_unknown, result_pool, scratch_pool);
-
- if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
- svn_error_clear(err);
- else
- SVN_ERR(err);
- }
-
- (*status)->entry = entry;
- (*status)->copied = old_status->copied;
- (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool);
-
- if (old_status->repos_relpath)
- (*status)->url = svn_path_url_add_component2(old_status->repos_root_url,
- old_status->repos_relpath,
- result_pool);
- (*status)->ood_last_cmt_rev = old_status->ood_changed_rev;
- (*status)->ood_last_cmt_date = old_status->ood_changed_date;
- (*status)->ood_kind = old_status->ood_kind;
- (*status)->ood_last_cmt_author = old_status->ood_changed_author;
-
- if (old_status->conflicted)
- {
- const svn_wc_conflict_description2_t *tree_conflict;
- SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, wc_ctx, local_abspath,
- scratch_pool, scratch_pool));
- (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict, result_pool);
- }
-
- (*status)->switched = old_status->switched;
-
- (*status)->text_status = old_status->node_status;
- (*status)->prop_status = old_status->prop_status;
-
- (*status)->repos_text_status = old_status->repos_node_status;
- (*status)->repos_prop_status = old_status->repos_prop_status;
-
- /* Some values might be inherited from properties */
- if (old_status->node_status == svn_wc_status_modified
- || old_status->node_status == svn_wc_status_conflicted)
- (*status)->text_status = old_status->text_status;
-
- /* (Currently a no-op, but just make sure it is ok) */
- if (old_status->repos_node_status == svn_wc_status_modified
- || old_status->repos_node_status == svn_wc_status_conflicted)
- (*status)->repos_text_status = old_status->repos_text_status;
-
- if (old_status->node_status == svn_wc_status_added)
- (*status)->prop_status = svn_wc_status_none; /* No separate info */
-
- /* Find pristine_text_status value */
- switch (old_status->text_status)
- {
- case svn_wc_status_none:
- case svn_wc_status_normal:
- case svn_wc_status_modified:
- (*status)->pristine_text_status = old_status->text_status;
- break;
- case svn_wc_status_conflicted:
- default:
- /* ### Fetch compare data, or fall back to the documented
- not retrieved behavior? */
- (*status)->pristine_text_status = svn_wc_status_none;
- break;
- }
-
- /* Find pristine_prop_status value */
- switch (old_status->prop_status)
- {
- case svn_wc_status_none:
- case svn_wc_status_normal:
- case svn_wc_status_modified:
- if (old_status->node_status != svn_wc_status_added
- && old_status->node_status != svn_wc_status_deleted
- && old_status->node_status != svn_wc_status_replaced)
- {
- (*status)->pristine_prop_status = old_status->prop_status;
- }
- else
- (*status)->pristine_prop_status = svn_wc_status_none;
- break;
- case svn_wc_status_conflicted:
- default:
- /* ### Fetch compare data, or fall back to the documented
- not retrieved behavior? */
- (*status)->pristine_prop_status = svn_wc_status_none;
- break;
- }
-
- if (old_status->versioned
- && old_status->conflicted
- && old_status->node_status != svn_wc_status_obstructed
- && (old_status->kind == svn_node_file
- || old_status->node_status != svn_wc_status_missing))
- {
- svn_boolean_t text_conflict_p, prop_conflict_p;
-
- /* The entry says there was a conflict, but the user might have
- marked it as resolved by deleting the artifact files, so check
- for that. */
- SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p,
- &prop_conflict_p,
- NULL,
- wc_ctx->db, local_abspath,
- scratch_pool));
-
- if (text_conflict_p)
- (*status)->text_status = svn_wc_status_conflicted;
-
- if (prop_conflict_p)
- (*status)->prop_status = svn_wc_status_conflicted;
- }
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
svn_wc__fetch_kind_func(svn_node_kind_t *kind,
void *baton,
const char *path,
diff --git a/subversion/libsvn_wc/wc-checks.h b/subversion/libsvn_wc/wc-checks.h
index 58d2273..e867506 100644
--- a/subversion/libsvn_wc/wc-checks.h
+++ b/subversion/libsvn_wc/wc-checks.h
@@ -1,4 +1,4 @@
-/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.8.13/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_VERIFICATION_TRIGGERS 0
@@ -42,14 +42,189 @@
"END; " \
""
+#define STMT_STATIC_VERIFY 1
+#define STMT_1_INFO {"STMT_STATIC_VERIFY", NULL}
+#define STMT_1 \
+ "SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES' " \
+ "FROM nodes n WHERE local_relpath != '' " \
+ " AND (parent_relpath IS NULL " \
+ " OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
+ " OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
+ "UNION ALL " \
+ "SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL' " \
+ "FROM actual_node a WHERE local_relpath != '' " \
+ " AND (parent_relpath IS NULL " \
+ " OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
+ " OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
+ "UNION ALL " \
+ "SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL' " \
+ "FROM actual_node a WHERE local_relpath != '' " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.parent_relpath) " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.local_relpath) " \
+ "UNION ALL " \
+ "SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data' " \
+ "FROM actual_node a " \
+ "LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath " \
+ " AND n.op_depth = (SELECT MAX(op_depth) from nodes i " \
+ " WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath) " \
+ "WHERE (a.properties IS NOT NULL " \
+ " AND (n.presence IS NULL " \
+ " OR n.presence NOT IN ('normal', 'incomplete'))) " \
+ " OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != 'file')) " \
+ " OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL) " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.parent_relpath) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 20, 'No ancestor in NODES' " \
+ "FROM nodes n WHERE local_relpath != '' " \
+ " AND file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=n.wc_id " \
+ " AND i.local_relpath=n.parent_relpath " \
+ " AND i.op_depth <= n.op_depth) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 21, 'Unneeded node data' " \
+ "FROM nodes " \
+ "WHERE presence NOT IN ('normal', 'incomplete') " \
+ "AND (properties IS NOT NULL " \
+ " OR checksum IS NOT NULL " \
+ " OR depth IS NOT NULL " \
+ " OR symlink_target IS NOT NULL " \
+ " OR changed_revision IS NOT NULL " \
+ " OR (changed_date IS NOT NULL AND changed_date != 0) " \
+ " OR changed_author IS NOT NULL " \
+ " OR translated_size IS NOT NULL " \
+ " OR last_mod_time IS NOT NULL " \
+ " OR dav_cache IS NOT NULL " \
+ " OR file_external IS NOT NULL " \
+ " OR inherited_props IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data' " \
+ "FROM nodes " \
+ "WHERE presence IN ('base-deleted') " \
+ "AND (repos_id IS NOT NULL " \
+ " OR repos_path IS NOT NULL " \
+ " OR revision IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal' " \
+ "FROM nodes " \
+ "WHERE presence IN ('normal', 'incomplete') " \
+ "AND (kind IS NULL " \
+ " OR (repos_path IS NULL " \
+ " AND (properties IS NOT NULL " \
+ " OR changed_revision IS NOT NULL " \
+ " OR changed_author IS NOT NULL " \
+ " OR (changed_date IS NOT NULL AND changed_date != 0))) " \
+ " OR (CASE WHEN kind = 'file' AND repos_path IS NOT NULL " \
+ " THEN checksum IS NULL " \
+ " ELSE checksum IS NOT NULL END) " \
+ " OR (CASE WHEN kind = 'dir' THEN depth IS NULL " \
+ " ELSE depth IS NOT NULL END) " \
+ " OR (CASE WHEN kind = 'symlink' THEN symlink_target IS NULL " \
+ " ELSE symlink_target IS NOT NULL END)) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add' " \
+ "FROM nodes " \
+ "WHERE presence IN ('normal', 'incomplete') " \
+ " AND repos_path IS NULL " \
+ " AND op_depth != relpath_depth(local_relpath) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor' " \
+ "FROM nodes n " \
+ "WHERE op_depth < relpath_depth(local_relpath) " \
+ " AND file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes p " \
+ " WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
+ " AND p.op_depth=n.op_depth " \
+ " AND (p.presence IN ('normal', 'incomplete') " \
+ " OR (p.presence IN ('base-deleted', 'not-present') " \
+ " AND n.presence = 'base-deleted'))) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch' " \
+ "FROM nodes n " \
+ "JOIN nodes p " \
+ " ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
+ " AND n.op_depth=p.op_depth " \
+ "WHERE n.op_depth > 0 AND n.presence IN ('normal', 'incomplete') " \
+ " AND (n.repos_id != p.repos_id " \
+ " OR n.repos_path != " \
+ " (CASE WHEN (n.parent_relpath) = '' THEN (CASE WHEN (p.repos_path) = '' THEN (n.local_relpath) WHEN (n.local_relpath) = '' THEN (p.repos_path) ELSE (p.repos_path) || '/' || (n.local_relpath) END) WHEN (p.repos_path) = '' THEN (CASE WHEN (n.parent_relpath) = '' THEN (n.local_relpath) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN '' WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+2) END END) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN (p.repos_path) WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN (p.repos_path) || SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1) END END) " \
+ " OR n.revision != p.revision " \
+ " OR p.kind != 'dir' " \
+ " OR n.moved_here IS NOT p.moved_here) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence' " \
+ "FROM nodes n " \
+ "WHERE n.op_depth = relpath_depth(local_relpath) " \
+ " AND presence NOT IN ('normal', 'incomplete', 'base-deleted') " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing' " \
+ "FROM nodes n " \
+ "JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath " \
+ " AND s.op_depth = relpath_depth(s.local_relpath) " \
+ " AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d " \
+ " WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
+ " AND d.op_depth > n.op_depth) " \
+ "WHERE n.presence IN ('normal', 'incomplete') " \
+ " AND EXISTS(SELECT 1 " \
+ " FROM nodes dn " \
+ " WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth " \
+ " AND dn.presence IN ('normal', 'incomplete') " \
+ " AND (((dn.local_relpath) > (CASE (n.local_relpath) WHEN '' THEN '' ELSE (n.local_relpath) || '/' END)) AND ((dn.local_relpath) < CASE (n.local_relpath) WHEN '' THEN X'FFFF' ELSE (n.local_relpath) || '0' END)) " \
+ " AND dn.file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 " \
+ " FROM nodes ds " \
+ " WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth " \
+ " AND ds.local_relpath=dn.local_relpath)) " \
+ "UNION ALL " \
+ "SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete' " \
+ "FROM nodes s " \
+ "LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath " \
+ " AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
+ " WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
+ " AND d.op_depth < s.op_depth) " \
+ "WHERE s.presence = 'base-deleted' " \
+ " AND (n.presence IS NULL " \
+ " OR n.presence NOT IN ('normal', 'incomplete') " \
+ " ) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE' " \
+ "FROM nodes n " \
+ "WHERE n.op_depth = 0 " \
+ " AND (n.moved_to IS NOT NULL " \
+ " OR n.moved_here IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin' " \
+ "FROM nodes d " \
+ "WHERE d.op_depth = relpath_depth(d.local_relpath) " \
+ " AND d.moved_here IS NOT NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes s " \
+ " WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath) " \
+ "UNION ALL " \
+ "SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target' " \
+ "FROM nodes s " \
+ "WHERE s.moved_to IS NOT NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes d " \
+ " WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to " \
+ " AND d.op_depth = relpath_depth(d.local_relpath) " \
+ " AND d.moved_here =1 AND d.repos_path IS NOT NULL) " \
+ ""
+
#define WC_CHECKS_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
+ STMT_1, \
NULL \
}
#define WC_CHECKS_SQL_DECLARE_STATEMENT_INFO(varname) \
static const char * const varname[][2] = { \
STMT_0_INFO, \
+ STMT_1_INFO, \
{NULL, NULL} \
}
diff --git a/subversion/libsvn_wc/wc-checks.sql b/subversion/libsvn_wc/wc-checks.sql
index a677270..fce7b49 100644
--- a/subversion/libsvn_wc/wc-checks.sql
+++ b/subversion/libsvn_wc/wc-checks.sql
@@ -75,3 +75,217 @@ BEGIN
SELECT RAISE(FAIL, 'WC DB validity check 04 failed');
END;
+-- STMT_STATIC_VERIFY
+SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES'
+FROM nodes n WHERE local_relpath != ''
+ AND (parent_relpath IS NULL
+ OR NOT IS_STRICT_DESCENDANT_OF(local_relpath, parent_relpath)
+ OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1)
+
+UNION ALL
+
+SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL'
+FROM actual_node a WHERE local_relpath != ''
+ AND (parent_relpath IS NULL
+ OR NOT IS_STRICT_DESCENDANT_OF(local_relpath, parent_relpath)
+ OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1)
+
+UNION ALL
+
+/* All ACTUAL nodes must have an equivalent NODE in NODES
+ or be only one level deep (delete-delete tc) */
+SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL'
+FROM actual_node a WHERE local_relpath != ''
+ AND NOT EXISTS(SELECT 1 from nodes i
+ WHERE i.wc_id=a.wc_id
+ AND i.local_relpath=a.parent_relpath)
+ AND NOT EXISTS(SELECT 1 from nodes i
+ WHERE i.wc_id=a.wc_id
+ AND i.local_relpath=a.local_relpath)
+
+UNION ALL
+/* Verify if the ACTUAL data makes sense for the related node.
+ Only conflict data is valid if there is none */
+SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data'
+FROM actual_node a
+LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath
+ AND n.op_depth = (SELECT MAX(op_depth) from nodes i
+ WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath)
+WHERE (a.properties IS NOT NULL
+ AND (n.presence IS NULL
+ OR n.presence NOT IN (MAP_NORMAL, MAP_INCOMPLETE)))
+ OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != MAP_FILE))
+ OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL)
+ AND NOT EXISTS(SELECT 1 from nodes i
+ WHERE i.wc_id=a.wc_id
+ AND i.local_relpath=a.parent_relpath)
+
+UNION ALL
+
+/* A parent node must exist for every normal node except the root.
+ That node must exist at a lower or equal op-depth */
+SELECT local_relpath, op_depth, 20, 'No ancestor in NODES'
+FROM nodes n WHERE local_relpath != ''
+ AND file_external IS NULL
+ AND NOT EXISTS(SELECT 1 from nodes i
+ WHERE i.wc_id=n.wc_id
+ AND i.local_relpath=n.parent_relpath
+ AND i.op_depth <= n.op_depth)
+
+UNION ALL
+/* If a node is not present in the working copy (normal, add, copy) it doesn't
+ have revision details stored on this record */
+SELECT local_relpath, op_depth, 21, 'Unneeded node data'
+FROM nodes
+WHERE presence NOT IN (MAP_NORMAL, MAP_INCOMPLETE)
+AND (properties IS NOT NULL
+ OR checksum IS NOT NULL
+ OR depth IS NOT NULL
+ OR symlink_target IS NOT NULL
+ OR changed_revision IS NOT NULL
+ OR (changed_date IS NOT NULL AND changed_date != 0)
+ OR changed_author IS NOT NULL
+ OR translated_size IS NOT NULL
+ OR last_mod_time IS NOT NULL
+ OR dav_cache IS NOT NULL
+ OR file_external IS NOT NULL
+ OR inherited_props IS NOT NULL)
+
+UNION ALL
+/* base-deleted nodes don't have a repository location. They are just
+ shadowing without a replacement */
+SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data'
+FROM nodes
+WHERE presence IN (MAP_BASE_DELETED)
+AND (repos_id IS NOT NULL
+ OR repos_path IS NOT NULL
+ OR revision IS NOT NULL)
+
+UNION ALL
+/* Verify if type specific data is set (or not set for wrong type) */
+SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal'
+FROM nodes
+WHERE presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+AND (kind IS NULL
+ OR (repos_path IS NULL
+ AND (properties IS NOT NULL
+ OR changed_revision IS NOT NULL
+ OR changed_author IS NOT NULL
+ OR (changed_date IS NOT NULL AND changed_date != 0)))
+ OR (CASE WHEN kind = MAP_FILE AND repos_path IS NOT NULL
+ THEN checksum IS NULL
+ ELSE checksum IS NOT NULL END)
+ OR (CASE WHEN kind = MAP_DIR THEN depth IS NULL
+ ELSE depth IS NOT NULL END)
+ OR (CASE WHEN kind = MAP_SYMLINK THEN symlink_target IS NULL
+ ELSE symlink_target IS NOT NULL END))
+
+UNION ALL
+/* Local-adds are always their own operation (read: they don't have
+ op-depth descendants, nor are op-depth descendants */
+SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add'
+FROM nodes
+WHERE presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ AND repos_path IS NULL
+ AND op_depth != relpath_depth(local_relpath)
+
+UNION ALL
+/* op-depth descendants are only valid if they have a direct parent
+ node at the same op-depth. Only certain types allow further
+ descendants */
+SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor'
+FROM nodes n
+WHERE op_depth < relpath_depth(local_relpath)
+ AND file_external IS NULL
+ AND NOT EXISTS(SELECT 1 FROM nodes p
+ WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath
+ AND p.op_depth=n.op_depth
+ AND (p.presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ OR (p.presence IN (MAP_BASE_DELETED, MAP_NOT_PRESENT)
+ AND n.presence = MAP_BASE_DELETED)))
+
+UNION ALL
+/* Present op-depth descendants have the repository location implied by their
+ ancestor */
+SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch'
+FROM nodes n
+JOIN nodes p
+ ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath
+ AND n.op_depth=p.op_depth
+WHERE n.op_depth > 0 AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ AND (n.repos_id != p.repos_id
+ OR n.repos_path !=
+ RELPATH_SKIP_JOIN(n.parent_relpath, p.repos_path, n.local_relpath)
+ OR n.revision != p.revision
+ OR p.kind != MAP_DIR
+ OR n.moved_here IS NOT p.moved_here)
+
+UNION ALL
+/* Only certain presence values are valid as op-root.
+ Note that the wc-root always has presence normal or incomplete */
+SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence'
+FROM nodes n
+WHERE n.op_depth = relpath_depth(local_relpath)
+ AND presence NOT IN (MAP_NORMAL, MAP_INCOMPLETE, MAP_BASE_DELETED)
+
+UNION ALL
+/* If a node is shadowed, all its present op-depth descendants
+ must be shadowed at the same op-depth as well */
+SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing'
+FROM nodes n
+JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath
+ AND s.op_depth = relpath_depth(s.local_relpath)
+ AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d
+ WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath
+ AND d.op_depth > n.op_depth)
+WHERE n.presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ AND EXISTS(SELECT 1
+ FROM nodes dn
+ WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth
+ AND dn.presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ AND IS_STRICT_DESCENDANT_OF(dn.local_relpath, n.local_relpath)
+ AND dn.file_external IS NULL
+ AND NOT EXISTS(SELECT 1
+ FROM nodes ds
+ WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth
+ AND ds.local_relpath=dn.local_relpath))
+
+UNION ALL
+/* A base-delete is only valid if it directly deletes a present node */
+SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete'
+FROM nodes s
+LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath
+ AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d
+ WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath
+ AND d.op_depth < s.op_depth)
+WHERE s.presence = MAP_BASE_DELETED
+ AND (n.presence IS NULL
+ OR n.presence NOT IN (MAP_NORMAL, MAP_INCOMPLETE)
+ /*OR n.kind != s.kind*/)
+
+UNION ALL
+/* Moves are stored in the working layers, not in BASE */
+SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE'
+FROM nodes n
+WHERE n.op_depth = 0
+ AND (n.moved_to IS NOT NULL
+ OR n.moved_here IS NOT NULL)
+
+UNION ALL
+/* If moved_here is set on an op-root, there must be a proper moved_to */
+SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin'
+FROM nodes d
+WHERE d.op_depth = relpath_depth(d.local_relpath)
+ AND d.moved_here IS NOT NULL
+ AND NOT EXISTS(SELECT 1 FROM nodes s
+ WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath)
+
+UNION ALL
+/* If moved_to is set there should be an moved op root at the target */
+SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target'
+FROM nodes s
+WHERE s.moved_to IS NOT NULL
+ AND NOT EXISTS(SELECT 1 FROM nodes d
+ WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to
+ AND d.op_depth = relpath_depth(d.local_relpath)
+ AND d.moved_here =1 AND d.repos_path IS NOT NULL)
diff --git a/subversion/libsvn_wc/wc-metadata.h b/subversion/libsvn_wc/wc-metadata.h
index 25e392a..f548d91 100644
--- a/subversion/libsvn_wc/wc-metadata.h
+++ b/subversion/libsvn_wc/wc-metadata.h
@@ -1,4 +1,4 @@
-/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.8.13/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_CREATE_SCHEMA 0
@@ -164,21 +164,25 @@
#define STMT_4 \
"ANALYZE sqlite_master; " \
"DELETE FROM sqlite_stat1 " \
- "WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_MOVED', '8000 8000 1 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ " ('EXTERNALS','sqlite_autoindex_EXTERNALS_1', '100 100 1'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ " ('EXTERNALS','I_EXTERNALS_DEFINED', '100 100 3 1'); " \
"ANALYZE sqlite_master; " \
""
diff --git a/subversion/libsvn_wc/wc-metadata.sql b/subversion/libsvn_wc/wc-metadata.sql
index e4b226e..f52df93 100644
--- a/subversion/libsvn_wc/wc-metadata.sql
+++ b/subversion/libsvn_wc/wc-metadata.sql
@@ -108,7 +108,7 @@ CREATE TABLE PRISTINE (
);
CREATE INDEX I_PRISTINE_MD5 ON PRISTINE (md5_checksum);
-
+
/* ------------------------------------------------------------------------- */
/* The ACTUAL_NODE table describes text changes and property changes
@@ -150,7 +150,7 @@ CREATE TABLE ACTUAL_NODE (
/* if not NULL, this node is part of a changelist. */
changelist TEXT,
-
+
/* ### need to determine values. "unknown" (no info), "admin" (they
### used something like 'svn edit'), "noticed" (saw a mod while
### scanning the filesystem). */
@@ -170,7 +170,7 @@ CREATE TABLE ACTUAL_NODE (
/* stsp: This is meant for text conflicts, right? What about property
conflicts? Why do we need these in a column to refer to the
pristine store? Can't we just parse the checksums from
- conflict_data as well?
+ conflict_data as well?
rhuijben: Because that won't allow triggers to handle refcounts.
We would have to scan all conflict skels before cleaning up the
a single file from the pristine stor */
@@ -200,7 +200,7 @@ CREATE TABLE LOCK (
lock_owner TEXT,
lock_comment TEXT,
lock_date INTEGER, /* an APR date/time (usec since 1970) */
-
+
PRIMARY KEY (repos_id, repos_relpath)
);
@@ -553,7 +553,7 @@ CREATE TABLE EXTERNALS (
/* the kind of the external. */
kind TEXT NOT NULL,
- /* The local relpath of the directory NODE defining this external
+ /* The local relpath of the directory NODE defining this external
(Defaults to the parent directory of the file external after upgrade) */
def_local_relpath TEXT NOT NULL,
@@ -577,7 +577,7 @@ CREATE UNIQUE INDEX I_EXTERNALS_DEFINED ON EXTERNALS (wc_id,
indexes to make better decisions in the query planner.
For every interesting index this contains a number of rows where the
- statistics ar calculated for and then for every column in the index the
+ statistics are calculated for and then for every column in the index the
average number of rows with the same value in all columns left of this
column including the column itself.
@@ -598,27 +598,32 @@ CREATE UNIQUE INDEX I_EXTERNALS_DEFINED ON EXTERNALS (wc_id,
ANALYZE sqlite_master; /* Creates empty sqlite_stat1 if necessary */
DELETE FROM sqlite_stat1
-WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK');
+WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1');
/* Tell a lie: We ignore that 99.9% of all moved_to values are NULL */
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('NODES', 'I_NODES_MOVED', '8000 8000 1 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1');
-INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1');
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
+ ('EXTERNALS','sqlite_autoindex_EXTERNALS_1', '100 100 1');
+INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES
+ ('EXTERNALS','I_EXTERNALS_DEFINED', '100 100 3 1');
+
/* sqlite_autoindex_WORK_QUEUE_1 doesn't exist because WORK_QUEUE is
a INTEGER PRIMARY KEY AUTOINCREMENT table */
@@ -774,7 +779,7 @@ LIMIT 1
/* ------------------------------------------------------------------------- */
-/* Format 28 involves no schema changes, it only converts MD5 pristine
+/* Format 28 involves no schema changes, it only converts MD5 pristine
references to SHA1. */
-- STMT_UPGRADE_TO_28
diff --git a/subversion/libsvn_wc/wc-queries.h b/subversion/libsvn_wc/wc-queries.h
index e33af98..2a75940 100644
--- a/subversion/libsvn_wc/wc-queries.h
+++ b/subversion/libsvn_wc/wc-queries.h
@@ -1,4 +1,4 @@
-/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.8.13/subversion/libsvn_wc/token-map.h.
+/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
* Do not edit this file -- edit the source and rerun gen-make.py */
#define STMT_SELECT_NODE_INFO 0
@@ -55,6 +55,15 @@
#define STMT_4_INFO {"STMT_SELECT_BASE_CHILDREN_INFO", NULL}
#define STMT_4 \
"SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, " \
+ " revision, depth, file_external " \
+ "FROM nodes " \
+ "WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
+ ""
+
+#define STMT_SELECT_BASE_CHILDREN_INFO_LOCK 5
+#define STMT_5_INFO {"STMT_SELECT_BASE_CHILDREN_INFO_LOCK", NULL}
+#define STMT_5 \
+ "SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, " \
" revision, depth, file_external, " \
" lock_token, lock_owner, lock_comment, lock_date " \
"FROM nodes " \
@@ -63,9 +72,9 @@
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_SELECT_WORKING_NODE 5
-#define STMT_5_INFO {"STMT_SELECT_WORKING_NODE", NULL}
-#define STMT_5 \
+#define STMT_SELECT_WORKING_NODE 6
+#define STMT_6_INFO {"STMT_SELECT_WORKING_NODE", NULL}
+#define STMT_6 \
"SELECT op_depth, presence, kind, checksum, translated_size, " \
" changed_revision, changed_date, changed_author, depth, symlink_target, " \
" repos_id, repos_path, revision, " \
@@ -76,19 +85,19 @@
"LIMIT 1 " \
""
-#define STMT_SELECT_DEPTH_NODE 6
-#define STMT_6_INFO {"STMT_SELECT_DEPTH_NODE", NULL}
-#define STMT_6 \
+#define STMT_SELECT_DEPTH_NODE 7
+#define STMT_7_INFO {"STMT_SELECT_DEPTH_NODE", NULL}
+#define STMT_7 \
"SELECT repos_id, repos_path, presence, kind, revision, checksum, " \
" translated_size, changed_revision, changed_date, changed_author, depth, " \
- " symlink_target, last_mod_time, properties " \
+ " symlink_target, properties, moved_to, moved_here " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_SELECT_LOWEST_WORKING_NODE 7
-#define STMT_7_INFO {"STMT_SELECT_LOWEST_WORKING_NODE", NULL}
-#define STMT_7 \
+#define STMT_SELECT_LOWEST_WORKING_NODE 8
+#define STMT_8_INFO {"STMT_SELECT_LOWEST_WORKING_NODE", NULL}
+#define STMT_8 \
"SELECT op_depth, presence, kind, moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 " \
@@ -96,9 +105,9 @@
"LIMIT 1 " \
""
-#define STMT_SELECT_HIGHEST_WORKING_NODE 8
-#define STMT_8_INFO {"STMT_SELECT_HIGHEST_WORKING_NODE", NULL}
-#define STMT_8 \
+#define STMT_SELECT_HIGHEST_WORKING_NODE 9
+#define STMT_9_INFO {"STMT_SELECT_HIGHEST_WORKING_NODE", NULL}
+#define STMT_9 \
"SELECT op_depth " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3 " \
@@ -106,17 +115,17 @@
"LIMIT 1 " \
""
-#define STMT_SELECT_ACTUAL_NODE 9
-#define STMT_9_INFO {"STMT_SELECT_ACTUAL_NODE", NULL}
-#define STMT_9 \
+#define STMT_SELECT_ACTUAL_NODE 10
+#define STMT_10_INFO {"STMT_SELECT_ACTUAL_NODE", NULL}
+#define STMT_10 \
"SELECT changelist, properties, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_SELECT_NODE_CHILDREN_INFO 10
-#define STMT_10_INFO {"STMT_SELECT_NODE_CHILDREN_INFO", NULL}
-#define STMT_10 \
+#define STMT_SELECT_NODE_CHILDREN_INFO 11
+#define STMT_11_INFO {"STMT_SELECT_NODE_CHILDREN_INFO", NULL}
+#define STMT_11 \
"SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
" checksum, translated_size, changed_revision, changed_date, changed_author, " \
" depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, " \
@@ -125,51 +134,67 @@
"LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
" AND nodes.repos_path = lock.repos_relpath AND op_depth = 0 " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
+ "ORDER BY local_relpath DESC, op_depth DESC " \
""
-#define STMT_SELECT_NODE_CHILDREN_WALKER_INFO 11
-#define STMT_11_INFO {"STMT_SELECT_NODE_CHILDREN_WALKER_INFO", NULL}
-#define STMT_11 \
+#define STMT_SELECT_BASE_NODE_CHILDREN_INFO 12
+#define STMT_12_INFO {"STMT_SELECT_BASE_NODE_CHILDREN_INFO", NULL}
+#define STMT_12 \
+ "SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, " \
+ " checksum, translated_size, changed_revision, changed_date, changed_author, " \
+ " depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, " \
+ " lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external " \
+ "FROM nodes " \
+ "LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id " \
+ " AND nodes.repos_path = lock.repos_relpath AND op_depth = 0 " \
+ "WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
+ "ORDER BY local_relpath DESC " \
+ ""
+
+#define STMT_SELECT_NODE_CHILDREN_WALKER_INFO 13
+#define STMT_13_INFO {"STMT_SELECT_NODE_CHILDREN_WALKER_INFO", NULL}
+#define STMT_13 \
"SELECT local_relpath, op_depth, presence, kind " \
"FROM nodes_current " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
+ "ORDER BY local_relpath " \
""
-#define STMT_SELECT_ACTUAL_CHILDREN_INFO 12
-#define STMT_12_INFO {"STMT_SELECT_ACTUAL_CHILDREN_INFO", NULL}
-#define STMT_12 \
+#define STMT_SELECT_ACTUAL_CHILDREN_INFO 14
+#define STMT_14_INFO {"STMT_SELECT_ACTUAL_CHILDREN_INFO", NULL}
+#define STMT_14 \
"SELECT local_relpath, changelist, properties, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
""
-#define STMT_SELECT_REPOSITORY_BY_ID 13
-#define STMT_13_INFO {"STMT_SELECT_REPOSITORY_BY_ID", NULL}
-#define STMT_13 \
+#define STMT_SELECT_REPOSITORY_BY_ID 15
+#define STMT_15_INFO {"STMT_SELECT_REPOSITORY_BY_ID", NULL}
+#define STMT_15 \
"SELECT root, uuid FROM repository WHERE id = ?1 " \
""
-#define STMT_SELECT_WCROOT_NULL 14
-#define STMT_14_INFO {"STMT_SELECT_WCROOT_NULL", NULL}
-#define STMT_14 \
+#define STMT_SELECT_WCROOT_NULL 16
+#define STMT_16_INFO {"STMT_SELECT_WCROOT_NULL", NULL}
+#define STMT_16 \
"SELECT id FROM wcroot WHERE local_abspath IS NULL " \
""
-#define STMT_SELECT_REPOSITORY 15
-#define STMT_15_INFO {"STMT_SELECT_REPOSITORY", NULL}
-#define STMT_15 \
+#define STMT_SELECT_REPOSITORY 17
+#define STMT_17_INFO {"STMT_SELECT_REPOSITORY", NULL}
+#define STMT_17 \
"SELECT id FROM repository WHERE root = ?1 " \
""
-#define STMT_INSERT_REPOSITORY 16
-#define STMT_16_INFO {"STMT_INSERT_REPOSITORY", NULL}
-#define STMT_16 \
+#define STMT_INSERT_REPOSITORY 18
+#define STMT_18_INFO {"STMT_INSERT_REPOSITORY", NULL}
+#define STMT_18 \
"INSERT INTO repository (root, uuid) VALUES (?1, ?2) " \
""
-#define STMT_INSERT_NODE 17
-#define STMT_17_INFO {"STMT_INSERT_NODE", NULL}
-#define STMT_17 \
+#define STMT_INSERT_NODE 19
+#define STMT_19_INFO {"STMT_INSERT_NODE", NULL}
+#define STMT_19 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
@@ -180,22 +205,9 @@
" ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23) " \
""
-#define STMT_SELECT_BASE_PRESENT 18
-#define STMT_18_INFO {"STMT_SELECT_BASE_PRESENT", NULL}
-#define STMT_18 \
- "SELECT local_relpath, kind FROM nodes n " \
- "WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth = 0 " \
- " AND presence in ('normal', 'incomplete') " \
- " AND NOT EXISTS(SELECT 1 FROM NODES w " \
- " WHERE w.wc_id = ?1 AND w.local_relpath = n.local_relpath " \
- " AND op_depth > 0) " \
- "ORDER BY local_relpath DESC " \
- ""
-
-#define STMT_SELECT_WORKING_PRESENT 19
-#define STMT_19_INFO {"STMT_SELECT_WORKING_PRESENT", NULL}
-#define STMT_19 \
+#define STMT_SELECT_WORKING_PRESENT 20
+#define STMT_20_INFO {"STMT_SELECT_WORKING_PRESENT", NULL}
+#define STMT_20 \
"SELECT local_relpath, kind, checksum, translated_size, last_mod_time " \
"FROM nodes n " \
"WHERE wc_id = ?1 " \
@@ -208,25 +220,25 @@
"ORDER BY local_relpath DESC " \
""
-#define STMT_DELETE_NODE_RECURSIVE 20
-#define STMT_20_INFO {"STMT_DELETE_NODE_RECURSIVE", NULL}
-#define STMT_20 \
+#define STMT_DELETE_NODE_RECURSIVE 21
+#define STMT_21_INFO {"STMT_DELETE_NODE_RECURSIVE", NULL}
+#define STMT_21 \
"DELETE FROM NODES " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_DELETE_NODE 21
-#define STMT_21_INFO {"STMT_DELETE_NODE", NULL}
-#define STMT_21 \
+#define STMT_DELETE_NODE 22
+#define STMT_22_INFO {"STMT_DELETE_NODE", NULL}
+#define STMT_22 \
"DELETE " \
"FROM NODES " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE 22
-#define STMT_22_INFO {"STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE", NULL}
-#define STMT_22 \
+#define STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE 23
+#define STMT_23_INFO {"STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE", NULL}
+#define STMT_23 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND EXISTS(SELECT 1 FROM NODES b " \
@@ -240,113 +252,161 @@
" AND presence in ('normal', 'incomplete', 'not-present')) " \
""
-#define STMT_DELETE_WORKING_BASE_DELETE 23
-#define STMT_23_INFO {"STMT_DELETE_WORKING_BASE_DELETE", NULL}
-#define STMT_23 \
+#define STMT_DELETE_WORKING_BASE_DELETE 24
+#define STMT_24_INFO {"STMT_DELETE_WORKING_BASE_DELETE", NULL}
+#define STMT_24 \
"DELETE FROM nodes " \
- "WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ "WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND presence = 'base-deleted' " \
- " AND op_depth > 0 " \
+ " AND op_depth > ?3 " \
" AND op_depth = (SELECT MIN(op_depth) FROM nodes n " \
" WHERE n.wc_id = ?1 " \
" AND n.local_relpath = nodes.local_relpath " \
- " AND op_depth > 0) " \
+ " AND op_depth > ?3) " \
""
-#define STMT_DELETE_WORKING_RECURSIVE 24
-#define STMT_24_INFO {"STMT_DELETE_WORKING_RECURSIVE", NULL}
-#define STMT_24 \
- "DELETE FROM nodes " \
- "WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth > 0 " \
- ""
-
-#define STMT_DELETE_BASE_RECURSIVE 25
-#define STMT_25_INFO {"STMT_DELETE_BASE_RECURSIVE", NULL}
+#define STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE 25
+#define STMT_25_INFO {"STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE", NULL}
#define STMT_25 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth = 0 " \
+ " AND presence = 'base-deleted' " \
+ " AND op_depth > ?3 " \
+ " AND op_depth = (SELECT MIN(op_depth) FROM nodes n " \
+ " WHERE n.wc_id = ?1 " \
+ " AND n.local_relpath = nodes.local_relpath " \
+ " AND op_depth > ?3) " \
""
-#define STMT_DELETE_WORKING_OP_DEPTH 26
-#define STMT_26_INFO {"STMT_DELETE_WORKING_OP_DEPTH", NULL}
+#define STMT_DELETE_WORKING_RECURSIVE 26
+#define STMT_26_INFO {"STMT_DELETE_WORKING_RECURSIVE", NULL}
#define STMT_26 \
"DELETE FROM nodes " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth = ?3 " \
+ "WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ " AND op_depth > 0 " \
""
-#define STMT_DELETE_WORKING_OP_DEPTH_ABOVE 27
-#define STMT_27_INFO {"STMT_DELETE_WORKING_OP_DEPTH_ABOVE", NULL}
+#define STMT_DELETE_BASE_RECURSIVE 27
+#define STMT_27_INFO {"STMT_DELETE_BASE_RECURSIVE", NULL}
#define STMT_27 \
"DELETE FROM nodes " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth > ?3 " \
+ "WHERE wc_id = ?1 AND (local_relpath = ?2 " \
+ " OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ " AND op_depth = 0 " \
""
-#define STMT_SELECT_LOCAL_RELPATH_OP_DEPTH 28
-#define STMT_28_INFO {"STMT_SELECT_LOCAL_RELPATH_OP_DEPTH", NULL}
+#define STMT_DELETE_WORKING_OP_DEPTH 28
+#define STMT_28_INFO {"STMT_DELETE_WORKING_OP_DEPTH", NULL}
#define STMT_28 \
- "SELECT local_relpath " \
- "FROM nodes " \
+ "DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = ?3 " \
""
-#define STMT_SELECT_CHILDREN_OP_DEPTH 29
-#define STMT_29_INFO {"STMT_SELECT_CHILDREN_OP_DEPTH", NULL}
+#define STMT_SELECT_LAYER_FOR_REPLACE 29
+#define STMT_29_INFO {"STMT_SELECT_LAYER_FOR_REPLACE", NULL}
#define STMT_29 \
+ "SELECT s.local_relpath, s.kind, " \
+ " (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (s.local_relpath) WHEN (s.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (s.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (s.local_relpath) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN '' WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((s.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN (?4) WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((s.local_relpath), LENGTH(?2)+1) END END) drp, 'normal' " \
+ "FROM nodes s " \
+ "WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 " \
+ "UNION ALL " \
+ "SELECT s.local_relpath, s.kind, " \
+ " (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (s.local_relpath) WHEN (s.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (s.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (s.local_relpath) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN '' WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((s.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((s.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(s.local_relpath) THEN (?4) WHEN SUBSTR((s.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((s.local_relpath), LENGTH(?2)+1) END END) drp, d.presence " \
+ "FROM nodes s " \
+ "LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5 " \
+ " AND d.local_relpath = drp " \
+ "WHERE s.wc_id = ?1 " \
+ " AND (((s.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((s.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ " AND s.op_depth = ?3 " \
+ "ORDER BY s.local_relpath " \
+ ""
+
+#define STMT_SELECT_DESCENDANTS_OP_DEPTH_RV 30
+#define STMT_30_INFO {"STMT_SELECT_DESCENDANTS_OP_DEPTH_RV", NULL}
+#define STMT_30 \
"SELECT local_relpath, kind " \
"FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
+ " AND presence in ('normal', 'incomplete') " \
"ORDER BY local_relpath DESC " \
""
-#define STMT_COPY_NODE_MOVE 30
-#define STMT_30_INFO {"STMT_COPY_NODE_MOVE", NULL}
-#define STMT_30 \
+#define STMT_COPY_NODE_MOVE 31
+#define STMT_31_INFO {"STMT_COPY_NODE_MOVE", NULL}
+#define STMT_31 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
" symlink_target, moved_here, moved_to ) " \
"SELECT " \
- " wc_id, ?4 , ?5 , ?6 , " \
- " repos_id, " \
- " repos_path, revision, presence, depth, kind, changed_revision, " \
- " changed_date, changed_author, checksum, properties, translated_size, " \
- " last_mod_time, symlink_target, 1, " \
- " (SELECT dst.moved_to FROM nodes AS dst " \
- " WHERE dst.wc_id = ?1 " \
- " AND dst.local_relpath = ?4 " \
- " AND dst.op_depth = ?5) " \
- "FROM nodes " \
- "WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
- ""
-
-#define STMT_SELECT_OP_DEPTH_CHILDREN 31
-#define STMT_31_INFO {"STMT_SELECT_OP_DEPTH_CHILDREN", NULL}
-#define STMT_31 \
+ " s.wc_id, ?4 , ?5 , ?6 , " \
+ " s.repos_id, " \
+ " s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision, " \
+ " s.changed_date, s.changed_author, s.checksum, s.properties, " \
+ " CASE WHEN d.checksum=s.checksum THEN d.translated_size END, " \
+ " CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END, " \
+ " s.symlink_target, 1, d.moved_to " \
+ "FROM nodes s " \
+ "LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5 " \
+ "WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 " \
+ ""
+
+#define STMT_SELECT_NO_LONGER_MOVED_RV 32
+#define STMT_32_INFO {"STMT_SELECT_NO_LONGER_MOVED_RV", NULL}
+#define STMT_32 \
+ "SELECT d.local_relpath, (CASE WHEN (?2) = '' THEN (CASE WHEN (?4) = '' THEN (d.local_relpath) WHEN (d.local_relpath) = '' THEN (?4) ELSE (?4) || '/' || (d.local_relpath) END) WHEN (?4) = '' THEN (CASE WHEN (?2) = '' THEN (d.local_relpath) WHEN SUBSTR((d.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(d.local_relpath) THEN '' WHEN SUBSTR((d.local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((d.local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((d.local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(d.local_relpath) THEN (?4) WHEN SUBSTR((d.local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?4) || SUBSTR((d.local_relpath), LENGTH(?2)+1) END END) srp, " \
+ " b.presence, b.op_depth " \
+ "FROM nodes d " \
+ "LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath " \
+ " AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x " \
+ " WHERE x.wc_id = ?1 " \
+ " AND x.local_relpath = b.local_relpath " \
+ " AND x.op_depth < ?3) " \
+ "WHERE d.wc_id = ?1 " \
+ " AND (((d.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((d.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ " AND d.op_depth = ?3 " \
+ " AND NOT EXISTS(SELECT * FROM nodes s " \
+ " WHERE s.wc_id = ?1 " \
+ " AND s.local_relpath = srp " \
+ " AND s.op_depth = ?5) " \
+ "ORDER BY d.local_relpath DESC " \
+ ""
+
+#define STMT_SELECT_OP_DEPTH_CHILDREN 33
+#define STMT_33_INFO {"STMT_SELECT_OP_DEPTH_CHILDREN", NULL}
+#define STMT_33 \
"SELECT local_relpath, kind FROM nodes " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
" AND op_depth = ?3 " \
" AND presence != 'base-deleted' " \
" AND file_external is NULL " \
+ "ORDER BY local_relpath " \
""
-#define STMT_SELECT_GE_OP_DEPTH_CHILDREN 32
-#define STMT_32_INFO {"STMT_SELECT_GE_OP_DEPTH_CHILDREN", NULL}
-#define STMT_32 \
+#define STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS 34
+#define STMT_34_INFO {"STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS", NULL}
+#define STMT_34 \
+ "SELECT local_relpath, kind FROM nodes " \
+ "WHERE wc_id = ?1 " \
+ " AND parent_relpath = ?2 " \
+ " AND op_depth = ?3 " \
+ " AND presence IN ('normal', 'incomplete') " \
+ "ORDER BY local_relpath " \
+ ""
+
+#define STMT_SELECT_GE_OP_DEPTH_CHILDREN 35
+#define STMT_35_INFO {"STMT_SELECT_GE_OP_DEPTH_CHILDREN", NULL}
+#define STMT_35 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
- " AND (op_depth > ?3 OR (op_depth = ?3 AND presence != 'base-deleted')) " \
+ " AND (op_depth > ?3 OR (op_depth = ?3 " \
+ " AND presence IN ('normal', 'incomplete'))) " \
"UNION ALL " \
"SELECT 1 FROM ACTUAL_NODE a " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
@@ -354,9 +414,9 @@
" WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath) " \
""
-#define STMT_DELETE_SHADOWED_RECURSIVE 33
-#define STMT_33_INFO {"STMT_DELETE_SHADOWED_RECURSIVE", NULL}
-#define STMT_33 \
+#define STMT_DELETE_SHADOWED_RECURSIVE 36
+#define STMT_36_INFO {"STMT_DELETE_SHADOWED_RECURSIVE", NULL}
+#define STMT_36 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -364,32 +424,33 @@
" OR (op_depth = ?3 AND presence = 'base-deleted')) " \
""
-#define STMT_CLEAR_MOVED_TO_FROM_DEST 34
-#define STMT_34_INFO {"STMT_CLEAR_MOVED_TO_FROM_DEST", NULL}
-#define STMT_34 \
+#define STMT_CLEAR_MOVED_TO_FROM_DEST 37
+#define STMT_37_INFO {"STMT_CLEAR_MOVED_TO_FROM_DEST", NULL}
+#define STMT_37 \
"UPDATE NODES SET moved_to = NULL " \
"WHERE wc_id = ?1 " \
" AND moved_to = ?2 " \
""
-#define STMT_SELECT_NOT_PRESENT_DESCENDANTS 35
-#define STMT_35_INFO {"STMT_SELECT_NOT_PRESENT_DESCENDANTS", NULL}
-#define STMT_35 \
+#define STMT_SELECT_NOT_PRESENT_DESCENDANTS 38
+#define STMT_38_INFO {"STMT_SELECT_NOT_PRESENT_DESCENDANTS", NULL}
+#define STMT_38 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND op_depth = ?3 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND presence = 'not-present' " \
""
-#define STMT_COMMIT_DESCENDANTS_TO_BASE 36
-#define STMT_36_INFO {"STMT_COMMIT_DESCENDANTS_TO_BASE", NULL}
-#define STMT_36 \
+#define STMT_COMMIT_DESCENDANTS_TO_BASE 39
+#define STMT_39_INFO {"STMT_COMMIT_DESCENDANTS_TO_BASE", NULL}
+#define STMT_39 \
"UPDATE NODES SET op_depth = 0, " \
" repos_id = ?4, " \
- " repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1), " \
+ " repos_path = (CASE WHEN (?2) = '' THEN (CASE WHEN (?5) = '' THEN (local_relpath) WHEN (local_relpath) = '' THEN (?5) ELSE (?5) || '/' || (local_relpath) END) WHEN (?5) = '' THEN (CASE WHEN (?2) = '' THEN (local_relpath) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN '' WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN (?5) WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?5) || SUBSTR((local_relpath), LENGTH(?2)+1) END END), " \
" revision = ?6, " \
" dav_cache = NULL, " \
" moved_here = NULL, " \
+ " moved_to = NULL, " \
" presence = CASE presence " \
" WHEN 'normal' THEN 'normal' " \
" WHEN 'excluded' THEN 'excluded' " \
@@ -400,67 +461,78 @@
" AND op_depth = ?3 " \
""
-#define STMT_SELECT_NODE_CHILDREN 37
-#define STMT_37_INFO {"STMT_SELECT_NODE_CHILDREN", NULL}
-#define STMT_37 \
- "SELECT local_relpath FROM nodes " \
+#define STMT_SELECT_NODE_CHILDREN 40
+#define STMT_40_INFO {"STMT_SELECT_NODE_CHILDREN", NULL}
+#define STMT_40 \
+ "SELECT DISTINCT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
+ "ORDER BY local_relpath " \
""
-#define STMT_SELECT_WORKING_CHILDREN 38
-#define STMT_38_INFO {"STMT_SELECT_WORKING_CHILDREN", NULL}
-#define STMT_38 \
- "SELECT local_relpath FROM nodes " \
+#define STMT_SELECT_WORKING_CHILDREN 41
+#define STMT_41_INFO {"STMT_SELECT_WORKING_CHILDREN", NULL}
+#define STMT_41 \
+ "SELECT DISTINCT local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
" AND (op_depth > (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
" OR " \
" (op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
- " AND presence != 'base-deleted')) " \
+ " AND presence IN ('normal', 'incomplete'))) " \
+ "ORDER BY local_relpath " \
""
-#define STMT_SELECT_NODE_PROPS 39
-#define STMT_39_INFO {"STMT_SELECT_NODE_PROPS", NULL}
-#define STMT_39 \
+#define STMT_SELECT_BASE_NOT_PRESENT_CHILDREN 42
+#define STMT_42_INFO {"STMT_SELECT_BASE_NOT_PRESENT_CHILDREN", NULL}
+#define STMT_42 \
+ "SELECT local_relpath FROM nodes " \
+ "WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 " \
+ " AND presence = 'not-present' " \
+ "ORDER BY local_relpath " \
+ ""
+
+#define STMT_SELECT_NODE_PROPS 43
+#define STMT_43_INFO {"STMT_SELECT_NODE_PROPS", NULL}
+#define STMT_43 \
"SELECT properties, presence FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
"ORDER BY op_depth DESC " \
""
-#define STMT_SELECT_ACTUAL_PROPS 40
-#define STMT_40_INFO {"STMT_SELECT_ACTUAL_PROPS", NULL}
-#define STMT_40 \
+#define STMT_SELECT_ACTUAL_PROPS 44
+#define STMT_44_INFO {"STMT_SELECT_ACTUAL_PROPS", NULL}
+#define STMT_44 \
"SELECT properties FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_UPDATE_ACTUAL_PROPS 41
-#define STMT_41_INFO {"STMT_UPDATE_ACTUAL_PROPS", NULL}
-#define STMT_41 \
+#define STMT_UPDATE_ACTUAL_PROPS 45
+#define STMT_45_INFO {"STMT_UPDATE_ACTUAL_PROPS", NULL}
+#define STMT_45 \
"UPDATE actual_node SET properties = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_INSERT_ACTUAL_PROPS 42
-#define STMT_42_INFO {"STMT_INSERT_ACTUAL_PROPS", NULL}
-#define STMT_42 \
+#define STMT_INSERT_ACTUAL_PROPS 46
+#define STMT_46_INFO {"STMT_INSERT_ACTUAL_PROPS", NULL}
+#define STMT_46 \
"INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
-#define STMT_INSERT_LOCK 43
-#define STMT_43_INFO {"STMT_INSERT_LOCK", NULL}
-#define STMT_43 \
+#define STMT_INSERT_LOCK 47
+#define STMT_47_INFO {"STMT_INSERT_LOCK", NULL}
+#define STMT_47 \
"INSERT OR REPLACE INTO lock " \
"(repos_id, repos_relpath, lock_token, lock_owner, lock_comment, " \
" lock_date) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6) " \
""
-#define STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE 44
-#define STMT_44_INFO {"STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE", NULL}
-#define STMT_44 \
+#define STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE 48
+#define STMT_48_INFO {"STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE", NULL}
+#define STMT_48 \
"SELECT nodes.repos_id, nodes.repos_path, lock_token " \
"FROM nodes " \
"LEFT JOIN lock ON nodes.repos_id = lock.repos_id " \
@@ -469,93 +541,73 @@
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_INSERT_WCROOT 45
-#define STMT_45_INFO {"STMT_INSERT_WCROOT", NULL}
-#define STMT_45 \
+#define STMT_INSERT_WCROOT 49
+#define STMT_49_INFO {"STMT_INSERT_WCROOT", NULL}
+#define STMT_49 \
"INSERT INTO wcroot (local_abspath) " \
"VALUES (?1) " \
""
-#define STMT_UPDATE_BASE_NODE_DAV_CACHE 46
-#define STMT_46_INFO {"STMT_UPDATE_BASE_NODE_DAV_CACHE", NULL}
-#define STMT_46 \
+#define STMT_UPDATE_BASE_NODE_DAV_CACHE 50
+#define STMT_50_INFO {"STMT_UPDATE_BASE_NODE_DAV_CACHE", NULL}
+#define STMT_50 \
"UPDATE nodes SET dav_cache = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_SELECT_BASE_DAV_CACHE 47
-#define STMT_47_INFO {"STMT_SELECT_BASE_DAV_CACHE", NULL}
-#define STMT_47 \
+#define STMT_SELECT_BASE_DAV_CACHE 51
+#define STMT_51_INFO {"STMT_SELECT_BASE_DAV_CACHE", NULL}
+#define STMT_51 \
"SELECT dav_cache FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_SELECT_DELETION_INFO 48
-#define STMT_48_INFO {"STMT_SELECT_DELETION_INFO", NULL}
-#define STMT_48 \
- "SELECT (SELECT b.presence FROM nodes AS b " \
- " WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0), " \
- " work.presence, work.op_depth " \
- "FROM nodes_current AS work " \
- "WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0 " \
- "LIMIT 1 " \
- ""
-
-#define STMT_SELECT_DELETION_INFO_SCAN 49
-#define STMT_49_INFO {"STMT_SELECT_DELETION_INFO_SCAN", NULL}
-#define STMT_49 \
- "SELECT (SELECT b.presence FROM nodes AS b " \
- " WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0), " \
- " work.presence, work.op_depth, moved.moved_to " \
- "FROM nodes_current AS work " \
- "LEFT OUTER JOIN nodes AS moved " \
- " ON moved.wc_id = work.wc_id " \
- " AND moved.local_relpath = work.local_relpath " \
- " AND moved.moved_to IS NOT NULL " \
- "WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0 " \
+#define STMT_SELECT_DELETION_INFO 52
+#define STMT_52_INFO {"STMT_SELECT_DELETION_INFO", NULL}
+#define STMT_52 \
+ "SELECT b.presence, w.presence, w.op_depth, w.moved_to " \
+ "FROM nodes w " \
+ "LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0 " \
+ "WHERE w.wc_id = ?1 AND w.local_relpath = ?2 " \
+ " AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
+ " WHERE d.wc_id = ?1 AND d.local_relpath = ?2 " \
+ " AND d.op_depth > 0) " \
"LIMIT 1 " \
""
-#define STMT_SELECT_MOVED_TO_NODE 50
-#define STMT_50_INFO {"STMT_SELECT_MOVED_TO_NODE", NULL}
-#define STMT_50 \
+#define STMT_SELECT_MOVED_TO_NODE 53
+#define STMT_53_INFO {"STMT_SELECT_MOVED_TO_NODE", NULL}
+#define STMT_53 \
"SELECT op_depth, moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL " \
"ORDER BY op_depth DESC " \
""
-#define STMT_SELECT_OP_DEPTH_MOVED_TO 51
-#define STMT_51_INFO {"STMT_SELECT_OP_DEPTH_MOVED_TO", NULL}
-#define STMT_51 \
- "SELECT op_depth, moved_to, repos_path, revision " \
+#define STMT_SELECT_OP_DEPTH_MOVED_TO 54
+#define STMT_54_INFO {"STMT_SELECT_OP_DEPTH_MOVED_TO", NULL}
+#define STMT_54 \
+ "SELECT op_depth, moved_to " \
"FROM nodes " \
- "WHERE wc_id = ?1 AND local_relpath = ?2 " \
- " AND op_depth <= (SELECT MIN(op_depth) FROM nodes " \
- " WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) " \
- "ORDER BY op_depth DESC " \
+ "WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 " \
+ " AND EXISTS(SELECT * from nodes " \
+ " WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
+ " AND presence IN ('normal', 'incomplete')) " \
+ "ORDER BY op_depth ASC " \
+ "LIMIT 1 " \
""
-#define STMT_SELECT_MOVED_TO 52
-#define STMT_52_INFO {"STMT_SELECT_MOVED_TO", NULL}
-#define STMT_52 \
+#define STMT_SELECT_MOVED_TO 55
+#define STMT_55_INFO {"STMT_SELECT_MOVED_TO", NULL}
+#define STMT_55 \
"SELECT moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_SELECT_MOVED_HERE 53
-#define STMT_53_INFO {"STMT_SELECT_MOVED_HERE", NULL}
-#define STMT_53 \
- "SELECT moved_here, presence, repos_path, revision " \
- "FROM nodes " \
- "WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3 " \
- "ORDER BY op_depth " \
- ""
-
-#define STMT_SELECT_MOVED_BACK 54
-#define STMT_54_INFO {"STMT_SELECT_MOVED_BACK", NULL}
-#define STMT_54 \
+#define STMT_SELECT_MOVED_BACK 56
+#define STMT_56_INFO {"STMT_SELECT_MOVED_BACK", NULL}
+#define STMT_56 \
"SELECT u.local_relpath, " \
" u.presence, u.repos_id, u.repos_path, u.revision, " \
" l.presence, l.repos_id, l.repos_path, l.revision, " \
@@ -581,81 +633,71 @@
" AND u.op_depth = ?4 " \
""
-#define STMT_DELETE_MOVED_BACK 55
-#define STMT_55_INFO {"STMT_DELETE_MOVED_BACK", NULL}
-#define STMT_55 \
- "DELETE FROM nodes " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 " \
- " OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth = ?3 " \
- ""
-
-#define STMT_DELETE_LOCK 56
-#define STMT_56_INFO {"STMT_DELETE_LOCK", NULL}
-#define STMT_56 \
+#define STMT_DELETE_LOCK 57
+#define STMT_57_INFO {"STMT_DELETE_LOCK", NULL}
+#define STMT_57 \
"DELETE FROM lock " \
"WHERE repos_id = ?1 AND repos_relpath = ?2 " \
""
-#define STMT_DELETE_LOCK_RECURSIVELY 57
-#define STMT_57_INFO {"STMT_DELETE_LOCK_RECURSIVELY", NULL}
-#define STMT_57 \
+#define STMT_DELETE_LOCK_RECURSIVELY 58
+#define STMT_58_INFO {"STMT_DELETE_LOCK_RECURSIVELY", NULL}
+#define STMT_58 \
"DELETE FROM lock " \
"WHERE repos_id = ?1 AND (repos_relpath = ?2 OR (((repos_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((repos_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE 58
-#define STMT_58_INFO {"STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE", NULL}
-#define STMT_58 \
+#define STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE 59
+#define STMT_59_INFO {"STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE", NULL}
+#define STMT_59 \
"UPDATE nodes SET dav_cache = NULL " \
"WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_RECURSIVE_UPDATE_NODE_REPO 59
-#define STMT_59_INFO {"STMT_RECURSIVE_UPDATE_NODE_REPO", NULL}
-#define STMT_59 \
+#define STMT_RECURSIVE_UPDATE_NODE_REPO 60
+#define STMT_60_INFO {"STMT_RECURSIVE_UPDATE_NODE_REPO", NULL}
+#define STMT_60 \
"UPDATE nodes SET repos_id = ?4, dav_cache = NULL " \
"WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3) " \
" OR (wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND repos_id = ?3) " \
""
-#define STMT_UPDATE_LOCK_REPOS_ID 60
-#define STMT_60_INFO {"STMT_UPDATE_LOCK_REPOS_ID", NULL}
-#define STMT_60 \
+#define STMT_UPDATE_LOCK_REPOS_ID 61
+#define STMT_61_INFO {"STMT_UPDATE_LOCK_REPOS_ID", NULL}
+#define STMT_61 \
"UPDATE lock SET repos_id = ?2 " \
"WHERE repos_id = ?1 " \
""
-#define STMT_UPDATE_NODE_FILEINFO 61
-#define STMT_61_INFO {"STMT_UPDATE_NODE_FILEINFO", NULL}
-#define STMT_61 \
+#define STMT_UPDATE_NODE_FILEINFO 62
+#define STMT_62_INFO {"STMT_UPDATE_NODE_FILEINFO", NULL}
+#define STMT_62 \
"UPDATE nodes SET translated_size = ?3, last_mod_time = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2) " \
""
-#define STMT_INSERT_ACTUAL_CONFLICT 62
-#define STMT_62_INFO {"STMT_INSERT_ACTUAL_CONFLICT", NULL}
-#define STMT_62 \
+#define STMT_INSERT_ACTUAL_CONFLICT 63
+#define STMT_63_INFO {"STMT_INSERT_ACTUAL_CONFLICT", NULL}
+#define STMT_63 \
"INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
-#define STMT_UPDATE_ACTUAL_CONFLICT 63
-#define STMT_63_INFO {"STMT_UPDATE_ACTUAL_CONFLICT", NULL}
-#define STMT_63 \
+#define STMT_UPDATE_ACTUAL_CONFLICT 64
+#define STMT_64_INFO {"STMT_UPDATE_ACTUAL_CONFLICT", NULL}
+#define STMT_64 \
"UPDATE actual_node SET conflict_data = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_UPDATE_ACTUAL_CHANGELISTS 64
-#define STMT_64_INFO {"STMT_UPDATE_ACTUAL_CHANGELISTS", NULL}
-#define STMT_64 \
+#define STMT_UPDATE_ACTUAL_CHANGELISTS 65
+#define STMT_65_INFO {"STMT_UPDATE_ACTUAL_CHANGELISTS", NULL}
+#define STMT_65 \
"UPDATE actual_node SET changelist = ?3 " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
@@ -665,16 +707,16 @@
" AND kind = 'file') " \
""
-#define STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST 65
-#define STMT_65_INFO {"STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST", NULL}
-#define STMT_65 \
+#define STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST 66
+#define STMT_66_INFO {"STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST", NULL}
+#define STMT_66 \
"UPDATE actual_node SET changelist = NULL " \
" WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_MARK_SKIPPED_CHANGELIST_DIRS 66
-#define STMT_66_INFO {"STMT_MARK_SKIPPED_CHANGELIST_DIRS", NULL}
-#define STMT_66 \
+#define STMT_MARK_SKIPPED_CHANGELIST_DIRS 67
+#define STMT_67_INFO {"STMT_MARK_SKIPPED_CHANGELIST_DIRS", NULL}
+#define STMT_67 \
"INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist) " \
"SELECT wc_id, local_relpath, 7, ?3 " \
"FROM targets_list " \
@@ -683,17 +725,17 @@
" AND kind = 'dir' " \
""
-#define STMT_RESET_ACTUAL_WITH_CHANGELIST 67
-#define STMT_67_INFO {"STMT_RESET_ACTUAL_WITH_CHANGELIST", NULL}
-#define STMT_67 \
+#define STMT_RESET_ACTUAL_WITH_CHANGELIST 68
+#define STMT_68_INFO {"STMT_RESET_ACTUAL_WITH_CHANGELIST", NULL}
+#define STMT_68 \
"REPLACE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath, changelist) " \
"VALUES (?1, ?2, ?3, ?4) " \
""
-#define STMT_CREATE_CHANGELIST_LIST 68
-#define STMT_68_INFO {"STMT_CREATE_CHANGELIST_LIST", NULL}
-#define STMT_68 \
+#define STMT_CREATE_CHANGELIST_LIST 69
+#define STMT_69_INFO {"STMT_CREATE_CHANGELIST_LIST", NULL}
+#define STMT_69 \
"DROP TABLE IF EXISTS changelist_list; " \
"CREATE TEMPORARY TABLE changelist_list ( " \
" wc_id INTEGER NOT NULL, " \
@@ -704,9 +746,9 @@
") " \
""
-#define STMT_CREATE_CHANGELIST_TRIGGER 69
-#define STMT_69_INFO {"STMT_CREATE_CHANGELIST_TRIGGER", NULL}
-#define STMT_69 \
+#define STMT_CREATE_CHANGELIST_TRIGGER 70
+#define STMT_70_INFO {"STMT_CREATE_CHANGELIST_TRIGGER", NULL}
+#define STMT_70 \
"DROP TRIGGER IF EXISTS trigger_changelist_list_change; " \
"CREATE TEMPORARY TRIGGER trigger_changelist_list_change " \
"BEFORE UPDATE ON actual_node " \
@@ -721,25 +763,25 @@
"END " \
""
-#define STMT_FINALIZE_CHANGELIST 70
-#define STMT_70_INFO {"STMT_FINALIZE_CHANGELIST", NULL}
-#define STMT_70 \
+#define STMT_FINALIZE_CHANGELIST 71
+#define STMT_71_INFO {"STMT_FINALIZE_CHANGELIST", NULL}
+#define STMT_71 \
"DROP TRIGGER trigger_changelist_list_change; " \
"DROP TABLE changelist_list; " \
"DROP TABLE targets_list " \
""
-#define STMT_SELECT_CHANGELIST_LIST 71
-#define STMT_71_INFO {"STMT_SELECT_CHANGELIST_LIST", NULL}
-#define STMT_71 \
+#define STMT_SELECT_CHANGELIST_LIST 72
+#define STMT_72_INFO {"STMT_SELECT_CHANGELIST_LIST", NULL}
+#define STMT_72 \
"SELECT wc_id, local_relpath, notify, changelist " \
"FROM changelist_list " \
"ORDER BY wc_id, local_relpath ASC, notify DESC " \
""
-#define STMT_CREATE_TARGETS_LIST 72
-#define STMT_72_INFO {"STMT_CREATE_TARGETS_LIST", NULL}
-#define STMT_72 \
+#define STMT_CREATE_TARGETS_LIST 73
+#define STMT_73_INFO {"STMT_CREATE_TARGETS_LIST", NULL}
+#define STMT_73 \
"DROP TABLE IF EXISTS targets_list; " \
"CREATE TEMPORARY TABLE targets_list ( " \
" wc_id INTEGER NOT NULL, " \
@@ -750,15 +792,15 @@
" ); " \
""
-#define STMT_DROP_TARGETS_LIST 73
-#define STMT_73_INFO {"STMT_DROP_TARGETS_LIST", NULL}
-#define STMT_73 \
+#define STMT_DROP_TARGETS_LIST 74
+#define STMT_74_INFO {"STMT_DROP_TARGETS_LIST", NULL}
+#define STMT_74 \
"DROP TABLE targets_list " \
""
-#define STMT_INSERT_TARGET 74
-#define STMT_74_INFO {"STMT_INSERT_TARGET", NULL}
-#define STMT_74 \
+#define STMT_INSERT_TARGET 75
+#define STMT_75_INFO {"STMT_INSERT_TARGET", NULL}
+#define STMT_75 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
@@ -766,9 +808,9 @@
" AND local_relpath = ?2 " \
""
-#define STMT_INSERT_TARGET_DEPTH_FILES 75
-#define STMT_75_INFO {"STMT_INSERT_TARGET_DEPTH_FILES", NULL}
-#define STMT_75 \
+#define STMT_INSERT_TARGET_DEPTH_FILES 76
+#define STMT_76_INFO {"STMT_INSERT_TARGET_DEPTH_FILES", NULL}
+#define STMT_76 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
@@ -777,9 +819,9 @@
" AND kind = 'file' " \
""
-#define STMT_INSERT_TARGET_DEPTH_IMMEDIATES 76
-#define STMT_76_INFO {"STMT_INSERT_TARGET_DEPTH_IMMEDIATES", NULL}
-#define STMT_76 \
+#define STMT_INSERT_TARGET_DEPTH_IMMEDIATES 77
+#define STMT_77_INFO {"STMT_INSERT_TARGET_DEPTH_IMMEDIATES", NULL}
+#define STMT_77 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
@@ -787,9 +829,9 @@
" AND parent_relpath = ?2 " \
""
-#define STMT_INSERT_TARGET_DEPTH_INFINITY 77
-#define STMT_77_INFO {"STMT_INSERT_TARGET_DEPTH_INFINITY", NULL}
-#define STMT_77 \
+#define STMT_INSERT_TARGET_DEPTH_INFINITY 78
+#define STMT_78_INFO {"STMT_INSERT_TARGET_DEPTH_INFINITY", NULL}
+#define STMT_78 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT wc_id, local_relpath, parent_relpath, kind " \
"FROM nodes_current " \
@@ -797,9 +839,9 @@
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_INSERT_TARGET_WITH_CHANGELIST 78
-#define STMT_78_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST", NULL}
-#define STMT_78 \
+#define STMT_INSERT_TARGET_WITH_CHANGELIST 79
+#define STMT_79_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST", NULL}
+#define STMT_79 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
@@ -809,9 +851,9 @@
" AND A.changelist = ?3 " \
""
-#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES 79
-#define STMT_79_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES", NULL}
-#define STMT_79 \
+#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES 80
+#define STMT_80_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES", NULL}
+#define STMT_80 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
@@ -822,9 +864,9 @@
" AND A.changelist = ?3 " \
""
-#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES 80
-#define STMT_80_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES", NULL}
-#define STMT_80 \
+#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES 81
+#define STMT_81_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES", NULL}
+#define STMT_81 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
@@ -834,9 +876,9 @@
" AND A.changelist = ?3 " \
""
-#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY 81
-#define STMT_81_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY", NULL}
-#define STMT_81 \
+#define STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY 82
+#define STMT_82_INFO {"STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY", NULL}
+#define STMT_82 \
"INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) " \
"SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind " \
" FROM actual_node AS A JOIN nodes_current AS N " \
@@ -846,18 +888,28 @@
" AND A.changelist = ?3 " \
""
-#define STMT_INSERT_ACTUAL_EMPTIES 82
-#define STMT_82_INFO {"STMT_INSERT_ACTUAL_EMPTIES", NULL}
-#define STMT_82 \
+#define STMT_INSERT_ACTUAL_EMPTIES 83
+#define STMT_83_INFO {"STMT_INSERT_ACTUAL_EMPTIES", NULL}
+#define STMT_83 \
"INSERT OR IGNORE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath) " \
"SELECT wc_id, local_relpath, parent_relpath " \
"FROM targets_list " \
""
-#define STMT_DELETE_ACTUAL_EMPTY 83
-#define STMT_83_INFO {"STMT_DELETE_ACTUAL_EMPTY", NULL}
-#define STMT_83 \
+#define STMT_INSERT_ACTUAL_EMPTIES_FILES 84
+#define STMT_84_INFO {"STMT_INSERT_ACTUAL_EMPTIES_FILES", NULL}
+#define STMT_84 \
+ "INSERT OR IGNORE INTO actual_node ( " \
+ " wc_id, local_relpath, parent_relpath) " \
+ "SELECT wc_id, local_relpath, parent_relpath " \
+ "FROM targets_list " \
+ "WHERE kind='file' " \
+ ""
+
+#define STMT_DELETE_ACTUAL_EMPTY 85
+#define STMT_85_INFO {"STMT_DELETE_ACTUAL_EMPTY", NULL}
+#define STMT_85 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND properties IS NULL " \
@@ -869,12 +921,12 @@
" AND left_checksum IS NULL " \
""
-#define STMT_DELETE_ACTUAL_EMPTIES 84
-#define STMT_84_INFO {"STMT_DELETE_ACTUAL_EMPTIES", NULL}
-#define STMT_84 \
+#define STMT_DELETE_ACTUAL_EMPTIES 86
+#define STMT_86_INFO {"STMT_DELETE_ACTUAL_EMPTIES", NULL}
+#define STMT_86 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
- " AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND properties IS NULL " \
" AND conflict_data IS NULL " \
" AND changelist IS NULL " \
@@ -884,25 +936,25 @@
" AND left_checksum IS NULL " \
""
-#define STMT_DELETE_BASE_NODE 85
-#define STMT_85_INFO {"STMT_DELETE_BASE_NODE", NULL}
-#define STMT_85 \
+#define STMT_DELETE_BASE_NODE 87
+#define STMT_87_INFO {"STMT_DELETE_BASE_NODE", NULL}
+#define STMT_87 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_DELETE_WORKING_NODE 86
-#define STMT_86_INFO {"STMT_DELETE_WORKING_NODE", NULL}
-#define STMT_86 \
+#define STMT_DELETE_WORKING_NODE 88
+#define STMT_88_INFO {"STMT_DELETE_WORKING_NODE", NULL}
+#define STMT_88 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MAX(op_depth) FROM nodes " \
" WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0) " \
""
-#define STMT_DELETE_LOWEST_WORKING_NODE 87
-#define STMT_87_INFO {"STMT_DELETE_LOWEST_WORKING_NODE", NULL}
-#define STMT_87 \
+#define STMT_DELETE_LOWEST_WORKING_NODE 89
+#define STMT_89_INFO {"STMT_DELETE_LOWEST_WORKING_NODE", NULL}
+#define STMT_89 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
" AND op_depth = (SELECT MIN(op_depth) FROM nodes " \
@@ -910,16 +962,16 @@
" AND presence = 'base-deleted' " \
""
-#define STMT_DELETE_NODE_ALL_LAYERS 88
-#define STMT_88_INFO {"STMT_DELETE_NODE_ALL_LAYERS", NULL}
-#define STMT_88 \
+#define STMT_DELETE_NODE_ALL_LAYERS 90
+#define STMT_90_INFO {"STMT_DELETE_NODE_ALL_LAYERS", NULL}
+#define STMT_90 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE 89
-#define STMT_89_INFO {"STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE", NULL}
-#define STMT_89 \
+#define STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE 91
+#define STMT_91_INFO {"STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE", NULL}
+#define STMT_91 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -927,25 +979,25 @@
" AND op_depth >= ?3 " \
""
-#define STMT_DELETE_ACTUAL_NODE 90
-#define STMT_90_INFO {"STMT_DELETE_ACTUAL_NODE", NULL}
-#define STMT_90 \
+#define STMT_DELETE_ACTUAL_NODE 92
+#define STMT_92_INFO {"STMT_DELETE_ACTUAL_NODE", NULL}
+#define STMT_92 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_DELETE_ACTUAL_NODE_RECURSIVE 91
-#define STMT_91_INFO {"STMT_DELETE_ACTUAL_NODE_RECURSIVE", NULL}
-#define STMT_91 \
+#define STMT_DELETE_ACTUAL_NODE_RECURSIVE 93
+#define STMT_93_INFO {"STMT_DELETE_ACTUAL_NODE_RECURSIVE", NULL}
+#define STMT_93 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST 92
-#define STMT_92_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
-#define STMT_92 \
+#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST 94
+#define STMT_94_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
+#define STMT_94 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
@@ -955,9 +1007,9 @@
" AND c.kind = 'file')) " \
""
-#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 93
-#define STMT_93_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
-#define STMT_93 \
+#define STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 95
+#define STMT_95_INFO {"STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
+#define STMT_95 \
"DELETE FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -969,9 +1021,9 @@
" AND c.kind = 'file')) " \
""
-#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST 94
-#define STMT_94_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
-#define STMT_94 \
+#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST 96
+#define STMT_96_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST", NULL}
+#define STMT_96 \
"UPDATE actual_node " \
"SET properties = NULL, " \
" text_mod = NULL, " \
@@ -983,9 +1035,23 @@
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 95
-#define STMT_95_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
-#define STMT_95 \
+#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT 97
+#define STMT_97_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT", NULL}
+#define STMT_97 \
+ "UPDATE actual_node " \
+ "SET properties = NULL, " \
+ " text_mod = NULL, " \
+ " tree_conflict_data = NULL, " \
+ " older_checksum = NULL, " \
+ " left_checksum = NULL, " \
+ " right_checksum = NULL, " \
+ " changelist = NULL " \
+ "WHERE wc_id = ?1 AND local_relpath = ?2 " \
+ ""
+
+#define STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 98
+#define STMT_98_INFO {"STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE", NULL}
+#define STMT_98 \
"UPDATE actual_node " \
"SET properties = NULL, " \
" text_mod = NULL, " \
@@ -999,108 +1065,109 @@
" OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_UPDATE_NODE_BASE_DEPTH 96
-#define STMT_96_INFO {"STMT_UPDATE_NODE_BASE_DEPTH", NULL}
-#define STMT_96 \
+#define STMT_UPDATE_NODE_BASE_DEPTH 99
+#define STMT_99_INFO {"STMT_UPDATE_NODE_BASE_DEPTH", NULL}
+#define STMT_99 \
"UPDATE nodes SET depth = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
" AND kind='dir' " \
+ " AND presence IN ('normal', 'incomplete') " \
""
-#define STMT_UPDATE_NODE_BASE_PRESENCE 97
-#define STMT_97_INFO {"STMT_UPDATE_NODE_BASE_PRESENCE", NULL}
-#define STMT_97 \
+#define STMT_UPDATE_NODE_BASE_PRESENCE 100
+#define STMT_100_INFO {"STMT_UPDATE_NODE_BASE_PRESENCE", NULL}
+#define STMT_100 \
"UPDATE nodes SET presence = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH 98
-#define STMT_98_INFO {"STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH", NULL}
-#define STMT_98 \
+#define STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH 101
+#define STMT_101_INFO {"STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH", NULL}
+#define STMT_101 \
"UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_LOOK_FOR_WORK 99
-#define STMT_99_INFO {"STMT_LOOK_FOR_WORK", NULL}
-#define STMT_99 \
+#define STMT_LOOK_FOR_WORK 102
+#define STMT_102_INFO {"STMT_LOOK_FOR_WORK", NULL}
+#define STMT_102 \
"SELECT id FROM work_queue LIMIT 1 " \
""
-#define STMT_INSERT_WORK_ITEM 100
-#define STMT_100_INFO {"STMT_INSERT_WORK_ITEM", NULL}
-#define STMT_100 \
+#define STMT_INSERT_WORK_ITEM 103
+#define STMT_103_INFO {"STMT_INSERT_WORK_ITEM", NULL}
+#define STMT_103 \
"INSERT INTO work_queue (work) VALUES (?1) " \
""
-#define STMT_SELECT_WORK_ITEM 101
-#define STMT_101_INFO {"STMT_SELECT_WORK_ITEM", NULL}
-#define STMT_101 \
+#define STMT_SELECT_WORK_ITEM 104
+#define STMT_104_INFO {"STMT_SELECT_WORK_ITEM", NULL}
+#define STMT_104 \
"SELECT id, work FROM work_queue ORDER BY id LIMIT 1 " \
""
-#define STMT_DELETE_WORK_ITEM 102
-#define STMT_102_INFO {"STMT_DELETE_WORK_ITEM", NULL}
-#define STMT_102 \
+#define STMT_DELETE_WORK_ITEM 105
+#define STMT_105_INFO {"STMT_DELETE_WORK_ITEM", NULL}
+#define STMT_105 \
"DELETE FROM work_queue WHERE id = ?1 " \
""
-#define STMT_INSERT_OR_IGNORE_PRISTINE 103
-#define STMT_103_INFO {"STMT_INSERT_OR_IGNORE_PRISTINE", NULL}
-#define STMT_103 \
+#define STMT_INSERT_OR_IGNORE_PRISTINE 106
+#define STMT_106_INFO {"STMT_INSERT_OR_IGNORE_PRISTINE", NULL}
+#define STMT_106 \
"INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) " \
"VALUES (?1, ?2, ?3, 0) " \
""
-#define STMT_INSERT_PRISTINE 104
-#define STMT_104_INFO {"STMT_INSERT_PRISTINE", NULL}
-#define STMT_104 \
+#define STMT_INSERT_PRISTINE 107
+#define STMT_107_INFO {"STMT_INSERT_PRISTINE", NULL}
+#define STMT_107 \
"INSERT INTO pristine (checksum, md5_checksum, size, refcount) " \
"VALUES (?1, ?2, ?3, 0) " \
""
-#define STMT_SELECT_PRISTINE 105
-#define STMT_105_INFO {"STMT_SELECT_PRISTINE", NULL}
-#define STMT_105 \
+#define STMT_SELECT_PRISTINE 108
+#define STMT_108_INFO {"STMT_SELECT_PRISTINE", NULL}
+#define STMT_108 \
"SELECT md5_checksum " \
"FROM pristine " \
"WHERE checksum = ?1 " \
""
-#define STMT_SELECT_PRISTINE_SIZE 106
-#define STMT_106_INFO {"STMT_SELECT_PRISTINE_SIZE", NULL}
-#define STMT_106 \
+#define STMT_SELECT_PRISTINE_SIZE 109
+#define STMT_109_INFO {"STMT_SELECT_PRISTINE_SIZE", NULL}
+#define STMT_109 \
"SELECT size " \
"FROM pristine " \
"WHERE checksum = ?1 LIMIT 1 " \
""
-#define STMT_SELECT_PRISTINE_BY_MD5 107
-#define STMT_107_INFO {"STMT_SELECT_PRISTINE_BY_MD5", NULL}
-#define STMT_107 \
+#define STMT_SELECT_PRISTINE_BY_MD5 110
+#define STMT_110_INFO {"STMT_SELECT_PRISTINE_BY_MD5", NULL}
+#define STMT_110 \
"SELECT checksum " \
"FROM pristine " \
"WHERE md5_checksum = ?1 " \
""
-#define STMT_SELECT_UNREFERENCED_PRISTINES 108
-#define STMT_108_INFO {"STMT_SELECT_UNREFERENCED_PRISTINES", NULL}
-#define STMT_108 \
+#define STMT_SELECT_UNREFERENCED_PRISTINES 111
+#define STMT_111_INFO {"STMT_SELECT_UNREFERENCED_PRISTINES", NULL}
+#define STMT_111 \
"SELECT checksum " \
"FROM pristine " \
"WHERE refcount = 0 " \
""
-#define STMT_DELETE_PRISTINE_IF_UNREFERENCED 109
-#define STMT_109_INFO {"STMT_DELETE_PRISTINE_IF_UNREFERENCED", NULL}
-#define STMT_109 \
+#define STMT_DELETE_PRISTINE_IF_UNREFERENCED 112
+#define STMT_112_INFO {"STMT_DELETE_PRISTINE_IF_UNREFERENCED", NULL}
+#define STMT_112 \
"DELETE FROM pristine " \
"WHERE checksum = ?1 AND refcount = 0 " \
""
-#define STMT_SELECT_COPY_PRISTINES 110
-#define STMT_110_INFO {"STMT_SELECT_COPY_PRISTINES", NULL}
-#define STMT_110 \
+#define STMT_SELECT_COPY_PRISTINES 113
+#define STMT_113_INFO {"STMT_SELECT_COPY_PRISTINES", NULL}
+#define STMT_113 \
"SELECT n.checksum, md5_checksum, size " \
"FROM nodes_current n " \
"LEFT JOIN pristine p ON n.checksum = p.checksum " \
@@ -1118,62 +1185,73 @@
" AND n.checksum IS NOT NULL " \
""
-#define STMT_VACUUM 111
-#define STMT_111_INFO {"STMT_VACUUM", NULL}
-#define STMT_111 \
+#define STMT_VACUUM 114
+#define STMT_114_INFO {"STMT_VACUUM", NULL}
+#define STMT_114 \
"VACUUM " \
""
-#define STMT_SELECT_CONFLICT_VICTIMS 112
-#define STMT_112_INFO {"STMT_SELECT_CONFLICT_VICTIMS", NULL}
-#define STMT_112 \
+#define STMT_SELECT_CONFLICT_VICTIMS 115
+#define STMT_115_INFO {"STMT_SELECT_CONFLICT_VICTIMS", NULL}
+#define STMT_115 \
"SELECT local_relpath, conflict_data " \
"FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND " \
" NOT (conflict_data IS NULL) " \
""
-#define STMT_INSERT_WC_LOCK 113
-#define STMT_113_INFO {"STMT_INSERT_WC_LOCK", NULL}
-#define STMT_113 \
+#define STMT_INSERT_WC_LOCK 116
+#define STMT_116_INFO {"STMT_INSERT_WC_LOCK", NULL}
+#define STMT_116 \
"INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels) " \
"VALUES (?1, ?2, ?3) " \
""
-#define STMT_SELECT_WC_LOCK 114
-#define STMT_114_INFO {"STMT_SELECT_WC_LOCK", NULL}
-#define STMT_114 \
+#define STMT_SELECT_WC_LOCK 117
+#define STMT_117_INFO {"STMT_SELECT_WC_LOCK", NULL}
+#define STMT_117 \
"SELECT locked_levels FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
""
-#define STMT_SELECT_ANCESTOR_WCLOCKS 115
-#define STMT_115_INFO {"STMT_SELECT_ANCESTOR_WCLOCKS", NULL}
-#define STMT_115 \
+#define STMT_SELECT_ANCESTOR_WCLOCKS 118
+#define STMT_118_INFO {"STMT_SELECT_ANCESTOR_WCLOCKS", NULL}
+#define STMT_118 \
"SELECT local_dir_relpath, locked_levels FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2) " \
" OR local_dir_relpath = '') " \
""
-#define STMT_DELETE_WC_LOCK 116
-#define STMT_116_INFO {"STMT_DELETE_WC_LOCK", NULL}
-#define STMT_116 \
+#define STMT_DELETE_WC_LOCK 119
+#define STMT_119_INFO {"STMT_DELETE_WC_LOCK", NULL}
+#define STMT_119 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
""
-#define STMT_FIND_WC_LOCK 117
-#define STMT_117_INFO {"STMT_FIND_WC_LOCK", NULL}
-#define STMT_117 \
+#define STMT_FIND_WC_LOCK 120
+#define STMT_120_INFO {"STMT_FIND_WC_LOCK", NULL}
+#define STMT_120 \
"SELECT local_dir_relpath FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND (((local_dir_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_dir_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_DELETE_WC_LOCK_ORPHAN 118
-#define STMT_118_INFO {"STMT_DELETE_WC_LOCK_ORPHAN", NULL}
-#define STMT_118 \
+#define STMT_FIND_CONFLICT_DESCENDANT 121
+#define STMT_121_INFO {"STMT_FIND_CONFLICT_DESCENDANT", NULL}
+#define STMT_121 \
+ "SELECT 1 FROM actual_node " \
+ "WHERE wc_id = ?1 " \
+ " AND local_relpath > (?2 || '/') " \
+ " AND local_relpath < (?2 || '0') " \
+ " AND conflict_data IS NOT NULL " \
+ "LIMIT 1 " \
+ ""
+
+#define STMT_DELETE_WC_LOCK_ORPHAN 122
+#define STMT_122_INFO {"STMT_DELETE_WC_LOCK_ORPHAN", NULL}
+#define STMT_122 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 AND local_dir_relpath = ?2 " \
"AND NOT EXISTS (SELECT 1 FROM nodes " \
@@ -1181,9 +1259,9 @@
" AND nodes.local_relpath = wc_lock.local_dir_relpath) " \
""
-#define STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE 119
-#define STMT_119_INFO {"STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE", NULL}
-#define STMT_119 \
+#define STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE 123
+#define STMT_123_INFO {"STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE", NULL}
+#define STMT_123 \
"DELETE FROM wc_lock " \
"WHERE wc_id = ?1 " \
" AND (local_dir_relpath = ?2 " \
@@ -1193,9 +1271,9 @@
" AND nodes.local_relpath = wc_lock.local_dir_relpath) " \
""
-#define STMT_APPLY_CHANGES_TO_BASE_NODE 120
-#define STMT_120_INFO {"STMT_APPLY_CHANGES_TO_BASE_NODE", NULL}
-#define STMT_120 \
+#define STMT_APPLY_CHANGES_TO_BASE_NODE 124
+#define STMT_124_INFO {"STMT_APPLY_CHANGES_TO_BASE_NODE", NULL}
+#define STMT_124 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
@@ -1209,77 +1287,70 @@
" AND op_depth = 0)) " \
""
-#define STMT_INSTALL_WORKING_NODE_FOR_DELETE 121
-#define STMT_121_INFO {"STMT_INSTALL_WORKING_NODE_FOR_DELETE", NULL}
-#define STMT_121 \
- "INSERT OR REPLACE INTO nodes ( " \
+#define STMT_INSTALL_WORKING_NODE_FOR_DELETE 125
+#define STMT_125_INFO {"STMT_INSTALL_WORKING_NODE_FOR_DELETE", NULL}
+#define STMT_125 \
+ "INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, " \
" parent_relpath, presence, kind) " \
"VALUES(?1, ?2, ?3, ?4, 'base-deleted', ?5) " \
""
-#define STMT_DELETE_NO_LOWER_LAYER 122
-#define STMT_122_INFO {"STMT_DELETE_NO_LOWER_LAYER", NULL}
-#define STMT_122 \
- "DELETE FROM nodes " \
- " WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth = ?3 " \
- " AND NOT EXISTS (SELECT 1 FROM nodes n " \
- " WHERE n.wc_id = ?1 " \
- " AND n.local_relpath = nodes.local_relpath " \
- " AND n.op_depth = ?4 " \
- " AND n.presence IN ('normal', 'incomplete')) " \
- ""
-
-#define STMT_REPLACE_WITH_BASE_DELETED 123
-#define STMT_123_INFO {"STMT_REPLACE_WITH_BASE_DELETED", NULL}
-#define STMT_123 \
+#define STMT_REPLACE_WITH_BASE_DELETED 126
+#define STMT_126_INFO {"STMT_REPLACE_WITH_BASE_DELETED", NULL}
+#define STMT_126 \
"INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath, " \
" kind, moved_to, presence) " \
"SELECT wc_id, local_relpath, op_depth, parent_relpath, " \
" kind, moved_to, 'base-deleted' " \
" FROM nodes " \
" WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ " AND local_relpath = ?2 " \
" AND op_depth = ?3 " \
""
-#define STMT_INSERT_DELETE_FROM_NODE_RECURSIVE 124
-#define STMT_124_INFO {"STMT_INSERT_DELETE_FROM_NODE_RECURSIVE", NULL}
-#define STMT_124 \
+#define STMT_INSERT_DELETE_FROM_NODE_RECURSIVE 127
+#define STMT_127_INFO {"STMT_INSERT_DELETE_FROM_NODE_RECURSIVE", NULL}
+#define STMT_127 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, presence, kind) " \
"SELECT wc_id, local_relpath, ?4 , parent_relpath, 'base-deleted', " \
" kind " \
"FROM nodes " \
+ "WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
+ "UNION ALL " \
+ "SELECT wc_id, local_relpath, ?4 , parent_relpath, 'base-deleted', " \
+ " kind " \
+ "FROM nodes " \
"WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 " \
- " OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ " AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
" AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'server-excluded') " \
" AND file_external IS NULL " \
+ "ORDER BY local_relpath " \
""
-#define STMT_INSERT_WORKING_NODE_FROM_BASE_COPY 125
-#define STMT_125_INFO {"STMT_INSERT_WORKING_NODE_FROM_BASE_COPY", NULL}
-#define STMT_125 \
- "INSERT INTO nodes ( " \
+#define STMT_INSERT_WORKING_NODE_FROM_BASE_COPY 128
+#define STMT_128_INFO {"STMT_INSERT_WORKING_NODE_FROM_BASE_COPY", NULL}
+#define STMT_128 \
+ "INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
" revision, presence, depth, kind, changed_revision, changed_date, " \
" changed_author, checksum, properties, translated_size, last_mod_time, " \
- " symlink_target ) " \
+ " symlink_target, moved_to ) " \
"SELECT wc_id, local_relpath, ?3 , parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, kind, changed_revision, " \
" changed_date, changed_author, checksum, properties, translated_size, " \
- " last_mod_time, symlink_target " \
+ " last_mod_time, symlink_target, " \
+ " (SELECT moved_to FROM nodes " \
+ " WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to " \
"FROM nodes " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_INSERT_DELETE_FROM_BASE 126
-#define STMT_126_INFO {"STMT_INSERT_DELETE_FROM_BASE", NULL}
-#define STMT_126 \
+#define STMT_INSERT_DELETE_FROM_BASE 129
+#define STMT_129_INFO {"STMT_INSERT_DELETE_FROM_BASE", NULL}
+#define STMT_129 \
"INSERT INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, presence, kind) " \
"SELECT wc_id, local_relpath, ?3 , parent_relpath, " \
@@ -1288,34 +1359,52 @@
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE 127
-#define STMT_127_INFO {"STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE", NULL}
-#define STMT_127 \
+#define STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE 130
+#define STMT_130_INFO {"STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE", NULL}
+#define STMT_130 \
"UPDATE nodes SET op_depth = ?3 + 1 " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth = ?3 " \
""
-#define STMT_UPDATE_OP_DEPTH_RECURSIVE 128
-#define STMT_128_INFO {"STMT_UPDATE_OP_DEPTH_RECURSIVE", NULL}
-#define STMT_128 \
- "UPDATE nodes SET op_depth = ?4, moved_here = NULL " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth = ?3 " \
+#define STMT_COPY_OP_DEPTH_RECURSIVE 131
+#define STMT_131_INFO {"STMT_COPY_OP_DEPTH_RECURSIVE", NULL}
+#define STMT_131 \
+ "INSERT INTO nodes ( " \
+ " wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, " \
+ " revision, presence, depth, kind, changed_revision, changed_date, " \
+ " changed_author, checksum, properties, translated_size, last_mod_time, " \
+ " symlink_target, moved_here, moved_to ) " \
+ "SELECT " \
+ " wc_id, local_relpath, ?4, parent_relpath, repos_id, " \
+ " repos_path, revision, presence, depth, kind, changed_revision, " \
+ " changed_date, changed_author, checksum, properties, translated_size, " \
+ " last_mod_time, symlink_target, NULL, NULL " \
+ "FROM nodes " \
+ "WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2 " \
+ "UNION ALL " \
+ "SELECT " \
+ " wc_id, local_relpath, ?4, parent_relpath, repos_id, " \
+ " repos_path, revision, presence, depth, kind, changed_revision, " \
+ " changed_date, changed_author, checksum, properties, translated_size, " \
+ " last_mod_time, symlink_target, NULL, NULL " \
+ "FROM nodes " \
+ "WHERE wc_id = ?1 AND op_depth = ?3 " \
+ " AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ "ORDER BY local_relpath " \
""
-#define STMT_DOES_NODE_EXIST 129
-#define STMT_129_INFO {"STMT_DOES_NODE_EXIST", NULL}
-#define STMT_129 \
+#define STMT_DOES_NODE_EXIST 132
+#define STMT_132_INFO {"STMT_DOES_NODE_EXIST", NULL}
+#define STMT_132 \
"SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 " \
"LIMIT 1 " \
""
-#define STMT_HAS_SERVER_EXCLUDED_DESCENDANTS 130
-#define STMT_130_INFO {"STMT_HAS_SERVER_EXCLUDED_DESCENDANTS", NULL}
-#define STMT_130 \
+#define STMT_HAS_SERVER_EXCLUDED_DESCENDANTS 133
+#define STMT_133_INFO {"STMT_HAS_SERVER_EXCLUDED_DESCENDANTS", NULL}
+#define STMT_133 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -1323,9 +1412,9 @@
"LIMIT 1 " \
""
-#define STMT_SELECT_ALL_EXCLUDED_DESCENDANTS 131
-#define STMT_131_INFO {"STMT_SELECT_ALL_EXCLUDED_DESCENDANTS", NULL}
-#define STMT_131 \
+#define STMT_SELECT_ALL_EXCLUDED_DESCENDANTS 134
+#define STMT_134_INFO {"STMT_SELECT_ALL_EXCLUDED_DESCENDANTS", NULL}
+#define STMT_134 \
"SELECT local_relpath FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -1333,9 +1422,9 @@
" AND (presence = 'server-excluded' OR presence = 'excluded') " \
""
-#define STMT_INSERT_WORKING_NODE_COPY_FROM 132
-#define STMT_132_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM", NULL}
-#define STMT_132 \
+#define STMT_INSERT_WORKING_NODE_COPY_FROM 135
+#define STMT_135_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM", NULL}
+#define STMT_135 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, moved_here, kind, changed_revision, " \
@@ -1354,9 +1443,9 @@
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH 133
-#define STMT_133_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH", NULL}
-#define STMT_133 \
+#define STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH 136
+#define STMT_136_INFO {"STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH", NULL}
+#define STMT_136 \
"INSERT OR REPLACE INTO nodes ( " \
" wc_id, local_relpath, op_depth, parent_relpath, repos_id, " \
" repos_path, revision, presence, depth, moved_here, kind, changed_revision, " \
@@ -1375,49 +1464,49 @@
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7 " \
""
-#define STMT_UPDATE_BASE_REVISION 134
-#define STMT_134_INFO {"STMT_UPDATE_BASE_REVISION", NULL}
-#define STMT_134 \
+#define STMT_UPDATE_BASE_REVISION 137
+#define STMT_137_INFO {"STMT_UPDATE_BASE_REVISION", NULL}
+#define STMT_137 \
"UPDATE nodes SET revision = ?3 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_UPDATE_BASE_REPOS 135
-#define STMT_135_INFO {"STMT_UPDATE_BASE_REPOS", NULL}
-#define STMT_135 \
+#define STMT_UPDATE_BASE_REPOS 138
+#define STMT_138_INFO {"STMT_UPDATE_BASE_REPOS", NULL}
+#define STMT_138 \
"UPDATE nodes SET repos_id = ?3, repos_path = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 " \
""
-#define STMT_ACTUAL_HAS_CHILDREN 136
-#define STMT_136_INFO {"STMT_ACTUAL_HAS_CHILDREN", NULL}
-#define STMT_136 \
+#define STMT_ACTUAL_HAS_CHILDREN 139
+#define STMT_139_INFO {"STMT_ACTUAL_HAS_CHILDREN", NULL}
+#define STMT_139 \
"SELECT 1 FROM actual_node " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 " \
"LIMIT 1 " \
""
-#define STMT_INSERT_EXTERNAL 137
-#define STMT_137_INFO {"STMT_INSERT_EXTERNAL", NULL}
-#define STMT_137 \
+#define STMT_INSERT_EXTERNAL 140
+#define STMT_140_INFO {"STMT_INSERT_EXTERNAL", NULL}
+#define STMT_140 \
"INSERT OR REPLACE INTO externals ( " \
" wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath, " \
" repos_id, def_repos_relpath, def_operational_revision, def_revision) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10) " \
""
-#define STMT_SELECT_EXTERNAL_INFO 138
-#define STMT_138_INFO {"STMT_SELECT_EXTERNAL_INFO", NULL}
-#define STMT_138 \
+#define STMT_SELECT_EXTERNAL_INFO 141
+#define STMT_141_INFO {"STMT_SELECT_EXTERNAL_INFO", NULL}
+#define STMT_141 \
"SELECT presence, kind, def_local_relpath, repos_id, " \
" def_repos_relpath, def_operational_revision, def_revision " \
"FROM externals WHERE wc_id = ?1 AND local_relpath = ?2 " \
"LIMIT 1 " \
""
-#define STMT_DELETE_FILE_EXTERNALS 139
-#define STMT_139_INFO {"STMT_DELETE_FILE_EXTERNALS", NULL}
-#define STMT_139 \
+#define STMT_DELETE_FILE_EXTERNALS 142
+#define STMT_142_INFO {"STMT_DELETE_FILE_EXTERNALS", NULL}
+#define STMT_142 \
"DELETE FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -1425,26 +1514,26 @@
" AND file_external IS NOT NULL " \
""
-#define STMT_DELETE_FILE_EXTERNAL_REGISTATIONS 140
-#define STMT_140_INFO {"STMT_DELETE_FILE_EXTERNAL_REGISTATIONS", NULL}
-#define STMT_140 \
+#define STMT_DELETE_FILE_EXTERNAL_REGISTATIONS 143
+#define STMT_143_INFO {"STMT_DELETE_FILE_EXTERNAL_REGISTATIONS", NULL}
+#define STMT_143 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND kind != 'dir' " \
""
-#define STMT_DELETE_EXTERNAL_REGISTATIONS 141
-#define STMT_141_INFO {"STMT_DELETE_EXTERNAL_REGISTATIONS", NULL}
-#define STMT_141 \
+#define STMT_DELETE_EXTERNAL_REGISTATIONS 144
+#define STMT_144_INFO {"STMT_DELETE_EXTERNAL_REGISTATIONS", NULL}
+#define STMT_144 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW 142
-#define STMT_142_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW", NULL}
-#define STMT_142 \
+#define STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW 145
+#define STMT_145_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW", NULL}
+#define STMT_145 \
"SELECT local_relpath, kind, def_repos_relpath, " \
" (SELECT root FROM repository AS r WHERE r.id = e.repos_id) " \
"FROM externals e " \
@@ -1462,9 +1551,9 @@
" AND nodes.local_relpath = e.parent_relpath)) " \
""
-#define STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW 143
-#define STMT_143_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW", NULL}
-#define STMT_143 \
+#define STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW 146
+#define STMT_146_INFO {"STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW", NULL}
+#define STMT_146 \
"SELECT local_relpath, kind, def_repos_relpath, " \
" (SELECT root FROM repository AS r WHERE r.id = e.repos_id) " \
"FROM externals e " \
@@ -1483,25 +1572,25 @@
" AND nodes.local_relpath = e.parent_relpath)) " \
""
-#define STMT_SELECT_EXTERNALS_DEFINED 144
-#define STMT_144_INFO {"STMT_SELECT_EXTERNALS_DEFINED", NULL}
-#define STMT_144 \
+#define STMT_SELECT_EXTERNALS_DEFINED 147
+#define STMT_147_INFO {"STMT_SELECT_EXTERNALS_DEFINED", NULL}
+#define STMT_147 \
"SELECT local_relpath, def_local_relpath " \
"FROM externals " \
"WHERE (wc_id = ?1 AND def_local_relpath = ?2) " \
" OR (wc_id = ?1 AND (((def_local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((def_local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_DELETE_EXTERNAL 145
-#define STMT_145_INFO {"STMT_DELETE_EXTERNAL", NULL}
-#define STMT_145 \
+#define STMT_DELETE_EXTERNAL 148
+#define STMT_148_INFO {"STMT_DELETE_EXTERNAL", NULL}
+#define STMT_148 \
"DELETE FROM externals " \
"WHERE wc_id = ?1 AND local_relpath = ?2 " \
""
-#define STMT_SELECT_EXTERNAL_PROPERTIES 146
-#define STMT_146_INFO {"STMT_SELECT_EXTERNAL_PROPERTIES", NULL}
-#define STMT_146 \
+#define STMT_SELECT_EXTERNAL_PROPERTIES 149
+#define STMT_149_INFO {"STMT_SELECT_EXTERNAL_PROPERTIES", NULL}
+#define STMT_149 \
"SELECT IFNULL((SELECT properties FROM actual_node a " \
" WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), " \
" properties), " \
@@ -1519,9 +1608,9 @@
" AND kind = 'dir' AND presence IN ('normal', 'incomplete') " \
""
-#define STMT_SELECT_CURRENT_PROPS_RECURSIVE 147
-#define STMT_147_INFO {"STMT_SELECT_CURRENT_PROPS_RECURSIVE", NULL}
-#define STMT_147 \
+#define STMT_SELECT_CURRENT_PROPS_RECURSIVE 150
+#define STMT_150_INFO {"STMT_SELECT_CURRENT_PROPS_RECURSIVE", NULL}
+#define STMT_150 \
"SELECT IFNULL((SELECT properties FROM actual_node a " \
" WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), " \
" properties), " \
@@ -1531,57 +1620,44 @@
" OR (wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
""
-#define STMT_PRAGMA_LOCKING_MODE 148
-#define STMT_148_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL}
-#define STMT_148 \
- "PRAGMA locking_mode = exclusive " \
+#define STMT_PRAGMA_LOCKING_MODE 151
+#define STMT_151_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL}
+#define STMT_151 \
+ "PRAGMA locking_mode = exclusive; " \
+ "PRAGMA journal_mode = DELETE " \
""
-#define STMT_INSERT_ACTUAL_NODE 149
-#define STMT_149_INFO {"STMT_INSERT_ACTUAL_NODE", NULL}
-#define STMT_149 \
+#define STMT_INSERT_ACTUAL_NODE 152
+#define STMT_152_INFO {"STMT_INSERT_ACTUAL_NODE", NULL}
+#define STMT_152 \
"INSERT OR REPLACE INTO actual_node ( " \
" wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data) " \
"VALUES (?1, ?2, ?3, ?4, ?5, ?6) " \
""
-#define STMT_UPDATE_ACTUAL_CONFLICT_DATA 150
-#define STMT_150_INFO {"STMT_UPDATE_ACTUAL_CONFLICT_DATA", NULL}
-#define STMT_150 \
- "UPDATE actual_node SET conflict_data = ?3 " \
- "WHERE wc_id = ?1 AND local_relpath = ?2 " \
- ""
-
-#define STMT_INSERT_ACTUAL_CONFLICT_DATA 151
-#define STMT_151_INFO {"STMT_INSERT_ACTUAL_CONFLICT_DATA", NULL}
-#define STMT_151 \
- "INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) " \
- "VALUES (?1, ?2, ?3, ?4) " \
- ""
-
-#define STMT_SELECT_ALL_FILES 152
-#define STMT_152_INFO {"STMT_SELECT_ALL_FILES", NULL}
-#define STMT_152 \
+#define STMT_SELECT_ALL_FILES 153
+#define STMT_153_INFO {"STMT_SELECT_ALL_FILES", NULL}
+#define STMT_153 \
"SELECT local_relpath FROM nodes_current " \
"WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = 'file' " \
""
-#define STMT_UPDATE_NODE_PROPS 153
-#define STMT_153_INFO {"STMT_UPDATE_NODE_PROPS", NULL}
-#define STMT_153 \
+#define STMT_UPDATE_NODE_PROPS 154
+#define STMT_154_INFO {"STMT_UPDATE_NODE_PROPS", NULL}
+#define STMT_154 \
"UPDATE nodes SET properties = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_PRAGMA_TABLE_INFO_NODES 154
-#define STMT_154_INFO {"STMT_PRAGMA_TABLE_INFO_NODES", NULL}
-#define STMT_154 \
+#define STMT_PRAGMA_TABLE_INFO_NODES 155
+#define STMT_155_INFO {"STMT_PRAGMA_TABLE_INFO_NODES", NULL}
+#define STMT_155 \
"PRAGMA table_info(\"NODES\") " \
""
-#define STMT_CREATE_TARGET_PROP_CACHE 155
-#define STMT_155_INFO {"STMT_CREATE_TARGET_PROP_CACHE", NULL}
-#define STMT_155 \
+#define STMT_CREATE_TARGET_PROP_CACHE 156
+#define STMT_156_INFO {"STMT_CREATE_TARGET_PROP_CACHE", NULL}
+#define STMT_156 \
"DROP TABLE IF EXISTS target_prop_cache; " \
"CREATE TEMPORARY TABLE target_prop_cache ( " \
" local_relpath TEXT NOT NULL PRIMARY KEY, " \
@@ -1590,9 +1666,9 @@
"); " \
""
-#define STMT_CACHE_TARGET_PROPS 156
-#define STMT_156_INFO {"STMT_CACHE_TARGET_PROPS", NULL}
-#define STMT_156 \
+#define STMT_CACHE_TARGET_PROPS 157
+#define STMT_157_INFO {"STMT_CACHE_TARGET_PROPS", NULL}
+#define STMT_157 \
"INSERT INTO target_prop_cache(local_relpath, kind, properties) " \
" SELECT n.local_relpath, n.kind, " \
" IFNULL((SELECT properties FROM actual_node AS a " \
@@ -1611,9 +1687,9 @@
" ORDER BY t.local_relpath " \
""
-#define STMT_CACHE_TARGET_PRISTINE_PROPS 157
-#define STMT_157_INFO {"STMT_CACHE_TARGET_PRISTINE_PROPS", NULL}
-#define STMT_157 \
+#define STMT_CACHE_TARGET_PRISTINE_PROPS 158
+#define STMT_158_INFO {"STMT_CACHE_TARGET_PRISTINE_PROPS", NULL}
+#define STMT_158 \
"INSERT INTO target_prop_cache(local_relpath, kind, properties) " \
" SELECT n.local_relpath, n.kind, " \
" CASE n.presence " \
@@ -1638,22 +1714,22 @@
" ORDER BY t.local_relpath " \
""
-#define STMT_SELECT_ALL_TARGET_PROP_CACHE 158
-#define STMT_158_INFO {"STMT_SELECT_ALL_TARGET_PROP_CACHE", NULL}
-#define STMT_158 \
+#define STMT_SELECT_ALL_TARGET_PROP_CACHE 159
+#define STMT_159_INFO {"STMT_SELECT_ALL_TARGET_PROP_CACHE", NULL}
+#define STMT_159 \
"SELECT local_relpath, properties FROM target_prop_cache " \
"ORDER BY local_relpath " \
""
-#define STMT_DROP_TARGET_PROP_CACHE 159
-#define STMT_159_INFO {"STMT_DROP_TARGET_PROP_CACHE", NULL}
-#define STMT_159 \
+#define STMT_DROP_TARGET_PROP_CACHE 160
+#define STMT_160_INFO {"STMT_DROP_TARGET_PROP_CACHE", NULL}
+#define STMT_160 \
"DROP TABLE target_prop_cache; " \
""
-#define STMT_CREATE_REVERT_LIST 160
-#define STMT_160_INFO {"STMT_CREATE_REVERT_LIST", NULL}
-#define STMT_160 \
+#define STMT_CREATE_REVERT_LIST 161
+#define STMT_161_INFO {"STMT_CREATE_REVERT_LIST", NULL}
+#define STMT_161 \
"DROP TABLE IF EXISTS revert_list; " \
"CREATE TEMPORARY TABLE revert_list ( " \
" local_relpath TEXT NOT NULL, " \
@@ -1687,8 +1763,9 @@
" WHERE n.wc_id = OLD.wc_id " \
" AND n.local_relpath = OLD.local_relpath) " \
" THEN 1 " \
- " ELSE NULL " \
- " END; " \
+ " END notify " \
+ " WHERE OLD.conflict_data IS NOT NULL " \
+ " OR notify IS NOT NULL; " \
"END; " \
"DROP TRIGGER IF EXISTS trigger_revert_list_actual_update; " \
"CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update " \
@@ -1704,31 +1781,32 @@
" WHERE n.wc_id = OLD.wc_id " \
" AND n.local_relpath = OLD.local_relpath) " \
" THEN 1 " \
- " ELSE NULL " \
- " END; " \
+ " END notify " \
+ " WHERE OLD.conflict_data IS NOT NULL " \
+ " OR notify IS NOT NULL; " \
"END " \
""
-#define STMT_DROP_REVERT_LIST_TRIGGERS 161
-#define STMT_161_INFO {"STMT_DROP_REVERT_LIST_TRIGGERS", NULL}
-#define STMT_161 \
+#define STMT_DROP_REVERT_LIST_TRIGGERS 162
+#define STMT_162_INFO {"STMT_DROP_REVERT_LIST_TRIGGERS", NULL}
+#define STMT_162 \
"DROP TRIGGER trigger_revert_list_nodes; " \
"DROP TRIGGER trigger_revert_list_actual_delete; " \
"DROP TRIGGER trigger_revert_list_actual_update " \
""
-#define STMT_SELECT_REVERT_LIST 162
-#define STMT_162_INFO {"STMT_SELECT_REVERT_LIST", NULL}
-#define STMT_162 \
+#define STMT_SELECT_REVERT_LIST 163
+#define STMT_163_INFO {"STMT_SELECT_REVERT_LIST", NULL}
+#define STMT_163 \
"SELECT actual, notify, kind, op_depth, repos_id, conflict_data " \
"FROM revert_list " \
"WHERE local_relpath = ?1 " \
"ORDER BY actual DESC " \
""
-#define STMT_SELECT_REVERT_LIST_COPIED_CHILDREN 163
-#define STMT_163_INFO {"STMT_SELECT_REVERT_LIST_COPIED_CHILDREN", NULL}
-#define STMT_163 \
+#define STMT_SELECT_REVERT_LIST_COPIED_CHILDREN 164
+#define STMT_164_INFO {"STMT_SELECT_REVERT_LIST_COPIED_CHILDREN", NULL}
+#define STMT_164 \
"SELECT local_relpath, kind " \
"FROM revert_list " \
"WHERE (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END)) " \
@@ -1737,113 +1815,125 @@
"ORDER BY local_relpath " \
""
-#define STMT_DELETE_REVERT_LIST 164
-#define STMT_164_INFO {"STMT_DELETE_REVERT_LIST", NULL}
-#define STMT_164 \
- "DELETE FROM revert_list WHERE local_relpath = ?1 " \
- ""
-
-#define STMT_SELECT_REVERT_LIST_RECURSIVE 165
-#define STMT_165_INFO {"STMT_SELECT_REVERT_LIST_RECURSIVE", NULL}
+#define STMT_DELETE_REVERT_LIST 165
+#define STMT_165_INFO {"STMT_DELETE_REVERT_LIST", NULL}
#define STMT_165 \
- "SELECT DISTINCT local_relpath " \
- "FROM revert_list " \
- "WHERE (local_relpath = ?1 " \
- " OR (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END))) " \
- " AND (notify OR actual = 0) " \
- "ORDER BY local_relpath " \
+ "DELETE FROM revert_list WHERE local_relpath = ?1 " \
""
-#define STMT_DELETE_REVERT_LIST_RECURSIVE 166
-#define STMT_166_INFO {"STMT_DELETE_REVERT_LIST_RECURSIVE", NULL}
+#define STMT_SELECT_REVERT_LIST_RECURSIVE 166
+#define STMT_166_INFO {"STMT_SELECT_REVERT_LIST_RECURSIVE", NULL}
#define STMT_166 \
+ "SELECT p.local_relpath, n.kind, a.notify, a.kind " \
+ "FROM (SELECT DISTINCT local_relpath " \
+ " FROM revert_list " \
+ " WHERE (local_relpath = ?1 " \
+ " OR (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END)))) p " \
+ "LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0 " \
+ "LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1 " \
+ "ORDER BY p.local_relpath " \
+ ""
+
+#define STMT_DELETE_REVERT_LIST_RECURSIVE 167
+#define STMT_167_INFO {"STMT_DELETE_REVERT_LIST_RECURSIVE", NULL}
+#define STMT_167 \
"DELETE FROM revert_list " \
"WHERE (local_relpath = ?1 " \
" OR (((local_relpath) > (CASE (?1) WHEN '' THEN '' ELSE (?1) || '/' END)) AND ((local_relpath) < CASE (?1) WHEN '' THEN X'FFFF' ELSE (?1) || '0' END))) " \
""
-#define STMT_DROP_REVERT_LIST 167
-#define STMT_167_INFO {"STMT_DROP_REVERT_LIST", NULL}
-#define STMT_167 \
+#define STMT_DROP_REVERT_LIST 168
+#define STMT_168_INFO {"STMT_DROP_REVERT_LIST", NULL}
+#define STMT_168 \
"DROP TABLE IF EXISTS revert_list " \
""
-#define STMT_CREATE_DELETE_LIST 168
-#define STMT_168_INFO {"STMT_CREATE_DELETE_LIST", NULL}
-#define STMT_168 \
+#define STMT_CREATE_DELETE_LIST 169
+#define STMT_169_INFO {"STMT_CREATE_DELETE_LIST", NULL}
+#define STMT_169 \
"DROP TABLE IF EXISTS delete_list; " \
"CREATE TEMPORARY TABLE delete_list ( " \
" local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE " \
" ) " \
""
-#define STMT_INSERT_DELETE_LIST 169
-#define STMT_169_INFO {"STMT_INSERT_DELETE_LIST", NULL}
-#define STMT_169 \
+#define STMT_INSERT_DELETE_LIST 170
+#define STMT_170_INFO {"STMT_INSERT_DELETE_LIST", NULL}
+#define STMT_170 \
"INSERT INTO delete_list(local_relpath) " \
+ "SELECT ?2 " \
+ "UNION ALL " \
"SELECT local_relpath FROM nodes AS n " \
"WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 " \
- " OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ " AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
" AND op_depth >= ?3 " \
" AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s " \
" WHERE s.wc_id = ?1 " \
" AND s.local_relpath = n.local_relpath) " \
" AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'server-excluded') " \
" AND file_external IS NULL " \
+ "ORDER by local_relpath " \
""
-#define STMT_SELECT_DELETE_LIST 170
-#define STMT_170_INFO {"STMT_SELECT_DELETE_LIST", NULL}
-#define STMT_170 \
+#define STMT_SELECT_DELETE_LIST 171
+#define STMT_171_INFO {"STMT_SELECT_DELETE_LIST", NULL}
+#define STMT_171 \
"SELECT local_relpath FROM delete_list " \
"ORDER BY local_relpath " \
""
-#define STMT_FINALIZE_DELETE 171
-#define STMT_171_INFO {"STMT_FINALIZE_DELETE", NULL}
-#define STMT_171 \
+#define STMT_FINALIZE_DELETE 172
+#define STMT_172_INFO {"STMT_FINALIZE_DELETE", NULL}
+#define STMT_172 \
"DROP TABLE IF EXISTS delete_list " \
""
-#define STMT_CREATE_UPDATE_MOVE_LIST 172
-#define STMT_172_INFO {"STMT_CREATE_UPDATE_MOVE_LIST", NULL}
-#define STMT_172 \
+#define STMT_CREATE_UPDATE_MOVE_LIST 173
+#define STMT_173_INFO {"STMT_CREATE_UPDATE_MOVE_LIST", NULL}
+#define STMT_173 \
"DROP TABLE IF EXISTS update_move_list; " \
"CREATE TEMPORARY TABLE update_move_list ( " \
" local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE, " \
" action INTEGER NOT NULL, " \
- " kind INTEGER NOT NULL, " \
+ " kind TEXT NOT NULL, " \
" content_state INTEGER NOT NULL, " \
" prop_state INTEGER NOT NULL " \
" ) " \
""
-#define STMT_INSERT_UPDATE_MOVE_LIST 173
-#define STMT_173_INFO {"STMT_INSERT_UPDATE_MOVE_LIST", NULL}
-#define STMT_173 \
+#define STMT_INSERT_UPDATE_MOVE_LIST 174
+#define STMT_174_INFO {"STMT_INSERT_UPDATE_MOVE_LIST", NULL}
+#define STMT_174 \
"INSERT INTO update_move_list(local_relpath, action, kind, content_state, " \
" prop_state) " \
"VALUES (?1, ?2, ?3, ?4, ?5) " \
""
-#define STMT_SELECT_UPDATE_MOVE_LIST 174
-#define STMT_174_INFO {"STMT_SELECT_UPDATE_MOVE_LIST", NULL}
-#define STMT_174 \
+#define STMT_SELECT_UPDATE_MOVE_LIST 175
+#define STMT_175_INFO {"STMT_SELECT_UPDATE_MOVE_LIST", NULL}
+#define STMT_175 \
"SELECT local_relpath, action, kind, content_state, prop_state " \
"FROM update_move_list " \
"ORDER BY local_relpath " \
""
-#define STMT_FINALIZE_UPDATE_MOVE 175
-#define STMT_175_INFO {"STMT_FINALIZE_UPDATE_MOVE", NULL}
-#define STMT_175 \
+#define STMT_FINALIZE_UPDATE_MOVE 176
+#define STMT_176_INFO {"STMT_FINALIZE_UPDATE_MOVE", NULL}
+#define STMT_176 \
"DROP TABLE IF EXISTS update_move_list " \
""
-#define STMT_SELECT_MIN_MAX_REVISIONS 176
-#define STMT_176_INFO {"STMT_SELECT_MIN_MAX_REVISIONS", NULL}
-#define STMT_176 \
+#define STMT_MOVE_NOTIFY_TO_REVERT 177
+#define STMT_177_INFO {"STMT_MOVE_NOTIFY_TO_REVERT", NULL}
+#define STMT_177 \
+ "INSERT INTO revert_list (local_relpath, notify, kind, actual) " \
+ " SELECT local_relpath, 2, kind, 1 FROM update_move_list; " \
+ "DROP TABLE update_move_list " \
+ ""
+
+#define STMT_SELECT_MIN_MAX_REVISIONS 178
+#define STMT_178_INFO {"STMT_SELECT_MIN_MAX_REVISIONS", NULL}
+#define STMT_178 \
"SELECT MIN(revision), MAX(revision), " \
" MIN(changed_revision), MAX(changed_revision) FROM nodes " \
" WHERE wc_id = ?1 " \
@@ -1854,9 +1944,9 @@
" AND op_depth = 0 " \
""
-#define STMT_HAS_SPARSE_NODES 177
-#define STMT_177_INFO {"STMT_HAS_SPARSE_NODES", NULL}
-#define STMT_177 \
+#define STMT_HAS_SPARSE_NODES 179
+#define STMT_179_INFO {"STMT_HAS_SPARSE_NODES", NULL}
+#define STMT_179 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -1868,9 +1958,9 @@
"LIMIT 1 " \
""
-#define STMT_SUBTREE_HAS_TREE_MODIFICATIONS 178
-#define STMT_178_INFO {"STMT_SUBTREE_HAS_TREE_MODIFICATIONS", NULL}
-#define STMT_178 \
+#define STMT_SUBTREE_HAS_TREE_MODIFICATIONS 180
+#define STMT_180_INFO {"STMT_SUBTREE_HAS_TREE_MODIFICATIONS", NULL}
+#define STMT_180 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -1879,9 +1969,9 @@
"LIMIT 1 " \
""
-#define STMT_SUBTREE_HAS_PROP_MODIFICATIONS 179
-#define STMT_179_INFO {"STMT_SUBTREE_HAS_PROP_MODIFICATIONS", NULL}
-#define STMT_179 \
+#define STMT_SUBTREE_HAS_PROP_MODIFICATIONS 181
+#define STMT_181_INFO {"STMT_SUBTREE_HAS_PROP_MODIFICATIONS", NULL}
+#define STMT_181 \
"SELECT 1 FROM actual_node " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -1890,9 +1980,9 @@
"LIMIT 1 " \
""
-#define STMT_HAS_SWITCHED 180
-#define STMT_180_INFO {"STMT_HAS_SWITCHED", NULL}
-#define STMT_180 \
+#define STMT_HAS_SWITCHED 182
+#define STMT_182_INFO {"STMT_HAS_SWITCHED", NULL}
+#define STMT_182 \
"SELECT 1 " \
"FROM nodes " \
"WHERE wc_id = ?1 " \
@@ -1904,60 +1994,47 @@
"LIMIT 1 " \
""
-#define STMT_SELECT_BASE_FILES_RECURSIVE 181
-#define STMT_181_INFO {"STMT_SELECT_BASE_FILES_RECURSIVE", NULL}
-#define STMT_181 \
- "SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 " \
- " OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND op_depth = 0 " \
- " AND kind='file' " \
- " AND presence='normal' " \
- " AND file_external IS NULL " \
- ""
-
-#define STMT_SELECT_MOVED_FROM_RELPATH 182
-#define STMT_182_INFO {"STMT_SELECT_MOVED_FROM_RELPATH", NULL}
-#define STMT_182 \
+#define STMT_SELECT_MOVED_FROM_RELPATH 183
+#define STMT_183_INFO {"STMT_SELECT_MOVED_FROM_RELPATH", NULL}
+#define STMT_183 \
"SELECT local_relpath, op_depth FROM nodes " \
"WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 " \
""
-#define STMT_UPDATE_MOVED_TO_RELPATH 183
-#define STMT_183_INFO {"STMT_UPDATE_MOVED_TO_RELPATH", NULL}
-#define STMT_183 \
+#define STMT_UPDATE_MOVED_TO_RELPATH 184
+#define STMT_184_INFO {"STMT_UPDATE_MOVED_TO_RELPATH", NULL}
+#define STMT_184 \
"UPDATE nodes SET moved_to = ?4 " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_CLEAR_MOVED_TO_RELPATH 184
-#define STMT_184_INFO {"STMT_CLEAR_MOVED_TO_RELPATH", NULL}
-#define STMT_184 \
+#define STMT_CLEAR_MOVED_TO_RELPATH 185
+#define STMT_185_INFO {"STMT_CLEAR_MOVED_TO_RELPATH", NULL}
+#define STMT_185 \
"UPDATE nodes SET moved_to = NULL " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 " \
""
-#define STMT_CLEAR_MOVED_HERE_RECURSIVE 185
-#define STMT_185_INFO {"STMT_CLEAR_MOVED_HERE_RECURSIVE", NULL}
-#define STMT_185 \
+#define STMT_CLEAR_MOVED_HERE_RECURSIVE 186
+#define STMT_186_INFO {"STMT_CLEAR_MOVED_HERE_RECURSIVE", NULL}
+#define STMT_186 \
"UPDATE nodes SET moved_here = NULL " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
" AND op_depth = ?3 " \
""
-#define STMT_SELECT_MOVED_HERE_CHILDREN 186
-#define STMT_186_INFO {"STMT_SELECT_MOVED_HERE_CHILDREN", NULL}
-#define STMT_186 \
+#define STMT_SELECT_MOVED_HERE_CHILDREN 187
+#define STMT_187_INFO {"STMT_SELECT_MOVED_HERE_CHILDREN", NULL}
+#define STMT_187 \
"SELECT moved_to, local_relpath FROM nodes " \
"WHERE wc_id = ?1 AND op_depth > 0 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_SELECT_MOVED_FOR_DELETE 187
-#define STMT_187_INFO {"STMT_SELECT_MOVED_FOR_DELETE", NULL}
-#define STMT_187 \
+#define STMT_SELECT_MOVED_FOR_DELETE 188
+#define STMT_188_INFO {"STMT_SELECT_MOVED_FOR_DELETE", NULL}
+#define STMT_188 \
"SELECT local_relpath, moved_to, op_depth, " \
" (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r " \
" WHERE r.wc_id = ?1 " \
@@ -1971,9 +2048,9 @@
" AND op_depth >= ?3 " \
""
-#define STMT_SELECT_MOVED_FROM_FOR_DELETE 188
-#define STMT_188_INFO {"STMT_SELECT_MOVED_FROM_FOR_DELETE", NULL}
-#define STMT_188 \
+#define STMT_SELECT_MOVED_FROM_FOR_DELETE 189
+#define STMT_189_INFO {"STMT_SELECT_MOVED_FROM_FOR_DELETE", NULL}
+#define STMT_189 \
"SELECT local_relpath, op_depth, " \
" (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r " \
" WHERE r.wc_id = ?1 " \
@@ -1984,48 +2061,48 @@
"WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 " \
""
-#define STMT_UPDATE_MOVED_TO_DESCENDANTS 189
-#define STMT_189_INFO {"STMT_UPDATE_MOVED_TO_DESCENDANTS", NULL}
-#define STMT_189 \
+#define STMT_UPDATE_MOVED_TO_DESCENDANTS 190
+#define STMT_190_INFO {"STMT_UPDATE_MOVED_TO_DESCENDANTS", NULL}
+#define STMT_190 \
"UPDATE nodes SET moved_to = (CASE WHEN (?2) = '' THEN (CASE WHEN (?3) = '' THEN (moved_to) WHEN (moved_to) = '' THEN (?3) ELSE (?3) || '/' || (moved_to) END) WHEN (?3) = '' THEN (CASE WHEN (?2) = '' THEN (moved_to) WHEN SUBSTR((moved_to), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(moved_to) THEN '' WHEN SUBSTR((moved_to), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((moved_to), LENGTH(?2)+2) END END) WHEN SUBSTR((moved_to), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(moved_to) THEN (?3) WHEN SUBSTR((moved_to), LENGTH(?2)+1, 1) = '/' THEN (?3) || SUBSTR((moved_to), LENGTH(?2)+1) END END) " \
" WHERE wc_id = ?1 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_CLEAR_MOVED_TO_DESCENDANTS 190
-#define STMT_190_INFO {"STMT_CLEAR_MOVED_TO_DESCENDANTS", NULL}
-#define STMT_190 \
+#define STMT_CLEAR_MOVED_TO_DESCENDANTS 191
+#define STMT_191_INFO {"STMT_CLEAR_MOVED_TO_DESCENDANTS", NULL}
+#define STMT_191 \
"UPDATE nodes SET moved_to = NULL " \
" WHERE wc_id = ?1 " \
" AND (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_SELECT_MOVED_PAIR2 191
-#define STMT_191_INFO {"STMT_SELECT_MOVED_PAIR2", NULL}
-#define STMT_191 \
- "SELECT local_relpath, moved_to, op_depth FROM nodes " \
- "WHERE wc_id = ?1 " \
- " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
- " AND moved_to IS NOT NULL " \
- " AND NOT (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth >= (SELECT MAX(op_depth) FROM nodes o " \
- " WHERE o.wc_id = ?1 " \
- " AND o.local_relpath = ?2) " \
- ""
-
#define STMT_SELECT_MOVED_PAIR3 192
#define STMT_192_INFO {"STMT_SELECT_MOVED_PAIR3", NULL}
#define STMT_192 \
- "SELECT local_relpath, moved_to, op_depth, kind FROM nodes " \
- "WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 " \
- " AND moved_to IS NOT NULL " \
+ "SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind " \
+ "FROM nodes n " \
+ "JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath " \
+ " AND d.op_depth = (SELECT MIN(dd.op_depth) " \
+ " FROM nodes dd " \
+ " WHERE dd.wc_id = ?1 " \
+ " AND dd.local_relpath = d.local_relpath " \
+ " AND dd.op_depth > ?3) " \
+ "WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3 " \
+ " AND d.moved_to IS NOT NULL " \
"UNION ALL " \
- "SELECT local_relpath, moved_to, op_depth, kind FROM nodes " \
- "WHERE wc_id = ?1 " \
- " AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth > ?3 " \
- " AND moved_to IS NOT NULL " \
- "ORDER BY local_relpath, op_depth " \
+ "SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind " \
+ "FROM nodes n " \
+ "JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath " \
+ " AND d.op_depth = (SELECT MIN(dd.op_depth) " \
+ " FROM nodes dd " \
+ " WHERE dd.wc_id = ?1 " \
+ " AND dd.local_relpath = d.local_relpath " \
+ " AND dd.op_depth > ?3) " \
+ "WHERE n.wc_id = ?1 AND (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
+ " AND n.op_depth = ?3 " \
+ " AND d.moved_to IS NOT NULL " \
+ "ORDER BY n.local_relpath " \
""
#define STMT_SELECT_MOVED_OUTSIDE 193
@@ -2039,44 +2116,27 @@
" AND NOT (((moved_to) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((moved_to) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
""
-#define STMT_SELECT_OP_DEPTH_MOVED_PAIR 194
-#define STMT_194_INFO {"STMT_SELECT_OP_DEPTH_MOVED_PAIR", NULL}
+#define STMT_SELECT_MOVED_DESCENDANTS_SRC 194
+#define STMT_194_INFO {"STMT_SELECT_MOVED_DESCENDANTS_SRC", NULL}
#define STMT_194 \
- "SELECT n.local_relpath, n.moved_to, " \
- " (SELECT o.repos_path FROM nodes AS o " \
- " WHERE o.wc_id = n.wc_id " \
- " AND o.local_relpath = n.local_relpath " \
- " AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1) " \
- "FROM nodes AS n " \
- "WHERE n.wc_id = ?1 " \
- " AND (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND n.op_depth = ?3 " \
- " AND n.moved_to IS NOT NULL " \
- ""
-
-#define STMT_SELECT_MOVED_DESCENDANTS 195
-#define STMT_195_INFO {"STMT_SELECT_MOVED_DESCENDANTS", NULL}
+ "SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to " \
+ "FROM nodes n " \
+ "JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath " \
+ " AND s.op_depth = (SELECT MIN(d.op_depth) " \
+ " FROM nodes d " \
+ " WHERE d.wc_id = ?1 " \
+ " AND d.local_relpath = s.local_relpath " \
+ " AND d.op_depth > ?3) " \
+ "WHERE n.wc_id = ?1 AND n.op_depth = ?3 " \
+ " AND (n.local_relpath = ?2 OR (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ " AND s.moved_to IS NOT NULL " \
+ ""
+
+#define STMT_COMMIT_UPDATE_ORIGIN 195
+#define STMT_195_INFO {"STMT_COMMIT_UPDATE_ORIGIN", NULL}
#define STMT_195 \
- "SELECT n.local_relpath, h.moved_to " \
- "FROM nodes n, nodes h " \
- "WHERE n.wc_id = ?1 " \
- " AND h.wc_id = ?1 " \
- " AND (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND h.local_relpath = n.local_relpath " \
- " AND n.op_depth = ?3 " \
- " AND h.op_depth = (SELECT MIN(o.op_depth) " \
- " FROM nodes o " \
- " WHERE o.wc_id = ?1 " \
- " AND o.local_relpath = n.local_relpath " \
- " AND o.op_depth > ?3) " \
- " AND h.moved_to IS NOT NULL " \
- ""
-
-#define STMT_COMMIT_UPDATE_ORIGIN 196
-#define STMT_196_INFO {"STMT_COMMIT_UPDATE_ORIGIN", NULL}
-#define STMT_196 \
"UPDATE nodes SET repos_id = ?4, " \
- " repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1), " \
+ " repos_path = (CASE WHEN (?2) = '' THEN (CASE WHEN (?5) = '' THEN (local_relpath) WHEN (local_relpath) = '' THEN (?5) ELSE (?5) || '/' || (local_relpath) END) WHEN (?5) = '' THEN (CASE WHEN (?2) = '' THEN (local_relpath) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN '' WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN SUBSTR((local_relpath), LENGTH(?2)+2) END END) WHEN SUBSTR((local_relpath), 1, LENGTH(?2)) = (?2) THEN CASE WHEN LENGTH(?2) = LENGTH(local_relpath) THEN (?5) WHEN SUBSTR((local_relpath), LENGTH(?2)+1, 1) = '/' THEN (?5) || SUBSTR((local_relpath), LENGTH(?2)+1) END END), " \
" revision = ?6 " \
"WHERE wc_id = ?1 " \
" AND (local_relpath = ?2 " \
@@ -2084,16 +2144,16 @@
" AND op_depth = ?3 " \
""
-#define STMT_HAS_LAYER_BETWEEN 197
-#define STMT_197_INFO {"STMT_HAS_LAYER_BETWEEN", NULL}
-#define STMT_197 \
+#define STMT_HAS_LAYER_BETWEEN 196
+#define STMT_196_INFO {"STMT_HAS_LAYER_BETWEEN", NULL}
+#define STMT_196 \
"SELECT 1 FROM NODES " \
"WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4 " \
""
-#define STMT_SELECT_REPOS_PATH_REVISION 198
-#define STMT_198_INFO {"STMT_SELECT_REPOS_PATH_REVISION", NULL}
-#define STMT_198 \
+#define STMT_SELECT_REPOS_PATH_REVISION 197
+#define STMT_197_INFO {"STMT_SELECT_REPOS_PATH_REVISION", NULL}
+#define STMT_197 \
"SELECT local_relpath, repos_path, revision FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -2101,50 +2161,52 @@
"ORDER BY local_relpath " \
""
-#define STMT_SELECT_HAS_NON_FILE_CHILDREN 199
-#define STMT_199_INFO {"STMT_SELECT_HAS_NON_FILE_CHILDREN", NULL}
-#define STMT_199 \
+#define STMT_SELECT_HAS_NON_FILE_CHILDREN 198
+#define STMT_198_INFO {"STMT_SELECT_HAS_NON_FILE_CHILDREN", NULL}
+#define STMT_198 \
"SELECT 1 FROM nodes " \
- "WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != 'file' " \
+ "WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != 'file' " \
+ "LIMIT 1 " \
""
-#define STMT_SELECT_HAS_GRANDCHILDREN 200
-#define STMT_200_INFO {"STMT_SELECT_HAS_GRANDCHILDREN", NULL}
-#define STMT_200 \
+#define STMT_SELECT_HAS_GRANDCHILDREN 199
+#define STMT_199_INFO {"STMT_SELECT_HAS_GRANDCHILDREN", NULL}
+#define STMT_199 \
"SELECT 1 FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((parent_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((parent_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
- " AND op_depth = 0 " \
+ " AND op_depth = ?3 " \
" AND file_external IS NULL " \
+ "LIMIT 1 " \
""
-#define STMT_SELECT_ALL_NODES 201
-#define STMT_201_INFO {"STMT_SELECT_ALL_NODES", NULL}
-#define STMT_201 \
+#define STMT_SELECT_ALL_NODES 200
+#define STMT_200_INFO {"STMT_SELECT_ALL_NODES", NULL}
+#define STMT_200 \
"SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes " \
"WHERE wc_id = ?1 " \
""
-#define STMT_SELECT_IPROPS 202
-#define STMT_202_INFO {"STMT_SELECT_IPROPS", NULL}
-#define STMT_202 \
+#define STMT_SELECT_IPROPS 201
+#define STMT_201_INFO {"STMT_SELECT_IPROPS", NULL}
+#define STMT_201 \
"SELECT inherited_props FROM nodes " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
" AND op_depth = 0 " \
""
-#define STMT_UPDATE_IPROP 203
-#define STMT_203_INFO {"STMT_UPDATE_IPROP", NULL}
-#define STMT_203 \
+#define STMT_UPDATE_IPROP 202
+#define STMT_202_INFO {"STMT_UPDATE_IPROP", NULL}
+#define STMT_202 \
"UPDATE nodes " \
"SET inherited_props = ?3 " \
"WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0) " \
""
-#define STMT_SELECT_IPROPS_NODE 204
-#define STMT_204_INFO {"STMT_SELECT_IPROPS_NODE", NULL}
-#define STMT_204 \
+#define STMT_SELECT_IPROPS_NODE 203
+#define STMT_203_INFO {"STMT_SELECT_IPROPS_NODE", NULL}
+#define STMT_203 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND local_relpath = ?2 " \
@@ -2152,9 +2214,9 @@
" AND (inherited_props not null) " \
""
-#define STMT_SELECT_IPROPS_RECURSIVE 205
-#define STMT_205_INFO {"STMT_SELECT_IPROPS_RECURSIVE", NULL}
-#define STMT_205 \
+#define STMT_SELECT_IPROPS_RECURSIVE 204
+#define STMT_204_INFO {"STMT_SELECT_IPROPS_RECURSIVE", NULL}
+#define STMT_204 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) " \
@@ -2162,9 +2224,9 @@
" AND (inherited_props not null) " \
""
-#define STMT_SELECT_IPROPS_CHILDREN 206
-#define STMT_206_INFO {"STMT_SELECT_IPROPS_CHILDREN", NULL}
-#define STMT_206 \
+#define STMT_SELECT_IPROPS_CHILDREN 205
+#define STMT_205_INFO {"STMT_SELECT_IPROPS_CHILDREN", NULL}
+#define STMT_205 \
"SELECT local_relpath, repos_path FROM nodes " \
"WHERE wc_id = ?1 " \
" AND parent_relpath = ?2 " \
@@ -2172,16 +2234,16 @@
" AND (inherited_props not null) " \
""
-#define STMT_HAVE_STAT1_TABLE 207
-#define STMT_207_INFO {"STMT_HAVE_STAT1_TABLE", NULL}
-#define STMT_207 \
+#define STMT_HAVE_STAT1_TABLE 206
+#define STMT_206_INFO {"STMT_HAVE_STAT1_TABLE", NULL}
+#define STMT_206 \
"SELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table' " \
"LIMIT 1 " \
""
-#define STMT_CREATE_SCHEMA 208
-#define STMT_208_INFO {"STMT_CREATE_SCHEMA", NULL}
-#define STMT_208 \
+#define STMT_CREATE_SCHEMA 207
+#define STMT_207_INFO {"STMT_CREATE_SCHEMA", NULL}
+#define STMT_207 \
"CREATE TABLE REPOSITORY ( " \
" id INTEGER PRIMARY KEY AUTOINCREMENT, " \
" root TEXT UNIQUE NOT NULL, " \
@@ -2246,9 +2308,9 @@
"; " \
""
-#define STMT_CREATE_NODES 209
-#define STMT_209_INFO {"STMT_CREATE_NODES", NULL}
-#define STMT_209 \
+#define STMT_CREATE_NODES 208
+#define STMT_208_INFO {"STMT_CREATE_NODES", NULL}
+#define STMT_208 \
"CREATE TABLE NODES ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
@@ -2288,9 +2350,9 @@
" WHERE op_depth = 0; " \
""
-#define STMT_CREATE_NODES_TRIGGERS 210
-#define STMT_210_INFO {"STMT_CREATE_NODES_TRIGGERS", NULL}
-#define STMT_210 \
+#define STMT_CREATE_NODES_TRIGGERS 209
+#define STMT_209_INFO {"STMT_CREATE_NODES_TRIGGERS", NULL}
+#define STMT_209 \
"CREATE TRIGGER nodes_insert_trigger " \
"AFTER INSERT ON nodes " \
"WHEN NEW.checksum IS NOT NULL " \
@@ -2316,9 +2378,9 @@
"END; " \
""
-#define STMT_CREATE_EXTERNALS 211
-#define STMT_211_INFO {"STMT_CREATE_EXTERNALS", NULL}
-#define STMT_211 \
+#define STMT_CREATE_EXTERNALS 210
+#define STMT_210_INFO {"STMT_CREATE_EXTERNALS", NULL}
+#define STMT_210 \
"CREATE TABLE EXTERNALS ( " \
" wc_id INTEGER NOT NULL REFERENCES WCROOT (id), " \
" local_relpath TEXT NOT NULL, " \
@@ -2337,32 +2399,36 @@
" local_relpath); " \
""
-#define STMT_INSTALL_SCHEMA_STATISTICS 212
-#define STMT_212_INFO {"STMT_INSTALL_SCHEMA_STATISTICS", NULL}
-#define STMT_212 \
+#define STMT_INSTALL_SCHEMA_STATISTICS 211
+#define STMT_211_INFO {"STMT_INSTALL_SCHEMA_STATISTICS", NULL}
+#define STMT_211 \
"ANALYZE sqlite_master; " \
"DELETE FROM sqlite_stat1 " \
- "WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "WHERE tbl in ('NODES', 'ACTUAL_NODE', 'LOCK', 'WC_LOCK', 'EXTERNALS'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('NODES', 'I_NODES_MOVED', '8000 8000 1 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1'); " \
- "INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
" ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ " ('EXTERNALS','sqlite_autoindex_EXTERNALS_1', '100 100 1'); " \
+ "INSERT INTO sqlite_stat1(tbl, idx, stat) VALUES " \
+ " ('EXTERNALS','I_EXTERNALS_DEFINED', '100 100 3 1'); " \
"ANALYZE sqlite_master; " \
""
-#define STMT_UPGRADE_TO_20 213
-#define STMT_213_INFO {"STMT_UPGRADE_TO_20", NULL}
-#define STMT_213 \
+#define STMT_UPGRADE_TO_20 212
+#define STMT_212_INFO {"STMT_UPGRADE_TO_20", NULL}
+#define STMT_212 \
"UPDATE BASE_NODE SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = BASE_NODE.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = BASE_NODE.checksum); " \
@@ -2403,59 +2469,59 @@
"PRAGMA user_version = 20; " \
""
-#define STMT_UPGRADE_TO_21 214
-#define STMT_214_INFO {"STMT_UPGRADE_TO_21", NULL}
-#define STMT_214 \
+#define STMT_UPGRADE_TO_21 213
+#define STMT_213_INFO {"STMT_UPGRADE_TO_21", NULL}
+#define STMT_213 \
"PRAGMA user_version = 21; " \
""
-#define STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT 215
-#define STMT_215_INFO {"STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT", NULL}
-#define STMT_215 \
+#define STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT 214
+#define STMT_214_INFO {"STMT_UPGRADE_21_SELECT_OLD_TREE_CONFLICT", NULL}
+#define STMT_214 \
"SELECT wc_id, local_relpath, tree_conflict_data " \
"FROM actual_node " \
"WHERE tree_conflict_data IS NOT NULL " \
""
-#define STMT_UPGRADE_21_ERASE_OLD_CONFLICTS 216
-#define STMT_216_INFO {"STMT_UPGRADE_21_ERASE_OLD_CONFLICTS", NULL}
-#define STMT_216 \
+#define STMT_UPGRADE_21_ERASE_OLD_CONFLICTS 215
+#define STMT_215_INFO {"STMT_UPGRADE_21_ERASE_OLD_CONFLICTS", NULL}
+#define STMT_215 \
"UPDATE actual_node SET tree_conflict_data = NULL " \
""
-#define STMT_UPGRADE_TO_22 217
-#define STMT_217_INFO {"STMT_UPGRADE_TO_22", NULL}
-#define STMT_217 \
+#define STMT_UPGRADE_TO_22 216
+#define STMT_216_INFO {"STMT_UPGRADE_TO_22", NULL}
+#define STMT_216 \
"UPDATE actual_node SET tree_conflict_data = conflict_data; " \
"UPDATE actual_node SET conflict_data = NULL; " \
"PRAGMA user_version = 22; " \
""
-#define STMT_UPGRADE_TO_23 218
-#define STMT_218_INFO {"STMT_UPGRADE_TO_23", NULL}
-#define STMT_218 \
+#define STMT_UPGRADE_TO_23 217
+#define STMT_217_INFO {"STMT_UPGRADE_TO_23", NULL}
+#define STMT_217 \
"PRAGMA user_version = 23; " \
""
-#define STMT_UPGRADE_23_HAS_WORKING_NODES 219
-#define STMT_219_INFO {"STMT_UPGRADE_23_HAS_WORKING_NODES", NULL}
-#define STMT_219 \
+#define STMT_UPGRADE_23_HAS_WORKING_NODES 218
+#define STMT_218_INFO {"STMT_UPGRADE_23_HAS_WORKING_NODES", NULL}
+#define STMT_218 \
"SELECT 1 FROM nodes WHERE op_depth > 0 " \
"LIMIT 1 " \
""
-#define STMT_UPGRADE_TO_24 220
-#define STMT_220_INFO {"STMT_UPGRADE_TO_24", NULL}
-#define STMT_220 \
+#define STMT_UPGRADE_TO_24 219
+#define STMT_219_INFO {"STMT_UPGRADE_TO_24", NULL}
+#define STMT_219 \
"UPDATE pristine SET refcount = " \
" (SELECT COUNT(*) FROM nodes " \
" WHERE checksum = pristine.checksum ); " \
"PRAGMA user_version = 24; " \
""
-#define STMT_UPGRADE_TO_25 221
-#define STMT_221_INFO {"STMT_UPGRADE_TO_25", NULL}
-#define STMT_221 \
+#define STMT_UPGRADE_TO_25 220
+#define STMT_220_INFO {"STMT_UPGRADE_TO_25", NULL}
+#define STMT_220 \
"DROP VIEW IF EXISTS NODES_CURRENT; " \
"CREATE VIEW NODES_CURRENT AS " \
" SELECT * FROM nodes " \
@@ -2467,9 +2533,9 @@
"PRAGMA user_version = 25; " \
""
-#define STMT_UPGRADE_TO_26 222
-#define STMT_222_INFO {"STMT_UPGRADE_TO_26", NULL}
-#define STMT_222 \
+#define STMT_UPGRADE_TO_26 221
+#define STMT_221_INFO {"STMT_UPGRADE_TO_26", NULL}
+#define STMT_221 \
"DROP VIEW IF EXISTS NODES_BASE; " \
"CREATE VIEW NODES_BASE AS " \
" SELECT * FROM nodes " \
@@ -2477,15 +2543,15 @@
"PRAGMA user_version = 26; " \
""
-#define STMT_UPGRADE_TO_27 223
-#define STMT_223_INFO {"STMT_UPGRADE_TO_27", NULL}
-#define STMT_223 \
+#define STMT_UPGRADE_TO_27 222
+#define STMT_222_INFO {"STMT_UPGRADE_TO_27", NULL}
+#define STMT_222 \
"PRAGMA user_version = 27; " \
""
-#define STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS 224
-#define STMT_224_INFO {"STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS", NULL}
-#define STMT_224 \
+#define STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS 223
+#define STMT_223_INFO {"STMT_UPGRADE_27_HAS_ACTUAL_NODES_CONFLICTS", NULL}
+#define STMT_223 \
"SELECT 1 FROM actual_node " \
"WHERE NOT ((prop_reject IS NULL) AND (conflict_old IS NULL) " \
" AND (conflict_new IS NULL) AND (conflict_working IS NULL) " \
@@ -2493,18 +2559,18 @@
"LIMIT 1 " \
""
-#define STMT_UPGRADE_TO_28 225
-#define STMT_225_INFO {"STMT_UPGRADE_TO_28", NULL}
-#define STMT_225 \
+#define STMT_UPGRADE_TO_28 224
+#define STMT_224_INFO {"STMT_UPGRADE_TO_28", NULL}
+#define STMT_224 \
"UPDATE NODES SET checksum = (SELECT checksum FROM pristine " \
" WHERE md5_checksum = nodes.checksum) " \
"WHERE EXISTS (SELECT 1 FROM pristine WHERE md5_checksum = nodes.checksum); " \
"PRAGMA user_version = 28; " \
""
-#define STMT_UPGRADE_TO_29 226
-#define STMT_226_INFO {"STMT_UPGRADE_TO_29", NULL}
-#define STMT_226 \
+#define STMT_UPGRADE_TO_29 225
+#define STMT_225_INFO {"STMT_UPGRADE_TO_29", NULL}
+#define STMT_225 \
"DROP TRIGGER IF EXISTS nodes_update_checksum_trigger; " \
"DROP TRIGGER IF EXISTS nodes_insert_trigger; " \
"DROP TRIGGER IF EXISTS nodes_delete_trigger; " \
@@ -2534,9 +2600,9 @@
"PRAGMA user_version = 29; " \
""
-#define STMT_UPGRADE_TO_30 227
-#define STMT_227_INFO {"STMT_UPGRADE_TO_30", NULL}
-#define STMT_227 \
+#define STMT_UPGRADE_TO_30 226
+#define STMT_226_INFO {"STMT_UPGRADE_TO_30", NULL}
+#define STMT_226 \
"CREATE UNIQUE INDEX IF NOT EXISTS I_NODES_MOVED " \
"ON NODES (wc_id, moved_to, op_depth); " \
"CREATE INDEX IF NOT EXISTS I_PRISTINE_MD5 ON PRISTINE (md5_checksum); " \
@@ -2544,9 +2610,9 @@
"UPDATE nodes SET file_external=1 WHERE file_external IS NOT NULL; " \
""
-#define STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE 228
-#define STMT_228_INFO {"STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE", NULL}
-#define STMT_228 \
+#define STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE 227
+#define STMT_227_INFO {"STMT_UPGRADE_30_SELECT_CONFLICT_SEPARATE", NULL}
+#define STMT_227 \
"SELECT wc_id, local_relpath, " \
" conflict_old, conflict_working, conflict_new, prop_reject, tree_conflict_data " \
"FROM actual_node " \
@@ -2558,24 +2624,24 @@
"ORDER by wc_id, local_relpath " \
""
-#define STMT_UPGRADE_30_SET_CONFLICT 229
-#define STMT_229_INFO {"STMT_UPGRADE_30_SET_CONFLICT", NULL}
-#define STMT_229 \
+#define STMT_UPGRADE_30_SET_CONFLICT 228
+#define STMT_228_INFO {"STMT_UPGRADE_30_SET_CONFLICT", NULL}
+#define STMT_228 \
"UPDATE actual_node SET conflict_data = ?3, conflict_old = NULL, " \
" conflict_working = NULL, conflict_new = NULL, prop_reject = NULL, " \
" tree_conflict_data = NULL " \
"WHERE wc_id = ?1 and local_relpath = ?2 " \
""
-#define STMT_UPGRADE_TO_31_ALTER_TABLE 230
-#define STMT_230_INFO {"STMT_UPGRADE_TO_31_ALTER_TABLE", NULL}
-#define STMT_230 \
+#define STMT_UPGRADE_TO_31_ALTER_TABLE 229
+#define STMT_229_INFO {"STMT_UPGRADE_TO_31_ALTER_TABLE", NULL}
+#define STMT_229 \
"ALTER TABLE NODES ADD COLUMN inherited_props BLOB; " \
""
-#define STMT_UPGRADE_TO_31_FINALIZE 231
-#define STMT_231_INFO {"STMT_UPGRADE_TO_31_FINALIZE", NULL}
-#define STMT_231 \
+#define STMT_UPGRADE_TO_31_FINALIZE 230
+#define STMT_230_INFO {"STMT_UPGRADE_TO_31_FINALIZE", NULL}
+#define STMT_230 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"DROP INDEX I_NODES_PARENT; " \
@@ -2587,9 +2653,9 @@
"PRAGMA user_version = 31; " \
""
-#define STMT_UPGRADE_31_SELECT_WCROOT_NODES 232
-#define STMT_232_INFO {"STMT_UPGRADE_31_SELECT_WCROOT_NODES", NULL}
-#define STMT_232 \
+#define STMT_UPGRADE_31_SELECT_WCROOT_NODES 231
+#define STMT_231_INFO {"STMT_UPGRADE_31_SELECT_WCROOT_NODES", NULL}
+#define STMT_231 \
"SELECT l.wc_id, l.local_relpath FROM nodes as l " \
"LEFT OUTER JOIN nodes as r " \
"ON l.wc_id = r.wc_id " \
@@ -2601,9 +2667,9 @@
" OR (l.repos_path IS NOT (CASE WHEN (r.local_relpath) = '' THEN (CASE WHEN (r.repos_path) = '' THEN (l.local_relpath) WHEN (l.local_relpath) = '' THEN (r.repos_path) ELSE (r.repos_path) || '/' || (l.local_relpath) END) WHEN (r.repos_path) = '' THEN (CASE WHEN (r.local_relpath) = '' THEN (l.local_relpath) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN '' WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+2) END END) WHEN SUBSTR((l.local_relpath), 1, LENGTH(r.local_relpath)) = (r.local_relpath) THEN CASE WHEN LENGTH(r.local_relpath) = LENGTH(l.local_relpath) THEN (r.repos_path) WHEN SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1, 1) = '/' THEN (r.repos_path) || SUBSTR((l.local_relpath), LENGTH(r.local_relpath)+1) END END))) " \
""
-#define STMT_UPGRADE_TO_32 233
-#define STMT_233_INFO {"STMT_UPGRADE_TO_32", NULL}
-#define STMT_233 \
+#define STMT_UPGRADE_TO_32 232
+#define STMT_232_INFO {"STMT_UPGRADE_TO_32", NULL}
+#define STMT_232 \
"DROP INDEX IF EXISTS I_ACTUAL_CHANGELIST; " \
"DROP INDEX IF EXISTS I_EXTERNALS_PARENT; " \
"CREATE INDEX I_EXTERNALS_PARENT ON EXTERNALS (wc_id, parent_relpath); " \
@@ -2656,9 +2722,9 @@
"DROP TABLE ACTUAL_NODE_BACKUP; " \
""
-#define STMT_VERIFICATION_TRIGGERS 234
-#define STMT_234_INFO {"STMT_VERIFICATION_TRIGGERS", NULL}
-#define STMT_234 \
+#define STMT_VERIFICATION_TRIGGERS 233
+#define STMT_233_INFO {"STMT_VERIFICATION_TRIGGERS", NULL}
+#define STMT_233 \
"CREATE TEMPORARY TRIGGER no_repository_updates BEFORE UPDATE ON repository " \
"BEGIN " \
" SELECT RAISE(FAIL, 'Updates to REPOSITORY are not allowed.'); " \
@@ -2697,6 +2763,179 @@
"END; " \
""
+#define STMT_STATIC_VERIFY 234
+#define STMT_234_INFO {"STMT_STATIC_VERIFY", NULL}
+#define STMT_234 \
+ "SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES' " \
+ "FROM nodes n WHERE local_relpath != '' " \
+ " AND (parent_relpath IS NULL " \
+ " OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
+ " OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
+ "UNION ALL " \
+ "SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL' " \
+ "FROM actual_node a WHERE local_relpath != '' " \
+ " AND (parent_relpath IS NULL " \
+ " OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
+ " OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
+ "UNION ALL " \
+ "SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL' " \
+ "FROM actual_node a WHERE local_relpath != '' " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.parent_relpath) " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.local_relpath) " \
+ "UNION ALL " \
+ "SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data' " \
+ "FROM actual_node a " \
+ "LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath " \
+ " AND n.op_depth = (SELECT MAX(op_depth) from nodes i " \
+ " WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath) " \
+ "WHERE (a.properties IS NOT NULL " \
+ " AND (n.presence IS NULL " \
+ " OR n.presence NOT IN ('normal', 'incomplete'))) " \
+ " OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != 'file')) " \
+ " OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL) " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=a.wc_id " \
+ " AND i.local_relpath=a.parent_relpath) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 20, 'No ancestor in NODES' " \
+ "FROM nodes n WHERE local_relpath != '' " \
+ " AND file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 from nodes i " \
+ " WHERE i.wc_id=n.wc_id " \
+ " AND i.local_relpath=n.parent_relpath " \
+ " AND i.op_depth <= n.op_depth) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 21, 'Unneeded node data' " \
+ "FROM nodes " \
+ "WHERE presence NOT IN ('normal', 'incomplete') " \
+ "AND (properties IS NOT NULL " \
+ " OR checksum IS NOT NULL " \
+ " OR depth IS NOT NULL " \
+ " OR symlink_target IS NOT NULL " \
+ " OR changed_revision IS NOT NULL " \
+ " OR (changed_date IS NOT NULL AND changed_date != 0) " \
+ " OR changed_author IS NOT NULL " \
+ " OR translated_size IS NOT NULL " \
+ " OR last_mod_time IS NOT NULL " \
+ " OR dav_cache IS NOT NULL " \
+ " OR file_external IS NOT NULL " \
+ " OR inherited_props IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data' " \
+ "FROM nodes " \
+ "WHERE presence IN ('base-deleted') " \
+ "AND (repos_id IS NOT NULL " \
+ " OR repos_path IS NOT NULL " \
+ " OR revision IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal' " \
+ "FROM nodes " \
+ "WHERE presence IN ('normal', 'incomplete') " \
+ "AND (kind IS NULL " \
+ " OR (repos_path IS NULL " \
+ " AND (properties IS NOT NULL " \
+ " OR changed_revision IS NOT NULL " \
+ " OR changed_author IS NOT NULL " \
+ " OR (changed_date IS NOT NULL AND changed_date != 0))) " \
+ " OR (CASE WHEN kind = 'file' AND repos_path IS NOT NULL " \
+ " THEN checksum IS NULL " \
+ " ELSE checksum IS NOT NULL END) " \
+ " OR (CASE WHEN kind = 'dir' THEN depth IS NULL " \
+ " ELSE depth IS NOT NULL END) " \
+ " OR (CASE WHEN kind = 'symlink' THEN symlink_target IS NULL " \
+ " ELSE symlink_target IS NOT NULL END)) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add' " \
+ "FROM nodes " \
+ "WHERE presence IN ('normal', 'incomplete') " \
+ " AND repos_path IS NULL " \
+ " AND op_depth != relpath_depth(local_relpath) " \
+ "UNION ALL " \
+ "SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor' " \
+ "FROM nodes n " \
+ "WHERE op_depth < relpath_depth(local_relpath) " \
+ " AND file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes p " \
+ " WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
+ " AND p.op_depth=n.op_depth " \
+ " AND (p.presence IN ('normal', 'incomplete') " \
+ " OR (p.presence IN ('base-deleted', 'not-present') " \
+ " AND n.presence = 'base-deleted'))) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch' " \
+ "FROM nodes n " \
+ "JOIN nodes p " \
+ " ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
+ " AND n.op_depth=p.op_depth " \
+ "WHERE n.op_depth > 0 AND n.presence IN ('normal', 'incomplete') " \
+ " AND (n.repos_id != p.repos_id " \
+ " OR n.repos_path != " \
+ " (CASE WHEN (n.parent_relpath) = '' THEN (CASE WHEN (p.repos_path) = '' THEN (n.local_relpath) WHEN (n.local_relpath) = '' THEN (p.repos_path) ELSE (p.repos_path) || '/' || (n.local_relpath) END) WHEN (p.repos_path) = '' THEN (CASE WHEN (n.parent_relpath) = '' THEN (n.local_relpath) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN '' WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+2) END END) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN (p.repos_path) WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN (p.repos_path) || SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1) END END) " \
+ " OR n.revision != p.revision " \
+ " OR p.kind != 'dir' " \
+ " OR n.moved_here IS NOT p.moved_here) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence' " \
+ "FROM nodes n " \
+ "WHERE n.op_depth = relpath_depth(local_relpath) " \
+ " AND presence NOT IN ('normal', 'incomplete', 'base-deleted') " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing' " \
+ "FROM nodes n " \
+ "JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath " \
+ " AND s.op_depth = relpath_depth(s.local_relpath) " \
+ " AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d " \
+ " WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
+ " AND d.op_depth > n.op_depth) " \
+ "WHERE n.presence IN ('normal', 'incomplete') " \
+ " AND EXISTS(SELECT 1 " \
+ " FROM nodes dn " \
+ " WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth " \
+ " AND dn.presence IN ('normal', 'incomplete') " \
+ " AND (((dn.local_relpath) > (CASE (n.local_relpath) WHEN '' THEN '' ELSE (n.local_relpath) || '/' END)) AND ((dn.local_relpath) < CASE (n.local_relpath) WHEN '' THEN X'FFFF' ELSE (n.local_relpath) || '0' END)) " \
+ " AND dn.file_external IS NULL " \
+ " AND NOT EXISTS(SELECT 1 " \
+ " FROM nodes ds " \
+ " WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth " \
+ " AND ds.local_relpath=dn.local_relpath)) " \
+ "UNION ALL " \
+ "SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete' " \
+ "FROM nodes s " \
+ "LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath " \
+ " AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
+ " WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
+ " AND d.op_depth < s.op_depth) " \
+ "WHERE s.presence = 'base-deleted' " \
+ " AND (n.presence IS NULL " \
+ " OR n.presence NOT IN ('normal', 'incomplete') " \
+ " ) " \
+ "UNION ALL " \
+ "SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE' " \
+ "FROM nodes n " \
+ "WHERE n.op_depth = 0 " \
+ " AND (n.moved_to IS NOT NULL " \
+ " OR n.moved_here IS NOT NULL) " \
+ "UNION ALL " \
+ "SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin' " \
+ "FROM nodes d " \
+ "WHERE d.op_depth = relpath_depth(d.local_relpath) " \
+ " AND d.moved_here IS NOT NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes s " \
+ " WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath) " \
+ "UNION ALL " \
+ "SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target' " \
+ "FROM nodes s " \
+ "WHERE s.moved_to IS NOT NULL " \
+ " AND NOT EXISTS(SELECT 1 FROM nodes d " \
+ " WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to " \
+ " AND d.op_depth = relpath_depth(d.local_relpath) " \
+ " AND d.moved_here =1 AND d.repos_path IS NOT NULL) " \
+ ""
+
#define WC_QUERIES_SQL_DECLARE_STATEMENTS(varname) \
static const char * const varname[] = { \
STMT_0, \
diff --git a/subversion/libsvn_wc/wc-queries.sql b/subversion/libsvn_wc/wc-queries.sql
index 7cdb46c..3a8bf92 100644
--- a/subversion/libsvn_wc/wc-queries.sql
+++ b/subversion/libsvn_wc/wc-queries.sql
@@ -72,6 +72,12 @@ WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
-- STMT_SELECT_BASE_CHILDREN_INFO
SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
+ revision, depth, file_external
+FROM nodes
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+
+-- STMT_SELECT_BASE_CHILDREN_INFO_LOCK
+SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
revision, depth, file_external,
lock_token, lock_owner, lock_comment, lock_date
FROM nodes
@@ -79,6 +85,7 @@ LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
AND nodes.repos_path = lock.repos_relpath
WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+
-- STMT_SELECT_WORKING_NODE
SELECT op_depth, presence, kind, checksum, translated_size,
changed_revision, changed_date, changed_author, depth, symlink_target,
@@ -92,7 +99,7 @@ LIMIT 1
-- STMT_SELECT_DEPTH_NODE
SELECT repos_id, repos_path, presence, kind, revision, checksum,
translated_size, changed_revision, changed_date, changed_author, depth,
- symlink_target, last_mod_time, properties
+ symlink_target, properties, moved_to, moved_here
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
@@ -118,8 +125,9 @@ WHERE wc_id = ?1 AND local_relpath = ?2
-- STMT_SELECT_NODE_CHILDREN_INFO
/* Getting rows in an advantageous order using
ORDER BY local_relpath, op_depth DESC
- turns out to be slower than getting rows in a random order and making the
- C code handle it. */
+ doesn't work as the index is created without the DESC keyword.
+ Using both local_relpath and op_depth descending does work without any
+ performance penalty. */
SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
checksum, translated_size, changed_revision, changed_date, changed_author,
depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
@@ -128,11 +136,27 @@ FROM nodes
LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
WHERE wc_id = ?1 AND parent_relpath = ?2
+ORDER BY local_relpath DESC, op_depth DESC
+
+-- STMT_SELECT_BASE_NODE_CHILDREN_INFO
+/* See above re: result ordering. The results of this query must be in
+the same order as returned by STMT_SELECT_NODE_CHILDREN_INFO, because
+read_children_info expects them to be. */
+SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
+ checksum, translated_size, changed_revision, changed_date, changed_author,
+ depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
+ lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
+FROM nodes
+LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
+ AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+ORDER BY local_relpath DESC
-- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
SELECT local_relpath, op_depth, presence, kind
FROM nodes_current
WHERE wc_id = ?1 AND parent_relpath = ?2
+ORDER BY local_relpath
-- STMT_SELECT_ACTUAL_CHILDREN_INFO
SELECT local_relpath, changelist, properties, conflict_data
@@ -161,16 +185,6 @@ INSERT OR REPLACE INTO nodes (
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,
?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23)
--- STMT_SELECT_BASE_PRESENT
-SELECT local_relpath, kind FROM nodes n
-WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
- AND op_depth = 0
- AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
- AND NOT EXISTS(SELECT 1 FROM NODES w
- WHERE w.wc_id = ?1 AND w.local_relpath = n.local_relpath
- AND op_depth > 0)
-ORDER BY local_relpath DESC
-
-- STMT_SELECT_WORKING_PRESENT
SELECT local_relpath, kind, checksum, translated_size, last_mod_time
FROM nodes n
@@ -210,13 +224,23 @@ WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
-- STMT_DELETE_WORKING_BASE_DELETE
DELETE FROM nodes
+WHERE wc_id = ?1 AND local_relpath = ?2
+ AND presence = MAP_BASE_DELETED
+ AND op_depth > ?3
+ AND op_depth = (SELECT MIN(op_depth) FROM nodes n
+ WHERE n.wc_id = ?1
+ AND n.local_relpath = nodes.local_relpath
+ AND op_depth > ?3)
+
+-- STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE
+DELETE FROM nodes
WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND presence = MAP_BASE_DELETED
- AND op_depth > 0
+ AND op_depth > ?3
AND op_depth = (SELECT MIN(op_depth) FROM nodes n
WHERE n.wc_id = ?1
AND n.local_relpath = nodes.local_relpath
- AND op_depth > 0)
+ AND op_depth > ?3)
-- STMT_DELETE_WORKING_RECURSIVE
DELETE FROM nodes
@@ -225,34 +249,42 @@ WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
-- STMT_DELETE_BASE_RECURSIVE
DELETE FROM nodes
-WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+WHERE wc_id = ?1 AND (local_relpath = ?2
+ OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND op_depth = 0
-- STMT_DELETE_WORKING_OP_DEPTH
DELETE FROM nodes
-WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = ?3
-
--- STMT_DELETE_WORKING_OP_DEPTH_ABOVE
-DELETE FROM nodes
-WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth > ?3
-
--- STMT_SELECT_LOCAL_RELPATH_OP_DEPTH
-SELECT local_relpath
-FROM nodes
WHERE wc_id = ?1
AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND op_depth = ?3
--- STMT_SELECT_CHILDREN_OP_DEPTH
+/* Full layer replacement check code for handling moves
+The op_root must exist (or there is no layer to replace) and an op-root
+ always has presence 'normal' */
+-- STMT_SELECT_LAYER_FOR_REPLACE
+SELECT s.local_relpath, s.kind,
+ RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, 'normal'
+FROM nodes s
+WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
+UNION ALL
+SELECT s.local_relpath, s.kind,
+ RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, d.presence
+FROM nodes s
+LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5
+ AND d.local_relpath = drp
+WHERE s.wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(s.local_relpath, ?2)
+ AND s.op_depth = ?3
+ORDER BY s.local_relpath
+
+-- STMT_SELECT_DESCENDANTS_OP_DEPTH_RV
SELECT local_relpath, kind
FROM nodes
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND op_depth = ?3
+ AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
ORDER BY local_relpath DESC
-- STMT_COPY_NODE_MOVE
@@ -262,25 +294,51 @@ INSERT OR REPLACE INTO nodes (
changed_author, checksum, properties, translated_size, last_mod_time,
symlink_target, moved_here, moved_to )
SELECT
- wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
- repos_id,
- repos_path, revision, presence, depth, kind, changed_revision,
- changed_date, changed_author, checksum, properties, translated_size,
- last_mod_time, symlink_target, 1,
- (SELECT dst.moved_to FROM nodes AS dst
- WHERE dst.wc_id = ?1
- AND dst.local_relpath = ?4
- AND dst.op_depth = ?5)
-FROM nodes
-WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
+ s.wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
+ s.repos_id,
+ s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision,
+ s.changed_date, s.changed_author, s.checksum, s.properties,
+ CASE WHEN d.checksum=s.checksum THEN d.translated_size END,
+ CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END,
+ s.symlink_target, 1, d.moved_to
+FROM nodes s
+LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5
+WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
+
+-- STMT_SELECT_NO_LONGER_MOVED_RV
+SELECT d.local_relpath, RELPATH_SKIP_JOIN(?2, ?4, d.local_relpath) srp,
+ b.presence, b.op_depth
+FROM nodes d
+LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath
+ AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x
+ WHERE x.wc_id = ?1
+ AND x.local_relpath = b.local_relpath
+ AND x.op_depth < ?3)
+WHERE d.wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(d.local_relpath, ?2)
+ AND d.op_depth = ?3
+ AND NOT EXISTS(SELECT * FROM nodes s
+ WHERE s.wc_id = ?1
+ AND s.local_relpath = srp
+ AND s.op_depth = ?5)
+ORDER BY d.local_relpath DESC
-- STMT_SELECT_OP_DEPTH_CHILDREN
SELECT local_relpath, kind FROM nodes
-WHERE wc_id = ?1
+WHERE wc_id = ?1
AND parent_relpath = ?2
AND op_depth = ?3
AND presence != MAP_BASE_DELETED
AND file_external is NULL
+ORDER BY local_relpath
+
+-- STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS
+SELECT local_relpath, kind FROM nodes
+WHERE wc_id = ?1
+ AND parent_relpath = ?2
+ AND op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ORDER BY local_relpath
/* Used by non-recursive revert to detect higher level children, and
actual-only rows that would be left orphans, if the revert
@@ -288,7 +346,8 @@ WHERE wc_id = ?1
-- STMT_SELECT_GE_OP_DEPTH_CHILDREN
SELECT 1 FROM nodes
WHERE wc_id = ?1 AND parent_relpath = ?2
- AND (op_depth > ?3 OR (op_depth = ?3 AND presence != MAP_BASE_DELETED))
+ AND (op_depth > ?3 OR (op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
UNION ALL
SELECT 1 FROM ACTUAL_NODE a
WHERE wc_id = ?1 AND parent_relpath = ?2
@@ -318,10 +377,11 @@ WHERE wc_id = ?1 AND op_depth = ?3
-- STMT_COMMIT_DESCENDANTS_TO_BASE
UPDATE NODES SET op_depth = 0,
repos_id = ?4,
- repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
+ repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
revision = ?6,
dav_cache = NULL,
moved_here = NULL,
+ moved_to = NULL,
presence = CASE presence
WHEN MAP_NORMAL THEN MAP_NORMAL
WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
@@ -334,22 +394,30 @@ WHERE wc_id = ?1
-- STMT_SELECT_NODE_CHILDREN
/* Return all paths that are children of the directory (?1, ?2) in any
op-depth, including children of any underlying, replaced directories. */
-SELECT local_relpath FROM nodes
+SELECT DISTINCT local_relpath FROM nodes
WHERE wc_id = ?1 AND parent_relpath = ?2
+ORDER BY local_relpath
-- STMT_SELECT_WORKING_CHILDREN
/* Return all paths that are children of the working version of the
directory (?1, ?2). A given path is not included just because it is a
child of an underlying (replaced) directory, it has to be in the
working version of the directory. */
-SELECT local_relpath FROM nodes
+SELECT DISTINCT local_relpath FROM nodes
WHERE wc_id = ?1 AND parent_relpath = ?2
AND (op_depth > (SELECT MAX(op_depth) FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2)
OR
(op_depth = (SELECT MAX(op_depth) FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2)
- AND presence != MAP_BASE_DELETED))
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
+ORDER BY local_relpath
+
+-- STMT_SELECT_BASE_NOT_PRESENT_CHILDREN
+SELECT local_relpath FROM nodes
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+ AND presence = MAP_NOT_PRESENT
+ORDER BY local_relpath
-- STMT_SELECT_NODE_PROPS
SELECT properties, presence FROM nodes
@@ -396,25 +464,13 @@ SELECT dav_cache FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
-- STMT_SELECT_DELETION_INFO
-SELECT (SELECT b.presence FROM nodes AS b
- WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0),
- work.presence, work.op_depth
-FROM nodes_current AS work
-WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0
-LIMIT 1
-
--- STMT_SELECT_DELETION_INFO_SCAN
-/* ### FIXME. moved.moved_to IS NOT NULL works when there is
- only one move but we need something else when there are several. */
-SELECT (SELECT b.presence FROM nodes AS b
- WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0),
- work.presence, work.op_depth, moved.moved_to
-FROM nodes_current AS work
-LEFT OUTER JOIN nodes AS moved
- ON moved.wc_id = work.wc_id
- AND moved.local_relpath = work.local_relpath
- AND moved.moved_to IS NOT NULL
-WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0
+SELECT b.presence, w.presence, w.op_depth, w.moved_to
+FROM nodes w
+LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0
+WHERE w.wc_id = ?1 AND w.local_relpath = ?2
+ AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d
+ WHERE d.wc_id = ?1 AND d.local_relpath = ?2
+ AND d.op_depth > 0)
LIMIT 1
-- STMT_SELECT_MOVED_TO_NODE
@@ -424,24 +480,20 @@ WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL
ORDER BY op_depth DESC
-- STMT_SELECT_OP_DEPTH_MOVED_TO
-SELECT op_depth, moved_to, repos_path, revision
+SELECT op_depth, moved_to
FROM nodes
-WHERE wc_id = ?1 AND local_relpath = ?2
- AND op_depth <= (SELECT MIN(op_depth) FROM nodes
- WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
-ORDER BY op_depth DESC
+WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
+ AND EXISTS(SELECT * from nodes
+ WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))
+ORDER BY op_depth ASC
+LIMIT 1
-- STMT_SELECT_MOVED_TO
SELECT moved_to
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
--- STMT_SELECT_MOVED_HERE
-SELECT moved_here, presence, repos_path, revision
-FROM nodes
-WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3
-ORDER BY op_depth
-
-- STMT_SELECT_MOVED_BACK
SELECT u.local_relpath,
u.presence, u.repos_id, u.repos_path, u.revision,
@@ -467,13 +519,6 @@ WHERE u.wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
AND u.op_depth = ?4
--- STMT_DELETE_MOVED_BACK
-DELETE FROM nodes
-WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = ?3
-
-- STMT_DELETE_LOCK
DELETE FROM lock
WHERE repos_id = ?1 AND repos_relpath = ?2
@@ -498,7 +543,7 @@ UPDATE nodes SET repos_id = ?4, dav_cache = NULL
WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND repos_id = ?3)
-
+
-- STMT_UPDATE_LOCK_REPOS_ID
UPDATE lock SET repos_id = ?2
@@ -677,6 +722,13 @@ INSERT OR IGNORE INTO actual_node (
SELECT wc_id, local_relpath, parent_relpath
FROM targets_list
+-- STMT_INSERT_ACTUAL_EMPTIES_FILES
+INSERT OR IGNORE INTO actual_node (
+ wc_id, local_relpath, parent_relpath)
+SELECT wc_id, local_relpath, parent_relpath
+FROM targets_list
+WHERE kind=MAP_FILE
+
-- STMT_DELETE_ACTUAL_EMPTY
DELETE FROM actual_node
WHERE wc_id = ?1 AND local_relpath = ?2
@@ -691,7 +743,7 @@ WHERE wc_id = ?1 AND local_relpath = ?2
-- STMT_DELETE_ACTUAL_EMPTIES
DELETE FROM actual_node
WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND properties IS NULL
AND conflict_data IS NULL
AND changelist IS NULL
@@ -755,7 +807,7 @@ WHERE wc_id = ?1
OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND (changelist IS NULL
OR NOT EXISTS (SELECT 1 FROM nodes_current c
- WHERE c.wc_id = ?1
+ WHERE c.wc_id = ?1
AND c.local_relpath = actual_node.local_relpath
AND c.kind = MAP_FILE))
@@ -770,6 +822,17 @@ SET properties = NULL,
right_checksum = NULL
WHERE wc_id = ?1 AND local_relpath = ?2
+-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT
+UPDATE actual_node
+SET properties = NULL,
+ text_mod = NULL,
+ tree_conflict_data = NULL,
+ older_checksum = NULL,
+ left_checksum = NULL,
+ right_checksum = NULL,
+ changelist = NULL
+WHERE wc_id = ?1 AND local_relpath = ?2
+
-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
UPDATE actual_node
SET properties = NULL,
@@ -787,6 +850,7 @@ WHERE wc_id = ?1
UPDATE nodes SET depth = ?3
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
AND kind=MAP_DIR
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
-- STMT_UPDATE_NODE_BASE_PRESENCE
UPDATE nodes SET presence = ?3
@@ -891,6 +955,14 @@ SELECT local_dir_relpath FROM wc_lock
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
+-- STMT_FIND_CONFLICT_DESCENDANT
+SELECT 1 FROM actual_node
+WHERE wc_id = ?1
+ AND local_relpath > (?2 || '/')
+ AND local_relpath < (?2 || '0') /* '0' = ascii('/') +1 */
+ AND conflict_data IS NOT NULL
+LIMIT 1
+
-- STMT_DELETE_WC_LOCK_ORPHAN
DELETE FROM wc_lock
WHERE wc_id = ?1 AND local_dir_relpath = ?2
@@ -924,22 +996,11 @@ VALUES (?1, ?2, 0,
AND op_depth = 0))
-- STMT_INSTALL_WORKING_NODE_FOR_DELETE
-INSERT OR REPLACE INTO nodes (
+INSERT INTO nodes (
wc_id, local_relpath, op_depth,
parent_relpath, presence, kind)
VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
--- STMT_DELETE_NO_LOWER_LAYER
-DELETE FROM nodes
- WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = ?3
- AND NOT EXISTS (SELECT 1 FROM nodes n
- WHERE n.wc_id = ?1
- AND n.local_relpath = nodes.local_relpath
- AND n.op_depth = ?4
- AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE))
-
-- STMT_REPLACE_WITH_BASE_DELETED
INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
kind, moved_to, presence)
@@ -947,33 +1008,41 @@ SELECT wc_id, local_relpath, op_depth, parent_relpath,
kind, moved_to, MAP_BASE_DELETED
FROM nodes
WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
+ AND local_relpath = ?2
AND op_depth = ?3
-/* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
+/* If this query is updated, STMT_INSERT_DELETE_LIST should too.
+ Use UNION ALL instead of a simple 'OR' to avoid creating a temp table */
-- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
INSERT INTO nodes (
wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
kind
FROM nodes
+WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
+UNION ALL
+SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
+ kind
+FROM nodes
WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND op_depth = ?3
AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
AND file_external IS NULL
+ORDER BY local_relpath
-- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
-INSERT INTO nodes (
+INSERT OR REPLACE INTO nodes (
wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
revision, presence, depth, kind, changed_revision, changed_date,
changed_author, checksum, properties, translated_size, last_mod_time,
- symlink_target )
+ symlink_target, moved_to )
SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
repos_path, revision, presence, depth, kind, changed_revision,
changed_date, changed_author, checksum, properties, translated_size,
- last_mod_time, symlink_target
+ last_mod_time, symlink_target,
+ (SELECT moved_to FROM nodes
+ WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
@@ -992,11 +1061,30 @@ WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND op_depth = ?3
--- STMT_UPDATE_OP_DEPTH_RECURSIVE
-UPDATE nodes SET op_depth = ?4, moved_here = NULL
-WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = ?3
+/* Duplicated SELECT body to avoid creating temporary table */
+-- STMT_COPY_OP_DEPTH_RECURSIVE
+INSERT INTO nodes (
+ wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
+ revision, presence, depth, kind, changed_revision, changed_date,
+ changed_author, checksum, properties, translated_size, last_mod_time,
+ symlink_target, moved_here, moved_to )
+SELECT
+ wc_id, local_relpath, ?4, parent_relpath, repos_id,
+ repos_path, revision, presence, depth, kind, changed_revision,
+ changed_date, changed_author, checksum, properties, translated_size,
+ last_mod_time, symlink_target, NULL, NULL
+FROM nodes
+WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2
+UNION ALL
+SELECT
+ wc_id, local_relpath, ?4, parent_relpath, repos_id,
+ repos_path, revision, presence, depth, kind, changed_revision,
+ changed_date, changed_author, checksum, properties, translated_size,
+ last_mod_time, symlink_target, NULL, NULL
+FROM nodes
+WHERE wc_id = ?1 AND op_depth = ?3
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ORDER BY local_relpath
-- STMT_DOES_NODE_EXIST
SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
@@ -1198,7 +1286,10 @@ WHERE (wc_id = ?1 AND local_relpath = ?2)
OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
-- STMT_PRAGMA_LOCKING_MODE
-PRAGMA locking_mode = exclusive
+PRAGMA locking_mode = exclusive;
+/* Testing shows DELETE is faster than TRUNCATE on NFS and
+ exclusive-locking is mostly used on remote file systems. */
+PRAGMA journal_mode = DELETE
/* ------------------------------------------------------------------------- */
@@ -1213,14 +1304,6 @@ VALUES (?1, ?2, ?3, ?4, ?5, ?6)
/* these are used in upgrade.c */
--- STMT_UPDATE_ACTUAL_CONFLICT_DATA
-UPDATE actual_node SET conflict_data = ?3
-WHERE wc_id = ?1 AND local_relpath = ?2
-
--- STMT_INSERT_ACTUAL_CONFLICT_DATA
-INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
-VALUES (?1, ?2, ?3, ?4)
-
-- STMT_SELECT_ALL_FILES
SELECT local_relpath FROM nodes_current
WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
@@ -1333,8 +1416,9 @@ BEGIN
WHERE n.wc_id = OLD.wc_id
AND n.local_relpath = OLD.local_relpath)
THEN 1
- ELSE NULL
- END;
+ END notify
+ WHERE OLD.conflict_data IS NOT NULL
+ OR notify IS NOT NULL;
END;
DROP TRIGGER IF EXISTS trigger_revert_list_actual_update;
CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
@@ -1350,8 +1434,9 @@ BEGIN
WHERE n.wc_id = OLD.wc_id
AND n.local_relpath = OLD.local_relpath)
THEN 1
- ELSE NULL
- END;
+ END notify
+ WHERE OLD.conflict_data IS NOT NULL
+ OR notify IS NOT NULL;
END
-- STMT_DROP_REVERT_LIST_TRIGGERS
@@ -1377,12 +1462,15 @@ ORDER BY local_relpath
DELETE FROM revert_list WHERE local_relpath = ?1
-- STMT_SELECT_REVERT_LIST_RECURSIVE
-SELECT DISTINCT local_relpath
-FROM revert_list
-WHERE (local_relpath = ?1
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
- AND (notify OR actual = 0)
-ORDER BY local_relpath
+SELECT p.local_relpath, n.kind, a.notify, a.kind
+FROM (SELECT DISTINCT local_relpath
+ FROM revert_list
+ WHERE (local_relpath = ?1
+ OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p
+
+LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0
+LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1
+ORDER BY p.local_relpath
-- STMT_DELETE_REVERT_LIST_RECURSIVE
DELETE FROM revert_list
@@ -1404,16 +1492,18 @@ CREATE TEMPORARY TABLE delete_list (
A subquery is used instead of nodes_current to avoid a table scan */
-- STMT_INSERT_DELETE_LIST
INSERT INTO delete_list(local_relpath)
+SELECT ?2
+UNION ALL
SELECT local_relpath FROM nodes AS n
WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND op_depth >= ?3
AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
WHERE s.wc_id = ?1
AND s.local_relpath = n.local_relpath)
AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
AND file_external IS NULL
+ORDER by local_relpath
-- STMT_SELECT_DELETE_LIST
SELECT local_relpath FROM delete_list
@@ -1429,7 +1519,7 @@ CREATE TEMPORARY TABLE update_move_list (
### working copies. queries, etc will need to be adjusted. */
local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
action INTEGER NOT NULL,
- kind INTEGER NOT NULL,
+ kind TEXT NOT NULL,
content_state INTEGER NOT NULL,
prop_state INTEGER NOT NULL
)
@@ -1447,6 +1537,11 @@ ORDER BY local_relpath
-- STMT_FINALIZE_UPDATE_MOVE
DROP TABLE IF EXISTS update_move_list
+-- STMT_MOVE_NOTIFY_TO_REVERT
+INSERT INTO revert_list (local_relpath, notify, kind, actual)
+ SELECT local_relpath, 2, kind, 1 FROM update_move_list;
+DROP TABLE update_move_list
+
/* ------------------------------------------------------------------------- */
/* Queries for revision status. */
@@ -1499,16 +1594,6 @@ WHERE wc_id = ?1
AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
LIMIT 1
--- STMT_SELECT_BASE_FILES_RECURSIVE
-SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
-WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = 0
- AND kind=MAP_FILE
- AND presence=MAP_NORMAL
- AND file_external IS NULL
-
-- STMT_SELECT_MOVED_FROM_RELPATH
SELECT local_relpath, op_depth FROM nodes
WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
@@ -1571,31 +1656,30 @@ UPDATE nodes SET moved_to = NULL
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
-
-/* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1,
- * where the source of the move is within the subtree rooted at path ?2, and
- * the destination of the move is outside the subtree rooted at path ?2. */
--- STMT_SELECT_MOVED_PAIR2
-SELECT local_relpath, moved_to, op_depth FROM nodes
-WHERE wc_id = ?1
- AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND moved_to IS NOT NULL
- AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
- AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
- WHERE o.wc_id = ?1
- AND o.local_relpath = ?2)
-
-- STMT_SELECT_MOVED_PAIR3
-SELECT local_relpath, moved_to, op_depth, kind FROM nodes
-WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
- AND moved_to IS NOT NULL
+SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
+FROM nodes n
+JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
+ AND d.op_depth = (SELECT MIN(dd.op_depth)
+ FROM nodes dd
+ WHERE dd.wc_id = ?1
+ AND dd.local_relpath = d.local_relpath
+ AND dd.op_depth > ?3)
+WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3
+ AND d.moved_to IS NOT NULL
UNION ALL
-SELECT local_relpath, moved_to, op_depth, kind FROM nodes
-WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
- AND op_depth > ?3
- AND moved_to IS NOT NULL
-ORDER BY local_relpath, op_depth
+SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
+FROM nodes n
+JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
+ AND d.op_depth = (SELECT MIN(dd.op_depth)
+ FROM nodes dd
+ WHERE dd.wc_id = ?1
+ AND dd.local_relpath = d.local_relpath
+ AND dd.op_depth > ?3)
+WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
+ AND n.op_depth = ?3
+ AND d.moved_to IS NOT NULL
+ORDER BY n.local_relpath
-- STMT_SELECT_MOVED_OUTSIDE
SELECT local_relpath, moved_to, op_depth FROM nodes
@@ -1605,40 +1689,22 @@ WHERE wc_id = ?1
AND moved_to IS NOT NULL
AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
--- STMT_SELECT_OP_DEPTH_MOVED_PAIR
-SELECT n.local_relpath, n.moved_to,
- (SELECT o.repos_path FROM nodes AS o
- WHERE o.wc_id = n.wc_id
- AND o.local_relpath = n.local_relpath
- AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1)
-FROM nodes AS n
-WHERE n.wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
- AND n.op_depth = ?3
- AND n.moved_to IS NOT NULL
-
--- STMT_SELECT_MOVED_DESCENDANTS
-SELECT n.local_relpath, h.moved_to
-FROM nodes n, nodes h
-WHERE n.wc_id = ?1
- AND h.wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
- AND h.local_relpath = n.local_relpath
- AND n.op_depth = ?3
- AND h.op_depth = (SELECT MIN(o.op_depth)
- FROM nodes o
- WHERE o.wc_id = ?1
- AND o.local_relpath = n.local_relpath
- AND o.op_depth > ?3)
- AND h.moved_to IS NOT NULL
+-- STMT_SELECT_MOVED_DESCENDANTS_SRC
+SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to
+FROM nodes n
+JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath
+ AND s.op_depth = (SELECT MIN(d.op_depth)
+ FROM nodes d
+ WHERE d.wc_id = ?1
+ AND d.local_relpath = s.local_relpath
+ AND d.op_depth > ?3)
+WHERE n.wc_id = ?1 AND n.op_depth = ?3
+ AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
+ AND s.moved_to IS NOT NULL
-- STMT_COMMIT_UPDATE_ORIGIN
-/* Note that the only reason this SUBSTR() trick is valid is that you
- can move neither the working copy nor the repository root.
-
- SUBSTR(local_relpath, LENGTH(?2)+1) includes the '/' of the path */
UPDATE nodes SET repos_id = ?4,
- repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
+ repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
revision = ?6
WHERE wc_id = ?1
AND (local_relpath = ?2
@@ -1658,14 +1724,16 @@ ORDER BY local_relpath
-- STMT_SELECT_HAS_NON_FILE_CHILDREN
SELECT 1 FROM nodes
-WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE
+LIMIT 1
-- STMT_SELECT_HAS_GRANDCHILDREN
SELECT 1 FROM nodes
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
- AND op_depth = 0
+ AND op_depth = ?3
AND file_external IS NULL
+LIMIT 1
/* ------------------------------------------------------------------------- */
diff --git a/subversion/libsvn_wc/wc.h b/subversion/libsvn_wc/wc.h
index d7cf017..ab6870d 100644
--- a/subversion/libsvn_wc/wc.h
+++ b/subversion/libsvn_wc/wc.h
@@ -158,7 +158,7 @@ extern "C" {
* Bumped in r1395109.
*
* == 1.8.x shipped with format 31
- *
+ *
* Please document any further format changes here.
*/
@@ -253,52 +253,6 @@ svn_wc__context_create_with_db(svn_wc_context_t **wc_ctx,
apr_pool_t *
svn_wc__get_committed_queue_pool(const struct svn_wc_committed_queue_t *queue);
-
-/** Internal helper for svn_wc_process_committed_queue2().
- *
- * ### If @a queue is NULL, then ...?
- * ### else:
- * Bump an item from @a queue (the one associated with @a
- * local_abspath) to @a new_revnum after a commit succeeds, recursing
- * if @a recurse is set.
- *
- * @a new_date is the (server-side) date of the new revision, or 0.
- *
- * @a rev_author is the (server-side) author of the new
- * revision; it may be @c NULL.
- *
- * @a new_dav_cache is a hash of dav property changes to be made to
- * the @a local_abspath.
- * ### [JAF] Is it? See svn_wc_queue_committed3(). It ends up being
- * ### assigned as a whole to wc.db:BASE_NODE:dav_cache.
- *
- * If @a no_unlock is set, don't release any user locks on @a
- * local_abspath; otherwise release them as part of this processing.
- *
- * If @a keep_changelist is set, don't remove any changeset assignments
- * from @a local_abspath; otherwise, clear it of such assignments.
- *
- * If @a sha1_checksum is non-NULL, use it to identify the node's pristine
- * text.
- *
- * Set TOP_OF_RECURSE to TRUE to show that this the top of a possibly
- * recursive commit operation.
- */
-svn_error_t *
-svn_wc__process_committed_internal(svn_wc__db_t *db,
- const char *local_abspath,
- svn_boolean_t recurse,
- svn_boolean_t top_of_recurse,
- svn_revnum_t new_revnum,
- apr_time_t new_date,
- const char *rev_author,
- apr_hash_t *new_dav_cache,
- svn_boolean_t no_unlock,
- svn_boolean_t keep_changelist,
- const svn_checksum_t *sha1_checksum,
- const svn_wc_committed_queue_t *queue,
- apr_pool_t *scratch_pool);
-
/*** Update traversals. ***/
@@ -612,14 +566,6 @@ svn_wc__internal_remove_from_revision_control(svn_wc__db_t *db,
void *cancel_baton,
apr_pool_t *scratch_pool);
-/* Library-internal version of svn_wc__node_get_schedule(). */
-svn_error_t *
-svn_wc__internal_node_get_schedule(svn_wc_schedule_t *schedule,
- svn_boolean_t *copied,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool);
-
/* Internal version of svn_wc__node_get_origin() */
svn_error_t *
svn_wc__internal_get_origin(svn_boolean_t *is_copy,
@@ -627,6 +573,7 @@ svn_wc__internal_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__db_t *db,
const char *local_abspath,
@@ -634,17 +581,6 @@ svn_wc__internal_get_origin(svn_boolean_t *is_copy,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Internal version of svn_wc__node_get_repos_info() */
-svn_error_t *
-svn_wc__internal_get_repos_info(svn_revnum_t *revision,
- const char **repos_relpath,
- const char **repos_root_url,
- const char **repos_uuid,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
/* Upgrade the wc sqlite database given in SDB for the wc located at
WCROOT_ABSPATH. It's current/starting format is given by START_FORMAT.
After the upgrade is complete (to as far as the automatic upgrade will
@@ -699,9 +635,11 @@ svn_wc__write_check(svn_wc__db_t *db,
*/
svn_error_t *
svn_wc__read_conflicts(const apr_array_header_t **conflicts,
+ svn_skel_t **conflict_skel,
svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t create_tempfiles,
+ svn_boolean_t only_tree_conflict,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -785,24 +723,12 @@ svn_wc__externals_find_target_dups(apr_array_header_t **duplicate_targets,
apr_pool_t *pool,
apr_pool_t *scratch_pool);
-/* Revert tree LOCAL_ABSPATH to depth DEPTH and notify for all
- reverts. */
-svn_error_t *
-svn_wc__revert_internal(svn_wc__db_t *db,
- const char *local_abspath,
- svn_depth_t depth,
- svn_boolean_t use_commit_times,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool);
-
svn_error_t *
svn_wc__node_has_local_mods(svn_boolean_t *modified,
svn_boolean_t *all_edits_are_deletes,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
diff --git a/subversion/libsvn_wc/wc_db.c b/subversion/libsvn_wc/wc_db.c
index 6c0dd61..ee17b85 100644
--- a/subversion/libsvn_wc/wc_db.c
+++ b/subversion/libsvn_wc/wc_db.c
@@ -27,6 +27,7 @@
#include <apr_pools.h>
#include <apr_hash.h>
+#include "svn_private_config.h"
#include "svn_types.h"
#include "svn_error.h"
#include "svn_dirent_uri.h"
@@ -48,7 +49,7 @@
#include "workqueue.h"
#include "token-map.h"
-#include "svn_private_config.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_sqlite.h"
#include "private/svn_skel.h"
#include "private/svn_wc_private.h"
@@ -277,10 +278,9 @@ add_work_items(svn_sqlite__db_t *sdb,
apr_pool_t *scratch_pool);
static svn_error_t *
-set_actual_props(apr_int64_t wc_id,
+set_actual_props(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
apr_hash_t *props,
- svn_sqlite__db_t *db,
apr_pool_t *scratch_pool);
static svn_error_t *
@@ -354,13 +354,6 @@ convert_to_working_status(svn_wc__db_status_t *working_status,
svn_wc__db_status_t status);
static svn_error_t *
-wclock_owns_lock(svn_boolean_t *own_lock,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_boolean_t exact,
- apr_pool_t *scratch_pool);
-
-static svn_error_t *
db_is_switched(svn_boolean_t *is_switched,
svn_node_kind_t *kind,
svn_wc__db_wcroot_t *wcroot,
@@ -424,7 +417,7 @@ lock_from_columns(svn_sqlite__stmt_t *stmt,
svn_error_t *
svn_wc__db_fetch_repos_info(const char **repos_root_url,
const char **repos_uuid,
- svn_sqlite__db_t *sdb,
+ svn_wc__db_wcroot_t *wcroot,
apr_int64_t repos_id,
apr_pool_t *result_pool)
{
@@ -443,7 +436,7 @@ svn_wc__db_fetch_repos_info(const char **repos_root_url,
return SVN_NO_ERROR;
}
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_REPOSITORY_BY_ID));
SVN_ERR(svn_sqlite__bindf(stmt, "i", repos_id));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -493,35 +486,6 @@ repos_location_from_columns(apr_int64_t *repos_id,
}
}
-
-/* Get the statement given by STMT_IDX, and bind the appropriate wc_id and
- local_relpath based upon LOCAL_ABSPATH. Store it in *STMT, and use
- SCRATCH_POOL for temporary allocations.
-
- Note: WC_ID and LOCAL_RELPATH must be arguments 1 and 2 in the statement. */
-static svn_error_t *
-get_statement_for_path(svn_sqlite__stmt_t **stmt,
- svn_wc__db_t *db,
- const char *local_abspath,
- int stmt_idx,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
-
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- local_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
-
- SVN_ERR(svn_sqlite__get_statement(stmt, wcroot->sdb, stmt_idx));
- SVN_ERR(svn_sqlite__bindf(*stmt, "is", wcroot->wc_id, local_relpath));
-
- return SVN_NO_ERROR;
-}
-
-
/* For a given REPOS_ROOT_URL/REPOS_UUID pair, return the existing REPOS_ID
value. If one does not exist, then create a new one. */
static svn_error_t *
@@ -575,12 +539,53 @@ blank_ibb(insert_base_baton_t *pibb)
}
-svn_error_t *
-svn_wc__db_extend_parent_delete(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_node_kind_t kind,
- int op_depth,
- apr_pool_t *scratch_pool)
+/* Extend any delete of the parent of LOCAL_RELPATH to LOCAL_RELPATH.
+
+ ### What about KIND and OP_DEPTH? KIND ought to be redundant; I'm
+ discussing on dev@ whether we can let that be null for presence
+ == base-deleted. OP_DEPTH is the op-depth of what, and why?
+ It is used to select the lowest working node higher than OP_DEPTH,
+ so, in terms of the API, OP_DEPTH means ...?
+
+ Given a wc:
+
+ 0 1 2 3 4
+ normal
+ A normal
+ A/B normal normal
+ A/B/C not-pres normal
+ A/B/C/D normal
+
+ That is checkout, delete A/B, copy a replacement A/B, delete copied
+ child A/B/C, add replacement A/B/C, add A/B/C/D.
+
+ Now an update that adds base nodes for A/B/C, A/B/C/D and A/B/C/D/E
+ must extend the A/B deletion:
+
+ 0 1 2 3 4
+ normal
+ A normal
+ A/B normal normal
+ A/B/C normal not-pres normal
+ A/B/C/D normal base-del normal
+ A/B/C/D/E normal base-del
+
+ When adding a node if the parent has a higher working node then the
+ parent node is deleted (or replaced) and the delete must be extended
+ to cover new node.
+
+ In the example above A/B/C/D and A/B/C/D/E are the nodes that get
+ the extended delete, A/B/C is already deleted.
+
+ If ADDED_DELETE is not NULL, set *ADDED_DELETE to TRUE if a new delete
+ was recorded, otherwise to FALSE.
+ */
+static svn_error_t *
+db_extend_parent_delete(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_node_kind_t kind,
+ int op_depth,
+ apr_pool_t *scratch_pool)
{
svn_boolean_t have_row;
svn_sqlite__stmt_t *stmt;
@@ -622,7 +627,7 @@ svn_wc__db_extend_parent_delete(svn_wc__db_wcroot_t *wcroot,
}
-/* This is the reverse of svn_wc__db_extend_parent_delete.
+/* This is the reverse of db_extend_parent_delete.
When removing a node if the parent has a higher working node then
the parent node and this node are both deleted or replaced and any
@@ -632,11 +637,11 @@ svn_wc__db_extend_parent_delete(svn_wc__db_wcroot_t *wcroot,
only uses this function within an sqlite transaction if atomic
behavior is needed.
*/
-svn_error_t *
-svn_wc__db_retract_parent_delete(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- int op_depth,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+db_retract_parent_delete(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
@@ -825,8 +830,8 @@ insert_base_node(const insert_base_baton_t *pibb,
new_actual_props = NULL;
}
- SVN_ERR(set_actual_props(wcroot->wc_id, local_relpath, new_actual_props,
- wcroot->sdb, scratch_pool));
+ SVN_ERR(set_actual_props(wcroot, local_relpath, new_actual_props,
+ scratch_pool));
}
if (pibb->kind == svn_node_dir && pibb->children)
@@ -847,16 +852,16 @@ insert_base_node(const insert_base_baton_t *pibb,
|| (pibb->status == svn_wc__db_status_incomplete))
&& ! pibb->file_external)
{
- SVN_ERR(svn_wc__db_extend_parent_delete(wcroot, local_relpath,
- pibb->kind, 0,
- scratch_pool));
+ SVN_ERR(db_extend_parent_delete(wcroot, local_relpath,
+ pibb->kind, 0,
+ scratch_pool));
}
else if (pibb->status == svn_wc__db_status_not_present
|| pibb->status == svn_wc__db_status_server_excluded
|| pibb->status == svn_wc__db_status_excluded)
{
- SVN_ERR(svn_wc__db_retract_parent_delete(wcroot, local_relpath, 0,
- scratch_pool));
+ SVN_ERR(db_retract_parent_delete(wcroot, local_relpath, 0,
+ scratch_pool));
}
}
@@ -1101,8 +1106,8 @@ insert_working_node(const insert_working_baton_t *piwb,
new_actual_props = NULL;
}
- SVN_ERR(set_actual_props(wcroot->wc_id, local_relpath, new_actual_props,
- wcroot->sdb, scratch_pool));
+ SVN_ERR(set_actual_props(wcroot, local_relpath, new_actual_props,
+ scratch_pool));
}
if (piwb->kind == svn_node_dir)
@@ -1148,159 +1153,44 @@ insert_working_node(const insert_working_baton_t *piwb,
}
-/* Each name is allocated in RESULT_POOL and stored into CHILDREN as a key
- pointed to the same name. */
-static svn_error_t *
-add_children_to_hash(apr_hash_t *children,
- int stmt_idx,
- svn_sqlite__db_t *sdb,
- apr_int64_t wc_id,
- const char *parent_relpath,
- apr_pool_t *result_pool)
-{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, stmt_idx));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, parent_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- while (have_row)
- {
- const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- const char *name = svn_relpath_basename(child_relpath, result_pool);
-
- svn_hash_sets(children, name, name);
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
-
- return svn_sqlite__reset(stmt);
-}
-
-
-/* Set *CHILDREN to a new array of the (const char *) basenames of the
- immediate children, whatever their status, of the working node at
- LOCAL_RELPATH. */
-static svn_error_t *
-gather_children2(const apr_array_header_t **children,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- apr_hash_t *names_hash = apr_hash_make(scratch_pool);
- apr_array_header_t *names_array;
-
- /* All of the names get allocated in RESULT_POOL. It
- appears to be faster to use the hash to remove duplicates than to
- use DISTINCT in the SQL query. */
- SVN_ERR(add_children_to_hash(names_hash, STMT_SELECT_WORKING_CHILDREN,
- wcroot->sdb, wcroot->wc_id,
- local_relpath, result_pool));
-
- SVN_ERR(svn_hash_keys(&names_array, names_hash, result_pool));
- *children = names_array;
- return SVN_NO_ERROR;
-}
-
/* Return in *CHILDREN all of the children of the directory LOCAL_RELPATH,
of any status, in all op-depths in the NODES table. */
static svn_error_t *
gather_children(const apr_array_header_t **children,
svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
+ const char *parent_relpath,
+ int stmt_idx,
+ int op_depth,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- apr_hash_t *names_hash = apr_hash_make(scratch_pool);
- apr_array_header_t *names_array;
-
- /* All of the names get allocated in RESULT_POOL. It
- appears to be faster to use the hash to remove duplicates than to
- use DISTINCT in the SQL query. */
- SVN_ERR(add_children_to_hash(names_hash, STMT_SELECT_NODE_CHILDREN,
- wcroot->sdb, wcroot->wc_id,
- local_relpath, result_pool));
-
- SVN_ERR(svn_hash_keys(&names_array, names_hash, result_pool));
- *children = names_array;
- return SVN_NO_ERROR;
-}
-
-
-/* Set *CHILDREN to a new array of (const char *) names of the children of
- the repository directory corresponding to WCROOT:LOCAL_RELPATH:OP_DEPTH -
- that is, only the children that are at the same op-depth as their parent. */
-static svn_error_t *
-gather_repo_children(const apr_array_header_t **children,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- int op_depth,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- apr_array_header_t *result
- = apr_array_make(result_pool, 0, sizeof(const char *));
+ apr_array_header_t *result;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_OP_DEPTH_CHILDREN));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- while (have_row)
- {
- const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
-
- /* Allocate the name in RESULT_POOL so we won't have to copy it. */
- APR_ARRAY_PUSH(result, const char *)
- = svn_relpath_basename(child_relpath, result_pool);
+ result = apr_array_make(result_pool, 16, sizeof(const char*));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
- SVN_ERR(svn_sqlite__reset(stmt));
-
- *children = result;
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_wc__db_get_children_op_depth(apr_hash_t **children,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- int op_depth,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
-
- *children = apr_hash_make(result_pool);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_idx));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, parent_relpath));
+ if (op_depth >= 0)
+ SVN_ERR(svn_sqlite__bind_int(stmt, 3, op_depth));
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_OP_DEPTH_CHILDREN));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
- op_depth));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- svn_node_kind_t *child_kind = apr_palloc(result_pool, sizeof(svn_node_kind_t));
+ const char *name = svn_relpath_basename(child_relpath, result_pool);
- *child_kind = svn_sqlite__column_token(stmt, 1, kind_map);
- svn_hash_sets(*children,
- svn_relpath_basename(child_relpath, result_pool),
- child_kind);
+ APR_ARRAY_PUSH(result, const char *) = name;
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
- SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__reset(stmt));
+ *children = result;
return SVN_NO_ERROR;
}
-
/* Return TRUE if CHILD_ABSPATH is an immediate child of PARENT_ABSPATH.
* Else, return FALSE. */
static svn_boolean_t
@@ -1358,7 +1248,7 @@ flush_entries(svn_wc__db_wcroot_t *wcroot,
hi;
hi = apr_hash_next(hi))
{
- const char *item_abspath = svn__apr_hash_index_key(hi);
+ const char *item_abspath = apr_hash_this_key(hi);
if ((depth == svn_depth_files || depth == svn_depth_immediates) &&
is_immediate_child_path(local_abspath, item_abspath))
@@ -1485,12 +1375,12 @@ init_db(/* output values */
SVN_ERR(svn_sqlite__exec_statements(db, STMT_CREATE_NODES_TRIGGERS));
SVN_ERR(svn_sqlite__exec_statements(db, STMT_CREATE_EXTERNALS));
+ SVN_ERR(svn_wc__db_install_schema_statistics(db, scratch_pool));
+
/* Insert the repository. */
SVN_ERR(create_repos_id(repos_id, repos_root_url, repos_uuid,
db, scratch_pool));
- SVN_ERR(svn_wc__db_install_schema_statistics(db, scratch_pool));
-
/* Insert the wcroot. */
/* ### Right now, this just assumes wc metadata is being stored locally. */
SVN_ERR(svn_sqlite__get_statement(&stmt, db, STMT_INSERT_WCROOT));
@@ -1508,7 +1398,7 @@ init_db(/* output values */
*wc_id, /* 1 */
"", /* 2 */
0, /* op_depth is 0 for base */
- NULL, /* 4 */
+ SVN_VA_NULL, /* 4 */
*repos_id,
root_node_repos_relpath,
root_node_revision,
@@ -1544,11 +1434,13 @@ create_db(svn_sqlite__db_t **sdb,
svn_revnum_t root_node_revision,
svn_depth_t root_node_depth,
svn_boolean_t exclusive,
+ apr_int32_t timeout,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR(svn_wc__db_util_open_db(sdb, dir_abspath, sdb_fname,
svn_sqlite__mode_rwcreate, exclusive,
+ timeout,
NULL /* my_statements */,
result_pool, scratch_pool));
@@ -1577,6 +1469,8 @@ svn_wc__db_init(svn_wc__db_t *db,
apr_int64_t wc_id;
svn_wc__db_wcroot_t *wcroot;
svn_boolean_t sqlite_exclusive = FALSE;
+ apr_int32_t sqlite_timeout = 0; /* default timeout */
+ apr_hash_index_t *hi;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR_ASSERT(repos_relpath != NULL);
@@ -1587,7 +1481,7 @@ svn_wc__db_init(svn_wc__db_t *db,
/* ### REPOS_ROOT_URL and REPOS_UUID may be NULL. ... more doc: tbd */
- SVN_ERR(svn_config_get_bool((svn_config_t *)db->config, &sqlite_exclusive,
+ SVN_ERR(svn_config_get_bool(db->config, &sqlite_exclusive,
SVN_CONFIG_SECTION_WORKING_COPY,
SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE,
FALSE));
@@ -1596,6 +1490,7 @@ svn_wc__db_init(svn_wc__db_t *db,
SVN_ERR(create_db(&sdb, &repos_id, &wc_id, local_abspath, repos_root_url,
repos_uuid, SDB_FILE,
repos_relpath, initial_rev, depth, sqlite_exclusive,
+ sqlite_timeout,
db->state_pool, scratch_pool));
/* Create the WCROOT for this directory. */
@@ -1603,9 +1498,31 @@ svn_wc__db_init(svn_wc__db_t *db,
apr_pstrdup(db->state_pool, local_abspath),
sdb, wc_id, FORMAT_FROM_SDB,
FALSE /* auto-upgrade */,
- FALSE /* enforce_empty_wq */,
db->state_pool, scratch_pool));
+ /* Any previously cached children may now have a new WCROOT, most likely that
+ of the new WCROOT, but there might be descendant directories that are their
+ own working copy, in which case setting WCROOT to our new WCROOT might
+ actually break things for those.
+
+ Clearing is the safest thing we can do in this case, as a test would lead
+ to unnecessary probing, while the standard code probes later anyway. So we
+ only lose a bit of memory
+
+ ### Perhaps we could check wcroot->abspath to detect which case we have
+ where, but currently it is already very hard to trigger this from
+ the short living 'svn' client. (GUI clients like TortoiseSVN are far
+ more likely to get in these cases)
+ */
+ for (hi = apr_hash_first(scratch_pool, db->dir_data);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ const char *abspath = apr_hash_this_key(hi);
+ if (svn_dirent_is_ancestor(wcroot->abspath, abspath))
+ svn_hash_sets(db->dir_data, abspath, NULL);
+ }
+
/* The WCROOT is complete. Stash it into DB. */
svn_hash_sets(db->dir_data, wcroot->abspath, wcroot);
@@ -1714,10 +1631,10 @@ svn_wc__db_base_add_directory(svn_wc__db_t *db,
const apr_array_header_t *children,
svn_depth_t depth,
apr_hash_t *dav_cache,
- const svn_skel_t *conflict,
svn_boolean_t update_actual_props,
apr_hash_t *new_actual_props,
apr_array_header_t *new_iprops,
+ const svn_skel_t *conflict,
const svn_skel_t *work_items,
apr_pool_t *scratch_pool)
{
@@ -2126,32 +2043,63 @@ svn_wc__db_base_add_not_present_node(svn_wc__db_t *db,
}
/* Recursively clear moved-here information at the copy-half of the move
- * which moved the node at SRC_RELPATH away. This transforms the move into
- * a simple copy. */
+ * which moved a node to MOVED_TO_RELPATH. This transforms this side of the
+ * move into a simple copy.
+ */
static svn_error_t *
-clear_moved_here(const char *src_relpath,
- svn_wc__db_wcroot_t *wcroot,
+clear_moved_here(svn_wc__db_wcroot_t *wcroot,
+ const char *moved_to_relpath,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
- const char *dst_relpath;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, STMT_SELECT_MOVED_TO));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- src_relpath, relpath_depth(src_relpath)));
- SVN_ERR(svn_sqlite__step_row(stmt));
- dst_relpath = svn_sqlite__column_text(stmt, 0, scratch_pool);
- SVN_ERR(svn_sqlite__reset(stmt));
+ int affected_rows;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_CLEAR_MOVED_HERE_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- dst_relpath, relpath_depth(dst_relpath)));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, moved_to_relpath,
+ relpath_depth(moved_to_relpath)));
+
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ if (affected_rows == 0)
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' was not found."),
+ path_for_error_message(wcroot, moved_to_relpath,
+ scratch_pool));
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__db_op_break_move_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *src_relpath,
+ int delete_op_depth,
+ const char *dst_relpath,
+ const svn_skel_t *work_items,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ int affected;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_CLEAR_MOVED_TO_RELPATH));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, src_relpath,
+ delete_op_depth));
+ SVN_ERR(svn_sqlite__update(&affected, stmt));
+
+ if (affected != 1)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("Path '%s' is not moved"),
+ path_for_error_message(wcroot, src_relpath,
+ scratch_pool));
+
+ SVN_ERR(clear_moved_here(wcroot, dst_relpath, scratch_pool));
+
+ SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+
/* The body of svn_wc__db_base_remove().
*/
static svn_error_t *
@@ -2159,9 +2107,9 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
svn_wc__db_t *db, /* For checking conflicts */
svn_boolean_t keep_as_working,
- svn_boolean_t queue_deletes,
- svn_boolean_t remove_locks,
- svn_revnum_t not_present_revision,
+ svn_boolean_t mark_not_present,
+ svn_boolean_t mark_excluded,
+ svn_revnum_t marker_revision,
svn_skel_t *conflict,
svn_skel_t *work_items,
apr_pool_t *scratch_pool)
@@ -2169,66 +2117,82 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
svn_wc__db_status_t status;
+ svn_revnum_t revision;
apr_int64_t repos_id;
const char *repos_relpath;
svn_node_kind_t kind;
svn_boolean_t keep_working;
+ int op_depth;
+ svn_node_kind_t wrk_kind;
+ svn_boolean_t no_delete_wc = FALSE;
+ svn_boolean_t file_external;
- SVN_ERR(svn_wc__db_base_get_info_internal(&status, &kind, NULL,
+ SVN_ERR(svn_wc__db_base_get_info_internal(&status, &kind, &revision,
&repos_relpath, &repos_id,
NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ &file_external,
wcroot, local_relpath,
scratch_pool, scratch_pool));
- if (remove_locks)
- {
- svn_sqlite__stmt_t *lock_stmt;
+ /* Check if there is already a working node */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_NODE_INFO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
- SVN_ERR(svn_sqlite__get_statement(&lock_stmt, wcroot->sdb,
- STMT_DELETE_LOCK_RECURSIVELY));
- SVN_ERR(svn_sqlite__bindf(lock_stmt, "is", repos_id, repos_relpath));
- SVN_ERR(svn_sqlite__step_done(lock_stmt));
- }
+ if (!have_row)
+ return svn_error_trace(svn_sqlite__reset(stmt)); /* No BASE */
+
+ op_depth = svn_sqlite__column_int(stmt, 0);
+ wrk_kind = svn_sqlite__column_token(stmt, 4, kind_map);
- if (status == svn_wc__db_status_normal
- && keep_as_working)
+ if (op_depth > 0
+ && op_depth == relpath_depth(local_relpath))
{
- SVN_ERR(svn_wc__db_op_make_copy(db,
- svn_dirent_join(wcroot->abspath,
- local_relpath,
- scratch_pool),
- NULL, NULL,
- scratch_pool));
- keep_working = TRUE;
+ svn_wc__db_status_t presence;
+ presence = svn_sqlite__column_token(stmt, 3, presence_map);
+
+ if (presence == svn_wc__db_status_base_deleted)
+ {
+ keep_working = FALSE;
+ no_delete_wc = TRUE;
+ }
+ else
+ {
+ keep_working = TRUE;
+ }
}
else
+ keep_working = FALSE;
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (keep_as_working && op_depth == 0)
{
- /* Check if there is already a working node */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&keep_working, stmt));
- SVN_ERR(svn_sqlite__reset(stmt));
+ if (status == svn_wc__db_status_normal
+ || status == svn_wc__db_status_incomplete)
+ {
+ SVN_ERR(svn_wc__db_op_make_copy_internal(wcroot, local_relpath, TRUE,
+ NULL, NULL,
+ scratch_pool));
+ }
+ keep_working = TRUE;
}
/* Step 1: Create workqueue operations to remove files and dirs in the
local-wc */
- if (!keep_working
- && queue_deletes
- && (status == svn_wc__db_status_normal
- || status == svn_wc__db_status_incomplete))
+ if (!keep_working && !no_delete_wc)
{
svn_skel_t *work_item;
const char *local_abspath;
local_abspath = svn_dirent_join(wcroot->abspath, local_relpath,
scratch_pool);
- if (kind == svn_node_dir)
+ if (wrk_kind == svn_node_dir)
{
apr_pool_t *iterpool;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_BASE_PRESENT));
+ STMT_SELECT_WORKING_PRESENT));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
iterpool = svn_pool_create(scratch_pool);
@@ -2307,27 +2271,12 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
ACTUAL_NODE records */
/* Step 3: Delete WORKING nodes */
- if (conflict)
+ if (!keep_working)
{
apr_pool_t *iterpool;
- /*
- * When deleting a conflicted node, moves of any moved-outside children
- * of the node must be broken. Else, the destination will still be marked
- * moved-here after the move source disappears from the working copy.
- *
- * ### FIXME: It would be nicer to have the conflict resolver
- * break the move instead. It might also be a good idea to
- * flag a tree conflict on each moved-away child. But doing so
- * might introduce actual-only nodes without direct parents,
- * and we're not yet sure if other existing code is prepared
- * to handle such nodes. To be revisited post-1.8.
- *
- * ### In case of a conflict we are most likely creating WORKING nodes
- * describing a copy of what was in BASE. The move information
- * should be updated to describe a move from the WORKING layer.
- * When stored that way the resolver of the tree conflict still has
- * the knowledge of what was moved.
+ /* When deleting everything in working we should break moves from
+ here and to here.
*/
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_MOVED_OUTSIDE));
@@ -2338,12 +2287,12 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
iterpool = svn_pool_create(scratch_pool);
while (have_row)
{
- const char *child_relpath;
+ const char *moved_to_relpath;
svn_error_t *err;
svn_pool_clear(iterpool);
- child_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
- err = clear_moved_here(child_relpath, wcroot, iterpool);
+ moved_to_relpath = svn_sqlite__column_text(stmt, 1, iterpool);
+ err = clear_moved_here(wcroot, moved_to_relpath, iterpool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -2351,11 +2300,52 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
svn_pool_destroy(iterpool);
SVN_ERR(svn_sqlite__reset(stmt));
}
- if (keep_working)
+ else
{
+ /* We are keeping things that are in WORKING, but we should still
+ break moves of things in BASE. (Mixed revisions make it
+ impossible to guarantee that we can keep everything moved) */
+
+ apr_pool_t *iterpool;
+
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_WORKING_BASE_DELETE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ STMT_SELECT_MOVED_DESCENDANTS_SRC));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ local_relpath, 0));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ iterpool = svn_pool_create(scratch_pool);
+ while (have_row)
+ {
+ int delete_op_depth = svn_sqlite__column_int(stmt, 0);
+ const char *src_relpath;
+ const char *dst_relpath;
+ svn_error_t *err;
+
+ svn_pool_clear(iterpool);
+
+ src_relpath = svn_sqlite__column_text(stmt, 1, iterpool);
+ dst_relpath = svn_sqlite__column_text(stmt, 4, iterpool);
+
+ err = svn_wc__db_op_break_move_internal(wcroot, src_relpath,
+ delete_op_depth,
+ dst_relpath,
+ NULL,
+ iterpool);
+
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+ svn_pool_destroy(iterpool);
+ SVN_ERR(svn_sqlite__reset(stmt));
+ }
+ if (keep_working)
+ {
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath, 0));
SVN_ERR(svn_sqlite__step_done(stmt));
}
else
@@ -2372,42 +2362,69 @@ db_base_remove(svn_wc__db_wcroot_t *wcroot,
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__step_done(stmt));
- /* Step 5: handle the BASE node itself */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_BASE_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- SVN_ERR(svn_wc__db_retract_parent_delete(wcroot, local_relpath, 0,
- scratch_pool));
-
- /* Step 6: Delete actual node if we don't keep working */
- if (! keep_working)
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_ACTUAL_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
+ SVN_ERR(db_retract_parent_delete(wcroot, local_relpath, 0, scratch_pool));
- if (SVN_IS_VALID_REVNUM(not_present_revision))
+ if (mark_not_present || mark_excluded)
{
struct insert_base_baton_t ibb;
- blank_ibb(&ibb);
+ svn_boolean_t no_marker = FALSE;
- ibb.repos_id = repos_id;
- ibb.status = svn_wc__db_status_not_present;
- ibb.kind = kind;
- ibb.repos_relpath = repos_relpath;
- ibb.revision = not_present_revision;
+ if (file_external)
+ {
+ const char *parent_local_relpath;
+ const char *name;
+ svn_error_t *err;
- /* Depending upon KIND, any of these might get used. */
- ibb.children = NULL;
- ibb.depth = svn_depth_unknown;
- ibb.checksum = NULL;
- ibb.target = NULL;
+ /* For file externals we only want to place a not present marker
+ if there is a BASE parent */
+
+ svn_relpath_split(&parent_local_relpath, &name, local_relpath,
+ scratch_pool);
- SVN_ERR(insert_base_node(&ibb, wcroot, local_relpath, scratch_pool));
+ err = svn_wc__db_base_get_info_internal(NULL, NULL, NULL,
+ &repos_relpath, &repos_id,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ wcroot, parent_local_relpath,
+ scratch_pool, scratch_pool);
+
+ if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
+ return svn_error_trace(err);
+ else if (err)
+ {
+ svn_error_clear(err);
+ no_marker = TRUE;
+ }
+ else
+ {
+ /* Replace the repos_relpath with something more expected than
+ the unrelated old file external repository relpath, which
+ one day may come from a different repository */
+ repos_relpath = svn_relpath_join(repos_relpath, name, scratch_pool);
+ }
+ }
+
+ if (!no_marker)
+ {
+ blank_ibb(&ibb);
+
+ ibb.repos_id = repos_id;
+ ibb.status = mark_excluded ? svn_wc__db_status_excluded
+ : svn_wc__db_status_not_present;
+ ibb.kind = kind;
+ ibb.repos_relpath = repos_relpath;
+ ibb.revision = SVN_IS_VALID_REVNUM(marker_revision)
+ ? marker_revision
+ : revision;
+
+ /* Depending upon KIND, any of these might get used. */
+ ibb.children = NULL;
+ ibb.depth = svn_depth_unknown;
+ ibb.checksum = NULL;
+ ibb.target = NULL;
+
+ SVN_ERR(insert_base_node(&ibb, wcroot, local_relpath, scratch_pool));
+ }
}
SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
@@ -2423,9 +2440,9 @@ svn_error_t *
svn_wc__db_base_remove(svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t keep_as_working,
- svn_boolean_t queue_deletes,
- svn_boolean_t remove_locks,
- svn_revnum_t not_present_revision,
+ svn_boolean_t mark_not_present,
+ svn_boolean_t mark_excluded,
+ svn_revnum_t marker_revision,
svn_skel_t *conflict,
svn_skel_t *work_items,
apr_pool_t *scratch_pool)
@@ -2440,8 +2457,9 @@ svn_wc__db_base_remove(svn_wc__db_t *db,
VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(db_base_remove(wcroot, local_relpath,
- db, keep_as_working, queue_deletes,
- remove_locks, not_present_revision,
+ db, keep_as_working,
+ mark_not_present, mark_excluded,
+ marker_revision,
conflict, work_items, scratch_pool),
wcroot);
@@ -2638,7 +2656,7 @@ svn_wc__db_base_get_info(svn_wc__db_status_t *status,
wcroot, local_relpath,
result_pool, scratch_pool),
svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid,
- wcroot->sdb, repos_id, result_pool),
+ wcroot, repos_id, result_pool),
SVN_NO_ERROR,
SVN_NO_ERROR,
wcroot);
@@ -2647,28 +2665,26 @@ svn_wc__db_base_get_info(svn_wc__db_status_t *status,
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_wc__db_base_get_children_info(apr_hash_t **nodes,
- svn_wc__db_t *db,
- const char *dir_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+/* The implementation of svn_wc__db_base_get_children_info */
+static svn_error_t *
+base_get_children_info(apr_hash_t **nodes,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t obtain_locks,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
-
- SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath));
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- dir_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
+ apr_int64_t last_repos_id = INVALID_REPOS_ID;
+ const char *last_repos_root_url = NULL;
*nodes = apr_hash_make(result_pool);
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_BASE_CHILDREN_INFO));
+ obtain_locks
+ ? STMT_SELECT_BASE_CHILDREN_INFO_LOCK
+ : STMT_SELECT_BASE_CHILDREN_INFO));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -2676,7 +2692,6 @@ svn_wc__db_base_get_children_info(apr_hash_t **nodes,
while (have_row)
{
struct svn_wc__db_base_info_t *info;
- svn_error_t *err;
apr_int64_t repos_id;
const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
const char *name = svn_relpath_basename(child_relpath, result_pool);
@@ -2694,16 +2709,26 @@ svn_wc__db_base_get_children_info(apr_hash_t **nodes,
info->update_root = svn_sqlite__column_boolean(stmt, 7);
- info->lock = lock_from_columns(stmt, 8, 9, 10, 11, result_pool);
+ if (obtain_locks)
+ info->lock = lock_from_columns(stmt, 8, 9, 10, 11, result_pool);
- err = svn_wc__db_fetch_repos_info(&info->repos_root_url, NULL,
- wcroot->sdb, repos_id, result_pool);
+ if (repos_id != last_repos_id)
+ {
+ svn_error_t *err;
- if (err)
- return svn_error_trace(
- svn_error_compose_create(err,
- svn_sqlite__reset(stmt)));
+ err = svn_wc__db_fetch_repos_info(&last_repos_root_url, NULL,
+ wcroot, repos_id,
+ result_pool);
+
+ if (err)
+ return svn_error_trace(
+ svn_error_compose_create(err,
+ svn_sqlite__reset(stmt)));
+ last_repos_id = repos_id;
+ }
+
+ info->repos_root_url = last_repos_root_url;
svn_hash_sets(*nodes, name, info);
@@ -2715,6 +2740,30 @@ svn_wc__db_base_get_children_info(apr_hash_t **nodes,
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__db_base_get_children_info(apr_hash_t **nodes,
+ svn_wc__db_t *db,
+ const char *dir_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ dir_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ return svn_error_trace(base_get_children_info(nodes,
+ wcroot,
+ local_relpath,
+ TRUE /* obtain_locks */,
+ result_pool,
+ scratch_pool));
+}
+
svn_error_t *
svn_wc__db_base_get_props(apr_hash_t **props,
@@ -2761,8 +2810,10 @@ svn_wc__db_base_get_children(const apr_array_header_t **children,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return gather_repo_children(children, wcroot, local_relpath, 0,
- result_pool, scratch_pool);
+ return svn_error_trace(
+ gather_children(children, wcroot, local_relpath,
+ STMT_SELECT_OP_DEPTH_CHILDREN, 0,
+ result_pool, scratch_pool));
}
@@ -2772,12 +2823,20 @@ svn_wc__db_base_set_dav_cache(svn_wc__db_t *db,
const apr_hash_t *props,
apr_pool_t *scratch_pool)
{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
svn_sqlite__stmt_t *stmt;
int affected_rows;
- SVN_ERR(get_statement_for_path(&stmt, db, local_abspath,
- STMT_UPDATE_BASE_NODE_DAV_CACHE,
- scratch_pool));
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ local_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_UPDATE_BASE_NODE_DAV_CACHE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__bind_properties(stmt, 3, props, scratch_pool));
SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
@@ -2799,11 +2858,20 @@ svn_wc__db_base_get_dav_cache(apr_hash_t **props,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- SVN_ERR(get_statement_for_path(&stmt, db, local_abspath,
- STMT_SELECT_BASE_DAV_CACHE, scratch_pool));
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ local_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_BASE_DAV_CACHE));
+
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (!have_row)
return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND,
@@ -2944,21 +3012,21 @@ svn_wc__db_depth_get_info(svn_wc__db_status_t *status,
}
if (had_props)
{
- *had_props = SQLITE_PROPERTIES_AVAILABLE(stmt, 13);
+ *had_props = SQLITE_PROPERTIES_AVAILABLE(stmt, 12);
}
if (props)
{
if (node_status == svn_wc__db_status_normal
|| node_status == svn_wc__db_status_incomplete)
{
- SVN_ERR(svn_sqlite__column_properties(props, stmt, 13,
+ SVN_ERR(svn_sqlite__column_properties(props, stmt, 12,
result_pool, scratch_pool));
if (*props == NULL)
*props = apr_hash_make(result_pool);
}
else
{
- assert(svn_sqlite__column_is_null(stmt, 13));
+ assert(svn_sqlite__column_is_null(stmt, 12));
*props = NULL;
}
}
@@ -2975,6 +3043,11 @@ svn_wc__db_depth_get_info(svn_wc__db_status_t *status,
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
}
+/* A callback which supplies WCROOTs and LOCAL_RELPATHs. */
+typedef svn_error_t *(*svn_wc__db_txn_callback_t)(void *baton,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool);
/* Baton for passing args to with_triggers(). */
struct with_triggers_baton_t {
@@ -3051,8 +3124,13 @@ with_finalization(svn_wc__db_wcroot_t *wcroot,
svn_error_t *err1;
svn_error_t *err2;
- err1 = svn_wc__db_with_txn(wcroot, local_relpath, txn_cb, txn_baton,
- scratch_pool);
+ err1 = svn_sqlite__begin_savepoint(wcroot->sdb);
+ if (!err1)
+ {
+ err1 = txn_cb(txn_baton, wcroot, local_relpath, scratch_pool);
+
+ err1 = svn_sqlite__finish_savepoint(wcroot->sdb, err1);
+ }
if (err1 == NULL && notify_func != NULL)
{
@@ -3438,11 +3516,18 @@ db_external_remove(const svn_skel_t *work_items,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
+ int affected_rows;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_DELETE_EXTERNAL));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ if (!affected_rows)
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' is not an external."),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
@@ -3543,7 +3628,7 @@ svn_wc__db_external_read(svn_wc__db_status_t *status,
err = svn_error_compose_create(
err,
svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid,
- wcroot->sdb, repos_id,
+ wcroot, repos_id,
result_pool));
}
@@ -3925,14 +4010,14 @@ get_moved_to(const char **moved_to_relpath_p,
/* The body of svn_wc__db_scan_deletion().
*/
static svn_error_t *
-scan_deletion_txn(const char **base_del_relpath,
- const char **moved_to_relpath,
- const char **work_del_relpath,
- const char **moved_to_op_root_relpath,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+scan_deletion(const char **base_del_relpath,
+ const char **moved_to_relpath,
+ const char **work_del_relpath,
+ const char **moved_to_op_root_relpath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *current_relpath = local_relpath;
svn_sqlite__stmt_t *stmt;
@@ -3956,9 +4041,7 @@ scan_deletion_txn(const char **base_del_relpath,
scan = (moved_to_op_root_relpath || moved_to_relpath);
SVN_ERR(svn_sqlite__get_statement(
- &stmt, wcroot->sdb,
- scan ? STMT_SELECT_DELETION_INFO_SCAN
- : STMT_SELECT_DELETION_INFO));
+ &stmt, wcroot->sdb, STMT_SELECT_DELETION_INFO));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, current_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -4079,6 +4162,25 @@ scan_deletion_txn(const char **base_del_relpath,
}
svn_error_t *
+svn_wc__db_scan_deletion_internal(
+ const char **base_del_relpath,
+ const char **moved_to_relpath,
+ const char **work_del_relpath,
+ const char **moved_to_op_root_relpath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(
+ scan_deletion(base_del_relpath, moved_to_relpath, work_del_relpath,
+ moved_to_op_root_relpath,
+ wcroot, local_relpath,
+ result_pool, scratch_pool));
+}
+
+
+svn_error_t *
svn_wc__db_scan_deletion(const char **base_del_abspath,
const char **moved_to_abspath,
const char **work_del_abspath,
@@ -4100,9 +4202,9 @@ svn_wc__db_scan_deletion(const char **base_del_abspath,
VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(
- scan_deletion_txn(&base_del_relpath, &moved_to_relpath,
- &work_del_relpath, &moved_to_op_root_relpath,
- wcroot, local_relpath, result_pool, scratch_pool),
+ scan_deletion(&base_del_relpath, &moved_to_relpath,
+ &work_del_relpath, &moved_to_op_root_relpath,
+ wcroot, local_relpath, result_pool, scratch_pool),
wcroot);
if (base_del_abspath)
@@ -4200,10 +4302,10 @@ get_info_for_copy(apr_int64_t *copyfrom_id,
{
const char *base_del_relpath, *work_del_relpath;
- SVN_ERR(scan_deletion_txn(&base_del_relpath, NULL,
- &work_del_relpath,
- NULL, src_wcroot, local_relpath,
- scratch_pool, scratch_pool));
+ SVN_ERR(scan_deletion(&base_del_relpath, NULL,
+ &work_del_relpath,
+ NULL, src_wcroot, local_relpath,
+ scratch_pool, scratch_pool));
if (work_del_relpath)
{
const char *op_root_relpath;
@@ -4264,7 +4366,7 @@ get_info_for_copy(apr_int64_t *copyfrom_id,
working copies in a single db)! */
SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, &repos_uuid,
- src_wcroot->sdb, *copyfrom_id,
+ src_wcroot, *copyfrom_id,
scratch_pool));
SVN_ERR(create_repos_id(copyfrom_id, repos_root_url, repos_uuid,
@@ -4532,8 +4634,9 @@ db_op_copy(svn_wc__db_wcroot_t *src_wcroot,
int src_op_depth;
SVN_ERR(op_depth_of(&src_op_depth, src_wcroot, src_relpath));
- SVN_ERR(gather_repo_children(&children, src_wcroot, src_relpath,
- src_op_depth, scratch_pool, scratch_pool));
+ SVN_ERR(gather_children(&children, src_wcroot, src_relpath,
+ STMT_SELECT_OP_DEPTH_CHILDREN, src_op_depth,
+ scratch_pool, scratch_pool));
}
else
children = NULL;
@@ -4684,25 +4787,23 @@ struct op_copy_baton
const char *dst_op_root_relpath;
};
-/* Helper for svn_wc__db_op_copy().
- *
- * Implements svn_sqlite__transaction_callback_t. */
+/* Helper for svn_wc__db_op_copy(). */
static svn_error_t *
-op_copy_txn(void * baton,
- svn_sqlite__db_t *sdb,
+op_copy_txn(svn_wc__db_wcroot_t *wcroot,
+ struct op_copy_baton *ocb,
apr_pool_t *scratch_pool)
{
- struct op_copy_baton *ocb = baton;
int move_op_depth;
- if (sdb != ocb->dst_wcroot->sdb)
+ if (wcroot != ocb->dst_wcroot)
{
/* Source and destination databases differ; so also start a lock
- in the destination database, by calling ourself in a lock. */
+ in the destination database, by calling ourself in an extra lock. */
+
+ SVN_WC__DB_WITH_TXN(op_copy_txn(ocb->dst_wcroot, ocb, scratch_pool),
+ ocb->dst_wcroot);
- return svn_error_trace(
- svn_sqlite__with_lock(ocb->dst_wcroot->sdb,
- op_copy_txn, ocb, scratch_pool));
+ return SVN_NO_ERROR;
}
/* From this point we can assume a lock in the src and dst databases */
@@ -4753,8 +4854,237 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
/* Call with the sdb in src_wcroot. It might call itself again to
also obtain a lock in dst_wcroot */
- SVN_ERR(svn_sqlite__with_lock(ocb.src_wcroot->sdb, op_copy_txn, &ocb,
- scratch_pool));
+ SVN_WC__DB_WITH_TXN(op_copy_txn(ocb.src_wcroot, &ocb, scratch_pool),
+ ocb.src_wcroot);
+
+ return SVN_NO_ERROR;
+}
+
+/* Remove unneeded actual nodes for svn_wc__db_op_copy_layer_internal */
+static svn_error_t *
+clear_or_remove_actual(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row, shadowed;
+ svn_boolean_t keep_conflict = FALSE;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_NODE_INFO));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ if (have_row)
+ {
+ svn_wc__db_status_t presence;
+
+ shadowed = (svn_sqlite__column_int(stmt, 0) > op_depth);
+ presence = svn_sqlite__column_token(stmt, 3, presence_map);
+
+ if (shadowed && presence == svn_wc__db_status_base_deleted)
+ {
+ keep_conflict = TRUE;
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ if (have_row)
+ shadowed = (svn_sqlite__column_int(stmt, 0) > op_depth);
+ else
+ shadowed = FALSE;
+ }
+ }
+ else
+ shadowed = FALSE;
+
+ SVN_ERR(svn_sqlite__reset(stmt));
+ if (shadowed)
+ return SVN_NO_ERROR;
+
+ if (keep_conflict)
+ {
+ /* We don't want to accidentally remove delete-delete conflicts */
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_EMPTY));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+ else
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_op_copy_layer_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *src_op_relpath,
+ int src_op_depth,
+ const char *dst_op_relpath,
+ svn_skel_t *conflict,
+ svn_skel_t *work_items,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt, *stmt2;
+ svn_boolean_t have_row;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int dst_op_depth = relpath_depth(dst_op_relpath);
+ svn_boolean_t locked;
+ svn_error_t *err = NULL;
+
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(&locked, wcroot, dst_op_relpath,
+ FALSE, scratch_pool));
+
+ if (!locked)
+ return svn_error_createf(SVN_ERR_WC_NOT_LOCKED, NULL,
+ _("No write-lock in '%s'"),
+ path_for_error_message(wcroot, dst_op_relpath,
+ scratch_pool));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt2, wcroot->sdb,
+ STMT_COPY_NODE_MOVE));
+
+ /* Replace entire subtree at one op-depth. */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_LAYER_FOR_REPLACE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdsd", wcroot->wc_id,
+ src_op_relpath, src_op_depth,
+ dst_op_relpath, dst_op_depth));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
+ {
+ const char *src_relpath;
+ const char *dst_relpath;
+
+ svn_pool_clear(iterpool);
+
+ src_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
+ dst_relpath = svn_sqlite__column_text(stmt, 2, iterpool);
+
+ err = svn_sqlite__bindf(stmt2, "isdsds", wcroot->wc_id,
+ src_relpath, src_op_depth,
+ dst_relpath, dst_op_depth,
+ svn_relpath_dirname(dst_relpath, iterpool));
+ if (!err)
+ err = svn_sqlite__step_done(stmt2);
+
+ /* stmt2 is reset (never modified or by step_done) */
+
+ if (err)
+ break;
+
+ /* The node can't be deleted where it is added, so extension of
+ an existing shadowing is only interesting 2 levels deep. */
+ if (relpath_depth(dst_relpath) > (dst_op_depth+1))
+ {
+ svn_boolean_t exists = !svn_sqlite__column_is_null(stmt, 3);
+
+ if (exists)
+ {
+ svn_wc__db_status_t presence;
+
+ presence = svn_sqlite__column_token(stmt, 3, presence_map);
+
+ if (presence != svn_wc__db_status_normal)
+ exists = FALSE;
+ }
+
+ if (!exists)
+ {
+ svn_node_kind_t kind = svn_sqlite__column_token(stmt, 1, kind_map);
+
+ err = db_extend_parent_delete(wcroot, dst_relpath,
+ kind, dst_op_depth, iterpool);
+
+ if (err)
+ break;
+ }
+ }
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+
+ SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+
+ /* And now remove the records that are no longer needed */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_NO_LONGER_MOVED_RV));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdsd", wcroot->wc_id,
+ dst_op_relpath, dst_op_depth,
+ src_op_relpath, src_op_depth));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
+ {
+ const char *dst_relpath;
+ svn_wc__db_status_t shadowed_presence;
+
+ svn_pool_clear(iterpool);
+
+ dst_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
+
+ if (!svn_sqlite__column_is_null(stmt, 2))
+ shadowed_presence = svn_sqlite__column_token(stmt, 2, presence_map);
+ else
+ shadowed_presence = svn_wc__db_status_not_present;
+
+ if (shadowed_presence != svn_wc__db_status_normal
+ && shadowed_presence != svn_wc__db_status_incomplete)
+ {
+ err = svn_sqlite__get_statement(&stmt2, wcroot->sdb,
+ STMT_DELETE_NODE);
+ }
+ else
+ {
+ err =svn_sqlite__get_statement(&stmt2, wcroot->sdb,
+ STMT_REPLACE_WITH_BASE_DELETED);
+ }
+
+ if (!err)
+ err = svn_sqlite__bindf(stmt2, "isd", wcroot->wc_id, dst_relpath,
+ dst_op_depth);
+
+ if (!err)
+ err = svn_sqlite__step_done(stmt2);
+
+ /* stmt2 is reset (never modified or by step_done) */
+ if (err)
+ break;
+
+ /* Delete ACTUAL information about this node that we just deleted */
+ err = clear_or_remove_actual(wcroot, dst_relpath, dst_op_depth,
+ scratch_pool);
+
+ if (err)
+ break;
+
+ /* Retract base-delete for the node itself */
+ err = db_retract_parent_delete(wcroot, dst_relpath, dst_op_depth,
+ scratch_pool);
+
+ if (err)
+ break;
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+
+ SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
+
+ if (conflict)
+ SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, dst_op_relpath /* ## */,
+ conflict, scratch_pool));
return SVN_NO_ERROR;
}
@@ -4919,7 +5249,7 @@ handle_move_back(svn_boolean_t *moved_back,
generally these values should be the same anyway as it was
a no-op move. */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_MOVED_BACK));
+ STMT_DELETE_WORKING_OP_DEPTH));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
local_relpath,
@@ -5044,7 +5374,7 @@ db_op_copy_shadowed_layer(svn_wc__db_wcroot_t *src_wcroot,
const char *repos_uuid;
SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, &repos_uuid,
- src_wcroot->sdb, node_repos_id,
+ src_wcroot, node_repos_id,
scratch_pool));
SVN_ERR(create_repos_id(&node_repos_id, repos_root_url, repos_uuid,
@@ -5166,8 +5496,9 @@ db_op_copy_shadowed_layer(svn_wc__db_wcroot_t *src_wcroot,
return SVN_NO_ERROR;
}
- SVN_ERR(gather_repo_children(&children, src_wcroot, src_relpath,
- src_op_depth, scratch_pool, iterpool));
+ SVN_ERR(gather_children(&children, src_wcroot, src_relpath,
+ STMT_SELECT_OP_DEPTH_CHILDREN, src_op_depth,
+ scratch_pool, iterpool));
for (i = 0; i < children->nelts; i++)
{
@@ -5196,15 +5527,12 @@ db_op_copy_shadowed_layer(svn_wc__db_wcroot_t *src_wcroot,
return SVN_NO_ERROR;
}
-/* Helper for svn_wc__db_op_copy_shadowed_layer().
- *
- * Implements svn_sqlite__transaction_callback_t. */
+/* Helper for svn_wc__db_op_copy_shadowed_layer(). */
static svn_error_t *
-op_copy_shadowed_layer_txn(void *baton,
- svn_sqlite__db_t *sdb,
+op_copy_shadowed_layer_txn(svn_wc__db_wcroot_t *wcroot,
+ struct op_copy_baton *ocb,
apr_pool_t *scratch_pool)
{
- struct op_copy_baton *ocb = baton;
const char *src_parent_relpath;
const char *dst_parent_relpath;
int src_op_depth;
@@ -5214,15 +5542,16 @@ op_copy_shadowed_layer_txn(void *baton,
apr_int64_t repos_id = INVALID_REPOS_ID;
svn_revnum_t revision = SVN_INVALID_REVNUM;
- if (sdb != ocb->dst_wcroot->sdb)
+ if (wcroot != ocb->dst_wcroot)
{
- /* Source and destination databases differ; so also start a lock
- in the destination database, by calling ourself in a lock. */
+ /* Source and destination databases differ; so also start a lock
+ in the destination database, by calling ourself in an extra lock. */
- return svn_error_trace(
- svn_sqlite__with_lock(ocb->dst_wcroot->sdb,
- op_copy_shadowed_layer_txn,
- ocb, scratch_pool));
+ SVN_WC__DB_WITH_TXN(op_copy_shadowed_layer_txn(ocb->dst_wcroot, ocb,
+ scratch_pool),
+ ocb->dst_wcroot);
+
+ return SVN_NO_ERROR;
}
/* From this point we can assume a lock in the src and dst databases */
@@ -5304,9 +5633,9 @@ svn_wc__db_op_copy_shadowed_layer(svn_wc__db_t *db,
/* Call with the sdb in src_wcroot. It might call itself again to
also obtain a lock in dst_wcroot */
- SVN_ERR(svn_sqlite__with_lock(ocb.src_wcroot->sdb,
- op_copy_shadowed_layer_txn,
- &ocb, scratch_pool));
+ SVN_WC__DB_WITH_TXN(op_copy_shadowed_layer_txn(ocb.src_wcroot, &ocb,
+ scratch_pool),
+ ocb.src_wcroot);
return SVN_NO_ERROR;
}
@@ -5776,27 +6105,39 @@ svn_wc__db_global_record_fileinfo(svn_wc__db_t *db,
* props; to indicate no properties when the pristine has some props,
* PROPS must be an empty hash. */
static svn_error_t *
-set_actual_props(apr_int64_t wc_id,
+set_actual_props(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
apr_hash_t *props,
- svn_sqlite__db_t *db,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
int affected_rows;
- SVN_ERR(svn_sqlite__get_statement(&stmt, db, STMT_UPDATE_ACTUAL_PROPS));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_UPDATE_ACTUAL_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__bind_properties(stmt, 3, props, scratch_pool));
SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
if (affected_rows == 1 || !props)
- return SVN_NO_ERROR; /* We are done */
+ {
+ /* Perhaps the entire ACTUAL record is unneeded now? */
+ if (!props && affected_rows)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_EMPTY));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+
+ return SVN_NO_ERROR; /* We are done */
+ }
/* We have to insert a row in ACTUAL */
- SVN_ERR(svn_sqlite__get_statement(&stmt, db, STMT_INSERT_ACTUAL_PROPS));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_INSERT_ACTUAL_PROPS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
if (*local_relpath != '\0')
SVN_ERR(svn_sqlite__bind_text(stmt, 3,
svn_relpath_dirname(local_relpath,
@@ -5805,6 +6146,24 @@ set_actual_props(apr_int64_t wc_id,
return svn_error_trace(svn_sqlite__step_done(stmt));
}
+svn_error_t *
+svn_wc__db_op_set_props_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_hash_t *props,
+ svn_boolean_t clear_recorded_info,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(set_actual_props(wcroot, local_relpath, props, scratch_pool));
+
+ if (clear_recorded_info)
+ {
+ SVN_ERR(db_record_fileinfo(wcroot, local_relpath,
+ SVN_INVALID_FILESIZE, 0,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
/* The body of svn_wc__db_op_set_props().
@@ -5840,15 +6199,8 @@ set_props_txn(svn_wc__db_wcroot_t *wcroot,
props = NULL;
}
- SVN_ERR(set_actual_props(wcroot->wc_id, local_relpath,
- props, wcroot->sdb, scratch_pool));
-
- if (clear_recorded_info)
- {
- SVN_ERR(db_record_fileinfo(wcroot, local_relpath,
- SVN_INVALID_FILESIZE, 0,
- scratch_pool));
- }
+ SVN_ERR(svn_wc__db_op_set_props_internal(wcroot, local_relpath, props,
+ clear_recorded_info, scratch_pool));
/* And finally. */
SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
@@ -6080,7 +6432,7 @@ set_changelist_txn(void *baton,
if (scb->new_changelist)
{
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_INSERT_ACTUAL_EMPTIES));
+ STMT_INSERT_ACTUAL_EMPTIES_FILES));
SVN_ERR(svn_sqlite__step_done(stmt));
}
@@ -6297,15 +6649,15 @@ svn_wc__db_op_mark_conflict(svn_wc__db_t *db,
/* The body of svn_wc__db_op_mark_resolved().
*/
-static svn_error_t *
-db_op_mark_resolved(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_t *db,
- svn_boolean_t resolved_text,
- svn_boolean_t resolved_props,
- svn_boolean_t resolved_tree,
- const svn_skel_t *work_items,
- apr_pool_t *scratch_pool)
+svn_error_t *
+svn_wc__db_op_mark_resolved_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_wc__db_t *db,
+ svn_boolean_t resolved_text,
+ svn_boolean_t resolved_props,
+ svn_boolean_t resolved_tree,
+ const svn_skel_t *work_items,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
@@ -6403,7 +6755,8 @@ svn_wc__db_op_mark_resolved(svn_wc__db_t *db,
VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(
- db_op_mark_resolved(wcroot, local_relpath, db,
+ svn_wc__db_op_mark_resolved_internal(
+ wcroot, local_relpath, db,
resolved_text, resolved_props, resolved_tree,
work_items, scratch_pool),
wcroot);
@@ -6412,40 +6765,116 @@ svn_wc__db_op_mark_resolved(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
-/* Clear moved-to information at the delete-half of the move which
- * moved LOCAL_RELPATH here. This transforms the move into a simple delete. */
+/* Clear moved-to information at the delete-half of the move which moved
+ * MOVED_TO_RELPATH here. This transforms the delete part of the move into a
+ * normal delete.
+ *
+ * Note that the moved-to location is always an op-root, while this is not the
+ * case for a moved-from location.
+ */
static svn_error_t *
-clear_moved_to(const char *local_relpath,
- svn_wc__db_wcroot_t *wcroot,
+clear_moved_to(svn_wc__db_wcroot_t *wcroot,
+ const char *moved_to_relpath,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
const char *moved_from_relpath;
+ int moved_from_op_depth;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_MOVED_FROM_RELPATH));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (!have_row)
- {
- SVN_ERR(svn_sqlite__reset(stmt));
- return SVN_NO_ERROR;
- }
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, moved_to_relpath));
+ SVN_ERR(svn_sqlite__step_row(stmt));
moved_from_relpath = svn_sqlite__column_text(stmt, 0, scratch_pool);
+ moved_from_op_depth = svn_sqlite__column_int(stmt, 1);
SVN_ERR(svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_CLEAR_MOVED_TO_RELPATH));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- moved_from_relpath,
- relpath_depth(moved_from_relpath)));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ moved_from_relpath, moved_from_op_depth));
+ SVN_ERR(svn_sqlite__update(NULL, stmt));
+
+ return SVN_NO_ERROR;
+}
+
+/* Helper function for op_revert_txn. Raises move tree conflicts on
+ descendants to ensure database stability on a non recursive revert
+ of an ancestor that contains a possible move related tree conflict.
+ */
+static svn_error_t *
+revert_maybe_raise_moved_away(svn_wc__db_wcroot_t * wcroot,
+ svn_wc__db_t *db,
+ const char *local_relpath,
+ int op_depth_below,
+ apr_pool_t *scratch_pool)
+{
+ svn_skel_t *conflict;
+ svn_wc_operation_t operation;
+ svn_boolean_t tree_conflicted;
+ const apr_array_header_t *locations;
+ svn_wc_conflict_reason_t reason;
+ svn_wc_conflict_action_t action;
+
+ SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, NULL, NULL, wcroot,
+ local_relpath,
+ scratch_pool, scratch_pool));
+
+ if (!conflict)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_wc__conflict_read_info(&operation, &locations, NULL, NULL,
+ &tree_conflicted,
+ db, wcroot->abspath,
+ conflict,
+ scratch_pool, scratch_pool));
+
+ if (!tree_conflicted
+ || (operation != svn_wc_operation_update
+ && operation != svn_wc_operation_switch))
+ {
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
+ NULL,
+ db, wcroot->abspath,
+ conflict,
+ scratch_pool,
+ scratch_pool));
+
+ if (reason == svn_wc_conflict_reason_deleted
+ || reason == svn_wc_conflict_reason_replaced)
+ {
+ SVN_ERR(svn_wc__db_op_raise_moved_away_internal(
+ wcroot, local_relpath, op_depth_below, db,
+ operation, action,
+ (locations && locations->nelts > 0)
+ ? APR_ARRAY_IDX(locations, 0,
+ const svn_wc_conflict_version_t *)
+ : NULL,
+ (locations && locations->nelts > 1)
+ ? APR_ARRAY_IDX(locations, 1,
+ const svn_wc_conflict_version_t *)
+ : NULL,
+ scratch_pool));
+
+ /* Transform the move information into revert information */
+ SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
+ STMT_MOVE_NOTIFY_TO_REVERT));
+ }
return SVN_NO_ERROR;
}
+/* Baton for op_revert_txn and op_revert_recursive_txn */
+struct revert_baton_t
+{
+ svn_wc__db_t *db;
+ svn_boolean_t clear_changelists;
+};
+
/* One of the two alternative bodies of svn_wc__db_op_revert().
*
* Implements svn_wc__db_txn_callback_t. */
@@ -6455,13 +6884,15 @@ op_revert_txn(void *baton,
const char *local_relpath,
apr_pool_t *scratch_pool)
{
- svn_wc__db_t *db = baton;
+ struct revert_baton_t *rvb = baton;
+ svn_wc__db_t *db = rvb->db;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
int op_depth;
svn_boolean_t moved_here;
int affected_rows;
const char *moved_to;
+ int op_depth_below;
/* ### Similar structure to op_revert_recursive_txn, should they be
combined? */
@@ -6508,58 +6939,26 @@ op_revert_txn(void *baton,
op_depth = svn_sqlite__column_int(stmt, 0);
moved_here = svn_sqlite__column_boolean(stmt, 15);
moved_to = svn_sqlite__column_text(stmt, 17, scratch_pool);
- SVN_ERR(svn_sqlite__reset(stmt));
- if (moved_to)
- {
- SVN_ERR(svn_wc__db_resolve_break_moved_away_internal(wcroot,
- local_relpath,
- op_depth,
- scratch_pool));
- }
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ op_depth_below = svn_sqlite__column_int(stmt, 0);
else
- {
- svn_skel_t *conflict;
+ op_depth_below = -1;
- SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, wcroot,
- local_relpath,
- scratch_pool, scratch_pool));
- if (conflict)
- {
- svn_wc_operation_t operation;
- svn_boolean_t tree_conflicted;
-
- SVN_ERR(svn_wc__conflict_read_info(&operation, NULL, NULL, NULL,
- &tree_conflicted,
- db, wcroot->abspath,
- conflict,
- scratch_pool, scratch_pool));
- if (tree_conflicted
- && (operation == svn_wc_operation_update
- || operation == svn_wc_operation_switch))
- {
- svn_wc_conflict_reason_t reason;
- svn_wc_conflict_action_t action;
-
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
- NULL,
- db, wcroot->abspath,
- conflict,
- scratch_pool,
- scratch_pool));
+ SVN_ERR(svn_sqlite__reset(stmt));
- if (reason == svn_wc_conflict_reason_deleted)
- SVN_ERR(svn_wc__db_resolve_delete_raise_moved_away(
- db, svn_dirent_join(wcroot->abspath, local_relpath,
- scratch_pool),
- NULL, NULL /* ### How do we notify this? */,
- scratch_pool));
- }
- }
+ if (moved_to)
+ {
+ SVN_ERR(svn_wc__db_op_break_move_internal(wcroot,
+ local_relpath, op_depth,
+ moved_to, NULL, scratch_pool));
}
if (op_depth > 0 && op_depth == relpath_depth(local_relpath))
{
+ int op_depth_increased;
+
/* Can't do non-recursive revert if children exist */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_GE_OP_DEPTH_CHILDREN));
@@ -6582,7 +6981,7 @@ op_revert_txn(void *baton,
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
local_relpath,
op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__update(&op_depth_increased, stmt));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_DELETE_WORKING_NODE));
@@ -6597,19 +6996,35 @@ op_revert_txn(void *baton,
/* If this node was moved-here, clear moved-to at the move source. */
if (moved_here)
- SVN_ERR(clear_moved_to(local_relpath, wcroot, scratch_pool));
+ SVN_ERR(clear_moved_to(wcroot, local_relpath, scratch_pool));
+
+ /* If the node was moved itself, we don't have interesting moved
+ children (and the move itself was already broken) */
+ if (op_depth_increased && !moved_to)
+ SVN_ERR(revert_maybe_raise_moved_away(wcroot, db, local_relpath,
+ op_depth_below, scratch_pool));
}
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
- if (!affected_rows)
+ if (rvb->clear_changelists)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+ }
+ else
{
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST));
+ STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+ if (!affected_rows)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+ }
}
return SVN_NO_ERROR;
@@ -6625,6 +7040,7 @@ op_revert_recursive_txn(void *baton,
const char *local_relpath,
apr_pool_t *scratch_pool)
{
+ struct revert_baton_t *rvb = baton;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
int op_depth;
@@ -6680,14 +7096,14 @@ op_revert_recursive_txn(void *baton,
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
- const char *move_src_relpath = svn_sqlite__column_text(stmt, 0, NULL);
+ const char *src_relpath = svn_sqlite__column_text(stmt, 0, NULL);
+ const char *dst_relpath = svn_sqlite__column_text(stmt, 1, NULL);
int move_op_depth = svn_sqlite__column_int(stmt, 2);
svn_error_t *err;
- err = svn_wc__db_resolve_break_moved_away_internal(wcroot,
- move_src_relpath,
- move_op_depth,
- scratch_pool);
+ err = svn_wc__db_op_break_move_internal(wcroot,
+ src_relpath, move_op_depth,
+ dst_relpath, NULL, scratch_pool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
@@ -6706,17 +7122,28 @@ op_revert_recursive_txn(void *baton,
local_relpath, select_op_depth));
SVN_ERR(svn_sqlite__step_done(stmt));
- SVN_ERR(svn_sqlite__get_statement(
- &stmt, wcroot->sdb,
- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ if (rvb->clear_changelists)
+ {
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_NODE_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+ else
+ {
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
- SVN_ERR(svn_sqlite__get_statement(
- &stmt, wcroot->sdb,
- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
/* ### This removes the locks, but what about the access batons? */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
@@ -6740,7 +7167,7 @@ op_revert_recursive_txn(void *baton,
svn_pool_clear(iterpool);
moved_here_child_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
- err = clear_moved_to(moved_here_child_relpath, wcroot, iterpool);
+ err = clear_moved_to(wcroot, moved_here_child_relpath, iterpool);
if (err)
return svn_error_trace(svn_error_compose_create(
err,
@@ -6754,7 +7181,7 @@ op_revert_recursive_txn(void *baton,
/* Clear potential moved-to pointing at the target node itself. */
if (op_depth > 0 && op_depth == relpath_depth(local_relpath)
&& moved_here)
- SVN_ERR(clear_moved_to(local_relpath, wcroot, scratch_pool));
+ SVN_ERR(clear_moved_to(wcroot, local_relpath, scratch_pool));
return SVN_NO_ERROR;
}
@@ -6763,22 +7190,27 @@ svn_error_t *
svn_wc__db_op_revert(svn_wc__db_t *db,
const char *local_abspath,
svn_depth_t depth,
+ svn_boolean_t clear_changelists,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
+ struct revert_baton_t rvb;
struct with_triggers_baton_t wtb = { STMT_CREATE_REVERT_LIST,
STMT_DROP_REVERT_LIST_TRIGGERS,
NULL, NULL};
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+ rvb.db = db;
+ rvb.clear_changelists = clear_changelists;
+ wtb.cb_baton = &rvb;
+
switch (depth)
{
case svn_depth_empty:
wtb.cb_func = op_revert_txn;
- wtb.cb_baton = db;
break;
case svn_depth_infinity:
wtb.cb_func = op_revert_recursive_txn;
@@ -6914,7 +7346,7 @@ svn_wc__db_revert_list_read(svn_boolean_t *reverted,
static svn_error_t *
revert_list_read_copied_children(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- const apr_array_header_t **children_p,
+ apr_array_header_t **children_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -6957,7 +7389,7 @@ revert_list_read_copied_children(svn_wc__db_wcroot_t *wcroot,
svn_error_t *
-svn_wc__db_revert_list_read_copied_children(const apr_array_header_t **children,
+svn_wc__db_revert_list_read_copied_children(apr_array_header_t **children,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -7004,16 +7436,39 @@ svn_wc__db_revert_list_notify(svn_wc_notify_func2_t notify_func,
while (have_row)
{
const char *notify_relpath = svn_sqlite__column_text(stmt, 0, NULL);
+ svn_wc_notify_t *notify;
svn_pool_clear(iterpool);
- notify_func(notify_baton,
- svn_wc_create_notify(svn_dirent_join(wcroot->abspath,
- notify_relpath,
- iterpool),
- svn_wc_notify_revert,
- iterpool),
- iterpool);
+ notify = svn_wc_create_notify(svn_dirent_join(wcroot->abspath,
+ notify_relpath,
+ iterpool),
+ svn_wc_notify_revert,
+ iterpool);
+
+ if (!svn_sqlite__column_is_null(stmt, 1))
+ notify->kind = svn_sqlite__column_token(stmt, 1, kind_map);
+ else
+ {
+ if (!svn_sqlite__column_is_null(stmt, 3))
+ notify->kind = svn_sqlite__column_token(stmt, 3, kind_map_none);
+
+ switch (svn_sqlite__column_int(stmt, 2))
+ {
+ case 0:
+ continue;
+ case 1:
+ /* standard revert */
+ break;
+ case 2:
+ notify->action = svn_wc_notify_tree_conflict;
+ break;
+ default:
+ SVN_ERR_MALFUNCTION();
+ }
+ }
+
+ notify_func(notify_baton, notify, iterpool);
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
@@ -7055,9 +7510,6 @@ remove_node_txn(svn_boolean_t *left_changes,
svn_wc__db_t *db,
svn_boolean_t destroy_wc,
svn_boolean_t destroy_changes,
- svn_revnum_t not_present_rev,
- svn_wc__db_status_t not_present_status,
- svn_node_kind_t not_present_kind,
const svn_skel_t *conflict,
const svn_skel_t *work_items,
svn_cancel_func_t cancel_func,
@@ -7066,9 +7518,6 @@ remove_node_txn(svn_boolean_t *left_changes,
{
svn_sqlite__stmt_t *stmt;
- apr_int64_t repos_id;
- const char *repos_relpath;
-
/* Note that unlike many similar functions it is a valid scenario for this
function to be called on a wcroot! */
@@ -7078,15 +7527,6 @@ remove_node_txn(svn_boolean_t *left_changes,
if (left_changes)
*left_changes = FALSE;
- /* Need info for not_present node? */
- if (SVN_IS_VALID_REVNUM(not_present_rev))
- SVN_ERR(svn_wc__db_base_get_info_internal(NULL, NULL, NULL,
- &repos_relpath, &repos_id,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
-
if (destroy_wc
&& (!destroy_changes || *local_relpath == '\0'))
{
@@ -7283,26 +7723,6 @@ remove_node_txn(svn_boolean_t *left_changes,
local_relpath));
SVN_ERR(svn_sqlite__step_done(stmt));
- /* Should we leave a not-present node? */
- if (SVN_IS_VALID_REVNUM(not_present_rev))
- {
- insert_base_baton_t ibb;
- blank_ibb(&ibb);
-
- ibb.repos_id = repos_id;
-
- SVN_ERR_ASSERT(not_present_status == svn_wc__db_status_not_present
- || not_present_status == svn_wc__db_status_excluded);
-
- ibb.status = not_present_status;
- ibb.kind = not_present_kind;
-
- ibb.repos_relpath = repos_relpath;
- ibb.revision = not_present_rev;
-
- SVN_ERR(insert_base_node(&ibb, wcroot, local_relpath, scratch_pool));
- }
-
SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
if (conflict)
SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, local_relpath,
@@ -7317,9 +7737,6 @@ svn_wc__db_op_remove_node(svn_boolean_t *left_changes,
const char *local_abspath,
svn_boolean_t destroy_wc,
svn_boolean_t destroy_changes,
- svn_revnum_t not_present_revision,
- svn_wc__db_status_t not_present_status,
- svn_node_kind_t not_present_kind,
const svn_skel_t *conflict,
const svn_skel_t *work_items,
svn_cancel_func_t cancel_func,
@@ -7338,8 +7755,7 @@ svn_wc__db_op_remove_node(svn_boolean_t *left_changes,
SVN_WC__DB_WITH_TXN(remove_node_txn(left_changes,
wcroot, local_relpath, db,
destroy_wc, destroy_changes,
- not_present_revision, not_present_status,
- not_present_kind, conflict, work_items,
+ conflict, work_items,
cancel_func, cancel_baton, scratch_pool),
wcroot);
@@ -7371,7 +7787,7 @@ db_op_set_base_depth(svn_wc__db_wcroot_t *wcroot,
if (affected_rows == 0)
return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
- "The node '%s' is not a committed directory",
+ _("The node '%s' is not a committed directory"),
path_for_error_message(wcroot, local_relpath,
scratch_pool));
@@ -8109,7 +8525,7 @@ struct op_delete_many_baton_t {
apr_array_header_t *rel_targets;
svn_boolean_t delete_dir_externals;
const svn_skel_t *work_items;
-} op_delete_many_baton_t;
+};
static svn_error_t *
op_delete_many_txn(void *baton,
@@ -8344,6 +8760,45 @@ svn_wc__db_op_delete_many(svn_wc__db_t *db,
scratch_pool));
}
+/* Helper function for read_info() to provide better diagnostics than just
+ asserting.
+
+ ### BH: Yes this code is ugly, and that is why I only introduce it in
+ ### read_info(). But we really need something to determine the root cause
+ ### of this problem to diagnose why TortoiseSVN users were seeing all those
+ ### assertions.
+
+ Adds an error to the *err chain if invalid values are encountered. In that
+ case the value is set to the first value in the map, assuming that caller
+ will just return the combined error.
+ */
+static int
+column_token_err(svn_error_t **err,
+ svn_sqlite__stmt_t *stmt,
+ int column,
+ const svn_token_map_t *map)
+{
+ svn_error_t *err2;
+ const char *word = svn_sqlite__column_text(stmt, column, NULL);
+ int value;
+
+ /* svn_token__from_word_err() handles NULL for us */
+ err2 = svn_token__from_word_err(&value, map, word);
+
+ if (err2)
+ {
+ *err = svn_error_compose_create(
+ *err,
+ svn_error_createf(
+ SVN_ERR_WC_CORRUPT, err2,
+ _("Encountered invalid node state in column %d of "
+ "info query to working copy database"),
+ column));
+ value = map[0].val;
+ }
+
+ return value;
+}
/* Like svn_wc__db_read_info(), but taking WCROOT+LOCAL_RELPATH instead of
DB+LOCAL_ABSPATH, and outputting repos ids instead of URL+UUID. */
@@ -8411,11 +8866,11 @@ read_info(svn_wc__db_status_t *status,
svn_node_kind_t node_kind;
op_depth = svn_sqlite__column_int(stmt_info, 0);
- node_kind = svn_sqlite__column_token(stmt_info, 4, kind_map);
+ node_kind = column_token_err(&err, stmt_info, 4, kind_map);
if (status)
{
- *status = svn_sqlite__column_token(stmt_info, 3, presence_map);
+ *status = column_token_err(&err, stmt_info, 3, presence_map);
if (op_depth != 0) /* WORKING */
err = svn_error_compose_create(err,
@@ -8467,14 +8922,11 @@ read_info(svn_wc__db_status_t *status,
if (depth)
{
if (node_kind != svn_node_dir)
- {
- *depth = svn_depth_unknown;
- }
+ *depth = svn_depth_unknown;
+ else if (svn_sqlite__column_is_null(stmt_info, 11))
+ *depth = svn_depth_unknown;
else
- {
- *depth = svn_sqlite__column_token_null(stmt_info, 11, depth_map,
- svn_depth_unknown);
- }
+ *depth = column_token_err(&err, stmt_info, 11, depth_map);
}
if (checksum)
{
@@ -8666,10 +9118,8 @@ read_info(svn_wc__db_status_t *status,
err = svn_error_compose_create(err, svn_sqlite__reset(stmt_act));
if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
- err = svn_error_quick_wrap(err,
- apr_psprintf(scratch_pool,
- "Error reading node '%s'",
- local_relpath));
+ err = svn_error_quick_wrapf(err, _("Error reading node '%s'"),
+ local_relpath);
SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt_info)));
@@ -8773,9 +9223,9 @@ svn_wc__db_read_info(svn_wc__db_status_t *status,
have_base, have_more_work, have_work,
wcroot, local_relpath, result_pool, scratch_pool),
svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid,
- wcroot->sdb, repos_id, result_pool),
+ wcroot, repos_id, result_pool),
svn_wc__db_fetch_repos_info(original_root_url, original_uuid,
- wcroot->sdb, original_repos_id,
+ wcroot, original_repos_id,
result_pool),
SVN_NO_ERROR,
wcroot);
@@ -8789,6 +9239,27 @@ is_wclocked(svn_boolean_t *locked,
const char *dir_relpath,
apr_pool_t *scratch_pool);
+/* Helper for read_children_info and single variant */
+static svn_error_t *
+find_conflict_descendants(svn_boolean_t *conflict_exists,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+
+ /* Only used on files, so certainly not wcroot*/
+ assert(local_relpath[0] != '\0');
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_FIND_CONFLICT_DESCENDANT));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(conflict_exists, stmt));
+
+ return svn_error_trace(svn_sqlite__reset(stmt));
+}
+
/* What we really want to store about a node. This relies on the
offset of svn_wc__db_info_t being zero. */
struct read_children_info_item_t
@@ -8796,13 +9267,16 @@ struct read_children_info_item_t
struct svn_wc__db_info_t info;
int op_depth;
int nr_layers;
+ svn_boolean_t was_dir;
};
+/* Implementation of svn_wc__db_read_children_info */
static svn_error_t *
read_children_info(svn_wc__db_wcroot_t *wcroot,
const char *dir_relpath,
apr_hash_t *conflicts,
apr_hash_t *nodes,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -8811,9 +9285,12 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
const char *repos_root_url = NULL;
const char *repos_uuid = NULL;
apr_int64_t last_repos_id = INVALID_REPOS_ID;
+ const char *last_repos_root_url = NULL;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_NODE_CHILDREN_INFO));
+ (base_tree_only
+ ? STMT_SELECT_BASE_NODE_CHILDREN_INFO
+ : STMT_SELECT_NODE_CHILDREN_INFO)));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, dir_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -8828,7 +9305,7 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
int op_depth;
svn_boolean_t new_child;
- child_item = svn_hash_gets(nodes, name);
+ child_item = (base_tree_only ? NULL : svn_hash_gets(nodes, name));
if (child_item)
new_child = FALSE;
else
@@ -8840,7 +9317,7 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
op_depth = svn_sqlite__column_int(stmt, 0);
/* Do we have new or better information? */
- if (new_child || op_depth > child_item->op_depth)
+ if (new_child)
{
struct svn_wc__db_info_t *child = &child_item->info;
child_item->op_depth = op_depth;
@@ -8875,8 +9352,6 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
}
else
{
- const char *last_repos_root_url = NULL;
-
apr_int64_t repos_id = svn_sqlite__column_int64(stmt, 1);
if (!repos_root_url ||
(last_repos_id != INVALID_REPOS_ID &&
@@ -8885,7 +9360,7 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
last_repos_root_url = repos_root_url;
err = svn_wc__db_fetch_repos_info(&repos_root_url,
&repos_uuid,
- wcroot->sdb, repos_id,
+ wcroot, repos_id,
result_pool);
if (err)
SVN_ERR(svn_error_compose_create(err,
@@ -8923,11 +9398,19 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
child->depth = svn_depth_unknown;
else
{
+ child->has_descendants = TRUE;
+ child_item->was_dir = TRUE;
child->depth = svn_sqlite__column_token_null(stmt, 11, depth_map,
svn_depth_unknown);
if (new_child)
- SVN_ERR(is_wclocked(&child->locked, wcroot, child_relpath,
- scratch_pool));
+ {
+ err = is_wclocked(&child->locked, wcroot, child_relpath,
+ scratch_pool);
+
+ if (err)
+ SVN_ERR(svn_error_compose_create(err,
+ svn_sqlite__reset(stmt)));
+ }
}
child->recorded_time = svn_sqlite__column_int64(stmt, 13);
@@ -8959,6 +9442,17 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
if (new_child)
svn_hash_sets(nodes, apr_pstrdup(result_pool, name), child);
}
+ else if (!child_item->was_dir
+ && svn_sqlite__column_token(stmt, 4, kind_map) == svn_node_dir)
+ {
+ child_item->was_dir = TRUE;
+
+ err = find_conflict_descendants(&child_item->info.has_descendants,
+ wcroot, child_relpath,
+ scratch_pool);
+ if (err)
+ SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+ }
if (op_depth == 0)
{
@@ -8990,22 +9484,14 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
struct svn_wc__db_moved_to_info_t *moved_to;
struct svn_wc__db_moved_to_info_t **next;
const char *shadow_op_relpath;
- int cur_op_depth;
moved_to = apr_pcalloc(result_pool, sizeof(*moved_to));
moved_to->moved_to_abspath = svn_dirent_join(wcroot->abspath,
moved_to_relpath,
result_pool);
- cur_op_depth = relpath_depth(child_relpath);
- shadow_op_relpath = child_relpath;
-
- while (cur_op_depth > op_depth)
- {
- shadow_op_relpath = svn_relpath_dirname(shadow_op_relpath,
- scratch_pool);
- cur_op_depth--;
- }
+ shadow_op_relpath = svn_relpath_prefix(child_relpath, op_depth,
+ scratch_pool);
moved_to->shadow_op_root_abspath =
svn_dirent_join(wcroot->abspath, shadow_op_relpath,
@@ -9028,54 +9514,58 @@ read_children_info(svn_wc__db_wcroot_t *wcroot,
SVN_ERR(svn_sqlite__reset(stmt));
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_ACTUAL_CHILDREN_INFO));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, dir_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
-
- while (have_row)
+ if (!base_tree_only)
{
- struct read_children_info_item_t *child_item;
- struct svn_wc__db_info_t *child;
- const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- const char *name = svn_relpath_basename(child_relpath, NULL);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_ACTUAL_CHILDREN_INFO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, dir_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
- child_item = svn_hash_gets(nodes, name);
- if (!child_item)
+ while (have_row)
{
- child_item = apr_pcalloc(result_pool, sizeof(*child_item));
- child_item->info.status = svn_wc__db_status_not_present;
- }
+ struct read_children_info_item_t *child_item;
+ struct svn_wc__db_info_t *child;
+ const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
+ const char *name = svn_relpath_basename(child_relpath, NULL);
+
+ child_item = svn_hash_gets(nodes, name);
+ if (!child_item)
+ {
+ child_item = apr_pcalloc(result_pool, sizeof(*child_item));
+ child_item->info.status = svn_wc__db_status_not_present;
+ }
- child = &child_item->info;
+ child = &child_item->info;
- child->changelist = svn_sqlite__column_text(stmt, 1, result_pool);
+ child->changelist = svn_sqlite__column_text(stmt, 1, result_pool);
- child->props_mod = !svn_sqlite__column_is_null(stmt, 2);
+ child->props_mod = !svn_sqlite__column_is_null(stmt, 2);
#ifdef HAVE_SYMLINK
- if (child->props_mod)
- {
- svn_error_t *err;
- apr_hash_t *properties;
+ if (child->props_mod)
+ {
+ svn_error_t *err;
+ apr_hash_t *properties;
- err = svn_sqlite__column_properties(&properties, stmt, 2,
- scratch_pool, scratch_pool);
- if (err)
- SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
- child->special = (NULL != svn_hash_gets(properties,
- SVN_PROP_SPECIAL));
- }
+ err = svn_sqlite__column_properties(&properties, stmt, 2,
+ scratch_pool, scratch_pool);
+ if (err)
+ SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+ child->special = (NULL != svn_hash_gets(properties,
+ SVN_PROP_SPECIAL));
+ }
#endif
- child->conflicted = !svn_sqlite__column_is_null(stmt, 3); /* conflict */
+ /* conflict */
+ child->conflicted = !svn_sqlite__column_is_null(stmt, 3);
- if (child->conflicted)
- svn_hash_sets(conflicts, apr_pstrdup(result_pool, name), "");
+ if (child->conflicted)
+ svn_hash_sets(conflicts, apr_pstrdup(result_pool, name), "");
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
- SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__reset(stmt));
+ }
return SVN_NO_ERROR;
}
@@ -9085,6 +9575,7 @@ svn_wc__db_read_children_info(apr_hash_t **nodes,
apr_hash_t **conflicts,
svn_wc__db_t *db,
const char *dir_abspath,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -9102,23 +9593,29 @@ svn_wc__db_read_children_info(apr_hash_t **nodes,
SVN_WC__DB_WITH_TXN(
read_children_info(wcroot, dir_relpath, *conflicts, *nodes,
- result_pool, scratch_pool),
+ base_tree_only, result_pool, scratch_pool),
wcroot);
return SVN_NO_ERROR;
}
-static svn_error_t *
-db_read_props(apr_hash_t **props,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
+/* Implementation of svn_wc__db_read_single_info.
+ ### This function is very similar to a lot of code inside
+ read_children_info, but that performs some tricks to re-use data between
+ different siblings.
+
+ ### We read the same few NODES records a few times via different helper
+ functions, so this could be optimized bit, but everything is within
+ a sqlite transaction and all queries are backed by an index, so generally
+ everything (including the used indexes) should be in the sqlite page cache
+ after the first query.
+*/
static svn_error_t *
read_single_info(const struct svn_wc__db_info_t **info,
svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -9127,27 +9624,43 @@ read_single_info(const struct svn_wc__db_info_t **info,
const svn_checksum_t *checksum;
const char *original_repos_relpath;
svn_boolean_t have_work;
+ apr_hash_t *properties;
mtb = apr_pcalloc(result_pool, sizeof(*mtb));
- SVN_ERR(read_info(&mtb->status, &mtb->kind, &mtb->revnum,
- &mtb->repos_relpath, &repos_id, &mtb->changed_rev,
- &mtb->changed_date, &mtb->changed_author, &mtb->depth,
- &checksum, NULL, &original_repos_relpath, NULL, NULL,
- &mtb->lock, &mtb->recorded_size, &mtb->recorded_time,
- &mtb->changelist, &mtb->conflicted, &mtb->op_root,
- &mtb->had_props, &mtb->props_mod, &mtb->have_base,
- &mtb->have_more_work, &have_work,
- wcroot, local_relpath,
- result_pool, scratch_pool));
+ if (!base_tree_only)
+ SVN_ERR(read_info(&mtb->status, &mtb->kind, &mtb->revnum,
+ &mtb->repos_relpath, &repos_id, &mtb->changed_rev,
+ &mtb->changed_date, &mtb->changed_author, &mtb->depth,
+ &checksum, NULL, &original_repos_relpath, NULL, NULL,
+ &mtb->lock, &mtb->recorded_size, &mtb->recorded_time,
+ &mtb->changelist, &mtb->conflicted, &mtb->op_root,
+ &mtb->had_props, &mtb->props_mod, &mtb->have_base,
+ &mtb->have_more_work, &have_work,
+ wcroot, local_relpath, result_pool, scratch_pool));
+ else
+ {
+ svn_boolean_t update_root;
+
+ have_work = FALSE;
+ original_repos_relpath = NULL;
+
+ SVN_ERR(svn_wc__db_base_get_info_internal(
+ &mtb->status, &mtb->kind, &mtb->revnum, &mtb->repos_relpath,
+ &repos_id, &mtb->changed_rev, &mtb->changed_date,
+ &mtb->changed_author, &mtb->depth, &checksum, NULL,
+ &mtb->lock, &mtb->had_props, &properties, &update_root,
+ wcroot, local_relpath, scratch_pool, scratch_pool));
+
+ mtb->have_base = TRUE;
+ mtb->file_external = (update_root && mtb->kind == svn_node_file);
+ }
/* Query the same rows in the database again for move information */
if (have_work && (mtb->have_base || mtb->have_more_work))
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- const char *cur_relpath = NULL;
- int cur_op_depth;
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_MOVED_TO_NODE));
@@ -9160,22 +9673,16 @@ read_single_info(const struct svn_wc__db_info_t **info,
struct svn_wc__db_moved_to_info_t *move;
int op_depth = svn_sqlite__column_int(stmt, 0);
const char *moved_to_relpath = svn_sqlite__column_text(stmt, 1, NULL);
+ const char *cur_relpath;
move = apr_pcalloc(result_pool, sizeof(*move));
move->moved_to_abspath = svn_dirent_join(wcroot->abspath,
moved_to_relpath,
result_pool);
- if (!cur_relpath)
- {
- cur_relpath = local_relpath;
- cur_op_depth = relpath_depth(cur_relpath);
- }
- while (cur_op_depth > op_depth)
- {
- cur_relpath = svn_relpath_dirname(cur_relpath, scratch_pool);
- cur_op_depth--;
- }
+ cur_relpath = svn_relpath_prefix(local_relpath, op_depth,
+ scratch_pool);
+
move->shadow_op_root_abspath = svn_dirent_join(wcroot->abspath,
cur_relpath,
result_pool);
@@ -9192,7 +9699,8 @@ read_single_info(const struct svn_wc__db_info_t **info,
/* Maybe we have to get some shadowed lock from BASE to make our test suite
happy... (It might be completely unrelated, but...)
This queries the same BASE row again, joined to the lock table */
- if (mtb->have_base && (have_work || mtb->kind == svn_node_file))
+ if (!base_tree_only && mtb->have_base
+ && (have_work || mtb->kind == svn_node_file))
{
svn_boolean_t update_root;
svn_wc__db_lock_t **lock_arg = NULL;
@@ -9225,18 +9733,20 @@ read_single_info(const struct svn_wc__db_info_t **info,
#ifdef HAVE_SYMLINK
if (mtb->kind == svn_node_file
- && (mtb->had_props || mtb->props_mod))
+ && (mtb->had_props || mtb->props_mod
+ || (base_tree_only && properties)))
{
- apr_hash_t *properties;
-
- if (mtb->props_mod)
- SVN_ERR(db_read_props(&properties,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
- else
- SVN_ERR(db_read_pristine_props(&properties, wcroot, local_relpath,
- TRUE /* deleted_ok */,
- scratch_pool, scratch_pool));
+ if (!base_tree_only)
+ {
+ if (mtb->props_mod)
+ SVN_ERR(svn_wc__db_read_props_internal(&properties,
+ wcroot, local_relpath,
+ scratch_pool, scratch_pool));
+ else
+ SVN_ERR(db_read_pristine_props(&properties, wcroot, local_relpath,
+ TRUE /* deleted_ok */,
+ scratch_pool, scratch_pool));
+ }
mtb->special = (NULL != svn_hash_gets(properties, SVN_PROP_SPECIAL));
}
@@ -9246,11 +9756,17 @@ read_single_info(const struct svn_wc__db_info_t **info,
mtb->copied = (original_repos_relpath != NULL);
SVN_ERR(svn_wc__db_fetch_repos_info(&mtb->repos_root_url, &mtb->repos_uuid,
- wcroot->sdb, repos_id, result_pool));
+ wcroot, repos_id, result_pool));
- if (mtb->kind == svn_node_dir)
+ if (!base_tree_only && mtb->kind == svn_node_dir)
SVN_ERR(is_wclocked(&mtb->locked, wcroot, local_relpath, scratch_pool));
+ if (mtb->kind == svn_node_dir)
+ mtb->has_descendants = TRUE;
+ else
+ SVN_ERR(find_conflict_descendants(&mtb->has_descendants,
+ wcroot, local_relpath, scratch_pool));
+
*info = mtb;
return SVN_NO_ERROR;
@@ -9260,6 +9776,7 @@ svn_error_t *
svn_wc__db_read_single_info(const struct svn_wc__db_info_t **info,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -9274,6 +9791,7 @@ svn_wc__db_read_single_info(const struct svn_wc__db_info_t **info,
VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(read_single_info(info, wcroot, local_relpath,
+ base_tree_only,
result_pool, scratch_pool),
wcroot);
@@ -9443,7 +9961,7 @@ svn_wc__db_read_pristine_info(svn_wc__db_status_t *status,
}
svn_error_t *
-svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
+svn_wc__db_read_children_walker_info(const apr_array_header_t **items,
svn_wc__db_t *db,
const char *dir_abspath,
apr_pool_t *result_pool,
@@ -9453,6 +9971,7 @@ svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
const char *dir_relpath;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
+ apr_array_header_t *nodes;
SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath));
@@ -9466,16 +9985,18 @@ svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, dir_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
- *nodes = apr_hash_make(result_pool);
+ nodes = apr_array_make(result_pool, 16,
+ sizeof(struct svn_wc__db_walker_info_t *));
while (have_row)
{
struct svn_wc__db_walker_info_t *child;
const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- const char *name = svn_relpath_basename(child_relpath, NULL);
+ const char *name = svn_relpath_basename(child_relpath, result_pool);
int op_depth = svn_sqlite__column_int(stmt, 1);
svn_error_t *err;
child = apr_palloc(result_pool, sizeof(*child));
+ child->name = name;
child->status = svn_sqlite__column_token(stmt, 2, presence_map);
if (op_depth > 0)
{
@@ -9484,13 +10005,16 @@ svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
}
child->kind = svn_sqlite__column_token(stmt, 3, kind_map);
- svn_hash_sets(*nodes, apr_pstrdup(result_pool, name), child);
+
+ APR_ARRAY_PUSH(nodes, struct svn_wc__db_walker_info_t *) = child;
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
SVN_ERR(svn_sqlite__reset(stmt));
+ *items = nodes;
+
return SVN_NO_ERROR;
}
@@ -9545,7 +10069,7 @@ svn_wc__db_read_node_install_info(const char **wcroot_abspath,
if (have_row)
{
- if (!err && sha1_checksum)
+ if (sha1_checksum)
err = svn_sqlite__column_checksum(sha1_checksum, stmt, 6, result_pool);
if (!err && pristine_props)
@@ -9574,68 +10098,48 @@ svn_wc__db_read_node_install_info(const char **wcroot_abspath,
-/* The body of svn_wc__db_read_url().
+/* The body of svn_wc__db_read_repos_info().
*/
static svn_error_t *
-read_url_txn(const char **url,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+db_read_repos_info(svn_revnum_t *revision,
+ const char **repos_relpath,
+ apr_int64_t *repos_id,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_status_t status;
- const char *repos_relpath;
- const char *repos_root_url;
- apr_int64_t repos_id;
- svn_boolean_t have_base;
- SVN_ERR(read_info(&status, NULL, NULL, &repos_relpath, &repos_id, NULL,
+ SVN_ERR(read_info(&status, NULL, revision, repos_relpath, repos_id, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- &have_base, NULL, NULL,
- wcroot, local_relpath, scratch_pool, scratch_pool));
+ NULL, NULL, NULL,
+ wcroot, local_relpath, result_pool, scratch_pool));
- if (repos_relpath == NULL)
+ if ((repos_relpath && !*repos_relpath)
+ || (repos_id && *repos_id == INVALID_REPOS_ID))
{
if (status == svn_wc__db_status_added)
{
- SVN_ERR(scan_addition(NULL, NULL, &repos_relpath, &repos_id, NULL,
+ SVN_ERR(scan_addition(NULL, NULL, repos_relpath, repos_id, NULL,
NULL, NULL, NULL, NULL, NULL,
wcroot, local_relpath,
- scratch_pool, scratch_pool));
+ result_pool, scratch_pool));
}
else if (status == svn_wc__db_status_deleted)
{
const char *base_del_relpath;
const char *work_del_relpath;
- SVN_ERR(scan_deletion_txn(&base_del_relpath, NULL,
- &work_del_relpath,
- NULL, wcroot,
- local_relpath,
- scratch_pool,
- scratch_pool));
-
- if (base_del_relpath)
- {
- SVN_ERR(svn_wc__db_base_get_info_internal(NULL, NULL, NULL,
- &repos_relpath,
- &repos_id,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- wcroot,
- base_del_relpath,
- scratch_pool,
- scratch_pool));
+ SVN_ERR(scan_deletion(&base_del_relpath, NULL,
+ &work_del_relpath,
+ NULL, wcroot,
+ local_relpath,
+ scratch_pool,
+ scratch_pool));
- repos_relpath = svn_relpath_join(
- repos_relpath,
- svn_dirent_skip_ancestor(base_del_relpath,
- local_relpath),
- scratch_pool);
- }
- else
+ if (work_del_relpath)
{
/* The parent of the WORKING delete, must be an addition */
const char *work_relpath = NULL;
@@ -9648,34 +10152,57 @@ read_url_txn(const char **url,
work_relpath = svn_relpath_dirname(work_del_relpath,
scratch_pool);
- SVN_ERR(scan_addition(NULL, NULL, &repos_relpath, &repos_id,
+ SVN_ERR(scan_addition(NULL, NULL, repos_relpath, repos_id,
NULL, NULL, NULL, NULL, NULL, NULL,
wcroot, work_relpath,
scratch_pool, scratch_pool));
- repos_relpath = svn_relpath_join(
- repos_relpath,
+ if (repos_relpath)
+ *repos_relpath = svn_relpath_join(
+ *repos_relpath,
svn_dirent_skip_ancestor(work_relpath,
local_relpath),
- scratch_pool);
+ result_pool);
+ }
+ else
+ {
+ SVN_ERR(svn_wc__db_base_get_info_internal(NULL, NULL, revision,
+ repos_relpath,
+ repos_id,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ wcroot,
+ base_del_relpath,
+ scratch_pool,
+ scratch_pool));
+
+ if (repos_relpath)
+ *repos_relpath = svn_relpath_join(
+ *repos_relpath,
+ svn_dirent_skip_ancestor(base_del_relpath,
+ local_relpath),
+ result_pool);
}
}
else if (status == svn_wc__db_status_excluded)
{
const char *parent_relpath;
const char *name;
- const char *url2;
- /* Set 'url' to the *full URL* of the parent WC dir,
- * and 'name' to the *single path component* that is the
- * basename of this WC directory, so that joining them will result
- * in the correct full URL. */
+ /* A BASE excluded would have had repository information, so
+ we have a working exclude, which must be below an addition */
+
svn_relpath_split(&parent_relpath, &name, local_relpath,
scratch_pool);
- SVN_ERR(read_url_txn(&url2, wcroot, parent_relpath,
- scratch_pool, scratch_pool));
+ SVN_ERR(scan_addition(NULL, NULL, repos_relpath, repos_id, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ wcroot, parent_relpath,
+ scratch_pool, scratch_pool));
- *url = svn_path_url_add_component2(url2, name, result_pool);
+ if (repos_relpath)
+ *repos_relpath = svn_relpath_join(*repos_relpath, name,
+ result_pool);
return SVN_NO_ERROR;
}
@@ -9687,26 +10214,23 @@ read_url_txn(const char **url,
}
}
- SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, NULL, wcroot->sdb,
- repos_id, scratch_pool));
-
- SVN_ERR_ASSERT(repos_root_url != NULL && repos_relpath != NULL);
- *url = svn_path_url_add_component2(repos_root_url, repos_relpath,
- result_pool);
-
return SVN_NO_ERROR;
}
svn_error_t *
-svn_wc__db_read_url(const char **url,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+svn_wc__db_read_repos_info(svn_revnum_t *revision,
+ const char **repos_relpath,
+ const char **repos_root_url,
+ const char **repos_uuid,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
+ apr_int64_t repos_id = INVALID_REPOS_ID;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -9715,9 +10239,17 @@ svn_wc__db_read_url(const char **url,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_WC__DB_WITH_TXN(read_url_txn(url, wcroot, local_relpath,
- result_pool, scratch_pool),
- wcroot);
+ SVN_WC__DB_WITH_TXN4(db_read_repos_info(revision, repos_relpath,
+ (repos_root_url || repos_uuid)
+ ? &repos_id : NULL,
+ wcroot, local_relpath,
+ result_pool, scratch_pool),
+ svn_wc__db_fetch_repos_info(repos_root_url,
+ repos_uuid,
+ wcroot, repos_id,
+ result_pool),
+ SVN_NO_ERROR, SVN_NO_ERROR,
+ wcroot);
return SVN_NO_ERROR;
}
@@ -9861,12 +10393,12 @@ svn_wc__db_read_props_streamily(svn_wc__db_t *db,
/* Helper for svn_wc__db_read_props().
*/
-static svn_error_t *
-db_read_props(apr_hash_t **props,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+svn_error_t *
+svn_wc__db_read_props_internal(apr_hash_t **props,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
@@ -9923,8 +10455,10 @@ svn_wc__db_read_props(apr_hash_t **props,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_WC__DB_WITH_TXN(db_read_props(props, wcroot, local_relpath,
- result_pool, scratch_pool),
+ SVN_WC__DB_WITH_TXN(svn_wc__db_read_props_internal(props, wcroot,
+ local_relpath,
+ result_pool,
+ scratch_pool),
wcroot);
return SVN_NO_ERROR;
@@ -10155,7 +10689,7 @@ filter_unwanted_props(apr_hash_t *prop_hash,
hi;
hi = apr_hash_next(hi))
{
- const char *ipropname = svn__apr_hash_index_key(hi);
+ const char *ipropname = apr_hash_this_key(hi);
if (strcmp(ipropname, propname) != 0)
svn_hash_sets(prop_hash, ipropname, NULL);
@@ -10329,7 +10863,7 @@ db_read_inherited_props(apr_array_header_t **inherited_props,
iprop_elt->prop_hash = node_props;
/* Build the output array in depth-first order. */
- svn_sort__array_insert(&iprop_elt, iprops, 0);
+ svn_sort__array_insert(iprops, &iprop_elt, 0);
}
}
}
@@ -10365,7 +10899,7 @@ db_read_inherited_props(apr_array_header_t **inherited_props,
/* If we didn't filter everything then keep this iprop. */
if (apr_hash_count(cached_iprop->prop_hash))
- svn_sort__array_insert(&cached_iprop, iprops, 0);
+ svn_sort__array_insert(iprops, &cached_iprop, 0);
}
}
@@ -10479,7 +11013,7 @@ get_children_with_cached_iprops(apr_hash_t **iprop_paths,
hi;
hi = apr_hash_next(hi))
{
- const char *child_abspath = svn__apr_hash_index_key(hi);
+ const char *child_abspath = apr_hash_this_key(hi);
const char *child_relpath;
svn_node_kind_t child_kind;
@@ -10557,8 +11091,34 @@ svn_wc__db_read_children_of_working_node(const apr_array_header_t **children,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return gather_children2(children, wcroot, local_relpath,
- result_pool, scratch_pool);
+ return svn_error_trace(
+ gather_children(children, wcroot, local_relpath,
+ STMT_SELECT_WORKING_CHILDREN, -1,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_wc__db_base_read_not_present_children(
+ const apr_array_header_t **children,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ local_abspath,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ return svn_error_trace(
+ gather_children(children, wcroot, local_relpath,
+ STMT_SELECT_BASE_NOT_PRESENT_CHILDREN, -1,
+ result_pool, scratch_pool));
}
/* Helper for svn_wc__db_node_check_replace().
@@ -10745,75 +11305,27 @@ svn_wc__db_read_children(const apr_array_header_t **children,
VERIFY_USABLE_WCROOT(wcroot);
return gather_children(children, wcroot, local_relpath,
+ STMT_SELECT_NODE_CHILDREN, -1,
result_pool, scratch_pool);
}
-/* */
+/* Implementation of svn_wc__db_global_relocate */
static svn_error_t *
relocate_txn(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
const char *repos_root_url,
- const char *repos_uuid,
- svn_boolean_t have_base_node,
- apr_int64_t old_repos_id,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
apr_int64_t new_repos_id;
-
- /* This function affects all the children of the given local_relpath,
- but the way that it does this is through the repos inheritance mechanism.
- So, we only need to rewrite the repos_id of the given local_relpath,
- as well as any children with a non-null repos_id, as well as various
- repos_id fields in the locks and working_node tables.
- */
-
- /* Get the repos_id for the new repository. */
- SVN_ERR(create_repos_id(&new_repos_id, repos_root_url, repos_uuid,
- wcroot->sdb, scratch_pool));
-
- /* Set the (base and working) repos_ids and clear the dav_caches */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_RECURSIVE_UPDATE_NODE_REPO));
- SVN_ERR(svn_sqlite__bindf(stmt, "isii", wcroot->wc_id, local_relpath,
- old_repos_id, new_repos_id));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- if (have_base_node)
- {
- /* Update any locks for the root or its children. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_UPDATE_LOCK_REPOS_ID));
- SVN_ERR(svn_sqlite__bindf(stmt, "ii", old_repos_id, new_repos_id));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_wc__db_global_relocate(svn_wc__db_t *db,
- const char *local_dir_abspath,
- const char *repos_root_url,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
const char *local_dir_relpath;
svn_wc__db_status_t status;
const char *repos_uuid;
svn_boolean_t have_base_node;
apr_int64_t old_repos_id;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_dir_abspath));
- /* ### assert that we were passed a directory? */
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_dir_relpath,
- db, local_dir_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
- local_relpath = local_dir_relpath;
+ local_dir_relpath = local_relpath;
SVN_ERR(read_info(&status,
NULL, NULL, NULL, &old_repos_id,
@@ -10852,11 +11364,11 @@ svn_wc__db_global_relocate(svn_wc__db_t *db,
{
const char *work_del_relpath;
- SVN_ERR(scan_deletion_txn(NULL, NULL,
- &work_del_relpath, NULL,
- wcroot, local_dir_relpath,
- scratch_pool,
- scratch_pool));
+ SVN_ERR(scan_deletion(NULL, NULL,
+ &work_del_relpath, NULL,
+ wcroot, local_dir_relpath,
+ scratch_pool,
+ scratch_pool));
if (work_del_relpath)
{
/* Deleted within a copy/move */
@@ -10884,15 +11396,62 @@ svn_wc__db_global_relocate(svn_wc__db_t *db,
scratch_pool, scratch_pool));
}
- SVN_ERR(svn_wc__db_fetch_repos_info(NULL, &repos_uuid, wcroot->sdb,
+ SVN_ERR(svn_wc__db_fetch_repos_info(NULL, &repos_uuid, wcroot,
old_repos_id, scratch_pool));
- SVN_ERR_ASSERT(repos_uuid);
+ SVN_ERR_ASSERT(repos_uuid); /* This function affects all the children of the given local_relpath,
+ but the way that it does this is through the repos inheritance mechanism.
+ So, we only need to rewrite the repos_id of the given local_relpath,
+ as well as any children with a non-null repos_id, as well as various
+ repos_id fields in the locks and working_node tables.
+ */
+
+ /* Get the repos_id for the new repository. */
+ SVN_ERR(create_repos_id(&new_repos_id, repos_root_url, repos_uuid,
+ wcroot->sdb, scratch_pool));
+
+ /* Set the (base and working) repos_ids and clear the dav_caches */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_RECURSIVE_UPDATE_NODE_REPO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isii", wcroot->wc_id, local_relpath,
+ old_repos_id, new_repos_id));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+
+ if (have_base_node)
+ {
+ /* Update any locks for the root or its children. */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_UPDATE_LOCK_REPOS_ID));
+ SVN_ERR(svn_sqlite__bindf(stmt, "ii", old_repos_id, new_repos_id));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_wc__db_global_relocate(svn_wc__db_t *db,
+ const char *local_dir_abspath,
+ const char *repos_root_url,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_dir_abspath));
+ /* ### assert that we were passed a directory? */
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
+ db, local_dir_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(
- relocate_txn(wcroot, local_relpath, repos_root_url, repos_uuid,
- have_base_node, old_repos_id, scratch_pool),
+ relocate_txn(wcroot, local_relpath, repos_root_url, scratch_pool),
wcroot);
+ SVN_ERR(flush_entries(wcroot, local_dir_abspath, svn_depth_infinity,
+ scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -10979,6 +11538,48 @@ determine_commit_repos_info(apr_int64_t *repos_id,
return svn_error_trace(svn_sqlite__reset(stmt));
}
+static svn_error_t *
+moved_descendant_collect(apr_hash_t **map,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+
+ *map = NULL;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_MOVED_DESCENDANTS_SRC));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ local_relpath,
+ op_depth));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (! have_row)
+ return svn_error_trace(svn_sqlite__reset(stmt));
+
+ /* Find all moved descendants. Key them on target, because that is
+ always unique */
+ while (have_row)
+ {
+ const char *src_relpath = svn_sqlite__column_text(stmt, 1, result_pool);
+ const char *to_relpath = svn_sqlite__column_text(stmt, 4, result_pool);
+
+ if (!*map)
+ *map = apr_hash_make(result_pool);
+
+ svn_hash_sets(*map, to_relpath, src_relpath);
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ return SVN_NO_ERROR;
+}
+
/* Helper for svn_wc__db_global_commit()
Makes local_relpath and all its descendants at the same op-depth represent
@@ -10990,49 +11591,25 @@ determine_commit_repos_info(apr_int64_t *repos_id,
Assumptions:
* local_relpath is not the working copy root (can't be moved)
* repos_relpath is not the repository root (can't be moved)
- */
+ */
static svn_error_t *
moved_descendant_commit(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- int op_depth,
apr_int64_t repos_id,
const char *repos_relpath,
svn_revnum_t revision,
+ apr_hash_t *children,
apr_pool_t *scratch_pool)
{
- apr_hash_t *children;
apr_pool_t *iterpool;
svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
apr_hash_index_t *hi;
SVN_ERR_ASSERT(*local_relpath != '\0'
&& *repos_relpath != '\0');
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_MOVED_DESCENDANTS));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- local_relpath,
- op_depth));
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (! have_row)
- return svn_error_trace(svn_sqlite__reset(stmt));
-
- children = apr_hash_make(scratch_pool);
-
- /* First, obtain all moved children */
- /* To keep error handling simple, first cache them in a hashtable */
- while (have_row)
- {
- const char *src_relpath = svn_sqlite__column_text(stmt, 0, scratch_pool);
- const char *to_relpath = svn_sqlite__column_text(stmt, 1, scratch_pool);
-
- svn_hash_sets(children, src_relpath, to_relpath);
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
- SVN_ERR(svn_sqlite__reset(stmt));
+ if (!children)
+ return SVN_NO_ERROR;
/* Then update them */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
@@ -11041,11 +11618,12 @@ moved_descendant_commit(svn_wc__db_wcroot_t *wcroot,
iterpool = svn_pool_create(scratch_pool);
for (hi = apr_hash_first(scratch_pool, children); hi; hi = apr_hash_next(hi))
{
- const char *src_relpath = svn__apr_hash_index_key(hi);
- const char *to_relpath = svn__apr_hash_index_val(hi);
+ const char *src_relpath = apr_hash_this_val(hi);
+ const char *to_relpath = apr_hash_this_key(hi);
const char *new_repos_relpath;
int to_op_depth = relpath_depth(to_relpath);
int affected;
+ apr_hash_t *map;
svn_pool_clear(iterpool);
@@ -11072,9 +11650,11 @@ moved_descendant_commit(svn_wc__db_wcroot_t *wcroot,
SVN_ERR_ASSERT(affected >= 1); /* If this fails there is no move dest */
#endif
- SVN_ERR(moved_descendant_commit(wcroot, to_relpath, to_op_depth,
+ SVN_ERR(moved_descendant_collect(&map, wcroot, to_relpath, to_op_depth,
+ iterpool, iterpool));
+ SVN_ERR(moved_descendant_commit(wcroot, to_relpath,
repos_id, new_repos_relpath, revision,
- iterpool));
+ map, iterpool));
}
svn_pool_destroy(iterpool);
@@ -11133,7 +11713,6 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
apr_time_t changed_date,
const char *changed_author,
const svn_checksum_t *new_checksum,
- const apr_array_header_t *new_children,
apr_hash_t *new_dav_cache,
svn_boolean_t keep_changelist,
svn_boolean_t no_unlock,
@@ -11155,6 +11734,7 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
const char *repos_relpath;
int op_depth;
svn_wc__db_status_t old_presence;
+ svn_boolean_t moved_here;
/* If we are adding a file or directory, then we need to get
repository information from the parent node since "this node" does
@@ -11184,6 +11764,7 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
/* Figure out the new node's kind. It will be whatever is in WORKING_NODE,
or there will be a BASE_NODE that has it. */
+ old_presence = svn_sqlite__column_token(stmt_info, 3, presence_map);
new_kind = svn_sqlite__column_token(stmt_info, 4, kind_map);
/* What will the new depth be? */
@@ -11202,26 +11783,35 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
svn_sqlite__column_text(stmt_info, 2, NULL)) == 0);
}
- /* Find the appropriate new properties -- ACTUAL overrides any properties
- in WORKING that arrived as part of a copy/move.
+ if (old_presence != svn_wc__db_status_base_deleted)
+ {
+ /* Find the appropriate new properties -- ACTUAL overrides any properties
+ in WORKING that arrived as part of a copy/move.
- Note: we'll keep them as a big blob of data, rather than
- deserialize/serialize them. */
- if (have_act)
- prop_blob.data = svn_sqlite__column_blob(stmt_act, 1, &prop_blob.len,
- scratch_pool);
- if (prop_blob.data == NULL)
- prop_blob.data = svn_sqlite__column_blob(stmt_info, 14, &prop_blob.len,
- scratch_pool);
-
- inherited_prop_blob.data = svn_sqlite__column_blob(stmt_info, 16,
- &inherited_prop_blob.len,
- scratch_pool);
+ Note: we'll keep them as a big blob of data, rather than
+ deserialize/serialize them. */
+ if (have_act)
+ prop_blob.data = svn_sqlite__column_blob(stmt_act, 1, &prop_blob.len,
+ scratch_pool);
+ if (prop_blob.data == NULL)
+ prop_blob.data = svn_sqlite__column_blob(stmt_info, 14, &prop_blob.len,
+ scratch_pool);
- if (keep_changelist && have_act)
- changelist = svn_sqlite__column_text(stmt_act, 0, scratch_pool);
+ inherited_prop_blob.data = svn_sqlite__column_blob(
+ stmt_info, 16,
+ &inherited_prop_blob.len,
+ scratch_pool);
- old_presence = svn_sqlite__column_token(stmt_info, 3, presence_map);
+ if (keep_changelist && have_act)
+ changelist = svn_sqlite__column_text(stmt_act, 0, scratch_pool);
+
+ moved_here = svn_sqlite__column_int(stmt_info, 15);
+ }
+ else
+ {
+ moved_here = FALSE;
+ changelist = NULL;
+ }
/* ### other stuff? */
@@ -11232,6 +11822,24 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
{
int affected_rows;
+ SVN_ERR_ASSERT(op_depth == relpath_depth(local_relpath));
+
+ /* First clear the moves that we are going to delete in a bit */
+ {
+ apr_hash_t *old_moves;
+ apr_hash_index_t *hi;
+ SVN_ERR(moved_descendant_collect(&old_moves, wcroot, local_relpath, 0,
+ scratch_pool, scratch_pool));
+
+ if (old_moves)
+ for (hi = apr_hash_first(scratch_pool, old_moves);
+ hi; hi = apr_hash_next(hi))
+ {
+ SVN_ERR(clear_moved_here(wcroot, apr_hash_this_key(hi),
+ scratch_pool));
+ }
+ }
+
/* This removes all layers of this node and at the same time determines
if we need to remove shadowed layers below our descendants. */
@@ -11264,26 +11872,40 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
be integrated, they really affect a different op-depth and
completely different nodes (via a different recursion pattern). */
- /* Collapse descendants of the current op_depth in layer 0 */
- SVN_ERR(descendant_commit(wcroot, local_relpath, op_depth,
- repos_id, repos_relpath, new_revision,
- scratch_pool));
+ if (old_presence != svn_wc__db_status_base_deleted)
+ {
+ /* Collapse descendants of the current op_depth to layer 0,
+ this includes moved-from/to clearing */
+ SVN_ERR(descendant_commit(wcroot, local_relpath, op_depth,
+ repos_id, repos_relpath, new_revision,
+ scratch_pool));
+ }
+
+ if (old_presence != svn_wc__db_status_base_deleted)
+ {
+ apr_hash_t *moves = NULL;
+
+ SVN_ERR(moved_descendant_collect(&moves, wcroot, local_relpath, 0,
+ scratch_pool, scratch_pool));
- /* And make the recorded local moves represent moves of the node we just
- committed. */
- SVN_ERR(moved_descendant_commit(wcroot, local_relpath, 0,
+ /* And make the recorded local moves represent moves of the node we
+ just committed. */
+ SVN_ERR(moved_descendant_commit(wcroot, local_relpath,
repos_id, repos_relpath, new_revision,
- scratch_pool));
+ moves, scratch_pool));
+ }
- /* This node is no longer modified, so no node was moved here */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_CLEAR_MOVED_TO_FROM_DEST));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
- local_relpath));
+ if (moved_here)
+ {
+ /* This node is no longer modified, so no node was moved here */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_CLEAR_MOVED_TO_FROM_DEST));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
+ local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
}
-
/* Update or add the BASE_NODE row with all the new information. */
if (*local_relpath == '\0')
@@ -11292,38 +11914,56 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
parent_relpath = svn_relpath_dirname(local_relpath, scratch_pool);
/* Preserve any incomplete status */
- new_presence = (old_presence == svn_wc__db_status_incomplete
- ? svn_wc__db_status_incomplete
- : svn_wc__db_status_normal);
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_APPLY_CHANGES_TO_BASE_NODE));
- /* symlink_target not yet used */
- SVN_ERR(svn_sqlite__bindf(stmt, "issisrtstrisnbn",
- wcroot->wc_id, local_relpath,
- parent_relpath,
- repos_id,
- repos_relpath,
- new_revision,
- presence_map, new_presence,
- new_depth_str,
- kind_map, new_kind,
- changed_rev,
- changed_date,
- changed_author,
- prop_blob.data, prop_blob.len));
-
- SVN_ERR(svn_sqlite__bind_checksum(stmt, 13, new_checksum,
- scratch_pool));
- SVN_ERR(svn_sqlite__bind_properties(stmt, 15, new_dav_cache,
- scratch_pool));
- if (inherited_prop_blob.data != NULL)
+ if (old_presence != svn_wc__db_status_base_deleted)
{
- SVN_ERR(svn_sqlite__bind_blob(stmt, 17, inherited_prop_blob.data,
- inherited_prop_blob.len));
+ new_presence = (old_presence == svn_wc__db_status_incomplete
+ ? svn_wc__db_status_incomplete
+ : svn_wc__db_status_normal);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_APPLY_CHANGES_TO_BASE_NODE));
+ /* symlink_target not yet used */
+ SVN_ERR(svn_sqlite__bindf(stmt, "issisrtstrisnbn",
+ wcroot->wc_id, local_relpath,
+ parent_relpath,
+ repos_id,
+ repos_relpath,
+ new_revision,
+ presence_map, new_presence,
+ new_depth_str,
+ kind_map, new_kind,
+ changed_rev,
+ changed_date,
+ changed_author,
+ prop_blob.data, prop_blob.len));
+
+ SVN_ERR(svn_sqlite__bind_checksum(stmt, 13, new_checksum,
+ scratch_pool));
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 15, new_dav_cache,
+ scratch_pool));
+ if (inherited_prop_blob.data != NULL)
+ {
+ SVN_ERR(svn_sqlite__bind_blob(stmt, 17, inherited_prop_blob.data,
+ inherited_prop_blob.len));
+ }
+
+ SVN_ERR(svn_sqlite__step_done(stmt));
}
+ else
+ {
+ struct insert_base_baton_t ibb;
+ blank_ibb(&ibb);
- SVN_ERR(svn_sqlite__step_done(stmt));
+ ibb.repos_id = repos_id;
+ ibb.status = svn_wc__db_status_not_present;
+ ibb.kind = new_kind;
+ ibb.repos_relpath = repos_relpath;
+ ibb.revision = new_revision;
+
+ SVN_ERR(insert_base_node(&ibb, wcroot, local_relpath, scratch_pool));
+
+ keep_changelist = FALSE; /* Nothing there */
+ }
if (have_act)
{
@@ -11351,23 +11991,21 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
}
}
- if (new_kind == svn_node_dir)
- {
- /* When committing a directory, we should have its new children. */
- /* ### one day. just not today. */
-#if 0
- SVN_ERR_ASSERT(new_children != NULL);
-#endif
-
- /* ### process the children */
- }
-
if (!no_unlock)
{
svn_sqlite__stmt_t *lock_stmt;
+ svn_boolean_t op_root = (op_depth > 0
+ && (relpath_depth(local_relpath) == op_depth));
+ /* If we are committing an add of a delete, we can assume we own
+ all locks at or below REPOS_RELPATH (or the server would have
+ denied the commit). As we must have passed these to the server
+ we can now safely remove them.
+ */
SVN_ERR(svn_sqlite__get_statement(&lock_stmt, wcroot->sdb,
- STMT_DELETE_LOCK_RECURSIVELY));
+ op_root
+ ? STMT_DELETE_LOCK_RECURSIVELY
+ : STMT_DELETE_LOCK));
SVN_ERR(svn_sqlite__bindf(lock_stmt, "is", repos_id, repos_relpath));
SVN_ERR(svn_sqlite__step_done(lock_stmt));
}
@@ -11387,7 +12025,6 @@ svn_wc__db_global_commit(svn_wc__db_t *db,
apr_time_t changed_date,
const char *changed_author,
const svn_checksum_t *new_checksum,
- const apr_array_header_t *new_children,
apr_hash_t *new_dav_cache,
svn_boolean_t keep_changelist,
svn_boolean_t no_unlock,
@@ -11399,7 +12036,6 @@ svn_wc__db_global_commit(svn_wc__db_t *db,
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(new_revision));
- SVN_ERR_ASSERT(new_checksum == NULL || new_children == NULL);
SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
local_abspath, scratch_pool, scratch_pool));
@@ -11408,7 +12044,7 @@ svn_wc__db_global_commit(svn_wc__db_t *db,
SVN_WC__DB_WITH_TXN(
commit_node(wcroot, local_relpath,
new_revision, changed_revision, changed_date, changed_author,
- new_checksum, new_children, new_dav_cache, keep_changelist,
+ new_checksum, new_dav_cache, keep_changelist,
no_unlock, work_items, scratch_pool),
wcroot);
@@ -11543,6 +12179,9 @@ db_op_set_rev_repos_relpath_iprops(svn_wc__db_wcroot_t *wcroot,
* non-NULL update the entry to the new url specified by NEW_REPOS_RELPATH,
* NEW_REPOS_ID. If NEW_REV is valid, make this the node's working revision.
*
+ * NODE_STATUS, NODE_KIND, NODE_REVISION and NODE_REPOS_RELPATH represent the
+ * values as stored currently in WCROOT for LOCAL_RELPATH.
+ *
* If WCROOT_IPROPS is not NULL it is a hash mapping const char * absolute
* working copy paths to depth-first ordered arrays of
* svn_prop_inherited_item_t * structures. If the absolute path equivalent
@@ -11555,6 +12194,10 @@ db_op_set_rev_repos_relpath_iprops(svn_wc__db_wcroot_t *wcroot,
static svn_error_t *
bump_node_revision(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
+ svn_wc__db_status_t node_status,
+ svn_node_kind_t node_kind,
+ svn_revnum_t node_revision,
+ const char *node_repos_relpath,
apr_int64_t new_repos_id,
const char *new_repos_relpath,
svn_revnum_t new_rev,
@@ -11567,56 +12210,14 @@ bump_node_revision(svn_wc__db_wcroot_t *wcroot,
apr_pool_t *scratch_pool)
{
apr_pool_t *iterpool;
- const apr_array_header_t *children;
- int i;
- svn_wc__db_status_t status;
- svn_node_kind_t db_kind;
- svn_revnum_t revision;
- const char *repos_relpath;
- apr_int64_t repos_id;
+ apr_hash_t *children;
+ apr_hash_index_t *hi;
svn_boolean_t set_repos_relpath = FALSE;
- svn_boolean_t update_root;
svn_depth_t depth_below_here = depth;
apr_array_header_t *iprops = NULL;
- /* Skip an excluded path and its descendants. */
- if (svn_hash_gets(exclude_relpaths, local_relpath))
- return SVN_NO_ERROR;
-
- SVN_ERR(svn_wc__db_base_get_info_internal(&status, &db_kind, &revision,
- &repos_relpath, &repos_id,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, &update_root,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
-
- /* Skip file externals */
- if (update_root
- && db_kind == svn_node_file
- && !is_root)
- return SVN_NO_ERROR;
-
- if (skip_when_dir && db_kind == svn_node_dir)
- return SVN_NO_ERROR;
-
- /* If the node is still marked 'not-present', then the server did not
- re-add it. So it's really gone in this revision, thus we remove the node.
-
- If the node is still marked 'server-excluded' and yet is not the same
- revision as new_rev, then the server did not re-add it, nor
- re-server-exclude it, so we can remove the node. */
- if (!is_root
- && (status == svn_wc__db_status_not_present
- || (status == svn_wc__db_status_server_excluded &&
- revision != new_rev)))
- {
- return svn_error_trace(db_base_remove(wcroot, local_relpath,
- db, FALSE, FALSE, FALSE,
- SVN_INVALID_REVNUM,
- NULL, NULL, scratch_pool));
- }
-
- if (new_repos_relpath != NULL && strcmp(repos_relpath, new_repos_relpath))
+ if (new_repos_relpath != NULL
+ && strcmp(node_repos_relpath, new_repos_relpath))
set_repos_relpath = TRUE;
if (wcroot_iprops)
@@ -11626,7 +12227,7 @@ bump_node_revision(svn_wc__db_wcroot_t *wcroot,
if (iprops
|| set_repos_relpath
- || (SVN_IS_VALID_REVNUM(new_rev) && new_rev != revision))
+ || (SVN_IS_VALID_REVNUM(new_rev) && new_rev != node_revision))
{
SVN_ERR(db_op_set_rev_repos_relpath_iprops(wcroot, local_relpath,
iprops, new_rev,
@@ -11638,10 +12239,10 @@ bump_node_revision(svn_wc__db_wcroot_t *wcroot,
/* Early out */
if (depth <= svn_depth_empty
- || db_kind != svn_node_dir
- || status == svn_wc__db_status_server_excluded
- || status == svn_wc__db_status_excluded
- || status == svn_wc__db_status_not_present)
+ || node_kind != svn_node_dir
+ || node_status == svn_wc__db_status_server_excluded
+ || node_status == svn_wc__db_status_excluded
+ || node_status == svn_wc__db_status_not_present)
return SVN_NO_ERROR;
/* And now recurse over the children */
@@ -11653,25 +12254,62 @@ bump_node_revision(svn_wc__db_wcroot_t *wcroot,
iterpool = svn_pool_create(scratch_pool);
- SVN_ERR(gather_repo_children(&children, wcroot, local_relpath, 0,
- scratch_pool, iterpool));
- for (i = 0; i < children->nelts; i++)
+ SVN_ERR(base_get_children_info(&children, wcroot, local_relpath, 0,
+ scratch_pool, iterpool));
+ for (hi = apr_hash_first(scratch_pool, children); hi; hi = apr_hash_next(hi))
{
- const char *child_basename = APR_ARRAY_IDX(children, i, const char *);
+ const char *child_basename = apr_hash_this_key(hi);
+ const struct svn_wc__db_base_info_t *child_info;
const char *child_local_relpath;
const char *child_repos_relpath = NULL;
svn_pool_clear(iterpool);
+ child_info = apr_hash_this_val(hi);
+
+ if (child_info->update_root && child_info->kind == svn_node_file)
+ continue; /* Skip file externals */
+
+ if (depth < svn_depth_immediates && child_info->kind == svn_node_dir)
+ continue; /* Skip directories */
+
+ child_local_relpath = svn_relpath_join(local_relpath, child_basename,
+ iterpool);
+
+ /* Don't touch nodes that can't be touched via the exclude list */
+ if (svn_hash_gets(exclude_relpaths, child_local_relpath))
+ continue;
+
+ /* If the node is still marked 'not-present', then the server did not
+ re-add it. So it's really gone in this revision, thus we remove the
+ node.
+
+ If the node is still marked 'server-excluded' and yet is not the same
+ revision as new_rev, then the server did not re-add it, nor
+ re-server-exclude it, so we can remove the node. */
+ if (child_info->status == svn_wc__db_status_not_present
+ || (child_info->status == svn_wc__db_status_server_excluded &&
+ child_info->revnum != new_rev))
+ {
+ svn_sqlite__stmt_t *stmt;
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_BASE_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, child_local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ continue;
+ }
+
/* Derive the new URL for the current (child) entry */
if (new_repos_relpath)
child_repos_relpath = svn_relpath_join(new_repos_relpath,
child_basename, iterpool);
- child_local_relpath = svn_relpath_join(local_relpath, child_basename,
- iterpool);
-
- SVN_ERR(bump_node_revision(wcroot, child_local_relpath, new_repos_id,
+ SVN_ERR(bump_node_revision(wcroot, child_local_relpath,
+ child_info->status,
+ child_info->kind,
+ child_info->revnum,
+ child_info->repos_relpath,
+ new_repos_id,
child_repos_relpath, new_rev,
depth_below_here,
exclude_relpaths, wcroot_iprops,
@@ -11699,6 +12337,7 @@ bump_revisions_post_update(svn_wc__db_wcroot_t *wcroot,
svn_revnum_t new_revision,
apr_hash_t *exclude_relpaths,
apr_hash_t *wcroot_iprops,
+ svn_boolean_t empty_update,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
@@ -11707,8 +12346,11 @@ bump_revisions_post_update(svn_wc__db_wcroot_t *wcroot,
svn_node_kind_t kind;
svn_error_t *err;
apr_int64_t new_repos_id = INVALID_REPOS_ID;
+ svn_revnum_t revision;
+ const char *repos_relpath;
- err = svn_wc__db_base_get_info_internal(&status, &kind, NULL, NULL, NULL,
+ err = svn_wc__db_base_get_info_internal(&status, &kind, &revision,
+ &repos_relpath, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
wcroot, local_relpath,
@@ -11738,13 +12380,16 @@ bump_revisions_post_update(svn_wc__db_wcroot_t *wcroot,
new_repos_uuid,
wcroot->sdb, scratch_pool));
- SVN_ERR(bump_node_revision(wcroot, local_relpath, new_repos_id,
+ SVN_ERR(bump_node_revision(wcroot, local_relpath,
+ status, kind, revision, repos_relpath,
+ new_repos_id,
new_repos_relpath, new_revision,
depth, exclude_relpaths,
wcroot_iprops,
TRUE /* is_root */, FALSE, db,
scratch_pool));
+ /* ### TODO: Use empty_update flag for change knowledge */
SVN_ERR(svn_wc__db_bump_moved_away(wcroot, local_relpath, depth, db,
scratch_pool));
@@ -11765,6 +12410,7 @@ svn_wc__db_op_bump_revisions_post_update(svn_wc__db_t *db,
svn_revnum_t new_revision,
apr_hash_t *exclude_relpaths,
apr_hash_t *wcroot_iprops,
+ svn_boolean_t empty_update,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool)
@@ -11787,7 +12433,7 @@ svn_wc__db_op_bump_revisions_post_update(svn_wc__db_t *db,
bump_revisions_post_update(wcroot, local_relpath, db,
depth, new_repos_relpath, new_repos_root_url,
new_repos_uuid, new_revision,
- exclude_relpaths, wcroot_iprops,
+ exclude_relpaths, wcroot_iprops, empty_update,
notify_func, notify_baton, scratch_pool),
wcroot);
@@ -11864,6 +12510,7 @@ svn_wc__db_lock_add(svn_wc__db_t *db,
static svn_error_t *
lock_remove_txn(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
+ svn_skel_t *work_items,
apr_pool_t *scratch_pool)
{
const char *repos_relpath;
@@ -11883,6 +12530,8 @@ lock_remove_txn(svn_wc__db_wcroot_t *wcroot,
SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -11890,6 +12539,7 @@ lock_remove_txn(svn_wc__db_wcroot_t *wcroot,
svn_error_t *
svn_wc__db_lock_remove(svn_wc__db_t *db,
const char *local_abspath,
+ svn_skel_t *work_items,
apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
@@ -11902,7 +12552,7 @@ svn_wc__db_lock_remove(svn_wc__db_t *db,
VERIFY_USABLE_WCROOT(wcroot);
SVN_WC__DB_WITH_TXN(
- lock_remove_txn(wcroot, local_relpath, scratch_pool),
+ lock_remove_txn(wcroot, local_relpath, work_items, scratch_pool),
wcroot);
/* There may be some entries, and the lock info is now out of date. */
@@ -11911,39 +12561,6 @@ svn_wc__db_lock_remove(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_wc__db_scan_base_repos(const char **repos_relpath,
- const char **repos_root_url,
- const char **repos_uuid,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
- apr_int64_t repos_id;
-
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- local_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
-
- SVN_ERR(svn_wc__db_base_get_info_internal(NULL, NULL, NULL,
- repos_relpath, &repos_id,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- wcroot, local_relpath,
- result_pool, scratch_pool));
- SVN_ERR(svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid, wcroot->sdb,
- repos_id, result_pool));
-
- return SVN_NO_ERROR;
-}
-
-
/* A helper for scan_addition().
* Compute moved-from information for the node at LOCAL_RELPATH which
* has been determined as having been moved-here.
@@ -12042,23 +12659,26 @@ get_moved_from_info(const char **moved_from_relpath,
return SVN_NO_ERROR;
}
-/* The body of scan_addition().
- */
+/* Like svn_wc__db_scan_addition(), but with WCROOT+LOCAL_RELPATH instead of
+ DB+LOCAL_ABSPATH.
+
+ The output value of *ORIGINAL_REPOS_ID will be INVALID_REPOS_ID if there
+ is no 'copy-from' repository. */
static svn_error_t *
-scan_addition_txn(svn_wc__db_status_t *status,
- const char **op_root_relpath_p,
- const char **repos_relpath,
- apr_int64_t *repos_id,
- const char **original_repos_relpath,
- apr_int64_t *original_repos_id,
- svn_revnum_t *original_revision,
- const char **moved_from_relpath,
- const char **moved_from_op_root_relpath,
- int *moved_from_op_depth,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+scan_addition(svn_wc__db_status_t *status,
+ const char **op_root_relpath_p,
+ const char **repos_relpath,
+ apr_int64_t *repos_id,
+ const char **original_repos_relpath,
+ apr_int64_t *original_repos_id,
+ svn_revnum_t *original_revision,
+ const char **moved_from_relpath,
+ const char **moved_from_op_root_relpath,
+ int *moved_from_op_depth,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *op_root_relpath;
const char *build_relpath = "";
@@ -12087,8 +12707,7 @@ scan_addition_txn(svn_wc__db_status_t *status,
svn_boolean_t have_row;
svn_wc__db_status_t presence;
int op_depth;
- const char *repos_prefix_path = "";
- int i;
+ const char *repos_prefix_path;
/* ### is it faster to fetch fewer columns? */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
@@ -12137,17 +12756,10 @@ scan_addition_txn(svn_wc__db_status_t *status,
/* Calculate the op root local path components */
- op_root_relpath = local_relpath;
-
- for (i = relpath_depth(local_relpath); i > op_depth; --i)
- {
- /* Calculate the path of the operation root */
- repos_prefix_path =
- svn_relpath_join(svn_relpath_basename(op_root_relpath, NULL),
- repos_prefix_path,
- scratch_pool);
- op_root_relpath = svn_relpath_dirname(op_root_relpath, scratch_pool);
- }
+ op_root_relpath = svn_relpath_prefix(local_relpath, op_depth,
+ scratch_pool);
+ repos_prefix_path = svn_relpath_skip_ancestor(op_root_relpath,
+ local_relpath);
if (op_root_relpath_p)
*op_root_relpath_p = apr_pstrdup(result_pool, op_root_relpath);
@@ -12239,39 +12851,37 @@ scan_addition_txn(svn_wc__db_status_t *status,
{
const char *base_relpath;
- while (TRUE)
- {
+ while (TRUE)
+ {
+ const char *tmp;
- SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__reset(stmt));
- /* Pointing at op_depth, look at the parent */
- repos_prefix_path =
- svn_relpath_join(svn_relpath_basename(op_root_relpath, NULL),
- repos_prefix_path,
- scratch_pool);
- op_root_relpath = svn_relpath_dirname(op_root_relpath, scratch_pool);
+ /* Pointing at op_depth, look at the parent */
+ repos_prefix_path =
+ svn_relpath_join(svn_relpath_basename(op_root_relpath, NULL),
+ repos_prefix_path,
+ scratch_pool);
+ op_root_relpath = svn_relpath_dirname(op_root_relpath, scratch_pool);
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, op_root_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, op_root_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (! have_row)
- break;
+ if (! have_row)
+ break;
- op_depth = svn_sqlite__column_int(stmt, 0);
+ op_depth = svn_sqlite__column_int(stmt, 0);
- /* Skip to op_depth */
- for (i = relpath_depth(op_root_relpath); i > op_depth; i--)
- {
- /* Calculate the path of the operation root */
- repos_prefix_path =
- svn_relpath_join(svn_relpath_basename(op_root_relpath, NULL),
- repos_prefix_path,
- scratch_pool);
- op_root_relpath =
- svn_relpath_dirname(op_root_relpath, scratch_pool);
+ /* Skip to op_depth */
+ tmp = op_root_relpath;
+
+ op_root_relpath = svn_relpath_prefix(op_root_relpath, op_depth,
+ scratch_pool);
+ repos_prefix_path = svn_relpath_join(
+ svn_relpath_skip_ancestor(op_root_relpath, tmp),
+ repos_prefix_path, scratch_pool);
}
- }
SVN_ERR(svn_sqlite__reset(stmt));
@@ -12331,39 +12941,27 @@ scan_addition_txn(svn_wc__db_status_t *status,
return SVN_NO_ERROR;
}
-
-/* Like svn_wc__db_scan_addition(), but with WCROOT+LOCAL_RELPATH instead of
- DB+LOCAL_ABSPATH.
-
- The output value of *ORIGINAL_REPOS_ID will be INVALID_REPOS_ID if there
- is no 'copy-from' repository. */
-static svn_error_t *
-scan_addition(svn_wc__db_status_t *status,
- const char **op_root_relpath,
+svn_error_t *
+svn_wc__db_scan_addition_internal(
+ svn_wc__db_status_t *status,
+ const char **op_root_relpath_p,
const char **repos_relpath,
apr_int64_t *repos_id,
const char **original_repos_relpath,
apr_int64_t *original_repos_id,
svn_revnum_t *original_revision,
- const char **moved_from_relpath,
- const char **moved_from_op_root_relpath,
- int *moved_from_op_depth,
svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- SVN_WC__DB_WITH_TXN(
- scan_addition_txn(status, op_root_relpath, repos_relpath, repos_id,
- original_repos_relpath, original_repos_id,
- original_revision, moved_from_relpath,
- moved_from_op_root_relpath, moved_from_op_depth,
- wcroot, local_relpath, result_pool, scratch_pool),
- wcroot);
- return SVN_NO_ERROR;
+ return svn_error_trace(
+ scan_addition(status, op_root_relpath_p, repos_relpath, repos_id,
+ original_repos_relpath, original_repos_id,
+ original_revision, NULL, NULL, NULL,
+ wcroot, local_relpath, result_pool, scratch_pool));
}
-
svn_error_t *
svn_wc__db_scan_addition(svn_wc__db_status_t *status,
const char **op_root_abspath,
@@ -12395,7 +12993,8 @@ svn_wc__db_scan_addition(svn_wc__db_status_t *status,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(scan_addition(status,
+ SVN_WC__DB_WITH_TXN4(
+ scan_addition(status,
op_root_abspath
? &op_root_relpath
: NULL,
@@ -12403,7 +13002,14 @@ svn_wc__db_scan_addition(svn_wc__db_status_t *status,
original_repos_relpath, original_repos_id_p,
original_revision,
NULL, NULL, NULL,
- wcroot, local_relpath, result_pool, scratch_pool));
+ wcroot, local_relpath, result_pool, scratch_pool),
+ svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid, wcroot,
+ repos_id, result_pool),
+ svn_wc__db_fetch_repos_info(original_root_url, original_uuid,
+ wcroot, original_repos_id,
+ result_pool),
+ SVN_NO_ERROR,
+ wcroot);
if (op_root_abspath)
*op_root_abspath = svn_dirent_join(wcroot->abspath, op_root_relpath,
@@ -12411,12 +13017,6 @@ svn_wc__db_scan_addition(svn_wc__db_status_t *status,
/* REPOS_ID must be valid if requested; ORIGINAL_REPOS_ID need not be. */
SVN_ERR_ASSERT(repos_id_p == NULL || repos_id != INVALID_REPOS_ID);
- SVN_ERR(svn_wc__db_fetch_repos_info(repos_root_url, repos_uuid, wcroot->sdb,
- repos_id, result_pool));
- SVN_ERR(svn_wc__db_fetch_repos_info(original_root_url, original_uuid,
- wcroot->sdb, original_repos_id,
- result_pool));
-
return SVN_NO_ERROR;
}
@@ -12444,7 +13044,8 @@ svn_wc__db_scan_moved(const char **moved_from_abspath,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(scan_addition(&status,
+ SVN_WC__DB_WITH_TXN(
+ scan_addition(&status,
op_root_abspath
? &op_root_relpath
: NULL,
@@ -12460,7 +13061,8 @@ svn_wc__db_scan_moved(const char **moved_from_abspath,
moved_from_delete_abspath
? &moved_from_op_depth
: NULL,
- wcroot, local_relpath, scratch_pool, scratch_pool));
+ wcroot, local_relpath, scratch_pool, scratch_pool),
+ wcroot);
if (status != svn_wc__db_status_moved_here || !moved_from_relpath)
return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
@@ -12484,12 +13086,8 @@ svn_wc__db_scan_moved(const char **moved_from_abspath,
/* The deleted node is either where we moved from, or one of its ancestors */
if (moved_from_delete_abspath)
{
- const char *tmp = moved_from_op_root_relpath;
-
- SVN_ERR_ASSERT(moved_from_op_depth >= 0);
-
- while (relpath_depth(tmp) > moved_from_op_depth)
- tmp = svn_relpath_dirname(tmp, scratch_pool);
+ const char *tmp = svn_relpath_prefix(moved_from_op_root_relpath,
+ moved_from_op_depth, scratch_pool);
*moved_from_delete_abspath = svn_dirent_join(wcroot->abspath, tmp,
scratch_pool);
@@ -12498,26 +13096,25 @@ svn_wc__db_scan_moved(const char **moved_from_abspath,
return SVN_NO_ERROR;
}
-/* ###
+/* ### Recursive helper for svn_wc__db_follow_moved_to()
*/
static svn_error_t *
-follow_moved_to(apr_array_header_t **moved_tos,
- int op_depth,
- const char *repos_path,
- svn_revnum_t revision,
- svn_wc__db_wcroot_t *wcroot,
+follow_moved_to(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
+ int op_depth,
+ apr_array_header_t **moved_tos,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- int working_op_depth;
- const char *ancestor_relpath, *node_moved_to = NULL;
+ int shadowing_op_depth;
+ const char *ancestor_relpath;
+ const char *node_moved_to = NULL;
int i;
- SVN_ERR_ASSERT((!op_depth && !repos_path) || (op_depth && repos_path));
-
+ /* Obtain the depth of the node directly shadowing local_relpath
+ as it exists at OP_DEPTH, and perhaps moved to info */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_OP_DEPTH_MOVED_TO));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
@@ -12525,57 +13122,35 @@ follow_moved_to(apr_array_header_t **moved_tos,
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (have_row)
{
- working_op_depth = svn_sqlite__column_int(stmt, 0);
+ shadowing_op_depth = svn_sqlite__column_int(stmt, 0);
node_moved_to = svn_sqlite__column_text(stmt, 1, result_pool);
- if (!repos_path)
+
+ if (node_moved_to)
{
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (!have_row || svn_sqlite__column_revnum(stmt, 0))
- return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND,
- svn_sqlite__reset(stmt),
- _("The base node '%s' was not found."),
- path_for_error_message(wcroot,
- local_relpath,
- scratch_pool));
- repos_path = svn_sqlite__column_text(stmt, 2, scratch_pool);
- revision = svn_sqlite__column_revnum(stmt, 3);
+ struct svn_wc__db_moved_to_t *moved_to;
+
+ moved_to = apr_palloc(result_pool, sizeof(*moved_to));
+ moved_to->op_depth = shadowing_op_depth;
+ moved_to->local_relpath = node_moved_to;
+ APR_ARRAY_PUSH(*moved_tos, struct svn_wc__db_moved_to_t *) = moved_to;
}
}
+
SVN_ERR(svn_sqlite__reset(stmt));
- if (node_moved_to)
+ if (!have_row)
{
- svn_boolean_t have_row2;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_MOVED_HERE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, node_moved_to,
- relpath_depth(node_moved_to)));
- SVN_ERR(svn_sqlite__step(&have_row2, stmt));
- if (!have_row2 || !svn_sqlite__column_int(stmt, 0)
- || revision != svn_sqlite__column_revnum(stmt, 3)
- || strcmp(repos_path, svn_sqlite__column_text(stmt, 2, NULL)))
- node_moved_to = NULL;
- SVN_ERR(svn_sqlite__reset(stmt));
+ /* Node is not shadowed, so not moved */
+ return SVN_NO_ERROR;
}
-
- if (node_moved_to)
+ else if (node_moved_to)
{
- struct svn_wc__db_moved_to_t *moved_to;
-
- moved_to = apr_palloc(result_pool, sizeof(*moved_to));
- moved_to->op_depth = working_op_depth;
- moved_to->local_relpath = node_moved_to;
- APR_ARRAY_PUSH(*moved_tos, struct svn_wc__db_moved_to_t *) = moved_to;
+ /* Moved directly, so we have the final location */
+ return SVN_NO_ERROR;
}
-
- /* A working row with moved_to, or no working row, and we are done. */
- if (node_moved_to || !have_row)
- return SVN_NO_ERROR;
-
/* Need to handle being moved via an ancestor. */
ancestor_relpath = local_relpath;
- for (i = relpath_depth(local_relpath); i > working_op_depth; --i)
+ for (i = relpath_depth(local_relpath); i > shadowing_op_depth; --i)
{
const char *ancestor_moved_to;
@@ -12584,56 +13159,30 @@ follow_moved_to(apr_array_header_t **moved_tos,
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_MOVED_TO));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, ancestor_relpath,
- working_op_depth));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- SVN_ERR_ASSERT(have_row);
+ shadowing_op_depth));
+ SVN_ERR(svn_sqlite__step_row(stmt));
+
ancestor_moved_to = svn_sqlite__column_text(stmt, 0, scratch_pool);
SVN_ERR(svn_sqlite__reset(stmt));
if (ancestor_moved_to)
{
- node_moved_to
- = svn_relpath_join(ancestor_moved_to,
- svn_relpath_skip_ancestor(ancestor_relpath,
- local_relpath),
- result_pool);
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_MOVED_HERE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, node_moved_to,
- relpath_depth(ancestor_moved_to)));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (!have_row)
- ancestor_moved_to = NULL;
- else if (!svn_sqlite__column_int(stmt, 0))
- {
- svn_wc__db_status_t presence
- = svn_sqlite__column_token(stmt, 1, presence_map);
- if (presence != svn_wc__db_status_not_present)
- ancestor_moved_to = NULL;
- else
- {
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (!have_row && !svn_sqlite__column_int(stmt, 0))
- ancestor_moved_to = NULL;
- }
- }
- SVN_ERR(svn_sqlite__reset(stmt));
- if (!ancestor_moved_to)
- break;
- /* verify repos_path points back? */
- }
- if (ancestor_moved_to)
- {
struct svn_wc__db_moved_to_t *moved_to;
+ node_moved_to
+ = svn_relpath_join(ancestor_moved_to,
+ svn_relpath_skip_ancestor(ancestor_relpath,
+ local_relpath),
+ result_pool);
+
moved_to = apr_palloc(result_pool, sizeof(*moved_to));
- moved_to->op_depth = working_op_depth;
+ moved_to->op_depth = shadowing_op_depth;
moved_to->local_relpath = node_moved_to;
APR_ARRAY_PUSH(*moved_tos, struct svn_wc__db_moved_to_t *) = moved_to;
- SVN_ERR(follow_moved_to(moved_tos, relpath_depth(ancestor_moved_to),
- repos_path, revision, wcroot, node_moved_to,
- result_pool, scratch_pool));
+ SVN_ERR(follow_moved_to(wcroot, node_moved_to,
+ relpath_depth(ancestor_moved_to),
+ moved_tos, result_pool, scratch_pool));
+
break;
}
}
@@ -12661,96 +13210,91 @@ svn_wc__db_follow_moved_to(apr_array_header_t **moved_tos,
sizeof(struct svn_wc__db_moved_to_t *));
/* ### Wrap in a transaction */
- SVN_ERR(follow_moved_to(moved_tos, 0, NULL, SVN_INVALID_REVNUM,
- wcroot, local_relpath,
- result_pool, scratch_pool));
+ SVN_WC__DB_WITH_TXN(follow_moved_to(wcroot, local_relpath, 0, moved_tos,
+ result_pool, scratch_pool),
+ wcroot);
/* ### Convert moved_to to abspath */
return SVN_NO_ERROR;
}
-/* Extract the moved-to information for LOCAL_RELPATH at OP-DEPTH by
- examining the lowest working node above OP_DEPTH. The output paths
- are NULL if there is no move, otherwise:
+svn_error_t *
+svn_wc__db_scan_moved_to_internal(const char **move_src_relpath,
+ const char **move_dst_relpath,
+ const char **delete_relpath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ int delete_op_depth;
+ const char *relpath = local_relpath;
+ const char *dst_relpath;
- *MOVE_DST_RELPATH: the moved-to destination of LOCAL_RELPATH.
+ SVN_ERR_ASSERT(local_relpath[0]); /* Not valid on the WC root */
- *MOVE_DST_OP_ROOT_RELPATH: the moved-to destination of the root of
- the move of LOCAL_RELPATH. This may be equal to *MOVE_DST_RELPATH
- if LOCAL_RELPATH is the root of the move.
+ if (move_src_relpath)
+ *move_src_relpath = NULL;
+ if (move_dst_relpath)
+ *move_dst_relpath = NULL;
+ if (delete_relpath)
+ *delete_relpath = NULL;
- *MOVE_SRC_ROOT_RELPATH: the root of the move source. For moves
- inside a delete this will be different from *MOVE_SRC_OP_ROOT_RELPATH.
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_OP_DEPTH_MOVED_TO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, relpath, op_depth));
- *MOVE_SRC_OP_ROOT_RELPATH: the root of the source layer that
- contains the move. For moves inside deletes this is the root of
- the delete, for other moves this is the root of the move.
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
- Given a path A/B/C with A/B moved to X then for A/B/C
+ if (!have_row)
+ {
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND,
+ svn_sqlite__reset(stmt),
+ _("Node '%s' is not shadowed"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+ }
- MOVE_DST_RELPATH is X/C
- MOVE_DST_OP_ROOT_RELPATH is X
- MOVE_SRC_ROOT_RELPATH is A/B
- MOVE_SRC_OP_ROOT_RELPATH is A/B
+ delete_op_depth = svn_sqlite__column_int(stmt, 0);
+ dst_relpath = svn_sqlite__column_text(stmt, 1, scratch_pool);
- If A is then deleted the MOVE_DST_RELPATH, MOVE_DST_OP_ROOT_RELPATH
- and MOVE_SRC_ROOT_RELPATH remain the same but MOVE_SRC_OP_ROOT_RELPATH
- changes to A.
+ SVN_ERR(svn_sqlite__reset(stmt));
- ### Think about combining with scan_deletion? Also with
- ### scan_addition to get moved-to for replaces? Do we need to
- ### return the op-root of the move source, i.e. A/B in the example
- ### above? */
-svn_error_t *
-svn_wc__db_op_depth_moved_to(const char **move_dst_relpath,
- const char **move_dst_op_root_relpath,
- const char **move_src_root_relpath,
- const char **move_src_op_root_relpath,
- int op_depth,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
- int delete_op_depth;
- const char *relpath = local_relpath;
+ while (!dst_relpath && have_row)
+ {
+ relpath = svn_relpath_dirname(relpath, scratch_pool);
- *move_dst_relpath = *move_dst_op_root_relpath = NULL;
- *move_src_root_relpath = *move_src_op_root_relpath = NULL;
+ if (relpath_depth(relpath) < delete_op_depth)
+ break;
- do
- {
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_LOWEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, relpath, op_depth));
+ STMT_SELECT_DEPTH_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, relpath,
+ delete_op_depth));
+
SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
if (have_row)
- {
- delete_op_depth = svn_sqlite__column_int(stmt, 0);
- *move_dst_op_root_relpath = svn_sqlite__column_text(stmt, 3,
- result_pool);
- if (*move_dst_op_root_relpath)
- *move_src_root_relpath = apr_pstrdup(result_pool, relpath);
- }
+ dst_relpath = svn_sqlite__column_text(stmt, 13, scratch_pool);
+
SVN_ERR(svn_sqlite__reset(stmt));
- if (!*move_dst_op_root_relpath)
- relpath = svn_relpath_dirname(relpath, scratch_pool);
}
- while (!*move_dst_op_root_relpath
- && have_row && delete_op_depth <= relpath_depth(relpath));
- if (*move_dst_op_root_relpath)
+ if (dst_relpath)
{
- *move_dst_relpath
- = svn_relpath_join(*move_dst_op_root_relpath,
- svn_relpath_skip_ancestor(relpath, local_relpath),
- result_pool);
- while (delete_op_depth < relpath_depth(relpath))
- relpath = svn_relpath_dirname(relpath, scratch_pool);
- *move_src_op_root_relpath = apr_pstrdup(result_pool, relpath);
+ if (move_src_relpath)
+ *move_src_relpath = apr_pstrdup(result_pool, relpath);
+
+ if (move_dst_relpath)
+ *move_dst_relpath = apr_pstrdup(result_pool, dst_relpath);
+
+ if (delete_relpath)
+ *delete_relpath = svn_relpath_prefix(local_relpath, delete_op_depth,
+ result_pool);
}
return SVN_NO_ERROR;
@@ -12763,7 +13307,7 @@ svn_error_t *
svn_wc__db_base_moved_to(const char **move_dst_abspath,
const char **move_dst_op_root_abspath,
const char **move_src_root_abspath,
- const char **move_src_op_root_abspath,
+ const char **delete_abspath,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -12771,47 +13315,54 @@ svn_wc__db_base_moved_to(const char **move_dst_abspath,
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
- const char *move_dst_relpath, *move_dst_op_root_relpath;
- const char *move_src_root_relpath, *move_src_op_root_relpath;
+ const char *dst_root_relpath;
+ const char *src_root_relpath, *delete_relpath;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_WC__DB_WITH_TXN(svn_wc__db_op_depth_moved_to(&move_dst_relpath,
- &move_dst_op_root_relpath,
- &move_src_root_relpath,
- &move_src_op_root_relpath,
- 0 /* BASE op-depth */,
- wcroot, local_relpath,
- scratch_pool, scratch_pool),
+ SVN_WC__DB_WITH_TXN(svn_wc__db_scan_moved_to_internal(&src_root_relpath,
+ &dst_root_relpath,
+ &delete_relpath,
+ wcroot, local_relpath,
+ 0 /* BASE */,
+ scratch_pool,
+ scratch_pool),
wcroot);
if (move_dst_abspath)
- *move_dst_abspath
- = move_dst_relpath
- ? svn_dirent_join(wcroot->abspath, move_dst_relpath, result_pool)
- : NULL;
+ *move_dst_abspath =
+ dst_root_relpath
+ ? svn_dirent_join(wcroot->abspath,
+ svn_dirent_join(
+ dst_root_relpath,
+ svn_relpath_skip_ancestor(src_root_relpath,
+ local_relpath),
+ scratch_pool),
+ result_pool)
+ : NULL;
if (move_dst_op_root_abspath)
- *move_dst_op_root_abspath
- = move_dst_op_root_relpath
- ? svn_dirent_join(wcroot->abspath, move_dst_op_root_relpath, result_pool)
- : NULL;
+ *move_dst_op_root_abspath =
+ dst_root_relpath
+ ? svn_dirent_join(wcroot->abspath, dst_root_relpath, result_pool)
+ : NULL;
if (move_src_root_abspath)
- *move_src_root_abspath
- = move_src_root_relpath
- ? svn_dirent_join(wcroot->abspath, move_src_root_relpath, result_pool)
- : NULL;
+ *move_src_root_abspath =
+ src_root_relpath
+ ? svn_dirent_join(wcroot->abspath, src_root_relpath, result_pool)
+ : NULL;
- if (move_src_op_root_abspath)
- *move_src_op_root_abspath
- = move_src_op_root_relpath
- ? svn_dirent_join(wcroot->abspath, move_src_op_root_relpath, result_pool)
- : NULL;
+ if (delete_abspath)
+ *delete_abspath =
+ delete_relpath
+ ? svn_dirent_join(wcroot->abspath, delete_relpath, result_pool)
+ : NULL;
return SVN_NO_ERROR;
}
@@ -12834,6 +13385,7 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_t **sdb,
SDB_FILE,
NULL, SVN_INVALID_REVNUM, svn_depth_unknown,
TRUE /* exclusive */,
+ 0 /* timeout */,
wc_db->state_pool, scratch_pool));
SVN_ERR(svn_wc__db_pdh_create_wcroot(&wcroot,
@@ -12841,7 +13393,6 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_t **sdb,
dir_abspath),
*sdb, *wc_id, FORMAT_FROM_SDB,
FALSE /* auto-upgrade */,
- FALSE /* enforce_empty_wq */,
wc_db->state_pool, scratch_pool));
/* The WCROOT is complete. Stash it into DB. */
@@ -12850,191 +13401,6 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_t **sdb,
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_wc__db_upgrade_apply_dav_cache(svn_sqlite__db_t *sdb,
- const char *dir_relpath,
- apr_hash_t *cache_values,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- apr_int64_t wc_id;
- apr_hash_index_t *hi;
- svn_sqlite__stmt_t *stmt;
-
- SVN_ERR(svn_wc__db_util_fetch_wc_id(&wc_id, sdb, iterpool));
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_UPDATE_BASE_NODE_DAV_CACHE));
-
- /* Iterate over all the wcprops, writing each one to the wc_db. */
- for (hi = apr_hash_first(scratch_pool, cache_values);
- hi;
- hi = apr_hash_next(hi))
- {
- const char *name = svn__apr_hash_index_key(hi);
- apr_hash_t *props = svn__apr_hash_index_val(hi);
- const char *local_relpath;
-
- svn_pool_clear(iterpool);
-
- local_relpath = svn_relpath_join(dir_relpath, name, iterpool);
-
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
- SVN_ERR(svn_sqlite__bind_properties(stmt, 3, props, iterpool));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_wc__db_upgrade_apply_props(svn_sqlite__db_t *sdb,
- const char *dir_abspath,
- const char *local_relpath,
- apr_hash_t *base_props,
- apr_hash_t *revert_props,
- apr_hash_t *working_props,
- int original_format,
- apr_int64_t wc_id,
- apr_pool_t *scratch_pool)
-{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
- int top_op_depth = -1;
- int below_op_depth = -1;
- svn_wc__db_status_t top_presence;
- svn_wc__db_status_t below_presence;
- int affected_rows;
-
- /* ### working_props: use set_props_txn.
- ### if working_props == NULL, then skip. what if they equal the
- ### pristine props? we should probably do the compare here.
- ###
- ### base props go into WORKING_NODE if avail, otherwise BASE.
- ###
- ### revert only goes into BASE. (and WORKING better be there!)
-
- Prior to 1.4.0 (ORIGINAL_FORMAT < 8), REVERT_PROPS did not exist. If a
- file was deleted, then a copy (potentially with props) was disallowed
- and could not replace the deletion. An addition *could* be performed,
- but that would never bring its own props.
-
- 1.4.0 through 1.4.5 created the concept of REVERT_PROPS, but had a
- bug in svn_wc_add_repos_file2() whereby a copy-with-props did NOT
- construct a REVERT_PROPS if the target had no props. Thus, reverting
- the delete/copy would see no REVERT_PROPS to restore, leaving the
- props from the copy source intact, and appearing as if they are (now)
- the base props for the previously-deleted file. (wc corruption)
-
- 1.4.6 ensured that an empty REVERT_PROPS would be established at all
- times. See issue 2530, and r861670 as starting points.
-
- We will use ORIGINAL_FORMAT and SVN_WC__NO_REVERT_FILES to determine
- the handling of our inputs, relative to the state of this node.
- */
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_NODE_INFO));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- {
- top_op_depth = svn_sqlite__column_int(stmt, 0);
- top_presence = svn_sqlite__column_token(stmt, 3, presence_map);
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- {
- below_op_depth = svn_sqlite__column_int(stmt, 0);
- below_presence = svn_sqlite__column_token(stmt, 3, presence_map);
- }
- }
- SVN_ERR(svn_sqlite__reset(stmt));
-
- /* Detect the buggy scenario described above. We cannot upgrade this
- working copy if we have no idea where BASE_PROPS should go. */
- if (original_format > SVN_WC__NO_REVERT_FILES
- && revert_props == NULL
- && top_op_depth != -1
- && top_presence == svn_wc__db_status_normal
- && below_op_depth != -1
- && below_presence != svn_wc__db_status_not_present)
- {
- /* There should be REVERT_PROPS, so it appears that we just ran into
- the described bug. Sigh. */
- return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
- _("The properties of '%s' are in an "
- "indeterminate state and cannot be "
- "upgraded. See issue #2530."),
- svn_dirent_local_style(
- svn_dirent_join(dir_abspath, local_relpath,
- scratch_pool), scratch_pool));
- }
-
- /* Need at least one row, or two rows if there are revert props */
- if (top_op_depth == -1
- || (below_op_depth == -1 && revert_props))
- return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
- _("Insufficient NODES rows for '%s'"),
- svn_dirent_local_style(
- svn_dirent_join(dir_abspath, local_relpath,
- scratch_pool), scratch_pool));
-
- /* one row, base props only: upper row gets base props
- two rows, base props only: lower row gets base props
- two rows, revert props only: lower row gets revert props
- two rows, base and revert props: upper row gets base, lower gets revert */
-
-
- if (revert_props || below_op_depth == -1)
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_UPDATE_NODE_PROPS));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd",
- wc_id, local_relpath, top_op_depth));
- SVN_ERR(svn_sqlite__bind_properties(stmt, 4, base_props, scratch_pool));
- SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
-
- SVN_ERR_ASSERT(affected_rows == 1);
- }
-
- if (below_op_depth != -1)
- {
- apr_hash_t *props = revert_props ? revert_props : base_props;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_UPDATE_NODE_PROPS));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd",
- wc_id, local_relpath, below_op_depth));
- SVN_ERR(svn_sqlite__bind_properties(stmt, 4, props, scratch_pool));
- SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
-
- SVN_ERR_ASSERT(affected_rows == 1);
- }
-
- /* If there are WORKING_PROPS, then they always go into ACTUAL_NODE. */
- if (working_props != NULL
- && base_props != NULL)
- {
- apr_array_header_t *diffs;
-
- SVN_ERR(svn_prop_diffs(&diffs, working_props, base_props, scratch_pool));
-
- if (diffs->nelts == 0)
- working_props = NULL; /* No differences */
- }
-
- if (working_props != NULL)
- {
- SVN_ERR(set_actual_props(wc_id, local_relpath, working_props,
- sdb, scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
svn_error_t *
svn_wc__db_upgrade_insert_external(svn_wc__db_t *db,
const char *local_abspath,
@@ -13110,28 +13476,15 @@ svn_wc__db_upgrade_insert_external(svn_wc__db_t *db,
}
svn_error_t *
-svn_wc__db_upgrade_get_repos_id(apr_int64_t *repos_id,
- svn_sqlite__db_t *sdb,
- const char *repos_root_url,
- apr_pool_t *scratch_pool)
+svn_wc__db_wq_add_internal(svn_wc__db_wcroot_t *wcroot,
+ const svn_skel_t *work_item,
+ apr_pool_t *scratch_pool)
{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_REPOSITORY));
- SVN_ERR(svn_sqlite__bindf(stmt, "s", repos_root_url));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
-
- if (!have_row)
- return svn_error_createf(SVN_ERR_WC_DB_ERROR, svn_sqlite__reset(stmt),
- _("Repository '%s' not found in the database"),
- repos_root_url);
-
- *repos_id = svn_sqlite__column_int64(stmt, 0);
- return svn_error_trace(svn_sqlite__reset(stmt));
+ /* Add the work item(s) to the WORK_QUEUE. */
+ return svn_error_trace(add_work_items(wcroot->sdb, work_item,
+ scratch_pool));
}
-
svn_error_t *
svn_wc__db_wq_add(svn_wc__db_t *db,
const char *wri_abspath,
@@ -13244,8 +13597,8 @@ wq_record(svn_wc__db_wcroot_t *wcroot,
for (hi = apr_hash_first(scratch_pool, record_map); hi;
hi = apr_hash_next(hi))
{
- const char *local_abspath = svn__apr_hash_index_key(hi);
- const svn_io_dirent2_t *dirent = svn__apr_hash_index_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
+ const svn_io_dirent2_t *dirent = apr_hash_this_val(hi);
const char *local_relpath = svn_dirent_skip_ancestor(wcroot->abspath,
local_abspath);
@@ -13458,7 +13811,7 @@ svn_wc__db_temp_get_all_access(svn_wc__db_t *db,
hi;
hi = apr_hash_next(hi))
{
- const svn_wc__db_wcroot_t *wcroot = svn__apr_hash_index_val(hi);
+ const svn_wc__db_wcroot_t *wcroot = apr_hash_this_val(hi);
/* This is highly redundant, 'cause the same WCROOT will appear many
times in dir_data. */
@@ -13645,6 +13998,8 @@ svn_wc__db_get_conflict_marker_files(apr_hash_t **marker_files,
svn_error_t *
svn_wc__db_read_conflict(svn_skel_t **conflict,
+ svn_node_kind_t *kind,
+ apr_hash_t **props,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -13658,14 +14013,16 @@ svn_wc__db_read_conflict(svn_skel_t **conflict,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return svn_error_trace(svn_wc__db_read_conflict_internal(conflict, wcroot,
- local_relpath,
+ return svn_error_trace(svn_wc__db_read_conflict_internal(conflict, kind, props,
+ wcroot, local_relpath,
result_pool,
scratch_pool));
}
svn_error_t *
svn_wc__db_read_conflict_internal(svn_skel_t **conflict,
+ svn_node_kind_t *kind,
+ apr_hash_t **props,
svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
apr_pool_t *result_pool,
@@ -13674,6 +14031,11 @@ svn_wc__db_read_conflict_internal(svn_skel_t **conflict,
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
+ if (kind)
+ *kind = svn_node_none;
+ if (props)
+ *props = NULL;
+
/* Check if we have a conflict in ACTUAL */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_ACTUAL_NODE));
@@ -13681,58 +14043,91 @@ svn_wc__db_read_conflict_internal(svn_skel_t **conflict,
SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (! have_row)
+ if (have_row)
{
- /* Do this while stmt is still open to avoid closing the sqlite
- transaction and then reopening. */
- svn_sqlite__stmt_t *stmt_node;
- svn_error_t *err;
+ apr_size_t cfl_len;
+ const void *cfl_data;
- err = svn_sqlite__get_statement(&stmt_node, wcroot->sdb,
- STMT_SELECT_NODE_INFO);
+ /* svn_skel__parse doesn't copy data, so store in result_pool */
+ cfl_data = svn_sqlite__column_blob(stmt, 2, &cfl_len, result_pool);
- if (err)
- stmt_node = NULL;
+ if (cfl_data)
+ *conflict = svn_skel__parse(cfl_data, cfl_len, result_pool);
else
- err = svn_sqlite__bindf(stmt_node, "is", wcroot->wc_id,
- local_relpath);
+ *conflict = NULL;
- if (!err)
- err = svn_sqlite__step(&have_row, stmt_node);
+ if (props)
+ {
+ svn_error_t *err;
- if (stmt_node)
- err = svn_error_compose_create(err,
- svn_sqlite__reset(stmt_node));
+ err = svn_error_trace(svn_sqlite__column_properties(props, stmt, 1,
+ result_pool,
+ scratch_pool));
- SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+ }
+ }
+ else
+ *conflict = NULL;
- if (have_row)
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (!have_row || kind || (props && !*props))
+ {
+ svn_error_t *err = NULL;
+ svn_boolean_t have_info = FALSE;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_NODE_INFO));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
+ local_relpath));
+
+ SVN_ERR(svn_sqlite__step(&have_info, stmt));
+
+ if (have_info)
{
- *conflict = NULL;
- return SVN_NO_ERROR;
+ if (kind)
+ {
+ svn_wc__db_status_t status;
+ int op_depth = svn_sqlite__column_int(stmt, 0);
+
+ status = svn_sqlite__column_token(stmt, 3, presence_map);
+
+ if (op_depth > 0)
+ err = convert_to_working_status(&status, status);
+
+ if (!err && (status == svn_wc__db_status_normal
+ || status == svn_wc__db_status_added
+ || status == svn_wc__db_status_deleted
+ || status == svn_wc__db_status_incomplete))
+ {
+ *kind = svn_sqlite__column_token(stmt, 4, kind_map);
+ }
+ }
+
+ /* Need props, and no props in ACTUAL? */
+ if (!err && (props && !*props))
+ {
+ err = svn_sqlite__column_properties(props, stmt, 14,
+ result_pool, scratch_pool);
+ }
}
- return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
- _("The node '%s' was not found."),
+ SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+
+ if (!have_row && !have_info)
+ {
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' was not found."),
path_for_error_message(wcroot,
local_relpath,
scratch_pool));
+ }
}
- {
- apr_size_t cfl_len;
- const void *cfl_data;
-
- /* svn_skel__parse doesn't copy data, so store in result_pool */
- cfl_data = svn_sqlite__column_blob(stmt, 2, &cfl_len, result_pool);
-
- if (cfl_data)
- *conflict = svn_skel__parse(cfl_data, cfl_len, result_pool);
- else
- *conflict = NULL;
-
- return svn_error_trace(svn_sqlite__reset(stmt));
- }
+ return SVN_NO_ERROR;
}
@@ -13749,6 +14144,7 @@ svn_wc__db_read_kind(svn_node_kind_t *kind,
const char *local_relpath;
svn_sqlite__stmt_t *stmt_info;
svn_boolean_t have_info;
+ svn_wc__db_status_t status;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -13780,12 +14176,27 @@ svn_wc__db_read_kind(svn_node_kind_t *kind,
}
}
+ status = svn_sqlite__column_token(stmt_info, 3, presence_map);
+
+ if (show_deleted && status == svn_wc__db_status_base_deleted)
+ {
+ /* Let's return the kind of what is really deleted insead of what
+ we have cached in the base-deleted record */
+
+ SVN_ERR(svn_sqlite__step(&have_info, stmt_info));
+
+ if (!have_info)
+ {
+ /* No lower layer deleted? Database inconsistency! */
+ *kind = svn_node_none;
+ return svn_error_trace(svn_sqlite__reset(stmt_info));
+ }
+ }
+
if (!(show_deleted && show_hidden))
{
int op_depth = svn_sqlite__column_int(stmt_info, 0);
svn_boolean_t report_none = FALSE;
- svn_wc__db_status_t status = svn_sqlite__column_token(stmt_info, 3,
- presence_map);
if (op_depth > 0)
SVN_ERR(convert_to_working_status(&status, status));
@@ -13821,38 +14232,6 @@ svn_wc__db_read_kind(svn_node_kind_t *kind,
return svn_error_trace(svn_sqlite__reset(stmt_info));
}
-
-svn_error_t *
-svn_wc__db_node_hidden(svn_boolean_t *hidden,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
- svn_wc__db_status_t status;
-
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- local_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
-
- SVN_ERR(read_info(&status, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
-
- *hidden = (status == svn_wc__db_status_server_excluded
- || status == svn_wc__db_status_not_present
- || status == svn_wc__db_status_excluded);
-
- return SVN_NO_ERROR;
-}
-
-
svn_error_t *
svn_wc__db_is_wcroot(svn_boolean_t *is_wcroot,
svn_wc__db_t *db,
@@ -14017,7 +14396,7 @@ svn_wc__db_temp_wcroot_tempdir(const char **temp_dir_abspath,
wcroot->abspath,
svn_wc_get_adm_dir(scratch_pool),
WCROOT_TEMPDIR_RELPATH,
- NULL);
+ SVN_VA_NULL);
return SVN_NO_ERROR;
}
@@ -14046,6 +14425,7 @@ wclock_obtain_cb(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
int levels_to_lock,
svn_boolean_t steal_lock,
+ svn_boolean_t enforce_empty_wq,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
@@ -14075,6 +14455,9 @@ wclock_obtain_cb(svn_wc__db_wcroot_t *wcroot,
scratch_pool));
}
+ if (enforce_empty_wq)
+ SVN_ERR(svn_wc__db_verify_no_work(wcroot->sdb));
+
/* Check if there are nodes locked below the new lock root */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, STMT_FIND_WC_LOCK));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
@@ -14101,8 +14484,9 @@ wclock_obtain_cb(svn_wc__db_wcroot_t *wcroot,
/* Check if we are the lock owner, because we should be able to
extend our lock. */
- err = wclock_owns_lock(&own_lock, wcroot, lock_relpath,
- TRUE, scratch_pool);
+ err = svn_wc__db_wclock_owns_lock_internal(&own_lock, wcroot,
+ lock_relpath,
+ TRUE, scratch_pool);
if (err)
SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt)));
@@ -14190,7 +14574,7 @@ wclock_obtain_cb(svn_wc__db_wcroot_t *wcroot,
err = svn_sqlite__insert(NULL, stmt);
if (err)
return svn_error_createf(SVN_ERR_WC_LOCKED, err,
- _("Working copy '%s' locked"),
+ _("Failed to lock working copy '%s'."),
path_for_error_message(wcroot,
local_relpath,
scratch_pool));
@@ -14249,7 +14633,7 @@ svn_wc__db_wclock_obtain(svn_wc__db_t *db,
SVN_WC__DB_WITH_TXN(
wclock_obtain_cb(wcroot, local_relpath, levels_to_lock, steal_lock,
- scratch_pool),
+ db->enforce_empty_wq, scratch_pool),
wcroot);
return SVN_NO_ERROR;
}
@@ -14440,12 +14824,12 @@ svn_wc__db_wclock_release(svn_wc__db_t *db,
/* Like svn_wc__db_wclock_owns_lock() but taking WCROOT+LOCAL_RELPATH instead
of DB+LOCAL_ABSPATH. */
-static svn_error_t *
-wclock_owns_lock(svn_boolean_t *own_lock,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_boolean_t exact,
- apr_pool_t *scratch_pool)
+svn_error_t *
+svn_wc__db_wclock_owns_lock_internal(svn_boolean_t *own_lock,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t exact,
+ apr_pool_t *scratch_pool)
{
apr_array_header_t *owned_locks;
int lock_level;
@@ -14512,8 +14896,8 @@ svn_wc__db_wclock_owns_lock(svn_boolean_t *own_lock,
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(wclock_owns_lock(own_lock, wcroot, local_relpath, exact,
- scratch_pool));
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(own_lock, wcroot, local_relpath,
+ exact, scratch_pool));
return SVN_NO_ERROR;
}
@@ -14629,6 +15013,87 @@ svn_wc__db_temp_op_start_directory_update(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
+/* Helper for svn_wc__db_op_make_copy_internal */
+static svn_error_t *
+db_move_moved_to(svn_wc__db_wcroot_t *wcroot,
+ const char *src1_relpath,
+ int src1_op_depth,
+ const char *src2_relpath,
+ int src2_op_depth,
+ const char *dst_relpath,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ int affected_rows;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_UPDATE_MOVED_TO_RELPATH));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ src1_relpath, src1_op_depth));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ if (affected_rows == 1)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_UPDATE_MOVED_TO_RELPATH));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isds", wcroot->wc_id,
+ src2_relpath, src2_op_depth,
+ dst_relpath));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+ }
+ if (affected_rows != 1)
+ return svn_error_create(SVN_ERR_WC_PATH_NOT_FOUND, NULL, NULL);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+db_move_moved_to_down_recursive(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int new_shadow_layer,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_MOVED_DESCENDANTS_SRC));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
+ new_shadow_layer));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ while (have_row)
+ {
+ int del_op_depth;
+ const char *src_relpath;
+ const char *dst_relpath;
+ svn_error_t *err;
+
+ svn_pool_clear(iterpool);
+
+ del_op_depth = svn_sqlite__column_int(stmt, 0);
+ src_relpath = svn_sqlite__column_text(stmt, 1, iterpool);
+ dst_relpath = svn_sqlite__column_text(stmt, 4, iterpool);
+
+ err = svn_error_trace(
+ db_move_moved_to(
+ wcroot,
+ src_relpath, del_op_depth,
+ src_relpath, new_shadow_layer,
+ dst_relpath, iterpool));
+
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ return SVN_NO_ERROR;
+}
+
/* The body of svn_wc__db_temp_op_make_copy(). This is
used by the update editor when deleting a base node tree would be a
@@ -14666,104 +15131,224 @@ svn_wc__db_temp_op_start_directory_update(svn_wc__db_t *db,
static svn_error_t *
make_copy_txn(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- int op_depth,
- const svn_skel_t *conflicts,
- const svn_skel_t *work_items,
+ apr_int64_t last_repos_id,
+ const char *last_repos_relpath,
+ svn_revnum_t last_revision,
+ int last_op_depth,
+ svn_boolean_t shadowed,
+ int root_shadow_depth,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
- svn_boolean_t add_working_base_deleted = FALSE;
- svn_boolean_t remove_working = FALSE;
- const apr_array_header_t *children;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- int i;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_LOWEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath, 0));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ svn_boolean_t have_row = FALSE;
+ svn_revnum_t revision;
+ apr_int64_t repos_id;
+ const char *repos_relpath;
+ svn_node_kind_t kind;
+ int op_depth = relpath_depth(local_relpath);
- if (have_row)
+ if (last_op_depth != op_depth)
{
- svn_wc__db_status_t working_status;
- int working_op_depth;
-
- working_status = svn_sqlite__column_token(stmt, 1, presence_map);
- working_op_depth = svn_sqlite__column_int(stmt, 0);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_DEPTH_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
+ op_depth));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
+ if (have_row)
+ shadowed = TRUE;
+ }
- SVN_ERR_ASSERT(working_status == svn_wc__db_status_normal
- || working_status == svn_wc__db_status_base_deleted
- || working_status == svn_wc__db_status_not_present
- || working_status == svn_wc__db_status_incomplete);
+ SVN_ERR(svn_wc__db_base_get_info_internal(NULL, &kind, &revision,
+ &repos_relpath, &repos_id, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ wcroot, local_relpath,
+ scratch_pool, scratch_pool));
- /* Only change nodes in the layers where we are creating the copy.
- Deletes in higher layers will just apply to the copy */
- if (working_op_depth <= op_depth)
- {
- add_working_base_deleted = TRUE;
+ if (last_repos_relpath
+ && repos_id == last_repos_id
+ && revision == last_revision)
+ {
+ const char *name = svn_relpath_skip_ancestor(last_repos_relpath,
+ repos_relpath);
- if (working_status == svn_wc__db_status_base_deleted)
- remove_working = TRUE;
- }
+ if (name && strcmp(name, svn_relpath_basename(local_relpath, NULL)) == 0)
+ op_depth = last_op_depth;
}
- else
- SVN_ERR(svn_sqlite__reset(stmt));
- if (remove_working)
+ /* Can we add a new copy node at the wanted op-depth? */
+ if (!have_row || op_depth == last_op_depth)
{
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_LOWEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
+ int i;
- if (add_working_base_deleted)
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_INSERT_DELETE_FROM_BASE));
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_INSERT_WORKING_NODE_FROM_BASE_COPY));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
op_depth));
SVN_ERR(svn_sqlite__step_done(stmt));
+
+ if (shadowed)
+ SVN_ERR(db_extend_parent_delete(wcroot, local_relpath, kind,
+ op_depth, scratch_pool));
+
+ if (kind == svn_node_dir)
+ {
+ const apr_array_header_t *children;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(gather_children(&children, wcroot, local_relpath,
+ STMT_SELECT_OP_DEPTH_CHILDREN, 0,
+ scratch_pool, iterpool));
+
+ for (i = 0; i < children->nelts; i++)
+ {
+ const char *name = APR_ARRAY_IDX(children, i, const char *);
+ const char *copy_relpath;
+
+ svn_pool_clear(iterpool);
+
+ copy_relpath = svn_relpath_join(local_relpath, name, iterpool);
+
+ SVN_ERR(make_copy_txn(wcroot, copy_relpath,
+ repos_id, repos_relpath, revision,
+ op_depth, shadowed, root_shadow_depth,
+ scratch_pool));
+ }
+ svn_pool_destroy(iterpool);
+ }
}
else
{
+ /* Auch... we can't make a copy of whatever comes deeper, as this
+ op-depth is already filled by something else. Let's hope
+ the user doesn't mind.
+
+ Luckily we know that the moves are already moved to the shadowing
+ layer, so we can just remove dangling base-deletes if there are
+ any.
+ */
+ /* BASE_DELETED may be at op_depth, so let's use last_op_depth! */
+ SVN_ERR(db_move_moved_to_down_recursive(wcroot, local_relpath,
+ root_shadow_depth,
+ scratch_pool));
+
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY));
+ STMT_DELETE_WORKING_BASE_DELETE));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
- op_depth));
+ last_op_depth));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
+ last_op_depth));
SVN_ERR(svn_sqlite__step_done(stmt));
}
- /* Get the BASE children, as WORKING children don't need modifications */
- SVN_ERR(gather_repo_children(&children, wcroot, local_relpath,
- 0, scratch_pool, iterpool));
+ /* Insert a not-present node to mark that we don't know what exists here.
- for (i = 0; i < children->nelts; i++)
+ We do this last (after recursing), to allow the move fix-up code to
+ see the original moves. */
+ if (last_op_depth > 0 && last_op_depth != op_depth)
{
- const char *name = APR_ARRAY_IDX(children, i, const char *);
- const char *copy_relpath;
+ insert_working_baton_t iwb;
- svn_pool_clear(iterpool);
+ blank_iwb(&iwb);
+ iwb.presence = svn_wc__db_status_not_present;
+ iwb.op_depth = last_op_depth;
- copy_relpath = svn_relpath_join(local_relpath, name, iterpool);
+ iwb.original_repos_id = repos_id;
+ iwb.original_repos_relpath = repos_relpath;
+ iwb.original_revnum = revision;
+ iwb.kind = kind;
- SVN_ERR(make_copy_txn(wcroot, copy_relpath, op_depth, NULL, NULL,
- iterpool));
+ SVN_ERR(insert_working_node(&iwb, wcroot, local_relpath, scratch_pool));
}
- SVN_ERR(flush_entries(wcroot, svn_dirent_join(wcroot->abspath, local_relpath,
- iterpool),
- svn_depth_empty, iterpool));
+ return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_wc__db_op_make_copy_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t move_move_info,
+ const svn_skel_t *conflicts,
+ const svn_skel_t *work_items,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ int op_depth = -1;
+
+ /* The update editor is supposed to call this function when there is
+ no working node for LOCAL_ABSPATH. */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_WORKING_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ op_depth = svn_sqlite__column_int(stmt, 0);
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (have_row)
+ {
+ if (op_depth == relpath_depth(local_relpath))
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("Modification of '%s' already exists"),
+ path_for_error_message(wcroot,
+ local_relpath,
+ scratch_pool));
+
+ /* We have a working layer, but not one at the op-depth of local-relpath,
+ so we can create a copy by just copying the lower layer */
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_COPY_OP_DEPTH_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdd", wcroot->wc_id, local_relpath,
+ op_depth, relpath_depth(local_relpath)));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+ else
+ {
+ int affected_rows;
+
+ op_depth = relpath_depth(local_relpath);
+ /* We don't allow copies to contain server-excluded nodes;
+ the update editor is going to have to bail out. */
+ SVN_ERR(catch_copy_of_server_excluded(wcroot, local_relpath,
+ scratch_pool));
+
+ /* Insert a shadowing layer */
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ STMT_INSERT_DELETE_FROM_NODE_RECURSIVE));
+
+ /* As we are keeping whatever is below, move the*/
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdd",
+ wcroot->wc_id, local_relpath,
+ 0, op_depth));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+ SVN_ERR_ASSERT(affected_rows > 0);
+
+ if (!move_move_info)
+ SVN_ERR(db_move_moved_to_down_recursive(wcroot, local_relpath,
+ op_depth, scratch_pool));
+
+
+ SVN_ERR(make_copy_txn(wcroot, local_relpath,
+ INVALID_REPOS_ID, NULL, SVN_INVALID_REVNUM,
+ op_depth, FALSE, op_depth,
+ scratch_pool));
+ }
if (conflicts)
SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, local_relpath,
- conflicts, iterpool));
+ conflicts, scratch_pool));
- SVN_ERR(add_work_items(wcroot->sdb, work_items, iterpool));
-
- svn_pool_destroy(iterpool);
+ SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
return SVN_NO_ERROR;
}
@@ -14778,8 +15363,6 @@ svn_wc__db_op_make_copy(svn_wc__db_t *db,
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -14787,30 +15370,15 @@ svn_wc__db_op_make_copy(svn_wc__db_t *db,
local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- /* The update editor is supposed to call this function when there is
- no working node for LOCAL_ABSPATH. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- SVN_ERR(svn_sqlite__reset(stmt));
- if (have_row)
- return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
- _("Modification of '%s' already exists"),
- path_for_error_message(wcroot,
- local_relpath,
- scratch_pool));
-
- /* We don't allow copies to contain server-excluded nodes;
- the update editor is going to have to bail out. */
- SVN_ERR(catch_copy_of_server_excluded(wcroot, local_relpath, scratch_pool));
-
SVN_WC__DB_WITH_TXN(
- make_copy_txn(wcroot, local_relpath,
- relpath_depth(local_relpath), conflicts, work_items,
- scratch_pool),
+ svn_wc__db_op_make_copy_internal(wcroot, local_relpath, FALSE,
+ conflicts, work_items,
+ scratch_pool),
wcroot);
+ SVN_ERR(flush_entries(wcroot, local_abspath,
+ svn_depth_infinity, scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -15017,7 +15585,7 @@ has_switched_subtrees(svn_boolean_t *is_switched,
does not match the given trailing URL then the whole working
copy is switched. */
- SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, NULL, wcroot->sdb,
+ SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, NULL, wcroot,
repos_id, scratch_pool));
url = svn_path_url_add_component2(repos_root_url, repos_relpath,
scratch_pool);
@@ -15108,17 +15676,14 @@ svn_wc__db_get_excluded_subtrees(apr_hash_t **excluded_subtrees,
return SVN_NO_ERROR;
}
-/* Like svn_wc__db_has_local_mods(),
+/* Like svn_wc__db_has_db_mods(),
* but accepts a WCROOT/LOCAL_RELPATH pair.
* ### This needs a DB as well as a WCROOT/RELPATH pair... */
static svn_error_t *
-has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_t *db,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
+has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
@@ -15130,9 +15695,6 @@ has_local_mods(svn_boolean_t *is_modified,
SVN_ERR(svn_sqlite__step(is_modified, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
if (! *is_modified)
{
/* Check for property modifications. */
@@ -15142,96 +15704,6 @@ has_local_mods(svn_boolean_t *is_modified,
/* If this query returns a row, the working copy is modified. */
SVN_ERR(svn_sqlite__step(is_modified, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
- }
-
- if (! *is_modified)
- {
- apr_pool_t *iterpool = NULL;
- svn_boolean_t have_row;
-
- /* Check for text modifications. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_BASE_FILES_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- iterpool = svn_pool_create(scratch_pool);
- while (have_row)
- {
- const char *node_abspath;
- svn_filesize_t recorded_size;
- apr_time_t recorded_time;
- svn_boolean_t skip_check = FALSE;
- svn_error_t *err;
-
- if (cancel_func)
- {
- err = cancel_func(cancel_baton);
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
- }
-
- svn_pool_clear(iterpool);
-
- node_abspath = svn_dirent_join(wcroot->abspath,
- svn_sqlite__column_text(stmt, 0,
- iterpool),
- iterpool);
-
- recorded_size = get_recorded_size(stmt, 1);
- recorded_time = svn_sqlite__column_int64(stmt, 2);
-
- if (recorded_size != SVN_INVALID_FILESIZE
- && recorded_time != 0)
- {
- const svn_io_dirent2_t *dirent;
-
- err = svn_io_stat_dirent2(&dirent, node_abspath, FALSE, TRUE,
- iterpool, iterpool);
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
-
- if (dirent->kind != svn_node_file)
- {
- *is_modified = TRUE; /* Missing or obstruction */
- break;
- }
- else if (dirent->filesize == recorded_size
- && dirent->mtime == recorded_time)
- {
- /* The file is not modified */
- skip_check = TRUE;
- }
- }
-
- if (! skip_check)
- {
- err = svn_wc__internal_file_modified_p(is_modified,
- db, node_abspath,
- FALSE, iterpool);
-
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
-
- if (*is_modified)
- break;
- }
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
- if (iterpool)
- svn_pool_destroy(iterpool);
-
- SVN_ERR(svn_sqlite__reset(stmt));
}
return SVN_NO_ERROR;
@@ -15239,12 +15711,10 @@ has_local_mods(svn_boolean_t *is_modified,
svn_error_t *
-svn_wc__db_has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
+svn_wc__db_has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
@@ -15256,9 +15726,8 @@ svn_wc__db_has_local_mods(svn_boolean_t *is_modified,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return svn_error_trace(has_local_mods(is_modified, wcroot, local_relpath,
- db, cancel_func, cancel_baton,
- scratch_pool));
+ return svn_error_trace(has_db_mods(is_modified, wcroot, local_relpath,
+ scratch_pool));
}
@@ -15275,8 +15744,6 @@ revision_status_txn(svn_revnum_t *min_revision,
svn_wc__db_t *db,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
@@ -15296,16 +15763,10 @@ revision_status_txn(svn_revnum_t *min_revision,
SVN_ERR(get_min_max_revisions(min_revision, max_revision, wcroot,
local_relpath, committed, scratch_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
/* Determine sparseness. */
SVN_ERR(is_sparse_checkout_internal(is_sparse_checkout, wcroot,
local_relpath, scratch_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
/* Check for switched nodes. */
{
err = has_switched_subtrees(is_switched, wcroot, local_relpath,
@@ -15321,12 +15782,8 @@ revision_status_txn(svn_revnum_t *min_revision,
}
}
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Check for local mods. */
- SVN_ERR(has_local_mods(is_modified, wcroot, local_relpath, db,
- cancel_func, cancel_baton, scratch_pool));
+ /* Check for db mods. */
+ SVN_ERR(has_db_mods(is_modified, wcroot, local_relpath, scratch_pool));
return SVN_NO_ERROR;
}
@@ -15342,8 +15799,6 @@ svn_wc__db_revision_status(svn_revnum_t *min_revision,
const char *local_abspath,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
@@ -15360,7 +15815,7 @@ svn_wc__db_revision_status(svn_revnum_t *min_revision,
revision_status_txn(min_revision, max_revision,
is_sparse_checkout, is_modified, is_switched,
wcroot, local_relpath, db,
- trail_url, committed, cancel_func, cancel_baton,
+ trail_url, committed,
scratch_pool),
wcroot);
return SVN_NO_ERROR;
@@ -15406,7 +15861,7 @@ svn_wc__db_base_get_lock_tokens_recursive(apr_hash_t **lock_tokens,
if (child_repos_id != last_repos_id)
{
svn_error_t *err = svn_wc__db_fetch_repos_info(&last_repos_root_url,
- NULL, wcroot->sdb,
+ NULL, wcroot,
child_repos_id,
scratch_pool);
@@ -15529,6 +15984,69 @@ svn_wc__db_verify(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
+
+svn_error_t *
+svn_wc__db_verify_db_full_internal(svn_wc__db_wcroot_t *wcroot,
+ svn_wc__db_verify_cb_t callback,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ svn_error_t *err = NULL;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, STMT_STATIC_VERIFY));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ while (have_row)
+ {
+ const char *local_relpath;
+ int op_depth = svn_sqlite__column_int(stmt, 1);
+ int id = svn_sqlite__column_int(stmt, 2);
+ const char *msg;
+
+ svn_pool_clear(iterpool);
+
+ local_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
+ msg = svn_sqlite__column_text(stmt, 3, scratch_pool);
+
+ err = callback(baton, wcroot->abspath, local_relpath, op_depth,
+ id, msg, iterpool);
+
+ if (err)
+ break;
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return svn_error_trace(
+ svn_error_compose_create(err, svn_sqlite__reset(stmt)));
+}
+
+svn_error_t *
+svn_wc__db_verify_db_full(svn_wc__db_t *db,
+ const char *wri_abspath,
+ svn_wc__db_verify_cb_t callback,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ wri_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ return svn_error_trace(
+ svn_wc__db_verify_db_full_internal(wcroot, callback, baton,
+ scratch_pool));
+}
+
svn_error_t *
svn_wc__db_bump_format(int *result_format,
svn_boolean_t *bumped_format,
@@ -15549,6 +16067,7 @@ svn_wc__db_bump_format(int *result_format,
err = svn_wc__db_util_open_db(&sdb, wcroot_abspath, SDB_FILE,
svn_sqlite__mode_readwrite,
TRUE, /* exclusive */
+ 0, /* default timeout */
NULL, /* my statements */
scratch_pool, scratch_pool);
if (err)
@@ -15608,3 +16127,504 @@ svn_wc__db_vacuum(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
+
+/* Item queued with svn_wc__db_commit_queue_add */
+typedef struct commit_queue_item_t
+{
+ const char *local_relpath;
+ svn_boolean_t recurse; /* Use legacy recursion */
+ svn_boolean_t committed; /* Process the node as committed */
+ svn_boolean_t remove_lock; /* Remove existing lock on node */
+ svn_boolean_t remove_changelist; /* Remove changelist on node */
+
+ /* The pristine text checksum. NULL if the old value should be kept
+ and for directories */
+ const svn_checksum_t *new_sha1_checksum;
+
+ apr_hash_t *new_dav_cache; /* New DAV cache for the node */
+} commit_queue_item_t;
+
+/* The queue definition for vn_wc__db_create_commit_queue,
+ svn_wc__db_commit_queue_add and finally svn_wc__db_process_commit_queue */
+struct svn_wc__db_commit_queue_t
+{
+ svn_wc__db_wcroot_t *wcroot; /* Wcroot for ITEMS */
+ apr_array_header_t *items; /* List of commit_queue_item_t* */
+ svn_boolean_t have_recurse; /* Is one or more item[x]->recurse TRUE? */
+};
+
+/* Create a new svn_wc__db_commit_queue_t instance in RESULT_POOL for the
+ working copy specified with WRI_ABSPATH */
+svn_error_t *
+svn_wc__db_create_commit_queue(svn_wc__db_commit_queue_t **queue,
+ svn_wc__db_t *db,
+ const char *wri_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+ svn_wc__db_commit_queue_t *q;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ wri_abspath, result_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ q = apr_pcalloc(result_pool, sizeof(*q));
+
+ SVN_ERR_ASSERT(wcroot->sdb);
+
+ q->wcroot = wcroot;
+ q->items = apr_array_make(result_pool, 64,
+ sizeof(commit_queue_item_t*));
+ q->have_recurse = FALSE;
+
+ *queue = q;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_commit_queue_add(svn_wc__db_commit_queue_t *queue,
+ const char *local_abspath,
+ svn_boolean_t recurse,
+ svn_boolean_t is_commited,
+ svn_boolean_t remove_lock,
+ svn_boolean_t remove_changelist,
+ const svn_checksum_t *new_sha1_checksum,
+ apr_hash_t *new_dav_cache,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ commit_queue_item_t *cqi;
+ const char *local_relpath;
+
+ local_relpath = svn_dirent_skip_ancestor(queue->wcroot->abspath,
+ local_abspath);
+
+ if (! local_relpath)
+ return svn_error_createf(
+ SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The path '%s' is not in the working copy '%s'"),
+ svn_dirent_local_style(local_abspath, scratch_pool),
+ svn_dirent_local_style(queue->wcroot->abspath, scratch_pool));
+
+ cqi = apr_pcalloc(result_pool, sizeof(*cqi));
+ cqi->local_relpath = local_relpath;
+ cqi->recurse = recurse;
+ cqi->committed = is_commited;
+ cqi->remove_lock = remove_lock;
+ cqi->remove_changelist = remove_changelist;
+ cqi->new_sha1_checksum = new_sha1_checksum;
+ cqi->new_dav_cache = new_dav_cache;
+
+ queue->have_recurse |= recurse;
+
+ APR_ARRAY_PUSH(queue->items, commit_queue_item_t *) = cqi;
+ return SVN_NO_ERROR;
+}
+
+/*** Finishing updates and commits. ***/
+
+/* Post process an item that is committed in the repository. Collapse layers into
+ * BASE. Queue work items that will finish a commit of the file or directory
+ * LOCAL_ABSPATH in DB:
+ */
+static svn_error_t *
+process_committed_leaf(svn_wc__db_t *db,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t via_recurse,
+ svn_wc__db_status_t status,
+ svn_node_kind_t kind,
+ svn_boolean_t prop_mods,
+ const svn_checksum_t *old_checksum,
+ svn_revnum_t new_revnum,
+ apr_time_t new_changed_date,
+ const char *new_changed_author,
+ apr_hash_t *new_dav_cache,
+ svn_boolean_t remove_lock,
+ svn_boolean_t remove_changelist,
+ const svn_checksum_t *checksum,
+ apr_pool_t *scratch_pool)
+{
+ svn_revnum_t new_changed_rev = new_revnum;
+ svn_skel_t *work_item = NULL;
+
+ {
+ const char *lock_relpath;
+ svn_boolean_t locked;
+
+ if (kind == svn_node_dir)
+ lock_relpath = local_relpath;
+ else
+ lock_relpath = svn_relpath_dirname(local_relpath, scratch_pool);
+
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(&locked, wcroot,
+ lock_relpath, FALSE,
+ scratch_pool));
+
+ if (!locked)
+ return svn_error_createf(SVN_ERR_WC_NOT_LOCKED, NULL,
+ _("No write-lock in '%s'"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+
+ SVN_ERR(flush_entries(wcroot, lock_relpath, svn_depth_empty,
+ scratch_pool));
+ }
+
+ if (status == svn_wc__db_status_not_present)
+ {
+ /* We are committing the leaf of a copy operation.
+ We leave the not-present marker to allow pulling in excluded
+ children of a copy.
+
+ The next update will remove the not-present marker. */
+
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR_ASSERT(status == svn_wc__db_status_normal
+ || status == svn_wc__db_status_incomplete
+ || status == svn_wc__db_status_added
+ || status == svn_wc__db_status_deleted);
+
+ if (kind != svn_node_dir
+ && status != svn_wc__db_status_deleted)
+ {
+ /* If we sent a delta (meaning: post-copy modification),
+ then this file will appear in the queue and so we should have
+ its checksum already. */
+ if (checksum == NULL)
+ {
+ /* It was copied and not modified. We must have a text
+ base for it. And the node should have a checksum. */
+ SVN_ERR_ASSERT(old_checksum != NULL);
+
+ checksum = old_checksum;
+
+ /* Is the node completely unmodified and are we recursing? */
+ if (via_recurse && !prop_mods)
+ {
+ /* If a copied node itself is not modified, but the op_root of
+ the copy is committed we have to make sure that changed_rev,
+ changed_date and changed_author don't change or the working
+ copy used for committing will show different last modified
+ information then a clean checkout of exactly the same
+ revisions. (Issue #3676) */
+
+ SVN_ERR(svn_wc__db_read_info_internal(
+ NULL, NULL, NULL, NULL, NULL,
+ &new_changed_rev,
+ &new_changed_date,
+ &new_changed_author, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL,
+ wcroot, local_relpath,
+ scratch_pool, scratch_pool));
+ }
+ }
+
+ SVN_ERR(svn_wc__wq_build_file_commit(&work_item,
+ db, svn_dirent_join(wcroot->abspath,
+ local_relpath,
+ scratch_pool),
+ prop_mods,
+ scratch_pool, scratch_pool));
+ }
+
+ /* The new text base will be found in the pristine store by its checksum. */
+ SVN_ERR(commit_node(wcroot, local_relpath,
+ new_revnum, new_changed_rev,
+ new_changed_date, new_changed_author,
+ checksum,
+ new_dav_cache,
+ !remove_changelist,
+ !remove_lock,
+ work_item,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/** Internal helper for svn_wc_process_committed_queue2().
+ * Bump a commit item, collapsing local changes with the new repository
+ * information to a new BASE node.
+ *
+ * @a new_date is the (server-side) date of the new revision, or 0.
+ *
+ * @a rev_author is the (server-side) author of the new
+ * revision; it may be @c NULL.
+ *
+ * @a new_dav_cache is a hash of all the new dav properties for LOCAL_RELPATH.
+ *
+ * If @a remove_lock is set, release any user locks on @a
+ * local_abspath; otherwise keep them during processing.
+ *
+ * If @a remove_changelist is set, clear any changeset assignments
+ * from @a local_abspath; otherwise, keep such assignments.
+ *
+ * If @a new_sha1_checksum is non-NULL, use it to identify the node's pristine
+ * text.
+ *
+ * Set TOP_OF_RECURSE to TRUE to show that this the top of a possibly
+ * recursive commit operation. (Part of the legacy recurse handling)
+ */
+static svn_error_t *
+process_committed_internal(svn_wc__db_t *db,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t recurse,
+ svn_boolean_t top_of_recurse,
+ svn_revnum_t new_revnum,
+ apr_time_t new_date,
+ const char *rev_author,
+ apr_hash_t *new_dav_cache,
+ svn_boolean_t remove_lock,
+ svn_boolean_t remove_changelist,
+ const svn_checksum_t *new_sha1_checksum,
+ apr_hash_t *items_by_relpath,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_status_t status;
+ svn_node_kind_t kind;
+ const svn_checksum_t *old_checksum;
+ svn_boolean_t prop_mods;
+
+ SVN_ERR(svn_wc__db_read_info_internal(&status, &kind, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, &old_checksum, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, &prop_mods, NULL, NULL, NULL,
+ wcroot, local_relpath,
+ scratch_pool, scratch_pool));
+
+ /* NOTE: be wary of making crazy semantic changes in this function, since
+ svn_wc_process_committed4() calls this. */
+
+ SVN_ERR(process_committed_leaf(db, wcroot, local_relpath, !top_of_recurse,
+ status, kind, prop_mods, old_checksum,
+ new_revnum, new_date, rev_author,
+ new_dav_cache,
+ remove_lock, remove_changelist,
+ new_sha1_checksum,
+ scratch_pool));
+
+ /* Only check for recursion on nodes that have children */
+ if (kind != svn_node_dir
+ || status == svn_wc__db_status_not_present
+ || status == svn_wc__db_status_excluded
+ || status == svn_wc__db_status_server_excluded
+ /* Node deleted -> then no longer a directory */
+ || status == svn_wc__db_status_deleted)
+ {
+ return SVN_NO_ERROR;
+ }
+
+ if (recurse)
+ {
+ const apr_array_header_t *children;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ int i;
+
+ /* Read PATH's entries; this is the absolute path. */
+ SVN_ERR(gather_children(&children, wcroot, local_relpath,
+ STMT_SELECT_NODE_CHILDREN, -1,
+ scratch_pool, iterpool));
+
+ /* Recursively loop over all children. */
+ for (i = 0; i < children->nelts; i++)
+ {
+ const char *name = APR_ARRAY_IDX(children, i, const char *);
+ const char *this_relpath;
+ const commit_queue_item_t *cqi;
+
+ svn_pool_clear(iterpool);
+
+ this_relpath = svn_dirent_join(local_relpath, name, iterpool);
+
+ new_sha1_checksum = NULL;
+ cqi = svn_hash_gets(items_by_relpath, this_relpath);
+
+ if (cqi != NULL)
+ new_sha1_checksum = cqi->new_sha1_checksum;
+
+ /* Recurse. Pass NULL for NEW_DAV_CACHE, because the
+ ones present in the current call are only applicable to
+ this one committed item. */
+ SVN_ERR(process_committed_internal(
+ db, wcroot, this_relpath,
+ TRUE /* recurse */,
+ FALSE /* top_of_recurse */,
+ new_revnum, new_date,
+ rev_author,
+ NULL /* new_dav_cache */,
+ FALSE /* remove_lock */,
+ remove_changelist,
+ new_sha1_checksum,
+ items_by_relpath,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Return TRUE if any item of QUEUE is a parent of ITEM and will be
+ processed recursively, return FALSE otherwise.
+
+ The algorithmic complexity of this search implementation is O(queue
+ length), but it's quite quick.
+*/
+static svn_boolean_t
+have_recursive_parent(const apr_array_header_t *all_items,
+ const commit_queue_item_t *item,
+ apr_pool_t *scratch_pool)
+{
+ const char *local_relpath = item->local_relpath;
+ int i;
+
+ for (i = 0; i < all_items->nelts; i++)
+ {
+ const commit_queue_item_t *qi
+ = APR_ARRAY_IDX(all_items, i, const commit_queue_item_t *);
+
+ if (qi == item)
+ continue;
+
+ if (qi->recurse && svn_relpath_skip_ancestor(qi->local_relpath,
+ local_relpath))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/* Compare function for svn_sort__array */
+static int
+compare_queue_items(const void *v1,
+ const void *v2)
+{
+ const commit_queue_item_t *cqi1
+ = *(const commit_queue_item_t **)v1;
+ const commit_queue_item_t *cqi2
+ = *(const commit_queue_item_t **)v2;
+
+ return svn_path_compare_paths(cqi1->local_relpath, cqi2->local_relpath);
+}
+
+/* Internal, locked version of svn_wc__db_process_commit_queue */
+static svn_error_t *
+db_process_commit_queue(svn_wc__db_t *db,
+ svn_wc__db_commit_queue_t *queue,
+ svn_revnum_t new_revnum,
+ apr_time_t new_date,
+ const char *new_author,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_t *items_by_relpath = NULL;
+ int j;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ svn_sort__array(queue->items, compare_queue_items);
+
+ if (queue->have_recurse)
+ {
+ items_by_relpath = apr_hash_make(scratch_pool);
+
+ for (j = 0; j < queue->items->nelts; j++)
+ {
+ commit_queue_item_t *cqi
+ = APR_ARRAY_IDX(queue->items, j, commit_queue_item_t *);
+
+ svn_hash_sets(items_by_relpath, cqi->local_relpath, cqi);
+ }
+ }
+
+ for (j = 0; j < queue->items->nelts; j++)
+ {
+ commit_queue_item_t *cqi
+ = APR_ARRAY_IDX(queue->items, j, commit_queue_item_t *);
+
+ svn_pool_clear(iterpool);
+
+ /* Skip this item if it is a child of a recursive item, because it has
+ been (or will be) accounted for when that recursive item was (or
+ will be) processed. */
+ if (queue->have_recurse && have_recursive_parent(queue->items, cqi,
+ iterpool))
+ continue;
+
+ if (!cqi->committed)
+ {
+ if (cqi->remove_lock)
+ {
+ svn_skel_t *work_item;
+
+ SVN_ERR(svn_wc__wq_build_sync_file_flags(
+ &work_item,
+ db,
+ svn_dirent_join(
+ queue->wcroot->abspath,
+ cqi->local_relpath,
+ iterpool),
+ iterpool, iterpool));
+
+ lock_remove_txn(queue->wcroot, cqi->local_relpath, work_item,
+ iterpool);
+ }
+ if (cqi->remove_changelist)
+ SVN_ERR(svn_wc__db_op_set_changelist(db,
+ svn_dirent_join(
+ queue->wcroot->abspath,
+ cqi->local_relpath,
+ iterpool),
+ NULL, NULL,
+ svn_depth_empty,
+ NULL, NULL, /* notify */
+ NULL, NULL, /* cancel */
+ iterpool));
+ }
+ else
+ {
+ SVN_ERR(process_committed_internal(
+ db, queue->wcroot, cqi->local_relpath,
+ cqi->recurse,
+ TRUE /* top_of_recurse */,
+ new_revnum, new_date, new_author,
+ cqi->new_dav_cache,
+ cqi->remove_lock,
+ cqi->remove_changelist,
+ cqi->new_sha1_checksum,
+ items_by_relpath,
+ iterpool));
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_process_commit_queue(svn_wc__db_t *db,
+ svn_wc__db_commit_queue_t *queue,
+ svn_revnum_t new_revnum,
+ apr_time_t new_date,
+ const char *new_author,
+ apr_pool_t *scratch_pool)
+{
+ SVN_WC__DB_WITH_TXN(db_process_commit_queue(db, queue,
+ new_revnum, new_date,
+ new_author, scratch_pool),
+ queue->wcroot);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/libsvn_wc/wc_db.h b/subversion/libsvn_wc/wc_db.h
index 0fcce5e..a947be0 100644
--- a/subversion/libsvn_wc/wc_db.h
+++ b/subversion/libsvn_wc/wc_db.h
@@ -20,7 +20,7 @@
* ====================================================================
* @endcopyright
*
- * @file svn_wc_db.h
+ * @file wc_db.h
* @brief The Subversion Working Copy Library - Metadata/Base-Text Support
*
* Requires:
@@ -412,9 +412,6 @@ svn_wc__db_get_wcroot(const char **wcroot_abspath,
If DAV_CACHE is not NULL, sets LOCAL_ABSPATH's dav cache to the specified
data.
- If CONFLICT is not NULL, then it describes a conflict for this node. The
- node will be record as conflicted (in ACTUAL).
-
If UPDATE_ACTUAL_PROPS is TRUE, set the properties store NEW_ACTUAL_PROPS
as the new set of properties in ACTUAL. If NEW_ACTUAL_PROPS is NULL or
when the value of NEW_ACTUAL_PROPS matches NEW_PROPS, store NULL in
@@ -424,6 +421,9 @@ svn_wc__db_get_wcroot(const char **wcroot_abspath,
svn_prop_inherited_item_t * structures that is set as the base node's
inherited_properties.
+ If CONFLICT is not NULL, then it describes a conflict for this node. The
+ node will be record as conflicted (in ACTUAL).
+
Any work items that are necessary as part of this node construction may
be passed in WORK_ITEMS.
@@ -444,10 +444,10 @@ svn_wc__db_base_add_directory(svn_wc__db_t *db,
const apr_array_header_t *children,
svn_depth_t depth,
apr_hash_t *dav_cache,
- const svn_skel_t *conflict,
svn_boolean_t update_actual_props,
apr_hash_t *new_actual_props,
apr_array_header_t *new_iprops,
+ const svn_skel_t *conflict,
const svn_skel_t *work_items,
apr_pool_t *scratch_pool);
@@ -676,13 +676,15 @@ svn_wc__db_base_add_not_present_node(svn_wc__db_t *db,
const svn_skel_t *work_items,
apr_pool_t *scratch_pool);
+/* Remove a node and all its descendants from the BASE tree. This can
+ be done in two modes:
-/* Remove a node and all its descendants from the BASE tree. This handles
- the deletion of a tree from the update editor and some file external
- scenarios.
+ * Remove everything, scheduling wq operations to clean up
+ the working copy. (KEEP_WORKING = FALSE)
- The node to remove is indicated by LOCAL_ABSPATH from the local
- filesystem.
+ * Bump things to WORKING, so the BASE layer is free, but the working
+ copy unmodified, except that everything that was visible from
+ BASE is now a copy of what it used to be. (KEEP_WORKING = TRUE)
This operation *installs* workqueue operations to update the local
filesystem after the database operation.
@@ -693,21 +695,11 @@ svn_wc__db_base_add_not_present_node(svn_wc__db_t *db,
actual node will be removed if the actual node does not mark a
conflict.
- If KEEP_AS_WORKING is TRUE, then the base tree is copied to higher
- layers as a copy of itself before deleting the BASE nodes.
-
- If KEEP_AS_WORKING is FALSE, and QUEUE_DELETES is TRUE, also queue
- workqueue items to delete all in-wc representations that aren't
- shadowed by higher layers.
- (With KEEP_AS_WORKING TRUE, this is a no-op, as everything is
- automatically shadowed by the created copy)
-
- If REMOVE_LOCKS is TRUE, all locks of this node and any subnodes
- are also removed. This is to be done during commit of deleted nodes.
- If NOT_PRESENT_REVISION specifies a valid revision a not-present
- node is installed in BASE node with kind NOT_PRESENT_KIND after
- deleting.
+ If MARK_NOT_PRESENT or MARK_EXCLUDED is TRUE, install a marker
+ of the specified type at the root of the now removed tree, with
+ either the specified revision (or in case of SVN_INVALID_REVNUM)
+ the original revision.
If CONFLICT and/or WORK_ITEMS are passed they are installed as part
of the operation, after the work items inserted by the operation
@@ -716,10 +708,10 @@ svn_wc__db_base_add_not_present_node(svn_wc__db_t *db,
svn_error_t *
svn_wc__db_base_remove(svn_wc__db_t *db,
const char *local_abspath,
- svn_boolean_t keep_as_working,
- svn_boolean_t queue_deletes,
- svn_boolean_t remove_locks,
- svn_revnum_t not_present_revision,
+ svn_boolean_t keep_working,
+ svn_boolean_t mark_not_present,
+ svn_boolean_t mark_excluded,
+ svn_revnum_t marker_revision,
svn_skel_t *conflict,
svn_skel_t *work_items,
apr_pool_t *scratch_pool);
@@ -953,33 +945,46 @@ svn_wc__db_pristine_read(svn_stream_t **contents,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Baton for svn_wc__db_pristine_install */
+typedef struct svn_wc__db_install_data_t
+ svn_wc__db_install_data_t;
-/* Set *TEMP_DIR_ABSPATH to a directory in which the caller should create
- a uniquely named file for later installation as a pristine text file.
+/* Open a writable stream to a temporary text base, ready for installing
+ into the pristine store. Set *STREAM to the opened stream. The temporary
+ file will have an arbitrary unique name. Return as *INSTALL_DATA a baton
+ for eiter installing or removing the file
- The directory is guaranteed to be one that svn_wc__db_pristine_install()
- can use: specifically, one from which it can atomically move the file.
+ Arrange that, on stream closure, *MD5_CHECKSUM and *SHA1_CHECKSUM will be
+ set to the MD-5 and SHA-1 checksums respectively of that file.
+ MD5_CHECKSUM and/or SHA1_CHECKSUM may be NULL if not wanted.
- Allocate *TEMP_DIR_ABSPATH in RESULT_POOL. */
+ Allocate the new stream, path and checksums in RESULT_POOL.
+ */
svn_error_t *
-svn_wc__db_pristine_get_tempdir(const char **temp_dir_abspath,
- svn_wc__db_t *db,
- const char *wri_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
+svn_wc__db_pristine_prepare_install(svn_stream_t **stream,
+ svn_wc__db_install_data_t **install_data,
+ svn_checksum_t **sha1_checksum,
+ svn_checksum_t **md5_checksum,
+ svn_wc__db_t *db,
+ const char *wri_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-/* Install the file TEMPFILE_ABSPATH (which is sitting in a directory given by
- svn_wc__db_pristine_get_tempdir()) into the pristine data store, to be
- identified by the SHA-1 checksum of its contents, SHA1_CHECKSUM, and whose
- MD-5 checksum is MD5_CHECKSUM. */
+/* Install the file created via svn_wc__db_pristine_prepare_install() into
+ the pristine data store, to be identified by the SHA-1 checksum of its
+ contents, SHA1_CHECKSUM, and whose MD-5 checksum is MD5_CHECKSUM. */
svn_error_t *
-svn_wc__db_pristine_install(svn_wc__db_t *db,
- const char *tempfile_abspath,
+svn_wc__db_pristine_install(svn_wc__db_install_data_t *install_data,
const svn_checksum_t *sha1_checksum,
const svn_checksum_t *md5_checksum,
apr_pool_t *scratch_pool);
+/* Removes the temporary data created by svn_wc__db_pristine_prepare_install
+ when the pristine won't be installed. */
+svn_error_t *
+svn_wc__db_pristine_install_abort(svn_wc__db_install_data_t *install_data,
+ apr_pool_t *scratch_pool);
+
/* Set *MD5_CHECKSUM to the MD-5 checksum of a pristine text
identified by its SHA-1 checksum SHA1_CHECKSUM. Return an error
@@ -1248,6 +1253,53 @@ svn_wc__db_committable_externals_below(apr_array_header_t **externals,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Opaque struct for svn_wc__db_create_commit_queue, svn_wc__db_commit_queue_add,
+ svn_wc__db_process_commit_queue */
+typedef struct svn_wc__db_commit_queue_t svn_wc__db_commit_queue_t;
+
+/* Create a new svn_wc__db_commit_queue_t instance in RESULT_POOL for the
+ working copy specified with WRI_ABSPATH */
+svn_error_t *
+svn_wc__db_create_commit_queue(svn_wc__db_commit_queue_t **queue,
+ svn_wc__db_t *db,
+ const char *wri_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Adds the specified path to the commit queue with the related information.
+
+ See svn_wc_queue_committed4() for argument documentation.
+
+ Note that this function currently DOESN'T copy the passed values to
+ RESULT_POOL, but expects them to be valid until processing. Otherwise the
+ only users memory requirements would +- double.
+ */
+svn_error_t *
+svn_wc__db_commit_queue_add(svn_wc__db_commit_queue_t *queue,
+ const char *local_abspath,
+ svn_boolean_t recurse,
+ svn_boolean_t is_commited,
+ svn_boolean_t remove_lock,
+ svn_boolean_t remove_changelist,
+ const svn_checksum_t *new_sha1_checksum,
+ apr_hash_t *new_dav_cache,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Process the items in QUEUE in a single transaction. Commit workqueue items
+ for items that need post processing.
+
+ Implementation detail of svn_wc_process_committed_queue2().
+ */
+svn_error_t *
+svn_wc__db_process_commit_queue(svn_wc__db_t *db,
+ svn_wc__db_commit_queue_t *queue,
+ svn_revnum_t new_revnum,
+ apr_time_t new_date,
+ const char *new_author,
+ apr_pool_t *scratch_pool);
+
+
/* Gets a mapping from const char * local abspaths of externals to the const
char * local abspath of where they are defined for all externals defined
at or below LOCAL_ABSPATH.
@@ -1616,6 +1668,9 @@ svn_wc__db_op_mark_resolved(svn_wc__db_t *db,
*
* At present only depth=empty and depth=infinity are supported.
*
+ * If @a clear_changelists is FALSE then changelist information is kept,
+ * otherwise it is cleared.
+ *
* This function populates the revert list that can be queried to
* determine what was reverted.
*/
@@ -1623,6 +1678,7 @@ svn_error_t *
svn_wc__db_op_revert(svn_wc__db_t *db,
const char *local_abspath,
svn_depth_t depth,
+ svn_boolean_t clear_changelists,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -1658,7 +1714,7 @@ typedef struct svn_wc__db_revert_list_copied_child_info_t {
* Allocate *COPIED_CHILDREN and its elements in RESULT_POOL.
* The elements are of type svn_wc__db_revert_list_copied_child_info_t. */
svn_error_t *
-svn_wc__db_revert_list_read_copied_children(const apr_array_header_t **children,
+svn_wc__db_revert_list_read_copied_children(apr_array_header_t **children,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -1963,6 +2019,7 @@ struct svn_wc__db_info_t {
svn_boolean_t moved_here; /* Only on op-roots. */
svn_boolean_t file_external;
+ svn_boolean_t has_descendants; /* Is dir, or has tc descendants */
};
/* Return in *NODES a hash mapping name->struct svn_wc__db_info_t for
@@ -1972,27 +2029,36 @@ struct svn_wc__db_info_t {
The results include any path that was a child of a deleted directory that
existed at LOCAL_ABSPATH, even if that directory is now scheduled to be
replaced by the working node at LOCAL_ABSPATH.
+
+ If BASE_TREE_ONLY is set, only information about the BASE tree
+ is returned.
*/
svn_error_t *
svn_wc__db_read_children_info(apr_hash_t **nodes,
apr_hash_t **conflicts,
svn_wc__db_t *db,
const char *dir_abspath,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Like svn_wc__db_read_children_info, but only gets an info node for the root
- element. */
+ element.
+
+ If BASE_TREE_ONLY is set, only information about the BASE tree
+ is returned. */
svn_error_t *
svn_wc__db_read_single_info(const struct svn_wc__db_info_t **info,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t base_tree_only,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Structure returned by svn_wc__db_read_walker_info. Only has the
fields needed by svn_wc__internal_walk_children(). */
struct svn_wc__db_walker_info_t {
+ const char *name;
svn_wc__db_status_t status;
svn_node_kind_t kind;
};
@@ -2053,11 +2119,10 @@ svn_wc__db_read_node_install_info(const char **wcroot_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Return in *NODES a hash mapping name->struct svn_wc__db_walker_info_t for
- the children of DIR_ABSPATH. "name" is the child's name relative to
- DIR_ABSPATH, not an absolute path. */
+/* Return in *ITEMS an array of struct svn_wc__db_walker_info_t* for
+ the direct children of DIR_ABSPATH. */
svn_error_t *
-svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
+svn_wc__db_read_children_walker_info(const apr_array_header_t **items,
svn_wc__db_t *db,
const char *dir_abspath,
apr_pool_t *result_pool,
@@ -2065,15 +2130,26 @@ svn_wc__db_read_children_walker_info(apr_hash_t **nodes,
/**
- * Set *URL to the corresponding url for LOCAL_ABSPATH.
- * If the node is added, return the url it will have in the repository.
+ * Set *revision, *repos_relpath, *repos_root_url, *repos_uuid to
+ * the intended/commit location of LOCAL_ABSPATH. These arguments may be
+ * NULL if they are not needed.
+ *
+ * If the node is deleted, return the url it would have in the repository
+ * if it wouldn't be deleted. If the node is added return the url it will
+ * have in the repository, once committed.
+ *
+ * If the node is not added and has an existing repository location, set
+ * revision to its existing revision, otherwise to SVN_INVALID_REVNUM.
*/
svn_error_t *
-svn_wc__db_read_url(const char **url,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
+svn_wc__db_read_repos_info(svn_revnum_t *revision,
+ const char **repos_relpath,
+ const char **repos_root_url,
+ const char **repos_uuid,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Set *PROPS to the properties of the node LOCAL_ABSPATH in the ACTUAL
@@ -2114,16 +2190,16 @@ svn_wc__db_read_props_streamily(svn_wc__db_t *db,
apr_pool_t *scratch_pool);
-/* Set *PROPS to the properties of the node LOCAL_ABSPATH in the WORKING
- tree (looking through to the BASE tree as required).
-
- ### *PROPS will set set to NULL in the following situations:
- ### ... tbd. see props.c:svn_wc__get_pristine_props()
+/* Set *PROPS to the base properties of the node at LOCAL_ABSPATH.
*PROPS maps "const char *" names to "const svn_string_t *" values.
If the node has no properties, set *PROPS to an empty hash.
- If the node is not present, return an error.
+ If the base node is in a state that cannot have properties (such as
+ not-present or locally added without copy-from), return an error.
+
Allocate *PROPS and its keys and values in RESULT_POOL.
+
+ See also svn_wc_get_pristine_props().
*/
svn_error_t *
svn_wc__db_read_pristine_props(apr_hash_t **props,
@@ -2146,7 +2222,7 @@ svn_wc__db_read_pristine_props(apr_hash_t **props,
* paths relative to the repository root URL for cached inherited
* properties and absolute working copy paths otherwise.
*
- * If ACTUAL_PROPS is not NULL, then set *ACTUAL_PROPS to the actual
+ * If ACTUAL_PROPS is not NULL, then set *ACTUAL_PROPS to ALL the actual
* properties stored on LOCAL_ABSPATH.
*
* Allocate @a *iprops in @a result_pool. Use @a scratch_pool
@@ -2237,6 +2313,14 @@ svn_wc__db_read_children_of_working_node(const apr_array_header_t **children,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+svn_error_t *
+svn_wc__db_base_read_not_present_children(
+ const apr_array_header_t **children,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
/* Like svn_wc__db_read_children_of_working_node(), except also include any
path that was a child of a deleted directory that existed at
LOCAL_ABSPATH, even if that directory is now scheduled to be replaced by
@@ -2279,7 +2363,10 @@ svn_wc__db_get_conflict_marker_files(apr_hash_t **markers,
apr_pool_t *scratch_pool);
/* Read the conflict information recorded on LOCAL_ABSPATH in *CONFLICT,
- an editable conflict skel.
+ an editable conflict skel. If kind is not NULL, also read the node kind
+ in *KIND. (SHOW_HIDDEN: false, SHOW_DELETED: true). If props is not NULL
+ read the actual properties in this value if they exist. (Set to NULL in case
+ the node is deleted, etc.)
If the node exists, but does not have a conflict set *CONFLICT to NULL,
otherwise return a SVN_ERR_WC_PATH_NOT_FOUND error.
@@ -2288,6 +2375,8 @@ svn_wc__db_get_conflict_marker_files(apr_hash_t **markers,
SCRATCH_POOL */
svn_error_t *
svn_wc__db_read_conflict(svn_skel_t **conflict,
+ svn_node_kind_t *kind,
+ apr_hash_t **props,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -2323,16 +2412,6 @@ svn_wc__db_read_kind(svn_node_kind_t *kind,
svn_boolean_t show_hidden,
apr_pool_t *scratch_pool);
-
-/* An analog to svn_wc__entry_is_hidden(). Set *HIDDEN to TRUE if
- LOCAL_ABSPATH in DB "is not present, and I haven't scheduled something
- over the top of it." */
-svn_error_t *
-svn_wc__db_node_hidden(svn_boolean_t *hidden,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool);
-
/* Checks if a node replaces a node in a different layer. Also check if it
replaces a BASE (op_depth 0) node or just a node in a higher layer (a copy).
Finally check if this is the root of the replacement, or if the replacement
@@ -2444,11 +2523,6 @@ svn_wc__db_global_relocate(svn_wc__db_t *db,
CHANGED_AUTHOR is the (server-side) author of CHANGED_REVISION. It may be
NULL if the revprop is missing on the revision.
- One or both of NEW_CHECKSUM and NEW_CHILDREN should be NULL. For new:
- files: NEW_CHILDREN should be NULL
- dirs: NEW_CHECKSUM should be NULL
- symlinks: both should be NULL
-
WORK_ITEMS will be place into the work queue.
*/
svn_error_t *
@@ -2459,7 +2533,6 @@ svn_wc__db_global_commit(svn_wc__db_t *db,
apr_time_t changed_date,
const char *changed_author,
const svn_checksum_t *new_checksum,
- const apr_array_header_t *new_children,
apr_hash_t *new_dav_cache,
svn_boolean_t keep_changelist,
svn_boolean_t no_unlock,
@@ -2540,6 +2613,9 @@ svn_wc__db_global_update(svn_wc__db_t *db,
for pathnames contained in EXCLUDE_RELPATHS are not touched by this
function. These pathnames should be paths relative to the wcroot.
+ If EMPTY_UPDATE is TRUE then no nodes at or below LOCAL_ABSPATH have been
+ affected by the update/switch yet.
+
If WCROOT_IPROPS is not NULL it is a hash mapping const char * absolute
working copy paths to depth-first ordered arrays of
svn_prop_inherited_item_t * structures. If LOCAL_ABSPATH exists in
@@ -2556,6 +2632,7 @@ svn_wc__db_op_bump_revisions_post_update(svn_wc__db_t *db,
svn_revnum_t new_revision,
apr_hash_t *exclude_relpaths,
apr_hash_t *wcroot_iprops,
+ svn_boolean_t empty_update,
svn_wc_notify_func2_t notify_func,
void *notify_baton,
apr_pool_t *scratch_pool);
@@ -2605,10 +2682,12 @@ svn_wc__db_lock_add(svn_wc__db_t *db,
apr_pool_t *scratch_pool);
-/* Remove any lock for LOCAL_ABSPATH in DB. */
+/* Remove any lock for LOCAL_ABSPATH in DB and install WORK_ITEMS
+ (if not NULL) in DB */
svn_error_t *
svn_wc__db_lock_remove(svn_wc__db_t *db,
const char *local_abspath,
+ svn_skel_t *work_items,
apr_pool_t *scratch_pool);
@@ -2619,30 +2698,6 @@ svn_wc__db_lock_remove(svn_wc__db_t *db,
@{
*/
-/* Read a BASE node's repository information.
-
- For the BASE node implied by LOCAL_ABSPATH, its location in the repository
- returned in *REPOS_ROOT_URL and *REPOS_UUID will be returned in
- *REPOS_RELPATH. Any of the OUT parameters may be NULL, indicating no
- interest in that piece of information.
-
- All returned data will be allocated in RESULT_POOL. All temporary
- allocations will be made in SCRATCH_POOL.
-
- ### Either delete this function and use _base_get_info instead, or
- ### add a 'revision' output to make a complete repository node location
- ### and rename to not say 'scan', because it doesn't.
-*/
-svn_error_t *
-svn_wc__db_scan_base_repos(const char **repos_relpath,
- const char **repos_root_url,
- const char **repos_uuid,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
/* Scan upwards for information about a known addition to the WORKING tree.
IFF a node's status as returned by svn_wc__db_read_info() is
@@ -2707,7 +2762,8 @@ svn_wc__db_scan_addition(svn_wc__db_status_t *status,
apr_pool_t *scratch_pool);
/* Scan the working copy for move information of the node LOCAL_ABSPATH.
- * If LOCAL_ABSPATH return a SVN_ERR_WC_PATH_UNEXPECTED_STATUS error.
+ * If LOCAL_ABSPATH is not moved here return an
+ * SVN_ERR_WC_PATH_UNEXPECTED_STATUS error.
*
* If not NULL *MOVED_FROM_ABSPATH will be set to the previous location
* of LOCAL_ABSPATH, before it or an ancestror was moved.
@@ -2879,34 +2935,6 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_t **sdb,
const char *repos_uuid,
apr_pool_t *scratch_pool);
-
-svn_error_t *
-svn_wc__db_upgrade_apply_dav_cache(svn_sqlite__db_t *sdb,
- const char *dir_relpath,
- apr_hash_t *cache_values,
- apr_pool_t *scratch_pool);
-
-
-/* ### need much more docco
-
- ### this function should be called within a sqlite transaction. it makes
- ### assumptions around this fact.
-
- Apply the various sets of properties to the database nodes based on
- their existence/presence, the current state of the node, and the original
- format of the working copy which provided these property sets.
-*/
-svn_error_t *
-svn_wc__db_upgrade_apply_props(svn_sqlite__db_t *sdb,
- const char *dir_abspath,
- const char *local_relpath,
- apr_hash_t *base_props,
- apr_hash_t *revert_props,
- apr_hash_t *working_props,
- int original_format,
- apr_int64_t wc_id,
- apr_pool_t *scratch_pool);
-
/* Simply insert (or replace) one row in the EXTERNALS table. */
svn_error_t *
svn_wc__db_upgrade_insert_external(svn_wc__db_t *db,
@@ -2921,20 +2949,6 @@ svn_wc__db_upgrade_insert_external(svn_wc__db_t *db,
svn_revnum_t def_revision,
apr_pool_t *scratch_pool);
-/* Get the repository identifier corresponding to REPOS_ROOT_URL from the
- database in SDB. The value is returned in *REPOS_ID. All allocations
- are allocated in SCRATCH_POOL.
-
- NOTE: the row in REPOSITORY must exist. If not, then SVN_ERR_WC_DB_ERROR
- is returned.
-
- ### unclear on whether/how this interface will stay/evolve. */
-svn_error_t *
-svn_wc__db_upgrade_get_repos_id(apr_int64_t *repos_id,
- svn_sqlite__db_t *sdb,
- const char *repos_root_url,
- apr_pool_t *scratch_pool);
-
/* Upgrade the metadata concerning the WC at WCROOT_ABSPATH, in DB,
* to the SVN_WC__VERSION format.
*
@@ -3075,10 +3089,6 @@ svn_wc__db_wclock_owns_lock(svn_boolean_t *own_lock,
This operation always recursively removes all nodes at and below
LOCAL_ABSPATH from NODES and ACTUAL.
- If NOT_PRESENT_REVISION specifies a valid revision, leave a not_present
- BASE node at local_abspath of the specified status and kind.
- (Requires an existing BASE node before removing)
-
If DESTROY_WC is TRUE, this operation *installs* workqueue operations to
update the local filesystem after the database operation. If DESTROY_CHANGES
is FALSE, modified and unversioned files are left after running this
@@ -3096,9 +3106,6 @@ svn_wc__db_op_remove_node(svn_boolean_t *left_changes,
const char *local_abspath,
svn_boolean_t destroy_wc,
svn_boolean_t destroy_changes,
- svn_revnum_t not_present_revision,
- svn_wc__db_status_t not_present_status,
- svn_node_kind_t not_present_kind,
const svn_skel_t *conflict,
const svn_skel_t *work_items,
svn_cancel_func_t cancel_func,
@@ -3192,9 +3199,21 @@ svn_wc__db_temp_op_end_directory_update(svn_wc__db_t *db,
apr_pool_t *scratch_pool);
-/* Copy the base tree at LOCAL_ABSPATH into the working tree as copy,
- leaving any subtree additions and copies as-is. This allows the
- base node tree to be removed. */
+/* When local_abspath has no WORKING layer, copy the base tree at
+ LOCAL_ABSPATH into the working tree as copy, leaving any subtree
+ additions and copies as-is. This may introduce multiple layers if
+ the tree is mixed revision.
+
+ When local_abspath has a WORKING node, but is not an op-root, copy
+ all descendants at the same op-depth to the op-depth of local_abspath,
+ thereby turning this node in a copy of what was already there.
+
+ Fails with a SVN_ERR_WC_PATH_UNEXPECTED_STATUS error if LOCAL_RELPATH
+ is already an op-root (as in that case it can't be copied as that
+ would overwrite what is already there).
+
+ After this operation the copied layer (E.g. BASE) can be removed, without
+ the WORKING nodes chaning. Typical usecase: tree conflict handling */
svn_error_t *
svn_wc__db_op_make_copy(svn_wc__db_t *db,
const char *local_abspath,
@@ -3249,7 +3268,8 @@ svn_wc__db_get_not_present_descendants(const apr_array_header_t **descendants,
*
* Indicate in *IS_SPARSE_CHECKOUT whether any of the nodes within
* LOCAL_ABSPATH is sparse.
- * Indicate in *IS_MODIFIED whether the working copy has local modifications.
+ * Indicate in *IS_MODIFIED whether the working copy has local modifications
+ * recorded for it in DB.
*
* Indicate in *IS_SWITCHED whether any node beneath LOCAL_ABSPATH
* is switched. If TRAIL_URL is non-NULL, use it to determine if LOCAL_ABSPATH
@@ -3270,8 +3290,6 @@ svn_wc__db_revision_status(svn_revnum_t *min_revision,
const char *local_abspath,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool);
/* Set *MIN_REVISION and *MAX_REVISION to the lowest and highest revision
@@ -3332,16 +3350,13 @@ svn_wc__db_get_excluded_subtrees(apr_hash_t **server_excluded_subtrees,
/* Indicate in *IS_MODIFIED whether the working copy has local modifications,
* using DB. Use SCRATCH_POOL for temporary allocations.
*
- * This function provides a subset of the functionality of
- * svn_wc__db_revision_status() and is more efficient if the caller
- * doesn't need all information returned by svn_wc__db_revision_status(). */
+ * This function does not check the working copy state, but is a lot more
+ * efficient than a full status walk. */
svn_error_t *
-svn_wc__db_has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
+svn_wc__db_has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool);
/* Verify the consistency of metadata concerning the WC that contains
@@ -3369,27 +3384,31 @@ svn_wc__db_follow_moved_to(apr_array_header_t **moved_tos,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Update a moved-away tree conflict victim at VICTIM_ABSPATH with changes
- * brought in by the update operation which flagged the tree conflict. */
+/* Update a moved-away tree conflict victim LOCAL_ABSPATH, deleted in
+ DELETE_OP_ABSPATH with changes from the original location. */
svn_error_t *
svn_wc__db_update_moved_away_conflict_victim(svn_wc__db_t *db,
- const char *victim_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
+ const char *local_abspath,
+ const char *delete_op_abspath,
+ svn_wc_operation_t operation,
+ svn_wc_conflict_action_t action,
+ svn_wc_conflict_reason_t reason,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
apr_pool_t *scratch_pool);
/* LOCAL_ABSPATH is moved to MOVE_DST_ABSPATH. MOVE_SRC_ROOT_ABSPATH
* is the root of the move to MOVE_DST_OP_ROOT_ABSPATH.
- * MOVE_SRC_OP_ROOT_ABSPATH is the op-root of the move; it's the same
+ * DELETE_ABSPATH is the op-root of the move; it's the same
* as MOVE_SRC_ROOT_ABSPATH except for moves inside deletes when it is
* the op-root of the delete. */
svn_error_t *
svn_wc__db_base_moved_to(const char **move_dst_abspath,
const char **move_dst_op_root_abspath,
const char **move_src_root_abspath,
- const char **move_src_op_root_abspath,
+ const char **delete_abspath,
svn_wc__db_t *db,
const char *local_abspath,
apr_pool_t *result_pool,
@@ -3407,39 +3426,24 @@ svn_wc__db_vacuum(svn_wc__db_t *db,
comment in resolve_conflict_on_node about combining with another
function. */
svn_error_t *
-svn_wc__db_resolve_delete_raise_moved_away(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool);
-
-/* Like svn_wc__db_resolve_delete_raise_moved_away this should be
- combined.
-
- ### LOCAL_ABSPATH specifies the move origin, but the move origin
- ### is not necessary unique enough. This function needs an op_root_abspath
- ### argument to differentiate between different origins.
-
- ### See move_tests.py: move_many_update_delete for an example case.
- */
-svn_error_t *
-svn_wc__db_resolve_break_moved_away(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool);
+svn_wc__db_op_raise_moved_away(svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool);
-/* Break moves for all moved-away children of LOCAL_ABSPATH, within
- * a single transaction.
- *
- * ### Like svn_wc__db_resolve_delete_raise_moved_away this should be
- * combined. */
+/* Breaks all moves of nodes that exist at or below LOCAL_ABSPATH as
+ shadowed (read: deleted) by the opration rooted at
+ delete_op_root_abspath.
+ */
svn_error_t *
-svn_wc__db_resolve_break_moved_away_children(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool);
+svn_wc__db_op_break_moved_away(svn_wc__db_t *db,
+ const char *local_abspath,
+ const char *delete_op_root_abspath,
+ svn_boolean_t mark_tc_resolved,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool);
/* Set *REQUIRED_ABSPATH to the path that should be locked to ensure
* that the lock covers all paths affected by resolving the conflicts
@@ -3452,6 +3456,28 @@ svn_wc__required_lock_for_resolve(const char **required_abspath,
apr_pool_t *scratch_pool);
/* @} */
+typedef svn_error_t * (*svn_wc__db_verify_cb_t)(void *baton,
+ const char *wc_abspath,
+ const char *local_relpath,
+ int op_depth,
+ int id,
+ const char *description,
+ apr_pool_t *scratch_pool);
+
+/* Checks the database for FULL-correctness according to the spec.
+
+ Note that typical 1.7-1.9 databases WILL PRODUCE warnings.
+
+ This is mainly useful for WC-NG developers, as there will be
+ warnings without the database being corrupt
+*/
+svn_error_t *
+svn_wc__db_verify_db_full(svn_wc__db_t *db,
+ const char *wri_abspath,
+ svn_wc__db_verify_cb_t callback,
+ void *baton,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
diff --git a/subversion/libsvn_wc/wc_db_pristine.c b/subversion/libsvn_wc/wc_db_pristine.c
index d9dc8f3..9118d70 100644
--- a/subversion/libsvn_wc/wc_db_pristine.c
+++ b/subversion/libsvn_wc/wc_db_pristine.c
@@ -26,8 +26,11 @@
#define SVN_WC__I_AM_WC_DB
#include "svn_pools.h"
+#include "svn_io.h"
#include "svn_dirent_uri.h"
+#include "private/svn_io_private.h"
+
#include "wc.h"
#include "wc_db.h"
#include "wc-queries.h"
@@ -67,7 +70,7 @@ get_pristine_fname(const char **pristine_abspath,
wcroot_abspath,
svn_wc_get_adm_dir(scratch_pool),
PRISTINE_STORAGE_RELPATH,
- NULL);
+ SVN_VA_NULL);
/* We should have a valid checksum and (thus) a valid digest. */
SVN_ERR_ASSERT(hexdigest != NULL);
@@ -78,14 +81,14 @@ get_pristine_fname(const char **pristine_abspath,
subdir[2] = '\0';
hexdigest = apr_pstrcat(scratch_pool, hexdigest, PRISTINE_STORAGE_EXT,
- (char *)NULL);
+ SVN_VA_NULL);
/* The file is located at DIR/.svn/pristine/XX/XXYYZZ...svn-base */
*pristine_abspath = svn_dirent_join_many(result_pool,
base_dir_abspath,
subdir,
hexdigest,
- NULL);
+ SVN_VA_NULL);
return SVN_NO_ERROR;
}
@@ -194,10 +197,20 @@ pristine_read_txn(svn_stream_t **contents,
}
/* Open the file as a readable stream. It will remain readable even when
- * deleted from disk; APR guarantees that on Windows as well as Unix. */
+ * deleted from disk; APR guarantees that on Windows as well as Unix.
+ *
+ * We also don't enable APR_BUFFERED on this file to maximize throughput
+ * e.g. for fulltext comparison. As we use SVN__STREAM_CHUNK_SIZE buffers
+ * where needed in streams, there is no point in having another layer of
+ * buffers. */
if (contents)
- SVN_ERR(svn_stream_open_readonly(contents, pristine_abspath,
- result_pool, scratch_pool));
+ {
+ apr_file_t *file;
+ SVN_ERR(svn_io_file_open(&file, pristine_abspath, APR_READ,
+ APR_OS_DEFAULT, result_pool));
+ *contents = svn_stream_from_aprfile2(file, FALSE, result_pool);
+ }
+
return SVN_NO_ERROR;
}
@@ -253,31 +266,9 @@ pristine_get_tempdir(svn_wc__db_wcroot_t *wcroot,
{
return svn_dirent_join_many(result_pool, wcroot->abspath,
svn_wc_get_adm_dir(scratch_pool),
- PRISTINE_TEMPDIR_RELPATH, (char *)NULL);
+ PRISTINE_TEMPDIR_RELPATH, SVN_VA_NULL);
}
-svn_error_t *
-svn_wc__db_pristine_get_tempdir(const char **temp_dir_abspath,
- svn_wc__db_t *db,
- const char *wri_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
-
- SVN_ERR_ASSERT(temp_dir_abspath != NULL);
- SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- wri_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
-
- *temp_dir_abspath = pristine_get_tempdir(wcroot, result_pool, scratch_pool);
- return SVN_NO_ERROR;
-}
-
-
/* Install the pristine text described by BATON into the pristine store of
* SDB. If it is already stored then just delete the new file
* BATON->tempfile_abspath.
@@ -290,7 +281,7 @@ svn_wc__db_pristine_get_tempdir(const char **temp_dir_abspath,
static svn_error_t *
pristine_install_txn(svn_sqlite__db_t *sdb,
/* The path to the source file that is to be moved into place. */
- const char *tempfile_abspath,
+ svn_stream_t *install_stream,
/* The target path for the file (within the pristine store). */
const char *pristine_abspath,
/* The pristine text's SHA-1 checksum. */
@@ -299,10 +290,8 @@ pristine_install_txn(svn_sqlite__db_t *sdb,
const svn_checksum_t *md5_checksum,
apr_pool_t *scratch_pool)
{
- apr_finfo_t finfo;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- svn_error_t *err;
/* If this pristine text is already present in the store, just keep it:
* delete the new one and return. */
@@ -310,6 +299,7 @@ pristine_install_txn(svn_sqlite__db_t *sdb,
SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, scratch_pool));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
+
if (have_row)
{
#ifdef SVN_DEBUG
@@ -317,8 +307,10 @@ pristine_install_txn(svn_sqlite__db_t *sdb,
* ### We could check much more. */
{
apr_finfo_t finfo1, finfo2;
- SVN_ERR(svn_io_stat(&finfo1, tempfile_abspath, APR_FINFO_SIZE,
- scratch_pool));
+
+ SVN_ERR(svn_stream__install_get_info(&finfo1, install_stream, APR_FINFO_SIZE,
+ scratch_pool));
+
SVN_ERR(svn_io_stat(&finfo2, pristine_abspath, APR_FINFO_SIZE,
scratch_pool));
if (finfo1.size != finfo2.size)
@@ -333,84 +325,94 @@ pristine_install_txn(svn_sqlite__db_t *sdb,
#endif
/* Remove the temp file: it's already there */
- SVN_ERR(svn_io_remove_file2(tempfile_abspath,
- FALSE /* ignore_enoent */, scratch_pool));
+ SVN_ERR(svn_stream__install_delete(install_stream, scratch_pool));
return SVN_NO_ERROR;
}
/* Move the file to its target location. (If it is already there, it is
* an orphan file and it doesn't matter if we overwrite it.) */
- err = svn_io_file_rename(tempfile_abspath, pristine_abspath,
- scratch_pool);
+ {
+ apr_finfo_t finfo;
+ SVN_ERR(svn_stream__install_get_info(&finfo, install_stream, APR_FINFO_SIZE,
+ scratch_pool));
+ SVN_ERR(svn_stream__install_stream(install_stream, pristine_abspath,
+ TRUE, scratch_pool));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_INSERT_PRISTINE));
+ SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, scratch_pool));
+ SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool));
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 3, finfo.size));
+ SVN_ERR(svn_sqlite__insert(NULL, stmt));
+
+ SVN_ERR(svn_io_set_file_read_only(pristine_abspath, FALSE, scratch_pool));
+ }
- /* Maybe the directory doesn't exist yet? */
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_t *err2;
+ return SVN_NO_ERROR;
+}
- err2 = svn_io_dir_make(svn_dirent_dirname(pristine_abspath,
- scratch_pool),
- APR_OS_DEFAULT, scratch_pool);
+struct svn_wc__db_install_data_t
+{
+ svn_wc__db_wcroot_t *wcroot;
+ svn_stream_t *inner_stream;
+};
- if (err2)
- /* Creating directory didn't work: Return all errors */
- return svn_error_trace(svn_error_compose_create(err, err2));
- else
- /* We could create a directory: retry install */
- svn_error_clear(err);
+svn_error_t *
+svn_wc__db_pristine_prepare_install(svn_stream_t **stream,
+ svn_wc__db_install_data_t **install_data,
+ svn_checksum_t **sha1_checksum,
+ svn_checksum_t **md5_checksum,
+ svn_wc__db_t *db,
+ const char *wri_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath;
+ const char *temp_dir_abspath;
- SVN_ERR(svn_io_file_rename(tempfile_abspath, pristine_abspath,
- scratch_pool));
- }
- else
- SVN_ERR(err);
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
- SVN_ERR(svn_io_stat(&finfo, pristine_abspath, APR_FINFO_SIZE,
- scratch_pool));
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
+ wri_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_INSERT_PRISTINE));
- SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, scratch_pool));
- SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool));
- SVN_ERR(svn_sqlite__bind_int64(stmt, 3, finfo.size));
- SVN_ERR(svn_sqlite__insert(NULL, stmt));
+ temp_dir_abspath = pristine_get_tempdir(wcroot, scratch_pool, scratch_pool);
+
+ *install_data = apr_pcalloc(result_pool, sizeof(**install_data));
+ (*install_data)->wcroot = wcroot;
+
+ SVN_ERR_W(svn_stream__create_for_install(stream,
+ temp_dir_abspath,
+ result_pool, scratch_pool),
+ _("Unable to create pristine install stream"));
+
+ (*install_data)->inner_stream = *stream;
+
+ if (md5_checksum)
+ *stream = svn_stream_checksummed2(*stream, NULL, md5_checksum,
+ svn_checksum_md5, FALSE, result_pool);
+ if (sha1_checksum)
+ *stream = svn_stream_checksummed2(*stream, NULL, sha1_checksum,
+ svn_checksum_sha1, FALSE, result_pool);
return SVN_NO_ERROR;
}
-
svn_error_t *
-svn_wc__db_pristine_install(svn_wc__db_t *db,
- const char *tempfile_abspath,
+svn_wc__db_pristine_install(svn_wc__db_install_data_t *install_data,
const svn_checksum_t *sha1_checksum,
const svn_checksum_t *md5_checksum,
apr_pool_t *scratch_pool)
{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
- const char *wri_abspath;
+ svn_wc__db_wcroot_t *wcroot = install_data->wcroot;
const char *pristine_abspath;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(tempfile_abspath));
SVN_ERR_ASSERT(sha1_checksum != NULL);
SVN_ERR_ASSERT(sha1_checksum->kind == svn_checksum_sha1);
SVN_ERR_ASSERT(md5_checksum != NULL);
SVN_ERR_ASSERT(md5_checksum->kind == svn_checksum_md5);
- /* ### this logic assumes that TEMPFILE_ABSPATH follows this pattern:
- ### WCROOT_ABSPATH/COMPONENT/COMPONENT/TEMPFNAME
- ### if we change this (see PRISTINE_TEMPDIR_RELPATH), then this
- ### logic should change. */
- wri_abspath = svn_dirent_dirname(
- svn_dirent_dirname(
- svn_dirent_dirname(tempfile_abspath, scratch_pool),
- scratch_pool),
- scratch_pool);
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
- wri_abspath, scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
-
SVN_ERR(get_pristine_fname(&pristine_abspath, wcroot->abspath,
sha1_checksum,
scratch_pool, scratch_pool));
@@ -419,7 +421,7 @@ svn_wc__db_pristine_install(svn_wc__db_t *db,
* at the disk, to ensure no concurrent pristine install/delete txn. */
SVN_SQLITE__WITH_IMMEDIATE_TXN(
pristine_install_txn(wcroot->sdb,
- tempfile_abspath, pristine_abspath,
+ install_data->inner_stream, pristine_abspath,
sha1_checksum, md5_checksum,
scratch_pool),
wcroot->sdb);
@@ -427,6 +429,14 @@ svn_wc__db_pristine_install(svn_wc__db_t *db,
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__db_pristine_install_abort(svn_wc__db_install_data_t *install_data,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_stream__install_delete(install_data->inner_stream,
+ scratch_pool));
+}
+
svn_error_t *
svn_wc__db_pristine_get_md5(const svn_checksum_t **md5_checksum,
@@ -823,12 +833,44 @@ svn_wc__db_pristine_remove(svn_wc__db_t *db,
}
+/* Remove all unreferenced pristines in the WC DB in WCROOT.
+ *
+ * Look for pristine texts whose 'refcount' in the DB is zero, and remove
+ * them from the 'pristine' table and from disk.
+ *
+ * TODO: At least check that any zero refcount is really correct, before
+ * using it. See dev@ email thread "Pristine text missing - cleanup
+ * doesn't work", <http://svn.haxx.se/dev/archive-2013-04/0426.shtml>.
+ *
+ * TODO: Ideas for possible extra clean-up operations:
+ *
+ * * Check and correct all the refcounts. Identify any rows missing
+ * from the 'pristine' table. (Create a temporary index for speed
+ * if necessary?)
+ *
+ * * Check the checksums. (Very expensive to check them all, so find
+ * a way to not check them all.)
+ *
+ * * Check for pristine files missing from disk but referenced in the
+ * 'pristine' table.
+ *
+ * * Repair any pristine files missing from disk and/or rows missing
+ * from the 'pristine' table and/or bad checksums. Generally
+ * requires contacting the server, so requires support at a higher
+ * level than this function.
+ *
+ * * Identify any pristine text files on disk that are not referenced
+ * in the DB, and delete them.
+ *
+ * TODO: Provide feedback about any errors found and any corrections made.
+ */
static svn_error_t *
pristine_cleanup_wcroot(svn_wc__db_wcroot_t *wcroot,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_error_t *err = NULL;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* Find each unreferenced pristine in the DB and remove it. */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
@@ -838,16 +880,20 @@ pristine_cleanup_wcroot(svn_wc__db_wcroot_t *wcroot,
svn_boolean_t have_row;
const svn_checksum_t *sha1_checksum;
+ svn_pool_clear(iterpool);
+
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (! have_row)
break;
SVN_ERR(svn_sqlite__column_checksum(&sha1_checksum, stmt, 0,
- scratch_pool));
+ iterpool));
err = pristine_remove_if_unreferenced(wcroot, sha1_checksum,
- scratch_pool);
+ iterpool);
}
+ svn_pool_destroy(iterpool);
+
return svn_error_trace(
svn_error_compose_create(err, svn_sqlite__reset(stmt)));
}
diff --git a/subversion/libsvn_wc/wc_db_private.h b/subversion/libsvn_wc/wc_db_private.h
index a4bf98f..a9d7b04 100644
--- a/subversion/libsvn_wc/wc_db_private.h
+++ b/subversion/libsvn_wc/wc_db_private.h
@@ -42,12 +42,16 @@ struct svn_wc__db_t {
opened, and found to be not-current? */
svn_boolean_t verify_format;
- /* Should we ensure the WORK_QUEUE is empty when a WCROOT is opened? */
+ /* Should we ensure the WORK_QUEUE is empty when a DB is locked
+ * for writing? */
svn_boolean_t enforce_empty_wq;
/* Should we open Sqlite databases EXCLUSIVE */
svn_boolean_t exclusive;
+ /* Busy timeout in ms., 0 for the libsvn_subr default. */
+ apr_int32_t timeout;
+
/* Map a given working copy directory to its relevant data.
const char *local_abspath -> svn_wc__db_wcroot_t *wcroot */
apr_hash_t *dir_data;
@@ -122,7 +126,6 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_wcroot_t **wcroot,
apr_int64_t wc_id,
int format,
svn_boolean_t verify_format,
- svn_boolean_t enforce_empty_wq,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -145,6 +148,9 @@ svn_wc__db_wcroot_parse_local_abspath(svn_wc__db_wcroot_t **wcroot,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Return an error if the work queue in SDB is non-empty. */
+svn_error_t *
+svn_wc__db_verify_no_work(svn_sqlite__db_t *sdb);
/* Assert that the given WCROOT is usable.
NOTE: the expression is multiply-evaluated!! */
@@ -192,7 +198,7 @@ svn_wc__db_util_fetch_wc_id(apr_int64_t *wc_id,
/* Open a connection in *SDB to the WC database found in the WC metadata
* directory inside DIR_ABSPATH, having the filename SDB_FNAME.
*
- * SMODE is passed to svn_sqlite__open().
+ * SMODE, EXCLUSIVE and TIMEOUT are passed to svn_sqlite__open().
*
* Register MY_STATEMENTS, or if that is null, the default set of WC DB
* statements, as the set of statements to be prepared now and executed
@@ -205,10 +211,18 @@ svn_wc__db_util_open_db(svn_sqlite__db_t **sdb,
const char *sdb_fname,
svn_sqlite__mode_t smode,
svn_boolean_t exclusive,
+ apr_int32_t timeout,
const char *const *my_statements,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Like svn_wc__db_wq_add() but taking WCROOT */
+svn_error_t *
+svn_wc__db_wq_add_internal(svn_wc__db_wcroot_t *wcroot,
+ const svn_skel_t *work_item,
+ apr_pool_t *scratch_pool);
+
+
/* Like svn_wc__db_read_info(), but taking WCROOT+LOCAL_RELPATH instead of
DB+LOCAL_ABSPATH, and outputting repos ids instead of URL+UUID. */
svn_error_t *
@@ -299,14 +313,40 @@ svn_wc__db_depth_get_info(svn_wc__db_status_t *status,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Look up REPOS_ID in SDB and set *REPOS_ROOT_URL and/or *REPOS_UUID to
- its root URL and UUID respectively. If REPOS_ID is INVALID_REPOS_ID,
+svn_error_t *
+svn_wc__db_scan_addition_internal(
+ svn_wc__db_status_t *status,
+ const char **op_root_relpath_p,
+ const char **repos_relpath,
+ apr_int64_t *repos_id,
+ const char **original_repos_relpath,
+ apr_int64_t *original_repos_id,
+ svn_revnum_t *original_revision,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+svn_error_t *
+svn_wc__db_scan_deletion_internal(
+ const char **base_del_relpath,
+ const char **moved_to_relpath,
+ const char **work_del_relpath,
+ const char **moved_to_op_root_relpath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+/* Look up REPOS_ID in WCROOT->SDB and set *REPOS_ROOT_URL and/or *REPOS_UUID
+ to its root URL and UUID respectively. If REPOS_ID is INVALID_REPOS_ID,
use NULL for both URL and UUID. Either or both output parameters may be
NULL if not wanted. */
svn_error_t *
svn_wc__db_fetch_repos_info(const char **repos_root_url,
const char **repos_uuid,
- svn_sqlite__db_t *sdb,
+ svn_wc__db_wcroot_t *wcroot,
apr_int64_t repos_id,
apr_pool_t *result_pool);
@@ -314,6 +354,8 @@ svn_wc__db_fetch_repos_info(const char **repos_root_url,
DB+LOCAL_ABSPATH, and outputting relpaths instead of abspaths. */
svn_error_t *
svn_wc__db_read_conflict_internal(svn_skel_t **conflict,
+ svn_node_kind_t *kind,
+ apr_hash_t **props,
svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
apr_pool_t *result_pool,
@@ -330,23 +372,6 @@ svn_wc__db_mark_conflict_internal(svn_wc__db_wcroot_t *wcroot,
/* Transaction handling */
-/* A callback which supplies WCROOTs and LOCAL_RELPATHs. */
-typedef svn_error_t *(*svn_wc__db_txn_callback_t)(void *baton,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *scratch_pool);
-
-
-/* Run CB_FUNC in a SQLite transaction with CB_BATON, using WCROOT and
- LOCAL_RELPATH. If callbacks require additional information, they may
- provide it using CB_BATON. */
-svn_error_t *
-svn_wc__db_with_txn(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_txn_callback_t cb_func,
- void *cb_baton,
- apr_pool_t *scratch_pool);
-
/* Evaluate the expression EXPR within a transaction.
*
* Begin a transaction in WCROOT's DB; evaluate the expression EXPR, which would
@@ -369,79 +394,91 @@ svn_wc__db_with_txn(svn_wc__db_wcroot_t *wcroot,
#define SVN_WC__DB_WITH_TXN4(expr1, expr2, expr3, expr4, wcroot) \
SVN_SQLITE__WITH_LOCK4(expr1, expr2, expr3, expr4, (wcroot)->sdb)
+/* Update the single op-depth layer in the move destination subtree
+ rooted at DST_RELPATH to make it match the move source subtree
+ rooted at SRC_RELPATH. */
+svn_error_t *
+svn_wc__db_op_copy_layer_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *src_op_relpath,
+ int src_op_depth,
+ const char *dst_op_relpath,
+ svn_skel_t *conflict,
+ svn_skel_t *work_items,
+ apr_pool_t *scratch_pool);
-/* Return CHILDREN mapping const char * names to svn_node_kind_t * for the
- children of LOCAL_RELPATH at OP_DEPTH. */
+/* Like svn_wc__db_op_make_copy but with wcroot, local_relpath */
svn_error_t *
-svn_wc__db_get_children_op_depth(apr_hash_t **children,
- svn_wc__db_wcroot_t *wcroot,
+svn_wc__db_op_make_copy_internal(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- int op_depth,
- apr_pool_t *result_pool,
+ svn_boolean_t move_move_info,
+ const svn_skel_t *conflicts,
+ const svn_skel_t *work_items,
apr_pool_t *scratch_pool);
-/* Extend any delete of the parent of LOCAL_RELPATH to LOCAL_RELPATH.
+/* Extract the moved-to information for LOCAL_RELPATH as it existed
+ at OP-DEPTH. The output paths are optional and set to NULL
+ if there is no move, otherwise:
- ### What about KIND and OP_DEPTH? KIND ought to be redundant; I'm
- discussing on dev@ whether we can let that be null for presence
- == base-deleted. OP_DEPTH is the op-depth of what, and why?
- It is used to select the lowest working node higher than OP_DEPTH,
- so, in terms of the API, OP_DEPTH means ...?
+ *MOVE_SRC_RELPATH: the path that was moved (LOCAL_RELPATH or one
+ of its ancestors)
- Given a wc:
+ *MOVE_DST_RELPATH: The path *MOVE_SRC_RELPATH was moved to.
- 0 1 2 3 4
- normal
- A normal
- A/B normal normal
- A/B/C not-pres normal
- A/B/C/D normal
+ *DELETE_RELPATH: The path at which LOCAL_RELPATH was removed (
+ *MOVE_SRC_RELPATH or one of its ancestors)
- That is checkout, delete A/B, copy a replacement A/B, delete copied
- child A/B/C, add replacement A/B/C, add A/B/C/D.
+ Given a path A/B/C with A/B moved to X and A deleted then for A/B/C:
- Now an update that adds base nodes for A/B/C, A/B/C/D and A/B/C/D/E
- must extend the A/B deletion:
+ MOVE_SRC_RELPATH is A/B
+ MOVE_DST_RELPATH is X
+ DELETE_RELPATH is A
- 0 1 2 3 4
- normal
- A normal
- A/B normal normal
- A/B/C normal not-pres normal
- A/B/C/D normal base-del normal
- A/B/C/D/E normal base-del
+ X/C can be calculated if necessesary, like with the other
+ scan functions.
- When adding a node if the parent has a higher working node then the
- parent node is deleted (or replaced) and the delete must be extended
- to cover new node.
+ This function returns SVN_ERR_WC_PATH_NOT_FOUND if LOCAL_RELPATH didn't
+ exist at OP_DEPTH, or when it is not shadowed.
- In the example above A/B/C/D and A/B/C/D/E are the nodes that get
- the extended delete, A/B/C is already deleted.
- */
+ ### Think about combining with scan_deletion? Also with
+ ### scan_addition to get moved-to for replaces? Do we need to
+ ### return the op-root of the move source, i.e. A/B in the example
+ ### above? */
svn_error_t *
-svn_wc__db_extend_parent_delete(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_node_kind_t kind,
- int op_depth,
- apr_pool_t *scratch_pool);
+svn_wc__db_scan_moved_to_internal(const char **move_src_relpath,
+ const char **move_dst_relpath,
+ const char **delete_relpath,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+/* Like svn_wc__db_op_set_props, but updates ACTUAL_NODE directly without
+ comparing with the pristine properties, etc.
+*/
svn_error_t *
-svn_wc__db_retract_parent_delete(svn_wc__db_wcroot_t *wcroot,
+svn_wc__db_op_set_props_internal(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- int op_depth,
+ apr_hash_t *props,
+ svn_boolean_t clear_recorded_info,
apr_pool_t *scratch_pool);
svn_error_t *
-svn_wc__db_op_depth_moved_to(const char **move_dst_relpath,
- const char **move_dst_op_root_relpath,
- const char **move_src_root_relpath,
- const char **move_src_op_root_relpath,
- int op_depth,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
+svn_wc__db_read_props_internal(apr_hash_t **props,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Like svn_wc__db_wclock_owns_lock() but taking WCROOT+LOCAL_RELPATH instead
+ of DB+LOCAL_ABSPATH. */
+svn_error_t *
+svn_wc__db_wclock_owns_lock_internal(svn_boolean_t *own_lock,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_boolean_t exact,
+ apr_pool_t *scratch_pool);
/* Do a post-drive revision bump for the moved-away destination for
any move sources under LOCAL_RELPATH. This is called from within
@@ -455,12 +492,38 @@ svn_wc__db_bump_moved_away(svn_wc__db_wcroot_t *wcroot,
apr_pool_t *scratch_pool);
/* Unbreak the move from LOCAL_RELPATH on op-depth in WCROOT, by making
- the destination a normal copy */
+ the destination DST_RELPATH a normal copy. SRC_OP_DEPTH is the op-depth
+ where the move_to information is stored */
svn_error_t *
-svn_wc__db_resolve_break_moved_away_internal(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- int op_depth,
- apr_pool_t *scratch_pool);
+svn_wc__db_op_break_move_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *src_relpath,
+ int delete_op_depth,
+ const char *dst_relpath,
+ const svn_skel_t *work_items,
+ apr_pool_t *scratch_pool);
+
+svn_error_t *
+svn_wc__db_op_mark_resolved_internal(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_wc__db_t *db,
+ svn_boolean_t resolved_text,
+ svn_boolean_t resolved_props,
+ svn_boolean_t resolved_tree,
+ const svn_skel_t *work_items,
+ apr_pool_t *scratch_pool);
+
+/* op_depth is the depth at which the node is added. */
+svn_error_t *
+svn_wc__db_op_raise_moved_away_internal(
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ svn_wc__db_t *db,
+ svn_wc_operation_t operation,
+ svn_wc_conflict_action_t action,
+ const svn_wc_conflict_version_t *old_version,
+ const svn_wc_conflict_version_t *new_version,
+ apr_pool_t *scratch_pool);
svn_error_t *
svn_wc__db_update_move_list_notify(svn_wc__db_wcroot_t *wcroot,
@@ -470,4 +533,10 @@ svn_wc__db_update_move_list_notify(svn_wc__db_wcroot_t *wcroot,
void *notify_baton,
apr_pool_t *scratch_pool);
+svn_error_t *
+svn_wc__db_verify_db_full_internal(svn_wc__db_wcroot_t *wcroot,
+ svn_wc__db_verify_cb_t callback,
+ void *baton,
+ apr_pool_t *scratch_pool);
+
#endif /* WC_DB_PRIVATE_H */
diff --git a/subversion/libsvn_wc/wc_db_update_move.c b/subversion/libsvn_wc/wc_db_update_move.c
index 7f4f853..46cbeae 100644
--- a/subversion/libsvn_wc/wc_db_update_move.c
+++ b/subversion/libsvn_wc/wc_db_update_move.c
@@ -46,7 +46,7 @@
* layer. The destination may have additional higher op-depths
* representing adds, deletes, moves within the move destination. [2]
*
- * After the intial move an update has modified the NODES in the move
+ * After the initial move an update has modified the NODES in the move
* source and may have introduced a tree-conflict since the source and
* destination trees are no longer equivalent. The source is a
* different revision and may have text, property and tree changes
@@ -88,9 +88,9 @@
#include "svn_sorts.h"
#include "private/svn_skel.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_sqlite.h"
#include "private/svn_wc_private.h"
-#include "private/svn_editor.h"
#include "wc.h"
#include "props.h"
@@ -100,6 +100,80 @@
#include "workqueue.h"
#include "token-map.h"
+/* Helper functions */
+/* Return the absolute path, in local path style, of LOCAL_RELPATH
+ in WCROOT. */
+static const char *
+path_for_error_message(const svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *result_pool)
+{
+ const char *local_abspath
+ = svn_dirent_join(wcroot->abspath, local_relpath, result_pool);
+
+ return svn_dirent_local_style(local_abspath, result_pool);
+}
+
+/* Ensure that there is a working copy lock for LOCAL_RELPATH in WCROOT */
+static svn_error_t *
+verify_write_lock(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t locked;
+
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(&locked, wcroot, local_relpath,
+ FALSE, scratch_pool));
+ if (!locked)
+ {
+ return svn_error_createf(SVN_ERR_WC_NOT_LOCKED, NULL,
+ _("No write-lock in '%s'"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* In our merge conflicts we record the move_op_src path, which is essentially
+ the depth at which what was moved is marked deleted. The problem is that
+ this depth is not guaranteed to be stable, because somebody might just
+ remove another ancestor, or revert one.
+
+ To work around this problem we locate the layer below this path, and use
+ that to pinpoint whatever is moved.
+
+ For a path SRC_RELPATH that was deleted by an operation rooted at
+ DELETE_OP_DEPTH find the op-depth at which the node was originally added.
+ */
+static svn_error_t *
+find_src_op_depth(int *src_op_depth,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *src_relpath,
+ int delete_op_depth,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_HIGHEST_WORKING_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ src_relpath, delete_op_depth));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ *src_op_depth = svn_sqlite__column_int(stmt, 0);
+ SVN_ERR(svn_sqlite__reset(stmt));
+ if (!have_row)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("'%s' is not deleted"),
+ path_for_error_message(wcroot, src_relpath,
+ scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
/*
* Receiver code.
*
@@ -113,20 +187,34 @@
* be made at the move destination.
*/
-struct tc_editor_baton {
+typedef struct update_move_baton_t {
svn_wc__db_t *db;
svn_wc__db_wcroot_t *wcroot;
- const char *move_root_dst_relpath;
- /* The most recent conflict raised during this drive. We rely on the
- non-Ev2, depth-first, drive for this to make sense. */
- const char *conflict_root_relpath;
+ int src_op_depth;
+ int dst_op_depth;
svn_wc_operation_t operation;
svn_wc_conflict_version_t *old_version;
svn_wc_conflict_version_t *new_version;
- apr_pool_t *result_pool; /* For things that live as long as the baton. */
-};
+
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+} update_move_baton_t;
+
+/* Per node flags for tree conflict collection */
+typedef struct node_move_baton_t
+{
+ svn_boolean_t skip;
+ svn_boolean_t shadowed;
+ svn_boolean_t edited;
+
+ const char *src_relpath;
+ const char *dst_relpath;
+
+ update_move_baton_t *umb;
+ struct node_move_baton_t *pb;
+} node_move_baton_t;
/*
* Notifications are delayed until the entire update-move transaction
@@ -135,24 +223,52 @@ struct tc_editor_baton {
* and spooling notifications out of that table after the transaction.
*/
-/* Add an entry to the notification list. */
+/* Add an entry to the notification list, and at the same time install
+ a conflict and/or work items. */
static svn_error_t *
update_move_list_add(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
+ svn_wc__db_t *db,
svn_wc_notify_action_t action,
svn_node_kind_t kind,
svn_wc_notify_state_t content_state,
- svn_wc_notify_state_t prop_state)
-
+ svn_wc_notify_state_t prop_state,
+ svn_skel_t *conflict,
+ svn_skel_t *work_item,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
+ if (conflict)
+ {
+ svn_boolean_t tree_conflict;
+
+ SVN_ERR(svn_wc__conflict_read_info(NULL, NULL, NULL, NULL,
+ &tree_conflict,
+ db, wcroot->abspath, conflict,
+ scratch_pool, scratch_pool));
+ if (tree_conflict)
+ {
+ action = svn_wc_notify_tree_conflict;
+ content_state = svn_wc_notify_state_inapplicable;
+ prop_state = svn_wc_notify_state_inapplicable;
+ }
+ }
+
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_INSERT_UPDATE_MOVE_LIST));
- SVN_ERR(svn_sqlite__bindf(stmt, "sdddd", local_relpath,
- action, kind, content_state, prop_state));
+ SVN_ERR(svn_sqlite__bindf(stmt, "sdtdd", local_relpath,
+ action, kind_map_none, kind,
+ content_state, prop_state));
SVN_ERR(svn_sqlite__step_done(stmt));
+ if (conflict)
+ SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, local_relpath, conflict,
+ scratch_pool));
+
+ if (work_item)
+ SVN_ERR(svn_wc__db_wq_add_internal(wcroot, work_item, scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -192,7 +308,7 @@ svn_wc__db_update_move_list_notify(svn_wc__db_wcroot_t *wcroot,
local_relpath,
iterpool),
action, iterpool);
- notify->kind = svn_sqlite__column_int(stmt, 2);
+ notify->kind = svn_sqlite__column_token(stmt, 2, kind_map_none);
notify->content_state = svn_sqlite__column_int(stmt, 3);
notify->prop_state = svn_sqlite__column_int(stmt, 4);
notify->old_revision = old_revision;
@@ -212,23 +328,25 @@ svn_wc__db_update_move_list_notify(svn_wc__db_wcroot_t *wcroot,
return SVN_NO_ERROR;
}
-/* Mark a tree-conflict on LOCAL_RELPATH if such a tree-conflict does
- not already exist. */
+/* Create a tree-conflict for recording on LOCAL_RELPATH if such
+ a tree-conflict does not already exist. */
static svn_error_t *
-mark_tree_conflict(const char *local_relpath,
- svn_wc__db_wcroot_t *wcroot,
- svn_wc__db_t *db,
- const svn_wc_conflict_version_t *old_version,
- const svn_wc_conflict_version_t *new_version,
- const char *move_root_dst_relpath,
- svn_wc_operation_t operation,
- svn_node_kind_t old_kind,
- svn_node_kind_t new_kind,
- const char *old_repos_relpath,
- svn_wc_conflict_reason_t reason,
- svn_wc_conflict_action_t action,
- const char *move_src_op_root_relpath,
- apr_pool_t *scratch_pool)
+create_tree_conflict(svn_skel_t **conflict_p,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ const char *dst_op_root_relpath,
+ svn_wc__db_t *db,
+ const svn_wc_conflict_version_t *old_version,
+ const svn_wc_conflict_version_t *new_version,
+ svn_wc_operation_t operation,
+ svn_node_kind_t old_kind,
+ svn_node_kind_t new_kind,
+ const char *old_repos_relpath,
+ svn_wc_conflict_reason_t reason,
+ svn_wc_conflict_action_t action,
+ const char *move_src_op_root_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_error_t *err;
svn_skel_t *conflict;
@@ -250,14 +368,18 @@ mark_tree_conflict(const char *local_relpath,
: NULL;
if (!new_repos_relpath)
- new_repos_relpath
- = svn_relpath_join(new_version->path_in_repos,
- svn_relpath_skip_ancestor(move_root_dst_relpath,
- local_relpath),
- scratch_pool);
-
- err = svn_wc__db_read_conflict_internal(&conflict, wcroot, local_relpath,
- scratch_pool, scratch_pool);
+ {
+ const char *child_relpath = svn_relpath_skip_ancestor(
+ dst_op_root_relpath,
+ local_relpath);
+ SVN_ERR_ASSERT(child_relpath != NULL);
+ new_repos_relpath = svn_relpath_join(new_version->path_in_repos,
+ child_relpath, scratch_pool);
+ }
+
+ err = svn_wc__db_read_conflict_internal(&conflict, NULL, NULL,
+ wcroot, local_relpath,
+ result_pool, scratch_pool);
if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
return svn_error_trace(err);
else if (err)
@@ -280,7 +402,7 @@ mark_tree_conflict(const char *local_relpath,
&& conflict_operation != svn_wc_operation_switch)
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("'%s' already in conflict"),
- svn_dirent_local_style(local_relpath,
+ path_for_error_message(wcroot, local_relpath,
scratch_pool));
if (tree_conflicted)
@@ -302,17 +424,19 @@ mark_tree_conflict(const char *local_relpath,
&& strcmp(move_src_op_root_relpath,
svn_dirent_skip_ancestor(wcroot->abspath,
existing_abspath))))
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ return svn_error_createf(SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("'%s' already in conflict"),
- svn_dirent_local_style(local_relpath,
+ path_for_error_message(wcroot,
+ local_relpath,
scratch_pool));
/* Already a suitable tree-conflict. */
+ *conflict_p = conflict;
return SVN_NO_ERROR;
}
}
else
- conflict = svn_wc__conflict_skel_create(scratch_pool);
+ conflict = svn_wc__conflict_skel_create(result_pool);
SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(
conflict, db,
@@ -321,19 +445,13 @@ mark_tree_conflict(const char *local_relpath,
reason,
action,
move_src_op_root_abspath,
- scratch_pool,
+ result_pool,
scratch_pool));
- if (reason != svn_wc_conflict_reason_unversioned
- && old_repos_relpath != NULL /* no local additions */)
- {
- conflict_old_version = svn_wc_conflict_version_create2(
+ conflict_old_version = svn_wc_conflict_version_create2(
old_version->repos_url, old_version->repos_uuid,
old_repos_relpath, old_version->peg_rev,
old_kind, scratch_pool);
- }
- else
- conflict_old_version = NULL;
conflict_new_version = svn_wc_conflict_version_create2(
new_version->repos_url, new_version->repos_uuid,
@@ -344,312 +462,368 @@ mark_tree_conflict(const char *local_relpath,
{
SVN_ERR(svn_wc__conflict_skel_set_op_update(
conflict, conflict_old_version, conflict_new_version,
- scratch_pool, scratch_pool));
+ result_pool, scratch_pool));
}
else
{
assert(operation == svn_wc_operation_switch);
SVN_ERR(svn_wc__conflict_skel_set_op_switch(
conflict, conflict_old_version, conflict_new_version,
- scratch_pool, scratch_pool));
+ result_pool, scratch_pool));
}
- SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, local_relpath,
- conflict, scratch_pool));
-
- SVN_ERR(update_move_list_add(wcroot, local_relpath,
- svn_wc_notify_tree_conflict,
- new_kind,
- svn_wc_notify_state_inapplicable,
- svn_wc_notify_state_inapplicable));
+ *conflict_p = conflict;
return SVN_NO_ERROR;
}
-/* If LOCAL_RELPATH is a child of the most recently raised
- tree-conflict or is shadowed then set *IS_CONFLICTED to TRUE and
- raise a tree-conflict on the root of the obstruction if such a
- tree-conflict does not already exist. KIND is the kind of the
- incoming LOCAL_RELPATH. This relies on the non-Ev2, depth-first,
- drive. */
static svn_error_t *
-check_tree_conflict(svn_boolean_t *is_conflicted,
- struct tc_editor_baton *b,
+create_node_tree_conflict(svn_skel_t **conflict_p,
+ node_move_baton_t *nmb,
+ const char *dst_local_relpath,
+ svn_node_kind_t old_kind,
+ svn_node_kind_t new_kind,
+ svn_wc_conflict_reason_t reason,
+ svn_wc_conflict_action_t action,
+ const char *move_src_op_root_relpath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ update_move_baton_t *umb = nmb->umb;
+ const char *dst_repos_relpath;
+ const char *dst_root_relpath = svn_relpath_prefix(nmb->dst_relpath,
+ nmb->umb->dst_op_depth,
+ scratch_pool);
+
+ dst_repos_relpath =
+ svn_relpath_join(nmb->umb->old_version->path_in_repos,
+ svn_relpath_skip_ancestor(dst_root_relpath,
+ nmb->dst_relpath),
+ scratch_pool);
+
+
+
+ return svn_error_trace(
+ create_tree_conflict(conflict_p, umb->wcroot, dst_local_relpath,
+ svn_relpath_prefix(dst_local_relpath,
+ umb->dst_op_depth,
+ scratch_pool),
+ umb->db,
+ umb->old_version, umb->new_version,
+ umb->operation, old_kind, new_kind,
+ dst_repos_relpath,
+ reason, action, move_src_op_root_relpath,
+ result_pool, scratch_pool));
+}
+
+/* Checks if a specific local path is shadowed as seen from the move root.
+ Helper for update_moved_away_node() */
+static svn_error_t *
+check_node_shadowed(svn_boolean_t *shadowed,
+ svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
- svn_node_kind_t old_kind,
- svn_node_kind_t new_kind,
- const char *old_repos_relpath,
- svn_wc_conflict_action_t action,
+ int move_root_dst_op_depth,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- int dst_op_depth = relpath_depth(b->move_root_dst_relpath);
- int op_depth;
- const char *conflict_root_relpath = local_relpath;
- const char *move_dst_relpath, *dummy1;
- const char *dummy2, *move_src_op_root_relpath;
- if (b->conflict_root_relpath)
- {
- if (svn_relpath_skip_ancestor(b->conflict_root_relpath, local_relpath))
- {
- *is_conflicted = TRUE;
- return SVN_NO_ERROR;
- }
- b->conflict_root_relpath = NULL;
- }
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_WORKING_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_SELECT_LOWEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, local_relpath,
- dst_op_depth));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
if (have_row)
- op_depth = svn_sqlite__column_int(stmt, 0);
+ {
+ int op_depth = svn_sqlite__column_int(stmt, 0);
+
+ *shadowed = (op_depth > move_root_dst_op_depth);
+ }
+ else
+ *shadowed = FALSE;
SVN_ERR(svn_sqlite__reset(stmt));
- if (!have_row)
+ return SVN_NO_ERROR;
+}
+
+/* Set a tree conflict for the shadowed node LOCAL_RELPATH, which is
+ the ROOT OF THE OBSTRUCTION if such a tree-conflict does not
+ already exist. KIND is the kind of the incoming LOCAL_RELPATH. */
+static svn_error_t *
+mark_tc_on_op_root(node_move_baton_t *nmb,
+ svn_node_kind_t old_kind,
+ svn_node_kind_t new_kind,
+ svn_wc_conflict_action_t action,
+ apr_pool_t *scratch_pool)
+{
+ update_move_baton_t *b = nmb->umb;
+ const char *move_dst_relpath;
+ svn_skel_t *conflict;
+
+ SVN_ERR_ASSERT(nmb->shadowed && !nmb->pb->shadowed);
+
+ nmb->skip = TRUE;
+
+ if (old_kind == svn_node_none)
+ move_dst_relpath = NULL;
+ else
+ SVN_ERR(svn_wc__db_scan_moved_to_internal(NULL, &move_dst_relpath, NULL,
+ b->wcroot, nmb->dst_relpath,
+ b->dst_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(create_node_tree_conflict(&conflict, nmb, nmb->dst_relpath,
+ old_kind, new_kind,
+ (move_dst_relpath
+ ? svn_wc_conflict_reason_moved_away
+ : svn_wc_conflict_reason_deleted),
+ action, move_dst_relpath
+ ? nmb->dst_relpath
+ : NULL,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(update_move_list_add(b->wcroot, nmb->dst_relpath, b->db,
+ svn_wc_notify_tree_conflict,
+ new_kind,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ conflict, NULL, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+mark_node_edited(node_move_baton_t *nmb,
+ apr_pool_t *scratch_pool)
+{
+ if (nmb->edited)
+ return SVN_NO_ERROR;
+
+ if (nmb->pb)
{
- *is_conflicted = FALSE;
- return SVN_NO_ERROR;
+ SVN_ERR(mark_node_edited(nmb->pb, scratch_pool));
+
+ if (nmb->pb->skip)
+ nmb->skip = TRUE;
}
- *is_conflicted = TRUE;
+ nmb->edited = TRUE;
- while (relpath_depth(conflict_root_relpath) > op_depth)
+ if (nmb->skip)
+ return SVN_NO_ERROR;
+
+ if (nmb->shadowed && !(nmb->pb && nmb->pb->shadowed))
{
- conflict_root_relpath = svn_relpath_dirname(conflict_root_relpath,
- scratch_pool);
- old_kind = new_kind = svn_node_dir;
- if (old_repos_relpath)
- old_repos_relpath = svn_relpath_dirname(old_repos_relpath,
- scratch_pool);
- action = svn_wc_conflict_action_edit;
+ svn_node_kind_t dst_kind, src_kind;
+
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &dst_kind, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ nmb->umb->wcroot, nmb->dst_relpath,
+ nmb->umb->dst_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &src_kind, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ nmb->umb->wcroot, nmb->src_relpath,
+ nmb->umb->src_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(mark_tc_on_op_root(nmb,
+ dst_kind, src_kind,
+ svn_wc_conflict_action_edit,
+ scratch_pool));
}
- SVN_ERR(svn_wc__db_op_depth_moved_to(&move_dst_relpath,
- &dummy1,
- &dummy2,
- &move_src_op_root_relpath,
- dst_op_depth,
- b->wcroot, conflict_root_relpath,
- scratch_pool, scratch_pool));
-
- SVN_ERR(mark_tree_conflict(conflict_root_relpath,
- b->wcroot, b->db, b->old_version, b->new_version,
- b->move_root_dst_relpath, b->operation,
- old_kind, new_kind,
- old_repos_relpath,
- (move_dst_relpath
- ? svn_wc_conflict_reason_moved_away
- : svn_wc_conflict_reason_deleted),
- action, move_src_op_root_relpath,
- scratch_pool));
- b->conflict_root_relpath = apr_pstrdup(b->result_pool, conflict_root_relpath);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+mark_parent_edited(node_move_baton_t *nmb,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(nmb && nmb->pb);
+
+ SVN_ERR(mark_node_edited(nmb->pb, scratch_pool));
+
+ if (nmb->pb->skip)
+ nmb->skip = TRUE;
return SVN_NO_ERROR;
}
static svn_error_t *
-tc_editor_add_directory(void *baton,
+tc_editor_add_directory(node_move_baton_t *nmb,
const char *relpath,
- const apr_array_header_t *children,
+ svn_node_kind_t old_kind,
apr_hash_t *props,
- svn_revnum_t replaces_rev,
apr_pool_t *scratch_pool)
{
- struct tc_editor_baton *b = baton;
- int op_depth = relpath_depth(b->move_root_dst_relpath);
- const char *move_dst_repos_relpath;
- svn_node_kind_t move_dst_kind;
- svn_boolean_t is_conflicted;
- const char *abspath;
- svn_node_kind_t old_kind;
- svn_skel_t *work_item;
- svn_wc_notify_action_t action = svn_wc_notify_update_add;
- svn_error_t *err;
+ update_move_baton_t *b = nmb->umb;
+ const char *local_abspath;
+ svn_node_kind_t wc_kind;
+ svn_skel_t *work_item = NULL;
+ svn_skel_t *conflict = NULL;
+ svn_wc_conflict_reason_t reason = svn_wc_conflict_reason_unversioned;
+
+ SVN_ERR(mark_parent_edited(nmb, scratch_pool));
+ if (nmb->skip)
+ return SVN_NO_ERROR;
- /* Update NODES, only the bits not covered by the later call to
- replace_moved_layer. */
- SVN_ERR(svn_wc__db_extend_parent_delete(b->wcroot, relpath, svn_node_dir,
- op_depth, scratch_pool));
-
- err = svn_wc__db_depth_get_info(NULL, &move_dst_kind, NULL,
- &move_dst_repos_relpath, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- b->wcroot, relpath,
- relpath_depth(b->move_root_dst_relpath),
- scratch_pool, scratch_pool);
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ if (nmb->shadowed)
{
- svn_error_clear(err);
- old_kind = svn_node_none;
- move_dst_repos_relpath = NULL;
+ svn_wc__db_status_t status;
+
+ SVN_ERR(svn_wc__db_read_info_internal(&status, &wc_kind, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ b->wcroot, relpath,
+ scratch_pool, scratch_pool));
+
+ if (status == svn_wc__db_status_deleted)
+ reason = svn_wc_conflict_reason_deleted;
+ else if (status != svn_wc__db_status_added)
+ wc_kind = svn_node_none;
+ else if (old_kind == svn_node_none)
+ reason = svn_wc_conflict_reason_added;
+ else
+ reason = svn_wc_conflict_reason_replaced;
}
else
+ wc_kind = svn_node_none;
+
+ local_abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
+
+ if (wc_kind == svn_node_none)
{
- SVN_ERR(err);
- old_kind = move_dst_kind;
+ /* Check for unversioned tree-conflict */
+ SVN_ERR(svn_io_check_path(local_abspath, &wc_kind, scratch_pool));
}
- /* Check for NODES tree-conflict. */
- SVN_ERR(check_tree_conflict(&is_conflicted, b, relpath,
- old_kind, svn_node_dir,
- move_dst_repos_relpath,
- svn_wc_conflict_action_add,
- scratch_pool));
- if (is_conflicted)
- return SVN_NO_ERROR;
+ if (!nmb->shadowed && wc_kind == old_kind)
+ wc_kind = svn_node_none; /* Node will be gone once we install */
- /* Check for unversioned tree-conflict */
- abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
- SVN_ERR(svn_io_check_path(abspath, &old_kind, scratch_pool));
-
- switch (old_kind)
+ if (wc_kind != svn_node_none
+ && (nmb->shadowed || wc_kind != old_kind)) /* replace */
{
- case svn_node_file:
- default:
- SVN_ERR(mark_tree_conflict(relpath, b->wcroot, b->db, b->old_version,
- b->new_version, b->move_root_dst_relpath,
- b->operation, old_kind, svn_node_dir,
- move_dst_repos_relpath,
- svn_wc_conflict_reason_unversioned,
- svn_wc_conflict_action_add, NULL,
- scratch_pool));
- b->conflict_root_relpath = apr_pstrdup(b->result_pool, relpath);
- action = svn_wc_notify_tree_conflict;
- is_conflicted = TRUE;
- break;
-
- case svn_node_none:
- SVN_ERR(svn_wc__wq_build_dir_install(&work_item, b->db, abspath,
+ SVN_ERR(create_node_tree_conflict(&conflict, nmb, relpath,
+ old_kind, svn_node_dir,
+ reason,
+ (old_kind == svn_node_none)
+ ? svn_wc_conflict_action_add
+ : svn_wc_conflict_action_replace,
+ NULL,
+ scratch_pool, scratch_pool));
+ nmb->skip = TRUE;
+ }
+ else
+ {
+ SVN_ERR(svn_wc__wq_build_dir_install(&work_item, b->db, local_abspath,
scratch_pool, scratch_pool));
-
- SVN_ERR(svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
- scratch_pool));
- /* Fall through */
- case svn_node_dir:
- break;
}
- if (!is_conflicted)
- SVN_ERR(update_move_list_add(b->wcroot, relpath,
- action,
- svn_node_dir,
- svn_wc_notify_state_inapplicable,
- svn_wc_notify_state_inapplicable));
+ SVN_ERR(update_move_list_add(b->wcroot, relpath, b->db,
+ (old_kind == svn_node_none)
+ ? svn_wc_notify_update_add
+ : svn_wc_notify_update_replace,
+ svn_node_dir,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ conflict, work_item, scratch_pool));
return SVN_NO_ERROR;
}
static svn_error_t *
-tc_editor_add_file(void *baton,
+tc_editor_add_file(node_move_baton_t *nmb,
const char *relpath,
+ svn_node_kind_t old_kind,
const svn_checksum_t *checksum,
- svn_stream_t *contents,
apr_hash_t *props,
- svn_revnum_t replaces_rev,
apr_pool_t *scratch_pool)
{
- struct tc_editor_baton *b = baton;
- int op_depth = relpath_depth(b->move_root_dst_relpath);
- const char *move_dst_repos_relpath;
- svn_node_kind_t move_dst_kind;
- svn_node_kind_t old_kind;
- svn_boolean_t is_conflicted;
- const char *abspath;
- svn_skel_t *work_item;
- svn_error_t *err;
+ update_move_baton_t *b = nmb->umb;
+ svn_wc_conflict_reason_t reason = svn_wc_conflict_reason_unversioned;
+ svn_node_kind_t wc_kind;
+ const char *local_abspath;
+ svn_skel_t *work_item = NULL;
+ svn_skel_t *conflict = NULL;
+
+ SVN_ERR(mark_parent_edited(nmb, scratch_pool));
+ if (nmb->skip)
+ return SVN_NO_ERROR;
- /* Update NODES, only the bits not covered by the later call to
- replace_moved_layer. */
- SVN_ERR(svn_wc__db_extend_parent_delete(b->wcroot, relpath, svn_node_file,
- op_depth, scratch_pool));
-
- err = svn_wc__db_depth_get_info(NULL, &move_dst_kind, NULL,
- &move_dst_repos_relpath, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- b->wcroot, relpath,
- relpath_depth(b->move_root_dst_relpath),
- scratch_pool, scratch_pool);
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ if (nmb->shadowed)
{
- svn_error_clear(err);
- old_kind = svn_node_none;
- move_dst_repos_relpath = NULL;
+ svn_wc__db_status_t status;
+
+ SVN_ERR(svn_wc__db_read_info_internal(&status, &wc_kind, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ b->wcroot, relpath,
+ scratch_pool, scratch_pool));
+
+ if (status == svn_wc__db_status_deleted)
+ reason = svn_wc_conflict_reason_deleted;
+ else if (status != svn_wc__db_status_added)
+ wc_kind = svn_node_none;
+ else if (old_kind == svn_node_none)
+ reason = svn_wc_conflict_reason_added;
+ else
+ reason = svn_wc_conflict_reason_replaced;
}
else
- {
- SVN_ERR(err);
- old_kind = move_dst_kind;
- }
-
- /* Check for NODES tree-conflict. */
- SVN_ERR(check_tree_conflict(&is_conflicted, b, relpath,
- old_kind, svn_node_file, move_dst_repos_relpath,
- svn_wc_conflict_action_add,
- scratch_pool));
- if (is_conflicted)
- return SVN_NO_ERROR;
+ wc_kind = svn_node_none;
- /* Check for unversioned tree-conflict */
- abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
- SVN_ERR(svn_io_check_path(abspath, &old_kind, scratch_pool));
+ local_abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
- if (old_kind != svn_node_none)
+ if (wc_kind == svn_node_none)
{
- SVN_ERR(mark_tree_conflict(relpath, b->wcroot, b->db, b->old_version,
- b->new_version, b->move_root_dst_relpath,
- b->operation, old_kind, svn_node_file,
- move_dst_repos_relpath,
- svn_wc_conflict_reason_unversioned,
- svn_wc_conflict_action_add, NULL,
- scratch_pool));
- b->conflict_root_relpath = apr_pstrdup(b->result_pool, relpath);
- return SVN_NO_ERROR;
+ /* Check for unversioned tree-conflict */
+ SVN_ERR(svn_io_check_path(local_abspath, &wc_kind, scratch_pool));
}
- /* Update working file. */
- SVN_ERR(svn_wc__wq_build_file_install(&work_item, b->db,
- svn_dirent_join(b->wcroot->abspath,
- relpath,
- scratch_pool),
+ if (wc_kind != svn_node_none
+ && (nmb->shadowed || wc_kind != old_kind)) /* replace */
+ {
+ SVN_ERR(create_node_tree_conflict(&conflict, nmb, relpath,
+ old_kind, svn_node_file,
+ reason,
+ (old_kind == svn_node_none)
+ ? svn_wc_conflict_action_add
+ : svn_wc_conflict_action_replace,
NULL,
- FALSE /* FIXME: use_commit_times? */,
- TRUE /* record_file_info */,
scratch_pool, scratch_pool));
+ nmb->skip = TRUE;
+ }
+ else
+ {
+ /* Update working file. */
+ SVN_ERR(svn_wc__wq_build_file_install(&work_item, b->db,
+ svn_dirent_join(b->wcroot->abspath,
+ relpath,
+ scratch_pool),
+ NULL,
+ FALSE /*FIXME: use_commit_times?*/,
+ TRUE /* record_file_info */,
+ scratch_pool, scratch_pool));
+ }
- SVN_ERR(svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
- scratch_pool));
-
- SVN_ERR(update_move_list_add(b->wcroot, relpath,
- svn_wc_notify_update_add,
+ SVN_ERR(update_move_list_add(b->wcroot, relpath, b->db,
+ (old_kind == svn_node_none)
+ ? svn_wc_notify_update_add
+ : svn_wc_notify_update_replace,
svn_node_file,
svn_wc_notify_state_inapplicable,
- svn_wc_notify_state_inapplicable));
+ svn_wc_notify_state_inapplicable,
+ conflict, work_item, scratch_pool));
return SVN_NO_ERROR;
}
-static svn_error_t *
-tc_editor_add_symlink(void *baton,
- const char *relpath,
- const char *target,
- apr_hash_t *props,
- svn_revnum_t replaces_rev,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
-static svn_error_t *
-tc_editor_add_absent(void *baton,
- const char *relpath,
- svn_node_kind_t kind,
- svn_revnum_t replaces_rev,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
/* All the info we need about one version of a working node. */
typedef struct working_node_version_t
{
@@ -669,6 +843,7 @@ create_conflict_markers(svn_skel_t **work_items,
const working_node_version_t *old_version,
const working_node_version_t *new_version,
svn_node_kind_t kind,
+ svn_boolean_t set_operation,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -689,19 +864,22 @@ create_conflict_markers(svn_skel_t **work_items,
= svn_relpath_join(conflicted_version->path_in_repos, part, scratch_pool);
original_version->path_in_repos = repos_relpath;
- if (operation == svn_wc_operation_update)
+ if (set_operation)
{
- SVN_ERR(svn_wc__conflict_skel_set_op_update(
- conflict_skel, original_version,
- conflicted_version,
- scratch_pool, scratch_pool));
- }
- else
- {
- SVN_ERR(svn_wc__conflict_skel_set_op_switch(
- conflict_skel, original_version,
- conflicted_version,
- scratch_pool, scratch_pool));
+ if (operation == svn_wc_operation_update)
+ {
+ SVN_ERR(svn_wc__conflict_skel_set_op_update(
+ conflict_skel, original_version,
+ conflicted_version,
+ scratch_pool, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_wc__conflict_skel_set_op_switch(
+ conflict_skel, original_version,
+ conflicted_version,
+ scratch_pool, scratch_pool));
+ }
}
/* According to this func's doc string, it is "Currently only used for
@@ -720,8 +898,8 @@ update_working_props(svn_wc_notify_state_t *prop_state,
svn_skel_t **conflict_skel,
apr_array_header_t **propchanges,
apr_hash_t **actual_props,
- svn_wc__db_t *db,
- const char *local_abspath,
+ update_move_baton_t *b,
+ const char *local_relpath,
const struct working_node_version_t *old_version,
const struct working_node_version_t *new_version,
apr_pool_t *result_pool,
@@ -736,139 +914,123 @@ update_working_props(svn_wc_notify_state_t *prop_state,
* merge-left version, and the current props of the
* moved-here working file as the merge-right version.
*/
- SVN_ERR(svn_wc__db_read_props(actual_props,
- db, local_abspath,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_read_props_internal(actual_props,
+ b->wcroot, local_relpath,
+ result_pool, scratch_pool));
SVN_ERR(svn_prop_diffs(propchanges, new_version->props, old_version->props,
result_pool));
SVN_ERR(svn_wc__merge_props(conflict_skel, prop_state,
&new_actual_props,
- db, local_abspath,
+ b->db, svn_dirent_join(b->wcroot->abspath,
+ local_relpath,
+ scratch_pool),
old_version->props, old_version->props,
*actual_props, *propchanges,
result_pool, scratch_pool));
- /* Setting properties in ACTUAL_NODE with svn_wc__db_op_set_props
- relies on NODES row having been updated first which we don't do
- at present. So this extra property diff has the same effect.
+ /* Setting properties in ACTUAL_NODE with svn_wc__db_op_set_props_internal
+ relies on NODES row being updated via a different route .
- ### Perhaps we should update NODES first (but after
- ### svn_wc__db_read_props above)? */
+ This extra property diff makes sure we clear the actual row when
+ the final result is unchanged properties. */
SVN_ERR(svn_prop_diffs(&new_propchanges, new_actual_props, new_version->props,
scratch_pool));
if (!new_propchanges->nelts)
new_actual_props = NULL;
- /* Install the new actual props. Don't set the conflict_skel yet, because
- we might need to add a text conflict to it as well. */
- SVN_ERR(svn_wc__db_op_set_props(db, local_abspath,
- new_actual_props,
- svn_wc__has_magic_property(*propchanges),
- NULL/*conflict_skel*/, NULL/*work_items*/,
- scratch_pool));
+ /* Install the new actual props. */
+ SVN_ERR(svn_wc__db_op_set_props_internal(b->wcroot, local_relpath,
+ new_actual_props,
+ svn_wc__has_magic_property(
+ *propchanges),
+ scratch_pool));
return SVN_NO_ERROR;
}
static svn_error_t *
-tc_editor_alter_directory(void *baton,
+tc_editor_alter_directory(node_move_baton_t *nmb,
const char *dst_relpath,
- svn_revnum_t expected_move_dst_revision,
- const apr_array_header_t *children,
+ apr_hash_t *old_props,
apr_hash_t *new_props,
apr_pool_t *scratch_pool)
{
- struct tc_editor_baton *b = baton;
- const char *move_dst_repos_relpath;
- svn_revnum_t move_dst_revision;
- svn_node_kind_t move_dst_kind;
+ update_move_baton_t *b = nmb->umb;
working_node_version_t old_version, new_version;
- svn_wc__db_status_t status;
- svn_boolean_t is_conflicted;
-
- SVN_ERR_ASSERT(expected_move_dst_revision == b->old_version->peg_rev);
-
- SVN_ERR(svn_wc__db_depth_get_info(&status, &move_dst_kind, &move_dst_revision,
- &move_dst_repos_relpath, NULL, NULL, NULL,
- NULL, NULL, &old_version.checksum, NULL,
- NULL, &old_version.props,
- b->wcroot, dst_relpath,
- relpath_depth(b->move_root_dst_relpath),
- scratch_pool, scratch_pool));
+ svn_skel_t *work_items = NULL;
+ svn_skel_t *conflict_skel = NULL;
+ const char *local_abspath = svn_dirent_join(b->wcroot->abspath, dst_relpath,
+ scratch_pool);
+ svn_wc_notify_state_t prop_state;
+ apr_hash_t *actual_props;
+ apr_array_header_t *propchanges;
+ svn_node_kind_t wc_kind;
+ svn_boolean_t obstructed = FALSE;
- /* If the node would be recorded as svn_wc__db_status_base_deleted it
- wouldn't have a repos_relpath */
- /* ### Can svn_wc__db_depth_get_info() do this for us without this hint? */
- if (status == svn_wc__db_status_deleted && move_dst_repos_relpath)
- status = svn_wc__db_status_not_present;
-
- /* There might be not-present nodes of a different revision as the same
- depth as a copy. This is commonly caused by copying/moving mixed revision
- directories */
- SVN_ERR_ASSERT(move_dst_revision == expected_move_dst_revision
- || status == svn_wc__db_status_not_present);
- SVN_ERR_ASSERT(move_dst_kind == svn_node_dir);
-
- SVN_ERR(check_tree_conflict(&is_conflicted, b, dst_relpath,
- move_dst_kind,
- svn_node_dir,
- move_dst_repos_relpath,
- svn_wc_conflict_action_edit,
- scratch_pool));
- if (is_conflicted)
+ SVN_ERR(mark_node_edited(nmb, scratch_pool));
+ if (nmb->skip)
return SVN_NO_ERROR;
+ SVN_ERR(svn_io_check_path(local_abspath, &wc_kind, scratch_pool));
+ if (wc_kind != svn_node_none && wc_kind != svn_node_dir)
+ {
+ SVN_ERR(create_node_tree_conflict(&conflict_skel, nmb, dst_relpath,
+ svn_node_dir, svn_node_dir,
+ svn_wc_conflict_reason_obstructed,
+ svn_wc_conflict_action_edit,
+ NULL,
+ scratch_pool, scratch_pool));
+ obstructed = TRUE;
+ }
+
old_version.location_and_kind = b->old_version;
new_version.location_and_kind = b->new_version;
+ old_version.checksum = NULL; /* not a file */
+ old_version.props = old_props;
new_version.checksum = NULL; /* not a file */
- new_version.props = new_props ? new_props : old_version.props;
+ new_version.props = new_props;
- if (new_props)
+ SVN_ERR(update_working_props(&prop_state, &conflict_skel,
+ &propchanges, &actual_props,
+ b, dst_relpath,
+ &old_version, &new_version,
+ scratch_pool, scratch_pool));
+
+ if (prop_state == svn_wc_notify_state_conflicted)
{
- const char *dst_abspath = svn_dirent_join(b->wcroot->abspath,
- dst_relpath,
- scratch_pool);
- svn_wc_notify_state_t prop_state;
- svn_skel_t *conflict_skel = NULL;
- apr_hash_t *actual_props;
- apr_array_header_t *propchanges;
-
- SVN_ERR(update_working_props(&prop_state, &conflict_skel,
- &propchanges, &actual_props,
- b->db, dst_abspath,
- &old_version, &new_version,
- scratch_pool, scratch_pool));
-
- if (conflict_skel)
- {
- svn_skel_t *work_items;
-
- SVN_ERR(create_conflict_markers(&work_items, dst_abspath,
- b->db, move_dst_repos_relpath,
- conflict_skel, b->operation,
- &old_version, &new_version,
- svn_node_dir,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_wc__db_mark_conflict_internal(b->wcroot, dst_relpath,
- conflict_skel,
- scratch_pool));
- SVN_ERR(svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_items,
- scratch_pool));
- }
+ const char *move_dst_repos_relpath;
- SVN_ERR(update_move_list_add(b->wcroot, dst_relpath,
- svn_wc_notify_update_update,
- svn_node_dir,
- svn_wc_notify_state_inapplicable,
- prop_state));
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, NULL, NULL,
+ &move_dst_repos_relpath, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ b->wcroot, dst_relpath,
+ b->dst_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(create_conflict_markers(&work_items, local_abspath,
+ b->db, move_dst_repos_relpath,
+ conflict_skel, b->operation,
+ &old_version, &new_version,
+ svn_node_dir, !obstructed,
+ scratch_pool, scratch_pool));
}
+ SVN_ERR(update_move_list_add(b->wcroot, dst_relpath, b->db,
+ svn_wc_notify_update_update,
+ svn_node_dir,
+ svn_wc_notify_state_inapplicable,
+ prop_state,
+ conflict_skel, work_items, scratch_pool));
+
return SVN_NO_ERROR;
}
-
-/* Merge the difference between OLD_VERSION and NEW_VERSION into
+/* Edit the file found at the move destination, which is initially at
+ * the old state. Merge the changes into the "working"/"actual" file.
+ *
+ * Merge the difference between OLD_VERSION and NEW_VERSION into
* the working file at LOCAL_RELPATH.
*
* The term 'old' refers to the pre-update state, which is the state of
@@ -883,17 +1045,18 @@ tc_editor_alter_directory(void *baton,
* Set *WORK_ITEMS to any required work items, allocated in RESULT_POOL.
* Use SCRATCH_POOL for temporary allocations. */
static svn_error_t *
-update_working_file(const char *local_relpath,
- const char *repos_relpath,
- svn_wc_operation_t operation,
- const working_node_version_t *old_version,
- const working_node_version_t *new_version,
- svn_wc__db_wcroot_t *wcroot,
- svn_wc__db_t *db,
- apr_pool_t *scratch_pool)
+tc_editor_alter_file(node_move_baton_t *nmb,
+ const char *dst_relpath,
+ const svn_checksum_t *old_checksum,
+ const svn_checksum_t *new_checksum,
+ apr_hash_t *old_props,
+ apr_hash_t *new_props,
+ apr_pool_t *scratch_pool)
{
- const char *local_abspath = svn_dirent_join(wcroot->abspath,
- local_relpath,
+ update_move_baton_t *b = nmb->umb;
+ working_node_version_t old_version, new_version;
+ const char *local_abspath = svn_dirent_join(b->wcroot->abspath,
+ dst_relpath,
scratch_pool);
const char *old_pristine_abspath;
const char *new_pristine_abspath;
@@ -903,23 +1066,51 @@ update_working_file(const char *local_relpath,
enum svn_wc_merge_outcome_t merge_outcome;
svn_wc_notify_state_t prop_state, content_state;
svn_skel_t *work_item, *work_items = NULL;
+ svn_node_kind_t wc_kind;
+ svn_boolean_t obstructed = FALSE;
+ SVN_ERR(mark_node_edited(nmb, scratch_pool));
+ if (nmb->skip)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_io_check_path(local_abspath, &wc_kind, scratch_pool));
+ if (wc_kind != svn_node_none && wc_kind != svn_node_file)
+ {
+ SVN_ERR(create_node_tree_conflict(&conflict_skel, nmb, dst_relpath,
+ svn_node_file, svn_node_file,
+ svn_wc_conflict_reason_obstructed,
+ svn_wc_conflict_action_edit,
+ NULL,
+ scratch_pool, scratch_pool));
+ obstructed = TRUE;
+ }
+
+ old_version.location_and_kind = b->old_version;
+ new_version.location_and_kind = b->new_version;
+
+ old_version.checksum = old_checksum;
+ old_version.props = old_props;
+ new_version.checksum = new_checksum;
+ new_version.props = new_props;
+
+ /* ### TODO: Only do this when there is no higher WORKING layer */
SVN_ERR(update_working_props(&prop_state, &conflict_skel, &propchanges,
- &actual_props, db, local_abspath,
- old_version, new_version,
+ &actual_props, b, dst_relpath,
+ &old_version, &new_version,
scratch_pool, scratch_pool));
- if (!svn_checksum_match(new_version->checksum, old_version->checksum))
+ if (!obstructed
+ && !svn_checksum_match(new_version.checksum, old_version.checksum))
{
svn_boolean_t is_locally_modified;
SVN_ERR(svn_wc__internal_file_modified_p(&is_locally_modified,
- db, local_abspath,
+ b->db, local_abspath,
FALSE /* exact_comparison */,
scratch_pool));
if (!is_locally_modified)
{
- SVN_ERR(svn_wc__wq_build_file_install(&work_item, db,
+ SVN_ERR(svn_wc__wq_build_file_install(&work_item, b->db,
local_abspath,
NULL,
FALSE /* FIXME: use_commit_times? */,
@@ -939,15 +1130,15 @@ update_working_file(const char *local_relpath,
* moved-here working file as the merge-right version.
*/
SVN_ERR(svn_wc__db_pristine_get_path(&old_pristine_abspath,
- db, wcroot->abspath,
- old_version->checksum,
+ b->db, b->wcroot->abspath,
+ old_version.checksum,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_pristine_get_path(&new_pristine_abspath,
- db, wcroot->abspath,
- new_version->checksum,
+ b->db, b->wcroot->abspath,
+ new_version.checksum,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__internal_merge(&work_item, &conflict_skel,
- &merge_outcome, db,
+ &merge_outcome, b->db,
old_pristine_abspath,
new_pristine_abspath,
local_abspath,
@@ -958,7 +1149,7 @@ update_working_file(const char *local_relpath,
NULL, /* diff3-cmd */
NULL, /* merge options */
propchanges,
- NULL, NULL, /* cancel_func + baton */
+ b->cancel_func, b->cancel_baton,
scratch_pool, scratch_pool));
work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
@@ -976,207 +1167,113 @@ update_working_file(const char *local_relpath,
* too. */
if (conflict_skel)
{
- SVN_ERR(create_conflict_markers(&work_item, local_abspath, db,
- repos_relpath, conflict_skel,
- operation, old_version, new_version,
- svn_node_file,
- scratch_pool, scratch_pool));
+ const char *move_dst_repos_relpath;
- SVN_ERR(svn_wc__db_mark_conflict_internal(wcroot, local_relpath,
- conflict_skel,
- scratch_pool));
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, NULL, NULL,
+ &move_dst_repos_relpath, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ b->wcroot, dst_relpath,
+ b->dst_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(create_conflict_markers(&work_item, local_abspath, b->db,
+ move_dst_repos_relpath, conflict_skel,
+ b->operation, &old_version, &new_version,
+ svn_node_file, !obstructed,
+ scratch_pool, scratch_pool));
work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
}
- SVN_ERR(svn_wc__db_wq_add(db, wcroot->abspath, work_items, scratch_pool));
-
- SVN_ERR(update_move_list_add(wcroot, local_relpath,
+ SVN_ERR(update_move_list_add(b->wcroot, dst_relpath, b->db,
svn_wc_notify_update_update,
svn_node_file,
content_state,
- prop_state));
+ prop_state,
+ conflict_skel, work_items, scratch_pool));
return SVN_NO_ERROR;
}
-
-/* Edit the file found at the move destination, which is initially at
- * the old state. Merge the changes into the "working"/"actual" file.
- */
static svn_error_t *
-tc_editor_alter_file(void *baton,
- const char *dst_relpath,
- svn_revnum_t expected_move_dst_revision,
- apr_hash_t *new_props,
- const svn_checksum_t *new_checksum,
- svn_stream_t *new_contents,
- apr_pool_t *scratch_pool)
-{
- struct tc_editor_baton *b = baton;
- const char *move_dst_repos_relpath;
- svn_revnum_t move_dst_revision;
- svn_node_kind_t move_dst_kind;
- working_node_version_t old_version, new_version;
- svn_boolean_t is_conflicted;
- svn_wc__db_status_t status;
-
- SVN_ERR(svn_wc__db_depth_get_info(&status, &move_dst_kind, &move_dst_revision,
- &move_dst_repos_relpath, NULL, NULL, NULL,
- NULL, NULL, &old_version.checksum, NULL,
- NULL, &old_version.props,
- b->wcroot, dst_relpath,
- relpath_depth(b->move_root_dst_relpath),
- scratch_pool, scratch_pool));
-
- /* If the node would be recorded as svn_wc__db_status_base_deleted it
- wouldn't have a repos_relpath */
- /* ### Can svn_wc__db_depth_get_info() do this for us without this hint? */
- if (status == svn_wc__db_status_deleted && move_dst_repos_relpath)
- status = svn_wc__db_status_not_present;
-
- SVN_ERR_ASSERT(move_dst_revision == expected_move_dst_revision
- || status == svn_wc__db_status_not_present);
- SVN_ERR_ASSERT(move_dst_kind == svn_node_file);
-
- SVN_ERR(check_tree_conflict(&is_conflicted, b, dst_relpath,
- move_dst_kind,
- svn_node_file,
- move_dst_repos_relpath,
- svn_wc_conflict_action_edit,
- scratch_pool));
- if (is_conflicted)
- return SVN_NO_ERROR;
-
- old_version.location_and_kind = b->old_version;
- new_version.location_and_kind = b->new_version;
-
- /* If new checksum is null that means no change; similarly props. */
- new_version.checksum = new_checksum ? new_checksum : old_version.checksum;
- new_version.props = new_props ? new_props : old_version.props;
-
- /* Update file and prop contents if the update has changed them. */
- if (!svn_checksum_match(new_checksum, old_version.checksum) || new_props)
- {
- SVN_ERR(update_working_file(dst_relpath, move_dst_repos_relpath,
- b->operation, &old_version, &new_version,
- b->wcroot, b->db,
- scratch_pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-tc_editor_alter_symlink(void *baton,
- const char *relpath,
- svn_revnum_t revision,
- apr_hash_t *props,
- const char *target,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
-static svn_error_t *
-tc_editor_delete(void *baton,
+tc_editor_delete(node_move_baton_t *nmb,
const char *relpath,
- svn_revnum_t revision,
+ svn_node_kind_t old_kind,
+ svn_node_kind_t new_kind,
apr_pool_t *scratch_pool)
{
- struct tc_editor_baton *b = baton;
+ update_move_baton_t *b = nmb->umb;
svn_sqlite__stmt_t *stmt;
- int op_depth = relpath_depth(b->move_root_dst_relpath);
- const char *move_dst_repos_relpath;
- svn_node_kind_t move_dst_kind;
- svn_boolean_t is_conflicted;
- svn_boolean_t must_delete_working_nodes = FALSE;
- const char *local_abspath = svn_dirent_join(b->wcroot->abspath, relpath,
- scratch_pool);
- const char *parent_relpath = svn_relpath_dirname(relpath, scratch_pool);
- int op_depth_below;
- svn_boolean_t have_row;
+ const char *local_abspath;
+ svn_boolean_t is_modified, is_all_deletes;
+ svn_skel_t *work_items = NULL;
+ svn_skel_t *conflict = NULL;
- SVN_ERR(svn_wc__db_depth_get_info(NULL, &move_dst_kind, NULL,
- &move_dst_repos_relpath, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- b->wcroot, relpath,
- relpath_depth(b->move_root_dst_relpath),
- scratch_pool, scratch_pool));
+ SVN_ERR(mark_parent_edited(nmb, scratch_pool));
+ if (nmb->skip)
+ return SVN_NO_ERROR;
/* Check before retracting delete to catch delete-delete
conflicts. This catches conflicts on the node itself; deleted
children are caught as local modifications below.*/
- SVN_ERR(check_tree_conflict(&is_conflicted, b, relpath,
- move_dst_kind,
- svn_node_unknown,
- move_dst_repos_relpath,
- svn_wc_conflict_action_delete,
- scratch_pool));
+ if (nmb->shadowed)
+ {
+ SVN_ERR(mark_tc_on_op_root(nmb,
+ old_kind, new_kind,
+ svn_wc_conflict_action_delete,
+ scratch_pool));
+ return SVN_NO_ERROR;
+ }
- if (!is_conflicted)
+ local_abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
+ SVN_ERR(svn_wc__node_has_local_mods(&is_modified, &is_all_deletes,
+ nmb->umb->db, local_abspath, FALSE,
+ NULL, NULL, scratch_pool));
+ if (is_modified)
{
- svn_boolean_t is_modified, is_all_deletes;
+ svn_wc_conflict_reason_t reason;
- SVN_ERR(svn_wc__node_has_local_mods(&is_modified, &is_all_deletes, b->db,
- local_abspath,
- NULL, NULL, scratch_pool));
- if (is_modified)
- {
- svn_wc_conflict_reason_t reason;
+ /* No conflict means no NODES rows at the relpath op-depth
+ so it's easy to convert the modified tree into a copy.
- if (!is_all_deletes)
- {
- /* No conflict means no NODES rows at the relpath op-depth
- so it's easy to convert the modified tree into a copy. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_UPDATE_OP_DEPTH_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isdd", b->wcroot->wc_id, relpath,
- op_depth, relpath_depth(relpath)));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- reason = svn_wc_conflict_reason_edited;
- }
- else
- {
+ Note the following assumptions for relpath:
+ * it is not shadowed
+ * it is not the/an op-root. (or we can't make us a copy)
+ */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_DELETE_WORKING_OP_DEPTH_ABOVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_wc__db_op_make_copy_internal(b->wcroot, relpath, FALSE,
+ NULL, NULL, scratch_pool));
- reason = svn_wc_conflict_reason_deleted;
- must_delete_working_nodes = TRUE;
- }
- is_conflicted = TRUE;
- SVN_ERR(mark_tree_conflict(relpath, b->wcroot, b->db, b->old_version,
- b->new_version, b->move_root_dst_relpath,
- b->operation,
- move_dst_kind,
- svn_node_none,
- move_dst_repos_relpath, reason,
- svn_wc_conflict_action_delete, NULL,
- scratch_pool));
- b->conflict_root_relpath = apr_pstrdup(b->result_pool, relpath);
- }
- }
+ reason = svn_wc_conflict_reason_edited;
- if (!is_conflicted || must_delete_working_nodes)
+ SVN_ERR(create_node_tree_conflict(&conflict, nmb, relpath,
+ old_kind, new_kind, reason,
+ (new_kind == svn_node_none)
+ ? svn_wc_conflict_action_delete
+ : svn_wc_conflict_action_replace,
+ NULL,
+ scratch_pool, scratch_pool));
+ nmb->skip = TRUE;
+ }
+ else
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- svn_skel_t *work_item;
- svn_node_kind_t del_kind;
const char *del_abspath;
+ svn_boolean_t have_row;
+ /* Get all descendants of the node in reverse order (so children are
+ handled before their parents, but not strictly depth first) */
SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_SELECT_CHILDREN_OP_DEPTH));
+ STMT_SELECT_DESCENDANTS_OP_DEPTH_RV));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
- op_depth));
+ b->dst_op_depth));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
svn_error_t *err;
+ svn_skel_t *work_item;
+ svn_node_kind_t del_kind;
svn_pool_clear(iterpool);
@@ -1194,8 +1291,7 @@ tc_editor_delete(void *baton,
b->wcroot->abspath, del_abspath,
iterpool, iterpool);
if (!err)
- err = svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
- iterpool);
+ err = svn_wc__db_wq_add_internal(b->wcroot, work_item, iterpool);
if (err)
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
@@ -1203,139 +1299,34 @@ tc_editor_delete(void *baton,
}
SVN_ERR(svn_sqlite__reset(stmt));
- SVN_ERR(svn_wc__db_depth_get_info(NULL, &del_kind, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL,
- b->wcroot, relpath, op_depth,
- iterpool, iterpool));
- if (del_kind == svn_node_dir)
- SVN_ERR(svn_wc__wq_build_dir_remove(&work_item, b->db,
+ if (old_kind == svn_node_dir)
+ SVN_ERR(svn_wc__wq_build_dir_remove(&work_items, b->db,
b->wcroot->abspath, local_abspath,
FALSE /* recursive */,
- iterpool, iterpool));
+ scratch_pool, iterpool));
else
- SVN_ERR(svn_wc__wq_build_file_remove(&work_item, b->db,
+ SVN_ERR(svn_wc__wq_build_file_remove(&work_items, b->db,
b->wcroot->abspath, local_abspath,
- iterpool, iterpool));
- SVN_ERR(svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
- iterpool));
-
- if (!is_conflicted)
- SVN_ERR(update_move_list_add(b->wcroot, relpath,
- svn_wc_notify_update_delete,
- del_kind,
- svn_wc_notify_state_inapplicable,
- svn_wc_notify_state_inapplicable));
- svn_pool_destroy(iterpool);
- }
+ scratch_pool, iterpool));
- /* Deleting the ROWS is valid so long as we update the parent before
- committing the transaction. The removed rows could have been
- replacing a lower layer in which case we need to add base-deleted
- rows. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_SELECT_HIGHEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, parent_relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- op_depth_below = svn_sqlite__column_int(stmt, 0);
- SVN_ERR(svn_sqlite__reset(stmt));
- if (have_row)
- {
- /* Remove non-shadowing nodes. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_DELETE_NO_LOWER_LAYER));
- SVN_ERR(svn_sqlite__bindf(stmt, "isdd", b->wcroot->wc_id, relpath,
- op_depth, op_depth_below));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- /* Convert remaining shadowing nodes to presence='base-deleted'. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_REPLACE_WITH_BASE_DELETED));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
- else
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_DELETE_WORKING_OP_DEPTH));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ svn_pool_destroy(iterpool);
}
- /* Retract any base-delete. */
- SVN_ERR(svn_wc__db_retract_parent_delete(b->wcroot, relpath, op_depth,
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-tc_editor_copy(void *baton,
- const char *src_relpath,
- svn_revnum_t src_revision,
- const char *dst_relpath,
- svn_revnum_t replaces_rev,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
-static svn_error_t *
-tc_editor_move(void *baton,
- const char *src_relpath,
- svn_revnum_t src_revision,
- const char *dst_relpath,
- svn_revnum_t replaces_rev,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
-static svn_error_t *
-tc_editor_rotate(void *baton,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions,
- apr_pool_t *scratch_pool)
-{
- return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
-}
-
-static svn_error_t *
-tc_editor_complete(void *baton,
- apr_pool_t *scratch_pool)
-{
- return SVN_NO_ERROR;
-}
+ /* Only notify if add_file/add_dir is not going to notify */
+ if (conflict || (new_kind == svn_node_none))
+ SVN_ERR(update_move_list_add(b->wcroot, relpath, b->db,
+ svn_wc_notify_update_delete,
+ new_kind,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ conflict, work_items, scratch_pool));
+ else if (work_items)
+ SVN_ERR(svn_wc__db_wq_add_internal(b->wcroot, work_items,
+ scratch_pool));
-static svn_error_t *
-tc_editor_abort(void *baton,
- apr_pool_t *scratch_pool)
-{
return SVN_NO_ERROR;
}
-/* The editor callback table implementing the receiver. */
-static const svn_editor_cb_many_t editor_ops = {
- tc_editor_add_directory,
- tc_editor_add_file,
- tc_editor_add_symlink,
- tc_editor_add_absent,
- tc_editor_alter_directory,
- tc_editor_alter_file,
- tc_editor_alter_symlink,
- tc_editor_delete,
- tc_editor_copy,
- tc_editor_move,
- tc_editor_rotate,
- tc_editor_complete,
- tc_editor_abort
-};
-
-
/*
* Driver code.
*
@@ -1352,73 +1343,11 @@ static const svn_editor_cb_many_t editor_ops = {
* single-revision.
*/
-/* Set *OPERATION, *LOCAL_CHANGE, *INCOMING_CHANGE, *OLD_VERSION, *NEW_VERSION
- * to reflect the tree conflict on the victim SRC_ABSPATH in DB.
- *
- * If SRC_ABSPATH is not a tree-conflict victim, return an error.
- */
-static svn_error_t *
-get_tc_info(svn_wc_operation_t *operation,
- svn_wc_conflict_reason_t *local_change,
- svn_wc_conflict_action_t *incoming_change,
- const char **move_src_op_root_abspath,
- svn_wc_conflict_version_t **old_version,
- svn_wc_conflict_version_t **new_version,
- svn_wc__db_t *db,
- const char *src_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const apr_array_header_t *locations;
- svn_boolean_t tree_conflicted;
- svn_skel_t *conflict_skel;
-
- /* Check for tree conflict on src. */
- SVN_ERR(svn_wc__db_read_conflict(&conflict_skel, db,
- src_abspath,
- scratch_pool, scratch_pool));
- if (!conflict_skel)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("'%s' is not in conflict"),
- svn_dirent_local_style(src_abspath,
- scratch_pool));
-
- SVN_ERR(svn_wc__conflict_read_info(operation, &locations,
- NULL, NULL, &tree_conflicted,
- db, src_abspath,
- conflict_skel, result_pool,
- scratch_pool));
- if ((*operation != svn_wc_operation_update
- && *operation != svn_wc_operation_switch)
- || !tree_conflicted)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("'%s' is not a tree-conflict victim"),
- svn_dirent_local_style(src_abspath,
- scratch_pool));
- if (locations)
- {
- SVN_ERR_ASSERT(locations->nelts >= 2);
- *old_version = APR_ARRAY_IDX(locations, 0,
- svn_wc_conflict_version_t *);
- *new_version = APR_ARRAY_IDX(locations, 1,
- svn_wc_conflict_version_t *);
- }
-
- SVN_ERR(svn_wc__conflict_read_tree_conflict(local_change,
- incoming_change,
- move_src_op_root_abspath,
- db, src_abspath,
- conflict_skel, scratch_pool,
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
/* Return *PROPS, *CHECKSUM, *CHILDREN and *KIND for LOCAL_RELPATH at
OP_DEPTH provided the row exists. Return *KIND of svn_node_none if
- the row does not exist. *CHILDREN is a sorted array of basenames of
- type 'const char *', rather than a hash, to allow the driver to
- process children in a defined order. */
+ the row does not exist, or only describes a delete of a lower op-depth.
+ *CHILDREN is a sorted array of basenames of type 'const char *', rather
+ than a hash, to allow the driver to process children in a defined order. */
static svn_error_t *
get_info(apr_hash_t **props,
const svn_checksum_t **checksum,
@@ -1430,64 +1359,68 @@ get_info(apr_hash_t **props,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- apr_hash_t *hash_children;
- apr_array_header_t *sorted_children;
+ svn_wc__db_status_t status;
+ const char *repos_relpath;
+ svn_node_kind_t db_kind;
svn_error_t *err;
- int i;
- err = svn_wc__db_depth_get_info(NULL, kind, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, checksum, NULL, NULL, props,
+ err = svn_wc__db_depth_get_info(&status, &db_kind, NULL, &repos_relpath, NULL,
+ NULL, NULL, NULL, NULL, checksum, NULL,
+ NULL, props,
wcroot, local_relpath, op_depth,
result_pool, scratch_pool);
- if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+
+ /* If there is no node at this depth, or only a node that describes a delete
+ of a lower layer we report this node as not existing. */
+ if ((err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ || (!err && status != svn_wc__db_status_added
+ && status != svn_wc__db_status_normal))
{
svn_error_clear(err);
- *kind = svn_node_none;
+
+ if (kind)
+ *kind = svn_node_none;
+ if (checksum)
+ *checksum = NULL;
+ if (props)
+ *props = NULL;
+ if (children)
+ *children = apr_array_make(result_pool, 0, sizeof(const char *));
+
+ return SVN_NO_ERROR;
}
else
SVN_ERR(err);
+ if (kind)
+ *kind = db_kind;
- SVN_ERR(svn_wc__db_get_children_op_depth(&hash_children, wcroot,
- local_relpath, op_depth,
- scratch_pool, scratch_pool));
-
- sorted_children = svn_sort__hash(hash_children,
- svn_sort_compare_items_lexically,
- scratch_pool);
-
- *children = apr_array_make(result_pool, sorted_children->nelts,
- sizeof(const char *));
- for (i = 0; i < sorted_children->nelts; ++i)
- APR_ARRAY_PUSH(*children, const char *)
- = apr_pstrdup(result_pool, APR_ARRAY_IDX(sorted_children, i,
- svn_sort__item_t).key);
-
- return SVN_NO_ERROR;
-}
-
-/* Return TRUE if SRC_CHILDREN and DST_CHILDREN represent the same
- children, FALSE otherwise. SRC_CHILDREN and DST_CHILDREN are
- sorted arrays of basenames of type 'const char *'. */
-static svn_boolean_t
-children_match(apr_array_header_t *src_children,
- apr_array_header_t *dst_children) { int i;
+ if (children && db_kind == svn_node_dir)
+ {
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
- if (src_children->nelts != dst_children->nelts)
- return FALSE;
+ *children = apr_array_make(result_pool, 16, sizeof(const char *));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
+ op_depth));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
+ {
+ const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- for(i = 0; i < src_children->nelts; ++i)
- {
- const char *src_child =
- APR_ARRAY_IDX(src_children, i, const char *);
- const char *dst_child =
- APR_ARRAY_IDX(dst_children, i, const char *);
+ APR_ARRAY_PUSH(*children, const char *)
+ = svn_relpath_basename(child_relpath, result_pool);
- if (strcmp(src_child, dst_child))
- return FALSE;
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
}
+ else if (children)
+ *children = apr_array_make(result_pool, 0, sizeof(const char *));
- return TRUE;
+ return SVN_NO_ERROR;
}
/* Return TRUE if SRC_PROPS and DST_PROPS contain the same properties,
@@ -1516,97 +1449,77 @@ props_match(svn_boolean_t *match,
/* ### Drive TC_EDITOR so as to ...
*/
static svn_error_t *
-update_moved_away_node(svn_editor_t *tc_editor,
+update_moved_away_node(node_move_baton_t *nmb,
+ svn_wc__db_wcroot_t *wcroot,
const char *src_relpath,
const char *dst_relpath,
- int src_op_depth,
- const char *move_root_dst_relpath,
- svn_revnum_t move_root_dst_revision,
- svn_wc__db_t *db,
- svn_wc__db_wcroot_t *wcroot,
apr_pool_t *scratch_pool)
{
+ update_move_baton_t *b = nmb->umb;
svn_node_kind_t src_kind, dst_kind;
const svn_checksum_t *src_checksum, *dst_checksum;
apr_hash_t *src_props, *dst_props;
apr_array_header_t *src_children, *dst_children;
- int dst_op_depth = relpath_depth(move_root_dst_relpath);
+
+ if (b->cancel_func)
+ SVN_ERR(b->cancel_func(b->cancel_baton));
SVN_ERR(get_info(&src_props, &src_checksum, &src_children, &src_kind,
- src_relpath, src_op_depth,
+ src_relpath, b->src_op_depth,
wcroot, scratch_pool, scratch_pool));
SVN_ERR(get_info(&dst_props, &dst_checksum, &dst_children, &dst_kind,
- dst_relpath, dst_op_depth,
+ dst_relpath, b->dst_op_depth,
wcroot, scratch_pool, scratch_pool));
if (src_kind == svn_node_none
|| (dst_kind != svn_node_none && src_kind != dst_kind))
{
- SVN_ERR(svn_editor_delete(tc_editor, dst_relpath,
- move_root_dst_revision));
+ SVN_ERR(tc_editor_delete(nmb, dst_relpath, dst_kind, src_kind,
+ scratch_pool));
}
+ if (nmb->skip)
+ return SVN_NO_ERROR;
+
if (src_kind != svn_node_none && src_kind != dst_kind)
{
if (src_kind == svn_node_file || src_kind == svn_node_symlink)
{
- svn_stream_t *contents;
-
- SVN_ERR(svn_wc__db_pristine_read(&contents, NULL, db,
- wcroot->abspath, src_checksum,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_editor_add_file(tc_editor, dst_relpath,
- src_checksum, contents, src_props,
- move_root_dst_revision));
+ SVN_ERR(tc_editor_add_file(nmb, dst_relpath, dst_kind,
+ src_checksum, src_props, scratch_pool));
}
else if (src_kind == svn_node_dir)
{
- SVN_ERR(svn_editor_add_directory(tc_editor, dst_relpath,
- src_children, src_props,
- move_root_dst_revision));
+ SVN_ERR(tc_editor_add_directory(nmb, dst_relpath, dst_kind,
+ src_props, scratch_pool));
}
}
else if (src_kind != svn_node_none)
{
- svn_boolean_t match;
- apr_hash_t *props;
-
- SVN_ERR(props_match(&match, src_props, dst_props, scratch_pool));
- props = match ? NULL: src_props;
+ svn_boolean_t props_equal;
+ SVN_ERR(props_match(&props_equal, src_props, dst_props, scratch_pool));
if (src_kind == svn_node_file || src_kind == svn_node_symlink)
{
- svn_stream_t *contents;
-
- if (svn_checksum_match(src_checksum, dst_checksum))
- src_checksum = NULL;
-
- if (src_checksum)
- SVN_ERR(svn_wc__db_pristine_read(&contents, NULL, db,
- wcroot->abspath, src_checksum,
- scratch_pool, scratch_pool));
- else
- contents = NULL;
-
- if (props || src_checksum)
- SVN_ERR(svn_editor_alter_file(tc_editor, dst_relpath,
- move_root_dst_revision,
- props, src_checksum, contents));
+ if (!props_equal || !svn_checksum_match(src_checksum, dst_checksum))
+ SVN_ERR(tc_editor_alter_file(nmb, dst_relpath,
+ dst_checksum, src_checksum,
+ dst_props, src_props, scratch_pool));
}
else if (src_kind == svn_node_dir)
{
- apr_array_header_t *children
- = children_match(src_children, dst_children) ? NULL : src_children;
-
- if (props || children)
- SVN_ERR(svn_editor_alter_directory(tc_editor, dst_relpath,
- move_root_dst_revision,
- children, props));
+ if (!props_equal)
+ SVN_ERR(tc_editor_alter_directory(nmb, dst_relpath,
+ dst_props, src_props,
+ scratch_pool));
}
}
+ if (nmb->skip)
+ return SVN_NO_ERROR;
+
if (src_kind == svn_node_dir)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
@@ -1615,8 +1528,12 @@ update_moved_away_node(svn_editor_t *tc_editor,
while (i < src_children->nelts || j < dst_children->nelts)
{
const char *child_name;
- const char *src_child_relpath, *dst_child_relpath;
svn_boolean_t src_only = FALSE, dst_only = FALSE;
+ node_move_baton_t cnmb = { 0 };
+
+ cnmb.pb = nmb;
+ cnmb.umb = nmb->umb;
+ cnmb.shadowed = nmb->shadowed;
svn_pool_clear(iterpool);
if (i >= src_children->nelts)
@@ -1645,130 +1562,28 @@ update_moved_away_node(svn_editor_t *tc_editor,
child_name = dst_only ? dst_name : src_name;
}
- src_child_relpath = svn_relpath_join(src_relpath, child_name,
- iterpool);
- dst_child_relpath = svn_relpath_join(dst_relpath, child_name,
- iterpool);
+ cnmb.src_relpath = svn_relpath_join(src_relpath, child_name,
+ iterpool);
+ cnmb.dst_relpath = svn_relpath_join(dst_relpath, child_name,
+ iterpool);
- SVN_ERR(update_moved_away_node(tc_editor, src_child_relpath,
- dst_child_relpath, src_op_depth,
- move_root_dst_relpath,
- move_root_dst_revision,
- db, wcroot, scratch_pool));
+ if (!cnmb.shadowed)
+ SVN_ERR(check_node_shadowed(&cnmb.shadowed, wcroot,
+ cnmb.dst_relpath, b->dst_op_depth,
+ iterpool));
+
+ SVN_ERR(update_moved_away_node(&cnmb, wcroot, cnmb.src_relpath,
+ cnmb.dst_relpath, iterpool));
if (!dst_only)
++i;
if (!src_only)
++j;
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Update the single op-depth layer in the move destination subtree
- rooted at DST_RELPATH to make it match the move source subtree
- rooted at SRC_RELPATH. */
-static svn_error_t *
-replace_moved_layer(const char *src_relpath,
- const char *dst_relpath,
- int src_op_depth,
- svn_wc__db_wcroot_t *wcroot,
- apr_pool_t *scratch_pool)
-{
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
- int dst_op_depth = relpath_depth(dst_relpath);
- /* Replace entire subtree at one op-depth. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_LOCAL_RELPATH_OP_DEPTH));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- src_relpath, src_op_depth));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- while (have_row)
- {
- svn_error_t *err;
- svn_sqlite__stmt_t *stmt2;
- const char *src_cp_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- const char *dst_cp_relpath
- = svn_relpath_join(dst_relpath,
- svn_relpath_skip_ancestor(src_relpath,
- src_cp_relpath),
- scratch_pool);
-
- err = svn_sqlite__get_statement(&stmt2, wcroot->sdb,
- STMT_COPY_NODE_MOVE);
- if (!err)
- err = svn_sqlite__bindf(stmt2, "isdsds", wcroot->wc_id,
- src_cp_relpath, src_op_depth,
- dst_cp_relpath, dst_op_depth,
- svn_relpath_dirname(dst_cp_relpath,
- scratch_pool));
- if (!err)
- err = svn_sqlite__step_done(stmt2);
- if (err)
- return svn_error_compose_create(err, svn_sqlite__reset(stmt));
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (nmb->skip) /* Does parent now want a skip? */
+ break;
+ }
}
- SVN_ERR(svn_sqlite__reset(stmt));
-
- return SVN_NO_ERROR;
-}
-
-/* Transfer changes from the move source to the move destination.
- *
- * Drive the editor TC_EDITOR with the difference between DST_RELPATH
- * (at its own op-depth) and SRC_RELPATH (at op-depth zero).
- *
- * Then update the single op-depth layer in the move destination subtree
- * rooted at DST_RELPATH to make it match the move source subtree
- * rooted at SRC_RELPATH.
- *
- * ### And the other params?
- */
-static svn_error_t *
-drive_tree_conflict_editor(svn_editor_t *tc_editor,
- const char *src_relpath,
- const char *dst_relpath,
- int src_op_depth,
- svn_wc_operation_t operation,
- svn_wc_conflict_reason_t local_change,
- svn_wc_conflict_action_t incoming_change,
- svn_wc_conflict_version_t *old_version,
- svn_wc_conflict_version_t *new_version,
- svn_wc__db_t *db,
- svn_wc__db_wcroot_t *wcroot,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- /*
- * Refuse to auto-resolve unsupported tree conflicts.
- */
- /* ### Only handle conflicts created by update/switch operations for now. */
- if (operation != svn_wc_operation_update &&
- operation != svn_wc_operation_switch)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("Cannot auto-resolve tree-conflict on '%s'"),
- svn_dirent_local_style(
- svn_dirent_join(wcroot->abspath,
- src_relpath, scratch_pool),
- scratch_pool));
-
- /* We walk the move source (i.e. the post-update tree), comparing each node
- * with the equivalent node at the move destination and applying the update
- * to nodes at the move destination. */
- SVN_ERR(update_moved_away_node(tc_editor, src_relpath, dst_relpath,
- src_op_depth,
- dst_relpath, old_version->peg_rev,
- db, wcroot, scratch_pool));
-
- SVN_ERR(replace_moved_layer(src_relpath, dst_relpath, src_op_depth,
- wcroot, scratch_pool));
-
- SVN_ERR(svn_editor_complete(tc_editor));
return SVN_NO_ERROR;
}
@@ -1788,14 +1603,13 @@ suitable_for_move(svn_wc__db_wcroot_t *wcroot,
STMT_SELECT_BASE_NODE));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- {
- revision = svn_sqlite__column_revnum(stmt, 4);
- repos_relpath = svn_sqlite__column_text(stmt, 1, scratch_pool);
- }
- SVN_ERR(svn_sqlite__reset(stmt));
if (!have_row)
- return SVN_NO_ERROR; /* Return an error? */
+ return svn_error_trace(svn_sqlite__reset(stmt));
+
+ revision = svn_sqlite__column_revnum(stmt, 4);
+ repos_relpath = svn_sqlite__column_text(stmt, 1, scratch_pool);
+
+ SVN_ERR(svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_REPOS_PATH_REVISION));
@@ -1816,22 +1630,17 @@ suitable_for_move(svn_wc__db_wcroot_t *wcroot,
svn_sqlite__reset(stmt),
_("Cannot apply update because move source "
"%s' is a mixed-revision working copy"),
- svn_dirent_local_style(svn_dirent_join(
- wcroot->abspath,
- local_relpath,
- scratch_pool),
- scratch_pool));
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
if (strcmp(relpath, svn_sqlite__column_text(stmt, 1, NULL)))
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
svn_sqlite__reset(stmt),
_("Cannot apply update because move source "
"'%s' is a switched subtree"),
- svn_dirent_local_style(svn_dirent_join(
- wcroot->abspath,
- local_relpath,
- scratch_pool),
- scratch_pool));
+ path_for_error_message(wcroot,
+ local_relpath,
+ scratch_pool));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
@@ -1845,96 +1654,113 @@ suitable_for_move(svn_wc__db_wcroot_t *wcroot,
/* The body of svn_wc__db_update_moved_away_conflict_victim(), which see.
*/
static svn_error_t *
-update_moved_away_conflict_victim(svn_wc__db_t *db,
+update_moved_away_conflict_victim(svn_revnum_t *old_rev,
+ svn_revnum_t *new_rev,
+ svn_wc__db_t *db,
svn_wc__db_wcroot_t *wcroot,
- const char *victim_relpath,
+ const char *local_relpath,
+ const char *delete_relpath,
svn_wc_operation_t operation,
- svn_wc_conflict_reason_t local_change,
- svn_wc_conflict_action_t incoming_change,
- const char *move_src_op_root_relpath,
- svn_wc_conflict_version_t *old_version,
- svn_wc_conflict_version_t *new_version,
+ svn_wc_conflict_action_t action,
+ svn_wc_conflict_reason_t reason,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
- svn_editor_t *tc_editor;
- struct tc_editor_baton *tc_editor_baton;
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t have_row;
- const char *dummy1, *dummy2, *dummy3;
- int src_op_depth;
- const char *move_root_dst_abspath;
+ update_move_baton_t umb = { NULL };
+ const char *src_relpath, *dst_relpath;
+ svn_wc_conflict_version_t old_version;
+ svn_wc_conflict_version_t new_version;
+ apr_int64_t repos_id;
+ node_move_baton_t nmb = { 0 };
- /* ### assumes wc write lock already held */
+ SVN_ERR_ASSERT(svn_relpath_skip_ancestor(delete_relpath, local_relpath));
/* Construct editor baton. */
- tc_editor_baton = apr_pcalloc(scratch_pool, sizeof(*tc_editor_baton));
- SVN_ERR(svn_wc__db_op_depth_moved_to(
- &dummy1, &tc_editor_baton->move_root_dst_relpath, &dummy2, &dummy3,
- relpath_depth(move_src_op_root_relpath) - 1,
- wcroot, victim_relpath, scratch_pool, scratch_pool));
- if (tc_editor_baton->move_root_dst_relpath == NULL)
+
+ SVN_ERR(find_src_op_depth(&umb.src_op_depth, wcroot,
+ local_relpath, relpath_depth(delete_relpath),
+ scratch_pool));
+
+ SVN_ERR(svn_wc__db_scan_moved_to_internal(&src_relpath, &dst_relpath, NULL,
+ wcroot, local_relpath,
+ umb.src_op_depth,
+ scratch_pool, scratch_pool));
+
+ if (dst_relpath == NULL)
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("The node '%s' has not been moved away"),
- svn_dirent_local_style(
- svn_dirent_join(wcroot->abspath, victim_relpath,
- scratch_pool),
- scratch_pool));
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
- move_root_dst_abspath
- = svn_dirent_join(wcroot->abspath, tc_editor_baton->move_root_dst_relpath,
- scratch_pool);
- SVN_ERR(svn_wc__write_check(db, move_root_dst_abspath, scratch_pool));
+ umb.dst_op_depth = relpath_depth(dst_relpath);
- tc_editor_baton->operation = operation;
- tc_editor_baton->old_version= old_version;
- tc_editor_baton->new_version= new_version;
- tc_editor_baton->db = db;
- tc_editor_baton->wcroot = wcroot;
- tc_editor_baton->result_pool = scratch_pool;
+ SVN_ERR(verify_write_lock(wcroot, src_relpath, scratch_pool));
+ SVN_ERR(verify_write_lock(wcroot, dst_relpath, scratch_pool));
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_HIGHEST_WORKING_NODE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- move_src_op_root_relpath,
- relpath_depth(move_src_op_root_relpath)));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- src_op_depth = svn_sqlite__column_int(stmt, 0);
- SVN_ERR(svn_sqlite__reset(stmt));
- if (!have_row)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("'%s' is not deleted"),
- svn_dirent_local_style(
- svn_dirent_join(wcroot->abspath, victim_relpath,
- scratch_pool),
- scratch_pool));
- if (src_op_depth == 0)
- SVN_ERR(suitable_for_move(wcroot, victim_relpath, scratch_pool));
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &new_version.node_kind,
+ &new_version.peg_rev,
+ &new_version.path_in_repos, &repos_id,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ wcroot, src_relpath, umb.src_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__db_fetch_repos_info(&new_version.repos_url,
+ &new_version.repos_uuid,
+ wcroot, repos_id,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &old_version.node_kind,
+ &old_version.peg_rev,
+ &old_version.path_in_repos, &repos_id,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ wcroot, dst_relpath, umb.dst_op_depth,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(svn_wc__db_fetch_repos_info(&old_version.repos_url,
+ &old_version.repos_uuid,
+ wcroot, repos_id,
+ scratch_pool));
+ *old_rev = old_version.peg_rev;
+ *new_rev = new_version.peg_rev;
+
+ umb.operation = operation;
+ umb.old_version= &old_version;
+ umb.new_version= &new_version;
+ umb.db = db;
+ umb.wcroot = wcroot;
+ umb.cancel_func = cancel_func;
+ umb.cancel_baton = cancel_baton;
+
+ if (umb.src_op_depth == 0)
+ SVN_ERR(suitable_for_move(wcroot, src_relpath, scratch_pool));
/* Create a new, and empty, list for notification information. */
SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
STMT_CREATE_UPDATE_MOVE_LIST));
- /* Create the editor... */
- SVN_ERR(svn_editor_create(&tc_editor, tc_editor_baton,
- cancel_func, cancel_baton,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_editor_setcb_many(tc_editor, &editor_ops, scratch_pool));
-
- /* ... and drive it. */
- SVN_ERR(drive_tree_conflict_editor(tc_editor,
- victim_relpath,
- tc_editor_baton->move_root_dst_relpath,
- src_op_depth,
- operation,
- local_change, incoming_change,
- tc_editor_baton->old_version,
- tc_editor_baton->new_version,
- db, wcroot,
- cancel_func, cancel_baton,
- scratch_pool));
+
+ /* Drive the editor... */
+
+ nmb.umb = &umb;
+ nmb.src_relpath = src_relpath;
+ nmb.dst_relpath = dst_relpath;
+ /* nmb.shadowed = FALSE; */
+ /* nmb.edited = FALSE; */
+ /* nmb.skip_children = FALSE; */
+
+ /* We walk the move source (i.e. the post-update tree), comparing each node
+ * with the equivalent node at the move destination and applying the update
+ * to nodes at the move destination. */
+ SVN_ERR(update_moved_away_node(&nmb, wcroot, src_relpath, dst_relpath,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__db_op_copy_layer_internal(wcroot, src_relpath,
+ umb.src_op_depth,
+ dst_relpath, NULL, NULL,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -1942,58 +1768,43 @@ update_moved_away_conflict_victim(svn_wc__db_t *db,
svn_error_t *
svn_wc__db_update_moved_away_conflict_victim(svn_wc__db_t *db,
- const char *victim_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
+ const char *local_abspath,
+ const char *delete_op_abspath,
+ svn_wc_operation_t operation,
+ svn_wc_conflict_action_t action,
+ svn_wc_conflict_reason_t reason,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
+ svn_revnum_t old_rev, new_rev;
const char *local_relpath;
- svn_wc_operation_t operation;
- svn_wc_conflict_reason_t local_change;
- svn_wc_conflict_action_t incoming_change;
- svn_wc_conflict_version_t *old_version;
- svn_wc_conflict_version_t *new_version;
- const char *move_src_op_root_abspath, *move_src_op_root_relpath;
+ const char *delete_relpath;
/* ### Check for mixed-rev src or dst? */
- SVN_ERR(get_tc_info(&operation, &local_change, &incoming_change,
- &move_src_op_root_abspath,
- &old_version, &new_version,
- db, victim_abspath,
- scratch_pool, scratch_pool));
-
- SVN_ERR(svn_wc__write_check(db, move_src_op_root_abspath, scratch_pool));
-
SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
- db, victim_abspath,
+ db, local_abspath,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- move_src_op_root_relpath
- = svn_dirent_skip_ancestor(wcroot->abspath, move_src_op_root_abspath);
+ delete_relpath
+ = svn_dirent_skip_ancestor(wcroot->abspath, delete_op_abspath);
SVN_WC__DB_WITH_TXN(
update_moved_away_conflict_victim(
- db, wcroot, local_relpath,
- operation, local_change, incoming_change,
- move_src_op_root_relpath,
- old_version, new_version,
+ &old_rev, &new_rev,
+ db, wcroot, local_relpath, delete_relpath,
+ operation, action, reason,
cancel_func, cancel_baton,
scratch_pool),
wcroot);
/* Send all queued up notifications. */
- SVN_ERR(svn_wc__db_update_move_list_notify(wcroot,
- (old_version
- ? old_version->peg_rev
- : SVN_INVALID_REVNUM),
- (new_version
- ? new_version->peg_rev
- : SVN_INVALID_REVNUM),
+ SVN_ERR(svn_wc__db_update_move_list_notify(wcroot, old_rev, new_rev,
notify_func, notify_baton,
scratch_pool));
if (notify_func)
@@ -2008,7 +1819,7 @@ svn_wc__db_update_moved_away_conflict_victim(svn_wc__db_t *db,
notify->kind = svn_node_none;
notify->content_state = svn_wc_notify_state_inapplicable;
notify->prop_state = svn_wc_notify_state_inapplicable;
- notify->revision = new_version->peg_rev;
+ notify->revision = new_rev;
notify_func(notify_baton, notify, scratch_pool);
}
@@ -2017,11 +1828,12 @@ svn_wc__db_update_moved_away_conflict_victim(svn_wc__db_t *db,
}
/* Set *CAN_BUMP to TRUE if DEPTH is sufficient to cover the entire
- BASE tree at LOCAL_RELPATH, to FALSE otherwise. */
+ tree LOCAL_RELPATH at OP_DEPTH, to FALSE otherwise. */
static svn_error_t *
depth_sufficient_to_bump(svn_boolean_t *can_bump,
- const char *local_relpath,
svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
svn_depth_t depth,
apr_pool_t *scratch_pool)
{
@@ -2038,21 +1850,21 @@ depth_sufficient_to_bump(svn_boolean_t *can_bump,
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_OP_DEPTH_CHILDREN));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
- local_relpath, 0));
+ local_relpath, op_depth));
break;
case svn_depth_files:
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_HAS_NON_FILE_CHILDREN));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
- local_relpath));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ local_relpath, op_depth));
break;
case svn_depth_immediates:
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_HAS_GRANDCHILDREN));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
- local_relpath));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+ local_relpath, op_depth));
break;
default:
SVN_ERR_MALFUNCTION();
@@ -2068,6 +1880,7 @@ depth_sufficient_to_bump(svn_boolean_t *can_bump,
static svn_error_t *
bump_mark_tree_conflict(svn_wc__db_wcroot_t *wcroot,
const char *move_src_root_relpath,
+ int src_op_depth,
const char *move_src_op_root_relpath,
const char *move_dst_op_root_relpath,
svn_wc__db_t *db,
@@ -2084,18 +1897,29 @@ bump_mark_tree_conflict(svn_wc__db_wcroot_t *wcroot,
svn_node_kind_t new_kind;
svn_wc_conflict_version_t *old_version;
svn_wc_conflict_version_t *new_version;
+ svn_skel_t *conflict;
+
+ /* Verify precondition: We are allowed to set a tree conflict here. */
+ SVN_ERR(verify_write_lock(wcroot, move_src_root_relpath, scratch_pool));
/* Read new (post-update) information from the new move source BASE node. */
- SVN_ERR(svn_wc__db_base_get_info_internal(NULL, &new_kind, &new_rev,
- &new_repos_relpath, &repos_id,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- wcroot, move_src_op_root_relpath,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &new_kind, &new_rev,
+ &new_repos_relpath, &repos_id,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ wcroot, move_src_op_root_relpath,
+ src_op_depth, scratch_pool, scratch_pool));
SVN_ERR(svn_wc__db_fetch_repos_info(&repos_root_url, &repos_uuid,
- wcroot->sdb, repos_id, scratch_pool));
+ wcroot, repos_id, scratch_pool));
+
+ /* Read old (pre-update) information from the move destination node.
- /* Read old (pre-update) information from the move destination node. */
+ This potentially touches nodes that aren't locked by us, but that is not
+ a problem because we have a SQLite write lock here, and all sqlite
+ operations that affect move stability use a sqlite lock as well.
+ (And affecting the move itself requires a write lock on the node that
+ we do own the lock for: the move source)
+ */
SVN_ERR(svn_wc__db_depth_get_info(NULL, &old_kind, &old_rev,
&old_repos_relpath, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
@@ -2103,6 +1927,21 @@ bump_mark_tree_conflict(svn_wc__db_wcroot_t *wcroot,
relpath_depth(move_dst_op_root_relpath),
scratch_pool, scratch_pool));
+ if (strcmp(move_src_root_relpath, move_src_op_root_relpath))
+ {
+ /* We have information for the op-root, but need it for the node that
+ we are putting the tree conflict on. Luckily we know that we have
+ a clean BASE */
+
+ const char *rpath = svn_relpath_skip_ancestor(move_src_op_root_relpath,
+ move_src_root_relpath);
+
+ old_repos_relpath = svn_relpath_join(old_repos_relpath, rpath,
+ scratch_pool);
+ new_repos_relpath = svn_relpath_join(new_repos_relpath, rpath,
+ scratch_pool);
+ }
+
old_version = svn_wc_conflict_version_create2(
repos_root_url, repos_uuid, old_repos_relpath, old_rev,
old_kind, scratch_pool);
@@ -2110,38 +1949,202 @@ bump_mark_tree_conflict(svn_wc__db_wcroot_t *wcroot,
repos_root_url, repos_uuid, new_repos_relpath, new_rev,
new_kind, scratch_pool);
- SVN_ERR(mark_tree_conflict(move_src_root_relpath,
- wcroot, db, old_version, new_version,
- move_dst_op_root_relpath,
- svn_wc_operation_update,
- old_kind, new_kind,
- old_repos_relpath,
- svn_wc_conflict_reason_moved_away,
- svn_wc_conflict_action_edit,
- move_src_op_root_relpath,
- scratch_pool));
+ SVN_ERR(create_tree_conflict(&conflict, wcroot, move_src_root_relpath,
+ move_dst_op_root_relpath,
+ db, old_version, new_version,
+ svn_wc_operation_update,
+ old_kind, new_kind,
+ old_repos_relpath,
+ svn_wc_conflict_reason_moved_away,
+ svn_wc_conflict_action_edit,
+ move_src_op_root_relpath,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(update_move_list_add(wcroot, move_src_root_relpath, db,
+ svn_wc_notify_tree_conflict,
+ new_kind,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ conflict, NULL, scratch_pool));
return SVN_NO_ERROR;
}
-/* Bump LOCAL_RELPATH, and all the children of LOCAL_RELPATH, that are
- moved-to at op-depth greater than OP_DEPTH. SRC_DONE is a hash
- with keys that are 'const char *' relpaths that have already been
- bumped. Any bumped paths are added to SRC_DONE. */
+/* Checks if SRC_RELPATH is within BUMP_DEPTH from BUMP_ROOT. Sets
+ * *SKIP to TRUE if the node should be skipped, otherwise to FALSE.
+ * Sets *SRC_DEPTH to the remaining depth at SRC_RELPATH.
+ */
+static svn_error_t *
+check_bump_layer(svn_boolean_t *skip,
+ svn_depth_t *src_depth,
+ const char *bump_root,
+ svn_depth_t bump_depth,
+ const char *src_relpath,
+ svn_node_kind_t src_kind,
+ apr_pool_t *scratch_pool)
+{
+ const char *relpath;
+
+ *skip = FALSE;
+ *src_depth = bump_depth;
+
+ relpath = svn_relpath_skip_ancestor(bump_root, src_relpath);
+
+ if (!relpath)
+ *skip = TRUE;
+
+ if (bump_depth == svn_depth_infinity)
+ return SVN_NO_ERROR;
+
+ if (relpath && *relpath == '\0')
+ return SVN_NO_ERROR;
+
+ switch (bump_depth)
+ {
+ case svn_depth_empty:
+ *skip = TRUE;
+ break;
+
+ case svn_depth_files:
+ if (src_kind != svn_node_file)
+ {
+ *skip = TRUE;
+ break;
+ }
+ /* Fallthrough */
+ case svn_depth_immediates:
+ if (!relpath || relpath_depth(relpath) > 1)
+ *skip = TRUE;
+
+ *src_depth = svn_depth_empty;
+ break;
+ default:
+ SVN_ERR_MALFUNCTION();
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* The guts of bump_moved_away: Determines if a move can be bumped to match
+ * the move origin and if so performs this bump.
+ */
+static svn_error_t *
+bump_moved_layer(svn_boolean_t *recurse,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int op_depth,
+ const char *src_relpath,
+ int src_del_depth,
+ svn_depth_t src_depth,
+ const char *dst_relpath,
+ svn_wc__db_t *db,
+ apr_pool_t *scratch_pool)
+{
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ svn_skel_t *conflict;
+ svn_boolean_t can_bump;
+ const char *src_root_relpath;
+
+ SVN_ERR(verify_write_lock(wcroot, local_relpath, scratch_pool));
+
+ *recurse = FALSE;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_HAS_LAYER_BETWEEN));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdd", wcroot->wc_id, local_relpath,
+ op_depth, src_del_depth));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (have_row)
+ return SVN_NO_ERROR;
+
+ if (op_depth == 0)
+ SVN_ERR(depth_sufficient_to_bump(&can_bump, wcroot, src_relpath,
+ op_depth, src_depth, scratch_pool));
+ else
+ /* Having chosen to bump an entire BASE tree move we
+ always have sufficient depth to bump subtree moves. */
+ can_bump = TRUE;
+
+ /* Are we allowed to bump */
+ if (can_bump)
+ {
+ svn_boolean_t locked;
+
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(&locked, wcroot,
+ dst_relpath,
+ FALSE, scratch_pool));
+
+ if (!locked)
+ can_bump = FALSE;
+ }
+
+ src_root_relpath = svn_relpath_prefix(src_relpath, src_del_depth,
+ scratch_pool);
+
+ if (!can_bump)
+ {
+ SVN_ERR(bump_mark_tree_conflict(wcroot, src_relpath, op_depth,
+ src_root_relpath, dst_relpath,
+ db, scratch_pool));
+
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, NULL, NULL,
+ wcroot, src_root_relpath,
+ scratch_pool, scratch_pool));
+
+ /* ### TODO: check this is the right sort of tree-conflict? */
+ if (!conflict)
+ {
+ /* ### TODO: verify moved_here? */
+
+ SVN_ERR(verify_write_lock(wcroot, src_relpath, scratch_pool));
+
+ SVN_ERR(svn_wc__db_op_copy_layer_internal(wcroot,
+ src_relpath, op_depth,
+ dst_relpath, NULL, NULL,
+ scratch_pool));
+
+ *recurse = TRUE;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Internal storage for bump_moved_away() */
+struct bump_pair_t
+{
+ const char *src_relpath;
+ const char *dst_relpath;
+ int src_del_op_depth;
+ svn_node_kind_t src_kind;
+};
+
+/* Bump moves of LOCAL_RELPATH and all its descendants that were
+ originally below LOCAL_RELPATH at op-depth OP_DEPTH.
+ */
static svn_error_t *
bump_moved_away(svn_wc__db_wcroot_t *wcroot,
const char *local_relpath,
int op_depth,
- apr_hash_t *src_done,
svn_depth_t depth,
svn_wc__db_t *db,
- apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
apr_pool_t *iterpool;
+ int i;
+ apr_array_header_t *pairs = apr_array_make(scratch_pool, 32,
+ sizeof(struct bump_pair_t*));
+ /* Build an array, as we can't execute the same Sqlite query recursively */
iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
@@ -2151,126 +2154,48 @@ bump_moved_away(svn_wc__db_wcroot_t *wcroot,
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while(have_row)
{
- svn_sqlite__stmt_t *stmt2;
- const char *src_relpath, *dst_relpath;
- int src_op_depth = svn_sqlite__column_int(stmt, 2);
- svn_error_t *err;
- svn_skel_t *conflict;
- svn_depth_t src_depth = depth;
-
- svn_pool_clear(iterpool);
+ struct bump_pair_t *bp = apr_pcalloc(scratch_pool, sizeof(*bp));
- src_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
- dst_relpath = svn_sqlite__column_text(stmt, 1, iterpool);
+ bp->src_relpath = svn_sqlite__column_text(stmt, 0, scratch_pool);
+ bp->dst_relpath = svn_sqlite__column_text(stmt, 1, scratch_pool);
+ bp->src_del_op_depth = svn_sqlite__column_int(stmt, 2);
+ bp->src_kind = svn_sqlite__column_token(stmt, 3, kind_map);
- if (depth != svn_depth_infinity)
- {
- svn_boolean_t skip_this_src = FALSE;
- svn_node_kind_t src_kind;
+ APR_ARRAY_PUSH(pairs, struct bump_pair_t *) = bp;
- if (strcmp(src_relpath, local_relpath))
- {
- switch (depth)
- {
- case svn_depth_empty:
- skip_this_src = TRUE;
- break;
- case svn_depth_files:
- src_kind = svn_sqlite__column_token(stmt, 3, kind_map);
- if (src_kind != svn_node_file)
- {
- skip_this_src = TRUE;
- break;
- }
- /* Fallthrough */
- case svn_depth_immediates:
- if (strcmp(svn_relpath_dirname(src_relpath, scratch_pool),
- local_relpath))
- skip_this_src = TRUE;
- src_depth = svn_depth_empty;
- break;
- default:
- SVN_ERR_MALFUNCTION();
- }
- }
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
- if (skip_this_src)
- {
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- continue;
- }
- }
+ SVN_ERR(svn_sqlite__reset(stmt));
- err = svn_sqlite__get_statement(&stmt2, wcroot->sdb,
- STMT_HAS_LAYER_BETWEEN);
- if (!err)
- err = svn_sqlite__bindf(stmt2, "isdd", wcroot->wc_id, local_relpath,
- op_depth, src_op_depth);
- if (!err)
- err = svn_sqlite__step(&have_row, stmt2);
- if (!err)
- err = svn_sqlite__reset(stmt2);
- if (!err && !have_row)
- {
- svn_boolean_t can_bump;
- const char *src_root_relpath = src_relpath;
+ for (i = 0; i < pairs->nelts; i++)
+ {
+ struct bump_pair_t *bp = APR_ARRAY_IDX(pairs, i, struct bump_pair_t *);
+ svn_boolean_t skip;
+ svn_depth_t src_wc_depth;
- if (op_depth == 0)
- err = depth_sufficient_to_bump(&can_bump, src_relpath, wcroot,
- src_depth, scratch_pool);
- else
- /* Having chosen to bump an entire BASE tree move we
- always have sufficient depth to bump subtree moves. */
- can_bump = TRUE;
+ svn_pool_clear(iterpool);
- if (!err)
- {
- if (!can_bump)
- {
- err = bump_mark_tree_conflict(wcroot, src_relpath,
- src_root_relpath, dst_relpath,
- db, scratch_pool);
- if (err)
- return svn_error_compose_create(err,
- svn_sqlite__reset(stmt));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- continue;
- }
- while (relpath_depth(src_root_relpath) > src_op_depth)
- src_root_relpath = svn_relpath_dirname(src_root_relpath,
- iterpool);
+ SVN_ERR(check_bump_layer(&skip, &src_wc_depth, local_relpath, depth,
+ bp->src_relpath, bp->src_kind, iterpool));
- if (!svn_hash_gets(src_done, src_relpath))
- {
- svn_hash_sets(src_done,
- apr_pstrdup(result_pool, src_relpath), "");
- err = svn_wc__db_read_conflict_internal(&conflict, wcroot,
- src_root_relpath,
- iterpool, iterpool);
- /* ### TODO: check this is the right sort of tree-conflict? */
- if (!err && !conflict)
- {
- /* ### TODO: verify moved_here? */
- err = replace_moved_layer(src_relpath, dst_relpath,
- op_depth, wcroot, iterpool);
-
- if (!err)
- err = bump_moved_away(wcroot, dst_relpath,
- relpath_depth(dst_relpath),
- src_done, depth, db,
- result_pool, iterpool);
- }
- }
- }
+ if (!skip)
+ {
+ svn_boolean_t recurse;
+
+ SVN_ERR(bump_moved_layer(&recurse, wcroot,
+ local_relpath, op_depth,
+ bp->src_relpath, bp->src_del_op_depth,
+ src_wc_depth, bp->dst_relpath,
+ db, iterpool));
+
+ if (recurse)
+ SVN_ERR(bump_moved_away(wcroot, bp->dst_relpath,
+ relpath_depth(bp->dst_relpath),
+ depth, db, iterpool));
}
-
- if (err)
- return svn_error_compose_create(err, svn_sqlite__reset(stmt));
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
- SVN_ERR(svn_sqlite__reset(stmt));
svn_pool_destroy(iterpool);
@@ -2284,84 +2209,216 @@ svn_wc__db_bump_moved_away(svn_wc__db_wcroot_t *wcroot,
svn_wc__db_t *db,
apr_pool_t *scratch_pool)
{
- apr_hash_t *src_done;
-
SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
STMT_CREATE_UPDATE_MOVE_LIST));
if (local_relpath[0] != '\0')
{
- const char *dummy1, *move_dst_op_root_relpath;
- const char *move_src_root_relpath, *move_src_op_root_relpath;
+ const char *move_dst_op_root_relpath;
+ const char *move_src_root_relpath, *delete_relpath;
+ svn_error_t *err;
/* Is the root of the update moved away? (Impossible for the wcroot) */
- SVN_ERR(svn_wc__db_op_depth_moved_to(&dummy1, &move_dst_op_root_relpath,
- &move_src_root_relpath,
- &move_src_op_root_relpath, 0,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
- if (move_src_root_relpath)
+ err = svn_wc__db_scan_moved_to_internal(&move_src_root_relpath,
+ &move_dst_op_root_relpath,
+ &delete_relpath,
+ wcroot, local_relpath,
+ 0 /* BASE */,
+ scratch_pool, scratch_pool);
+
+ if (err)
+ {
+ if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ }
+ else if (move_src_root_relpath)
{
if (strcmp(move_src_root_relpath, local_relpath))
{
- SVN_ERR(bump_mark_tree_conflict(wcroot, move_src_root_relpath,
- move_src_op_root_relpath,
- move_dst_op_root_relpath,
- db, scratch_pool));
+ /* An ancestor of the path that was updated is moved away.
+
+ If we have a lock on that ancestor, we can mark a tree
+ conflict on it, if we don't we ignore this case. A future
+ update of the ancestor will handle this. */
+ svn_boolean_t locked;
+
+ SVN_ERR(svn_wc__db_wclock_owns_lock_internal(
+ &locked, wcroot,
+ move_src_root_relpath,
+ FALSE, scratch_pool));
+
+ if (locked)
+ {
+ SVN_ERR(bump_mark_tree_conflict(wcroot,
+ move_src_root_relpath, 0,
+ delete_relpath,
+ move_dst_op_root_relpath,
+ db, scratch_pool));
+ }
return SVN_NO_ERROR;
}
}
}
- src_done = apr_hash_make(scratch_pool);
- SVN_ERR(bump_moved_away(wcroot, local_relpath, 0, src_done, depth, db,
- scratch_pool, scratch_pool));
+ SVN_ERR(bump_moved_away(wcroot, local_relpath, 0, depth, db, scratch_pool));
return SVN_NO_ERROR;
}
+/* Set *OPERATION, *LOCAL_CHANGE, *INCOMING_CHANGE, *OLD_VERSION, *NEW_VERSION
+ * to reflect the tree conflict on the victim SRC_ABSPATH in DB.
+ *
+ * If SRC_ABSPATH is not a tree-conflict victim, return an error.
+ */
static svn_error_t *
-resolve_delete_raise_moved_away(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_t *db,
- svn_wc_operation_t operation,
- svn_wc_conflict_action_t action,
- svn_wc_conflict_version_t *old_version,
- svn_wc_conflict_version_t *new_version,
- apr_pool_t *scratch_pool)
+fetch_conflict_details(int *src_op_depth,
+ svn_wc_operation_t *operation,
+ svn_wc_conflict_action_t *action,
+ svn_wc_conflict_version_t **left_version,
+ svn_wc_conflict_version_t **right_version,
+ svn_wc__db_wcroot_t *wcroot,
+ svn_wc__db_t *db,
+ const char *local_relpath,
+ const svn_skel_t *conflict_skel,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const apr_array_header_t *locations;
+ svn_boolean_t text_conflicted;
+ svn_boolean_t prop_conflicted;
+ svn_boolean_t tree_conflicted;
+ const char *move_src_op_root_abspath;
+ svn_wc_conflict_reason_t reason;
+ const char *local_abspath = svn_dirent_join(wcroot->abspath, local_relpath,
+ scratch_pool);
+
+ if (!conflict_skel)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("'%s' is not in conflict"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__conflict_read_info(operation, &locations,
+ &text_conflicted, &prop_conflicted,
+ &tree_conflicted,
+ db, local_abspath,
+ conflict_skel, result_pool,
+ scratch_pool));
+
+ if (text_conflicted || prop_conflicted || !tree_conflicted)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("'%s' is not a valid tree-conflict victim"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason,
+ action,
+ &move_src_op_root_abspath,
+ db, local_abspath,
+ conflict_skel, result_pool,
+ scratch_pool));
+
+ if (reason == svn_wc_conflict_reason_moved_away)
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("'%s' is already a moved away tree-conflict"),
+ path_for_error_message(wcroot, local_relpath,
+ scratch_pool));
+
+ if (left_version)
+ {
+ if (locations && locations->nelts > 0)
+ *left_version = APR_ARRAY_IDX(locations, 0,
+ svn_wc_conflict_version_t *);
+ else
+ *left_version = NULL;
+ }
+
+ if (right_version)
+ {
+ if (locations && locations->nelts > 1)
+ *right_version = APR_ARRAY_IDX(locations, 1,
+ svn_wc_conflict_version_t *);
+ else
+ *right_version = NULL;
+ }
+
+ {
+ int del_depth = relpath_depth(local_relpath);
+
+ if (move_src_op_root_abspath)
+ del_depth = relpath_depth(
+ svn_dirent_skip_ancestor(wcroot->abspath,
+ move_src_op_root_abspath));
+
+ SVN_ERR(find_src_op_depth(src_op_depth, wcroot, local_relpath, del_depth,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_op_raise_moved_away_internal(
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ int src_op_depth,
+ svn_wc__db_t *db,
+ svn_wc_operation_t operation,
+ svn_wc_conflict_action_t action,
+ const svn_wc_conflict_version_t *old_version,
+ const svn_wc_conflict_version_t *new_version,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- int op_depth = relpath_depth(local_relpath);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
STMT_CREATE_UPDATE_MOVE_LIST));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_OP_DEPTH_MOVED_PAIR));
+ STMT_SELECT_MOVED_DESCENDANTS_SRC));
SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
- op_depth));
+ src_op_depth));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while(have_row)
{
- const char *moved_relpath = svn_sqlite__column_text(stmt, 0, NULL);
- const char *move_root_dst_relpath = svn_sqlite__column_text(stmt, 1,
- NULL);
- const char *moved_dst_repos_relpath = svn_sqlite__column_text(stmt, 2,
- NULL);
+ svn_error_t *err;
+ int delete_op_depth = svn_sqlite__column_int(stmt, 0);
+ const char *src_relpath = svn_sqlite__column_text(stmt, 1, NULL);
+ svn_node_kind_t src_kind = svn_sqlite__column_token(stmt, 2, kind_map);
+ const char *src_repos_relpath = svn_sqlite__column_text(stmt, 3, NULL);
+ const char *dst_relpath = svn_sqlite__column_text(stmt, 4, NULL);
+ svn_skel_t *conflict;
svn_pool_clear(iterpool);
- SVN_ERR(mark_tree_conflict(moved_relpath,
- wcroot, db, old_version, new_version,
- move_root_dst_relpath, operation,
- svn_node_dir /* ### ? */,
- svn_node_dir /* ### ? */,
- moved_dst_repos_relpath,
+ SVN_ERR_ASSERT(src_repos_relpath != NULL);
+
+ err = create_tree_conflict(&conflict, wcroot, src_relpath, dst_relpath,
+ db, old_version, new_version, operation,
+ src_kind /* ### old kind */,
+ src_kind /* ### new kind */,
+ src_repos_relpath,
svn_wc_conflict_reason_moved_away,
- action, local_relpath,
- iterpool));
+ action,
+ svn_relpath_prefix(src_relpath,
+ delete_op_depth,
+ iterpool),
+ iterpool, iterpool);
+
+ if (!err)
+ err = update_move_list_add(wcroot, src_relpath, db,
+ svn_wc_notify_tree_conflict,
+ src_kind,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ conflict, NULL, scratch_pool);
+
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
@@ -2373,41 +2430,52 @@ resolve_delete_raise_moved_away(svn_wc__db_wcroot_t *wcroot,
}
svn_error_t *
-svn_wc__db_resolve_delete_raise_moved_away(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool)
+svn_wc__db_op_raise_moved_away(svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
svn_wc_operation_t operation;
- svn_wc_conflict_reason_t reason;
svn_wc_conflict_action_t action;
- svn_wc_conflict_version_t *old_version, *new_version;
+ svn_wc_conflict_version_t *left_version, *right_version;
+ int move_src_op_depth;
+ svn_skel_t *conflict;
SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
db, local_abspath,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(get_tc_info(&operation, &reason, &action, NULL,
- &old_version, &new_version,
- db, local_abspath, scratch_pool, scratch_pool));
-
- SVN_WC__DB_WITH_TXN(
- resolve_delete_raise_moved_away(wcroot, local_relpath,
- db, operation, action,
- old_version, new_version,
- scratch_pool),
+ SVN_WC__DB_WITH_TXN4(
+ svn_wc__db_read_conflict_internal(&conflict, NULL, NULL,
+ wcroot, local_relpath,
+ scratch_pool, scratch_pool),
+ fetch_conflict_details(&move_src_op_depth,
+ &operation, &action,
+ &left_version, &right_version,
+ wcroot, db, local_relpath, conflict,
+ scratch_pool, scratch_pool),
+ svn_wc__db_op_mark_resolved_internal(wcroot, local_relpath, db,
+ FALSE, FALSE, TRUE,
+ NULL, scratch_pool),
+ svn_wc__db_op_raise_moved_away_internal(wcroot, local_relpath,
+ move_src_op_depth,
+ db, operation, action,
+ left_version, right_version,
+ scratch_pool),
wcroot);
+ /* These version numbers are valid for update/switch notifications
+ only! */
SVN_ERR(svn_wc__db_update_move_list_notify(wcroot,
- (old_version
- ? old_version->peg_rev
+ (left_version
+ ? left_version->peg_rev
: SVN_INVALID_REVNUM),
- (new_version
- ? new_version->peg_rev
+ (right_version
+ ? right_version->peg_rev
: SVN_INVALID_REVNUM),
notify_func, notify_baton,
scratch_pool));
@@ -2416,159 +2484,109 @@ svn_wc__db_resolve_delete_raise_moved_away(svn_wc__db_t *db,
}
static svn_error_t *
-break_move(svn_wc__db_wcroot_t *wcroot,
- const char *src_relpath,
- int src_op_depth,
- const char *dst_relpath,
- int dst_op_depth,
- apr_pool_t *scratch_pool)
-{
- svn_sqlite__stmt_t *stmt;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_CLEAR_MOVED_TO_RELPATH));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, src_relpath,
- src_op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- /* This statement clears moved_here. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_UPDATE_OP_DEPTH_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isdd", wcroot->wc_id,
- dst_relpath, dst_op_depth, dst_op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_wc__db_resolve_break_moved_away_internal(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- int op_depth,
- apr_pool_t *scratch_pool)
-{
- const char *dummy1, *move_dst_op_root_relpath;
- const char *dummy2, *move_src_op_root_relpath;
-
- /* We want to include the passed op-depth, but the function does a > check */
- SVN_ERR(svn_wc__db_op_depth_moved_to(&dummy1, &move_dst_op_root_relpath,
- &dummy2,
- &move_src_op_root_relpath,
- op_depth - 1,
- wcroot, local_relpath,
- scratch_pool, scratch_pool));
-
- SVN_ERR_ASSERT(move_src_op_root_relpath != NULL
- && move_dst_op_root_relpath != NULL);
-
- SVN_ERR(break_move(wcroot, local_relpath,
- relpath_depth(move_src_op_root_relpath),
- move_dst_op_root_relpath,
- relpath_depth(move_dst_op_root_relpath),
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-break_moved_away_children_internal(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *scratch_pool)
+break_moved_away(svn_wc__db_wcroot_t *wcroot,
+ svn_wc__db_t *db,
+ const char *local_relpath,
+ int parent_src_op_depth,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
apr_pool_t *iterpool;
+ svn_error_t *err = NULL;
SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
STMT_CREATE_UPDATE_MOVE_LIST));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_MOVED_PAIR2));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ STMT_SELECT_MOVED_DESCENDANTS_SRC));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath,
+ parent_src_op_depth));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
iterpool = svn_pool_create(scratch_pool);
while (have_row)
{
- const char *src_relpath = svn_sqlite__column_text(stmt, 0, iterpool);
- const char *dst_relpath = svn_sqlite__column_text(stmt, 1, iterpool);
- int src_op_depth = svn_sqlite__column_int(stmt, 2);
+ int src_op_depth = svn_sqlite__column_int(stmt, 0);
+ const char *src_relpath = svn_sqlite__column_text(stmt, 1, NULL);
+ svn_node_kind_t src_kind = svn_sqlite__column_token(stmt, 2, kind_map);
+ const char *dst_relpath = svn_sqlite__column_text(stmt, 4, NULL);
svn_pool_clear(iterpool);
- SVN_ERR(break_move(wcroot, src_relpath, src_op_depth, dst_relpath,
- relpath_depth(dst_relpath), iterpool));
- SVN_ERR(update_move_list_add(wcroot, src_relpath,
- svn_wc_notify_move_broken,
- svn_node_unknown,
- svn_wc_notify_state_inapplicable,
- svn_wc_notify_state_inapplicable));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
- svn_pool_destroy(iterpool);
+ err = verify_write_lock(wcroot, src_relpath, iterpool);
- SVN_ERR(svn_sqlite__reset(stmt));
+ if (!err)
+ err = verify_write_lock(wcroot, dst_relpath, iterpool);
- return SVN_NO_ERROR;
-}
+ if (err)
+ break;
-svn_error_t *
-svn_wc__db_resolve_break_moved_away(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
+ err = svn_error_trace(
+ svn_wc__db_op_break_move_internal(wcroot,
+ src_relpath, src_op_depth,
+ dst_relpath, NULL, iterpool));
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
- db, local_abspath,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(wcroot);
+ if (err)
+ break;
- SVN_WC__DB_WITH_TXN(
- svn_wc__db_resolve_break_moved_away_internal(wcroot, local_relpath,
- relpath_depth(local_relpath),
- scratch_pool),
- wcroot);
+ err = svn_error_trace(
+ update_move_list_add(wcroot, src_relpath, db,
+ svn_wc_notify_move_broken,
+ src_kind,
+ svn_wc_notify_state_inapplicable,
+ svn_wc_notify_state_inapplicable,
+ NULL, NULL, scratch_pool));
- if (notify_func)
- {
- svn_wc_notify_t *notify;
+ if (err)
+ break;
- notify = svn_wc_create_notify(svn_dirent_join(wcroot->abspath,
- local_relpath,
- scratch_pool),
- svn_wc_notify_move_broken,
- scratch_pool);
- notify->kind = svn_node_unknown;
- notify->content_state = svn_wc_notify_state_inapplicable;
- notify->prop_state = svn_wc_notify_state_inapplicable;
- notify->revision = SVN_INVALID_REVNUM;
- notify_func(notify_baton, notify, scratch_pool);
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
+ svn_pool_destroy(iterpool);
- return SVN_NO_ERROR;
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
}
svn_error_t *
-svn_wc__db_resolve_break_moved_away_children(svn_wc__db_t *db,
- const char *local_abspath,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool)
+svn_wc__db_op_break_moved_away(svn_wc__db_t *db,
+ const char *local_abspath,
+ const char *del_op_root_abspath,
+ svn_boolean_t mark_tc_resolved,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
+ const char *del_relpath;
+ int src_op_depth;
SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
db, local_abspath,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_WC__DB_WITH_TXN(
- break_moved_away_children_internal(wcroot, local_relpath, scratch_pool),
+ if (del_op_root_abspath)
+ del_relpath = svn_dirent_skip_ancestor(wcroot->abspath,
+ del_op_root_abspath);
+ else
+ del_relpath = NULL;
+
+
+ SVN_WC__DB_WITH_TXN4(
+ find_src_op_depth(&src_op_depth, wcroot, local_relpath,
+ del_relpath ? relpath_depth(del_relpath)
+ : relpath_depth(local_relpath),
+ scratch_pool),
+ break_moved_away(wcroot, db, local_relpath, src_op_depth,
+ scratch_pool),
+ mark_tc_resolved
+ ? svn_wc__db_op_mark_resolved_internal(wcroot, local_relpath, db,
+ FALSE, FALSE, TRUE,
+ NULL, scratch_pool)
+ : SVN_NO_ERROR,
+ SVN_NO_ERROR,
wcroot);
SVN_ERR(svn_wc__db_update_move_list_notify(wcroot,
diff --git a/subversion/libsvn_wc/wc_db_util.c b/subversion/libsvn_wc/wc_db_util.c
index a6616e4..074feff 100644
--- a/subversion/libsvn_wc/wc_db_util.c
+++ b/subversion/libsvn_wc/wc_db_util.c
@@ -83,7 +83,7 @@ static svn_error_t *
relpath_depth_sqlite(svn_sqlite__context_t *sctx,
int argc,
svn_sqlite__value_t *values[],
- apr_pool_t *scratch_pool)
+ void *baton)
{
const char *path = NULL;
apr_int64_t depth;
@@ -115,6 +115,7 @@ svn_wc__db_util_open_db(svn_sqlite__db_t **sdb,
const char *sdb_fname,
svn_sqlite__mode_t smode,
svn_boolean_t exclusive,
+ apr_int32_t timeout,
const char *const *my_statements,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
@@ -139,74 +140,15 @@ svn_wc__db_util_open_db(svn_sqlite__db_t **sdb,
SVN_ERR(svn_sqlite__open(sdb, sdb_abspath, smode,
my_statements ? my_statements : statements,
- 0, NULL, result_pool, scratch_pool));
+ 0, NULL, timeout, result_pool, scratch_pool));
if (exclusive)
SVN_ERR(svn_sqlite__exec_statements(*sdb, STMT_PRAGMA_LOCKING_MODE));
SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1,
+ TRUE /* deterministic */,
relpath_depth_sqlite, NULL));
return SVN_NO_ERROR;
}
-
-/* Some helpful transaction helpers.
-
- Instead of directly using SQLite transactions, these wrappers
- relieve the consumer from the need to wrap the wcroot and
- local_relpath, which are almost always used within the transaction.
-
- This also means if we later want to implement some wc_db-specific txn
- handling, we have a convenient place to do it.
- */
-
-/* A callback which supplies WCROOTs and LOCAL_RELPATHs. */
-typedef svn_error_t *(*db_txn_callback_t)(void *baton,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *scratch_pool);
-
-/* Baton for use with run_txn() and with_db_txn(). */
-struct txn_baton_t
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
-
- db_txn_callback_t cb_func;
- void *cb_baton;
-};
-
-
-/* Unwrap the sqlite transaction into a wc_db txn.
- Implements svn_sqlite__transaction_callback_t. */
-static svn_error_t *
-run_txn(void *baton, svn_sqlite__db_t *db, apr_pool_t *scratch_pool)
-{
- struct txn_baton_t *tb = baton;
-
- return svn_error_trace(
- tb->cb_func(tb->cb_baton, tb->wcroot, tb->local_relpath, scratch_pool));
-}
-
-
-/* Run CB_FUNC in a SQLite transaction with CB_BATON, using WCROOT and
- LOCAL_RELPATH. If callbacks require additional information, they may
- provide it using CB_BATON. */
-svn_error_t *
-svn_wc__db_with_txn(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_txn_callback_t cb_func,
- void *cb_baton,
- apr_pool_t *scratch_pool)
-{
- struct txn_baton_t tb;
-
- tb.wcroot = wcroot;
- tb.local_relpath = local_relpath;
- tb.cb_func = cb_func;
- tb.cb_baton = cb_baton;
-
- return svn_error_trace(
- svn_sqlite__with_lock(wcroot->sdb, run_txn, &tb, scratch_pool));
-}
diff --git a/subversion/libsvn_wc/wc_db_wcroot.c b/subversion/libsvn_wc/wc_db_wcroot.c
index a111073..1cfca3d 100644
--- a/subversion/libsvn_wc/wc_db_wcroot.c
+++ b/subversion/libsvn_wc/wc_db_wcroot.c
@@ -28,6 +28,7 @@
#include "svn_dirent_uri.h"
#include "svn_hash.h"
#include "svn_path.h"
+#include "svn_pools.h"
#include "svn_version.h"
#include "wc.h"
@@ -42,7 +43,7 @@
#define UNKNOWN_WC_ID ((apr_int64_t) -1)
#define FORMAT_FROM_SDB (-1)
-
+/* #define VERIFY_ON_CLOSE */
/* Get the format version from a wc-1 directory. If it is not a working copy
directory, then it sets VERSION to zero and returns no error. */
@@ -145,9 +146,8 @@ get_path_kind(svn_node_kind_t *kind,
}
-/* Return an error if the work queue in SDB is non-empty. */
-static svn_error_t *
-verify_no_work(svn_sqlite__db_t *sdb)
+svn_error_t *
+svn_wc__db_verify_no_work(svn_sqlite__db_t *sdb)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
@@ -163,6 +163,27 @@ verify_no_work(svn_sqlite__db_t *sdb)
return SVN_NO_ERROR;
}
+#if defined(VERIFY_ON_CLOSE) && defined(SVN_DEBUG)
+/* Implements svn_wc__db_verify_cb_t */
+static svn_error_t *
+verify_db_cb(void *baton,
+ const char *wc_abspath,
+ const char *local_relpath,
+ int op_depth,
+ int id,
+ const char *msg,
+ apr_pool_t *scratch_pool)
+{
+ if (op_depth >= 0)
+ SVN_DBG(("DB-VRFY: %s: %s (%d): SV%04d %s",
+ wc_abspath, local_relpath, op_depth, id, msg));
+ else
+ SVN_DBG(("DB-VRFY: %s: %s: SV%04d %s",
+ wc_abspath, local_relpath, id, msg));
+
+ return SVN_NO_ERROR;
+}
+#endif
/* */
static apr_status_t
@@ -173,6 +194,18 @@ close_wcroot(void *data)
SVN_ERR_ASSERT_NO_RETURN(wcroot->sdb != NULL);
+#if defined(VERIFY_ON_CLOSE) && defined(SVN_DEBUG)
+ if (getenv("SVN_CMDLINE_VERIFY_SQL_AT_CLOSE"))
+ {
+ apr_pool_t *scratch_pool = svn_pool_create(NULL);
+
+ svn_error_clear(svn_wc__db_verify_db_full_internal(
+ wcroot, verify_db_cb, NULL, scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
+ }
+#endif
+
err = svn_sqlite__close(wcroot->sdb);
wcroot->sdb = NULL;
if (err)
@@ -207,6 +240,7 @@ svn_wc__db_open(svn_wc__db_t **db,
{
svn_error_t *err;
svn_boolean_t sqlite_exclusive = FALSE;
+ apr_int64_t timeout;
err = svn_config_get_bool(config, &sqlite_exclusive,
SVN_CONFIG_SECTION_WORKING_COPY,
@@ -218,6 +252,15 @@ svn_wc__db_open(svn_wc__db_t **db,
}
else
(*db)->exclusive = sqlite_exclusive;
+
+ err = svn_config_get_int64(config, &timeout,
+ SVN_CONFIG_SECTION_WORKING_COPY,
+ SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT,
+ 0);
+ if (err || timeout < 0 || timeout > APR_INT32_MAX)
+ svn_error_clear(err);
+ else
+ (*db)->timeout = (apr_int32_t)timeout;
}
return SVN_NO_ERROR;
@@ -236,8 +279,8 @@ svn_wc__db_close(svn_wc__db_t *db)
hi;
hi = apr_hash_next(hi))
{
- svn_wc__db_wcroot_t *wcroot = svn__apr_hash_index_val(hi);
- const char *local_abspath = svn__apr_hash_index_key(hi);
+ svn_wc__db_wcroot_t *wcroot = apr_hash_this_val(hi);
+ const char *local_abspath = apr_hash_this_key(hi);
if (wcroot->sdb)
svn_hash_sets(roots, wcroot->abspath, wcroot);
@@ -258,7 +301,6 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_wcroot_t **wcroot,
apr_int64_t wc_id,
int format,
svn_boolean_t verify_format,
- svn_boolean_t enforce_empty_wq,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -293,11 +335,11 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_wcroot_t **wcroot,
}
/* Verify that no work items exists. If they do, then our integrity is
- suspect and, thus, we cannot use this database. */
- if (format >= SVN_WC__HAS_WORK_QUEUE
- && (enforce_empty_wq || (format < SVN_WC__VERSION && verify_format)))
+ suspect and, thus, we cannot upgrade this database. */
+ if (format >= SVN_WC__HAS_WORK_QUEUE &&
+ format < SVN_WC__VERSION && verify_format)
{
- svn_error_t *err = verify_no_work(sdb);
+ svn_error_t *err = svn_wc__db_verify_no_work(sdb);
if (err)
{
/* Special message for attempts to upgrade a 1.7-dev wc with
@@ -354,7 +396,7 @@ svn_wc__db_close_many_wcroots(apr_hash_t *roots,
for (hi = apr_hash_first(scratch_pool, roots); hi; hi = apr_hash_next(hi))
{
- svn_wc__db_wcroot_t *wcroot = svn__apr_hash_index_val(hi);
+ svn_wc__db_wcroot_t *wcroot = apr_hash_this_val(hi);
apr_status_t result;
result = apr_pool_cleanup_run(state_pool, wcroot, close_wcroot);
@@ -594,7 +636,7 @@ svn_wc__db_wcroot_parse_local_abspath(svn_wc__db_wcroot_t **wcroot,
as the filesystem allows. */
err = svn_wc__db_util_open_db(&sdb, local_abspath, SDB_FILE,
svn_sqlite__mode_readwrite,
- db->exclusive, NULL,
+ db->exclusive, db->timeout, NULL,
db->state_pool, scratch_pool);
if (err == NULL)
{
@@ -711,11 +753,9 @@ try_symlink_as_dir:
if (err)
{
if (err->apr_err == SVN_ERR_WC_CORRUPT)
- return svn_error_quick_wrap(
- err, apr_psprintf(scratch_pool,
- _("Missing a row in WCROOT for '%s'."),
- svn_dirent_local_style(original_abspath,
- scratch_pool)));
+ return svn_error_quick_wrapf(
+ err, _("Missing a row in WCROOT for '%s'."),
+ svn_dirent_local_style(original_abspath, scratch_pool));
return svn_error_trace(err);
}
@@ -729,7 +769,7 @@ try_symlink_as_dir:
? symlink_wcroot_abspath
: local_abspath),
sdb, wc_id, format,
- db->verify_format, db->enforce_empty_wq,
+ db->verify_format,
db->state_pool, scratch_pool);
if (err && (err->apr_err == SVN_ERR_WC_UNSUPPORTED_FORMAT ||
err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED) &&
@@ -804,7 +844,7 @@ try_symlink_as_dir:
? symlink_wcroot_abspath
: local_abspath),
NULL, UNKNOWN_WC_ID, wc_format,
- db->verify_format, db->enforce_empty_wq,
+ db->verify_format,
db->state_pool, scratch_pool));
}
@@ -959,10 +999,10 @@ svn_wc__db_drop_root(svn_wc__db_t *db,
hi;
hi = apr_hash_next(hi))
{
- svn_wc__db_wcroot_t *wcroot = svn__apr_hash_index_val(hi);
+ svn_wc__db_wcroot_t *wcroot = apr_hash_this_val(hi);
if (wcroot == root_wcroot)
- svn_hash_sets(db->dir_data, svn__apr_hash_index_key(hi), NULL);
+ svn_hash_sets(db->dir_data, apr_hash_this_key(hi), NULL);
}
result = apr_pool_cleanup_run(db->state_pool, root_wcroot, close_wcroot);
diff --git a/subversion/libsvn_wc/workqueue.c b/subversion/libsvn_wc/workqueue.c
index b034d7d..18736cc 100644
--- a/subversion/libsvn_wc/workqueue.c
+++ b/subversion/libsvn_wc/workqueue.c
@@ -23,6 +23,7 @@
#include <apr_pools.h>
+#include "svn_private_config.h"
#include "svn_types.h"
#include "svn_pools.h"
#include "svn_dirent_uri.h"
@@ -37,7 +38,7 @@
#include "conflicts.h"
#include "translate.h"
-#include "svn_private_config.h"
+#include "private/svn_io_private.h"
#include "private/svn_skel.h"
@@ -142,8 +143,7 @@ run_base_remove(work_item_baton_t *wqb,
SVN_ERR(svn_wc__db_base_remove(db, local_abspath,
FALSE /* keep_as_working */,
- TRUE /* queue_deletes */,
- FALSE /* remove_locks */,
+ SVN_IS_VALID_REVNUM(not_present_rev), FALSE,
not_present_rev,
NULL, NULL, scratch_pool));
@@ -395,8 +395,6 @@ run_postupgrade(work_item_baton_t *wqb,
const char *entries_path;
const char *format_path;
const char *wcroot_abspath;
- const char *adm_path;
- const char *temp_path;
svn_error_t *err;
err = svn_wc__wipe_postupgrade(wri_abspath, FALSE,
@@ -410,7 +408,6 @@ run_postupgrade(work_item_baton_t *wqb,
SVN_ERR(svn_wc__db_get_wcroot(&wcroot_abspath, db, wri_abspath,
scratch_pool, scratch_pool));
- adm_path = svn_wc__adm_child(wcroot_abspath, NULL, scratch_pool);
entries_path = svn_wc__adm_child(wcroot_abspath, SVN_WC__ADM_ENTRIES,
scratch_pool);
format_path = svn_wc__adm_child(wcroot_abspath, SVN_WC__ADM_FORMAT,
@@ -421,15 +418,13 @@ run_postupgrade(work_item_baton_t *wqb,
### The order may matter for some sufficiently old clients.. but
### this code only runs during upgrade after the files had been
### removed earlier during the upgrade. */
- SVN_ERR(svn_io_write_unique(&temp_path, adm_path, SVN_WC__NON_ENTRIES_STRING,
+ SVN_ERR(svn_io_write_atomic(format_path, SVN_WC__NON_ENTRIES_STRING,
sizeof(SVN_WC__NON_ENTRIES_STRING) - 1,
- svn_io_file_del_none, scratch_pool));
- SVN_ERR(svn_io_file_rename(temp_path, format_path, scratch_pool));
+ NULL, scratch_pool));
- SVN_ERR(svn_io_write_unique(&temp_path, adm_path, SVN_WC__NON_ENTRIES_STRING,
+ SVN_ERR(svn_io_write_atomic(entries_path, SVN_WC__NON_ENTRIES_STRING,
sizeof(SVN_WC__NON_ENTRIES_STRING) - 1,
- svn_io_file_del_none, scratch_pool));
- SVN_ERR(svn_io_file_rename(temp_path, entries_path, scratch_pool));
+ NULL, scratch_pool));
return SVN_NO_ERROR;
}
@@ -474,7 +469,6 @@ run_file_install(work_item_baton_t *wqb,
apr_hash_t *keywords;
const char *temp_dir_abspath;
svn_stream_t *dst_stream;
- const char *dst_abspath;
apr_int64_t val;
const char *wcroot_abspath;
const char *source_abspath;
@@ -577,10 +571,8 @@ run_file_install(work_item_baton_t *wqb,
/* Translate to a temporary file. We don't want the user seeing a partial
file, nor let them muck with it while we translate. We may also need to
get its TRANSLATED_SIZE before the user can monkey it. */
- SVN_ERR(svn_stream_open_unique(&dst_stream, &dst_abspath,
- temp_dir_abspath,
- svn_io_file_del_none,
- scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream__create_for_install(&dst_stream, temp_dir_abspath,
+ scratch_pool, scratch_pool));
/* Copy from the source to the dest, translating as we go. This will also
close both streams. */
@@ -589,35 +581,11 @@ run_file_install(work_item_baton_t *wqb,
scratch_pool));
/* All done. Move the file into place. */
-
- {
- svn_error_t *err;
-
- err = svn_io_file_rename(dst_abspath, local_abspath, scratch_pool);
-
- /* With a single db we might want to install files in a missing directory.
- Simply trying this scenario on error won't do any harm and at least
- one user reported this problem on IRC. */
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_t *err2;
-
- err2 = svn_io_make_dir_recursively(svn_dirent_dirname(local_abspath,
- scratch_pool),
- scratch_pool);
-
- if (err2)
- /* Creating directory didn't work: Return all errors */
- return svn_error_trace(svn_error_compose_create(err, err2));
- else
- /* We could create a directory: retry install */
- svn_error_clear(err);
-
- SVN_ERR(svn_io_file_rename(dst_abspath, local_abspath, scratch_pool));
- }
- else
- SVN_ERR(err);
- }
+ /* With a single db we might want to install files in a missing directory.
+ Simply trying this scenario on error won't do any harm and at least
+ one user reported this problem on IRC. */
+ SVN_ERR(svn_stream__install_stream(dst_stream, local_abspath,
+ TRUE /* make_parents*/, scratch_pool));
/* Tweak the on-disk file according to its properties. */
#ifndef WIN32
@@ -1047,8 +1015,8 @@ svn_error_t *
svn_wc__wq_build_dir_install(svn_skel_t **work_item,
svn_wc__db_t *db,
const char *local_abspath,
- apr_pool_t *scratch_pool,
- apr_pool_t *result_pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *local_relpath;
@@ -1138,7 +1106,7 @@ run_prej_install(work_item_baton_t *wqb,
SVN_ERR(svn_wc__db_from_relpath(&local_abspath, db, wri_abspath,
local_relpath, scratch_pool, scratch_pool));
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL, db, local_abspath,
scratch_pool, scratch_pool));
SVN_ERR(svn_wc__conflict_read_prop_conflict(&prejfile_abspath,
@@ -1147,14 +1115,15 @@ run_prej_install(work_item_baton_t *wqb,
scratch_pool, scratch_pool));
if (arg1->next != NULL)
- prop_conflict_skel = arg1->next;
+ prop_conflict_skel = arg1->next; /* Before Subversion 1.9 */
else
- SVN_ERR_MALFUNCTION(); /* ### wc_db can't provide it ... yet. */
+ prop_conflict_skel = NULL; /* Read from DB */
/* Construct a property reject file in the temporary area. */
SVN_ERR(svn_wc__create_prejfile(&tmp_prejfile_abspath,
db, local_abspath,
prop_conflict_skel,
+ cancel_func, cancel_baton,
scratch_pool, scratch_pool));
/* ... and atomically move it into place. */
@@ -1170,21 +1139,21 @@ svn_error_t *
svn_wc__wq_build_prej_install(svn_skel_t **work_item,
svn_wc__db_t *db,
const char *local_abspath,
- svn_skel_t *conflict_skel,
+ /*svn_skel_t *conflict_skel,*/
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *local_relpath;
*work_item = svn_skel__make_empty_list(result_pool);
- /* ### gotta have this, today */
- SVN_ERR_ASSERT(conflict_skel != NULL);
-
SVN_ERR(svn_wc__db_to_relpath(&local_relpath, db, local_abspath,
local_abspath, result_pool, scratch_pool));
- if (conflict_skel != NULL)
- svn_skel__prepend(conflict_skel, *work_item);
+ /* ### In Subversion 1.7 and 1.8 we created a legacy property conflict skel
+ here:
+ if (conflict_skel != NULL)
+ svn_skel__prepend(conflict_skel, *work_item);
+ */
svn_skel__prepend_str(local_relpath, *work_item, result_pool);
svn_skel__prepend_str(OP_PREJ_INSTALL, *work_item, result_pool);
@@ -1317,7 +1286,7 @@ run_set_text_conflict_markers(work_item_baton_t *wqb,
/* Check if we should combine with a property conflict... */
svn_skel_t *conflicts;
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL, db, local_abspath,
scratch_pool, scratch_pool));
if (! conflicts)
@@ -1383,7 +1352,8 @@ run_set_property_conflict_marker(work_item_baton_t *wqb,
svn_skel_t *conflicts;
apr_hash_t *prop_names;
- SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath,
+ SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, NULL,
+ db, local_abspath,
scratch_pool, scratch_pool));
if (! conflicts)
@@ -1520,8 +1490,11 @@ svn_wc__wq_run(svn_wc__db_t *db,
{
static int count = 0;
const char *count_env_var = getenv("SVN_DEBUG_WORK_QUEUE");
+ int count_env_val;
+
+ SVN_ERR(svn_cstring_atoi(&count_env_val, count_env_var));
- if (count_env_var && ++count == atoi(count_env_var))
+ if (count_env_var && ++count == count_env_val)
return svn_error_create(SVN_ERR_CANCELLED, NULL, "fake cancel");
}
#endif
diff --git a/subversion/libsvn_wc/workqueue.h b/subversion/libsvn_wc/workqueue.h
index 0617a60..630de07 100644
--- a/subversion/libsvn_wc/workqueue.h
+++ b/subversion/libsvn_wc/workqueue.h
@@ -73,7 +73,11 @@ extern "C" {
These will be combined as appropriate, and returned in one of the
above three styles.
- The resulting list will be ordered: WORK_ITEM1 first, then WORK_ITEM2 */
+ The resulting list will be ordered: WORK_ITEM1 first, then WORK_ITEM2.
+
+ The result contains a shallow copy of the inputs. Allocate any
+ additional storage needed in RESULT_POOL.
+ */
svn_skel_t *
svn_wc__wq_merge(svn_skel_t *work_item1,
svn_skel_t *work_item2,
@@ -177,22 +181,12 @@ svn_wc__wq_build_sync_file_flags(svn_skel_t **work_item,
/* Set *WORK_ITEM to a new work item that will install a property reject
- file for LOCAL_ABSPATH into the working copy. The property conflicts will
- be taken from CONFLICT_SKEL.
-
- ### Caution: Links CONFLICT_SKEL into the *WORK_ITEM, which involves
- modifying *CONFLICT_SKEL.
-
- ### TODO: Make CONFLICT_SKEL 'const' and dup it into RESULT_POOL.
-
- ### TODO: If CONFLICT_SKEL is NULL, take property conflicts from wc_db
- for the given DB/LOCAL_ABSPATH.
+ file for LOCAL_ABSPATH into the working copy.
*/
svn_error_t *
svn_wc__wq_build_prej_install(svn_skel_t **work_item,
svn_wc__db_t *db,
const char *local_abspath,
- svn_skel_t *conflict_skel,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -221,8 +215,8 @@ svn_error_t *
svn_wc__wq_build_dir_install(svn_skel_t **work_item,
svn_wc__db_t *db,
const char *local_abspath,
- apr_pool_t *scratch_pool,
- apr_pool_t *result_pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
svn_error_t *
svn_wc__wq_build_postupgrade(svn_skel_t **work_item,
diff --git a/subversion/mod_authz_svn/INSTALL b/subversion/mod_authz_svn/INSTALL
index d2216ad..6882a07 100644
--- a/subversion/mod_authz_svn/INSTALL
+++ b/subversion/mod_authz_svn/INSTALL
@@ -186,10 +186,16 @@ II. Configuration
The "Require" statement in the previous example is not strictly
needed, but has been included for clarity.
- H. Example 8: Separate authz and groups files.
+ H. Example 8: Separating groups and authorization rules
- This configuration allows storing the groups separately from the
- main authz file with the authorization rules.
+ It may be convenient to maintain group definitions separately from
+ the authorization rules. This configuration allows splitting them
+ into two separate files.
+
+ The file specified by the AuthzSVNGroupsFile directive uses the
+ same format as the ordinary authz file and should contain a single
+ section with the group definitions. See section II.2.B for more
+ details.
<Location /svn>
DAV svn
@@ -205,78 +211,106 @@ II. Configuration
Require valid-user
</Location>
+ Configurations with per-repository access files may also use a
+ single file containing the group definitions. This configuration
+ avoids the need to duplicate the group definitions across multiple
+ per-repository access files.
+
+ AuthzSVNReposRelativeAccessFile filename
+ AuthzSVNGroupsFile /path/to/groups/file
+
+ NOTE: When the AuthzSVNGroupsFile directive is enabled, the
+ file specified with the AuthzSVNReposRelativeAccessFile or
+ AuthzSVNAccessFile directive cannot contain any group definitions.
+
2. Specifying permissions
- The file format of the access file looks like this:
-
- [groups]
- <groupname> = <user>[,<user>...]
- ...
-
- [<path in repository>]
- @<group> = [rw|r]
- <user> = [rw|r]
- * = [rw|r]
-
- [<repository name>:<path in repository>]
- @<group> = [rw|r]
- <user> = [rw|r]
- * = [rw|r]
-
- An example (line continued lines are supposed to be on one line):
-
- [groups]
- subversion = jimb,sussman,kfogel,gstein,brane,joe,ghudson,fitz, \
- daniel,cmpilato,kevin,philip,jerenkrantz,rooneg, \
- bcollins,blair,striker,naked,dwhedon,dlr,kraai,mbk, \
- epg,bdenny,jaa
- subversion-doc = nsd,zbrown,fmatias,dimentiy,patrick
- subversion-bindings = xela,yoshiki,morten,jespersm,knacke
- subversion-rm = mprice
- ...and so on and so on...
-
- [/]
- # Allow everyone read on the entire repository
- * = r
- # Allow devs with blanket commit to write to the entire repository
- @subversion = rw
-
- [/trunk/doc]
- @subversion-doc = rw
-
- [/trunk/subversion/bindings]
- @subversion-bindings = rw
-
- [/branches]
- @subversion-rm = rw
-
- [/tags]
- @subversion-rm = rw
-
- [/branches/issue-650-ssl-certs]
- mass = rw
-
- [/branches/pluggable-db]
- gthompson = rw
-
- ...
-
- [/secrets]
- # Just for demonstration
- * =
- @subversion = rw
-
- # In case of SVNParentPath we can specify which repository we are
- # referring to. If no matching repository qualified section is found,
- # the general unqualified section is tried.
- #
- # NOTE: This will work in the case of using SVNPath as well, only the
- # repository name (the last element of the url) will always be the
- # same.
- [dark:/]
- * =
- @dark = rw
-
- [light:/]
- @light = rw
+ A. File format of the access file
+
+ The file format of the access file looks like this:
+
+ [groups]
+ <groupname> = <user>[,<user>...]
+ ...
+
+ [<path in repository>]
+ @<group> = [rw|r]
+ <user> = [rw|r]
+ * = [rw|r]
+
+ [<repository name>:<path in repository>]
+ @<group> = [rw|r]
+ <user> = [rw|r]
+ * = [rw|r]
+
+ An example (line continued lines are supposed to be on one line):
+
+ [groups]
+ subversion = jimb,sussman,kfogel,gstein,brane,joe,ghudson,fitz, \
+ daniel,cmpilato,kevin,philip,jerenkrantz,rooneg, \
+ bcollins,blair,striker,naked,dwhedon,dlr,kraai,mbk, \
+ epg,bdenny,jaa
+ subversion-doc = nsd,zbrown,fmatias,dimentiy,patrick
+ subversion-bindings = xela,yoshiki,morten,jespersm,knacke
+ subversion-rm = mprice
+ ...and so on and so on...
+
+ [/]
+ # Allow everyone read on the entire repository
+ * = r
+ # Allow devs with blanket commit to write to the entire repository
+ @subversion = rw
+
+ [/trunk/doc]
+ @subversion-doc = rw
+
+ [/trunk/subversion/bindings]
+ @subversion-bindings = rw
+
+ [/branches]
+ @subversion-rm = rw
+
+ [/tags]
+ @subversion-rm = rw
+
+ [/branches/issue-650-ssl-certs]
+ mass = rw
+
+ [/branches/pluggable-db]
+ gthompson = rw
+
+ ...
+
+ [/secrets]
+ # Just for demonstration
+ * =
+ @subversion = rw
+
+ # In case of SVNParentPath we can specify which repository we are
+ # referring to. If no matching repository qualified section is
+ # found, the general unqualified section is tried.
+ #
+ # NOTE: This will work in the case of using SVNPath as well, only
+ # the repository name (the last element of the url) will always be
+ # the same.
+ [dark:/]
+ * =
+ @dark = rw
+
+ [light:/]
+ @light = rw
+
+ B. File format of the groups file
+
+ The file format of the groups file looks like this:
+
+ [groups]
+ <groupname> = <user>[,<user>...]
+ ...
+
+ An example:
+
+ [groups]
+ developers = harry,sally,john
+ managers = jim,joe
diff --git a/subversion/mod_authz_svn/mod_authz_svn.c b/subversion/mod_authz_svn/mod_authz_svn.c
index e9e43eb..0adeaf9 100644
--- a/subversion/mod_authz_svn/mod_authz_svn.c
+++ b/subversion/mod_authz_svn/mod_authz_svn.c
@@ -48,6 +48,23 @@
#include "svn_dirent_uri.h"
#include "private/svn_fspath.h"
+/* The apache headers define these and they conflict with our definitions. */
+#ifdef PACKAGE_BUGREPORT
+#undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
+#undef PACKAGE_NAME
+#endif
+#ifdef PACKAGE_STRING
+#undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
+#undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
+#include "svn_private_config.h"
#ifdef APLOG_USE_MODULE
APLOG_USE_MODULE(authz_svn);
@@ -67,6 +84,28 @@ typedef struct authz_svn_config_rec {
const char *force_username_case;
} authz_svn_config_rec;
+/* version where ap_some_auth_required breaks */
+#if AP_MODULE_MAGIC_AT_LEAST(20060110,0)
+/* first version with force_authn hook and ap_some_authn_required()
+ which allows us to work without ap_some_auth_required() */
+# if AP_MODULE_MAGIC_AT_LEAST(20120211,47) || defined(SVN_USE_FORCE_AUTHN)
+# define USE_FORCE_AUTHN 1
+# define IN_SOME_AUTHN_NOTE "authz_svn-in-some-authn"
+# define FORCE_AUTHN_NOTE "authz_svn-force-authn"
+# else
+ /* ap_some_auth_required() is busted and no viable alternative exists */
+# ifndef SVN_ALLOW_BROKEN_HTTPD_AUTH
+# error This Apache httpd has broken auth (CVE-2015-3184)
+# else
+ /* user wants to build anyway */
+# define USE_FORCE_AUTHN 0
+# endif
+# endif
+#else
+ /* old enough that ap_some_auth_required() still works */
+# define USE_FORCE_AUTHN 0
+#endif
+
/*
* Configuration
*/
@@ -132,7 +171,7 @@ AuthzSVNAccessFile_cmd(cmd_parms *cmd, void *config, const char *arg1)
conf->access_file = canonicalize_access_file(arg1, TRUE, cmd->pool);
if (!conf->access_file)
- return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, NULL);
+ return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, SVN_VA_NULL);
return NULL;
}
@@ -153,7 +192,7 @@ AuthzSVNReposRelativeAccessFile_cmd(cmd_parms *cmd,
cmd->pool);
if (!conf->repo_relative_access_file)
- return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, NULL);
+ return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, SVN_VA_NULL);
return NULL;
}
@@ -166,7 +205,7 @@ AuthzSVNGroupsFile_cmd(cmd_parms *cmd, void *config, const char *arg1)
conf->groups_file = canonicalize_access_file(arg1, TRUE, cmd->pool);
if (!conf->groups_file)
- return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, NULL);
+ return apr_pstrcat(cmd->pool, "Invalid file path ", arg1, SVN_VA_NULL);
return NULL;
}
@@ -244,15 +283,26 @@ static const command_rec authz_svn_cmds[] =
* per-module loglevel configuration. It expands to FILE and LINE
* in older server versions. ALLOWED is boolean.
* REPOS_PATH and DEST_REPOS_PATH are information
- * about the request. DEST_REPOS_PATH may be NULL. */
+ * about the request. DEST_REPOS_PATH may be NULL.
+ * Non-zero IS_SUBREQ_BYPASS means that this authorization check was
+ * implicitly requested using 'subrequest bypass' callback from
+ * mod_dav_svn.
+ */
static void
log_access_verdict(LOG_ARGS_SIGNATURE,
- const request_rec *r, int allowed,
+ const request_rec *r, int allowed, int is_subreq_bypass,
const char *repos_path, const char *dest_repos_path)
{
int level = allowed ? APLOG_INFO : APLOG_ERR;
const char *verdict = allowed ? "granted" : "denied";
+ /* Use less important log level for implicit sub-request authorization
+ checks. */
+ if (is_subreq_bypass)
+ level = APLOG_INFO;
+ else if (r->main && r->method_number == M_GET)
+ level = APLOG_INFO;
+
if (r->user)
{
if (dest_repos_path)
@@ -361,7 +411,7 @@ get_access_conf(request_rec *r, authz_svn_config_rec *conf,
svn_error_t *svn_err = SVN_NO_ERROR;
dav_error *dav_err;
- dav_err = dav_svn_get_repos_path(r, conf->base_path, &repos_path);
+ dav_err = dav_svn_get_repos_path2(r, conf->base_path, &repos_path, scratch_pool);
if (dav_err)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "%s", dav_err->desc);
@@ -376,7 +426,7 @@ get_access_conf(request_rec *r, authz_svn_config_rec *conf,
{
access_file = svn_dirent_join_many(scratch_pool, repos_path, "conf",
conf->repo_relative_access_file,
- NULL);
+ SVN_VA_NULL);
}
}
else
@@ -417,7 +467,7 @@ get_access_conf(request_rec *r, authz_svn_config_rec *conf,
}
cache_key = apr_pstrcat(scratch_pool, "mod_authz_svn:",
- access_file, groups_file, (char *)NULL);
+ access_file, groups_file, SVN_VA_NULL);
apr_pool_userdata_get(&user_data, cache_key, r->connection->pool);
access_conf = user_data;
if (access_conf == NULL)
@@ -585,10 +635,12 @@ req_check_access(request_rec *r,
repos_path = svn_fspath__canonicalize(repos_path, r->pool);
*repos_path_ref = apr_pstrcat(r->pool, repos_name, ":", repos_path,
- (char *)NULL);
+ SVN_VA_NULL);
if (r->method_number == M_MOVE || r->method_number == M_COPY)
{
+ apr_status_t status;
+
dest_uri = apr_table_get(r->headers_in, "Destination");
/* Decline MOVE or COPY when there is no Destination uri, this will
@@ -597,7 +649,19 @@ req_check_access(request_rec *r,
if (!dest_uri)
return DECLINED;
- apr_uri_parse(r->pool, dest_uri, &parsed_dest_uri);
+ status = apr_uri_parse(r->pool, dest_uri, &parsed_dest_uri);
+ if (status)
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r,
+ "Invalid URI in Destination header");
+ return HTTP_BAD_REQUEST;
+ }
+ if (!parsed_dest_uri.path)
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "Invalid URI in Destination header");
+ return HTTP_BAD_REQUEST;
+ }
ap_unescape_url(parsed_dest_uri.path);
dest_uri = parsed_dest_uri.path;
@@ -633,7 +697,7 @@ req_check_access(request_rec *r,
dest_repos_path = svn_fspath__canonicalize(dest_repos_path, r->pool);
*dest_repos_path_ref = apr_pstrcat(r->pool, dest_repos_name, ":",
- dest_repos_path, (char *)NULL);
+ dest_repos_path, SVN_VA_NULL);
}
/* Retrieve/cache authorization file */
@@ -749,7 +813,7 @@ subreq_bypass2(request_rec *r,
if (!conf->anonymous
|| (! (conf->access_file || conf->repo_relative_access_file)))
{
- log_access_verdict(APLOG_MARK, r, 0, repos_path, NULL);
+ log_access_verdict(APLOG_MARK, r, 0, TRUE, repos_path, NULL);
return HTTP_FORBIDDEN;
}
@@ -778,12 +842,12 @@ subreq_bypass2(request_rec *r,
}
if (!authz_access_granted)
{
- log_access_verdict(APLOG_MARK, r, 0, repos_path, NULL);
+ log_access_verdict(APLOG_MARK, r, 0, TRUE, repos_path, NULL);
return HTTP_FORBIDDEN;
}
}
- log_access_verdict(APLOG_MARK, r, 1, repos_path, NULL);
+ log_access_verdict(APLOG_MARK, r, 1, TRUE, repos_path, NULL);
return OK;
}
@@ -819,14 +883,57 @@ access_checker(request_rec *r)
&authz_svn_module);
const char *repos_path = NULL;
const char *dest_repos_path = NULL;
- int status;
+ int status, authn_required;
+
+#if USE_FORCE_AUTHN
+ /* Use the force_authn() hook available in 2.4.x to work securely
+ * given that ap_some_auth_required() is no longer functional for our
+ * purposes in 2.4.x.
+ */
+ int authn_configured;
+
+ /* We are not configured to run */
+ if (!conf->anonymous || apr_table_get(r->notes, IN_SOME_AUTHN_NOTE)
+ || (! (conf->access_file || conf->repo_relative_access_file)))
+ return DECLINED;
+
+ /* Authentication is configured */
+ authn_configured = ap_auth_type(r) != NULL;
+ if (authn_configured)
+ {
+ /* If the user is trying to authenticate, let him. It doesn't
+ * make much sense to grant anonymous access but deny authenticated
+ * users access, even though you can do that with '$anon' in the
+ * access file.
+ */
+ if (apr_table_get(r->headers_in,
+ (PROXYREQ_PROXY == r->proxyreq)
+ ? "Proxy-Authorization" : "Authorization"))
+ {
+ /* Set the note to force authn regardless of what access_checker_ex
+ hook requires */
+ apr_table_setn(r->notes, FORCE_AUTHN_NOTE, (const char*)1);
+
+ /* provide the proper return so the access_checker hook doesn't
+ * prevent the code from continuing on to the other auth hooks */
+ if (ap_satisfies(r) != SATISFY_ANY)
+ return OK;
+ else
+ return HTTP_FORBIDDEN;
+ }
+ }
+
+#else
+ /* Support for older versions of httpd that have a working
+ * ap_some_auth_required() */
/* We are not configured to run */
if (!conf->anonymous
|| (! (conf->access_file || conf->repo_relative_access_file)))
return DECLINED;
- if (ap_some_auth_required(r))
+ authn_required = ap_some_auth_required(r);
+ if (authn_required)
{
/* It makes no sense to check if a location is both accessible
* anonymous and by an authenticated user (in the same request!).
@@ -834,9 +941,10 @@ access_checker(request_rec *r)
if (ap_satisfies(r) != SATISFY_ANY)
return DECLINED;
- /* If the user is trying to authenticate, let him. If anonymous
- * access is allowed, so is authenticated access, by definition
- * of the meaning of '*' in the access file.
+ /* If the user is trying to authenticate, let him. It doesn't
+ * make much sense to grant anonymous access but deny authenticated
+ * users access, even though you can do that with '$anon' in the
+ * access file.
*/
if (apr_table_get(r->headers_in,
(PROXYREQ_PROXY == r->proxyreq)
@@ -848,6 +956,7 @@ access_checker(request_rec *r)
return HTTP_FORBIDDEN;
}
}
+#endif
/* If anon access is allowed, return OK */
status = req_check_access(r, conf, &repos_path, &dest_repos_path);
@@ -856,8 +965,29 @@ access_checker(request_rec *r)
if (!conf->authoritative)
return DECLINED;
- if (!ap_some_auth_required(r))
- log_access_verdict(APLOG_MARK, r, 0, repos_path, dest_repos_path);
+#if USE_FORCE_AUTHN
+ if (authn_configured) {
+ /* We have to check to see if authn is required because if so we must
+ * return DECLINED rather than FORBIDDEN (403) since returning
+ * the 403 leaks information about what paths may exist to
+ * unauthenticated users. Returning DECLINED means apache's request
+ * handling will continue until the authn module itself generates
+ * UNAUTHORIZED (401).
+
+ * We must set a note here in order to use
+ * ap_some_authn_rquired() without triggering an infinite
+ * loop since the call will trigger this function to be
+ * called again. */
+ apr_table_setn(r->notes, IN_SOME_AUTHN_NOTE, (const char*)1);
+ authn_required = ap_some_authn_required(r);
+ apr_table_unset(r->notes, IN_SOME_AUTHN_NOTE);
+ if (authn_required)
+ return DECLINED;
+ }
+#else
+ if (!authn_required)
+#endif
+ log_access_verdict(APLOG_MARK, r, 0, FALSE, repos_path, dest_repos_path);
return HTTP_FORBIDDEN;
}
@@ -865,7 +995,7 @@ access_checker(request_rec *r)
if (status != OK)
return status;
- log_access_verdict(APLOG_MARK, r, 1, repos_path, dest_repos_path);
+ log_access_verdict(APLOG_MARK, r, 1, FALSE, repos_path, dest_repos_path);
return OK;
}
@@ -892,7 +1022,7 @@ check_user_id(request_rec *r)
if (status == OK)
{
apr_table_setn(r->notes, "authz_svn-anon-ok", (const char*)1);
- log_access_verdict(APLOG_MARK, r, 1, repos_path, dest_repos_path);
+ log_access_verdict(APLOG_MARK, r, 1, FALSE, repos_path, dest_repos_path);
return OK;
}
@@ -922,7 +1052,7 @@ auth_checker(request_rec *r)
{
if (conf->authoritative)
{
- log_access_verdict(APLOG_MARK, r, 0, repos_path, dest_repos_path);
+ log_access_verdict(APLOG_MARK, r, 0, FALSE, repos_path, dest_repos_path);
ap_note_auth_failure(r);
return HTTP_FORBIDDEN;
}
@@ -932,11 +1062,22 @@ auth_checker(request_rec *r)
if (status != OK)
return status;
- log_access_verdict(APLOG_MARK, r, 1, repos_path, dest_repos_path);
+ log_access_verdict(APLOG_MARK, r, 1, FALSE, repos_path, dest_repos_path);
return OK;
}
+#if USE_FORCE_AUTHN
+static int
+force_authn(request_rec *r)
+{
+ if (apr_table_get(r->notes, FORCE_AUTHN_NOTE))
+ return OK;
+
+ return DECLINED;
+}
+#endif
+
/*
* Module flesh
*/
@@ -953,6 +1094,9 @@ register_hooks(apr_pool_t *p)
* give SSLOptions +FakeBasicAuth a chance to work. */
ap_hook_check_user_id(check_user_id, mod_ssl, NULL, APR_HOOK_FIRST);
ap_hook_auth_checker(auth_checker, NULL, NULL, APR_HOOK_FIRST);
+#if USE_FORCE_AUTHN
+ ap_hook_force_authn(force_authn, NULL, NULL, APR_HOOK_FIRST);
+#endif
ap_register_provider(p,
AUTHZ_SVN__SUBREQ_BYPASS_PROV_GRP,
AUTHZ_SVN__SUBREQ_BYPASS_PROV_NAME,
diff --git a/subversion/mod_dav_svn/activity.c b/subversion/mod_dav_svn/activity.c
index 895c4cf..1c779d2 100644
--- a/subversion/mod_dav_svn/activity.c
+++ b/subversion/mod_dav_svn/activity.c
@@ -193,7 +193,6 @@ dav_svn__store_activity(const dav_svn_repos *repos,
const char *txn_name)
{
const char *final_path;
- const char *tmp_path;
const char *activity_contents;
svn_error_t *err;
@@ -209,11 +208,9 @@ dav_svn__store_activity(const dav_svn_repos *repos,
activity_contents = apr_psprintf(repos->pool, "%s\n%s\n",
txn_name, activity_id);
- /* ### is there another directory we already have and can write to? */
- err = svn_io_write_unique(&tmp_path,
- svn_dirent_dirname(final_path, repos->pool),
+ err = svn_io_write_atomic(final_path,
activity_contents, strlen(activity_contents),
- svn_io_file_del_none, repos->pool);
+ NULL /* copy_perms path */, repos->pool);
if (err)
{
svn_error_t *serr = svn_error_quick_wrap(err,
@@ -225,15 +222,6 @@ dav_svn__store_activity(const dav_svn_repos *repos,
repos->pool);
}
- err = svn_io_file_rename(tmp_path, final_path, repos->pool);
- if (err)
- {
- svn_error_clear(svn_io_remove_file2(tmp_path, TRUE, repos->pool));
- return dav_svn__convert_err(err, HTTP_INTERNAL_SERVER_ERROR,
- "could not replace files.",
- repos->pool);
- }
-
return NULL;
}
diff --git a/subversion/mod_dav_svn/authz.c b/subversion/mod_dav_svn/authz.c
index 27763b0..9b5c7d6 100644
--- a/subversion/mod_dav_svn/authz.c
+++ b/subversion/mod_dav_svn/authz.c
@@ -57,7 +57,7 @@ dav_svn__allow_read(request_rec *r,
/* Sometimes we get paths that do not start with '/' and
hence below uri concatenation would lead to wrong uris .*/
if (path && path[0] != '/')
- path = apr_pstrcat(pool, "/", path, NULL);
+ path = apr_pstrcat(pool, "/", path, SVN_VA_NULL);
/* If bypass is specified and authz has exported the provider.
Otherwise, we fall through to the full version. This should be
@@ -80,7 +80,8 @@ dav_svn__allow_read(request_rec *r,
uri_type = DAV_SVN__BUILD_URI_PUBLIC;
/* Build a Version Resource uri representing (rev, path). */
- uri = dav_svn__build_uri(repos, uri_type, rev, path, FALSE, pool);
+ uri = dav_svn__build_uri(repos, uri_type, rev, path, FALSE /* add_href */,
+ pool);
/* Check if GET would work against this uri. */
subreq = ap_sub_req_method_uri("GET", uri, r, r->output_filters);
diff --git a/subversion/mod_dav_svn/dav_svn.h b/subversion/mod_dav_svn/dav_svn.h
index 8786518..9d11a0a 100644
--- a/subversion/mod_dav_svn/dav_svn.h
+++ b/subversion/mod_dav_svn/dav_svn.h
@@ -54,7 +54,7 @@ extern "C" {
/* Option values for SVNAllowBulkUpdates. Note that
it's important that CONF_BULKUPD_DEFAULT is 0 to make
- dav_svn_merge_dir_config do the right thing. */
+ merge_dir_config in mod_dav_svn do the right thing. */
typedef enum dav_svn__bulk_upd_conf {
CONF_BULKUPD_DEFAULT,
CONF_BULKUPD_ON,
@@ -329,6 +329,10 @@ svn_boolean_t dav_svn__get_fulltext_cache_flag(request_rec *r);
/* for the repository referred to by this request, is revprop caching active? */
svn_boolean_t dav_svn__get_revprop_cache_flag(request_rec *r);
+/* has block read mode been enabled for the repository referred to by this
+ * request? */
+svn_boolean_t dav_svn__get_block_read_flag(request_rec *r);
+
/* for the repository referred to by this request, are subrequests bypassed?
* A function pointer if yes, NULL if not.
*/
@@ -442,6 +446,40 @@ const char *dav_svn__get_vtxn_stub(request_rec *r);
/* For accessing transaction properties (typically "!svn/vtxr") */
const char *dav_svn__get_vtxn_root_stub(request_rec *r);
+
+/*** Output helpers ***/
+
+/* An opaque type which represents an output for a particular request.
+
+ All writes should target a dav_svn__output object by either using
+ the dav_svn__brigade functions or by preparing a bucket brigade and
+ passing it to the output with dav_svn__output_pass_brigade().
+
+ IMPORTANT: Don't write to an ap_filter_t coming from mod_dav, and
+ use this wrapper and the corresponding private API instead. Using
+ the ap_filter_t can cause unbounded memory usage with self-removing
+ output filters (e.g., with the filters installed by mod_headers or
+ mod_deflate).
+
+ See https://mail-archives.apache.org/mod_mbox/httpd-dev/201608.mbox/%3C20160822151917.GA22369%40redhat.com%3E
+*/
+typedef struct dav_svn__output dav_svn__output;
+
+/* Create the output wrapper for request R, allocated in POOL. */
+dav_svn__output *
+dav_svn__output_create(request_rec *r,
+ apr_pool_t *pool);
+
+/* Get a bucket allocator to use for all bucket/brigade creations
+ when writing to OUTPUT. */
+apr_bucket_alloc_t *
+dav_svn__output_get_bucket_alloc(dav_svn__output *output);
+
+/* Pass the bucket brigade BB down to the OUTPUT's filter stack. */
+svn_error_t *
+dav_svn__output_pass_brigade(dav_svn__output *output,
+ apr_bucket_brigade *bb);
+
/*** activity.c ***/
@@ -482,6 +520,8 @@ dav_svn__store_activity(const dav_svn_repos *repos,
/* POST request handler. (Used by HTTP protocol v2 clients only.) */
int dav_svn__method_post(request_rec *r);
+/* Request handler to GET Subversion internal status (FSFS cache). */
+int dav_svn__status(request_rec *r);
/*** repos.c ***/
@@ -628,7 +668,7 @@ dav_svn__insert_all_liveprops(request_rec *r,
/* Generate the HTTP response body for a successful MERGE. */
/* ### more docco */
dav_error *
-dav_svn__merge_response(ap_filter_t *output,
+dav_svn__merge_response(dav_svn__output *output,
const dav_svn_repos *repos,
svn_revnum_t new_rev,
const char *post_commit_err,
@@ -662,49 +702,49 @@ static const dav_report_elem dav_svn__reports_list[] = {
dav_error *
dav_svn__update_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__log_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__dated_rev_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_locations_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_location_segments_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__file_revs_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__replay_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_mergeinfo_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_locks_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_deleted_rev_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__get_inherited_props_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output);
+ dav_svn__output *output);
/*** posts/ ***/
@@ -712,11 +752,11 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
dav_error *
dav_svn__post_create_txn(const dav_resource *resource,
svn_skel_t *request_skel,
- ap_filter_t *output);
+ dav_svn__output *output);
dav_error *
dav_svn__post_create_txn_with_props(const dav_resource *resource,
svn_skel_t *request_skel,
- ap_filter_t *output);
+ dav_svn__output *output);
/*** authz.c ***/
@@ -792,12 +832,10 @@ dav_svn__authz_read_func(dav_svn__authz_read_baton *baton);
default value for the error code.
*/
dav_error *
-dav_svn__new_error_tag(apr_pool_t *pool,
+dav_svn__new_error_svn(apr_pool_t *pool,
int status,
int error_id,
- const char *desc,
- const char *namespace,
- const char *tagname);
+ const char *desc);
/* A wrapper around mod_dav's dav_new_error, mod_dav_svn uses this
@@ -878,7 +916,7 @@ dav_svn__build_uri(const dav_svn_repos *repos,
enum dav_svn__build_what what,
svn_revnum_t revision,
const char *path,
- int add_href,
+ svn_boolean_t add_href,
apr_pool_t *pool);
@@ -918,23 +956,28 @@ int dav_svn__find_ns(const apr_array_header_t *namespaces, const char *uri);
/* Write LEN bytes from DATA to OUTPUT using BB. */
svn_error_t *dav_svn__brigade_write(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *buf,
apr_size_t len);
/* Write NULL-terminated string STR to OUTPUT using BB. */
svn_error_t *dav_svn__brigade_puts(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *str);
/* Write data to OUTPUT using BB, using FMT as the output format string. */
svn_error_t *dav_svn__brigade_printf(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *fmt,
...)
__attribute__((format(printf, 3, 4)));
+/* Write an unspecified number of strings to OUTPUT using BB. */
+svn_error_t *dav_svn__brigade_putstrs(apr_bucket_brigade *bb,
+ dav_svn__output *output,
+ ...) SVN_NEEDS_SENTINEL_NULL;
+
@@ -968,11 +1011,10 @@ dav_svn__sanitize_error(svn_error_t *serr,
/* Return a writable generic stream that will encode its output to base64
- and send it to the Apache filter OUTPUT using BB. Allocate the stream in
- POOL. */
+ and send it to OUTPUT using BB. Allocate the stream in POOL. */
svn_stream_t *
dav_svn__make_base64_output_stream(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_pool_t *pool);
/* In INFO->r->subprocess_env set "SVN-ACTION" to LINE, "SVN-REPOS" to
@@ -1014,7 +1056,8 @@ dav_svn__operational_log(struct dav_resource_private *info, const char *line);
*/
dav_error *
dav_svn__final_flush_or_error(request_rec *r, apr_bucket_brigade *bb,
- ap_filter_t *output, dav_error *preferred_err,
+ dav_svn__output *output,
+ dav_error *preferred_err,
apr_pool_t *pool);
/* Log a DAV error response.
diff --git a/subversion/mod_dav_svn/deadprops.c b/subversion/mod_dav_svn/deadprops.c
index 5d228a4..94e1a69 100644
--- a/subversion/mod_dav_svn/deadprops.c
+++ b/subversion/mod_dav_svn/deadprops.c
@@ -339,7 +339,7 @@ db_open(apr_pool_t *p,
db->p = svn_pool_create(p);
/* ### temp hack */
- db->work = svn_stringbuf_ncreate("", 0, db->p);
+ db->work = svn_stringbuf_create_empty(db->p);
/* make our path-based authz callback available to svn_repos_* funcs. */
arb = apr_pcalloc(p, sizeof(*arb));
@@ -654,16 +654,14 @@ static void get_name(dav_db *db, dav_prop_name *pname)
}
else
{
- const void *name;
-
- apr_hash_this(db->hi, &name, NULL, NULL);
+ const char *name = apr_hash_this_key(db->hi);
#define PREFIX_LEN (sizeof(SVN_PROP_PREFIX) - 1)
if (strncmp(name, SVN_PROP_PREFIX, PREFIX_LEN) == 0)
#undef PREFIX_LEN
{
pname->ns = SVN_DAV_PROP_NS_SVN;
- pname->name = (const char *)name + 4;
+ pname->name = name + 4;
}
else
{
diff --git a/subversion/mod_dav_svn/liveprops.c b/subversion/mod_dav_svn/liveprops.c
index 725ee92..384a810 100644
--- a/subversion/mod_dav_svn/liveprops.c
+++ b/subversion/mod_dav_svn/liveprops.c
@@ -36,6 +36,7 @@
#include "svn_time.h"
#include "svn_dav.h"
#include "svn_props.h"
+#include "svn_ctype.h"
#include "private/svn_dav_protocol.h"
@@ -422,7 +423,43 @@ insert_prop_internal(const dav_resource *resource,
if (last_author == NULL)
return DAV_PROP_INSERT_NOTDEF;
- value = apr_xml_quote_string(scratch_pool, last_author->data, 1);
+ if (svn_xml_is_xml_safe(last_author->data, last_author->len)
+ || !resource->info->repos->is_svn_client)
+ value = apr_xml_quote_string(scratch_pool, last_author->data, 1);
+ else
+ {
+ /* We are talking to a Subversion client, which will (like any proper
+ xml parser) error out if we produce control characters in XML.
+
+ However Subversion clients process both the generic
+ <creator-displayname /> as the custom element for svn:author.
+
+ Let's skip outputting the invalid characters here to make the XML
+ valid, so clients can see the custom element.
+
+ Subversion Clients will then either use a slightly invalid
+ author (unlikely) or more likely use the second result, which
+ will be transferred with full escaping capabilities.
+
+ We have tests in place to assert proper behavior over the RA layer.
+ */
+ apr_size_t i;
+ svn_stringbuf_t *buf;
+
+ buf = svn_stringbuf_create_from_string(last_author, scratch_pool);
+
+ for (i = 0; i < buf->len; i++)
+ {
+ char c = buf->data[i];
+
+ if (svn_ctype_iscntrl(c))
+ {
+ svn_stringbuf_remove(buf, i--, 1);
+ }
+ }
+
+ value = apr_xml_quote_string(scratch_pool, buf->data, 1);
+ }
break;
}
@@ -549,7 +586,7 @@ insert_prop_internal(const dav_resource *resource,
return DAV_PROP_INSERT_NOTSUPP;
value = dav_svn__build_uri(resource->info->repos, DAV_SVN__BUILD_URI_BC,
resource->info->root.rev, NULL,
- 1 /* add_href */, scratch_pool);
+ TRUE /* add_href */, scratch_pool);
break;
case DAV_PROPID_checked_in:
@@ -578,7 +615,8 @@ insert_prop_internal(const dav_resource *resource,
}
s = dav_svn__build_uri(resource->info->repos,
DAV_SVN__BUILD_URI_BASELINE,
- revnum, NULL, 0 /* add_href */, scratch_pool);
+ revnum, NULL, FALSE /* add_href */,
+ scratch_pool);
value = apr_psprintf(scratch_pool, "<D:href>%s</D:href>",
apr_xml_quote_string(scratch_pool, s, 1));
}
@@ -596,7 +634,7 @@ insert_prop_internal(const dav_resource *resource,
s = dav_svn__build_uri(resource->info->repos,
DAV_SVN__BUILD_URI_VERSION,
rev_to_use, resource->info->repos_path,
- 0 /* add_href */, scratch_pool);
+ FALSE /* add_href */, scratch_pool);
value = apr_psprintf(scratch_pool, "<D:href>%s</D:href>",
apr_xml_quote_string(scratch_pool, s, 1));
}
@@ -610,7 +648,7 @@ insert_prop_internal(const dav_resource *resource,
return DAV_PROP_INSERT_NOTSUPP;
value = dav_svn__build_uri(resource->info->repos, DAV_SVN__BUILD_URI_VCC,
SVN_IGNORED_REVNUM, NULL,
- 1 /* add_href */, scratch_pool);
+ TRUE /* add_href */, scratch_pool);
break;
case DAV_PROPID_version_name:
@@ -749,20 +787,30 @@ insert_prop_internal(const dav_resource *resource,
case SVN_PROPID_deadprop_count:
{
- unsigned int propcount;
- apr_hash_t *proplist;
+ svn_boolean_t has_props;
if (resource->type != DAV_RESOURCE_TYPE_REGULAR)
return DAV_PROP_INSERT_NOTSUPP;
- serr = svn_fs_node_proplist(&proplist,
- resource->info->root.root,
- resource->info->repos_path, scratch_pool);
+ /* Retrieving the actual properties is quite expensive while
+ svn clients only want to know if there are properties, by
+ using this svn defined property.
+
+ Our and and SvnKit's implementation of the ra layer check
+ for '> 0' to provide the boolean if the node has custom
+ properties or not, so starting with 1.9 we just provide
+ "1" or "0".
+ */
+ serr = svn_fs_node_has_props(&has_props,
+ resource->info->root.root,
+ resource->info->repos_path,
+ scratch_pool);
+
if (serr != NULL)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR, serr->apr_err,
resource->info->r,
- "Can't fetch proplist of '%s': "
+ "Can't fetch has properties on '%s': "
"%s",
resource->info->repos_path,
serr->message);
@@ -771,8 +819,7 @@ insert_prop_internal(const dav_resource *resource,
break;
}
- propcount = apr_hash_count(proplist);
- value = apr_psprintf(scratch_pool, "%u", propcount);
+ value = has_props ? "1" : "0";
break;
}
diff --git a/subversion/mod_dav_svn/lock.c b/subversion/mod_dav_svn/lock.c
index 68d6de5..06c038a 100644
--- a/subversion/mod_dav_svn/lock.c
+++ b/subversion/mod_dav_svn/lock.c
@@ -92,7 +92,7 @@ svn_lock_to_dav_lock(dav_lock **dlock,
"<D:owner xmlns:D=\"DAV:\">",
apr_xml_quote_string(pool,
slock->comment, 1),
- "</D:owner>", (char *)NULL);
+ "</D:owner>", SVN_VA_NULL);
}
else
{
@@ -134,7 +134,7 @@ unescape_xml(const char **output,
apr_xml_doc *xml_doc;
apr_status_t apr_err;
const char *xml_input = apr_pstrcat
- (pool, "<?xml version=\"1.0\" encoding=\"utf-8\"?>", input, (char *)NULL);
+ (pool, "<?xml version=\"1.0\" encoding=\"utf-8\"?>", input, SVN_VA_NULL);
apr_err = apr_xml_parser_feed(xml_parser, xml_input, strlen(xml_input));
if (!apr_err)
@@ -274,8 +274,13 @@ parse_locktoken(apr_pool_t *pool,
static const char *
format_locktoken(apr_pool_t *p, const dav_locktoken *locktoken)
{
- /* libsvn_fs already produces a valid locktoken URI. */
- return apr_pstrdup(p, locktoken->uuid_str);
+ svn_stringbuf_t *formatted
+ = svn_stringbuf_create_ensure(strlen(locktoken->uuid_str), p);
+
+ /* libsvn_fs produces a locktoken URI that will be valid XML when
+ escaped. */
+ svn_xml_escape_cdata_cstring(&formatted, locktoken->uuid_str, p);
+ return formatted->data;
}
@@ -782,7 +787,31 @@ append_locks(dav_lockdb *lockdb,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock creation is not allowed.");
}
- else if (serr && (serr->apr_err == SVN_ERR_REPOS_HOOK_FAILURE ||
+ else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED)
+ {
+ /* The lock was created in the repository, so we should report the node
+ as locked to the client */
+
+ /* First log the hook failure, for diagnostics. This clears serr */
+ dav_svn__log_err(info->r,
+ dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Post lock hook failure.",
+ resource->pool),
+ APLOG_WARNING);
+
+ /* How can we report the error to the client?
+
+ We can't return an error code, as that would make it impossible
+ to return the lock details?
+
+ Add yet another custom header?
+ Just an header doesn't handle a full error chain...
+
+ ### Current behavior: we don't report an error.
+ */
+
+ }
+ else if (serr && (svn_error_find_cause(serr, SVN_ERR_REPOS_HOOK_FAILURE) ||
serr->apr_err == SVN_ERR_FS_NO_SUCH_LOCK ||
serr->apr_err == SVN_ERR_FS_LOCK_EXPIRED ||
SVN_ERR_IS_LOCK_ERROR(serr)))
@@ -838,14 +867,14 @@ remove_lock(dav_lockdb *lockdb,
/* Sanity check: if the resource has no associated path in the fs,
then there's nothing to do. */
if (! resource->info->repos_path)
- return 0;
+ return NULL;
/* Another easy out: if an svn client sent a 'keep_locks' header
(typically in a DELETE request, as part of 'svn commit
--no-unlock'), then ignore dav_method_delete()'s attempt to
unconditionally remove the lock. */
if (info->keep_locks)
- return 0;
+ return NULL;
/* If the resource's fs path is unreadable, we don't allow a lock to
be removed from it. */
@@ -892,6 +921,22 @@ remove_lock(dav_lockdb *lockdb,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock removal is not allowed.");
}
+ else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED
+ && !resource->info->repos->is_svn_client)
+ {
+ /* Generic DAV clients don't understand the specific error code we
+ would produce here as being just a warning, so lets produce a
+ success result. We removed the lock anyway. */
+
+ /* First log the hook failure, for diagnostics. This clears serr */
+ dav_svn__log_err(info->r,
+ dav_svn__convert_err(serr,
+ HTTP_INTERNAL_SERVER_ERROR,
+ "Post unlock hook failure.",
+ resource->pool),
+ APLOG_WARNING);
+
+ }
else if (serr)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"Failed to remove a lock.",
@@ -905,10 +950,41 @@ remove_lock(dav_lockdb *lockdb,
resource->info->r->pool));
}
- return 0;
+ return NULL;
+}
+
+static dav_error *
+remove_lock_svn_output(dav_lockdb *lockdb,
+ const dav_resource *resource,
+ const dav_locktoken *locktoken)
+{
+ dav_error *derr = remove_lock(lockdb, resource, locktoken);
+ int status;
+
+ if (!derr
+ || !resource->info->repos
+ || !resource->info->repos->is_svn_client
+ || (strcmp(lockdb->info->r->method, "UNLOCK") != 0))
+ return derr;
+
+ /* Ok, we have a nice error chain but mod_dav doesn't offer us a way to
+ present it to the client as it will only use the status code for
+ generating a standard error...
+
+ Luckily the unlock processing for the "UNLOCK" method is very simple:
+ call this function and return the result.
+
+ That allows us to just force a response and tell httpd that we are done */
+ status = dav_svn__error_response_tag(lockdb->info->r, derr);
+
+ /* status = DONE */
+
+ /* And push an error that will make mod_dav just report that it is done */
+ return dav_push_error(resource->pool, status, derr->error_id, NULL, derr);
}
+
/*
** Refresh all locks, found on the specified resource, which has a
** locktoken in the provided list.
@@ -980,7 +1056,7 @@ refresh_locks(dav_lockdb *lockdb,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock refreshing is not allowed.");
}
- else if (serr && (serr->apr_err == SVN_ERR_REPOS_HOOK_FAILURE ||
+ else if (serr && (svn_error_find_cause(serr, SVN_ERR_REPOS_HOOK_FAILURE) ||
serr->apr_err == SVN_ERR_FS_NO_SUCH_LOCK ||
serr->apr_err == SVN_ERR_FS_LOCK_EXPIRED ||
SVN_ERR_IS_LOCK_ERROR(serr)))
@@ -1014,7 +1090,7 @@ const dav_hooks_locks dav_svn__hooks_locks = {
find_lock,
has_locks,
append_locks,
- remove_lock,
+ remove_lock_svn_output,
refresh_locks,
NULL,
NULL /* hook structure context */
diff --git a/subversion/mod_dav_svn/merge.c b/subversion/mod_dav_svn/merge.c
index 3d6d80b..5407a0f 100644
--- a/subversion/mod_dav_svn/merge.c
+++ b/subversion/mod_dav_svn/merge.c
@@ -72,21 +72,20 @@ send_response(const dav_svn_repos *repos,
svn_fs_root_t *root,
const char *path,
svn_boolean_t is_dir,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_bucket_brigade *bb,
apr_pool_t *pool)
{
const char *href;
const char *vsn_url;
- apr_status_t status;
svn_revnum_t rev_to_use;
href = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_PUBLIC,
SVN_IGNORED_REVNUM, path, 0 /* add_href */, pool);
rev_to_use = dav_svn__get_safe_cr(root, path, pool);
vsn_url = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_VERSION,
- rev_to_use, path, 0 /* add_href */, pool);
- status = ap_fputstrs(output, bb,
+ rev_to_use, path, FALSE /* add_href */, pool);
+ SVN_ERR(dav_svn__brigade_putstrs(bb, output,
"<D:response>" DEBUG_CR
"<D:href>",
apr_xml_quote_string(pool, href, 1),
@@ -103,9 +102,7 @@ send_response(const dav_svn_repos *repos,
"<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
"</D:propstat>" DEBUG_CR
"</D:response>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return svn_error_wrap_apr(status, "Can't write response to output");
+ SVN_VA_NULL));
return SVN_NO_ERROR;
}
@@ -115,7 +112,7 @@ static svn_error_t *
do_resources(const dav_svn_repos *repos,
svn_fs_root_t *root,
svn_revnum_t revision,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_bucket_brigade *bb,
apr_pool_t *pool)
{
@@ -136,12 +133,13 @@ do_resources(const dav_svn_repos *repos,
const void *key;
void *val;
const char *path;
+ apr_ssize_t path_len;
svn_fs_path_change2_t *change;
svn_boolean_t send_self;
svn_boolean_t send_parent;
svn_pool_clear(subpool);
- apr_hash_this(hi, &key, NULL, &val);
+ apr_hash_this(hi, &key, &path_len, &val);
path = key;
change = val;
@@ -170,14 +168,14 @@ do_resources(const dav_svn_repos *repos,
{
/* If we haven't already sent this path, send it (and then
remember that we sent it). */
- if (! svn_hash_gets(sent, path))
+ if (! apr_hash_get(sent, path, path_len))
{
svn_node_kind_t kind;
SVN_ERR(svn_fs_check_path(&kind, root, path, subpool));
SVN_ERR(send_response(repos, root, path,
kind == svn_node_dir,
output, bb, subpool));
- svn_hash_sets(sent, path, (void *)1);
+ apr_hash_set(sent, path, path_len, (void *)1);
}
}
if (send_parent)
@@ -208,7 +206,7 @@ do_resources(const dav_svn_repos *repos,
*/
dav_error *
-dav_svn__merge_response(ap_filter_t *output,
+dav_svn__merge_response(dav_svn__output *output,
const dav_svn_repos *repos,
svn_revnum_t new_rev,
const char *post_commit_err,
@@ -224,7 +222,6 @@ dav_svn__merge_response(ap_filter_t *output,
svn_string_t *creationdate, *creator_displayname;
const char *post_commit_err_elem = NULL,
*post_commit_header_info = NULL;
- apr_status_t status;
serr = svn_fs_revision_root(&root, repos->fs, new_rev, pool);
if (serr != NULL)
@@ -235,13 +232,14 @@ dav_svn__merge_response(ap_filter_t *output,
repos->pool);
}
- bb = apr_brigade_create(pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(pool,
+ dav_svn__output_get_bucket_alloc(output));
/* prep some strings */
/* the HREF for the baseline is actually the VCC */
vcc = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_VCC, SVN_IGNORED_REVNUM,
- NULL, 0 /* add_href */, pool);
+ NULL, FALSE /* add_href */, pool);
/* the version-name of the baseline is the revision number */
rev = apr_psprintf(pool, "%ld", new_rev);
@@ -285,7 +283,7 @@ dav_svn__merge_response(ap_filter_t *output,
}
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
DAV_XML_HEADER DEBUG_CR
"<D:merge-response xmlns:D=\"DAV:\"",
post_commit_header_info,
@@ -304,44 +302,47 @@ dav_svn__merge_response(ap_filter_t *output,
"<D:resourcetype><D:baseline/></D:resourcetype>" DEBUG_CR,
post_commit_err_elem, DEBUG_CR
"<D:version-name>", rev, "</D:version-name>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
if (creationdate)
{
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"<D:creationdate>",
apr_xml_quote_string(pool, creationdate->data, 1),
"</D:creationdate>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
}
if (creator_displayname)
{
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"<D:creator-displayname>",
apr_xml_quote_string(pool,
creator_displayname->data, 1),
"</D:creator-displayname>" DEBUG_CR,
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
}
- status = ap_fputstrs(output, bb,
+ serr = dav_svn__brigade_putstrs(bb, output,
"</D:prop>" DEBUG_CR
"<D:status>HTTP/1.1 200 OK</D:status>" DEBUG_CR
"</D:propstat>" DEBUG_CR
"</D:response>" DEBUG_CR,
-
- NULL);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ SVN_VA_NULL);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
/* ONLY have dir_delta drive the editor if the caller asked us to
generate a full MERGE response. svn clients can ask us to
@@ -370,18 +371,20 @@ dav_svn__merge_response(ap_filter_t *output,
}
/* wrap up the merge response */
- status = ap_fputs(output, bb,
- "</D:updated-set>" DEBUG_CR
- "</D:merge-response>" DEBUG_CR);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ serr = dav_svn__brigade_puts(bb, output,
+ "</D:updated-set>" DEBUG_CR
+ "</D:merge-response>" DEBUG_CR);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
/* send whatever is left in the brigade */
- status = ap_pass_brigade(output, bb);
- if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write output");
+ serr = dav_svn__output_pass_brigade(output, bb);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write output",
+ repos->pool);
return NULL;
}
diff --git a/subversion/mod_dav_svn/mirror.c b/subversion/mod_dav_svn/mirror.c
index e8b19a8..5b0f1f5 100644
--- a/subversion/mod_dav_svn/mirror.c
+++ b/subversion/mod_dav_svn/mirror.c
@@ -56,7 +56,7 @@ static int proxy_request_fixup(request_rec *r,
r->filename = (char *) svn_path_uri_encode(apr_pstrcat(r->pool, "proxy:",
master_uri,
uri_segment,
- (char *)NULL),
+ SVN_VA_NULL),
r->pool);
r->handler = "proxy-server";
@@ -102,11 +102,11 @@ int dav_svn__proxy_request_fixup(request_rec *r)
r->method_number == M_GET) {
if ((seg = ap_strstr(r->uri, root_dir))) {
if (ap_strstr_c(seg, apr_pstrcat(r->pool, special_uri,
- "/wrk/", (char *)NULL))
+ "/wrk/", SVN_VA_NULL))
|| ap_strstr_c(seg, apr_pstrcat(r->pool, special_uri,
- "/txn/", (char *)NULL))
+ "/txn/", SVN_VA_NULL))
|| ap_strstr_c(seg, apr_pstrcat(r->pool, special_uri,
- "/txr/", (char *)NULL))) {
+ "/txr/", SVN_VA_NULL))) {
int rv;
seg += strlen(root_dir);
rv = proxy_request_fixup(r, master_uri, seg);
@@ -259,7 +259,7 @@ apr_status_t dav_svn__location_header_filter(ap_filter_t *f,
new_uri = ap_construct_url(r->pool,
apr_pstrcat(r->pool,
dav_svn__get_root_dir(r), "/",
- start_foo, (char *)NULL),
+ start_foo, SVN_VA_NULL),
r);
apr_table_set(r->headers_out, "Location", new_uri);
}
diff --git a/subversion/mod_dav_svn/mod_dav_svn.c b/subversion/mod_dav_svn/mod_dav_svn.c
index a97d307..a6988fd 100644
--- a/subversion/mod_dav_svn/mod_dav_svn.c
+++ b/subversion/mod_dav_svn/mod_dav_svn.c
@@ -72,7 +72,7 @@ typedef struct server_conf_t {
/* A tri-state enum used for per directory on/off flags. Note that
it's important that CONF_FLAG_DEFAULT is 0 to make
- dav_svn_merge_dir_config do the right thing. */
+ merge_dir_config in mod_dav_svn do the right thing. */
enum conf_flag {
CONF_FLAG_DEFAULT,
CONF_FLAG_ON,
@@ -105,6 +105,7 @@ typedef struct dir_conf_t {
enum conf_flag txdelta_cache; /* whether to enable txdelta caching */
enum conf_flag fulltext_cache; /* whether to enable fulltext caching */
enum conf_flag revprop_cache; /* whether to enable revprop caching */
+ enum conf_flag block_read; /* whether to enable block read mode */
const char *hooks_env; /* path to hook script env config file */
} dir_conf_t;
@@ -142,6 +143,25 @@ init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
return OK;
}
+static svn_error_t *
+malfunction_handler(svn_boolean_t can_return,
+ const char *file, int line,
+ const char *expr)
+{
+ if (expr)
+ ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL,
+ "mod_dav_svn: file '%s', line %d, assertion \"%s\" failed",
+ file, line, expr);
+ else
+ ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL,
+ "mod_dav_svn: file '%s', line %d, internal malfunction",
+ file, line);
+ abort();
+
+ /* Should not be reached. */
+ return SVN_NO_ERROR;
+}
+
static int
init_dso(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
{
@@ -161,6 +181,8 @@ init_dso(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
return HTTP_INTERNAL_SERVER_ERROR;
}
+ svn_error_set_malfunction_handler(malfunction_handler);
+
return OK;
}
@@ -215,8 +237,9 @@ create_dir_config(apr_pool_t *p, char *dir)
if (dir)
conf->root_dir = svn_urlpath__canonicalize(dir, p);
conf->bulk_updates = CONF_BULKUPD_DEFAULT;
- conf->v2_protocol = CONF_FLAG_ON;
+ conf->v2_protocol = CONF_FLAG_DEFAULT;
conf->hooks_env = NULL;
+ conf->txdelta_cache = CONF_FLAG_DEFAULT;
return conf;
}
@@ -247,6 +270,7 @@ merge_dir_config(apr_pool_t *p, void *base, void *overrides)
newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache);
newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache);
newconf->revprop_cache = INHERIT_VALUE(parent, child, revprop_cache);
+ newconf->block_read = INHERIT_VALUE(parent, child, block_read);
newconf->root_dir = INHERIT_VALUE(parent, child, root_dir);
newconf->hooks_env = INHERIT_VALUE(parent, child, hooks_env);
@@ -543,6 +567,19 @@ SVNCacheRevProps_cmd(cmd_parms *cmd, void *config, int arg)
}
static const char *
+SVNBlockRead_cmd(cmd_parms *cmd, void *config, int arg)
+{
+ dir_conf_t *conf = config;
+
+ if (arg)
+ conf->block_read = CONF_FLAG_ON;
+ else
+ conf->block_read = CONF_FLAG_OFF;
+
+ return NULL;
+}
+
+static const char *
SVNInMemoryCacheSize_cmd(cmd_parms *cmd, void *config, const char *arg1)
{
svn_cache_config_t settings = *svn_cache_config_get();
@@ -612,6 +649,16 @@ SVNHooksEnv_cmd(cmd_parms *cmd, void *config, const char *arg1)
return NULL;
}
+static svn_boolean_t
+get_conf_flag(enum conf_flag flag, svn_boolean_t default_value)
+{
+ if (flag == CONF_FLAG_ON)
+ return TRUE;
+ else if (flag == CONF_FLAG_OFF)
+ return FALSE;
+ else /* CONF_FLAG_DEFAULT*/
+ return default_value;
+}
/** Accessor functions for the module's configuration state **/
@@ -636,9 +683,10 @@ dav_svn__get_fs_parent_path(request_rec *r)
AP_MODULE_DECLARE(dav_error *)
-dav_svn_get_repos_path(request_rec *r,
- const char *root_path,
- const char **repos_path)
+dav_svn_get_repos_path2(request_rec *r,
+ const char *root_path,
+ const char **repos_path,
+ apr_pool_t *pool)
{
const char *fs_path;
@@ -666,19 +714,26 @@ dav_svn_get_repos_path(request_rec *r,
/* Split the svn URI to get the name of the repository below
the parent path. */
- derr = dav_svn_split_uri(r, r->uri, root_path,
- &ignored_cleaned_uri, &ignored_had_slash,
- &repos_name,
- &ignored_relative, &ignored_path_in_repos);
+ derr = dav_svn_split_uri2(r, r->uri, root_path,
+ &ignored_cleaned_uri, &ignored_had_slash,
+ &repos_name,
+ &ignored_relative, &ignored_path_in_repos, pool);
if (derr)
return derr;
/* Construct the full path from the parent path base directory
and the repository name. */
- *repos_path = svn_dirent_join(fs_parent_path, repos_name, r->pool);
+ *repos_path = svn_dirent_join(fs_parent_path, repos_name, pool);
return NULL;
}
+AP_MODULE_DECLARE(dav_error *)
+dav_svn_get_repos_path(request_rec *r,
+ const char *root_path,
+ const char **repos_path)
+{
+ return dav_svn_get_repos_path2(r, root_path, repos_path, r->pool);
+}
const char *
dav_svn__get_repo_name(request_rec *r)
@@ -745,7 +800,7 @@ const char *
dav_svn__get_me_resource_uri(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/me",
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -753,7 +808,7 @@ const char *
dav_svn__get_rev_stub(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/rev",
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -761,7 +816,7 @@ const char *
dav_svn__get_rev_root_stub(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/rvr",
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -769,14 +824,14 @@ const char *
dav_svn__get_txn_stub(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txn",
- (char *)NULL);
+ SVN_VA_NULL);
}
const char *
dav_svn__get_txn_root_stub(request_rec *r)
{
- return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txr", (char *)NULL);
+ return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/txr", SVN_VA_NULL);
}
@@ -784,7 +839,7 @@ const char *
dav_svn__get_vtxn_stub(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxn",
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -792,7 +847,7 @@ const char *
dav_svn__get_vtxn_root_stub(request_rec *r)
{
return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxr",
- (char *)NULL);
+ SVN_VA_NULL);
}
@@ -828,7 +883,7 @@ dav_svn__check_httpv2_support(request_rec *r)
svn_boolean_t available;
conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
- available = conf->v2_protocol == CONF_FLAG_ON;
+ available = get_conf_flag(conf->v2_protocol, TRUE);
/* If our configuration says that HTTPv2 is available, but we are
proxying requests to a master Subversion server which lacks
@@ -911,7 +966,9 @@ dav_svn__get_txdelta_cache_flag(request_rec *r)
dir_conf_t *conf;
conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
- return conf->txdelta_cache == CONF_FLAG_ON;
+
+ /* txdelta caching is enabled by default. */
+ return get_conf_flag(conf->txdelta_cache, TRUE);
}
@@ -935,6 +992,15 @@ dav_svn__get_revprop_cache_flag(request_rec *r)
}
+svn_boolean_t
+dav_svn__get_block_read_flag(request_rec *r)
+{
+ dir_conf_t *conf;
+
+ conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
+ return conf->block_read == CONF_FLAG_ON;
+}
+
int
dav_svn__get_compression_level(request_rec *r)
{
@@ -984,7 +1050,6 @@ merge_xml_filter_insert(request_rec *r)
typedef struct merge_ctx_t {
apr_bucket_brigade *bb;
apr_xml_parser *parser;
- apr_pool_t *pool;
} merge_ctx_t;
@@ -1014,7 +1079,6 @@ merge_xml_in_filter(ap_filter_t *f,
f->ctx = ctx = apr_palloc(r->pool, sizeof(*ctx));
ctx->parser = apr_xml_parser_create(r->pool);
ctx->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
- apr_pool_create(&ctx->pool, r->pool);
}
rv = ap_get_brigade(f->next, ctx->bb, mode, block, readbytes);
@@ -1103,10 +1167,11 @@ static int dav_svn__handler(request_rec *r)
/* Fill the filename on the request with a bogus path since we aren't serving
* a file off the disk. This means that <Directory> blocks will not match and
- * that %f in logging formats will show as "svn:/path/to/repo/path/in/repo". */
+ * %f in logging formats will show as "dav_svn:/path/to/repo/path/in/repo".
+ */
static int dav_svn__translate_name(request_rec *r)
{
- const char *fs_path, *repos_basename, *repos_path, *slash;
+ const char *fs_path, *repos_basename, *repos_path;
const char *ignore_cleaned_uri, *ignore_relative_path;
int ignore_had_slash;
dir_conf_t *conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
@@ -1148,19 +1213,11 @@ static int dav_svn__translate_name(request_rec *r)
fs_path = conf->fs_path;
}
- /* Avoid a trailing slash on the bogus path when repos_path is just "/" and
- * ensure that there is always a slash between fs_path and repos_path as
- * long as the repos_path is not an empty path. */
- slash = "";
- if (repos_path)
- {
- if ('/' == repos_path[0] && '\0' == repos_path[1])
- repos_path = NULL;
- else if ('/' != repos_path[0] && '\0' != repos_path[0])
- slash = "/";
- }
+ /* Avoid a trailing slash on the bogus path when repos_path is just "/" */
+ if (repos_path && '/' == repos_path[0] && '\0' == repos_path[1])
+ repos_path = NULL;
- /* Combine 'svn:', fs_path and repos_path to produce the bogus path we're
+ /* Combine 'dav_svn:', fs_path and repos_path to produce the bogus path we're
* placing in r->filename. We can't use our standard join helpers such
* as svn_dirent_join. fs_path is a dirent and repos_path is a fspath
* (that can be trivially converted to a relpath by skipping the leading
@@ -1168,7 +1225,7 @@ static int dav_svn__translate_name(request_rec *r)
* repository is 'trunk/c:hi' this results in a non canonical dirent on
* Windows. Instead we just cat them together. */
r->filename = apr_pstrcat(r->pool,
- "svn:", fs_path, slash, repos_path, NULL);
+ "dav_svn:", fs_path, repos_path, SVN_VA_NULL);
/* Leave a note to ourselves so that we know not to decline in the
* map_to_storage hook. */
@@ -1268,7 +1325,7 @@ static const command_rec cmds[] =
ACCESS_CONF|RSRC_CONF,
"speeds up data access to older revisions by caching "
"delta information if sufficient in-memory cache is "
- "available (default is Off)."),
+ "available (default is On)."),
/* per directory/location */
AP_INIT_FLAG("SVNCacheFullTexts", SVNCacheFullTexts_cmd, NULL,
@@ -1285,12 +1342,19 @@ static const command_rec cmds[] =
"in the documentation"
"(default is Off)."),
+ /* per directory/location */
+ AP_INIT_FLAG("SVNBlockRead", SVNBlockRead_cmd, NULL,
+ ACCESS_CONF|RSRC_CONF,
+ "speeds up operations of FSFS 1.9+ repositories if large"
+ "caches (see SVNInMemoryCacheSize) have been configured."
+ "(default is Off)."),
+
/* per server */
AP_INIT_TAKE1("SVNInMemoryCacheSize", SVNInMemoryCacheSize_cmd, NULL,
RSRC_CONF,
"specifies the maximum size in kB per process of Subversion's "
- "in-memory object cache (default value is 16384; 0 deactivates "
- "the cache)."),
+ "in-memory object cache (default value is 16384; 0 switches "
+ "to dynamically sized caches)."),
/* per server */
AP_INIT_TAKE1("SVNCompressionLevel", SVNCompressionLevel_cmd, NULL,
RSRC_CONF,
@@ -1345,6 +1409,9 @@ register_hooks(apr_pool_t *pconf)
/* general request handler for methods which mod_dav DECLINEs. */
ap_hook_handler(dav_svn__handler, NULL, NULL, APR_HOOK_LAST);
+ /* Handler to GET Subversion's FSFS cache stats, a bit like mod_status. */
+ ap_hook_handler(dav_svn__status, NULL, NULL, APR_HOOK_MIDDLE);
+
/* live property handling */
dav_hook_gather_propsets(dav_svn__gather_propsets, NULL, NULL,
APR_HOOK_MIDDLE);
diff --git a/subversion/mod_dav_svn/posts/create_txn.c b/subversion/mod_dav_svn/posts/create_txn.c
index 4775749..b5e4e99 100644
--- a/subversion/mod_dav_svn/posts/create_txn.c
+++ b/subversion/mod_dav_svn/posts/create_txn.c
@@ -34,7 +34,7 @@
dav_error *
dav_svn__post_create_txn(const dav_resource *resource,
svn_skel_t *request_skel,
- ap_filter_t *output)
+ dav_svn__output *output)
{
const char *txn_name;
const char *vtxn_name;
@@ -75,7 +75,7 @@ dav_svn__post_create_txn(const dav_resource *resource,
dav_error *
dav_svn__post_create_txn_with_props(const dav_resource *resource,
svn_skel_t *request_skel,
- ap_filter_t *output)
+ dav_svn__output *output)
{
const char *txn_name;
const char *vtxn_name;
diff --git a/subversion/mod_dav_svn/reports/dated-rev.c b/subversion/mod_dav_svn/reports/dated-rev.c
index 61d26f5..5ba607b 100644
--- a/subversion/mod_dav_svn/reports/dated-rev.c
+++ b/subversion/mod_dav_svn/reports/dated-rev.c
@@ -50,7 +50,7 @@
dav_error *
dav_svn__dated_rev_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
apr_xml_elem *child;
int ns;
@@ -58,7 +58,6 @@ dav_svn__dated_rev_report(const dav_resource *resource,
svn_revnum_t rev;
apr_bucket_brigade *bb;
svn_error_t *err;
- apr_status_t apr_err;
dav_error *derr = NULL;
/* Find the DAV:creationdate element and get the requested time from it. */
@@ -94,15 +93,16 @@ dav_svn__dated_rev_report(const dav_resource *resource,
"Could not access revision times.");
}
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
- apr_err = ap_fprintf(output, bb,
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
+ err = dav_svn__brigade_printf(bb, output,
DAV_XML_HEADER DEBUG_CR
"<S:dated-rev-report xmlns:S=\"" SVN_XML_NAMESPACE "\" "
"xmlns:D=\"DAV:\">" DEBUG_CR
"<D:" SVN_DAV__VERSION_NAME ">%ld</D:"
SVN_DAV__VERSION_NAME ">""</S:dated-rev-report>", rev);
- if (apr_err)
- derr = dav_svn__convert_err(svn_error_create(apr_err, 0, NULL),
+ if (err)
+ derr = dav_svn__convert_err(err,
HTTP_INTERNAL_SERVER_ERROR,
"Error writing REPORT response.",
resource->pool);
diff --git a/subversion/mod_dav_svn/reports/deleted-rev.c b/subversion/mod_dav_svn/reports/deleted-rev.c
index 66d0192..a21aaec 100644
--- a/subversion/mod_dav_svn/reports/deleted-rev.c
+++ b/subversion/mod_dav_svn/reports/deleted-rev.c
@@ -41,7 +41,7 @@
dav_error *
dav_svn__get_deleted_rev_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
apr_xml_elem *child;
int ns;
@@ -52,7 +52,6 @@ dav_svn__get_deleted_rev_report(const dav_resource *resource,
svn_revnum_t deleted_rev;
apr_bucket_brigade *bb;
svn_error_t *err;
- apr_status_t apr_err;
dav_error *derr = NULL;
/* Sanity check. */
@@ -61,12 +60,10 @@ dav_svn__get_deleted_rev_report(const dav_resource *resource,
"The request does not specify a repository path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
for (child = doc->root->first_child; child != NULL; child = child->next)
{
@@ -104,10 +101,8 @@ dav_svn__get_deleted_rev_report(const dav_resource *resource,
&& SVN_IS_VALID_REVNUM(peg_rev)
&& SVN_IS_VALID_REVNUM(end_rev)))
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
- "Not all parameters passed.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ "Not all parameters passed");
}
/* Do what we actually came here for: Find the rev abs_path was deleted. */
@@ -121,16 +116,17 @@ dav_svn__get_deleted_rev_report(const dav_resource *resource,
"Could not find revision path was deleted.");
}
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
- apr_err = ap_fprintf(output, bb,
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
+ err = dav_svn__brigade_printf(bb, output,
DAV_XML_HEADER DEBUG_CR
"<S:get-deleted-rev-report xmlns:S=\""
SVN_XML_NAMESPACE "\" xmlns:D=\"DAV:\">" DEBUG_CR
"<D:" SVN_DAV__VERSION_NAME ">%ld</D:"
SVN_DAV__VERSION_NAME ">""</S:get-deleted-rev-report>",
deleted_rev);
- if (apr_err)
- derr = dav_svn__convert_err(svn_error_create(apr_err, 0, NULL),
+ if (err)
+ derr = dav_svn__convert_err(err,
HTTP_INTERNAL_SERVER_ERROR,
"Error writing REPORT response.",
resource->pool);
diff --git a/subversion/mod_dav_svn/reports/file-revs.c b/subversion/mod_dav_svn/reports/file-revs.c
index 108fd7f..5392776 100644
--- a/subversion/mod_dav_svn/reports/file-revs.c
+++ b/subversion/mod_dav_svn/reports/file-revs.c
@@ -43,7 +43,7 @@ struct file_rev_baton {
apr_bucket_brigade *bb;
/* where to deliver the output */
- ap_filter_t *output;
+ dav_svn__output *output;
/* Whether we've written the <S:file-revs-report> header. Allows for lazy
writes to support mod_dav-based error handling. */
@@ -149,7 +149,7 @@ file_rev_handler(void *baton,
apr_pool_t *pool)
{
struct file_rev_baton *frb = baton;
- apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
apr_hash_index_t *hi;
int i;
@@ -169,11 +169,11 @@ file_rev_handler(void *baton,
const char *pname;
const svn_string_t *pval;
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
apr_hash_this(hi, &key, NULL, &val);
pname = key;
pval = val;
- SVN_ERR(send_prop(frb, "rev-prop", pname, pval, subpool));
+ SVN_ERR(send_prop(frb, "rev-prop", pname, pval, iterpool));
}
/* Send file prop changes. */
@@ -181,17 +181,17 @@ file_rev_handler(void *baton,
{
const svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t);
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
if (prop->value)
SVN_ERR(send_prop(frb, "set-prop", prop->name, prop->value,
- subpool));
+ iterpool));
else
{
/* Property was removed. */
SVN_ERR(dav_svn__brigade_printf(frb->bb, frb->output,
"<S:remove-prop name=\"%s\"/>"
DEBUG_CR,
- apr_xml_quote_string(subpool,
+ apr_xml_quote_string(iterpool,
prop->name,
1)));
}
@@ -223,7 +223,7 @@ file_rev_handler(void *baton,
SVN_ERR(dav_svn__brigade_puts(frb->bb, frb->output,
"</S:file-rev>" DEBUG_CR));
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
@@ -234,7 +234,7 @@ file_rev_handler(void *baton,
dav_error *
dav_svn__file_revs_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
@@ -262,12 +262,10 @@ dav_svn__file_revs_report(const dav_resource *resource,
in this namespace, so is this necessary at all? */
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
/* Get request information. */
@@ -302,13 +300,11 @@ dav_svn__file_revs_report(const dav_resource *resource,
/* Check that all parameters are present and valid. */
if (! abs_path)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
- "Not all parameters passed.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ "Not all parameters passed");
frb.bb = apr_brigade_create(resource->pool,
- output->c->bucket_alloc);
+ dav_svn__output_get_bucket_alloc(output));
frb.output = output;
frb.needs_header = TRUE;
frb.svndiff_version = resource->info->svndiff_version;
@@ -331,7 +327,7 @@ dav_svn__file_revs_report(const dav_resource *resource,
right then, so r->status remains 0, hence HTTP status 200
would be misleadingly returned. */
return (dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
- serr->message, resource->pool));
+ NULL, resource->pool));
}
if ((serr = maybe_send_header(&frb)))
diff --git a/subversion/mod_dav_svn/reports/get-location-segments.c b/subversion/mod_dav_svn/reports/get-location-segments.c
index d3e91e4..794e27f 100644
--- a/subversion/mod_dav_svn/reports/get-location-segments.c
+++ b/subversion/mod_dav_svn/reports/get-location-segments.c
@@ -48,7 +48,7 @@
struct location_segment_baton
{
svn_boolean_t sent_opener;
- ap_filter_t *output;
+ dav_svn__output *output;
apr_bucket_brigade *bb;
dav_svn__authz_read_baton arb;
};
@@ -79,28 +79,26 @@ location_segment_receiver(svn_location_segment_t *segment,
apr_pool_t *pool)
{
struct location_segment_baton *b = baton;
- apr_status_t apr_err;
SVN_ERR(maybe_send_opener(b));
if (segment->path)
{
const char *path_quoted = apr_xml_quote_string(pool, segment->path, 1);
- apr_err = ap_fprintf(b->output, b->bb,
+
+ SVN_ERR(dav_svn__brigade_printf(b->bb, b->output,
"<S:location-segment path=\"%s\" "
"range-start=\"%ld\" range-end=\"%ld\"/>" DEBUG_CR,
path_quoted,
- segment->range_start, segment->range_end);
+ segment->range_start, segment->range_end));
}
else
{
- apr_err = ap_fprintf(b->output, b->bb,
+ SVN_ERR(dav_svn__brigade_printf(b->bb, b->output,
"<S:location-segment "
"range-start=\"%ld\" range-end=\"%ld\"/>" DEBUG_CR,
- segment->range_start, segment->range_end);
+ segment->range_start, segment->range_end));
}
- if (apr_err)
- return svn_error_create(apr_err, 0, NULL);
return SVN_NO_ERROR;
}
@@ -108,7 +106,7 @@ location_segment_receiver(svn_location_segment_t *segment,
dav_error *
dav_svn__get_location_segments_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
@@ -129,12 +127,10 @@ dav_svn__get_location_segments_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
/* Gather the parameters. */
@@ -177,10 +173,8 @@ dav_svn__get_location_segments_report(const dav_resource *resource,
/* Check that all parameters are present and valid. */
if (! abs_path)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
- "Not all parameters passed.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ "Not all parameters passed");
/* No START_REV or PEG_REVISION? We'll use HEAD. */
if (!SVN_IS_VALID_REVNUM(start_rev) || !SVN_IS_VALID_REVNUM(peg_revision))
@@ -205,24 +199,21 @@ dav_svn__get_location_segments_report(const dav_resource *resource,
end_rev = 0;
if (end_rev > start_rev)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"End revision must not be younger than "
- "start revision",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "start revision");
if (start_rev > peg_revision)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"Start revision must not be younger than "
- "peg revision",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "peg revision");
/* Build an authz read baton. */
arb.r = resource->info->r;
arb.repos = resource->info->repos;
/* Build the bucket brigade we'll use for output. */
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
/* Do what we came here for. */
location_segment_baton.sent_opener = FALSE;
@@ -236,7 +227,7 @@ dav_svn__get_location_segments_report(const dav_resource *resource,
dav_svn__authz_read_func(&arb),
&arb, resource->pool)))
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
diff --git a/subversion/mod_dav_svn/reports/get-locations.c b/subversion/mod_dav_svn/reports/get-locations.c
index 164045f..da70300 100644
--- a/subversion/mod_dav_svn/reports/get-locations.c
+++ b/subversion/mod_dav_svn/reports/get-locations.c
@@ -44,23 +44,20 @@
#include "../dav_svn.h"
-static apr_status_t
-send_get_locations_report(ap_filter_t *output,
+static svn_error_t *
+send_get_locations_report(dav_svn__output *output,
apr_bucket_brigade *bb,
const dav_resource *resource,
apr_hash_t *fs_locations)
{
apr_hash_index_t *hi;
- apr_pool_t *pool;
- apr_status_t apr_err;
+ apr_pool_t *pool = resource->pool;
- pool = resource->pool;
-
- apr_err = ap_fprintf(output, bb, DAV_XML_HEADER DEBUG_CR
+ SVN_ERR(dav_svn__brigade_printf(
+ bb, output,
+ DAV_XML_HEADER DEBUG_CR
"<S:get-locations-report xmlns:S=\"" SVN_XML_NAMESPACE
- "\" xmlns:D=\"DAV:\">" DEBUG_CR);
- if (apr_err)
- return apr_err;
+ "\" xmlns:D=\"DAV:\">" DEBUG_CR));
for (hi = apr_hash_first(pool, fs_locations); hi; hi = apr_hash_next(hi))
{
@@ -70,24 +67,25 @@ send_get_locations_report(ap_filter_t *output,
apr_hash_this(hi, &key, NULL, &value);
path_quoted = apr_xml_quote_string(pool, value, 1);
- apr_err = ap_fprintf(output, bb, "<S:location "
+ SVN_ERR(dav_svn__brigade_printf(
+ bb, output, "<S:location "
"rev=\"%ld\" path=\"%s\"/>" DEBUG_CR,
- *(const svn_revnum_t *)key, path_quoted);
- if (apr_err)
- return apr_err;
+ *(const svn_revnum_t *)key, path_quoted));
}
- return ap_fprintf(output, bb, "</S:get-locations-report>" DEBUG_CR);
+
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ "</S:get-locations-report>" DEBUG_CR));
+ return SVN_NO_ERROR;
}
dav_error *
dav_svn__get_locations_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
- apr_status_t apr_err;
apr_bucket_brigade *bb;
dav_svn__authz_read_baton arb;
@@ -112,12 +110,10 @@ dav_svn__get_locations_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
/* Gather the parameters. */
@@ -154,10 +150,8 @@ dav_svn__get_locations_report(const dav_resource *resource,
/* Check that all parameters are present and valid. */
if (! (abs_path && SVN_IS_VALID_REVNUM(peg_revision)))
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
- "Not all parameters passed.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ "Not all parameters passed");
/* Build an authz read baton */
arb.r = resource->info->r;
@@ -171,16 +165,17 @@ dav_svn__get_locations_report(const dav_resource *resource,
if (serr)
{
- return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
- serr->message, resource->pool);
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, NULL,
+ resource->pool);
}
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
- apr_err = send_get_locations_report(output, bb, resource, fs_locations);
+ serr = send_get_locations_report(output, bb, resource, fs_locations);
- if (apr_err)
- derr = dav_svn__convert_err(svn_error_create(apr_err, 0, NULL),
+ if (serr)
+ derr = dav_svn__convert_err(serr,
HTTP_INTERNAL_SERVER_ERROR,
"Error writing REPORT response.",
resource->pool);
diff --git a/subversion/mod_dav_svn/reports/get-locks.c b/subversion/mod_dav_svn/reports/get-locks.c
index 06fd700..bb9c168 100644
--- a/subversion/mod_dav_svn/reports/get-locks.c
+++ b/subversion/mod_dav_svn/reports/get-locks.c
@@ -44,67 +44,51 @@
report in libsvn_ra_neon/get_locks.c. */
-#define SVN_APR_ERR(expr) \
- do { \
- apr_status_t apr_status__temp = (expr); \
- if (apr_status__temp) \
- return apr_status__temp; \
- } while (0)
-
-
/* Transmit LOCKS (a hash of Subversion filesystem locks keyed by
- path) across OUTPUT using BB. Use POOL for necessary allocations.
-
- NOTE: As written, this function currently returns one of only two
- status values -- "success", and "we had trouble writing out to the
- output stream". If you need to return something more interesting,
- you'll probably want to generate dav_error's here instead of
- passing back only apr_status_t's. */
-static apr_status_t
+ path) across OUTPUT using BB. Use POOL for necessary allocations. */
+static svn_error_t *
send_get_lock_response(apr_hash_t *locks,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_bucket_brigade *bb,
apr_pool_t *pool)
{
- apr_pool_t *subpool;
+ apr_pool_t *iterpool;
apr_hash_index_t *hi;
/* start sending report */
- SVN_APR_ERR(ap_fprintf(output, bb,
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
DAV_XML_HEADER DEBUG_CR
"<S:get-locks-report xmlns:S=\"" SVN_XML_NAMESPACE
"\" xmlns:D=\"DAV:\">" DEBUG_CR));
/* stream the locks */
- subpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
{
- void *val;
const svn_lock_t *lock;
- svn_pool_clear(subpool);
- apr_hash_this(hi, NULL, NULL, &val);
- lock = val;
+ svn_pool_clear(iterpool);
+ lock = apr_hash_this_val(hi);
/* Begin the <S:lock> tag, transmitting the path, token, and
creation date. */
- SVN_APR_ERR(ap_fprintf(output, bb,
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
"<S:lock>" DEBUG_CR
"<S:path>%s</S:path>" DEBUG_CR
"<S:token>%s</S:token>" DEBUG_CR
"<S:creationdate>%s</S:creationdate>" DEBUG_CR,
- apr_xml_quote_string(subpool, lock->path, 1),
- apr_xml_quote_string(subpool, lock->token, 1),
+ apr_xml_quote_string(iterpool, lock->path, 1),
+ apr_xml_quote_string(iterpool, lock->token, 1),
svn_time_to_cstring(lock->creation_date,
- subpool)));
+ iterpool)));
/* Got expiration date? Tell the client. */
if (lock->expiration_date)
- SVN_APR_ERR(ap_fprintf(output, bb,
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
"<S:expirationdate>%s</S:expirationdate>"
DEBUG_CR,
svn_time_to_cstring(lock->expiration_date,
- subpool)));
+ iterpool)));
/* Transmit the lock ownership information. */
if (lock->owner)
@@ -114,7 +98,7 @@ send_get_lock_response(apr_hash_t *locks,
if (svn_xml_is_xml_safe(lock->owner, strlen(lock->owner)))
{
- owner = apr_xml_quote_string(subpool, lock->owner, 1);
+ owner = apr_xml_quote_string(iterpool, lock->owner, 1);
}
else
{
@@ -124,11 +108,11 @@ send_get_lock_response(apr_hash_t *locks,
owner_string.data = lock->owner;
owner_string.len = strlen(lock->owner);
encoded_owner = svn_base64_encode_string2(&owner_string, TRUE,
- subpool);
+ iterpool);
owner = encoded_owner->data;
owner_base64 = TRUE;
}
- SVN_APR_ERR(ap_fprintf(output, bb,
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
"<S:owner %s>%s</S:owner>" DEBUG_CR,
owner_base64 ? "encoding=\"base64\"" : "",
owner));
@@ -142,7 +126,7 @@ send_get_lock_response(apr_hash_t *locks,
if (svn_xml_is_xml_safe(lock->comment, strlen(lock->comment)))
{
- comment = apr_xml_quote_string(subpool, lock->comment, 1);
+ comment = apr_xml_quote_string(iterpool, lock->comment, 1);
}
else
{
@@ -152,38 +136,36 @@ send_get_lock_response(apr_hash_t *locks,
comment_string.data = lock->comment;
comment_string.len = strlen(lock->comment);
encoded_comment = svn_base64_encode_string2(&comment_string,
- TRUE, subpool);
+ TRUE, iterpool);
comment = encoded_comment->data;
comment_base64 = TRUE;
}
- SVN_APR_ERR(ap_fprintf(output, bb,
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
"<S:comment %s>%s</S:comment>" DEBUG_CR,
comment_base64 ? "encoding=\"base64\"" : "",
comment));
}
/* Okay, finish up this lock by closing the <S:lock> tag. */
- SVN_APR_ERR(ap_fprintf(output, bb, "</S:lock>" DEBUG_CR));
+ SVN_ERR(dav_svn__brigade_printf(bb, output, "</S:lock>" DEBUG_CR));
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
/* Finish the report */
- SVN_APR_ERR(ap_fprintf(output, bb, "</S:get-locks-report>" DEBUG_CR));
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ "</S:get-locks-report>" DEBUG_CR));
return APR_SUCCESS;
}
-#undef SVN_APR_ERR
-
dav_error *
dav_svn__get_locks_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
apr_bucket_brigade *bb;
svn_error_t *err;
dav_error *derr = NULL;
- apr_status_t apr_err;
apr_hash_t *locks;
dav_svn__authz_read_baton arb;
svn_depth_t depth = svn_depth_unknown;
@@ -229,10 +211,12 @@ dav_svn__get_locks_report(const dav_resource *resource,
return dav_svn__convert_err(err, HTTP_INTERNAL_SERVER_ERROR,
err->message, resource->pool);
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
- if ((apr_err = send_get_lock_response(locks, output, bb, resource->pool)))
- derr = dav_svn__convert_err(svn_error_create(apr_err, 0, NULL),
+ err = send_get_lock_response(locks, output, bb, resource->pool);
+ if (err)
+ derr = dav_svn__convert_err(err,
HTTP_INTERNAL_SERVER_ERROR,
"Error writing REPORT response.",
resource->pool);
diff --git a/subversion/mod_dav_svn/reports/inherited-props.c b/subversion/mod_dav_svn/reports/inherited-props.c
index ce0f4de..bb2300f 100644
--- a/subversion/mod_dav_svn/reports/inherited-props.c
+++ b/subversion/mod_dav_svn/reports/inherited-props.c
@@ -47,7 +47,7 @@
dav_error *
dav_svn__get_inherited_props_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
@@ -69,12 +69,10 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
iterpool = svn_pool_create(resource->pool);
@@ -107,7 +105,8 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
arb.repos = resource->info->repos;
/* Build inherited property brigade */
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
serr = svn_fs_revision_root(&root, resource->info->repos->fs,
rev, resource->pool);
@@ -121,7 +120,7 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
&arb, resource->pool, iterpool);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
@@ -133,7 +132,7 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
"xmlns:D=\"DAV:\">" DEBUG_CR);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
@@ -161,8 +160,8 @@ dav_svn__get_inherited_props_report(const dav_resource *resource,
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ svn_string_t *propval = apr_hash_this_val(hi);
const char *xml_safe;
serr = dav_svn__brigade_printf(
diff --git a/subversion/mod_dav_svn/reports/log.c b/subversion/mod_dav_svn/reports/log.c
index acd33ed..76a47c8 100644
--- a/subversion/mod_dav_svn/reports/log.c
+++ b/subversion/mod_dav_svn/reports/log.c
@@ -50,7 +50,7 @@ struct log_receiver_baton
apr_bucket_brigade *bb;
/* where to deliver the output */
- ap_filter_t *output;
+ dav_svn__output *output;
/* Whether we've written the <S:log-report> header. Allows for lazy
writes to support mod_dav-based error handling. */
@@ -65,6 +65,10 @@ struct log_receiver_baton
/* whether the client can handle encoded binary property values */
svn_boolean_t encode_binary_props;
+
+ /* Helper variables to force early bucket brigade flushes */
+ int result_count;
+ int next_forced_flush;
};
@@ -87,6 +91,43 @@ maybe_send_header(struct log_receiver_baton *lrb)
return SVN_NO_ERROR;
}
+/* Utility for log_receiver opening a new XML element in LRB's brigade
+ for LOG_ITEM and return the element's name in *ELEMENT. Use POOL for
+ temporary allocations.
+
+ Call this function for items that may have a copy-from */
+static svn_error_t *
+start_path_with_copy_from(const char **element,
+ struct log_receiver_baton *lrb,
+ svn_log_changed_path2_t *log_item,
+ apr_pool_t *pool)
+{
+ switch (log_item->action)
+ {
+ case 'A': *element = "S:added-path";
+ break;
+ case 'R': *element = "S:replaced-path";
+ break;
+ default: /* Caller, you did wrong! */
+ SVN_ERR_MALFUNCTION();
+ }
+
+ if (log_item->copyfrom_path
+ && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev))
+ SVN_ERR(dav_svn__brigade_printf
+ (lrb->bb, lrb->output,
+ "<%s copyfrom-path=\"%s\" copyfrom-rev=\"%ld\"",
+ *element,
+ apr_xml_quote_string(pool,
+ log_item->copyfrom_path,
+ 1), /* escape quotes */
+ log_item->copyfrom_rev));
+ else
+ SVN_ERR(dav_svn__brigade_printf(lrb->bb, lrb->output, "<%s", *element));
+
+ return SVN_NO_ERROR;
+}
+
/* This implements `svn_log_entry_receiver_t'.
BATON is a `struct log_receiver_baton *'. */
@@ -203,39 +244,9 @@ log_receiver(void *baton,
switch (log_item->action)
{
case 'A':
- if (log_item->copyfrom_path
- && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev))
- SVN_ERR(dav_svn__brigade_printf
- (lrb->bb, lrb->output,
- "<S:added-path copyfrom-path=\"%s\""
- " copyfrom-rev=\"%ld\"",
- apr_xml_quote_string(iterpool,
- log_item->copyfrom_path,
- 1), /* escape quotes */
- log_item->copyfrom_rev));
- else
- SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
- "<S:added-path"));
-
- close_element = "S:added-path";
- break;
-
case 'R':
- if (log_item->copyfrom_path
- && SVN_IS_VALID_REVNUM(log_item->copyfrom_rev))
- SVN_ERR(dav_svn__brigade_printf
- (lrb->bb, lrb->output,
- "<S:replaced-path copyfrom-path=\"%s\""
- " copyfrom-rev=\"%ld\"",
- apr_xml_quote_string(iterpool,
- log_item->copyfrom_path,
- 1), /* escape quotes */
- log_item->copyfrom_rev));
- else
- SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
- "<S:replaced-path"));
-
- close_element = "S:replaced-path";
+ SVN_ERR(start_path_with_copy_from(&close_element, lrb,
+ log_item, iterpool));
break;
case 'D':
@@ -275,6 +286,33 @@ log_receiver(void *baton,
SVN_ERR(dav_svn__brigade_puts(lrb->bb, lrb->output,
"</S:log-item>" DEBUG_CR));
+ /* In general APR will flush the brigade every 8000 bytes through the filter
+ stack, but log items may not be generated that fast, especially in
+ combination with authz and busy servers. We now explictly flush after
+ log-item 4, 16, 64 and 256 to produce a few results fast.
+
+ This introduces 4 full flushes of our brigade and the installed output
+ filters at growing intervals and then falls back to the standard
+ buffering of 8000 bytes + whatever buffers are added in output filters. */
+ lrb->result_count++;
+ if (lrb->result_count == lrb->next_forced_flush)
+ {
+ apr_bucket *bkt;
+
+ /* Compared to using ap_filter_flush(), which we use in other place
+ this adds a flush frame before flushing the brigade, to make output
+ filters perform a flush as well */
+
+ /* No brigade empty check. We want output filters to flush anyway */
+ bkt = apr_bucket_flush_create(
+ dav_svn__output_get_bucket_alloc(lrb->output));
+ APR_BRIGADE_INSERT_TAIL(lrb->bb, bkt);
+ SVN_ERR(dav_svn__output_pass_brigade(lrb->output, lrb->bb));
+
+ if (lrb->result_count < 256)
+ lrb->next_forced_flush = lrb->next_forced_flush * 4;
+ }
+
return SVN_NO_ERROR;
}
@@ -282,7 +320,7 @@ log_receiver(void *baton,
dav_error *
dav_svn__log_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
@@ -301,6 +339,7 @@ dav_svn__log_report(const dav_resource *resource,
svn_boolean_t discover_changed_paths = FALSE; /* off by default */
svn_boolean_t strict_node_history = FALSE; /* off by default */
svn_boolean_t include_merged_revisions = FALSE; /* off by default */
+
apr_array_header_t *revprops = apr_array_make(resource->pool, 3,
sizeof(const char *));
apr_array_header_t *paths
@@ -313,12 +352,10 @@ dav_svn__log_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
/* If this is still FALSE after the loop, we haven't seen either of
@@ -415,12 +452,15 @@ dav_svn__log_report(const dav_resource *resource,
/* Build log receiver baton */
lrb.bb = apr_brigade_create(resource->pool, /* not the subpool! */
- output->c->bucket_alloc);
+ dav_svn__output_get_bucket_alloc(output));
lrb.output = output;
lrb.needs_header = TRUE;
lrb.stack_depth = 0;
/* lrb.requested_custom_revprops set above */
+ lrb.result_count = 0;
+ lrb.next_forced_flush = 4;
+
/* Our svn_log_entry_receiver_t sends the <S:log-report> header in
a lazy fashion. Before writing the first log message, it assures
that the header has already been sent (checking the needs_header
@@ -443,7 +483,7 @@ dav_svn__log_report(const dav_resource *resource,
resource->pool);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
diff --git a/subversion/mod_dav_svn/reports/mergeinfo.c b/subversion/mod_dav_svn/reports/mergeinfo.c
index 15c3071..107c7a1 100644
--- a/subversion/mod_dav_svn/reports/mergeinfo.c
+++ b/subversion/mod_dav_svn/reports/mergeinfo.c
@@ -46,7 +46,7 @@
dav_error *
dav_svn__get_mergeinfo_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_error_t *serr;
dav_error *derr = NULL;
@@ -73,12 +73,10 @@ dav_svn__get_mergeinfo_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
- "certain required elements.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "certain required elements");
}
for (child = doc->root->first_child; child != NULL; child = child->next)
@@ -126,7 +124,8 @@ dav_svn__get_mergeinfo_report(const dav_resource *resource,
arb.repos = resource->info->repos;
/* Build mergeinfo brigade */
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
serr = svn_repos_fs_get_mergeinfo(&catalog, repos->repos, paths, rev,
inherit, include_descendants,
@@ -134,7 +133,7 @@ dav_svn__get_mergeinfo_report(const dav_resource *resource,
&arb, resource->pool);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
@@ -144,7 +143,7 @@ dav_svn__get_mergeinfo_report(const dav_resource *resource,
resource->pool);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
@@ -162,7 +161,7 @@ dav_svn__get_mergeinfo_report(const dav_resource *resource,
"xmlns:D=\"DAV:\">" DEBUG_CR);
if (serr)
{
- derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, serr->message,
+ derr = dav_svn__convert_err(serr, HTTP_BAD_REQUEST, NULL,
resource->pool);
goto cleanup;
}
diff --git a/subversion/mod_dav_svn/reports/replay.c b/subversion/mod_dav_svn/reports/replay.c
index 0d57f32..886dbba 100644
--- a/subversion/mod_dav_svn/reports/replay.c
+++ b/subversion/mod_dav_svn/reports/replay.c
@@ -44,7 +44,7 @@
typedef struct edit_baton_t {
apr_bucket_brigade *bb;
- ap_filter_t *output;
+ dav_svn__output *output;
svn_boolean_t started;
svn_boolean_t sending_textdelta;
int compression_level;
@@ -108,7 +108,7 @@ add_file_or_directory(const char *file_or_directory,
SVN_ERR(maybe_close_textdelta(eb));
- *added_baton = (void *)eb;
+ *added_baton = eb;
if (! copyfrom_path)
SVN_ERR(dav_svn__brigade_printf(eb->bb, eb->output,
@@ -135,7 +135,7 @@ open_file_or_directory(const char *file_or_directory,
{
const char *qname = apr_xml_quote_string(pool, path, 1);
SVN_ERR(maybe_close_textdelta(eb));
- *opened_baton = (void *)eb;
+ *opened_baton = eb;
return dav_svn__brigade_printf(eb->bb, eb->output,
"<S:open-%s name=\"%s\" rev=\"%ld\"/>"
DEBUG_CR,
@@ -367,7 +367,7 @@ static void
make_editor(const svn_delta_editor_t **editor,
void **edit_baton,
apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
int compression_level,
apr_pool_t *pool)
{
@@ -401,20 +401,19 @@ make_editor(const svn_delta_editor_t **editor,
static dav_error *
malformed_element_error(const char *tagname, apr_pool_t *pool)
{
- return dav_svn__new_error_tag(pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0,
apr_pstrcat(pool,
"The request's '", tagname,
"' element is malformed; there "
"is a problem with the client.",
- (char *)NULL),
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+ SVN_VA_NULL));
}
dav_error *
dav_svn__replay_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
dav_error *derr = NULL;
svn_revnum_t low_water_mark = SVN_INVALID_REVNUM;
@@ -456,13 +455,11 @@ dav_svn__replay_report(const dav_resource *resource,
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have an "
"svn:revision element. That element is "
- "required.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "required");
for (child = doc->root->first_child; child != NULL; child = child->next)
{
@@ -521,21 +518,20 @@ dav_svn__replay_report(const dav_resource *resource,
}
if (! SVN_IS_VALID_REVNUM(rev))
- return dav_svn__new_error_tag
+ return dav_svn__new_error_svn
(resource->pool, HTTP_BAD_REQUEST, 0,
- "Request was missing the revision argument.",
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+ "Request was missing the revision argument");
if (! SVN_IS_VALID_REVNUM(low_water_mark))
- return dav_svn__new_error_tag
+ return dav_svn__new_error_svn
(resource->pool, HTTP_BAD_REQUEST, 0,
- "Request was missing the low-water-mark argument.",
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+ "Request was missing the low-water-mark argument");
if (! base_dir)
base_dir = "";
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
if ((err = svn_fs_revision_root(&root, resource->info->repos->fs, rev,
resource->pool)))
diff --git a/subversion/mod_dav_svn/reports/update.c b/subversion/mod_dav_svn/reports/update.c
index 541d551..70be92e 100644
--- a/subversion/mod_dav_svn/reports/update.c
+++ b/subversion/mod_dav_svn/reports/update.c
@@ -68,7 +68,7 @@ typedef struct update_ctx_t {
apr_bucket_brigade *bb;
/* where to deliver the output */
- ap_filter_t *output;
+ dav_svn__output *output;
/* where do these editor paths *really* point to? */
apr_hash_t *pathmap;
@@ -127,10 +127,6 @@ typedef struct item_baton_t {
/* File/dir copied? */
svn_boolean_t copyfrom;
- /* Does the client need to fetch additional properties for this
- item? */
- svn_boolean_t fetch_props;
-
/* Array of const char * names of removed properties. (Used only
for copied files/dirs in skelta mode.) */
apr_array_header_t *removed_props;
@@ -257,13 +253,13 @@ send_vsn_url(item_baton_t *baton, apr_pool_t *pool)
{
href = dav_svn__build_uri(baton->uc->resource->info->repos,
DAV_SVN__BUILD_URI_REVROOT,
- revision, path, 0 /* add_href */, pool);
+ revision, path, FALSE /* add_href */, pool);
}
else
{
href = dav_svn__build_uri(baton->uc->resource->info->repos,
DAV_SVN__BUILD_URI_VERSION,
- revision, path, 0 /* add_href */, pool);
+ revision, path, FALSE /* add_href */, pool);
}
return dav_svn__brigade_printf(baton->uc->bb, baton->uc->output,
@@ -321,7 +317,6 @@ add_helper(svn_boolean_t is_dir,
{
item_baton_t *child;
update_ctx_t *uc = parent->uc;
- const char *bc_url = NULL;
child = make_child_baton(parent, path, pool);
child->added = TRUE;
@@ -345,12 +340,14 @@ add_helper(svn_boolean_t is_dir,
{
/* we send baseline-collection urls when we add a directory */
svn_revnum_t revision;
+ const char *bc_url;
+
revision = dav_svn__get_safe_cr(child->uc->rev_root, real_path,
pool);
bc_url = dav_svn__build_uri(child->uc->resource->info->repos,
DAV_SVN__BUILD_URI_BC,
revision, real_path,
- 0 /* add_href */, pool);
+ FALSE /* add_href */, pool);
bc_url = svn_urlpath__canonicalize(bc_url, pool);
/* ugh, build_uri ignores the path and just builds the root
@@ -364,6 +361,8 @@ add_helper(svn_boolean_t is_dir,
/* make sure that the BC_URL is xml attribute safe. */
bc_url = apr_xml_quote_string(pool, bc_url, 1);
+
+ bc_url_str = apr_psprintf(pool, " bc-url=\"%s\"", bc_url);
}
else
{
@@ -377,9 +376,6 @@ add_helper(svn_boolean_t is_dir,
svn_checksum_to_cstring(sha1_checksum, pool));
}
- if (bc_url)
- bc_url_str = apr_psprintf(pool, " bc-url=\"%s\"", bc_url);
-
if (copyfrom_path == NULL)
{
elt = apr_psprintf(pool,
@@ -466,12 +462,6 @@ close_helper(svn_boolean_t is_dir, item_baton_t *baton, apr_pool_t *pool)
}
}
- /* If our client need to fetch properties, let it know. */
- if (baton->fetch_props)
- SVN_ERR(dav_svn__brigade_printf(baton->uc->bb, baton->uc->output,
- "<S:fetch-props/>" DEBUG_CR));
-
-
/* Let's tie it off, nurse. */
if (baton->added)
SVN_ERR(dav_svn__brigade_printf(baton->uc->bb, baton->uc->output,
@@ -913,9 +903,8 @@ malformed_element_error(const char *tagname, apr_pool_t *pool)
const char *errstr = apr_pstrcat(pool, "The request's '", tagname,
"' element is malformed; there "
"is a problem with the client.",
- (char *)NULL);
- return dav_svn__new_error_tag(pool, HTTP_BAD_REQUEST, 0, errstr,
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+ SVN_VA_NULL);
+ return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, errstr);
}
@@ -934,7 +923,7 @@ validate_input_revision(svn_revnum_t revision,
const dav_resource *resource)
{
if (! SVN_IS_VALID_REVNUM(revision))
- return SVN_NO_ERROR;
+ return NULL;
if (revision > youngest)
{
@@ -958,14 +947,14 @@ validate_input_revision(svn_revnum_t revision,
"Invalid revision found in update report "
"request.", resource->pool);
}
- return SVN_NO_ERROR;
+ return NULL;
}
dav_error *
dav_svn__update_report(const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_delta_editor_t *editor;
apr_xml_elem *child;
@@ -999,22 +988,18 @@ dav_svn__update_report(const dav_resource *resource,
if ((resource->info->restype != DAV_SVN_RESTYPE_VCC)
&& (resource->info->restype != DAV_SVN_RESTYPE_ME))
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, 0,
"This report can only be run against "
- "a VCC or root-stub URI.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "a VCC or root-stub URI");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have an "
"svn:target-revision element. That element "
- "is required.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "is required");
}
/* SVNAllowBulkUpdates On/Prefer: server configuration permits bulk updates
@@ -1152,6 +1137,11 @@ dav_svn__update_report(const dav_resource *resource,
}
if (child->ns == ns && strcmp(child->name, "resource-walk") == 0)
{
+ /* This flag is not used since Subversion 1.1.x
+ There are some remains in libsvn_ra_neon, where it can
+ be enabled via a static function flag.
+ Disabled since r852220 (aka r12146)
+ "Prefer correctness over efficiency." */
cdata = dav_xml_get_cdata(child, resource->pool, 1);
if (! *cdata)
return malformed_element_error(child->name, resource->pool);
@@ -1200,12 +1190,10 @@ dav_svn__update_report(const dav_resource *resource,
sending a style of report that we no longer allow. */
if (! src_path)
{
- return dav_svn__new_error_tag
+ return dav_svn__new_error_svn
(resource->pool, HTTP_BAD_REQUEST, 0,
"The request did not contain the '<src-path>' element.\n"
- "This may indicate that your client is too old.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "This may indicate that your client is too old");
}
uc.svndiff_version = resource->info->svndiff_version;
@@ -1214,7 +1202,8 @@ dav_svn__update_report(const dav_resource *resource,
uc.output = output;
uc.anchor = src_path;
uc.target = target;
- uc.bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
+ uc.bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
uc.pathmap = NULL;
uc.enable_v2_response = ((resource->info->restype == DAV_SVN_RESTYPE_ME)
&& (resource->info->repos->v2_protocol));
diff --git a/subversion/mod_dav_svn/repos.c b/subversion/mod_dav_svn/repos.c
index 590cca9..9bf5ea0 100644
--- a/subversion/mod_dav_svn/repos.c
+++ b/subversion/mod_dav_svn/repos.c
@@ -56,6 +56,7 @@
#include "private/svn_log.h"
#include "private/svn_fspath.h"
#include "private/svn_repos_private.h"
+#include "private/svn_sorts_private.h"
#include "dav_svn.h"
@@ -899,7 +900,7 @@ prep_version(dav_resource_combined *comb)
comb->res.uri = dav_svn__build_uri(comb->priv.repos,
DAV_SVN__BUILD_URI_BASELINE,
comb->priv.root.rev, NULL,
- 0 /* add_href */,
+ FALSE /* add_href */,
pool);
return NULL;
@@ -1034,6 +1035,28 @@ prep_working(dav_resource_combined *comb)
comb->res.exists = (kind != svn_node_none);
comb->res.collection = (kind == svn_node_dir);
+ if (comb->res.exists
+ && comb->priv.r->method_number == M_MKCOL
+ && comb->priv.repos->is_svn_client)
+ {
+ /* mod_dav will now continue returning a generic HTTP_METHOD_NOT_ALLOWED
+ error, which doesn't produce nice output on SVN, nor gives any details
+ on why the operation failed.
+
+ Let's error out a bit earlier and produce an error message that is
+ easier to understand for both clients and users. */
+
+ /* It would be nice if we could error out a bit later (see issue #2295),
+ like in create_collection(), but mod_dav outsmarts us by just
+ returning the error when the node exists. */
+
+ return dav_svn__convert_err(
+ svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+ "Path already exists, path '%s'",
+ comb->priv.repos_path),
+ HTTP_METHOD_NOT_ALLOWED, NULL, pool);
+ }
+
return NULL;
}
@@ -1168,7 +1191,7 @@ create_private_resource(const dav_resource *base,
if (base->info->repos->root_path[1])
comb->res.uri = apr_pstrcat(base->pool, base->info->repos->root_path,
- path->data, (char *)NULL);
+ path->data, SVN_VA_NULL);
else
comb->res.uri = path->data;
comb->res.info = &comb->priv;
@@ -1208,14 +1231,15 @@ static void log_warning(void *baton, svn_error_t *err)
AP_MODULE_DECLARE(dav_error *)
-dav_svn_split_uri(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)
+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)
{
apr_size_t len1;
int had_slash;
@@ -1231,7 +1255,7 @@ dav_svn_split_uri(request_rec *r,
if ((fs_path == NULL) && (fs_parent_path == NULL))
{
/* ### are SVN_ERR_APMOD codes within the right numeric space? */
- return dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR,
SVN_ERR_APMOD_MISSING_PATH_TO_FS,
"The server is misconfigured: "
"either an SVNPath or SVNParentPath "
@@ -1240,7 +1264,7 @@ dav_svn_split_uri(request_rec *r,
}
/* make a copy so that we can do some work on it */
- uri = apr_pstrdup(r->pool, uri_to_split);
+ uri = apr_pstrdup(pool, uri_to_split);
/* remove duplicate slashes, and make sure URI has no trailing '/' */
ap_no2slash(uri);
@@ -1255,7 +1279,7 @@ dav_svn_split_uri(request_rec *r,
*trailing_slash = FALSE;
/* return the first item. */
- *cleaned_uri = apr_pstrdup(r->pool, uri);
+ *cleaned_uri = apr_pstrdup(pool, uri);
/* The URL space defined by the SVN provider is always a virtual
space. Construct the path relative to the configured Location
@@ -1296,7 +1320,7 @@ dav_svn_split_uri(request_rec *r,
if (fs_path != NULL)
{
/* the repos_basename is the last component of root_path. */
- *repos_basename = svn_dirent_basename(root_path, r->pool);
+ *repos_basename = svn_dirent_basename(root_path, pool);
/* 'relative' is already correct for SVNPath; the root_path
already contains the name of the repository, so relative is
@@ -1314,7 +1338,7 @@ dav_svn_split_uri(request_rec *r,
if (relative[1] == '\0')
{
/* ### are SVN_ERR_APMOD codes within the right numeric space? */
- return dav_svn__new_error(r->pool, HTTP_FORBIDDEN,
+ return dav_svn__new_error(pool, HTTP_FORBIDDEN,
SVN_ERR_APMOD_MALFORMED_URI,
"The URI does not contain the name "
"of a repository.");
@@ -1331,7 +1355,7 @@ dav_svn_split_uri(request_rec *r,
}
else
{
- magic_component = apr_pstrndup(r->pool, relative + 1,
+ magic_component = apr_pstrndup(pool, relative + 1,
magic_end - relative - 1);
relative = magic_end;
}
@@ -1341,7 +1365,7 @@ dav_svn_split_uri(request_rec *r,
}
/* We can return 'relative' at this point too. */
- *relative_path = apr_pstrdup(r->pool, relative);
+ *relative_path = apr_pstrdup(pool, relative);
/* Code to remove the !svn junk from the front of the relative path,
mainly stolen from parse_uri(). This code assumes that
@@ -1362,7 +1386,7 @@ dav_svn_split_uri(request_rec *r,
if (ch == '\0')
{
/* relative is just "!svn", which is malformed. */
- return dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ return dav_svn__new_error(pool, HTTP_NOT_FOUND,
SVN_ERR_APMOD_MALFORMED_URI,
"Nothing follows the svn special_uri.");
}
@@ -1389,7 +1413,7 @@ dav_svn_split_uri(request_rec *r,
*repos_path = NULL;
else
return dav_svn__new_error(
- r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ pool, HTTP_NOT_FOUND,
SVN_ERR_APMOD_MALFORMED_URI,
"Missing info after special_uri.");
}
@@ -1413,7 +1437,7 @@ dav_svn_split_uri(request_rec *r,
/* Did we break from the loop prematurely? */
if (j != (defn->numcomponents - 1))
return dav_svn__new_error(
- r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ pool, HTTP_NOT_FOUND,
SVN_ERR_APMOD_MALFORMED_URI,
"Not enough components after "
"special_uri.");
@@ -1427,13 +1451,13 @@ dav_svn_split_uri(request_rec *r,
else
{
/* Found a slash after the special components. */
- *repos_path = apr_pstrdup(r->pool, start);
+ *repos_path = apr_pstrdup(pool, start - 1);
}
}
else
{
return
- dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ dav_svn__new_error(pool, HTTP_NOT_FOUND,
SVN_ERR_APMOD_MALFORMED_URI,
"Unknown data after special_uri.");
}
@@ -1444,7 +1468,7 @@ dav_svn_split_uri(request_rec *r,
if (defn->name == NULL)
return
- dav_svn__new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ dav_svn__new_error(pool, HTTP_NOT_FOUND,
SVN_ERR_APMOD_MALFORMED_URI,
"Couldn't match subdir after special_uri.");
}
@@ -1453,13 +1477,27 @@ dav_svn_split_uri(request_rec *r,
{
/* There's no "!svn/" at all, so the relative path is already
a valid path within the repository. */
- *repos_path = apr_pstrdup(r->pool, relative);
+ *repos_path = apr_pstrdup(pool, relative - 1);
}
}
return NULL;
}
+AP_MODULE_DECLARE(dav_error *)
+dav_svn_split_uri(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)
+{
+ return dav_svn_split_uri2(r, uri_to_split, root_path, cleaned_uri,
+ trailing_slash, repos_basename, relative_path,
+ repos_path, r->pool);
+}
/* Context for cleanup handler. */
struct cleanup_fs_access_baton
@@ -1530,7 +1568,7 @@ get_parentpath_resource(request_rec *r,
if (r->uri[len-1] != '/')
{
new_uri = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri),
- "/", (char *)NULL);
+ "/", SVN_VA_NULL);
apr_table_setn(r->headers_out, "Location",
ap_construct_url(r->pool, new_uri, r));
return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0,
@@ -1820,9 +1858,24 @@ do_out_of_date_check(dav_resource_combined *comb, request_rec *r)
"Attempting to modify out-of-date resource.",
r->pool);
}
+ else if (comb->priv.version_name > created_rev)
+ {
+ svn_revnum_t txn_base_rev;
+
+ txn_base_rev = svn_fs_txn_base_revision(comb->res.info->root.txn);
+ if (comb->priv.version_name > txn_base_rev)
+ {
+ serr = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
+ "No such revision %ld",
+ comb->priv.version_name);
+
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Unknown base revision",
+ r->pool);
+ }
+ }
}
- else if (SVN_IS_VALID_REVNUM(comb->priv.version_name)
- && comb->res.collection)
+ else if (comb->res.collection)
{
/* Issue #4480: With HTTPv2 we can receive the first change for a
directory after it has been made mutable, because one of its
@@ -1837,7 +1890,7 @@ do_out_of_date_check(dav_resource_combined *comb, request_rec *r)
properties changed since the BASE version.
### I think svn_fs_node_relation() checks for more changes than we
- should check for here. Needs further review. But it looks like\
+ should check for here. Needs further review. But it looks like
this check matches the checks in the libsvn_fs commit editor.
For now I would say reporting out of date in a few too many
@@ -1846,8 +1899,7 @@ do_out_of_date_check(dav_resource_combined *comb, request_rec *r)
svn_revnum_t txn_base_rev;
svn_fs_root_t *txn_base_root;
svn_fs_root_t *rev_root;
- const svn_fs_id_t *txn_base_id;
- const svn_fs_id_t *rev_id;
+ svn_fs_node_relation_t node_relation;
txn_base_rev = svn_fs_txn_base_revision(comb->res.info->root.txn);
@@ -1856,15 +1908,11 @@ do_out_of_date_check(dav_resource_combined *comb, request_rec *r)
serr = svn_fs_revision_root(&txn_base_root, comb->res.info->repos->fs,
txn_base_rev, r->pool);
-
- if (!serr)
- serr = svn_fs_node_id(&txn_base_id, txn_base_root,
- comb->priv.repos_path, r->pool);
if (serr != NULL)
{
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
- "Could not open youngest revision root "
+ "Could not open the transaction revision "
"for verification against the base "
"revision", r->pool);
}
@@ -1872,22 +1920,35 @@ do_out_of_date_check(dav_resource_combined *comb, request_rec *r)
serr = svn_fs_revision_root(&rev_root, comb->res.info->repos->fs,
comb->priv.version_name, r->pool);
- if (!serr)
- serr = svn_fs_node_id(&rev_id, rev_root,
- comb->priv.repos_path, r->pool);
-
if (serr != NULL)
{
+ svn_fs_close_root(txn_base_root);
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
- "Could not open the base revision"
- "for verification against the youngest "
- "revision", r->pool);
+ "Could not open the base revision "
+ "for verification against the "
+ "transaction revision", r->pool);
}
+ serr = svn_fs_node_relation(&node_relation, rev_root,
+ comb->priv.repos_path,
+ txn_base_root,
+ comb->priv.repos_path,
+ r->pool);
+
svn_fs_close_root(rev_root);
svn_fs_close_root(txn_base_root);
- if (0 != svn_fs_compare_ids(txn_base_id, rev_id))
+ if (serr != NULL)
+ {
+ /* ### correct HTTP error? */
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Unable to fetch the node revision id "
+ "of the version resource within the "
+ "revision",
+ r->pool);
+ }
+
+ if (node_relation != svn_fs_node_unchanged)
{
serr = svn_error_createf(SVN_ERR_RA_OUT_OF_DATE, NULL,
"Directory '%s' is out of date",
@@ -2065,6 +2126,16 @@ get_resource(request_rec *r,
xslt_uri = dav_svn__get_xslt_uri(r);
fs_parent_path = dav_svn__get_fs_parent_path(r);
+ if (r->method_number == M_COPY)
+ {
+ /* Workaround for issue #4531: Avoid a depth-infinity walk on
+ the copy source by overriding the Depth header here.
+ mod_dav defaults to infinite depth if this header is not set
+ which makes copies O(size of source) rather than the desired O(1).
+ ### Should be fixed by an explicit provider API feature in mod_dav. */
+ apr_table_setn(r->headers_in, "Depth", "0");
+ }
+
/* Special case: detect and build the SVNParentPath as a unique type
of private resource, iff the SVNListParentPath directive is 'on'. */
if (dav_svn__is_parentpath_list(r))
@@ -2261,7 +2332,7 @@ get_resource(request_rec *r,
}
/* Retrieve/cache open repository */
- repos_key = apr_pstrcat(r->pool, "mod_dav_svn:", fs_path, (char *)NULL);
+ repos_key = apr_pstrcat(r->pool, "mod_dav_svn:", fs_path, SVN_VA_NULL);
apr_pool_userdata_get(&userdata, repos_key, r->connection->pool);
repos->repos = userdata;
if (repos->repos == NULL)
@@ -2275,7 +2346,9 @@ get_resource(request_rec *r,
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
dav_svn__get_fulltext_cache_flag(r) ? "1" :"0");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
- dav_svn__get_revprop_cache_flag(r) ? "1" :"0");
+ dav_svn__get_revprop_cache_flag(r) ? "2" :"0");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
+ dav_svn__get_block_read_flag(r) ? "1" :"0");
/* Disallow BDB/event until issue 4157 is fixed. */
if (!strcmp(ap_show_mpm(), "event"))
@@ -2298,8 +2371,8 @@ get_resource(request_rec *r,
/* open the FS */
if (!serr)
- serr = svn_repos_open2(&(repos->repos), fs_path, fs_config,
- r->connection->pool);
+ serr = svn_repos_open3(&(repos->repos), fs_path, fs_config,
+ r->connection->pool, r->pool);
if (serr != NULL)
{
/* The error returned by svn_repos_open2 might contain the
@@ -2307,9 +2380,16 @@ get_resource(request_rec *r,
leak that path back to the client, because that would be
a security risk, but we do want to log the real error on
the server side. */
- return dav_svn__sanitize_error(serr, "Could not open the requested "
- "SVN filesystem",
- HTTP_INTERNAL_SERVER_ERROR, r);
+
+ apr_status_t cause = svn_error_root_cause(serr)->apr_err;
+ if (APR_STATUS_IS_ENOENT(cause) || APR_STATUS_IS_ENOTDIR(cause))
+ return dav_svn__sanitize_error(
+ serr, "Could not find the requested SVN filesystem",
+ HTTP_NOT_FOUND, r);
+ else
+ return dav_svn__sanitize_error(
+ serr, "Could not open the requested SVN filesystem",
+ HTTP_INTERNAL_SERVER_ERROR, r);
}
/* Cache the open repos for the next request on this connection */
@@ -2467,7 +2547,7 @@ get_resource(request_rec *r,
"/",
r->args ? "?" : "",
r->args ? r->args : "",
- (char *)NULL);
+ SVN_VA_NULL);
apr_table_setn(r->headers_out, "Location",
ap_construct_url(r->pool, new_path, r));
return dav_svn__new_error(r->pool, HTTP_MOVED_PERMANENTLY, 0,
@@ -3161,8 +3241,8 @@ set_headers(request_rec *r, const dav_resource *resource)
typedef struct diff_ctx_t {
- ap_filter_t *output;
- apr_pool_t *pool;
+ dav_svn__output *output;
+ apr_bucket_brigade *bb;
} diff_ctx_t;
@@ -3170,18 +3250,9 @@ static svn_error_t * __attribute__((warn_unused_result))
write_to_filter(void *baton, const char *buffer, apr_size_t *len)
{
diff_ctx_t *dc = baton;
- apr_bucket_brigade *bb;
- apr_bucket *bkt;
- apr_status_t status;
/* take the current data and shove it into the filter */
- bb = apr_brigade_create(dc->pool, dc->output->c->bucket_alloc);
- bkt = apr_bucket_transient_create(buffer, *len, dc->output->c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, bkt);
- if ((status = ap_pass_brigade(dc->output, bb)) != APR_SUCCESS) {
- return svn_error_create(status, NULL,
- "Could not write data to filter");
- }
+ SVN_ERR(dav_svn__brigade_write(dc->bb, dc->output, buffer, *len));
return SVN_NO_ERROR;
}
@@ -3191,28 +3262,270 @@ static svn_error_t * __attribute__((warn_unused_result))
close_filter(void *baton)
{
diff_ctx_t *dc = baton;
- apr_bucket_brigade *bb;
apr_bucket *bkt;
- apr_status_t status;
/* done with the file. write an EOS bucket now. */
- bb = apr_brigade_create(dc->pool, dc->output->c->bucket_alloc);
- bkt = apr_bucket_eos_create(dc->output->c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, bkt);
- if ((status = ap_pass_brigade(dc->output, bb)) != APR_SUCCESS)
- return svn_error_create(status, NULL, "Could not write EOS to filter");
+ bkt = apr_bucket_eos_create(dav_svn__output_get_bucket_alloc(dc->output));
+ APR_BRIGADE_INSERT_TAIL(dc->bb, bkt);
+ SVN_ERR(dav_svn__output_pass_brigade(dc->output, dc->bb));
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+emit_collection_head(const dav_resource *resource,
+ apr_bucket_brigade *bb,
+ dav_svn__output *output,
+ svn_boolean_t gen_html,
+ apr_pool_t *pool)
+{
+ /* XML schema for the directory index if xslt_uri is set:
+
+ <?xml version="1.0"?>
+ <?xml-stylesheet type="text/xsl" href="[info->repos->xslt_uri]"?> */
+ static const char xml_index_dtd[] =
+ "<!DOCTYPE svn [\n"
+ " <!ELEMENT svn (index)>\n"
+ " <!ATTLIST svn version CDATA #REQUIRED\n"
+ " href CDATA #REQUIRED>\n"
+ " <!ELEMENT index (updir?, (file | dir)*)>\n"
+ " <!ATTLIST index name CDATA #IMPLIED\n"
+ " path CDATA #IMPLIED\n"
+ " rev CDATA #IMPLIED\n"
+ " base CDATA #IMPLIED>\n"
+ " <!ELEMENT updir EMPTY>\n"
+ " <!ATTLIST updir href CDATA #REQUIRED>\n"
+ " <!ELEMENT file EMPTY>\n"
+ " <!ATTLIST file name CDATA #REQUIRED\n"
+ " href CDATA #REQUIRED>\n"
+ " <!ELEMENT dir EMPTY>\n"
+ " <!ATTLIST dir name CDATA #REQUIRED\n"
+ " href CDATA #REQUIRED>\n"
+ "]>\n";
+
+ if (gen_html)
+ {
+ const char *title;
+ if (resource->info->repos_path == NULL)
+ title = "unknown location";
+ else
+ title = resource->info->repos_path;
+
+ if (resource->info->restype != DAV_SVN_RESTYPE_PARENTPATH_COLLECTION)
+ {
+ if (SVN_IS_VALID_REVNUM(resource->info->root.rev))
+ title = apr_psprintf(pool,
+ "Revision %ld: %s",
+ resource->info->root.rev, title);
+ if (resource->info->repos->repo_basename)
+ title = apr_psprintf(pool, "%s - %s",
+ resource->info->repos->repo_basename,
+ title);
+ if (resource->info->repos->repo_name)
+ title = apr_psprintf(pool, "%s: %s",
+ resource->info->repos->repo_name,
+ title);
+ }
+
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ "<html><head><title>%s</title></head>\n"
+ "<body>\n <h2>%s</h2>\n <ul>\n",
+ title, title));
+ }
+ else
+ {
+ const char *name = resource->info->repos->repo_name;
+ const char *href = resource->info->repos_path;
+ const char *base = resource->info->repos->repo_basename;
+
+ SVN_ERR(dav_svn__brigade_puts(bb, output, "<?xml version=\"1.0\"?>\n"));
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ "<?xml-stylesheet type=\"text/xsl\" "
+ "href=\"%s\"?>\n",
+ resource->info->repos->xslt_uri));
+ SVN_ERR(dav_svn__brigade_puts(bb, output, xml_index_dtd));
+ SVN_ERR(dav_svn__brigade_puts(bb, output,
+ "<svn version=\"" SVN_VERSION "\"\n"
+ " href=\"http://subversion.apache.org/\">\n"));
+ SVN_ERR(dav_svn__brigade_puts(bb, output, " <index"));
+
+ if (name)
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " name=\"%s\"",
+ apr_xml_quote_string(resource->pool,
+ name, 1)));
+ if (SVN_IS_VALID_REVNUM(resource->info->root.rev))
+ SVN_ERR(dav_svn__brigade_printf(bb, output, " rev=\"%ld\"",
+ resource->info->root.rev));
+ if (href)
+ SVN_ERR(dav_svn__brigade_printf(bb, output, " path=\"%s\"",
+ apr_xml_quote_string(resource->pool,
+ href, 1)));
+ if (base)
+ SVN_ERR(dav_svn__brigade_printf(bb, output, " base=\"%s\"", base));
+
+ SVN_ERR(dav_svn__brigade_puts(bb, output, ">\n"));
+ }
+
+ if ((resource->info->restype != DAV_SVN_RESTYPE_PARENTPATH_COLLECTION)
+ && resource->info->repos_path
+ && ((resource->info->repos_path[1] != '\0')
+ || dav_svn__get_list_parentpath_flag(resource->info->r)))
+ {
+ const char *href;
+ if (resource->info->pegged)
+ {
+ href = apr_psprintf(pool, "../?p=%ld", resource->info->root.rev);
+ }
+ else
+ {
+ href = "../";
+ }
+
+ if (gen_html)
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <li><a href=\"%s\">..</a></li>\n",
+ href));
+ }
+ else
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <updir href=\"%s\"/>\n",
+ href));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+emit_collection_entry(const dav_resource *resource,
+ apr_bucket_brigade *bb,
+ dav_svn__output *output,
+ const svn_fs_dirent_t *entry,
+ svn_boolean_t gen_html,
+ apr_pool_t *pool)
+{
+ const char *name = entry->name;
+ const char *href = name;
+ svn_boolean_t is_dir = (entry->kind == svn_node_dir);
+
+ /* append a trailing slash onto the name for directories. we NEED
+ this for the href portion so that the relative reference will
+ descend properly. for the visible portion, it is just nice. */
+ /* ### The xml output doesn't like to see a trailing slash on
+ ### the visible portion, so avoid that. */
+ if (is_dir)
+ href = apr_pstrcat(pool, href, "/", SVN_VA_NULL);
+
+ if (gen_html)
+ name = href;
+
+ /* We quote special characters in both XML and HTML. */
+ name = apr_xml_quote_string(pool, name, !gen_html);
+
+ /* According to httpd-2.0.54/include/httpd.h, ap_os_escape_path()
+ behaves differently on different platforms. It claims to
+ "convert an OS path to a URL in an OS dependant way".
+ Nevertheless, there appears to be only one implementation
+ of the function in httpd, and the code seems completely
+ platform independent, so we'll assume it's appropriate for
+ mod_dav_svn to use it to quote outbound paths. */
+ href = ap_os_escape_path(pool, href, 0);
+ href = apr_xml_quote_string(pool, href, 1);
+
+ if (gen_html)
+ {
+ /* If our directory was access using the public peg-rev
+ CGI query interface, we'll let its dirents carry that
+ peg-rev, too. */
+ if (resource->info->pegged)
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <li><a href=\"%s?p=%ld\">%s</a></li>\n",
+ href, resource->info->root.rev, name));
+ }
+ else
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <li><a href=\"%s\">%s</a></li>\n",
+ href, name));
+ }
+ }
+ else
+ {
+ const char *const tag = (is_dir ? "dir" : "file");
+
+ /* This is where we could search for props */
+
+ /* If our directory was access using the public peg-rev
+ CGI query interface, we'll let its dirents carry that
+ peg-rev, too. */
+ if (resource->info->pegged)
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <%s name=\"%s\" href=\"%s?p=%ld\" />\n",
+ tag, name, href, resource->info->root.rev));
+ }
+ else
+ {
+ SVN_ERR(dav_svn__brigade_printf(bb, output,
+ " <%s name=\"%s\" href=\"%s\" />\n",
+ tag, name, href));
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+emit_collection_tail(const dav_resource *resource,
+ apr_bucket_brigade *bb,
+ dav_svn__output *output,
+ svn_boolean_t gen_html,
+ apr_pool_t *pool)
+{
+ if (gen_html)
+ {
+ if (strcmp(ap_psignature("FOO", resource->info->r), "") != 0)
+ {
+ /* Apache's signature generation code didn't eat our prefix.
+ ServerSignature must be enabled. Print our version info.
+
+ WARNING: This is a kludge!! ap_psignature() doesn't promise
+ to return the empty string when ServerSignature is off. We
+ know it does by code inspection, but this behavior is subject
+ to change. (Perhaps we should try to get the Apache folks to
+ make this promise, though. Seems harmless/useful enough...)
+ */
+ SVN_ERR(dav_svn__brigade_puts(bb, output,
+ " </ul>\n <hr noshade><em>Powered by "
+ "<a href=\"http://subversion.apache.org/\">"
+ "Apache Subversion"
+ "</a> version " SVN_VERSION "."
+ "</em>\n</body></html>"));
+ }
+ else
+ SVN_ERR(dav_svn__brigade_puts(bb, output, " </ul>\n</body></html>"));
+ }
+ else
+ SVN_ERR(dav_svn__brigade_puts(bb, output, " </index>\n</svn>\n"));
return SVN_NO_ERROR;
}
static dav_error *
-deliver(const dav_resource *resource, ap_filter_t *output)
+deliver(const dav_resource *resource, ap_filter_t *unused)
{
svn_error_t *serr;
apr_bucket_brigade *bb;
apr_bucket *bkt;
- apr_status_t status;
+ dav_svn__output *output;
/* Check resource type */
if (resource->baselined
@@ -3225,39 +3538,17 @@ deliver(const dav_resource *resource, ap_filter_t *output)
"Cannot GET this type of resource.");
}
+ output = dav_svn__output_create(resource->info->r, resource->pool);
+
if (resource->collection)
{
const int gen_html = !resource->info->repos->xslt_uri;
apr_hash_t *entries;
- apr_pool_t *entry_pool;
+ apr_pool_t *iterpool;
apr_array_header_t *sorted;
svn_revnum_t dir_rev = SVN_INVALID_REVNUM;
int i;
- /* XML schema for the directory index if xslt_uri is set:
-
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="[info->repos->xslt_uri]"?> */
- static const char xml_index_dtd[] =
- "<!DOCTYPE svn [\n"
- " <!ELEMENT svn (index)>\n"
- " <!ATTLIST svn version CDATA #REQUIRED\n"
- " href CDATA #REQUIRED>\n"
- " <!ELEMENT index (updir?, (file | dir)*)>\n"
- " <!ATTLIST index name CDATA #IMPLIED\n"
- " path CDATA #IMPLIED\n"
- " rev CDATA #IMPLIED\n"
- " base CDATA #IMPLIED>\n"
- " <!ELEMENT updir EMPTY>\n"
- " <!ATTLIST updir href CDATA #REQUIRED>\n"
- " <!ELEMENT file EMPTY>\n"
- " <!ATTLIST file name CDATA #REQUIRED\n"
- " href CDATA #REQUIRED>\n"
- " <!ELEMENT dir EMPTY>\n"
- " <!ATTLIST dir name CDATA #REQUIRED\n"
- " href CDATA #REQUIRED>\n"
- "]>\n";
-
/* <svn version="1.3.0 (dev-build)"
href="http://subversion.apache.org">
<index name="[info->repos->repo_name]"
@@ -3338,99 +3629,21 @@ deliver(const dav_resource *resource, ap_filter_t *output)
resource->pool);
}
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
-
- if (gen_html)
- {
- const char *title;
- if (resource->info->repos_path == NULL)
- title = "unknown location";
- else
- title = resource->info->repos_path;
-
- if (resource->info->restype != DAV_SVN_RESTYPE_PARENTPATH_COLLECTION)
- {
- if (SVN_IS_VALID_REVNUM(resource->info->root.rev))
- title = apr_psprintf(resource->pool,
- "Revision %ld: %s",
- resource->info->root.rev, title);
- if (resource->info->repos->repo_basename)
- title = apr_psprintf(resource->pool, "%s - %s",
- resource->info->repos->repo_basename,
- title);
- if (resource->info->repos->repo_name)
- title = apr_psprintf(resource->pool, "%s: %s",
- resource->info->repos->repo_name,
- title);
- }
-
- ap_fprintf(output, bb, "<html><head><title>%s</title></head>\n"
- "<body>\n <h2>%s</h2>\n <ul>\n", title, title);
- }
- else
- {
- const char *name = resource->info->repos->repo_name;
- const char *href = resource->info->repos_path;
- const char *base = resource->info->repos->repo_basename;
-
- ap_fputs(output, bb, "<?xml version=\"1.0\"?>\n");
- ap_fprintf(output, bb,
- "<?xml-stylesheet type=\"text/xsl\" href=\"%s\"?>\n",
- resource->info->repos->xslt_uri);
- ap_fputs(output, bb, xml_index_dtd);
- ap_fputs(output, bb,
- "<svn version=\"" SVN_VERSION "\"\n"
- " href=\"http://subversion.apache.org/\">\n");
- ap_fputs(output, bb, " <index");
- if (name)
- ap_fprintf(output, bb, " name=\"%s\"",
- apr_xml_quote_string(resource->pool, name, 1));
- if (SVN_IS_VALID_REVNUM(resource->info->root.rev))
- ap_fprintf(output, bb, " rev=\"%ld\"",
- resource->info->root.rev);
- if (href)
- ap_fprintf(output, bb, " path=\"%s\"",
- apr_xml_quote_string(resource->pool,
- href,
- 1));
- if (base)
- ap_fprintf(output, bb, " base=\"%s\"", base);
-
- ap_fputs(output, bb, ">\n");
- }
-
- if ((resource->info->restype != DAV_SVN_RESTYPE_PARENTPATH_COLLECTION)
- && resource->info->repos_path
- && ((resource->info->repos_path[1] != '\0')
- || dav_svn__get_list_parentpath_flag(resource->info->r)))
- {
- const char *href;
- if (resource->info->pegged)
- {
- href = apr_psprintf(resource->pool, "../?p=%ld",
- resource->info->root.rev);
- }
- else
- {
- href = "../";
- }
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
- if (gen_html)
- {
- ap_fprintf(output, bb,
- " <li><a href=\"%s\">..</a></li>\n", href);
- }
- else
- {
- ap_fprintf(output, bb, " <updir href=\"%s\"/>\n", href);
- }
- }
+ serr = emit_collection_head(resource, bb, output, gen_html,
+ resource->pool);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "could not output collection",
+ resource->pool);
/* get a sorted list of the entries */
sorted = svn_sort__hash(entries, svn_sort_compare_items_as_paths,
resource->pool);
- entry_pool = svn_pool_create(resource->pool);
+ iterpool = svn_pool_create(resource->pool);
for (i = 0; i < sorted->nelts; ++i)
{
@@ -3438,11 +3651,9 @@ deliver(const dav_resource *resource, ap_filter_t *output)
const svn_sort__item_t);
const svn_fs_dirent_t *entry = item->value;
const char *name = item->key;
- const char *href = name;
- svn_boolean_t is_dir = (entry->kind == svn_node_dir);
const char *repos_relpath = NULL;
- svn_pool_clear(entry_pool);
+ svn_pool_clear(iterpool);
/* DIR_REV is set to a valid revision if we're looking at
the entries of a versioned directory. Otherwise, we're
@@ -3450,120 +3661,45 @@ deliver(const dav_resource *resource, ap_filter_t *output)
if (SVN_IS_VALID_REVNUM(dir_rev))
{
repos_relpath = svn_fspath__join(resource->info->repos_path,
- name, entry_pool);
+ name, iterpool);
if (! dav_svn__allow_read(resource->info->r,
resource->info->repos,
repos_relpath,
dir_rev,
- entry_pool))
+ iterpool))
continue;
}
else
{
if (! dav_svn__allow_list_repos(resource->info->r,
- entry->name, entry_pool))
+ entry->name, iterpool))
continue;
}
- /* append a trailing slash onto the name for directories. we NEED
- this for the href portion so that the relative reference will
- descend properly. for the visible portion, it is just nice. */
- /* ### The xml output doesn't like to see a trailing slash on
- ### the visible portion, so avoid that. */
- if (is_dir)
- href = apr_pstrcat(entry_pool, href, "/", (char *)NULL);
-
- if (gen_html)
- name = href;
-
- /* We quote special characters in both XML and HTML. */
- name = apr_xml_quote_string(entry_pool, name, !gen_html);
-
- /* According to httpd-2.0.54/include/httpd.h, ap_os_escape_path()
- behaves differently on different platforms. It claims to
- "convert an OS path to a URL in an OS dependant way".
- Nevertheless, there appears to be only one implementation
- of the function in httpd, and the code seems completely
- platform independent, so we'll assume it's appropriate for
- mod_dav_svn to use it to quote outbound paths. */
- href = ap_os_escape_path(entry_pool, href, 0);
- href = apr_xml_quote_string(entry_pool, href, 1);
-
- if (gen_html)
- {
- /* If our directory was access using the public peg-rev
- CGI query interface, we'll let its dirents carry that
- peg-rev, too. */
- if (resource->info->pegged)
- {
- ap_fprintf(output, bb,
- " <li><a href=\"%s?p=%ld\">%s</a></li>\n",
- href, resource->info->root.rev, name);
- }
- else
- {
- ap_fprintf(output, bb,
- " <li><a href=\"%s\">%s</a></li>\n",
- href, name);
- }
- }
- else
- {
- const char *const tag = (is_dir ? "dir" : "file");
-
- /* This is where we could search for props */
-
- /* If our directory was access using the public peg-rev
- CGI query interface, we'll let its dirents carry that
- peg-rev, too. */
- if (resource->info->pegged)
- {
- ap_fprintf(output, bb,
- " <%s name=\"%s\" href=\"%s?p=%ld\" />\n",
- tag, name, href, resource->info->root.rev);
- }
- else
- {
- ap_fprintf(output, bb,
- " <%s name=\"%s\" href=\"%s\" />\n",
- tag, name, href);
- }
- }
+ serr = emit_collection_entry(resource, bb, output, entry, gen_html,
+ iterpool);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "could not output collection entry",
+ resource->pool);
}
- svn_pool_destroy(entry_pool);
+ svn_pool_destroy(iterpool);
- if (gen_html)
- {
- if (strcmp(ap_psignature("FOO", resource->info->r), "") != 0)
- {
- /* Apache's signature generation code didn't eat our prefix.
- ServerSignature must be enabled. Print our version info.
-
- WARNING: This is a kludge!! ap_psignature() doesn't promise
- to return the empty string when ServerSignature is off. We
- know it does by code inspection, but this behavior is subject
- to change. (Perhaps we should try to get the Apache folks to
- make this promise, though. Seems harmless/useful enough...)
- */
- ap_fputs(output, bb,
- " </ul>\n <hr noshade><em>Powered by "
- "<a href=\"http://subversion.apache.org/\">"
- "Apache Subversion"
- "</a> version " SVN_VERSION "."
- "</em>\n</body></html>");
- }
- else
- ap_fputs(output, bb, " </ul>\n</body></html>");
- }
- else
- ap_fputs(output, bb, " </index>\n</svn>\n");
+ serr = emit_collection_tail(resource, bb, output, gen_html,
+ resource->pool);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "could not output collection",
+ resource->pool);
- bkt = apr_bucket_eos_create(output->c->bucket_alloc);
+ bkt = apr_bucket_eos_create(dav_svn__output_get_bucket_alloc(output));
APR_BRIGADE_INSERT_TAIL(bb, bkt);
- if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS)
- return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write EOS to filter.");
+ serr = dav_svn__output_pass_brigade(output, bb);
+ if (serr != NULL)
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write EOS to filter.",
+ resource->pool);
return NULL;
}
@@ -3626,10 +3762,13 @@ deliver(const dav_resource *resource, ap_filter_t *output)
"could not prepare to read a delta",
resource->pool);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
+
/* create a stream that svndiff data will be written to,
which will copy it to the network */
dc.output = output;
- dc.pool = resource->pool;
+ dc.bb = bb;
o_stream = svn_stream_create(&dc, resource->pool);
svn_stream_set_write(o_stream, write_to_filter);
svn_stream_set_close(o_stream, close_filter);
@@ -3645,6 +3784,8 @@ deliver(const dav_resource *resource, ap_filter_t *output)
to the network. */
serr = svn_txdelta_send_txstream(txd_stream, handler, h_baton,
resource->pool);
+ apr_brigade_destroy(bb);
+
if (serr != NULL)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"could not deliver the txdelta stream",
@@ -3723,11 +3864,11 @@ deliver(const dav_resource *resource, ap_filter_t *output)
resource->info->repos->base_url,
ap_escape_uri(resource->pool,
resource->info->r->uri),
- NULL);
+ SVN_VA_NULL);
str_root = apr_pstrcat(resource->pool,
resource->info->repos->base_url,
resource->info->repos->root_path,
- NULL);
+ SVN_VA_NULL);
serr = svn_subst_build_keywords3(&kw, keywords->data,
str_cmt_rev, str_uri, str_root,
@@ -3750,13 +3891,17 @@ deliver(const dav_resource *resource, ap_filter_t *output)
### which will read from the FS stream on demand */
block = apr_palloc(resource->pool, SVN__STREAM_CHUNK_SIZE);
+ bb = apr_brigade_create(resource->pool,
+ dav_svn__output_get_bucket_alloc(output));
+
while (1) {
apr_size_t bufsize = SVN__STREAM_CHUNK_SIZE;
/* read from the FS ... */
- serr = svn_stream_read(stream, block, &bufsize);
+ serr = svn_stream_read_full(stream, block, &bufsize);
if (serr != NULL)
{
+ apr_brigade_destroy(bb);
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"could not read the file contents",
resource->pool);
@@ -3764,30 +3909,35 @@ deliver(const dav_resource *resource, ap_filter_t *output)
if (bufsize == 0)
break;
- /* build a brigade and write to the filter ... */
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
- bkt = apr_bucket_transient_create(block, bufsize,
- output->c->bucket_alloc);
+ /* write to the filter ... */
+ bkt = apr_bucket_transient_create(
+ block, bufsize, dav_svn__output_get_bucket_alloc(output));
APR_BRIGADE_INSERT_TAIL(bb, bkt);
- if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) {
- /* ### what to do with status; and that HTTP code... */
- return dav_svn__new_error(resource->pool,
- HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write data to filter.");
- }
+ serr = dav_svn__output_pass_brigade(output, bb);
+ if (serr != NULL)
+ {
+ apr_brigade_destroy(bb);
+ /* ### that HTTP code... */
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write data to filter.",
+ resource->pool);
+ }
}
/* done with the file. write an EOS bucket now. */
- bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
- bkt = apr_bucket_eos_create(output->c->bucket_alloc);
+ bkt = apr_bucket_eos_create(dav_svn__output_get_bucket_alloc(output));
APR_BRIGADE_INSERT_TAIL(bb, bkt);
- if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) {
- /* ### what to do with status; and that HTTP code... */
- return dav_svn__new_error(resource->pool,
- HTTP_INTERNAL_SERVER_ERROR, 0,
- "Could not write EOS to filter.");
- }
+ serr = dav_svn__output_pass_brigade(output, bb);
+ if (serr != NULL)
+ {
+ apr_brigade_destroy(bb);
+ /* ### that HTTP code... */
+ return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
+ "Could not write EOS to filter.",
+ resource->pool);
+ }
+ apr_brigade_destroy(bb);
return NULL;
}
}
@@ -3904,23 +4054,28 @@ copy_resource(const dav_resource *src,
return err;
}
- serr = svn_dirent_get_absolute(&src_repos_path,
- svn_repos_path(src->info->repos->repos,
- src->pool),
- src->pool);
- if (!serr)
- serr = svn_dirent_get_absolute(&dst_repos_path,
- svn_repos_path(dst->info->repos->repos,
- dst->pool),
- dst->pool);
+ src_repos_path = svn_repos_path(src->info->repos->repos, src->pool);
+ dst_repos_path = svn_repos_path(dst->info->repos->repos, dst->pool);
+
+ if (strcmp(src_repos_path, dst_repos_path) != 0)
+ {
+ /* Perhaps the source and dst repos use different path formats? */
+ serr = svn_error_compose_create(
+ svn_dirent_get_absolute(&src_repos_path, src_repos_path,
+ src->pool),
+ svn_dirent_get_absolute(&dst_repos_path, dst_repos_path,
+ dst->pool));
+
+ if (!serr && (strcmp(src_repos_path, dst_repos_path) != 0))
+ return dav_svn__new_error_svn(
+ dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ "Copy source and destination are in different repositories");
+ }
+ else
+ serr = SVN_NO_ERROR;
if (!serr)
{
- if (strcmp(src_repos_path, dst_repos_path) != 0)
- return dav_svn__new_error_tag
- (dst->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
- "Copy source and destination are in different repositories.",
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
serr = svn_fs_copy(src->info->root.root, /* root object of src rev*/
src->info->repos_path, /* relative path of src */
dst->info->root.root, /* root object of dst txn*/
@@ -4030,7 +4185,11 @@ remove_resource(dav_resource *resource, dav_response **response)
if (resource->info->version_name < created_rev)
{
serr = svn_error_createf(SVN_ERR_RA_OUT_OF_DATE, NULL,
- "Item '%s' is out of date",
+ resource->collection
+ ? "Directory '%s' is out of date"
+ : (resource->exists
+ ? "File '%s' is out of date"
+ : "'%s' is out of date"),
resource->info->repos_path);
return dav_svn__convert_err(serr, HTTP_CONFLICT,
"Can't DELETE out-of-date resource",
@@ -4042,8 +4201,9 @@ remove_resource(dav_resource *resource, dav_response **response)
incoming lock-tokens into the filesystem's access_t. Normally
they come in via 'If:' header, and get_resource()
automatically notices them and does this work for us. In the
- case of a directory deletion, however, svn clients are sending
- 'child' lock-tokens in the DELETE request body. */
+ case of a directory deletion, however, older subversion clients
+ are sending 'child' lock-tokens in the non-standard DELETE
+ request body. */
err = dav_svn__build_lock_hash(&locks, resource->info->r,
resource->info->repos_path, resource->pool);
@@ -4157,10 +4317,15 @@ typedef struct walker_ctx_t {
} walker_ctx_t;
-
+/* Recursively walk a resource for walk(). When DEPTH != 0, recurse with
+ DEPTH-1 on child nodes. WALK_ROOT should be TRUE for the root and will be
+ FALSE for any descendants, to avoid unneeded work for every descendant
+ node.
+ */
static dav_error *
do_walk(walker_ctx_t *ctx,
int depth,
+ svn_boolean_t walk_root,
apr_pool_t *scratch_pool)
{
const dav_walk_params *params = ctx->params;
@@ -4225,16 +4390,19 @@ do_walk(walker_ctx_t *ctx,
uri_len = ctx->uri->len;
repos_len = ctx->repos_path->len;
- /* Tell our logging subsystem that we're listing a directory.
-
- Note: if we cared, we could look at the 'User-Agent:' request
- header and distinguish an svn client ('svn ls') from a generic
- DAV client. */
- dav_svn__operational_log(&ctx->info,
- svn_log__get_dir(ctx->info.repos_path,
- ctx->info.root.rev,
- TRUE, FALSE, SVN_DIRENT_ALL,
- scratch_pool));
+ if (walk_root)
+ {
+ /* Tell our logging subsystem that we're listing a directory.
+
+ Note: if we cared, we could look at the 'User-Agent:' request
+ header and distinguish an svn client ('svn ls') from a generic
+ DAV client. */
+ dav_svn__operational_log(&ctx->info,
+ svn_log__get_dir(ctx->info.repos_path,
+ ctx->info.root.rev,
+ TRUE, FALSE, SVN_DIRENT_ALL,
+ scratch_pool));
+ }
/* fetch this collection's children */
serr = svn_fs_dir_entries(&children, ctx->info.root.root,
@@ -4267,7 +4435,7 @@ do_walk(walker_ctx_t *ctx,
apr_pstrmemdup(iterpool,
ctx->repos_path->data,
ctx->repos_path->len),
- key, (char *)NULL);
+ key, SVN_VA_NULL);
if (! dav_svn__allow_read(ctx->info.r, ctx->info.repos,
repos_relpath, ctx->info.root.rev,
iterpool))
@@ -4287,7 +4455,10 @@ do_walk(walker_ctx_t *ctx,
{
err = (*params->func)(&ctx->wres, DAV_CALLTYPE_MEMBER);
if (err != NULL)
- return err;
+ {
+ svn_pool_destroy(iterpool);
+ return err;
+ }
}
else
{
@@ -4299,9 +4470,12 @@ do_walk(walker_ctx_t *ctx,
ctx->res.uri = ctx->uri->data;
/* recurse on this collection */
- err = do_walk(ctx, depth - 1, iterpool);
+ err = do_walk(ctx, depth - 1, FALSE, iterpool);
if (err != NULL)
- return err;
+ {
+ svn_pool_destroy(iterpool);
+ return err;
+ }
/* restore the data */
ctx->res.collection = FALSE;
@@ -4381,7 +4555,7 @@ walk(const dav_walk_params *params, int depth, dav_response **response)
/* ### is the root already/always open? need to verify */
/* always return the error, and any/all multistatus responses */
- err = do_walk(&ctx, depth, params->pool);
+ err = do_walk(&ctx, depth, TRUE, params->pool);
*response = ctx.wres.response;
return err;
@@ -4428,7 +4602,7 @@ dav_svn__create_working_resource(dav_resource *base,
if (base->info->repos->root_path[1])
res->uri = apr_pstrcat(base->pool, base->info->repos->root_path,
- path, (char *)NULL);
+ path, SVN_VA_NULL);
else
res->uri = path;
res->hooks = &dav_svn__hooks_repository;
@@ -4481,7 +4655,7 @@ dav_svn__working_to_regular_resource(dav_resource *resource)
/* if rev was specific, create baseline-collection URL */
path = dav_svn__build_uri(repos, DAV_SVN__BUILD_URI_BC,
priv->root.rev, priv->repos_path,
- 0, resource->pool);
+ FALSE /* add_href */, resource->pool);
}
path = svn_path_uri_encode(path, resource->pool);
priv->uri_path = svn_stringbuf_create(path, resource->pool);
@@ -4526,7 +4700,7 @@ dav_svn__create_version_resource(dav_resource **version_res,
static dav_error *
handle_post_request(request_rec *r,
dav_resource *resource,
- ap_filter_t *output)
+ dav_svn__output *output)
{
svn_skel_t *request_skel, *post_skel;
int status;
@@ -4609,7 +4783,9 @@ int dav_svn__method_post(request_rec *r)
content_type = apr_table_get(r->headers_in, "content-type");
if (content_type && (strcmp(content_type, SVN_SKEL_MIME_TYPE) == 0))
{
- derr = handle_post_request(r, resource, r->output_filters);
+ dav_svn__output *output = dav_svn__output_create(resource->info->r,
+ resource->pool);
+ derr = handle_post_request(r, resource, output);
}
else
{
diff --git a/subversion/mod_dav_svn/status.c b/subversion/mod_dav_svn/status.c
new file mode 100644
index 0000000..6dc1c9e
--- /dev/null
+++ b/subversion/mod_dav_svn/status.c
@@ -0,0 +1,115 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <httpd.h>
+#include <http_core.h>
+#include <http_config.h>
+#include <http_request.h>
+#include <http_protocol.h>
+
+#include "dav_svn.h"
+#include "private/svn_cache.h"
+#include "private/svn_fs_private.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* For getpid() */
+#endif
+
+/* The apache headers define these and they conflict with our definitions. */
+#ifdef PACKAGE_BUGREPORT
+#undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
+#undef PACKAGE_NAME
+#endif
+#ifdef PACKAGE_STRING
+#undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
+#undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif
+#include "svn_private_config.h"
+
+#ifndef DEFAULT_TIME_FORMAT
+#define DEFAULT_TIME_FORMAT "%Y-%m-%d %H:%M:%S %Z"
+#endif
+
+/* A bit like mod_status: add a location:
+
+ <Location /svn-status>
+ SetHandler svn-status
+ </Location>
+
+ and then point a browser at http://server/svn-status.
+*/
+int dav_svn__status(request_rec *r)
+{
+ svn_cache__info_t *info;
+ svn_string_t *text_stats;
+ apr_array_header_t *lines;
+ int i;
+
+ if (r->method_number != M_GET || strcmp(r->handler, "svn-status"))
+ return DECLINED;
+
+ info = svn_cache__membuffer_get_global_info(r->pool);
+ text_stats = svn_cache__format_info(info, FALSE, r->pool);
+ lines = svn_cstring_split(text_stats->data, "\n", FALSE, r->pool);
+
+ ap_set_content_type(r, "text/html; charset=ISO-8859-1");
+
+ ap_rvputs(r,
+ DOCTYPE_HTML_3_2
+ "<html><head>\n"
+ "<title>Apache SVN Status</title>\n"
+ "</head><body>\n"
+ "<h1>Apache SVN Cache Status for ",
+ ap_escape_html(r->pool, ap_get_server_name(r)),
+ " (via ",
+ r->connection->local_ip,
+ ")</h1>\n<dl>\n<dt>Server Version: ",
+ ap_get_server_description(),
+ "</dt>\n<dt>Current Time: ",
+ ap_ht_time(r->pool, apr_time_now(), DEFAULT_TIME_FORMAT, 0),
+ "</dt>\n", SVN_VA_NULL);
+
+#if !defined(WIN32) && defined(HAVE_UNISTD_H) && defined(HAVE_GETPID)
+ /* On Unix the server is generally multiple processes and this
+ request only shows the status of the single process that handles
+ the request. Ideally we would iterate over all processes but that
+ would need some MPM support, so we settle for simply showing the
+ process ID. */
+ ap_rprintf(r, "<dt>Server process id: %d</dt>\n", (int)getpid());
+#endif
+
+ for (i = 0; i < lines->nelts; ++i)
+ {
+ const char *line = APR_ARRAY_IDX(lines, i, const char *);
+ ap_rvputs(r, "<dt>", line, "</dt>\n", SVN_VA_NULL);
+ }
+
+ ap_rvputs(r, "</dl></body></html>\n", SVN_VA_NULL);
+
+ return 0;
+}
diff --git a/subversion/mod_dav_svn/util.c b/subversion/mod_dav_svn/util.c
index 2890502..ce824cd 100644
--- a/subversion/mod_dav_svn/util.c
+++ b/subversion/mod_dav_svn/util.c
@@ -1,5 +1,8 @@
/*
- * util.c: some handy utility functions
+ * util.c:
+ * # ****************************************************************************
+ * # TRASHY LITTLE SUBROUTINES
+ * # ****************************************************************************
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -37,7 +40,6 @@
#include "dav_svn.h"
#include "private/svn_fspath.h"
-#include "private/svn_string_private.h"
dav_error *
dav_svn__new_error(apr_pool_t *pool,
@@ -59,26 +61,24 @@ dav_svn__new_error(apr_pool_t *pool,
return dav_new_error(pool, status, error_id, 0, desc);
#else
- errno = 0; /* For the same reason as in dav_svn__new_error_tag */
+ errno = 0; /* For the same reason as in dav_svn__new_error_svn */
return dav_new_error(pool, status, error_id, desc);
#endif
}
dav_error *
-dav_svn__new_error_tag(apr_pool_t *pool,
+dav_svn__new_error_svn(apr_pool_t *pool,
int status,
int error_id,
- const char *desc,
- const char *namespace,
- const char *tagname)
+ const char *desc)
{
if (error_id == 0)
error_id = SVN_ERR_RA_DAV_REQUEST_FAILED;
#if AP_MODULE_MAGIC_AT_LEAST(20091119,0)
return dav_new_error_tag(pool, status, error_id, 0,
- desc, namespace, tagname);
+ desc, SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
#else
/* dav_new_error_tag will record errno but Subversion makes no attempt
to ensure that it is valid. We reset it to avoid putting incorrect
@@ -86,7 +86,8 @@ dav_svn__new_error_tag(apr_pool_t *pool,
valid information. */
errno = 0;
- return dav_new_error_tag(pool, status, error_id, desc, namespace, tagname);
+ return dav_new_error_tag(pool, status, error_id, desc,
+ SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
#endif
}
@@ -96,11 +97,11 @@ dav_svn__new_error_tag(apr_pool_t *pool,
static dav_error *
build_error_chain(apr_pool_t *pool, svn_error_t *err, int status)
{
- char *msg = err->message ? apr_pstrdup(pool, err->message) : NULL;
+ char buffer[128];
+ const char *msg = svn_err_best_message(err, buffer, sizeof(buffer));
- dav_error *derr = dav_svn__new_error_tag(pool, status, err->apr_err, msg,
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ dav_error *derr = dav_svn__new_error_svn(pool, status, err->apr_err,
+ apr_pstrdup(pool, msg));
if (err->child)
derr->prev = build_error_chain(pool, err->child, status);
@@ -115,51 +116,52 @@ dav_svn__convert_err(svn_error_t *serr,
const char *message,
apr_pool_t *pool)
{
- dav_error *derr;
-
- /* Remove the trace-only error chain links. We need predictable
- protocol behavior regardless of whether or not we're in a
- debugging build. */
- svn_error_t *purged_serr = svn_error_purge_tracing(serr);
-
- /* ### someday mod_dav_svn will send back 'rich' error tags, much
- finer grained than plain old svn_error_t's. But for now, all
- svn_error_t's are marshalled to the client via the single
- generic <svn:error/> tag nestled within a <D:error> block. */
-
- /* Examine the Subverion error code, and select the most
- appropriate HTTP status code. If no more appropriate HTTP
- status code maps to the Subversion error code, use the one
- suggested status provided by the caller. */
- switch (purged_serr->apr_err)
- {
- case SVN_ERR_FS_NOT_FOUND:
- status = HTTP_NOT_FOUND;
- break;
- case SVN_ERR_UNSUPPORTED_FEATURE:
- status = HTTP_NOT_IMPLEMENTED;
- break;
- case SVN_ERR_FS_LOCK_OWNER_MISMATCH:
- case SVN_ERR_FS_PATH_ALREADY_LOCKED:
- status = HTTP_LOCKED;
- break;
- case SVN_ERR_FS_PROP_BASEVALUE_MISMATCH:
- status = HTTP_PRECONDITION_FAILED;
- break;
- /* add other mappings here */
- }
-
- derr = build_error_chain(pool, purged_serr, status);
- if (message != NULL
- && purged_serr->apr_err != SVN_ERR_REPOS_HOOK_FAILURE)
- /* Don't hide hook failures; we might hide the error text */
- derr = dav_push_error(pool, status, purged_serr->apr_err,
- message, derr);
-
- /* Now, destroy the Subversion error. */
- svn_error_clear(serr);
-
- return derr;
+ dav_error *derr;
+
+ /* Remove the trace-only error chain links. We need predictable
+ protocol behavior regardless of whether or not we're in a
+ debugging build. */
+ svn_error_t *purged_serr = svn_error_purge_tracing(serr);
+
+ /* ### someday mod_dav_svn will send back 'rich' error tags, much
+ finer grained than plain old svn_error_t's. But for now, all
+ svn_error_t's are marshalled to the client via the single
+ generic <svn:error/> tag nestled within a <D:error> block. */
+
+ /* Examine the Subverion error code, and select the most
+ appropriate HTTP status code. If no more appropriate HTTP
+ status code maps to the Subversion error code, use the one
+ suggested status provided by the caller. */
+ switch (purged_serr->apr_err)
+ {
+ case SVN_ERR_FS_NOT_FOUND:
+ case SVN_ERR_FS_NO_SUCH_REVISION:
+ status = HTTP_NOT_FOUND;
+ break;
+ case SVN_ERR_UNSUPPORTED_FEATURE:
+ status = HTTP_NOT_IMPLEMENTED;
+ break;
+ case SVN_ERR_FS_LOCK_OWNER_MISMATCH:
+ case SVN_ERR_FS_PATH_ALREADY_LOCKED:
+ status = HTTP_LOCKED;
+ break;
+ case SVN_ERR_FS_PROP_BASEVALUE_MISMATCH:
+ status = HTTP_PRECONDITION_FAILED;
+ break;
+ /* add other mappings here */
+ }
+
+ derr = build_error_chain(pool, purged_serr, status);
+ if (message != NULL
+ && !svn_error_find_cause(purged_serr, SVN_ERR_REPOS_HOOK_FAILURE))
+ /* Don't hide hook failures; we might hide the error text */
+ derr = dav_push_error(pool, status, purged_serr->apr_err,
+ message, derr);
+
+ /* Now, destroy the Subversion error. */
+ svn_error_clear(serr);
+
+ return derr;
}
@@ -176,10 +178,10 @@ get_last_history_rev(svn_revnum_t *revision,
const char *ignored;
/* Get an initial HISTORY baton. */
- SVN_ERR(svn_fs_node_history(&history, root, path, pool));
+ SVN_ERR(svn_fs_node_history2(&history, root, path, pool, pool));
/* Now get the first *real* point of interesting history. */
- SVN_ERR(svn_fs_history_prev(&history, history, FALSE, pool));
+ SVN_ERR(svn_fs_history_prev2(&history, history, FALSE, pool, pool));
/* Fetch the location information for this history step. */
return svn_fs_history_location(&ignored, revision, history, pool);
@@ -193,15 +195,9 @@ dav_svn__get_safe_cr(svn_fs_root_t *root, const char *path, apr_pool_t *pool)
svn_revnum_t history_rev;
svn_fs_root_t *other_root;
svn_fs_t *fs = svn_fs_root_fs(root);
- const svn_fs_id_t *id, *other_id;
+ svn_fs_node_relation_t node_relation;
svn_error_t *err;
- if ((err = svn_fs_node_id(&id, root, path, pool)))
- {
- svn_error_clear(err);
- return revision; /* couldn't get id of root/path */
- }
-
if ((err = get_last_history_rev(&history_rev, root, path, pool)))
{
svn_error_clear(err);
@@ -214,13 +210,14 @@ dav_svn__get_safe_cr(svn_fs_root_t *root, const char *path, apr_pool_t *pool)
return revision; /* couldn't open the history rev */
}
- if ((err = svn_fs_node_id(&other_id, other_root, path, pool)))
+ if ((err = svn_fs_node_relation(&node_relation, root, path,
+ other_root, path, pool)))
{
svn_error_clear(err);
- return revision; /* couldn't get id of other_root/path */
+ return revision;
}
- if (svn_fs_compare_ids(id, other_id) == 0)
+ if (node_relation == svn_fs_node_unchanged)
return history_rev; /* the history rev is safe! the same node
exists at the same path in both revisions. */
@@ -234,7 +231,7 @@ dav_svn__build_uri(const dav_svn_repos *repos,
enum dav_svn__build_what what,
svn_revnum_t revision,
const char *path,
- int add_href,
+ svn_boolean_t add_href,
apr_pool_t *pool)
{
const char *root_path = repos->root_path;
@@ -464,6 +461,48 @@ dav_svn__find_ns(const apr_array_header_t *namespaces, const char *uri)
return -1;
}
+
+/*** Output helpers ***/
+
+
+struct dav_svn__output
+{
+ request_rec *r;
+};
+
+dav_svn__output *
+dav_svn__output_create(request_rec *r,
+ apr_pool_t *pool)
+{
+ dav_svn__output *output = apr_pcalloc(pool, sizeof(*output));
+ output->r = r;
+ return output;
+}
+
+apr_bucket_alloc_t *
+dav_svn__output_get_bucket_alloc(dav_svn__output *output)
+{
+ return output->r->connection->bucket_alloc;
+}
+
+svn_error_t *
+dav_svn__output_pass_brigade(dav_svn__output *output,
+ apr_bucket_brigade *bb)
+{
+ apr_status_t status;
+
+ status = ap_pass_brigade(output->r->output_filters, bb);
+ /* Empty the brigade here, as required by ap_pass_brigade(). */
+ apr_brigade_cleanup(bb);
+ if (status)
+ return svn_error_create(status, NULL, "Could not write data to filter");
+
+ /* Check for an aborted connection, since the brigade functions don't
+ appear to return useful errors when the connection is dropped. */
+ if (output->r->connection->aborted)
+ return svn_error_create(SVN_ERR_APMOD_CONNECTION_ABORTED, NULL, NULL);
+ return SVN_NO_ERROR;
+}
/*** Brigade I/O wrappers ***/
@@ -471,17 +510,18 @@ dav_svn__find_ns(const apr_array_header_t *namespaces, const char *uri)
svn_error_t *
dav_svn__brigade_write(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *data,
apr_size_t len)
{
apr_status_t apr_err;
- apr_err = apr_brigade_write(bb, ap_filter_flush, output, data, len);
+ apr_err = apr_brigade_write(bb, ap_filter_flush,
+ output->r->output_filters, data, len);
if (apr_err)
return svn_error_create(apr_err, 0, NULL);
/* Check for an aborted connection, since the brigade functions don't
appear to be return useful errors when the connection is dropped. */
- if (output->c->aborted)
+ if (output->r->connection->aborted)
return svn_error_create(SVN_ERR_APMOD_CONNECTION_ABORTED, 0, NULL);
return SVN_NO_ERROR;
}
@@ -489,16 +529,17 @@ dav_svn__brigade_write(apr_bucket_brigade *bb,
svn_error_t *
dav_svn__brigade_puts(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *str)
{
apr_status_t apr_err;
- apr_err = apr_brigade_puts(bb, ap_filter_flush, output, str);
+ apr_err = apr_brigade_puts(bb, ap_filter_flush,
+ output->r->output_filters, str);
if (apr_err)
return svn_error_create(apr_err, 0, NULL);
/* Check for an aborted connection, since the brigade functions don't
appear to be return useful errors when the connection is dropped. */
- if (output->c->aborted)
+ if (output->r->connection->aborted)
return svn_error_create(SVN_ERR_APMOD_CONNECTION_ABORTED, 0, NULL);
return SVN_NO_ERROR;
}
@@ -506,7 +547,7 @@ dav_svn__brigade_puts(apr_bucket_brigade *bb,
svn_error_t *
dav_svn__brigade_printf(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
const char *fmt,
...)
{
@@ -514,18 +555,41 @@ dav_svn__brigade_printf(apr_bucket_brigade *bb,
va_list ap;
va_start(ap, fmt);
- apr_err = apr_brigade_vprintf(bb, ap_filter_flush, output, fmt, ap);
+ apr_err = apr_brigade_vprintf(bb, ap_filter_flush,
+ output->r->output_filters, fmt, ap);
va_end(ap);
if (apr_err)
return svn_error_create(apr_err, 0, NULL);
/* Check for an aborted connection, since the brigade functions don't
appear to be return useful errors when the connection is dropped. */
- if (output->c->aborted)
+ if (output->r->connection->aborted)
return svn_error_create(SVN_ERR_APMOD_CONNECTION_ABORTED, 0, NULL);
return SVN_NO_ERROR;
}
+svn_error_t *
+dav_svn__brigade_putstrs(apr_bucket_brigade *bb,
+ dav_svn__output *output,
+ ...)
+{
+ apr_status_t apr_err;
+ va_list ap;
+
+ va_start(ap, output);
+ apr_err = apr_brigade_vputstrs(bb, ap_filter_flush,
+ output->r->output_filters, ap);
+ va_end(ap);
+ if (apr_err)
+ return svn_error_create(apr_err, NULL, NULL);
+ /* Check for an aborted connection, since the brigade functions don't
+ appear to return useful errors when the connection is dropped. */
+ if (output->r->connection->aborted)
+ return svn_error_create(SVN_ERR_APMOD_CONNECTION_ABORTED, NULL, NULL);
+ return SVN_NO_ERROR;
+}
+
+
dav_error *
@@ -541,12 +605,11 @@ dav_svn__test_canonical(const char *path, apr_pool_t *pool)
return NULL;
/* Otherwise, generate a generic HTTP_BAD_REQUEST error. */
- return dav_svn__new_error_tag
- (pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(
+ pool, HTTP_BAD_REQUEST, 0,
apr_psprintf(pool,
"Path '%s' is not canonicalized; "
- "there is a problem with the client.", path),
- SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG);
+ "there is a problem with the client.", path));
}
@@ -576,18 +639,19 @@ dav_svn__sanitize_error(svn_error_t *serr,
"%s", purged_serr->message);
}
- svn_error_clear(serr);
- }
- return dav_svn__convert_err(safe_err, http_status,
- apr_psprintf(r->pool, "%s", safe_err->message),
- r->pool);
+ svn_error_clear(serr);
+ }
+
+ return dav_svn__convert_err(safe_err, http_status,
+ apr_psprintf(r->pool, "%s", safe_err->message),
+ r->pool);
}
struct brigade_write_baton
{
apr_bucket_brigade *bb;
- ap_filter_t *output;
+ dav_svn__output *output;
};
@@ -598,7 +662,8 @@ brigade_write_fn(void *baton, const char *data, apr_size_t *len)
struct brigade_write_baton *wb = baton;
apr_status_t apr_err;
- apr_err = apr_brigade_write(wb->bb, ap_filter_flush, wb->output, data, *len);
+ apr_err = apr_brigade_write(wb->bb, ap_filter_flush,
+ wb->output->r->output_filters, data, *len);
if (apr_err != APR_SUCCESS)
return svn_error_wrap_apr(apr_err, "Error writing base64 data");
@@ -609,7 +674,7 @@ brigade_write_fn(void *baton, const char *data, apr_size_t *len)
svn_stream_t *
dav_svn__make_base64_output_stream(apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
apr_pool_t *pool)
{
struct brigade_write_baton *wb = apr_palloc(pool, sizeof(*wb));
@@ -636,7 +701,7 @@ dav_svn__operational_log(struct dav_resource_private *info, const char *line)
dav_error *
dav_svn__final_flush_or_error(request_rec *r,
apr_bucket_brigade *bb,
- ap_filter_t *output,
+ dav_svn__output *output,
dav_error *preferred_err,
apr_pool_t *pool)
{
@@ -658,7 +723,7 @@ dav_svn__final_flush_or_error(request_rec *r,
provided a more-important DERR, though. */
if (do_flush)
{
- apr_status_t apr_err = ap_fflush(output, bb);
+ apr_status_t apr_err = ap_fflush(output->r->output_filters, bb);
if (apr_err && (! derr))
derr = dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0,
"Error flushing brigade.");
@@ -745,7 +810,7 @@ request_body_to_string(svn_string_t **request_str,
int seen_eos;
apr_status_t status;
apr_off_t total_read = 0;
- apr_off_t limit_req_body = ap_get_limit_req_body(r);
+ apr_off_t limit_req_body = ap_get_limit_xml_body(r);
int result = HTTP_BAD_REQUEST;
const char *content_length_str;
char *endp;
@@ -757,7 +822,7 @@ request_body_to_string(svn_string_t **request_str,
content_length_str = apr_table_get(r->headers_in, "Content-Length");
if (content_length_str)
{
- if (svn__strtoff(&content_length, content_length_str, &endp, 10)
+ if (apr_strtoff(&content_length, content_length_str, &endp, 10)
|| endp == content_length_str || *endp || content_length < 0)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Invalid Content-Length");
@@ -778,7 +843,12 @@ request_body_to_string(svn_string_t **request_str,
if (content_length)
{
- buf = svn_stringbuf_create_ensure(content_length, pool);
+ /* Do not allocate more than 1 MB until we receive request body. */
+ apr_size_t alloc_len = 1 * 1024 *1024;
+ if (content_length < alloc_len)
+ alloc_len = (apr_size_t) content_length;
+
+ buf = svn_stringbuf_create_ensure(alloc_len, pool);
}
else
{
@@ -861,7 +931,7 @@ dav_svn__parse_request_skel(svn_skel_t **skel,
*skel = NULL;
status = request_body_to_string(&skel_str, r, pool);
if (status != OK)
- return OK;
+ return status;
*skel = svn_skel__parse(skel_str->data, skel_str->len, pool);
return OK;
diff --git a/subversion/mod_dav_svn/version.c b/subversion/mod_dav_svn/version.c
index 98208a9..638cae9 100644
--- a/subversion/mod_dav_svn/version.c
+++ b/subversion/mod_dav_svn/version.c
@@ -178,26 +178,33 @@ get_option(const dav_resource *resource,
request_rec *r = resource->info->r;
const char *repos_root_uri =
dav_svn__build_uri(resource->info->repos, DAV_SVN__BUILD_URI_PUBLIC,
- SVN_IGNORED_REVNUM, "", 0, resource->pool);
+ SVN_IGNORED_REVNUM, "", FALSE /* add_href */,
+ resource->pool);
/* ### DAV:version-history-collection-set */
- if (elem->ns == APR_XML_NS_DAV_ID)
+ if (elem->ns != APR_XML_NS_DAV_ID
+ || strcmp(elem->name, "activity-collection-set") != 0)
{
- if (strcmp(elem->name, "activity-collection-set") == 0)
- {
- apr_text_append(resource->pool, option,
- "<D:activity-collection-set>");
- apr_text_append(resource->pool, option,
- dav_svn__build_uri(resource->info->repos,
- DAV_SVN__BUILD_URI_ACT_COLLECTION,
- SVN_INVALID_REVNUM, NULL,
- 1 /* add_href */,
- resource->pool));
- apr_text_append(resource->pool, option,
- "</D:activity-collection-set>");
- }
+ /* We don't know about other options (yet).
+
+ If we ever add multiple option request keys we should
+ just write the requested option value and make sure
+ we set the headers *once*. */
+ return NULL;
}
+ apr_text_append(resource->pool, option,
+ "<D:activity-collection-set>");
+
+ apr_text_append(resource->pool, option,
+ dav_svn__build_uri(resource->info->repos,
+ DAV_SVN__BUILD_URI_ACT_COLLECTION,
+ SVN_INVALID_REVNUM, NULL,
+ TRUE /* add_href */,
+ resource->pool));
+ apr_text_append(resource->pool, option,
+ "</D:activity-collection-set>");
+
/* If we're allowed (by configuration) to do so, advertise support
for ephemeral transaction properties. */
if (dav_svn__check_ephemeral_txnprops_support(r))
@@ -297,25 +304,25 @@ get_option(const dav_resource *resource,
apr_table_set(r->headers_out, SVN_DAV_ROOT_URI_HEADER, repos_root_uri);
apr_table_set(r->headers_out, SVN_DAV_ME_RESOURCE_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_me_resource_uri(r), (char *)NULL));
+ dav_svn__get_me_resource_uri(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_REV_ROOT_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_rev_root_stub(r), (char *)NULL));
+ dav_svn__get_rev_root_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_REV_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_rev_stub(r), (char *)NULL));
+ dav_svn__get_rev_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_TXN_ROOT_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_txn_root_stub(r), (char *)NULL));
+ dav_svn__get_txn_root_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_TXN_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_txn_stub(r), (char *)NULL));
+ dav_svn__get_txn_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_VTXN_ROOT_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_vtxn_root_stub(r), (char *)NULL));
+ dav_svn__get_vtxn_root_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_VTXN_STUB_HEADER,
apr_pstrcat(resource->pool, repos_root_uri, "/",
- dav_svn__get_vtxn_stub(r), (char *)NULL));
+ dav_svn__get_vtxn_stub(r), SVN_VA_NULL));
apr_table_set(r->headers_out, SVN_DAV_ALLOW_BULK_UPDATES,
bulk_upd_conf == CONF_BULKUPD_ON ? "On" :
bulk_upd_conf == CONF_BULKUPD_OFF ? "Off" : "Prefer");
@@ -395,11 +402,9 @@ vsn_control(dav_resource *resource, const char *target)
/* Only allow a NULL target, which means an create an 'empty' VCR. */
if (target != NULL)
- return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
SVN_ERR_UNSUPPORTED_FEATURE,
- "vsn_control called with non-null target.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "vsn_control called with non-null target");
/* This is kind of silly. The docstring for this callback says it's
supposed to "put a resource under version control". But in
@@ -445,20 +450,16 @@ dav_svn__checkout(dav_resource *resource,
return NULL;
if (resource->type != DAV_RESOURCE_TYPE_REGULAR)
- return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
SVN_ERR_UNSUPPORTED_FEATURE,
"auto-checkout attempted on non-regular "
- "version-controlled resource.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "version-controlled resource");
if (resource->baselined)
- return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
SVN_ERR_UNSUPPORTED_FEATURE,
"auto-checkout attempted on baseline "
- "collection, which is not supported.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "collection, which is not supported");
/* See if the shared activity already exists. */
apr_err = apr_pool_userdata_get(&data,
@@ -540,51 +541,41 @@ dav_svn__checkout(dav_resource *resource,
if (resource->type != DAV_RESOURCE_TYPE_VERSION)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_METHOD_NOT_ALLOWED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_METHOD_NOT_ALLOWED,
SVN_ERR_UNSUPPORTED_FEATURE,
"CHECKOUT can only be performed on a "
- "version resource [at this time].",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "version resource");
}
if (create_activity)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
SVN_ERR_UNSUPPORTED_FEATURE,
"CHECKOUT cannot create an activity at "
- "this time. Use MKACTIVITY first.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "this time. Use MKACTIVITY first");
}
if (is_unreserved)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
SVN_ERR_UNSUPPORTED_FEATURE,
"Unreserved checkouts are not yet "
"available. A version history may not be "
"checked out more than once, into a "
- "specific activity.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "specific activity");
}
if (activities == NULL)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
SVN_ERR_INCOMPLETE_DATA,
"An activity must be provided for "
- "checkout.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "checkout");
}
/* assert: nelts > 0. the below check effectively means > 1. */
if (activities->nelts != 1)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
SVN_ERR_INCORRECT_PARAMS,
"Only one activity may be specified within "
- "the CHECKOUT.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "the CHECKOUT");
}
serr = dav_svn__simple_parse_uri(&parse, resource,
@@ -600,21 +591,17 @@ dav_svn__checkout(dav_resource *resource,
}
if (parse.activity_id == NULL)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
SVN_ERR_INCORRECT_PARAMS,
- "The provided href is not an activity URI.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "The provided href is not an activity URI");
}
if ((txn_name = dav_svn__get_txn(resource->info->repos,
parse.activity_id)) == NULL)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
SVN_ERR_APMOD_ACTIVITY_NOT_FOUND,
- "The specified activity does not exist.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "The specified activity does not exist");
}
/* verify the specified version resource is the "latest", thus allowing
@@ -642,13 +629,11 @@ dav_svn__checkout(dav_resource *resource,
if (resource->info->root.rev != youngest)
{
- return dav_svn__new_error_tag(resource->pool, HTTP_CONFLICT,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT,
SVN_ERR_APMOD_BAD_BASELINE,
"The specified baseline is not the "
"latest baseline, so it may not be "
- "checked out.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "checked out");
}
/* ### hmm. what if the transaction root's revision is different
@@ -742,11 +727,9 @@ dav_svn__checkout(dav_resource *resource,
{
/* The item being modified is older than the one in the
transaction. The client is out of date. */
- return dav_svn__new_error_tag
+ return dav_svn__new_error_svn
(resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT,
- "resource out of date; try updating",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "resource out of date; try updating");
}
else if (resource->info->root.rev > txn_created_rev)
{
@@ -754,42 +737,25 @@ dav_svn__checkout(dav_resource *resource,
revision than the one in the transaction. We'll
check to see if they are still the same node, and if
not, return an error. */
- const svn_fs_id_t *url_noderev_id, *txn_noderev_id;
-
- if ((serr = svn_fs_node_id(&txn_noderev_id, txn_root,
- resource->info->repos_path,
- resource->pool)))
+ svn_fs_node_relation_t node_relation;
+ if ((serr = svn_fs_node_relation(&node_relation, txn_root,
+ resource->info->repos_path,
+ resource->info->root.root,
+ resource->info->repos_path,
+ resource->pool)))
{
- err = dav_svn__new_error_tag
+ err = dav_svn__new_error_svn
(resource->pool, HTTP_CONFLICT, serr->apr_err,
"Unable to fetch the node revision id of the version "
- "resource within the transaction.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "resource within the revision");
svn_error_clear(serr);
return err;
}
- if ((serr = svn_fs_node_id(&url_noderev_id,
- resource->info->root.root,
- resource->info->repos_path,
- resource->pool)))
+ if (node_relation != svn_fs_node_unchanged)
{
- err = dav_svn__new_error_tag
- (resource->pool, HTTP_CONFLICT, serr->apr_err,
- "Unable to fetch the node revision id of the version "
- "resource within the revision.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
- svn_error_clear(serr);
- return err;
- }
- if (svn_fs_compare_ids(url_noderev_id, txn_noderev_id) != 0)
- {
- return dav_svn__new_error_tag
+ return dav_svn__new_error_svn
(resource->pool, HTTP_CONFLICT, SVN_ERR_FS_CONFLICT,
- "version resource newer than txn (restart the commit)",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "version resource newer than txn (restart the commit)");
}
}
}
@@ -806,11 +772,9 @@ static dav_error *
uncheckout(dav_resource *resource)
{
if (resource->type != DAV_RESOURCE_TYPE_WORKING)
- return dav_svn__new_error_tag(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+ return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
SVN_ERR_UNSUPPORTED_FEATURE,
- "UNCHECKOUT called on non-working resource.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "UNCHECKOUT called on non-working resource");
/* Try to abort the txn if it exists; but don't try too hard. :-) */
if (resource->info->root.txn)
@@ -877,7 +841,7 @@ cleanup_deltify(void *data)
subpool, then destroy it before exiting. */
apr_pool_t *subpool = svn_pool_create(cdb->pool);
- err = svn_repos_open2(&repos, cdb->repos_path, NULL, subpool);
+ err = svn_repos_open3(&repos, cdb->repos_path, NULL, subpool, subpool);
if (err)
{
ap_log_perror(APLOG_MARK, APLOG_ERR, err->apr_err, cdb->pool,
@@ -949,11 +913,9 @@ dav_svn__checkin(dav_resource *resource,
txn? Many txns? Etc.) */
if (resource->type != DAV_RESOURCE_TYPE_WORKING)
- return dav_svn__new_error_tag(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+ return dav_svn__new_error_svn(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
SVN_ERR_UNSUPPORTED_FEATURE,
- "CHECKIN called on non-working resource.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "CHECKIN called on non-working resource");
/* If the global autoversioning activity still exists, that means
nobody's committed it yet. */
@@ -1010,7 +972,7 @@ dav_svn__checkin(dav_resource *resource,
{
const char *post_commit_err = svn_repos__post_commit_error_str
(serr, resource->pool);
- ap_log_perror(APLOG_MARK, APLOG_ERR, serr->apr_err,
+ ap_log_perror(APLOG_MARK, APLOG_ERR, APR_EGENERAL,
resource->pool,
"commit of r%ld succeeded, but an error occurred "
"after the commit: '%s'",
@@ -1079,7 +1041,7 @@ dav_svn__checkin(dav_resource *resource,
uri = dav_svn__build_uri(resource->info->repos,
DAV_SVN__BUILD_URI_VERSION,
new_rev, resource->info->repos_path,
- 0, resource->pool);
+ FALSE /* add_href */, resource->pool);
err = dav_svn__create_version_resource(version_resource, uri,
resource->pool);
@@ -1130,12 +1092,16 @@ static dav_error *
deliver_report(request_rec *r,
const dav_resource *resource,
const apr_xml_doc *doc,
- ap_filter_t *output)
+ ap_filter_t *unused)
{
int ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (doc->root->ns == ns)
{
+ dav_svn__output *output;
+
+ output = dav_svn__output_create(resource->info->r, resource->pool);
+
/* ### note that these report names should have symbols... */
if (strcmp(doc->root->name, "update-report") == 0)
@@ -1188,11 +1154,9 @@ deliver_report(request_rec *r,
}
/* ### what is a good error for an unknown report? */
- return dav_svn__new_error_tag(resource->pool, HTTP_NOT_IMPLEMENTED,
+ return dav_svn__new_error_svn(resource->pool, HTTP_NOT_IMPLEMENTED,
SVN_ERR_UNSUPPORTED_FEATURE,
- "The requested report is unknown.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "The requested report is unknown");
}
@@ -1219,13 +1183,11 @@ make_activity(dav_resource *resource)
/* sanity check: make sure the resource is a valid activity, in
case an older mod_dav doesn't do the check for us. */
if (! can_be_activity(resource))
- return dav_svn__new_error_tag(resource->pool, HTTP_FORBIDDEN,
+ return dav_svn__new_error_svn(resource->pool, HTTP_FORBIDDEN,
SVN_ERR_APMOD_MALFORMED_URI,
"Activities cannot be created at that "
"location; query the "
- "DAV:activity-collection-set property.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "DAV:activity-collection-set property");
err = dav_svn__create_txn(resource->info->repos, &txn_name,
NULL, resource->pool);
@@ -1396,6 +1358,23 @@ dav_svn__push_locks(dav_resource *resource,
return NULL;
}
+/* Implements svn_fs_lock_callback_t. */
+static svn_error_t *
+unlock_many_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ request_rec *r = lock_baton;
+
+ if (fs_err)
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, fs_err->apr_err, r,
+ "%s", fs_err->message);
+
+ return SVN_NO_ERROR;
+}
+
/* Helper for merge(). Free every lock in LOCKS. The locks
live in REPOS. Log any errors for REQUEST. Use POOL for temporary
@@ -1406,28 +1385,16 @@ release_locks(apr_hash_t *locks,
request_rec *r,
apr_pool_t *pool)
{
- apr_hash_index_t *hi;
- const void *key;
- void *val;
apr_pool_t *subpool = svn_pool_create(pool);
svn_error_t *err;
- for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
- {
- svn_pool_clear(subpool);
- apr_hash_this(hi, &key, NULL, &val);
-
- /* The lock may be stolen or broken sometime between
- svn_fs_commit_txn() and this post-commit cleanup. So ignore
- any errors from this command; just free as many locks as we can. */
- err = svn_repos_fs_unlock(repos, key, val, FALSE, subpool);
+ err = svn_repos_fs_unlock_many(repos, locks, FALSE, unlock_many_cb, r,
+ subpool, subpool);
- if (err) /* If we got an error, just log it and move along. */
- ap_log_rerror(APLOG_MARK, APLOG_ERR, err->apr_err, r,
- "%s", err->message);
-
- svn_error_clear(err);
- }
+ if (err) /* If we got an error, just log it and move along. */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, err->apr_err, r,
+ "%s", err->message);
+ svn_error_clear(err);
svn_pool_destroy(subpool);
@@ -1441,7 +1408,7 @@ merge(dav_resource *target,
int no_auto_merge,
int no_checkout,
apr_xml_elem *prop_elem,
- ap_filter_t *output)
+ ap_filter_t *unused)
{
apr_pool_t *pool;
dav_error *err;
@@ -1452,6 +1419,7 @@ merge(dav_resource *target,
svn_revnum_t new_rev;
apr_hash_t *locks;
svn_boolean_t disable_merge_response = FALSE;
+ dav_svn__output *output;
/* We'll use the target's pool for our operation. We happen to know that
it matches the request pool, which (should) have the proper lifetime. */
@@ -1464,22 +1432,18 @@ merge(dav_resource *target,
|| (source->type == DAV_RESOURCE_TYPE_PRIVATE
&& source->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION)))
{
- return dav_svn__new_error_tag(pool, HTTP_METHOD_NOT_ALLOWED,
+ return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED,
SVN_ERR_INCORRECT_PARAMS,
"MERGE can only be performed using an "
"activity or transaction resource as the "
- "source.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "source");
}
if (! source->exists)
{
- return dav_svn__new_error_tag(pool, HTTP_METHOD_NOT_ALLOWED,
+ return dav_svn__new_error_svn(pool, HTTP_METHOD_NOT_ALLOWED,
SVN_ERR_INCORRECT_PARAMS,
"MERGE activity or transaction resource "
- "does not exist.",
- SVN_DAV_ERROR_NAMESPACE,
- SVN_DAV_ERROR_TAG);
+ "does not exist");
}
/* Before attempting the final commit, we need to push any incoming
@@ -1528,6 +1492,11 @@ merge(dav_resource *target,
### client some other way than hijacking the post-commit
### error message.*/
post_commit_err = svn_repos__post_commit_error_str(serr, pool);
+ ap_log_perror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, pool,
+ "commit of r%ld succeeded, but an error occurred "
+ "after the commit: '%s'",
+ new_rev,
+ post_commit_err);
svn_error_clear(serr);
serr = SVN_NO_ERROR;
}
@@ -1620,6 +1589,7 @@ merge(dav_resource *target,
}
/* process the response for the new revision. */
+ output = dav_svn__output_create(target->info->r, pool);
return dav_svn__merge_response(output, source->info->repos, new_rev,
post_commit_err, prop_elem,
disable_merge_response, pool);
diff --git a/subversion/po/de.po b/subversion/po/de.po
index 297b8d7..9a27a13 100644
--- a/subversion/po/de.po
+++ b/subversion/po/de.po
@@ -94,10 +94,10 @@
# Indikativ: "Gibt keine interaktiven Rückfragen aus"
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
-"POT-Creation-Date: 2014-11-08 21:44+0000\n"
-"PO-Revision-Date: 2013-07-11 20:22+0100\n"
+"POT-Creation-Date: 2015-04-10 21:15+0200\n"
+"PO-Revision-Date: 2015-04-10 21:13+0100\n"
"Last-Translator: Subversion Developers <dev@subversion.apache.org>\n"
"Language-Team: German <dev@subversion.apache.org>\n"
"Language: de\n"
@@ -105,76 +105,78 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
+"X-POOTLE-MTIME: 1373662891.0\n"
#. Constructing nice error messages for roots.
#. Build an SVN_ERR_FS_NOT_FOUND error, with a detailed error text,
#. for PATH in ROOT. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:81
+#: ../include/private/svn_fs_util.h:86
#, c-format
msgid "File not found: transaction '%s', path '%s'"
msgstr "Datei nicht gefunden: Transaktion »%s«, Pfad »%s«"
-#: ../include/private/svn_fs_util.h:86
+#: ../include/private/svn_fs_util.h:91
#, c-format
msgid "File not found: revision %ld, path '%s'"
msgstr "Datei nicht gefunden: Revision %ld, Pfad »%s«"
#. Build a detailed `file already exists' message for PATH in ROOT.
#. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:97
+#: ../include/private/svn_fs_util.h:102
#, c-format
msgid "File already exists: filesystem '%s', transaction '%s', path '%s'"
msgstr "Datei existiert bereits: Dateisystem »%s«, Transaktion »%s«, Pfad »%s«"
-#: ../include/private/svn_fs_util.h:102
+#: ../include/private/svn_fs_util.h:107
#, c-format
msgid "File already exists: filesystem '%s', revision %ld, path '%s'"
msgstr "Datei existiert bereits: Dateisystem »%s«, Revision %ld, Pfad »%s«"
#. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:110
+#: ../include/private/svn_fs_util.h:115
msgid "Root object must be a transaction root"
msgstr "Basisobjekt muss eine Transaktionsbasis sein"
#. SVN_FS__ERR_NOT_MUTABLE: the caller attempted to change a node
#. outside of a transaction. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:117
+#: ../include/private/svn_fs_util.h:122
#, c-format
msgid "File is not mutable: filesystem '%s', revision %ld, path '%s'"
msgstr "Datei ist nicht veränderlich: Dateisystem »%s«, Revision %ld, Pfad »%s«"
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:124
+#: ../include/private/svn_fs_util.h:129
#, c-format
msgid "'%s' is not a directory in filesystem '%s'"
msgstr "»%s« ist kein Verzeichnis im Dateisystem »%s«"
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:131
+#: ../include/private/svn_fs_util.h:136
#, c-format
msgid "'%s' is not a file in filesystem '%s'"
msgstr "»%s« ist im Dateisystem »%s« keine Datei"
#. FS is of type "svn_fs_t *", LOCK is of type "svn_lock_t *".
-#: ../include/private/svn_fs_util.h:139
+#: ../include/private/svn_fs_util.h:144
#, c-format
msgid "Path '%s' is already locked by user '%s' in filesystem '%s'"
msgstr "Pfad »%s« ist bereits vom Benutzer »%s« im Dateisystem »%s« gesperrt"
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:146
+#: ../include/private/svn_fs_util.h:151
#, c-format
msgid "No lock on path '%s' in filesystem '%s'"
msgstr "Keine Sperre für Pfad »%s« im Dateisystem »%s«"
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:153
+#: ../include/private/svn_fs_util.h:158
#, c-format
msgid "Lock has expired: lock-token '%s' in filesystem '%s'"
msgstr "Sperre lief aus: Sperrmarke »%s« in Dateisystem »%s«"
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:160
+#: ../include/private/svn_fs_util.h:165
#, c-format
msgid "No username is currently associated with filesystem '%s'"
msgstr "Zurzeit ist kein Benutzername mit dem Dateisystem »%s« verbunden"
@@ -182,1216 +184,1387 @@ msgstr "Zurzeit ist kein Benutzername mit dem Dateisystem »%s« verbunden"
#. SVN_FS__ERR_LOCK_OWNER_MISMATCH: trying to use a lock whose
#. LOCK_OWNER doesn't match the USERNAME associated with FS.
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:169
+#: ../include/private/svn_fs_util.h:174
#, c-format
msgid "User '%s' is trying to use a lock owned by '%s' in filesystem '%s'"
msgstr "Der Benutzer »%s« versucht, eine von »%s« besessene Sperre im Dateisystem »%s« zu benutzen"
-#: ../include/svn_error_codes.h:164
+#: ../include/svn_error_codes.h:166
msgid "Bad parent pool passed to svn_make_pool()"
msgstr "Falscher Elternpool an svn_make_pool() übergeben"
-#: ../include/svn_error_codes.h:168
+#: ../include/svn_error_codes.h:170
msgid "Bogus filename"
msgstr "Ungültiger Dateiname"
-#: ../include/svn_error_codes.h:172
+#: ../include/svn_error_codes.h:174
msgid "Bogus URL"
msgstr "Ungültige URL"
-#: ../include/svn_error_codes.h:176
+#: ../include/svn_error_codes.h:178
msgid "Bogus date"
msgstr "Ungültiges Datum"
-#: ../include/svn_error_codes.h:180
+#: ../include/svn_error_codes.h:182
msgid "Bogus mime-type"
msgstr "Ungültiger Mime-Typ"
-#: ../include/svn_error_codes.h:190
+#: ../include/svn_error_codes.h:192
msgid "Wrong or unexpected property value"
msgstr "Falscher oder unerwarteter Eigenschaftswert"
-#: ../include/svn_error_codes.h:194
+#: ../include/svn_error_codes.h:196
msgid "Version file format not correct"
msgstr "Format der Versionsdatei nicht korrekt"
-#: ../include/svn_error_codes.h:198
+#: ../include/svn_error_codes.h:200
msgid "Path is not an immediate child of the specified directory"
msgstr "Pfad ist kein direktes Kind des spezifizierten Verzeichnisses"
-#: ../include/svn_error_codes.h:202
+#: ../include/svn_error_codes.h:204
msgid "Bogus UUID"
msgstr "Ungültige UUID"
-#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:944
+#: ../include/svn_error_codes.h:209 ../include/svn_error_codes.h:1026
msgid "Invalid configuration value"
msgstr "Ungültiger Konfigurationswert"
-#: ../include/svn_error_codes.h:211
+#: ../include/svn_error_codes.h:213
msgid "Bogus server specification"
msgstr "Falsche Serverangabe"
-#: ../include/svn_error_codes.h:215
+#: ../include/svn_error_codes.h:217
msgid "Unsupported checksum type"
msgstr "Nicht unterstützter Prüfsummentyp"
-#: ../include/svn_error_codes.h:219
+#: ../include/svn_error_codes.h:221
msgid "Invalid character in hex checksum"
msgstr "Ungültiges Zeichen in der Hex-Prüfsumme gefunden"
-#: ../include/svn_error_codes.h:224
+#: ../include/svn_error_codes.h:226
msgid "Unknown string value of token"
msgstr "Unbekannter Zeichenkettenwert für Sperrmarke"
-#: ../include/svn_error_codes.h:229
+#: ../include/svn_error_codes.h:231
msgid "Invalid changelist name"
msgstr "Ungültiger Name für Änderungsliste"
-#: ../include/svn_error_codes.h:234
+#: ../include/svn_error_codes.h:236
msgid "Invalid atomic"
msgstr "Ungültiges »atomic«"
-#: ../include/svn_error_codes.h:240
+#: ../include/svn_error_codes.h:241
+msgid "Invalid compression method"
+msgstr "Ungültige Komprimierungsmethode"
+
+#: ../include/svn_error_codes.h:247
msgid "No such XML tag attribute"
msgstr "Ein solches Attribut des XML-Tags existiert nicht"
-#: ../include/svn_error_codes.h:244
+#: ../include/svn_error_codes.h:251
msgid "<delta-pkg> is missing ancestry"
msgstr "<delta-pkg> fehlt die Herkunft"
-#: ../include/svn_error_codes.h:248
+#: ../include/svn_error_codes.h:255
msgid "Unrecognized binary data encoding; can't decode"
msgstr "Unbekannte binäre Datenkodierung, kann nicht entschlüsseln"
-#: ../include/svn_error_codes.h:252
+#: ../include/svn_error_codes.h:259
msgid "XML data was not well-formed"
msgstr "XML Daten nicht wohlgeformt"
-#: ../include/svn_error_codes.h:256
+#: ../include/svn_error_codes.h:263
msgid "Data cannot be safely XML-escaped"
msgstr "Daten können nicht sicher in XML eingebettet werden"
-#: ../include/svn_error_codes.h:262
+#: ../include/svn_error_codes.h:268
+msgid "Unexpected XML element found"
+msgstr "Unerwartetes XML-Element gefunden"
+
+#: ../include/svn_error_codes.h:274
msgid "Inconsistent line ending style"
msgstr "Stil für Zeilenende ist inkonsistent"
-#: ../include/svn_error_codes.h:266
+#: ../include/svn_error_codes.h:278
msgid "Unrecognized line ending style"
msgstr "Stil für Zeilenende nicht erkannt"
-#: ../include/svn_error_codes.h:271
+#: ../include/svn_error_codes.h:283
msgid "Line endings other than expected"
msgstr "Zeilenende anders als erwartet"
-#: ../include/svn_error_codes.h:275
+#: ../include/svn_error_codes.h:287
msgid "Ran out of unique names"
msgstr "Eindeutige Namen ausgegangen"
-#: ../include/svn_error_codes.h:280
+#: ../include/svn_error_codes.h:292
msgid "Framing error in pipe protocol"
msgstr "Rahmenfehler im »Pipe«-Protokoll"
-#: ../include/svn_error_codes.h:285
+#: ../include/svn_error_codes.h:297
msgid "Read error in pipe"
msgstr "Lesefehler in »Pipe«"
-#: ../include/svn_error_codes.h:289 ../libsvn_subr/cmdline.c:362
-#: ../libsvn_subr/cmdline.c:385 ../svn/util.c:569 ../svnlook/svnlook.c:2009
+#. is errno on POSIX
+#: ../include/svn_error_codes.h:301 ../libsvn_subr/cmdline.c:417
+#: ../libsvn_subr/cmdline.c:448 ../libsvn_subr/cmdline.c:471 ../svn/util.c:571
+#: ../svnlook/svnlook.c:2025
#, c-format
msgid "Write error"
msgstr "Schreibfehler"
-#: ../include/svn_error_codes.h:294
+#: ../include/svn_error_codes.h:306
msgid "Write error in pipe"
msgstr "Schreibfehler in »Pipe«"
-#: ../include/svn_error_codes.h:300
+#: ../include/svn_error_codes.h:312
msgid "Unexpected EOF on stream"
msgstr "Unerwartetes EOF im Datenstrom"
-#: ../include/svn_error_codes.h:304
+#: ../include/svn_error_codes.h:316
msgid "Malformed stream data"
msgstr "Fehlerhafter Datenstrom"
-#: ../include/svn_error_codes.h:308
+#: ../include/svn_error_codes.h:320
msgid "Unrecognized stream data"
msgstr "Unbekannter Datenstrom"
-#: ../include/svn_error_codes.h:313
+#: ../include/svn_error_codes.h:325
msgid "Stream doesn't support seeking"
msgstr "Datenstrom unterstützt das Setzen der Position nicht"
-#: ../include/svn_error_codes.h:319
+#: ../include/svn_error_codes.h:330
+msgid "Stream doesn't support this capability"
+msgstr "Datenstrom unterstützt diese Funktion nicht"
+
+#: ../include/svn_error_codes.h:336
msgid "Unknown svn_node_kind"
msgstr "Unbekannter svn_node_kind"
-#: ../include/svn_error_codes.h:323
+#: ../include/svn_error_codes.h:340
msgid "Unexpected node kind found"
msgstr "Unerwarteter Knotentyp gefunden"
-#: ../include/svn_error_codes.h:329
+#: ../include/svn_error_codes.h:346
msgid "Can't find an entry"
msgstr "Kann keinen Eintrag finden"
-#: ../include/svn_error_codes.h:335
+#: ../include/svn_error_codes.h:352
msgid "Entry already exists"
msgstr "Eintrag existiert bereits"
-#: ../include/svn_error_codes.h:339
+#: ../include/svn_error_codes.h:356
msgid "Entry has no revision"
msgstr "Eintrag hat keine Revision"
-#: ../include/svn_error_codes.h:343
+#: ../include/svn_error_codes.h:360
msgid "Entry has no URL"
msgstr "Eintrag hat keine URL"
-#: ../include/svn_error_codes.h:347
+#: ../include/svn_error_codes.h:364
msgid "Entry has an invalid attribute"
msgstr "Eintrag hat ein ungültiges Attribut"
-#: ../include/svn_error_codes.h:351
+#: ../include/svn_error_codes.h:368
msgid "Can't create an entry for a forbidden name"
msgstr "Kann keinen Eintrag für einen verbotenen Namen erzeugen"
-#: ../include/svn_error_codes.h:357
+#: ../include/svn_error_codes.h:374
msgid "Obstructed update"
msgstr "Aktualisierung behindert"
-#: ../include/svn_error_codes.h:362
+#: ../include/svn_error_codes.h:379
msgid "Mismatch popping the WC unwind stack"
msgstr "Fehler beim Abrufen des Abwicklungsstapels der Arbeitskopie"
-#: ../include/svn_error_codes.h:367
+#: ../include/svn_error_codes.h:384
msgid "Attempt to pop empty WC unwind stack"
msgstr "Versuch, leeren Abwicklungsstapel abzurufen"
-#: ../include/svn_error_codes.h:372
+#: ../include/svn_error_codes.h:389
msgid "Attempt to unlock with non-empty unwind stack"
msgstr "Versuch, mit nicht leerem Abwicklungsstapel zu entsperren"
-#: ../include/svn_error_codes.h:376
+#: ../include/svn_error_codes.h:393
msgid "Attempted to lock an already-locked dir"
msgstr "Versuch, ein bereits gesperrtes Verzeichnis erneut zu sperren"
-#: ../include/svn_error_codes.h:380
+#: ../include/svn_error_codes.h:397
msgid "Working copy not locked; this is probably a bug, please report"
msgstr "Arbeitskopie nicht gesperrt. Dies ist wahrscheinlich ein Fehler. Bitte melden."
-#: ../include/svn_error_codes.h:385
+#: ../include/svn_error_codes.h:402
msgid "Invalid lock"
msgstr "Ungültige Sperre"
-#: ../include/svn_error_codes.h:391 ../include/svn_error_codes.h:397
+#: ../include/svn_error_codes.h:408 ../include/svn_error_codes.h:414
msgid "Path is not a working copy directory"
msgstr "Pfad ist kein Verzeichnis in einer Arbeitskopie"
-#: ../include/svn_error_codes.h:401
+#: ../include/svn_error_codes.h:418
msgid "Path is not a working copy file"
msgstr "Pfad ist keine Datei in einer Arbeitskopie"
-#: ../include/svn_error_codes.h:405
+#: ../include/svn_error_codes.h:422
msgid "Problem running log"
msgstr "Problem während der Ausführung des Logs"
-#: ../include/svn_error_codes.h:409
+#: ../include/svn_error_codes.h:426
msgid "Can't find a working copy path"
msgstr "Kann keinen Arbeitskopiepfad finden"
-#: ../include/svn_error_codes.h:413
+#: ../include/svn_error_codes.h:430
msgid "Working copy is not up-to-date"
msgstr "Arbeitskopie ist nicht aktuell"
-#: ../include/svn_error_codes.h:417
+#: ../include/svn_error_codes.h:434
msgid "Left locally modified or unversioned files"
msgstr "Lokal veränderte oder nicht versionierte Dateien zurück gelassen"
-#: ../include/svn_error_codes.h:421
+#: ../include/svn_error_codes.h:438
msgid "Unmergeable scheduling requested on an entry"
msgstr "Nicht zusammenführbare Planungsanforderung für einen Eintrag"
-#: ../include/svn_error_codes.h:425
+#: ../include/svn_error_codes.h:442
msgid "Found a working copy path"
msgstr "Arbeitskopiepfad gefunden"
-#: ../include/svn_error_codes.h:429
+#: ../include/svn_error_codes.h:446
msgid "A conflict in the working copy obstructs the current operation"
msgstr "Ein Konflikt in der Arbeitskopie behindert die aktuelle Operation"
-#: ../include/svn_error_codes.h:433
+#: ../include/svn_error_codes.h:450
msgid "Working copy is corrupt"
msgstr "Arbeitskopie ist beschädigt"
-#: ../include/svn_error_codes.h:437
+#: ../include/svn_error_codes.h:454
msgid "Working copy text base is corrupt"
msgstr "Textbasis der Arbeitskopie ist beschädigt"
-#: ../include/svn_error_codes.h:441
+#: ../include/svn_error_codes.h:458
msgid "Cannot change node kind"
msgstr "Kann Knotentyp nicht ändern"
-#: ../include/svn_error_codes.h:445
+#: ../include/svn_error_codes.h:462
msgid "Invalid operation on the current working directory"
msgstr "Ungültige Operation auf dem aktuellen Arbeitsverzeichnis"
-#: ../include/svn_error_codes.h:449
+#: ../include/svn_error_codes.h:466
msgid "Problem on first log entry in a working copy"
msgstr "Problem mit dem ersten Log-Eintrag in einer Arbeitskopie"
-#: ../include/svn_error_codes.h:453
+#: ../include/svn_error_codes.h:470
msgid "Unsupported working copy format"
msgstr "Nicht unterstütztes Format der Arbeitskopie"
-#: ../include/svn_error_codes.h:457
+#: ../include/svn_error_codes.h:474
msgid "Path syntax not supported in this context"
msgstr "Pfadsyntax wird in diesem Zusammenhang nicht unterstützt"
-#: ../include/svn_error_codes.h:462
+#: ../include/svn_error_codes.h:479
msgid "Invalid schedule"
msgstr "Ungültiger Plan"
-#: ../include/svn_error_codes.h:467
+#: ../include/svn_error_codes.h:484
msgid "Invalid relocation"
msgstr "Ungültiges Umplatzieren"
-#: ../include/svn_error_codes.h:472
+#: ../include/svn_error_codes.h:489
msgid "Invalid switch"
msgstr "Ungültiges Wechseln"
-#: ../include/svn_error_codes.h:477
+#: ../include/svn_error_codes.h:494
msgid "Changelist doesn't match"
msgstr "Änderungsliste passt nicht"
-#: ../include/svn_error_codes.h:482
+#: ../include/svn_error_codes.h:499
msgid "Conflict resolution failed"
msgstr "Konfliktauflösung schlug fehl"
-#: ../include/svn_error_codes.h:486
+#: ../include/svn_error_codes.h:503
msgid "Failed to locate 'copyfrom' path in working copy"
msgstr "Pfad von »copyfrom« konnte in der Arbeitskopie nicht gefunden werden"
-#: ../include/svn_error_codes.h:494
+#: ../include/svn_error_codes.h:511
msgid "Moving a path from one changelist to another"
msgstr "Verschieben eines Pfades von einer Änderungsliste in eine andere"
-#: ../include/svn_error_codes.h:499
+#: ../include/svn_error_codes.h:516
msgid "Cannot delete a file external"
msgstr "Kann externen Dateiverweis nicht löschen"
-#: ../include/svn_error_codes.h:504
+#: ../include/svn_error_codes.h:521
msgid "Cannot move a file external"
msgstr "Kann externen Dateiverweis nicht verschieben"
-#: ../include/svn_error_codes.h:509
+#: ../include/svn_error_codes.h:526
msgid "Something's amiss with the wc sqlite database"
msgstr "Irgendetwas ist mit der sqlite-Datenbank der Arbeitskopie falsch"
-#: ../include/svn_error_codes.h:514
+#: ../include/svn_error_codes.h:531
msgid "The working copy is missing"
msgstr "Die Arbeitskopie fehlt"
-#: ../include/svn_error_codes.h:519
+#: ../include/svn_error_codes.h:536
msgid "The specified node is not a symlink"
msgstr "Der spezifizierte Knoten ist kein symbolischer Link"
-#: ../include/svn_error_codes.h:524
+#: ../include/svn_error_codes.h:541
msgid "The specified path has an unexpected status"
msgstr "Der angegebene Pfad hat einen unerwarteten Status"
-#: ../include/svn_error_codes.h:529
+#: ../include/svn_error_codes.h:546
msgid "The working copy needs to be upgraded"
msgstr "Die Arbeitskopie muss in ein neueres Format gebracht werden"
-#: ../include/svn_error_codes.h:534
+#: ../include/svn_error_codes.h:551
msgid "Previous operation has not finished; run 'cleanup' if it was interrupted"
msgstr "Die vorhergehende Operation wurde nicht abgeschlossen; Starten Sie »svn cleanup« falls sie unterbrochen wurde"
-#: ../include/svn_error_codes.h:540
+#: ../include/svn_error_codes.h:557
msgid "The operation cannot be performed with the specified depth"
msgstr "Diese Operation kann nicht mit der angegebenen Tiefe durch geführt werden."
-#: ../include/svn_error_codes.h:545
+#: ../include/svn_error_codes.h:562
msgid "Couldn't open a working copy file because access was denied"
msgstr "Konnte eine Datei der Arbeitskopie nicht öffnen, da der Zugriff verweigert wurde"
-#: ../include/svn_error_codes.h:550
+#: ../include/svn_error_codes.h:567
msgid "Mixed-revision working copy was found but not expected"
msgstr "Arbeitskopie mit verschiedenen Revisionen gefunden aber nicht erwartet"
-#: ../include/svn_error_codes.h:555
+#: ../include/svn_error_codes.h:572
msgid "Duplicate targets in svn:externals property"
msgstr "Doppelte Zielangaben in svn:externals Eigenschaft"
-#: ../include/svn_error_codes.h:561
+#: ../include/svn_error_codes.h:578
msgid "General filesystem error"
msgstr "Allgemeiner Dateisystemfehler"
-#: ../include/svn_error_codes.h:565
+#: ../include/svn_error_codes.h:582
msgid "Error closing filesystem"
msgstr "Fehler beim Schließen des Dateisystems"
-#: ../include/svn_error_codes.h:569
+#: ../include/svn_error_codes.h:586
msgid "Filesystem is already open"
msgstr "Dateisystem ist bereits geöffnet"
-#: ../include/svn_error_codes.h:573
+#: ../include/svn_error_codes.h:590
msgid "Filesystem is not open"
msgstr "Dateisystem ist nicht geöffnet"
-#: ../include/svn_error_codes.h:577
+#: ../include/svn_error_codes.h:594
msgid "Filesystem is corrupt"
msgstr "Dateisystem ist beschädigt"
-#: ../include/svn_error_codes.h:581
+#: ../include/svn_error_codes.h:598
msgid "Invalid filesystem path syntax"
msgstr "Ungültige Pfadsyntax des Dateisystems"
-#: ../include/svn_error_codes.h:585
+#: ../include/svn_error_codes.h:602
msgid "Invalid filesystem revision number"
msgstr "Ungültige Revisionsnummer des Dateisystems"
-#: ../include/svn_error_codes.h:589
+#: ../include/svn_error_codes.h:606
msgid "Invalid filesystem transaction name"
msgstr "Ungültiger Transaktionsname des Dateisystems"
-#: ../include/svn_error_codes.h:593
+#: ../include/svn_error_codes.h:610
msgid "Filesystem directory has no such entry"
msgstr "Verzeichnis des Dateisystems hat keinen solchen Eintrag"
-#: ../include/svn_error_codes.h:597
+#: ../include/svn_error_codes.h:614
msgid "Filesystem has no such representation"
msgstr "Dateisystem hat keine solche Darstellung"
-#: ../include/svn_error_codes.h:601
+#: ../include/svn_error_codes.h:618
msgid "Filesystem has no such string"
msgstr "Dateisystem hat keinen solchen String"
-#: ../include/svn_error_codes.h:605
+#: ../include/svn_error_codes.h:622
msgid "Filesystem has no such copy"
msgstr "Dateisystem hat keine solche Kopie"
-#: ../include/svn_error_codes.h:609
+#: ../include/svn_error_codes.h:626
msgid "The specified transaction is not mutable"
msgstr "Die spezifizierte Transaktion ist nicht veränderlich"
-#: ../include/svn_error_codes.h:613
+#: ../include/svn_error_codes.h:630
msgid "Filesystem has no item"
msgstr "Dateisystem hat keinen Eintrag"
-#: ../include/svn_error_codes.h:617
+#: ../include/svn_error_codes.h:634
msgid "Filesystem has no such node-rev-id"
msgstr "Dateisystem hat keine solche Knotenrevisions-Id"
-#: ../include/svn_error_codes.h:621
+#: ../include/svn_error_codes.h:638
msgid "String does not represent a node or node-rev-id"
msgstr "Zeichenkette stellt keinen Knoten oder keine Knotenrevisions-Id dar"
-#: ../include/svn_error_codes.h:625
+#: ../include/svn_error_codes.h:642
msgid "Name does not refer to a filesystem directory"
msgstr "Name bezeichnet kein Verzeichnis des Dateisystems"
-#: ../include/svn_error_codes.h:629
+#: ../include/svn_error_codes.h:646
msgid "Name does not refer to a filesystem file"
msgstr "Name bezeichnet keine Datei des Dateisystems"
-#: ../include/svn_error_codes.h:633
+#: ../include/svn_error_codes.h:650
msgid "Name is not a single path component"
msgstr "Name ist keine einzelne Pfadkomponente"
-#: ../include/svn_error_codes.h:637
+#: ../include/svn_error_codes.h:654
msgid "Attempt to change immutable filesystem node"
msgstr "Versuch, einen nicht-veränderlichen Knoten des Dateisystems zu ändern"
-#: ../include/svn_error_codes.h:641
+#: ../include/svn_error_codes.h:658
msgid "Item already exists in filesystem"
msgstr "Objekt existiert bereits im Dateisystem"
-#: ../include/svn_error_codes.h:645
+#: ../include/svn_error_codes.h:662
msgid "Attempt to remove or recreate fs root dir"
msgstr "Versuch, Basisverzeichnis des Dateisystems zu entfernen oder neu zu erstellen"
-#: ../include/svn_error_codes.h:649
+#: ../include/svn_error_codes.h:666
msgid "Object is not a transaction root"
msgstr "Objekt ist keine Transaktionsbasis"
-#: ../include/svn_error_codes.h:653
+#: ../include/svn_error_codes.h:670
msgid "Object is not a revision root"
msgstr "Objekt ist keine Revisionsbasis"
-#: ../include/svn_error_codes.h:657
+#: ../include/svn_error_codes.h:674
msgid "Merge conflict during commit"
msgstr "Konflikt beim Zusammenführen während der Übertragung"
-#: ../include/svn_error_codes.h:661
+#: ../include/svn_error_codes.h:678
msgid "A representation vanished or changed between reads"
msgstr "Eine Darstellung ist zwischen Lesezugriffen verschwunden oder hat sich verändert"
-#: ../include/svn_error_codes.h:665
+#: ../include/svn_error_codes.h:682
msgid "Tried to change an immutable representation"
msgstr "Versuchte, eine nicht-veränderliche Darstellung zu ändern"
-#: ../include/svn_error_codes.h:669
+#: ../include/svn_error_codes.h:686
msgid "Malformed skeleton data"
msgstr "Fehlerhafte Skeletondaten"
-#: ../include/svn_error_codes.h:673
+#: ../include/svn_error_codes.h:690
msgid "Transaction is out of date"
msgstr "Transaktion ist veraltet"
-#: ../include/svn_error_codes.h:677
+#: ../include/svn_error_codes.h:694
msgid "Berkeley DB error"
msgstr "Berkeley-DB-Fehler"
-#: ../include/svn_error_codes.h:681
+#: ../include/svn_error_codes.h:698
msgid "Berkeley DB deadlock error"
msgstr "Deadlock-Fehler der Berkeley Datenbank"
-#: ../include/svn_error_codes.h:685
+#: ../include/svn_error_codes.h:702
msgid "Transaction is dead"
msgstr "Transaktion ist tot"
-#: ../include/svn_error_codes.h:689
+#: ../include/svn_error_codes.h:706
msgid "Transaction is not dead"
msgstr "Transaktion ist nicht tot"
-#: ../include/svn_error_codes.h:694
+#: ../include/svn_error_codes.h:711
msgid "Unknown FS type"
msgstr "Unbekannter Dateisystemtyp"
-#: ../include/svn_error_codes.h:699
+#: ../include/svn_error_codes.h:716
msgid "No user associated with filesystem"
msgstr "Kein Benutzer mit dem Dateisystem verbunden"
-#: ../include/svn_error_codes.h:704
+#: ../include/svn_error_codes.h:721
msgid "Path is already locked"
msgstr "Pfad ist bereits gesperrt"
-#: ../include/svn_error_codes.h:709 ../include/svn_error_codes.h:886
+#: ../include/svn_error_codes.h:726 ../include/svn_error_codes.h:963
msgid "Path is not locked"
msgstr "Pfad ist nicht gesperrt"
-#: ../include/svn_error_codes.h:714
+#: ../include/svn_error_codes.h:731
msgid "Lock token is incorrect"
msgstr "Sperrmarke ist fehlerhaft"
-#: ../include/svn_error_codes.h:719
+#: ../include/svn_error_codes.h:736
msgid "No lock token provided"
msgstr "Keine Sperrmarke angegeben"
-#: ../include/svn_error_codes.h:724
+#: ../include/svn_error_codes.h:741
msgid "Username does not match lock owner"
msgstr "Benutzername und Sperreigner stimmen nicht überein"
-#: ../include/svn_error_codes.h:729
+#: ../include/svn_error_codes.h:746
msgid "Filesystem has no such lock"
msgstr "Dateisystem hat keine solche Sperre"
-#: ../include/svn_error_codes.h:734
+#: ../include/svn_error_codes.h:751
msgid "Lock has expired"
msgstr "Sperre ist abgelaufen"
-#: ../include/svn_error_codes.h:739 ../include/svn_error_codes.h:873
+#: ../include/svn_error_codes.h:756 ../include/svn_error_codes.h:950
msgid "Item is out of date"
msgstr "Eintrag ist veraltet"
-#: ../include/svn_error_codes.h:751
+#: ../include/svn_error_codes.h:768
msgid "Unsupported FS format"
msgstr "Nicht unterstütztes Dateisystemformat"
-#: ../include/svn_error_codes.h:756
+#: ../include/svn_error_codes.h:773
msgid "Representation is being written"
msgstr "Darstellung wird geschrieben"
-#: ../include/svn_error_codes.h:761
+#: ../include/svn_error_codes.h:778
msgid "The generated transaction name is too long"
msgstr "Der erzeugte Transaktionsname ist zu lang"
-#: ../include/svn_error_codes.h:766
+#: ../include/svn_error_codes.h:783
msgid "Filesystem has no such node origin record"
msgstr "Dateisystem hat keinen solchen Knotenursprungsdatensatz"
-#: ../include/svn_error_codes.h:771
+#: ../include/svn_error_codes.h:788
msgid "Filesystem upgrade is not supported"
msgstr "Dateisystemaktualisierung wird nicht unterstützt"
-#: ../include/svn_error_codes.h:776
+#: ../include/svn_error_codes.h:793
msgid "Filesystem has no such checksum-representation index record"
msgstr "Dateisystem hat keinen solchen Indexdatensatz zur Prüfsummen-Repräsentation"
-#: ../include/svn_error_codes.h:781
+#: ../include/svn_error_codes.h:798
msgid "Property value in filesystem differs from the provided base value"
msgstr "Eigenschaftswert im Dateisystem weicht von dem angegebenen Basiswert ab"
-#: ../include/svn_error_codes.h:787
+#: ../include/svn_error_codes.h:804
msgid "The filesystem editor completion process was not followed"
msgstr "Der Prozess für den Abschluss von Bearbeitungen des Dateisystems wurde nicht befolgt"
-#: ../include/svn_error_codes.h:792
+#: ../include/svn_error_codes.h:809
msgid "A packed revprop could not be read"
msgstr "Eine gepackte Revisionseigenschaft konnte nicht gelesen werden"
-#: ../include/svn_error_codes.h:797
+#: ../include/svn_error_codes.h:814
msgid "Could not initialize the revprop caching infrastructure."
msgstr "Konnte Zwischenspeicher für Revisionseigenschaften nicht initialisieren"
-#: ../include/svn_error_codes.h:803
+#: ../include/svn_error_codes.h:819
+msgid "Malformed transaction ID string."
+msgstr "Fehlerhafte Zeichenkette für Transaktions-ID."
+
+#: ../include/svn_error_codes.h:824
+msgid "Corrupt index file."
+msgstr "Beschädigte Indexdatei."
+
+#: ../include/svn_error_codes.h:829
+msgid "Revision not covered by index."
+msgstr "Revision ist nicht im Index enthalten."
+
+#: ../include/svn_error_codes.h:834
+msgid "Item index too large for this revision."
+msgstr "Elementindex zu groß für diese Revision."
+
+#: ../include/svn_error_codes.h:839
+msgid "Container index out of range."
+msgstr "Containerindex außerhalb des zulässigen Bereichs."
+
+#: ../include/svn_error_codes.h:844
+msgid "Index files are inconsistent."
+msgstr "Indexdateien sind inkonsistent."
+
+#: ../include/svn_error_codes.h:849
+msgid "Lock operation failed"
+msgstr "Sperrvorgang schlug fehl"
+
+#: ../include/svn_error_codes.h:854
+msgid "Unsupported FS type"
+msgstr "Nicht unterstützter Dateisystemtyp"
+
+#: ../include/svn_error_codes.h:859
+msgid "Container capacity exceeded."
+msgstr "Kapazität des Containerindex überschritten."
+
+#: ../include/svn_error_codes.h:864
+msgid "Malformed node revision ID string."
+msgstr "Fehlerhafte Zeichenkette für Knotenrevisions-ID."
+
+#: ../include/svn_error_codes.h:869 ../libsvn_fs_x/revprops.c:291
+msgid "Invalid generation number data."
+msgstr "Ungültige Daten für Generationsnummer."
+
+#: ../include/svn_error_codes.h:875
msgid "The repository is locked, perhaps for db recovery"
msgstr "Das Projektarchiv ist gesperrt, möglicherweise zum Retten der Datenbank"
-#: ../include/svn_error_codes.h:807
+#: ../include/svn_error_codes.h:879
msgid "A repository hook failed"
msgstr "Eine Aktion im Projektarchiv schlug fehl"
-#: ../include/svn_error_codes.h:811
+#: ../include/svn_error_codes.h:883
msgid "Incorrect arguments supplied"
msgstr "Inkorrekte Parameter übergeben"
-#: ../include/svn_error_codes.h:815
+#: ../include/svn_error_codes.h:887
msgid "A report cannot be generated because no data was supplied"
msgstr "Es kann kein Report erzeugt werden, da keine Daten geliefert wurden"
-#: ../include/svn_error_codes.h:819
+#: ../include/svn_error_codes.h:891
msgid "Bogus revision report"
msgstr "Ungültiger Revisionsreport"
-#: ../include/svn_error_codes.h:828
+#: ../include/svn_error_codes.h:900
msgid "Unsupported repository version"
msgstr "Nicht unterstützte Version des Projektarchivs"
-#: ../include/svn_error_codes.h:832
+#: ../include/svn_error_codes.h:904
msgid "Disabled repository feature"
msgstr "Deaktiviertes Merkmal des Projektarchivs"
-#: ../include/svn_error_codes.h:836
+#: ../include/svn_error_codes.h:908
msgid "Error running post-commit hook"
msgstr "Fehler beim Ausführen der Aktion »post-commit«"
-#: ../include/svn_error_codes.h:841
+#: ../include/svn_error_codes.h:913
msgid "Error running post-lock hook"
msgstr "Fehler beim Ausführen der Aktion »post-lock«"
-#: ../include/svn_error_codes.h:846
+#: ../include/svn_error_codes.h:918
msgid "Error running post-unlock hook"
msgstr "Fehler beim Ausführen der Aktion »post-unlock«"
-#: ../include/svn_error_codes.h:851
+#: ../include/svn_error_codes.h:923
msgid "Repository upgrade is not supported"
msgstr "Projektarchivaktualisierung wird nicht unterstützt"
-#: ../include/svn_error_codes.h:857
+#: ../include/svn_error_codes.h:928
+msgid "Repository is corrupt"
+msgstr "Projektarchiv ist beschädigt"
+
+#: ../include/svn_error_codes.h:934
msgid "Bad URL passed to RA layer"
msgstr "Ungültige URL an die ZM-Schicht übergeben"
-#: ../include/svn_error_codes.h:861
+#: ../include/svn_error_codes.h:938
msgid "Authorization failed"
msgstr "Autorisierung schlug fehl"
-#: ../include/svn_error_codes.h:865
+#: ../include/svn_error_codes.h:942
msgid "Unknown authorization method"
msgstr "Unbekannte Autorisierungsmethode"
-#: ../include/svn_error_codes.h:869
+#: ../include/svn_error_codes.h:946
msgid "Repository access method not implemented"
msgstr "Zugriffsmethode zum Projektarchiv nicht implementiert"
-#: ../include/svn_error_codes.h:877
+#: ../include/svn_error_codes.h:954
msgid "Repository has no UUID"
msgstr "Projektarchiv hat keine UUID"
-#: ../include/svn_error_codes.h:881
+#: ../include/svn_error_codes.h:958
msgid "Unsupported RA plugin ABI version"
msgstr "Nicht unterstützte ABI-Version des ZM-Plugins"
-#: ../include/svn_error_codes.h:891
+#: ../include/svn_error_codes.h:968
msgid "Server can only replay from the root of a repository"
msgstr "Der Server kann nur von der Basis des Projektarchivs fortfahren"
-#: ../include/svn_error_codes.h:896
+#: ../include/svn_error_codes.h:973
msgid "Repository UUID does not match expected UUID"
msgstr "Die UUID des Projektarchivs entspricht nicht der erwarteten UUID"
-#: ../include/svn_error_codes.h:901
+#: ../include/svn_error_codes.h:978
msgid "Repository root URL does not match expected root URL"
msgstr "Die URL der Projektarchivwurzel entspricht nicht der erwarteten Wurzel-URL"
-#: ../include/svn_error_codes.h:906
+#: ../include/svn_error_codes.h:983
msgid "Session URL does not match expected session URL"
msgstr "Die Sitzungs-URL entspricht nicht der erwarteten Sitzungs-URL"
-#: ../include/svn_error_codes.h:911 ../libsvn_ra_svn/client.c:492
+#: ../include/svn_error_codes.h:988 ../libsvn_ra_svn/client.c:503
#, c-format
msgid "Can't create tunnel"
msgstr "Kann Tunnel nicht erzeugen"
-#: ../include/svn_error_codes.h:917
+#: ../include/svn_error_codes.h:993
+msgid "Can't create session"
+msgstr "Kann Sitzung nicht erzeugen"
+
+#: ../include/svn_error_codes.h:999
msgid "RA layer failed to init socket layer"
msgstr "ZM-Schicht konnte die Verbindungsschicht nicht initialisieren"
-#: ../include/svn_error_codes.h:921
+#: ../include/svn_error_codes.h:1003
msgid "RA layer failed to create HTTP request"
msgstr "ZM-Schicht konnte keine HTTP-Anforderung erzeugen"
-#: ../include/svn_error_codes.h:925
+#: ../include/svn_error_codes.h:1007
msgid "RA layer request failed"
msgstr "ZM-Schicht Anforderung gescheitert"
-#: ../include/svn_error_codes.h:929
+#: ../include/svn_error_codes.h:1011
msgid "RA layer didn't receive requested OPTIONS info"
msgstr "ZM-Schicht hat die angeforderte OPTIONS-Information nicht erhalten"
-#: ../include/svn_error_codes.h:933
+#: ../include/svn_error_codes.h:1015
msgid "RA layer failed to fetch properties"
msgstr "ZM-Schicht konnte keine Eigenschaften bestimmen"
-#: ../include/svn_error_codes.h:937
+#: ../include/svn_error_codes.h:1019
msgid "RA layer file already exists"
msgstr "ZM-Schichtdatei existiert bereits"
-#: ../include/svn_error_codes.h:951
+#: ../include/svn_error_codes.h:1033
msgid "HTTP Path Not Found"
msgstr "HTTP Pfad nicht gefunden"
-#: ../include/svn_error_codes.h:955
+#: ../include/svn_error_codes.h:1037
msgid "Failed to execute WebDAV PROPPATCH"
msgstr "Konnte WebDAV PROPPATCH nicht ausführen"
-#: ../include/svn_error_codes.h:960 ../include/svn_error_codes.h:1403
-#: ../libsvn_ra_svn/marshal.c:1075 ../libsvn_ra_svn/marshal.c:1285
-#: ../libsvn_ra_svn/marshal.c:1315
+#. If condition COND is not met, return a "malformed network data" error.
+#.
+#: ../include/svn_error_codes.h:1042 ../include/svn_error_codes.h:1520
+#: ../libsvn_ra_svn/marshal.c:1129 ../libsvn_ra_svn/marshal.c:1381
+#: ../libsvn_ra_svn/marshal.c:1411 ../libsvn_ra_svn/marshal.c:2495
msgid "Malformed network data"
msgstr "Fehlerhafte Netzwerkdaten"
-#: ../include/svn_error_codes.h:965
+#: ../include/svn_error_codes.h:1047
msgid "Unable to extract data from response header"
msgstr "Kann keine Daten aus dem Antwortkopf extrahieren"
-#: ../include/svn_error_codes.h:970
+#: ../include/svn_error_codes.h:1052
msgid "Repository has been moved"
msgstr "Projektarchiv wurde verschoben"
-#: ../include/svn_error_codes.h:975 ../libsvn_ra_serf/update.c:2863
-#: ../libsvn_ra_serf/util.c:944
+#: ../include/svn_error_codes.h:1057 ../libsvn_ra_serf/util.c:893
msgid "Connection timed out"
msgstr "Die Wartezeit für die Verbindung ist abgelaufen"
-#: ../include/svn_error_codes.h:980
+#: ../include/svn_error_codes.h:1062
msgid "URL access forbidden for unknown reason"
msgstr "URL-Zugriff wegen unbekannter Ursache verboten"
-#: ../include/svn_error_codes.h:986 ../include/svn_error_codes.h:1407
+#: ../include/svn_error_codes.h:1067
+msgid "The server state conflicts with the requested preconditions"
+msgstr "Der Serverzustand steht im Konflikt mit den angeforderten Vorbedingungen"
+
+#: ../include/svn_error_codes.h:1072
+msgid "The URL doesn't allow the requested method"
+msgstr "Die URL erlaubt die angeforderte Methode nicht"
+
+#: ../include/svn_error_codes.h:1078 ../include/svn_error_codes.h:1524
msgid "Couldn't find a repository"
msgstr "Konnte Projektarchiv nicht finden"
-#: ../include/svn_error_codes.h:990
+#: ../include/svn_error_codes.h:1082
msgid "Couldn't open a repository"
msgstr "Konnte Projektarchiv nicht öffnen"
-#: ../include/svn_error_codes.h:996
+#: ../include/svn_error_codes.h:1088
msgid "Svndiff data has invalid header"
msgstr "Svndiff-Daten enthalten ungültigen Kopf"
-#: ../include/svn_error_codes.h:1000
+#: ../include/svn_error_codes.h:1092
msgid "Svndiff data contains corrupt window"
msgstr "Svndiff-Daten enthalten defektes Fenster"
-#: ../include/svn_error_codes.h:1004
+#: ../include/svn_error_codes.h:1096
msgid "Svndiff data contains backward-sliding source view"
msgstr "Svndiff-Daten enthalten rückwärts gleitenden Blick auf Quellen"
-#: ../include/svn_error_codes.h:1008
+#: ../include/svn_error_codes.h:1100
msgid "Svndiff data contains invalid instruction"
msgstr "Svndiff-Daten enthalten ungültige Anweisung"
-#: ../include/svn_error_codes.h:1012
+#: ../include/svn_error_codes.h:1104
msgid "Svndiff data ends unexpectedly"
msgstr "Svndiff-Daten enden unerwartet"
-#: ../include/svn_error_codes.h:1016
+#: ../include/svn_error_codes.h:1108
msgid "Svndiff compressed data is invalid"
msgstr "Komprimierte svndiff-Daten sind ungültig"
-#: ../include/svn_error_codes.h:1022
+#: ../include/svn_error_codes.h:1114
msgid "Apache has no path to an SVN filesystem"
msgstr "Apache besitzt keinen Pfad zu einem SVN Dateisystem"
-#: ../include/svn_error_codes.h:1026
+#: ../include/svn_error_codes.h:1118
msgid "Apache got a malformed URI"
msgstr "Apache hat eine fehlerhafte URI erhalten"
-#: ../include/svn_error_codes.h:1030
+#: ../include/svn_error_codes.h:1122
msgid "Activity not found"
msgstr "Aktivität nicht gefunden"
-#: ../include/svn_error_codes.h:1034
+#: ../include/svn_error_codes.h:1126
msgid "Baseline incorrect"
msgstr "»Baseline« nicht korrekt"
-#: ../include/svn_error_codes.h:1038
+#: ../include/svn_error_codes.h:1130
msgid "Input/output error"
msgstr "Eingabe/Ausgabe Fehler"
-#: ../include/svn_error_codes.h:1044
+#: ../include/svn_error_codes.h:1136
msgid "A path under version control is needed for this operation"
msgstr "Für diese Operation wird ein Pfad unter Versionskontrolle benötigt"
-#: ../include/svn_error_codes.h:1048
+#: ../include/svn_error_codes.h:1140
msgid "Repository access is needed for this operation"
msgstr "Für diese Operation wird Zugang zum Projektarchiv benötigt"
-#: ../include/svn_error_codes.h:1052
+#: ../include/svn_error_codes.h:1144
msgid "Bogus revision information given"
msgstr "Falsche Revisionsinformation angegeben"
-#: ../include/svn_error_codes.h:1056
+#: ../include/svn_error_codes.h:1148
msgid "Attempting to commit to a URL more than once"
msgstr "Versuch, mehrfach zu einer URL zu übertragen"
-#: ../include/svn_error_codes.h:1060
+#: ../include/svn_error_codes.h:1152
msgid "Operation does not apply to binary file"
msgstr "Operation ist nicht auf einer Binärdatei ausführbar"
-#: ../include/svn_error_codes.h:1066
+#: ../include/svn_error_codes.h:1158
msgid "Format of an svn:externals property was invalid"
msgstr "Format einer svn:externals Eigenschaft war ungültig"
-#: ../include/svn_error_codes.h:1070
+#: ../include/svn_error_codes.h:1162
msgid "Attempting restricted operation for modified resource"
msgstr "Versuch, eine beschränkte Operation für veränderte Ressource auszuführen"
-#: ../include/svn_error_codes.h:1074
+#: ../include/svn_error_codes.h:1166
msgid "Operation does not apply to directory"
msgstr "Operation ist nicht auf einem Verzeichnis ausführbar"
-#: ../include/svn_error_codes.h:1078
+#: ../include/svn_error_codes.h:1170
msgid "Revision range is not allowed"
msgstr "Revisionsbereich nicht erlaubt"
-#: ../include/svn_error_codes.h:1082
+#: ../include/svn_error_codes.h:1174
msgid "Inter-repository relocation not allowed"
msgstr "Umplatzieren innerhalb des Projektarchivs nicht erlaubt"
-#: ../include/svn_error_codes.h:1086
+#: ../include/svn_error_codes.h:1178
msgid "Author name cannot contain a newline"
msgstr "Autorenname darf keinen Zeilenumbruch enthalten"
-#: ../include/svn_error_codes.h:1090
+#: ../include/svn_error_codes.h:1182
msgid "Bad property name"
msgstr "Fehlerhafter Eigenschaftsname"
-#: ../include/svn_error_codes.h:1095
+#: ../include/svn_error_codes.h:1187
msgid "Two versioned resources are unrelated"
msgstr "Zwei versionierte Ressourcen sind nicht verwandt"
-#: ../include/svn_error_codes.h:1100
+#: ../include/svn_error_codes.h:1192
msgid "Path has no lock token"
msgstr "Pfad hat keine Sperrmarke"
-#: ../include/svn_error_codes.h:1105
+#: ../include/svn_error_codes.h:1197
msgid "Operation does not support multiple sources"
msgstr "Die Operation unterstützt nicht mehrere Quellen"
-#: ../include/svn_error_codes.h:1110
+#: ../include/svn_error_codes.h:1202
msgid "No versioned parent directories"
msgstr "Keine versionierten Elternverzeichnisse"
-#: ../include/svn_error_codes.h:1115 ../include/svn_error_codes.h:1135
+#: ../include/svn_error_codes.h:1207 ../include/svn_error_codes.h:1227
msgid "Working copy and merge source not ready for reintegration"
msgstr "Arbeitskopie und Zusammnführungsquelle sind für eine Reintegration nicht bereit"
-#: ../include/svn_error_codes.h:1120
+#: ../include/svn_error_codes.h:1212
msgid "A file external cannot overwrite an existing versioned item"
msgstr "Ein externer Dateiverweis kann kein existierendes versioniertes Objekt überschreiben"
-#: ../include/svn_error_codes.h:1125
+#: ../include/svn_error_codes.h:1217
msgid "Invalid path component strip count specified"
msgstr "Ungültige Anzahl der vom Pfad zu entfernenden Komponenten angegeben"
-#: ../include/svn_error_codes.h:1130
+#: ../include/svn_error_codes.h:1222
msgid "Detected a cycle while processing the operation"
msgstr "Endlosschleife während der Verarbeitung der Operation entdeckt"
-#: ../include/svn_error_codes.h:1140
+#: ../include/svn_error_codes.h:1232
msgid "Invalid mergeinfo detected in merge target"
msgstr "Ungültige Zusammenführungsinformationen in Zusammenführungsziel entdeckt"
-#: ../include/svn_error_codes.h:1145
+#: ../include/svn_error_codes.h:1237
msgid "Can't perform this operation without a valid lock token"
msgstr "Kann diese Operation nicht ohne eine gültige Sperrmarke ausführen"
-#: ../include/svn_error_codes.h:1150
+#: ../include/svn_error_codes.h:1242
msgid "The operation is forbidden by the server"
msgstr "Die Operation wurde durch den Server nicht zugelassen"
-#: ../include/svn_error_codes.h:1156
+#: ../include/svn_error_codes.h:1248
msgid "A problem occurred; see other errors for details"
msgstr "Ein Problem ist aufgetreten, für Details siehe andere Fehlermeldungen"
-#: ../include/svn_error_codes.h:1160
+#: ../include/svn_error_codes.h:1252
msgid "Failure loading plugin"
msgstr "Fehler beim Laden eines Plugins"
-#: ../include/svn_error_codes.h:1164
+#: ../include/svn_error_codes.h:1256
msgid "Malformed file"
msgstr "Fehlerhafte Datei"
-#: ../include/svn_error_codes.h:1168
+#: ../include/svn_error_codes.h:1260
msgid "Incomplete data"
msgstr "Unvollständige Daten"
-#: ../include/svn_error_codes.h:1172
+#: ../include/svn_error_codes.h:1264
msgid "Incorrect parameters given"
msgstr "Inkorrekte Parameter übergeben"
-#: ../include/svn_error_codes.h:1176
+#: ../include/svn_error_codes.h:1268
msgid "Tried a versioning operation on an unversioned resource"
msgstr "Versuchte, eine Versionsoperation auf nicht versionierter Ressource auszuführen"
-#: ../include/svn_error_codes.h:1180
+#: ../include/svn_error_codes.h:1272
msgid "Test failed"
msgstr "Test schlug fehl"
-#: ../include/svn_error_codes.h:1184
+#: ../include/svn_error_codes.h:1276
msgid "Trying to use an unsupported feature"
msgstr "Versuch, ein nicht unterstütztes Merkmal zu benutzen"
-#: ../include/svn_error_codes.h:1188
+#: ../include/svn_error_codes.h:1280
msgid "Unexpected or unknown property kind"
msgstr "Unerwartete oder unbekannte Eigenschaftsart"
-#: ../include/svn_error_codes.h:1192
+#: ../include/svn_error_codes.h:1284
msgid "Illegal target for the requested operation"
msgstr "Ungültiges Ziel für die angeforderte Operation"
-#: ../include/svn_error_codes.h:1196
+#: ../include/svn_error_codes.h:1288
msgid "MD5 checksum is missing"
msgstr "MD5 Prüfsumme fehlt"
-#: ../include/svn_error_codes.h:1200
+#: ../include/svn_error_codes.h:1292
msgid "Directory needs to be empty but is not"
msgstr "Das Verzeichnis muss leer sein, ist es aber nicht"
-#: ../include/svn_error_codes.h:1204
+#: ../include/svn_error_codes.h:1296
msgid "Error calling external program"
msgstr "Fehler beim Aufrufen eines externen Programmes"
-#: ../include/svn_error_codes.h:1208
+#: ../include/svn_error_codes.h:1300
msgid "Python exception has been set with the error"
msgstr "Eine Python-Ausnahme wurde mit dem Fehler gesetzt"
-#: ../include/svn_error_codes.h:1212
+#: ../include/svn_error_codes.h:1304
msgid "A checksum mismatch occurred"
msgstr "Ein Prüfsummenfehler ist aufgetreten"
-#: ../include/svn_error_codes.h:1216
+#: ../include/svn_error_codes.h:1308
msgid "The operation was interrupted"
msgstr "Die Operation wurde unterbrochen"
-#: ../include/svn_error_codes.h:1220
+#: ../include/svn_error_codes.h:1312
msgid "The specified diff option is not supported"
msgstr "Die angegebene Vergleichsoption wird nicht unterstützt"
-#: ../include/svn_error_codes.h:1224
+#: ../include/svn_error_codes.h:1316
msgid "Property not found"
msgstr "Eigenschaft nicht gefunden"
-#: ../include/svn_error_codes.h:1228
+#: ../include/svn_error_codes.h:1320
msgid "No auth file path available"
msgstr "Kein Pfad für die Anmeldedatei verfügbar"
-#: ../include/svn_error_codes.h:1233
+#: ../include/svn_error_codes.h:1325
msgid "Incompatible library version"
msgstr "Inkompatible Bibliotheksversion"
-#: ../include/svn_error_codes.h:1238
+#: ../include/svn_error_codes.h:1330
msgid "Mergeinfo parse error"
msgstr "Einlesefehler für Zusammenführungsinformationen"
-#: ../include/svn_error_codes.h:1243
+#: ../include/svn_error_codes.h:1335
msgid "Cease invocation of this API"
msgstr "Einstellen der Benutzung dieser API"
-#: ../include/svn_error_codes.h:1248
+#: ../include/svn_error_codes.h:1340
msgid "Error parsing revision number"
msgstr "Fehler beim Einlesen der Revisionsnummer"
-#: ../include/svn_error_codes.h:1253
+#: ../include/svn_error_codes.h:1345
msgid "Iteration terminated before completion"
msgstr "Iteration brach vor der Fertigstellung ab"
-#: ../include/svn_error_codes.h:1258
+#: ../include/svn_error_codes.h:1350
msgid "Unknown changelist"
msgstr "Unbekannte Änderungsliste"
-#: ../include/svn_error_codes.h:1263
+#: ../include/svn_error_codes.h:1355
msgid "Reserved directory name in command line arguments"
msgstr "Kommandozeilenparameter enthalten reservierten Verzeichnisnamen"
-#: ../include/svn_error_codes.h:1268
+#: ../include/svn_error_codes.h:1360
msgid "Inquiry about unknown capability"
msgstr "Nachfrage nach unbekannter Eigenschaft"
-#: ../include/svn_error_codes.h:1273
+#: ../include/svn_error_codes.h:1365
msgid "Test skipped"
msgstr "Test übersprungen"
-#: ../include/svn_error_codes.h:1278
+#: ../include/svn_error_codes.h:1370
msgid "APR memcache library not available"
msgstr "Die APR-memcache-Bibliothek ist nicht verfügbar"
-#: ../include/svn_error_codes.h:1283
+#: ../include/svn_error_codes.h:1375
msgid "Couldn't perform atomic initialization"
msgstr "Eine atomare Initialisierung konnte nicht durchgeführt werden"
-#: ../include/svn_error_codes.h:1288
+#: ../include/svn_error_codes.h:1380
msgid "SQLite error"
msgstr "SQLite-Fehler"
-#: ../include/svn_error_codes.h:1293
+#: ../include/svn_error_codes.h:1385
msgid "Attempted to write to readonly SQLite db"
msgstr "Versuch, in eine nur lesbare SQLite-Datenbank zu schreiben"
-#: ../include/svn_error_codes.h:1300
+#: ../include/svn_error_codes.h:1392
msgid "Unsupported schema found in SQLite db"
msgstr "Nicht unterstütztes Schema in SQLite-Datenbank gefunden"
-#: ../include/svn_error_codes.h:1305
+#: ../include/svn_error_codes.h:1397
msgid "The SQLite db is busy"
msgstr "Die SQLite-Datenbank ist beschäftigt"
-#: ../include/svn_error_codes.h:1310
+#: ../include/svn_error_codes.h:1402
msgid "SQLite busy at transaction rollback; resetting all busy SQLite statements to allow rollback"
msgstr "SQLite ist mit dem Rollback einer Transaktion beschäftigt; Alle SQLite-Anweisungen werden für Rollback zurückgesetzt"
-#: ../include/svn_error_codes.h:1316
+#: ../include/svn_error_codes.h:1408
msgid "Constraint error in SQLite db"
msgstr "Constraint-Fehler in SQLite-Datenbank"
-#: ../include/svn_error_codes.h:1321
+#: ../include/svn_error_codes.h:1413
msgid "Too many memcached servers configured"
msgstr "Zu viele memcached-Server konfiguriert"
-#: ../include/svn_error_codes.h:1326
+#: ../include/svn_error_codes.h:1418
msgid "Failed to parse version number string"
msgstr "Konnte Zeichenkette mit Versionsnummer nicht verarbeiten"
-#: ../include/svn_error_codes.h:1331
+#: ../include/svn_error_codes.h:1423
msgid "Atomic data storage is corrupt"
msgstr "Speicherbereich für »atomic« ist beschädigt"
-#: ../include/svn_error_codes.h:1337
+#: ../include/svn_error_codes.h:1428
+msgid "utf8proc library error"
+msgstr "Fehler in utf8proc-Bibliothek"
+
+#: ../include/svn_error_codes.h:1433
+msgid "Bad arguments to SQL operators GLOB or LIKE"
+msgstr "Fehlerhafte Parameter für SQL-Operatoren GLOB oder LIKE"
+
+#: ../include/svn_error_codes.h:1438
+msgid "Packed data stream is corrupt"
+msgstr "Komprimierter Datenstrom ist beschädigt"
+
+#: ../include/svn_error_codes.h:1443
+msgid "Additional errors:"
+msgstr "Zusätzliche Fehler:"
+
+#: ../include/svn_error_codes.h:1448
+msgid "Parser error: invalid input"
+msgstr "Formatfehler: ungültige Eingabe"
+
+#: ../include/svn_error_codes.h:1454
msgid "Error parsing arguments"
msgstr "Fehler beim Einlesen der Parameter"
-#: ../include/svn_error_codes.h:1341
+#: ../include/svn_error_codes.h:1458
msgid "Not enough arguments provided"
msgstr "Nicht genügend Parameter angegeben"
-#: ../include/svn_error_codes.h:1345
+#: ../include/svn_error_codes.h:1462
msgid "Mutually exclusive arguments specified"
msgstr "Die Parameter schließen sich gegenseitig aus"
-#: ../include/svn_error_codes.h:1349
+#: ../include/svn_error_codes.h:1466
msgid "Attempted command in administrative dir"
msgstr "Ausführen einer Operation in einem Verwaltungsverzeichnis versucht"
-#: ../include/svn_error_codes.h:1353
+#: ../include/svn_error_codes.h:1470
msgid "The log message file is under version control"
msgstr "Die Datei für die Logmeldung ist unter Versionskontrolle"
-#: ../include/svn_error_codes.h:1357
+#: ../include/svn_error_codes.h:1474
msgid "The log message is a pathname"
msgstr "Die Logmeldung ist ein Pfadname"
-#: ../include/svn_error_codes.h:1361
+#: ../include/svn_error_codes.h:1478
msgid "Committing in directory scheduled for addition"
msgstr "Übertragung in einem Verzeichnis, das zum Hinzufügen vorgesehen ist"
-#: ../include/svn_error_codes.h:1365
+#: ../include/svn_error_codes.h:1482
msgid "No external editor available"
msgstr "Kein externer Editor verfügbar"
-#: ../include/svn_error_codes.h:1369
+#: ../include/svn_error_codes.h:1486
msgid "Something is wrong with the log message's contents"
msgstr "Mit dem Inhalt der Logmeldung stimmt etwas nicht"
-#: ../include/svn_error_codes.h:1373
+#: ../include/svn_error_codes.h:1490
msgid "A log message was given where none was necessary"
msgstr "Eine Logmeldung wurde angegeben wo keine nötig ist"
-#: ../include/svn_error_codes.h:1377
+#: ../include/svn_error_codes.h:1494
msgid "No external merge tool available"
msgstr "Kein externes Werkzeug zum Zusammenführen verfügbar"
-#: ../include/svn_error_codes.h:1381
+#: ../include/svn_error_codes.h:1498
msgid "Failed processing one or more externals definitions"
msgstr "Verarbeitung einer oder mehrerer »svn:externals«-Definitionen fehlgeschlagen"
-#: ../include/svn_error_codes.h:1387
+#: ../include/svn_error_codes.h:1504
msgid "Special code for wrapping server errors to report to client"
msgstr "Spezieller Fehlerkode, um Serverfehler an den Client zu melden"
-#: ../include/svn_error_codes.h:1391
+#: ../include/svn_error_codes.h:1508
msgid "Unknown svn protocol command"
msgstr "Unbekanntes svn-Protokollkommando"
-#: ../include/svn_error_codes.h:1395
+#: ../include/svn_error_codes.h:1512
msgid "Network connection closed unexpectedly"
msgstr "Netzwerkverbindung wurde unerwartet geschlossen"
-#: ../include/svn_error_codes.h:1399
+#: ../include/svn_error_codes.h:1516
msgid "Network read/write error"
msgstr "Netzwerk-Lese-/-Schreibfehler"
-#: ../include/svn_error_codes.h:1411
+#: ../include/svn_error_codes.h:1528
msgid "Client/server version mismatch"
msgstr "Client- und Serverversion stimmen nicht überein"
-#: ../include/svn_error_codes.h:1416
+#: ../include/svn_error_codes.h:1533
msgid "Cannot negotiate authentication mechanism"
msgstr "Kann Anmeldungsmechanismus nicht aushandeln"
-#: ../include/svn_error_codes.h:1421
+#: ../include/svn_error_codes.h:1538
msgid "Editor drive was aborted"
msgstr "Editor-Steuerung wurde unterbrochen"
-#: ../include/svn_error_codes.h:1429
+#: ../include/svn_error_codes.h:1546
msgid "Credential data unavailable"
msgstr "Beglaubigungsdaten nicht verfügbar"
-#: ../include/svn_error_codes.h:1433
+#: ../include/svn_error_codes.h:1550
msgid "No authentication provider available"
msgstr "Kein Anbieter für Anmeldung verfügbar"
-#: ../include/svn_error_codes.h:1437
+#: ../include/svn_error_codes.h:1554
msgid "All authentication providers exhausted"
msgstr "Alle Anmeldemöglichkeiten erschöpft"
-#: ../include/svn_error_codes.h:1441
+#: ../include/svn_error_codes.h:1558
msgid "Credentials not saved"
msgstr "Beglaubigungsdaten nicht gespeichert"
-#: ../include/svn_error_codes.h:1446
+#: ../include/svn_error_codes.h:1563 ../libsvn_subr/gpg_agent.c:416
msgid "Authentication failed"
msgstr "Authentifizierung schlug fehl"
-#: ../include/svn_error_codes.h:1452
+#: ../include/svn_error_codes.h:1569
msgid "Read access denied for root of edit"
msgstr "Lesezugriff verweigert für Basis dieser Änderung"
-#: ../include/svn_error_codes.h:1457
+#: ../include/svn_error_codes.h:1574
msgid "Item is not readable"
msgstr "Eintrag ist nicht lesbar"
-#: ../include/svn_error_codes.h:1462
+#: ../include/svn_error_codes.h:1579
msgid "Item is partially readable"
msgstr "Eintrag ist nur teilweise lesbar"
-#: ../include/svn_error_codes.h:1466
+#: ../include/svn_error_codes.h:1583
msgid "Invalid authz configuration"
msgstr "Ungültige authz Konfiguration"
-#: ../include/svn_error_codes.h:1471
+#: ../include/svn_error_codes.h:1588
msgid "Item is not writable"
msgstr "Eintrag ist nicht schreibbar"
-#: ../include/svn_error_codes.h:1478
+#: ../include/svn_error_codes.h:1595
msgid "Diff data source modified unexpectedly"
msgstr "Diff-Datenquellen wurden unerwarteterweise verändert"
-#: ../include/svn_error_codes.h:1484
+#: ../include/svn_error_codes.h:1602
msgid "Initialization of SSPI library failed"
msgstr "Initialisierung der SSPI-Bibliothek schlug fehl"
-#: ../include/svn_error_codes.h:1488
+#: ../include/svn_error_codes.h:1608
msgid "Server SSL certificate untrusted"
msgstr "Server-SSL-Zertifikat ist nicht vertrauenswürdig"
-#: ../include/svn_error_codes.h:1493
+#: ../include/svn_error_codes.h:1613
msgid "Initialization of the GSSAPI context failed"
msgstr "Initialisierung des GSSAPI-Kontextes schlug fehl"
-#: ../include/svn_error_codes.h:1498
+#: ../include/svn_error_codes.h:1618
msgid "While handling serf response:"
msgstr "Während der Abwicklung einer serf Antwort:"
-#: ../include/svn_error_codes.h:1504
+#: ../include/svn_error_codes.h:1624
msgid "Assertion failure"
msgstr "Assert-Anweisung schlug fehl"
-#: ../include/svn_error_codes.h:1508
+#: ../include/svn_error_codes.h:1628
msgid "No non-tracing links found in the error chain"
msgstr "Nur Nicht-Tracing-Einträge in Fehlerkette gefunden"
-#: ../libsvn_auth_gnome_keyring/gnome_keyring.c:274
+#: ../include/svn_error_codes.h:1636
+msgid "Unexpected end of ASN1 data"
+msgstr "Unerwartetes Ende der ASN1-Daten"
+
+#: ../include/svn_error_codes.h:1640
+msgid "Unexpected ASN1 tag"
+msgstr "Unerwartetes ASN1-Tag"
+
+#: ../include/svn_error_codes.h:1644
+msgid "Invalid ASN1 length"
+msgstr "Ungültige ASN1-Länge"
+
+#: ../include/svn_error_codes.h:1648
+msgid "ASN1 length mismatch"
+msgstr "ASN1-Länge stimmt nicht überein"
+
+#: ../include/svn_error_codes.h:1652
+msgid "Invalid ASN1 data"
+msgstr "Ungültige ASN1-Daten"
+
+#: ../include/svn_error_codes.h:1656
+msgid "Unavailable X509 feature"
+msgstr "Nicht verfügbare X509-Funktion"
+
+#: ../include/svn_error_codes.h:1660
+msgid "Invalid PEM certificate"
+msgstr "Ungültiges PEM-Zertifikat"
+
+#: ../include/svn_error_codes.h:1664
+msgid "Invalid certificate format"
+msgstr "Ungültiges Format des Zertifikats"
+
+#: ../include/svn_error_codes.h:1668
+msgid "Invalid certificate version"
+msgstr "Ungültige Version des Zertifikats"
+
+#: ../include/svn_error_codes.h:1672
+msgid "Invalid certificate serial number"
+msgstr "Ungültige Seriennummer des Zertifikats"
+
+#: ../include/svn_error_codes.h:1676
+msgid "Found invalid algorithm in certificate"
+msgstr "Ungültiger Algorithmus im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1680
+msgid "Found invalid name in certificate"
+msgstr "Ungültiger Name im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1684
+msgid "Found invalid date in certificate"
+msgstr "Ungültiges Datum im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1688
+msgid "Found invalid public key in certificate"
+msgstr "Ungültiger öffentlicher Schlüssel im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1692
+msgid "Found invalid signature in certificate"
+msgstr "Ungültige Signatur im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1696
+msgid "Found invalid extensions in certificate"
+msgstr "Ungültige Erweiterungen im Zertifikat gefunden"
+
+#: ../include/svn_error_codes.h:1700
+msgid "Unknown certificate version"
+msgstr "Unbekannte Version im Zertifikat"
+
+#: ../include/svn_error_codes.h:1704
+msgid "Certificate uses unknown public key algorithm"
+msgstr "Zertifikat verwendet unbekannten asymmetrischen Algorithmus"
+
+#: ../include/svn_error_codes.h:1708
+msgid "Certificate signature mismatch"
+msgstr "Signatur des Zertifikats stimmt nicht überein"
+
+#: ../include/svn_error_codes.h:1712
+msgid "Certficate verification failed"
+msgstr "Überprüfung des Zertifikats fehlgeschlagen"
+
+#: ../libsvn_auth_gnome_keyring/gnome_keyring.c:152
msgid "GNOME Keyring is locked and we are non-interactive"
msgstr "GNOME-Schlüsselring ist gesperrt und wir sind nicht-interaktiv"
-#: ../libsvn_client/add.c:606 ../libsvn_client/cmdline.c:356
+#: ../libsvn_client/add.c:609 ../libsvn_client/cmdline.c:365
#: ../libsvn_subr/opt.c:932
#, c-format
msgid "'%s' ends in a reserved name"
msgstr "»%s« endet mit einem reservierten Namen"
-#: ../libsvn_client/add.c:875
+#: ../libsvn_client/add.c:822
#, c-format
msgid "'%s' prevents creating parent of '%s'"
msgstr "»%s« verhindert die Erzeugung des Vorgängers von »%s«"
-#: ../libsvn_client/add.c:914 ../libsvn_wc/adm_ops.c:732
+#: ../libsvn_client/add.c:862 ../libsvn_wc/adm_ops.c:445
#, c-format
msgid "'%s' is an existing item in conflict; please mark the conflict as resolved before adding a new item here"
msgstr "»%s« ist ein vorhandenes Element mit Konflikt; Markieren Sie den Konflikt als aufgelöst bevor Sie hier ein neues Element hinzufügen"
-#: ../libsvn_client/add.c:921 ../libsvn_wc/adm_ops.c:687
-#: ../libsvn_wc/workqueue.c:905 ../libsvn_wc/workqueue.c:999
+#: ../libsvn_client/add.c:869 ../libsvn_wc/adm_ops.c:400
+#: ../libsvn_wc/workqueue.c:873 ../libsvn_wc/workqueue.c:967
#, c-format
msgid "'%s' not found"
msgstr "»%s« nicht gefunden"
-#: ../libsvn_client/add.c:927 ../libsvn_wc/adm_ops.c:692
+#: ../libsvn_client/add.c:875 ../libsvn_wc/adm_ops.c:405
#: ../libsvn_wc/delete.c:98
#, c-format
msgid "Unsupported node kind for path '%s'"
msgstr "Nicht unterstützter Knotentyp für Pfad »%s«"
-#: ../libsvn_client/add.c:960 ../libsvn_client/changelist.c:65
-#: ../libsvn_client/changelist.c:104 ../libsvn_client/cleanup.c:55
-#: ../libsvn_client/export.c:1394 ../libsvn_client/import.c:815
-#: ../libsvn_client/patch.c:3009 ../libsvn_client/relocate.c:232
-#: ../libsvn_client/resolved.c:121 ../libsvn_client/revert.c:136
-#: ../libsvn_client/status.c:353 ../libsvn_client/switch.c:473
-#: ../libsvn_client/update.c:646 ../libsvn_client/upgrade.c:105
-#: ../svn/util.c:984
+#: ../libsvn_client/add.c:908 ../libsvn_client/changelist.c:65
+#: ../libsvn_client/changelist.c:104 ../libsvn_client/deprecated.c:3078
+#: ../libsvn_client/export.c:1394 ../libsvn_client/import.c:831
+#: ../libsvn_client/patch.c:3242 ../libsvn_client/relocate.c:153
+#: ../libsvn_client/resolved.c:119 ../libsvn_client/revert.c:149
+#: ../libsvn_client/status.c:368 ../libsvn_client/switch.c:471
+#: ../libsvn_client/update.c:701 ../libsvn_client/upgrade.c:109
+#: ../svn/util.c:986 ../svnbench/util.c:76
#, c-format
msgid "'%s' is not a local path"
msgstr "»%s« ist kein lokaler Pfad"
-#: ../libsvn_client/add.c:1001 ../libsvn_client/copy_foreign.c:489
-#: ../libsvn_wc/adm_ops.c:766 ../libsvn_wc/copy.c:715
+#: ../libsvn_client/add.c:949 ../libsvn_client/copy_foreign.c:491
+#: ../libsvn_wc/adm_ops.c:479 ../libsvn_wc/copy.c:785
#, c-format
msgid "'%s' is already under version control"
msgstr "»%s« befindet sich bereits unter Versionskontrolle"
-#: ../libsvn_client/add.c:1134 ../libsvn_client/add.c:1161
+#: ../libsvn_client/add.c:1082 ../libsvn_client/add.c:1109
#, c-format
msgid "There is no valid URI above '%s'"
msgstr "Es existiert kein gültiger URI oberhalb von »%s«"
-#: ../libsvn_client/blame.c:605
-msgid "Start revision must precede end revision"
-msgstr "Startrevision muss vor der Endrevision liegen"
-
-#: ../libsvn_client/blame.c:633
+#: ../libsvn_client/blame.c:457 ../libsvn_client/blame.c:764
#, c-format
msgid "Cannot calculate blame information for binary file '%s'"
msgstr "Kann Binärdatei »%s« nicht annotieren"
-#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:610
-#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:833
-#: ../libsvn_client/prop_commands.c:1423 ../libsvn_client/revisions.c:104
-#: ../libsvn_wc/adm_ops.c:1197 ../libsvn_wc/adm_ops.c:1247
-#: ../libsvn_wc/copy.c:563 ../libsvn_wc/copy.c:624 ../libsvn_wc/entries.c:1301
-#: ../libsvn_wc/entries.c:2681 ../libsvn_wc/entries.c:2712
-#: ../svn/notify.c:1095
+#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:612
+#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:817
+#: ../libsvn_client/prop_commands.c:1398 ../libsvn_client/revisions.c:105
+#: ../libsvn_wc/adm_ops.c:913 ../libsvn_wc/adm_ops.c:967
+#: ../libsvn_wc/copy.c:627 ../libsvn_wc/copy.c:688 ../libsvn_wc/entries.c:1406
+#: ../libsvn_wc/entries.c:2802 ../libsvn_wc/entries.c:2833
+#: ../svn/notify.c:1026 ../svnbench/notify.c:968
#, c-format
msgid "'%s' is not under version control"
msgstr "»%s« ist nicht unter Versionskontrolle"
@@ -1410,7 +1583,7 @@ msgstr "»%s« hat keinen ursprünglichen Dateiinhalt, bis es übertragen wurde"
msgid "(local)"
msgstr "(lokal)"
-#: ../libsvn_client/cat.c:247
+#: ../libsvn_client/cat.c:255
#, c-format
msgid "URL '%s' refers to a directory"
msgstr "URL »%s« verweist auf auf ein Verzeichnis"
@@ -1419,22 +1592,23 @@ msgstr "URL »%s« verweist auf auf ein Verzeichnis"
msgid "Target changelist name must not be empty"
msgstr "Name der Ziel-Änderungsliste darf nicht leer sein"
-#: ../libsvn_client/checkout.c:109 ../libsvn_client/export.c:1447
+#: ../libsvn_client/checkout.c:131 ../libsvn_client/export.c:1447
+#: ../svnbench/null-export-cmd.c:275
#, c-format
msgid "URL '%s' doesn't exist"
msgstr "Die URL »%s« existiert nicht"
-#: ../libsvn_client/checkout.c:113
+#: ../libsvn_client/checkout.c:135
#, c-format
msgid "URL '%s' refers to a file, not a directory"
msgstr "Die URL »%s« verweist auf eine Datei, nicht auf ein Verzeichnis"
-#: ../libsvn_client/checkout.c:147
+#: ../libsvn_client/checkout.c:173
#, c-format
msgid "'%s' is already a working copy for a different URL"
msgstr "»%s« ist bereits eine Arbeitskopie für eine andere URL"
-#: ../libsvn_client/checkout.c:155
+#: ../libsvn_client/checkout.c:181
#, c-format
msgid "'%s' already exists and is not a directory"
msgstr "»%s« existiert bereits und ist kein Verzeichnis"
@@ -1444,37 +1618,37 @@ msgstr "»%s« existiert bereits und ist kein Verzeichnis"
msgid "All non-relative targets must have the same root URL"
msgstr "Alle nicht-relativen Ziele müssen die selbe Wurzel-URL haben"
-#: ../libsvn_client/cmdline.c:312
+#: ../libsvn_client/cmdline.c:207
+#, c-format
+msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
+msgstr "»%s« ist nur eine Fix-Revision. Meinten Sie stattdessen »%s@«?"
+
+#: ../libsvn_client/cmdline.c:321
msgid "Resolving '^/': no repository root found in the target arguments or in the current directory"
msgstr "Auflösen von »^/«: Keine Wurzel eines Projektarchivs in den Zielparametern oder im Arbeitsverzeichnis gefunden"
-#: ../libsvn_client/commit.c:155 ../libsvn_client/copy.c:1522
+#: ../libsvn_client/commit.c:157 ../libsvn_client/copy.c:2264
msgid "Commit failed (details follow):"
msgstr "Ãœbertragen schlug fehl (Details folgen):"
-#: ../libsvn_client/commit.c:163
+#: ../libsvn_client/commit.c:165
msgid "Commit succeeded, but other errors follow:"
msgstr "Ãœbertragen erfolgreich, aber andere Fehler folgen:"
-#: ../libsvn_client/commit.c:170
+#: ../libsvn_client/commit.c:172
msgid "Error unlocking locked dirs (details follow):"
msgstr "Fehler beim Entsperren von Verzeichnissen (Details folgen):"
-#: ../libsvn_client/commit.c:181
+#: ../libsvn_client/commit.c:183
msgid "Error bumping revisions post-commit (details follow):"
msgstr "Fehler beim Weiterschalten der Revisionen nach der Ãœbertragung (Details folgen):"
-#: ../libsvn_client/commit.c:314
-#, c-format
-msgid "Cannot delete the directory '%s' in a non-recursive commit because it has children"
-msgstr "Kann das Verzeichnis »%s« nicht mit einer nicht-rekursiv Übertragung löschen, da es Kindelemente hat"
-
-#: ../libsvn_client/commit.c:613
+#: ../libsvn_client/commit.c:554
#, c-format
msgid "'%s' is a URL, but URLs cannot be commit targets"
msgstr "»%s« ist eine URL, aber URLs können nicht übertragen werden"
-#: ../libsvn_client/commit.c:735
+#: ../libsvn_client/commit.c:656
msgid ""
"Commit can only commit to a single repository at a time.\n"
"Are all targets part of the same working copy?"
@@ -1482,198 +1656,229 @@ msgstr ""
"Kann nur zu einem einzigen Projektarchiv gleichzeitig übertragen.\n"
"Sind alle Ziele Teil der selben Arbeitskopie?"
-#: ../libsvn_client/commit.c:851
+#: ../libsvn_client/commit.c:722
#, c-format
msgid "Cannot commit '%s' because it was moved from '%s' which is not part of the commit; both sides of the move must be committed together"
msgstr "Kann »%s« nicht übertragen, da es von »%s« verschoben wurde, welches nicht Teil der Übertragung ist; Beide Seiten der Verschiebung müssen zusammen übertragen werden"
-#: ../libsvn_client/commit.c:882
+#: ../libsvn_client/commit.c:777
#, c-format
msgid "Cannot commit '%s' because it was moved to '%s' which is not part of the commit; both sides of the move must be committed together"
msgstr "Kann »%s« nicht übertragen, da es nach »%s« verschoben wurde, welches nicht Teil der Übertragung ist; Beide Seiten der Verschiebung müssen zusammen übertragen werden"
-#: ../libsvn_client/commit_util.c:94 ../libsvn_repos/commit.c:167
+#: ../libsvn_client/commit_util.c:96 ../libsvn_repos/commit.c:167
#, c-format
msgid "Directory '%s' is out of date"
msgstr "Verzeichnis »%s« ist veraltet"
-#: ../libsvn_client/commit_util.c:95 ../libsvn_repos/commit.c:169
+#: ../libsvn_client/commit_util.c:97 ../libsvn_repos/commit.c:169
#, c-format
msgid "File '%s' is out of date"
msgstr "Datei »%s« ist veraltet"
-#: ../libsvn_client/commit_util.c:130
+#: ../libsvn_client/commit_util.c:133
#, c-format
msgid "Directory '%s' is locked in another working copy"
msgstr "Verzeichnis »%s« ist in einer Arbeitskopie gesperrt"
-#: ../libsvn_client/commit_util.c:131
+#: ../libsvn_client/commit_util.c:134
#, c-format
msgid "File '%s' is locked in another working copy"
msgstr "Datei »%s« ist in einer anderen Arbeitskopie gesperrt"
-#: ../libsvn_client/commit_util.c:166
+#: ../libsvn_client/commit_util.c:169
#, c-format
msgid "Changing directory '%s' is forbidden by the server"
msgstr "Ändern des Verzeichnisses »%s« durch den Server zurückgewiesen"
-#: ../libsvn_client/commit_util.c:167
+#: ../libsvn_client/commit_util.c:170
#, c-format
msgid "Changing file '%s' is forbidden by the server"
msgstr "Ändern der Datei »%s« durch den Server zurückgewiesen"
-#: ../libsvn_client/commit_util.c:315
+#: ../libsvn_client/commit_util.c:318
#, c-format
msgid "Aborting commit: '%s' remains in tree-conflict"
msgstr "Übertragung abgebrochen: »%s« verursacht weiterhin einen Baumkonflikt"
-#: ../libsvn_client/commit_util.c:666
+#: ../libsvn_client/commit_util.c:668
#, c-format
msgid "Aborting commit: '%s' remains in conflict"
msgstr "Übertragung abgebrochen: »%s« bleibt im Konflikt"
-#: ../libsvn_client/commit_util.c:685
+#: ../libsvn_client/commit_util.c:687
#, c-format
msgid "Node '%s' has unexpectedly changed kind"
msgstr "Knoten »%s« hat unerwartet seinen Typ geändert"
-#: ../libsvn_client/commit_util.c:726
+#: ../libsvn_client/commit_util.c:728
#, c-format
msgid "'%s' is scheduled for addition, but is missing"
msgstr "»%s« ist zum Hinzufügen vorgesehen, fehlt aber"
-#: ../libsvn_client/commit_util.c:1257
+#: ../libsvn_client/commit_util.c:1279
#, c-format
msgid "'%s' is not known to exist in the repository and is not part of the commit, yet its child '%s' is part of the commit"
msgstr "»%s« ist weder im Projektarchiv bekannt noch Teil einer Übertragung, dennoch ist sein Kind »%s« Teil der Übertragung"
-#: ../libsvn_client/commit_util.c:1397
+#: ../libsvn_client/commit_util.c:1421
#, c-format
msgid "Cannot commit both '%s' and '%s' as they refer to the same URL"
msgstr "Kann »%s« und »%s« nicht übertragen, da beide auf dieselbe URL verweisen"
-#: ../libsvn_client/commit_util.c:1548
+#: ../libsvn_client/commit_util.c:1576
#, c-format
msgid "Commit item '%s' has copy flag but no copyfrom URL"
msgstr "Übertragenes Objekt »%s« ist als Kopie markiert, besitzt aber keine Quell-URL"
-#: ../libsvn_client/commit_util.c:1553
+#: ../libsvn_client/commit_util.c:1581
#, c-format
msgid "Commit item '%s' has copy flag but an invalid revision"
msgstr "Übertragenes Objekt »%s« ist als Kopie markiert, hat aber eine ungültige Revision"
-#: ../libsvn_client/commit_util.c:2015
+#: ../libsvn_client/commit_util.c:2056
msgid "Standard properties can't be set explicitly as revision properties"
msgstr "Standardeigenschaften können nicht explizit als Revisionseigenschaften gesetzt werden"
-#: ../libsvn_client/copy.c:439
+#: ../libsvn_client/copy.c:295
+#, c-format
+msgid "%s property defined at '%s' is using an unsupported syntax"
+msgstr "Eigenschaft %s definiert auf »%s« verwendet einen nicht unterstützen Syntax"
+
+#: ../libsvn_client/copy.c:443
+#, c-format
+msgid "Cannot pin external '%s' defined in %s at '%s' because it is not checked out in the working copy at '%s'"
+msgstr "Kann externen Verweis »%s« definiert durch Eigenschaft »%s« von »%s« nicht auf eine Revision festlegen, da er in der Arbeitskopie »%s« nicht ausgecheckt ist"
+
+#: ../libsvn_client/copy.c:468
+#, c-format
+msgid "Cannot pin external '%s' defined in %s at '%s' because '%s' has switched subtrees (switches cannot be represented in %s)"
+msgstr "Kann externen Verweis »%s« definiert durch Eigenschaft »%s« von »%s« nicht auf eine Revision festlegen, da »%s« umgestellte Unterbäume enthält (Umstellungen können in »%s« nicht abgebildet werden)"
+
+#: ../libsvn_client/copy.c:487
+#, c-format
+msgid "Cannot pin external '%s' defined in %s at '%s' because '%s' has local modifications (local modifications cannot be represented in %s)"
+msgstr "Kann externen Verweis »%s« definiert durch Eigenschaft »%s« von »%s« nicht auf eine Revision festlegen, da »%s« lokale Änderungen enthält (lokale Änderungen können in »%s« nicht abgebildet werden)"
+
+#: ../libsvn_client/copy.c:505
+#, c-format
+msgid "Cannot pin external '%s' defined in %s at '%s' because '%s' is a mixed-revision working copy (mixed-revisions cannot be represented in %s)"
+msgstr "Kann externen Verweis »%s« definiert durch Eigenschaft »%s« von »%s« nicht auf eine Revision festlegen, da »%s« eine Arbeitskopie mit verschiedenen Revisionen ist (verschiedene Revisionen können in »%s« nicht abgebildet werden)"
+
+#: ../libsvn_client/copy.c:959
#, c-format
msgid "Path '%s' exists, but is excluded"
msgstr "Pfad »%s« existiert, ist aber ausgeschlossen"
-#: ../libsvn_client/copy.c:445 ../libsvn_client/copy.c:1062
-#: ../libsvn_client/copy.c:1321 ../libsvn_client/copy.c:1896
-#: ../libsvn_client/import.c:862
+#: ../libsvn_client/copy.c:965 ../libsvn_client/copy.c:2051
+#: ../libsvn_client/copy.c:2707 ../libsvn_client/import.c:881
+#: ../libsvn_client/mtcc.c:456 ../libsvn_client/mtcc.c:473
+#: ../libsvn_ra_serf/util.c:1819
#, c-format
msgid "Path '%s' already exists"
msgstr "Pfad »%s« existiert bereits"
-#: ../libsvn_client/copy.c:500
+#: ../libsvn_client/copy.c:1020
#, c-format
msgid "Path '%s' already exists as unversioned node"
msgstr "Pfad »%s« existiert als nicht versionierter Knoten"
-#: ../libsvn_client/copy.c:522 ../libsvn_client/copy.c:532
-#: ../libsvn_client/copy.c:1912
+#: ../libsvn_client/copy.c:1042 ../libsvn_client/copy.c:1052
+#: ../libsvn_client/copy.c:2723
#, c-format
msgid "Path '%s' is not a directory"
msgstr "Pfad »%s« ist kein Verzeichnis"
-#: ../libsvn_client/copy.c:571 ../libsvn_client/merge.c:10154
-#: ../svnlook/svnlook.c:1425
+#: ../libsvn_client/copy.c:1091 ../libsvn_client/merge.c:10227
+#: ../svnlook/svnlook.c:1435
#, c-format
msgid "Path '%s' does not exist"
msgstr "Pfad »%s« existiert nicht"
-#: ../libsvn_client/copy.c:741 ../libsvn_client/copy.c:782
+#: ../libsvn_client/copy.c:1275 ../libsvn_client/copy.c:1316
#, c-format
msgid "Path '%s' already exists, but is not a directory"
msgstr "Pfad »%s« existiert bereits, ist aber kein Verzeichnis"
-#: ../libsvn_client/copy.c:843
+#: ../libsvn_client/copy.c:1453
msgid "Source and destination URLs appear not to point to the same repository."
msgstr "Quellen- und Ziel-URL scheinen nicht auf das selbe Projektarchiv zu zeigen."
-#: ../libsvn_client/copy.c:1052 ../libsvn_client/prop_commands.c:167
+#: ../libsvn_client/copy.c:1662 ../libsvn_client/prop_commands.c:167
#, c-format
msgid "Path '%s' does not exist in revision %ld"
msgstr "Pfad »%s« existiert nicht in Revision %ld"
-#: ../libsvn_client/copy.c:1880
+#: ../libsvn_client/copy.c:1676
+#, c-format
+msgid "Path '/%s' already exists"
+msgstr "Pfad »/%s« existiert bereits"
+
+#: ../libsvn_client/copy.c:2691 ../libsvn_client/mtcc.c:550
#, c-format
msgid "Path '%s' not found in revision %ld"
msgstr "Pfad »%s« wurde in Revision %ld nicht gefunden"
-#: ../libsvn_client/copy.c:1885
+#: ../libsvn_client/copy.c:2696
#, c-format
msgid "Path '%s' not found in head revision"
msgstr "Pfad »%s« wurde in der HEAD-Revision nicht gefunden"
-#: ../libsvn_client/copy.c:2013
+#: ../libsvn_client/copy.c:2831
msgid "Cannot mix repository and working copy sources"
msgstr "Quellen aus dem Projektarchiv und einer Arbeitskopie können nicht gemischt werden"
-#: ../libsvn_client/copy.c:2065
+#: ../libsvn_client/copy.c:2884
#, c-format
msgid "Cannot copy path '%s' into its own child '%s'"
msgstr "Kann Pfad »%s« nicht in sein eigenes Kind »%s« kopieren"
-#: ../libsvn_client/copy.c:2101
+#: ../libsvn_client/copy.c:2920
#, c-format
msgid "Cannot move the external at '%s'; please edit the svn:externals property on '%s'."
msgstr "Externer Verweis »%s« kann nicht verschoben werden; bitte bearbeiten Sie die Eigenschaft »svn:externals« von »%s«"
-#: ../libsvn_client/copy.c:2116
+#: ../libsvn_client/copy.c:2935
msgid "Moves between the working copy and the repository are not supported"
msgstr "Verschiebungen zwischen der Arbeitskopie und dem Projektarchiv sind nicht unterstützt"
-#: ../libsvn_client/copy.c:2131
+#: ../libsvn_client/copy.c:2950
#, c-format
msgid "Cannot move URL '%s' into itself"
msgstr "Kann URL »%s« nicht auf sich selbst verschieben"
-#: ../libsvn_client/copy.c:2132
+#: ../libsvn_client/copy.c:2951
#, c-format
msgid "Cannot move path '%s' into itself"
msgstr "Kann »%s« nicht auf sich selbst verschieben"
-#: ../libsvn_client/copy.c:2199
+#: ../libsvn_client/copy.c:3018
#, c-format
msgid "'%s' does not have a URL associated with it"
msgstr "»%s« hat keine zugehörige URL"
-#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:282
-#: ../libsvn_client/externals.c:904 ../libsvn_client/externals.c:1114
-#: ../libsvn_wc/update_editor.c:1124
+#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:283
+#: ../libsvn_client/externals.c:985 ../libsvn_client/externals.c:1196
+#: ../libsvn_wc/update_editor.c:1119
#, c-format
msgid "Path '%s' is not in the working copy"
msgstr "Pfad »%s« ist nicht in der Arbeitskopie enthalten"
-#: ../libsvn_client/copy_foreign.c:372 ../libsvn_client/export.c:814
-#: ../libsvn_client/repos_diff.c:998 ../libsvn_fs_fs/dag.c:1051
-#: ../libsvn_ra_svn/client.c:1208 ../libsvn_wc/diff_editor.c:1981
-#: ../libsvn_wc/diff_editor.c:2060 ../libsvn_wc/externals.c:651
-#: ../libsvn_wc/update_editor.c:4279
+#: ../libsvn_client/copy_foreign.c:373 ../libsvn_client/export.c:814
+#: ../libsvn_client/repos_diff.c:1002 ../libsvn_fs_fs/dag.c:1074
+#: ../libsvn_fs_x/dag.c:1074 ../libsvn_ra_svn/client.c:1324
+#: ../libsvn_wc/diff_editor.c:1987 ../libsvn_wc/diff_editor.c:2073
+#: ../libsvn_wc/externals.c:707 ../libsvn_wc/update_editor.c:4165
#, c-format
msgid "Checksum mismatch for '%s'"
msgstr "Prüfsummenfehler für »%s«"
-#: ../libsvn_client/copy_foreign.c:479
+#: ../libsvn_client/copy_foreign.c:481
#, c-format
msgid "'%s' is not a valid location inside a repository"
msgstr "»%s« ist kein gültiger Pfad in einem Projektarchiv"
-#: ../libsvn_client/copy_foreign.c:510
+#: ../libsvn_client/copy_foreign.c:512
#, c-format
msgid "Can't add '%s', because no parent directory is found"
msgstr "Kann »%s« nicht hinzufügen, da kein Elternverzeichnis gefunden wurde"
@@ -1693,95 +1898,101 @@ msgstr "»%s« hat lokale Änderungen -- zuerst übertragen oder zurücksetzen"
msgid "Cannot remove the external at '%s'; please edit or delete the svn:externals property on '%s'"
msgstr "Externer Verweis »%s« kann nicht entfernt werden; bitte bearbeiten oder löschen Sie die Eigenschaft »svn:externals« von »%s«"
-#: ../libsvn_client/deprecated.c:862 ../svn/move-cmd.c:65
+#: ../libsvn_client/delete.c:358
+#, c-format
+msgid "URL '%s' not within a repository"
+msgstr "URL »%s« ist nicht in einem Projektarchiv"
+
+#: ../libsvn_client/delete.c:365
+#, c-format
+msgid "URL '%s' does not exist"
+msgstr "URL »%s« existiert nicht"
+
+#: ../libsvn_client/deprecated.c:884 ../svn/move-cmd.c:65
msgid "Cannot specify revisions (except HEAD) with move operations"
msgstr "Andere Revisionen (als HEAD) sind bei Verschiebeoperationen nicht zugelassen"
-#: ../libsvn_client/deprecated.c:1624
+#: ../libsvn_client/deprecated.c:1647
msgid "No commits in repository"
msgstr "Keine Ãœbertragungen im Projektarchiv"
-#: ../libsvn_client/deprecated.c:2930 ../libsvn_wc/deprecated.c:3953
+#: ../libsvn_client/deprecated.c:3032 ../libsvn_wc/deprecated.c:4172
msgid "Non-recursive relocation not supported"
msgstr "Nicht-rekursives Umplatzieren nicht unterstützt"
-#. Utilities
-#: ../libsvn_client/diff.c:64
+#: ../libsvn_client/diff.c:66
#, c-format
msgid "Path '%s' must be an immediate child of the directory '%s'"
msgstr "Pfad »%s« muss ein unmittelbares Kind von Verzeichnis »%s« sein"
-#: ../libsvn_client/diff.c:258
+#: ../libsvn_client/diff.c:241
#, c-format
msgid "%s\t(revision %ld)"
msgstr "%s\t(Revision %ld)"
-#: ../libsvn_client/diff.c:260
+#: ../libsvn_client/diff.c:243
+#, c-format
+msgid "%s\t(nonexistent)"
+msgstr "%s\t(nicht existent)"
+
+#. SVN_INVALID_REVNUM
+#: ../libsvn_client/diff.c:245
#, c-format
msgid "%s\t(working copy)"
msgstr "%s\t(Arbeitskopie)"
-#: ../libsvn_client/diff.c:512 ../svnlook/svnlook.c:795
+#: ../libsvn_client/diff.c:499 ../svnlook/svnlook.c:802
#, c-format
msgid "%sProperty changes on: %s%s"
msgstr "%sEigenschaftsänderungen: %s%s"
-#: ../libsvn_client/diff.c:760
+#: ../libsvn_client/diff.c:754
#, c-format
msgid "Cannot display: file marked as a binary type.%s"
msgstr "Kann nicht anzeigen: Dateityp ist als binär angegeben.%s"
-#: ../libsvn_client/diff.c:1265 ../libsvn_client/merge.c:7203
-#: ../libsvn_client/merge.c:10556
+#: ../libsvn_client/diff.c:1285 ../libsvn_client/merge.c:7277
+#: ../libsvn_client/merge.c:10629
msgid "Not all required revisions are specified"
msgstr "Es sind nicht alle erforderlichen Revisionen angegeben"
-#: ../libsvn_client/diff.c:1279
+#: ../libsvn_client/diff.c:1299
msgid "At least one revision must be something other than BASE or WORKING when diffing a URL"
msgstr "Beim Vergleichen einer URL muss mindestens eine Revision etwas anderes sein als »BASE« oder »WORKING«"
-#: ../libsvn_client/diff.c:1316
+#: ../libsvn_client/diff.c:1336
#, c-format
msgid "Diff target '%s' was not found in the repository at revision '%ld'"
msgstr "Ziel für Vergleich »%s« wurde im Projektarchiv in Revision »%ld« nicht gefunden"
-#: ../libsvn_client/diff.c:1321
+#: ../libsvn_client/diff.c:1341
#, c-format
msgid "Diff target '%s' was not found in the repository at revision '%ld' or '%ld'"
msgstr "Ziel für Vergleich »%s« wurde im Projektarchiv in Revision »%ld« oder »%ld« nicht gefunden"
-#: ../libsvn_client/diff.c:1496
+#: ../libsvn_client/diff.c:1517
#, c-format
msgid "Diff target '%s' was not found in the repository at revisions '%ld' and '%ld'"
msgstr "Ziel für Vergleich »%s« wurde im Projektarchiv in Revisionen »%ld« und »%ld« nicht gefunden"
-#: ../libsvn_client/diff.c:1501
+#: ../libsvn_client/diff.c:1522
#, c-format
msgid "Diff targets '%s' and '%s' were not found in the repository at revisions '%ld' and '%ld'"
msgstr "Ziele für Vergleich »%s« und »%s« wurden im Projektarchiv in Revisionen »%ld« und »%ld« nicht gefunden"
-#: ../libsvn_client/diff.c:1575
+#: ../libsvn_client/diff.c:1621
msgid "Sorry, svn_client_diff6 was called in a way that is not yet supported"
msgstr "Leider wurde svn_client_diff6 in einer Art aufgerufen, die noch nicht unterstützt wird"
-#: ../libsvn_client/diff.c:1616
+#: ../libsvn_client/diff.c:1661
msgid "Only diffs between a path's text-base and its working files are supported at this time"
msgstr "Derzeit werden nur Vergleiche zwischen der Textbasis und den Arbeitsdateien eines Pfades unterstützt"
-#: ../libsvn_client/diff.c:2221
-msgid "Summarized diffs are only supported between a path's text-base and its working files at this time"
-msgstr "Derzeit werden Zusammenfassungen für Vergleiche nur zwischen der Textbasis und den Arbeitsdateien eines Pfades unterstützt"
-
-#: ../libsvn_client/diff.c:2582 ../libsvn_client/diff.c:2648
+#: ../libsvn_client/diff.c:2367 ../libsvn_client/diff.c:2453
msgid "Cannot ignore properties and show only properties at the same time"
msgstr "Kann nicht gleichzeitig Eigenschaften ignorieren und nur Eigenschaften anzeigen"
-#: ../libsvn_client/diff_local.c:609
-#, c-format
-msgid "'%s' is not the same node kind as '%s'"
-msgstr "»%s« hat nicht den gleichen Knotentyp wie »%s«"
-
-#: ../libsvn_client/diff_local.c:632 ../libsvn_wc/props.c:1568
+#: ../libsvn_client/diff_local.c:792 ../libsvn_wc/props.c:1673
#, c-format
msgid "'%s' is not a file or directory"
msgstr "»%s« ist weder eine Datei noch ein Verzeichnis"
@@ -1796,22 +2007,22 @@ msgid "Destination directory exists, and will not be overwritten unless forced"
msgstr "Zielverzeichnis existiert und kann nur mittels »--force« überschrieben werden"
#: ../libsvn_client/export.c:265 ../libsvn_client/export.c:1527
-#: ../libsvn_wc/adm_crawler.c:1204 ../libsvn_wc/conflicts.c:1293
-#: ../libsvn_wc/copy.c:586 ../libsvn_wc/crop.c:236 ../libsvn_wc/crop.c:327
-#: ../libsvn_wc/info.c:403 ../libsvn_wc/node.c:704 ../libsvn_wc/props.c:227
-#: ../libsvn_wc/status.c:2679 ../libsvn_wc/wc_db.c:2576
-#: ../libsvn_wc/wc_db.c:2770 ../libsvn_wc/wc_db.c:2794
-#: ../libsvn_wc/wc_db.c:2952 ../libsvn_wc/wc_db.c:3950
-#: ../libsvn_wc/wc_db.c:6001 ../libsvn_wc/wc_db.c:6321
-#: ../libsvn_wc/wc_db.c:6482 ../libsvn_wc/wc_db.c:6637
-#: ../libsvn_wc/wc_db.c:7672 ../libsvn_wc/wc_db.c:8631
-#: ../libsvn_wc/wc_db.c:9294 ../libsvn_wc/wc_db.c:9923
-#: ../libsvn_wc/wc_db.c:10070 ../libsvn_wc/wc_db.c:10210
-#: ../libsvn_wc/wc_db.c:10560 ../libsvn_wc/wc_db.c:12047
-#: ../libsvn_wc/wc_db.c:12123 ../libsvn_wc/wc_db.c:13657
-#: ../libsvn_wc/wc_db.c:13717 ../libsvn_wc/wc_db.c:13855
-#: ../libsvn_wc/wc_db.c:14013 ../libsvn_wc/wc_db.c:14450
-#: ../libsvn_wc/wc_db.c:15231
+#: ../libsvn_wc/adm_crawler.c:1219 ../libsvn_wc/conflicts.c:1173
+#: ../libsvn_wc/copy.c:650 ../libsvn_wc/crop.c:234 ../libsvn_wc/crop.c:337
+#: ../libsvn_wc/info.c:376 ../libsvn_wc/node.c:529 ../libsvn_wc/props.c:202
+#: ../libsvn_wc/status.c:2722 ../libsvn_wc/wc_db.c:2066
+#: ../libsvn_wc/wc_db.c:2571 ../libsvn_wc/wc_db.c:2810
+#: ../libsvn_wc/wc_db.c:2843 ../libsvn_wc/wc_db.c:3001
+#: ../libsvn_wc/wc_db.c:4007 ../libsvn_wc/wc_db.c:6330
+#: ../libsvn_wc/wc_db.c:6650 ../libsvn_wc/wc_db.c:6823
+#: ../libsvn_wc/wc_db.c:7010 ../libsvn_wc/wc_db.c:8049
+#: ../libsvn_wc/wc_db.c:9013 ../libsvn_wc/wc_db.c:9745
+#: ../libsvn_wc/wc_db.c:10390 ../libsvn_wc/wc_db.c:10537
+#: ../libsvn_wc/wc_db.c:10677 ../libsvn_wc/wc_db.c:11053
+#: ../libsvn_wc/wc_db.c:12599 ../libsvn_wc/wc_db.c:12667
+#: ../libsvn_wc/wc_db.c:13969 ../libsvn_wc/wc_db.c:14031
+#: ../libsvn_wc/wc_db.c:14152 ../libsvn_wc/wc_db.c:14311
+#: ../libsvn_wc/wc_db.c:14752 ../libsvn_wc/wc_db.c:15616
#, c-format
msgid "The node '%s' was not found."
msgstr "Der Knoten »%s« wurde nicht gefunden."
@@ -1840,157 +2051,169 @@ msgstr "»%s« existiert und ist kein Verzeichnis"
msgid "'%s' already exists"
msgstr "»%s« existiert bereits"
-#: ../libsvn_client/externals.c:406
+#: ../libsvn_client/externals.c:202
+#, c-format
+msgid "The external '%s' defined in %s at '%s' cannot be checked out because '%s' is already a versioned path."
+msgstr "Der externe Verweis »%s« definiert durch Eigenschaft »%s« von »%s« kann nicht ausgecheckt werden, da »%s« schon ein versionierter Pfad ist."
+
+#: ../libsvn_client/externals.c:464
#, c-format
msgid "Cannot insert a file external defined on '%s' into the working copy '%s'."
msgstr "Kann externen Dateiverweis von »%s« nicht in die Arbeitskopie »%s« einfügen."
-#: ../libsvn_client/externals.c:431
+#: ../libsvn_client/externals.c:489
#, c-format
msgid "The file external from '%s' cannot overwrite the existing versioned item at '%s'"
msgstr "Der externe Dateiverweis von »%s« kann nicht das existierende versionierte Objekt bei »%s« überschreiben"
-#: ../libsvn_client/externals.c:444
+#: ../libsvn_client/externals.c:503
#, c-format
msgid "The file external '%s' can not be created because the node exists."
msgstr "Der externe Dateiverweis auf »%s« kann nicht erstellt werden, da schon ein Knoten existiert"
-#: ../libsvn_client/externals.c:703
+#: ../libsvn_client/externals.c:781
#, c-format
msgid "URL '%s' at revision %ld doesn't exist"
msgstr "URL »%s« existiert nicht in Revision %ld"
-#: ../libsvn_client/externals.c:708
+#: ../libsvn_client/externals.c:786
#, c-format
msgid "URL '%s' at revision %ld is not a file or a directory"
msgstr "URL »%s« in Revision %ld ist weder eine Datei noch ein Verzeichnis"
-#: ../libsvn_client/externals.c:786
+#: ../libsvn_client/externals.c:865
#, c-format
msgid "Unsupported external: URL of file external '%s' is not in repository '%s'"
msgstr "Nicht unterstützter externer Verweis: URL von Dateiverweis »%s« gehört nicht zum Projektarchiv »%s«"
-#: ../libsvn_client/externals.c:979
+#: ../libsvn_client/externals.c:1061
#, c-format
msgid "Traversal of '%s' found no ambient depth"
msgstr "Durchlauf von »%s« fand keine äußere Tiefe"
-#: ../libsvn_client/import.c:159
+#: ../libsvn_client/import.c:149
#, c-format
msgid "%s property on '%s' contains unrecognized EOL-style '%s'"
msgstr "Eigenschaft »%s« von »%s« enthält nicht erkannten Zeilenendstil »%s«"
-#: ../libsvn_client/import.c:489
+#: ../libsvn_client/import.c:479
#, c-format
msgid "Unknown or unversionable type for '%s'"
msgstr "Unbekannter oder unerwarteter Typ für »%s«"
-#: ../libsvn_client/import.c:707
+#: ../libsvn_client/import.c:706
msgid "New entry name required when importing a file"
msgstr "Neuer Eintragsname erforderlich, wenn eine Datei importiert wird"
-#: ../libsvn_client/import.c:758 ../libsvn_client/patch.c:3016
-#: ../libsvn_client/patch.c:3028 ../libsvn_wc/delete.c:93
-#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:77
+#: ../libsvn_client/import.c:757 ../libsvn_client/patch.c:3249
+#: ../libsvn_client/patch.c:3261 ../libsvn_wc/delete.c:93
+#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:78
#, c-format
msgid "'%s' does not exist"
msgstr "»%s« ist nicht vorhanden"
-#: ../libsvn_client/import.c:891
+#: ../libsvn_client/import.c:909
#, c-format
msgid "'%s' is a reserved name and cannot be imported"
msgstr "»%s« ist ein reservierter Name und kann nicht importiert werden "
-#: ../libsvn_client/info.c:310 ../libsvn_client/list.c:376
+#: ../libsvn_client/info.c:398 ../libsvn_client/list.c:272
+#: ../svnbench/null-info-cmd.c:148
#, c-format
msgid "URL '%s' non-existent in revision %ld"
msgstr "URL »%s« existiert nicht in Revision %ld"
-#: ../libsvn_client/locking_commands.c:266
-#: ../libsvn_client/locking_commands.c:292
+#: ../libsvn_client/locking_commands.c:273
msgid "No common parent found, unable to operate on disjoint arguments"
msgstr "Kein gemeinsamer Vorgänger gefunden. Kann nicht mit disjunkten Pfaden arbeiten"
-#: ../libsvn_client/locking_commands.c:325
+#: ../libsvn_client/locking_commands.c:382
#, c-format
msgid "The node '%s' is not a file"
msgstr "Der Knoten »%s« ist keine Datei"
-#: ../libsvn_client/locking_commands.c:345
+#: ../libsvn_client/locking_commands.c:402
msgid "Unable to lock/unlock across multiple repositories"
msgstr "Unmöglich über mehrere Projektarchive zu (ent)sperren"
-#: ../libsvn_client/locking_commands.c:400
+#: ../libsvn_client/locking_commands.c:442
#, c-format
msgid "'%s' is not locked in this working copy"
msgstr "»%s« ist in dieser Arbeitskopie nicht gesperrt"
-#: ../libsvn_client/locking_commands.c:450
+#: ../libsvn_client/locking_commands.c:495
#, c-format
msgid "'%s' is not locked"
msgstr "»%s« ist nicht gesperrt"
-#: ../libsvn_client/locking_commands.c:483 ../libsvn_fs/fs-loader.c:1413
-#: ../libsvn_ra/ra_loader.c:1074
+#: ../libsvn_client/locking_commands.c:529 ../libsvn_fs/fs-loader.c:1631
+#: ../libsvn_ra/ra_loader.c:1058
msgid "Lock comment contains illegal characters"
msgstr "Sperrkommentar enthält illegale Zeichen"
-#: ../libsvn_client/log.c:309
+#: ../libsvn_client/log.c:134 ../libsvn_client/ra.c:532
+#: ../libsvn_client/ra.c:867
+#, c-format
+msgid "'%s' has no URL"
+msgstr "»%s« hat keine URL"
+
+#: ../libsvn_client/log.c:347
msgid "No valid target found"
msgstr "Kein gültiges Ziel gefunden"
-#: ../libsvn_client/log.c:340
+#: ../libsvn_client/log.c:378
#, c-format
msgid "'%s' is not a relative path"
msgstr "»%s« ist kein relativer Pfad"
-#: ../libsvn_client/log.c:366
+#: ../libsvn_client/log.c:404
msgid "When specifying working copy paths, only one target may be given"
msgstr "Bei der Angabe von Arbeitskopiepfaden darf nur ein Ziel angegeben werden"
-#: ../libsvn_client/log.c:390 ../libsvn_client/revisions.c:189
+#: ../libsvn_client/log.c:428 ../libsvn_client/revisions.c:190
msgid "PREV, BASE, or COMMITTED revision keywords are invalid for URL"
msgstr "PREV, BASE oder COMMITTED Revisions-Schlüsselwörter sind für die URL ungültig"
-#: ../libsvn_client/log.c:523 ../libsvn_client/log.c:830
+#: ../libsvn_client/log.c:561 ../libsvn_client/log.c:870
msgid "Missing required revision specification"
msgstr "Es wurde keine Revision angegeben"
-#: ../libsvn_client/merge.c:443
+#: ../libsvn_client/merge.c:442
#, c-format
msgid "URL '%s' of '%s' is not in repository '%s'"
msgstr "URL »%s« von »%s« ist nicht im Projektarchiv »%s«"
-#: ../libsvn_client/merge.c:480
+#: ../libsvn_client/merge.c:479
#, c-format
msgid "'%s' must be from the same repository as '%s'"
msgstr "»%s« muss aus dem selben Projektarchiv wie »%s« stammen"
-# Lustig: .working wird nicht übersetzt, .merge-left aber schon
-# und das auch noch inkonsistent...
+# File names not translated
#. xgettext: the '.working', '.merge-left.r%ld' and
#. '.merge-right.r%ld' strings are used to tag onto a file
#. name in case of a merge conflict
-#: ../libsvn_client/merge.c:2050
+#: ../libsvn_client/merge.c:2094
#, c-format
msgid ".working%s%s"
msgstr ".working%s%s"
-#: ../libsvn_client/merge.c:2053
+# File names not translated
+#: ../libsvn_client/merge.c:2097
#, c-format
msgid ".merge-left.r%ld%s%s"
msgstr ".merge-left.r%ld%s%s"
-#: ../libsvn_client/merge.c:2057
+# File names not translated
+#: ../libsvn_client/merge.c:2101
#, c-format
msgid ".merge-right.r%ld%s%s"
msgstr ".merge-right.r%ld%s%s"
-#: ../libsvn_client/merge.c:4708
+#: ../libsvn_client/merge.c:4779
msgid "Cannot reverse-merge a range from a path's own future history; try updating first"
msgstr "Kann keinen Bereich aus der zukünftigen Geschichte des Pfades rückwärts zusammenführen; versuchen Sie zuerst zu aktualisieren"
-#: ../libsvn_client/merge.c:5443
+#: ../libsvn_client/merge.c:5514
#, c-format
msgid ""
"One or more conflicts were produced while merging r%ld:%ld into\n"
@@ -2003,75 +2226,79 @@ msgstr ""
"Lösen Sie alle Konflikte auf und starten Sie die Zusammenführung\n"
"erneut, um die fehlenden Revisionen zusammenzuführen"
-#: ../libsvn_client/merge.c:6258
+#: ../libsvn_client/merge.c:6330
#, c-format
msgid "Invalid mergeinfo detected on '%s', merge tracking not possible"
msgstr "Ungültige Zusammenführungsinformationen in »%s« entdeckt, Zusammenführungsverfolgung nicht möglich"
-#: ../libsvn_client/merge.c:6407
+#: ../libsvn_client/merge.c:6479
msgid "Merge tracking not allowed with missing subtrees; try restoring these items first:\n"
msgstr "Zusammenführungsverfolgung nicht erlaubt bei fehlenden Unterbäumen; versuchen Sie diese Elemente erst wiederherzustellen:\n"
-#: ../libsvn_client/merge.c:7407
+#: ../libsvn_client/merge.c:7481
#, c-format
msgid "Invalid mergeinfo detected on merge target '%s', merge tracking not possible"
msgstr "Ungültige Zusammenführungsinformationen im Zusammenführungsziel »%s« entdeckt, Zusammenführungsverfolgung nicht möglich"
-#: ../libsvn_client/merge.c:9726
+#: ../libsvn_client/merge.c:9799
msgid "Use of two URLs is not compatible with mergeinfo modification"
msgstr "Die Verwendung zweier URLs ist nicht kompatibel mit Änderungen der Zusammenführungsinformationen"
-#: ../libsvn_client/merge.c:9733 ../libsvn_client/merge.c:10068
+#: ../libsvn_client/merge.c:9806 ../libsvn_client/merge.c:10141
msgid "Merge from foreign repository is not compatible with mergeinfo modification"
msgstr "Die Zusammenführung aus fremdem Projektarchiv ist nicht kompatibel mit Änderungen der Zusammenführungsinformationen"
-#: ../libsvn_client/merge.c:10161 ../libsvn_client/merge.c:10304
+#: ../libsvn_client/merge.c:10234 ../libsvn_client/merge.c:10377
#, c-format
msgid "Merge target '%s' does not exist in the working copy"
msgstr "Zusammenführungsziel »%s« ist nicht in der Arbeitskopie enthalten"
-#: ../libsvn_client/merge.c:10184
+#: ../libsvn_client/merge.c:10257
msgid "Cannot determine revision of working copy"
msgstr "Die Revision der Arbeitskopie kann nicht bestimmt werden"
-#: ../libsvn_client/merge.c:10190
+#: ../libsvn_client/merge.c:10263
#, c-format
msgid "Cannot merge into mixed-revision working copy [%ld:%ld]; try updating first"
msgstr "Kann nicht in eine Arbeitskopie mit verschiedenen Revisionen zusammenführen [%ld:%ld], versuchen Sie erst zu aktualisieren"
-#: ../libsvn_client/merge.c:10205
+#: ../libsvn_client/merge.c:10278
msgid "Cannot merge into a working copy with a switched subtree"
msgstr "Kann nicht in eine Arbeitskopie mit umgestelltem Unterbaum zusammenführen"
-#: ../libsvn_client/merge.c:10221
+#: ../libsvn_client/merge.c:10294
msgid "Cannot merge into a working copy that has local modifications"
msgstr "Kann nicht in eine Arbeitskopie mit lokalen Änderungen zusammenführen"
-#: ../libsvn_client/merge.c:10241 ../svn/merge-cmd.c:60
+#: ../libsvn_client/merge.c:10314 ../svn/merge-cmd.c:56
#, c-format
msgid "Invalid merge source '%s'; a working copy path can only be used with a repository revision (a number, a date, or head)"
msgstr "Ungültige Quelle für Zusammenführung »%s«; ein Arbeitskopiepfad kann nur mit einer Revision im Projektarchiv verwendet werden (eine Zahl, ein Datum oder »HEAD«)"
-#: ../libsvn_client/merge.c:10559 ../svn/merge-cmd.c:127
+#: ../libsvn_client/merge.c:10632 ../svn/merge-cmd.c:123
msgid "Merge sources must both be either paths or URLs"
msgstr "Zusammenführungsquellen müssen beide Pfade oder URLs sein"
-#: ../libsvn_client/merge.c:11320 ../libsvn_client/merge.c:11482
-#: ../libsvn_client/merge.c:12369
+#: ../libsvn_client/merge.c:11393 ../libsvn_client/merge.c:11555
+#: ../libsvn_client/merge.c:12451
#, c-format
msgid "'%s@%ld' must be ancestrally related to '%s@%ld'"
msgstr "»%s@%ld« muss eine Vorgängerbeziehung zu »%s@%ld« haben"
-#: ../libsvn_client/merge.c:11432
+#: ../libsvn_client/merge.c:11505
#, c-format
msgid "Neither the reintegrate source nor target can be the root of the repository"
msgstr "Weder die Quelle noch das Ziel der Reintegration darf Wurzel des Projektarchivs sein"
-#: ../libsvn_client/merge.c:11442
+#: ../libsvn_client/merge.c:11515
msgid "Reintegrate merge not possible"
msgstr "Zusammenführung zur Reintegration nicht möglich"
-#: ../libsvn_client/merge.c:11515
+#: ../libsvn_client/merge.c:11585
+msgid " Missing ranges: "
+msgstr " Fehlende Bereiche: "
+
+#: ../libsvn_client/merge.c:11588
#, c-format
msgid ""
"Reintegrate can only be used if revisions %ld through %ld were previously merged from %s to the reintegrate source, but this is not the case:\n"
@@ -2080,145 +2307,235 @@ msgstr ""
"Reintegration kann nur genutzt werden, falls die Revisionen %ld bis %ld vorher von %s in die zu reintegrierende Quelle zusammengeführt wurden, aber dies ist nicht der Fall:\n"
"%s"
-#: ../libsvn_client/merge.c:11577
+#: ../libsvn_client/merge.c:11650
#, c-format
msgid "Can't reintegrate into '%s' because it is locally added and therefore not related to the merge source"
msgstr "Kann nicht nach »%s« reintegrieren, da es lokal hinzugefügt wurde und daher keine Herkunftsbeziehung zur Quelle der Zusammenführung hat"
-#: ../libsvn_client/merge.c:11845
+#: ../libsvn_client/merge.c:11918
msgid "Cannot merge automatically while ignoring mergeinfo"
msgstr "Kann nicht automatisch zusammenführen und dabei Zusammenführungsinformationen ignorieren"
-#: ../libsvn_client/merge.c:12585
+#: ../libsvn_client/merge.c:12673
msgid "The required merge is reintegrate-like, and the record-only option cannot be used with this kind of merge"
msgstr "Die benötigte Zusammenführung ist eine Reintegration, die Option »record-only« kann aber mit dieser Art der Zusammenführung nicht verwendet werden"
-#: ../libsvn_client/merge.c:12591
+#: ../libsvn_client/merge.c:12679
msgid "The required merge is reintegrate-like, and the depth option cannot be used with this kind of merge"
msgstr "Die benötigte Zusammenführung ist eine Reintegration, die Option zur Angabe der Tiefe kann aber mit dieser Art der Zusammenführung nicht verwendet werden"
-#: ../libsvn_client/merge.c:12597
+#: ../libsvn_client/merge.c:12685
msgid "The required merge is reintegrate-like, and the force_delete option cannot be used with this kind of merge"
msgstr "Die benötigte Zusammenführung ist eine Reintegration, die Option »force_delete« kann aber mit dieser Art der Zusammenführung nicht verwendet werden"
-#: ../libsvn_client/mergeinfo.c:1718
+#: ../libsvn_client/mergeinfo.c:1715
msgid "Only depths 'infinity' and 'empty' are currently supported"
msgstr "Nur Tiefenangaben von »infinity« und »empty« werden momentan unterstützt"
-#: ../libsvn_client/patch.c:279
+#: ../libsvn_client/mtcc.c:166
+#, c-format
+msgid "Can't operate on '%s' because '%s' is not a directory"
+msgstr "Kann »%s« nicht bearbeiten da »%s« kein Verzeichnis ist"
+
+#: ../libsvn_client/mtcc.c:319
+#, c-format
+msgid "No origin found for node at '%s'"
+msgstr "Kein Herkunftsknoten gefunden für Knoten in »%s«"
+
+#: ../libsvn_client/mtcc.c:359
+#, c-format
+msgid "No such revision %ld (HEAD is %ld)"
+msgstr "Keine Revision %ld (HEAD ist %ld)"
+
+#: ../libsvn_client/mtcc.c:407
+#, c-format
+msgid "'%s' is not an ancestor of '%s'"
+msgstr "»%s« ist kein Vorgänger von »%s«"
+
+#: ../libsvn_client/mtcc.c:506
+#, c-format
+msgid "Can't add file at '%s'"
+msgstr "Kann Datei »%s« nicht hinzufügen"
+
+#: ../libsvn_client/mtcc.c:538 ../libsvn_client/ra.c:708
+#: ../libsvn_fs_base/lock.c:272 ../libsvn_fs_fs/fs_fs.c:1366
+#: ../libsvn_fs_fs/lock.c:759 ../libsvn_fs_fs/rev_file.c:177
+#: ../libsvn_fs_fs/rev_file.c:189 ../libsvn_fs_x/fs_x.c:690
+#: ../libsvn_fs_x/lock.c:799 ../libsvn_fs_x/rev_file.c:190
+#: ../libsvn_repos/log.c:2357 ../libsvn_repos/log.c:2361
+#, c-format
+msgid "No such revision %ld"
+msgstr "Keine Revision %ld"
+
+#: ../libsvn_client/mtcc.c:560
+#, c-format
+msgid "Can't add node at '%s'"
+msgstr "Kann Knoten »%s« nicht hinzufügen"
+
+#: ../libsvn_client/mtcc.c:587
+#, c-format
+msgid "Can't delete node at '%s' as it does not exist"
+msgstr "Kann Knoten »%s« nicht löschen da er nicht existiert"
+
+#: ../libsvn_client/mtcc.c:604
+#, c-format
+msgid "Can't delete node at '%s'"
+msgstr "Kann Knoten »%s« nicht löschen"
+
+#: ../libsvn_client/mtcc.c:641
+#, c-format
+msgid "Can't create directory at '%s'"
+msgstr "Kann Verzeichnis »%s« nicht erstellen"
+
+#: ../libsvn_client/mtcc.c:779 ../libsvn_client/prop_commands.c:282
+#: ../libsvn_client/prop_commands.c:477
+#, c-format
+msgid "Bad property name: '%s'"
+msgstr "Ungültiger Name für Eigenschaft: »%s«"
+
+#: ../libsvn_client/mtcc.c:783 ../libsvn_client/prop_commands.c:275
+#, c-format
+msgid "Revision property '%s' not allowed in this context"
+msgstr "Revisionseigenschaft »%s« ist in diesem Kontext nicht erlaubt"
+
+#: ../libsvn_client/mtcc.c:788 ../libsvn_client/prop_commands.c:60
+#, c-format
+msgid "'%s' is a wcprop, thus not accessible to clients"
+msgstr "»%s« ist eine AK-Eigenschaft und damit den Clients nicht zugänglich"
+
+#: ../libsvn_client/mtcc.c:798
+msgid "Error normalizing property value"
+msgstr "Fehler beim Normalisieren des Eigenschaftswertes"
+
+#: ../libsvn_client/mtcc.c:833 ../libsvn_client/mtcc.c:856
+#, c-format
+msgid "Can't set properties at not existing '%s'"
+msgstr "Kann Eigenschaften nicht für nicht vorhandenes »%s« setzen"
+
+#: ../libsvn_client/mtcc.c:904
+#, c-format
+msgid "Can't update '%s' because it is not a file"
+msgstr "Kann »%s« nicht aktualisieren, da es keine Datei ist"
+
+#: ../libsvn_client/mtcc.c:915
+#, c-format
+msgid "Can't update file at '%s'"
+msgstr "Kann Datei in »%s« nicht aktualisieren"
+
+#: ../libsvn_client/mtcc.c:980
+#, c-format
+msgid "Can't perform directory operation on '%s' as it is not a directory"
+msgstr "Kann Verzeichnisoperation auf »%s« nicht ausführen, das es kein Verzeichnis ist"
+
+#: ../libsvn_client/mtcc.c:990
+#, c-format
+msgid "Can't perform file operation on '%s' as it is not a file"
+msgstr "Kann Dateioperation auf »%s« nicht ausführen, das es keine Datei ist"
+
+#: ../libsvn_client/mtcc.c:997
+#, c-format
+msgid "Can't open '%s' as it does not exist"
+msgstr "Kann »%s« nicht öffnen, da es nicht existiert"
+
+#: ../libsvn_client/mtcc.c:1389
+#, c-format
+msgid "Can't commit to '%s' because it is not a directory"
+msgstr "Kann nicht nach »%s« übertragen, da es kein Verzeichnis ist"
+
+#: ../libsvn_client/patch.c:284
#, c-format
msgid "Cannot strip %u components from '%s'"
msgstr "Kann nicht %u Komponenten von »%s« entfernen"
-#: ../libsvn_client/patch.c:910
+#: ../libsvn_client/patch.c:918
msgid "Invalid link representation"
msgstr "Ungültige Darstellung für symbolischen Link"
-#: ../libsvn_client/patch.c:3005
+#: ../libsvn_client/patch.c:3238
msgid "strip count must be positive"
msgstr "Anzahl der zu entfernenden Komponenten muss positiv sein"
-#: ../libsvn_client/patch.c:3021 ../libsvn_fs_base/tree.c:3978
-#: ../libsvn_fs_base/tree.c:3983 ../libsvn_fs_fs/tree.c:3066
-#: ../libsvn_fs_fs/tree.c:3071 ../libsvn_ra/compat.c:675
-#: ../libsvn_ra_local/ra_plugin.c:1145
+#: ../libsvn_client/patch.c:3254 ../libsvn_fs_base/tree.c:4083
+#: ../libsvn_fs_base/tree.c:4088 ../libsvn_fs_fs/tree.c:3185
+#: ../libsvn_fs_fs/tree.c:3190 ../libsvn_fs_x/tree.c:3219
+#: ../libsvn_fs_x/tree.c:3224 ../libsvn_ra/compat.c:677
+#: ../libsvn_ra_local/ra_plugin.c:1260
#, c-format
msgid "'%s' is not a file"
msgstr "»%s« ist keine Datei"
-#: ../libsvn_client/patch.c:3033 ../libsvn_wc/util.c:59
+#: ../libsvn_client/patch.c:3266 ../libsvn_wc/util.c:59
#, c-format
msgid "'%s' is not a directory"
msgstr "»%s« ist kein Verzeichnis"
-#: ../libsvn_client/prop_commands.c:60
-#, c-format
-msgid "'%s' is a wcprop, thus not accessible to clients"
-msgstr "»%s« ist eine AK-Eigenschaft und damit den Clients nicht zugänglich"
-
#: ../libsvn_client/prop_commands.c:155
#, c-format
msgid "Property '%s' is not a regular property"
msgstr "Eigenschaft »%s« ist keine reguläre Eigenschaft"
-#: ../libsvn_client/prop_commands.c:266
-#, c-format
-msgid "Revision property '%s' not allowed in this context"
-msgstr "Revisionseigenschaft »%s« ist in diesem Kontext nicht erlaubt"
-
-#: ../libsvn_client/prop_commands.c:273 ../libsvn_client/prop_commands.c:468
-#, c-format
-msgid "Bad property name: '%s'"
-msgstr "Ungültiger Name für Eigenschaft: »%s«"
-
-#: ../libsvn_client/prop_commands.c:301
+#: ../libsvn_client/prop_commands.c:310
msgid "Targets must be working copy paths"
msgstr "Ziele müssen Arbeitskopiepfade sein"
-#: ../libsvn_client/prop_commands.c:362
+#: ../libsvn_client/prop_commands.c:371
msgid "Targets must be URLs"
msgstr "Ziele müssen URLs sein"
-#: ../libsvn_client/prop_commands.c:372
+#: ../libsvn_client/prop_commands.c:381
msgid "Setting property on non-local targets needs a base revision"
msgstr "Das Setzen einer Eigenschaft für ein nicht lokales Ziel benötigt eine Basisrevision"
-#: ../libsvn_client/prop_commands.c:387
+#: ../libsvn_client/prop_commands.c:396
#, c-format
msgid "Setting property '%s' on non-local targets is not supported"
msgstr "Das Setzen der Eigenschaft »%s« für ein nicht lokales Ziel wird nicht unterstützt"
-#: ../libsvn_client/prop_commands.c:415
+#: ../libsvn_client/prop_commands.c:424
#, c-format
msgid "revprop '%s' in r%ld is unexpectedly absent in repository (maybe someone else deleted it?)"
msgstr "Revisionseigenschaft »%s« in r%ld fehlt unerwarteterweise im Projektarchiv (eventuell hat jemand anderer sie gelöscht?)"
-#: ../libsvn_client/prop_commands.c:424
+#: ../libsvn_client/prop_commands.c:433
#, c-format
msgid "revprop '%s' in r%ld has unexpected value in repository (maybe someone else changed it?)"
msgstr "Revisionseigenschaft »%s« in r%ld hat einen unerwarteten Wert im Projektarchiv (eventuell hat jemand anderer sie geändert?)"
-#: ../libsvn_client/prop_commands.c:432
+#: ../libsvn_client/prop_commands.c:441
#, c-format
msgid "revprop '%s' in r%ld is unexpectedly present in repository (maybe someone else set it?)"
msgstr "Revisionseigenschaft »%s« in r%ld ist unerwarteterweise im Projektarchiv vorhanden (eventuell hat jemand anderer sie gesetzt?)"
-#: ../libsvn_client/prop_commands.c:463
+#: ../libsvn_client/prop_commands.c:472
msgid "Author name should not contain a newline; value will not be set unless forced"
msgstr "Der Autorenname sollte keinen Zeilenvorschub enthalten; Wert kann nur mittels »force« gesetzt werden"
-#: ../libsvn_client/prop_commands.c:577
+#: ../libsvn_client/prop_commands.c:565
#, c-format
msgid "'%s' does not exist in revision %ld"
msgstr "»%s« existiert nicht in Revision %ld"
-#: ../libsvn_client/prop_commands.c:583 ../libsvn_client/prop_commands.c:1102
-#: ../libsvn_wc/crop.c:168
+#: ../libsvn_client/prop_commands.c:571 ../libsvn_client/prop_commands.c:1081
#, c-format
msgid "Unknown node kind for '%s'"
msgstr "»%s« hat einen unbekannten Knotentyp"
-#: ../libsvn_client/ra.c:161
+#: ../libsvn_client/ra.c:164
#, c-format
msgid "Attempt to set wcprop '%s' on '%s' in a non-commit operation"
msgstr "Versuch, wcprop »%s« auf »%s« in einer Nicht-Übertragungs-Operation zu setzen"
-#: ../libsvn_client/ra.c:415
+#: ../libsvn_client/ra.c:446
#, c-format
msgid "Redirect cycle detected for URL '%s'"
msgstr "Endlosschleife bei der Umleitung der URL »%s« entdeckt"
-#: ../libsvn_client/ra.c:501 ../libsvn_client/ra.c:812
-#, c-format
-msgid "'%s' has no URL"
-msgstr "»%s« hat keine URL"
-
-#: ../libsvn_client/ra.c:679 ../libsvn_ra/compat.c:395
+#: ../libsvn_client/ra.c:734 ../libsvn_ra/compat.c:397
#, c-format
msgid "Unable to find repository location for '%s' in revision %ld"
msgstr "Kann »%s« in Revision %ld nicht im Projektarchiv finden"
-#: ../libsvn_client/ra.c:691
+#: ../libsvn_client/ra.c:746
#, c-format
msgid "The location for '%s' for revision %ld does not exist in the repository or refers to an unrelated object"
msgstr "»%s« für Revision %ld existiert nicht im Projektarchiv oder verweist auf ein nicht verwandtes Objekt"
@@ -2233,29 +2550,29 @@ msgstr "»%s« ist nicht die Basis des Projektarchivs"
msgid "The repository at '%s' has uuid '%s', but the WC has '%s'"
msgstr "Das Projektarchiv in »%s« hat die UUID »%s«, aber die Arbeitskopie hat »%s«"
-#: ../libsvn_client/repos_diff.c:931 ../libsvn_wc/externals.c:570
+#: ../libsvn_client/repos_diff.c:935 ../libsvn_wc/externals.c:625
#, c-format
msgid "Base checksum mismatch for '%s'"
msgstr "Basis-Prüfsummenfehler bei »%s«"
-#: ../libsvn_client/revisions.c:113 ../libsvn_client/revisions.c:138
+#: ../libsvn_client/revisions.c:114 ../libsvn_client/revisions.c:139
#, c-format
msgid "Path '%s' has no committed revision"
msgstr "Pfad »%s« hat keine übertragene Revision"
-#: ../libsvn_client/revisions.c:166
+#: ../libsvn_client/revisions.c:167
#, c-format
msgid "Unrecognized revision type requested for '%s'"
msgstr "Unbekannter Revisionstyp für »%s« angefragt"
-#: ../libsvn_client/status.c:407 ../libsvn_client/status.c:586
+#: ../libsvn_client/status.c:422 ../libsvn_client/status.c:601
#: ../libsvn_wc/lock.c:564 ../libsvn_wc/lock.c:856 ../libsvn_wc/lock.c:1542
-#: ../libsvn_wc/wc_db.c:13269 ../libsvn_wc/wc_db_wcroot.c:630
+#: ../libsvn_wc/wc_db.c:13554 ../libsvn_wc/wc_db_wcroot.c:722
#, c-format
msgid "'%s' is not a working copy"
msgstr "»%s« ist keine Arbeitskopie"
-#: ../libsvn_client/status.c:454
+#: ../libsvn_client/status.c:469
#, c-format
msgid "Entry '%s' has no URL"
msgstr "Eintrag »%s« hat keine URL"
@@ -2275,8 +2592,8 @@ msgstr "Kann »%s« nicht umplatzieren da es noch nicht im Projektarchiv ist"
msgid "Directory '%s' has no URL"
msgstr "Verzeichnis »%s« hat keine URL"
-#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:236
-#: ../libsvn_ra_local/ra_plugin.c:326 ../libsvn_wc/update_editor.c:4870
+#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:235
+#: ../libsvn_ra_local/ra_plugin.c:325 ../libsvn_wc/update_editor.c:4857
#, c-format
msgid ""
"'%s'\n"
@@ -2287,242 +2604,237 @@ msgstr ""
"ist nicht das selbe Projektarchiv wie\n"
"»%s«"
-#: ../libsvn_client/switch.c:242
+#: ../libsvn_client/switch.c:240
#, c-format
msgid "'%s' shares no common ancestry with '%s'"
msgstr "»%s« hat keinen Vorgänger gemeinsam mit »%s«"
-#: ../libsvn_client/util.c:336
+#: ../libsvn_client/update.c:762
+msgid "None of the targets are working copies"
+msgstr "Keines der Ziele ist eine Arbeitskopie"
+
+#: ../libsvn_client/util.c:342
#, c-format
msgid "Cannot mix repository and working copy targets"
msgstr "Ziele aus dem Projektarchiv und einer Arbeitskopie können nicht gemischt werden"
-#: ../libsvn_delta/svndiff.c:175
-msgid "Compression of svndiff data failed"
-msgstr "Komprimierung der svndiff-Daten schlug fehl"
-
-#: ../libsvn_delta/svndiff.c:538
-msgid "Decompression of svndiff data failed: no size"
-msgstr "Dekomprimierung der svndiff-Daten schlug fehl: Größe fehlt"
-
-#: ../libsvn_delta/svndiff.c:541
-msgid "Decompression of svndiff data failed: size too large"
-msgstr "Dekomprimierung der svndiff-Daten schlug fehl: Größe zu groß"
-
-#: ../libsvn_delta/svndiff.c:565
-msgid "Decompression of svndiff data failed"
-msgstr "Dekomprimierung der svndiff-Daten schlug fehl"
-
-#: ../libsvn_delta/svndiff.c:572
-msgid "Size of uncompressed data does not match stored original length"
-msgstr "Die Größe der unkomprimierten Daten entspricht nicht der gespeicherten Originallänge"
-
-#: ../libsvn_delta/svndiff.c:648
+#: ../libsvn_delta/svndiff.c:436
#, c-format
msgid "Invalid diff stream: insn %d cannot be decoded"
msgstr "Ungültiger Diff-Strom: insn %d kann nicht dekodiert werden"
-#: ../libsvn_delta/svndiff.c:652
+#: ../libsvn_delta/svndiff.c:440
#, c-format
msgid "Invalid diff stream: insn %d has length zero"
msgstr "Ungültiger Diff-Strom: insn %d hat Länge Null"
-#: ../libsvn_delta/svndiff.c:656
+#: ../libsvn_delta/svndiff.c:444
#, c-format
msgid "Invalid diff stream: insn %d overflows the target view"
msgstr "Ungültiger Diff-Strom: insn %d läuft in die Zielansicht über"
-#: ../libsvn_delta/svndiff.c:665
+#: ../libsvn_delta/svndiff.c:453
#, c-format
msgid "Invalid diff stream: [src] insn %d overflows the source view"
msgstr "Ungültiger Diff-Strom: [Quelle] insn %d läuft in die Quellansicht über"
-#: ../libsvn_delta/svndiff.c:672
+#: ../libsvn_delta/svndiff.c:460
#, c-format
msgid "Invalid diff stream: [tgt] insn %d starts beyond the target view position"
msgstr "Ungültiger Diff-Strom: [Ziel] insn %d startet hinter der Zielposition"
-#: ../libsvn_delta/svndiff.c:679
+#: ../libsvn_delta/svndiff.c:467
#, c-format
msgid "Invalid diff stream: [new] insn %d overflows the new data section"
msgstr "Ungültiger Diff-Strom: [Neu] insn %d läuft in die neue Datensektion über"
-#: ../libsvn_delta/svndiff.c:689
+#: ../libsvn_delta/svndiff.c:477
msgid "Delta does not fill the target window"
msgstr "Delta füllt das Zielfenster nicht"
-#: ../libsvn_delta/svndiff.c:692
+#: ../libsvn_delta/svndiff.c:480
msgid "Delta does not contain enough new data"
msgstr "Delta enthält nicht genügend neue Daten"
-#: ../libsvn_delta/svndiff.c:801
+#: ../libsvn_delta/svndiff.c:608
msgid "Svndiff has invalid header"
msgstr "Svndiff-Daten enthalten ungültigen Kopf"
-#: ../libsvn_delta/svndiff.c:857 ../libsvn_delta/svndiff.c:1039
+#: ../libsvn_delta/svndiff.c:664 ../libsvn_delta/svndiff.c:853
msgid "Svndiff contains a too-large window"
msgstr "Svndiff-Daten enthalten ein zu großes Fenster"
-#: ../libsvn_delta/svndiff.c:864 ../libsvn_delta/svndiff.c:1046
+#: ../libsvn_delta/svndiff.c:671 ../libsvn_delta/svndiff.c:860
msgid "Svndiff contains corrupt window header"
msgstr "Svndiff-Daten enthalten defekte Fenster-Kopfdaten"
-#: ../libsvn_delta/svndiff.c:873
+#: ../libsvn_delta/svndiff.c:680
msgid "Svndiff has backwards-sliding source views"
msgstr "Svndiff-Daten enthalten rückwärts gleitenden Blick auf Quellen"
-#: ../libsvn_delta/svndiff.c:930 ../libsvn_delta/svndiff.c:987
-#: ../libsvn_delta/svndiff.c:1068
+#: ../libsvn_delta/svndiff.c:737 ../libsvn_delta/svndiff.c:794
+#: ../libsvn_delta/svndiff.c:882
msgid "Unexpected end of svndiff input"
msgstr "Unerwartetes Ende der Svndiff-Eingangsdaten"
-#: ../libsvn_diff/diff_file.c:184
+#: ../libsvn_diff/diff_file.c:186
#, c-format
msgid "File '%s' is too large to be read in to memory"
msgstr "Datei »%s« ist zu groß um in den Speicher gelesen zu werden"
-#: ../libsvn_diff/diff_file.c:1106
+#: ../libsvn_diff/diff_file.c:1104
#, c-format
msgid "The file '%s' changed unexpectedly during diff"
msgstr "Die Datei »%s« veränderte sich unerwartet während des Vergleichs"
-#: ../libsvn_diff/diff_file.c:1276
+#: ../libsvn_diff/diff_file.c:1278
msgid "Error in options to internal diff"
msgstr "Fehler in Optionen für internes Vergleichsprogramm"
-#: ../libsvn_diff/diff_file.c:1302
+#: ../libsvn_diff/diff_file.c:1307
#, c-format
msgid "Invalid argument '%s' in diff options"
msgstr "Ungültiges Argument »%s« in Vergleichsoptionen"
#. Order of date components can be different in different languages
-#: ../libsvn_diff/diff_file.c:1799
+#: ../libsvn_diff/diff_file.c:1806
msgid "%a %b %e %H:%M:%S %Y"
msgstr "%a %e. %b %H:%M:%S %Y"
-#: ../libsvn_diff/diff_file.c:1875 ../libsvn_diff/diff_file.c:1891
+#: ../libsvn_diff/diff_file.c:1887 ../libsvn_diff/diff_file.c:1903
#, c-format
msgid "Path '%s' must be inside the directory '%s'"
msgstr "Pfad »%s« muss innerhalb des Verzeichnisses »%s« sein"
-#: ../libsvn_diff/diff_file.c:2409
+#: ../libsvn_diff/diff_file.c:2449
#, c-format
msgid "Failed to delete mmap '%s'"
msgstr "Konnte mmap »%s« nicht löschen"
-#: ../libsvn_diff/util.c:463
+#: ../libsvn_diff/util.c:477
#, c-format
msgid " Reverse-merged %s:r%s%s"
msgstr " Rückgängiges Zusammenführen: %s:r%s%s"
-#: ../libsvn_diff/util.c:480
+#: ../libsvn_diff/util.c:494
#, c-format
msgid " Merged %s:r%s%s"
msgstr " Zusammengeführt %s:r%s%s"
-#: ../libsvn_fs/editor.c:219
+#: ../libsvn_fs/editor.c:217
#, c-format
msgid "Revision for modifying '%s' is required"
msgstr "Revision für Bearbeitung von »%s« erforderlich"
-#: ../libsvn_fs/editor.c:228
+#: ../libsvn_fs/editor.c:226
#, c-format
msgid "'%s' is out of date; try updating"
msgstr "»%s« ist veraltet; versuchen Sie zu aktualisieren"
-#: ../libsvn_fs/editor.c:265
+#: ../libsvn_fs/editor.c:258
#, c-format
msgid "'%s' has been modified since the commit began (restart the commit)"
msgstr "»%s« wurde seit dem Beginn der Übertragung verändert (Übertragung neu starten)"
-#: ../libsvn_fs/editor.c:323
+#: ../libsvn_fs/editor.c:316
#, c-format
msgid "'%s' already exists, so may be out of date; try updating"
msgstr "»%s« existiert schon, kann also veraltet sein; versuchen Sie zu aktualisieren"
-#: ../libsvn_fs/editor.c:456
+#: ../libsvn_fs/editor.c:449
msgid "The filesystem does not support 'absent' nodes"
msgstr "Das Dateisystem unterstützt keine »absent« Knoten"
-#: ../libsvn_fs/fs-loader.c:121
+#: ../libsvn_fs/fs-loader.c:140
#, c-format
msgid "Invalid name for FS type '%s'"
msgstr "Ungültiger Name für Dateisystemtyp »%s«"
-#: ../libsvn_fs/fs-loader.c:138 ../libsvn_ra/ra_loader.c:161
-#: ../libsvn_ra/ra_loader.c:174
+#: ../libsvn_fs/fs-loader.c:157 ../libsvn_ra/ra_loader.c:163
+#: ../libsvn_ra/ra_loader.c:176
#, c-format
msgid "'%s' does not define '%s()'"
msgstr "»%s« definiert »%s()« nicht"
-#: ../libsvn_fs/fs-loader.c:164
+#: ../libsvn_fs/fs-loader.c:190
#, c-format
msgid "Failed to load module for FS type '%s'"
msgstr "Konnte Modul für Dateisystemtyp »%s« nicht laden"
-#: ../libsvn_fs/fs-loader.c:186
+#: ../libsvn_fs/fs-loader.c:211
#, c-format
msgid "Mismatched FS module version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "Versionen in Dateisystemmodul »%s« stimmen nicht überein: gefunden %d.%d.%d%s, erwartet %d.%d.%d%s"
-#: ../libsvn_fs/fs-loader.c:266
+#: ../libsvn_fs/fs-loader.c:301
#, c-format
msgid "Unknown FS type '%s'"
msgstr "Unbekannter Dateisystemtyp »%s«"
-#: ../libsvn_fs/fs-loader.c:389
+#: ../libsvn_fs/fs-loader.c:450
#, c-format
msgid "Path '%s' is not in UTF-8"
msgstr "Pfad »%s« ist kein UTF-8"
-#: ../libsvn_fs/fs-loader.c:397
+#: ../libsvn_fs/fs-loader.c:458
#, c-format
msgid "Path '%s' contains '.' or '..' element"
msgstr "Pfad »%s« enthält ein Element ».« oder »..«"
-#: ../libsvn_fs/fs-loader.c:554 ../libsvn_repos/repos.c:1982
+#: ../libsvn_fs/fs-loader.c:470 ../libsvn_fs_fs/tree.c:2413
+#: ../libsvn_subr/path.c:1229
+#, c-format
+msgid "Invalid control character '0x%02x' in path '%s'"
+msgstr "Ungültiges Steuerzeichen »0x%02x« in Pfad »%s«"
+
+#: ../libsvn_fs/fs-loader.c:655 ../libsvn_repos/repos.c:1976
msgid "Hotcopy source and destination are equal"
msgstr "Quelle und Ziel für Kopie im laufenden Betrieb sind gleich"
-#: ../libsvn_fs/fs-loader.c:564
+#: ../libsvn_fs/fs-loader.c:665
#, c-format
msgid "'%s' already exists and is a file"
msgstr "»%s« existiert bereits und ist eine Datei"
-#: ../libsvn_fs/fs-loader.c:569
+#: ../libsvn_fs/fs-loader.c:670
#, c-format
msgid "'%s' already exists and has an unknown node kind"
msgstr "»%s« existiert bereits und hat einen unbekannten Knotentyp"
-#: ../libsvn_fs/fs-loader.c:587
+#: ../libsvn_fs/fs-loader.c:688
#, c-format
msgid "The filesystem type of the hotcopy source ('%s') does not match the filesystem type of the hotcopy destination ('%s')"
msgstr "Der Dateisystemtyp der Quelle für die Kopie im laufenden Betrieb (»%s«) stimmt nicht mit dem Dateisystemtyp des Ziels der Kopie im laufenden Betrieb (»%s«) überein"
-#: ../libsvn_fs/fs-loader.c:1395
+#: ../libsvn_fs/fs-loader.c:959 ../libsvn_fs/fs-loader.c:977
+#, c-format
+msgid "Attempt to modify internal transaction property '%s'"
+msgstr "Versuch, eine interne Transaktionseigenschaft »%s« zu schreiben"
+
+#: ../libsvn_fs/fs-loader.c:1606
#, c-format
msgid "Malformed UUID '%s'"
msgstr "Fehlerhafte UUID »%s«"
-#: ../libsvn_fs/fs-loader.c:1423
+#: ../libsvn_fs/fs-loader.c:1635
+msgid "Negative expiration date passed to svn_fs_lock"
+msgstr "Negatives Ablaufdatum an svn_fs_lock übergeben"
+
+#: ../libsvn_fs/fs-loader.c:1650
#, c-format
msgid "Lock token URI '%s' has bad scheme; expected '%s'"
msgstr "URI der Sperrmarke »%s« hat fehlerhaften Schema, erwartete »%s«"
-#: ../libsvn_fs/fs-loader.c:1430
+#: ../libsvn_fs/fs-loader.c:1659
#, c-format
-msgid "Lock token '%s' is not ASCII at byte %u"
-msgstr "Sperrmarke »%s« besteht nicht aus ASCII bei Byte %u"
+msgid "Lock token '%s' is not ASCII or is a control character at byte %u"
+msgstr "Sperrmarke »%s« besteht nicht aus ASCII oder hat ein Steuerzeichen bei Byte %u"
-#: ../libsvn_fs/fs-loader.c:1437
+#: ../libsvn_fs/fs-loader.c:1667
#, c-format
msgid "Lock token URI '%s' is not XML-safe"
msgstr "URI der Sperrmarke »%s« ist nicht sicher für XML"
-#: ../libsvn_fs/fs-loader.c:1444
-msgid "Negative expiration date passed to svn_fs_lock"
-msgstr "Negatives Ablaufdatum an svn_fs_lock übergeben"
-
#: ../libsvn_fs_base/bdb/bdb-err.c:104
#, c-format
msgid "Berkeley DB error for filesystem '%s' while %s:\n"
@@ -2536,40 +2848,44 @@ msgstr "Erzeuge Änderungen"
msgid "deleting changes"
msgstr "Lösche Änderungen"
-#: ../libsvn_fs_base/bdb/changes-table.c:150 ../libsvn_fs_fs/fs_fs.c:5911
+#: ../libsvn_fs_base/bdb/changes-table.c:170 ../libsvn_fs_fs/transaction.c:665
+#: ../libsvn_fs_x/transaction.c:941
msgid "Missing required node revision ID"
msgstr "Für den Knoten fehlt eine erforderliche Revisions ID"
-#: ../libsvn_fs_base/bdb/changes-table.c:161 ../libsvn_fs_fs/fs_fs.c:5921
+#: ../libsvn_fs_base/bdb/changes-table.c:181 ../libsvn_fs_fs/transaction.c:675
+#: ../libsvn_fs_x/transaction.c:951
msgid "Invalid change ordering: new node revision ID without delete"
msgstr "Ungültige Reihenfolge bei Änderung: Neue Knoten Revisions ID ohne Löschen"
-#: ../libsvn_fs_base/bdb/changes-table.c:171 ../libsvn_fs_fs/fs_fs.c:5932
+#: ../libsvn_fs_base/bdb/changes-table.c:191 ../libsvn_fs_fs/transaction.c:686
+#: ../libsvn_fs_x/transaction.c:962
msgid "Invalid change ordering: non-add change on deleted path"
msgstr "Ungültige Reihenfolge bei Änderung: Nicht-hinzufügende Änderung auf gelöschtem Pfad"
-#: ../libsvn_fs_base/bdb/changes-table.c:180 ../libsvn_fs_fs/fs_fs.c:5941
+#: ../libsvn_fs_base/bdb/changes-table.c:200 ../libsvn_fs_fs/transaction.c:695
+#: ../libsvn_fs_x/transaction.c:971
msgid "Invalid change ordering: add change on preexisting path"
msgstr "Ungültige Reihenfolge bei Änderung: Hinzufügende Änderung auf schon vorhandenem Pfad"
-#: ../libsvn_fs_base/bdb/changes-table.c:272
-#: ../libsvn_fs_base/bdb/changes-table.c:395
+#: ../libsvn_fs_base/bdb/changes-table.c:296
+#: ../libsvn_fs_base/bdb/changes-table.c:420
msgid "creating cursor for reading changes"
msgstr "Erzeuge Cursor zum Lesen der Änderungen"
-#: ../libsvn_fs_base/bdb/changes-table.c:297
-#: ../libsvn_fs_base/bdb/changes-table.c:416
+#: ../libsvn_fs_base/bdb/changes-table.c:321
+#: ../libsvn_fs_base/bdb/changes-table.c:441
#, c-format
msgid "Error reading changes for key '%s'"
msgstr "Fehler beim Lesen der Änderungen für Schlüssel »%s«"
-#: ../libsvn_fs_base/bdb/changes-table.c:356
-#: ../libsvn_fs_base/bdb/changes-table.c:439
+#: ../libsvn_fs_base/bdb/changes-table.c:381
+#: ../libsvn_fs_base/bdb/changes-table.c:464
msgid "fetching changes"
msgstr "Hole Änderungen"
-#: ../libsvn_fs_base/bdb/changes-table.c:369
-#: ../libsvn_fs_base/bdb/changes-table.c:452
+#: ../libsvn_fs_base/bdb/changes-table.c:394
+#: ../libsvn_fs_base/bdb/changes-table.c:477
msgid "closing changes cursor"
msgstr "Schließe Änderungscursor"
@@ -2893,17 +3209,19 @@ msgstr "DB beschädigt: Erste Revision ist nicht »0« in Dateisystem »%s«"
msgid "Attempted to get entries of a non-directory node"
msgstr "Versuchte, Einträge eines *nicht* Verzeichnisknotens zu holen"
-#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:372
+#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:377
+#: ../libsvn_fs_x/dag.c:448
#, c-format
msgid "Attempted to create a node with an illegal name '%s'"
msgstr "Versuchte, Knoten mit illegalem Namen »%s« anzulegen"
-#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:378
+#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:383
+#: ../libsvn_fs_x/dag.c:454
msgid "Attempted to create entry in non-directory parent"
msgstr "Versuchte, Eintrag in einem *nicht* Verzeichnisknoten anzulegen"
#: ../libsvn_fs_base/dag.c:473 ../libsvn_fs_base/dag.c:737
-#: ../libsvn_fs_fs/dag.c:384
+#: ../libsvn_fs_fs/dag.c:389 ../libsvn_fs_x/dag.c:460
#, c-format
msgid "Attempted to clone child of non-mutable node"
msgstr "Versuchte, Unterknoten eines nicht-veränderlichen Knotens zu klonen"
@@ -2913,11 +3231,13 @@ msgstr "Versuchte, Unterknoten eines nicht-veränderlichen Knotens zu klonen"
msgid "Attempted to create entry that already exists"
msgstr "Versuchte, Eintrag anzulegen, der bereits existiert"
-#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:462
+#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_x/dag.c:523
msgid "Attempted to set entry in non-directory node"
msgstr "Versuchte, Eintrag in einem *nicht* Verzeichnisknoten zu setzen"
-#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:474
+#: ../libsvn_fs_x/dag.c:529
msgid "Attempted to set entry in immutable node"
msgstr "Versuchte, Eintrag in einem nicht-veränderlichen Knoten zu setzen"
@@ -2957,57 +3277,57 @@ msgstr "Löschen schlug fehl: Verzeichnis hat keinen Eintrag »%s«"
msgid "Attempted removal of immutable node"
msgstr "Versuchte, einen nicht-veränderlichen Knoten zu entfernen"
-#: ../libsvn_fs_base/dag.c:1088
+#: ../libsvn_fs_base/dag.c:1090
#, c-format
msgid "Attempted to get textual contents of a *non*-file node"
msgstr "Versuchte, den Textinhalt eines *nicht* Dateiknotens zu holen"
-#: ../libsvn_fs_base/dag.c:1121
+#: ../libsvn_fs_base/dag.c:1123
#, c-format
msgid "Attempted to get length of a *non*-file node"
msgstr "Versuchte, die Länge eines *nicht* Dateiknotens zu holen"
-#: ../libsvn_fs_base/dag.c:1148
+#: ../libsvn_fs_base/dag.c:1150
#, c-format
msgid "Attempted to get checksum of a *non*-file node"
msgstr "Versuchte, die Prüfsumme eines *nicht* Dateiknotens zu holen"
-#: ../libsvn_fs_base/dag.c:1187 ../libsvn_fs_base/dag.c:1244
+#: ../libsvn_fs_base/dag.c:1189 ../libsvn_fs_base/dag.c:1246
#, c-format
msgid "Attempted to set textual contents of a *non*-file node"
msgstr "Versuchte, den Textinhalt eines *nicht* Dateiknotens zu setzen"
-#: ../libsvn_fs_base/dag.c:1193 ../libsvn_fs_base/dag.c:1250
+#: ../libsvn_fs_base/dag.c:1195 ../libsvn_fs_base/dag.c:1252
#, c-format
msgid "Attempted to set textual contents of an immutable node"
msgstr "Versuchte, den Textinhalt eines nicht-veränderlichen Knotens zu setzen"
-#: ../libsvn_fs_base/dag.c:1279 ../libsvn_fs_base/reps-strings.c:829
+#: ../libsvn_fs_base/dag.c:1281 ../libsvn_fs_base/reps-strings.c:829
#, c-format
msgid "Checksum mismatch on representation '%s'"
msgstr "Prüfsummenfehler in Darstellung »%s«"
-#: ../libsvn_fs_base/dag.c:1373
+#: ../libsvn_fs_base/dag.c:1375
#, c-format
msgid "Attempted to open non-existent child node '%s'"
msgstr "Versuchte, nicht existierenden Unterknoten »%s« zu öffnen"
-#: ../libsvn_fs_base/dag.c:1379
+#: ../libsvn_fs_base/dag.c:1381
#, c-format
msgid "Attempted to open node with an illegal name '%s'"
msgstr "Versuchte, einen Knoten mit illegalem Namen »%s« zu öffnen"
-#: ../libsvn_fs_base/dag.c:1700
+#: ../libsvn_fs_base/dag.c:1707
#, c-format
msgid "Attempted merge tracking info change on immutable node"
msgstr "Versuchte, die Informationen zur Zusammenführungsverfolgung eines nicht-veränderlichen Knotens zu ändern"
-#: ../libsvn_fs_base/dag.c:1740
+#: ../libsvn_fs_base/dag.c:1747
#, c-format
msgid "Attempted mergeinfo count change on immutable node"
msgstr "Versuchte, die Anzahl der Zusammenführungsinformationen eines nicht-veränderlichen Knoten zu ändern"
-#: ../libsvn_fs_base/dag.c:1752
+#: ../libsvn_fs_base/dag.c:1759
#, c-format
msgid "Invalid value (%%%s) for node revision mergeinfo count"
msgstr "Ungültiger Wert (%%%s) für Knotenrevisions-Zusammenführungszähler"
@@ -3017,7 +3337,8 @@ msgstr "Ungültiger Wert (%%%s) für Knotenrevisions-Zusammenführungszähler"
msgid "Corrupt filesystem revision %ld in filesystem '%s'"
msgstr "Beschädigte Dateisystemrevision %ld in Dateisystem »%s«"
-#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/fs_fs.c:2268
+#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/cached_data.c:276
+#: ../libsvn_fs_x/cached_data.c:275
#, c-format
msgid "Reference to non-existent node '%s' in filesystem '%s'"
msgstr "Verweis auf einen nicht existierenden Knoten »%s« in Dateisystem »%s«"
@@ -3077,151 +3398,151 @@ msgstr "Kein Datensatz in der »node-origins«-Tabelle für Knoten-ID »%s« im
msgid "No record in 'checksum-reps' table for checksum '%s' in filesystem '%s'"
msgstr "Kein Datensatz in der »checksum-reps«-Tabelle für Prüfsumme »%s« im Dateisystem »%s«"
-#: ../libsvn_fs_base/fs.c:89
+#: ../libsvn_fs_base/fs.c:87
#, c-format
msgid "Bad database version: got %d.%d.%d, should be at least %d.%d.%d"
msgstr "Falsche Datenbankversion: %d.%d.%d, sollte mindestens %d.%d.%d sein"
-#: ../libsvn_fs_base/fs.c:100
+#: ../libsvn_fs_base/fs.c:98
#, c-format
msgid "Bad database version: compiled with %d.%d.%d, running against %d.%d.%d"
msgstr "Falsche Datenbankversion: Übersetzt mit %d.%d.%d, läuft mit %d.%d.%d"
-#: ../libsvn_fs_base/fs.c:190
+#: ../libsvn_fs_base/fs.c:188
#, c-format
msgid "Berkeley DB error for filesystem '%s' while closing environment:\n"
msgstr "Berkeley-DB-Fehler für Dateisystem »%s« beim Schließen der Umgebung:\n"
-#: ../libsvn_fs_base/fs.c:553
+#: ../libsvn_fs_base/fs.c:607
#, c-format
msgid "Berkeley DB error for filesystem '%s' while creating environment:\n"
msgstr "Berkeley-DB-Fehler für Dateisystem »%s« beim Erzeugen der Umgebung:\n"
-#: ../libsvn_fs_base/fs.c:559
+#: ../libsvn_fs_base/fs.c:613
#, c-format
msgid "Berkeley DB error for filesystem '%s' while opening environment:\n"
msgstr "Berkeley-DB-Fehler für Dateisystem »%s« beim Öffnen der Umgebung:\n"
-#: ../libsvn_fs_base/fs.c:574
+#: ../libsvn_fs_base/fs.c:628
msgid "creating 'nodes' table"
msgstr "Erzeuge Tabelle »nodes« "
-#: ../libsvn_fs_base/fs.c:575
+#: ../libsvn_fs_base/fs.c:629
msgid "opening 'nodes' table"
msgstr "Öffne Tabelle »nodes«"
-#: ../libsvn_fs_base/fs.c:580
+#: ../libsvn_fs_base/fs.c:634
msgid "creating 'revisions' table"
msgstr "Erzeuge Tabelle »revisions«"
-#: ../libsvn_fs_base/fs.c:581
+#: ../libsvn_fs_base/fs.c:635
msgid "opening 'revisions' table"
msgstr "Öffne Tabelle »revisions«"
-#: ../libsvn_fs_base/fs.c:586
+#: ../libsvn_fs_base/fs.c:640
msgid "creating 'transactions' table"
msgstr "Erzeuge Tabelle »transactions«"
-#: ../libsvn_fs_base/fs.c:587
+#: ../libsvn_fs_base/fs.c:641
msgid "opening 'transactions' table"
msgstr "Öffne Tabelle »transactions«"
-#: ../libsvn_fs_base/fs.c:592
+#: ../libsvn_fs_base/fs.c:646
msgid "creating 'copies' table"
msgstr "Erzeuge Tabelle »copies«"
-#: ../libsvn_fs_base/fs.c:593
+#: ../libsvn_fs_base/fs.c:647
msgid "opening 'copies' table"
msgstr "Öffne Tabelle »copies«"
-#: ../libsvn_fs_base/fs.c:598
+#: ../libsvn_fs_base/fs.c:652
msgid "creating 'changes' table"
msgstr "Erzeuge Tabelle »changes«"
-#: ../libsvn_fs_base/fs.c:599
+#: ../libsvn_fs_base/fs.c:653
msgid "opening 'changes' table"
msgstr "Öffne Tabelle »changes«"
-#: ../libsvn_fs_base/fs.c:604
+#: ../libsvn_fs_base/fs.c:658
msgid "creating 'representations' table"
msgstr "Erzeuge Tabelle »representations«"
-#: ../libsvn_fs_base/fs.c:605
+#: ../libsvn_fs_base/fs.c:659
msgid "opening 'representations' table"
msgstr "Öffne Tabelle »representations«"
-#: ../libsvn_fs_base/fs.c:610
+#: ../libsvn_fs_base/fs.c:664
msgid "creating 'strings' table"
msgstr "Erzeuge Tabelle »strings«"
-#: ../libsvn_fs_base/fs.c:611
+#: ../libsvn_fs_base/fs.c:665
msgid "opening 'strings' table"
msgstr "Öffne Tabelle »strings«"
-#: ../libsvn_fs_base/fs.c:616
+#: ../libsvn_fs_base/fs.c:670
msgid "creating 'uuids' table"
msgstr "Erzeuge Tabelle »uuids«"
-#: ../libsvn_fs_base/fs.c:617
+#: ../libsvn_fs_base/fs.c:671
msgid "opening 'uuids' table"
msgstr "Öffne Tabelle »uuids«"
-#: ../libsvn_fs_base/fs.c:622
+#: ../libsvn_fs_base/fs.c:676
msgid "creating 'locks' table"
msgstr "Erzeuge Tabelle »locks«"
-#: ../libsvn_fs_base/fs.c:623
+#: ../libsvn_fs_base/fs.c:677
msgid "opening 'locks' table"
msgstr "Öffne Tabelle »locks«"
-#: ../libsvn_fs_base/fs.c:628
+#: ../libsvn_fs_base/fs.c:682
msgid "creating 'lock-tokens' table"
msgstr "Erzeuge Tabelle »lock-tokens«"
-#: ../libsvn_fs_base/fs.c:629
+#: ../libsvn_fs_base/fs.c:683
msgid "opening 'lock-tokens' table"
msgstr "Öffne Tabelle »lock-tokens«"
-#: ../libsvn_fs_base/fs.c:637
+#: ../libsvn_fs_base/fs.c:691
msgid "creating 'node-origins' table"
msgstr "Erzeuge Tabelle »node-origins«"
-#: ../libsvn_fs_base/fs.c:638
+#: ../libsvn_fs_base/fs.c:692
msgid "opening 'node-origins' table"
msgstr "Öffne Tabelle »node-origin«"
-#: ../libsvn_fs_base/fs.c:647
+#: ../libsvn_fs_base/fs.c:701
msgid "creating 'miscellaneous' table"
msgstr "Erzeuge Tabelle »miscellaneous«"
-#: ../libsvn_fs_base/fs.c:648
+#: ../libsvn_fs_base/fs.c:702
msgid "opening 'miscellaneous' table"
msgstr "Öffne Tabelle »miscellaneous«"
-#: ../libsvn_fs_base/fs.c:657
+#: ../libsvn_fs_base/fs.c:711
msgid "creating 'checksum-reps' table"
msgstr "Erzeuge Tabelle »checksum-reps«"
-#: ../libsvn_fs_base/fs.c:658
+#: ../libsvn_fs_base/fs.c:712
msgid "opening 'checksum-reps' table"
msgstr "Öffne Tabelle »checksum-reps«"
-#: ../libsvn_fs_base/fs.c:730
+#: ../libsvn_fs_base/fs.c:802
#, c-format
msgid "The '%s' feature requires version %d of the filesystem schema; filesystem '%s' uses only version %d"
msgstr "Das Merkmal »%s« erfordert Version %d des Dateisystemschemas; Dateisystem »%s« verwendet nur Version %d"
-#: ../libsvn_fs_base/fs.c:749
+#: ../libsvn_fs_base/fs.c:821
#, c-format
msgid "Expected FS format '%d'; found format '%d'"
msgstr "Erwartetes Dateisystemformat »%d«; gefunden »%d«"
-#: ../libsvn_fs_base/fs.c:1215
+#: ../libsvn_fs_base/fs.c:1309
#, c-format
msgid "BDB repositories do not support incremental hotcopy"
msgstr "BDB-Projektarchive unterstützen inkrementelle Kopien im laufenden Betrieb nicht"
-#: ../libsvn_fs_base/fs.c:1319
+#: ../libsvn_fs_base/fs.c:1413
msgid ""
"Error copying logfile; the DB_LOG_AUTOREMOVE feature\n"
"may be interfering with the hotcopy algorithm. If\n"
@@ -3232,7 +3553,7 @@ msgstr ""
"könnte den Hotcopy-Algorithmus stören. Falls das Problem weiterhin\n"
"besteht, versuchen Sie diese Funktion in DB_CONFIG abzuschalten"
-#: ../libsvn_fs_base/fs.c:1338
+#: ../libsvn_fs_base/fs.c:1432
msgid ""
"Error running catastrophic recovery on hotcopy; the\n"
"DB_LOG_AUTOREMOVE feature may be interfering with the\n"
@@ -3244,33 +3565,37 @@ msgstr ""
"könnte den Hotcopy-Algorithmus stören. Wenn das Problem weiterhin\n"
"besteht, versuchen Sie diese Funktion in DB_CONFIG abzuschalten"
-#: ../libsvn_fs_base/fs.c:1383
+#: ../libsvn_fs_base/fs.c:1477
msgid "Module for working with a Berkeley DB repository."
msgstr "Modul zum Zugriff auf ein Berkeley-DB-Projektarchiv."
-#: ../libsvn_fs_base/fs.c:1430
+#: ../libsvn_fs_base/fs.c:1527
#, c-format
msgid "Unsupported FS loader version (%d) for bdb"
msgstr "Nicht unterstützte Dateisystem-Laderversion (%d) für bdb"
-#: ../libsvn_fs_base/lock.c:108 ../libsvn_fs_base/lock.c:113
-#: ../libsvn_fs_fs/lock.c:786 ../libsvn_fs_fs/lock.c:791
-#: ../libsvn_fs_fs/lock.c:813
+#: ../libsvn_fs_base/lock.c:122 ../libsvn_fs_base/lock.c:127
+#: ../libsvn_fs_fs/lock.c:740 ../libsvn_fs_fs/lock.c:745
+#: ../libsvn_fs_fs/lock.c:775 ../libsvn_fs_x/lock.c:780
+#: ../libsvn_fs_x/lock.c:785 ../libsvn_fs_x/lock.c:815
#, c-format
msgid "Path '%s' doesn't exist in HEAD revision"
msgstr "Pfad »%s« existiert nicht in HEAD-Revision"
-#: ../libsvn_fs_base/lock.c:540 ../libsvn_fs_fs/lock.c:682
+#: ../libsvn_fs_base/lock.c:610 ../libsvn_fs_fs/lock.c:613
+#: ../libsvn_fs_x/lock.c:680
#, c-format
msgid "Cannot verify lock on path '%s'; no username available"
msgstr "Kann Sperre für Pfad »%s« nicht prüfen; keine Benutzername verfügbar"
-#: ../libsvn_fs_base/lock.c:546 ../libsvn_fs_fs/lock.c:688
+#: ../libsvn_fs_base/lock.c:616 ../libsvn_fs_fs/lock.c:619
+#: ../libsvn_fs_x/lock.c:686
#, c-format
msgid "User '%s' does not own lock on path '%s' (currently locked by '%s')"
msgstr "Benutzer »%s« besitzt die Sperre für Pfad »%s« nicht (derzeit gesperrt durch »%s«)"
-#: ../libsvn_fs_base/lock.c:552 ../libsvn_fs_fs/lock.c:694
+#: ../libsvn_fs_base/lock.c:622 ../libsvn_fs_fs/lock.c:625
+#: ../libsvn_fs_x/lock.c:692
#, c-format
msgid "Cannot verify lock on path '%s'; no matching lock-token available"
msgstr "Kann Sperre für Pfad »%s« nicht prüfen; keine entsprechende Sperrmarke verfügbar"
@@ -3324,7 +3649,7 @@ msgstr "SHA1-Prüfsummenfehler auf Darstellung »%s«"
msgid "Null rep, but offset past zero already"
msgstr "Leere Darstellung, aber der Offset ist bereits größer als Null"
-#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1253
+#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1254
#, c-format
msgid "Rep '%s' is not mutable"
msgstr "Darstellung »%s« ist nicht veränderlich"
@@ -3334,16 +3659,16 @@ msgstr "Darstellung »%s« ist nicht veränderlich"
msgid "Rep '%s' both mutable and non-fulltext"
msgstr "Darstellung »%s« ist beides: veränderlich und kein Volltext"
-#: ../libsvn_fs_base/reps-strings.c:1372
+#: ../libsvn_fs_base/reps-strings.c:1373
msgid "Failed to get new string key"
msgstr "Konnte keinen neuen Schlüssel erzeugen"
-#: ../libsvn_fs_base/reps-strings.c:1449
+#: ../libsvn_fs_base/reps-strings.c:1450
#, c-format
msgid "Attempt to deltify '%s' against itself"
msgstr "Versuch, Deltas von »%s« gegen sich selber zu erstellen"
-#: ../libsvn_fs_base/reps-strings.c:1522
+#: ../libsvn_fs_base/reps-strings.c:1523
#, c-format
msgid "Failed to calculate MD5 digest for '%s'"
msgstr "Berechnung der MD5-Summe für »%s« schlug fehl"
@@ -3358,12 +3683,13 @@ msgstr "Transaktion ist nicht tot: »%s«"
msgid "Transaction is dead: '%s'"
msgstr "Transaktion ist tot: »%s«"
-#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:9763
+#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:2115
+#: ../libsvn_fs_x/fs_x.c:1153
#, c-format
msgid "revprop '%s' has unexpected value in filesystem"
msgstr "Revisionseigenschaft »%s« hat einen unerwarteten Wert im Dateisystem"
-#: ../libsvn_fs_base/revs-txns.c:1030
+#: ../libsvn_fs_base/revs-txns.c:1053
msgid "Transaction aborted, but cleanup failed"
msgstr "Transaktion abgebrochen, aber Aufräumen schlug fehl"
@@ -3379,689 +3705,1101 @@ msgstr "Breche Berkeley DB Transaktion ab"
msgid "committing Berkeley DB transaction"
msgstr "Schließe Berkeley DB Transaktion ab"
-#: ../libsvn_fs_base/tree.c:772 ../libsvn_fs_fs/tree.c:1065
+#: ../libsvn_fs_base/tree.c:773 ../libsvn_fs_fs/tree.c:1104
+#: ../libsvn_fs_x/tree.c:1090
#, c-format
msgid "Failure opening '%s'"
msgstr "Fehler beim Öffnen von »%s«"
-#: ../libsvn_fs_base/tree.c:1403 ../libsvn_fs_fs/tree.c:1516
+#: ../libsvn_fs_base/tree.c:1445 ../libsvn_fs_fs/tree.c:1630
+#: ../libsvn_fs_x/tree.c:1626
msgid "Cannot compare property value between two different filesystems"
msgstr "Kann Eigenschaftswert nicht zwischen verschiedenen Dateisystemen vergleichen"
-#: ../libsvn_fs_base/tree.c:1849 ../libsvn_fs_base/tree.c:1919
+#: ../libsvn_fs_base/tree.c:1911 ../libsvn_fs_base/tree.c:1981
msgid "Corrupt DB: faulty predecessor count"
msgstr "DB beschädigt: Fehlerhafte Vorgängeranzahl"
-#: ../libsvn_fs_base/tree.c:1976
+#: ../libsvn_fs_base/tree.c:2038
#, c-format
msgid "Unexpected immutable node at '%s'"
msgstr "Unerwarteter unveränderlicher Knoten bei »%s«"
-#: ../libsvn_fs_base/tree.c:1997 ../libsvn_fs_fs/tree.c:1546
-#: ../libsvn_repos/commit.c:1255
+#: ../libsvn_fs_base/tree.c:2059 ../libsvn_fs_fs/tree.c:1660
+#: ../libsvn_fs_x/tree.c:1659 ../libsvn_repos/commit.c:1252
#, c-format
msgid "Conflict at '%s'"
msgstr "Konflikt bei »%s«"
-#: ../libsvn_fs_base/tree.c:2050 ../libsvn_fs_base/tree.c:2802
-#: ../libsvn_fs_fs/tree.c:1597 ../libsvn_fs_fs/tree.c:2134
+#: ../libsvn_fs_base/tree.c:2112 ../libsvn_fs_base/tree.c:2864
+#: ../libsvn_fs_fs/tree.c:1758 ../libsvn_fs_fs/tree.c:2312
+#: ../libsvn_fs_x/tree.c:1772 ../libsvn_fs_x/tree.c:2315
msgid "Bad merge; ancestor, source, and target not all in same fs"
msgstr "Fehlerhaftes Zusammenführen: Vorgänger, Quelle und Ziel nicht im gleichen Dateisystem"
-#: ../libsvn_fs_base/tree.c:2066 ../libsvn_fs_fs/tree.c:1613
+#: ../libsvn_fs_base/tree.c:2128 ../libsvn_fs_fs/tree.c:1774
+#: ../libsvn_fs_x/tree.c:1788
#, c-format
msgid "Bad merge; target '%s' has id '%s', same as ancestor"
msgstr "Fehlerhaftes Zusammenführen: Ziel »%s« hat die gleiche ID »%s« wie der Vorgänger."
-#: ../libsvn_fs_base/tree.c:2610
+#: ../libsvn_fs_base/tree.c:2672
#, c-format
msgid "Transaction '%s' out-of-date with respect to revision '%s'"
msgstr "Transaktion »%s« ist in Bezug auf Revision »%s« veraltet"
-#: ../libsvn_fs_base/tree.c:2886
+#: ../libsvn_fs_base/tree.c:2948
#, c-format
msgid "Cannot deltify revisions prior to r%ld"
msgstr "Die Erstellung von Deltas für Revisionen vor r%ld ist nicht möglich"
-#: ../libsvn_fs_base/tree.c:3004 ../libsvn_fs_fs/tree.c:2289
+#: ../libsvn_fs_base/tree.c:3066 ../libsvn_fs_fs/tree.c:2494
+#: ../libsvn_fs_x/tree.c:2502
msgid "The root directory cannot be deleted"
msgstr "Das Basisverzeichnis kann nicht gelöscht werden"
-#: ../libsvn_fs_base/tree.c:3217 ../libsvn_fs_fs/tree.c:2359
+#: ../libsvn_fs_base/tree.c:3279 ../libsvn_fs_fs/tree.c:2564
+#: ../libsvn_fs_x/tree.c:2576
#, c-format
msgid "Cannot copy between two different filesystems ('%s' and '%s')"
msgstr "Kann nicht zwischen zwei verschiedenen Dateisystemen (»%s« und »%s«) kopieren"
-#: ../libsvn_fs_base/tree.c:3226 ../libsvn_fs_fs/tree.c:2365
+#: ../libsvn_fs_base/tree.c:3288 ../libsvn_fs_fs/tree.c:2571
+#: ../libsvn_fs_x/tree.c:2583
msgid "Copy from mutable tree not currently supported"
msgstr "Kopieren eines veränderlichen Baumes wird derzeit nicht unterstützt"
-#: ../libsvn_fs_base/tree.c:3736 ../libsvn_fs_fs/tree.c:2842
+#: ../libsvn_fs_base/tree.c:3798 ../libsvn_fs_fs/tree.c:2966
+#: ../libsvn_fs_x/tree.c:2991
#, c-format
msgid "Base checksum mismatch on '%s'"
msgstr "Basis-Prüfsummenfehler bei »%s«"
-#: ../libsvn_fs_base/tree.c:3969 ../libsvn_fs_fs/tree.c:3057
+#: ../libsvn_fs_base/tree.c:4074 ../libsvn_fs_fs/tree.c:3176
+#: ../libsvn_fs_x/tree.c:3210
msgid "Cannot compare file contents between two different filesystems"
msgstr "Kann Dateiinhalte nicht zwischen verschiedenen Dateisystemen vergleichen"
-#: ../libsvn_fs_base/tree.c:5013 ../libsvn_fs_base/tree.c:5188
+#: ../libsvn_fs_base/tree.c:5123 ../libsvn_fs_base/tree.c:5298
#, c-format
msgid "Node-revision '%s' claims to have mergeinfo but doesn't"
msgstr "Knotenrevision »%s« behauptet, Zusammenführungsinformationen zu haben, hat aber keine"
-#: ../libsvn_fs_base/tree.c:5049
+#: ../libsvn_fs_base/tree.c:5159
#, c-format
msgid "Node-revision '%s' claims to sit atop a tree containing mergeinfo but is not a directory"
msgstr "Knotenrevision »%s« behauptet, über einem Baum, der Zusammenführungsinformationen enthält, zu sitzen, ist aber kein Verzeichnis"
-#: ../libsvn_fs_fs/dag.c:426 ../libsvn_fs_fs/dag.c:442
-#: ../libsvn_ra_serf/serf.c:1038 ../libsvn_ra_serf/serf.c:1101
+#: ../libsvn_fs_fs/cached_data.c:709 ../libsvn_fs_x/cached_data.c:582
+msgid "Malformed svndiff data in representation"
+msgstr "Fehlerhafte svndiff-Daten in Darstellung"
+
+#: ../libsvn_fs_fs/cached_data.c:956 ../libsvn_fs_x/cached_data.c:842
+#, c-format
+msgid "No representation found at offset %s for item %s in revision %ld"
+msgstr "Keine Darstellung gefunden bei Offset %s für Element %s in Revision %ld"
+
+#: ../libsvn_fs_fs/cached_data.c:1522 ../libsvn_fs_fs/cached_data.c:1535
+#: ../libsvn_fs_fs/cached_data.c:2930 ../libsvn_fs_x/cached_data.c:1424
+#: ../libsvn_fs_x/cached_data.c:1437 ../libsvn_fs_x/cached_data.c:1713
+msgid "Reading one svndiff window read beyond the end of the representation"
+msgstr "Lesen eines svndiff-Fensters las über Ende der Darstellung hinaus"
+
+#: ../libsvn_fs_fs/cached_data.c:1642 ../libsvn_fs_x/cached_data.c:1565
+msgid "svndiff window length is corrupt"
+msgstr "Svndiff Fensterlänge ist beschädigt"
+
+#: ../libsvn_fs_fs/cached_data.c:2038 ../libsvn_fs_x/cached_data.c:2143
+msgid "Checksum mismatch while reading representation"
+msgstr "Prüfsummenfehler beim Lesen der Darstellung"
+
+#: ../libsvn_fs_fs/cached_data.c:2389 ../libsvn_fs_fs/cached_data.c:2403
+#: ../libsvn_fs_fs/cached_data.c:2410 ../libsvn_fs_x/cached_data.c:2508
+#: ../libsvn_fs_x/cached_data.c:2522 ../libsvn_fs_x/cached_data.c:2529
+#, c-format
+msgid "Directory entry corrupt in '%s'"
+msgstr "Verzeichniseintrag beschädigt in »%s«"
+
+#: ../libsvn_fs_fs/cached_data.c:3111
+#, c-format
+msgid ""
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s for item %s in revision %ld"
+msgstr ""
+"Interner Prüfsummenfehler beim Lesen von\n"
+"%s Byte von Metadaten bei Offset %s für Element »%s« in Revision »%ld«"
+
+#: ../libsvn_fs_fs/dag.c:431 ../libsvn_fs_fs/dag.c:448
+#: ../libsvn_fs_x/dag.c:377 ../libsvn_fs_x/dag.c:504
+#: ../libsvn_ra_serf/stat.c:594
msgid "Can't get entries of non-directory"
msgstr "Kann keine Einträge aus einem nicht-Verzeichnis lesen"
-#: ../libsvn_fs_fs/dag.c:551
+#: ../libsvn_fs_fs/dag.c:557 ../libsvn_fs_x/dag.c:613
#, c-format
msgid "Can't increment mergeinfo count on node-revision %%s to negative value %%%s"
msgstr "Kann Zusammenführungsinformationszähler für Knotenrevision %%s nicht auf negativen Wert %%%s erhöhen"
# FIXME: node-revision or node-rev (wie überall)?
-#: ../libsvn_fs_fs/dag.c:562
+#: ../libsvn_fs_fs/dag.c:568 ../libsvn_fs_x/dag.c:624
#, c-format
msgid "Can't increment mergeinfo count on *file* node-revision %%s to %%%s (> 1)"
msgstr "Kann Zusammenführungsinformationszähler für Datei-Knotenrevision %%s nicht auf %%%s (> 1) erhöhen"
-#: ../libsvn_fs_fs/dag.c:1134
+#: ../libsvn_fs_fs/dag.c:1157 ../libsvn_fs_x/dag.c:1165
msgid "Empty noderev in cache"
msgstr "Leere Knotenrevision im Zwischenspeicher"
-#: ../libsvn_fs_fs/dag.c:1326
+#: ../libsvn_fs_fs/dag.c:1361 ../libsvn_fs_x/dag.c:1357
#, c-format
msgid "Attempted to update ancestry of non-mutable node"
msgstr "Versuchte, die Herkunft eines unveränderlichen Knotens zu ändern"
-#: ../libsvn_fs_fs/fs.c:83
+#: ../libsvn_fs_fs/fs.c:101
#, c-format
msgid "Can't fetch FSFS shared data"
msgstr "Kann gemeinsame FSFS-Daten nicht holen"
-#: ../libsvn_fs_fs/fs.c:110
+#: ../libsvn_fs_fs/fs.c:130
#, c-format
msgid "Can't store FSFS shared data"
msgstr "Kann gemeinsame FSFS-Daten nicht speichern"
-#: ../libsvn_fs_fs/fs.c:404
+#: ../libsvn_fs_fs/fs.c:546
msgid "Module for working with a plain file (FSFS) repository."
msgstr "Modul zum Zugriff auf ein dateibasiertes (FSFS) Projektarchiv."
-#: ../libsvn_fs_fs/fs.c:454
+#: ../libsvn_fs_fs/fs.c:608
#, c-format
msgid "Unsupported FS loader version (%d) for fsfs"
msgstr "Nicht unterstützte Dateisystem-Laderversion (%d) für fsfs"
-#: ../libsvn_fs_fs/fs_fs.c:727
+#: ../libsvn_fs_fs/fs_fs.c:444
#, c-format
-msgid "Can't unlock unknown transaction '%s'"
-msgstr "Kann unbekannte Transaktion »%s« nicht freigeben"
+msgid "Found format '%d', only created by unreleased dev builds; see http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
+msgstr "Format »%d« gefunden, das nur durch nicht veröffentlichte Entwicklungsversionen erstellt wurde; siehe http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
-#: ../libsvn_fs_fs/fs_fs.c:731
+#: ../libsvn_fs_fs/fs_fs.c:455 ../libsvn_fs_x/fs_x.c:103
#, c-format
-msgid "Can't unlock nonlocked transaction '%s'"
-msgstr "Nicht gesperrte Transaktion »%s« kann nicht freigeben werden"
+msgid "Expected FS format between '1' and '%d'; found format '%d'"
+msgstr "Erwartete Dateisystemformat zwischen 1 und %d; fand %d"
-# FIXME: Dies ist aber nicht infinitisch übersetzt (siehe umliegenden Meldungen)
-#: ../libsvn_fs_fs/fs_fs.c:738
+#: ../libsvn_fs_fs/fs_fs.c:506 ../libsvn_fs_x/fs_x.c:128
#, c-format
-msgid "Can't unlock prototype revision lockfile for transaction '%s'"
-msgstr "Kann Prototyp-Revisionssperrdatei für Transaktion »%s« nicht entsperren"
+msgid "Can't read first line of format file '%s'"
+msgstr "Die erste Zeile der Formatdatei »%s« kann nicht gelesen werden"
-#: ../libsvn_fs_fs/fs_fs.c:744
+#: ../libsvn_fs_fs/fs_fs.c:563 ../libsvn_fs_x/fs_x.c:150
#, c-format
-msgid "Can't close prototype revision lockfile for transaction '%s'"
-msgstr "Kann Prototyp-Revisionssperrdatei für Transaktion »%s« nicht schließen"
+msgid "'%s' contains invalid filesystem format option '%s'"
+msgstr "»%s« enthält eine ungültige Dateisystemformat-Option »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:806
+#: ../libsvn_fs_fs/fs_fs.c:573
#, c-format
-msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by this process"
-msgstr "Kann nicht in die Prototyp-Revisionsdatei der Transaktion »%s« schreiben, da eine frühere Darstellung zurzeit von diesem Prozess geschrieben wird"
+msgid "'%s' specifies logical addressing for a non-sharded repository"
+msgstr "»%s« bestimmt logische Adressierung für ein nicht fragmentiertes Projektarchiv"
-#: ../libsvn_fs_fs/fs_fs.c:842
+#: ../libsvn_fs_fs/fs_fs.c:655 ../libsvn_fs_x/fs_x.c:209
#, c-format
-msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by another process"
-msgstr "Kann nicht in die Prototyp-Revisionsdatei der Transaktion »%s« schreiben, da eine frühere Darstellung zurzeit von einem anderen Prozess geschrieben wird"
+msgid "%s is too small for fsfs.conf setting '%s'."
+msgstr "»%s« ist zu klein für die Einstellung »%s« in fsfs.conf."
-#: ../libsvn_fs_fs/fs_fs.c:849 ../libsvn_subr/io.c:2014
+#: ../libsvn_fs_fs/fs_fs.c:663 ../libsvn_fs_x/fs_x.c:217
#, c-format
-msgid "Can't get exclusive lock on file '%s'"
-msgstr "Kann keinen exklusiven Zugriff auf Datei »%s« erlangen"
+msgid "%s is too large for fsfs.conf setting '%s'."
+msgstr "»%s« ist zu groß für die Einstellung »%s« in fsfs.conf."
-#: ../libsvn_fs_fs/fs_fs.c:968
+#: ../libsvn_fs_fs/fs_fs.c:674 ../libsvn_fs_x/fs_x.c:228
#, c-format
-msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
-msgstr "Die Datei %s (»%s«) enthält eine unerwartete Nicht-Ziffer »%c« innerhalb »%s«"
+msgid "%s is invalid for fsfs.conf setting '%s' because it is not a power of 2."
+msgstr "»%s« ist ungültig für die Einstellung »%s« in fsfs.conf, da es keine Zweierpotenz ist."
-#: ../libsvn_fs_fs/fs_fs.c:995
+#: ../libsvn_fs_fs/fs_fs.c:1186
#, c-format
-msgid "Found format '%d', only created by unreleased dev builds; see http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
-msgstr "Format »%d« gefunden, das nur durch nicht veröffentlichte Entwicklungsversionen erstellt wurde; siehe http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
+msgid "'%s' is not a regular file. Please move it out of the way and try again"
+msgstr "»%s« ist keine reguläre Datei. Bitte aus dem Weg bewegen und noch einmal versuchen."
-#: ../libsvn_fs_fs/fs_fs.c:1006
+#: ../libsvn_fs_fs/fs_fs.c:1351 ../libsvn_fs_x/fs_x.c:675
#, c-format
-msgid "Expected FS format between '1' and '%d'; found format '%d'"
-msgstr "Erwartete Dateisystemformat zwischen 1 und %d; fand %d"
+msgid "Invalid revision number '%ld'"
+msgstr "Ungültige Revisionsnummer »%ld«"
+
+#: ../libsvn_fs_fs/fs_fs.c:1812
+msgid "FSFS is not compatible with Subversion prior to 1.1"
+msgstr "FSFS ist nicht kompatibel mit Subversion älter als 1.1"
-#: ../libsvn_fs_fs/fs_fs.c:1052
+#: ../libsvn_fs_fs/fs_fs.c:2014
#, c-format
-msgid "Can't read first line of format file '%s'"
-msgstr "Die erste Zeile der Formatdatei »%s« kann nicht gelesen werden"
+msgid "Node origin for '%s' exists with a different value (%s) than what we were about to store (%s)"
+msgstr "Knotenursprung für »%s« existiert mit einem anderen Wert (%s) als der, der gespeichert werden soll (%s)"
-#: ../libsvn_fs_fs/fs_fs.c:1092
+#: ../libsvn_fs_fs/hotcopy.c:107 ../libsvn_fs_x/hotcopy.c:108
+#: ../libsvn_subr/io.c:270
#, c-format
-msgid "'%s' contains invalid filesystem format option '%s'"
-msgstr "»%s« enthält eine ungültige Dateisystemformat-Option »%s«"
+msgid "Error converting entry in directory '%s' to UTF-8"
+msgstr "Fehler beim Konvertieren eines Eintrags im Verzeichnis »%s« nach UTF-8"
-#: ../libsvn_fs_fs/fs_fs.c:1582
+#: ../libsvn_fs_fs/hotcopy.c:147 ../libsvn_fs_x/hotcopy.c:148
+#: ../libsvn_subr/io.c:1063
#, c-format
-msgid "'%s' is not a regular file. Please move it out of the way and try again"
-msgstr "»%s« ist keine reguläre Datei. Bitte aus dem Weg bewegen und noch einmal versuchen."
+msgid "Source '%s' is not a directory"
+msgstr "Quelle »%s« ist kein Verzeichnis"
-#: ../libsvn_fs_fs/fs_fs.c:1753
+#: ../libsvn_fs_fs/hotcopy.c:153 ../libsvn_fs_x/hotcopy.c:154
+#: ../libsvn_subr/io.c:1069
#, c-format
-msgid "Can't read '%s'"
-msgstr "Kann »%s« nicht lesen"
+msgid "Destination '%s' is not a directory"
+msgstr "Ziel »%s« ist kein Verzeichnis"
-#: ../libsvn_fs_fs/fs_fs.c:1816 ../libsvn_fs_fs/fs_fs.c:1835
+#: ../libsvn_fs_fs/hotcopy.c:226 ../libsvn_fs_x/hotcopy.c:228
+#: ../libsvn_subr/io.c:1146 ../libsvn_subr/io.c:2699
#, c-format
-msgid "Found malformed header '%s' in revision file"
-msgstr "Fehlerhafte Kopfdaten »%s« in Revisionsdatei gefunden"
+msgid "Can't read directory '%s'"
+msgstr "Kann Verzeichnis »%s« nicht lesen"
-#: ../libsvn_fs_fs/fs_fs.c:1871
+#: ../libsvn_fs_fs/hotcopy.c:231 ../libsvn_fs_x/hotcopy.c:233
+#: ../libsvn_subr/io.c:1151 ../libsvn_subr/io.c:2704 ../libsvn_subr/io.c:4395
#, c-format
-msgid "Invalid revision number '%ld'"
-msgstr "Ungültige Revisionsnummer »%ld«"
+msgid "Error closing directory '%s'"
+msgstr "Fehler beim Schließen des Verzeichnisses »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:1886 ../libsvn_fs_fs/fs_fs.c:1941
-#: ../libsvn_fs_fs/fs_fs.c:1952 ../libsvn_repos/log.c:2268
-#: ../libsvn_repos/log.c:2272
+#: ../libsvn_fs_fs/hotcopy.c:490
#, c-format
-msgid "No such revision %ld"
-msgstr "Keine Revision %ld"
+msgid "The FSFS format (%d) of the hotcopy source does not match the FSFS format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
+msgstr "Das FSFS-Format (%d) der Quelle für die Kopie im laufenden Betrieb entspricht nicht dem FSFS-Format (%d) des Ziels; Verwenden Sie auf beiden Seiten das gleiche Format"
-#: ../libsvn_fs_fs/fs_fs.c:1986
-msgid "Unexpected EOF"
-msgstr "Unerwartetes Dateiende (EOF)"
+#: ../libsvn_fs_fs/hotcopy.c:499 ../libsvn_fs_x/hotcopy.c:495
+msgid "The UUID of the hotcopy source does not match the UUID of the hotcopy destination"
+msgstr "Die UUID der Quelle für die Kopie im laufenden Betrieb entspricht nicht der UUID des Ziels"
+
+#: ../libsvn_fs_fs/hotcopy.c:506 ../libsvn_fs_x/hotcopy.c:502
+msgid "The sharding layout configuration of the hotcopy source does not match the sharding layout configuration of the hotcopy destination"
+msgstr "Die Einstellungen zur Fragmentierung der Quelle der Kopie im laufenden Betrieb entspricht nicht den Einstellungen zur Fragmentierung des Ziels"
-#: ../libsvn_fs_fs/fs_fs.c:1993
+#: ../libsvn_fs_fs/hotcopy.c:581 ../libsvn_fs_x/hotcopy.c:575
#, c-format
-msgid "Number '%s' invalid or too large"
-msgstr "Zahl »%s« ist ungültig oder zu groß"
+msgid "The hotcopy destination already contains more packed revisions (%lu) than the hotcopy source contains (%lu)"
+msgstr "Das Ziel der Kopie im laufenden Betrieb enthält bereits mehr gepackte Revisionen (%lu) als die Quelle (%lu)"
+
+#: ../libsvn_fs_fs/hotcopy.c:877
+#, c-format
+msgid "Failed to create hotcopy at '%s'. The file '%s' is missing from the source repository. Please create this file, for instance by running 'svnadmin upgrade %s'"
+msgstr "Erstellen der hotcopy auf »%s« fehlgeschlagen. Die Datei »%s« fehlt im Quellprojektarchiv. Bitte diese Datei erstellen, z.B. durch die Ausführung von »svnadmin upgrade %s«"
+
+#: ../libsvn_fs_fs/hotcopy.c:903 ../libsvn_fs_x/hotcopy.c:786
+#, c-format
+msgid "The hotcopy destination already contains more revisions (%lu) than the hotcopy source contains (%lu); are source and destination swapped?"
+msgstr "Das Ziel der Kopie im laufenden Betrieb enthält bereits mehr Revisionen (%lu) als die Quelle (%lu); Wurden Quelle und Ziel vertauscht?"
+
+#: ../libsvn_fs_fs/index.c:288
+#, c-format
+msgid "Can't read index file '%s' at offset 0x%s"
+msgstr "Kann Indexdatei »%s« bei Offset 0x%s nicht lesen"
+
+#: ../libsvn_fs_fs/index.c:298
+#, c-format
+msgid "Unexpected end of index file %s at offset 0x%s"
+msgstr "Unerwartetes Ende der Indexdatei %s bei Offset 0x%s"
+
+#: ../libsvn_fs_fs/index.c:333 ../libsvn_fs_x/index.c:339
+#, c-format
+msgid "Corrupt index: number too large"
+msgstr "Index beschädigt: Zahl ist zu groß"
+
+#: ../libsvn_fs_fs/index.c:376 ../libsvn_fs_x/index.c:382
+#, c-format
+msgid ""
+"Index stream header prefix mismatch.\n"
+" expected: %s found: %s"
+msgstr ""
+"Fehler im Präfix der Kopfdaten des Indexstroms.\n"
+" erwartet: %s tatsächlich: %s"
+
+#: ../libsvn_fs_fs/index.c:603 ../libsvn_fs_x/index.c:561
+#, c-format
+msgid "UINT32 0x%s too large, max = 0x%s"
+msgstr "UINT32 0x%s ist zu groß, max. 0x%s"
+
+#: ../libsvn_fs_fs/index.c:635 ../libsvn_fs_x/index.c:593
+#, c-format
+msgid "File offset 0x%s too large, max = 0x%s"
+msgstr "Dateioffset 0x%s ist zu groß, max. 0x%s"
+
+#: ../libsvn_fs_fs/index.c:809 ../libsvn_fs_x/index.c:942
+#, c-format
+msgid "L2P index page size %s exceeds current limit of 2G entries"
+msgstr "Seitengröße %s des L2P-Index überschreitet die gegenwärtige Grenze von 2G Einträgen"
+
+#: ../libsvn_fs_fs/index.c:870 ../libsvn_fs_x/index.c:1005
+#, c-format
+msgid "Item index %s too large in l2p proto index for revision %ld"
+msgstr "Elementindex %s zu groß in l2p-Proto-Index für Revision %ld"
+
+#: ../libsvn_fs_fs/index.c:891 ../libsvn_fs_x/index.c:1029
+#, c-format
+msgid "L2P index page count %d exceeds current limit of 2G pages"
+msgstr "Seitenanzahl %d des L2P-Index überschreitet die gegenwärtige Grenze von 2G Seiten"
+
+#: ../libsvn_fs_fs/index.c:994 ../libsvn_fs_fs/index.c:2197
+#: ../libsvn_fs_x/index.c:1296 ../libsvn_fs_x/index.c:2542
+msgid "Index rev / pack file revision numbers do not match"
+msgstr "Revisionsnummern in der REV/PACK Dateien des Index stimmen nicht überein"
+
+#: ../libsvn_fs_fs/index.c:1000 ../libsvn_fs_x/index.c:1309
+msgid "L2P index page size is not a power of two"
+msgstr "Seitengröße des L2P-Index ist keine Zweierpotenz"
+
+#: ../libsvn_fs_fs/index.c:1007 ../libsvn_fs_x/index.c:1303
+msgid "Invalid number of revisions in L2P index"
+msgstr "Ungültige Anzahl von Revisionen im L2P-Index"
+
+#: ../libsvn_fs_fs/index.c:1013 ../libsvn_fs_x/index.c:1315
+msgid "Fewer L2P index pages than revisions"
+msgstr "Weniger Seiten im L2P-Index als Revisionen"
+
+#: ../libsvn_fs_fs/index.c:1016 ../libsvn_fs_x/index.c:1318
+msgid "L2P index page count implausibly large"
+msgstr "Anzahl der Seiten im L2P-Index ist unplausibel groß"
+
+#: ../libsvn_fs_fs/index.c:1021 ../libsvn_fs_x/index.c:1323
+#, c-format
+msgid "Corrupt L2P index for r%ld only covers r%ld:%ld"
+msgstr "Beschädigter L2P-Index für r%ld deckt nur r%ld:%ld ab"
+
+#: ../libsvn_fs_fs/index.c:1040 ../libsvn_fs_x/index.c:1343
+msgid "Revision with no L2P index pages"
+msgstr "Revision ohne Seiten im L2P-Index"
+
+#: ../libsvn_fs_fs/index.c:1045 ../libsvn_fs_x/index.c:1348
+msgid "L2P page table exceeded"
+msgstr "Größenüberschreitung der Seitentablelle des L2P-Index"
+
+#: ../libsvn_fs_fs/index.c:1052 ../libsvn_fs_x/index.c:1355
+msgid "Revisions do not cover the full L2P index page table"
+msgstr "Revisionen decken nicht die gesamte Seitentabelle im L2P-Indexab"
+
+#: ../libsvn_fs_fs/index.c:1060 ../libsvn_fs_x/index.c:1363
+msgid "Empty L2P index page"
+msgstr "Leere Seite im L2P-Index"
+
+#: ../libsvn_fs_fs/index.c:1066 ../libsvn_fs_x/index.c:1369
+msgid "Page exceeds L2P index page size"
+msgstr "Seite überschreitet Seitengröße im L2P-Index"
+
+#: ../libsvn_fs_fs/index.c:1125 ../libsvn_fs_x/index.c:1124
+#, c-format
+msgid "Revision %ld not covered by item index"
+msgstr "Revision %ld nicht vom Elementindex abgedeckt"
+
+#: ../libsvn_fs_fs/index.c:1151 ../libsvn_fs_x/index.c:1150
+#, c-format
+msgid "Item index %s exceeds l2p limit of %s for revision %ld"
+msgstr "Elementindex %s überschreitet l2p-Grenze von %s für Revision %ld"
+
+#: ../libsvn_fs_fs/index.c:1358 ../libsvn_fs_x/index.c:1527
+msgid "L2P actual page size does not match page table value."
+msgstr "Tatsächliche Seitengröße im L2P-Index stimmt nicht mit dem Wert in der Seitentabelle überein."
+
+#: ../libsvn_fs_fs/index.c:1491 ../libsvn_fs_x/index.c:1571
+#, c-format
+msgid "Item index %s too large in revision %ld"
+msgstr "Elementindex %s ist zu groß in Revision %ld"
+
+#: ../libsvn_fs_fs/index.c:1910 ../libsvn_fs_x/index.c:2148
+#, c-format
+msgid "Revision 0x%s too large, max = 0x%s"
+msgstr "Revision 0x%s ist zu groß, max. 0x%s"
+
+#: ../libsvn_fs_fs/index.c:2203 ../libsvn_fs_x/index.c:2548
+msgid "Index offset and rev / pack file size do not match"
+msgstr "Index-Offset und Größe der REV/PACK-Datei stimmen nicht überein"
+
+#: ../libsvn_fs_fs/index.c:2209 ../libsvn_fs_x/index.c:2554
+msgid "P2L index page size is not a power of two"
+msgstr "Seitengröße des P2L-Index ist keine Zweierpotenz"
+
+#: ../libsvn_fs_fs/index.c:2215 ../libsvn_fs_x/index.c:2560
+msgid "P2L page count does not match rev / pack file size"
+msgstr "Seitenanzahl im P2L-Index stimmt nicht mit der Größe der REV/PACK Datei überein"
+
+#: ../libsvn_fs_fs/index.c:2395 ../libsvn_fs_x/index.c:2649
+msgid "Invalid item type in P2L index"
+msgstr "Ungültiger Elementtyp im P2L-Index"
+
+#: ../libsvn_fs_fs/index.c:2399 ../libsvn_fs_x/index.c:2702
+msgid "Changed path list must have item number 1"
+msgstr "Liste der geänderten Pfade muss Elementnummer 1 tragen"
+
+#: ../libsvn_fs_fs/index.c:2413 ../libsvn_fs_x/index.c:2659
+msgid "Invalid FNV1 checksum in P2L index"
+msgstr "Ungültige FNV1-Prüfsumme im P2L-Index"
+
+#: ../libsvn_fs_fs/index.c:2422
+msgid "Empty regions must have item number 0 and checksum 0"
+msgstr "Leere Bereiche müssen eine Elementnummer 0 und Prüfsumme 0 aufweisen"
+
+#: ../libsvn_fs_fs/index.c:2492 ../libsvn_fs_x/index.c:2768
+msgid "P2L page description overlaps with next page description"
+msgstr "P2L-Seitenbeschreibung überlappt mit der Beschreibung der nächsten Seite"
+
+#: ../libsvn_fs_fs/index.c:2608 ../libsvn_fs_x/index.c:2883
+#, c-format
+msgid "Offset %s too large in revision %ld"
+msgstr "Offset %s ist zu groß in Revision %ld"
+
+#: ../libsvn_fs_fs/index.c:2798 ../libsvn_fs_x/index.c:3086
+#, c-format
+msgid "Last P2L index entry extends beyond the last page in revision %ld."
+msgstr "Letzter Eintrag im P2L-Index geht über die letzte Seite in der Revision %ld hinaus."
+
+#: ../libsvn_fs_fs/lock.c:120 ../libsvn_fs_x/lock.c:121
+#, c-format
+msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
+msgstr "Beschädigte Sperrdatei für Pfad »%s« in Dateisystem »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2160 ../libsvn_fs_fs/fs_fs.c:2174
-#: ../libsvn_fs_fs/fs_fs.c:2182 ../libsvn_fs_fs/fs_fs.c:2190
-#: ../libsvn_fs_fs/fs_fs.c:2199 ../libsvn_fs_fs/fs_fs.c:2212
-#: ../libsvn_fs_fs/fs_fs.c:2221
+#: ../libsvn_fs_fs/lock.c:228 ../libsvn_fs_x/lock.c:240
+#, c-format
+msgid "Cannot write lock/entries hashfile '%s'"
+msgstr "Kann »lock/entries« Hashdatei »%s« nicht schreiben"
+
+#: ../libsvn_fs_fs/lock.c:279 ../libsvn_fs_x/lock.c:292
+#, c-format
+msgid "Can't parse lock/entries hashfile '%s'"
+msgstr "Kann »lock/entries« Hashdatei »%s« nicht zerlegen"
+
+#: ../libsvn_fs_fs/lock.c:784 ../libsvn_fs_x/lock.c:824
+#, c-format
+msgid "Lock failed: newer version of '%s' exists"
+msgstr "Sperren schlug fehl: eine neuere Version von »%s« existiert"
+
+#: ../libsvn_fs_fs/lock.c:1161 ../libsvn_fs_x/lock.c:1289
+#, c-format
+msgid "Failed to lock '%s'"
+msgstr "Konnte »%s« nicht sperren"
+
+#: ../libsvn_fs_fs/lock.c:1251 ../libsvn_fs_x/lock.c:1376
+#, c-format
+msgid "Failed to unlock '%s'"
+msgstr "Konnte »%s« nicht entsperren"
+
+#: ../libsvn_fs_fs/low_level.c:97 ../libsvn_fs_x/low_level.c:100
+msgid "Invalid character in revision number"
+msgstr "Ungültiges Zeichen in Revisionsnummer"
+
+#: ../libsvn_fs_fs/low_level.c:120
+#, c-format
+msgid "Revision file (r%ld) lacks trailing newline"
+msgstr "Revisionsdatei (r%ld) hat keinen abschließenden Zeilenumbruch"
+
+#: ../libsvn_fs_fs/low_level.c:134
+#, c-format
+msgid "Final line in revision file (r%ld) longer than 64 characters"
+msgstr "Letzte Zeile in der Revisionsdatei (r%ld) ist länger als 64 Zeichen"
+
+#: ../libsvn_fs_fs/low_level.c:149
+#, c-format
+msgid "Final line in revision file r%ld missing space"
+msgstr "Letzte Zeile in der Revisionsdatei r%ld hat nicht genug Leerzeichen"
+
+#: ../libsvn_fs_fs/low_level.c:208 ../libsvn_fs_fs/low_level.c:217
+#: ../libsvn_fs_fs/low_level.c:226 ../libsvn_fs_fs/low_level.c:235
+#: ../libsvn_fs_x/low_level.c:122 ../libsvn_fs_x/low_level.c:131
+#: ../libsvn_fs_x/low_level.c:140 ../libsvn_fs_x/low_level.c:149
+msgid "Invalid revision footer"
+msgstr "Ungültige Fußdaten für Revision"
+
+#: ../libsvn_fs_fs/low_level.c:293 ../libsvn_fs_fs/low_level.c:298
+#: ../libsvn_fs_fs/low_level.c:304 ../libsvn_fs_fs/low_level.c:321
+#: ../libsvn_fs_fs/low_level.c:354 ../libsvn_fs_fs/low_level.c:374
+#: ../libsvn_fs_fs/low_level.c:399 ../libsvn_fs_x/low_level.c:804
+#: ../libsvn_fs_x/low_level.c:812 ../libsvn_fs_x/low_level.c:829
+#: ../libsvn_fs_x/low_level.c:862 ../libsvn_fs_x/low_level.c:882
+#: ../libsvn_fs_x/low_level.c:902
+msgid "Invalid changes line in rev-file"
+msgstr "Ungültige »changes« Zeile in Rev Datei"
+
+#: ../libsvn_fs_fs/low_level.c:347 ../libsvn_fs_x/low_level.c:855
+msgid "Invalid change kind in rev file"
+msgstr "Ungültiger Änderungstyp in Rev Datei"
+
+#: ../libsvn_fs_fs/low_level.c:367 ../libsvn_fs_x/low_level.c:875
+msgid "Invalid text-mod flag in rev-file"
+msgstr "Ungültiges »text-mod« Flag in Rev Datei"
+
+#: ../libsvn_fs_fs/low_level.c:387 ../libsvn_fs_x/low_level.c:895
+msgid "Invalid prop-mod flag in rev-file"
+msgstr "Ungültiges »prop-mod« Flag in Rev Datei"
+
+#: ../libsvn_fs_fs/low_level.c:412 ../libsvn_fs_x/low_level.c:915
+msgid "Invalid mergeinfo-mod flag in rev-file"
+msgstr "Ungültiges »mergeinfo-mod« Flag in Rev Datei"
+
+#: ../libsvn_fs_fs/low_level.c:419 ../libsvn_fs_x/low_level.c:921
+msgid "Invalid path in changes line"
+msgstr "Ungültiger Pfad in Zeile »changes«"
+
+#: ../libsvn_fs_fs/low_level.c:439 ../libsvn_fs_x/low_level.c:944
+msgid "Invalid copy-from path in changes line"
+msgstr "Ungültiger Pfad »copy-from« in Zeile »changes«"
+
+#: ../libsvn_fs_fs/low_level.c:545 ../libsvn_fs_x/low_level.c:1044
+#, c-format
+msgid "Invalid change type %d"
+msgstr "Ungültiger Änderungstyp %d"
+
+#: ../libsvn_fs_fs/low_level.c:673 ../libsvn_fs_fs/low_level.c:690
+#: ../libsvn_fs_x/low_level.c:204 ../libsvn_fs_x/low_level.c:221
+#, c-format
+msgid "Found malformed header '%s' in revision file"
+msgstr "Fehlerhafte Kopfdaten »%s« in Revisionsdatei gefunden"
+
+#: ../libsvn_fs_fs/low_level.c:737 ../libsvn_fs_fs/low_level.c:746
+#: ../libsvn_fs_fs/low_level.c:754 ../libsvn_fs_fs/low_level.c:763
+#: ../libsvn_fs_fs/low_level.c:777 ../libsvn_fs_fs/low_level.c:788
+#: ../libsvn_fs_fs/low_level.c:795 ../libsvn_fs_fs/low_level.c:802
+#: ../libsvn_fs_x/low_level.c:257 ../libsvn_fs_x/low_level.c:272
+#: ../libsvn_fs_x/low_level.c:281 ../libsvn_fs_x/low_level.c:289
+#: ../libsvn_fs_x/low_level.c:298 ../libsvn_fs_x/low_level.c:313
msgid "Malformed text representation offset line in node-rev"
msgstr "Fehlerhafte »text representation offset«-Zeile in Knotenrevision"
-#: ../libsvn_fs_fs/fs_fs.c:2252
+#: ../libsvn_fs_fs/low_level.c:829 ../libsvn_fs_x/low_level.c:346
#, c-format
msgid "While reading representation offsets for node-revision '%s':"
msgstr "Beim Lesen der Darstellungsoffsets für Knotenrevision »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2407
+#: ../libsvn_fs_fs/low_level.c:863
msgid "Missing id field in node-rev"
msgstr "Fehlendes ID-Feld in Knotenrevision"
-#: ../libsvn_fs_fs/fs_fs.c:2421
+#: ../libsvn_fs_fs/low_level.c:878 ../libsvn_fs_x/low_level.c:462
#, c-format
msgid "Missing kind field in node-rev '%s'"
msgstr "Fehlendes Feld »kind« in Knotenrevision »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2456
+#: ../libsvn_fs_fs/low_level.c:913 ../libsvn_fs_x/low_level.c:499
#, c-format
msgid "Missing cpath field in node-rev '%s'"
msgstr "Fehlendes Feld »cpath« in Knotenrevision »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2484 ../libsvn_fs_fs/fs_fs.c:2491
+#: ../libsvn_fs_fs/low_level.c:920 ../libsvn_fs_x/low_level.c:506
+#, c-format
+msgid "Non-canonical cpath field in node-rev '%s'"
+msgstr "Nicht-kanonischer »cpath« in Knotenrevision »%s«"
+
+#: ../libsvn_fs_fs/low_level.c:945 ../libsvn_fs_x/low_level.c:535
#, c-format
msgid "Malformed copyroot line in node-rev '%s'"
msgstr "Fehlerhafte »copyroot«-Zeile in Knotenrevision »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2508 ../libsvn_fs_fs/fs_fs.c:2515
+#: ../libsvn_fs_fs/low_level.c:963 ../libsvn_fs_x/low_level.c:555
#, c-format
msgid "Malformed copyfrom line in node-rev '%s'"
msgstr "Fehlerhafte »copyfrom«-Zeile in Knotenrevision »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:2684 ../libsvn_fs_fs/fs_fs.c:7632
+#: ../libsvn_fs_fs/low_level.c:1168 ../libsvn_fs_x/low_level.c:748
#, c-format
-msgid "Attempted to write to non-transaction '%s'"
-msgstr "Versuch, in eine Nicht-Transaktion zu schreiben »%s«"
+msgid "Malformed representation header"
+msgstr "Fehlerhafter Darstellungskopf"
+
+#: ../libsvn_fs_fs/pack.c:1947
+#, c-format
+msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
+msgstr "Das FSFS-Format (%d) ist zum Packen zu alt, bitte verwenden Sie ein neueres Format"
+
+#: ../libsvn_fs_fs/recovery.c:171
+msgid "Recovery encountered a non-directory node"
+msgstr "Wiederherstellung fand einen Nicht-Verzeichnisknoten"
+
+#: ../libsvn_fs_fs/recovery.c:192
+msgid "Recovery encountered a deltified directory representation"
+msgstr "Wiederherstellung fand eine deltifizierte Verzeichnisrepräsentation"
+
+#: ../libsvn_fs_fs/recovery.c:232 ../libsvn_fs_fs/recovery.c:241
+#: ../libsvn_fs_fs/recovery.c:247
+msgid "Directory entry corrupt"
+msgstr "Verzeichniseintrag beschädigt"
-#: ../libsvn_fs_fs/fs_fs.c:2821
+# FIXME: rev ==> revision
+#: ../libsvn_fs_fs/recovery.c:393 ../libsvn_fs_x/recovery.c:178
#, c-format
-msgid "Malformed representation header at %s"
-msgstr "Fehlerhafter Darstellungskopf in »%s«"
+msgid "Expected current rev to be <= %ld but found %ld"
+msgstr "Erwartete, dass aktuelle Revision <= %ld gilt, fand aber %ld"
-#: ../libsvn_fs_fs/fs_fs.c:2853
+#: ../libsvn_fs_fs/recovery.c:444 ../libsvn_fs_x/recovery.c:215
#, c-format
-msgid "Missing node-id in node-rev at r%ld (offset %s)"
-msgstr "Fehlende Knoten-ID in Knotenrevision bei r%ld (Offset »%s«)"
+msgid "Revision %ld has a revs file but no revprops file"
+msgstr "Revision %ld hat eine Revisions-Datei aber keine Revisionseigenschafts-Datei"
-#: ../libsvn_fs_fs/fs_fs.c:2862
+#: ../libsvn_fs_fs/recovery.c:451 ../libsvn_fs_x/recovery.c:222
#, c-format
-msgid "Corrupt node-id '%s' in node-rev at r%ld (offset %s)"
-msgstr "Beschädigte Knoten-ID »%s« in Knotenrevision bei r%ld (Offset »%s«)"
+msgid "Revision %ld has a revs file but the revprops file is inaccessible"
+msgstr "Revision %ld hat eine Revisions-Datei aber die Revisionseigenschafts-Datei ist nicht verfügbar"
-#: ../libsvn_fs_fs/fs_fs.c:2953
+#: ../libsvn_fs_fs/recovery.c:460 ../libsvn_fs_x/recovery.c:204
#, c-format
-msgid "Revision file (r%ld) lacks trailing newline"
-msgstr "Revisionsdatei (r%ld) hat keinen abschließenden Zeilenumbruch"
+msgid "Revision %ld has a non-file where its revprops file should be"
+msgstr "Revision %ld hat eine Nicht-Datei, wo seine Revisionseigenschafts-Datei sein sollte"
+
+#: ../libsvn_fs_fs/rep-cache.c:124 ../libsvn_fs_x/rep-cache.c:125
+msgid "Couldn't open rep-cache database"
+msgstr "Konnte »rep-cache«-Datenbank des Projektarchivs nicht öffnen"
+
+# TODO: Same strings can be shared with another table!
+#: ../libsvn_fs_fs/rep-cache.c:257 ../libsvn_fs_fs/rep-cache.c:316
+#: ../libsvn_fs_x/rep-cache.c:256 ../libsvn_fs_x/rep-cache.c:314
+msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
+msgstr "Nur SHA1-Prüfsummen können als Schlüssel in der Tabelle rep_cache verwendet werden.\n"
-#: ../libsvn_fs_fs/fs_fs.c:2967
+#: ../libsvn_fs_fs/revprops.c:321 ../libsvn_fs_x/revprops.c:800
#, c-format
-msgid "Final line in revision file (r%ld) longer than 64 characters"
-msgstr "Letzte Zeile in der Revisionsdatei (r%ld) ist länger als 64 Zeichen"
+msgid "Packed revprop manifest for r%ld not properly terminated"
+msgstr "Verzeichnis für gepackte Revisionseigenschaften für r%ld ist nicht korrekt abgeschlossen"
-#: ../libsvn_fs_fs/fs_fs.c:2982
+#: ../libsvn_fs_fs/revprops.c:363 ../libsvn_fs_x/revprops.c:842
#, c-format
-msgid "Final line in revision file r%ld missing space"
-msgstr "Letzte Zeile in der Revisionsdatei r%ld hat nicht genug Leerzeichen"
+msgid "Packed revprop manifest for r%ld has too many entries"
+msgstr "Verzeichnis für gepackte Revisionseigenschaften für r%ld hat zu viele Einträge"
-#: ../libsvn_fs_fs/fs_fs.c:3686
-#, fuzzy, c-format
-msgid "Packed revprop manifest for r%ld too small"
-msgstr "Verzeichnis für gepackte Revisionseigenschaften für Revision %ld ist zu klein"
+#: ../libsvn_fs_fs/revprops.c:368 ../libsvn_fs_x/revprops.c:847
+#, c-format
+msgid "Packed revprop manifest for r%ld has too few entries"
+msgstr "Verzeichnis für gepackte Revisionseigenschaften für r%ld hat zu wenig Einträge"
-#: ../libsvn_fs_fs/fs_fs.c:3743
+#: ../libsvn_fs_fs/revprops.c:432 ../libsvn_fs_x/revprops.c:911
#, c-format
msgid "Revprop pack for revision r%ld contains revprops for r%ld .. r%ld"
msgstr "Datei mit gepackten Revisionseigenschaften für Revision r%ld enthält Revisionseigenschaften für r%ld .. %ld"
-#: ../libsvn_fs_fs/fs_fs.c:3754
+#: ../libsvn_fs_fs/revprops.c:443 ../libsvn_fs_x/revprops.c:922
#, c-format
msgid "Revprop pack for revision r%ld starts at non-packed revisions r%ld"
msgstr "Datei mit gepackten Revisionseigenschaften für Revision r%ld beginnt mit nicht gepackter Revision r%ld"
-#: ../libsvn_fs_fs/fs_fs.c:3763
+#: ../libsvn_fs_fs/revprops.c:452 ../libsvn_fs_x/revprops.c:931
msgid "Header end not found"
msgstr "Ende der Kopfdaten nicht gefunden"
-#: ../libsvn_fs_fs/fs_fs.c:3791
+#: ../libsvn_fs_fs/revprops.c:484 ../libsvn_fs_x/revprops.c:965
msgid "Packed revprop size exceeds pack file size"
msgstr "Größe der gepackten Revisionseigenschaften überschreitet die größe der gepackten Datei"
-#: ../libsvn_fs_fs/fs_fs.c:3850
+#: ../libsvn_fs_fs/revprops.c:542 ../libsvn_fs_x/revprops.c:1034
#, c-format
msgid "No such packed revision %ld"
msgstr "Keine gepackte Revision %ld"
-#: ../libsvn_fs_fs/fs_fs.c:3890
+#: ../libsvn_fs_fs/revprops.c:575 ../libsvn_fs_x/revprops.c:1075
#, c-format
msgid "Failed to read revprop pack file for r%ld"
msgstr "Konnte gepackte Revisionseigenschaften-Datei für r%ld nicht lesen"
-#: ../libsvn_fs_fs/fs_fs.c:3897
+#: ../libsvn_fs_fs/revprops.c:582 ../libsvn_fs_x/revprops.c:1082
#, c-format
msgid "Revprop pack file for r%ld is corrupt"
msgstr "Daten mit gepackten Revisionseigenschaften für r%ld ist beschädigt"
-#: ../libsvn_fs_fs/fs_fs.c:3970
+#: ../libsvn_fs_fs/revprops.c:639 ../libsvn_fs_x/revprops.c:1158
#, c-format
msgid "Could not read revprops for revision %ld"
msgstr "Konnte Revisionseigenschaften für Revision %ld nicht lesen"
-#: ../libsvn_fs_fs/fs_fs.c:4199
+#: ../libsvn_fs_fs/revprops.c:864 ../libsvn_fs_x/revprops.c:1407
#, c-format
msgid "Packed file '%s' misses a tag"
msgstr "Der gepackten Datei »%s« fehlt ein Tag"
-#: ../libsvn_fs_fs/fs_fs.c:4537
-msgid "Malformed svndiff data in representation"
-msgstr "Fehlerhafte svndiff-Daten in Darstellung"
+#: ../libsvn_fs_fs/transaction.c:258 ../libsvn_fs_x/transaction.c:510
+#, c-format
+msgid "Can't unlock unknown transaction '%s'"
+msgstr "Kann unbekannte Transaktion »%s« nicht freigeben"
-#: ../libsvn_fs_fs/fs_fs.c:4973 ../libsvn_fs_fs/fs_fs.c:4992
-msgid "Reading one svndiff window read beyond the end of the representation"
-msgstr "Lesen eines svndiff-Fensters las über Ende der Darstellung hinaus"
+#: ../libsvn_fs_fs/transaction.c:262 ../libsvn_fs_x/transaction.c:514
+#, c-format
+msgid "Can't unlock nonlocked transaction '%s'"
+msgstr "Nicht gesperrte Transaktion »%s« kann nicht freigeben werden"
-#: ../libsvn_fs_fs/fs_fs.c:5080
-msgid "svndiff window length is corrupt"
-msgstr "Svndiff Fensterlänge ist beschädigt"
+# FIXME: Dies ist aber nicht infinitisch übersetzt (siehe umliegenden Meldungen)
+#: ../libsvn_fs_fs/transaction.c:269 ../libsvn_fs_x/transaction.c:521
+#, c-format
+msgid "Can't unlock prototype revision lockfile for transaction '%s'"
+msgstr "Kann Prototyp-Revisionssperrdatei für Transaktion »%s« nicht entsperren"
-#: ../libsvn_fs_fs/fs_fs.c:5248
-msgid "Checksum mismatch while reading representation"
-msgstr "Prüfsummenfehler beim Lesen der Darstellung"
+#: ../libsvn_fs_fs/transaction.c:275 ../libsvn_fs_x/transaction.c:527
+#, c-format
+msgid "Can't close prototype revision lockfile for transaction '%s'"
+msgstr "Kann Prototyp-Revisionssperrdatei für Transaktion »%s« nicht schließen"
-#: ../libsvn_fs_fs/fs_fs.c:5613 ../libsvn_fs_fs/fs_fs.c:5627
-#: ../libsvn_fs_fs/fs_fs.c:5634
+#: ../libsvn_fs_fs/transaction.c:321 ../libsvn_fs_x/transaction.c:575
#, c-format
-msgid "Directory entry corrupt in '%s'"
-msgstr "Verzeichniseintrag beschädigt in »%s«"
+msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by this process"
+msgstr "Kann nicht in die Prototyp-Revisionsdatei der Transaktion »%s« schreiben, da eine frühere Darstellung zurzeit von diesem Prozess geschrieben wird"
-#: ../libsvn_fs_fs/fs_fs.c:6112 ../libsvn_fs_fs/fs_fs.c:6117
-#: ../libsvn_fs_fs/fs_fs.c:6123 ../libsvn_fs_fs/fs_fs.c:6140
-#: ../libsvn_fs_fs/fs_fs.c:6173 ../libsvn_fs_fs/fs_fs.c:6193
-#: ../libsvn_fs_fs/fs_fs.c:6228 ../libsvn_fs_fs/fs_fs.c:6233
-msgid "Invalid changes line in rev-file"
-msgstr "Ungültige »changes« Zeile in Rev Datei"
+#: ../libsvn_fs_fs/transaction.c:358 ../libsvn_fs_x/transaction.c:613
+#, c-format
+msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by another process"
+msgstr "Kann nicht in die Prototyp-Revisionsdatei der Transaktion »%s« schreiben, da eine frühere Darstellung zurzeit von einem anderen Prozess geschrieben wird"
-#: ../libsvn_fs_fs/fs_fs.c:6166
-msgid "Invalid change kind in rev file"
-msgstr "Ungültiger Änderungstyp in Rev Datei"
+#: ../libsvn_fs_fs/transaction.c:366 ../libsvn_fs_x/transaction.c:621
+#: ../libsvn_subr/io.c:2187
+#, c-format
+msgid "Can't get exclusive lock on file '%s'"
+msgstr "Kann keinen exklusiven Zugriff auf Datei »%s« erlangen"
-#: ../libsvn_fs_fs/fs_fs.c:6186
-msgid "Invalid text-mod flag in rev-file"
-msgstr "Ungültiges »text-mod« Flag in Rev Datei"
+#: ../libsvn_fs_fs/transaction.c:414 ../libsvn_fs_x/transaction.c:667
+#, c-format
+msgid "p2l proto index offset %s beyond protorev file size %s for TXN %s"
+msgstr "Offset %s im p2l-Proto-Index überschreitet die Größe %s der protorev-Datei in Transaktion %s"
-#: ../libsvn_fs_fs/fs_fs.c:6206
-msgid "Invalid prop-mod flag in rev-file"
-msgstr "Ungültiges »prop-mod« Flag in Rev Datei"
+#: ../libsvn_fs_fs/transaction.c:523 ../libsvn_fs_fs/transaction.c:2359
+#: ../libsvn_fs_x/transaction.c:796 ../libsvn_fs_x/transaction.c:2455
+#, c-format
+msgid "Attempted to write to non-transaction '%s'"
+msgstr "Versuch, in eine Nicht-Transaktion zu schreiben »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:6464
+#: ../libsvn_fs_fs/transaction.c:932 ../libsvn_fs_x/transaction.c:1182
msgid "Copying from transactions not allowed"
msgstr "Kopieren aus Transaktionen ist nicht erlaubt."
-#: ../libsvn_fs_fs/fs_fs.c:6597
+#: ../libsvn_fs_fs/transaction.c:1065
#, c-format
msgid "Unable to create transaction directory in '%s' for revision %ld"
msgstr "Kann Transaktionsverzeichnis in »%s« in Revision %ld nicht anlegen"
-#: ../libsvn_fs_fs/fs_fs.c:6662
+#: ../libsvn_fs_fs/transaction.c:1135 ../libsvn_fs_x/transaction.c:1338
msgid "Internal error: a null transaction id was passed to get_txn_proplist()"
msgstr "Interner Fehler: eine Transaktionskennung von Null wurde übergeben um get_txn_proplist() zu erhalten"
-#: ../libsvn_fs_fs/fs_fs.c:6821 ../libsvn_fs_fs/fs_fs.c:6828
+#: ../libsvn_fs_fs/transaction.c:1312 ../libsvn_fs_fs/transaction.c:1318
+#: ../libsvn_fs_x/transaction.c:1603 ../libsvn_fs_x/transaction.c:1609
msgid "next-id file corrupt"
msgstr "»next-id« Datei beschädigt"
-#: ../libsvn_fs_fs/fs_fs.c:6924
+#: ../libsvn_fs_fs/transaction.c:1431 ../libsvn_fs_x/transaction.c:1717
#, c-format
msgid "Transaction '%s' cleanup failed"
msgstr "Aufräumen der Transaktion »%s« schlug fehl"
-#: ../libsvn_fs_fs/fs_fs.c:7064
-#, c-format
-msgid "Invalid change type %d"
-msgstr "Ungültiger Änderungstyp %d"
-
-#: ../libsvn_fs_fs/fs_fs.c:7652
+#: ../libsvn_fs_fs/transaction.c:2379 ../libsvn_fs_x/transaction.c:2476
msgid "Can't set text contents of a directory"
msgstr "Kann Textinhalt im Verzeichnis nicht erzeugen"
-#: ../libsvn_fs_fs/fs_fs.c:7738 ../libsvn_fs_fs/fs_fs.c:7743
-#: ../libsvn_fs_fs/fs_fs.c:7750
-msgid "Corrupt 'current' file"
-msgstr "Beschädigte Datei »current«"
-
-#: ../libsvn_fs_fs/fs_fs.c:8010
+#: ../libsvn_fs_fs/transaction.c:2785 ../libsvn_fs_x/transaction.c:2802
#, c-format
msgid "predecessor count for the root node-revision is wrong: found (%d+%ld != %d), committing r%ld"
msgstr "Anzahl der Vorgänger für die Revision des Wurzelknotens ist falsch: Gefunden (%d+%ld != %d) bei Übertragung von r%ld"
-#: ../libsvn_fs_fs/fs_fs.c:8145
+#: ../libsvn_fs_fs/transaction.c:2942
msgid "Truncated protorev file detected"
msgstr "Abgeschnittene Datei »protorev« entdeckt"
-#: ../libsvn_fs_fs/fs_fs.c:8545
+#: ../libsvn_fs_fs/transaction.c:3426 ../libsvn_fs_x/transaction.c:3357
msgid "Transaction out of date"
msgstr "Transaktion ist veraltet"
-#: ../libsvn_fs_fs/fs_fs.c:9044
-msgid "Recovery encountered a non-directory node"
-msgstr "Wiederherstellung fand einen Nicht-Verzeichnisknoten"
-
-#: ../libsvn_fs_fs/fs_fs.c:9066
-msgid "Recovery encountered a deltified directory representation"
-msgstr "Wiederherstellung fand eine deltifizierte Verzeichnisrepräsentation"
+#: ../libsvn_fs_fs/transaction.c:3701 ../libsvn_fs_x/transaction.c:3626
+#, c-format
+msgid "No such transaction '%s'"
+msgstr "Keine solche Transaktion »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:9102 ../libsvn_fs_fs/fs_fs.c:9111
-#: ../libsvn_fs_fs/fs_fs.c:9117
-msgid "Directory entry corrupt"
-msgstr "Verzeichniseintrag beschädigt"
+#: ../libsvn_fs_fs/tree.c:2576 ../libsvn_fs_x/tree.c:2588
+msgid "Copy immutable tree not supported"
+msgstr "Kopieren eines unveränderlichen Baumes nicht unterstützt"
-# FIXME: rev ==> revision
-#: ../libsvn_fs_fs/fs_fs.c:9290
+#: ../libsvn_fs_fs/tree.c:3895 ../libsvn_fs_x/tree.c:3881
#, c-format
-msgid "Expected current rev to be <= %ld but found %ld"
-msgstr "Erwartete, dass aktuelle Revision <= %ld gilt, fand aber %ld"
+msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
+msgstr "Knotenrevision #»%s« behauptet, Zusammenführungsinformationen zu haben, hat aber keine"
-#: ../libsvn_fs_fs/fs_fs.c:9347
+#: ../libsvn_fs_fs/tree.c:4011 ../libsvn_fs_x/tree.c:3997
#, c-format
-msgid "Revision %ld has a revs file but no revprops file"
-msgstr "Revision %ld hat eine Revisions-Datei aber keine Revisionseigenschafts-Datei"
+msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
+msgstr "Knotenrevision »%s@%ld« behauptet, Zusammenführungsinformationen zu haben, hat aber keine"
-#: ../libsvn_fs_fs/fs_fs.c:9354
+#: ../libsvn_fs_fs/tree.c:4211
#, c-format
-msgid "Revision %ld has a revs file but the revprops file is inaccessible"
-msgstr "Revision %ld hat eine Revisions-Datei aber die Revisionseigenschafts-Datei ist nicht verfügbar"
+msgid "Querying mergeinfo requires version %d of the FSFS filesystem schema; filesystem '%s' uses only version %d"
+msgstr "Abfrage der Zusammenführungsinformationen erfordert Version %d des FSFS-Dateisystem-Schemas; Dateisystem »%s« verwendet nur Version %d"
-#: ../libsvn_fs_fs/fs_fs.c:9363
+#: ../libsvn_fs_fs/util.c:387 ../libsvn_fs_x/util.c:499
#, c-format
-msgid "Revision %ld has a non-file where its revprops file should be"
-msgstr "Revision %ld hat eine Nicht-Datei, wo seine Revisionseigenschafts-Datei sein sollte"
+msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
+msgstr "Die Datei %s (»%s«) enthält eine unerwartete Nicht-Ziffer »%c« innerhalb »%s«"
-#: ../libsvn_fs_fs/fs_fs.c:9541
-#, c-format
-msgid "Node origin for '%s' exists with a different value (%s) than what we were about to store (%s)"
-msgstr "Knotenursprung für »%s« existiert mit einem anderen Wert (%s) als der, der gespeichert werden soll (%s)"
+#: ../libsvn_fs_fs/util.c:477 ../libsvn_fs_fs/util.c:482
+#: ../libsvn_fs_fs/util.c:487 ../libsvn_fs_x/util.c:572
+msgid "Corrupt 'current' file"
+msgstr "Beschädigte Datei »current«"
-#: ../libsvn_fs_fs/fs_fs.c:9647
+#: ../libsvn_fs_fs/util.c:598 ../libsvn_fs_x/util.c:673
#, c-format
-msgid "No such transaction '%s'"
-msgstr "Keine solche Transaktion »%s«"
+msgid "Can't read '%s'"
+msgstr "Kann »%s« nicht lesen"
+
+#: ../libsvn_fs_fs/util.c:619 ../libsvn_fs_x/util.c:700
+msgid "Unexpected EOF"
+msgstr "Unerwartetes Dateiende (EOF)"
-#: ../libsvn_fs_fs/fs_fs.c:10364
+#: ../libsvn_fs_fs/util.c:626 ../libsvn_fs_x/util.c:707
#, c-format
-msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
-msgstr "Das FSFS-Format (%d) ist zum Packen zu alt, bitte verwenden Sie ein neueres Format"
+msgid "Number '%s' invalid or too large"
+msgstr "Zahl »%s« ist ungültig oder zu groß"
-#: ../libsvn_fs_fs/fs_fs.c:10643 ../libsvn_subr/io.c:248
+#: ../libsvn_fs_fs/verify.c:208 ../libsvn_fs_x/verify.c:184
#, c-format
-msgid "Error converting entry in directory '%s' to UTF-8"
-msgstr "Fehler beim Konvertieren eines Eintrags im Verzeichnis »%s« nach UTF-8"
+msgid "%s checksum mismatch in file %s"
+msgstr "%s Prüfsummenfehler in Datei %s"
-#: ../libsvn_fs_fs/fs_fs.c:10680 ../libsvn_subr/io.c:1021
+#: ../libsvn_fs_fs/verify.c:303
#, c-format
-msgid "Source '%s' is not a directory"
-msgstr "Quelle »%s« ist kein Verzeichnis"
+msgid "p2l index entry not found for PHYS %s returned by l2p index for LOG r%ld:i%ld"
+msgstr "P2L-Indexeintrag nicht gefunden für PHYS %s zurückgegeben von L2P-Index für LOG r%ld:i%ld"
-#: ../libsvn_fs_fs/fs_fs.c:10686 ../libsvn_subr/io.c:1027
+#: ../libsvn_fs_fs/verify.c:313 ../libsvn_fs_x/verify.c:292
#, c-format
-msgid "Destination '%s' is not a directory"
-msgstr "Ziel »%s« ist kein Verzeichnis"
+msgid "p2l index info LOG r%ld:i%ld does not match l2p index for LOG r%ld:i%ld"
+msgstr "P2L-Indexinformation LOG r%ld:i%ld stimmt nicht mit dem L2P-Index für LOG r%ld:i%ld überein"
-#: ../libsvn_fs_fs/fs_fs.c:10758 ../libsvn_subr/io.c:1104
-#: ../libsvn_subr/io.c:2492
+#: ../libsvn_fs_fs/verify.c:379 ../libsvn_fs_x/verify.c:361
#, c-format
-msgid "Can't read directory '%s'"
-msgstr "Kann Verzeichnis »%s« nicht lesen"
+msgid "p2l does not cover offset %s for revision %ld"
+msgstr "P2L-Index deckt Offset %s für Revision %ld nicht ab"
-#: ../libsvn_fs_fs/fs_fs.c:10763 ../libsvn_subr/io.c:1109
-#: ../libsvn_subr/io.c:2497 ../libsvn_subr/io.c:4002
+#: ../libsvn_fs_fs/verify.c:404
#, c-format
-msgid "Error closing directory '%s'"
-msgstr "Fehler beim Schließen des Verzeichnisses »%s«"
+msgid "Empty P2L entry for PHYS %s refers to revision %ld outside the rev / pack file (%ld-%ld)"
+msgstr "Leerer P2L-Eintrag für PHYS %s bezieht sich auf Revision %ld außerhalb der REV/PACK-Datei (%ld-%ld)"
-#: ../libsvn_fs_fs/fs_fs.c:11046
+#: ../libsvn_fs_fs/verify.c:421
#, c-format
-msgid "The FSFS format (%d) of the hotcopy source does not match the FSFS format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
-msgstr "Das FSFS-Format (%d) der Quelle für die Kopie im laufenden Betrieb entspricht nicht dem FSFS-Format (%d) des Ziels; Verwenden Sie auf beiden Seiten das gleiche Format"
+msgid "l2p index entry PHYS %sdoes not match p2l index value LOG r%ld:i%ld for PHYS %s"
+msgstr "L2P-Indexeintrag PHYS %sstimmt nicht mit dem P2L-Indexwert LOG r%ld:i%ld für PHYS %s überein"
-#: ../libsvn_fs_fs/fs_fs.c:11055
-msgid "The UUID of the hotcopy source does not match the UUID of the hotcopy destination"
-msgstr "Die UUID der Quelle für die Kopie im laufenden Betrieb entspricht nicht der UUID des Ziels"
+#: ../libsvn_fs_fs/verify.c:485 ../libsvn_fs_x/verify.c:462
+#, c-format
+msgid "Empty section in file %s contains non-NUL data at offset %s"
+msgstr "Leerer Abschnitt in Datei %s enthält Daten verschieden von NUL bei Offset %s"
-#: ../libsvn_fs_fs/fs_fs.c:11062
-msgid "The sharding layout configuration of the hotcopy source does not match the sharding layout configuration of the hotcopy destination"
-msgstr "Die Einstellungen zur Fragmentierung der Quelle der Kopie im laufenden Betrieb entspricht nicht den Einstellungen zur Fragmentierung des Ziels"
+#: ../libsvn_fs_fs/verify.c:526 ../libsvn_fs_x/verify.c:505
+#, c-format
+msgid "Checksum mismatch in item at offset %s of length %s bytes in file %s"
+msgstr "Prüfsummenfehler in Element bei Offset %s der Länge %s Byte in Datei %s"
-#: ../libsvn_fs_fs/fs_fs.c:11188
+#: ../libsvn_fs_fs/verify.c:622 ../libsvn_fs_x/verify.c:603
#, c-format
-msgid "Failed to create hotcopy at '%s'. The file '%s' is missing from the source repository. Please create this file, for instance by running 'svnadmin upgrade %s'"
-msgstr "Erstellen der hotcopy auf »%s« fehlgeschlagen. Die Datei »%s« fehlt im Quellprojektarchiv. Bitte diese Datei erstellen, z.B. durch die Ausführung von »svnadmin upgrade %s«"
+msgid "File size of %s for revision r%ld does not match p2l index size of %s"
+msgstr "Dateigröße von %s für Revision r%ld stimmt nicht mit der Größe des P2L-Index %s überein"
-#: ../libsvn_fs_fs/fs_fs.c:11214
+#: ../libsvn_fs_fs/verify.c:667 ../libsvn_fs_x/verify.c:651
#, c-format
-msgid "The hotcopy destination already contains more revisions (%lu) than the hotcopy source contains (%lu); are source and destination swapped?"
-msgstr "Das Ziel der Kopie im laufenden Betrieb enthält bereits mehr Revisionen (%lu) als die Quelle (%lu); Wurden Quelle und Ziel vertauscht?"
+msgid "p2l index entry for revision r%ld is non-contiguous between offsets %s and %s"
+msgstr "P2L-Indexeintrag für Revision r%ld ist nicht zusammenhängend zwischen Offsets %s und %s"
-#: ../libsvn_fs_fs/fs_fs.c:11250
+#: ../libsvn_fs_util/fs-util.c:164
+msgid "Filesystem object has not been opened yet"
+msgstr "Dateisystemobjekt ist noch nicht geöffnet"
+
+#: ../libsvn_fs_util/fs-util.c:167
+msgid "Filesystem object already open"
+msgstr "Dateisystemobjekt ist bereits geöffnet"
+
+#: ../libsvn_fs_x/cached_data.c:2955
#, c-format
-msgid "The hotcopy destination already contains more packed revisions (%lu) than the hotcopy source contains (%lu)"
-msgstr "Das Ziel der Kopie im laufenden Betrieb enthält bereits mehr gepackte Revisionen (%lu) als die Quelle (%lu)"
+msgid ""
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s "
+msgstr ""
+"Interner Prüfsummenfehler beim Lesen von\n"
+"%s Byte von Metadaten bei Offset %s"
-#: ../libsvn_fs_fs/fs_fs.c:11365
+#: ../libsvn_fs_x/changes.c:239
#, c-format
-msgid "The assumed HEAD revision (%lu) of the hotcopy source has been packed while the hotcopy was in progress; please restart the hotcopy operation"
-msgstr "Die angenommene Revision »HEAD« (%lu) der Quelle der Kopie im laufenden Betrieb wurde während des Vorgangs gepackt; Bitte starten Sie den Vorgang erneut"
+msgid "Changes list index %%%s exceeds container size %%d"
+msgstr "Index für Änderungslisten %%%s überschreitet Größe des Containers %%d"
-#: ../libsvn_fs_fs/fs_fs.c:11380
+#: ../libsvn_fs_x/changes.c:490
#, c-format
-msgid "Revision %lu disappeared from the hotcopy source while hotcopy was in progress"
-msgstr "Revision %lu aus der Quelle für Kopie im laufenden Betrieb während des Vorgangs verschwunden"
+msgid "Changes list index %u exceeds container size %d"
+msgstr "Index für Änderungslisten %u überschreitet Größe des Containers %d"
-#: ../libsvn_fs_fs/lock.c:120
+#: ../libsvn_fs_x/fs.c:103
#, c-format
-msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
-msgstr "Beschädigte Sperrdatei für Pfad »%s« in Dateisystem »%s«"
+msgid "Can't fetch FSX shared data"
+msgstr "Kann gemeinsame FSX-Daten nicht holen"
-#: ../libsvn_fs_fs/lock.c:228
+#: ../libsvn_fs_x/fs.c:132
#, c-format
-msgid "Cannot write lock/entries hashfile '%s'"
-msgstr "Kann »lock/entries« Hashdatei »%s« nicht schreiben"
+msgid "Can't store FSX shared data"
+msgstr "Kann gemeinsame FSX-Daten nicht speichern"
+
+#: ../libsvn_fs_x/fs.c:598
+msgid "Module for working with an experimental (FSX) repository."
+msgstr "Modul zum Zugriff auf ein experimentelles (FSX) Projektarchiv."
-#: ../libsvn_fs_fs/lock.c:280
+#: ../libsvn_fs_x/fs.c:661
#, c-format
-msgid "Can't parse lock/entries hashfile '%s'"
-msgstr "Kann »lock/entries« Hashdatei »%s« nicht zerlegen"
+msgid "Unsupported FS loader version (%d) for fsx"
+msgstr "Nicht unterstützte Dateisystem-Laderversion (%d) für fsx"
-#: ../libsvn_fs_fs/lock.c:818
+#: ../libsvn_fs_x/fs_x.c:1021
+msgid "FSX is not compatible with Subversion prior to 1.9"
+msgstr "FSX ist inkompatibel mit Subversion älter als 1.9"
+
+#: ../libsvn_fs_x/hotcopy.c:486
#, c-format
-msgid "Lock failed: newer version of '%s' exists"
-msgstr "Sperren schlug fehl: eine neuere Version von »%s« existiert"
+msgid "The FSX format (%d) of the hotcopy source does not match the FSX format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
+msgstr "Das FSX-Format (%d) der Quelle für die Kopie im laufenden Betrieb entspricht nicht dem FSX-Format (%d) des Ziels; Verwenden Sie auf beiden Seiten das gleiche Format"
-#: ../libsvn_fs_fs/rep-cache.c:138
-msgid "Couldn't open rep-cache database"
-msgstr "Konnte »rep-cache«-Datenbank des Projektarchivs nicht öffnen"
+#: ../libsvn_fs_x/index.c:294
+msgid "Can't read index file '%s' at offset 0x%"
+msgstr "Kann Indexdatei »%s« nicht lesen bei Offset 0x%"
-# TODO: Same strings can be shared with another table!
-#: ../libsvn_fs_fs/rep-cache.c:267 ../libsvn_fs_fs/rep-cache.c:312
-msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
-msgstr "Nur SHA1-Prüfsummen können als Schlüssel in der Tabelle rep_cache verwendet werden.\n"
+#: ../libsvn_fs_x/index.c:304
+msgid "Unexpected end of index file %s at offset 0x%"
+msgstr "Unerwartetes Ende der Indexdatei %s bei Offset 0x%"
-#: ../libsvn_fs_fs/rep-cache.c:348
+#: ../libsvn_fs_x/index.c:2668
+msgid "Unused regions must be empty and have checksum 0"
+msgstr "Nicht verwendete Regionen müssen leer sein und eine Prüfsumme von 0 haben"
+
+#: ../libsvn_fs_x/index.c:2682
+msgid "Only containers may have more than one sub-item"
+msgstr "Nur Container dürfen mehr als ein Unterelement haben"
+
+#: ../libsvn_fs_x/low_level.c:423
#, c-format
-msgid "Representation key for checksum '%%s' exists in filesystem '%%s' with a different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,%%%s,%%%s,%%%s)"
-msgstr "Repräsentationsschlüssel für Prüfsumme »%%s« existiert im Dateisystem »%%s« mit einem anderen Wert (%%ld,%%%s,%%%s,%%%s) als der, der gespeichert werden soll (%%ld,%%%s,%%%s,%%%s)"
+msgid "Missing %s field in node-rev"
+msgstr "Fehlendes Feld %s in Knotenrevision"
-#: ../libsvn_fs_fs/tree.c:2209 ../libsvn_subr/path.c:1233
+#: ../libsvn_fs_x/noderevs.c:320
#, c-format
-msgid "Invalid control character '0x%02x' in path '%s'"
-msgstr "Ungültiges Steuerzeichen »0x%02x« in Pfad »%s«"
+msgid "ID part index %d exceeds container size %d"
+msgstr "ID-Teilindex %d überschreitet Größe des Containers %d"
-#: ../libsvn_fs_fs/tree.c:3808
+#: ../libsvn_fs_x/noderevs.c:348
#, c-format
-msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
-msgstr "Knotenrevision #»%s« behauptet, Zusammenführungsinformationen zu haben, hat aber keine"
+msgid "Node revision ID index %d exceeds container size %d"
+msgstr "Index für Knotenrevisions-IDs %d überschreitet Größe des Containers %d"
-#: ../libsvn_fs_fs/tree.c:3924
+#: ../libsvn_fs_x/noderevs.c:377
#, c-format
-msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
-msgstr "Knotenrevision »%s@%ld« behauptet, Zusammenführungsinformationen zu haben, hat aber keine"
+msgid "Node revision index %%%s exceeds container size %%d"
+msgstr "Index für Knotenrevisions-IDs %%%s überschreitet Größe des Containers %%d"
-#: ../libsvn_fs_fs/tree.c:4124
+#: ../libsvn_fs_x/noderevs.c:617
#, c-format
-msgid "Querying mergeinfo requires version %d of the FSFS filesystem schema; filesystem '%s' uses only version %d"
-msgstr "Abfrage der Zusammenführungsinformationen erfordert Version %d des FSFS-Dateisystem-Schemas; Dateisystem »%s« verwendet nur Version %d"
+msgid "Unexpected MD5 digest size %%%s"
+msgstr "Unerwartete Länge für MD5-Prüfsumme %%%s"
-#: ../libsvn_fs_util/fs-util.c:154
-msgid "Filesystem object has not been opened yet"
-msgstr "Dateisystemobjekt ist noch nicht geöffnet"
+#: ../libsvn_fs_x/noderevs.c:629
+#, c-format
+msgid "Unexpected SHA1 digest size %%%s"
+msgstr "Unerwartete Länge für SHA1-Prüfsumme %%%s"
-#: ../libsvn_fs_util/fs-util.c:157
-msgid "Filesystem object already open"
-msgstr "Dateisystemobjekt ist bereits geöffnet"
+#: ../libsvn_fs_x/reps.c:496
+msgid "Text body exceeds star delta container capacity"
+msgstr "Textkörper überschreitet Kapazität des Star Delta Containers"
+
+#: ../libsvn_fs_x/reps.c:501
+msgid "Instruction count exceeds star delta container capacity"
+msgstr "Anzahl der Instruktionen überschreitet Kapazität des Star Delta Containers"
+
+#: ../libsvn_fs_x/verify.c:283
+#, c-format
+msgid "p2l index entry not found for PHYS o%s:s%ld returned by l2p index for LOG r%ld:i%ld"
+msgstr "P2L-Indexeintrag nicht gefunden für PHYS o%s:s%ld zurückgegeben von L2P-Index für LOG r%ld:i%ld"
+
+#: ../libsvn_fs_x/verify.c:392
+#, c-format
+msgid "l2p index entry PHYS o%s:s%ld does not match p2l index value LOG r%ld:i%ld for PHYS o%s:s%ld"
+msgstr "L2P-Indexeintrag PHYS o%s:s%ld stimmt nicht mit dem P2L-Indexwert LOG r%ld:i%ld für PHYS o%s:s%ld überein"
-#: ../libsvn_ra/compat.c:182
+#: ../libsvn_ra/compat.c:183
#, c-format
msgid "Missing changed-path information for '%s' in revision %ld"
msgstr "»%s« fehlt in der Liste der geänderten Pfade von Revision %ld"
-#: ../libsvn_ra/compat.c:326 ../libsvn_ra/compat.c:570
+#: ../libsvn_ra/compat.c:328 ../libsvn_ra/compat.c:572
#, c-format
msgid "Path '%s' doesn't exist in revision %ld"
msgstr "Pfad »%s« existiert nicht in Revision %ld"
-#: ../libsvn_ra/compat.c:403
+#: ../libsvn_ra/compat.c:405
#, c-format
msgid "'%s' in revision %ld is an unrelated object"
msgstr "»%s« in Revision %ld hat keinen Bezug zur Arbeitskopie"
-#: ../libsvn_ra/compat.c:843 ../libsvn_ra/ra_loader.c:1291
+#: ../libsvn_ra/compat.c:845 ../libsvn_ra/ra_loader.c:1275
#, c-format
msgid "Invalid peg revision %ld"
msgstr "Ungültige Fix-Revision %ld"
-#: ../libsvn_ra/compat.c:846 ../libsvn_ra/ra_loader.c:1294
-#: ../libsvn_repos/rev_hunt.c:214 ../libsvn_repos/rev_hunt.c:329
+#: ../libsvn_ra/compat.c:848 ../libsvn_ra/ra_loader.c:1278
+#: ../libsvn_repos/rev_hunt.c:212 ../libsvn_repos/rev_hunt.c:327
#, c-format
msgid "Invalid end revision %ld"
msgstr "Ungültige Endrevision %ld"
-#: ../libsvn_ra/compat.c:849 ../libsvn_ra/ra_loader.c:1297
+#: ../libsvn_ra/compat.c:851 ../libsvn_ra/ra_loader.c:1281
msgid "Peg revision must precede end revision"
msgstr "Fix-Revision muss vor der Endrevision liegen"
-#: ../libsvn_ra/ra_loader.c:215
+#: ../libsvn_ra/ra_loader.c:217
#, c-format
msgid "Mismatched RA version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "Version des ZM »%s« stimmt nicht überein: gefunden %d.%d.%d%s, erwartet %d.%d.%d%s"
-#: ../libsvn_ra/ra_loader.c:292 ../libsvn_ra_serf/serf.c:594
+#: ../libsvn_ra/ra_loader.c:291 ../libsvn_ra_serf/serf.c:828
#, c-format
msgid "Illegal repository URL '%s'"
msgstr "Illegale Projektarchiv-URL »%s«"
-#: ../libsvn_ra/ra_loader.c:399
+#: ../libsvn_ra/ra_loader.c:329
#, c-format
msgid "Invalid config: unknown HTTP library '%s'"
msgstr "Ungültige Konfiguration: Unbekannte HTTP-Bibliothek »%s«"
-#: ../libsvn_ra/ra_loader.c:468
+#: ../libsvn_ra/ra_loader.c:373
#, c-format
msgid "Unrecognized URL scheme for '%s'"
msgstr "Unbekanntes URL-Schema für »%s«"
-#: ../libsvn_ra/ra_loader.c:519
+#: ../libsvn_ra/ra_loader.c:397
+#, c-format
+msgid "Unable to connect to a repository at URL '%s'"
+msgstr "Konnte nicht mit Projektarchiv bei URL »%s« verbinden"
+
+#: ../libsvn_ra/ra_loader.c:425
#, c-format
msgid "Repository UUID '%s' doesn't match expected UUID '%s'"
msgstr "UUID des Projektarchivs »%s« entspricht nicht der erwarteten UUID »%s«"
-#: ../libsvn_ra/ra_loader.c:540
+#: ../libsvn_ra/ra_loader.c:486
#, c-format
msgid "'%s' isn't in the same repository as '%s'"
msgstr "»%s« ist nicht im selben Projektarchiv wie »%s«"
-#: ../libsvn_ra/ra_loader.c:564
+#: ../libsvn_ra/ra_loader.c:510
#, c-format
msgid "'%s' isn't a child of session URL '%s'"
msgstr "»%s« ist kein Kind der Sitzungs-URL »%s«"
-#: ../libsvn_ra/ra_loader.c:580 ../libsvn_ra_svn/client.c:2465
+#: ../libsvn_ra/ra_loader.c:526 ../libsvn_ra_svn/client.c:2592
#, c-format
msgid "'%s' isn't a child of repository root URL '%s'"
msgstr "»%s« ist kein Kind der Projektarchivwurzel-URL »%s«"
-#: ../libsvn_ra/ra_loader.c:624
+#: ../libsvn_ra/ra_loader.c:570
#, c-format
msgid "Specifying 'old_value_p' is not allowed when the '%s' capability is not advertised, and could indicate a bug in your client"
msgstr "Die Angabe von »old_value_p« is nicht erlaubt, wenn die Fähigkeit »%s« nicht bekanntgemacht wurde, und könnte auf einen Bug in Ihrem Client hindeuten"
-#: ../libsvn_ra/ra_loader.c:1445
+#: ../libsvn_ra/ra_loader.c:1421
#, c-format
msgid " - handles '%s' scheme\n"
msgstr " - behandelt Schema »%s«\n"
-#: ../libsvn_ra/ra_loader.c:1538
+#: ../libsvn_ra/ra_loader.c:1514
#, c-format
msgid "Unrecognized URL scheme '%s'"
msgstr "Unbekanntes URL-Schema »%s«"
@@ -4095,7 +4833,7 @@ msgstr "Kann den lokalen Hostnamen nicht ermitteln"
msgid "Couldn't get lock on destination repos after %d attempts"
msgstr "Konnte Sperre für Zielprojektarchiv nach %d Versuchen nicht erhalten"
-#: ../libsvn_ra_local/ra_plugin.c:162
+#: ../libsvn_ra_local/ra_plugin.c:161
msgid "memory-cache-size invalid"
msgstr "Ungültige »memory-cache-size«"
@@ -4105,28 +4843,24 @@ msgstr "Ungültige »memory-cache-size«"
msgid "Module for accessing a repository on local disk."
msgstr "Modul zum Zugriff auf ein Projektarchiv auf der lokalen Festplatte"
-#: ../libsvn_ra_local/ra_plugin.c:579
-msgid "Unable to open an ra_local session to URL"
-msgstr "Kann keine ra_local-Verbindung zu einer URL aufbauen"
-
-#: ../libsvn_ra_local/ra_plugin.c:612 ../libsvn_ra_serf/serf.c:586
+#: ../libsvn_ra_local/ra_plugin.c:679 ../libsvn_ra_serf/serf.c:820
#, c-format
msgid "URL '%s' is not a child of the session's repository root URL '%s'"
msgstr "URL »%s« ist kein Kind der Projektarchivwurzel-URL »%s« der Sitzung"
-#: ../libsvn_ra_local/ra_plugin.c:1140 ../libsvn_ra_local/ra_plugin.c:1597
-#: ../libsvn_ra_serf/util.c:2604
+#: ../libsvn_ra_local/ra_plugin.c:1255 ../libsvn_ra_local/ra_plugin.c:1721
+#: ../libsvn_ra_serf/util.c:1763
#, c-format
msgid "'%s' path not found"
msgstr "»%s« Pfad nicht gefunden"
-#: ../libsvn_ra_local/ra_plugin.c:1539 ../libsvn_ra_serf/options.c:675
-#: ../libsvn_ra_svn/client.c:2666
+#: ../libsvn_ra_local/ra_plugin.c:1663 ../libsvn_ra_serf/options.c:732
+#: ../libsvn_ra_svn/client.c:2793
#, c-format
msgid "Don't know anything about capability '%s'"
msgstr "Es ist nichts über die Eigenschaft »%s« bekannt"
-#: ../libsvn_ra_local/ra_plugin.c:1745
+#: ../libsvn_ra_local/ra_plugin.c:1876
#, c-format
msgid "Unsupported RA loader version (%d) for ra_local"
msgstr "Nicht unterstützte Zugriffsmodul-Laderversion (%d) für ra_local"
@@ -4136,231 +4870,178 @@ msgstr "Nicht unterstützte Zugriffsmodul-Laderversion (%d) für ra_local"
msgid "Unable to open repository '%s'"
msgstr "Projektarchiv »%s« kann nicht geöffnet werden"
-#: ../libsvn_ra_serf/commit.c:215
-#, c-format
-msgid "%s of '%s': %d %s"
-msgstr "%s von »%s«: %d %s"
-
-#: ../libsvn_ra_serf/commit.c:315
+#: ../libsvn_ra_serf/commit.c:285
msgid "No Location header received"
msgstr "Kein »Location« Kopf empfangen"
-#: ../libsvn_ra_serf/commit.c:325
+#: ../libsvn_ra_serf/commit.c:295
msgid "Error parsing Location header value"
msgstr "Fehler beim Auslesen des Wertes aus dem »Location« Kopf"
-#: ../libsvn_ra_serf/commit.c:435
-#, c-format
-msgid "Directory '%s' is out of date; try updating"
-msgstr "Verzeichnis »%s« ist veraltet; versuchen Sie zu aktualisieren"
-
-#: ../libsvn_ra_serf/commit.c:523 ../libsvn_repos/commit.c:512
+#: ../libsvn_ra_serf/commit.c:481 ../libsvn_repos/commit.c:515
#, c-format
msgid "Path '%s' not present"
msgstr "Pfad »%s« existiert nicht"
-#: ../libsvn_ra_serf/commit.c:573
-#, c-format
-msgid "File '%s' is out of date; try updating"
-msgstr "Datei »%s« ist veraltet; versuchen Sie zu aktualisieren"
-
-#: ../libsvn_ra_serf/commit.c:975
-msgid "At least one property change failed; repository is unchanged"
-msgstr "Mindestens eine Eigenschaftsänderung schlug fehl; Projektarchiv nicht geändert"
-
-#: ../libsvn_ra_serf/commit.c:1233
-#, c-format
-msgid "Failed writing updated file"
-msgstr "Fehler beim Schreiben der aktualisierten Datei"
-
-#: ../libsvn_ra_serf/commit.c:1421 ../libsvn_ra_serf/commit.c:1511
-#, c-format
-msgid "%s of '%s': %d %s (%s://%s)"
-msgstr "%s von »%s«: %d %s (%s://%s)"
-
-#: ../libsvn_ra_serf/commit.c:1431
+#: ../libsvn_ra_serf/commit.c:1288
#, c-format
msgid "POST request did not return transaction information"
msgstr "POST-Anfrage lieferte keine Transaktionsinformationen zurück"
-#: ../libsvn_ra_serf/commit.c:1475
-msgid "The OPTIONS response did not include the requested activity-collection-set value"
-msgstr "Die OPTIONS-Antwort enthielt nicht den angeforderten Wert »activity-collection-set«"
-
-#: ../libsvn_ra_serf/commit.c:1718 ../libsvn_ra_serf/commit.c:2127
-#: ../libsvn_ra_serf/update.c:2619
+#: ../libsvn_ra_serf/commit.c:1527 ../libsvn_ra_serf/update.c:2263
#, c-format
msgid "Unable to parse URL '%s'"
msgstr "Konnte die URL »%s« nicht zerlegen"
-#: ../libsvn_ra_serf/commit.c:1746 ../libsvn_ra_serf/util.c:2600
-#, c-format
-msgid "Access to '%s' forbidden"
-msgstr "Zugriff auf »%s« verboten"
-
-#: ../libsvn_ra_serf/commit.c:1750
-#, c-format
-msgid "Adding directory failed: %s on %s (%d %s)"
-msgstr "Hinzufügen eines Verzeichnisses schlug fehl: %s auf %s (%d %s)"
-
-#: ../libsvn_ra_serf/commit.c:1979
+#: ../libsvn_ra_serf/commit.c:1773
#, c-format
msgid "File '%s' already exists"
msgstr "Datei »%s« existiert bereits"
-#: ../libsvn_ra_serf/commit.c:2250
-#, c-format
-msgid "MERGE request failed: returned %d (during commit)"
-msgstr "»MERGE«-Anfrage fehlgeschlagen; gab während der Übertragung %d zurück"
-
-#: ../libsvn_ra_serf/commit.c:2324
-#, fuzzy, c-format
-msgid "DELETE returned unexpected status: %d"
-msgstr "GET-Anfrage gab eine nicht erwartete Delta-Basis zurück: %s"
-
-#: ../libsvn_ra_serf/commit.c:2518
-msgid "DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent"
-msgstr "DAV-Anfrage schlug fehl; möglicherweise ist entweder die Aktion »pre-revprop-change« gescheitert oder sie fehlt"
-
#: ../libsvn_ra_serf/get_deleted_rev.c:173
#, c-format
msgid "'%s' REPORT not implemented"
msgstr "»%s« REPORT nicht implementiert"
-#: ../libsvn_ra_serf/inherited_props.c:171 ../libsvn_ra_serf/property.c:279
-#: ../libsvn_ra_serf/update.c:2468
+#: ../libsvn_ra_serf/get_file.c:376
+msgid "Can't get text contents of a directory"
+msgstr "Kann Textinhalt eines Verzeichnisses nicht lesen"
+
+#: ../libsvn_ra_serf/get_lock.c:170 ../libsvn_ra_serf/lock.c:165
+#, c-format
+msgid "Invalid LOCK timeout value '%s'"
+msgstr "Ungültiger Timeout-Wert für Sperre »%s«"
+
+#: ../libsvn_ra_serf/get_lock.c:323
+msgid "Server does not support locking features"
+msgstr "Server unterstützt keine Sperroperationen"
+
+#: ../libsvn_ra_serf/getdate.c:167
+msgid "The REPORT response did not include the requested properties"
+msgstr "Die REPORT-Antwort enthielt nicht den angeforderten Eigenschaften"
+
+#: ../libsvn_ra_serf/inherited_props.c:173 ../libsvn_ra_serf/property.c:264
+#: ../libsvn_ra_serf/update.c:1886
#, c-format
msgid "Got unrecognized encoding '%s'"
msgstr "Unbekannte Codierung »%s«"
-#: ../libsvn_ra_serf/locks.c:171
+#: ../libsvn_ra_serf/lock.c:261
#, c-format
-msgid "Invalid LOCK timeout value '%s'"
-msgstr "Ungültiger Timeout-Wert für Sperre »%s«"
+msgid "No lock on path '%s' (%d %s)"
+msgstr "Keine Sperre für Pfad »%s« (%d %s)"
-#: ../libsvn_ra_serf/locks.c:243
+#: ../libsvn_ra_serf/lock.c:270
#, c-format
-msgid "Lock request failed: %d %s"
-msgstr "Sperranforderung gescheitert: %d %s"
+msgid "Unlock of '%s' failed (%d %s)"
+msgstr "Freigabe der Sperre von »%s« gescheitert (%d %s)"
-#: ../libsvn_ra_serf/locks.c:424
-msgid "Malformed URL for repository"
-msgstr "Fehlerhafte URL für Projektarchiv"
+#: ../libsvn_ra_serf/lock.c:278
+#, c-format
+msgid "Path '%s' doesn't exist in HEAD revision (%d %s)"
+msgstr "Pfad »%s« existiert nicht in HEAD-Revision (%d %s)"
-#: ../libsvn_ra_serf/locks.c:430
-msgid "Server does not support locking features"
-msgstr "Server unterstützt keine Sperroperationen"
+#: ../libsvn_ra_serf/lock.c:287
+#, c-format
+msgid "Path '%s' already locked (%d %s)"
+msgstr "Pfad »%s« bereits gesperrt (%d %s)"
-#: ../libsvn_ra_serf/locks.c:596
+#: ../libsvn_ra_serf/lock.c:603
#, c-format
msgid "'%s' is not locked in the repository"
msgstr "»%s« ist im Projektarchiv nicht gesperrt"
-#: ../libsvn_ra_serf/locks.c:647 ../libsvn_ra_serf/locks.c:653
-#, c-format
-msgid "Unlock request failed: %d %s"
-msgstr "Sperrfreigabe gescheitert: %d %s"
-
-#: ../libsvn_ra_serf/log.c:169
+#: ../libsvn_ra_serf/log.c:172
#, c-format
msgid "Unsupported encoding '%s'"
msgstr "Nicht unterstützte Kodierung »%s«"
-#: ../libsvn_ra_serf/log.c:568 ../libsvn_ra_svn/client.c:1577
+#: ../libsvn_ra_serf/log.c:574 ../libsvn_ra_svn/client.c:1714
msgid "Server does not support custom revprops via log"
msgstr "Server unterstützt benutzerdefinierte Revisionseigenschaften mittels log nicht"
-#: ../libsvn_ra_serf/merge.c:200
+#: ../libsvn_ra_serf/merge.c:205
#, c-format
msgid "A MERGE response for '%s' is not a child of the destination ('%s')"
msgstr "Eine MERGE-Antwort für »%s« ist kein Kind des Ziels (»%s«)"
-#: ../libsvn_ra_serf/options.c:658
-#, c-format
-msgid "Don't know how to handle '%s' for capability '%s'"
-msgstr "Es ist unklar, wie mit »%s« für Eigenschaft »%s« verfahren werden soll"
+#: ../libsvn_ra_serf/merge.c:446
+msgid "The MERGE response did not include a new revision"
+msgstr "Die MERGE-Antwort enthielt keine neue Revision"
-#: ../libsvn_ra_serf/options.c:682
+#: ../libsvn_ra_serf/multistatus.c:226 ../libsvn_ra_serf/multistatus.c:231
#, c-format
-msgid "Attempt to fetch capability '%s' resulted in '%s'"
-msgstr "Der Versuch, die Eigenschaft »%s« abzufragen, führte zu »%s«"
+msgid "Malformed DAV:status '%s'"
+msgstr "Fehlerhaftes Format in »DAV:status«: »%s«"
-#: ../libsvn_ra_serf/property.c:700
-msgid "The PROPFIND response did not include the requested properties"
-msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Eigenschaften"
+#: ../libsvn_ra_serf/multistatus.c:536
+#, c-format
+msgid "Property operation on '%s' failed"
+msgstr "Operation auf Eigenschaft von »%s« fehlgeschlagen"
-#: ../libsvn_ra_serf/property.c:993
-msgid "The PROPFIND response did not include the requested baseline-collection value"
-msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »baseline-collection«"
+#: ../libsvn_ra_serf/multistatus.c:555
+msgid "<blank error>"
+msgstr "<kein Fehlertext>"
-#: ../libsvn_ra_serf/property.c:1005
-msgid "The PROPFIND response did not include the requested version-name value"
-msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »version-name«"
+#: ../libsvn_ra_serf/multistatus.c:564
+#, c-format
+msgid "While handling the '%s' property on '%s':"
+msgstr "Während der Abwicklung der Eigenschaft »%s« von »%s«:"
-#: ../libsvn_ra_serf/property.c:1043
-msgid "The OPTIONS response did not include the requested checked-in value"
-msgstr "Die OPTIONS-Antwort enthielt nicht den angeforderten Wert »checked-in«"
+#: ../libsvn_ra_serf/multistatus.c:568
+#, c-format
+msgid "While handling the '%s' path:"
+msgstr "Während der Abwicklung des Pfades »%s«:"
-#: ../libsvn_ra_serf/property.c:1125
+#: ../libsvn_ra_serf/options.c:446
msgid "The OPTIONS response did not include the youngest revision"
msgstr "Die OPTIONS-Antwort enthielt nicht die jüngste Revision"
-#: ../libsvn_ra_serf/property.c:1218
-msgid "The PROPFIND response did not include the requested resourcetype value"
-msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »resourcetype«"
-
-#: ../libsvn_ra_serf/property.c:1253
-msgid "The PROPFIND response did not include the requested 'DAV:' properties"
-msgstr "Die PROPFIND-Antwort enthielt nicht die angeforderten »DAV:«-Eigenschaften"
-
-#: ../libsvn_ra_serf/replay.c:222 ../libsvn_ra_serf/update.c:1657
-msgid "Missing revision attr in target-revision element"
-msgstr "Fehlendes Revisionsattribut in Element »target-revision«"
-
-#: ../libsvn_ra_serf/replay.c:240
-msgid "Missing revision attr in open-root element"
-msgstr "Fehlendes Revisionsattribut in Element »open-root«"
+#: ../libsvn_ra_serf/options.c:487
+msgid "The OPTIONS response did not include the requested activity-collection-set value"
+msgstr "Die OPTIONS-Antwort enthielt nicht den angeforderten Wert »activity-collection-set«"
-#: ../libsvn_ra_serf/replay.c:260 ../libsvn_ra_serf/update.c:1885
-msgid "Missing name attr in delete-entry element"
-msgstr "Fehlendes Namensattribut in Element »delete-entry«"
+#: ../libsvn_ra_serf/options.c:529
+msgid "Location header not set on redirect response"
+msgstr "Location-Kopfzeile in der Umleitungsantwort nicht gesetzt"
-#: ../libsvn_ra_serf/replay.c:266
-msgid "Missing revision attr in delete-entry element"
-msgstr "Fehlendes Revisionsattribut in Element »delete-entry«"
+#: ../libsvn_ra_serf/options.c:559 ../libsvn_ra_serf/util.c:1754
+#, c-format
+msgid "Repository moved permanently to '%s'"
+msgstr "Das Projektarchiv wurde permanent nach »%s« verschoben"
-#: ../libsvn_ra_serf/replay.c:286 ../libsvn_ra_serf/update.c:1724
-msgid "Missing name attr in open-directory element"
-msgstr "Fehlendes Namensattribut in Element »open-directory«"
+#: ../libsvn_ra_serf/options.c:560 ../libsvn_ra_serf/util.c:1755
+#, c-format
+msgid "Repository moved temporarily to '%s'"
+msgstr "Das Projektarchiv wurde zeitweilig nach »%s« verschoben"
-#: ../libsvn_ra_serf/replay.c:292 ../libsvn_ra_serf/update.c:1675
-#: ../libsvn_ra_serf/update.c:1715
-msgid "Missing revision attr in open-directory element"
-msgstr "Fehlendes Revisionsattribut in Element »open-directory«"
+#: ../libsvn_ra_serf/options.c:715
+#, c-format
+msgid "Don't know how to handle '%s' for capability '%s'"
+msgstr "Es ist unklar, wie mit »%s« für Eigenschaft »%s« verfahren werden soll"
-#: ../libsvn_ra_serf/replay.c:312 ../libsvn_ra_serf/update.c:1762
-msgid "Missing name attr in add-directory element"
-msgstr "Fehlendes Namensattribut in Element »add-directory«"
+#: ../libsvn_ra_serf/options.c:739
+#, c-format
+msgid "Attempt to fetch capability '%s' resulted in '%s'"
+msgstr "Der Versuch, die Eigenschaft »%s« abzufragen, führte zu »%s«"
-#: ../libsvn_ra_serf/replay.c:349 ../libsvn_ra_serf/update.c:1806
-msgid "Missing name attr in open-file element"
-msgstr "Fehlendes Namensattribut in Element »open-file«"
+#: ../libsvn_ra_serf/property.c:663
+msgid "The PROPFIND response did not include the requested baseline-collection value"
+msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »baseline-collection«"
-#: ../libsvn_ra_serf/replay.c:355 ../libsvn_ra_serf/update.c:1815
-msgid "Missing revision attr in open-file element"
-msgstr "Fehlendes Revisionsattribut in Element »open-file«"
+#: ../libsvn_ra_serf/property.c:683
+msgid "The PROPFIND response did not include the requested version-name value"
+msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »version-name«"
-#: ../libsvn_ra_serf/replay.c:375 ../libsvn_ra_serf/update.c:1840
-msgid "Missing name attr in add-file element"
-msgstr "Fehlendes Namensattribut in Element »add-file«"
+#: ../libsvn_ra_serf/property.c:719
+msgid "The OPTIONS response did not include the requested checked-in value"
+msgstr "Die OPTIONS-Antwort enthielt nicht den angeforderten Wert »checked-in«"
-#: ../libsvn_ra_serf/replay.c:443 ../libsvn_ra_serf/update.c:1981
-#: ../libsvn_ra_serf/update.c:2068
-#, c-format
-msgid "Missing name attr in %s element"
-msgstr "Fehlendes Namensattribut in Element %s"
+#: ../libsvn_ra_serf/property.c:891
+msgid "The PROPFIND response did not include the requested 'DAV:' properties"
+msgstr "Die PROPFIND-Antwort enthielt nicht die angeforderten »DAV:«-Eigenschaften"
-#: ../libsvn_ra_serf/replay.c:578
+#: ../libsvn_ra_serf/replay.c:465
msgid "Error writing stream: unexpected EOF"
msgstr "Fehler beim Schreiben in Datenstrom: unerwartetes EOF"
@@ -4368,11 +5049,11 @@ msgstr "Fehler beim Schreiben in Datenstrom: unerwartetes EOF"
msgid "Failed to read the request"
msgstr "Konnte die Anfrage nicht lesen"
-#: ../libsvn_ra_serf/serf.c:62
+#: ../libsvn_ra_serf/serf.c:63
msgid "Module for accessing a repository via WebDAV protocol using serf."
msgstr "Modul zum Zugriff auf ein Projektarchiv über das Protokoll WebDAV mittels serf."
-#: ../libsvn_ra_serf/serf.c:65
+#: ../libsvn_ra_serf/serf.c:66
#, c-format
msgid ""
"Module for accessing a repository via WebDAV protocol using serf.\n"
@@ -4382,166 +5063,128 @@ msgstr ""
" - verwendet serf %d.%d.%d"
# password store: kwallet, ...
-#: ../libsvn_ra_serf/serf.c:129
+#: ../libsvn_ra_serf/serf.c:130
#, c-format
msgid "Invalid config: unknown %s '%s'"
msgstr "Ungültige Konfiguration: Unbekanntes %s »%s«"
-#: ../libsvn_ra_serf/serf.c:327
+#: ../libsvn_ra_serf/serf.c:362
msgid "Invalid config: illegal character in timeout value"
msgstr "Ungültige Konfiguration: Illegales Zeichen im Timeout-Wert"
-#: ../libsvn_ra_serf/serf.c:331
+#: ../libsvn_ra_serf/serf.c:366
msgid "Invalid config: negative timeout value"
msgstr "Ungültige Konfiguration: Negativer Timeout-Wert"
-#: ../libsvn_ra_serf/serf.c:344
+#: ../libsvn_ra_serf/serf.c:379
msgid "Invalid URL: illegal character in proxy port number"
msgstr "Ungültige URL: Illegales Zeichen in Proxy Portnummer"
-#: ../libsvn_ra_serf/serf.c:348
+#: ../libsvn_ra_serf/serf.c:383
msgid "Invalid URL: negative proxy port number"
msgstr "Ungültige URL: Negative Proxy Portnummer"
-#: ../libsvn_ra_serf/serf.c:351
+#: ../libsvn_ra_serf/serf.c:386
msgid "Invalid URL: proxy port number greater than maximum TCP port number 65535"
msgstr "Ungültige URL: Proxy Portnummer ist größer als die maximale TCP Portnummer 65535"
-#: ../libsvn_ra_serf/serf.c:371
+#: ../libsvn_ra_serf/serf.c:406
#, c-format
msgid "Could not resolve proxy server '%s'"
msgstr "Konnte Proxy-Server »%s« nicht auflösen"
-#: ../libsvn_ra_serf/serf.c:474
+#: ../libsvn_ra_serf/serf.c:516
#, c-format
msgid "Illegal URL '%s'"
msgstr "Ungültige URL »%s«"
-#: ../libsvn_ra_serf/serf.c:546
+#: ../libsvn_ra_serf/serf.c:608
#, c-format
msgid "Connection to '%s' failed"
msgstr "Verbindung zu »%s« fehlgeschlagen"
-#: ../libsvn_ra_serf/serf.c:1216
+#: ../libsvn_ra_serf/serf.c:1026
msgid "The UUID property was not found on the resource or any of its parents"
msgstr "Die UUID-Eigenschaft wurde weder auf der Ressource noch ihren Eltern gefunden."
-#: ../libsvn_ra_serf/serf.c:1290
+#: ../libsvn_ra_serf/serf.c:1101
#, c-format
msgid "Unsupported RA loader version (%d) for ra_serf"
msgstr "Nicht unterstützte Zugriffsmodul-Laderversion (%d) für ra_serf"
-#: ../libsvn_ra_serf/serf.c:1304
+#: ../libsvn_ra_serf/serf.c:1115
#, c-format
msgid "ra_serf was compiled for serf %d.%d.%d but loaded an incompatible %d.%d.%d library"
msgstr "ra_serv wurde für serf %d.%d.%d übersetzt, lud aber die nicht kompatible Version %d.%d.%d der Bibliothek"
-#: ../libsvn_ra_serf/update.c:1115
-#, c-format
-msgid "GET request returned unexpected delta base: %s"
-msgstr "GET-Anfrage gab eine nicht erwartete Delta-Basis zurück: %s"
-
-#: ../libsvn_ra_serf/update.c:1133
-#, c-format
-msgid "GET request failed: %d %s"
-msgstr "GET-Anfrage schlug fehl: %d %s"
-
-#: ../libsvn_ra_serf/update.c:1919
-msgid "Missing name attr in absent-directory element"
-msgstr "Fehlendes Namensattribut in Element »absent-directory«"
+#: ../libsvn_ra_serf/stat.c:106
+msgid "The PROPFIND response did not include the requested resourcetype value"
+msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »resourcetype«"
-#: ../libsvn_ra_serf/update.c:1944
-msgid "Missing name attr in absent-file element"
-msgstr "Fehlendes Namensattribut in Element »absent-file«"
+#: ../libsvn_ra_serf/stat.c:410 ../libsvn_ra_serf/stat.c:448
+msgid "Can't get properties of non-directory"
+msgstr "Kann keine Eigenschaften eines nicht-Verzeichnises lesen"
-#: ../libsvn_ra_serf/update.c:2012 ../libsvn_ra_serf/update.c:2119
+#: ../libsvn_ra_serf/update.c:1135
#, c-format
-msgid "Unknown tag '%s' while at state %d"
-msgstr "Unbekanntes Tag »%s« im Zustand %d"
-
-#: ../libsvn_ra_serf/update.c:2187 ../libsvn_ra_serf/update.c:2309
-#: ../libsvn_ra_serf/update.c:2346
-msgid "The REPORT or PROPFIND response did not include the requested checked-in value"
-msgstr "Die Antwort auf REPORT oder PROPFIND enthielt nicht den angeforderten Wert »checked-in«"
+msgid "GET request returned unexpected delta base: %s"
+msgstr "GET-Anfrage gab eine nicht erwartete Delta-Basis zurück: %s"
-#: ../libsvn_ra_serf/update.c:2528
+#: ../libsvn_ra_serf/update.c:1692 ../libsvn_ra_serf/update.c:1742
#, c-format
-msgid "Error writing to '%s': unexpected EOF"
-msgstr "Fehler beim Schreiben nach »%s«: unerwartetes EOF"
+msgid "Missing '%s' attribute"
+msgstr "Fehlendes Attribut »%s«"
-#: ../libsvn_ra_serf/update.c:2884
-msgid "Error retrieving REPORT"
-msgstr "Fehler beim Holen von REPORT"
+#: ../libsvn_ra_serf/update.c:1956 ../libsvn_ra_serf/update.c:1986
+msgid "The REPORT response did not include the requested checked-in value"
+msgstr "Die REPORT-Antwort enthielt nicht den angeforderten Wert »checked-in«"
-#: ../libsvn_ra_serf/update.c:3093
+#: ../libsvn_ra_serf/update.c:2636
msgid "Missing update-report close tag"
msgstr "Abschließendes Tag »update-report« fehlt"
-#: ../libsvn_ra_serf/update.c:3562
-msgid "Can't get text contents of a directory"
-msgstr "Kann Textinhalt eines Verzeichnisses nicht lesen"
-
-#: ../libsvn_ra_serf/util.c:249
+#: ../libsvn_ra_serf/util.c:195
msgid ": "
msgstr ": "
-#: ../libsvn_ra_serf/util.c:251
+#: ../libsvn_ra_serf/util.c:197
msgid ", "
msgstr ", "
-#: ../libsvn_ra_serf/util.c:462
+#: ../libsvn_ra_serf/util.c:407
msgid "Server SSL certificate verification failed"
msgstr "Überprüfung des Server-SSL-Zertifikats fehlgeschlagen"
-#: ../libsvn_ra_serf/util.c:467
+#: ../libsvn_ra_serf/util.c:412
msgid "certificate is not yet valid"
msgstr "Das Zertifikat ist noch nicht gültig"
-#: ../libsvn_ra_serf/util.c:470
+#: ../libsvn_ra_serf/util.c:415
msgid "certificate has expired"
msgstr "Das Zertifikat ist abgelaufen"
-#: ../libsvn_ra_serf/util.c:474
+#: ../libsvn_ra_serf/util.c:419
msgid "certificate issued for a different hostname"
msgstr "Zertifikat wurde für einen anderen Hostnamen ausgestellt"
-#: ../libsvn_ra_serf/util.c:478
+#: ../libsvn_ra_serf/util.c:423
msgid "issuer is not trusted"
msgstr "Herausgeber wird nicht vertraut"
-#: ../libsvn_ra_serf/util.c:481
+#: ../libsvn_ra_serf/util.c:426
msgid "and other reason(s)"
msgstr "und weitere Gründe"
-#: ../libsvn_ra_serf/util.c:528
+#: ../libsvn_ra_serf/util.c:473
#, c-format
msgid "Invalid config: unable to load certificate file '%s'"
msgstr "Ungültige Konfiguration: Zertifikatsdatei »%s« kann nicht geladen werden"
-#: ../libsvn_ra_serf/util.c:960 ../libsvn_ra_serf/util.c:963
+#: ../libsvn_ra_serf/util.c:911 ../libsvn_ra_serf/util.c:914
msgid "Error running context"
msgstr "Fehler beim Ausführen des Kontextes"
-#: ../libsvn_ra_serf/util.c:1297 ../libsvn_ra_serf/util.c:1302
-#, c-format
-msgid "Malformed DAV:status CDATA '%s'"
-msgstr "Fehlerhafte »CDATA« Daten für »DAV:status«: »%s«"
-
-#: ../libsvn_ra_serf/util.c:1599 ../libsvn_ra_serf/util.c:1702
-#, c-format
-msgid "XML parsing failed"
-msgstr "XML-Parser schlug fehl"
-
-#: ../libsvn_ra_serf/util.c:1602
-#, c-format
-msgid "XML parsing failed: (%d %s)"
-msgstr "XML-Parser schlug fehl: (%d %s)"
-
-#: ../libsvn_ra_serf/util.c:1889
-msgid "The XML response contains invalid XML"
-msgstr "Die XML-Antwort enthält ungültiges XML"
-
-#: ../libsvn_ra_serf/util.c:1954
+#: ../libsvn_ra_serf/util.c:1159
msgid ""
"No more credentials or we tried too many times.\n"
"Authentication failed"
@@ -4549,77 +5192,116 @@ msgstr ""
"Keine weiteren Zugangsdaten oder zu viele Versuche.\n"
"Anmeldung fehlgeschlagen"
-#: ../libsvn_ra_serf/util.c:1976
+#: ../libsvn_ra_serf/util.c:1181
msgid "Proxy authentication failed"
msgstr "Proxy-Anmeldung schlug fehl"
-#: ../libsvn_ra_serf/util.c:2029
+#: ../libsvn_ra_serf/util.c:1236
#, c-format
msgid "%s request on '%s' failed"
msgstr "%s-Anfrage auf »%s« schlug fehl"
-#: ../libsvn_ra_serf/util.c:2101
+#: ../libsvn_ra_serf/util.c:1308
#, c-format
msgid "Premature EOF seen from server (http status=%d)"
msgstr "Vorzeitiges EOF vom Server (http Status=%d)"
-#: ../libsvn_ra_serf/util.c:2170
-#, c-format
-msgid "%s request on '%s' failed: %d %s"
-msgstr "%s-Anfrage auf »%s« schlug fehl: %d %s"
-
-#: ../libsvn_ra_serf/util.c:2492
+#: ../libsvn_ra_serf/util.c:1653
msgid "The PROPFIND response did not include the requested version-controlled-configuration value"
msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Wert »version-controlled-configuration«"
-#: ../libsvn_ra_serf/util.c:2594
+#: ../libsvn_ra_serf/util.c:1759
+#, c-format
+msgid "Access to '%s' forbidden"
+msgstr "Zugriff auf »%s« verboten"
+
+#: ../libsvn_ra_serf/util.c:1766
+#, c-format
+msgid "HTTP method is not allowed on '%s'"
+msgstr "HTTP-Methode ist auf »%s« nicht erlaubt"
+
+#: ../libsvn_ra_serf/util.c:1770
#, c-format
-msgid "Repository moved permanently to '%s'; please relocate"
-msgstr "Das Projektarchiv wurde permanent nach »%s« verschoben; bitte umplatzieren"
+msgid "'%s' conflicts"
+msgstr "»%s« ist von einem Konflikt betroffen"
-#: ../libsvn_ra_serf/util.c:2596
+#: ../libsvn_ra_serf/util.c:1773
#, c-format
-msgid "Repository moved temporarily to '%s'; please relocate"
-msgstr "Das Projektarchiv wurde zeitweilig nach »%s« verschoben; bitte umplatzieren"
+msgid "Precondition on '%s' failed"
+msgstr "Vorbedingung von »%s« fehlgeschlagen"
-#: ../libsvn_ra_serf/util.c:2607
+#: ../libsvn_ra_serf/util.c:1776
#, c-format
msgid "'%s': no lock token available"
msgstr "»%s«: Keine Sperrmarke verfügbar"
-#: ../libsvn_ra_serf/util.c:2611
+#: ../libsvn_ra_serf/util.c:1780
#, c-format
msgid "DAV request failed: 411 Content length required. The server or an intermediate proxy does not accept chunked encoding. Try setting 'http-chunked-requests' to 'auto' or 'no' in your client configuration."
msgstr "DAV-Anfrage fehlgeschlagen: 411 Angabe zur Länge des Inhalts erforderlich. Der Server oder ein dazwischengeschalteter Proxy-Server akzeptiert Kodierung in Teilstücken nicht. Versuchen Sie »http-chunked-requests« auf »auto« oder »no« in der Konfiguration des Clients."
-#: ../libsvn_ra_serf/util.c:2617
+#: ../libsvn_ra_serf/util.c:1786
+#, c-format
+msgid "Unexpected server error %d '%s' on '%s'"
+msgstr "Unerwarteter Serverfehler %d »%s« auf »%s«"
+
+#: ../libsvn_ra_serf/util.c:1790
#, c-format
msgid "The requested feature is not supported by '%s'"
msgstr "Die angeforderte Funktion wird von »%s« nicht unterstützt"
-#: ../libsvn_ra_serf/util.c:2623
+#: ../libsvn_ra_serf/util.c:1796
#, c-format
-msgid "Unexpected HTTP status %d '%s' on '%s'\n"
-msgstr "Unerwarteter HTTP-Status %d »%s« auf »%s«\n"
+msgid "Unexpected HTTP status %d '%s' on '%s'"
+msgstr "Unerwarteter HTTP-Status %d »%s« auf »%s«"
-#: ../libsvn_ra_serf/util.c:2767
+#: ../libsvn_ra_serf/util.c:1815
#, c-format
-msgid "The %s response contains invalid XML (%d %s)"
-msgstr "Die Antwort auf »%s« enthält ungültiges XML (%d %s)"
+msgid "Path '%s' unexpectedly created"
+msgstr "Pfad »%s« wurde unerwartet erstellt"
+
+#: ../libsvn_ra_serf/util.c:1824
+#, c-format
+msgid "The HTTP method '%s' is not allowed on '%s'"
+msgstr "Die HTTP-Methode »%s« ist auf »%s« nicht erlaubt"
+
+#: ../libsvn_ra_serf/util.c:1829
+#, c-format
+msgid "Unexpected HTTP status %d '%s' on '%s' request to '%s'"
+msgstr "Unerwarteter HTTP-Status %d »%s« auf »%s« bei Anfrage an »%s«"
+
+#: ../libsvn_ra_serf/xml.c:502
+#, c-format
+msgid "XML stream truncated: closing '%s' missing"
+msgstr "XML-Strom abgeschnitten: Abschließendes »%s« fehlt"
+
+#: ../libsvn_ra_serf/xml.c:530
+msgid "document element not found"
+msgstr "Dokumenten-Element nicht gefunden"
-#: ../libsvn_ra_serf/xml.c:622
+#: ../libsvn_ra_serf/xml.c:533
+#, c-format
+msgid "XML stream truncated: %s"
+msgstr "XML-Strom abgeschnitten: %s"
+
+#: ../libsvn_ra_serf/xml.c:698
#, c-format
msgid "XML Parsing failed: Unexpected root element '%s'"
msgstr "XML-Parser schlug fehl: Nicht erwartetes Wurzelelement »%s«"
-#: ../libsvn_ra_serf/xml.c:682
+#: ../libsvn_ra_serf/xml.c:758
+#, c-format
+msgid "Missing XML attribute '%s' on '%s' element"
+msgstr "Fehlendes XML-Attribut: »%s« in Element »%s«"
+
+#: ../libsvn_ra_serf/xml.c:916
#, c-format
-msgid "Missing XML attribute: '%s'"
-msgstr "Fehlendes XML-Attribut: »%s«"
+msgid "Malformed XML: %s"
+msgstr "Fehlerhaftes XML: %s"
-#: ../libsvn_ra_serf/xml.c:757
-msgid "The response contains invalid XML"
-msgstr "Die Antwort enthält ungültiges XML"
+#: ../libsvn_ra_serf/xml.c:918
+msgid "The XML response contains invalid XML"
+msgstr "Die XML-Antwort enthält ungültiges XML"
#: ../libsvn_ra_svn/client.c:142
#, c-format
@@ -4635,54 +5317,54 @@ msgstr "Kann nicht mit Host »%s« verbinden"
msgid "Prop diffs element not a list"
msgstr "Eigenschafts-Diff Element ist keine Liste"
-#: ../libsvn_ra_svn/client.c:403
+#: ../libsvn_ra_svn/client.c:404
#, c-format
msgid "Undefined tunnel scheme '%s'"
msgstr "Undefiniertes Tunnelschema »%s«"
-#: ../libsvn_ra_svn/client.c:420
+#: ../libsvn_ra_svn/client.c:421
#, c-format
msgid "Tunnel scheme %s requires environment variable %s to be defined"
msgstr "Für Tunnelschema %s muss die Umgebungsvariable %s definiert sein"
-#: ../libsvn_ra_svn/client.c:431
+#: ../libsvn_ra_svn/client.c:432
#, c-format
msgid "Can't tokenize command '%s'"
msgstr "Kann Anweisung »%s« nicht zerlegen"
-#: ../libsvn_ra_svn/client.c:464
+#: ../libsvn_ra_svn/client.c:475
#, c-format
msgid "Error in child process: %s"
msgstr "Fehler in Kindprozess: %s"
-#: ../libsvn_ra_svn/client.c:539
+#: ../libsvn_ra_svn/client.c:554
msgid "To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file."
msgstr "Um Probleme mit der Konfiguration von SSH zu untersuchen, entfernen Sie die Option »-q« von »ssh« im Abschnitt »[tunnels]« Ihrer Konfigurationsdatei für Subversion."
-#: ../libsvn_ra_svn/client.c:557
+#: ../libsvn_ra_svn/client.c:572
#, c-format
msgid "Illegal svn repository URL '%s'"
msgstr "Illegale svn Projektarchiv URL »%s«"
-#: ../libsvn_ra_svn/client.c:637
+#: ../libsvn_ra_svn/client.c:723
#, c-format
msgid "Server requires minimum version %d"
msgstr "Server erfordert mindestens Version %d"
-#: ../libsvn_ra_svn/client.c:641
+#: ../libsvn_ra_svn/client.c:727
#, c-format
msgid "Server only supports versions up to %d"
msgstr "Server unterstützt nur Versionen bis zu %d"
-#: ../libsvn_ra_svn/client.c:649
+#: ../libsvn_ra_svn/client.c:735
msgid "Server does not support edit pipelining"
msgstr "Server unterstützt »edit pipelining« nicht"
-#: ../libsvn_ra_svn/client.c:686
+#: ../libsvn_ra_svn/client.c:772
msgid "Impossibly long repository root from server"
msgstr "Unmöglich lange Projektarchivbasis vom Server"
-#: ../libsvn_ra_svn/client.c:698
+#: ../libsvn_ra_svn/client.c:784
msgid ""
"Module for accessing a repository using the svn network protocol.\n"
" - with Cyrus SASL authentication"
@@ -4690,149 +5372,154 @@ msgstr ""
"Modul zum Zugriff auf ein Projektarchiv über das svn-Netzwerkprotokoll.\n"
" - mit Cyrus-SASL-Authentifizierung"
-#: ../libsvn_ra_svn/client.c:702
+#: ../libsvn_ra_svn/client.c:788
msgid "Module for accessing a repository using the svn network protocol."
msgstr "Modul zum Zugriff auf ein Projektarchiv über das svn-Netzwerkprotokoll"
-#: ../libsvn_ra_svn/client.c:912
+#: ../libsvn_ra_svn/client.c:1025
msgid "Server did not send repository root"
msgstr "Server gab keine Projektarchivbasis zurück"
-#: ../libsvn_ra_svn/client.c:985
+#: ../libsvn_ra_svn/client.c:1101
#, c-format
msgid "ra_svn does not support not specifying a log message with pre-1.5 servers; consider passing an empty one, or upgrading the server"
msgstr "ra_svn unterstützt die Angabe einer Logmeldung mit Servern älter als 1.5 nicht; Versuchen Sie, eine leere Logmeldung zu übergeben oder verwenden Sie eine neuere Version auf dem Server"
-#: ../libsvn_ra_svn/client.c:1008
+#: ../libsvn_ra_svn/client.c:1124
msgid "Server doesn't support setting arbitrary revision properties during commit"
msgstr "Der Server unterstützt das Setzen beliebiger Revisionseigenschaften während eines Commits nicht"
-#: ../libsvn_ra_svn/client.c:1111
+#: ../libsvn_ra_svn/client.c:1227
msgid "Inherited proplist element not a list"
msgstr "Element für geerbte Eigenschaften ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1186
+#: ../libsvn_ra_svn/client.c:1302
msgid "Non-string as part of file contents"
msgstr "Ein Teil des Dateiinhaltes ist keine Zeichenkette"
-#: ../libsvn_ra_svn/client.c:1272
+#: ../libsvn_ra_svn/client.c:1391
msgid "Dirlist element not a list"
msgstr "Verzeichniseintrag ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1357
+#: ../libsvn_ra_svn/client.c:1400
+#, c-format
+msgid "Invalid directory entry name '%s'"
+msgstr "Ungültiger Name für Verzeichniseintrag »%s«"
+
+#: ../libsvn_ra_svn/client.c:1483
msgid "Mergeinfo element is not a list"
msgstr "Zusammenführungsinfo-Element ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1565
+#: ../libsvn_ra_svn/client.c:1702
msgid "Log entry not a list"
msgstr "Logeintrag ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1612
+#: ../libsvn_ra_svn/client.c:1750
msgid "Changed-path entry not a list"
msgstr "Eintrag für geänderte Pfade ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1778
+#: ../libsvn_ra_svn/client.c:1905
msgid "'stat' not implemented"
msgstr "»stat« nicht implementiert"
-#: ../libsvn_ra_svn/client.c:1837
+#: ../libsvn_ra_svn/client.c:1964
msgid "'get-locations' not implemented"
msgstr "»get-locations« nicht implementiert"
-#: ../libsvn_ra_svn/client.c:1852
+#: ../libsvn_ra_svn/client.c:1979
msgid "Location entry not a list"
msgstr "Ortseintrag ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1891
+#: ../libsvn_ra_svn/client.c:2018
msgid "'get-location-segments' not implemented"
msgstr "»get-location-segments« nicht implementiert"
-#: ../libsvn_ra_svn/client.c:1908
+#: ../libsvn_ra_svn/client.c:2035
msgid "Location segment entry not a list"
msgstr "Ortssegmenteintrag ist keine Liste"
-#: ../libsvn_ra_svn/client.c:1918
+#: ../libsvn_ra_svn/client.c:2045
msgid "Expected valid revision range"
msgstr "Erwartete einen gültigen Revisionsbereich"
-#: ../libsvn_ra_svn/client.c:1959
+#: ../libsvn_ra_svn/client.c:2086
msgid "'get-file-revs' not implemented"
msgstr "»get-file-revs« nicht implementiert"
-#: ../libsvn_ra_svn/client.c:1983
+#: ../libsvn_ra_svn/client.c:2110
msgid "Revision entry not a list"
msgstr "Revisionseintrag ist keine Liste"
-#: ../libsvn_ra_svn/client.c:2000 ../libsvn_ra_svn/client.c:2030
+#: ../libsvn_ra_svn/client.c:2127 ../libsvn_ra_svn/client.c:2157
msgid "Text delta chunk not a string"
msgstr "Text-Deltastück ist kein String"
-#: ../libsvn_ra_svn/client.c:2042
+#: ../libsvn_ra_svn/client.c:2169
msgid "The get-file-revs command didn't return any revisions"
msgstr "Der »get-file-revs« Befehl gab keine Revisionen zurück"
-#: ../libsvn_ra_svn/client.c:2089
+#: ../libsvn_ra_svn/client.c:2216
msgid "Server doesn't support the lock command"
msgstr "Server unterstützt das Kommando »lock« nicht"
-#: ../libsvn_ra_svn/client.c:2153
+#: ../libsvn_ra_svn/client.c:2280
msgid "Server doesn't support the unlock command"
msgstr "Server unterstützt das Kommando »unlock« nicht"
-#: ../libsvn_ra_svn/client.c:2251
+#: ../libsvn_ra_svn/client.c:2378
msgid "Lock response not a list"
msgstr "Antwort beim Sperren ist keine Liste"
-#: ../libsvn_ra_svn/client.c:2265
+#: ../libsvn_ra_svn/client.c:2392
msgid "Unknown status for lock command"
msgstr "Unbekannter Status für Sperrbefehl"
-#: ../libsvn_ra_svn/client.c:2289
+#: ../libsvn_ra_svn/client.c:2416
msgid "Didn't receive end marker for lock responses"
msgstr "Keine Endemarke für Sperrantworten erhalten"
-#: ../libsvn_ra_svn/client.c:2379
+#: ../libsvn_ra_svn/client.c:2506
msgid "Unlock response not a list"
msgstr "Antwort beim Entsperren ist keine Liste"
-#: ../libsvn_ra_svn/client.c:2393
+#: ../libsvn_ra_svn/client.c:2520
msgid "Unknown status for unlock command"
msgstr "Unbekannter Status für Entsperrbefehl"
-#: ../libsvn_ra_svn/client.c:2416
+#: ../libsvn_ra_svn/client.c:2543
msgid "Didn't receive end marker for unlock responses"
msgstr "Keine Endemarke für Entsperrantworten erhalten"
-#: ../libsvn_ra_svn/client.c:2440 ../libsvn_ra_svn/client.c:2492
+#: ../libsvn_ra_svn/client.c:2567 ../libsvn_ra_svn/client.c:2619
msgid "Server doesn't support the get-lock command"
msgstr "Server unterstützt das Kommando »get-lock« nicht"
-#: ../libsvn_ra_svn/client.c:2506
+#: ../libsvn_ra_svn/client.c:2633
msgid "Lock element not a list"
msgstr "Sperrelement ist keine Liste"
-#: ../libsvn_ra_svn/client.c:2549
+#: ../libsvn_ra_svn/client.c:2676
msgid "Server doesn't support the replay command"
msgstr "Server unterstützt das Kommando »replay« nicht"
-#: ../libsvn_ra_svn/client.c:2580
+#: ../libsvn_ra_svn/client.c:2707
msgid "Server doesn't support the replay-range command"
msgstr "Server unterstützt das Kommando »replay-range« nicht"
-#: ../libsvn_ra_svn/client.c:2598
+#: ../libsvn_ra_svn/client.c:2725
#, c-format
msgid "Expected 'revprops', found '%s'"
msgstr "Erwartete »revprops«, fand »%s«"
-#: ../libsvn_ra_svn/client.c:2615
+#: ../libsvn_ra_svn/client.c:2742
msgid "Error while replaying commit"
msgstr "Fehler beim Wiederholen der Ãœbertragung"
-#: ../libsvn_ra_svn/client.c:2688
+#: ../libsvn_ra_svn/client.c:2815
msgid "'get-deleted-rev' not implemented"
msgstr "»get-deleted-rev« nicht implementiert"
-#: ../libsvn_ra_svn/client.c:2787
+#: ../libsvn_ra_svn/client.c:2926
#, c-format
msgid "Unsupported RA loader version (%d) for ra_svn"
msgstr "Nicht unterstützte Zugriffsmodul-Laderversion (%d) für ra_svn"
@@ -4858,38 +5545,38 @@ msgstr "Konnte die SASL-Bibliothek nicht initialisieren: %s%s"
msgid "Could not create SASL context: %s%s"
msgstr "Konnte SASL-Kontext nicht erstellen: %s%s"
-#: ../libsvn_ra_svn/cyrus_auth.c:921 ../libsvn_ra_svn/internal_auth.c:63
+#: ../libsvn_ra_svn/cyrus_auth.c:932 ../libsvn_ra_svn/internal_auth.c:63
#: ../libsvn_ra_svn/internal_auth.c:114
#, c-format
msgid "Authentication error from server: %s"
msgstr "Anmeldefehler von Server: %s"
-#: ../libsvn_ra_svn/cyrus_auth.c:925
+#: ../libsvn_ra_svn/cyrus_auth.c:936
msgid "Can't get username or password"
msgstr "Kann Benutzername oder Passwort nicht erhalten"
-#: ../libsvn_ra_svn/editorp.c:145
+#: ../libsvn_ra_svn/editorp.c:147
msgid "Successful edit status returned too soon"
msgstr "Status für erfolgreiche Bearbeitung wurde zu früh zurückgegeben"
-#: ../libsvn_ra_svn/editorp.c:487
+#: ../libsvn_ra_svn/editorp.c:495
msgid "Invalid file or dir token during edit"
msgstr "Ungültige Datei- oder Verzeichnismarke während der Bearbeitung"
-#: ../libsvn_ra_svn/editorp.c:715
+#: ../libsvn_ra_svn/editorp.c:736
msgid "Apply-textdelta already active"
msgstr "Text-Delta Anwendung bereits aktiv"
-#: ../libsvn_ra_svn/editorp.c:737 ../libsvn_ra_svn/editorp.c:755
+#: ../libsvn_ra_svn/editorp.c:758 ../libsvn_ra_svn/editorp.c:776
msgid "Apply-textdelta not active"
msgstr "Text-Delta Anwendung nicht aktiv"
-#: ../libsvn_ra_svn/editorp.c:850
+#: ../libsvn_ra_svn/editorp.c:871
#, c-format
msgid "Command 'finish-replay' invalid outside of replays"
msgstr "Das Kommando »finish-replay« ist außerhalb von »replay«s ungültig"
-#: ../libsvn_ra_svn/editorp.c:954 ../libsvn_ra_svn/marshal.c:1498
+#: ../libsvn_ra_svn/editorp.c:975 ../libsvn_ra_svn/marshal.c:1608
#, c-format
msgid "Unknown editor command '%s'"
msgstr "Unbekannter Editorbefehl »%s«"
@@ -4898,74 +5585,78 @@ msgstr "Unbekannter Editorbefehl »%s«"
msgid "Can't get password"
msgstr "Kein Passwort erhalten"
-#: ../libsvn_ra_svn/marshal.c:151
+#: ../libsvn_ra_svn/marshal.c:147
msgid "Capability entry is not a word"
msgstr "Eigenschaftseintrag ist kein Wort"
-#: ../libsvn_ra_svn/marshal.c:941
+#: ../libsvn_ra_svn/marshal.c:952
msgid "String length larger than maximum"
msgstr "Stringlänge größer als Maximum"
-#: ../libsvn_ra_svn/marshal.c:1007
-msgid "Too many nested items"
-msgstr "Zu viele verschachtelte Objekte"
+#: ../libsvn_ra_svn/marshal.c:1019
+msgid "Items are nested too deeply"
+msgstr "Elemente sind zu tief verschachtelt"
-#: ../libsvn_ra_svn/marshal.c:1027 ../libsvn_ra_svn/marshal.c:1105
+#: ../libsvn_ra_svn/marshal.c:1040 ../libsvn_ra_svn/marshal.c:1159
msgid "Number is larger than maximum"
msgstr "Zahl ist größer als Maximum"
-#: ../libsvn_ra_svn/marshal.c:1133
+#: ../libsvn_ra_svn/marshal.c:1071
+msgid "Word is too long"
+msgstr "Wort ist zu lang"
+
+#: ../libsvn_ra_svn/marshal.c:1187
msgid "Word too long"
msgstr "Wort zu lang"
-#: ../libsvn_ra_svn/marshal.c:1351
+#: ../libsvn_ra_svn/marshal.c:1447
msgid "Proplist element not a list"
msgstr "Eigenschaftselement ist keine Liste"
-#: ../libsvn_ra_svn/marshal.c:1390
+#: ../libsvn_ra_svn/marshal.c:1486
msgid "Empty error list"
msgstr "Leere Fehlerliste"
-#: ../libsvn_ra_svn/marshal.c:1399 ../libsvn_ra_svn/marshal.c:1425
+#: ../libsvn_ra_svn/marshal.c:1495 ../libsvn_ra_svn/marshal.c:1521
msgid "Malformed error list"
msgstr "Fehlerhafte Fehlerliste"
-#: ../libsvn_ra_svn/marshal.c:1454
+#: ../libsvn_ra_svn/marshal.c:1550
#, c-format
msgid "Unknown status '%s' in command response"
msgstr "Unbekannter Status »%s« in Antwort auf Befehl"
-#: ../libsvn_ra_svn/streams.c:78 ../libsvn_ra_svn/streams.c:157
+#: ../libsvn_ra_svn/streams.c:110
+#, c-format
+msgid "Can't get socket timeout"
+msgstr "Kann Socket-Timeout nicht erhalten"
+
+#: ../libsvn_ra_svn/streams.c:123
#, c-format
msgid "Can't read from connection"
msgstr "Kann nicht aus Verbindung lesen"
-#: ../libsvn_ra_svn/streams.c:91 ../libsvn_ra_svn/streams.c:170
+#: ../libsvn_ra_svn/streams.c:134
#, c-format
msgid "Can't write to connection"
msgstr "Kann nicht in Verbindung schreiben"
-#: ../libsvn_ra_svn/streams.c:144
-#, c-format
-msgid "Can't get socket timeout"
-msgstr "Kann Socket-Timeout nicht erhalten"
-
#: ../libsvn_repos/commit.c:170
#, c-format
msgid "'%s' is out of date"
msgstr "»%s« ist veraltet"
-#: ../libsvn_repos/commit.c:291
+#: ../libsvn_repos/commit.c:294
#, c-format
msgid "Got source path but no source revision for '%s'"
msgstr "Quellpfad, aber keine Quellrevision für »%s« erhalten"
-#: ../libsvn_repos/commit.c:324
+#: ../libsvn_repos/commit.c:327
#, c-format
msgid "Source url '%s' is from different repository"
msgstr "Quell URL »%s« stammt aus einem fremden Projektarchiv"
-#: ../libsvn_repos/commit.c:640
+#: ../libsvn_repos/commit.c:643
#, c-format
msgid ""
"Checksum mismatch for resulting fulltext\n"
@@ -4974,15 +5665,15 @@ msgstr ""
"Prüfsummenfehler für Volltextergebnis\n"
"(%s)"
-#: ../libsvn_repos/commit.c:685
+#: ../libsvn_repos/commit.c:688
msgid "(no error)"
msgstr "(kein Fehler)"
-#: ../libsvn_repos/commit.c:716 ../libsvn_repos/commit.c:722
+#: ../libsvn_repos/commit.c:719 ../libsvn_repos/commit.c:725
msgid "post-commit hook failed with no error message."
msgstr "Aktion »post-commit« schlug ohne Fehlermeldung fehl"
-#: ../libsvn_repos/commit.c:725
+#: ../libsvn_repos/commit.c:728
#, c-format
msgid ""
"post commit FS processing had error:\n"
@@ -4993,11 +5684,11 @@ msgstr ""
"%s\n"
"%s"
-#: ../libsvn_repos/commit.c:726 ../libsvn_repos/commit.c:735
+#: ../libsvn_repos/commit.c:729 ../libsvn_repos/commit.c:738
msgid "(no error message)"
msgstr "(keine Fehlermeldung)"
-#: ../libsvn_repos/commit.c:733
+#: ../libsvn_repos/commit.c:736
#, c-format
msgid ""
"post commit FS processing had error:\n"
@@ -5006,8 +5697,8 @@ msgstr ""
"Aktion »post-commit« meldete einen Fehler:\n"
"%s"
-#: ../libsvn_repos/commit.c:1266 ../libsvn_repos/fs-wrap.c:98
-#: ../libsvn_repos/load-fs-vtable.c:1008
+#: ../libsvn_repos/commit.c:1263 ../libsvn_repos/fs-wrap.c:117
+#: ../libsvn_repos/load-fs-vtable.c:1113
msgid "Commit succeeded, but post-commit hook failed"
msgstr "Übertragen erfolgreich, aber die »post-commit«-Aktion schlug fehl"
@@ -5015,29 +5706,29 @@ msgstr "Übertragen erfolgreich, aber die »post-commit«-Aktion schlug fehl"
msgid "Unable to open root of edit"
msgstr "Kann Basis der Änderung nicht öffnen"
-#: ../libsvn_repos/delta.c:247
+#: ../libsvn_repos/delta.c:236
msgid "Invalid target path"
msgstr "Ungültiger Zielpfad"
-#: ../libsvn_repos/delta.c:251
+#: ../libsvn_repos/delta.c:240
msgid "Delta depth 'exclude' not supported"
msgstr "Delta-Tiefe »exclude« wird nicht unterstützt"
-#: ../libsvn_repos/delta.c:277
+#: ../libsvn_repos/delta.c:266
msgid "Invalid editor anchoring; at least one of the input paths is not a directory and there was no source entry"
msgstr "Ungültiger Editoranker; zumindest einer der Eingabepfade ist kein Verzeichnis und es gab keinen Quelleintrag"
-#: ../libsvn_repos/deprecated.c:614 ../svnadmin/svnadmin.c:780
+#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:923
#, c-format
msgid "* Dumped revision %ld.\n"
msgstr "* Revision %ld ausgegeben.\n"
-#: ../libsvn_repos/deprecated.c:620 ../svnadmin/svnadmin.c:786
+#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:929
#, c-format
msgid "* Verified revision %ld.\n"
msgstr "* Revision %ld verifiziert.\n"
-#: ../libsvn_repos/deprecated.c:628 ../svnadmin/svnadmin.c:834
+#: ../libsvn_repos/deprecated.c:661 ../svnadmin/svnadmin.c:977
#, c-format
msgid ""
"\n"
@@ -5048,7 +5739,7 @@ msgstr ""
"------- Ãœbertrage Revision %ld >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:634 ../svnadmin/svnadmin.c:840
+#: ../libsvn_repos/deprecated.c:667 ../svnadmin/svnadmin.c:983
#, c-format
msgid ""
"\n"
@@ -5059,114 +5750,184 @@ msgstr ""
"------- Neue Revision %ld übertragen (geladen aus Original %ld) >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:853
+#: ../libsvn_repos/deprecated.c:680 ../svnadmin/svnadmin.c:996
#, c-format
msgid " * editing path : %s ..."
msgstr " * Bearbeite Pfad: %s ..."
-#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:859
+#: ../libsvn_repos/deprecated.c:686 ../svnadmin/svnadmin.c:1002
#, c-format
msgid " * deleting path : %s ..."
msgstr " * Lösche Pfad: %s ..."
-#: ../libsvn_repos/deprecated.c:659 ../svnadmin/svnadmin.c:865
+#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:1008
#, c-format
msgid " * adding path : %s ..."
msgstr " * Füge Pfad hinzu: %s ..."
-#: ../libsvn_repos/deprecated.c:665 ../svnadmin/svnadmin.c:871
+#: ../libsvn_repos/deprecated.c:698 ../svnadmin/svnadmin.c:1014
#, c-format
msgid " * replacing path : %s ..."
msgstr " * Ersetze Pfad: %s ..."
-#: ../libsvn_repos/deprecated.c:675 ../svnadmin/svnadmin.c:881
+#: ../libsvn_repos/deprecated.c:708 ../svnadmin/svnadmin.c:1023
msgid " done.\n"
msgstr " erledigt.\n"
-#: ../libsvn_repos/deprecated.c:685 ../svnadmin/svnadmin.c:891
+#: ../libsvn_repos/deprecated.c:718 ../svnadmin/svnadmin.c:1032
#, c-format
msgid "<<< Started new transaction, based on original revision %ld\n"
msgstr "<<< Neue Transaktion basierend auf Originalrevision %ld gestartet\n"
-#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:904
+#: ../libsvn_repos/deprecated.c:725 ../svnadmin/svnadmin.c:1045
#, c-format
msgid " removing '\\r' from %s ..."
msgstr " Entferne »\\r« aus %s ..."
-#: ../libsvn_repos/dump.c:248
+#: ../libsvn_repos/dump.c:790
+#, c-format
+msgid "Path '%s' not found in r%ld."
+msgstr "Pfad »%s« wurde in r%ld nicht gefunden."
+
+#: ../libsvn_repos/dump.c:795
+#, c-format
+msgid "Unexpected node kind %d for '%s' at r%ld. Expected kind was %d."
+msgstr "Unerwartete Knotenart %d für »%s« in r%ld. Erwartete Knotenart war %d."
+
+#: ../libsvn_repos/dump.c:833
+#, c-format
+msgid "Path '%s' exists in r%ld."
+msgstr "Pfad »%s« existiert in r%ld."
+
+#: ../libsvn_repos/dump.c:863
#, c-format
msgid "Mergeinfo referencing revision(s) prior to the oldest dumped revision (r%ld). Loading this dump may result in invalid mergeinfo."
msgstr "Zusammenführungsinformationen verweisen auf Revision(en) vor der ältesten ausgegebene Revision (r%ld). Das Laden dieser Datei kann ungültige Zusammenführungsinformationen zur Folge haben."
-#: ../libsvn_repos/dump.c:310
+#: ../libsvn_repos/dump.c:971
+#, c-format
+msgid "Duplicate representation of path '%s' in %s property of '%s'"
+msgstr "Doppelte Darstellung von Pfad »%s« in Eigenschaft %s von »%s«"
+
+#: ../libsvn_repos/dump.c:1117
#, c-format
msgid "E%06d: While validating fspath '%s': %s"
msgstr "E%06d: Fehler bei Überprüfung von »fspath« »%s«: %s"
-#: ../libsvn_repos/dump.c:432
+#: ../libsvn_repos/dump.c:1156
+#, c-format
+msgid "Change invalid path '%s' in r%ld"
+msgstr "Änderung eines ungültigen Pfades »%s« in r%ld"
+
+#: ../libsvn_repos/dump.c:1180
+#, c-format
+msgid "Deleting invalid path '%s' in r%ld"
+msgstr "Löschen eines ungültigen Pfades »%s« in r%ld"
+
+# TODO: Compare msgid "Attempted to open non-existent child node '%s'"
+# (non-, vs. non; Attempted vs. Attempting)
+#: ../libsvn_repos/dump.c:1199
+#, c-format
+msgid "Replacing non-existent path '%s' in r%ld"
+msgstr "Ersetzen eines nicht existierenden Pfades »%s« in r%ld"
+
+#: ../libsvn_repos/dump.c:1240
+#, c-format
+msgid "Adding already existing path '%s' in r%ld"
+msgstr "Hinzufügen eines schon vorhandenen Pfades »%s« in r%ld"
+
+#: ../libsvn_repos/dump.c:1263
+#, c-format
+msgid "Copying from invalid path to '%s' in r%ld"
+msgstr "Kopieren eines ungültigen Pfades »%s« in r%ld"
+
+#: ../libsvn_repos/dump.c:1275
#, c-format
msgid "Referencing data in revision %ld, which is older than the oldest dumped revision (r%ld). Loading this dump into an empty repository will fail."
msgstr "Verweis auf Daten in Revision %ld, welche älter als die älteste ausgegebene Revision (r%ld) ist. Das Laden dieser Datei in ein leeres Projektarchiv wird fehlschlagen."
-#: ../libsvn_repos/dump.c:1148 ../libsvn_repos/dump.c:1440
+#: ../libsvn_repos/dump.c:1995 ../libsvn_repos/dump.c:2397
#, c-format
msgid "Start revision %ld is greater than end revision %ld"
msgstr "Startrevision %ld ist größer als Endrevision %ld"
-#: ../libsvn_repos/dump.c:1153 ../libsvn_repos/dump.c:1445
+#: ../libsvn_repos/dump.c:2000 ../libsvn_repos/dump.c:2402
#, c-format
msgid "End revision %ld is invalid (youngest revision is %ld)"
msgstr "Endrevision %ld ist ungültig (neueste Revision ist %ld)"
-#: ../libsvn_repos/dump.c:1291
+#: ../libsvn_repos/dump.c:2113
msgid "The range of revisions dumped contained references to copy sources outside that range."
msgstr "Der ausgegebene Revisionsbereich enthält Verweise für Kopien auf Quellpfade außerhalb dieses Bereichs."
-#: ../libsvn_repos/dump.c:1305
+#: ../libsvn_repos/dump.c:2125
msgid "The range of revisions dumped contained mergeinfo which reference revisions outside that range."
msgstr "Der ausgegebene Revisionsbereich enthielt Zusammenführungsinformationen die auf Revisionen außerhalb dieses Bereichs verweisen."
-#: ../libsvn_repos/dump.c:1364
+#: ../libsvn_repos/dump.c:2179
+#, c-format
+msgid "Node '%s' is not a directory."
+msgstr "Knoten »%s« ist kein Verzeichnis."
+
+#: ../libsvn_repos/dump.c:2187
+#, c-format
+msgid "Node '%s' is not a file."
+msgstr "Knoten »%s« ist keine Datei."
+
+#: ../libsvn_repos/dump.c:2192
#, c-format
msgid "Unexpected node kind %d for '%s'"
msgstr "Unerwartete Knotenart %d für »%s«"
-#: ../libsvn_repos/fs-wrap.c:194
+#: ../libsvn_repos/dump.c:2239
+#, c-format
+msgid "Duplicate representation of path '%s'"
+msgstr "Doppelte Darstellung von Pfad »%s«"
+
+#: ../libsvn_repos/dump.c:2448 ../libsvn_repos/dump.c:2501
+#, c-format
+msgid "Repository '%s' failed to verify"
+msgstr "Überprüfung des Projektarchivs »%s« fehlgeschlagen"
+
+#: ../libsvn_repos/fs-wrap.c:213
#, c-format
msgid "Storage of non-regular property '%s' is disallowed through the repository interface, and could indicate a bug in your client"
msgstr "Das Speichern der speziellen Eigenschaft »%s« wird vom Projektarchiv verhindert und könnte auf einen Bug in Ihrem Client hindeuten"
-#: ../libsvn_repos/fs-wrap.c:209
+#: ../libsvn_repos/fs-wrap.c:228
#, c-format
msgid "Cannot accept '%s' property because it is not encoded in UTF-8"
msgstr "Kann Eigenschaft »%s« nicht akzeptieren, da sie nicht in UTF-8 kodiert ist"
-#: ../libsvn_repos/fs-wrap.c:219
+#: ../libsvn_repos/fs-wrap.c:238
#, c-format
msgid "Cannot accept non-LF line endings in '%s' property"
msgstr "Kann nicht-»LF« (LF = Unix-artige) Zeilenumbrüche in Eigenschaft »%s« nicht akzeptieren"
-#: ../libsvn_repos/fs-wrap.c:260
+#: ../libsvn_repos/fs-wrap.c:279
#, c-format
msgid "Commit rejected because mergeinfo on '%s' contains unexpected string terminator"
msgstr "Übertragung abgewiesen, da die Zusammenführungsinformationen von »%s« nicht erwartete Zeichenkettenendmarken enthalten"
-#: ../libsvn_repos/fs-wrap.c:267
+#: ../libsvn_repos/fs-wrap.c:286
#, c-format
msgid "Commit rejected because mergeinfo on '%s' is syntactically invalid"
msgstr "Übertragung abgewiesen, da die Zusammenführungsinformationen von »%s« nicht syntaktisch korrekt sind"
-#: ../libsvn_repos/fs-wrap.c:397
+#: ../libsvn_repos/fs-wrap.c:416
#, c-format
msgid "Write denied: not authorized to read all of revision %ld"
msgstr "Schreiben abgelehnt: Keine Berechtigung, alles von Revision %ld einzulesen."
-#: ../libsvn_repos/fs-wrap.c:581
-#, c-format
-msgid "Cannot unlock path '%s', no authenticated username available"
-msgstr "Kann Pfad »%s« nicht freigeben, kein angemeldeter Benutzername verfügbar"
+#: ../libsvn_repos/fs-wrap.c:629
+msgid "Locking succeeded, but post-lock hook failed"
+msgstr "Sperrung erfolgreich, aber die Aktion »post-ock« schlug fehl"
-#: ../libsvn_repos/fs-wrap.c:597
+#: ../libsvn_repos/fs-wrap.c:735
+msgid "Cannot unlock, no authenticated username available"
+msgstr "Kann nicht freigeben, kein angemeldeter Benutzername verfügbar"
+
+#: ../libsvn_repos/fs-wrap.c:783
msgid "Unlock succeeded, but post-unlock hook failed"
msgstr "Entsperren erfolgreich, aber die Aktion »post-unlock« schlug fehl"
@@ -5238,12 +5999,12 @@ msgstr "Konnte Aktion »%s« nicht starten"
msgid "Error closing null file"
msgstr "Fehler beim Schließen der leeren Standardausgabe"
-#: ../libsvn_repos/hooks.c:446
+#: ../libsvn_repos/hooks.c:454
#, c-format
msgid "Failed to run '%s' hook; broken symlink"
msgstr "Ausführen der Aktion »%s« gescheitert; defekter »Symlink«"
-#: ../libsvn_repos/hooks.c:664
+#: ../libsvn_repos/hooks.c:679
msgid ""
"Repository has not been enabled to accept revision propchanges;\n"
"ask the administrator to create a pre-revprop-change hook"
@@ -5252,13 +6013,13 @@ msgstr ""
"Bitten Sie den Administrator darum, eine Aktion »pre-revprop-change«\n"
"einzurichten."
-#: ../libsvn_repos/load-fs-vtable.c:575 ../svnrdump/load_editor.c:766
+#: ../libsvn_repos/load-fs-vtable.c:589 ../svnrdump/load_editor.c:642
#, c-format
msgid "Relative source revision %ld is not available in current repository"
msgstr "Relative Quellrevision %ld ist im aktuellen Projektarchiv nicht verfügbar."
# CHECKME: Check quotes, s/rev/revision/
-#: ../libsvn_repos/load-fs-vtable.c:589
+#: ../libsvn_repos/load-fs-vtable.c:603
#, c-format
msgid ""
"Copy source checksum mismatch on copy from '%s'@%ld\n"
@@ -5267,56 +6028,64 @@ msgstr ""
"Prüfsummenfehler beim Kopieren von »%s«@%ld\n"
"nach »%s« in der auf r%ld basierten Revision"
-#: ../libsvn_repos/load-fs-vtable.c:653
+#: ../libsvn_repos/load-fs-vtable.c:667
msgid "Malformed dumpstream: Revision 0 must not contain node records"
msgstr "Fehlerhafter Dateiabzug: Revision 0 darf keine Knoteneinträge enthalten"
-#: ../libsvn_repos/load-fs-vtable.c:669
+#: ../libsvn_repos/load-fs-vtable.c:683
#, c-format
msgid "Unrecognized node-action on node '%s'"
msgstr "Unerkannte Knotenaktion auf Knoten »%s«"
-#: ../libsvn_repos/load.c:54
+#: ../libsvn_repos/load-fs-vtable.c:852 ../svnrdump/load_editor.c:778
+msgid "Invalid svn:mergeinfo value"
+msgstr "Ungültiger Wert für svn:mergeinfo"
+
+#: ../libsvn_repos/load-fs-vtable.c:861
+msgid "Invalid svn:mergeinfo value; leaving unchanged"
+msgstr "Ungültiger Wert für svn:mergeinfo; keine Änderungen angewandt"
+
+#: ../libsvn_repos/load.c:46
msgid "Premature end of content data in dumpstream"
msgstr "Vorzeitiges Ende der Daten im Dateiabzug"
-#: ../libsvn_repos/load.c:61
+#: ../libsvn_repos/load.c:53
msgid "Dumpstream data appears to be malformed"
msgstr "Daten des Dateiabzugs scheinen fehlerhaft zu sein"
-#: ../libsvn_repos/load.c:110
+#: ../libsvn_repos/load.c:102
#, c-format
msgid "Dump stream contains a malformed header (with no ':') at '%.20s'"
msgstr "Datenstrom enthält fehlerhaften Kopf (ohne »:«) in »%.20s«"
-#: ../libsvn_repos/load.c:123
+#: ../libsvn_repos/load.c:115
#, c-format
msgid "Dump stream contains a malformed header (with no value) at '%.20s'"
msgstr "Datenstrom enthält fehlerhaften Kopf (ohne Wert) in »%.20s«"
-#: ../libsvn_repos/load.c:212
+#: ../libsvn_repos/load.c:204
msgid "Incomplete or unterminated property block"
msgstr "Eigenschaftsblock ist unvollständig oder nicht terminiert"
-#: ../libsvn_repos/load.c:360
+#: ../libsvn_repos/load.c:344
msgid "Unexpected EOF writing contents"
msgstr "Unerwartetes EOF beim Schreiben der Daten"
-#: ../libsvn_repos/load.c:390
+#: ../libsvn_repos/load.c:374
#, c-format
msgid "Malformed dumpfile header '%s'"
msgstr "Dateiabzug enthält ungültigen Kopf »%s«"
-#: ../libsvn_repos/load.c:397
+#: ../libsvn_repos/load.c:381
#, c-format
msgid "Unsupported dumpfile version: %d"
msgstr "Dateiabzug Version %d wird nicht unterstützt"
-#: ../libsvn_repos/load.c:538
+#: ../libsvn_repos/load.c:522
msgid "Unrecognized record type in stream"
msgstr "Unerkannter Datensatz im Datenstrom"
-#: ../libsvn_repos/load.c:645
+#: ../libsvn_repos/load.c:629
msgid "Sum of subblock sizes larger than total block content length"
msgstr "Die Summe der Größen der Unterblöcke überschreitet die gesamte Blocklänge"
@@ -5325,11 +6094,15 @@ msgstr "Die Summe der Größen der Unterblöcke überschreitet die gesamte Block
msgid "'%s' not found in filesystem"
msgstr "»%s« nicht im Dateisystem gefunden"
-#: ../libsvn_repos/replay.c:546 ../libsvn_repos/replay.c:1267
+#: ../libsvn_repos/replay.c:541 ../libsvn_repos/replay.c:1267
#, c-format
msgid "Filesystem path '%s' is neither a file nor a directory"
msgstr "Pfad »%s« ist weder eine Datei noch ein Verzeichnis"
+#: ../libsvn_repos/replay.c:556
+msgid "Root directory already exists."
+msgstr "Wurzelverzeichnis existiert bereits."
+
#: ../libsvn_repos/reporter.c:205
#, c-format
msgid "Invalid length (%%%s) when about to read a string"
@@ -5340,42 +6113,42 @@ msgstr "Ungültige Länge (%%%s) beim Lesen einer Zeichenkette"
msgid "Invalid depth (%c) for path '%s'"
msgstr "Ungültige Tiefe (%c) für Pfad »%s«"
-#: ../libsvn_repos/reporter.c:951
+#: ../libsvn_repos/reporter.c:950
#, c-format
msgid "Working copy path '%s' does not exist in repository"
msgstr "Arbeitskopiepfad »%s« existiert nicht im Projektarchiv"
-#: ../libsvn_repos/reporter.c:1355
+#: ../libsvn_repos/reporter.c:1357
msgid "Not authorized to open root of edit operation"
msgstr "Keine Berechtigung die Basis der Änderung zu öffnen"
-#: ../libsvn_repos/reporter.c:1372
+#: ../libsvn_repos/reporter.c:1374
#, c-format
msgid "Target path '%s' does not exist"
msgstr "Zielpfad »%s« existiert nicht"
-#: ../libsvn_repos/reporter.c:1380
+#: ../libsvn_repos/reporter.c:1382
msgid "Cannot replace a directory from within"
msgstr "Kann ein Verzeichnis nicht innerhalb sich selbst ersetzen"
-#: ../libsvn_repos/reporter.c:1420
+#: ../libsvn_repos/reporter.c:1422
msgid "Invalid report for top level of working copy"
msgstr "Ungültiger Report für oberste Ebene der Arbeitskopie"
-#: ../libsvn_repos/reporter.c:1435
+#: ../libsvn_repos/reporter.c:1437
msgid "Two top-level reports with no target"
msgstr "Zwei oberste Reports ohne Zielangabe"
-#: ../libsvn_repos/reporter.c:1497
+#: ../libsvn_repos/reporter.c:1499
#, c-format
msgid "Unsupported report depth '%s'"
msgstr "Nicht unterstützte Reporttiefe »%s«"
-#: ../libsvn_repos/reporter.c:1527
+#: ../libsvn_repos/reporter.c:1529
msgid "Depth 'exclude' not supported for link"
msgstr "Tiefe »exclude« wird für Links nicht unterstützt"
-#: ../libsvn_repos/reporter.c:1584
+#: ../libsvn_repos/reporter.c:1586
msgid "Request depth 'exclude' not supported"
msgstr "Angefragte Tiefe »exclude« wird nicht unterstützt"
@@ -5396,131 +6169,151 @@ msgstr "Erzeuge Datenbank-Sperrdatei"
msgid "Creating lock dir"
msgstr "Erzeuge Verzeichnis für Datenbanksperren"
-#: ../libsvn_repos/repos.c:291
+#: ../libsvn_repos/repos.c:367
msgid "Creating hook directory"
msgstr "Lege Verzeichnis für Aktionen an"
-#: ../libsvn_repos/repos.c:373
+#: ../libsvn_repos/repos.c:420
msgid "Creating start-commit hook"
msgstr "Erzeuge Aktion »start-commit«"
-#: ../libsvn_repos/repos.c:465
+#: ../libsvn_repos/repos.c:483
msgid "Creating pre-commit hook"
msgstr "Erzeuge Aktion »pre-commit«"
-#: ../libsvn_repos/repos.c:543
+#: ../libsvn_repos/repos.c:534
msgid "Creating pre-revprop-change hook"
msgstr "Erzeuge Aktion »pre-revprop-change«"
-#: ../libsvn_repos/repos.c:783
+#: ../libsvn_repos/repos.c:600
+msgid "Creating pre-lock hook"
+msgstr "Erzeuge Aktion »pre-lock«"
+
+#: ../libsvn_repos/repos.c:658
+msgid "Creating pre-unlock hook"
+msgstr "Erzeuge Aktion »pre-unlock«"
+
+#: ../libsvn_repos/repos.c:691
msgid "Creating post-commit hook"
msgstr "Erzeuge Aktion »post-commit«"
-#: ../libsvn_repos/repos.c:975
+#: ../libsvn_repos/repos.c:726
+msgid "Creating post-lock hook"
+msgstr "Erzeuge Aktion »post-lock«"
+
+#: ../libsvn_repos/repos.c:758
+msgid "Creating post-unlock hook"
+msgstr "Erzeuge Aktion »post-unlock«"
+
+#: ../libsvn_repos/repos.c:799
msgid "Creating post-revprop-change hook"
msgstr "Erzeuge Aktion »post-revprop-change«"
-#: ../libsvn_repos/repos.c:987
+#: ../libsvn_repos/repos.c:810
msgid "Creating conf directory"
msgstr "Erzeuge Konfigurationsverzeichnis"
-#: ../libsvn_repos/repos.c:1071
+#: ../libsvn_repos/repos.c:894
msgid "Creating svnserve.conf file"
msgstr "Erzeuge Datei »svnserve.conf«"
-#: ../libsvn_repos/repos.c:1089
+#: ../libsvn_repos/repos.c:912
msgid "Creating passwd file"
msgstr "Erzeuge Datei »passwd«"
-#: ../libsvn_repos/repos.c:1131
+#: ../libsvn_repos/repos.c:954
msgid "Creating authz file"
msgstr "Erzeuge Datei »authz«"
-#: ../libsvn_repos/repos.c:1161
+#: ../libsvn_repos/repos.c:984
msgid "Creating hooks-env file"
msgstr "Erzeuge Datei »hooks-env«"
-#: ../libsvn_repos/repos.c:1217
+#: ../libsvn_repos/repos.c:1040
msgid "Could not create top-level directory"
msgstr "Konnte oberstes Verzeichnis nicht erzeugen"
-#: ../libsvn_repos/repos.c:1227
+#: ../libsvn_repos/repos.c:1050
msgid "Creating DAV sandbox dir"
msgstr "Erzeuge Verzeichnis für DAV-Sandkasten"
-#: ../libsvn_repos/repos.c:1296
+#: ../libsvn_repos/repos.c:1119
msgid "Error opening db lockfile"
msgstr "Fehler beim Öffnen der Datenbank-Sperrdatei"
-#: ../libsvn_repos/repos.c:1333
+#: ../libsvn_repos/repos.c:1157
#, c-format
msgid "'%s' is an existing repository"
msgstr "»%s« ist ein vorhandenes Projektarchiv"
-#: ../libsvn_repos/repos.c:1337
+#: ../libsvn_repos/repos.c:1162
#, c-format
msgid "'%s' is a subdirectory of an existing repository rooted at '%s'"
msgstr "»%s« ist ein Unterverzeichnis eines existierenden Projektarchivs mit der Wurzel-URL »%s«"
-#: ../libsvn_repos/repos.c:1345
+#: ../libsvn_repos/repos.c:1172
msgid "Repository creation failed"
msgstr "Anlegen des Projektarchivs schlug fehl"
-#: ../libsvn_repos/repos.c:1430
+#: ../libsvn_repos/repos.c:1262
#, c-format
msgid "Expected repository format '%d' or '%d'; found format '%d'"
msgstr "Erwartetes Format des Projektarchivs »%d« oder »%d«; gefunden »%d«"
-#: ../libsvn_repos/repos.c:1674
+#: ../libsvn_repos/repos.c:1566
#, c-format
msgid "unknown capability '%s'"
msgstr "unbekannte Eigenschaft »%s«"
-#: ../libsvn_repos/rev_hunt.c:71
+#: ../libsvn_repos/rev_hunt.c:73
#, c-format
msgid "Failed to find time on revision %ld"
msgstr "Konnte Zeit für Revision %ld nicht ermitteln"
-#: ../libsvn_repos/rev_hunt.c:210 ../libsvn_repos/rev_hunt.c:325
+#: ../libsvn_repos/rev_hunt.c:208 ../libsvn_repos/rev_hunt.c:323
#, c-format
msgid "Invalid start revision %ld"
msgstr "Ungültige Startrevision %ld"
-#: ../libsvn_repos/rev_hunt.c:518
+#: ../libsvn_repos/rev_hunt.c:503
msgid "Unreadable path encountered; access denied"
msgstr "Nichtlesbarer Pfad angetroffen; Zugriff verweigert"
-#: ../libsvn_repos/rev_hunt.c:1156 ../libsvn_repos/rev_hunt.c:1495
+#: ../libsvn_repos/rev_hunt.c:1123 ../libsvn_repos/rev_hunt.c:1462
#, c-format
msgid "'%s' is not a file in revision %ld"
msgstr "»%s« ist in Revision %ld keine Datei"
-#: ../libsvn_subr/auth.c:223
+#: ../libsvn_subr/auth.c:247
+msgid "No authentication providers registered"
+msgstr "Keine Anmeldemöglichkeiten registriert"
+
+#: ../libsvn_subr/auth.c:253
#, c-format
msgid "No provider registered for '%s' credentials"
msgstr "Kein Anbieter für Zugangsdaten vom Typ »%s« registriert"
-#: ../libsvn_subr/cache-membuffer.c:496
+#: ../libsvn_subr/cache-membuffer.c:628
#, c-format
msgid "Can't lock cache mutex"
msgstr "Kann Zwischenspeicher-Mutex nicht sperren"
-#: ../libsvn_subr/cache-membuffer.c:527 ../libsvn_subr/cache-membuffer.c:543
+#: ../libsvn_subr/cache-membuffer.c:666 ../libsvn_subr/cache-membuffer.c:687
#, c-format
msgid "Can't write-lock cache mutex"
msgstr "Kann Zwischenspeicher-Mutex nicht für das Schreiben sperren"
-#: ../libsvn_subr/cache-membuffer.c:562
+#: ../libsvn_subr/cache-membuffer.c:711
#, c-format
msgid "Can't unlock cache mutex"
msgstr "Kann Zwischenspeicher-Mutex nicht entsperren"
-#: ../libsvn_subr/cache-membuffer.c:1299
+#: ../libsvn_subr/cache-membuffer.c:1807
#, c-format
msgid "Can't create cache mutex"
msgstr "Kann Zwischenspeicher-Mutex nicht anlegen"
-#: ../libsvn_subr/cache-membuffer.c:2034
+#: ../libsvn_subr/cache-membuffer.c:2811
msgid "Can't iterate a membuffer-based cache"
msgstr "Kann einen »memcached«-Zwischenspeicher nicht durchlaufen"
@@ -5530,46 +6323,46 @@ msgstr "Kann einen »memcached«-Zwischenspeicher nicht durchlaufen"
msgid "Unknown memcached error while reading"
msgstr "Unbekannter »memcached«-Fehler beim Lesen"
-#: ../libsvn_subr/cache-memcache.c:238
+#: ../libsvn_subr/cache-memcache.c:258
#, c-format
msgid "Unknown memcached error while writing"
msgstr "Unbekannter »memcached«-Fehler beim Schreiben"
-#: ../libsvn_subr/cache-memcache.c:344
+#: ../libsvn_subr/cache-memcache.c:364
msgid "Can't iterate a memcached cache"
msgstr "Kann keinen »memcached«-Zwischenspeicher durchlaufen"
-#: ../libsvn_subr/cache-memcache.c:444
+#: ../libsvn_subr/cache-memcache.c:460
#, c-format
msgid "Error parsing memcache server '%s'"
msgstr "Fehler beim Abfragen des »memcache«-Servers »%s«"
-#: ../libsvn_subr/cache-memcache.c:452
+#: ../libsvn_subr/cache-memcache.c:468
#, c-format
msgid "Scope not allowed in memcache server '%s'"
msgstr "Bereich ist im »memcache«-Server »%s« nicht erlaubt"
-#: ../libsvn_subr/cache-memcache.c:460
+#: ../libsvn_subr/cache-memcache.c:476
#, c-format
msgid "Must specify host and port for memcache server '%s'"
msgstr "Der Rechner und Port muss für den »memcache«-Server »%s« festgelegt werden"
-#: ../libsvn_subr/cache-memcache.c:480
+#: ../libsvn_subr/cache-memcache.c:496
#, c-format
msgid "Unknown error creating memcache server"
msgstr "Unbekannter Fehler beim Erzeugen eines »memcache«-Servers"
-#: ../libsvn_subr/cache-memcache.c:488
+#: ../libsvn_subr/cache-memcache.c:504
#, c-format
msgid "Unknown error adding server to memcache"
msgstr "Unbekannter Fehler beim Hinzufügen des Servers zu »memcache«"
-#: ../libsvn_subr/cache-memcache.c:561
+#: ../libsvn_subr/cache-memcache.c:574
#, c-format
msgid "Unknown error creating apr_memcache_t"
msgstr "Unbekannter Fehler beim Anlegen von apr_memcache_t"
-#: ../libsvn_subr/checksum.c:470
+#: ../libsvn_subr/checksum.c:626
#, c-format
msgid ""
"%s:\n"
@@ -5580,103 +6373,202 @@ msgstr ""
" Erwartet: %s\n"
" Tatsächlich: %s\n"
-#: ../libsvn_subr/cmdline.c:655
+#: ../libsvn_subr/cmdline.c:760
#, c-format
msgid "Error initializing command line arguments"
msgstr "Fehler beim Initialisieren der Kommandozeilenparameter"
-#: ../libsvn_subr/cmdline.c:744
+#: ../libsvn_subr/cmdline.c:849
msgid "Invalid syntax of argument of --config-option"
msgstr "Ungültige Syntax im Argument von --config-option"
-#: ../libsvn_subr/cmdline.c:771
+#: ../libsvn_subr/cmdline.c:876
#, c-format
msgid "Unrecognized file in argument of %s"
msgstr "Unbekannte Datei im Parameter von %s"
# FIXME: s/whitespace/whitespaceS/?
-#: ../libsvn_subr/cmdline.c:1017
+#: ../libsvn_subr/cmdline.c:1122
msgid "The EDITOR, SVN_EDITOR or VISUAL environment variable or 'editor-cmd' run-time configuration option is empty or consists solely of whitespace. Expected a shell command."
msgstr "Die Umgebungsvariable EDITOR, SVN_EDITOR oder VISUAL oder die Laufzeitkonfigurationsoption »editor-cmd« ist leer oder besteht nur aus Leerzeichen. Erwartete ein Shell-Kommando."
-#: ../libsvn_subr/cmdline.c:1024
+#: ../libsvn_subr/cmdline.c:1129
msgid "None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found"
msgstr "Keine der Umgebungsvariablen SVN_EDITOR, VISUAL oder EDITOR ist gesetzt und keine Laufzeitkonfigurationsoption »editor-cmd« wurde gefunden"
-#: ../libsvn_subr/cmdline.c:1049 ../libsvn_subr/cmdline.c:1133
+#: ../libsvn_subr/cmdline.c:1154 ../libsvn_subr/cmdline.c:1238
#, c-format
msgid "Can't get working directory"
msgstr "Kann Arbeitsverzeichnis nicht ermitteln"
-#: ../libsvn_subr/cmdline.c:1060 ../libsvn_subr/cmdline.c:1144
-#: ../libsvn_subr/cmdline.c:1169
+#: ../libsvn_subr/cmdline.c:1165 ../libsvn_subr/cmdline.c:1249
+#: ../libsvn_subr/cmdline.c:1274
#, c-format
msgid "Can't change working directory to '%s'"
msgstr "Kann Arbeitsverzeichnis nicht nach »%s« wechseln"
-#: ../libsvn_subr/cmdline.c:1068 ../libsvn_subr/cmdline.c:1316
+#: ../libsvn_subr/cmdline.c:1173 ../libsvn_subr/cmdline.c:1421
#, c-format
msgid "Can't restore working directory"
msgstr "Kann nicht in das Arbeitsverzeichnis zurückwechseln"
-#: ../libsvn_subr/cmdline.c:1075 ../libsvn_subr/cmdline.c:1251
+#: ../libsvn_subr/cmdline.c:1180 ../libsvn_subr/cmdline.c:1356
#, c-format
msgid "system('%s') returned %d"
msgstr "Aufruf des Editors »%s« gab Fehler %d zurück"
-#: ../libsvn_subr/cmdline.c:1196
+#: ../libsvn_subr/cmdline.c:1301
#, c-format
msgid "Can't write to '%s'"
msgstr "Kann nicht nach »%s« schreiben"
-#: ../libsvn_subr/cmdline.c:1211 ../libsvn_subr/cmdline.c:1226
-#: ../libsvn_subr/cmdline.c:1260 ../libsvn_subr/io.c:3616
+#: ../libsvn_subr/cmdline.c:1316 ../libsvn_subr/cmdline.c:1331
+#: ../libsvn_subr/cmdline.c:1365 ../libsvn_subr/io.c:3999
#, c-format
msgid "Can't stat '%s'"
msgstr "Kann Status von »%s« nicht ermitteln"
-#: ../libsvn_subr/cmdline.c:1285
+#: ../libsvn_subr/cmdline.c:1390
msgid "Error normalizing edited contents to internal format"
msgstr "Fehler beim Normalisieren des bearbeiteten Inhalts ins interne Format"
-#: ../libsvn_subr/config.c:739
+#: ../libsvn_subr/compress.c:143
+msgid "Compression of svndiff data failed"
+msgstr "Komprimierung der svndiff-Daten schlug fehl"
+
+#: ../libsvn_subr/compress.c:179
+msgid "Decompression of zlib compressed data failed: no size"
+msgstr "Dekomprimierung der mit zlib komprimierten Daten schlug fehl: Größe nicht angegeben"
+
+#: ../libsvn_subr/compress.c:182
+msgid "Decompression of zlib compressed data failed: size too large"
+msgstr "Dekomprimierung der mit zlib komprimierten Daten schlug fehl: Größe zu groß"
+
+#: ../libsvn_subr/compress.c:207
+msgid "Decompression of svndiff data failed"
+msgstr "Dekomprimierung der svndiff-Daten schlug fehl"
+
+#: ../libsvn_subr/compress.c:214
+msgid "Size of uncompressed data does not match stored original length"
+msgstr "Die Größe der unkomprimierten Daten entspricht nicht der gespeicherten Originallänge"
+
+#: ../libsvn_subr/compress.c:230
+#, c-format
+msgid "Unsupported compression method %d"
+msgstr "Nicht unterstützte Komprimierungsmethode %d"
+
+#: ../libsvn_subr/config.c:805
#, c-format
msgid "Config error: invalid boolean value '%s' for '[%s] %s'"
msgstr "Konfigurationsfehler: Ungültiger logischer Wert »%s« für »[%s] %s«"
-#: ../libsvn_subr/config.c:744
+#: ../libsvn_subr/config.c:810
#, c-format
msgid "Config error: invalid boolean value '%s' for '%s'"
msgstr "Konfigurationsfehler: Ungültiger logischer Wert »%s« für »%s«"
-#: ../libsvn_subr/config.c:1173
+#: ../libsvn_subr/config.c:1239
#, c-format
msgid "Config error: invalid integer value '%s'"
msgstr "Konfigurationsfehler: Ungültige Ganzzahl »%s«"
-#: ../libsvn_subr/config_auth.c:100
+#: ../libsvn_subr/config_auth.c:96
msgid "Unable to open auth file for reading"
msgstr "Kann »Auth« Datei nicht zum Lesen öffnen"
-#: ../libsvn_subr/config_auth.c:105
+#: ../libsvn_subr/config_auth.c:101
#, c-format
msgid "Error parsing '%s'"
msgstr "Fehler beim Zerlegen von »%s«"
# Ist hier jetzt 'Authentifizierung' = Anmeldung oder 'Autorisierung' = Berechtigung gemeint?
-#: ../libsvn_subr/config_auth.c:135
+#: ../libsvn_subr/config_auth.c:130
msgid "Unable to locate auth file"
msgstr "Kann »Auth« Datei nicht finden"
-#: ../libsvn_subr/config_auth.c:146
+#: ../libsvn_subr/config_auth.c:142
msgid "Unable to open auth file for writing"
msgstr "Kann »Auth« Datei nicht zum Schreiben öffnen"
-#: ../libsvn_subr/config_auth.c:150
+#: ../libsvn_subr/config_auth.c:144
#, c-format
msgid "Error writing hash to '%s'"
msgstr "Fehler beim Schreiben des Hashwerts nach »%s«"
+#: ../libsvn_subr/config_file.c:344
+#, c-format
+msgid "line %d: Option must end with ':' or '='"
+msgstr "Zeile %d: Option muss mit »:« oder »=« enden"
+
+#: ../libsvn_subr/config_file.c:387
+#, c-format
+msgid "line %d: Section header must end with ']'"
+msgstr "Zeile %d: Abschnittskopf muss mit »]« enden"
+
+#: ../libsvn_subr/config_file.c:554
+#, c-format
+msgid "Error while parsing config file: %s:"
+msgstr "Fehler beim Auswerten der Konfigurationsdatei: %s:"
+
+#: ../libsvn_subr/config_file.c:596
+#, c-format
+msgid "line %d: Section header must start in the first column"
+msgstr "Zeile %d: Abschnittskopf muss in der ersten Spalte beginnen"
+
+#: ../libsvn_subr/config_file.c:609
+#, c-format
+msgid "line %d: Comment must start in the first column"
+msgstr "Zeile %d: Kommentar muss in der ersten Spalte beginnen"
+
+#: ../libsvn_subr/config_file.c:624
+#, c-format
+msgid "line %d: Section header expected"
+msgstr "Zeile %d: Abschnittskopf erwartet"
+
+#: ../libsvn_subr/config_file.c:628
+#, c-format
+msgid "line %d: Option expected"
+msgstr "Zeile %d: Option erwartet"
+
+#: ../libsvn_subr/config_win.c:93
+msgid "Can't determine the system config path"
+msgstr "Kann Pfad für die Systemeinstellungen nicht ermitteln"
+
+#: ../libsvn_subr/config_win.c:94
+msgid "Can't determine the user's config path"
+msgstr "Kann Pfad für die Benutzereinstellungen nicht ermitteln"
+
+#: ../libsvn_subr/config_win.c:137
+msgid "Can't enumerate registry values"
+msgstr "Kann Werte in der Registrierungsdatenbank nicht aufzählen"
+
+#: ../libsvn_subr/config_win.c:154
+msgid "Can't read registry value data"
+msgstr "Kann Daten für Werte in der Registrierungsdatenbank nicht lesen"
+
+#: ../libsvn_subr/config_win.c:191
+#, c-format
+msgid "Unrecognised registry path '%s'"
+msgstr "Unbekannter Pfad in Registrierungsdatenbank »%s«"
+
+#: ../libsvn_subr/config_win.c:203
+#, c-format
+msgid "Can't open registry key '%s'"
+msgstr "Kann Schlüssel »%s« in Registrierungsdatenbank nicht öffnen"
+
+#: ../libsvn_subr/config_win.c:207
+#, c-format
+msgid "Can't find registry key '%s'"
+msgstr "Kann Schlüssel »%s« in Registrierungsdatenbank nicht finden"
+
+#: ../libsvn_subr/config_win.c:245
+msgid "Can't enumerate registry keys"
+msgstr "Kann Schlüssel in der Registrierungsdatenbank nicht aufzählen"
+
+#: ../libsvn_subr/config_win.c:255
+msgid "Can't open existing subkey"
+msgstr "Kann vorhandenen Unterschlüssel nicht öffnen"
+
#: ../libsvn_subr/crypto.c:93
#, c-format
msgid "Failed to initialize cryptography subsystem"
@@ -5769,7 +6661,7 @@ msgstr "Kann die das angeforderte Datum nicht berechnen"
msgid "Can't expand time"
msgstr "Kann Zeitangabe nicht expandieren"
-#: ../libsvn_subr/deprecated.c:361 ../libsvn_subr/opt.c:302
+#: ../libsvn_subr/deprecated.c:364 ../libsvn_subr/opt.c:302
msgid ""
"\n"
"Valid options:\n"
@@ -5777,7 +6669,7 @@ msgstr ""
"\n"
"Gültige Optionen:\n"
-#: ../libsvn_subr/deprecated.c:437 ../libsvn_subr/opt.c:417
+#: ../libsvn_subr/deprecated.c:440 ../libsvn_subr/opt.c:417
#, c-format
msgid ""
"\"%s\": unknown command.\n"
@@ -5786,277 +6678,273 @@ msgstr ""
"»%s«: unbekannter Befehl.\n"
"\n"
-#: ../libsvn_subr/deprecated.c:615 ../libsvn_subr/opt.c:1239
-#: ../svnrdump/svnrdump.c:646
+#: ../libsvn_subr/deprecated.c:618 ../libsvn_subr/opt.c:1232
+#: ../svnrdump/svnrdump.c:615
#, c-format
msgid "Type '%s help' for usage.\n"
msgstr "Geben Sie »%s help« für weitere Hilfe ein.\n"
-#: ../libsvn_subr/deprecated.c:1023
+#: ../libsvn_subr/deprecated.c:1026
#, c-format
msgid "'%s' is neither a file nor a directory name"
msgstr "»%s« ist weder ein Datei- noch ein Verzeichnisname"
-#: ../libsvn_subr/dirent_uri.c:1605
+#: ../libsvn_subr/dirent_uri.c:1628
#, c-format
msgid "Couldn't determine absolute path of '%s'"
msgstr "Konnte den absoluten Pfad von »%s« nicht ermitteln"
-#: ../libsvn_subr/dirent_uri.c:2314
+#: ../libsvn_subr/dirent_uri.c:2342
#, c-format
msgid "Local URL '%s' does not contain 'file://' prefix"
msgstr "Lokale URL »%s« enthält keinen »file://« Präfix"
-#: ../libsvn_subr/dirent_uri.c:2393
+#: ../libsvn_subr/dirent_uri.c:2421
#, c-format
msgid "Local URL '%s' contains only a hostname, no path"
msgstr "Lokale URL »%s« enthält nur einen Rechnernamen aber keinen Pfad"
-#: ../libsvn_subr/dirent_uri.c:2407
+#: ../libsvn_subr/dirent_uri.c:2435
#, c-format
msgid "Local URL '%s' contains unsupported hostname"
msgstr "Lokale URL »%s« enthält einen nicht unterstützten Rechnernamen"
-#: ../libsvn_subr/error.c:263
-msgid "Additional errors:"
-msgstr "Zusätzliche Fehler:"
-
-#: ../libsvn_subr/error.c:524
+#: ../libsvn_subr/error.c:553
msgid "Can't recode error string from APR"
msgstr "Kann Fehlermeldung von APR nicht umkodieren"
-#: ../libsvn_subr/error.c:624
+#: ../libsvn_subr/error.c:646
#, c-format
msgid "%swarning: W%06d: %s\n"
msgstr "%sWarnung: W%06d: %s\n"
-#: ../libsvn_subr/error.c:706
+#: ../libsvn_subr/error.c:752
#, c-format
msgid "In file '%s' line %d: assertion failed (%s)"
msgstr "In Datei »%s«, Zeile %d: Assert-Anweisung schlug fehl (%s)"
-#: ../libsvn_subr/error.c:710
+#: ../libsvn_subr/error.c:756
#, c-format
msgid "In file '%s' line %d: internal malfunction"
msgstr "In Datei »%s«, Zeile %d: interne Fehlfunktion"
-#: ../libsvn_subr/error.c:766
+#: ../libsvn_subr/error.c:818
msgid "stream error"
msgstr "Datenstromfehler"
-#: ../libsvn_subr/error.c:771
+#: ../libsvn_subr/error.c:823
msgid "out of memory"
msgstr "Nicht genügend Speicher"
-#: ../libsvn_subr/error.c:776
+#: ../libsvn_subr/error.c:828
msgid "buffer error"
msgstr "Pufferfehler"
-#: ../libsvn_subr/error.c:781
+#: ../libsvn_subr/error.c:833
msgid "version error"
msgstr "Versionsfehler"
-#: ../libsvn_subr/error.c:786
+#: ../libsvn_subr/error.c:838
msgid "corrupt data"
msgstr "Fehlerhafte Daten"
# FIXME: Grammar depends on usage!!!!!!! (prepanded by "bei")
-#: ../libsvn_subr/error.c:791
+#: ../libsvn_subr/error.c:843
msgid "unknown error"
msgstr "Unbekannter Fehler"
-#: ../libsvn_subr/gpg_agent.c:358 ../libsvn_subr/prompt.c:631
+#: ../libsvn_subr/gpg_agent.c:409 ../libsvn_subr/prompt.c:627
#, c-format
msgid "Password for '%s': "
msgstr "Passwort für »%s«: "
-#: ../libsvn_subr/gpg_agent.c:359
+#: ../libsvn_subr/gpg_agent.c:410
#, c-format
msgid "Enter your Subversion password for %s"
msgstr "Geben Sie Ihr Subversion-Passwort für %s ein"
-#: ../libsvn_subr/hash.c:120
+#: ../libsvn_subr/hash.c:126
msgid "Serialized hash missing terminator"
msgstr "Serialisierte Prüfsumme hat kein Endzeichen"
-#: ../libsvn_subr/hash.c:129 ../libsvn_subr/hash.c:142
-#: ../libsvn_subr/hash.c:153 ../libsvn_subr/hash.c:165
-#: ../libsvn_subr/hash.c:173 ../libsvn_subr/hash.c:183
-#: ../libsvn_subr/hash.c:196 ../libsvn_subr/hash.c:204
+#: ../libsvn_subr/hash.c:135 ../libsvn_subr/hash.c:148
+#: ../libsvn_subr/hash.c:160 ../libsvn_subr/hash.c:172
+#: ../libsvn_subr/hash.c:176 ../libsvn_subr/hash.c:186
+#: ../libsvn_subr/hash.c:199 ../libsvn_subr/hash.c:208
msgid "Serialized hash malformed"
msgstr "Fehlerhafte serialisierte Prüfsumme"
-#: ../libsvn_subr/hash.c:244
+#: ../libsvn_subr/hash.c:282
msgid "Cannot serialize negative length"
msgstr "Kann negative Länge nicht serialisieren"
-#: ../libsvn_subr/io.c:309
+#: ../libsvn_subr/io.c:331
#, c-format
msgid "Can't check path '%s'"
msgstr "Kann Pfad »%s« nicht prüfen"
-#: ../libsvn_subr/io.c:537 ../libsvn_subr/io.c:4558
+#: ../libsvn_subr/io.c:578 ../libsvn_subr/io.c:4951
#, c-format
msgid "Can't open '%s'"
msgstr "Kann »%s« nicht öffnen"
-#: ../libsvn_subr/io.c:563 ../libsvn_subr/io.c:649
+#: ../libsvn_subr/io.c:604 ../libsvn_subr/io.c:690
#, c-format
msgid "Unable to make name for '%s'"
msgstr "Kann Namen für »%s« nicht erstellen"
-#: ../libsvn_subr/io.c:636
+#: ../libsvn_subr/io.c:677
#, c-format
msgid "Can't create symbolic link '%s'"
msgstr "Kann symbolischen Link »%s« nicht anlegen"
-#: ../libsvn_subr/io.c:653 ../libsvn_subr/io.c:686 ../libsvn_subr/io.c:714
+#: ../libsvn_subr/io.c:694 ../libsvn_subr/io.c:729 ../libsvn_subr/io.c:757
+#: ../libsvn_subr/io.c:1933
msgid "Symbolic links are not supported on this platform"
msgstr "Symbolische Verweise werden auf dieser Plattform nicht unterstützt"
-#: ../libsvn_subr/io.c:676
+#: ../libsvn_subr/io.c:717 ../libsvn_subr/io.c:1892 ../libsvn_subr/io.c:1912
#, c-format
msgid "Can't read contents of link"
msgstr "Kann Inhalt des Verweises nicht lesen"
-#: ../libsvn_subr/io.c:734
+#: ../libsvn_subr/io.c:777
#, c-format
msgid "Can't find a temporary directory"
msgstr "Kann temporäres Verzeichnis nicht finden"
-#: ../libsvn_subr/io.c:852
+#: ../libsvn_subr/io.c:895
#, c-format
msgid "Can't copy '%s' to '%s'"
msgstr "Kann »%s« nicht nach »%s« kopieren"
-#: ../libsvn_subr/io.c:895 ../libsvn_subr/io.c:917 ../libsvn_subr/io.c:963
-#: ../libsvn_subr/io.c:4691
+#: ../libsvn_subr/io.c:938 ../libsvn_subr/io.c:960 ../libsvn_subr/io.c:1006
+#: ../libsvn_subr/io.c:5083
#, c-format
msgid "Can't set permissions on '%s'"
msgstr "Kann Berechtigungen auf »%s« nicht setzen"
-#: ../libsvn_subr/io.c:913 ../libsvn_subr/io.c:1984 ../libsvn_subr/io.c:2043
-#: ../libsvn_subr/io.c:4596
+#: ../libsvn_subr/io.c:956 ../libsvn_subr/io.c:2157 ../libsvn_subr/io.c:2216
+#: ../libsvn_subr/io.c:4989
#, c-format
msgid "Can't get file name"
msgstr "Kann keinen Dateinamen holen"
-#: ../libsvn_subr/io.c:987
+#: ../libsvn_subr/io.c:1029
#, c-format
msgid "Can't append '%s' to '%s'"
msgstr "Kann »%s« nicht an »%s« anhängen"
-#: ../libsvn_subr/io.c:1033
+#: ../libsvn_subr/io.c:1075
#, c-format
msgid "Destination '%s' already exists"
msgstr "Ziel »%s« existiert bereits"
-#: ../libsvn_subr/io.c:1137
+#: ../libsvn_subr/io.c:1184
#, c-format
msgid "Can't make directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht anlegen"
-#: ../libsvn_subr/io.c:1206
+#: ../libsvn_subr/io.c:1286
#, c-format
msgid "Can't set access time of '%s'"
msgstr "Kann Zugriffszeit von »%s« nicht setzen"
-#: ../libsvn_subr/io.c:1535 ../libsvn_subr/io.c:1637
+#: ../libsvn_subr/io.c:1616 ../libsvn_subr/io.c:1718
#, c-format
msgid "Can't change perms of file '%s'"
msgstr "Kann die Zugriffsrechte der Datei »%s« nicht ändern"
-#: ../libsvn_subr/io.c:1803
+#: ../libsvn_subr/io.c:1846
+#, c-format
+msgid "Can't get attributes of file '%s'"
+msgstr "Kann Attributinformationen der Datei »%s« nicht lesen"
+
+#: ../libsvn_subr/io.c:1854
+#, c-format
+msgid "Can't set attributes of file '%s'"
+msgstr "Kann Attributinformationen der Datei »%s« nicht setzen"
+
+#: ../libsvn_subr/io.c:1976
#, c-format
msgid "Can't set file '%s' read-only"
msgstr "Kann den Schreibschutz der Datei »%s« nicht setzen"
-#: ../libsvn_subr/io.c:1835
+#: ../libsvn_subr/io.c:2008
#, c-format
msgid "Can't set file '%s' read-write"
msgstr "Kann den Schreibschutz der Datei »%s« nicht aufheben"
-#: ../libsvn_subr/io.c:1874 ../libsvn_subr/io.c:1908
+#: ../libsvn_subr/io.c:2047 ../libsvn_subr/io.c:2081
#, c-format
msgid "Error getting UID of process"
msgstr "Fehler beim Ermitteln der Prozess-UID"
-#: ../libsvn_subr/io.c:2010
+#: ../libsvn_subr/io.c:2183
#, c-format
msgid "Can't get shared lock on file '%s'"
msgstr "Kann keine gemeinsame Sperre für Datei »%s« erhalten"
-#: ../libsvn_subr/io.c:2048
+#: ../libsvn_subr/io.c:2221
#, c-format
msgid "Can't unlock file '%s'"
msgstr "Kann Datei »%s« nicht entsprerren"
-#: ../libsvn_subr/io.c:2103 ../libsvn_subr/io.c:3511
-#, c-format
-msgid "Can't flush file '%s'"
-msgstr "Kann Datei »%s« nicht leeren"
-
-#: ../libsvn_subr/io.c:2104 ../libsvn_subr/io.c:3512
-#, c-format
-msgid "Can't flush stream"
-msgstr "Kann Datenstrom nicht leeren"
-
-#: ../libsvn_subr/io.c:2116 ../libsvn_subr/io.c:2133
+#: ../libsvn_subr/io.c:2319 ../libsvn_subr/io.c:2340
#, c-format
msgid "Can't flush file to disk"
msgstr "Kann Datei nicht auf Festplatte leeren"
-#: ../libsvn_subr/io.c:2225 ../libsvn_subr/prompt.c:197
-#: ../svnserve/svnserve.c:822
+#: ../libsvn_subr/io.c:2430 ../libsvn_subr/prompt.c:197
#, c-format
msgid "Can't open stdin"
msgstr "Kann Standardeingabe nicht öffnen"
-#: ../libsvn_subr/io.c:2245
+#: ../libsvn_subr/io.c:2450
msgid "Reading from stdin is disallowed"
msgstr "Lesen von der Standardeingabe ist nicht erlaubt"
-#: ../libsvn_subr/io.c:2312
+#: ../libsvn_subr/io.c:2519
#, c-format
msgid "Can't remove file '%s'"
msgstr "Kann Datei »%s« nicht löschen"
-#: ../libsvn_subr/io.c:2399
+#: ../libsvn_subr/io.c:2606
#, c-format
msgid "Can't remove '%s'"
msgstr "Kann »%s« nicht löschen"
-#: ../libsvn_subr/io.c:2562
+#: ../libsvn_subr/io.c:2769
#, c-format
msgid "Path '%s' not found, case obstructed by '%s'"
msgstr "Pfad »%s« nicht gefunden, Groß- und Kleinschreibung durch »%s« blockiert"
-#: ../libsvn_subr/io.c:2601
+#: ../libsvn_subr/io.c:2808
#, c-format
msgid "Path '%s' not found"
msgstr "Pfad »%s« nicht gefunden"
-#: ../libsvn_subr/io.c:2675
+#: ../libsvn_subr/io.c:2882
#, c-format
msgid "Can't create process '%s' attributes"
msgstr "Kann Attribute von Prozess »%s« nicht erzeugen"
-#: ../libsvn_subr/io.c:2682
+#: ../libsvn_subr/io.c:2889
#, c-format
msgid "Can't set process '%s' cmdtype"
msgstr "Kann Kommandotyp von Prozess »%s« nicht setzen "
-#: ../libsvn_subr/io.c:2694
+#: ../libsvn_subr/io.c:2905
#, c-format
msgid "Can't set process '%s' directory"
msgstr "Kann Verzeichnis von Prozess »%s« nicht setzen"
-#: ../libsvn_subr/io.c:2708
+#: ../libsvn_subr/io.c:2919
#, c-format
msgid "Can't set process '%s' child input"
msgstr "Kann Eingabe des Kindprozesses »%s« nicht setzen"
-#: ../libsvn_subr/io.c:2716
+#: ../libsvn_subr/io.c:2927
#, c-format
msgid "Can't set process '%s' child outfile"
msgstr "Kann Ausgabe des Kindprozesses »%s« nicht setzen"
@@ -6064,65 +6952,65 @@ msgstr "Kann Ausgabe des Kindprozesses »%s« nicht setzen"
# FIXME: Laut Code ist %s der Kindprozess. Müsste es dann nicht
# "Can't set child process '%s' errfile" (oder ganz ohne child) heißen?
# (Es gibt kein child von %s)
-#: ../libsvn_subr/io.c:2724
+#: ../libsvn_subr/io.c:2935
#, c-format
msgid "Can't set process '%s' child errfile"
msgstr "Kann Fehlerausgabe des Kindprozesses »%s« nicht setzen"
-#: ../libsvn_subr/io.c:2738
+#: ../libsvn_subr/io.c:2949
#, c-format
msgid "Can't set process '%s' stdio pipes"
msgstr "Kann Standard-IO-Datenströme des Prozesses »%s« nicht setzen "
-#: ../libsvn_subr/io.c:2746
+#: ../libsvn_subr/io.c:2957
#, c-format
msgid "Can't set process '%s' child errfile for error handler"
msgstr "Kann Datei für die Fehlerbehandlung des Kindprozesses »%s« nicht setzen"
-#: ../libsvn_subr/io.c:2753
+#: ../libsvn_subr/io.c:2964
#, c-format
msgid "Can't set process '%s' error handler"
msgstr "Kann die Fehlerbehandlung des Prozesses »%s« nicht setzen"
-#: ../libsvn_subr/io.c:2776
+#: ../libsvn_subr/io.c:2987
#, c-format
msgid "Can't start process '%s'"
msgstr "Kann Prozess »%s« nicht starten"
-#: ../libsvn_subr/io.c:2800
+#: ../libsvn_subr/io.c:3011
#, c-format
msgid "Error waiting for process '%s'"
msgstr "Fehler beim Warten auf Prozess »%s«"
# CHECKME: Isn't "exitwhy" an internal detail?
-#: ../libsvn_subr/io.c:2809
+#: ../libsvn_subr/io.c:3020
#, c-format
msgid "Process '%s' failed (signal %d, core dumped)"
msgstr "Prozess »%s« schlug fehl (Signal %d, Core-Dump)"
# CHECKME: Isn't "exitwhy" an internal detail?
-#: ../libsvn_subr/io.c:2814
+#: ../libsvn_subr/io.c:3025
#, c-format
msgid "Process '%s' failed (signal %d)"
msgstr "Prozess »%s« schlug fehl (Signal %d)"
# CHECKME: Isn't "exitwhy" an internal detail?
-#: ../libsvn_subr/io.c:2820
+#: ../libsvn_subr/io.c:3031
#, c-format
msgid "Process '%s' failed (exitwhy %d, exitcode %d)"
msgstr "Prozess »%s« schlug fehl (Exit-Grund %d, Exit-Code %d)"
-#: ../libsvn_subr/io.c:2828
+#: ../libsvn_subr/io.c:3039
#, c-format
msgid "Process '%s' returned error exitcode %d"
msgstr "Prozess »%s« hat Fehlerwert %d zurückgegeben"
-#: ../libsvn_subr/io.c:2935
+#: ../libsvn_subr/io.c:3146
#, c-format
msgid "'%s' returned %d"
msgstr "»%s« hat %d zurückgegeben"
-#: ../libsvn_subr/io.c:3055
+#: ../libsvn_subr/io.c:3267
#, c-format
msgid ""
"Error running '%s': exitcode was %d, args were:\n"
@@ -6137,284 +7025,273 @@ msgstr ""
"%s\n"
"%s"
-#: ../libsvn_subr/io.c:3196
+#: ../libsvn_subr/io.c:3408
#, c-format
msgid "Can't detect MIME type of non-file '%s'"
msgstr "Kann MIME Typ der nicht-Datei »%s« nicht ermitteln"
-#: ../libsvn_subr/io.c:3291
+#: ../libsvn_subr/io.c:3503
#, c-format
msgid "Can't open file '%s'"
msgstr "Kann Datei »%s« nicht öffnen"
-#: ../libsvn_subr/io.c:3331
+#: ../libsvn_subr/io.c:3543
#, c-format
msgid "Can't close file '%s'"
msgstr "Kann Datei »%s« nicht schließen"
-#: ../libsvn_subr/io.c:3332
+#: ../libsvn_subr/io.c:3544
#, c-format
msgid "Can't close stream"
msgstr "Kann Datenstrom nicht schließen"
-#: ../libsvn_subr/io.c:3341 ../libsvn_subr/io.c:3377 ../libsvn_subr/io.c:3402
+#: ../libsvn_subr/io.c:3553 ../libsvn_subr/io.c:3589 ../libsvn_subr/io.c:3614
+#: ../libsvn_subr/io.c:3703
#, c-format
msgid "Can't read file '%s'"
msgstr "Kann Datei »%s« nicht lesen"
-#: ../libsvn_subr/io.c:3342 ../libsvn_subr/io.c:3378 ../libsvn_subr/io.c:3403
+#: ../libsvn_subr/io.c:3554 ../libsvn_subr/io.c:3590 ../libsvn_subr/io.c:3615
+#: ../libsvn_subr/io.c:3704
#, c-format
msgid "Can't read stream"
msgstr "Kann nicht aus Datenstrom lesen"
-#: ../libsvn_subr/io.c:3351
+#: ../libsvn_subr/io.c:3563
#, c-format
msgid "Can't write file '%s'"
msgstr "Kann Datei »%s« nicht schreiben"
-#: ../libsvn_subr/io.c:3352
+#: ../libsvn_subr/io.c:3564
#, c-format
msgid "Can't write stream"
msgstr "Kann nicht in Datenstrom schreiben"
-#: ../libsvn_subr/io.c:3366
+#: ../libsvn_subr/io.c:3578
#, c-format
msgid "Can't get attribute information from file '%s'"
msgstr "Kann keine Attributinformationen aus Datei »%s« lesen"
-#: ../libsvn_subr/io.c:3367
+#: ../libsvn_subr/io.c:3579
#, c-format
msgid "Can't get attribute information from stream"
msgstr "Kann keine Attributinformationen aus Datenstrom lesen"
-#: ../libsvn_subr/io.c:3414
+#: ../libsvn_subr/io.c:3626
#, c-format
msgid "Can't set position pointer in file '%s'"
msgstr "Kann Positionszeiger in Datei »%s« nicht setzen"
-#: ../libsvn_subr/io.c:3415
+#: ../libsvn_subr/io.c:3627
#, c-format
msgid "Can't set position pointer in stream"
msgstr "Kann Positionszeiger in Datenstrom nicht setzen"
-#: ../libsvn_subr/io.c:3426 ../libsvn_subr/io.c:3473
+#: ../libsvn_subr/io.c:3713
+#, c-format
+msgid "Can't seek in file '%s'"
+msgstr "Kann Position in Datei »%s« nicht setzen"
+
+#: ../libsvn_subr/io.c:3714
+#, c-format
+msgid "Can't seek in stream"
+msgstr "Kann Position im Datenstrom nicht setzen"
+
+#: ../libsvn_subr/io.c:3731 ../libsvn_subr/io.c:3788
#, c-format
msgid "Can't write to file '%s'"
msgstr "Kann nicht in Datei »%s« schreiben"
-#: ../libsvn_subr/io.c:3427 ../libsvn_subr/io.c:3474
+#: ../libsvn_subr/io.c:3732 ../libsvn_subr/io.c:3789
#, c-format
msgid "Can't write to stream"
msgstr "Kann nicht in Datenstrom schreiben"
-#: ../libsvn_subr/io.c:3516
+#: ../libsvn_subr/io.c:3742 ../libsvn_subr/io.c:3894
+#, c-format
+msgid "Can't flush file '%s'"
+msgstr "Kann Datei »%s« nicht leeren"
+
+#: ../libsvn_subr/io.c:3743 ../libsvn_subr/io.c:3895
+#, c-format
+msgid "Can't flush stream"
+msgstr "Kann Datenstrom nicht leeren"
+
+#: ../libsvn_subr/io.c:3863
+#, c-format
+msgid "Can't write '%s' atomically"
+msgstr "Kann »%s« nicht unteilbar schreiben"
+
+#: ../libsvn_subr/io.c:3899
#, c-format
msgid "Can't truncate file '%s'"
msgstr "Kann Datei »%s« nicht abschneiden"
-#: ../libsvn_subr/io.c:3517
+#: ../libsvn_subr/io.c:3900
#, c-format
msgid "Can't truncate stream"
msgstr "Kann Datenstrom nicht abschneiden"
-#: ../libsvn_subr/io.c:3590
+#: ../libsvn_subr/io.c:3973
#, c-format
msgid "Can't read length line in file '%s'"
msgstr "Kann Längenzeile nicht aus Datei »%s« lesen"
-#: ../libsvn_subr/io.c:3594
+#: ../libsvn_subr/io.c:3977
msgid "Can't read length line in stream"
msgstr "Kann Längenzeile nicht aus Datenstrom lesen"
-#: ../libsvn_subr/io.c:3651
+#: ../libsvn_subr/io.c:4034 ../libsvn_subr/stream.c:2264
#, c-format
msgid "Can't move '%s' to '%s'"
msgstr "Kann »%s« nicht nach »%s« verschieben"
-#: ../libsvn_subr/io.c:3732
+#: ../libsvn_subr/io.c:4121
#, c-format
msgid "Can't create directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht anlegen"
-#: ../libsvn_subr/io.c:3755
+#: ../libsvn_subr/io.c:4133 ../libsvn_subr/io.c:4147
#, c-format
msgid "Can't hide directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht verstecken"
-#: ../libsvn_subr/io.c:3815 ../libsvn_subr/io.c:3938
+#: ../libsvn_subr/io.c:4208 ../libsvn_subr/io.c:4331
#, c-format
msgid "Can't open directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht öffnen"
-#: ../libsvn_subr/io.c:3850
+#: ../libsvn_subr/io.c:4243
#, c-format
msgid "Can't remove directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht entfernen"
-#: ../libsvn_subr/io.c:3868
+#: ../libsvn_subr/io.c:4261
#, c-format
msgid "Can't read directory"
msgstr "Kann Verzeichnis nicht lesen"
-#: ../libsvn_subr/io.c:3888
+#: ../libsvn_subr/io.c:4281
#, c-format
msgid "Error closing directory"
msgstr "Fehler beim Schließen eines Verzeichnisses"
-#: ../libsvn_subr/io.c:3957
+#: ../libsvn_subr/io.c:4350
#, c-format
msgid "Can't read directory entry in '%s'"
msgstr "Kann Verzeichniseintrag in »%s« nicht lesen"
-#: ../libsvn_subr/io.c:4083
+#: ../libsvn_subr/io.c:4476
#, c-format
msgid "Can't check directory '%s'"
msgstr "Kann Verzeichnis »%s« nicht prüfen"
-#: ../libsvn_subr/io.c:4145
+#: ../libsvn_subr/io.c:4538
#, c-format
msgid "Reading '%s'"
msgstr "Lese »%s«"
-#: ../libsvn_subr/io.c:4164
+#: ../libsvn_subr/io.c:4557
#, c-format
msgid "First line of '%s' contains non-digit"
msgstr "Die erste Zeile von »%s« enthält eine Nicht-Ziffer"
-#: ../libsvn_subr/io.c:4479
+#: ../libsvn_subr/io.c:4872
#, c-format
msgid "Can't create temporary file from template '%s'"
msgstr "Kann temporäre Datei von Vorlage »%s« nicht anlegen"
-#: ../libsvn_subr/io.c:4568
+#: ../libsvn_subr/io.c:4961
#, c-format
msgid "Can't set aside '%s'"
msgstr "Kann »%s« nicht beiseitelegen"
-#: ../libsvn_subr/io.c:4580
+#: ../libsvn_subr/io.c:4973 ../libsvn_subr/stream.c:2078
#, c-format
msgid "Unable to make name in '%s'"
msgstr "Kann Namen in »%s« nicht erstellen"
-#: ../libsvn_subr/mergeinfo.c:100 ../libsvn_subr/mergeinfo.c:677
+#: ../libsvn_subr/mergeinfo.c:101 ../libsvn_subr/mergeinfo.c:714
msgid "Pathname not terminated by ':'"
msgstr "Pfadnamen sind nicht durch »:« getrennt"
-#: ../libsvn_subr/mergeinfo.c:103
-msgid "No pathname preceding ':'"
-msgstr "Vor »:« steht kein Pfadname"
-
-#: ../libsvn_subr/mergeinfo.c:521
+#: ../libsvn_subr/mergeinfo.c:518
#, c-format
msgid "Invalid character '%c' found in revision list"
msgstr "Ungültiges Zeichen »%c« in Revisionsliste gefunden"
-#: ../libsvn_subr/mergeinfo.c:529
+#: ../libsvn_subr/mergeinfo.c:526
#, c-format
msgid "Invalid revision number '0' found in range list"
msgstr "Ungültige Revisionsnummer '0' in Revisionsbereichsliste gefunden"
-#: ../libsvn_subr/mergeinfo.c:540
+#: ../libsvn_subr/mergeinfo.c:537
#, c-format
msgid "Unable to parse reversed revision range '%ld-%ld'"
msgstr "Rückwärtiger Revisionsbereich »%ld-%ld« kann nicht verarbeitet werden"
-#: ../libsvn_subr/mergeinfo.c:545
+#: ../libsvn_subr/mergeinfo.c:542
#, c-format
msgid "Unable to parse revision range '%ld-%ld' with same start and end revisions"
msgstr "Revisionbereich »%ld-%ld« mit selber Start- und Endrevision kann nicht verarbeitet werden"
-#: ../libsvn_subr/mergeinfo.c:582 ../libsvn_subr/mergeinfo.c:589
+#: ../libsvn_subr/mergeinfo.c:579 ../libsvn_subr/mergeinfo.c:586
#, c-format
msgid "Invalid character '%c' found in range list"
msgstr "Ungültiges Zeichen »%c« in der Bereichsliste gefunden"
-#: ../libsvn_subr/mergeinfo.c:596
+#: ../libsvn_subr/mergeinfo.c:593
msgid "Range list parsing ended before hitting newline"
msgstr "Einlesen der Bereichsliste endete vor dem Zeilenumbruch"
-#: ../libsvn_subr/mergeinfo.c:637
+#: ../libsvn_subr/mergeinfo.c:670
#, c-format
msgid "Unable to parse overlapping revision ranges '%s' and '%s' with different inheritance types"
msgstr "Überlappende Revisionsbereiche »%s« und »%s« mit verschiedenen Vererbungstypen können nicht verarbeitet werden"
-#: ../libsvn_subr/mergeinfo.c:685
+#: ../libsvn_subr/mergeinfo.c:722
#, c-format
msgid "Mergeinfo for '%s' maps to an empty revision range"
msgstr "Zusammenführungsinformationen für »%s« verweisen auf einen leeren Revisionsbereich"
-#: ../libsvn_subr/mergeinfo.c:689
+#: ../libsvn_subr/mergeinfo.c:726
#, c-format
msgid "Could not find end of line in range list line in '%s'"
msgstr "Konnte Zeilenende in Bereichslistenzeile in »%s« nicht finden"
-#: ../libsvn_subr/mergeinfo.c:753
+#: ../libsvn_subr/mergeinfo.c:790
#, c-format
msgid "Could not parse mergeinfo string '%s'"
msgstr "Konnte Zusammenführungsinformationszeichenkette »%s« nicht einlesen"
-#: ../libsvn_subr/mergeinfo.c:2301
+#: ../libsvn_subr/mergeinfo.c:2367
msgid "NULL mergeinfo catalog\n"
msgstr "Zusammenführungsinformationskatalog ist NULL\n"
-#: ../libsvn_subr/mergeinfo.c:2306
+#: ../libsvn_subr/mergeinfo.c:2372
msgid "empty mergeinfo catalog\n"
msgstr "Zusammenführungsinformationskatalog ist leer\n"
-#: ../libsvn_subr/mutex.c:45
+#: ../libsvn_subr/mutex.c:69
#, c-format
msgid "Can't create mutex"
msgstr "Kann Mutex nicht erzeugen"
-#: ../libsvn_subr/mutex.c:62
+#: ../libsvn_subr/mutex.c:86
#, c-format
msgid "Can't lock mutex"
msgstr "Kann Mutex nicht sperren"
-#: ../libsvn_subr/mutex.c:78
+#: ../libsvn_subr/mutex.c:102
#, c-format
msgid "Can't unlock mutex"
msgstr "Kann Mutex nicht entsperren"
-#: ../libsvn_subr/named_atomic.c:335
-msgid "Not a valid atomic"
-msgstr "Kein gültiges »atomic«"
-
-#: ../libsvn_subr/named_atomic.c:474
+#: ../libsvn_subr/nls.c:69
#, c-format
-msgid "MMAP failed for file '%s'"
-msgstr "MMAP für Datei »%s« schlug fehl"
-
-#: ../libsvn_subr/named_atomic.c:486
-msgid "Number of atomics in namespace is too large."
-msgstr "Zahl der »atomic«-Elemente im Namenraum ist zu groß"
-
-#: ../libsvn_subr/named_atomic.c:537
-msgid "Atomic's name is too long."
-msgstr "Name des »atomic« ist zu lang"
-
-#: ../libsvn_subr/named_atomic.c:543
-msgid "Namespace has not been initialized."
-msgstr "Namensraum wurde noch nicht initialisiert"
-
-#: ../libsvn_subr/named_atomic.c:591
-msgid "Out of slots for named atomic."
-msgstr "Keine freien Plätze für benanntes »atomic« mehr übrig"
-
-#: ../libsvn_subr/nls.c:80
-#, c-format
-msgid "Can't convert string to UCS-2: '%s'"
-msgstr "Kann Zeichenkette nicht in UCS-2 konvertieren: »%s«"
-
-#: ../libsvn_subr/nls.c:87
msgid "Can't get module file name"
msgstr "Kann Namen der Moduldatei nicht ermitteln"
-#: ../libsvn_subr/nls.c:102
-#, c-format
-msgid "Can't convert module path to UTF-8 from UCS-2: '%s'"
-msgstr "Kann Modulpfad nicht von UTF-8 in UCS-2 konvertieren: »%s«"
-
#: ../libsvn_subr/opt.c:189
msgid " ARG"
msgstr " PAR"
@@ -6441,28 +7318,23 @@ msgstr "Syntaxfehler bei der Analyse der Fix-Revision »%s«"
msgid "Revision property pair is empty"
msgstr "Revisionseigenschaftspaar ist leer"
-#: ../libsvn_subr/opt.c:981 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:336
+#: ../libsvn_subr/opt.c:981 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:338
#: ../svn/propset-cmd.c:68
#, c-format
msgid "'%s' is not a valid Subversion property name"
msgstr "»%s« ist kein gültiger Subversion-Eigenschaftsname"
-#: ../libsvn_subr/opt.c:1018
-#, c-format
-msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
-msgstr "»%s« ist nur eine Fix-Revision. Meinten Sie stattdessen »%s@«?"
-
-#: ../libsvn_subr/opt.c:1064
+#: ../libsvn_subr/opt.c:1057
#, c-format
msgid "URL '%s' contains a '..' element"
msgstr "URL »%s« enthält ein »..« Element"
-#: ../libsvn_subr/opt.c:1097
+#: ../libsvn_subr/opt.c:1090
#, c-format
msgid "Error resolving case of '%s'"
msgstr "Fehler beim Ermitteln der Groß-/Kleinschreibung von »%s«"
-#: ../libsvn_subr/opt.c:1119
+#: ../libsvn_subr/opt.c:1112
#, c-format
msgid ""
"%s, version %s\n"
@@ -6473,7 +7345,7 @@ msgstr ""
" übersetzt am %s, um %s auf %s\n"
"\n"
-#: ../libsvn_subr/opt.c:1136
+#: ../libsvn_subr/opt.c:1129
msgid ""
"System information:\n"
"\n"
@@ -6481,30 +7353,38 @@ msgstr ""
"Systeminformationen:\n"
"\n"
-#: ../libsvn_subr/opt.c:1137
+#: ../libsvn_subr/opt.c:1130
#, c-format
msgid "* running on %s\n"
msgstr "* ausgeführt auf %s\n"
-#: ../libsvn_subr/opt.c:1141
+#: ../libsvn_subr/opt.c:1134
#, c-format
msgid " - %s\n"
msgstr " - %s\n"
-#: ../libsvn_subr/opt.c:1151
+#: ../libsvn_subr/opt.c:1144
msgid "* linked dependencies:\n"
msgstr "* eingebundene Abhändigleiten:\n"
-#: ../libsvn_subr/opt.c:1176
+#: ../libsvn_subr/opt.c:1169
msgid "* loaded shared libraries:\n"
msgstr "* geladene dynamische Bibliotheken:\n"
+#: ../libsvn_subr/packed_data.c:736
+msgid "Unexpected end of stream"
+msgstr "Unerwartetes Ende des Datenstroms"
+
+#: ../libsvn_subr/packed_data.c:742
+msgid "Integer representation too long"
+msgstr "Ganzzahldarstellung zu lang"
+
#: ../libsvn_subr/path.c:1114
#, c-format
msgid "Can't determine the native path encoding"
msgstr "Kann die Zeichencodierung des Pfades nicht ermitteln"
-#: ../libsvn_subr/path.c:1303
+#: ../libsvn_subr/path.c:1299
#, c-format
msgid "Improper relative URL '%s'"
msgstr "Fehlerhafte relative URL »%s«"
@@ -6518,35 +7398,30 @@ msgstr "Kann Terminal nicht schließen"
msgid "Can't open stderr"
msgstr "Kann Standardfehlerausgabe nicht öffnen"
-#: ../libsvn_subr/prompt.c:263
-#, c-format
-msgid "Can't write to terminal"
-msgstr "Kann nicht auf das Terminal schreiben"
-
-#: ../libsvn_subr/prompt.c:385 ../libsvn_subr/prompt.c:472
+#: ../libsvn_subr/prompt.c:381 ../libsvn_subr/prompt.c:468
#, c-format
msgid "Can't read from terminal"
msgstr "Kann nicht vom Terminal lesen"
-#: ../libsvn_subr/prompt.c:540
+#: ../libsvn_subr/prompt.c:536
msgid "End of file while reading from terminal"
msgstr "Dateiende während des Lesens vom Terminal"
-#: ../libsvn_subr/prompt.c:602
+#: ../libsvn_subr/prompt.c:598 ../svn/auth-cmd.c:241
#, c-format
msgid "Authentication realm: %s\n"
msgstr "Anmeldebereich: %s\n"
-#: ../libsvn_subr/prompt.c:629 ../libsvn_subr/prompt.c:652
+#: ../libsvn_subr/prompt.c:625 ../libsvn_subr/prompt.c:648
msgid "Username: "
msgstr "Benutzername: "
-#: ../libsvn_subr/prompt.c:674
+#: ../libsvn_subr/prompt.c:670
#, c-format
msgid "Error validating server certificate for '%s':\n"
msgstr "Fehler bei der Validierung des Serverzertifikats für »%s«:\n"
-#: ../libsvn_subr/prompt.c:680
+#: ../libsvn_subr/prompt.c:676
msgid ""
" - The certificate is not issued by a trusted authority. Use the\n"
" fingerprint to validate the certificate manually!\n"
@@ -6554,23 +7429,23 @@ msgstr ""
" - Das Zertifikat ist nicht von einer vertrauenswürdigen Instanz ausgestellt\n"
" Überprüfen Sie den Fingerabdruck, um das Zertifikat zu validieren!\n"
-#: ../libsvn_subr/prompt.c:687
+#: ../libsvn_subr/prompt.c:683
msgid " - The certificate hostname does not match.\n"
msgstr " - Der Hostname des Zertifikats stimmt nicht überein.\n"
-#: ../libsvn_subr/prompt.c:693
+#: ../libsvn_subr/prompt.c:689
msgid " - The certificate is not yet valid.\n"
msgstr " - Das Zertifikat ist noch nicht gültig.\n"
-#: ../libsvn_subr/prompt.c:699
+#: ../libsvn_subr/prompt.c:695
msgid " - The certificate has expired.\n"
msgstr " - Das Zertifikat ist abgelaufen.\n"
-#: ../libsvn_subr/prompt.c:705
+#: ../libsvn_subr/prompt.c:701
msgid " - The certificate has an unknown error.\n"
msgstr " - Das Zertifikat hat einen unbekannten Fehler.\n"
-#: ../libsvn_subr/prompt.c:710
+#: ../libsvn_subr/prompt.c:706
#, c-format
msgid ""
"Certificate information:\n"
@@ -6585,48 +7460,48 @@ msgstr ""
" - Aussteller: %s\n"
" - Fingerabdruck: %s\n"
-#: ../libsvn_subr/prompt.c:725
+#: ../libsvn_subr/prompt.c:721
msgid "(R)eject, accept (t)emporarily or accept (p)ermanently? "
msgstr "Ve(r)werfen, (t)emporär akzeptieren oder (p)ermanent akzeptieren? "
-#: ../libsvn_subr/prompt.c:729
+#: ../libsvn_subr/prompt.c:725
msgid "(R)eject or accept (t)emporarily? "
msgstr "Ve(r)werfen oder (t)emporär akzeptieren? "
-#: ../libsvn_subr/prompt.c:769
+#: ../libsvn_subr/prompt.c:765
msgid "Client certificate filename: "
msgstr "Client Zertifikatsdatei: "
-#: ../libsvn_subr/prompt.c:793
+#: ../libsvn_subr/prompt.c:789
#, c-format
msgid "Passphrase for '%s': "
msgstr "Passphrase für »%s«: "
-#: ../libsvn_subr/prompt.c:845
+#: ../libsvn_subr/prompt.c:841
msgid "yes"
msgstr "ja"
-#: ../libsvn_subr/prompt.c:846
+#: ../libsvn_subr/prompt.c:842
msgid "y"
msgstr "j"
-#: ../libsvn_subr/prompt.c:851
+#: ../libsvn_subr/prompt.c:847
msgid "no"
msgstr "nein"
-#: ../libsvn_subr/prompt.c:852
+#: ../libsvn_subr/prompt.c:848
msgid "n"
msgstr "n"
-#: ../libsvn_subr/prompt.c:858
+#: ../libsvn_subr/prompt.c:854
msgid "Please type 'yes' or 'no': "
msgstr "Bitte geben Sie »ja« oder »nein« ein: "
-#: ../libsvn_subr/prompt.c:872
+#: ../libsvn_subr/prompt.c:868
msgid "Store password unencrypted (yes/no)? "
msgstr "Passwort unverschlüsselt speichern (ja/nein)? "
-#: ../libsvn_subr/prompt.c:874
+#: ../libsvn_subr/prompt.c:870
#, c-format
msgid ""
"\n"
@@ -6661,11 +7536,11 @@ msgstr ""
"entweder auf »yes« oder »no« setzen.\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:901
+#: ../libsvn_subr/prompt.c:897
msgid "Store passphrase unencrypted (yes/no)? "
msgstr "Passphrase unverschlüsselt speichern (ja/nein)? "
-#: ../libsvn_subr/prompt.c:903
+#: ../libsvn_subr/prompt.c:899
#, c-format
msgid ""
"\n"
@@ -6700,81 +7575,91 @@ msgstr ""
"entweder auf »yes« oder »no« setzen.\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:949
+#: ../libsvn_subr/prompt.c:945
#, c-format
msgid "Password for '%s' GNOME keyring: "
msgstr "Passwort für GNOME-Schlüsselring »%s«: "
-#: ../libsvn_subr/simple_providers.c:449
-#: ../libsvn_subr/ssl_client_cert_pw_providers.c:296
+#: ../libsvn_subr/simple_providers.c:444
+#: ../libsvn_subr/ssl_client_cert_pw_providers.c:286
#, c-format
msgid "Config error: invalid value '%s' for option '%s'"
msgstr "Konfigurationsfehler: Ungültiger Wert »%s« für Option »%s«"
-#: ../libsvn_subr/sqlite.c:176
+#: ../libsvn_subr/sqlite.c:242
#, c-format
msgid "sqlite[S%d]: %s, executing statement '%s'"
msgstr "sqlite[S%d]: %s, Ausgeführte Anweisung '%s'"
-#: ../libsvn_subr/sqlite.c:265
+#: ../libsvn_subr/sqlite.c:331
msgid "sqlite: Expected database row missing"
msgstr "sqlite: Erwartete Zeile in der Datenbank fehlt"
-#: ../libsvn_subr/sqlite.c:266
+#: ../libsvn_subr/sqlite.c:332
msgid "sqlite: Extra database row found"
msgstr "sqlite: Zusätzliche Zeile der Datenbank wurde gefunden"
-#: ../libsvn_subr/sqlite.c:726
+#: ../libsvn_subr/sqlite.c:803
#, c-format
msgid "SQLite compiled for %s, but running with %s"
msgstr "SQLite wurde für %s kompiliert, läuft aber mit %s"
-#: ../libsvn_subr/sqlite.c:738
+#: ../libsvn_subr/sqlite.c:815
msgid "SQLite is required to be compiled and run in thread-safe mode"
msgstr "Es wird erwartet, dass SQLite im Thread-sicheren Modus kompiliert und gestartet wird"
-#: ../libsvn_subr/sqlite.c:747
+#: ../libsvn_subr/sqlite.c:824
#, c-format
msgid "Could not configure SQLite [S%d]"
msgstr "Konnte SQLite nicht konfigurieren [S%d]"
-#: ../libsvn_subr/sqlite.c:749
+#: ../libsvn_subr/sqlite.c:826
msgid "Could not initialize SQLite"
msgstr "Konnte SQLite nicht initialisieren"
-#: ../libsvn_subr/sqlite.c:1219
+#: ../libsvn_subr/sqlite.c:1443
#, c-format
msgid "SQLite hotcopy failed for %s"
msgstr "SQLite-Hotcopy fehlgeschlagen für »%s«"
-#: ../libsvn_subr/string.c:943 ../libsvn_subr/string.c:987
+#: ../libsvn_subr/stream.c:968
+#, c-format
+msgid "Polling for available data on filestream failed"
+msgstr "Abfrage aller verfügbarer Daten des Dateistroms fehlgeschlagen"
+
+#: ../libsvn_subr/string.c:981 ../libsvn_subr/string.c:1025
#, c-format
msgid "Could not convert '%s' into a number"
msgstr "Konnte »%s« nicht in Zahl umwandeln"
-#: ../libsvn_subr/subst.c:1803 ../libsvn_wc/props.c:1660
+#: ../libsvn_subr/subst.c:1820 ../libsvn_wc/props.c:1765
#, c-format
msgid "File '%s' has inconsistent newlines"
msgstr "Datei »%s« hat inkonsistente Zeilenenden"
-#: ../libsvn_subr/sysinfo.c:1106
+#: ../libsvn_subr/subst.c:1858
+#, c-format
+msgid "Can't read special file: File '%s' not found"
+msgstr "Kann spezielle Datei nicht lesen: Datei »%s« nicht gefunden"
+
+#: ../libsvn_subr/sysinfo.c:1209
msgid "Intel"
msgstr "Intel"
-#: ../libsvn_subr/sysinfo.c:1107
+#: ../libsvn_subr/sysinfo.c:1210
msgid "Intel 64-bit"
msgstr "Intel 64 Bit"
-#: ../libsvn_subr/sysinfo.c:1108
+#: ../libsvn_subr/sysinfo.c:1211
msgid "PowerPC"
msgstr "PowerPC"
-#: ../libsvn_subr/sysinfo.c:1109
+#: ../libsvn_subr/sysinfo.c:1212
msgid "PowerPC 64-bit"
msgstr "PowerPC 64 Bit"
#. Human explanatory part, generated by apr_strftime as "Sat, 01 Jan 2000"
-#: ../libsvn_subr/time.c:85
+#: ../libsvn_subr/time.c:87
msgid " (%a, %d %b %Y)"
msgstr " (%a, %d. %b %Y)"
@@ -6783,15 +7668,25 @@ msgstr " (%a, %d. %b %Y)"
msgid "Token '%s' is unrecognized"
msgstr "Marke »%s« nicht erkannt"
-#: ../libsvn_subr/types.c:48
+#: ../libsvn_subr/types.c:52
+#, c-format
+msgid "Negative revision number found parsing '%s'"
+msgstr "Negative Revisionsnummer beim Einlesen von »%s« gefunden"
+
+#: ../libsvn_subr/types.c:53
#, c-format
msgid "Invalid revision number found parsing '%s'"
msgstr "Ungültige Revisionsnummer beim Einlesen von »%s« gefunden"
-#: ../libsvn_subr/types.c:60
+#: ../libsvn_subr/types.c:64
#, c-format
-msgid "Negative revision number found parsing '%s'"
-msgstr "Negative Revisionsnummer beim Einlesen von »%s« gefunden"
+msgid "Revision number longer than 10 digits '%s'"
+msgstr "Revisionsnummer ist länger als 10 Ziffern »%s«"
+
+#: ../libsvn_subr/types.c:70
+#, c-format
+msgid "Revision number too large '%s'"
+msgstr "Revisionsnummer ist zu groß »%s«"
#: ../libsvn_subr/utf.c:245
#, c-format
@@ -6808,32 +7703,32 @@ msgstr "Kann keinen Zeichenkonverter von »%s« in die eigene Kodierung erzeugen
msgid "Can't create a character converter from '%s' to '%s'"
msgstr "Kann keinen Zeichenkonverter von »%s« nach »%s« erzeugen"
-#: ../libsvn_subr/utf.c:601
+#: ../libsvn_subr/utf.c:548
#, c-format
msgid "Can't convert string from native encoding to '%s':"
msgstr "Kann Zeichenkette nicht von der eigenen Codierung nach »%s« konvertieren:"
-#: ../libsvn_subr/utf.c:605
+#: ../libsvn_subr/utf.c:552
#, c-format
msgid "Can't convert string from '%s' to native encoding:"
msgstr "Kann Zeichenkette nicht von »%s« in die eigene Codierung konvertieren:"
-#: ../libsvn_subr/utf.c:609
+#: ../libsvn_subr/utf.c:556
#, c-format
msgid "Can't convert string from '%s' to '%s':"
msgstr "Kann Zeichenkette nicht von »%s« nach »%s« konvertieren:"
-#: ../libsvn_subr/utf.c:654
+#: ../libsvn_subr/utf.c:601
#, c-format
msgid "Safe data '%s' was followed by non-ASCII byte %d: unable to convert to/from UTF-8"
msgstr "Auf sichere Daten »%s« folgte ein nicht-ASCII Byte %d, das nicht von/nach UTF-8 konvertiert werden konnte"
-#: ../libsvn_subr/utf.c:662
+#: ../libsvn_subr/utf.c:609
#, c-format
msgid "Non-ASCII character (code %d) detected, and unable to convert to/from UTF-8"
msgstr "Ein Nicht-ASCII Zeichen (Kode %d) wurde gefunden, das nicht von/nach UTF-8 konvertiert werden konnte"
-#: ../libsvn_subr/utf.c:707
+#: ../libsvn_subr/utf.c:654
#, c-format
msgid ""
"Valid UTF-8 data\n"
@@ -6846,6 +7741,58 @@ msgstr ""
"folgte eine ungültige UTF-8-Sequenz\n"
"(hex:%s)"
+#: ../libsvn_subr/utf.c:1202 ../libsvn_subr/utf.c:1211
+#, c-format
+msgid "Conversion to UTF-16 failed"
+msgstr "Umwandlung nach UTF-16 fehlgeschlagen"
+
+#: ../libsvn_subr/utf.c:1240 ../libsvn_subr/utf.c:1250
+#, c-format
+msgid "Conversion from UTF-16 failed"
+msgstr "Umwandlung von UTF-16 fehlgeschlagen"
+
+#: ../libsvn_subr/utf8proc.c:215
+#, c-format
+msgid "Invalid Unicode character U+%04lX"
+msgstr "Ungültiges Unicode-Zeichen U+%04lX"
+
+#: ../libsvn_subr/utf8proc.c:252
+msgid "Cannot use a custom escape token in glob matching mode"
+msgstr "Kann kein benutzerdefiniertes geschütztes Zeichen im Platzhalter-Suchmodus verwenden"
+
+#: ../libsvn_subr/utf8proc.c:283
+msgid "Escape token must be one character"
+msgstr "Geschützes Zeichen muss ein einzelnes Zeichen sein"
+
+#: ../libsvn_subr/utf8proc.c:286
+#, c-format
+msgid "Invalid escape character U+%04lX"
+msgstr "Ungültiges geschütztes Zeichen U+%04lX"
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:117
+msgid "Memory for processing UTF-8 data could not be allocated."
+msgstr "Speicher für die Verarbeitung von UTF-8 Daten konnte nicht zugewiesen werden."
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:119
+msgid "UTF-8 string is too long to be processed."
+msgstr "UTF-8 Zeichenkette ist für die Verarbeitung zu lang."
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:121
+msgid "Invalid UTF-8 string"
+msgstr "Ungültige UTF-8 Zeichenkette"
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:123
+msgid "Unassigned Unicode code point found in UTF-8 string."
+msgstr "Nicht zugewiesener Unicode-Codepunkt in UTF-8 Zeichenkette gefunden."
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:125
+msgid "Invalid options for UTF-8 processing chosen."
+msgstr "Ungültige Optionen für die Verarbeitung von UTF-8 ausgewählt."
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:127
+msgid "An unknown error occured while processing UTF-8 data."
+msgstr "Ein unbekannter Fehler trat bei der Verarbeitung von UTF-8 Daten auf."
+
#: ../libsvn_subr/validate.c:56
#, c-format
msgid "MIME type '%s' has empty media type"
@@ -6881,12 +7828,12 @@ msgstr " (Kompatibilität erwartet)"
#: ../libsvn_subr/version.c:139
msgid ""
-"Copyright (C) 2014 The Apache Software Foundation.\n"
+"Copyright (C) 2015 The Apache Software Foundation.\n"
"This software consists of contributions made by many people;\n"
"see the NOTICE file for more information.\n"
"Subversion is open source software, see http://subversion.apache.org/\n"
msgstr ""
-"Copyright (C) 2014 The Apache Software Foundation.\n"
+"Copyright (C) 2015 The Apache Software Foundation.\n"
"Diese Software besteht aus Beiträgen vieler Personen;\n"
"siehe Datei NOTICE für weitere Informationen.\n"
"Subversion ist Open Source Software, siehe http://subversion.apache.org/\n"
@@ -6903,31 +7850,31 @@ msgstr "Konnte Zeichenkette mit Versionsnummer »%s« nicht verarbeiten"
msgid "Malformed XML: %s at line %ld"
msgstr "Fehlerhaftes XML: %s in Zeile %ld"
-#: ../libsvn_wc/adm_crawler.c:114
+#: ../libsvn_wc/adm_crawler.c:119
#, c-format
msgid "The existing node '%s' can not be restored."
msgstr "Der vorhandene Knoten »%s« kann nicht wiederhergestellt werden."
-#: ../libsvn_wc/adm_crawler.c:133
+#: ../libsvn_wc/adm_crawler.c:138
#, c-format
msgid "The node '%s' can not be restored."
msgstr "Der Knoten »%s« kann nicht wiederhergestellt werden."
-#: ../libsvn_wc/adm_crawler.c:851
+#: ../libsvn_wc/adm_crawler.c:865
msgid "Error aborting report"
msgstr "Fehler beim Abbrechen des Reports"
-#: ../libsvn_wc/adm_crawler.c:963
+#: ../libsvn_wc/adm_crawler.c:978
#, c-format
msgid "Pristine checksum for file '%s' is missing"
msgstr "Prüfsumme für ursprünglichen Inhalt der Datei »%s« fehlt"
-#: ../libsvn_wc/adm_crawler.c:1128
+#: ../libsvn_wc/adm_crawler.c:1143
#, c-format
msgid "Checksum mismatch for text base of '%s'"
msgstr "Prüfsummenfehler für Textbasis von »%s«"
-#: ../libsvn_wc/adm_crawler.c:1139
+#: ../libsvn_wc/adm_crawler.c:1154
#, c-format
msgid "While preparing '%s' for commit"
msgstr "Beim Vorbereiten von »%s« für die Übertragung"
@@ -6957,49 +7904,49 @@ msgstr "Kann den ursprünglichen Inhalt von »%s« nicht holen, da es einen uner
msgid "Node '%s' has no pristine text"
msgstr "Knoten »%s« hat keinen Ursprungstext"
-#: ../libsvn_wc/adm_files.c:452
+#: ../libsvn_wc/adm_files.c:420
#, c-format
msgid "Revision %ld doesn't match existing revision %ld in '%s'"
msgstr "Revision %ld passt nicht zur existierenden Revision %ld in »%s«"
-#: ../libsvn_wc/adm_files.c:489
+#: ../libsvn_wc/adm_files.c:460
#, c-format
msgid "URL '%s' (uuid: '%s') doesn't match existing URL '%s' (uuid: '%s') in '%s'"
msgstr "URL »%s« (UUID: »%s«) stimmt nicht mit der existierenden URL »%s« (UUID: »%s«) in »%s« überein"
-#: ../libsvn_wc/adm_ops.c:602 ../libsvn_wc/update_editor.c:5281
+#: ../libsvn_wc/adm_ops.c:313 ../libsvn_wc/update_editor.c:5270
#, c-format
msgid "Can't find parent directory's node while trying to add '%s'"
msgstr "Kann Knoten des Elternverzeichnisses während des Hinzufügens von »%s« nicht finden"
-#: ../libsvn_wc/adm_ops.c:611 ../libsvn_wc/update_editor.c:5275
+#: ../libsvn_wc/adm_ops.c:322 ../libsvn_wc/update_editor.c:5264
#, c-format
msgid "Can't add '%s' to a parent directory scheduled for deletion"
msgstr ""
"Kann »%s« nicht zu einem Elternverzeichnis hinzufügen, das selbst zum Löschen\n"
"vorgesehen ist"
-#: ../libsvn_wc/adm_ops.c:618 ../libsvn_wc/update_editor.c:5288
+#: ../libsvn_wc/adm_ops.c:329 ../libsvn_wc/update_editor.c:5277
#, c-format
msgid "Can't schedule an addition of '%s' below a not-directory node"
msgstr "Kann »%s« nicht zum Hinzufügen unter einem Knoten vorsehen, der kein Verzeichnis ist"
-#: ../libsvn_wc/adm_ops.c:677
+#: ../libsvn_wc/adm_ops.c:390
#, c-format
msgid "Can't create an entry with a reserved name while trying to add '%s'"
msgstr "Kann einen Eintrag mit einem reservierten Namen nicht erzeugen, während versucht wird, »%s« hinzuzufügen"
-#: ../libsvn_wc/adm_ops.c:881
+#: ../libsvn_wc/adm_ops.c:594
#, c-format
msgid "The URL '%s' has a different repository root than its parent"
msgstr "Die URL »%s« hat eine andere Projektarchiv-Basis als ihr Vorgänger"
-#: ../libsvn_wc/adm_ops.c:899
+#: ../libsvn_wc/adm_ops.c:614
#, c-format
msgid "Can't schedule the working copy at '%s' from repository '%s' with uuid '%s' for addition under a working copy from repository '%s' with uuid '%s'."
msgstr "Kann Arbeitkopie »%s« des Projektarchivs »%s« mit UUID »%s« nicht zum Hinzufügen unter einer Arbeitskopie des Projektarchivs »%s« mit UUID »%s« vorsehen."
-#: ../libsvn_wc/adm_ops.c:913
+#: ../libsvn_wc/adm_ops.c:628
#, c-format
msgid "Can't add '%s' with URL '%s', but with the data from '%s'"
msgstr "Kann »%s« mit URL »%s« aber den Daten von »%s« nicht hinzufügen"
@@ -7017,145 +7964,161 @@ msgstr "Log-Format zu alt, bitte verwenden Sie Subversion 1.6 oder älter"
msgid "Not a conflict skel"
msgstr "Ungültiges Konfliktskeleton"
-#: ../libsvn_wc/conflicts.c:610 ../libsvn_wc/conflicts.c:707
+#: ../libsvn_wc/conflicts.c:607 ../libsvn_wc/conflicts.c:704
msgid "Not a completed conflict skel"
msgstr "Kein vollständiges Konfliktskeleton"
-#: ../libsvn_wc/conflicts.c:788 ../libsvn_wc/conflicts.c:861
-#: ../libsvn_wc/conflicts.c:951
+#: ../libsvn_wc/conflicts.c:785 ../libsvn_wc/conflicts.c:858
+#: ../libsvn_wc/conflicts.c:948
msgid "Conflict not set"
msgstr "Konflikt nicht gesetzt"
# CHECKME: s/callback/hook/ ??
-#: ../libsvn_wc/conflicts.c:1438 ../libsvn_wc/conflicts.c:1790
+#: ../libsvn_wc/conflicts.c:1327 ../libsvn_wc/conflicts.c:1980
+#: ../libsvn_wc/conflicts.c:2025
msgid "Conflict callback violated API: returned no results"
msgstr "Konflikt-Aktion Rückruffunktion die API: keine Ergebnisse wurden zurückgeliefert"
-#: ../libsvn_wc/conflicts.c:1482
+#: ../libsvn_wc/conflicts.c:1372
msgid "Conflict callback violated API: returned no merged file"
msgstr "Konflikt-Aktion verletzte die API: keine zusammengeführte Datei wurde zurückgeliefert"
-#: ../libsvn_wc/conflicts.c:2468 ../libsvn_wc/conflicts.c:2644
+#: ../libsvn_wc/conflicts.c:2454
msgid "Invalid 'conflict_result' argument"
msgstr "Ungültiger Parameter »conflict_result«"
-#: ../libsvn_wc/conflicts.c:2767 ../libsvn_wc/conflicts.c:2807
+#: ../libsvn_wc/conflicts.c:2697 ../libsvn_wc/conflicts.c:2755
#, c-format
msgid "Tree conflict can only be resolved to 'working' or 'mine-conflict' state; '%s' not resolved"
msgstr "Baumkonflikt kann nur zum Zustand »working« oder »mine-conflict« aufgelöst werden; Konflikt in »%s« nicht aufgelöst"
-#: ../libsvn_wc/conflicts.c:2822
+#: ../libsvn_wc/conflicts.c:2782
+#, c-format
+msgid "Tree conflict can only be resolved to 'working' state; '%s' is no longer moved"
+msgstr "Baumkonflikt kann nur zum Zustand »working« aufgelöst werden; »%s« nicht länger verschoben"
+
+#: ../libsvn_wc/conflicts.c:2800
#, c-format
msgid "Tree conflict can only be resolved to 'working' state; '%s' not resolved"
msgstr "Baumkonflikt kann nur zum Zustand »working« aufgelöst werden; Konflikt in »%s« nicht aufgelöst"
-#: ../libsvn_wc/conflicts.c:2924
+#: ../libsvn_wc/conflicts.c:2975
msgid "No conflict-callback and no pre-defined conflict-choice provided"
msgstr "Keine Konflikt-Rückruffunktion oder Standard-Konfliktlösungsauswahl angegeben"
-#: ../libsvn_wc/copy.c:86
+#: ../libsvn_wc/conflicts.c:3218
+#, c-format
+msgid "Unable to resolve pending conflict on '%s'"
+msgstr "Kann ausstehenden Konflikt in »%s« nicht auflösen"
+
+#: ../libsvn_wc/conflicts.c:3230
+#, c-format
+msgid "Unable to resolve conflicts on '%s'"
+msgstr "Kann Konflikte in »%s« nicht auflösen"
+
+#: ../libsvn_wc/copy.c:103
#, c-format
msgid "Source '%s' is unexpected kind"
msgstr "Quelle »%s« ist unbekannten Typs"
-#: ../libsvn_wc/copy.c:410
+#: ../libsvn_wc/copy.c:470
#, c-format
msgid "cannot handle node kind for '%s'"
msgstr "Kann Knotentyp für »%s« nicht verarbeiten"
-#: ../libsvn_wc/copy.c:432 ../libsvn_wc/wc_db.c:4507 ../libsvn_wc/wc_db.c:5082
+#: ../libsvn_wc/copy.c:492 ../libsvn_wc/wc_db.c:4583 ../libsvn_wc/wc_db.c:5386
#, c-format
msgid "Cannot handle status of '%s'"
msgstr "Kann Status von »%s« nicht verarbeiten"
-#: ../libsvn_wc/copy.c:441 ../libsvn_wc/wc_db.c:4498 ../libsvn_wc/wc_db.c:5076
-#: ../libsvn_wc/wc_db.c:5321
+#: ../libsvn_wc/copy.c:501 ../libsvn_wc/wc_db.c:4574 ../libsvn_wc/wc_db.c:5380
+#: ../libsvn_wc/wc_db.c:5624
#, c-format
msgid "Cannot copy '%s' excluded by server"
msgstr "Kann vom Server ausgeschlossenes »%s« nicht kopieren"
-#: ../libsvn_wc/copy.c:578
+#: ../libsvn_wc/copy.c:642
#, c-format
msgid "Deleted node '%s' can't be copied."
msgstr "Gelöschter Knoten »%s« kann nicht kopiert werden."
-#: ../libsvn_wc/copy.c:596
+#: ../libsvn_wc/copy.c:660
#, c-format
msgid "'%s' is the root of a working copy and cannot be moved"
msgstr "»%s« ist das Basisverzeichnis einer Arbeitskopie und kann nicht verschoben werden"
-#: ../libsvn_wc/copy.c:604
+#: ../libsvn_wc/copy.c:668
#, c-format
msgid "'%s' represents the repository root and cannot be moved"
msgstr "»%s« repräsentiert die Wurzel eines Projektarchivs und kann nicht verschoben werden "
-#: ../libsvn_wc/copy.c:673
+#: ../libsvn_wc/copy.c:743
#, c-format
msgid "Cannot copy to '%s', as it is not from repository '%s'; it is from '%s'"
msgstr ""
"Kann »%s« nicht kopieren, da es nicht aus dem Projektarchiv »%s« stammt\n"
"sondern aus »%s«"
-#: ../libsvn_wc/copy.c:681
+#: ../libsvn_wc/copy.c:751
#, c-format
msgid "Cannot copy to '%s' as it is scheduled for deletion"
msgstr "Kann nach »%s« kopieren, da es zum Löschen vorgesehen ist"
-#: ../libsvn_wc/copy.c:709
+#: ../libsvn_wc/copy.c:779
#, c-format
msgid "'%s' is already under version control but is excluded."
msgstr "»%s« befindet sich bereits unter Versionskontrolle, ist aber ausgeschlossen."
-#: ../libsvn_wc/copy.c:724
+#: ../libsvn_wc/copy.c:794
#, c-format
msgid "There is already a versioned item '%s'"
msgstr "Es existiert bereits ein versioniertes Objekt »%s«"
-#: ../libsvn_wc/copy.c:740
+#: ../libsvn_wc/copy.c:810
#, c-format
msgid "'%s' already exists and is in the way"
msgstr "»%s« existiert bereits und ist im Weg"
-#: ../libsvn_wc/copy.c:791
+#: ../libsvn_wc/copy.c:862
#, c-format
msgid "Cannot move mixed-revision subtree '%s' [%ld:%ld]; try updating it first"
msgstr "Kann Unterbaum »%s« mit verschiedenen Revisionen nicht verschieben [%ld:%ld], versuchen Sie erst zu aktualisieren"
-#: ../libsvn_wc/crop.c:208
+#: ../libsvn_wc/crop.c:206
#, c-format
msgid "Cannot exclude '%s': it is a working copy root"
msgstr "Kann »%s« nicht ausschließen: Es ist die Basis einer Arbeitskopie"
-#: ../libsvn_wc/crop.c:216
+#: ../libsvn_wc/crop.c:214
#, c-format
msgid "Cannot exclude '%s': it is a switched path"
msgstr "Kann »%s« nicht ausschließen: Es ist ein umgestellter Pfad"
-#: ../libsvn_wc/crop.c:243
+#: ../libsvn_wc/crop.c:241
#, c-format
msgid "Cannot exclude '%s': it is to be added to the repository. Try commit instead"
msgstr "Kann »%s« nicht ausschließen: Es soll dem Projektarchiv hinzugefügt werden. Versuchen Sie stattdessen es zu übertragen"
-#: ../libsvn_wc/crop.c:250
+#: ../libsvn_wc/crop.c:248
#, c-format
msgid "Cannot exclude '%s': it is to be deleted from the repository. Try commit instead"
msgstr "Kann »%s« nicht ausschließen: Es soll aus dem Projektarchiv entfernt werden. Versuchen Sie stattdessen es zu übertragen"
# CHECKME: Check translation of crop (beschneiden?)!!!!
-#: ../libsvn_wc/crop.c:309
+#: ../libsvn_wc/crop.c:319
msgid "Can only crop a working copy with a restrictive depth"
msgstr "Kann nur eine Arbeitskopie mit einer eingeschränkten Tiefe beschneiden"
-#: ../libsvn_wc/crop.c:320
+#: ../libsvn_wc/crop.c:330
msgid "Can only crop directories"
msgstr "Kann nur Verzeichnisse beschneiden"
-#: ../libsvn_wc/crop.c:333
+#: ../libsvn_wc/crop.c:343
#, c-format
msgid "Cannot crop '%s': it is going to be removed from repository. Try commit instead"
msgstr "Kann »%s« nicht beschneiden: Es soll vom Projektarchiv entfernt werden. Versuchen Sie stattdessen es zu übertragen"
-#: ../libsvn_wc/crop.c:340
+#: ../libsvn_wc/crop.c:350
#, c-format
msgid "Cannot crop '%s': it is to be added to the repository. Try commit instead"
msgstr "Kann »%s« nicht beschneiden: Es soll dem Projektarchiv hinzugefügt werden. Versuchen Sie stattdessen es zu übertragen"
@@ -7175,122 +8138,122 @@ msgstr "»%s« ist das Basisverzeichnis einer Arbeitskopie und kann nicht gelös
msgid "'%s' represents the repository root and cannot be deleted"
msgstr "»%s« repräsentiert die Wurzel eines Projektarchivs und kann nicht gelöscht werden"
-#: ../libsvn_wc/delete.c:476
+#: ../libsvn_wc/delete.c:473
#, c-format
msgid "File '%s' has local modifications"
msgstr "Die Datei »%s« hat lokale Änderungen"
-#: ../libsvn_wc/deprecated.c:2284
+#: ../libsvn_wc/deprecated.c:2363
#, c-format
msgid "Unexpectedly found '%s': path is marked 'missing'"
msgstr "Unerwartetes »%s« gefunden: Pfad wird als »fehlend« markiert"
-#: ../libsvn_wc/entries.c:1044
+#: ../libsvn_wc/entries.c:1099
#, c-format
msgid "'%s' is not a versioned working copy"
msgstr "»%s« ist keine versionierte Arbeitskopie"
-#: ../libsvn_wc/entries.c:1290
+#: ../libsvn_wc/entries.c:1395
#, c-format
msgid "Admin area of '%s' is missing"
msgstr "Administrativer Bereich von »%s« fehlt"
-#: ../libsvn_wc/entries.c:1310
+#: ../libsvn_wc/entries.c:1415
#, c-format
msgid "'%s' is not of the right kind"
msgstr "»%s« hat einen falschen Typ"
-#: ../libsvn_wc/entries.c:1507
+#: ../libsvn_wc/entries.c:1577
#, c-format
msgid "The file '%s' has no checksum"
msgstr "Datei »%s« hat keine Prüfsumme"
-#: ../libsvn_wc/entries.c:1619
+#: ../libsvn_wc/entries.c:1695
#, c-format
msgid "Unable to upgrade '%s' at line %d"
msgstr "Kann »%s« nicht in ein neues Format überführen in Zeile %d"
-#: ../libsvn_wc/entries.c:1837
+#: ../libsvn_wc/entries.c:1934
#, c-format
msgid "No copyfrom URL for '%s'"
msgstr "Keine »copyfrom« URL für »%s« "
-#: ../libsvn_wc/entries.c:2051
+#: ../libsvn_wc/entries.c:2166
#, c-format
msgid "Bad base MD5 checksum for '%s'; expected: '%s'; found '%s'; "
msgstr "MD5-Prüfsummenfehler für Basis »%s«; erwartet: »%s«, tatsächlich: »%s«"
-#: ../libsvn_wc/entries.c:2398
+#: ../libsvn_wc/entries.c:2519
#, c-format
msgid "No default entry in directory '%s'"
msgstr "Verzeichnis »%s« hat keinen Standardeintrag"
-#: ../libsvn_wc/entries.c:2554
+#: ../libsvn_wc/entries.c:2675
#, c-format
msgid "Directory '%s' has no THIS_DIR entry"
msgstr "Verzeichnis »%s« hat keinen »THIS_DIR« Eintrag"
-#: ../libsvn_wc/entries.c:2735 ../libsvn_wc/node.c:528
+#: ../libsvn_wc/entries.c:2855 ../libsvn_wc/node.c:403
#, c-format
msgid "'%s' has an unrecognized node kind"
msgstr "»%s« hat einen nicht erkannten Knotentyp"
-#: ../libsvn_wc/externals.c:154 ../libsvn_wc/externals.c:232
+#: ../libsvn_wc/externals.c:158 ../libsvn_wc/externals.c:247
#, c-format
msgid "Error parsing %s property on '%s': '%s'"
msgstr "Fehler beim Analysieren der %s Eigenschaft für »%s«: »%s«"
-#: ../libsvn_wc/externals.c:202
+#: ../libsvn_wc/externals.c:214
#, c-format
msgid "Can't split line into components: '%s'"
msgstr "Zeile kann nicht in Komponenten zerlegt werden: »%s«"
-#: ../libsvn_wc/externals.c:257
+#: ../libsvn_wc/externals.c:273
#, c-format
msgid "Invalid %s property on '%s': cannot use two absolute URLs ('%s' and '%s') in an external; one must be a path where an absolute or relative URL is checked out to"
msgstr "Ungültige Eigenschaft %s zu »%s«: Es können nicht zwei absolute URLs (»%s« und »%s«) in einem externen Verweis verwendet werden; eine muss ein Pfad sein, in den eine absolute oder relative URL ausgecheckt wird"
-#: ../libsvn_wc/externals.c:266 ../libsvn_wc/externals.c:274
+#: ../libsvn_wc/externals.c:282 ../libsvn_wc/externals.c:290
#, c-format
msgid "Invalid %s property on '%s': cannot use a URL '%s' as the target directory for an external definition"
msgstr "Ungültige Eigenschaft %s zu »%s«: Eine URL »%s« kann nicht als Zielverzeichnis für eine externe Definition verwendet werden"
-#: ../libsvn_wc/externals.c:316
+#: ../libsvn_wc/externals.c:354
#, c-format
msgid "Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
msgstr "Ungültige Eigenschaft %s auf »%s«: Ziel »%s« ist ein absoluter Pfad oder enthält »..«"
-#: ../libsvn_wc/externals.c:491 ../libsvn_wc/externals.c:514
+#: ../libsvn_wc/externals.c:546 ../libsvn_wc/externals.c:569
#, c-format
msgid "This editor can only update '%s'"
msgstr "Dieser Editor kann nur »%s« aktualisieren"
-#: ../libsvn_wc/externals.c:529
+#: ../libsvn_wc/externals.c:584 ../libsvn_wc/externals.c:1031
#, c-format
msgid "Node '%s' is no existing file external"
msgstr "Knoten »%s« ist kein vorhandener externer Dateiverweis"
-#: ../libsvn_wc/externals.c:1517
+#: ../libsvn_wc/externals.c:1600
#, c-format
msgid "URL '%s' does not begin with a scheme"
msgstr "Die URL »%s« beginnt nicht mit einem Schema"
-#: ../libsvn_wc/externals.c:1572
+#: ../libsvn_wc/externals.c:1655
#, c-format
msgid "Illegal parent directory URL '%s'"
msgstr "Illegale URL des übergeordneten Verzeichnisses »%s«"
-#: ../libsvn_wc/externals.c:1611
+#: ../libsvn_wc/externals.c:1694
#, c-format
msgid "Illegal repository root URL '%s'"
msgstr "Illegale Projektarchivwurzel-URL »%s«"
-#: ../libsvn_wc/externals.c:1656
+#: ../libsvn_wc/externals.c:1739
#, c-format
msgid "The external relative URL '%s' cannot have backpaths, i.e. '..'"
msgstr "Die externe relative URL »%s« darf keinen Verweis auf übergeordnete Pfade haben, d.h. »..«"
-#: ../libsvn_wc/externals.c:1684
+#: ../libsvn_wc/externals.c:1767
#, c-format
msgid "Unrecognized format for the relative external URL '%s'"
msgstr "Unbekanntes Format für die relative externe URL »%s«"
@@ -7300,7 +8263,7 @@ msgstr "Unbekanntes Format für die relative externe URL »%s«"
msgid "Path '%s' ends in '%s', which is unsupported for this operation"
msgstr "Pfad »%s« endet mit »%s«, was für diese Operation nicht erlaubt ist"
-#: ../libsvn_wc/lock.c:773 ../libsvn_wc/wc_db.c:14134
+#: ../libsvn_wc/lock.c:773
#, c-format
msgid "Working copy '%s' locked"
msgstr "Arbeitskopie »%s« gesperrt"
@@ -7330,7 +8293,8 @@ msgstr "Verzeichnis »%s« fehlt"
msgid "Working copy '%s' is not locked"
msgstr "Arbeitskopie »%s« ist nicht gesperrt"
-#: ../libsvn_wc/lock.c:1382
+#: ../libsvn_wc/lock.c:1382 ../libsvn_wc/wc_db.c:4907
+#: ../libsvn_wc/wc_db.c:16129 ../libsvn_wc/wc_db_update_move.c:130
#, c-format
msgid "No write-lock in '%s'"
msgstr "Keine Schreibsperre in »%s«"
@@ -7340,22 +8304,22 @@ msgstr "Keine Schreibsperre in »%s«"
msgid "Can't obtain lock on non-directory '%s'."
msgstr "Kann keine Sperre für nicht-Verzeichnis »%s« erhalten."
-#: ../libsvn_wc/merge.c:1281 ../libsvn_wc/props.c:257
+#: ../libsvn_wc/merge.c:1285 ../libsvn_wc/props.c:232
#, c-format
msgid "Can't merge into conflicted node '%s'"
msgstr "Kann nicht in Knoten mit Konflikt »%s« zusammenführen"
-#: ../libsvn_wc/merge.c:1324 ../libsvn_wc/props.c:273
+#: ../libsvn_wc/merge.c:1328 ../libsvn_wc/props.c:248
#, c-format
msgid "The property '%s' may not be merged into '%s'."
msgstr "Eigenschaft »%s« darf nicht nach »%s« zusammengeführt werden."
-#: ../libsvn_wc/node.c:1047
+#: ../libsvn_wc/node.c:749
#, c-format
msgid "Incomplete copy information on path '%s'."
msgstr "Unvollständige Informationen für Kopie in Pfad »%s«"
-#: ../libsvn_wc/node.c:1211
+#: ../libsvn_wc/node.c:914
#, c-format
msgid "'%s' is not the root of the working copy '%s'"
msgstr "»%s« ist nicht die Basis des Projektarchivs »%s«"
@@ -7453,12 +8417,12 @@ msgstr "Ungültiger Abschluss des Eintrags"
msgid "Error at entry %d in entries file for '%s':"
msgstr "Fehler bei Eintrag %d in Eintragsdatei für »%s«:"
-#: ../libsvn_wc/props.c:236
+#: ../libsvn_wc/props.c:211
#, c-format
msgid "The node '%s' does not have properties in this state."
msgstr "Der Knoten »%s« hat in diesem Zustand keine Eigenschaften."
-#: ../libsvn_wc/props.c:401
+#: ../libsvn_wc/props.c:376
#, c-format
msgid ""
"Trying to add new property '%s'\n"
@@ -7467,7 +8431,7 @@ msgstr ""
"Versuch, eine neue Eigenschaft »%s« hinzuzufügen,\n"
"aber die Eigenschaft existiert bereits.\n"
-#: ../libsvn_wc/props.c:410
+#: ../libsvn_wc/props.c:385
#, c-format
msgid ""
"Trying to add new property '%s'\n"
@@ -7476,7 +8440,7 @@ msgstr ""
"Versuch, eine neue Eigenschaft »%s« hinzuzufügen,\n"
"aber die Eigenschaft wurde lokal gelöscht.\n"
-#: ../libsvn_wc/props.c:424
+#: ../libsvn_wc/props.c:399
#, c-format
msgid ""
"Trying to delete property '%s'\n"
@@ -7485,7 +8449,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu löschen,\n"
"aber die Eigenschaft wurde lokal hinzugefügt.\n"
-#: ../libsvn_wc/props.c:440
+#: ../libsvn_wc/props.c:415
#, c-format
msgid ""
"Trying to delete property '%s'\n"
@@ -7494,7 +8458,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu löschen,\n"
"aber die Eigenschaft wurde lokal verändert.\n"
-#: ../libsvn_wc/props.c:450
+#: ../libsvn_wc/props.c:425
#, c-format
msgid ""
"Trying to delete property '%s'\n"
@@ -7503,7 +8467,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu löschen,\n"
"aber die Eigenschaft wurde lokal gelöscht und hatte einen anderen Wert.\n"
-#: ../libsvn_wc/props.c:462
+#: ../libsvn_wc/props.c:437
#, c-format
msgid ""
"Trying to delete property '%s'\n"
@@ -7512,7 +8476,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu löschen,\n"
"aber der lokale Wert ist ein anderer.\n"
-#: ../libsvn_wc/props.c:481
+#: ../libsvn_wc/props.c:456
#, c-format
msgid ""
"Trying to change property '%s'\n"
@@ -7521,7 +8485,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu ändern,\n"
"aber der lokale Eigenschaftswert steht mit den empfangenen Änderungen im Konflikt.\n"
-#: ../libsvn_wc/props.c:489
+#: ../libsvn_wc/props.c:464
#, c-format
msgid ""
"Trying to change property '%s'\n"
@@ -7530,7 +8494,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu ändern,\n"
"aber die Eigenschaft wurde lokal schon auf einen anderen Wert gesetzt.\n"
-#: ../libsvn_wc/props.c:496
+#: ../libsvn_wc/props.c:471
#, c-format
msgid ""
"Trying to change property '%s'\n"
@@ -7539,7 +8503,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu ändern,\n"
"aber die Eigenschaft wurde lokal gelöscht.\n"
-#: ../libsvn_wc/props.c:502
+#: ../libsvn_wc/props.c:477
#, c-format
msgid ""
"Trying to change property '%s'\n"
@@ -7548,7 +8512,7 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu ändern,\n"
"aber die Eigenschaft wurde lokal mit einem anderen Wert hinzugefügt.\n"
-#: ../libsvn_wc/props.c:508
+#: ../libsvn_wc/props.c:483
#, c-format
msgid ""
"Trying to change property '%s'\n"
@@ -7557,82 +8521,86 @@ msgstr ""
"Versuch, die Eigenschaft »%s« zu ändern,\n"
"aber die Eigenschaft existiert lokal nicht.\n"
-#: ../libsvn_wc/props.c:612
+#: ../libsvn_wc/props.c:593
msgid "<<<<<<< (local property value)"
msgstr "<<<<<<< (lokaler Eigenschaftswert)"
-#: ../libsvn_wc/props.c:613
-msgid ">>>>>>> (incoming property value)"
-msgstr ">>>>>>> (empfangener Eigenschaftswert)"
+#: ../libsvn_wc/props.c:594
+msgid ">>>>>>> (incoming 'changed to' value)"
+msgstr ">>>>>>> (empfangener Zielwert)"
-#: ../libsvn_wc/props.c:648
+#: ../libsvn_wc/props.c:595
+msgid "||||||| (incoming 'changed from' value)"
+msgstr "||||||| (empfangener Ausgangswert)"
+
+#: ../libsvn_wc/props.c:632
msgid "Local property value:\n"
msgstr "Lokaler Eigenschaftswert:\n"
-#: ../libsvn_wc/props.c:650 ../libsvn_wc/props.c:661
+#: ../libsvn_wc/props.c:634 ../libsvn_wc/props.c:645
msgid "Cannot display: property value is binary data\n"
msgstr "Kann nicht anzeigen: Eigenschaftswert sind Binärdaten\n"
-#: ../libsvn_wc/props.c:659
+#: ../libsvn_wc/props.c:643
msgid "Incoming property value:\n"
msgstr "Empfangener Eigenschaftswert:\n"
-#: ../libsvn_wc/props.c:1475 ../libsvn_wc/props.c:1884
-#: ../libsvn_wc/props.c:1985
+#: ../libsvn_wc/props.c:1580 ../libsvn_wc/props.c:1989
+#: ../libsvn_wc/props.c:2090
#, c-format
msgid "Property '%s' is an entry property"
msgstr "Eigenschaft »%s« ist eine Eintragseigenschaft"
-#: ../libsvn_wc/props.c:1512 ../libsvn_wc/props.c:1519
+#: ../libsvn_wc/props.c:1617 ../libsvn_wc/props.c:1624
msgid "Failed to load properties"
msgstr "Konnte Eigenschaften nicht laden"
-#: ../libsvn_wc/props.c:1555
+#: ../libsvn_wc/props.c:1660
#, c-format
msgid "Cannot set '%s' on a directory ('%s')"
msgstr "Kann »%s« nicht für ein Verzeichnis setzen (»%s«)"
-#: ../libsvn_wc/props.c:1562
+#: ../libsvn_wc/props.c:1667
#, c-format
msgid "Cannot set '%s' on a file ('%s')"
msgstr "Kann »%s« nicht für eine Datei setzen (»%s«)"
-#: ../libsvn_wc/props.c:1641
+#: ../libsvn_wc/props.c:1746
#, c-format
msgid "Can't set '%s': file '%s' has binary mime type property"
msgstr "Kann »%s« nicht setzen: Datei »%s« hat die MIME-Typ Eigenschaft »binär«"
-#: ../libsvn_wc/props.c:1686
+#: ../libsvn_wc/props.c:1791
msgid "Failed to load current properties"
msgstr "Konnte aktuelle Eigenschaften nicht laden"
-#: ../libsvn_wc/props.c:1906
+#: ../libsvn_wc/props.c:2011
#, c-format
msgid "Can't set properties on '%s': invalid status for updating properties."
msgstr "Kann Eigenschaften für »%s« nicht setzen: ungültiger Status beim Aktualisieren von Eigenschaften"
-#: ../libsvn_wc/props.c:1990
+#: ../libsvn_wc/props.c:2095
#, c-format
msgid "Property '%s' is a WC property, not a regular property"
msgstr "Eigenschaft »%s« ist eine Arbeitskopieeigenschaft, keine reguläre Eigenschaft"
-#: ../libsvn_wc/props.c:2084
+#: ../libsvn_wc/props.c:2189
#, c-format
msgid "Unrecognized line ending style '%s' for '%s'"
msgstr "Stil für Zeilenende »%s« nicht erkannt für »%s«"
#. scratch_
-#: ../libsvn_wc/props.c:2135
+#: ../libsvn_wc/props.c:2240
#, c-format
msgid " (%d more duplicate targets found)"
msgstr "(%d mehrmals auftauchende Ziele gefunden)"
-#: ../libsvn_wc/props.c:2140
+#: ../libsvn_wc/props.c:2245
#, c-format
msgid "Invalid %s property on '%s': target '%s' appears more than once%s"
msgstr "Ungültige Eigenschaft %s auf »%s«: Ziel »%s« taucht mehrmals auf%s"
-#: ../libsvn_wc/props.c:2171
+#: ../libsvn_wc/props.c:2276
#, c-format
msgid "Cannot set non-inheritable mergeinfo on a non-directory ('%s')"
msgstr "Kann nicht-vererbbare Zusammenführungsinformationen auf ein nicht-Verzeichnis (»%s«) nicht setzen"
@@ -7666,33 +8634,33 @@ msgstr "Ungültiges Ziel für Umplatzierung: »%s« (keine URL)"
msgid "Invalid relocation destination: '%s' (does not point to target)"
msgstr "Ungültiges Ziel für Umplatzierung: »%s« (zeigt nicht auf Ziel)"
-#: ../libsvn_wc/tree_conflicts.c:136
+#: ../libsvn_wc/tree_conflicts.c:137
msgid "Unknown enumeration value in tree conflict description"
msgstr "Unbekannter Aufzählungswert in Baumkonfliktbeschreibung"
-#: ../libsvn_wc/tree_conflicts.c:160
+#: ../libsvn_wc/tree_conflicts.c:161
msgid "Invalid version info in tree conflict description"
msgstr "Ungültige Versionsinformation in Baumkonfliktbeschreibung"
-#: ../libsvn_wc/tree_conflicts.c:218
+#: ../libsvn_wc/tree_conflicts.c:219
#, c-format
msgid "Invalid conflict info '%s' in tree conflict description"
msgstr "Ungültige Konfliktinformationen »%s« in Baumkonfliktbeschreibung"
-#: ../libsvn_wc/tree_conflicts.c:229
+#: ../libsvn_wc/tree_conflicts.c:230
msgid "Empty 'victim' field in tree conflict description"
msgstr "Leeres Feld »victim« in Baumkonfliktbeschreibung"
-#: ../libsvn_wc/tree_conflicts.c:237
+#: ../libsvn_wc/tree_conflicts.c:238
msgid "Invalid 'node_kind' field in tree conflict description"
msgstr "Ungültiges Feld »node_kind« in Baumkonfliktbeschreibung"
-#: ../libsvn_wc/tree_conflicts.c:430
+#: ../libsvn_wc/tree_conflicts.c:432
#, c-format
msgid "Attempt to add tree conflict that already exists at '%s'"
msgstr "Es wurde versucht, einen Baumkonflikt hinzuzufügen, der in »%s« bereits vorhanden ist"
-#: ../libsvn_wc/update_editor.c:999
+#: ../libsvn_wc/update_editor.c:994
#, c-format
msgid ""
"Checksum mismatch while updating '%s':\n"
@@ -7703,43 +8671,38 @@ msgstr ""
" Erwartet: %s\n"
" Tatsächlich: %s\n"
-#: ../libsvn_wc/update_editor.c:1134
+#: ../libsvn_wc/update_editor.c:1129
#, c-format
msgid "'%s' is not valid as filename in directory '%s'"
msgstr "»%s« ist als Dateiname im Verzeichnis »%s« nicht gültig"
-#: ../libsvn_wc/update_editor.c:1611
+#: ../libsvn_wc/update_editor.c:1507
#, c-format
msgid "Unexpected attempt to add a node at path '%s'"
msgstr "Unerwarteter Versuch, einen Knoten im Pfad »%s« hinzuzufügen"
-#: ../libsvn_wc/update_editor.c:1622
+#: ../libsvn_wc/update_editor.c:1518
#, c-format
msgid "Unexpected attempt to edit, delete, or replace a node at path '%s'"
msgstr "Unerwarteter Versuch, einen Knoten im Pfad »%s« zu bearbeiten, zu löschen oder zu ersetzen"
-#: ../libsvn_wc/update_editor.c:2036
+#: ../libsvn_wc/update_editor.c:1897
#, c-format
msgid "Failed to add directory '%s': object of the same name as the administrative directory"
msgstr ""
"Konnte Verzeichnis »%s« nicht hinzufügen, da es denselben Namen wie das\n"
"Administrationsverzeichnis trägt"
-#: ../libsvn_wc/update_editor.c:2694
+#: ../libsvn_wc/update_editor.c:2557
msgid "Couldn't do property merge"
msgstr "Konnte Eigenschaften nicht zusammenführen"
-#: ../libsvn_wc/update_editor.c:3087
-#, c-format
-msgid "Failed to mark '%s' absent: item of the same name is already scheduled for addition"
-msgstr "Konnte »%s« nicht als fehlend markieren: ein Eintrag mit demselben Namen wurde bereits zur Hinzufügung eingeplant"
-
-#: ../libsvn_wc/update_editor.c:3175
+#: ../libsvn_wc/update_editor.c:3071
#, c-format
msgid "Failed to add file '%s': object of the same name as the administrative directory"
msgstr "Konnte Datei »%s« nicht hinzufügen, da es denselben Namen wie Administrationsverzeichnis trägt"
-#: ../libsvn_wc/update_editor.c:3697
+#: ../libsvn_wc/update_editor.c:3587
#, c-format
msgid ""
"Checksum mismatch for '%s':\n"
@@ -7750,323 +8713,343 @@ msgstr ""
" erwartet: %s\n"
"verzeichnet: %s\n"
-#: ../libsvn_wc/update_editor.c:5256
+#: ../libsvn_wc/update_editor.c:5245
#, c-format
msgid "Node '%s' exists."
msgstr "Knoten »%s« existiert bereits"
-#: ../libsvn_wc/update_editor.c:5316
+#: ../libsvn_wc/update_editor.c:5305
#, c-format
msgid "Copyfrom-url '%s' has different repository root than '%s'"
msgstr "Die Quell-URL »%s« hat eine andere Projektarchiv-Basis als »%s«"
-#: ../libsvn_wc/update_editor.c:5514
+#: ../libsvn_wc/update_editor.c:5517
#, c-format
msgid "'%s' is not an unmodified copied directory"
msgstr "»%s« ist kein kopiertes Verzeichnis ohne Veränderungen"
-#: ../libsvn_wc/update_editor.c:5525
+#: ../libsvn_wc/update_editor.c:5528
#, c-format
msgid "Copyfrom '%s' doesn't match original location of '%s'"
msgstr "Quell-URL »%s« stimmt nicht mit der ursprünglichen Position von »%s« überein"
-#: ../libsvn_wc/upgrade.c:255
+#: ../libsvn_wc/upgrade.c:256
#, c-format
msgid "Missing end of line in wcprops file for '%s'"
msgstr "Fehlendes Zeilenende in Datei »wcprops« für »%s«"
-#: ../libsvn_wc/upgrade.c:631
+#: ../libsvn_wc/upgrade.c:632
#, c-format
msgid "Working copy '%s' can't be upgraded because the repository root is not available and can't be retrieved"
msgstr "Arbeitskopie »%s« kann nicht in ein neueres Format gebracht werden, da die Wurzel des Projektarchivs nicht verfügbar ist und nicht bestimmt werden kann"
-#: ../libsvn_wc/upgrade.c:638
+#: ../libsvn_wc/upgrade.c:639
#, c-format
msgid "Working copy '%s' can't be upgraded because the repository uuid is not available and can't be retrieved"
msgstr "Arbeitskopie »%s« kann nicht in ein neueres Format gebracht werden, da die UUID des Projektarchivs nicht verfügbar ist und nicht bestimmt werden kann"
-#: ../libsvn_wc/upgrade.c:645
+#: ../libsvn_wc/upgrade.c:646
#, c-format
msgid "Working copy '%s' can't be upgraded because it doesn't have a url"
msgstr "Arbeitskopie »%s« kann nicht in ein neueres Format gebracht werden, da sie keine URL hat"
-#: ../libsvn_wc/upgrade.c:690
+#: ../libsvn_wc/upgrade.c:691
msgid "Error parsing tree conflict skel"
msgstr "Fehler beim Einlesen des Baumkonfliktskeletons"
-#: ../libsvn_wc/upgrade.c:1173
+#: ../libsvn_wc/upgrade.c:922
+#, c-format
+msgid "The properties of '%s' are in an indeterminate state and cannot be upgraded. See issue #2530."
+msgstr "Die Eigenschaften von »%s« sind in einem unbestimmten Zustand und können nicht in ein neues Format gebreacht werden. Siehe Fehlerbericht #2530."
+
+#: ../libsvn_wc/upgrade.c:934
+#, c-format
+msgid "Insufficient NODES rows for '%s'"
+msgstr "Nicht genügend »NODES«-Zeilen für »%s«"
+
+#: ../libsvn_wc/upgrade.c:1357
#, c-format
msgid "The working copy at '%s' is format 22 with WORKING nodes; use a format 22 client to diff/revert before using this client"
msgstr "Die Arbeitskopie in »%s« hat das Format 22 mit »WORKING«-Knoten; Verwenden Sie zuerst einen Client mit Format 22 um sie zurückzusetzen oder Unterschiede zu speichern, bevor Sie diesen Client verwenden"
-#: ../libsvn_wc/upgrade.c:1217
+#: ../libsvn_wc/upgrade.c:1401
#, c-format
msgid "The working copy at '%s' is format 26 with conflicts; use a format 26 client to resolve before using this client"
msgstr "Die Arbeitskopie in »%s« hat das Format 26 mit Konflikten; Verwenden Sie zuerst einen Client mit Format 26 um diese aufzulösen, bevor Sie diesen Client verwenden"
-#: ../libsvn_wc/upgrade.c:1723
+#: ../libsvn_wc/upgrade.c:1945
msgid "Cannot upgrade with existing logs; run a cleanup operation on this working copy using a client version which is compatible with this working copy's format (such as the version you are upgrading from), then retry the upgrade with the current version"
msgstr "Kann mit vorhandenen Logdateien nicht in ein neues Format bringen; Starten Sie »svn cleanup« auf dieser Arbeitskopie mit einer Version des Clienten die mit dem Format der Arbeitskopie kompatibel ist (z.B. mit der Version, die sie gerade ersetzen) und versuchen Sie dann den Vorgang mit der neuen Version erneut"
-#: ../libsvn_wc/upgrade.c:1792
+#: ../libsvn_wc/upgrade.c:2014
msgid "This working copy is corrupt and cannot be upgraded. Please check out a new working copy."
msgstr "Diese Arbeitskopie ist beschädigt und kann nicht in ein neues Format gebracht werden. Bitte erzeugen Sie eine neue Arbeitskopie mit »svn checkout«."
-#: ../libsvn_wc/upgrade.c:1837
+#: ../libsvn_wc/upgrade.c:2059
msgid "(unreleased development version)"
msgstr "(nicht veröffentlichte Entwicklungsversion)"
-#: ../libsvn_wc/upgrade.c:1853
+#: ../libsvn_wc/upgrade.c:2075
#, c-format
msgid "Working copy '%s' is too old (format %d, created by Subversion %s)"
msgstr "Format der Arbeitskopie »%s« ist zu alt (Format %d, erzeugt von Subversion %s)"
-#: ../libsvn_wc/upgrade.c:1863
+#: ../libsvn_wc/upgrade.c:2085
#, c-format
msgid "Working copy '%s' is an old development version (format %d); to upgrade it, use a format 18 client, then use 'tools/dev/wc-ng/bump-to-19.py', then use the current client"
msgstr "Format der Arbeitskopie »%s« ist das einer alten Entwicklungsversion (Format %d); Um sie in ein neues Format zu bringen, verwenden Sie einen mit Format 18 kompatiblen Client, starten Sie »tools/dev/wc-ng/bump-to-19.py« und verwenden Sie danach die neue Version"
-#: ../libsvn_wc/upgrade.c:2092
+#: ../libsvn_wc/upgrade.c:2314
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy"
msgstr "Kann »%s« nicht in ein neueres Format bringen, da es keine Arbeitkopie ist"
-#: ../libsvn_wc/upgrade.c:2141
+#: ../libsvn_wc/upgrade.c:2363
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy root, the root is '%s'"
msgstr "Kann »%s« nicht in ein neueres Format bringen, da es nicht die Basis einer Arbeitskopie ist - die Basis ist »%s«"
-#: ../libsvn_wc/wc_db.c:452
+#: ../libsvn_wc/wc_db.c:445
#, c-format
msgid "No REPOSITORY table entry for id '%ld'"
msgstr "Kein REPOSITORY-Tabelleneintrag für ID »%ld«"
-#: ../libsvn_wc/wc_db.c:768
+#: ../libsvn_wc/wc_db.c:778
#, c-format
msgid "The file '%s' has no checksum."
msgstr "Die Datei »%s« hat keine Prüfsumme."
-#: ../libsvn_wc/wc_db.c:2535 ../libsvn_wc/wc_db.c:2916
-#: ../libsvn_wc/wc_db.c:9372
+#: ../libsvn_wc/wc_db.c:2092
+#, c-format
+msgid "Path '%s' is not moved"
+msgstr "Pfad »%s« wurde nicht verschoben"
+
+#: ../libsvn_wc/wc_db.c:2530 ../libsvn_wc/wc_db.c:2965
+#: ../libsvn_wc/wc_db.c:9823
#, c-format
msgid "The node '%s' has a corrupt checksum value."
msgstr "Der Knoten »%s« hat einen fehlerhaften Prüfsummenwert."
-#: ../libsvn_wc/wc_db.c:2720
+#: ../libsvn_wc/wc_db.c:2750
#, c-format
msgid "The node '%s' has a BASE status that has no properties."
msgstr "Der Knoten »%s« hat einen »BASE«-Status, der keine Eigenschaften hat."
-#: ../libsvn_wc/wc_db.c:3546
+#: ../libsvn_wc/wc_db.c:3605
#, c-format
msgid "The node '%s' is not an external."
msgstr "Der Knoten »%s« ist kein externer Verweis."
-#: ../libsvn_wc/wc_db.c:3960
+#: ../libsvn_wc/wc_db.c:4017
#, c-format
msgid "Expected node '%s' to be deleted."
msgstr "Erwartete, dass Knoten »%s« gelöscht wird."
-#: ../libsvn_wc/wc_db.c:6473 ../libsvn_wc/wc_db.c:6552
+#: ../libsvn_wc/wc_db.c:6814 ../libsvn_wc/wc_db.c:6866
#, c-format
msgid "Can't revert '%s' without reverting children"
msgstr "Kann »%s« nicht zurücksetzen, ohne dessen Kindelemente zurückzusetzen"
-#: ../libsvn_wc/wc_db.c:6649
+#: ../libsvn_wc/wc_db.c:7022
#, c-format
msgid "Can't revert '%s' without reverting parent"
msgstr "Kann »%s« nicht zurücksetzen, ohne dessen Elternelement zurückzusetzen"
-#: ../libsvn_wc/wc_db.c:6768
+#: ../libsvn_wc/wc_db.c:7157
#, c-format
msgid "Unsupported depth for revert of '%s'"
msgstr "Nicht unterstützte Tiefe für Zurücksetzung von »%s«"
-#: ../libsvn_wc/wc_db.c:7740
+#: ../libsvn_wc/wc_db.c:7727
+#, c-format
+msgid "The node '%s' is not a committed directory"
+msgstr "Der Knoten »%s« ist kein übertragenes Verzeichnis"
+
+#: ../libsvn_wc/wc_db.c:8117
#, c-format
msgid "Cannot delete '%s' as '%s' is excluded by server"
msgstr "Kann »%s« nicht löschen, da »%s« vom Server ausgeschlossen wurde"
-#: ../libsvn_wc/wc_db.c:7751
+#: ../libsvn_wc/wc_db.c:8128
#, c-format
msgid "Cannot delete '%s' as it is excluded by server"
msgstr "Kann »%s« nicht löschen, da es vom Server ausgeschlossen wurde"
-#: ../libsvn_wc/wc_db.c:7758
+#: ../libsvn_wc/wc_db.c:8135
#, c-format
msgid "Cannot delete '%s' as it is excluded"
msgstr "Kann »%s« nicht löschen, da es ausgeschlossen wurde"
-#: ../libsvn_wc/wc_db.c:8210
+#: ../libsvn_wc/wc_db.c:8592
#, c-format
msgid "Cannot move '%s' to '%s' because they are not in the same working copy"
msgstr "Kann »%s« nicht nach »%s« verschieben, da dies nicht in der selben Arbeitskopie ist"
-#: ../libsvn_wc/wc_db.c:8568
+#: ../libsvn_wc/wc_db.c:8950
#, c-format
msgid "Corrupt data for '%s'"
msgstr "Fehlerhafte Daten für »%s«"
-#: ../libsvn_wc/wc_db.c:8872
+#: ../libsvn_wc/wc_db.c:9022
+#, c-format
+msgid "Error reading node '%s'"
+msgstr "Fehler beim Lesen des Knotens »%s«"
+
+#: ../libsvn_wc/wc_db.c:9280
#, c-format
msgid "The node '%s' comes from unexpected repository '%s', expected '%s'; if this node is a file external using the correct URL in the external definition can fix the problem, see issue #4087"
msgstr "Der Knoten »%s« gehört unerwartet zum Projektarchiv »%s«, erwartet war »%s«; Falls der Knoten ein externer Dateiverweis ist, kann die Verwendung der korrekten URL in der Definition des externen Dateiverweises das Problem beheben, siehe Fehlerbericht #4087"
-#: ../libsvn_wc/wc_db.c:9497
+#: ../libsvn_wc/wc_db.c:9954
#, c-format
msgid "The node '%s' is not in working copy '%s'"
msgstr "Der Knoten »%s« ist nicht in der Arbeitskopie »%s«"
-#: ../libsvn_wc/wc_db.c:9534
+#: ../libsvn_wc/wc_db.c:9991
#, c-format
msgid "The node '%s' is not installable"
msgstr "Der Knoten »%s« konnte nicht installiert werden"
-#: ../libsvn_wc/wc_db.c:9963 ../libsvn_wc/wc_db.c:10222
+#: ../libsvn_wc/wc_db.c:10430 ../libsvn_wc/wc_db.c:10689
#, c-format
msgid "The node '%s' has a status that has no properties."
msgstr "Der Knoten »%s« hat einen Status, der keine Eigenschaften hat"
-#: ../libsvn_wc/wc_db.c:12062
+#: ../libsvn_wc/wc_db.c:12614
#, c-format
msgid "Expected node '%s' to be added."
msgstr "Erwartete, dass Knoten »%s« hinzugefügt wird."
-#: ../libsvn_wc/wc_db.c:12408
+#: ../libsvn_wc/wc_db.c:12942
#, c-format
msgid "Path '%s' was not moved here"
msgstr "Pfad »%s« wurde nicht hierhin verschoben"
-#: ../libsvn_wc/wc_db.c:12477
+#: ../libsvn_wc/wc_db.c:13130
#, c-format
-msgid "The base node '%s' was not found."
-msgstr "Der Basisknoten »%s« wurde nicht gefunden."
+msgid "Node '%s' is not shadowed"
+msgstr "Knoten »%s« wird nicht überdeckt"
-#: ../libsvn_wc/wc_db.c:12909
-#, c-format
-msgid "The properties of '%s' are in an indeterminate state and cannot be upgraded. See issue #2530."
-msgstr "Die Eigenschaften von »%s« sind in einem unbestimmten Zustand und können nicht in ein neues Format gebreacht werden. Siehe Fehlerbericht #2530."
-
-#: ../libsvn_wc/wc_db.c:12921
-#, c-format
-msgid "Insufficient NODES rows for '%s'"
-msgstr "Nicht genügend »NODES«-Zeilen für »%s«"
-
-#: ../libsvn_wc/wc_db.c:13068
-#, c-format
-msgid "Repository '%s' not found in the database"
-msgstr "Projektverzeichnis »%s« nicht in der Datenbank gefunden"
-
-#: ../libsvn_wc/wc_db.c:14055 ../libsvn_wc/wc_db.c:14103
+#: ../libsvn_wc/wc_db.c:14357 ../libsvn_wc/wc_db.c:14405
#, c-format
msgid "'%s' is already locked."
msgstr "»%s« ist bereits gesperrt"
-#: ../libsvn_wc/wc_db.c:14060 ../libsvn_wc/wc_db.c:14111
+#: ../libsvn_wc/wc_db.c:14362 ../libsvn_wc/wc_db.c:14413
#, c-format
msgid "Working copy '%s' locked."
msgstr "Arbeitskopie »%s« gesperrt."
-#: ../libsvn_wc/wc_db.c:14183
+#: ../libsvn_wc/wc_db.c:14436
+#, c-format
+msgid "Failed to lock working copy '%s'."
+msgstr "Konnte Arbeitskopie »%s« nicht sperren. "
+
+#: ../libsvn_wc/wc_db.c:14485
#, c-format
msgid "'%s' is already locked via '%s'."
msgstr "»%s« ist bereits durch »%s« gesperrt."
-#: ../libsvn_wc/wc_db.c:14357
+#: ../libsvn_wc/wc_db.c:14659
#, c-format
msgid "Working copy not locked at '%s'."
msgstr "Arbeitskopie »%s« ist nicht gesperrt."
-#: ../libsvn_wc/wc_db.c:14740
+#: ../libsvn_wc/wc_db.c:15158
#, c-format
msgid "Modification of '%s' already exists"
msgstr "Änderung von »%s« existiert bereits"
#. If EXPRESSION is false, cause the caller to return an SVN_ERR_WC_CORRUPT
#. * error, showing EXPRESSION and the caller's LOCAL_RELPATH in the message.
-#: ../libsvn_wc/wc_db.c:15382
+#: ../libsvn_wc/wc_db.c:15755
#, c-format
msgid "database inconsistency at local_relpath='%s' verifying expression '%s'"
msgstr "Datenbankinkonsistenz bei »local_relpath« »%s« beim Auswerten des Ausdrucks »%s«"
-#: ../libsvn_wc/wc_db.c:15506
+#: ../libsvn_wc/wc_db.c:15943
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy root"
msgstr "Kann »%s« nicht in ein neueres Format bringen, da es keine Basis einer Arbeitskopie ist"
-#: ../libsvn_wc/wc_db.c:15512
+#: ../libsvn_wc/wc_db.c:15949
#, c-format
msgid "Working copy '%s' is too old and must be upgraded to at least format %d, as created by Subversion %s"
msgstr "Arbeitskopie »%s« ist zu alt und muss mindestens in das Format %d gebracht werden, wie es von Subversion %s erstellt wurde"
-#: ../libsvn_wc/wc_db.c:15530
+#: ../libsvn_wc/wc_db.c:15967
msgid "Working copy upgrade failed"
msgstr "Arbeitskopie konnte nicht in ein nees Format gebracht werden"
-#: ../libsvn_wc/wc_db_pristine.c:125 ../libsvn_wc/wc_db_pristine.c:457
+#: ../libsvn_wc/wc_db.c:16068
+#, c-format
+msgid "The path '%s' is not in the working copy '%s'"
+msgstr "Der Pfad »%s« ist nicht in der Arbeitskopie »%s« "
+
+#: ../libsvn_wc/wc_db_pristine.c:128 ../libsvn_wc/wc_db_pristine.c:467
#, c-format
msgid "The pristine text with checksum '%s' was not found"
msgstr "Der Ursprungstext mit der Prüfsumme »%s« wurde nicht gefunden."
-#: ../libsvn_wc/wc_db_pristine.c:191
+#: ../libsvn_wc/wc_db_pristine.c:194
#, c-format
msgid "Pristine text '%s' not present"
msgstr "Ursprungstext »%s« nicht vorhanden"
-#: ../libsvn_wc/wc_db_pristine.c:224
+#: ../libsvn_wc/wc_db_pristine.c:237
#, c-format
msgid "Can't read '%s' from pristine store because no checksum supplied"
msgstr "Kann »%s« nicht aus dem Speicherbereich für ürsprüngliche Dateiinhalte lesen, da keine Prüfsumme angegeben wurde"
-#: ../libsvn_wc/wc_db_pristine.c:328
+#: ../libsvn_wc/wc_db_pristine.c:320
#, c-format
msgid "New pristine text '%s' has different size: %ld versus %ld"
msgstr "Neuer ursprünglicher Dateitext »%s« hat eine andere Größe: %ld im Vergleich zu %ld"
-#: ../libsvn_wc/wc_db_pristine.c:496
+#: ../libsvn_wc/wc_db_pristine.c:506
#, c-format
msgid "The pristine text with MD5 checksum '%s' was not found"
msgstr "Der Ursprungstext mit der MD5-Prüfsumme »%s« wurde nicht gefunden."
-#: ../libsvn_wc/wc_db_update_move.c:282 ../libsvn_wc/wc_db_update_move.c:306
-#, c-format
-msgid "'%s' already in conflict"
-msgstr "»%s« ist schon von einem Konflikt betroffen"
-
-#: ../libsvn_wc/wc_db_update_move.c:1382
+#: ../libsvn_wc/wc_db_update_move.c:170
#, c-format
-msgid "'%s' is not in conflict"
-msgstr "»%s« ist nicht von einem Konflikt betroffen"
-
-#: ../libsvn_wc/wc_db_update_move.c:1395
-#, c-format
-msgid "'%s' is not a tree-conflict victim"
-msgstr "»%s« ist nicht von einem Baumkonflikt betroffen"
+msgid "'%s' is not deleted"
+msgstr "»%s« ist nicht gelöscht"
-#: ../libsvn_wc/wc_db_update_move.c:1754
+#: ../libsvn_wc/wc_db_update_move.c:404 ../libsvn_wc/wc_db_update_move.c:428
#, c-format
-msgid "Cannot auto-resolve tree-conflict on '%s'"
-msgstr "Kann Baumkonflikt in »%s« nicht automatisch auflösen"
+msgid "'%s' already in conflict"
+msgstr "»%s« ist schon von einem Konflikt betroffen"
-#: ../libsvn_wc/wc_db_update_move.c:1817
+#: ../libsvn_wc/wc_db_update_move.c:1631
#, c-format
msgid "Cannot apply update because move source %s' is a mixed-revision working copy"
msgstr "Kann Aktualisierung nicht anwenden, da die Quelle der Verschiebung »%s« eine Arbeitskopie mit verschiedenen Revisionen ist"
-#: ../libsvn_wc/wc_db_update_move.c:1828
+#: ../libsvn_wc/wc_db_update_move.c:1639
#, c-format
msgid "Cannot apply update because move source '%s' is a switched subtree"
msgstr "Kann Aktualisierung nicht anwenden, da die Quelle der Verschiebung »%s« ein umgestellter Unterbaum ist"
-#: ../libsvn_wc/wc_db_update_move.c:1879
+#: ../libsvn_wc/wc_db_update_move.c:1692
#, c-format
msgid "The node '%s' has not been moved away"
msgstr "Der Knoten »%s« wurde nicht an einen anderen Ort verschoben"
-#: ../libsvn_wc/wc_db_update_move.c:1908
+#: ../libsvn_wc/wc_db_update_move.c:2300
#, c-format
-msgid "'%s' is not deleted"
-msgstr "»%s« ist nicht gelöscht"
+msgid "'%s' is not in conflict"
+msgstr "»%s« ist nicht von einem Konflikt betroffen"
+
+#: ../libsvn_wc/wc_db_update_move.c:2313
+#, c-format
+msgid "'%s' is not a valid tree-conflict victim"
+msgstr "»%s« ist kein gültiges von einem Baumkonflikt betroffenes Element"
+
+#: ../libsvn_wc/wc_db_update_move.c:2326
+#, c-format
+msgid "'%s' is already a moved away tree-conflict"
+msgstr "»%s« ist schon ein Baumkonflikt mit Verschiebung anderswo hin"
# CHECKME: What's WCROOT? A variable or short for "working copy root"?
#: ../libsvn_wc/wc_db_util.c:69
@@ -8074,19 +9057,19 @@ msgstr "»%s« ist nicht gelöscht"
msgid "Missing a row in WCROOT."
msgstr "Fehlende Zeile in WCROOT."
-#: ../libsvn_wc/wc_db_util.c:135
+#: ../libsvn_wc/wc_db_util.c:136
#, c-format
msgid "Working copy database '%s' not found"
msgstr "Datenbank der Arbeitskopie »%s« ist gefunden"
-#: ../libsvn_wc/wc_db_wcroot.c:276
+#: ../libsvn_wc/wc_db_wcroot.c:318
#, c-format
msgid "Working copy format of '%s' is too old (%d); please check out your working copy again"
msgstr ""
"Format der Arbeitskopie »%s« ist zu alt (%d); bitte checken Sie die\n"
"Arbeitskopie erneut aus"
-#: ../libsvn_wc/wc_db_wcroot.c:286
+#: ../libsvn_wc/wc_db_wcroot.c:328
#, c-format
msgid ""
"This client is too old to work with the working copy at\n"
@@ -8099,11 +9082,11 @@ msgstr ""
"Sie benötigen einen neueren Subversion-Client. Für mehr Details, siehe\n"
" http://subversion.apache.org/faq.html#working-copy-format-change\n"
-#: ../libsvn_wc/wc_db_wcroot.c:307
+#: ../libsvn_wc/wc_db_wcroot.c:349
msgid "Cleanup with an older 1.7 client before upgrading with this client"
msgstr "Starten Sie »svn cleanup« mit einem älteren 1.7 Client bevor Sie mit diesem Client operieren"
-#: ../libsvn_wc/wc_db_wcroot.c:318
+#: ../libsvn_wc/wc_db_wcroot.c:360
#, c-format
msgid ""
"The working copy at '%s'\n"
@@ -8112,48 +9095,48 @@ msgstr ""
"Die Arbeitskopie in »%s«\n"
"ist zu alt (Format %d) für die Verwendung mit der Version »%s« (erwartet Format %d). Sie müssen die Arbeitskopie zuerst in ein neues Format bringen.\n"
-#: ../libsvn_wc/wc_db_wcroot.c:396
+#: ../libsvn_wc/wc_db_wcroot.c:438
#, c-format
msgid "The symlink at '%s' points nowhere"
msgstr "Der symbolische Link »%s« zeigt nirgendwohin."
# CHECKME: What's WCROOT? A variable or short for "working copy root"?
-#: ../libsvn_wc/wc_db_wcroot.c:665
+#: ../libsvn_wc/wc_db_wcroot.c:757
#, c-format
msgid "Missing a row in WCROOT for '%s'."
msgstr "Fehlende Zeile in WCROOT für »%s«."
-#: ../libsvn_wc/wc_db_wcroot.c:720
+#: ../libsvn_wc/wc_db_wcroot.c:811
#, c-format
msgid "The working copy at '%s' is corrupt."
msgstr "Die Arbeitskopie in »%s« ist beschädigt."
-#: ../libsvn_wc/wc_db_wcroot.c:736
+#: ../libsvn_wc/wc_db_wcroot.c:827
#, c-format
msgid "The working copy database at '%s' is missing."
msgstr "Die Datenbank der Arbeitskopie in »%s« fehlt."
-#: ../libsvn_wc/wc_db_wcroot.c:745
+#: ../libsvn_wc/wc_db_wcroot.c:836
#, c-format
msgid "The working copy database at '%s' is corrupt."
msgstr "Die Datenbank der Arbeitskopie in »%s« ist beschädigt."
-#: ../libsvn_wc/wc_db_wcroot.c:903
+#: ../libsvn_wc/wc_db_wcroot.c:994
#, c-format
msgid "'%s' is not a working copy root"
msgstr "»%s« ist keine Basis einer Arbeitskopie"
-#: ../libsvn_wc/workqueue.c:518
+#: ../libsvn_wc/workqueue.c:512
#, c-format
msgid "Can't install '%s' from pristine store, because no checksum is recorded for this file"
msgstr "Kann »%s« nicht im Speicherbereich für ursprünglichen Dateiinhalt ablegen, da keine Prüfsumme für diese Datei eingetragen ist"
-#: ../libsvn_wc/workqueue.c:1499
+#: ../libsvn_wc/workqueue.c:1468
#, c-format
msgid "Unrecognized work item in the queue"
msgstr "Unbekannter Arbeitsschritt in Warteschlange"
-#: ../libsvn_wc/workqueue.c:1579
+#: ../libsvn_wc/workqueue.c:1551
#, c-format
msgid "Failed to run the WC DB work queue associated with '%s', work item %d %s"
msgstr "Konnte die mit »%s« zusammenhängende Arbeitsschrittwarteschlange der Datenbank der Arbeitskopie nicht ausführen, Arbeitsschritt %d %s"
@@ -8166,208 +9149,377 @@ msgstr "Konnte nicht alle Ziele hinzufügen, da einige Ziele nicht existieren"
msgid "Could not add all targets because some targets are already versioned"
msgstr "Konnte nicht alle Ziele hinzufügen, da einige Ziele schon versioniert sind"
-#: ../svn/blame-cmd.c:303 ../svn/list-cmd.c:300
+#: ../svn/auth-cmd.c:72
+#, c-format
+msgid "Automatic certificate validity check failed because:\n"
+msgstr "Automatische Gültigkeitsprüfung des Zertifikats fehlgeschlagen:\n"
+
+#: ../svn/auth-cmd.c:77
+#, c-format
+msgid " The certificate is not yet valid.\n"
+msgstr " Das Zertifikat ist noch nicht gültig.\n"
+
+#: ../svn/auth-cmd.c:81
+#, c-format
+msgid " The certificate has expired.\n"
+msgstr " Das Zertifikat ist abgelaufen.\n"
+
+#: ../svn/auth-cmd.c:85
+#, c-format
+msgid " The certificate's Common Name (hostname) does not match the remote hostname.\n"
+msgstr " Der Hostname im Zertifikat stimmt nicht mit dem Hostnamen des Servers überein.\n"
+
+#: ../svn/auth-cmd.c:90
+#, c-format
+msgid " The certificate issuer is unknown.\n"
+msgstr " Der Aussteller des Zertifikats ist unbekannt.\n"
+
+#: ../svn/auth-cmd.c:94
+#, c-format
+msgid " Unknown verification failure.\n"
+msgstr " Unbekannter Fehler bei der Gültigkeitsprüfung.\n"
+
+#: ../svn/auth-cmd.c:191
+#, c-format
+msgid "Subject: %s\n"
+msgstr "Zertifikatsempfänger: %s\n"
+
+#: ../svn/auth-cmd.c:193
+#, c-format
+msgid "Valid from: %s\n"
+msgstr "Gültig ab: %s\n"
+
+#: ../svn/auth-cmd.c:197
+#, c-format
+msgid "Valid until: %s\n"
+msgstr "Gültig bis: %s\n"
+
+#: ../svn/auth-cmd.c:201
+#, c-format
+msgid "Issuer: %s\n"
+msgstr "Herausgeber: %s\n"
+
+#: ../svn/auth-cmd.c:203
+#, c-format
+msgid "Fingerprint: %s\n"
+msgstr "Fingerabdruck: %s\n"
+
+#: ../svn/auth-cmd.c:220
+#, c-format
+msgid "Hostnames: %s\n"
+msgstr "Hostnamen: %s\n"
+
+#: ../svn/auth-cmd.c:239
+#, c-format
+msgid "Credential kind: %s\n"
+msgstr "Art der Zugangsdaten: %s\n"
+
+#: ../svn/auth-cmd.c:259
+#, c-format
+msgid "Password: %s\n"
+msgstr "Passwort: %s\n"
+
+#: ../svn/auth-cmd.c:261
+#, c-format
+msgid "Password: [not shown]\n"
+msgstr "Passwort: [nicht angezeigt]\n"
+
+#: ../svn/auth-cmd.c:267
+#, c-format
+msgid "Passphrase: %s\n"
+msgstr "Passphrase: %s\n"
+
+#: ../svn/auth-cmd.c:270
+#, c-format
+msgid "Passphrase: [not shown]\n"
+msgstr "Passphrase: [nicht angezeigt]\n"
+
+#: ../svn/auth-cmd.c:273
+#, c-format
+msgid "Password cache: %s\n"
+msgstr "Passwortspeicher: %s\n"
+
+#: ../svn/auth-cmd.c:276
+#, c-format
+msgid "Username: %s\n"
+msgstr "Benutzername: %s\n"
+
+#: ../svn/auth-cmd.c:327
+#, c-format
+msgid "Deleting %s credential for realm '%s'\n"
+msgstr "Entferne Zugangsdaten %s für Anmeldebereich »%s«\n"
+
+#: ../svn/auth-cmd.c:374
+#, c-format
+msgid "Credentials cache in '%s' is empty\n"
+msgstr "Speicher für Zugangsdaten in »%s« ist leer\n"
+
+#: ../svn/auth-cmd.c:378 ../svn/auth-cmd.c:401
+#, c-format
+msgid "Credentials cache in '%s' contains no matching credentials"
+msgstr "Speicher für Zugangsdaten in »%s« enthält keine passende Zugangsdaten"
+
+#: ../svn/auth-cmd.c:386
+#, c-format
+msgid "Credentials cache in '%s' contains %d credentials\n"
+msgstr "Speicher für Zugangsdaten in »%s« enthält %d Zugangsdaten\n"
+
+#: ../svn/auth-cmd.c:390
+#, c-format
+msgid "Credentials cache in '%s' contains %d matching credentials\n"
+msgstr "Speicher für Zugangsdaten in »%s« enthält %d passende Zugangsdaten\n"
+
+#: ../svn/auth-cmd.c:405
+#, c-format
+msgid "Deleted %d matching credentials from '%s'\n"
+msgstr "%d passende Zugangsdaten aus »%s« gelöscht\n"
+
+#: ../svn/blame-cmd.c:314 ../svn/list-cmd.c:301
msgid "'verbose' option invalid in XML mode"
msgstr "Option »verbose« ist im XML-Modus ungültig"
-#: ../svn/blame-cmd.c:315 ../svn/info-cmd.c:613 ../svn/list-cmd.c:312
-#: ../svn/status-cmd.c:308
+#: ../svn/blame-cmd.c:326 ../svn/list-cmd.c:313 ../svn/status-cmd.c:308
msgid "'incremental' option only valid in XML mode"
msgstr "Option »incremental« ist nur im XML-Modus gültig"
-#: ../svn/blame-cmd.c:378
+#: ../svn/blame-cmd.c:389
#, c-format
msgid "Skipping binary file (use --force to treat as text): '%s'\n"
msgstr "Überspringe Binärdatei (--force erzwingt Behandlung als Text): »%s«\n"
-#: ../svn/blame-cmd.c:415
+#: ../svn/blame-cmd.c:426
msgid "Could not perform blame on all targets because some targets don't exist"
msgstr "Konnte nicht für alle Ziele annotieren, da einige Ziele nicht existieren"
-#: ../svn/cat-cmd.c:102
+#: ../svn/cat-cmd.c:103
msgid "Could not cat all targets because some targets don't exist"
msgstr "Konnte nicht alle Ziele ausgeben, da einige Ziele nicht existieren"
-#: ../svn/cat-cmd.c:106
+#: ../svn/cat-cmd.c:107
msgid "Could not cat all targets because some targets are not versioned"
msgstr "Konnte nicht alle Ziele ausgeben, da einige Ziele nicht versioniert sind"
-#: ../svn/cat-cmd.c:110
+#: ../svn/cat-cmd.c:111
msgid "Could not cat all targets because some targets are directories"
msgstr "Konnte nicht alle Ziele ausgeben, da einige Ziele Verzeichnisse sind"
-#: ../svn/changelist-cmd.c:135
+#: ../svn/changelist-cmd.c:117
msgid "Could not set changelists on all targets because some targets don't exist"
msgstr "Konnte nicht alle Ziele Änderungslisten zuweisen, da einige Ziele nicht existieren"
-#: ../svn/changelist-cmd.c:140
+#: ../svn/changelist-cmd.c:122
msgid "Could not set changelists on all targets because some targets are not versioned"
msgstr "Konnte nicht alle Ziele Änderungslisten zuweisen, da einige Ziele nicht versioniert sind"
-#: ../svn/checkout-cmd.c:133 ../svn/switch-cmd.c:138
+#: ../svn/checkout-cmd.c:140 ../svn/switch-cmd.c:138
#, c-format
msgid "'%s' does not appear to be a URL"
msgstr "»%s« scheint keine URL zu sein"
-#: ../svn/cl-conflicts.c:80
+#: ../svn/checkout-cmd.c:181 ../svn/export-cmd.c:130 ../svn/list-cmd.c:413
+#: ../svn/switch-cmd.c:188 ../svn/update-cmd.c:177
+msgid "Failure occurred processing one or more externals definitions"
+msgstr "Fehler bei der Verarbeitung eines oder mehrerer externer Verweise"
+
+#: ../svn/cl-conflicts.c:82
msgid "local file edit"
msgstr "lokale Datei geändert"
-#: ../svn/cl-conflicts.c:82
+#: ../svn/cl-conflicts.c:84
msgid "local file obstruction"
msgstr "lokale Datei blockiert"
-#: ../svn/cl-conflicts.c:84
+#: ../svn/cl-conflicts.c:86
msgid "local file delete"
msgstr "lokale Datei gelöscht"
-#: ../svn/cl-conflicts.c:86
+#: ../svn/cl-conflicts.c:89
+msgid "local file missing or deleted or moved away"
+msgstr "lokale Datei fehlt, wurde gelöscht oder verschoben"
+
+#: ../svn/cl-conflicts.c:91
msgid "local file missing"
msgstr "lokale Datei fehlt"
-#: ../svn/cl-conflicts.c:88
+#: ../svn/cl-conflicts.c:93
msgid "local file unversioned"
msgstr "lokale Datei nicht versioniert"
-#: ../svn/cl-conflicts.c:90
+#: ../svn/cl-conflicts.c:95
msgid "local file add"
msgstr "lokale Datei hinzugefügt"
-#: ../svn/cl-conflicts.c:92
+#: ../svn/cl-conflicts.c:97
msgid "local file replace"
msgstr "lokale Datei ersetzt"
-#: ../svn/cl-conflicts.c:94
+#: ../svn/cl-conflicts.c:99
msgid "local file moved away"
msgstr "lokale Datei verschoben"
-#: ../svn/cl-conflicts.c:96
+#: ../svn/cl-conflicts.c:101
msgid "local file moved here"
msgstr "lokale Datei hierher verschoben"
-#: ../svn/cl-conflicts.c:103
+#: ../svn/cl-conflicts.c:108
msgid "local dir edit"
msgstr "lokales Verzeichnis geändert"
-#: ../svn/cl-conflicts.c:105
+#: ../svn/cl-conflicts.c:110
msgid "local dir obstruction"
msgstr "lokales Verzeichnis blockiert"
-#: ../svn/cl-conflicts.c:107
+#: ../svn/cl-conflicts.c:112
msgid "local dir delete"
msgstr "lokales Verzeichnis gelöscht"
-#: ../svn/cl-conflicts.c:109
+#: ../svn/cl-conflicts.c:115
+msgid "local dir missing or deleted or moved away"
+msgstr "lokales Verzeichnis fehlt, wurde gelöscht oder verschoben"
+
+#: ../svn/cl-conflicts.c:117
msgid "local dir missing"
msgstr "lokales Verzeichnis fehlt"
-#: ../svn/cl-conflicts.c:111
+#: ../svn/cl-conflicts.c:119
msgid "local dir unversioned"
msgstr "lokales Verzeichnis nicht versioniert"
-#: ../svn/cl-conflicts.c:113
+#: ../svn/cl-conflicts.c:121
msgid "local dir add"
msgstr "lokales Verzeichnis hinzugefügt"
-#: ../svn/cl-conflicts.c:115
+#: ../svn/cl-conflicts.c:123
msgid "local dir replace"
msgstr "lokales Verzeichnis ersetzt"
-#: ../svn/cl-conflicts.c:117
+#: ../svn/cl-conflicts.c:125
msgid "local dir moved away"
msgstr "lokales Verzeichnis verschoben"
-#: ../svn/cl-conflicts.c:119
+#: ../svn/cl-conflicts.c:127
msgid "local dir moved here"
msgstr "lokales Verzeichnis hierher verschoben"
-#: ../svn/cl-conflicts.c:141
+#: ../svn/cl-conflicts.c:135 ../svn/cl-conflicts.c:242
+msgid "local edit"
+msgstr "lokale geändert"
+
+#: ../svn/cl-conflicts.c:137 ../svn/cl-conflicts.c:251
+msgid "local obstruction"
+msgstr "lokal blockiert"
+
+#: ../svn/cl-conflicts.c:139 ../svn/cl-conflicts.c:248
+msgid "local delete"
+msgstr "lokal gelöscht"
+
+#: ../svn/cl-conflicts.c:142
+msgid "local missing or deleted or moved away"
+msgstr "lokales Element fehlt, wurde gelöscht oder verschoben"
+
+#: ../svn/cl-conflicts.c:144
+msgid "local missing"
+msgstr "lokales Element fehlt"
+
+#: ../svn/cl-conflicts.c:146
+msgid "local unversioned"
+msgstr "lokales Element nicht versioniert"
+
+#: ../svn/cl-conflicts.c:148 ../svn/cl-conflicts.c:245
+msgid "local add"
+msgstr "lokal hinzugefügt"
+
+#: ../svn/cl-conflicts.c:150
+msgid "local replace"
+msgstr "lokale ersetzt"
+
+#: ../svn/cl-conflicts.c:152
+msgid "local moved away"
+msgstr "lokale verschoben"
+
+#: ../svn/cl-conflicts.c:154
+msgid "local moved here"
+msgstr "lokale hierher verschoben"
+
+#: ../svn/cl-conflicts.c:173
msgid "incoming file edit"
msgstr "eingehende Änderung einer Datei"
-#: ../svn/cl-conflicts.c:143
+#: ../svn/cl-conflicts.c:175
msgid "incoming file add"
msgstr "eingehendes Hinzufügen einer Datei"
-#: ../svn/cl-conflicts.c:145
-msgid "incoming file delete"
-msgstr "eingehendes Löschen einer Datei"
+#: ../svn/cl-conflicts.c:177
+msgid "incoming file delete or move"
+msgstr "eingehendes Löschen oder Verschieben einer Datei"
-#: ../svn/cl-conflicts.c:147
-msgid "incoming file replace"
-msgstr "eingehendes Ersetzen einer Datei"
+#: ../svn/cl-conflicts.c:179
+msgid "incoming replace with file"
+msgstr "eingehendes Ersetzen mit einer Datei"
-#: ../svn/cl-conflicts.c:154
+#: ../svn/cl-conflicts.c:186
msgid "incoming dir edit"
msgstr "eingehende Änderung eines Verzeichnisses"
-#: ../svn/cl-conflicts.c:156
+#: ../svn/cl-conflicts.c:188
msgid "incoming dir add"
msgstr "eingehendes Hinzufügen eines Verzeichnisses"
-#: ../svn/cl-conflicts.c:158
-msgid "incoming dir delete"
-msgstr "eingehendes Löschen eines Verzeichnisses"
+#: ../svn/cl-conflicts.c:190
+msgid "incoming dir delete or move"
+msgstr "eingehendes Löschen oder Verschieben eines Verzeichnisses"
-#: ../svn/cl-conflicts.c:160
-msgid "incoming dir replace"
-msgstr "eingehendes Ersetzen eines Verzeichnisses"
+#: ../svn/cl-conflicts.c:192
+msgid "incoming replace with dir"
+msgstr "eingehendes Ersetzen mit einem Verzeichnis"
-#: ../svn/cl-conflicts.c:178
+#: ../svn/cl-conflicts.c:200 ../svn/cl-conflicts.c:262
+msgid "incoming edit"
+msgstr "eingehende Änderung"
+
+#: ../svn/cl-conflicts.c:202 ../svn/cl-conflicts.c:265
+msgid "incoming add"
+msgstr "eingehendes Hinzufügen"
+
+#: ../svn/cl-conflicts.c:204
+msgid "incoming delete or move"
+msgstr "eingehendes Löschen oder Verschieben"
+
+#: ../svn/cl-conflicts.c:206
+msgid "incoming replace"
+msgstr "eingehendes Ersetzen"
+
+#: ../svn/cl-conflicts.c:220
msgid "upon update"
msgstr "bei Aktualisierung"
-#: ../svn/cl-conflicts.c:179
+#: ../svn/cl-conflicts.c:221
msgid "upon switch"
msgstr "bei Umstellung"
-#: ../svn/cl-conflicts.c:180
+#: ../svn/cl-conflicts.c:222
msgid "upon merge"
msgstr "bei Zusammenführung"
-#: ../svn/cl-conflicts.c:181
+#: ../svn/cl-conflicts.c:223
msgid "upon none"
msgstr "ohne Operation"
-#: ../svn/cl-conflicts.c:200
-msgid "local edit"
-msgstr "lokale geändert"
-
-#: ../svn/cl-conflicts.c:203
-msgid "local add"
-msgstr "lokal hinzugefügt"
-
-#: ../svn/cl-conflicts.c:206
-msgid "local delete"
-msgstr "lokal gelöscht"
-
-#: ../svn/cl-conflicts.c:209
-msgid "local obstruction"
-msgstr "lokal blockiert"
-
-#: ../svn/cl-conflicts.c:212
+#: ../svn/cl-conflicts.c:254
#, c-format
msgid "local %s"
msgstr "lokal %s"
-#: ../svn/cl-conflicts.c:220
-msgid "incoming edit"
-msgstr "eingehende Änderung"
-
-#: ../svn/cl-conflicts.c:223
-msgid "incoming add"
-msgstr "eingehendes Hinzufügen"
-
-#: ../svn/cl-conflicts.c:226
+#: ../svn/cl-conflicts.c:268
msgid "incoming delete"
msgstr "eingehendes Löschen"
-#: ../svn/cl-conflicts.c:229
+#: ../svn/cl-conflicts.c:271
#, c-format
msgid "incoming %s"
msgstr "eingehendes %s"
-#: ../svn/cl-conflicts.c:235 ../svn/cl-conflicts.c:277
+#: ../svn/cl-conflicts.c:277 ../svn/cl-conflicts.c:320
#, c-format
msgid "%s, %s %s"
msgstr "%s, %s %s"
@@ -8375,12 +9527,25 @@ msgstr "%s, %s %s"
#. A catch-all message for very rare or nominally impossible cases.
#. It will not be pretty, but is closer to an internal error than
#. an ordinary user-facing string.
-#: ../svn/cl-conflicts.c:285
+#: ../svn/cl-conflicts.c:328
#, c-format
msgid "local: %s %s incoming: %s %s %s"
msgstr "lokal: %s %s, empfangen: %s %s %s"
-#: ../svn/cleanup-cmd.c:92
+#: ../svn/cl-conflicts.c:355
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: ../svn/cleanup-cmd.c:87
+msgid "Working copy locked; if no other Subversion client is currently using the working copy, try running 'svn cleanup' without the --remove-unversioned and --remove-ignored options first."
+msgstr "Arbeitskopie gesperrt; Wenn kein anderer Subversion-Client gerade die Arbeitskopie verwendet, versuchen Sie zuerst »svn cleanup« ohne die Optionen »--remove-unversioned« und »--remove-ignored« auszuführen."
+
+#: ../svn/cleanup-cmd.c:95
+msgid "Cannot remove unversioned or ignored items from something that is not a working copy"
+msgstr "Kann ignorierte oder nicht versionierte Elemente nicht aus etwas entfernen, was keine Arbeitskopie ist"
+
+#: ../svn/cleanup-cmd.c:122
#, c-format
msgid "Working copy locked; try running 'svn cleanup' on the root of the working copy ('%s') instead."
msgstr "Arbeitskopie gesperrt; Versuchen Sie stattdessen »svn cleanup« auf der Basis der Arbeitskopie (»%s«) auszuführen"
@@ -8394,47 +9559,39 @@ msgstr "svn: Die Tiefe dieser Übertragung ist »%s«, Kopien werden aber im Pro
msgid "Commit targets must be local paths"
msgstr "Ziele der Übertragung müssen lokale Pfade sein"
-#: ../svn/conflict-callbacks.c:155 ../svn/conflict-callbacks.c:172
+#: ../svn/conflict-callbacks.c:159 ../svn/conflict-callbacks.c:176
msgid "MINE"
msgstr "EIGENE"
-#: ../svn/conflict-callbacks.c:160 ../svn/conflict-callbacks.c:170
+#: ../svn/conflict-callbacks.c:164 ../svn/conflict-callbacks.c:174
msgid "THEIRS"
msgstr "FREMDE"
-#: ../svn/conflict-callbacks.c:163
+#: ../svn/conflict-callbacks.c:167
msgid "MERGED"
msgstr "ZUSAMMENGEFÃœHRT"
-#: ../svn/conflict-callbacks.c:220 ../svn/conflict-callbacks.c:276
+#: ../svn/conflict-callbacks.c:229 ../svn/conflict-callbacks.c:289
msgid "||||||| ORIGINAL"
msgstr "||||||| ORIGINAL"
-#: ../svn/conflict-callbacks.c:221
+#: ../svn/conflict-callbacks.c:230
msgid "<<<<<<< MINE (select with 'mc')"
msgstr "<<<<<<< EIGENE (Auswahl mit »mc«)"
-#: ../svn/conflict-callbacks.c:222
+#: ../svn/conflict-callbacks.c:231
msgid ">>>>>>> THEIRS (select with 'tc')"
msgstr ">>>>>>> FREMDE (Auswahl mit »tc«)"
-#: ../svn/conflict-callbacks.c:277
+#: ../svn/conflict-callbacks.c:290
msgid "<<<<<<< MINE"
msgstr "<<<<<<< EIGENE"
-#: ../svn/conflict-callbacks.c:278
+#: ../svn/conflict-callbacks.c:291
msgid ">>>>>>> THEIRS"
msgstr ">>>>>>> FREMDE"
-#: ../svn/conflict-callbacks.c:333 ../svn/file-merge.c:503
-msgid "No editor found."
-msgstr "Kein Editor gefunden."
-
-#: ../svn/conflict-callbacks.c:342 ../svn/file-merge.c:515
-msgid "Error running editor."
-msgstr "Fehler beim Ausführen des Editors."
-
-#: ../svn/conflict-callbacks.c:352
+#: ../svn/conflict-callbacks.c:362
#, c-format
msgid ""
"Invalid option; there's no merged version to edit.\n"
@@ -8443,252 +9600,201 @@ msgstr ""
"Ungültige Option; es gibt keine zusammengeführte Version zum Bearbeiten.\n"
"\n"
-#: ../svn/conflict-callbacks.c:411
-msgid "No merge tool found, try '(m) merge' instead.\n"
-msgstr "Kein Werkzeug zum Zusammenführen gefunden, versuchen Sie stattdessen »(m) merge«.\n"
-
-#: ../svn/conflict-callbacks.c:419
-msgid "Error running merge tool, try '(m) merge' instead."
-msgstr "Fehler beim Ausführen des Werkzeugs zum Zusammenführen, versuchen Sie stattdessen »(m) merge«."
-
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:420
msgid "change merged file in an editor [edit]"
msgstr "Bearbeitet die zusammengeführte Datei in einem Editor [edit]"
#. Translators: keep long_desc below 70 characters (wrap with a left
#. margin of 9 spaces if needed); don't translate the words within square
#. brackets.
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:420
msgid "edit file"
msgstr "Datei bearbeiten"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:423
msgid "show all changes made to merged file"
msgstr "Zeigt alle Änderungen an der zusammengeführten Datei an"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:423
msgid "show diff"
msgstr "Änderungen anzeigen"
-#: ../svn/conflict-callbacks.c:456
+#: ../svn/conflict-callbacks.c:425
msgid "accept merged version of file"
msgstr "Akzeptiert die zusammengeführte Version der Datei"
-#: ../svn/conflict-callbacks.c:456 ../svn/conflict-callbacks.c:501
-#: ../svn/conflict-callbacks.c:533
+#: ../svn/conflict-callbacks.c:425 ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:493
msgid "mark resolved"
msgstr "als aufgelöst markieren"
-#: ../svn/conflict-callbacks.c:459 ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:428 ../svn/conflict-callbacks.c:473
msgid "display conflict"
msgstr "Konflikte anzeigen"
-#: ../svn/conflict-callbacks.c:459
+#: ../svn/conflict-callbacks.c:428
msgid "show all conflicts (ignoring merged version)"
msgstr "Zeigt alle Konflikte an (ignoriert zusammengeführte Datei)"
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:431
msgid "accept my version for all conflicts (same) [mine-conflict]"
msgstr "Akzeptiert eigene Version für alle Konflikte (ebenso) [mine-conflict]"
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:431
msgid "my side of conflict"
msgstr "eigene Seite des Konflikts"
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:434
msgid "accept their version for all conflicts (same) [theirs-conflict]"
msgstr "Akzeptiert fremde Version für alle Konflikte (ebenso) [theirs-conflict]"
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:434
msgid "their side of conflict"
msgstr "fremde Seite des Konflikts"
-#: ../svn/conflict-callbacks.c:469
+#: ../svn/conflict-callbacks.c:439
msgid "accept my version of entire file (even non-conflicts) [mine-full]"
msgstr "Akzeptiert eigene Version für ganze Datei (alles, nicht nur Konflikte) [mine-full]"
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:492
-#: ../svn/conflict-callbacks.c:515
+#: ../svn/conflict-callbacks.c:439 ../svn/conflict-callbacks.c:467
msgid "my version"
msgstr "meine Version"
-#: ../svn/conflict-callbacks.c:472
+#: ../svn/conflict-callbacks.c:442
msgid "accept their version of entire file (same) [theirs-full]"
msgstr "Akzeptiert fremde Version für ganze Datei (ebenso) [theirs-full]"
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:495
-#: ../svn/conflict-callbacks.c:518
+#: ../svn/conflict-callbacks.c:442 ../svn/conflict-callbacks.c:470
msgid "their version"
msgstr "fremde Version"
-#: ../svn/conflict-callbacks.c:476 ../svn/util.c:774
+#: ../svn/conflict-callbacks.c:446 ../svn/util.c:776
msgid "merge"
msgstr "Zusammenführung"
-#: ../svn/conflict-callbacks.c:476
-msgid "use internal merge tool to resolve conflict"
-msgstr "Verwendet das interne Werkzeug zum Zusammenführen für die Konfliktlösung"
+#: ../svn/conflict-callbacks.c:446
+msgid "use merge tool to resolve conflict"
+msgstr "Verwendet ein Werkzeug zum Zusammenführen für die Konfliktlösung"
-#: ../svn/conflict-callbacks.c:478
-msgid "launch external tool to resolve conflict [launch]"
+#: ../svn/conflict-callbacks.c:448
+msgid "launch external merge tool to resolve conflict [launch]"
msgstr "Startet ein externes Werkzeug zum Zusammenführen für die Konfliktlösung [launch]"
-#: ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:448
msgid "launch tool"
msgstr "Werkzeug starten"
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
-#: ../svn/conflict-callbacks.c:521
+#: ../svn/conflict-callbacks.c:451
+msgid "internal merge tool"
+msgstr "internes Werkzeug zum Zusammenführen"
+
+#: ../svn/conflict-callbacks.c:451
+msgid "use built-in merge tool to resolve conflict"
+msgstr "Verwendet das interne Werkzeug zum Zusammenführen für die Konfliktlösung"
+
+#: ../svn/conflict-callbacks.c:454 ../svn/conflict-callbacks.c:480
msgid "mark the conflict to be resolved later [postpone]"
msgstr "Markiert den Konflikt für eine spätere Auflösung [postpone]"
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
-#: ../svn/conflict-callbacks.c:521 ../svn/conflict-callbacks.c:535
-#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:567
-#: ../svn/conflict-callbacks.c:583 ../svn/conflict-callbacks.c:599
+#: ../svn/conflict-callbacks.c:454 ../svn/conflict-callbacks.c:480
+#: ../svn/conflict-callbacks.c:495 ../svn/conflict-callbacks.c:510
+#: ../svn/conflict-callbacks.c:525
msgid "postpone"
msgstr "später auflösen"
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:555 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585 ../svn/conflict-callbacks.c:601
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:483
+#: ../svn/conflict-callbacks.c:497 ../svn/conflict-callbacks.c:512
+#: ../svn/conflict-callbacks.c:527
msgid "postpone all remaining conflicts"
msgstr "Alle verbleibenen Konflikte zurückstellen"
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:555 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585 ../svn/conflict-callbacks.c:601
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:483
+#: ../svn/conflict-callbacks.c:497 ../svn/conflict-callbacks.c:512
+#: ../svn/conflict-callbacks.c:527
msgid "quit resolution"
msgstr "Konfliktauflösung beenden"
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:459
msgid "show all options"
msgstr "alle Optionen anzeigen"
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:459
msgid "show this list (also 'h', '?')"
msgstr "Gibt diese Liste aus (auch: »h«, »?«)"
-#: ../svn/conflict-callbacks.c:492
+#: ../svn/conflict-callbacks.c:467
msgid "accept my version of entire property (even non-conflicts) [mine-full]"
msgstr "Akzeptiert eigene Version für ganze Eigenschaft (alles, nicht nur Konflikte) [mine-full]"
-#: ../svn/conflict-callbacks.c:495
+#: ../svn/conflict-callbacks.c:470
msgid "accept their version of entire property (same) [theirs-full]"
msgstr "Akzeptiert fremde Version für ganze Eigenschaft (ebenso) [theirs-full]"
-#: ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:473
msgid "show conflicts in this property"
msgstr "Zeigt Konflikte in dieser Eigenschaft an"
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:475
msgid "change merged property value in an editor [edit]"
msgstr "Bearbeitet den zusammengeführten Eigenschaftswert in einem Editor [edit]"
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:475
msgid "edit property"
msgstr "Eigenschaft bearbeiten"
-#: ../svn/conflict-callbacks.c:501
+#: ../svn/conflict-callbacks.c:478
msgid "accept edited version of property"
msgstr "Akzeptiert die bearbeitete Version der Eigenschaft"
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:557
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
-#: ../svn/conflict-callbacks.c:603
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:514 ../svn/conflict-callbacks.c:529
msgid "help"
msgstr "Hilfe"
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:557
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
-#: ../svn/conflict-callbacks.c:603
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:514 ../svn/conflict-callbacks.c:529
msgid "show this help (also '?')"
msgstr "Zeigt diese Hilfe an (auch: »?«)"
-#: ../svn/conflict-callbacks.c:515
-msgid "accept pre-existing item (ignore upstream addition) [mine-full]"
-msgstr "Akzeptiert vorhandenes Element (ignoriert empfangene Hinzufügung) [mine-full]"
-
-#: ../svn/conflict-callbacks.c:518
-msgid "accept incoming item (overwrite pre-existing item) [theirs-full]"
-msgstr "Akzeptiert empfangenes Element (überschreibt vorhandenes Element) [theirs-full]"
-
-#: ../svn/conflict-callbacks.c:533
+#: ../svn/conflict-callbacks.c:493
msgid "accept current working copy state"
msgstr "Akzeptiert aktuellen Zustand in der Arbeitskopie"
-#: ../svn/conflict-callbacks.c:535 ../svn/conflict-callbacks.c:553
-#: ../svn/conflict-callbacks.c:567 ../svn/conflict-callbacks.c:583
-#: ../svn/conflict-callbacks.c:599
+#: ../svn/conflict-callbacks.c:495 ../svn/conflict-callbacks.c:510
+#: ../svn/conflict-callbacks.c:525
msgid "resolve the conflict later [postpone]"
msgstr "Löst den Konflikt später auf [postpone]"
-#: ../svn/conflict-callbacks.c:545
-msgid "apply update (recommended)"
-msgstr "Wendet Aktualisierung an (empfohlen)"
-
-#: ../svn/conflict-callbacks.c:546
-msgid "apply update to the move destination [mine-conflict]"
-msgstr "Wendet die Aktualisierung auf das verschobene Ziel an [mine-conflict]"
-
-#: ../svn/conflict-callbacks.c:549
-msgid "discard update (breaks move)"
-msgstr "Verwirft Aktualisierung (Verschiebung wird Kopie)"
-
-#: ../svn/conflict-callbacks.c:549
-msgid "discard update, mark resolved, the move will will become a copy"
-msgstr "Verwirft die Aktualisierung, markiert den Konflikt als aufgelöst, wandelt Verschiebung in eine Kopie um"
-
-#: ../svn/conflict-callbacks.c:563
-msgid "apply update to move destination"
-msgstr "Wendet Aktualisierung auf das verschobene Ziel an"
+#: ../svn/conflict-callbacks.c:506
+msgid "apply update to move destination (recommended)"
+msgstr "Wendet die Aktualisierung auf das verschobene Ziel an (empfohlen)"
-#: ../svn/conflict-callbacks.c:564
+#: ../svn/conflict-callbacks.c:507
msgid "apply incoming update to move destination [mine-conflict]"
msgstr "Wendet empfangene Aktualisierung auf das verschobene Ziel an [mine-conflict]"
-#: ../svn/conflict-callbacks.c:577 ../svn/conflict-callbacks.c:593
-msgid "keep affected local moves"
-msgstr "Behält lokale Verschiebungen"
-
-#: ../svn/conflict-callbacks.c:577
-msgid "keep any local moves affected by this deletion [mine-conflict]"
-msgstr "Behält alle durch das Löschen betroffenen lokalen Verschiebungen [mine-conflict]"
-
-#: ../svn/conflict-callbacks.c:580 ../svn/conflict-callbacks.c:596
-msgid "mark resolved (breaks moves)"
-msgstr "Markiert als aufgelöst (Verschiebung wird Kopie)"
-
-#: ../svn/conflict-callbacks.c:580
-msgid "mark resolved, any affected moves will become copies"
-msgstr "Markiert den Konflikt als aufgelöst, wandelt betroffene Verschiebungen in Kopien um"
-
-#: ../svn/conflict-callbacks.c:593
-msgid "keep any moves affected by this replacement [mine-conflict]"
-msgstr "Behält alle durch das Ersetzen betroffenen Verschiebungen [mine-conflict]"
+#: ../svn/conflict-callbacks.c:521
+msgid "prepare for updating moved-away children, if any (recommended)"
+msgstr "Bereitet die Aktualisierung von ggf. verschobenen Kindelementen vor (empfohlen)"
-#: ../svn/conflict-callbacks.c:596
-msgid "mark resolved (any affected moves will become copies)"
-msgstr "Markiert den Konflikt als aufgelöst (wandelt betroffene Verschiebungen in Kopien um)"
+#: ../svn/conflict-callbacks.c:522
+msgid "allow updating moved-away children with 'svn resolve' [mine-conflict]"
+msgstr "Erlaubt die Aktualisierung von verschobenen Kindelementen mit »svn resolve« [mine-conflict]"
-#: ../svn/conflict-callbacks.c:632
+#: ../svn/conflict-callbacks.c:558
msgid "Select:"
msgstr "Auswahl:"
-#: ../svn/conflict-callbacks.c:659
+#: ../svn/conflict-callbacks.c:585
#, c-format
msgid " (%s) %s"
msgstr " (%s) %s"
-#: ../svn/conflict-callbacks.c:699
+#: ../svn/conflict-callbacks.c:625
msgid "Words in square brackets are the corresponding --accept option arguments.\n"
msgstr "Worte in eckigen Klammen geben das entsprechende Argument für die Option »--accept« an.\n"
-#: ../svn/conflict-callbacks.c:738
+#: ../svn/conflict-callbacks.c:664
#, c-format
msgid ""
"Unrecognized option.\n"
@@ -8698,13 +9804,13 @@ msgstr ""
"\n"
# TODO: leicht inkonsistent zu obigen Strings (tritt in svn info-Ausgabe auf)
-#: ../svn/conflict-callbacks.c:766
+#: ../svn/conflict-callbacks.c:693
#, c-format
msgid "Conflict discovered in file '%s'.\n"
msgstr "Konflikt in Datei »%s« entdeckt.\n"
# TODO: "for binary files" for consistency with "for properties"
-#: ../svn/conflict-callbacks.c:836
+#: ../svn/conflict-callbacks.c:773
#, c-format
msgid ""
"Invalid option; cannot display conflicts for a binary file.\n"
@@ -8713,7 +9819,7 @@ msgstr ""
"Ungültige Option; Anzeige von Konflikten ist für Binärdateien nicht möglich.\n"
"\n"
-#: ../svn/conflict-callbacks.c:845
+#: ../svn/conflict-callbacks.c:782
#, c-format
msgid ""
"Invalid option; original files not available.\n"
@@ -8722,7 +9828,7 @@ msgstr ""
"Ungültige Option; Originaldateien nicht verfügbar.\n"
"\n"
-#: ../svn/conflict-callbacks.c:857
+#: ../svn/conflict-callbacks.c:798
#, c-format
msgid ""
"Invalid option; there's no merged version to diff.\n"
@@ -8731,16 +9837,16 @@ msgstr ""
"Ungültige Option; es gibt keine zusammengeführte Version zum Vergleichen.\n"
"\n"
-#: ../svn/conflict-callbacks.c:877
+#: ../svn/conflict-callbacks.c:823
#, c-format
msgid ""
-"Invalid option; can only resolve text conflicts with the internal merge tool.\n"
+"Invalid option; there's no base path to merge.\n"
"\n"
msgstr ""
-"Ungültige Option; Kann Textkonflikte nur mit dem internen Werkzeug zum Zusammenführen auflösen.\n"
+"Ungültige Option; es gibt keinen Basispfad zum Zusammenführen.\n"
"\n"
-#: ../svn/conflict-callbacks.c:903 ../svn/conflict-callbacks.c:920
+#: ../svn/conflict-callbacks.c:917
#, c-format
msgid ""
"Invalid option.\n"
@@ -8750,7 +9856,7 @@ msgstr ""
"\n"
# CHECKME: proper English?
-#: ../svn/conflict-callbacks.c:929
+#: ../svn/conflict-callbacks.c:946
#, c-format
msgid ""
"Invalid option; cannot choose based on conflicts in a binary file.\n"
@@ -8759,19 +9865,19 @@ msgstr ""
"Ungültige Option; Auswahl anhand von Konflikten ist in einer Binärdatei nicht möglich.\n"
"\n"
-#: ../svn/conflict-callbacks.c:943
+#: ../svn/conflict-callbacks.c:960
#, c-format
msgid ""
"Invalid option; use diff/edit/merge/launch before choosing 'mark resolved'.\n"
"\n"
msgstr "Ungültige Option; Verwenden Sie Änderungen anzeigen / Datei bearbeiten / Zusammenführung / Werkzeug starten bevor Sie den Konflikt als aufgelöst markieren.\n"
-#: ../svn/conflict-callbacks.c:984
+#: ../svn/conflict-callbacks.c:1001
#, c-format
msgid "Conflict for property '%s' discovered on '%s'.\n"
msgstr "Konflikt für Eigenschaft »%s« für »%s« entdeckt.\n"
-#: ../svn/conflict-callbacks.c:1042
+#: ../svn/conflict-callbacks.c:1061
#, c-format
msgid ""
"Invalid option; please edit the property first.\n"
@@ -8780,7 +9886,7 @@ msgstr ""
"Ungültige Option; Bearbeiten Sie zuerst die Eigenschaft.\n"
"\n"
-#: ../svn/conflict-callbacks.c:1079
+#: ../svn/conflict-callbacks.c:1098
#, c-format
msgid ""
"Tree conflict on '%s'\n"
@@ -8789,90 +9895,68 @@ msgstr ""
"Baumkonflikt in »%s«\n"
" > %s\n"
-#: ../svn/conflict-callbacks.c:1149
-#, c-format
-msgid ""
-"Conflict discovered when trying to add '%s'.\n"
-"An object of the same name already exists.\n"
-msgstr ""
-"Beim Versuch, »%s« hinzuzufügen, wurde ein Konflikt entdeckt.\n"
-"Ein Objekt mit demselben Namen existiert bereits.\n"
-
-#: ../svn/conflict-callbacks.c:1247
-msgid "No editor found; leaving all conflicts."
-msgstr "Kein Editor gefunden; behalte alle Konflikte bei."
-
-#: ../svn/conflict-callbacks.c:1256
-msgid "Error running editor; leaving all conflicts."
-msgstr "Fehler beim Ausführen des Editors; behalte alle Konflikte bei."
-
-#: ../svn/conflict-callbacks.c:1292
-msgid "No merge tool found; leaving all conflicts."
-msgstr "Kein Programm zum Zusammenführen gefunden; behalte alle Konflikte bei."
-
-#: ../svn/conflict-callbacks.c:1301
-msgid "Error running merge tool; leaving all conflicts."
-msgstr "Fehler beim Ausführen des Zusammenführungsprogramms; behalte alle Konflikte bei."
-
-#: ../svn/copy-cmd.c:123 ../svn/util.c:957
+#: ../svn/copy-cmd.c:123 ../svn/export-cmd.c:94 ../svn/util.c:959
#, c-format
msgid "'%s': a peg revision is not allowed here"
msgstr "»%s«: Eine Fix-Revision ist hier nicht erlaubt"
-#: ../svn/copy-cmd.c:163 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
+#: ../svn/copy-cmd.c:162 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
#: ../svn/move-cmd.c:77 ../svn/propedit-cmd.c:260
msgid "Local, non-commit operations do not take a log message or revision properties"
msgstr "Lokale Operationen ohne Übertragung benötigen keine Logmeldung oder Revisionseigenschaften"
-#: ../svn/diff-cmd.c:208
+#: ../svn/diff-cmd.c:210
msgid "'--xml' option only valid with '--summarize' option"
msgstr "Option »--xml« ist nur in Verbindung mit der Option »--summarize« zulässig"
-#: ../svn/diff-cmd.c:299
+#: ../svn/diff-cmd.c:301
msgid "'--new' option only valid with '--old' option"
msgstr "Option »--new« ist nur in Verbindung mit der Option »--old« zulässig"
-#: ../svn/diff-cmd.c:317
+#: ../svn/diff-cmd.c:319
msgid "'svn diff [-r N[:M]] [TARGET[@REV]...]' does not support mixed target types. Try using the --old and --new options or one of the shorthand invocations listed in 'svn help diff'."
msgstr "»svn diff [-r N[:M]] [ZIEL[@REV]...]« unterstützt keine gemischten Zieltypen. Versuchen Sie die Optionen »--old« und »--new« oder eine der Kurzfassungen des Aufrufs, die in »svn help diff« aufgelistet sind."
-#: ../svn/diff-cmd.c:355
+#: ../svn/diff-cmd.c:376
#, c-format
msgid "Path '%s' not relative to base URLs"
msgstr "Pfad »%s« ist nicht relativ zur Basis-URL"
-#: ../svn/export-cmd.c:113
+#: ../svn/export-cmd.c:121
msgid "Destination directory exists; please remove the directory or use --force to overwrite"
msgstr "Zielverzeichnis existiert; bitte löschen Sie das Verzeichnis oder verwenden Sie »--force« zum Überschreiben"
-#: ../svn/export-cmd.c:122 ../svn/list-cmd.c:412 ../svn/switch-cmd.c:188
-#: ../svn/update-cmd.c:177
-msgid "Failure occurred processing one or more externals definitions"
-msgstr "Fehler bei der Verarbeitung eines oder mehrerer externer Verweise"
-
-#: ../svn/file-merge.c:135 ../svn/file-merge.c:805
+#: ../svn/file-merge.c:139 ../svn/file-merge.c:809
msgid "Could not write data to merged file"
msgstr "Konnte Daten nicht in zusammengeführte Datei schreiben"
-#: ../svn/file-merge.c:491
+#: ../svn/file-merge.c:495
msgid "Could not write data to temporary file"
msgstr "Konnte Daten nicht in temporäre Datei schreiben"
-#: ../svn/file-merge.c:600
+#: ../svn/file-merge.c:507
+msgid "No editor found."
+msgstr "Kein Editor gefunden."
+
+#: ../svn/file-merge.c:519
+msgid "Error running editor."
+msgstr "Fehler beim Ausführen des Editors."
+
+#: ../svn/file-merge.c:604
msgid "Conflicting section found during merge:"
msgstr "Abschnitt mit Konflikt während Zusammenführung gefunden:"
-#: ../svn/file-merge.c:603
+#: ../svn/file-merge.c:607
#, c-format
msgid "(1) their version (at line %lu)"
msgstr "(1) fremde Version (in Zeile %lu)"
-#: ../svn/file-merge.c:608
+#: ../svn/file-merge.c:612
#, c-format
msgid "(2) your version (at line %lu)"
msgstr "(2) eigene Version (in Zeile %lu)"
-#: ../svn/file-merge.c:657
+#: ../svn/file-merge.c:661
msgid ""
"Select: (1) use their version, (2) use your version,\n"
" (12) their version first, then yours,\n"
@@ -8892,17 +9976,17 @@ msgstr ""
" (p) Verschiebt Konfliktlösung für diesen Abschnitt und setzt Konfliktmarkierungen,\n"
" (a) Bricht Zusammenführung der Datei ab und kehrt zum Hauptmenü zurück: "
-#: ../svn/file-merge.c:888
+#: ../svn/file-merge.c:894
#, c-format
msgid "Merging '%s'.\n"
msgstr "Zusammenführung von »%s«.\n"
-#: ../svn/file-merge.c:935
+#: ../svn/file-merge.c:942
#, c-format
msgid "Merge of '%s' aborted.\n"
msgstr "Zusammenführung von »%s« abgebrochen.\n"
-#: ../svn/file-merge.c:953
+#: ../svn/file-merge.c:960
#, c-format
msgid ""
"Could not write merged result to '%s', saved instead at '%s'.\n"
@@ -8911,21 +9995,20 @@ msgstr ""
"Ergebnis der Zusammenführung konnte nicht nach »%s« geschrieben werden, es wurde stattdessen in »%s« gespeichert.\n"
"Konflikt in »%s« bleibt bestehen.\n"
-#: ../svn/file-merge.c:971
+#: ../svn/file-merge.c:978
#, c-format
msgid "Merge of '%s' completed (remains in conflict).\n"
msgstr "Zusammenführung von »%s« abgeschlossen (Konflikt bleibt bestehen)\n"
-#: ../svn/file-merge.c:975
+#: ../svn/file-merge.c:982
#, c-format
msgid "Merge of '%s' completed.\n"
msgstr "Zusammenführung von »%s« abgeschlossen.\n"
#: ../svn/help-cmd.c:53
-#, c-format
msgid ""
"usage: svn <subcommand> [options] [args]\n"
-"Subversion command-line client, version %s.\n"
+"Subversion command-line client.\n"
"Type 'svn help <subcommand>' for help on a specific subcommand.\n"
"Type 'svn --version' to see the program version and RA modules\n"
" or 'svn --version --quiet' to see just the version number.\n"
@@ -8937,7 +10020,7 @@ msgid ""
"Available subcommands:\n"
msgstr ""
"Aufruf: svn <Unterbefehl> [Optionen] [Parameter]\n"
-"Subversion-Kommandozeilenclient, Version %s.\n"
+"Subversion-Kommandozeilenclient.\n"
"Geben Sie »svn help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
" zu erhalten.\n"
"Geben Sie »svn --version« ein, um die Programmversion und die Zugriffsmodule\n"
@@ -8949,7 +10032,7 @@ msgstr ""
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svn/help-cmd.c:66
+#: ../svn/help-cmd.c:66 ../svnbench/help-cmd.c:62
msgid ""
"Subversion is a tool for version control.\n"
"For additional information, see http://subversion.apache.org/\n"
@@ -8957,7 +10040,8 @@ msgstr ""
"Subversion ist ein Programm zur Versionskontrolle.\n"
"Für weitere Informationen, siehe: http://subversion.apache.org/\n"
-#: ../svn/help-cmd.c:73 ../svnrdump/svnrdump.c:659 ../svnsync/svnsync.c:1857
+#: ../svn/help-cmd.c:70 ../svnbench/help-cmd.c:66 ../svnrdump/svnrdump.c:628
+#: ../svnsync/svnsync.c:1916
msgid ""
"The following repository access (RA) modules are available:\n"
"\n"
@@ -8965,7 +10049,7 @@ msgstr ""
"Die folgenden ZugriffsModule (ZM) für Projektarchive stehen zur Verfügung:\n"
"\n"
-#: ../svn/help-cmd.c:127
+#: ../svn/help-cmd.c:124
msgid ""
"WARNING: Plaintext password storage is enabled!\n"
"\n"
@@ -8973,6 +10057,26 @@ msgstr ""
"WARNUNG: Speicherung von Passwörtern im Klartext ist aktiviert!\n"
"\n"
+#: ../svn/help-cmd.c:147
+msgid ""
+"\n"
+"The following authentication credential caches are available:\n"
+"\n"
+msgstr ""
+"\n"
+"Die folgenden Speicherbereiche für Zugangsdaten sind verfügbar:\n"
+"\n"
+
+#: ../svn/help-cmd.c:152
+#, c-format
+msgid "%s* Wincrypt cache in %s\n"
+msgstr "%s* Wincrypt-Speicher in %s\n"
+
+#: ../svn/help-cmd.c:159
+#, c-format
+msgid "%s* Plaintext cache in %s\n"
+msgstr "%s* Klartext-Speicher in %s\n"
+
#: ../svn/import-cmd.c:87
msgid "Repository URL required when importing"
msgstr "Projektarchiv URL ist beim Import erforderlich"
@@ -8986,212 +10090,237 @@ msgstr "Zu viele Parameter für Import Befehl"
msgid "Invalid URL '%s'"
msgstr "Ungültige URL »%s«"
+#: ../svn/info-cmd.c:207
+#, c-format
+msgid "'%s' is not a valid value for --show-item"
+msgstr "»%s« ist kein gültiger Wert für --show-item"
+
+#: ../svn/info-cmd.c:215
+#, c-format
+msgid "'%s' is not a valid value for --show-item; did you mean '%s'?"
+msgstr "»%s« ist kein gültiger Wert für --show-item; Meinten Sie »%s«?"
+
+#: ../svn/info-cmd.c:225
+#, c-format
+msgid "'%s' is not a valid value for --show-item; did you mean '%s' or '%s'?"
+msgstr "»%s« ist kein gültiger Wert für --show-item; Meinten Sie »%s« oder »%s«?"
+
+#: ../svn/info-cmd.c:236
+#, c-format
+msgid "'%s' is not a valid value for --show-item; did you mean '%s', '%s' or '%s'?"
+msgstr "»%s« ist kein gültiger Wert für --show-item; Meinten Sie »%s«, »%s« oder »%s«?"
+
# CHECKME: full stop?
-#: ../svn/info-cmd.c:95
+#: ../svn/info-cmd.c:257
msgid "Resource is not under version control."
msgstr "Ressource ist nicht unter Versionskontrolle."
-#: ../svn/info-cmd.c:266 ../svnadmin/svnadmin.c:1744
+#: ../svn/info-cmd.c:424 ../svnadmin/svnadmin.c:1949
+#: ../svnadmin/svnadmin.c:2167
#, c-format
msgid "Path: %s\n"
msgstr "Pfad: %s\n"
-#: ../svn/info-cmd.c:273
+#: ../svn/info-cmd.c:431
#, c-format
msgid "Name: %s\n"
msgstr "Name: %s\n"
-#: ../svn/info-cmd.c:277
+#: ../svn/info-cmd.c:435
#, c-format
msgid "Working Copy Root Path: %s\n"
msgstr "Wurzelpfad der Arbeitskopie: %s\n"
-#: ../svn/info-cmd.c:283
+#: ../svn/info-cmd.c:441
#, c-format
msgid "URL: %s\n"
msgstr "URL: %s\n"
-#: ../svn/info-cmd.c:286
+#: ../svn/info-cmd.c:444
#, c-format
-msgid "Relative URL: ^/%s\n"
-msgstr "Relative URL: ^/%s\n"
+msgid "Relative URL: %s\n"
+msgstr "Relative URL: %s\n"
-#: ../svn/info-cmd.c:293
+#: ../svn/info-cmd.c:448
#, c-format
msgid "Repository Root: %s\n"
msgstr "Basis des Projektarchivs: %s\n"
-#: ../svn/info-cmd.c:297
+#: ../svn/info-cmd.c:452
#, c-format
msgid "Repository UUID: %s\n"
msgstr "UUID des Projektarchivs: %s\n"
-#: ../svn/info-cmd.c:301
+#: ../svn/info-cmd.c:456
#, c-format
msgid "Revision: %ld\n"
msgstr "Revision: %ld\n"
-#: ../svn/info-cmd.c:306
+#: ../svn/info-cmd.c:461
#, c-format
msgid "Node Kind: file\n"
msgstr "Knotentyp: Datei\n"
-#: ../svn/info-cmd.c:310
+#: ../svn/info-cmd.c:465
#, c-format
msgid "Node Kind: directory\n"
msgstr "Knotentyp: Verzeichnis\n"
-#: ../svn/info-cmd.c:314
+#: ../svn/info-cmd.c:469
#, c-format
msgid "Node Kind: none\n"
msgstr "Knotentyp: keiner\n"
-#: ../svn/info-cmd.c:319
+#: ../svn/info-cmd.c:474
#, c-format
msgid "Node Kind: unknown\n"
msgstr "Knotentyp: unbekannt\n"
-#: ../svn/info-cmd.c:328
+#: ../svn/info-cmd.c:483
#, c-format
msgid "Schedule: normal\n"
msgstr "Plan: normal\n"
-#: ../svn/info-cmd.c:332
+#: ../svn/info-cmd.c:487
#, c-format
msgid "Schedule: add\n"
msgstr "Plan: hinzufügen\n"
-#: ../svn/info-cmd.c:336
+#: ../svn/info-cmd.c:491
#, c-format
msgid "Schedule: delete\n"
msgstr "Plan: löschen\n"
-#: ../svn/info-cmd.c:340
+#: ../svn/info-cmd.c:495
#, c-format
msgid "Schedule: replace\n"
msgstr "Plan: ersetzen\n"
-#: ../svn/info-cmd.c:356
+#: ../svn/info-cmd.c:511
#, c-format
msgid "Depth: empty\n"
msgstr "Tiefe: »empty«\n"
-#: ../svn/info-cmd.c:360
+#: ../svn/info-cmd.c:515
#, c-format
msgid "Depth: files\n"
msgstr "Tiefe: »files«\n"
-#: ../svn/info-cmd.c:364
+#: ../svn/info-cmd.c:519
#, c-format
msgid "Depth: immediates\n"
msgstr "Tiefe: »immediates«\n"
-#: ../svn/info-cmd.c:368
+#: ../svn/info-cmd.c:523
#, c-format
msgid "Depth: exclude\n"
msgstr "Tiefe: »exclude«\n"
#. Other depths should never happen here.
-#: ../svn/info-cmd.c:379
+#: ../svn/info-cmd.c:534
#, c-format
msgid "Depth: INVALID\n"
msgstr "Tiefe: UNGÃœLTIG\n"
-#: ../svn/info-cmd.c:383
+#: ../svn/info-cmd.c:538
#, c-format
msgid "Copied From URL: %s\n"
msgstr "Kopiert von URL: %s\n"
-#: ../svn/info-cmd.c:387
+#: ../svn/info-cmd.c:542
#, c-format
msgid "Copied From Rev: %ld\n"
msgstr "Kopiert von Rev: %ld\n"
-#: ../svn/info-cmd.c:396 ../svn/info-cmd.c:398
+#: ../svn/info-cmd.c:545
#, c-format
msgid "Moved From: %s\n"
msgstr "Verschoben von: %s\n"
-#: ../svn/info-cmd.c:409 ../svn/info-cmd.c:411
+#: ../svn/info-cmd.c:552
#, c-format
msgid "Moved To: %s\n"
msgstr "Verschoben nach: %s\n"
-#: ../svn/info-cmd.c:417
+#: ../svn/info-cmd.c:560
#, c-format
msgid "Last Changed Author: %s\n"
msgstr "Letzter Autor: %s\n"
-#: ../svn/info-cmd.c:421
+#: ../svn/info-cmd.c:564
#, c-format
msgid "Last Changed Rev: %ld\n"
msgstr "Letzte geänderte Rev: %ld\n"
-#: ../svn/info-cmd.c:426
+#: ../svn/info-cmd.c:569
msgid "Last Changed Date"
msgstr "Letztes Änderungsdatum"
-#: ../svn/info-cmd.c:432
+#: ../svn/info-cmd.c:575
msgid "Text Last Updated"
msgstr "Text zuletzt geändert"
-#: ../svn/info-cmd.c:435
+#: ../svn/info-cmd.c:578
#, c-format
msgid "Checksum: %s\n"
msgstr "Prüfsumme: %s\n"
-#: ../svn/info-cmd.c:456
+#: ../svn/info-cmd.c:600
#, c-format
msgid "Conflict Previous Base File: %s\n"
msgstr "Konflikt: vorherige Ausgangsdatei: %s\n"
-#: ../svn/info-cmd.c:463
+#: ../svn/info-cmd.c:608
#, c-format
msgid "Conflict Previous Working File: %s\n"
msgstr "Konflikt: vorherige Arbeitsdatei: %s\n"
-#: ../svn/info-cmd.c:470
+#: ../svn/info-cmd.c:616
#, c-format
msgid "Conflict Current Base File: %s\n"
msgstr "Konflikt: aktuelle Ausgangsdatei: %s\n"
# TODO: leicht inkonsistent zu obigen Strings (tritt in svn info-Ausgabe auf)
-#: ../svn/info-cmd.c:479
+#: ../svn/info-cmd.c:626
#, c-format
msgid "Conflict Properties File: %s\n"
msgstr "Konfliktdatei mit Eigenschaften: %s\n"
-#: ../svn/info-cmd.c:491
+#: ../svn/info-cmd.c:641
msgid "Tree conflict"
msgstr "Baumkonflikt"
-#: ../svn/info-cmd.c:517
+#: ../svn/info-cmd.c:667
+msgid "Conflict Details"
+msgstr "Konfliktdetails"
+
+#: ../svn/info-cmd.c:680
msgid "Source left"
msgstr "Quelle links"
-#: ../svn/info-cmd.c:526
+#: ../svn/info-cmd.c:689
msgid "Source right"
msgstr "Quelle rechts"
-#: ../svn/info-cmd.c:535
+#: ../svn/info-cmd.c:698
#, c-format
msgid "Lock Token: %s\n"
msgstr "Sperrmarke: %s\n"
-#: ../svn/info-cmd.c:539
+#: ../svn/info-cmd.c:702
#, c-format
msgid "Lock Owner: %s\n"
msgstr "Sperreigner: %s\n"
-#: ../svn/info-cmd.c:544
+#: ../svn/info-cmd.c:707
msgid "Lock Created"
msgstr "Sperre erzeugt"
-#: ../svn/info-cmd.c:548
+#: ../svn/info-cmd.c:711
msgid "Lock Expires"
msgstr "Sperre läuft ab"
-#: ../svn/info-cmd.c:556
+#: ../svn/info-cmd.c:719
#, c-format
msgid ""
"Lock Comment (%i line):\n"
@@ -9206,12 +10335,32 @@ msgstr[1] ""
"Sperrkommentar (%i Zeilen):\n"
"%s\n"
-#: ../svn/info-cmd.c:565
+#: ../svn/info-cmd.c:728
#, c-format
msgid "Changelist: %s\n"
msgstr "Änderungsliste: %s\n"
-#: ../svn/info-cmd.c:679
+#: ../svn/info-cmd.c:884
+msgid "--show-item is not valid in --xml mode"
+msgstr "Die Option »--show-item« ist im Modus »--xml« nicht gültig"
+
+#: ../svn/info-cmd.c:888
+msgid "--no-newline is not valid in --xml mode"
+msgstr "Die Option »--no-newline« ist im Modus »--xml« nicht gültig"
+
+#: ../svn/info-cmd.c:903 ../svn/info-cmd.c:923
+msgid "--incremental is only valid in --xml mode"
+msgstr "Die Option »--incremental« ist nur Modus »--xml« gültig"
+
+#: ../svn/info-cmd.c:910
+msgid "--no-newline is only available for single-target, non-recursive info operations"
+msgstr "Die Option »--no-newline« ist nur für einzelne Ziele und nicht-rekursive Info-Operationen verfügbar"
+
+#: ../svn/info-cmd.c:927
+msgid "--no-newline' is only valid with --show-item"
+msgstr "Die Option »--no-newline« ist nur mit »--show-item« gültig"
+
+#: ../svn/info-cmd.c:1000 ../svnbench/null-info-cmd.c:283
msgid "Could not display info for all targets because some targets don't exist"
msgstr "Konnte Information nicht für alle Ziele anzeigen, da einige Ziele nicht existieren"
@@ -9230,7 +10379,7 @@ msgstr "%d. %b %Y"
msgid "Listing external '%s' defined on '%s':\n"
msgstr "Auflistung des externen Verweises »%s« definiert auf »%s«:\n"
-#: ../svn/list-cmd.c:421
+#: ../svn/list-cmd.c:422 ../svnbench/null-list-cmd.c:166
msgid "Could not list all targets because some targets don't exist"
msgstr "Konnte nicht alle Ziele auflisten, da einige Ziele nicht existieren"
@@ -9238,150 +10387,150 @@ msgstr "Konnte nicht alle Ziele auflisten, da einige Ziele nicht existieren"
msgid "Lock comment contains a zero byte"
msgstr "Sperrkommentar enthält ein Null-Byte"
-#: ../svn/log-cmd.c:144
+#: ../svn/log-cmd.c:109
msgid "\n"
msgstr "\n"
-#: ../svn/log-cmd.c:354
+#: ../svn/log-cmd.c:321
msgid "(no author)"
msgstr "(kein Autor)"
-#: ../svn/log-cmd.c:360
+#: ../svn/log-cmd.c:327
msgid "(no date)"
msgstr "(kein Datum)"
-#: ../svn/log-cmd.c:385
+#: ../svn/log-cmd.c:357
#, c-format
msgid " | %d line"
msgid_plural " | %d lines"
msgstr[0] " | %d Zeile"
msgstr[1] " | %d Zeilen"
-#: ../svn/log-cmd.c:401
+#: ../svn/log-cmd.c:374
#, c-format
msgid "Changed paths:\n"
msgstr "Geänderte Pfade:\n"
-#: ../svn/log-cmd.c:418
+#: ../svn/log-cmd.c:394
#, c-format
msgid " (from %s:%ld)"
msgstr " (von %s:%ld)"
-#: ../svn/log-cmd.c:434
+#: ../svn/log-cmd.c:412
#, c-format
msgid "Reverse merged via:"
msgstr "Rückwärtig zusammengeführt mittels:"
-#: ../svn/log-cmd.c:436
+#: ../svn/log-cmd.c:414
#, c-format
msgid "Merged via:"
msgstr "Zusammengeführt mittels:"
-#: ../svn/log-cmd.c:689
+#: ../svn/log-cmd.c:697
msgid "'with-all-revprops' option only valid in XML mode"
msgstr "Option »with-all-revprops« ist nur im XML-Modus gültig"
-#: ../svn/log-cmd.c:693
+#: ../svn/log-cmd.c:701
msgid "'with-no-revprops' option only valid in XML mode"
msgstr "Option »with-no-revprops« ist nur im XML-Modus gültig"
# TODO: combine
# CHECKME: s/with-revprop/with-revprops/ ???
-#: ../svn/log-cmd.c:697
+#: ../svn/log-cmd.c:705
msgid "'with-revprop' option only valid in XML mode"
msgstr "Option »with-revprop« ist nur im XML-Modus gültig"
-#: ../svn/log-cmd.c:704
+#: ../svn/log-cmd.c:712
msgid "'diff' option is not supported in XML mode"
msgstr "Option »diff« wird im XML-Modus nicht unterstützt"
-#: ../svn/log-cmd.c:710
+#: ../svn/log-cmd.c:718
msgid "'quiet' and 'diff' options are mutually exclusive"
msgstr "»quiet« und »diff« schließen sich gegenseitig aus"
-#: ../svn/log-cmd.c:714
+#: ../svn/log-cmd.c:722
msgid "'diff-cmd' option requires 'diff' option"
msgstr "Option »diff-cmd« erfordert Option »diff«"
-#: ../svn/log-cmd.c:718
+#: ../svn/log-cmd.c:726
msgid "'internal-diff' option requires 'diff' option"
msgstr "Option »internal-diff« erfordert Option »diff«"
-#: ../svn/log-cmd.c:722
+#: ../svn/log-cmd.c:730
msgid "'extensions' option requires 'diff' option"
msgstr "Option »extensions« erfordert Option »diff«"
-#: ../svn/log-cmd.c:727
+#: ../svn/log-cmd.c:735
msgid "'depth' option requires 'diff' option"
msgstr "Option »depth« erfordert Option »diff«"
-#: ../svn/log-cmd.c:743
+#: ../svn/log-cmd.c:751 ../svnbench/null-log-cmd.c:158
msgid "-c and -r are mutually exclusive"
msgstr "-c und -r schließen einander aus"
-#: ../svn/log-cmd.c:775
+#: ../svn/log-cmd.c:783
#, c-format
msgid "Only relative paths can be specified after a URL for 'svn log', but '%s' is not a relative path"
msgstr "Mit »svn log« können nach einer URL nur relative Pfade angegeben werden, »%s« ist aber kein relativer Pfad"
-#: ../svn/log-cmd.c:821
+#: ../svn/log-cmd.c:829
#, c-format
msgid "cannot assign with 'with-revprop' option (drop the '=')"
msgstr "Kann nicht mit Option »with-revprop« zuweisen (»=« entfernen)"
-#: ../svn/merge-cmd.c:107 ../svn/merge-cmd.c:131
+#: ../svn/merge-cmd.c:103 ../svn/merge-cmd.c:127
#, c-format
msgid "--- Merging\n"
msgstr "--- Zusammenführung\n"
-#: ../svn/merge-cmd.c:175
+#: ../svn/merge-cmd.c:171
msgid "-r and -c can't be used with --reintegrate"
msgstr "-r und -c können nicht mit --reintegrate verwendet werden"
-#: ../svn/merge-cmd.c:230
+#: ../svn/merge-cmd.c:226
msgid "Merge source required"
msgstr "Die Zusammenführungsquelle muss angegeben werden"
-#: ../svn/merge-cmd.c:276
+#: ../svn/merge-cmd.c:272
msgid "Second revision required"
msgstr "Eine zweite Revision muss angegeben werden"
-#: ../svn/merge-cmd.c:285 ../svn/merge-cmd.c:312 ../svn/mergeinfo-cmd.c:267
-#: ../svnadmin/svnadmin.c:1719 ../svnlook/svnlook.c:2061
-#: ../svnlook/svnlook.c:2254 ../svnlook/svnlook.c:2358
-#: ../svnlook/svnlook.c:2393
+#: ../svn/merge-cmd.c:281 ../svn/merge-cmd.c:308 ../svn/mergeinfo-cmd.c:361
+#: ../svnadmin/svnadmin.c:2138 ../svnlook/svnlook.c:2077
+#: ../svnlook/svnlook.c:2271 ../svnlook/svnlook.c:2375
+#: ../svnlook/svnlook.c:2410
msgid "Too many arguments given"
msgstr "Zu viele Parameter angegeben"
-#: ../svn/merge-cmd.c:302
+#: ../svn/merge-cmd.c:298
msgid "Cannot specify a revision range with two URLs"
msgstr "Die Angabe eines Revisionsbereichs mit zwei URLs ist nicht möglich"
-#: ../svn/merge-cmd.c:406
+#: ../svn/merge-cmd.c:402
msgid "--reintegrate cannot be used with --ignore-ancestry"
msgstr "»--reintegrate« kann nicht mit »--ignore-ancestry« verwendet werden"
-#: ../svn/merge-cmd.c:411
+#: ../svn/merge-cmd.c:407
msgid "--reintegrate cannot be used with --record-only"
msgstr "»--reintegrate« kann nicht mit »--record-only« verwendet werden"
-#: ../svn/merge-cmd.c:416
+#: ../svn/merge-cmd.c:412
msgid "--depth cannot be used with --reintegrate"
msgstr "»--depth« kann nicht mit »--reintegrate« verwendet werden"
-#: ../svn/merge-cmd.c:421
+#: ../svn/merge-cmd.c:417
msgid "--force cannot be used with --reintegrate"
msgstr "»--force« kann nicht mit »--reintegrate« verwendet werden"
-#: ../svn/merge-cmd.c:426
+#: ../svn/merge-cmd.c:422
msgid "--reintegrate can only be used with a single merge source"
msgstr "»--reintegrate« kann nur mit einer einzelnen Zusammenführungsquelle verwendet werden"
-#: ../svn/merge-cmd.c:430
+#: ../svn/merge-cmd.c:426
msgid "--allow-mixed-revisions cannot be used with --reintegrate"
msgstr "»--allow-mixed-revisions« kann nicht mit »--reintegrate« verwendet werden"
-#: ../svn/merge-cmd.c:445
+#: ../svn/merge-cmd.c:441
msgid ""
"Merge tracking not possible, use --ignore-ancestry or\n"
"fix invalid mergeinfo in target with 'svn propset'"
@@ -9389,34 +10538,50 @@ msgstr ""
"Zusammenführungsverfolgung nicht möglich, verwenden Sie »--ignore-ancestry« oder\n"
"reparieren Sie die ungültigen Zusammenführungsinformationen im Ziel mit »svn propset«"
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "last full merge"
msgstr "Letzte vollständige Zusammenführung"
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "youngest common ancestor"
msgstr "Jüngster gemeinsame Vorfahre"
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
msgid "repository path"
msgstr "Pfad im Projektarchiv"
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
msgid "tip of branch"
msgstr "Spitze des Zweiges"
-#: ../svn/mergeinfo-cmd.c:264
+#: ../svn/mergeinfo-cmd.c:358
msgid "Not enough arguments given"
msgstr "Nicht genügend Parameter angegeben"
-#: ../svn/mergeinfo-cmd.c:342
+#: ../svn/mergeinfo-cmd.c:404
+msgid "--quiet (-q) option valid only with --log option"
+msgstr "Option »--quiet« »--q« ist nur in Verbindung mit der Option »--log« zulässig"
+
+#: ../svn/mergeinfo-cmd.c:409
+msgid "--verbose (-v) option valid only with --log option"
+msgstr "Option »--verbose« »--v« ist nur in Verbindung mit der Option »--log« zulässig"
+
+#: ../svn/mergeinfo-cmd.c:414
+msgid "--incremental option valid only with --log option"
+msgstr "Option »--incremental« ist nur in Verbindung mit der Option »--log« zulässig"
+
+#: ../svn/mergeinfo-cmd.c:444
msgid "--revision (-r) option valid only with --show-revs option"
msgstr "Option »--revision« »--r« ist nur in Verbindung mit der Option »--show-revs« zulässig"
-#: ../svn/mergeinfo-cmd.c:346
+#: ../svn/mergeinfo-cmd.c:448
msgid "Depth specification options valid only with --show-revs option"
msgstr "Angabe der Tiefe für die Operation ist nur in Verbindung mit der Option »--show-revs« zulässig"
+#: ../svn/mergeinfo-cmd.c:452
+msgid "--log option valid only with --show-revs option"
+msgstr "Option »--log« ist nur in Verbindung mit der Option »--show-revs« zulässig"
+
#: ../svn/mkdir-cmd.c:92
msgid "Try 'svn add' or 'svn add --non-recursive' instead?"
msgstr "Versuchen Sie »svn add« oder »svn add --non-recursive«."
@@ -9481,104 +10646,121 @@ msgstr " Baumkonflikte: %s (%s)\n"
msgid " Skipped paths: %d\n"
msgstr " Ãœbersprungene Pfade: %d\n"
-#: ../svn/notify.c:235
+#: ../svn/notify.c:246 ../svnbench/notify.c:107
#, c-format
msgid "Skipped missing target: '%s'\n"
msgstr "Fehlendes Ziel: »%s« übersprungen\n"
-#: ../svn/notify.c:242
+#: ../svn/notify.c:253 ../svnbench/notify.c:114
#, c-format
msgid "Skipped target: '%s' -- copy-source is missing\n"
msgstr "Ziel: »%s« übersprungen -- copy-source fehlt\n"
-#: ../svn/notify.c:249
+#: ../svn/notify.c:258 ../svnbench/notify.c:121
#, c-format
msgid "Skipped '%s'\n"
msgstr "Überspringe »%s«\n"
-#: ../svn/notify.c:256
+#: ../svn/notify.c:265 ../svnbench/notify.c:128
#, c-format
msgid "Skipped '%s' -- An obstructing working copy was found\n"
msgstr "Überspringe »%s« -- Eine blockierende Arbeitskopie wurde gefunden\n"
-#: ../svn/notify.c:263
+#: ../svn/notify.c:271 ../svnbench/notify.c:135
#, c-format
msgid "Skipped '%s' -- Has no versioned parent\n"
msgstr "Überspringe »%s« -- Hat keine versioniertes Elternelement\n"
-#: ../svn/notify.c:270
+#: ../svn/notify.c:277 ../svnbench/notify.c:142
#, c-format
msgid "Skipped '%s' -- Access denied\n"
msgstr "Überspringe »%s« -- Zugriff verweigert\n"
-#: ../svn/notify.c:277
+#: ../svn/notify.c:283 ../svnbench/notify.c:149
#, c-format
msgid "Skipped '%s' -- Node remains in conflict\n"
msgstr "Überspringe »%s« -- Knoten bleibt im Konflikt\n"
-#: ../svn/notify.c:358
+#: ../svn/notify.c:299
+#, c-format
+msgid "Removed external '%s': %s\n"
+msgstr "Externer Verweis »%s« entfernt: %s\n"
+
+#: ../svn/notify.c:304
+#, c-format
+msgid "Removed external '%s'\n"
+msgstr "Externer Verweis »%s« entfernt\n"
+
+#: ../svn/notify.c:310
+#, c-format
+msgid "Left local modifications as '%s'\n"
+msgstr "Lokale Änderungen in »%s« belassen\n"
+
+#: ../svn/notify.c:354 ../svnbench/notify.c:233
#, c-format
msgid "Restored '%s'\n"
msgstr "Wieder hergestellt »%s«\n"
-#: ../svn/notify.c:364
+#: ../svn/notify.c:359 ../svnbench/notify.c:239
#, c-format
msgid "Reverted '%s'\n"
msgstr "Rückgängig gemacht: »%s«\n"
-#: ../svn/notify.c:370
+#: ../svn/notify.c:364 ../svnbench/notify.c:245
#, c-format
msgid "Failed to revert '%s' -- try updating instead.\n"
msgstr "Wiederherstellen von »%s« schlug fehl -- Versuchen Sie statt dessen zu aktualisieren.\n"
-#: ../svn/notify.c:378
+#: ../svn/notify.c:371 ../svnbench/notify.c:253
#, c-format
msgid "Resolved conflicted state of '%s'\n"
msgstr "Konflikt von »%s« aufgelöst\n"
-#: ../svn/notify.c:473 ../svn/notify.c:513
+#: ../svn/notify.c:461 ../svn/notify.c:498 ../svnbench/notify.c:344
+#: ../svnbench/notify.c:384
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s"
msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## mit Versatz %s angewandt"
-#: ../svn/notify.c:490 ../svn/notify.c:527
+#: ../svn/notify.c:478 ../svn/notify.c:512 ../svnbench/notify.c:361
+#: ../svnbench/notify.c:398
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s"
msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ mit Versatz %s angewandt"
-#: ../svn/notify.c:548
+#: ../svn/notify.c:530 ../svnbench/notify.c:419
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %lu (%s)\n"
msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## mit Unschärfe %lu (%s) angewandt\n"
-#: ../svn/notify.c:558
+#: ../svn/notify.c:540 ../svnbench/notify.c:429
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %lu\n"
msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ mit Unschärfe %lu angewandt\n"
-#: ../svn/notify.c:576
+#: ../svn/notify.c:556 ../svnbench/notify.c:447
#, c-format
msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n"
msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## (%s) zurückgewiesen\n"
-#: ../svn/notify.c:585
+#: ../svn/notify.c:565 ../svnbench/notify.c:456
#, c-format
msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n"
msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ zurückgewiesen\n"
-#: ../svn/notify.c:599
+#: ../svn/notify.c:577 ../svnbench/notify.c:470
#, c-format
msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n"
msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## bereits angewandt (%s)\n"
-#: ../svn/notify.c:609
+#: ../svn/notify.c:587 ../svnbench/notify.c:480
#, c-format
msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n"
msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ bereits angewandt\n"
# Currently this is used for checkouts and switches too. If we
# want different output, we'll have to add new actions.
-#: ../svn/notify.c:669
+#: ../svn/notify.c:644 ../svnbench/notify.c:542
#, c-format
msgid ""
"\n"
@@ -9587,87 +10769,87 @@ msgstr ""
"\n"
"Hole externen Verweis nach »%s«:\n"
-#: ../svn/notify.c:695
+#: ../svn/notify.c:668 ../svnbench/notify.c:568
#, c-format
msgid "Error handling externals definition for '%s':"
msgstr "Fehler beim Umgang mit der Definition des externen Verweises für »%s«:"
-#: ../svn/notify.c:708
+#: ../svn/notify.c:681 ../svnbench/notify.c:581
#, c-format
msgid "Updating '%s':\n"
msgstr "Aktualisiere »%s«:\n"
-#: ../svn/notify.c:722
+#: ../svn/notify.c:694 ../svnbench/notify.c:595
#, c-format
msgid "Exported external at revision %ld.\n"
msgstr "Externer Verweis exportiert, Revision %ld.\n"
-#: ../svn/notify.c:723
+#: ../svn/notify.c:695 ../svnbench/notify.c:596
#, c-format
msgid "Exported revision %ld.\n"
msgstr "Exportiert, Revision %ld.\n"
-#: ../svn/notify.c:731
+#: ../svn/notify.c:702 ../svnbench/notify.c:604
#, c-format
msgid "Checked out external at revision %ld.\n"
msgstr "Externer Verweis ausgecheckt, Revision %ld.\n"
-#: ../svn/notify.c:732
+#: ../svn/notify.c:703 ../svnbench/notify.c:605
#, c-format
msgid "Checked out revision %ld.\n"
msgstr "Ausgecheckt, Revision %ld.\n"
-#: ../svn/notify.c:743
+#: ../svn/notify.c:713 ../svnbench/notify.c:616
#, c-format
msgid "Updated external to revision %ld.\n"
msgstr "Externer Verweis aktualisiert zu Revision %ld.\n"
-#: ../svn/notify.c:744
+#: ../svn/notify.c:714 ../svnbench/notify.c:617
#, c-format
msgid "Updated to revision %ld.\n"
msgstr "Aktualisiert zu Revision %ld.\n"
-#: ../svn/notify.c:752
+#: ../svn/notify.c:721 ../svnbench/notify.c:625
#, c-format
msgid "External at revision %ld.\n"
msgstr "Externer Verweis, Revision %ld.\n"
-#: ../svn/notify.c:753
+#: ../svn/notify.c:722 ../svnbench/notify.c:626
#, c-format
msgid "At revision %ld.\n"
msgstr "Revision %ld.\n"
-#: ../svn/notify.c:765
+#: ../svn/notify.c:733 ../svnbench/notify.c:638
#, c-format
msgid "External export complete.\n"
msgstr "Export des externen Verweises abgeschlossen.\n"
-#: ../svn/notify.c:766
+#: ../svn/notify.c:734 ../svnbench/notify.c:639
#, c-format
msgid "Export complete.\n"
msgstr "Export abgeschlossen.\n"
-#: ../svn/notify.c:773
+#: ../svn/notify.c:740 ../svnbench/notify.c:646
#, c-format
msgid "External checkout complete.\n"
msgstr "Auschecken des externen Verweises abgeschlossen.\n"
-#: ../svn/notify.c:774
+#: ../svn/notify.c:741 ../svnbench/notify.c:647
#, c-format
msgid "Checkout complete.\n"
msgstr "Auschecken abgeschlossen.\n"
-#: ../svn/notify.c:781
+#: ../svn/notify.c:747 ../svnbench/notify.c:654
#, c-format
msgid "External update complete.\n"
msgstr "Aktualisierung des externen Verweises abgeschlossen.\n"
-#: ../svn/notify.c:782
+#: ../svn/notify.c:748 ../svnbench/notify.c:655
#, c-format
msgid "Update complete.\n"
msgstr "Aktualisierung abgeschlossen.\n"
-#: ../svn/notify.c:798
+#: ../svn/notify.c:762 ../svnbench/notify.c:671
#, c-format
msgid ""
"\n"
@@ -9676,203 +10858,227 @@ msgstr ""
"\n"
"Hole Status des externen Verweises in »%s«:\n"
-#: ../svn/notify.c:806
+#: ../svn/notify.c:768
+#, c-format
+msgid ""
+"\n"
+"Performing info on external item at '%s':\n"
+msgstr ""
+"\n"
+"Hole Informationen des externen Verweises in »%s«:\n"
+
+#: ../svn/notify.c:775 ../svnbench/notify.c:679
#, c-format
msgid "Status against revision: %6ld\n"
msgstr "Status bezogen auf Revision: %6ld\n"
-#: ../svn/notify.c:815
+#: ../svn/notify.c:783 ../svnbench/notify.c:688
#, c-format
msgid "Sending copy of %s\n"
msgstr "Sende Kopie von %s\n"
-#: ../svn/notify.c:816
+#: ../svn/notify.c:784 ../svnbench/notify.c:689
#, c-format
msgid "Sending %s\n"
msgstr "Sende %s\n"
-#: ../svn/notify.c:827
+#: ../svn/notify.c:794 ../svnbench/notify.c:700
#, c-format
msgid "Adding copy of (bin) %s\n"
msgstr "Füge Kopie hinzu (binär) %s\n"
-#: ../svn/notify.c:828
+#: ../svn/notify.c:795 ../svnbench/notify.c:701
#, c-format
msgid "Adding (bin) %s\n"
msgstr "Füge hinzu (binär) %s\n"
-#: ../svn/notify.c:836
+#: ../svn/notify.c:802 ../svnbench/notify.c:709
#, c-format
msgid "Adding copy of %s\n"
msgstr "Füge Kopie hinzu %s\n"
-#: ../svn/notify.c:837
+#: ../svn/notify.c:803 ../svnbench/notify.c:710
#, c-format
msgid "Adding %s\n"
msgstr "Füge hinzu %s\n"
-#: ../svn/notify.c:846
+#: ../svn/notify.c:811 ../svnbench/notify.c:719
#, c-format
msgid "Deleting copy of %s\n"
msgstr "Lösche Kopie von %s\n"
-#: ../svn/notify.c:847
+#: ../svn/notify.c:812 ../svnbench/notify.c:720
#, c-format
msgid "Deleting %s\n"
msgstr "Lösche %s\n"
-#: ../svn/notify.c:856
+#: ../svn/notify.c:820 ../svnbench/notify.c:729
#, c-format
msgid "Replacing copy of %s\n"
msgstr "Ersetze Kopie von %s\n"
-#: ../svn/notify.c:857
+#: ../svn/notify.c:821 ../svnbench/notify.c:730
#, c-format
msgid "Replacing %s\n"
msgstr "Ersetze %s\n"
-#: ../svn/notify.c:867 ../svnsync/sync.c:327
+#: ../svn/notify.c:830 ../svnbench/notify.c:740 ../svnsync/sync.c:416
#, c-format
msgid "Transmitting file data "
msgstr "Ãœbertrage Daten "
-#: ../svn/notify.c:876 ../svnadmin/svnadmin.c:1698
+#: ../svn/notify.c:837 ../svnadmin/svnadmin.c:2116 ../svnbench/notify.c:749
#, c-format
msgid "'%s' locked by user '%s'.\n"
msgstr "»%s« gesperrt durch »%s«.\n"
-#: ../svn/notify.c:882
+#: ../svn/notify.c:842 ../svnbench/notify.c:755
#, c-format
msgid "'%s' unlocked.\n"
msgstr "»%s« freigegeben.\n"
-#: ../svn/notify.c:909
+#: ../svn/notify.c:866 ../svnbench/notify.c:782
#, c-format
msgid "--- Merging differences between repository URLs into '%s':\n"
msgstr "-- Zusammenführen der Unterschiede zwischen Projektarchiv-URLs in »%s«:\n"
-#: ../svn/notify.c:914
+#: ../svn/notify.c:871 ../svnbench/notify.c:787
#, c-format
msgid "--- Merging r%ld into '%s':\n"
msgstr "-- Zusammenführen von r%ld in »%s«:\n"
-#: ../svn/notify.c:918
+#: ../svn/notify.c:875 ../svnbench/notify.c:791
#, c-format
msgid "--- Reverse-merging r%ld into '%s':\n"
msgstr "-- Rückwärtiges Zusammenführen von r%ld in »%s«:\n"
-#: ../svn/notify.c:922
+#: ../svn/notify.c:879 ../svnbench/notify.c:795
#, c-format
msgid "--- Merging r%ld through r%ld into '%s':\n"
msgstr "-- Zusammenführen von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:928
+#: ../svn/notify.c:885 ../svnbench/notify.c:801
#, c-format
msgid "--- Reverse-merging r%ld through r%ld into '%s':\n"
msgstr "-- Rückwärtiges Zusammenführen von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:940
+#: ../svn/notify.c:895 ../svnbench/notify.c:813
#, c-format
msgid "--- Recording mergeinfo for merge between repository URLs into '%s':\n"
msgstr "-- Aufzeichnung der Informationen für Zusammenführung zwischen Projektarchiv-URLs in »%s«:\n"
-#: ../svn/notify.c:950
+#: ../svn/notify.c:905 ../svnbench/notify.c:823
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld into '%s':\n"
msgstr "-- Aufzeichnung der Informationen für Zusammenführung von r%ld in »%s«:\n"
-#: ../svn/notify.c:955
+#: ../svn/notify.c:910 ../svnbench/notify.c:828
#, c-format
msgid "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"
msgstr "-- Aufzeichnung der Informationen für rückwärtiges Zusammenführen von r%ld in »%s«:\n"
-#: ../svn/notify.c:960
+#: ../svn/notify.c:915 ../svnbench/notify.c:833
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"
msgstr "-- Aufzeichnung der Informationen für Zusammenführung von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:965
+#: ../svn/notify.c:920 ../svnbench/notify.c:838
#, c-format
msgid "--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"
msgstr "-- Aufzeichnung der Informationen für rückwärtiges Zusammenführen von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:975
+#: ../svn/notify.c:927 ../svnbench/notify.c:848
#, c-format
msgid "--- Eliding mergeinfo from '%s':\n"
msgstr "-- Entfernung der Zusammenführungsinformationen von »%s«:\n"
-#: ../svn/notify.c:983
+#: ../svn/notify.c:934 ../svnbench/notify.c:856
#, c-format
msgid "--- Merging differences between foreign repository URLs into '%s':\n"
msgstr "-- Zusammenführen der Unterschiede zwischen fremden Projektarchiv-URLs in »%s«:\n"
-#: ../svn/notify.c:989
+#: ../svn/notify.c:940 ../svnbench/notify.c:862
#, c-format
msgid "--- Merging (from foreign repository) r%ld into '%s':\n"
msgstr "-- Zusammenführen (aus fremden Projektarchiv) von r%ld in »%s«:\n"
-#: ../svn/notify.c:994
+#: ../svn/notify.c:945 ../svnbench/notify.c:867
#, c-format
msgid "--- Reverse-merging (from foreign repository) r%ld into '%s':\n"
msgstr "-- Rückwärtiges Zusammenführen (aus fremden Projektarchiv) von r%ld in »%s«:\n"
-#: ../svn/notify.c:999
+#: ../svn/notify.c:950 ../svnbench/notify.c:872
#, c-format
msgid "--- Merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr "-- Zusammenführen (aus fremden Projektarchiv) von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:1005
+#: ../svn/notify.c:956 ../svnbench/notify.c:878
#, c-format
msgid "--- Reverse-merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr "-- Rückwärtiges Zusammenführen (aus fremden Projektarchiv) von r%ld bis r%ld in »%s«:\n"
-#: ../svn/notify.c:1041
+#: ../svn/notify.c:986 ../svnbench/notify.c:915
#, c-format
msgid "property '%s' set on '%s'\n"
msgstr "Eigenschaft »%s« für »%s« gesetzt\n"
-#: ../svn/notify.c:1049
+#: ../svn/notify.c:992 ../svnbench/notify.c:923
#, c-format
msgid "property '%s' deleted from '%s'.\n"
msgstr "Eigenschaft »%s« wurde von »%s« gelöscht.\n"
# TODO: Compare msgid "Attempted to open non-existent child node '%s'"
# (non-, vs. non; Attempted vs. Attempting)
-#: ../svn/notify.c:1057
+#: ../svn/notify.c:998 ../svnbench/notify.c:931
#, c-format
msgid "Attempting to delete nonexistent property '%s' on '%s'\n"
msgstr "Versuchte, nicht existierende Eigenschaft »%s« von »%s« zu löschen\n"
-#: ../svn/notify.c:1066
+#: ../svn/notify.c:1005 ../svnbench/notify.c:940
#, c-format
msgid "property '%s' set on repository revision %ld\n"
msgstr "Eigenschaft »%s« wurde für Revision %ld im Projektarchiv gesetzt\n"
-#: ../svn/notify.c:1074
+#: ../svn/notify.c:1011 ../svnbench/notify.c:948
#, c-format
msgid "property '%s' deleted from repository revision %ld\n"
msgstr "Eigenschaft »%s« wurde von Revision %ld im Projektarchiv gelöscht\n"
-#: ../svn/notify.c:1081
+#: ../svn/notify.c:1016 ../svnbench/notify.c:955
#, c-format
msgid "Upgraded '%s'\n"
msgstr "In neues Format gebracht: »%s«\n"
-#: ../svn/notify.c:1087
+#: ../svn/notify.c:1020 ../svnbench/notify.c:961
#, c-format
msgid "Redirecting to URL '%s':\n"
msgstr "Umleitung zur URL »%s«:\n"
-#: ../svn/notify.c:1115
+#: ../svn/notify.c:1044
#, c-format
msgid "--- Copying from foreign repository URL '%s':\n"
msgstr "-- Kopieren aus fremdem Projektarchiv bei URL »%s«:\n"
-#: ../svn/notify.c:1124
+#: ../svn/notify.c:1051
#, c-format
msgid "Breaking move with source path '%s'\n"
msgstr "Zertrennung der Verschiebeoperation mit Quellpfad »%s«\n"
+#: ../svn/notify.c:1057
+#, c-format
+msgid "Performing cleanup on external item at '%s'.\n"
+msgstr "Räume externen Verweis »%s« auf.\n"
+
+#: ../svn/notify.c:1064
+#, c-format
+msgid "done\n"
+msgstr "erledigt\n"
+
+#: ../svn/notify.c:1066
+#, c-format
+msgid "Committing transaction...\n"
+msgstr "Ãœbertrage Transaktion...\n"
+
#: ../svn/propdel-cmd.c:88
#, c-format
msgid "Cannot specify revision for deleting versioned property '%s'"
@@ -9916,13 +11122,13 @@ msgstr "»%s« scheint kein Arbeitskopiepfad zu sein"
msgid "No changes to property '%s' on '%s'\n"
msgstr "Keine Änderungen der Eigenschaft »%s« für »%s«\n"
-#: ../svn/propget-cmd.c:66
+#: ../svn/propget-cmd.c:67
msgid "Error writing to stream"
msgstr "Fehler beim Schreiben in Datenstrom"
-#: ../svn/propget-cmd.c:186 ../svn/proplist-cmd.c:156
-#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1754
-#: ../svnlook/svnlook.c:1908
+#: ../svn/propget-cmd.c:187 ../svn/proplist-cmd.c:156
+#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1769
+#: ../svnlook/svnlook.c:1923
#, c-format
msgid ""
"Inherited properties on '%s',\n"
@@ -9932,23 +11138,33 @@ msgstr ""
"geerbt von »%s«:\n"
#. Not a --revprop
-#: ../svn/propget-cmd.c:196 ../svn/proplist-cmd.c:175
-#: ../svnlook/svnlook.c:1790 ../svnlook/svnlook.c:1943
+#: ../svn/propget-cmd.c:197 ../svn/proplist-cmd.c:175
+#: ../svnlook/svnlook.c:1804 ../svnlook/svnlook.c:1958
#, c-format
msgid "Properties on '%s':\n"
msgstr "Eigenschaften von »%s«:\n"
-#: ../svn/propget-cmd.c:326
-msgid "--verbose cannot be used with --revprop or --strict or --xml"
-msgstr "»--verbose« kann nicht mit »--revprop«, »--strict« oder »--xml« verwendet werden"
+#: ../svn/propget-cmd.c:328
+msgid "--verbose cannot be used with --revprop or --no-newline or --xml"
+msgstr "»--verbose« kann nicht mit »--revprop«, »--no-newline« oder »--xml« verwendet werden"
-#: ../svn/propget-cmd.c:358 ../svn/proplist-cmd.c:214
+#: ../svn/propget-cmd.c:360 ../svn/proplist-cmd.c:214
msgid "--show-inherited-props can't be used with --revprop"
msgstr "»--show-inherited-props« kann nicht mit »--revprop« verwendet werden"
-#: ../svn/propget-cmd.c:425
-msgid "Strict output of property values only available for single-target, non-recursive propget operations"
-msgstr "Strikte Ausgabe von Eigenschaftswerten ist nur für einzelne Ziele und nicht-rekursive propget-Operationen verfügbar"
+#: ../svn/propget-cmd.c:373
+#, c-format
+msgid "Property '%s' not found on revision %s"
+msgstr "Eigenschaft »%s« wurde in Revision %s nicht gefunden"
+
+#: ../svn/propget-cmd.c:438
+msgid "--no-newline is only available for single-target, non-recursive propget operations"
+msgstr "Die Option »--no-newline« ist nur für einzelne Ziele und nicht-rekursive Propget-Operationen verfügbar"
+
+#: ../svn/propget-cmd.c:493
+#, c-format
+msgid "Property '%s' not found on '%s'"
+msgstr "Eigenschaft »%s« von »%s« nicht gefunden"
#: ../svn/proplist-cmd.c:246
#, c-format
@@ -9984,66 +11200,50 @@ msgstr ""
"Um die Eigenschaft %s abzuschalten, ist »svn propdel« zu verwenden;\n"
"setzen der Eigenschaft auf »%s« wird sie nicht ausschalten."
-#: ../svn/props.c:177
+#: ../svn/props.c:124
#, c-format
-msgid "(To set the '%s' property, re-run with '--force'.)"
-msgstr "(Verwenden Sie »--force« um das Setzen der Eigenschaft »%s« zu erzwingen)"
+msgid "Use '--force' to set the '%s' property."
+msgstr "»--force« erzwingt das Setzen der Eigenschaft »%s«."
-#: ../svn/props.c:182
+#: ../svn/props.c:129
#, c-format
-msgid "(To edit the '%s' property, re-run with '--force'.)"
-msgstr "(Verwenden Sie »--force« um das Bearbeiten der Eigenschaft »%s«zu erzwingen)"
+msgid "Use '--force' to edit the '%s' property."
+msgstr "»--force« erzwingt das Bearbeiten der Eigenschaft »%s«."
-#: ../svn/props.c:188
+#: ../svn/props.c:135
#, c-format
-msgid "(To use the '%s' property, re-run with '--force'.)"
-msgstr "(Verwenden Sie »--force« um die Verwendung der Eigenschaft »%s« zu erzwingen)"
+msgid "Use '--force' to use the '%s' property'."
+msgstr "»--force« erzwingt die Verwendung der Eigenschaft »%s«."
-#: ../svn/props.c:202
+#: ../svn/props.c:149
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to set it"
+msgid "'%s' is not a valid %s property name; use '--force' to set it"
msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Verwenden Sie »--force« um das Setzen zu erzwingen"
-#: ../svn/props.c:208
+#: ../svn/props.c:154
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to edit it"
+msgid "'%s' is not a valid %s property name; use '--force' to edit it"
msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Verwenden Sie »--force« um das Bearbeiten zu erzwingen"
-#: ../svn/props.c:215
+#: ../svn/props.c:160
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to use it"
+msgid "'%s' is not a valid %s property name; use '--force' to use it"
msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Verwenden Sie »--force« um ihn zu verwenden"
-#: ../svn/props.c:281 ../svn/props.c:332
+#: ../svn/props.c:226 ../svn/props.c:269
#, c-format
-msgid ""
-"'%s' is not a valid %s property name; did you mean '%s'?\n"
-"%s"
-msgstr ""
-"»%s« ist kein gültiger »%s«-Eigenschaftsname; Meinten Sie »%s«?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s'?"
+msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Meinten Sie »%s«?"
-#: ../svn/props.c:340
+#: ../svn/props.c:278
#, c-format
-msgid ""
-"'%s' is not a valid %s property name\n"
-"Did you mean '%s' or '%s'?\n"
-"%s"
-msgstr ""
-"»%s« ist kein gültiger »%s«-Eigenschaftsname\n"
-"Meinten Sie »%s« oder »%s«?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s' or '%s'?"
+msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Meinten Sie »%s« oder »%s«?"
-#: ../svn/props.c:350
+#: ../svn/props.c:288
#, c-format
-msgid ""
-"'%s' is not a valid %s property name\n"
-"Did you mean '%s', '%s' or '%s'?\n"
-"%s"
-msgstr ""
-"»%s« ist kein gültiger »%s«-Eigenschaftsname\n"
-"Meinten Sie »%s«, »%s« oder »%s«?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s', '%s' or '%s'?"
+msgstr "»%s« ist kein gültiger »%s«-Eigenschaftsname; Meinten Sie »%s«, »%s« oder »%s«?"
#: ../svn/propset-cmd.c:132
#, c-format
@@ -10067,7 +11267,7 @@ msgstr "ungültiger Parameter »accept«"
msgid "Failure occurred resolving one or more conflicts"
msgstr "Fehler bei der Auflösung einer oder mehrerer Konflikte"
-#: ../svn/revert-cmd.c:77
+#: ../svn/revert-cmd.c:80
msgid "Try 'svn revert --depth infinity' instead?"
msgstr "Versuchen Sie »svn revert --depth infinity« stattdessen?"
@@ -10086,7 +11286,7 @@ msgstr " Eigenschaftskonflikte: %u\n"
msgid " Tree conflicts: %u\n"
msgstr " Baumkonflikte: %u\n"
-#: ../svn/status-cmd.c:398
+#: ../svn/status-cmd.c:399
#, c-format
msgid ""
"\n"
@@ -10095,57 +11295,59 @@ msgstr ""
"\n"
"--- Änderungsliste »%s«:\n"
-#: ../svn/status.c:318
+#: ../svn/status.c:316
#, c-format
msgid "swapped places with %s"
msgstr "Platz mit %s vertauscht"
-#: ../svn/status.c:333
+#: ../svn/status.c:331
#, c-format
msgid "moved from %s"
msgstr "Verschoben von %s"
-#: ../svn/status.c:345
+#: ../svn/status.c:343
#, c-format
msgid "moved to %s"
msgstr "Verschoben nach %s"
-#: ../svn/svn.c:147
+#: ../svn/svn.c:159
msgid "force operation to run"
msgstr "Durchführung des Befehls erzwingen"
-#: ../svn/svn.c:149
+#: ../svn/svn.c:161
msgid "force validity of log message source"
msgstr "Gültigkeit der Quelle für die Logmeldung erzwingen"
-#: ../svn/svn.c:150 ../svn/svn.c:151 ../svnadmin/svnadmin.c:208
-#: ../svnadmin/svnadmin.c:211 ../svndumpfilter/svndumpfilter.c:1048
-#: ../svndumpfilter/svndumpfilter.c:1051 ../svnlook/svnlook.c:114
-#: ../svnlook/svnlook.c:126 ../svnsync/svnsync.c:244 ../svnsync/svnsync.c:246
+#: ../svn/svn.c:162 ../svn/svn.c:163 ../svnadmin/svnadmin.c:227
+#: ../svnadmin/svnadmin.c:230 ../svnbench/svnbench.c:85
+#: ../svnbench/svnbench.c:86 ../svndumpfilter/svndumpfilter.c:977
+#: ../svndumpfilter/svndumpfilter.c:980 ../svnfsfs/svnfsfs.c:129
+#: ../svnfsfs/svnfsfs.c:132 ../svnlook/svnlook.c:115 ../svnlook/svnlook.c:127
+#: ../svnsync/svnsync.c:275 ../svnsync/svnsync.c:277
msgid "show help on a subcommand"
msgstr "zeige Hilfe zu einem Unterbefehl"
-#: ../svn/svn.c:152
+#: ../svn/svn.c:164
msgid "specify log message ARG"
msgstr "PAR als Logmeldung verwenden"
-#: ../svn/svn.c:153
+#: ../svn/svn.c:165 ../svnbench/svnbench.c:87
msgid "print nothing, or only summary information"
msgstr "nichts oder nur Zusammenfassungen ausgeben"
-#: ../svn/svn.c:154
+#: ../svn/svn.c:166 ../svnbench/svnbench.c:88
msgid "descend recursively, same as --depth=infinity"
msgstr ""
"rekursiv absteigen, das gleiche wie\n"
" --depth=infinity"
-#: ../svn/svn.c:155
+#: ../svn/svn.c:167 ../svnbench/svnbench.c:89
msgid "obsolete; try --depth=files or --depth=immediates"
msgstr ""
"veraltet; versuchen Sie --depth=files oder\n"
" --depth=immediates"
-#: ../svn/svn.c:157
+#: ../svn/svn.c:169 ../svnbench/svnbench.c:91
msgid ""
"the change made by revision ARG (like -r ARG-1:ARG)\n"
" If ARG is negative this is like -r ARG:ARG-1\n"
@@ -10157,7 +11359,7 @@ msgstr ""
" Falls PAR die Form PAR1-PAR2 hat, dann wie\n"
" PAR1:PAR2, wobei PAR1 eingeschlossen ist"
-#: ../svn/svn.c:165
+#: ../svn/svn.c:177 ../svnbench/svnbench.c:99
msgid ""
"ARG (some commands also take ARG1:ARG2 range)\n"
" A revision argument can be one of:\n"
@@ -10179,44 +11381,49 @@ msgstr ""
" oder vor BASE\n"
" »PREV« letzte Revision vor COMMITTED"
-#: ../svn/svn.c:180
+#: ../svn/svn.c:192
msgid "read log message from file ARG"
msgstr "Logmeldung aus Datei PAR lesen"
-#: ../svn/svn.c:182
+#: ../svn/svn.c:194
msgid "give output suitable for concatenation"
msgstr "Ausgabe für Verkettung formatieren"
-#: ../svn/svn.c:184
+#: ../svn/svn.c:196
msgid "treat value as being in charset encoding ARG"
msgstr ""
"Wert behandeln, als sei er in der Zeichenkodierung\n"
" PAR"
-#: ../svn/svn.c:185 ../svnadmin/svnadmin.c:214
-#: ../svndumpfilter/svndumpfilter.c:1054 ../svnlook/svnlook.c:168
-#: ../svnrdump/svnrdump.c:144 ../svnserve/svnserve.c:287
-#: ../svnsync/svnsync.c:242 ../svnversion/svnversion.c:141
+#: ../svn/svn.c:197 ../svnadmin/svnadmin.c:233 ../svnbench/svnbench.c:114
+#: ../svndumpfilter/svndumpfilter.c:983 ../svnfsfs/svnfsfs.c:135
+#: ../svnlook/svnlook.c:172 ../svnrdump/svnrdump.c:158
+#: ../svnserve/svnserve.c:378 ../svnsync/svnsync.c:273
+#: ../svnversion/svnversion.c:144
msgid "show program version information"
msgstr "Zeige Versionsinformationen des Programms"
-#: ../svn/svn.c:186
+#: ../svn/svn.c:198 ../svnbench/svnbench.c:115
msgid "print extra information"
msgstr "zusätzliche Informationen ausgeben"
-#: ../svn/svn.c:187
+#: ../svn/svn.c:199
msgid "display update information"
msgstr "Aktualisierungsinformation ausgeben"
-#: ../svn/svn.c:188 ../svnrdump/svnrdump.c:128
+#: ../svn/svn.c:200 ../svnbench/svnbench.c:116 ../svnrdump/svnrdump.c:142
msgid "specify a username ARG"
msgstr "Benutzername PAR angeben"
-#: ../svn/svn.c:189 ../svnrdump/svnrdump.c:130
-msgid "specify a password ARG"
-msgstr "Passwort PAR angeben"
+#: ../svn/svn.c:202
+msgid ""
+"specify a password ARG (caution: on many operating\n"
+" systems, other users will be able to see this)"
+msgstr ""
+"gibt ein Passwort PAR an (Vorsicht: Auf vielen Betriebssystemen\n"
+" ist dies für andere Benutzer sichtbar)"
-#: ../svn/svn.c:191
+#: ../svn/svn.c:206
msgid ""
"Specify differencing options for external diff or\n"
" internal diff or blame. Default: '-u'. Options are\n"
@@ -10226,6 +11433,7 @@ msgid ""
" amount of white space\n"
" -w, --ignore-all-space: Ignore all white space\n"
" --ignore-eol-style: Ignore changes in EOL style\n"
+" -U ARG, --context ARG: Show ARG lines of context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
"Gibt Optionen für ein externes Vergleichsprogramm oder internes\n"
@@ -10242,16 +11450,17 @@ msgstr ""
" Ignoriert sämtliche Leerzeichen.\n"
" --ignore-eol-style:\n"
" Ignoriert Änderungen im Zeilenendestil.\n"
+" -U PAR, --context PAR: Gibt PAR Zeilen Kontext aus.\n"
" -p (--show-c-function):\n"
" Zeigt C-Funktionsname in Diff-Ausgabe."
-#: ../svn/svn.c:209
+#: ../svn/svn.c:226 ../svnbench/svnbench.c:119
msgid "pass contents of file ARG as additional args"
msgstr ""
"Inhalt der Datei PAR als zusätzliche Parameter\n"
" übergeben"
-#: ../svn/svn.c:211
+#: ../svn/svn.c:228 ../svnbench/svnbench.c:121
msgid ""
"limit operation by depth ARG ('empty', 'files',\n"
" 'immediates', or 'infinity')"
@@ -10259,7 +11468,7 @@ msgstr ""
"begrenzt Operation auf Tiefe PAR (»empty«, »files«,\n"
" »immediates« oder »infinity«)"
-#: ../svn/svn.c:215
+#: ../svn/svn.c:232
msgid ""
"set new working copy depth to ARG ('exclude',\n"
" 'empty', 'files', 'immediates', or 'infinity')"
@@ -10267,19 +11476,19 @@ msgstr ""
"setzt eine neue Tiefe PAR der Arbeitskopie (»exclude«,\n"
" »empty«, »files«, »immediates« oder »infinity«)"
-#: ../svn/svn.c:218 ../svnlook/svnlook.c:171
+#: ../svn/svn.c:235 ../svnlook/svnlook.c:175
msgid "output in XML"
msgstr "gibt XML aus"
-#: ../svn/svn.c:219
-msgid "use strict semantics"
-msgstr "wendet strikte Semantik an"
+#: ../svn/svn.c:236
+msgid "DEPRECATED"
+msgstr "VERALTET"
-#: ../svn/svn.c:221
+#: ../svn/svn.c:238 ../svnbench/svnbench.c:126
msgid "do not cross copies while traversing history"
msgstr "beendet Log-Ausgabe bei Kopieroperationen"
-#: ../svn/svn.c:223
+#: ../svn/svn.c:240
msgid ""
"disregard default and svn:ignore and\n"
" svn:global-ignores property ignores"
@@ -10287,21 +11496,64 @@ msgstr ""
"ignoriert Einstellungen aus »global-ignores« und den\n"
" Eigenschaften »svn:ignore« und »svn:global-ignores«"
-#: ../svn/svn.c:227 ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:188
+#: ../svn/svn.c:244 ../svnbench/svnbench.c:128 ../svnrdump/svnrdump.c:154
+#: ../svnsync/svnsync.c:197
msgid "do not cache authentication tokens"
msgstr "Anmeldeinformationen nicht zwischenspeichern"
-#: ../svn/svn.c:229 ../svnrdump/svnrdump.c:154 ../svnsync/svnsync.c:198
+#: ../svn/svn.c:246 ../svnbench/svnbench.c:130 ../svnrdump/svnrdump.c:168
+#: ../svnsync/svnsync.c:207
+msgid "deprecated; same as --trust-unknown-ca"
+msgstr "Veraltet; identisch mit --trust-unknown-ca"
+
+#: ../svn/svn.c:248 ../svnbench/svnbench.c:132 ../svnrdump/svnrdump.c:170
+#: ../svnsync/svnsync.c:209
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates from unknown certificate authorities"
+msgstr ""
+"mit --non-interactive, akzeptiert SSL Server-Zertifikate\n"
+" von unbekannten Zertifizierungsstellen"
+
+#: ../svn/svn.c:252 ../svnbench/svnbench.c:136 ../svnrdump/svnrdump.c:174
+#: ../svnsync/svnsync.c:213
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates even if the server hostname does not\n"
+" match the certificate's common name attribute"
+msgstr ""
+"mit --non-interactive, akzeptiert SSL Server-Zertifikate\n"
+" auch falls der Hostname nicht mit dem Common\n"
+" Name Attribut im Zertifikat übereinstimmt"
+
+#: ../svn/svn.c:258 ../svnbench/svnbench.c:142 ../svnrdump/svnrdump.c:180
+#: ../svnsync/svnsync.c:219
msgid ""
-"accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but only\n"
-" with '--non-interactive')"
+"with --non-interactive, accept expired SSL server\n"
+" certificates"
msgstr ""
-"akzeptiert SSL-Zertifikate von unbekannten\n"
-" Ausstellern ohne Nachfrage (aber nur\n"
-" mit »--non-interactive«)"
+"mit --non-interactive, akzeptiert SSL Server-Zertifikate\n"
+" die abgelaufen sind"
-#: ../svn/svn.c:235 ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:180
+#: ../svn/svn.c:262 ../svnbench/svnbench.c:146 ../svnrdump/svnrdump.c:184
+#: ../svnsync/svnsync.c:223
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates from the future"
+msgstr ""
+"mit --non-interactive, akzeptiert SSL Server-Zertifikate\n"
+" die noch nicht gültig sind"
+
+#: ../svn/svn.c:266 ../svnbench/svnbench.c:150 ../svnrdump/svnrdump.c:188
+#: ../svnsync/svnsync.c:227
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates with failures other than the above"
+msgstr ""
+"mit --non-interactive, akzeptiert SSL Server-Zertifikate\n"
+" mit anderen als den vorherigen Fehlern"
+
+#: ../svn/svn.c:270 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:189
msgid ""
"do no interactive prompting (default is to prompt\n"
" only if standard input is a terminal device)"
@@ -10309,7 +11561,7 @@ msgstr ""
"verhindert interaktive Nachfragen (Standard sind Nachfragen\n"
" nur wenn die Standardeingabe ein Terminal ist)"
-#: ../svn/svn.c:239 ../svnrdump/svnrdump.c:136 ../svnsync/svnsync.c:184
+#: ../svn/svn.c:274 ../svnrdump/svnrdump.c:150 ../svnsync/svnsync.c:193
msgid ""
"do interactive prompting even if standard input\n"
" is not a terminal device"
@@ -10317,56 +11569,57 @@ msgstr ""
"erzwingt interaktive Nachfragen auch wenn die\n"
" Standardeingabe kein Terminal ist"
-#: ../svn/svn.c:243
+#: ../svn/svn.c:278
msgid "try operation but make no changes"
msgstr "Operation testen, aber keine Änderungen durchführen"
-#: ../svn/svn.c:245
+#: ../svn/svn.c:280
msgid "disable merge tracking; diff nodes as if related"
msgstr "deaktiviert Zusammenführungsverfolgung; erzeugt Unterschiede als ob Knoten verwandt wären"
-#: ../svn/svn.c:247
+#: ../svn/svn.c:282
msgid "ignore externals definitions"
msgstr "»svn:externals«-Definitionen ignorieren"
-#: ../svn/svn.c:248
+#: ../svn/svn.c:283
msgid "use ARG as merge command"
msgstr "PAR als Konflikteditor verwenden"
-#: ../svn/svn.c:249
+#: ../svn/svn.c:284
msgid "use ARG as external editor"
msgstr "PAR als externen Editor verwenden"
-#: ../svn/svn.c:251
+#: ../svn/svn.c:286
msgid "merge only mergeinfo differences"
msgstr "Führt nur Unterschiede in den Zusammenführungsinformationen zusammen"
-#: ../svn/svn.c:252
+#: ../svn/svn.c:287
msgid "use ARG as the older target"
msgstr "PAR als älteres Ziel verwenden"
-#: ../svn/svn.c:253
+#: ../svn/svn.c:288
msgid "use ARG as the newer target"
msgstr "PAR als neueres Ziel verwenden"
-#: ../svn/svn.c:255
+#: ../svn/svn.c:290
msgid "operate on a revision property (use with -r)"
msgstr ""
"auf einer Revisionseigenschaft arbeiten (mit -r\n"
" verwenden)"
-#: ../svn/svn.c:256
+#: ../svn/svn.c:291
msgid "relocate via URL-rewriting"
msgstr "durch Umschreiben der URL umplatzieren"
-#: ../svn/svn.c:258 ../svnadmin/svnadmin.c:256 ../svnrdump/svnrdump.c:126
-#: ../svnsync/svnsync.c:212
+#: ../svn/svn.c:293 ../svnadmin/svnadmin.c:280 ../svnbench/svnbench.c:156
+#: ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:239
msgid "read user configuration files from directory ARG"
msgstr ""
"Benutzerkonfigurationsdateien aus dem Verzeichnis\n"
" PAR lesen"
-#: ../svn/svn.c:260 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:214
+#: ../svn/svn.c:295 ../svnbench/svnbench.c:158 ../svnrdump/svnrdump.c:160
+#: ../svnsync/svnsync.c:241
msgid ""
"set user configuration option in the format:\n"
" FILE:SECTION:OPTION=[VALUE]\n"
@@ -10378,15 +11631,15 @@ msgstr ""
" Zum Beispiel:\n"
" servers:global:http-library=serf"
-#: ../svn/svn.c:267
+#: ../svn/svn.c:302
msgid "enable automatic properties"
msgstr "automatische Eigenschaften einschalten"
-#: ../svn/svn.c:268
+#: ../svn/svn.c:303
msgid "disable automatic properties"
msgstr "automatische Eigenschaften ausschalten"
-#: ../svn/svn.c:270
+#: ../svn/svn.c:305
msgid ""
"use a different EOL marker than the standard\n"
" system marker for files with the svn:eol-style\n"
@@ -10398,40 +11651,40 @@ msgstr ""
" »svn:eol-style native«.\n"
" PAR kann »LF«, »CR« oder »CRLF« sein."
-#: ../svn/svn.c:277
+#: ../svn/svn.c:312 ../svnbench/svnbench.c:165
msgid "maximum number of log entries"
msgstr "maximale Anzahl Logeinträge"
-#: ../svn/svn.c:278
+#: ../svn/svn.c:313
msgid "don't unlock the targets"
msgstr "Ziele nicht freigeben"
# CHECKME
-#: ../svn/svn.c:279
+#: ../svn/svn.c:314
msgid "remove changelist association"
msgstr "Bezug zur Änderungsliste entfernen"
-#: ../svn/svn.c:281
+#: ../svn/svn.c:316
msgid "operate only on members of changelist ARG"
msgstr "nur auf Elementen der Änderungsliste PAR operieren"
-#: ../svn/svn.c:283
+#: ../svn/svn.c:318
msgid "don't delete changelists after commit"
msgstr "Änderungslisten nach Übertragung nicht löschen"
-#: ../svn/svn.c:284
+#: ../svn/svn.c:319
msgid "keep path in working copy"
msgstr "Pfad in Arbeitskopie beibehalten"
-#: ../svn/svn.c:286
+#: ../svn/svn.c:321 ../svnbench/svnbench.c:167
msgid "retrieve all revision properties"
msgstr "alle Revisionseigenschaften abfragen"
-#: ../svn/svn.c:288
+#: ../svn/svn.c:323 ../svnbench/svnbench.c:169
msgid "retrieve no revision properties"
msgstr "keine Revisionseigenschaften abfragen"
-#: ../svn/svn.c:290
+#: ../svn/svn.c:325 ../svnbench/svnbench.c:171
msgid ""
"set revision property ARG in new revision\n"
" using the name[=value] format"
@@ -10439,11 +11692,11 @@ msgstr ""
"Revisionseigenschaft PAR in neuer Revision\n"
" unter Verwendung des Formats name[=Wert] setzen"
-#: ../svn/svn.c:293
+#: ../svn/svn.c:328
msgid "make intermediate directories"
msgstr "Zwischenverzeichnisse erzeugen"
-#: ../svn/svn.c:295
+#: ../svn/svn.c:330 ../svnbench/svnbench.c:175
msgid ""
"use/display additional information from merge\n"
" history"
@@ -10451,7 +11704,7 @@ msgstr ""
"verwendet und zeigt zusätzliche Informationen aus der\n"
" Zusammenführungsgeschichte an"
-#: ../svn/svn.c:299
+#: ../svn/svn.c:334
msgid ""
"specify automatic conflict resolution action\n"
" ('postpone', 'working', 'base', 'mine-conflict',\n"
@@ -10465,7 +11718,7 @@ msgstr ""
" »edit«, »launch«)\n"
" (kurz: »p«, »mc«, »tc«, »mf«, »tf«, »e«, »l«)"
-#: ../svn/svn.c:310
+#: ../svn/svn.c:345
msgid ""
"specify which collection of revisions to display\n"
" ('merged', 'eligible')"
@@ -10473,11 +11726,11 @@ msgstr ""
"gibt anzuzeigende Menge der Revisionen an\n"
" (»merged«, »eligible«)"
-#: ../svn/svn.c:314
+#: ../svn/svn.c:349
msgid "deprecated"
msgstr "veraltet"
-#: ../svn/svn.c:316
+#: ../svn/svn.c:351
msgid ""
"number of leading path components to strip from\n"
" paths parsed from the patch file. --strip 0\n"
@@ -10496,65 +11749,65 @@ msgstr ""
" Das erwartete Trennzeichen für Pfadkomponenten ist »/« auf\n"
" allen Plattformen. Ein einleitendes »/« zählt als eine Komponente."
-#: ../svn/svn.c:332
+#: ../svn/svn.c:367
msgid "don't expand keywords"
msgstr "Schlüsselwörter nicht expandieren"
-#: ../svn/svn.c:334
+#: ../svn/svn.c:369
msgid "apply the unidiff in reverse"
msgstr "Wendet Unidiff rückwärts an"
-#: ../svn/svn.c:336
+#: ../svn/svn.c:371
msgid "ignore whitespace during pattern matching"
msgstr "Ignoriert während des Mustervergleichs Leerzeichen, Tabulatoren und andere nicht druckbare Zeichen"
-#: ../svn/svn.c:337
+#: ../svn/svn.c:372
msgid "produce diff output"
msgstr "Erzeugt Ausgabe von Unterschieden"
#. maps to show_diff
#. diff options
-#: ../svn/svn.c:339 ../svnlook/svnlook.c:138
+#: ../svn/svn.c:374 ../svnlook/svnlook.c:139
msgid "use ARG as diff command"
msgstr "PAR als Vergleichsprogramm verwenden"
-#: ../svn/svn.c:341
+#: ../svn/svn.c:376
msgid "override diff-cmd specified in config file"
msgstr "Setzt in den Einstellungen angegebenes »diff-cmd« außer Kraft"
-#: ../svn/svn.c:343 ../svnlook/svnlook.c:132
+#: ../svn/svn.c:378 ../svnlook/svnlook.c:133
msgid "do not print differences for added files"
msgstr "Keine Unterschiede für hinzugefügte Dateien ausgeben"
-#: ../svn/svn.c:345 ../svnlook/svnlook.c:135
+#: ../svn/svn.c:380 ../svnlook/svnlook.c:136
msgid "do not print differences for deleted files"
msgstr "keine Unterschiede für gelöschte Dateien ausgeben"
-#: ../svn/svn.c:347
+#: ../svn/svn.c:382
msgid "don't diff copied or moved files with their source"
msgstr "Gibt kopierte oder verschobene Dateien nicht als Unterschied zu ihrer Quelle aus"
-#: ../svn/svn.c:349
+#: ../svn/svn.c:384
msgid "diff unrelated nodes as delete and add"
msgstr "Gibt nicht verwandte Knoten als Löschungen und Hinzufügung aus"
-#: ../svn/svn.c:350
+#: ../svn/svn.c:385
msgid "show a summary of the results"
msgstr "Zeige eine Zusammenfassung der Ergebnisse"
-#: ../svn/svn.c:352
+#: ../svn/svn.c:387
msgid "use git's extended diff format"
msgstr "Erweitertes Format von git verwenden"
-#: ../svn/svn.c:354 ../svnlook/svnlook.c:141
+#: ../svn/svn.c:389 ../svnlook/svnlook.c:142
msgid "ignore properties during the operation"
msgstr "Während des Vorgangs Eigenschaften ignorieren"
-#: ../svn/svn.c:356 ../svnlook/svnlook.c:144
+#: ../svn/svn.c:391 ../svnlook/svnlook.c:145
msgid "show only properties during the operation"
msgstr "Während des Vorgangs nur Eigenschaften anzeigen"
-#: ../svn/svn.c:358
+#: ../svn/svn.c:393
msgid ""
"generate diff suitable for generic third-party\n"
" patch tools; currently the same as\n"
@@ -10564,7 +11817,7 @@ msgstr ""
" Werkzeuge von Drittanbietern eignen; momentan identisch\n"
" mit --show-copies-as-adds --ignore-properties"
-#: ../svn/svn.c:366
+#: ../svn/svn.c:401
msgid ""
"Allow operation on mixed-revision working copy.\n"
" Use of this option is not recommended!\n"
@@ -10574,29 +11827,59 @@ msgstr ""
" Wie Verwendung dieser Option wird nicht empfohlen!\n"
" Führen Sie stattdessen »svn update« aus."
-#: ../svn/svn.c:372
+#: ../svn/svn.c:407
msgid ""
-"Also commit file and dir externals reached by\n"
-" recursion. This does not include externals with a\n"
-" fixed revision. (See the svn:externals property)"
+"also operate on externals defined by\n"
+" svn:externals properties"
msgstr ""
-"Überträgt auch externe Verweise auf Dateien und Verzeichnisse, die durch\n"
-" Rekursion erreicht werden. Dies schließt externe Verweise\n"
-" mit fixen Revisionen aus. (siehe Eigenschaft »svn:externals«)"
+"Arbeitet auch auf externen Verweisen\n"
+" (»svn:externals« Eigenschaften)"
-#: ../svn/svn.c:378
+#: ../svn/svn.c:411
msgid "retrieve target's inherited properties"
msgstr "Geerbte Eigenschaften des Ziels abfragen"
-#: ../svn/svn.c:380
+#: ../svn/svn.c:413
msgid "use ARG as search pattern (glob syntax)"
msgstr "PAR als Suchmuster verwenden (mit Platzhaltern)"
-#: ../svn/svn.c:382
+#: ../svn/svn.c:415
msgid "combine ARG with the previous search pattern"
msgstr "PAR mit dem vorherigen Suchmuster kombinieren"
-#: ../svn/svn.c:430
+#: ../svn/svn.c:417
+msgid "show revision log message, author and date"
+msgstr "Zeigt Logmeldung, Author und Datum der Revision an"
+
+#: ../svn/svn.c:419
+msgid "remove unversioned items"
+msgstr "Entfernt nicht versionierte Objekte"
+
+#: ../svn/svn.c:420
+msgid "remove ignored items"
+msgstr "Entfernt ignorierte Objekte"
+
+#: ../svn/svn.c:421 ../svnlook/svnlook.c:148 ../svnversion/svnversion.c:140
+msgid "do not output the trailing newline"
+msgstr "Gibt den anhängenden Zeilenumbruch nicht aus"
+
+#: ../svn/svn.c:422
+msgid "show cached passwords"
+msgstr "Zeigt gespeicherte Passwörter an"
+
+#: ../svn/svn.c:424
+msgid ""
+"pin externals with no explicit revision to their\n"
+" current revision (recommended when tagging)"
+msgstr ""
+"Legt externe Verweise ohne ausgewiesene Revision\n"
+" auf aktuelle Revision fest (Empfohlen für Tags)"
+
+#: ../svn/svn.c:428
+msgid "print only the item identified by ARG"
+msgstr "Gibt nur das mit PAR angegebene Element aus"
+
+#: ../svn/svn.c:479
msgid ""
"Put files and directories under version control, scheduling\n"
"them for addition to repository. They will be added in next commit.\n"
@@ -10607,26 +11890,110 @@ msgstr ""
"Das tatsächliche Hinzufügen findet erst beim nächsten Übertragen statt.\n"
"Aufruf: add PFAD...\n"
-#: ../svn/svn.c:435
+#: ../svn/svn.c:484
msgid "add intermediate parents"
msgstr "direkte Eltern hinzufügen"
-#: ../svn/svn.c:438
+# Asked ML for clarification.
+# Mattern matches AND or OR?
+# Case sensitive or case in-sensitive?
+# What about fingerprints?
+#: ../svn/svn.c:487
+msgid ""
+"Manage cached authentication credentials.\n"
+"usage: 1. svn auth [PATTERN ...]\n"
+"usage: 2. svn auth --remove PATTERN [PATTERN ...]\n"
+"\n"
+" With no arguments, list all cached authentication credentials.\n"
+" Authentication credentials include usernames, passwords,\n"
+" SSL certificates, and SSL client-certificate passphrases.\n"
+" If PATTERN is specified, only list credentials with attributes matching one\n"
+" or more patterns. With the --remove option, remove cached authentication\n"
+" credentials matching one or more patterns.\n"
+"\n"
+" If more than one pattern is specified credentials are considered only they\n"
+" match all specified patterns. Patterns are matched case-sensitively and may\n"
+" contain glob wildcards:\n"
+" ? matches any single character\n"
+" * matches a sequence of arbitrary characters\n"
+" [abc] matches any of the characters listed inside the brackets\n"
+" Note that wildcards will usually need to be quoted or escaped on the\n"
+" command line because many command shells will interfere by trying to\n"
+" expand them.\n"
+msgstr ""
+"Verwaltet gespeicherte Zugangsdaten.\n"
+"Aufruf: 1. svn auth [MUSTER ...]\n"
+"Aufruf: 2. svn auth --remove MUSTER [MUSTER ...]\n"
+"\n"
+" Listet ohne Argumente alle gespeicherten Zugangsdaten auf.\n"
+" Dies beinhaltet Benutzernamen, Passwörter, SSL-Zertifikate\n"
+" und Passphrasen für SSL-Client-Zertifikate.\n"
+" Gibt mit angegebener MUSTER nur die Zugangsdaten aus, deren\n"
+" Attribute mit einem oder mehreren Mustern übereinstimmen.\n"
+" Die Option --remove entfernt gespeicherte Zugangsdaten, die\n"
+" einem oder mehreren Mustern entsprechen.\n"
+"\n"
+" Ist mehr als ein Muster angegeben ist, werden nur solche\n"
+" Zugangsdaten beachtet, die allen Mustern entsprechen. Muster\n"
+" unterscheiden Groß- und Kleinschreibung und können folgende Platz-\n"
+" halter enthalten:\n"
+" ? entspricht einem einzelnen Zeichen\n"
+" * entspricht einer Anzahl von beliebigen Zeichen\n"
+" [abc] entspricht einem der Zeichen innerhalb der Klammer\n"
+" Platzhalter müssen in den meisten Fällen in der Kommandozeile mit\n"
+" Anführungszeichen oder Escape-Zeichen angegeben werden, damit sie\n"
+" nicht von der Befehlsumgebung als Dateimuster interpretiert werden.\n"
+"\n"
+
+#: ../svn/svn.c:508
+msgid "remove matching authentication credentials"
+msgstr "entfernt passende Zugangsdaten"
+
+#: ../svn/svn.c:513
msgid ""
-"Output the content of specified files or\n"
-"URLs with revision and author information in-line.\n"
-"usage: blame TARGET[@REV]...\n"
+"Show when each line of a file was last (or\n"
+"next) changed.\n"
+"usage: blame [-rM:N] TARGET[@REV]...\n"
+"\n"
+" Annotate each line of a file with the revision number and author of the\n"
+" last change (or optionally the next change) to that line.\n"
+"\n"
+" With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the last revision at or before rN that changed or added the line,\n"
+" looking back no further than rM.\n"
+"\n"
+" With a reverse revision range '-r M:N' where M > N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the next revision after rN that changed or deleted the line,\n"
+" looking forward no further than rM.\n"
"\n"
" If specified, REV determines in which revision the target is first\n"
" looked up.\n"
+"\n"
+" Write the annotated result to standard output.\n"
msgstr ""
-"Gibt den Inhalt der angegebenen Dateien oder URLs mit\n"
-"den Revisions- und Autoreninformationen für jede Zeile aus.\n"
-"Aufruf: blame ZIEL[@REV]...\n"
+"Gibt für jede Zeile einer Datei die letzte (oder\n"
+"nächste) Änderung aus.\n"
+"Aufruf: blame [-rM:N] ZIEL[@REV]...\n"
+"\n"
+" Kommentiert jede Zeile einer Datei mit Revisionsnummer und Autor der\n"
+" letzten Änderung (optional der nächsten Änderung) dieser Zeile.\n"
+"\n"
+" Kommentiert ohne angegebenen Revisionsbereich (dann wie -r0:REV),\n"
+" oder mit »-r M:N« mit M < N, jede in Revision N vorhandene Zeile der Datei\n"
+" mit der letzten Revision rN oder davor die diese Zeile änderte oder hinzufügte,\n"
+" und blick dabei nicht weiter als rM zurück.\n"
+"\n"
+" Kommentiert mit einem umgekehrten Revisionsbereich »-rM:N« mit M > N,\n"
+" jede in Revision N vorhandene Zeile der Datei mit der nächsten Revision nach rN\n"
+" die diese Zeile ändert oder entfernt, und blick dabei nicht weiter als rM.\n"
"\n"
" Falls angegeben, bestimmt REV, in welcher Revision zuerst nachgeschaut wird.\n"
+"\n"
+" Gibt das kommentierte Ergebnis auf der Standardausgabe aus.\n"
-#: ../svn/svn.c:447
+#: ../svn/svn.c:537
msgid ""
"Output the content of specified files or URLs.\n"
"usage: cat TARGET[@REV]...\n"
@@ -10639,7 +12006,7 @@ msgstr ""
"\n"
" Falls angegeben, bestimmt REV, in welcher Revision zuerst nachgeschaut wird.\n"
-#: ../svn/svn.c:455
+#: ../svn/svn.c:545
msgid ""
"Associate (or dissociate) changelist CLNAME with the named files.\n"
"usage: 1. changelist CLNAME PATH...\n"
@@ -10650,7 +12017,7 @@ msgstr ""
"Aufruf: 1. changelist CLNAME PFAD...\n"
" 2. changelist --remove PFAD...\n"
-#: ../svn/svn.c:461
+#: ../svn/svn.c:551
msgid ""
"Check out a working copy from a repository.\n"
"usage: checkout URL[@REV]... [PATH]\n"
@@ -10700,21 +12067,29 @@ msgstr ""
" Siehe auch »svn help update« für eine Liste möglicher Buchstaben,\n"
" die die durchgeführte Aktion beschreiben.\n"
-#: ../svn/svn.c:488
+#: ../svn/svn.c:578
msgid ""
"Recursively clean up the working copy, removing write locks, resuming\n"
"unfinished operations, etc.\n"
"usage: cleanup [WCPATH...]\n"
"\n"
-" Finish any unfinished business in the working copy at WCPATH, and remove\n"
-" write locks (shown as 'L' by the 'svn status' command) from the working\n"
-" copy. Usually, this is only necessary if a Subversion client has crashed\n"
-" while using the working copy, leaving it in an unusable state.\n"
+" By default, finish any unfinished business in the working copy at WCPATH,\n"
+" and remove write locks (shown as 'L' by the 'svn status' command) from\n"
+" the working copy. Usually, this is only necessary if a Subversion client\n"
+" has crashed while using the working copy, leaving it in an unusable state.\n"
"\n"
" WARNING: There is no mechanism that will protect write locks still\n"
" being used by other Subversion clients. Running this command\n"
" while another client is using the working copy can corrupt\n"
" the working copy beyond repair!\n"
+"\n"
+" If the --remove-unversioned option or the --remove-ignored option\n"
+" is given, remove any unversioned or ignored items within WCPATH.\n"
+" To prevent accidental working copy corruption, unversioned or ignored\n"
+" items can only be removed if the working copy is not already locked\n"
+" for writing by another Subversion client.\n"
+" Note that the 'svn status' command shows unversioned items as '?',\n"
+" and ignored items as 'I' if the --no-ignore option is given to it.\n"
msgstr ""
"Räumt eine Arbeitskopie rekursiv auf, entfernt Schreibsperren, führt nicht\n"
"beendete Operationen zu Ende usw.\n"
@@ -10730,8 +12105,17 @@ msgstr ""
" sperren anderer Subversion-Clients schützt. Die Ausführung dieses\n"
" Kommandos während des Zugriffs eines anderen Clients auf die\n"
" Arbeitskopie kann diese irreparabel beschädigen!\n"
+"\n"
+" Wenn die Optionen --remove-unversioned oder --remove-ignored gegeben\n"
+" sind, werden nicht versionierte bzw. ignorierte Objekte in AKPFAD entfernt.\n"
+" Um unbeabsichtigte Beschädigungen der Arbeitskopie zu vermeiden,\n"
+" können nicht versionierte bzw. ignorierte Objekte nur entfernt werden, wenn\n"
+" die Arbeitskopie nicht schon von einem anderen Subversion-Client zum\n"
+" Schreiben gesperrt wurde.\n"
+" »svn status« zeigt nicht versionierte Objekte als »?« an, sowie ignorierte\n"
+" Objekte mit »I«, wenn die Option --no-ignore verwendet wird.\n"
-#: ../svn/svn.c:504
+#: ../svn/svn.c:603
msgid ""
"Send changes from your working copy to the repository.\n"
"usage: commit [PATH...]\n"
@@ -10740,17 +12124,26 @@ msgid ""
" given by a --message or --file option, an editor will be started.\n"
" If any targets are (or contain) locked items, those will be\n"
" unlocked after a successful commit.\n"
+"\n"
+" If --include-externals is given, also commit file and directory\n"
+" externals reached by recursion. Do not commit externals with a\n"
+" fixed revision.\n"
msgstr ""
"Überträgt Änderungen Ihrer Arbeitskopie ins Projektarchiv.\n"
"Aufruf: commit [PFAD...]\n"
"\n"
-" Eine Logmeldung muss angegeben werden; diese kann jedoch leer sein. Wird\n"
-" sie nicht mittels einer --message- oder --file-Option übergeben, wird ein\n"
-" Editor gestartet.\n"
+" Eine Logmeldung muss angegeben werden; diese kann jedoch leer sein.\n"
+" Wird sie nicht mittels einer --message- oder --file-Option übergeben, wird\n"
+" ein Editor gestartet.\n"
" Falls Objekte gesperrt sind oder gesperrte Objekte enthalten, werden diese\n"
" nach einer erfolgreichen Ãœbertragung entsperrt.\n"
+"\n"
+" Wenn --include-externals angegeben wird, werden auch Dateien und\n"
+" Verzeichnisse in externen Verweisen übertragen, die durch Rekursion\n"
+" erreicht werden. Ãœbertragen Sie keine externen Verweise mit einer\n"
+" festgelegten Revision.\n"
-#: ../svn/svn.c:515
+#: ../svn/svn.c:618
msgid ""
"Copy files and directories in a working copy or repository.\n"
"usage: copy SRC[@REV]... DST\n"
@@ -10790,7 +12183,7 @@ msgstr ""
" standardmäßig nicht in der Lage sein, Zusammenführungsinformationen\n"
" von der Quelle der Kopie in das Ziel weiterzureichen.\n"
-#: ../svn/svn.c:534
+#: ../svn/svn.c:638
msgid ""
"Remove files and directories from version control.\n"
"usage: 1. delete PATH...\n"
@@ -10821,7 +12214,7 @@ msgstr ""
" 2. Jedes mit einer URL angegebene Element wird mittels sofortiger\n"
" Ãœbertragung aus dem Projektarchiv entfernt.\n"
-#: ../svn/svn.c:550
+#: ../svn/svn.c:654
msgid ""
"Display local changes or differences between two revisions or paths.\n"
"usage: 1. diff\n"
@@ -10898,7 +12291,7 @@ msgstr ""
" 5. Kurzform für »svn diff --old=URL-ALT[@REVALT] --new=URL-NEU[@REVNEU]«\n"
" 6. Kurzform für »svn diff --old=URL-ALT[@REVALT] --new=URL-NEU[@REVNEU]«\n"
-#: ../svn/svn.c:591
+#: ../svn/svn.c:695
msgid ""
"Create an unversioned copy of a tree.\n"
"usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -10937,7 +12330,7 @@ msgstr ""
"\n"
" PEGREV gibt an, in welcher Revision das Ziel zuerst gesucht wird.\n"
-#: ../svn/svn.c:613
+#: ../svn/svn.c:717 ../svnbench/svnbench.c:217
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: help [SUBCOMMAND...]\n"
@@ -10945,7 +12338,7 @@ msgstr ""
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
"Aufruf: help [UNTERBEFEHL...]\n"
-#: ../svn/svn.c:619
+#: ../svn/svn.c:723
msgid ""
"Commit an unversioned file or tree into the repository.\n"
"usage: import [PATH] URL\n"
@@ -10970,7 +12363,7 @@ msgstr ""
" Nichtversionierbare Elemente wie Gerätedateien und Pipes werden ignoriert,\n"
" falls --force angegeben wird.\n"
-#: ../svn/svn.c:633
+#: ../svn/svn.c:737
msgid ""
"Display information about a local or remote item.\n"
"usage: info [TARGET[@REV]...]\n"
@@ -10978,20 +12371,47 @@ msgid ""
" Print information about each TARGET (default: '.').\n"
" TARGET may be either a working-copy path or URL. If specified, REV\n"
" determines in which revision the target is first looked up.\n"
+"\n"
+" With --show-item, print only the value of one item of information\n"
+" about TARGET. One of the following items can be selected:\n"
+" kind the kind of TARGET\n"
+" url the URL of TARGET in the repository\n"
+" relative-url the repository-relative URL\n"
+" repos-root-url the repository root URL\n"
+" repos-uuid the repository UUID\n"
+" revision the revision of TARGET (defaults to BASE\n"
+" for working copy paths and HEAD for URLs)\n"
+" last-changed-revision the most recent revision in which TARGET\n"
+" was changed\n"
+" last-changed-date the date of the last-changed revision\n"
+" last-changed-author the author of the last-changed revision\n"
+" wc-root the root of TARGET's working copy"
msgstr ""
-"Zeigt Informationen über ein lokales oder auf dem Server befindliches\n"
-"Objekt an.\n"
+"Gibt Informationen über ein lokales oder entferntes Element aus.\n"
"Aufruf: info [ZIEL[@REV]...]\n"
"\n"
" Gibt Informationen über jedes ZIEL aus (Vorgabe: ».«).\n"
-" ZIEL kann entweder ein Pfad einer Arbeitskopie oder eine URL sein. Wenn\n"
-" angegeben, bestimmt REV, in welcher Revision zuerst nach dem Ziel gesucht\n"
-" wird.\n"
+" ZIEL kann entweder ein Pfad in einer Arbeitskopie oder eine URL sein. Falls\n"
+" angegeben, bestimmt REV, in welcher Revision zuerst nachgeschaut wird.\n"
+"\n"
+" Gibt mit »--show-item« nur den Wert eines Informationsfeldes von ZIEL aus.\n"
+" Eines dieser Felder kann gewählt werden:\n"
+" kind Art des ZIELs\n"
+" url URL des ZIELs im Projektarchiv\n"
+" relative-url URL relativ zum Projektarchiv\n"
+" repos-root-url Wurzel-URL des Projektarchivs\n"
+" repos-uuid UUID des Projektarchivs\n"
+" revision Die Revision von ZIEL (Immer BASE für\n"
+" Pfade in der Arbeitskopie und HEAD für eine URL)\n"
+" last-changed-revision Letzte Revision in der ZIEL geändert wurde\n"
+" last-changed-date Datum der Revision mit der letzten Änderung\n"
+" last-changed-author Autor der Revision mit der letzten Änderung\n"
+" wc-root Wurzel der Arbeitskopie, die ZIEL enthält"
# FIXME: "looked up" ist überall leicht unterschiedlich übersetzt
# Ich (Jens) bevorzuge "gesucht" statt "nachgeschlagen" oder "durchsucht", "nachgeschaut"
# FIXME: Standardsätze sollten eigene msgid haben!
-#: ../svn/svn.c:643
+#: ../svn/svn.c:763
msgid ""
"List directory entries in the repository.\n"
"usage: list [TARGET[@REV]...]\n"
@@ -11031,11 +12451,7 @@ msgstr ""
" Größe (in Bytes)\n"
" Datum und Zeit der letzten Ãœbertragung\n"
-#: ../svn/svn.c:663
-msgid "include externals definitions"
-msgstr "»svn:externals«-Definitionen einbeziehen"
-
-#: ../svn/svn.c:666
+#: ../svn/svn.c:785
msgid ""
"Lock working copy paths or URLs in the repository, so that\n"
"no other user can commit changes to them.\n"
@@ -11049,21 +12465,21 @@ msgstr ""
"\n"
" Benutze --force, um eine bereits vorhandene Sperre zu stehlen.\n"
-#: ../svn/svn.c:672
+#: ../svn/svn.c:791
msgid "read lock comment from file ARG"
msgstr "Sperrkommentar aus Datei PAR lesen"
-#: ../svn/svn.c:673
+#: ../svn/svn.c:792
msgid "specify lock comment ARG"
msgstr "PAR als Sperrkommentar verwenden"
-#: ../svn/svn.c:674
+#: ../svn/svn.c:793
msgid "force validity of lock comment source"
msgstr ""
"Gültigkeit der Quelle für die Sperrmeldung\n"
" erzwingen"
-#: ../svn/svn.c:677
+#: ../svn/svn.c:796
msgid ""
"Show the log messages for a set of revision(s) and/or path(s).\n"
"usage: 1. log [PATH][@REV]\n"
@@ -11214,18 +12630,26 @@ msgstr ""
" Ausgabe der Logmeldung für die Revision die »/branches/zweig» erzeugte:\n"
" svn log --stop-on-copy --limit 1 -r0:HEAD ^/branches/zweig\n"
-#: ../svn/svn.c:755
+#: ../svn/svn.c:874 ../svnbench/svnbench.c:286
msgid "retrieve revision property ARG"
msgstr "Revisionseigenschaft PAR abfragen"
-#: ../svn/svn.c:756
+#: ../svn/svn.c:875 ../svnbench/svnbench.c:287
msgid "the change made in revision ARG"
msgstr "die in Revision PAR durchgeführte Änderung"
+#: ../svn/svn.c:876
+msgid "also print all affected paths"
+msgstr "gibt auch alle betroffenen Pfade aus"
+
+#: ../svn/svn.c:877
+msgid "do not print the log message"
+msgstr "gibt die Logmeldung nicht aus"
+
#. For this large section, let's keep it unindented for easier
#. * viewing/editing. It has been vim-treated with a textwidth=75 and 'gw'
#. * (with quotes and newlines removed).
-#: ../svn/svn.c:762
+#: ../svn/svn.c:883
msgid ""
"Merge changes into a working copy.\n"
"usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]\n"
@@ -11937,7 +13361,11 @@ msgstr ""
" eine Zusammenführungsverfolgung bei Zusammenführungen aus fremdem\n"
" Projektarchiven nicht unterstützt.\n"
-#: ../svn/svn.c:1094
+#: ../svn/svn.c:1213
+msgid "force deletions even if deleted contents don't match"
+msgstr "Löscht Elemente auch wenn deren Inhalt nicht übereinstimmt"
+
+#: ../svn/svn.c:1217
msgid ""
"Display merge-related information.\n"
"usage: 1. mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -11999,7 +13427,7 @@ msgstr ""
"\n"
" Die Tiefe kann »empty« oder »infinity« sein, Vorgabe ist »empty«.\n"
-#: ../svn/svn.c:1125
+#: ../svn/svn.c:1249
msgid ""
"Create a new directory under version control.\n"
"usage: 1. mkdir PATH...\n"
@@ -12031,7 +13459,7 @@ msgstr ""
" In beiden Fällen müssen alle Zwischenverzeichnisse bereits existieren,\n"
" es sei denn, die Option --parents wurde angegeben.\n"
-#: ../svn/svn.c:1142
+#: ../svn/svn.c:1266
msgid ""
"Move (rename) an item in a working copy or repository.\n"
"usage: move SRC... DST\n"
@@ -12067,7 +13495,7 @@ msgstr ""
"\n"
" Die Option »--revision« ist funktionslos und veraltet.\n"
-#: ../svn/svn.c:1164
+#: ../svn/svn.c:1288
msgid ""
"Apply a patch to a working copy.\n"
"usage: patch PATCHFILE [WCPATH]\n"
@@ -12163,7 +13591,7 @@ msgstr ""
" und aktualisieren Sie dann auf HEAD. Auf diese Weise können\n"
" Konflikte interaktiv aufgelöst werden.\n"
-#: ../svn/svn.c:1212
+#: ../svn/svn.c:1336
msgid ""
"Remove a property from files, dirs, or revisions.\n"
"usage: 1. propdel PROPNAME [PATH...]\n"
@@ -12172,6 +13600,8 @@ msgid ""
" 1. Removes versioned props in working copy.\n"
" 2. Removes unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
"Entfernt eine Eigenschaft von Dateien, Verzeichnissen oder\n"
"Revisionen.\n"
@@ -12180,8 +13610,10 @@ msgstr ""
"\n"
" 1. Entfernt eine versionierte Eigenschaft aus der Arbeitskopie.\n"
" 2. Entfernt eine nicht versionierte Eigenschaft aus dem Projektarchiv.\n"
+"\n"
+" Siehe »svn help propset« für Beschreibungen der speziellen »svn:*«-Eigenschaften.\n"
-#: ../svn/svn.c:1222
+#: ../svn/svn.c:1348
msgid ""
"Edit a property with an external editor.\n"
"usage: 1. propedit PROPNAME TARGET...\n"
@@ -12191,7 +13623,7 @@ msgid ""
" 2. Edits unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"
-" See 'svn help propset' for more on setting properties.\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
"Ändert eine Eigenschaft mit einem externen Editor.\n"
"Aufruf: 1. propedit PROPNAME ZIEL...\n"
@@ -12202,9 +13634,9 @@ msgstr ""
" 2. Bearbeitet nicht versionierte Revisionseigenschaften im Projektarchiv.\n"
" ZIEL legt nur das Projektarchiv fest, auf das zugegriffen wird.\n"
"\n"
-"Siehe »svn help propset« für Weiteres zum Setzen von Eigenschaften.\n"
+" Siehe »svn help propset« für Beschreibungen der speziellen »svn:*«-Eigenschaften.\n"
-#: ../svn/svn.c:1234
+#: ../svn/svn.c:1360
msgid ""
"Print the value of a property on files, dirs, or revisions.\n"
"usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
@@ -12221,9 +13653,11 @@ msgid ""
" 'empty', the target path is printed on the same line before each value.\n"
"\n"
" By default, an extra newline is printed after the property value so that\n"
-" the output looks pretty. With a single TARGET and depth 'empty', you can\n"
-" use the --strict option to disable this (useful when redirecting a binary\n"
-" property value to a file, for example).\n"
+" the output looks pretty. With a single TARGET, depth 'empty' and without\n"
+" --show-inherited-props, you can use the --no-newline option to disable this\n"
+" (useful when redirecting a binary property value to a file, for example).\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
"Gibt den Eigenschaftswert von Dateien, Verzeichnissen oder Revisionen aus.\n"
"Aufruf: 1. propget PROPNAME [ZIEL[@REV]...]\n"
@@ -12241,19 +13675,22 @@ msgstr ""
"\n"
" Standardmäßig hängt dieser Unterbefehl eine Leerzeile an das Ende der\n"
" Eigenschaftswerte an, so dass die Ausgabe hübsch aussieht. Verwenden\n"
-" Sie bei einem einzigen ZIEL und der Tiefe »empty« die Option »--strict«,\n"
-" um diese Formatierungen abzuschalten. (dies ist nützlich, um einen binären\n"
-" Eigenschaftswert in eine Datei umzuleiten)\n"
+" Sie bei einem einzigen ZIEL, der Tiefe »empty« und ohne\n"
+" --show-inherited-props die Option »--no-newline« um diese Formatierungen\n"
+" abzuschalten. (dies ist z.B. nützlich, um einen binären Eigenschaftswert\n"
+" in eine Datei umzuleiten)\n"
+"\n"
+" Siehe »svn help propset« für Beschreibungen der speziellen »svn:*«-Eigenschaften.\n"
-#: ../svn/svn.c:1254 ../svn/svn.c:1271
+#: ../svn/svn.c:1382 ../svn/svn.c:1401
msgid "print path, name and value on separate lines"
msgstr "Pfad, Name und Wert in getrennten Zeilen ausgeben"
-#: ../svn/svn.c:1255
-msgid "don't print an extra newline"
-msgstr "Keinen zusätzlichen Zeilenumbruch ausgeben"
+#: ../svn/svn.c:1383
+msgid "(deprecated; use --no-newline)"
+msgstr "Veraltet; siehe »--no-newline«"
-#: ../svn/svn.c:1258
+#: ../svn/svn.c:1386
msgid ""
"List all properties on files, dirs, or revisions.\n"
"usage: 1. proplist [TARGET[@REV]...]\n"
@@ -12266,6 +13703,8 @@ msgid ""
"\n"
" With --verbose, the property values are printed as well, like 'svn propget\n"
" --verbose'. With --quiet, the paths are not printed.\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
"Listet alle Eigenschaften von Dateien, Verzeichnissen oder\n"
"Revisionen auf.\n"
@@ -12279,13 +13718,15 @@ msgstr ""
"\n"
" Mit »--verbose« werden auch die Eigenschaftwerte ausgegeben,wie mit \n"
" »svn propget --verbose«. Mit »--quiet« werden Pfade nicht ausgegeben.\n"
+"\n"
+" Siehe »svn help propset« für Beschreibungen der speziellen »svn:*«-Eigenschaften.\n"
-#: ../svn/svn.c:1272
+#: ../svn/svn.c:1402
msgid "don't print the path"
msgstr "Pfad nicht ausgeben"
# FIXME: propchange?
-#: ../svn/svn.c:1275
+#: ../svn/svn.c:1405
msgid ""
"Set the value of a property on files, dirs, or revisions.\n"
"usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -12358,6 +13799,7 @@ msgid ""
" ^/ to the repository root\n"
" / to the server root\n"
" // to the URL scheme\n"
+" ^/../ to a sibling repository beneath the same SVNParentPath location\n"
" Use of the following format is discouraged but is supported for\n"
" interoperability with Subversion 1.4 and earlier clients:\n"
" LOCALPATH [-r PEG] URL\n"
@@ -12446,8 +13888,9 @@ msgstr ""
" folgenden Zeichenketten startet und...\n"
" ../ auf das übergeordnete Verzeichnis des extrahierten Externals\n"
" ^/ auf die Wurzel des Projektarchivs\n"
-" // auf das Schema\n"
" / auf die Wurzel des Servers\n"
+" // auf das Schema\n"
+" ^/../ auf ein benachbartes Projektarchiv unter dem selben SVNParentPath\n"
" verweist.\n"
" Die Verwendung des folgenden Formats ist veraltet aber für die Kompatibilität\n"
" mit Subversion 1.4 und älter weiter unterstützt:\n"
@@ -12456,11 +13899,11 @@ msgstr ""
" »relative_URL relativer_Pfad« mit Peg-Revisionsunterstützung gedeutet.\n"
" Zeilen, die mit »#« beginnen, werden ignoriert.\n"
-#: ../svn/svn.c:1354
+#: ../svn/svn.c:1485
msgid "read property value from file ARG"
msgstr "Eigenschaftswert aus Datei PAR lesen"
-#: ../svn/svn.c:1357
+#: ../svn/svn.c:1488
msgid ""
"Relocate the working copy to point to a different repository root URL.\n"
"usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
@@ -12504,7 +13947,7 @@ msgstr ""
" svn relocate http://www.example.com/repo/Projekt \\\n"
" svn://svn.example.com/repo/Projekt\n"
-#: ../svn/svn.c:1380
+#: ../svn/svn.c:1511
msgid ""
"Resolve conflicts on working copy files or directories.\n"
"usage: resolve [PATH...]\n"
@@ -12526,7 +13969,7 @@ msgstr ""
" die Konfliktlösung von PFAD in der durch PAR angegebenen Weise. Damit\n"
" arbeitet das Programm als Vorgabe nicht rekursiv. (Tiefe »empty«)\n"
-#: ../svn/svn.c:1390
+#: ../svn/svn.c:1521
msgid ""
"specify automatic conflict resolution source\n"
" ('base', 'working', 'mine-conflict',\n"
@@ -12536,7 +13979,7 @@ msgstr ""
" (»base«, »working«, »mine-conflict«,\n"
" »theirs-conflict«, »mine-full«, »theirs-full«)"
-#: ../svn/svn.c:1397
+#: ../svn/svn.c:1528
msgid ""
"Remove 'conflicted' state on working copy files or directories.\n"
"usage: resolved PATH...\n"
@@ -12556,7 +13999,7 @@ msgstr ""
" übertragen werden kann. Dies wird zugunsten von »svn resolve --accept\n"
" working« missbilligt.\n"
-#: ../svn/svn.c:1407
+#: ../svn/svn.c:1538
msgid ""
"Restore pristine working copy state (undo local changes).\n"
"usage: revert PATH...\n"
@@ -12580,7 +14023,7 @@ msgstr ""
" schon übertragenen Änderungen, siehe in »svn help merge« den\n"
" Abschnitt »undo«.\n"
-#: ../svn/svn.c:1419
+#: ../svn/svn.c:1550
msgid ""
"Print the status of working copy files and directories.\n"
"usage: status [PATH...]\n"
@@ -12611,9 +14054,9 @@ msgid ""
" another Subversion client modifying the working copy\n"
" ' ' not locked for writing\n"
" 'L' locked for writing\n"
-" Fourth column: Scheduled commit will contain addition-with-history\n"
-" ' ' no history scheduled with commit\n"
-" '+' history scheduled with commit\n"
+" Fourth column: Scheduled commit will create a copy (addition-with-history)\n"
+" ' ' no history scheduled with commit (item was newly added)\n"
+" '+' history scheduled with commit (item was copied)\n"
" Fifth column: Whether the item is switched or a file external\n"
" ' ' normal\n"
" 'S' the item has a Switched URL relative to the parent\n"
@@ -12703,10 +14146,10 @@ msgstr ""
" Dritte Spalte: Gibt an, ob die Arbeitskopie durch einen anderen Subversion-Client\n"
" zum Schreiben gesperrt wurde » « keine Schreibsperre\n"
" »L« Locked - Schreibsperre\n"
-" Vierte Spalte: Geplante Übertragung wird »Hinzufügen mit Historie«\n"
+" Vierte Spalte: Geplante Ãœbertragung wird eine Kopie mit Historie erzeugen\n"
" enthalten\n"
-" » « Übertragung wird keine Historie enthalten\n"
-" »+« Übertragung wird Historie enthalten\n"
+" » « Übertragung wird keine Historie enthalten (neues Element)\n"
+" »+« Übertragung wird Historie enthalten (Element kopiert)\n"
" Fünfte Spalte: Wurde Objekt umgestellt oder ist ein externer Dateiverweis?\n"
" » « normal\n"
" »S« das Objekt hat eine umgestellte URL relativ zu seinem Elternteil\n"
@@ -12769,11 +14212,11 @@ msgstr ""
" > lokal fehlend, eingehend editiert bei Aktualisierung\n"
" D wc/qax.c\n"
-#: ../svn/svn.c:1512
+#: ../svn/svn.c:1643
msgid "don't print unversioned items"
msgstr "Gibt nicht versioniertes Objekte nicht aus"
-#: ../svn/svn.c:1515
+#: ../svn/svn.c:1646
msgid ""
"Update the working copy to a different URL within the same repository.\n"
"usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -12856,11 +14299,15 @@ msgstr ""
" svn switch --relocate http://www.example.com/repo/Projekt \\\n"
" svn://svn.example.com/repo/Projekt\n"
-#: ../svn/svn.c:1557
+#: ../svn/svn.c:1688
msgid "allow switching to a node with no common ancestor"
msgstr "Erlaubt Umstellung auf einen Knoten ohne gemeinsamen Vorfahren"
-#: ../svn/svn.c:1561
+#: ../svn/svn.c:1690 ../svn/svn.c:1750
+msgid "handle unversioned obstructions as changes"
+msgstr "Behandelt nicht versionierte Blockierungen als Änderungen"
+
+#: ../svn/svn.c:1694
msgid ""
"Unlock working copy paths or URLs.\n"
"usage: unlock TARGET...\n"
@@ -12874,7 +14321,7 @@ msgstr ""
# Parts of the text (--force and --set-depth) are shared with the
# switch help. Keep it consistent.
-#: ../svn/svn.c:1568
+#: ../svn/svn.c:1701
msgid ""
"Bring changes from the repository into the working copy.\n"
"usage: update [PATH...]\n"
@@ -12972,7 +14419,7 @@ msgstr ""
" Arbeitskopieverzeichnisses nur erhöht werden (tiefer ineinander geschachtelt);\n"
" eine Verzeichnistiefe kann nicht reduziert werden.\n"
-#: ../svn/svn.c:1618
+#: ../svn/svn.c:1753
msgid ""
"Upgrade the metadata storage format for a working copy.\n"
"usage: upgrade [WCPATH...]\n"
@@ -12984,110 +14431,112 @@ msgstr ""
"\n"
" Lokale Änderungen bleiben erhalten.\n"
-#: ../svn/svn.c:1664 ../svnadmin/svnadmin.c:90 ../svnlook/svnlook.c:380
-#: ../svnrdump/svnrdump.c:65 ../svnsync/svnsync.c:297
+#: ../svn/svn.c:1801 ../svnadmin/svnadmin.c:97 ../svnbench/svnbench.c:338
+#: ../svnfsfs/svnfsfs.c:79 ../svnlook/svnlook.c:387 ../svnrdump/svnrdump.c:66
+#: ../svnsync/svnsync.c:332
msgid "Caught signal"
msgstr "Abbruchsignal empfangen"
-#: ../svn/svn.c:1817 ../svnlook/svnlook.c:2565
+#: ../svn/svn.c:1947 ../svnbench/svnbench.c:430 ../svnlook/svnlook.c:2571
msgid "Non-numeric limit argument given"
msgstr "Nicht-numerische Bereichsgrenze angegeben"
-#: ../svn/svn.c:1823 ../svnlook/svnlook.c:2571
+#: ../svn/svn.c:1952 ../svnbench/svnbench.c:435 ../svnlook/svnlook.c:2576
msgid "Argument to --limit must be positive"
msgstr "Parameter für --limit muss positiv sein"
-#: ../svn/svn.c:1844 ../svn/svn.c:2121
+#: ../svn/svn.c:1972 ../svn/svn.c:2247
msgid "Can't specify -c with --old"
msgstr "-c kann nicht mit --old verwendet werden"
-#: ../svn/svn.c:1875
+#: ../svn/svn.c:2002 ../svnbench/svnbench.c:471
#, c-format
msgid "Negative number in range (%s) not supported with -c"
msgstr "Negative Zahl im Bereich (%s) ist mit -c nicht unterstützt"
-#: ../svn/svn.c:1888
+#: ../svn/svn.c:2014 ../svnbench/svnbench.c:483
#, c-format
msgid "Non-numeric change argument (%s) given to -c"
msgstr "Nicht-numerischer Parameter (%s) an -c übergeben"
-#: ../svn/svn.c:1896
+#: ../svn/svn.c:2021 ../svnbench/svnbench.c:490
msgid "There is no change 0"
msgstr "Es gibt keine Änderung 0"
-#: ../svn/svn.c:1939 ../svnadmin/svnadmin.c:2037 ../svnrdump/svnrdump.c:937
-#: ../svnsync/svnsync.c:2052
+#: ../svn/svn.c:2062 ../svnadmin/svnadmin.c:2488 ../svnbench/svnbench.c:532
+#: ../svnfsfs/svnfsfs.c:331 ../svnrdump/svnrdump.c:890
+#: ../svnsync/svnsync.c:2113
#, c-format
msgid "Syntax error in revision argument '%s'"
msgstr "Syntaxfehler in Revisionsparameter »%s«"
-#: ../svn/svn.c:2005 ../svn/svn.c:2024
+#: ../svn/svn.c:2125 ../svn/svn.c:2142 ../svnbench/svnbench.c:571
#, c-format
msgid "Error converting depth from locale to UTF-8"
msgstr "Fehler beim Konvertieren der Tiefe aus Locale nach UTF-8"
-#: ../svn/svn.c:2013
+#: ../svn/svn.c:2132 ../svnbench/svnbench.c:578
#, c-format
msgid "'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
msgstr "»%s« ist keine gültige Tiefe; versuchen Sie »empty«, »files«, »immediates« oder »infinity«"
-#: ../svn/svn.c:2032
+#: ../svn/svn.c:2149
#, c-format
msgid "'%s' is not a valid depth; try 'exclude', 'empty', 'files', 'immediates', or 'infinity'"
msgstr "»%s« ist keine gültige Tiefe; versuchen Sie »exclude«, »empty«, »files«, »immediates« oder »infinity«"
-#: ../svn/svn.c:2161
+#: ../svn/svn.c:2284
#, c-format
msgid "Syntax error in native-eol argument '%s'"
msgstr "Syntaxfehler im »native-eol« Parameter »%s«"
-#: ../svn/svn.c:2181
+#: ../svn/svn.c:2302
msgid "Changelist names must not be empty"
msgstr "Namen von Änderungslisten dürfen nicht leer sein"
-#: ../svn/svn.c:2215
+#: ../svn/svn.c:2335
#, c-format
msgid "'%s' is not a valid --accept value"
msgstr "»%s« ist kein gültiger Wert für --accept"
-#: ../svn/svn.c:2223
+#: ../svn/svn.c:2343
#, c-format
msgid "'%s' is not a valid --show-revs value"
msgstr "»%s« ist kein gültiger Wert für --show-revs"
-#: ../svn/svn.c:2235
+#: ../svn/svn.c:2359
#, c-format
msgid "Invalid strip count '%s'"
msgstr "Ungültige Anzahl der zu entfernenden Komponenten »%s«"
-#: ../svn/svn.c:2241
+#: ../svn/svn.c:2365
msgid "Argument to --strip must be positive"
msgstr "Parameter für --strip muss positiv sein"
-#: ../svn/svn.c:2296 ../svnmucc/svnmucc.c:1208 ../svnrdump/svnrdump.c:993
-#: ../svnsync/svnsync.c:2096
+#: ../svn/svn.c:2441 ../svnmucc/svnmucc.c:658 ../svnrdump/svnrdump.c:962
+#: ../svnsync/svnsync.c:2170
msgid "--non-interactive and --force-interactive are mutually exclusive"
msgstr "--non-interactive und --force-interactive schließen sich gegenseitig aus"
-#: ../svn/svn.c:2350 ../svndumpfilter/svndumpfilter.c:1539
-#: ../svnlook/svnlook.c:2667
+#: ../svn/svn.c:2494 ../svnbench/svnbench.c:708
+#: ../svndumpfilter/svndumpfilter.c:1456 ../svnlook/svnlook.c:2675
#, c-format
msgid "Subcommand argument required\n"
msgstr "Unterbefehl benötigt einen Parameter\n"
-#: ../svn/svn.c:2367 ../svnadmin/svnadmin.c:2220
-#: ../svndumpfilter/svndumpfilter.c:1559 ../svnlook/svnlook.c:2686
-#: ../svnrdump/svnrdump.c:1039
+#: ../svn/svn.c:2512 ../svnadmin/svnadmin.c:2688 ../svnbench/svnbench.c:726
+#: ../svndumpfilter/svndumpfilter.c:1474 ../svnfsfs/svnfsfs.c:403
+#: ../svnlook/svnlook.c:2692 ../svnrdump/svnrdump.c:1006
#, c-format
msgid "Unknown subcommand: '%s'\n"
msgstr "Unbekannter Unterbefehl: »%s«\n"
-#: ../svn/svn.c:2376
+#: ../svn/svn.c:2521
#, c-format
msgid "Undo is done using either the 'svn revert' or the 'svn merge' command.\n"
msgstr "Undo wird mit den Befehlen »svn revert« bzw. »svn merge« durchgeführt.\n"
-#: ../svn/svn.c:2411
+#: ../svn/svn.c:2557
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -13096,95 +14545,115 @@ msgstr ""
"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
"Geben Sie »svn help %s« für Hilfe ein.\n"
-#: ../svn/svn.c:2425
+#: ../svn/svn.c:2572 ../svnbench/svnbench.c:774
msgid "Multiple revision arguments encountered; can't specify -c twice, or both -c and -r"
msgstr "Mehrere Revisionsparameter gefunden; bitte nicht zweimal -c oder gleichzeitig -r und -c angeben"
-#: ../svn/svn.c:2437
+#: ../svn/svn.c:2583
msgid "--depth and --set-depth are mutually exclusive"
msgstr "--depth und --set-depth schließen sich gegenseitig aus"
-#: ../svn/svn.c:2447
+#: ../svn/svn.c:2592 ../svnbench/svnbench.c:785
msgid "--with-all-revprops and --with-no-revprops are mutually exclusive"
msgstr "--with-all-revprops und --with-no-revprops schließen sich gegenseitig aus"
-#: ../svn/svn.c:2457
+#: ../svn/svn.c:2601 ../svnbench/svnbench.c:794
msgid "--with-revprop and --with-no-revprops are mutually exclusive"
msgstr "--with-revprop und --with-no-revprops schließen sich gegenseitig aus"
-#: ../svn/svn.c:2470
+#: ../svn/svn.c:2631
msgid "--message (-m) and --file (-F) are mutually exclusive"
msgstr "--message (-m) und --file (-F) schließen sich gegenseitig aus"
-#: ../svn/svn.c:2479 ../svnmucc/svnmucc.c:1219 ../svnrdump/svnrdump.c:1098
-#: ../svnsync/svnsync.c:2147
-msgid "--trust-server-cert requires --non-interactive"
-msgstr "--trust-server-cert erfordert --non-interactive"
+#: ../svn/svn.c:2640 ../svnbench/svnbench.c:803 ../svnmucc/svnmucc.c:669
+#: ../svnrdump/svnrdump.c:1064 ../svnsync/svnsync.c:2219
+msgid "--trust-unknown-ca requires --non-interactive"
+msgstr "--trust-unknown-ca erfordert --non-interactive"
+
+#: ../svn/svn.c:2644 ../svnbench/svnbench.c:807 ../svnmucc/svnmucc.c:673
+#: ../svnrdump/svnrdump.c:1068 ../svnsync/svnsync.c:2223
+msgid "--trust-cn-mismatch requires --non-interactive"
+msgstr "--trust-cn-mismatch erfordert --non-interactive"
+
+#: ../svn/svn.c:2648 ../svnbench/svnbench.c:811 ../svnmucc/svnmucc.c:677
+#: ../svnrdump/svnrdump.c:1072 ../svnsync/svnsync.c:2227
+msgid "--trust-expired requires --non-interactive"
+msgstr "--trust-expired erfordert --non-interactive"
+
+#: ../svn/svn.c:2652 ../svnbench/svnbench.c:815 ../svnmucc/svnmucc.c:681
+#: ../svnrdump/svnrdump.c:1076 ../svnsync/svnsync.c:2231
+msgid "--trust-not-yet-valid requires --non-interactive"
+msgstr "--trust-not-yet-valid erfordert --non-interactive"
+
+#: ../svn/svn.c:2656 ../svnbench/svnbench.c:819 ../svnmucc/svnmucc.c:685
+#: ../svnrdump/svnrdump.c:1080 ../svnsync/svnsync.c:2235
+msgid "--trust-other-failure requires --non-interactive"
+msgstr "--trust-other-failure erfordert --non-interactive"
# TODO: Duplicated message!!!!
-#: ../svn/svn.c:2489
+#: ../svn/svn.c:2665
msgid "--diff-cmd and --internal-diff are mutually exclusive"
msgstr "--diff-cmd und --internal-diff schließen sich gegenseitig aus"
-#: ../svn/svn.c:2531
+#: ../svn/svn.c:2707
msgid "--relocate and --depth are mutually exclusive"
msgstr "--relocate und --depth schließen sich gegenseitig aus"
-#: ../svn/svn.c:2539
+#: ../svn/svn.c:2714
msgid "--relocate and --non-recursive (-N) are mutually exclusive"
msgstr "--relocate und --non-recursive (-N) schließen sich gegenseitig aus"
-#: ../svn/svn.c:2661
+#: ../svn/svn.c:2833
msgid "Log message file is a versioned file; use '--force-log' to override"
msgstr "Die Datei für die Logmeldung ist versioniert; geben Sie »--force-log« an, um sie zu verwenden"
-#: ../svn/svn.c:2668
+#: ../svn/svn.c:2840
msgid "Lock comment file is a versioned file; use '--force-log' to override"
msgstr "Die Datei für den Sperrkommentar ist versioniert; geben Sie »--force-log« an, um sie zu verwenden"
-#: ../svn/svn.c:2689
+#: ../svn/svn.c:2860
msgid "The log message is a pathname (was -F intended?); use '--force-log' to override"
msgstr "Die Logmeldung ist ein Pfad (war -F gemeint?); geben Sie »--force-log« an, um sie zu verwenden"
-#: ../svn/svn.c:2696
+#: ../svn/svn.c:2867
msgid "The lock comment is a pathname (was -F intended?); use '--force-log' to override"
msgstr "Der Sperrkommentar ist ein Pfad (war -F gemeint?); geben Sie »--force-log« an, um ihn zu verwenden"
-#: ../svn/svn.c:2720
+#: ../svn/svn.c:2890
msgid "--auto-props and --no-auto-props are mutually exclusive"
msgstr "--auto-props und --no-auto-props schließen sich gegenseitig aus"
-#: ../svn/svn.c:2825 ../svn/svn.c:2832
+#: ../svn/svn.c:2999 ../svn/svn.c:3006
#, c-format
msgid "--accept=%s incompatible with --non-interactive"
msgstr "--accept=%s ist mit --non-interactive nicht kompatibel"
-#: ../svn/svn.c:2888
+#: ../svn/svn.c:3062
#, c-format
msgid "Try 'svn help %s' for more information"
msgstr "Versuchen Sie »svn help %s« für weitere Informationen"
-#: ../svn/svn.c:2894
+#: ../svn/svn.c:3068 ../svnbench/svnbench.c:968
msgid "Please see the 'svn upgrade' command"
msgstr "Siehe Kommando »svn upgrade«"
-#: ../svn/svn.c:2900 ../svnmucc/svnmucc.c:1457 ../svnrdump/svnrdump.c:1175
+#: ../svn/svn.c:3074 ../svnmucc/svnmucc.c:966 ../svnrdump/svnrdump.c:1156
msgid "Authentication failed and interactive prompting is disabled; see the --force-interactive option"
msgstr "Authentifizierung schlug fehl und interaktives Nachfragen ist deaktiviert; Siehe Option »--force-interactive«"
-#: ../svn/svn.c:2905
+#: ../svn/svn.c:3079
msgid "Reading file from standard input because of -F option; this can interfere with interactive prompting"
msgstr "Einlesen der Datei von der Standardeingabe wegen Option -F; dies kann interaktive Nachfragen stören"
-#: ../svn/svn.c:2916
+#: ../svn/svn.c:3090 ../svnbench/svnbench.c:976
msgid "Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)"
msgstr "Starten Sie »svn cleanup«, um die Sperren zu entfernen (Aufruf: »svn help cleanup« für Details)"
-#: ../svn/svn.c:2923
+#: ../svn/svn.c:3097
msgid "Another process is blocking the working copy database, or the underlying filesystem does not support file locking; if the working copy is on a network filesystem, make sure file locking has been enabled on the file server"
msgstr "Ein anderer Vorgang blockiert die Datenbank der Arbeitskopie, oder das darunterliegende Dateisystem unterstützt das Sperren von Dateien nicht; falls sich die Arbeitskopie auf einem Netzwerkdateisystem befindet, stellen Sie sicher, dass Dateisperren auf dem Dateiserver aktiviert sind"
-#: ../svn/svn.c:2936
+#: ../svn/svn.c:3110
msgid "When using svn+ssh:// URLs, keep in mind that the --username and --password options are ignored because authentication is performed by SSH, not Subversion"
msgstr "Bei der Verwendung von svn+ssh:// URLs sollte beachtet werden, dass die Optionen »--username« und »--password« ignoriert werden, da die Authentifizierung von SSH und nicht Subversion durchgeführt wird"
@@ -13212,20 +14681,16 @@ msgstr "Zusammenfassung der Aktualisierungen:\n"
msgid " Updated '%s' to r%ld.\n"
msgstr " »%s« auf r%ld aktualisiert.\n"
-#: ../svn/util.c:79
+#: ../svn/util.c:86
#, c-format
-msgid ""
-"\n"
-"Committed revision %ld%s.\n"
-msgstr ""
-"\n"
-"Revision %ld%s übertragen.\n"
+msgid "Committed revision %ld%s.\n"
+msgstr "Revision %ld%s übertragen.\n"
-#: ../svn/util.c:83
+#: ../svn/util.c:90
msgid " (the answer to life, the universe, and everything)"
msgstr " (die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest)"
-#: ../svn/util.c:92
+#: ../svn/util.c:99
#, c-format
msgid ""
"\n"
@@ -13235,49 +14700,49 @@ msgstr ""
"Warnung: %s\n"
# FIXME: s/whitespace/whitespaceS/?
-#: ../svn/util.c:133
+#: ../svn/util.c:140
msgid "The SVN_MERGE environment variable is empty or consists solely of whitespace. Expected a shell command.\n"
msgstr "Die Umgebungsvariable SVN_MERGE ist leer oder besteht nur aus Leerzeichen. Erwartete ein Shell-Kommando.\n"
-#: ../svn/util.c:139
+#: ../svn/util.c:146
msgid "The environment variable SVN_MERGE and the merge-tool-cmd run-time configuration option were not set.\n"
msgstr "Die Umgebungsvariable SVN_MERGE und die Laufzeitkonfigurationsoption merge-tool-cmd wurden nicht gesetzt.\n"
-#: ../svn/util.c:169
+#: ../svn/util.c:175
#, c-format
-msgid "The external merge tool exited with exit code %d"
-msgstr "Das externe Werkzeug zum Zusammenführen wurde mit Fehlercode %d beendet"
+msgid "The external merge tool '%s' exited with exit code %d."
+msgstr "Das externe Werkzeug zum Zusammenführen »%s« wurde mit Fehlercode %d beendet."
-#: ../svn/util.c:211
+#: ../svn/util.c:218
msgid "Log message contains a zero byte"
msgstr "Logmeldung enthält ein Null Byte"
-#: ../svn/util.c:269
+#: ../svn/util.c:278
#, c-format
msgid " '%s'"
msgstr " »%s«"
-#: ../svn/util.c:273
+#: ../svn/util.c:282
msgid "Your commit message was left in a temporary file:"
msgstr "Ihre Logmeldung wurde in einer Temporärdatei abgelegt:"
-#: ../svn/util.c:325
+#: ../svn/util.c:334
msgid "--This line, and those below, will be ignored--"
msgstr "-- Diese und die folgenden Zeilen werden ignoriert --"
-#: ../svn/util.c:360
+#: ../svn/util.c:360 ../svnmucc/svnmucc.c:423
msgid "Error normalizing log message to internal format"
msgstr "Fehler beim Normalisieren der Logmeldung ins interne Format"
-#: ../svn/util.c:447 ../svnmucc/svnmucc.c:764
+#: ../svn/util.c:449 ../svnmucc/svnmucc.c:433
msgid "Cannot invoke editor to get log message when non-interactive"
msgstr "Kann den Editor für Logmeldungen nur im interaktiven Modus aufrufen"
-#: ../svn/util.c:460
+#: ../svn/util.c:462
msgid "Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options"
msgstr "Konnte keinen externen Editor zur Eingabe der Logmeldung bestimmen. Setzten Sie entweder die $SVN_EDITOR Umgebungsvariable oder verwenden Sie die --message (-m) oder --file (-F) Optionen"
-#: ../svn/util.c:496
+#: ../svn/util.c:498
msgid ""
"\n"
"Log message unchanged or not specified\n"
@@ -13287,96 +14752,105 @@ msgstr ""
"Logmeldung unverändert oder nicht angegeben\n"
"(A)bbrechen, Weiterma(c)hen, (E)ditieren:\n"
-#: ../svn/util.c:549
+#: ../svn/util.c:551
msgid "Use --force to override this restriction (local modifications may be lost)"
msgstr "Benutzen Sie »--force«, um diese Einschränkung aufzuheben (lokale Änderungen könnten verloren gehen)"
# CHECKME! Here used beside "dir" and "file".
-#: ../svn/util.c:738 ../svn/util.c:771
+#: ../svn/util.c:740 ../svn/util.c:773
msgid "none"
msgstr "nichts"
-#: ../svn/util.c:739
+#: ../svn/util.c:741
msgid "file"
msgstr "Datei"
# dir is no English word!
-#: ../svn/util.c:740
+#: ../svn/util.c:742
msgid "dir"
msgstr "Verzeichnis"
-#: ../svn/util.c:772
+#: ../svn/util.c:774
msgid "update"
msgstr "Aktualisierung"
-#: ../svn/util.c:773
+#: ../svn/util.c:775
msgid "switch"
msgstr "Umstellung"
-#: ../svn/util.c:896
+#: ../svn/util.c:898
msgid "(invalid date)"
msgstr "(ungültiges Datum)"
-#: ../svn/util.c:1056
+#: ../svn/util.c:1058
#, c-format
msgid "svn: warning: '%s' is a binary mime-type but file '%s' looks like text; diff, merge, blame, and other operations will stop working on this file\n"
msgstr "svn: Warnung: »%s« ist ein binärer Mime-Typ, die Datei »%s« sieht aber wie Text aus; Operationen »diff« (Unterschiede anzeigen), »merge« (Unterschiede zusammenführen), »blame« (Annotieren) und andere Operationen werden auf dieser Datei nicht mehr funktionieren\n"
-#: ../svnadmin/svnadmin.c:217 ../svnrdump/svnrdump.c:120
+#: ../svnadmin/svnadmin.c:236 ../svnfsfs/svnfsfs.c:141
+#: ../svnrdump/svnrdump.c:132
msgid "specify revision number ARG (or X:Y range)"
msgstr "spezifizieren Sie PAR für Revisionsnummer (oder X:Y Bereich)"
-#: ../svnadmin/svnadmin.c:220 ../svnlook/svnlook.c:162
+#: ../svnadmin/svnadmin.c:239 ../svnlook/svnlook.c:166
msgid "specify transaction name ARG"
msgstr "Transaktionsname PAR angeben"
-#: ../svnadmin/svnadmin.c:223
+#: ../svnadmin/svnadmin.c:242
msgid "dump or hotcopy incrementally"
msgstr "Datenstrom inkrementell ausgeben oder im laufenden Betrieb inkrementell kopieren"
-#: ../svnadmin/svnadmin.c:226
+#: ../svnadmin/svnadmin.c:245
msgid "use deltas in dump output"
msgstr "Nutzt Deltas bei der Ausgabe"
-#: ../svnadmin/svnadmin.c:229
+#: ../svnadmin/svnadmin.c:248
msgid "bypass the repository hook system"
msgstr "Umgeht das Aktionssystem des Projektarchivs"
-#: ../svnadmin/svnadmin.c:232
+#: ../svnadmin/svnadmin.c:251
msgid "bypass property validation logic"
msgstr "Umgeht die Logik zur Überprüfung von Eigenschaften"
-#: ../svnadmin/svnadmin.c:235 ../svnlook/svnlook.c:193
-#: ../svnrdump/svnrdump.c:122 ../svnserve/svnserve.c:289
-#: ../svnversion/svnversion.c:143
-msgid "no progress (only errors) to stderr"
-msgstr "keine Fortschrittsanzeige (nur Fehler) auf die Standardfehlerausgabe"
+#: ../svnadmin/svnadmin.c:254
+msgid "ignore revision datestamps found in the stream"
+msgstr "Ignoriert Datumsangaben der im Datenstrom gefundenen Revisionen"
-#: ../svnadmin/svnadmin.c:238
+#: ../svnadmin/svnadmin.c:257 ../svnfsfs/svnfsfs.c:138
+msgid "no progress (only errors to stderr)"
+msgstr "keine Fortschrittsanzeige (nur Fehler auf die Standardfehlerausgabe)"
+
+#: ../svnadmin/svnadmin.c:260
msgid "ignore any repos UUID found in the stream"
msgstr "Ignoriert jede Projektarchiv-UUID, die im Datenstrom gefunden wird"
-#: ../svnadmin/svnadmin.c:241
+#: ../svnadmin/svnadmin.c:263
msgid "set repos UUID to that found in stream, if any"
msgstr "Setzt die UUID des Projektarchivs auf die im Datenstrom gefundene"
-#: ../svnadmin/svnadmin.c:244
-msgid "type of repository: 'fsfs' (default) or 'bdb'"
-msgstr "Art des Projektarchivs: »fsfs« (Standard) oder »bdb«"
+#: ../svnadmin/svnadmin.c:266
+msgid ""
+"type of repository:\n"
+" 'fsfs' (default), 'bdb' or 'fsx'\n"
+" CAUTION: FSX is for EXPERIMENTAL use only!"
+msgstr ""
+"Typ des Projektarchivs:\n"
+" 'fsfs' (Vorgabe), 'bdb' or 'fsx'\n"
+" ACHTUNG: FSX ist als EXPERIMENTELL eingestuft!"
-#: ../svnadmin/svnadmin.c:247
+#: ../svnadmin/svnadmin.c:271
msgid "load at specified directory in repository"
msgstr "in das spezifizierte Verzeichnis im Projektarchiv laden"
-#: ../svnadmin/svnadmin.c:250
+#: ../svnadmin/svnadmin.c:274
msgid "disable fsync at transaction commit [Berkeley DB]"
msgstr "Deaktiviert »fsync« für jede Übertragungstransaktion [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:253
+#: ../svnadmin/svnadmin.c:277
msgid "disable automatic log file removal [Berkeley DB]"
msgstr "Deaktiviert das automatische Entfernen von Log-Dateien [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:259
+#: ../svnadmin/svnadmin.c:283
msgid ""
"remove redundant Berkeley DB log files\n"
" from source repository [Berkeley DB]"
@@ -13384,23 +14858,23 @@ msgstr ""
"Entfernt redundante Berkeley-DB-Logdateien\n"
" aus dem Projektarchiv [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:263
+#: ../svnadmin/svnadmin.c:287
msgid "call pre-commit hook before committing revisions"
msgstr "die Aktion »pre-commit« nach dem Übertragen von Revisionen aufrufen"
-#: ../svnadmin/svnadmin.c:266
+#: ../svnadmin/svnadmin.c:290
msgid "call post-commit hook after committing revisions"
msgstr "die Aktion »post-commit« nach dem Übertragen von Revisionen aufrufen"
-#: ../svnadmin/svnadmin.c:269
+#: ../svnadmin/svnadmin.c:293
msgid "call hook before changing revision property"
msgstr "Aktion vor der Änderung der Revisionseigenschaft aufrufen"
-#: ../svnadmin/svnadmin.c:272
+#: ../svnadmin/svnadmin.c:296
msgid "call hook after changing revision property"
msgstr "Aktion nach der Änderung der Revisionseigenschaft aufrufen"
-#: ../svnadmin/svnadmin.c:275
+#: ../svnadmin/svnadmin.c:299
msgid ""
"wait instead of exit if the repository is in\n"
" use by another process"
@@ -13408,12 +14882,16 @@ msgstr ""
"Wartet anstatt abzubrechen, wenn das Projektarchiv\n"
" durch einen anderen Prozess belegt ist"
-#: ../svnadmin/svnadmin.c:279 ../svnadmin/svnadmin.c:282
-#: ../svnadmin/svnadmin.c:285
+#: ../svnadmin/svnadmin.c:303 ../svnadmin/svnadmin.c:306
+#: ../svnadmin/svnadmin.c:309
msgid "deprecated; see --compatible-version"
msgstr "Veraltet; siehe »--compatible-version«"
-#: ../svnadmin/svnadmin.c:288
+#: ../svnadmin/svnadmin.c:312
+msgid "continue verification after detecting a corruption"
+msgstr "Setzt die Verifikation nach einer entdeckten Beschädigung fort"
+
+#: ../svnadmin/svnadmin.c:315
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations. Default: 16.\n"
@@ -13424,7 +14902,7 @@ msgstr ""
" [nur für FSFS-Projektarchive verwendet]"
# TODO: combine with message above
-#: ../svnadmin/svnadmin.c:293
+#: ../svnadmin/svnadmin.c:320
msgid ""
"use repository format compatible with Subversion\n"
" version ARG (\"1.5.5\", \"1.7\", etc.)"
@@ -13432,11 +14910,33 @@ msgstr ""
"verwendet ein Format das mit der Subversion-Version PAR\n"
" kompatibel ist (\"1.5.5\", \"1.7\", usw.)"
-#: ../svnadmin/svnadmin.c:296
+#: ../svnadmin/svnadmin.c:323
msgid "read repository paths from file ARG"
msgstr "Liest Pfade imP rojektarchive aus Datei PAR"
-#: ../svnadmin/svnadmin.c:308
+#: ../svnadmin/svnadmin.c:326
+msgid ""
+"report any names within the same directory or\n"
+" svn:mergeinfo property value that differ only\n"
+" in character representation, but are otherwise\n"
+" identical"
+msgstr ""
+"listet Namen auf, die im selben Verzeichnis oder\n"
+" svn:mergeinfo-Eigenschaft sich nur in ihrer\n"
+" Zeichendarstellung unterscheiden aber sonst\n"
+" identisch sind"
+
+#: ../svnadmin/svnadmin.c:332
+msgid ""
+"verify metadata only (ignored for BDB),\n"
+" checking against external corruption in\n"
+" Subversion 1.9+ format repositories.\n"
+msgstr ""
+"verifiziert nur Metadaten (ignoriert für BDB),\n"
+" überprüft auf externe Beschädigungen von\n"
+" Projektarchiven im Format Subversion 1.9+\n"
+
+#: ../svnadmin/svnadmin.c:346
msgid ""
"usage: svnadmin crashtest REPOS_PATH\n"
"\n"
@@ -13448,7 +14948,7 @@ msgstr ""
"Öffnet das Projektarchiv in ARCHIV_PFAD und bricht ab. Simuliert\n"
"damit einen Prozess der bei geöffnetem Projektarchiv abstürzt.\n"
-#: ../svnadmin/svnadmin.c:314
+#: ../svnadmin/svnadmin.c:352
msgid ""
"usage: svnadmin create REPOS_PATH\n"
"\n"
@@ -13458,7 +14958,37 @@ msgstr ""
"\n"
"Erstellt ein neues, leeres Projektarchiv im ARCHIV_PFAD.\n"
-#: ../svnadmin/svnadmin.c:323
+#: ../svnadmin/svnadmin.c:361
+msgid ""
+"usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n"
+" 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n"
+"\n"
+"1. Delete the property NAME on revision REVISION.\n"
+"\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
+"\n"
+"NOTE: Revision properties are not versioned, so this command will\n"
+"irreversibly destroy the previous value of the property.\n"
+"\n"
+"2. Delete the property NAME on transaction TXN.\n"
+msgstr ""
+"Aufruf: 1. svnadmin delrevprop ARCHIV_PFAD -r REV NAME\n"
+"\n"
+"1. Löscht die Eigenschaft NAME der Revision REV.\n"
+"\n"
+"Mit »--use-pre-revprop-change-hook«/»--use-post-revprop-change-hook«\n"
+"lösen Sie die mit den Revisionseigenschaften zusammenhängenden Aktionen aus\n"
+"(z.B. falls Sie E-Mail-Benachrichtigungen durch Ihre »post-revprop-change«-\n"
+"Aktion versenden wollen).\n"
+"\n"
+"ACHTUNG: Revisionseigenschaften sind nicht versioniert. Dieser Befehl\n"
+"entfernt also unwiederbringlich die vorherige Eigenschaft.\n"
+"\n"
+"2. Löscht die Eigenschaft NAME der Transaktion TXN.\n"
+
+#: ../svnadmin/svnadmin.c:374
msgid ""
"usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n"
"\n"
@@ -13476,7 +15006,7 @@ msgstr ""
"Revision gespeichert werden. Falls keine Revisionen angegeben wurden, wird\n"
"nur die HEAD-Revision deltifiziert.\n"
-#: ../svnadmin/svnadmin.c:332
+#: ../svnadmin/svnadmin.c:383
msgid ""
"usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n"
"\n"
@@ -13502,7 +15032,7 @@ msgstr ""
"werden für die zweite und folgende Revisionen, nur in diesen Revisionen\n"
"geänderte Pfade ausgegeben.)\n"
-#: ../svnadmin/svnadmin.c:345
+#: ../svnadmin/svnadmin.c:396
msgid ""
"usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n"
@@ -13523,7 +15053,7 @@ msgstr ""
" getrennt enthalten. Projektarchive werden in der Reihenfolge der Auflistung\n"
" gesperrt.\n"
-#: ../svnadmin/svnadmin.c:355
+#: ../svnadmin/svnadmin.c:406
msgid ""
"usage: svnadmin help [SUBCOMMAND...]\n"
"\n"
@@ -13533,7 +15063,7 @@ msgstr ""
"\n"
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
-#: ../svnadmin/svnadmin.c:360
+#: ../svnadmin/svnadmin.c:411
msgid ""
"usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n"
"\n"
@@ -13547,7 +15077,17 @@ msgstr ""
"Wenn »--incremental« angegeben wird, werden im Ziel schon existierende Daten\n"
"nicht erneut kopiert. Die inkrementelle Kopie ist für FSFS-Projektarchive implementiert.\n"
-#: ../svnadmin/svnadmin.c:367
+#: ../svnadmin/svnadmin.c:418
+msgid ""
+"usage: svnadmin info REPOS_PATH\n"
+"\n"
+"Print information about the repository at REPOS_PATH.\n"
+msgstr ""
+"Aufruf: svnadmin info ARCHIV_PFAD\n"
+"\n"
+"Gibt Informationen über das Projektarchiv in ARCHIV_PFAD aus.\n"
+
+#: ../svnadmin/svnadmin.c:423
msgid ""
"usage: svnadmin list-dblogs REPOS_PATH\n"
"\n"
@@ -13563,7 +15103,7 @@ msgstr ""
"WARNUNG: Ändern oder Löschen von Log-Dateien, die noch\n"
"benutzt werden, wird ihr Projektarchiv beschädigen.\n"
-#: ../svnadmin/svnadmin.c:374
+#: ../svnadmin/svnadmin.c:430
msgid ""
"usage: svnadmin list-unused-dblogs REPOS_PATH\n"
"\n"
@@ -13575,7 +15115,7 @@ msgstr ""
"Listet ungenutzte Log-Dateien der Berkeley Datenbank auf.\n"
"\n"
-#: ../svnadmin/svnadmin.c:379
+#: ../svnadmin/svnadmin.c:435
msgid ""
"usage: svnadmin load REPOS_PATH\n"
"\n"
@@ -13596,7 +15136,7 @@ msgstr ""
"Wenn »--revision« angegeben wird, begrenzt dies die aus der Datei geladenen\n"
"Revisionen auf diesen Bereich.\n"
-#: ../svnadmin/svnadmin.c:391
+#: ../svnadmin/svnadmin.c:448
msgid ""
"usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n"
"\n"
@@ -13611,7 +15151,7 @@ msgstr ""
"Verwenden Sie »--bypass-hooks« um die Auslösung der Aktionen\n"
"»pre-unlock« und »post-unlock« zu umgehen.\n"
-#: ../svnadmin/svnadmin.c:398
+#: ../svnadmin/svnadmin.c:455
msgid ""
"usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
"\n"
@@ -13623,7 +15163,7 @@ msgstr ""
"Gibt Beschreibungen aller Sperren auf oder unter PFAD-IN-ARCHIV aus (was,\n"
"falls nicht angegeben, die Wurzel des Projektarchivs ist).\n"
-#: ../svnadmin/svnadmin.c:404
+#: ../svnadmin/svnadmin.c:461
msgid ""
"usage: svnadmin lstxns REPOS_PATH\n"
"\n"
@@ -13633,7 +15173,7 @@ msgstr ""
"\n"
"Gibt die Namen aller nicht übertragenen Transaktionen aus.\n"
-#: ../svnadmin/svnadmin.c:409
+#: ../svnadmin/svnadmin.c:466
msgid ""
"usage: svnadmin pack REPOS_PATH\n"
"\n"
@@ -13645,7 +15185,7 @@ msgstr ""
"Versucht, das Projektarchiv in ein effizienteres Speichermodell zu\n"
"transformieren. Dies muss nicht bei allen Projektarchiven möglich sein und in problematischen Fällen wird nichts getan.\n"
-#: ../svnadmin/svnadmin.c:415
+#: ../svnadmin/svnadmin.c:472
msgid ""
"usage: svnadmin recover REPOS_PATH\n"
"\n"
@@ -13662,7 +15202,7 @@ msgstr ""
"Zugriff auf das Projektarchiv. Der Vorgang wird nicht gestartet, falls\n"
"das Projektarchiv von einem anderen Prozess benutzt wird.\n"
-#: ../svnadmin/svnadmin.c:423
+#: ../svnadmin/svnadmin.c:480
msgid ""
"usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n"
"\n"
@@ -13672,7 +15212,7 @@ msgstr ""
"\n"
"Entferne vorbehaltslos die Sperren von jedem SPERR_PFAD.\n"
-#: ../svnadmin/svnadmin.c:428
+#: ../svnadmin/svnadmin.c:485
msgid ""
"usage: svnadmin rmtxns REPOS_PATH TXN_NAME...\n"
"\n"
@@ -13682,7 +15222,7 @@ msgstr ""
"\n"
"Löscht die benannte(n) Transaktion(en).\n"
-#: ../svnadmin/svnadmin.c:433
+#: ../svnadmin/svnadmin.c:490
msgid ""
"usage: svnadmin setlog REPOS_PATH -r REVISION FILE\n"
"\n"
@@ -13708,21 +15248,26 @@ msgstr ""
"ACHTUNG: Revisionseigenschaften sind nicht versioniert. Dieser Befehl\n"
"überschreibt also die vorherige Logmeldung endgültig.\n"
-#: ../svnadmin/svnadmin.c:445
+#: ../svnadmin/svnadmin.c:502
msgid ""
-"usage: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+"usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+" 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n"
"\n"
-"Set the property NAME on revision REVISION to the contents of FILE. Use\n"
-"--use-pre-revprop-change-hook/--use-post-revprop-change-hook to trigger\n"
-"the revision property-related hooks (for example, if you want an email\n"
-"notification sent from your post-revprop-change hook).\n"
+"1. Set the property NAME on revision REVISION to the contents of FILE.\n"
+"\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
"\n"
"NOTE: Revision properties are not versioned, so this command will\n"
"overwrite the previous value of the property.\n"
+"\n"
+"2. Set the property NAME on transaction TXN to the contents of FILE.\n"
msgstr ""
-"Aufruf: svnadmin setrevprop ARCHIV_PFAD -r REV NAME DATEI\n"
+"Aufruf: 1. svnadmin setrevprop ARCHIV_PFAD -r REV NAME DATEI\n"
+"\n"
+"1. Setzt Eigenschaft NAME der Revision REV auf den Inhalt der Datei DATEI.\n"
"\n"
-"Setzt die Eigenschaft NAME der Revision REV auf den Inhalt der Datei DATEI.\n"
"Mit »--use-pre-revprop-change-hook«/»--use-post-revprop-change-hook«\n"
"lösen Sie die mit den Revisionseigenschaften zusammenhängenden Aktionen aus\n"
"(z.B. falls Sie E-Mail-Benachrichtigungen durch Ihre »post-revprop-change«-\n"
@@ -13730,8 +15275,10 @@ msgstr ""
"\n"
"ACHTUNG: Revisionseigenschaften sind nicht versioniert. Dieser Befehl\n"
"überschreibt also den vorherigen Wert der Eigenschaft.\n"
+"\n"
+"2. Setzt Eigenschaft NAME der Transaktion TXN auf den Inhalt der Datei DATEI.\n"
-#: ../svnadmin/svnadmin.c:456
+#: ../svnadmin/svnadmin.c:515
msgid ""
"usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n"
"\n"
@@ -13746,7 +15293,7 @@ msgstr ""
"UUID des Projektarchivs verwendet, andernfalls wird eine brandneue UUID\n"
"für das Projektarchiv erzeugt.\n"
-#: ../svnadmin/svnadmin.c:463
+#: ../svnadmin/svnadmin.c:522
msgid ""
"usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n"
"\n"
@@ -13761,7 +15308,7 @@ msgstr ""
"Sie »--bypass-hooks« um die Auslösung der Aktionen »pre-unlock« und\n"
"»post-unlock« zu umgehen.\n"
-#: ../svnadmin/svnadmin.c:470
+#: ../svnadmin/svnadmin.c:529
msgid ""
"usage: svnadmin upgrade REPOS_PATH\n"
"\n"
@@ -13790,7 +15337,7 @@ msgstr ""
"Zustand des Projektarchivs wie ein »dump« mit anschließendem »load« dies\n"
"bewirken würde.\n"
-#: ../svnadmin/svnadmin.c:483
+#: ../svnadmin/svnadmin.c:542
msgid ""
"usage: svnadmin verify REPOS_PATH\n"
"\n"
@@ -13800,67 +15347,97 @@ msgstr ""
"\n"
"Überprüft die im Projektarchiv gespeicherten Daten.\n"
-#: ../svnadmin/svnadmin.c:545
+#: ../svnadmin/svnadmin.c:606
msgid "Invalid revision specifier"
msgstr "Ungültige Revision angegeben"
-#: ../svnadmin/svnadmin.c:549
+#: ../svnadmin/svnadmin.c:610
#, c-format
msgid "Revisions must not be greater than the youngest revision (%ld)"
msgstr "Revisionen dürfen nicht größer als die Endrevision (%ld) sein"
-#: ../svnadmin/svnadmin.c:656
+#: ../svnadmin/svnadmin.c:628
+#, c-format
+msgid "Path '%s' is not a local path"
+msgstr "Pfad »%s« ist kein lokaler Pfad"
+
+#: ../svnadmin/svnadmin.c:657
+msgid "Not enough arguments"
+msgstr "Nicht genügend Parameter"
+
+#: ../svnadmin/svnadmin.c:660
+msgid "Too many arguments"
+msgstr "Zu viele Parameter"
+
+#: ../svnadmin/svnadmin.c:696
+#, c-format
+msgid ""
+"Successfully opened repository '%s'.\n"
+"Will now crash to simulate a crashing server process.\n"
+msgstr ""
+"Projektarchive »%s« erfolgreich geöffnet.\n"
+"Es folgt ein Abbruch, um den Absturz eines Serverprozesses zu simulieren.\n"
+
+#: ../svnadmin/svnadmin.c:735
#, c-format
msgid "%swarning: The \"%s\" repository back-end is deprecated, consider using \"%s\" instead.\n"
msgstr "%sWarnung: Das Dateisystemmodul für Projektarchive »%s« ist veraltet, verwenden Sie stattdessen »%s«.\n"
-#: ../svnadmin/svnadmin.c:696
+#: ../svnadmin/svnadmin.c:776
msgid "Repositories compatible with 1.0.x must use --fs-type=bdb"
msgstr "Projektarchive, die mit 1.0.x kompatibel sind, müssen --fs-type=bdb verwenden"
-#: ../svnadmin/svnadmin.c:739 ../svnadmin/svnadmin.c:1011
-#: ../svnadmin/svnadmin.c:1192
+#: ../svnadmin/svnadmin.c:784
+#, c-format
+msgid "Repositories compatible with 1.8.x or earlier cannot use --fs-type=%s"
+msgstr "Projektarchive, die mit 1.8.x oder älter kompatibel sind, können --fs-type=%s nicht verwenden"
+
+#: ../svnadmin/svnadmin.c:829 ../svnadmin/svnadmin.c:1196
+#: ../svnadmin/svnadmin.c:1381
msgid "First revision cannot be higher than second"
msgstr "Die erste Revision darf kann nicht größer als zweite sein"
-#: ../svnadmin/svnadmin.c:748
+#: ../svnadmin/svnadmin.c:838
#, c-format
msgid "Deltifying revision %ld..."
msgstr "Bilde Deltas für Revision %ld ..."
-#: ../svnadmin/svnadmin.c:752 ../svnadmin/svnadmin.c:812
-#: ../svnadmin/svnadmin.c:827
+#: ../svnadmin/svnadmin.c:842 ../svnadmin/svnadmin.c:955
+#: ../svnadmin/svnadmin.c:970
#, c-format
msgid "done.\n"
msgstr "erledigt.\n"
-#: ../svnadmin/svnadmin.c:793
+#: ../svnadmin/svnadmin.c:900
#, c-format
+msgid "* Error verifying revision %ld.\n"
+msgstr "* Fehler bei der Verifikation der Revision %ld.\n"
+
+#: ../svnadmin/svnadmin.c:936
msgid "* Verifying repository metadata ...\n"
msgstr "* Überprüfe Metadaten des Projektarchivs ...\n"
-#: ../svnadmin/svnadmin.c:796
+#: ../svnadmin/svnadmin.c:939
#, c-format
msgid "* Verifying metadata at revision %ld ...\n"
msgstr "* Überprüfe Metadaten der Revision %ld ...\n"
-#: ../svnadmin/svnadmin.c:806
+#: ../svnadmin/svnadmin.c:949
#, c-format
msgid "Packing revisions in shard %s..."
msgstr "Packe Revisionen in Fragment %s ..."
-#: ../svnadmin/svnadmin.c:821
+#: ../svnadmin/svnadmin.c:964
#, c-format
msgid "Packing revprops in shard %s..."
msgstr "Packe Revisionseigenschaften in Fragment %s ..."
-#: ../svnadmin/svnadmin.c:898
+#: ../svnadmin/svnadmin.c:1039
#, c-format
msgid "<<< Skipped original revision %ld\n"
msgstr "<<< Originalrevision %ld übersprungen\n"
-#: ../svnadmin/svnadmin.c:915
-#, c-format
+#: ../svnadmin/svnadmin.c:1056
msgid ""
"Repository lock acquired.\n"
"Please wait; recovering the repository may take some time...\n"
@@ -13868,7 +15445,7 @@ msgstr ""
"Exklusiven Zugriff auf das Projektarchiv erlangt\n"
"Bitte warten, die Wiederherstellung des Projektarchivs kann einige Zeit dauern ...\n"
-#: ../svnadmin/svnadmin.c:922
+#: ../svnadmin/svnadmin.c:1063
msgid ""
"Repository lock acquired.\n"
"Please wait; upgrading the repository may take some time...\n"
@@ -13876,19 +15453,46 @@ msgstr ""
"Exklusiven Zugriff auf das Projektarchiv erlangt\n"
"Bitte warten, die Aktualisierung des Projektarchivs kann einige Zeit dauern ...\n"
-#: ../svnadmin/svnadmin.c:1072
+#: ../svnadmin/svnadmin.c:1074
+#, c-format
+msgid "Packing revision properties in shard %s..."
+msgstr "Packe Revisionseigenschaften in Fragment %s ..."
+
+#: ../svnadmin/svnadmin.c:1086
+#, c-format
+msgid "Removing non-packed revision properties in shard %s..."
+msgstr "Entferne nicht gepackte Revisionseigenschaften in Fragment %s ..."
+
+#: ../svnadmin/svnadmin.c:1094
+#, c-format
+msgid "Bumped repository format to %ld\n"
+msgstr "Format des Projektarchivs erhöht auf: %ld\n"
+
+#: ../svnadmin/svnadmin.c:1102
+#, c-format
+msgid "* Copied revision %ld.\n"
+msgstr "* Revision %ld kopiert.\n"
+
+#: ../svnadmin/svnadmin.c:1108
+#, c-format
+msgid "* Copied revisions from %ld to %ld.\n"
+msgstr "* Revisionen von %ld bis %ld kopiert.\n"
+
+#: ../svnadmin/svnadmin.c:1257
msgid "No program provided"
msgstr "Kein Programm angegeben"
-#: ../svnadmin/svnadmin.c:1108
+#: ../svnadmin/svnadmin.c:1295
msgid ""
"general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository administration tool.\n"
"Type 'svnadmin help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnadmin --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
"Aufruf: svnadmin UNTERBEFEHL ARCHIV_PFAD [Optionen & Parameter ...]\n"
+"Werkzeug zum Verwalten von Projektarchiven.\n"
"Geben Sie »svnadmin help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
" zu erhalten.\n"
"Geben Sie »svnadmin --version« ein, um die Programmversion und die Datei-\n"
@@ -13896,8 +15500,8 @@ msgstr ""
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svnadmin/svnadmin.c:1115 ../svnlook/svnlook.c:2226
-#: ../svnserve/svnserve.c:335
+#: ../svnadmin/svnadmin.c:1303 ../svnlook/svnlook.c:2243
+#: ../svnserve/svnserve.c:429
msgid ""
"The following repository back-end (FS) modules are available:\n"
"\n"
@@ -13905,20 +15509,20 @@ msgstr ""
"Die folgenden Dateisystemmodule für Projektarchive stehen zur Verfügung:\n"
"\n"
-#: ../svnadmin/svnadmin.c:1144
+#: ../svnadmin/svnadmin.c:1332
#, c-format
msgid "Invalid revision number (%ld) specified"
msgstr "Ungültige Revisionsnummer (%ld) angegeben"
-#: ../svnadmin/svnadmin.c:1154
+#: ../svnadmin/svnadmin.c:1342
msgid "Non-numeric revision specified"
msgstr "Nicht-numerische Revisionsnummer angegeben"
-#: ../svnadmin/svnadmin.c:1213
+#: ../svnadmin/svnadmin.c:1403
msgid "Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading."
msgstr "Ungültiger Eigenschaftswert in Datenstrom gefunden; Versuchen Sie die Quelle zu reparieren oder geben Sie »--bypass-prop-validation« beim Laden an."
-#: ../svnadmin/svnadmin.c:1279 ../svnadmin/svnadmin.c:1911
+#: ../svnadmin/svnadmin.c:1469 ../svnadmin/svnadmin.c:2336
msgid ""
"Failed to get exclusive repository access; perhaps another process\n"
"such as httpd, svnserve or svn has it open?"
@@ -13927,12 +15531,12 @@ msgstr ""
"Vielleicht hat noch ein anderer Prozess (httpd, svnserve, svn)\n"
"das Projektarchiv geöffnet?"
-#: ../svnadmin/svnadmin.c:1284 ../svnadmin/svnadmin.c:1916
+#: ../svnadmin/svnadmin.c:1474 ../svnadmin/svnadmin.c:2341
#, c-format
msgid "Waiting on repository lock; perhaps another process has it open?\n"
msgstr "Warte auf Freigabe des Projektarchivs; Vielleicht ist es durch einen anderen Prozess geöffnet?\n"
-#: ../svnadmin/svnadmin.c:1292
+#: ../svnadmin/svnadmin.c:1482
#, c-format
msgid ""
"\n"
@@ -13941,52 +15545,134 @@ msgstr ""
"\n"
"Wiederherstellung vollständig abgeschlossen.\n"
-#: ../svnadmin/svnadmin.c:1299
+#: ../svnadmin/svnadmin.c:1489
#, c-format
msgid "The latest repos revision is %ld.\n"
msgstr "Die neueste Revision des Projektarchivs ist %ld.\n"
-#: ../svnadmin/svnadmin.c:1414
+#: ../svnadmin/svnadmin.c:1604
#, c-format
msgid "Transaction '%s' removed.\n"
msgstr "Transaktion »%s« entfernt.\n"
-#: ../svnadmin/svnadmin.c:1476 ../svnadmin/svnadmin.c:1521
+#: ../svnadmin/svnadmin.c:1686 ../svnadmin/svnadmin.c:1800
+#: ../svnadmin/svnadmin.c:2386
+#, c-format
+msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
+msgstr "--revision (-r) und --transaction (-t) schließen sich gegenseitig aus"
+
+#: ../svnadmin/svnadmin.c:1692 ../svnadmin/svnadmin.c:2392
+#, c-format
+msgid "Calling hooks is incompatible with --transaction (-t)"
+msgstr "Ausführung von Aktionen ist unverträglich mit --transaction (-t)"
+
+#: ../svnadmin/svnadmin.c:1697 ../svnadmin/svnadmin.c:1742
+#: ../svnadmin/svnadmin.c:2397
#, c-format
msgid "Missing revision"
msgstr "Fehlende Revision"
-#: ../svnadmin/svnadmin.c:1479 ../svnadmin/svnadmin.c:1524
+#: ../svnadmin/svnadmin.c:1700 ../svnadmin/svnadmin.c:1745
+#: ../svnadmin/svnadmin.c:2400
#, c-format
msgid "Only one revision allowed"
msgstr "Nur eine Revision zulässig"
-#: ../svnadmin/svnadmin.c:1578
+#: ../svnadmin/svnadmin.c:1862
+msgid ""
+"\n"
+"-----Summary of corrupt revisions-----\n"
+msgstr ""
+"\n"
+"-----Zusammenfassung beschädigter Revisionen-----\n"
+
+#: ../svnadmin/svnadmin.c:1954
#, c-format
-msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
-msgstr "--revision (-r) und --transaction (-t) schließen sich gegenseitig aus"
+msgid "UUID: %s\n"
+msgstr "UUID: %s\n"
+
+#: ../svnadmin/svnadmin.c:1960
+#, c-format
+msgid "Repository Format: %d\n"
+msgstr "Format des Projektarchivs: %d\n"
+
+#: ../svnadmin/svnadmin.c:1974
+#, c-format
+msgid "Compatible With Version: %d.%d.0\n"
+msgstr "Kompatibel mit Version: %d.%d.0\n"
+
+#: ../svnadmin/svnadmin.c:1993
+#, c-format
+msgid "Repository Capability: %s\n"
+msgstr "Funktion des Projektarchivs: %s\n"
+
+#: ../svnadmin/svnadmin.c:2002
+#, c-format
+msgid "Filesystem Type: %s\n"
+msgstr "Typ des Dateisystems: %s\n"
+
+#: ../svnadmin/svnadmin.c:2004
+#, c-format
+msgid "Filesystem Format: %d\n"
+msgstr "Format des Dateisystems: %d\n"
+
+#: ../svnadmin/svnadmin.c:2013
+#, c-format
+msgid "FSFS Sharded: yes\n"
+msgstr "FSFS Fragmentiert: ja\n"
+
+#: ../svnadmin/svnadmin.c:2015
+#, c-format
+msgid "FSFS Sharded: no\n"
+msgstr "FSFS Fragmentiert: nein\n"
+
+#: ../svnadmin/svnadmin.c:2018
+#, c-format
+msgid "FSFS Shard Size: %d\n"
+msgstr "FSFS Fragmentgröße: %d\n"
+
+#: ../svnadmin/svnadmin.c:2027
+#, c-format
+msgid "FSFS Shards Packed: %ld/%ld\n"
+msgstr "FSFS Fragmente gepackt: %ld/%ld\n"
+
+#: ../svnadmin/svnadmin.c:2032
+#, c-format
+msgid "FSFS Logical Addressing: yes\n"
+msgstr "FSFS Logische Adressierung: ja\n"
-#: ../svnadmin/svnadmin.c:1745 ../svnlook/svnlook.c:2289
+#: ../svnadmin/svnadmin.c:2034
+#, c-format
+msgid "FSFS Logical Addressing: no\n"
+msgstr "FSFS Logische Adressierung: nein\n"
+
+# TODO: leicht inkonsistent zu obigen Strings (tritt in svn info-Ausgabe auf)
+#: ../svnadmin/svnadmin.c:2044
+#, c-format
+msgid "Configuration File: %s\n"
+msgstr "Konfigurationsdatei: %s\n"
+
+#: ../svnadmin/svnadmin.c:2168 ../svnlook/svnlook.c:2306
#, c-format
msgid "UUID Token: %s\n"
msgstr "UUID-Marke: %s\n"
-#: ../svnadmin/svnadmin.c:1746 ../svnlook/svnlook.c:2290
+#: ../svnadmin/svnadmin.c:2169 ../svnlook/svnlook.c:2307
#, c-format
msgid "Owner: %s\n"
msgstr "Eigentümer: %s\n"
-#: ../svnadmin/svnadmin.c:1747 ../svnlook/svnlook.c:2291
+#: ../svnadmin/svnadmin.c:2170 ../svnlook/svnlook.c:2308
#, c-format
msgid "Created: %s\n"
msgstr "Erstellt: %s\n"
-#: ../svnadmin/svnadmin.c:1748 ../svnlook/svnlook.c:2292
+#: ../svnadmin/svnadmin.c:2171 ../svnlook/svnlook.c:2309
#, c-format
msgid "Expires: %s\n"
msgstr "Läuft ab: %s\n"
-#: ../svnadmin/svnadmin.c:1750
+#: ../svnadmin/svnadmin.c:2173
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -14005,34 +15691,34 @@ msgstr[1] ""
"%s\n"
"\n"
-#: ../svnadmin/svnadmin.c:1796
+#: ../svnadmin/svnadmin.c:2221
msgid "No paths to unlock provided"
msgstr "Keine Pfade zum Entsperren angegeben"
-#: ../svnadmin/svnadmin.c:1814
+#: ../svnadmin/svnadmin.c:2239
#, c-format
msgid "Path '%s' isn't locked.\n"
msgstr "Pfad »%s« ist nicht gesperrt.\n"
-#: ../svnadmin/svnadmin.c:1826
+#: ../svnadmin/svnadmin.c:2251
#, c-format
msgid "Removed lock on '%s'.\n"
msgstr "Sperre für »%s« entfernt.\n"
-#: ../svnadmin/svnadmin.c:1879
+#: ../svnadmin/svnadmin.c:2304
#, c-format
msgid "'%s' unlocked by user '%s'.\n"
msgstr "»%s« entsperrt durch Benutzer »%s«.\n"
-#: ../svnadmin/svnadmin.c:1926
+#: ../svnadmin/svnadmin.c:2351
msgid "Upgrade of this repository's underlying versioned filesystem is not supported; consider dumping and loading the data elsewhere"
msgstr "Eine Aktualisierung des diesem Projektarchiv zugrundeliegenden versionierten Dateisystems wird nicht unterstützt; versuchen Sie stattdessen »dump« und laden Sie die Daten mit »load« anderswo"
-#: ../svnadmin/svnadmin.c:1933
+#: ../svnadmin/svnadmin.c:2358
msgid "Upgrade of this repository is not supported; consider dumping and loading the data elsewhere"
msgstr "Eine Aktualisierung dieses Projektarchivs wird nicht unterstützt; versuchen Sie stattdessen »dump« und laden Sie die Daten mit »load« anderswo"
-#: ../svnadmin/svnadmin.c:1939
+#: ../svnadmin/svnadmin.c:2364
#, c-format
msgid ""
"\n"
@@ -14041,35 +15727,36 @@ msgstr ""
"\n"
"Aktualisierung abgeschlossen.\n"
-#: ../svnadmin/svnadmin.c:2024 ../svnrdump/svnrdump.c:923
+#: ../svnadmin/svnadmin.c:2478 ../svnfsfs/svnfsfs.c:321
+#: ../svnrdump/svnrdump.c:878
msgid "Multiple revision arguments encountered; try '-r N:M' instead of '-r N -r M'"
msgstr "Mehrere Revisionsparameter gefunden; Bitte »-r N:M« anstelle »-r N -r M« verwenden"
-#: ../svnadmin/svnadmin.c:2102
+#: ../svnadmin/svnadmin.c:2558
#, c-format
msgid "Cannot create pre-1.0-compatible repositories"
msgstr "Kann keine Projektarchive erstellen, die mit Versionen älter als 1.0 kompatibel sind"
-#: ../svnadmin/svnadmin.c:2115
+#: ../svnadmin/svnadmin.c:2570
#, c-format
msgid "Cannot guarantee compatibility beyond the current running version (%s)"
msgstr "Kann Kompatibilität für höhere Versionen als die momentan laufende nicht garantieren (%s)"
-#: ../svnadmin/svnadmin.c:2204
+#: ../svnadmin/svnadmin.c:2671 ../svnfsfs/svnfsfs.c:386
#, c-format
msgid "subcommand argument required\n"
msgstr "Unterbefehl benötigt einen Parameter\n"
-#: ../svnadmin/svnadmin.c:2239
+#: ../svnadmin/svnadmin.c:2708 ../svnfsfs/svnfsfs.c:421
msgid "Repository argument required"
msgstr "Projektarchiv Parameter erforderlich"
-#: ../svnadmin/svnadmin.c:2252
+#: ../svnadmin/svnadmin.c:2716 ../svnfsfs/svnfsfs.c:429
#, c-format
msgid "'%s' is a URL when it should be a local path"
msgstr "»%s« ist eine URL obwohl es ein Pfad sein sollte"
-#: ../svnadmin/svnadmin.c:2283
+#: ../svnadmin/svnadmin.c:2746
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14078,77 +15765,329 @@ msgstr ""
"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
"Geben Sie »svnadmin help %s« ein, um Hilfe zu erhalten.\n"
-#: ../svnadmin/svnadmin.c:2326
+#: ../svnadmin/svnadmin.c:2790
msgid "Try 'svnadmin help' for more info"
msgstr "Geben Sie »svnadmin help« für weitere Hilfe ein"
-#: ../svndumpfilter/svndumpfilter.c:79
+#: ../svnbench/help-cmd.c:49
+msgid ""
+"usage: svnbench <subcommand> [options] [args]\n"
+"Subversion benchmarking tool.\n"
+"Type 'svnbench help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnbench --version' to see the program version and RA modules\n"
+" or 'svnbench --version --quiet' to see just the version number.\n"
+"\n"
+"Most subcommands take file and/or directory arguments, recursing\n"
+"on the directories. If no arguments are supplied to such a\n"
+"command, it recurses on the current directory (inclusive) by default.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+"Aufruf: svnbench <Unterbefehl> [Optionen] [Parameter]\n"
+"Subversion-Werkzeug für Geschwindigkeitsmessung und -analyse.\n"
+"Geben Sie »svnbench help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
+" zu erhalten.\n"
+"Geben Sie »svnbench --version« ein, um die Programmversion und die Zugriffsmodule\n"
+" oder »svnbench --version --quiet«, um nur die Versionsnummer zu sehen.\n"
+"\n"
+"Die meisten Unterbefehle akzeptieren Datei- und/oder Verzeichnisparameter,\n"
+"wobei die Verzeichnisse rekursiv durchlaufen werden. Wenn keine Parameter\n"
+"angegeben werden, durchläuft der Befehl das aktuelle Verzeichnis rekursiv.\n"
+"\n"
+"Verfügbare Unterbefehle:\n"
+
+#: ../svnbench/null-export-cmd.c:334
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s bytes in files\n"
+"%15s properties\n"
+"%15s bytes in properties\n"
+msgstr ""
+"%15s Verzeichnisse\n"
+"%15s Dateien\n"
+"%15s Byte in Dateien\n"
+"%15s Eigenschaften\n"
+"%15s Byte in Eigenschaften\n"
+
+#: ../svnbench/null-info-cmd.c:273
+#, c-format
+msgid "Number of status notifications received: %d\n"
+msgstr "Zahl der empfangenen Statusmitteilungen: %d\n"
+
+#: ../svnbench/null-list-cmd.c:153
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s locks\n"
+msgstr ""
+"%15s Verzeichnisse\n"
+"%15s Dateien\n"
+"%15s Sperren\n"
+
+#: ../svnbench/null-log-cmd.c:190
+#, c-format
+msgid "Only relative paths can be specified after a URL for 'svnbench log', but '%s' is not a relative path"
+msgstr "Mit »svnbench log« können nach einer URL nur relative Pfade angegeben werden, »%s« ist aber kein relativer Pfad"
+
+#: ../svnbench/null-log-cmd.c:222
+#, c-format
+msgid ""
+"%15s revisions, %15s merged in %s merges\n"
+"%15s msg lines, %15s in merged revisions\n"
+"%15s changes, %15s in merged revisions\n"
+msgstr ""
+"%15s Revisionen, %15s zusammengeführt in %s Zusammenführungen\n"
+"%15s Log-Zeilen, %15s in zusammengeführten Revisionen\n"
+"%15s Änderungen, %15s in zusammengeführten Revisionen\n"
+
+#: ../svnbench/null-log-cmd.c:234
+#, c-format
+msgid ""
+"%15s revisions\n"
+"%15s msg lines\n"
+"%15s changes\n"
+msgstr ""
+"%15s Revisionen\n"
+"%15s Log-Zeilen\n"
+"%15s Änderungen\n"
+
+#: ../svnbench/svnbench.c:117 ../svnrdump/svnrdump.c:144
+msgid "specify a password ARG"
+msgstr "Passwort PAR angeben"
+
+#: ../svnbench/svnbench.c:124
+msgid "use strict semantics"
+msgstr "wendet strikte Semantik an"
+
+#: ../svnbench/svnbench.c:154
+msgid "do no interactive prompting"
+msgstr "keine interaktiven Rückfragen ausgeben"
+
+#: ../svnbench/svnbench.c:223
+msgid ""
+"Create an unversioned copy of a tree.\n"
+"usage: null-export [-r REV] URL[@PEGREV]\n"
+"\n"
+" Exports a clean directory tree from the repository specified by\n"
+" URL, at revision REV if it is given, otherwise at HEAD.\n"
+"\n"
+" If specified, PEGREV determines in which revision the target is first\n"
+" looked up.\n"
+msgstr ""
+"Erzeugt eine nicht versionierte Kopie eines Dateibaumes.\n"
+"Aufruf: null-export [-r REV] URL[@PEGREV]\n"
+"\n"
+" Exportiert einen sauberen Verzeichnisbaum, der durch die URL\n"
+" spezifiziert ist. Ohne Angabe von REV wird HEAD exportiert, sonst REV.\n"
+"\n"
+" PEGREV gibt an, in welcher Revision das Ziel zuerst gesucht wird.\n"
+
+# FIXME: "looked up" ist überall leicht unterschiedlich übersetzt
+# Ich (Jens) bevorzuge "gesucht" statt "nachgeschlagen" oder "durchsucht", "nachgeschaut"
+# FIXME: Standardsätze sollten eigene msgid haben!
+#: ../svnbench/svnbench.c:234
+msgid ""
+"List directory entries in the repository.\n"
+"usage: null-list [TARGET[@REV]...]\n"
+"\n"
+" List each TARGET file and the contents of each TARGET directory as\n"
+" they exist in the repository. If TARGET is a working copy path, the\n"
+" corresponding repository URL will be used. If specified, REV determines\n"
+" in which revision the target is first looked up.\n"
+"\n"
+" The default TARGET is '.', meaning the repository URL of the current\n"
+" working directory.\n"
+"\n"
+" With --verbose, the following fields will be fetched for each item:\n"
+"\n"
+" Revision number of the last commit\n"
+" Author of the last commit\n"
+" If locked, the letter 'O'. (Use 'svn info URL' to see details)\n"
+" Size (in bytes)\n"
+" Date and time of the last commit\n"
+msgstr ""
+"Zeigt Verzeichniseinträge im Projektarchiv.\n"
+"Aufruf: null-list [ZIEL[@REV]...]\n"
+"\n"
+" Listet jede ZIEL-Datei und die Inhalte jedes ZIEL-Verzeichnisses, wie\n"
+" sie im Projektarchiv existieren, auf. Wenn ZIEL ein Arbeitskopiepfad ist,\n"
+" wird die entsprechende URL des Projektarchivs verwendet. REV bestimmt,\n"
+" in welcher Revision zuerst nachgeschaut wird.\n"
+"\n"
+" Die Vorgabe für ZIEL ist ».«, d.h. die URL vom Projektarchiv des\n"
+" aktuellen Verzeichnisses.\n"
+"\n"
+" Mit »--verbose« werden die folgenden Felder pro Objekt abgerufen:\n"
+"\n"
+" Revisionsnummer der letzten Ãœbertragung\n"
+" Autor der letzten Ãœbertragung\n"
+" Falls gesperrt, der Buchstabe »O« (»svn info URL« für Details)\n"
+" Größe (in Bytes)\n"
+" Datum und Zeit der letzten Ãœbertragung\n"
+
+#: ../svnbench/svnbench.c:255
+msgid ""
+"Fetch the log messages for a set of revision(s) and/or path(s).\n"
+"usage: 1. null-log [PATH][@REV]\n"
+" 2. null-log URL[@REV] [PATH...]\n"
+"\n"
+" 1. Fetch the log messages for the URL corresponding to PATH\n"
+" (default: '.'). If specified, REV is the revision in which the\n"
+" URL is first looked up, and the default revision range is REV:1.\n"
+" If REV is not specified, the default revision range is BASE:1,\n"
+" since the URL might not exist in the HEAD revision.\n"
+"\n"
+" 2. Fetch the log messages for the PATHs (default: '.') under URL.\n"
+" If specified, REV is the revision in which the URL is first\n"
+" looked up, and the default revision range is REV:1; otherwise,\n"
+" the URL is looked up in HEAD, and the default revision range is\n"
+" HEAD:1.\n"
+"\n"
+" Multiple '-c' or '-r' options may be specified (but not a\n"
+" combination of '-c' and '-r' options), and mixing of forward and\n"
+" reverse ranges is allowed.\n"
+"\n"
+" With -v, also print all affected paths with each log message.\n"
+" With -q, don't print the log message body itself (note that this is\n"
+" compatible with -v).\n"
+"\n"
+" Each log message is printed just once, even if more than one of the\n"
+" affected paths for that revision were explicitly requested. Logs\n"
+" follow copy history by default. Use --stop-on-copy to disable this\n"
+" behavior, which can be useful for determining branchpoints.\n"
+msgstr ""
+"Ruft die Logmeldungen für eine Menge von Revisionen und/oder Dateien ab.\n"
+"Aufruf: 1. null-log [PFAD][@REV]\n"
+" 2. null-log URL[@REV] [PFAD...]\n"
+"\n"
+" 1. Ruft Log-Einträge der zu PFAD gehörenden URL ab. (Vorgabe: ».«)\n"
+" Ist REV angegeben, ist das die Revision in der URL zuerst gesucht\n"
+" Ist REV angegeben, ist das die Revision in der URL zuerst gesucht\n"
+" wird, und der vorgegebene Versionsbereich ist REV:1. Ist REV nicht\n"
+" angegeben, so ist der vorgegebene Revisionsbereich BASE:1, da die\n"
+" URL möglicherweise in der Revision HEAD nicht existiert.\n"
+"\n"
+" 2. Ruft Log-Einträge für PFAD(e) unter URL ab, (Vorgabe: ».«)\n"
+" Ist REV angegeben, ist das die Revision in der URL zuerst gesucht\n"
+" wird, und der vorgegebene Versionsbereich ist REV:1. Andernfalls wird\n"
+" URL in HEAD gesucht und der vorgegebene Revisionsbereich ist\n"
+" HEAD:1.\n"
+"\n"
+" Mehrere »-c«- oder »-r«-Optionen dürfen angegeben werden (aber keine\n"
+" Kombination von »-c« und »-r«) und das Mischen von vor- und\n"
+" rückwärtigen Bereichen ist erlaubt.\n"
+"\n"
+" Mit »-v« werden auch die betroffenen Pfade mit jeder Logmeldung ausgegeben.\n"
+" Mit »-q« wird die Logmeldung selbst nicht ausgegeben (Hinweis: Diese Option\n"
+" ist kompatibel mit »-v«).\n"
+"\n"
+" Jede Logmeldung wird nur einmal ausgegeben, selbst wenn mehr als einer\n"
+" der betroffenen Pfade explizit angefragt wurde. Logs folgen per Vorgabe\n"
+" der Historie von Kopien. Benutzen Sie »--stop-on-copy«, um dieses Verhalten,\n"
+" z.B. zum Auffinden von Verzweigungen, zu deaktivieren.\n"
+
+#: ../svnbench/svnbench.c:290
+msgid ""
+"Display information about a local or remote item.\n"
+"usage: null-info [TARGET[@REV]...]\n"
+"\n"
+" Print information about each TARGET (default: '.').\n"
+" TARGET may be either a working-copy path or URL. If specified, REV\n"
+" determines in which revision the target is first looked up.\n"
+msgstr ""
+"Zeigt Informationen über ein lokales oder auf dem Server befindliches\n"
+"Objekt an.\n"
+"Aufruf: null-info [ZIEL[@REV]...]\n"
+"\n"
+" Gibt Informationen über jedes ZIEL aus (Vorgabe: ».«).\n"
+" ZIEL kann entweder ein Pfad einer Arbeitskopie oder eine URL sein. Wenn\n"
+" angegeben, bestimmt REV, in welcher Revision zuerst nach dem Ziel gesucht\n"
+" wird.\n"
+
+#: ../svnbench/svnbench.c:760
+#, c-format
+msgid ""
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svnbench help %s' for usage.\n"
+msgstr ""
+"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
+"Geben Sie »svnbench help %s« für Hilfe ein.\n"
+
+#: ../svnbench/svnbench.c:962
+#, c-format
+msgid "Try 'svnbench help %s' for more information"
+msgstr "Versuchen Sie »svnbench help %s« für weitere Informationen"
+
+#: ../svndumpfilter/svndumpfilter.c:80
#, c-format
msgid "Can't open stdio file"
msgstr "Kann Standardeingabe nicht öffnen"
-#: ../svndumpfilter/svndumpfilter.c:406
+#: ../svndumpfilter/svndumpfilter.c:394
msgid "This is an empty revision for padding."
msgstr "Dies ist eine leere Revision zum Auffüllen"
-#: ../svndumpfilter/svndumpfilter.c:489
+#: ../svndumpfilter/svndumpfilter.c:446
#, c-format
msgid "Revision %ld committed as %ld.\n"
msgstr "Revision %ld als %ld übertragen.\n"
-#: ../svndumpfilter/svndumpfilter.c:512
+#: ../svndumpfilter/svndumpfilter.c:469
#, c-format
msgid "Revision %ld skipped.\n"
msgstr "Revision: »%ld« übersprungen\n"
-#: ../svndumpfilter/svndumpfilter.c:608
+#: ../svndumpfilter/svndumpfilter.c:566
#, c-format
msgid "Invalid copy source path '%s'"
msgstr "Ungültiger Quellpfad einer Kopie: »%s«"
-#: ../svndumpfilter/svndumpfilter.c:649
+#: ../svndumpfilter/svndumpfilter.c:604
#, c-format
msgid "Missing Node-action for path '%s'"
msgstr "Fehlende Knotenaktion für Pfad »%s«"
-#: ../svndumpfilter/svndumpfilter.c:692
+#: ../svndumpfilter/svndumpfilter.c:647
#, c-format
msgid "No valid copyfrom revision in filtered stream"
msgstr "Keine gültige Quellrevision im gefilterten Datenstrom"
-#: ../svndumpfilter/svndumpfilter.c:817
+#: ../svndumpfilter/svndumpfilter.c:715
#, c-format
msgid "Missing merge source path '%s'; try with --skip-missing-merge-sources"
msgstr "Fehlender Zusammenführungsquellpfad »%s«; versuchen Sie es mit --skip-missing-merge-sources"
-#: ../svndumpfilter/svndumpfilter.c:839
+#: ../svndumpfilter/svndumpfilter.c:737
#, c-format
msgid "No valid revision range 'start' in filtered stream"
msgstr "Kein gültiger Revisionsbereich »start« im gefilterten Datenstrom"
-#: ../svndumpfilter/svndumpfilter.c:846
+#: ../svndumpfilter/svndumpfilter.c:744
#, c-format
msgid "No valid revision range 'end' in filtered stream"
msgstr "Kein gültiger Revisionsbereich »end« im gefilterten Datenstrom"
-#: ../svndumpfilter/svndumpfilter.c:892 ../svndumpfilter/svndumpfilter.c:923
+#: ../svndumpfilter/svndumpfilter.c:792 ../svndumpfilter/svndumpfilter.c:823
#, c-format
msgid "Delta property block detected, but deltas are not enabled for node '%s' in original revision %ld"
msgstr "Block mit Deltas für Eigenschaften entdeckt, Deltas sind aber für Knoten »%s« in originaler Revision %ld nicht aktiviert"
-#: ../svndumpfilter/svndumpfilter.c:1056
+#: ../svndumpfilter/svndumpfilter.c:985
msgid "Do not display filtering statistics."
msgstr "Filterstatistik nicht anzeigen."
-#: ../svndumpfilter/svndumpfilter.c:1058
+#: ../svndumpfilter/svndumpfilter.c:987
msgid "Treat the path prefixes as file glob patterns."
msgstr "Pfadpräfix als Dateiplatzhalter behandeln."
-#: ../svndumpfilter/svndumpfilter.c:1060
+#: ../svndumpfilter/svndumpfilter.c:989
msgid "Remove revisions emptied by filtering."
msgstr "Durch das Filtern geleerte Revisionen entfernen."
-#: ../svndumpfilter/svndumpfilter.c:1062
+#: ../svndumpfilter/svndumpfilter.c:991
msgid ""
"Remove all empty revisions found in dumpstream\n"
" except revision 0."
@@ -14156,19 +16095,19 @@ msgstr ""
"Entfernt alle im Dateiabzug gefundenen leeren Revisionen\n"
" mit Ausnahme von Revision 0."
-#: ../svndumpfilter/svndumpfilter.c:1065
+#: ../svndumpfilter/svndumpfilter.c:994
msgid "Renumber revisions left after filtering."
msgstr "Revisionen nach dem Filtern neu nummerieren."
-#: ../svndumpfilter/svndumpfilter.c:1068
+#: ../svndumpfilter/svndumpfilter.c:997
msgid "Skip missing merge sources."
msgstr "Fehlende Zusammenführungsquellen übersprungen."
-#: ../svndumpfilter/svndumpfilter.c:1070
+#: ../svndumpfilter/svndumpfilter.c:999
msgid "Don't filter revision properties."
msgstr "Revisionseigenschaften nicht filtern."
-#: ../svndumpfilter/svndumpfilter.c:1072
+#: ../svndumpfilter/svndumpfilter.c:1001
msgid ""
"Read additional prefixes, one per line, from\n"
" file ARG."
@@ -14176,7 +16115,7 @@ msgstr ""
"Liest zusätzliche Prefixe, einen je Zeile, aus\n"
" Datei PAR."
-#: ../svndumpfilter/svndumpfilter.c:1084
+#: ../svndumpfilter/svndumpfilter.c:1013
msgid ""
"Filter out nodes with given prefixes from dumpstream.\n"
"usage: svndumpfilter exclude PATH_PREFIX...\n"
@@ -14184,7 +16123,7 @@ msgstr ""
"Knoten mit den angegebenen Präfixen aus dem Datenstrom ausfiltern.\n"
"Aufruf: svndumpfilter exclude PFAD_PRÄFIX ...\n"
-#: ../svndumpfilter/svndumpfilter.c:1093
+#: ../svndumpfilter/svndumpfilter.c:1022
msgid ""
"Filter out nodes without given prefixes from dumpstream.\n"
"usage: svndumpfilter include PATH_PREFIX...\n"
@@ -14192,7 +16131,7 @@ msgstr ""
"Knoten, die nicht den angegebenen Präfixen entsprechen, aus dem Datenstrom ausfiltern.\n"
"Aufruf: svndumpfilter include PFAD_PRÄFIX ...\n"
-#: ../svndumpfilter/svndumpfilter.c:1102
+#: ../svndumpfilter/svndumpfilter.c:1031
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: svndumpfilter help [SUBCOMMAND...]\n"
@@ -14200,62 +16139,64 @@ msgstr ""
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
"Aufruf: svndumpfilter help [UNTERBEFEHL...]\n"
-#: ../svndumpfilter/svndumpfilter.c:1178
+#: ../svndumpfilter/svndumpfilter.c:1107
msgid ""
"general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]\n"
+"Subversion repository dump filtering tool.\n"
"Type 'svndumpfilter help <subcommand>' for help on a specific subcommand.\n"
"Type 'svndumpfilter --version' to see the program version.\n"
"\n"
"Available subcommands:\n"
msgstr ""
"Aufruf: svndumpfilter UNTERBEFEHL [Optionen & Parameter ...]\n"
+"Werkzeug zum Filtern von Dateiabzügen von Projektarchiven.\n"
"Geben Sie »svndumpfilter help <Unterbefehl>« ein, um Hilfe zu einem\n"
" Unterbefehl zu erhalten.\n"
"Geben Sie »svndumpfilter --version« ein, um die Programmversion zu sehen.\n"
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svndumpfilter/svndumpfilter.c:1236
+#: ../svndumpfilter/svndumpfilter.c:1166
#, c-format
msgid "Excluding (and dropping empty revisions for) prefix patterns:\n"
msgstr "Präfixmuster ausschließen (und leere Revisionen verwerfen):\n"
-#: ../svndumpfilter/svndumpfilter.c:1238
+#: ../svndumpfilter/svndumpfilter.c:1168
#, c-format
msgid "Excluding prefix patterns:\n"
msgstr "Präfixmuster ausschließen:\n"
-#: ../svndumpfilter/svndumpfilter.c:1241
+#: ../svndumpfilter/svndumpfilter.c:1171
#, c-format
msgid "Including (and dropping empty revisions for) prefix patterns:\n"
msgstr "Präfixmuster einschließen (und leere Revisionen verwerfen):\n"
-#: ../svndumpfilter/svndumpfilter.c:1243
+#: ../svndumpfilter/svndumpfilter.c:1173
#, c-format
msgid "Including prefix patterns:\n"
msgstr "Präfixmuster einschließen:\n"
-#: ../svndumpfilter/svndumpfilter.c:1251
+#: ../svndumpfilter/svndumpfilter.c:1181
#, c-format
msgid "Excluding (and dropping empty revisions for) prefixes:\n"
msgstr "Präfixe ausschließen (und leere Revisionen verwerfen):\n"
-#: ../svndumpfilter/svndumpfilter.c:1253
+#: ../svndumpfilter/svndumpfilter.c:1183
#, c-format
msgid "Excluding prefixes:\n"
msgstr "Präfixe ausschließen:\n"
-#: ../svndumpfilter/svndumpfilter.c:1256
+#: ../svndumpfilter/svndumpfilter.c:1186
#, c-format
msgid "Including (and dropping empty revisions for) prefixes:\n"
msgstr "Präfixe einschließen (und leere Revisionen verwerfen):\n"
-#: ../svndumpfilter/svndumpfilter.c:1258
+#: ../svndumpfilter/svndumpfilter.c:1188
#, c-format
msgid "Including prefixes:\n"
msgstr "Präfixe einschließen:\n"
-#: ../svndumpfilter/svndumpfilter.c:1286
+#: ../svndumpfilter/svndumpfilter.c:1216
#, c-format
msgid ""
"Dropped %d revision.\n"
@@ -14270,27 +16211,27 @@ msgstr[1] ""
"%d Revisionen verworfen.\n"
"\n"
-#: ../svndumpfilter/svndumpfilter.c:1294
+#: ../svndumpfilter/svndumpfilter.c:1224
msgid "Revisions renumbered as follows:\n"
msgstr "Revisionen folgendermaßen neu nummeriert:\n"
-#: ../svndumpfilter/svndumpfilter.c:1322
+#: ../svndumpfilter/svndumpfilter.c:1251
#, c-format
msgid " %ld => (dropped)\n"
msgstr " %ld => (verworfen)\n"
-#: ../svndumpfilter/svndumpfilter.c:1337
+#: ../svndumpfilter/svndumpfilter.c:1266
#, c-format
msgid "Dropped %d node:\n"
msgid_plural "Dropped %d nodes:\n"
msgstr[0] "%d Knoten verworfen:\n"
msgstr[1] "%d Knoten verworfen:\n"
-#: ../svndumpfilter/svndumpfilter.c:1506
+#: ../svndumpfilter/svndumpfilter.c:1424
msgid "--drop-empty-revs cannot be used with --drop-all-empty-revs"
msgstr "--drop-empty-revs« kann nicht mit --drop-all-empty-revs verwendet werden"
-#: ../svndumpfilter/svndumpfilter.c:1626
+#: ../svndumpfilter/svndumpfilter.c:1541
#, c-format
msgid ""
"\n"
@@ -14299,7 +16240,7 @@ msgstr ""
"\n"
"Fehler: keine Präfixe angegeben.\n"
-#: ../svndumpfilter/svndumpfilter.c:1657
+#: ../svndumpfilter/svndumpfilter.c:1572
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14308,53 +16249,295 @@ msgstr ""
"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
"Geben Sie »svndumpfilter help %s« für Hilfe ein.\n"
-#: ../svndumpfilter/svndumpfilter.c:1675
+#: ../svndumpfilter/svndumpfilter.c:1590
msgid "Try 'svndumpfilter help' for more info"
msgstr "Versuchen Sie »svndumpfilter help« für weitere Informationen"
-#: ../svnlook/svnlook.c:117
+#: ../svnfsfs/load-index-cmd.c:54
+#, c-format
+msgid "Unknown item type '%s'"
+msgstr "Unbekannter Elementtyp »%s«"
+
+#: ../svnfsfs/load-index-cmd.c:73
+#, c-format
+msgid "%i columns needed, %i provided"
+msgstr "%i Spalten benötigt, %i gegeben"
+
+#: ../svnfsfs/load-index-cmd.c:83
+#, c-format
+msgid "%s is not a value HEX string"
+msgstr "%s ist keine gültige HEX-Zeichenkette"
+
+#: ../svnfsfs/stats-cmd.c:70
+#, c-format
+msgid ""
+"%20s bytes in %12s reps\n"
+"%20s bytes in %12s shared reps\n"
+"%20s bytes expanded size\n"
+"%20s bytes expanded shared size\n"
+"%20s bytes with rep-sharing off\n"
+"%20s shared references\n"
+msgstr ""
+"%20s Byte in %12s Darstellungen\n"
+"%20s Byte in %12s geteilten Darstellungen\n"
+"%20s Byte erweiterte Größe\n"
+"%20s Byte erweiterte geteilte Größe\n"
+"%20s Byte mit deaktivierter Teilung von Darstellungen\n"
+"%20s geteilte Referenzen\n"
+
+#: ../svnfsfs/stats-cmd.c:94
+#, c-format
+msgid "%12s r%-8ld %s\n"
+msgstr "%12s r%-8ld %s\n"
+
+#: ../svnfsfs/stats-cmd.c:120
+#, c-format
+msgid " %4s .. < %-4s %19s (%2d%%) bytes in %12s (%2d%%) items\n"
+msgstr " %4s .. < %-4s %19s (%2d%%) Byte in %12s (%2d%%) Elementen\n"
+
+#: ../svnfsfs/stats-cmd.c:239 ../svnfsfs/stats-cmd.c:246
+#, c-format
+msgid "%11s %20s (%2d%%) representations\n"
+msgstr "%11s %20s (%2d%%) Darstellungen\n"
+
+#: ../svnfsfs/stats-cmd.c:269 ../svnfsfs/stats-cmd.c:276
+#: ../svnfsfs/stats-cmd.c:299 ../svnfsfs/stats-cmd.c:306
+#, c-format
+msgid "%11s %20s (%2d%%) bytes\n"
+msgstr "%11s %20s (%2d%%) Byte\n"
+
+#: ../svnfsfs/stats-cmd.c:347
+#, c-format
+msgid ""
+"%20s bytes in %12s revisions\n"
+"%20s bytes in %12s changes\n"
+"%20s bytes in %12s node revision records\n"
+"%20s bytes in %12s representations\n"
+"%20s bytes expanded representation size\n"
+"%20s bytes with rep-sharing off\n"
+msgstr ""
+"%20s Byte in %12s Revisionen\n"
+"%20s Byte in %12s Änderungen\n"
+"%20s Byte in %12s Knotenrevisionen\n"
+"%20s Byte in %12s Darstellungen\n"
+"%20s Byte erweiterte Darstellungsgröße\n"
+"%20s Byte deaktivierter Teilung von Darstellungen\n"
+
+#: ../svnfsfs/stats-cmd.c:367
+#, c-format
+msgid ""
+"%20s bytes in %12s nodes total\n"
+"%20s bytes in %12s directory noderevs\n"
+"%20s bytes in %12s file noderevs\n"
+msgstr ""
+"%20s Byte in %12s Knoten insgesamt\n"
+"%20s Byte in %12s Knotenrevisionen von Verzeichnisen\n"
+"%20s Byte in %12s Knotenrevisionen von Dateien\n"
+
+#: ../svnfsfs/stats-cmd.c:378
+#, c-format
+msgid ""
+"%20s bytes in %12s representations total\n"
+"%20s bytes in %12s directory representations\n"
+"%20s bytes in %12s file representations\n"
+"%20s bytes in %12s representations of added file nodes\n"
+"%20s bytes in %12s directory property representations\n"
+"%20s bytes in %12s file property representations\n"
+"%20s bytes in header & footer overhead\n"
+msgstr ""
+"%20s Byte in %12s Darstellungen insgesamt\n"
+"%20s Byte in %12s Darstellungen von Verzeichnissen\n"
+"%20s Byte in %12s Darstellungen von Dateien\n"
+"%20s Byte in %12s Darstellungen von hinzugefügten Dateiknoten\n"
+"%20s Byte in %12s Darstellungen von Verzeichniseigenschaften\n"
+"%20s Byte in %12s Darstellungen von Dateieigenschaften\n"
+"%20s Byte in Kopf- und Fußdaten\n"
+
+#: ../svnfsfs/svnfsfs.c:144
+msgid ""
+"size of the extra in-memory cache in MB used to\n"
+" minimize redundant operations. Default: 16."
+msgstr ""
+"Größe des extra Zwischenspeichers im RAM in MB zur\n"
+" Minimierung redundanter Operationen. Vorgabe: 16."
+
+#: ../svnfsfs/svnfsfs.c:157
+msgid ""
+"usage: svnfsfs help [SUBCOMMAND...]\n"
+"\n"
+"Describe the usage of this program or its subcommands.\n"
+msgstr ""
+"Aufruf: svnfsfs help [UNTERBEFEHL...]\n"
+"\n"
+"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
+
+#: ../svnfsfs/svnfsfs.c:162
+msgid ""
+"usage: svnfsfs dump-index REPOS_PATH -r REV\n"
+"\n"
+"Dump the index contents for the revision / pack file containing revision REV\n"
+"to console. This is only available for FSFS format 7 (SVN 1.9+) repositories.\n"
+"The table produced contains a header in the first line followed by one line\n"
+"per index entry, ordered by location in the revision / pack file. Columns:\n"
+"\n"
+" * Byte offset (hex) at which the item starts\n"
+" * Length (hex) of the item in bytes\n"
+" * Item type (string) is one of the following:\n"
+"\n"
+" none ... Unused section. File contents shall be NULs.\n"
+" frep ... File representation.\n"
+" drep ... Directory representation.\n"
+" fprop .. File property.\n"
+" dprop .. Directory property.\n"
+" node ... Node revision.\n"
+" chgs ... Changed paths list.\n"
+" rep .... Representation of unknown type. Should not be used.\n"
+" ??? .... Invalid. Index data is corrupt.\n"
+"\n"
+" The distinction between frep, drep, fprop and dprop is a mere internal\n"
+" classification used for various optimizations and does not affect the\n"
+" operational correctness.\n"
+"\n"
+" * Revision that the item belongs to (decimal)\n"
+" * Item number (decimal) within that revision\n"
+" * Modified FNV1a checksum (8 hex digits)\n"
+msgstr ""
+"Aufruf: svnfsfs dump-index ARCHIV_PFAD -r REV\n"
+"\n"
+"Gibt den Inhalt des Index der Revisions- oder Pack-Datei der Revision REV\n"
+"auf die Konsole aus. Nur verfügbar für Projektarchive im FSFS Format 7\n"
+"(SVN 1.9+). Die ausgegebene Tabelle beinhaltet Kopfdaten in der ersten Zeile\n"
+"gefolgt von einer Zeile je Indexeintrag, geordnet nach Position in der\n"
+"Revisions- / Pack-Datei. Spalten:\n"
+"\n"
+" * Offset an dem das Element beginnt in Byte (hexadezimal)\n"
+" * Länge des Elements in Byte (hexadezimal)\n"
+" * Typ des Elements (Text), und zwar einen der Folgenden:\n"
+"\n"
+" none ... Nicht verwendeter Abschnitt. Dateninhalt sind NUL-Byte.\n"
+" frep ... Darstellung einer Datei.\n"
+" drep ... Darstellung eines Verzeichnisse.\n"
+" fprop .. Eigenschaft einer Datei.\n"
+" dprop .. Eigenschaft eines Verzeichnisses.\n"
+" node ... Knotenrevision.\n"
+" chgs ... Liste geänderter Pfade.\n"
+" rep .... Darstellung unbekannten Typs. Sollte nicht verwendet werden.\n"
+" ??? .... Ungültig. Indexdaten sind beschädigt.\n"
+"\n"
+" Die Unterscheidung zwischen frep, drep, fprop und dprop ist eine rein\n"
+" interne Einordnung für verschiedene Optimierungen und betrifft nicht die\n"
+" Korrektheit im normalen Betrieb.\n"
+"\n"
+" * Revision zu dem das Element gehört (dezimal)\n"
+" * Nummer des Elements in dieser Revision (dezimal)\n"
+" * Modifizierte FNV1a-Prüfsumme (8 hexadezimale Stellen)\n"
+
+#: ../svnfsfs/svnfsfs.c:188
+msgid ""
+"usage: svnfsfs load-index REPOS_PATH\n"
+"\n"
+"Read index contents from console. The format is the same as produced by the\n"
+"dump-index command, except that checksum as well as header are optional and will\n"
+"be ignored. The data must cover the full revision / pack file; the revision\n"
+"number is automatically extracted from input stream. No ordering is required.\n"
+msgstr ""
+"Aufruf: svnfsfs load-index ARCHIV_PFAD\n"
+"\n"
+"Liest den Inhalt des Index von der Konsole. Das Format entspricht der Ausgabe\n"
+"des Kommandos dump-index, außer dass die Prüfsummen und Kopfdaten optional sind\n"
+"und ignoriert werden. Die Daten müssen die vollständige Revisisions- oder Pack-\n"
+"datei abdecken; die Revisionsnummer wird automatisch aus dem Eingabestrom\n"
+"extrahiert. Keine besondere Reihenfolge erforderlich.\n"
+
+#: ../svnfsfs/svnfsfs.c:196
+msgid ""
+"usage: svnfsfs stats REPOS_PATH\n"
+"\n"
+"Write object size statistics to console.\n"
+msgstr ""
+"Aufruf: svnfsfs stats ARCHIV_PFAD\n"
+"\n"
+"Gibt Statistiken zu Objektgrößen aus.\n"
+
+#: ../svnfsfs/svnfsfs.c:216
+#, c-format
+msgid "%s repositories are not supported"
+msgstr "Projektarchive vom Typ %s werden nicht unterstützt"
+
+#: ../svnfsfs/svnfsfs.c:232
+msgid ""
+"general usage: svnfsfs SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion FSFS repository manipulation tool.\n"
+"Type 'svnfsfs help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnfsfs --version' to see the program version.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+"Aufruf: svnfsfs UNTERBEFEHL ARCHIV_PFAD [Optionen & Parameter ...]\n"
+"Werkzeug zur Manipulation von FSFS-Projektarchiven\n"
+"Geben Sie »svnfsfs help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
+" zu erhalten.\n"
+"Geben Sie »svnfsfs --version« ein, um die Programmversion und die Datei-\n"
+" systemmodule zu sehen.\n"
+"\n"
+"Verfügbare Unterbefehle:\n"
+
+#: ../svnfsfs/svnfsfs.c:459
+#, c-format
+msgid ""
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svnfsfs help %s' for usage.\n"
+msgstr ""
+"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
+"Geben Sie »svnfsfs help %s« für Hilfe ein.\n"
+
+#: ../svnfsfs/svnfsfs.c:503
+msgid "Try 'svnfsfs help' for more info"
+msgstr "Versuchen Sie »svnfsfs help« für weitere Informationen"
+
+#: ../svnlook/svnlook.c:118
msgid "show details for copies"
msgstr "Zeige Details für Kopien"
-#: ../svnlook/svnlook.c:120
+#: ../svnlook/svnlook.c:121
msgid "print differences against the copy source"
msgstr "Gibt Unterschiede gegenüber der Quelle der Kopie aus"
-#: ../svnlook/svnlook.c:123
+#: ../svnlook/svnlook.c:124
msgid "show full paths instead of indenting them"
msgstr "Zeige vollständige Pfade anstatt sie einzurücken"
-#: ../svnlook/svnlook.c:129
+#: ../svnlook/svnlook.c:130
msgid "maximum number of history entries"
msgstr "Maximale Anzahl von Logeinträgen"
-#: ../svnlook/svnlook.c:147
+#: ../svnlook/svnlook.c:151
msgid "operate on single directory only"
msgstr "Nicht rekursiv hinabsteigen"
-#: ../svnlook/svnlook.c:150
+#: ../svnlook/svnlook.c:154
msgid "specify revision number ARG"
msgstr "Revisionsnummer PAR angegeben"
-#: ../svnlook/svnlook.c:153
+#: ../svnlook/svnlook.c:157
msgid "operate on a revision property (use with -r or -t)"
msgstr ""
"auf einer Revisionseigenschaft arbeiten (mit -r\n"
" oder -t verwenden)"
-#: ../svnlook/svnlook.c:156
+#: ../svnlook/svnlook.c:160
msgid "show node revision ids for each path"
msgstr "gibt die IDs der Knotenrevisionen jedes Pfades aus"
-#: ../svnlook/svnlook.c:159
+#: ../svnlook/svnlook.c:163
msgid "show path's inherited properties"
msgstr "Gibt die geerbten Eigenschaften des Pfades aus"
-#: ../svnlook/svnlook.c:165
+#: ../svnlook/svnlook.c:169
msgid "be verbose"
msgstr "ausführliche Meldungen"
-#: ../svnlook/svnlook.c:174
+#: ../svnlook/svnlook.c:178
msgid ""
"Specify differencing options for external diff or\n"
" internal diff. Default: '-u'. Options are\n"
@@ -14364,6 +16547,7 @@ msgid ""
" amount of white space\n"
" -w, --ignore-all-space: Ignore all white space\n"
" --ignore-eol-style: Ignore changes in EOL style\n"
+" -U ARG, --context ARG: Show ARG lines of context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
"Gibt Optionen für ein externes Vergleichsprogramm oder die interne\n"
@@ -14380,10 +16564,16 @@ msgstr ""
" Ignoriert sämtliche Leerzeichen.\n"
" --ignore-eol-style:\n"
" Ignoriert Änderungen im Zeilenendestil.\n"
+" -U PAR, --context PAR: Gibt PAR Zeilen Kontext aus.\n"
" -p (--show-c-function):\n"
" Zeigt C-Funktionsname in Diff-Ausgabe."
-#: ../svnlook/svnlook.c:205
+#: ../svnlook/svnlook.c:199 ../svnrdump/svnrdump.c:134
+#: ../svnserve/svnserve.c:380 ../svnversion/svnversion.c:146
+msgid "no progress (only errors) to stderr"
+msgstr "keine Fortschrittsanzeige (nur Fehler) auf die Standardfehlerausgabe"
+
+#: ../svnlook/svnlook.c:211
msgid ""
"usage: svnlook author REPOS_PATH\n"
"\n"
@@ -14393,7 +16583,7 @@ msgstr ""
"\n"
"Gibt den Autor aus.\n"
-#: ../svnlook/svnlook.c:210
+#: ../svnlook/svnlook.c:216
msgid ""
"usage: svnlook cat REPOS_PATH FILE_PATH\n"
"\n"
@@ -14404,7 +16594,7 @@ msgstr ""
"Gibt den Inhalt einer Datei aus. Ein vorangestellter »/« im DATEI_PFAD ist\n"
"optional.\n"
-#: ../svnlook/svnlook.c:215
+#: ../svnlook/svnlook.c:221
msgid ""
"usage: svnlook changed REPOS_PATH\n"
"\n"
@@ -14414,7 +16604,7 @@ msgstr ""
"\n"
"Gibt die geänderten Pfade aus.\n"
-#: ../svnlook/svnlook.c:220
+#: ../svnlook/svnlook.c:226
msgid ""
"usage: svnlook date REPOS_PATH\n"
"\n"
@@ -14424,7 +16614,7 @@ msgstr ""
"\n"
"Gibt das Datum aus.\n"
-#: ../svnlook/svnlook.c:225
+#: ../svnlook/svnlook.c:231
msgid ""
"usage: svnlook diff REPOS_PATH\n"
"\n"
@@ -14434,7 +16624,7 @@ msgstr ""
"\n"
"Gibt Unterschiede von geänderten Dateien oder Eigenschaften im GNU-Stil aus.\n"
-#: ../svnlook/svnlook.c:232
+#: ../svnlook/svnlook.c:238
msgid ""
"usage: svnlook dirs-changed REPOS_PATH\n"
"\n"
@@ -14446,7 +16636,7 @@ msgstr ""
"Gibt diejenigen Pfade aus, die (durch Eigenschaftsmodifikationen) selbst\n"
"bzw. deren Dateien geändert wurden.\n"
-#: ../svnlook/svnlook.c:238
+#: ../svnlook/svnlook.c:244
msgid ""
"usage: svnlook filesize REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -14458,7 +16648,7 @@ msgstr ""
"Gibt die Größe (in Bytes) der in PFAD_IN_ARCHIV befindlichen Datei\n"
"aus, wie sie im Projektarchiv vorliegt.\n"
-#: ../svnlook/svnlook.c:244
+#: ../svnlook/svnlook.c:250
msgid ""
"usage: svnlook help [SUBCOMMAND...]\n"
"\n"
@@ -14468,7 +16658,7 @@ msgstr ""
"\n"
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
-#: ../svnlook/svnlook.c:249
+#: ../svnlook/svnlook.c:255
msgid ""
"usage: svnlook history REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -14480,7 +16670,7 @@ msgstr ""
"Gibt Informationen über die Historie eines Pfades im Projektarchiv aus (oder\n"
"über das Basisverzeichnis, falls kein Pfad angegeben wurde.)\n"
-#: ../svnlook/svnlook.c:255
+#: ../svnlook/svnlook.c:261
msgid ""
"usage: svnlook info REPOS_PATH\n"
"\n"
@@ -14490,7 +16680,7 @@ msgstr ""
"\n"
"Gibt den Autor, das Datum, die Größe der Logmeldung und die Logmeldung aus.\n"
-#: ../svnlook/svnlook.c:260
+#: ../svnlook/svnlook.c:266
msgid ""
"usage: svnlook lock REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -14500,7 +16690,7 @@ msgstr ""
"\n"
"Wenn eine Sperre für einen Pfad im Projektarchiv existiert, beschreibe diese.\n"
-#: ../svnlook/svnlook.c:265
+#: ../svnlook/svnlook.c:271
msgid ""
"usage: svnlook log REPOS_PATH\n"
"\n"
@@ -14510,7 +16700,7 @@ msgstr ""
"\n"
"Gibt die Logmeldung aus.\n"
-#: ../svnlook/svnlook.c:270
+#: ../svnlook/svnlook.c:276
msgid ""
"usage: 1. svnlook propget REPOS_PATH PROPNAME PATH_IN_REPOS\n"
" 2. svnlook propget --revprop REPOS_PATH PROPNAME\n"
@@ -14524,7 +16714,7 @@ msgstr ""
"Gibt den Rohwert einer Eigenschaft eines Pfades im Projektarchiv aus.\n"
"Mit --revprop wird der Rohwert einer Revisionseigenschaft ausgegeben.\n"
-#: ../svnlook/svnlook.c:279
+#: ../svnlook/svnlook.c:285
msgid ""
"usage: 1. svnlook proplist REPOS_PATH PATH_IN_REPOS\n"
" 2. svnlook proplist --revprop REPOS_PATH\n"
@@ -14540,7 +16730,7 @@ msgstr ""
"Mit --revprop werden Revisionseigenschaften ausgegeben.\n"
"Mit -v werden auch die Eigenschaftswerte ausgegeben.\n"
-#: ../svnlook/svnlook.c:290
+#: ../svnlook/svnlook.c:296
msgid ""
"usage: svnlook tree REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -14552,7 +16742,7 @@ msgstr ""
"Gibt den Baum beginnend bei PFAD_IN_PROJ aus (falls angegeben, sonst an der\n"
"Basis des Baumes), wobei optional die IDs der Knotenrevisionen ausgegeben werden.\n"
-#: ../svnlook/svnlook.c:296
+#: ../svnlook/svnlook.c:302
msgid ""
"usage: svnlook uuid REPOS_PATH\n"
"\n"
@@ -14562,7 +16752,7 @@ msgstr ""
"\n"
"Gibt die UUID des Projektarchivs aus.\n"
-#: ../svnlook/svnlook.c:301
+#: ../svnlook/svnlook.c:307
msgid ""
"usage: svnlook youngest REPOS_PATH\n"
"\n"
@@ -14572,28 +16762,28 @@ msgstr ""
"\n"
"Gibt die neueste Revisionsnummer aus.\n"
-#: ../svnlook/svnlook.c:861
+#: ../svnlook/svnlook.c:870
#, c-format
msgid "Copied: %s (from rev %ld, %s)\n"
msgstr "Kopiert: %s (von Rev %ld, %s)\n"
-#: ../svnlook/svnlook.c:929
+#: ../svnlook/svnlook.c:938
msgid "Added"
msgstr "Hinzugefügt"
-#: ../svnlook/svnlook.c:930
+#: ../svnlook/svnlook.c:939
msgid "Deleted"
msgstr "Gelöscht"
-#: ../svnlook/svnlook.c:931
+#: ../svnlook/svnlook.c:940
msgid "Modified"
msgstr "Geändert"
-#: ../svnlook/svnlook.c:932
+#: ../svnlook/svnlook.c:941
msgid "Index"
msgstr "Index"
-#: ../svnlook/svnlook.c:943
+#: ../svnlook/svnlook.c:952
msgid ""
"(Binary files differ)\n"
"\n"
@@ -14601,30 +16791,30 @@ msgstr ""
"(Binärdateien sind unterschiedlich)\n"
"\n"
-#: ../svnlook/svnlook.c:1222
+#: ../svnlook/svnlook.c:1232
msgid "unknown"
msgstr "unbekannt"
-#: ../svnlook/svnlook.c:1279
+#: ../svnlook/svnlook.c:1289
#, c-format
msgid "Transaction '%s' is not based on a revision; how odd"
msgstr "Transaktion »%s« ist nicht von einer Revision abgeleitet, wie eigenartig"
-#: ../svnlook/svnlook.c:1422
+#: ../svnlook/svnlook.c:1432
#, c-format
msgid "'%s' is a URL, probably should be a path"
msgstr "»%s« ist eine URL, sollte vermutlich ein Pfad sein"
-#: ../svnlook/svnlook.c:1445 ../svnlook/svnlook.c:1468
+#: ../svnlook/svnlook.c:1455 ../svnlook/svnlook.c:1478
#, c-format
msgid "Path '%s' is not a file"
msgstr "Pfad »%s« ist keine Datei"
-#: ../svnlook/svnlook.c:1604
+#: ../svnlook/svnlook.c:1614
msgid "History item limit reached"
msgstr "Beschränkung für Anzahl der Verlaufselemente erreicht"
-#: ../svnlook/svnlook.c:1623
+#: ../svnlook/svnlook.c:1633
#, c-format
msgid ""
"REVISION PATH <ID>\n"
@@ -14633,7 +16823,7 @@ msgstr ""
"REVISION PFAD <ID>\n"
"-------- ---------\n"
-#: ../svnlook/svnlook.c:1628
+#: ../svnlook/svnlook.c:1638
#, c-format
msgid ""
"REVISION PATH\n"
@@ -14642,58 +16832,65 @@ msgstr ""
"REVISION PFAD\n"
"-------- ----\n"
-#: ../svnlook/svnlook.c:1700
+#: ../svnlook/svnlook.c:1711
#, c-format
msgid "Property '%s' not found on revision %ld"
msgstr "Eigenschaft »%s« wurde in Revision %ld nicht gefunden"
-#: ../svnlook/svnlook.c:1709
+#: ../svnlook/svnlook.c:1715
+#, c-format
+msgid "Property '%s' not found on transaction %s"
+msgstr "Eigenschaft »%s« wurde in Transaktion %s nicht gefunden"
+
+#: ../svnlook/svnlook.c:1724
#, c-format
msgid "Property '%s' not found on path '%s' or inherited from a parent in revision %ld"
msgstr "Eigenschaft »%s« wurde im Pfad »%s« in Revision %ld nicht gefunden und nicht vom übergeordneten Element geerbt"
-#: ../svnlook/svnlook.c:1715
+#: ../svnlook/svnlook.c:1730
#, c-format
msgid "Property '%s' not found on path '%s' in revision %ld"
msgstr "Eigenschaft »%s« wurde im Pfad »%s« in Revision %ld nicht gefunden"
-#: ../svnlook/svnlook.c:1723
+#: ../svnlook/svnlook.c:1738
#, c-format
msgid "Property '%s' not found on path '%s' or inherited from a parent in transaction %s"
msgstr "Eigenschaft »%s« wurde im Pfad »%s« in Transaktion %s nicht gefunden und nicht vom übergeordneten Element geerbt"
-#: ../svnlook/svnlook.c:1729
+#: ../svnlook/svnlook.c:1744
#, c-format
msgid "Property '%s' not found on path '%s' in transaction %s"
msgstr "Eigenschaft »%s« wurde im Pfad »%s« in Transaktion %s nicht gefunden"
-#: ../svnlook/svnlook.c:2064
+#: ../svnlook/svnlook.c:2080
msgid "Missing repository path argument"
msgstr "Fehlende Option für Pfad des Projektarchivs"
-#: ../svnlook/svnlook.c:2216
+#: ../svnlook/svnlook.c:2232
msgid ""
"general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository inspection tool.\n"
+"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnlook --version' to see the program version and FS modules.\n"
"Note: any subcommand which takes the '--revision' and '--transaction'\n"
" options will, if invoked without one of those options, act on\n"
" the repository's youngest revision.\n"
-"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
-"Type 'svnlook --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
"Aufruf: svnlook UNTERBEFEHL ARCHIV_PFAD [Optionen & Parameter ...]\n"
+"Werkzeug zur Inspektion von Projektarchiven.\n"
+"Geben Sie »svnlook help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
+" zu erhalten.\n"
+"Geben Sie »svnlook --version« ein, um die Programmversion und die verfügbaren\n"
+" Dateisystemmodule anzuzeigen.\n"
"Hinweis: Alle Unterbefehle, die die Parameter »--revision« und »--transaction«\n"
" akzeptieren, werden ohne diese Parameter die neueste\n"
" Revision des Projektarchivs verwenden.\n"
-"Geben Sie »svnlook help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
-" zu erhalten.\n"
-"Geben Sie »svnlook --version« ein, um die Programmversion und die Datei-\n"
-" systemmodule zu sehen.\n"
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svnlook/svnlook.c:2294
+#: ../svnlook/svnlook.c:2311
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -14708,50 +16905,50 @@ msgstr[1] ""
"Kommentar (%i Zeilen):\n"
"%s\n"
-#: ../svnlook/svnlook.c:2346
+#: ../svnlook/svnlook.c:2363
#, c-format
msgid "Missing propname argument"
msgstr "Fehlender PROPNAME Parameter"
-#: ../svnlook/svnlook.c:2347
+#: ../svnlook/svnlook.c:2364
#, c-format
msgid "Missing propname and repository path arguments"
msgstr "Eigenschaftsname und Pfad im Projektarchiv nicht angegeben"
-#: ../svnlook/svnlook.c:2353
+#: ../svnlook/svnlook.c:2370
msgid "Missing propname or repository path argument"
msgstr "Eigenschaftsname oder Pfad im Projektarchiv nicht angegeben"
-#: ../svnlook/svnlook.c:2517
+#: ../svnlook/svnlook.c:2523
msgid "Invalid revision number supplied"
msgstr "Ungültige Revisionsnummer angegeben"
-#: ../svnlook/svnlook.c:2629
+#: ../svnlook/svnlook.c:2637
msgid "The '--transaction' (-t) and '--revision' (-r) arguments cannot co-exist"
msgstr ""
"Die Parameter »--transaction« (-t) und »--revision« (-r) können nicht\n"
"gleichzeitig angegeben werden"
-#: ../svnlook/svnlook.c:2636
+#: ../svnlook/svnlook.c:2644
msgid "Cannot use the '--show-inherited-props' option with the '--revprop' option"
msgstr "Die Option »--show-inherited-props« kann nicht zusammen mit der Option »--revprop« verwendet werden"
-#: ../svnlook/svnlook.c:2695
+#: ../svnlook/svnlook.c:2701
#, c-format
msgid "Try 'svnadmin verify' instead.\n"
msgstr "Versuchen Sie stattdessen »svnadmin verify«.\n"
-#: ../svnlook/svnlook.c:2729
+#: ../svnlook/svnlook.c:2734
#, c-format
msgid "Repository argument required\n"
msgstr "Projektarchiv Parameter erforderlich\n"
-#: ../svnlook/svnlook.c:2738
+#: ../svnlook/svnlook.c:2743
#, c-format
msgid "'%s' is a URL when it should be a path\n"
msgstr "»%s« ist eine URL obwohl es ein Pfad sein sollte\n"
-#: ../svnlook/svnlook.c:2790
+#: ../svnlook/svnlook.c:2793
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14760,14 +16957,20 @@ msgstr ""
"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
"Geben Sie »svnlook help %s« ein, um Hilfe zu erhalten.\n"
-#: ../svnlook/svnlook.c:2833
+#: ../svnlook/svnlook.c:2836
msgid "Try 'svnlook help' for more info"
msgstr "Versuchen Sie »svnlook help« für weitere Informationen"
-#: ../svnmucc/svnmucc.c:927
+#: ../svnmucc/svnmucc.c:258
+#, c-format
+msgid "Type 'svnmucc --help' for usage.\n"
+msgstr "Geben Sie »svnmucc --help« für weitere Hilfe ein.\n"
+
+#: ../svnmucc/svnmucc.c:266
msgid ""
-"Subversion multiple URL command client\n"
"usage: svnmucc ACTION...\n"
+"Subversion multiple URL command client.\n"
+"Type 'svnmucc --version' to see the program version and RA modules.\n"
"\n"
" Perform one or more Subversion repository URL-based ACTIONs, committing\n"
" the result as a (single) new revision.\n"
@@ -14797,9 +17000,18 @@ msgid ""
" prompt only if standard input is a terminal)\n"
" --force-interactive : do interactive prompting even if standard\n"
" input is not a terminal\n"
-" --trust-server-cert : accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but\n"
-" only with '--non-interactive')\n"
+" --trust-server-cert : deprecated; same as --trust-unknown-ca\n"
+" --trust-unknown-ca : with --non-interactive, accept SSL server\n"
+" certificates from unknown certificate authorities\n"
+" --trust-cn-mismatch : with --non-interactive, accept SSL server\n"
+" certificates even if the server hostname does not\n"
+" match the certificate's common name attribute\n"
+" --trust-expired : with --non-interactive, accept expired SSL server\n"
+" certificates\n"
+" --trust-not-yet-valid : with --non-interactive, accept SSL server\n"
+" certificates from the future\n"
+" --trust-other-failure : with --non-interactive, accept SSL server\n"
+" certificates with failures other than the above\n"
" -X [--extra-args] ARG : append arguments from file ARG (one per line;\n"
" use \"-\" to read from standard input)\n"
" --config-dir ARG : use ARG to override the config directory\n"
@@ -14807,8 +17019,10 @@ msgid ""
" --no-auth-cache : do not cache authentication tokens\n"
" --version : print version information\n"
msgstr ""
-"Subversion Multi-URL-Kommando Client\n"
"Aufruf: svnmucc AKTION...\n"
+"Subversion Multi-URL-Kommando Client\n"
+"Geben Sie »svnmucc --version« ein, um die Programmversion und die\n"
+"Zugriffsmodule zu sehen.\n"
"\n"
" Führt eine oder mehrere AKTIONen auf URLs von Subversion Projektarchiven aus,\n"
" mit Ãœbertragung des Ergebnisses als eine neue Revision.\n"
@@ -14836,11 +17050,18 @@ msgstr ""
" NAME[=WERT]\n"
" --non-interactive : unterdrückt interaktive Nachfragen (Vorgabe ist nur\n"
" nachfragen, wenn Standardeingabe ein Terminal ist)\n"
-" --force-interactive : erzwingt interaktives Nachfragen, auch wenn\n"
-" Standardeingabe kein Terminal ist)\n"
-" --trust-server-cert : akzeptiert SSL-Serverzertifikate von unbekannten\n"
-" Zertifizierungsstellen ohne Nachfrage (aber nur mit\n"
-" »--non-interactive«)\n"
+" --trust-server-cert : veraltet; identisch mit --trust-unknown-ca\n"
+" --trust-unknown-ca : mit --non-interactive, akzeptiert SSL Server-\n"
+" Zertifikate von unbekannten Zertifizierungsstellen\n"
+" --trust-cn-mismatch : mit --non-interactive, akzeptiert SSL Server-\n"
+" Zertifikate auch falls der Hostname nicht mit dem\n"
+" Common Name Attribut im Zertifikat übereinstimmt\n"
+" --trust-expired : mit --non-interactive, akzeptiert SSL Server-\n"
+" Zertifikate die abgelaufen sind\n"
+" --trust-not-yet-valid : mit --non-interactive, akzeptiert SSL Server-\n"
+" Zertifikate die noch nicht gültig sind\n"
+" --trust-other-failure : mit --non-interactive, akzeptiert SSL server-\n"
+" Zertifikate mit anderen als den vorherigen Fehlern\n"
" -X [--extra-args] PAR : liest weitere Arguments aus Datei PAR (zeilenweise;\n"
" : Die Angabe von \"-\" liest von der Standardeingabe)\n"
" --config-dir PAR : verwendet ARG als Konfigurationsverzeichnis\n"
@@ -14848,22 +17069,27 @@ msgstr ""
" --no-auth-cache : speichert Anmeldeinformationen nicht zwischen\n"
" --version : gibt Versionsinformationen aus\n"
-#: ../svnmucc/svnmucc.c:1003
+#: ../svnmucc/svnmucc.c:349
msgid "--message (-m), --file (-F), and --with-revprop=svn:log are mutually exclusive"
msgstr "--message (-m), --file (-F), und --with-revprop=svn:log schließen sich gegenseitig aus"
-#: ../svnrdump/load_editor.c:382 ../svnsync/svnsync.c:327
+#: ../svnmucc/svnmucc.c:590
+#, c-format
+msgid "Invalid revision number '%s'"
+msgstr "Ungültige Revisionsnummer »%s«"
+
+#: ../svnrdump/load_editor.c:231 ../svnsync/svnsync.c:362
#, c-format
msgid "Failed to get lock on destination repos, currently held by '%s'\n"
msgstr ""
"Konnte Sperre für Zielprojektarchiv nicht erhalten, die zurzeit von\n"
"»%s« gehalten wird\n"
-#: ../svnrdump/load_editor.c:526
+#: ../svnrdump/load_editor.c:375
msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7."
msgstr "Zielserver unterstützt keine atomaren Änderungen von Revisionseigenschaften; Verwenden Sie dort 1.7"
-#: ../svnrdump/svnrdump.c:101
+#: ../svnrdump/svnrdump.c:113
msgid ""
"usage: svnrdump dump URL [-r LOWER[:UPPER]]\n"
"\n"
@@ -14877,7 +17103,7 @@ msgstr ""
"in einem portablen »Dump«-Format auf die Standardausgabe aus. Falls nur VON\n"
" angegeben wurde, wird nur diese Revision ausgegeben.\n"
-#: ../svnrdump/svnrdump.c:107
+#: ../svnrdump/svnrdump.c:119
msgid ""
"usage: svnrdump load URL\n"
"\n"
@@ -14887,7 +17113,7 @@ msgstr ""
"\n"
"Liest einen Datenstrom im »Dump«-Format von der Standardeingabe in ein Projektarchive an entfertner URL.\n"
-#: ../svnrdump/svnrdump.c:111
+#: ../svnrdump/svnrdump.c:123
msgid ""
"usage: svnrdump help [SUBCOMMAND...]\n"
"\n"
@@ -14897,24 +17123,30 @@ msgstr ""
"\n"
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
-#: ../svnrdump/svnrdump.c:124
+#: ../svnrdump/svnrdump.c:136
msgid "dump incrementally"
msgstr "Inkrementell ausgeben"
-#: ../svnrdump/svnrdump.c:142 ../svnserve/svnserve.c:281
-#: ../svnversion/svnversion.c:139
+#: ../svnrdump/svnrdump.c:138
+msgid "skip revision property ARG (e.g., \"svn:author\")"
+msgstr "Revisionseigenschaft PAR überspringen (z.B. »svn:author«)"
+
+#: ../svnrdump/svnrdump.c:156 ../svnserve/svnserve.c:372
+#: ../svnversion/svnversion.c:142
msgid "display this help"
msgstr "Hilfe anzeigen"
-#: ../svnrdump/svnrdump.c:731
+#: ../svnrdump/svnrdump.c:683
msgid ""
"general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+"Subversion remote repository dump and load tool.\n"
"Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnrdump --version' to see the program version and RA modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
"Aufruf: svnrdump UNTERBEFEHL URL [-r VON[:BIS]]\n"
+"Werkzeug zum Ausgeben und Laden von Projektarchiven über das Netzwerk.\n"
"Geben Sie »svnrdump help <Unterbefehl>« ein, um Hilfe zu einem\n"
"Unterbefehl zu erhalten.\n"
"Geben Sie »svnrdump --version« ein, um die Programmversion und die\n"
@@ -14922,20 +17154,20 @@ msgstr ""
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svnrdump/svnrdump.c:775 ../svnrdump/svnrdump.c:809
+#: ../svnrdump/svnrdump.c:728 ../svnrdump/svnrdump.c:762
msgid "Unsupported revision specifier used; use only integer values or 'HEAD'"
msgstr "Nicht unterstützte Angabe für Revision; verwenden Sie nur ganze Zahlen oder »HEAD«"
-#: ../svnrdump/svnrdump.c:783 ../svnrdump/svnrdump.c:817
+#: ../svnrdump/svnrdump.c:736 ../svnrdump/svnrdump.c:770
#, c-format
msgid "Revision '%ld' does not exist"
msgstr "Revision »%ld« existiert nicht"
-#: ../svnrdump/svnrdump.c:827
+#: ../svnrdump/svnrdump.c:780
msgid "LOWER revision cannot be greater than UPPER revision; consider reversing your revision range"
msgstr "Revision VON kann nicht größer als Revision BIS sein; Ändern Sie ggf. die Reihenfolge der Angabe"
-#: ../svnrdump/svnrdump.c:1072
+#: ../svnrdump/svnrdump.c:1039
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14948,71 +17180,86 @@ msgstr ""
msgid "Could not initialize the SASL library"
msgstr "Konnte die SASL-Bibliothek nicht initialisieren"
-#: ../svnserve/cyrus_auth.c:260
+#: ../svnserve/cyrus_auth.c:191
+#, c-format
+msgid "Initial token is too long"
+msgstr "Einleitende Markierung ist zu lang"
+
+#: ../svnserve/cyrus_auth.c:222
+#, c-format
+msgid "Step response is too long"
+msgstr "Antwort auf Protokollschritt zu lang"
+
+#: ../svnserve/cyrus_auth.c:272
#, c-format
msgid "Can't get hostname"
msgstr "Kann den Hostnamen nicht erhalten"
-#: ../svnserve/cyrus_auth.c:325
+#: ../svnserve/cyrus_auth.c:329
msgid "Could not obtain the list of SASL mechanisms"
msgstr "Konnte die Liste der SASL-Mechanismen nicht erhalten"
-#: ../svnserve/cyrus_auth.c:367
+#: ../svnserve/cyrus_auth.c:372
msgid "Couldn't obtain the authenticated username"
msgstr "Kann den angemeldeten Benutzername nicht erhalten"
-#: ../svnserve/serve.c:2058
+#: ../svnserve/serve.c:2082
msgid "Path is not a string"
msgstr "Pfad ist keine Zeichenkette"
-#: ../svnserve/serve.c:2215
+#: ../svnserve/serve.c:2252
msgid "Log revprop entry not a string"
msgstr "Log-Revisionseigenschaftseintrag ist keine Zeichenkette"
-#: ../svnserve/serve.c:2221
+#: ../svnserve/serve.c:2258
#, c-format
msgid "Unknown revprop word '%s' in log command"
msgstr "Unbekanntes Revisionseigenschaftswort »%s« in Log-Kommando"
-#: ../svnserve/serve.c:2237
+#: ../svnserve/serve.c:2274
msgid "Log path entry not a string"
msgstr "Logpfadeintrag ist keine Zeichenkette"
-#: ../svnserve/svnserve.c:162
+#: ../svnserve/serve.c:2874 ../svnserve/serve.c:3050
+#, c-format
+msgid "No result for '%s'."
+msgstr "Kein Ergebnis für »%s«."
+
+#: ../svnserve/svnserve.c:216
msgid "daemon mode"
msgstr "Daemonmodus"
-#: ../svnserve/svnserve.c:163
+#: ../svnserve/svnserve.c:217
msgid "inetd mode"
msgstr "Inetd-Modus"
-#: ../svnserve/svnserve.c:164
+#: ../svnserve/svnserve.c:218
msgid "tunnel mode"
msgstr "Tunnelmodus"
-#: ../svnserve/svnserve.c:165
+#: ../svnserve/svnserve.c:219
msgid "listen-once mode (useful for debugging)"
msgstr "»listen-once«-Modus (nützlich zum Debuggen)"
-#: ../svnserve/svnserve.c:168
+#: ../svnserve/svnserve.c:222
msgid "Windows service mode (Service Control Manager)"
msgstr "Windows-Service-Modus (Service Control Manager)"
-#: ../svnserve/svnserve.c:170
+#: ../svnserve/svnserve.c:224
msgid "root of directory to serve"
msgstr "Basis des bereitzustellenden Verzeichnisses"
-#: ../svnserve/svnserve.c:172
+#: ../svnserve/svnserve.c:226
msgid "force read only, overriding repository config file"
msgstr ""
"Erzwinge Schreibschutz. Setze Einstellung in der\n"
"Projektarchivkonfiguration außer Kraft."
-#: ../svnserve/svnserve.c:174
+#: ../svnserve/svnserve.c:228
msgid "read configuration from file ARG"
msgstr "Konfiguration aus Datei PAR lesen"
-#: ../svnserve/svnserve.c:177
+#: ../svnserve/svnserve.c:231
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, service, listen-once]"
@@ -15020,7 +17267,7 @@ msgstr ""
"abzuhörender Port. Die Vorgabe ist 3690.\n"
" [Modus: daemon, service, listen-once]"
-#: ../svnserve/svnserve.c:181
+#: ../svnserve/svnserve.c:235
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, listen-once]"
@@ -15028,7 +17275,7 @@ msgstr ""
"abzuhörender Port. Die Vorgabe ist 3690.\n"
" [Modus: daemon, listen-once]"
-#: ../svnserve/svnserve.c:187
+#: ../svnserve/svnserve.c:241
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
@@ -15038,7 +17285,7 @@ msgstr ""
" Als Vorgabe hört svnserve auf allen Adressen.\n"
" [Modus: daemon, service, listen-once]"
-#: ../svnserve/svnserve.c:193
+#: ../svnserve/svnserve.c:247
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
@@ -15048,7 +17295,7 @@ msgstr ""
" Als Vorgabe hört svnserve auf allen Adressen.\n"
" [Modus: daemon, listen-once]"
-#: ../svnserve/svnserve.c:200
+#: ../svnserve/svnserve.c:254
msgid ""
"prefer IPv6 when resolving the listen hostname\n"
" [IPv4 is preferred by default. Using IPv4 and IPv6\n"
@@ -15061,7 +17308,7 @@ msgstr ""
" nicht unterstützt. Verwenden Sie bei Bedarf inetd\n"
" oder den Tunnel-Modus."
-#: ../svnserve/svnserve.c:208
+#: ../svnserve/svnserve.c:262
msgid ""
"compression level to use for network transmissions\n"
" [0 .. no compression, 5 .. default, \n"
@@ -15071,53 +17318,55 @@ msgstr ""
" [0 .. keine Kompression, 5 .. Vorgabe, \n"
" 9 .. maximale Kompression]"
-#: ../svnserve/svnserve.c:214
-#, fuzzy
+#: ../svnserve/svnserve.c:268
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations.\n"
" Default is 16.\n"
-" [used for FSFS repositories only]"
+" 0 switches to dynamically sized caches.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"Größe des extra Zwischenspeichers im RAM in MB zur\n"
-" Minimierung redundanter Operationen. Vorgabe: 16.\n"
-" [nur für FSFS-Projektarchive verwendet]"
+" Minimierung redundanter Operationen.\n"
+" Vorgabe ist 16.\n"
+" 0 wählt Größe automatisch aus.\n"
+" [nur für FSFS- und FSX-Projektarchive verwendet]"
-#: ../svnserve/svnserve.c:222
+#: ../svnserve/svnserve.c:278
msgid ""
"enable or disable caching of deltas between older\n"
" revisions.\n"
-" Default is no.\n"
-" [used for FSFS repositories only]"
+" Default is yes.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"Aktiviert oder deaktiviert die Zwischenspeicherung von\n"
" Deltas zwischen älteren Revisionen.\n"
-" Vorgabe ist »no«.\n"
-" [nur für FSFS-Projektarchive verwendet]"
+" Vorgabe ist »yes«.\n"
+" [nur für FSFS und FSX-Projektarchive verwendet]"
-#: ../svnserve/svnserve.c:230
+#: ../svnserve/svnserve.c:286
msgid ""
"enable or disable caching of file contents\n"
" Default is yes.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"Aktiviert oder deaktiviert die Zwischenspeicherung von Dateiinhalten\n"
" Vorgabe ist »yes«.\n"
-" [nur für FSFS-Projektarchive verwendet]"
+" [nur für FSFS und FSX-Projektarchive verwendet]"
-#: ../svnserve/svnserve.c:236
+#: ../svnserve/svnserve.c:292
msgid ""
"enable or disable caching of revision properties.\n"
" Consult the documentation before activating this.\n"
" Default is no.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"Aktiviert oder deaktiviert die Zwischenspeicherung von Revisionseigenschaften.\n"
" Schlagen Sie in der Dokumentation nach, bevor Sie dies aktivieren.\n"
" Vorgabe ist »no«.\n"
-" [nur für FSFS-Projektarchive verwendet]"
+" [nur für FSFS und FSX-Projektarchive verwendet]"
-#: ../svnserve/svnserve.c:244
+#: ../svnserve/svnserve.c:300
msgid ""
"Optimize network handling based on the assumption\n"
" that most clients are connected with a bitrate of\n"
@@ -15129,13 +17378,62 @@ msgstr ""
" PAR Mbit/s verbunden sind.\n"
" Vorgabe 0 (keine Optimierung)."
+#: ../svnserve/svnserve.c:308
+msgid ""
+"Parse and cache all data found in block instead\n"
+" of just the requested item.\n"
+" Default is no.\n"
+" [used for FSFS repositories in 1.9 format only]"
+msgstr ""
+"Liest und speichert alle in einem Block gefundenen Daten\n"
+"\n"
+" statt nur die des angefordertes Elements.\n"
+" Vorgabe ist »no«.\n"
+" [nur für FSFS-Projektarchive im Format 1.9 verwendet]"
+
#. ### Making the assumption here that WIN32 never has fork and so
#. * ### this option never exists when --service exists.
-#: ../svnserve/svnserve.c:254
+#: ../svnserve/svnserve.c:318
msgid "use threads instead of fork [mode: daemon]"
msgstr "Verwende Threads anstelle von »fork« [Modus: daemon]"
-#: ../svnserve/svnserve.c:258
+#: ../svnserve/svnserve.c:321
+msgid ""
+"Minimum number of server threads, even if idle.\n"
+" Caped to max-threads; minimum value is 0.\n"
+" Default is 1.\n"
+" [used only with --threads]"
+msgstr ""
+"Mindestanzahl der Serverthreads, selbst wenn inaktiv.\n"
+" Auf »max-threads« beschränkt; Mindestwert 0.\n"
+" Vorgabe ist 1.\n"
+" [nur zusammen mit --threads verwendet]"
+
+#: ../svnserve/svnserve.c:330
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 64.\n"
+" [used only with --threads]"
+msgstr ""
+"Höchstanzahl der Serverthreads, selbst wenn mehr\n"
+" Verbindungen anliegen. Mindestwert 1.\n"
+" Vorgabe ist 64.\n"
+" [nur zusammen mit --threads verwendet]"
+
+#: ../svnserve/svnserve.c:339
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 256.\n"
+" [used only with --threads]"
+msgstr ""
+"Höchstanzahl der Serverthreads, selbst wenn mehr\n"
+" Verbindungen anliegen. Mindestwert 1.\n"
+" Vorgabe ist 256.\n"
+" [nur zusammen mit --threads verwendet]"
+
+#: ../svnserve/svnserve.c:349
msgid ""
"run in foreground (useful for debugging)\n"
" [mode: daemon]"
@@ -15143,19 +17441,19 @@ msgstr ""
"Im Vordergrund starten (nützlich zum Debuggen)\n"
" [Modus: daemon]"
-#: ../svnserve/svnserve.c:262
+#: ../svnserve/svnserve.c:353
msgid ""
-"handle one connection at a time in the parent process\n"
-" (useful for debugging)"
+"handle one connection at a time in the parent\n"
+" process (useful for debugging)"
msgstr ""
-"Bearbeitet im Elternprozess nur eine eingegende Verbindung gleichzeitig\n"
-" (nützlich zum Debuggen)"
+"Bearbeitet eingehende Verbindungen einzeln im Eltern-\n"
+" prozess (nützlich zum Debuggen)"
-#: ../svnserve/svnserve.c:266
+#: ../svnserve/svnserve.c:357
msgid "svnserve log file"
msgstr "Protokolldatei von svnserve"
-#: ../svnserve/svnserve.c:269
+#: ../svnserve/svnserve.c:360
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once, service]"
@@ -15163,7 +17461,7 @@ msgstr ""
"Schreibe Server-Prozess-ID in Datei PAR\n"
" [Modus: daemon, listen-once, service]"
-#: ../svnserve/svnserve.c:273
+#: ../svnserve/svnserve.c:364
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once]"
@@ -15171,7 +17469,7 @@ msgstr ""
"Schreibe Server-Prozess-ID in Datei PAR\n"
" [Modus: daemon, listen-once]"
-#: ../svnserve/svnserve.c:278
+#: ../svnserve/svnserve.c:369
msgid ""
"tunnel username (default is current uid's name)\n"
" [mode: tunnel]"
@@ -15179,7 +17477,7 @@ msgstr ""
"Tunnel-Benutzername (Vorgabe ist der Name zur aktuellen UID)\n"
" [Modus: tunnel]"
-#: ../svnserve/svnserve.c:283
+#: ../svnserve/svnserve.c:374
msgid ""
"virtual host mode (look for repo in directory\n"
" of provided hostname)"
@@ -15187,32 +17485,40 @@ msgstr ""
"Virtual-Host-Modus (Sucht nach Projektarchiv dem Verzeichnis\n"
" das dem übertragenen Hostnamen entspricht)"
-#: ../svnserve/svnserve.c:300
+#: ../svnserve/svnserve.c:390
#, c-format
msgid "Type '%s --help' for usage.\n"
msgstr "Geben Sie »%s --help« für weitere Hilfe ein.\n"
-#: ../svnserve/svnserve.c:310
+#: ../svnserve/svnserve.c:399
msgid ""
"usage: svnserve [-d | -i | -t | -X | --service] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
"Aufruf: svnserve [-d | -i | -t | -X | --service] [Optionen]\n"
+"Subversion Projektarchiv-Server.\n"
+"Geben Sie »svnserve --version« ein, um die Programmversion zu sehen.\n"
"\n"
"Gültige Optionen:\n"
-#: ../svnserve/svnserve.c:316
+#: ../svnserve/svnserve.c:408
msgid ""
"usage: svnserve [-d | -i | -t | -X] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
"Aufruf: svnserve [-d | -i | -t | -X] [Optionen]\n"
+"Subversion Projektarchiv-Server.\n"
+"Geben Sie »svnserve --version« ein, um die Programmversion zu sehen.\n"
"\n"
"Gültige Optionen:\n"
-#: ../svnserve/svnserve.c:344
+#: ../svnserve/svnserve.c:438
msgid ""
"\n"
"Cyrus SASL authentication is available.\n"
@@ -15220,77 +17526,76 @@ msgstr ""
"\n"
"Cyrus-SASL-Authentifizierung ist verfügbar.\n"
-#: ../svnserve/svnserve.c:616
+#: ../svnserve/svnserve.c:524
+#, c-format
+msgid "Can't accept client connection"
+msgstr "Kann Clientverbindung nicht annehmen"
+
+#: ../svnserve/svnserve.c:796
#, c-format
msgid "Invalid port '%s'"
msgstr "Ungültiger Port »%s«"
-#: ../svnserve/svnserve.c:657
+#: ../svnserve/svnserve.c:832
#, c-format
-msgid "svnserve: Root path '%s' does not exist or is not a directory.\n"
-msgstr "svnserve: Wurzelpfad »%s« existiert nicht oder ist kein Verzeichnis.\n"
+msgid "Root path '%s' does not exist or is not a directory"
+msgstr "Wurzelpfad »%s« existiert nicht oder ist kein Verzeichnis."
-#: ../svnserve/svnserve.c:770
+#: ../svnserve/svnserve.c:955
msgid "You must specify exactly one of -d, -i, -t, --service or -X.\n"
msgstr "Sie müssen genau einen der Parameter -d, -i, -t, --service oder -X angeben.\n"
-#: ../svnserve/svnserve.c:773
+#: ../svnserve/svnserve.c:958
msgid "You must specify exactly one of -d, -i, -t or -X.\n"
msgstr "Sie müssen genau einen der Parameter -d, -i, -t oder -X angeben.\n"
-#: ../svnserve/svnserve.c:782
+#: ../svnserve/svnserve.c:969
msgid "You may only specify one of -T or --single-thread\n"
msgstr "Sie dürfen nur einen der Parameter -T und --single-thread angeben.\n"
-#: ../svnserve/svnserve.c:810
-#, c-format
-msgid "Option --tunnel-user is only valid in tunnel mode.\n"
-msgstr "Die Option --tunnel-user ist nur im Tunnelmodus zulässig.\n"
-
-#: ../svnserve/svnserve.c:829
-#, c-format
-msgid "Can't open stdout"
-msgstr "Kann Standardausgabe nicht öffnen"
+#: ../svnserve/svnserve.c:1019
+msgid "Option --tunnel-user is only valid in tunnel mode"
+msgstr "Die Option --tunnel-user ist nur im Tunnelmodus zulässig"
-#: ../svnserve/svnserve.c:883
+#: ../svnserve/svnserve.c:1088
#, c-format
msgid "svnserve: The --service flag is only valid if the process is started by the Service Control Manager.\n"
msgstr "svnserve: Die Option --service ist nur gültig, wenn der Prozess durch den Service Control Manager gestartet wurde.\n"
-#: ../svnserve/svnserve.c:933
+#: ../svnserve/svnserve.c:1139
#, c-format
msgid "Can't get address info"
msgstr "Kann Adressinformation nicht ermitteln"
-#: ../svnserve/svnserve.c:947
+#: ../svnserve/svnserve.c:1152
#, c-format
msgid "Can't create server socket"
msgstr "Kann Server-Socket nicht erzeugen"
-#: ../svnserve/svnserve.c:958
+#: ../svnserve/svnserve.c:1160
#, c-format
-msgid "Can't bind server socket"
-msgstr "Kann Server-Socket nicht anbinden"
+msgid "Can't set options on server socket"
+msgstr "Kann Optionen Server-Socket nicht einstellen"
-#: ../svnserve/svnserve.c:1056
+#: ../svnserve/svnserve.c:1166
#, c-format
-msgid "Can't accept client connection"
-msgstr "Kann Clientverbindung nicht annehmen"
+msgid "Can't bind server socket"
+msgstr "Kann Server-Socket nicht anbinden"
-#: ../svnserve/svnserve.c:1137
+#: ../svnserve/svnserve.c:1172
#, c-format
-msgid "Can't create threadattr"
-msgstr "Kann »Thread« Attribut nicht erzeugen"
+msgid "Can't listen on server socket"
+msgstr "Kann nicht am Server-Socket hören"
-#: ../svnserve/svnserve.c:1145
+#: ../svnserve/svnserve.c:1253
#, c-format
-msgid "Can't set detached state"
-msgstr "Kann nicht in den gelösten Status wechseln"
+msgid "Can't create thread pool"
+msgstr "Kann Thread-Pool nicht erzeugen"
-#: ../svnserve/svnserve.c:1158
+#: ../svnserve/svnserve.c:1316
#, c-format
-msgid "Can't create thread"
-msgstr "Kann Thread nicht erzeugen"
+msgid "Can't push task"
+msgstr "Kann Abarbeitung einer Anfrage nicht initiieren"
#: ../svnserve/winservice.c:346
#, c-format
@@ -15312,7 +17617,7 @@ msgstr "Konnte nicht mit dem Service Control Manager verbinden"
msgid "The service failed to start; an internal error occurred while starting the service"
msgstr "Der Dienst konnte nicht gestartet werden; ein interner Fehler trat beim Starten des Dienstes auf"
-#: ../svnsync/svnsync.c:92
+#: ../svnsync/svnsync.c:101
msgid ""
"usage: svnsync initialize DEST_URL SOURCE_URL\n"
"\n"
@@ -15356,7 +17661,7 @@ msgstr ""
"Anders ausgedrückt stellt das Zielprojektarchiv einen Spiegel des\n"
"Quellprojektarchivs dar, auf den nur lesend zugegriffen werden darf.\n"
-#: ../svnsync/svnsync.c:118
+#: ../svnsync/svnsync.c:127
msgid ""
"usage: svnsync synchronize DEST_URL [SOURCE_URL]\n"
"\n"
@@ -15380,7 +17685,7 @@ msgstr ""
"Benutzer oder Administratoren Schreibzugriff auf ZIEL_URL haben.\n"
"\n"
-#: ../svnsync/svnsync.c:131
+#: ../svnsync/svnsync.c:140
msgid ""
"usage:\n"
"\n"
@@ -15424,7 +17729,7 @@ msgstr ""
"und ist gleichbedeutend mit der Angabe der Option »-r PAR1[:PAR2]«\n"
# CHECKME: s/destination/source/?
-#: ../svnsync/svnsync.c:152
+#: ../svnsync/svnsync.c:161
msgid ""
"usage: svnsync info DEST_URL\n"
"\n"
@@ -15436,7 +17741,7 @@ msgstr ""
"Gibt Informationen über das Zielprojektarchiv der Synchronisation aus,\n"
"das sich unter ZIEL_URL befindet.\n"
-#: ../svnsync/svnsync.c:158
+#: ../svnsync/svnsync.c:167
msgid ""
"usage: svnsync help [SUBCOMMAND...]\n"
"\n"
@@ -15446,11 +17751,11 @@ msgstr ""
"\n"
"Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
-#: ../svnsync/svnsync.c:168
+#: ../svnsync/svnsync.c:177
msgid "print as little as possible"
msgstr "So wenig wie möglich ausgeben"
-#: ../svnsync/svnsync.c:170
+#: ../svnsync/svnsync.c:179
msgid ""
"operate on revision ARG (or range ARG1:ARG2)\n"
" A revision argument can be one of:\n"
@@ -15462,11 +17767,11 @@ msgstr ""
" ZAHL Revisionsnummer\n"
" »HEAD« neueste im Projektarchiv"
-#: ../svnsync/svnsync.c:178
+#: ../svnsync/svnsync.c:187
msgid "allow a non-empty destination repository"
msgstr "erlaubt nicht-leeres Zielprojektarchiv"
-#: ../svnsync/svnsync.c:190
+#: ../svnsync/svnsync.c:199
msgid ""
"specify a username ARG (deprecated;\n"
" see --source-username and --sync-username)"
@@ -15474,7 +17779,7 @@ msgstr ""
"gibt einen Benutzernamen PAR an (veraltet;\n"
" siehe --source-username und --sync-username)"
-#: ../svnsync/svnsync.c:194
+#: ../svnsync/svnsync.c:203
msgid ""
"specify a password ARG (deprecated;\n"
" see --source-password and --sync-password)"
@@ -15482,24 +17787,24 @@ msgstr ""
"gibt ein Passwort PAR an (veraltet;\n"
" siehe --source-password und --sync-password)"
-#: ../svnsync/svnsync.c:204
+#: ../svnsync/svnsync.c:231
msgid "connect to source repository with username ARG"
msgstr "verbindet mit dem Quellprojektarchiv mit dem Benutzernamen PAR"
-#: ../svnsync/svnsync.c:206
+#: ../svnsync/svnsync.c:233
msgid "connect to source repository with password ARG"
msgstr "verbindet mit dem Quellprojektarchiv mit dem Passwort PAR"
# FIXME: s/sync/synced/, option sync-username
-#: ../svnsync/svnsync.c:208
+#: ../svnsync/svnsync.c:235
msgid "connect to sync repository with username ARG"
msgstr "verbindet mit synchronisiertem Projektarchiv mit Benutzernamen PAR"
-#: ../svnsync/svnsync.c:210
+#: ../svnsync/svnsync.c:237
msgid "connect to sync repository with password ARG"
msgstr "verbindet mit synchronisiertem Projektarchiv mit Passwort PAR"
-#: ../svnsync/svnsync.c:222
+#: ../svnsync/svnsync.c:249
msgid ""
"convert translatable properties from encoding ARG\n"
" to UTF-8. If not specified, then properties are\n"
@@ -15509,7 +17814,7 @@ msgstr ""
" nach UTF-8. Wenn nicht angegeben, werden die\n"
" Eigenschaften als in UTF-8 kodiert angenommen."
-#: ../svnsync/svnsync.c:228
+#: ../svnsync/svnsync.c:255
msgid ""
"Disable built-in locking. Use of this option can\n"
" corrupt the mirror unless you ensure that no other\n"
@@ -15519,7 +17824,7 @@ msgstr ""
" kann Spiegelprojektarchive beschädigen, falls nicht sichergestellt ist,\n"
" dass keine andere Instanz von svnsync gleichzeitig läuft."
-#: ../svnsync/svnsync.c:234
+#: ../svnsync/svnsync.c:261
msgid ""
"Steal locks as necessary. Use, with caution,\n"
" if your mirror repository contains stale locks\n"
@@ -15530,128 +17835,138 @@ msgstr ""
" wenn das Spiegelprojektarchiv nicht mehr notwendige Sperren enthält\n"
" und nicht gleichzeitig von einer anderen svnsync-Instanz verwendet wird."
-#: ../svnsync/svnsync.c:357
+#: ../svnsync/svnsync.c:269
+msgid ""
+"size of the extra in-memory cache in MB used to\n"
+" minimize operations for local 'file' scheme.\n"
+msgstr ""
+"Größe des extra Zwischenspeichers im RAM in MB zur Minimierung\n"
+" redundanter Operationen mit dem lokalen »file«-Schema.\n"
+
+#: ../svnsync/svnsync.c:392
msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program"
msgstr "Zielserver unterstützt keine atomaren Änderungen von Revisionseigenschaften; Verwenden Sie entweder 1.7 oder ein externes Programm zum Sperren."
-#: ../svnsync/svnsync.c:371
+#: ../svnsync/svnsync.c:406
#, c-format
msgid "Stole lock previously held by '%s'\n"
msgstr "Zuvor von »%s« gehaltene Sperre gestohlen\n"
-#: ../svnsync/svnsync.c:460
+#: ../svnsync/svnsync.c:495
#, c-format
msgid "Session is rooted at '%s' but the repos root is '%s'"
msgstr "Basis der Sitzung ist »%s«, aber die Basis des Projektarchivs ist »%s«"
-#: ../svnsync/svnsync.c:602
+#: ../svnsync/svnsync.c:637
#, c-format
msgid "Copied properties for revision %ld (%s* properties skipped).\n"
msgstr "Kopierte Eigenschaften für Revision %ld (%s* Eigenschaften übergangen).\n"
-#: ../svnsync/svnsync.c:607
+#: ../svnsync/svnsync.c:642
#, c-format
msgid "Copied properties for revision %ld.\n"
msgstr "Eigenschaften für Revision %ld kopiert.\n"
-#: ../svnsync/svnsync.c:623
+#: ../svnsync/svnsync.c:658
#, c-format
msgid "NOTE: Normalized %s* properties to LF line endings (%d rev-props, %d node-props).\n"
msgstr "HINWEIS: %s* Eigenschaften nach LF-Zeilenenden normalisiert (%d Revisionseigenschaften, %d Knoteneigenschaften).\n"
-#: ../svnsync/svnsync.c:753
+#: ../svnsync/svnsync.c:790
msgid "Destination repository already contains revision history; consider using --allow-non-empty if the repository's revisions are known to mirror their respective revisions in the source repository"
msgstr "Das Zielprojektarchiv enthält schon eine Revisionsgeschichte. Sie können es mit »--allow-non-empty« versuchen, falls die Revisionen dieses Projektarchivs denen des Quellprojektarchivs genau entsprechen."
-#: ../svnsync/svnsync.c:762
+#: ../svnsync/svnsync.c:799
#, c-format
msgid "Destination repository is already synchronizing from '%s'"
msgstr "Das Zielprojektarchiv synchronisiert bereits von »%s«"
-#: ../svnsync/svnsync.c:797
+#: ../svnsync/svnsync.c:834
msgid "Destination repository has more revisions than source repository"
msgstr "Zielprojektarchiv hat mehr Revisionen als Quellprojektarchiv"
-#: ../svnsync/svnsync.c:862 ../svnsync/svnsync.c:865 ../svnsync/svnsync.c:1518
-#: ../svnsync/svnsync.c:1525 ../svnsync/svnsync.c:1762
-#: ../svnsync/svnsync.c:1765 ../svnsync/svnsync.c:1809
+#: ../svnsync/svnsync.c:899 ../svnsync/svnsync.c:902 ../svnsync/svnsync.c:1574
+#: ../svnsync/svnsync.c:1581 ../svnsync/svnsync.c:1820
+#: ../svnsync/svnsync.c:1823 ../svnsync/svnsync.c:1867
#, c-format
msgid "Path '%s' is not a URL"
msgstr "Pfad »%s« ist keine URL"
-#: ../svnsync/svnsync.c:892
+#: ../svnsync/svnsync.c:929
#, c-format
msgid "Committed revision %ld.\n"
msgstr "Revision %ld übertragen.\n"
-#: ../svnsync/svnsync.c:935
+#: ../svnsync/svnsync.c:972
msgid "Destination repository has not been initialized"
msgstr "Zielprojektarchiv wurde noch nicht initialisiert"
-#: ../svnsync/svnsync.c:1301
+#: ../svnsync/svnsync.c:1347
#, c-format
msgid "Commit created r%ld but should have created r%ld"
msgstr "Ãœbertragung erzeugte Revision r%ld, sollte aber r%ld erzeugen"
-#: ../svnsync/svnsync.c:1416
+#: ../svnsync/svnsync.c:1467
#, c-format
msgid "Revision being currently copied (%ld), last merged revision (%ld), and destination HEAD (%ld) are inconsistent; have you committed to the destination without using svnsync?"
msgstr "Die aktuell kopierte Revision (%ld), zuletzt zusammengeführte Revision (%ld) und Ziel-HEAD (%ld) sind inkonsistent. Haben Sie in das Ziel ohne Verwendung von svnsync übertragen?"
-#: ../svnsync/svnsync.c:1453
+#: ../svnsync/svnsync.c:1504
#, c-format
msgid "Destination HEAD (%ld) is not the last merged revision (%ld); have you committed to the destination without using svnsync?"
msgstr "Ziel-HEAD (%ld) ist nicht die zuletzt zusammengeführte Revision (%ld). Haben Sie in das Ziel ohne Verwendung von svnsync übertragen?"
-#: ../svnsync/svnsync.c:1576 ../svnsync/svnsync.c:1581
+#: ../svnsync/svnsync.c:1634 ../svnsync/svnsync.c:1639
#, c-format
msgid "Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
msgstr "Kann keine Revisionseigenschaften für eine Revision (%ld) kopieren, die noch nicht synchronisiert wurde"
-#: ../svnsync/svnsync.c:1645 ../svnsync/svnsync.c:1665
+#: ../svnsync/svnsync.c:1703 ../svnsync/svnsync.c:1723
#, c-format
msgid "Invalid revision number (%ld)"
msgstr "Ungültige Revisionsnummer (%ld)"
-#: ../svnsync/svnsync.c:1715
+#: ../svnsync/svnsync.c:1773
msgid "Cannot specify revisions via both command-line arguments and the --revision (-r) option"
msgstr "Revisionen dürfen nicht gleichzeitig durch Argumente in der Kommandozeile und die Option »--revision« (»-r«) angegeben werden"
-#: ../svnsync/svnsync.c:1723 ../svnsync/svnsync.c:2066
+#: ../svnsync/svnsync.c:1781 ../svnsync/svnsync.c:2126
#, c-format
msgid "Invalid revision range '%s' provided"
msgstr "Ungültiger Revisionsbereich »%s« angegeben"
-#: ../svnsync/svnsync.c:1822
+#: ../svnsync/svnsync.c:1880
#, c-format
msgid "Repository '%s' is not initialized for synchronization"
msgstr "Das Projektarchiv »%s« ist für die Synchronisation nicht initialisiert"
#. Print the info.
-#: ../svnsync/svnsync.c:1828
+#: ../svnsync/svnsync.c:1886
#, c-format
msgid "Source URL: %s\n"
msgstr "Quell-URL: %s\n"
-#: ../svnsync/svnsync.c:1830
+#: ../svnsync/svnsync.c:1888
#, c-format
msgid "Source Repository UUID: %s\n"
msgstr "UUID des Quellprojektarchivs: %s\n"
-#: ../svnsync/svnsync.c:1833
+#: ../svnsync/svnsync.c:1891
#, c-format
msgid "Last Merged Revision: %s\n"
msgstr "Letzte zusammengeführte Revision: %s\n"
-#: ../svnsync/svnsync.c:1850
+#: ../svnsync/svnsync.c:1908
msgid ""
"general usage: svnsync SUBCOMMAND DEST_URL [ARGS & OPTIONS ...]\n"
+"Subversion repository replication tool.\n"
"Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnsync --version' to see the program version and RA modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
"Aufruf: svnsync UNTERBEFEHL ZIEL_URL [Optionen & Parameter ...]\n"
+"Werkzeug zur Replikation von Subversion-Projektarchiven.\n"
"Geben Sie »svnsync help <Unterbefehl>« ein, um Hilfe zu einem\n"
"Unterbefehl zu erhalten.\n"
"Geben Sie »svnsync --version« ein, um die Programmversion und die\n"
@@ -15659,16 +17974,16 @@ msgstr ""
"\n"
"Verfügbare Unterbefehle:\n"
-#: ../svnsync/svnsync.c:2114
+#: ../svnsync/svnsync.c:2187
msgid "Cannot use --username or --password with any of --source-username, --source-password, --sync-username, or --sync-password.\n"
msgstr "Man kann nicht --username oder --password mit einem von --source-username, --source-password, --sync-username oder --sync-password verwenden.\n"
# TODO: Duplicated message!!!!
-#: ../svnsync/svnsync.c:2138
+#: ../svnsync/svnsync.c:2210
msgid "--disable-locking and --steal-lock are mutually exclusive"
msgstr "--disable-locking und --steal-lock schließen sich gegenseitig aus"
-#: ../svnsync/svnsync.c:2214
+#: ../svnsync/svnsync.c:2299
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -15677,19 +17992,26 @@ msgstr ""
"Unterbefehl »%s« akzeptiert die Option »%s« nicht\n"
"Geben Sie »svnsync help %s« für Hilfe ein.\n"
-#: ../svnsync/svnsync.c:2297
+#: ../svnsync/svnsync.c:2389
msgid "Try 'svnsync help' for more info"
msgstr "Versuchen Sie »svnsync help« für weitere Informationen"
-#: ../svnversion/svnversion.c:50
+#: ../svnsync/sync.c:125
+#, c-format
+msgid "Missing colon in svn:mergeinfo property"
+msgstr "Fehlender Doppelpunkt in der Eigenschaft svn:mergeinfo"
+
+#: ../svnversion/svnversion.c:49
#, c-format
msgid "Type 'svnversion --help' for usage.\n"
msgstr "Geben Sie »svnversion --help« für weitere Hilfe ein.\n"
-#: ../svnversion/svnversion.c:61
+#: ../svnversion/svnversion.c:59
#, c-format
msgid ""
"usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n"
+"Subversion working copy identification tool.\n"
+"Type 'svnversion --version' to see the program version.\n"
"\n"
" Produce a compact version identifier for the working copy path\n"
" WC_PATH. TRAIL_URL is the trailing portion of the URL used to\n"
@@ -15721,6 +18043,8 @@ msgid ""
"Valid options:\n"
msgstr ""
"Aufruf: svnversion [OPTIONEN] [AK_PFAD [ANGEH_URL]]\n"
+"Subversion-Werkzeug zur identifikation von Arbetiskopien.\n"
+"Geben Sie »svnversion --version« ein, um die Programmversion zu sehen.\n"
"\n"
" Erzeugt eine kompakte »Versionsnummer« für den Pfad AK_PFAD der\n"
" Arbeitskopie. ANGEH_URL ist der angehängte Teil der URL, welcher\n"
@@ -15754,41 +18078,2207 @@ msgstr ""
"\n"
"Gültige Optionen:\n"
-#: ../svnversion/svnversion.c:137
-msgid "do not output the trailing newline"
-msgstr "gibt den anhängenden Zeilenumbruch nicht aus"
-
-#: ../svnversion/svnversion.c:138
+#: ../svnversion/svnversion.c:141
msgid "last changed rather than current revisions"
msgstr "gibt letzte geänderte statt aktueller Revisionen aus"
-#: ../svnversion/svnversion.c:246
+#: ../svnversion/svnversion.c:241
#, c-format
msgid "Unversioned symlink%s"
msgstr "Nicht versionierter symbolischer Link%s"
-#: ../svnversion/svnversion.c:249
+#: ../svnversion/svnversion.c:244
#, c-format
msgid "Unversioned directory%s"
msgstr "Nicht versioniertes Verzeichnis%s"
-#: ../svnversion/svnversion.c:252
+#: ../svnversion/svnversion.c:247
#, c-format
msgid "Unversioned file%s"
msgstr "Nicht versionierte Datei%s"
-#: ../svnversion/svnversion.c:258
+#: ../svnversion/svnversion.c:253
#, c-format
msgid "'%s' doesn't exist\n"
msgstr "»%s« existiert nicht\n"
-#: ../svnversion/svnversion.c:259
+#: ../svnversion/svnversion.c:254
#, c-format
msgid "'%s' is of unknown type\n"
msgstr "»%s« ist unbekannten Typs\n"
#. Local uncommitted modifications, no revision info was found.
-#: ../svnversion/svnversion.c:274
+#: ../svnversion/svnversion.c:268
#, c-format
msgid "Uncommitted local addition, copy or move%s"
msgstr "Nicht übertragenes lokal hinzugefügtes, kopiertes oder verschobenes Element%s"
+
+#~ msgid "Closing editor with directories or files open"
+#~ msgstr "Schließen des Editors mit geöffneten Verzeichnissen oder Dateien"
+
+#~ msgid "Conflict on '%s' could not be resolved because the chosen version of the file is not available."
+#~ msgstr "Konflikt von »%s« konnte nicht aufgelöst werden, da die gewählte Version der Datei nicht verfügbar ist."
+
+#~ msgid "accept the working copy version of file [working]"
+#~ msgstr "Akzeptiert die Arbeitskopieversion der Datei [working]"
+
+#~ msgid "accept the incoming version of file [theirs-full]"
+#~ msgstr "Akzeptiert fremde Version der Datei [theirs-full]"
+
+# TODO: leicht inkonsistent zu obigen Strings (tritt in svn info-Ausgabe auf)
+#~ msgid "Conflict discovered in binary file '%s'.\n"
+#~ msgstr "Konflikt in Binärdatei »%s« entdeckt.\n"
+
+#~ msgid "'%s' not valid with '--summarize' option"
+#~ msgstr "»%s« mit der Option »--summarize« nicht zulässig"
+
+#~ msgid "--revision (-r) option valid only with --show-updates (-u) option"
+#~ msgstr "Option »--revision« (»--r«) ist nur in Verbindung mit der Option »--show-updates« (»-u«) zulässig"
+
+#~ msgid "Repository '%s' not found in the database"
+#~ msgstr "Projektverzeichnis »%s« nicht in der Datenbank gefunden"
+
+#~ msgid "(To set the '%s' property, re-run with '--force'.)"
+#~ msgstr "(Verwenden Sie »--force« um das Setzen der Eigenschaft »%s« zu erzwingen)"
+
+#~ msgid "(To edit the '%s' property, re-run with '--force'.)"
+#~ msgstr "(Verwenden Sie »--force« um das Bearbeiten der Eigenschaft »%s«zu erzwingen)"
+
+#~ msgid "(To use the '%s' property, re-run with '--force'.)"
+#~ msgstr "(Verwenden Sie »--force« um die Verwendung der Eigenschaft »%s« zu erzwingen)"
+
+#~ msgid ""
+#~ "Output the content of specified files or\n"
+#~ "URLs with revision and author information in-line.\n"
+#~ "usage: blame TARGET[@REV]...\n"
+#~ "\n"
+#~ " If specified, REV determines in which revision the target is first\n"
+#~ " looked up.\n"
+#~ msgstr ""
+#~ "Gibt den Inhalt der angegebenen Dateien oder URLs mit\n"
+#~ "den Revisions- und Autoreninformationen für jede Zeile aus.\n"
+#~ "Aufruf: blame ZIEL[@REV]...\n"
+#~ "\n"
+#~ " Falls angegeben, bestimmt REV, in welcher Revision zuerst nachgeschaut wird.\n"
+
+#~ msgid ""
+#~ "Display information about a local or remote item.\n"
+#~ "usage: info [TARGET[@REV]...]\n"
+#~ "\n"
+#~ " Print information about each TARGET (default: '.').\n"
+#~ " TARGET may be either a working-copy path or URL. If specified, REV\n"
+#~ " determines in which revision the target is first looked up.\n"
+#~ msgstr ""
+#~ "Zeigt Informationen über ein lokales oder auf dem Server befindliches\n"
+#~ "Objekt an.\n"
+#~ "Aufruf: info [ZIEL[@REV]...]\n"
+#~ "\n"
+#~ " Gibt Informationen über jedes ZIEL aus (Vorgabe: ».«).\n"
+#~ " ZIEL kann entweder ein Pfad einer Arbeitskopie oder eine URL sein. Wenn\n"
+#~ " angegeben, bestimmt REV, in welcher Revision zuerst nach dem Ziel gesucht\n"
+#~ " wird.\n"
+
+#~ msgid "don't print an extra newline"
+#~ msgstr "Keinen zusätzlichen Zeilenumbruch ausgeben"
+
+#~ msgid "Revision lacks trailing newline"
+#~ msgstr "Revision hat keinen abschließenden Zeilenumbruch"
+
+#~ msgid "Final line in revision file longer than 64 characters"
+#~ msgstr "Letzte Zeile in der Revisionsdatei ist länger als 64 Zeichen"
+
+#~ msgid "Final line in revision file missing space"
+#~ msgstr "Letzte Zeile in der Revisionsdatei hat nicht genug Leerzeichen"
+
+#~ msgid "The PROPFIND response did not include the requested properties"
+#~ msgstr "Die PROPFIND-Antwort enthielt nicht den angeforderten Eigenschaften"
+
+#~ msgid "Replacing path '%s' in r%ld with invalid path"
+#~ msgstr "Ersetzen eines Pfades »%s« in r%ld mit einem ungültigen Pfad"
+
+#~ msgid "No pathname preceding ':'"
+#~ msgstr "Vor »:« steht kein Pfadname"
+
+#~ msgid "Cannot auto-resolve tree-conflict on '%s'"
+#~ msgstr "Kann Baumkonflikt in »%s« nicht automatisch auflösen"
+
+#~ msgid ""
+#~ "Print the youngest revision number of a target's repository.\n"
+#~ "usage: youngest [TARGET]\n"
+#~ "\n"
+#~ " Print the revision number of the youngest revision in the repository\n"
+#~ " with which TARGET is associated.\n"
+#~ msgstr ""
+#~ "Gibt die jüngste Revisionnummer eines Zielprojektarchivs aus.\n"
+#~ "Aufruf: youngest [ZIEL]\n"
+#~ "\n"
+#~ " Gibt die Revisionsnummer der jüngsten Revision im Projektarchiv\n"
+#~ " ZIEL aus.\n"
+
+#~ msgid ""
+#~ "size of the extra in-memory cache in MB used to\n"
+#~ " minimize redundant operations.\n"
+#~ " Default is 16.\n"
+#~ " [used for FSFS and FSX repositories only]"
+#~ msgstr ""
+#~ "Größe des extra Zwischenspeichers im RAM in MB zur\n"
+#~ " Minimierung redundanter Operationen.\n"
+#~ " Vorgabe: 16.\n"
+#~ " [nur für FSFS und FSX-Projektarchive verwendet]"
+
+#, fuzzy
+#~ msgid "Recursive locks are not supported"
+#~ msgstr "Nicht-rekursives Umplatzieren nicht unterstützt"
+
+#~ msgid "The assumed HEAD revision (%lu) of the hotcopy source has been packed while the hotcopy was in progress; please restart the hotcopy operation"
+#~ msgstr "Die angenommene Revision »HEAD« (%lu) der Quelle der Kopie im laufenden Betrieb wurde während des Vorgangs gepackt; Bitte starten Sie den Vorgang erneut"
+
+#~ msgid "Revision %lu disappeared from the hotcopy source while hotcopy was in progress"
+#~ msgstr "Revision %lu aus der Quelle für Kopie im laufenden Betrieb während des Vorgangs verschwunden"
+
+#, fuzzy
+#~ msgid "Incomplete read in file '%s'"
+#~ msgstr "Kann Datei »%s« nicht lesen"
+
+#, fuzzy
+#~ msgid "No read access to file '%s'"
+#~ msgstr "Kann Zugriffszeit von »%s« nicht setzen"
+
+#, fuzzy
+#~ msgid "No write access to file '%s'"
+#~ msgstr "Kann nicht in Datei »%s« schreiben"
+
+#~ msgid "Not a valid atomic"
+#~ msgstr "Kein gültiges »atomic«"
+
+#~ msgid "MMAP failed for file '%s'"
+#~ msgstr "MMAP für Datei »%s« schlug fehl"
+
+#~ msgid "Number of atomics in namespace is too large."
+#~ msgstr "Zahl der »atomic«-Elemente im Namenraum ist zu groß"
+
+#~ msgid "Atomic's name is too long."
+#~ msgstr "Name des »atomic« ist zu lang"
+
+#~ msgid "Namespace has not been initialized."
+#~ msgstr "Namensraum wurde noch nicht initialisiert"
+
+#~ msgid "Out of slots for named atomic."
+#~ msgstr "Keine freien Plätze für benanntes »atomic« mehr übrig"
+
+#~ msgid "Failed to mark '%s' absent: item of the same name is already scheduled for addition"
+#~ msgstr "Konnte »%s« nicht als fehlend markieren: ein Eintrag mit demselben Namen wurde bereits zur Hinzufügung eingeplant"
+
+#~ msgid "incoming file replace"
+#~ msgstr "eingehendes Ersetzen einer Datei"
+
+#~ msgid "accept pre-existing item (ignore upstream addition) [mine-full]"
+#~ msgstr "Akzeptiert vorhandenes Element (ignoriert empfangene Hinzufügung) [mine-full]"
+
+#~ msgid "accept incoming item (overwrite pre-existing item) [theirs-full]"
+#~ msgstr "Akzeptiert empfangenes Element (überschreibt vorhandenes Element) [theirs-full]"
+
+#~ msgid ""
+#~ "Conflict discovered when trying to add '%s'.\n"
+#~ "An object of the same name already exists.\n"
+#~ msgstr ""
+#~ "Beim Versuch, »%s« hinzuzufügen, wurde ein Konflikt entdeckt.\n"
+#~ "Ein Objekt mit demselben Namen existiert bereits.\n"
+
+#~ msgid "Ambiguous move"
+#~ msgstr "Mehrdeutige Verschiebung"
+
+#~ msgid "Move without a suitable deletion"
+#~ msgstr "Verschiebung ohne dazugehörige Löschung"
+
+#, fuzzy
+#~ msgid "do not output trailing newline"
+#~ msgstr "gibt den anhängenden Zeilenumbruch nicht aus"
+
+#~ msgid "Working copy at '%s' is already locked."
+#~ msgstr "Arbeitskopie »%s« ist schon gesperrt."
+
+#~ msgid "Cannot delete the directory '%s' in a non-recursive commit because it has children"
+#~ msgstr "Kann das Verzeichnis »%s« nicht mit einer nicht-rekursiv Übertragung löschen, da es Kindelemente hat"
+
+#~ msgid "Summarized diffs are only supported between a path's text-base and its working files at this time"
+#~ msgstr "Derzeit werden Zusammenfassungen für Vergleiche nur zwischen der Textbasis und den Arbeitsdateien eines Pfades unterstützt"
+
+#~ msgid "'%s' is not the same node kind as '%s'"
+#~ msgstr "»%s« hat nicht den gleichen Knotentyp wie »%s«"
+
+#~ msgid "Missing node-id in node-rev at r%ld (offset %s)"
+#~ msgstr "Fehlende Knoten-ID in Knotenrevision bei r%ld (Offset »%s«)"
+
+#~ msgid "Corrupt node-id '%s' in node-rev at r%ld (offset %s)"
+#~ msgstr "Beschädigte Knoten-ID »%s« in Knotenrevision bei r%ld (Offset »%s«)"
+
+#~ msgid "Representation key for checksum '%%s' exists in filesystem '%%s' with a different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,%%%s,%%%s,%%%s)"
+#~ msgstr "Repräsentationsschlüssel für Prüfsumme »%%s« existiert im Dateisystem »%%s« mit einem anderen Wert (%%ld,%%%s,%%%s,%%%s) als der, der gespeichert werden soll (%%ld,%%%s,%%%s,%%%s)"
+
+#~ msgid "Unable to open an ra_local session to URL"
+#~ msgstr "Kann keine ra_local-Verbindung zu einer URL aufbauen"
+
+#~ msgid "%s of '%s': %d %s"
+#~ msgstr "%s von »%s«: %d %s"
+
+#~ msgid "Directory '%s' is out of date; try updating"
+#~ msgstr "Verzeichnis »%s« ist veraltet; versuchen Sie zu aktualisieren"
+
+#~ msgid "File '%s' is out of date; try updating"
+#~ msgstr "Datei »%s« ist veraltet; versuchen Sie zu aktualisieren"
+
+#~ msgid "At least one property change failed; repository is unchanged"
+#~ msgstr "Mindestens eine Eigenschaftsänderung schlug fehl; Projektarchiv nicht geändert"
+
+#~ msgid "Failed writing updated file"
+#~ msgstr "Fehler beim Schreiben der aktualisierten Datei"
+
+#~ msgid "%s of '%s': %d %s (%s://%s)"
+#~ msgstr "%s von »%s«: %d %s (%s://%s)"
+
+#~ msgid "Adding directory failed: %s on %s (%d %s)"
+#~ msgstr "Hinzufügen eines Verzeichnisses schlug fehl: %s auf %s (%d %s)"
+
+#~ msgid "MERGE request failed: returned %d (during commit)"
+#~ msgstr "»MERGE«-Anfrage fehlgeschlagen; gab während der Übertragung %d zurück"
+
+#~ msgid "DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent"
+#~ msgstr "DAV-Anfrage schlug fehl; möglicherweise ist entweder die Aktion »pre-revprop-change« gescheitert oder sie fehlt"
+
+#~ msgid "Lock request failed: %d %s"
+#~ msgstr "Sperranforderung gescheitert: %d %s"
+
+#~ msgid "Malformed URL for repository"
+#~ msgstr "Fehlerhafte URL für Projektarchiv"
+
+#~ msgid "GET request failed: %d %s"
+#~ msgstr "GET-Anfrage schlug fehl: %d %s"
+
+#~ msgid "Missing revision attr in target-revision element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »target-revision«"
+
+#~ msgid "Missing revision attr in open-directory element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »open-directory«"
+
+#~ msgid "Missing name attr in open-directory element"
+#~ msgstr "Fehlendes Namensattribut in Element »open-directory«"
+
+#~ msgid "Missing name attr in add-directory element"
+#~ msgstr "Fehlendes Namensattribut in Element »add-directory«"
+
+#~ msgid "Missing name attr in open-file element"
+#~ msgstr "Fehlendes Namensattribut in Element »open-file«"
+
+#~ msgid "Missing revision attr in open-file element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »open-file«"
+
+#~ msgid "Missing name attr in add-file element"
+#~ msgstr "Fehlendes Namensattribut in Element »add-file«"
+
+#~ msgid "Missing name attr in delete-entry element"
+#~ msgstr "Fehlendes Namensattribut in Element »delete-entry«"
+
+#~ msgid "Missing name attr in absent-directory element"
+#~ msgstr "Fehlendes Namensattribut in Element »absent-directory«"
+
+#~ msgid "Missing name attr in absent-file element"
+#~ msgstr "Fehlendes Namensattribut in Element »absent-file«"
+
+#~ msgid "Missing name attr in %s element"
+#~ msgstr "Fehlendes Namensattribut in Element %s"
+
+#~ msgid "Unknown tag '%s' while at state %d"
+#~ msgstr "Unbekanntes Tag »%s« im Zustand %d"
+
+#~ msgid "The REPORT or PROPFIND response did not include the requested checked-in value"
+#~ msgstr "Die Antwort auf REPORT oder PROPFIND enthielt nicht den angeforderten Wert »checked-in«"
+
+#~ msgid "Error writing to '%s': unexpected EOF"
+#~ msgstr "Fehler beim Schreiben nach »%s«: unerwartetes EOF"
+
+#~ msgid "Error retrieving REPORT"
+#~ msgstr "Fehler beim Holen von REPORT"
+
+#~ msgid "XML parsing failed"
+#~ msgstr "XML-Parser schlug fehl"
+
+#~ msgid "XML parsing failed: (%d %s)"
+#~ msgstr "XML-Parser schlug fehl: (%d %s)"
+
+#~ msgid "The %s response contains invalid XML (%d %s)"
+#~ msgstr "Die Antwort auf »%s« enthält ungültiges XML (%d %s)"
+
+#~ msgid "The response contains invalid XML"
+#~ msgstr "Die Antwort enthält ungültiges XML"
+
+#~ msgid "Can't convert string to UCS-2: '%s'"
+#~ msgstr "Kann Zeichenkette nicht in UCS-2 konvertieren: »%s«"
+
+#~ msgid "Can't convert module path to UTF-8 from UCS-2: '%s'"
+#~ msgstr "Kann Modulpfad nicht von UTF-8 in UCS-2 konvertieren: »%s«"
+
+#~ msgid "The base node '%s' was not found."
+#~ msgstr "Der Basisknoten »%s« wurde nicht gefunden."
+
+#~ msgid "No merge tool found, try '(m) merge' instead.\n"
+#~ msgstr "Kein Werkzeug zum Zusammenführen gefunden, versuchen Sie stattdessen »(m) merge«.\n"
+
+#~ msgid "Error running merge tool, try '(m) merge' instead."
+#~ msgstr "Fehler beim Ausführen des Werkzeugs zum Zusammenführen, versuchen Sie stattdessen »(m) merge«."
+
+#~ msgid ""
+#~ "Invalid option; can only resolve text conflicts with the internal merge tool.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ungültige Option; Kann Textkonflikte nur mit dem internen Werkzeug zum Zusammenführen auflösen.\n"
+#~ "\n"
+
+#~ msgid "No editor found; leaving all conflicts."
+#~ msgstr "Kein Editor gefunden; behalte alle Konflikte bei."
+
+#~ msgid "Error running editor; leaving all conflicts."
+#~ msgstr "Fehler beim Ausführen des Editors; behalte alle Konflikte bei."
+
+#~ msgid "No merge tool found; leaving all conflicts."
+#~ msgstr "Kein Programm zum Zusammenführen gefunden; behalte alle Konflikte bei."
+
+#~ msgid "Error running merge tool; leaving all conflicts."
+#~ msgstr "Fehler beim Ausführen des Zusammenführungsprogramms; behalte alle Konflikte bei."
+
+#~ msgid "type of repository: 'fsfs' (default) or 'bdb'"
+#~ msgstr "Art des Projektarchivs: »fsfs« (Standard) oder »bdb«"
+
+#~ msgid ""
+#~ "usage: svnauth help [SUBCOMMAND...]\n"
+#~ "\n"
+#~ "Describe the usage of this program or its subcommands.\n"
+#~ msgstr ""
+#~ "Aufruf: svnauth help [UNTERBEFEHL...]\n"
+#~ "\n"
+#~ "Beschreibt die Anwendung dieses Programms und seiner Unterbefehle.\n"
+
+#~ msgid ""
+#~ "usage: svnauth list\n"
+#~ "\n"
+#~ "List cached authentication credentials.\n"
+#~ msgstr ""
+#~ "Aufruf: svnauth list\n"
+#~ "\n"
+#~ "Gibt eine Liste gespeicherter Zugangsdaten aus.\n"
+
+#~ msgid "use auth cache in config directory ARG"
+#~ msgstr "Verwendet Speicherbereich für Zugangsdaten im Konfigurationsverzeichnis PAR"
+
+#~ msgid "Try 'svnauth help' for more info"
+#~ msgstr "Geben Sie »svnauth help« für weitere Hilfe ein"
+
+#~ msgid ""
+#~ "general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+#~ "Note: any subcommand which takes the '--revision' and '--transaction'\n"
+#~ " options will, if invoked without one of those options, act on\n"
+#~ " the repository's youngest revision.\n"
+#~ "Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
+#~ "Type 'svnlook --version' to see the program version and FS modules.\n"
+#~ "\n"
+#~ "Available subcommands:\n"
+#~ msgstr ""
+#~ "Aufruf: svnlook UNTERBEFEHL ARCHIV_PFAD [Optionen & Parameter ...]\n"
+#~ "Hinweis: Alle Unterbefehle, die die Parameter »--revision« und »--transaction«\n"
+#~ " akzeptieren, werden ohne diese Parameter die neueste\n"
+#~ " Revision des Projektarchivs verwenden.\n"
+#~ "Geben Sie »svnlook help <Unterbefehl>« ein, um Hilfe zu einem Unterbefehl\n"
+#~ " zu erhalten.\n"
+#~ "Geben Sie »svnlook --version« ein, um die Programmversion und die Datei-\n"
+#~ " systemmodule zu sehen.\n"
+#~ "\n"
+#~ "Verfügbare Unterbefehle:\n"
+
+#~ msgid ""
+#~ "usage: svnserve [-d | -i | -t | -X] [options]\n"
+#~ "\n"
+#~ "Valid options:\n"
+#~ msgstr ""
+#~ "Aufruf: svnserve [-d | -i | -t | -X] [Optionen]\n"
+#~ "\n"
+#~ "Gültige Optionen:\n"
+
+#~ msgid "Can't open stdout"
+#~ msgstr "Kann Standardausgabe nicht öffnen"
+
+#~ msgid "Can't create threadattr"
+#~ msgstr "Kann »Thread« Attribut nicht erzeugen"
+
+#~ msgid "Can't set detached state"
+#~ msgstr "Kann nicht in den gelösten Status wechseln"
+
+#~ msgid "Missing revision attr in open-root element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »open-root«"
+
+#~ msgid "Missing revision attr in delete-entry element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »delete-entry«"
+
+#~ msgid "DAV request failed: Content length required"
+#~ msgstr "DAV-Anfrage fehlgeschlagen: Angabe zur Länge des Inhalts erforderlich"
+
+#~ msgid "'--no-ignore' option only valid with '--remove-unversioned' option"
+#~ msgstr "Option »--no-ignore« ist nur in Verbindung mit der Option »--remove-unversioned« zulässig"
+
+#~ msgid ""
+#~ "Also commit file and dir externals reached by\n"
+#~ " recursion. This does not include externals with a\n"
+#~ " fixed revision. (See the svn:externals property)"
+#~ msgstr ""
+#~ "Überträgt auch externe Verweise auf Dateien und Verzeichnisse, die durch\n"
+#~ " Rekursion erreicht werden. Dies schließt externe Verweise\n"
+#~ " mit fixen Revisionen aus. (siehe Eigenschaft »svn:externals«)"
+
+#~ msgid ""
+#~ "Recursively clean up the working copy, removing locks, resuming\n"
+#~ "unfinished operations, etc.\n"
+#~ "usage: cleanup [WCPATH...]\n"
+#~ "\n"
+#~ " If the --remove-unversioned option is given, also remove unversioned\n"
+#~ " items within WCPATH. If --no-ignore is also given, disregard any\n"
+#~ " ignore patterns and remove ignored unversioned items as well.\n"
+#~ msgstr ""
+#~ "Räumt eine Arbeitskopie rekursiv auf, entfernt Sperren, führt\n"
+#~ "nicht beendete Operationen zu Ende usw.\n"
+#~ "Aufruf: cleanup [AKPFAD...]\n"
+#~ "\n"
+#~ " Wenn die Option --remove-unversioned angegeben ist, werden auch alle\n"
+#~ " nicht versionierten Objekte in AKPFAD entfernt. Wenn --no-ignore auch\n"
+#~ " angegeben ist, werden Einstellungen aus »global-ignores« sowie die\n"
+#~ " Eigenschaften »svn:ignore« und »svn:global-ignores«\" nicht beachtet\n"
+#~ " und ignorierte nicht versionierte Objekte ebenfalls entfernt.\n"
+
+#~ msgid "include externals definitions"
+#~ msgstr "»svn:externals«-Definitionen einbeziehen"
+
+#~ msgid ""
+#~ "Recursively clean up the working copy, removing locks, resuming\n"
+#~ "unfinished operations, etc.\n"
+#~ "usage: cleanup [WCPATH...]\n"
+#~ msgstr ""
+#~ "Räumt die Arbeitskopie rekursiv auf, gibt Sperren frei,\n"
+#~ "nimmt unvollständige Operationen wieder auf, usw.\n"
+#~ "Aufruf: cleanup [AKPFAD...]\n"
+
+#~ msgid "Start revision must precede end revision"
+#~ msgstr "Startrevision muss vor der Endrevision liegen"
+
+#~ msgid "Invalid config: unknown http authtype '%s'"
+#~ msgstr "Ungültige Konfiguration: Unbekannter HTTP-Autorisationstyp »%s«"
+
+#~ msgid "Too many nested items"
+#~ msgstr "Zu viele verschachtelte Objekte"
+
+#~ msgid "OOM"
+#~ msgstr "Nicht genügend Speicher"
+
+#~ msgid "--- Checking branch relationship\n"
+#~ msgstr "--- Überprüfung des Verhältnisses der Zweige\n"
+
+#~ msgid "Source and target must be different but related branches"
+#~ msgstr "Quelle und Ziel müssen verschiedene aber verwandte Zweige sein"
+
+#~ msgid "Source and target have no common ancestor: '%s' and '%s'"
+#~ msgstr "Quelle und Ziel haben keinen gemeinsamen Vorfahren: »%s« und »%s«"
+
+#~ msgid "Pristine text not found"
+#~ msgstr "Ursprungstext nicht gefunden"
+
+#~ msgid "The pristine text with checksum '%s' was found in the DB but not on disk"
+#~ msgstr "Der Ursprungstext mit der Prüfsumme »%s« wurde in der Datenbank gefunden, aber nicht auf der Festplatte"
+
+#~ msgid "The tree '%s' is not single-revision and unswitched"
+#~ msgstr "Der Baum »%s« hat mehr als eine Revision oder umgestellte Unterbäume"
+
+#~ msgid "edit"
+#~ msgstr "editiert"
+
+#~ msgid "add"
+#~ msgstr "hinzugefügt"
+
+#~ msgid "replace"
+#~ msgstr "ersetzt"
+
+#~ msgid "missing"
+#~ msgstr "fehlend"
+
+#~ msgid "prefer local change"
+#~ msgstr "Bevorzugt lokale Änderungen "
+
+#~ msgid "prefer incoming change"
+#~ msgstr "Bevorzugt empfangene Änderungen "
+
+#~ msgid "break the move, change move destination into a copy"
+#~ msgstr "Teilt die Verschiebung auf, wandelt Ziel der Verschiebung in eine Kopie um"
+
+#~ msgid "--- Calculating automatic merge\n"
+#~ msgstr "--- Berechnung der automatischen Zusammenführung\n"
+
+#~ msgid "The required merge is reintegrate-like, and the --record-only option cannot be used with this kind of merge"
+#~ msgstr "Die benötigte Zusammenführung sieht wie eine Reintegration aus, die Option »--record-only« kann mit dieser Art der Zusammenführung aber nicht verwendet werden"
+
+#~ msgid "The required merge is reintegrate-like, and the --depth option cannot be used with this kind of merge"
+#~ msgstr "Die benötigte Zusammenführung sieht wie eine Reintegration aus, die Option »--depth« kann mit dieser Art der Zusammenführung aber nicht verwendet werden"
+
+#~ msgid "The required merge is reintegrate-like, and the --force option cannot be used with this kind of merge"
+#~ msgstr "Die benötigte Zusammenführung sieht wie eine Reintegration aus, die Option »--force« kann mit dieser Art der Zusammenführung aber nicht verwendet werden"
+
+#~ msgid "The required merge is reintegrate-like, and the --allow-mixed-revisions option cannot be used with this kind of merge"
+#~ msgstr "Die benötigte Zusammenführung sieht wie eine Reintegration aus, die Option »--allow-mixed-revisions« kann mit dieser Art der Zusammenführung aber nicht verwendet werden"
+
+#~ msgid ""
+#~ "Restore pristine working copy file (undo most local edits).\n"
+#~ "usage: revert PATH...\n"
+#~ "\n"
+#~ " Note: this subcommand does not require network access, and resolves\n"
+#~ " any conflicted states.\n"
+#~ msgstr ""
+#~ "Stellt den ursprünglichen Inhalt einer Datei in der Arbeitskopie wieder her\n"
+#~ "(macht die meisten lokalen Änderungen rückgängig).\n"
+#~ "Aufruf: revert PFAD...\n"
+#~ "\n"
+#~ " Hinweis: Dieser Unterbefehl erfordert keinen Netzwerkzugriff und löst\n"
+#~ " Konfliktzustände auf.\n"
+
+#~ msgid ""
+#~ "usage: svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
+#~ "\n"
+#~ "Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n"
+#~ msgstr ""
+#~ "Aufruf: svnadmin freeze ARCHIV_PFAD PROGRAMM [PAR...]\n"
+#~ "\n"
+#~ "Führt PROGRAMM mit den Optionen PAR aus, während ARCHIV_PFAD mit einer Schreibsperre belegt wird.\n"
+
+#~ msgid "Path '%s' has no URL"
+#~ msgstr "Pfad »%s« hat keine URL"
+
+#~ msgid "merging...\n"
+#~ msgstr "Zusammenführung...\n"
+
+#~ msgid "The node '%s' is not in a working copy."
+#~ msgstr "Der Knoten »%s« ist nicht in einer Arbeitskopie."
+
+#~ msgid "Can't read stdin"
+#~ msgstr "Kann nicht aus Standardeingabe lesen"
+
+#, fuzzy
+#~ msgid ""
+#~ " youngest last repos.\n"
+#~ " common full tip of path of\n"
+#~ " ancestor merge branch branch\n"
+#~ "\n"
+#~ msgstr ""
+#~ " jüngster letzte neueste Projektarchiv-\n"
+#~ " gemeins. vollst. im pfade der\n"
+#~ " Vorgänger Merge Zweig Zweige\n"
+#~ "\n"
+
+#~ msgid "Source URL '%s' is from foreign repository; leaving it as a disjoint WC"
+#~ msgstr "Quell URL »%s« ist aus einem fremden Projektarchiv; lasse sie als getrennte Arbeitskopie"
+
+#, fuzzy
+#~ msgid "Checksum doesn't match for '%s'"
+#~ msgstr "Prüfsummenfehler für »%s«"
+
+#~ msgid "calculating reintegrate merge...\n"
+#~ msgstr "Berechnung der Zusammenführung für Reintegration\n"
+
+#~ msgid "ignore ancestry when calculating merges"
+#~ msgstr "beim Zusammenführen Vorgänger ignorieren"
+
+#~ msgid "notice ancestry when calculating differences"
+#~ msgstr ""
+#~ "beim Berechnen von Differenzen Vorgänger\n"
+#~ " berücksichtigen"
+
+# FIXME: duplicated message (differs only in ".")
+#~ msgid "Conflict callback violated API: returned no results."
+#~ msgstr "Konflikt-Rückruffunktion verletzte die API: keine Ergebnisse wurden zurückgeliefert."
+
+#~ msgid "Conflict callback violated API: returned no merged file."
+#~ msgstr "Konflikt-Rückruffunktion verletzte die API: keine zusammengeführte Datei wurde zurückgeliefert."
+
+#~ msgid "Cannot non-recursively commit a directory deletion of a directory with child nodes"
+#~ msgstr "Das Löschen eines Verzeichnisses mit Untereinträgen kann nur rekursiv übertragen werden"
+
+#~ msgid "Unknown entry kind for '%s'"
+#~ msgstr "»%s« hat einen unbekannten Eintragstyp"
+
+#~ msgid "Entry '%s' has unexpectedly changed special status"
+#~ msgstr "Der Spezialstatus von Eintrag »%s« hat sich unerwarteterweise geändert"
+
+#~ msgid "Entry for '%s' has no URL"
+#~ msgstr "Eintrag für »%s« hat keine URL"
+
+# CHECKME
+#~ msgid "'%s' is scheduled for addition within unversioned parent"
+#~ msgstr "»%s« ist zum Hinzufügen innerhalb einer nicht versionierten Struktur vorgesehen"
+
+#~ msgid "Entry for '%s' exists (though the working file is missing)"
+#~ msgstr "Eintrag für »%s« existiert (die Arbeitsdatei fehlt jedoch)"
+
+#~ msgid "Summarizing diff can only compare repository to repository"
+#~ msgstr "Zusammenfassender Vergleich kann nur ein Projektarchiv mit einem Projektarchiv vergleichen"
+
+#~ msgid "'%s' is not a URL"
+#~ msgstr "»%s« ist keine URL"
+
+#~ msgid "Server does not support retrieving information about the repository root"
+#~ msgstr "Server unterstützt die Abfrage von Informationen über die Projektarchivwurzel nicht"
+
+#~ msgid "URL '%s' non-existent in that revision"
+#~ msgstr "URL »%s« existiert nicht in dieser Revision"
+
+#~ msgid "URLs have no scheme ('%s' and '%s')"
+#~ msgstr "Die URLs haben kein Schema (»%s« und »%s«)"
+
+#~ msgid "URL has no scheme: '%s'"
+#~ msgstr "URL hat kein Schema: »%s«"
+
+#~ msgid "Access scheme mixtures not yet supported ('%s' and '%s')"
+#~ msgstr "Gemischte Zugriffsverfahren werden noch nicht unterstützt (»%s« and »%s«)"
+
+#~ msgid "Setting property recursively on non-local target '%s' is not supported"
+#~ msgstr "Das rekursive Setzen einer Eigenschaft für ein nicht lokales Ziel »%s« wird nicht unterstützt"
+
+#~ msgid "URL '%s' is not a child of repository root URL '%s'"
+#~ msgstr "Die URL »%s« ist kein Kind der Projektarchivwurzel-URL »%s«"
+
+#~ msgid "No newline at end of file"
+#~ msgstr "Kein Zeilenumbruch am Ende der Datei"
+
+#~ msgid "Can't grab FS mutex"
+#~ msgstr "Kann FS Mutex nicht greifen"
+
+#~ msgid "Can't ungrab FS mutex"
+#~ msgstr "Kann FS Mutex nicht loslassen"
+
+#~ msgid "Can't allocate FS mutex"
+#~ msgstr "Kann FS Mutex nicht anlegen"
+
+#~ msgid " expected: %s"
+#~ msgstr " erwartet: %s"
+
+#~ msgid " actual: %s"
+#~ msgstr "tatsächlich: %s"
+
+#, fuzzy
+#~ msgid "Attempt to obliterate '%s' using itself "
+#~ msgstr "Versuch, Deltas von »%s« gegen sich selber zu erstellen"
+
+#~ msgid "Bad ID in cache"
+#~ msgstr "Fehlerhafte ID im Zwischenspeicher"
+
+#~ msgid "Kindless noderev in cache"
+#~ msgstr "Nutzlose Knotenrevision im Zwischenspeicher"
+
+#~ msgid "Unknown kind for noderev in cache: '%c'"
+#~ msgstr "Unbekannte Art der Knotenrevision im Zwischenspeicher: »%c«"
+
+#~ msgid "Unterminated ID in cache"
+#~ msgstr "Nicht abgeschlossene ID im Zwischenspeicher"
+
+#~ msgid "Bogus ID '%s' in cache"
+#~ msgstr "Fehlerhafte ID »%s« im Zwischenspeicher"
+
+#~ msgid "No created path"
+#~ msgstr "Kein erzeugter Pfad"
+
+#~ msgid "Unknown node type in cache: '%c'"
+#~ msgstr "Unbekannter Knotentyp im Zwischenspeicher: »%c«"
+
+#~ msgid "Can't create FSFS write-lock mutex"
+#~ msgstr "Kann FSFS Schreibschutz-Mutex nicht anlegen"
+
+#~ msgid "Can't create FSFS txn-current mutex"
+#~ msgstr "Kann FSFS-txn-current-Mutex nicht anlegen"
+
+# CHECKME: s/txn list/txn-list/? Compare txn-current
+#~ msgid "Can't create FSFS txn list mutex"
+#~ msgstr "Kann FSFS-txn-list-Mutex nicht anlegen"
+
+#~ msgid "Revision file '%s' does not exist, and r%ld is not packed"
+#~ msgstr "Revisionsdatei »%s« existiert nicht und r%ld ist nicht gepackt"
+
+#~ msgid "Can't grab FSFS txn list mutex"
+#~ msgstr "Kann FSFS-txn-list-Mutex nicht greifen"
+
+#~ msgid "Can't ungrab FSFS txn list mutex"
+#~ msgstr "Kann FSFS-txn-list-Mutex nicht loslassen"
+
+#~ msgid "Can't grab FSFS mutex for '%s'"
+#~ msgstr "Kann FSFS-Mutex für »%s« nicht greifen"
+
+#~ msgid "Can't ungrab FSFS mutex for '%s'"
+#~ msgstr "Kann FSFS-Mutex für »%s« nicht loslassen"
+
+#~ msgid "svndiff data requested non-existent source"
+#~ msgstr "svndiff-Daten verlangten nicht existierende Quelle"
+
+#~ msgid "svndiff requested position beyond end of stream"
+#~ msgstr "Von svndiff verlangte Position ist jenseits des Datenstromendes"
+
+#, fuzzy
+#~ msgid "Obliteration of already-packed revision is not supported"
+#~ msgstr "Annotieren der WORKING-Revision wird nicht unterstützt"
+
+#~ msgid "Could not fetch the Version Resource URL (needed during an import or when it is missing from the local, cached props)"
+#~ msgstr "Konnte die Versionsressourcen-URL nicht bestimmen (wird für einen Import oder, falls sie in den lokalen, zwischengespeicherten Eigenschaften fehlt, benötigt)"
+
+#~ msgid "File or directory '%s' is out of date; try updating"
+#~ msgstr "Datei oder Verzeichnis »%s« ist veraltet; versuchen Sie zu aktualisieren"
+
+#~ msgid "The CHECKOUT response did not contain a 'Location:' header"
+#~ msgstr "Die CHECKOUT-Antwort enthielt keinen »Location:« Kopf"
+
+#~ msgid "Could not save the URL of the version resource"
+#~ msgstr "Konnte die URL der versionierten Ressource nicht speichern"
+
+#~ msgid "Could not get content-type from response"
+#~ msgstr "Konnte »content-type« nicht aus der Antwort lesen"
+
+#~ msgid "Could not save file"
+#~ msgstr "Konnte Datei nicht sichern"
+
+#~ msgid "Server response missing the expected deadprop-count property"
+#~ msgstr "Die Serverantwort enthält die erwartete Eigenschaft »deadprop-count« nicht"
+
+# FIXME: collect messages!
+#~ msgid "Missing rev attr in target-revision element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »target-revision«"
+
+#~ msgid "Missing path attr in resource element"
+#~ msgstr "Fehlendes Pfadattribut in Ressourcen-Element"
+
+#~ msgid "Missing rev attr in open-directory element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »open-directory«"
+
+#~ msgid "Missing copyfrom-rev attr in add-directory element"
+#~ msgstr "Fehlendes Attribut »copyfrom-rev« in Element »add-directory«"
+
+#~ msgid "Missing rev attr in open-file element"
+#~ msgstr "Fehlendes Revisionsattribut in Element »open-file«"
+
+#~ msgid "Missing copyfrom-rev attr in add-file element"
+#~ msgstr "Fehlendes Attribut »copyfrom-rev« in Element »add-file«"
+
+#~ msgid "Missing name attr in set-prop element"
+#~ msgstr "Fehlendes Namensattribut in Element »set-prop«"
+
+#~ msgid "Missing name attr in remove-prop element"
+#~ msgstr "Fehlendes Namensattribut in Element »remove-prop«"
+
+#~ msgid "Unknown XML encoding: '%s'"
+#~ msgstr "Unbekannte XML Kodierung: »%s«"
+
+#~ msgid "REPORT response handling failed to complete the editor drive"
+#~ msgstr "Die Abwicklung der REPORT-Antwort konnte den Editorlauf nicht vollenden."
+
+#~ msgid "Failed to write full amount to stream"
+#~ msgstr "Konnte nicht alles in den Datenstrom schreiben"
+
+#~ msgid "The file-revs report didn't contain any revisions"
+#~ msgstr "Der Report »file-revs« enthielt keine Revisionen"
+
+#~ msgid "Server does not support date-based operations"
+#~ msgstr "Server unterstützt keine datumsbasierten Operationen"
+
+#~ msgid "Invalid server response to dated-rev request"
+#~ msgstr "Ungültige Antwort des Servers auf datierte Revisionsanfrage"
+
+#~ msgid "Expected a valid revnum and path"
+#~ msgstr "Erwartete eine gültige Revisionsnummer samt Pfad"
+
+#~ msgid "Incomplete lock data returned"
+#~ msgstr "Unvollständige Sperrdaten zurückgegeben"
+
+#~ msgid "Invalid creation date header value in response."
+#~ msgstr "Ungültiges Erzeugungsdatum im Header-Feld in Antwort."
+
+#~ msgid "Failed to parse URI '%s'"
+#~ msgstr "Konnte URI »%s« nicht zerlegen"
+
+#~ msgid "Failed to fetch lock information"
+#~ msgstr "Konnte Sperrinformationen nicht ermitteln"
+
+#~ msgid "Missing name attr in revprop element"
+#~ msgstr "Fehlendes Namensattribut in Element »revprop«"
+
+#~ msgid "Protocol error: we told the server not to auto-merge any resources, but it said that '%s' was merged"
+#~ msgstr "Protokollfehler: Wir haben dem Server mitgeteilt, Ressourcen nicht automatisch zusammenzuführen, aber dieser behauptet, dass »%s« zusammengeführt wurde"
+
+#~ msgid "Internal error: there is an unknown parent (%d) for the 'DAV:response' element within the MERGE response"
+#~ msgstr "Interner Fehler: Es gibt ein unbekanntes Elternteil (%d) für das »DAV:response« Element innerhalb der MERGE-Antwort"
+
+#~ msgid "Protocol error: the MERGE response for the '%s' resource did not return all of the properties that we asked for (and need to complete the commit)"
+#~ msgstr "Protokollfehler: Die MERGE-Antwort für die »%s«-Ressource hat nicht alle angeforderten Eigenschaften zurück geliefert (und Übertragung muss beendet werden)"
+
+#~ msgid "The MERGE property response had an error status"
+#~ msgstr "Die MERGE-Eigenschaftsantwort hatte einen Fehlerstatus"
+
+#~ msgid "The OPTIONS response did not include the requested activity-collection-set; this often means that the URL is not WebDAV-enabled"
+#~ msgstr "Die OPTIONS-Antwort enthielt nicht das angeforderte »activity-collection-set«; dies heißt oft, dass die URL nicht WebDAV-fähig ist"
+
+#~ msgid "Failed to find label '%s' for URL '%s'"
+#~ msgstr "Marke »%s« für URL »%s« nicht gefunden"
+
+#~ msgid "'%s' was not present on the resource '%s'"
+#~ msgstr "»%s« existierte nicht für die Ressource »%s«"
+
+#~ msgid "Neon was unable to parse URL '%s'"
+#~ msgstr "Neon konnte die URL »%s« nicht zerlegen"
+
+#~ msgid "The path was not part of a repository"
+#~ msgstr "Der Pfad war kein Teil eines Projektarchivs"
+
+#~ msgid "No part of path '%s' was found in repository HEAD"
+#~ msgstr "Kein Teil des Pfades »%s« wurde in HEAD des Projektarchivs gefunden"
+
+#~ msgid "The VCC property was not found on the resource"
+#~ msgstr "Die VCC Eigenschaft wurde in der Ressource nicht gefunden"
+
+#~ msgid "The relative-path property was not found on the resource"
+#~ msgstr "Die »relative-path« Eigenschaft wurde in der Ressource nicht gefunden"
+
+#~ msgid "'DAV:baseline-collection' was not present on the baseline resource"
+#~ msgstr "»DAV:baseline-collection« ist nicht in der Baseline-Ressource enthalten"
+
+# TODO: proper translation for Baseline
+#~ msgid "'%s' was not present on the baseline resource"
+#~ msgstr "»%s« existierte nicht für die Baseline-Ressource"
+
+#~ msgid "Got apply-textdelta element without preceding add-file or open-file"
+#~ msgstr "Fand Element »apply-textdelta« ohne vorhergehendes »add-file« oder »open-file«"
+
+#~ msgid "Got close-file element without preceding add-file or open-file"
+#~ msgstr "Fand Element »close-file« ohne vorhergehendes »add-file« oder »open-file«"
+
+# FIXME: inkonsistent zu obigen Meldungen: open_directory statt opening a directory
+# (Wird Bezug zu Elementen in Dump hergestellt oder nicht?)
+#~ msgid "Got close-directory element without ever opening a directory"
+#~ msgstr "Fand Element »close-directory« ohne vorhergehendes Öffnen eines Verzeichnisses"
+
+#~ msgid "Got cdata content for a prop delete"
+#~ msgstr "Fand cdata-Inhalt für eine Eigenschaftslöschung"
+
+#~ msgid "PIN for token \"%s\" in slot \"%s\""
+#~ msgstr "PIN für Token »%s« in Slot »%s«"
+
+#~ msgid "Invalid config: illegal character in debug mask value"
+#~ msgstr "Ungültige Konfiguration: Illegales Zeichen in Debugmaske"
+
+#~ msgid "Module for accessing a repository via WebDAV protocol using Neon."
+#~ msgstr "Modul zum Zugriff auf ein Projektarchiv über das Protokoll WebDAV mittels Neon."
+
+#~ msgid "URL '%s' is malformed or the scheme or host or path is missing"
+#~ msgstr "URL »%s« ist fehlerhaft oder das Schema, der Rechner oder Pfad fehlt"
+
+#~ msgid "Network socket initialization failed"
+#~ msgstr "Initialisierung der Netzwerkverbindung schlug fehl"
+
+#~ msgid "SSL is not supported"
+#~ msgstr "SSL wird nicht unterstützt"
+
+#~ msgid "Invalid config: unable to load PKCS#11 provider '%s'"
+#~ msgstr "Ungültige Konfiguration: PKCS#11-Anbieter »%s« kann nicht geladen werden"
+
+#~ msgid "Unsupported RA loader version (%d) for ra_neon"
+#~ msgstr "Nicht unterstützte Zugriffsmodul-Laderversion (%d) für ra_neon"
+
+#~ msgid "The request response contained at least one error"
+#~ msgstr "Die Antwort auf die Anfrage enthielt zumindest einen Fehler"
+
+#~ msgid "The response contains a non-conforming HTTP status line"
+#~ msgstr "Die Antwort enthält eine nicht konforme HTTP-Statuszeile"
+
+#~ msgid "Error setting property '%s': "
+#~ msgstr "Fehler beim Setzen der Eigenschaft »%s«: "
+
+# FIXME: missing translator comments!
+#~ msgid "Server sent unexpected return value (%d %s) in response to %s request for '%s'"
+#~ msgstr "Der Server hat einen unerwarteten Rückgabewert (%d %s) in Antwort auf die Anfrage %s für »%s« zurückgeliefert"
+
+#~ msgid "authorization failed: %s"
+#~ msgstr "Autorisierung schlug fehl: %s"
+
+#~ msgid "authorization failed"
+#~ msgstr "Autorisierung schlug fehl"
+
+#~ msgid "could not connect to server"
+#~ msgstr "Konnte keine Verbindung zum Server herstellen"
+
+#~ msgid "timed out waiting for server"
+#~ msgstr "Zeitüberschreitung beim Warten auf Server"
+
+#~ msgid "Can't calculate the request body size"
+#~ msgstr "Kann die Größe der Anfrage nicht berechnen"
+
+#~ msgid "The %s request returned invalid XML in the response: %s (%s)"
+#~ msgstr "Die %s-Anfrage gab in der Antwort ungültiges XML zurück: %s (%s)"
+
+#~ msgid "Error reading spooled %s request response"
+#~ msgstr "Fehler beim Lesen der Antwort auf die %s Anfrage von Festplatte"
+
+#~ msgid "Missing 'realm' attribute in Authorization header"
+#~ msgstr "Fehlendes Attribut »realm« in Autorisations-Header"
+
+# CHECKME: full stop in error message?
+#~ msgid "Incorrect response-digest in Authentication-Info header."
+#~ msgstr "Falsche Antwortnummer im Header der Authentifizierungs-Informationen."
+
+#~ msgid ""
+#~ "Initialization of the GSSAPI context failed.\n"
+#~ " %s\n"
+#~ " %s\n"
+#~ msgstr ""
+#~ "Initialisierung des GSSAPI-Kontextes schlug fehl.\n"
+#~ " %s\n"
+#~ " %s\n"
+
+#~ msgid "Location segment report failed on '%s'@'%ld'"
+#~ msgstr "Ortssegmentreport schlug auf »%s«@»%ld« fehl"
+
+#~ msgid "Error retrieving replay REPORT (%d)"
+#~ msgstr "Fehler beim Holen des Wiederholungs-REPORT (%d)"
+
+#~ msgid "Could not lookup hostname `%s'"
+#~ msgstr "Konnte Rechnernamen »%s« nicht nachschlagen"
+
+#~ msgid "The OPTIONS response did not include the requested resourcetype value"
+#~ msgstr "Die OPTIONS-Antwort enthielt nicht den angeforderten Wert »resourcetype«"
+
+# CHECKME, has to match first %s in "local %s, incoming %s upon %s"
+#, fuzzy
+#~ msgid "Obliteration"
+#~ msgstr "blockiert"
+
+#~ msgid "Can't create pipe for hook '%s'"
+#~ msgstr "Kann »Pipe« für Aktion »%s« nicht anlegen"
+
+# CHECKME: non-inherited = losgelöst???
+#~ msgid "Can't make pipe read handle non-inherited for hook '%s'"
+#~ msgstr "Kann Pipe-Lese-Handle für Aktion »%s« nicht nicht-erbbar machen"
+
+#~ msgid "Can't make pipe write handle non-inherited for hook '%s'"
+#~ msgstr "Kann Pipe-Schreib-Handle für Aktion »%s« nicht nicht-erbbar machen"
+
+#~ msgid "Error closing write end of stderr pipe"
+#~ msgstr "Fehler beim Schließen des Schreib-Endes der Standardfehlerausgabe"
+
+#~ msgid "Error closing read end of stderr pipe"
+#~ msgstr "Fehler beim Schließen des Lese-Endes der Standardfehlerausgabe"
+
+#, fuzzy
+#~ msgid "Repository has not been enabled to accept obliteration"
+#~ msgstr "Für diese Operation wird Zugang zum Projektarchiv benötigt"
+
+#~ msgid "Creating pre-obliterate hook"
+#~ msgstr "Erzeuge Aktion »pre-obliterate«"
+
+#~ msgid "Creating post-obliterate hook"
+#~ msgstr "Erzeuge Aktion »post-obliterate«"
+
+#~ msgid "Can't grab DSO mutex"
+#~ msgstr "Kann DSO-Mutex nicht greifen"
+
+#~ msgid "Can't ungrab DSO mutex"
+#~ msgstr "Kann DSO-Mutex nicht loslassen"
+
+#~ msgid "NULL mergeinfo\n"
+#~ msgstr "Zusammenführungsinformationen sind NULL\n"
+
+#~ msgid "empty mergeinfo\n"
+#~ msgstr "Zusammenführungsinformationen sind leer\n"
+
+#~ msgid "Schema format %d not recognized"
+#~ msgstr "Schema-Format %d wird nicht erkannt"
+
+#~ msgid "Expected SQLite database not found: %s"
+#~ msgstr "Erwartete SQLite-Datenbank wurde nicht gefunden: %s"
+
+#~ msgid "Number '%s' is out of range '[%llu, %llu]'"
+#~ msgstr "Zahl »%s« ist außerhalb des zulässigen Bereichs »[%llu, %llu]«"
+
+#~ msgid "Number '%s' is out of range '[%lld, %lld]'"
+#~ msgstr "Zahl »%s« ist außerhalb des zulässigen Bereichs »[%lld, %lld]«"
+
+#~ msgid "Can't lock charset translation mutex"
+#~ msgstr "Kann das Semaphor zur Zeichensatzkonvertierung nicht sperren"
+
+#~ msgid "Can't unlock charset translation mutex"
+#~ msgstr "Kann das Semaphor zur Zeichensatzkonvertierung nicht freigeben"
+
+#~ msgid "Can't retrieve base revision for %s"
+#~ msgstr "Kann Basisrevision für »%s« nicht abfragen"
+
+#~ msgid "Node '%s' has no pristine base text"
+#~ msgstr "Knoten »%s« hat keine ursprüngliche Textbasis"
+
+#~ msgid "File '%s' has no text base"
+#~ msgstr "Datei »%s« hat keine Textbasis"
+
+#~ msgid "Cannot revert '%s': unsupported entry node kind"
+#~ msgstr "Kann »%s« nicht zurücksetzen: nicht unterstützter Eintragsknotentyp"
+
+#~ msgid "Cannot revert '%s': unsupported node kind in working copy"
+#~ msgstr "Kann »%s« nicht zurücksetzen: nicht unterstützter Knotentyp in Arbeitskopie"
+
+#~ msgid "'%s' is a directory, and thus cannot be a member of a changelist"
+#~ msgstr "»%s« ist ein Verzeichnis and kann deswegen nicht Element einer Änderungsliste sein"
+
+#~ msgid ""
+#~ "Trying to create property '%s' with value '%s',\n"
+#~ "but it has been locally deleted."
+#~ msgstr ""
+#~ "Versuch, die Eigenschaft »%s« mit dem Wert »%s« anzulegen,\n"
+#~ "aber die Eigenschaft wurde lokal bereits gelöscht."
+
+#~ msgid ""
+#~ "Trying to delete property '%s' with value '%s',\n"
+#~ "but it has been modified from '%s' to '%s'."
+#~ msgstr ""
+#~ "Versuch, die Eigenschaft »%s« mit dem Wert »%s« zu löschen,\n"
+#~ "aber der Wert wurde von »%s« nach »%s« geändert."
+
+#~ msgid ""
+#~ "Trying to delete property '%s' with value '%s',\n"
+#~ "but property with value '%s' is locally deleted."
+#~ msgstr ""
+#~ "Versuch, die Eigenschaft »%s« mit dem Wert »%s« zu löschen,\n"
+#~ "aber die Eigenschaft mit dem Wert »%s« wurde lokal gelöscht."
+
+#~ msgid ""
+#~ "Checksum mismatch indicates corrupt text base for file: '%s':\n"
+#~ " expected: %s\n"
+#~ " actual: %s\n"
+#~ msgstr ""
+#~ "Prüfsummenfehler ist Anzeichen für beschädigte Textbasis der Datei: »%s«\n"
+#~ " Erwartet: %s\n"
+#~ " Tatsächlich: %s\n"
+
+#~ msgid "Failed to add directory '%s': a separate working copy with the same name already exists"
+#~ msgstr "Konnte Verzeichnis »%s« nicht hinzufügen: ein andere Arbeitskopie mit gleichem Namen existiert bereits"
+
+#~ msgid "Switched directory '%s' does not match expected URL '%s'"
+#~ msgstr "Umgestelltes Vereichnis »%s« entspricht nicht der erwarteten URL »%s«"
+
+#~ msgid "Failed to add directory '%s': a non-directory object of the same name already exists"
+#~ msgstr "Konnte Verzeichnis »%s« nicht hinzufügen: ein nicht-Verzeichnisobjekt mit demselben Namen existiert bereits"
+
+#~ msgid "Switched file '%s' does not match expected URL '%s'"
+#~ msgstr "Umgestellte Datei »%s« entspricht nicht der erwarteten URL »%s«"
+
+#~ msgid "Unrecognized node kind: '%s'"
+#~ msgstr "Unbekannter Knotentyp: »%s«"
+
+#~ msgid "Cannot upgrade with existing logs; please run 'svn cleanup' with Subversion 1.6"
+#~ msgstr "Kann die Arbeitskopie nicht in ein neues Format bringen; bitte führen Sie »svn cleanup« mit Subversion 1.6 aus"
+
+#~ msgid "The working copy '%s' is at format 18; use 'tools/dev/wc-ng/bump-to-19.py' to upgrade it"
+#~ msgstr "Die Arbeitskopie »%s« hat das Format 18; verwenden Sie »tools/dev/wc-ng/bump-to-19.py« um es in ein neues Format zu bringen"
+
+#~ msgid "Could not find node '%s' for recording file information."
+#~ msgstr "Knoten »%s« für Aufzeichnung von Dateiinformationen nicht gefunden."
+
+#~ msgid "'%s' has no BASE_NODE"
+#~ msgstr "»%s« hat keinen »BASE_NODE«"
+
+#~ msgid "Error restoring text for '%s'"
+#~ msgstr "Fehler beim Wiederherstellen des Textes für »%s«"
+
+#~ msgid "Error processing post-commit work for '%s'"
+#~ msgstr "Fehler beim Verarbeiten der Arbeitsschritte nach Übertragung für »%s«"
+
+#~ msgid "svn: warning: The depth of this commit is '%s', but copied directories will regardless be committed with depth '%s'. You must remove unwanted children of those directories in a separate commit.\n"
+#~ msgstr "svn: Warnung: Die Tiefe dieser Übertragung ist »%s«, jedoch werden kopierte Verzeichnisse dennoch mit Tiefe »%s« übertragen. Sie müssen nicht gewollte Kinder dieser Verzeichnisse in einer gesonderten Übertragung entfernen.\n"
+
+#~ msgid "They want to delete the property, you want to change the value to '%s'.\n"
+#~ msgstr "Versuch, die Eigenschaft zu löschen, aber der Wert soll auf »%s« gesetzt werden.\n"
+
+#~ msgid "They want to change the property value to '%s', you want to delete the property.\n"
+#~ msgstr "Versuch, den Wert der Eigenschaft auf »%s« zu ändern, aber die Eigenschaft soll gelöscht werden.\n"
+
+# Once you change "Auswahl:" don't forget to adapt indentation of other strings!
+#~ msgid "Select: (p) postpone"
+#~ msgstr "Auswahl: (p) zurückstellen"
+
+#~ msgid ", (df) diff-full, (e) edit"
+#~ msgstr ", (df) voller Diff, (e) editieren"
+
+#~ msgid ""
+#~ ",\n"
+#~ " (mc) mine-conflict, (tc) theirs-conflict"
+#~ msgstr ""
+#~ ",\n"
+#~ " (mc) eigene konfliktbehaftete Datei, (tc) fremde konfliktbehaftete Datei"
+
+#~ msgid ""
+#~ ",\n"
+#~ " (mf) mine-full, (tf) theirs-full"
+#~ msgstr ""
+#~ ",\n"
+#~ " (mf) volle eigene Datei, (tf) volle fremde Datei"
+
+# CHECKME: translate mine-conflict, ... or not (sometimes used as option!)?
+#~ msgid ""
+#~ "\n"
+#~ " (e) edit - change merged file in an editor\n"
+#~ " (df) diff-full - show all changes made to merged file\n"
+#~ " (r) resolved - accept merged version of file\n"
+#~ "\n"
+#~ " (dc) display-conflict - show all conflicts (ignoring merged version)\n"
+#~ " (mc) mine-conflict - accept my version for all conflicts (same)\n"
+#~ " (tc) theirs-conflict - accept their version for all conflicts (same)\n"
+#~ "\n"
+#~ " (mf) mine-full - accept my version of entire file (even non-conflicts)\n"
+#~ " (tf) theirs-full - accept their version of entire file (same)\n"
+#~ "\n"
+#~ " (p) postpone - mark the conflict to be resolved later\n"
+#~ " (l) launch - launch external tool to resolve conflict\n"
+#~ " (s) show all - show this list\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ " (e) editieren - zusammengeführte Datei in einem Editor ändern\n"
+#~ " (df) voller Diff - alle Änderungen in der zusammengeführten Datei anzeigen\n"
+#~ " (r) aufgelöst - akzeptieren der zusammengeführten Version der Datei\n"
+#~ " (dc) Konflikte anzeigen - alle Konflikte anzeigen (die zusammengeführte Version\n"
+#~ " ignorieren)\n"
+#~ " (mc) mine-conflict - eigene Version für alle Konflikte akzeptieren (das selbe)\n"
+#~ " (tc) theirs-conflict - fremde Version für alle Konflikte akzeptieren (das selbe)\n"
+#~ "\n"
+#~ " (mf) volle eigene Datei - die eigene Version der kompletten Datei akzeptieren\n"
+#~ " (selbst Nicht-Konflikte)\n"
+#~ " (tf) volle fremde Datei - die fremde Version der kompletten Datei akzeptieren\n"
+#~ " (das selbe)\n"
+#~ " (p) zurückstellen - den Konflikt erst später auflösen\n"
+#~ " (l) starten - Starten eines externen Programms zur Konfliktauflösung\n"
+#~ " (s) alle anzeigen - diese Liste anzeigen\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Invalid option; cannot choose based on conflicts for properties.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ungültige Option; Auswahl anhand von Konflikten ist für Eigenschaften nicht möglich.\n"
+#~ "\n"
+
+# TODO: merge with other messages
+#~ msgid "Select: (p) postpone, (mf) mine-full, (tf) theirs-full, (h) help:"
+#~ msgstr "Auswahl: (p) zurückstellen, (mf) volle eigene Datei, (tf) volle fremde Datei, (h) Hilfe:"
+
+#~ msgid ""
+#~ " (p) postpone - resolve the conflict later\n"
+#~ " (mf) mine-full - accept pre-existing item (ignore upstream addition)\n"
+#~ " (tf) theirs-full - accept incoming item (overwrite pre-existing item)\n"
+#~ " (h) help - show this help\n"
+#~ "\n"
+#~ msgstr ""
+#~ " (p) zurückstellen - den Konflikt erst später auflösen\n"
+#~ " (mf) volle eigene Datei - vorher existierende Daten akzeptieren (Hinzufügungen\n"
+#~ " ignorieren)\n"
+#~ " (tf) volle fremde Datei - eingehende Daten akzeptieren (überschreiben vorher\n"
+#~ " existierender Daten)\n"
+#~ " (h) Hilfe - diese Hilfe anzeigen\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "%s: (Not a versioned resource)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s: (Keine versionierte Ressource)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "%s: (Not a valid URL)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s: (Keine gültige URL)\n"
+#~ "\n"
+
+#~ msgid "the change made by revision ARG (like -r ARG-1:ARG)\n"
+#~ msgstr "die in Revision PAR durchgeführte Änderung (wie -r PAR-1:PAR)\n"
+
+#~ msgid "ARG (some commands also take ARG1:ARG2 range)\n"
+#~ msgstr "PAR (einige Kommandos akzeptieren auch Bereiche PAR1:PAR2)\n"
+
+#~ msgid "limit operation by depth ARG ('empty', 'files',\n"
+#~ msgstr "begrenzt Operation durch Tiefe PAR (»empty«, »files«,\n"
+
+#~ msgid "set user configuration option in the format:\n"
+#~ msgstr "Konfigurationsoption in diesem Format setzen:\n"
+
+#~ msgid "Allow merge into mixed-revision working copy.\n"
+#~ msgstr "Erlaube Zusammenführung in eine Arbeitskopie mit verschiedenen Revisionen.\n"
+
+# FIXME: WCPATH oder WC_PATH?
+#, fuzzy
+#~ msgid ""
+#~ "Apply the differences between two sources to a working copy path.\n"
+#~ "usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]\n"
+#~ " 2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]\n"
+#~ " 3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]\n"
+#~ "\n"
+#~ " 1. In the first form, the source URLs are specified at revisions\n"
+#~ " N and M. These are the two sources to be compared. The revisions\n"
+#~ " default to HEAD if omitted.\n"
+#~ "\n"
+#~ " 2. In the second form, the URLs corresponding to the source working\n"
+#~ " copy paths define the sources to be compared. The revisions must\n"
+#~ " be specified.\n"
+#~ "\n"
+#~ " 3. In the third form, SOURCE can be either a URL or a working copy\n"
+#~ " path (in which case its corresponding URL is used). SOURCE (in\n"
+#~ " revision REV) is compared as it existed between revisions N and M\n"
+#~ " for each revision range provided. If REV is not specified, HEAD\n"
+#~ " is assumed. '-c M' is equivalent to '-r <M-1>:M', and '-c -M'\n"
+#~ " does the reverse: '-r M:<M-1>'. If no revision ranges are\n"
+#~ " specified, the default range of 0:REV is used. Multiple '-c'\n"
+#~ " and/or '-r' options may be specified, and mixing of forward\n"
+#~ " and reverse ranges is allowed.\n"
+#~ "\n"
+#~ " WCPATH is the working copy path that will receive the changes.\n"
+#~ " If WCPATH is omitted, a default value of '.' is assumed, unless\n"
+#~ " the sources have identical basenames that match a file within '.':\n"
+#~ " in which case, the differences will be applied to that file.\n"
+#~ "\n"
+#~ " For each merged item a line will be printed with characters reporting\n"
+#~ " the action taken. These characters have the following meaning:\n"
+#~ "\n"
+#~ " A Added\n"
+#~ " D Deleted\n"
+#~ " U Updated\n"
+#~ " C Conflict\n"
+#~ " G Merged\n"
+#~ " E Existed\n"
+#~ " R Replaced\n"
+#~ "\n"
+#~ " Characters in the first column report about the item itself.\n"
+#~ " Characters in the second column report about properties of the item.\n"
+#~ " A 'C' in the third column indicates a tree conflict, while a 'C' in\n"
+#~ " the first and second columns indicate textual conflicts in files\n"
+#~ " and in property values, respectively.\n"
+#~ "\n"
+#~ " NOTE: Subversion will only record metadata to track the merge\n"
+#~ " if the two sources are on the same line of history -- if the\n"
+#~ " first source is an ancestor of the second, or vice-versa. This is\n"
+#~ " guaranteed to be the case when using the third form listed above.\n"
+#~ " The --ignore-ancestry option overrides this, forcing Subversion to\n"
+#~ " regard the sources as unrelated and not to track the merge.\n"
+#~ msgstr ""
+#~ "Wendet die Unterschiede zwischen zwei Quellen auf einen Arbeitskopiepfad\n"
+#~ "an.\n"
+#~ "Aufruf: 1. merge QuellURL1[@N] QuellURL2[@M] [AKPfad]\n"
+#~ " 2. merge QuellAKPfad1@N QuellAKPfad2@M [AKPfad]\n"
+#~ " 3. merge [-c M[,N...] | -r N:M ...] QUELLE[@REV] [AKPfad]\n"
+#~ "\n"
+#~ " 1. In der ersten Form werden die Quell-URLs in den Revisionen\n"
+#~ " N und M angegeben. Dies sind die beiden Quellen, die verglichen werden.\n"
+#~ " Die Revisionen entsprechen HEAD, wenn keine Nummern angegeben wurden.\n"
+#~ "\n"
+#~ " 2. In der zweiten Form werden die den Arbeitskopiepfaden entsprechenden\n"
+#~ " URLs miteinander verglichen. Die Revisionen müssen angegeben werden.\n"
+#~ "\n"
+#~ " 3. In der dritten Form kann QUELLE eine URL oder ein Arbeitskopiepfad\n"
+#~ " (in diesem Fall wird die entsprechende URL verwendet) sein. QUELLE\n"
+#~ " (in Revision REV) wird verglichen, wie es zwischen den Revisionen N\n"
+#~ " und M für jeden angegebenen Revisionsbereich existierte. Ohne Angabe\n"
+#~ " von REV wird HEAD verwendet. Die Option »-c M« ist äquivalent zu\n"
+#~ " »-r <M-1>:M« und »-c -M« kehrt dies um: »-r M:<M-1>«. Falls keine\n"
+#~ " Revisionsbereiche angegeben wurden, wird 0:REV verwendet. Mehrere\n"
+#~ " Angaben von »-c« und/oder »-r« sind möglich und das Mischen von\n"
+#~ " vor- und rückwärtigen Bereichen ist erlaubt.\n"
+#~ "\n"
+#~ " AKPfad ist der Arbeitskopiepfad, in den die Änderungen geschrieben werden.\n"
+#~ " Die Vorgabe für AKPfad ist ».«, es sei denn, die Quellen haben einen\n"
+#~ " identischen Basisnamen, der eine Datei unterhalb von ».« beschreibt.\n"
+#~ " In diesem Fall werden die Änderungen auf die gefundene Datei angewandt.\n"
+#~ "\n"
+#~ " ACHTUNG: Subversion wird nur Metadaten zum Verfolgen der Zusammenführung\n"
+#~ " aufzeichnen, falls die zwei Quellen sich in der selben Historienabfolge\n"
+#~ " befinden - falls die erste Quelle ein Vorgänger der zweiten ist oder\n"
+#~ " umgekehrt. Dies ist garantiert der Fall, falls die dritte Form verwendet\n"
+#~ " wird. Die Option --ignore-ancestry überschreibt dies und zwingt Subversion\n"
+#~ " dazu, die Quellen als nicht zueinander bezogen zu betrachten und die\n"
+#~ " Zusammenführung nicht aufzuzeichnen.\n"
+
+#~ msgid ""
+#~ "Display merge-related information.\n"
+#~ "usage: mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
+#~ "\n"
+#~ " Display information related to merges (or potential merges) between\n"
+#~ " SOURCE and TARGET (default: '.'). If the --show-revs option\n"
+#~ " is not provided, display revisions which have been merged from\n"
+#~ " SOURCE to TARGET; otherwise, display the type of information\n"
+#~ " specified by the --show-revs option.\n"
+#~ msgstr ""
+#~ "Anzeige relevanter Informationen zu Zusammenführungen.\n"
+#~ "Aufruf: mergeinfo QUELLE[@REV] [ZIEL[@REV]]\n"
+#~ "\n"
+#~ " Zeigt Informationen zu Zusammenführungen (oder potentiellen\n"
+#~ " Zusammenführungen) zwischen QUELLE und ZIEL (Standard: ».«) an.\n"
+#~ " Falls die Option --show-revs nicht angegeben wurde, werden\n"
+#~ " Revisionen, die von QUELLE nach ZIEL zusammengeführt wurden,\n"
+#~ " angezeigt. Andernfalls wird die Art der Information angezeigt,\n"
+#~ " die durch die Option --show-revs spezifiziert wurde.\n"
+
+#~ msgid ""
+#~ "Move and/or rename something in working copy or repository.\n"
+#~ "usage: move SRC... DST\n"
+#~ "\n"
+#~ "When moving multiple sources, they will be added as children of DST,\n"
+#~ "which must be a directory.\n"
+#~ "\n"
+#~ " Note: this subcommand is equivalent to a 'copy' and 'delete'.\n"
+#~ " Note: the --revision option has no use and is deprecated.\n"
+#~ "\n"
+#~ " SRC and DST can both be working copy (WC) paths or URLs:\n"
+#~ " WC -> WC: move and schedule for addition (with history)\n"
+#~ " URL -> URL: complete server-side rename.\n"
+#~ " All the SRCs must be of the same type.\n"
+#~ msgstr ""
+#~ "Verschiebt oder benennt etwas in der Arbeitskopie oder\n"
+#~ "im Projektarchiv um.\n"
+#~ "Aufruf: move QUELLE... ZIEL\n"
+#~ "\n"
+#~ "Beim Verschieben mehrerer Quellen, werden sie als Kinder von ZIEL\n"
+#~ "hinzugefügt, was ein Verzeichnis sein muss.\n"
+#~ "\n"
+#~ " Hinweis: Dieser Unterbefehl entspricht der Folge »copy« und »delete«.\n"
+#~ " Hinweis: Die Option --revision bewirkt nichts und wird missbilligt.\n"
+#~ "\n"
+#~ " QUELLE und ZIEL können beides Arbeitskopiepfade (AK) oder URLs sein:\n"
+#~ " AK -> AK: Verschieben und zum Hinzufügen (mit Historie) einplanen\n"
+#~ " URL -> URL: Vollständig serverseitiges Verschieben.\n"
+#~ " Alle QUELLEn müssen vom selben Typ sein.\n"
+
+#~ msgid ""
+#~ "Resolve conflicts on working copy files or directories.\n"
+#~ "usage: resolve --accept=ARG [PATH...]\n"
+#~ "\n"
+#~ " Note: the --accept option is currently required.\n"
+#~ msgstr ""
+#~ "Auflösen von Konflikten in Arbeitskopiedateien oder -verzeichnissen.\n"
+#~ "Aufruf: resolve --accept=PAR [PFAD...]\n"
+#~ "\n"
+#~ " Bemerkung: Die Option --accept wird zurzeit benötigt.\n"
+
+#~ msgid "--reintegrate cannot be used with --ignore-ancestry or --record-only"
+#~ msgstr "--reintegrate kann nicht mit --ignore-ancestry oder --record-only verwendet werden"
+
+#~ msgid "A working copy merge source needs an explicit revision"
+#~ msgstr "Beim Zusammenführen von Arbeitskopien wird eine explizite Revision benötigt"
+
+#~ msgid "Wrong number of arguments"
+#~ msgstr "Falsche Anzahl von Argumenten"
+
+#~ msgid "Target must specify the revision as a number"
+#~ msgstr "Ziel muss die Revision als Zahl angegeben"
+
+#~ msgid "'%s' has lock token, but no lock owner"
+#~ msgstr "»%s« has Sperrmarke, aber keinen Sperreigner"
+
+#~ msgid "'%s' is an URL when it should be a path"
+#~ msgstr "»%s« ist eine URL, obwohl es ein Pfad sein sollte"
+
+#~ msgid ""
+#~ "use format compatible with Subversion versions\n"
+#~ " earlier than 1.4"
+#~ msgstr "Ein mit Subversion-Versionen vor 1.4 kompatibles Format verwenden"
+
+#~ msgid ""
+#~ "use format compatible with Subversion versions\n"
+#~ " earlier than 1.6"
+#~ msgstr "Ein mit Subversion-Versionen vor 1.6 kompatibles Format verwenden"
+
+#~ msgid ""
+#~ "use format compatible with Subversion versions\n"
+#~ " earlier than 1.7"
+#~ msgstr "Ein mit Subversion-Versionen vor 1.7 kompatibles Format verwenden"
+
+#~ msgid ""
+#~ "usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n"
+#~ "\n"
+#~ "Makes a hot copy of a repository.\n"
+#~ msgstr ""
+#~ "Aufruf: svnadmin hotcopy ARCHIV_PFAD ARCHIV_PFAD_NEU\n"
+#~ "\n"
+#~ "Erstellt eine Kopie des Projektarchivs im laufenden Betrieb.\n"
+
+#~ msgid "Exactly one property name and one file argument required"
+#~ msgstr "Genau ein Eigenschaftsname und ein Dateiparameter erforderlich"
+
+#~ msgid "Exactly one file argument required"
+#~ msgstr "Genau ein Dateiparameter benötigt"
+
+#~ msgid "Delta property block detected - not supported by svndumpfilter"
+#~ msgstr "Delta Eigenschaftsblock erkannt - wird von svndumpfilter nicht unterstützt"
+
+#~ msgid "Pass contents of file ARG as additional args"
+#~ msgstr ""
+#~ "Inhalt der Datei PAR als zusätzliche Parameter\n"
+#~ " übergeben"
+
+#~ msgid ""
+#~ "Default: '-u'. When Subversion is invoking an\n"
+#~ " external diff program, ARG is simply passed along\n"
+#~ " to the program. But when Subversion is using its\n"
+#~ " default internal diff implementation, or when\n"
+#~ " Subversion is displaying blame annotations, ARG\n"
+#~ " could be any of the following:\n"
+#~ " -u (--unified):\n"
+#~ " Output 3 lines of unified context.\n"
+#~ " -b (--ignore-space-change):\n"
+#~ " Ignore changes in the amount of white space.\n"
+#~ " -w (--ignore-all-space):\n"
+#~ " Ignore all white space.\n"
+#~ " --ignore-eol-style:\n"
+#~ " Ignore changes in EOL style"
+#~ msgstr ""
+#~ "Vorgabe: »-u«. Wenn Subversion ein\n"
+#~ " externes Vergleichsprogramm aufruft, wird PAR nur\n"
+#~ " an das Programm weitergereicht. Wenn Subversion\n"
+#~ " aber sein internes Vergleichsprogramm benutzt\n"
+#~ " oder Annotierungen anzeigt, kann PAR einen der\n"
+#~ " folgenden Werte annehmen:\n"
+#~ " -u (--unified):\n"
+#~ " Gibt 3 Zeilen Standardkontext aus.\n"
+#~ " -b (--ignore-space-change):\n"
+#~ " Ignoriert Änderungen in der Anzahl von\n"
+#~ " Leerzeichen.\n"
+#~ " -w (--ignore-all-space):\n"
+#~ " Ignoriert sämtliche Leerzeichen.\n"
+#~ " --ignore-eol-style:\n"
+#~ " Ignoriert Änderungen im EOL-Stil"
+
+#~ msgid "Missing path argument"
+#~ msgstr "Fehlender Pfad Parameter"
+
+#~ msgid "\"svnrdump load\"'s lock was stolen; can't remove it"
+#~ msgstr "Die Sperre von »svnrump load« wurde gestohlen und konnte nicht entfernt werden"
+
+#~ msgid ""
+#~ "general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+#~ "Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n"
+#~ "\n"
+#~ "Available subcommands:\n"
+#~ msgstr ""
+#~ "Aufruf: svnrdump UNTERBEFEHL URL [-r [ VON[:BIS]]\n"
+#~ "Geben Sie »svnrdump help <Unterbefehl>« ein, um Hilfe zu einem\n"
+#~ " Unterbefehl zu erhalten.\n"
+#~ "\n"
+#~ "Verfügbare Unterbefehle:\n"
+
+#~ msgid "LOWER cannot be greater than UPPER.\n"
+#~ msgstr "VON kann nicht größer als BIS sein.\n"
+
+#~ msgid "Parent(s) of '%s' should have been present."
+#~ msgstr "Eltern von »%s« sollten vorhanden sein."
+
+#~ msgid "Cannot reintegrate into a working copy not entirely at infinite depth"
+#~ msgstr "Kann nicht zurück in eine Arbeitskopie integrieren, die keine vollständig unendliche Tiefe hat"
+
+#~ msgid "Properties Last Updated"
+#~ msgstr "Eigenschaften zuletzt geändert"
+
+#~ msgid "UUID mismatch: existing file '%s' was checked out from a different repository"
+#~ msgstr "UUID-Fehler: Existierende Datei »%s« wurde aus einem anderen Projektarchiv ausgecheckt"
+
+#~ msgid "Error comparing '%s' and '%s'"
+#~ msgstr "Fehler beim Vergleichen von »%s« und »%s«"
+
+#~ msgid "Revision type requires a working copy path, not a URL"
+#~ msgstr "Revisionstyp erfordert einen Arbeitskopiepfad, keine URL"
+
+#~ msgid "Can't move source to dest"
+#~ msgstr "Kann Quelle nicht nach Ziel verschieben"
+
+#~ msgid "Can't get file perms for file at '%s' (file stat error)"
+#~ msgstr "Kann die Berechtigungen für Datei in »%s« nicht holen (Dateistatus)"
+
+#~ msgid "Error during add of '%s'"
+#~ msgstr "Fehler beim Hinzufügen von »%s«"
+
+#~ msgid " You have added '%s' locally.\n"
+#~ msgstr " »%s« wurde lokal hinzugefügt.\n"
+
+#~ msgid "Can't write property hash to '%s'"
+#~ msgstr "Kann Eigenschafts-Hashwert nicht nach »%s« schreiben"
+
+#~ msgid "Can't get default file perms for file at '%s' (file stat error)"
+#~ msgstr "Kann die Standardberechtigungen für Datei in »%s« nicht holen (Dateistatus)"
+
+#~ msgid "Your .svn/tmp directory may be missing or corrupt; run 'svn cleanup' and try again"
+#~ msgstr ""
+#~ "Ihr .svn/tmp Verzeichnis könnte fehlen oder beschädigt sein; führen Sie\n"
+#~ "»svn cleanup« aus und versuchen Sie es erneut"
+
+#~ msgid ".patch"
+#~ msgstr ".patch"
+
+#~ msgid "Failed to add file '%s': a file of the same name is already scheduled for addition with history"
+#~ msgstr "Konnte Datei »%s« nicht hinzufügen: eine Datei mit dem selben Namen ist bereits zur Übertragung mit Historie eingeplant"
+
+#~ msgid "Unknown or unexpected kind for path '%s'"
+#~ msgstr "Unbekannte oder unerwartete Art für Pfad »%s«"
+
+#~ msgid "Can't parse '%s'"
+#~ msgstr "Kann »%s« nicht analysieren"
+
+#~ msgid "This action was obstructed by an item in the working copy.\n"
+#~ msgstr "Diese Aktion wurde von einem Objekt in der Arbeitskopie behindert.\n"
+
+#~ msgid ""
+#~ " '%s' does not exist locally.\n"
+#~ " Maybe you renamed it?\n"
+#~ msgstr ""
+#~ " »%s« existiert lokal nicht.\n"
+#~ " Eventuell wurde das Objekt umbenannt?\n"
+
+#~ msgid " The merge attempted to add '%s'.\n"
+#~ msgstr " Die Zusammenführung versuchte »%s« hinzuzufügen.\n"
+
+#~ msgid "'get-location-segments' REPORT not implemented"
+#~ msgstr "»get-locations-segments«-REPORT nicht implementiert"
+
+#~ msgid ""
+#~ "'%s' does not exist locally. Maybe you renamed it? Or has it been\n"
+#~ "renamed in the history of the branch you are merging into?\n"
+#~ msgstr ""
+#~ "»%s« existiert lokal nicht. Eventuell wurde es umbenannt? Oder es wurde\n"
+#~ "in der Geschichte des Zweiges, in den zusammengeführt wird, umbenannt?\n"
+
+#~ msgid ""
+#~ "Send changes from your working copy to the repository.\n"
+#~ "usage: commit [PATH...]\n"
+#~ "\n"
+#~ " A log message must be provided, but it can be empty.\n"
+#~ " OS400 does not support the starting of an editor,\n"
+#~ " so --message or --file must be used. If any targets are\n"
+#~ " (or contain) locked items, those will be unlocked after a\n"
+#~ " successful commit.\n"
+#~ msgstr ""
+#~ "Überträgt Änderungen Ihrer Arbeitskopie in das Projektarchiv.\n"
+#~ "Aufruf: commit [PFAD...]\n"
+#~ "\n"
+#~ " Eine Logmeldung muss angegeben werden; diese kann jedoch leer sein.\n"
+#~ " OS400 unterstützt das Starten eines Editors nicht, so dass --message\n"
+#~ " oder --file benutzt werden muss. Falls Objekte gesperrt sind oder\n"
+#~ " gesperrte Objekte enthalten, werden diese nach einer erfolgreichen\n"
+#~ " Ãœbertragung entsperrt.\n"
+
+#~ msgid " The merge attempted to edit '%s'.\n"
+#~ msgstr " Die Zusammenführung versuchte »%s« zu bearbeiten.\n"
+
+#~ msgid "Entry '%s' is already under version control"
+#~ msgstr "Eintrag »%s« ist bereits unter Versionskontrolle"
+
+#~ msgid ""
+#~ "Checksum mismatch on representation '%s':\n"
+#~ " expected: %s\n"
+#~ " actual: %s\n"
+#~ msgstr ""
+#~ "Prüfsummenfehler auf Darstellung »%s«:\n"
+#~ " Erwartet: %s\n"
+#~ " Tatsächlich: %s\n"
+
+#~ msgid "property '%s' deleted (recursively) from '%s'.\n"
+#~ msgstr "Eigenschaft »%s« wurde (rekursiv) von »%s« gelöscht.\n"
+
+#~ msgid ""
+#~ " The update attempted to delete '%s'\n"
+#~ " (possibly as part of a rename operation).\n"
+#~ msgstr ""
+#~ " Die Aktualisierung versuchte »%s« zu löschen\n"
+#~ " (möglicherweise als Teil einer Umbenennung).\n"
+
+#~ msgid ""
+#~ " The switch attempted to delete '%s'\n"
+#~ " (possibly as part of a rename operation).\n"
+#~ msgstr ""
+#~ " Die Umstellung versuchte »%s« zu löschen\n"
+#~ " (möglicherweise als Teil einer Umbenennung).\n"
+
+#~ msgid " The switch attempted to edit '%s'.\n"
+#~ msgstr " Die Umstellung versuchte »%s« zu bearbeiten.\n"
+
+#~ msgid ""
+#~ "Lock Comment (%i lines):\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "Sperrkommentar (%i Zeilen):\n"
+#~ "%s\n"
+
+#~ msgid ""
+#~ "output in svnpatch format, implies the\n"
+#~ " --no-diff-deleted option"
+#~ msgstr ""
+#~ "Ausgabe in svnpatch-Format, impliziert die\n"
+#~ " Option --no-diff-deleted"
+
+#~ msgid " The switch attempted to add '%s'.\n"
+#~ msgstr " Die Umstellung versuchte »%s« hinzuzufügen.\n"
+
+#~ msgid ""
+#~ " The merge attempted to delete '%s'\n"
+#~ " (possibly as part of a rename operation).\n"
+#~ msgstr ""
+#~ " Die Zusammenführung versuchte »%s« zu löschen\n"
+#~ " (möglicherweise als Teil einer Umbenennung).\n"
+
+#~ msgid " The update attempted to add '%s'.\n"
+#~ msgstr " Die Aktualisierung versuchte »%s« hinzuzufügen.\n"
+
+#~ msgid ""
+#~ "Comment (%i lines):\n"
+#~ "%s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Kommentar (%i Zeilen):\n"
+#~ "%s\n"
+#~ "\n"
+
+#~ msgid "No delimiter after 'action' in tree conflict description"
+#~ msgstr "Kein Trenner nach »action« in Baumkonfliktbeschreibung"
+
+#~ msgid "Unescaped description delimiter inside 'victim_path' in tree conflict description"
+#~ msgstr "Nicht geschützter Beschreibungstrenner innerhalb von »victim_path« der Baumkonfliktbeschreibung"
+
+#~ msgid "Expected tree conflict data but got none"
+#~ msgstr "Daten zu einem Baumkonflikt wurden erwartet aber nichts erhalten"
+
+#~ msgid "No delimiter after 'operation' in tree conflict description"
+#~ msgstr "Kein Trenner nach »operation« in Baumkonfliktbeschreibung"
+
+#~ msgid "Invalid tree conflict data in entries file, but no idea what went wrong"
+#~ msgstr "Ungültige Baumkonfliktdaten in Datei »entries«, Ursache ist unbekannt"
+
+#~ msgid "Bad node_kind in tree conflict description"
+#~ msgstr "Fehlerhafter Wert von »node_kind« in Baumkonfliktbeschreibung"
+
+#~ msgid "No delimiter after 'victim_path' in tree conflict description"
+#~ msgstr "Kein Trenner nach »victim_path« in Baumkonfliktbeschreibung"
+
+#~ msgid "Shallowing of working copy depths is not yet supported"
+#~ msgstr "Das Verringern der Arbeitskopietiefen wird nicht unterstützt"
+
+#~ msgid "Bad action in tree conflict description"
+#~ msgstr "Fehlerhafter Wert von »action« in Baumkonfliktbeschreibung"
+
+#~ msgid "Unexpected end of tree conflict description, within escape sequence in 'victim_path'"
+#~ msgstr "Unerwartetes Ende der Baumkonfliktbeschreibung innerhalb einer Escape-Sequenz in »victim_path«"
+
+#~ msgid "Corrupt working copy: '%s' in directory '%s' (which is scheduled for replacement) has an invalid schedule"
+#~ msgstr ""
+#~ "Beschädigte Arbeitskopie: »%s« im Verzeichnis »%s« (welches zum Ersetzen\n"
+#~ "eingeplant ist) hat einen ungültigen Übertragungsplan"
+
+#~ msgid "No delimiter at end of tree conflict description, even though there is still data left to read"
+#~ msgstr "Es befindet sich kein Trenner am Ende der Baumkonfliktbeschreibung, obwohl weitere zu lesende Daten vorhanden sind"
+
+#~ msgid "Failed to add file '%s': object of the same name already exists"
+#~ msgstr ""
+#~ "Konnte die Datei »%s« nicht hinzufügen: ein Objekt mit demselben Namen\n"
+#~ "existiert bereits"
+
+#~ msgid ""
+#~ "Checksum mismatch, representation '%s':\n"
+#~ " expected: %s\n"
+#~ " actual: %s\n"
+#~ msgstr ""
+#~ "Prüfsummenfehler, Darstellung »%s«:\n"
+#~ " Erwartet: %s\n"
+#~ " Tatsächlich: %s\n"
+
+#~ msgid "Invalid 'operation' field in tree conflict description"
+#~ msgstr "Ungültiges Feld »operation« in Baumkonfliktbeschreibung"
+
+#~ msgid "Entry '%s' has invalid depth"
+#~ msgstr "Eintrag »%s« hat eine ungültige Tiefe"
+
+#~ msgid "Corrupt working copy: '%s' in directory '%s' (which is scheduled for deletion) is not itself scheduled for deletion"
+#~ msgstr ""
+#~ "Beschädigte Arbeitskopie: »%s« im Verzeichnis »%s« (welches zum Löschen\n"
+#~ "eingeplant ist) ist selbst nicht zum Löschen vorgesehen"
+
+#~ msgid "Illegal escaped character in 'victim_path' of tree conflict description"
+#~ msgstr "Ungültiges geschütztes Zeichen in »victim_path« der Baumkonfliktbeschreibung"
+
+#~ msgid "The OPTIONS request returned invalid XML in the response: %s (%s)"
+#~ msgstr "Die OPTIONS-Anfrage gab in der Antwort ungültiges XML zurück: %s (%s)"
+
+#~ msgid "No REPOSITORY table entry for uuid '%s'"
+#~ msgstr "Kein REPOSITORY-Tabelleneintrag für UUID »%s«"
+
+#~ msgid "UUID mismatch: existing directory '%s' was checked out from a different repository"
+#~ msgstr "UUID-Fehler: Existierendes Verzeichnis »%s« wurde aus einem anderen Projektarchiv ausgecheckt"
+
+#~ msgid ""
+#~ "Apply a patch to a working copy path.\n"
+#~ "usage: patch PATCHFILE [WCPATH]\n"
+#~ "\n"
+#~ " PATCHFILE is an input file which, when applied, turns the working\n"
+#~ " copy WCPATH into a modified tree that reflects all the changes the\n"
+#~ " patch carries along. When WCPATH is omitted '.' is assumed.\n"
+#~ "\n"
+#~ " The format of bytes embedded in the patch can be of two types: Unified\n"
+#~ " diff and/or svnpatch diff (see 'svn diff --svnpatch').\n"
+#~ "\n"
+#~ " This command allows some amount of fuzzing as Unidiff is contextual\n"
+#~ " and svnpatch revisionless.\n"
+#~ msgstr ""
+#~ "Wendet einen Patch auf einen Arbeitskopiepfad an.\n"
+#~ "Aufruf: patch PATCHDATEI [AKPfad]\n"
+#~ "\n"
+#~ " PATCHDATEI ist eine Eingabedatei, die, wenn angewandt, die Arbeitskopie\n"
+#~ " AKPfad in einen veränderten Baum umwandelt, der all die Änderungen umfasst,\n"
+#~ " die der Patch enthält. Falls AKPfad weggelassen wird, wird ».« verwendet.\n"
+#~ "\n"
+#~ " Das Format der im Patch eingebetteten Bytes kann von zwei Arten sein:\n"
+#~ " Unified Diff und/oder svnpatch-Diff (vergleiche »svn diff --svnpatch«).\n"
+#~ "\n"
+#~ " Dieses Kommando ermöglicht eine kleine Unschärfe, da Unidiff textabhängig\n"
+#~ " und svnpatch revisionsunabhängig ist.\n"
+
+#~ msgid "exported%s"
+#~ msgstr "exportiert%s"
+
+#~ msgid "Path '%s' is no longer a member of a changelist.\n"
+#~ msgstr "Pfad »%s« ist nicht länger ein Element einer Änderungsliste.\n"
+
+#~ msgid "Checksum mismatch for '%s'; recorded: '%s', actual: '%s'"
+#~ msgstr "Prüfsummenfehler für »%s«; erwartet: »%s«, tatsächlich: »%s«"
+
+#~ msgid "OPTIONS request (for capabilities) got HTTP response code %d"
+#~ msgstr "OPTIONS-Anfrage (für Eigenschaften) führte zu HTTP-Antwort-Code %d"
+
+#~ msgid "'%s' is not a valid revision range"
+#~ msgstr "»%s« ist kein gültiger Revisionsbereich"
+
+#~ msgid "Path '%s' is now a member of changelist '%s'.\n"
+#~ msgstr "Pfad »%s« ist nun ein Element der Änderungsliste »%s«.\n"
+
+#~ msgid "Unrecognized node kind '%s' from server"
+#~ msgstr "Unbekannter Knotentyp »%s« vom Server"
+
+#~ msgid "File or directory '%s' is out of date"
+#~ msgstr "Datei oder Verzeichnis »%s« ist veraltet"
+
+#~ msgid "Bad type indicator"
+#~ msgstr "Falscher Typindikator"
+
+#~ msgid "Corrupt working copy: '%s' has no default entry"
+#~ msgstr "Beschädigte Arbeitskopie: »%s« hat keinen Standardeintrag"
+
+#~ msgid "Unable to parse unordered revision ranges '%s' and '%s'"
+#~ msgstr "Unsortierte Revisionsbereiche »%s« und »%s« können nicht verarbeitet werden"
+
+#~ msgid "'%s' has invalid revision"
+#~ msgstr "»%s« hat eine ungültige Revision"
+
+#~ msgid ""
+#~ "No 'patch' program was found in your system. Please try\n"
+#~ "to use --patch-cmd or 'patch-cmd' run-time configuration\n"
+#~ "option or manually use an external tool to apply Unidiffs."
+#~ msgstr ""
+#~ "Kein »patch«-Programm wurde in Ihrem System gefunden. Bitte versuchen Sie\n"
+#~ "--patch-cmd oder die Laufzeitkonfigurationsoption »patch-cmd«. Alternativ\n"
+#~ "können Sie ein externes Werkzeug einsetzen, um Unidiffs einzuspielen."
+
+#~ msgid "use ARG as external patch command"
+#~ msgstr "PAR als externes Patch-Kommando verwenden"
+
+#~ msgid "APR_APPEND not supported for adm files"
+#~ msgstr "APR_APPEND wird für administrative Dateien nicht unterstützt"
+
+#~ msgid "Summary of conflicts in external item:\n"
+#~ msgstr "Konfliktübersicht für externen Verweis:\n"
+
+#~ msgid "; run 'svn update' to complete it"
+#~ msgstr "; vervollständigen Sie diese mit »svn update«."
+
+#~ msgid ""
+#~ "usage: svnsync copy-revprops DEST_URL [REV[:REV2]]\n"
+#~ "\n"
+#~ "Copy the revision properties in a given range of revisions to the\n"
+#~ "destination from the source with which it was initialized.\n"
+#~ "\n"
+#~ "If REV and REV2 are provided, copy properties for the revisions\n"
+#~ "specified by that range, inclusively. If only REV is provided,\n"
+#~ "copy properties for that revision alone. If REV is not provided,\n"
+#~ "copy properties for all revisions previously transferred to the\n"
+#~ "destination.\n"
+#~ "\n"
+#~ "REV and REV2 must be revisions which were previously transferred\n"
+#~ "to the destination. You may use \"HEAD\" for either revision to\n"
+#~ "mean \"the last revision transferred\".\n"
+#~ msgstr ""
+#~ "Aufruf: svnsync copy-revprops ZIEL_URL [REV[:REV2]]\n"
+#~ "\n"
+#~ "Kopiert die Revisionseigenschaften in einem gegebenen Revisionsbereich\n"
+#~ "von der Quelle, mit der es initialisiert wurde, auf das Ziel.\n"
+#~ "\n"
+#~ "Falls REV und REV2 angegeben wurden, werden nur Eigenschaften für die\n"
+#~ "durch diesen Bereich angegebenen Revisionen kopiert. Falls nur REV\n"
+#~ "angegeben wurde, werden nur Eigenschaften für diese Revision kopiert.\n"
+#~ "Falls REV nicht angegeben wurde, werden alle Eigenschaften kopiert, für\n"
+#~ "die die Revisionen früher auf das Ziel übertragen wurden.\n"
+#~ "\n"
+#~ "REV und REV2 müssen Revisionen sein, die vorher auf das Ziel transferiert\n"
+#~ "wurden. Sie können »HEAD« für eine Revision verwenden, im Sinne von »die\n"
+#~ "letzte übertragene Revision«.\n"
+
+#~ msgid "Cannot revert"
+#~ msgstr "Kann nicht zurücksetzen"
+
+#~ msgid "Version %d is not non-negative"
+#~ msgstr "Version %d ist nicht positiv"
+
+#~ msgid "Added: %s\n"
+#~ msgstr "Hinzugefügt: %s\n"
+
+#~ msgid "External program is missing"
+#~ msgstr "Externes Programm fehlt"
+
+#~ msgid "Corrupt working copy: directory '%s' has an invalid schedule"
+#~ msgstr "Beschädigte Arbeitskopie: Verzeichnis »%s« hat einen ungültigen Plan"
+
+#~ msgid ""
+#~ "Copyright (C) 2000-2009 CollabNet.\n"
+#~ "Subversion is open source software, see http://subversion.tigris.org/\n"
+#~ "This product includes software developed by CollabNet (http://www.Collab.Net/).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Copyright (C) 2000-2009 CollabNet.\n"
+#~ "Subversion ist Open-Source-Software, siehe http://subversion.tigris.org/\n"
+#~ "Dieses Produkt enthält Software, die von CollabNet (http://www.Collab.Net/) entwickelt wurde.\n"
+#~ "\n"
+
+#~ msgid "lump-merge all of source URL's unmerged changes"
+#~ msgstr ""
+#~ "komplettes Rückführen aller nicht zusammengeführten\n"
+#~ " Änderungen der Quell-URL"
+
+#~ msgid "Error modifying entry for '%s'"
+#~ msgstr "Fehler beim Bearbeiten des Eintrags für »%s«"
+
+#~ msgid ""
+#~ "Either you have added '%s' locally, or it has been added in the\n"
+#~ "history of the branch you are merging into.\n"
+#~ msgstr ""
+#~ "Entweder wurde »%s« lokal hinzugefügt oder dies geschah in der\n"
+#~ "Geschichte des Zweiges, in den zusammengeführt wird.\n"
+
+#~ msgid ""
+#~ " You have deleted '%s' locally.\n"
+#~ " Maybe you renamed it?\n"
+#~ msgstr ""
+#~ " »%s« wurde lokal gelöscht.\n"
+#~ " Eventuell wurde das Objekt umbenannt?\n"
+
+#~ msgid ""
+#~ "usage: svnsync synchronize DEST_URL\n"
+#~ "\n"
+#~ "Transfer all pending revisions to the destination from the source\n"
+#~ "with which it was initialized.\n"
+#~ msgstr ""
+#~ "Aufruf: svnsync synchronize ZIEL_URL\n"
+#~ "\n"
+#~ "Überträgt alle laufenden Revisionen von der Quelle, mit der es\n"
+#~ "initialisiert wurde, zum Ziel.\n"
+
+#~ msgid "Won't delete locally modified directory '%s'"
+#~ msgstr "Werde lokal verändertes Verzeichnis »%s« nicht löschen"
+
+#~ msgid "Existing sqlite database found at '%s'"
+#~ msgstr "Existierende SQLite-Datenbank wurde unter »%s« gefunden"
+
+#~ msgid "'get-deleted-rev' REPORT not implemented"
+#~ msgstr "»get-deleted-rev« REPORT nicht implementiert"
+
+#~ msgid "property '%s' set (recursively) on '%s'\n"
+#~ msgstr "Eigenschaft »%s« (rekursiv) für »%s« gesetzt\n"
+
+#~ msgid "'get-locations' REPORT not implemented"
+#~ msgstr "»get-locations« REPORT nicht implementiert"
+
+#~ msgid "Can't chmod '%s'"
+#~ msgstr "Kann »chmod '%s'« nicht durchführen"
+
+#~ msgid "Can't create a character converter from '%i' to '%i'"
+#~ msgstr "Kann keinen Zeichenkonverter von »%i« nach »%i« erzeugen"
+
+#~ msgid "Cannot initialize a repository with content in it"
+#~ msgstr "Kann kein Projektarchiv mit Inhalt initialisieren"
+
+#~ msgid ""
+#~ "Either you have edited '%s' locally, or it has been edited in the\n"
+#~ "history of the branch you are merging into, but those edits are not\n"
+#~ "present on the branch you are merging from.\n"
+#~ msgstr ""
+#~ "Entweder wurde »%s« lokal bearbeitet oder in der Geschichte des\n"
+#~ "Zweiges, in den zusammengeführt wird, editiert, aber diese\n"
+#~ "Veränderungen befinden sich nicht im Zweig, aus dem zusammengeführt wird.\n"
+
+#~ msgid ""
+#~ "Entry for '%s' is marked as 'copied' but is not itself scheduled\n"
+#~ "for addition. Perhaps you're committing a target that is\n"
+#~ "inside an unversioned (or not-yet-versioned) directory?"
+#~ msgstr ""
+#~ "Eintrag für »%s« ist als »kopiert« markiert, aber ist selbst nicht\n"
+#~ "zum Hinzufügen geplant. Vielleicht übertragen Sie ein Ziel, das\n"
+#~ "sich in einem nicht versionierten (oder noch-nicht-versionierten)\n"
+#~ "Verzeichnis befindet?"
+
+#~ msgid "Deleted: %s%s"
+#~ msgstr "Gelöscht: %s%s"
+
+#~ msgid "Can't replace '%s' with a node of a differing type; the deletion must be committed and the parent updated before adding '%s'"
+#~ msgstr "Kann »%s« nicht durch einen Knoten eines anderen Typs ersetzen; Übertragen Sie die Löschung, aktualisieren Sie das Elternverzeichnis und fügen Sie erst dann »%s« hinzu"
+
+#~ msgid "Cannot exclude root directory"
+#~ msgstr "Kann Wurzelverzeichnis nicht exkludieren"
+
+#~ msgid "Error replacing text-base of '%s'"
+#~ msgstr "Fehler beim Ersetzen der Textbasis von »%s«"
+
+#~ msgid "Can't close directory '%s'"
+#~ msgstr "Kann Verzeichnis »%s« nicht schließen"
+
+#~ msgid "'%s' is marked as absent, so it cannot be scheduled for addition"
+#~ msgstr ""
+#~ "»%s« ist als abwesend markiert, es kann daher nicht für die Übertragung\n"
+#~ "eingeplant werden"
+
+#~ msgid "No such entry: '%s'"
+#~ msgstr "Kein Eintrag: »%s«"
+
+#~ msgid "Error getting 'affected time' for '%s'"
+#~ msgstr "Fehler beim Ermitteln der »letzten Änderungszeit« von »%s«"
+
+#~ msgid "Write-lock stolen in '%s'"
+#~ msgstr "Schreibsperre gestohlen in »%s«"
+
+#~ msgid "Added: %s%s"
+#~ msgstr "Hinzugefügt: %s%s"
+
+#~ msgid "Error modifying entry of '%s'"
+#~ msgstr "Fehler beim Bearbeiten des Eintrags von »%s«"
+
+#~ msgid "Error getting 'affected time' on '%s'"
+#~ msgstr "Fehler beim Ermitteln der »letzten Änderungszeit« von »%s«"
+
+#~ msgid "Entry '%s' has illegal schedule"
+#~ msgstr "Eintrag »%s« hat einen ungültigen Plan"
+
+#~ msgid "Error removing changelist from entry '%s'"
+#~ msgstr "Fehler beim Entfernen der Änderungsliste von Eintrag »%s«"
+
+#~ msgid "Log entry missing 'name' attribute (entry '%s' for directory '%s')"
+#~ msgstr "»name«-Attribut fehlt im Log-Eintrag (Eintrag »%s« für Verzeichnis »%s«)"
+
+#~ msgid "Error getting 'affected time' of '%s'"
+#~ msgstr "Fehler beim Ermitteln der »letzten Änderungszeit« von »%s«"
+
+#~ msgid "Cannot revert addition of current directory; please try again from the parent directory"
+#~ msgstr "Kann Hinzufügen des aktuellen Verzeichnisses nicht zurücknehmen; bitte versuchen Sie es aus dem Elternverzeichnis erneut"
+
+#~ msgid "Invalid 'format' attribute"
+#~ msgstr "Ungültiges »format«-Attribut"
+
+#~ msgid "Couldn't open log"
+#~ msgstr "Kann Log-Datei nicht öffnen"
+
+#~ msgid "Expected '%s' to be a file but found a directory"
+#~ msgstr "Erwartete, dass »%s« eine Datei ist, es ist aber ein Verzeichnis"
+
+#~ msgid "Error writing entries file for '%s'"
+#~ msgstr "Fehler beim Schreiben der Eintragsdatei für »%s«"
+
+#~ msgid "Error writing log for '%s'"
+#~ msgstr "Fehler beim Schreiben des Logs für »%s«"
+
+#~ msgid "Checksum mismatch while updating '%s'; expected: '%s', actual: '%s'"
+#~ msgstr "Prüfsummenfehler beim Aktualisieren von »%s«; erwartet: »%s«, tatsächlich: »%s«"
+
+#~ msgid "Destination directory of add-with-history is missing a URL"
+#~ msgstr "Dem Zielverzeichnis von add-with-history fehlt eine URL"
+
+#~ msgid "Failed to add file '%s': a non-file object of the same name already exists"
+#~ msgstr ""
+#~ "Konnte die Datei »%s« nicht hinzufügen: ein nicht-Dateiobjekt mit demselben\n"
+#~ "Namen existiert bereits"
+
+#~ msgid ""
+#~ "Checksum mismatch for '%s':\n"
+#~ " expected checksum: %s\n"
+#~ " actual checksum: %s\n"
+#~ msgstr ""
+#~ "Prüfsummenfehler für »%s«:\n"
+#~ " Erwartet: %s\n"
+#~ " Tatsächlich: %s\n"
+
+#~ msgid "'%s' returned error exitcode %d"
+#~ msgstr "»%s« hat Fehlerwert %d zurückgegeben"
+
+#~ msgid "At least one revision (r%ld) not yet merged from '%s'"
+#~ msgstr "Zumindest eine Revision (r%ld) aus »%s« wurde nicht zusammengeführt"
+
+#~ msgid "Error during recursive copy of '%s'"
+#~ msgstr "Fehler beim rekursiven Kopieren von »%s«"
+
+#~ msgid "Error in post-commit clean-up (details follow):"
+#~ msgstr "Fehler beim Aufräumen nach der Übertragung (Details folgen):"
+
+#~ msgid "No '.' entry in: '%s'"
+#~ msgstr "Kein ».« Eintrag in: »%s«"
+
+#~ msgid "unexpected kind for revert-base '%s'"
+#~ msgstr "Unerwartete Art für revert-base »%s«"
+
+#~ msgid "Can't add '%s' to deleted directory; try undeleting its parent directory first"
+#~ msgstr ""
+#~ "Kann »%s« in gelöschtem Verzeichnis nicht hinzufügen; versuchen Sie zuerst,\n"
+#~ "das Löschen des Elternverzeichnisses rückgängig zu machen"
+
+#~ msgid "Failed to add directory '%s': an unversioned directory of the same name already exists"
+#~ msgstr "Verzeichnis »%s« konnte nicht hinzugefügt werden: ein nicht versioniertes Verzeichnis mit demselben Namen existiert bereits"
+
+#~ msgid "Directory '%s' containing working copy admin area is missing"
+#~ msgstr "Verzeichnis »%s« mit Administrationsdateien der Arbeitskopie fehlt"
+
+#~ msgid "Malformed patch data"
+#~ msgstr "Fehlerhafte Patchdaten"
+
+#~ msgid "Failed to add directory '%s': copyfrom arguments not yet supported"
+#~ msgstr ""
+#~ "Konnte Verzeichnis »%s« nicht hinzufügen: Parameter »copyfrom« wird noch nicht\n"
+#~ "unterstützt"
+
+#~ msgid "Log command for directory '%s' is mislocated"
+#~ msgstr "Log-Kommando für Verzeichnis »%s« ist falsch platziert"
+
+#~ msgid "In directory '%s'"
+#~ msgstr "In Verzeichnis »%s«"
+
+#~ msgid "Unrecognized logfile element '%s' in '%s'"
+#~ msgstr "Unbekanntes Log-Datei Element »%s« in »%s«"
+
+#~ msgid "Destination URLs are broken"
+#~ msgstr "Ziel-URLs sind kaputt"
+
+#~ msgid "Relocate can only change the repository part of an URL"
+#~ msgstr "Relocate kann nur den Projektarchivteil der URL ändern"
+
+#~ msgid "Cannot exclude current directory"
+#~ msgstr "Kann aktuelles Verzeichnis nicht exkludieren"
+
+#~ msgid "No fetch_func supplied to update_editor"
+#~ msgstr "Keine Angabe von fetch_func für update_editor"
+
+#~ msgid "Bad copyfrom arguments received"
+#~ msgstr "Falsche Parameter »kopieren von« erhalten"
+
+#~ msgid "Corrupt working copy: '%s' in directory '%s' has an invalid schedule"
+#~ msgstr "Beschädigte Arbeitskopie: »%s« im Verzeichnis »%s« hat einen ungültigen Plan"
+
+#~ msgid "Missing 'right' attribute in '%s'"
+#~ msgstr "Fehlendes »right« Attribut für »%s«"
+
+#~ msgid "Error reading administrative log file in '%s'"
+#~ msgstr "Fehler beim Lesen der administrativen Log-Dateien in »%s«"
+
+#~ msgid "Failed to add file '%s': an unversioned file of the same name already exists"
+#~ msgstr "Datei »%s« konnte nicht hinzugefügt werden: eine nicht versionierte Datei mit demselben Namen existiert bereits"
+
+#~ msgid "mark revisions as merged (use with -r)"
+#~ msgstr ""
+#~ "Revisionen als zusammengeführt markieren (mit -r\n"
+#~ " verwenden)"
+
+#~ msgid " You have edited '%s' locally.\n"
+#~ msgstr " »%s« wurde lokal bearbeitet.\n"
+
+#~ msgid "'%s' not versioned, and not exported\n"
+#~ msgstr "»%s« nicht versioniert und nicht exportiert\n"
+
+#~ msgid "Missing 'timestamp' attribute in '%s'"
+#~ msgstr "Fehlendes »timestamp« Attribut für »%s«"
+
+#~ msgid "Bad reason in tree conflict description"
+#~ msgstr "Fehlerhafter Wert von »reason« in Baumkonfliktbeschreibung"
+
+#~ msgid ""
+#~ "Base checksum mismatch on '%s':\n"
+#~ " expected: %s\n"
+#~ " actual: %s\n"
+#~ msgstr ""
+#~ "Prüfsummenfehler für »%s«:\n"
+#~ " Erwartet: %s\n"
+#~ " Tatsächlich: %s\n"
+
+#~ msgid "Use of an external editor to fetch log message is not supported on OS400; consider using the --message (-m) or --file (-F) options"
+#~ msgstr "Die Verwendung eines externen Editors zur Eingabe der Logmeldung wird auf OS400 nicht unterstützt. Verwenden Sie die Option --message (-m) oder --file (-F)"
+
+#~ msgid "No WC table entry"
+#~ msgstr "Kein AK-Tabelleneintrag"
+
+#~ msgid " The update attempted to edit '%s'.\n"
+#~ msgstr " Die Aktualisierung versuchte »%s« zu bearbeiten.\n"
+
+#~ msgid ".empty"
+#~ msgstr ".leer"
+
+#~ msgid "Error getting file size on '%s'"
+#~ msgstr "Fehler beim Ermitteln der Dateigröße von »%s«"
+
+#~ msgid "Target lists to diff may not contain both working copy paths and URLs"
+#~ msgstr "Ziellisten für Vergleiche dürfen nicht gleichzeitig Arbeitskopien und URLs enthalten"
+
+#~ msgid "Parent(s) of '%s' should have repository information."
+#~ msgstr "Eltern von »%s« sollten Informationen über das Projektarchiv haben."
+
+#~ msgid ""
+#~ "Comment (%i lines):\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "Kommentar (%i Zeilen):\n"
+#~ "%s\n"
+
+#~ msgid "Error removing lock from entry for '%s'"
+#~ msgstr "Fehler beim Entfernen des Sperreintrags für »%s«"
+
+#~ msgid "Unable to make any directories"
+#~ msgstr "Kann keinerlei Verzeichnisse erzeugen"
+
+#~ msgid "Corrupt working copy: '%s' in directory '%s' (which is scheduled for addition) is not itself scheduled for addition"
+#~ msgstr ""
+#~ "Beschädigte Arbeitskopie: »%s« im Verzeichnis »%s« (welches zum Hinzufügen\n"
+#~ "eingeplant ist) ist selbst nicht zum Hinzufügen vorgesehen"
+
+#~ msgid "Can't replace '%s' in deleted directory; try undeleting its parent directory first"
+#~ msgstr ""
+#~ "Kann »%s« in gelöschtem Verzeichnis nicht ersetzen; versuchen Sie zuerst,\n"
+#~ "das Löschen des Elternverzeichnisses rückgängig zu machen"
+
+#~ msgid "File '%s' in directory '%s' is not a versioned resource"
+#~ msgstr "Datei »%s« im Verzeichnis »%s« ist keine versionierte Ressource"
+
+#~ msgid "Modified: %s%s"
+#~ msgstr "Geändert: %s%s"
+
+#~ msgid "Missing 'revision' attribute for '%s'"
+#~ msgstr "Fehlendes Revisions Attribut für »%s«"
+
+#~ msgid "No delimiter after 'node_kind' in tree conflict description"
+#~ msgstr "Kein Trenner nach »node_kind« in Baumkonfliktbeschreibung"
+
+#~ msgid "URL '%s' is not properly URI-encoded"
+#~ msgstr "URL »%s« ist nicht korrekt URI-kodiert"
+
+#~ msgid "Can't convert string from CCSID '%i' to CCSID '%i'"
+#~ msgstr "Kann Zeichenkette nicht von CCSID »%i« nach CCSID »%i« konvertieren"
diff --git a/subversion/po/es.po b/subversion/po/es.po
index 796aae2..b697d4d 100644
--- a/subversion/po/es.po
+++ b/subversion/po/es.po
@@ -53,7 +53,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2009-02-19 14:22-0200\n"
@@ -10197,13 +10197,11 @@ msgid "local %s, incoming %s upon %s"
msgstr ""
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"Commit de la revisión %ld.\n"
+"Commit de la revisión %ld%s.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/fr.po b/subversion/po/fr.po
index 8f7c73c..73e38cf 100644
--- a/subversion/po/fr.po
+++ b/subversion/po/fr.po
@@ -22,7 +22,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2012-07-07 14:51+0200\n"
"PO-Revision-Date: 2012-07-07 17:04+0200\n"
@@ -11331,6 +11331,11 @@ msgstr "Mise à jour de '%s'\n"
msgid "Redirecting to URL '%s':\n"
msgstr "Redirection vers l'URL '%s' :\n"
+#: ../svn/notify.c:1066
+#, c-format
+msgid "Committing transaction...\n"
+msgstr "Transaction de propagation...\n"
+
#: ../svn/propdel-cmd.c:88
#, c-format
msgid "Cannot specify revision for deleting versioned property '%s'"
@@ -11543,10 +11548,8 @@ msgstr "'%s' actualisé à la révision %ld.\n"
#: ../svn/util.c:76
#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
"Révision %ld%s propagée.\n"
#: ../svn/util.c:80
diff --git a/subversion/po/it.po b/subversion/po/it.po
index 19d4543..8fb7215 100644
--- a/subversion/po/it.po
+++ b/subversion/po/it.po
@@ -101,7 +101,7 @@
# working copy: copia di lavoro (CL)
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2007-10-12 10:09+0200\n"
@@ -10286,13 +10286,11 @@ msgid "local %s, incoming %s upon %s"
msgstr ""
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"Commit della Revisione %ld eseguito.\n"
+"Commit della Revisione %ld%s eseguito.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/ja.po b/subversion/po/ja.po
index 6c9c4ef..6c4d107 100644
--- a/subversion/po/ja.po
+++ b/subversion/po/ja.po
@@ -195,7 +195,7 @@
# zero byte ゼロãƒã‚¤ãƒˆæ–‡å­—
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2007-10-28 01:23+0900\n"
@@ -10643,13 +10643,11 @@ msgid "local %s, incoming %s upon %s"
msgstr ""
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"リビジョン %ld をコミットã—ã¾ã—ãŸã€‚\n"
+"リビジョン %ld%s をコミットã—ã¾ã—ãŸã€‚\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/ko.po b/subversion/po/ko.po
index d2bfa32..4a465b5 100644
--- a/subversion/po/ko.po
+++ b/subversion/po/ko.po
@@ -19,7 +19,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2011-03-07 00:53+0900\n"
"PO-Revision-Date: 2011-03-03 18:16+0900\n"
@@ -10530,10 +10530,8 @@ msgstr " '%s' ì„(를) r%ld ë¡œ ì—…ë°ì´íŠ¸í•¨.\n"
#: ../svn/util.c:75
#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
"ì»¤ë°‹ëœ ë¦¬ë¹„ì „ %ld%s.\n"
#: ../svn/util.c:79
diff --git a/subversion/po/nb.po b/subversion/po/nb.po
index be6bd4b..18c3dda 100644
--- a/subversion/po/nb.po
+++ b/subversion/po/nb.po
@@ -87,7 +87,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2009-10-14 16:21+0200\n"
@@ -10226,13 +10226,11 @@ msgid "local %s, incoming %s upon %s"
msgstr "lokal %s, innkommende %s på %s"
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"La inn revisjon %ld.\n"
+"La inn revisjon %ld%s.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/pl.po b/subversion/po/pl.po
index 4f078f2..f1bda91 100644
--- a/subversion/po/pl.po
+++ b/subversion/po/pl.po
@@ -55,7 +55,7 @@
# work queue - kolejka pracy
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2009-11-14 22:00+0100\n"
@@ -10285,13 +10285,11 @@ msgid "local %s, incoming %s upon %s"
msgstr "lokalne: %s, przychodzÄ…ce: %s, operacja: %s"
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"Zatwierdzona wersja %ld.\n"
+"Zatwierdzona wersja %ld%s.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/pt_BR.po b/subversion/po/pt_BR.po
index 41c0260..bc96364 100644
--- a/subversion/po/pt_BR.po
+++ b/subversion/po/pt_BR.po
@@ -19,7 +19,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2004-07-26 19:19-300\n"
@@ -10087,13 +10087,11 @@ msgid "local %s, incoming %s upon %s"
msgstr ""
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"Commit da revisão %ld.\n"
+"Commit da revisão %ld%s.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/po/subversion.pot b/subversion/po/subversion.pot
index b07609b..3051288 100644
--- a/subversion/po/subversion.pot
+++ b/subversion/po/subversion.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
-"POT-Creation-Date: 2015-03-18 13:33+0000\n"
+"POT-Creation-Date: 2017-08-05 16:22+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,72 +21,72 @@ msgstr ""
#. Constructing nice error messages for roots.
#. Build an SVN_ERR_FS_NOT_FOUND error, with a detailed error text,
#. for PATH in ROOT. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:81
+#: ../include/private/svn_fs_util.h:86
#, c-format
msgid "File not found: transaction '%s', path '%s'"
msgstr ""
-#: ../include/private/svn_fs_util.h:86
+#: ../include/private/svn_fs_util.h:91
#, c-format
msgid "File not found: revision %ld, path '%s'"
msgstr ""
#. Build a detailed `file already exists' message for PATH in ROOT.
#. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:97
+#: ../include/private/svn_fs_util.h:102
#, c-format
msgid "File already exists: filesystem '%s', transaction '%s', path '%s'"
msgstr ""
-#: ../include/private/svn_fs_util.h:102
+#: ../include/private/svn_fs_util.h:107
#, c-format
msgid "File already exists: filesystem '%s', revision %ld, path '%s'"
msgstr ""
#. ROOT is of type svn_fs_root_t *.
-#: ../include/private/svn_fs_util.h:110
+#: ../include/private/svn_fs_util.h:115
msgid "Root object must be a transaction root"
msgstr ""
#. SVN_FS__ERR_NOT_MUTABLE: the caller attempted to change a node
#. outside of a transaction. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:117
+#: ../include/private/svn_fs_util.h:122
#, c-format
msgid "File is not mutable: filesystem '%s', revision %ld, path '%s'"
msgstr ""
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:124
+#: ../include/private/svn_fs_util.h:129
#, c-format
msgid "'%s' is not a directory in filesystem '%s'"
msgstr ""
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:131
+#: ../include/private/svn_fs_util.h:136
#, c-format
msgid "'%s' is not a file in filesystem '%s'"
msgstr ""
#. FS is of type "svn_fs_t *", LOCK is of type "svn_lock_t *".
-#: ../include/private/svn_fs_util.h:139
+#: ../include/private/svn_fs_util.h:144
#, c-format
msgid "Path '%s' is already locked by user '%s' in filesystem '%s'"
msgstr ""
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:146
+#: ../include/private/svn_fs_util.h:151
#, c-format
msgid "No lock on path '%s' in filesystem '%s'"
msgstr ""
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:153
+#: ../include/private/svn_fs_util.h:158
#, c-format
msgid "Lock has expired: lock-token '%s' in filesystem '%s'"
msgstr ""
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:160
+#: ../include/private/svn_fs_util.h:165
#, c-format
msgid "No username is currently associated with filesystem '%s'"
msgstr ""
@@ -94,1221 +94,1392 @@ msgstr ""
#. SVN_FS__ERR_LOCK_OWNER_MISMATCH: trying to use a lock whose
#. LOCK_OWNER doesn't match the USERNAME associated with FS.
#. FS is of type "svn_fs_t *".
-#: ../include/private/svn_fs_util.h:169
+#: ../include/private/svn_fs_util.h:174
#, c-format
msgid "User '%s' is trying to use a lock owned by '%s' in filesystem '%s'"
msgstr ""
-#: ../include/svn_error_codes.h:164
+#: ../include/svn_error_codes.h:166
msgid "Bad parent pool passed to svn_make_pool()"
msgstr ""
-#: ../include/svn_error_codes.h:168
+#: ../include/svn_error_codes.h:170
msgid "Bogus filename"
msgstr ""
-#: ../include/svn_error_codes.h:172
+#: ../include/svn_error_codes.h:174
msgid "Bogus URL"
msgstr ""
-#: ../include/svn_error_codes.h:176
+#: ../include/svn_error_codes.h:178
msgid "Bogus date"
msgstr ""
-#: ../include/svn_error_codes.h:180
+#: ../include/svn_error_codes.h:182
msgid "Bogus mime-type"
msgstr ""
-#: ../include/svn_error_codes.h:190
+#: ../include/svn_error_codes.h:192
msgid "Wrong or unexpected property value"
msgstr ""
-#: ../include/svn_error_codes.h:194
+#: ../include/svn_error_codes.h:196
msgid "Version file format not correct"
msgstr ""
-#: ../include/svn_error_codes.h:198
+#: ../include/svn_error_codes.h:200
msgid "Path is not an immediate child of the specified directory"
msgstr ""
-#: ../include/svn_error_codes.h:202
+#: ../include/svn_error_codes.h:204
msgid "Bogus UUID"
msgstr ""
-#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:944
+#: ../include/svn_error_codes.h:209 ../include/svn_error_codes.h:1021
msgid "Invalid configuration value"
msgstr ""
-#: ../include/svn_error_codes.h:211
+#: ../include/svn_error_codes.h:213
msgid "Bogus server specification"
msgstr ""
-#: ../include/svn_error_codes.h:215
+#: ../include/svn_error_codes.h:217
msgid "Unsupported checksum type"
msgstr ""
-#: ../include/svn_error_codes.h:219
+#: ../include/svn_error_codes.h:221
msgid "Invalid character in hex checksum"
msgstr ""
-#: ../include/svn_error_codes.h:224
+#: ../include/svn_error_codes.h:226
msgid "Unknown string value of token"
msgstr ""
-#: ../include/svn_error_codes.h:229
+#: ../include/svn_error_codes.h:231
msgid "Invalid changelist name"
msgstr ""
-#: ../include/svn_error_codes.h:234
+#: ../include/svn_error_codes.h:236
msgid "Invalid atomic"
msgstr ""
-#: ../include/svn_error_codes.h:240
+#: ../include/svn_error_codes.h:241
+msgid "Invalid compression method"
+msgstr ""
+
+#: ../include/svn_error_codes.h:247
msgid "No such XML tag attribute"
msgstr ""
-#: ../include/svn_error_codes.h:244
+#: ../include/svn_error_codes.h:251
msgid "<delta-pkg> is missing ancestry"
msgstr ""
-#: ../include/svn_error_codes.h:248
+#: ../include/svn_error_codes.h:255
msgid "Unrecognized binary data encoding; can't decode"
msgstr ""
-#: ../include/svn_error_codes.h:252
+#: ../include/svn_error_codes.h:259
msgid "XML data was not well-formed"
msgstr ""
-#: ../include/svn_error_codes.h:256
+#: ../include/svn_error_codes.h:263
msgid "Data cannot be safely XML-escaped"
msgstr ""
-#: ../include/svn_error_codes.h:262
+#: ../include/svn_error_codes.h:268
+msgid "Unexpected XML element found"
+msgstr ""
+
+#: ../include/svn_error_codes.h:274
msgid "Inconsistent line ending style"
msgstr ""
-#: ../include/svn_error_codes.h:266
+#: ../include/svn_error_codes.h:278
msgid "Unrecognized line ending style"
msgstr ""
-#: ../include/svn_error_codes.h:271
+#: ../include/svn_error_codes.h:283
msgid "Line endings other than expected"
msgstr ""
-#: ../include/svn_error_codes.h:275
+#: ../include/svn_error_codes.h:287
msgid "Ran out of unique names"
msgstr ""
-#: ../include/svn_error_codes.h:280
+#: ../include/svn_error_codes.h:292
msgid "Framing error in pipe protocol"
msgstr ""
-#: ../include/svn_error_codes.h:285
+#: ../include/svn_error_codes.h:297
msgid "Read error in pipe"
msgstr ""
-#: ../include/svn_error_codes.h:289 ../libsvn_subr/cmdline.c:362
-#: ../libsvn_subr/cmdline.c:385 ../svn/util.c:569 ../svnlook/svnlook.c:2009
+#. is errno on POSIX
+#: ../include/svn_error_codes.h:301 ../libsvn_subr/cmdline.c:417
+#: ../libsvn_subr/cmdline.c:448 ../libsvn_subr/cmdline.c:471 ../svn/util.c:571
+#: ../svnlook/svnlook.c:2010
#, c-format
msgid "Write error"
msgstr ""
-#: ../include/svn_error_codes.h:294
+#: ../include/svn_error_codes.h:306
msgid "Write error in pipe"
msgstr ""
-#: ../include/svn_error_codes.h:300
+#: ../include/svn_error_codes.h:312
msgid "Unexpected EOF on stream"
msgstr ""
-#: ../include/svn_error_codes.h:304
+#: ../include/svn_error_codes.h:316
msgid "Malformed stream data"
msgstr ""
-#: ../include/svn_error_codes.h:308
+#: ../include/svn_error_codes.h:320
msgid "Unrecognized stream data"
msgstr ""
-#: ../include/svn_error_codes.h:313
+#: ../include/svn_error_codes.h:325
msgid "Stream doesn't support seeking"
msgstr ""
-#: ../include/svn_error_codes.h:319
+#: ../include/svn_error_codes.h:330
+msgid "Stream doesn't support this capability"
+msgstr ""
+
+#: ../include/svn_error_codes.h:336
msgid "Unknown svn_node_kind"
msgstr ""
-#: ../include/svn_error_codes.h:323
+#: ../include/svn_error_codes.h:340
msgid "Unexpected node kind found"
msgstr ""
-#: ../include/svn_error_codes.h:329
+#: ../include/svn_error_codes.h:346
msgid "Can't find an entry"
msgstr ""
-#: ../include/svn_error_codes.h:335
+#: ../include/svn_error_codes.h:352
msgid "Entry already exists"
msgstr ""
-#: ../include/svn_error_codes.h:339
+#: ../include/svn_error_codes.h:356
msgid "Entry has no revision"
msgstr ""
-#: ../include/svn_error_codes.h:343
+#: ../include/svn_error_codes.h:360
msgid "Entry has no URL"
msgstr ""
-#: ../include/svn_error_codes.h:347
+#: ../include/svn_error_codes.h:364
msgid "Entry has an invalid attribute"
msgstr ""
-#: ../include/svn_error_codes.h:351
+#: ../include/svn_error_codes.h:368
msgid "Can't create an entry for a forbidden name"
msgstr ""
-#: ../include/svn_error_codes.h:357
+#: ../include/svn_error_codes.h:374
msgid "Obstructed update"
msgstr ""
-#: ../include/svn_error_codes.h:362
+#: ../include/svn_error_codes.h:379
msgid "Mismatch popping the WC unwind stack"
msgstr ""
-#: ../include/svn_error_codes.h:367
+#: ../include/svn_error_codes.h:384
msgid "Attempt to pop empty WC unwind stack"
msgstr ""
-#: ../include/svn_error_codes.h:372
+#: ../include/svn_error_codes.h:389
msgid "Attempt to unlock with non-empty unwind stack"
msgstr ""
-#: ../include/svn_error_codes.h:376
+#: ../include/svn_error_codes.h:393
msgid "Attempted to lock an already-locked dir"
msgstr ""
-#: ../include/svn_error_codes.h:380
+#: ../include/svn_error_codes.h:397
msgid "Working copy not locked; this is probably a bug, please report"
msgstr ""
-#: ../include/svn_error_codes.h:385
+#: ../include/svn_error_codes.h:402
msgid "Invalid lock"
msgstr ""
-#: ../include/svn_error_codes.h:391 ../include/svn_error_codes.h:397
+#: ../include/svn_error_codes.h:408 ../include/svn_error_codes.h:414
msgid "Path is not a working copy directory"
msgstr ""
-#: ../include/svn_error_codes.h:401
+#: ../include/svn_error_codes.h:418
msgid "Path is not a working copy file"
msgstr ""
-#: ../include/svn_error_codes.h:405
+#: ../include/svn_error_codes.h:422
msgid "Problem running log"
msgstr ""
-#: ../include/svn_error_codes.h:409
+#: ../include/svn_error_codes.h:426
msgid "Can't find a working copy path"
msgstr ""
-#: ../include/svn_error_codes.h:413
+#: ../include/svn_error_codes.h:430
msgid "Working copy is not up-to-date"
msgstr ""
-#: ../include/svn_error_codes.h:417
+#: ../include/svn_error_codes.h:434
msgid "Left locally modified or unversioned files"
msgstr ""
-#: ../include/svn_error_codes.h:421
+#: ../include/svn_error_codes.h:438
msgid "Unmergeable scheduling requested on an entry"
msgstr ""
-#: ../include/svn_error_codes.h:425
+#: ../include/svn_error_codes.h:442
msgid "Found a working copy path"
msgstr ""
-#: ../include/svn_error_codes.h:429
+#: ../include/svn_error_codes.h:446
msgid "A conflict in the working copy obstructs the current operation"
msgstr ""
-#: ../include/svn_error_codes.h:433
+#: ../include/svn_error_codes.h:450
msgid "Working copy is corrupt"
msgstr ""
-#: ../include/svn_error_codes.h:437
+#: ../include/svn_error_codes.h:454
msgid "Working copy text base is corrupt"
msgstr ""
-#: ../include/svn_error_codes.h:441
+#: ../include/svn_error_codes.h:458
msgid "Cannot change node kind"
msgstr ""
-#: ../include/svn_error_codes.h:445
+#: ../include/svn_error_codes.h:462
msgid "Invalid operation on the current working directory"
msgstr ""
-#: ../include/svn_error_codes.h:449
+#: ../include/svn_error_codes.h:466
msgid "Problem on first log entry in a working copy"
msgstr ""
-#: ../include/svn_error_codes.h:453
+#: ../include/svn_error_codes.h:470
msgid "Unsupported working copy format"
msgstr ""
-#: ../include/svn_error_codes.h:457
+#: ../include/svn_error_codes.h:474
msgid "Path syntax not supported in this context"
msgstr ""
-#: ../include/svn_error_codes.h:462
+#: ../include/svn_error_codes.h:479
msgid "Invalid schedule"
msgstr ""
-#: ../include/svn_error_codes.h:467
+#: ../include/svn_error_codes.h:484
msgid "Invalid relocation"
msgstr ""
-#: ../include/svn_error_codes.h:472
+#: ../include/svn_error_codes.h:489
msgid "Invalid switch"
msgstr ""
-#: ../include/svn_error_codes.h:477
+#: ../include/svn_error_codes.h:494
msgid "Changelist doesn't match"
msgstr ""
-#: ../include/svn_error_codes.h:482
+#: ../include/svn_error_codes.h:499
msgid "Conflict resolution failed"
msgstr ""
-#: ../include/svn_error_codes.h:486
+#: ../include/svn_error_codes.h:503
msgid "Failed to locate 'copyfrom' path in working copy"
msgstr ""
-#: ../include/svn_error_codes.h:494
+#: ../include/svn_error_codes.h:511
msgid "Moving a path from one changelist to another"
msgstr ""
-#: ../include/svn_error_codes.h:499
+#: ../include/svn_error_codes.h:516
msgid "Cannot delete a file external"
msgstr ""
-#: ../include/svn_error_codes.h:504
+#: ../include/svn_error_codes.h:521
msgid "Cannot move a file external"
msgstr ""
-#: ../include/svn_error_codes.h:509
+#: ../include/svn_error_codes.h:526
msgid "Something's amiss with the wc sqlite database"
msgstr ""
-#: ../include/svn_error_codes.h:514
+#: ../include/svn_error_codes.h:531
msgid "The working copy is missing"
msgstr ""
-#: ../include/svn_error_codes.h:519
+#: ../include/svn_error_codes.h:536
msgid "The specified node is not a symlink"
msgstr ""
-#: ../include/svn_error_codes.h:524
+#: ../include/svn_error_codes.h:541
msgid "The specified path has an unexpected status"
msgstr ""
-#: ../include/svn_error_codes.h:529
+#: ../include/svn_error_codes.h:546
msgid "The working copy needs to be upgraded"
msgstr ""
-#: ../include/svn_error_codes.h:534
+#: ../include/svn_error_codes.h:551
msgid ""
"Previous operation has not finished; run 'cleanup' if it was interrupted"
msgstr ""
-#: ../include/svn_error_codes.h:540
+#: ../include/svn_error_codes.h:557
msgid "The operation cannot be performed with the specified depth"
msgstr ""
-#: ../include/svn_error_codes.h:545
+#: ../include/svn_error_codes.h:562
msgid "Couldn't open a working copy file because access was denied"
msgstr ""
-#: ../include/svn_error_codes.h:550
+#: ../include/svn_error_codes.h:567
msgid "Mixed-revision working copy was found but not expected"
msgstr ""
-#: ../include/svn_error_codes.h:555
+#: ../include/svn_error_codes.h:572
msgid "Duplicate targets in svn:externals property"
msgstr ""
-#: ../include/svn_error_codes.h:561
+#: ../include/svn_error_codes.h:578
msgid "General filesystem error"
msgstr ""
-#: ../include/svn_error_codes.h:565
+#: ../include/svn_error_codes.h:582
msgid "Error closing filesystem"
msgstr ""
-#: ../include/svn_error_codes.h:569
+#: ../include/svn_error_codes.h:586
msgid "Filesystem is already open"
msgstr ""
-#: ../include/svn_error_codes.h:573
+#: ../include/svn_error_codes.h:590
msgid "Filesystem is not open"
msgstr ""
-#: ../include/svn_error_codes.h:577
+#: ../include/svn_error_codes.h:594
msgid "Filesystem is corrupt"
msgstr ""
-#: ../include/svn_error_codes.h:581
+#: ../include/svn_error_codes.h:598
msgid "Invalid filesystem path syntax"
msgstr ""
-#: ../include/svn_error_codes.h:585
+#: ../include/svn_error_codes.h:602
msgid "Invalid filesystem revision number"
msgstr ""
-#: ../include/svn_error_codes.h:589
+#: ../include/svn_error_codes.h:606
msgid "Invalid filesystem transaction name"
msgstr ""
-#: ../include/svn_error_codes.h:593
+#: ../include/svn_error_codes.h:610
msgid "Filesystem directory has no such entry"
msgstr ""
-#: ../include/svn_error_codes.h:597
+#: ../include/svn_error_codes.h:614
msgid "Filesystem has no such representation"
msgstr ""
-#: ../include/svn_error_codes.h:601
+#: ../include/svn_error_codes.h:618
msgid "Filesystem has no such string"
msgstr ""
-#: ../include/svn_error_codes.h:605
+#: ../include/svn_error_codes.h:622
msgid "Filesystem has no such copy"
msgstr ""
-#: ../include/svn_error_codes.h:609
+#: ../include/svn_error_codes.h:626
msgid "The specified transaction is not mutable"
msgstr ""
-#: ../include/svn_error_codes.h:613
+#: ../include/svn_error_codes.h:630
msgid "Filesystem has no item"
msgstr ""
-#: ../include/svn_error_codes.h:617
+#: ../include/svn_error_codes.h:634
msgid "Filesystem has no such node-rev-id"
msgstr ""
-#: ../include/svn_error_codes.h:621
+#: ../include/svn_error_codes.h:638
msgid "String does not represent a node or node-rev-id"
msgstr ""
-#: ../include/svn_error_codes.h:625
+#: ../include/svn_error_codes.h:642
msgid "Name does not refer to a filesystem directory"
msgstr ""
-#: ../include/svn_error_codes.h:629
+#: ../include/svn_error_codes.h:646
msgid "Name does not refer to a filesystem file"
msgstr ""
-#: ../include/svn_error_codes.h:633
+#: ../include/svn_error_codes.h:650
msgid "Name is not a single path component"
msgstr ""
-#: ../include/svn_error_codes.h:637
+#: ../include/svn_error_codes.h:654
msgid "Attempt to change immutable filesystem node"
msgstr ""
-#: ../include/svn_error_codes.h:641
+#: ../include/svn_error_codes.h:658
msgid "Item already exists in filesystem"
msgstr ""
-#: ../include/svn_error_codes.h:645
+#: ../include/svn_error_codes.h:662
msgid "Attempt to remove or recreate fs root dir"
msgstr ""
-#: ../include/svn_error_codes.h:649
+#: ../include/svn_error_codes.h:666
msgid "Object is not a transaction root"
msgstr ""
-#: ../include/svn_error_codes.h:653
+#: ../include/svn_error_codes.h:670
msgid "Object is not a revision root"
msgstr ""
-#: ../include/svn_error_codes.h:657
+#: ../include/svn_error_codes.h:674
msgid "Merge conflict during commit"
msgstr ""
-#: ../include/svn_error_codes.h:661
+#: ../include/svn_error_codes.h:678
msgid "A representation vanished or changed between reads"
msgstr ""
-#: ../include/svn_error_codes.h:665
+#: ../include/svn_error_codes.h:682
msgid "Tried to change an immutable representation"
msgstr ""
-#: ../include/svn_error_codes.h:669
+#: ../include/svn_error_codes.h:686
msgid "Malformed skeleton data"
msgstr ""
-#: ../include/svn_error_codes.h:673
+#: ../include/svn_error_codes.h:690
msgid "Transaction is out of date"
msgstr ""
-#: ../include/svn_error_codes.h:677
+#: ../include/svn_error_codes.h:694
msgid "Berkeley DB error"
msgstr ""
-#: ../include/svn_error_codes.h:681
+#: ../include/svn_error_codes.h:698
msgid "Berkeley DB deadlock error"
msgstr ""
-#: ../include/svn_error_codes.h:685
+#: ../include/svn_error_codes.h:702
msgid "Transaction is dead"
msgstr ""
-#: ../include/svn_error_codes.h:689
+#: ../include/svn_error_codes.h:706
msgid "Transaction is not dead"
msgstr ""
-#: ../include/svn_error_codes.h:694
+#: ../include/svn_error_codes.h:711
msgid "Unknown FS type"
msgstr ""
-#: ../include/svn_error_codes.h:699
+#: ../include/svn_error_codes.h:716
msgid "No user associated with filesystem"
msgstr ""
-#: ../include/svn_error_codes.h:704
+#: ../include/svn_error_codes.h:721
msgid "Path is already locked"
msgstr ""
-#: ../include/svn_error_codes.h:709 ../include/svn_error_codes.h:886
+#: ../include/svn_error_codes.h:726 ../include/svn_error_codes.h:958
msgid "Path is not locked"
msgstr ""
-#: ../include/svn_error_codes.h:714
+#: ../include/svn_error_codes.h:731
msgid "Lock token is incorrect"
msgstr ""
-#: ../include/svn_error_codes.h:719
+#: ../include/svn_error_codes.h:736
msgid "No lock token provided"
msgstr ""
-#: ../include/svn_error_codes.h:724
+#: ../include/svn_error_codes.h:741
msgid "Username does not match lock owner"
msgstr ""
-#: ../include/svn_error_codes.h:729
+#: ../include/svn_error_codes.h:746
msgid "Filesystem has no such lock"
msgstr ""
-#: ../include/svn_error_codes.h:734
+#: ../include/svn_error_codes.h:751
msgid "Lock has expired"
msgstr ""
-#: ../include/svn_error_codes.h:739 ../include/svn_error_codes.h:873
+#: ../include/svn_error_codes.h:756 ../include/svn_error_codes.h:945
msgid "Item is out of date"
msgstr ""
-#: ../include/svn_error_codes.h:751
+#: ../include/svn_error_codes.h:768
msgid "Unsupported FS format"
msgstr ""
-#: ../include/svn_error_codes.h:756
+#: ../include/svn_error_codes.h:773
msgid "Representation is being written"
msgstr ""
-#: ../include/svn_error_codes.h:761
+#: ../include/svn_error_codes.h:778
msgid "The generated transaction name is too long"
msgstr ""
-#: ../include/svn_error_codes.h:766
+#: ../include/svn_error_codes.h:783
msgid "Filesystem has no such node origin record"
msgstr ""
-#: ../include/svn_error_codes.h:771
+#: ../include/svn_error_codes.h:788
msgid "Filesystem upgrade is not supported"
msgstr ""
-#: ../include/svn_error_codes.h:776
+#: ../include/svn_error_codes.h:793
msgid "Filesystem has no such checksum-representation index record"
msgstr ""
-#: ../include/svn_error_codes.h:781
+#: ../include/svn_error_codes.h:798
msgid "Property value in filesystem differs from the provided base value"
msgstr ""
-#: ../include/svn_error_codes.h:787
+#: ../include/svn_error_codes.h:804
msgid "The filesystem editor completion process was not followed"
msgstr ""
-#: ../include/svn_error_codes.h:792
+#: ../include/svn_error_codes.h:809
msgid "A packed revprop could not be read"
msgstr ""
-#: ../include/svn_error_codes.h:797
+#: ../include/svn_error_codes.h:814
msgid "Could not initialize the revprop caching infrastructure."
msgstr ""
-#: ../include/svn_error_codes.h:803
+#: ../include/svn_error_codes.h:819
+msgid "Malformed transaction ID string."
+msgstr ""
+
+#: ../include/svn_error_codes.h:824
+msgid "Corrupt index file."
+msgstr ""
+
+#: ../include/svn_error_codes.h:829
+msgid "Revision not covered by index."
+msgstr ""
+
+#: ../include/svn_error_codes.h:834
+msgid "Item index too large for this revision."
+msgstr ""
+
+#: ../include/svn_error_codes.h:839
+msgid "Container index out of range."
+msgstr ""
+
+#: ../include/svn_error_codes.h:844
+msgid "Index files are inconsistent."
+msgstr ""
+
+#: ../include/svn_error_codes.h:849
+msgid "Lock operation failed"
+msgstr ""
+
+#: ../include/svn_error_codes.h:854
+msgid "Unsupported FS type"
+msgstr ""
+
+#: ../include/svn_error_codes.h:859
+msgid "Container capacity exceeded."
+msgstr ""
+
+#: ../include/svn_error_codes.h:864
+msgid "Malformed node revision ID string."
+msgstr ""
+
+#: ../include/svn_error_codes.h:869 ../libsvn_fs_x/revprops.c:291
+msgid "Invalid generation number data."
+msgstr ""
+
+#: ../include/svn_error_codes.h:875
msgid "The repository is locked, perhaps for db recovery"
msgstr ""
-#: ../include/svn_error_codes.h:807
+#: ../include/svn_error_codes.h:879
msgid "A repository hook failed"
msgstr ""
-#: ../include/svn_error_codes.h:811
+#: ../include/svn_error_codes.h:883
msgid "Incorrect arguments supplied"
msgstr ""
-#: ../include/svn_error_codes.h:815
+#: ../include/svn_error_codes.h:887
msgid "A report cannot be generated because no data was supplied"
msgstr ""
-#: ../include/svn_error_codes.h:819
+#: ../include/svn_error_codes.h:891
msgid "Bogus revision report"
msgstr ""
-#: ../include/svn_error_codes.h:828
+#: ../include/svn_error_codes.h:900
msgid "Unsupported repository version"
msgstr ""
-#: ../include/svn_error_codes.h:832
+#: ../include/svn_error_codes.h:904
msgid "Disabled repository feature"
msgstr ""
-#: ../include/svn_error_codes.h:836
+#: ../include/svn_error_codes.h:908
msgid "Error running post-commit hook"
msgstr ""
-#: ../include/svn_error_codes.h:841
+#: ../include/svn_error_codes.h:913
msgid "Error running post-lock hook"
msgstr ""
-#: ../include/svn_error_codes.h:846
+#: ../include/svn_error_codes.h:918
msgid "Error running post-unlock hook"
msgstr ""
-#: ../include/svn_error_codes.h:851
+#: ../include/svn_error_codes.h:923
msgid "Repository upgrade is not supported"
msgstr ""
-#: ../include/svn_error_codes.h:857
+#: ../include/svn_error_codes.h:929
msgid "Bad URL passed to RA layer"
msgstr ""
-#: ../include/svn_error_codes.h:861
+#: ../include/svn_error_codes.h:933
msgid "Authorization failed"
msgstr ""
-#: ../include/svn_error_codes.h:865
+#: ../include/svn_error_codes.h:937
msgid "Unknown authorization method"
msgstr ""
-#: ../include/svn_error_codes.h:869
+#: ../include/svn_error_codes.h:941
msgid "Repository access method not implemented"
msgstr ""
-#: ../include/svn_error_codes.h:877
+#: ../include/svn_error_codes.h:949
msgid "Repository has no UUID"
msgstr ""
-#: ../include/svn_error_codes.h:881
+#: ../include/svn_error_codes.h:953
msgid "Unsupported RA plugin ABI version"
msgstr ""
-#: ../include/svn_error_codes.h:891
+#: ../include/svn_error_codes.h:963
msgid "Server can only replay from the root of a repository"
msgstr ""
-#: ../include/svn_error_codes.h:896
+#: ../include/svn_error_codes.h:968
msgid "Repository UUID does not match expected UUID"
msgstr ""
-#: ../include/svn_error_codes.h:901
+#: ../include/svn_error_codes.h:973
msgid "Repository root URL does not match expected root URL"
msgstr ""
-#: ../include/svn_error_codes.h:906
+#: ../include/svn_error_codes.h:978
msgid "Session URL does not match expected session URL"
msgstr ""
-#: ../include/svn_error_codes.h:911 ../libsvn_ra_svn/client.c:492
+#: ../include/svn_error_codes.h:983 ../libsvn_ra_svn/client.c:504
#, c-format
msgid "Can't create tunnel"
msgstr ""
-#: ../include/svn_error_codes.h:917
+#: ../include/svn_error_codes.h:988
+msgid "Can't create session"
+msgstr ""
+
+#: ../include/svn_error_codes.h:994
msgid "RA layer failed to init socket layer"
msgstr ""
-#: ../include/svn_error_codes.h:921
+#: ../include/svn_error_codes.h:998
msgid "RA layer failed to create HTTP request"
msgstr ""
-#: ../include/svn_error_codes.h:925
+#: ../include/svn_error_codes.h:1002
msgid "RA layer request failed"
msgstr ""
-#: ../include/svn_error_codes.h:929
+#: ../include/svn_error_codes.h:1006
msgid "RA layer didn't receive requested OPTIONS info"
msgstr ""
-#: ../include/svn_error_codes.h:933
+#: ../include/svn_error_codes.h:1010
msgid "RA layer failed to fetch properties"
msgstr ""
-#: ../include/svn_error_codes.h:937
+#: ../include/svn_error_codes.h:1014
msgid "RA layer file already exists"
msgstr ""
-#: ../include/svn_error_codes.h:951
+#: ../include/svn_error_codes.h:1028
msgid "HTTP Path Not Found"
msgstr ""
-#: ../include/svn_error_codes.h:955
+#: ../include/svn_error_codes.h:1032
msgid "Failed to execute WebDAV PROPPATCH"
msgstr ""
-#: ../include/svn_error_codes.h:960 ../include/svn_error_codes.h:1403
-#: ../libsvn_ra_svn/marshal.c:1075 ../libsvn_ra_svn/marshal.c:1285
-#: ../libsvn_ra_svn/marshal.c:1315
+#. If condition COND is not met, return a "malformed network data" error.
+#.
+#: ../include/svn_error_codes.h:1037 ../include/svn_error_codes.h:1520
+#: ../libsvn_ra_svn/marshal.c:1100 ../libsvn_ra_svn/marshal.c:1352
+#: ../libsvn_ra_svn/marshal.c:1382 ../libsvn_ra_svn/marshal.c:2466
msgid "Malformed network data"
msgstr ""
-#: ../include/svn_error_codes.h:965
+#: ../include/svn_error_codes.h:1042
msgid "Unable to extract data from response header"
msgstr ""
-#: ../include/svn_error_codes.h:970
+#: ../include/svn_error_codes.h:1047
msgid "Repository has been moved"
msgstr ""
-#: ../include/svn_error_codes.h:975 ../libsvn_ra_serf/update.c:2863
-#: ../libsvn_ra_serf/util.c:944
+#: ../include/svn_error_codes.h:1052 ../libsvn_ra_serf/util.c:893
msgid "Connection timed out"
msgstr ""
-#: ../include/svn_error_codes.h:980
+#: ../include/svn_error_codes.h:1057
msgid "URL access forbidden for unknown reason"
msgstr ""
-#: ../include/svn_error_codes.h:986 ../include/svn_error_codes.h:1407
+#: ../include/svn_error_codes.h:1062
+msgid "The server state conflicts with the requested preconditions"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1067
+msgid "The URL doesn't allow the requested method"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1073 ../include/svn_error_codes.h:1524
msgid "Couldn't find a repository"
msgstr ""
-#: ../include/svn_error_codes.h:990
+#: ../include/svn_error_codes.h:1077
msgid "Couldn't open a repository"
msgstr ""
-#: ../include/svn_error_codes.h:996
+#: ../include/svn_error_codes.h:1083
msgid "Svndiff data has invalid header"
msgstr ""
-#: ../include/svn_error_codes.h:1000
+#: ../include/svn_error_codes.h:1087
msgid "Svndiff data contains corrupt window"
msgstr ""
-#: ../include/svn_error_codes.h:1004
+#: ../include/svn_error_codes.h:1091
msgid "Svndiff data contains backward-sliding source view"
msgstr ""
-#: ../include/svn_error_codes.h:1008
+#: ../include/svn_error_codes.h:1095
msgid "Svndiff data contains invalid instruction"
msgstr ""
-#: ../include/svn_error_codes.h:1012
+#: ../include/svn_error_codes.h:1099
msgid "Svndiff data ends unexpectedly"
msgstr ""
-#: ../include/svn_error_codes.h:1016
+#: ../include/svn_error_codes.h:1103
msgid "Svndiff compressed data is invalid"
msgstr ""
-#: ../include/svn_error_codes.h:1022
+#: ../include/svn_error_codes.h:1109
msgid "Apache has no path to an SVN filesystem"
msgstr ""
-#: ../include/svn_error_codes.h:1026
+#: ../include/svn_error_codes.h:1113
msgid "Apache got a malformed URI"
msgstr ""
-#: ../include/svn_error_codes.h:1030
+#: ../include/svn_error_codes.h:1117
msgid "Activity not found"
msgstr ""
-#: ../include/svn_error_codes.h:1034
+#: ../include/svn_error_codes.h:1121
msgid "Baseline incorrect"
msgstr ""
-#: ../include/svn_error_codes.h:1038
+#: ../include/svn_error_codes.h:1125
msgid "Input/output error"
msgstr ""
-#: ../include/svn_error_codes.h:1044
+#: ../include/svn_error_codes.h:1131
msgid "A path under version control is needed for this operation"
msgstr ""
-#: ../include/svn_error_codes.h:1048
+#: ../include/svn_error_codes.h:1135
msgid "Repository access is needed for this operation"
msgstr ""
-#: ../include/svn_error_codes.h:1052
+#: ../include/svn_error_codes.h:1139
msgid "Bogus revision information given"
msgstr ""
-#: ../include/svn_error_codes.h:1056
+#: ../include/svn_error_codes.h:1143
msgid "Attempting to commit to a URL more than once"
msgstr ""
-#: ../include/svn_error_codes.h:1060
+#: ../include/svn_error_codes.h:1147
msgid "Operation does not apply to binary file"
msgstr ""
-#: ../include/svn_error_codes.h:1066
+#: ../include/svn_error_codes.h:1153
msgid "Format of an svn:externals property was invalid"
msgstr ""
-#: ../include/svn_error_codes.h:1070
+#: ../include/svn_error_codes.h:1157
msgid "Attempting restricted operation for modified resource"
msgstr ""
-#: ../include/svn_error_codes.h:1074
+#: ../include/svn_error_codes.h:1161
msgid "Operation does not apply to directory"
msgstr ""
-#: ../include/svn_error_codes.h:1078
+#: ../include/svn_error_codes.h:1165
msgid "Revision range is not allowed"
msgstr ""
-#: ../include/svn_error_codes.h:1082
+#: ../include/svn_error_codes.h:1169
msgid "Inter-repository relocation not allowed"
msgstr ""
-#: ../include/svn_error_codes.h:1086
+#: ../include/svn_error_codes.h:1173
msgid "Author name cannot contain a newline"
msgstr ""
-#: ../include/svn_error_codes.h:1090
+#: ../include/svn_error_codes.h:1177
msgid "Bad property name"
msgstr ""
-#: ../include/svn_error_codes.h:1095
+#: ../include/svn_error_codes.h:1182
msgid "Two versioned resources are unrelated"
msgstr ""
-#: ../include/svn_error_codes.h:1100
+#: ../include/svn_error_codes.h:1187
msgid "Path has no lock token"
msgstr ""
-#: ../include/svn_error_codes.h:1105
+#: ../include/svn_error_codes.h:1192
msgid "Operation does not support multiple sources"
msgstr ""
-#: ../include/svn_error_codes.h:1110
+#: ../include/svn_error_codes.h:1197
msgid "No versioned parent directories"
msgstr ""
-#: ../include/svn_error_codes.h:1115 ../include/svn_error_codes.h:1135
+#: ../include/svn_error_codes.h:1202 ../include/svn_error_codes.h:1222
msgid "Working copy and merge source not ready for reintegration"
msgstr ""
-#: ../include/svn_error_codes.h:1120
+#: ../include/svn_error_codes.h:1207
msgid "A file external cannot overwrite an existing versioned item"
msgstr ""
-#: ../include/svn_error_codes.h:1125
+#: ../include/svn_error_codes.h:1212
msgid "Invalid path component strip count specified"
msgstr ""
-#: ../include/svn_error_codes.h:1130
+#: ../include/svn_error_codes.h:1217
msgid "Detected a cycle while processing the operation"
msgstr ""
-#: ../include/svn_error_codes.h:1140
+#: ../include/svn_error_codes.h:1227
msgid "Invalid mergeinfo detected in merge target"
msgstr ""
-#: ../include/svn_error_codes.h:1145
+#: ../include/svn_error_codes.h:1232
msgid "Can't perform this operation without a valid lock token"
msgstr ""
-#: ../include/svn_error_codes.h:1150
+#: ../include/svn_error_codes.h:1237
msgid "The operation is forbidden by the server"
msgstr ""
-#: ../include/svn_error_codes.h:1156
+#: ../include/svn_error_codes.h:1243
msgid "A problem occurred; see other errors for details"
msgstr ""
-#: ../include/svn_error_codes.h:1160
+#: ../include/svn_error_codes.h:1247
msgid "Failure loading plugin"
msgstr ""
-#: ../include/svn_error_codes.h:1164
+#: ../include/svn_error_codes.h:1251
msgid "Malformed file"
msgstr ""
-#: ../include/svn_error_codes.h:1168
+#: ../include/svn_error_codes.h:1255
msgid "Incomplete data"
msgstr ""
-#: ../include/svn_error_codes.h:1172
+#: ../include/svn_error_codes.h:1259
msgid "Incorrect parameters given"
msgstr ""
-#: ../include/svn_error_codes.h:1176
+#: ../include/svn_error_codes.h:1263
msgid "Tried a versioning operation on an unversioned resource"
msgstr ""
-#: ../include/svn_error_codes.h:1180
+#: ../include/svn_error_codes.h:1267
msgid "Test failed"
msgstr ""
-#: ../include/svn_error_codes.h:1184
+#: ../include/svn_error_codes.h:1271
msgid "Trying to use an unsupported feature"
msgstr ""
-#: ../include/svn_error_codes.h:1188
+#: ../include/svn_error_codes.h:1275
msgid "Unexpected or unknown property kind"
msgstr ""
-#: ../include/svn_error_codes.h:1192
+#: ../include/svn_error_codes.h:1279
msgid "Illegal target for the requested operation"
msgstr ""
-#: ../include/svn_error_codes.h:1196
+#: ../include/svn_error_codes.h:1283
msgid "MD5 checksum is missing"
msgstr ""
-#: ../include/svn_error_codes.h:1200
+#: ../include/svn_error_codes.h:1287
msgid "Directory needs to be empty but is not"
msgstr ""
-#: ../include/svn_error_codes.h:1204
+#: ../include/svn_error_codes.h:1291
msgid "Error calling external program"
msgstr ""
-#: ../include/svn_error_codes.h:1208
+#: ../include/svn_error_codes.h:1295
msgid "Python exception has been set with the error"
msgstr ""
-#: ../include/svn_error_codes.h:1212
+#: ../include/svn_error_codes.h:1299
msgid "A checksum mismatch occurred"
msgstr ""
-#: ../include/svn_error_codes.h:1216
+#: ../include/svn_error_codes.h:1303
msgid "The operation was interrupted"
msgstr ""
-#: ../include/svn_error_codes.h:1220
+#: ../include/svn_error_codes.h:1307
msgid "The specified diff option is not supported"
msgstr ""
-#: ../include/svn_error_codes.h:1224
+#: ../include/svn_error_codes.h:1311
msgid "Property not found"
msgstr ""
-#: ../include/svn_error_codes.h:1228
+#: ../include/svn_error_codes.h:1315
msgid "No auth file path available"
msgstr ""
-#: ../include/svn_error_codes.h:1233
+#: ../include/svn_error_codes.h:1320
msgid "Incompatible library version"
msgstr ""
-#: ../include/svn_error_codes.h:1238
+#: ../include/svn_error_codes.h:1325
msgid "Mergeinfo parse error"
msgstr ""
-#: ../include/svn_error_codes.h:1243
+#: ../include/svn_error_codes.h:1330
msgid "Cease invocation of this API"
msgstr ""
-#: ../include/svn_error_codes.h:1248
+#: ../include/svn_error_codes.h:1335
msgid "Error parsing revision number"
msgstr ""
-#: ../include/svn_error_codes.h:1253
+#: ../include/svn_error_codes.h:1340
msgid "Iteration terminated before completion"
msgstr ""
-#: ../include/svn_error_codes.h:1258
+#: ../include/svn_error_codes.h:1345
msgid "Unknown changelist"
msgstr ""
-#: ../include/svn_error_codes.h:1263
+#: ../include/svn_error_codes.h:1350
msgid "Reserved directory name in command line arguments"
msgstr ""
-#: ../include/svn_error_codes.h:1268
+#: ../include/svn_error_codes.h:1355
msgid "Inquiry about unknown capability"
msgstr ""
-#: ../include/svn_error_codes.h:1273
+#: ../include/svn_error_codes.h:1360
msgid "Test skipped"
msgstr ""
-#: ../include/svn_error_codes.h:1278
+#: ../include/svn_error_codes.h:1365
msgid "APR memcache library not available"
msgstr ""
-#: ../include/svn_error_codes.h:1283
+#: ../include/svn_error_codes.h:1370
msgid "Couldn't perform atomic initialization"
msgstr ""
-#: ../include/svn_error_codes.h:1288
+#: ../include/svn_error_codes.h:1375
msgid "SQLite error"
msgstr ""
-#: ../include/svn_error_codes.h:1293
+#: ../include/svn_error_codes.h:1380
msgid "Attempted to write to readonly SQLite db"
msgstr ""
-#: ../include/svn_error_codes.h:1300
+#: ../include/svn_error_codes.h:1387
msgid "Unsupported schema found in SQLite db"
msgstr ""
-#: ../include/svn_error_codes.h:1305
+#: ../include/svn_error_codes.h:1392
msgid "The SQLite db is busy"
msgstr ""
-#: ../include/svn_error_codes.h:1310
+#: ../include/svn_error_codes.h:1397
msgid ""
"SQLite busy at transaction rollback; resetting all busy SQLite statements to "
"allow rollback"
msgstr ""
-#: ../include/svn_error_codes.h:1316
+#: ../include/svn_error_codes.h:1403
msgid "Constraint error in SQLite db"
msgstr ""
-#: ../include/svn_error_codes.h:1321
+#: ../include/svn_error_codes.h:1408
msgid "Too many memcached servers configured"
msgstr ""
-#: ../include/svn_error_codes.h:1326
+#: ../include/svn_error_codes.h:1413
msgid "Failed to parse version number string"
msgstr ""
-#: ../include/svn_error_codes.h:1331
+#: ../include/svn_error_codes.h:1418
msgid "Atomic data storage is corrupt"
msgstr ""
-#: ../include/svn_error_codes.h:1337
+#: ../include/svn_error_codes.h:1423
+msgid "utf8proc library error"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1428
+msgid "Bad arguments to SQL operators GLOB or LIKE"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1433
+msgid "Packed data stream is corrupt"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1438
+msgid "Additional errors:"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1443
+msgid "Parser error: invalid input"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1449
msgid "Error parsing arguments"
msgstr ""
-#: ../include/svn_error_codes.h:1341
+#: ../include/svn_error_codes.h:1453
msgid "Not enough arguments provided"
msgstr ""
-#: ../include/svn_error_codes.h:1345
+#: ../include/svn_error_codes.h:1457
msgid "Mutually exclusive arguments specified"
msgstr ""
-#: ../include/svn_error_codes.h:1349
+#: ../include/svn_error_codes.h:1461
msgid "Attempted command in administrative dir"
msgstr ""
-#: ../include/svn_error_codes.h:1353
+#: ../include/svn_error_codes.h:1465
msgid "The log message file is under version control"
msgstr ""
-#: ../include/svn_error_codes.h:1357
+#: ../include/svn_error_codes.h:1469
msgid "The log message is a pathname"
msgstr ""
-#: ../include/svn_error_codes.h:1361
+#: ../include/svn_error_codes.h:1473
msgid "Committing in directory scheduled for addition"
msgstr ""
-#: ../include/svn_error_codes.h:1365
+#: ../include/svn_error_codes.h:1477
msgid "No external editor available"
msgstr ""
-#: ../include/svn_error_codes.h:1369
+#: ../include/svn_error_codes.h:1481
msgid "Something is wrong with the log message's contents"
msgstr ""
-#: ../include/svn_error_codes.h:1373
+#: ../include/svn_error_codes.h:1485
msgid "A log message was given where none was necessary"
msgstr ""
-#: ../include/svn_error_codes.h:1377
+#: ../include/svn_error_codes.h:1489
msgid "No external merge tool available"
msgstr ""
-#: ../include/svn_error_codes.h:1381
+#: ../include/svn_error_codes.h:1493
msgid "Failed processing one or more externals definitions"
msgstr ""
-#: ../include/svn_error_codes.h:1387
+#: ../include/svn_error_codes.h:1498
+msgid "Repository verification failed"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1504
msgid "Special code for wrapping server errors to report to client"
msgstr ""
-#: ../include/svn_error_codes.h:1391
+#: ../include/svn_error_codes.h:1508
msgid "Unknown svn protocol command"
msgstr ""
-#: ../include/svn_error_codes.h:1395
+#: ../include/svn_error_codes.h:1512
msgid "Network connection closed unexpectedly"
msgstr ""
-#: ../include/svn_error_codes.h:1399
+#: ../include/svn_error_codes.h:1516
msgid "Network read/write error"
msgstr ""
-#: ../include/svn_error_codes.h:1411
+#: ../include/svn_error_codes.h:1528
msgid "Client/server version mismatch"
msgstr ""
-#: ../include/svn_error_codes.h:1416
+#: ../include/svn_error_codes.h:1533
msgid "Cannot negotiate authentication mechanism"
msgstr ""
-#: ../include/svn_error_codes.h:1421
+#: ../include/svn_error_codes.h:1538
msgid "Editor drive was aborted"
msgstr ""
-#: ../include/svn_error_codes.h:1429
+#: ../include/svn_error_codes.h:1546
msgid "Credential data unavailable"
msgstr ""
-#: ../include/svn_error_codes.h:1433
+#: ../include/svn_error_codes.h:1550
msgid "No authentication provider available"
msgstr ""
-#: ../include/svn_error_codes.h:1437
+#: ../include/svn_error_codes.h:1554
msgid "All authentication providers exhausted"
msgstr ""
-#: ../include/svn_error_codes.h:1441
+#: ../include/svn_error_codes.h:1558
msgid "Credentials not saved"
msgstr ""
-#: ../include/svn_error_codes.h:1446 ../libsvn_subr/gpg_agent.c:415
+#: ../include/svn_error_codes.h:1563 ../libsvn_subr/gpg_agent.c:456
msgid "Authentication failed"
msgstr ""
-#: ../include/svn_error_codes.h:1452
+#: ../include/svn_error_codes.h:1569
msgid "Read access denied for root of edit"
msgstr ""
-#: ../include/svn_error_codes.h:1457
+#: ../include/svn_error_codes.h:1574
msgid "Item is not readable"
msgstr ""
-#: ../include/svn_error_codes.h:1462
+#: ../include/svn_error_codes.h:1579
msgid "Item is partially readable"
msgstr ""
-#: ../include/svn_error_codes.h:1466
+#: ../include/svn_error_codes.h:1583
msgid "Invalid authz configuration"
msgstr ""
-#: ../include/svn_error_codes.h:1471
+#: ../include/svn_error_codes.h:1588
msgid "Item is not writable"
msgstr ""
-#: ../include/svn_error_codes.h:1478
+#: ../include/svn_error_codes.h:1595
msgid "Diff data source modified unexpectedly"
msgstr ""
-#: ../include/svn_error_codes.h:1484
+#: ../include/svn_error_codes.h:1602
msgid "Initialization of SSPI library failed"
msgstr ""
-#: ../include/svn_error_codes.h:1488
+#: ../include/svn_error_codes.h:1608
msgid "Server SSL certificate untrusted"
msgstr ""
-#: ../include/svn_error_codes.h:1493
+#: ../include/svn_error_codes.h:1613
msgid "Initialization of the GSSAPI context failed"
msgstr ""
-#: ../include/svn_error_codes.h:1498
+#: ../include/svn_error_codes.h:1618
msgid "While handling serf response:"
msgstr ""
-#: ../include/svn_error_codes.h:1504
+#: ../include/svn_error_codes.h:1624
msgid "Assertion failure"
msgstr ""
-#: ../include/svn_error_codes.h:1508
+#: ../include/svn_error_codes.h:1628
msgid "No non-tracing links found in the error chain"
msgstr ""
+#: ../include/svn_error_codes.h:1636
+msgid "Unexpected end of ASN1 data"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1640
+msgid "Unexpected ASN1 tag"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1644
+msgid "Invalid ASN1 length"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1648
+msgid "ASN1 length mismatch"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1652
+msgid "Invalid ASN1 data"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1656
+msgid "Unavailable X509 feature"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1660
+msgid "Invalid PEM certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1664
+msgid "Invalid certificate format"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1668
+msgid "Invalid certificate version"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1672
+msgid "Invalid certificate serial number"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1676
+msgid "Found invalid algorithm in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1680
+msgid "Found invalid name in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1684
+msgid "Found invalid date in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1688
+msgid "Found invalid public key in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1692
+msgid "Found invalid signature in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1696
+msgid "Found invalid extensions in certificate"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1700
+msgid "Unknown certificate version"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1704
+msgid "Certificate uses unknown public key algorithm"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1708
+msgid "Certificate signature mismatch"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1712
+msgid "Certficate verification failed"
+msgstr ""
+
#: ../libsvn_auth_gnome_keyring/gnome_keyring.c:152
msgid "GNOME Keyring is locked and we are non-interactive"
msgstr ""
-#: ../libsvn_client/add.c:606 ../libsvn_client/cmdline.c:356
+#: ../libsvn_client/add.c:609 ../libsvn_client/cmdline.c:365
#: ../libsvn_subr/opt.c:932
#, c-format
msgid "'%s' ends in a reserved name"
msgstr ""
-#: ../libsvn_client/add.c:875
+#: ../libsvn_client/add.c:822
#, c-format
msgid "'%s' prevents creating parent of '%s'"
msgstr ""
-#: ../libsvn_client/add.c:914 ../libsvn_wc/adm_ops.c:732
+#: ../libsvn_client/add.c:862 ../libsvn_wc/adm_ops.c:445
#, c-format
msgid ""
"'%s' is an existing item in conflict; please mark the conflict as resolved "
"before adding a new item here"
msgstr ""
-#: ../libsvn_client/add.c:921 ../libsvn_wc/adm_ops.c:687
-#: ../libsvn_wc/workqueue.c:905 ../libsvn_wc/workqueue.c:999
+#: ../libsvn_client/add.c:869 ../libsvn_wc/adm_ops.c:400
+#: ../libsvn_wc/workqueue.c:873 ../libsvn_wc/workqueue.c:967
#, c-format
msgid "'%s' not found"
msgstr ""
-#: ../libsvn_client/add.c:927 ../libsvn_wc/adm_ops.c:692
+#: ../libsvn_client/add.c:875 ../libsvn_wc/adm_ops.c:405
#: ../libsvn_wc/delete.c:98
#, c-format
msgid "Unsupported node kind for path '%s'"
msgstr ""
-#: ../libsvn_client/add.c:960 ../libsvn_client/changelist.c:65
-#: ../libsvn_client/changelist.c:104 ../libsvn_client/cleanup.c:55
-#: ../libsvn_client/export.c:1394 ../libsvn_client/import.c:815
-#: ../libsvn_client/patch.c:3063 ../libsvn_client/relocate.c:232
-#: ../libsvn_client/resolved.c:121 ../libsvn_client/revert.c:136
-#: ../libsvn_client/status.c:353 ../libsvn_client/switch.c:473
-#: ../libsvn_client/update.c:646 ../libsvn_client/upgrade.c:109
-#: ../svn/util.c:984
+#: ../libsvn_client/add.c:908 ../libsvn_client/changelist.c:65
+#: ../libsvn_client/changelist.c:104 ../libsvn_client/deprecated.c:3078
+#: ../libsvn_client/export.c:1394 ../libsvn_client/import.c:831
+#: ../libsvn_client/patch.c:3235 ../libsvn_client/relocate.c:153
+#: ../libsvn_client/resolved.c:119 ../libsvn_client/revert.c:149
+#: ../libsvn_client/status.c:368 ../libsvn_client/switch.c:471
+#: ../libsvn_client/update.c:701 ../libsvn_client/upgrade.c:111
+#: ../svn/util.c:986 ../svnbench/util.c:76
#, c-format
msgid "'%s' is not a local path"
msgstr ""
-#: ../libsvn_client/add.c:1001 ../libsvn_client/copy_foreign.c:489
-#: ../libsvn_wc/adm_ops.c:766 ../libsvn_wc/copy.c:715
+#: ../libsvn_client/add.c:949 ../libsvn_client/copy_foreign.c:491
+#: ../libsvn_wc/adm_ops.c:479 ../libsvn_wc/copy.c:786
#, c-format
msgid "'%s' is already under version control"
msgstr ""
-#: ../libsvn_client/add.c:1134 ../libsvn_client/add.c:1161
+#: ../libsvn_client/add.c:1082 ../libsvn_client/add.c:1109
#, c-format
msgid "There is no valid URI above '%s'"
msgstr ""
-#: ../libsvn_client/blame.c:605
-msgid "Start revision must precede end revision"
-msgstr ""
-
-#: ../libsvn_client/blame.c:633
+#: ../libsvn_client/blame.c:457 ../libsvn_client/blame.c:764
#, c-format
msgid "Cannot calculate blame information for binary file '%s'"
msgstr ""
-#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:610
-#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:833
-#: ../libsvn_client/prop_commands.c:1423 ../libsvn_client/revisions.c:104
-#: ../libsvn_wc/adm_ops.c:1198 ../libsvn_wc/adm_ops.c:1248
-#: ../libsvn_wc/copy.c:563 ../libsvn_wc/copy.c:624 ../libsvn_wc/entries.c:1301
-#: ../libsvn_wc/entries.c:2682 ../libsvn_wc/entries.c:2713
-#: ../svn/notify.c:1095
+#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:612
+#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:817
+#: ../libsvn_client/prop_commands.c:1398 ../libsvn_client/revisions.c:105
+#: ../libsvn_wc/adm_ops.c:913 ../libsvn_wc/adm_ops.c:967
+#: ../libsvn_wc/copy.c:628 ../libsvn_wc/copy.c:689 ../libsvn_wc/entries.c:1407
+#: ../libsvn_wc/entries.c:2803 ../libsvn_wc/entries.c:2834 ../svn/notify.c:1026
+#: ../svnbench/notify.c:968
#, c-format
msgid "'%s' is not under version control"
msgstr ""
@@ -1327,7 +1498,7 @@ msgstr ""
msgid "(local)"
msgstr ""
-#: ../libsvn_client/cat.c:247
+#: ../libsvn_client/cat.c:255
#, c-format
msgid "URL '%s' refers to a directory"
msgstr ""
@@ -1336,22 +1507,23 @@ msgstr ""
msgid "Target changelist name must not be empty"
msgstr ""
-#: ../libsvn_client/checkout.c:109 ../libsvn_client/export.c:1447
+#: ../libsvn_client/checkout.c:131 ../libsvn_client/export.c:1447
+#: ../svnbench/null-export-cmd.c:275
#, c-format
msgid "URL '%s' doesn't exist"
msgstr ""
-#: ../libsvn_client/checkout.c:113
+#: ../libsvn_client/checkout.c:135
#, c-format
msgid "URL '%s' refers to a file, not a directory"
msgstr ""
-#: ../libsvn_client/checkout.c:147
+#: ../libsvn_client/checkout.c:173
#, c-format
msgid "'%s' is already a working copy for a different URL"
msgstr ""
-#: ../libsvn_client/checkout.c:155
+#: ../libsvn_client/checkout.c:181
#, c-format
msgid "'%s' already exists and is not a directory"
msgstr ""
@@ -1361,246 +1533,288 @@ msgstr ""
msgid "All non-relative targets must have the same root URL"
msgstr ""
-#: ../libsvn_client/cmdline.c:312
+#: ../libsvn_client/cmdline.c:207
+#, c-format
+msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
+msgstr ""
+
+#: ../libsvn_client/cmdline.c:321
msgid ""
"Resolving '^/': no repository root found in the target arguments or in the "
"current directory"
msgstr ""
-#: ../libsvn_client/commit.c:155 ../libsvn_client/copy.c:1522
+#: ../libsvn_client/commit.c:157 ../libsvn_client/copy.c:2307
msgid "Commit failed (details follow):"
msgstr ""
-#: ../libsvn_client/commit.c:163
+#: ../libsvn_client/commit.c:165
msgid "Commit succeeded, but other errors follow:"
msgstr ""
-#: ../libsvn_client/commit.c:170
+#: ../libsvn_client/commit.c:172
msgid "Error unlocking locked dirs (details follow):"
msgstr ""
-#: ../libsvn_client/commit.c:181
+#: ../libsvn_client/commit.c:183
msgid "Error bumping revisions post-commit (details follow):"
msgstr ""
-#: ../libsvn_client/commit.c:314
-#, c-format
-msgid ""
-"Cannot delete the directory '%s' in a non-recursive commit because it has "
-"children"
-msgstr ""
-
-#: ../libsvn_client/commit.c:613
+#: ../libsvn_client/commit.c:554
#, c-format
msgid "'%s' is a URL, but URLs cannot be commit targets"
msgstr ""
-#: ../libsvn_client/commit.c:735
+#: ../libsvn_client/commit.c:656
msgid ""
"Commit can only commit to a single repository at a time.\n"
"Are all targets part of the same working copy?"
msgstr ""
-#: ../libsvn_client/commit.c:851
+#: ../libsvn_client/commit.c:722
#, c-format
msgid ""
"Cannot commit '%s' because it was moved from '%s' which is not part of the "
"commit; both sides of the move must be committed together"
msgstr ""
-#: ../libsvn_client/commit.c:882
+#: ../libsvn_client/commit.c:777
#, c-format
msgid ""
"Cannot commit '%s' because it was moved to '%s' which is not part of the "
"commit; both sides of the move must be committed together"
msgstr ""
-#: ../libsvn_client/commit_util.c:94 ../libsvn_repos/commit.c:167
+#: ../libsvn_client/commit_util.c:96 ../libsvn_repos/commit.c:167
#, c-format
msgid "Directory '%s' is out of date"
msgstr ""
-#: ../libsvn_client/commit_util.c:95 ../libsvn_repos/commit.c:169
+#: ../libsvn_client/commit_util.c:97 ../libsvn_repos/commit.c:169
#, c-format
msgid "File '%s' is out of date"
msgstr ""
-#: ../libsvn_client/commit_util.c:130
+#: ../libsvn_client/commit_util.c:133
#, c-format
msgid "Directory '%s' is locked in another working copy"
msgstr ""
-#: ../libsvn_client/commit_util.c:131
+#: ../libsvn_client/commit_util.c:134
#, c-format
msgid "File '%s' is locked in another working copy"
msgstr ""
-#: ../libsvn_client/commit_util.c:166
+#: ../libsvn_client/commit_util.c:169
#, c-format
msgid "Changing directory '%s' is forbidden by the server"
msgstr ""
-#: ../libsvn_client/commit_util.c:167
+#: ../libsvn_client/commit_util.c:170
#, c-format
msgid "Changing file '%s' is forbidden by the server"
msgstr ""
-#: ../libsvn_client/commit_util.c:315
+#: ../libsvn_client/commit_util.c:318
#, c-format
msgid "Aborting commit: '%s' remains in tree-conflict"
msgstr ""
-#: ../libsvn_client/commit_util.c:666
+#: ../libsvn_client/commit_util.c:668
#, c-format
msgid "Aborting commit: '%s' remains in conflict"
msgstr ""
-#: ../libsvn_client/commit_util.c:685
+#: ../libsvn_client/commit_util.c:687
#, c-format
msgid "Node '%s' has unexpectedly changed kind"
msgstr ""
-#: ../libsvn_client/commit_util.c:726
+#: ../libsvn_client/commit_util.c:728
#, c-format
msgid "'%s' is scheduled for addition, but is missing"
msgstr ""
-#: ../libsvn_client/commit_util.c:1257
+#: ../libsvn_client/commit_util.c:1279
#, c-format
msgid ""
"'%s' is not known to exist in the repository and is not part of the commit, "
"yet its child '%s' is part of the commit"
msgstr ""
-#: ../libsvn_client/commit_util.c:1397
+#: ../libsvn_client/commit_util.c:1421
#, c-format
msgid "Cannot commit both '%s' and '%s' as they refer to the same URL"
msgstr ""
-#: ../libsvn_client/commit_util.c:1548
+#: ../libsvn_client/commit_util.c:1576
#, c-format
msgid "Commit item '%s' has copy flag but no copyfrom URL"
msgstr ""
-#: ../libsvn_client/commit_util.c:1553
+#: ../libsvn_client/commit_util.c:1581
#, c-format
msgid "Commit item '%s' has copy flag but an invalid revision"
msgstr ""
-#: ../libsvn_client/commit_util.c:2015
+#: ../libsvn_client/commit_util.c:2056
msgid "Standard properties can't be set explicitly as revision properties"
msgstr ""
-#: ../libsvn_client/copy.c:439
+#: ../libsvn_client/copy.c:295
+#, c-format
+msgid "%s property defined at '%s' is using an unsupported syntax"
+msgstr ""
+
+#: ../libsvn_client/copy.c:460
+#, c-format
+msgid ""
+"Cannot pin external '%s' defined in %s at '%s' because it is not checked out "
+"in the working copy at '%s'"
+msgstr ""
+
+#: ../libsvn_client/copy.c:485
+#, c-format
+msgid ""
+"Cannot pin external '%s' defined in %s at '%s' because '%s' has switched "
+"subtrees (switches cannot be represented in %s)"
+msgstr ""
+
+#: ../libsvn_client/copy.c:504
+#, c-format
+msgid ""
+"Cannot pin external '%s' defined in %s at '%s' because '%s' has local "
+"modifications (local modifications cannot be represented in %s)"
+msgstr ""
+
+#: ../libsvn_client/copy.c:522
+#, c-format
+msgid ""
+"Cannot pin external '%s' defined in %s at '%s' because '%s' is a mixed-"
+"revision working copy (mixed-revisions cannot be represented in %s)"
+msgstr ""
+
+#: ../libsvn_client/copy.c:985
#, c-format
msgid "Path '%s' exists, but is excluded"
msgstr ""
-#: ../libsvn_client/copy.c:445 ../libsvn_client/copy.c:1062
-#: ../libsvn_client/copy.c:1321 ../libsvn_client/copy.c:1896
-#: ../libsvn_client/import.c:862
+#: ../libsvn_client/copy.c:991 ../libsvn_client/copy.c:2094
+#: ../libsvn_client/copy.c:2750 ../libsvn_client/import.c:881
+#: ../libsvn_client/mtcc.c:456 ../libsvn_client/mtcc.c:473
+#: ../libsvn_ra_serf/util.c:1852
#, c-format
msgid "Path '%s' already exists"
msgstr ""
-#: ../libsvn_client/copy.c:500
+#: ../libsvn_client/copy.c:1046
#, c-format
msgid "Path '%s' already exists as unversioned node"
msgstr ""
-#: ../libsvn_client/copy.c:522 ../libsvn_client/copy.c:532
-#: ../libsvn_client/copy.c:1912
+#: ../libsvn_client/copy.c:1071
+#, c-format
+msgid "Directory '%s' is not under version control"
+msgstr ""
+
+#: ../libsvn_client/copy.c:1073 ../libsvn_client/copy.c:1082
+#: ../libsvn_client/copy.c:1092 ../libsvn_client/copy.c:2766
#, c-format
msgid "Path '%s' is not a directory"
msgstr ""
-#: ../libsvn_client/copy.c:571 ../libsvn_client/merge.c:10168
-#: ../svnlook/svnlook.c:1425
+#: ../libsvn_client/copy.c:1131 ../libsvn_client/merge.c:10299
+#: ../svnlook/svnlook.c:1422
#, c-format
msgid "Path '%s' does not exist"
msgstr ""
-#: ../libsvn_client/copy.c:741 ../libsvn_client/copy.c:782
+#: ../libsvn_client/copy.c:1315 ../libsvn_client/copy.c:1356
#, c-format
msgid "Path '%s' already exists, but is not a directory"
msgstr ""
-#: ../libsvn_client/copy.c:843
+#: ../libsvn_client/copy.c:1493
msgid "Source and destination URLs appear not to point to the same repository."
msgstr ""
-#: ../libsvn_client/copy.c:1052 ../libsvn_client/prop_commands.c:167
+#: ../libsvn_client/copy.c:1705 ../libsvn_client/prop_commands.c:167
#, c-format
msgid "Path '%s' does not exist in revision %ld"
msgstr ""
-#: ../libsvn_client/copy.c:1880
+#: ../libsvn_client/copy.c:1719
+#, c-format
+msgid "Path '/%s' already exists"
+msgstr ""
+
+#: ../libsvn_client/copy.c:2734 ../libsvn_client/mtcc.c:550
#, c-format
msgid "Path '%s' not found in revision %ld"
msgstr ""
-#: ../libsvn_client/copy.c:1885
+#: ../libsvn_client/copy.c:2739
#, c-format
msgid "Path '%s' not found in head revision"
msgstr ""
-#: ../libsvn_client/copy.c:2013
+#: ../libsvn_client/copy.c:2874
msgid "Cannot mix repository and working copy sources"
msgstr ""
-#: ../libsvn_client/copy.c:2065
+#: ../libsvn_client/copy.c:2927
#, c-format
msgid "Cannot copy path '%s' into its own child '%s'"
msgstr ""
-#: ../libsvn_client/copy.c:2101
+#: ../libsvn_client/copy.c:2963
#, c-format
msgid ""
"Cannot move the external at '%s'; please edit the svn:externals property on "
"'%s'."
msgstr ""
-#: ../libsvn_client/copy.c:2116
+#: ../libsvn_client/copy.c:2978
msgid "Moves between the working copy and the repository are not supported"
msgstr ""
-#: ../libsvn_client/copy.c:2131
+#: ../libsvn_client/copy.c:2993
#, c-format
msgid "Cannot move URL '%s' into itself"
msgstr ""
-#: ../libsvn_client/copy.c:2132
+#: ../libsvn_client/copy.c:2994
#, c-format
msgid "Cannot move path '%s' into itself"
msgstr ""
-#: ../libsvn_client/copy.c:2199
+#: ../libsvn_client/copy.c:3061
#, c-format
msgid "'%s' does not have a URL associated with it"
msgstr ""
-#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:282
-#: ../libsvn_client/externals.c:963 ../libsvn_client/externals.c:1173
-#: ../libsvn_wc/update_editor.c:1124
+#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:283
+#: ../libsvn_client/externals.c:1021 ../libsvn_client/externals.c:1232
+#: ../libsvn_wc/update_editor.c:1119
#, c-format
msgid "Path '%s' is not in the working copy"
msgstr ""
-#: ../libsvn_client/copy_foreign.c:372 ../libsvn_client/export.c:814
-#: ../libsvn_client/repos_diff.c:998 ../libsvn_fs_fs/dag.c:1051
-#: ../libsvn_ra_svn/client.c:1208 ../libsvn_wc/diff_editor.c:1984
-#: ../libsvn_wc/diff_editor.c:2070 ../libsvn_wc/externals.c:651
-#: ../libsvn_wc/update_editor.c:4277
+#: ../libsvn_client/copy_foreign.c:373 ../libsvn_client/export.c:814
+#: ../libsvn_client/repos_diff.c:1002 ../libsvn_fs_fs/dag.c:1110
+#: ../libsvn_fs_x/dag.c:1074 ../libsvn_ra_svn/client.c:1356
+#: ../libsvn_wc/diff_editor.c:1987 ../libsvn_wc/diff_editor.c:2073
+#: ../libsvn_wc/externals.c:709 ../libsvn_wc/update_editor.c:4228
#, c-format
msgid "Checksum mismatch for '%s'"
msgstr ""
-#: ../libsvn_client/copy_foreign.c:479
+#: ../libsvn_client/copy_foreign.c:481
#, c-format
msgid "'%s' is not a valid location inside a repository"
msgstr ""
-#: ../libsvn_client/copy_foreign.c:510
+#: ../libsvn_client/copy_foreign.c:512
#, c-format
msgid "Can't add '%s', because no parent directory is found"
msgstr ""
@@ -1622,105 +1836,109 @@ msgid ""
"property on '%s'"
msgstr ""
-#: ../libsvn_client/deprecated.c:862 ../svn/move-cmd.c:65
+#: ../libsvn_client/delete.c:358
+#, c-format
+msgid "URL '%s' not within a repository"
+msgstr ""
+
+#: ../libsvn_client/delete.c:365
+#, c-format
+msgid "URL '%s' does not exist"
+msgstr ""
+
+#: ../libsvn_client/deprecated.c:884 ../svn/move-cmd.c:65
msgid "Cannot specify revisions (except HEAD) with move operations"
msgstr ""
-#: ../libsvn_client/deprecated.c:1624
+#: ../libsvn_client/deprecated.c:1647
msgid "No commits in repository"
msgstr ""
-#: ../libsvn_client/deprecated.c:2930 ../libsvn_wc/deprecated.c:3953
+#: ../libsvn_client/deprecated.c:3032 ../libsvn_wc/deprecated.c:4172
msgid "Non-recursive relocation not supported"
msgstr ""
-#. Utilities
-#: ../libsvn_client/diff.c:64
+#: ../libsvn_client/diff.c:66
#, c-format
msgid "Path '%s' must be an immediate child of the directory '%s'"
msgstr ""
-#: ../libsvn_client/diff.c:258
+#: ../libsvn_client/diff.c:241
#, c-format
msgid "%s\t(revision %ld)"
msgstr ""
-#: ../libsvn_client/diff.c:260
+#: ../libsvn_client/diff.c:243
+#, c-format
+msgid "%s\t(nonexistent)"
+msgstr ""
+
+#. SVN_INVALID_REVNUM
+#: ../libsvn_client/diff.c:245
#, c-format
msgid "%s\t(working copy)"
msgstr ""
-#: ../libsvn_client/diff.c:512 ../svnlook/svnlook.c:795
+#: ../libsvn_client/diff.c:499 ../svnlook/svnlook.c:801
#, c-format
msgid "%sProperty changes on: %s%s"
msgstr ""
-#: ../libsvn_client/diff.c:760
+#: ../libsvn_client/diff.c:754
#, c-format
msgid "Cannot display: file marked as a binary type.%s"
msgstr ""
-#: ../libsvn_client/diff.c:1265 ../libsvn_client/merge.c:7217
-#: ../libsvn_client/merge.c:10570
+#: ../libsvn_client/diff.c:1285 ../libsvn_client/merge.c:7349
+#: ../libsvn_client/merge.c:10701
msgid "Not all required revisions are specified"
msgstr ""
-#: ../libsvn_client/diff.c:1279
+#: ../libsvn_client/diff.c:1299
msgid ""
"At least one revision must be something other than BASE or WORKING when "
"diffing a URL"
msgstr ""
-#: ../libsvn_client/diff.c:1316
+#: ../libsvn_client/diff.c:1336
#, c-format
msgid "Diff target '%s' was not found in the repository at revision '%ld'"
msgstr ""
-#: ../libsvn_client/diff.c:1321
+#: ../libsvn_client/diff.c:1341
#, c-format
msgid ""
"Diff target '%s' was not found in the repository at revision '%ld' or '%ld'"
msgstr ""
-#: ../libsvn_client/diff.c:1496
+#: ../libsvn_client/diff.c:1517
#, c-format
msgid ""
"Diff target '%s' was not found in the repository at revisions '%ld' and '%ld'"
msgstr ""
-#: ../libsvn_client/diff.c:1501
+#: ../libsvn_client/diff.c:1522
#, c-format
msgid ""
"Diff targets '%s' and '%s' were not found in the repository at revisions "
"'%ld' and '%ld'"
msgstr ""
-#: ../libsvn_client/diff.c:1575
+#: ../libsvn_client/diff.c:1621
msgid "Sorry, svn_client_diff6 was called in a way that is not yet supported"
msgstr ""
-#: ../libsvn_client/diff.c:1616
+#: ../libsvn_client/diff.c:1661
msgid ""
"Only diffs between a path's text-base and its working files are supported at "
"this time"
msgstr ""
-#: ../libsvn_client/diff.c:2221
-msgid ""
-"Summarized diffs are only supported between a path's text-base and its "
-"working files at this time"
-msgstr ""
-
-#: ../libsvn_client/diff.c:2582 ../libsvn_client/diff.c:2648
+#: ../libsvn_client/diff.c:2367 ../libsvn_client/diff.c:2453
msgid "Cannot ignore properties and show only properties at the same time"
msgstr ""
-#: ../libsvn_client/diff_local.c:609
-#, c-format
-msgid "'%s' is not the same node kind as '%s'"
-msgstr ""
-
-#: ../libsvn_client/diff_local.c:632 ../libsvn_wc/props.c:1568
+#: ../libsvn_client/diff_local.c:792 ../libsvn_wc/props.c:1675
#, c-format
msgid "'%s' is not a file or directory"
msgstr ""
@@ -1735,22 +1953,22 @@ msgid "Destination directory exists, and will not be overwritten unless forced"
msgstr ""
#: ../libsvn_client/export.c:265 ../libsvn_client/export.c:1527
-#: ../libsvn_wc/adm_crawler.c:1204 ../libsvn_wc/conflicts.c:1293
-#: ../libsvn_wc/copy.c:586 ../libsvn_wc/crop.c:236 ../libsvn_wc/crop.c:327
-#: ../libsvn_wc/info.c:403 ../libsvn_wc/node.c:704 ../libsvn_wc/props.c:227
-#: ../libsvn_wc/status.c:2679 ../libsvn_wc/wc_db.c:2589
-#: ../libsvn_wc/wc_db.c:2787 ../libsvn_wc/wc_db.c:2811
-#: ../libsvn_wc/wc_db.c:2969 ../libsvn_wc/wc_db.c:3967
-#: ../libsvn_wc/wc_db.c:6021 ../libsvn_wc/wc_db.c:6341
-#: ../libsvn_wc/wc_db.c:6502 ../libsvn_wc/wc_db.c:6657
-#: ../libsvn_wc/wc_db.c:7696 ../libsvn_wc/wc_db.c:8660
-#: ../libsvn_wc/wc_db.c:9326 ../libsvn_wc/wc_db.c:9955
-#: ../libsvn_wc/wc_db.c:10102 ../libsvn_wc/wc_db.c:10242
-#: ../libsvn_wc/wc_db.c:10592 ../libsvn_wc/wc_db.c:10926
-#: ../libsvn_wc/wc_db.c:12106 ../libsvn_wc/wc_db.c:12182
-#: ../libsvn_wc/wc_db.c:13716 ../libsvn_wc/wc_db.c:13776
-#: ../libsvn_wc/wc_db.c:13914 ../libsvn_wc/wc_db.c:14072
-#: ../libsvn_wc/wc_db.c:14509 ../libsvn_wc/wc_db.c:15290
+#: ../libsvn_wc/adm_crawler.c:1228 ../libsvn_wc/copy.c:651
+#: ../libsvn_wc/crop.c:234 ../libsvn_wc/crop.c:337 ../libsvn_wc/info.c:377
+#: ../libsvn_wc/node.c:529 ../libsvn_wc/props.c:202 ../libsvn_wc/status.c:2722
+#: ../libsvn_wc/wc_db.c:2066 ../libsvn_wc/wc_db.c:2607
+#: ../libsvn_wc/wc_db.c:2846 ../libsvn_wc/wc_db.c:2879
+#: ../libsvn_wc/wc_db.c:3037 ../libsvn_wc/wc_db.c:4050
+#: ../libsvn_wc/wc_db.c:6373 ../libsvn_wc/wc_db.c:6693
+#: ../libsvn_wc/wc_db.c:6933 ../libsvn_wc/wc_db.c:7073
+#: ../libsvn_wc/wc_db.c:8112 ../libsvn_wc/wc_db.c:9112
+#: ../libsvn_wc/wc_db.c:9844 ../libsvn_wc/wc_db.c:10489
+#: ../libsvn_wc/wc_db.c:10636 ../libsvn_wc/wc_db.c:10776
+#: ../libsvn_wc/wc_db.c:11152 ../libsvn_wc/wc_db.c:11485
+#: ../libsvn_wc/wc_db.c:12725 ../libsvn_wc/wc_db.c:12794
+#: ../libsvn_wc/wc_db.c:14123 ../libsvn_wc/wc_db.c:14172
+#: ../libsvn_wc/wc_db.c:14293 ../libsvn_wc/wc_db.c:14452
+#: ../libsvn_wc/wc_db.c:14893 ../libsvn_wc/wc_db.c:15757
#, c-format
msgid "The node '%s' was not found."
msgstr ""
@@ -1779,139 +1997,145 @@ msgstr ""
msgid "'%s' already exists"
msgstr ""
-#: ../libsvn_client/externals.c:202
+#: ../libsvn_client/externals.c:202 ../libsvn_client/externals.c:259
#, c-format
msgid ""
"The external '%s' defined in %s at '%s' cannot be checked out because '%s' "
"is already a versioned path."
msgstr ""
-#: ../libsvn_client/externals.c:461
+#: ../libsvn_client/externals.c:500
#, c-format
msgid ""
"Cannot insert a file external defined on '%s' into the working copy '%s'."
msgstr ""
-#: ../libsvn_client/externals.c:486
+#: ../libsvn_client/externals.c:525
#, c-format
msgid ""
"The file external from '%s' cannot overwrite the existing versioned item at "
"'%s'"
msgstr ""
-#: ../libsvn_client/externals.c:499
+#: ../libsvn_client/externals.c:539
#, c-format
msgid "The file external '%s' can not be created because the node exists."
msgstr ""
-#: ../libsvn_client/externals.c:761
+#: ../libsvn_client/externals.c:817
#, c-format
msgid "URL '%s' at revision %ld doesn't exist"
msgstr ""
-#: ../libsvn_client/externals.c:766
+#: ../libsvn_client/externals.c:822
#, c-format
msgid "URL '%s' at revision %ld is not a file or a directory"
msgstr ""
-#: ../libsvn_client/externals.c:845
+#: ../libsvn_client/externals.c:901
#, c-format
msgid ""
"Unsupported external: URL of file external '%s' is not in repository '%s'"
msgstr ""
-#: ../libsvn_client/externals.c:1038
+#: ../libsvn_client/externals.c:1097
#, c-format
msgid "Traversal of '%s' found no ambient depth"
msgstr ""
-#: ../libsvn_client/import.c:159
+#: ../libsvn_client/import.c:149
#, c-format
msgid "%s property on '%s' contains unrecognized EOL-style '%s'"
msgstr ""
-#: ../libsvn_client/import.c:489
+#: ../libsvn_client/import.c:479
#, c-format
msgid "Unknown or unversionable type for '%s'"
msgstr ""
-#: ../libsvn_client/import.c:707
+#: ../libsvn_client/import.c:706
msgid "New entry name required when importing a file"
msgstr ""
-#: ../libsvn_client/import.c:758 ../libsvn_client/patch.c:3070
-#: ../libsvn_client/patch.c:3082 ../libsvn_wc/delete.c:93
-#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:77
+#: ../libsvn_client/import.c:757 ../libsvn_client/patch.c:3242
+#: ../libsvn_client/patch.c:3254 ../libsvn_wc/delete.c:93
+#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:78
#, c-format
msgid "'%s' does not exist"
msgstr ""
-#: ../libsvn_client/import.c:891
+#: ../libsvn_client/import.c:909
#, c-format
msgid "'%s' is a reserved name and cannot be imported"
msgstr ""
-#: ../libsvn_client/info.c:310 ../libsvn_client/list.c:376
+#: ../libsvn_client/info.c:398 ../libsvn_client/list.c:272
+#: ../svnbench/null-info-cmd.c:148
#, c-format
msgid "URL '%s' non-existent in revision %ld"
msgstr ""
-#: ../libsvn_client/locking_commands.c:266
-#: ../libsvn_client/locking_commands.c:292
+#: ../libsvn_client/locking_commands.c:273
msgid "No common parent found, unable to operate on disjoint arguments"
msgstr ""
-#: ../libsvn_client/locking_commands.c:325
+#: ../libsvn_client/locking_commands.c:382
#, c-format
msgid "The node '%s' is not a file"
msgstr ""
-#: ../libsvn_client/locking_commands.c:345
+#: ../libsvn_client/locking_commands.c:402
msgid "Unable to lock/unlock across multiple repositories"
msgstr ""
-#: ../libsvn_client/locking_commands.c:400
+#: ../libsvn_client/locking_commands.c:442
#, c-format
msgid "'%s' is not locked in this working copy"
msgstr ""
-#: ../libsvn_client/locking_commands.c:450
+#: ../libsvn_client/locking_commands.c:495
#, c-format
msgid "'%s' is not locked"
msgstr ""
-#: ../libsvn_client/locking_commands.c:483 ../libsvn_fs/fs-loader.c:1413
-#: ../libsvn_ra/ra_loader.c:1074
+#: ../libsvn_client/locking_commands.c:529 ../libsvn_fs/fs-loader.c:1641
+#: ../libsvn_ra/ra_loader.c:1058
msgid "Lock comment contains illegal characters"
msgstr ""
-#: ../libsvn_client/log.c:309
+#: ../libsvn_client/log.c:134 ../libsvn_client/ra.c:532
+#: ../libsvn_client/ra.c:867
+#, c-format
+msgid "'%s' has no URL"
+msgstr ""
+
+#: ../libsvn_client/log.c:347
msgid "No valid target found"
msgstr ""
-#: ../libsvn_client/log.c:340
+#: ../libsvn_client/log.c:378
#, c-format
msgid "'%s' is not a relative path"
msgstr ""
-#: ../libsvn_client/log.c:366
+#: ../libsvn_client/log.c:404
msgid "When specifying working copy paths, only one target may be given"
msgstr ""
-#: ../libsvn_client/log.c:390 ../libsvn_client/revisions.c:189
+#: ../libsvn_client/log.c:428 ../libsvn_client/revisions.c:190
msgid "PREV, BASE, or COMMITTED revision keywords are invalid for URL"
msgstr ""
-#: ../libsvn_client/log.c:523 ../libsvn_client/log.c:832
+#: ../libsvn_client/log.c:561 ../libsvn_client/log.c:870
msgid "Missing required revision specification"
msgstr ""
-#: ../libsvn_client/merge.c:443
+#: ../libsvn_client/merge.c:442
#, c-format
msgid "URL '%s' of '%s' is not in repository '%s'"
msgstr ""
-#: ../libsvn_client/merge.c:480
+#: ../libsvn_client/merge.c:479
#, c-format
msgid "'%s' must be from the same repository as '%s'"
msgstr ""
@@ -1919,28 +2143,28 @@ msgstr ""
#. xgettext: the '.working', '.merge-left.r%ld' and
#. '.merge-right.r%ld' strings are used to tag onto a file
#. name in case of a merge conflict
-#: ../libsvn_client/merge.c:2052
+#: ../libsvn_client/merge.c:2137
#, c-format
msgid ".working%s%s"
msgstr ""
-#: ../libsvn_client/merge.c:2055
+#: ../libsvn_client/merge.c:2140
#, c-format
msgid ".merge-left.r%ld%s%s"
msgstr ""
-#: ../libsvn_client/merge.c:2059
+#: ../libsvn_client/merge.c:2144
#, c-format
msgid ".merge-right.r%ld%s%s"
msgstr ""
-#: ../libsvn_client/merge.c:4722
+#: ../libsvn_client/merge.c:4846
msgid ""
"Cannot reverse-merge a range from a path's own future history; try updating "
"first"
msgstr ""
-#: ../libsvn_client/merge.c:5457
+#: ../libsvn_client/merge.c:5581
#, c-format
msgid ""
"One or more conflicts were produced while merging r%ld:%ld into\n"
@@ -1949,83 +2173,87 @@ msgid ""
"unmerged revisions"
msgstr ""
-#: ../libsvn_client/merge.c:6272
+#: ../libsvn_client/merge.c:6397
#, c-format
msgid "Invalid mergeinfo detected on '%s', merge tracking not possible"
msgstr ""
-#: ../libsvn_client/merge.c:6421
+#: ../libsvn_client/merge.c:6551
msgid ""
"Merge tracking not allowed with missing subtrees; try restoring these items "
"first:\n"
msgstr ""
-#: ../libsvn_client/merge.c:7421
+#: ../libsvn_client/merge.c:7553
#, c-format
msgid ""
"Invalid mergeinfo detected on merge target '%s', merge tracking not possible"
msgstr ""
-#: ../libsvn_client/merge.c:9740
+#: ../libsvn_client/merge.c:9871
msgid "Use of two URLs is not compatible with mergeinfo modification"
msgstr ""
-#: ../libsvn_client/merge.c:9747 ../libsvn_client/merge.c:10082
+#: ../libsvn_client/merge.c:9878 ../libsvn_client/merge.c:10213
msgid ""
"Merge from foreign repository is not compatible with mergeinfo modification"
msgstr ""
-#: ../libsvn_client/merge.c:10175 ../libsvn_client/merge.c:10318
+#: ../libsvn_client/merge.c:10306 ../libsvn_client/merge.c:10449
#, c-format
msgid "Merge target '%s' does not exist in the working copy"
msgstr ""
-#: ../libsvn_client/merge.c:10198
+#: ../libsvn_client/merge.c:10329
msgid "Cannot determine revision of working copy"
msgstr ""
-#: ../libsvn_client/merge.c:10204
+#: ../libsvn_client/merge.c:10335
#, c-format
msgid ""
"Cannot merge into mixed-revision working copy [%ld:%ld]; try updating first"
msgstr ""
-#: ../libsvn_client/merge.c:10219
+#: ../libsvn_client/merge.c:10350
msgid "Cannot merge into a working copy with a switched subtree"
msgstr ""
-#: ../libsvn_client/merge.c:10235
+#: ../libsvn_client/merge.c:10366
msgid "Cannot merge into a working copy that has local modifications"
msgstr ""
-#: ../libsvn_client/merge.c:10255 ../svn/merge-cmd.c:60
+#: ../libsvn_client/merge.c:10386 ../svn/merge-cmd.c:56
#, c-format
msgid ""
"Invalid merge source '%s'; a working copy path can only be used with a "
"repository revision (a number, a date, or head)"
msgstr ""
-#: ../libsvn_client/merge.c:10573 ../svn/merge-cmd.c:127
+#: ../libsvn_client/merge.c:10704 ../svn/merge-cmd.c:123
msgid "Merge sources must both be either paths or URLs"
msgstr ""
-#: ../libsvn_client/merge.c:11334 ../libsvn_client/merge.c:11496
-#: ../libsvn_client/merge.c:12383
+#: ../libsvn_client/merge.c:11473 ../libsvn_client/merge.c:11635
+#: ../libsvn_client/merge.c:12538
#, c-format
msgid "'%s@%ld' must be ancestrally related to '%s@%ld'"
msgstr ""
-#: ../libsvn_client/merge.c:11446
+#: ../libsvn_client/merge.c:11585
#, c-format
msgid ""
"Neither the reintegrate source nor target can be the root of the repository"
msgstr ""
-#: ../libsvn_client/merge.c:11456
+#: ../libsvn_client/merge.c:11595
msgid "Reintegrate merge not possible"
msgstr ""
-#: ../libsvn_client/merge.c:11529
+#: ../libsvn_client/merge.c:11665
+msgid " Missing ranges: "
+msgstr ""
+
+#: ../libsvn_client/merge.c:11668
#, c-format
msgid ""
"Reintegrate can only be used if revisions %ld through %ld were previously "
@@ -2033,160 +2261,257 @@ msgid ""
"%s"
msgstr ""
-#: ../libsvn_client/merge.c:11591
+#: ../libsvn_client/merge.c:11727
#, c-format
msgid ""
"Can't reintegrate into '%s' because it is locally added and therefore not "
"related to the merge source"
msgstr ""
-#: ../libsvn_client/merge.c:11859
+#: ../libsvn_client/merge.c:12000
msgid "Cannot merge automatically while ignoring mergeinfo"
msgstr ""
-#: ../libsvn_client/merge.c:12599
+#: ../libsvn_client/merge.c:12668
+#, c-format
+msgid ""
+"Can't perform automatic merge into '%s' because it is locally added and "
+"therefore not related to the merge source"
+msgstr ""
+
+#: ../libsvn_client/merge.c:12767
msgid ""
"The required merge is reintegrate-like, and the record-only option cannot be "
"used with this kind of merge"
msgstr ""
-#: ../libsvn_client/merge.c:12605
+#: ../libsvn_client/merge.c:12773
msgid ""
"The required merge is reintegrate-like, and the depth option cannot be used "
"with this kind of merge"
msgstr ""
-#: ../libsvn_client/merge.c:12611
+#: ../libsvn_client/merge.c:12779
msgid ""
"The required merge is reintegrate-like, and the force_delete option cannot "
"be used with this kind of merge"
msgstr ""
-#: ../libsvn_client/mergeinfo.c:1718
+#: ../libsvn_client/mergeinfo.c:1715
msgid "Only depths 'infinity' and 'empty' are currently supported"
msgstr ""
-#: ../libsvn_client/patch.c:279
+#: ../libsvn_client/mtcc.c:166
#, c-format
-msgid "Cannot strip %u components from '%s'"
+msgid "Can't operate on '%s' because '%s' is not a directory"
msgstr ""
-#: ../libsvn_client/patch.c:910
-msgid "Invalid link representation"
+#: ../libsvn_client/mtcc.c:319
+#, c-format
+msgid "No origin found for node at '%s'"
msgstr ""
-#: ../libsvn_client/patch.c:3059
-msgid "strip count must be positive"
+#: ../libsvn_client/mtcc.c:359 ../libsvn_repos/commit.c:402
+#, c-format
+msgid "No such revision %ld (HEAD is %ld)"
msgstr ""
-#: ../libsvn_client/patch.c:3075 ../libsvn_fs_base/tree.c:3978
-#: ../libsvn_fs_base/tree.c:3983 ../libsvn_fs_fs/tree.c:2943
-#: ../libsvn_fs_fs/tree.c:2948 ../libsvn_ra/compat.c:675
-#: ../libsvn_ra_local/ra_plugin.c:1145
+#: ../libsvn_client/mtcc.c:407
#, c-format
-msgid "'%s' is not a file"
+msgid "'%s' is not an ancestor of '%s'"
msgstr ""
-#: ../libsvn_client/patch.c:3087 ../libsvn_wc/util.c:59
+#: ../libsvn_client/mtcc.c:506
#, c-format
-msgid "'%s' is not a directory"
+msgid "Can't add file at '%s'"
msgstr ""
-#: ../libsvn_client/prop_commands.c:60
+#: ../libsvn_client/mtcc.c:538 ../libsvn_client/ra.c:708
+#: ../libsvn_fs_base/lock.c:274 ../libsvn_fs_fs/fs_fs.c:1367
+#: ../libsvn_fs_fs/lock.c:759 ../libsvn_fs_fs/rev_file.c:177
+#: ../libsvn_fs_fs/rev_file.c:189 ../libsvn_fs_x/fs_x.c:690
+#: ../libsvn_fs_x/lock.c:799 ../libsvn_fs_x/rev_file.c:190
+#: ../libsvn_repos/log.c:2357 ../libsvn_repos/log.c:2361
#, c-format
-msgid "'%s' is a wcprop, thus not accessible to clients"
+msgid "No such revision %ld"
msgstr ""
-#: ../libsvn_client/prop_commands.c:155
+#: ../libsvn_client/mtcc.c:560
#, c-format
-msgid "Property '%s' is not a regular property"
+msgid "Can't add node at '%s'"
msgstr ""
-#: ../libsvn_client/prop_commands.c:266
+#: ../libsvn_client/mtcc.c:587
#, c-format
-msgid "Revision property '%s' not allowed in this context"
+msgid "Can't delete node at '%s' as it does not exist"
msgstr ""
-#: ../libsvn_client/prop_commands.c:273 ../libsvn_client/prop_commands.c:468
+#: ../libsvn_client/mtcc.c:604
+#, c-format
+msgid "Can't delete node at '%s'"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:641
+#, c-format
+msgid "Can't create directory at '%s'"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:779 ../libsvn_client/prop_commands.c:282
+#: ../libsvn_client/prop_commands.c:477
#, c-format
msgid "Bad property name: '%s'"
msgstr ""
-#: ../libsvn_client/prop_commands.c:301
+#: ../libsvn_client/mtcc.c:783 ../libsvn_client/prop_commands.c:275
+#, c-format
+msgid "Revision property '%s' not allowed in this context"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:788 ../libsvn_client/prop_commands.c:60
+#, c-format
+msgid "'%s' is a wcprop, thus not accessible to clients"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:798
+msgid "Error normalizing property value"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:833 ../libsvn_client/mtcc.c:856
+#, c-format
+msgid "Can't set properties at not existing '%s'"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:904
+#, c-format
+msgid "Can't update '%s' because it is not a file"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:915
+#, c-format
+msgid "Can't update file at '%s'"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:980
+#, c-format
+msgid "Can't perform file operation on '%s' as it is not a file"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:990
+#, c-format
+msgid "Can't perform directory operation on '%s' as it is not a directory"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:997
+#, c-format
+msgid "Can't open '%s' as it does not exist"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:1389
+#, c-format
+msgid "Can't commit to '%s' because it is not a directory"
+msgstr ""
+
+#: ../libsvn_client/patch.c:281
+#, c-format
+msgid "Cannot strip %u components from '%s'"
+msgstr ""
+
+#: ../libsvn_client/patch.c:917
+msgid "Invalid link representation"
+msgstr ""
+
+#: ../libsvn_client/patch.c:3231
+msgid "strip count must be positive"
+msgstr ""
+
+#: ../libsvn_client/patch.c:3247 ../libsvn_fs_base/tree.c:4099
+#: ../libsvn_fs_base/tree.c:4104 ../libsvn_fs_fs/tree.c:3198
+#: ../libsvn_fs_fs/tree.c:3203 ../libsvn_fs_x/tree.c:3244
+#: ../libsvn_fs_x/tree.c:3249 ../libsvn_ra/compat.c:677
+#: ../libsvn_ra_local/ra_plugin.c:1266
+#, c-format
+msgid "'%s' is not a file"
+msgstr ""
+
+#: ../libsvn_client/patch.c:3259 ../libsvn_wc/util.c:59
+#, c-format
+msgid "'%s' is not a directory"
+msgstr ""
+
+#: ../libsvn_client/prop_commands.c:155
+#, c-format
+msgid "Property '%s' is not a regular property"
+msgstr ""
+
+#: ../libsvn_client/prop_commands.c:310
msgid "Targets must be working copy paths"
msgstr ""
-#: ../libsvn_client/prop_commands.c:362
+#: ../libsvn_client/prop_commands.c:371
msgid "Targets must be URLs"
msgstr ""
-#: ../libsvn_client/prop_commands.c:372
+#: ../libsvn_client/prop_commands.c:381
msgid "Setting property on non-local targets needs a base revision"
msgstr ""
-#: ../libsvn_client/prop_commands.c:387
+#: ../libsvn_client/prop_commands.c:396
#, c-format
msgid "Setting property '%s' on non-local targets is not supported"
msgstr ""
-#: ../libsvn_client/prop_commands.c:415
+#: ../libsvn_client/prop_commands.c:424
#, c-format
msgid ""
"revprop '%s' in r%ld is unexpectedly absent in repository (maybe someone "
"else deleted it?)"
msgstr ""
-#: ../libsvn_client/prop_commands.c:424
+#: ../libsvn_client/prop_commands.c:433
#, c-format
msgid ""
"revprop '%s' in r%ld has unexpected value in repository (maybe someone else "
"changed it?)"
msgstr ""
-#: ../libsvn_client/prop_commands.c:432
+#: ../libsvn_client/prop_commands.c:441
#, c-format
msgid ""
"revprop '%s' in r%ld is unexpectedly present in repository (maybe someone "
"else set it?)"
msgstr ""
-#: ../libsvn_client/prop_commands.c:463
+#: ../libsvn_client/prop_commands.c:472
msgid ""
"Author name should not contain a newline; value will not be set unless forced"
msgstr ""
-#: ../libsvn_client/prop_commands.c:577
+#: ../libsvn_client/prop_commands.c:565
#, c-format
msgid "'%s' does not exist in revision %ld"
msgstr ""
-#: ../libsvn_client/prop_commands.c:583 ../libsvn_client/prop_commands.c:1102
-#: ../libsvn_wc/crop.c:168
+#: ../libsvn_client/prop_commands.c:571 ../libsvn_client/prop_commands.c:1081
#, c-format
msgid "Unknown node kind for '%s'"
msgstr ""
-#: ../libsvn_client/ra.c:161
+#: ../libsvn_client/ra.c:164
#, c-format
msgid "Attempt to set wcprop '%s' on '%s' in a non-commit operation"
msgstr ""
-#: ../libsvn_client/ra.c:415
+#: ../libsvn_client/ra.c:446
#, c-format
msgid "Redirect cycle detected for URL '%s'"
msgstr ""
-#: ../libsvn_client/ra.c:501 ../libsvn_client/ra.c:812
-#, c-format
-msgid "'%s' has no URL"
-msgstr ""
-
-#: ../libsvn_client/ra.c:679 ../libsvn_ra/compat.c:395
+#: ../libsvn_client/ra.c:734 ../libsvn_ra/compat.c:397
#, c-format
msgid "Unable to find repository location for '%s' in revision %ld"
msgstr ""
-#: ../libsvn_client/ra.c:691
+#: ../libsvn_client/ra.c:746
#, c-format
msgid ""
"The location for '%s' for revision %ld does not exist in the repository or "
@@ -2203,29 +2528,29 @@ msgstr ""
msgid "The repository at '%s' has uuid '%s', but the WC has '%s'"
msgstr ""
-#: ../libsvn_client/repos_diff.c:931 ../libsvn_wc/externals.c:570
+#: ../libsvn_client/repos_diff.c:935 ../libsvn_wc/externals.c:627
#, c-format
msgid "Base checksum mismatch for '%s'"
msgstr ""
-#: ../libsvn_client/revisions.c:113 ../libsvn_client/revisions.c:138
+#: ../libsvn_client/revisions.c:114 ../libsvn_client/revisions.c:139
#, c-format
msgid "Path '%s' has no committed revision"
msgstr ""
-#: ../libsvn_client/revisions.c:166
+#: ../libsvn_client/revisions.c:167
#, c-format
msgid "Unrecognized revision type requested for '%s'"
msgstr ""
-#: ../libsvn_client/status.c:407 ../libsvn_client/status.c:586
+#: ../libsvn_client/status.c:422 ../libsvn_client/status.c:601
#: ../libsvn_wc/lock.c:564 ../libsvn_wc/lock.c:856 ../libsvn_wc/lock.c:1542
-#: ../libsvn_wc/wc_db.c:13328 ../libsvn_wc/wc_db_wcroot.c:680
+#: ../libsvn_wc/wc_db.c:13681 ../libsvn_wc/wc_db_wcroot.c:722
#, c-format
msgid "'%s' is not a working copy"
msgstr ""
-#: ../libsvn_client/status.c:454
+#: ../libsvn_client/status.c:469
#, c-format
msgid "Entry '%s' has no URL"
msgstr ""
@@ -2246,7 +2571,7 @@ msgid "Directory '%s' has no URL"
msgstr ""
#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:236
-#: ../libsvn_ra_local/ra_plugin.c:326 ../libsvn_wc/update_editor.c:4868
+#: ../libsvn_ra_local/ra_plugin.c:326 ../libsvn_wc/update_editor.c:4921
#, c-format
msgid ""
"'%s'\n"
@@ -2254,246 +2579,245 @@ msgid ""
"'%s'"
msgstr ""
-#: ../libsvn_client/switch.c:242
+#: ../libsvn_client/switch.c:240
#, c-format
msgid "'%s' shares no common ancestry with '%s'"
msgstr ""
-#: ../libsvn_client/util.c:336
-#, c-format
-msgid "Cannot mix repository and working copy targets"
-msgstr ""
-
-#: ../libsvn_delta/svndiff.c:175
-msgid "Compression of svndiff data failed"
-msgstr ""
-
-#: ../libsvn_delta/svndiff.c:538
-msgid "Decompression of svndiff data failed: no size"
-msgstr ""
-
-#: ../libsvn_delta/svndiff.c:541
-msgid "Decompression of svndiff data failed: size too large"
-msgstr ""
-
-#: ../libsvn_delta/svndiff.c:565
-msgid "Decompression of svndiff data failed"
+#: ../libsvn_client/update.c:762
+msgid "None of the targets are working copies"
msgstr ""
-#: ../libsvn_delta/svndiff.c:572
-msgid "Size of uncompressed data does not match stored original length"
+#: ../libsvn_client/util.c:342
+#, c-format
+msgid "Cannot mix repository and working copy targets"
msgstr ""
-#: ../libsvn_delta/svndiff.c:648
+#: ../libsvn_delta/svndiff.c:436
#, c-format
msgid "Invalid diff stream: insn %d cannot be decoded"
msgstr ""
-#: ../libsvn_delta/svndiff.c:652
+#: ../libsvn_delta/svndiff.c:440
#, c-format
msgid "Invalid diff stream: insn %d has length zero"
msgstr ""
-#: ../libsvn_delta/svndiff.c:656
+#: ../libsvn_delta/svndiff.c:444
#, c-format
msgid "Invalid diff stream: insn %d overflows the target view"
msgstr ""
-#: ../libsvn_delta/svndiff.c:665
+#: ../libsvn_delta/svndiff.c:453
#, c-format
msgid "Invalid diff stream: [src] insn %d overflows the source view"
msgstr ""
-#: ../libsvn_delta/svndiff.c:672
+#: ../libsvn_delta/svndiff.c:460
#, c-format
msgid ""
"Invalid diff stream: [tgt] insn %d starts beyond the target view position"
msgstr ""
-#: ../libsvn_delta/svndiff.c:679
+#: ../libsvn_delta/svndiff.c:467
#, c-format
msgid "Invalid diff stream: [new] insn %d overflows the new data section"
msgstr ""
-#: ../libsvn_delta/svndiff.c:689
+#: ../libsvn_delta/svndiff.c:477
msgid "Delta does not fill the target window"
msgstr ""
-#: ../libsvn_delta/svndiff.c:692
+#: ../libsvn_delta/svndiff.c:480
msgid "Delta does not contain enough new data"
msgstr ""
-#: ../libsvn_delta/svndiff.c:801
+#: ../libsvn_delta/svndiff.c:608
msgid "Svndiff has invalid header"
msgstr ""
-#: ../libsvn_delta/svndiff.c:857 ../libsvn_delta/svndiff.c:1039
+#: ../libsvn_delta/svndiff.c:664 ../libsvn_delta/svndiff.c:861
msgid "Svndiff contains a too-large window"
msgstr ""
-#: ../libsvn_delta/svndiff.c:864 ../libsvn_delta/svndiff.c:1046
+#: ../libsvn_delta/svndiff.c:671 ../libsvn_delta/svndiff.c:868
msgid "Svndiff contains corrupt window header"
msgstr ""
-#: ../libsvn_delta/svndiff.c:873
+#: ../libsvn_delta/svndiff.c:680
msgid "Svndiff has backwards-sliding source views"
msgstr ""
-#: ../libsvn_delta/svndiff.c:930 ../libsvn_delta/svndiff.c:987
-#: ../libsvn_delta/svndiff.c:1068
+#: ../libsvn_delta/svndiff.c:720
+msgid "Svndiff contains a too-large window header"
+msgstr ""
+
+#: ../libsvn_delta/svndiff.c:745 ../libsvn_delta/svndiff.c:802
+#: ../libsvn_delta/svndiff.c:890
msgid "Unexpected end of svndiff input"
msgstr ""
-#: ../libsvn_diff/diff_file.c:184
+#: ../libsvn_diff/diff_file.c:186
#, c-format
msgid "File '%s' is too large to be read in to memory"
msgstr ""
-#: ../libsvn_diff/diff_file.c:1106
+#: ../libsvn_diff/diff_file.c:1104
#, c-format
msgid "The file '%s' changed unexpectedly during diff"
msgstr ""
-#: ../libsvn_diff/diff_file.c:1276
+#: ../libsvn_diff/diff_file.c:1278
msgid "Error in options to internal diff"
msgstr ""
-#: ../libsvn_diff/diff_file.c:1302
+#: ../libsvn_diff/diff_file.c:1307
#, c-format
msgid "Invalid argument '%s' in diff options"
msgstr ""
#. Order of date components can be different in different languages
-#: ../libsvn_diff/diff_file.c:1799
+#: ../libsvn_diff/diff_file.c:1806
msgid "%a %b %e %H:%M:%S %Y"
msgstr ""
-#: ../libsvn_diff/diff_file.c:1875 ../libsvn_diff/diff_file.c:1891
+#: ../libsvn_diff/diff_file.c:1887 ../libsvn_diff/diff_file.c:1903
#, c-format
msgid "Path '%s' must be inside the directory '%s'"
msgstr ""
-#: ../libsvn_diff/diff_file.c:2409
+#: ../libsvn_diff/diff_file.c:2449
#, c-format
msgid "Failed to delete mmap '%s'"
msgstr ""
-#: ../libsvn_diff/util.c:464
+#: ../libsvn_diff/util.c:477
#, c-format
msgid " Reverse-merged %s:r%s%s"
msgstr ""
-#: ../libsvn_diff/util.c:481
+#: ../libsvn_diff/util.c:494
#, c-format
msgid " Merged %s:r%s%s"
msgstr ""
-#: ../libsvn_fs/editor.c:219
+#: ../libsvn_fs/editor.c:217
#, c-format
msgid "Revision for modifying '%s' is required"
msgstr ""
-#: ../libsvn_fs/editor.c:228
+#: ../libsvn_fs/editor.c:226
#, c-format
msgid "'%s' is out of date; try updating"
msgstr ""
-#: ../libsvn_fs/editor.c:265
+#: ../libsvn_fs/editor.c:258
#, c-format
msgid "'%s' has been modified since the commit began (restart the commit)"
msgstr ""
-#: ../libsvn_fs/editor.c:323
+#: ../libsvn_fs/editor.c:316
#, c-format
msgid "'%s' already exists, so may be out of date; try updating"
msgstr ""
-#: ../libsvn_fs/editor.c:456
+#: ../libsvn_fs/editor.c:449
msgid "The filesystem does not support 'absent' nodes"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:121
+#: ../libsvn_fs/fs-loader.c:140
#, c-format
msgid "Invalid name for FS type '%s'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:138 ../libsvn_ra/ra_loader.c:161
-#: ../libsvn_ra/ra_loader.c:174
+#: ../libsvn_fs/fs-loader.c:157 ../libsvn_ra/ra_loader.c:163
+#: ../libsvn_ra/ra_loader.c:176
#, c-format
msgid "'%s' does not define '%s()'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:164
+#: ../libsvn_fs/fs-loader.c:190
#, c-format
msgid "Failed to load module for FS type '%s'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:186
+#: ../libsvn_fs/fs-loader.c:211
#, c-format
msgid ""
"Mismatched FS module version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:266
+#: ../libsvn_fs/fs-loader.c:301
#, c-format
msgid "Unknown FS type '%s'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:389
+#: ../libsvn_fs/fs-loader.c:450
#, c-format
msgid "Path '%s' is not in UTF-8"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:397
+#: ../libsvn_fs/fs-loader.c:458
#, c-format
msgid "Path '%s' contains '.' or '..' element"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:554 ../libsvn_repos/repos.c:1982
+#: ../libsvn_fs/fs-loader.c:470 ../libsvn_fs_fs/tree.c:2426
+#: ../libsvn_subr/path.c:1229
+#, c-format
+msgid "Invalid control character '0x%02x' in path '%s'"
+msgstr ""
+
+#: ../libsvn_fs/fs-loader.c:655 ../libsvn_repos/repos.c:1981
msgid "Hotcopy source and destination are equal"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:564
+#: ../libsvn_fs/fs-loader.c:665
#, c-format
msgid "'%s' already exists and is a file"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:569
+#: ../libsvn_fs/fs-loader.c:670
#, c-format
msgid "'%s' already exists and has an unknown node kind"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:587
+#: ../libsvn_fs/fs-loader.c:688
#, c-format
msgid ""
"The filesystem type of the hotcopy source ('%s') does not match the "
"filesystem type of the hotcopy destination ('%s')"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:1395
+#: ../libsvn_fs/fs-loader.c:959 ../libsvn_fs/fs-loader.c:977
+#, c-format
+msgid "Attempt to modify internal transaction property '%s'"
+msgstr ""
+
+#: ../libsvn_fs/fs-loader.c:1616
#, c-format
msgid "Malformed UUID '%s'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:1423
+#: ../libsvn_fs/fs-loader.c:1645
+msgid "Negative expiration date passed to svn_fs_lock"
+msgstr ""
+
+#: ../libsvn_fs/fs-loader.c:1660
#, c-format
msgid "Lock token URI '%s' has bad scheme; expected '%s'"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:1430
+#: ../libsvn_fs/fs-loader.c:1669
#, c-format
-msgid "Lock token '%s' is not ASCII at byte %u"
+msgid "Lock token '%s' is not ASCII or is a control character at byte %u"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:1437
+#: ../libsvn_fs/fs-loader.c:1677
#, c-format
msgid "Lock token URI '%s' is not XML-safe"
msgstr ""
-#: ../libsvn_fs/fs-loader.c:1444
-msgid "Negative expiration date passed to svn_fs_lock"
-msgstr ""
-
#: ../libsvn_fs_base/bdb/bdb-err.c:104
#, c-format
msgid "Berkeley DB error for filesystem '%s' while %s:\n"
@@ -2507,40 +2831,44 @@ msgstr ""
msgid "deleting changes"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:150 ../libsvn_fs_fs/fs_fs.c:5911
+#: ../libsvn_fs_base/bdb/changes-table.c:170 ../libsvn_fs_fs/transaction.c:665
+#: ../libsvn_fs_x/transaction.c:941
msgid "Missing required node revision ID"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:161 ../libsvn_fs_fs/fs_fs.c:5921
+#: ../libsvn_fs_base/bdb/changes-table.c:181 ../libsvn_fs_fs/transaction.c:675
+#: ../libsvn_fs_x/transaction.c:951
msgid "Invalid change ordering: new node revision ID without delete"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:171 ../libsvn_fs_fs/fs_fs.c:5932
+#: ../libsvn_fs_base/bdb/changes-table.c:191 ../libsvn_fs_fs/transaction.c:686
+#: ../libsvn_fs_x/transaction.c:962
msgid "Invalid change ordering: non-add change on deleted path"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:180 ../libsvn_fs_fs/fs_fs.c:5941
+#: ../libsvn_fs_base/bdb/changes-table.c:200 ../libsvn_fs_fs/transaction.c:695
+#: ../libsvn_fs_x/transaction.c:971
msgid "Invalid change ordering: add change on preexisting path"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:272
-#: ../libsvn_fs_base/bdb/changes-table.c:395
+#: ../libsvn_fs_base/bdb/changes-table.c:296
+#: ../libsvn_fs_base/bdb/changes-table.c:420
msgid "creating cursor for reading changes"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:297
-#: ../libsvn_fs_base/bdb/changes-table.c:416
+#: ../libsvn_fs_base/bdb/changes-table.c:321
+#: ../libsvn_fs_base/bdb/changes-table.c:441
#, c-format
msgid "Error reading changes for key '%s'"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:356
-#: ../libsvn_fs_base/bdb/changes-table.c:439
+#: ../libsvn_fs_base/bdb/changes-table.c:381
+#: ../libsvn_fs_base/bdb/changes-table.c:464
msgid "fetching changes"
msgstr ""
-#: ../libsvn_fs_base/bdb/changes-table.c:369
-#: ../libsvn_fs_base/bdb/changes-table.c:452
+#: ../libsvn_fs_base/bdb/changes-table.c:394
+#: ../libsvn_fs_base/bdb/changes-table.c:477
msgid "closing changes cursor"
msgstr ""
@@ -2680,8 +3008,7 @@ msgstr ""
msgid "storing node revision"
msgstr ""
-#: ../libsvn_fs_base/bdb/reps-table.c:98
-#: ../libsvn_fs_base/bdb/reps-table.c:200
+#: ../libsvn_fs_base/bdb/reps-table.c:98 ../libsvn_fs_base/bdb/reps-table.c:200
#, c-format
msgid "No such representation '%s'"
msgstr ""
@@ -2866,17 +3193,19 @@ msgstr ""
msgid "Attempted to get entries of a non-directory node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:372
+#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:377
+#: ../libsvn_fs_x/dag.c:448
#, c-format
msgid "Attempted to create a node with an illegal name '%s'"
msgstr ""
-#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:378
+#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:383
+#: ../libsvn_fs_x/dag.c:454
msgid "Attempted to create entry in non-directory parent"
msgstr ""
#: ../libsvn_fs_base/dag.c:473 ../libsvn_fs_base/dag.c:737
-#: ../libsvn_fs_fs/dag.c:384
+#: ../libsvn_fs_fs/dag.c:389 ../libsvn_fs_x/dag.c:460
#, c-format
msgid "Attempted to clone child of non-mutable node"
msgstr ""
@@ -2886,11 +3215,13 @@ msgstr ""
msgid "Attempted to create entry that already exists"
msgstr ""
-#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:462
+#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_x/dag.c:523
msgid "Attempted to set entry in non-directory node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:474
+#: ../libsvn_fs_x/dag.c:529
msgid "Attempted to set entry in immutable node"
msgstr ""
@@ -2929,57 +3260,57 @@ msgstr ""
msgid "Attempted removal of immutable node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1088
+#: ../libsvn_fs_base/dag.c:1090
#, c-format
msgid "Attempted to get textual contents of a *non*-file node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1121
+#: ../libsvn_fs_base/dag.c:1123
#, c-format
msgid "Attempted to get length of a *non*-file node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1148
+#: ../libsvn_fs_base/dag.c:1150
#, c-format
msgid "Attempted to get checksum of a *non*-file node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1187 ../libsvn_fs_base/dag.c:1244
+#: ../libsvn_fs_base/dag.c:1189 ../libsvn_fs_base/dag.c:1246
#, c-format
msgid "Attempted to set textual contents of a *non*-file node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1193 ../libsvn_fs_base/dag.c:1250
+#: ../libsvn_fs_base/dag.c:1195 ../libsvn_fs_base/dag.c:1252
#, c-format
msgid "Attempted to set textual contents of an immutable node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1279 ../libsvn_fs_base/reps-strings.c:829
+#: ../libsvn_fs_base/dag.c:1281 ../libsvn_fs_base/reps-strings.c:829
#, c-format
msgid "Checksum mismatch on representation '%s'"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1373
+#: ../libsvn_fs_base/dag.c:1375
#, c-format
msgid "Attempted to open non-existent child node '%s'"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1379
+#: ../libsvn_fs_base/dag.c:1381
#, c-format
msgid "Attempted to open node with an illegal name '%s'"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1700
+#: ../libsvn_fs_base/dag.c:1713
#, c-format
msgid "Attempted merge tracking info change on immutable node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1740
+#: ../libsvn_fs_base/dag.c:1753
#, c-format
msgid "Attempted mergeinfo count change on immutable node"
msgstr ""
-#: ../libsvn_fs_base/dag.c:1752
+#: ../libsvn_fs_base/dag.c:1765
#, c-format
msgid "Invalid value (%%%s) for node revision mergeinfo count"
msgstr ""
@@ -2989,7 +3320,8 @@ msgstr ""
msgid "Corrupt filesystem revision %ld in filesystem '%s'"
msgstr ""
-#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/fs_fs.c:2268
+#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/cached_data.c:276
+#: ../libsvn_fs_x/cached_data.c:275
#, c-format
msgid "Reference to non-existent node '%s' in filesystem '%s'"
msgstr ""
@@ -3049,153 +3381,153 @@ msgstr ""
msgid "No record in 'checksum-reps' table for checksum '%s' in filesystem '%s'"
msgstr ""
-#: ../libsvn_fs_base/fs.c:89
+#: ../libsvn_fs_base/fs.c:87
#, c-format
msgid "Bad database version: got %d.%d.%d, should be at least %d.%d.%d"
msgstr ""
-#: ../libsvn_fs_base/fs.c:100
+#: ../libsvn_fs_base/fs.c:98
#, c-format
msgid "Bad database version: compiled with %d.%d.%d, running against %d.%d.%d"
msgstr ""
-#: ../libsvn_fs_base/fs.c:190
+#: ../libsvn_fs_base/fs.c:188
#, c-format
msgid "Berkeley DB error for filesystem '%s' while closing environment:\n"
msgstr ""
-#: ../libsvn_fs_base/fs.c:553
+#: ../libsvn_fs_base/fs.c:607
#, c-format
msgid "Berkeley DB error for filesystem '%s' while creating environment:\n"
msgstr ""
-#: ../libsvn_fs_base/fs.c:559
+#: ../libsvn_fs_base/fs.c:613
#, c-format
msgid "Berkeley DB error for filesystem '%s' while opening environment:\n"
msgstr ""
-#: ../libsvn_fs_base/fs.c:574
+#: ../libsvn_fs_base/fs.c:628
msgid "creating 'nodes' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:575
+#: ../libsvn_fs_base/fs.c:629
msgid "opening 'nodes' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:580
+#: ../libsvn_fs_base/fs.c:634
msgid "creating 'revisions' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:581
+#: ../libsvn_fs_base/fs.c:635
msgid "opening 'revisions' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:586
+#: ../libsvn_fs_base/fs.c:640
msgid "creating 'transactions' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:587
+#: ../libsvn_fs_base/fs.c:641
msgid "opening 'transactions' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:592
+#: ../libsvn_fs_base/fs.c:646
msgid "creating 'copies' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:593
+#: ../libsvn_fs_base/fs.c:647
msgid "opening 'copies' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:598
+#: ../libsvn_fs_base/fs.c:652
msgid "creating 'changes' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:599
+#: ../libsvn_fs_base/fs.c:653
msgid "opening 'changes' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:604
+#: ../libsvn_fs_base/fs.c:658
msgid "creating 'representations' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:605
+#: ../libsvn_fs_base/fs.c:659
msgid "opening 'representations' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:610
+#: ../libsvn_fs_base/fs.c:664
msgid "creating 'strings' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:611
+#: ../libsvn_fs_base/fs.c:665
msgid "opening 'strings' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:616
+#: ../libsvn_fs_base/fs.c:670
msgid "creating 'uuids' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:617
+#: ../libsvn_fs_base/fs.c:671
msgid "opening 'uuids' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:622
+#: ../libsvn_fs_base/fs.c:676
msgid "creating 'locks' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:623
+#: ../libsvn_fs_base/fs.c:677
msgid "opening 'locks' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:628
+#: ../libsvn_fs_base/fs.c:682
msgid "creating 'lock-tokens' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:629
+#: ../libsvn_fs_base/fs.c:683
msgid "opening 'lock-tokens' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:637
+#: ../libsvn_fs_base/fs.c:691
msgid "creating 'node-origins' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:638
+#: ../libsvn_fs_base/fs.c:692
msgid "opening 'node-origins' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:647
+#: ../libsvn_fs_base/fs.c:701
msgid "creating 'miscellaneous' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:648
+#: ../libsvn_fs_base/fs.c:702
msgid "opening 'miscellaneous' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:657
+#: ../libsvn_fs_base/fs.c:711
msgid "creating 'checksum-reps' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:658
+#: ../libsvn_fs_base/fs.c:712
msgid "opening 'checksum-reps' table"
msgstr ""
-#: ../libsvn_fs_base/fs.c:730
+#: ../libsvn_fs_base/fs.c:802
#, c-format
msgid ""
"The '%s' feature requires version %d of the filesystem schema; filesystem "
"'%s' uses only version %d"
msgstr ""
-#: ../libsvn_fs_base/fs.c:749
+#: ../libsvn_fs_base/fs.c:821
#, c-format
msgid "Expected FS format '%d'; found format '%d'"
msgstr ""
-#: ../libsvn_fs_base/fs.c:1215
+#: ../libsvn_fs_base/fs.c:1309
#, c-format
msgid "BDB repositories do not support incremental hotcopy"
msgstr ""
-#: ../libsvn_fs_base/fs.c:1319
+#: ../libsvn_fs_base/fs.c:1413
msgid ""
"Error copying logfile; the DB_LOG_AUTOREMOVE feature\n"
"may be interfering with the hotcopy algorithm. If\n"
@@ -3203,7 +3535,7 @@ msgid ""
"in DB_CONFIG"
msgstr ""
-#: ../libsvn_fs_base/fs.c:1338
+#: ../libsvn_fs_base/fs.c:1432
msgid ""
"Error running catastrophic recovery on hotcopy; the\n"
"DB_LOG_AUTOREMOVE feature may be interfering with the\n"
@@ -3211,33 +3543,37 @@ msgid ""
"this feature in DB_CONFIG"
msgstr ""
-#: ../libsvn_fs_base/fs.c:1383
+#: ../libsvn_fs_base/fs.c:1477
msgid "Module for working with a Berkeley DB repository."
msgstr ""
-#: ../libsvn_fs_base/fs.c:1430
+#: ../libsvn_fs_base/fs.c:1527
#, c-format
msgid "Unsupported FS loader version (%d) for bdb"
msgstr ""
-#: ../libsvn_fs_base/lock.c:108 ../libsvn_fs_base/lock.c:113
-#: ../libsvn_fs_fs/lock.c:786 ../libsvn_fs_fs/lock.c:791
-#: ../libsvn_fs_fs/lock.c:813
+#: ../libsvn_fs_base/lock.c:122 ../libsvn_fs_base/lock.c:127
+#: ../libsvn_fs_fs/lock.c:740 ../libsvn_fs_fs/lock.c:745
+#: ../libsvn_fs_fs/lock.c:775 ../libsvn_fs_x/lock.c:780
+#: ../libsvn_fs_x/lock.c:785 ../libsvn_fs_x/lock.c:815
#, c-format
msgid "Path '%s' doesn't exist in HEAD revision"
msgstr ""
-#: ../libsvn_fs_base/lock.c:540 ../libsvn_fs_fs/lock.c:682
+#: ../libsvn_fs_base/lock.c:616 ../libsvn_fs_fs/lock.c:613
+#: ../libsvn_fs_x/lock.c:680
#, c-format
msgid "Cannot verify lock on path '%s'; no username available"
msgstr ""
-#: ../libsvn_fs_base/lock.c:546 ../libsvn_fs_fs/lock.c:688
+#: ../libsvn_fs_base/lock.c:622 ../libsvn_fs_fs/lock.c:619
+#: ../libsvn_fs_x/lock.c:686
#, c-format
msgid "User '%s' does not own lock on path '%s' (currently locked by '%s')"
msgstr ""
-#: ../libsvn_fs_base/lock.c:552 ../libsvn_fs_fs/lock.c:694
+#: ../libsvn_fs_base/lock.c:628 ../libsvn_fs_fs/lock.c:625
+#: ../libsvn_fs_x/lock.c:692
#, c-format
msgid "Cannot verify lock on path '%s'; no matching lock-token available"
msgstr ""
@@ -3293,7 +3629,7 @@ msgstr ""
msgid "Null rep, but offset past zero already"
msgstr ""
-#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1253
+#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1254
#, c-format
msgid "Rep '%s' is not mutable"
msgstr ""
@@ -3303,16 +3639,16 @@ msgstr ""
msgid "Rep '%s' both mutable and non-fulltext"
msgstr ""
-#: ../libsvn_fs_base/reps-strings.c:1372
+#: ../libsvn_fs_base/reps-strings.c:1373
msgid "Failed to get new string key"
msgstr ""
-#: ../libsvn_fs_base/reps-strings.c:1449
+#: ../libsvn_fs_base/reps-strings.c:1450
#, c-format
msgid "Attempt to deltify '%s' against itself"
msgstr ""
-#: ../libsvn_fs_base/reps-strings.c:1522
+#: ../libsvn_fs_base/reps-strings.c:1523
#, c-format
msgid "Failed to calculate MD5 digest for '%s'"
msgstr ""
@@ -3327,12 +3663,13 @@ msgstr ""
msgid "Transaction is dead: '%s'"
msgstr ""
-#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:9775
+#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:2117
+#: ../libsvn_fs_x/fs_x.c:1153
#, c-format
msgid "revprop '%s' has unexpected value in filesystem"
msgstr ""
-#: ../libsvn_fs_base/revs-txns.c:1030
+#: ../libsvn_fs_base/revs-txns.c:1053
msgid "Transaction aborted, but cleanup failed"
msgstr ""
@@ -3348,724 +3685,1167 @@ msgstr ""
msgid "committing Berkeley DB transaction"
msgstr ""
-#: ../libsvn_fs_base/tree.c:772 ../libsvn_fs_fs/tree.c:949
+#: ../libsvn_fs_base/tree.c:773 ../libsvn_fs_fs/tree.c:1104
+#: ../libsvn_fs_x/tree.c:1090
#, c-format
msgid "Failure opening '%s'"
msgstr ""
-#: ../libsvn_fs_base/tree.c:1403 ../libsvn_fs_fs/tree.c:1393
+#: ../libsvn_fs_base/tree.c:1460 ../libsvn_fs_fs/tree.c:1643
+#: ../libsvn_fs_x/tree.c:1640
msgid "Cannot compare property value between two different filesystems"
msgstr ""
-#: ../libsvn_fs_base/tree.c:1849 ../libsvn_fs_base/tree.c:1919
+#: ../libsvn_fs_base/tree.c:1926 ../libsvn_fs_base/tree.c:1996
msgid "Corrupt DB: faulty predecessor count"
msgstr ""
-#: ../libsvn_fs_base/tree.c:1976
+#: ../libsvn_fs_base/tree.c:2053
#, c-format
msgid "Unexpected immutable node at '%s'"
msgstr ""
-#: ../libsvn_fs_base/tree.c:1997 ../libsvn_fs_fs/tree.c:1423
-#: ../libsvn_repos/commit.c:1262
+#: ../libsvn_fs_base/tree.c:2074 ../libsvn_fs_fs/tree.c:1673
+#: ../libsvn_fs_x/tree.c:1673 ../libsvn_repos/commit.c:1257
#, c-format
msgid "Conflict at '%s'"
msgstr ""
-#: ../libsvn_fs_base/tree.c:2050 ../libsvn_fs_base/tree.c:2802
-#: ../libsvn_fs_fs/tree.c:1474 ../libsvn_fs_fs/tree.c:2011
+#: ../libsvn_fs_base/tree.c:2127 ../libsvn_fs_base/tree.c:2879
+#: ../libsvn_fs_fs/tree.c:1771 ../libsvn_fs_fs/tree.c:2325
+#: ../libsvn_fs_x/tree.c:1797 ../libsvn_fs_x/tree.c:2340
msgid "Bad merge; ancestor, source, and target not all in same fs"
msgstr ""
-#: ../libsvn_fs_base/tree.c:2066 ../libsvn_fs_fs/tree.c:1490
+#: ../libsvn_fs_base/tree.c:2143 ../libsvn_fs_fs/tree.c:1787
+#: ../libsvn_fs_x/tree.c:1813
#, c-format
msgid "Bad merge; target '%s' has id '%s', same as ancestor"
msgstr ""
-#: ../libsvn_fs_base/tree.c:2610
+#: ../libsvn_fs_base/tree.c:2687
#, c-format
msgid "Transaction '%s' out-of-date with respect to revision '%s'"
msgstr ""
-#: ../libsvn_fs_base/tree.c:2886
+#: ../libsvn_fs_base/tree.c:2963
#, c-format
msgid "Cannot deltify revisions prior to r%ld"
msgstr ""
-#: ../libsvn_fs_base/tree.c:3004 ../libsvn_fs_fs/tree.c:2166
+#: ../libsvn_fs_base/tree.c:3081 ../libsvn_fs_fs/tree.c:2507
+#: ../libsvn_fs_x/tree.c:2527
msgid "The root directory cannot be deleted"
msgstr ""
-#: ../libsvn_fs_base/tree.c:3217 ../libsvn_fs_fs/tree.c:2236
+#: ../libsvn_fs_base/tree.c:3295 ../libsvn_fs_fs/tree.c:2577
+#: ../libsvn_fs_x/tree.c:2601
#, c-format
msgid "Cannot copy between two different filesystems ('%s' and '%s')"
msgstr ""
-#: ../libsvn_fs_base/tree.c:3226 ../libsvn_fs_fs/tree.c:2242
+#: ../libsvn_fs_base/tree.c:3304 ../libsvn_fs_fs/tree.c:2584
+#: ../libsvn_fs_x/tree.c:2608
msgid "Copy from mutable tree not currently supported"
msgstr ""
-#: ../libsvn_fs_base/tree.c:3736 ../libsvn_fs_fs/tree.c:2719
+#: ../libsvn_fs_base/tree.c:3814 ../libsvn_fs_fs/tree.c:2979
+#: ../libsvn_fs_x/tree.c:3016
#, c-format
msgid "Base checksum mismatch on '%s'"
msgstr ""
-#: ../libsvn_fs_base/tree.c:3969 ../libsvn_fs_fs/tree.c:2934
+#: ../libsvn_fs_base/tree.c:4090 ../libsvn_fs_fs/tree.c:3189
+#: ../libsvn_fs_x/tree.c:3235
msgid "Cannot compare file contents between two different filesystems"
msgstr ""
-#: ../libsvn_fs_base/tree.c:5013 ../libsvn_fs_base/tree.c:5188
+#: ../libsvn_fs_base/tree.c:5139 ../libsvn_fs_base/tree.c:5314
#, c-format
msgid "Node-revision '%s' claims to have mergeinfo but doesn't"
msgstr ""
-#: ../libsvn_fs_base/tree.c:5049
+#: ../libsvn_fs_base/tree.c:5175
#, c-format
msgid ""
"Node-revision '%s' claims to sit atop a tree containing mergeinfo but is not "
"a directory"
msgstr ""
-#: ../libsvn_fs_fs/dag.c:426 ../libsvn_fs_fs/dag.c:442
-#: ../libsvn_ra_serf/serf.c:1038 ../libsvn_ra_serf/serf.c:1101
+#: ../libsvn_fs_fs/cached_data.c:709 ../libsvn_fs_x/cached_data.c:582
+msgid "Malformed svndiff data in representation"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:956 ../libsvn_fs_x/cached_data.c:842
+#, c-format
+msgid "No representation found at offset %s for item %s in revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:1522 ../libsvn_fs_fs/cached_data.c:1535
+#: ../libsvn_fs_fs/cached_data.c:3071 ../libsvn_fs_x/cached_data.c:1424
+#: ../libsvn_fs_x/cached_data.c:1437 ../libsvn_fs_x/cached_data.c:1713
+msgid "Reading one svndiff window read beyond the end of the representation"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:1664 ../libsvn_fs_x/cached_data.c:1565
+msgid "svndiff window length is corrupt"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:2065 ../libsvn_fs_x/cached_data.c:2143
+msgid "Checksum mismatch while reading representation"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:2506 ../libsvn_fs_fs/cached_data.c:2520
+#: ../libsvn_fs_fs/cached_data.c:2527 ../libsvn_fs_x/cached_data.c:2508
+#: ../libsvn_fs_x/cached_data.c:2522 ../libsvn_fs_x/cached_data.c:2529
+#, c-format
+msgid "Directory entry corrupt in '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:2776
+#, c-format
+msgid "malformed property list for node-revision '%s' in '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:2809
+#, c-format
+msgid "malformed property list for node-revision '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/cached_data.c:3252
+#, c-format
+msgid ""
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s for item %s in revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/dag.c:431 ../libsvn_fs_fs/dag.c:448 ../libsvn_fs_x/dag.c:377
+#: ../libsvn_fs_x/dag.c:504 ../libsvn_ra_serf/stat.c:606
msgid "Can't get entries of non-directory"
msgstr ""
-#: ../libsvn_fs_fs/dag.c:551
+#: ../libsvn_fs_fs/dag.c:593 ../libsvn_fs_x/dag.c:613
#, c-format
msgid ""
"Can't increment mergeinfo count on node-revision %%s to negative value %%%s"
msgstr ""
-#: ../libsvn_fs_fs/dag.c:562
+#: ../libsvn_fs_fs/dag.c:604 ../libsvn_fs_x/dag.c:624
#, c-format
msgid ""
"Can't increment mergeinfo count on *file* node-revision %%s to %%%s (> 1)"
msgstr ""
-#: ../libsvn_fs_fs/dag.c:1134
+#: ../libsvn_fs_fs/dag.c:1193 ../libsvn_fs_x/dag.c:1165
msgid "Empty noderev in cache"
msgstr ""
-#: ../libsvn_fs_fs/dag.c:1326
+#: ../libsvn_fs_fs/dag.c:1421 ../libsvn_fs_x/dag.c:1357
#, c-format
msgid "Attempted to update ancestry of non-mutable node"
msgstr ""
-#: ../libsvn_fs_fs/fs.c:83
+#: ../libsvn_fs_fs/fs.c:101
#, c-format
msgid "Can't fetch FSFS shared data"
msgstr ""
-#: ../libsvn_fs_fs/fs.c:110
+#: ../libsvn_fs_fs/fs.c:130
#, c-format
msgid "Can't store FSFS shared data"
msgstr ""
-#: ../libsvn_fs_fs/fs.c:404
+#: ../libsvn_fs_fs/fs.c:548
msgid "Module for working with a plain file (FSFS) repository."
msgstr ""
-#: ../libsvn_fs_fs/fs.c:454
+#: ../libsvn_fs_fs/fs.c:610
#, c-format
msgid "Unsupported FS loader version (%d) for fsfs"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:727
+#: ../libsvn_fs_fs/fs_fs.c:444
#, c-format
-msgid "Can't unlock unknown transaction '%s'"
+msgid ""
+"Found format '%d', only created by unreleased dev builds; see http://"
+"subversion.apache.org/docs/release-notes/1.7#revprop-packing"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:731
+#: ../libsvn_fs_fs/fs_fs.c:455 ../libsvn_fs_x/fs_x.c:103
#, c-format
-msgid "Can't unlock nonlocked transaction '%s'"
+msgid "Expected FS format between '1' and '%d'; found format '%d'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:738
+#: ../libsvn_fs_fs/fs_fs.c:507 ../libsvn_fs_x/fs_x.c:128
#, c-format
-msgid "Can't unlock prototype revision lockfile for transaction '%s'"
+msgid "Can't read first line of format file '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:744
+#: ../libsvn_fs_fs/fs_fs.c:564 ../libsvn_fs_x/fs_x.c:150
#, c-format
-msgid "Can't close prototype revision lockfile for transaction '%s'"
+msgid "'%s' contains invalid filesystem format option '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:574
+#, c-format
+msgid "'%s' specifies logical addressing for a non-sharded repository"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:656 ../libsvn_fs_x/fs_x.c:209
+#, c-format
+msgid "%s is too small for fsfs.conf setting '%s'."
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:806
+#: ../libsvn_fs_fs/fs_fs.c:664 ../libsvn_fs_x/fs_x.c:217
+#, c-format
+msgid "%s is too large for fsfs.conf setting '%s'."
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:675 ../libsvn_fs_x/fs_x.c:228
#, c-format
msgid ""
-"Cannot write to the prototype revision file of transaction '%s' because a "
-"previous representation is currently being written by this process"
+"%s is invalid for fsfs.conf setting '%s' because it is not a power of 2."
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:842
+#: ../libsvn_fs_fs/fs_fs.c:1187
+#, c-format
+msgid "'%s' is not a regular file. Please move it out of the way and try again"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:1352 ../libsvn_fs_x/fs_x.c:675
+#, c-format
+msgid "Invalid revision number '%ld'"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:1811
+msgid "FSFS is not compatible with Subversion prior to 1.1"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:1948
+#, c-format
+msgid "malformed node origin data in '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/fs_fs.c:2016
#, c-format
msgid ""
-"Cannot write to the prototype revision file of transaction '%s' because a "
-"previous representation is currently being written by another process"
+"Node origin for '%s' exists with a different value (%s) than what we were "
+"about to store (%s)"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:849 ../libsvn_subr/io.c:2014
+#: ../libsvn_fs_fs/hotcopy.c:107 ../libsvn_fs_x/hotcopy.c:108
+#: ../libsvn_subr/io.c:293
#, c-format
-msgid "Can't get exclusive lock on file '%s'"
+msgid "Error converting entry in directory '%s' to UTF-8"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:968
+#: ../libsvn_fs_fs/hotcopy.c:147 ../libsvn_fs_x/hotcopy.c:148
+#: ../libsvn_subr/io.c:1086
#, c-format
-msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
+msgid "Source '%s' is not a directory"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:153 ../libsvn_fs_x/hotcopy.c:154
+#: ../libsvn_subr/io.c:1092
+#, c-format
+msgid "Destination '%s' is not a directory"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:226 ../libsvn_fs_x/hotcopy.c:228
+#: ../libsvn_subr/io.c:1169 ../libsvn_subr/io.c:2855
+#, c-format
+msgid "Can't read directory '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:995
+#: ../libsvn_fs_fs/hotcopy.c:231 ../libsvn_fs_x/hotcopy.c:233
+#: ../libsvn_subr/io.c:1174 ../libsvn_subr/io.c:2860 ../libsvn_subr/io.c:4579
+#, c-format
+msgid "Error closing directory '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:490
#, c-format
msgid ""
-"Found format '%d', only created by unreleased dev builds; see http://"
-"subversion.apache.org/docs/release-notes/1.7#revprop-packing"
+"The FSFS format (%d) of the hotcopy source does not match the FSFS format "
+"(%d) of the hotcopy destination; please upgrade both repositories to the "
+"same format"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:499 ../libsvn_fs_x/hotcopy.c:495
+msgid ""
+"The UUID of the hotcopy source does not match the UUID of the hotcopy "
+"destination"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1006
+#: ../libsvn_fs_fs/hotcopy.c:506 ../libsvn_fs_x/hotcopy.c:502
+msgid ""
+"The sharding layout configuration of the hotcopy source does not match the "
+"sharding layout configuration of the hotcopy destination"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:581 ../libsvn_fs_x/hotcopy.c:575
#, c-format
-msgid "Expected FS format between '1' and '%d'; found format '%d'"
+msgid ""
+"The hotcopy destination already contains more packed revisions (%lu) than "
+"the hotcopy source contains (%lu)"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1052
+#: ../libsvn_fs_fs/hotcopy.c:877
#, c-format
-msgid "Can't read first line of format file '%s'"
+msgid ""
+"Failed to create hotcopy at '%s'. The file '%s' is missing from the source "
+"repository. Please create this file, for instance by running 'svnadmin "
+"upgrade %s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1092
+#: ../libsvn_fs_fs/hotcopy.c:903 ../libsvn_fs_x/hotcopy.c:786
#, c-format
-msgid "'%s' contains invalid filesystem format option '%s'"
+msgid ""
+"The hotcopy destination already contains more revisions (%lu) than the "
+"hotcopy source contains (%lu); are source and destination swapped?"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1582
+#: ../libsvn_fs_fs/index.c:288
#, c-format
-msgid "'%s' is not a regular file. Please move it out of the way and try again"
+msgid "Can't read index file '%s' at offset 0x%s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1753
+#: ../libsvn_fs_fs/index.c:298
#, c-format
-msgid "Can't read '%s'"
+msgid "Unexpected end of index file %s at offset 0x%s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1816 ../libsvn_fs_fs/fs_fs.c:1835
+#: ../libsvn_fs_fs/index.c:333 ../libsvn_fs_x/index.c:339
#, c-format
-msgid "Found malformed header '%s' in revision file"
+msgid "Corrupt index: number too large"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1871
+#: ../libsvn_fs_fs/index.c:376 ../libsvn_fs_x/index.c:382
#, c-format
-msgid "Invalid revision number '%ld'"
+msgid ""
+"Index stream header prefix mismatch.\n"
+" expected: %s found: %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1886 ../libsvn_fs_fs/fs_fs.c:1941
-#: ../libsvn_fs_fs/fs_fs.c:1952 ../libsvn_repos/log.c:2268
-#: ../libsvn_repos/log.c:2272
+#: ../libsvn_fs_fs/index.c:603 ../libsvn_fs_x/index.c:561
#, c-format
-msgid "No such revision %ld"
+msgid "UINT32 0x%s too large, max = 0x%s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1986
-msgid "Unexpected EOF"
+#: ../libsvn_fs_fs/index.c:635 ../libsvn_fs_x/index.c:593
+#, c-format
+msgid "File offset 0x%s too large, max = 0x%s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1993
+#: ../libsvn_fs_fs/index.c:809 ../libsvn_fs_x/index.c:942
#, c-format
-msgid "Number '%s' invalid or too large"
+msgid "L2P index page size %s exceeds current limit of 2G entries"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:870 ../libsvn_fs_x/index.c:1005
+#, c-format
+msgid "Item index %s too large in l2p proto index for revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:891 ../libsvn_fs_x/index.c:1029
+#, c-format
+msgid "L2P index page count %d exceeds current limit of 2G pages"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:994 ../libsvn_fs_fs/index.c:2197
+#: ../libsvn_fs_x/index.c:1296 ../libsvn_fs_x/index.c:2542
+msgid "Index rev / pack file revision numbers do not match"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1000 ../libsvn_fs_x/index.c:1309
+msgid "L2P index page size is not a power of two"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1007 ../libsvn_fs_x/index.c:1303
+msgid "Invalid number of revisions in L2P index"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1013 ../libsvn_fs_x/index.c:1315
+msgid "Fewer L2P index pages than revisions"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1016 ../libsvn_fs_x/index.c:1318
+msgid "L2P index page count implausibly large"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1021 ../libsvn_fs_x/index.c:1323
+#, c-format
+msgid "Corrupt L2P index for r%ld only covers r%ld:%ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1040 ../libsvn_fs_x/index.c:1343
+msgid "Revision with no L2P index pages"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1045 ../libsvn_fs_x/index.c:1348
+msgid "L2P page table exceeded"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1052 ../libsvn_fs_x/index.c:1355
+msgid "Revisions do not cover the full L2P index page table"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1060 ../libsvn_fs_x/index.c:1363
+msgid "Empty L2P index page"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1066 ../libsvn_fs_x/index.c:1369
+msgid "Page exceeds L2P index page size"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1125 ../libsvn_fs_x/index.c:1124
+#, c-format
+msgid "Revision %ld not covered by item index"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1151 ../libsvn_fs_x/index.c:1150
+#, c-format
+msgid "Item index %s exceeds l2p limit of %s for revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1358 ../libsvn_fs_x/index.c:1527
+msgid "L2P actual page size does not match page table value."
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1491 ../libsvn_fs_x/index.c:1571
+#, c-format
+msgid "Item index %s too large in revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:1910 ../libsvn_fs_x/index.c:2148
+#, c-format
+msgid "Revision 0x%s too large, max = 0x%s"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2203 ../libsvn_fs_x/index.c:2548
+msgid "Index offset and rev / pack file size do not match"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2209 ../libsvn_fs_x/index.c:2554
+msgid "P2L index page size is not a power of two"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2215 ../libsvn_fs_x/index.c:2560
+msgid "P2L page count does not match rev / pack file size"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2395 ../libsvn_fs_x/index.c:2649
+msgid "Invalid item type in P2L index"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2399 ../libsvn_fs_x/index.c:2702
+msgid "Changed path list must have item number 1"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2413 ../libsvn_fs_x/index.c:2659
+msgid "Invalid FNV1 checksum in P2L index"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2422
+msgid "Empty regions must have item number 0 and checksum 0"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2492 ../libsvn_fs_x/index.c:2768
+msgid "P2L page description overlaps with next page description"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2608 ../libsvn_fs_x/index.c:2883
+#, c-format
+msgid "Offset %s too large in revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:2798 ../libsvn_fs_x/index.c:3086
+#, c-format
+msgid "Last P2L index entry extends beyond the last page in revision %ld."
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:120 ../libsvn_fs_x/lock.c:121
+#, c-format
+msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:228 ../libsvn_fs_x/lock.c:240
+#, c-format
+msgid "Cannot write lock/entries hashfile '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:279 ../libsvn_fs_x/lock.c:292
+#, c-format
+msgid "Can't parse lock/entries hashfile '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:784 ../libsvn_fs_x/lock.c:824
+#, c-format
+msgid "Lock failed: newer version of '%s' exists"
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:1164 ../libsvn_fs_x/lock.c:1292
+#, c-format
+msgid "Failed to lock '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/lock.c:1258 ../libsvn_fs_x/lock.c:1383
+#, c-format
+msgid "Failed to unlock '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:97 ../libsvn_fs_x/low_level.c:100
+msgid "Invalid character in revision number"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2160 ../libsvn_fs_fs/fs_fs.c:2174
-#: ../libsvn_fs_fs/fs_fs.c:2182 ../libsvn_fs_fs/fs_fs.c:2190
-#: ../libsvn_fs_fs/fs_fs.c:2199 ../libsvn_fs_fs/fs_fs.c:2212
-#: ../libsvn_fs_fs/fs_fs.c:2221
+#: ../libsvn_fs_fs/low_level.c:120
+#, c-format
+msgid "Revision file (r%ld) lacks trailing newline"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:134
+#, c-format
+msgid "Final line in revision file (r%ld) longer than 64 characters"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:149
+#, c-format
+msgid "Final line in revision file r%ld missing space"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:208 ../libsvn_fs_fs/low_level.c:217
+#: ../libsvn_fs_fs/low_level.c:226 ../libsvn_fs_fs/low_level.c:235
+#: ../libsvn_fs_x/low_level.c:122 ../libsvn_fs_x/low_level.c:131
+#: ../libsvn_fs_x/low_level.c:140 ../libsvn_fs_x/low_level.c:149
+msgid "Invalid revision footer"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:293 ../libsvn_fs_fs/low_level.c:298
+#: ../libsvn_fs_fs/low_level.c:304 ../libsvn_fs_fs/low_level.c:321
+#: ../libsvn_fs_fs/low_level.c:354 ../libsvn_fs_fs/low_level.c:374
+#: ../libsvn_fs_fs/low_level.c:399 ../libsvn_fs_x/low_level.c:804
+#: ../libsvn_fs_x/low_level.c:812 ../libsvn_fs_x/low_level.c:829
+#: ../libsvn_fs_x/low_level.c:862 ../libsvn_fs_x/low_level.c:882
+#: ../libsvn_fs_x/low_level.c:902
+msgid "Invalid changes line in rev-file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:347 ../libsvn_fs_x/low_level.c:855
+msgid "Invalid change kind in rev file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:367 ../libsvn_fs_x/low_level.c:875
+msgid "Invalid text-mod flag in rev-file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:387 ../libsvn_fs_x/low_level.c:895
+msgid "Invalid prop-mod flag in rev-file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:412 ../libsvn_fs_x/low_level.c:915
+msgid "Invalid mergeinfo-mod flag in rev-file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:419 ../libsvn_fs_x/low_level.c:921
+msgid "Invalid path in changes line"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:439 ../libsvn_fs_x/low_level.c:944
+msgid "Invalid copy-from path in changes line"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:545 ../libsvn_fs_x/low_level.c:1044
+#, c-format
+msgid "Invalid change type %d"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:673 ../libsvn_fs_fs/low_level.c:690
+#: ../libsvn_fs_x/low_level.c:204 ../libsvn_fs_x/low_level.c:221
+#, c-format
+msgid "Found malformed header '%s' in revision file"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:737 ../libsvn_fs_fs/low_level.c:746
+#: ../libsvn_fs_fs/low_level.c:754 ../libsvn_fs_fs/low_level.c:763
+#: ../libsvn_fs_fs/low_level.c:781 ../libsvn_fs_fs/low_level.c:800
+#: ../libsvn_fs_fs/low_level.c:807 ../libsvn_fs_fs/low_level.c:814
+#: ../libsvn_fs_x/low_level.c:257 ../libsvn_fs_x/low_level.c:272
+#: ../libsvn_fs_x/low_level.c:281 ../libsvn_fs_x/low_level.c:289
+#: ../libsvn_fs_x/low_level.c:298 ../libsvn_fs_x/low_level.c:313
msgid "Malformed text representation offset line in node-rev"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2252
+#: ../libsvn_fs_fs/low_level.c:841 ../libsvn_fs_x/low_level.c:346
#, c-format
msgid "While reading representation offsets for node-revision '%s':"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2407
+#: ../libsvn_fs_fs/low_level.c:875
msgid "Missing id field in node-rev"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2421
+#: ../libsvn_fs_fs/low_level.c:890 ../libsvn_fs_x/low_level.c:462
#, c-format
msgid "Missing kind field in node-rev '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2456
+#: ../libsvn_fs_fs/low_level.c:925 ../libsvn_fs_x/low_level.c:499
#, c-format
msgid "Missing cpath field in node-rev '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2484 ../libsvn_fs_fs/fs_fs.c:2491
+#: ../libsvn_fs_fs/low_level.c:932 ../libsvn_fs_x/low_level.c:506
+#, c-format
+msgid "Non-canonical cpath field in node-rev '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/low_level.c:957 ../libsvn_fs_x/low_level.c:535
#, c-format
msgid "Malformed copyroot line in node-rev '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2508 ../libsvn_fs_fs/fs_fs.c:2515
+#: ../libsvn_fs_fs/low_level.c:975 ../libsvn_fs_x/low_level.c:555
#, c-format
msgid "Malformed copyfrom line in node-rev '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2684 ../libsvn_fs_fs/fs_fs.c:7642
+#: ../libsvn_fs_fs/low_level.c:1180 ../libsvn_fs_x/low_level.c:748
#, c-format
-msgid "Attempted to write to non-transaction '%s'"
+msgid "Malformed representation header"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2821
+#: ../libsvn_fs_fs/pack.c:1984
#, c-format
-msgid "Malformed representation header at %s"
+msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
+msgstr ""
+
+#: ../libsvn_fs_fs/recovery.c:172
+msgid "Recovery encountered a non-directory node"
+msgstr ""
+
+#: ../libsvn_fs_fs/recovery.c:193
+msgid "Recovery encountered a deltified directory representation"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2853
+#: ../libsvn_fs_fs/recovery.c:216
#, c-format
-msgid "Missing node-id in node-rev at r%ld (offset %s)"
+msgid "malformed representation for node-revision '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2862
+#: ../libsvn_fs_fs/recovery.c:242 ../libsvn_fs_fs/recovery.c:251
+#: ../libsvn_fs_fs/recovery.c:257
+msgid "Directory entry corrupt"
+msgstr ""
+
+#: ../libsvn_fs_fs/recovery.c:403 ../libsvn_fs_x/recovery.c:178
#, c-format
-msgid "Corrupt node-id '%s' in node-rev at r%ld (offset %s)"
+msgid "Expected current rev to be <= %ld but found %ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2953
+#: ../libsvn_fs_fs/recovery.c:454 ../libsvn_fs_x/recovery.c:215
#, c-format
-msgid "Revision file (r%ld) lacks trailing newline"
+msgid "Revision %ld has a revs file but no revprops file"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2967
+#: ../libsvn_fs_fs/recovery.c:461 ../libsvn_fs_x/recovery.c:222
#, c-format
-msgid "Final line in revision file (r%ld) longer than 64 characters"
+msgid "Revision %ld has a revs file but the revprops file is inaccessible"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:2982
+#: ../libsvn_fs_fs/recovery.c:470 ../libsvn_fs_x/recovery.c:204
#, c-format
-msgid "Final line in revision file r%ld missing space"
+msgid "Revision %ld has a non-file where its revprops file should be"
+msgstr ""
+
+#: ../libsvn_fs_fs/rep-cache.c:132
+#, c-format
+msgid "Couldn't open rep-cache database '%s'"
+msgstr ""
+
+#: ../libsvn_fs_fs/rep-cache.c:282 ../libsvn_fs_fs/rep-cache.c:341
+#: ../libsvn_fs_x/rep-cache.c:256 ../libsvn_fs_x/rep-cache.c:314
+msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3686
+#: ../libsvn_fs_fs/revprops.c:321 ../libsvn_fs_x/revprops.c:800
#, c-format
-msgid "Packed revprop manifest for r%ld too small"
+msgid "Packed revprop manifest for r%ld not properly terminated"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3743
+#: ../libsvn_fs_fs/revprops.c:363 ../libsvn_fs_x/revprops.c:842
+#, c-format
+msgid "Packed revprop manifest for r%ld has too many entries"
+msgstr ""
+
+#: ../libsvn_fs_fs/revprops.c:368 ../libsvn_fs_x/revprops.c:847
+#, c-format
+msgid "Packed revprop manifest for r%ld has too few entries"
+msgstr ""
+
+#: ../libsvn_fs_fs/revprops.c:432 ../libsvn_fs_x/revprops.c:911
#, c-format
msgid "Revprop pack for revision r%ld contains revprops for r%ld .. r%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3754
+#: ../libsvn_fs_fs/revprops.c:443 ../libsvn_fs_x/revprops.c:922
#, c-format
msgid "Revprop pack for revision r%ld starts at non-packed revisions r%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3763
+#: ../libsvn_fs_fs/revprops.c:452 ../libsvn_fs_x/revprops.c:931
msgid "Header end not found"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3791
+#: ../libsvn_fs_fs/revprops.c:484 ../libsvn_fs_x/revprops.c:965
msgid "Packed revprop size exceeds pack file size"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3850
+#: ../libsvn_fs_fs/revprops.c:542 ../libsvn_fs_x/revprops.c:1034
#, c-format
msgid "No such packed revision %ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3890
+#: ../libsvn_fs_fs/revprops.c:575 ../libsvn_fs_x/revprops.c:1075
#, c-format
msgid "Failed to read revprop pack file for r%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3897
+#: ../libsvn_fs_fs/revprops.c:582 ../libsvn_fs_x/revprops.c:1082
#, c-format
msgid "Revprop pack file for r%ld is corrupt"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:3970
+#: ../libsvn_fs_fs/revprops.c:639 ../libsvn_fs_x/revprops.c:1158
#, c-format
msgid "Could not read revprops for revision %ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:4199
+#: ../libsvn_fs_fs/revprops.c:871 ../libsvn_fs_x/revprops.c:1407
#, c-format
msgid "Packed file '%s' misses a tag"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:4537
-msgid "Malformed svndiff data in representation"
+#: ../libsvn_fs_fs/transaction.c:258 ../libsvn_fs_x/transaction.c:510
+#, c-format
+msgid "Can't unlock unknown transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:4973 ../libsvn_fs_fs/fs_fs.c:4992
-msgid "Reading one svndiff window read beyond the end of the representation"
+#: ../libsvn_fs_fs/transaction.c:262 ../libsvn_fs_x/transaction.c:514
+#, c-format
+msgid "Can't unlock nonlocked transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:5080
-msgid "svndiff window length is corrupt"
+#: ../libsvn_fs_fs/transaction.c:269 ../libsvn_fs_x/transaction.c:521
+#, c-format
+msgid "Can't unlock prototype revision lockfile for transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:5248
-msgid "Checksum mismatch while reading representation"
+#: ../libsvn_fs_fs/transaction.c:275 ../libsvn_fs_x/transaction.c:527
+#, c-format
+msgid "Can't close prototype revision lockfile for transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:5613 ../libsvn_fs_fs/fs_fs.c:5627
-#: ../libsvn_fs_fs/fs_fs.c:5634
+#: ../libsvn_fs_fs/transaction.c:321 ../libsvn_fs_x/transaction.c:575
#, c-format
-msgid "Directory entry corrupt in '%s'"
+msgid ""
+"Cannot write to the prototype revision file of transaction '%s' because a "
+"previous representation is currently being written by this process"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6112 ../libsvn_fs_fs/fs_fs.c:6117
-#: ../libsvn_fs_fs/fs_fs.c:6123 ../libsvn_fs_fs/fs_fs.c:6140
-#: ../libsvn_fs_fs/fs_fs.c:6173 ../libsvn_fs_fs/fs_fs.c:6193
-#: ../libsvn_fs_fs/fs_fs.c:6228 ../libsvn_fs_fs/fs_fs.c:6233
-msgid "Invalid changes line in rev-file"
+#: ../libsvn_fs_fs/transaction.c:358 ../libsvn_fs_x/transaction.c:613
+#, c-format
+msgid ""
+"Cannot write to the prototype revision file of transaction '%s' because a "
+"previous representation is currently being written by another process"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6166
-msgid "Invalid change kind in rev file"
+#: ../libsvn_fs_fs/transaction.c:366 ../libsvn_fs_x/transaction.c:621
+#: ../libsvn_subr/io.c:2343
+#, c-format
+msgid "Can't get exclusive lock on file '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6186
-msgid "Invalid text-mod flag in rev-file"
+#: ../libsvn_fs_fs/transaction.c:414 ../libsvn_fs_x/transaction.c:667
+#, c-format
+msgid "p2l proto index offset %s beyond protorev file size %s for TXN %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6206
-msgid "Invalid prop-mod flag in rev-file"
+#: ../libsvn_fs_fs/transaction.c:523 ../libsvn_fs_fs/transaction.c:2444
+#: ../libsvn_fs_x/transaction.c:796 ../libsvn_fs_x/transaction.c:2455
+#, c-format
+msgid "Attempted to write to non-transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6464
+#: ../libsvn_fs_fs/transaction.c:932 ../libsvn_fs_x/transaction.c:1182
msgid "Copying from transactions not allowed"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6597
+#: ../libsvn_fs_fs/transaction.c:1065
#, c-format
msgid "Unable to create transaction directory in '%s' for revision %ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6662
+#: ../libsvn_fs_fs/transaction.c:1136 ../libsvn_fs_x/transaction.c:1338
msgid "Internal error: a null transaction id was passed to get_txn_proplist()"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6821 ../libsvn_fs_fs/fs_fs.c:6828
-msgid "next-id file corrupt"
+#: ../libsvn_fs_fs/transaction.c:1149
+#, c-format
+msgid "malformed property list in transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6924
-#, c-format
-msgid "Transaction '%s' cleanup failed"
+#: ../libsvn_fs_fs/transaction.c:1317 ../libsvn_fs_fs/transaction.c:1323
+#: ../libsvn_fs_x/transaction.c:1603 ../libsvn_fs_x/transaction.c:1609
+msgid "next-id file corrupt"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:7069
+#: ../libsvn_fs_fs/transaction.c:1436 ../libsvn_fs_x/transaction.c:1717
#, c-format
-msgid "Invalid change type %d"
+msgid "Transaction '%s' cleanup failed"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:7662
+#: ../libsvn_fs_fs/transaction.c:2464 ../libsvn_fs_x/transaction.c:2476
msgid "Can't set text contents of a directory"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:7748 ../libsvn_fs_fs/fs_fs.c:7753
-#: ../libsvn_fs_fs/fs_fs.c:7760
-msgid "Corrupt 'current' file"
-msgstr ""
-
-#: ../libsvn_fs_fs/fs_fs.c:8020
+#: ../libsvn_fs_fs/transaction.c:2882 ../libsvn_fs_x/transaction.c:2802
#, c-format
msgid ""
"predecessor count for the root node-revision is wrong: found (%d+%ld != %d), "
"committing r%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:8155
+#: ../libsvn_fs_fs/transaction.c:3040
msgid "Truncated protorev file detected"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:8555
+#: ../libsvn_fs_fs/transaction.c:3524 ../libsvn_fs_x/transaction.c:3357
msgid "Transaction out of date"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9054
-msgid "Recovery encountered a non-directory node"
+#: ../libsvn_fs_fs/transaction.c:3813 ../libsvn_fs_x/transaction.c:3626
+#, c-format
+msgid "No such transaction '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9076
-msgid "Recovery encountered a deltified directory representation"
+#: ../libsvn_fs_fs/tree.c:2589 ../libsvn_fs_x/tree.c:2613
+msgid "Copy immutable tree not supported"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9114 ../libsvn_fs_fs/fs_fs.c:9123
-#: ../libsvn_fs_fs/fs_fs.c:9129
-msgid "Directory entry corrupt"
+#: ../libsvn_fs_fs/tree.c:3908 ../libsvn_fs_x/tree.c:3906
+#, c-format
+msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9302
+#: ../libsvn_fs_fs/tree.c:4024 ../libsvn_fs_x/tree.c:4022
#, c-format
-msgid "Expected current rev to be <= %ld but found %ld"
+msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9359
+#: ../libsvn_fs_fs/tree.c:4224
#, c-format
-msgid "Revision %ld has a revs file but no revprops file"
+msgid ""
+"Querying mergeinfo requires version %d of the FSFS filesystem schema; "
+"filesystem '%s' uses only version %d"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9366
+#: ../libsvn_fs_fs/util.c:387 ../libsvn_fs_x/util.c:499
#, c-format
-msgid "Revision %ld has a revs file but the revprops file is inaccessible"
+msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9375
-#, c-format
-msgid "Revision %ld has a non-file where its revprops file should be"
+#: ../libsvn_fs_fs/util.c:477 ../libsvn_fs_fs/util.c:482
+#: ../libsvn_fs_fs/util.c:487 ../libsvn_fs_x/util.c:572
+msgid "Corrupt 'current' file"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9553
+#: ../libsvn_fs_fs/util.c:598 ../libsvn_fs_x/util.c:673
#, c-format
-msgid ""
-"Node origin for '%s' exists with a different value (%s) than what we were "
-"about to store (%s)"
+msgid "Can't read '%s'"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:9659
-#, c-format
-msgid "No such transaction '%s'"
+#: ../libsvn_fs_fs/util.c:619 ../libsvn_fs_x/util.c:700
+msgid "Unexpected EOF"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10376
+#: ../libsvn_fs_fs/util.c:626 ../libsvn_fs_x/util.c:707
#, c-format
-msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
+msgid "Number '%s' invalid or too large"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10655 ../libsvn_subr/io.c:248
+#: ../libsvn_fs_fs/verify.c:208 ../libsvn_fs_x/verify.c:184
#, c-format
-msgid "Error converting entry in directory '%s' to UTF-8"
+msgid "%s checksum mismatch in file %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10692 ../libsvn_subr/io.c:1021
+#: ../libsvn_fs_fs/verify.c:303
#, c-format
-msgid "Source '%s' is not a directory"
+msgid ""
+"p2l index entry not found for PHYS %s returned by l2p index for LOG r%ld:i%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10698 ../libsvn_subr/io.c:1027
+#: ../libsvn_fs_fs/verify.c:313 ../libsvn_fs_x/verify.c:292
#, c-format
-msgid "Destination '%s' is not a directory"
+msgid "p2l index info LOG r%ld:i%ld does not match l2p index for LOG r%ld:i%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10770 ../libsvn_subr/io.c:1104
-#: ../libsvn_subr/io.c:2492
+#: ../libsvn_fs_fs/verify.c:379 ../libsvn_fs_x/verify.c:361
#, c-format
-msgid "Can't read directory '%s'"
+msgid "p2l does not cover offset %s for revision %ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10775 ../libsvn_subr/io.c:1109
-#: ../libsvn_subr/io.c:2497 ../libsvn_subr/io.c:4002
+#: ../libsvn_fs_fs/verify.c:404
#, c-format
-msgid "Error closing directory '%s'"
+msgid ""
+"Empty P2L entry for PHYS %s refers to revision %ld outside the rev / pack "
+"file (%ld-%ld)"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11067
+#: ../libsvn_fs_fs/verify.c:421
#, c-format
msgid ""
-"The FSFS format (%d) of the hotcopy source does not match the FSFS format "
-"(%d) of the hotcopy destination; please upgrade both repositories to the "
-"same format"
+"l2p index entry PHYS %sdoes not match p2l index value LOG r%ld:i%ld for PHYS "
+"%s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11076
-msgid ""
-"The UUID of the hotcopy source does not match the UUID of the hotcopy "
-"destination"
+#: ../libsvn_fs_fs/verify.c:485 ../libsvn_fs_x/verify.c:462
+#, c-format
+msgid "Empty section in file %s contains non-NUL data at offset %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11083
-msgid ""
-"The sharding layout configuration of the hotcopy source does not match the "
-"sharding layout configuration of the hotcopy destination"
+#: ../libsvn_fs_fs/verify.c:526 ../libsvn_fs_x/verify.c:505
+#, c-format
+msgid "Checksum mismatch in item at offset %s of length %s bytes in file %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11209
+#: ../libsvn_fs_fs/verify.c:622 ../libsvn_fs_x/verify.c:603
#, c-format
-msgid ""
-"Failed to create hotcopy at '%s'. The file '%s' is missing from the source "
-"repository. Please create this file, for instance by running 'svnadmin "
-"upgrade %s'"
+msgid "File size of %s for revision r%ld does not match p2l index size of %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11235
+#: ../libsvn_fs_fs/verify.c:667 ../libsvn_fs_x/verify.c:651
#, c-format
msgid ""
-"The hotcopy destination already contains more revisions (%lu) than the "
-"hotcopy source contains (%lu); are source and destination swapped?"
+"p2l index entry for revision r%ld is non-contiguous between offsets %s and "
+"%s"
+msgstr ""
+
+#: ../libsvn_fs_util/fs-util.c:164
+msgid "Filesystem object has not been opened yet"
+msgstr ""
+
+#: ../libsvn_fs_util/fs-util.c:167
+msgid "Filesystem object already open"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11271
+#: ../libsvn_fs_x/cached_data.c:2955
#, c-format
msgid ""
-"The hotcopy destination already contains more packed revisions (%lu) than "
-"the hotcopy source contains (%lu)"
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s "
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11386
+#: ../libsvn_fs_x/changes.c:239
#, c-format
-msgid ""
-"The assumed HEAD revision (%lu) of the hotcopy source has been packed while "
-"the hotcopy was in progress; please restart the hotcopy operation"
+msgid "Changes list index %%%s exceeds container size %%d"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11401
+#: ../libsvn_fs_x/changes.c:490
#, c-format
-msgid ""
-"Revision %lu disappeared from the hotcopy source while hotcopy was in "
-"progress"
+msgid "Changes list index %u exceeds container size %d"
msgstr ""
-#: ../libsvn_fs_fs/lock.c:120
+#: ../libsvn_fs_x/fs.c:103
#, c-format
-msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
+msgid "Can't fetch FSX shared data"
msgstr ""
-#: ../libsvn_fs_fs/lock.c:228
+#: ../libsvn_fs_x/fs.c:132
#, c-format
-msgid "Cannot write lock/entries hashfile '%s'"
+msgid "Can't store FSX shared data"
+msgstr ""
+
+#: ../libsvn_fs_x/fs.c:600
+msgid "Module for working with an experimental (FSX) repository."
msgstr ""
-#: ../libsvn_fs_fs/lock.c:280
+#: ../libsvn_fs_x/fs.c:663
#, c-format
-msgid "Can't parse lock/entries hashfile '%s'"
+msgid "Unsupported FS loader version (%d) for fsx"
+msgstr ""
+
+#: ../libsvn_fs_x/fs_x.c:1021
+msgid "FSX is not compatible with Subversion prior to 1.9"
msgstr ""
-#: ../libsvn_fs_fs/lock.c:818
+#: ../libsvn_fs_x/hotcopy.c:486
#, c-format
-msgid "Lock failed: newer version of '%s' exists"
+msgid ""
+"The FSX format (%d) of the hotcopy source does not match the FSX format (%d) "
+"of the hotcopy destination; please upgrade both repositories to the same "
+"format"
msgstr ""
-#: ../libsvn_fs_fs/rep-cache.c:138
-msgid "Couldn't open rep-cache database"
+#: ../libsvn_fs_x/index.c:294
+msgid "Can't read index file '%s' at offset 0x%"
msgstr ""
-#: ../libsvn_fs_fs/rep-cache.c:267 ../libsvn_fs_fs/rep-cache.c:312
-msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
+#: ../libsvn_fs_x/index.c:304
+msgid "Unexpected end of index file %s at offset 0x%"
+msgstr ""
+
+#: ../libsvn_fs_x/index.c:2668
+msgid "Unused regions must be empty and have checksum 0"
+msgstr ""
+
+#: ../libsvn_fs_x/index.c:2682
+msgid "Only containers may have more than one sub-item"
msgstr ""
-#: ../libsvn_fs_fs/rep-cache.c:348
+#: ../libsvn_fs_x/low_level.c:423
#, c-format
-msgid ""
-"Representation key for checksum '%%s' exists in filesystem '%%s' with a "
-"different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,"
-"%%%s,%%%s,%%%s)"
+msgid "Missing %s field in node-rev"
msgstr ""
-#: ../libsvn_fs_fs/tree.c:2086 ../libsvn_subr/path.c:1233
+#: ../libsvn_fs_x/noderevs.c:320
#, c-format
-msgid "Invalid control character '0x%02x' in path '%s'"
+msgid "ID part index %d exceeds container size %d"
msgstr ""
-#: ../libsvn_fs_fs/tree.c:3685
+#: ../libsvn_fs_x/noderevs.c:348
#, c-format
-msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
+msgid "Node revision ID index %d exceeds container size %d"
msgstr ""
-#: ../libsvn_fs_fs/tree.c:3801
+#: ../libsvn_fs_x/noderevs.c:377
#, c-format
-msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
+msgid "Node revision index %%%s exceeds container size %%d"
msgstr ""
-#: ../libsvn_fs_fs/tree.c:4001
+#: ../libsvn_fs_x/noderevs.c:617
#, c-format
-msgid ""
-"Querying mergeinfo requires version %d of the FSFS filesystem schema; "
-"filesystem '%s' uses only version %d"
+msgid "Unexpected MD5 digest size %%%s"
msgstr ""
-#: ../libsvn_fs_util/fs-util.c:154
-msgid "Filesystem object has not been opened yet"
+#: ../libsvn_fs_x/noderevs.c:629
+#, c-format
+msgid "Unexpected SHA1 digest size %%%s"
msgstr ""
-#: ../libsvn_fs_util/fs-util.c:157
-msgid "Filesystem object already open"
+#: ../libsvn_fs_x/rep-cache.c:125
+msgid "Couldn't open rep-cache database"
msgstr ""
-#: ../libsvn_ra/compat.c:182
+#: ../libsvn_fs_x/reps.c:496
+msgid "Text body exceeds star delta container capacity"
+msgstr ""
+
+#: ../libsvn_fs_x/reps.c:501
+msgid "Instruction count exceeds star delta container capacity"
+msgstr ""
+
+#: ../libsvn_fs_x/verify.c:283
+#, c-format
+msgid ""
+"p2l index entry not found for PHYS o%s:s%ld returned by l2p index for LOG r"
+"%ld:i%ld"
+msgstr ""
+
+#: ../libsvn_fs_x/verify.c:392
+#, c-format
+msgid ""
+"l2p index entry PHYS o%s:s%ld does not match p2l index value LOG r%ld:i%ld "
+"for PHYS o%s:s%ld"
+msgstr ""
+
+#: ../libsvn_ra/compat.c:183
#, c-format
msgid "Missing changed-path information for '%s' in revision %ld"
msgstr ""
-#: ../libsvn_ra/compat.c:326 ../libsvn_ra/compat.c:570
+#: ../libsvn_ra/compat.c:328 ../libsvn_ra/compat.c:572
#, c-format
msgid "Path '%s' doesn't exist in revision %ld"
msgstr ""
-#: ../libsvn_ra/compat.c:403
+#: ../libsvn_ra/compat.c:405
#, c-format
msgid "'%s' in revision %ld is an unrelated object"
msgstr ""
-#: ../libsvn_ra/compat.c:843 ../libsvn_ra/ra_loader.c:1291
+#: ../libsvn_ra/compat.c:845 ../libsvn_ra/ra_loader.c:1275
#, c-format
msgid "Invalid peg revision %ld"
msgstr ""
-#: ../libsvn_ra/compat.c:846 ../libsvn_ra/ra_loader.c:1294
-#: ../libsvn_repos/rev_hunt.c:214 ../libsvn_repos/rev_hunt.c:329
+#: ../libsvn_ra/compat.c:848 ../libsvn_ra/ra_loader.c:1278
+#: ../libsvn_repos/rev_hunt.c:212 ../libsvn_repos/rev_hunt.c:327
#, c-format
msgid "Invalid end revision %ld"
msgstr ""
-#: ../libsvn_ra/compat.c:849 ../libsvn_ra/ra_loader.c:1297
+#: ../libsvn_ra/compat.c:851 ../libsvn_ra/ra_loader.c:1281
msgid "Peg revision must precede end revision"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:215
+#: ../libsvn_ra/ra_loader.c:217
#, c-format
msgid "Mismatched RA version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:292 ../libsvn_ra_serf/serf.c:594
+#: ../libsvn_ra/ra_loader.c:291
#, c-format
msgid "Illegal repository URL '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:399
+#: ../libsvn_ra/ra_loader.c:329
#, c-format
msgid "Invalid config: unknown HTTP library '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:468
+#: ../libsvn_ra/ra_loader.c:373
#, c-format
msgid "Unrecognized URL scheme for '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:519
+#: ../libsvn_ra/ra_loader.c:397
+#, c-format
+msgid "Unable to connect to a repository at URL '%s'"
+msgstr ""
+
+#: ../libsvn_ra/ra_loader.c:425
#, c-format
msgid "Repository UUID '%s' doesn't match expected UUID '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:540
+#: ../libsvn_ra/ra_loader.c:486
#, c-format
msgid "'%s' isn't in the same repository as '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:564
+#: ../libsvn_ra/ra_loader.c:510
#, c-format
msgid "'%s' isn't a child of session URL '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:580 ../libsvn_ra_svn/client.c:2465
+#: ../libsvn_ra/ra_loader.c:526 ../libsvn_ra_svn/client.c:2624
#, c-format
msgid "'%s' isn't a child of repository root URL '%s'"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:624
+#: ../libsvn_ra/ra_loader.c:570
#, c-format
msgid ""
"Specifying 'old_value_p' is not allowed when the '%s' capability is not "
"advertised, and could indicate a bug in your client"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:1445
+#: ../libsvn_ra/ra_loader.c:1421
#, c-format
msgid " - handles '%s' scheme\n"
msgstr ""
-#: ../libsvn_ra/ra_loader.c:1538
+#: ../libsvn_ra/ra_loader.c:1514
#, c-format
msgid "Unrecognized URL scheme '%s'"
msgstr ""
@@ -4105,32 +4885,28 @@ msgstr ""
#. ----------------------------------------------------------------
#. ** The RA vtable routines **
-#: ../libsvn_ra_local/ra_plugin.c:503
+#: ../libsvn_ra_local/ra_plugin.c:509
msgid "Module for accessing a repository on local disk."
msgstr ""
-#: ../libsvn_ra_local/ra_plugin.c:579
-msgid "Unable to open an ra_local session to URL"
-msgstr ""
-
-#: ../libsvn_ra_local/ra_plugin.c:612 ../libsvn_ra_serf/serf.c:586
+#: ../libsvn_ra_local/ra_plugin.c:685 ../libsvn_ra_serf/serf.c:810
#, c-format
msgid "URL '%s' is not a child of the session's repository root URL '%s'"
msgstr ""
-#: ../libsvn_ra_local/ra_plugin.c:1140 ../libsvn_ra_local/ra_plugin.c:1597
-#: ../libsvn_ra_serf/util.c:2604
+#: ../libsvn_ra_local/ra_plugin.c:1261 ../libsvn_ra_local/ra_plugin.c:1725
+#: ../libsvn_ra_serf/util.c:1796
#, c-format
msgid "'%s' path not found"
msgstr ""
-#: ../libsvn_ra_local/ra_plugin.c:1539 ../libsvn_ra_serf/options.c:678
-#: ../libsvn_ra_svn/client.c:2666
+#: ../libsvn_ra_local/ra_plugin.c:1667 ../libsvn_ra_serf/options.c:732
+#: ../libsvn_ra_svn/client.c:2825
#, c-format
msgid "Don't know anything about capability '%s'"
msgstr ""
-#: ../libsvn_ra_local/ra_plugin.c:1745
+#: ../libsvn_ra_local/ra_plugin.c:1880
#, c-format
msgid "Unsupported RA loader version (%d) for ra_local"
msgstr ""
@@ -4140,236 +4916,181 @@ msgstr ""
msgid "Unable to open repository '%s'"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:215
-#, c-format
-msgid "%s of '%s': %d %s"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:315
+#: ../libsvn_ra_serf/commit.c:287
msgid "No Location header received"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:325
+#: ../libsvn_ra_serf/commit.c:297
msgid "Error parsing Location header value"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:435
-#, c-format
-msgid "Directory '%s' is out of date; try updating"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:523 ../libsvn_repos/commit.c:512
+#: ../libsvn_ra_serf/commit.c:483 ../libsvn_repos/commit.c:520
#, c-format
msgid "Path '%s' not present"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:573
-#, c-format
-msgid "File '%s' is out of date; try updating"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:975
-msgid "At least one property change failed; repository is unchanged"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:1233
-#, c-format
-msgid "Failed writing updated file"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:1421 ../libsvn_ra_serf/commit.c:1511
-#, c-format
-msgid "%s of '%s': %d %s (%s://%s)"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:1431
+#: ../libsvn_ra_serf/commit.c:1298
#, c-format
msgid "POST request did not return transaction information"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:1475
-msgid ""
-"The OPTIONS response did not include the requested activity-collection-set "
-"value"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:1718 ../libsvn_ra_serf/commit.c:2127
-#: ../libsvn_ra_serf/update.c:2619
+#: ../libsvn_ra_serf/commit.c:1587 ../libsvn_ra_serf/update.c:2271
#, c-format
msgid "Unable to parse URL '%s'"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:1746 ../libsvn_ra_serf/util.c:2600
+#: ../libsvn_ra_serf/commit.c:1835
#, c-format
-msgid "Access to '%s' forbidden"
-msgstr ""
-
-#: ../libsvn_ra_serf/commit.c:1750
-#, c-format
-msgid "Adding directory failed: %s on %s (%d %s)"
+msgid "File '%s' already exists"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:1979
+#: ../libsvn_ra_serf/get_deleted_rev.c:173
#, c-format
-msgid "File '%s' already exists"
+msgid "'%s' REPORT not implemented"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:2251
-#, c-format
-msgid "MERGE request failed: returned %d (during commit)"
+#: ../libsvn_ra_serf/get_file.c:376
+msgid "Can't get text contents of a directory"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:2333
+#: ../libsvn_ra_serf/get_lock.c:170 ../libsvn_ra_serf/lock.c:165
#, c-format
-msgid "DELETE returned unexpected status: %d"
+msgid "Invalid LOCK timeout value '%s'"
msgstr ""
-#: ../libsvn_ra_serf/commit.c:2527
-msgid ""
-"DAV request failed; it's possible that the repository's pre-revprop-change "
-"hook either failed or is non-existent"
+#: ../libsvn_ra_serf/get_lock.c:323
+msgid "Server does not support locking features"
msgstr ""
-#: ../libsvn_ra_serf/get_deleted_rev.c:173
-#, c-format
-msgid "'%s' REPORT not implemented"
+#: ../libsvn_ra_serf/getdate.c:167
+msgid "The REPORT response did not include the requested properties"
msgstr ""
-#: ../libsvn_ra_serf/inherited_props.c:171 ../libsvn_ra_serf/property.c:279
-#: ../libsvn_ra_serf/update.c:2468
+#: ../libsvn_ra_serf/inherited_props.c:171 ../libsvn_ra_serf/property.c:264
+#: ../libsvn_ra_serf/update.c:1894
#, c-format
msgid "Got unrecognized encoding '%s'"
msgstr ""
-#: ../libsvn_ra_serf/locks.c:171
+#: ../libsvn_ra_serf/lock.c:261
#, c-format
-msgid "Invalid LOCK timeout value '%s'"
+msgid "No lock on path '%s' (%d %s)"
msgstr ""
-#: ../libsvn_ra_serf/locks.c:243
+#: ../libsvn_ra_serf/lock.c:270
#, c-format
-msgid "Lock request failed: %d %s"
+msgid "Unlock of '%s' failed (%d %s)"
msgstr ""
-#: ../libsvn_ra_serf/locks.c:424
-msgid "Malformed URL for repository"
-msgstr ""
-
-#: ../libsvn_ra_serf/locks.c:430
-msgid "Server does not support locking features"
+#: ../libsvn_ra_serf/lock.c:278
+#, c-format
+msgid "Path '%s' doesn't exist in HEAD revision (%d %s)"
msgstr ""
-#: ../libsvn_ra_serf/locks.c:596
+#: ../libsvn_ra_serf/lock.c:287
#, c-format
-msgid "'%s' is not locked in the repository"
+msgid "Path '%s' already locked (%d %s)"
msgstr ""
-#: ../libsvn_ra_serf/locks.c:647 ../libsvn_ra_serf/locks.c:653
+#: ../libsvn_ra_serf/lock.c:603
#, c-format
-msgid "Unlock request failed: %d %s"
+msgid "'%s' is not locked in the repository"
msgstr ""
-#: ../libsvn_ra_serf/log.c:169
+#: ../libsvn_ra_serf/log.c:172
#, c-format
msgid "Unsupported encoding '%s'"
msgstr ""
-#: ../libsvn_ra_serf/log.c:568 ../libsvn_ra_svn/client.c:1577
+#: ../libsvn_ra_serf/log.c:574 ../libsvn_ra_svn/client.c:1746
msgid "Server does not support custom revprops via log"
msgstr ""
-#: ../libsvn_ra_serf/merge.c:200
+#: ../libsvn_ra_serf/merge.c:205
#, c-format
msgid "A MERGE response for '%s' is not a child of the destination ('%s')"
msgstr ""
-#: ../libsvn_ra_serf/options.c:661
-#, c-format
-msgid "Don't know how to handle '%s' for capability '%s'"
+#: ../libsvn_ra_serf/merge.c:448
+msgid "The MERGE response did not include a new revision"
msgstr ""
-#: ../libsvn_ra_serf/options.c:685
+#: ../libsvn_ra_serf/multistatus.c:226 ../libsvn_ra_serf/multistatus.c:231
#, c-format
-msgid "Attempt to fetch capability '%s' resulted in '%s'"
+msgid "Malformed DAV:status '%s'"
msgstr ""
-#: ../libsvn_ra_serf/property.c:700
-msgid "The PROPFIND response did not include the requested properties"
+#: ../libsvn_ra_serf/multistatus.c:534
+#, c-format
+msgid "Property operation on '%s' failed"
msgstr ""
-#: ../libsvn_ra_serf/property.c:993
-msgid ""
-"The PROPFIND response did not include the requested baseline-collection value"
+#: ../libsvn_ra_serf/multistatus.c:553
+msgid "<blank error>"
msgstr ""
-#: ../libsvn_ra_serf/property.c:1005
-msgid "The PROPFIND response did not include the requested version-name value"
+#: ../libsvn_ra_serf/multistatus.c:562
+#, c-format
+msgid "While handling the '%s' property on '%s':"
msgstr ""
-#: ../libsvn_ra_serf/property.c:1043
-msgid "The OPTIONS response did not include the requested checked-in value"
+#: ../libsvn_ra_serf/multistatus.c:566
+#, c-format
+msgid "While handling the '%s' path:"
msgstr ""
-#: ../libsvn_ra_serf/property.c:1125
+#: ../libsvn_ra_serf/options.c:446
msgid "The OPTIONS response did not include the youngest revision"
msgstr ""
-#: ../libsvn_ra_serf/property.c:1218
-msgid "The PROPFIND response did not include the requested resourcetype value"
-msgstr ""
-
-#: ../libsvn_ra_serf/property.c:1253
-msgid "The PROPFIND response did not include the requested 'DAV:' properties"
-msgstr ""
-
-#: ../libsvn_ra_serf/replay.c:222 ../libsvn_ra_serf/update.c:1657
-msgid "Missing revision attr in target-revision element"
-msgstr ""
-
-#: ../libsvn_ra_serf/replay.c:240
-msgid "Missing revision attr in open-root element"
+#: ../libsvn_ra_serf/options.c:487
+msgid ""
+"The OPTIONS response did not include the requested activity-collection-set "
+"value"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:260 ../libsvn_ra_serf/update.c:1885
-msgid "Missing name attr in delete-entry element"
+#: ../libsvn_ra_serf/options.c:529
+msgid "Location header not set on redirect response"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:266
-msgid "Missing revision attr in delete-entry element"
+#: ../libsvn_ra_serf/options.c:559 ../libsvn_ra_serf/util.c:1787
+#, c-format
+msgid "Repository moved permanently to '%s'"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:286 ../libsvn_ra_serf/update.c:1724
-msgid "Missing name attr in open-directory element"
+#: ../libsvn_ra_serf/options.c:560 ../libsvn_ra_serf/util.c:1788
+#, c-format
+msgid "Repository moved temporarily to '%s'"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:292 ../libsvn_ra_serf/update.c:1675
-#: ../libsvn_ra_serf/update.c:1715
-msgid "Missing revision attr in open-directory element"
+#: ../libsvn_ra_serf/options.c:715
+#, c-format
+msgid "Don't know how to handle '%s' for capability '%s'"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:312 ../libsvn_ra_serf/update.c:1762
-msgid "Missing name attr in add-directory element"
+#: ../libsvn_ra_serf/options.c:739
+#, c-format
+msgid "Attempt to fetch capability '%s' resulted in '%s'"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:349 ../libsvn_ra_serf/update.c:1806
-msgid "Missing name attr in open-file element"
+#: ../libsvn_ra_serf/property.c:663
+msgid ""
+"The PROPFIND response did not include the requested baseline-collection value"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:355 ../libsvn_ra_serf/update.c:1815
-msgid "Missing revision attr in open-file element"
+#: ../libsvn_ra_serf/property.c:683
+msgid "The PROPFIND response did not include the requested version-name value"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:375 ../libsvn_ra_serf/update.c:1840
-msgid "Missing name attr in add-file element"
+#: ../libsvn_ra_serf/property.c:719
+msgid "The OPTIONS response did not include the requested checked-in value"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:443 ../libsvn_ra_serf/update.c:1981
-#: ../libsvn_ra_serf/update.c:2068
-#, c-format
-msgid "Missing name attr in %s element"
+#: ../libsvn_ra_serf/property.c:891
+msgid "The PROPFIND response did not include the requested 'DAV:' properties"
msgstr ""
-#: ../libsvn_ra_serf/replay.c:578
+#: ../libsvn_ra_serf/replay.c:465
msgid "Error writing stream: unexpected EOF"
msgstr ""
@@ -4377,228 +5098,188 @@ msgstr ""
msgid "Failed to read the request"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:62
+#: ../libsvn_ra_serf/serf.c:63
msgid "Module for accessing a repository via WebDAV protocol using serf."
msgstr ""
-#: ../libsvn_ra_serf/serf.c:65
+#: ../libsvn_ra_serf/serf.c:66
#, c-format
msgid ""
"Module for accessing a repository via WebDAV protocol using serf.\n"
-" - using serf %d.%d.%d"
+" - using serf %d.%d.%d (compiled with %d.%d.%d)"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:129
+#: ../libsvn_ra_serf/serf.c:135
#, c-format
msgid "Invalid config: unknown %s '%s'"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:327
+#: ../libsvn_ra_serf/serf.c:367
msgid "Invalid config: illegal character in timeout value"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:331
+#: ../libsvn_ra_serf/serf.c:371
msgid "Invalid config: negative timeout value"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:344
+#: ../libsvn_ra_serf/serf.c:384
msgid "Invalid URL: illegal character in proxy port number"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:348
+#: ../libsvn_ra_serf/serf.c:388
msgid "Invalid URL: negative proxy port number"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:351
+#: ../libsvn_ra_serf/serf.c:391
msgid ""
"Invalid URL: proxy port number greater than maximum TCP port number 65535"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:371
+#: ../libsvn_ra_serf/serf.c:411
#, c-format
msgid "Could not resolve proxy server '%s'"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:474
-#, c-format
-msgid "Illegal URL '%s'"
-msgstr ""
-
-#: ../libsvn_ra_serf/serf.c:546
+#: ../libsvn_ra_serf/serf.c:602
#, c-format
msgid "Connection to '%s' failed"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:1216
+#: ../libsvn_ra_serf/serf.c:1002
msgid "The UUID property was not found on the resource or any of its parents"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:1290
+#: ../libsvn_ra_serf/serf.c:1077
#, c-format
msgid "Unsupported RA loader version (%d) for ra_serf"
msgstr ""
-#: ../libsvn_ra_serf/serf.c:1304
+#: ../libsvn_ra_serf/serf.c:1091
#, c-format
msgid ""
"ra_serf was compiled for serf %d.%d.%d but loaded an incompatible %d.%d.%d "
"library"
msgstr ""
-#: ../libsvn_ra_serf/update.c:1115
-#, c-format
-msgid "GET request returned unexpected delta base: %s"
-msgstr ""
-
-#: ../libsvn_ra_serf/update.c:1133
-#, c-format
-msgid "GET request failed: %d %s"
-msgstr ""
-
-#: ../libsvn_ra_serf/update.c:1919
-msgid "Missing name attr in absent-directory element"
+#: ../libsvn_ra_serf/stat.c:106
+msgid "The PROPFIND response did not include the requested resourcetype value"
msgstr ""
-#: ../libsvn_ra_serf/update.c:1944
-msgid "Missing name attr in absent-file element"
+#: ../libsvn_ra_serf/stat.c:410 ../libsvn_ra_serf/stat.c:448
+msgid "Can't get properties of non-directory"
msgstr ""
-#: ../libsvn_ra_serf/update.c:2012 ../libsvn_ra_serf/update.c:2119
+#: ../libsvn_ra_serf/update.c:1137 ../libsvn_ra_serf/update.c:1143
#, c-format
-msgid "Unknown tag '%s' while at state %d"
-msgstr ""
-
-#: ../libsvn_ra_serf/update.c:2187 ../libsvn_ra_serf/update.c:2309
-#: ../libsvn_ra_serf/update.c:2346
-msgid ""
-"The REPORT or PROPFIND response did not include the requested checked-in "
-"value"
+msgid "GET request returned unexpected delta base: %s"
msgstr ""
-#: ../libsvn_ra_serf/update.c:2528
+#: ../libsvn_ra_serf/update.c:1700 ../libsvn_ra_serf/update.c:1750
#, c-format
-msgid "Error writing to '%s': unexpected EOF"
+msgid "Missing '%s' attribute"
msgstr ""
-#: ../libsvn_ra_serf/update.c:2884
-msgid "Error retrieving REPORT"
+#: ../libsvn_ra_serf/update.c:1964 ../libsvn_ra_serf/update.c:1994
+msgid "The REPORT response did not include the requested checked-in value"
msgstr ""
-#: ../libsvn_ra_serf/update.c:3093
+#: ../libsvn_ra_serf/update.c:2644
msgid "Missing update-report close tag"
msgstr ""
-#: ../libsvn_ra_serf/update.c:3562
-msgid "Can't get text contents of a directory"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:249
+#: ../libsvn_ra_serf/util.c:195
msgid ": "
msgstr ""
-#: ../libsvn_ra_serf/util.c:251
+#: ../libsvn_ra_serf/util.c:197
msgid ", "
msgstr ""
-#: ../libsvn_ra_serf/util.c:462
+#: ../libsvn_ra_serf/util.c:407
msgid "Server SSL certificate verification failed"
msgstr ""
-#: ../libsvn_ra_serf/util.c:467
+#: ../libsvn_ra_serf/util.c:412
msgid "certificate is not yet valid"
msgstr ""
-#: ../libsvn_ra_serf/util.c:470
+#: ../libsvn_ra_serf/util.c:415
msgid "certificate has expired"
msgstr ""
-#: ../libsvn_ra_serf/util.c:474
+#: ../libsvn_ra_serf/util.c:419
msgid "certificate issued for a different hostname"
msgstr ""
-#: ../libsvn_ra_serf/util.c:478
+#: ../libsvn_ra_serf/util.c:423
msgid "issuer is not trusted"
msgstr ""
-#: ../libsvn_ra_serf/util.c:481
+#: ../libsvn_ra_serf/util.c:426
msgid "and other reason(s)"
msgstr ""
-#: ../libsvn_ra_serf/util.c:528
+#: ../libsvn_ra_serf/util.c:473
#, c-format
msgid "Invalid config: unable to load certificate file '%s'"
msgstr ""
-#: ../libsvn_ra_serf/util.c:960 ../libsvn_ra_serf/util.c:963
+#: ../libsvn_ra_serf/util.c:911 ../libsvn_ra_serf/util.c:914
msgid "Error running context"
msgstr ""
-#: ../libsvn_ra_serf/util.c:1297 ../libsvn_ra_serf/util.c:1302
-#, c-format
-msgid "Malformed DAV:status CDATA '%s'"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:1599 ../libsvn_ra_serf/util.c:1702
-#, c-format
-msgid "XML parsing failed"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:1602
-#, c-format
-msgid "XML parsing failed: (%d %s)"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:1889
-msgid "The XML response contains invalid XML"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:1954
+#: ../libsvn_ra_serf/util.c:1186
msgid ""
"No more credentials or we tried too many times.\n"
"Authentication failed"
msgstr ""
-#: ../libsvn_ra_serf/util.c:1976
+#: ../libsvn_ra_serf/util.c:1208
msgid "Proxy authentication failed"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2029
+#: ../libsvn_ra_serf/util.c:1263
#, c-format
msgid "%s request on '%s' failed"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2101
+#: ../libsvn_ra_serf/util.c:1335
#, c-format
msgid "Premature EOF seen from server (http status=%d)"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2170
-#, c-format
-msgid "%s request on '%s' failed: %d %s"
-msgstr ""
-
-#: ../libsvn_ra_serf/util.c:2492
+#: ../libsvn_ra_serf/util.c:1686
msgid ""
"The PROPFIND response did not include the requested version-controlled-"
"configuration value"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2594
+#: ../libsvn_ra_serf/util.c:1792
+#, c-format
+msgid "Access to '%s' forbidden"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:1799
+#, c-format
+msgid "HTTP method is not allowed on '%s'"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:1803
#, c-format
-msgid "Repository moved permanently to '%s'; please relocate"
+msgid "'%s' conflicts"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2596
+#: ../libsvn_ra_serf/util.c:1806
#, c-format
-msgid "Repository moved temporarily to '%s'; please relocate"
+msgid "Precondition on '%s' failed"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2607
+#: ../libsvn_ra_serf/util.c:1809
#, c-format
msgid "'%s': no lock token available"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2611
+#: ../libsvn_ra_serf/util.c:1813
#, c-format
msgid ""
"DAV request failed: 411 Content length required. The server or an "
@@ -4606,250 +5287,299 @@ msgid ""
"chunked-requests' to 'auto' or 'no' in your client configuration."
msgstr ""
-#: ../libsvn_ra_serf/util.c:2617
+#: ../libsvn_ra_serf/util.c:1819
+#, c-format
+msgid "Unexpected server error %d '%s' on '%s'"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:1823
#, c-format
msgid "The requested feature is not supported by '%s'"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2623
+#: ../libsvn_ra_serf/util.c:1829
+#, c-format
+msgid "Unexpected HTTP status %d '%s' on '%s'"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:1848
#, c-format
-msgid "Unexpected HTTP status %d '%s' on '%s'\n"
+msgid "Path '%s' unexpectedly created"
msgstr ""
-#: ../libsvn_ra_serf/util.c:2767
+#: ../libsvn_ra_serf/util.c:1857
#, c-format
-msgid "The %s response contains invalid XML (%d %s)"
+msgid "The HTTP method '%s' is not allowed on '%s'"
msgstr ""
-#: ../libsvn_ra_serf/xml.c:622
+#: ../libsvn_ra_serf/util.c:1862
+#, c-format
+msgid "Unexpected HTTP status %d '%s' on '%s' request to '%s'"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:1965
+#, c-format
+msgid "Illegal URL '%s'"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:502
+#, c-format
+msgid "XML stream truncated: closing '%s' missing"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:530
+msgid "document element not found"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:533
+#, c-format
+msgid "XML stream truncated: %s"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:698
#, c-format
msgid "XML Parsing failed: Unexpected root element '%s'"
msgstr ""
-#: ../libsvn_ra_serf/xml.c:682
+#: ../libsvn_ra_serf/xml.c:758
+#, c-format
+msgid "Missing XML attribute '%s' on '%s' element"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:916
#, c-format
-msgid "Missing XML attribute: '%s'"
+msgid "Malformed XML: %s"
msgstr ""
-#: ../libsvn_ra_serf/xml.c:757
-msgid "The response contains invalid XML"
+#: ../libsvn_ra_serf/xml.c:918
+msgid "The XML response contains invalid XML"
msgstr ""
-#: ../libsvn_ra_svn/client.c:142
+#: ../libsvn_ra_svn/client.c:143
#, c-format
msgid "Unknown hostname '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:167
+#: ../libsvn_ra_svn/client.c:168
#, c-format
msgid "Can't connect to host '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:205
+#: ../libsvn_ra_svn/client.c:206
msgid "Prop diffs element not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:403
+#: ../libsvn_ra_svn/client.c:405
#, c-format
msgid "Undefined tunnel scheme '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:420
+#: ../libsvn_ra_svn/client.c:422
#, c-format
msgid "Tunnel scheme %s requires environment variable %s to be defined"
msgstr ""
-#: ../libsvn_ra_svn/client.c:431
+#: ../libsvn_ra_svn/client.c:433
#, c-format
msgid "Can't tokenize command '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:464
+#: ../libsvn_ra_svn/client.c:476
#, c-format
msgid "Error in child process: %s"
msgstr ""
-#: ../libsvn_ra_svn/client.c:539
+#: ../libsvn_ra_svn/client.c:555
msgid ""
"To better debug SSH connection problems, remove the -q option from 'ssh' in "
"the [tunnels] section of your Subversion configuration file."
msgstr ""
-#: ../libsvn_ra_svn/client.c:557
+#: ../libsvn_ra_svn/client.c:573
#, c-format
msgid "Illegal svn repository URL '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:637
+#: ../libsvn_ra_svn/client.c:724
#, c-format
msgid "Server requires minimum version %d"
msgstr ""
-#: ../libsvn_ra_svn/client.c:641
+#: ../libsvn_ra_svn/client.c:728
#, c-format
msgid "Server only supports versions up to %d"
msgstr ""
-#: ../libsvn_ra_svn/client.c:649
+#: ../libsvn_ra_svn/client.c:736
msgid "Server does not support edit pipelining"
msgstr ""
-#: ../libsvn_ra_svn/client.c:686
+#: ../libsvn_ra_svn/client.c:773
msgid "Impossibly long repository root from server"
msgstr ""
-#: ../libsvn_ra_svn/client.c:698
+#: ../libsvn_ra_svn/client.c:785
msgid ""
"Module for accessing a repository using the svn network protocol.\n"
" - with Cyrus SASL authentication"
msgstr ""
-#: ../libsvn_ra_svn/client.c:702
+#: ../libsvn_ra_svn/client.c:789
msgid "Module for accessing a repository using the svn network protocol."
msgstr ""
-#: ../libsvn_ra_svn/client.c:912
+#: ../libsvn_ra_svn/client.c:871
+#, c-format
+msgid "Invalid host '%s'"
+msgstr ""
+
+#: ../libsvn_ra_svn/client.c:1062
msgid "Server did not send repository root"
msgstr ""
-#: ../libsvn_ra_svn/client.c:985
+#: ../libsvn_ra_svn/client.c:1138
#, c-format
msgid ""
"ra_svn does not support not specifying a log message with pre-1.5 servers; "
"consider passing an empty one, or upgrading the server"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1008
+#: ../libsvn_ra_svn/client.c:1161
msgid ""
"Server doesn't support setting arbitrary revision properties during commit"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1111
+#: ../libsvn_ra_svn/client.c:1261
msgid "Inherited proplist element not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1186
+#: ../libsvn_ra_svn/client.c:1334
msgid "Non-string as part of file contents"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1272
+#: ../libsvn_ra_svn/client.c:1423
msgid "Dirlist element not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1357
+#: ../libsvn_ra_svn/client.c:1432
+#, c-format
+msgid "Invalid directory entry name '%s'"
+msgstr ""
+
+#: ../libsvn_ra_svn/client.c:1515
msgid "Mergeinfo element is not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1565
+#: ../libsvn_ra_svn/client.c:1734
msgid "Log entry not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1612
+#: ../libsvn_ra_svn/client.c:1782
msgid "Changed-path entry not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1778
+#: ../libsvn_ra_svn/client.c:1937
msgid "'stat' not implemented"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1837
+#: ../libsvn_ra_svn/client.c:1996
msgid "'get-locations' not implemented"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1852
+#: ../libsvn_ra_svn/client.c:2011
msgid "Location entry not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1891
+#: ../libsvn_ra_svn/client.c:2050
msgid "'get-location-segments' not implemented"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1908
+#: ../libsvn_ra_svn/client.c:2067
msgid "Location segment entry not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1918
+#: ../libsvn_ra_svn/client.c:2077
msgid "Expected valid revision range"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1959
+#: ../libsvn_ra_svn/client.c:2118
msgid "'get-file-revs' not implemented"
msgstr ""
-#: ../libsvn_ra_svn/client.c:1983
+#: ../libsvn_ra_svn/client.c:2142
msgid "Revision entry not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2000 ../libsvn_ra_svn/client.c:2030
+#: ../libsvn_ra_svn/client.c:2159 ../libsvn_ra_svn/client.c:2189
msgid "Text delta chunk not a string"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2042
+#: ../libsvn_ra_svn/client.c:2201
msgid "The get-file-revs command didn't return any revisions"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2089
+#: ../libsvn_ra_svn/client.c:2248
msgid "Server doesn't support the lock command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2153
+#: ../libsvn_ra_svn/client.c:2312
msgid "Server doesn't support the unlock command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2251
+#: ../libsvn_ra_svn/client.c:2410
msgid "Lock response not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2265
+#: ../libsvn_ra_svn/client.c:2424
msgid "Unknown status for lock command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2289
+#: ../libsvn_ra_svn/client.c:2448
msgid "Didn't receive end marker for lock responses"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2379
+#: ../libsvn_ra_svn/client.c:2538
msgid "Unlock response not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2393
+#: ../libsvn_ra_svn/client.c:2552
msgid "Unknown status for unlock command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2416
+#: ../libsvn_ra_svn/client.c:2575
msgid "Didn't receive end marker for unlock responses"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2440 ../libsvn_ra_svn/client.c:2492
+#: ../libsvn_ra_svn/client.c:2599 ../libsvn_ra_svn/client.c:2651
msgid "Server doesn't support the get-lock command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2506
+#: ../libsvn_ra_svn/client.c:2665
msgid "Lock element not a list"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2549
+#: ../libsvn_ra_svn/client.c:2708
msgid "Server doesn't support the replay command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2580
+#: ../libsvn_ra_svn/client.c:2739
msgid "Server doesn't support the replay-range command"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2598
+#: ../libsvn_ra_svn/client.c:2757
#, c-format
msgid "Expected 'revprops', found '%s'"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2615
+#: ../libsvn_ra_svn/client.c:2774
msgid "Error while replaying commit"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2688
+#: ../libsvn_ra_svn/client.c:2847
msgid "'get-deleted-rev' not implemented"
msgstr ""
-#: ../libsvn_ra_svn/client.c:2787
+#: ../libsvn_ra_svn/client.c:2958
#, c-format
msgid "Unsupported RA loader version (%d) for ra_svn"
msgstr ""
@@ -4875,38 +5605,38 @@ msgstr ""
msgid "Could not create SASL context: %s%s"
msgstr ""
-#: ../libsvn_ra_svn/cyrus_auth.c:921 ../libsvn_ra_svn/internal_auth.c:63
+#: ../libsvn_ra_svn/cyrus_auth.c:932 ../libsvn_ra_svn/internal_auth.c:63
#: ../libsvn_ra_svn/internal_auth.c:114
#, c-format
msgid "Authentication error from server: %s"
msgstr ""
-#: ../libsvn_ra_svn/cyrus_auth.c:925
+#: ../libsvn_ra_svn/cyrus_auth.c:936
msgid "Can't get username or password"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:145
+#: ../libsvn_ra_svn/editorp.c:147
msgid "Successful edit status returned too soon"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:487
+#: ../libsvn_ra_svn/editorp.c:495
msgid "Invalid file or dir token during edit"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:715
+#: ../libsvn_ra_svn/editorp.c:736
msgid "Apply-textdelta already active"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:737 ../libsvn_ra_svn/editorp.c:755
+#: ../libsvn_ra_svn/editorp.c:758 ../libsvn_ra_svn/editorp.c:776
msgid "Apply-textdelta not active"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:850
+#: ../libsvn_ra_svn/editorp.c:871
#, c-format
msgid "Command 'finish-replay' invalid outside of replays"
msgstr ""
-#: ../libsvn_ra_svn/editorp.c:954 ../libsvn_ra_svn/marshal.c:1498
+#: ../libsvn_ra_svn/editorp.c:975 ../libsvn_ra_svn/marshal.c:1579
#, c-format
msgid "Unknown editor command '%s'"
msgstr ""
@@ -4915,56 +5645,60 @@ msgstr ""
msgid "Can't get password"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:151
+#: ../libsvn_ra_svn/marshal.c:147
msgid "Capability entry is not a word"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:941
+#: ../libsvn_ra_svn/marshal.c:953
msgid "String length larger than maximum"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1007
-msgid "Too many nested items"
+#: ../libsvn_ra_svn/marshal.c:1021
+msgid "Items are nested too deeply"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1027 ../libsvn_ra_svn/marshal.c:1105
+#: ../libsvn_ra_svn/marshal.c:1042 ../libsvn_ra_svn/marshal.c:1130
msgid "Number is larger than maximum"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1133
+#: ../libsvn_ra_svn/marshal.c:1073
+msgid "Word is too long"
+msgstr ""
+
+#: ../libsvn_ra_svn/marshal.c:1158
msgid "Word too long"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1351
+#: ../libsvn_ra_svn/marshal.c:1418
msgid "Proplist element not a list"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1390
+#: ../libsvn_ra_svn/marshal.c:1457
msgid "Empty error list"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1399 ../libsvn_ra_svn/marshal.c:1425
+#: ../libsvn_ra_svn/marshal.c:1466 ../libsvn_ra_svn/marshal.c:1492
msgid "Malformed error list"
msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1454
+#: ../libsvn_ra_svn/marshal.c:1521
#, c-format
msgid "Unknown status '%s' in command response"
msgstr ""
-#: ../libsvn_ra_svn/streams.c:78 ../libsvn_ra_svn/streams.c:157
+#: ../libsvn_ra_svn/streams.c:110
#, c-format
-msgid "Can't read from connection"
+msgid "Can't get socket timeout"
msgstr ""
-#: ../libsvn_ra_svn/streams.c:91 ../libsvn_ra_svn/streams.c:170
+#: ../libsvn_ra_svn/streams.c:123
#, c-format
-msgid "Can't write to connection"
+msgid "Can't read from connection"
msgstr ""
-#: ../libsvn_ra_svn/streams.c:144
+#: ../libsvn_ra_svn/streams.c:134
#, c-format
-msgid "Can't get socket timeout"
+msgid "Can't write to connection"
msgstr ""
#: ../libsvn_repos/commit.c:170
@@ -4972,32 +5706,32 @@ msgstr ""
msgid "'%s' is out of date"
msgstr ""
-#: ../libsvn_repos/commit.c:291
+#: ../libsvn_repos/commit.c:294
#, c-format
msgid "Got source path but no source revision for '%s'"
msgstr ""
-#: ../libsvn_repos/commit.c:324
+#: ../libsvn_repos/commit.c:327
#, c-format
msgid "Source url '%s' is from different repository"
msgstr ""
-#: ../libsvn_repos/commit.c:640
+#: ../libsvn_repos/commit.c:648
#, c-format
msgid ""
"Checksum mismatch for resulting fulltext\n"
"(%s)"
msgstr ""
-#: ../libsvn_repos/commit.c:685
+#: ../libsvn_repos/commit.c:693
msgid "(no error)"
msgstr ""
-#: ../libsvn_repos/commit.c:716 ../libsvn_repos/commit.c:722
+#: ../libsvn_repos/commit.c:724 ../libsvn_repos/commit.c:730
msgid "post-commit hook failed with no error message."
msgstr ""
-#: ../libsvn_repos/commit.c:725
+#: ../libsvn_repos/commit.c:733
#, c-format
msgid ""
"post commit FS processing had error:\n"
@@ -5005,19 +5739,19 @@ msgid ""
"%s"
msgstr ""
-#: ../libsvn_repos/commit.c:726 ../libsvn_repos/commit.c:735
+#: ../libsvn_repos/commit.c:734 ../libsvn_repos/commit.c:743
msgid "(no error message)"
msgstr ""
-#: ../libsvn_repos/commit.c:733
+#: ../libsvn_repos/commit.c:741
#, c-format
msgid ""
"post commit FS processing had error:\n"
"%s"
msgstr ""
-#: ../libsvn_repos/commit.c:1273 ../libsvn_repos/fs-wrap.c:98
-#: ../libsvn_repos/load-fs-vtable.c:1046
+#: ../libsvn_repos/commit.c:1268 ../libsvn_repos/fs-wrap.c:117
+#: ../libsvn_repos/load-fs-vtable.c:1113
msgid "Commit succeeded, but post-commit hook failed"
msgstr ""
@@ -5025,31 +5759,31 @@ msgstr ""
msgid "Unable to open root of edit"
msgstr ""
-#: ../libsvn_repos/delta.c:247
+#: ../libsvn_repos/delta.c:236
msgid "Invalid target path"
msgstr ""
-#: ../libsvn_repos/delta.c:251
+#: ../libsvn_repos/delta.c:240
msgid "Delta depth 'exclude' not supported"
msgstr ""
-#: ../libsvn_repos/delta.c:277
+#: ../libsvn_repos/delta.c:266
msgid ""
"Invalid editor anchoring; at least one of the input paths is not a directory "
"and there was no source entry"
msgstr ""
-#: ../libsvn_repos/deprecated.c:614 ../svnadmin/svnadmin.c:780
+#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:942
#, c-format
msgid "* Dumped revision %ld.\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:620 ../svnadmin/svnadmin.c:786
+#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:948
#, c-format
msgid "* Verified revision %ld.\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:628 ../svnadmin/svnadmin.c:834
+#: ../libsvn_repos/deprecated.c:661 ../svnadmin/svnadmin.c:996
#, c-format
msgid ""
"\n"
@@ -5057,7 +5791,7 @@ msgid ""
"\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:634 ../svnadmin/svnadmin.c:840
+#: ../libsvn_repos/deprecated.c:667 ../svnadmin/svnadmin.c:1002
#, c-format
msgid ""
"\n"
@@ -5065,126 +5799,189 @@ msgid ""
"\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:853
+#: ../libsvn_repos/deprecated.c:680 ../svnadmin/svnadmin.c:1015
#, c-format
msgid " * editing path : %s ..."
msgstr ""
-#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:859
+#: ../libsvn_repos/deprecated.c:686 ../svnadmin/svnadmin.c:1021
#, c-format
msgid " * deleting path : %s ..."
msgstr ""
-#: ../libsvn_repos/deprecated.c:659 ../svnadmin/svnadmin.c:865
+#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:1027
#, c-format
msgid " * adding path : %s ..."
msgstr ""
-#: ../libsvn_repos/deprecated.c:665 ../svnadmin/svnadmin.c:871
+#: ../libsvn_repos/deprecated.c:698 ../svnadmin/svnadmin.c:1033
#, c-format
msgid " * replacing path : %s ..."
msgstr ""
-#: ../libsvn_repos/deprecated.c:675 ../svnadmin/svnadmin.c:881
+#: ../libsvn_repos/deprecated.c:708 ../svnadmin/svnadmin.c:1042
msgid " done.\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:685 ../svnadmin/svnadmin.c:891
+#: ../libsvn_repos/deprecated.c:718 ../svnadmin/svnadmin.c:1051
#, c-format
msgid "<<< Started new transaction, based on original revision %ld\n"
msgstr ""
-#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:904
+#: ../libsvn_repos/deprecated.c:725 ../svnadmin/svnadmin.c:1064
#, c-format
msgid " removing '\\r' from %s ..."
msgstr ""
-#: ../libsvn_repos/dump.c:248
+#: ../libsvn_repos/dump.c:794
+#, c-format
+msgid "Path '%s' not found in r%ld."
+msgstr ""
+
+#: ../libsvn_repos/dump.c:799
+#, c-format
+msgid "Unexpected node kind %d for '%s' at r%ld. Expected kind was %d."
+msgstr ""
+
+#: ../libsvn_repos/dump.c:837
+#, c-format
+msgid "Path '%s' exists in r%ld."
+msgstr ""
+
+#: ../libsvn_repos/dump.c:867
#, c-format
msgid ""
"Mergeinfo referencing revision(s) prior to the oldest dumped revision (r"
"%ld). Loading this dump may result in invalid mergeinfo."
msgstr ""
-#: ../libsvn_repos/dump.c:310
+#: ../libsvn_repos/dump.c:975
+#, c-format
+msgid "Duplicate representation of path '%s' in %s property of '%s'"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1121
#, c-format
msgid "E%06d: While validating fspath '%s': %s"
msgstr ""
-#: ../libsvn_repos/dump.c:432
+#: ../libsvn_repos/dump.c:1160
+#, c-format
+msgid "Change invalid path '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1184
+#, c-format
+msgid "Deleting invalid path '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1203
+#, c-format
+msgid "Replacing non-existent path '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1244
+#, c-format
+msgid "Adding already existing path '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1267
+#, c-format
+msgid "Copying from invalid path to '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1279
#, c-format
msgid ""
"Referencing data in revision %ld, which is older than the oldest dumped "
"revision (r%ld). Loading this dump into an empty repository will fail."
msgstr ""
-#: ../libsvn_repos/dump.c:1148 ../libsvn_repos/dump.c:1440
+#: ../libsvn_repos/dump.c:1999 ../libsvn_repos/dump.c:2409
#, c-format
msgid "Start revision %ld is greater than end revision %ld"
msgstr ""
-#: ../libsvn_repos/dump.c:1153 ../libsvn_repos/dump.c:1445
+#: ../libsvn_repos/dump.c:2004 ../libsvn_repos/dump.c:2414
#, c-format
msgid "End revision %ld is invalid (youngest revision is %ld)"
msgstr ""
-#: ../libsvn_repos/dump.c:1291
+#: ../libsvn_repos/dump.c:2117
msgid ""
"The range of revisions dumped contained references to copy sources outside "
"that range."
msgstr ""
-#: ../libsvn_repos/dump.c:1305
+#: ../libsvn_repos/dump.c:2129
msgid ""
"The range of revisions dumped contained mergeinfo which reference revisions "
"outside that range."
msgstr ""
-#: ../libsvn_repos/dump.c:1364
+#: ../libsvn_repos/dump.c:2183
+#, c-format
+msgid "Node '%s' is not a directory."
+msgstr ""
+
+#: ../libsvn_repos/dump.c:2191
+#, c-format
+msgid "Node '%s' is not a file."
+msgstr ""
+
+#: ../libsvn_repos/dump.c:2196
#, c-format
msgid "Unexpected node kind %d for '%s'"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:194
+#: ../libsvn_repos/dump.c:2243
+#, c-format
+msgid "Duplicate representation of path '%s'"
+msgstr ""
+
+#: ../libsvn_repos/fs-wrap.c:213
#, c-format
msgid ""
"Storage of non-regular property '%s' is disallowed through the repository "
"interface, and could indicate a bug in your client"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:209
+#: ../libsvn_repos/fs-wrap.c:228
#, c-format
msgid "Cannot accept '%s' property because it is not encoded in UTF-8"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:219
+#: ../libsvn_repos/fs-wrap.c:238
#, c-format
msgid "Cannot accept non-LF line endings in '%s' property"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:260
+#: ../libsvn_repos/fs-wrap.c:279
#, c-format
msgid ""
"Commit rejected because mergeinfo on '%s' contains unexpected string "
"terminator"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:267
+#: ../libsvn_repos/fs-wrap.c:286
#, c-format
msgid "Commit rejected because mergeinfo on '%s' is syntactically invalid"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:397
+#: ../libsvn_repos/fs-wrap.c:416
#, c-format
msgid "Write denied: not authorized to read all of revision %ld"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:581
-#, c-format
-msgid "Cannot unlock path '%s', no authenticated username available"
+#: ../libsvn_repos/fs-wrap.c:629
+msgid "Locking succeeded, but post-lock hook failed"
msgstr ""
-#: ../libsvn_repos/fs-wrap.c:597
+#: ../libsvn_repos/fs-wrap.c:735
+msgid "Cannot unlock, no authenticated username available"
+msgstr ""
+
+#: ../libsvn_repos/fs-wrap.c:783
msgid "Unlock succeeded, but post-unlock hook failed"
msgstr ""
@@ -5257,87 +6054,87 @@ msgstr ""
msgid "Error closing null file"
msgstr ""
-#: ../libsvn_repos/hooks.c:446
+#: ../libsvn_repos/hooks.c:454
#, c-format
msgid "Failed to run '%s' hook; broken symlink"
msgstr ""
-#: ../libsvn_repos/hooks.c:664
+#: ../libsvn_repos/hooks.c:679
msgid ""
"Repository has not been enabled to accept revision propchanges;\n"
"ask the administrator to create a pre-revprop-change hook"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:567 ../svnrdump/load_editor.c:810
+#: ../libsvn_repos/load-fs-vtable.c:589 ../svnrdump/load_editor.c:642
#, c-format
msgid "Relative source revision %ld is not available in current repository"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:581
+#: ../libsvn_repos/load-fs-vtable.c:603
#, c-format
msgid ""
"Copy source checksum mismatch on copy from '%s'@%ld\n"
"to '%s' in rev based on r%ld"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:645
+#: ../libsvn_repos/load-fs-vtable.c:667
msgid "Malformed dumpstream: Revision 0 must not contain node records"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:661
+#: ../libsvn_repos/load-fs-vtable.c:683
#, c-format
msgid "Unrecognized node-action on node '%s'"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:831
+#: ../libsvn_repos/load-fs-vtable.c:852 ../svnrdump/load_editor.c:778
msgid "Invalid svn:mergeinfo value"
msgstr ""
-#: ../libsvn_repos/load-fs-vtable.c:840
+#: ../libsvn_repos/load-fs-vtable.c:861
msgid "Invalid svn:mergeinfo value; leaving unchanged"
msgstr ""
-#: ../libsvn_repos/load.c:54
+#: ../libsvn_repos/load.c:46
msgid "Premature end of content data in dumpstream"
msgstr ""
-#: ../libsvn_repos/load.c:61
+#: ../libsvn_repos/load.c:53
msgid "Dumpstream data appears to be malformed"
msgstr ""
-#: ../libsvn_repos/load.c:110
+#: ../libsvn_repos/load.c:102
#, c-format
msgid "Dump stream contains a malformed header (with no ':') at '%.20s'"
msgstr ""
-#: ../libsvn_repos/load.c:123
+#: ../libsvn_repos/load.c:115
#, c-format
msgid "Dump stream contains a malformed header (with no value) at '%.20s'"
msgstr ""
-#: ../libsvn_repos/load.c:212
+#: ../libsvn_repos/load.c:204
msgid "Incomplete or unterminated property block"
msgstr ""
-#: ../libsvn_repos/load.c:360
+#: ../libsvn_repos/load.c:344
msgid "Unexpected EOF writing contents"
msgstr ""
-#: ../libsvn_repos/load.c:390
+#: ../libsvn_repos/load.c:374
#, c-format
msgid "Malformed dumpfile header '%s'"
msgstr ""
-#: ../libsvn_repos/load.c:397
+#: ../libsvn_repos/load.c:381
#, c-format
msgid "Unsupported dumpfile version: %d"
msgstr ""
-#: ../libsvn_repos/load.c:538
+#: ../libsvn_repos/load.c:522
msgid "Unrecognized record type in stream"
msgstr ""
-#: ../libsvn_repos/load.c:645
+#: ../libsvn_repos/load.c:629
msgid "Sum of subblock sizes larger than total block content length"
msgstr ""
@@ -5346,11 +6143,15 @@ msgstr ""
msgid "'%s' not found in filesystem"
msgstr ""
-#: ../libsvn_repos/replay.c:546 ../libsvn_repos/replay.c:1267
+#: ../libsvn_repos/replay.c:541 ../libsvn_repos/replay.c:1267
#, c-format
msgid "Filesystem path '%s' is neither a file nor a directory"
msgstr ""
+#: ../libsvn_repos/replay.c:556
+msgid "Root directory already exists."
+msgstr ""
+
#: ../libsvn_repos/reporter.c:205
#, c-format
msgid "Invalid length (%%%s) when about to read a string"
@@ -5361,42 +6162,42 @@ msgstr ""
msgid "Invalid depth (%c) for path '%s'"
msgstr ""
-#: ../libsvn_repos/reporter.c:951
+#: ../libsvn_repos/reporter.c:950
#, c-format
msgid "Working copy path '%s' does not exist in repository"
msgstr ""
-#: ../libsvn_repos/reporter.c:1355
+#: ../libsvn_repos/reporter.c:1376
msgid "Not authorized to open root of edit operation"
msgstr ""
-#: ../libsvn_repos/reporter.c:1372
+#: ../libsvn_repos/reporter.c:1393
#, c-format
msgid "Target path '%s' does not exist"
msgstr ""
-#: ../libsvn_repos/reporter.c:1380
+#: ../libsvn_repos/reporter.c:1401
msgid "Cannot replace a directory from within"
msgstr ""
-#: ../libsvn_repos/reporter.c:1420
+#: ../libsvn_repos/reporter.c:1441
msgid "Invalid report for top level of working copy"
msgstr ""
-#: ../libsvn_repos/reporter.c:1435
+#: ../libsvn_repos/reporter.c:1456
msgid "Two top-level reports with no target"
msgstr ""
-#: ../libsvn_repos/reporter.c:1497
+#: ../libsvn_repos/reporter.c:1518
#, c-format
msgid "Unsupported report depth '%s'"
msgstr ""
-#: ../libsvn_repos/reporter.c:1527
+#: ../libsvn_repos/reporter.c:1548
msgid "Depth 'exclude' not supported for link"
msgstr ""
-#: ../libsvn_repos/reporter.c:1584
+#: ../libsvn_repos/reporter.c:1605
msgid "Request depth 'exclude' not supported"
msgstr ""
@@ -5417,131 +6218,151 @@ msgstr ""
msgid "Creating lock dir"
msgstr ""
-#: ../libsvn_repos/repos.c:291
+#: ../libsvn_repos/repos.c:367
msgid "Creating hook directory"
msgstr ""
-#: ../libsvn_repos/repos.c:373
+#: ../libsvn_repos/repos.c:420
msgid "Creating start-commit hook"
msgstr ""
-#: ../libsvn_repos/repos.c:465
+#: ../libsvn_repos/repos.c:483
msgid "Creating pre-commit hook"
msgstr ""
-#: ../libsvn_repos/repos.c:543
+#: ../libsvn_repos/repos.c:534
msgid "Creating pre-revprop-change hook"
msgstr ""
-#: ../libsvn_repos/repos.c:783
+#: ../libsvn_repos/repos.c:600
+msgid "Creating pre-lock hook"
+msgstr ""
+
+#: ../libsvn_repos/repos.c:658
+msgid "Creating pre-unlock hook"
+msgstr ""
+
+#: ../libsvn_repos/repos.c:691
msgid "Creating post-commit hook"
msgstr ""
-#: ../libsvn_repos/repos.c:975
+#: ../libsvn_repos/repos.c:726
+msgid "Creating post-lock hook"
+msgstr ""
+
+#: ../libsvn_repos/repos.c:758
+msgid "Creating post-unlock hook"
+msgstr ""
+
+#: ../libsvn_repos/repos.c:799
msgid "Creating post-revprop-change hook"
msgstr ""
-#: ../libsvn_repos/repos.c:987
+#: ../libsvn_repos/repos.c:810
msgid "Creating conf directory"
msgstr ""
-#: ../libsvn_repos/repos.c:1071
+#: ../libsvn_repos/repos.c:899
msgid "Creating svnserve.conf file"
msgstr ""
-#: ../libsvn_repos/repos.c:1089
+#: ../libsvn_repos/repos.c:917
msgid "Creating passwd file"
msgstr ""
-#: ../libsvn_repos/repos.c:1131
+#: ../libsvn_repos/repos.c:959
msgid "Creating authz file"
msgstr ""
-#: ../libsvn_repos/repos.c:1161
+#: ../libsvn_repos/repos.c:989
msgid "Creating hooks-env file"
msgstr ""
-#: ../libsvn_repos/repos.c:1217
+#: ../libsvn_repos/repos.c:1045
msgid "Could not create top-level directory"
msgstr ""
-#: ../libsvn_repos/repos.c:1227
+#: ../libsvn_repos/repos.c:1055
msgid "Creating DAV sandbox dir"
msgstr ""
-#: ../libsvn_repos/repos.c:1296
+#: ../libsvn_repos/repos.c:1124
msgid "Error opening db lockfile"
msgstr ""
-#: ../libsvn_repos/repos.c:1333
+#: ../libsvn_repos/repos.c:1162
#, c-format
msgid "'%s' is an existing repository"
msgstr ""
-#: ../libsvn_repos/repos.c:1337
+#: ../libsvn_repos/repos.c:1167
#, c-format
msgid "'%s' is a subdirectory of an existing repository rooted at '%s'"
msgstr ""
-#: ../libsvn_repos/repos.c:1345
+#: ../libsvn_repos/repos.c:1177
msgid "Repository creation failed"
msgstr ""
-#: ../libsvn_repos/repos.c:1430
+#: ../libsvn_repos/repos.c:1267
#, c-format
msgid "Expected repository format '%d' or '%d'; found format '%d'"
msgstr ""
-#: ../libsvn_repos/repos.c:1674
+#: ../libsvn_repos/repos.c:1571
#, c-format
msgid "unknown capability '%s'"
msgstr ""
-#: ../libsvn_repos/rev_hunt.c:71
+#: ../libsvn_repos/rev_hunt.c:73
#, c-format
msgid "Failed to find time on revision %ld"
msgstr ""
-#: ../libsvn_repos/rev_hunt.c:210 ../libsvn_repos/rev_hunt.c:325
+#: ../libsvn_repos/rev_hunt.c:208 ../libsvn_repos/rev_hunt.c:323
#, c-format
msgid "Invalid start revision %ld"
msgstr ""
-#: ../libsvn_repos/rev_hunt.c:518
+#: ../libsvn_repos/rev_hunt.c:503
msgid "Unreadable path encountered; access denied"
msgstr ""
-#: ../libsvn_repos/rev_hunt.c:1156 ../libsvn_repos/rev_hunt.c:1495
+#: ../libsvn_repos/rev_hunt.c:1120 ../libsvn_repos/rev_hunt.c:1478
#, c-format
msgid "'%s' is not a file in revision %ld"
msgstr ""
-#: ../libsvn_subr/auth.c:223
+#: ../libsvn_subr/auth.c:247
+msgid "No authentication providers registered"
+msgstr ""
+
+#: ../libsvn_subr/auth.c:253
#, c-format
msgid "No provider registered for '%s' credentials"
msgstr ""
-#: ../libsvn_subr/cache-membuffer.c:518
+#: ../libsvn_subr/cache-membuffer.c:651
#, c-format
msgid "Can't lock cache mutex"
msgstr ""
-#: ../libsvn_subr/cache-membuffer.c:556 ../libsvn_subr/cache-membuffer.c:580
+#: ../libsvn_subr/cache-membuffer.c:689 ../libsvn_subr/cache-membuffer.c:710
#, c-format
msgid "Can't write-lock cache mutex"
msgstr ""
-#: ../libsvn_subr/cache-membuffer.c:607
+#: ../libsvn_subr/cache-membuffer.c:734
#, c-format
msgid "Can't unlock cache mutex"
msgstr ""
-#: ../libsvn_subr/cache-membuffer.c:1352
+#: ../libsvn_subr/cache-membuffer.c:1840
#, c-format
msgid "Can't create cache mutex"
msgstr ""
-#: ../libsvn_subr/cache-membuffer.c:2089
+#: ../libsvn_subr/cache-membuffer.c:2792
msgid "Can't iterate a membuffer-based cache"
msgstr ""
@@ -5550,46 +6371,51 @@ msgstr ""
msgid "Unknown memcached error while reading"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:238
+#: ../libsvn_subr/cache-memcache.c:258
#, c-format
msgid "Unknown memcached error while writing"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:344
+#: ../libsvn_subr/cache-memcache.c:364
msgid "Can't iterate a memcached cache"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:444
+#: ../libsvn_subr/cache-memcache.c:460
#, c-format
msgid "Error parsing memcache server '%s'"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:452
+#: ../libsvn_subr/cache-memcache.c:468
#, c-format
msgid "Scope not allowed in memcache server '%s'"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:460
+#: ../libsvn_subr/cache-memcache.c:476
#, c-format
msgid "Must specify host and port for memcache server '%s'"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:480
+#: ../libsvn_subr/cache-memcache.c:496
#, c-format
msgid "Unknown error creating memcache server"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:488
+#: ../libsvn_subr/cache-memcache.c:504
#, c-format
msgid "Unknown error adding server to memcache"
msgstr ""
-#: ../libsvn_subr/cache-memcache.c:561
+#: ../libsvn_subr/cache-memcache.c:574
#, c-format
msgid "Unknown error creating apr_memcache_t"
msgstr ""
-#: ../libsvn_subr/checksum.c:470
+#: ../libsvn_subr/checksum.c:352
+#, c-format
+msgid "Invalid prefix in checksum '%s'"
+msgstr ""
+
+#: ../libsvn_subr/checksum.c:642
#, c-format
msgid ""
"%s:\n"
@@ -5597,106 +6423,217 @@ msgid ""
" actual: %s\n"
msgstr ""
-#: ../libsvn_subr/cmdline.c:655
+#: ../libsvn_subr/cmdline.c:761
#, c-format
msgid "Error initializing command line arguments"
msgstr ""
-#: ../libsvn_subr/cmdline.c:744
+#: ../libsvn_subr/cmdline.c:874
+#, c-format
+msgid "Ignoring unknown value '%s'; did you mean '%s'?"
+msgstr ""
+
+#: ../libsvn_subr/cmdline.c:879
+#, c-format
+msgid "Ignoring unknown value '%s'"
+msgstr ""
+
+#: ../libsvn_subr/cmdline.c:974
msgid "Invalid syntax of argument of --config-option"
msgstr ""
-#: ../libsvn_subr/cmdline.c:771
+#: ../libsvn_subr/cmdline.c:1001
#, c-format
msgid "Unrecognized file in argument of %s"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1017
+#: ../libsvn_subr/cmdline.c:1247
msgid ""
"The EDITOR, SVN_EDITOR or VISUAL environment variable or 'editor-cmd' run-"
"time configuration option is empty or consists solely of whitespace. "
"Expected a shell command."
msgstr ""
-#: ../libsvn_subr/cmdline.c:1024
+#: ../libsvn_subr/cmdline.c:1254
msgid ""
"None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and "
"no 'editor-cmd' run-time configuration option was found"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1049 ../libsvn_subr/cmdline.c:1133
+#: ../libsvn_subr/cmdline.c:1279 ../libsvn_subr/cmdline.c:1363
#, c-format
msgid "Can't get working directory"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1060 ../libsvn_subr/cmdline.c:1144
-#: ../libsvn_subr/cmdline.c:1169
+#: ../libsvn_subr/cmdline.c:1290 ../libsvn_subr/cmdline.c:1374
+#: ../libsvn_subr/cmdline.c:1399
#, c-format
msgid "Can't change working directory to '%s'"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1068 ../libsvn_subr/cmdline.c:1316
+#: ../libsvn_subr/cmdline.c:1298 ../libsvn_subr/cmdline.c:1546
#, c-format
msgid "Can't restore working directory"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1075 ../libsvn_subr/cmdline.c:1251
+#: ../libsvn_subr/cmdline.c:1305 ../libsvn_subr/cmdline.c:1481
#, c-format
msgid "system('%s') returned %d"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1196
+#: ../libsvn_subr/cmdline.c:1426
#, c-format
msgid "Can't write to '%s'"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1211 ../libsvn_subr/cmdline.c:1226
-#: ../libsvn_subr/cmdline.c:1260 ../libsvn_subr/io.c:3616
+#: ../libsvn_subr/cmdline.c:1441 ../libsvn_subr/cmdline.c:1456
+#: ../libsvn_subr/cmdline.c:1490 ../libsvn_subr/io.c:4183
#, c-format
msgid "Can't stat '%s'"
msgstr ""
-#: ../libsvn_subr/cmdline.c:1285
+#: ../libsvn_subr/cmdline.c:1515
msgid "Error normalizing edited contents to internal format"
msgstr ""
-#: ../libsvn_subr/config.c:740
+#: ../libsvn_subr/cmdline.c:1589
+#, c-format
+msgid ""
+"Unknown value '%s' for %s.\n"
+"Supported values: %s"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:158
+msgid "Compression of svndiff data failed"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:194
+msgid "Decompression of zlib compressed data failed: no size"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:197
+msgid "Decompression of zlib compressed data failed: size too large"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:222
+msgid "Decompression of svndiff data failed"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:229
+msgid "Size of uncompressed data does not match stored original length"
+msgstr ""
+
+#: ../libsvn_subr/compress.c:245
+#, c-format
+msgid "Unsupported compression method %d"
+msgstr ""
+
+#: ../libsvn_subr/config.c:805
#, c-format
msgid "Config error: invalid boolean value '%s' for '[%s] %s'"
msgstr ""
-#: ../libsvn_subr/config.c:745
+#: ../libsvn_subr/config.c:810
#, c-format
msgid "Config error: invalid boolean value '%s' for '%s'"
msgstr ""
-#: ../libsvn_subr/config.c:1174
+#: ../libsvn_subr/config.c:1239
#, c-format
msgid "Config error: invalid integer value '%s'"
msgstr ""
-#: ../libsvn_subr/config_auth.c:100
+#: ../libsvn_subr/config_auth.c:96
msgid "Unable to open auth file for reading"
msgstr ""
-#: ../libsvn_subr/config_auth.c:105
+#: ../libsvn_subr/config_auth.c:101
#, c-format
msgid "Error parsing '%s'"
msgstr ""
-#: ../libsvn_subr/config_auth.c:135
+#: ../libsvn_subr/config_auth.c:130
msgid "Unable to locate auth file"
msgstr ""
-#: ../libsvn_subr/config_auth.c:146
+#: ../libsvn_subr/config_auth.c:142
msgid "Unable to open auth file for writing"
msgstr ""
-#: ../libsvn_subr/config_auth.c:150
+#: ../libsvn_subr/config_auth.c:144
#, c-format
msgid "Error writing hash to '%s'"
msgstr ""
+#: ../libsvn_subr/config_file.c:353
+#, c-format
+msgid "line %d: Option must end with ':' or '='"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:396
+#, c-format
+msgid "line %d: Section header must end with ']'"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:563
+#, c-format
+msgid "Error while parsing config file: %s:"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:606
+#, c-format
+msgid "line %d: Section header must start in the first column"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:619
+#, c-format
+msgid "line %d: Comment must start in the first column"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:634
+#, c-format
+msgid "line %d: Section header expected"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:638
+#, c-format
+msgid "line %d: Option expected"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:93
+msgid "Can't determine the system config path"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:94
+msgid "Can't determine the user's config path"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:137
+msgid "Can't enumerate registry values"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:154
+msgid "Can't read registry value data"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:191
+#, c-format
+msgid "Unrecognised registry path '%s'"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:208
+#, c-format
+msgid "Can't open registry key '%s'"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:246
+msgid "Can't enumerate registry keys"
+msgstr ""
+
+#: ../libsvn_subr/config_win.c:256
+msgid "Can't open existing subkey"
+msgstr ""
+
#: ../libsvn_subr/crypto.c:93
#, c-format
msgid "Failed to initialize cryptography subsystem"
@@ -5789,349 +6726,363 @@ msgstr ""
msgid "Can't expand time"
msgstr ""
-#: ../libsvn_subr/deprecated.c:361 ../libsvn_subr/opt.c:302
+#: ../libsvn_subr/deprecated.c:364 ../libsvn_subr/opt.c:302
msgid ""
"\n"
"Valid options:\n"
msgstr ""
-#: ../libsvn_subr/deprecated.c:437 ../libsvn_subr/opt.c:417
+#: ../libsvn_subr/deprecated.c:440 ../libsvn_subr/opt.c:417
#, c-format
msgid ""
"\"%s\": unknown command.\n"
"\n"
msgstr ""
-#: ../libsvn_subr/deprecated.c:615 ../libsvn_subr/opt.c:1239
-#: ../svnrdump/svnrdump.c:646
+#: ../libsvn_subr/deprecated.c:618 ../libsvn_subr/opt.c:1232
+#: ../svnrdump/svnrdump.c:601
#, c-format
msgid "Type '%s help' for usage.\n"
msgstr ""
-#: ../libsvn_subr/deprecated.c:1023
+#: ../libsvn_subr/deprecated.c:1026
#, c-format
msgid "'%s' is neither a file nor a directory name"
msgstr ""
-#: ../libsvn_subr/dirent_uri.c:1605
+#: ../libsvn_subr/dirent_uri.c:1628
#, c-format
msgid "Couldn't determine absolute path of '%s'"
msgstr ""
-#: ../libsvn_subr/dirent_uri.c:2314
+#: ../libsvn_subr/dirent_uri.c:2342
#, c-format
msgid "Local URL '%s' does not contain 'file://' prefix"
msgstr ""
-#: ../libsvn_subr/dirent_uri.c:2393
+#: ../libsvn_subr/dirent_uri.c:2421
#, c-format
msgid "Local URL '%s' contains only a hostname, no path"
msgstr ""
-#: ../libsvn_subr/dirent_uri.c:2407
+#: ../libsvn_subr/dirent_uri.c:2435
#, c-format
msgid "Local URL '%s' contains unsupported hostname"
msgstr ""
-#: ../libsvn_subr/error.c:263
-msgid "Additional errors:"
-msgstr ""
-
-#: ../libsvn_subr/error.c:528
+#: ../libsvn_subr/error.c:553
msgid "Can't recode error string from APR"
msgstr ""
-#: ../libsvn_subr/error.c:628
+#: ../libsvn_subr/error.c:646
#, c-format
msgid "%swarning: W%06d: %s\n"
msgstr ""
-#: ../libsvn_subr/error.c:710
+#: ../libsvn_subr/error.c:752
#, c-format
msgid "In file '%s' line %d: assertion failed (%s)"
msgstr ""
-#: ../libsvn_subr/error.c:714
+#: ../libsvn_subr/error.c:756
#, c-format
msgid "In file '%s' line %d: internal malfunction"
msgstr ""
-#: ../libsvn_subr/error.c:770
+#: ../libsvn_subr/error.c:818
msgid "stream error"
msgstr ""
-#: ../libsvn_subr/error.c:775
+#: ../libsvn_subr/error.c:823
msgid "out of memory"
msgstr ""
-#: ../libsvn_subr/error.c:780
+#: ../libsvn_subr/error.c:828
msgid "buffer error"
msgstr ""
-#: ../libsvn_subr/error.c:785
+#: ../libsvn_subr/error.c:833
msgid "version error"
msgstr ""
-#: ../libsvn_subr/error.c:790
+#: ../libsvn_subr/error.c:838
msgid "corrupt data"
msgstr ""
-#: ../libsvn_subr/error.c:795
+#: ../libsvn_subr/error.c:843
msgid "unknown error"
msgstr ""
-#: ../libsvn_subr/gpg_agent.c:408 ../libsvn_subr/prompt.c:631
+#: ../libsvn_subr/gpg_agent.c:449 ../libsvn_subr/prompt.c:627
#, c-format
msgid "Password for '%s': "
msgstr ""
-#: ../libsvn_subr/gpg_agent.c:409
+#: ../libsvn_subr/gpg_agent.c:450
#, c-format
msgid "Enter your Subversion password for %s"
msgstr ""
-#: ../libsvn_subr/hash.c:120
+#: ../libsvn_subr/hash.c:126
msgid "Serialized hash missing terminator"
msgstr ""
-#: ../libsvn_subr/hash.c:129 ../libsvn_subr/hash.c:142
-#: ../libsvn_subr/hash.c:153 ../libsvn_subr/hash.c:165
-#: ../libsvn_subr/hash.c:173 ../libsvn_subr/hash.c:183
-#: ../libsvn_subr/hash.c:196 ../libsvn_subr/hash.c:204
+#: ../libsvn_subr/hash.c:135 ../libsvn_subr/hash.c:186
+msgid "Serialized hash malformed key length"
+msgstr ""
+
+#: ../libsvn_subr/hash.c:148 ../libsvn_subr/hash.c:199
+msgid "Serialized hash malformed key data"
+msgstr ""
+
+#: ../libsvn_subr/hash.c:160
+msgid "Serialized hash malformed value length"
+msgstr ""
+
+#: ../libsvn_subr/hash.c:172
+msgid "Serialized hash malformed value data"
+msgstr ""
+
+#: ../libsvn_subr/hash.c:176 ../libsvn_subr/hash.c:208
msgid "Serialized hash malformed"
msgstr ""
-#: ../libsvn_subr/hash.c:244
+#: ../libsvn_subr/hash.c:282
msgid "Cannot serialize negative length"
msgstr ""
-#: ../libsvn_subr/io.c:309
+#: ../libsvn_subr/io.c:354
#, c-format
msgid "Can't check path '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:537 ../libsvn_subr/io.c:4558
+#: ../libsvn_subr/io.c:601 ../libsvn_subr/io.c:5135
#, c-format
msgid "Can't open '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:563 ../libsvn_subr/io.c:649
+#: ../libsvn_subr/io.c:627 ../libsvn_subr/io.c:713
#, c-format
msgid "Unable to make name for '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:636
+#: ../libsvn_subr/io.c:700
#, c-format
msgid "Can't create symbolic link '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:653 ../libsvn_subr/io.c:686 ../libsvn_subr/io.c:714
+#: ../libsvn_subr/io.c:717 ../libsvn_subr/io.c:752 ../libsvn_subr/io.c:780
+#: ../libsvn_subr/io.c:1965
msgid "Symbolic links are not supported on this platform"
msgstr ""
-#: ../libsvn_subr/io.c:676
+#: ../libsvn_subr/io.c:740 ../libsvn_subr/io.c:1924 ../libsvn_subr/io.c:1944
#, c-format
msgid "Can't read contents of link"
msgstr ""
-#: ../libsvn_subr/io.c:734
+#: ../libsvn_subr/io.c:800
#, c-format
msgid "Can't find a temporary directory"
msgstr ""
-#: ../libsvn_subr/io.c:852
+#: ../libsvn_subr/io.c:918
#, c-format
msgid "Can't copy '%s' to '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:895 ../libsvn_subr/io.c:917 ../libsvn_subr/io.c:963
-#: ../libsvn_subr/io.c:4691
+#: ../libsvn_subr/io.c:961 ../libsvn_subr/io.c:983 ../libsvn_subr/io.c:1029
+#: ../libsvn_subr/io.c:5267
#, c-format
msgid "Can't set permissions on '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:913 ../libsvn_subr/io.c:1984 ../libsvn_subr/io.c:2043
-#: ../libsvn_subr/io.c:4596
+#: ../libsvn_subr/io.c:979 ../libsvn_subr/io.c:2313 ../libsvn_subr/io.c:2372
+#: ../libsvn_subr/io.c:5173
#, c-format
msgid "Can't get file name"
msgstr ""
-#: ../libsvn_subr/io.c:987
+#: ../libsvn_subr/io.c:1052
#, c-format
msgid "Can't append '%s' to '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1033
+#: ../libsvn_subr/io.c:1098
#, c-format
msgid "Destination '%s' already exists"
msgstr ""
-#: ../libsvn_subr/io.c:1137
+#: ../libsvn_subr/io.c:1207
#, c-format
msgid "Can't make directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1206
+#: ../libsvn_subr/io.c:1311
#, c-format
msgid "Can't set access time of '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1535 ../libsvn_subr/io.c:1637
+#: ../libsvn_subr/io.c:1641 ../libsvn_subr/io.c:1743
#, c-format
msgid "Can't change perms of file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1803
+#: ../libsvn_subr/io.c:1871
#, c-format
-msgid "Can't set file '%s' read-only"
+msgid "Can't get attributes of file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1835
+#: ../libsvn_subr/io.c:1879
#, c-format
-msgid "Can't set file '%s' read-write"
+msgid "Can't set attributes of file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:1874 ../libsvn_subr/io.c:1908
+#: ../libsvn_subr/io.c:2016 ../libsvn_subr/io.c:2675
#, c-format
-msgid "Error getting UID of process"
+msgid "Can't remove file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2010
+#: ../libsvn_subr/io.c:2086 ../libsvn_subr/io.c:4218
#, c-format
-msgid "Can't get shared lock on file '%s'"
+msgid "Can't move '%s' to '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2048
+#: ../libsvn_subr/io.c:2132
#, c-format
-msgid "Can't unlock file '%s'"
+msgid "Can't set file '%s' read-only"
msgstr ""
-#: ../libsvn_subr/io.c:2103 ../libsvn_subr/io.c:3511
+#: ../libsvn_subr/io.c:2164
#, c-format
-msgid "Can't flush file '%s'"
+msgid "Can't set file '%s' read-write"
msgstr ""
-#: ../libsvn_subr/io.c:2104 ../libsvn_subr/io.c:3512
+#: ../libsvn_subr/io.c:2203 ../libsvn_subr/io.c:2237
#, c-format
-msgid "Can't flush stream"
+msgid "Error getting UID of process"
msgstr ""
-#: ../libsvn_subr/io.c:2116 ../libsvn_subr/io.c:2133
+#: ../libsvn_subr/io.c:2339
#, c-format
-msgid "Can't flush file to disk"
+msgid "Can't get shared lock on file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2225 ../libsvn_subr/prompt.c:197
-#: ../svnserve/svnserve.c:822
+#: ../libsvn_subr/io.c:2377
#, c-format
-msgid "Can't open stdin"
+msgid "Can't unlock file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2245
-msgid "Reading from stdin is disallowed"
+#: ../libsvn_subr/io.c:2475 ../libsvn_subr/io.c:2496
+#, c-format
+msgid "Can't flush file to disk"
msgstr ""
-#: ../libsvn_subr/io.c:2312
+#: ../libsvn_subr/io.c:2586 ../libsvn_subr/prompt.c:197
#, c-format
-msgid "Can't remove file '%s'"
+msgid "Can't open stdin"
msgstr ""
-#: ../libsvn_subr/io.c:2399
+#: ../libsvn_subr/io.c:2606
+msgid "Reading from stdin is disallowed"
+msgstr ""
+
+#: ../libsvn_subr/io.c:2762
#, c-format
msgid "Can't remove '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2562
+#: ../libsvn_subr/io.c:2925
#, c-format
msgid "Path '%s' not found, case obstructed by '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2601
+#: ../libsvn_subr/io.c:2964
#, c-format
msgid "Path '%s' not found"
msgstr ""
-#: ../libsvn_subr/io.c:2675
+#: ../libsvn_subr/io.c:3038
#, c-format
msgid "Can't create process '%s' attributes"
msgstr ""
-#: ../libsvn_subr/io.c:2682
+#: ../libsvn_subr/io.c:3045
#, c-format
msgid "Can't set process '%s' cmdtype"
msgstr ""
-#: ../libsvn_subr/io.c:2694
+#: ../libsvn_subr/io.c:3061
#, c-format
msgid "Can't set process '%s' directory"
msgstr ""
-#: ../libsvn_subr/io.c:2708
+#: ../libsvn_subr/io.c:3075
#, c-format
msgid "Can't set process '%s' child input"
msgstr ""
-#: ../libsvn_subr/io.c:2716
+#: ../libsvn_subr/io.c:3083
#, c-format
msgid "Can't set process '%s' child outfile"
msgstr ""
-#: ../libsvn_subr/io.c:2724
+#: ../libsvn_subr/io.c:3091
#, c-format
msgid "Can't set process '%s' child errfile"
msgstr ""
-#: ../libsvn_subr/io.c:2738
+#: ../libsvn_subr/io.c:3105
#, c-format
msgid "Can't set process '%s' stdio pipes"
msgstr ""
-#: ../libsvn_subr/io.c:2746
+#: ../libsvn_subr/io.c:3113
#, c-format
msgid "Can't set process '%s' child errfile for error handler"
msgstr ""
-#: ../libsvn_subr/io.c:2753
+#: ../libsvn_subr/io.c:3120
#, c-format
msgid "Can't set process '%s' error handler"
msgstr ""
-#: ../libsvn_subr/io.c:2776
+#: ../libsvn_subr/io.c:3143
#, c-format
msgid "Can't start process '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2800
+#: ../libsvn_subr/io.c:3167
#, c-format
msgid "Error waiting for process '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:2809
+#: ../libsvn_subr/io.c:3176
#, c-format
msgid "Process '%s' failed (signal %d, core dumped)"
msgstr ""
-#: ../libsvn_subr/io.c:2814
+#: ../libsvn_subr/io.c:3181
#, c-format
msgid "Process '%s' failed (signal %d)"
msgstr ""
-#: ../libsvn_subr/io.c:2820
+#: ../libsvn_subr/io.c:3187
#, c-format
msgid "Process '%s' failed (exitwhy %d, exitcode %d)"
msgstr ""
-#: ../libsvn_subr/io.c:2828
+#: ../libsvn_subr/io.c:3195
#, c-format
msgid "Process '%s' returned error exitcode %d"
msgstr ""
-#: ../libsvn_subr/io.c:2935
+#: ../libsvn_subr/io.c:3302
#, c-format
msgid "'%s' returned %d"
msgstr ""
-#: ../libsvn_subr/io.c:3055
+#: ../libsvn_subr/io.c:3423
#, c-format
msgid ""
"Error running '%s': exitcode was %d, args were:\n"
@@ -6141,204 +7092,222 @@ msgid ""
"%s"
msgstr ""
-#: ../libsvn_subr/io.c:3196
+#: ../libsvn_subr/io.c:3564
#, c-format
msgid "Can't detect MIME type of non-file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3291
+#: ../libsvn_subr/io.c:3659
#, c-format
msgid "Can't open file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3331
+#: ../libsvn_subr/io.c:3699
#, c-format
msgid "Can't close file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3332
+#: ../libsvn_subr/io.c:3700
#, c-format
msgid "Can't close stream"
msgstr ""
-#: ../libsvn_subr/io.c:3341 ../libsvn_subr/io.c:3377 ../libsvn_subr/io.c:3402
+#: ../libsvn_subr/io.c:3709 ../libsvn_subr/io.c:3745 ../libsvn_subr/io.c:3770
+#: ../libsvn_subr/io.c:3860
#, c-format
msgid "Can't read file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3342 ../libsvn_subr/io.c:3378 ../libsvn_subr/io.c:3403
+#: ../libsvn_subr/io.c:3710 ../libsvn_subr/io.c:3746 ../libsvn_subr/io.c:3771
+#: ../libsvn_subr/io.c:3861
#, c-format
msgid "Can't read stream"
msgstr ""
-#: ../libsvn_subr/io.c:3351
+#: ../libsvn_subr/io.c:3719
#, c-format
msgid "Can't write file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3352
+#: ../libsvn_subr/io.c:3720
#, c-format
msgid "Can't write stream"
msgstr ""
-#: ../libsvn_subr/io.c:3366
+#: ../libsvn_subr/io.c:3734
#, c-format
msgid "Can't get attribute information from file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3367
+#: ../libsvn_subr/io.c:3735
#, c-format
msgid "Can't get attribute information from stream"
msgstr ""
-#: ../libsvn_subr/io.c:3414
+#: ../libsvn_subr/io.c:3782
#, c-format
msgid "Can't set position pointer in file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3415
+#: ../libsvn_subr/io.c:3783
#, c-format
msgid "Can't set position pointer in stream"
msgstr ""
-#: ../libsvn_subr/io.c:3426 ../libsvn_subr/io.c:3473
+#: ../libsvn_subr/io.c:3870
+#, c-format
+msgid "Can't seek in file '%s'"
+msgstr ""
+
+#: ../libsvn_subr/io.c:3871
+#, c-format
+msgid "Can't seek in stream"
+msgstr ""
+
+#: ../libsvn_subr/io.c:3888 ../libsvn_subr/io.c:3945
#, c-format
msgid "Can't write to file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3427 ../libsvn_subr/io.c:3474
+#: ../libsvn_subr/io.c:3889 ../libsvn_subr/io.c:3946
#, c-format
msgid "Can't write to stream"
msgstr ""
-#: ../libsvn_subr/io.c:3516
+#: ../libsvn_subr/io.c:3899 ../libsvn_subr/io.c:4071
+#, c-format
+msgid "Can't flush file '%s'"
+msgstr ""
+
+#: ../libsvn_subr/io.c:3900 ../libsvn_subr/io.c:4072
+#, c-format
+msgid "Can't flush stream"
+msgstr ""
+
+#: ../libsvn_subr/io.c:4020
+#, c-format
+msgid "Can't write '%s' atomically"
+msgstr ""
+
+#: ../libsvn_subr/io.c:4076
#, c-format
msgid "Can't truncate file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3517
+#: ../libsvn_subr/io.c:4077
#, c-format
msgid "Can't truncate stream"
msgstr ""
-#: ../libsvn_subr/io.c:3590
+#: ../libsvn_subr/io.c:4157
#, c-format
msgid "Can't read length line in file '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3594
+#: ../libsvn_subr/io.c:4161
msgid "Can't read length line in stream"
msgstr ""
-#: ../libsvn_subr/io.c:3651
-#, c-format
-msgid "Can't move '%s' to '%s'"
-msgstr ""
-
-#: ../libsvn_subr/io.c:3732
+#: ../libsvn_subr/io.c:4305
#, c-format
msgid "Can't create directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3755
+#: ../libsvn_subr/io.c:4317 ../libsvn_subr/io.c:4331
#, c-format
msgid "Can't hide directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3815 ../libsvn_subr/io.c:3938
+#: ../libsvn_subr/io.c:4392 ../libsvn_subr/io.c:4515
#, c-format
msgid "Can't open directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3850
+#: ../libsvn_subr/io.c:4427
#, c-format
msgid "Can't remove directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:3868
+#: ../libsvn_subr/io.c:4445
#, c-format
msgid "Can't read directory"
msgstr ""
-#: ../libsvn_subr/io.c:3888
+#: ../libsvn_subr/io.c:4465
#, c-format
msgid "Error closing directory"
msgstr ""
-#: ../libsvn_subr/io.c:3957
+#: ../libsvn_subr/io.c:4534
#, c-format
msgid "Can't read directory entry in '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:4083
+#: ../libsvn_subr/io.c:4660
#, c-format
msgid "Can't check directory '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:4145
+#: ../libsvn_subr/io.c:4722
#, c-format
msgid "Reading '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:4164
+#: ../libsvn_subr/io.c:4741
#, c-format
msgid "First line of '%s' contains non-digit"
msgstr ""
-#: ../libsvn_subr/io.c:4479
+#: ../libsvn_subr/io.c:5056
#, c-format
msgid "Can't create temporary file from template '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:4568
+#: ../libsvn_subr/io.c:5145
#, c-format
msgid "Can't set aside '%s'"
msgstr ""
-#: ../libsvn_subr/io.c:4580
+#: ../libsvn_subr/io.c:5157 ../libsvn_subr/stream.c:2083
#, c-format
msgid "Unable to make name in '%s'"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:100 ../libsvn_subr/mergeinfo.c:714
+#: ../libsvn_subr/mergeinfo.c:101 ../libsvn_subr/mergeinfo.c:714
msgid "Pathname not terminated by ':'"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:103
-msgid "No pathname preceding ':'"
-msgstr ""
-
-#: ../libsvn_subr/mergeinfo.c:521
+#: ../libsvn_subr/mergeinfo.c:518
#, c-format
msgid "Invalid character '%c' found in revision list"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:529
+#: ../libsvn_subr/mergeinfo.c:526
#, c-format
msgid "Invalid revision number '0' found in range list"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:540
+#: ../libsvn_subr/mergeinfo.c:537
#, c-format
msgid "Unable to parse reversed revision range '%ld-%ld'"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:545
+#: ../libsvn_subr/mergeinfo.c:542
#, c-format
msgid ""
"Unable to parse revision range '%ld-%ld' with same start and end revisions"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:582 ../libsvn_subr/mergeinfo.c:589
+#: ../libsvn_subr/mergeinfo.c:579 ../libsvn_subr/mergeinfo.c:586
#, c-format
msgid "Invalid character '%c' found in range list"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:596
+#: ../libsvn_subr/mergeinfo.c:593
msgid "Range list parsing ended before hitting newline"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:674
+#: ../libsvn_subr/mergeinfo.c:670
#, c-format
msgid ""
"Unable to parse overlapping revision ranges '%s' and '%s' with different "
@@ -6355,73 +7324,39 @@ msgstr ""
msgid "Could not find end of line in range list line in '%s'"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:786
+#: ../libsvn_subr/mergeinfo.c:790
#, c-format
msgid "Could not parse mergeinfo string '%s'"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:2350
+#: ../libsvn_subr/mergeinfo.c:2367
msgid "NULL mergeinfo catalog\n"
msgstr ""
-#: ../libsvn_subr/mergeinfo.c:2355
+#: ../libsvn_subr/mergeinfo.c:2372
msgid "empty mergeinfo catalog\n"
msgstr ""
-#: ../libsvn_subr/mutex.c:45
+#: ../libsvn_subr/mutex.c:69
#, c-format
msgid "Can't create mutex"
msgstr ""
-#: ../libsvn_subr/mutex.c:62
+#: ../libsvn_subr/mutex.c:86
#, c-format
msgid "Can't lock mutex"
msgstr ""
-#: ../libsvn_subr/mutex.c:78
+#: ../libsvn_subr/mutex.c:102
#, c-format
msgid "Can't unlock mutex"
msgstr ""
-#: ../libsvn_subr/named_atomic.c:335
-msgid "Not a valid atomic"
-msgstr ""
-
-#: ../libsvn_subr/named_atomic.c:474
+#: ../libsvn_subr/nls.c:69
#, c-format
-msgid "MMAP failed for file '%s'"
-msgstr ""
-
-#: ../libsvn_subr/named_atomic.c:486
-msgid "Number of atomics in namespace is too large."
-msgstr ""
-
-#: ../libsvn_subr/named_atomic.c:537
-msgid "Atomic's name is too long."
-msgstr ""
-
-#: ../libsvn_subr/named_atomic.c:543
-msgid "Namespace has not been initialized."
-msgstr ""
-
-#: ../libsvn_subr/named_atomic.c:591
-msgid "Out of slots for named atomic."
-msgstr ""
-
-#: ../libsvn_subr/nls.c:80
-#, c-format
-msgid "Can't convert string to UCS-2: '%s'"
-msgstr ""
-
-#: ../libsvn_subr/nls.c:87
msgid "Can't get module file name"
msgstr ""
-#: ../libsvn_subr/nls.c:102
-#, c-format
-msgid "Can't convert module path to UTF-8 from UCS-2: '%s'"
-msgstr ""
-
#: ../libsvn_subr/opt.c:189
msgid " ARG"
msgstr ""
@@ -6446,28 +7381,23 @@ msgstr ""
msgid "Revision property pair is empty"
msgstr ""
-#: ../libsvn_subr/opt.c:981 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:336
+#: ../libsvn_subr/opt.c:981 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:338
#: ../svn/propset-cmd.c:68
#, c-format
msgid "'%s' is not a valid Subversion property name"
msgstr ""
-#: ../libsvn_subr/opt.c:1018
-#, c-format
-msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
-msgstr ""
-
-#: ../libsvn_subr/opt.c:1064
+#: ../libsvn_subr/opt.c:1057
#, c-format
msgid "URL '%s' contains a '..' element"
msgstr ""
-#: ../libsvn_subr/opt.c:1097
+#: ../libsvn_subr/opt.c:1090
#, c-format
msgid "Error resolving case of '%s'"
msgstr ""
-#: ../libsvn_subr/opt.c:1119
+#: ../libsvn_subr/opt.c:1112
#, c-format
msgid ""
"%s, version %s\n"
@@ -6475,36 +7405,44 @@ msgid ""
"\n"
msgstr ""
-#: ../libsvn_subr/opt.c:1136
+#: ../libsvn_subr/opt.c:1129
msgid ""
"System information:\n"
"\n"
msgstr ""
-#: ../libsvn_subr/opt.c:1137
+#: ../libsvn_subr/opt.c:1130
#, c-format
msgid "* running on %s\n"
msgstr ""
-#: ../libsvn_subr/opt.c:1141
+#: ../libsvn_subr/opt.c:1134
#, c-format
msgid " - %s\n"
msgstr ""
-#: ../libsvn_subr/opt.c:1151
+#: ../libsvn_subr/opt.c:1144
msgid "* linked dependencies:\n"
msgstr ""
-#: ../libsvn_subr/opt.c:1176
+#: ../libsvn_subr/opt.c:1169
msgid "* loaded shared libraries:\n"
msgstr ""
+#: ../libsvn_subr/packed_data.c:736
+msgid "Unexpected end of stream"
+msgstr ""
+
+#: ../libsvn_subr/packed_data.c:742
+msgid "Integer representation too long"
+msgstr ""
+
#: ../libsvn_subr/path.c:1114
#, c-format
msgid "Can't determine the native path encoding"
msgstr ""
-#: ../libsvn_subr/path.c:1303
+#: ../libsvn_subr/path.c:1299
#, c-format
msgid "Improper relative URL '%s'"
msgstr ""
@@ -6518,57 +7456,52 @@ msgstr ""
msgid "Can't open stderr"
msgstr ""
-#: ../libsvn_subr/prompt.c:263
-#, c-format
-msgid "Can't write to terminal"
-msgstr ""
-
-#: ../libsvn_subr/prompt.c:385 ../libsvn_subr/prompt.c:472
+#: ../libsvn_subr/prompt.c:381 ../libsvn_subr/prompt.c:468
#, c-format
msgid "Can't read from terminal"
msgstr ""
-#: ../libsvn_subr/prompt.c:540
+#: ../libsvn_subr/prompt.c:536
msgid "End of file while reading from terminal"
msgstr ""
-#: ../libsvn_subr/prompt.c:602
+#: ../libsvn_subr/prompt.c:598 ../svn/auth-cmd.c:312
#, c-format
msgid "Authentication realm: %s\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:629 ../libsvn_subr/prompt.c:652
+#: ../libsvn_subr/prompt.c:625 ../libsvn_subr/prompt.c:648
msgid "Username: "
msgstr ""
-#: ../libsvn_subr/prompt.c:674
+#: ../libsvn_subr/prompt.c:670
#, c-format
msgid "Error validating server certificate for '%s':\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:680
+#: ../libsvn_subr/prompt.c:676
msgid ""
" - The certificate is not issued by a trusted authority. Use the\n"
" fingerprint to validate the certificate manually!\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:687
+#: ../libsvn_subr/prompt.c:683
msgid " - The certificate hostname does not match.\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:693
+#: ../libsvn_subr/prompt.c:689
msgid " - The certificate is not yet valid.\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:699
+#: ../libsvn_subr/prompt.c:695
msgid " - The certificate has expired.\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:705
+#: ../libsvn_subr/prompt.c:701
msgid " - The certificate has an unknown error.\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:710
+#: ../libsvn_subr/prompt.c:706
#, c-format
msgid ""
"Certificate information:\n"
@@ -6578,48 +7511,48 @@ msgid ""
" - Fingerprint: %s\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:725
+#: ../libsvn_subr/prompt.c:721
msgid "(R)eject, accept (t)emporarily or accept (p)ermanently? "
msgstr ""
-#: ../libsvn_subr/prompt.c:729
+#: ../libsvn_subr/prompt.c:725
msgid "(R)eject or accept (t)emporarily? "
msgstr ""
-#: ../libsvn_subr/prompt.c:769
+#: ../libsvn_subr/prompt.c:765
msgid "Client certificate filename: "
msgstr ""
-#: ../libsvn_subr/prompt.c:793
+#: ../libsvn_subr/prompt.c:789
#, c-format
msgid "Passphrase for '%s': "
msgstr ""
-#: ../libsvn_subr/prompt.c:845
+#: ../libsvn_subr/prompt.c:840
msgid "yes"
msgstr ""
-#: ../libsvn_subr/prompt.c:846
+#: ../libsvn_subr/prompt.c:841
msgid "y"
msgstr ""
-#: ../libsvn_subr/prompt.c:851
+#: ../libsvn_subr/prompt.c:846
msgid "no"
msgstr ""
-#: ../libsvn_subr/prompt.c:852
+#: ../libsvn_subr/prompt.c:847
msgid "n"
msgstr ""
-#: ../libsvn_subr/prompt.c:858
+#: ../libsvn_subr/prompt.c:853
msgid "Please type 'yes' or 'no': "
msgstr ""
-#: ../libsvn_subr/prompt.c:872
+#: ../libsvn_subr/prompt.c:867
msgid "Store password unencrypted (yes/no)? "
msgstr ""
-#: ../libsvn_subr/prompt.c:874
+#: ../libsvn_subr/prompt.c:869
#, c-format
msgid ""
"\n"
@@ -6638,11 +7571,11 @@ msgid ""
"-----------------------------------------------------------------------\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:901
+#: ../libsvn_subr/prompt.c:896
msgid "Store passphrase unencrypted (yes/no)? "
msgstr ""
-#: ../libsvn_subr/prompt.c:903
+#: ../libsvn_subr/prompt.c:898
#, c-format
msgid ""
"\n"
@@ -6661,81 +7594,99 @@ msgid ""
"-----------------------------------------------------------------------\n"
msgstr ""
-#: ../libsvn_subr/prompt.c:949
+#: ../libsvn_subr/prompt.c:944
#, c-format
msgid "Password for '%s' GNOME keyring: "
msgstr ""
-#: ../libsvn_subr/simple_providers.c:449
-#: ../libsvn_subr/ssl_client_cert_pw_providers.c:296
+#: ../libsvn_subr/simple_providers.c:444
+#: ../libsvn_subr/ssl_client_cert_pw_providers.c:286
#, c-format
msgid "Config error: invalid value '%s' for option '%s'"
msgstr ""
-#: ../libsvn_subr/sqlite.c:176
+#: ../libsvn_subr/sqlite.c:242
#, c-format
msgid "sqlite[S%d]: %s, executing statement '%s'"
msgstr ""
-#: ../libsvn_subr/sqlite.c:265
+#: ../libsvn_subr/sqlite.c:331
msgid "sqlite: Expected database row missing"
msgstr ""
-#: ../libsvn_subr/sqlite.c:266
+#: ../libsvn_subr/sqlite.c:332
msgid "sqlite: Extra database row found"
msgstr ""
-#: ../libsvn_subr/sqlite.c:726
+#: ../libsvn_subr/sqlite.c:803
#, c-format
msgid "SQLite compiled for %s, but running with %s"
msgstr ""
-#: ../libsvn_subr/sqlite.c:738
+#: ../libsvn_subr/sqlite.c:815
msgid "SQLite is required to be compiled and run in thread-safe mode"
msgstr ""
-#: ../libsvn_subr/sqlite.c:747
+#: ../libsvn_subr/sqlite.c:824
#, c-format
msgid "Could not configure SQLite [S%d]"
msgstr ""
-#: ../libsvn_subr/sqlite.c:749
+#: ../libsvn_subr/sqlite.c:826
msgid "Could not initialize SQLite"
msgstr ""
-#: ../libsvn_subr/sqlite.c:1219
+#: ../libsvn_subr/sqlite.c:1307
+msgid "SQLite transaction rollback failed"
+msgstr ""
+
+#: ../libsvn_subr/sqlite.c:1488
#, c-format
msgid "SQLite hotcopy failed for %s"
msgstr ""
-#: ../libsvn_subr/string.c:943 ../libsvn_subr/string.c:987
+#: ../libsvn_subr/stream.c:969
+#, c-format
+msgid "Polling for available data on filestream failed"
+msgstr ""
+
+#: ../libsvn_subr/stream.c:989
+msgid "Windows doesn't support polling on files"
+msgstr ""
+
+#: ../libsvn_subr/string.c:981 ../libsvn_subr/string.c:1025
#, c-format
msgid "Could not convert '%s' into a number"
msgstr ""
-#: ../libsvn_subr/subst.c:1803 ../libsvn_wc/props.c:1660
+#: ../libsvn_subr/subst.c:1820 ../libsvn_wc/props.c:1767
#, c-format
msgid "File '%s' has inconsistent newlines"
msgstr ""
-#: ../libsvn_subr/sysinfo.c:1106
+#: ../libsvn_subr/subst.c:1858
+#, c-format
+msgid "Can't read special file: File '%s' not found"
+msgstr ""
+
+#: ../libsvn_subr/sysinfo.c:1228
msgid "Intel"
msgstr ""
-#: ../libsvn_subr/sysinfo.c:1107
+#: ../libsvn_subr/sysinfo.c:1229
msgid "Intel 64-bit"
msgstr ""
-#: ../libsvn_subr/sysinfo.c:1108
+#: ../libsvn_subr/sysinfo.c:1230
msgid "PowerPC"
msgstr ""
-#: ../libsvn_subr/sysinfo.c:1109
+#: ../libsvn_subr/sysinfo.c:1231
msgid "PowerPC 64-bit"
msgstr ""
#. Human explanatory part, generated by apr_strftime as "Sat, 01 Jan 2000"
-#: ../libsvn_subr/time.c:85
+#: ../libsvn_subr/time.c:87
msgid " (%a, %d %b %Y)"
msgstr ""
@@ -6744,14 +7695,24 @@ msgstr ""
msgid "Token '%s' is unrecognized"
msgstr ""
-#: ../libsvn_subr/types.c:48
+#: ../libsvn_subr/types.c:52
+#, c-format
+msgid "Negative revision number found parsing '%s'"
+msgstr ""
+
+#: ../libsvn_subr/types.c:53
#, c-format
msgid "Invalid revision number found parsing '%s'"
msgstr ""
-#: ../libsvn_subr/types.c:60
+#: ../libsvn_subr/types.c:64
#, c-format
-msgid "Negative revision number found parsing '%s'"
+msgid "Revision number longer than 10 digits '%s'"
+msgstr ""
+
+#: ../libsvn_subr/types.c:70
+#, c-format
+msgid "Revision number too large '%s'"
msgstr ""
#: ../libsvn_subr/utf.c:245
@@ -6769,35 +7730,35 @@ msgstr ""
msgid "Can't create a character converter from '%s' to '%s'"
msgstr ""
-#: ../libsvn_subr/utf.c:601
+#: ../libsvn_subr/utf.c:548
#, c-format
msgid "Can't convert string from native encoding to '%s':"
msgstr ""
-#: ../libsvn_subr/utf.c:605
+#: ../libsvn_subr/utf.c:552
#, c-format
msgid "Can't convert string from '%s' to native encoding:"
msgstr ""
-#: ../libsvn_subr/utf.c:609
+#: ../libsvn_subr/utf.c:556
#, c-format
msgid "Can't convert string from '%s' to '%s':"
msgstr ""
-#: ../libsvn_subr/utf.c:654
+#: ../libsvn_subr/utf.c:601
#, c-format
msgid ""
"Safe data '%s' was followed by non-ASCII byte %d: unable to convert to/from "
"UTF-8"
msgstr ""
-#: ../libsvn_subr/utf.c:662
+#: ../libsvn_subr/utf.c:609
#, c-format
msgid ""
"Non-ASCII character (code %d) detected, and unable to convert to/from UTF-8"
msgstr ""
-#: ../libsvn_subr/utf.c:707
+#: ../libsvn_subr/utf.c:654
#, c-format
msgid ""
"Valid UTF-8 data\n"
@@ -6806,6 +7767,58 @@ msgid ""
"(hex:%s)"
msgstr ""
+#: ../libsvn_subr/utf.c:1202 ../libsvn_subr/utf.c:1211
+#, c-format
+msgid "Conversion to UTF-16 failed"
+msgstr ""
+
+#: ../libsvn_subr/utf.c:1240 ../libsvn_subr/utf.c:1250
+#, c-format
+msgid "Conversion from UTF-16 failed"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:227
+#, c-format
+msgid "Invalid Unicode character U+%04lX"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:264
+msgid "Cannot use a custom escape token in glob matching mode"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:295
+msgid "Escape token must be one character"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:298
+#, c-format
+msgid "Invalid escape character U+%04lX"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:117
+msgid "Memory for processing UTF-8 data could not be allocated."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:119
+msgid "UTF-8 string is too long to be processed."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:121
+msgid "Invalid UTF-8 string"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:123
+msgid "Unassigned Unicode code point found in UTF-8 string."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:125
+msgid "Invalid options for UTF-8 processing chosen."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:127
+msgid "An unknown error occured while processing UTF-8 data."
+msgstr ""
+
#: ../libsvn_subr/validate.c:56
#, c-format
msgid "MIME type '%s' has empty media type"
@@ -6841,7 +7854,7 @@ msgstr ""
#: ../libsvn_subr/version.c:139
msgid ""
-"Copyright (C) 2014 The Apache Software Foundation.\n"
+"Copyright (C) 2017 The Apache Software Foundation.\n"
"This software consists of contributions made by many people;\n"
"see the NOTICE file for more information.\n"
"Subversion is open source software, see http://subversion.apache.org/\n"
@@ -6854,36 +7867,36 @@ msgstr ""
msgid "Failed to parse version number string '%s'"
msgstr ""
-#: ../libsvn_subr/xml.c:416
+#: ../libsvn_subr/xml.c:475
#, c-format
msgid "Malformed XML: %s at line %ld"
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:114
+#: ../libsvn_wc/adm_crawler.c:119
#, c-format
msgid "The existing node '%s' can not be restored."
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:133
+#: ../libsvn_wc/adm_crawler.c:138
#, c-format
msgid "The node '%s' can not be restored."
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:851
+#: ../libsvn_wc/adm_crawler.c:865
msgid "Error aborting report"
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:963
+#: ../libsvn_wc/adm_crawler.c:978
#, c-format
msgid "Pristine checksum for file '%s' is missing"
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:1128
+#: ../libsvn_wc/adm_crawler.c:1152
#, c-format
msgid "Checksum mismatch for text base of '%s'"
msgstr ""
-#: ../libsvn_wc/adm_crawler.c:1139
+#: ../libsvn_wc/adm_crawler.c:1163
#, c-format
msgid "While preparing '%s' for commit"
msgstr ""
@@ -6916,50 +7929,50 @@ msgstr ""
msgid "Node '%s' has no pristine text"
msgstr ""
-#: ../libsvn_wc/adm_files.c:452
+#: ../libsvn_wc/adm_files.c:420
#, c-format
msgid "Revision %ld doesn't match existing revision %ld in '%s'"
msgstr ""
-#: ../libsvn_wc/adm_files.c:489
+#: ../libsvn_wc/adm_files.c:460
#, c-format
msgid ""
"URL '%s' (uuid: '%s') doesn't match existing URL '%s' (uuid: '%s') in '%s'"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:602 ../libsvn_wc/update_editor.c:5279
+#: ../libsvn_wc/adm_ops.c:313 ../libsvn_wc/update_editor.c:5334
#, c-format
msgid "Can't find parent directory's node while trying to add '%s'"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:611 ../libsvn_wc/update_editor.c:5273
+#: ../libsvn_wc/adm_ops.c:322 ../libsvn_wc/update_editor.c:5328
#, c-format
msgid "Can't add '%s' to a parent directory scheduled for deletion"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:618 ../libsvn_wc/update_editor.c:5286
+#: ../libsvn_wc/adm_ops.c:329 ../libsvn_wc/update_editor.c:5341
#, c-format
msgid "Can't schedule an addition of '%s' below a not-directory node"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:677
+#: ../libsvn_wc/adm_ops.c:390
#, c-format
msgid "Can't create an entry with a reserved name while trying to add '%s'"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:881
+#: ../libsvn_wc/adm_ops.c:594
#, c-format
msgid "The URL '%s' has a different repository root than its parent"
msgstr ""
-#: ../libsvn_wc/adm_ops.c:899
+#: ../libsvn_wc/adm_ops.c:614
#, c-format
msgid ""
"Can't schedule the working copy at '%s' from repository '%s' with uuid '%s' "
"for addition under a working copy from repository '%s' with uuid '%s'."
msgstr ""
-#: ../libsvn_wc/adm_ops.c:913
+#: ../libsvn_wc/adm_ops.c:628
#, c-format
msgid "Can't add '%s' with URL '%s', but with the data from '%s'"
msgstr ""
@@ -6977,241 +7990,273 @@ msgstr ""
msgid "Not a conflict skel"
msgstr ""
-#: ../libsvn_wc/conflicts.c:610 ../libsvn_wc/conflicts.c:707
+#: ../libsvn_wc/conflicts.c:607 ../libsvn_wc/conflicts.c:704
msgid "Not a completed conflict skel"
msgstr ""
-#: ../libsvn_wc/conflicts.c:788 ../libsvn_wc/conflicts.c:861
-#: ../libsvn_wc/conflicts.c:951
+#: ../libsvn_wc/conflicts.c:785 ../libsvn_wc/conflicts.c:858
+#: ../libsvn_wc/conflicts.c:948
msgid "Conflict not set"
msgstr ""
-#: ../libsvn_wc/conflicts.c:1438 ../libsvn_wc/conflicts.c:1790
+#: ../libsvn_wc/conflicts.c:1315 ../libsvn_wc/conflicts.c:1990
+#: ../libsvn_wc/conflicts.c:2035
msgid "Conflict callback violated API: returned no results"
msgstr ""
-#: ../libsvn_wc/conflicts.c:1482
+#: ../libsvn_wc/conflicts.c:1360
msgid "Conflict callback violated API: returned no merged file"
msgstr ""
-#: ../libsvn_wc/conflicts.c:2468 ../libsvn_wc/conflicts.c:2644
+#: ../libsvn_wc/conflicts.c:1645
+#, c-format
+msgid ""
+"Conflict on '%s' cannot be resolved to 'theirs-conflict' or 'mine-conflict' "
+"because a merged version of the file cannot be created."
+msgstr ""
+
+#: ../libsvn_wc/conflicts.c:1690
+#, c-format
+msgid ""
+"Conflict on '%s' could not be resolved because the chosen version of the "
+"file is not available."
+msgstr ""
+
+#: ../libsvn_wc/conflicts.c:2497
msgid "Invalid 'conflict_result' argument"
msgstr ""
-#: ../libsvn_wc/conflicts.c:2767 ../libsvn_wc/conflicts.c:2807
+#: ../libsvn_wc/conflicts.c:2740 ../libsvn_wc/conflicts.c:2798
#, c-format
msgid ""
"Tree conflict can only be resolved to 'working' or 'mine-conflict' state; "
"'%s' not resolved"
msgstr ""
-#: ../libsvn_wc/conflicts.c:2822
+#: ../libsvn_wc/conflicts.c:2825
+#, c-format
+msgid ""
+"Tree conflict can only be resolved to 'working' state; '%s' is no longer "
+"moved"
+msgstr ""
+
+#: ../libsvn_wc/conflicts.c:2843
#, c-format
msgid ""
"Tree conflict can only be resolved to 'working' state; '%s' not resolved"
msgstr ""
-#: ../libsvn_wc/conflicts.c:2931
+#: ../libsvn_wc/conflicts.c:3020
msgid "No conflict-callback and no pre-defined conflict-choice provided"
msgstr ""
-#: ../libsvn_wc/copy.c:86
+#: ../libsvn_wc/conflicts.c:3263
+#, c-format
+msgid "Unable to resolve pending conflict on '%s'"
+msgstr ""
+
+#: ../libsvn_wc/conflicts.c:3275
+#, c-format
+msgid "Unable to resolve conflicts on '%s'"
+msgstr ""
+
+#: ../libsvn_wc/copy.c:103
#, c-format
msgid "Source '%s' is unexpected kind"
msgstr ""
-#: ../libsvn_wc/copy.c:410
+#: ../libsvn_wc/copy.c:471
#, c-format
msgid "cannot handle node kind for '%s'"
msgstr ""
-#: ../libsvn_wc/copy.c:432 ../libsvn_wc/wc_db.c:4524 ../libsvn_wc/wc_db.c:5099
+#: ../libsvn_wc/copy.c:493 ../libsvn_wc/wc_db.c:4626 ../libsvn_wc/wc_db.c:5429
#, c-format
msgid "Cannot handle status of '%s'"
msgstr ""
-#: ../libsvn_wc/copy.c:441 ../libsvn_wc/wc_db.c:4515 ../libsvn_wc/wc_db.c:5093
-#: ../libsvn_wc/wc_db.c:5338
+#: ../libsvn_wc/copy.c:502 ../libsvn_wc/wc_db.c:4617 ../libsvn_wc/wc_db.c:5423
+#: ../libsvn_wc/wc_db.c:5667
#, c-format
msgid "Cannot copy '%s' excluded by server"
msgstr ""
-#: ../libsvn_wc/copy.c:578
+#: ../libsvn_wc/copy.c:643
#, c-format
msgid "Deleted node '%s' can't be copied."
msgstr ""
-#: ../libsvn_wc/copy.c:596
+#: ../libsvn_wc/copy.c:661
#, c-format
msgid "'%s' is the root of a working copy and cannot be moved"
msgstr ""
-#: ../libsvn_wc/copy.c:604
+#: ../libsvn_wc/copy.c:669
#, c-format
msgid "'%s' represents the repository root and cannot be moved"
msgstr ""
-#: ../libsvn_wc/copy.c:673
+#: ../libsvn_wc/copy.c:744
#, c-format
msgid "Cannot copy to '%s', as it is not from repository '%s'; it is from '%s'"
msgstr ""
-#: ../libsvn_wc/copy.c:681
+#: ../libsvn_wc/copy.c:752
#, c-format
msgid "Cannot copy to '%s' as it is scheduled for deletion"
msgstr ""
-#: ../libsvn_wc/copy.c:709
+#: ../libsvn_wc/copy.c:780
#, c-format
msgid "'%s' is already under version control but is excluded."
msgstr ""
-#: ../libsvn_wc/copy.c:724
+#: ../libsvn_wc/copy.c:795
#, c-format
msgid "There is already a versioned item '%s'"
msgstr ""
-#: ../libsvn_wc/copy.c:740
+#: ../libsvn_wc/copy.c:811
#, c-format
msgid "'%s' already exists and is in the way"
msgstr ""
-#: ../libsvn_wc/copy.c:791
+#: ../libsvn_wc/copy.c:863
#, c-format
msgid ""
"Cannot move mixed-revision subtree '%s' [%ld:%ld]; try updating it first"
msgstr ""
-#: ../libsvn_wc/crop.c:208
+#: ../libsvn_wc/crop.c:206
#, c-format
msgid "Cannot exclude '%s': it is a working copy root"
msgstr ""
-#: ../libsvn_wc/crop.c:216
+#: ../libsvn_wc/crop.c:214
#, c-format
msgid "Cannot exclude '%s': it is a switched path"
msgstr ""
-#: ../libsvn_wc/crop.c:243
+#: ../libsvn_wc/crop.c:241
#, c-format
msgid ""
"Cannot exclude '%s': it is to be added to the repository. Try commit instead"
msgstr ""
-#: ../libsvn_wc/crop.c:250
+#: ../libsvn_wc/crop.c:248
#, c-format
msgid ""
"Cannot exclude '%s': it is to be deleted from the repository. Try commit "
"instead"
msgstr ""
-#: ../libsvn_wc/crop.c:309
+#: ../libsvn_wc/crop.c:319
msgid "Can only crop a working copy with a restrictive depth"
msgstr ""
-#: ../libsvn_wc/crop.c:320
+#: ../libsvn_wc/crop.c:330
msgid "Can only crop directories"
msgstr ""
-#: ../libsvn_wc/crop.c:333
+#: ../libsvn_wc/crop.c:343
#, c-format
msgid ""
"Cannot crop '%s': it is going to be removed from repository. Try commit "
"instead"
msgstr ""
-#: ../libsvn_wc/crop.c:340
+#: ../libsvn_wc/crop.c:350
#, c-format
msgid ""
"Cannot crop '%s': it is to be added to the repository. Try commit instead"
msgstr ""
-#: ../libsvn_wc/delete.c:237 ../libsvn_wc/delete.c:357
+#: ../libsvn_wc/delete.c:238 ../libsvn_wc/delete.c:358
#, c-format
msgid "'%s' cannot be deleted"
msgstr ""
-#: ../libsvn_wc/delete.c:255 ../libsvn_wc/delete.c:373
+#: ../libsvn_wc/delete.c:256 ../libsvn_wc/delete.c:374
#, c-format
msgid "'%s' is the root of a working copy and cannot be deleted"
msgstr ""
-#: ../libsvn_wc/delete.c:262 ../libsvn_wc/delete.c:379
+#: ../libsvn_wc/delete.c:263 ../libsvn_wc/delete.c:380
#, c-format
msgid "'%s' represents the repository root and cannot be deleted"
msgstr ""
-#: ../libsvn_wc/delete.c:476
+#: ../libsvn_wc/delete.c:474
#, c-format
msgid "File '%s' has local modifications"
msgstr ""
-#: ../libsvn_wc/deprecated.c:2284
+#: ../libsvn_wc/deprecated.c:2363
#, c-format
msgid "Unexpectedly found '%s': path is marked 'missing'"
msgstr ""
-#: ../libsvn_wc/entries.c:1044
+#: ../libsvn_wc/entries.c:1100
#, c-format
msgid "'%s' is not a versioned working copy"
msgstr ""
-#: ../libsvn_wc/entries.c:1290
+#: ../libsvn_wc/entries.c:1396
#, c-format
msgid "Admin area of '%s' is missing"
msgstr ""
-#: ../libsvn_wc/entries.c:1310
+#: ../libsvn_wc/entries.c:1416
#, c-format
msgid "'%s' is not of the right kind"
msgstr ""
-#: ../libsvn_wc/entries.c:1507
+#: ../libsvn_wc/entries.c:1578
#, c-format
msgid "The file '%s' has no checksum"
msgstr ""
-#: ../libsvn_wc/entries.c:1619
+#: ../libsvn_wc/entries.c:1696
#, c-format
msgid "Unable to upgrade '%s' at line %d"
msgstr ""
-#: ../libsvn_wc/entries.c:1837
+#: ../libsvn_wc/entries.c:1935
#, c-format
msgid "No copyfrom URL for '%s'"
msgstr ""
-#: ../libsvn_wc/entries.c:2051
+#: ../libsvn_wc/entries.c:2167
#, c-format
msgid "Bad base MD5 checksum for '%s'; expected: '%s'; found '%s'; "
msgstr ""
-#: ../libsvn_wc/entries.c:2399
+#: ../libsvn_wc/entries.c:2520
#, c-format
msgid "No default entry in directory '%s'"
msgstr ""
-#: ../libsvn_wc/entries.c:2555
+#: ../libsvn_wc/entries.c:2676
#, c-format
msgid "Directory '%s' has no THIS_DIR entry"
msgstr ""
-#: ../libsvn_wc/entries.c:2736 ../libsvn_wc/node.c:528
+#: ../libsvn_wc/entries.c:2856 ../libsvn_wc/node.c:403
#, c-format
msgid "'%s' has an unrecognized node kind"
msgstr ""
-#: ../libsvn_wc/externals.c:154 ../libsvn_wc/externals.c:232
+#: ../libsvn_wc/externals.c:158 ../libsvn_wc/externals.c:247
#, c-format
msgid "Error parsing %s property on '%s': '%s'"
msgstr ""
-#: ../libsvn_wc/externals.c:202
+#: ../libsvn_wc/externals.c:214
#, c-format
msgid "Can't split line into components: '%s'"
msgstr ""
-#: ../libsvn_wc/externals.c:257
+#: ../libsvn_wc/externals.c:273
#, c-format
msgid ""
"Invalid %s property on '%s': cannot use two absolute URLs ('%s' and '%s') in "
@@ -7219,50 +8264,50 @@ msgid ""
"out to"
msgstr ""
-#: ../libsvn_wc/externals.c:266 ../libsvn_wc/externals.c:274
+#: ../libsvn_wc/externals.c:282 ../libsvn_wc/externals.c:290
#, c-format
msgid ""
"Invalid %s property on '%s': cannot use a URL '%s' as the target directory "
"for an external definition"
msgstr ""
-#: ../libsvn_wc/externals.c:316
+#: ../libsvn_wc/externals.c:354
#, c-format
msgid ""
"Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
msgstr ""
-#: ../libsvn_wc/externals.c:491 ../libsvn_wc/externals.c:514
+#: ../libsvn_wc/externals.c:547 ../libsvn_wc/externals.c:570
#, c-format
msgid "This editor can only update '%s'"
msgstr ""
-#: ../libsvn_wc/externals.c:529 ../libsvn_wc/externals.c:976
+#: ../libsvn_wc/externals.c:586
#, c-format
msgid "Node '%s' is no existing file external"
msgstr ""
-#: ../libsvn_wc/externals.c:1551
+#: ../libsvn_wc/externals.c:1577
#, c-format
msgid "URL '%s' does not begin with a scheme"
msgstr ""
-#: ../libsvn_wc/externals.c:1606
+#: ../libsvn_wc/externals.c:1632
#, c-format
msgid "Illegal parent directory URL '%s'"
msgstr ""
-#: ../libsvn_wc/externals.c:1645
+#: ../libsvn_wc/externals.c:1671
#, c-format
msgid "Illegal repository root URL '%s'"
msgstr ""
-#: ../libsvn_wc/externals.c:1690
+#: ../libsvn_wc/externals.c:1716
#, c-format
msgid "The external relative URL '%s' cannot have backpaths, i.e. '..'"
msgstr ""
-#: ../libsvn_wc/externals.c:1718
+#: ../libsvn_wc/externals.c:1744
#, c-format
msgid "Unrecognized format for the relative external URL '%s'"
msgstr ""
@@ -7272,7 +8317,7 @@ msgstr ""
msgid "Path '%s' ends in '%s', which is unsupported for this operation"
msgstr ""
-#: ../libsvn_wc/lock.c:773 ../libsvn_wc/wc_db.c:14193
+#: ../libsvn_wc/lock.c:773
#, c-format
msgid "Working copy '%s' locked"
msgstr ""
@@ -7302,7 +8347,8 @@ msgstr ""
msgid "Working copy '%s' is not locked"
msgstr ""
-#: ../libsvn_wc/lock.c:1382
+#: ../libsvn_wc/lock.c:1382 ../libsvn_wc/wc_db.c:4950
+#: ../libsvn_wc/wc_db.c:16270 ../libsvn_wc/wc_db_update_move.c:130
#, c-format
msgid "No write-lock in '%s'"
msgstr ""
@@ -7312,22 +8358,22 @@ msgstr ""
msgid "Can't obtain lock on non-directory '%s'."
msgstr ""
-#: ../libsvn_wc/merge.c:1281 ../libsvn_wc/props.c:257
+#: ../libsvn_wc/merge.c:1285 ../libsvn_wc/props.c:232
#, c-format
msgid "Can't merge into conflicted node '%s'"
msgstr ""
-#: ../libsvn_wc/merge.c:1324 ../libsvn_wc/props.c:273
+#: ../libsvn_wc/merge.c:1328 ../libsvn_wc/props.c:248
#, c-format
msgid "The property '%s' may not be merged into '%s'."
msgstr ""
-#: ../libsvn_wc/node.c:1047
+#: ../libsvn_wc/node.c:749
#, c-format
msgid "Incomplete copy information on path '%s'."
msgstr ""
-#: ../libsvn_wc/node.c:1211
+#: ../libsvn_wc/node.c:914
#, c-format
msgid "'%s' is not the root of the working copy '%s'"
msgstr ""
@@ -7425,164 +8471,168 @@ msgstr ""
msgid "Error at entry %d in entries file for '%s':"
msgstr ""
-#: ../libsvn_wc/props.c:236
+#: ../libsvn_wc/props.c:211
#, c-format
msgid "The node '%s' does not have properties in this state."
msgstr ""
-#: ../libsvn_wc/props.c:401
+#: ../libsvn_wc/props.c:377
#, c-format
msgid ""
"Trying to add new property '%s'\n"
"but the property already exists.\n"
msgstr ""
-#: ../libsvn_wc/props.c:410
+#: ../libsvn_wc/props.c:386
#, c-format
msgid ""
"Trying to add new property '%s'\n"
"but the property has been locally deleted.\n"
msgstr ""
-#: ../libsvn_wc/props.c:424
+#: ../libsvn_wc/props.c:400
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally added.\n"
msgstr ""
-#: ../libsvn_wc/props.c:440
+#: ../libsvn_wc/props.c:416
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally modified.\n"
msgstr ""
-#: ../libsvn_wc/props.c:450
+#: ../libsvn_wc/props.c:426
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally deleted and had a different value.\n"
msgstr ""
-#: ../libsvn_wc/props.c:462
+#: ../libsvn_wc/props.c:438
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the local property value is different.\n"
msgstr ""
-#: ../libsvn_wc/props.c:481
+#: ../libsvn_wc/props.c:457
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the local property value conflicts with the incoming change.\n"
msgstr ""
-#: ../libsvn_wc/props.c:489
+#: ../libsvn_wc/props.c:465
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has already been locally changed to a different value.\n"
msgstr ""
-#: ../libsvn_wc/props.c:496
+#: ../libsvn_wc/props.c:472
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has been locally deleted.\n"
msgstr ""
-#: ../libsvn_wc/props.c:502
+#: ../libsvn_wc/props.c:478
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has been locally added with a different value.\n"
msgstr ""
-#: ../libsvn_wc/props.c:508
+#: ../libsvn_wc/props.c:484
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property does not exist locally.\n"
msgstr ""
-#: ../libsvn_wc/props.c:612
+#: ../libsvn_wc/props.c:594
msgid "<<<<<<< (local property value)"
msgstr ""
-#: ../libsvn_wc/props.c:613
-msgid ">>>>>>> (incoming property value)"
+#: ../libsvn_wc/props.c:595
+msgid ">>>>>>> (incoming 'changed to' value)"
+msgstr ""
+
+#: ../libsvn_wc/props.c:596
+msgid "||||||| (incoming 'changed from' value)"
msgstr ""
-#: ../libsvn_wc/props.c:648
+#: ../libsvn_wc/props.c:633
msgid "Local property value:\n"
msgstr ""
-#: ../libsvn_wc/props.c:650 ../libsvn_wc/props.c:661
+#: ../libsvn_wc/props.c:635 ../libsvn_wc/props.c:646
msgid "Cannot display: property value is binary data\n"
msgstr ""
-#: ../libsvn_wc/props.c:659
+#: ../libsvn_wc/props.c:644
msgid "Incoming property value:\n"
msgstr ""
-#: ../libsvn_wc/props.c:1475 ../libsvn_wc/props.c:1884
-#: ../libsvn_wc/props.c:1985
+#: ../libsvn_wc/props.c:1582 ../libsvn_wc/props.c:1991
+#: ../libsvn_wc/props.c:2092
#, c-format
msgid "Property '%s' is an entry property"
msgstr ""
-#: ../libsvn_wc/props.c:1512 ../libsvn_wc/props.c:1519
+#: ../libsvn_wc/props.c:1619 ../libsvn_wc/props.c:1626
msgid "Failed to load properties"
msgstr ""
-#: ../libsvn_wc/props.c:1555
+#: ../libsvn_wc/props.c:1662
#, c-format
msgid "Cannot set '%s' on a directory ('%s')"
msgstr ""
-#: ../libsvn_wc/props.c:1562
+#: ../libsvn_wc/props.c:1669
#, c-format
msgid "Cannot set '%s' on a file ('%s')"
msgstr ""
-#: ../libsvn_wc/props.c:1641
+#: ../libsvn_wc/props.c:1748
#, c-format
msgid "Can't set '%s': file '%s' has binary mime type property"
msgstr ""
-#: ../libsvn_wc/props.c:1686
+#: ../libsvn_wc/props.c:1793
msgid "Failed to load current properties"
msgstr ""
-#: ../libsvn_wc/props.c:1906
+#: ../libsvn_wc/props.c:2013
#, c-format
msgid "Can't set properties on '%s': invalid status for updating properties."
msgstr ""
-#: ../libsvn_wc/props.c:1990
+#: ../libsvn_wc/props.c:2097
#, c-format
msgid "Property '%s' is a WC property, not a regular property"
msgstr ""
-#: ../libsvn_wc/props.c:2084
+#: ../libsvn_wc/props.c:2191
#, c-format
msgid "Unrecognized line ending style '%s' for '%s'"
msgstr ""
#. scratch_
-#: ../libsvn_wc/props.c:2135
+#: ../libsvn_wc/props.c:2242
#, c-format
msgid " (%d more duplicate targets found)"
msgstr ""
-#: ../libsvn_wc/props.c:2140
+#: ../libsvn_wc/props.c:2247
#, c-format
msgid "Invalid %s property on '%s': target '%s' appears more than once%s"
msgstr ""
-#: ../libsvn_wc/props.c:2171
+#: ../libsvn_wc/props.c:2278
#, c-format
msgid "Cannot set non-inheritable mergeinfo on a non-directory ('%s')"
msgstr ""
@@ -7618,33 +8668,33 @@ msgstr ""
msgid "Invalid relocation destination: '%s' (does not point to target)"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:136
+#: ../libsvn_wc/tree_conflicts.c:137
msgid "Unknown enumeration value in tree conflict description"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:160
+#: ../libsvn_wc/tree_conflicts.c:161
msgid "Invalid version info in tree conflict description"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:218
+#: ../libsvn_wc/tree_conflicts.c:219
#, c-format
msgid "Invalid conflict info '%s' in tree conflict description"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:229
+#: ../libsvn_wc/tree_conflicts.c:230
msgid "Empty 'victim' field in tree conflict description"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:237
+#: ../libsvn_wc/tree_conflicts.c:238
msgid "Invalid 'node_kind' field in tree conflict description"
msgstr ""
-#: ../libsvn_wc/tree_conflicts.c:430
+#: ../libsvn_wc/tree_conflicts.c:432
#, c-format
msgid "Attempt to add tree conflict that already exists at '%s'"
msgstr ""
-#: ../libsvn_wc/update_editor.c:999
+#: ../libsvn_wc/update_editor.c:994
#, c-format
msgid ""
"Checksum mismatch while updating '%s':\n"
@@ -7652,47 +8702,40 @@ msgid ""
" actual: %s\n"
msgstr ""
-#: ../libsvn_wc/update_editor.c:1134
+#: ../libsvn_wc/update_editor.c:1129
#, c-format
msgid "'%s' is not valid as filename in directory '%s'"
msgstr ""
-#: ../libsvn_wc/update_editor.c:1611
+#: ../libsvn_wc/update_editor.c:1507
#, c-format
msgid "Unexpected attempt to add a node at path '%s'"
msgstr ""
-#: ../libsvn_wc/update_editor.c:1622
+#: ../libsvn_wc/update_editor.c:1518
#, c-format
msgid "Unexpected attempt to edit, delete, or replace a node at path '%s'"
msgstr ""
-#: ../libsvn_wc/update_editor.c:2036
+#: ../libsvn_wc/update_editor.c:1899
#, c-format
msgid ""
"Failed to add directory '%s': object of the same name as the administrative "
"directory"
msgstr ""
-#: ../libsvn_wc/update_editor.c:2693
+#: ../libsvn_wc/update_editor.c:2572
msgid "Couldn't do property merge"
msgstr ""
-#: ../libsvn_wc/update_editor.c:3086
-#, c-format
-msgid ""
-"Failed to mark '%s' absent: item of the same name is already scheduled for "
-"addition"
-msgstr ""
-
-#: ../libsvn_wc/update_editor.c:3174
+#: ../libsvn_wc/update_editor.c:3111
#, c-format
msgid ""
"Failed to add file '%s': object of the same name as the administrative "
"directory"
msgstr ""
-#: ../libsvn_wc/update_editor.c:3695
+#: ../libsvn_wc/update_editor.c:3650
#, c-format
msgid ""
"Checksum mismatch for '%s':\n"
@@ -7700,69 +8743,81 @@ msgid ""
" recorded: %s\n"
msgstr ""
-#: ../libsvn_wc/update_editor.c:5254
+#: ../libsvn_wc/update_editor.c:5309
#, c-format
msgid "Node '%s' exists."
msgstr ""
-#: ../libsvn_wc/update_editor.c:5314
+#: ../libsvn_wc/update_editor.c:5369
#, c-format
msgid "Copyfrom-url '%s' has different repository root than '%s'"
msgstr ""
-#: ../libsvn_wc/update_editor.c:5512
+#: ../libsvn_wc/update_editor.c:5581
#, c-format
msgid "'%s' is not an unmodified copied directory"
msgstr ""
-#: ../libsvn_wc/update_editor.c:5523
+#: ../libsvn_wc/update_editor.c:5592
#, c-format
msgid "Copyfrom '%s' doesn't match original location of '%s'"
msgstr ""
-#: ../libsvn_wc/upgrade.c:255
+#: ../libsvn_wc/upgrade.c:256
#, c-format
msgid "Missing end of line in wcprops file for '%s'"
msgstr ""
-#: ../libsvn_wc/upgrade.c:631
+#: ../libsvn_wc/upgrade.c:632
#, c-format
msgid ""
"Working copy '%s' can't be upgraded because the repository root is not "
"available and can't be retrieved"
msgstr ""
-#: ../libsvn_wc/upgrade.c:638
+#: ../libsvn_wc/upgrade.c:639
#, c-format
msgid ""
"Working copy '%s' can't be upgraded because the repository uuid is not "
"available and can't be retrieved"
msgstr ""
-#: ../libsvn_wc/upgrade.c:645
+#: ../libsvn_wc/upgrade.c:646
#, c-format
msgid "Working copy '%s' can't be upgraded because it doesn't have a url"
msgstr ""
-#: ../libsvn_wc/upgrade.c:690
+#: ../libsvn_wc/upgrade.c:691
msgid "Error parsing tree conflict skel"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1173
+#: ../libsvn_wc/upgrade.c:922
+#, c-format
+msgid ""
+"The properties of '%s' are in an indeterminate state and cannot be upgraded. "
+"See issue #2530."
+msgstr ""
+
+#: ../libsvn_wc/upgrade.c:934
+#, c-format
+msgid "Insufficient NODES rows for '%s'"
+msgstr ""
+
+#: ../libsvn_wc/upgrade.c:1357
#, c-format
msgid ""
"The working copy at '%s' is format 22 with WORKING nodes; use a format 22 "
"client to diff/revert before using this client"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1217
+#: ../libsvn_wc/upgrade.c:1401
#, c-format
msgid ""
"The working copy at '%s' is format 26 with conflicts; use a format 26 client "
"to resolve before using this client"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1723
+#: ../libsvn_wc/upgrade.c:1945
msgid ""
"Cannot upgrade with existing logs; run a cleanup operation on this working "
"copy using a client version which is compatible with this working copy's "
@@ -7770,22 +8825,22 @@ msgid ""
"with the current version"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1792
+#: ../libsvn_wc/upgrade.c:2014
msgid ""
"This working copy is corrupt and cannot be upgraded. Please check out a new "
"working copy."
msgstr ""
-#: ../libsvn_wc/upgrade.c:1837
+#: ../libsvn_wc/upgrade.c:2059
msgid "(unreleased development version)"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1853
+#: ../libsvn_wc/upgrade.c:2075
#, c-format
msgid "Working copy '%s' is too old (format %d, created by Subversion %s)"
msgstr ""
-#: ../libsvn_wc/upgrade.c:1863
+#: ../libsvn_wc/upgrade.c:2085
#, c-format
msgid ""
"Working copy '%s' is an old development version (format %d); to upgrade it, "
@@ -7793,88 +8848,110 @@ msgid ""
"the current client"
msgstr ""
-#: ../libsvn_wc/upgrade.c:2092
+#: ../libsvn_wc/upgrade.c:2314
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy"
msgstr ""
-#: ../libsvn_wc/upgrade.c:2141
+#: ../libsvn_wc/upgrade.c:2363
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy root, the root is '%s'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:452
+#: ../libsvn_wc/wc_db.c:445
#, c-format
msgid "No REPOSITORY table entry for id '%ld'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:773
+#: ../libsvn_wc/wc_db.c:778
#, c-format
msgid "The file '%s' has no checksum."
msgstr ""
-#: ../libsvn_wc/wc_db.c:2548 ../libsvn_wc/wc_db.c:2933
-#: ../libsvn_wc/wc_db.c:9404
+#: ../libsvn_wc/wc_db.c:2092
+#, c-format
+msgid "Path '%s' is not moved"
+msgstr ""
+
+#: ../libsvn_wc/wc_db.c:2566 ../libsvn_wc/wc_db.c:3001
+#: ../libsvn_wc/wc_db.c:9922
#, c-format
msgid "The node '%s' has a corrupt checksum value."
msgstr ""
-#: ../libsvn_wc/wc_db.c:2737
+#: ../libsvn_wc/wc_db.c:2786
#, c-format
msgid "The node '%s' has a BASE status that has no properties."
msgstr ""
-#: ../libsvn_wc/wc_db.c:3563
+#: ../libsvn_wc/wc_db.c:3528 ../libsvn_wc/wc_db.c:3648
#, c-format
msgid "The node '%s' is not an external."
msgstr ""
-#: ../libsvn_wc/wc_db.c:3977
+#: ../libsvn_wc/wc_db.c:4060
#, c-format
msgid "Expected node '%s' to be deleted."
msgstr ""
-#: ../libsvn_wc/wc_db.c:6493 ../libsvn_wc/wc_db.c:6572
+#: ../libsvn_wc/wc_db.c:6924 ../libsvn_wc/wc_db.c:6971
#, c-format
msgid "Can't revert '%s' without reverting children"
msgstr ""
-#: ../libsvn_wc/wc_db.c:6669
+#: ../libsvn_wc/wc_db.c:7085
#, c-format
msgid "Can't revert '%s' without reverting parent"
msgstr ""
-#: ../libsvn_wc/wc_db.c:6788
+#: ../libsvn_wc/wc_db.c:7220
#, c-format
msgid "Unsupported depth for revert of '%s'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:7764
+#: ../libsvn_wc/wc_db.c:7790
+#, c-format
+msgid "The node '%s' is not a committed directory"
+msgstr ""
+
+#: ../libsvn_wc/wc_db.c:8180
#, c-format
msgid "Cannot delete '%s' as '%s' is excluded by server"
msgstr ""
-#: ../libsvn_wc/wc_db.c:7775
+#: ../libsvn_wc/wc_db.c:8191
#, c-format
msgid "Cannot delete '%s' as it is excluded by server"
msgstr ""
-#: ../libsvn_wc/wc_db.c:7782
+#: ../libsvn_wc/wc_db.c:8198
#, c-format
msgid "Cannot delete '%s' as it is excluded"
msgstr ""
-#: ../libsvn_wc/wc_db.c:8239
+#: ../libsvn_wc/wc_db.c:8655
#, c-format
msgid "Cannot move '%s' to '%s' because they are not in the same working copy"
msgstr ""
-#: ../libsvn_wc/wc_db.c:8597
+#: ../libsvn_wc/wc_db.c:8794
+#, c-format
+msgid ""
+"Encountered invalid node state in column %d of info query to working copy "
+"database"
+msgstr ""
+
+#: ../libsvn_wc/wc_db.c:9049
#, c-format
msgid "Corrupt data for '%s'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:8904
+#: ../libsvn_wc/wc_db.c:9121
+#, c-format
+msgid "Error reading node '%s'"
+msgstr ""
+
+#: ../libsvn_wc/wc_db.c:9379
#, c-format
msgid ""
"The node '%s' comes from unexpected repository '%s', expected '%s'; if this "
@@ -7882,165 +8959,162 @@ msgid ""
"fix the problem, see issue #4087"
msgstr ""
-#: ../libsvn_wc/wc_db.c:9529
+#: ../libsvn_wc/wc_db.c:10053
#, c-format
msgid "The node '%s' is not in working copy '%s'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:9566
+#: ../libsvn_wc/wc_db.c:10090
#, c-format
msgid "The node '%s' is not installable"
msgstr ""
-#: ../libsvn_wc/wc_db.c:9995 ../libsvn_wc/wc_db.c:10254
+#: ../libsvn_wc/wc_db.c:10529 ../libsvn_wc/wc_db.c:10788
#, c-format
msgid "The node '%s' has a status that has no properties."
msgstr ""
-#: ../libsvn_wc/wc_db.c:12121
+#: ../libsvn_wc/wc_db.c:12740
#, c-format
msgid "Expected node '%s' to be added."
msgstr ""
-#: ../libsvn_wc/wc_db.c:12467
+#: ../libsvn_wc/wc_db.c:13069
#, c-format
msgid "Path '%s' was not moved here"
msgstr ""
-#: ../libsvn_wc/wc_db.c:12536
-#, c-format
-msgid "The base node '%s' was not found."
-msgstr ""
-
-#: ../libsvn_wc/wc_db.c:12968
+#: ../libsvn_wc/wc_db.c:13257
#, c-format
-msgid ""
-"The properties of '%s' are in an indeterminate state and cannot be upgraded. "
-"See issue #2530."
+msgid "Node '%s' is not shadowed"
msgstr ""
-#: ../libsvn_wc/wc_db.c:12980
+#: ../libsvn_wc/wc_db.c:14498 ../libsvn_wc/wc_db.c:14546
#, c-format
-msgid "Insufficient NODES rows for '%s'"
-msgstr ""
-
-#: ../libsvn_wc/wc_db.c:13127
-#, c-format
-msgid "Repository '%s' not found in the database"
+msgid "'%s' is already locked."
msgstr ""
-#: ../libsvn_wc/wc_db.c:14114 ../libsvn_wc/wc_db.c:14162
+#: ../libsvn_wc/wc_db.c:14503 ../libsvn_wc/wc_db.c:14554
#, c-format
-msgid "'%s' is already locked."
+msgid "Working copy '%s' locked."
msgstr ""
-#: ../libsvn_wc/wc_db.c:14119 ../libsvn_wc/wc_db.c:14170
+#: ../libsvn_wc/wc_db.c:14577
#, c-format
-msgid "Working copy '%s' locked."
+msgid "Failed to lock working copy '%s'."
msgstr ""
-#: ../libsvn_wc/wc_db.c:14242
+#: ../libsvn_wc/wc_db.c:14626
#, c-format
msgid "'%s' is already locked via '%s'."
msgstr ""
-#: ../libsvn_wc/wc_db.c:14416
+#: ../libsvn_wc/wc_db.c:14800
#, c-format
msgid "Working copy not locked at '%s'."
msgstr ""
-#: ../libsvn_wc/wc_db.c:14799
+#: ../libsvn_wc/wc_db.c:15299
#, c-format
msgid "Modification of '%s' already exists"
msgstr ""
#. If EXPRESSION is false, cause the caller to return an SVN_ERR_WC_CORRUPT
#. * error, showing EXPRESSION and the caller's LOCAL_RELPATH in the message.
-#: ../libsvn_wc/wc_db.c:15441
+#: ../libsvn_wc/wc_db.c:15896
#, c-format
msgid "database inconsistency at local_relpath='%s' verifying expression '%s'"
msgstr ""
-#: ../libsvn_wc/wc_db.c:15565
+#: ../libsvn_wc/wc_db.c:16084
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy root"
msgstr ""
-#: ../libsvn_wc/wc_db.c:15571
+#: ../libsvn_wc/wc_db.c:16090
#, c-format
msgid ""
"Working copy '%s' is too old and must be upgraded to at least format %d, as "
"created by Subversion %s"
msgstr ""
-#: ../libsvn_wc/wc_db.c:15589
+#: ../libsvn_wc/wc_db.c:16108
msgid "Working copy upgrade failed"
msgstr ""
-#: ../libsvn_wc/wc_db_pristine.c:125 ../libsvn_wc/wc_db_pristine.c:457
+#: ../libsvn_wc/wc_db.c:16209
+#, c-format
+msgid "The path '%s' is not in the working copy '%s'"
+msgstr ""
+
+#: ../libsvn_wc/wc_db_pristine.c:128 ../libsvn_wc/wc_db_pristine.c:467
#, c-format
msgid "The pristine text with checksum '%s' was not found"
msgstr ""
-#: ../libsvn_wc/wc_db_pristine.c:191
+#: ../libsvn_wc/wc_db_pristine.c:194
#, c-format
msgid "Pristine text '%s' not present"
msgstr ""
-#: ../libsvn_wc/wc_db_pristine.c:224
+#: ../libsvn_wc/wc_db_pristine.c:237
#, c-format
msgid "Can't read '%s' from pristine store because no checksum supplied"
msgstr ""
-#: ../libsvn_wc/wc_db_pristine.c:328
+#: ../libsvn_wc/wc_db_pristine.c:320
#, c-format
msgid "New pristine text '%s' has different size: %ld versus %ld"
msgstr ""
-#: ../libsvn_wc/wc_db_pristine.c:496
+#: ../libsvn_wc/wc_db_pristine.c:388
+msgid "Unable to create pristine install stream"
+msgstr ""
+
+#: ../libsvn_wc/wc_db_pristine.c:506
#, c-format
msgid "The pristine text with MD5 checksum '%s' was not found"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:282 ../libsvn_wc/wc_db_update_move.c:306
+#: ../libsvn_wc/wc_db_update_move.c:170
#, c-format
-msgid "'%s' already in conflict"
+msgid "'%s' is not deleted"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1382
+#: ../libsvn_wc/wc_db_update_move.c:404 ../libsvn_wc/wc_db_update_move.c:428
#, c-format
-msgid "'%s' is not in conflict"
+msgid "'%s' already in conflict"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1395
+#: ../libsvn_wc/wc_db_update_move.c:1631
#, c-format
-msgid "'%s' is not a tree-conflict victim"
+msgid ""
+"Cannot apply update because move source %s' is a mixed-revision working copy"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1754
+#: ../libsvn_wc/wc_db_update_move.c:1639
#, c-format
-msgid "Cannot auto-resolve tree-conflict on '%s'"
+msgid "Cannot apply update because move source '%s' is a switched subtree"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1817
+#: ../libsvn_wc/wc_db_update_move.c:1692
#, c-format
-msgid ""
-"Cannot apply update because move source %s' is a mixed-revision working copy"
+msgid "The node '%s' has not been moved away"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1828
+#: ../libsvn_wc/wc_db_update_move.c:2300
#, c-format
-msgid "Cannot apply update because move source '%s' is a switched subtree"
+msgid "'%s' is not in conflict"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1879
+#: ../libsvn_wc/wc_db_update_move.c:2313
#, c-format
-msgid "The node '%s' has not been moved away"
+msgid "'%s' is not a valid tree-conflict victim"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1908
+#: ../libsvn_wc/wc_db_update_move.c:2326
#, c-format
-msgid "'%s' is not deleted"
+msgid "'%s' is already a moved away tree-conflict"
msgstr ""
#: ../libsvn_wc/wc_db_util.c:69
@@ -8048,19 +9122,19 @@ msgstr ""
msgid "Missing a row in WCROOT."
msgstr ""
-#: ../libsvn_wc/wc_db_util.c:135
+#: ../libsvn_wc/wc_db_util.c:136
#, c-format
msgid "Working copy database '%s' not found"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:276
+#: ../libsvn_wc/wc_db_wcroot.c:318
#, c-format
msgid ""
"Working copy format of '%s' is too old (%d); please check out your working "
"copy again"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:286
+#: ../libsvn_wc/wc_db_wcroot.c:328
#, c-format
msgid ""
"This client is too old to work with the working copy at\n"
@@ -8069,11 +9143,11 @@ msgid ""
" http://subversion.apache.org/faq.html#working-copy-format-change\n"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:307
+#: ../libsvn_wc/wc_db_wcroot.c:349
msgid "Cleanup with an older 1.7 client before upgrading with this client"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:318
+#: ../libsvn_wc/wc_db_wcroot.c:360
#, c-format
msgid ""
"The working copy at '%s'\n"
@@ -8081,49 +9155,49 @@ msgid ""
"You need to upgrade the working copy first.\n"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:396
+#: ../libsvn_wc/wc_db_wcroot.c:438
#, c-format
msgid "The symlink at '%s' points nowhere"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:716
+#: ../libsvn_wc/wc_db_wcroot.c:757
#, c-format
msgid "Missing a row in WCROOT for '%s'."
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:771
+#: ../libsvn_wc/wc_db_wcroot.c:811
#, c-format
msgid "The working copy at '%s' is corrupt."
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:787
+#: ../libsvn_wc/wc_db_wcroot.c:827
#, c-format
msgid "The working copy database at '%s' is missing."
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:796
+#: ../libsvn_wc/wc_db_wcroot.c:836
#, c-format
msgid "The working copy database at '%s' is corrupt."
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:954
+#: ../libsvn_wc/wc_db_wcroot.c:994
#, c-format
msgid "'%s' is not a working copy root"
msgstr ""
-#: ../libsvn_wc/workqueue.c:518
+#: ../libsvn_wc/workqueue.c:512
#, c-format
msgid ""
"Can't install '%s' from pristine store, because no checksum is recorded for "
"this file"
msgstr ""
-#: ../libsvn_wc/workqueue.c:1499
+#: ../libsvn_wc/workqueue.c:1469
#, c-format
msgid "Unrecognized work item in the queue"
msgstr ""
-#: ../libsvn_wc/workqueue.c:1579
+#: ../libsvn_wc/workqueue.c:1552
#, c-format
msgid ""
"Failed to run the WC DB work queue associated with '%s', work item %d %s"
@@ -8137,211 +9211,382 @@ msgstr ""
msgid "Could not add all targets because some targets are already versioned"
msgstr ""
-#: ../svn/blame-cmd.c:303 ../svn/list-cmd.c:300
+#: ../svn/auth-cmd.c:72
+#, c-format
+msgid "Automatic certificate validity check failed because:\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:77
+#, c-format
+msgid " The certificate is not yet valid.\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:81
+#, c-format
+msgid " The certificate has expired.\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:85
+#, c-format
+msgid ""
+" The certificate's Common Name (hostname) does not match the remote "
+"hostname.\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:90
+#, c-format
+msgid " The certificate issuer is unknown.\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:94
+#, c-format
+msgid " Unknown verification failure.\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:261
+#, c-format
+msgid "Subject: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:263
+#, c-format
+msgid "Valid from: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:267
+#, c-format
+msgid "Valid until: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:271
+#, c-format
+msgid "Issuer: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:273
+#, c-format
+msgid "Fingerprint: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:290
+#, c-format
+msgid "Hostnames: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:310
+#, c-format
+msgid "Credential kind: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:330
+#, c-format
+msgid "Password: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:332
+#, c-format
+msgid "Password: [not shown]\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:338
+#, c-format
+msgid "Passphrase: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:341
+#, c-format
+msgid "Passphrase: [not shown]\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:344
+#, c-format
+msgid "Password cache: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:347
+#, c-format
+msgid "Username: %s\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:399
+#, c-format
+msgid "Deleting %s credential for realm '%s'\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:446
+#, c-format
+msgid "Credentials cache in '%s' is empty\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:450 ../svn/auth-cmd.c:473
+#, c-format
+msgid "Credentials cache in '%s' contains no matching credentials"
+msgstr ""
+
+#: ../svn/auth-cmd.c:458
+#, c-format
+msgid "Credentials cache in '%s' contains %d credentials\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:462
+#, c-format
+msgid "Credentials cache in '%s' contains %d matching credentials\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:477
+#, c-format
+msgid "Deleted %d matching credentials from '%s'\n"
+msgstr ""
+
+#: ../svn/blame-cmd.c:314 ../svn/list-cmd.c:310
msgid "'verbose' option invalid in XML mode"
msgstr ""
-#: ../svn/blame-cmd.c:315 ../svn/info-cmd.c:613 ../svn/list-cmd.c:312
-#: ../svn/status-cmd.c:308
+#: ../svn/blame-cmd.c:326 ../svn/list-cmd.c:322 ../svn/status-cmd.c:315
msgid "'incremental' option only valid in XML mode"
msgstr ""
-#: ../svn/blame-cmd.c:378
+#: ../svn/blame-cmd.c:389
#, c-format
msgid "Skipping binary file (use --force to treat as text): '%s'\n"
msgstr ""
-#: ../svn/blame-cmd.c:415
+#: ../svn/blame-cmd.c:426 ../svnbench/null-blame-cmd.c:272
msgid "Could not perform blame on all targets because some targets don't exist"
msgstr ""
-#: ../svn/cat-cmd.c:102
+#: ../svn/cat-cmd.c:103
msgid "Could not cat all targets because some targets don't exist"
msgstr ""
-#: ../svn/cat-cmd.c:106
+#: ../svn/cat-cmd.c:107
msgid "Could not cat all targets because some targets are not versioned"
msgstr ""
-#: ../svn/cat-cmd.c:110
+#: ../svn/cat-cmd.c:111
msgid "Could not cat all targets because some targets are directories"
msgstr ""
-#: ../svn/changelist-cmd.c:135
+#: ../svn/changelist-cmd.c:117
msgid ""
"Could not set changelists on all targets because some targets don't exist"
msgstr ""
-#: ../svn/changelist-cmd.c:140
+#: ../svn/changelist-cmd.c:122
msgid ""
"Could not set changelists on all targets because some targets are not "
"versioned"
msgstr ""
-#: ../svn/checkout-cmd.c:133 ../svn/switch-cmd.c:138
+#: ../svn/checkout-cmd.c:140 ../svn/switch-cmd.c:138
#, c-format
msgid "'%s' does not appear to be a URL"
msgstr ""
-#: ../svn/cl-conflicts.c:80
-msgid "local file edit"
+#: ../svn/checkout-cmd.c:181 ../svn/export-cmd.c:130 ../svn/list-cmd.c:424
+#: ../svn/switch-cmd.c:188 ../svn/update-cmd.c:177
+msgid "Failure occurred processing one or more externals definitions"
msgstr ""
#: ../svn/cl-conflicts.c:82
-msgid "local file obstruction"
+msgid "local file edit"
msgstr ""
#: ../svn/cl-conflicts.c:84
-msgid "local file delete"
+msgid "local file obstruction"
msgstr ""
#: ../svn/cl-conflicts.c:86
+msgid "local file delete"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:89
+msgid "local file missing or deleted or moved away"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:91
msgid "local file missing"
msgstr ""
-#: ../svn/cl-conflicts.c:88
+#: ../svn/cl-conflicts.c:93
msgid "local file unversioned"
msgstr ""
-#: ../svn/cl-conflicts.c:90
+#: ../svn/cl-conflicts.c:95
msgid "local file add"
msgstr ""
-#: ../svn/cl-conflicts.c:92
+#: ../svn/cl-conflicts.c:97
msgid "local file replace"
msgstr ""
-#: ../svn/cl-conflicts.c:94
+#: ../svn/cl-conflicts.c:99
msgid "local file moved away"
msgstr ""
-#: ../svn/cl-conflicts.c:96
+#: ../svn/cl-conflicts.c:101
msgid "local file moved here"
msgstr ""
-#: ../svn/cl-conflicts.c:103
+#: ../svn/cl-conflicts.c:108
msgid "local dir edit"
msgstr ""
-#: ../svn/cl-conflicts.c:105
+#: ../svn/cl-conflicts.c:110
msgid "local dir obstruction"
msgstr ""
-#: ../svn/cl-conflicts.c:107
+#: ../svn/cl-conflicts.c:112
msgid "local dir delete"
msgstr ""
-#: ../svn/cl-conflicts.c:109
+#: ../svn/cl-conflicts.c:115
+msgid "local dir missing or deleted or moved away"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:117
msgid "local dir missing"
msgstr ""
-#: ../svn/cl-conflicts.c:111
+#: ../svn/cl-conflicts.c:119
msgid "local dir unversioned"
msgstr ""
-#: ../svn/cl-conflicts.c:113
+#: ../svn/cl-conflicts.c:121
msgid "local dir add"
msgstr ""
-#: ../svn/cl-conflicts.c:115
+#: ../svn/cl-conflicts.c:123
msgid "local dir replace"
msgstr ""
-#: ../svn/cl-conflicts.c:117
+#: ../svn/cl-conflicts.c:125
msgid "local dir moved away"
msgstr ""
-#: ../svn/cl-conflicts.c:119
+#: ../svn/cl-conflicts.c:127
msgid "local dir moved here"
msgstr ""
-#: ../svn/cl-conflicts.c:141
-msgid "incoming file edit"
+#: ../svn/cl-conflicts.c:135 ../svn/cl-conflicts.c:242
+msgid "local edit"
msgstr ""
-#: ../svn/cl-conflicts.c:143
-msgid "incoming file add"
+#: ../svn/cl-conflicts.c:137 ../svn/cl-conflicts.c:251
+msgid "local obstruction"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:139 ../svn/cl-conflicts.c:248
+msgid "local delete"
msgstr ""
-#: ../svn/cl-conflicts.c:145
-msgid "incoming file delete"
+#: ../svn/cl-conflicts.c:142
+msgid "local missing or deleted or moved away"
msgstr ""
-#: ../svn/cl-conflicts.c:147
-msgid "incoming file replace"
+#: ../svn/cl-conflicts.c:144
+msgid "local missing"
msgstr ""
-#: ../svn/cl-conflicts.c:154
-msgid "incoming dir edit"
+#: ../svn/cl-conflicts.c:146
+msgid "local unversioned"
msgstr ""
-#: ../svn/cl-conflicts.c:156
-msgid "incoming dir add"
+#: ../svn/cl-conflicts.c:148 ../svn/cl-conflicts.c:245
+msgid "local add"
msgstr ""
-#: ../svn/cl-conflicts.c:158
-msgid "incoming dir delete"
+#: ../svn/cl-conflicts.c:150
+msgid "local replace"
msgstr ""
-#: ../svn/cl-conflicts.c:160
-msgid "incoming dir replace"
+#: ../svn/cl-conflicts.c:152
+msgid "local moved away"
msgstr ""
-#: ../svn/cl-conflicts.c:178
-msgid "upon update"
+#: ../svn/cl-conflicts.c:154
+msgid "local moved here"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:173
+msgid "incoming file edit"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:175
+msgid "incoming file add"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:177
+msgid "incoming file delete or move"
msgstr ""
#: ../svn/cl-conflicts.c:179
-msgid "upon switch"
+msgid "incoming replace with file"
msgstr ""
-#: ../svn/cl-conflicts.c:180
-msgid "upon merge"
+#: ../svn/cl-conflicts.c:186
+msgid "incoming dir edit"
msgstr ""
-#: ../svn/cl-conflicts.c:181
-msgid "upon none"
+#: ../svn/cl-conflicts.c:188
+msgid "incoming dir add"
msgstr ""
-#: ../svn/cl-conflicts.c:200
-msgid "local edit"
+#: ../svn/cl-conflicts.c:190
+msgid "incoming dir delete or move"
msgstr ""
-#: ../svn/cl-conflicts.c:203
-msgid "local add"
+#: ../svn/cl-conflicts.c:192
+msgid "incoming replace with dir"
msgstr ""
-#: ../svn/cl-conflicts.c:206
-msgid "local delete"
+#: ../svn/cl-conflicts.c:200 ../svn/cl-conflicts.c:262
+msgid "incoming edit"
msgstr ""
-#: ../svn/cl-conflicts.c:209
-msgid "local obstruction"
+#: ../svn/cl-conflicts.c:202 ../svn/cl-conflicts.c:265
+msgid "incoming add"
msgstr ""
-#: ../svn/cl-conflicts.c:212
-#, c-format
-msgid "local %s"
+#: ../svn/cl-conflicts.c:204
+msgid "incoming delete or move"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:206
+msgid "incoming replace"
msgstr ""
#: ../svn/cl-conflicts.c:220
-msgid "incoming edit"
+msgid "upon update"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:221
+msgid "upon switch"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:222
+msgid "upon merge"
msgstr ""
#: ../svn/cl-conflicts.c:223
-msgid "incoming add"
+msgid "upon none"
+msgstr ""
+
+#: ../svn/cl-conflicts.c:254
+#, c-format
+msgid "local %s"
msgstr ""
-#: ../svn/cl-conflicts.c:226
+#: ../svn/cl-conflicts.c:268
msgid "incoming delete"
msgstr ""
-#: ../svn/cl-conflicts.c:229
+#: ../svn/cl-conflicts.c:271
#, c-format
msgid "incoming %s"
msgstr ""
-#: ../svn/cl-conflicts.c:235 ../svn/cl-conflicts.c:277
+#: ../svn/cl-conflicts.c:277 ../svn/cl-conflicts.c:320
#, c-format
msgid "%s, %s %s"
msgstr ""
@@ -8349,12 +9594,30 @@ msgstr ""
#. A catch-all message for very rare or nominally impossible cases.
#. It will not be pretty, but is closer to an internal error than
#. an ordinary user-facing string.
-#: ../svn/cl-conflicts.c:285
+#: ../svn/cl-conflicts.c:328
#, c-format
msgid "local: %s %s incoming: %s %s %s"
msgstr ""
-#: ../svn/cleanup-cmd.c:92
+#: ../svn/cl-conflicts.c:355
+#, c-format
+msgid "%s %s"
+msgstr ""
+
+#: ../svn/cleanup-cmd.c:87
+msgid ""
+"Working copy locked; if no other Subversion client is currently using the "
+"working copy, try running 'svn cleanup' without the --remove-unversioned and "
+"--remove-ignored options first."
+msgstr ""
+
+#: ../svn/cleanup-cmd.c:95
+msgid ""
+"Cannot remove unversioned or ignored items from something that is not a "
+"working copy"
+msgstr ""
+
+#: ../svn/cleanup-cmd.c:122
#, c-format
msgid ""
"Working copy locked; try running 'svn cleanup' on the root of the working "
@@ -8372,178 +9635,180 @@ msgstr ""
msgid "Commit targets must be local paths"
msgstr ""
-#: ../svn/conflict-callbacks.c:155 ../svn/conflict-callbacks.c:172
+#: ../svn/conflict-callbacks.c:162 ../svn/conflict-callbacks.c:179
msgid "MINE"
msgstr ""
-#: ../svn/conflict-callbacks.c:160 ../svn/conflict-callbacks.c:170
+#: ../svn/conflict-callbacks.c:167 ../svn/conflict-callbacks.c:177
msgid "THEIRS"
msgstr ""
-#: ../svn/conflict-callbacks.c:163
+#: ../svn/conflict-callbacks.c:170
msgid "MERGED"
msgstr ""
-#: ../svn/conflict-callbacks.c:220 ../svn/conflict-callbacks.c:276
+#: ../svn/conflict-callbacks.c:232 ../svn/conflict-callbacks.c:292
msgid "||||||| ORIGINAL"
msgstr ""
-#: ../svn/conflict-callbacks.c:221
+#: ../svn/conflict-callbacks.c:233
msgid "<<<<<<< MINE (select with 'mc')"
msgstr ""
-#: ../svn/conflict-callbacks.c:222
+#: ../svn/conflict-callbacks.c:234
msgid ">>>>>>> THEIRS (select with 'tc')"
msgstr ""
-#: ../svn/conflict-callbacks.c:277
+#: ../svn/conflict-callbacks.c:293
msgid "<<<<<<< MINE"
msgstr ""
-#: ../svn/conflict-callbacks.c:278
+#: ../svn/conflict-callbacks.c:294
msgid ">>>>>>> THEIRS"
msgstr ""
-#: ../svn/conflict-callbacks.c:333 ../svn/file-merge.c:503
-msgid "No editor found."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:342 ../svn/file-merge.c:515
-msgid "Error running editor."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:352
+#: ../svn/conflict-callbacks.c:365
#, c-format
msgid ""
"Invalid option; there's no merged version to edit.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:411
-msgid "No merge tool found, try '(m) merge' instead.\n"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:419
-msgid "Error running merge tool, try '(m) merge' instead."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:423
msgid "change merged file in an editor [edit]"
msgstr ""
#. Translators: keep long_desc below 70 characters (wrap with a left
#. margin of 9 spaces if needed); don't translate the words within square
#. brackets.
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:423
msgid "edit file"
msgstr ""
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:426
msgid "show all changes made to merged file"
msgstr ""
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:426
msgid "show diff"
msgstr ""
-#: ../svn/conflict-callbacks.c:456
-msgid "accept merged version of file"
+#: ../svn/conflict-callbacks.c:428
+msgid "accept merged version of file [working]"
msgstr ""
-#: ../svn/conflict-callbacks.c:456 ../svn/conflict-callbacks.c:501
-#: ../svn/conflict-callbacks.c:515
+#. Translators: keep long_desc below 70 characters (wrap with a left
+#. margin of 9 spaces if needed); don't translate the words within square
+#. brackets.
+#: ../svn/conflict-callbacks.c:428 ../svn/conflict-callbacks.c:473
+#: ../svn/conflict-callbacks.c:503 ../svn/conflict-callbacks.c:518
msgid "mark resolved"
msgstr ""
-#: ../svn/conflict-callbacks.c:459 ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:431 ../svn/conflict-callbacks.c:498
msgid "display conflict"
msgstr ""
-#: ../svn/conflict-callbacks.c:459
+#: ../svn/conflict-callbacks.c:431
msgid "show all conflicts (ignoring merged version)"
msgstr ""
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:434
msgid "accept my version for all conflicts (same) [mine-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:434
msgid "my side of conflict"
msgstr ""
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:437
msgid "accept their version for all conflicts (same) [theirs-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:437
msgid "their side of conflict"
msgstr ""
-#: ../svn/conflict-callbacks.c:469
+#: ../svn/conflict-callbacks.c:442
msgid "accept my version of entire file (even non-conflicts) [mine-full]"
msgstr ""
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:492
+#: ../svn/conflict-callbacks.c:442 ../svn/conflict-callbacks.c:492
msgid "my version"
msgstr ""
-#: ../svn/conflict-callbacks.c:472
+#: ../svn/conflict-callbacks.c:445
msgid "accept their version of entire file (same) [theirs-full]"
msgstr ""
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:495
+#: ../svn/conflict-callbacks.c:445 ../svn/conflict-callbacks.c:476
+#: ../svn/conflict-callbacks.c:495
msgid "their version"
msgstr ""
-#: ../svn/conflict-callbacks.c:476 ../svn/util.c:774
+#: ../svn/conflict-callbacks.c:449 ../svn/util.c:776
msgid "merge"
msgstr ""
-#: ../svn/conflict-callbacks.c:476
-msgid "use internal merge tool to resolve conflict"
+#: ../svn/conflict-callbacks.c:449
+msgid "use merge tool to resolve conflict"
msgstr ""
-#: ../svn/conflict-callbacks.c:478
-msgid "launch external tool to resolve conflict [launch]"
+#: ../svn/conflict-callbacks.c:451
+msgid "launch external merge tool to resolve conflict [launch]"
msgstr ""
-#: ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:451
msgid "launch tool"
msgstr ""
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
+#: ../svn/conflict-callbacks.c:454
+msgid "internal merge tool"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:454
+msgid "use built-in merge tool to resolve conflict"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:479
+#: ../svn/conflict-callbacks.c:505
msgid "mark the conflict to be resolved later [postpone]"
msgstr ""
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
-#: ../svn/conflict-callbacks.c:517 ../svn/conflict-callbacks.c:535
-#: ../svn/conflict-callbacks.c:549 ../svn/conflict-callbacks.c:565
-#: ../svn/conflict-callbacks.c:581
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:479
+#: ../svn/conflict-callbacks.c:505 ../svn/conflict-callbacks.c:520
+#: ../svn/conflict-callbacks.c:535 ../svn/conflict-callbacks.c:550
msgid "postpone"
msgstr ""
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:519 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:551 ../svn/conflict-callbacks.c:567
-#: ../svn/conflict-callbacks.c:583
+#: ../svn/conflict-callbacks.c:460 ../svn/conflict-callbacks.c:482
+#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:522
+#: ../svn/conflict-callbacks.c:537 ../svn/conflict-callbacks.c:552
msgid "postpone all remaining conflicts"
msgstr ""
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:519 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:551 ../svn/conflict-callbacks.c:567
-#: ../svn/conflict-callbacks.c:583
+#: ../svn/conflict-callbacks.c:460 ../svn/conflict-callbacks.c:482
+#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:522
+#: ../svn/conflict-callbacks.c:537 ../svn/conflict-callbacks.c:552
msgid "quit resolution"
msgstr ""
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:462 ../svn/conflict-callbacks.c:484
msgid "show all options"
msgstr ""
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:462 ../svn/conflict-callbacks.c:484
msgid "show this list (also 'h', '?')"
msgstr ""
+#: ../svn/conflict-callbacks.c:473
+msgid "accept the working copy version of file [working]"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:476
+msgid "accept the incoming version of file [theirs-full]"
+msgstr ""
+
#: ../svn/conflict-callbacks.c:492
msgid "accept my version of entire property (even non-conflicts) [mine-full]"
msgstr ""
@@ -8556,122 +9821,92 @@ msgstr ""
msgid "show conflicts in this property"
msgstr ""
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:500
msgid "change merged property value in an editor [edit]"
msgstr ""
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:500
msgid "edit property"
msgstr ""
-#: ../svn/conflict-callbacks.c:501
+#: ../svn/conflict-callbacks.c:503
msgid "accept edited version of property"
msgstr ""
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:521
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:553
-#: ../svn/conflict-callbacks.c:569 ../svn/conflict-callbacks.c:585
+#: ../svn/conflict-callbacks.c:510 ../svn/conflict-callbacks.c:524
+#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:554
msgid "help"
msgstr ""
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:521
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:553
-#: ../svn/conflict-callbacks.c:569 ../svn/conflict-callbacks.c:585
+#: ../svn/conflict-callbacks.c:510 ../svn/conflict-callbacks.c:524
+#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:554
msgid "show this help (also '?')"
msgstr ""
-#: ../svn/conflict-callbacks.c:515
+#: ../svn/conflict-callbacks.c:518
msgid "accept current working copy state"
msgstr ""
-#: ../svn/conflict-callbacks.c:517 ../svn/conflict-callbacks.c:535
-#: ../svn/conflict-callbacks.c:549 ../svn/conflict-callbacks.c:565
-#: ../svn/conflict-callbacks.c:581
+#: ../svn/conflict-callbacks.c:520 ../svn/conflict-callbacks.c:535
+#: ../svn/conflict-callbacks.c:550
msgid "resolve the conflict later [postpone]"
msgstr ""
-#: ../svn/conflict-callbacks.c:527
-msgid "apply update (recommended)"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:528
-msgid "apply update to the move destination [mine-conflict]"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:531
-msgid "discard update (breaks move)"
-msgstr ""
-
#: ../svn/conflict-callbacks.c:531
-msgid "discard update, mark resolved, the move will will become a copy"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:545
-msgid "apply update to move destination"
+msgid "apply update to move destination (recommended)"
msgstr ""
-#: ../svn/conflict-callbacks.c:546
+#: ../svn/conflict-callbacks.c:532
msgid "apply incoming update to move destination [mine-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:559 ../svn/conflict-callbacks.c:575
-msgid "keep affected local moves"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:559
-msgid "keep any local moves affected by this deletion [mine-conflict]"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:562 ../svn/conflict-callbacks.c:578
-msgid "mark resolved (breaks moves)"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:562
-msgid "mark resolved, any affected moves will become copies"
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:575
-msgid "keep any moves affected by this replacement [mine-conflict]"
+#: ../svn/conflict-callbacks.c:546
+msgid "prepare for updating moved-away children, if any (recommended)"
msgstr ""
-#: ../svn/conflict-callbacks.c:578
-msgid "mark resolved (any affected moves will become copies)"
+#: ../svn/conflict-callbacks.c:547
+msgid "allow updating moved-away children with 'svn resolve' [mine-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:614
+#: ../svn/conflict-callbacks.c:583
msgid "Select:"
msgstr ""
-#: ../svn/conflict-callbacks.c:641
+#: ../svn/conflict-callbacks.c:610
#, c-format
msgid " (%s) %s"
msgstr ""
-#: ../svn/conflict-callbacks.c:681
+#: ../svn/conflict-callbacks.c:650
msgid ""
"Words in square brackets are the corresponding --accept option arguments.\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:720
+#: ../svn/conflict-callbacks.c:689
#, c-format
msgid ""
"Unrecognized option.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:748
+#: ../svn/conflict-callbacks.c:724
+#, c-format
+msgid "Conflict discovered in binary file '%s'.\n"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:728
#, c-format
msgid "Conflict discovered in file '%s'.\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:818
+#: ../svn/conflict-callbacks.c:814
#, c-format
msgid ""
"Invalid option; cannot display conflicts for a binary file.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:827
+#: ../svn/conflict-callbacks.c:823
#, c-format
msgid ""
"Invalid option; original files not available.\n"
@@ -8685,135 +9920,121 @@ msgid ""
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:859
+#: ../svn/conflict-callbacks.c:864
#, c-format
msgid ""
-"Invalid option; can only resolve text conflicts with the internal merge "
-"tool.\n"
+"Invalid option; there's no base path to merge.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:885 ../svn/conflict-callbacks.c:902
+#: ../svn/conflict-callbacks.c:958
#, c-format
msgid ""
"Invalid option.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:911
+#: ../svn/conflict-callbacks.c:987
#, c-format
msgid ""
"Invalid option; cannot choose based on conflicts in a binary file.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:925
+#: ../svn/conflict-callbacks.c:1001
#, c-format
msgid ""
"Invalid option; use diff/edit/merge/launch before choosing 'mark resolved'.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:966
+#: ../svn/conflict-callbacks.c:1042
#, c-format
msgid "Conflict for property '%s' discovered on '%s'.\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:1024
+#: ../svn/conflict-callbacks.c:1102
#, c-format
msgid ""
"Invalid option; please edit the property first.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:1061
+#: ../svn/conflict-callbacks.c:1139
#, c-format
msgid ""
"Tree conflict on '%s'\n"
" > %s\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:1179
-msgid "No editor found; leaving all conflicts."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:1188
-msgid "Error running editor; leaving all conflicts."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:1224
-msgid "No merge tool found; leaving all conflicts."
-msgstr ""
-
-#: ../svn/conflict-callbacks.c:1233
-msgid "Error running merge tool; leaving all conflicts."
-msgstr ""
-
-#: ../svn/copy-cmd.c:123 ../svn/util.c:957
+#: ../svn/copy-cmd.c:123 ../svn/export-cmd.c:94 ../svn/util.c:959
#, c-format
msgid "'%s': a peg revision is not allowed here"
msgstr ""
-#: ../svn/copy-cmd.c:163 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
+#: ../svn/copy-cmd.c:162 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
#: ../svn/move-cmd.c:77 ../svn/propedit-cmd.c:260
msgid ""
"Local, non-commit operations do not take a log message or revision properties"
msgstr ""
-#: ../svn/diff-cmd.c:208
+#: ../svn/diff-cmd.c:227
msgid "'--xml' option only valid with '--summarize' option"
msgstr ""
-#: ../svn/diff-cmd.c:299
+#: ../svn/diff-cmd.c:318
msgid "'--new' option only valid with '--old' option"
msgstr ""
-#: ../svn/diff-cmd.c:317
+#: ../svn/diff-cmd.c:336
msgid ""
"'svn diff [-r N[:M]] [TARGET[@REV]...]' does not support mixed target types. "
"Try using the --old and --new options or one of the shorthand invocations "
"listed in 'svn help diff'."
msgstr ""
-#: ../svn/diff-cmd.c:355
+#: ../svn/diff-cmd.c:393
#, c-format
msgid "Path '%s' not relative to base URLs"
msgstr ""
-#: ../svn/export-cmd.c:113
+#: ../svn/export-cmd.c:121
msgid ""
"Destination directory exists; please remove the directory or use --force to "
"overwrite"
msgstr ""
-#: ../svn/export-cmd.c:122 ../svn/list-cmd.c:412 ../svn/switch-cmd.c:188
-#: ../svn/update-cmd.c:177
-msgid "Failure occurred processing one or more externals definitions"
-msgstr ""
-
-#: ../svn/file-merge.c:135 ../svn/file-merge.c:805
+#: ../svn/file-merge.c:139 ../svn/file-merge.c:809
msgid "Could not write data to merged file"
msgstr ""
-#: ../svn/file-merge.c:491
+#: ../svn/file-merge.c:495
msgid "Could not write data to temporary file"
msgstr ""
-#: ../svn/file-merge.c:600
+#: ../svn/file-merge.c:507
+msgid "No editor found."
+msgstr ""
+
+#: ../svn/file-merge.c:519
+msgid "Error running editor."
+msgstr ""
+
+#: ../svn/file-merge.c:604
msgid "Conflicting section found during merge:"
msgstr ""
-#: ../svn/file-merge.c:603
+#: ../svn/file-merge.c:607
#, c-format
msgid "(1) their version (at line %lu)"
msgstr ""
-#: ../svn/file-merge.c:608
+#: ../svn/file-merge.c:612
#, c-format
msgid "(2) your version (at line %lu)"
msgstr ""
-#: ../svn/file-merge.c:657
+#: ../svn/file-merge.c:661
msgid ""
"Select: (1) use their version, (2) use your version,\n"
" (12) their version first, then yours,\n"
@@ -8825,38 +10046,37 @@ msgid ""
" (a) abort file merge and return to main menu: "
msgstr ""
-#: ../svn/file-merge.c:888
+#: ../svn/file-merge.c:894
#, c-format
msgid "Merging '%s'.\n"
msgstr ""
-#: ../svn/file-merge.c:935
+#: ../svn/file-merge.c:942
#, c-format
msgid "Merge of '%s' aborted.\n"
msgstr ""
-#: ../svn/file-merge.c:953
+#: ../svn/file-merge.c:960
#, c-format
msgid ""
"Could not write merged result to '%s', saved instead at '%s'.\n"
"'%s' remains in conflict.\n"
msgstr ""
-#: ../svn/file-merge.c:971
+#: ../svn/file-merge.c:978
#, c-format
msgid "Merge of '%s' completed (remains in conflict).\n"
msgstr ""
-#: ../svn/file-merge.c:975
+#: ../svn/file-merge.c:982
#, c-format
msgid "Merge of '%s' completed.\n"
msgstr ""
#: ../svn/help-cmd.c:53
-#, c-format
msgid ""
"usage: svn <subcommand> [options] [args]\n"
-"Subversion command-line client, version %s.\n"
+"Subversion command-line client.\n"
"Type 'svn help <subcommand>' for help on a specific subcommand.\n"
"Type 'svn --version' to see the program version and RA modules\n"
" or 'svn --version --quiet' to see just the version number.\n"
@@ -8868,24 +10088,42 @@ msgid ""
"Available subcommands:\n"
msgstr ""
-#: ../svn/help-cmd.c:66
+#: ../svn/help-cmd.c:66 ../svnbench/help-cmd.c:62
msgid ""
"Subversion is a tool for version control.\n"
"For additional information, see http://subversion.apache.org/\n"
msgstr ""
-#: ../svn/help-cmd.c:73 ../svnrdump/svnrdump.c:659 ../svnsync/svnsync.c:1857
+#: ../svn/help-cmd.c:70 ../svnbench/help-cmd.c:66 ../svnrdump/svnrdump.c:614
+#: ../svnsync/svnsync.c:1920
msgid ""
"The following repository access (RA) modules are available:\n"
"\n"
msgstr ""
-#: ../svn/help-cmd.c:127
+#: ../svn/help-cmd.c:124
msgid ""
"WARNING: Plaintext password storage is enabled!\n"
"\n"
msgstr ""
+#: ../svn/help-cmd.c:147
+msgid ""
+"\n"
+"The following authentication credential caches are available:\n"
+"\n"
+msgstr ""
+
+#: ../svn/help-cmd.c:152
+#, c-format
+msgid "%s* Wincrypt cache in %s\n"
+msgstr ""
+
+#: ../svn/help-cmd.c:159
+#, c-format
+msgid "%s* Plaintext cache in %s\n"
+msgstr ""
+
#: ../svn/import-cmd.c:87
msgid "Repository URL required when importing"
msgstr ""
@@ -8899,210 +10137,236 @@ msgstr ""
msgid "Invalid URL '%s'"
msgstr ""
-#: ../svn/info-cmd.c:95
+#: ../svn/info-cmd.c:207
+#, c-format
+msgid "'%s' is not a valid value for --show-item"
+msgstr ""
+
+#: ../svn/info-cmd.c:215
+#, c-format
+msgid "'%s' is not a valid value for --show-item; did you mean '%s'?"
+msgstr ""
+
+#: ../svn/info-cmd.c:225
+#, c-format
+msgid "'%s' is not a valid value for --show-item; did you mean '%s' or '%s'?"
+msgstr ""
+
+#: ../svn/info-cmd.c:236
+#, c-format
+msgid ""
+"'%s' is not a valid value for --show-item; did you mean '%s', '%s' or '%s'?"
+msgstr ""
+
+#: ../svn/info-cmd.c:257
msgid "Resource is not under version control."
msgstr ""
-#: ../svn/info-cmd.c:266 ../svnadmin/svnadmin.c:1744
+#: ../svn/info-cmd.c:424 ../svnadmin/svnadmin.c:1979
+#: ../svnadmin/svnadmin.c:2197
#, c-format
msgid "Path: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:273
+#: ../svn/info-cmd.c:431
#, c-format
msgid "Name: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:277
+#: ../svn/info-cmd.c:435
#, c-format
msgid "Working Copy Root Path: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:283
+#: ../svn/info-cmd.c:441
#, c-format
msgid "URL: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:286
+#: ../svn/info-cmd.c:444
#, c-format
-msgid "Relative URL: ^/%s\n"
+msgid "Relative URL: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:293
+#: ../svn/info-cmd.c:448
#, c-format
msgid "Repository Root: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:297
+#: ../svn/info-cmd.c:452
#, c-format
msgid "Repository UUID: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:301
+#: ../svn/info-cmd.c:456
#, c-format
msgid "Revision: %ld\n"
msgstr ""
-#: ../svn/info-cmd.c:306
+#: ../svn/info-cmd.c:461
#, c-format
msgid "Node Kind: file\n"
msgstr ""
-#: ../svn/info-cmd.c:310
+#: ../svn/info-cmd.c:465
#, c-format
msgid "Node Kind: directory\n"
msgstr ""
-#: ../svn/info-cmd.c:314
+#: ../svn/info-cmd.c:469
#, c-format
msgid "Node Kind: none\n"
msgstr ""
-#: ../svn/info-cmd.c:319
+#: ../svn/info-cmd.c:474
#, c-format
msgid "Node Kind: unknown\n"
msgstr ""
-#: ../svn/info-cmd.c:328
+#: ../svn/info-cmd.c:483
#, c-format
msgid "Schedule: normal\n"
msgstr ""
-#: ../svn/info-cmd.c:332
+#: ../svn/info-cmd.c:487
#, c-format
msgid "Schedule: add\n"
msgstr ""
-#: ../svn/info-cmd.c:336
+#: ../svn/info-cmd.c:491
#, c-format
msgid "Schedule: delete\n"
msgstr ""
-#: ../svn/info-cmd.c:340
+#: ../svn/info-cmd.c:495
#, c-format
msgid "Schedule: replace\n"
msgstr ""
-#: ../svn/info-cmd.c:356
+#: ../svn/info-cmd.c:511
#, c-format
msgid "Depth: empty\n"
msgstr ""
-#: ../svn/info-cmd.c:360
+#: ../svn/info-cmd.c:515
#, c-format
msgid "Depth: files\n"
msgstr ""
-#: ../svn/info-cmd.c:364
+#: ../svn/info-cmd.c:519
#, c-format
msgid "Depth: immediates\n"
msgstr ""
-#: ../svn/info-cmd.c:368
+#: ../svn/info-cmd.c:523
#, c-format
msgid "Depth: exclude\n"
msgstr ""
#. Other depths should never happen here.
-#: ../svn/info-cmd.c:379
+#: ../svn/info-cmd.c:534
#, c-format
msgid "Depth: INVALID\n"
msgstr ""
-#: ../svn/info-cmd.c:383
+#: ../svn/info-cmd.c:538
#, c-format
msgid "Copied From URL: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:387
+#: ../svn/info-cmd.c:542
#, c-format
msgid "Copied From Rev: %ld\n"
msgstr ""
-#: ../svn/info-cmd.c:396 ../svn/info-cmd.c:398
+#: ../svn/info-cmd.c:545
#, c-format
msgid "Moved From: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:409 ../svn/info-cmd.c:411
+#: ../svn/info-cmd.c:552
#, c-format
msgid "Moved To: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:417
+#: ../svn/info-cmd.c:560
#, c-format
msgid "Last Changed Author: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:421
+#: ../svn/info-cmd.c:564
#, c-format
msgid "Last Changed Rev: %ld\n"
msgstr ""
-#: ../svn/info-cmd.c:426
+#: ../svn/info-cmd.c:569
msgid "Last Changed Date"
msgstr ""
-#: ../svn/info-cmd.c:432
+#: ../svn/info-cmd.c:575
msgid "Text Last Updated"
msgstr ""
-#: ../svn/info-cmd.c:435
+#: ../svn/info-cmd.c:578
#, c-format
msgid "Checksum: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:456
+#: ../svn/info-cmd.c:600
#, c-format
msgid "Conflict Previous Base File: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:463
+#: ../svn/info-cmd.c:608
#, c-format
msgid "Conflict Previous Working File: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:470
+#: ../svn/info-cmd.c:616
#, c-format
msgid "Conflict Current Base File: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:479
+#: ../svn/info-cmd.c:626
#, c-format
msgid "Conflict Properties File: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:491
+#: ../svn/info-cmd.c:641
msgid "Tree conflict"
msgstr ""
-#: ../svn/info-cmd.c:517
+#: ../svn/info-cmd.c:667
+msgid "Conflict Details"
+msgstr ""
+
+#: ../svn/info-cmd.c:680
msgid "Source left"
msgstr ""
-#: ../svn/info-cmd.c:526
+#: ../svn/info-cmd.c:689
msgid "Source right"
msgstr ""
-#: ../svn/info-cmd.c:535
+#: ../svn/info-cmd.c:698
#, c-format
msgid "Lock Token: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:539
+#: ../svn/info-cmd.c:702
#, c-format
msgid "Lock Owner: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:544
+#: ../svn/info-cmd.c:707
msgid "Lock Created"
msgstr ""
-#: ../svn/info-cmd.c:548
+#: ../svn/info-cmd.c:711
msgid "Lock Expires"
msgstr ""
-#: ../svn/info-cmd.c:556
+#: ../svn/info-cmd.c:719
#, c-format
msgid ""
"Lock Comment (%i line):\n"
@@ -9113,29 +10377,51 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../svn/info-cmd.c:565
+#: ../svn/info-cmd.c:728
#, c-format
msgid "Changelist: %s\n"
msgstr ""
-#: ../svn/info-cmd.c:679
+#: ../svn/info-cmd.c:884
+msgid "--show-item is not valid in --xml mode"
+msgstr ""
+
+#: ../svn/info-cmd.c:888
+msgid "--no-newline is not valid in --xml mode"
+msgstr ""
+
+#: ../svn/info-cmd.c:903 ../svn/info-cmd.c:923
+msgid "--incremental is only valid in --xml mode"
+msgstr ""
+
+#: ../svn/info-cmd.c:910
+msgid ""
+"--no-newline is only available for single-target, non-recursive info "
+"operations"
+msgstr ""
+
+#: ../svn/info-cmd.c:927
+msgid "--no-newline' is only valid with --show-item"
+msgstr ""
+
+#: ../svn/info-cmd.c:1000 ../svnbench/null-info-cmd.c:283
msgid "Could not display info for all targets because some targets don't exist"
msgstr ""
-#: ../svn/list-cmd.c:73
+#: ../svn/list-cmd.c:79
msgid "%b %d %H:%M"
msgstr ""
-#: ../svn/list-cmd.c:75
+#: ../svn/list-cmd.c:81
msgid "%b %d %Y"
msgstr ""
-#: ../svn/list-cmd.c:101
+#: ../svn/list-cmd.c:107
#, c-format
msgid "Listing external '%s' defined on '%s':\n"
msgstr ""
-#: ../svn/list-cmd.c:421
+#: ../svn/list-cmd.c:433 ../svnbench/null-list-cmd.c:166
msgid "Could not list all targets because some targets don't exist"
msgstr ""
@@ -9143,183 +10429,208 @@ msgstr ""
msgid "Lock comment contains a zero byte"
msgstr ""
-#: ../svn/log-cmd.c:144
+#: ../svn/lock-cmd.c:144
+msgid "One or more locks could not be obtained"
+msgstr ""
+
+#: ../svn/log-cmd.c:109
msgid "\n"
msgstr ""
-#: ../svn/log-cmd.c:354
+#: ../svn/log-cmd.c:321
msgid "(no author)"
msgstr ""
-#: ../svn/log-cmd.c:360
+#: ../svn/log-cmd.c:327
msgid "(no date)"
msgstr ""
-#: ../svn/log-cmd.c:385
+#: ../svn/log-cmd.c:357
#, c-format
msgid " | %d line"
msgid_plural " | %d lines"
msgstr[0] ""
msgstr[1] ""
-#: ../svn/log-cmd.c:401
+#: ../svn/log-cmd.c:374
#, c-format
msgid "Changed paths:\n"
msgstr ""
-#: ../svn/log-cmd.c:418
+#: ../svn/log-cmd.c:394
#, c-format
msgid " (from %s:%ld)"
msgstr ""
-#: ../svn/log-cmd.c:434
+#: ../svn/log-cmd.c:412
#, c-format
msgid "Reverse merged via:"
msgstr ""
-#: ../svn/log-cmd.c:436
+#: ../svn/log-cmd.c:414
#, c-format
msgid "Merged via:"
msgstr ""
-#: ../svn/log-cmd.c:689
+#: ../svn/log-cmd.c:697
msgid "'with-all-revprops' option only valid in XML mode"
msgstr ""
-#: ../svn/log-cmd.c:693
+#: ../svn/log-cmd.c:701
msgid "'with-no-revprops' option only valid in XML mode"
msgstr ""
-#: ../svn/log-cmd.c:697
+#: ../svn/log-cmd.c:705
msgid "'with-revprop' option only valid in XML mode"
msgstr ""
-#: ../svn/log-cmd.c:704
+#: ../svn/log-cmd.c:712
msgid "'diff' option is not supported in XML mode"
msgstr ""
-#: ../svn/log-cmd.c:710
+#: ../svn/log-cmd.c:718
msgid "'quiet' and 'diff' options are mutually exclusive"
msgstr ""
-#: ../svn/log-cmd.c:714
+#: ../svn/log-cmd.c:722
msgid "'diff-cmd' option requires 'diff' option"
msgstr ""
-#: ../svn/log-cmd.c:718
+#: ../svn/log-cmd.c:726
msgid "'internal-diff' option requires 'diff' option"
msgstr ""
-#: ../svn/log-cmd.c:722
+#: ../svn/log-cmd.c:730
msgid "'extensions' option requires 'diff' option"
msgstr ""
-#: ../svn/log-cmd.c:727
+#: ../svn/log-cmd.c:735
msgid "'depth' option requires 'diff' option"
msgstr ""
-#: ../svn/log-cmd.c:743
+#: ../svn/log-cmd.c:751 ../svnbench/null-log-cmd.c:158
msgid "-c and -r are mutually exclusive"
msgstr ""
-#: ../svn/log-cmd.c:775
+#: ../svn/log-cmd.c:783
#, c-format
msgid ""
"Only relative paths can be specified after a URL for 'svn log', but '%s' is "
"not a relative path"
msgstr ""
-#: ../svn/log-cmd.c:821
+#: ../svn/log-cmd.c:829
#, c-format
msgid "cannot assign with 'with-revprop' option (drop the '=')"
msgstr ""
-#: ../svn/merge-cmd.c:107 ../svn/merge-cmd.c:131
+#: ../svn/merge-cmd.c:103 ../svn/merge-cmd.c:132
#, c-format
msgid "--- Merging\n"
msgstr ""
-#: ../svn/merge-cmd.c:175
+#: ../svn/merge-cmd.c:128
+#, c-format
+msgid "Merge target '%s' must be a local path but looks like a URL"
+msgstr ""
+
+#: ../svn/merge-cmd.c:176
msgid "-r and -c can't be used with --reintegrate"
msgstr ""
-#: ../svn/merge-cmd.c:230
+#: ../svn/merge-cmd.c:231
msgid "Merge source required"
msgstr ""
-#: ../svn/merge-cmd.c:276
+#: ../svn/merge-cmd.c:277
msgid "Second revision required"
msgstr ""
-#: ../svn/merge-cmd.c:285 ../svn/merge-cmd.c:312 ../svn/mergeinfo-cmd.c:267
-#: ../svnadmin/svnadmin.c:1719 ../svnlook/svnlook.c:2061
-#: ../svnlook/svnlook.c:2254 ../svnlook/svnlook.c:2358
-#: ../svnlook/svnlook.c:2393
+#: ../svn/merge-cmd.c:286 ../svn/merge-cmd.c:313 ../svn/mergeinfo-cmd.c:361
+#: ../svnadmin/svnadmin.c:2168 ../svnlook/svnlook.c:2062
+#: ../svnlook/svnlook.c:2256 ../svnlook/svnlook.c:2360
+#: ../svnlook/svnlook.c:2395
msgid "Too many arguments given"
msgstr ""
-#: ../svn/merge-cmd.c:302
+#: ../svn/merge-cmd.c:303
msgid "Cannot specify a revision range with two URLs"
msgstr ""
-#: ../svn/merge-cmd.c:406
+#: ../svn/merge-cmd.c:407
msgid "--reintegrate cannot be used with --ignore-ancestry"
msgstr ""
-#: ../svn/merge-cmd.c:411
+#: ../svn/merge-cmd.c:412
msgid "--reintegrate cannot be used with --record-only"
msgstr ""
-#: ../svn/merge-cmd.c:416
+#: ../svn/merge-cmd.c:417
msgid "--depth cannot be used with --reintegrate"
msgstr ""
-#: ../svn/merge-cmd.c:421
+#: ../svn/merge-cmd.c:422
msgid "--force cannot be used with --reintegrate"
msgstr ""
-#: ../svn/merge-cmd.c:426
+#: ../svn/merge-cmd.c:427
msgid "--reintegrate can only be used with a single merge source"
msgstr ""
-#: ../svn/merge-cmd.c:430
+#: ../svn/merge-cmd.c:431
msgid "--allow-mixed-revisions cannot be used with --reintegrate"
msgstr ""
-#: ../svn/merge-cmd.c:445
+#: ../svn/merge-cmd.c:446
msgid ""
"Merge tracking not possible, use --ignore-ancestry or\n"
"fix invalid mergeinfo in target with 'svn propset'"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "last full merge"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "youngest common ancestor"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
msgid "repository path"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
msgid "tip of branch"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:264
+#: ../svn/mergeinfo-cmd.c:358
msgid "Not enough arguments given"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:342
+#: ../svn/mergeinfo-cmd.c:404
+msgid "--quiet (-q) option valid only with --log option"
+msgstr ""
+
+#: ../svn/mergeinfo-cmd.c:409
+msgid "--verbose (-v) option valid only with --log option"
+msgstr ""
+
+#: ../svn/mergeinfo-cmd.c:414
+msgid "--incremental option valid only with --log option"
+msgstr ""
+
+#: ../svn/mergeinfo-cmd.c:444
msgid "--revision (-r) option valid only with --show-revs option"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:346
+#: ../svn/mergeinfo-cmd.c:448
msgid "Depth specification options valid only with --show-revs option"
msgstr ""
+#: ../svn/mergeinfo-cmd.c:452
+msgid "--log option valid only with --show-revs option"
+msgstr ""
+
#: ../svn/mkdir-cmd.c:92
msgid "Try 'svn add' or 'svn add --non-recursive' instead?"
msgstr ""
@@ -9382,392 +10693,431 @@ msgstr ""
msgid " Skipped paths: %d\n"
msgstr ""
-#: ../svn/notify.c:235
+#: ../svn/notify.c:246 ../svnbench/notify.c:107
#, c-format
msgid "Skipped missing target: '%s'\n"
msgstr ""
-#: ../svn/notify.c:242
+#: ../svn/notify.c:253 ../svnbench/notify.c:114
#, c-format
msgid "Skipped target: '%s' -- copy-source is missing\n"
msgstr ""
-#: ../svn/notify.c:249
+#: ../svn/notify.c:258 ../svnbench/notify.c:121
#, c-format
msgid "Skipped '%s'\n"
msgstr ""
-#: ../svn/notify.c:256
+#: ../svn/notify.c:265 ../svnbench/notify.c:128
#, c-format
msgid "Skipped '%s' -- An obstructing working copy was found\n"
msgstr ""
-#: ../svn/notify.c:263
+#: ../svn/notify.c:271 ../svnbench/notify.c:135
#, c-format
msgid "Skipped '%s' -- Has no versioned parent\n"
msgstr ""
-#: ../svn/notify.c:270
+#: ../svn/notify.c:277 ../svnbench/notify.c:142
#, c-format
msgid "Skipped '%s' -- Access denied\n"
msgstr ""
-#: ../svn/notify.c:277
+#: ../svn/notify.c:283 ../svnbench/notify.c:149
#, c-format
msgid "Skipped '%s' -- Node remains in conflict\n"
msgstr ""
-#: ../svn/notify.c:358
+#: ../svn/notify.c:299
+#, c-format
+msgid "Removed external '%s': %s\n"
+msgstr ""
+
+#: ../svn/notify.c:304
+#, c-format
+msgid "Removed external '%s'\n"
+msgstr ""
+
+#: ../svn/notify.c:310
+#, c-format
+msgid "Left local modifications as '%s'\n"
+msgstr ""
+
+#: ../svn/notify.c:354 ../svnbench/notify.c:233
#, c-format
msgid "Restored '%s'\n"
msgstr ""
-#: ../svn/notify.c:364
+#: ../svn/notify.c:359 ../svnbench/notify.c:239
#, c-format
msgid "Reverted '%s'\n"
msgstr ""
-#: ../svn/notify.c:370
+#: ../svn/notify.c:364 ../svnbench/notify.c:245
#, c-format
msgid "Failed to revert '%s' -- try updating instead.\n"
msgstr ""
-#: ../svn/notify.c:378
+#: ../svn/notify.c:371 ../svnbench/notify.c:253
#, c-format
msgid "Resolved conflicted state of '%s'\n"
msgstr ""
-#: ../svn/notify.c:473 ../svn/notify.c:513
+#: ../svn/notify.c:461 ../svn/notify.c:498 ../svnbench/notify.c:344
+#: ../svnbench/notify.c:384
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s"
msgstr ""
-#: ../svn/notify.c:490 ../svn/notify.c:527
+#: ../svn/notify.c:478 ../svn/notify.c:512 ../svnbench/notify.c:361
+#: ../svnbench/notify.c:398
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s"
msgstr ""
-#: ../svn/notify.c:548
+#: ../svn/notify.c:530 ../svnbench/notify.c:419
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %lu (%s)\n"
msgstr ""
-#: ../svn/notify.c:558
+#: ../svn/notify.c:540 ../svnbench/notify.c:429
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %lu\n"
msgstr ""
-#: ../svn/notify.c:576
+#: ../svn/notify.c:556 ../svnbench/notify.c:447
#, c-format
msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n"
msgstr ""
-#: ../svn/notify.c:585
+#: ../svn/notify.c:565 ../svnbench/notify.c:456
#, c-format
msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n"
msgstr ""
-#: ../svn/notify.c:599
+#: ../svn/notify.c:577 ../svnbench/notify.c:470
#, c-format
msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n"
msgstr ""
-#: ../svn/notify.c:609
+#: ../svn/notify.c:587 ../svnbench/notify.c:480
#, c-format
msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n"
msgstr ""
-#: ../svn/notify.c:669
+#: ../svn/notify.c:644 ../svnbench/notify.c:542
#, c-format
msgid ""
"\n"
"Fetching external item into '%s':\n"
msgstr ""
-#: ../svn/notify.c:695
+#: ../svn/notify.c:668 ../svnbench/notify.c:568
#, c-format
msgid "Error handling externals definition for '%s':"
msgstr ""
-#: ../svn/notify.c:708
+#: ../svn/notify.c:681 ../svnbench/notify.c:581
#, c-format
msgid "Updating '%s':\n"
msgstr ""
-#: ../svn/notify.c:722
+#: ../svn/notify.c:694 ../svnbench/notify.c:595
#, c-format
msgid "Exported external at revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:723
+#: ../svn/notify.c:695 ../svnbench/notify.c:596
#, c-format
msgid "Exported revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:731
+#: ../svn/notify.c:702 ../svnbench/notify.c:604
#, c-format
msgid "Checked out external at revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:732
+#: ../svn/notify.c:703 ../svnbench/notify.c:605
#, c-format
msgid "Checked out revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:743
+#: ../svn/notify.c:713 ../svnbench/notify.c:616
#, c-format
msgid "Updated external to revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:744
+#: ../svn/notify.c:714 ../svnbench/notify.c:617
#, c-format
msgid "Updated to revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:752
+#: ../svn/notify.c:721 ../svnbench/notify.c:625
#, c-format
msgid "External at revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:753
+#: ../svn/notify.c:722 ../svnbench/notify.c:626
#, c-format
msgid "At revision %ld.\n"
msgstr ""
-#: ../svn/notify.c:765
+#: ../svn/notify.c:733 ../svnbench/notify.c:638
#, c-format
msgid "External export complete.\n"
msgstr ""
-#: ../svn/notify.c:766
+#: ../svn/notify.c:734 ../svnbench/notify.c:639
#, c-format
msgid "Export complete.\n"
msgstr ""
-#: ../svn/notify.c:773
+#: ../svn/notify.c:740 ../svnbench/notify.c:646
#, c-format
msgid "External checkout complete.\n"
msgstr ""
-#: ../svn/notify.c:774
+#: ../svn/notify.c:741 ../svnbench/notify.c:647
#, c-format
msgid "Checkout complete.\n"
msgstr ""
-#: ../svn/notify.c:781
+#: ../svn/notify.c:747 ../svnbench/notify.c:654
#, c-format
msgid "External update complete.\n"
msgstr ""
-#: ../svn/notify.c:782
+#: ../svn/notify.c:748 ../svnbench/notify.c:655
#, c-format
msgid "Update complete.\n"
msgstr ""
-#: ../svn/notify.c:798
+#: ../svn/notify.c:762 ../svnbench/notify.c:671
#, c-format
msgid ""
"\n"
"Performing status on external item at '%s':\n"
msgstr ""
-#: ../svn/notify.c:806
+#: ../svn/notify.c:768
+#, c-format
+msgid ""
+"\n"
+"Performing info on external item at '%s':\n"
+msgstr ""
+
+#: ../svn/notify.c:775 ../svnbench/notify.c:679
#, c-format
msgid "Status against revision: %6ld\n"
msgstr ""
-#: ../svn/notify.c:815
+#: ../svn/notify.c:783 ../svnbench/notify.c:688
#, c-format
msgid "Sending copy of %s\n"
msgstr ""
-#: ../svn/notify.c:816
+#: ../svn/notify.c:784 ../svnbench/notify.c:689
#, c-format
msgid "Sending %s\n"
msgstr ""
-#: ../svn/notify.c:827
+#: ../svn/notify.c:794 ../svnbench/notify.c:700
#, c-format
msgid "Adding copy of (bin) %s\n"
msgstr ""
-#: ../svn/notify.c:828
+#: ../svn/notify.c:795 ../svnbench/notify.c:701
#, c-format
msgid "Adding (bin) %s\n"
msgstr ""
-#: ../svn/notify.c:836
+#: ../svn/notify.c:802 ../svnbench/notify.c:709
#, c-format
msgid "Adding copy of %s\n"
msgstr ""
-#: ../svn/notify.c:837
+#: ../svn/notify.c:803 ../svnbench/notify.c:710
#, c-format
msgid "Adding %s\n"
msgstr ""
-#: ../svn/notify.c:846
+#: ../svn/notify.c:811 ../svnbench/notify.c:719
#, c-format
msgid "Deleting copy of %s\n"
msgstr ""
-#: ../svn/notify.c:847
+#: ../svn/notify.c:812 ../svnbench/notify.c:720
#, c-format
msgid "Deleting %s\n"
msgstr ""
-#: ../svn/notify.c:856
+#: ../svn/notify.c:820 ../svnbench/notify.c:729
#, c-format
msgid "Replacing copy of %s\n"
msgstr ""
-#: ../svn/notify.c:857
+#: ../svn/notify.c:821 ../svnbench/notify.c:730
#, c-format
msgid "Replacing %s\n"
msgstr ""
-#: ../svn/notify.c:867 ../svnsync/sync.c:416
+#: ../svn/notify.c:830 ../svnbench/notify.c:740 ../svnsync/sync.c:416
#, c-format
msgid "Transmitting file data "
msgstr ""
-#: ../svn/notify.c:876 ../svnadmin/svnadmin.c:1698
+#: ../svn/notify.c:837 ../svnadmin/svnadmin.c:2146 ../svnbench/notify.c:749
#, c-format
msgid "'%s' locked by user '%s'.\n"
msgstr ""
-#: ../svn/notify.c:882
+#: ../svn/notify.c:842 ../svnbench/notify.c:755
#, c-format
msgid "'%s' unlocked.\n"
msgstr ""
-#: ../svn/notify.c:909
+#: ../svn/notify.c:866 ../svnbench/notify.c:782
#, c-format
msgid "--- Merging differences between repository URLs into '%s':\n"
msgstr ""
-#: ../svn/notify.c:914
+#: ../svn/notify.c:871 ../svnbench/notify.c:787
#, c-format
msgid "--- Merging r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:918
+#: ../svn/notify.c:875 ../svnbench/notify.c:791
#, c-format
msgid "--- Reverse-merging r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:922
+#: ../svn/notify.c:879 ../svnbench/notify.c:795
#, c-format
msgid "--- Merging r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:928
+#: ../svn/notify.c:885 ../svnbench/notify.c:801
#, c-format
msgid "--- Reverse-merging r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:940
+#: ../svn/notify.c:895 ../svnbench/notify.c:813
#, c-format
msgid "--- Recording mergeinfo for merge between repository URLs into '%s':\n"
msgstr ""
-#: ../svn/notify.c:950
+#: ../svn/notify.c:905 ../svnbench/notify.c:823
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:955
+#: ../svn/notify.c:910 ../svnbench/notify.c:828
#, c-format
msgid "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:960
+#: ../svn/notify.c:915 ../svnbench/notify.c:833
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:965
+#: ../svn/notify.c:920 ../svnbench/notify.c:838
#, c-format
msgid ""
"--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:975
+#: ../svn/notify.c:927 ../svnbench/notify.c:848
#, c-format
msgid "--- Eliding mergeinfo from '%s':\n"
msgstr ""
-#: ../svn/notify.c:983
+#: ../svn/notify.c:934 ../svnbench/notify.c:856
#, c-format
msgid "--- Merging differences between foreign repository URLs into '%s':\n"
msgstr ""
-#: ../svn/notify.c:989
+#: ../svn/notify.c:940 ../svnbench/notify.c:862
#, c-format
msgid "--- Merging (from foreign repository) r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:994
+#: ../svn/notify.c:945 ../svnbench/notify.c:867
#, c-format
msgid "--- Reverse-merging (from foreign repository) r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:999
+#: ../svn/notify.c:950 ../svnbench/notify.c:872
#, c-format
msgid "--- Merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:1005
+#: ../svn/notify.c:956 ../svnbench/notify.c:878
#, c-format
msgid ""
"--- Reverse-merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr ""
-#: ../svn/notify.c:1041
+#: ../svn/notify.c:986 ../svnbench/notify.c:915
#, c-format
msgid "property '%s' set on '%s'\n"
msgstr ""
-#: ../svn/notify.c:1049
+#: ../svn/notify.c:992 ../svnbench/notify.c:923
#, c-format
msgid "property '%s' deleted from '%s'.\n"
msgstr ""
-#: ../svn/notify.c:1057
+#: ../svn/notify.c:998 ../svnbench/notify.c:931
#, c-format
msgid "Attempting to delete nonexistent property '%s' on '%s'\n"
msgstr ""
-#: ../svn/notify.c:1066
+#: ../svn/notify.c:1005 ../svnbench/notify.c:940
#, c-format
msgid "property '%s' set on repository revision %ld\n"
msgstr ""
-#: ../svn/notify.c:1074
+#: ../svn/notify.c:1011 ../svnbench/notify.c:948
#, c-format
msgid "property '%s' deleted from repository revision %ld\n"
msgstr ""
-#: ../svn/notify.c:1081
+#: ../svn/notify.c:1016 ../svnbench/notify.c:955
#, c-format
msgid "Upgraded '%s'\n"
msgstr ""
-#: ../svn/notify.c:1087
+#: ../svn/notify.c:1020 ../svnbench/notify.c:961
#, c-format
msgid "Redirecting to URL '%s':\n"
msgstr ""
-#: ../svn/notify.c:1115
+#: ../svn/notify.c:1044
#, c-format
msgid "--- Copying from foreign repository URL '%s':\n"
msgstr ""
-#: ../svn/notify.c:1124
+#: ../svn/notify.c:1051
#, c-format
msgid "Breaking move with source path '%s'\n"
msgstr ""
+#: ../svn/notify.c:1057
+#, c-format
+msgid "Performing cleanup on external item at '%s'.\n"
+msgstr ""
+
+#: ../svn/notify.c:1064
+#, c-format
+msgid "done\n"
+msgstr ""
+
+#: ../svn/notify.c:1066
+#, c-format
+msgid "Committing transaction...\n"
+msgstr ""
+
#: ../svn/propdel-cmd.c:88
#, c-format
msgid "Cannot specify revision for deleting versioned property '%s'"
@@ -9812,13 +11162,12 @@ msgstr ""
msgid "No changes to property '%s' on '%s'\n"
msgstr ""
-#: ../svn/propget-cmd.c:66
+#: ../svn/propget-cmd.c:67
msgid "Error writing to stream"
msgstr ""
-#: ../svn/propget-cmd.c:186 ../svn/proplist-cmd.c:156
-#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1754
-#: ../svnlook/svnlook.c:1908
+#: ../svn/propget-cmd.c:187 ../svn/proplist-cmd.c:156 ../svn/proplist-cmd.c:160
+#: ../svnlook/svnlook.c:1754 ../svnlook/svnlook.c:1908
#, c-format
msgid ""
"Inherited properties on '%s',\n"
@@ -9826,24 +11175,34 @@ msgid ""
msgstr ""
#. Not a --revprop
-#: ../svn/propget-cmd.c:196 ../svn/proplist-cmd.c:175
-#: ../svnlook/svnlook.c:1790 ../svnlook/svnlook.c:1943
+#: ../svn/propget-cmd.c:197 ../svn/proplist-cmd.c:175 ../svnlook/svnlook.c:1789
+#: ../svnlook/svnlook.c:1943
#, c-format
msgid "Properties on '%s':\n"
msgstr ""
-#: ../svn/propget-cmd.c:326
-msgid "--verbose cannot be used with --revprop or --strict or --xml"
+#: ../svn/propget-cmd.c:328
+msgid "--verbose cannot be used with --revprop or --no-newline or --xml"
msgstr ""
-#: ../svn/propget-cmd.c:358 ../svn/proplist-cmd.c:214
+#: ../svn/propget-cmd.c:360 ../svn/proplist-cmd.c:214
msgid "--show-inherited-props can't be used with --revprop"
msgstr ""
-#: ../svn/propget-cmd.c:425
+#: ../svn/propget-cmd.c:373
+#, c-format
+msgid "Property '%s' not found on revision %s"
+msgstr ""
+
+#: ../svn/propget-cmd.c:438
msgid ""
-"Strict output of property values only available for single-target, non-"
-"recursive propget operations"
+"--no-newline is only available for single-target, non-recursive propget "
+"operations"
+msgstr ""
+
+#: ../svn/propget-cmd.c:493
+#, c-format
+msgid "Property '%s' not found on '%s'"
msgstr ""
#: ../svn/proplist-cmd.c:246
@@ -9883,57 +11242,49 @@ msgid ""
"setting the property to '%s' will not turn it off."
msgstr ""
-#: ../svn/props.c:177
+#: ../svn/props.c:124
#, c-format
-msgid "(To set the '%s' property, re-run with '--force'.)"
+msgid "Use '--force' to set the '%s' property."
msgstr ""
-#: ../svn/props.c:182
+#: ../svn/props.c:129
#, c-format
-msgid "(To edit the '%s' property, re-run with '--force'.)"
+msgid "Use '--force' to edit the '%s' property."
msgstr ""
-#: ../svn/props.c:188
+#: ../svn/props.c:135
#, c-format
-msgid "(To use the '%s' property, re-run with '--force'.)"
+msgid "Use '--force' to use the '%s' property'."
msgstr ""
-#: ../svn/props.c:202
+#: ../svn/props.c:149
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to set it"
+msgid "'%s' is not a valid %s property name; use '--force' to set it"
msgstr ""
-#: ../svn/props.c:208
+#: ../svn/props.c:154
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to edit it"
+msgid "'%s' is not a valid %s property name; use '--force' to edit it"
msgstr ""
-#: ../svn/props.c:215
+#: ../svn/props.c:160
#, c-format
-msgid "'%s' is not a valid %s property name; re-run with '--force' to use it"
+msgid "'%s' is not a valid %s property name; use '--force' to use it"
msgstr ""
-#: ../svn/props.c:281 ../svn/props.c:332
+#: ../svn/props.c:226 ../svn/props.c:269
#, c-format
-msgid ""
-"'%s' is not a valid %s property name; did you mean '%s'?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s'?"
msgstr ""
-#: ../svn/props.c:340
+#: ../svn/props.c:278
#, c-format
-msgid ""
-"'%s' is not a valid %s property name\n"
-"Did you mean '%s' or '%s'?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s' or '%s'?"
msgstr ""
-#: ../svn/props.c:350
+#: ../svn/props.c:288
#, c-format
-msgid ""
-"'%s' is not a valid %s property name\n"
-"Did you mean '%s', '%s' or '%s'?\n"
-"%s"
+msgid "'%s' is not a valid %s property name; did you mean '%s', '%s' or '%s'?"
msgstr ""
#: ../svn/propset-cmd.c:132
@@ -9958,7 +11309,7 @@ msgstr ""
msgid "Failure occurred resolving one or more conflicts"
msgstr ""
-#: ../svn/revert-cmd.c:77
+#: ../svn/revert-cmd.c:80
msgid "Try 'svn revert --depth infinity' instead?"
msgstr ""
@@ -9977,60 +11328,66 @@ msgstr ""
msgid " Tree conflicts: %u\n"
msgstr ""
-#: ../svn/status-cmd.c:398
+#: ../svn/status-cmd.c:296
+msgid "--revision (-r) option valid only with --show-updates (-u) option"
+msgstr ""
+
+#: ../svn/status-cmd.c:406
#, c-format
msgid ""
"\n"
"--- Changelist '%s':\n"
msgstr ""
-#: ../svn/status.c:318
+#: ../svn/status.c:316
#, c-format
msgid "swapped places with %s"
msgstr ""
-#: ../svn/status.c:333
+#: ../svn/status.c:331
#, c-format
msgid "moved from %s"
msgstr ""
-#: ../svn/status.c:345
+#: ../svn/status.c:343
#, c-format
msgid "moved to %s"
msgstr ""
-#: ../svn/svn.c:147
+#: ../svn/svn.c:155
msgid "force operation to run"
msgstr ""
-#: ../svn/svn.c:149
+#: ../svn/svn.c:157
msgid "force validity of log message source"
msgstr ""
-#: ../svn/svn.c:150 ../svn/svn.c:151 ../svnadmin/svnadmin.c:208
-#: ../svnadmin/svnadmin.c:211 ../svndumpfilter/svndumpfilter.c:1047
-#: ../svndumpfilter/svndumpfilter.c:1050 ../svnlook/svnlook.c:114
-#: ../svnlook/svnlook.c:126 ../svnsync/svnsync.c:244 ../svnsync/svnsync.c:246
+#: ../svn/svn.c:158 ../svn/svn.c:159 ../svnadmin/svnadmin.c:227
+#: ../svnadmin/svnadmin.c:230 ../svnbench/svnbench.c:81
+#: ../svnbench/svnbench.c:82 ../svndumpfilter/svndumpfilter.c:977
+#: ../svndumpfilter/svndumpfilter.c:980 ../svnfsfs/svnfsfs.c:129
+#: ../svnfsfs/svnfsfs.c:132 ../svnlook/svnlook.c:115 ../svnlook/svnlook.c:127
+#: ../svnsync/svnsync.c:277 ../svnsync/svnsync.c:279
msgid "show help on a subcommand"
msgstr ""
-#: ../svn/svn.c:152
+#: ../svn/svn.c:160
msgid "specify log message ARG"
msgstr ""
-#: ../svn/svn.c:153
+#: ../svn/svn.c:161 ../svnbench/svnbench.c:83
msgid "print nothing, or only summary information"
msgstr ""
-#: ../svn/svn.c:154
+#: ../svn/svn.c:162 ../svnbench/svnbench.c:84
msgid "descend recursively, same as --depth=infinity"
msgstr ""
-#: ../svn/svn.c:155
+#: ../svn/svn.c:163 ../svnbench/svnbench.c:85
msgid "obsolete; try --depth=files or --depth=immediates"
msgstr ""
-#: ../svn/svn.c:157
+#: ../svn/svn.c:165 ../svnbench/svnbench.c:87
msgid ""
"the change made by revision ARG (like -r ARG-1:ARG)\n"
" If ARG is negative this is like -r ARG:ARG-1\n"
@@ -10039,7 +11396,7 @@ msgid ""
" ARG1:ARG2, where ARG1 is inclusive"
msgstr ""
-#: ../svn/svn.c:165
+#: ../svn/svn.c:173 ../svnbench/svnbench.c:95
msgid ""
"ARG (some commands also take ARG1:ARG2 range)\n"
" A revision argument can be one of:\n"
@@ -10052,42 +11409,45 @@ msgid ""
" 'PREV' revision just before COMMITTED"
msgstr ""
-#: ../svn/svn.c:180
+#: ../svn/svn.c:188
msgid "read log message from file ARG"
msgstr ""
-#: ../svn/svn.c:182
+#: ../svn/svn.c:190
msgid "give output suitable for concatenation"
msgstr ""
-#: ../svn/svn.c:184
+#: ../svn/svn.c:192
msgid "treat value as being in charset encoding ARG"
msgstr ""
-#: ../svn/svn.c:185 ../svnadmin/svnadmin.c:214
-#: ../svndumpfilter/svndumpfilter.c:1053 ../svnlook/svnlook.c:168
-#: ../svnrdump/svnrdump.c:144 ../svnserve/svnserve.c:287
-#: ../svnsync/svnsync.c:242 ../svnversion/svnversion.c:141
+#: ../svn/svn.c:193 ../svnadmin/svnadmin.c:233 ../svnbench/svnbench.c:110
+#: ../svndumpfilter/svndumpfilter.c:983 ../svnfsfs/svnfsfs.c:135
+#: ../svnlook/svnlook.c:172 ../svnrdump/svnrdump.c:150
+#: ../svnserve/svnserve.c:378 ../svnsync/svnsync.c:275
+#: ../svnversion/svnversion.c:144
msgid "show program version information"
msgstr ""
-#: ../svn/svn.c:186
+#: ../svn/svn.c:194 ../svnbench/svnbench.c:111
msgid "print extra information"
msgstr ""
-#: ../svn/svn.c:187
+#: ../svn/svn.c:195
msgid "display update information"
msgstr ""
-#: ../svn/svn.c:188 ../svnrdump/svnrdump.c:128
+#: ../svn/svn.c:196 ../svnbench/svnbench.c:112 ../svnrdump/svnrdump.c:134
msgid "specify a username ARG"
msgstr ""
-#: ../svn/svn.c:189 ../svnrdump/svnrdump.c:130
-msgid "specify a password ARG"
+#: ../svn/svn.c:198
+msgid ""
+"specify a password ARG (caution: on many operating\n"
+" systems, other users will be able to see this)"
msgstr ""
-#: ../svn/svn.c:191
+#: ../svn/svn.c:202
msgid ""
"Specify differencing options for external diff or\n"
" internal diff or blame. Default: '-u'. Options "
@@ -10102,113 +11462,128 @@ msgid ""
"space\n"
" --ignore-eol-style: Ignore changes in EOL "
"style\n"
+" -U ARG, --context ARG: Show ARG lines of "
+"context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
-#: ../svn/svn.c:209
+#: ../svn/svn.c:222 ../svnbench/svnbench.c:115
msgid "pass contents of file ARG as additional args"
msgstr ""
-#: ../svn/svn.c:211
+#: ../svn/svn.c:224 ../svnbench/svnbench.c:117
msgid ""
"limit operation by depth ARG ('empty', 'files',\n"
" 'immediates', or 'infinity')"
msgstr ""
-#: ../svn/svn.c:215
+#: ../svn/svn.c:228
msgid ""
"set new working copy depth to ARG ('exclude',\n"
" 'empty', 'files', 'immediates', or 'infinity')"
msgstr ""
-#: ../svn/svn.c:218 ../svnlook/svnlook.c:171
+#: ../svn/svn.c:231 ../svnlook/svnlook.c:175
msgid "output in XML"
msgstr ""
-#: ../svn/svn.c:219
-msgid "use strict semantics"
+#: ../svn/svn.c:232
+msgid "DEPRECATED"
msgstr ""
-#: ../svn/svn.c:221
+#: ../svn/svn.c:234 ../svnbench/svnbench.c:122
msgid "do not cross copies while traversing history"
msgstr ""
-#: ../svn/svn.c:223
+#: ../svn/svn.c:236
msgid ""
"disregard default and svn:ignore and\n"
" svn:global-ignores property ignores"
msgstr ""
-#: ../svn/svn.c:227 ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:188
+#: ../svn/svn.c:240 ../svnbench/svnbench.c:124 ../svnrdump/svnrdump.c:146
+#: ../svnsync/svnsync.c:191
msgid "do not cache authentication tokens"
msgstr ""
-#: ../svn/svn.c:229 ../svnrdump/svnrdump.c:154 ../svnsync/svnsync.c:198
+#: ../svn/svn.c:242 ../svnbench/svnbench.c:126 ../svnrdump/svnrdump.c:160
+msgid ""
+"deprecated; same as\n"
+" --trust-server-cert-failures=unknown-ca"
+msgstr ""
+
+#: ../svn/svn.c:246 ../svnbench/svnbench.c:130 ../svnrdump/svnrdump.c:164
msgid ""
-"accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but "
-"only\n"
-" with '--non-interactive')"
+"with --non-interactive, accept SSL server\n"
+" certificates with failures; ARG is comma-"
+"separated\n"
+" list of 'unknown-ca' (Unknown Authority),\n"
+" 'cn-mismatch' (Hostname mismatch), 'expired'\n"
+" (Expired certificate), 'not-yet-valid' (Not "
+"yet\n"
+" valid certificate) and 'other' (all other not\n"
+" separately classified certificate errors)."
msgstr ""
-#: ../svn/svn.c:235 ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:180
+#: ../svn/svn.c:260 ../svnrdump/svnrdump.c:138 ../svnsync/svnsync.c:183
msgid ""
"do no interactive prompting (default is to prompt\n"
" only if standard input is a terminal device)"
msgstr ""
-#: ../svn/svn.c:239 ../svnrdump/svnrdump.c:136 ../svnsync/svnsync.c:184
+#: ../svn/svn.c:264 ../svnrdump/svnrdump.c:142 ../svnsync/svnsync.c:187
msgid ""
"do interactive prompting even if standard input\n"
" is not a terminal device"
msgstr ""
-#: ../svn/svn.c:243
+#: ../svn/svn.c:268
msgid "try operation but make no changes"
msgstr ""
-#: ../svn/svn.c:245
+#: ../svn/svn.c:270
msgid "disable merge tracking; diff nodes as if related"
msgstr ""
-#: ../svn/svn.c:247
+#: ../svn/svn.c:272
msgid "ignore externals definitions"
msgstr ""
-#: ../svn/svn.c:248
+#: ../svn/svn.c:273
msgid "use ARG as merge command"
msgstr ""
-#: ../svn/svn.c:249
+#: ../svn/svn.c:274
msgid "use ARG as external editor"
msgstr ""
-#: ../svn/svn.c:251
+#: ../svn/svn.c:276
msgid "merge only mergeinfo differences"
msgstr ""
-#: ../svn/svn.c:252
+#: ../svn/svn.c:277
msgid "use ARG as the older target"
msgstr ""
-#: ../svn/svn.c:253
+#: ../svn/svn.c:278
msgid "use ARG as the newer target"
msgstr ""
-#: ../svn/svn.c:255
+#: ../svn/svn.c:280
msgid "operate on a revision property (use with -r)"
msgstr ""
-#: ../svn/svn.c:256
+#: ../svn/svn.c:281
msgid "relocate via URL-rewriting"
msgstr ""
-#: ../svn/svn.c:258 ../svnadmin/svnadmin.c:256 ../svnrdump/svnrdump.c:126
-#: ../svnsync/svnsync.c:212
+#: ../svn/svn.c:283 ../svnadmin/svnadmin.c:280 ../svnbench/svnbench.c:146
+#: ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:241
msgid "read user configuration files from directory ARG"
msgstr ""
-#: ../svn/svn.c:260 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:214
+#: ../svn/svn.c:285 ../svnbench/svnbench.c:148 ../svnrdump/svnrdump.c:152
+#: ../svnsync/svnsync.c:243
msgid ""
"set user configuration option in the format:\n"
" FILE:SECTION:OPTION=[VALUE]\n"
@@ -10216,15 +11591,15 @@ msgid ""
" servers:global:http-library=serf"
msgstr ""
-#: ../svn/svn.c:267
+#: ../svn/svn.c:292
msgid "enable automatic properties"
msgstr ""
-#: ../svn/svn.c:268
+#: ../svn/svn.c:293
msgid "disable automatic properties"
msgstr ""
-#: ../svn/svn.c:270
+#: ../svn/svn.c:295
msgid ""
"use a different EOL marker than the standard\n"
" system marker for files with the svn:eol-style\n"
@@ -10232,55 +11607,55 @@ msgid ""
" ARG may be one of 'LF', 'CR', 'CRLF'"
msgstr ""
-#: ../svn/svn.c:277
+#: ../svn/svn.c:302 ../svnbench/svnbench.c:155
msgid "maximum number of log entries"
msgstr ""
-#: ../svn/svn.c:278
+#: ../svn/svn.c:303
msgid "don't unlock the targets"
msgstr ""
-#: ../svn/svn.c:279
+#: ../svn/svn.c:304
msgid "remove changelist association"
msgstr ""
-#: ../svn/svn.c:281
+#: ../svn/svn.c:306
msgid "operate only on members of changelist ARG"
msgstr ""
-#: ../svn/svn.c:283
+#: ../svn/svn.c:308
msgid "don't delete changelists after commit"
msgstr ""
-#: ../svn/svn.c:284
+#: ../svn/svn.c:309
msgid "keep path in working copy"
msgstr ""
-#: ../svn/svn.c:286
+#: ../svn/svn.c:311 ../svnbench/svnbench.c:157
msgid "retrieve all revision properties"
msgstr ""
-#: ../svn/svn.c:288
+#: ../svn/svn.c:313 ../svnbench/svnbench.c:159
msgid "retrieve no revision properties"
msgstr ""
-#: ../svn/svn.c:290
+#: ../svn/svn.c:315 ../svnbench/svnbench.c:161
msgid ""
"set revision property ARG in new revision\n"
" using the name[=value] format"
msgstr ""
-#: ../svn/svn.c:293
+#: ../svn/svn.c:318
msgid "make intermediate directories"
msgstr ""
-#: ../svn/svn.c:295
+#: ../svn/svn.c:320 ../svnbench/svnbench.c:165
msgid ""
"use/display additional information from merge\n"
" history"
msgstr ""
-#: ../svn/svn.c:299
+#: ../svn/svn.c:324
msgid ""
"specify automatic conflict resolution action\n"
" ('postpone', 'working', 'base', 'mine-"
@@ -10291,17 +11666,17 @@ msgid ""
"'l')"
msgstr ""
-#: ../svn/svn.c:310
+#: ../svn/svn.c:335
msgid ""
"specify which collection of revisions to display\n"
" ('merged', 'eligible')"
msgstr ""
-#: ../svn/svn.c:314
+#: ../svn/svn.c:339
msgid "deprecated"
msgstr ""
-#: ../svn/svn.c:316
+#: ../svn/svn.c:341
msgid ""
"number of leading path components to strip from\n"
" paths parsed from the patch file. --strip 0\n"
@@ -10315,120 +11690,200 @@ msgid ""
"component."
msgstr ""
-#: ../svn/svn.c:332
+#: ../svn/svn.c:357
msgid "don't expand keywords"
msgstr ""
-#: ../svn/svn.c:334
+#: ../svn/svn.c:359
msgid "apply the unidiff in reverse"
msgstr ""
-#: ../svn/svn.c:336
+#: ../svn/svn.c:361
msgid "ignore whitespace during pattern matching"
msgstr ""
-#: ../svn/svn.c:337
+#: ../svn/svn.c:362
msgid "produce diff output"
msgstr ""
#. maps to show_diff
#. diff options
-#: ../svn/svn.c:339 ../svnlook/svnlook.c:138
+#: ../svn/svn.c:364 ../svnlook/svnlook.c:139
msgid "use ARG as diff command"
msgstr ""
-#: ../svn/svn.c:341
+#: ../svn/svn.c:366
msgid "override diff-cmd specified in config file"
msgstr ""
-#: ../svn/svn.c:343 ../svnlook/svnlook.c:132
+#: ../svn/svn.c:368 ../svnlook/svnlook.c:133
msgid "do not print differences for added files"
msgstr ""
-#: ../svn/svn.c:345 ../svnlook/svnlook.c:135
+#: ../svn/svn.c:370 ../svnlook/svnlook.c:136
msgid "do not print differences for deleted files"
msgstr ""
-#: ../svn/svn.c:347
+#: ../svn/svn.c:372
msgid "don't diff copied or moved files with their source"
msgstr ""
-#: ../svn/svn.c:349
+#: ../svn/svn.c:374
msgid "diff unrelated nodes as delete and add"
msgstr ""
-#: ../svn/svn.c:350
+#: ../svn/svn.c:375
msgid "show a summary of the results"
msgstr ""
-#: ../svn/svn.c:352
+#: ../svn/svn.c:377
msgid "use git's extended diff format"
msgstr ""
-#: ../svn/svn.c:354 ../svnlook/svnlook.c:141
+#: ../svn/svn.c:379 ../svnlook/svnlook.c:142
msgid "ignore properties during the operation"
msgstr ""
-#: ../svn/svn.c:356 ../svnlook/svnlook.c:144
+#: ../svn/svn.c:381 ../svnlook/svnlook.c:145
msgid "show only properties during the operation"
msgstr ""
-#: ../svn/svn.c:358
+#: ../svn/svn.c:383
msgid ""
"generate diff suitable for generic third-party\n"
" patch tools; currently the same as\n"
" --show-copies-as-adds --ignore-properties"
msgstr ""
-#: ../svn/svn.c:366
+#: ../svn/svn.c:391
msgid ""
"Allow operation on mixed-revision working copy.\n"
" Use of this option is not recommended!\n"
" Please run 'svn update' instead."
msgstr ""
-#: ../svn/svn.c:372
+#: ../svn/svn.c:397
msgid ""
-"Also commit file and dir externals reached by\n"
-" recursion. This does not include externals with "
-"a\n"
-" fixed revision. (See the svn:externals property)"
+"also operate on externals defined by\n"
+" svn:externals properties"
msgstr ""
-#: ../svn/svn.c:378
-msgid "retrieve target's inherited properties"
+#: ../svn/svn.c:401
+msgid "retrieve properties set on parents of the target"
msgstr ""
-#: ../svn/svn.c:380
+#: ../svn/svn.c:403
msgid "use ARG as search pattern (glob syntax)"
msgstr ""
-#: ../svn/svn.c:382
+#: ../svn/svn.c:405
msgid "combine ARG with the previous search pattern"
msgstr ""
-#: ../svn/svn.c:430
+#: ../svn/svn.c:407
+msgid "show revision log message, author and date"
+msgstr ""
+
+#: ../svn/svn.c:409
+msgid "remove unversioned items"
+msgstr ""
+
+#: ../svn/svn.c:410
+msgid "remove ignored items"
+msgstr ""
+
+#: ../svn/svn.c:411 ../svnlook/svnlook.c:148 ../svnversion/svnversion.c:140
+msgid "do not output the trailing newline"
+msgstr ""
+
+#: ../svn/svn.c:412
+msgid "show cached passwords"
+msgstr ""
+
+#: ../svn/svn.c:414
+msgid ""
+"pin externals with no explicit revision to their\n"
+" current revision (recommended when tagging)"
+msgstr ""
+
+#: ../svn/svn.c:418
+msgid ""
+"print only the item identified by ARG ('kind',\n"
+" 'url', 'relative-url', 'repos-root-url',\n"
+" 'repos-uuid', 'revision', 'last-changed-"
+"revision',\n"
+" 'last-changed-date', 'last-changed-author',\n"
+" 'wc-root')"
+msgstr ""
+
+#: ../svn/svn.c:475
msgid ""
"Put files and directories under version control, scheduling\n"
"them for addition to repository. They will be added in next commit.\n"
"usage: add PATH...\n"
msgstr ""
-#: ../svn/svn.c:435
+#: ../svn/svn.c:480
msgid "add intermediate parents"
msgstr ""
-#: ../svn/svn.c:438
+#: ../svn/svn.c:483
+msgid ""
+"Manage cached authentication credentials.\n"
+"usage: 1. svn auth [PATTERN ...]\n"
+"usage: 2. svn auth --remove PATTERN [PATTERN ...]\n"
+"\n"
+" With no arguments, list all cached authentication credentials.\n"
+" Authentication credentials include usernames, passwords,\n"
+" SSL certificates, and SSL client-certificate passphrases.\n"
+" If PATTERN is specified, only list credentials with attributes matching "
+"one\n"
+" or more patterns. With the --remove option, remove cached authentication\n"
+" credentials matching one or more patterns.\n"
+"\n"
+" If more than one pattern is specified credentials are considered only "
+"they\n"
+" match all specified patterns. Patterns are matched case-sensitively and "
+"may\n"
+" contain glob wildcards:\n"
+" ? matches any single character\n"
+" * matches a sequence of arbitrary characters\n"
+" [abc] matches any of the characters listed inside the brackets\n"
+" Note that wildcards will usually need to be quoted or escaped on the\n"
+" command line because many command shells will interfere by trying to\n"
+" expand them.\n"
+msgstr ""
+
+#: ../svn/svn.c:504
+msgid "remove matching authentication credentials"
+msgstr ""
+
+#: ../svn/svn.c:509
msgid ""
-"Output the content of specified files or\n"
-"URLs with revision and author information in-line.\n"
-"usage: blame TARGET[@REV]...\n"
+"Show when each line of a file was last (or\n"
+"next) changed.\n"
+"usage: blame [-rM:N] TARGET[@REV]...\n"
+"\n"
+" Annotate each line of a file with the revision number and author of the\n"
+" last change (or optionally the next change) to that line.\n"
+"\n"
+" With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the last revision at or before rN that changed or added the line,\n"
+" looking back no further than rM.\n"
+"\n"
+" With a reverse revision range '-r M:N' where M > N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the next revision after rN that changed or deleted the line,\n"
+" looking forward no further than rM.\n"
"\n"
" If specified, REV determines in which revision the target is first\n"
" looked up.\n"
+"\n"
+" Write the annotated result to standard output.\n"
msgstr ""
-#: ../svn/svn.c:447
+#: ../svn/svn.c:533
msgid ""
"Output the content of specified files or URLs.\n"
"usage: cat TARGET[@REV]...\n"
@@ -10437,14 +11892,14 @@ msgid ""
" looked up.\n"
msgstr ""
-#: ../svn/svn.c:455
+#: ../svn/svn.c:541
msgid ""
"Associate (or dissociate) changelist CLNAME with the named files.\n"
"usage: 1. changelist CLNAME PATH...\n"
" 2. changelist --remove PATH...\n"
msgstr ""
-#: ../svn/svn.c:461
+#: ../svn/svn.c:547
msgid ""
"Check out a working copy from a repository.\n"
"usage: checkout URL[@REV]... [PATH]\n"
@@ -10472,24 +11927,33 @@ msgid ""
" reporting the action taken.\n"
msgstr ""
-#: ../svn/svn.c:488
+#: ../svn/svn.c:574
msgid ""
"Recursively clean up the working copy, removing write locks, resuming\n"
"unfinished operations, etc.\n"
"usage: cleanup [WCPATH...]\n"
"\n"
-" Finish any unfinished business in the working copy at WCPATH, and remove\n"
-" write locks (shown as 'L' by the 'svn status' command) from the working\n"
-" copy. Usually, this is only necessary if a Subversion client has crashed\n"
-" while using the working copy, leaving it in an unusable state.\n"
+" By default, finish any unfinished business in the working copy at WCPATH,\n"
+" and remove write locks (shown as 'L' by the 'svn status' command) from\n"
+" the working copy. Usually, this is only necessary if a Subversion client\n"
+" has crashed while using the working copy, leaving it in an unusable "
+"state.\n"
"\n"
" WARNING: There is no mechanism that will protect write locks still\n"
" being used by other Subversion clients. Running this command\n"
" while another client is using the working copy can corrupt\n"
" the working copy beyond repair!\n"
+"\n"
+" If the --remove-unversioned option or the --remove-ignored option\n"
+" is given, remove any unversioned or ignored items within WCPATH.\n"
+" To prevent accidental working copy corruption, unversioned or ignored\n"
+" items can only be removed if the working copy is not already locked\n"
+" for writing by another Subversion client.\n"
+" Note that the 'svn status' command shows unversioned items as '?',\n"
+" and ignored items as 'I' if the --no-ignore option is given to it.\n"
msgstr ""
-#: ../svn/svn.c:504
+#: ../svn/svn.c:599
msgid ""
"Send changes from your working copy to the repository.\n"
"usage: commit [PATH...]\n"
@@ -10498,9 +11962,13 @@ msgid ""
" given by a --message or --file option, an editor will be started.\n"
" If any targets are (or contain) locked items, those will be\n"
" unlocked after a successful commit.\n"
+"\n"
+" If --include-externals is given, also commit file and directory\n"
+" externals reached by recursion. Do not commit externals with a\n"
+" fixed revision.\n"
msgstr ""
-#: ../svn/svn.c:515
+#: ../svn/svn.c:614
msgid ""
"Copy files and directories in a working copy or repository.\n"
"usage: copy SRC[@REV]... DST\n"
@@ -10520,7 +11988,7 @@ msgid ""
" to the destination.\n"
msgstr ""
-#: ../svn/svn.c:534
+#: ../svn/svn.c:634
msgid ""
"Remove files and directories from version control.\n"
"usage: 1. delete PATH...\n"
@@ -10537,7 +12005,7 @@ msgid ""
" via an immediate commit.\n"
msgstr ""
-#: ../svn/svn.c:550
+#: ../svn/svn.c:650
msgid ""
"Display local changes or differences between two revisions or paths.\n"
"usage: 1. diff\n"
@@ -10580,7 +12048,7 @@ msgid ""
"URL[@NEWREV]'\n"
msgstr ""
-#: ../svn/svn.c:591
+#: ../svn/svn.c:691
msgid ""
"Create an unversioned copy of a tree.\n"
"usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -10602,13 +12070,13 @@ msgid ""
" looked up.\n"
msgstr ""
-#: ../svn/svn.c:613
+#: ../svn/svn.c:713 ../svnbench/svnbench.c:205
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: help [SUBCOMMAND...]\n"
msgstr ""
-#: ../svn/svn.c:619
+#: ../svn/svn.c:719
msgid ""
"Commit an unversioned file or tree into the repository.\n"
"usage: import [PATH] URL\n"
@@ -10622,7 +12090,7 @@ msgid ""
" if --force is specified.\n"
msgstr ""
-#: ../svn/svn.c:633
+#: ../svn/svn.c:733
msgid ""
"Display information about a local or remote item.\n"
"usage: info [TARGET[@REV]...]\n"
@@ -10630,9 +12098,24 @@ msgid ""
" Print information about each TARGET (default: '.').\n"
" TARGET may be either a working-copy path or URL. If specified, REV\n"
" determines in which revision the target is first looked up.\n"
+"\n"
+" With --show-item, print only the value of one item of information\n"
+" about TARGET. One of the following items can be selected:\n"
+" kind the kind of TARGET\n"
+" url the URL of TARGET in the repository\n"
+" relative-url the repository-relative URL\n"
+" repos-root-url the repository root URL\n"
+" repos-uuid the repository UUID\n"
+" revision the revision of TARGET (defaults to BASE\n"
+" for working copy paths and HEAD for URLs)\n"
+" last-changed-revision the most recent revision in which TARGET\n"
+" was changed\n"
+" last-changed-date the date of the last-changed revision\n"
+" last-changed-author the author of the last-changed revision\n"
+" wc-root the root of TARGET's working copy\n"
msgstr ""
-#: ../svn/svn.c:643
+#: ../svn/svn.c:759
msgid ""
"List directory entries in the repository.\n"
"usage: list [TARGET[@REV]...]\n"
@@ -10654,11 +12137,7 @@ msgid ""
" Date and time of the last commit\n"
msgstr ""
-#: ../svn/svn.c:663
-msgid "include externals definitions"
-msgstr ""
-
-#: ../svn/svn.c:666
+#: ../svn/svn.c:781
msgid ""
"Lock working copy paths or URLs in the repository, so that\n"
"no other user can commit changes to them.\n"
@@ -10667,19 +12146,19 @@ msgid ""
" Use --force to steal the lock from another user or working copy.\n"
msgstr ""
-#: ../svn/svn.c:672
+#: ../svn/svn.c:787
msgid "read lock comment from file ARG"
msgstr ""
-#: ../svn/svn.c:673
+#: ../svn/svn.c:788
msgid "specify lock comment ARG"
msgstr ""
-#: ../svn/svn.c:674
+#: ../svn/svn.c:789
msgid "force validity of lock comment source"
msgstr ""
-#: ../svn/svn.c:677
+#: ../svn/svn.c:792
msgid ""
"Show the log messages for a set of revision(s) and/or path(s).\n"
"usage: 1. log [PATH][@REV]\n"
@@ -10757,18 +12236,26 @@ msgid ""
" svn log --stop-on-copy --limit 1 -r0:HEAD ^/branches/foo\n"
msgstr ""
-#: ../svn/svn.c:755
+#: ../svn/svn.c:870 ../svnbench/svnbench.c:293
msgid "retrieve revision property ARG"
msgstr ""
-#: ../svn/svn.c:756
+#: ../svn/svn.c:871 ../svnbench/svnbench.c:294
msgid "the change made in revision ARG"
msgstr ""
+#: ../svn/svn.c:872
+msgid "also print all affected paths"
+msgstr ""
+
+#: ../svn/svn.c:873
+msgid "do not print the log message"
+msgstr ""
+
#. For this large section, let's keep it unindented for easier
#. * viewing/editing. It has been vim-treated with a textwidth=75 and 'gw'
#. * (with quotes and newlines removed).
-#: ../svn/svn.c:762
+#: ../svn/svn.c:879
msgid ""
"Merge changes into a working copy.\n"
"usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]\n"
@@ -11100,7 +12587,11 @@ msgid ""
" repositories.\n"
msgstr ""
-#: ../svn/svn.c:1094
+#: ../svn/svn.c:1209
+msgid "force deletions even if deleted contents don't match"
+msgstr ""
+
+#: ../svn/svn.c:1213
msgid ""
"Display merge-related information.\n"
"usage: 1. mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -11132,7 +12623,7 @@ msgid ""
" The depth can be 'empty' or 'infinity'; the default is 'empty'.\n"
msgstr ""
-#: ../svn/svn.c:1125
+#: ../svn/svn.c:1245
msgid ""
"Create a new directory under version control.\n"
"usage: 1. mkdir PATH...\n"
@@ -11150,7 +12641,7 @@ msgid ""
" unless the --parents option is given.\n"
msgstr ""
-#: ../svn/svn.c:1142
+#: ../svn/svn.c:1262
msgid ""
"Move (rename) an item in a working copy or repository.\n"
"usage: move SRC... DST\n"
@@ -11173,7 +12664,7 @@ msgid ""
" The --revision option has no use and is deprecated.\n"
msgstr ""
-#: ../svn/svn.c:1164
+#: ../svn/svn.c:1284
msgid ""
"Apply a patch to a working copy.\n"
"usage: patch PATCHFILE [WCPATH]\n"
@@ -11220,7 +12711,7 @@ msgid ""
" HEAD revision. This way, conflicts can be resolved interactively.\n"
msgstr ""
-#: ../svn/svn.c:1212
+#: ../svn/svn.c:1332
msgid ""
"Remove a property from files, dirs, or revisions.\n"
"usage: 1. propdel PROPNAME [PATH...]\n"
@@ -11229,9 +12720,11 @@ msgid ""
" 1. Removes versioned props in working copy.\n"
" 2. Removes unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
-#: ../svn/svn.c:1222
+#: ../svn/svn.c:1344
msgid ""
"Edit a property with an external editor.\n"
"usage: 1. propedit PROPNAME TARGET...\n"
@@ -11241,10 +12734,10 @@ msgid ""
" 2. Edits unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"
-" See 'svn help propset' for more on setting properties.\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
-#: ../svn/svn.c:1234
+#: ../svn/svn.c:1356
msgid ""
"Print the value of a property on files, dirs, or revisions.\n"
"usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
@@ -11261,20 +12754,23 @@ msgid ""
" 'empty', the target path is printed on the same line before each value.\n"
"\n"
" By default, an extra newline is printed after the property value so that\n"
-" the output looks pretty. With a single TARGET and depth 'empty', you can\n"
-" use the --strict option to disable this (useful when redirecting a binary\n"
-" property value to a file, for example).\n"
+" the output looks pretty. With a single TARGET, depth 'empty' and without\n"
+" --show-inherited-props, you can use the --no-newline option to disable "
+"this\n"
+" (useful when redirecting a binary property value to a file, for example).\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
-#: ../svn/svn.c:1254 ../svn/svn.c:1271
+#: ../svn/svn.c:1378 ../svn/svn.c:1397
msgid "print path, name and value on separate lines"
msgstr ""
-#: ../svn/svn.c:1255
-msgid "don't print an extra newline"
+#: ../svn/svn.c:1379
+msgid "(deprecated; use --no-newline)"
msgstr ""
-#: ../svn/svn.c:1258
+#: ../svn/svn.c:1382
msgid ""
"List all properties on files, dirs, or revisions.\n"
"usage: 1. proplist [TARGET[@REV]...]\n"
@@ -11288,13 +12784,15 @@ msgid ""
" With --verbose, the property values are printed as well, like 'svn "
"propget\n"
" --verbose'. With --quiet, the paths are not printed.\n"
+"\n"
+" See 'svn help propset' for descriptions of the svn:* special properties.\n"
msgstr ""
-#: ../svn/svn.c:1272
+#: ../svn/svn.c:1398
msgid "don't print the path"
msgstr ""
-#: ../svn/svn.c:1275
+#: ../svn/svn.c:1401
msgid ""
"Set the value of a property on files, dirs, or revisions.\n"
"usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -11353,6 +12851,18 @@ msgid ""
" svn:ignore - A list of file glob patterns to ignore, one per "
"line.\n"
" svn:global-ignores - Like svn:ignore, but inheritable.\n"
+" svn:auto-props - Automatically set properties on files when they "
+"are\n"
+" added or imported. Contains key-value pairs, one per line, in the "
+"format:\n"
+" PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...]\n"
+" Example (where a literal ';' is escaped by adding another ';'):\n"
+" *.html = svn:eol-style=native;svn:mime-type=text/html;; "
+"charset=UTF8\n"
+" Applies recursively to all files added or imported under the "
+"directory\n"
+" it is set on. See also [auto-props] in the client configuration "
+"file.\n"
" svn:externals - A list of module specifiers, one per line, in the\n"
" following format similar to the syntax of 'svn checkout':\n"
" [-r REV] URL[@PEG] LOCALPATH\n"
@@ -11369,6 +12879,8 @@ msgid ""
" ^/ to the repository root\n"
" / to the server root\n"
" // to the URL scheme\n"
+" ^/../ to a sibling repository beneath the same SVNParentPath "
+"location\n"
" Use of the following format is discouraged but is supported for\n"
" interoperability with Subversion 1.4 and earlier clients:\n"
" LOCALPATH [-r PEG] URL\n"
@@ -11377,11 +12889,11 @@ msgid ""
" Lines starting with a '#' character are ignored.\n"
msgstr ""
-#: ../svn/svn.c:1354
+#: ../svn/svn.c:1488
msgid "read property value from file ARG"
msgstr ""
-#: ../svn/svn.c:1357
+#: ../svn/svn.c:1491
msgid ""
"Relocate the working copy to point to a different repository root URL.\n"
"usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
@@ -11405,7 +12917,7 @@ msgid ""
" svn://svn.example.com/repo/project\n"
msgstr ""
-#: ../svn/svn.c:1380
+#: ../svn/svn.c:1514
msgid ""
"Resolve conflicts on working copy files or directories.\n"
"usage: resolve [PATH...]\n"
@@ -11418,14 +12930,14 @@ msgid ""
" In this mode, the command is not recursive by default (depth 'empty').\n"
msgstr ""
-#: ../svn/svn.c:1390
+#: ../svn/svn.c:1524
msgid ""
"specify automatic conflict resolution source\n"
" ('base', 'working', 'mine-conflict',\n"
" 'theirs-conflict', 'mine-full', 'theirs-full')"
msgstr ""
-#: ../svn/svn.c:1397
+#: ../svn/svn.c:1531
msgid ""
"Remove 'conflicted' state on working copy files or directories.\n"
"usage: resolved PATH...\n"
@@ -11436,7 +12948,7 @@ msgid ""
" deprecated in favor of running 'svn resolve --accept working'.\n"
msgstr ""
-#: ../svn/svn.c:1407
+#: ../svn/svn.c:1541
msgid ""
"Restore pristine working copy state (undo local changes).\n"
"usage: revert PATH...\n"
@@ -11449,7 +12961,7 @@ msgid ""
" the output of 'svn help merge' for 'undo'.\n"
msgstr ""
-#: ../svn/svn.c:1419
+#: ../svn/svn.c:1553
msgid ""
"Print the status of working copy files and directories.\n"
"usage: status [PATH...]\n"
@@ -11480,9 +12992,10 @@ msgid ""
" another Subversion client modifying the working copy\n"
" ' ' not locked for writing\n"
" 'L' locked for writing\n"
-" Fourth column: Scheduled commit will contain addition-with-history\n"
-" ' ' no history scheduled with commit\n"
-" '+' history scheduled with commit\n"
+" Fourth column: Scheduled commit will create a copy (addition-with-"
+"history)\n"
+" ' ' no history scheduled with commit (item was newly added)\n"
+" '+' history scheduled with commit (item was copied)\n"
" Fifth column: Whether the item is switched or a file external\n"
" ' ' normal\n"
" 'S' the item has a Switched URL relative to the parent\n"
@@ -11546,11 +13059,11 @@ msgid ""
" D wc/qax.c\n"
msgstr ""
-#: ../svn/svn.c:1512
+#: ../svn/svn.c:1646
msgid "don't print unversioned items"
msgstr ""
-#: ../svn/svn.c:1515
+#: ../svn/svn.c:1649
msgid ""
"Update the working copy to a different URL within the same repository.\n"
"usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -11594,11 +13107,15 @@ msgid ""
" svn://svn.example.com/repo/project\n"
msgstr ""
-#: ../svn/svn.c:1557
+#: ../svn/svn.c:1691
msgid "allow switching to a node with no common ancestor"
msgstr ""
-#: ../svn/svn.c:1561
+#: ../svn/svn.c:1693 ../svn/svn.c:1753
+msgid "handle unversioned obstructions as changes"
+msgstr ""
+
+#: ../svn/svn.c:1697
msgid ""
"Unlock working copy paths or URLs.\n"
"usage: unlock TARGET...\n"
@@ -11606,7 +13123,7 @@ msgid ""
" Use --force to break the lock.\n"
msgstr ""
-#: ../svn/svn.c:1568
+#: ../svn/svn.c:1704
msgid ""
"Bring changes from the repository into the working copy.\n"
"usage: update [PATH...]\n"
@@ -11655,7 +13172,7 @@ msgid ""
" targets of this operation.\n"
msgstr ""
-#: ../svn/svn.c:1618
+#: ../svn/svn.c:1756
msgid ""
"Upgrade the metadata storage format for a working copy.\n"
"usage: upgrade [WCPATH...]\n"
@@ -11663,214 +13180,216 @@ msgid ""
" Local modifications are preserved.\n"
msgstr ""
-#: ../svn/svn.c:1664 ../svnadmin/svnadmin.c:90 ../svnlook/svnlook.c:380
-#: ../svnrdump/svnrdump.c:65 ../svnsync/svnsync.c:297
+#: ../svn/svn.c:1804 ../svnadmin/svnadmin.c:97 ../svnbench/svnbench.c:345
+#: ../svnfsfs/svnfsfs.c:79 ../svnlook/svnlook.c:387 ../svnrdump/svnrdump.c:66
+#: ../svnsync/svnsync.c:336
msgid "Caught signal"
msgstr ""
-#: ../svn/svn.c:1817 ../svnlook/svnlook.c:2565
+#: ../svn/svn.c:1950 ../svnbench/svnbench.c:437 ../svnlook/svnlook.c:2556
msgid "Non-numeric limit argument given"
msgstr ""
-#: ../svn/svn.c:1823 ../svnlook/svnlook.c:2571
+#: ../svn/svn.c:1955 ../svnbench/svnbench.c:442 ../svnlook/svnlook.c:2561
msgid "Argument to --limit must be positive"
msgstr ""
-#: ../svn/svn.c:1844 ../svn/svn.c:2121
+#: ../svn/svn.c:1975 ../svn/svn.c:2247
msgid "Can't specify -c with --old"
msgstr ""
-#: ../svn/svn.c:1875
+#: ../svn/svn.c:2005 ../svnbench/svnbench.c:478
#, c-format
msgid "Negative number in range (%s) not supported with -c"
msgstr ""
-#: ../svn/svn.c:1888
+#: ../svn/svn.c:2017 ../svnbench/svnbench.c:490
#, c-format
msgid "Non-numeric change argument (%s) given to -c"
msgstr ""
-#: ../svn/svn.c:1896
+#: ../svn/svn.c:2024 ../svnbench/svnbench.c:497
msgid "There is no change 0"
msgstr ""
-#: ../svn/svn.c:1939 ../svnadmin/svnadmin.c:2037 ../svnrdump/svnrdump.c:937
-#: ../svnsync/svnsync.c:2052
+#: ../svn/svn.c:2065 ../svnadmin/svnadmin.c:2518 ../svnbench/svnbench.c:539
+#: ../svnfsfs/svnfsfs.c:331 ../svnrdump/svnrdump.c:876
+#: ../svnsync/svnsync.c:2124
#, c-format
msgid "Syntax error in revision argument '%s'"
msgstr ""
-#: ../svn/svn.c:2005 ../svn/svn.c:2024
+#: ../svn/svn.c:2128 ../svn/svn.c:2145 ../svnbench/svnbench.c:578
#, c-format
msgid "Error converting depth from locale to UTF-8"
msgstr ""
-#: ../svn/svn.c:2013
+#: ../svn/svn.c:2135 ../svnbench/svnbench.c:585
#, c-format
msgid ""
"'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
msgstr ""
-#: ../svn/svn.c:2032
+#: ../svn/svn.c:2152
#, c-format
msgid ""
"'%s' is not a valid depth; try 'exclude', 'empty', 'files', 'immediates', or "
"'infinity'"
msgstr ""
-#: ../svn/svn.c:2161
+#: ../svn/svn.c:2284
#, c-format
msgid "Syntax error in native-eol argument '%s'"
msgstr ""
-#: ../svn/svn.c:2181
+#: ../svn/svn.c:2302
msgid "Changelist names must not be empty"
msgstr ""
-#: ../svn/svn.c:2215
+#: ../svn/svn.c:2335
#, c-format
msgid "'%s' is not a valid --accept value"
msgstr ""
-#: ../svn/svn.c:2223
+#: ../svn/svn.c:2343
#, c-format
msgid "'%s' is not a valid --show-revs value"
msgstr ""
-#: ../svn/svn.c:2235
+#: ../svn/svn.c:2359
#, c-format
msgid "Invalid strip count '%s'"
msgstr ""
-#: ../svn/svn.c:2241
+#: ../svn/svn.c:2365
msgid "Argument to --strip must be positive"
msgstr ""
-#: ../svn/svn.c:2296 ../svnmucc/svnmucc.c:1208 ../svnrdump/svnrdump.c:993
-#: ../svnsync/svnsync.c:2096
+#: ../svn/svn.c:2441 ../svnmucc/svnmucc.c:646 ../svnrdump/svnrdump.c:947
+#: ../svnsync/svnsync.c:2182
msgid "--non-interactive and --force-interactive are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2350 ../svndumpfilter/svndumpfilter.c:1538
-#: ../svnlook/svnlook.c:2667
+#: ../svn/svn.c:2494 ../svnbench/svnbench.c:708
+#: ../svndumpfilter/svndumpfilter.c:1456 ../svnlook/svnlook.c:2660
#, c-format
msgid "Subcommand argument required\n"
msgstr ""
-#: ../svn/svn.c:2367 ../svnadmin/svnadmin.c:2220
-#: ../svndumpfilter/svndumpfilter.c:1558 ../svnlook/svnlook.c:2686
-#: ../svnrdump/svnrdump.c:1039
+#: ../svn/svn.c:2512 ../svnadmin/svnadmin.c:2718 ../svnbench/svnbench.c:726
+#: ../svndumpfilter/svndumpfilter.c:1474 ../svnfsfs/svnfsfs.c:403
+#: ../svnlook/svnlook.c:2677 ../svnrdump/svnrdump.c:991
#, c-format
msgid "Unknown subcommand: '%s'\n"
msgstr ""
-#: ../svn/svn.c:2376
+#: ../svn/svn.c:2521
#, c-format
msgid ""
"Undo is done using either the 'svn revert' or the 'svn merge' command.\n"
msgstr ""
-#: ../svn/svn.c:2411
+#: ../svn/svn.c:2557
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svn help %s' for usage.\n"
msgstr ""
-#: ../svn/svn.c:2425
+#: ../svn/svn.c:2572 ../svnbench/svnbench.c:774
msgid ""
"Multiple revision arguments encountered; can't specify -c twice, or both -c "
"and -r"
msgstr ""
-#: ../svn/svn.c:2437
+#: ../svn/svn.c:2583
msgid "--depth and --set-depth are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2447
+#: ../svn/svn.c:2592 ../svnbench/svnbench.c:785
msgid "--with-all-revprops and --with-no-revprops are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2457
+#: ../svn/svn.c:2601 ../svnbench/svnbench.c:794
msgid "--with-revprop and --with-no-revprops are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2470
+#: ../svn/svn.c:2631
msgid "--message (-m) and --file (-F) are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2479 ../svnmucc/svnmucc.c:1219 ../svnrdump/svnrdump.c:1098
-#: ../svnsync/svnsync.c:2147
-msgid "--trust-server-cert requires --non-interactive"
+#: ../svn/svn.c:2644 ../svnbench/svnbench.c:807 ../svnmucc/svnmucc.c:658
+#: ../svnrdump/svnrdump.c:1050
+msgid "--trust-server-cert-failures requires --non-interactive"
msgstr ""
-#: ../svn/svn.c:2489
+#: ../svn/svn.c:2653
msgid "--diff-cmd and --internal-diff are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2537
+#: ../svn/svn.c:2695
msgid "--relocate and --depth are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2545
+#: ../svn/svn.c:2702
msgid "--relocate and --non-recursive (-N) are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2667
+#: ../svn/svn.c:2821
msgid "Log message file is a versioned file; use '--force-log' to override"
msgstr ""
-#: ../svn/svn.c:2674
+#: ../svn/svn.c:2828
msgid "Lock comment file is a versioned file; use '--force-log' to override"
msgstr ""
-#: ../svn/svn.c:2695
+#: ../svn/svn.c:2848
msgid ""
"The log message is a pathname (was -F intended?); use '--force-log' to "
"override"
msgstr ""
-#: ../svn/svn.c:2702
+#: ../svn/svn.c:2855
msgid ""
"The lock comment is a pathname (was -F intended?); use '--force-log' to "
"override"
msgstr ""
-#: ../svn/svn.c:2726
+#: ../svn/svn.c:2878
msgid "--auto-props and --no-auto-props are mutually exclusive"
msgstr ""
-#: ../svn/svn.c:2831 ../svn/svn.c:2838
+#: ../svn/svn.c:2987 ../svn/svn.c:2994
#, c-format
msgid "--accept=%s incompatible with --non-interactive"
msgstr ""
-#: ../svn/svn.c:2894
+#: ../svn/svn.c:3050
#, c-format
msgid "Try 'svn help %s' for more information"
msgstr ""
-#: ../svn/svn.c:2900
+#: ../svn/svn.c:3056 ../svnbench/svnbench.c:957
msgid "Please see the 'svn upgrade' command"
msgstr ""
-#: ../svn/svn.c:2906 ../svnmucc/svnmucc.c:1457 ../svnrdump/svnrdump.c:1175
+#: ../svn/svn.c:3062 ../svnmucc/svnmucc.c:939 ../svnrdump/svnrdump.c:1126
msgid ""
"Authentication failed and interactive prompting is disabled; see the --force-"
"interactive option"
msgstr ""
-#: ../svn/svn.c:2911
+#: ../svn/svn.c:3067
msgid ""
"Reading file from standard input because of -F option; this can interfere "
"with interactive prompting"
msgstr ""
-#: ../svn/svn.c:2922
+#: ../svn/svn.c:3078 ../svnbench/svnbench.c:965
msgid "Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)"
msgstr ""
-#: ../svn/svn.c:2929
+#: ../svn/svn.c:3085
msgid ""
"Another process is blocking the working copy database, or the underlying "
"filesystem does not support file locking; if the working copy is on a "
@@ -11878,7 +13397,7 @@ msgid ""
"server"
msgstr ""
-#: ../svn/svn.c:2942
+#: ../svn/svn.c:3098
msgid ""
"When using svn+ssh:// URLs, keep in mind that the --username and --password "
"options are ignored because authentication is performed by SSH, not "
@@ -11903,6 +13422,10 @@ msgid ""
"repository"
msgstr ""
+#: ../svn/unlock-cmd.c:101
+msgid "One or more locks could not be released"
+msgstr ""
+
#: ../svn/update-cmd.c:93
#, c-format
msgid "Summary of updates:\n"
@@ -11913,221 +13436,244 @@ msgstr ""
msgid " Updated '%s' to r%ld.\n"
msgstr ""
-#: ../svn/util.c:79
+#: ../svn/util.c:86
#, c-format
-msgid ""
-"\n"
-"Committed revision %ld%s.\n"
+msgid "Committed revision %ld%s.\n"
msgstr ""
-#: ../svn/util.c:83
+#: ../svn/util.c:90
msgid " (the answer to life, the universe, and everything)"
msgstr ""
-#: ../svn/util.c:92
+#: ../svn/util.c:99
#, c-format
msgid ""
"\n"
"Warning: %s\n"
msgstr ""
-#: ../svn/util.c:133
+#: ../svn/util.c:140
msgid ""
"The SVN_MERGE environment variable is empty or consists solely of "
"whitespace. Expected a shell command.\n"
msgstr ""
-#: ../svn/util.c:139
+#: ../svn/util.c:146
msgid ""
"The environment variable SVN_MERGE and the merge-tool-cmd run-time "
"configuration option were not set.\n"
msgstr ""
-#: ../svn/util.c:169
+#: ../svn/util.c:175
#, c-format
-msgid "The external merge tool exited with exit code %d"
+msgid "The external merge tool '%s' exited with exit code %d."
msgstr ""
-#: ../svn/util.c:211
+#: ../svn/util.c:218
msgid "Log message contains a zero byte"
msgstr ""
-#: ../svn/util.c:269
+#: ../svn/util.c:278
#, c-format
msgid " '%s'"
msgstr ""
-#: ../svn/util.c:273
+#: ../svn/util.c:282
msgid "Your commit message was left in a temporary file:"
msgstr ""
-#: ../svn/util.c:325
+#: ../svn/util.c:334
msgid "--This line, and those below, will be ignored--"
msgstr ""
-#: ../svn/util.c:360
+#: ../svn/util.c:360 ../svnmucc/svnmucc.c:421
msgid "Error normalizing log message to internal format"
msgstr ""
-#: ../svn/util.c:447 ../svnmucc/svnmucc.c:764
+#: ../svn/util.c:449 ../svnmucc/svnmucc.c:431
msgid "Cannot invoke editor to get log message when non-interactive"
msgstr ""
-#: ../svn/util.c:460
+#: ../svn/util.c:462
msgid ""
"Could not use external editor to fetch log message; consider setting the "
"$SVN_EDITOR environment variable or using the --message (-m) or --file (-F) "
"options"
msgstr ""
-#: ../svn/util.c:496
+#: ../svn/util.c:498
msgid ""
"\n"
"Log message unchanged or not specified\n"
"(a)bort, (c)ontinue, (e)dit:\n"
msgstr ""
-#: ../svn/util.c:549
+#: ../svn/util.c:551
msgid ""
"Use --force to override this restriction (local modifications may be lost)"
msgstr ""
-#: ../svn/util.c:738 ../svn/util.c:771
+#: ../svn/util.c:740 ../svn/util.c:773
msgid "none"
msgstr ""
-#: ../svn/util.c:739
+#: ../svn/util.c:741
msgid "file"
msgstr ""
-#: ../svn/util.c:740
+#: ../svn/util.c:742
msgid "dir"
msgstr ""
-#: ../svn/util.c:772
+#: ../svn/util.c:774
msgid "update"
msgstr ""
-#: ../svn/util.c:773
+#: ../svn/util.c:775
msgid "switch"
msgstr ""
-#: ../svn/util.c:896
+#: ../svn/util.c:898
msgid "(invalid date)"
msgstr ""
-#: ../svn/util.c:1056
+#: ../svn/util.c:1058
#, c-format
msgid ""
"svn: warning: '%s' is a binary mime-type but file '%s' looks like text; "
"diff, merge, blame, and other operations will stop working on this file\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:217 ../svnrdump/svnrdump.c:120
+#: ../svnadmin/svnadmin.c:236 ../svnfsfs/svnfsfs.c:141
+#: ../svnrdump/svnrdump.c:124
msgid "specify revision number ARG (or X:Y range)"
msgstr ""
-#: ../svnadmin/svnadmin.c:220 ../svnlook/svnlook.c:162
+#: ../svnadmin/svnadmin.c:239 ../svnlook/svnlook.c:166
msgid "specify transaction name ARG"
msgstr ""
-#: ../svnadmin/svnadmin.c:223
+#: ../svnadmin/svnadmin.c:242
msgid "dump or hotcopy incrementally"
msgstr ""
-#: ../svnadmin/svnadmin.c:226
+#: ../svnadmin/svnadmin.c:245
msgid "use deltas in dump output"
msgstr ""
-#: ../svnadmin/svnadmin.c:229
+#: ../svnadmin/svnadmin.c:248
msgid "bypass the repository hook system"
msgstr ""
-#: ../svnadmin/svnadmin.c:232
+#: ../svnadmin/svnadmin.c:251
msgid "bypass property validation logic"
msgstr ""
-#: ../svnadmin/svnadmin.c:235 ../svnlook/svnlook.c:193
-#: ../svnrdump/svnrdump.c:122 ../svnserve/svnserve.c:289
-#: ../svnversion/svnversion.c:143
-msgid "no progress (only errors) to stderr"
+#: ../svnadmin/svnadmin.c:254
+msgid "ignore revision datestamps found in the stream"
msgstr ""
-#: ../svnadmin/svnadmin.c:238
+#: ../svnadmin/svnadmin.c:257 ../svnfsfs/svnfsfs.c:138
+msgid "no progress (only errors to stderr)"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:260
msgid "ignore any repos UUID found in the stream"
msgstr ""
-#: ../svnadmin/svnadmin.c:241
+#: ../svnadmin/svnadmin.c:263
msgid "set repos UUID to that found in stream, if any"
msgstr ""
-#: ../svnadmin/svnadmin.c:244
-msgid "type of repository: 'fsfs' (default) or 'bdb'"
+#: ../svnadmin/svnadmin.c:266
+msgid ""
+"type of repository:\n"
+" 'fsfs' (default), 'bdb' or 'fsx'\n"
+" CAUTION: FSX is for EXPERIMENTAL use only!"
msgstr ""
-#: ../svnadmin/svnadmin.c:247
+#: ../svnadmin/svnadmin.c:271
msgid "load at specified directory in repository"
msgstr ""
-#: ../svnadmin/svnadmin.c:250
+#: ../svnadmin/svnadmin.c:274
msgid "disable fsync at transaction commit [Berkeley DB]"
msgstr ""
-#: ../svnadmin/svnadmin.c:253
+#: ../svnadmin/svnadmin.c:277
msgid "disable automatic log file removal [Berkeley DB]"
msgstr ""
-#: ../svnadmin/svnadmin.c:259
+#: ../svnadmin/svnadmin.c:283
msgid ""
"remove redundant Berkeley DB log files\n"
" from source repository [Berkeley DB]"
msgstr ""
-#: ../svnadmin/svnadmin.c:263
+#: ../svnadmin/svnadmin.c:287
msgid "call pre-commit hook before committing revisions"
msgstr ""
-#: ../svnadmin/svnadmin.c:266
+#: ../svnadmin/svnadmin.c:290
msgid "call post-commit hook after committing revisions"
msgstr ""
-#: ../svnadmin/svnadmin.c:269
+#: ../svnadmin/svnadmin.c:293
msgid "call hook before changing revision property"
msgstr ""
-#: ../svnadmin/svnadmin.c:272
+#: ../svnadmin/svnadmin.c:296
msgid "call hook after changing revision property"
msgstr ""
-#: ../svnadmin/svnadmin.c:275
+#: ../svnadmin/svnadmin.c:299
msgid ""
"wait instead of exit if the repository is in\n"
" use by another process"
msgstr ""
-#: ../svnadmin/svnadmin.c:279 ../svnadmin/svnadmin.c:282
-#: ../svnadmin/svnadmin.c:285
+#: ../svnadmin/svnadmin.c:303 ../svnadmin/svnadmin.c:306
+#: ../svnadmin/svnadmin.c:309
msgid "deprecated; see --compatible-version"
msgstr ""
-#: ../svnadmin/svnadmin.c:288
+#: ../svnadmin/svnadmin.c:312
+msgid "continue verification after detecting a corruption"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:315
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations. Default: 16.\n"
" [used for FSFS repositories only]"
msgstr ""
-#: ../svnadmin/svnadmin.c:293
+#: ../svnadmin/svnadmin.c:320
msgid ""
"use repository format compatible with Subversion\n"
" version ARG (\"1.5.5\", \"1.7\", etc.)"
msgstr ""
-#: ../svnadmin/svnadmin.c:296
+#: ../svnadmin/svnadmin.c:323
msgid "read repository paths from file ARG"
msgstr ""
-#: ../svnadmin/svnadmin.c:308
+#: ../svnadmin/svnadmin.c:326
+msgid ""
+"report any names within the same directory or\n"
+" svn:mergeinfo property value that differ only\n"
+" in character representation, but are otherwise\n"
+" identical"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:332
+msgid ""
+"verify metadata only (ignored for BDB),\n"
+" checking against external corruption in\n"
+" Subversion 1.9+ format repositories.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:346
msgid ""
"usage: svnadmin crashtest REPOS_PATH\n"
"\n"
@@ -12135,14 +13681,31 @@ msgid ""
"a process that crashes while holding an open repository handle.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:314
+#: ../svnadmin/svnadmin.c:352
msgid ""
"usage: svnadmin create REPOS_PATH\n"
"\n"
"Create a new, empty repository at REPOS_PATH.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:323
+#: ../svnadmin/svnadmin.c:361
+msgid ""
+"usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n"
+" 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n"
+"\n"
+"1. Delete the property NAME on revision REVISION.\n"
+"\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
+"\n"
+"NOTE: Revision properties are not versioned, so this command will\n"
+"irreversibly destroy the previous value of the property.\n"
+"\n"
+"2. Delete the property NAME on transaction TXN.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:374
msgid ""
"usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n"
"\n"
@@ -12153,7 +13716,7 @@ msgid ""
"this will simply deltify the HEAD revision.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:332
+#: ../svnadmin/svnadmin.c:383
msgid ""
"usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n"
"\n"
@@ -12168,26 +13731,27 @@ msgid ""
"changed in those revisions.)\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:345
+#: ../svnadmin/svnadmin.c:396
msgid ""
"usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n"
"\n"
"1. Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n"
+" Allows safe use of third-party backup tools on a live repository.\n"
"\n"
"2. Like 1 except all repositories listed in FILE are locked. The file\n"
" format is repository paths separated by newlines. Repositories are\n"
" locked in the same order as they are listed in the file.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:355
+#: ../svnadmin/svnadmin.c:407
msgid ""
"usage: svnadmin help [SUBCOMMAND...]\n"
"\n"
"Describe the usage of this program or its subcommands.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:360
+#: ../svnadmin/svnadmin.c:412
msgid ""
"usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n"
"\n"
@@ -12197,7 +13761,14 @@ msgid ""
"repositories.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:367
+#: ../svnadmin/svnadmin.c:419
+msgid ""
+"usage: svnadmin info REPOS_PATH\n"
+"\n"
+"Print information about the repository at REPOS_PATH.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:424
msgid ""
"usage: svnadmin list-dblogs REPOS_PATH\n"
"\n"
@@ -12207,7 +13778,7 @@ msgid ""
"will cause your repository to be corrupted.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:374
+#: ../svnadmin/svnadmin.c:431
msgid ""
"usage: svnadmin list-unused-dblogs REPOS_PATH\n"
"\n"
@@ -12215,7 +13786,7 @@ msgid ""
"\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:379
+#: ../svnadmin/svnadmin.c:436
msgid ""
"usage: svnadmin load REPOS_PATH\n"
"\n"
@@ -12227,7 +13798,7 @@ msgid ""
"in the dump stream whose revision numbers match the specified range.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:391
+#: ../svnadmin/svnadmin.c:449
msgid ""
"usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n"
"\n"
@@ -12236,7 +13807,7 @@ msgid ""
"triggering the pre-lock and post-lock hook scripts.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:398
+#: ../svnadmin/svnadmin.c:456
msgid ""
"usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
"\n"
@@ -12244,14 +13815,14 @@ msgid ""
"if not provided, is the root of the repository).\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:404
+#: ../svnadmin/svnadmin.c:462
msgid ""
"usage: svnadmin lstxns REPOS_PATH\n"
"\n"
"Print the names of all uncommitted transactions.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:409
+#: ../svnadmin/svnadmin.c:467
msgid ""
"usage: svnadmin pack REPOS_PATH\n"
"\n"
@@ -12259,7 +13830,7 @@ msgid ""
"This may not apply to all repositories, in which case, exit.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:415
+#: ../svnadmin/svnadmin.c:473
msgid ""
"usage: svnadmin recover REPOS_PATH\n"
"\n"
@@ -12269,21 +13840,21 @@ msgid ""
"exit if the repository is in use by another process.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:423
+#: ../svnadmin/svnadmin.c:481
msgid ""
"usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n"
"\n"
"Unconditionally remove lock from each LOCKED_PATH.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:428
+#: ../svnadmin/svnadmin.c:486
msgid ""
"usage: svnadmin rmtxns REPOS_PATH TXN_NAME...\n"
"\n"
"Delete the named transaction(s).\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:433
+#: ../svnadmin/svnadmin.c:491
msgid ""
"usage: svnadmin setlog REPOS_PATH -r REVISION FILE\n"
"\n"
@@ -12298,20 +13869,24 @@ msgid ""
"overwrite the previous log message.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:445
+#: ../svnadmin/svnadmin.c:503
msgid ""
-"usage: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+"usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+" 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n"
+"\n"
+"1. Set the property NAME on revision REVISION to the contents of FILE.\n"
"\n"
-"Set the property NAME on revision REVISION to the contents of FILE. Use\n"
-"--use-pre-revprop-change-hook/--use-post-revprop-change-hook to trigger\n"
-"the revision property-related hooks (for example, if you want an email\n"
-"notification sent from your post-revprop-change hook).\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
"\n"
"NOTE: Revision properties are not versioned, so this command will\n"
"overwrite the previous value of the property.\n"
+"\n"
+"2. Set the property NAME on transaction TXN to the contents of FILE.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:456
+#: ../svnadmin/svnadmin.c:516
msgid ""
"usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n"
"\n"
@@ -12320,7 +13895,7 @@ msgid ""
"generate a brand new UUID for the repository.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:463
+#: ../svnadmin/svnadmin.c:523
msgid ""
"usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n"
"\n"
@@ -12329,7 +13904,7 @@ msgid ""
"triggering the pre-unlock and post-unlock hook scripts.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:470
+#: ../svnadmin/svnadmin.c:530
msgid ""
"usage: svnadmin upgrade REPOS_PATH\n"
"\n"
@@ -12345,186 +13920,328 @@ msgid ""
"repository state as a dump and subsequent load would.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:483
+#: ../svnadmin/svnadmin.c:543
msgid ""
"usage: svnadmin verify REPOS_PATH\n"
"\n"
"Verify the data stored in the repository.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:545
+#: ../svnadmin/svnadmin.c:607
msgid "Invalid revision specifier"
msgstr ""
-#: ../svnadmin/svnadmin.c:549
+#: ../svnadmin/svnadmin.c:611
#, c-format
msgid "Revisions must not be greater than the youngest revision (%ld)"
msgstr ""
-#: ../svnadmin/svnadmin.c:656
+#: ../svnadmin/svnadmin.c:629
+#, c-format
+msgid "Path '%s' is not a local path"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:658
+msgid "Not enough arguments"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:661
+msgid "Too many arguments"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:697
+#, c-format
+msgid ""
+"Successfully opened repository '%s'.\n"
+"Will now crash to simulate a crashing server process.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:736
#, c-format
msgid ""
"%swarning: The \"%s\" repository back-end is deprecated, consider using \"%s"
"\" instead.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:696
+#: ../svnadmin/svnadmin.c:777
msgid "Repositories compatible with 1.0.x must use --fs-type=bdb"
msgstr ""
-#: ../svnadmin/svnadmin.c:739 ../svnadmin/svnadmin.c:1011
-#: ../svnadmin/svnadmin.c:1192
+#: ../svnadmin/svnadmin.c:785
+#, c-format
+msgid "Repositories compatible with 1.8.x or earlier cannot use --fs-type=%s"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:830 ../svnadmin/svnadmin.c:1214
+#: ../svnadmin/svnadmin.c:1399
msgid "First revision cannot be higher than second"
msgstr ""
-#: ../svnadmin/svnadmin.c:748
+#: ../svnadmin/svnadmin.c:839
#, c-format
msgid "Deltifying revision %ld..."
msgstr ""
-#: ../svnadmin/svnadmin.c:752 ../svnadmin/svnadmin.c:812
-#: ../svnadmin/svnadmin.c:827
+#: ../svnadmin/svnadmin.c:843 ../svnadmin/svnadmin.c:974
+#: ../svnadmin/svnadmin.c:989
#, c-format
msgid "done.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:793
+#: ../svnadmin/svnadmin.c:892
+msgid "* Error verifying repository metadata.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:898
#, c-format
+msgid "* Error verifying revision %ld.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:955
msgid "* Verifying repository metadata ...\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:796
+#: ../svnadmin/svnadmin.c:958
#, c-format
msgid "* Verifying metadata at revision %ld ...\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:806
+#: ../svnadmin/svnadmin.c:968
#, c-format
msgid "Packing revisions in shard %s..."
msgstr ""
-#: ../svnadmin/svnadmin.c:821
+#: ../svnadmin/svnadmin.c:983
#, c-format
msgid "Packing revprops in shard %s..."
msgstr ""
-#: ../svnadmin/svnadmin.c:898
+#: ../svnadmin/svnadmin.c:1058
#, c-format
msgid "<<< Skipped original revision %ld\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:915
-#, c-format
+#: ../svnadmin/svnadmin.c:1075
msgid ""
"Repository lock acquired.\n"
"Please wait; recovering the repository may take some time...\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:922
+#: ../svnadmin/svnadmin.c:1082
msgid ""
"Repository lock acquired.\n"
"Please wait; upgrading the repository may take some time...\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1072
+#: ../svnadmin/svnadmin.c:1093
+#, c-format
+msgid "Packed revision properties in shard %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1104
+#, c-format
+msgid "Removed non-packed revision properties in shard %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1112
+#, c-format
+msgid "Bumped repository format to %ld\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1120
+#, c-format
+msgid "* Copied revision %ld.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1126
+#, c-format
+msgid "* Copied revisions from %ld to %ld.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1275
msgid "No program provided"
msgstr ""
-#: ../svnadmin/svnadmin.c:1108
+#: ../svnadmin/svnadmin.c:1313
msgid ""
"general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository administration tool.\n"
"Type 'svnadmin help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnadmin --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1115 ../svnlook/svnlook.c:2226
-#: ../svnserve/svnserve.c:335
+#: ../svnadmin/svnadmin.c:1321 ../svnlook/svnlook.c:2228
+#: ../svnserve/svnserve.c:429
msgid ""
"The following repository back-end (FS) modules are available:\n"
"\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1144
+#: ../svnadmin/svnadmin.c:1350
#, c-format
msgid "Invalid revision number (%ld) specified"
msgstr ""
-#: ../svnadmin/svnadmin.c:1154
+#: ../svnadmin/svnadmin.c:1360
msgid "Non-numeric revision specified"
msgstr ""
-#: ../svnadmin/svnadmin.c:1213
+#: ../svnadmin/svnadmin.c:1421
msgid ""
"Invalid property value found in dumpstream; consider repairing the source or "
"using --bypass-prop-validation while loading."
msgstr ""
-#: ../svnadmin/svnadmin.c:1279 ../svnadmin/svnadmin.c:1911
+#: ../svnadmin/svnadmin.c:1487 ../svnadmin/svnadmin.c:2366
msgid ""
"Failed to get exclusive repository access; perhaps another process\n"
"such as httpd, svnserve or svn has it open?"
msgstr ""
-#: ../svnadmin/svnadmin.c:1284 ../svnadmin/svnadmin.c:1916
+#: ../svnadmin/svnadmin.c:1492 ../svnadmin/svnadmin.c:2371
#, c-format
msgid "Waiting on repository lock; perhaps another process has it open?\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1292
+#: ../svnadmin/svnadmin.c:1500
#, c-format
msgid ""
"\n"
"Recovery completed.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1299
+#: ../svnadmin/svnadmin.c:1507
#, c-format
msgid "The latest repos revision is %ld.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1414
+#: ../svnadmin/svnadmin.c:1622
#, c-format
msgid "Transaction '%s' removed.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1476 ../svnadmin/svnadmin.c:1521
+#: ../svnadmin/svnadmin.c:1704 ../svnadmin/svnadmin.c:1818
+#: ../svnadmin/svnadmin.c:2416
+#, c-format
+msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1710 ../svnadmin/svnadmin.c:2422
+#, c-format
+msgid "Calling hooks is incompatible with --transaction (-t)"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1715 ../svnadmin/svnadmin.c:1760
+#: ../svnadmin/svnadmin.c:2427
#, c-format
msgid "Missing revision"
msgstr ""
-#: ../svnadmin/svnadmin.c:1479 ../svnadmin/svnadmin.c:1524
+#: ../svnadmin/svnadmin.c:1718 ../svnadmin/svnadmin.c:1763
+#: ../svnadmin/svnadmin.c:2430
#, c-format
msgid "Only one revision allowed"
msgstr ""
-#: ../svnadmin/svnadmin.c:1578
+#: ../svnadmin/svnadmin.c:1881
+msgid ""
+"\n"
+"-----Summary of corrupt revisions-----\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1933
#, c-format
-msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
+msgid "Failed to verify repository '%s'"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1984
+#, c-format
+msgid "UUID: %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1990
+#, c-format
+msgid "Repository Format: %d\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2004
+#, c-format
+msgid "Compatible With Version: %d.%d.0\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2023
+#, c-format
+msgid "Repository Capability: %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2032
+#, c-format
+msgid "Filesystem Type: %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2034
+#, c-format
+msgid "Filesystem Format: %d\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1745 ../svnlook/svnlook.c:2289
+#: ../svnadmin/svnadmin.c:2043
+#, c-format
+msgid "FSFS Sharded: yes\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2045
+#, c-format
+msgid "FSFS Sharded: no\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2048
+#, c-format
+msgid "FSFS Shard Size: %d\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2057
+#, c-format
+msgid "FSFS Shards Packed: %ld/%ld\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2062
+#, c-format
+msgid "FSFS Logical Addressing: yes\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2064
+#, c-format
+msgid "FSFS Logical Addressing: no\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2074
+#, c-format
+msgid "Configuration File: %s\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2198 ../svnlook/svnlook.c:2291
#, c-format
msgid "UUID Token: %s\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1746 ../svnlook/svnlook.c:2290
+#: ../svnadmin/svnadmin.c:2199 ../svnlook/svnlook.c:2292
#, c-format
msgid "Owner: %s\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1747 ../svnlook/svnlook.c:2291
+#: ../svnadmin/svnadmin.c:2200 ../svnlook/svnlook.c:2293
#, c-format
msgid "Created: %s\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1748 ../svnlook/svnlook.c:2292
+#: ../svnadmin/svnadmin.c:2201 ../svnlook/svnlook.c:2294
#, c-format
msgid "Expires: %s\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1750
+#: ../svnadmin/svnadmin.c:2203
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -12537,244 +14254,436 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../svnadmin/svnadmin.c:1796
+#: ../svnadmin/svnadmin.c:2251
msgid "No paths to unlock provided"
msgstr ""
-#: ../svnadmin/svnadmin.c:1814
+#: ../svnadmin/svnadmin.c:2269
#, c-format
msgid "Path '%s' isn't locked.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1826
+#: ../svnadmin/svnadmin.c:2281
#, c-format
msgid "Removed lock on '%s'.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1879
+#: ../svnadmin/svnadmin.c:2334
#, c-format
msgid "'%s' unlocked by user '%s'.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:1926
+#: ../svnadmin/svnadmin.c:2381
msgid ""
"Upgrade of this repository's underlying versioned filesystem is not "
"supported; consider dumping and loading the data elsewhere"
msgstr ""
-#: ../svnadmin/svnadmin.c:1933
+#: ../svnadmin/svnadmin.c:2388
msgid ""
"Upgrade of this repository is not supported; consider dumping and loading "
"the data elsewhere"
msgstr ""
-#: ../svnadmin/svnadmin.c:1939
+#: ../svnadmin/svnadmin.c:2394
#, c-format
msgid ""
"\n"
"Upgrade completed.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:2024 ../svnrdump/svnrdump.c:923
+#: ../svnadmin/svnadmin.c:2508 ../svnfsfs/svnfsfs.c:321
+#: ../svnrdump/svnrdump.c:864
msgid ""
"Multiple revision arguments encountered; try '-r N:M' instead of '-r N -r M'"
msgstr ""
-#: ../svnadmin/svnadmin.c:2102
+#: ../svnadmin/svnadmin.c:2588
#, c-format
msgid "Cannot create pre-1.0-compatible repositories"
msgstr ""
-#: ../svnadmin/svnadmin.c:2115
+#: ../svnadmin/svnadmin.c:2600
#, c-format
msgid "Cannot guarantee compatibility beyond the current running version (%s)"
msgstr ""
-#: ../svnadmin/svnadmin.c:2204
+#: ../svnadmin/svnadmin.c:2701 ../svnfsfs/svnfsfs.c:386
#, c-format
msgid "subcommand argument required\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:2239
+#: ../svnadmin/svnadmin.c:2738 ../svnfsfs/svnfsfs.c:421
msgid "Repository argument required"
msgstr ""
-#: ../svnadmin/svnadmin.c:2252
+#: ../svnadmin/svnadmin.c:2746 ../svnfsfs/svnfsfs.c:429
#, c-format
msgid "'%s' is a URL when it should be a local path"
msgstr ""
-#: ../svnadmin/svnadmin.c:2283
+#: ../svnadmin/svnadmin.c:2776
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnadmin help %s' for usage.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:2326
+#: ../svnadmin/svnadmin.c:2820
msgid "Try 'svnadmin help' for more info"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:79
+#: ../svnbench/help-cmd.c:49
+msgid ""
+"usage: svnbench <subcommand> [options] [args]\n"
+"Subversion benchmarking tool.\n"
+"Type 'svnbench help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnbench --version' to see the program version and RA modules\n"
+" or 'svnbench --version --quiet' to see just the version number.\n"
+"\n"
+"Most subcommands take file and/or directory arguments, recursing\n"
+"on the directories. If no arguments are supplied to such a\n"
+"command, it recurses on the current directory (inclusive) by default.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+
+#: ../svnbench/null-blame-cmd.c:156
+#, c-format
+msgid ""
+"%15s revisions\n"
+"%15s deltas\n"
+"%15s bytes in deltas\n"
+msgstr ""
+
+#: ../svnbench/null-export-cmd.c:334
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s bytes in files\n"
+"%15s properties\n"
+"%15s bytes in properties\n"
+msgstr ""
+
+#: ../svnbench/null-info-cmd.c:273
+#, c-format
+msgid "Number of status notifications received: %d\n"
+msgstr ""
+
+#: ../svnbench/null-list-cmd.c:153
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s locks\n"
+msgstr ""
+
+#: ../svnbench/null-log-cmd.c:190
+#, c-format
+msgid ""
+"Only relative paths can be specified after a URL for 'svnbench log', but "
+"'%s' is not a relative path"
+msgstr ""
+
+#: ../svnbench/null-log-cmd.c:222
+#, c-format
+msgid ""
+"%15s revisions, %15s merged in %s merges\n"
+"%15s msg lines, %15s in merged revisions\n"
+"%15s changes, %15s in merged revisions\n"
+msgstr ""
+
+#: ../svnbench/null-log-cmd.c:234
+#, c-format
+msgid ""
+"%15s revisions\n"
+"%15s msg lines\n"
+"%15s changes\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:113 ../svnrdump/svnrdump.c:136
+msgid "specify a password ARG"
+msgstr ""
+
+#: ../svnbench/svnbench.c:120
+msgid "use strict semantics"
+msgstr ""
+
+#: ../svnbench/svnbench.c:144
+msgid "do no interactive prompting"
+msgstr ""
+
+#: ../svnbench/svnbench.c:211
+msgid ""
+"Fetch all versions of a file in a batch.\n"
+"usage: null-blame [-rM:N] TARGET[@REV]...\n"
+"\n"
+" With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the last revision at or before rN that changed or added the line,\n"
+" looking back no further than rM.\n"
+"\n"
+" With a reverse revision range '-r M:N' where M > N,\n"
+" annotate each line that is present in revision N of the file, with\n"
+" the next revision after rN that changed or deleted the line,\n"
+" looking forward no further than rM.\n"
+"\n"
+" If specified, REV determines in which revision the target is first\n"
+" looked up.\n"
+"\n"
+" Write the annotated result to standard output.\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:231
+msgid ""
+"Create an unversioned copy of a tree.\n"
+"usage: null-export [-r REV] URL[@PEGREV]\n"
+"\n"
+" Exports a clean directory tree from the repository specified by\n"
+" URL, at revision REV if it is given, otherwise at HEAD.\n"
+"\n"
+" If specified, PEGREV determines in which revision the target is first\n"
+" looked up.\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:242
+msgid ""
+"List directory entries in the repository.\n"
+"usage: null-list [TARGET[@REV]...]\n"
+"\n"
+" List each TARGET file and the contents of each TARGET directory as\n"
+" they exist in the repository. If TARGET is a working copy path, the\n"
+" corresponding repository URL will be used. If specified, REV determines\n"
+" in which revision the target is first looked up.\n"
+"\n"
+" The default TARGET is '.', meaning the repository URL of the current\n"
+" working directory.\n"
+"\n"
+" With --verbose, the following fields will be fetched for each item:\n"
+"\n"
+" Revision number of the last commit\n"
+" Author of the last commit\n"
+" If locked, the letter 'O'. (Use 'svn info URL' to see details)\n"
+" Size (in bytes)\n"
+" Date and time of the last commit\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:263
+msgid ""
+"Fetch the log messages for a set of revision(s) and/or path(s).\n"
+"usage: 1. null-log [PATH][@REV]\n"
+" 2. null-log URL[@REV] [PATH...]\n"
+"\n"
+" 1. Fetch the log messages for the URL corresponding to PATH\n"
+" (default: '.'). If specified, REV is the revision in which the\n"
+" URL is first looked up, and the default revision range is REV:1.\n"
+" If REV is not specified, the default revision range is BASE:1,\n"
+" since the URL might not exist in the HEAD revision.\n"
+"\n"
+" 2. Fetch the log messages for the PATHs (default: '.') under URL.\n"
+" If specified, REV is the revision in which the URL is first\n"
+" looked up, and the default revision range is REV:1; otherwise,\n"
+" the URL is looked up in HEAD, and the default revision range is\n"
+" HEAD:1.\n"
+"\n"
+" Multiple '-c' or '-r' options may be specified (but not a\n"
+" combination of '-c' and '-r' options), and mixing of forward and\n"
+" reverse ranges is allowed.\n"
+"\n"
+" With -v, also print all affected paths with each log message.\n"
+" With -q, don't print the log message body itself (note that this is\n"
+" compatible with -v).\n"
+"\n"
+" Each log message is printed just once, even if more than one of the\n"
+" affected paths for that revision were explicitly requested. Logs\n"
+" follow copy history by default. Use --stop-on-copy to disable this\n"
+" behavior, which can be useful for determining branchpoints.\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:297
+msgid ""
+"Display information about a local or remote item.\n"
+"usage: null-info [TARGET[@REV]...]\n"
+"\n"
+" Print information about each TARGET (default: '.').\n"
+" TARGET may be either a working-copy path or URL. If specified, REV\n"
+" determines in which revision the target is first looked up.\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:760
+#, c-format
+msgid ""
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svnbench help %s' for usage.\n"
+msgstr ""
+
+#: ../svnbench/svnbench.c:951
+#, c-format
+msgid "Try 'svnbench help %s' for more information"
+msgstr ""
+
+#: ../svndumpfilter/svndumpfilter.c:80
#, c-format
msgid "Can't open stdio file"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:406
+#: ../svndumpfilter/svndumpfilter.c:394
msgid "This is an empty revision for padding."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:489
+#: ../svndumpfilter/svndumpfilter.c:446
#, c-format
msgid "Revision %ld committed as %ld.\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:512
+#: ../svndumpfilter/svndumpfilter.c:469
#, c-format
msgid "Revision %ld skipped.\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:608
+#: ../svndumpfilter/svndumpfilter.c:566
#, c-format
msgid "Invalid copy source path '%s'"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:649
+#: ../svndumpfilter/svndumpfilter.c:604
#, c-format
msgid "Missing Node-action for path '%s'"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:692
+#: ../svndumpfilter/svndumpfilter.c:647
#, c-format
msgid "No valid copyfrom revision in filtered stream"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:816
+#: ../svndumpfilter/svndumpfilter.c:715
#, c-format
msgid "Missing merge source path '%s'; try with --skip-missing-merge-sources"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:838
+#: ../svndumpfilter/svndumpfilter.c:737
#, c-format
msgid "No valid revision range 'start' in filtered stream"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:845
+#: ../svndumpfilter/svndumpfilter.c:744
#, c-format
msgid "No valid revision range 'end' in filtered stream"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:891 ../svndumpfilter/svndumpfilter.c:922
+#: ../svndumpfilter/svndumpfilter.c:792 ../svndumpfilter/svndumpfilter.c:823
#, c-format
msgid ""
"Delta property block detected, but deltas are not enabled for node '%s' in "
"original revision %ld"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1055
+#: ../svndumpfilter/svndumpfilter.c:985
msgid "Do not display filtering statistics."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1057
+#: ../svndumpfilter/svndumpfilter.c:987
msgid "Treat the path prefixes as file glob patterns."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1059
+#: ../svndumpfilter/svndumpfilter.c:989
msgid "Remove revisions emptied by filtering."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1061
+#: ../svndumpfilter/svndumpfilter.c:991
msgid ""
"Remove all empty revisions found in dumpstream\n"
" except revision 0."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1064
+#: ../svndumpfilter/svndumpfilter.c:994
msgid "Renumber revisions left after filtering."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1067
+#: ../svndumpfilter/svndumpfilter.c:997
msgid "Skip missing merge sources."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1069
+#: ../svndumpfilter/svndumpfilter.c:999
msgid "Don't filter revision properties."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1071
+#: ../svndumpfilter/svndumpfilter.c:1001
msgid ""
"Read additional prefixes, one per line, from\n"
" file ARG."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1083
+#: ../svndumpfilter/svndumpfilter.c:1013
msgid ""
"Filter out nodes with given prefixes from dumpstream.\n"
"usage: svndumpfilter exclude PATH_PREFIX...\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1092
+#: ../svndumpfilter/svndumpfilter.c:1022
msgid ""
"Filter out nodes without given prefixes from dumpstream.\n"
"usage: svndumpfilter include PATH_PREFIX...\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1101
+#: ../svndumpfilter/svndumpfilter.c:1031
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: svndumpfilter help [SUBCOMMAND...]\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1177
+#: ../svndumpfilter/svndumpfilter.c:1107
msgid ""
"general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]\n"
+"Subversion repository dump filtering tool.\n"
"Type 'svndumpfilter help <subcommand>' for help on a specific subcommand.\n"
"Type 'svndumpfilter --version' to see the program version.\n"
"\n"
"Available subcommands:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1235
+#: ../svndumpfilter/svndumpfilter.c:1166
#, c-format
msgid "Excluding (and dropping empty revisions for) prefix patterns:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1237
+#: ../svndumpfilter/svndumpfilter.c:1168
#, c-format
msgid "Excluding prefix patterns:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1240
+#: ../svndumpfilter/svndumpfilter.c:1171
#, c-format
msgid "Including (and dropping empty revisions for) prefix patterns:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1242
+#: ../svndumpfilter/svndumpfilter.c:1173
#, c-format
msgid "Including prefix patterns:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1250
+#: ../svndumpfilter/svndumpfilter.c:1181
#, c-format
msgid "Excluding (and dropping empty revisions for) prefixes:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1252
+#: ../svndumpfilter/svndumpfilter.c:1183
#, c-format
msgid "Excluding prefixes:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1255
+#: ../svndumpfilter/svndumpfilter.c:1186
#, c-format
msgid "Including (and dropping empty revisions for) prefixes:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1257
+#: ../svndumpfilter/svndumpfilter.c:1188
#, c-format
msgid "Including prefixes:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1285
+#: ../svndumpfilter/svndumpfilter.c:1216
#, c-format
msgid ""
"Dropped %d revision.\n"
@@ -12785,85 +14694,260 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../svndumpfilter/svndumpfilter.c:1293
+#: ../svndumpfilter/svndumpfilter.c:1224
msgid "Revisions renumbered as follows:\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1321
+#: ../svndumpfilter/svndumpfilter.c:1251
#, c-format
msgid " %ld => (dropped)\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1336
+#: ../svndumpfilter/svndumpfilter.c:1266
#, c-format
msgid "Dropped %d node:\n"
msgid_plural "Dropped %d nodes:\n"
msgstr[0] ""
msgstr[1] ""
-#: ../svndumpfilter/svndumpfilter.c:1505
+#: ../svndumpfilter/svndumpfilter.c:1424
msgid "--drop-empty-revs cannot be used with --drop-all-empty-revs"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1625
+#: ../svndumpfilter/svndumpfilter.c:1541
#, c-format
msgid ""
"\n"
"Error: no prefixes supplied.\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1656
+#: ../svndumpfilter/svndumpfilter.c:1572
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svndumpfilter help %s' for usage.\n"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1674
+#: ../svndumpfilter/svndumpfilter.c:1590
msgid "Try 'svndumpfilter help' for more info"
msgstr ""
-#: ../svnlook/svnlook.c:117
+#: ../svnfsfs/load-index-cmd.c:54
+#, c-format
+msgid "Unknown item type '%s'"
+msgstr ""
+
+#: ../svnfsfs/load-index-cmd.c:75
+#, c-format
+msgid "%i columns needed, %i provided"
+msgstr ""
+
+#: ../svnfsfs/load-index-cmd.c:85
+#, c-format
+msgid "%s is not a value HEX string"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:72
+#, c-format
+msgid ""
+"%20s bytes in %12s reps\n"
+"%20s bytes in %12s shared reps\n"
+"%20s bytes expanded size\n"
+"%20s bytes expanded shared size\n"
+"%20s bytes with rep-sharing off\n"
+"%20s shared references\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:96
+#, c-format
+msgid "%12s r%-8ld %s\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:122
+#, c-format
+msgid " %4s .. < %-4s %19s (%2d%%) bytes in %12s (%2d%%) items\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:245 ../svnfsfs/stats-cmd.c:254
+#, c-format
+msgid "%11s %20s (%2d%%) representations\n"
+msgstr ""
+
+#. Total sum can't be zero here.
+#: ../svnfsfs/stats-cmd.c:292 ../svnfsfs/stats-cmd.c:302
+#: ../svnfsfs/stats-cmd.c:327 ../svnfsfs/stats-cmd.c:337
+#, c-format
+msgid "%11s %20s (%2d%%) bytes\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:379
+#, c-format
+msgid ""
+"%20s bytes in %12s revisions\n"
+"%20s bytes in %12s changes\n"
+"%20s bytes in %12s node revision records\n"
+"%20s bytes in %12s representations\n"
+"%20s bytes expanded representation size\n"
+"%20s bytes with rep-sharing off\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:399
+#, c-format
+msgid ""
+"%20s bytes in %12s nodes total\n"
+"%20s bytes in %12s directory noderevs\n"
+"%20s bytes in %12s file noderevs\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:410
+#, c-format
+msgid ""
+"%20s bytes in %12s representations total\n"
+"%20s bytes in %12s directory representations\n"
+"%20s bytes in %12s file representations\n"
+"%20s bytes in %12s representations of added file nodes\n"
+"%20s bytes in %12s directory property representations\n"
+"%20s bytes in %12s file property representations\n"
+"%20s bytes in header & footer overhead\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:144
+msgid ""
+"size of the extra in-memory cache in MB used to\n"
+" minimize redundant operations. Default: 16."
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:157
+msgid ""
+"usage: svnfsfs help [SUBCOMMAND...]\n"
+"\n"
+"Describe the usage of this program or its subcommands.\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:162
+msgid ""
+"usage: svnfsfs dump-index REPOS_PATH -r REV\n"
+"\n"
+"Dump the index contents for the revision / pack file containing revision "
+"REV\n"
+"to console. This is only available for FSFS format 7 (SVN 1.9+) "
+"repositories.\n"
+"The table produced contains a header in the first line followed by one line\n"
+"per index entry, ordered by location in the revision / pack file. Columns:\n"
+"\n"
+" * Byte offset (hex) at which the item starts\n"
+" * Length (hex) of the item in bytes\n"
+" * Item type (string) is one of the following:\n"
+"\n"
+" none ... Unused section. File contents shall be NULs.\n"
+" frep ... File representation.\n"
+" drep ... Directory representation.\n"
+" fprop .. File property.\n"
+" dprop .. Directory property.\n"
+" node ... Node revision.\n"
+" chgs ... Changed paths list.\n"
+" rep .... Representation of unknown type. Should not be used.\n"
+" ??? .... Invalid. Index data is corrupt.\n"
+"\n"
+" The distinction between frep, drep, fprop and dprop is a mere "
+"internal\n"
+" classification used for various optimizations and does not affect "
+"the\n"
+" operational correctness.\n"
+"\n"
+" * Revision that the item belongs to (decimal)\n"
+" * Item number (decimal) within that revision\n"
+" * Modified FNV1a checksum (8 hex digits)\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:188
+msgid ""
+"usage: svnfsfs load-index REPOS_PATH\n"
+"\n"
+"Read index contents from console. The format is the same as produced by "
+"the\n"
+"dump-index command, except that checksum as well as header are optional and "
+"will\n"
+"be ignored. The data must cover the full revision / pack file; the "
+"revision\n"
+"number is automatically extracted from input stream. No ordering is "
+"required.\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:196
+msgid ""
+"usage: svnfsfs stats REPOS_PATH\n"
+"\n"
+"Write object size statistics to console.\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:216
+#, c-format
+msgid "%s repositories are not supported"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:232
+msgid ""
+"general usage: svnfsfs SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion FSFS repository manipulation tool.\n"
+"Type 'svnfsfs help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnfsfs --version' to see the program version.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:459
+#, c-format
+msgid ""
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svnfsfs help %s' for usage.\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:503
+msgid "Try 'svnfsfs help' for more info"
+msgstr ""
+
+#: ../svnlook/svnlook.c:118
msgid "show details for copies"
msgstr ""
-#: ../svnlook/svnlook.c:120
+#: ../svnlook/svnlook.c:121
msgid "print differences against the copy source"
msgstr ""
-#: ../svnlook/svnlook.c:123
+#: ../svnlook/svnlook.c:124
msgid "show full paths instead of indenting them"
msgstr ""
-#: ../svnlook/svnlook.c:129
+#: ../svnlook/svnlook.c:130
msgid "maximum number of history entries"
msgstr ""
-#: ../svnlook/svnlook.c:147
+#: ../svnlook/svnlook.c:151
msgid "operate on single directory only"
msgstr ""
-#: ../svnlook/svnlook.c:150
+#: ../svnlook/svnlook.c:154
msgid "specify revision number ARG"
msgstr ""
-#: ../svnlook/svnlook.c:153
+#: ../svnlook/svnlook.c:157
msgid "operate on a revision property (use with -r or -t)"
msgstr ""
-#: ../svnlook/svnlook.c:156
+#: ../svnlook/svnlook.c:160
msgid "show node revision ids for each path"
msgstr ""
-#: ../svnlook/svnlook.c:159
+#: ../svnlook/svnlook.c:163
msgid "show path's inherited properties"
msgstr ""
-#: ../svnlook/svnlook.c:165
+#: ../svnlook/svnlook.c:169
msgid "be verbose"
msgstr ""
-#: ../svnlook/svnlook.c:174
+#: ../svnlook/svnlook.c:178
msgid ""
"Specify differencing options for external diff or\n"
" internal diff. Default: '-u'. Options are\n"
@@ -12876,45 +14960,52 @@ msgid ""
"space\n"
" --ignore-eol-style: Ignore changes in EOL "
"style\n"
+" -U ARG, --context ARG: Show ARG lines of "
+"context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
-#: ../svnlook/svnlook.c:205
+#: ../svnlook/svnlook.c:199 ../svnrdump/svnrdump.c:126
+#: ../svnserve/svnserve.c:380 ../svnversion/svnversion.c:146
+msgid "no progress (only errors) to stderr"
+msgstr ""
+
+#: ../svnlook/svnlook.c:211
msgid ""
"usage: svnlook author REPOS_PATH\n"
"\n"
"Print the author.\n"
msgstr ""
-#: ../svnlook/svnlook.c:210
+#: ../svnlook/svnlook.c:216
msgid ""
"usage: svnlook cat REPOS_PATH FILE_PATH\n"
"\n"
"Print the contents of a file. Leading '/' on FILE_PATH is optional.\n"
msgstr ""
-#: ../svnlook/svnlook.c:215
+#: ../svnlook/svnlook.c:221
msgid ""
"usage: svnlook changed REPOS_PATH\n"
"\n"
"Print the paths that were changed.\n"
msgstr ""
-#: ../svnlook/svnlook.c:220
+#: ../svnlook/svnlook.c:226
msgid ""
"usage: svnlook date REPOS_PATH\n"
"\n"
"Print the datestamp.\n"
msgstr ""
-#: ../svnlook/svnlook.c:225
+#: ../svnlook/svnlook.c:231
msgid ""
"usage: svnlook diff REPOS_PATH\n"
"\n"
"Print GNU-style diffs of changed files and properties.\n"
msgstr ""
-#: ../svnlook/svnlook.c:232
+#: ../svnlook/svnlook.c:238
msgid ""
"usage: svnlook dirs-changed REPOS_PATH\n"
"\n"
@@ -12922,7 +15013,7 @@ msgid ""
"or whose file children were changed.\n"
msgstr ""
-#: ../svnlook/svnlook.c:238
+#: ../svnlook/svnlook.c:244
msgid ""
"usage: svnlook filesize REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -12930,14 +15021,14 @@ msgid ""
"it is represented in the repository.\n"
msgstr ""
-#: ../svnlook/svnlook.c:244
+#: ../svnlook/svnlook.c:250
msgid ""
"usage: svnlook help [SUBCOMMAND...]\n"
"\n"
"Describe the usage of this program or its subcommands.\n"
msgstr ""
-#: ../svnlook/svnlook.c:249
+#: ../svnlook/svnlook.c:255
msgid ""
"usage: svnlook history REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -12945,28 +15036,28 @@ msgid ""
"the root directory if no path is supplied).\n"
msgstr ""
-#: ../svnlook/svnlook.c:255
+#: ../svnlook/svnlook.c:261
msgid ""
"usage: svnlook info REPOS_PATH\n"
"\n"
"Print the author, datestamp, log message size, and log message.\n"
msgstr ""
-#: ../svnlook/svnlook.c:260
+#: ../svnlook/svnlook.c:266
msgid ""
"usage: svnlook lock REPOS_PATH PATH_IN_REPOS\n"
"\n"
"If a lock exists on a path in the repository, describe it.\n"
msgstr ""
-#: ../svnlook/svnlook.c:265
+#: ../svnlook/svnlook.c:271
msgid ""
"usage: svnlook log REPOS_PATH\n"
"\n"
"Print the log message.\n"
msgstr ""
-#: ../svnlook/svnlook.c:270
+#: ../svnlook/svnlook.c:276
msgid ""
"usage: 1. svnlook propget REPOS_PATH PROPNAME PATH_IN_REPOS\n"
" 2. svnlook propget --revprop REPOS_PATH PROPNAME\n"
@@ -12975,7 +15066,7 @@ msgid ""
"With --revprop, print the raw value of a revision property.\n"
msgstr ""
-#: ../svnlook/svnlook.c:279
+#: ../svnlook/svnlook.c:285
msgid ""
"usage: 1. svnlook proplist REPOS_PATH PATH_IN_REPOS\n"
" 2. svnlook proplist --revprop REPOS_PATH\n"
@@ -12985,7 +15076,7 @@ msgid ""
"With -v, show the property values too.\n"
msgstr ""
-#: ../svnlook/svnlook.c:290
+#: ../svnlook/svnlook.c:296
msgid ""
"usage: svnlook tree REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -12993,89 +15084,94 @@ msgid ""
"of the tree otherwise), optionally showing node revision ids.\n"
msgstr ""
-#: ../svnlook/svnlook.c:296
+#: ../svnlook/svnlook.c:302
msgid ""
"usage: svnlook uuid REPOS_PATH\n"
"\n"
"Print the repository's UUID.\n"
msgstr ""
-#: ../svnlook/svnlook.c:301
+#: ../svnlook/svnlook.c:307
msgid ""
"usage: svnlook youngest REPOS_PATH\n"
"\n"
"Print the youngest revision number.\n"
msgstr ""
-#: ../svnlook/svnlook.c:861
+#: ../svnlook/svnlook.c:868
#, c-format
msgid "Copied: %s (from rev %ld, %s)\n"
msgstr ""
-#: ../svnlook/svnlook.c:929
+#: ../svnlook/svnlook.c:936
msgid "Added"
msgstr ""
-#: ../svnlook/svnlook.c:930
+#: ../svnlook/svnlook.c:937
msgid "Deleted"
msgstr ""
-#: ../svnlook/svnlook.c:931
+#: ../svnlook/svnlook.c:938
msgid "Modified"
msgstr ""
-#: ../svnlook/svnlook.c:932
+#: ../svnlook/svnlook.c:939
msgid "Index"
msgstr ""
-#: ../svnlook/svnlook.c:943
+#: ../svnlook/svnlook.c:950
msgid ""
"(Binary files differ)\n"
"\n"
msgstr ""
-#: ../svnlook/svnlook.c:1222
+#: ../svnlook/svnlook.c:1219
msgid "unknown"
msgstr ""
-#: ../svnlook/svnlook.c:1279
+#: ../svnlook/svnlook.c:1276
#, c-format
msgid "Transaction '%s' is not based on a revision; how odd"
msgstr ""
-#: ../svnlook/svnlook.c:1422
+#: ../svnlook/svnlook.c:1419
#, c-format
msgid "'%s' is a URL, probably should be a path"
msgstr ""
-#: ../svnlook/svnlook.c:1445 ../svnlook/svnlook.c:1468
+#: ../svnlook/svnlook.c:1442 ../svnlook/svnlook.c:1465
#, c-format
msgid "Path '%s' is not a file"
msgstr ""
-#: ../svnlook/svnlook.c:1604
+#: ../svnlook/svnlook.c:1599
msgid "History item limit reached"
msgstr ""
-#: ../svnlook/svnlook.c:1623
+#: ../svnlook/svnlook.c:1618
#, c-format
msgid ""
"REVISION PATH <ID>\n"
"-------- ---------\n"
msgstr ""
-#: ../svnlook/svnlook.c:1628
+#: ../svnlook/svnlook.c:1623
#, c-format
msgid ""
"REVISION PATH\n"
"-------- ----\n"
msgstr ""
-#: ../svnlook/svnlook.c:1700
+#: ../svnlook/svnlook.c:1696
#, c-format
msgid "Property '%s' not found on revision %ld"
msgstr ""
+#: ../svnlook/svnlook.c:1700
+#, c-format
+msgid "Property '%s' not found on transaction %s"
+msgstr ""
+
#: ../svnlook/svnlook.c:1709
#, c-format
msgid ""
@@ -13100,23 +15196,24 @@ msgstr ""
msgid "Property '%s' not found on path '%s' in transaction %s"
msgstr ""
-#: ../svnlook/svnlook.c:2064
+#: ../svnlook/svnlook.c:2065
msgid "Missing repository path argument"
msgstr ""
-#: ../svnlook/svnlook.c:2216
+#: ../svnlook/svnlook.c:2217
msgid ""
"general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository inspection tool.\n"
+"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnlook --version' to see the program version and FS modules.\n"
"Note: any subcommand which takes the '--revision' and '--transaction'\n"
" options will, if invoked without one of those options, act on\n"
" the repository's youngest revision.\n"
-"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
-"Type 'svnlook --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
-#: ../svnlook/svnlook.c:2294
+#: ../svnlook/svnlook.c:2296
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -13127,64 +15224,70 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../svnlook/svnlook.c:2346
+#: ../svnlook/svnlook.c:2348
#, c-format
msgid "Missing propname argument"
msgstr ""
-#: ../svnlook/svnlook.c:2347
+#: ../svnlook/svnlook.c:2349
#, c-format
msgid "Missing propname and repository path arguments"
msgstr ""
-#: ../svnlook/svnlook.c:2353
+#: ../svnlook/svnlook.c:2355
msgid "Missing propname or repository path argument"
msgstr ""
-#: ../svnlook/svnlook.c:2517
+#: ../svnlook/svnlook.c:2508
msgid "Invalid revision number supplied"
msgstr ""
-#: ../svnlook/svnlook.c:2629
+#: ../svnlook/svnlook.c:2622
msgid ""
"The '--transaction' (-t) and '--revision' (-r) arguments cannot co-exist"
msgstr ""
-#: ../svnlook/svnlook.c:2636
+#: ../svnlook/svnlook.c:2629
msgid ""
"Cannot use the '--show-inherited-props' option with the '--revprop' option"
msgstr ""
-#: ../svnlook/svnlook.c:2695
+#: ../svnlook/svnlook.c:2686
#, c-format
msgid "Try 'svnadmin verify' instead.\n"
msgstr ""
-#: ../svnlook/svnlook.c:2729
+#: ../svnlook/svnlook.c:2719
#, c-format
msgid "Repository argument required\n"
msgstr ""
-#: ../svnlook/svnlook.c:2738
+#: ../svnlook/svnlook.c:2728
#, c-format
msgid "'%s' is a URL when it should be a path\n"
msgstr ""
-#: ../svnlook/svnlook.c:2790
+#: ../svnlook/svnlook.c:2778
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnlook help %s' for usage.\n"
msgstr ""
-#: ../svnlook/svnlook.c:2833
+#: ../svnlook/svnlook.c:2821
msgid "Try 'svnlook help' for more info"
msgstr ""
-#: ../svnmucc/svnmucc.c:927
+#: ../svnmucc/svnmucc.c:258
+#, c-format
+msgid "Type 'svnmucc --help' for usage.\n"
+msgstr ""
+
+#: ../svnmucc/svnmucc.c:266
msgid ""
-"Subversion multiple URL command client\n"
"usage: svnmucc ACTION...\n"
+"Subversion multiple URL command client.\n"
+"Type 'svnmucc --version' to see the program version and RA modules.\n"
"\n"
" Perform one or more Subversion repository URL-based ACTIONs, committing\n"
" the result as a (single) new revision.\n"
@@ -13214,9 +15317,17 @@ msgid ""
" prompt only if standard input is a terminal)\n"
" --force-interactive : do interactive prompting even if standard\n"
" input is not a terminal\n"
-" --trust-server-cert : accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but\n"
-" only with '--non-interactive')\n"
+" --trust-server-cert : deprecated;\n"
+" same as --trust-server-cert-failures=unknown-ca\n"
+" --trust-server-cert-failures ARG\n"
+" with --non-interactive, accept SSL server\n"
+" certificates with failures; ARG is comma-"
+"separated\n"
+" list of 'unknown-ca' (Unknown Authority),\n"
+" 'cn-mismatch' (Hostname mismatch), 'expired'\n"
+" (Expired certificate),'not-yet-valid' (Not yet\n"
+" valid certificate) and 'other' (all other not\n"
+" separately classified certificate errors).\n"
" -X [--extra-args] ARG : append arguments from file ARG (one per line;\n"
" use \"-\" to read from standard input)\n"
" --config-dir ARG : use ARG to override the config directory\n"
@@ -13225,24 +15336,29 @@ msgid ""
" --version : print version information\n"
msgstr ""
-#: ../svnmucc/svnmucc.c:1003
+#: ../svnmucc/svnmucc.c:347
msgid ""
"--message (-m), --file (-F), and --with-revprop=svn:log are mutually "
"exclusive"
msgstr ""
-#: ../svnrdump/load_editor.c:392 ../svnsync/svnsync.c:327
+#: ../svnmucc/svnmucc.c:580
+#, c-format
+msgid "Invalid revision number '%s'"
+msgstr ""
+
+#: ../svnrdump/load_editor.c:231 ../svnsync/svnsync.c:366
#, c-format
msgid "Failed to get lock on destination repos, currently held by '%s'\n"
msgstr ""
-#: ../svnrdump/load_editor.c:536
+#: ../svnrdump/load_editor.c:375
msgid ""
"Target server does not support atomic revision property edits; consider "
"upgrading it to 1.7."
msgstr ""
-#: ../svnrdump/svnrdump.c:101
+#: ../svnrdump/svnrdump.c:105
msgid ""
"usage: svnrdump dump URL [-r LOWER[:UPPER]]\n"
"\n"
@@ -13251,153 +15367,173 @@ msgid ""
"one revision.\n"
msgstr ""
-#: ../svnrdump/svnrdump.c:107
+#: ../svnrdump/svnrdump.c:111
msgid ""
"usage: svnrdump load URL\n"
"\n"
"Load a 'dumpfile' given on stdin to a repository at remote URL.\n"
msgstr ""
-#: ../svnrdump/svnrdump.c:111
+#: ../svnrdump/svnrdump.c:115
msgid ""
"usage: svnrdump help [SUBCOMMAND...]\n"
"\n"
"Describe the usage of this program or its subcommands.\n"
msgstr ""
-#: ../svnrdump/svnrdump.c:124
+#: ../svnrdump/svnrdump.c:128
msgid "dump incrementally"
msgstr ""
-#: ../svnrdump/svnrdump.c:142 ../svnserve/svnserve.c:281
-#: ../svnversion/svnversion.c:139
+#: ../svnrdump/svnrdump.c:130
+msgid "skip revision property ARG (e.g., \"svn:author\")"
+msgstr ""
+
+#: ../svnrdump/svnrdump.c:148 ../svnserve/svnserve.c:372
+#: ../svnversion/svnversion.c:142
msgid "display this help"
msgstr ""
-#: ../svnrdump/svnrdump.c:731
+#: ../svnrdump/svnrdump.c:669
msgid ""
"general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+"Subversion remote repository dump and load tool.\n"
"Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnrdump --version' to see the program version and RA modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
-#: ../svnrdump/svnrdump.c:775 ../svnrdump/svnrdump.c:809
+#: ../svnrdump/svnrdump.c:714 ../svnrdump/svnrdump.c:748
msgid "Unsupported revision specifier used; use only integer values or 'HEAD'"
msgstr ""
-#: ../svnrdump/svnrdump.c:783 ../svnrdump/svnrdump.c:817
+#: ../svnrdump/svnrdump.c:722 ../svnrdump/svnrdump.c:756
#, c-format
msgid "Revision '%ld' does not exist"
msgstr ""
-#: ../svnrdump/svnrdump.c:827
+#: ../svnrdump/svnrdump.c:766
msgid ""
"LOWER revision cannot be greater than UPPER revision; consider reversing "
"your revision range"
msgstr ""
-#: ../svnrdump/svnrdump.c:1072
+#: ../svnrdump/svnrdump.c:1024
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnrdump help %s' for usage.\n"
msgstr ""
-#: ../svnserve/cyrus_auth.c:119
+#: ../svnserve/cyrus_auth.c:121
msgid "Could not initialize the SASL library"
msgstr ""
-#: ../svnserve/cyrus_auth.c:260
+#: ../svnserve/cyrus_auth.c:193
+#, c-format
+msgid "Initial token is too long"
+msgstr ""
+
+#: ../svnserve/cyrus_auth.c:224
+#, c-format
+msgid "Step response is too long"
+msgstr ""
+
+#: ../svnserve/cyrus_auth.c:274
#, c-format
msgid "Can't get hostname"
msgstr ""
-#: ../svnserve/cyrus_auth.c:325
+#: ../svnserve/cyrus_auth.c:331
msgid "Could not obtain the list of SASL mechanisms"
msgstr ""
-#: ../svnserve/cyrus_auth.c:367
+#: ../svnserve/cyrus_auth.c:374
msgid "Couldn't obtain the authenticated username"
msgstr ""
-#: ../svnserve/serve.c:2061
+#: ../svnserve/serve.c:2079
msgid "Path is not a string"
msgstr ""
-#: ../svnserve/serve.c:2218
+#: ../svnserve/serve.c:2249
msgid "Log revprop entry not a string"
msgstr ""
-#: ../svnserve/serve.c:2224
+#: ../svnserve/serve.c:2255
#, c-format
msgid "Unknown revprop word '%s' in log command"
msgstr ""
-#: ../svnserve/serve.c:2240
+#: ../svnserve/serve.c:2271
msgid "Log path entry not a string"
msgstr ""
-#: ../svnserve/svnserve.c:162
+#: ../svnserve/serve.c:2894 ../svnserve/serve.c:3070
+#, c-format
+msgid "No result for '%s'."
+msgstr ""
+
+#: ../svnserve/svnserve.c:216
msgid "daemon mode"
msgstr ""
-#: ../svnserve/svnserve.c:163
+#: ../svnserve/svnserve.c:217
msgid "inetd mode"
msgstr ""
-#: ../svnserve/svnserve.c:164
+#: ../svnserve/svnserve.c:218
msgid "tunnel mode"
msgstr ""
-#: ../svnserve/svnserve.c:165
+#: ../svnserve/svnserve.c:219
msgid "listen-once mode (useful for debugging)"
msgstr ""
-#: ../svnserve/svnserve.c:168
+#: ../svnserve/svnserve.c:222
msgid "Windows service mode (Service Control Manager)"
msgstr ""
-#: ../svnserve/svnserve.c:170
+#: ../svnserve/svnserve.c:224
msgid "root of directory to serve"
msgstr ""
-#: ../svnserve/svnserve.c:172
+#: ../svnserve/svnserve.c:226
msgid "force read only, overriding repository config file"
msgstr ""
-#: ../svnserve/svnserve.c:174
+#: ../svnserve/svnserve.c:228
msgid "read configuration from file ARG"
msgstr ""
-#: ../svnserve/svnserve.c:177
+#: ../svnserve/svnserve.c:231
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, service, listen-once]"
msgstr ""
-#: ../svnserve/svnserve.c:181
+#: ../svnserve/svnserve.c:235
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, listen-once]"
msgstr ""
-#: ../svnserve/svnserve.c:187
+#: ../svnserve/svnserve.c:241
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
" [mode: daemon, service, listen-once]"
msgstr ""
-#: ../svnserve/svnserve.c:193
+#: ../svnserve/svnserve.c:247
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
" [mode: daemon, listen-once]"
msgstr ""
-#: ../svnserve/svnserve.c:200
+#: ../svnserve/svnserve.c:254
msgid ""
"prefer IPv6 when resolving the listen hostname\n"
" [IPv4 is preferred by default. Using IPv4 and "
@@ -13407,46 +15543,47 @@ msgid ""
" Use inetd mode or tunnel mode if you need this.]"
msgstr ""
-#: ../svnserve/svnserve.c:208
+#: ../svnserve/svnserve.c:262
msgid ""
"compression level to use for network transmissions\n"
" [0 .. no compression, 5 .. default, \n"
" 9 .. maximum compression]"
msgstr ""
-#: ../svnserve/svnserve.c:214
+#: ../svnserve/svnserve.c:268
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations.\n"
" Default is 16.\n"
-" [used for FSFS repositories only]"
+" 0 switches to dynamically sized caches.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
-#: ../svnserve/svnserve.c:222
+#: ../svnserve/svnserve.c:278
msgid ""
"enable or disable caching of deltas between older\n"
" revisions.\n"
-" Default is no.\n"
-" [used for FSFS repositories only]"
+" Default is yes.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
-#: ../svnserve/svnserve.c:230
+#: ../svnserve/svnserve.c:286
msgid ""
"enable or disable caching of file contents\n"
" Default is yes.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
-#: ../svnserve/svnserve.c:236
+#: ../svnserve/svnserve.c:292
msgid ""
"enable or disable caching of revision properties.\n"
" Consult the documentation before activating "
"this.\n"
" Default is no.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
-#: ../svnserve/svnserve.c:244
+#: ../svnserve/svnserve.c:300
msgid ""
"Optimize network handling based on the assumption\n"
" that most clients are connected with a bitrate "
@@ -13455,149 +15592,184 @@ msgid ""
" Default is 0 (optimizations disabled)."
msgstr ""
+#: ../svnserve/svnserve.c:308
+msgid ""
+"Parse and cache all data found in block instead\n"
+" of just the requested item.\n"
+" Default is no.\n"
+" [used for FSFS repositories in 1.9 format only]"
+msgstr ""
+
#. ### Making the assumption here that WIN32 never has fork and so
#. * ### this option never exists when --service exists.
-#: ../svnserve/svnserve.c:254
+#: ../svnserve/svnserve.c:318
msgid "use threads instead of fork [mode: daemon]"
msgstr ""
-#: ../svnserve/svnserve.c:258
+#: ../svnserve/svnserve.c:321
+msgid ""
+"Minimum number of server threads, even if idle.\n"
+" Capped to max-threads; minimum value is 0.\n"
+" Default is 1.\n"
+" [used only with --threads]"
+msgstr ""
+
+#: ../svnserve/svnserve.c:330
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 64.\n"
+" [used only with --threads]"
+msgstr ""
+
+#: ../svnserve/svnserve.c:339
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 256.\n"
+" [used only with --threads]"
+msgstr ""
+
+#: ../svnserve/svnserve.c:349
msgid ""
"run in foreground (useful for debugging)\n"
" [mode: daemon]"
msgstr ""
-#: ../svnserve/svnserve.c:262
+#: ../svnserve/svnserve.c:353
msgid ""
-"handle one connection at a time in the parent process\n"
-" (useful for debugging)"
+"handle one connection at a time in the parent\n"
+" process (useful for debugging)"
msgstr ""
-#: ../svnserve/svnserve.c:266
+#: ../svnserve/svnserve.c:357
msgid "svnserve log file"
msgstr ""
-#: ../svnserve/svnserve.c:269
+#: ../svnserve/svnserve.c:360
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once, service]"
msgstr ""
-#: ../svnserve/svnserve.c:273
+#: ../svnserve/svnserve.c:364
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once]"
msgstr ""
-#: ../svnserve/svnserve.c:278
+#: ../svnserve/svnserve.c:369
msgid ""
"tunnel username (default is current uid's name)\n"
" [mode: tunnel]"
msgstr ""
-#: ../svnserve/svnserve.c:283
+#: ../svnserve/svnserve.c:374
msgid ""
"virtual host mode (look for repo in directory\n"
" of provided hostname)"
msgstr ""
-#: ../svnserve/svnserve.c:300
+#: ../svnserve/svnserve.c:390
#, c-format
msgid "Type '%s --help' for usage.\n"
msgstr ""
-#: ../svnserve/svnserve.c:310
+#: ../svnserve/svnserve.c:399
msgid ""
"usage: svnserve [-d | -i | -t | -X | --service] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
-#: ../svnserve/svnserve.c:316
+#: ../svnserve/svnserve.c:408
msgid ""
"usage: svnserve [-d | -i | -t | -X] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
-#: ../svnserve/svnserve.c:344
+#: ../svnserve/svnserve.c:438
msgid ""
"\n"
"Cyrus SASL authentication is available.\n"
msgstr ""
-#: ../svnserve/svnserve.c:616
+#: ../svnserve/svnserve.c:524
+#, c-format
+msgid "Can't accept client connection"
+msgstr ""
+
+#: ../svnserve/svnserve.c:796
#, c-format
msgid "Invalid port '%s'"
msgstr ""
-#: ../svnserve/svnserve.c:657
+#: ../svnserve/svnserve.c:832
#, c-format
-msgid "svnserve: Root path '%s' does not exist or is not a directory.\n"
+msgid "Root path '%s' does not exist or is not a directory"
msgstr ""
-#: ../svnserve/svnserve.c:770
+#: ../svnserve/svnserve.c:955
msgid "You must specify exactly one of -d, -i, -t, --service or -X.\n"
msgstr ""
-#: ../svnserve/svnserve.c:773
+#: ../svnserve/svnserve.c:958
msgid "You must specify exactly one of -d, -i, -t or -X.\n"
msgstr ""
-#: ../svnserve/svnserve.c:782
+#: ../svnserve/svnserve.c:969
msgid "You may only specify one of -T or --single-thread\n"
msgstr ""
-#: ../svnserve/svnserve.c:810
-#, c-format
-msgid "Option --tunnel-user is only valid in tunnel mode.\n"
+#: ../svnserve/svnserve.c:1019
+msgid "Option --tunnel-user is only valid in tunnel mode"
msgstr ""
-#: ../svnserve/svnserve.c:829
-#, c-format
-msgid "Can't open stdout"
-msgstr ""
-
-#: ../svnserve/svnserve.c:883
+#: ../svnserve/svnserve.c:1088
#, c-format
msgid ""
"svnserve: The --service flag is only valid if the process is started by the "
"Service Control Manager.\n"
msgstr ""
-#: ../svnserve/svnserve.c:933
+#: ../svnserve/svnserve.c:1139
#, c-format
msgid "Can't get address info"
msgstr ""
-#: ../svnserve/svnserve.c:947
+#: ../svnserve/svnserve.c:1152
#, c-format
msgid "Can't create server socket"
msgstr ""
-#: ../svnserve/svnserve.c:958
+#: ../svnserve/svnserve.c:1160
#, c-format
-msgid "Can't bind server socket"
+msgid "Can't set options on server socket"
msgstr ""
-#: ../svnserve/svnserve.c:1056
+#: ../svnserve/svnserve.c:1166
#, c-format
-msgid "Can't accept client connection"
+msgid "Can't bind server socket"
msgstr ""
-#: ../svnserve/svnserve.c:1137
+#: ../svnserve/svnserve.c:1172
#, c-format
-msgid "Can't create threadattr"
+msgid "Can't listen on server socket"
msgstr ""
-#: ../svnserve/svnserve.c:1145
+#: ../svnserve/svnserve.c:1253
#, c-format
-msgid "Can't set detached state"
+msgid "Can't create thread pool"
msgstr ""
-#: ../svnserve/svnserve.c:1158
+#: ../svnserve/svnserve.c:1316
#, c-format
-msgid "Can't create thread"
+msgid "Can't push task"
msgstr ""
#: ../svnserve/winservice.c:346
@@ -13622,7 +15794,7 @@ msgid ""
"service"
msgstr ""
-#: ../svnsync/svnsync.c:92
+#: ../svnsync/svnsync.c:95
msgid ""
"usage: svnsync initialize DEST_URL SOURCE_URL\n"
"\n"
@@ -13648,7 +15820,7 @@ msgid ""
"mirror of the source repository.\n"
msgstr ""
-#: ../svnsync/svnsync.c:118
+#: ../svnsync/svnsync.c:121
msgid ""
"usage: svnsync synchronize DEST_URL [SOURCE_URL]\n"
"\n"
@@ -13662,7 +15834,7 @@ msgid ""
"DEST_URL repository.\n"
msgstr ""
-#: ../svnsync/svnsync.c:131
+#: ../svnsync/svnsync.c:134
msgid ""
"usage:\n"
"\n"
@@ -13684,7 +15856,7 @@ msgid ""
"Form 2 is deprecated syntax, equivalent to specifying \"-rREV[:REV2]\".\n"
msgstr ""
-#: ../svnsync/svnsync.c:152
+#: ../svnsync/svnsync.c:155
msgid ""
"usage: svnsync info DEST_URL\n"
"\n"
@@ -13692,18 +15864,18 @@ msgid ""
"located at DEST_URL.\n"
msgstr ""
-#: ../svnsync/svnsync.c:158
+#: ../svnsync/svnsync.c:161
msgid ""
"usage: svnsync help [SUBCOMMAND...]\n"
"\n"
"Describe the usage of this program or its subcommands.\n"
msgstr ""
-#: ../svnsync/svnsync.c:168
+#: ../svnsync/svnsync.c:171
msgid "print as little as possible"
msgstr ""
-#: ../svnsync/svnsync.c:170
+#: ../svnsync/svnsync.c:173
msgid ""
"operate on revision ARG (or range ARG1:ARG2)\n"
" A revision argument can be one of:\n"
@@ -13711,39 +15883,67 @@ msgid ""
" 'HEAD' latest in repository"
msgstr ""
-#: ../svnsync/svnsync.c:178
+#: ../svnsync/svnsync.c:181
msgid "allow a non-empty destination repository"
msgstr ""
-#: ../svnsync/svnsync.c:190
+#: ../svnsync/svnsync.c:193
msgid ""
"specify a username ARG (deprecated;\n"
" see --source-username and --sync-username)"
msgstr ""
-#: ../svnsync/svnsync.c:194
+#: ../svnsync/svnsync.c:197
msgid ""
"specify a password ARG (deprecated;\n"
" see --source-password and --sync-password)"
msgstr ""
-#: ../svnsync/svnsync.c:204
+#: ../svnsync/svnsync.c:201
+msgid ""
+"deprecated; same as\n"
+" --source-trust-server-cert-failures=unknown-ca\n"
+" --sync-trust-server-cert-failures=unknown-ca"
+msgstr ""
+
+#: ../svnsync/svnsync.c:207
+msgid ""
+"with --non-interactive, accept SSL\n"
+" server certificates with failures.\n"
+" ARG is a comma-separated list of:\n"
+" - 'unknown-ca' (Unknown Authority)\n"
+" - 'cn-mismatch' (Hostname mismatch)\n"
+" - 'expired' (Expired certificate)\n"
+" - 'not-yet-valid' (Not yet valid certificate)\n"
+" - 'other' (all other not separately classified\n"
+" certificate errors).\n"
+" Applied to the source URL."
+msgstr ""
+
+#: ../svnsync/svnsync.c:227
+msgid ""
+"Like\n"
+" --source-trust-server-cert-failures,\n"
+" but applied to the destination URL."
+msgstr ""
+
+#: ../svnsync/svnsync.c:233
msgid "connect to source repository with username ARG"
msgstr ""
-#: ../svnsync/svnsync.c:206
+#: ../svnsync/svnsync.c:235
msgid "connect to source repository with password ARG"
msgstr ""
-#: ../svnsync/svnsync.c:208
+#: ../svnsync/svnsync.c:237
msgid "connect to sync repository with username ARG"
msgstr ""
-#: ../svnsync/svnsync.c:210
+#: ../svnsync/svnsync.c:239
msgid "connect to sync repository with password ARG"
msgstr ""
-#: ../svnsync/svnsync.c:222
+#: ../svnsync/svnsync.c:251
msgid ""
"convert translatable properties from encoding ARG\n"
" to UTF-8. If not specified, then properties "
@@ -13751,7 +15951,7 @@ msgid ""
" presumed to be encoded in UTF-8."
msgstr ""
-#: ../svnsync/svnsync.c:228
+#: ../svnsync/svnsync.c:257
msgid ""
"Disable built-in locking. Use of this option can\n"
" corrupt the mirror unless you ensure that no "
@@ -13759,7 +15959,7 @@ msgid ""
" instance of svnsync is running concurrently."
msgstr ""
-#: ../svnsync/svnsync.c:234
+#: ../svnsync/svnsync.c:263
msgid ""
"Steal locks as necessary. Use, with caution,\n"
" if your mirror repository contains stale locks\n"
@@ -13768,77 +15968,83 @@ msgid ""
" svnsync instance."
msgstr ""
-#: ../svnsync/svnsync.c:357
+#: ../svnsync/svnsync.c:271
+msgid ""
+"size of the extra in-memory cache in MB used to\n"
+" minimize operations for local 'file' scheme.\n"
+msgstr ""
+
+#: ../svnsync/svnsync.c:396
msgid ""
"Target server does not support atomic revision property edits; consider "
"upgrading it to 1.7 or using an external locking program"
msgstr ""
-#: ../svnsync/svnsync.c:371
+#: ../svnsync/svnsync.c:410
#, c-format
msgid "Stole lock previously held by '%s'\n"
msgstr ""
-#: ../svnsync/svnsync.c:460
+#: ../svnsync/svnsync.c:499
#, c-format
msgid "Session is rooted at '%s' but the repos root is '%s'"
msgstr ""
-#: ../svnsync/svnsync.c:602
+#: ../svnsync/svnsync.c:641
#, c-format
msgid "Copied properties for revision %ld (%s* properties skipped).\n"
msgstr ""
-#: ../svnsync/svnsync.c:607
+#: ../svnsync/svnsync.c:646
#, c-format
msgid "Copied properties for revision %ld.\n"
msgstr ""
-#: ../svnsync/svnsync.c:623
+#: ../svnsync/svnsync.c:662
#, c-format
msgid ""
"NOTE: Normalized %s* properties to LF line endings (%d rev-props, %d node-"
"props).\n"
msgstr ""
-#: ../svnsync/svnsync.c:753
+#: ../svnsync/svnsync.c:794
msgid ""
"Destination repository already contains revision history; consider using --"
"allow-non-empty if the repository's revisions are known to mirror their "
"respective revisions in the source repository"
msgstr ""
-#: ../svnsync/svnsync.c:762
+#: ../svnsync/svnsync.c:803
#, c-format
msgid "Destination repository is already synchronizing from '%s'"
msgstr ""
-#: ../svnsync/svnsync.c:797
+#: ../svnsync/svnsync.c:838
msgid "Destination repository has more revisions than source repository"
msgstr ""
-#: ../svnsync/svnsync.c:862 ../svnsync/svnsync.c:865 ../svnsync/svnsync.c:1518
-#: ../svnsync/svnsync.c:1525 ../svnsync/svnsync.c:1762
-#: ../svnsync/svnsync.c:1765 ../svnsync/svnsync.c:1809
+#: ../svnsync/svnsync.c:903 ../svnsync/svnsync.c:906 ../svnsync/svnsync.c:1578
+#: ../svnsync/svnsync.c:1585 ../svnsync/svnsync.c:1824
+#: ../svnsync/svnsync.c:1827 ../svnsync/svnsync.c:1871
#, c-format
msgid "Path '%s' is not a URL"
msgstr ""
-#: ../svnsync/svnsync.c:892
+#: ../svnsync/svnsync.c:933
#, c-format
msgid "Committed revision %ld.\n"
msgstr ""
-#: ../svnsync/svnsync.c:935
+#: ../svnsync/svnsync.c:976
msgid "Destination repository has not been initialized"
msgstr ""
-#: ../svnsync/svnsync.c:1301
+#: ../svnsync/svnsync.c:1351
#, c-format
msgid "Commit created r%ld but should have created r%ld"
msgstr ""
-#: ../svnsync/svnsync.c:1416
+#: ../svnsync/svnsync.c:1471
#, c-format
msgid ""
"Revision being currently copied (%ld), last merged revision (%ld), and "
@@ -13846,83 +16052,90 @@ msgid ""
"destination without using svnsync?"
msgstr ""
-#: ../svnsync/svnsync.c:1453
+#: ../svnsync/svnsync.c:1508
#, c-format
msgid ""
"Destination HEAD (%ld) is not the last merged revision (%ld); have you "
"committed to the destination without using svnsync?"
msgstr ""
-#: ../svnsync/svnsync.c:1576 ../svnsync/svnsync.c:1581
+#: ../svnsync/svnsync.c:1638 ../svnsync/svnsync.c:1643
#, c-format
msgid ""
"Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
msgstr ""
-#: ../svnsync/svnsync.c:1645 ../svnsync/svnsync.c:1665
+#: ../svnsync/svnsync.c:1707 ../svnsync/svnsync.c:1727
#, c-format
msgid "Invalid revision number (%ld)"
msgstr ""
-#: ../svnsync/svnsync.c:1715
+#: ../svnsync/svnsync.c:1777
msgid ""
"Cannot specify revisions via both command-line arguments and the --revision "
"(-r) option"
msgstr ""
-#: ../svnsync/svnsync.c:1723 ../svnsync/svnsync.c:2066
+#: ../svnsync/svnsync.c:1785 ../svnsync/svnsync.c:2137
#, c-format
msgid "Invalid revision range '%s' provided"
msgstr ""
-#: ../svnsync/svnsync.c:1822
+#: ../svnsync/svnsync.c:1884
#, c-format
msgid "Repository '%s' is not initialized for synchronization"
msgstr ""
#. Print the info.
-#: ../svnsync/svnsync.c:1828
+#: ../svnsync/svnsync.c:1890
#, c-format
msgid "Source URL: %s\n"
msgstr ""
-#: ../svnsync/svnsync.c:1830
+#: ../svnsync/svnsync.c:1892
#, c-format
msgid "Source Repository UUID: %s\n"
msgstr ""
-#: ../svnsync/svnsync.c:1833
+#: ../svnsync/svnsync.c:1895
#, c-format
msgid "Last Merged Revision: %s\n"
msgstr ""
-#: ../svnsync/svnsync.c:1850
+#: ../svnsync/svnsync.c:1912
msgid ""
"general usage: svnsync SUBCOMMAND DEST_URL [ARGS & OPTIONS ...]\n"
+"Subversion repository replication tool.\n"
"Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnsync --version' to see the program version and RA modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
-#: ../svnsync/svnsync.c:2114
+#: ../svnsync/svnsync.c:2199
msgid ""
"Cannot use --username or --password with any of --source-username, --source-"
"password, --sync-username, or --sync-password.\n"
msgstr ""
-#: ../svnsync/svnsync.c:2138
+#: ../svnsync/svnsync.c:2222
msgid "--disable-locking and --steal-lock are mutually exclusive"
msgstr ""
-#: ../svnsync/svnsync.c:2214
+#: ../svnsync/svnsync.c:2240
+msgid ""
+"--source-trust-server-cert-failures and --sync-trust-server-cert-failures "
+"require --non-interactive"
+msgstr ""
+
+#: ../svnsync/svnsync.c:2306
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnsync help %s' for usage.\n"
msgstr ""
-#: ../svnsync/svnsync.c:2297
+#: ../svnsync/svnsync.c:2396
msgid "Try 'svnsync help' for more info"
msgstr ""
@@ -13931,15 +16144,17 @@ msgstr ""
msgid "Missing colon in svn:mergeinfo property"
msgstr ""
-#: ../svnversion/svnversion.c:50
+#: ../svnversion/svnversion.c:49
#, c-format
msgid "Type 'svnversion --help' for usage.\n"
msgstr ""
-#: ../svnversion/svnversion.c:61
+#: ../svnversion/svnversion.c:59
#, c-format
msgid ""
"usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n"
+"Subversion working copy identification tool.\n"
+"Type 'svnversion --version' to see the program version.\n"
"\n"
" Produce a compact version identifier for the working copy path\n"
" WC_PATH. TRAIL_URL is the trailing portion of the URL used to\n"
@@ -13971,41 +16186,37 @@ msgid ""
"Valid options:\n"
msgstr ""
-#: ../svnversion/svnversion.c:137
-msgid "do not output the trailing newline"
-msgstr ""
-
-#: ../svnversion/svnversion.c:138
+#: ../svnversion/svnversion.c:141
msgid "last changed rather than current revisions"
msgstr ""
-#: ../svnversion/svnversion.c:246
+#: ../svnversion/svnversion.c:241
#, c-format
msgid "Unversioned symlink%s"
msgstr ""
-#: ../svnversion/svnversion.c:249
+#: ../svnversion/svnversion.c:244
#, c-format
msgid "Unversioned directory%s"
msgstr ""
-#: ../svnversion/svnversion.c:252
+#: ../svnversion/svnversion.c:247
#, c-format
msgid "Unversioned file%s"
msgstr ""
-#: ../svnversion/svnversion.c:258
+#: ../svnversion/svnversion.c:253
#, c-format
msgid "'%s' doesn't exist\n"
msgstr ""
-#: ../svnversion/svnversion.c:259
+#: ../svnversion/svnversion.c:254
#, c-format
msgid "'%s' is of unknown type\n"
msgstr ""
#. Local uncommitted modifications, no revision info was found.
-#: ../svnversion/svnversion.c:274
+#: ../svnversion/svnversion.c:268
#, c-format
msgid "Uncommitted local addition, copy or move%s"
msgstr ""
diff --git a/subversion/po/sv.po b/subversion/po/sv.po
index 04a2126..d44e588 100644
--- a/subversion/po/sv.po
+++ b/subversion/po/sv.po
@@ -108,10 +108,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
-"POT-Creation-Date: 2013-10-19 21:47+0200\n"
-"PO-Revision-Date: 2013-10-19 22:28+0200\n"
+"POT-Creation-Date: 2013-07-19 18:01+0200\n"
+"PO-Revision-Date: 2013-05-04 12:03+0200\n"
"Last-Translator: Subversion Developers <dev@subversion.apache.org>\n"
"Language-Team: Swedish <dev@subversion.apache.org>\n"
"Language: sv\n"
@@ -219,7 +219,7 @@ msgstr "Felaktigt datum"
#: ../include/svn_error_codes.h:180
msgid "Bogus mime-type"
-msgstr "Felaktig mime-typ"
+msgstr "Felaktig MIME-typ"
#: ../include/svn_error_codes.h:190
msgid "Wrong or unexpected property value"
@@ -237,7 +237,7 @@ msgstr "Sökvägen står inte omedelbart under angiven katalog"
msgid "Bogus UUID"
msgstr "Felaktig UUID"
-#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:944
+#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:959
msgid "Invalid configuration value"
msgstr "Ogiltigt konfigurationsvärde"
@@ -265,1073 +265,1098 @@ msgstr "Ogiltig namn på ändringslista"
msgid "Invalid atomic"
msgstr "Ogiltig odelbar operation"
-#: ../include/svn_error_codes.h:240
+#: ../include/svn_error_codes.h:239
+#, fuzzy
+msgid "Invalid compression method"
+msgstr "Ogiltig fixerad revision %ld"
+
+#: ../include/svn_error_codes.h:245
msgid "No such XML tag attribute"
msgstr "XML-attribut saknas"
-#: ../include/svn_error_codes.h:244
+#: ../include/svn_error_codes.h:249
msgid "<delta-pkg> is missing ancestry"
msgstr "<delta-pkg> saknar ursprung"
-#: ../include/svn_error_codes.h:248
+#: ../include/svn_error_codes.h:253
msgid "Unrecognized binary data encoding; can't decode"
msgstr "Okänd kodning av binärdata; kan inte avkoda"
-#: ../include/svn_error_codes.h:252
+#: ../include/svn_error_codes.h:257
msgid "XML data was not well-formed"
msgstr "XML var inte välformad"
-#: ../include/svn_error_codes.h:256
+#: ../include/svn_error_codes.h:261
msgid "Data cannot be safely XML-escaped"
msgstr "Data kan inte skyddas för lagring som XML"
-#: ../include/svn_error_codes.h:262
+#: ../include/svn_error_codes.h:266
+#, fuzzy
+msgid "Unexpected XML element found"
+msgstr "Oväntad nodtyp funnen"
+
+#: ../include/svn_error_codes.h:272
msgid "Inconsistent line ending style"
msgstr "Inkonsekventa radslutstecken"
-#: ../include/svn_error_codes.h:266
+#: ../include/svn_error_codes.h:276
msgid "Unrecognized line ending style"
msgstr "Okänt sätt att markera radslut"
-#: ../include/svn_error_codes.h:271
+#: ../include/svn_error_codes.h:281
msgid "Line endings other than expected"
msgstr "Andra radslutstecken än väntat"
-#: ../include/svn_error_codes.h:275
+#: ../include/svn_error_codes.h:285
msgid "Ran out of unique names"
msgstr "Kunde inte generera fler unika namn"
-#: ../include/svn_error_codes.h:280
+#: ../include/svn_error_codes.h:290
msgid "Framing error in pipe protocol"
msgstr "Ramfel i rörprotokoll"
-#: ../include/svn_error_codes.h:285
+#: ../include/svn_error_codes.h:295
msgid "Read error in pipe"
msgstr "Läsfel i rör"
-#: ../include/svn_error_codes.h:289 ../libsvn_subr/cmdline.c:362
-#: ../libsvn_subr/cmdline.c:385 ../svn/util.c:569 ../svnlook/svnlook.c:2009
+#: ../include/svn_error_codes.h:299 ../libsvn_subr/cmdline.c:362
+#: ../libsvn_subr/cmdline.c:385 ../svn/util.c:564 ../svnlook/svnlook.c:2008
#, c-format
msgid "Write error"
msgstr "Fel vid skrivning"
-#: ../include/svn_error_codes.h:294
+#: ../include/svn_error_codes.h:304
msgid "Write error in pipe"
msgstr "Skrivfel i rör"
-#: ../include/svn_error_codes.h:300
+#: ../include/svn_error_codes.h:310
msgid "Unexpected EOF on stream"
msgstr "Oväntat filslut i ström"
-#: ../include/svn_error_codes.h:304
+#: ../include/svn_error_codes.h:314
msgid "Malformed stream data"
msgstr "Felaktig data i ström"
-#: ../include/svn_error_codes.h:308
+#: ../include/svn_error_codes.h:318
msgid "Unrecognized stream data"
msgstr "Okänd data i ström"
-#: ../include/svn_error_codes.h:313
+#: ../include/svn_error_codes.h:323
msgid "Stream doesn't support seeking"
msgstr "Strömmen stöder ej positionering"
-#: ../include/svn_error_codes.h:319
+#: ../include/svn_error_codes.h:329
msgid "Unknown svn_node_kind"
msgstr "Okänd svn_node_kind"
-#: ../include/svn_error_codes.h:323
+#: ../include/svn_error_codes.h:333
msgid "Unexpected node kind found"
msgstr "Oväntad nodtyp funnen"
-#: ../include/svn_error_codes.h:329
+#: ../include/svn_error_codes.h:339
msgid "Can't find an entry"
msgstr "Kan inte hitta post"
-#: ../include/svn_error_codes.h:335
+#: ../include/svn_error_codes.h:345
msgid "Entry already exists"
msgstr "Posten finns redan"
-#: ../include/svn_error_codes.h:339
+#: ../include/svn_error_codes.h:349
msgid "Entry has no revision"
msgstr "Posten saknar revision"
-#: ../include/svn_error_codes.h:343
+#: ../include/svn_error_codes.h:353
msgid "Entry has no URL"
msgstr "Posten saknar URL"
-#: ../include/svn_error_codes.h:347
+#: ../include/svn_error_codes.h:357
msgid "Entry has an invalid attribute"
msgstr "Ogiltigt attribut i post"
-#: ../include/svn_error_codes.h:351
+#: ../include/svn_error_codes.h:361
msgid "Can't create an entry for a forbidden name"
msgstr "Kan inte skapa post för otillåtet namn"
-#: ../include/svn_error_codes.h:357
+#: ../include/svn_error_codes.h:367
msgid "Obstructed update"
msgstr "Blockerad uppdatering"
-#: ../include/svn_error_codes.h:362
+#: ../include/svn_error_codes.h:372
msgid "Mismatch popping the WC unwind stack"
msgstr "Fel vid upprullning av arbetskopiestacken"
-#: ../include/svn_error_codes.h:367
+#: ../include/svn_error_codes.h:377
msgid "Attempt to pop empty WC unwind stack"
msgstr "Försök att rulla upp tom arbetskopiestack"
-#: ../include/svn_error_codes.h:372
+#: ../include/svn_error_codes.h:382
msgid "Attempt to unlock with non-empty unwind stack"
msgstr "Försök att låsa upp icke-tom upprullningsstack"
-#: ../include/svn_error_codes.h:376
+#: ../include/svn_error_codes.h:386
msgid "Attempted to lock an already-locked dir"
msgstr "Försök att låsa en katalog som redan var låst"
-#: ../include/svn_error_codes.h:380
+#: ../include/svn_error_codes.h:390
msgid "Working copy not locked; this is probably a bug, please report"
msgstr "Arbetskopian är inte låst; detta är troligen ett programfel, vänligen rapportera det"
-#: ../include/svn_error_codes.h:385
+#: ../include/svn_error_codes.h:395
msgid "Invalid lock"
msgstr "Ogiltigt lås"
-#: ../include/svn_error_codes.h:391 ../include/svn_error_codes.h:397
+#: ../include/svn_error_codes.h:401 ../include/svn_error_codes.h:407
msgid "Path is not a working copy directory"
msgstr "Sökvägen är ingen katalog i en arbetskopia"
-#: ../include/svn_error_codes.h:401
+#: ../include/svn_error_codes.h:411
msgid "Path is not a working copy file"
msgstr "Sökväg är inte en fil i en arbetskopia"
-#: ../include/svn_error_codes.h:405
+#: ../include/svn_error_codes.h:415
msgid "Problem running log"
msgstr "Problem vid körning av logg"
-#: ../include/svn_error_codes.h:409
+#: ../include/svn_error_codes.h:419
msgid "Can't find a working copy path"
msgstr "Kan inte hitta sökväg till arbetskopia"
-#: ../include/svn_error_codes.h:413
+#: ../include/svn_error_codes.h:423
msgid "Working copy is not up-to-date"
msgstr "Arbetskopian är inaktuell"
-#: ../include/svn_error_codes.h:417
+#: ../include/svn_error_codes.h:427
msgid "Left locally modified or unversioned files"
msgstr "Lämnade kvar lokalt ändrade eller icke versionshanterade filer"
-#: ../include/svn_error_codes.h:421
+#: ../include/svn_error_codes.h:431
msgid "Unmergeable scheduling requested on an entry"
msgstr "Schemaläggning som ej kan slås samman begärd på post"
-#: ../include/svn_error_codes.h:425
+#: ../include/svn_error_codes.h:435
msgid "Found a working copy path"
msgstr "Hittade sökväg till arbetskopia"
-#: ../include/svn_error_codes.h:429
+#: ../include/svn_error_codes.h:439
msgid "A conflict in the working copy obstructs the current operation"
msgstr "En konflikt i arbetskopian blockerar operationen"
-#: ../include/svn_error_codes.h:433
+#: ../include/svn_error_codes.h:443
msgid "Working copy is corrupt"
msgstr "Förstörd arbetskopia"
-#: ../include/svn_error_codes.h:437
+#: ../include/svn_error_codes.h:447
msgid "Working copy text base is corrupt"
msgstr "Förstörd textbas i arbetskopia"
-#: ../include/svn_error_codes.h:441
+#: ../include/svn_error_codes.h:451
msgid "Cannot change node kind"
msgstr "Kan inte ändra nodtyp"
-#: ../include/svn_error_codes.h:445
+#: ../include/svn_error_codes.h:455
msgid "Invalid operation on the current working directory"
msgstr "Ogiltig operation på aktuell katalog"
-#: ../include/svn_error_codes.h:449
+#: ../include/svn_error_codes.h:459
msgid "Problem on first log entry in a working copy"
msgstr "Problem med första loggposten i arbetskopia"
-#: ../include/svn_error_codes.h:453
+#: ../include/svn_error_codes.h:463
msgid "Unsupported working copy format"
msgstr "Formatet på arbetskopian stöds ej"
-#: ../include/svn_error_codes.h:457
+#: ../include/svn_error_codes.h:467
msgid "Path syntax not supported in this context"
msgstr "Sökvägssyntax stöds ej i detta sammanhang"
-#: ../include/svn_error_codes.h:462
+#: ../include/svn_error_codes.h:472
msgid "Invalid schedule"
msgstr "Ogiltig schemaläggning"
-#: ../include/svn_error_codes.h:467
+#: ../include/svn_error_codes.h:477
msgid "Invalid relocation"
msgstr "Ogiltig omlokalisering"
-#: ../include/svn_error_codes.h:472
+#: ../include/svn_error_codes.h:482
msgid "Invalid switch"
msgstr "Ogiltig flagga"
-#: ../include/svn_error_codes.h:477
+#: ../include/svn_error_codes.h:487
msgid "Changelist doesn't match"
msgstr "Ändringslistan stämmer inte"
-#: ../include/svn_error_codes.h:482
+#: ../include/svn_error_codes.h:492
msgid "Conflict resolution failed"
msgstr "Konfliktlösningen misslyckades"
-#: ../include/svn_error_codes.h:486
+#: ../include/svn_error_codes.h:496
msgid "Failed to locate 'copyfrom' path in working copy"
msgstr "Hittade inte \"copyfrom\"-sökvägen i arbetskopian"
-#: ../include/svn_error_codes.h:494
+#: ../include/svn_error_codes.h:504
msgid "Moving a path from one changelist to another"
msgstr "Flyttar en sökväg från en ändringslista till en annan"
-#: ../include/svn_error_codes.h:499
+#: ../include/svn_error_codes.h:509
msgid "Cannot delete a file external"
msgstr "Kan inte radera en extern fil"
-#: ../include/svn_error_codes.h:504
+#: ../include/svn_error_codes.h:514
msgid "Cannot move a file external"
msgstr "Kan inte flytta en extern fil"
-#: ../include/svn_error_codes.h:509
+#: ../include/svn_error_codes.h:519
msgid "Something's amiss with the wc sqlite database"
msgstr "Något är på tok med arbetskopians sqlite-databas"
-#: ../include/svn_error_codes.h:514
+#: ../include/svn_error_codes.h:524
msgid "The working copy is missing"
msgstr "Arbetskopian saknas"
-#: ../include/svn_error_codes.h:519
+#: ../include/svn_error_codes.h:529
msgid "The specified node is not a symlink"
msgstr "Angiven nod är ej en länk"
-#: ../include/svn_error_codes.h:524
+#: ../include/svn_error_codes.h:534
msgid "The specified path has an unexpected status"
msgstr "Den angivna sökvägen befinner sig i ett oväntat tillstånd"
-#: ../include/svn_error_codes.h:529
+#: ../include/svn_error_codes.h:539
msgid "The working copy needs to be upgraded"
msgstr "Arbetskopian måste uppgraderas"
-#: ../include/svn_error_codes.h:534
+#: ../include/svn_error_codes.h:544
msgid "Previous operation has not finished; run 'cleanup' if it was interrupted"
msgstr "En tidigare handling är inte färdig; kör \"cleanup\" om den avbröts"
-#: ../include/svn_error_codes.h:540
+#: ../include/svn_error_codes.h:550
msgid "The operation cannot be performed with the specified depth"
msgstr "Handlingen kan inte utföras med det angivna djupet"
-#: ../include/svn_error_codes.h:545
+#: ../include/svn_error_codes.h:555
msgid "Couldn't open a working copy file because access was denied"
msgstr "Kunde inte öppna en fil i arbetskopian eftersom åtkomst nekades"
-#: ../include/svn_error_codes.h:550
+#: ../include/svn_error_codes.h:560
msgid "Mixed-revision working copy was found but not expected"
msgstr "Arbetskopia med blandad revision hittades men väntades ej"
-#: ../include/svn_error_codes.h:555
+#: ../include/svn_error_codes.h:565
msgid "Duplicate targets in svn:externals property"
msgstr "Dubblettmål i svn:externals-egenskap"
-#: ../include/svn_error_codes.h:561
+#: ../include/svn_error_codes.h:571
msgid "General filesystem error"
msgstr "Allmänt filsystemsfel"
-#: ../include/svn_error_codes.h:565
+#: ../include/svn_error_codes.h:575
msgid "Error closing filesystem"
msgstr "Fel vid stängning av filsystem"
-#: ../include/svn_error_codes.h:569
+#: ../include/svn_error_codes.h:579
msgid "Filesystem is already open"
msgstr "Filsystemet är redan öppet"
-#: ../include/svn_error_codes.h:573
+#: ../include/svn_error_codes.h:583
msgid "Filesystem is not open"
msgstr "Filsystemet är ej öppet"
-#: ../include/svn_error_codes.h:577
+#: ../include/svn_error_codes.h:587
msgid "Filesystem is corrupt"
msgstr "Förstört filsystem"
-#: ../include/svn_error_codes.h:581
+#: ../include/svn_error_codes.h:591
msgid "Invalid filesystem path syntax"
msgstr "Ogiltig syntax för sökväg i filsystem"
-#: ../include/svn_error_codes.h:585
+#: ../include/svn_error_codes.h:595
msgid "Invalid filesystem revision number"
msgstr "Ogiltigt revisionsnummer för filsystem"
-#: ../include/svn_error_codes.h:589
+#: ../include/svn_error_codes.h:599
msgid "Invalid filesystem transaction name"
msgstr "Ogiltigt transaktionsnamn för filsystem"
-#: ../include/svn_error_codes.h:593
+#: ../include/svn_error_codes.h:603
msgid "Filesystem directory has no such entry"
msgstr "Katalog i filsystem saknar post med det namnet"
-#: ../include/svn_error_codes.h:597
+#: ../include/svn_error_codes.h:607
msgid "Filesystem has no such representation"
msgstr "Representation saknas i filsystem"
-#: ../include/svn_error_codes.h:601
+#: ../include/svn_error_codes.h:611
msgid "Filesystem has no such string"
msgstr "Sträng saknas i filsystem"
-#: ../include/svn_error_codes.h:605
+#: ../include/svn_error_codes.h:615
msgid "Filesystem has no such copy"
msgstr "Kopia saknas i filsystem"
-#: ../include/svn_error_codes.h:609
+#: ../include/svn_error_codes.h:619
msgid "The specified transaction is not mutable"
msgstr "Angiven transaktion går ej att ändra"
-#: ../include/svn_error_codes.h:613
+#: ../include/svn_error_codes.h:623
msgid "Filesystem has no item"
msgstr "Filsystem saknar objekt"
-#: ../include/svn_error_codes.h:617
+#: ../include/svn_error_codes.h:627
msgid "Filesystem has no such node-rev-id"
msgstr "node-rev-id saknas i filsystem"
-#: ../include/svn_error_codes.h:621
+#: ../include/svn_error_codes.h:631
msgid "String does not represent a node or node-rev-id"
msgstr "Strängen representerar ingen nod eller node-rev-id"
-#: ../include/svn_error_codes.h:625
+#: ../include/svn_error_codes.h:635
msgid "Name does not refer to a filesystem directory"
msgstr "Namnet refererar ej till en katalog i filsystemet"
-#: ../include/svn_error_codes.h:629
+#: ../include/svn_error_codes.h:639
msgid "Name does not refer to a filesystem file"
msgstr "Namnet refererar ej till en fil i filsystemet"
-#: ../include/svn_error_codes.h:633
+#: ../include/svn_error_codes.h:643
msgid "Name is not a single path component"
msgstr "Namnet är ej en ensam sökvägskomponent"
-#: ../include/svn_error_codes.h:637
+#: ../include/svn_error_codes.h:647
msgid "Attempt to change immutable filesystem node"
msgstr "Försök att ändra filsystemsnod som ej får ändras"
-#: ../include/svn_error_codes.h:641
+#: ../include/svn_error_codes.h:651
msgid "Item already exists in filesystem"
msgstr "Objektet finns redan i filsystemet"
-#: ../include/svn_error_codes.h:645
+#: ../include/svn_error_codes.h:655
msgid "Attempt to remove or recreate fs root dir"
msgstr "Försök att ta bort eller omskapa filsystemets rotkatalog"
-#: ../include/svn_error_codes.h:649
+#: ../include/svn_error_codes.h:659
msgid "Object is not a transaction root"
msgstr "Objektet är ingen transaktionsrot"
-#: ../include/svn_error_codes.h:653
+#: ../include/svn_error_codes.h:663
msgid "Object is not a revision root"
msgstr "Objektet är ingen revisionsrot"
-#: ../include/svn_error_codes.h:657
+#: ../include/svn_error_codes.h:667
msgid "Merge conflict during commit"
msgstr "Sammanslagningskonflikt vid arkivering"
-#: ../include/svn_error_codes.h:661
+#: ../include/svn_error_codes.h:671
msgid "A representation vanished or changed between reads"
msgstr "Representation försvann eller ändrades mellan läsningar"
-#: ../include/svn_error_codes.h:665
+#: ../include/svn_error_codes.h:675
msgid "Tried to change an immutable representation"
msgstr "Försök att ändra representation som ej får ändras"
-#: ../include/svn_error_codes.h:669
+#: ../include/svn_error_codes.h:679
msgid "Malformed skeleton data"
msgstr "Felaktig skelettdata"
-#: ../include/svn_error_codes.h:673
+#: ../include/svn_error_codes.h:683
msgid "Transaction is out of date"
msgstr "Transaktionen är inaktuell"
-#: ../include/svn_error_codes.h:677
+#: ../include/svn_error_codes.h:687
msgid "Berkeley DB error"
msgstr "Fel i Berkeley DB"
-#: ../include/svn_error_codes.h:681
+#: ../include/svn_error_codes.h:691
msgid "Berkeley DB deadlock error"
msgstr "Berkeley DB i baklås"
-#: ../include/svn_error_codes.h:685
+#: ../include/svn_error_codes.h:695
msgid "Transaction is dead"
msgstr "Transaktionen är död"
-#: ../include/svn_error_codes.h:689
+#: ../include/svn_error_codes.h:699
msgid "Transaction is not dead"
msgstr "Transaktionen är inte död"
-#: ../include/svn_error_codes.h:694
+#: ../include/svn_error_codes.h:704
msgid "Unknown FS type"
msgstr "Okänd filsystemstyp"
-#: ../include/svn_error_codes.h:699
+#: ../include/svn_error_codes.h:709
msgid "No user associated with filesystem"
msgstr "Ingen användare kopplad till filsystemet"
-#: ../include/svn_error_codes.h:704
+#: ../include/svn_error_codes.h:714
msgid "Path is already locked"
msgstr "Sökvägen är redan låst"
-#: ../include/svn_error_codes.h:709 ../include/svn_error_codes.h:886
+#: ../include/svn_error_codes.h:719 ../include/svn_error_codes.h:901
msgid "Path is not locked"
msgstr "Sökvägen är inte låst"
-#: ../include/svn_error_codes.h:714
+#: ../include/svn_error_codes.h:724
msgid "Lock token is incorrect"
msgstr "Låsidentifieraren är felaktig"
-#: ../include/svn_error_codes.h:719
+#: ../include/svn_error_codes.h:729
msgid "No lock token provided"
msgstr "Ingen låsidentifierare tillhandahölls"
-#: ../include/svn_error_codes.h:724
+#: ../include/svn_error_codes.h:734
msgid "Username does not match lock owner"
msgstr "Användarnamnet matchar inte låsägaren"
-#: ../include/svn_error_codes.h:729
+#: ../include/svn_error_codes.h:739
msgid "Filesystem has no such lock"
msgstr "LÃ¥set saknas i filsystemet"
-#: ../include/svn_error_codes.h:734
+#: ../include/svn_error_codes.h:744
msgid "Lock has expired"
msgstr "Låset har gått ut"
-#: ../include/svn_error_codes.h:739 ../include/svn_error_codes.h:873
+#: ../include/svn_error_codes.h:749 ../include/svn_error_codes.h:888
msgid "Item is out of date"
msgstr "Objektet är inaktuellt"
-#: ../include/svn_error_codes.h:751
+#: ../include/svn_error_codes.h:761
msgid "Unsupported FS format"
msgstr "Formatet på filsystemet stöds ej"
-#: ../include/svn_error_codes.h:756
+#: ../include/svn_error_codes.h:766
msgid "Representation is being written"
msgstr "Representationen håller på att skrivas"
-#: ../include/svn_error_codes.h:761
+#: ../include/svn_error_codes.h:771
msgid "The generated transaction name is too long"
msgstr "Det genererade transaktionsnamnet är för långt"
-#: ../include/svn_error_codes.h:766
+#: ../include/svn_error_codes.h:776
msgid "Filesystem has no such node origin record"
msgstr "Filsystemet saknar en sådan nodursprungspost"
-#: ../include/svn_error_codes.h:771
+#: ../include/svn_error_codes.h:781
msgid "Filesystem upgrade is not supported"
msgstr "Filsystemsuppgradering stöds ej"
-#: ../include/svn_error_codes.h:776
+#: ../include/svn_error_codes.h:786
msgid "Filesystem has no such checksum-representation index record"
msgstr "Indexpost för kontrollsummerepresentation saknas i filsystem"
-#: ../include/svn_error_codes.h:781
+#: ../include/svn_error_codes.h:791
msgid "Property value in filesystem differs from the provided base value"
msgstr "Egenskapsvärde i filsystem skiljer sig från givet basvärde"
-#: ../include/svn_error_codes.h:787
+#: ../include/svn_error_codes.h:797
msgid "The filesystem editor completion process was not followed"
msgstr "Filsystemseditorns avslutningsprocess följdes inte"
-#: ../include/svn_error_codes.h:792
+#: ../include/svn_error_codes.h:802
msgid "A packed revprop could not be read"
msgstr "En packad revisionsegenskap kunde inte läsas"
-#: ../include/svn_error_codes.h:797
+#: ../include/svn_error_codes.h:807
msgid "Could not initialize the revprop caching infrastructure."
msgstr "Kunde inte initiera infrastrukturen för cachning av revisionsegenskaper"
-#: ../include/svn_error_codes.h:803
+#: ../include/svn_error_codes.h:813
msgid "The repository is locked, perhaps for db recovery"
msgstr "Arkivet är låst, kanske för reparation"
-#: ../include/svn_error_codes.h:807
+#: ../include/svn_error_codes.h:817
msgid "A repository hook failed"
msgstr "Ett krokskript i arkivet misslyckades"
-#: ../include/svn_error_codes.h:811
+#: ../include/svn_error_codes.h:821
msgid "Incorrect arguments supplied"
msgstr "Felaktiga argument"
-#: ../include/svn_error_codes.h:815
+#: ../include/svn_error_codes.h:825
msgid "A report cannot be generated because no data was supplied"
msgstr "Rapport kan ej skapas, då data ej tillhandahölls"
-#: ../include/svn_error_codes.h:819
+#: ../include/svn_error_codes.h:829
msgid "Bogus revision report"
msgstr "Felaktig revisionsrapport"
-#: ../include/svn_error_codes.h:828
+#: ../include/svn_error_codes.h:838
msgid "Unsupported repository version"
msgstr "Arkivversionen stöds ej"
-#: ../include/svn_error_codes.h:832
+#: ../include/svn_error_codes.h:842
msgid "Disabled repository feature"
msgstr "Funktionen är avslagen i arkivet"
-#: ../include/svn_error_codes.h:836
+#: ../include/svn_error_codes.h:846
msgid "Error running post-commit hook"
msgstr "Fel vid körning av krokskript efter arkivering (\"post-commit\")"
-#: ../include/svn_error_codes.h:841
+#: ../include/svn_error_codes.h:851
msgid "Error running post-lock hook"
msgstr "Fel vid körning av krokskript efter låsning (\"post-lock\")"
-#: ../include/svn_error_codes.h:846
+#: ../include/svn_error_codes.h:856
msgid "Error running post-unlock hook"
msgstr "Fel vid körning av krokskript efter upplåsning (\"post-unlock\")"
-#: ../include/svn_error_codes.h:851
+#: ../include/svn_error_codes.h:861
msgid "Repository upgrade is not supported"
msgstr "Uppgradering av arkiv stöds ej"
-#: ../include/svn_error_codes.h:857
+#: ../include/svn_error_codes.h:866
+#, fuzzy
+msgid "Repository is corrupt"
+msgstr "Förstörd arbetskopia"
+
+#: ../include/svn_error_codes.h:872
msgid "Bad URL passed to RA layer"
msgstr "Felaktig URL skickad till RA-skiktet"
-#: ../include/svn_error_codes.h:861
+#: ../include/svn_error_codes.h:876
msgid "Authorization failed"
msgstr "Behörighetskontroll misslyckades"
-#: ../include/svn_error_codes.h:865
+#: ../include/svn_error_codes.h:880
msgid "Unknown authorization method"
msgstr "Okänd metod för behörighetskontroll"
-#: ../include/svn_error_codes.h:869
+#: ../include/svn_error_codes.h:884
msgid "Repository access method not implemented"
msgstr "Metod för arkivåtkomst ej implementerad"
-#: ../include/svn_error_codes.h:877
+#: ../include/svn_error_codes.h:892
msgid "Repository has no UUID"
msgstr "Arkivet saknar UUID"
-#: ../include/svn_error_codes.h:881
+#: ../include/svn_error_codes.h:896
msgid "Unsupported RA plugin ABI version"
msgstr "ABI-versionen för insticksmodulen för arkivåtkomst stöds ej"
-#: ../include/svn_error_codes.h:891
+#: ../include/svn_error_codes.h:906
msgid "Server can only replay from the root of a repository"
msgstr "Servern kan bara spela upp från arkivroten"
-#: ../include/svn_error_codes.h:896
+#: ../include/svn_error_codes.h:911
msgid "Repository UUID does not match expected UUID"
msgstr "Arkivets UUID matchar inte den förväntade UUID:n"
-#: ../include/svn_error_codes.h:901
+#: ../include/svn_error_codes.h:916
msgid "Repository root URL does not match expected root URL"
msgstr "Arkivets rot-URL matchar inte den förväntade rot-URL:en"
-#: ../include/svn_error_codes.h:906
+#: ../include/svn_error_codes.h:921
msgid "Session URL does not match expected session URL"
msgstr "Sessionens URL matchar inte den förväntade sessions-URL:en"
-#: ../include/svn_error_codes.h:911 ../libsvn_ra_svn/client.c:492
+#: ../include/svn_error_codes.h:926 ../libsvn_ra_svn/client.c:492
#, c-format
msgid "Can't create tunnel"
msgstr "Kan inte skapa tunnel"
-#: ../include/svn_error_codes.h:917
+#: ../include/svn_error_codes.h:932
msgid "RA layer failed to init socket layer"
msgstr "RA-skiktet kunde inte initiera uttagsskiktet (socket layer)"
-#: ../include/svn_error_codes.h:921
+#: ../include/svn_error_codes.h:936
msgid "RA layer failed to create HTTP request"
msgstr "RA-skiktet kunde inte skapa en HTTP-förfrågan"
-#: ../include/svn_error_codes.h:925
+#: ../include/svn_error_codes.h:940
msgid "RA layer request failed"
msgstr "Förfrågan misslyckad i RA-skiktet"
-#: ../include/svn_error_codes.h:929
+#: ../include/svn_error_codes.h:944
msgid "RA layer didn't receive requested OPTIONS info"
msgstr "RA-skiktet mottog ej begärd OPTIONS-information"
-#: ../include/svn_error_codes.h:933
+#: ../include/svn_error_codes.h:948
msgid "RA layer failed to fetch properties"
msgstr "RA-skiktet misslyckades med att erhålla egenskaper"
-#: ../include/svn_error_codes.h:937
+#: ../include/svn_error_codes.h:952
msgid "RA layer file already exists"
msgstr "RA-skiktsfil finns redan"
-#: ../include/svn_error_codes.h:951
+#: ../include/svn_error_codes.h:966
msgid "HTTP Path Not Found"
msgstr "HTTP-sökväg finns inte"
-#: ../include/svn_error_codes.h:955
+#: ../include/svn_error_codes.h:970
msgid "Failed to execute WebDAV PROPPATCH"
msgstr "Misslyckades med att utföra WebDAV PROPPATCH"
-#: ../include/svn_error_codes.h:960 ../include/svn_error_codes.h:1403
-#: ../libsvn_ra_svn/marshal.c:1075 ../libsvn_ra_svn/marshal.c:1285
-#: ../libsvn_ra_svn/marshal.c:1315
+#. If condition COND is not met, return a "malformed network data" error.
+#.
+#: ../include/svn_error_codes.h:975 ../include/svn_error_codes.h:1428
+#: ../libsvn_ra_svn/marshal.c:1142 ../libsvn_ra_svn/marshal.c:1364
+#: ../libsvn_ra_svn/marshal.c:1394 ../libsvn_ra_svn/marshal.c:2455
msgid "Malformed network data"
msgstr "Felaktig nätverksdata"
-#: ../include/svn_error_codes.h:965
+#: ../include/svn_error_codes.h:980
msgid "Unable to extract data from response header"
msgstr "Kunde inte läsa data från responshuvud"
-#: ../include/svn_error_codes.h:970
+#: ../include/svn_error_codes.h:985
msgid "Repository has been moved"
msgstr "Arkivet har flyttats"
-#: ../include/svn_error_codes.h:975 ../libsvn_ra_serf/update.c:2881
-#: ../libsvn_ra_serf/util.c:844
+#: ../include/svn_error_codes.h:990 ../libsvn_ra_serf/update.c:2960
+#: ../libsvn_ra_serf/util.c:764
msgid "Connection timed out"
msgstr "Nätverksanslutningen gick ut"
-#: ../include/svn_error_codes.h:980
+#: ../include/svn_error_codes.h:995
msgid "URL access forbidden for unknown reason"
msgstr "Åtkomst till URL tilläts ej av okänd anledning"
-#: ../include/svn_error_codes.h:986 ../include/svn_error_codes.h:1407
+#: ../include/svn_error_codes.h:1001 ../include/svn_error_codes.h:1432
msgid "Couldn't find a repository"
msgstr "Kunde inte hitta något arkiv"
-#: ../include/svn_error_codes.h:990
+#: ../include/svn_error_codes.h:1005
msgid "Couldn't open a repository"
msgstr "Kunde inte öppna arkivet"
-#: ../include/svn_error_codes.h:996
+#: ../include/svn_error_codes.h:1011
msgid "Svndiff data has invalid header"
msgstr "Svndiff-data har ogiltigt huvud"
-#: ../include/svn_error_codes.h:1000
+#: ../include/svn_error_codes.h:1015
msgid "Svndiff data contains corrupt window"
msgstr "Svndiff-data innehåller trasigt fönster"
-#: ../include/svn_error_codes.h:1004
+#: ../include/svn_error_codes.h:1019
msgid "Svndiff data contains backward-sliding source view"
msgstr "Svndiff-data innehåller källvyer med förflyttningar baklänges"
-#: ../include/svn_error_codes.h:1008
+#: ../include/svn_error_codes.h:1023
msgid "Svndiff data contains invalid instruction"
msgstr "Ogiltig instruktion i svndiff-data"
-#: ../include/svn_error_codes.h:1012
+#: ../include/svn_error_codes.h:1027
msgid "Svndiff data ends unexpectedly"
msgstr "Svndiff-data tog oväntat slut"
-#: ../include/svn_error_codes.h:1016
+#: ../include/svn_error_codes.h:1031
msgid "Svndiff compressed data is invalid"
msgstr "Komprimerad svndiff-data är ogiltig"
-#: ../include/svn_error_codes.h:1022
+#: ../include/svn_error_codes.h:1037
msgid "Apache has no path to an SVN filesystem"
msgstr "Apache saknar sökväg till SVN-filsystem"
-#: ../include/svn_error_codes.h:1026
+#: ../include/svn_error_codes.h:1041
msgid "Apache got a malformed URI"
msgstr "Apache fick en felaktig URI"
-#: ../include/svn_error_codes.h:1030
+#: ../include/svn_error_codes.h:1045
msgid "Activity not found"
msgstr "Aktiviteten hittades ej"
-#: ../include/svn_error_codes.h:1034
+#: ../include/svn_error_codes.h:1049
msgid "Baseline incorrect"
msgstr "Felaktig utgångspunkt"
-#: ../include/svn_error_codes.h:1038
+#: ../include/svn_error_codes.h:1053
msgid "Input/output error"
msgstr "In/ut-fel"
-#: ../include/svn_error_codes.h:1044
+#: ../include/svn_error_codes.h:1059
msgid "A path under version control is needed for this operation"
msgstr "Operationen kräver en versionshanterad sökväg"
-#: ../include/svn_error_codes.h:1048
+#: ../include/svn_error_codes.h:1063
msgid "Repository access is needed for this operation"
msgstr "Operationen kräver åtkomst till ett arkiv"
-#: ../include/svn_error_codes.h:1052
+#: ../include/svn_error_codes.h:1067
msgid "Bogus revision information given"
msgstr "Felaktig revisionsinformation angiven"
-#: ../include/svn_error_codes.h:1056
+#: ../include/svn_error_codes.h:1071
msgid "Attempting to commit to a URL more than once"
msgstr "Försöker arkivera till en URL mer än en gång"
-#: ../include/svn_error_codes.h:1060
+#: ../include/svn_error_codes.h:1075
msgid "Operation does not apply to binary file"
msgstr "Operationen kan ej utföras på binär fil"
-#: ../include/svn_error_codes.h:1066
+#: ../include/svn_error_codes.h:1081
msgid "Format of an svn:externals property was invalid"
msgstr "Felaktigt format på svn:externals-egenskap"
-#: ../include/svn_error_codes.h:1070
+#: ../include/svn_error_codes.h:1085
msgid "Attempting restricted operation for modified resource"
msgstr "Operationen tillåter ej att källan är modifierad"
-#: ../include/svn_error_codes.h:1074
+#: ../include/svn_error_codes.h:1089
msgid "Operation does not apply to directory"
msgstr "Operationen kan ej utföras på en katalog"
-#: ../include/svn_error_codes.h:1078
+#: ../include/svn_error_codes.h:1093
msgid "Revision range is not allowed"
msgstr "Revisionsområde otillåtet"
-#: ../include/svn_error_codes.h:1082
+#: ../include/svn_error_codes.h:1097
msgid "Inter-repository relocation not allowed"
msgstr "Omlokalisering mellan arkiv otillåten"
-#: ../include/svn_error_codes.h:1086
+#: ../include/svn_error_codes.h:1101
msgid "Author name cannot contain a newline"
msgstr "Författarnamn kan ej innehålla radslut"
-#: ../include/svn_error_codes.h:1090
+#: ../include/svn_error_codes.h:1105
msgid "Bad property name"
msgstr "Felaktigt egenskapsnamn"
-#: ../include/svn_error_codes.h:1095
+#: ../include/svn_error_codes.h:1110
msgid "Two versioned resources are unrelated"
msgstr "Två orelaterade versionshanterade resurser"
-#: ../include/svn_error_codes.h:1100
+#: ../include/svn_error_codes.h:1115
msgid "Path has no lock token"
msgstr "Sökvägen saknar låsidentifierare"
-#: ../include/svn_error_codes.h:1105
+#: ../include/svn_error_codes.h:1120
msgid "Operation does not support multiple sources"
msgstr "Operationen klarar ej flera källor"
-#: ../include/svn_error_codes.h:1110
+#: ../include/svn_error_codes.h:1125
msgid "No versioned parent directories"
msgstr "Inga versionshanterade föräldrakataloger"
-#: ../include/svn_error_codes.h:1115 ../include/svn_error_codes.h:1135
+#: ../include/svn_error_codes.h:1130 ../include/svn_error_codes.h:1150
msgid "Working copy and merge source not ready for reintegration"
msgstr "Arbetskopia och källa för sammanslagning inte klara för återförening"
-#: ../include/svn_error_codes.h:1120
+#: ../include/svn_error_codes.h:1135
msgid "A file external cannot overwrite an existing versioned item"
msgstr "En extern fil kan inte skriva över ett befintligt versionshanterat objekt"
-#: ../include/svn_error_codes.h:1125
+#: ../include/svn_error_codes.h:1140
msgid "Invalid path component strip count specified"
msgstr "Ogiltigt angivelse av antal sökvägsdelar att ta bort "
-#: ../include/svn_error_codes.h:1130
+#: ../include/svn_error_codes.h:1145
msgid "Detected a cycle while processing the operation"
msgstr "En rundgång upptäcktes när operationen behandlades"
-#: ../include/svn_error_codes.h:1140
+#: ../include/svn_error_codes.h:1155
msgid "Invalid mergeinfo detected in merge target"
msgstr "Ogiltig sammanslagningsinformation upptäcktes i målet"
-#: ../include/svn_error_codes.h:1145
+#: ../include/svn_error_codes.h:1160
msgid "Can't perform this operation without a valid lock token"
msgstr "Kan inte utföra denna operation utan giltig låsidentifierare"
-#: ../include/svn_error_codes.h:1150
+#: ../include/svn_error_codes.h:1165
msgid "The operation is forbidden by the server"
msgstr "Operationen tillåts inte av servern"
-#: ../include/svn_error_codes.h:1156
+#: ../include/svn_error_codes.h:1171
msgid "A problem occurred; see other errors for details"
msgstr "Ett problem har inträffat; se vidare fel för mer information"
-#: ../include/svn_error_codes.h:1160
+#: ../include/svn_error_codes.h:1175
msgid "Failure loading plugin"
msgstr "Fel vid inladdning av insticksmodul"
-#: ../include/svn_error_codes.h:1164
+#: ../include/svn_error_codes.h:1179
msgid "Malformed file"
msgstr "Felaktig fil"
-#: ../include/svn_error_codes.h:1168
+#: ../include/svn_error_codes.h:1183
msgid "Incomplete data"
msgstr "Ofullständig data"
-#: ../include/svn_error_codes.h:1172
+#: ../include/svn_error_codes.h:1187
msgid "Incorrect parameters given"
msgstr "Felaktiga parametrar angivna"
-#: ../include/svn_error_codes.h:1176
+#: ../include/svn_error_codes.h:1191
msgid "Tried a versioning operation on an unversioned resource"
msgstr "Försökte utföra en versionshanteringsoperation på en resurs som ej är versionshanterad"
-#: ../include/svn_error_codes.h:1180
+#: ../include/svn_error_codes.h:1195
msgid "Test failed"
msgstr "Test misslyckades"
-#: ../include/svn_error_codes.h:1184
+#: ../include/svn_error_codes.h:1199
msgid "Trying to use an unsupported feature"
msgstr "Försöker använda en funktion som ej stöds"
-#: ../include/svn_error_codes.h:1188
+#: ../include/svn_error_codes.h:1203
msgid "Unexpected or unknown property kind"
msgstr "Oväntad eller okänd egenskapstyp"
-#: ../include/svn_error_codes.h:1192
+#: ../include/svn_error_codes.h:1207
msgid "Illegal target for the requested operation"
msgstr "Otillåtet mål för begärd operation"
-#: ../include/svn_error_codes.h:1196
+#: ../include/svn_error_codes.h:1211
msgid "MD5 checksum is missing"
msgstr "MD5-kontrollsumma saknas"
-#: ../include/svn_error_codes.h:1200
+#: ../include/svn_error_codes.h:1215
msgid "Directory needs to be empty but is not"
msgstr "Katalogen måste vara tom, men det är den inte"
-#: ../include/svn_error_codes.h:1204
+#: ../include/svn_error_codes.h:1219
msgid "Error calling external program"
msgstr "Fel vid anrop av externt program"
-#: ../include/svn_error_codes.h:1208
+#: ../include/svn_error_codes.h:1223
msgid "Python exception has been set with the error"
msgstr "Python-undantag har satts för felet"
-#: ../include/svn_error_codes.h:1212
+#: ../include/svn_error_codes.h:1227
msgid "A checksum mismatch occurred"
msgstr "Felaktig kontrollsumma"
-#: ../include/svn_error_codes.h:1216
+#: ../include/svn_error_codes.h:1231
msgid "The operation was interrupted"
msgstr "Operationen avbröts"
-#: ../include/svn_error_codes.h:1220
+#: ../include/svn_error_codes.h:1235
msgid "The specified diff option is not supported"
msgstr "Den angivna diff-flaggan stöds ej"
-#: ../include/svn_error_codes.h:1224
+#: ../include/svn_error_codes.h:1239
msgid "Property not found"
msgstr "Egenskapen finns ej"
-#: ../include/svn_error_codes.h:1228
+#: ../include/svn_error_codes.h:1243
msgid "No auth file path available"
msgstr "Sökväg för auth-fil ej tillgänglig"
-#: ../include/svn_error_codes.h:1233
+#: ../include/svn_error_codes.h:1248
msgid "Incompatible library version"
msgstr "Biblioteksversioner inte kompatibla"
-#: ../include/svn_error_codes.h:1238
+#: ../include/svn_error_codes.h:1253
msgid "Mergeinfo parse error"
msgstr "Syntaxfel i sammanslagningsinformation"
-#: ../include/svn_error_codes.h:1243
+#: ../include/svn_error_codes.h:1258
msgid "Cease invocation of this API"
msgstr "Avsluta anropet av detta API"
-#: ../include/svn_error_codes.h:1248
+#: ../include/svn_error_codes.h:1263
msgid "Error parsing revision number"
msgstr "Syntaxfel i revisionsnummer"
-#: ../include/svn_error_codes.h:1253
+#: ../include/svn_error_codes.h:1268
msgid "Iteration terminated before completion"
msgstr "Upprepning avslutades före fullbordan"
-#: ../include/svn_error_codes.h:1258
+#: ../include/svn_error_codes.h:1273
msgid "Unknown changelist"
msgstr "Okänd ändringslista"
-#: ../include/svn_error_codes.h:1263
+#: ../include/svn_error_codes.h:1278
msgid "Reserved directory name in command line arguments"
msgstr "Reserverat katalognamn i kommandoradsargumenten"
-#: ../include/svn_error_codes.h:1268
+#: ../include/svn_error_codes.h:1283
msgid "Inquiry about unknown capability"
msgstr "Förfrågan om okänd förmåga"
-#: ../include/svn_error_codes.h:1273
+#: ../include/svn_error_codes.h:1288
msgid "Test skipped"
msgstr "Test hoppades över"
-#: ../include/svn_error_codes.h:1278
+#: ../include/svn_error_codes.h:1293
msgid "APR memcache library not available"
msgstr "APR memcache-bibliotek ej tillgängligt"
-#: ../include/svn_error_codes.h:1283
+#: ../include/svn_error_codes.h:1298
msgid "Couldn't perform atomic initialization"
msgstr "Kunde inte genomföra atomisk initiering"
-#: ../include/svn_error_codes.h:1288
+#: ../include/svn_error_codes.h:1303
msgid "SQLite error"
msgstr "SQLite-fel"
-#: ../include/svn_error_codes.h:1293
+#: ../include/svn_error_codes.h:1308
msgid "Attempted to write to readonly SQLite db"
msgstr "Försök att skriva till skrivskyddad SQLite-databas"
-#: ../include/svn_error_codes.h:1300
+#: ../include/svn_error_codes.h:1315
msgid "Unsupported schema found in SQLite db"
msgstr "Schemat i SQLite-databasen stöds ej"
-#: ../include/svn_error_codes.h:1305
+#: ../include/svn_error_codes.h:1320
msgid "The SQLite db is busy"
msgstr "SQLite-databasen är upptagen"
-#: ../include/svn_error_codes.h:1310
+#: ../include/svn_error_codes.h:1325
msgid "SQLite busy at transaction rollback; resetting all busy SQLite statements to allow rollback"
msgstr "SQLite upptagen vid transaktionsåterladding; återställer alla upptagna SQLite-satser för att tillåta återladdning"
-#: ../include/svn_error_codes.h:1316
+#: ../include/svn_error_codes.h:1331
msgid "Constraint error in SQLite db"
msgstr "Restriktionsfel i SQLite-databas"
-#: ../include/svn_error_codes.h:1321
+#: ../include/svn_error_codes.h:1336
msgid "Too many memcached servers configured"
msgstr "För många konfigurerade memcached-servrar"
-#: ../include/svn_error_codes.h:1326
+#: ../include/svn_error_codes.h:1341
msgid "Failed to parse version number string"
msgstr "Syntaxfel i sträng med versionsnummer"
-#: ../include/svn_error_codes.h:1331
+#: ../include/svn_error_codes.h:1346
msgid "Atomic data storage is corrupt"
msgstr "Förstörd atomisk datalagring"
-#: ../include/svn_error_codes.h:1337
+#: ../include/svn_error_codes.h:1351
+msgid "utf8proc library error"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1356
+msgid "Bad arguments to SQL operators GLOB or LIKE"
+msgstr ""
+
+#: ../include/svn_error_codes.h:1362
msgid "Error parsing arguments"
msgstr "Syntaxfel i argument"
-#: ../include/svn_error_codes.h:1341
+#: ../include/svn_error_codes.h:1366
msgid "Not enough arguments provided"
msgstr "För få argument givna"
-#: ../include/svn_error_codes.h:1345
+#: ../include/svn_error_codes.h:1370
msgid "Mutually exclusive arguments specified"
msgstr "De angivna argumenten kan inte användas samtidigt"
-#: ../include/svn_error_codes.h:1349
+#: ../include/svn_error_codes.h:1374
msgid "Attempted command in administrative dir"
msgstr "Försökte utföra kommando i förvaltningskatalog"
-#: ../include/svn_error_codes.h:1353
+#: ../include/svn_error_codes.h:1378
msgid "The log message file is under version control"
msgstr "Filen med loggmeddelandet är versionshanterad"
-#: ../include/svn_error_codes.h:1357
+#: ../include/svn_error_codes.h:1382
msgid "The log message is a pathname"
msgstr "Logmeddelandet är en sökväg"
-#: ../include/svn_error_codes.h:1361
+#: ../include/svn_error_codes.h:1386
msgid "Committing in directory scheduled for addition"
msgstr "Arkiverar i katalog schemalagd att läggas till"
-#: ../include/svn_error_codes.h:1365
+#: ../include/svn_error_codes.h:1390
msgid "No external editor available"
msgstr "Ingen extern editor tillgänglig"
-#: ../include/svn_error_codes.h:1369
+#: ../include/svn_error_codes.h:1394
msgid "Something is wrong with the log message's contents"
msgstr "Fel i loggmeddelandets innehåll"
-#: ../include/svn_error_codes.h:1373
+#: ../include/svn_error_codes.h:1398
msgid "A log message was given where none was necessary"
msgstr "Ett loggmeddelande angavs utan att det var nödvändigt"
-#: ../include/svn_error_codes.h:1377
+#: ../include/svn_error_codes.h:1402
msgid "No external merge tool available"
msgstr "Ingen externt sammanslagningsverktyg tillgängligt"
-#: ../include/svn_error_codes.h:1381
+#: ../include/svn_error_codes.h:1406
msgid "Failed processing one or more externals definitions"
msgstr "Misslyckad behandling av en eller fler external-definitioner"
-#: ../include/svn_error_codes.h:1387
+#: ../include/svn_error_codes.h:1412
msgid "Special code for wrapping server errors to report to client"
msgstr "Specialkod för att rapportera serverfel till klienten"
-#: ../include/svn_error_codes.h:1391
+#: ../include/svn_error_codes.h:1416
msgid "Unknown svn protocol command"
msgstr "Okänt kommando i svn-protokollet"
-#: ../include/svn_error_codes.h:1395
+#: ../include/svn_error_codes.h:1420
msgid "Network connection closed unexpectedly"
msgstr "Nätverksanslutningen stängdes oväntat"
-#: ../include/svn_error_codes.h:1399
+#: ../include/svn_error_codes.h:1424
msgid "Network read/write error"
msgstr "Läs/skrivfel till nätverket"
-#: ../include/svn_error_codes.h:1411
+#: ../include/svn_error_codes.h:1436
msgid "Client/server version mismatch"
msgstr "Klient- och serverversion stämmer ej överens"
-#: ../include/svn_error_codes.h:1416
+#: ../include/svn_error_codes.h:1441
msgid "Cannot negotiate authentication mechanism"
msgstr "Kan inte förhandla om autentiseringsmekanism"
-#: ../include/svn_error_codes.h:1421
+#: ../include/svn_error_codes.h:1446
msgid "Editor drive was aborted"
msgstr "Editorkörning avbröts"
-#: ../include/svn_error_codes.h:1429
+#: ../include/svn_error_codes.h:1454
msgid "Credential data unavailable"
msgstr "Klientreferenser otillgängliga"
-#: ../include/svn_error_codes.h:1433
+#: ../include/svn_error_codes.h:1458
msgid "No authentication provider available"
msgstr "Ingen tillhandahållare av autentisering tillgänglig"
-#: ../include/svn_error_codes.h:1437
+#: ../include/svn_error_codes.h:1462
msgid "All authentication providers exhausted"
msgstr "Alla tillhandahållare av autentisering förbrukade"
-#: ../include/svn_error_codes.h:1441
+#: ../include/svn_error_codes.h:1466
msgid "Credentials not saved"
msgstr "Klientreferenser sparades inte"
-#: ../include/svn_error_codes.h:1446
+#: ../include/svn_error_codes.h:1471
msgid "Authentication failed"
msgstr "Autentisering misslyckades"
-#: ../include/svn_error_codes.h:1452
+#: ../include/svn_error_codes.h:1477
msgid "Read access denied for root of edit"
msgstr "Läsning nekas till roten för editeringen"
-#: ../include/svn_error_codes.h:1457
+#: ../include/svn_error_codes.h:1482
msgid "Item is not readable"
msgstr "Objektet är inte läsbart"
-#: ../include/svn_error_codes.h:1462
+#: ../include/svn_error_codes.h:1487
msgid "Item is partially readable"
msgstr "Objektet är delvis läsbart"
-#: ../include/svn_error_codes.h:1466
+#: ../include/svn_error_codes.h:1491
msgid "Invalid authz configuration"
msgstr "Ogiltig behörighetskonfiguration"
-#: ../include/svn_error_codes.h:1471
+#: ../include/svn_error_codes.h:1496
msgid "Item is not writable"
msgstr "Objektet är inte skrivbart"
-#: ../include/svn_error_codes.h:1478
+#: ../include/svn_error_codes.h:1503
msgid "Diff data source modified unexpectedly"
msgstr "Datakälla för diff ändrades oväntat"
-#: ../include/svn_error_codes.h:1484
+#: ../include/svn_error_codes.h:1509
msgid "Initialization of SSPI library failed"
msgstr "Misslyckad initiering av SSPI-biblioteket"
-#: ../include/svn_error_codes.h:1488
+#: ../include/svn_error_codes.h:1513
msgid "Server SSL certificate untrusted"
msgstr "Ej betrott SSL-certifikat för server"
-#: ../include/svn_error_codes.h:1493
+#: ../include/svn_error_codes.h:1518
msgid "Initialization of the GSSAPI context failed"
msgstr "Misslyckad initiering av GSSAPI-kontext"
-#: ../include/svn_error_codes.h:1498
+#: ../include/svn_error_codes.h:1526
msgid "While handling serf response:"
msgstr "När svar från serf behandlades:"
-#: ../include/svn_error_codes.h:1504
+#: ../include/svn_error_codes.h:1532
msgid "Assertion failure"
msgstr "Fel upptäckt vid invariantkontroll"
-#: ../include/svn_error_codes.h:1508
+#: ../include/svn_error_codes.h:1536
msgid "No non-tracing links found in the error chain"
msgstr "Inga icke-spårande länkar hittades i felkedjan"
@@ -1345,67 +1370,63 @@ msgstr "GNOMEs nyckelkedja är låst och vi är inte interaktiva"
msgid "'%s' ends in a reserved name"
msgstr "\"%s\" slutar med ett reserverat namn"
-#: ../libsvn_client/add.c:875
+#: ../libsvn_client/add.c:872
#, c-format
msgid "'%s' prevents creating parent of '%s'"
msgstr "\"%s\" hindrar att förälder till \"%s\" skapas"
-#: ../libsvn_client/add.c:914 ../libsvn_wc/adm_ops.c:732
+#: ../libsvn_client/add.c:911 ../libsvn_wc/adm_ops.c:732
#, c-format
msgid "'%s' is an existing item in conflict; please mark the conflict as resolved before adding a new item here"
msgstr "\"%s\" är ett befintligt objekt i konflikt; markera konflikten som löst innan ett nytt objekt läggs till här"
-#: ../libsvn_client/add.c:921 ../libsvn_wc/adm_ops.c:687
-#: ../libsvn_wc/workqueue.c:905 ../libsvn_wc/workqueue.c:999
+#: ../libsvn_client/add.c:918 ../libsvn_wc/adm_ops.c:687
+#: ../libsvn_wc/workqueue.c:900 ../libsvn_wc/workqueue.c:994
#, c-format
msgid "'%s' not found"
msgstr "\"%s\" finns inte"
-#: ../libsvn_client/add.c:927 ../libsvn_wc/adm_ops.c:692
+#: ../libsvn_client/add.c:924 ../libsvn_wc/adm_ops.c:692
#: ../libsvn_wc/delete.c:98
#, c-format
msgid "Unsupported node kind for path '%s'"
msgstr "Nodtypen för sökvägen \"%s\" stöds inte"
-#: ../libsvn_client/add.c:960 ../libsvn_client/changelist.c:65
-#: ../libsvn_client/changelist.c:104 ../libsvn_client/cleanup.c:55
-#: ../libsvn_client/export.c:1392 ../libsvn_client/import.c:815
-#: ../libsvn_client/patch.c:3009 ../libsvn_client/relocate.c:232
+#: ../libsvn_client/add.c:957 ../libsvn_client/changelist.c:65
+#: ../libsvn_client/changelist.c:104 ../libsvn_client/cleanup.c:233
+#: ../libsvn_client/export.c:1392 ../libsvn_client/import.c:820
+#: ../libsvn_client/patch.c:3012 ../libsvn_client/relocate.c:232
#: ../libsvn_client/resolved.c:121 ../libsvn_client/revert.c:136
-#: ../libsvn_client/status.c:353 ../libsvn_client/switch.c:473
+#: ../libsvn_client/status.c:353 ../libsvn_client/switch.c:471
#: ../libsvn_client/update.c:646 ../libsvn_client/upgrade.c:105
-#: ../svn/util.c:984
+#: ../svn/util.c:979
#, c-format
msgid "'%s' is not a local path"
msgstr "\"%s\" är ingen lokal sökväg"
-#: ../libsvn_client/add.c:1001 ../libsvn_client/copy_foreign.c:489
+#: ../libsvn_client/add.c:998 ../libsvn_client/copy_foreign.c:489
#: ../libsvn_wc/adm_ops.c:766 ../libsvn_wc/copy.c:715
#, c-format
msgid "'%s' is already under version control"
msgstr "\"%s\" är redan versionshanterad"
-#: ../libsvn_client/add.c:1134 ../libsvn_client/add.c:1161
-#, c-format
+#: ../libsvn_client/add.c:1131 ../libsvn_client/add.c:1158
+#, fuzzy, c-format
msgid "There is no valid URI above '%s'"
msgstr "Det finns ingen giltig URI ovanför \"%s\""
-#: ../libsvn_client/blame.c:605
-msgid "Start revision must precede end revision"
-msgstr "Startrevisionen måste komma före slutrevisionen"
-
-#: ../libsvn_client/blame.c:633
+#: ../libsvn_client/blame.c:660
#, c-format
msgid "Cannot calculate blame information for binary file '%s'"
msgstr "Kan inte beräkna skuldinformation för den binära filen \"%s\""
#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:610
-#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:833
-#: ../libsvn_client/prop_commands.c:1388 ../libsvn_client/revisions.c:104
+#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:829
+#: ../libsvn_client/prop_commands.c:1384 ../libsvn_client/revisions.c:104
#: ../libsvn_wc/adm_ops.c:1197 ../libsvn_wc/adm_ops.c:1247
#: ../libsvn_wc/copy.c:563 ../libsvn_wc/copy.c:624 ../libsvn_wc/entries.c:1301
#: ../libsvn_wc/entries.c:2681 ../libsvn_wc/entries.c:2712
-#: ../svn/notify.c:1095
+#: ../svn/notify.c:1104
#, c-format
msgid "'%s' is not under version control"
msgstr "\"%s\" är inte versionshanterad"
@@ -1433,26 +1454,31 @@ msgstr "URL:en \"%s\" pekar på en katalog"
msgid "Target changelist name must not be empty"
msgstr "Ändringslistan får inte ha tomt namn"
-#: ../libsvn_client/checkout.c:109 ../libsvn_client/export.c:1445
+#: ../libsvn_client/checkout.c:113 ../libsvn_client/export.c:1445
#, c-format
msgid "URL '%s' doesn't exist"
msgstr "URL:en \"%s\" finns inte"
-#: ../libsvn_client/checkout.c:113
+#: ../libsvn_client/checkout.c:117
#, c-format
msgid "URL '%s' refers to a file, not a directory"
msgstr "URL:en \"%s\" pekar på en fil och ingen katalog"
-#: ../libsvn_client/checkout.c:147
+#: ../libsvn_client/checkout.c:151
#, c-format
msgid "'%s' is already a working copy for a different URL"
msgstr "\"%s\" är redan en arbetskopia för en annan URL"
-#: ../libsvn_client/checkout.c:155
+#: ../libsvn_client/checkout.c:159
#, c-format
msgid "'%s' already exists and is not a directory"
msgstr "\"%s\" finns redan och är ingen katalog"
+#: ../libsvn_client/cleanup.c:87
+#, fuzzy, c-format
+msgid "Working copy at '%s' is already locked."
+msgstr "Arbetskopian \"%s\" är inte låst"
+
#: ../libsvn_client/cmdline.c:104
#, c-format
msgid "All non-relative targets must have the same root URL"
@@ -1501,7 +1527,7 @@ msgstr ""
msgid "Cannot commit '%s' because it was moved from '%s' which is not part of the commit; both sides of the move must be committed together"
msgstr "Kan inte arkivera \"%s\" eftersom den flyttades från \"%s\" som inte ingår i arkiveringen; bägge sidor av flytten måste arkiveras tillsammans"
-#: ../libsvn_client/commit.c:882
+#: ../libsvn_client/commit.c:895
#, c-format
msgid "Cannot commit '%s' because it was moved to '%s' which is not part of the commit; both sides of the move must be committed together"
msgstr "Kan inte arkivera \"%s\" eftersom den flyttades till \"%s\" som inte ingår i arkiveringen; bägge sidor av flytten måste arkiveras tillsammans"
@@ -1587,7 +1613,7 @@ msgstr "Sökvägen \"%s\" finns men är utesluten"
#: ../libsvn_client/copy.c:433 ../libsvn_client/copy.c:1050
#: ../libsvn_client/copy.c:1309 ../libsvn_client/copy.c:1884
-#: ../libsvn_client/import.c:862
+#: ../libsvn_client/import.c:868
#, c-format
msgid "Path '%s' already exists"
msgstr "Sökvägen \"%s\" finns redan"
@@ -1603,8 +1629,8 @@ msgstr "Sökvägen \"%s\" finns redan men är ej versionshanterad"
msgid "Path '%s' is not a directory"
msgstr "Sökvägen \"%s\" är ingen katalog"
-#: ../libsvn_client/copy.c:559 ../libsvn_client/merge.c:10118
-#: ../svnlook/svnlook.c:1425
+#: ../libsvn_client/copy.c:559 ../libsvn_client/merge.c:10117
+#: ../svnlook/svnlook.c:1424
#, c-format
msgid "Path '%s' does not exist"
msgstr "Sökvägen \"%s\" finns inte"
@@ -1668,7 +1694,7 @@ msgstr "\"%s\" verkar inte ha någon URL kopplad till sig"
#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:282
#: ../libsvn_client/externals.c:904 ../libsvn_client/externals.c:1103
-#: ../libsvn_wc/update_editor.c:1124
+#: ../libsvn_wc/update_editor.c:1119
#, c-format
msgid "Path '%s' is not in the working copy"
msgstr "Sökvägen \"%s\" finns inte i arbetskopian"
@@ -1677,7 +1703,7 @@ msgstr "Sökvägen \"%s\" finns inte i arbetskopian"
#: ../libsvn_client/repos_diff.c:998 ../libsvn_fs_fs/dag.c:1051
#: ../libsvn_ra_svn/client.c:1208 ../libsvn_wc/diff_editor.c:1981
#: ../libsvn_wc/diff_editor.c:2060 ../libsvn_wc/externals.c:651
-#: ../libsvn_wc/update_editor.c:4242
+#: ../libsvn_wc/update_editor.c:4235
#, c-format
msgid "Checksum mismatch for '%s'"
msgstr "Felaktig kontrollsumma för \"%s\""
@@ -1715,7 +1741,7 @@ msgstr "Revisioner (förutom HEAD) kan ej anges vid flyttoperationer"
msgid "No commits in repository"
msgstr "Ingenting har arkiverats i arkivet"
-#: ../libsvn_client/deprecated.c:2930 ../libsvn_wc/deprecated.c:3953
+#: ../libsvn_client/deprecated.c:2930 ../libsvn_wc/deprecated.c:4095
msgid "Non-recursive relocation not supported"
msgstr "Icke-rekursiv omlokalisering otillåten"
@@ -1735,7 +1761,7 @@ msgstr "%s\t(revision %ld)"
msgid "%s\t(working copy)"
msgstr "%s\t(arbetskopia)"
-#: ../libsvn_client/diff.c:512 ../svnlook/svnlook.c:795
+#: ../libsvn_client/diff.c:512 ../svnlook/svnlook.c:794
#, c-format
msgid "%sProperty changes on: %s%s"
msgstr "%sEgenskapsändringar för: %s%s"
@@ -1746,7 +1772,7 @@ msgid "Cannot display: file marked as a binary type.%s"
msgstr "Kan inte visa: filen markerad som binär.%s"
#: ../libsvn_client/diff.c:1265 ../libsvn_client/merge.c:7178
-#: ../libsvn_client/merge.c:10525
+#: ../libsvn_client/merge.c:10524
msgid "Not all required revisions are specified"
msgstr "Alla revisioner som krävs angavs inte"
@@ -1812,19 +1838,19 @@ msgstr "Destinationskatalogen finns och kommer inte att skrivas över om det int
#: ../libsvn_client/export.c:265 ../libsvn_client/export.c:1525
#: ../libsvn_wc/adm_crawler.c:1204 ../libsvn_wc/conflicts.c:1293
#: ../libsvn_wc/copy.c:586 ../libsvn_wc/crop.c:236 ../libsvn_wc/crop.c:327
-#: ../libsvn_wc/info.c:403 ../libsvn_wc/node.c:704 ../libsvn_wc/props.c:227
-#: ../libsvn_wc/status.c:2781 ../libsvn_wc/wc_db.c:2509
-#: ../libsvn_wc/wc_db.c:2703 ../libsvn_wc/wc_db.c:2727
-#: ../libsvn_wc/wc_db.c:2885 ../libsvn_wc/wc_db.c:3876
-#: ../libsvn_wc/wc_db.c:5895 ../libsvn_wc/wc_db.c:6215
-#: ../libsvn_wc/wc_db.c:6376 ../libsvn_wc/wc_db.c:6530
-#: ../libsvn_wc/wc_db.c:8355 ../libsvn_wc/wc_db.c:8812
-#: ../libsvn_wc/wc_db.c:9441 ../libsvn_wc/wc_db.c:9588
-#: ../libsvn_wc/wc_db.c:9728 ../libsvn_wc/wc_db.c:10078
-#: ../libsvn_wc/wc_db.c:11565 ../libsvn_wc/wc_db.c:11641
-#: ../libsvn_wc/wc_db.c:13175 ../libsvn_wc/wc_db.c:13235
-#: ../libsvn_wc/wc_db.c:13373 ../libsvn_wc/wc_db.c:13531
-#: ../libsvn_wc/wc_db.c:13968 ../libsvn_wc/wc_db.c:14749
+#: ../libsvn_wc/info.c:409 ../libsvn_wc/node.c:704 ../libsvn_wc/props.c:227
+#: ../libsvn_wc/status.c:2781 ../libsvn_wc/wc_db.c:2508
+#: ../libsvn_wc/wc_db.c:2702 ../libsvn_wc/wc_db.c:2726
+#: ../libsvn_wc/wc_db.c:2884 ../libsvn_wc/wc_db.c:3875
+#: ../libsvn_wc/wc_db.c:5894 ../libsvn_wc/wc_db.c:6214
+#: ../libsvn_wc/wc_db.c:6375 ../libsvn_wc/wc_db.c:6529
+#: ../libsvn_wc/wc_db.c:8354 ../libsvn_wc/wc_db.c:8811
+#: ../libsvn_wc/wc_db.c:9440 ../libsvn_wc/wc_db.c:9587
+#: ../libsvn_wc/wc_db.c:9727 ../libsvn_wc/wc_db.c:10077
+#: ../libsvn_wc/wc_db.c:11564 ../libsvn_wc/wc_db.c:11640
+#: ../libsvn_wc/wc_db.c:13173 ../libsvn_wc/wc_db.c:13233
+#: ../libsvn_wc/wc_db.c:13371 ../libsvn_wc/wc_db.c:13530
+#: ../libsvn_wc/wc_db.c:13970 ../libsvn_wc/wc_db.c:14751
#, c-format
msgid "The node '%s' was not found."
msgstr "Noden \"%s\" kunde inte hittas."
@@ -1898,18 +1924,18 @@ msgstr "Egenskapen %s på \"%s\" innehåller det okända radslutsvärdet \"%s\""
msgid "Unknown or unversionable type for '%s'"
msgstr "\"%s\" är av en typ som är okänd eller ej kan versionshanteras"
-#: ../libsvn_client/import.c:707
+#: ../libsvn_client/import.c:709
msgid "New entry name required when importing a file"
msgstr "Nytt postnamn krävs vid import av en fil"
-#: ../libsvn_client/import.c:758 ../libsvn_client/patch.c:3016
-#: ../libsvn_client/patch.c:3028 ../libsvn_wc/delete.c:93
+#: ../libsvn_client/import.c:760 ../libsvn_client/patch.c:3019
+#: ../libsvn_client/patch.c:3031 ../libsvn_wc/delete.c:93
#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:77
#, c-format
msgid "'%s' does not exist"
msgstr "\"%s\" finns inte"
-#: ../libsvn_client/import.c:891
+#: ../libsvn_client/import.c:896
#, c-format
msgid "'%s' is a reserved name and cannot be imported"
msgstr "\"%s\" är ett reserverat namn och kan inte importeras"
@@ -1943,14 +1969,14 @@ msgstr "\"%s\" är inte låst i den här arbetskopian"
msgid "'%s' is not locked"
msgstr "\"%s\" är inte låst"
-#: ../libsvn_client/locking_commands.c:483 ../libsvn_fs/fs-loader.c:1413
+#: ../libsvn_client/locking_commands.c:483 ../libsvn_fs/fs-loader.c:1457
#: ../libsvn_ra/ra_loader.c:1074
msgid "Lock comment contains illegal characters"
msgstr "Låskommentaren innehåller otillåtna tecken"
#: ../libsvn_client/log.c:309
msgid "No valid target found"
-msgstr "Giltigt mål saknas"
+msgstr "Ogiltig målsökväg"
#: ../libsvn_client/log.c:340
#, c-format
@@ -1970,7 +1996,7 @@ msgid "Missing required revision specification"
msgstr "Revisionsspecifikation saknas"
#: ../libsvn_client/merge.c:439
-#, c-format
+#, fuzzy, c-format
msgid "URL '%s' of '%s' is not in repository '%s'"
msgstr "URL:en \"%s\" för \"%s\" är inte i arkivet \"%s\""
@@ -2014,7 +2040,7 @@ msgstr ""
"de återstående revisionerna"
#: ../libsvn_client/merge.c:6233
-#, c-format
+#, fuzzy, c-format
msgid "Invalid mergeinfo detected on '%s', merge tracking not possible"
msgstr "Ogiltig sammanslagningsinformation (\"mergeinfo\") för \"%s\"; följning av sammanslagning ej möjlig"
@@ -2023,65 +2049,65 @@ msgid "Merge tracking not allowed with missing subtrees; try restoring these ite
msgstr "Följning av sammanslagning kräver att inga delträd saknas; försök att återställa dessa först:\n"
#: ../libsvn_client/merge.c:7382
-#, c-format
+#, fuzzy, c-format
msgid "Invalid mergeinfo detected on merge target '%s', merge tracking not possible"
msgstr "Ogiltig sammanslagningsinformation (\"mergeinfo\") för målet \"%s\"; följning av sammanslagning ej möjlig"
-#: ../libsvn_client/merge.c:9700
+#: ../libsvn_client/merge.c:9699
msgid "Use of two URLs is not compatible with mergeinfo modification"
msgstr "Det går inte att använda två URL:er vid ändring av sammanslagningsinformationen"
-#: ../libsvn_client/merge.c:9707 ../libsvn_client/merge.c:10032
+#: ../libsvn_client/merge.c:9706 ../libsvn_client/merge.c:10031
msgid "Merge from foreign repository is not compatible with mergeinfo modification"
msgstr "Sammanslagning från annat arkiv går inte vid ändring av sammanslagningsinformationen"
-#: ../libsvn_client/merge.c:10125 ../libsvn_client/merge.c:10268
+#: ../libsvn_client/merge.c:10124 ../libsvn_client/merge.c:10267
#, c-format
msgid "Merge target '%s' does not exist in the working copy"
msgstr "Sammanslagningsmålet \"%s\" finns inte i arbetskopian"
-#: ../libsvn_client/merge.c:10148
+#: ../libsvn_client/merge.c:10147
msgid "Cannot determine revision of working copy"
msgstr "Arbetskopians revision kan inte bestämmas"
-#: ../libsvn_client/merge.c:10154
+#: ../libsvn_client/merge.c:10153
#, c-format
msgid "Cannot merge into mixed-revision working copy [%ld:%ld]; try updating first"
msgstr "Sammanslagning till en arbetskopia i blandad revision [%ld:%ld] går inte; försök med att uppdatera först"
-#: ../libsvn_client/merge.c:10169
+#: ../libsvn_client/merge.c:10168
msgid "Cannot merge into a working copy with a switched subtree"
msgstr "Kan inte slå samman till en arbetskopia med växlat delträd"
-#: ../libsvn_client/merge.c:10185
+#: ../libsvn_client/merge.c:10184
msgid "Cannot merge into a working copy that has local modifications"
msgstr "Kan inte slå samman till en arbetskopia som har lokala ändringar"
-#: ../libsvn_client/merge.c:10205 ../svn/merge-cmd.c:60
+#: ../libsvn_client/merge.c:10204 ../svn/merge-cmd.c:60
#, c-format
msgid "Invalid merge source '%s'; a working copy path can only be used with a repository revision (a number, a date, or head)"
msgstr "Ogiltig sammanslagningskälla \"%s\"; en sökväg i en arbetskopia kan bara användas med en arkivrevision (ett nummer, ett datum eller \"HEAD\")"
-#: ../libsvn_client/merge.c:10528 ../svn/merge-cmd.c:127
+#: ../libsvn_client/merge.c:10527 ../svn/merge-cmd.c:127
msgid "Merge sources must both be either paths or URLs"
msgstr "Båda sammanslagningskällorna måste vara antingen sökvägar eller URL:er"
-#: ../libsvn_client/merge.c:11289 ../libsvn_client/merge.c:11451
-#: ../libsvn_client/merge.c:12338
+#: ../libsvn_client/merge.c:11288 ../libsvn_client/merge.c:11450
+#: ../libsvn_client/merge.c:12337
#, c-format
msgid "'%s@%ld' must be ancestrally related to '%s@%ld'"
msgstr "\"%s@%ld\" måste ha samma ursprung som \"%s@%ld\""
-#: ../libsvn_client/merge.c:11401
+#: ../libsvn_client/merge.c:11400
#, c-format
msgid "Neither the reintegrate source nor target can be the root of the repository"
msgstr "Varken återföreningens källa eller mål kan vara arkivets rot"
-#: ../libsvn_client/merge.c:11411
+#: ../libsvn_client/merge.c:11410
msgid "Reintegrate merge not possible"
msgstr "Återförenande sammanslagning ej möjlig"
-#: ../libsvn_client/merge.c:11484
+#: ../libsvn_client/merge.c:11483
#, c-format
msgid ""
"Reintegrate can only be used if revisions %ld through %ld were previously merged from %s to the reintegrate source, but this is not the case:\n"
@@ -2090,28 +2116,28 @@ msgstr ""
"Återförening kan bara ske om revisionerna %ld till %ld tidigare slogs samman från %s till återföreningens källa, men så är inte fallet:\n"
"%s"
-#: ../libsvn_client/merge.c:11546
+#: ../libsvn_client/merge.c:11545
#, c-format
msgid "Can't reintegrate into '%s' because it is locally added and therefore not related to the merge source"
msgstr "Kan inte återförena in i \"%s\" eftersom den har lagts till lokalt och är därför orelaterad till sammanslagningskällan"
-#: ../libsvn_client/merge.c:11814
+#: ../libsvn_client/merge.c:11813
msgid "Cannot merge automatically while ignoring mergeinfo"
msgstr "Automatisk sammanslagning ej möjlig utan användning av sammanslagningsinformation"
-#: ../libsvn_client/merge.c:12554
+#: ../libsvn_client/merge.c:12553
msgid "The required merge is reintegrate-like, and the record-only option cannot be used with this kind of merge"
msgstr "Sammanslagningen som krävs är en återförening, och väljaren \"record-only\" kan inte användas för den här sortens sammanslagning"
-#: ../libsvn_client/merge.c:12560
+#: ../libsvn_client/merge.c:12559
msgid "The required merge is reintegrate-like, and the depth option cannot be used with this kind of merge"
msgstr "Sammanslagningen som krävs är en återförening, och väljaren för att ange djupet kan inte användas för den här sortens sammanslagning"
-#: ../libsvn_client/merge.c:12566
+#: ../libsvn_client/merge.c:12565
msgid "The required merge is reintegrate-like, and the force_delete option cannot be used with this kind of merge"
msgstr "Sammanslagningen som krävs är en återförening, och väljaren \"force_delete\" kan inte användas för den här sortens sammanslagning"
-#: ../libsvn_client/mergeinfo.c:1718
+#: ../libsvn_client/mergeinfo.c:1714
msgid "Only depths 'infinity' and 'empty' are currently supported"
msgstr "Bara djupen \"infinity\" (obegränsat) och \"empty\" (tomt) stöds för närvarande"
@@ -2124,19 +2150,19 @@ msgstr "Kan inte ta bort %u sökvägsdelar från \"%s\""
msgid "Invalid link representation"
msgstr "Felaktig länkrepresentation"
-#: ../libsvn_client/patch.c:3005
+#: ../libsvn_client/patch.c:3008
msgid "strip count must be positive"
msgstr "antal sökvägsdelar att ta bort måste vara positivt"
-#: ../libsvn_client/patch.c:3021 ../libsvn_fs_base/tree.c:3978
-#: ../libsvn_fs_base/tree.c:3983 ../libsvn_fs_fs/tree.c:3066
-#: ../libsvn_fs_fs/tree.c:3071 ../libsvn_ra/compat.c:675
-#: ../libsvn_ra_local/ra_plugin.c:1145
+#: ../libsvn_client/patch.c:3024 ../libsvn_fs_base/tree.c:3978
+#: ../libsvn_fs_base/tree.c:3983 ../libsvn_fs_fs/tree.c:3098
+#: ../libsvn_fs_fs/tree.c:3103 ../libsvn_ra/compat.c:675
+#: ../libsvn_ra_local/ra_plugin.c:1163
#, c-format
msgid "'%s' is not a file"
msgstr "\"%s\" är ingen fil"
-#: ../libsvn_client/patch.c:3033 ../libsvn_wc/util.c:59
+#: ../libsvn_client/patch.c:3036 ../libsvn_wc/util.c:59
#, c-format
msgid "'%s' is not a directory"
msgstr "\"%s\" är ingen katalog"
@@ -2202,14 +2228,14 @@ msgstr "Författarnamnet bör inte innehålla radslut; värdet sätts inte med m
msgid "'%s' does not exist in revision %ld"
msgstr "\"%s\" finns inte i revision %ld"
-#: ../libsvn_client/prop_commands.c:583 ../libsvn_client/prop_commands.c:1096
+#: ../libsvn_client/prop_commands.c:583 ../libsvn_client/prop_commands.c:1092
#: ../libsvn_wc/crop.c:168
#, c-format
msgid "Unknown node kind for '%s'"
msgstr "Okänd nodtyp för \"%s\""
#: ../libsvn_client/ra.c:161
-#, c-format
+#, fuzzy, c-format
msgid "Attempt to set wcprop '%s' on '%s' in a non-commit operation"
msgstr "Försök att sätta wcprop \"%s\" på \"%s\" under en operation som ej är arkivering"
@@ -2218,17 +2244,24 @@ msgstr "Försök att sätta wcprop \"%s\" pÃ¥ \"%s\" under en operation som ej Ã
msgid "Redirect cycle detected for URL '%s'"
msgstr "Rundgång i omdirigering upptäcktes för URL:en \"%s\""
-#: ../libsvn_client/ra.c:501 ../libsvn_client/ra.c:812
+#: ../libsvn_client/ra.c:501 ../libsvn_client/ra.c:837
#, c-format
msgid "'%s' has no URL"
msgstr "\"%s\" saknar URL"
-#: ../libsvn_client/ra.c:679 ../libsvn_ra/compat.c:395
+#: ../libsvn_client/ra.c:678 ../libsvn_fs_fs/fs_fs.c:1941
+#: ../libsvn_fs_fs/fs_fs.c:1996 ../libsvn_fs_fs/fs_fs.c:2007
+#: ../libsvn_repos/log.c:2307 ../libsvn_repos/log.c:2311
+#, c-format
+msgid "No such revision %ld"
+msgstr "Revisionen %ld finns inte"
+
+#: ../libsvn_client/ra.c:704 ../libsvn_ra/compat.c:395
#, c-format
msgid "Unable to find repository location for '%s' in revision %ld"
msgstr "Kan inte hitta platsen i arkivet för \"%s\" i revision %ld"
-#: ../libsvn_client/ra.c:691
+#: ../libsvn_client/ra.c:716
#, c-format
msgid "The location for '%s' for revision %ld does not exist in the repository or refers to an unrelated object"
msgstr "Platsen för \"%s\" i revision %ld finns inte i arkivet eller är ett orelaterat objekt"
@@ -2260,7 +2293,7 @@ msgstr "Okänd revisionstyp begärd för \"%s\""
#: ../libsvn_client/status.c:407 ../libsvn_client/status.c:586
#: ../libsvn_wc/lock.c:564 ../libsvn_wc/lock.c:856 ../libsvn_wc/lock.c:1542
-#: ../libsvn_wc/wc_db.c:12787 ../libsvn_wc/wc_db_wcroot.c:630
+#: ../libsvn_wc/wc_db.c:12785 ../libsvn_wc/wc_db_wcroot.c:628
#, c-format
msgid "'%s' is not a working copy"
msgstr "\"%s\" är ingen arbetskopia"
@@ -2285,8 +2318,8 @@ msgstr "Kan inte växla \"%s\" eftersom den inte finns i arbetskopian än"
msgid "Directory '%s' has no URL"
msgstr "Katalogen \"%s\" saknar URL"
-#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:236
-#: ../libsvn_ra_local/ra_plugin.c:326 ../libsvn_wc/update_editor.c:4833
+#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:235
+#: ../libsvn_ra_local/ra_plugin.c:325 ../libsvn_wc/update_editor.c:4826
#, c-format
msgid ""
"'%s'\n"
@@ -2297,7 +2330,7 @@ msgstr ""
"är inte samma arkiv som\n"
"\"%s\""
-#: ../libsvn_client/switch.c:242
+#: ../libsvn_client/switch.c:240
#, c-format
msgid "'%s' shares no common ancestry with '%s'"
msgstr "\"%s\" och \"%s\" saknar gemensamt ursprung"
@@ -2307,115 +2340,90 @@ msgstr "\"%s\" och \"%s\" saknar gemensamt ursprung"
msgid "Cannot mix repository and working copy targets"
msgstr "Kan inte blanda mål i arkiv och arbetskopia"
-#: ../libsvn_delta/svndiff.c:175
-msgid "Compression of svndiff data failed"
-msgstr "Misslyckades med att komprimera svndiff-data"
-
-#: ../libsvn_delta/svndiff.c:538
-msgid "Decompression of svndiff data failed: no size"
-msgstr "Misslyckades med att packa upp svndiff-data: ingen storlek"
-
-#: ../libsvn_delta/svndiff.c:541
-msgid "Decompression of svndiff data failed: size too large"
-msgstr "Misslyckades med att packa upp svndiff-data: storlek för stor"
-
-#: ../libsvn_delta/svndiff.c:565
-msgid "Decompression of svndiff data failed"
-msgstr "Misslyckades med att packa upp svndiff-data"
-
-#: ../libsvn_delta/svndiff.c:572
-msgid "Size of uncompressed data does not match stored original length"
-msgstr "Storleken på uppackad data stämmer inte med lagrad originallängd"
-
-#: ../libsvn_delta/svndiff.c:648
+#: ../libsvn_delta/svndiff.c:436
#, c-format
msgid "Invalid diff stream: insn %d cannot be decoded"
msgstr "Ogiltig diff-ström: instruktionen %d kan inte avkodas"
-#: ../libsvn_delta/svndiff.c:652
+#: ../libsvn_delta/svndiff.c:440
#, c-format
msgid "Invalid diff stream: insn %d has length zero"
msgstr "Ogiltig diff-ström: instruktionen %d har längden noll"
-#: ../libsvn_delta/svndiff.c:656
+#: ../libsvn_delta/svndiff.c:444
#, c-format
msgid "Invalid diff stream: insn %d overflows the target view"
msgstr "Ogiltig diff-ström: instruktionen %d går utanför målet"
-#: ../libsvn_delta/svndiff.c:665
+#: ../libsvn_delta/svndiff.c:453
#, c-format
msgid "Invalid diff stream: [src] insn %d overflows the source view"
msgstr "Ogiltig diff-ström: [src] instruktion %d går utanför källan"
-#: ../libsvn_delta/svndiff.c:672
+#: ../libsvn_delta/svndiff.c:460
#, c-format
msgid "Invalid diff stream: [tgt] insn %d starts beyond the target view position"
msgstr "Ogiltig diff-ström: [tgt] instruktionen %d börjar efter målet"
-#: ../libsvn_delta/svndiff.c:679
+#: ../libsvn_delta/svndiff.c:467
#, c-format
msgid "Invalid diff stream: [new] insn %d overflows the new data section"
msgstr "Ogiltig diff-ström: [new] instruktionen %d går utanför ny data"
-#: ../libsvn_delta/svndiff.c:689
+#: ../libsvn_delta/svndiff.c:477
msgid "Delta does not fill the target window"
msgstr "Deltat fyller inte målfönstret"
-#: ../libsvn_delta/svndiff.c:692
+#: ../libsvn_delta/svndiff.c:480
msgid "Delta does not contain enough new data"
msgstr "Deltat innehåller inte tillräckligt med ny data"
-#: ../libsvn_delta/svndiff.c:797
+#: ../libsvn_delta/svndiff.c:600
msgid "Svndiff has invalid header"
msgstr "Svndiff har ogiltigt huvud"
-#: ../libsvn_delta/svndiff.c:853 ../libsvn_delta/svndiff.c:1035
+#: ../libsvn_delta/svndiff.c:656 ../libsvn_delta/svndiff.c:838
msgid "Svndiff contains a too-large window"
msgstr "Svndiff innehåller ett för stort fönster"
-#: ../libsvn_delta/svndiff.c:860 ../libsvn_delta/svndiff.c:1042
+#: ../libsvn_delta/svndiff.c:663 ../libsvn_delta/svndiff.c:845
msgid "Svndiff contains corrupt window header"
msgstr "Svndiff innehåller trasigt fönsterhuvud"
-#: ../libsvn_delta/svndiff.c:869
+#: ../libsvn_delta/svndiff.c:672
msgid "Svndiff has backwards-sliding source views"
msgstr "Svndiff innehåller källvyer med förflyttningar baklänges"
-#: ../libsvn_delta/svndiff.c:926 ../libsvn_delta/svndiff.c:983
-#: ../libsvn_delta/svndiff.c:1064
+#: ../libsvn_delta/svndiff.c:729 ../libsvn_delta/svndiff.c:786
+#: ../libsvn_delta/svndiff.c:867
msgid "Unexpected end of svndiff input"
msgstr "Oväntat slut på svndiff"
-#: ../libsvn_diff/diff_file.c:184
-#, c-format
-msgid "File '%s' is too large to be read in to memory"
-msgstr "Filen \"%s\" är för stor för att kunna läsas in i minnet"
-
-#: ../libsvn_diff/diff_file.c:1106
+#: ../libsvn_diff/diff_file.c:1094
#, c-format
msgid "The file '%s' changed unexpectedly during diff"
msgstr "Filen \"%s\" ändrades oväntat vid diff-beräkning"
-#: ../libsvn_diff/diff_file.c:1276
+#: ../libsvn_diff/diff_file.c:1264
msgid "Error in options to internal diff"
msgstr "Fel i väljare till intern diff-beräkning"
-#: ../libsvn_diff/diff_file.c:1302
+#: ../libsvn_diff/diff_file.c:1290
#, c-format
msgid "Invalid argument '%s' in diff options"
msgstr "Ogiltigt argument \"%s\" i diff-flaggor"
#. Order of date components can be different in different languages
-#: ../libsvn_diff/diff_file.c:1799
+#: ../libsvn_diff/diff_file.c:1787
msgid "%a %b %e %H:%M:%S %Y"
msgstr "%a %e %b %Y %H:%M:%S"
-#: ../libsvn_diff/diff_file.c:1875 ../libsvn_diff/diff_file.c:1891
+#: ../libsvn_diff/diff_file.c:1863 ../libsvn_diff/diff_file.c:1879
#, c-format
msgid "Path '%s' must be inside the directory '%s'"
msgstr "Sökvägen \"%s\" måste vara inuti katalogen \"%s\""
-#: ../libsvn_diff/diff_file.c:2409
+#: ../libsvn_diff/diff_file.c:2397
#, c-format
msgid "Failed to delete mmap '%s'"
msgstr "Kunde inte ta bort minnesmappning \"%s\""
@@ -2454,82 +2462,82 @@ msgstr "\"%s\" finns redan, så den kan vara inaktuell; försök att uppdatera"
msgid "The filesystem does not support 'absent' nodes"
msgstr "Filsystemet stöder ej \"frånvarande\" noder"
-#: ../libsvn_fs/fs-loader.c:121
+#: ../libsvn_fs/fs-loader.c:120
#, c-format
msgid "Invalid name for FS type '%s'"
msgstr "Ogiltigt namn för filsystemstypen \"%s\""
-#: ../libsvn_fs/fs-loader.c:138 ../libsvn_ra/ra_loader.c:161
+#: ../libsvn_fs/fs-loader.c:137 ../libsvn_ra/ra_loader.c:161
#: ../libsvn_ra/ra_loader.c:174
#, c-format
msgid "'%s' does not define '%s()'"
msgstr "\"%s\" definierar inte \"%s()\""
-#: ../libsvn_fs/fs-loader.c:164
+#: ../libsvn_fs/fs-loader.c:163
#, c-format
msgid "Failed to load module for FS type '%s'"
msgstr "Kunde inte ladda modulen för filsystemstypen \"%s\""
-#: ../libsvn_fs/fs-loader.c:186
+#: ../libsvn_fs/fs-loader.c:185
#, c-format
msgid "Mismatched FS module version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "Versioner stämmer ej i FS-modulen \"%s\": hittade %d.%d.%d%s, väntade %d.%d.%d%s"
-#: ../libsvn_fs/fs-loader.c:266
+#: ../libsvn_fs/fs-loader.c:265
#, c-format
msgid "Unknown FS type '%s'"
msgstr "Okänd filsystemstyp \"%s\""
-#: ../libsvn_fs/fs-loader.c:389
+#: ../libsvn_fs/fs-loader.c:396
#, c-format
msgid "Path '%s' is not in UTF-8"
msgstr "Sökvägen \"%s\" är inte i UTF-8"
-#: ../libsvn_fs/fs-loader.c:397
+#: ../libsvn_fs/fs-loader.c:404
#, c-format
msgid "Path '%s' contains '.' or '..' element"
msgstr "Sökvägen \"%s\" innehåller elementet \".\" eller \"..\""
-#: ../libsvn_fs/fs-loader.c:554 ../libsvn_repos/repos.c:1982
+#: ../libsvn_fs/fs-loader.c:575 ../libsvn_repos/repos.c:2093
msgid "Hotcopy source and destination are equal"
msgstr "Samma källa och mål för kopiering under drift"
-#: ../libsvn_fs/fs-loader.c:564
+#: ../libsvn_fs/fs-loader.c:585
#, c-format
msgid "'%s' already exists and is a file"
msgstr "\"%s\" finns redan och är en fil"
-#: ../libsvn_fs/fs-loader.c:569
+#: ../libsvn_fs/fs-loader.c:590
#, c-format
msgid "'%s' already exists and has an unknown node kind"
msgstr "\"%s\" finns redan och har en okänd nodtyp"
-#: ../libsvn_fs/fs-loader.c:587
+#: ../libsvn_fs/fs-loader.c:608
#, c-format
msgid "The filesystem type of the hotcopy source ('%s') does not match the filesystem type of the hotcopy destination ('%s')"
msgstr "Filsystemstypen för källan för kopiering under drift (\"%s\") stämmer inte överens med filsystemstypen för destinationen (\"%s\")"
-#: ../libsvn_fs/fs-loader.c:1395
+#: ../libsvn_fs/fs-loader.c:1439
#, c-format
msgid "Malformed UUID '%s'"
msgstr "Felaktig UUID \"%s\""
-#: ../libsvn_fs/fs-loader.c:1423
+#: ../libsvn_fs/fs-loader.c:1467
#, c-format
msgid "Lock token URI '%s' has bad scheme; expected '%s'"
msgstr "Låsidentifieraren med URI \"%s\" har felaktigt schema; väntade \"%s\""
-#: ../libsvn_fs/fs-loader.c:1430
+#: ../libsvn_fs/fs-loader.c:1474
#, c-format
msgid "Lock token '%s' is not ASCII at byte %u"
msgstr "Låsidentifieraren \"%s\" är inte ASCII vid byte %u"
-#: ../libsvn_fs/fs-loader.c:1437
+#: ../libsvn_fs/fs-loader.c:1481
#, c-format
msgid "Lock token URI '%s' is not XML-safe"
msgstr "Låsidentifieraren med URI \"%s\" är inte XML-säker"
-#: ../libsvn_fs/fs-loader.c:1444
+#: ../libsvn_fs/fs-loader.c:1488
msgid "Negative expiration date passed to svn_fs_lock"
msgstr "Negativt utgångsgdatum till svn_fs_lock"
@@ -2546,19 +2554,19 @@ msgstr "skapande av ändring"
msgid "deleting changes"
msgstr "radering av ändringar"
-#: ../libsvn_fs_base/bdb/changes-table.c:150 ../libsvn_fs_fs/fs_fs.c:5908
+#: ../libsvn_fs_base/bdb/changes-table.c:150 ../libsvn_fs_fs/fs_fs.c:5919
msgid "Missing required node revision ID"
msgstr "Nodrevisions-id saknas"
-#: ../libsvn_fs_base/bdb/changes-table.c:161 ../libsvn_fs_fs/fs_fs.c:5918
+#: ../libsvn_fs_base/bdb/changes-table.c:161 ../libsvn_fs_fs/fs_fs.c:5929
msgid "Invalid change ordering: new node revision ID without delete"
msgstr "Ogiltig ändringsordning: nytt nodrevisions-id utan radering"
-#: ../libsvn_fs_base/bdb/changes-table.c:171 ../libsvn_fs_fs/fs_fs.c:5929
+#: ../libsvn_fs_base/bdb/changes-table.c:171 ../libsvn_fs_fs/fs_fs.c:5940
msgid "Invalid change ordering: non-add change on deleted path"
msgstr "Ogiltig ändringsordning: ändring som inte är tillägg på raderad sökväg"
-#: ../libsvn_fs_base/bdb/changes-table.c:180 ../libsvn_fs_fs/fs_fs.c:5938
+#: ../libsvn_fs_base/bdb/changes-table.c:180 ../libsvn_fs_fs/fs_fs.c:5949
msgid "Invalid change ordering: add change on preexisting path"
msgstr "Ogiltig ändringsordning: tilläggsändring på redan befintlig sökväg"
@@ -3026,7 +3034,7 @@ msgstr "Ogiltigt värde (%%%s) för sammanslagningsräknare för nodrevision"
msgid "Corrupt filesystem revision %ld in filesystem '%s'"
msgstr "Trasig filsystemsrevision %ld i filsystemet \"%s\""
-#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/fs_fs.c:2267
+#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/fs_fs.c:2323
#, c-format
msgid "Reference to non-existent node '%s' in filesystem '%s'"
msgstr "Referens till icke existerande nod \"%s\" i filsystemet \"%s\""
@@ -3086,151 +3094,151 @@ msgstr "Ingen post i tabellen \"node-origins\" för nod-ID \"%s\" i filsystemet
msgid "No record in 'checksum-reps' table for checksum '%s' in filesystem '%s'"
msgstr "Ingen post i tabellen \"checksum-reps\" för kontrollsumman \"%s\" i filsystemet \"%s\""
-#: ../libsvn_fs_base/fs.c:89
+#: ../libsvn_fs_base/fs.c:87
#, c-format
msgid "Bad database version: got %d.%d.%d, should be at least %d.%d.%d"
msgstr "Felaktig databasversion: %d.%d.%d, måste vara minst %d.%d.%d"
-#: ../libsvn_fs_base/fs.c:100
+#: ../libsvn_fs_base/fs.c:98
#, c-format
msgid "Bad database version: compiled with %d.%d.%d, running against %d.%d.%d"
msgstr "Felaktig databasversion: kompilerad med %d.%d.%d, kör mot %d.%d.%d"
-#: ../libsvn_fs_base/fs.c:190
+#: ../libsvn_fs_base/fs.c:188
#, c-format
msgid "Berkeley DB error for filesystem '%s' while closing environment:\n"
msgstr "Berkeley DB-fel i filsystemet \"%s\" då databasmiljön skulle stängas:\n"
-#: ../libsvn_fs_base/fs.c:553
+#: ../libsvn_fs_base/fs.c:607
#, c-format
msgid "Berkeley DB error for filesystem '%s' while creating environment:\n"
msgstr "Berkeley DB-fel i filsystemet \"%s\" då databasmiljön skulle skapas:\n"
-#: ../libsvn_fs_base/fs.c:559
+#: ../libsvn_fs_base/fs.c:613
#, c-format
msgid "Berkeley DB error for filesystem '%s' while opening environment:\n"
msgstr "Berkeley DB-fel i filsystemet \"%s\" då databasmiljön skulle öppnas:\n"
-#: ../libsvn_fs_base/fs.c:574
+#: ../libsvn_fs_base/fs.c:628
msgid "creating 'nodes' table"
msgstr "skapande av \"nodes\"-tabellen"
-#: ../libsvn_fs_base/fs.c:575
+#: ../libsvn_fs_base/fs.c:629
msgid "opening 'nodes' table"
msgstr "öppning av \"nodes\"-tabellen"
-#: ../libsvn_fs_base/fs.c:580
+#: ../libsvn_fs_base/fs.c:634
msgid "creating 'revisions' table"
msgstr "skapande av \"revisions\"-tabellen"
-#: ../libsvn_fs_base/fs.c:581
+#: ../libsvn_fs_base/fs.c:635
msgid "opening 'revisions' table"
msgstr "öppnande av \"revisions\"-tabellen"
-#: ../libsvn_fs_base/fs.c:586
+#: ../libsvn_fs_base/fs.c:640
msgid "creating 'transactions' table"
msgstr "skapande av \"transactions\"-tabellen"
-#: ../libsvn_fs_base/fs.c:587
+#: ../libsvn_fs_base/fs.c:641
msgid "opening 'transactions' table"
msgstr "öppnande av \"transactions\"-tabellen"
-#: ../libsvn_fs_base/fs.c:592
+#: ../libsvn_fs_base/fs.c:646
msgid "creating 'copies' table"
msgstr "skapande av \"copies\"-tabellen"
-#: ../libsvn_fs_base/fs.c:593
+#: ../libsvn_fs_base/fs.c:647
msgid "opening 'copies' table"
msgstr "öppnande av \"copies\"-tabellen"
-#: ../libsvn_fs_base/fs.c:598
+#: ../libsvn_fs_base/fs.c:652
msgid "creating 'changes' table"
msgstr "skapande av \"changes\"-tabellen"
-#: ../libsvn_fs_base/fs.c:599
+#: ../libsvn_fs_base/fs.c:653
msgid "opening 'changes' table"
msgstr "öppnande av \"changes\"-tabellen"
-#: ../libsvn_fs_base/fs.c:604
+#: ../libsvn_fs_base/fs.c:658
msgid "creating 'representations' table"
msgstr "skapande av \"representations\"-tabellen"
-#: ../libsvn_fs_base/fs.c:605
+#: ../libsvn_fs_base/fs.c:659
msgid "opening 'representations' table"
msgstr "öppnande av \"representations\"-tabellen"
-#: ../libsvn_fs_base/fs.c:610
+#: ../libsvn_fs_base/fs.c:664
msgid "creating 'strings' table"
msgstr "skapande av \"strings\"-tabellen"
-#: ../libsvn_fs_base/fs.c:611
+#: ../libsvn_fs_base/fs.c:665
msgid "opening 'strings' table"
msgstr "öppnande av \"strings\"-tabellen"
-#: ../libsvn_fs_base/fs.c:616
+#: ../libsvn_fs_base/fs.c:670
msgid "creating 'uuids' table"
msgstr "skapande av \"uuids\"-tabellen"
-#: ../libsvn_fs_base/fs.c:617
+#: ../libsvn_fs_base/fs.c:671
msgid "opening 'uuids' table"
msgstr "öppnande av \"uuids\"-tabellen"
-#: ../libsvn_fs_base/fs.c:622
+#: ../libsvn_fs_base/fs.c:676
msgid "creating 'locks' table"
msgstr "skapande av \"locks\"-tabellen"
-#: ../libsvn_fs_base/fs.c:623
+#: ../libsvn_fs_base/fs.c:677
msgid "opening 'locks' table"
msgstr "öppnande av \"locks\"-tabellen"
-#: ../libsvn_fs_base/fs.c:628
+#: ../libsvn_fs_base/fs.c:682
msgid "creating 'lock-tokens' table"
msgstr "skapande av \"lock-tokens\"-tabellen"
-#: ../libsvn_fs_base/fs.c:629
+#: ../libsvn_fs_base/fs.c:683
msgid "opening 'lock-tokens' table"
msgstr "öppnande av \"lock-tokens\"-tabellen"
-#: ../libsvn_fs_base/fs.c:637
+#: ../libsvn_fs_base/fs.c:691
msgid "creating 'node-origins' table"
msgstr "skapande av \"node-origins\"-tabellen"
-#: ../libsvn_fs_base/fs.c:638
+#: ../libsvn_fs_base/fs.c:692
msgid "opening 'node-origins' table"
msgstr "öppnande av \"node-origins\"-tabellen"
-#: ../libsvn_fs_base/fs.c:647
+#: ../libsvn_fs_base/fs.c:701
msgid "creating 'miscellaneous' table"
msgstr "skapande av \"miscellaneous\"-tabellen"
-#: ../libsvn_fs_base/fs.c:648
+#: ../libsvn_fs_base/fs.c:702
msgid "opening 'miscellaneous' table"
msgstr "öppnande av \"miscellaneous\"-tabellen"
-#: ../libsvn_fs_base/fs.c:657
+#: ../libsvn_fs_base/fs.c:711
msgid "creating 'checksum-reps' table"
msgstr "skapande av \"checksum-reps\"-tabellen"
-#: ../libsvn_fs_base/fs.c:658
+#: ../libsvn_fs_base/fs.c:712
msgid "opening 'checksum-reps' table"
msgstr "öppnande av \"checksum-reps\"-tabellen"
-#: ../libsvn_fs_base/fs.c:730
+#: ../libsvn_fs_base/fs.c:784
#, c-format
msgid "The '%s' feature requires version %d of the filesystem schema; filesystem '%s' uses only version %d"
msgstr "Funktionen \"%s\" behöver version %d av filsystemsschemat; filsystemet \"%s\" använder bara version %d"
-#: ../libsvn_fs_base/fs.c:749
+#: ../libsvn_fs_base/fs.c:803
#, c-format
msgid "Expected FS format '%d'; found format '%d'"
msgstr "Förväntat format på filsystemet \"%d\"; hittade \"%d\""
-#: ../libsvn_fs_base/fs.c:1215
+#: ../libsvn_fs_base/fs.c:1278
#, c-format
msgid "BDB repositories do not support incremental hotcopy"
msgstr "BDB-arkiv stöder inte successiv kopiering under drift"
-#: ../libsvn_fs_base/fs.c:1319
+#: ../libsvn_fs_base/fs.c:1382
msgid ""
"Error copying logfile; the DB_LOG_AUTOREMOVE feature\n"
"may be interfering with the hotcopy algorithm. If\n"
@@ -3241,7 +3249,7 @@ msgstr ""
"dåligt med algoritmen för kopiering under drift. Om problemet kvarstår,\n"
"försök med att slå av funktionen i DB_CONFIG"
-#: ../libsvn_fs_base/fs.c:1338
+#: ../libsvn_fs_base/fs.c:1401
msgid ""
"Error running catastrophic recovery on hotcopy; the\n"
"DB_LOG_AUTOREMOVE feature may be interfering with the\n"
@@ -3253,11 +3261,11 @@ msgstr ""
"kopiering under drift. Prova med att avaktivera\n"
"denna funktion i DB_CONFIG om problemet kvarstår"
-#: ../libsvn_fs_base/fs.c:1383
+#: ../libsvn_fs_base/fs.c:1446
msgid "Module for working with a Berkeley DB repository."
msgstr "Modul för att arbeta med ett Berkeley DB-arkiv."
-#: ../libsvn_fs_base/fs.c:1430
+#: ../libsvn_fs_base/fs.c:1494
#, c-format
msgid "Unsupported FS loader version (%d) for bdb"
msgstr "Versionen för FS-laddaren (%d) stöds ej för bdb"
@@ -3367,7 +3375,7 @@ msgstr "Transaktionen är ej död: \"%s\""
msgid "Transaction is dead: '%s'"
msgstr "Transaktionen är död: \"%s\""
-#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:9755
+#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:9740
#, c-format
msgid "revprop '%s' has unexpected value in filesystem"
msgstr "revisionsegenskapen \"%s\" har oväntat värde i filsystemet"
@@ -3388,12 +3396,12 @@ msgstr "avbrott i Berkeley DB-transaktion"
msgid "committing Berkeley DB transaction"
msgstr "slutförande av Berkeley DB-transaktion"
-#: ../libsvn_fs_base/tree.c:772 ../libsvn_fs_fs/tree.c:1065
+#: ../libsvn_fs_base/tree.c:772 ../libsvn_fs_fs/tree.c:1097
#, c-format
msgid "Failure opening '%s'"
msgstr "Kan inte öppna \"%s\""
-#: ../libsvn_fs_base/tree.c:1403 ../libsvn_fs_fs/tree.c:1516
+#: ../libsvn_fs_base/tree.c:1403 ../libsvn_fs_fs/tree.c:1548
msgid "Cannot compare property value between two different filesystems"
msgstr "Kan inte jämföra egenskapsvärde mellan två olika filsystem"
@@ -3406,18 +3414,18 @@ msgstr "Trasig databas: felaktigt föregångarantal"
msgid "Unexpected immutable node at '%s'"
msgstr "Oväntad icke ändringsbar nod på \"%s\""
-#: ../libsvn_fs_base/tree.c:1997 ../libsvn_fs_fs/tree.c:1546
+#: ../libsvn_fs_base/tree.c:1997 ../libsvn_fs_fs/tree.c:1578
#: ../libsvn_repos/commit.c:1244
#, c-format
msgid "Conflict at '%s'"
msgstr "Konflikt på \"%s\""
#: ../libsvn_fs_base/tree.c:2050 ../libsvn_fs_base/tree.c:2802
-#: ../libsvn_fs_fs/tree.c:1597 ../libsvn_fs_fs/tree.c:2134
+#: ../libsvn_fs_fs/tree.c:1629 ../libsvn_fs_fs/tree.c:2166
msgid "Bad merge; ancestor, source, and target not all in same fs"
msgstr "Felaktig sammanslagning; ursprung, källa och mål är inte samtliga i samma filsystem"
-#: ../libsvn_fs_base/tree.c:2066 ../libsvn_fs_fs/tree.c:1613
+#: ../libsvn_fs_base/tree.c:2066 ../libsvn_fs_fs/tree.c:1645
#, c-format
msgid "Bad merge; target '%s' has id '%s', same as ancestor"
msgstr "Felaktig sammanslagning; målet \"%s\" har id \"%s\", samma som ursprunget"
@@ -3432,25 +3440,25 @@ msgstr "Transaktionen \"%s\" är inaktuell jämfört med revision \"%s\""
msgid "Cannot deltify revisions prior to r%ld"
msgstr "Kan inte deltifiera revisioner äldre än r%ld"
-#: ../libsvn_fs_base/tree.c:3004 ../libsvn_fs_fs/tree.c:2289
+#: ../libsvn_fs_base/tree.c:3004 ../libsvn_fs_fs/tree.c:2321
msgid "The root directory cannot be deleted"
msgstr "Rotkatalogen kan inte raderas"
-#: ../libsvn_fs_base/tree.c:3217 ../libsvn_fs_fs/tree.c:2359
+#: ../libsvn_fs_base/tree.c:3217 ../libsvn_fs_fs/tree.c:2391
#, c-format
msgid "Cannot copy between two different filesystems ('%s' and '%s')"
msgstr "Kan inte kopiera mellan två olika filsystem (\"%s\" och \"%s\")"
-#: ../libsvn_fs_base/tree.c:3226 ../libsvn_fs_fs/tree.c:2365
+#: ../libsvn_fs_base/tree.c:3226 ../libsvn_fs_fs/tree.c:2397
msgid "Copy from mutable tree not currently supported"
msgstr "Kopiering från ändringsbart träd stöds ej för närvarande"
-#: ../libsvn_fs_base/tree.c:3736 ../libsvn_fs_fs/tree.c:2842
+#: ../libsvn_fs_base/tree.c:3736 ../libsvn_fs_fs/tree.c:2874
#, c-format
msgid "Base checksum mismatch on '%s'"
msgstr "Felaktig baskontrollsumma för \"%s\""
-#: ../libsvn_fs_base/tree.c:3969 ../libsvn_fs_fs/tree.c:3057
+#: ../libsvn_fs_base/tree.c:3969 ../libsvn_fs_fs/tree.c:3089
msgid "Cannot compare file contents between two different filesystems"
msgstr "Kan inte jämföra filinnehåll mellan två olika filsystem"
@@ -3465,7 +3473,7 @@ msgid "Node-revision '%s' claims to sit atop a tree containing mergeinfo but is
msgstr "Nodrevision \"%s\" påstår sig sitta på ett träd med sammanslagningsinformation men är ingen katalog"
#: ../libsvn_fs_fs/dag.c:426 ../libsvn_fs_fs/dag.c:442
-#: ../libsvn_ra_serf/serf.c:1038 ../libsvn_ra_serf/serf.c:1101
+#: ../libsvn_ra_serf/serf.c:1015 ../libsvn_ra_serf/serf.c:1078
msgid "Can't get entries of non-directory"
msgstr "Kan inte erhålla poster för något som ej är en katalog"
@@ -3488,443 +3496,426 @@ msgstr "Tom nodrevision i cache"
msgid "Attempted to update ancestry of non-mutable node"
msgstr "Försök att uppdatera ursprung till icke ändringsbar nod"
-#: ../libsvn_fs_fs/fs.c:83
+#: ../libsvn_fs_fs/fs.c:82
#, c-format
msgid "Can't fetch FSFS shared data"
msgstr "Kan inte hämta delad data i FSFS"
-#: ../libsvn_fs_fs/fs.c:107
+#: ../libsvn_fs_fs/fs.c:106
#, c-format
msgid "Can't store FSFS shared data"
msgstr "Kan inte lagra delad data i FSFS"
-#: ../libsvn_fs_fs/fs.c:401
+#: ../libsvn_fs_fs/fs.c:425
msgid "Module for working with a plain file (FSFS) repository."
msgstr "Modul för att arbeta med ett arkiv bestående av vanliga filer (FSFS)."
-#: ../libsvn_fs_fs/fs.c:451
+#: ../libsvn_fs_fs/fs.c:485
#, c-format
msgid "Unsupported FS loader version (%d) for fsfs"
msgstr "Versionen för FS-laddaren (%d) stöds ej för fsfs"
-#: ../libsvn_fs_fs/fs_fs.c:727
+#: ../libsvn_fs_fs/fs_fs.c:728
#, c-format
msgid "Can't unlock unknown transaction '%s'"
msgstr "Kan inte låsa upp okänd transaktion \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:731
+#: ../libsvn_fs_fs/fs_fs.c:732
#, c-format
msgid "Can't unlock nonlocked transaction '%s'"
msgstr "Kan inte låsa upp olåst transaktion \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:738
+#: ../libsvn_fs_fs/fs_fs.c:739
#, c-format
msgid "Can't unlock prototype revision lockfile for transaction '%s'"
msgstr "Kan inte låsa upp låsfilen för revisionsprototypfilen i transaktionen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:744
+#: ../libsvn_fs_fs/fs_fs.c:745
#, c-format
msgid "Can't close prototype revision lockfile for transaction '%s'"
msgstr "Kan inte stänga revisionsprototypfilens låsfil i transaktionen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:806
+#: ../libsvn_fs_fs/fs_fs.c:807
#, c-format
msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by this process"
msgstr ""
"Kan inte skriva till revisionsprototypfilen i transaktionen \"%s\" då en\n"
"tidigare representation just skrivs av denna process"
-#: ../libsvn_fs_fs/fs_fs.c:842
+#: ../libsvn_fs_fs/fs_fs.c:843
#, c-format
msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by another process"
msgstr ""
"Kan inte skriva till revisionsprototypfilen i transaktionen \"%s\" då en\n"
"tidigare representation just skrivs av en annan process<"
-#: ../libsvn_fs_fs/fs_fs.c:849 ../libsvn_subr/io.c:2007
+#: ../libsvn_fs_fs/fs_fs.c:850 ../libsvn_subr/io.c:2150
#, c-format
msgid "Can't get exclusive lock on file '%s'"
msgstr "Kan inte ta ut exklusivt lås på filen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:968
+#: ../libsvn_fs_fs/fs_fs.c:969
#, c-format
msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
msgstr "Filen %s (\"%s\") innehåller den oväntade icke-siffran \"%c\" i \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:1027
+#: ../libsvn_fs_fs/fs_fs.c:1028
#, c-format
msgid "Can't read first line of format file '%s'"
msgstr "Kan inte läsa första raden i formatfilen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:1064
+#: ../libsvn_fs_fs/fs_fs.c:1065
#, c-format
msgid "'%s' contains invalid filesystem format option '%s'"
msgstr "\"%s\" innehåller den felaktiga filsystemsformatväljaren \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:1130
+#: ../libsvn_fs_fs/fs_fs.c:1124
#, c-format
msgid "Found format '%d', only created by unreleased dev builds; see http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
msgstr "Hittade formatet \"%d\" som bara skapas av outgivna utvecklingsbyggen; se http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
-#: ../libsvn_fs_fs/fs_fs.c:1141
+#: ../libsvn_fs_fs/fs_fs.c:1135
#, c-format
msgid "Expected FS format between '1' and '%d'; found format '%d'"
msgstr "Förväntat filsystemsformat mellan \"1\" och \"%d\"; hittade \"%d\""
-#: ../libsvn_fs_fs/fs_fs.c:1581
+#: ../libsvn_fs_fs/fs_fs.c:1610
#, c-format
msgid "'%s' is not a regular file. Please move it out of the way and try again"
msgstr "\"%s\" är inte en vanlig fil. Flytta den ur vägen och försök igen"
-#: ../libsvn_fs_fs/fs_fs.c:1752
+#: ../libsvn_fs_fs/fs_fs.c:1808
#, c-format
msgid "Can't read '%s'"
msgstr "Kan inte läsa \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:1815 ../libsvn_fs_fs/fs_fs.c:1834
+#: ../libsvn_fs_fs/fs_fs.c:1871 ../libsvn_fs_fs/fs_fs.c:1890
#, c-format
msgid "Found malformed header '%s' in revision file"
msgstr "Hittade felaktigt huvud \"%s\" i revisionsfil"
-#: ../libsvn_fs_fs/fs_fs.c:1870
+#: ../libsvn_fs_fs/fs_fs.c:1926
#, c-format
msgid "Invalid revision number '%ld'"
msgstr "Ogiltigt revisionsnummer \"%ld\""
-#: ../libsvn_fs_fs/fs_fs.c:1885 ../libsvn_fs_fs/fs_fs.c:1940
-#: ../libsvn_fs_fs/fs_fs.c:1951 ../libsvn_repos/log.c:2268
-#: ../libsvn_repos/log.c:2272
-#, c-format
-msgid "No such revision %ld"
-msgstr "Revisionen %ld finns inte"
-
-#: ../libsvn_fs_fs/fs_fs.c:1985
+#: ../libsvn_fs_fs/fs_fs.c:2041
msgid "Unexpected EOF"
msgstr "Oväntat filslut"
-#: ../libsvn_fs_fs/fs_fs.c:1992
+#: ../libsvn_fs_fs/fs_fs.c:2048
#, c-format
msgid "Number '%s' invalid or too large"
msgstr "Talet \"%s\" ogiltigt eller för stort"
-#: ../libsvn_fs_fs/fs_fs.c:2159 ../libsvn_fs_fs/fs_fs.c:2173
-#: ../libsvn_fs_fs/fs_fs.c:2181 ../libsvn_fs_fs/fs_fs.c:2189
-#: ../libsvn_fs_fs/fs_fs.c:2198 ../libsvn_fs_fs/fs_fs.c:2211
-#: ../libsvn_fs_fs/fs_fs.c:2220
+#: ../libsvn_fs_fs/fs_fs.c:2215 ../libsvn_fs_fs/fs_fs.c:2229
+#: ../libsvn_fs_fs/fs_fs.c:2237 ../libsvn_fs_fs/fs_fs.c:2245
+#: ../libsvn_fs_fs/fs_fs.c:2254 ../libsvn_fs_fs/fs_fs.c:2267
+#: ../libsvn_fs_fs/fs_fs.c:2276
msgid "Malformed text representation offset line in node-rev"
msgstr "Felaktig rad med textrepresentationsposition i node-rev"
-#: ../libsvn_fs_fs/fs_fs.c:2251
+#: ../libsvn_fs_fs/fs_fs.c:2307
#, c-format
msgid "While reading representation offsets for node-revision '%s':"
msgstr "Fel vid läsning av representationsposition för nodrevision \"%s\":"
-#: ../libsvn_fs_fs/fs_fs.c:2406
+#: ../libsvn_fs_fs/fs_fs.c:2462
msgid "Missing id field in node-rev"
msgstr "ID-fält saknas i node-rev"
-#: ../libsvn_fs_fs/fs_fs.c:2420
+#: ../libsvn_fs_fs/fs_fs.c:2476
#, c-format
msgid "Missing kind field in node-rev '%s'"
msgstr "Typfält saknas i node-rev \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:2455
+#: ../libsvn_fs_fs/fs_fs.c:2511
#, c-format
msgid "Missing cpath field in node-rev '%s'"
msgstr "Fältet cpath saknas i node-rev \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:2483 ../libsvn_fs_fs/fs_fs.c:2490
+#: ../libsvn_fs_fs/fs_fs.c:2539 ../libsvn_fs_fs/fs_fs.c:2546
#, c-format
msgid "Malformed copyroot line in node-rev '%s'"
msgstr "Felaktig copyroot-rad i node-rev \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:2507 ../libsvn_fs_fs/fs_fs.c:2514
+#: ../libsvn_fs_fs/fs_fs.c:2563 ../libsvn_fs_fs/fs_fs.c:2570
#, c-format
msgid "Malformed copyfrom line in node-rev '%s'"
msgstr "Felaktig copyfrom-rad i node-rev \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:2683 ../libsvn_fs_fs/fs_fs.c:7629
+#: ../libsvn_fs_fs/fs_fs.c:2739 ../libsvn_fs_fs/fs_fs.c:7636
#, c-format
msgid "Attempted to write to non-transaction '%s'"
msgstr "Försök att skriva till \"%s\" som inte är en transaktion"
-#: ../libsvn_fs_fs/fs_fs.c:2820
+#: ../libsvn_fs_fs/fs_fs.c:2876
#, c-format
msgid "Malformed representation header at %s"
msgstr "Felaktigt representationshuvud vid %s"
-#: ../libsvn_fs_fs/fs_fs.c:2852
+#: ../libsvn_fs_fs/fs_fs.c:2908
#, c-format
msgid "Missing node-id in node-rev at r%ld (offset %s)"
msgstr "Nod-id saknas i nodrevisionen i r%ld (position %s)"
-#: ../libsvn_fs_fs/fs_fs.c:2861
+#: ../libsvn_fs_fs/fs_fs.c:2917
#, c-format
msgid "Corrupt node-id '%s' in node-rev at r%ld (offset %s)"
msgstr "Trasig nod-id \"%s\" i nodrevisionen i r%ld (position %s)"
-#: ../libsvn_fs_fs/fs_fs.c:2952
+#: ../libsvn_fs_fs/fs_fs.c:3008
#, c-format
msgid "Revision file (r%ld) lacks trailing newline"
msgstr "Avslutande radslut saknas i revisionsfil (r%ld)"
-#: ../libsvn_fs_fs/fs_fs.c:2966
+#: ../libsvn_fs_fs/fs_fs.c:3022
#, c-format
msgid "Final line in revision file (r%ld) longer than 64 characters"
msgstr "Den sista raden i revisionsfilen (r%ld) är längre än 64 tecken"
-#: ../libsvn_fs_fs/fs_fs.c:2981
+#: ../libsvn_fs_fs/fs_fs.c:3037
#, c-format
msgid "Final line in revision file r%ld missing space"
msgstr "Den sista raden i revisionsfilen r%ld saknar mellanslag"
-#: ../libsvn_fs_fs/fs_fs.c:3685
-#, c-format
+#: ../libsvn_fs_fs/fs_fs.c:3731
+#, fuzzy, c-format
msgid "Packed revprop manifest for r%ld too small"
-msgstr "Packad innehållsförteckning för revisionsegenskaper för r%ld är för liten"
-
-#: ../libsvn_fs_fs/fs_fs.c:3742
-#, c-format
-msgid "Revprop pack for revision r%ld contains revprops for r%ld .. r%ld"
-msgstr "Packade revisionsegenskaper för r%ld innehåller egenskaper för r%ld .. r%ld"
-
-#: ../libsvn_fs_fs/fs_fs.c:3753
-#, c-format
-msgid "Revprop pack for revision r%ld starts at non-packed revisions r%ld"
-msgstr "Packade revisionsegenskaper för r%ld börjar vid icke-packade r%ld"
+msgstr "Den packade innehållsförteckningen för revisionsegenskaper för revision %ld är för liten"
-#: ../libsvn_fs_fs/fs_fs.c:3762
+#: ../libsvn_fs_fs/fs_fs.c:3776
msgid "Header end not found"
msgstr "Slutet på datahuvudet hittades ej"
-#: ../libsvn_fs_fs/fs_fs.c:3790
+#: ../libsvn_fs_fs/fs_fs.c:3804
msgid "Packed revprop size exceeds pack file size"
msgstr "Packad revisionsegenskap större än packfilen"
-#: ../libsvn_fs_fs/fs_fs.c:3849
+#: ../libsvn_fs_fs/fs_fs.c:3863
#, c-format
msgid "No such packed revision %ld"
msgstr "Packade revisionen %ld finns inte"
-#: ../libsvn_fs_fs/fs_fs.c:3889
-#, c-format
+#: ../libsvn_fs_fs/fs_fs.c:3903
+#, fuzzy, c-format
msgid "Failed to read revprop pack file for r%ld"
-msgstr "Kunde inte läsa packfilen för revisionsegenskaper för r%ld"
+msgstr "Kunde inte läsa packfilen för revisionsegenskaper för revision %ld"
-#: ../libsvn_fs_fs/fs_fs.c:3896
-#, c-format
+#: ../libsvn_fs_fs/fs_fs.c:3910
+#, fuzzy, c-format
msgid "Revprop pack file for r%ld is corrupt"
-msgstr "Trasig packfil för revisionsegenskaper för r%ld"
+msgstr "Trasig packfil för revisionsegenskaper för revision %ld"
-#: ../libsvn_fs_fs/fs_fs.c:3969
+#: ../libsvn_fs_fs/fs_fs.c:3983
#, c-format
msgid "Could not read revprops for revision %ld"
msgstr "Kunde inte läsa revisionsegenskaper för revision %ld"
-#: ../libsvn_fs_fs/fs_fs.c:4198
+#: ../libsvn_fs_fs/fs_fs.c:4208
#, c-format
msgid "Packed file '%s' misses a tag"
msgstr "Packad fil \"%s\" saknar en etikett"
-#: ../libsvn_fs_fs/fs_fs.c:4536
+#: ../libsvn_fs_fs/fs_fs.c:4545
msgid "Malformed svndiff data in representation"
msgstr "Felaktigt svndiff-data i representation"
-#: ../libsvn_fs_fs/fs_fs.c:4972 ../libsvn_fs_fs/fs_fs.c:4991
+#: ../libsvn_fs_fs/fs_fs.c:4981 ../libsvn_fs_fs/fs_fs.c:5000
msgid "Reading one svndiff window read beyond the end of the representation"
msgstr "Hamnade efter slutet på representationen vid läsning av ett svndiff-fönster"
-#: ../libsvn_fs_fs/fs_fs.c:5079
+#: ../libsvn_fs_fs/fs_fs.c:5090
msgid "svndiff window length is corrupt"
msgstr "Fönsterlängd i svndiff är trasig"
-#: ../libsvn_fs_fs/fs_fs.c:5247
+#: ../libsvn_fs_fs/fs_fs.c:5258
msgid "Checksum mismatch while reading representation"
msgstr "Felaktig kontrollsumma vid läsning av representation"
-#: ../libsvn_fs_fs/fs_fs.c:5610 ../libsvn_fs_fs/fs_fs.c:5624
-#: ../libsvn_fs_fs/fs_fs.c:5631
+#: ../libsvn_fs_fs/fs_fs.c:5621 ../libsvn_fs_fs/fs_fs.c:5635
+#: ../libsvn_fs_fs/fs_fs.c:5642
#, c-format
msgid "Directory entry corrupt in '%s'"
msgstr "Katalogpost trasig i \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:6109 ../libsvn_fs_fs/fs_fs.c:6114
-#: ../libsvn_fs_fs/fs_fs.c:6120 ../libsvn_fs_fs/fs_fs.c:6137
-#: ../libsvn_fs_fs/fs_fs.c:6170 ../libsvn_fs_fs/fs_fs.c:6190
-#: ../libsvn_fs_fs/fs_fs.c:6225 ../libsvn_fs_fs/fs_fs.c:6230
+#: ../libsvn_fs_fs/fs_fs.c:6120 ../libsvn_fs_fs/fs_fs.c:6125
+#: ../libsvn_fs_fs/fs_fs.c:6131 ../libsvn_fs_fs/fs_fs.c:6148
+#: ../libsvn_fs_fs/fs_fs.c:6181 ../libsvn_fs_fs/fs_fs.c:6201
+#: ../libsvn_fs_fs/fs_fs.c:6236 ../libsvn_fs_fs/fs_fs.c:6241
msgid "Invalid changes line in rev-file"
msgstr "Ogiltig changes-rad i rev-fil"
-#: ../libsvn_fs_fs/fs_fs.c:6163
+#: ../libsvn_fs_fs/fs_fs.c:6174
msgid "Invalid change kind in rev file"
msgstr "Ogiltig ändringstyp i rev-fil"
-#: ../libsvn_fs_fs/fs_fs.c:6183
+#: ../libsvn_fs_fs/fs_fs.c:6194
msgid "Invalid text-mod flag in rev-file"
msgstr "Ogiltig text-mod-flagga i rev-fil"
-#: ../libsvn_fs_fs/fs_fs.c:6203
+#: ../libsvn_fs_fs/fs_fs.c:6214
msgid "Invalid prop-mod flag in rev-file"
msgstr "Ogiltig prop-mod-flagga i rev-fil"
-#: ../libsvn_fs_fs/fs_fs.c:6461
+#: ../libsvn_fs_fs/fs_fs.c:6472
msgid "Copying from transactions not allowed"
msgstr "Det är inte tillåtet att kopiera från transaktioner"
-#: ../libsvn_fs_fs/fs_fs.c:6594
+#: ../libsvn_fs_fs/fs_fs.c:6601
#, c-format
msgid "Unable to create transaction directory in '%s' for revision %ld"
msgstr "Kan inte skapa transaktionskatalog i \"%s\" för revision %ld"
-#: ../libsvn_fs_fs/fs_fs.c:6659
+#: ../libsvn_fs_fs/fs_fs.c:6666
msgid "Internal error: a null transaction id was passed to get_txn_proplist()"
msgstr "Internt fel: transaktions-id:t noll gavs till get_txn_proplist"
-#: ../libsvn_fs_fs/fs_fs.c:6818 ../libsvn_fs_fs/fs_fs.c:6825
+#: ../libsvn_fs_fs/fs_fs.c:6819 ../libsvn_fs_fs/fs_fs.c:6826
msgid "next-id file corrupt"
msgstr "next-id-filen är trasig"
-#: ../libsvn_fs_fs/fs_fs.c:6921
+#: ../libsvn_fs_fs/fs_fs.c:6922
#, c-format
msgid "Transaction '%s' cleanup failed"
msgstr "Städning efter transaktion \"%s\" misslyckades"
-#: ../libsvn_fs_fs/fs_fs.c:7061
+#: ../libsvn_fs_fs/fs_fs.c:7062
#, c-format
msgid "Invalid change type %d"
msgstr "Ogiltig ändringstyp %d"
-#: ../libsvn_fs_fs/fs_fs.c:7649
+#: ../libsvn_fs_fs/fs_fs.c:7656
msgid "Can't set text contents of a directory"
msgstr "Kan inte sätta textinnehåll i en katalog"
-#: ../libsvn_fs_fs/fs_fs.c:7735 ../libsvn_fs_fs/fs_fs.c:7740
-#: ../libsvn_fs_fs/fs_fs.c:7747
+#: ../libsvn_fs_fs/fs_fs.c:7742 ../libsvn_fs_fs/fs_fs.c:7747
+#: ../libsvn_fs_fs/fs_fs.c:7754
msgid "Corrupt 'current' file"
msgstr "Trasig \"current\"-fil"
-#: ../libsvn_fs_fs/fs_fs.c:8007
+#: ../libsvn_fs_fs/fs_fs.c:8014
#, c-format
msgid "predecessor count for the root node-revision is wrong: found (%d+%ld != %d), committing r%ld"
msgstr "föregångarräknaren för rotnodsrevisionen är felaktig: %d+%ld != %d hittades, arkiverar r%ld"
-#: ../libsvn_fs_fs/fs_fs.c:8142
+#: ../libsvn_fs_fs/fs_fs.c:8149
msgid "Truncated protorev file detected"
msgstr "Avhuggen protorev-fil upptäcktes"
-#: ../libsvn_fs_fs/fs_fs.c:8542
+#: ../libsvn_fs_fs/fs_fs.c:8529
msgid "Transaction out of date"
msgstr "Transaktionen är inaktuell"
-#: ../libsvn_fs_fs/fs_fs.c:9036
+#: ../libsvn_fs_fs/fs_fs.c:9026
msgid "Recovery encountered a non-directory node"
msgstr "En nod som ej är katalog påträffades vid återställning"
-#: ../libsvn_fs_fs/fs_fs.c:9058
+#: ../libsvn_fs_fs/fs_fs.c:9048
msgid "Recovery encountered a deltified directory representation"
msgstr "En deltafierad katalogrepresentation påträffades vid återställning"
-#: ../libsvn_fs_fs/fs_fs.c:9094 ../libsvn_fs_fs/fs_fs.c:9103
-#: ../libsvn_fs_fs/fs_fs.c:9109
+#: ../libsvn_fs_fs/fs_fs.c:9084 ../libsvn_fs_fs/fs_fs.c:9093
+#: ../libsvn_fs_fs/fs_fs.c:9099
msgid "Directory entry corrupt"
msgstr "Katalogpost trasig"
-#: ../libsvn_fs_fs/fs_fs.c:9282
+#: ../libsvn_fs_fs/fs_fs.c:9272
#, c-format
msgid "Expected current rev to be <= %ld but found %ld"
msgstr "Den aktuella revisionen förväntades vara högst %ld men är %ld"
-#: ../libsvn_fs_fs/fs_fs.c:9339
+#: ../libsvn_fs_fs/fs_fs.c:9329
#, c-format
msgid "Revision %ld has a revs file but no revprops file"
msgstr "Revision %ld har en revisionsfil men ingen revisionsegenskapsfil "
-#: ../libsvn_fs_fs/fs_fs.c:9346
+#: ../libsvn_fs_fs/fs_fs.c:9336
#, c-format
msgid "Revision %ld has a revs file but the revprops file is inaccessible"
msgstr "Revision %ld har en revisionsfil men revisionsegenskapsfilen är oåtkomlig"
-#: ../libsvn_fs_fs/fs_fs.c:9355
+#: ../libsvn_fs_fs/fs_fs.c:9345
#, c-format
msgid "Revision %ld has a non-file where its revprops file should be"
msgstr "Revision %ld har något som inte är en fil där dess revisionsegenskapsfil borde vara"
-#: ../libsvn_fs_fs/fs_fs.c:9533
+#: ../libsvn_fs_fs/fs_fs.c:9518
#, c-format
msgid "Node origin for '%s' exists with a different value (%s) than what we were about to store (%s)"
msgstr "Nodursprunget för \"%s\" finns med ett annat värde (%s) än vad som just skulle lagras (%s)"
-#: ../libsvn_fs_fs/fs_fs.c:9639
+#: ../libsvn_fs_fs/fs_fs.c:9624
#, c-format
msgid "No such transaction '%s'"
msgstr "Transaktionen \"%s\" finns inte"
-#: ../libsvn_fs_fs/fs_fs.c:10356
+#: ../libsvn_fs_fs/fs_fs.c:10361
#, c-format
msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
msgstr "FSFS-formatet (%d) är för gammalt för att packas; var god uppgradera filsystemet."
-#: ../libsvn_fs_fs/fs_fs.c:10635 ../libsvn_subr/io.c:248
+#: ../libsvn_fs_fs/fs_fs.c:10640 ../libsvn_subr/io.c:272
#, c-format
msgid "Error converting entry in directory '%s' to UTF-8"
msgstr "Fel vid omvandling av en post i katalogen \"%s\" till UTF-8"
-#: ../libsvn_fs_fs/fs_fs.c:10672 ../libsvn_subr/io.c:1021
+#: ../libsvn_fs_fs/fs_fs.c:10677 ../libsvn_subr/io.c:1047
#, c-format
msgid "Source '%s' is not a directory"
msgstr "Källan \"%s\" är ingen katalog"
-#: ../libsvn_fs_fs/fs_fs.c:10678 ../libsvn_subr/io.c:1027
+#: ../libsvn_fs_fs/fs_fs.c:10683 ../libsvn_subr/io.c:1053
#, c-format
msgid "Destination '%s' is not a directory"
msgstr "Destinationen \"%s\" är ingen katalog"
-#: ../libsvn_fs_fs/fs_fs.c:10750 ../libsvn_subr/io.c:1104
-#: ../libsvn_subr/io.c:2485
+#: ../libsvn_fs_fs/fs_fs.c:10755 ../libsvn_subr/io.c:1130
+#: ../libsvn_subr/io.c:2633
#, c-format
msgid "Can't read directory '%s'"
msgstr "Kan inte läsa katalogen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:10755 ../libsvn_subr/io.c:1109
-#: ../libsvn_subr/io.c:2490 ../libsvn_subr/io.c:3995
+#: ../libsvn_fs_fs/fs_fs.c:10760 ../libsvn_subr/io.c:1135
+#: ../libsvn_subr/io.c:2638 ../libsvn_subr/io.c:4310
#, c-format
msgid "Error closing directory '%s'"
msgstr "Fel vid stängning av katalogen \"%s\""
-#: ../libsvn_fs_fs/fs_fs.c:11038
+#: ../libsvn_fs_fs/fs_fs.c:11000
#, c-format
msgid "The FSFS format (%d) of the hotcopy source does not match the FSFS format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
msgstr "FSFS-formatet (%d) hos källan till en kopia under drift motsvarar inte FSFS-formatet (%d) hos målet; var god uppgradera bägge arkiven till samma format"
-#: ../libsvn_fs_fs/fs_fs.c:11047
+#: ../libsvn_fs_fs/fs_fs.c:11009
msgid "The UUID of the hotcopy source does not match the UUID of the hotcopy destination"
msgstr "UUID:n för källan till en kopia under drift motsvarar inte UUID:n för målet"
-#: ../libsvn_fs_fs/fs_fs.c:11054
+#: ../libsvn_fs_fs/fs_fs.c:11016
msgid "The sharding layout configuration of the hotcopy source does not match the sharding layout configuration of the hotcopy destination"
msgstr "Splittringsarrangemanget för källan till en kopia under drift motsvarar inte målets splittringsarrangemang"
-#: ../libsvn_fs_fs/fs_fs.c:11180
+#: ../libsvn_fs_fs/fs_fs.c:11121
#, c-format
msgid "Failed to create hotcopy at '%s'. The file '%s' is missing from the source repository. Please create this file, for instance by running 'svnadmin upgrade %s'"
msgstr "Misslyckades att skapa kopia under drift vid \"%s\". Filen \"%s\" saknades från källarkivet. Skapa denna fil, till exempel genom att köra \"svnadmin upgrade %s\""
-#: ../libsvn_fs_fs/fs_fs.c:11206
+#: ../libsvn_fs_fs/fs_fs.c:11147
#, c-format
msgid "The hotcopy destination already contains more revisions (%lu) than the hotcopy source contains (%lu); are source and destination swapped?"
msgstr "Målet för en kopia under drift innehåller redan fler revisioner (%lu) än källan gör (%lu); har källa och mål bytt plats?"
-#: ../libsvn_fs_fs/fs_fs.c:11242
+#: ../libsvn_fs_fs/fs_fs.c:11183
#, c-format
msgid "The hotcopy destination already contains more packed revisions (%lu) than the hotcopy source contains (%lu)"
msgstr "Målet för en kopia under drift innehåller redan fler packade revisioner (%lu) än källan gör (%lu)"
-#: ../libsvn_fs_fs/fs_fs.c:11355
+#: ../libsvn_fs_fs/fs_fs.c:11296
#, c-format
msgid "The assumed HEAD revision (%lu) of the hotcopy source has been packed while the hotcopy was in progress; please restart the hotcopy operation"
msgstr "Den förmodade huvudrevisionen (%lu) för källan till en kopia under drift packades medan kopieringen skedde; var god starta om kopieringen"
-#: ../libsvn_fs_fs/fs_fs.c:11370
+#: ../libsvn_fs_fs/fs_fs.c:11311
#, c-format
msgid "Revision %lu disappeared from the hotcopy source while hotcopy was in progress"
msgstr "Revision %lu försvann från källan till en kopiering under drift medan kopieringen skedde"
@@ -3962,22 +3953,22 @@ msgstr "Endast SHA1-kontrollsummor kan användas som nycklar i \"rep_cache\"-tab
msgid "Representation key for checksum '%%s' exists in filesystem '%%s' with a different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,%%%s,%%%s,%%%s)"
msgstr "En representationsnyckel för kontrollsumman \"%%s\" finns i filsystemet \"%%s\" med ett värde (%%ld,%%%s,%%%s,%%%s) som skiljer sig från det som skulle lagras (%%ld,%%%s,%%%s,%%%s)"
-#: ../libsvn_fs_fs/tree.c:2209 ../libsvn_subr/path.c:1233
+#: ../libsvn_fs_fs/tree.c:2241 ../libsvn_subr/path.c:1229
#, c-format
msgid "Invalid control character '0x%02x' in path '%s'"
msgstr "Ogiltigt kontrolltecken \"0x%02x\" i sökvägen \"%s\""
-#: ../libsvn_fs_fs/tree.c:3808
+#: ../libsvn_fs_fs/tree.c:3827
#, c-format
msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
msgstr "Nodrevision nr \"%s\" påstår sig ha sammanslagningsinformation men det har den inte"
-#: ../libsvn_fs_fs/tree.c:3924
+#: ../libsvn_fs_fs/tree.c:3943
#, c-format
msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
msgstr "Nodrevision \"%s@%ld\" påstår sig ha sammanslagningsinformation men det har den inte"
-#: ../libsvn_fs_fs/tree.c:4124
+#: ../libsvn_fs_fs/tree.c:4143
#, c-format
msgid "Querying mergeinfo requires version %d of the FSFS filesystem schema; filesystem '%s' uses only version %d"
msgstr "För att begära sammanslagningsinformation krävs version %d av FSFS-filsystemsschemat; filsystemet \"%s\" har bara version %d"
@@ -4011,7 +4002,7 @@ msgid "Invalid peg revision %ld"
msgstr "Ogiltig fixerad revision %ld"
#: ../libsvn_ra/compat.c:846 ../libsvn_ra/ra_loader.c:1294
-#: ../libsvn_repos/rev_hunt.c:214 ../libsvn_repos/rev_hunt.c:329
+#: ../libsvn_repos/rev_hunt.c:210 ../libsvn_repos/rev_hunt.c:325
#, c-format
msgid "Invalid end revision %ld"
msgstr "Ogiltig slutrevision %ld"
@@ -4025,7 +4016,7 @@ msgstr "Fixerad revision måste komma före slutrevisionen"
msgid "Mismatched RA version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "Versioner stämmer ej i insticksmodulen \"%s\" för RA: hittade %d.%d.%d%s, väntade %d.%d.%d%s"
-#: ../libsvn_ra/ra_loader.c:292 ../libsvn_ra_serf/serf.c:594
+#: ../libsvn_ra/ra_loader.c:292 ../libsvn_ra_serf/serf.c:571
#, c-format
msgid "Illegal repository URL '%s'"
msgstr "Ogiltig arkiv-URL \"%s\""
@@ -4055,7 +4046,7 @@ msgstr "\"%s\" är inte i samma arkiv som \"%s\""
msgid "'%s' isn't a child of session URL '%s'"
msgstr "\"%s\" är inget barn i sessions-URL:en \"%s\""
-#: ../libsvn_ra/ra_loader.c:580 ../libsvn_ra_svn/client.c:2465
+#: ../libsvn_ra/ra_loader.c:580 ../libsvn_ra_svn/client.c:2466
#, c-format
msgid "'%s' isn't a child of repository root URL '%s'"
msgstr "\"%s\" är inget barn i arkivrots-URL:en \"%s\""
@@ -4104,38 +4095,38 @@ msgstr "Det gick inte att ta reda på det lokala värdnamnet"
msgid "Couldn't get lock on destination repos after %d attempts"
msgstr "Kunde inte låsa destinationsarkivet efter %d försök"
-#: ../libsvn_ra_local/ra_plugin.c:162
+#: ../libsvn_ra_local/ra_plugin.c:161
msgid "memory-cache-size invalid"
msgstr "Ogiltig \"memory-cache-size\""
#. ----------------------------------------------------------------
#. ** The RA vtable routines **
-#: ../libsvn_ra_local/ra_plugin.c:503
+#: ../libsvn_ra_local/ra_plugin.c:502
msgid "Module for accessing a repository on local disk."
msgstr "Modul för åtkomst av arkiv på disk lokalt."
-#: ../libsvn_ra_local/ra_plugin.c:579
+#: ../libsvn_ra_local/ra_plugin.c:583
msgid "Unable to open an ra_local session to URL"
msgstr "Kunde inte öppna en ra_local-session till URL:en"
-#: ../libsvn_ra_local/ra_plugin.c:612 ../libsvn_ra_serf/serf.c:586
+#: ../libsvn_ra_local/ra_plugin.c:628 ../libsvn_ra_serf/serf.c:563
#, c-format
msgid "URL '%s' is not a child of the session's repository root URL '%s'"
msgstr "URL:en \"%s\" är inte ett barn av sessionens arkivrots-URL \"%s\""
-#: ../libsvn_ra_local/ra_plugin.c:1140 ../libsvn_ra_local/ra_plugin.c:1597
-#: ../libsvn_ra_serf/util.c:2476
+#: ../libsvn_ra_local/ra_plugin.c:1158 ../libsvn_ra_local/ra_plugin.c:1615
+#: ../libsvn_ra_serf/util.c:2426
#, c-format
msgid "'%s' path not found"
msgstr "Sökvägen \"%s\" finns inte"
-#: ../libsvn_ra_local/ra_plugin.c:1539 ../libsvn_ra_serf/options.c:675
-#: ../libsvn_ra_svn/client.c:2666
+#: ../libsvn_ra_local/ra_plugin.c:1557 ../libsvn_ra_serf/options.c:675
+#: ../libsvn_ra_svn/client.c:2667
#, c-format
msgid "Don't know anything about capability '%s'"
msgstr "Okänd förmåga \"%s\""
-#: ../libsvn_ra_local/ra_plugin.c:1745
+#: ../libsvn_ra_local/ra_plugin.c:1763
#, c-format
msgid "Unsupported RA loader version (%d) for ra_local"
msgstr "Versionen för RA-laddaren (%d) stöds ej för ra_local"
@@ -4158,76 +4149,76 @@ msgstr "Inget \"Location\"-huvud mottaget"
msgid "Error parsing Location header value"
msgstr "Syntaxfel i \"Location\"-huvudets värde"
-#: ../libsvn_ra_serf/commit.c:439
+#: ../libsvn_ra_serf/commit.c:431
#, c-format
msgid "Directory '%s' is out of date; try updating"
msgstr "Katalogen \"%s\" är inaktuell; försök att uppdatera"
-#: ../libsvn_ra_serf/commit.c:527 ../libsvn_repos/commit.c:512
+#: ../libsvn_ra_serf/commit.c:519 ../libsvn_repos/commit.c:512
#, c-format
msgid "Path '%s' not present"
msgstr "Sökvägen \"%s\" finns inte"
-#: ../libsvn_ra_serf/commit.c:577
+#: ../libsvn_ra_serf/commit.c:569
#, c-format
msgid "File '%s' is out of date; try updating"
msgstr "Filen \"%s\" är inaktuell; försök att uppdatera"
-#: ../libsvn_ra_serf/commit.c:979
+#: ../libsvn_ra_serf/commit.c:971
msgid "At least one property change failed; repository is unchanged"
msgstr "Åtminstone en egenskapsändring misslyckades; arkivet är oförändrat"
-#: ../libsvn_ra_serf/commit.c:1179
+#: ../libsvn_ra_serf/commit.c:1171
#, c-format
msgid "Failed writing updated file"
msgstr "MIsslyckades att skriva uppdaterad fil"
-#: ../libsvn_ra_serf/commit.c:1367 ../libsvn_ra_serf/commit.c:1457
+#: ../libsvn_ra_serf/commit.c:1359 ../libsvn_ra_serf/commit.c:1449
#, c-format
msgid "%s of '%s': %d %s (%s://%s)"
msgstr "%s av \"%s\": %d %s (%s://%s)"
-#: ../libsvn_ra_serf/commit.c:1377
+#: ../libsvn_ra_serf/commit.c:1369
#, c-format
msgid "POST request did not return transaction information"
msgstr "POST-begäran gav ingen transaktionsinformation"
-#: ../libsvn_ra_serf/commit.c:1421
+#: ../libsvn_ra_serf/commit.c:1413
msgid "The OPTIONS response did not include the requested activity-collection-set value"
msgstr "OPTIONS-svaret innehöll inte det efterfrågade värdet på \"activity-collection-set\""
-#: ../libsvn_ra_serf/commit.c:1686 ../libsvn_ra_serf/commit.c:2084
-#: ../libsvn_ra_serf/update.c:2631
+#: ../libsvn_ra_serf/commit.c:1678 ../libsvn_ra_serf/commit.c:2076
+#: ../libsvn_ra_serf/update.c:2694
#, c-format
msgid "Unable to parse URL '%s'"
msgstr "Syntaxfel i URL:en \"%s\""
-#: ../libsvn_ra_serf/commit.c:1714 ../libsvn_ra_serf/util.c:2472
+#: ../libsvn_ra_serf/commit.c:1706 ../libsvn_ra_serf/util.c:2422
#, c-format
msgid "Access to '%s' forbidden"
msgstr "Åtkomst till \"%s\" ej tillåten"
-#: ../libsvn_ra_serf/commit.c:1718
+#: ../libsvn_ra_serf/commit.c:1710
#, c-format
msgid "Adding directory failed: %s on %s (%d %s)"
msgstr "Lägga till katalog misslyckades: %s på %s (%d %s)"
-#: ../libsvn_ra_serf/commit.c:1936
+#: ../libsvn_ra_serf/commit.c:1928
#, c-format
msgid "File '%s' already exists"
msgstr "Filen \"%s\" finns redan"
-#: ../libsvn_ra_serf/commit.c:2207
+#: ../libsvn_ra_serf/commit.c:2199
#, c-format
msgid "MERGE request failed: returned %d (during commit)"
msgstr "MERGE-begäran misslyckades: returnerade %d (under arkivering)"
-#: ../libsvn_ra_serf/commit.c:2281
+#: ../libsvn_ra_serf/commit.c:2273
#, c-format
msgid "DELETE returned unexpected status: %d"
msgstr "DELETE gav oväntad felkod: %d"
-#: ../libsvn_ra_serf/commit.c:2474
+#: ../libsvn_ra_serf/commit.c:2466
msgid "DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent"
msgstr "DAV-förfrågan misslyckades; arkivets krokskript före ändring av revisionsegenskap (\"pre-revprop-change\") kan ha misslyckats eller saknats"
@@ -4236,25 +4227,31 @@ msgstr "DAV-förfrågan misslyckades; arkivets krokskript före ändring av revi
msgid "'%s' REPORT not implemented"
msgstr "\"%s\" REPORT ej implementerad"
-#: ../libsvn_ra_serf/locks.c:234
+#: ../libsvn_ra_serf/inherited_props.c:171 ../libsvn_ra_serf/property.c:283
+#: ../libsvn_ra_serf/update.c:2469
+#, c-format
+msgid "Got unrecognized encoding '%s'"
+msgstr "Okänd kodning \"%s\""
+
+#: ../libsvn_ra_serf/locks.c:238
#, c-format
msgid "Lock request failed: %d %s"
msgstr "Låsförfrågan misslyckades: %d %s"
-#: ../libsvn_ra_serf/locks.c:414
+#: ../libsvn_ra_serf/locks.c:415
msgid "Malformed URL for repository"
msgstr "Felaktig URL för arkiv"
-#: ../libsvn_ra_serf/locks.c:420
+#: ../libsvn_ra_serf/locks.c:421
msgid "Server does not support locking features"
msgstr "Servern stöder ej funktionalitet för låsning"
-#: ../libsvn_ra_serf/locks.c:581
+#: ../libsvn_ra_serf/locks.c:582
#, c-format
msgid "'%s' is not locked in the repository"
msgstr "\"%s\" är inte låst i arkivet"
-#: ../libsvn_ra_serf/locks.c:632 ../libsvn_ra_serf/locks.c:638
+#: ../libsvn_ra_serf/locks.c:633 ../libsvn_ra_serf/locks.c:639
#, c-format
msgid "Unlock request failed: %d %s"
msgstr "Upplåsningsförfrågan misslyckades: %d %s"
@@ -4264,7 +4261,7 @@ msgstr "Upplåsningsförfrågan misslyckades: %d %s"
msgid "Unsupported encoding '%s'"
msgstr "Kodningen \"%s\" stöds ej"
-#: ../libsvn_ra_serf/log.c:568 ../libsvn_ra_svn/client.c:1577
+#: ../libsvn_ra_serf/log.c:568 ../libsvn_ra_svn/client.c:1588
msgid "Server does not support custom revprops via log"
msgstr "Servern stöder ej anpassade revisionsegenskaper via loggning"
@@ -4283,87 +4280,35 @@ msgstr "Kan inte hantera \"%s\" för förmåga \"%s\""
msgid "Attempt to fetch capability '%s' resulted in '%s'"
msgstr "Ett försök att hämta förmåga \"%s\" resulterade i \"%s\""
-#: ../libsvn_ra_serf/property.c:279 ../libsvn_ra_serf/update.c:2473
-#, c-format
-msgid "Got unrecognized encoding '%s'"
-msgstr "Okänd kodning \"%s\""
-
-#: ../libsvn_ra_serf/property.c:700
+#: ../libsvn_ra_serf/property.c:706
msgid "The PROPFIND response did not include the requested properties"
msgstr "PROPFIND-svaret innehöll inte de efterfrågade egenskaperna"
-#: ../libsvn_ra_serf/property.c:993
+#: ../libsvn_ra_serf/property.c:999
msgid "The PROPFIND response did not include the requested baseline-collection value"
msgstr "PROPFIND-svaret innehöll inte det efterfrågade värdet på \"baseline-collection\""
-#: ../libsvn_ra_serf/property.c:1005
+#: ../libsvn_ra_serf/property.c:1011
msgid "The PROPFIND response did not include the requested version-name value"
msgstr "PROPFIND-svaret innehöll inte det efterfrågade värdet på \"version-name\""
-#: ../libsvn_ra_serf/property.c:1043
+#: ../libsvn_ra_serf/property.c:1049
msgid "The OPTIONS response did not include the requested checked-in value"
msgstr "OPTIONS-svaret innehöll inte det efterfrågade värdet på \"checked-in\""
-#: ../libsvn_ra_serf/property.c:1125
+#: ../libsvn_ra_serf/property.c:1131
msgid "The OPTIONS response did not include the youngest revision"
msgstr "OPTIONS-svaret innehöll inte den yngsta revisionen"
-#: ../libsvn_ra_serf/property.c:1218
+#: ../libsvn_ra_serf/property.c:1224
msgid "The PROPFIND response did not include the requested resourcetype value"
msgstr "PROPFIND-svaret innehöll inte det efterfrågade värdet på \"resourcetype\""
-#: ../libsvn_ra_serf/property.c:1253
+#: ../libsvn_ra_serf/property.c:1259
msgid "The PROPFIND response did not include the requested 'DAV:' properties"
msgstr "PROPFIND-svaret innehöll inte de efterfrågade \"DAV:\"-egenskaperna"
-#: ../libsvn_ra_serf/replay.c:222 ../libsvn_ra_serf/update.c:1660
-msgid "Missing revision attr in target-revision element"
-msgstr "Attributet \"revision\" saknas på target-revision-elementet"
-
-#: ../libsvn_ra_serf/replay.c:240
-msgid "Missing revision attr in open-root element"
-msgstr "Attributet \"revision\" saknas på open-root-elementet"
-
-#: ../libsvn_ra_serf/replay.c:260 ../libsvn_ra_serf/update.c:1888
-msgid "Missing name attr in delete-entry element"
-msgstr "Attributet name saknas på delete-entry-elementet"
-
-#: ../libsvn_ra_serf/replay.c:266
-msgid "Missing revision attr in delete-entry element"
-msgstr "Attributet revision saknas på delete-entry-elementet"
-
-#: ../libsvn_ra_serf/replay.c:286 ../libsvn_ra_serf/update.c:1727
-msgid "Missing name attr in open-directory element"
-msgstr "Attributet name saknas på open-directory-elementet"
-
-#: ../libsvn_ra_serf/replay.c:292 ../libsvn_ra_serf/update.c:1678
-#: ../libsvn_ra_serf/update.c:1718
-msgid "Missing revision attr in open-directory element"
-msgstr "Attributet revision saknas på open-directory-elementet"
-
-#: ../libsvn_ra_serf/replay.c:312 ../libsvn_ra_serf/update.c:1765
-msgid "Missing name attr in add-directory element"
-msgstr "Attributet name saknas på add-directory-elementet"
-
-#: ../libsvn_ra_serf/replay.c:349 ../libsvn_ra_serf/update.c:1809
-msgid "Missing name attr in open-file element"
-msgstr "Attributet name saknas på open-file-elementet"
-
-#: ../libsvn_ra_serf/replay.c:355 ../libsvn_ra_serf/update.c:1818
-msgid "Missing revision attr in open-file element"
-msgstr "Attributet revision saknas på open-file-elementet"
-
-#: ../libsvn_ra_serf/replay.c:375 ../libsvn_ra_serf/update.c:1843
-msgid "Missing name attr in add-file element"
-msgstr "Attributet name saknas på add-file-elementet"
-
-#: ../libsvn_ra_serf/replay.c:443 ../libsvn_ra_serf/update.c:1984
-#: ../libsvn_ra_serf/update.c:2071
-#, c-format
-msgid "Missing name attr in %s element"
-msgstr "Attributet name saknas på %s-elementet"
-
-#: ../libsvn_ra_serf/replay.c:578
+#: ../libsvn_ra_serf/replay.c:474
msgid "Error writing stream: unexpected EOF"
msgstr "Fel vid skrivning till ström: oväntat filslut"
@@ -4375,171 +4320,172 @@ msgstr "Kunde inte läsa förfrågan"
msgid "Module for accessing a repository via WebDAV protocol using serf."
msgstr "Modul för åtkomst av arkiv via protokollet WebDAV med hjälp av serf."
-#: ../libsvn_ra_serf/serf.c:65
-#, c-format
-msgid ""
-"Module for accessing a repository via WebDAV protocol using serf.\n"
-" - using serf %d.%d.%d"
-msgstr ""
-"Modul för åtkomst av arkiv via protokollet WebDAV med hjälp av serf.\n"
-" - använder serf %d.%d.%d"
-
-#: ../libsvn_ra_serf/serf.c:129
+#: ../libsvn_ra_serf/serf.c:122
#, c-format
msgid "Invalid config: unknown %s '%s'"
msgstr "Felaktig konfiguration: okänd %s \"%s\""
-#: ../libsvn_ra_serf/serf.c:327
+#: ../libsvn_ra_serf/serf.c:316
msgid "Invalid config: illegal character in timeout value"
msgstr "Felaktig konfiguration: otillåtet tecken i timeout-värde"
-#: ../libsvn_ra_serf/serf.c:331
+#: ../libsvn_ra_serf/serf.c:320
msgid "Invalid config: negative timeout value"
msgstr "Felaktig konfiguration: negativt timeout-värde"
-#: ../libsvn_ra_serf/serf.c:344
+#: ../libsvn_ra_serf/serf.c:333
msgid "Invalid URL: illegal character in proxy port number"
msgstr "Felaktig URL: ogiltigt tecken i proxy-portnummer"
-#: ../libsvn_ra_serf/serf.c:348
+#: ../libsvn_ra_serf/serf.c:337
msgid "Invalid URL: negative proxy port number"
msgstr "Felaktig URL: negativt proxy-portnummer"
-#: ../libsvn_ra_serf/serf.c:351
+#: ../libsvn_ra_serf/serf.c:340
msgid "Invalid URL: proxy port number greater than maximum TCP port number 65535"
msgstr "Felaktig URL: portnummer för proxy större än det högsta TCP-portnumret 65535"
-#: ../libsvn_ra_serf/serf.c:371
+#: ../libsvn_ra_serf/serf.c:360
#, c-format
msgid "Could not resolve proxy server '%s'"
msgstr "Kunde inte slå upp proxy-servern \"%s\""
-#: ../libsvn_ra_serf/serf.c:474
+#: ../libsvn_ra_serf/serf.c:451
#, c-format
msgid "Illegal URL '%s'"
msgstr "Otillåten URL \"%s\""
-#: ../libsvn_ra_serf/serf.c:546
+#: ../libsvn_ra_serf/serf.c:523
#, c-format
msgid "Connection to '%s' failed"
msgstr "Anslutning till \"%s\" misslyckades"
-#: ../libsvn_ra_serf/serf.c:1216
+#: ../libsvn_ra_serf/serf.c:1193
msgid "The UUID property was not found on the resource or any of its parents"
msgstr "UUID-egenskapen hittades inte på resursen eller någon av dess föräldrar"
-#: ../libsvn_ra_serf/serf.c:1290
+#: ../libsvn_ra_serf/serf.c:1267
#, c-format
msgid "Unsupported RA loader version (%d) for ra_serf"
msgstr "Versionen för RA-laddaren (%d) stöds ej för ra_serf"
-#: ../libsvn_ra_serf/serf.c:1304
+#: ../libsvn_ra_serf/serf.c:1281
#, c-format
msgid "ra_serf was compiled for serf %d.%d.%d but loaded an incompatible %d.%d.%d library"
msgstr "ra_serf är kompilerad för serf %d.%d.%d men läste in ett inkompatibelt bibliotek med version %d.%d.%d"
-#: ../libsvn_ra_serf/update.c:1118
+#: ../libsvn_ra_serf/update.c:1114
#, c-format
msgid "GET request returned unexpected delta base: %s"
msgstr "GET-begäran gav oväntad deltabas: %s"
-#: ../libsvn_ra_serf/update.c:1136
+#: ../libsvn_ra_serf/update.c:1132
#, c-format
msgid "GET request failed: %d %s"
msgstr "GET-begäran misslyckades: %d %s"
-#: ../libsvn_ra_serf/update.c:1922
+#: ../libsvn_ra_serf/update.c:1656
+msgid "Missing revision attr in target-revision element"
+msgstr "Attributet \"revision\" saknas på target-revision-elementet"
+
+#: ../libsvn_ra_serf/update.c:1674 ../libsvn_ra_serf/update.c:1714
+msgid "Missing revision attr in open-directory element"
+msgstr "Attributet revision saknas på open-directory-elementet"
+
+#: ../libsvn_ra_serf/update.c:1723
+msgid "Missing name attr in open-directory element"
+msgstr "Attributet name saknas på open-directory-elementet"
+
+#: ../libsvn_ra_serf/update.c:1761
+msgid "Missing name attr in add-directory element"
+msgstr "Attributet name saknas på add-directory-elementet"
+
+#: ../libsvn_ra_serf/update.c:1805
+msgid "Missing name attr in open-file element"
+msgstr "Attributet name saknas på open-file-elementet"
+
+#: ../libsvn_ra_serf/update.c:1814
+msgid "Missing revision attr in open-file element"
+msgstr "Attributet revision saknas på open-file-elementet"
+
+#: ../libsvn_ra_serf/update.c:1839
+msgid "Missing name attr in add-file element"
+msgstr "Attributet name saknas på add-file-elementet"
+
+#: ../libsvn_ra_serf/update.c:1884
+msgid "Missing name attr in delete-entry element"
+msgstr "Attributet name saknas på delete-entry-elementet"
+
+#: ../libsvn_ra_serf/update.c:1918
msgid "Missing name attr in absent-directory element"
msgstr "Attributet name saknas på absent-directory-elementet"
-#: ../libsvn_ra_serf/update.c:1947
+#: ../libsvn_ra_serf/update.c:1943
msgid "Missing name attr in absent-file element"
msgstr "Attributet name saknas på absent-file-elementet"
-#: ../libsvn_ra_serf/update.c:2015 ../libsvn_ra_serf/update.c:2122
+#: ../libsvn_ra_serf/update.c:1980 ../libsvn_ra_serf/update.c:2067
+#, c-format
+msgid "Missing name attr in %s element"
+msgstr "Attributet name saknas på %s-elementet"
+
+#: ../libsvn_ra_serf/update.c:2011 ../libsvn_ra_serf/update.c:2118
#, c-format
msgid "Unknown tag '%s' while at state %d"
msgstr "Okänd etikett \"%s\" i tillstånd %d"
-#: ../libsvn_ra_serf/update.c:2190 ../libsvn_ra_serf/update.c:2314
-#: ../libsvn_ra_serf/update.c:2351
+#: ../libsvn_ra_serf/update.c:2186 ../libsvn_ra_serf/update.c:2310
+#: ../libsvn_ra_serf/update.c:2347
msgid "The REPORT or PROPFIND response did not include the requested checked-in value"
msgstr "Svaren till REPORT eller PROPFIND innehöll inte det efterfrågade \"checked-in\"-värdet"
-#: ../libsvn_ra_serf/update.c:2533
+#: ../libsvn_ra_serf/update.c:2529
#, c-format
msgid "Error writing to '%s': unexpected EOF"
msgstr "Fel vid skrivning till \"%s\": oväntat filslut"
-#: ../libsvn_ra_serf/update.c:2902
+#: ../libsvn_ra_serf/update.c:2981
msgid "Error retrieving REPORT"
msgstr "Fel vid hämtning av REPORT"
-#: ../libsvn_ra_serf/update.c:3111
+#: ../libsvn_ra_serf/update.c:3190
msgid "Missing update-report close tag"
msgstr "Slutetikett för \"update-report\" saknas"
-#: ../libsvn_ra_serf/update.c:3581
+#: ../libsvn_ra_serf/update.c:3668
msgid "Can't get text contents of a directory"
msgstr "Kan inte läsa en katalogs textinnehåll"
-#: ../libsvn_ra_serf/util.c:248
-msgid ": "
-msgstr ": "
-
-#: ../libsvn_ra_serf/util.c:250
-msgid ", "
-msgstr ", "
-
-#: ../libsvn_ra_serf/util.c:362
-msgid "Server SSL certificate verification failed"
-msgstr "Kontroll av SSL-certifikat för server misslyckades"
-
-#: ../libsvn_ra_serf/util.c:367
-msgid "certificate is not yet valid"
-msgstr "certifikatet är inte giltigt ännu"
-
-#: ../libsvn_ra_serf/util.c:370
-msgid "certificate has expired"
-msgstr "certifikatet har gått ut"
-
-#: ../libsvn_ra_serf/util.c:374
-msgid "certificate issued for a different hostname"
-msgstr "certifikatet utfärdat för ett annat datornamn"
-
-#: ../libsvn_ra_serf/util.c:378
-msgid "issuer is not trusted"
-msgstr "utfärdaren är inte betrodd"
-
-#: ../libsvn_ra_serf/util.c:381
-msgid "and other reason(s)"
-msgstr "och andra orsaker"
-
-#: ../libsvn_ra_serf/util.c:428
+#: ../libsvn_ra_serf/util.c:348
#, c-format
msgid "Invalid config: unable to load certificate file '%s'"
msgstr "Felaktig konfiguration: kan inte ladda certifikatfilen \"%s\""
-#: ../libsvn_ra_serf/util.c:860 ../libsvn_ra_serf/util.c:863
+#: ../libsvn_ra_serf/util.c:782 ../libsvn_ra_serf/util.c:785
msgid "Error running context"
msgstr "Fel vid körning av kontext"
-#: ../libsvn_ra_serf/util.c:1197 ../libsvn_ra_serf/util.c:1202
+#: ../libsvn_ra_serf/util.c:1119 ../libsvn_ra_serf/util.c:1124
#, c-format
msgid "Malformed DAV:status CDATA '%s'"
msgstr "Felaktig \"CDATA\" för \"DAV:status\": \"%s\""
-#: ../libsvn_ra_serf/util.c:1494
+#: ../libsvn_ra_serf/util.c:1421 ../libsvn_ra_serf/util.c:1524
#, c-format
msgid "XML parsing failed"
msgstr "XML-tolkning misslyckades"
-#: ../libsvn_ra_serf/util.c:1497
+#: ../libsvn_ra_serf/util.c:1424
#, c-format
msgid "XML parsing failed: (%d %s)"
msgstr "XML-tolkning misslyckades: (%d %s)"
-#: ../libsvn_ra_serf/util.c:1826
+#: ../libsvn_ra_serf/util.c:1711
+#, fuzzy
+msgid "The XML response contains invalid XML"
+msgstr "Svaret innehåller ogiltig XML"
+
+#: ../libsvn_ra_serf/util.c:1776
msgid ""
"No more credentials or we tried too many times.\n"
"Authentication failed"
@@ -4547,75 +4493,85 @@ msgstr ""
"Inga fler klientreferenser eller så försökte vi för många gånger.\n"
"Autentisering misslyckades"
-#: ../libsvn_ra_serf/util.c:1848
+#: ../libsvn_ra_serf/util.c:1798
msgid "Proxy authentication failed"
msgstr "Proxy-autentisering misslyckades"
-#: ../libsvn_ra_serf/util.c:1901
-#, c-format
+#: ../libsvn_ra_serf/util.c:1851
+#, fuzzy, c-format
msgid "%s request on '%s' failed"
-msgstr "%s-förfrågan på \"%s\" misslyckades"
+msgstr "%s-förfrågan på \"%s\" misslyckades: %d %s"
-#: ../libsvn_ra_serf/util.c:1973
+#: ../libsvn_ra_serf/util.c:1923
#, c-format
msgid "Premature EOF seen from server (http status=%d)"
msgstr "För tidigt filslut från server (HTTP-felkod %d)"
-#: ../libsvn_ra_serf/util.c:2042
+#: ../libsvn_ra_serf/util.c:1992
#, c-format
msgid "%s request on '%s' failed: %d %s"
msgstr "%s-förfrågan på \"%s\" misslyckades: %d %s"
-#: ../libsvn_ra_serf/util.c:2364
+#: ../libsvn_ra_serf/util.c:2314
msgid "The PROPFIND response did not include the requested version-controlled-configuration value"
msgstr "PROPFIND-svaret innehöll inte det efterfrågade värdet på \"version-controlled-configuration\""
-#: ../libsvn_ra_serf/util.c:2466
+#: ../libsvn_ra_serf/util.c:2416
#, c-format
msgid "Repository moved permanently to '%s'; please relocate"
msgstr "Arkivet har flyttats permanent till \"%s\"; vänligen omlokalisera"
-#: ../libsvn_ra_serf/util.c:2468
+#: ../libsvn_ra_serf/util.c:2418
#, c-format
msgid "Repository moved temporarily to '%s'; please relocate"
msgstr "Arkivet har flyttats temporärt till \"%s\"; vänligen omlokalisera"
-#: ../libsvn_ra_serf/util.c:2479
+#: ../libsvn_ra_serf/util.c:2429
#, c-format
msgid "'%s': no lock token available"
msgstr "\"%s\": ingen låsidentifierare tillgänglig"
-#: ../libsvn_ra_serf/util.c:2483
+#: ../libsvn_ra_serf/util.c:2433
#, c-format
msgid "DAV request failed: 411 Content length required. The server or an intermediate proxy does not accept chunked encoding. Try setting 'http-chunked-requests' to 'auto' or 'no' in your client configuration."
msgstr "DAV-begäran misslyckades: 411, innehållslängd krävs. Servern eller en mellanliggande proxy godtar inte styckvis kodning. Försök med att sätta \"http-chunked-requests\" till \"auto\" eller \"no\" i klientinställningarna."
-#: ../libsvn_ra_serf/util.c:2489
-#, c-format
-msgid "The requested feature is not supported by '%s'"
-msgstr "Den begärda funktionen stöds inte av \"%s\""
-
-#: ../libsvn_ra_serf/util.c:2495
+#: ../libsvn_ra_serf/util.c:2441
#, c-format
msgid "Unexpected HTTP status %d '%s' on '%s'\n"
msgstr "Oväntat HTTP-fel %d \"%s\" för \"%s\"\n"
-#: ../libsvn_ra_serf/util.c:2639
+#: ../libsvn_ra_serf/util.c:2616
#, c-format
msgid "The %s response contains invalid XML (%d %s)"
msgstr "Svaret på %s innehåller ogiltig XML (%d %s)"
-#: ../libsvn_ra_serf/xml.c:622
+#: ../libsvn_ra_serf/xml.c:469
+#, c-format
+msgid "XML stream truncated: closing '%s' missing"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:497
+#, fuzzy
+msgid "document element not found"
+msgstr "Slutet på datahuvudet hittades ej"
+
+#: ../libsvn_ra_serf/xml.c:500
+#, c-format
+msgid "XML stream truncated: %s"
+msgstr ""
+
+#: ../libsvn_ra_serf/xml.c:672
#, c-format
msgid "XML Parsing failed: Unexpected root element '%s'"
msgstr "XML-tolkning misslyckades: Oväntat rotelement \"%s\""
-#: ../libsvn_ra_serf/xml.c:682
-#, c-format
-msgid "Missing XML attribute: '%s'"
+#: ../libsvn_ra_serf/xml.c:733
+#, fuzzy, c-format
+msgid "Missing XML attribute '%s' on '%s' element"
msgstr "XML-attribut saknas: \"%s\""
-#: ../libsvn_ra_serf/xml.c:757
+#: ../libsvn_ra_serf/xml.c:808
msgid "The response contains invalid XML"
msgstr "Svaret innehåller ogiltig XML"
@@ -4721,116 +4677,116 @@ msgstr "Element med kataloglista är ingen lista"
msgid "Mergeinfo element is not a list"
msgstr "Element för sammanslagningsinformation är ej en lista"
-#: ../libsvn_ra_svn/client.c:1565
+#: ../libsvn_ra_svn/client.c:1576
msgid "Log entry not a list"
msgstr "Loggposten är ej en lista"
-#: ../libsvn_ra_svn/client.c:1612
+#: ../libsvn_ra_svn/client.c:1624
msgid "Changed-path entry not a list"
msgstr "Post med ändrade sökvägar är ingen lista"
-#: ../libsvn_ra_svn/client.c:1778
+#: ../libsvn_ra_svn/client.c:1779
msgid "'stat' not implemented"
msgstr "\"stat\" ej implementerat"
-#: ../libsvn_ra_svn/client.c:1837
+#: ../libsvn_ra_svn/client.c:1838
msgid "'get-locations' not implemented"
msgstr "\"get-locations\" ej implementerat"
-#: ../libsvn_ra_svn/client.c:1852
+#: ../libsvn_ra_svn/client.c:1853
msgid "Location entry not a list"
msgstr "Post med information om plats är ingen lista"
-#: ../libsvn_ra_svn/client.c:1891
+#: ../libsvn_ra_svn/client.c:1892
msgid "'get-location-segments' not implemented"
msgstr "\"get-location-segments\" ej implementerat"
-#: ../libsvn_ra_svn/client.c:1908
+#: ../libsvn_ra_svn/client.c:1909
msgid "Location segment entry not a list"
msgstr "Post med information om segmentplats är ingen lista"
-#: ../libsvn_ra_svn/client.c:1918
+#: ../libsvn_ra_svn/client.c:1919
msgid "Expected valid revision range"
msgstr "Väntade ett giltigt revisionsnummerintervall"
-#: ../libsvn_ra_svn/client.c:1959
+#: ../libsvn_ra_svn/client.c:1960
msgid "'get-file-revs' not implemented"
msgstr "\"get-file-revs\" ej implementerat"
-#: ../libsvn_ra_svn/client.c:1983
+#: ../libsvn_ra_svn/client.c:1984
msgid "Revision entry not a list"
msgstr "Revisionsposten är ej en lista"
-#: ../libsvn_ra_svn/client.c:2000 ../libsvn_ra_svn/client.c:2030
+#: ../libsvn_ra_svn/client.c:2001 ../libsvn_ra_svn/client.c:2031
msgid "Text delta chunk not a string"
msgstr "Textdeltadel är inte en sträng"
-#: ../libsvn_ra_svn/client.c:2042
+#: ../libsvn_ra_svn/client.c:2043
msgid "The get-file-revs command didn't return any revisions"
msgstr "get-file-revs-kommandot returnerade inga revisioner"
-#: ../libsvn_ra_svn/client.c:2089
+#: ../libsvn_ra_svn/client.c:2090
msgid "Server doesn't support the lock command"
msgstr "Servern stöder ej lock-kommandot"
-#: ../libsvn_ra_svn/client.c:2153
+#: ../libsvn_ra_svn/client.c:2154
msgid "Server doesn't support the unlock command"
msgstr "Servern stöder ej unlock-kommandot"
-#: ../libsvn_ra_svn/client.c:2251
+#: ../libsvn_ra_svn/client.c:2252
msgid "Lock response not a list"
msgstr "Svar på lock-kommandot är ingen lista"
-#: ../libsvn_ra_svn/client.c:2265
+#: ../libsvn_ra_svn/client.c:2266
msgid "Unknown status for lock command"
msgstr "Okänd statusindikering för lock-kommandot"
-#: ../libsvn_ra_svn/client.c:2289
+#: ../libsvn_ra_svn/client.c:2290
msgid "Didn't receive end marker for lock responses"
msgstr "Erhöll ingen slutmarkör i svaret på lock-kommandot"
-#: ../libsvn_ra_svn/client.c:2379
+#: ../libsvn_ra_svn/client.c:2380
msgid "Unlock response not a list"
msgstr "Svar på unlock-kommandot är ingen lista"
-#: ../libsvn_ra_svn/client.c:2393
+#: ../libsvn_ra_svn/client.c:2394
msgid "Unknown status for unlock command"
msgstr "Okänd statusindikation för unlock-kommandot"
-#: ../libsvn_ra_svn/client.c:2416
+#: ../libsvn_ra_svn/client.c:2417
msgid "Didn't receive end marker for unlock responses"
msgstr "Erhöll ingen slutmarkör i svaret på unlock-kommandot"
-#: ../libsvn_ra_svn/client.c:2440 ../libsvn_ra_svn/client.c:2492
+#: ../libsvn_ra_svn/client.c:2441 ../libsvn_ra_svn/client.c:2493
msgid "Server doesn't support the get-lock command"
msgstr "Servern stöder ej get-lock-kommandot"
-#: ../libsvn_ra_svn/client.c:2506
+#: ../libsvn_ra_svn/client.c:2507
msgid "Lock element not a list"
msgstr "Element med lås är ingen lista"
-#: ../libsvn_ra_svn/client.c:2549
+#: ../libsvn_ra_svn/client.c:2550
msgid "Server doesn't support the replay command"
msgstr "Servern stöder ej replay-kommandot"
-#: ../libsvn_ra_svn/client.c:2580
+#: ../libsvn_ra_svn/client.c:2581
msgid "Server doesn't support the replay-range command"
msgstr "Servern stöder ej replay-range-kommandot"
-#: ../libsvn_ra_svn/client.c:2598
+#: ../libsvn_ra_svn/client.c:2599
#, c-format
msgid "Expected 'revprops', found '%s'"
msgstr "Väntade \"revprops\", hittade \"%s\""
-#: ../libsvn_ra_svn/client.c:2615
+#: ../libsvn_ra_svn/client.c:2616
msgid "Error while replaying commit"
msgstr "Fel vid uppspelning av arkivering"
-#: ../libsvn_ra_svn/client.c:2688
+#: ../libsvn_ra_svn/client.c:2689
msgid "'get-deleted-rev' not implemented"
msgstr "\"get-deleted-rev\" ej implementerat"
-#: ../libsvn_ra_svn/client.c:2787
+#: ../libsvn_ra_svn/client.c:2788
#, c-format
msgid "Unsupported RA loader version (%d) for ra_svn"
msgstr "Versionen för RA-laddaren (%d) stöds ej för ra_svn"
@@ -4887,7 +4843,7 @@ msgstr "Apply-textdelta inte aktiv"
msgid "Command 'finish-replay' invalid outside of replays"
msgstr "Kommandot finish-replay ej tillåtet om replay inte är aktivt"
-#: ../libsvn_ra_svn/editorp.c:954 ../libsvn_ra_svn/marshal.c:1498
+#: ../libsvn_ra_svn/editorp.c:954 ../libsvn_ra_svn/marshal.c:1569
#, c-format
msgid "Unknown editor command '%s'"
msgstr "Okänt editor-kommando \"%s\""
@@ -4896,39 +4852,44 @@ msgstr "Okänt editor-kommando \"%s\""
msgid "Can't get password"
msgstr "Kan inte erhålla lösenord"
-#: ../libsvn_ra_svn/marshal.c:151
+#: ../libsvn_ra_svn/marshal.c:165
msgid "Capability entry is not a word"
msgstr "Capability-post är inte ett ord"
-#: ../libsvn_ra_svn/marshal.c:941
+#: ../libsvn_ra_svn/marshal.c:965
msgid "String length larger than maximum"
msgstr "Stränglängden är större än vad som maximalt är tillåtet"
-#: ../libsvn_ra_svn/marshal.c:1007
-msgid "Too many nested items"
-msgstr "För många nästlade objekt"
+#: ../libsvn_ra_svn/marshal.c:1032
+msgid "Items are nested too deeply"
+msgstr ""
-#: ../libsvn_ra_svn/marshal.c:1027 ../libsvn_ra_svn/marshal.c:1105
+#: ../libsvn_ra_svn/marshal.c:1053 ../libsvn_ra_svn/marshal.c:1172
msgid "Number is larger than maximum"
msgstr "Talet är större än vad som maximalt är tillåtet"
-#: ../libsvn_ra_svn/marshal.c:1133
+#: ../libsvn_ra_svn/marshal.c:1084
+#, fuzzy
+msgid "Word is too long"
+msgstr "För långt ord"
+
+#: ../libsvn_ra_svn/marshal.c:1200
msgid "Word too long"
msgstr "För långt ord"
-#: ../libsvn_ra_svn/marshal.c:1351
+#: ../libsvn_ra_svn/marshal.c:1430
msgid "Proplist element not a list"
msgstr "Element med egenskaper är ingen lista"
-#: ../libsvn_ra_svn/marshal.c:1390
+#: ../libsvn_ra_svn/marshal.c:1469
msgid "Empty error list"
msgstr "Tom fellista"
-#: ../libsvn_ra_svn/marshal.c:1399 ../libsvn_ra_svn/marshal.c:1425
+#: ../libsvn_ra_svn/marshal.c:1478 ../libsvn_ra_svn/marshal.c:1504
msgid "Malformed error list"
msgstr "Felaktig lista med information om fel"
-#: ../libsvn_ra_svn/marshal.c:1454
+#: ../libsvn_ra_svn/marshal.c:1533
#, c-format
msgid "Unknown status '%s' in command response"
msgstr "Okänd status \"%s\" i kommandorespons"
@@ -5005,7 +4966,7 @@ msgstr ""
"%s"
#: ../libsvn_repos/commit.c:1255 ../libsvn_repos/fs-wrap.c:98
-#: ../libsvn_repos/load-fs-vtable.c:978
+#: ../libsvn_repos/load-fs-vtable.c:990
msgid "Commit succeeded, but post-commit hook failed"
msgstr "Arkiveringen lyckades, men krokskriptet efter arkivering (\"post-commit\") misslyckades"
@@ -5013,29 +4974,29 @@ msgstr "Arkiveringen lyckades, men krokskriptet efter arkivering (\"post-commit\
msgid "Unable to open root of edit"
msgstr "Kunde inte öppna rot för editering"
-#: ../libsvn_repos/delta.c:247
+#: ../libsvn_repos/delta.c:237
msgid "Invalid target path"
msgstr "Ogiltig målsökväg"
-#: ../libsvn_repos/delta.c:251
+#: ../libsvn_repos/delta.c:241
msgid "Delta depth 'exclude' not supported"
msgstr "Delta-djupet \"exclude\" stöds ej"
-#: ../libsvn_repos/delta.c:277
+#: ../libsvn_repos/delta.c:267
msgid "Invalid editor anchoring; at least one of the input paths is not a directory and there was no source entry"
msgstr "Editeringen börjar på ett ogiltigt ställe; minst en av sökvägarna är ingen katalog och det fanns ingen källpost"
-#: ../libsvn_repos/deprecated.c:614 ../svnadmin/svnadmin.c:780
+#: ../libsvn_repos/deprecated.c:614 ../svnadmin/svnadmin.c:838
#, c-format
msgid "* Dumped revision %ld.\n"
msgstr "* Dumpade revision %ld.\n"
-#: ../libsvn_repos/deprecated.c:620 ../svnadmin/svnadmin.c:786
+#: ../libsvn_repos/deprecated.c:620 ../svnadmin/svnadmin.c:844
#, c-format
msgid "* Verified revision %ld.\n"
msgstr "* Verifierade revision %ld.\n"
-#: ../libsvn_repos/deprecated.c:628 ../svnadmin/svnadmin.c:834
+#: ../libsvn_repos/deprecated.c:628 ../svnadmin/svnadmin.c:892
#, c-format
msgid ""
"\n"
@@ -5046,7 +5007,7 @@ msgstr ""
"------- Arkiverade revision %ld >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:634 ../svnadmin/svnadmin.c:840
+#: ../libsvn_repos/deprecated.c:634 ../svnadmin/svnadmin.c:898
#, c-format
msgid ""
"\n"
@@ -5057,36 +5018,36 @@ msgstr ""
"------- Arkiverade ny revision %ld (från originalrevisionen %ld) >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:853
+#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:911
#, c-format
msgid " * editing path : %s ..."
msgstr " * editerar sökvägen: %s ..."
-#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:859
+#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:917
#, c-format
msgid " * deleting path : %s ..."
msgstr " * raderar sökvägen: %s ..."
-#: ../libsvn_repos/deprecated.c:659 ../svnadmin/svnadmin.c:865
+#: ../libsvn_repos/deprecated.c:659 ../svnadmin/svnadmin.c:923
#, c-format
msgid " * adding path : %s ..."
msgstr " * lägger till sökvägen: %s ..."
-#: ../libsvn_repos/deprecated.c:665 ../svnadmin/svnadmin.c:871
+#: ../libsvn_repos/deprecated.c:665 ../svnadmin/svnadmin.c:929
#, c-format
msgid " * replacing path : %s ..."
msgstr " * ersätter sökvägen: %s ..."
-#: ../libsvn_repos/deprecated.c:675 ../svnadmin/svnadmin.c:881
+#: ../libsvn_repos/deprecated.c:675 ../svnadmin/svnadmin.c:938
msgid " done.\n"
msgstr " klart.\n"
-#: ../libsvn_repos/deprecated.c:685 ../svnadmin/svnadmin.c:891
+#: ../libsvn_repos/deprecated.c:685 ../svnadmin/svnadmin.c:947
#, c-format
msgid "<<< Started new transaction, based on original revision %ld\n"
msgstr "<<< Startade ny transaktion, baserad på originalrevisionen %ld\n"
-#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:904
+#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:960
#, c-format
msgid " removing '\\r' from %s ..."
msgstr " tar bort \"\\r\" från %s ..."
@@ -5106,29 +5067,34 @@ msgstr "Refererar till data i revision %ld, vilken är äldre än den äldsta du
msgid "Mergeinfo referencing revision(s) prior to the oldest dumped revision (r%ld). Loading this dump may result in invalid mergeinfo."
msgstr "Sammanslagningsinformation refererar till revision(er) före den äldsta dumpade revisionen (r%ld). Ett försök att läsa in denna dump kan leda till inkorrekt sammanslagningsinformation."
-#: ../libsvn_repos/dump.c:1124 ../libsvn_repos/dump.c:1416
+#: ../libsvn_repos/dump.c:1124 ../libsvn_repos/dump.c:1459
#, c-format
msgid "Start revision %ld is greater than end revision %ld"
msgstr "Startrevisionen %ld är större än slutrevisionen %ld"
-#: ../libsvn_repos/dump.c:1129 ../libsvn_repos/dump.c:1421
+#: ../libsvn_repos/dump.c:1129 ../libsvn_repos/dump.c:1464
#, c-format
msgid "End revision %ld is invalid (youngest revision is %ld)"
msgstr "Slutrevisionen %ld är ogiltig (den yngsta revisionen är %ld)"
-#: ../libsvn_repos/dump.c:1267
+#: ../libsvn_repos/dump.c:1242
msgid "The range of revisions dumped contained references to copy sources outside that range."
msgstr "De dumpade revisionerna innehöll referenser till kopior med källa utanför det revisionsområdet."
-#: ../libsvn_repos/dump.c:1281
+#: ../libsvn_repos/dump.c:1256
msgid "The range of revisions dumped contained mergeinfo which reference revisions outside that range."
msgstr "De dumpade revisionerna innehöll sammanslagningsinformation med referenser till revisioner utanför det revisionsområdet."
-#: ../libsvn_repos/dump.c:1340
+#: ../libsvn_repos/dump.c:1315
#, c-format
msgid "Unexpected node kind %d for '%s'"
msgstr "Oväntad nodtyp %d för \"%s\""
+#: ../libsvn_repos/dump.c:1495 ../libsvn_repos/dump.c:1547
+#, fuzzy, c-format
+msgid "Repository '%s' failed to verify"
+msgstr "Arkivet har flyttats"
+
#: ../libsvn_repos/fs-wrap.c:183
#, c-format
msgid "Storage of non-regular property '%s' is disallowed through the repository interface, and could indicate a bug in your client"
@@ -5246,12 +5212,12 @@ msgid ""
"ask the administrator to create a pre-revprop-change hook"
msgstr "Ändring av revisionsegenskaper är ej påslaget i arkivet; be förvaltaren skapa krokskriptet \"pre-revprop-change\""
-#: ../libsvn_repos/load-fs-vtable.c:565 ../svnrdump/load_editor.c:766
+#: ../libsvn_repos/load-fs-vtable.c:569 ../svnrdump/load_editor.c:766
#, c-format
msgid "Relative source revision %ld is not available in current repository"
msgstr "Den relativa källrevisionen %ld är inte tillgänglig i nuvarande arkiv"
-#: ../libsvn_repos/load-fs-vtable.c:579
+#: ../libsvn_repos/load-fs-vtable.c:583
#, c-format
msgid ""
"Copy source checksum mismatch on copy from '%s'@%ld\n"
@@ -5260,11 +5226,11 @@ msgstr ""
"Felaktig kontrollsumma för källan i kopiering från \"%s\"@%ld\n"
"till \"%s\" i revision baserad på r%ld"
-#: ../libsvn_repos/load-fs-vtable.c:638
+#: ../libsvn_repos/load-fs-vtable.c:642
msgid "Malformed dumpstream: Revision 0 must not contain node records"
msgstr "Felaktig dumpström: revision 0 får ej innehålla nodposter"
-#: ../libsvn_repos/load-fs-vtable.c:654
+#: ../libsvn_repos/load-fs-vtable.c:658
#, c-format
msgid "Unrecognized node-action on node '%s'"
msgstr "Okänd nodåtgärd på noden \"%s\""
@@ -5338,37 +5304,37 @@ msgstr "Ogiltigt djup (%c) för sökväg \"%s\""
msgid "Working copy path '%s' does not exist in repository"
msgstr "Sökvägen \"%s\" finns i arbetskopian men ej i arkivet"
-#: ../libsvn_repos/reporter.c:1348
+#: ../libsvn_repos/reporter.c:1345
msgid "Not authorized to open root of edit operation"
msgstr "Ej behörig att öppna editeringens rot"
-#: ../libsvn_repos/reporter.c:1365
+#: ../libsvn_repos/reporter.c:1362
#, c-format
msgid "Target path '%s' does not exist"
msgstr "Målsökvägen \"%s\" finns inte"
-#: ../libsvn_repos/reporter.c:1373
+#: ../libsvn_repos/reporter.c:1370
msgid "Cannot replace a directory from within"
msgstr "Kan inte ersätta en katalog från inuti sig själv"
-#: ../libsvn_repos/reporter.c:1413
+#: ../libsvn_repos/reporter.c:1410
msgid "Invalid report for top level of working copy"
msgstr "Ogiltig rapport arbetskopians toppnivå"
-#: ../libsvn_repos/reporter.c:1428
+#: ../libsvn_repos/reporter.c:1425
msgid "Two top-level reports with no target"
msgstr "Två toppnivårapporter utan mål"
-#: ../libsvn_repos/reporter.c:1490
+#: ../libsvn_repos/reporter.c:1487
#, c-format
msgid "Unsupported report depth '%s'"
msgstr "Rapportdjupet \"%s\" stöds inte"
-#: ../libsvn_repos/reporter.c:1520
+#: ../libsvn_repos/reporter.c:1517
msgid "Depth 'exclude' not supported for link"
msgstr "Djupet \"exclude\" stöds ej för länkar"
-#: ../libsvn_repos/reporter.c:1577
+#: ../libsvn_repos/reporter.c:1574
msgid "Request depth 'exclude' not supported"
msgstr "Efterfrågedjup \"exclude\" stöds ej"
@@ -5464,7 +5430,7 @@ msgstr "Kunde inte skapa arkiv"
msgid "Expected repository format '%d' or '%d'; found format '%d'"
msgstr "Förväntat format på arkivet \"%d\" eller \"%d\"; hittade \"%d\""
-#: ../libsvn_repos/repos.c:1674
+#: ../libsvn_repos/repos.c:1728
#, c-format
msgid "unknown capability '%s'"
msgstr "okänd förmåga \"%s\""
@@ -5474,46 +5440,46 @@ msgstr "okänd förmåga \"%s\""
msgid "Failed to find time on revision %ld"
msgstr "Kunde inte hitta tiden för revision %ld"
-#: ../libsvn_repos/rev_hunt.c:210 ../libsvn_repos/rev_hunt.c:325
+#: ../libsvn_repos/rev_hunt.c:206 ../libsvn_repos/rev_hunt.c:321
#, c-format
msgid "Invalid start revision %ld"
msgstr "Ogiltig startrevision %ld"
-#: ../libsvn_repos/rev_hunt.c:518
+#: ../libsvn_repos/rev_hunt.c:514
msgid "Unreadable path encountered; access denied"
msgstr "En sökväg som ej är läsbar har påträffats; åtkomst nekas"
-#: ../libsvn_repos/rev_hunt.c:1156 ../libsvn_repos/rev_hunt.c:1495
+#: ../libsvn_repos/rev_hunt.c:1152 ../libsvn_repos/rev_hunt.c:1491
#, c-format
msgid "'%s' is not a file in revision %ld"
msgstr "\"%s\" är inte en fil i revision %ld"
-#: ../libsvn_subr/auth.c:222
+#: ../libsvn_subr/auth.c:221
#, c-format
msgid "No provider registered for '%s' credentials"
msgstr "Ingen tillhandahållare registrerad för klientreferenser av typ \"%s\""
-#: ../libsvn_subr/cache-membuffer.c:496
+#: ../libsvn_subr/cache-membuffer.c:537
#, c-format
msgid "Can't lock cache mutex"
msgstr "Kan inte låsa cachemutex"
-#: ../libsvn_subr/cache-membuffer.c:527 ../libsvn_subr/cache-membuffer.c:543
+#: ../libsvn_subr/cache-membuffer.c:568 ../libsvn_subr/cache-membuffer.c:584
#, c-format
msgid "Can't write-lock cache mutex"
msgstr "Kan inte låsa cachemutex för skrivning"
-#: ../libsvn_subr/cache-membuffer.c:562
+#: ../libsvn_subr/cache-membuffer.c:603
#, c-format
msgid "Can't unlock cache mutex"
msgstr "Kan inte låsa upp mutex"
-#: ../libsvn_subr/cache-membuffer.c:1299
+#: ../libsvn_subr/cache-membuffer.c:1517
#, c-format
msgid "Can't create cache mutex"
msgstr "Kan inte skapa cachemutex"
-#: ../libsvn_subr/cache-membuffer.c:2030
+#: ../libsvn_subr/cache-membuffer.c:2349
msgid "Can't iterate a membuffer-based cache"
msgstr "Kan inte gå igenom en \"membuffer\"-baserad cache"
@@ -5531,32 +5497,32 @@ msgstr "Okänt memcached-fel vid skrivning"
msgid "Can't iterate a memcached cache"
msgstr "Kan inte gå igenom en \"memcached\"-cache"
-#: ../libsvn_subr/cache-memcache.c:443
+#: ../libsvn_subr/cache-memcache.c:438
#, c-format
msgid "Error parsing memcache server '%s'"
msgstr "Syntaxfel vid analys av memcache-servern \"%s\""
-#: ../libsvn_subr/cache-memcache.c:451
+#: ../libsvn_subr/cache-memcache.c:446
#, c-format
msgid "Scope not allowed in memcache server '%s'"
msgstr "Omfång inte tillåtet i memcache-servern \"%s\""
-#: ../libsvn_subr/cache-memcache.c:459
+#: ../libsvn_subr/cache-memcache.c:454
#, c-format
msgid "Must specify host and port for memcache server '%s'"
msgstr "Måste ange värddator och port för memcache-servern \"%s\""
-#: ../libsvn_subr/cache-memcache.c:479
+#: ../libsvn_subr/cache-memcache.c:474
#, c-format
msgid "Unknown error creating memcache server"
msgstr "Okänt fel vid skapande av memcache-server"
-#: ../libsvn_subr/cache-memcache.c:487
+#: ../libsvn_subr/cache-memcache.c:482
#, c-format
msgid "Unknown error adding server to memcache"
msgstr "Okänt fel när server lades till memcache"
-#: ../libsvn_subr/cache-memcache.c:560
+#: ../libsvn_subr/cache-memcache.c:555
#, c-format
msgid "Unknown error creating apr_memcache_t"
msgstr "Okänt fel när apr_memcache_t skapades"
@@ -5621,7 +5587,7 @@ msgid "Can't write to '%s'"
msgstr "Kan inte skriva till \"%s\""
#: ../libsvn_subr/cmdline.c:1202 ../libsvn_subr/cmdline.c:1217
-#: ../libsvn_subr/cmdline.c:1251 ../libsvn_subr/io.c:3609
+#: ../libsvn_subr/cmdline.c:1251 ../libsvn_subr/io.c:3924
#, c-format
msgid "Can't stat '%s'"
msgstr "Kan inte ta status på \"%s\""
@@ -5630,17 +5596,44 @@ msgstr "Kan inte ta status på \"%s\""
msgid "Error normalizing edited contents to internal format"
msgstr "Fel vid normalisering av det redigerade innehållet till det interna formatet"
-#: ../libsvn_subr/config.c:739
+#: ../libsvn_subr/compress.c:143
+msgid "Compression of svndiff data failed"
+msgstr "Misslyckades med att komprimera svndiff-data"
+
+#: ../libsvn_subr/compress.c:179
+#, fuzzy
+msgid "Decompression of zlib compressed data failed: no size"
+msgstr "Misslyckades med att packa upp svndiff-data: ingen storlek"
+
+#: ../libsvn_subr/compress.c:182
+#, fuzzy
+msgid "Decompression of zlib compressed data failed: size too large"
+msgstr "Misslyckades med att packa upp svndiff-data: storlek för stor"
+
+#: ../libsvn_subr/compress.c:207
+msgid "Decompression of svndiff data failed"
+msgstr "Misslyckades med att packa upp svndiff-data"
+
+#: ../libsvn_subr/compress.c:214
+msgid "Size of uncompressed data does not match stored original length"
+msgstr "Storleken på uppackad data stämmer inte med lagrad originallängd"
+
+#: ../libsvn_subr/compress.c:230
+#, fuzzy, c-format
+msgid "Unsupported compression method %d"
+msgstr "Rapportdjupet \"%s\" stöds inte"
+
+#: ../libsvn_subr/config.c:740
#, c-format
msgid "Config error: invalid boolean value '%s' for '[%s] %s'"
msgstr "Konfigurationsfel: felaktigt booleskt värde \"%s\" för \"[%s] %s\""
-#: ../libsvn_subr/config.c:744
+#: ../libsvn_subr/config.c:745
#, c-format
msgid "Config error: invalid boolean value '%s' for '%s'"
msgstr "Konfigurationsfel: felaktigt booleskt värde \"%s\" för \"%s\""
-#: ../libsvn_subr/config.c:1173
+#: ../libsvn_subr/config.c:1174
#, c-format
msgid "Config error: invalid integer value '%s'"
msgstr "Konfigurationsfel: felaktigt heltal \"%s\""
@@ -5759,7 +5752,7 @@ msgstr "Kan inte beräkna begärt datum"
msgid "Can't expand time"
msgstr "Kan inte dela upp tid"
-#: ../libsvn_subr/deprecated.c:361 ../libsvn_subr/opt.c:302
+#: ../libsvn_subr/deprecated.c:360 ../libsvn_subr/opt.c:302
msgid ""
"\n"
"Valid options:\n"
@@ -5767,20 +5760,20 @@ msgstr ""
"\n"
"Giltiga flaggor:\n"
-#: ../libsvn_subr/deprecated.c:437 ../libsvn_subr/opt.c:417
+#: ../libsvn_subr/deprecated.c:436 ../libsvn_subr/opt.c:417
#, c-format
msgid ""
"\"%s\": unknown command.\n"
"\n"
msgstr "\"%s\": okänt kommando.\n"
-#: ../libsvn_subr/deprecated.c:615 ../libsvn_subr/opt.c:1237
+#: ../libsvn_subr/deprecated.c:614 ../libsvn_subr/opt.c:1237
#: ../svnrdump/svnrdump.c:646
#, c-format
msgid "Type '%s help' for usage.\n"
msgstr "Skriv \"%s help\" för användning.\n"
-#: ../libsvn_subr/deprecated.c:1023
+#: ../libsvn_subr/deprecated.c:1022
#, c-format
msgid "'%s' is neither a file nor a directory name"
msgstr "\"%s\" är varken ett fil- eller katalognamn"
@@ -5790,69 +5783,69 @@ msgstr "\"%s\" är varken ett fil- eller katalognamn"
msgid "Couldn't determine absolute path of '%s'"
msgstr "Kunde inte ta reda på absolut sökväg för \"%s\""
-#: ../libsvn_subr/dirent_uri.c:2313
+#: ../libsvn_subr/dirent_uri.c:2316
#, c-format
msgid "Local URL '%s' does not contain 'file://' prefix"
msgstr "Den lokala URL:en \"%s\" börjar inte med \"file://\""
-#: ../libsvn_subr/dirent_uri.c:2392
+#: ../libsvn_subr/dirent_uri.c:2395
#, c-format
msgid "Local URL '%s' contains only a hostname, no path"
msgstr "Den lokala URL:en \"%s\" innehåller endast ett värdnamn och ingen sökväg"
-#: ../libsvn_subr/dirent_uri.c:2406
+#: ../libsvn_subr/dirent_uri.c:2409
#, c-format
msgid "Local URL '%s' contains unsupported hostname"
msgstr "Den lokala URL:en \"%s\" innehåller värdnamn som inte stöds"
-#: ../libsvn_subr/error.c:263
+#: ../libsvn_subr/error.c:264
msgid "Additional errors:"
msgstr "Ytterligare fel:"
-#: ../libsvn_subr/error.c:524
+#: ../libsvn_subr/error.c:526
msgid "Can't recode error string from APR"
msgstr "Kan inte teckenkonvertera felmeddelande från APR"
-#: ../libsvn_subr/error.c:624
+#: ../libsvn_subr/error.c:636
#, c-format
msgid "%swarning: W%06d: %s\n"
msgstr "%svarning: W%06d: %s\n"
-#: ../libsvn_subr/error.c:706
+#: ../libsvn_subr/error.c:742
#, c-format
msgid "In file '%s' line %d: assertion failed (%s)"
msgstr "I filen \"%s\" rad %d: fel vid invariantkontroll (%s)"
-#: ../libsvn_subr/error.c:710
+#: ../libsvn_subr/error.c:746
#, c-format
msgid "In file '%s' line %d: internal malfunction"
msgstr "I filen \"%s\" rad %d: internt fel"
-#: ../libsvn_subr/error.c:766
+#: ../libsvn_subr/error.c:808
msgid "stream error"
msgstr "strömningsfel"
-#: ../libsvn_subr/error.c:771
+#: ../libsvn_subr/error.c:813
msgid "out of memory"
msgstr "slut på minne"
-#: ../libsvn_subr/error.c:776
+#: ../libsvn_subr/error.c:818
msgid "buffer error"
msgstr "buffringsfel"
-#: ../libsvn_subr/error.c:781
+#: ../libsvn_subr/error.c:823
msgid "version error"
msgstr "versionsfel"
-#: ../libsvn_subr/error.c:786
+#: ../libsvn_subr/error.c:828
msgid "corrupt data"
msgstr "trasig data"
-#: ../libsvn_subr/error.c:791
+#: ../libsvn_subr/error.c:833
msgid "unknown error"
msgstr "okänt fel"
-#: ../libsvn_subr/gpg_agent.c:358 ../libsvn_subr/prompt.c:631
+#: ../libsvn_subr/gpg_agent.c:358 ../libsvn_subr/prompt.c:627
#, c-format
msgid "Password for '%s': "
msgstr "Lösenord för \"%s\": "
@@ -5877,232 +5870,224 @@ msgstr "Felaktig serialiserad hashtabell"
msgid "Cannot serialize negative length"
msgstr "Kan inte serialisera negativ längd"
-#: ../libsvn_subr/io.c:309
+#: ../libsvn_subr/io.c:333
#, c-format
msgid "Can't check path '%s'"
msgstr "Kan inte kontrollera sökvägen \"%s\""
-#: ../libsvn_subr/io.c:537 ../libsvn_subr/io.c:4551
+#: ../libsvn_subr/io.c:561 ../libsvn_subr/io.c:4866
#, c-format
msgid "Can't open '%s'"
msgstr "Kan inte öppna \"%s\""
-#: ../libsvn_subr/io.c:563 ../libsvn_subr/io.c:649
+#: ../libsvn_subr/io.c:587 ../libsvn_subr/io.c:673
#, c-format
msgid "Unable to make name for '%s'"
msgstr "Kunde inte skapa namn för \"%s\""
-#: ../libsvn_subr/io.c:636
+#: ../libsvn_subr/io.c:660
#, c-format
msgid "Can't create symbolic link '%s'"
msgstr "Kan inte skapa symbolisk länk \"%s\""
-#: ../libsvn_subr/io.c:653 ../libsvn_subr/io.c:686 ../libsvn_subr/io.c:714
+#: ../libsvn_subr/io.c:677 ../libsvn_subr/io.c:712 ../libsvn_subr/io.c:740
+#: ../libsvn_subr/io.c:1897
msgid "Symbolic links are not supported on this platform"
msgstr "Symboliska länkar stöds inte på denna plattform"
-#: ../libsvn_subr/io.c:676
+#: ../libsvn_subr/io.c:700 ../libsvn_subr/io.c:1858 ../libsvn_subr/io.c:1878
+#: ../libsvn_subr/io.c:1887
#, c-format
msgid "Can't read contents of link"
msgstr "Kan inte läsa innehållet i länk"
-#: ../libsvn_subr/io.c:734
+#: ../libsvn_subr/io.c:760
#, c-format
msgid "Can't find a temporary directory"
msgstr "Kan inte hitta temporär katalog"
-#: ../libsvn_subr/io.c:852
+#: ../libsvn_subr/io.c:878
#, c-format
msgid "Can't copy '%s' to '%s'"
msgstr "Kan inte kopiera \"%s\" till \"%s\""
-#: ../libsvn_subr/io.c:895 ../libsvn_subr/io.c:917 ../libsvn_subr/io.c:963
+#: ../libsvn_subr/io.c:921 ../libsvn_subr/io.c:943 ../libsvn_subr/io.c:989
#, c-format
msgid "Can't set permissions on '%s'"
msgstr "Kan inte sätta rättigheter på \"%s\""
-#: ../libsvn_subr/io.c:913 ../libsvn_subr/io.c:1977 ../libsvn_subr/io.c:2036
-#: ../libsvn_subr/io.c:4589
+#: ../libsvn_subr/io.c:939 ../libsvn_subr/io.c:2120 ../libsvn_subr/io.c:2179
+#: ../libsvn_subr/io.c:4904
#, c-format
msgid "Can't get file name"
msgstr "Kan inte erhålla filnamn"
-#: ../libsvn_subr/io.c:987
+#: ../libsvn_subr/io.c:1013
#, c-format
msgid "Can't append '%s' to '%s'"
msgstr "Kan inte lägga till \"%s\" till \"%s\""
-#: ../libsvn_subr/io.c:1033
+#: ../libsvn_subr/io.c:1059
#, c-format
msgid "Destination '%s' already exists"
msgstr "Destinationen \"%s\" finns redan"
-#: ../libsvn_subr/io.c:1137
+#: ../libsvn_subr/io.c:1163
#, c-format
msgid "Can't make directory '%s'"
msgstr "Kan inte skapa katalogen \"%s\""
-#: ../libsvn_subr/io.c:1206
+#: ../libsvn_subr/io.c:1232
#, c-format
msgid "Can't set access time of '%s'"
msgstr "Kan inte sätta åtkomsttiden på \"%s\""
-#: ../libsvn_subr/io.c:1523 ../libsvn_subr/io.c:1630
+#: ../libsvn_subr/io.c:1549 ../libsvn_subr/io.c:1656
#, c-format
msgid "Can't change perms of file '%s'"
msgstr "Kan inte ändra rättigheter på filen \"%s\""
-#: ../libsvn_subr/io.c:1796
+#: ../libsvn_subr/io.c:1939
#, c-format
msgid "Can't set file '%s' read-only"
msgstr "Kan inte göra \"%s\" skrivskyddad"
-#: ../libsvn_subr/io.c:1828
+#: ../libsvn_subr/io.c:1971
#, c-format
msgid "Can't set file '%s' read-write"
msgstr "Kan inte ta bort skrivskyddet på \"%s\""
-#: ../libsvn_subr/io.c:1867 ../libsvn_subr/io.c:1901
+#: ../libsvn_subr/io.c:2010 ../libsvn_subr/io.c:2044
#, c-format
msgid "Error getting UID of process"
msgstr "Fel vid läsning av processens användar-id"
-#: ../libsvn_subr/io.c:2003
+#: ../libsvn_subr/io.c:2146
#, c-format
msgid "Can't get shared lock on file '%s'"
msgstr "Kan inte ta ut delat lås på filen \"%s\""
-#: ../libsvn_subr/io.c:2041
+#: ../libsvn_subr/io.c:2184
#, c-format
msgid "Can't unlock file '%s'"
msgstr "Kan inte låsa upp filen \"%s\""
-#: ../libsvn_subr/io.c:2096 ../libsvn_subr/io.c:3504
-#, c-format
-msgid "Can't flush file '%s'"
-msgstr "Kan inte tömma buffertar för filen \"%s\""
-
-#: ../libsvn_subr/io.c:2097 ../libsvn_subr/io.c:3505
-#, c-format
-msgid "Can't flush stream"
-msgstr "Kan inte tömma buffertar för ström"
-
-#: ../libsvn_subr/io.c:2109 ../libsvn_subr/io.c:2126
+#: ../libsvn_subr/io.c:2253 ../libsvn_subr/io.c:2274
#, c-format
msgid "Can't flush file to disk"
msgstr "Kan inte tömma filbuffertar till disk"
-#: ../libsvn_subr/io.c:2218 ../libsvn_subr/prompt.c:197
-#: ../svnserve/svnserve.c:824
+#: ../libsvn_subr/io.c:2366 ../libsvn_subr/prompt.c:197
+#: ../svnserve/svnserve.c:822
#, c-format
msgid "Can't open stdin"
msgstr "Kan inte öppna standard in"
-#: ../libsvn_subr/io.c:2238
+#: ../libsvn_subr/io.c:2386
msgid "Reading from stdin is disallowed"
msgstr "Att läsa från standardinmatningen tillåts ej"
-#: ../libsvn_subr/io.c:2305
+#: ../libsvn_subr/io.c:2453
#, c-format
msgid "Can't remove file '%s'"
msgstr "Kan inte radera filen \"%s\""
-#: ../libsvn_subr/io.c:2392
+#: ../libsvn_subr/io.c:2540
#, c-format
msgid "Can't remove '%s'"
msgstr "Kan inte radera \"%s\""
-#: ../libsvn_subr/io.c:2555
+#: ../libsvn_subr/io.c:2703
#, c-format
msgid "Path '%s' not found, case obstructed by '%s'"
msgstr "Sökvägen \"%s\" hittades inte, skiftlägesblockerad av \"%s\""
-#: ../libsvn_subr/io.c:2594
+#: ../libsvn_subr/io.c:2742
#, c-format
msgid "Path '%s' not found"
msgstr "Sökvägen \"%s\" finns inte"
-#: ../libsvn_subr/io.c:2668
+#: ../libsvn_subr/io.c:2816
#, c-format
msgid "Can't create process '%s' attributes"
msgstr "Kan inte skapa attribut för processen \"%s\""
-#: ../libsvn_subr/io.c:2675
+#: ../libsvn_subr/io.c:2823
#, c-format
msgid "Can't set process '%s' cmdtype"
msgstr "Kan inte sätta cmdtype för processen \"%s\""
-#: ../libsvn_subr/io.c:2687
+#: ../libsvn_subr/io.c:2835
#, c-format
msgid "Can't set process '%s' directory"
msgstr "Kan inte sätta katalog för processen \"%s\""
-#: ../libsvn_subr/io.c:2701
+#: ../libsvn_subr/io.c:2849
#, c-format
msgid "Can't set process '%s' child input"
msgstr "Kan inte sätta standard in för processen \"%s\""
-#: ../libsvn_subr/io.c:2709
+#: ../libsvn_subr/io.c:2857
#, c-format
msgid "Can't set process '%s' child outfile"
msgstr "Kan inte sätta standard ut för processen \"%s\""
-#: ../libsvn_subr/io.c:2717
+#: ../libsvn_subr/io.c:2865
#, c-format
msgid "Can't set process '%s' child errfile"
msgstr "Kan inte sätta standard fel för processen \"%s\""
-#: ../libsvn_subr/io.c:2731
+#: ../libsvn_subr/io.c:2879
#, c-format
msgid "Can't set process '%s' stdio pipes"
msgstr "Kan inte sätta rör för standardin- och utmatning för processen \"%s\""
-#: ../libsvn_subr/io.c:2739
+#: ../libsvn_subr/io.c:2887
#, c-format
msgid "Can't set process '%s' child errfile for error handler"
msgstr "Kan inte sätta standard fel för processen \"%s\" för felhanteraren"
-#: ../libsvn_subr/io.c:2746
+#: ../libsvn_subr/io.c:2894
#, c-format
msgid "Can't set process '%s' error handler"
msgstr "Kan inte sätta felhanterare för processen \"%s\""
-#: ../libsvn_subr/io.c:2769
+#: ../libsvn_subr/io.c:2917
#, c-format
msgid "Can't start process '%s'"
msgstr "Kan inte starta processen \"%s\""
-#: ../libsvn_subr/io.c:2793
+#: ../libsvn_subr/io.c:2941
#, c-format
msgid "Error waiting for process '%s'"
msgstr "Fel då processen \"%s\" inväntades"
-#: ../libsvn_subr/io.c:2802
+#: ../libsvn_subr/io.c:2950
#, c-format
msgid "Process '%s' failed (signal %d, core dumped)"
msgstr "Processen \"%s\" misslyckades (signal %d, minnesutskrift skapad)"
-#: ../libsvn_subr/io.c:2807
-#, c-format
+#: ../libsvn_subr/io.c:2955
+#, fuzzy, c-format
msgid "Process '%s' failed (signal %d)"
-msgstr "Processen \"%s\" misslyckades (signal %d)"
+msgstr "Processen \"%s\" misslyckades (orsak %d)"
-#: ../libsvn_subr/io.c:2813
-#, c-format
+#: ../libsvn_subr/io.c:2961
+#, fuzzy, c-format
msgid "Process '%s' failed (exitwhy %d, exitcode %d)"
-msgstr "Processen \"%s\" misslyckades (orsak %d, slutkod %d)"
+msgstr "Processen \"%s\" misslyckades (orsak %d)"
-#: ../libsvn_subr/io.c:2821
+#: ../libsvn_subr/io.c:2969
#, c-format
msgid "Process '%s' returned error exitcode %d"
msgstr "Processen \"%s\" returnerade felstatus %d"
-#: ../libsvn_subr/io.c:2928
+#: ../libsvn_subr/io.c:3076
#, c-format
msgid "'%s' returned %d"
msgstr "\"%s\" returnerade %d"
-#: ../libsvn_subr/io.c:3048
+#: ../libsvn_subr/io.c:3196
#, c-format
msgid ""
"Error running '%s': exitcode was %d, args were:\n"
@@ -6117,166 +6102,188 @@ msgstr ""
"%s\n"
"%s"
-#: ../libsvn_subr/io.c:3189
+#: ../libsvn_subr/io.c:3337
#, c-format
msgid "Can't detect MIME type of non-file '%s'"
msgstr "Kan inte känna av MIME-typ på \"%s\", som inte är en fil"
-#: ../libsvn_subr/io.c:3284
+#: ../libsvn_subr/io.c:3432
#, c-format
msgid "Can't open file '%s'"
msgstr "Kan inte öppna filen \"%s\""
-#: ../libsvn_subr/io.c:3324
+#: ../libsvn_subr/io.c:3472
#, c-format
msgid "Can't close file '%s'"
msgstr "Kan inte stänga filen \"%s\""
-#: ../libsvn_subr/io.c:3325
+#: ../libsvn_subr/io.c:3473
#, c-format
msgid "Can't close stream"
msgstr "Kan inte stänga ström"
-#: ../libsvn_subr/io.c:3334 ../libsvn_subr/io.c:3370 ../libsvn_subr/io.c:3395
+#: ../libsvn_subr/io.c:3482 ../libsvn_subr/io.c:3518 ../libsvn_subr/io.c:3543
+#: ../libsvn_subr/io.c:3634
#, c-format
msgid "Can't read file '%s'"
msgstr "Kan inte läsa filen \"%s\""
-#: ../libsvn_subr/io.c:3335 ../libsvn_subr/io.c:3371 ../libsvn_subr/io.c:3396
+#: ../libsvn_subr/io.c:3483 ../libsvn_subr/io.c:3519 ../libsvn_subr/io.c:3544
+#: ../libsvn_subr/io.c:3635
#, c-format
msgid "Can't read stream"
msgstr "Kan inte läsa från ström"
-#: ../libsvn_subr/io.c:3344
+#: ../libsvn_subr/io.c:3492
#, c-format
msgid "Can't write file '%s'"
msgstr "Kan inte skriva till filen \"%s\""
-#: ../libsvn_subr/io.c:3345
+#: ../libsvn_subr/io.c:3493
#, c-format
msgid "Can't write stream"
msgstr "Kan inte skriva till ström"
-#: ../libsvn_subr/io.c:3359
+#: ../libsvn_subr/io.c:3507
#, c-format
msgid "Can't get attribute information from file '%s'"
msgstr "Kan inte erhålla attributinformation från filen \"%s\""
-#: ../libsvn_subr/io.c:3360
+#: ../libsvn_subr/io.c:3508
#, c-format
msgid "Can't get attribute information from stream"
msgstr "Kan inte erhålla attributinformation från ström"
-#: ../libsvn_subr/io.c:3407
+#: ../libsvn_subr/io.c:3555
#, c-format
msgid "Can't set position pointer in file '%s'"
msgstr "Kan inte sätta filpekaren i filen \"%s\""
-#: ../libsvn_subr/io.c:3408
+#: ../libsvn_subr/io.c:3556
#, c-format
msgid "Can't set position pointer in stream"
msgstr "Kan inte sätta filpekaren i ström"
-#: ../libsvn_subr/io.c:3419 ../libsvn_subr/io.c:3466
+#: ../libsvn_subr/io.c:3644
+#, fuzzy, c-format
+msgid "Can't seek in file '%s'"
+msgstr "Kan inte öppna filen \"%s\""
+
+#: ../libsvn_subr/io.c:3645
+#, fuzzy, c-format
+msgid "Can't seek in stream"
+msgstr "Kan inte stänga ström"
+
+#: ../libsvn_subr/io.c:3662 ../libsvn_subr/io.c:3719
#, c-format
msgid "Can't write to file '%s'"
msgstr "Kan inte skriva till filen \"%s\""
-#: ../libsvn_subr/io.c:3420 ../libsvn_subr/io.c:3467
+#: ../libsvn_subr/io.c:3663 ../libsvn_subr/io.c:3720
#, c-format
msgid "Can't write to stream"
msgstr "Kan inte skriva till ström"
-#: ../libsvn_subr/io.c:3509
+#: ../libsvn_subr/io.c:3673 ../libsvn_subr/io.c:3819
+#, c-format
+msgid "Can't flush file '%s'"
+msgstr "Kan inte tömma buffertar för filen \"%s\""
+
+#: ../libsvn_subr/io.c:3674 ../libsvn_subr/io.c:3820
+#, c-format
+msgid "Can't flush stream"
+msgstr "Kan inte tömma buffertar för ström"
+
+#: ../libsvn_subr/io.c:3824
#, c-format
msgid "Can't truncate file '%s'"
msgstr "Kan inte hugga av filen \"%s\""
-#: ../libsvn_subr/io.c:3510
+#: ../libsvn_subr/io.c:3825
#, c-format
msgid "Can't truncate stream"
msgstr "Kan inte hugga av ström"
-#: ../libsvn_subr/io.c:3583
+#: ../libsvn_subr/io.c:3898
#, c-format
msgid "Can't read length line in file '%s'"
msgstr "Kan inte läsa längdrad i filen \"%s\""
-#: ../libsvn_subr/io.c:3587
+#: ../libsvn_subr/io.c:3902
msgid "Can't read length line in stream"
msgstr "Kan inte läsa längdrad i ström"
-#: ../libsvn_subr/io.c:3644
+#: ../libsvn_subr/io.c:3959
#, c-format
msgid "Can't move '%s' to '%s'"
msgstr "Kan inte flytta \"%s\" till \"%s\""
-#: ../libsvn_subr/io.c:3725
+#: ../libsvn_subr/io.c:4040
#, c-format
msgid "Can't create directory '%s'"
msgstr "Kan inte skapa katalogen \"%s\""
-#: ../libsvn_subr/io.c:3748
+#: ../libsvn_subr/io.c:4063
#, c-format
msgid "Can't hide directory '%s'"
msgstr "Kan inte dölja katalogen \"%s\""
-#: ../libsvn_subr/io.c:3808 ../libsvn_subr/io.c:3931
+#: ../libsvn_subr/io.c:4123 ../libsvn_subr/io.c:4246
#, c-format
msgid "Can't open directory '%s'"
msgstr "Kan inte öppna katalogen \"%s\""
-#: ../libsvn_subr/io.c:3843
+#: ../libsvn_subr/io.c:4158
#, c-format
msgid "Can't remove directory '%s'"
msgstr "Kan inte radera katalogen \"%s\""
-#: ../libsvn_subr/io.c:3861
+#: ../libsvn_subr/io.c:4176
#, c-format
msgid "Can't read directory"
msgstr "Kan inte läsa katalog"
-#: ../libsvn_subr/io.c:3881
+#: ../libsvn_subr/io.c:4196
#, c-format
msgid "Error closing directory"
msgstr "Fel vid stängning av katalog"
-#: ../libsvn_subr/io.c:3950
+#: ../libsvn_subr/io.c:4265
#, c-format
msgid "Can't read directory entry in '%s'"
msgstr "Kan inte läsa katalogpost i \"%s\""
-#: ../libsvn_subr/io.c:4076
+#: ../libsvn_subr/io.c:4391
#, c-format
msgid "Can't check directory '%s'"
msgstr "Kan inte kontrollera katalogen \"%s\""
-#: ../libsvn_subr/io.c:4138
+#: ../libsvn_subr/io.c:4453
#, c-format
msgid "Reading '%s'"
msgstr "Läser \"%s\""
-#: ../libsvn_subr/io.c:4157
+#: ../libsvn_subr/io.c:4472
#, c-format
msgid "First line of '%s' contains non-digit"
msgstr "Första raden i \"%s\" innehåller något som inte är en siffra"
-#: ../libsvn_subr/io.c:4472
+#: ../libsvn_subr/io.c:4787
#, c-format
msgid "Can't create temporary file from template '%s'"
msgstr "Kan inte skapa temporärfil från mallen \"%s\""
-#: ../libsvn_subr/io.c:4561
+#: ../libsvn_subr/io.c:4876
#, c-format
msgid "Can't set aside '%s'"
msgstr "Kan inte flytta \"%s\" åt sidan"
-#: ../libsvn_subr/io.c:4573
+#: ../libsvn_subr/io.c:4888
#, c-format
msgid "Unable to make name in '%s'"
msgstr "Kunde inte skapa namn i \"%s\""
-#: ../libsvn_subr/mergeinfo.c:100 ../libsvn_subr/mergeinfo.c:677
+#: ../libsvn_subr/mergeinfo.c:100 ../libsvn_subr/mergeinfo.c:694
msgid "Pathname not terminated by ':'"
msgstr "Sökväg avslutades inte med \":\""
@@ -6313,31 +6320,31 @@ msgstr "Ogiltigt tecken \"%c\" i revisionslista"
msgid "Range list parsing ended before hitting newline"
msgstr "Revisionslistan tog slut före radslutet"
-#: ../libsvn_subr/mergeinfo.c:637
+#: ../libsvn_subr/mergeinfo.c:654
#, c-format
msgid "Unable to parse overlapping revision ranges '%s' and '%s' with different inheritance types"
msgstr "Kan inte tolka överlappande revisionsområden \"%s\" och \"%s\" med olika arvstyper"
-#: ../libsvn_subr/mergeinfo.c:685
+#: ../libsvn_subr/mergeinfo.c:702
#, c-format
msgid "Mergeinfo for '%s' maps to an empty revision range"
msgstr "Sammanslagningsinformationen för \"%s\" motsvarar ett tomt revisionsområde"
-#: ../libsvn_subr/mergeinfo.c:689
+#: ../libsvn_subr/mergeinfo.c:706
#, c-format
msgid "Could not find end of line in range list line in '%s'"
msgstr "Kunde inte hitta radslutet i rad med revisionslista i \"%s\""
-#: ../libsvn_subr/mergeinfo.c:753
+#: ../libsvn_subr/mergeinfo.c:772
#, c-format
msgid "Could not parse mergeinfo string '%s'"
msgstr "Kunde inte tolka sammanslagningsinformation i strängen \"%s\""
-#: ../libsvn_subr/mergeinfo.c:2301
+#: ../libsvn_subr/mergeinfo.c:2323
msgid "NULL mergeinfo catalog\n"
msgstr "katalog för sammanslagningsinformation är NULL\n"
-#: ../libsvn_subr/mergeinfo.c:2306
+#: ../libsvn_subr/mergeinfo.c:2328
msgid "empty mergeinfo catalog\n"
msgstr "tom katalog för sammanslagningsinformation\n"
@@ -6484,7 +6491,7 @@ msgstr "* inlästa delat bibliotek:\n"
msgid "Can't determine the native path encoding"
msgstr "Kan inte hitta den teckenkodning som ditt system använder för sökvägar"
-#: ../libsvn_subr/path.c:1303
+#: ../libsvn_subr/path.c:1299
#, c-format
msgid "Improper relative URL '%s'"
msgstr "Oriktig relativ URL \"%s\""
@@ -6498,35 +6505,30 @@ msgstr "Kan inte stänga terminal"
msgid "Can't open stderr"
msgstr "Kan inte öppna standard fel"
-#: ../libsvn_subr/prompt.c:263
-#, c-format
-msgid "Can't write to terminal"
-msgstr "Kan inte skriva till terminal"
-
-#: ../libsvn_subr/prompt.c:385 ../libsvn_subr/prompt.c:472
+#: ../libsvn_subr/prompt.c:381 ../libsvn_subr/prompt.c:468
#, c-format
msgid "Can't read from terminal"
msgstr "Kan inte läsa från terminal"
-#: ../libsvn_subr/prompt.c:540
+#: ../libsvn_subr/prompt.c:536
msgid "End of file while reading from terminal"
msgstr "Filslut vid läsning från terminal"
-#: ../libsvn_subr/prompt.c:602
+#: ../libsvn_subr/prompt.c:598 ../svnauth/svnauth.c:461
#, c-format
msgid "Authentication realm: %s\n"
msgstr "Autentiseringsregion (realm): %s\n"
-#: ../libsvn_subr/prompt.c:629 ../libsvn_subr/prompt.c:652
+#: ../libsvn_subr/prompt.c:625 ../libsvn_subr/prompt.c:648
msgid "Username: "
msgstr "Användarnamn: "
-#: ../libsvn_subr/prompt.c:674
+#: ../libsvn_subr/prompt.c:670
#, c-format
msgid "Error validating server certificate for '%s':\n"
msgstr "Fel vid verifiering av servercertifikat för \"%s\":\n"
-#: ../libsvn_subr/prompt.c:680
+#: ../libsvn_subr/prompt.c:676
msgid ""
" - The certificate is not issued by a trusted authority. Use the\n"
" fingerprint to validate the certificate manually!\n"
@@ -6534,23 +6536,23 @@ msgstr ""
" - Den som utfärdat certifikatet är inte tillförlitlig. Använd fingeravtrycket\n"
" för att verifiera certifikatet manuellt!\n"
-#: ../libsvn_subr/prompt.c:687
+#: ../libsvn_subr/prompt.c:683
msgid " - The certificate hostname does not match.\n"
msgstr " - Certifikatets värdnamn matchar inte.\n"
-#: ../libsvn_subr/prompt.c:693
+#: ../libsvn_subr/prompt.c:689
msgid " - The certificate is not yet valid.\n"
msgstr " - Certifikatet är inte giltigt ännu.\n"
-#: ../libsvn_subr/prompt.c:699
+#: ../libsvn_subr/prompt.c:695
msgid " - The certificate has expired.\n"
msgstr " - Certifikatet har gått ut.\n"
-#: ../libsvn_subr/prompt.c:705
+#: ../libsvn_subr/prompt.c:701
msgid " - The certificate has an unknown error.\n"
msgstr " - Det finns ett okänt fel på certifikatet.\n"
-#: ../libsvn_subr/prompt.c:710
+#: ../libsvn_subr/prompt.c:706
#, c-format
msgid ""
"Certificate information:\n"
@@ -6565,48 +6567,48 @@ msgstr ""
" - Utfärdat av: %s\n"
" - Fingeravtryck: %s\n"
-#: ../libsvn_subr/prompt.c:725
+#: ../libsvn_subr/prompt.c:721
msgid "(R)eject, accept (t)emporarily or accept (p)ermanently? "
msgstr "väg(R)a, acceptera (T)illfälligt eller acceptera (P)ermanent? "
-#: ../libsvn_subr/prompt.c:729
+#: ../libsvn_subr/prompt.c:725
msgid "(R)eject or accept (t)emporarily? "
msgstr "väg(R)a eller acceptera (T)illfälligt? "
-#: ../libsvn_subr/prompt.c:769
+#: ../libsvn_subr/prompt.c:765
msgid "Client certificate filename: "
msgstr "Filnamn för klientcertifikat: "
-#: ../libsvn_subr/prompt.c:793
+#: ../libsvn_subr/prompt.c:789
#, c-format
msgid "Passphrase for '%s': "
msgstr "Lösenordsfras för \"%s\": "
-#: ../libsvn_subr/prompt.c:845
+#: ../libsvn_subr/prompt.c:841
msgid "yes"
msgstr "ja"
-#: ../libsvn_subr/prompt.c:846
+#: ../libsvn_subr/prompt.c:842
msgid "y"
msgstr "j"
-#: ../libsvn_subr/prompt.c:851
+#: ../libsvn_subr/prompt.c:847
msgid "no"
msgstr "nej"
-#: ../libsvn_subr/prompt.c:852
+#: ../libsvn_subr/prompt.c:848
msgid "n"
msgstr "n"
-#: ../libsvn_subr/prompt.c:858
+#: ../libsvn_subr/prompt.c:854
msgid "Please type 'yes' or 'no': "
msgstr "Var god skriv \"ja\" eller \"nej\": "
-#: ../libsvn_subr/prompt.c:872
+#: ../libsvn_subr/prompt.c:868
msgid "Store password unencrypted (yes/no)? "
msgstr "Lagra lösenord okrypterat (ja/nej)? "
-#: ../libsvn_subr/prompt.c:874
+#: ../libsvn_subr/prompt.c:870
#, c-format
msgid ""
"\n"
@@ -6639,11 +6641,11 @@ msgstr ""
"\"%s\".\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:901
+#: ../libsvn_subr/prompt.c:897
msgid "Store passphrase unencrypted (yes/no)? "
msgstr "Lagra lösenordsfras okrypterad (ja/nej)? "
-#: ../libsvn_subr/prompt.c:903
+#: ../libsvn_subr/prompt.c:899
#, c-format
msgid ""
"\n"
@@ -6676,7 +6678,7 @@ msgstr ""
"\"nej\" i \"%s\".\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:949
+#: ../libsvn_subr/prompt.c:945
#, c-format
msgid "Password for '%s' GNOME keyring: "
msgstr "Lösenord för GNOME-nyckelring \"%s\": "
@@ -6687,48 +6689,48 @@ msgstr "Lösenord för GNOME-nyckelring \"%s\": "
msgid "Config error: invalid value '%s' for option '%s'"
msgstr "Konfigurationsfel: felaktigt värde \"%s\" för inställningen \"%s\""
-#: ../libsvn_subr/sqlite.c:176
+#: ../libsvn_subr/sqlite.c:195
#, c-format
msgid "sqlite[S%d]: %s, executing statement '%s'"
msgstr "sqlite[S%d]: %s, körning av \"%s\""
-#: ../libsvn_subr/sqlite.c:265
+#: ../libsvn_subr/sqlite.c:284
msgid "sqlite: Expected database row missing"
msgstr "sqlite: Väntad rad i databas saknas"
-#: ../libsvn_subr/sqlite.c:266
+#: ../libsvn_subr/sqlite.c:285
msgid "sqlite: Extra database row found"
msgstr "sqlite: Extra rad i databas hittad"
-#: ../libsvn_subr/sqlite.c:726
+#: ../libsvn_subr/sqlite.c:745
#, c-format
msgid "SQLite compiled for %s, but running with %s"
msgstr "SQLite kompilerad för %s, men kör med %s"
-#: ../libsvn_subr/sqlite.c:738
+#: ../libsvn_subr/sqlite.c:757
msgid "SQLite is required to be compiled and run in thread-safe mode"
msgstr "SQLite måste vara kompilerad för och köras i trådsäkert läge"
-#: ../libsvn_subr/sqlite.c:747
+#: ../libsvn_subr/sqlite.c:766
#, c-format
msgid "Could not configure SQLite [S%d]"
msgstr "Kunde inte konfigurera SQLite [S%d]"
-#: ../libsvn_subr/sqlite.c:749
+#: ../libsvn_subr/sqlite.c:768
msgid "Could not initialize SQLite"
msgstr "Kunde inte initiera SQLite"
-#: ../libsvn_subr/sqlite.c:1178
+#: ../libsvn_subr/sqlite.c:1312
#, c-format
msgid "SQLite hotcopy failed for %s"
msgstr "SQLite-kopiering under drift misslyckades för %s"
-#: ../libsvn_subr/string.c:943 ../libsvn_subr/string.c:987
+#: ../libsvn_subr/string.c:954 ../libsvn_subr/string.c:998
#, c-format
msgid "Could not convert '%s' into a number"
msgstr "Kunde inte omvandla \"%s\" till ett tal"
-#: ../libsvn_subr/subst.c:1793 ../libsvn_wc/props.c:1660
+#: ../libsvn_subr/subst.c:1809 ../libsvn_wc/props.c:1660
#, c-format
msgid "File '%s' has inconsistent newlines"
msgstr "Filen \"%s\" har inkonsekventa radslut"
@@ -6759,15 +6761,25 @@ msgstr " (%a %e %b %Y)"
msgid "Token '%s' is unrecognized"
msgstr "Okänt nyckelord \"%s\""
-#: ../libsvn_subr/types.c:48
+#: ../libsvn_subr/types.c:52
+#, c-format
+msgid "Negative revision number found parsing '%s'"
+msgstr "Negativt revisionsnummer i \"%s\""
+
+#: ../libsvn_subr/types.c:53
#, c-format
msgid "Invalid revision number found parsing '%s'"
msgstr "Ogiltigt revisionsnummer i \"%s\""
-#: ../libsvn_subr/types.c:60
-#, c-format
-msgid "Negative revision number found parsing '%s'"
-msgstr "Negativt revisionsnummer i \"%s\""
+#: ../libsvn_subr/types.c:64
+#, fuzzy, c-format
+msgid "Revision number longer than 10 digits '%s'"
+msgstr "Ogiltigt revisionsnummer i \"%s\""
+
+#: ../libsvn_subr/types.c:70
+#, fuzzy, c-format
+msgid "Revision number too large '%s'"
+msgstr "Ogiltigt revisionsnummer i \"%s\""
#: ../libsvn_subr/utf.c:245
#, c-format
@@ -6822,6 +6834,51 @@ msgstr ""
"följd av ogiltig UTF-8-sekvens\n"
"(hex:%s)"
+# ### inpresice
+#: ../libsvn_subr/utf8proc.c:159
+#, fuzzy, c-format
+msgid "Invalid Unicode character U+%04lX"
+msgstr "Ogiltigt tecken"
+
+#: ../libsvn_subr/utf8proc.c:202
+msgid "Cannot use a custom escape token in glob matching mode"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:233
+msgid "Escape token must be one character"
+msgstr ""
+
+# ### inpresice
+#: ../libsvn_subr/utf8proc.c:236
+#, fuzzy, c-format
+msgid "Invalid escape character U+%04lX"
+msgstr "Ogiltigt tecken"
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:117
+msgid "Memory for processing UTF-8 data could not be allocated."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:119
+msgid "UTF-8 string is too long to be processed."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:121
+#, fuzzy
+msgid "Invalid UTF-8 string"
+msgstr "Ogiltig URL \"%s\""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:123
+msgid "Unassigned Unicode code point found in UTF-8 string."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:125
+msgid "Invalid options for UTF-8 processing chosen."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:127
+msgid "An unknown error occured while processing UTF-8 data."
+msgstr ""
+
#: ../libsvn_subr/validate.c:56
#, c-format
msgid "MIME type '%s' has empty media type"
@@ -6843,17 +6900,17 @@ msgid "MIME type '%s' contains invalid character '0x%02x' in postfix"
msgstr "MIME-typen \"%s\" innehåller det ogiltiga tecknet \"0x%02x\" i postfix"
#: ../libsvn_subr/version.c:91
-#, c-format
+#, fuzzy, c-format
msgid "Version mismatch in '%s'%s: found %d.%d.%d%s, expected %d.%d.%d%s"
-msgstr "Versioner stämmer ej i \"%s\"%s: hittade %d.%d.%d%s, väntade %d.%d.%d%s"
+msgstr "Versioner stämmer ej i \"%s\": hittade %d.%d.%d%s, väntade %d.%d.%d%s"
#: ../libsvn_subr/version.c:96
msgid " (expecting equality)"
-msgstr " (likhet förväntad)"
+msgstr ""
#: ../libsvn_subr/version.c:98
msgid " (expecting compatibility)"
-msgstr " (kompatibilitet förväntad)"
+msgstr ""
#: ../libsvn_subr/version.c:139
msgid ""
@@ -6943,17 +7000,17 @@ msgstr "Revisionen %ld stämmer inte med den existerande revisionen %ld i \"%s\"
msgid "URL '%s' (uuid: '%s') doesn't match existing URL '%s' (uuid: '%s') in '%s'"
msgstr "URL:en \"%s\" (UUID: \"%s\") stämmer inte med den existerande URL:en \"%s\" (UUID: \"%s\") i \"%s\""
-#: ../libsvn_wc/adm_ops.c:602 ../libsvn_wc/update_editor.c:5244
+#: ../libsvn_wc/adm_ops.c:602 ../libsvn_wc/update_editor.c:5237
#, c-format
msgid "Can't find parent directory's node while trying to add '%s'"
msgstr "Kunde inte hitta föräldrakatalogens nod när \"%s\" skulle läggas till"
-#: ../libsvn_wc/adm_ops.c:611 ../libsvn_wc/update_editor.c:5238
+#: ../libsvn_wc/adm_ops.c:611 ../libsvn_wc/update_editor.c:5231
#, c-format
msgid "Can't add '%s' to a parent directory scheduled for deletion"
msgstr "Kan inte lägga till \"%s\" i en föräldrakatalog som är schemalagd för radering"
-#: ../libsvn_wc/adm_ops.c:618 ../libsvn_wc/update_editor.c:5251
+#: ../libsvn_wc/adm_ops.c:618 ../libsvn_wc/update_editor.c:5244
#, c-format
msgid "Can't schedule an addition of '%s' below a not-directory node"
msgstr "Kan inte schemalägga ett tillägg av \"%s\" under en nod som inte är en katalog"
@@ -7000,29 +7057,29 @@ msgstr "Inte ett fullständigt konfliktskelett"
msgid "Conflict not set"
msgstr "Konflikt inte satt"
-#: ../libsvn_wc/conflicts.c:1438 ../libsvn_wc/conflicts.c:1790
+#: ../libsvn_wc/conflicts.c:1435 ../libsvn_wc/conflicts.c:1801
msgid "Conflict callback violated API: returned no results"
msgstr "Konfliktprocedur bröt mot API:et: returnerade inga resultat"
-#: ../libsvn_wc/conflicts.c:1482
+#: ../libsvn_wc/conflicts.c:1479
msgid "Conflict callback violated API: returned no merged file"
msgstr "Konfliktprocedur bröt mot API:et: returnerade ingen sammanslagen fil"
-#: ../libsvn_wc/conflicts.c:2468 ../libsvn_wc/conflicts.c:2644
+#: ../libsvn_wc/conflicts.c:2479 ../libsvn_wc/conflicts.c:2655
msgid "Invalid 'conflict_result' argument"
msgstr "Ogiltigt \"conflict_result\"-argument"
-#: ../libsvn_wc/conflicts.c:2767 ../libsvn_wc/conflicts.c:2807
+#: ../libsvn_wc/conflicts.c:2778 ../libsvn_wc/conflicts.c:2818
#, c-format
msgid "Tree conflict can only be resolved to 'working' or 'mine-conflict' state; '%s' not resolved"
msgstr "Trädkonflikt kan endast lösas till tillstånden \"working\" eller \"mine-conflict\"; \"%s\" ej löst"
-#: ../libsvn_wc/conflicts.c:2822
+#: ../libsvn_wc/conflicts.c:2833
#, c-format
msgid "Tree conflict can only be resolved to 'working' state; '%s' not resolved"
msgstr "Trädkonflikt kan endast lösas till tillståndet \"working\"; \"%s\" ej löst"
-#: ../libsvn_wc/conflicts.c:2924
+#: ../libsvn_wc/conflicts.c:2935
msgid "No conflict-callback and no pre-defined conflict-choice provided"
msgstr "Ingen konfliktprocedur och inget fördefinierad konfliktval tillhandahölls"
@@ -7036,13 +7093,13 @@ msgstr "Källan \"%s\" är av oväntat slag"
msgid "cannot handle node kind for '%s'"
msgstr "kan inte hantera nodtyp för \"%s\""
-#: ../libsvn_wc/copy.c:432 ../libsvn_wc/wc_db.c:4412 ../libsvn_wc/wc_db.c:4987
+#: ../libsvn_wc/copy.c:432 ../libsvn_wc/wc_db.c:4411 ../libsvn_wc/wc_db.c:4986
#, c-format
msgid "Cannot handle status of '%s'"
msgstr "Kan inte hantera tillståndet för \"%s\""
-#: ../libsvn_wc/copy.c:441 ../libsvn_wc/wc_db.c:4403 ../libsvn_wc/wc_db.c:4981
-#: ../libsvn_wc/wc_db.c:5215
+#: ../libsvn_wc/copy.c:441 ../libsvn_wc/wc_db.c:4402 ../libsvn_wc/wc_db.c:4980
+#: ../libsvn_wc/wc_db.c:5214
#, c-format
msgid "Cannot copy '%s' excluded by server"
msgstr "Kan inte kopiera \"%s\" som är utesluten av servern"
@@ -7270,7 +7327,7 @@ msgstr "Okänt format för den relativa externa URL:en \"%s\""
msgid "Path '%s' ends in '%s', which is unsupported for this operation"
msgstr "Sökvägen \"%s\" slutar med \"%s\", vilket inte stöds för den här operationen"
-#: ../libsvn_wc/lock.c:773 ../libsvn_wc/wc_db.c:13652
+#: ../libsvn_wc/lock.c:773 ../libsvn_wc/wc_db.c:13654
#, c-format
msgid "Working copy '%s' locked"
msgstr "Arbetskopian \"%s\" är låst"
@@ -7310,12 +7367,12 @@ msgstr "Inget skrivlås i \"%s\""
msgid "Can't obtain lock on non-directory '%s'."
msgstr "Kan inte låsa icke-katalogen \"%s\""
-#: ../libsvn_wc/merge.c:1281 ../libsvn_wc/props.c:257
+#: ../libsvn_wc/merge.c:1276 ../libsvn_wc/props.c:257
#, c-format
msgid "Can't merge into conflicted node '%s'"
msgstr "Kan inte slå samman till konfliktnoden \"%s\""
-#: ../libsvn_wc/merge.c:1324 ../libsvn_wc/props.c:273
+#: ../libsvn_wc/merge.c:1319 ../libsvn_wc/props.c:273
#, c-format
msgid "The property '%s' may not be merged into '%s'."
msgstr "Egenskapen \"%s\" får inte slås samman till \"%s\"."
@@ -7365,17 +7422,17 @@ msgstr "Hittade ett oväntat \\0 i externa filen \"%s\""
msgid "Illegal file external revision kind %d for path '%s'"
msgstr "Ogiltig revisionstyp %d för extern fil med sökväg \"%s\""
-#: ../libsvn_wc/old-and-busted.c:489 ../libsvn_wc/old-and-busted.c:847
+#: ../libsvn_wc/old-and-busted.c:489 ../libsvn_wc/old-and-busted.c:843
#, c-format
msgid "Entry '%s' has invalid node kind"
msgstr "Posten \"%s\" har ogiltig nodtyp"
-#: ../libsvn_wc/old-and-busted.c:510 ../libsvn_wc/old-and-busted.c:827
+#: ../libsvn_wc/old-and-busted.c:510 ../libsvn_wc/old-and-busted.c:823
#, c-format
msgid "Entry for '%s' has invalid repository root"
msgstr "Posten för \"%s\" har ogiltig arkivrot"
-#: ../libsvn_wc/old-and-busted.c:531 ../libsvn_wc/old-and-busted.c:872
+#: ../libsvn_wc/old-and-busted.c:531 ../libsvn_wc/old-and-busted.c:868
#, c-format
msgid "Entry '%s' has invalid 'schedule' value"
msgstr "Posten \"%s\" har ogiltigt \"schedule\"-värde"
@@ -7390,37 +7447,37 @@ msgstr "Posten \"%s\" har ogiltigt \"depth\"-värde"
msgid "Entry '%s' has invalid '%s' value"
msgstr "Posten \"%s\" har ogiltigt värde för \"%s\""
-#: ../libsvn_wc/old-and-busted.c:1085
+#: ../libsvn_wc/old-and-busted.c:1081
#, c-format
msgid "XML parser failed in '%s'"
msgstr "XML-tolken misslyckades i \"%s\""
-#: ../libsvn_wc/old-and-busted.c:1141
+#: ../libsvn_wc/old-and-busted.c:1137
msgid "Missing default entry"
msgstr "Normalpost saknas"
-#: ../libsvn_wc/old-and-busted.c:1146
+#: ../libsvn_wc/old-and-busted.c:1142
msgid "Default entry has no revision number"
msgstr "Normalposten saknar revisionsnummer"
-#: ../libsvn_wc/old-and-busted.c:1151
+#: ../libsvn_wc/old-and-busted.c:1147
msgid "Default entry is missing URL"
msgstr "Normalposten saknar URL"
-#: ../libsvn_wc/old-and-busted.c:1230
+#: ../libsvn_wc/old-and-busted.c:1226
#, c-format
msgid "Invalid version line in entries file of '%s'"
msgstr "Felaktig versionsrad i postfilen för \"%s\""
-#: ../libsvn_wc/old-and-busted.c:1247
+#: ../libsvn_wc/old-and-busted.c:1243
msgid "Missing entry terminator"
msgstr "Avslutningstecken för posten saknas"
-#: ../libsvn_wc/old-and-busted.c:1250
+#: ../libsvn_wc/old-and-busted.c:1246
msgid "Invalid entry terminator"
msgstr "Ogiltigt avslutningstecken för post"
-#: ../libsvn_wc/old-and-busted.c:1254
+#: ../libsvn_wc/old-and-busted.c:1250
#, c-format
msgid "Error at entry %d in entries file for '%s':"
msgstr "Fel vid post %d i postfilen för \"%s\":"
@@ -7572,7 +7629,7 @@ msgstr "Kan inte sätta \"%s\" på en fil (\"%s\")"
#: ../libsvn_wc/props.c:1641
#, c-format
msgid "Can't set '%s': file '%s' has binary mime type property"
-msgstr "Kan inte sätta \"%s\": filen \"%s\" har binär mime-typsegenskap"
+msgstr "Kan inte sätta \"%s\": filen \"%s\" har binär MIME-typsegenskap"
#: ../libsvn_wc/props.c:1686
msgid "Failed to load current properties"
@@ -7664,7 +7721,7 @@ msgstr "Ogiltigt \"node_kind\"-fält i beskrivning av trädkonflikt"
msgid "Attempt to add tree conflict that already exists at '%s'"
msgstr "Försök att lägga till en trädkonflikt som redan finns vid \"%s\""
-#: ../libsvn_wc/update_editor.c:999
+#: ../libsvn_wc/update_editor.c:998
#, c-format
msgid ""
"Checksum mismatch while updating '%s':\n"
@@ -7675,41 +7732,41 @@ msgstr ""
" väntad: %s\n"
" erhållen: %s\n"
-#: ../libsvn_wc/update_editor.c:1134
+#: ../libsvn_wc/update_editor.c:1129
#, c-format
msgid "'%s' is not valid as filename in directory '%s'"
msgstr "\"%s\" är inte giltig som filnamn i katalogen \"%s\""
-#: ../libsvn_wc/update_editor.c:1611
+#: ../libsvn_wc/update_editor.c:1606
#, c-format
msgid "Unexpected attempt to add a node at path '%s'"
msgstr "Oväntat försök att lägga till en nod vid sökvägen \"%s\""
-#: ../libsvn_wc/update_editor.c:1622
+#: ../libsvn_wc/update_editor.c:1617
#, c-format
msgid "Unexpected attempt to edit, delete, or replace a node at path '%s'"
msgstr "Oväntat försök att ändra, radera eller ersätta en nod vid sökvägen \"%s\""
-#: ../libsvn_wc/update_editor.c:2036
+#: ../libsvn_wc/update_editor.c:2029
#, c-format
msgid "Failed to add directory '%s': object of the same name as the administrative directory"
msgstr "Kunde inte lägga till katalogen \"%s\": objektet har samma namn som förvaltningskatalogen"
-#: ../libsvn_wc/update_editor.c:2694
+#: ../libsvn_wc/update_editor.c:2687
msgid "Couldn't do property merge"
msgstr "Kunde inte slå ihop egenskaper"
-#: ../libsvn_wc/update_editor.c:3050
+#: ../libsvn_wc/update_editor.c:3043
#, c-format
msgid "Failed to mark '%s' absent: item of the same name is already scheduled for addition"
msgstr "Kunde inte markera \"%s\" som saknad: ett objekt med det namnet är redan schemalagt att läggas till"
-#: ../libsvn_wc/update_editor.c:3138
+#: ../libsvn_wc/update_editor.c:3131
#, c-format
msgid "Failed to add file '%s': object of the same name as the administrative directory"
msgstr "Misslyckades att lägga till filen \"%s\": objektet har samma namn som förvaltningskatalogen"
-#: ../libsvn_wc/update_editor.c:3660
+#: ../libsvn_wc/update_editor.c:3653
#, c-format
msgid ""
"Checksum mismatch for '%s':\n"
@@ -7720,22 +7777,22 @@ msgstr ""
" väntad: %s\n"
" lagrad: %s\n"
-#: ../libsvn_wc/update_editor.c:5219
+#: ../libsvn_wc/update_editor.c:5212
#, c-format
msgid "Node '%s' exists."
msgstr "Noden \"%s\" finns redan."
-#: ../libsvn_wc/update_editor.c:5279
+#: ../libsvn_wc/update_editor.c:5272
#, c-format
msgid "Copyfrom-url '%s' has different repository root than '%s'"
msgstr "URL:en för kopieringskällan till \"%s\" har annan arkivrot än \"%s\""
-#: ../libsvn_wc/update_editor.c:5477
+#: ../libsvn_wc/update_editor.c:5470
#, c-format
msgid "'%s' is not an unmodified copied directory"
msgstr "\"%s\" är inte en oförändrad kopierad katalog"
-#: ../libsvn_wc/update_editor.c:5488
+#: ../libsvn_wc/update_editor.c:5481
#, c-format
msgid "Copyfrom '%s' doesn't match original location of '%s'"
msgstr "Kopieringskällan \"%s\" motsvarar inte den ursprungliga platsen \"%s\""
@@ -7816,160 +7873,160 @@ msgstr "Ingen \"REPOSITORY\"-tabellpost för ID \"%ld\""
msgid "The file '%s' has no checksum."
msgstr "Filen \"%s\" saknar kontrollsumma."
-#: ../libsvn_wc/wc_db.c:2468 ../libsvn_wc/wc_db.c:2849
-#: ../libsvn_wc/wc_db.c:8890
+#: ../libsvn_wc/wc_db.c:2467 ../libsvn_wc/wc_db.c:2848
+#: ../libsvn_wc/wc_db.c:8889
#, c-format
msgid "The node '%s' has a corrupt checksum value."
msgstr "Noden \"%s\" har en trasig kontrollsumma."
-#: ../libsvn_wc/wc_db.c:2653
+#: ../libsvn_wc/wc_db.c:2652
#, c-format
msgid "The node '%s' has a BASE status that has no properties."
msgstr "Noden \"%s\" har ett \"BASE\"-tillstånd utan egenskaper."
-#: ../libsvn_wc/wc_db.c:3479
+#: ../libsvn_wc/wc_db.c:3478
#, c-format
msgid "The node '%s' is not an external."
msgstr "Noden \"%s\" är inte extern."
-#: ../libsvn_wc/wc_db.c:3886
+#: ../libsvn_wc/wc_db.c:3885
#, c-format
msgid "Expected node '%s' to be deleted."
msgstr "Noden \"%s\" väntades vara raderad."
-#: ../libsvn_wc/wc_db.c:6367 ../libsvn_wc/wc_db.c:6445
+#: ../libsvn_wc/wc_db.c:6366 ../libsvn_wc/wc_db.c:6444
#, c-format
msgid "Can't revert '%s' without reverting children"
msgstr "Kan inte återställa \"%s\" utan att återställa dess barn"
-#: ../libsvn_wc/wc_db.c:6542
+#: ../libsvn_wc/wc_db.c:6541
#, c-format
msgid "Can't revert '%s' without reverting parent"
msgstr "Kan inte återställa \"%s\" utan att återställa dess förälder"
-#: ../libsvn_wc/wc_db.c:6659
+#: ../libsvn_wc/wc_db.c:6658
#, c-format
msgid "Unsupported depth for revert of '%s'"
msgstr "Djupet för återställningen av \"%s\" stöds inte"
-#: ../libsvn_wc/wc_db.c:7502
+#: ../libsvn_wc/wc_db.c:7501
#, c-format
msgid "Cannot delete '%s' as '%s' is excluded by server"
msgstr "Kan inte ta bort \"%s\" eftersom servern har uteslutit \"%s\""
-#: ../libsvn_wc/wc_db.c:7513
+#: ../libsvn_wc/wc_db.c:7512
#, c-format
msgid "Cannot delete '%s' as it is excluded by server"
msgstr "Kan inte ta bort \"%s\" eftersom servern har uteslutit den"
-#: ../libsvn_wc/wc_db.c:7520
+#: ../libsvn_wc/wc_db.c:7519
#, c-format
msgid "Cannot delete '%s' as it is excluded"
msgstr "Kan inte ta bort \"%s\" eftersom den är utesluten"
-#: ../libsvn_wc/wc_db.c:7934
+#: ../libsvn_wc/wc_db.c:7933
#, c-format
msgid "Cannot move '%s' to '%s' because they are not in the same working copy"
msgstr "Kan inte flytta \"%s\" till \"%s\" eftersom de inte är i samma arbetskopia"
-#: ../libsvn_wc/wc_db.c:8292
+#: ../libsvn_wc/wc_db.c:8291
#, c-format
msgid "Corrupt data for '%s'"
msgstr "Trasig data för \"%s\""
-#: ../libsvn_wc/wc_db.c:8596
+#: ../libsvn_wc/wc_db.c:8595
#, c-format
msgid "The node '%s' comes from unexpected repository '%s', expected '%s'; if this node is a file external using the correct URL in the external definition can fix the problem, see issue #4087"
msgstr "Noden \"%s\" tillhör arkiv \"%s\" istället för \"%s\"; om denna nod är en extern fil så kan problemet lösas genom att använda rätt URL i den externa definitionen, se felrapport nr 4087"
-#: ../libsvn_wc/wc_db.c:9015
+#: ../libsvn_wc/wc_db.c:9014
#, c-format
msgid "The node '%s' is not in working copy '%s'"
msgstr "Noden \"%s\" är inte i arbetskopian \"%s\""
-#: ../libsvn_wc/wc_db.c:9052
+#: ../libsvn_wc/wc_db.c:9051
#, c-format
msgid "The node '%s' is not installable"
msgstr "Noden \"%s\" kan inte installeras"
-#: ../libsvn_wc/wc_db.c:9481 ../libsvn_wc/wc_db.c:9740
+#: ../libsvn_wc/wc_db.c:9480 ../libsvn_wc/wc_db.c:9739
#, c-format
msgid "The node '%s' has a status that has no properties."
msgstr "Noden \"%s\" har ett tillstånd utan egenskaper."
-#: ../libsvn_wc/wc_db.c:11580
+#: ../libsvn_wc/wc_db.c:11579
#, c-format
msgid "Expected node '%s' to be added."
msgstr "Noden \"%s\" förväntades ha lagts till."
-#: ../libsvn_wc/wc_db.c:11926
+#: ../libsvn_wc/wc_db.c:11925
#, c-format
msgid "Path '%s' was not moved here"
msgstr "Sökvägen \"%s\" har inte flyttats hit"
-#: ../libsvn_wc/wc_db.c:11995
+#: ../libsvn_wc/wc_db.c:11994
#, c-format
msgid "The base node '%s' was not found."
msgstr "Basnoden \"%s\" hittades inte."
-#: ../libsvn_wc/wc_db.c:12427
+#: ../libsvn_wc/wc_db.c:12425
#, c-format
msgid "The properties of '%s' are in an indeterminate state and cannot be upgraded. See issue #2530."
msgstr "Egenskaperna för \"%s\" är i ett obestämt tillstånd och kan inte uppgraderas. Se felrapport nr 2530."
-#: ../libsvn_wc/wc_db.c:12439
+#: ../libsvn_wc/wc_db.c:12437
#, c-format
msgid "Insufficient NODES rows for '%s'"
msgstr "Inte tillräckligt med \"NODES\"-rader för \"%s\""
-#: ../libsvn_wc/wc_db.c:12586
+#: ../libsvn_wc/wc_db.c:12584
#, c-format
msgid "Repository '%s' not found in the database"
msgstr "Arkivet \"%s\" finns inte i databasen"
-#: ../libsvn_wc/wc_db.c:13573 ../libsvn_wc/wc_db.c:13621
+#: ../libsvn_wc/wc_db.c:13575 ../libsvn_wc/wc_db.c:13623
#, c-format
msgid "'%s' is already locked."
msgstr "\"%s\" är redan låst."
-#: ../libsvn_wc/wc_db.c:13578 ../libsvn_wc/wc_db.c:13629
+#: ../libsvn_wc/wc_db.c:13580 ../libsvn_wc/wc_db.c:13631
#, c-format
msgid "Working copy '%s' locked."
msgstr "Arbetskopian \"%s\" är låst."
-#: ../libsvn_wc/wc_db.c:13701
+#: ../libsvn_wc/wc_db.c:13703
#, c-format
msgid "'%s' is already locked via '%s'."
msgstr "\"%s\" är redan låst genom \"%s\"."
-#: ../libsvn_wc/wc_db.c:13875
+#: ../libsvn_wc/wc_db.c:13877
#, c-format
msgid "Working copy not locked at '%s'."
msgstr "Arbetskopian inte låst vid \"%s\"."
-#: ../libsvn_wc/wc_db.c:14258
+#: ../libsvn_wc/wc_db.c:14260
#, c-format
msgid "Modification of '%s' already exists"
msgstr "Ändringen av \"%s\" finns redan"
#. If EXPRESSION is false, cause the caller to return an SVN_ERR_WC_CORRUPT
#. * error, showing EXPRESSION and the caller's LOCAL_RELPATH in the message.
-#: ../libsvn_wc/wc_db.c:14900
+#: ../libsvn_wc/wc_db.c:14902
#, c-format
msgid "database inconsistency at local_relpath='%s' verifying expression '%s'"
msgstr "inkonsistens i databasen vid \"local_relpath\" \"%s\" när uttrycket \"%s\" kontrollerades"
-#: ../libsvn_wc/wc_db.c:15024
+#: ../libsvn_wc/wc_db.c:15026
#, c-format
msgid "Can't upgrade '%s' as it is not a working copy root"
msgstr "Kan inte uppgradera \"%s\" eftersom den inte är rot till en arbetskopia"
-#: ../libsvn_wc/wc_db.c:15030
+#: ../libsvn_wc/wc_db.c:15032
#, c-format
msgid "Working copy '%s' is too old and must be upgraded to at least format %d, as created by Subversion %s"
msgstr "Arbetskopian \"%s\" är för gammal och måste uppgraderas till åtminstone format %d, vilket är vad Subversion %s använder"
-#: ../libsvn_wc/wc_db.c:15048
+#: ../libsvn_wc/wc_db.c:15050
msgid "Working copy upgrade failed"
msgstr "Uppgradering av arbetskopian misslyckades"
@@ -8048,12 +8105,12 @@ msgstr "En rad i \"WCROOT\" saknas."
msgid "Working copy database '%s' not found"
msgstr "Arbetskopians databas \"%s\" hittades inte"
-#: ../libsvn_wc/wc_db_wcroot.c:276
+#: ../libsvn_wc/wc_db_wcroot.c:274
#, c-format
msgid "Working copy format of '%s' is too old (%d); please check out your working copy again"
msgstr "Arbetskopian \"%s\" har för gammalt format (%d); checka ut din arbetskopia igen"
-#: ../libsvn_wc/wc_db_wcroot.c:286
+#: ../libsvn_wc/wc_db_wcroot.c:284
#, c-format
msgid ""
"This client is too old to work with the working copy at\n"
@@ -8066,11 +8123,11 @@ msgstr ""
"En nyare Subversionklient behövs. För mer detaljer, se\n"
" http://subversion.apache.org/faq.html#working-copy-format-change\n"
-#: ../libsvn_wc/wc_db_wcroot.c:307
+#: ../libsvn_wc/wc_db_wcroot.c:305
msgid "Cleanup with an older 1.7 client before upgrading with this client"
msgstr "Kör (\"svn cleanup\") med en äldre version av Subversion 1.7 före uppgradering med denna klient"
-#: ../libsvn_wc/wc_db_wcroot.c:318
+#: ../libsvn_wc/wc_db_wcroot.c:316
#, c-format
msgid ""
"The working copy at '%s'\n"
@@ -8079,47 +8136,47 @@ msgstr ""
"Arbetskopian vid \"%s\"\n"
"är för gammal (format %d) för att kunna användas med en klient som har version \"%s\" (format %d förväntas). Arbetskopian måste uppgraderas först.\n"
-#: ../libsvn_wc/wc_db_wcroot.c:396
+#: ../libsvn_wc/wc_db_wcroot.c:394
#, c-format
msgid "The symlink at '%s' points nowhere"
msgstr "Den symboliska länken vid \"%s\" pekar ingenstans"
-#: ../libsvn_wc/wc_db_wcroot.c:665
+#: ../libsvn_wc/wc_db_wcroot.c:663
#, c-format
msgid "Missing a row in WCROOT for '%s'."
msgstr "En rad i \"WCROOT\" saknas för \"%s\"."
-#: ../libsvn_wc/wc_db_wcroot.c:716
+#: ../libsvn_wc/wc_db_wcroot.c:714
#, c-format
msgid "The working copy at '%s' is corrupt."
msgstr "Förstörd arbetskopia \"%s\"."
-#: ../libsvn_wc/wc_db_wcroot.c:732
+#: ../libsvn_wc/wc_db_wcroot.c:730
#, c-format
msgid "The working copy database at '%s' is missing."
msgstr "Arbetskopians databas \"%s\" saknas."
-#: ../libsvn_wc/wc_db_wcroot.c:741
+#: ../libsvn_wc/wc_db_wcroot.c:739
#, c-format
msgid "The working copy database at '%s' is corrupt."
msgstr "Arbetskopians databas \"%s\" är trasig."
-#: ../libsvn_wc/wc_db_wcroot.c:899
+#: ../libsvn_wc/wc_db_wcroot.c:897
#, c-format
msgid "'%s' is not a working copy root"
msgstr "\"%s\" är inte rot till en arbetskopia"
-#: ../libsvn_wc/workqueue.c:518
+#: ../libsvn_wc/workqueue.c:513
#, c-format
msgid "Can't install '%s' from pristine store, because no checksum is recorded for this file"
msgstr "Kan inte installera \"%s\" från lagringen av orörd data eftersom ingen kontrollsumma har registrerats för denna fil"
-#: ../libsvn_wc/workqueue.c:1499
+#: ../libsvn_wc/workqueue.c:1494
#, c-format
msgid "Unrecognized work item in the queue"
msgstr "Okänt element i arbetskön"
-#: ../libsvn_wc/workqueue.c:1579
+#: ../libsvn_wc/workqueue.c:1574
#, c-format
msgid "Failed to run the WC DB work queue associated with '%s', work item %d %s"
msgstr "Misslyckades med att behandla arbetskopians databaskö kopplad till \"%s\", element %d %s"
@@ -8137,7 +8194,7 @@ msgid "'verbose' option invalid in XML mode"
msgstr "Flaggan \"verbose\" är inte tillåten i XML-läge"
#: ../svn/blame-cmd.c:315 ../svn/info-cmd.c:613 ../svn/list-cmd.c:312
-#: ../svn/status-cmd.c:308
+#: ../svn/status-cmd.c:302
msgid "'incremental' option only valid in XML mode"
msgstr "Flaggan \"incremental\" är endast tillåten i XML-läge"
@@ -8346,11 +8403,19 @@ msgstr "%s, %s %s"
msgid "local: %s %s incoming: %s %s %s"
msgstr "lokalt: %s %s inkommande: %s %s %s"
-#: ../svn/cleanup-cmd.c:92
+#: ../svn/cleanup-cmd.c:88
+msgid "Working copy locked; if no other Subversion client is currently using the working copy, try running 'svn cleanup' without the --remove-unversioned and --remove-ignored options first."
+msgstr ""
+
+#: ../svn/cleanup-cmd.c:105
#, c-format
msgid "Working copy locked; try running 'svn cleanup' on the root of the working copy ('%s') instead."
msgstr "Låst arbetskopia; försök istället att köra \"svn cleanup\" på arbetskopians rot (\"%s\")."
+#: ../svn/cleanup-cmd.c:116
+msgid "Cannot remove unversioned or ignored items from something that is not a working copy"
+msgstr ""
+
#: ../svn/commit-cmd.c:80
#, c-format
msgid "svn: The depth of this commit is '%s', but copies are always performed recursively in the repository.\n"
@@ -8360,47 +8425,47 @@ msgstr "svn: Djupet för denna arkivering är \"%s\", men kopiering görs alltid
msgid "Commit targets must be local paths"
msgstr "Arkiveringsmål måste vara lokala sökvägar"
-#: ../svn/conflict-callbacks.c:155 ../svn/conflict-callbacks.c:172
+#: ../svn/conflict-callbacks.c:157 ../svn/conflict-callbacks.c:174
msgid "MINE"
msgstr "MIN"
-#: ../svn/conflict-callbacks.c:160 ../svn/conflict-callbacks.c:170
+#: ../svn/conflict-callbacks.c:162 ../svn/conflict-callbacks.c:172
msgid "THEIRS"
msgstr "ANDRAS"
-#: ../svn/conflict-callbacks.c:163
+#: ../svn/conflict-callbacks.c:165
msgid "MERGED"
msgstr "SAMMANSLAGNING"
-#: ../svn/conflict-callbacks.c:220 ../svn/conflict-callbacks.c:276
+#: ../svn/conflict-callbacks.c:222 ../svn/conflict-callbacks.c:278
msgid "||||||| ORIGINAL"
msgstr "||||||| ORIGINAL"
-#: ../svn/conflict-callbacks.c:221
+#: ../svn/conflict-callbacks.c:223
msgid "<<<<<<< MINE (select with 'mc')"
msgstr "<<<<<<< MIN (välj med \"mc\")"
-#: ../svn/conflict-callbacks.c:222
+#: ../svn/conflict-callbacks.c:224
msgid ">>>>>>> THEIRS (select with 'tc')"
msgstr ">>>>>>> ANDRAS (välj med \"tc\")"
-#: ../svn/conflict-callbacks.c:277
+#: ../svn/conflict-callbacks.c:279
msgid "<<<<<<< MINE"
msgstr "<<<<<<< MIN"
-#: ../svn/conflict-callbacks.c:278
+#: ../svn/conflict-callbacks.c:280
msgid ">>>>>>> THEIRS"
msgstr ">>>>>>> ANDRAS"
-#: ../svn/conflict-callbacks.c:333 ../svn/file-merge.c:503
+#: ../svn/conflict-callbacks.c:335 ../svn/file-merge.c:503
msgid "No editor found."
msgstr "Ingen editor hittades."
-#: ../svn/conflict-callbacks.c:342 ../svn/file-merge.c:515
+#: ../svn/conflict-callbacks.c:344 ../svn/file-merge.c:515
msgid "Error running editor."
msgstr "Fel vid körning av editor."
-#: ../svn/conflict-callbacks.c:352
+#: ../svn/conflict-callbacks.c:354
#, c-format
msgid ""
"Invalid option; there's no merged version to edit.\n"
@@ -8409,248 +8474,218 @@ msgstr ""
"Felaktig väljare; det finns ingen sammanslagen version att behandla.\n"
"\n"
-#: ../svn/conflict-callbacks.c:411
+#: ../svn/conflict-callbacks.c:413
msgid "No merge tool found, try '(m) merge' instead.\n"
msgstr "Inget sammanslagningsverktyg hittades; försök istället med \"m (merge)\".\n"
-#: ../svn/conflict-callbacks.c:419
+#: ../svn/conflict-callbacks.c:421
msgid "Error running merge tool, try '(m) merge' instead."
msgstr "Fel vid körning av sammanslagningsverktyg; försök istället med \"(m) merge\"."
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:453
msgid "change merged file in an editor [edit]"
msgstr "redigera sammanslagen fil i en editor [edit]"
#. Translators: keep long_desc below 70 characters (wrap with a left
#. margin of 9 spaces if needed); don't translate the words within square
#. brackets.
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:453
msgid "edit file"
msgstr "redigera fil"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:456
msgid "show all changes made to merged file"
msgstr "visa alla ändringar i sammanslagen fil"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:456
msgid "show diff"
msgstr "visa skillnader"
-#: ../svn/conflict-callbacks.c:456
+#: ../svn/conflict-callbacks.c:458
msgid "accept merged version of file"
msgstr "godta sammanslagen version av fil"
-#: ../svn/conflict-callbacks.c:456 ../svn/conflict-callbacks.c:501
-#: ../svn/conflict-callbacks.c:533
+#: ../svn/conflict-callbacks.c:458 ../svn/conflict-callbacks.c:503
+#: ../svn/conflict-callbacks.c:535
msgid "mark resolved"
msgstr "markera som löst"
-#: ../svn/conflict-callbacks.c:459 ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:461 ../svn/conflict-callbacks.c:500
msgid "display conflict"
msgstr "visa konflikt"
-#: ../svn/conflict-callbacks.c:459
+#: ../svn/conflict-callbacks.c:461
msgid "show all conflicts (ignoring merged version)"
msgstr "visa alla konflikter (utom sammanslagen version)"
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:463
msgid "accept my version for all conflicts (same) [mine-conflict]"
msgstr "godta min version för alla konflikter (likaså) [mine-conflict]"
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:463
msgid "my side of conflict"
msgstr "min sida av konflikt"
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:466
msgid "accept their version for all conflicts (same) [theirs-conflict]"
msgstr "godta andras version för alla konflikter (likaså) [theirs-conflict]"
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:466
msgid "their side of conflict"
msgstr "andras sida av konflikt"
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:492
+#: ../svn/conflict-callbacks.c:471
msgid "accept my version of entire file (even non-conflicts) [mine-full]"
msgstr ""
"godta min version av hela filen (allt, inte bara konflikter)\n"
" [mine-full]"
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:492
-#: ../svn/conflict-callbacks.c:515
+#: ../svn/conflict-callbacks.c:471 ../svn/conflict-callbacks.c:494
+#: ../svn/conflict-callbacks.c:517
msgid "my version"
msgstr "min version"
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:495
+#: ../svn/conflict-callbacks.c:474
msgid "accept their version of entire file (same) [theirs-full]"
msgstr "godta andras version av hela filen (likaså) [theirs-full]"
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:495
-#: ../svn/conflict-callbacks.c:518
+#: ../svn/conflict-callbacks.c:474 ../svn/conflict-callbacks.c:497
+#: ../svn/conflict-callbacks.c:520
msgid "their version"
msgstr "andras version"
-#: ../svn/conflict-callbacks.c:476 ../svn/util.c:774
+#: ../svn/conflict-callbacks.c:478 ../svn/util.c:769
msgid "merge"
msgstr "sammanslagning"
-#: ../svn/conflict-callbacks.c:476
+#: ../svn/conflict-callbacks.c:478
msgid "use internal merge tool to resolve conflict"
msgstr "använd interna sammanslagningsverktyget för att lösa konflikten"
-#: ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:480
msgid "launch external tool to resolve conflict [launch]"
msgstr "använd externt verktyg för att lösa konflikten [launch]"
-#: ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:480
msgid "launch tool"
msgstr "kör verktyg"
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
-#: ../svn/conflict-callbacks.c:521
+#: ../svn/conflict-callbacks.c:482 ../svn/conflict-callbacks.c:505
+#: ../svn/conflict-callbacks.c:523
msgid "mark the conflict to be resolved later [postpone]"
msgstr "markera konflikter för senare lösning [postpone]"
-#: ../svn/conflict-callbacks.c:480 ../svn/conflict-callbacks.c:503
-#: ../svn/conflict-callbacks.c:521 ../svn/conflict-callbacks.c:535
-#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:567
-#: ../svn/conflict-callbacks.c:583 ../svn/conflict-callbacks.c:599
+#: ../svn/conflict-callbacks.c:482 ../svn/conflict-callbacks.c:505
+#: ../svn/conflict-callbacks.c:523 ../svn/conflict-callbacks.c:537
+#: ../svn/conflict-callbacks.c:551 ../svn/conflict-callbacks.c:565
msgid "postpone"
msgstr "lös senare"
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:555 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585 ../svn/conflict-callbacks.c:601
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:508
+#: ../svn/conflict-callbacks.c:526 ../svn/conflict-callbacks.c:539
+#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:567
msgid "postpone all remaining conflicts"
msgstr "skjut upp lösningen av återstående konflikter"
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:555 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585 ../svn/conflict-callbacks.c:601
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:508
+#: ../svn/conflict-callbacks.c:526 ../svn/conflict-callbacks.c:539
+#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:567
msgid "quit resolution"
msgstr "avbryt lösning"
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:487
msgid "show all options"
msgstr "visa alla val"
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:487
msgid "show this list (also 'h', '?')"
msgstr "visa denna lista (även \"h\" och \"?\")"
-#: ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:494
+msgid "accept my version of entire property (even non-conflicts) [mine-full]"
+msgstr ""
+"godta min version av hela filen (allt, inte bara konflikter)\n"
+" [mine-full]"
+
+#: ../svn/conflict-callbacks.c:497
+msgid "accept their version of entire property (same) [theirs-full]"
+msgstr "godta andras version av hela filen (likaså) [theirs-full]"
+
+#: ../svn/conflict-callbacks.c:500
msgid "show conflicts in this property"
msgstr "visa konflikter i denna egenskap"
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:501
msgid "change merged property value in an editor [edit]"
msgstr "redigera sammanslagen egenskap i en editor [edit]"
-#: ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:501
msgid "edit property"
msgstr "redigera egenskap"
-#: ../svn/conflict-callbacks.c:501
+#: ../svn/conflict-callbacks.c:503
msgid "accept edited version of property"
msgstr "godta redigerad version av egenskap"
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:557
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
-#: ../svn/conflict-callbacks.c:603
+#: ../svn/conflict-callbacks.c:510 ../svn/conflict-callbacks.c:528
+#: ../svn/conflict-callbacks.c:541 ../svn/conflict-callbacks.c:555
+#: ../svn/conflict-callbacks.c:569
msgid "help"
msgstr "hjälp"
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:557
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
-#: ../svn/conflict-callbacks.c:603
+#: ../svn/conflict-callbacks.c:510 ../svn/conflict-callbacks.c:528
+#: ../svn/conflict-callbacks.c:541 ../svn/conflict-callbacks.c:555
+#: ../svn/conflict-callbacks.c:569
msgid "show this help (also '?')"
msgstr "visa denna hjälp (även \"?\")"
-#: ../svn/conflict-callbacks.c:515
+#: ../svn/conflict-callbacks.c:517
msgid "accept pre-existing item (ignore upstream addition) [mine-full]"
msgstr "godta befintligt objekt (strunta i mottaget tillägg) [mine-full]"
-#: ../svn/conflict-callbacks.c:518
+#: ../svn/conflict-callbacks.c:520
msgid "accept incoming item (overwrite pre-existing item) [theirs-full]"
msgstr "godta inkommande objekt (ersätt befintligt objekt) [theirs-full]"
-#: ../svn/conflict-callbacks.c:533
+#: ../svn/conflict-callbacks.c:535
msgid "accept current working copy state"
msgstr "godta nuvarande tillstånd i arbetskopia"
-#: ../svn/conflict-callbacks.c:535 ../svn/conflict-callbacks.c:553
-#: ../svn/conflict-callbacks.c:567 ../svn/conflict-callbacks.c:583
-#: ../svn/conflict-callbacks.c:599
+#: ../svn/conflict-callbacks.c:537 ../svn/conflict-callbacks.c:551
+#: ../svn/conflict-callbacks.c:565
msgid "resolve the conflict later [postpone]"
msgstr "lös konflikten senare [postpone]"
-#: ../svn/conflict-callbacks.c:545
-msgid "apply update (recommended)"
-msgstr "utför uppdateringen (rekommenderas)"
+#: ../svn/conflict-callbacks.c:547
+msgid "apply update to move destination (recommended)"
+msgstr "utför uppdateringen på målet för flyttningen (rekommenderas)"
-#: ../svn/conflict-callbacks.c:546
-msgid "apply update to the move destination [mine-conflict]"
-msgstr "utför uppdateringen på målet för flyttningen [mine-conflict]"
-
-#: ../svn/conflict-callbacks.c:549
-msgid "discard update (breaks move)"
-msgstr "överge uppdateringen (bryter flyttning)"
-
-#: ../svn/conflict-callbacks.c:549
-msgid "discard update, mark resolved, the move will will become a copy"
-msgstr "överge uppdateringen, markera som löst, flyttningen blir en kopia"
-
-#: ../svn/conflict-callbacks.c:563
-msgid "apply update to move destination"
-msgstr "utför uppdateringen på målet för flyttningen"
-
-#: ../svn/conflict-callbacks.c:564
+#: ../svn/conflict-callbacks.c:548
msgid "apply incoming update to move destination [mine-conflict]"
msgstr "utför inkommande uppdatering på målet för flyttningen [mine-conflict]"
-#: ../svn/conflict-callbacks.c:577 ../svn/conflict-callbacks.c:593
-msgid "keep affected local moves"
-msgstr "behåll lokala flyttningar som påverkas"
-
-#: ../svn/conflict-callbacks.c:577
-msgid "keep any local moves affected by this deletion [mine-conflict]"
+#: ../svn/conflict-callbacks.c:561
+msgid "prepare for updating moved-away children, if any (recommended)"
msgstr ""
-"behåll lokala flyttningar som påverkats av denna radering\n"
-" [mine-conflict]"
-
-#: ../svn/conflict-callbacks.c:580 ../svn/conflict-callbacks.c:596
-msgid "mark resolved (breaks moves)"
-msgstr "markera som löst (flyttningen blir en kopia)"
-#: ../svn/conflict-callbacks.c:580
-msgid "mark resolved, any affected moves will become copies"
-msgstr "markera som löst; påverkade flyttningar blir kopior"
-
-#: ../svn/conflict-callbacks.c:593
-msgid "keep any moves affected by this replacement [mine-conflict]"
-msgstr "behåll flyttningar påverkade av denna ersättning [mine-conflict]"
-
-#: ../svn/conflict-callbacks.c:596
-msgid "mark resolved (any affected moves will become copies)"
-msgstr "markera som löst (påverkade flyttningar blir kopior)"
+#: ../svn/conflict-callbacks.c:562
+msgid "allow updating moved-away children with 'svn resolve' [mine-conflict]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:632
+#: ../svn/conflict-callbacks.c:597
msgid "Select:"
msgstr "Välj:"
-#: ../svn/conflict-callbacks.c:659
+#: ../svn/conflict-callbacks.c:624
#, c-format
msgid " (%s) %s"
msgstr " (%s) %s"
-#: ../svn/conflict-callbacks.c:699
+#: ../svn/conflict-callbacks.c:664
msgid "Words in square brackets are the corresponding --accept option arguments.\n"
msgstr "Ord inom hakparenteser är motsvarande argument till flaggan --accept.\n"
-#: ../svn/conflict-callbacks.c:738
+#: ../svn/conflict-callbacks.c:703
#, c-format
msgid ""
"Unrecognized option.\n"
@@ -8659,12 +8694,12 @@ msgstr ""
"Okänd väljare.\n"
"\n"
-#: ../svn/conflict-callbacks.c:766
+#: ../svn/conflict-callbacks.c:731
#, c-format
msgid "Conflict discovered in file '%s'.\n"
msgstr "Konflikt upptäckt i filen \"%s\".\n"
-#: ../svn/conflict-callbacks.c:836
+#: ../svn/conflict-callbacks.c:801
#, c-format
msgid ""
"Invalid option; cannot display conflicts for a binary file.\n"
@@ -8673,14 +8708,14 @@ msgstr ""
"Ogiltig väljare; kan inte visa konflikter för en binärfil.\n"
"\n"
-#: ../svn/conflict-callbacks.c:845
+#: ../svn/conflict-callbacks.c:810
#, c-format
msgid ""
"Invalid option; original files not available.\n"
"\n"
msgstr "Ogiltig väljare; ursprungliga filerna ej tillgängliga.\n"
-#: ../svn/conflict-callbacks.c:857
+#: ../svn/conflict-callbacks.c:822
#, c-format
msgid ""
"Invalid option; there's no merged version to diff.\n"
@@ -8689,7 +8724,7 @@ msgstr ""
"Ogiltig väljare; det finns ingen sammanslagen version att jämföra med.\n"
"\n"
-#: ../svn/conflict-callbacks.c:877
+#: ../svn/conflict-callbacks.c:842
#, c-format
msgid ""
"Invalid option; can only resolve text conflicts with the internal merge tool.\n"
@@ -8698,7 +8733,7 @@ msgstr ""
"Ogiltig väljare; kan bara lösa textkonflikter med det interna sammanslagningsverktyget.\n"
"\n"
-#: ../svn/conflict-callbacks.c:903 ../svn/conflict-callbacks.c:920
+#: ../svn/conflict-callbacks.c:868 ../svn/conflict-callbacks.c:885
#, c-format
msgid ""
"Invalid option.\n"
@@ -8707,7 +8742,7 @@ msgstr ""
"Ogiltig väljare.\n"
"\n"
-#: ../svn/conflict-callbacks.c:929
+#: ../svn/conflict-callbacks.c:894
#, c-format
msgid ""
"Invalid option; cannot choose based on conflicts in a binary file.\n"
@@ -8716,8 +8751,8 @@ msgstr ""
"Ogiltig väljare; kan inte välja utifrån konflikter i en binärfil.\n"
"\n"
-#: ../svn/conflict-callbacks.c:943
-#, c-format
+#: ../svn/conflict-callbacks.c:908
+#, fuzzy, c-format
msgid ""
"Invalid option; use diff/edit/merge/launch before choosing 'mark resolved'.\n"
"\n"
@@ -8725,21 +8760,19 @@ msgstr ""
"Ogiltig väljare; använd \"df\", \"e\", \"m\" eller \"l\" före \"r\".\n"
"\n"
-#: ../svn/conflict-callbacks.c:984
+#: ../svn/conflict-callbacks.c:949
#, c-format
msgid "Conflict for property '%s' discovered on '%s'.\n"
msgstr "Konflikt för egenskapen \"%s\" upptäcktes på \"%s\".\n"
-#: ../svn/conflict-callbacks.c:1042
-#, c-format
+#: ../svn/conflict-callbacks.c:1007
+#, fuzzy, c-format
msgid ""
"Invalid option; please edit the property first.\n"
"\n"
-msgstr ""
-"Felaktigt val; redigera egenskapen först.\n"
-"\n"
+msgstr "Felaktigt val; redigera egenskapen först.\n\n"
-#: ../svn/conflict-callbacks.c:1079
+#: ../svn/conflict-callbacks.c:1044
#, c-format
msgid ""
"Tree conflict on '%s'\n"
@@ -8748,7 +8781,7 @@ msgstr ""
"Trädkonflikt på \"%s\"\n"
" > %s\n"
-#: ../svn/conflict-callbacks.c:1149
+#: ../svn/conflict-callbacks.c:1112
#, c-format
msgid ""
"Conflict discovered when trying to add '%s'.\n"
@@ -8757,23 +8790,23 @@ msgstr ""
"En konflikt upptäcktes när \"%s\" skulle läggas till.\n"
"Ett objekt med samma namn finns redan.\n"
-#: ../svn/conflict-callbacks.c:1247
+#: ../svn/conflict-callbacks.c:1210
msgid "No editor found; leaving all conflicts."
msgstr "Ingen editor hittades; alla konflikter har lämnats kvar."
-#: ../svn/conflict-callbacks.c:1256
+#: ../svn/conflict-callbacks.c:1219
msgid "Error running editor; leaving all conflicts."
msgstr "Fel vid körning av editor; alla konflikter har lämnats kvar."
-#: ../svn/conflict-callbacks.c:1292
+#: ../svn/conflict-callbacks.c:1255
msgid "No merge tool found; leaving all conflicts."
msgstr "Inget sammanslagningsverktyg hittades; alla konflikter har lämnats kvar."
-#: ../svn/conflict-callbacks.c:1301
+#: ../svn/conflict-callbacks.c:1264
msgid "Error running merge tool; leaving all conflicts."
msgstr "Fel vid körning av sammanslagningsverktyget; alla konflikter har lämnats kvar."
-#: ../svn/copy-cmd.c:123 ../svn/util.c:957
+#: ../svn/copy-cmd.c:123 ../svn/util.c:952
#, c-format
msgid "'%s': a peg revision is not allowed here"
msgstr "\"%s\": en fixerad revision är inte tillåten här"
@@ -8783,19 +8816,19 @@ msgstr "\"%s\": en fixerad revision är inte tillåten här"
msgid "Local, non-commit operations do not take a log message or revision properties"
msgstr "Lokala operationer, som ej medför arkivering, behöver inga loggmeddelanden eller revisionsegenskaper"
-#: ../svn/diff-cmd.c:208
+#: ../svn/diff-cmd.c:210
msgid "'--xml' option only valid with '--summarize' option"
msgstr "Flaggan \"--xml\" är endast tillåten tillsammans med \"--summarize\""
-#: ../svn/diff-cmd.c:299
+#: ../svn/diff-cmd.c:301
msgid "'--new' option only valid with '--old' option"
msgstr "Flaggan \"--new\" är endast tillåten tillsammans med \"--old\""
-#: ../svn/diff-cmd.c:317
+#: ../svn/diff-cmd.c:319
msgid "'svn diff [-r N[:M]] [TARGET[@REV]...]' does not support mixed target types. Try using the --old and --new options or one of the shorthand invocations listed in 'svn help diff'."
msgstr "\"svn diff [-r N[:M]] [MÅL[@REV]...]\" stöder inte blandade måltyper. Försök med flaggorna \"--old\" och \"--new\" eller en av kortformerna som nämns i \"svn help diff\"."
-#: ../svn/diff-cmd.c:355
+#: ../svn/diff-cmd.c:372
#, c-format
msgid "Path '%s' not relative to base URLs"
msgstr "Sökvägen \"%s\" är inte relativ mot bas-URL:erna"
@@ -8832,6 +8865,7 @@ msgid "(2) your version (at line %lu)"
msgstr "(2) din version (på rad %lu)"
#: ../svn/file-merge.c:657
+#, fuzzy
msgid ""
"Select: (1) use their version, (2) use your version,\n"
" (12) their version first, then yours,\n"
@@ -8916,7 +8950,7 @@ msgstr ""
"Subversion är ett verktyg för versionshantering.\n"
"Se http://subversion.apache.org/ för ytterligare information\n"
-#: ../svn/help-cmd.c:73 ../svnrdump/svnrdump.c:659 ../svnsync/svnsync.c:1857
+#: ../svn/help-cmd.c:73 ../svnrdump/svnrdump.c:659 ../svnsync/svnsync.c:1856
msgid ""
"The following repository access (RA) modules are available:\n"
"\n"
@@ -8949,7 +8983,8 @@ msgstr "Ogiltig URL \"%s\""
msgid "Resource is not under version control."
msgstr "Resursen är inte versionshanterad."
-#: ../svn/info-cmd.c:266 ../svnadmin/svnadmin.c:1744
+#: ../svn/info-cmd.c:266 ../svnadmin/svnadmin.c:1739
+#: ../svnadmin/svnadmin.c:1945
#, c-format
msgid "Path: %s\n"
msgstr "Sökväg: %s\n"
@@ -9199,15 +9234,15 @@ msgstr "Låskommentaren innehåller en noll-byte"
msgid "\n"
msgstr "\n"
-#: ../svn/log-cmd.c:354
+#: ../svn/log-cmd.c:354 ../svn/mergeinfo-cmd.c:77
msgid "(no author)"
msgstr "(författare saknas)"
-#: ../svn/log-cmd.c:360
+#: ../svn/log-cmd.c:360 ../svn/mergeinfo-cmd.c:83
msgid "(no date)"
msgstr "(datum saknas)"
-#: ../svn/log-cmd.c:385
+#: ../svn/log-cmd.c:385 ../svn/mergeinfo-cmd.c:100
#, c-format
msgid " | %d line"
msgid_plural " | %d lines"
@@ -9301,10 +9336,10 @@ msgstr "Sammanslagningens källa måste anges"
msgid "Second revision required"
msgstr "En andra revision måste anges"
-#: ../svn/merge-cmd.c:285 ../svn/merge-cmd.c:312 ../svn/mergeinfo-cmd.c:267
-#: ../svnadmin/svnadmin.c:1719 ../svnlook/svnlook.c:2061
-#: ../svnlook/svnlook.c:2254 ../svnlook/svnlook.c:2358
-#: ../svnlook/svnlook.c:2393
+#: ../svn/merge-cmd.c:285 ../svn/merge-cmd.c:312 ../svn/mergeinfo-cmd.c:368
+#: ../svnadmin/svnadmin.c:1920 ../svnlook/svnlook.c:2060
+#: ../svnlook/svnlook.c:2253 ../svnlook/svnlook.c:2357
+#: ../svnlook/svnlook.c:2392
msgid "Too many arguments given"
msgstr "För många argument"
@@ -9344,34 +9379,39 @@ msgstr ""
"Sammanslagningsföljning ej möjlig; använd --ignore-ancestry eller\n"
"reparera ogiltig sammanslagningsinformation i målet med \"svn propset\""
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:228
msgid "last full merge"
msgstr "senaste fullständiga sammanslagning"
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:228
msgid "youngest common ancestor"
msgstr "yngsta gemensamma ursprung"
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:229
msgid "repository path"
msgstr "arkivsökväg"
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:229
msgid "tip of branch"
msgstr "grenspets"
-#: ../svn/mergeinfo-cmd.c:264
+#: ../svn/mergeinfo-cmd.c:365
msgid "Not enough arguments given"
msgstr "För få argument"
-#: ../svn/mergeinfo-cmd.c:342
+#: ../svn/mergeinfo-cmd.c:431
msgid "--revision (-r) option valid only with --show-revs option"
msgstr "Flaggan --revision (-r) är endast tillåten tillsammans med flaggan --show-revs"
-#: ../svn/mergeinfo-cmd.c:346
+#: ../svn/mergeinfo-cmd.c:435
msgid "Depth specification options valid only with --show-revs option"
msgstr "Flaggor för djupangivelse är endast tillåtna tillsammans med --show-revs"
+#: ../svn/mergeinfo-cmd.c:439
+#, fuzzy
+msgid "--log option valid only with --show-revs option"
+msgstr "Flaggan --revision (-r) är endast tillåten tillsammans med flaggan --show-revs"
+
#: ../svn/mkdir-cmd.c:92
msgid "Try 'svn add' or 'svn add --non-recursive' instead?"
msgstr "Försök med \"svn add\" eller \"svn add --non-recursive\" istället?"
@@ -9394,7 +9434,7 @@ msgid_plural "and %d already resolved"
msgstr[0] "och %d redan löst"
msgstr[1] "och %d redan lösta"
-#: ../svn/notify.c:163 ../svn/status-cmd.c:93
+#: ../svn/notify.c:163 ../svn/status-cmd.c:90
#, c-format
msgid "Summary of conflicts:\n"
msgstr "Konfliktsammanfattning:\n"
@@ -9434,102 +9474,102 @@ msgstr " Trädkonflikter: %s (%s)\n"
msgid " Skipped paths: %d\n"
msgstr " Överhoppade sökvägar: %d\n"
-#: ../svn/notify.c:235
+#: ../svn/notify.c:244
#, c-format
msgid "Skipped missing target: '%s'\n"
msgstr "Hoppade över saknat mål: \"%s\"\n"
-#: ../svn/notify.c:242
+#: ../svn/notify.c:251
#, c-format
msgid "Skipped target: '%s' -- copy-source is missing\n"
msgstr "Hoppade över mål: \"%s\" -- kopieringskällan saknas\n"
-#: ../svn/notify.c:249
+#: ../svn/notify.c:258
#, c-format
msgid "Skipped '%s'\n"
msgstr "Hoppade över \"%s\"\n"
-#: ../svn/notify.c:256
+#: ../svn/notify.c:265
#, c-format
msgid "Skipped '%s' -- An obstructing working copy was found\n"
msgstr "Hoppade över \"%s\" -- En arbetskopia hittades som var i vägen\n"
-#: ../svn/notify.c:263
+#: ../svn/notify.c:272
#, c-format
msgid "Skipped '%s' -- Has no versioned parent\n"
msgstr "Hoppade över \"%s\" -- Saknar versionshanterad förälder\n"
-#: ../svn/notify.c:270
+#: ../svn/notify.c:279
#, c-format
msgid "Skipped '%s' -- Access denied\n"
msgstr "Hoppade över \"%s\" -- Åtkomst nekas\n"
-#: ../svn/notify.c:277
+#: ../svn/notify.c:286
#, c-format
msgid "Skipped '%s' -- Node remains in conflict\n"
msgstr "Hoppade över \"%s\" -- Noden är fortfarande i konflikt\n"
-#: ../svn/notify.c:358
+#: ../svn/notify.c:367
#, c-format
msgid "Restored '%s'\n"
msgstr "Ã…terskapade \"%s\"\n"
-#: ../svn/notify.c:364
+#: ../svn/notify.c:373
#, c-format
msgid "Reverted '%s'\n"
msgstr "Återställde \"%s\"\n"
-#: ../svn/notify.c:370
+#: ../svn/notify.c:379
#, c-format
msgid "Failed to revert '%s' -- try updating instead.\n"
msgstr "Misslyckades med att återställa \"%s\" -- försök uppdatera istället.\n"
-#: ../svn/notify.c:378
+#: ../svn/notify.c:387
#, c-format
msgid "Resolved conflicted state of '%s'\n"
msgstr "Löste konflikttillståndet för \"%s\"\n"
-#: ../svn/notify.c:473 ../svn/notify.c:513
+#: ../svn/notify.c:482 ../svn/notify.c:522
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s"
msgstr "> anbragte stycke ## -%lu,%lu +%lu,%lu ## med förskjutning %s"
-#: ../svn/notify.c:490 ../svn/notify.c:527
+#: ../svn/notify.c:499 ../svn/notify.c:536
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s"
msgstr "> anbragte stycke @@ -%lu,%lu +%lu,%lu @@ med förskjutning %s"
-#: ../svn/notify.c:548
+#: ../svn/notify.c:557
#, c-format
msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %lu (%s)\n"
msgstr "> anbragte stycke ## -%lu,%lu +%lu,%lu ## med oskärpa %lu (%s)\n"
-#: ../svn/notify.c:558
+#: ../svn/notify.c:567
#, c-format
msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %lu\n"
msgstr "> anbragte stycke @@ -%lu,%lu +%lu,%lu @@ med oskärpa %lu\n"
-#: ../svn/notify.c:576
+#: ../svn/notify.c:585
#, c-format
msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n"
msgstr "> avslog stycke ## -%lu,%lu +%lu,%lu ## (%s)\n"
-#: ../svn/notify.c:585
+#: ../svn/notify.c:594
#, c-format
msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n"
msgstr "> avslog stycke @@ -%lu,%lu +%lu,%lu @@\n"
-#: ../svn/notify.c:599
+#: ../svn/notify.c:608
#, c-format
msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n"
msgstr "> stycke ## -%lu,%lu +%lu,%lu ## redan anbragt (%s)\n"
-#: ../svn/notify.c:609
+#: ../svn/notify.c:618
#, c-format
msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n"
msgstr "> stycke @@ -%lu,%lu +%lu,%lu @@ redan anbragt\n"
-#: ../svn/notify.c:669
+#: ../svn/notify.c:678
#, c-format
msgid ""
"\n"
@@ -9538,87 +9578,87 @@ msgstr ""
"\n"
"Hämtar externt objekt till \"%s\":\n"
-#: ../svn/notify.c:695
+#: ../svn/notify.c:704
#, c-format
msgid "Error handling externals definition for '%s':"
msgstr "Fel vid hantering av externa definitionen för \"%s\":"
-#: ../svn/notify.c:708
+#: ../svn/notify.c:717
#, c-format
msgid "Updating '%s':\n"
msgstr "Uppdaterar \"%s\":\n"
-#: ../svn/notify.c:722
+#: ../svn/notify.c:731
#, c-format
msgid "Exported external at revision %ld.\n"
msgstr "Exporterade extern katalog vid revision %ld.\n"
-#: ../svn/notify.c:723
+#: ../svn/notify.c:732
#, c-format
msgid "Exported revision %ld.\n"
msgstr "Exporterade revision %ld.\n"
-#: ../svn/notify.c:731
+#: ../svn/notify.c:740
#, c-format
msgid "Checked out external at revision %ld.\n"
msgstr "Checkade ut extern katalog vid revision %ld.\n"
-#: ../svn/notify.c:732
+#: ../svn/notify.c:741
#, c-format
msgid "Checked out revision %ld.\n"
msgstr "Checkade ut revision %ld.\n"
-#: ../svn/notify.c:743
+#: ../svn/notify.c:752
#, c-format
msgid "Updated external to revision %ld.\n"
msgstr "Uppdaterade extern katalog till revision %ld.\n"
-#: ../svn/notify.c:744
+#: ../svn/notify.c:753
#, c-format
msgid "Updated to revision %ld.\n"
msgstr "Uppdaterade till revision %ld.\n"
-#: ../svn/notify.c:752
+#: ../svn/notify.c:761
#, c-format
msgid "External at revision %ld.\n"
msgstr "Extern katalog är på revision %ld.\n"
-#: ../svn/notify.c:753
+#: ../svn/notify.c:762
#, c-format
msgid "At revision %ld.\n"
msgstr "Är på revision %ld.\n"
-#: ../svn/notify.c:765
+#: ../svn/notify.c:774
#, c-format
msgid "External export complete.\n"
msgstr "Extern export klar.\n"
-#: ../svn/notify.c:766
+#: ../svn/notify.c:775
#, c-format
msgid "Export complete.\n"
msgstr "Export klar.\n"
-#: ../svn/notify.c:773
+#: ../svn/notify.c:782
#, c-format
msgid "External checkout complete.\n"
msgstr "Extern utcheckning klar.\n"
-#: ../svn/notify.c:774
+#: ../svn/notify.c:783
#, c-format
msgid "Checkout complete.\n"
msgstr "Utcheckning klar.\n"
-#: ../svn/notify.c:781
+#: ../svn/notify.c:790
#, c-format
msgid "External update complete.\n"
msgstr "Extern uppdatering klar.\n"
-#: ../svn/notify.c:782
+#: ../svn/notify.c:791
#, c-format
msgid "Update complete.\n"
msgstr "Uppdatering klar.\n"
-#: ../svn/notify.c:798
+#: ../svn/notify.c:807
#, c-format
msgid ""
"\n"
@@ -9627,201 +9667,208 @@ msgstr ""
"\n"
"Utför statuskontroll av externt objekt vid \"%s\":\n"
-#: ../svn/notify.c:806
+#: ../svn/notify.c:815
#, c-format
msgid "Status against revision: %6ld\n"
msgstr "Status gentemot revision: %6ld\n"
-#: ../svn/notify.c:815
+#: ../svn/notify.c:824
#, c-format
msgid "Sending copy of %s\n"
msgstr "Skickar kopia av %s\n"
-#: ../svn/notify.c:816
+#: ../svn/notify.c:825
#, c-format
msgid "Sending %s\n"
msgstr "Skickar %s\n"
-#: ../svn/notify.c:827
+#: ../svn/notify.c:836
#, c-format
msgid "Adding copy of (bin) %s\n"
msgstr "Lägger till kopia av (binär) %s\n"
-#: ../svn/notify.c:828
+#: ../svn/notify.c:837
#, c-format
msgid "Adding (bin) %s\n"
msgstr "Lägger till (binär) %s\n"
-#: ../svn/notify.c:836
+#: ../svn/notify.c:845
#, c-format
msgid "Adding copy of %s\n"
msgstr "Lägger till kopia av %s\n"
-#: ../svn/notify.c:837
+#: ../svn/notify.c:846
#, c-format
msgid "Adding %s\n"
msgstr "Lägger till %s\n"
-#: ../svn/notify.c:846
+#: ../svn/notify.c:855
#, c-format
msgid "Deleting copy of %s\n"
msgstr "Raderar kopia av %s\n"
-#: ../svn/notify.c:847
+#: ../svn/notify.c:856
#, c-format
msgid "Deleting %s\n"
msgstr "Raderar %s\n"
-#: ../svn/notify.c:856
+#: ../svn/notify.c:865
#, c-format
msgid "Replacing copy of %s\n"
msgstr "Ersätter kopia av %s\n"
-#: ../svn/notify.c:857
+#: ../svn/notify.c:866
#, c-format
msgid "Replacing %s\n"
msgstr "Ersätter %s\n"
-#: ../svn/notify.c:867 ../svnsync/sync.c:327
+#: ../svn/notify.c:876 ../svnsync/sync.c:327
#, c-format
msgid "Transmitting file data "
msgstr "Skickar filinnehåll "
-#: ../svn/notify.c:876 ../svnadmin/svnadmin.c:1698
+#: ../svn/notify.c:885 ../svnadmin/svnadmin.c:1899
#, c-format
msgid "'%s' locked by user '%s'.\n"
msgstr "\"%s\" låstes av användaren \"%s\".\n"
-#: ../svn/notify.c:882
+#: ../svn/notify.c:891
#, c-format
msgid "'%s' unlocked.\n"
msgstr "\"%s\" låstes upp.\n"
-#: ../svn/notify.c:909
+#: ../svn/notify.c:918
#, c-format
msgid "--- Merging differences between repository URLs into '%s':\n"
msgstr "--- Slår samman skillnader mellan arkiv-URL:er i \"%s\":\n"
-#: ../svn/notify.c:914
+#: ../svn/notify.c:923
#, c-format
msgid "--- Merging r%ld into '%s':\n"
msgstr "--- Sammanslagning av r%ld i \"%s\":\n"
-#: ../svn/notify.c:918
+#: ../svn/notify.c:927
#, c-format
msgid "--- Reverse-merging r%ld into '%s':\n"
msgstr "--- Omvänd sammanslagning av r%ld i \"%s\":\n"
-#: ../svn/notify.c:922
+#: ../svn/notify.c:931
#, c-format
msgid "--- Merging r%ld through r%ld into '%s':\n"
msgstr "--- Sammanslagning av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:928
+#: ../svn/notify.c:937
#, c-format
msgid "--- Reverse-merging r%ld through r%ld into '%s':\n"
msgstr "--- Omvänd sammanslagning av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:940
+#: ../svn/notify.c:949
#, c-format
msgid "--- Recording mergeinfo for merge between repository URLs into '%s':\n"
msgstr "--- Noterar information om sammanslagning mellan arkiv-URL:er i \"%s\":\n"
-#: ../svn/notify.c:950
+#: ../svn/notify.c:959
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld into '%s':\n"
msgstr "--- Noterar information om sammanslagning av r%ld i \"%s\":\n"
-#: ../svn/notify.c:955
+#: ../svn/notify.c:964
#, c-format
msgid "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"
msgstr "--- Noterar information om omvänd sammanslagning av r%ld i \"%s\":\n"
-#: ../svn/notify.c:960
+#: ../svn/notify.c:969
#, c-format
msgid "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"
msgstr "--- Noterar information om sammanslagning av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:965
+#: ../svn/notify.c:974
#, c-format
msgid "--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"
msgstr "--- Noterar information om omvänd sammanslagning av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:975
+#: ../svn/notify.c:984
#, c-format
msgid "--- Eliding mergeinfo from '%s':\n"
msgstr "--- Utelämnar information om sammanslagning från \"%s\":\n"
-#: ../svn/notify.c:983
+#: ../svn/notify.c:992
#, c-format
msgid "--- Merging differences between foreign repository URLs into '%s':\n"
msgstr "--- Sammanslagning av skillnader mellan andra arkiv-URL:er i \"%s\":\n"
-#: ../svn/notify.c:989
+#: ../svn/notify.c:998
#, c-format
msgid "--- Merging (from foreign repository) r%ld into '%s':\n"
msgstr "--- Sammanslagning (från annat arkiv) av r%ld i \"%s\":\n"
-#: ../svn/notify.c:994
+#: ../svn/notify.c:1003
#, c-format
msgid "--- Reverse-merging (from foreign repository) r%ld into '%s':\n"
msgstr "--- Omvänd sammanslagning (från annat arkiv) av r%ld i \"%s\":\n"
-#: ../svn/notify.c:999
+#: ../svn/notify.c:1008
#, c-format
msgid "--- Merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr "--- Sammanslagning (från annat arkiv) av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:1005
+#: ../svn/notify.c:1014
#, c-format
msgid "--- Reverse-merging (from foreign repository) r%ld through r%ld into '%s':\n"
msgstr "--- Omvänd sammanslagning (från annat arkiv) av r%ld till r%ld i \"%s\":\n"
-#: ../svn/notify.c:1041
+#: ../svn/notify.c:1050
#, c-format
msgid "property '%s' set on '%s'\n"
msgstr "satte egenskapen \"%s\" på \"%s\"\n"
-#: ../svn/notify.c:1049
+#: ../svn/notify.c:1058
#, c-format
msgid "property '%s' deleted from '%s'.\n"
msgstr "egenskapen \"%s\" raderades från \"%s\".\n"
-#: ../svn/notify.c:1057
+#: ../svn/notify.c:1066
#, c-format
msgid "Attempting to delete nonexistent property '%s' on '%s'\n"
msgstr "Försök att ta bort den icke existerande egenskapen \"%s\" på \"%s\"\n"
-#: ../svn/notify.c:1066
+#: ../svn/notify.c:1075
#, c-format
msgid "property '%s' set on repository revision %ld\n"
msgstr "satte egenskapen \"%s\" på revision %ld i arkivet\n"
-#: ../svn/notify.c:1074
+#: ../svn/notify.c:1083
#, c-format
msgid "property '%s' deleted from repository revision %ld\n"
msgstr "egenskapen \"%s\" raderades från revision %ld i arkivet\n"
-#: ../svn/notify.c:1081
+#: ../svn/notify.c:1090
#, c-format
msgid "Upgraded '%s'\n"
msgstr "Uppgraderade \"%s\"\n"
-#: ../svn/notify.c:1087
+#: ../svn/notify.c:1096
#, c-format
msgid "Redirecting to URL '%s':\n"
msgstr "Omleder till URL \"%s\":\n"
-#: ../svn/notify.c:1115
+#: ../svn/notify.c:1124
#, c-format
msgid "--- Copying from foreign repository URL '%s':\n"
msgstr "--- Kopierar från annat arkiv med URL \"%s\":\n"
-#: ../svn/notify.c:1124
+#: ../svn/notify.c:1133
#, c-format
msgid "Breaking move with source path '%s'\n"
msgstr "Bruten flyttning med källsökväg \"%s\"\n"
+#: ../svn/notify.c:1141
+#, fuzzy, c-format
+msgid "Performing cleanup on external item at '%s'.\n"
+msgstr ""
+"\n"
+"Utför statuskontroll av externt objekt vid \"%s\":\n"
+
#: ../svn/propdel-cmd.c:88
#, c-format
msgid "Cannot specify revision for deleting versioned property '%s'"
@@ -9870,8 +9917,8 @@ msgid "Error writing to stream"
msgstr "Fel vid skrivning till ström"
#: ../svn/propget-cmd.c:186 ../svn/proplist-cmd.c:156
-#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1754
-#: ../svnlook/svnlook.c:1908
+#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1753
+#: ../svnlook/svnlook.c:1907
#, c-format
msgid ""
"Inherited properties on '%s',\n"
@@ -9882,7 +9929,7 @@ msgstr ""
#. Not a --revprop
#: ../svn/propget-cmd.c:196 ../svn/proplist-cmd.c:175
-#: ../svnlook/svnlook.c:1790 ../svnlook/svnlook.c:1943
+#: ../svnlook/svnlook.c:1789 ../svnlook/svnlook.c:1942
#, c-format
msgid "Properties on '%s':\n"
msgstr "Egenskaper på \"%s\":\n"
@@ -10020,22 +10067,22 @@ msgstr "Fel vid lösning av en eller flera konflikter"
msgid "Try 'svn revert --depth infinity' instead?"
msgstr "Försök med \"svn revert --depth infinity\" istället?"
-#: ../svn/status-cmd.c:97
+#: ../svn/status-cmd.c:94
#, c-format
msgid " Text conflicts: %u\n"
msgstr " Textkonflikter: %u\n"
-#: ../svn/status-cmd.c:101
+#: ../svn/status-cmd.c:98
#, c-format
msgid " Property conflicts: %u\n"
msgstr " Egenskapskonflikter: %u\n"
-#: ../svn/status-cmd.c:105
+#: ../svn/status-cmd.c:102
#, c-format
msgid " Tree conflicts: %u\n"
msgstr " Trädkonflikter: %u\n"
-#: ../svn/status-cmd.c:397
+#: ../svn/status-cmd.c:388
#, c-format
msgid ""
"\n"
@@ -10044,55 +10091,56 @@ msgstr ""
"\n"
"--- Ändringslista \"%s\":\n"
-#: ../svn/status.c:318
+#: ../svn/status.c:303
#, c-format
msgid "swapped places with %s"
msgstr "bytt plats med %s"
-#: ../svn/status.c:333
+#: ../svn/status.c:317
#, c-format
msgid "moved from %s"
msgstr "flyttad från %s"
-#: ../svn/status.c:345
+#: ../svn/status.c:328
#, c-format
msgid "moved to %s"
msgstr "flyttad till %s"
-#: ../svn/svn.c:147
+#: ../svn/svn.c:149
msgid "force operation to run"
msgstr "tvinga operationen att utföras"
-#: ../svn/svn.c:149
+#: ../svn/svn.c:151
msgid "force validity of log message source"
msgstr "acceptera alltid det angivna loggmeddelandet"
-#: ../svn/svn.c:150 ../svn/svn.c:151 ../svnadmin/svnadmin.c:208
-#: ../svnadmin/svnadmin.c:211 ../svndumpfilter/svndumpfilter.c:1019
-#: ../svndumpfilter/svndumpfilter.c:1022 ../svnlook/svnlook.c:114
-#: ../svnlook/svnlook.c:126 ../svnsync/svnsync.c:244 ../svnsync/svnsync.c:246
+#: ../svn/svn.c:152 ../svn/svn.c:153 ../svnadmin/svnadmin.c:211
+#: ../svnadmin/svnadmin.c:214 ../svnauth/svnauth.c:94
+#: ../svndumpfilter/svndumpfilter.c:1018 ../svndumpfilter/svndumpfilter.c:1021
+#: ../svnlook/svnlook.c:113 ../svnlook/svnlook.c:125 ../svnsync/svnsync.c:243
+#: ../svnsync/svnsync.c:245
msgid "show help on a subcommand"
msgstr "visa hjälp för ett underkommando"
-#: ../svn/svn.c:152
+#: ../svn/svn.c:154
msgid "specify log message ARG"
msgstr "ange loggmeddelande ARG"
-#: ../svn/svn.c:153
+#: ../svn/svn.c:155
msgid "print nothing, or only summary information"
msgstr "ingen utmatning, eller bara sammanfattning"
-#: ../svn/svn.c:154
+#: ../svn/svn.c:156
msgid "descend recursively, same as --depth=infinity"
msgstr "gå ner rekursivt, som --depth=infinity"
-#: ../svn/svn.c:155
+#: ../svn/svn.c:157
msgid "obsolete; try --depth=files or --depth=immediates"
msgstr ""
"föråldrat; försök med --depth=files\n"
" eller --depth=immediates"
-#: ../svn/svn.c:157
+#: ../svn/svn.c:159
msgid ""
"the change made by revision ARG (like -r ARG-1:ARG)\n"
" If ARG is negative this is like -r ARG:ARG-1\n"
@@ -10105,7 +10153,7 @@ msgstr ""
" Om ARG är på formen ARG1-ARG2 så är detta samma\n"
" som ARG1:ARG2, där ARG1 ingår"
-#: ../svn/svn.c:165
+#: ../svn/svn.c:167
msgid ""
"ARG (some commands also take ARG1:ARG2 range)\n"
" A revision argument can be one of:\n"
@@ -10120,7 +10168,8 @@ msgstr ""
" (ARG1:ARG2))\n"
" Ett revisionsargument kan vara något av:\n"
" TAL revisionsnummer\n"
-" \"{\"DATUM\"}\" revision vid början av angiven dag\n"
+" \"{\" DATUM \"}\" revision vid början av\n"
+" angiven dag\n"
" \"HEAD\" senaste revisionen i arkivet\n"
" \"BASE\" basrevisionen för objektets\n"
" arbetskopia\n"
@@ -10128,44 +10177,44 @@ msgstr ""
" arkiveringen vid eller före BASE\n"
" \"PREV\" revisionen före COMMITTED"
-#: ../svn/svn.c:180
+#: ../svn/svn.c:182
msgid "read log message from file ARG"
msgstr "läs loggmeddelande från filen ARG"
-#: ../svn/svn.c:182
+#: ../svn/svn.c:184
msgid "give output suitable for concatenation"
msgstr "skapa utdata som kan slås ihop"
-#: ../svn/svn.c:184
+#: ../svn/svn.c:186
msgid "treat value as being in charset encoding ARG"
msgstr ""
"betrakta värdet som om det använder\n"
" teckenkodningen ARG"
-#: ../svn/svn.c:185 ../svnadmin/svnadmin.c:214
-#: ../svndumpfilter/svndumpfilter.c:1025 ../svnlook/svnlook.c:168
-#: ../svnrdump/svnrdump.c:144 ../svnserve/svnserve.c:289
-#: ../svnsync/svnsync.c:242 ../svnversion/svnversion.c:141
+#: ../svn/svn.c:187 ../svnadmin/svnadmin.c:217 ../svnauth/svnauth.c:101
+#: ../svndumpfilter/svndumpfilter.c:1024 ../svnlook/svnlook.c:167
+#: ../svnrdump/svnrdump.c:144 ../svnserve/svnserve.c:288
+#: ../svnsync/svnsync.c:241 ../svnversion/svnversion.c:140
msgid "show program version information"
msgstr "visa programversionsinformation"
-#: ../svn/svn.c:186
+#: ../svn/svn.c:188
msgid "print extra information"
msgstr "visa extrainformation"
-#: ../svn/svn.c:187
+#: ../svn/svn.c:189
msgid "display update information"
msgstr "visa uppdateringsinformation"
-#: ../svn/svn.c:188 ../svnrdump/svnrdump.c:128
+#: ../svn/svn.c:190 ../svnrdump/svnrdump.c:128
msgid "specify a username ARG"
msgstr "ange ett användarnamn ARG"
-#: ../svn/svn.c:189 ../svnrdump/svnrdump.c:130
+#: ../svn/svn.c:191 ../svnrdump/svnrdump.c:130
msgid "specify a password ARG"
msgstr "ange ett lösenord ARG"
-#: ../svn/svn.c:191
+#: ../svn/svn.c:193
msgid ""
"Specify differencing options for external diff or\n"
" internal diff or blame. Default: '-u'. Options are\n"
@@ -10182,7 +10231,7 @@ msgstr ""
" \"blame\".\n"
" Skönsvärde: \"-u\". Väljare separeras av tomrum.\n"
" För inbyggda \"diff\" och \"blame\" tillåts:\n"
-" -u, --unified: Visa tre rader av sammanhang\n"
+" -u, --unified: Visa tre rader sammanhang\n"
" -b, --ignore-space-change:\n"
" Bortse från ändringar av mängden tomrum\n"
" -w, --ignore-all-space:\n"
@@ -10191,13 +10240,13 @@ msgstr ""
" Bortse från ändringar av radslutstecken\n"
" -p, --show-c-function: Visa funktionsnamn i C"
-#: ../svn/svn.c:209
+#: ../svn/svn.c:211
msgid "pass contents of file ARG as additional args"
msgstr ""
"använd innehållet i filen ARG som ytterligare\n"
" argument"
-#: ../svn/svn.c:211
+#: ../svn/svn.c:213
msgid ""
"limit operation by depth ARG ('empty', 'files',\n"
" 'immediates', or 'infinity')"
@@ -10205,7 +10254,7 @@ msgstr ""
"begränsa kommandot till djupet ARG (\"empty\",\n"
" \"files\", \"immediates\" eller \"infinity\")"
-#: ../svn/svn.c:215
+#: ../svn/svn.c:217
msgid ""
"set new working copy depth to ARG ('exclude',\n"
" 'empty', 'files', 'immediates', or 'infinity')"
@@ -10213,19 +10262,19 @@ msgstr ""
"sätt arbetskopians djup till ARG (\"exclude\",\n"
" \"empty\", \"files\", \"immediates\" eller \"infinity\")"
-#: ../svn/svn.c:218 ../svnlook/svnlook.c:171
+#: ../svn/svn.c:220 ../svnlook/svnlook.c:170
msgid "output in XML"
msgstr "visa information som XML"
-#: ../svn/svn.c:219
+#: ../svn/svn.c:221
msgid "use strict semantics"
msgstr "använd strikt semantik"
-#: ../svn/svn.c:221
+#: ../svn/svn.c:223
msgid "do not cross copies while traversing history"
msgstr "följ inte kopieringar när historiken gås igenom"
-#: ../svn/svn.c:223
+#: ../svn/svn.c:225
msgid ""
"disregard default and svn:ignore and\n"
" svn:global-ignores property ignores"
@@ -10233,11 +10282,11 @@ msgstr ""
"bortse ifrån svn:ignore, svn:global-ignores och\n"
" standarduteslutningar"
-#: ../svn/svn.c:227 ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:188
+#: ../svn/svn.c:229 ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:187
msgid "do not cache authentication tokens"
-msgstr "cacha inte autentiseringsinformation"
+msgstr "spara inte autentiseringsinformation"
-#: ../svn/svn.c:229 ../svnrdump/svnrdump.c:154 ../svnsync/svnsync.c:198
+#: ../svn/svn.c:231 ../svnrdump/svnrdump.c:154 ../svnsync/svnsync.c:197
msgid ""
"accept SSL server certificates from unknown\n"
" certificate authorities without prompting (but only\n"
@@ -10246,7 +10295,7 @@ msgstr ""
"godta SSL-servercertifikat från okända utfärdare\n"
" utan att fråga (men bara med \"--non-interactive\")"
-#: ../svn/svn.c:235 ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:180
+#: ../svn/svn.c:237 ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:179
msgid ""
"do no interactive prompting (default is to prompt\n"
" only if standard input is a terminal device)"
@@ -10254,7 +10303,7 @@ msgstr ""
"ingen interaktiv fråga (vanligtvis ställs frågor\n"
" bara om standardinmatningen är en terminal)"
-#: ../svn/svn.c:239 ../svnrdump/svnrdump.c:136 ../svnsync/svnsync.c:184
+#: ../svn/svn.c:241 ../svnrdump/svnrdump.c:136 ../svnsync/svnsync.c:183
msgid ""
"do interactive prompting even if standard input\n"
" is not a terminal device"
@@ -10262,58 +10311,58 @@ msgstr ""
"ställ interaktiva frågor även om\n"
" standardinmatningen inte är en terminal"
-#: ../svn/svn.c:243
+#: ../svn/svn.c:245
msgid "try operation but make no changes"
msgstr "testa operationen, men gör inga ändringar"
-#: ../svn/svn.c:245
+#: ../svn/svn.c:247
msgid "disable merge tracking; diff nodes as if related"
msgstr ""
"stäng av sammanslagningsföljning; jämför som om\n"
" noderna var besläktade"
-#: ../svn/svn.c:247
+#: ../svn/svn.c:249
msgid "ignore externals definitions"
msgstr "bortse ifrån externals-definitioner"
-#: ../svn/svn.c:248
+#: ../svn/svn.c:250
msgid "use ARG as merge command"
msgstr "använd ARG som merge-kommando"
-#: ../svn/svn.c:249
+#: ../svn/svn.c:251
msgid "use ARG as external editor"
msgstr "använd ARG som extern editor"
-#: ../svn/svn.c:251
+#: ../svn/svn.c:253
msgid "merge only mergeinfo differences"
msgstr ""
"slå bara ihop skillnader i\n"
" sammanslagningsinformationen"
-#: ../svn/svn.c:252
+#: ../svn/svn.c:254
msgid "use ARG as the older target"
msgstr "använd ARG som det äldre målet"
-#: ../svn/svn.c:253
+#: ../svn/svn.c:255
msgid "use ARG as the newer target"
msgstr "använd ARG som det nyare målet"
-#: ../svn/svn.c:255
+#: ../svn/svn.c:257
msgid "operate on a revision property (use with -r)"
msgstr "arbeta med en revisionsegenskap (används med -r)"
-#: ../svn/svn.c:256
+#: ../svn/svn.c:258
msgid "relocate via URL-rewriting"
msgstr "omlokalisera genom att skriva om URL:er"
-#: ../svn/svn.c:258 ../svnadmin/svnadmin.c:256 ../svnrdump/svnrdump.c:126
-#: ../svnsync/svnsync.c:212
+#: ../svn/svn.c:260 ../svnadmin/svnadmin.c:259 ../svnrdump/svnrdump.c:126
+#: ../svnsync/svnsync.c:211
msgid "read user configuration files from directory ARG"
msgstr ""
"läs användarens konfigurationsfiler från katalogen\n"
" ARG"
-#: ../svn/svn.c:260 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:214
+#: ../svn/svn.c:262 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:213
msgid ""
"set user configuration option in the format:\n"
" FILE:SECTION:OPTION=[VALUE]\n"
@@ -10325,15 +10374,15 @@ msgstr ""
" Till exempel:\n"
" servers:global:http-library=serf"
-#: ../svn/svn.c:267
+#: ../svn/svn.c:269
msgid "enable automatic properties"
msgstr "aktivera automatiska egenskaper"
-#: ../svn/svn.c:268
+#: ../svn/svn.c:270
msgid "disable automatic properties"
msgstr "deaktivera automatiska egenskaper"
-#: ../svn/svn.c:270
+#: ../svn/svn.c:272
msgid ""
"use a different EOL marker than the standard\n"
" system marker for files with the svn:eol-style\n"
@@ -10345,39 +10394,39 @@ msgstr ""
" \"eol-style\" satt till \"native\". ARG kan vara\n"
" något av \"LF\", \"CR\" och \"CRLF\""
-#: ../svn/svn.c:277
+#: ../svn/svn.c:279
msgid "maximum number of log entries"
msgstr "maximalt antal loggposter"
-#: ../svn/svn.c:278
+#: ../svn/svn.c:280
msgid "don't unlock the targets"
msgstr "lås inte upp målen"
-#: ../svn/svn.c:279
+#: ../svn/svn.c:281
msgid "remove changelist association"
msgstr "ta bort koppling till ändringslista"
-#: ../svn/svn.c:281
+#: ../svn/svn.c:283
msgid "operate only on members of changelist ARG"
msgstr "arbeta endast med medlemmar av ändringslistan ARG"
-#: ../svn/svn.c:283
+#: ../svn/svn.c:285
msgid "don't delete changelists after commit"
msgstr "ta inte bort ändringslistor efter arkivering"
-#: ../svn/svn.c:284
+#: ../svn/svn.c:286
msgid "keep path in working copy"
msgstr "behåll sökväg i arbetskopia"
-#: ../svn/svn.c:286
+#: ../svn/svn.c:288
msgid "retrieve all revision properties"
msgstr "hämta alla revisionsegenskaper"
-#: ../svn/svn.c:288
+#: ../svn/svn.c:290
msgid "retrieve no revision properties"
msgstr "hämta inga revisionsegenskaper"
-#: ../svn/svn.c:290
+#: ../svn/svn.c:292
msgid ""
"set revision property ARG in new revision\n"
" using the name[=value] format"
@@ -10385,19 +10434,19 @@ msgstr ""
"sätt revisionsegenskapen ARG i ny revision\n"
" på formatet namn[=värde]"
-#: ../svn/svn.c:293
+#: ../svn/svn.c:295
msgid "make intermediate directories"
msgstr "skapa mellanliggande kataloger"
-#: ../svn/svn.c:295
+#: ../svn/svn.c:297
msgid ""
"use/display additional information from merge\n"
" history"
msgstr ""
"använd/visa ytterligare information från\n"
-" sammanslagningshistorien"
+" sammanslagningshistoriken"
-#: ../svn/svn.c:299
+#: ../svn/svn.c:301
msgid ""
"specify automatic conflict resolution action\n"
" ('postpone', 'working', 'base', 'mine-conflict',\n"
@@ -10412,7 +10461,7 @@ msgstr ""
" (förkortningar: \"p\", \"mc\", \"tc\", \"mf\", \"tf\",\n"
" \"e\", \"l\")"
-#: ../svn/svn.c:310
+#: ../svn/svn.c:312
msgid ""
"specify which collection of revisions to display\n"
" ('merged', 'eligible')"
@@ -10420,11 +10469,11 @@ msgstr ""
"ange slag av revisioner att visa\n"
" (\"merged\", \"eligible\")"
-#: ../svn/svn.c:314
+#: ../svn/svn.c:316
msgid "deprecated"
msgstr "avrådes"
-#: ../svn/svn.c:316
+#: ../svn/svn.c:318
msgid ""
"number of leading path components to strip from\n"
" paths parsed from the patch file. --strip 0\n"
@@ -10444,67 +10493,67 @@ msgstr ""
" Katalogseparatorn är \"/\" på alla plattformar.\n"
" Ett \"/\" i början räknas som en katalog."
-#: ../svn/svn.c:332
+#: ../svn/svn.c:334
msgid "don't expand keywords"
msgstr "expandera inte nyckelord"
-#: ../svn/svn.c:334
+#: ../svn/svn.c:336
msgid "apply the unidiff in reverse"
msgstr "anbringa unidiffen baklänges"
-#: ../svn/svn.c:336
+#: ../svn/svn.c:338
msgid "ignore whitespace during pattern matching"
msgstr "strunta i tomrum vid mönstermatchning"
-#: ../svn/svn.c:337
+#: ../svn/svn.c:339
msgid "produce diff output"
msgstr "utdata i form av skillnader"
#. maps to show_diff
#. diff options
-#: ../svn/svn.c:339 ../svnlook/svnlook.c:138
+#: ../svn/svn.c:341 ../svnlook/svnlook.c:137
msgid "use ARG as diff command"
msgstr "använd ARG som diff-kommando"
-#: ../svn/svn.c:341
+#: ../svn/svn.c:343
msgid "override diff-cmd specified in config file"
msgstr "kringgå \"diff-cmd\" angiven i inställningsfilen"
-#: ../svn/svn.c:343 ../svnlook/svnlook.c:132
+#: ../svn/svn.c:345 ../svnlook/svnlook.c:131
msgid "do not print differences for added files"
msgstr "visa inte skillnader för tillagda filer"
-#: ../svn/svn.c:345 ../svnlook/svnlook.c:135
+#: ../svn/svn.c:347 ../svnlook/svnlook.c:134
msgid "do not print differences for deleted files"
msgstr "visa inte skillnader för raderade filer"
-#: ../svn/svn.c:347
+#: ../svn/svn.c:349
msgid "don't diff copied or moved files with their source"
msgstr ""
"jämför inte kopierade eller flyttade filer\n"
" med deras källa"
-#: ../svn/svn.c:349
+#: ../svn/svn.c:351
msgid "diff unrelated nodes as delete and add"
msgstr "jämför obesläktade noder som radering och tillägg"
-#: ../svn/svn.c:350
+#: ../svn/svn.c:352
msgid "show a summary of the results"
msgstr "visa en sammanfattning av resultatet"
-#: ../svn/svn.c:352
+#: ../svn/svn.c:354
msgid "use git's extended diff format"
msgstr "använd git:s utökade format"
-#: ../svn/svn.c:354 ../svnlook/svnlook.c:141
+#: ../svn/svn.c:356 ../svnlook/svnlook.c:140
msgid "ignore properties during the operation"
msgstr "strunta i egenskaper"
-#: ../svn/svn.c:356 ../svnlook/svnlook.c:144
+#: ../svn/svn.c:358 ../svnlook/svnlook.c:143
msgid "show only properties during the operation"
msgstr "visa endast egenskaper"
-#: ../svn/svn.c:358
+#: ../svn/svn.c:360
msgid ""
"generate diff suitable for generic third-party\n"
" patch tools; currently the same as\n"
@@ -10514,7 +10563,7 @@ msgstr ""
" patch-verktyg; för närvarande samma som\n"
" \"--show-copies-as-adds --ignore-properties\""
-#: ../svn/svn.c:366
+#: ../svn/svn.c:368
msgid ""
"Allow operation on mixed-revision working copy.\n"
" Use of this option is not recommended!\n"
@@ -10524,15 +10573,14 @@ msgstr ""
" Användning av denna flagga rekommenderas inte!\n"
" Kör \"svn update\" istället."
-#: ../svn/svn.c:372
+#: ../svn/svn.c:374
+#, fuzzy
msgid ""
-"Also commit file and dir externals reached by\n"
-" recursion. This does not include externals with a\n"
-" fixed revision. (See the svn:externals property)"
+"also operate on externals defined by\n"
+" svn:externals properties"
msgstr ""
-"Arkivera även externa filer och kataloger som nås\n"
-" rekursivt, utom externa objekt med en\n"
-" angiven revision. (Se egenskapen svn:externals)"
+"bortse ifrån svn:ignore, svn:global-ignores och\n"
+" standarduteslutningar"
#: ../svn/svn.c:378
msgid "retrieve target's inherited properties"
@@ -10546,7 +10594,20 @@ msgstr "använd ARG som sökmönster (skalsyntax)"
msgid "combine ARG with the previous search pattern"
msgstr "kombinera ARG med föregående sökmönster"
-#: ../svn/svn.c:430
+#: ../svn/svn.c:384
+msgid "show revision log message, author and date"
+msgstr ""
+
+#: ../svn/svn.c:386
+#, fuzzy
+msgid "remove unversioned items"
+msgstr "visa inte icke versionshanterade objekt"
+
+#: ../svn/svn.c:387
+msgid "remove ignored items"
+msgstr ""
+
+#: ../svn/svn.c:435
msgid ""
"Put files and directories under version control, scheduling\n"
"them for addition to repository. They will be added in next commit.\n"
@@ -10556,11 +10617,11 @@ msgstr ""
"läggas till i arkivet. De kommer att läggas till vid nästa arkivering.\n"
"användning: add PATH...\n"
-#: ../svn/svn.c:435
+#: ../svn/svn.c:440
msgid "add intermediate parents"
-msgstr "skapa mellanliggande förälderkataloger"
+msgstr "skapa mellanliggande föräldrakataloger"
-#: ../svn/svn.c:438
+#: ../svn/svn.c:443
msgid ""
"Output the content of specified files or\n"
"URLs with revision and author information in-line.\n"
@@ -10575,7 +10636,7 @@ msgstr ""
"\n"
"Om REV anges, bestämmer den i vilken revision målet först letas upp.\n"
-#: ../svn/svn.c:447
+#: ../svn/svn.c:452
msgid ""
"Output the content of specified files or URLs.\n"
"usage: cat TARGET[@REV]...\n"
@@ -10588,7 +10649,7 @@ msgstr ""
"\n"
"Om REV anges, bestämmer den i vilken revision målet först letas upp.\n"
-#: ../svn/svn.c:455
+#: ../svn/svn.c:460
msgid ""
"Associate (or dissociate) changelist CLNAME with the named files.\n"
"usage: 1. changelist CLNAME PATH...\n"
@@ -10599,7 +10660,7 @@ msgstr ""
"användning: 1. changelist ÄLNAMN SÖKVÄG...\n"
" 2. changelist --remove SÖKVÄG...\n"
-#: ../svn/svn.c:461
+#: ../svn/svn.c:466
msgid ""
"Check out a working copy from a repository.\n"
"usage: checkout URL[@REV]... [PATH]\n"
@@ -10649,21 +10710,30 @@ msgstr ""
" Se även \"svn help update\" för en lista av möjliga tecken i rapporten\n"
" om vilken åtgärd som utfördes.\n"
-#: ../svn/svn.c:488
+#: ../svn/svn.c:493
+#, fuzzy
msgid ""
"Recursively clean up the working copy, removing write locks, resuming\n"
"unfinished operations, etc.\n"
"usage: cleanup [WCPATH...]\n"
"\n"
-" Finish any unfinished business in the working copy at WCPATH, and remove\n"
-" write locks (shown as 'L' by the 'svn status' command) from the working\n"
-" copy. Usually, this is only necessary if a Subversion client has crashed\n"
-" while using the working copy, leaving it in an unusable state.\n"
+" By default, finish any unfinished business in the working copy at WCPATH,\n"
+" and remove write locks (shown as 'L' by the 'svn status' command) from\n"
+" the working copy. Usually, this is only necessary if a Subversion client\n"
+" has crashed while using the working copy, leaving it in an unusable state.\n"
"\n"
" WARNING: There is no mechanism that will protect write locks still\n"
" being used by other Subversion clients. Running this command\n"
" while another client is using the working copy can corrupt\n"
" the working copy beyond repair!\n"
+"\n"
+" If the --remove-unversioned option or the --remove-ignored option\n"
+" is given, remove any unversioned or ignored items within WCPATH.\n"
+" To prevent accidental working copy corruption, unversioned or ignored\n"
+" items can only be removed if the working copy is not already locked\n"
+" for writing by another Subversion client.\n"
+" Note that the 'svn status' command shows unversioned items as '?',\n"
+" and ignored items as 'I' if the --no-ignore option is given to it.\n"
msgstr ""
"Städa i arbetskopian och dess underkataloger rekursivt.\n"
"Skrivlås tas bort, avbrutet arbete återupptas o.s.v.\n"
@@ -10679,7 +10749,8 @@ msgstr ""
" medan en annan klient använder arbetskopian kan denna förstöras\n"
" utan möjlighet till reparation!\n"
-#: ../svn/svn.c:504
+#: ../svn/svn.c:518
+#, fuzzy
msgid ""
"Send changes from your working copy to the repository.\n"
"usage: commit [PATH...]\n"
@@ -10688,6 +10759,10 @@ msgid ""
" given by a --message or --file option, an editor will be started.\n"
" If any targets are (or contain) locked items, those will be\n"
" unlocked after a successful commit.\n"
+"\n"
+" If --include-externals is given, also commit file and directory\n"
+" externals reached by recursion. Do not commit externals with a\n"
+" fixed revision.\n"
msgstr ""
"Skicka ändringar från arbetskopian till arkivet.\n"
"användning: commit [SÖKVÄG...]\n"
@@ -10697,7 +10772,7 @@ msgstr ""
" Om något mål är låst (eller innehåller låsta objekt), kommer dessa att\n"
" låsas upp efter en lyckad arkivering.\n"
-#: ../svn/svn.c:515
+#: ../svn/svn.c:533
msgid ""
"Copy files and directories in a working copy or repository.\n"
"usage: copy SRC[@REV]... DST\n"
@@ -10734,7 +10809,7 @@ msgstr ""
" (AK -> AK). Därför kommer normalt inte information för sammanslagnings-\n"
" följning överföras från kopieringens källa till dess mål.\n"
-#: ../svn/svn.c:534
+#: ../svn/svn.c:552
msgid ""
"Remove files and directories from version control.\n"
"usage: 1. delete PATH...\n"
@@ -10758,13 +10833,13 @@ msgstr ""
" nästa arkivering. Filer och kataloger som aldrig arkiverats tas\n"
" genast bort från arbetskopian såvida inte flaggan --keep-local anges.\n"
" Sökvägar som är, eller innehåller, objekt som ej är versionshanterade\n"
-" eller som är ändrade raderas inte utan att flaggorna --force eller\n"
+" eller som är ändrade raderas bara om flaggan --force eller\n"
" --keep-local används.\n"
"\n"
" 2. Varje objekt som anges med en URL raderas från arkivet genom en\n"
" omedelbar arkivering.\n"
-#: ../svn/svn.c:550
+#: ../svn/svn.c:568
msgid ""
"Display local changes or differences between two revisions or paths.\n"
"usage: 1. diff\n"
@@ -10847,7 +10922,7 @@ msgstr ""
" 6. Kortare sätt att skriva\n"
" \"svn diff --old=GAMMAL-SÖKVÄG[@GAMMALREV] --new=NY-URL[@NYREV]\".\n"
-#: ../svn/svn.c:591
+#: ../svn/svn.c:609
msgid ""
"Create an unversioned copy of a tree.\n"
"usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -10884,7 +10959,7 @@ msgstr ""
"\n"
" Om FIXREV är angiven, anger den i vilken revision målet först letas upp.\n"
-#: ../svn/svn.c:613
+#: ../svn/svn.c:631
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: help [SUBCOMMAND...]\n"
@@ -10892,7 +10967,7 @@ msgstr ""
"Visa hur detta program eller dess underkommandon används.\n"
"användning: help [UNDERKOMMANDO...]\n"
-#: ../svn/svn.c:619
+#: ../svn/svn.c:637
msgid ""
"Commit an unversioned file or tree into the repository.\n"
"usage: import [PATH] URL\n"
@@ -10915,7 +10990,7 @@ msgstr ""
" Objekt som ej kan versionshanteras, såsom enhetsfiler och rörledningar,\n"
" hoppas över om --force anges.\n"
-#: ../svn/svn.c:633
+#: ../svn/svn.c:651
msgid ""
"Display information about a local or remote item.\n"
"usage: info [TARGET[@REV]...]\n"
@@ -10931,7 +11006,7 @@ msgstr ""
" MÅL kan antingen vara en arbetskopia eller en URL. Om REV anges, avgör\n"
" den i vilken revision målet letas upp.\n"
-#: ../svn/svn.c:643
+#: ../svn/svn.c:661
msgid ""
"List directory entries in the repository.\n"
"usage: list [TARGET[@REV]...]\n"
@@ -10970,11 +11045,7 @@ msgstr ""
" Storlek (i byte)\n"
" Datum och tid för senaste arkiveringen\n"
-#: ../svn/svn.c:663
-msgid "include externals definitions"
-msgstr "tag med externals-definitioner"
-
-#: ../svn/svn.c:666
+#: ../svn/svn.c:683
msgid ""
"Lock working copy paths or URLs in the repository, so that\n"
"no other user can commit changes to them.\n"
@@ -10989,19 +11060,19 @@ msgstr ""
" Använd flaggan --force för att stjäla ett lås från en annan användare eller\n"
" arbetskopia.\n"
-#: ../svn/svn.c:672
+#: ../svn/svn.c:689
msgid "read lock comment from file ARG"
msgstr "läs låskommentar från filen ARG"
-#: ../svn/svn.c:673
+#: ../svn/svn.c:690
msgid "specify lock comment ARG"
msgstr "ange låskommentar ARG"
-#: ../svn/svn.c:674
+#: ../svn/svn.c:691
msgid "force validity of lock comment source"
msgstr "acceptera alltid den angivna låskommentaren"
-#: ../svn/svn.c:677
+#: ../svn/svn.c:694
msgid ""
"Show the log messages for a set of revision(s) and/or path(s).\n"
"usage: 1. log [PATH][@REV]\n"
@@ -11085,7 +11156,7 @@ msgstr ""
" 1. Visa loggmeddelanden för URL:en som motsvarar SÖKVÄG (\".\" om ej\n"
" angiven). Om REV anges avgör den var SÖKVÄG letas upp, och standard-\n"
" värdet för revisionsområdet är då REV:1. Annars är standardvärdet\n"
-" för revisionsområdet är BASE:1 då URL:en kanske inte finns i\n"
+" för revisionsområdet BASE:1 då URL:en kanske inte finns i\n"
" HEAD-revisionen.\n"
"\n"
" 2. Visa loggmeddelanden för varje SÖKVÄG (\".\" om ingen angiven) under\n"
@@ -11113,7 +11184,7 @@ msgstr ""
" * matchar en följd av godtyckliga tecken\n"
" [abc] matchar något av tecknen inom hakparenteserna\n"
" Om flera \"--search\"-flaggor anges kommer ett loggmeddelande visas om\n"
-" något det matchar något av sökmönstren. Om flaggan --search-and anges,\n"
+" det matchar något av sökmönstren. Om flaggan --search-and anges,\n"
" så kombineras den flaggans argument med mönstret från föregående --search\n"
" eller --search-and, och ett loggmeddelande visas bara om det matchar det\n"
" kombinerade sökmönstret.\n"
@@ -11122,7 +11193,7 @@ msgstr ""
"\n"
" Exempel:\n"
"\n"
-" Visa de senaste 5 loggmeddelanden för den aktuella arbetskopians\n"
+" Visa de 5 senaste loggmeddelandena för den aktuella arbetskopians\n"
" katalog och visa sökvägar ändrade i varje arkivering:\n"
" svn log -l 5 -v\n"
"\n"
@@ -11145,18 +11216,19 @@ msgstr ""
" Visa loggmeddelandet för revisionen då /branches/gren skapades:\n"
" svn log --stop-on-copy --limit 1 -r0:HEAD ^/branches/gren\n"
-#: ../svn/svn.c:755
+#: ../svn/svn.c:772
msgid "retrieve revision property ARG"
msgstr "hämta revisionsegenskapen ARG"
-#: ../svn/svn.c:756
+#: ../svn/svn.c:773
msgid "the change made in revision ARG"
msgstr "ändringen gjord i revision ARG"
#. For this large section, let's keep it unindented for easier
#. * viewing/editing. It has been vim-treated with a textwidth=75 and 'gw'
#. * (with quotes and newlines removed).
-#: ../svn/svn.c:762
+#: ../svn/svn.c:779
+#, fuzzy
msgid ""
"Merge changes into a working copy.\n"
"usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]\n"
@@ -11584,7 +11656,7 @@ msgstr ""
"\n"
" Sammanslagningen är nu bara gjord i din egna arbetskopia och behöver\n"
" fortfarande arkiveras så att andra kan se den. Du kan granska\n"
-" ändringarna och kan behöva lösa konflikter innan det sammanslagningen\n"
+" ändringarna och kan behöva lösa konflikter innan sammanslagningen\n"
" arkiveras.\n"
"\n"
" - Exempel på återförening -\n"
@@ -11611,8 +11683,8 @@ msgstr ""
" svn merge ^/funktion\n"
"\n"
" För att förhindra onödiga konflikter kräver en återförening att\n"
-" AKSÖKVÄGSMÅL inte är en arbetskopia med blandad revision, utan lokala\n"
-" ändringar, och utan växlade delträd.\n"
+" AKSÖKVÄGSMÅL inte är en arbetskopia med blandad revision och saknar\n"
+" lokala ändringar och växlade delträd.\n"
"\n"
" En återförening kräver också att källgrenen har genomgående\n"
" synkroniserats med målet -- i exemplet ovan innebär det att alla\n"
@@ -11718,7 +11790,7 @@ msgstr ""
"\n"
" Två funktioner har utvecklats på skilda grenar, \"apelsin\" och\n"
" \"banan\". Det står nu klart att \"banan\" borde kombineras med grenen\n"
-" \"apelsin\" för vidare utveckling innan återförening.\n"
+" \"apelsin\" för vidare utveckling före återförening.\n"
"\n"
" Grenen \"banan\" har synkroniserats med \"trunk\" upp till revision\n"
" 500. (Om revisionsnumret inte är känt kan det hittas med hjälp av\n"
@@ -11789,7 +11861,7 @@ msgstr ""
" - Sammanslagningsföljning -\n"
"\n"
" Subversion använder egenskapen svn:mergeinfo för att följa samman-\n"
-" slagningshistorien. Denna egenskap läses i början av sammanslagningen\n"
+" slagningshistoriken. Denna egenskap läses i början av sammanslagningen\n"
" för att avgöra vad som skall ingå, och uppdateras vid sammanslagningens\n"
" fullbordan med de införda ändringarna. Sammanslagningsinformationen\n"
" används bara om de två källorna befinner sig på samma historiska linje:\n"
@@ -11810,7 +11882,8 @@ msgstr ""
" Vidare stöds inte sammanslagningsföljning för sammanslagningar från\n"
" andra arkiv.\n"
-#: ../svn/svn.c:1094
+#: ../svn/svn.c:1111
+#, fuzzy
msgid ""
"Display merge-related information.\n"
"usage: 1. mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -11845,7 +11918,7 @@ msgstr ""
"användning: 1. mergeinfo KÄLLA[@REV] [MÅL[@REV]]\n"
" 2. mergeinfo --show-revs=VILKA KÄLLA[@REV] [MÅL[@REV]]\n"
"\n"
-" 1. Sammanfatta sammanslagningshistorien mellan KÄLLA och MÅL. Diagrammet\n"
+" 1. Sammanfatta sammanslagningshistoriken mellan KÄLLA och MÅL. Diagrammet\n"
" visar, från vänster till höger:\n"
" grenarnas yngsta gemensamma ursprung;\n"
" den senaste fulla sammanslagningen i endera riktningen, och alltså\n"
@@ -11871,7 +11944,7 @@ msgstr ""
"\n"
" Djupet kan vara \"empty\" eller \"infinity\"; standardvärdet är \"empty\".\n"
-#: ../svn/svn.c:1125
+#: ../svn/svn.c:1142
msgid ""
"Create a new directory under version control.\n"
"usage: 1. mkdir PATH...\n"
@@ -11903,7 +11976,7 @@ msgstr ""
" I båda fallen måste katalogerna ovanför de angivna redan finnas,\n"
" såvida inte flaggan --parents anges.\n"
-#: ../svn/svn.c:1142
+#: ../svn/svn.c:1159
msgid ""
"Move (rename) an item in a working copy or repository.\n"
"usage: move SRC... DST\n"
@@ -11945,7 +12018,7 @@ msgstr ""
" Flaggan --allow-mixed-revision finns till för bakåtkompatibilitet.\n"
" Flaggan --revision saknar användning och bör ej användas.\n"
-#: ../svn/svn.c:1164
+#: ../svn/svn.c:1181
msgid ""
"Apply a patch to a working copy.\n"
"usage: patch PATCHFILE [WCPATH]\n"
@@ -12021,7 +12094,7 @@ msgstr ""
" G Sammanslagen (med lokala ändringar som inte har arkiverats)\n"
"\n"
" För ändringar som inte anbragdes exakt rapporteras detta på rader som\n"
-" med tecknet \">\". Sådana ändringar bör granskas noga.\n"
+" börjar med tecknet \">\". Sådana ändringar bör granskas noga.\n"
"\n"
" Om allt innehåll tas bort från en fil, så kommer den filen schemaläggas\n"
" för radering. Om en ny fil skapas så kommer den schemaläggas att läggas\n"
@@ -12033,9 +12106,9 @@ msgstr ""
" \"--- katalog/fil.txt (revision N)\"). För att undvika avslag,\n"
" uppdatera först till revision N med hjälp av \"svn update -R N\",\n"
" anbringa ändringsfilen, och uppdatera sedan tillbaka till revisionen\n"
-" HEAD. På så kan kommer konflikter lösas interaktivt.\n"
+" HEAD. På så sätt kan konflikter lösas interaktivt.\n"
-#: ../svn/svn.c:1212
+#: ../svn/svn.c:1229
msgid ""
"Remove a property from files, dirs, or revisions.\n"
"usage: 1. propdel PROPNAME [PATH...]\n"
@@ -12054,7 +12127,7 @@ msgstr ""
" arkivet.\n"
" MÅL används endast för att avgöra vilket arkiv som ska användas.\n"
-#: ../svn/svn.c:1222
+#: ../svn/svn.c:1239
msgid ""
"Edit a property with an external editor.\n"
"usage: 1. propedit PROPNAME TARGET...\n"
@@ -12077,7 +12150,7 @@ msgstr ""
"\n"
" Se \"svn help propset\" för mer om att sätta egenskaper.\n"
-#: ../svn/svn.c:1234
+#: ../svn/svn.c:1251
msgid ""
"Print the value of a property on files, dirs, or revisions.\n"
"usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
@@ -12119,15 +12192,15 @@ msgstr ""
" användas för att slå av detta radslut (bland annat användbart när\n"
" binära egenskaper skickas till en fil).\n"
-#: ../svn/svn.c:1254 ../svn/svn.c:1271
+#: ../svn/svn.c:1271 ../svn/svn.c:1288
msgid "print path, name and value on separate lines"
msgstr "skriv sökväg, namn och värde på skilda rader"
-#: ../svn/svn.c:1255
+#: ../svn/svn.c:1272
msgid "don't print an extra newline"
msgstr "skriv inte ett extra radslut"
-#: ../svn/svn.c:1258
+#: ../svn/svn.c:1275
msgid ""
"List all properties on files, dirs, or revisions.\n"
"usage: 1. proplist [TARGET[@REV]...]\n"
@@ -12155,11 +12228,11 @@ msgstr ""
" Med --verbose skrivs egenskapsvärdena också ut, som med \"svn propget\n"
" --verbose\". Med --quiet skrivs inte sökvägarna ut.\n"
-#: ../svn/svn.c:1272
+#: ../svn/svn.c:1289
msgid "don't print the path"
msgstr "skriv inte sökvägen"
-#: ../svn/svn.c:1275
+#: ../svn/svn.c:1292
msgid ""
"Set the value of a property on files, dirs, or revisions.\n"
"usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -12285,9 +12358,9 @@ msgstr ""
" svn:executable - Om den finns, görs filen exekverbar. Använd\n"
" \"svn propdel svn:executable SÖKVÄG...\" för att nollställa.\n"
" svn:eol-style - NÃ¥got av \"native\", \"CR\", \"LF\" eller \"CRLF\".\n"
-" svn:mime-type - Filens mime-typ. Används för att avgöra hur samman-\n"
+" svn:mime-type - Filens MIME-typ. Används för att avgöra hur samman-\n"
" slagningar av ändringar sker och hur den skickas från Apache. En\n"
-" mime-typ som inleds med \"text/\" eller som saknas behandlas som text.\n"
+" MIME-typ som inleds med \"text/\" eller som saknas behandlas som text.\n"
" Allt annat behandlas som binärdata.\n"
" svn:needs-lock - Om den är satt, visar den att filen bör låsas innan\n"
" den ändras. Gör att arbetsfilen blir skrivskyddad när den inte är\n"
@@ -12322,11 +12395,11 @@ msgstr ""
" \"relativ_URL relativ_sökväg\" med stöd för fixerad revision.\n"
" Rader som börjar med tecknet \"#\" hoppas över.\n"
-#: ../svn/svn.c:1354
+#: ../svn/svn.c:1371
msgid "read property value from file ARG"
msgstr "läs egenskapsvärde från filen ARG"
-#: ../svn/svn.c:1357
+#: ../svn/svn.c:1374
msgid ""
"Relocate the working copy to point to a different repository root URL.\n"
"usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
@@ -12355,7 +12428,7 @@ msgstr ""
"\n"
" Skriv om arbetskopians URL-metadata för att avspegla en ren syntaxändring.\n"
" Detta används när en arkivrots-URL ändras (t.ex. byte av schema eller\n"
-" värddator) men arbetskopian fortfarande representerar samma katalog i\n"
+" värddator) men arbetskopian representerar fortfarande samma katalog i\n"
" samma arkiv.\n"
"\n"
" 1. FRÅN-PREFIX och TILL-PREFIX är förled till arbetskopians aktuella\n"
@@ -12370,7 +12443,7 @@ msgstr ""
" svn relocate http://www.exempel.se/arkiv/projekt \\\n"
" svn://svn.exempel.se/arkiv/projekt\n"
-#: ../svn/svn.c:1380
+#: ../svn/svn.c:1397
msgid ""
"Resolve conflicts on working copy files or directories.\n"
"usage: resolve [PATH...]\n"
@@ -12392,7 +12465,7 @@ msgstr ""
" konflikter i PATH att lösas enligt ARG.\n"
" Kört på detta sätt är kommandot normalt inte rekursivt (djup \"empty\").\n"
-#: ../svn/svn.c:1390
+#: ../svn/svn.c:1407
msgid ""
"specify automatic conflict resolution source\n"
" ('base', 'working', 'mine-conflict',\n"
@@ -12402,7 +12475,7 @@ msgstr ""
" (\"base\", \"working\", \"mine-conflict\",\n"
" \"theirs-conflict\", \"mine-full\", \"theirs-full\")"
-#: ../svn/svn.c:1397
+#: ../svn/svn.c:1414
msgid ""
"Remove 'conflicted' state on working copy files or directories.\n"
"usage: resolved PATH...\n"
@@ -12420,7 +12493,7 @@ msgstr ""
" uppstod och gör så att det går att arkivera SÖKVÄG igen. Det rekommenderas\n"
" att använda \"svn resolve --accept working\" istället.\n"
-#: ../svn/svn.c:1407
+#: ../svn/svn.c:1424
msgid ""
"Restore pristine working copy state (undo local changes).\n"
"usage: revert PATH...\n"
@@ -12442,7 +12515,8 @@ msgstr ""
" För information om att göra det, kör \"svn help merge\" och sök efter\n"
" \"upphäva\".\n"
-#: ../svn/svn.c:1419
+#: ../svn/svn.c:1436
+#, fuzzy
msgid ""
"Print the status of working copy files and directories.\n"
"usage: status [PATH...]\n"
@@ -12589,8 +12663,8 @@ msgstr ""
" Sjunde kolumnen: Huruvida objektet är föremål för en trädkonflikt\n"
" \" \" normalt\n"
" \"C\" trädkonflikt\n"
-" Om objektet är föremål för en trädkonflikt kommer en extra rad skrivas\n"
-" efter objektets statusrad om vad konflikten rör sig om.\n"
+" Om objektet är föremål för en trädkonflikt kommer en extra rad om\n"
+" konflikten skrivas efter objektets statusrad.\n"
"\n"
" Information om uppdateringar på servern visas i den nionde kolumnen\n"
" (om -u angivits):\n"
@@ -12632,11 +12706,11 @@ msgstr ""
" > lokal fil saknas, inkommande fil ändrad vid uppdatering\n"
" D ak/delta.c\n"
-#: ../svn/svn.c:1512
+#: ../svn/svn.c:1529
msgid "don't print unversioned items"
msgstr "visa inte icke versionshanterade objekt"
-#: ../svn/svn.c:1515
+#: ../svn/svn.c:1532
msgid ""
"Update the working copy to a different URL within the same repository.\n"
"usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -12684,7 +12758,7 @@ msgstr ""
"\n"
" 1. Uppdatera arbetskopian så att den återspeglar en ny URL i arkivet.\n"
" Detta liknar hur \"svn update\" beter sig och är det sätt på vilket\n"
-" man flyttar en arbetskopia till en gren eller märke inom ett\n"
+" man flyttar en arbetskopia till en gren eller ett märke inom ett\n"
" och samma arkiv. Om FIXREV anges bestämmer den i vilken revision som\n"
" målet ursprunglingen slås upp.\n"
"\n"
@@ -12703,7 +12777,7 @@ msgstr ""
" målet för denna handling.\n"
"\n"
" Normalt vägrar Subversion att växla en sökväg i en arbetskopia till\n"
-" en ny URL utan gemensam ursprung i versionshanteringen. Använd\n"
+" en ny URL utan gemensamt ursprung i versionshanteringen. Använd\n"
" flaggan \"--ignore-ancestry\" för att kringgå denna kontroll.\n"
"\n"
" 2. Flaggan \"--relocate\" är föråldrad. Denna syntax motsvaras nu av\n"
@@ -12718,11 +12792,11 @@ msgstr ""
" svn switch --relocate http://www.exempel.se/arkiv/projekt \\\n"
" svn://svn.exempel.se/arkiv/projekt\n"
-#: ../svn/svn.c:1557
+#: ../svn/svn.c:1574
msgid "allow switching to a node with no common ancestor"
msgstr "tillåt växling till en nod utan gemensamt ursprung"
-#: ../svn/svn.c:1561
+#: ../svn/svn.c:1578
msgid ""
"Unlock working copy paths or URLs.\n"
"usage: unlock TARGET...\n"
@@ -12734,7 +12808,7 @@ msgstr ""
"\n"
"Använd --force för att \"bryta upp\" låset.\n"
-#: ../svn/svn.c:1568
+#: ../svn/svn.c:1585
msgid ""
"Bring changes from the repository into the working copy.\n"
"usage: update [PATH...]\n"
@@ -12827,7 +12901,7 @@ msgstr ""
" Använd väljaren --set-depth för att ange ett nytt arbetskopiedjup för\n"
" målet för denna handling.\n"
-#: ../svn/svn.c:1618
+#: ../svn/svn.c:1635
msgid ""
"Upgrade the metadata storage format for a working copy.\n"
"usage: upgrade [WCPATH...]\n"
@@ -12839,112 +12913,112 @@ msgstr ""
"\n"
" Lokala ändringar behålls som de är.\n"
-#: ../svn/svn.c:1664 ../svnadmin/svnadmin.c:90 ../svnlook/svnlook.c:380
-#: ../svnrdump/svnrdump.c:65 ../svnsync/svnsync.c:297
+#: ../svn/svn.c:1683 ../svnadmin/svnadmin.c:91 ../svnlook/svnlook.c:379
+#: ../svnrdump/svnrdump.c:65 ../svnsync/svnsync.c:296
msgid "Caught signal"
msgstr "FÃ¥ngade signal"
-#: ../svn/svn.c:1817 ../svnlook/svnlook.c:2565
+#: ../svn/svn.c:1837 ../svnlook/svnlook.c:2564
msgid "Non-numeric limit argument given"
msgstr "Argumentet till limit-flaggan är inget tal"
-#: ../svn/svn.c:1823 ../svnlook/svnlook.c:2571
+#: ../svn/svn.c:1843 ../svnlook/svnlook.c:2570
msgid "Argument to --limit must be positive"
msgstr "Argumentet till --limit måste vara positivt"
-#: ../svn/svn.c:1844 ../svn/svn.c:2121
+#: ../svn/svn.c:1865 ../svn/svn.c:2141
msgid "Can't specify -c with --old"
msgstr "Kan inte ange -c med --old"
-#: ../svn/svn.c:1875
+#: ../svn/svn.c:1896
#, c-format
msgid "Negative number in range (%s) not supported with -c"
msgstr "Negativt tal i område (%s) stöds ej med -c"
-#: ../svn/svn.c:1888
+#: ../svn/svn.c:1909
#, c-format
msgid "Non-numeric change argument (%s) given to -c"
msgstr "Argumentet till flaggan -c (%s) är inget tal"
-#: ../svn/svn.c:1896
+#: ../svn/svn.c:1917
msgid "There is no change 0"
msgstr "Ändring 0 finns inte"
-#: ../svn/svn.c:1939 ../svnadmin/svnadmin.c:2037 ../svnrdump/svnrdump.c:937
-#: ../svnsync/svnsync.c:2052
+#: ../svn/svn.c:1960 ../svnadmin/svnadmin.c:2238 ../svnrdump/svnrdump.c:937
+#: ../svnsync/svnsync.c:2051
#, c-format
msgid "Syntax error in revision argument '%s'"
msgstr "Syntaxfel i revisionsargumentet \"%s\""
-#: ../svn/svn.c:2005 ../svn/svn.c:2024
+#: ../svn/svn.c:2025 ../svn/svn.c:2044
#, c-format
msgid "Error converting depth from locale to UTF-8"
msgstr "Fel vid konvertering av djupet från lokal kodning till UTF-8"
-#: ../svn/svn.c:2013
+#: ../svn/svn.c:2033
#, c-format
msgid "'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
msgstr "\"%s\" är inget giltigt djup; försök med \"empty\", \"files\", \"immediates\" eller \"infinity\""
-#: ../svn/svn.c:2032
+#: ../svn/svn.c:2052
#, c-format
msgid "'%s' is not a valid depth; try 'exclude', 'empty', 'files', 'immediates', or 'infinity'"
msgstr "\"%s\" är inget giltigt djup; försök med \"exclude\", \"empty\", \"files\", \"immediates\" eller \"infinity\""
-#: ../svn/svn.c:2161
+#: ../svn/svn.c:2180
#, c-format
msgid "Syntax error in native-eol argument '%s'"
msgstr "Syntaxfel i native-eol-argumentet \"%s\""
-#: ../svn/svn.c:2181
+#: ../svn/svn.c:2199
msgid "Changelist names must not be empty"
msgstr "Ändringslistor får inte ha tomma namn"
-#: ../svn/svn.c:2215
+#: ../svn/svn.c:2234
#, c-format
msgid "'%s' is not a valid --accept value"
msgstr "\"%s\" är inte ett giltigt värde för --accept"
-#: ../svn/svn.c:2223
+#: ../svn/svn.c:2243
#, c-format
msgid "'%s' is not a valid --show-revs value"
msgstr "\"%s\" är inte ett giltigt värde för --show-revs"
-#: ../svn/svn.c:2235
+#: ../svn/svn.c:2259
#, c-format
msgid "Invalid strip count '%s'"
msgstr "Ogiltigt antal att ta bort: \"%s\""
-#: ../svn/svn.c:2241
+#: ../svn/svn.c:2266
msgid "Argument to --strip must be positive"
msgstr "Argumentet till --strip måste vara positivt"
-#: ../svn/svn.c:2296 ../svnmucc/svnmucc.c:1208 ../svnrdump/svnrdump.c:993
-#: ../svnsync/svnsync.c:2096
+#: ../svn/svn.c:2329 ../svnmucc/svnmucc.c:1212 ../svnrdump/svnrdump.c:993
+#: ../svnsync/svnsync.c:2095
msgid "--non-interactive and --force-interactive are mutually exclusive"
msgstr "--non-interactive och --force-interactive kan inte användas samtidigt"
-#: ../svn/svn.c:2350 ../svndumpfilter/svndumpfilter.c:1510
-#: ../svnlook/svnlook.c:2667
+#: ../svn/svn.c:2383 ../svndumpfilter/svndumpfilter.c:1509
+#: ../svnlook/svnlook.c:2666
#, c-format
msgid "Subcommand argument required\n"
msgstr "Argument för underkommando krävs\n"
-#: ../svn/svn.c:2367 ../svnadmin/svnadmin.c:2220
-#: ../svndumpfilter/svndumpfilter.c:1530 ../svnlook/svnlook.c:2686
+#: ../svn/svn.c:2400 ../svnadmin/svnadmin.c:2430 ../svnauth/svnauth.c:644
+#: ../svndumpfilter/svndumpfilter.c:1529 ../svnlook/svnlook.c:2685
#: ../svnrdump/svnrdump.c:1039
#, c-format
msgid "Unknown subcommand: '%s'\n"
msgstr "Okänt underkommando: \"%s\"\n"
-#: ../svn/svn.c:2376
+#: ../svn/svn.c:2409
#, c-format
msgid "Undo is done using either the 'svn revert' or the 'svn merge' command.\n"
msgstr ""
"Återgång till tidigare tillstånd görs med antingen \"svn revert\"\n"
"eller \"svn merge\".\n"
-#: ../svn/svn.c:2411
+#: ../svn/svn.c:2444
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -12953,94 +13027,94 @@ msgstr ""
"Underkommandot \"%s\" tillåter inte flaggan \"%s\"\n"
"Skriv \"svn help %s\" för användning.\n"
-#: ../svn/svn.c:2425
+#: ../svn/svn.c:2458
msgid "Multiple revision arguments encountered; can't specify -c twice, or both -c and -r"
msgstr "Flera revisionsargument påträffades; -c kan inte anges flera gånger; -c och -r kan inte användas samtidigt"
-#: ../svn/svn.c:2437
+#: ../svn/svn.c:2470
msgid "--depth and --set-depth are mutually exclusive"
msgstr "--depth och --set-depth kan inte användas samtidigt"
-#: ../svn/svn.c:2447
+#: ../svn/svn.c:2480
msgid "--with-all-revprops and --with-no-revprops are mutually exclusive"
msgstr "--with-all-revprops och --with-no-revprops kan inte användas samtidigt"
-#: ../svn/svn.c:2457
+#: ../svn/svn.c:2490
msgid "--with-revprop and --with-no-revprops are mutually exclusive"
msgstr "--with-revprop och --with-no-revprops kan inte användas samtidigt"
-#: ../svn/svn.c:2470
+#: ../svn/svn.c:2521
msgid "--message (-m) and --file (-F) are mutually exclusive"
msgstr "--message (-m) och --file (-F) kan inte användas samtidigt"
-#: ../svn/svn.c:2479 ../svnmucc/svnmucc.c:1219 ../svnrdump/svnrdump.c:1098
-#: ../svnsync/svnsync.c:2147
+#: ../svn/svn.c:2530 ../svnmucc/svnmucc.c:1223 ../svnrdump/svnrdump.c:1098
+#: ../svnsync/svnsync.c:2146
msgid "--trust-server-cert requires --non-interactive"
msgstr "--trust-server-cert kräver --non-interactive"
-#: ../svn/svn.c:2489
+#: ../svn/svn.c:2540
msgid "--diff-cmd and --internal-diff are mutually exclusive"
msgstr "--diff-cmd och --internal-diff kan inte användas samtidigt"
-#: ../svn/svn.c:2531
+#: ../svn/svn.c:2582
msgid "--relocate and --depth are mutually exclusive"
msgstr "--relocate och --depth kan inte användas samtidigt"
-#: ../svn/svn.c:2539
+#: ../svn/svn.c:2590
msgid "--relocate and --non-recursive (-N) are mutually exclusive"
msgstr "--relocate och --non-recursive (-N) kan inte användas samtidigt"
-#: ../svn/svn.c:2661
+#: ../svn/svn.c:2712
msgid "Log message file is a versioned file; use '--force-log' to override"
msgstr "Filen med loggmeddelandet är versionshanterad; använd --force-log för att kringgå"
-#: ../svn/svn.c:2668
+#: ../svn/svn.c:2719
msgid "Lock comment file is a versioned file; use '--force-log' to override"
msgstr "Filen med låskommentaren är versionshanterad; använd --force-log för att kringgå"
-#: ../svn/svn.c:2689
+#: ../svn/svn.c:2740
msgid "The log message is a pathname (was -F intended?); use '--force-log' to override"
msgstr "Loggmeddelandet är en sökväg (avsågs -F?); använd --force-log för att kringgå"
-#: ../svn/svn.c:2696
+#: ../svn/svn.c:2747
msgid "The lock comment is a pathname (was -F intended?); use '--force-log' to override"
msgstr "Låskommentaren är en sökväg (avsågs -F?); använd --force-log för att kringgå"
-#: ../svn/svn.c:2720
+#: ../svn/svn.c:2771
msgid "--auto-props and --no-auto-props are mutually exclusive"
msgstr "--auto-props och --no-auto-props kan inte användas samtidigt"
-#: ../svn/svn.c:2825 ../svn/svn.c:2832
+#: ../svn/svn.c:2876 ../svn/svn.c:2883
#, c-format
msgid "--accept=%s incompatible with --non-interactive"
msgstr "--accept=%s kan inte användas med --non-interactive"
-#: ../svn/svn.c:2888
+#: ../svn/svn.c:2939
#, c-format
msgid "Try 'svn help %s' for more information"
msgstr "Skriv \"svn help %s\" för vidare information"
-#: ../svn/svn.c:2894
+#: ../svn/svn.c:2945
msgid "Please see the 'svn upgrade' command"
msgstr "Se kommandot \"svn upgrade\""
-#: ../svn/svn.c:2900 ../svnmucc/svnmucc.c:1457 ../svnrdump/svnrdump.c:1175
+#: ../svn/svn.c:2951 ../svnmucc/svnmucc.c:1454 ../svnrdump/svnrdump.c:1175
msgid "Authentication failed and interactive prompting is disabled; see the --force-interactive option"
msgstr "Autentisering misslyckades och interaktiva frågor är avstängda; se flaggan --force-interactive"
-#: ../svn/svn.c:2905
+#: ../svn/svn.c:2956
msgid "Reading file from standard input because of -F option; this can interfere with interactive prompting"
msgstr "Läser filen från standardinmatningen eftersom flaggan -F angavs; detta kan påverka interaktiva frågor"
-#: ../svn/svn.c:2916
+#: ../svn/svn.c:2967
msgid "Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)"
msgstr "Kör \"svn cleanup\" för att ta bort lås (skriv \"svn help cleanup\" för mer information)"
-#: ../svn/svn.c:2923
+#: ../svn/svn.c:2974
msgid "Another process is blocking the working copy database, or the underlying filesystem does not support file locking; if the working copy is on a network filesystem, make sure file locking has been enabled on the file server"
msgstr "En annan process blockerar arbetskopians databas, eller så stöder det underliggande filsystemet inte fillåsning; om arbetskopian ligger på ett nätverksfilsystem, se till att filservern har fillåsning påslagen"
-#: ../svn/svn.c:2936
+#: ../svn/svn.c:2987
msgid "When using svn+ssh:// URLs, keep in mind that the --username and --password options are ignored because authentication is performed by SSH, not Subversion"
msgstr "När URL:er på formen svn+ssh:// används, kom ihåg att flaggorna --username och --password ej beaktas eftersom autentisering görs av SSH, inte av Subversion"
@@ -13071,10 +13145,8 @@ msgstr " Uppdaterade \"%s\" till r%ld.\n"
#: ../svn/util.c:79
#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
"Arkiverade revision %ld%s.\n"
#: ../svn/util.c:83
@@ -13120,19 +13192,19 @@ msgstr "Ditt loggmeddelande lämnades i en temporär fil:"
msgid "--This line, and those below, will be ignored--"
msgstr "--Denna och nedanstående rader kommer inte med i loggmeddelandet--"
-#: ../svn/util.c:360
+#: ../svn/util.c:351
msgid "Error normalizing log message to internal format"
msgstr "Fel vid normalisering av loggmeddelande till det interna formatet"
-#: ../svn/util.c:447 ../svnmucc/svnmucc.c:764
+#: ../svn/util.c:442 ../svnmucc/svnmucc.c:763
msgid "Cannot invoke editor to get log message when non-interactive"
msgstr "Kan inte köra editorn för att erhålla loggmeddelande i icke-interaktivt läge"
-#: ../svn/util.c:460
+#: ../svn/util.c:455
msgid "Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options"
msgstr "Kunde inte använda den externa editorn för att erhålla ett loggmeddelande; sätt miljövariabeln $SVN_EDITOR eller använd en av flaggorna --message (-m) eller --file (-F)"
-#: ../svn/util.c:496
+#: ../svn/util.c:491
msgid ""
"\n"
"Log message unchanged or not specified\n"
@@ -13142,102 +13214,100 @@ msgstr ""
"Loggmeddelandet oförändrat eller inte angivet\n"
"avbryt (a), fortsätt (c), editera (e):\n"
-#: ../svn/util.c:549
+#: ../svn/util.c:544
msgid "Use --force to override this restriction (local modifications may be lost)"
msgstr "Använd --force för att komma runt denna begränsning (lokala ändringar kan gå förlorade)"
-#: ../svn/util.c:738 ../svn/util.c:771
+#: ../svn/util.c:733 ../svn/util.c:766
msgid "none"
msgstr "ingen"
-#: ../svn/util.c:739
+#: ../svn/util.c:734
msgid "file"
msgstr "fil"
-#: ../svn/util.c:740
+#: ../svn/util.c:735
msgid "dir"
msgstr "katalog"
-#: ../svn/util.c:772
+#: ../svn/util.c:767
msgid "update"
msgstr "uppdatering"
-#: ../svn/util.c:773
+#: ../svn/util.c:768
msgid "switch"
msgstr "växling"
-#: ../svn/util.c:896
+#: ../svn/util.c:891
msgid "(invalid date)"
msgstr "(felaktigt datum)"
-#: ../svn/util.c:1056
+#: ../svn/util.c:1051
#, c-format
msgid "svn: warning: '%s' is a binary mime-type but file '%s' looks like text; diff, merge, blame, and other operations will stop working on this file\n"
-msgstr "svn: varning: \"%s\" är en binär mime-typ men filen \"%s\" ser ut som text; \"diff\", \"merge\", \"blame\" och andra kommandon kommer sluta fungera med denna fil\n"
+msgstr "svn: varning: \"%s\" är en binär MIME-typ men filen \"%s\" ser ut som text; \"diff\", \"merge\", \"blame\" och andra kommandon kommer sluta fungera med denna fil\n"
-#: ../svnadmin/svnadmin.c:217 ../svnrdump/svnrdump.c:120
+#: ../svnadmin/svnadmin.c:220 ../svnrdump/svnrdump.c:120
msgid "specify revision number ARG (or X:Y range)"
msgstr "ange revisionsnummer ARG (eller ett område X:Y)"
-#: ../svnadmin/svnadmin.c:220 ../svnlook/svnlook.c:162
+#: ../svnadmin/svnadmin.c:223 ../svnlook/svnlook.c:161
msgid "specify transaction name ARG"
msgstr "ange transaktionsnamn ARG"
-#: ../svnadmin/svnadmin.c:223
+#: ../svnadmin/svnadmin.c:226
msgid "dump or hotcopy incrementally"
msgstr "dumpa eller kopiera under drift inkrementellt"
-#: ../svnadmin/svnadmin.c:226
+#: ../svnadmin/svnadmin.c:229
msgid "use deltas in dump output"
msgstr "använd deltan i utskrift av dump"
-#: ../svnadmin/svnadmin.c:229
+#: ../svnadmin/svnadmin.c:232
msgid "bypass the repository hook system"
msgstr "kringgå arkivets krokskript-system"
-#: ../svnadmin/svnadmin.c:232
+#: ../svnadmin/svnadmin.c:235
msgid "bypass property validation logic"
msgstr "förbigå logik för egenskapskontroll"
-#: ../svnadmin/svnadmin.c:235 ../svnlook/svnlook.c:193
-#: ../svnrdump/svnrdump.c:122 ../svnserve/svnserve.c:291
-#: ../svnversion/svnversion.c:143
-msgid "no progress (only errors) to stderr"
+#: ../svnadmin/svnadmin.c:238
+msgid "no progress (only errors to stderr)"
msgstr ""
-"ingen förloppsinformation (endast fel) till\n"
-" standard fel"
+"ingen förloppsinformation (endast fel till\n"
+" standard fel)"
-#: ../svnadmin/svnadmin.c:238
+#: ../svnadmin/svnadmin.c:241
msgid "ignore any repos UUID found in the stream"
msgstr "bortse från samtliga arkiv-UUID:n i strömmen"
-#: ../svnadmin/svnadmin.c:241
+#: ../svnadmin/svnadmin.c:244
msgid "set repos UUID to that found in stream, if any"
msgstr ""
"sätt UUID för arkivet till den som eventuellt\n"
" återfinns i strömmen"
-#: ../svnadmin/svnadmin.c:244
+#: ../svnadmin/svnadmin.c:247
msgid "type of repository: 'fsfs' (default) or 'bdb'"
msgstr "typ av arkiv: \"fsfs\" (standard) eller \"bdb\""
-#: ../svnadmin/svnadmin.c:247
+#: ../svnadmin/svnadmin.c:250
msgid "load at specified directory in repository"
msgstr "läs in till angiven katalog i arkivet"
-#: ../svnadmin/svnadmin.c:250
+#: ../svnadmin/svnadmin.c:253
msgid "disable fsync at transaction commit [Berkeley DB]"
msgstr ""
"slå av fsync vid commit av transaktion\n"
" [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:253
+#: ../svnadmin/svnadmin.c:256
msgid "disable automatic log file removal [Berkeley DB]"
msgstr ""
"slå av automatisk radering av loggfiler\n"
" [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:259
+#: ../svnadmin/svnadmin.c:262
msgid ""
"remove redundant Berkeley DB log files\n"
" from source repository [Berkeley DB]"
@@ -13245,31 +13315,31 @@ msgstr ""
"ta bort redundanta Berkeley DB-loggfiler\n"
" från källarkivet [Berkeley DB]"
-#: ../svnadmin/svnadmin.c:263
+#: ../svnadmin/svnadmin.c:266
msgid "call pre-commit hook before committing revisions"
msgstr ""
"anropa krokskript \"pre-commit\" före arkivering\n"
" av revisioner"
-#: ../svnadmin/svnadmin.c:266
+#: ../svnadmin/svnadmin.c:269
msgid "call post-commit hook after committing revisions"
msgstr ""
"anropa krokskript \"post-commit\" efter arkivering\n"
" av revisioner"
-#: ../svnadmin/svnadmin.c:269
+#: ../svnadmin/svnadmin.c:272
msgid "call hook before changing revision property"
msgstr ""
"anropa krokskript före ändring av\n"
" revisionsegenskap"
-#: ../svnadmin/svnadmin.c:272
+#: ../svnadmin/svnadmin.c:275
msgid "call hook after changing revision property"
msgstr ""
"anropa krokskript efter ändring av\n"
" revisionsegenskap"
-#: ../svnadmin/svnadmin.c:275
+#: ../svnadmin/svnadmin.c:278
msgid ""
"wait instead of exit if the repository is in\n"
" use by another process"
@@ -13277,12 +13347,16 @@ msgstr ""
"vänta istället för att avsluta om arkivet\n"
" används av någon annan process"
-#: ../svnadmin/svnadmin.c:279 ../svnadmin/svnadmin.c:282
-#: ../svnadmin/svnadmin.c:285
+#: ../svnadmin/svnadmin.c:282 ../svnadmin/svnadmin.c:285
+#: ../svnadmin/svnadmin.c:288
msgid "deprecated; see --compatible-version"
msgstr "föråldrat; se --compatible-version"
-#: ../svnadmin/svnadmin.c:288
+#: ../svnadmin/svnadmin.c:291
+msgid "continue verification after detecting a corruption"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:294
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations. Default: 16.\n"
@@ -13292,7 +13366,7 @@ msgstr ""
" att minimera antalet onödiga operationer.\n"
" Standardvärde: 16. [endast använt för FSFS-arkiv]"
-#: ../svnadmin/svnadmin.c:293
+#: ../svnadmin/svnadmin.c:299
msgid ""
"use repository format compatible with Subversion\n"
" version ARG (\"1.5.5\", \"1.7\", etc.)"
@@ -13300,11 +13374,11 @@ msgstr ""
"använd ett arkivformat kompatibelt med\n"
" Subversion-version ARG (\"1.5.5\", \"1.7\", osv)"
-#: ../svnadmin/svnadmin.c:296
+#: ../svnadmin/svnadmin.c:302
msgid "read repository paths from file ARG"
msgstr "läs arkivsökvägar från filen ARG"
-#: ../svnadmin/svnadmin.c:308
+#: ../svnadmin/svnadmin.c:314
msgid ""
"usage: svnadmin crashtest REPOS_PATH\n"
"\n"
@@ -13316,7 +13390,7 @@ msgstr ""
"Öppna arkivet under ARKIVSÖKVÄG och avbryt därefter, vilket simulerar en\n"
"process som kraschar då den har ett arkiv öppet.\n"
-#: ../svnadmin/svnadmin.c:314
+#: ../svnadmin/svnadmin.c:320
msgid ""
"usage: svnadmin create REPOS_PATH\n"
"\n"
@@ -13327,7 +13401,7 @@ msgstr ""
"Skapa ett nytt tomt arkiv under sökvägen ARKIVSÖKVÄG.\n"
"\n"
-#: ../svnadmin/svnadmin.c:323
+#: ../svnadmin/svnadmin.c:329
msgid ""
"usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n"
"\n"
@@ -13345,7 +13419,7 @@ msgstr ""
"jämfört med föregående revision. Om inga revisioner anges, deltifieras\n"
"huvudrevisionen.\n"
-#: ../svnadmin/svnadmin.c:332
+#: ../svnadmin/svnadmin.c:338
msgid ""
"usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n"
"\n"
@@ -13365,13 +13439,13 @@ msgstr ""
"\"dumpfile\"-format med återkoppling till standard fel. Revisionerna BÖRJAN\n"
"till och med SLUT skrivs ut. Om inga revisioner anges, skrivs samtliga\n"
"revisionsträd. Om endast BÖRJAN anges, skrivs det revisionsträdet. Flaggan\n"
-"--incremental gör att den första skrivna revisionen bara kommer innehålla\n"
+"--incremental gör att den först skrivna revisionen bara kommer innehålla\n"
"sökvägarna som ändrades i den revisionen; annars kommer den innehålla alla\n"
"sökvägar som finns i arkivet i den revisionen. (I båda fallen kommer alla\n"
"revisioner därefter bara ta med sökvägarna som ändrades i varje enskild\n"
"revision.)\n"
-#: ../svnadmin/svnadmin.c:345
+#: ../svnadmin/svnadmin.c:351
msgid ""
"usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n"
@@ -13391,7 +13465,7 @@ msgstr ""
" arkivsökväg på varje rad. Arkiven låses i samma ordning som de står\n"
" i filen.\n"
-#: ../svnadmin/svnadmin.c:355
+#: ../svnadmin/svnadmin.c:361
msgid ""
"usage: svnadmin help [SUBCOMMAND...]\n"
"\n"
@@ -13401,7 +13475,7 @@ msgstr ""
"\n"
"Beskriver hur det här programmet och dess underkommandon används.\n"
-#: ../svnadmin/svnadmin.c:360
+#: ../svnadmin/svnadmin.c:366
msgid ""
"usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n"
"\n"
@@ -13415,7 +13489,17 @@ msgstr ""
"Med flaggan --incremental kommer data som redan finns i destinationen inte\n"
"kopieras igen. Denna funktion finns implementerad för FSFS-arkiv.\n"
-#: ../svnadmin/svnadmin.c:367
+#: ../svnadmin/svnadmin.c:373
+msgid ""
+"usage: svnadmin info REPOS_PATH\n"
+"\n"
+"Print information about the repository at REPOS_PATH.\n"
+msgstr ""
+"användning: svnadmin info ARKIVSÖKVÄG\n"
+"\n"
+"Visa information om arkivet i ARKIVSÖKVÄG.\n"
+
+#: ../svnadmin/svnadmin.c:378
msgid ""
"usage: svnadmin list-dblogs REPOS_PATH\n"
"\n"
@@ -13431,7 +13515,7 @@ msgstr ""
"VARNING: Att ändra eller ta bort loggfiler som fortfarande används leder\n"
"till att databasen förstörs.\n"
-#: ../svnadmin/svnadmin.c:374
+#: ../svnadmin/svnadmin.c:385
msgid ""
"usage: svnadmin list-unused-dblogs REPOS_PATH\n"
"\n"
@@ -13443,7 +13527,7 @@ msgstr ""
"Ger en lista av Berkeley DB-loggfiler som inte används.\n"
"\n"
-#: ../svnadmin/svnadmin.c:379
+#: ../svnadmin/svnadmin.c:390
msgid ""
"usage: svnadmin load REPOS_PATH\n"
"\n"
@@ -13462,7 +13546,7 @@ msgstr ""
"Om flaggan --revision anges kommer bara revisionerna vars nummer ingår i det\n"
"angivna området läsas in från inmatningsströmmen.\n"
-#: ../svnadmin/svnadmin.c:391
+#: ../svnadmin/svnadmin.c:402
msgid ""
"usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n"
"\n"
@@ -13477,7 +13561,7 @@ msgstr ""
"Om angivet, använd ID som låsidentifierare. Använd --bypass-hooks för att\n"
"förhindra körning av krokskripten \"pre-lock\" och \"post-lock\".\n"
-#: ../svnadmin/svnadmin.c:398
+#: ../svnadmin/svnadmin.c:409
msgid ""
"usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
"\n"
@@ -13489,7 +13573,7 @@ msgstr ""
"Beskriv alla lås i eller under SÖKVÄG-I-ARKIV (som är arkivets rot om ej\n"
"angiven).\n"
-#: ../svnadmin/svnadmin.c:404
+#: ../svnadmin/svnadmin.c:415
msgid ""
"usage: svnadmin lstxns REPOS_PATH\n"
"\n"
@@ -13499,7 +13583,7 @@ msgstr ""
"\n"
"Visa namnen på alla transaktioner som inte är införda.\n"
-#: ../svnadmin/svnadmin.c:409
+#: ../svnadmin/svnadmin.c:420
msgid ""
"usage: svnadmin pack REPOS_PATH\n"
"\n"
@@ -13511,7 +13595,7 @@ msgstr ""
"Packa arkivet i ett effektivare lagringsformat om det går.\n"
"I annat fall sker ingenting.\n"
-#: ../svnadmin/svnadmin.c:415
+#: ../svnadmin/svnadmin.c:426
msgid ""
"usage: svnadmin recover REPOS_PATH\n"
"\n"
@@ -13527,7 +13611,7 @@ msgstr ""
"databas kräver enskild åtkomst och kommer avbrytas om databasen används av\n"
"någon annan process.\n"
-#: ../svnadmin/svnadmin.c:423
+#: ../svnadmin/svnadmin.c:434
msgid ""
"usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n"
"\n"
@@ -13537,7 +13621,7 @@ msgstr ""
"\n"
"Ta ovillkorligen bort lås från varje LÅST_SÖKVÄG.\n"
-#: ../svnadmin/svnadmin.c:428
+#: ../svnadmin/svnadmin.c:439
msgid ""
"usage: svnadmin rmtxns REPOS_PATH TXN_NAME...\n"
"\n"
@@ -13547,7 +13631,7 @@ msgstr ""
"\n"
"Ta bort namngivna transaktion(er).\n"
-#: ../svnadmin/svnadmin.c:433
+#: ../svnadmin/svnadmin.c:444
msgid ""
"usage: svnadmin setlog REPOS_PATH -r REVISION FILE\n"
"\n"
@@ -13572,7 +13656,7 @@ msgstr ""
"ANMÄRKNING: Historik lagras inte för revisionsegenskaper, så detta kommando\n"
"skriver för alltid över det befintliga loggmeddelandet.\n"
-#: ../svnadmin/svnadmin.c:445
+#: ../svnadmin/svnadmin.c:456
msgid ""
"usage: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
"\n"
@@ -13594,7 +13678,7 @@ msgstr ""
"ANMÄRKNING: Historik sparas ej för revisionsegenskaper, så detta kommando\n"
"skriver över egenskapens tidigare värde.\n"
-#: ../svnadmin/svnadmin.c:456
+#: ../svnadmin/svnadmin.c:467
msgid ""
"usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n"
"\n"
@@ -13607,7 +13691,7 @@ msgstr ""
"Återställ UUID för arkivet i ARKIVSÖKVÄG. Om NY_UUID anges kommer det\n"
"användas som ny UUID för arkivet; annars kommer en helt ny UUID genereras.\n"
-#: ../svnadmin/svnadmin.c:463
+#: ../svnadmin/svnadmin.c:474
msgid ""
"usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n"
"\n"
@@ -13621,7 +13705,7 @@ msgstr ""
"låsidentifieraren stämmer med ID. Använd --bypass-hooks för att förhindra\n"
"körning av krokskripten \"pre-unlock\" och \"post-unlock\".\n"
-#: ../svnadmin/svnadmin.c:470
+#: ../svnadmin/svnadmin.c:481
msgid ""
"usage: svnadmin upgrade REPOS_PATH\n"
"\n"
@@ -13647,7 +13731,7 @@ msgstr ""
"helhet. Den garanterar inte ett optimerat arkivtillstånd vilket en\n"
"utskrivning och återställning skulle göra.\n"
-#: ../svnadmin/svnadmin.c:483
+#: ../svnadmin/svnadmin.c:494
msgid ""
"usage: svnadmin verify REPOS_PATH\n"
"\n"
@@ -13657,67 +13741,77 @@ msgstr ""
"\n"
"Kontrollerar den data som är lagrad i arkivet.\n"
-#: ../svnadmin/svnadmin.c:545
+#: ../svnadmin/svnadmin.c:554
msgid "Invalid revision specifier"
msgstr "Ogiltig revisionsangivelse"
-#: ../svnadmin/svnadmin.c:549
+#: ../svnadmin/svnadmin.c:558
#, c-format
msgid "Revisions must not be greater than the youngest revision (%ld)"
msgstr "Revisionerna får ej vara större än den yngsta revisionen (%ld)"
-#: ../svnadmin/svnadmin.c:656
+#: ../svnadmin/svnadmin.c:644
+#, c-format
+msgid ""
+"Successfully opened repository '%s'.\n"
+"Will now crash to simulate a crashing server process.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:683
#, c-format
msgid "%swarning: The \"%s\" repository back-end is deprecated, consider using \"%s\" instead.\n"
msgstr "%svarning: Arkivmekanismen \"%s\" är föråldrad; överväg att använda \"%s\" istället.\n"
-#: ../svnadmin/svnadmin.c:696
+#: ../svnadmin/svnadmin.c:712
msgid "Repositories compatible with 1.0.x must use --fs-type=bdb"
msgstr "Arkiv kompatibla med 1.0.x måste använda --fs-type=bdb"
-#: ../svnadmin/svnadmin.c:739 ../svnadmin/svnadmin.c:1011
-#: ../svnadmin/svnadmin.c:1192
+#: ../svnadmin/svnadmin.c:755 ../svnadmin/svnadmin.c:1096
+#: ../svnadmin/svnadmin.c:1277
msgid "First revision cannot be higher than second"
msgstr "Den första revisionen kan inte vara högre än den andra"
-#: ../svnadmin/svnadmin.c:748
+#: ../svnadmin/svnadmin.c:764
#, c-format
msgid "Deltifying revision %ld..."
msgstr "Deltifierar revision %ld..."
-#: ../svnadmin/svnadmin.c:752 ../svnadmin/svnadmin.c:812
-#: ../svnadmin/svnadmin.c:827
+#: ../svnadmin/svnadmin.c:768 ../svnadmin/svnadmin.c:870
+#: ../svnadmin/svnadmin.c:885
#, c-format
msgid "done.\n"
msgstr "klart.\n"
-#: ../svnadmin/svnadmin.c:793
-#, c-format
+#: ../svnadmin/svnadmin.c:829
+#, fuzzy, c-format
+msgid "* Error verifying revision %ld.\n"
+msgstr "* Verifierade revision %ld.\n"
+
+#: ../svnadmin/svnadmin.c:851
msgid "* Verifying repository metadata ...\n"
msgstr "* Kontrollerar arkivmetadata...\n"
-#: ../svnadmin/svnadmin.c:796
+#: ../svnadmin/svnadmin.c:854
#, c-format
msgid "* Verifying metadata at revision %ld ...\n"
msgstr "* Kontrollerar metadata i revision %ld...\n"
-#: ../svnadmin/svnadmin.c:806
+#: ../svnadmin/svnadmin.c:864
#, c-format
msgid "Packing revisions in shard %s..."
msgstr "Packar revision i skärva %s..."
-#: ../svnadmin/svnadmin.c:821
+#: ../svnadmin/svnadmin.c:879
#, c-format
msgid "Packing revprops in shard %s..."
msgstr "Packar revisionsegenskaper i skärva %s..."
-#: ../svnadmin/svnadmin.c:898
+#: ../svnadmin/svnadmin.c:954
#, c-format
msgid "<<< Skipped original revision %ld\n"
msgstr "<<< Hoppade över ursprungliga revisionen %ld\n"
-#: ../svnadmin/svnadmin.c:915
-#, c-format
+#: ../svnadmin/svnadmin.c:971
msgid ""
"Repository lock acquired.\n"
"Please wait; recovering the repository may take some time...\n"
@@ -13725,7 +13819,7 @@ msgstr ""
"Arkivlåset har erhållits.\n"
"Vänta; det kan ta tid att återskapa arkivet...\n"
-#: ../svnadmin/svnadmin.c:922
+#: ../svnadmin/svnadmin.c:978
msgid ""
"Repository lock acquired.\n"
"Please wait; upgrading the repository may take some time...\n"
@@ -13733,11 +13827,26 @@ msgstr ""
"Arkivlåset har erhållits.\n"
"Vänta; det kan ta tid att uppgradera arkivet...\n"
-#: ../svnadmin/svnadmin.c:1072
+#: ../svnadmin/svnadmin.c:989
+#, fuzzy, c-format
+msgid "Packing revision properties in shard %s..."
+msgstr "Packar revision i skärva %s..."
+
+#: ../svnadmin/svnadmin.c:1001
+#, fuzzy, c-format
+msgid "Removing non-packed revision properties in shard %s..."
+msgstr "Packar revision i skärva %s..."
+
+#: ../svnadmin/svnadmin.c:1009
+#, fuzzy, c-format
+msgid "Bumped repository format to %ld\n"
+msgstr "Arkivformat: %d\n"
+
+#: ../svnadmin/svnadmin.c:1157
msgid "No program provided"
msgstr "Inget program angivet"
-#: ../svnadmin/svnadmin.c:1108
+#: ../svnadmin/svnadmin.c:1193
msgid ""
"general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
"Type 'svnadmin help <subcommand>' for help on a specific subcommand.\n"
@@ -13752,8 +13861,8 @@ msgstr ""
"\n"
"Tillgängliga underkommandon:\n"
-#: ../svnadmin/svnadmin.c:1115 ../svnlook/svnlook.c:2226
-#: ../svnserve/svnserve.c:337
+#: ../svnadmin/svnadmin.c:1200 ../svnlook/svnlook.c:2225
+#: ../svnserve/svnserve.c:336
msgid ""
"The following repository back-end (FS) modules are available:\n"
"\n"
@@ -13761,20 +13870,20 @@ msgstr ""
"Följande arkivåtkomstmoduler är tillgängliga:\n"
"\n"
-#: ../svnadmin/svnadmin.c:1144
+#: ../svnadmin/svnadmin.c:1229
#, c-format
msgid "Invalid revision number (%ld) specified"
msgstr "Ogiltigt revisionsnummer (%ld) angivet"
-#: ../svnadmin/svnadmin.c:1154
+#: ../svnadmin/svnadmin.c:1239
msgid "Non-numeric revision specified"
msgstr "Ickenumerisk revision angiven"
-#: ../svnadmin/svnadmin.c:1213
+#: ../svnadmin/svnadmin.c:1298
msgid "Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading."
msgstr "Ogiltigt egenskapsvärde hittat i dumpströmmen; reparera källan eller använd --bypass-prop-validation vid inläsningen."
-#: ../svnadmin/svnadmin.c:1279 ../svnadmin/svnadmin.c:1911
+#: ../svnadmin/svnadmin.c:1364 ../svnadmin/svnadmin.c:2112
msgid ""
"Failed to get exclusive repository access; perhaps another process\n"
"such as httpd, svnserve or svn has it open?"
@@ -13782,12 +13891,12 @@ msgstr ""
"Kunde inte erhålla enskild åtkomst till arkivet; kanske någon annan process,\n"
"såsom httpd, svnserve eller svn har det öppet?"
-#: ../svnadmin/svnadmin.c:1284 ../svnadmin/svnadmin.c:1916
+#: ../svnadmin/svnadmin.c:1369 ../svnadmin/svnadmin.c:2117
#, c-format
msgid "Waiting on repository lock; perhaps another process has it open?\n"
msgstr "Väntar på arkivlås; kanske någon annan process har arkivet öppen?\n"
-#: ../svnadmin/svnadmin.c:1292
+#: ../svnadmin/svnadmin.c:1377
#, c-format
msgid ""
"\n"
@@ -13796,52 +13905,102 @@ msgstr ""
"\n"
"Ã…terskapande klart.\n"
-#: ../svnadmin/svnadmin.c:1299
+#: ../svnadmin/svnadmin.c:1384
#, c-format
msgid "The latest repos revision is %ld.\n"
msgstr "Den senaste revisionen i arkivet är %ld.\n"
-#: ../svnadmin/svnadmin.c:1414
+#: ../svnadmin/svnadmin.c:1499
#, c-format
msgid "Transaction '%s' removed.\n"
msgstr "Transaktionen \"%s\" borttagen.\n"
-#: ../svnadmin/svnadmin.c:1476 ../svnadmin/svnadmin.c:1521
+#: ../svnadmin/svnadmin.c:1561 ../svnadmin/svnadmin.c:1606
#, c-format
msgid "Missing revision"
msgstr "Revision saknas"
-#: ../svnadmin/svnadmin.c:1479 ../svnadmin/svnadmin.c:1524
+#: ../svnadmin/svnadmin.c:1564 ../svnadmin/svnadmin.c:1609
#, c-format
msgid "Only one revision allowed"
msgstr "Endast en revision tillåts"
-#: ../svnadmin/svnadmin.c:1578
+#: ../svnadmin/svnadmin.c:1663
#, c-format
msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
msgstr "--revision (-r) och --transaction (-t) kan inte användas samtidigt"
-#: ../svnadmin/svnadmin.c:1745 ../svnlook/svnlook.c:2289
+#: ../svnadmin/svnadmin.c:1748
+#, c-format
+msgid "Repository Format: %d\n"
+msgstr "Arkivformat: %d\n"
+
+#: ../svnadmin/svnadmin.c:1762
+#, c-format
+msgid "Compatible With Version: %d.%d.0\n"
+msgstr "Kompatibelt med version: %d.%d.0\n"
+
+#: ../svnadmin/svnadmin.c:1781
+#, fuzzy, c-format
+msgid "Repository Capability: %s\n"
+msgstr "Arkivförmågor: %s\n"
+
+#: ../svnadmin/svnadmin.c:1790
+#, c-format
+msgid "Filesystem Type: %s\n"
+msgstr "Filsystemstyp: %s\n"
+
+#: ../svnadmin/svnadmin.c:1792
+#, c-format
+msgid "Filesystem Format: %d\n"
+msgstr "Filsystemsformat: %d\n"
+
+#: ../svnadmin/svnadmin.c:1801
+#, c-format
+msgid "FSFS Sharded: yes\n"
+msgstr "FSFS splittrad: ja\n"
+
+#: ../svnadmin/svnadmin.c:1803
+#, c-format
+msgid "FSFS Sharded: no\n"
+msgstr "FSFS splittrad: nej\n"
+
+#: ../svnadmin/svnadmin.c:1806
+#, c-format
+msgid "FSFS Shard Size: %d\n"
+msgstr "FSFS skärvstorlek: %d\n"
+
+#: ../svnadmin/svnadmin.c:1815
+#, fuzzy, c-format
+msgid "FSFS Shards Packed: %ld/%ld\n"
+msgstr "FSFS skärvstorlek: %d\n"
+
+#: ../svnadmin/svnadmin.c:1827
+#, c-format
+msgid "Configuration File: %s\n"
+msgstr "Konfigurationsfil: %s\n"
+
+#: ../svnadmin/svnadmin.c:1946 ../svnlook/svnlook.c:2288
#, c-format
msgid "UUID Token: %s\n"
msgstr "UUID-identifierare: %s\n"
-#: ../svnadmin/svnadmin.c:1746 ../svnlook/svnlook.c:2290
+#: ../svnadmin/svnadmin.c:1947 ../svnlook/svnlook.c:2289
#, c-format
msgid "Owner: %s\n"
msgstr "Ägare: %s\n"
-#: ../svnadmin/svnadmin.c:1747 ../svnlook/svnlook.c:2291
+#: ../svnadmin/svnadmin.c:1948 ../svnlook/svnlook.c:2290
#, c-format
msgid "Created: %s\n"
msgstr "Skapat: %s\n"
-#: ../svnadmin/svnadmin.c:1748 ../svnlook/svnlook.c:2292
+#: ../svnadmin/svnadmin.c:1949 ../svnlook/svnlook.c:2291
#, c-format
msgid "Expires: %s\n"
msgstr "GÃ¥r ut: %s\n"
-#: ../svnadmin/svnadmin.c:1750
+#: ../svnadmin/svnadmin.c:1951
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -13860,34 +14019,34 @@ msgstr[1] ""
"%s\n"
"\n"
-#: ../svnadmin/svnadmin.c:1796
+#: ../svnadmin/svnadmin.c:1997
msgid "No paths to unlock provided"
msgstr "Ingen sökväg till upplåsning tillhandahölls"
-#: ../svnadmin/svnadmin.c:1814
+#: ../svnadmin/svnadmin.c:2015
#, c-format
msgid "Path '%s' isn't locked.\n"
msgstr "Sökvägen \"%s\" är inte låst.\n"
-#: ../svnadmin/svnadmin.c:1826
+#: ../svnadmin/svnadmin.c:2027
#, c-format
msgid "Removed lock on '%s'.\n"
msgstr "Tog bort lås på \"%s\".\n"
-#: ../svnadmin/svnadmin.c:1879
+#: ../svnadmin/svnadmin.c:2080
#, c-format
msgid "'%s' unlocked by user '%s'.\n"
msgstr "\"%s\" låstes upp av användaren \"%s\".\n"
-#: ../svnadmin/svnadmin.c:1926
+#: ../svnadmin/svnadmin.c:2127
msgid "Upgrade of this repository's underlying versioned filesystem is not supported; consider dumping and loading the data elsewhere"
msgstr "Uppgradering av det versionshanterade filsystemet som används av detta arkiv stöds ej; skriv ut och återställ informationen någon annanstans"
-#: ../svnadmin/svnadmin.c:1933
+#: ../svnadmin/svnadmin.c:2134
msgid "Upgrade of this repository is not supported; consider dumping and loading the data elsewhere"
msgstr "Uppgradering av detta arkiv stöds ej; skriv ut och återställ informationen någon annanstans"
-#: ../svnadmin/svnadmin.c:1939
+#: ../svnadmin/svnadmin.c:2140
#, c-format
msgid ""
"\n"
@@ -13896,35 +14055,35 @@ msgstr ""
"\n"
"Uppdatering klar.\n"
-#: ../svnadmin/svnadmin.c:2024 ../svnrdump/svnrdump.c:923
+#: ../svnadmin/svnadmin.c:2225 ../svnrdump/svnrdump.c:923
msgid "Multiple revision arguments encountered; try '-r N:M' instead of '-r N -r M'"
msgstr "Flera revisionsargument påträffades; försök med \"-r M:N\" istället för \"-r M -r N\""
-#: ../svnadmin/svnadmin.c:2102
+#: ../svnadmin/svnadmin.c:2309
#, c-format
msgid "Cannot create pre-1.0-compatible repositories"
msgstr "Kan inte skapa arkiv kompatibelt med versioner äldre än 1.0"
-#: ../svnadmin/svnadmin.c:2115
+#: ../svnadmin/svnadmin.c:2322
#, c-format
msgid "Cannot guarantee compatibility beyond the current running version (%s)"
msgstr "Kan inte garantera kompatibilitet bortom versionen som nu körs (%s)"
-#: ../svnadmin/svnadmin.c:2204
+#: ../svnadmin/svnadmin.c:2414 ../svnauth/svnauth.c:628
#, c-format
msgid "subcommand argument required\n"
msgstr "argument för underkommando krävs\n"
-#: ../svnadmin/svnadmin.c:2239
+#: ../svnadmin/svnadmin.c:2449
msgid "Repository argument required"
msgstr "Argument för arkiv krävs"
-#: ../svnadmin/svnadmin.c:2252
+#: ../svnadmin/svnadmin.c:2462
#, c-format
msgid "'%s' is a URL when it should be a local path"
msgstr "\"%s\" är en URL när den skulle vara en lokal sökväg"
-#: ../svnadmin/svnadmin.c:2283
+#: ../svnadmin/svnadmin.c:2493
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -13933,74 +14092,278 @@ msgstr ""
"Underkommandot \"%s\" tillåter inte flaggan \"%s\"\n"
"Skriv \"svnadmin help %s\" för användning.\n"
-#: ../svnadmin/svnadmin.c:2326
+#: ../svnadmin/svnadmin.c:2536
msgid "Try 'svnadmin help' for more info"
msgstr "Skriv \"svnadmin help\" för mer information"
-#: ../svndumpfilter/svndumpfilter.c:79
+#: ../svnauth/svnauth.c:76
+#, fuzzy
+msgid ""
+"usage: svnauth help [SUBCOMMAND...]\n"
+"\n"
+"Describe the usage of this program or its subcommands.\n"
+msgstr ""
+"användning: svnadmin help [UNDERKOMMANDO...]\n"
+"\n"
+"Beskriver hur det här programmet och dess underkommandon används.\n"
+
+#: ../svnauth/svnauth.c:81
+msgid ""
+"usage: svnauth list\n"
+"\n"
+"List cached authentication credentials.\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:97
+#, fuzzy
+msgid "use auth cache in config directory ARG"
+msgstr "Skapar conf-katalog"
+
+#: ../svnauth/svnauth.c:99
+msgid "show cached passwords"
+msgstr ""
+
+#: ../svnauth/svnauth.c:112
+#, fuzzy
+msgid ""
+"general usage: svnauth SUBCOMMAND [ARGS & OPTIONS ...]\n"
+"Type 'svnauth help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnauth --version' to see the program version and available\n"
+"authentication credential caches.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+"allmän användning: svnadmin UNDERKOMMANDO ARKIVSÖKVÄG [ARGUMENT & FLAGGOR...]\n"
+"Skriv \"svnadmin help <underkommando>\" för att få hjälp om ett specifikt\n"
+"underkommando.\n"
+"Skriv \"svnadmin --version\" för att se programversion och filsystemsmoduler.\n"
+"\n"
+"Tillgängliga underkommandon:\n"
+
+#: ../svnauth/svnauth.c:127
+#, fuzzy
+msgid "Available authentication credential caches:\n"
+msgstr "Autentiseringsregion (realm): %s\n"
+
+#: ../svnauth/svnauth.c:133
+#, c-format
+msgid "%s Wincrypt cache in %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:136
+#, c-format
+msgid "%s Plaintext cache in %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:217
+#, fuzzy, c-format
+msgid " Common Name: %s\n"
+msgstr "Namn: %s\n"
+
+#: ../svnauth/svnauth.c:221
+#, fuzzy, c-format
+msgid " Email Address: %s\n"
+msgstr "GÃ¥r ut: %s\n"
+
+#: ../svnauth/svnauth.c:225
+#, fuzzy, c-format
+msgid " Organization Name: %s\n"
+msgstr "Autentiseringsregion (realm): %s\n"
+
+#: ../svnauth/svnauth.c:230
+#, c-format
+msgid " Organizational Unit: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:235
+#, fuzzy, c-format
+msgid " Locality: %s\n"
+msgstr "lokal %s"
+
+#: ../svnauth/svnauth.c:239
+#, c-format
+msgid " State or Province: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:244
+#, c-format
+msgid " Country: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:248
+#, c-format
+msgid " SHA1 Fingerprint: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:253
+#, c-format
+msgid " Valid as of: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:257
+#, c-format
+msgid " Valid until: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:341 ../svnauth/svnauth.c:358 ../svnauth/svnauth.c:385
+#, c-format
+msgid "Base64-encoded certificate: %s\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:352
+#, fuzzy, c-format
+msgid "serf error: %s"
+msgstr "strömningsfel"
+
+#: ../svnauth/svnauth.c:366
+#, fuzzy, c-format
+msgid "Certificate issuer:\n"
+msgstr "Filnamn för klientcertifikat: "
+
+#: ../svnauth/svnauth.c:373
+#, c-format
+msgid "Certificate subject:\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:380
+#, c-format
+msgid "Certificate validity:\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:406
+#, c-format
+msgid "Automatic certificate validity check failed because:\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:411
+#, fuzzy, c-format
+msgid " The certificate is not yet valid.\n"
+msgstr " - Certifikatet är inte giltigt ännu.\n"
+
+#: ../svnauth/svnauth.c:415
+#, fuzzy, c-format
+msgid " The certificate has expired.\n"
+msgstr " - Certifikatet har gått ut.\n"
+
+#: ../svnauth/svnauth.c:419
+#, fuzzy, c-format
+msgid " The certificate's Common Name (hostname) does not match the remote hostname.\n"
+msgstr " - Certifikatets värdnamn matchar inte.\n"
+
+#: ../svnauth/svnauth.c:424
+#, fuzzy, c-format
+msgid " The certificate issuer is unknown.\n"
+msgstr " - Det finns ett okänt fel på certifikatet.\n"
+
+#: ../svnauth/svnauth.c:428
+#, c-format
+msgid " Unknown verification failure.\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:459
+#, fuzzy, c-format
+msgid "Credential kind: %s\n"
+msgstr "Klientreferenser sparades inte"
+
+#: ../svnauth/svnauth.c:482
+#, fuzzy, c-format
+msgid "Password: %s\n"
+msgstr "Lösenord för \"%s\": "
+
+#: ../svnauth/svnauth.c:484
+#, c-format
+msgid "Password: [not shown]\n"
+msgstr ""
+
+#: ../svnauth/svnauth.c:490
+#, fuzzy, c-format
+msgid "Passphrase: %s\n"
+msgstr "Lösenordsfras för \"%s\": "
+
+#: ../svnauth/svnauth.c:493
+#, fuzzy, c-format
+msgid "Passphrase: [not shown]\n"
+msgstr "Lösenordsfras för \"%s\": "
+
+#: ../svnauth/svnauth.c:496
+#, fuzzy, c-format
+msgid "Password cache: %s\n"
+msgstr "Lösenord för \"%s\": "
+
+#: ../svnauth/svnauth.c:499
+#, fuzzy, c-format
+msgid "Username: %s\n"
+msgstr "Användarnamn: "
+
+#: ../svnauth/svnauth.c:664
+#, fuzzy
+msgid "Try 'svnauth help' for more info"
+msgstr "Skriv \"svnadmin help\" för mer information"
+
+#: ../svndumpfilter/svndumpfilter.c:78
#, c-format
msgid "Can't open stdio file"
msgstr "Kan inte öppna stdio-fil"
-#: ../svndumpfilter/svndumpfilter.c:406
+#: ../svndumpfilter/svndumpfilter.c:405
msgid "This is an empty revision for padding."
msgstr "Detta är en tom revision för att fylla ut."
-#: ../svndumpfilter/svndumpfilter.c:489
+#: ../svndumpfilter/svndumpfilter.c:488
#, c-format
msgid "Revision %ld committed as %ld.\n"
msgstr "Revision %ld arkiverad som %ld.\n"
-#: ../svndumpfilter/svndumpfilter.c:512
+#: ../svndumpfilter/svndumpfilter.c:511
#, c-format
msgid "Revision %ld skipped.\n"
msgstr "Revision %ld hoppades över.\n"
-#: ../svndumpfilter/svndumpfilter.c:606
+#: ../svndumpfilter/svndumpfilter.c:605
#, c-format
msgid "Invalid copy source path '%s'"
msgstr "Ogiltig sökväg som källa för kopiering \"%s\""
-#: ../svndumpfilter/svndumpfilter.c:663
+#: ../svndumpfilter/svndumpfilter.c:662
#, c-format
msgid "No valid copyfrom revision in filtered stream"
msgstr "Ingen giltig ursprungsrevision för kopiering i den filtrerade strömmen"
-#: ../svndumpfilter/svndumpfilter.c:788
+#: ../svndumpfilter/svndumpfilter.c:787
#, c-format
msgid "Missing merge source path '%s'; try with --skip-missing-merge-sources"
msgstr "Källsökvägen \"%s\" för sammanslagning saknas; försök med --skip-missing-merge-sources"
-#: ../svndumpfilter/svndumpfilter.c:810
+#: ../svndumpfilter/svndumpfilter.c:809
#, c-format
msgid "No valid revision range 'start' in filtered stream"
msgstr "Början av revisionsområdet finns inte i den filtrerade strömmen"
-#: ../svndumpfilter/svndumpfilter.c:817
+#: ../svndumpfilter/svndumpfilter.c:816
#, c-format
msgid "No valid revision range 'end' in filtered stream"
msgstr "Slutet av revisionsområdet finns inte i den filtrerade strömmen"
-#: ../svndumpfilter/svndumpfilter.c:863 ../svndumpfilter/svndumpfilter.c:894
+#: ../svndumpfilter/svndumpfilter.c:862 ../svndumpfilter/svndumpfilter.c:893
#, c-format
msgid "Delta property block detected, but deltas are not enabled for node '%s' in original revision %ld"
msgstr "Deltaegenskapsblock upptäcktes, men deltan är inte påslagna för noden \"%s\" i originalrevisionen %ld"
-#: ../svndumpfilter/svndumpfilter.c:1027
+#: ../svndumpfilter/svndumpfilter.c:1026
msgid "Do not display filtering statistics."
msgstr "Visa inte filtreringsstatistik."
-#: ../svndumpfilter/svndumpfilter.c:1029
+#: ../svndumpfilter/svndumpfilter.c:1028
msgid "Treat the path prefixes as file glob patterns."
msgstr "Behandla sökvägsprefix som skalmönster."
-#: ../svndumpfilter/svndumpfilter.c:1031
+#: ../svndumpfilter/svndumpfilter.c:1030
msgid "Remove revisions emptied by filtering."
msgstr ""
"Ta bort revisioner som har blivit tomma på grund\n"
" av filtrering."
-#: ../svndumpfilter/svndumpfilter.c:1033
+#: ../svndumpfilter/svndumpfilter.c:1032
msgid ""
"Remove all empty revisions found in dumpstream\n"
" except revision 0."
@@ -14008,21 +14371,21 @@ msgstr ""
"Ta bort alla tomma revisioner funna i dumpströmmen\n"
" utom revision 0."
-#: ../svndumpfilter/svndumpfilter.c:1036
+#: ../svndumpfilter/svndumpfilter.c:1035
msgid "Renumber revisions left after filtering."
msgstr ""
"Numrera om de revisioner som finns kvar efter\n"
" filtrering."
-#: ../svndumpfilter/svndumpfilter.c:1039
+#: ../svndumpfilter/svndumpfilter.c:1038
msgid "Skip missing merge sources."
msgstr "Hoppa över sammanslagningskällor som saknas."
-#: ../svndumpfilter/svndumpfilter.c:1041
+#: ../svndumpfilter/svndumpfilter.c:1040
msgid "Don't filter revision properties."
msgstr "Filtrera inte revisionsegenskaper."
-#: ../svndumpfilter/svndumpfilter.c:1043
+#: ../svndumpfilter/svndumpfilter.c:1042
msgid ""
"Read additional prefixes, one per line, from\n"
" file ARG."
@@ -14030,7 +14393,7 @@ msgstr ""
"Läs ytterligare prefix, ett per rad, från\n"
" filen ARG."
-#: ../svndumpfilter/svndumpfilter.c:1055
+#: ../svndumpfilter/svndumpfilter.c:1054
msgid ""
"Filter out nodes with given prefixes from dumpstream.\n"
"usage: svndumpfilter exclude PATH_PREFIX...\n"
@@ -14038,7 +14401,7 @@ msgstr ""
"Filtrera bort noder med angivna prefix från dumpströmmen.\n"
"användning: svndumpfilter exclude SÖKVÄGS_PREFIX...\n"
-#: ../svndumpfilter/svndumpfilter.c:1064
+#: ../svndumpfilter/svndumpfilter.c:1063
msgid ""
"Filter out nodes without given prefixes from dumpstream.\n"
"usage: svndumpfilter include PATH_PREFIX...\n"
@@ -14046,7 +14409,7 @@ msgstr ""
"Filtrera bort noder utan angivna prefix från dumpströmmen.\n"
"användning: svndumpfilter include SÖKVÄGS_PREFIX...\n"
-#: ../svndumpfilter/svndumpfilter.c:1073
+#: ../svndumpfilter/svndumpfilter.c:1072
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: svndumpfilter help [SUBCOMMAND...]\n"
@@ -14054,7 +14417,7 @@ msgstr ""
"Visa hur detta program eller dess underkommandon används.\n"
"användning: svndumpfilter help [UNDERKOMMANDO...]\n"
-#: ../svndumpfilter/svndumpfilter.c:1149
+#: ../svndumpfilter/svndumpfilter.c:1148
msgid ""
"general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]\n"
"Type 'svndumpfilter help <subcommand>' for help on a specific subcommand.\n"
@@ -14069,47 +14432,47 @@ msgstr ""
"\n"
"Tillgängliga underkommandon:\n"
-#: ../svndumpfilter/svndumpfilter.c:1207
+#: ../svndumpfilter/svndumpfilter.c:1206
#, c-format
msgid "Excluding (and dropping empty revisions for) prefix patterns:\n"
msgstr "Utesluter (och tar bort tomma revisioner för) prefixmönster:\n"
-#: ../svndumpfilter/svndumpfilter.c:1209
+#: ../svndumpfilter/svndumpfilter.c:1208
#, c-format
msgid "Excluding prefix patterns:\n"
msgstr "Utesluter prefixmönster:\n"
-#: ../svndumpfilter/svndumpfilter.c:1212
+#: ../svndumpfilter/svndumpfilter.c:1211
#, c-format
msgid "Including (and dropping empty revisions for) prefix patterns:\n"
msgstr "Tar med (och tar bort tomma revisioner för) prefixmönster:\n"
-#: ../svndumpfilter/svndumpfilter.c:1214
+#: ../svndumpfilter/svndumpfilter.c:1213
#, c-format
msgid "Including prefix patterns:\n"
msgstr "Tar med prefixmönster:\n"
-#: ../svndumpfilter/svndumpfilter.c:1222
+#: ../svndumpfilter/svndumpfilter.c:1221
#, c-format
msgid "Excluding (and dropping empty revisions for) prefixes:\n"
msgstr "Utesluter (och tar bort tomma revisioner för) prefix:\n"
-#: ../svndumpfilter/svndumpfilter.c:1224
+#: ../svndumpfilter/svndumpfilter.c:1223
#, c-format
msgid "Excluding prefixes:\n"
msgstr "Utesluter prefix:\n"
-#: ../svndumpfilter/svndumpfilter.c:1227
+#: ../svndumpfilter/svndumpfilter.c:1226
#, c-format
msgid "Including (and dropping empty revisions for) prefixes:\n"
msgstr "Tar med (och tar bort tomma revisioner för) prefix:\n"
-#: ../svndumpfilter/svndumpfilter.c:1229
+#: ../svndumpfilter/svndumpfilter.c:1228
#, c-format
msgid "Including prefixes:\n"
msgstr "Tar med prefix:\n"
-#: ../svndumpfilter/svndumpfilter.c:1257
+#: ../svndumpfilter/svndumpfilter.c:1256
#, c-format
msgid ""
"Dropped %d revision.\n"
@@ -14124,27 +14487,27 @@ msgstr[1] ""
"Hoppade över %d revisioner.\n"
"\n"
-#: ../svndumpfilter/svndumpfilter.c:1265
+#: ../svndumpfilter/svndumpfilter.c:1264
msgid "Revisions renumbered as follows:\n"
msgstr "Revisionerna har numrerats om enligt följande:\n"
-#: ../svndumpfilter/svndumpfilter.c:1293
+#: ../svndumpfilter/svndumpfilter.c:1292
#, c-format
msgid " %ld => (dropped)\n"
msgstr " %ld => (borttagen)\n"
-#: ../svndumpfilter/svndumpfilter.c:1308
+#: ../svndumpfilter/svndumpfilter.c:1307
#, c-format
msgid "Dropped %d node:\n"
msgid_plural "Dropped %d nodes:\n"
msgstr[0] "Tog bort %d noder:\n"
msgstr[1] "Tog bort %d noder:\n"
-#: ../svndumpfilter/svndumpfilter.c:1477
+#: ../svndumpfilter/svndumpfilter.c:1476
msgid "--drop-empty-revs cannot be used with --drop-all-empty-revs"
msgstr "--drop-empty-revs kan inte användas tillsammans med --drop-all-empty-revs"
-#: ../svndumpfilter/svndumpfilter.c:1597
+#: ../svndumpfilter/svndumpfilter.c:1596
#, c-format
msgid ""
"\n"
@@ -14153,7 +14516,7 @@ msgstr ""
"\n"
"Fel: inga prefix angivna.\n"
-#: ../svndumpfilter/svndumpfilter.c:1628
+#: ../svndumpfilter/svndumpfilter.c:1627
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14162,53 +14525,53 @@ msgstr ""
"Underkommandot \"%s\" tillåter inte flaggan \"%s\"\n"
"Skriv \"svndumpfilter help %s\" för användning.\n"
-#: ../svndumpfilter/svndumpfilter.c:1646
+#: ../svndumpfilter/svndumpfilter.c:1645
msgid "Try 'svndumpfilter help' for more info"
msgstr "Skriv \"svndumpfilter help\" för med information"
-#: ../svnlook/svnlook.c:117
+#: ../svnlook/svnlook.c:116
msgid "show details for copies"
msgstr "visa detaljer för kopior"
-#: ../svnlook/svnlook.c:120
+#: ../svnlook/svnlook.c:119
msgid "print differences against the copy source"
msgstr "visa skillnad gentemot kopians ursprung"
-#: ../svnlook/svnlook.c:123
+#: ../svnlook/svnlook.c:122
msgid "show full paths instead of indenting them"
msgstr "visa fullständiga sökvägar istället för indrag"
-#: ../svnlook/svnlook.c:129
+#: ../svnlook/svnlook.c:128
msgid "maximum number of history entries"
msgstr "maximalt antal historikposter"
-#: ../svnlook/svnlook.c:147
+#: ../svnlook/svnlook.c:146
msgid "operate on single directory only"
msgstr "arbeta endast med en katalog"
-#: ../svnlook/svnlook.c:150
+#: ../svnlook/svnlook.c:149
msgid "specify revision number ARG"
msgstr "ange revisionsnummer ARG"
-#: ../svnlook/svnlook.c:153
+#: ../svnlook/svnlook.c:152
msgid "operate on a revision property (use with -r or -t)"
msgstr ""
"arbeta med en revisionsegenskap (används med\n"
" -r eller -t)"
-#: ../svnlook/svnlook.c:156
+#: ../svnlook/svnlook.c:155
msgid "show node revision ids for each path"
msgstr "visa nodrevisions-ID:n för varje sökväg"
-#: ../svnlook/svnlook.c:159
+#: ../svnlook/svnlook.c:158
msgid "show path's inherited properties"
msgstr "visa sökvägens ärvda egenskaper"
-#: ../svnlook/svnlook.c:165
+#: ../svnlook/svnlook.c:164
msgid "be verbose"
msgstr "var utförlig"
-#: ../svnlook/svnlook.c:174
+#: ../svnlook/svnlook.c:173
msgid ""
"Specify differencing options for external diff or\n"
" internal diff. Default: '-u'. Options are\n"
@@ -14229,10 +14592,17 @@ msgstr ""
" ändringar av mängden tomrum\n"
" -w, --ignore-all-space: Bortse från allt tomrum\n"
" --ignore-eol-style: Bortse från ändringar av\n"
-" radbrytningstecken\n"
+" radslutstecken\n"
" -p, --show-c-function: Visa funktionsnamn i C"
-#: ../svnlook/svnlook.c:205
+#: ../svnlook/svnlook.c:192 ../svnrdump/svnrdump.c:122
+#: ../svnserve/svnserve.c:290 ../svnversion/svnversion.c:142
+msgid "no progress (only errors) to stderr"
+msgstr ""
+"ingen förloppsinformation (endast fel) till\n"
+" standard fel"
+
+#: ../svnlook/svnlook.c:204
msgid ""
"usage: svnlook author REPOS_PATH\n"
"\n"
@@ -14242,7 +14612,7 @@ msgstr ""
"\n"
"Visa författaren.\n"
-#: ../svnlook/svnlook.c:210
+#: ../svnlook/svnlook.c:209
msgid ""
"usage: svnlook cat REPOS_PATH FILE_PATH\n"
"\n"
@@ -14252,7 +14622,7 @@ msgstr ""
"\n"
"Visa innehållet i en fil. Inledande \"/\" är valfritt för FIL_SÖKVÄG.\n"
-#: ../svnlook/svnlook.c:215
+#: ../svnlook/svnlook.c:214
msgid ""
"usage: svnlook changed REPOS_PATH\n"
"\n"
@@ -14262,7 +14632,7 @@ msgstr ""
"\n"
"Visa vilka sökvägar som har ändrats.\n"
-#: ../svnlook/svnlook.c:220
+#: ../svnlook/svnlook.c:219
msgid ""
"usage: svnlook date REPOS_PATH\n"
"\n"
@@ -14272,7 +14642,7 @@ msgstr ""
"\n"
"Visa datumstämpel.\n"
-#: ../svnlook/svnlook.c:225
+#: ../svnlook/svnlook.c:224
msgid ""
"usage: svnlook diff REPOS_PATH\n"
"\n"
@@ -14282,7 +14652,7 @@ msgstr ""
"\n"
"Visa diffar i GNU-stil för ändrade filer och egenskaper.\n"
-#: ../svnlook/svnlook.c:232
+#: ../svnlook/svnlook.c:231
msgid ""
"usage: svnlook dirs-changed REPOS_PATH\n"
"\n"
@@ -14294,7 +14664,7 @@ msgstr ""
"Visa kataloger som själva har ändrats (egenskapsändringar) eller vars\n"
"barnfiler har ändrats.\n"
-#: ../svnlook/svnlook.c:238
+#: ../svnlook/svnlook.c:237
msgid ""
"usage: svnlook filesize REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -14306,7 +14676,7 @@ msgstr ""
"Visa storleken (i byte) av filen i SÖKVÄG_I_ARKIV sådan den representeras\n"
"i arkivet.\n"
-#: ../svnlook/svnlook.c:244
+#: ../svnlook/svnlook.c:243
msgid ""
"usage: svnlook help [SUBCOMMAND...]\n"
"\n"
@@ -14316,7 +14686,7 @@ msgstr ""
"\n"
"Beskriv användningen av detta program eller dess underkommandon.\n"
-#: ../svnlook/svnlook.c:249
+#: ../svnlook/svnlook.c:248
msgid ""
"usage: svnlook history REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -14328,7 +14698,7 @@ msgstr ""
"Visa information om historiken för en sökväg i arkivet (eller rotkatalogen\n"
"om ingen sökväg anges).\n"
-#: ../svnlook/svnlook.c:255
+#: ../svnlook/svnlook.c:254
msgid ""
"usage: svnlook info REPOS_PATH\n"
"\n"
@@ -14339,7 +14709,7 @@ msgstr ""
"Visa författaren, datumstämpeln, loggmeddelandets storlek samt\n"
"själva loggmeddelandet.\n"
-#: ../svnlook/svnlook.c:260
+#: ../svnlook/svnlook.c:259
msgid ""
"usage: svnlook lock REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -14349,7 +14719,7 @@ msgstr ""
"\n"
"Om ett lås finns på en sökväg i arkivet, visa information om det.\n"
-#: ../svnlook/svnlook.c:265
+#: ../svnlook/svnlook.c:264
msgid ""
"usage: svnlook log REPOS_PATH\n"
"\n"
@@ -14359,7 +14729,7 @@ msgstr ""
"\n"
"Visa loggmeddelandet.\n"
-#: ../svnlook/svnlook.c:270
+#: ../svnlook/svnlook.c:269
msgid ""
"usage: 1. svnlook propget REPOS_PATH PROPNAME PATH_IN_REPOS\n"
" 2. svnlook propget --revprop REPOS_PATH PROPNAME\n"
@@ -14374,7 +14744,7 @@ msgstr ""
"Skriv ut det råa värdet för en egenskap på en sökväg i arkivet.\n"
"Om --revprop används, skriv ut det råa värdet på en revisionsegenskap.\n"
-#: ../svnlook/svnlook.c:279
+#: ../svnlook/svnlook.c:278
msgid ""
"usage: 1. svnlook proplist REPOS_PATH PATH_IN_REPOS\n"
" 2. svnlook proplist --revprop REPOS_PATH\n"
@@ -14387,9 +14757,9 @@ msgstr ""
" 2. svnlook proplist --revprop ARKIVSÖKVÄG\n"
"\n"
"Lista egenskaperna för en sökväg i arkivet eller, om --revprop anges,\n"
-"visa revisionsegenskaper. -v visar även egenskapernas värden.\n"
+"visa revisionsegenskaper. Med -v visas även egenskapernas värden.\n"
-#: ../svnlook/svnlook.c:290
+#: ../svnlook/svnlook.c:289
msgid ""
"usage: svnlook tree REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -14401,7 +14771,7 @@ msgstr ""
"Visa trädet, med början i SÖKVÄG_I_ARKIV (om den anges, annars används trädets\n"
"rot). Visa även nodrevisions-ID:n om så önskas.\n"
-#: ../svnlook/svnlook.c:296
+#: ../svnlook/svnlook.c:295
msgid ""
"usage: svnlook uuid REPOS_PATH\n"
"\n"
@@ -14411,7 +14781,7 @@ msgstr ""
"\n"
"Visa arkivets UUID.\n"
-#: ../svnlook/svnlook.c:301
+#: ../svnlook/svnlook.c:300
msgid ""
"usage: svnlook youngest REPOS_PATH\n"
"\n"
@@ -14421,28 +14791,28 @@ msgstr ""
"\n"
"Visa det yngsta revisionsnumret.\n"
-#: ../svnlook/svnlook.c:861
+#: ../svnlook/svnlook.c:860
#, c-format
msgid "Copied: %s (from rev %ld, %s)\n"
msgstr "Kopierad: %s (från revision %ld, %s)\n"
-#: ../svnlook/svnlook.c:929
+#: ../svnlook/svnlook.c:928
msgid "Added"
msgstr "Tillagd"
-#: ../svnlook/svnlook.c:930
+#: ../svnlook/svnlook.c:929
msgid "Deleted"
msgstr "Raderad"
-#: ../svnlook/svnlook.c:931
+#: ../svnlook/svnlook.c:930
msgid "Modified"
msgstr "Ändrad"
-#: ../svnlook/svnlook.c:932
+#: ../svnlook/svnlook.c:931
msgid "Index"
msgstr "Index"
-#: ../svnlook/svnlook.c:943
+#: ../svnlook/svnlook.c:942
msgid ""
"(Binary files differ)\n"
"\n"
@@ -14450,30 +14820,30 @@ msgstr ""
"(Binära filer skiljer sig åt)\n"
"\n"
-#: ../svnlook/svnlook.c:1222
+#: ../svnlook/svnlook.c:1221
msgid "unknown"
msgstr "okänd"
-#: ../svnlook/svnlook.c:1279
+#: ../svnlook/svnlook.c:1278
#, c-format
msgid "Transaction '%s' is not based on a revision; how odd"
msgstr "Transaktionen \"%s\" är inte baserad på en revision; skumt"
-#: ../svnlook/svnlook.c:1422
+#: ../svnlook/svnlook.c:1421
#, c-format
msgid "'%s' is a URL, probably should be a path"
msgstr "\"%s\" är en URL; ska troligen vara en sökväg"
-#: ../svnlook/svnlook.c:1445 ../svnlook/svnlook.c:1468
+#: ../svnlook/svnlook.c:1444 ../svnlook/svnlook.c:1467
#, c-format
msgid "Path '%s' is not a file"
msgstr "Sökvägen \"%s\" är inte en fil"
-#: ../svnlook/svnlook.c:1604
+#: ../svnlook/svnlook.c:1603
msgid "History item limit reached"
msgstr "Gräns nådd för element i historiken"
-#: ../svnlook/svnlook.c:1623
+#: ../svnlook/svnlook.c:1622
#, c-format
msgid ""
"REVISION PATH <ID>\n"
@@ -14482,7 +14852,7 @@ msgstr ""
"REVISION SÖKVÄG <ID>\n"
"-------- -----------\n"
-#: ../svnlook/svnlook.c:1628
+#: ../svnlook/svnlook.c:1627
#, c-format
msgid ""
"REVISION PATH\n"
@@ -14491,36 +14861,36 @@ msgstr ""
"REVISION SÖKVÄG\n"
"-------- ------\n"
-#: ../svnlook/svnlook.c:1700
+#: ../svnlook/svnlook.c:1699
#, c-format
msgid "Property '%s' not found on revision %ld"
msgstr "Egenskapen \"%s\" finns inte för revision %ld"
-#: ../svnlook/svnlook.c:1709
+#: ../svnlook/svnlook.c:1708
#, c-format
msgid "Property '%s' not found on path '%s' or inherited from a parent in revision %ld"
msgstr "Egenskapen \"%s\" finns inte på sökvägen \"%s\" eller ärvd från en förälder i revision %ld"
-#: ../svnlook/svnlook.c:1715
+#: ../svnlook/svnlook.c:1714
#, c-format
msgid "Property '%s' not found on path '%s' in revision %ld"
msgstr "Egenskapen \"%s\" finns inte på sökvägen \"%s\" i revision %ld"
-#: ../svnlook/svnlook.c:1723
+#: ../svnlook/svnlook.c:1722
#, c-format
msgid "Property '%s' not found on path '%s' or inherited from a parent in transaction %s"
msgstr "Egenskapen \"%s\" finns inte på sökvägen \"%s\" eller ärvd från en förälder i transaktion %s"
-#: ../svnlook/svnlook.c:1729
+#: ../svnlook/svnlook.c:1728
#, c-format
msgid "Property '%s' not found on path '%s' in transaction %s"
msgstr "Egenskapen \"%s\" finns inte på sökvägen \"%s\" i transaktion %s"
-#: ../svnlook/svnlook.c:2064
+#: ../svnlook/svnlook.c:2063
msgid "Missing repository path argument"
msgstr "Arkivargument saknas"
-#: ../svnlook/svnlook.c:2216
+#: ../svnlook/svnlook.c:2215
msgid ""
"general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
"Note: any subcommand which takes the '--revision' and '--transaction'\n"
@@ -14540,7 +14910,7 @@ msgstr ""
"\n"
"Tillgängliga underkommandon:\n"
-#: ../svnlook/svnlook.c:2294
+#: ../svnlook/svnlook.c:2293
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -14555,48 +14925,48 @@ msgstr[1] ""
"Kommentar (%i rader):\n"
"%s\n"
-#: ../svnlook/svnlook.c:2346
+#: ../svnlook/svnlook.c:2345
#, c-format
msgid "Missing propname argument"
msgstr "Egenskapsargument saknas"
-#: ../svnlook/svnlook.c:2347
+#: ../svnlook/svnlook.c:2346
#, c-format
msgid "Missing propname and repository path arguments"
msgstr "Egenskapsnamns- och arkivsökvägsargument saknas"
-#: ../svnlook/svnlook.c:2353
+#: ../svnlook/svnlook.c:2352
msgid "Missing propname or repository path argument"
msgstr "Egenskapsnamns- eller arkivsökvägsargument saknas"
-#: ../svnlook/svnlook.c:2517
+#: ../svnlook/svnlook.c:2516
msgid "Invalid revision number supplied"
msgstr "Ogiltigt revisionsnummer angivet"
-#: ../svnlook/svnlook.c:2629
+#: ../svnlook/svnlook.c:2628
msgid "The '--transaction' (-t) and '--revision' (-r) arguments cannot co-exist"
msgstr "Flaggorna \"--transaction\" (-t) och \"--revision\" (-r) kan inte anges samtidigt"
-#: ../svnlook/svnlook.c:2636
+#: ../svnlook/svnlook.c:2635
msgid "Cannot use the '--show-inherited-props' option with the '--revprop' option"
msgstr "Kan inte använda flaggan \"--show-inherited-props\" tillsammans med \"--revprop\""
-#: ../svnlook/svnlook.c:2695
+#: ../svnlook/svnlook.c:2694
#, c-format
msgid "Try 'svnadmin verify' instead.\n"
msgstr "Försök med \"svnadmin verify\" istället.\n"
-#: ../svnlook/svnlook.c:2729
+#: ../svnlook/svnlook.c:2728
#, c-format
msgid "Repository argument required\n"
msgstr "Arkivargument krävs\n"
-#: ../svnlook/svnlook.c:2738
+#: ../svnlook/svnlook.c:2737
#, c-format
msgid "'%s' is a URL when it should be a path\n"
msgstr "\"%s\" är en URL när den skulle vara en sökväg\n"
-#: ../svnlook/svnlook.c:2790
+#: ../svnlook/svnlook.c:2789
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14605,11 +14975,11 @@ msgstr ""
"Underkommandot \"%s\" tillåter inte flaggan \"%s\"\n"
"Skriv \"svnlook help %s\" för användning.\n"
-#: ../svnlook/svnlook.c:2833
+#: ../svnlook/svnlook.c:2832
msgid "Try 'svnlook help' for more info"
msgstr "Skriv \"svnlook help\" för mer information"
-#: ../svnmucc/svnmucc.c:927
+#: ../svnmucc/svnmucc.c:926
msgid ""
"Subversion multiple URL command client\n"
"usage: svnmucc ACTION...\n"
@@ -14691,14 +15061,19 @@ msgstr ""
" använd \"-\" för att läsa från standard in)\n"
" --config-dir ARG : använd ARG för att ange inställningskatalogen\n"
" --config-option ARG : använd ARG för att ange en inställning\n"
-" --no-auth-cache : cacha inte autentiseringsinformation\n"
+" --no-auth-cache : spara inte autentiseringsinformation\n"
" --version : visa versionsinformation\n"
-#: ../svnmucc/svnmucc.c:1003
+#: ../svnmucc/svnmucc.c:1002
msgid "--message (-m), --file (-F), and --with-revprop=svn:log are mutually exclusive"
msgstr "--message (-m), --file (-F) och --with-revprop=svn:log kan inte användas samtidigt"
-#: ../svnrdump/load_editor.c:382 ../svnsync/svnsync.c:327
+#: ../svnmucc/svnmucc.c:1158
+#, fuzzy, c-format
+msgid "Invalid revision number '%s'"
+msgstr "Ogiltigt revisionsnummer \"%ld\""
+
+#: ../svnrdump/load_editor.c:382 ../svnsync/svnsync.c:326
#, c-format
msgid "Failed to get lock on destination repos, currently held by '%s'\n"
msgstr "Kunde inte låsa destinationsarkivet; det är för närvarande låst av \"%s\"\n"
@@ -14745,8 +15120,8 @@ msgstr ""
msgid "dump incrementally"
msgstr "dumpa inkrementellt"
-#: ../svnrdump/svnrdump.c:142 ../svnserve/svnserve.c:283
-#: ../svnversion/svnversion.c:139
+#: ../svnrdump/svnrdump.c:142 ../svnserve/svnserve.c:282
+#: ../svnversion/svnversion.c:138
msgid "display this help"
msgstr "visa denna hjälp"
@@ -14804,58 +15179,58 @@ msgstr "Kunde inte erhålla listan med SASL-mekanismer"
msgid "Couldn't obtain the authenticated username"
msgstr "Kan inte erhålla autentiserat användarnamn"
-#: ../svnserve/serve.c:2043
+#: ../svnserve/serve.c:2045
msgid "Path is not a string"
msgstr "Sökvägen är inte en sträng"
-#: ../svnserve/serve.c:2200
+#: ../svnserve/serve.c:2215
msgid "Log revprop entry not a string"
msgstr "Revisionsegenskapsposten för loggning är ej en sträng"
-#: ../svnserve/serve.c:2206
+#: ../svnserve/serve.c:2221
#, c-format
msgid "Unknown revprop word '%s' in log command"
msgstr "Okänt revisionsegenskapsord \"%s\" i log-kommandot"
-#: ../svnserve/serve.c:2222
+#: ../svnserve/serve.c:2237
msgid "Log path entry not a string"
msgstr "Sökvägsposten för loggning är ej en sträng"
-#: ../svnserve/svnserve.c:162
+#: ../svnserve/svnserve.c:161
msgid "daemon mode"
msgstr "demonläge"
-#: ../svnserve/svnserve.c:163
+#: ../svnserve/svnserve.c:162
msgid "inetd mode"
msgstr "inetd-läge"
-#: ../svnserve/svnserve.c:164
+#: ../svnserve/svnserve.c:163
msgid "tunnel mode"
msgstr "tunnel-läge"
-#: ../svnserve/svnserve.c:165
+#: ../svnserve/svnserve.c:164
msgid "listen-once mode (useful for debugging)"
msgstr "engångslyssningsläge (användbart för felsökning)"
-#: ../svnserve/svnserve.c:168
+#: ../svnserve/svnserve.c:167
msgid "Windows service mode (Service Control Manager)"
msgstr "Windows-tjänst-läge (Tjänstehanteraren)"
-#: ../svnserve/svnserve.c:170
+#: ../svnserve/svnserve.c:169
msgid "root of directory to serve"
msgstr "serverns rotkatalog"
-#: ../svnserve/svnserve.c:172
+#: ../svnserve/svnserve.c:171
msgid "force read only, overriding repository config file"
msgstr ""
"tillåt endast läsning; överskuggar värdet i\n"
" arkivets konfigurationsfil"
-#: ../svnserve/svnserve.c:174
+#: ../svnserve/svnserve.c:173
msgid "read configuration from file ARG"
msgstr "läs konfiguration från filen ARG"
-#: ../svnserve/svnserve.c:177
+#: ../svnserve/svnserve.c:176
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, service, listen-once]"
@@ -14863,7 +15238,7 @@ msgstr ""
"port att lyssna på. Förvald är 3690.\n"
" [läge: demon, tjänst, engångslyssning]"
-#: ../svnserve/svnserve.c:181
+#: ../svnserve/svnserve.c:180
msgid ""
"listen port. The default port is 3690.\n"
" [mode: daemon, listen-once]"
@@ -14871,7 +15246,7 @@ msgstr ""
"port att lyssna på. Förvald är 3690.\n"
" [läge: demon, engångslyssning]"
-#: ../svnserve/svnserve.c:187
+#: ../svnserve/svnserve.c:186
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
@@ -14881,7 +15256,7 @@ msgstr ""
" Normalt lyssnar svnserve på alla adresser.\n"
" [läge: demon, tjänst, engångslyssning]"
-#: ../svnserve/svnserve.c:193
+#: ../svnserve/svnserve.c:192
msgid ""
"listen hostname or IP address\n"
" By default svnserve listens on all addresses.\n"
@@ -14891,7 +15266,7 @@ msgstr ""
" Normalt lyssnar svnserve på alla adresser.\n"
" [läge: demon, engångslyssning]"
-#: ../svnserve/svnserve.c:200
+#: ../svnserve/svnserve.c:199
msgid ""
"prefer IPv6 when resolving the listen hostname\n"
" [IPv4 is preferred by default. Using IPv4 and IPv6\n"
@@ -14904,7 +15279,7 @@ msgstr ""
" Använd inetd-läge eller tunnelläge om detta\n"
" behövs.]"
-#: ../svnserve/svnserve.c:208
+#: ../svnserve/svnserve.c:207
msgid ""
"compression level to use for network transmissions\n"
" [0 .. no compression, 5 .. default, \n"
@@ -14914,7 +15289,7 @@ msgstr ""
" [0: ingen kompression, 5: normalnivå,\n"
" 9: maximal kompression]"
-#: ../svnserve/svnserve.c:214
+#: ../svnserve/svnserve.c:213
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations.\n"
@@ -14923,12 +15298,12 @@ msgid ""
" [used for FSFS repositories only]"
msgstr ""
"storlek på extra cacheminne i MB som används\n"
-" för att reducera onödiga operation.\n"
+" för att reducera onödiga operationer.\n"
" Standardvärdet är 128 för trådläge och 16 för\n"
" icke-trådat läge.\n"
" [endast använt för FSFS-arkiv]"
-#: ../svnserve/svnserve.c:224
+#: ../svnserve/svnserve.c:223
msgid ""
"enable or disable caching of deltas between older\n"
" revisions.\n"
@@ -14940,7 +15315,7 @@ msgstr ""
" Normalvärdet är \"no\" (avstängt).\n"
" [endast använt för FSFS-arkiv]"
-#: ../svnserve/svnserve.c:232
+#: ../svnserve/svnserve.c:231
msgid ""
"enable or disable caching of file contents\n"
" Default is yes.\n"
@@ -14951,7 +15326,7 @@ msgstr ""
" Normalvärdet är \"yes\" (påslaget).\n"
" [endast använt för FSFS-arkiv]"
-#: ../svnserve/svnserve.c:238
+#: ../svnserve/svnserve.c:237
msgid ""
"enable or disable caching of revision properties.\n"
" Consult the documentation before activating this.\n"
@@ -14963,7 +15338,7 @@ msgstr ""
" Normalvärdet är \"no\" (avstängt).\n"
" [endast använt för FSFS-arkiv]"
-#: ../svnserve/svnserve.c:246
+#: ../svnserve/svnserve.c:245
msgid ""
"Optimize network handling based on the assumption\n"
" that most clients are connected with a bitrate of\n"
@@ -14977,13 +15352,13 @@ msgstr ""
#. ### Making the assumption here that WIN32 never has fork and so
#. * ### this option never exists when --service exists.
-#: ../svnserve/svnserve.c:256
+#: ../svnserve/svnserve.c:255
msgid "use threads instead of fork [mode: daemon]"
msgstr ""
"använd trådar istället för att skapa nya processer\n"
" [läge: demon]"
-#: ../svnserve/svnserve.c:260
+#: ../svnserve/svnserve.c:259
msgid ""
"run in foreground (useful for debugging)\n"
" [mode: daemon]"
@@ -14991,7 +15366,7 @@ msgstr ""
"kör i förgrunden (användbart för felsökning)\n"
" [läge: demon]"
-#: ../svnserve/svnserve.c:264
+#: ../svnserve/svnserve.c:263
msgid ""
"handle one connection at a time in the parent process\n"
" (useful for debugging)"
@@ -14999,11 +15374,11 @@ msgstr ""
"hantera en anslutning i taget i föräldraprocessen\n"
" (användbart för felsökning)"
-#: ../svnserve/svnserve.c:268
+#: ../svnserve/svnserve.c:267
msgid "svnserve log file"
msgstr "loggfil för svnserve"
-#: ../svnserve/svnserve.c:271
+#: ../svnserve/svnserve.c:270
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once, service]"
@@ -15011,7 +15386,7 @@ msgstr ""
"skriv serverprocessens process-ID till filen ARG\n"
" [läge: demon, engångslyssning, tjänst]"
-#: ../svnserve/svnserve.c:275
+#: ../svnserve/svnserve.c:274
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once]"
@@ -15019,7 +15394,7 @@ msgstr ""
"skriv serverprocessens process-ID till filen ARG\n"
" [läge: demon, engångslyssning]"
-#: ../svnserve/svnserve.c:280
+#: ../svnserve/svnserve.c:279
msgid ""
"tunnel username (default is current uid's name)\n"
" [mode: tunnel]"
@@ -15027,7 +15402,7 @@ msgstr ""
"användarnamn för tunnel (standard är aktuell\n"
" användares namn) [läge: tunnel]"
-#: ../svnserve/svnserve.c:285
+#: ../svnserve/svnserve.c:284
msgid ""
"virtual host mode (look for repo in directory\n"
" of provided hostname)"
@@ -15035,12 +15410,12 @@ msgstr ""
"virtuell värddator-läge (leta efter arkiv i\n"
" katalog med samma namn som använt värddatornamn)"
-#: ../svnserve/svnserve.c:302
+#: ../svnserve/svnserve.c:301
#, c-format
msgid "Type '%s --help' for usage.\n"
msgstr "Skriv \"%s --help\" för användning.\n"
-#: ../svnserve/svnserve.c:312
+#: ../svnserve/svnserve.c:311
msgid ""
"usage: svnserve [-d | -i | -t | -X | --service] [options]\n"
"\n"
@@ -15050,7 +15425,7 @@ msgstr ""
"\n"
"Giltiga flaggor:\n"
-#: ../svnserve/svnserve.c:318
+#: ../svnserve/svnserve.c:317
msgid ""
"usage: svnserve [-d | -i | -t | -X] [options]\n"
"\n"
@@ -15060,7 +15435,7 @@ msgstr ""
"\n"
"Giltiga flaggor:\n"
-#: ../svnserve/svnserve.c:346
+#: ../svnserve/svnserve.c:345
msgid ""
"\n"
"Cyrus SASL authentication is available.\n"
@@ -15068,74 +15443,74 @@ msgstr ""
"\n"
"Cyrus-SASL-autentisering finns tillgänglig.\n"
-#: ../svnserve/svnserve.c:618
+#: ../svnserve/svnserve.c:616
#, c-format
msgid "Invalid port '%s'"
msgstr "Ogiltig port \"%s\""
-#: ../svnserve/svnserve.c:659
+#: ../svnserve/svnserve.c:657
#, c-format
msgid "svnserve: Root path '%s' does not exist or is not a directory.\n"
msgstr "svnserve: Rotsökvägen \"%s\" finns inte eller är ingen katalog.\n"
-#: ../svnserve/svnserve.c:772
+#: ../svnserve/svnserve.c:770
msgid "You must specify exactly one of -d, -i, -t, --service or -X.\n"
msgstr "Du måste ange precis en av -d, -i, -t, --service eller -X.\n"
-#: ../svnserve/svnserve.c:775
+#: ../svnserve/svnserve.c:773
msgid "You must specify exactly one of -d, -i, -t or -X.\n"
msgstr "Du måste ange precis en av -d, -i, -t eller -X.\n"
-#: ../svnserve/svnserve.c:784
+#: ../svnserve/svnserve.c:782
msgid "You may only specify one of -T or --single-thread\n"
msgstr "Du kan bara ange en av -T eller --single-thread\n"
-#: ../svnserve/svnserve.c:812
+#: ../svnserve/svnserve.c:810
#, c-format
msgid "Option --tunnel-user is only valid in tunnel mode.\n"
msgstr "Flaggan --tunnel-user är endast giltig i tunnel-läge.\n"
-#: ../svnserve/svnserve.c:831
+#: ../svnserve/svnserve.c:829
#, c-format
msgid "Can't open stdout"
msgstr "Kan inte öppna standard ut"
-#: ../svnserve/svnserve.c:885
+#: ../svnserve/svnserve.c:883
#, c-format
msgid "svnserve: The --service flag is only valid if the process is started by the Service Control Manager.\n"
msgstr "svnserve: Flaggan --service är endast tillåten om processen startas av tjänstehanteraren (SCM).\n"
-#: ../svnserve/svnserve.c:935
+#: ../svnserve/svnserve.c:933
#, c-format
msgid "Can't get address info"
msgstr "Kan inte erhålla adressinfo"
-#: ../svnserve/svnserve.c:949
+#: ../svnserve/svnserve.c:947
#, c-format
msgid "Can't create server socket"
msgstr "Kan inte skapa uttag (socket) för servern"
-#: ../svnserve/svnserve.c:960
+#: ../svnserve/svnserve.c:958
#, c-format
msgid "Can't bind server socket"
msgstr "Kan inte knyta adress till serveruttaget (socket)"
-#: ../svnserve/svnserve.c:1058
+#: ../svnserve/svnserve.c:1056
#, c-format
msgid "Can't accept client connection"
msgstr "Kan inte acceptera anslutning från klient"
-#: ../svnserve/svnserve.c:1139
+#: ../svnserve/svnserve.c:1137
#, c-format
msgid "Can't create threadattr"
msgstr "Kan inte skapa trådattribut"
-#: ../svnserve/svnserve.c:1147
+#: ../svnserve/svnserve.c:1145
#, c-format
msgid "Can't set detached state"
msgstr "Kan inte koppla loss tråd"
-#: ../svnserve/svnserve.c:1160
+#: ../svnserve/svnserve.c:1158
#, c-format
msgid "Can't create thread"
msgstr "Kan inte skapa tråd"
@@ -15160,7 +15535,7 @@ msgstr "Kunde inte ansluta till tjänstehanteraren (SCM)"
msgid "The service failed to start; an internal error occurred while starting the service"
msgstr "Tjänsten kunde inte starta; ett internt fel inträffade då tjänsten skulle startas"
-#: ../svnsync/svnsync.c:92
+#: ../svnsync/svnsync.c:91
msgid ""
"usage: svnsync initialize DEST_URL SOURCE_URL\n"
"\n"
@@ -15205,7 +15580,7 @@ msgstr ""
"bör destinationsarkivet vara en spegling av källarkivet som endast används\n"
"för läsning.\n"
-#: ../svnsync/svnsync.c:118
+#: ../svnsync/svnsync.c:117
msgid ""
"usage: svnsync synchronize DEST_URL [SOURCE_URL]\n"
"\n"
@@ -15228,7 +15603,7 @@ msgstr ""
"speciellt när icke betrodda användare eller förvaltare kan ha skrivande\n"
"Ã¥tkomst till arkivet DEST-URL.\n"
-#: ../svnsync/svnsync.c:131
+#: ../svnsync/svnsync.c:130
msgid ""
"usage:\n"
"\n"
@@ -15265,7 +15640,7 @@ msgstr ""
"speciellt när icke betrodda användare eller förvaltare kan ha skrivande\n"
"Ã¥tkomst till arkivet DEST-URL.\n"
-#: ../svnsync/svnsync.c:152
+#: ../svnsync/svnsync.c:151
msgid ""
"usage: svnsync info DEST_URL\n"
"\n"
@@ -15276,7 +15651,7 @@ msgstr ""
"\n"
"Visa information om destinationsarkivet för synkronisering i DEST-URL.\n"
-#: ../svnsync/svnsync.c:158
+#: ../svnsync/svnsync.c:157
msgid ""
"usage: svnsync help [SUBCOMMAND...]\n"
"\n"
@@ -15286,11 +15661,11 @@ msgstr ""
"\n"
"Visa hur detta program eller dess underkommandon används.\n"
-#: ../svnsync/svnsync.c:168
+#: ../svnsync/svnsync.c:167
msgid "print as little as possible"
msgstr "visa så lite information som möjligt"
-#: ../svnsync/svnsync.c:170
+#: ../svnsync/svnsync.c:169
msgid ""
"operate on revision ARG (or range ARG1:ARG2)\n"
" A revision argument can be one of:\n"
@@ -15302,11 +15677,11 @@ msgstr ""
" TAL revisionsnummer\n"
" \"HEAD\" senaste i arkivet"
-#: ../svnsync/svnsync.c:178
+#: ../svnsync/svnsync.c:177
msgid "allow a non-empty destination repository"
msgstr "tillåt ett icke-tomt destinationsarkiv"
-#: ../svnsync/svnsync.c:190
+#: ../svnsync/svnsync.c:189
msgid ""
"specify a username ARG (deprecated;\n"
" see --source-username and --sync-username)"
@@ -15314,7 +15689,7 @@ msgstr ""
"ange användarnamnet ARG (föråldrat;\n"
" se --source-username och --sync-username)"
-#: ../svnsync/svnsync.c:194
+#: ../svnsync/svnsync.c:193
msgid ""
"specify a password ARG (deprecated;\n"
" see --source-password and --sync-password)"
@@ -15322,25 +15697,25 @@ msgstr ""
"ange lösenordet ARG (föråldrat;\n"
" se --source-password and --sync-password)"
-#: ../svnsync/svnsync.c:204
+#: ../svnsync/svnsync.c:203
msgid "connect to source repository with username ARG"
msgstr "anslut till källarkivet med användarnamn ARG"
-#: ../svnsync/svnsync.c:206
+#: ../svnsync/svnsync.c:205
msgid "connect to source repository with password ARG"
msgstr "anslut till källarkivet med lösenord ARG"
-#: ../svnsync/svnsync.c:208
+#: ../svnsync/svnsync.c:207
msgid "connect to sync repository with username ARG"
msgstr ""
"anslut till synkroniseringsarkiv med\n"
" användarnamn ARG"
-#: ../svnsync/svnsync.c:210
+#: ../svnsync/svnsync.c:209
msgid "connect to sync repository with password ARG"
msgstr "anslut till synkroniseringsarkiv med lösenord ARG"
-#: ../svnsync/svnsync.c:222
+#: ../svnsync/svnsync.c:221
msgid ""
"convert translatable properties from encoding ARG\n"
" to UTF-8. If not specified, then properties are\n"
@@ -15350,18 +15725,18 @@ msgstr ""
" kodning ARG till UTF-8. Om ej angiven antas\n"
" egenskaper vara kodade i UTF-8."
-#: ../svnsync/svnsync.c:228
+#: ../svnsync/svnsync.c:227
msgid ""
"Disable built-in locking. Use of this option can\n"
" corrupt the mirror unless you ensure that no other\n"
" instance of svnsync is running concurrently."
msgstr ""
"Stäng av inbyggd låsning. Användning av denna\n"
-" flagga kan förstöra arkivspegeln om inte är\n"
+" flagga kan förstöra arkivspegeln om det inte är\n"
" säkert att ingen annan körning av svnsync sker\n"
" samtidigt."
-#: ../svnsync/svnsync.c:234
+#: ../svnsync/svnsync.c:233
msgid ""
"Steal locks as necessary. Use, with caution,\n"
" if your mirror repository contains stale locks\n"
@@ -15372,120 +15747,120 @@ msgstr ""
" om spegelarkivet innehåller utgångna lås och\n"
" ingen annan körning av svnsync sker samtidigt."
-#: ../svnsync/svnsync.c:357
+#: ../svnsync/svnsync.c:356
msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program"
msgstr "Målservern stöder inte atomisk ändring av revisionsegenskaper; uppgradera den till 1.7 eller använd ett externt låsprogram."
-#: ../svnsync/svnsync.c:371
+#: ../svnsync/svnsync.c:370
#, c-format
msgid "Stole lock previously held by '%s'\n"
msgstr "Stal lås som tidigare ägdes av \"%s\"\n"
-#: ../svnsync/svnsync.c:460
+#: ../svnsync/svnsync.c:459
#, c-format
msgid "Session is rooted at '%s' but the repos root is '%s'"
msgstr "Sessionens rot är \"%s\", men arkivets rot är \"%s\""
-#: ../svnsync/svnsync.c:602
+#: ../svnsync/svnsync.c:601
#, c-format
msgid "Copied properties for revision %ld (%s* properties skipped).\n"
msgstr "Kopierade egenskaper för revision %ld (%s*-egenskaper hoppades över).\n"
-#: ../svnsync/svnsync.c:607
+#: ../svnsync/svnsync.c:606
#, c-format
msgid "Copied properties for revision %ld.\n"
msgstr "Kopierade egenskaper för revision %ld.\n"
-#: ../svnsync/svnsync.c:623
+#: ../svnsync/svnsync.c:622
#, c-format
msgid "NOTE: Normalized %s* properties to LF line endings (%d rev-props, %d node-props).\n"
msgstr "ANMÄRKNING: %s*-egenskaper normaliserade till LF-radslut (%d revisionsegenskaper, %d nodegenskaper).\n"
-#: ../svnsync/svnsync.c:753
+#: ../svnsync/svnsync.c:752
msgid "Destination repository already contains revision history; consider using --allow-non-empty if the repository's revisions are known to mirror their respective revisions in the source repository"
msgstr "Destinationsarkivet innehåller redan en revisionshistorik; använd --allow-non-empty om det är känt att arkivets revisioner motsvarar dem i källarkivet"
-#: ../svnsync/svnsync.c:762
+#: ../svnsync/svnsync.c:761
#, c-format
msgid "Destination repository is already synchronizing from '%s'"
msgstr "Destinationsarkivet synkroniseras redan från \"%s\""
-#: ../svnsync/svnsync.c:797
+#: ../svnsync/svnsync.c:796
msgid "Destination repository has more revisions than source repository"
msgstr "Destinationsarkivet har fler revisioner än källarkivet"
-#: ../svnsync/svnsync.c:862 ../svnsync/svnsync.c:865 ../svnsync/svnsync.c:1518
-#: ../svnsync/svnsync.c:1525 ../svnsync/svnsync.c:1762
-#: ../svnsync/svnsync.c:1765 ../svnsync/svnsync.c:1809
+#: ../svnsync/svnsync.c:861 ../svnsync/svnsync.c:864 ../svnsync/svnsync.c:1517
+#: ../svnsync/svnsync.c:1524 ../svnsync/svnsync.c:1761
+#: ../svnsync/svnsync.c:1764 ../svnsync/svnsync.c:1808
#, c-format
msgid "Path '%s' is not a URL"
msgstr "Sökvägen \"%s\" är inte en URL"
-#: ../svnsync/svnsync.c:892
+#: ../svnsync/svnsync.c:891
#, c-format
msgid "Committed revision %ld.\n"
msgstr "Arkiverade revision %ld.\n"
-#: ../svnsync/svnsync.c:935
+#: ../svnsync/svnsync.c:934
msgid "Destination repository has not been initialized"
msgstr "Destinationsarkivet har ej initierats"
-#: ../svnsync/svnsync.c:1301
+#: ../svnsync/svnsync.c:1300
#, c-format
-msgid "Commit created r%ld but should have created r%ld"
-msgstr "Arkiveringen skapade r%ld, men den borde ha skapat r%ld"
+msgid "Commit created rev %ld but should have created %ld"
+msgstr "Arkiveringen skapade revision %ld, men den borde ha skapat %ld"
-#: ../svnsync/svnsync.c:1416
+#: ../svnsync/svnsync.c:1415
#, c-format
msgid "Revision being currently copied (%ld), last merged revision (%ld), and destination HEAD (%ld) are inconsistent; have you committed to the destination without using svnsync?"
msgstr "Revisionen som nu kopieras (%ld), senaste sammanslagna revisionen (%ld) och målets HEAD (%ld) är inkonsistenta. Har du arkiverat till destinationen utan att använda svnsync?"
-#: ../svnsync/svnsync.c:1453
+#: ../svnsync/svnsync.c:1452
#, c-format
msgid "Destination HEAD (%ld) is not the last merged revision (%ld); have you committed to the destination without using svnsync?"
msgstr "HEAD i målarkivet (%ld) är inte den senaste sammanslagna revisionen (%ld). Har du arkiverat till destinationen utan att använda svnsync?"
-#: ../svnsync/svnsync.c:1576 ../svnsync/svnsync.c:1581
+#: ../svnsync/svnsync.c:1575 ../svnsync/svnsync.c:1580
#, c-format
msgid "Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
msgstr "Kan inte kopiera revisionsegenskaper för en revision (%ld) som ej har synkroniserats"
-#: ../svnsync/svnsync.c:1645 ../svnsync/svnsync.c:1665
+#: ../svnsync/svnsync.c:1644 ../svnsync/svnsync.c:1664
#, c-format
msgid "Invalid revision number (%ld)"
msgstr "Ogiltigt revisionsnummer (%ld)"
-#: ../svnsync/svnsync.c:1715
+#: ../svnsync/svnsync.c:1714
msgid "Cannot specify revisions via both command-line arguments and the --revision (-r) option"
msgstr "Kan inte ange revisioner både som kommandoradsargument och med flaggan --revision (-r)"
-#: ../svnsync/svnsync.c:1723 ../svnsync/svnsync.c:2066
+#: ../svnsync/svnsync.c:1722 ../svnsync/svnsync.c:2065
#, c-format
msgid "Invalid revision range '%s' provided"
msgstr "Ogiltigt revisionsområde \"%s\" angivet"
-#: ../svnsync/svnsync.c:1822
+#: ../svnsync/svnsync.c:1821
#, c-format
msgid "Repository '%s' is not initialized for synchronization"
msgstr "Arkivet \"%s\" har inte initierats för synkronisering"
#. Print the info.
-#: ../svnsync/svnsync.c:1828
+#: ../svnsync/svnsync.c:1827
#, c-format
msgid "Source URL: %s\n"
msgstr "Käll-URL: %s\n"
-#: ../svnsync/svnsync.c:1830
+#: ../svnsync/svnsync.c:1829
#, c-format
msgid "Source Repository UUID: %s\n"
msgstr "Källarkivets UUID: %s\n"
-#: ../svnsync/svnsync.c:1833
+#: ../svnsync/svnsync.c:1832
#, c-format
msgid "Last Merged Revision: %s\n"
msgstr "Senast sammanslagen revision: %s\n"
-#: ../svnsync/svnsync.c:1850
+#: ../svnsync/svnsync.c:1849
msgid ""
"general usage: svnsync SUBCOMMAND DEST_URL [ARGS & OPTIONS ...]\n"
"Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
@@ -15499,15 +15874,15 @@ msgstr ""
"\n"
"Tillgängliga underkommandon:\n"
-#: ../svnsync/svnsync.c:2114
+#: ../svnsync/svnsync.c:2113
msgid "Cannot use --username or --password with any of --source-username, --source-password, --sync-username, or --sync-password.\n"
msgstr "Kan inte använda --username eller --password tillsammans med någon av flaggorna --source-username, --source-password, --sync-username eller --sync-password.\n"
-#: ../svnsync/svnsync.c:2138
+#: ../svnsync/svnsync.c:2137
msgid "--disable-locking and --steal-lock are mutually exclusive"
msgstr "--disable-locking och --steal-lock kan inte användas samtidigt"
-#: ../svnsync/svnsync.c:2214
+#: ../svnsync/svnsync.c:2213
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -15516,16 +15891,16 @@ msgstr ""
"Underkommandot \"%s\" tillåter inte flaggan \"%s\"\n"
"Skriv \"svnsync help %s\" för användning.\n"
-#: ../svnsync/svnsync.c:2297
+#: ../svnsync/svnsync.c:2296
msgid "Try 'svnsync help' for more info"
msgstr "Skriv \"svnsync help\" för mer information"
-#: ../svnversion/svnversion.c:50
+#: ../svnversion/svnversion.c:49
#, c-format
msgid "Type 'svnversion --help' for usage.\n"
msgstr "Skriv \"svnversion --help\" för användning.\n"
-#: ../svnversion/svnversion.c:61
+#: ../svnversion/svnversion.c:60
#, c-format
msgid ""
"usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n"
@@ -15578,7 +15953,7 @@ msgstr ""
" 4168M arbetskopia med ändringar\n"
" 4123S växlad arbetskopia\n"
" 4123P partiell arbetskopia från en gles utcheckning\n"
-" 123:4168MS växlad arbetskopia med blandade revisioner och ändringar\n"
+" 4123:4168MS växlad arbetskopia med blandade revisioner och ändringar\n"
"\n"
" Om AK_SÖKVÄG inte är versionshanterad så kommer programmet skriva ut\n"
" \"Ej versionshanterad fil/katalog\". Om AK_SÖKVÄG är en tillagd, kopierad\n"
@@ -15589,41 +15964,41 @@ msgstr ""
"\n"
"Giltiga flaggor:\n"
-#: ../svnversion/svnversion.c:137
+#: ../svnversion/svnversion.c:136
msgid "do not output the trailing newline"
msgstr "skriv inte ut det avslutande radslutet"
-#: ../svnversion/svnversion.c:138
+#: ../svnversion/svnversion.c:137
msgid "last changed rather than current revisions"
msgstr "senast ändrade istället för aktuella revisioner"
-#: ../svnversion/svnversion.c:246
+#: ../svnversion/svnversion.c:245
#, c-format
msgid "Unversioned symlink%s"
msgstr "Ej versionshanterad symbolisk länk%s"
-#: ../svnversion/svnversion.c:249
+#: ../svnversion/svnversion.c:248
#, c-format
msgid "Unversioned directory%s"
msgstr "Ej versionshanterad katalog%s"
-#: ../svnversion/svnversion.c:252
+#: ../svnversion/svnversion.c:251
#, c-format
msgid "Unversioned file%s"
msgstr "Ej versionshanterad fil%s"
-#: ../svnversion/svnversion.c:258
+#: ../svnversion/svnversion.c:257
#, c-format
msgid "'%s' doesn't exist\n"
msgstr "\"%s\" finns inte\n"
-#: ../svnversion/svnversion.c:259
+#: ../svnversion/svnversion.c:258
#, c-format
msgid "'%s' is of unknown type\n"
msgstr "\"%s\" är av okänd typ\n"
#. Local uncommitted modifications, no revision info was found.
-#: ../svnversion/svnversion.c:274
+#: ../svnversion/svnversion.c:273
#, c-format
msgid "Uncommitted local addition, copy or move%s"
msgstr "Oarkiverad lokalt tillagd, kopierad eller flyttad fil eller katalog%s"
diff --git a/subversion/po/zh_CN.po b/subversion/po/zh_CN.po
index a11599d..0d4bd5e 100644
--- a/subversion/po/zh_CN.po
+++ b/subversion/po/zh_CN.po
@@ -21,15 +21,12 @@
# Update to new pot:
# ../../tools/po/po-update.sh zh_CN
#
-# Merge from trunk:
-# python ../../../../trunk/tools/dev/po-merge.py < ../../../../trunk/subversion/po/zh_CN.po zh_CN.po
-#
# Check translation:
# msgfmt --statistics -c -o zh_CN.mo zh_CN.po
#
-# Please format and remove '#: filename:line' lines before commit:
+# Please format po file before commit:
# msgmerge --sort-by-file -o zh_CN_new.po zh_CN.po subversion.pot
-# msgcat --no-wrap --no-location -o zh_CN.po zh_CN_new.po
+# msgcat --no-wrap -o zh_CN.po zh_CN_new.po
# /bin/rm zh_CN_new.po
#
# Dictionary:
@@ -56,11 +53,11 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
-"POT-Creation-Date: 2013-07-03 16:58+0800\n"
-"PO-Revision-Date: 2013-07-03 16:57+0800\n"
-"Last-Translator: Subversion Developers <dev@subversion.apache.org>\n"
+"POT-Creation-Date: 2014-11-29 01:59+0800\n"
+"PO-Revision-Date: 2014-04-26 16:08+0800\n"
+"Last-Translator: \n"
"Language-Team: Simplified Chinese <dev@subversion.apache.org>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
@@ -186,7 +183,7 @@ msgstr "路径ä¸æ˜¯æŒ‡å®šç›®å½•çš„直接å­å­™"
msgid "Bogus UUID"
msgstr "éžæ³• UUID"
-#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:944
+#: ../include/svn_error_codes.h:207 ../include/svn_error_codes.h:1024
msgid "Invalid configuration value"
msgstr "无效的é…ç½®å–值"
@@ -214,1085 +211,1173 @@ msgstr "无效的修改列表å称"
msgid "Invalid atomic"
msgstr "无效原å­"
-#: ../include/svn_error_codes.h:240
+#: ../include/svn_error_codes.h:239
+msgid "Invalid compression method"
+msgstr "无效的压缩方法"
+
+#: ../include/svn_error_codes.h:245
msgid "No such XML tag attribute"
msgstr "æ²¡æœ‰è¿™ç§ XML 标签属性"
-#: ../include/svn_error_codes.h:244
+#: ../include/svn_error_codes.h:249
msgid "<delta-pkg> is missing ancestry"
msgstr "<delta-pkg> 没有祖先"
-#: ../include/svn_error_codes.h:248
+#: ../include/svn_error_codes.h:253
msgid "Unrecognized binary data encoding; can't decode"
msgstr "无法识别的二进制数æ®ç¼–ç : 无法解ç "
-#: ../include/svn_error_codes.h:252
+#: ../include/svn_error_codes.h:257
msgid "XML data was not well-formed"
msgstr "XML æ•°æ®è¯­æ³•é”™è¯¯"
-#: ../include/svn_error_codes.h:256
+#: ../include/svn_error_codes.h:261
msgid "Data cannot be safely XML-escaped"
msgstr "XML æ•°æ®ä¸èƒ½æ­£ç¡®è§£ç "
-#: ../include/svn_error_codes.h:262
+#: ../include/svn_error_codes.h:266
+msgid "Unexpected XML element found"
+msgstr "å‘现æ„外的 XML 元素"
+
+#: ../include/svn_error_codes.h:272
msgid "Inconsistent line ending style"
msgstr "ä¸ä¸€è‡´çš„行结æŸæ ·å¼"
-#: ../include/svn_error_codes.h:266
+#: ../include/svn_error_codes.h:276
msgid "Unrecognized line ending style"
msgstr "无法识别的行结æŸæ ·å¼"
-#: ../include/svn_error_codes.h:271
+#: ../include/svn_error_codes.h:281
msgid "Line endings other than expected"
msgstr "è¡Œæ„外结æŸ"
-#: ../include/svn_error_codes.h:275
+#: ../include/svn_error_codes.h:285
msgid "Ran out of unique names"
msgstr "唯一å称耗尽"
-#: ../include/svn_error_codes.h:280
+#: ../include/svn_error_codes.h:290
msgid "Framing error in pipe protocol"
msgstr "管é“å议中帧错误"
-#: ../include/svn_error_codes.h:285
+#: ../include/svn_error_codes.h:295
msgid "Read error in pipe"
msgstr "管é“读å–错误"
-#: ../include/svn_error_codes.h:289 ../libsvn_subr/cmdline.c:362
-#: ../libsvn_subr/cmdline.c:385 ../svn/util.c:569 ../svnlook/svnlook.c:2008
+#. is errno on POSIX
+#: ../include/svn_error_codes.h:299 ../libsvn_subr/cmdline.c:417
+#: ../libsvn_subr/cmdline.c:448 ../libsvn_subr/cmdline.c:471 ../svn/util.c:564
+#: ../svnlook/svnlook.c:2025
#, c-format
msgid "Write error"
msgstr "写入错误"
-#: ../include/svn_error_codes.h:294
+#: ../include/svn_error_codes.h:304
msgid "Write error in pipe"
msgstr "管é“写入错误"
-#: ../include/svn_error_codes.h:300
+#: ../include/svn_error_codes.h:310
msgid "Unexpected EOF on stream"
msgstr "æµæ„外结æŸ"
-#: ../include/svn_error_codes.h:304
+#: ../include/svn_error_codes.h:314
msgid "Malformed stream data"
msgstr "éžæ³•æµæ•°æ®"
-#: ../include/svn_error_codes.h:308
+#: ../include/svn_error_codes.h:318
msgid "Unrecognized stream data"
msgstr "无法识别的æµæ•°æ®"
-#: ../include/svn_error_codes.h:313
+#: ../include/svn_error_codes.h:323
msgid "Stream doesn't support seeking"
msgstr "æµä¸æ”¯æŒå®šä½æ“作"
-#: ../include/svn_error_codes.h:319
+#: ../include/svn_error_codes.h:328
+msgid "Stream doesn't support this capability"
+msgstr "æµä¸æ”¯æŒæ­¤ç‰¹æ€§"
+
+#: ../include/svn_error_codes.h:334
msgid "Unknown svn_node_kind"
msgstr "未知的 svn_node_kind"
-#: ../include/svn_error_codes.h:323
+#: ../include/svn_error_codes.h:338
msgid "Unexpected node kind found"
msgstr "å‘现æ„外节点ç§ç±»"
-#: ../include/svn_error_codes.h:329
+#: ../include/svn_error_codes.h:344
msgid "Can't find an entry"
msgstr "无法找到æ¡ç›®"
-#: ../include/svn_error_codes.h:335
+#: ../include/svn_error_codes.h:350
msgid "Entry already exists"
msgstr "æ¡ç›®å·²å­˜åœ¨"
-#: ../include/svn_error_codes.h:339
+#: ../include/svn_error_codes.h:354
msgid "Entry has no revision"
msgstr "æ¡ç›®æ²¡æœ‰ç‰ˆæœ¬"
-#: ../include/svn_error_codes.h:343
+#: ../include/svn_error_codes.h:358
msgid "Entry has no URL"
msgstr "å…¥å£æ²¡æœ‰ URL"
-#: ../include/svn_error_codes.h:347
+#: ../include/svn_error_codes.h:362
msgid "Entry has an invalid attribute"
msgstr "æ¡ç›®æœ‰æ— æ•ˆå±žæ€§"
-#: ../include/svn_error_codes.h:351
+#: ../include/svn_error_codes.h:366
msgid "Can't create an entry for a forbidden name"
msgstr "ä¸èƒ½ä¸ºç¦ç”¨çš„å称创建æ¡ç›®"
-#: ../include/svn_error_codes.h:357
+#: ../include/svn_error_codes.h:372
msgid "Obstructed update"
msgstr "更新阻塞"
-#: ../include/svn_error_codes.h:362
+#: ../include/svn_error_codes.h:377
msgid "Mismatch popping the WC unwind stack"
msgstr "ä¸åŒ¹é…的弹出工作副本展开堆栈"
-#: ../include/svn_error_codes.h:367
+#: ../include/svn_error_codes.h:382
msgid "Attempt to pop empty WC unwind stack"
msgstr "试图弹出空的工作副本展开堆栈"
-#: ../include/svn_error_codes.h:372
+#: ../include/svn_error_codes.h:387
msgid "Attempt to unlock with non-empty unwind stack"
msgstr "试图解é”éžç©ºå±•å¼€å †æ ˆ"
-#: ../include/svn_error_codes.h:376
+#: ../include/svn_error_codes.h:391
msgid "Attempted to lock an already-locked dir"
msgstr "试图é”定已加é”的目录"
-#: ../include/svn_error_codes.h:380
+#: ../include/svn_error_codes.h:395
msgid "Working copy not locked; this is probably a bug, please report"
msgstr "工作副本没有é”定;这å¯èƒ½æ˜¯ä¸€ä¸ªæ¼æ´žï¼Œè¯·æŠ¥å‘Š"
-#: ../include/svn_error_codes.h:385
+#: ../include/svn_error_codes.h:400
msgid "Invalid lock"
msgstr "无效é”"
-#: ../include/svn_error_codes.h:391 ../include/svn_error_codes.h:397
+#: ../include/svn_error_codes.h:406 ../include/svn_error_codes.h:412
msgid "Path is not a working copy directory"
msgstr "路径ä¸æ˜¯å·¥ä½œå‰¯æœ¬ç›®å½•"
-#: ../include/svn_error_codes.h:401
+#: ../include/svn_error_codes.h:416
msgid "Path is not a working copy file"
msgstr "路径ä¸æ˜¯å·¥ä½œå‰¯æœ¬æ–‡ä»¶"
-#: ../include/svn_error_codes.h:405
+#: ../include/svn_error_codes.h:420
msgid "Problem running log"
msgstr "执行日志出错"
-#: ../include/svn_error_codes.h:409
+#: ../include/svn_error_codes.h:424
msgid "Can't find a working copy path"
msgstr "找ä¸åˆ°å·¥ä½œå‰¯æœ¬è·¯å¾„"
-#: ../include/svn_error_codes.h:413
+#: ../include/svn_error_codes.h:428
msgid "Working copy is not up-to-date"
msgstr "工作副本没有更新到最新版本"
-#: ../include/svn_error_codes.h:417
+#: ../include/svn_error_codes.h:432
msgid "Left locally modified or unversioned files"
msgstr "ä¿ç•™æœ¬åœ°ä¿®æ”¹æˆ–未纳入版本控制的文件"
-#: ../include/svn_error_codes.h:421
+#: ../include/svn_error_codes.h:436
msgid "Unmergeable scheduling requested on an entry"
msgstr "æ¡ç›®æœ‰æ— æ³•åˆå¹¶çš„调度"
-#: ../include/svn_error_codes.h:425
+#: ../include/svn_error_codes.h:440
msgid "Found a working copy path"
msgstr "找到一个工作副本路径"
-#: ../include/svn_error_codes.h:429
+#: ../include/svn_error_codes.h:444
msgid "A conflict in the working copy obstructs the current operation"
msgstr "工作副本中的冲çªé˜»æ­¢äº†å½“å‰æ“作"
-#: ../include/svn_error_codes.h:433
+#: ../include/svn_error_codes.h:448
msgid "Working copy is corrupt"
msgstr "工作副本已æŸå"
-#: ../include/svn_error_codes.h:437
+#: ../include/svn_error_codes.h:452
msgid "Working copy text base is corrupt"
msgstr "工作副本的å‚考文件æŸå"
-#: ../include/svn_error_codes.h:441
+#: ../include/svn_error_codes.h:456
msgid "Cannot change node kind"
msgstr "无法修改节点类型"
-#: ../include/svn_error_codes.h:445
+#: ../include/svn_error_codes.h:460
msgid "Invalid operation on the current working directory"
msgstr "æ“作对当å‰å·¥ä½œç›®å½•æ— æ•ˆ"
-#: ../include/svn_error_codes.h:449
+#: ../include/svn_error_codes.h:464
msgid "Problem on first log entry in a working copy"
msgstr "æ“作工作副本的第一个日志æ¡ç›®å‡ºé”™"
-#: ../include/svn_error_codes.h:453
+#: ../include/svn_error_codes.h:468
msgid "Unsupported working copy format"
msgstr "ä¸æ”¯æŒæ­¤å·¥ä½œå‰¯æœ¬æ ¼å¼"
-#: ../include/svn_error_codes.h:457
+#: ../include/svn_error_codes.h:472
msgid "Path syntax not supported in this context"
msgstr "此上下文ä¸æ”¯æŒè·¯å¾„语法"
-#: ../include/svn_error_codes.h:462
+#: ../include/svn_error_codes.h:477
msgid "Invalid schedule"
msgstr "无效的调度"
-#: ../include/svn_error_codes.h:467
+#: ../include/svn_error_codes.h:482
msgid "Invalid relocation"
msgstr "无效é‡å®šä½"
-#: ../include/svn_error_codes.h:472
+#: ../include/svn_error_codes.h:487
msgid "Invalid switch"
msgstr "无效的切æ¢"
-#: ../include/svn_error_codes.h:477
+#: ../include/svn_error_codes.h:492
msgid "Changelist doesn't match"
msgstr "修改列表ä¸åŒ¹é…"
-#: ../include/svn_error_codes.h:482
+#: ../include/svn_error_codes.h:497
msgid "Conflict resolution failed"
msgstr "解决冲çªå¤±è´¥"
-#: ../include/svn_error_codes.h:486
+#: ../include/svn_error_codes.h:501
msgid "Failed to locate 'copyfrom' path in working copy"
msgstr "åœ¨å·¥ä½œå‰¯æœ¬ä¸­å®šä½ â€œcopyfrom†的路径失败。"
-#: ../include/svn_error_codes.h:494
+#: ../include/svn_error_codes.h:509
msgid "Moving a path from one changelist to another"
msgstr "将路径从一个修改列表移到å¦ä¸€ä¸ª"
-#: ../include/svn_error_codes.h:499
+#: ../include/svn_error_codes.h:514
msgid "Cannot delete a file external"
msgstr "无法删除外部文件"
-#: ../include/svn_error_codes.h:504
+#: ../include/svn_error_codes.h:519
msgid "Cannot move a file external"
msgstr "无法移动外部文件"
-#: ../include/svn_error_codes.h:509
+#: ../include/svn_error_codes.h:524
msgid "Something's amiss with the wc sqlite database"
msgstr "工作副本的 SQLite æ•°æ®åº“有错误"
-#: ../include/svn_error_codes.h:514
+#: ../include/svn_error_codes.h:529
msgid "The working copy is missing"
msgstr "工作副本丢失"
-#: ../include/svn_error_codes.h:519
+#: ../include/svn_error_codes.h:534
msgid "The specified node is not a symlink"
msgstr "指定的节点ä¸æ˜¯ç¬¦å·è¿žæŽ¥"
-#: ../include/svn_error_codes.h:524
+#: ../include/svn_error_codes.h:539
msgid "The specified path has an unexpected status"
msgstr "指定的路径有ä¸æœŸæœ›çš„状æ€"
-#: ../include/svn_error_codes.h:529
+#: ../include/svn_error_codes.h:544
msgid "The working copy needs to be upgraded"
msgstr "工作副本需è¦å‡çº§"
-#: ../include/svn_error_codes.h:534
-msgid ""
-"Previous operation has not finished; run 'cleanup' if it was interrupted"
+#: ../include/svn_error_codes.h:549
+msgid "Previous operation has not finished; run 'cleanup' if it was interrupted"
msgstr "以å‰çš„æ“作没有完æˆï¼›å¦‚果它被中断,请执行“svn cleanupâ€"
-#: ../include/svn_error_codes.h:540
+#: ../include/svn_error_codes.h:555
msgid "The operation cannot be performed with the specified depth"
msgstr "在指定的深度ä¸èƒ½æ‰§è¡Œæ­¤æ“作"
-#: ../include/svn_error_codes.h:545
+#: ../include/svn_error_codes.h:560
msgid "Couldn't open a working copy file because access was denied"
msgstr "ä¸èƒ½æ‰“开工作副本文件,访问被拒ç»"
-#: ../include/svn_error_codes.h:550
+#: ../include/svn_error_codes.h:565
msgid "Mixed-revision working copy was found but not expected"
msgstr "å‘现了ä¸æœŸæœ›çš„æ··åˆç‰ˆæœ¬çš„工作副本"
-#: ../include/svn_error_codes.h:555
+#: ../include/svn_error_codes.h:570
msgid "Duplicate targets in svn:externals property"
msgstr "svn:externals 属性包å«é‡å¤çš„目标"
-#: ../include/svn_error_codes.h:561
+#: ../include/svn_error_codes.h:576
msgid "General filesystem error"
msgstr "普通文件系统错误"
-#: ../include/svn_error_codes.h:565
+#: ../include/svn_error_codes.h:580
msgid "Error closing filesystem"
msgstr "关闭文件系统出错"
-#: ../include/svn_error_codes.h:569
+#: ../include/svn_error_codes.h:584
msgid "Filesystem is already open"
msgstr "文件系统已ç»æ‰“å¼€"
-#: ../include/svn_error_codes.h:573
+#: ../include/svn_error_codes.h:588
msgid "Filesystem is not open"
msgstr "文件系统尚未打开"
-#: ../include/svn_error_codes.h:577
+#: ../include/svn_error_codes.h:592
msgid "Filesystem is corrupt"
msgstr "文件系统æŸå"
-#: ../include/svn_error_codes.h:581
+#: ../include/svn_error_codes.h:596
msgid "Invalid filesystem path syntax"
msgstr "无效文件系统路径语法"
-#: ../include/svn_error_codes.h:585
+#: ../include/svn_error_codes.h:600
msgid "Invalid filesystem revision number"
msgstr "无效文件系统版本å·"
-#: ../include/svn_error_codes.h:589
+#: ../include/svn_error_codes.h:604
msgid "Invalid filesystem transaction name"
msgstr "无效的文件系统事务å称"
-#: ../include/svn_error_codes.h:593
+#: ../include/svn_error_codes.h:608
msgid "Filesystem directory has no such entry"
msgstr "文件系统目录没有此æ¡ç›®"
-#: ../include/svn_error_codes.h:597
+#: ../include/svn_error_codes.h:612
msgid "Filesystem has no such representation"
msgstr "文件系统没有此修订版"
-#: ../include/svn_error_codes.h:601
+#: ../include/svn_error_codes.h:616
msgid "Filesystem has no such string"
msgstr "文件系统没有此字符串"
-#: ../include/svn_error_codes.h:605
+#: ../include/svn_error_codes.h:620
msgid "Filesystem has no such copy"
msgstr "文件系统此副本"
-#: ../include/svn_error_codes.h:609
+#: ../include/svn_error_codes.h:624
msgid "The specified transaction is not mutable"
msgstr "指定的事务ä¸å¯æ”¹å˜"
-#: ../include/svn_error_codes.h:613
+#: ../include/svn_error_codes.h:628
msgid "Filesystem has no item"
msgstr "文件系统没有æ¡ç›®"
-#: ../include/svn_error_codes.h:617
+#: ../include/svn_error_codes.h:632
msgid "Filesystem has no such node-rev-id"
msgstr "文件系统没有此 node-rev-id"
-#: ../include/svn_error_codes.h:621
+#: ../include/svn_error_codes.h:636
msgid "String does not represent a node or node-rev-id"
msgstr "字符串ä¸æ˜¯èŠ‚点或 node-rev-id"
-#: ../include/svn_error_codes.h:625
+#: ../include/svn_error_codes.h:640
msgid "Name does not refer to a filesystem directory"
msgstr "文件系统无此目录"
-#: ../include/svn_error_codes.h:629
+#: ../include/svn_error_codes.h:644
msgid "Name does not refer to a filesystem file"
msgstr "文件系统无此文件"
-#: ../include/svn_error_codes.h:633
+#: ../include/svn_error_codes.h:648
msgid "Name is not a single path component"
msgstr "å称ä¸æ˜¯å•ä¸€è·¯å¾„"
-#: ../include/svn_error_codes.h:637
+#: ../include/svn_error_codes.h:652
msgid "Attempt to change immutable filesystem node"
msgstr "试图修改ä¸å˜çš„文件系统节点"
-#: ../include/svn_error_codes.h:641
+#: ../include/svn_error_codes.h:656
msgid "Item already exists in filesystem"
msgstr "文件系统已有此æ¡ç›®"
-#: ../include/svn_error_codes.h:645
+#: ../include/svn_error_codes.h:660
msgid "Attempt to remove or recreate fs root dir"
msgstr "试图删除或é‡å»ºæ–‡ä»¶ç³»ç»Ÿæ ¹ç›®å½•"
-#: ../include/svn_error_codes.h:649
+#: ../include/svn_error_codes.h:664
msgid "Object is not a transaction root"
msgstr "对象ä¸æ˜¯äº‹åŠ¡çš„æ ¹"
-#: ../include/svn_error_codes.h:653
+#: ../include/svn_error_codes.h:668
msgid "Object is not a revision root"
msgstr "对象ä¸æ˜¯ç‰ˆæœ¬çš„æ ¹"
-#: ../include/svn_error_codes.h:657
+#: ../include/svn_error_codes.h:672
msgid "Merge conflict during commit"
msgstr "æ交时å‘生åˆå¹¶å†²çª"
-#: ../include/svn_error_codes.h:661
+#: ../include/svn_error_codes.h:676
msgid "A representation vanished or changed between reads"
msgstr "读å–时修订版消失或改å˜"
-#: ../include/svn_error_codes.h:665
+#: ../include/svn_error_codes.h:680
msgid "Tried to change an immutable representation"
msgstr "试图修改ä¸å˜çš„修订版"
-#: ../include/svn_error_codes.h:669
+#: ../include/svn_error_codes.h:684
msgid "Malformed skeleton data"
msgstr "éžæ³•éª¨æž¶æ•°æ®"
-#: ../include/svn_error_codes.h:673
+#: ../include/svn_error_codes.h:688
msgid "Transaction is out of date"
msgstr "事务过时"
-#: ../include/svn_error_codes.h:677
+#: ../include/svn_error_codes.h:692
msgid "Berkeley DB error"
msgstr "BDB 错误"
-#: ../include/svn_error_codes.h:681
+#: ../include/svn_error_codes.h:696
msgid "Berkeley DB deadlock error"
msgstr "BDB æ­»é”"
-#: ../include/svn_error_codes.h:685
+#: ../include/svn_error_codes.h:700
msgid "Transaction is dead"
msgstr "事务已ç»ç»“æŸ"
-#: ../include/svn_error_codes.h:689
+#: ../include/svn_error_codes.h:704
msgid "Transaction is not dead"
msgstr "事务尚未结æŸ"
-#: ../include/svn_error_codes.h:694
+#: ../include/svn_error_codes.h:709
msgid "Unknown FS type"
msgstr "未知的FS类型"
-#: ../include/svn_error_codes.h:699
+#: ../include/svn_error_codes.h:714
msgid "No user associated with filesystem"
msgstr "没有用户与文件系统关è”"
-#: ../include/svn_error_codes.h:704
+#: ../include/svn_error_codes.h:719
msgid "Path is already locked"
msgstr "å·²ç»é”定路径"
-#: ../include/svn_error_codes.h:709 ../include/svn_error_codes.h:886
+#: ../include/svn_error_codes.h:724 ../include/svn_error_codes.h:961
msgid "Path is not locked"
msgstr "路径没有加é”"
-#: ../include/svn_error_codes.h:714
+#: ../include/svn_error_codes.h:729
msgid "Lock token is incorrect"
msgstr "ä¸æ­£ç¡®çš„é”定令牌"
-#: ../include/svn_error_codes.h:719
+#: ../include/svn_error_codes.h:734
msgid "No lock token provided"
msgstr "没有æä¾›é”定令牌"
-#: ../include/svn_error_codes.h:724
+#: ../include/svn_error_codes.h:739
msgid "Username does not match lock owner"
msgstr "用户ä¸æ˜¯é”所有者"
-#: ../include/svn_error_codes.h:729
+#: ../include/svn_error_codes.h:744
msgid "Filesystem has no such lock"
msgstr "文件系统没有此é”"
-#: ../include/svn_error_codes.h:734
+#: ../include/svn_error_codes.h:749
msgid "Lock has expired"
msgstr "é”过期"
-#: ../include/svn_error_codes.h:739 ../include/svn_error_codes.h:873
+#: ../include/svn_error_codes.h:754 ../include/svn_error_codes.h:948
msgid "Item is out of date"
msgstr "æ¡ç›®è¿‡æ—¶"
-#: ../include/svn_error_codes.h:751
+#: ../include/svn_error_codes.h:766
msgid "Unsupported FS format"
msgstr "ä¸æ”¯æŒçš„文件系统格å¼"
-#: ../include/svn_error_codes.h:756
+#: ../include/svn_error_codes.h:771
msgid "Representation is being written"
msgstr "正在写修订版"
-#: ../include/svn_error_codes.h:761
+#: ../include/svn_error_codes.h:776
msgid "The generated transaction name is too long"
msgstr "产生的事务å称太长"
-#: ../include/svn_error_codes.h:766
+#: ../include/svn_error_codes.h:781
msgid "Filesystem has no such node origin record"
msgstr "文件系统没有此节点的原始记录"
-#: ../include/svn_error_codes.h:771
+#: ../include/svn_error_codes.h:786
msgid "Filesystem upgrade is not supported"
msgstr "ä¸æ”¯æŒæ–‡ä»¶ç³»ç»Ÿå‡çº§"
-#: ../include/svn_error_codes.h:776
+#: ../include/svn_error_codes.h:791
msgid "Filesystem has no such checksum-representation index record"
msgstr "文件系统没有此校验和展现索引记录"
-#: ../include/svn_error_codes.h:781
+#: ../include/svn_error_codes.h:796
msgid "Property value in filesystem differs from the provided base value"
msgstr "文件系统中的属性值与æ供的基础值ä¸åŒ"
-#: ../include/svn_error_codes.h:787
+#: ../include/svn_error_codes.h:802
msgid "The filesystem editor completion process was not followed"
msgstr "没有è¿è¡Œæ–‡ä»¶ç³»ç»Ÿç¼–辑器完æˆè¿›ç¨‹"
-#: ../include/svn_error_codes.h:792
+#: ../include/svn_error_codes.h:807
msgid "A packed revprop could not be read"
msgstr "ä¸èƒ½è¯»å–打包的 revprop"
-#: ../include/svn_error_codes.h:797
+#: ../include/svn_error_codes.h:812
msgid "Could not initialize the revprop caching infrastructure."
msgstr "ä¸èƒ½åˆå§‹åŒ– revprop 缓存"
-#: ../include/svn_error_codes.h:803
+#: ../include/svn_error_codes.h:817
+msgid "Malformed transaction ID string."
+msgstr "畸形的事务 ID 字符串。"
+
+#: ../include/svn_error_codes.h:822
+msgid "Corrupt index file."
+msgstr "æŸå的索引文件"
+
+#: ../include/svn_error_codes.h:827
+msgid "Revision not covered by index."
+msgstr "索引中没有此版本。"
+
+#: ../include/svn_error_codes.h:832
+msgid "Item index too large for this revision."
+msgstr "此版本的æ¡ç›®ç´¢å¼•å¤ªå¤§ã€‚"
+
+#: ../include/svn_error_codes.h:837
+msgid "Container index out of range."
+msgstr "容器索引越界。"
+
+#: ../include/svn_error_codes.h:842
+msgid "Index files are inconsistent."
+msgstr "索引文件ä¸ä¸€è‡´ã€‚"
+
+#: ../include/svn_error_codes.h:847
+msgid "Lock operation failed"
+msgstr "é”æ“作失败"
+
+#: ../include/svn_error_codes.h:852
+msgid "Unsupported FS type"
+msgstr "ä¸æ”¯æŒçš„文件系统类型"
+
+#: ../include/svn_error_codes.h:857
+msgid "Container capacity exceeded."
+msgstr ""
+
+#: ../include/svn_error_codes.h:862
+msgid "Malformed node revision ID string."
+msgstr "畸形的节点版本 ID 字符串。"
+
+#: ../include/svn_error_codes.h:867 ../libsvn_fs_x/revprops.c:291
+msgid "Invalid generation number data."
+msgstr "无效的生æˆç¼–å·æ•°æ®ã€‚"
+
+#: ../include/svn_error_codes.h:873
msgid "The repository is locked, perhaps for db recovery"
msgstr "版本库被é”,å¯èƒ½æ­£åœ¨æ¢å¤"
-#: ../include/svn_error_codes.h:807
+#: ../include/svn_error_codes.h:877
msgid "A repository hook failed"
msgstr "版本库钩å­é”™è¯¯"
-#: ../include/svn_error_codes.h:811
+#: ../include/svn_error_codes.h:881
msgid "Incorrect arguments supplied"
msgstr "æ供了ä¸æ­£ç¡®çš„å‚æ•°"
-#: ../include/svn_error_codes.h:815
+#: ../include/svn_error_codes.h:885
msgid "A report cannot be generated because no data was supplied"
msgstr "没有数æ®ï¼Œæ— æ³•äº§ç”ŸæŠ¥å‘Š"
-#: ../include/svn_error_codes.h:819
+#: ../include/svn_error_codes.h:889
msgid "Bogus revision report"
msgstr "版本报告éžæ³•"
-#: ../include/svn_error_codes.h:828
+#: ../include/svn_error_codes.h:898
msgid "Unsupported repository version"
msgstr "ä¸æ”¯æŒæ­¤ç‰ˆæœ¬åº“版本"
-#: ../include/svn_error_codes.h:832
+#: ../include/svn_error_codes.h:902
msgid "Disabled repository feature"
msgstr "关闭版本库特性"
-#: ../include/svn_error_codes.h:836
+#: ../include/svn_error_codes.h:906
msgid "Error running post-commit hook"
msgstr "执行 post-commit é’©å­é”™è¯¯"
-#: ../include/svn_error_codes.h:841
+#: ../include/svn_error_codes.h:911
msgid "Error running post-lock hook"
msgstr "执行 post-lock é’©å­é”™è¯¯"
-#: ../include/svn_error_codes.h:846
+#: ../include/svn_error_codes.h:916
msgid "Error running post-unlock hook"
msgstr "执行 post-unlock é’©å­é”™è¯¯"
-#: ../include/svn_error_codes.h:851
+#: ../include/svn_error_codes.h:921
msgid "Repository upgrade is not supported"
msgstr "ä¸æ”¯æŒç‰ˆæœ¬åº“å‡çº§"
-#: ../include/svn_error_codes.h:857
+#: ../include/svn_error_codes.h:926
+msgid "Repository is corrupt"
+msgstr "版本库已æŸå"
+
+#: ../include/svn_error_codes.h:932
msgid "Bad URL passed to RA layer"
msgstr "传递至 RA 层的 URL 错误"
-#: ../include/svn_error_codes.h:861
+#: ../include/svn_error_codes.h:936
msgid "Authorization failed"
msgstr "认è¯å¤±è´¥"
-#: ../include/svn_error_codes.h:865
+#: ../include/svn_error_codes.h:940
msgid "Unknown authorization method"
msgstr "未知认è¯"
-#: ../include/svn_error_codes.h:869
+#: ../include/svn_error_codes.h:944
msgid "Repository access method not implemented"
msgstr "版本库未实现存å–方法"
-#: ../include/svn_error_codes.h:877
+#: ../include/svn_error_codes.h:952
msgid "Repository has no UUID"
msgstr "版本库没有 UUID"
-#: ../include/svn_error_codes.h:881
+#: ../include/svn_error_codes.h:956
msgid "Unsupported RA plugin ABI version"
msgstr "ä¸æ”¯æŒæ­¤ RA æ’件的 ABI 版本"
-#: ../include/svn_error_codes.h:891
+#: ../include/svn_error_codes.h:966
msgid "Server can only replay from the root of a repository"
msgstr "æœåŠ¡å™¨åªèƒ½ä»Žç‰ˆæœ¬åº“çš„æ ¹é‡æ”¾"
-#: ../include/svn_error_codes.h:896
+#: ../include/svn_error_codes.h:971
msgid "Repository UUID does not match expected UUID"
msgstr "版本库的 UUID 与期望的 UUID ä¸åŒ¹é…"
-#: ../include/svn_error_codes.h:901
+#: ../include/svn_error_codes.h:976
msgid "Repository root URL does not match expected root URL"
msgstr "版本库根 URL 与期望的根 URL ä¸åŒ¹é…"
-#: ../include/svn_error_codes.h:906
+#: ../include/svn_error_codes.h:981
msgid "Session URL does not match expected session URL"
msgstr "ä¼šè¯ URL ä¸ŽæœŸæœ›çš„ä¼šè¯ URL ä¸åŒ¹é…"
-#: ../include/svn_error_codes.h:911 ../libsvn_ra_svn/client.c:491
+#: ../include/svn_error_codes.h:986 ../libsvn_ra_svn/client.c:503
#, c-format
msgid "Can't create tunnel"
msgstr "无法创建隧é“"
-#: ../include/svn_error_codes.h:917
+#: ../include/svn_error_codes.h:991
+msgid "Can't create session"
+msgstr "无法创建回è¯"
+
+#: ../include/svn_error_codes.h:997
msgid "RA layer failed to init socket layer"
msgstr "RA 层无法åˆå§‹åŒ– socket 层"
-#: ../include/svn_error_codes.h:921
+#: ../include/svn_error_codes.h:1001
msgid "RA layer failed to create HTTP request"
msgstr "RA 层创建 HTTP 请求失败"
-#: ../include/svn_error_codes.h:925
+#: ../include/svn_error_codes.h:1005
msgid "RA layer request failed"
msgstr "RA 层请求失败"
-#: ../include/svn_error_codes.h:929
+#: ../include/svn_error_codes.h:1009
msgid "RA layer didn't receive requested OPTIONS info"
msgstr "RA 层无法å–得请求的 OPTIONS ä¿¡æ¯"
-#: ../include/svn_error_codes.h:933
+#: ../include/svn_error_codes.h:1013
msgid "RA layer failed to fetch properties"
msgstr "RA 层无法å–得属性"
-#: ../include/svn_error_codes.h:937
+#: ../include/svn_error_codes.h:1017
msgid "RA layer file already exists"
msgstr "RA 层文件已ç»å­˜åœ¨"
-#: ../include/svn_error_codes.h:951
+#: ../include/svn_error_codes.h:1031
msgid "HTTP Path Not Found"
msgstr "找ä¸åˆ° HTTP 路径"
-#: ../include/svn_error_codes.h:955
+#: ../include/svn_error_codes.h:1035
msgid "Failed to execute WebDAV PROPPATCH"
msgstr "执行 WebDAV PROPPATCH 失败"
-#: ../include/svn_error_codes.h:960 ../include/svn_error_codes.h:1403
-#: ../libsvn_ra_svn/marshal.c:1075 ../libsvn_ra_svn/marshal.c:1285
-#: ../libsvn_ra_svn/marshal.c:1315
+#. If condition COND is not met, return a "malformed network data" error.
+#.
+#: ../include/svn_error_codes.h:1040 ../include/svn_error_codes.h:1513
+#: ../libsvn_ra_svn/marshal.c:1129 ../libsvn_ra_svn/marshal.c:1381
+#: ../libsvn_ra_svn/marshal.c:1411 ../libsvn_ra_svn/marshal.c:2495
msgid "Malformed network data"
msgstr "éžæ³•ç½‘络数æ®"
-#: ../include/svn_error_codes.h:965
+#: ../include/svn_error_codes.h:1045
msgid "Unable to extract data from response header"
msgstr "ä¸èƒ½ä»Žå“应的头信æ¯ä¸­èŽ·å–æ•°æ®"
-#: ../include/svn_error_codes.h:970
+#: ../include/svn_error_codes.h:1050
msgid "Repository has been moved"
msgstr "版本库已ç»ç§»åŠ¨"
-#: ../include/svn_error_codes.h:975 ../libsvn_ra_serf/update.c:2881
-#: ../libsvn_ra_serf/util.c:767
+#: ../include/svn_error_codes.h:1055 ../libsvn_ra_serf/util.c:886
msgid "Connection timed out"
msgstr "连接超时"
-#: ../include/svn_error_codes.h:980
+#: ../include/svn_error_codes.h:1060
msgid "URL access forbidden for unknown reason"
msgstr "因为未知的ç†ç”±ï¼Œç¦æ­¢è®¿é—® URL"
-#: ../include/svn_error_codes.h:986 ../include/svn_error_codes.h:1407
+#: ../include/svn_error_codes.h:1065
+msgid "The server state conflicts with the requested preconditions"
+msgstr "æœåŠ¡å™¨çŠ¶æ€ä¸Žè¯·æ±‚çš„å‰ç½®æ¡ä»¶å†²çªã€‚"
+
+#: ../include/svn_error_codes.h:1071 ../include/svn_error_codes.h:1517
msgid "Couldn't find a repository"
msgstr "无法找到版本库"
-#: ../include/svn_error_codes.h:990
+#: ../include/svn_error_codes.h:1075
msgid "Couldn't open a repository"
msgstr "无法打开版本库"
-#: ../include/svn_error_codes.h:996
+#: ../include/svn_error_codes.h:1081
msgid "Svndiff data has invalid header"
msgstr "svndiff æ•°æ®åŒ…å«æ— æ•ˆå¤´"
-#: ../include/svn_error_codes.h:1000
+#: ../include/svn_error_codes.h:1085
msgid "Svndiff data contains corrupt window"
msgstr "Svndiff æ•°æ®åŒ…å«æŸå窗å£"
-#: ../include/svn_error_codes.h:1004
+#: ../include/svn_error_codes.h:1089
msgid "Svndiff data contains backward-sliding source view"
msgstr "Svndiff æ•°æ®åŒ…å«å‘åŽå˜åŒ–的资æºè§†å›¾"
-#: ../include/svn_error_codes.h:1008
+#: ../include/svn_error_codes.h:1093
msgid "Svndiff data contains invalid instruction"
msgstr "svndiff æ•°æ®åŒ…å«æ— æ•ˆæŒ‡ä»¤"
-#: ../include/svn_error_codes.h:1012
+#: ../include/svn_error_codes.h:1097
msgid "Svndiff data ends unexpectedly"
msgstr "svndiff æ•°æ®æ„外结æŸ"
-#: ../include/svn_error_codes.h:1016
+#: ../include/svn_error_codes.h:1101
msgid "Svndiff compressed data is invalid"
msgstr "éžæ³• svndiff 压缩数æ®"
-#: ../include/svn_error_codes.h:1022
+#: ../include/svn_error_codes.h:1107
msgid "Apache has no path to an SVN filesystem"
msgstr "Apache æ²¡æœ‰æŒ‡å‘ SVN 文件系统的路径"
-#: ../include/svn_error_codes.h:1026
+#: ../include/svn_error_codes.h:1111
msgid "Apache got a malformed URI"
msgstr "Apache 得到éžæ³• URI"
-#: ../include/svn_error_codes.h:1030
+#: ../include/svn_error_codes.h:1115
msgid "Activity not found"
msgstr "没有找到活动项"
-#: ../include/svn_error_codes.h:1034
+#: ../include/svn_error_codes.h:1119
msgid "Baseline incorrect"
msgstr "基线错误"
-#: ../include/svn_error_codes.h:1038
+#: ../include/svn_error_codes.h:1123
msgid "Input/output error"
msgstr "输出/输出错误"
-#: ../include/svn_error_codes.h:1044
+#: ../include/svn_error_codes.h:1129
msgid "A path under version control is needed for this operation"
msgstr "åªèƒ½å¯¹çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶çš„路径执行此æ“作"
-#: ../include/svn_error_codes.h:1048
+#: ../include/svn_error_codes.h:1133
msgid "Repository access is needed for this operation"
msgstr "æ­¤æ“作需è¦å­˜å–版本库"
-#: ../include/svn_error_codes.h:1052
+#: ../include/svn_error_codes.h:1137
msgid "Bogus revision information given"
msgstr "给出的版本信æ¯éžæ³•"
-#: ../include/svn_error_codes.h:1056
+#: ../include/svn_error_codes.h:1141
msgid "Attempting to commit to a URL more than once"
msgstr "试图对 URL 进行多次æ交"
-#: ../include/svn_error_codes.h:1060
+#: ../include/svn_error_codes.h:1145
msgid "Operation does not apply to binary file"
msgstr "ä¸èƒ½å¯¹äºŒè¿›åˆ¶æ–‡ä»¶æ‰§è¡Œæ­¤æ“作"
-#: ../include/svn_error_codes.h:1066
+#: ../include/svn_error_codes.h:1151
msgid "Format of an svn:externals property was invalid"
msgstr "svn:externals 属性格å¼éžæ³•"
-#: ../include/svn_error_codes.h:1070
+#: ../include/svn_error_codes.h:1155
msgid "Attempting restricted operation for modified resource"
msgstr "试图对已修改的资æºè¿›è¡Œå—é™æ“作"
-#: ../include/svn_error_codes.h:1074
+#: ../include/svn_error_codes.h:1159
msgid "Operation does not apply to directory"
msgstr "ä¸èƒ½å¯¹ç›®å½•æ‰§è¡Œæ­¤æ“作"
-#: ../include/svn_error_codes.h:1078
+#: ../include/svn_error_codes.h:1163
msgid "Revision range is not allowed"
msgstr "ä¸å…许的版本范围"
-#: ../include/svn_error_codes.h:1082
+#: ../include/svn_error_codes.h:1167
msgid "Inter-repository relocation not allowed"
msgstr "ä¸æ”¯æŒç‰ˆæœ¬åº“之间的é‡æ–°å®šä½"
-#: ../include/svn_error_codes.h:1086
+#: ../include/svn_error_codes.h:1171
msgid "Author name cannot contain a newline"
msgstr "作者å称ä¸èƒ½æ¢è¡Œ"
-#: ../include/svn_error_codes.h:1090
+#: ../include/svn_error_codes.h:1175
msgid "Bad property name"
msgstr "属性å称错误"
-#: ../include/svn_error_codes.h:1095
+#: ../include/svn_error_codes.h:1180
msgid "Two versioned resources are unrelated"
msgstr "两个纳入版本控制的资æºä¸ç›¸å…³"
-#: ../include/svn_error_codes.h:1100
+#: ../include/svn_error_codes.h:1185
msgid "Path has no lock token"
msgstr "路径没有é”定令牌"
-#: ../include/svn_error_codes.h:1105
+#: ../include/svn_error_codes.h:1190
msgid "Operation does not support multiple sources"
msgstr "æ­¤æ“作ä¸æ”¯æŒå¤šä¸ªæºå¯¹è±¡"
-#: ../include/svn_error_codes.h:1110
+#: ../include/svn_error_codes.h:1195
msgid "No versioned parent directories"
msgstr "没有å—版本控制的父目录"
-#: ../include/svn_error_codes.h:1115 ../include/svn_error_codes.h:1135
+#: ../include/svn_error_codes.h:1200 ../include/svn_error_codes.h:1220
msgid "Working copy and merge source not ready for reintegration"
msgstr "工作副本与åˆå¹¶æ¥æºæ²¡æœ‰å‡†å¤‡å¥½å¤å…´"
-#: ../include/svn_error_codes.h:1120
+#: ../include/svn_error_codes.h:1205
msgid "A file external cannot overwrite an existing versioned item"
msgstr "外部引用的文件ä¸èƒ½è¦†å†™å·²å­˜çš„版本控制的æ¡ç›®"
-#: ../include/svn_error_codes.h:1125
+#: ../include/svn_error_codes.h:1210
msgid "Invalid path component strip count specified"
msgstr "指定了无效的路径组件修剪计数"
-#: ../include/svn_error_codes.h:1130
+#: ../include/svn_error_codes.h:1215
msgid "Detected a cycle while processing the operation"
msgstr "当处ç†æ­¤æ“作是,检测到死循环"
-#: ../include/svn_error_codes.h:1140
+#: ../include/svn_error_codes.h:1225
msgid "Invalid mergeinfo detected in merge target"
msgstr "在åˆå¹¶ç›®æ ‡æ£€æµ‹åˆ°äº†åˆå¹¶ä¿¡æ¯"
-#: ../include/svn_error_codes.h:1145
+#: ../include/svn_error_codes.h:1230
msgid "Can't perform this operation without a valid lock token"
msgstr "ä¸èƒ½åœ¨æ²¡æœ‰åˆæ³•çš„é”令牌时执行此æ“作"
-#: ../include/svn_error_codes.h:1150
+#: ../include/svn_error_codes.h:1235
msgid "The operation is forbidden by the server"
msgstr "æ“作被æœåŠ¡å™¨ç¦æ­¢"
-#: ../include/svn_error_codes.h:1156
+#: ../include/svn_error_codes.h:1241
msgid "A problem occurred; see other errors for details"
msgstr "å‘生问题;请å‚阅其它错误信æ¯"
-#: ../include/svn_error_codes.h:1160
+#: ../include/svn_error_codes.h:1245
msgid "Failure loading plugin"
msgstr "加载æ’件失败"
-#: ../include/svn_error_codes.h:1164
+#: ../include/svn_error_codes.h:1249
msgid "Malformed file"
msgstr "文件格å¼é”™è¯¯"
-#: ../include/svn_error_codes.h:1168
+#: ../include/svn_error_codes.h:1253
msgid "Incomplete data"
msgstr "æ•°æ®ä¸å®Œæ•´"
-#: ../include/svn_error_codes.h:1172
+#: ../include/svn_error_codes.h:1257
msgid "Incorrect parameters given"
msgstr "å‚æ•°ä¸æ­£ç¡®"
-#: ../include/svn_error_codes.h:1176
+#: ../include/svn_error_codes.h:1261
msgid "Tried a versioning operation on an unversioned resource"
msgstr "试图对未纳入版本控制的资æºè¿›è¡Œç‰ˆæœ¬æ“作"
-#: ../include/svn_error_codes.h:1180
+#: ../include/svn_error_codes.h:1265
msgid "Test failed"
msgstr "测试失败"
-#: ../include/svn_error_codes.h:1184
+#: ../include/svn_error_codes.h:1269
msgid "Trying to use an unsupported feature"
msgstr "试图使用ä¸æ”¯æŒçš„特性"
-#: ../include/svn_error_codes.h:1188
+#: ../include/svn_error_codes.h:1273
msgid "Unexpected or unknown property kind"
msgstr "æ„外或未知的属性类型"
-#: ../include/svn_error_codes.h:1192
+#: ../include/svn_error_codes.h:1277
msgid "Illegal target for the requested operation"
msgstr "此请求æ“作的目标éžæ³•"
-#: ../include/svn_error_codes.h:1196
+#: ../include/svn_error_codes.h:1281
msgid "MD5 checksum is missing"
msgstr "没有 MD5 校验和"
-#: ../include/svn_error_codes.h:1200
+#: ../include/svn_error_codes.h:1285
msgid "Directory needs to be empty but is not"
msgstr "必须为空的目录有内容"
-#: ../include/svn_error_codes.h:1204
+#: ../include/svn_error_codes.h:1289
msgid "Error calling external program"
msgstr "调用外部程åºé”™è¯¯"
-#: ../include/svn_error_codes.h:1208
+#: ../include/svn_error_codes.h:1293
msgid "Python exception has been set with the error"
msgstr "Python 异常被设为错误"
-#: ../include/svn_error_codes.h:1212
+#: ../include/svn_error_codes.h:1297
msgid "A checksum mismatch occurred"
msgstr "校验和错误"
-#: ../include/svn_error_codes.h:1216
+#: ../include/svn_error_codes.h:1301
msgid "The operation was interrupted"
msgstr "æ“作被中断"
-#: ../include/svn_error_codes.h:1220
+#: ../include/svn_error_codes.h:1305
msgid "The specified diff option is not supported"
msgstr "ä¸æ”¯æŒæŒ‡å®šçš„ diff 选项"
-#: ../include/svn_error_codes.h:1224
+#: ../include/svn_error_codes.h:1309
msgid "Property not found"
msgstr "找ä¸åˆ°å±žæ€§"
-#: ../include/svn_error_codes.h:1228
+#: ../include/svn_error_codes.h:1313
msgid "No auth file path available"
msgstr "未æä¾› auth 文件路径"
-#: ../include/svn_error_codes.h:1233
+#: ../include/svn_error_codes.h:1318
msgid "Incompatible library version"
msgstr "ä¸å…¼å®¹çš„库版本"
-#: ../include/svn_error_codes.h:1238
+#: ../include/svn_error_codes.h:1323
msgid "Mergeinfo parse error"
msgstr "分æžåˆå¹¶ä¿¡æ¯å‡ºé”™"
-#: ../include/svn_error_codes.h:1243
+#: ../include/svn_error_codes.h:1328
msgid "Cease invocation of this API"
msgstr "åœæ­¢è°ƒç”¨æ­¤ API"
-#: ../include/svn_error_codes.h:1248
+#: ../include/svn_error_codes.h:1333
msgid "Error parsing revision number"
msgstr "解æžç‰ˆæœ¬å·å‡ºé”™"
-#: ../include/svn_error_codes.h:1253
+#: ../include/svn_error_codes.h:1338
msgid "Iteration terminated before completion"
msgstr "迭代在完æˆå‰ç»ˆæ­¢"
-#: ../include/svn_error_codes.h:1258
+#: ../include/svn_error_codes.h:1343
msgid "Unknown changelist"
msgstr "未知修改列表"
-#: ../include/svn_error_codes.h:1263
+#: ../include/svn_error_codes.h:1348
msgid "Reserved directory name in command line arguments"
msgstr "在命令行å‚数中包å«ä¿ç•™çš„目录å称"
-#: ../include/svn_error_codes.h:1268
+#: ../include/svn_error_codes.h:1353
msgid "Inquiry about unknown capability"
msgstr "查询未知特性"
-#: ../include/svn_error_codes.h:1273
+#: ../include/svn_error_codes.h:1358
msgid "Test skipped"
msgstr "跳过测试"
-#: ../include/svn_error_codes.h:1278
+#: ../include/svn_error_codes.h:1363
msgid "APR memcache library not available"
msgstr "APR memcache 库ä¸å¯ç”¨"
-#: ../include/svn_error_codes.h:1283
+#: ../include/svn_error_codes.h:1368
msgid "Couldn't perform atomic initialization"
msgstr "ä¸èƒ½å®ŒæˆåŽŸå­çš„åˆå§‹åŒ–"
-#: ../include/svn_error_codes.h:1288
+#: ../include/svn_error_codes.h:1373
msgid "SQLite error"
msgstr "SQLite 错误"
-#: ../include/svn_error_codes.h:1293
+#: ../include/svn_error_codes.h:1378
msgid "Attempted to write to readonly SQLite db"
msgstr "试图写至åªè¯» SQLite æ•°æ®åº“"
-#: ../include/svn_error_codes.h:1300
+#: ../include/svn_error_codes.h:1385
msgid "Unsupported schema found in SQLite db"
msgstr "ä¸æ”¯æŒ SQLite æ•°æ®åº“中的方案"
-#: ../include/svn_error_codes.h:1305
+#: ../include/svn_error_codes.h:1390
msgid "The SQLite db is busy"
msgstr "SQLite æ•°æ®åº“ç¹å¿™"
-#: ../include/svn_error_codes.h:1310
-msgid ""
-"SQLite busy at transaction rollback; resetting all busy SQLite statements to "
-"allow rollback"
+#: ../include/svn_error_codes.h:1395
+msgid "SQLite busy at transaction rollback; resetting all busy SQLite statements to allow rollback"
msgstr "SQLite 忙于回滚事务; 请é‡ç½®æ‰€æœ‰ç¹å¿™çš„ SQLite 语å¥ï¼Œä»¥ä¾¿å…许回滚"
-#: ../include/svn_error_codes.h:1316
+#: ../include/svn_error_codes.h:1401
msgid "Constraint error in SQLite db"
msgstr "在 SQLite æ•°æ®åº“中的约æŸå‡ºé”™"
-#: ../include/svn_error_codes.h:1321
+#: ../include/svn_error_codes.h:1406
msgid "Too many memcached servers configured"
msgstr "é…置了太多的 memcached æœåŠ¡å™¨"
-#: ../include/svn_error_codes.h:1326
+#: ../include/svn_error_codes.h:1411
msgid "Failed to parse version number string"
msgstr "解æžç‰ˆæœ¬å·å­—符串失败"
-#: ../include/svn_error_codes.h:1331
+#: ../include/svn_error_codes.h:1416
msgid "Atomic data storage is corrupt"
msgstr "原å­æ•°æ®å­˜å‚¨æŸå"
-#: ../include/svn_error_codes.h:1337
+#: ../include/svn_error_codes.h:1421
+msgid "utf8proc library error"
+msgstr "UTF8 处ç†åº“错误"
+
+#: ../include/svn_error_codes.h:1426
+msgid "Bad arguments to SQL operators GLOB or LIKE"
+msgstr "传递给 SQL æ“作符 GBLOB 或 LIKE çš„å‚数错误"
+
+#: ../include/svn_error_codes.h:1431
+msgid "Packed data stream is corrupt"
+msgstr "打包数æ®æµæŸå"
+
+#: ../include/svn_error_codes.h:1436
+msgid "Additional errors:"
+msgstr "é¢å¤–错误:"
+
+#: ../include/svn_error_codes.h:1441
+msgid "Parser error: invalid input"
+msgstr "解æžé”™è¯¯: éžæ³•è¾“å…¥"
+
+#: ../include/svn_error_codes.h:1447
msgid "Error parsing arguments"
msgstr "解æžå‚数出错"
-#: ../include/svn_error_codes.h:1341
+#: ../include/svn_error_codes.h:1451
msgid "Not enough arguments provided"
msgstr "没有æ供足够的å‚æ•°"
-#: ../include/svn_error_codes.h:1345
+#: ../include/svn_error_codes.h:1455
msgid "Mutually exclusive arguments specified"
msgstr "å‚数冲çª"
-#: ../include/svn_error_codes.h:1349
+#: ../include/svn_error_codes.h:1459
msgid "Attempted command in administrative dir"
msgstr "试图在管ç†ç›®å½•ä¸­æ‰§è¡Œå‘½ä»¤"
-#: ../include/svn_error_codes.h:1353
+#: ../include/svn_error_codes.h:1463
msgid "The log message file is under version control"
msgstr "日志信æ¯æ–‡ä»¶è¢«çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶"
-#: ../include/svn_error_codes.h:1357
+#: ../include/svn_error_codes.h:1467
msgid "The log message is a pathname"
msgstr "日志信æ¯æ˜¯è·¯å¾„å"
-#: ../include/svn_error_codes.h:1361
+#: ../include/svn_error_codes.h:1471
msgid "Committing in directory scheduled for addition"
msgstr "在调度增加的目录中进行æ交"
-#: ../include/svn_error_codes.h:1365
+#: ../include/svn_error_codes.h:1475
msgid "No external editor available"
msgstr "没有外部编辑器å¯ç”¨"
-#: ../include/svn_error_codes.h:1369
+#: ../include/svn_error_codes.h:1479
msgid "Something is wrong with the log message's contents"
msgstr "日志信æ¯å†…容ä¸å¦¥"
-#: ../include/svn_error_codes.h:1373
+#: ../include/svn_error_codes.h:1483
msgid "A log message was given where none was necessary"
msgstr "在ä¸éœ€è¦æ—¶ç»™å‡ºæ—¥å¿—ä¿¡æ¯"
-#: ../include/svn_error_codes.h:1377
+#: ../include/svn_error_codes.h:1487
msgid "No external merge tool available"
msgstr "没有外部åˆå¹¶å·¥å…·å¯ç”¨"
-#: ../include/svn_error_codes.h:1381
+#: ../include/svn_error_codes.h:1491
msgid "Failed processing one or more externals definitions"
msgstr "处ç†ä¸€ä¸ªæˆ–更多的外部定义失败"
-#: ../include/svn_error_codes.h:1387
+#: ../include/svn_error_codes.h:1497
msgid "Special code for wrapping server errors to report to client"
msgstr "用专用代ç å°è£…æœåŠ¡å™¨é”™è¯¯ä»¥ä¾¿æŠ¥å‘Šå®¢æˆ·ç«¯"
-#: ../include/svn_error_codes.h:1391
+#: ../include/svn_error_codes.h:1501
msgid "Unknown svn protocol command"
msgstr "未知的 svn å议命令"
-#: ../include/svn_error_codes.h:1395
+#: ../include/svn_error_codes.h:1505
msgid "Network connection closed unexpectedly"
msgstr "网络连接æ„外关闭"
-#: ../include/svn_error_codes.h:1399
+#: ../include/svn_error_codes.h:1509
msgid "Network read/write error"
msgstr "网络读写错误"
-#: ../include/svn_error_codes.h:1411
+#: ../include/svn_error_codes.h:1521
msgid "Client/server version mismatch"
msgstr "客户端/æœåŠ¡å™¨ç‰ˆæœ¬ä¸åŒ¹é…"
-#: ../include/svn_error_codes.h:1416
+#: ../include/svn_error_codes.h:1526
msgid "Cannot negotiate authentication mechanism"
msgstr "无法å商认è¯æœºåˆ¶"
-#: ../include/svn_error_codes.h:1421
+#: ../include/svn_error_codes.h:1531
msgid "Editor drive was aborted"
msgstr "编辑器中止"
-#: ../include/svn_error_codes.h:1429
+#: ../include/svn_error_codes.h:1539
msgid "Credential data unavailable"
msgstr "无法å–得凭è¯æ•°æ®"
-#: ../include/svn_error_codes.h:1433
+#: ../include/svn_error_codes.h:1543
msgid "No authentication provider available"
msgstr "没有å¯ç”¨çš„认è¯æ供者"
-#: ../include/svn_error_codes.h:1437
+#: ../include/svn_error_codes.h:1547
msgid "All authentication providers exhausted"
msgstr "所有的认è¯æ供者都ä¸å¯ç”¨"
-#: ../include/svn_error_codes.h:1441
+#: ../include/svn_error_codes.h:1551
msgid "Credentials not saved"
msgstr "没有ä¿å­˜å‡­è¯æ•°æ®"
-#: ../include/svn_error_codes.h:1446
+#: ../include/svn_error_codes.h:1556 ../libsvn_subr/gpg_agent.c:416
msgid "Authentication failed"
msgstr "认è¯å¤±è´¥"
-#: ../include/svn_error_codes.h:1452
+#: ../include/svn_error_codes.h:1562
msgid "Read access denied for root of edit"
msgstr "编辑根目录时拒ç»è¯»å–"
-#: ../include/svn_error_codes.h:1457
+#: ../include/svn_error_codes.h:1567
msgid "Item is not readable"
msgstr "æ¡ç›®ä¸å¯è¯»"
-#: ../include/svn_error_codes.h:1462
+#: ../include/svn_error_codes.h:1572
msgid "Item is partially readable"
msgstr "æ¡ç›®éƒ¨åˆ†å¯è¯»"
-#: ../include/svn_error_codes.h:1466
+#: ../include/svn_error_codes.h:1576
msgid "Invalid authz configuration"
msgstr "认è¯é…置无效"
-#: ../include/svn_error_codes.h:1471
+#: ../include/svn_error_codes.h:1581
msgid "Item is not writable"
msgstr "æ¡ç›®ä¸èƒ½å†™"
-#: ../include/svn_error_codes.h:1478
+#: ../include/svn_error_codes.h:1588
msgid "Diff data source modified unexpectedly"
msgstr "svndiff æ•°æ®è¢«æ„外修改"
-#: ../include/svn_error_codes.h:1484
+#: ../include/svn_error_codes.h:1594
msgid "Initialization of SSPI library failed"
msgstr "åˆå§‹åŒ– SSPI 库失败"
-#: ../include/svn_error_codes.h:1488
+#: ../include/svn_error_codes.h:1598
msgid "Server SSL certificate untrusted"
msgstr "æœåŠ¡å™¨çš„ SSL è¯ä¹¦ä¸è¢«ä¿¡ä»»"
-#: ../include/svn_error_codes.h:1493
+#: ../include/svn_error_codes.h:1603
msgid "Initialization of the GSSAPI context failed"
msgstr "åˆå§‹åŒ– GSSAPI 失败"
-#: ../include/svn_error_codes.h:1498
+#: ../include/svn_error_codes.h:1608
msgid "While handling serf response:"
msgstr "å½“å¤„ç† serf çš„å“应时:"
-#: ../include/svn_error_codes.h:1504
+#: ../include/svn_error_codes.h:1614
msgid "Assertion failure"
msgstr "断言失败"
-#: ../include/svn_error_codes.h:1508
+#: ../include/svn_error_codes.h:1618
msgid "No non-tracing links found in the error chain"
msgstr "没有å‘现错误链中的éžè·Ÿè¸ªé“¾æŽ¥"
-#: ../libsvn_auth_gnome_keyring/gnome_keyring.c:274
+#: ../libsvn_auth_gnome_keyring/gnome_keyring.c:152
msgid "GNOME Keyring is locked and we are non-interactive"
msgstr "GNOME Keyring 被é”定,并且我们处于éžäº¤äº’æ–¹å¼"
-#: ../libsvn_client/add.c:606 ../libsvn_client/cmdline.c:356
-#: ../libsvn_subr/opt.c:930
+#: ../libsvn_client/add.c:609 ../libsvn_client/cmdline.c:365
+#: ../libsvn_subr/opt.c:932
#, c-format
msgid "'%s' ends in a reserved name"
msgstr "“%sâ€ä»¥ä¿ç•™å称结æŸ"
@@ -1302,64 +1387,58 @@ msgstr "“%sâ€ä»¥ä¿ç•™å称结æŸ"
msgid "'%s' prevents creating parent of '%s'"
msgstr "'%s' 阻止创建 '%s' 的父亲"
-#: ../libsvn_client/add.c:914 ../libsvn_wc/adm_ops.c:731
+#: ../libsvn_client/add.c:915 ../libsvn_wc/adm_ops.c:445
#, c-format
-msgid ""
-"'%s' is an existing item in conflict; please mark the conflict as resolved "
-"before adding a new item here"
+msgid "'%s' is an existing item in conflict; please mark the conflict as resolved before adding a new item here"
msgstr "æ¡ç›®â€œ%sâ€å¤„于冲çªçŠ¶æ€ï¼›è¯·åœ¨æ–°å¢žä¹‹å‰æ ‡è®°å†²çªä¸ºå·²ç»è§£å†³"
-#: ../libsvn_client/add.c:921 ../libsvn_wc/adm_ops.c:686
-#: ../libsvn_wc/workqueue.c:904 ../libsvn_wc/workqueue.c:998
+#: ../libsvn_client/add.c:922 ../libsvn_wc/adm_ops.c:400
+#: ../libsvn_wc/workqueue.c:874 ../libsvn_wc/workqueue.c:968
#, c-format
msgid "'%s' not found"
msgstr "找ä¸åˆ° “%sâ€"
-#: ../libsvn_client/add.c:927 ../libsvn_wc/adm_ops.c:691
+#: ../libsvn_client/add.c:928 ../libsvn_wc/adm_ops.c:405
#: ../libsvn_wc/delete.c:98
#, c-format
msgid "Unsupported node kind for path '%s'"
msgstr "路径 “%s†有ä¸æ”¯æŒçš„节点ç§ç±»"
-#: ../libsvn_client/add.c:960 ../libsvn_client/changelist.c:65
-#: ../libsvn_client/changelist.c:104 ../libsvn_client/cleanup.c:55
-#: ../libsvn_client/export.c:1392 ../libsvn_client/import.c:815
-#: ../libsvn_client/patch.c:3009 ../libsvn_client/relocate.c:232
-#: ../libsvn_client/resolved.c:121 ../libsvn_client/revert.c:136
-#: ../libsvn_client/status.c:353 ../libsvn_client/switch.c:473
-#: ../libsvn_client/update.c:646 ../libsvn_client/upgrade.c:105
-#: ../svn/util.c:984
+#: ../libsvn_client/add.c:961 ../libsvn_client/changelist.c:65
+#: ../libsvn_client/changelist.c:104 ../libsvn_client/deprecated.c:3055
+#: ../libsvn_client/export.c:1394 ../libsvn_client/import.c:831
+#: ../libsvn_client/patch.c:3124 ../libsvn_client/relocate.c:153
+#: ../libsvn_client/resolved.c:119 ../libsvn_client/revert.c:139
+#: ../libsvn_client/status.c:368 ../libsvn_client/switch.c:471
+#: ../libsvn_client/update.c:701 ../libsvn_client/upgrade.c:109
+#: ../svn-bench/util.c:76 ../svn/util.c:979
#, c-format
msgid "'%s' is not a local path"
msgstr "“%sâ€ä¸æ˜¯æœ¬åœ°è·¯å¾„"
-#: ../libsvn_client/add.c:1001 ../libsvn_client/copy_foreign.c:489
-#: ../libsvn_wc/adm_ops.c:765 ../libsvn_wc/copy.c:715
+#: ../libsvn_client/add.c:1002 ../libsvn_client/copy_foreign.c:491
+#: ../libsvn_wc/adm_ops.c:479 ../libsvn_wc/copy.c:784
#, c-format
msgid "'%s' is already under version control"
msgstr "“%sâ€å·²çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶"
-#: ../libsvn_client/add.c:1134 ../libsvn_client/add.c:1161
+#: ../libsvn_client/add.c:1135 ../libsvn_client/add.c:1162
#, c-format
msgid "There is no valid URI above '%s'"
msgstr "在 '%s' 的上级没有åˆæ³•çš„ URI"
-#: ../libsvn_client/blame.c:605
-msgid "Start revision must precede end revision"
-msgstr "起始版本必须å°äºŽç»“æŸç‰ˆæœ¬"
-
-#: ../libsvn_client/blame.c:633
+#: ../libsvn_client/blame.c:696
#, c-format
msgid "Cannot calculate blame information for binary file '%s'"
msgstr "无法为二进制文件 “%s†计算追溯信æ¯"
-#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:610
-#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:833
-#: ../libsvn_client/prop_commands.c:1388 ../libsvn_client/revisions.c:104
-#: ../libsvn_wc/adm_ops.c:1196 ../libsvn_wc/adm_ops.c:1246
-#: ../libsvn_wc/copy.c:563 ../libsvn_wc/copy.c:624 ../libsvn_wc/entries.c:1301
+#: ../libsvn_client/cat.c:77 ../libsvn_client/commit_util.c:613
+#: ../libsvn_client/delete.c:81 ../libsvn_client/prop_commands.c:837
+#: ../libsvn_client/prop_commands.c:1417 ../libsvn_client/revisions.c:105
+#: ../libsvn_wc/adm_ops.c:912 ../libsvn_wc/adm_ops.c:966
+#: ../libsvn_wc/copy.c:626 ../libsvn_wc/copy.c:687 ../libsvn_wc/entries.c:1301
#: ../libsvn_wc/entries.c:2681 ../libsvn_wc/entries.c:2712
-#: ../svn/notify.c:1095
+#: ../svn-bench/notify.c:968 ../svn/notify.c:1026
#, c-format
msgid "'%s' is not under version control"
msgstr "“%s†尚未纳入版本控制"
@@ -1374,11 +1453,11 @@ msgstr "“%s†引用一个目录"
msgid "'%s' has no pristine version until it is committed"
msgstr "在æ交之å‰ï¼Œâ€œ%sâ€æ²¡æœ‰åŸºç¡€ç‰ˆæœ¬"
-#: ../libsvn_client/cat.c:147 ../libsvn_client/export.c:388
+#: ../libsvn_client/cat.c:147 ../libsvn_client/export.c:390
msgid "(local)"
msgstr "(本地)"
-#: ../libsvn_client/cat.c:247
+#: ../libsvn_client/cat.c:255
#, c-format
msgid "URL '%s' refers to a directory"
msgstr "URL “%s†指å‘目录"
@@ -1387,22 +1466,23 @@ msgstr "URL “%s†指å‘目录"
msgid "Target changelist name must not be empty"
msgstr "目标修改列表的å称ä¸èƒ½ä¸ºç©º"
-#: ../libsvn_client/checkout.c:109 ../libsvn_client/export.c:1445
+#: ../libsvn_client/checkout.c:131 ../libsvn_client/export.c:1447
+#: ../svn-bench/null-export-cmd.c:275
#, c-format
msgid "URL '%s' doesn't exist"
msgstr "URL “%s†ä¸å­˜åœ¨"
-#: ../libsvn_client/checkout.c:113
+#: ../libsvn_client/checkout.c:135
#, c-format
msgid "URL '%s' refers to a file, not a directory"
msgstr "URL “%s†指å‘一个文件,ä¸æ˜¯ç›®å½•"
-#: ../libsvn_client/checkout.c:147
+#: ../libsvn_client/checkout.c:173
#, c-format
msgid "'%s' is already a working copy for a different URL"
msgstr "“%s†已ç»æ˜¯æŒ‡å‘ä¸åŒ URL 的工作副本"
-#: ../libsvn_client/checkout.c:155
+#: ../libsvn_client/checkout.c:181
#, c-format
msgid "'%s' already exists and is not a directory"
msgstr "“%s†已ç»å­˜åœ¨å¹¶ä¸”ä¸æ˜¯ç›®å½•"
@@ -1412,41 +1492,37 @@ msgstr "“%s†已ç»å­˜åœ¨å¹¶ä¸”ä¸æ˜¯ç›®å½•"
msgid "All non-relative targets must have the same root URL"
msgstr "所有éžç›¸å¯¹ç›®æ ‡å¿…须有相åŒçš„æ ¹ URL"
-#: ../libsvn_client/cmdline.c:312
-msgid ""
-"Resolving '^/': no repository root found in the target arguments or in the "
-"current directory"
+#: ../libsvn_client/cmdline.c:207
+#, c-format
+msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
+msgstr "“%s†是铆钉版本。或许你应该使用 “%s@†?"
+
+#: ../libsvn_client/cmdline.c:321
+msgid "Resolving '^/': no repository root found in the target arguments or in the current directory"
msgstr "解æžâ€œ^/â€: 在目标å‚数或当å‰ç›®å½•ä¸­æ‰¾ä¸åˆ°ç‰ˆæœ¬åº“çš„æ ¹"
-#: ../libsvn_client/commit.c:155 ../libsvn_client/copy.c:1510
+#: ../libsvn_client/commit.c:157 ../libsvn_client/copy.c:1541
msgid "Commit failed (details follow):"
msgstr "æ交失败(细节如下): "
-#: ../libsvn_client/commit.c:163
+#: ../libsvn_client/commit.c:165
msgid "Commit succeeded, but other errors follow:"
msgstr "æ交æˆåŠŸï¼Œä½†æ˜¯å‘生了其它错误,细节如下: "
-#: ../libsvn_client/commit.c:170
+#: ../libsvn_client/commit.c:172
msgid "Error unlocking locked dirs (details follow):"
msgstr "解除é”定目录出错(细节如下): "
-#: ../libsvn_client/commit.c:181
+#: ../libsvn_client/commit.c:183
msgid "Error bumping revisions post-commit (details follow):"
msgstr "执行 post-commit 出错 (细节如下): "
-#: ../libsvn_client/commit.c:307
-#, c-format
-msgid ""
-"Cannot delete the directory '%s' in a non-recursive commit because it has "
-"children"
-msgstr "因为目录“%sâ€éžç©ºï¼Œå› æ­¤ä¸èƒ½åœ¨éžé€’å½’æ交中删除它"
-
-#: ../libsvn_client/commit.c:606
+#: ../libsvn_client/commit.c:551
#, c-format
msgid "'%s' is a URL, but URLs cannot be commit targets"
msgstr "“%s†是 URL,但是 URL ä¸å¯ä½œä¸ºæ交目标"
-#: ../libsvn_client/commit.c:728
+#: ../libsvn_client/commit.c:653
msgid ""
"Commit can only commit to a single repository at a time.\n"
"Are all targets part of the same working copy?"
@@ -1454,207 +1530,199 @@ msgstr ""
"æ¯æ¬¡æ交åªèƒ½é’ˆå¯¹ä¸€ä¸ªç‰ˆæœ¬åº“。\n"
"是å¦æ‰€æœ‰ç›®æ ‡éƒ½å±žäºŽåŒä¸€å·¥ä½œå‰¯æœ¬ï¼Ÿ"
-#: ../libsvn_client/commit.c:844
+#: ../libsvn_client/commit.c:769
#, c-format
-msgid ""
-"Cannot commit '%s' because it was moved from '%s' which is not part of the "
-"commit; both sides of the move must be committed together"
-msgstr ""
+msgid "Cannot commit '%s' because it was moved from '%s' which is not part of the commit; both sides of the move must be committed together"
+msgstr "ä¸èƒ½æ交 '%s',因为它是自 '%s' 移入的,并且ä¸æ˜¯æ­¤æ交的一部分;它们必须åŒæ—¶æ交"
-#: ../libsvn_client/commit.c:875
+#: ../libsvn_client/commit.c:813
#, c-format
-msgid ""
-"Cannot commit '%s' because it was moved to '%s' which is not part of the "
-"commit; both sides of the move must be committed together"
-msgstr ""
+msgid "Cannot commit '%s' because it was moved to '%s' which is not part of the commit; both sides of the move must be committed together"
+msgstr "ä¸èƒ½æ交 '%s',因为已ç»ç§»åˆ° '%s',并且ä¸æ˜¯æ­¤æ交的一部分;它们必须åŒæ—¶æ交"
-#: ../libsvn_client/commit_util.c:94 ../libsvn_repos/commit.c:167
+#: ../libsvn_client/commit_util.c:96 ../libsvn_repos/commit.c:167
#, c-format
msgid "Directory '%s' is out of date"
msgstr "目录 “%s†已ç»è¿‡æ—¶"
-#: ../libsvn_client/commit_util.c:95 ../libsvn_repos/commit.c:169
+#: ../libsvn_client/commit_util.c:97 ../libsvn_repos/commit.c:169
#, c-format
msgid "File '%s' is out of date"
msgstr "文件 “%s†已ç»è¿‡æ—¶"
-#: ../libsvn_client/commit_util.c:130
+#: ../libsvn_client/commit_util.c:133
#, c-format
msgid "Directory '%s' is locked in another working copy"
msgstr "目录“%sâ€åœ¨å…¶å®ƒå·¥ä½œå‰¯æœ¬ä¸­è¢«é”定"
-#: ../libsvn_client/commit_util.c:131
+#: ../libsvn_client/commit_util.c:134
#, c-format
msgid "File '%s' is locked in another working copy"
msgstr "文件“%s†在其它工作副本中被é”定"
-#: ../libsvn_client/commit_util.c:166
+#: ../libsvn_client/commit_util.c:169
#, c-format
msgid "Changing directory '%s' is forbidden by the server"
msgstr "æœåŠ¡å™¨ç¦æ­¢ä¿®æ”¹ç›®å½•â€œ%sâ€"
-#: ../libsvn_client/commit_util.c:167
+#: ../libsvn_client/commit_util.c:170
#, c-format
msgid "Changing file '%s' is forbidden by the server"
msgstr "æœåŠ¡å™¨ç¦æ­¢ä¿®æ”¹æ–‡ä»¶â€œ%sâ€"
-#: ../libsvn_client/commit_util.c:315
+#: ../libsvn_client/commit_util.c:318
#, c-format
msgid "Aborting commit: '%s' remains in tree-conflict"
msgstr "æ交终止: “%s†ä»å¤„于树冲çªçŠ¶æ€"
-#: ../libsvn_client/commit_util.c:666
+#: ../libsvn_client/commit_util.c:669
#, c-format
msgid "Aborting commit: '%s' remains in conflict"
msgstr "æ交终止: “%s†处于冲çªçŠ¶æ€"
-#: ../libsvn_client/commit_util.c:685
+#: ../libsvn_client/commit_util.c:688
#, c-format
msgid "Node '%s' has unexpectedly changed kind"
msgstr "节点 “%s†的类型æ„外改å˜"
-#: ../libsvn_client/commit_util.c:726
+#: ../libsvn_client/commit_util.c:729
#, c-format
msgid "'%s' is scheduled for addition, but is missing"
msgstr "丢失了预定增加的“%sâ€"
-#: ../libsvn_client/commit_util.c:1212
+#: ../libsvn_client/commit_util.c:1280
#, c-format
-msgid ""
-"'%s' is not known to exist in the repository and is not part of the commit, "
-"yet its child '%s' is part of the commit"
-msgstr ""
-"“%s†ä¸åœ¨ç‰ˆæœ¬åº“中,也ä¸æ˜¯æ交的一部分,但是它的å­è·¯å¾„ “%s†是æ交的一部分"
+msgid "'%s' is not known to exist in the repository and is not part of the commit, yet its child '%s' is part of the commit"
+msgstr "“%s†ä¸åœ¨ç‰ˆæœ¬åº“中,也ä¸æ˜¯æ交的一部分,但是它的å­è·¯å¾„ “%s†是æ交的一部分"
-#: ../libsvn_client/commit_util.c:1351
+#: ../libsvn_client/commit_util.c:1419
#, c-format
msgid "Cannot commit both '%s' and '%s' as they refer to the same URL"
msgstr "无法åŒæ—¶æ交 “%s†与 “%sâ€ï¼Œå› ä¸ºå®ƒä»¬éƒ½æŒ‡å‘åŒä¸€ä¸ª URL"
-#: ../libsvn_client/commit_util.c:1502
+#: ../libsvn_client/commit_util.c:1574
#, c-format
msgid "Commit item '%s' has copy flag but no copyfrom URL"
msgstr "æ交项目 “%s†有å¤åˆ¶æ ‡è®°ï¼Œä½†æ˜¯æ²¡æœ‰æºåœ°å€(copyfrom URL)"
-#: ../libsvn_client/commit_util.c:1507
+#: ../libsvn_client/commit_util.c:1579
#, c-format
msgid "Commit item '%s' has copy flag but an invalid revision"
msgstr "æ交项目 “%s†有å¤åˆ¶æ ‡å¿—,但是版本无效"
-#: ../libsvn_client/commit_util.c:1969
+#: ../libsvn_client/commit_util.c:2054
msgid "Standard properties can't be set explicitly as revision properties"
msgstr "标准属性ä¸èƒ½è®¾ç½®ä¸ºç‰ˆæœ¬å±žæ€§"
-#: ../libsvn_client/copy.c:427
+#: ../libsvn_client/copy.c:439
#, c-format
msgid "Path '%s' exists, but is excluded"
msgstr "路径 “%s†存在,但被排除"
-#: ../libsvn_client/copy.c:433 ../libsvn_client/copy.c:1050
-#: ../libsvn_client/copy.c:1309 ../libsvn_client/copy.c:1884
-#: ../libsvn_client/import.c:862
+#: ../libsvn_client/copy.c:445 ../libsvn_client/copy.c:1062
+#: ../libsvn_client/copy.c:1340 ../libsvn_client/copy.c:1914
+#: ../libsvn_client/import.c:879 ../libsvn_client/mtcc.c:454
+#: ../libsvn_client/mtcc.c:471 ../libsvn_ra_serf/util.c:1819
#, c-format
msgid "Path '%s' already exists"
msgstr "路径 “%s†已ç»å­˜åœ¨"
-#: ../libsvn_client/copy.c:488
+#: ../libsvn_client/copy.c:500
#, c-format
msgid "Path '%s' already exists as unversioned node"
msgstr "路径 “%s†已ç»ä½œä¸ºéžç‰ˆæœ¬æŽ§åˆ¶èŠ‚点存在"
-#: ../libsvn_client/copy.c:510 ../libsvn_client/copy.c:520
-#: ../libsvn_client/copy.c:1900
+#: ../libsvn_client/copy.c:522 ../libsvn_client/copy.c:532
+#: ../libsvn_client/copy.c:1930
#, c-format
msgid "Path '%s' is not a directory"
msgstr "路径 “%s†ä¸æ˜¯ç›®å½•"
-#: ../libsvn_client/copy.c:559 ../libsvn_client/merge.c:10116
-#: ../svnlook/svnlook.c:1424
+#: ../libsvn_client/copy.c:571 ../libsvn_client/merge.c:10189
+#: ../svnlook/svnlook.c:1435
#, c-format
msgid "Path '%s' does not exist"
msgstr "路径 “%s†ä¸å­˜åœ¨"
-#: ../libsvn_client/copy.c:729 ../libsvn_client/copy.c:770
+#: ../libsvn_client/copy.c:741 ../libsvn_client/copy.c:782
#, c-format
msgid "Path '%s' already exists, but is not a directory"
msgstr "路径 “%s†已ç»å­˜åœ¨ï¼Œä½†ä¸æ˜¯ç›®å½•"
-#: ../libsvn_client/copy.c:831
+#: ../libsvn_client/copy.c:843
msgid "Source and destination URLs appear not to point to the same repository."
msgstr "æ¥æºä¸Žç›®æ ‡ URL 似乎ä¸åœ¨åŒä¸€ç‰ˆæœ¬åº“。"
-#: ../libsvn_client/copy.c:1040 ../libsvn_client/prop_commands.c:167
+#: ../libsvn_client/copy.c:1052 ../libsvn_client/prop_commands.c:167
#, c-format
msgid "Path '%s' does not exist in revision %ld"
msgstr "路径 “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_client/copy.c:1868
+#: ../libsvn_client/copy.c:1898 ../libsvn_client/mtcc.c:548
#, c-format
msgid "Path '%s' not found in revision %ld"
msgstr "路径 “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_client/copy.c:1873
+#: ../libsvn_client/copy.c:1903
#, c-format
msgid "Path '%s' not found in head revision"
msgstr "HEAD 版本中找ä¸åˆ°è·¯å¾„ “%sâ€"
-#: ../libsvn_client/copy.c:2001
+#: ../libsvn_client/copy.c:2034
msgid "Cannot mix repository and working copy sources"
msgstr "ä¸èƒ½åœ¨æºä¸­æ··åˆç‰ˆæœ¬åº“和工作副本"
-#: ../libsvn_client/copy.c:2053
+#: ../libsvn_client/copy.c:2086
#, c-format
msgid "Cannot copy path '%s' into its own child '%s'"
msgstr "无法å¤åˆ¶è·¯å¾„ “%s†到其å­ç›®å½• “%s†中"
-#: ../libsvn_client/copy.c:2089
+#: ../libsvn_client/copy.c:2122
#, c-format
-msgid ""
-"Cannot move the external at '%s'; please edit the svn:externals property on "
-"'%s'."
+msgid "Cannot move the external at '%s'; please edit the svn:externals property on '%s'."
msgstr "ä¸èƒ½ç§»åŠ¨åœ¨â€œ%sâ€çš„外部引用;请在“%sâ€ä¿®æ”¹å±žæ€§ svn:externals property 。"
-#: ../libsvn_client/copy.c:2104
+#: ../libsvn_client/copy.c:2137
msgid "Moves between the working copy and the repository are not supported"
msgstr "ä¸æ”¯æŒåœ¨å·¥ä½œå‰¯æœ¬å’Œç‰ˆæœ¬åº“之间移动"
-#: ../libsvn_client/copy.c:2119
+#: ../libsvn_client/copy.c:2152
#, c-format
msgid "Cannot move URL '%s' into itself"
msgstr "无法移动 URL “%s†到本身"
-#: ../libsvn_client/copy.c:2120
+#: ../libsvn_client/copy.c:2153
#, c-format
msgid "Cannot move path '%s' into itself"
msgstr "无法移动路径 “%s†到本身"
-#: ../libsvn_client/copy.c:2187
+#: ../libsvn_client/copy.c:2220
#, c-format
msgid "'%s' does not have a URL associated with it"
msgstr "“%s†没有关è”çš„ URL"
-#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:282
-#: ../libsvn_client/externals.c:904 ../libsvn_client/externals.c:1103
-#: ../libsvn_wc/update_editor.c:1119
+#: ../libsvn_client/copy_foreign.c:131 ../libsvn_client/copy_foreign.c:283
+#: ../libsvn_client/externals.c:960 ../libsvn_client/externals.c:1171
+#: ../libsvn_wc/update_editor.c:1103
#, c-format
msgid "Path '%s' is not in the working copy"
msgstr "路径 “%s†ä¸åœ¨å·¥ä½œå‰¯æœ¬ä¸­"
-#: ../libsvn_client/copy_foreign.c:372 ../libsvn_client/export.c:812
-#: ../libsvn_client/repos_diff.c:998 ../libsvn_fs_fs/dag.c:1051
-#: ../libsvn_ra_svn/client.c:1185 ../libsvn_wc/diff_editor.c:1977
-#: ../libsvn_wc/diff_editor.c:2056 ../libsvn_wc/externals.c:651
-#: ../libsvn_wc/update_editor.c:4205
+#: ../libsvn_client/copy_foreign.c:373 ../libsvn_client/export.c:814
+#: ../libsvn_client/repos_diff.c:998 ../libsvn_fs_fs/dag.c:1068
+#: ../libsvn_fs_x/dag.c:1067 ../libsvn_ra_svn/client.c:1327
+#: ../libsvn_wc/diff_editor.c:1983 ../libsvn_wc/diff_editor.c:2069
+#: ../libsvn_wc/externals.c:650 ../libsvn_wc/update_editor.c:4294
#, c-format
msgid "Checksum mismatch for '%s'"
msgstr "'%s' 的校验和ä¸åŒ¹é…"
-#: ../libsvn_client/copy_foreign.c:479
+#: ../libsvn_client/copy_foreign.c:481
#, c-format
msgid "'%s' is not a valid location inside a repository"
msgstr "“%sâ€åœ¨ç‰ˆæœ¬åº“中ä¸æ˜¯åˆæ³•çš„ä½ç½®"
-#: ../libsvn_client/copy_foreign.c:510
+#: ../libsvn_client/copy_foreign.c:512
#, c-format
msgid "Can't add '%s', because no parent directory is found"
msgstr "ä¸èƒ½å¢žåŠ â€œ%sâ€ï¼Œå› ä¸ºæ²¡æœ‰å‘现它的父目录"
@@ -1671,110 +1739,104 @@ msgstr "“%s†已有本地修改 -- 请先æ交或撤销"
#: ../libsvn_client/delete.c:127
#, c-format
-msgid ""
-"Cannot remove the external at '%s'; please edit or delete the svn:externals "
-"property on '%s'"
+msgid "Cannot remove the external at '%s'; please edit or delete the svn:externals property on '%s'"
msgstr "ä¸èƒ½åœ¨â€œ%sâ€åˆ é™¤å¤–部引用;请在“%sâ€ä¿®æ”¹æˆ–删除属性 svn:externals"
+#: ../libsvn_client/delete.c:358
+#, c-format
+msgid "URL '%s' not within a repository"
+msgstr "URL '%s' ä¸åœ¨ç‰ˆæœ¬åº“中"
+
+#: ../libsvn_client/delete.c:365
+#, c-format
+msgid "URL '%s' does not exist"
+msgstr "URL “%s†ä¸å­˜åœ¨"
+
#: ../libsvn_client/deprecated.c:862 ../svn/move-cmd.c:65
msgid "Cannot specify revisions (except HEAD) with move operations"
msgstr "移动æ“作ä¸èƒ½æŒ‡å®šç‰ˆæœ¬"
-#: ../libsvn_client/deprecated.c:1624
+#: ../libsvn_client/deprecated.c:1625
msgid "No commits in repository"
msgstr "版本库中没有æ交"
-#: ../libsvn_client/deprecated.c:2930 ../libsvn_wc/deprecated.c:3953
+#: ../libsvn_client/deprecated.c:3009 ../libsvn_wc/deprecated.c:4171
msgid "Non-recursive relocation not supported"
msgstr "ä¸æ”¯æŒéžé€’å½’çš„é‡æ–°å®šä½"
-#. Utilities
-#: ../libsvn_client/diff.c:64
+#: ../libsvn_client/diff.c:65
#, c-format
msgid "Path '%s' must be an immediate child of the directory '%s'"
msgstr "路径 “%s†必须是目录 “%s†的直接å­å­™"
-#: ../libsvn_client/diff.c:258
+#: ../libsvn_client/diff.c:243
#, c-format
msgid "%s\t(revision %ld)"
msgstr "%s\t(版本 %ld)"
-#: ../libsvn_client/diff.c:260
+#: ../libsvn_client/diff.c:245
+#, c-format
+msgid "%s\t(nonexistent)"
+msgstr "%s\t(ä¸å­˜åœ¨çš„)"
+
+#. SVN_INVALID_REVNUM
+#: ../libsvn_client/diff.c:247
#, c-format
msgid "%s\t(working copy)"
msgstr "%s\t(工作副本)"
-#: ../libsvn_client/diff.c:512 ../svnlook/svnlook.c:794
+#: ../libsvn_client/diff.c:501 ../svnlook/svnlook.c:802
#, c-format
msgid "%sProperty changes on: %s%s"
msgstr "%s 属性改å˜: %s%s"
-#: ../libsvn_client/diff.c:760
+#: ../libsvn_client/diff.c:756
#, c-format
msgid "Cannot display: file marked as a binary type.%s"
msgstr "无法显示: 文件标记为二进制类型。%s"
-#: ../libsvn_client/diff.c:1265 ../libsvn_client/merge.c:7176
-#: ../libsvn_client/merge.c:10523
+#: ../libsvn_client/diff.c:1287 ../libsvn_client/merge.c:7239
+#: ../libsvn_client/merge.c:10591
msgid "Not all required revisions are specified"
msgstr "没有全部æ供需è¦çš„版本"
-#: ../libsvn_client/diff.c:1279
-msgid ""
-"At least one revision must be something other than BASE or WORKING when "
-"diffing a URL"
+#: ../libsvn_client/diff.c:1301
+msgid "At least one revision must be something other than BASE or WORKING when diffing a URL"
msgstr "è¦æ¯”较 URL 的时候,必须有一个版本,既ä¸æ˜¯åŸºç¡€ç‰ˆæœ¬ï¼Œåˆä¸æ˜¯å·¥ä½œç‰ˆæœ¬"
-#: ../libsvn_client/diff.c:1316
+#: ../libsvn_client/diff.c:1338
#, c-format
msgid "Diff target '%s' was not found in the repository at revision '%ld'"
msgstr "差异目标 '%s' ä¸åœ¨ç‰ˆæœ¬åº“的版本 '%ld' 中"
-#: ../libsvn_client/diff.c:1321
+#: ../libsvn_client/diff.c:1343
#, c-format
-msgid ""
-"Diff target '%s' was not found in the repository at revision '%ld' or '%ld'"
+msgid "Diff target '%s' was not found in the repository at revision '%ld' or '%ld'"
msgstr "差异目标 '%s' ä¸åœ¨ç‰ˆæœ¬åº“的版本 '%ld' 或 '%ld' 中"
-#: ../libsvn_client/diff.c:1496
+#: ../libsvn_client/diff.c:1519
#, c-format
-msgid ""
-"Diff target '%s' was not found in the repository at revisions '%ld' and '%ld'"
+msgid "Diff target '%s' was not found in the repository at revisions '%ld' and '%ld'"
msgstr "差异目标 '%s' ä¸åœ¨ç‰ˆæœ¬åº“的版本 '%ld' å’Œ '%ld' 中"
-#: ../libsvn_client/diff.c:1501
+#: ../libsvn_client/diff.c:1524
#, c-format
-msgid ""
-"Diff targets '%s' and '%s' were not found in the repository at revisions "
-"'%ld' and '%ld'"
+msgid "Diff targets '%s' and '%s' were not found in the repository at revisions '%ld' and '%ld'"
msgstr "差异目标 '%s' 与 '%s' ä¸åœ¨ç‰ˆæœ¬åº“的版本 '%ld' å’Œ '%ld' 中"
-#: ../libsvn_client/diff.c:1575
+#: ../libsvn_client/diff.c:1623
msgid "Sorry, svn_client_diff6 was called in a way that is not yet supported"
msgstr "抱歉,svn_client_diff6 å°šä¸æ”¯æŒè¿™ç§è°ƒç”¨æ–¹å¼"
-#: ../libsvn_client/diff.c:1616
-msgid ""
-"Only diffs between a path's text-base and its working files are supported at "
-"this time"
+#: ../libsvn_client/diff.c:1663
+msgid "Only diffs between a path's text-base and its working files are supported at this time"
msgstr "当å‰åªæ”¯æŒçº¯æ–‡æœ¬ç±»åž‹çš„å‚考文件与其工作文件比较比较差异"
-#: ../libsvn_client/diff.c:2221
-msgid ""
-"Summarized diffs are only supported between a path's text-base and its "
-"working files at this time"
-msgstr "当å‰æ¦‚è¦å·®å¼‚åªæ”¯æŒå‚考文件与其工作文件比较"
-
-#: ../libsvn_client/diff.c:2582 ../libsvn_client/diff.c:2648
+#: ../libsvn_client/diff.c:2369 ../libsvn_client/diff.c:2455
msgid "Cannot ignore properties and show only properties at the same time"
-msgstr ""
+msgstr "ä¸èƒ½åœ¨å¿½ç•¥å±žæ€§çš„åŒæ—¶ï¼Œåªæ˜¾ç¤ºå±žæ€§"
-#: ../libsvn_client/diff_local.c:609
-#, c-format
-msgid "'%s' is not the same node kind as '%s'"
-msgstr "'%s' 与 '%s' 的节点类型ä¸åŒ"
-
-#: ../libsvn_client/diff_local.c:629 ../libsvn_wc/props.c:1568
+#: ../libsvn_client/diff_local.c:792 ../libsvn_wc/props.c:1673
#, c-format
msgid "'%s' is not a file or directory"
msgstr "“%sâ€ä¸æ˜¯æ–‡ä»¶æˆ–目录"
@@ -1788,176 +1850,180 @@ msgstr "“%s†ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ EOL 值"
msgid "Destination directory exists, and will not be overwritten unless forced"
msgstr "目的目录已存在,除éžå¼ºè¿«ä¸ºä¹‹ï¼Œå¦åˆ™ä¸ä¼šè¦†ç›–"
-#: ../libsvn_client/export.c:265 ../libsvn_client/export.c:1525
-#: ../libsvn_wc/adm_crawler.c:1204 ../libsvn_wc/conflicts.c:1293
-#: ../libsvn_wc/copy.c:586 ../libsvn_wc/crop.c:235 ../libsvn_wc/crop.c:326
-#: ../libsvn_wc/info.c:403 ../libsvn_wc/node.c:704 ../libsvn_wc/props.c:227
-#: ../libsvn_wc/status.c:2781 ../libsvn_wc/wc_db.c:2497
-#: ../libsvn_wc/wc_db.c:2691 ../libsvn_wc/wc_db.c:2715
-#: ../libsvn_wc/wc_db.c:2873 ../libsvn_wc/wc_db.c:3864
-#: ../libsvn_wc/wc_db.c:5883 ../libsvn_wc/wc_db.c:6203
-#: ../libsvn_wc/wc_db.c:6364 ../libsvn_wc/wc_db.c:6518
-#: ../libsvn_wc/wc_db.c:8343 ../libsvn_wc/wc_db.c:8800
-#: ../libsvn_wc/wc_db.c:9429 ../libsvn_wc/wc_db.c:9576
-#: ../libsvn_wc/wc_db.c:9716 ../libsvn_wc/wc_db.c:10066
-#: ../libsvn_wc/wc_db.c:11553 ../libsvn_wc/wc_db.c:11629
-#: ../libsvn_wc/wc_db.c:13163 ../libsvn_wc/wc_db.c:13223
-#: ../libsvn_wc/wc_db.c:13361 ../libsvn_wc/wc_db.c:13519
-#: ../libsvn_wc/wc_db.c:13956 ../libsvn_wc/wc_db.c:14737
+#: ../libsvn_client/export.c:265 ../libsvn_client/export.c:1527
+#: ../libsvn_wc/adm_crawler.c:1216 ../libsvn_wc/conflicts.c:1173
+#: ../libsvn_wc/copy.c:649 ../libsvn_wc/crop.c:236 ../libsvn_wc/crop.c:327
+#: ../libsvn_wc/info.c:403 ../libsvn_wc/node.c:667 ../libsvn_wc/props.c:202
+#: ../libsvn_wc/status.c:2713 ../libsvn_wc/wc_db.c:2133
+#: ../libsvn_wc/wc_db.c:2574 ../libsvn_wc/wc_db.c:2803
+#: ../libsvn_wc/wc_db.c:2827 ../libsvn_wc/wc_db.c:2985
+#: ../libsvn_wc/wc_db.c:3983 ../libsvn_wc/wc_db.c:6042
+#: ../libsvn_wc/wc_db.c:6362 ../libsvn_wc/wc_db.c:6531
+#: ../libsvn_wc/wc_db.c:6697 ../libsvn_wc/wc_db.c:7748
+#: ../libsvn_wc/wc_db.c:8707 ../libsvn_wc/wc_db.c:9400
+#: ../libsvn_wc/wc_db.c:10031 ../libsvn_wc/wc_db.c:10178
+#: ../libsvn_wc/wc_db.c:10318 ../libsvn_wc/wc_db.c:10668
+#: ../libsvn_wc/wc_db.c:12136 ../libsvn_wc/wc_db.c:12204
+#: ../libsvn_wc/wc_db.c:12530 ../libsvn_wc/wc_db.c:13623
+#: ../libsvn_wc/wc_db.c:13683 ../libsvn_wc/wc_db.c:13821
+#: ../libsvn_wc/wc_db.c:13980 ../libsvn_wc/wc_db.c:14421
+#: ../libsvn_wc/wc_db.c:15202
#, c-format
msgid "The node '%s' was not found."
msgstr "找ä¸åˆ°èŠ‚点 '%s'。"
-#: ../libsvn_client/export.c:283 ../libsvn_client/export.c:1182
-#: ../libsvn_client/export.c:1239
+#: ../libsvn_client/export.c:285 ../libsvn_client/export.c:1184
+#: ../libsvn_client/export.c:1241
#, c-format
msgid "Destination file '%s' exists, and will not be overwritten unless forced"
msgstr "目标文件“%sâ€å·²å­˜åœ¨ï¼Œé™¤éžå¼ºè¿«ä¸ºä¹‹ï¼Œå¦åˆ™ä¸ä¼šè¢«è¦†ç›–"
-#: ../libsvn_client/export.c:289 ../libsvn_client/export.c:1187
-#: ../libsvn_client/export.c:1244
+#: ../libsvn_client/export.c:291 ../libsvn_client/export.c:1189
+#: ../libsvn_client/export.c:1246
#, c-format
msgid "Destination '%s' exists. Cannot overwrite directory with non-directory"
msgstr "目标“%sâ€å·²å­˜åœ¨ã€‚ä¸èƒ½ç”¨éžç›®å½•è¦†ç›–目录"
-#: ../libsvn_client/export.c:471 ../libsvn_client/export.c:620
-#: ../libsvn_client/export.c:1076
+#: ../libsvn_client/export.c:473 ../libsvn_client/export.c:622
+#: ../libsvn_client/export.c:1078
#, c-format
msgid "'%s' exists and is not a directory"
msgstr "“%s†已存在且ä¸æ˜¯ç›®å½•"
-#: ../libsvn_client/export.c:475 ../libsvn_client/export.c:624
-#: ../libsvn_client/export.c:1080
+#: ../libsvn_client/export.c:477 ../libsvn_client/export.c:626
+#: ../libsvn_client/export.c:1082
#, c-format
msgid "'%s' already exists"
msgstr "“%s†已存在"
-#: ../libsvn_client/externals.c:406
+#: ../libsvn_client/externals.c:440
#, c-format
-msgid ""
-"Cannot insert a file external defined on '%s' into the working copy '%s'."
+msgid "Cannot insert a file external defined on '%s' into the working copy '%s'."
msgstr "ä¸èƒ½å°†åœ¨â€œ%sâ€å®šä¹‰çš„文件外部引用æ’入到工作副本“%sâ€ã€‚"
-#: ../libsvn_client/externals.c:431
+#: ../libsvn_client/externals.c:465
#, c-format
-msgid ""
-"The file external from '%s' cannot overwrite the existing versioned item at "
-"'%s'"
+msgid "The file external from '%s' cannot overwrite the existing versioned item at '%s'"
msgstr "æ¥æºäºŽ “%s†的外部引用的文件ä¸èƒ½è¦†å†™ä½äºŽ “%s†的已存版本控制æ¡ç›®"
-#: ../libsvn_client/externals.c:444
+#: ../libsvn_client/externals.c:479
#, c-format
msgid "The file external '%s' can not be created because the node exists."
msgstr "ä¸èƒ½åˆ›å»ºæ–‡ä»¶å¤–部引用 '%s',节点已ç»å­˜åœ¨ã€‚"
-#: ../libsvn_client/externals.c:703
+#: ../libsvn_client/externals.c:757
#, c-format
msgid "URL '%s' at revision %ld doesn't exist"
msgstr "URL “%s†在版本 %ld 中ä¸å­˜åœ¨"
-#: ../libsvn_client/externals.c:708
+#: ../libsvn_client/externals.c:762
#, c-format
msgid "URL '%s' at revision %ld is not a file or a directory"
msgstr "URL “%s†在版本 %ld 中ä¸æ˜¯æ–‡ä»¶æˆ–目录"
-#: ../libsvn_client/externals.c:786
+#: ../libsvn_client/externals.c:840
#, c-format
-msgid ""
-"Unsupported external: URL of file external '%s' is not in repository '%s'"
+msgid "Unsupported external: URL of file external '%s' is not in repository '%s'"
msgstr "ä¸æ”¯æŒçš„外部对象:文件外部对象“%sâ€çš„ URL ä¸åœ¨ç‰ˆæœ¬åº““%sâ€ä¸­"
-#: ../libsvn_client/externals.c:979
+#: ../libsvn_client/externals.c:1036
#, c-format
msgid "Traversal of '%s' found no ambient depth"
msgstr "在 “%s†中找ä¸åˆ°æ·±åº¦"
-#: ../libsvn_client/import.c:159
+#: ../libsvn_client/import.c:149
#, c-format
msgid "%s property on '%s' contains unrecognized EOL-style '%s'"
msgstr "属性 %s (对象 '%s') 包å«ä¸å¯è¯†åˆ«çš„行结æŸç¬¦å· '%s'"
-#: ../libsvn_client/import.c:489
+#: ../libsvn_client/import.c:479
#, c-format
msgid "Unknown or unversionable type for '%s'"
msgstr "“%s†是未知类型或ä¸å¯çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶"
-#: ../libsvn_client/import.c:707
+#: ../libsvn_client/import.c:706
msgid "New entry name required when importing a file"
msgstr "导入文件时,需è¦ä¸€ä¸ªæ–°çš„æ¡ç›®å称"
-#: ../libsvn_client/import.c:758 ../libsvn_client/patch.c:3016
-#: ../libsvn_client/patch.c:3028 ../libsvn_wc/delete.c:93
+#: ../libsvn_client/import.c:757 ../libsvn_client/patch.c:3131
+#: ../libsvn_client/patch.c:3143 ../libsvn_wc/delete.c:93
#: ../libsvn_wc/lock.c:121 ../libsvn_wc/wc_db_wcroot.c:77
#, c-format
msgid "'%s' does not exist"
msgstr "“%s†ä¸å­˜åœ¨"
-#: ../libsvn_client/import.c:891
+#: ../libsvn_client/import.c:907
#, c-format
msgid "'%s' is a reserved name and cannot be imported"
msgstr "“%s†是ä¿ç•™å称,无法被导入"
-#: ../libsvn_client/info.c:310 ../libsvn_client/list.c:376
+#: ../libsvn_client/info.c:398 ../libsvn_client/list.c:272
+#: ../svn-bench/null-info-cmd.c:148
#, c-format
msgid "URL '%s' non-existent in revision %ld"
msgstr "URL “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_client/locking_commands.c:266
-#: ../libsvn_client/locking_commands.c:292
+#: ../libsvn_client/locking_commands.c:273
msgid "No common parent found, unable to operate on disjoint arguments"
msgstr "没有找到公共父节点,ä¸èƒ½åœ¨åˆ†ç¦»çš„å‚数上æ“作"
-#: ../libsvn_client/locking_commands.c:325
+#: ../libsvn_client/locking_commands.c:382
#, c-format
msgid "The node '%s' is not a file"
msgstr "节点 '%s' ä¸æ˜¯æ–‡ä»¶"
-#: ../libsvn_client/locking_commands.c:345
+#: ../libsvn_client/locking_commands.c:402
msgid "Unable to lock/unlock across multiple repositories"
msgstr "ä¸èƒ½è·¨è¶Šå¤šä¸ªç‰ˆæœ¬åº“进行é”定/解é”"
-#: ../libsvn_client/locking_commands.c:400
+#: ../libsvn_client/locking_commands.c:443
#, c-format
msgid "'%s' is not locked in this working copy"
msgstr "“%s†没有在工作副本中é”定"
-#: ../libsvn_client/locking_commands.c:450
+#: ../libsvn_client/locking_commands.c:496
#, c-format
msgid "'%s' is not locked"
msgstr "“%s†没有被é”定"
-#: ../libsvn_client/locking_commands.c:483 ../libsvn_fs/fs-loader.c:1411
-#: ../libsvn_ra/ra_loader.c:1074
+#: ../libsvn_client/locking_commands.c:530 ../libsvn_fs/fs-loader.c:1596
+#: ../libsvn_ra/ra_loader.c:1219
msgid "Lock comment contains illegal characters"
msgstr "é”定注释包å«éžæ³•å­—符"
-#: ../libsvn_client/log.c:309
+#: ../libsvn_client/log.c:134 ../libsvn_client/ra.c:529
+#: ../libsvn_client/ra.c:864
+#, c-format
+msgid "'%s' has no URL"
+msgstr "“%s†没有 URL"
+
+#: ../libsvn_client/log.c:347
msgid "No valid target found"
msgstr "没有å‘现åˆæ³•ç›®æ ‡"
-#: ../libsvn_client/log.c:340
+#: ../libsvn_client/log.c:378
#, c-format
msgid "'%s' is not a relative path"
msgstr "'%s' ä¸æ˜¯ç›¸å¯¹è·¯å¾„"
-#: ../libsvn_client/log.c:366
+#: ../libsvn_client/log.c:404
msgid "When specifying working copy paths, only one target may be given"
msgstr "当指定工作副本路径时,åªèƒ½ç»™å‡ºä¸€ä¸ªç›®æ ‡"
-#: ../libsvn_client/log.c:390 ../libsvn_client/revisions.c:189
+#: ../libsvn_client/log.c:428 ../libsvn_client/revisions.c:190
msgid "PREV, BASE, or COMMITTED revision keywords are invalid for URL"
msgstr "对于 URL,版本关键字 PREV,BASE,或 COMMITTED éžæ³•"
-#: ../libsvn_client/log.c:523 ../libsvn_client/log.c:830
+#: ../libsvn_client/log.c:561 ../libsvn_client/log.c:868
msgid "Missing required revision specification"
msgstr "未æ供请求的版本"
-#: ../libsvn_client/merge.c:439
+#: ../libsvn_client/merge.c:442
#, c-format
msgid "URL '%s' of '%s' is not in repository '%s'"
msgstr "URL“%sâ€(本地路径“%sâ€)ä¸åœ¨ç‰ˆæœ¬åº““%sâ€ä¸­"
-#: ../libsvn_client/merge.c:476
+#: ../libsvn_client/merge.c:479
#, c-format
msgid "'%s' must be from the same repository as '%s'"
msgstr "“%sâ€å¿…须与“%sâ€åœ¨åŒä¸€ä¸ªç‰ˆæœ¬åº“中"
@@ -1965,27 +2031,26 @@ msgstr "“%sâ€å¿…须与“%sâ€åœ¨åŒä¸€ä¸ªç‰ˆæœ¬åº“中"
#. xgettext: the '.working', '.merge-left.r%ld' and
#. '.merge-right.r%ld' strings are used to tag onto a file
#. name in case of a merge conflict
-#: ../libsvn_client/merge.c:2028
-msgid ".working"
-msgstr ".working"
+#: ../libsvn_client/merge.c:2081
+#, c-format
+msgid ".working%s%s"
+msgstr ".working%s%s"
-#: ../libsvn_client/merge.c:2030
+#: ../libsvn_client/merge.c:2084
#, c-format
-msgid ".merge-left.r%ld"
-msgstr ".merge-left.r%ld"
+msgid ".merge-left.r%ld%s%s"
+msgstr ".merge-left.r%ld%s%s"
-#: ../libsvn_client/merge.c:2033
+#: ../libsvn_client/merge.c:2088
#, c-format
-msgid ".merge-right.r%ld"
-msgstr ".merge-right.r%ld"
+msgid ".merge-right.r%ld%s%s"
+msgstr ".merge-right.r%ld%s%s"
-#: ../libsvn_client/merge.c:4681
-msgid ""
-"Cannot reverse-merge a range from a path's own future history; try updating "
-"first"
+#: ../libsvn_client/merge.c:4743
+msgid "Cannot reverse-merge a range from a path's own future history; try updating first"
msgstr "ä¸èƒ½ä»Žè·¯å¾„的未æ¥åŽ†å²ä¸­åå‘åˆå¹¶èŒƒå›´ï¼›è¯·å…ˆæ›´æ–°"
-#: ../libsvn_client/merge.c:5416
+#: ../libsvn_client/merge.c:5478
#, c-format
msgid ""
"One or more conflicts were produced while merging r%ld:%ld into\n"
@@ -1996,251 +2061,318 @@ msgstr ""
"当åˆå¹¶ r%ld:%ld 到 “%s†时出现了一个或更多的冲çª\n"
"请解决所有冲çªåŽï¼Œå†æ¬¡è¿è¡Œåˆå¹¶ï¼Œå¤„ç†å‰©ä½™çš„未åˆå¹¶ç‰ˆæœ¬"
-#: ../libsvn_client/merge.c:6231
+#: ../libsvn_client/merge.c:6293
#, c-format
msgid "Invalid mergeinfo detected on '%s', merge tracking not possible"
-msgstr "在“%sâ€æ£€æµ‹åˆ°éžæ³•çš„åˆå¹¶ä¿¡æ¯ï¼›åˆå¹¶è·Ÿè¸ªæ˜¯ä¸å¯èƒ½çš„"
+msgstr "在“%sâ€å‘现了éžæ³•çš„åˆå¹¶ä¿¡æ¯ï¼›åˆå¹¶è·Ÿè¸ªæ˜¯ä¸å¯èƒ½çš„"
-#: ../libsvn_client/merge.c:6380
-msgid ""
-"Merge tracking not allowed with missing subtrees; try restoring these items "
-"first:\n"
+#: ../libsvn_client/merge.c:6442
+msgid "Merge tracking not allowed with missing subtrees; try restoring these items first:\n"
msgstr "åˆå¹¶è·Ÿè¸ªä¸å…许丢失å­æ ‘; 请先æ¢å¤è¿™äº›é¡¹ç›®:\n"
-#: ../libsvn_client/merge.c:7380
+#: ../libsvn_client/merge.c:7443
#, c-format
-msgid ""
-"Invalid mergeinfo detected on merge target '%s', merge tracking not possible"
-msgstr "在åˆå¹¶ç›®æ ‡â€œ%sâ€æ£€æµ‹åˆ°éžæ³•çš„åˆå¹¶ä¿¡æ¯ï¼›åˆå¹¶è·Ÿè¸ªæ˜¯ä¸å¯èƒ½çš„"
+msgid "Invalid mergeinfo detected on merge target '%s', merge tracking not possible"
+msgstr "在åˆå¹¶ç›®æ ‡â€œ%sâ€å‘现了éžæ³•çš„åˆå¹¶ä¿¡æ¯ï¼›åˆå¹¶è·Ÿè¸ªæ˜¯ä¸å¯èƒ½çš„"
-#: ../libsvn_client/merge.c:9698
+#: ../libsvn_client/merge.c:9761
msgid "Use of two URLs is not compatible with mergeinfo modification"
msgstr "使用两个 URL 与åˆå¹¶ä¿¡æ¯ä¿®æ”¹ä¸å…¼å®¹"
-#: ../libsvn_client/merge.c:9705 ../libsvn_client/merge.c:10030
-msgid ""
-"Merge from foreign repository is not compatible with mergeinfo modification"
+#: ../libsvn_client/merge.c:9768 ../libsvn_client/merge.c:10103
+msgid "Merge from foreign repository is not compatible with mergeinfo modification"
msgstr "从外部版本库åˆå¹¶ä¸Žåˆå¹¶ä¿¡æ¯ä¿®æ”¹ä¸å…¼å®¹"
-#: ../libsvn_client/merge.c:10123 ../libsvn_client/merge.c:10266
+#: ../libsvn_client/merge.c:10196 ../libsvn_client/merge.c:10339
#, c-format
msgid "Merge target '%s' does not exist in the working copy"
msgstr "åˆå¹¶ç›®æ ‡ “%s†ä¸åœ¨å·¥ä½œå‰¯æœ¬ä¸­"
-#: ../libsvn_client/merge.c:10146
+#: ../libsvn_client/merge.c:10219
msgid "Cannot determine revision of working copy"
msgstr "ä¸èƒ½ç¡®å®šå·¥ä½œå‰¯æœ¬çš„版本"
-#: ../libsvn_client/merge.c:10152
+#: ../libsvn_client/merge.c:10225
#, c-format
-msgid ""
-"Cannot merge into mixed-revision working copy [%ld:%ld]; try updating first"
+msgid "Cannot merge into mixed-revision working copy [%ld:%ld]; try updating first"
msgstr "ä¸èƒ½åˆå¹¶åˆ°æœ‰æ··åˆç‰ˆæœ¬çš„工作副本 [%ld:%ld] 中;请先更新"
-#: ../libsvn_client/merge.c:10167
+#: ../libsvn_client/merge.c:10240
msgid "Cannot merge into a working copy with a switched subtree"
msgstr "ä¸èƒ½åˆå¹¶åˆ°å·²ç»åˆ‡æ¢å­ç›®å½•çš„工作副本中"
-#: ../libsvn_client/merge.c:10183
+#: ../libsvn_client/merge.c:10256
msgid "Cannot merge into a working copy that has local modifications"
msgstr "ä¸èƒ½åˆå¹¶åˆ°æœ‰æœ¬åœ°ä¿®æ”¹çš„工作副本中"
-#: ../libsvn_client/merge.c:10203 ../svn/merge-cmd.c:60
+#: ../libsvn_client/merge.c:10276 ../svn/merge-cmd.c:56
#, c-format
-msgid ""
-"Invalid merge source '%s'; a working copy path can only be used with a "
-"repository revision (a number, a date, or head)"
+msgid "Invalid merge source '%s'; a working copy path can only be used with a repository revision (a number, a date, or head)"
msgstr ""
-#: ../libsvn_client/merge.c:10526 ../svn/merge-cmd.c:127
+#: ../libsvn_client/merge.c:10594 ../svn/merge-cmd.c:123
msgid "Merge sources must both be either paths or URLs"
msgstr "åˆå¹¶æºå¿…é¡»åŒæ—¶æ˜¯è·¯å¾„或 URL"
-#: ../libsvn_client/merge.c:11287 ../libsvn_client/merge.c:11449
-#: ../libsvn_client/merge.c:12321
+#: ../libsvn_client/merge.c:11355 ../libsvn_client/merge.c:11517
+#: ../libsvn_client/merge.c:12413
#, c-format
msgid "'%s@%ld' must be ancestrally related to '%s@%ld'"
msgstr "“%s@%ldâ€å¿…须与“%s@%ldâ€æœ‰ç¥–先关系"
-#: ../libsvn_client/merge.c:11399
+#: ../libsvn_client/merge.c:11467
#, c-format
-msgid ""
-"Neither the reintegrate source nor target can be the root of the repository"
+msgid "Neither the reintegrate source nor target can be the root of the repository"
msgstr "å¤å…´æºæˆ–目标都ä¸èƒ½æ˜¯ç‰ˆæœ¬åº“的根。"
-#: ../libsvn_client/merge.c:11409
+#: ../libsvn_client/merge.c:11477
msgid "Reintegrate merge not possible"
msgstr "å¤å…´åˆå¹¶æ˜¯ä¸å¯èƒ½çš„"
-#: ../libsvn_client/merge.c:11482
+#: ../libsvn_client/merge.c:11547
+msgid " Missing ranges: "
+msgstr " 丢失的范围: "
+
+#: ../libsvn_client/merge.c:11550
#, c-format
msgid ""
-"Reintegrate can only be used if revisions %ld through %ld were previously "
-"merged from %s to the reintegrate source, but this is not the case:\n"
+"Reintegrate can only be used if revisions %ld through %ld were previously merged from %s to the reintegrate source, but this is not the case:\n"
"%s"
msgstr ""
-"å¤å…´åªèƒ½ç”¨äºŽç‰ˆæœ¬ %ld 到 %ld 以å‰æ›¾ç»ä»Ž %s åˆå¹¶åˆ°å¤å…´æºçš„情况,但是现在ä¸æ˜¯è¿™"
-"ç§æƒ…况:\n"
+"å¤å…´åªèƒ½ç”¨äºŽç‰ˆæœ¬ %ld 到 %ld 以å‰æ›¾ç»ä»Ž %s åˆå¹¶åˆ°å¤å…´æºçš„情况,但是现在ä¸æ˜¯è¿™ç§æƒ…况:\n"
"%s"
-#: ../libsvn_client/merge.c:11544
+#: ../libsvn_client/merge.c:11612
#, c-format
-msgid ""
-"Can't reintegrate into '%s' because it is locally added and therefore not "
-"related to the merge source"
+msgid "Can't reintegrate into '%s' because it is locally added and therefore not related to the merge source"
msgstr ""
-#: ../libsvn_client/merge.c:11812
+#: ../libsvn_client/merge.c:11880
msgid "Cannot merge automatically while ignoring mergeinfo"
msgstr ""
-#: ../libsvn_client/merge.c:12537
-msgid ""
-"The required merge is reintegrate-like, and the record-only option cannot be "
-"used with this kind of merge"
+#: ../libsvn_client/merge.c:12635
+msgid "The required merge is reintegrate-like, and the record-only option cannot be used with this kind of merge"
msgstr ""
-#: ../libsvn_client/merge.c:12543
-msgid ""
-"The required merge is reintegrate-like, and the depth option cannot be used "
-"with this kind of merge"
+#: ../libsvn_client/merge.c:12641
+msgid "The required merge is reintegrate-like, and the depth option cannot be used with this kind of merge"
msgstr ""
-#: ../libsvn_client/merge.c:12549
-msgid ""
-"The required merge is reintegrate-like, and the force_delete option cannot "
-"be used with this kind of merge"
+#: ../libsvn_client/merge.c:12647
+msgid "The required merge is reintegrate-like, and the force_delete option cannot be used with this kind of merge"
msgstr ""
-#: ../libsvn_client/mergeinfo.c:1700
+#: ../libsvn_client/mergeinfo.c:1715
msgid "Only depths 'infinity' and 'empty' are currently supported"
msgstr "当å‰ä»…支æŒæ·±åº¦ 'infinity' å’Œ 'empty'"
-#: ../libsvn_client/patch.c:279
+#: ../libsvn_client/mtcc.c:166
+#, c-format
+msgid "Can't operate on '%s' because '%s' is not a directory"
+msgstr "ä¸èƒ½é’ˆå¯¹â€œ%sâ€æ“作,因为“%sâ€ä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_client/mtcc.c:319
+#, c-format
+msgid "No origin found for node at '%s'"
+msgstr ""
+
+#: ../libsvn_client/mtcc.c:357
+#, c-format
+msgid "No such revision %ld (HEAD is %ld)"
+msgstr "没有版本 %ld (HEAD 是 %ld)"
+
+#: ../libsvn_client/mtcc.c:405
+#, c-format
+msgid "'%s' is not an ancestor of '%s'"
+msgstr "“%sâ€ä¸æ˜¯â€œ%sâ€çš„祖先"
+
+#: ../libsvn_client/mtcc.c:504
+#, c-format
+msgid "Can't add file at '%s'"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€å¢žåŠ æ–‡ä»¶"
+
+#: ../libsvn_client/mtcc.c:536 ../libsvn_client/ra.c:705
+#: ../libsvn_fs_fs/fs_fs.c:1365 ../libsvn_fs_fs/rev_file.c:177
+#: ../libsvn_fs_fs/rev_file.c:189 ../libsvn_fs_x/fs_x.c:667
+#: ../libsvn_fs_x/rev_file.c:190 ../libsvn_repos/log.c:2343
+#: ../libsvn_repos/log.c:2347
+#, c-format
+msgid "No such revision %ld"
+msgstr "没有版本 %ld"
+
+#: ../libsvn_client/mtcc.c:558
+#, c-format
+msgid "Can't add node at '%s'"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€å¢žåŠ èŠ‚点"
+
+#: ../libsvn_client/mtcc.c:585
+#, c-format
+msgid "Can't delete node at '%s' as it does not exist"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€åˆ é™¤èŠ‚点,因为它并ä¸å­˜åœ¨"
+
+#: ../libsvn_client/mtcc.c:602
+#, c-format
+msgid "Can't delete node at '%s'"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€åˆ é™¤èŠ‚点"
+
+#: ../libsvn_client/mtcc.c:639
+#, c-format
+msgid "Can't create directory at '%s'"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€åˆ›å»ºç›®å½•"
+
+#: ../libsvn_client/mtcc.c:778 ../libsvn_client/prop_commands.c:281
+#: ../libsvn_client/prop_commands.c:476
+#, c-format
+msgid "Bad property name: '%s'"
+msgstr "属性å称错误: “%sâ€"
+
+#: ../libsvn_client/mtcc.c:782 ../libsvn_client/prop_commands.c:274
+#, c-format
+msgid "Revision property '%s' not allowed in this context"
+msgstr "此上下文中ä¸å…许版本属性 “%sâ€"
+
+#: ../libsvn_client/mtcc.c:787 ../libsvn_client/prop_commands.c:60
+#, c-format
+msgid "'%s' is a wcprop, thus not accessible to clients"
+msgstr "“%s†是一个工作副本属性,应此ä¸èƒ½è¢«å®¢æˆ·ç«¯å­˜å–"
+
+#: ../libsvn_client/mtcc.c:797
+msgid "Error normalizing property value"
+msgstr "规格化属性值出错"
+
+#: ../libsvn_client/mtcc.c:832 ../libsvn_client/mtcc.c:855
+#, c-format
+msgid "Can't set properties at not existing '%s'"
+msgstr "ä¸èƒ½åœ¨ä¸å­˜åœ¨çš„“%sâ€ä¸Šè®¾ç½®å±žæ€§"
+
+#: ../libsvn_client/mtcc.c:903
+#, c-format
+msgid "Can't update '%s' because it is not a file"
+msgstr "ä¸èƒ½æ›´æ–° '%s',因为它ä¸æ˜¯æ–‡ä»¶"
+
+#: ../libsvn_client/mtcc.c:914
+#, c-format
+msgid "Can't update file at '%s'"
+msgstr "ä¸èƒ½åœ¨â€œ%sâ€æ›´æ–°æ–‡ä»¶"
+
+#: ../libsvn_client/mtcc.c:979
+#, c-format
+msgid "Can't perform directory operation on '%s' as it is not a directory"
+msgstr "ä¸èƒ½å¯¹â€œ%sâ€æ‰§è¡Œç›®å½•æ“作,因为它ä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_client/mtcc.c:989
+#, c-format
+msgid "Can't perform file operation on '%s' as it is not a file"
+msgstr "ä¸èƒ½å¯¹â€œ%sâ€æ‰§è¡Œæ–‡ä»¶æ“作,因为它ä¸æ˜¯æ–‡ä»¶"
+
+#: ../libsvn_client/mtcc.c:996
+#, c-format
+msgid "Can't open '%s' as it does not exist"
+msgstr "ä¸èƒ½æ‰“开“%sâ€ï¼Œå› ä¸ºå®ƒä¸å­˜åœ¨"
+
+#: ../libsvn_client/mtcc.c:1388
+#, c-format
+msgid "Can't commit to '%s' because it is not a directory"
+msgstr "ä¸èƒ½æ交到“%sâ€ï¼Œå› ä¸ºä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_client/patch.c:283
#, c-format
msgid "Cannot strip %u components from '%s'"
msgstr "ä¸èƒ½ä¿®å‰ª %u 个组件于“%sâ€"
-#: ../libsvn_client/patch.c:910
+#: ../libsvn_client/patch.c:914
msgid "Invalid link representation"
-msgstr "éžæ³•é“¾æŽ¥è¡¨è¿°"
+msgstr "éžæ³•é“¾æŽ¥è¡¨ç¤º"
-#: ../libsvn_client/patch.c:3005
+#: ../libsvn_client/patch.c:3120
msgid "strip count must be positive"
msgstr "修剪计数å–值必须为正"
-#: ../libsvn_client/patch.c:3021 ../libsvn_fs_base/tree.c:3978
-#: ../libsvn_fs_base/tree.c:3983 ../libsvn_fs_fs/tree.c:3047
-#: ../libsvn_fs_fs/tree.c:3052 ../libsvn_ra/compat.c:675
-#: ../libsvn_ra_local/ra_plugin.c:1144
+#: ../libsvn_client/patch.c:3136 ../libsvn_fs_base/tree.c:4081
+#: ../libsvn_fs_base/tree.c:4086 ../libsvn_fs_fs/tree.c:3176
+#: ../libsvn_fs_fs/tree.c:3181 ../libsvn_fs_x/tree.c:3105
+#: ../libsvn_fs_x/tree.c:3110 ../libsvn_ra/compat.c:677
+#: ../libsvn_ra_local/ra_plugin.c:1196
#, c-format
msgid "'%s' is not a file"
msgstr "“%sâ€ä¸æ˜¯ä¸€ä¸ªæ–‡ä»¶"
-#: ../libsvn_client/patch.c:3033 ../libsvn_wc/util.c:59
+#: ../libsvn_client/patch.c:3148 ../libsvn_wc/util.c:59
#, c-format
msgid "'%s' is not a directory"
msgstr "“%sâ€ä¸æ˜¯ç›®å½•"
-#: ../libsvn_client/prop_commands.c:60
-#, c-format
-msgid "'%s' is a wcprop, thus not accessible to clients"
-msgstr "“%s†是一个工作副本属性,应此ä¸èƒ½è¢«å®¢æˆ·ç«¯å­˜å–"
-
#: ../libsvn_client/prop_commands.c:155
#, c-format
msgid "Property '%s' is not a regular property"
msgstr "属性 “%s†ä¸æ˜¯å¸¸è§„属性"
-#: ../libsvn_client/prop_commands.c:266
-#, c-format
-msgid "Revision property '%s' not allowed in this context"
-msgstr "此上下文中ä¸å…许版本属性 “%sâ€"
-
-#: ../libsvn_client/prop_commands.c:273 ../libsvn_client/prop_commands.c:468
-#, c-format
-msgid "Bad property name: '%s'"
-msgstr "属性å称错误: “%sâ€"
-
-#: ../libsvn_client/prop_commands.c:301
+#: ../libsvn_client/prop_commands.c:309
msgid "Targets must be working copy paths"
msgstr "目标必须是工作副本路径"
-#: ../libsvn_client/prop_commands.c:362
+#: ../libsvn_client/prop_commands.c:370
msgid "Targets must be URLs"
msgstr "目标必须是 URL"
-#: ../libsvn_client/prop_commands.c:372
+#: ../libsvn_client/prop_commands.c:380
msgid "Setting property on non-local targets needs a base revision"
msgstr "设定éžæœ¬åœ°ç›®æ ‡çš„属性需è¦ç‰ˆæœ¬å‚æ•°"
-#: ../libsvn_client/prop_commands.c:387
+#: ../libsvn_client/prop_commands.c:395
#, c-format
msgid "Setting property '%s' on non-local targets is not supported"
msgstr "ä¸æ”¯æŒå¯¹éžæœ¬åœ°ç›®æ ‡è®¾ç½®å±žæ€§â€œ%sâ€"
-#: ../libsvn_client/prop_commands.c:415
+#: ../libsvn_client/prop_commands.c:423
#, c-format
-msgid ""
-"revprop '%s' in r%ld is unexpectedly absent in repository (maybe someone "
-"else deleted it?)"
+msgid "revprop '%s' in r%ld is unexpectedly absent in repository (maybe someone else deleted it?)"
msgstr "revprop “%s†于版本 r%ld 出乎æ„料地ä¸åœ¨ç‰ˆæœ¬åº“中(å¯èƒ½æŸäººåˆ é™¤äº†ï¼Ÿ)"
-#: ../libsvn_client/prop_commands.c:424
+#: ../libsvn_client/prop_commands.c:432
#, c-format
-msgid ""
-"revprop '%s' in r%ld has unexpected value in repository (maybe someone else "
-"changed it?)"
+msgid "revprop '%s' in r%ld has unexpected value in repository (maybe someone else changed it?)"
msgstr "revprop “%s†于版本 r%ld 在版本库中出乎æ„料地å–值(å¯èƒ½æŸäººä¿®æ”¹äº†ï¼Ÿ)"
-#: ../libsvn_client/prop_commands.c:432
+#: ../libsvn_client/prop_commands.c:440
#, c-format
-msgid ""
-"revprop '%s' in r%ld is unexpectedly present in repository (maybe someone "
-"else set it?)"
+msgid "revprop '%s' in r%ld is unexpectedly present in repository (maybe someone else set it?)"
msgstr "revprop “%s†于版本 r%ld 出乎æ„料地在版本库中(å¯èƒ½æŸäººè®¾ç½®äº†ï¼Ÿ)"
-#: ../libsvn_client/prop_commands.c:463
-msgid ""
-"Author name should not contain a newline; value will not be set unless forced"
+#: ../libsvn_client/prop_commands.c:471
+msgid "Author name should not contain a newline; value will not be set unless forced"
msgstr "作者å称ä¸èƒ½åŒ…å«æ¢è¡Œï¼›é™¤éžå¼ºè¿«ä¸ºä¹‹ï¼Œå¦åˆ™å…¶å€¼ä¸ä¼šè¢«è®¾å®š"
-#: ../libsvn_client/prop_commands.c:577
+#: ../libsvn_client/prop_commands.c:585
#, c-format
msgid "'%s' does not exist in revision %ld"
msgstr "没有路径 “%s†在版本 %ld 中"
-#: ../libsvn_client/prop_commands.c:583 ../libsvn_client/prop_commands.c:1096
-#: ../libsvn_wc/crop.c:167
+#: ../libsvn_client/prop_commands.c:591 ../libsvn_client/prop_commands.c:1100
+#: ../libsvn_wc/crop.c:168
#, c-format
msgid "Unknown node kind for '%s'"
msgstr "“%s†是未知的节点类型"
-#: ../libsvn_client/ra.c:161
+#: ../libsvn_client/ra.c:164
#, c-format
msgid "Attempt to set wcprop '%s' on '%s' in a non-commit operation"
msgstr "试图在éžæ交æ“作中,设定工作副本属性 “%s†于 “%sâ€"
-#: ../libsvn_client/ra.c:415
+#: ../libsvn_client/ra.c:443
#, c-format
msgid "Redirect cycle detected for URL '%s'"
msgstr "z在 URL '%s' 检测到循环é‡å®šå‘"
-#: ../libsvn_client/ra.c:501 ../libsvn_client/ra.c:812
-#, c-format
-msgid "'%s' has no URL"
-msgstr "“%s†没有 URL"
-
-#: ../libsvn_client/ra.c:679 ../libsvn_ra/compat.c:395
+#: ../libsvn_client/ra.c:731 ../libsvn_ra/compat.c:397
#, c-format
msgid "Unable to find repository location for '%s' in revision %ld"
msgstr "“%s†的版本库ä½ç½®ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_client/ra.c:691
+#: ../libsvn_client/ra.c:743
#, c-format
-msgid ""
-"The location for '%s' for revision %ld does not exist in the repository or "
-"refers to an unrelated object"
+msgid "The location for '%s' for revision %ld does not exist in the repository or refers to an unrelated object"
msgstr "“%s†ä¸åœ¨ç‰ˆæœ¬åº“的版本 %ld 中,或是指å‘一个无关对象"
#: ../libsvn_client/relocate.c:117
@@ -2253,29 +2385,29 @@ msgstr "“%s†ä¸æ˜¯ç‰ˆæœ¬åº“çš„æ ¹"
msgid "The repository at '%s' has uuid '%s', but the WC has '%s'"
msgstr "版本库 “%s†的 uuid 是 “%sâ€ï¼Œä½†æ˜¯å·¥ä½œå‰¯æœ¬çš„是 “%sâ€"
-#: ../libsvn_client/repos_diff.c:931 ../libsvn_wc/externals.c:570
+#: ../libsvn_client/repos_diff.c:931 ../libsvn_wc/externals.c:568
#, c-format
msgid "Base checksum mismatch for '%s'"
msgstr "“%sâ€çš„校验和错误"
-#: ../libsvn_client/revisions.c:113 ../libsvn_client/revisions.c:138
+#: ../libsvn_client/revisions.c:114 ../libsvn_client/revisions.c:139
#, c-format
msgid "Path '%s' has no committed revision"
msgstr "路径 “%s†没有æ交过"
-#: ../libsvn_client/revisions.c:166
+#: ../libsvn_client/revisions.c:167
#, c-format
msgid "Unrecognized revision type requested for '%s'"
msgstr "“%s†的请求版本类型无法识别"
-#: ../libsvn_client/status.c:407 ../libsvn_client/status.c:586
+#: ../libsvn_client/status.c:422 ../libsvn_client/status.c:601
#: ../libsvn_wc/lock.c:564 ../libsvn_wc/lock.c:856 ../libsvn_wc/lock.c:1542
-#: ../libsvn_wc/wc_db.c:12775 ../libsvn_wc/wc_db_wcroot.c:627
+#: ../libsvn_wc/wc_db.c:13235 ../libsvn_wc/wc_db_wcroot.c:638
#, c-format
msgid "'%s' is not a working copy"
msgstr "“%sâ€ä¸æ˜¯å·¥ä½œå‰¯æœ¬"
-#: ../libsvn_client/status.c:454
+#: ../libsvn_client/status.c:469
#, c-format
msgid "Entry '%s' has no URL"
msgstr "æ¡ç›®â€œ%sâ€æ²¡æœ‰URL"
@@ -2296,7 +2428,7 @@ msgid "Directory '%s' has no URL"
msgstr "目录 “%s†没有 URL"
#: ../libsvn_client/switch.c:215 ../libsvn_ra_local/ra_plugin.c:235
-#: ../libsvn_ra_local/ra_plugin.c:325 ../libsvn_wc/update_editor.c:4795
+#: ../libsvn_ra_local/ra_plugin.c:325 ../libsvn_wc/update_editor.c:4983
#, c-format
msgid ""
"'%s'\n"
@@ -2308,241 +2440,226 @@ msgstr ""
"“%sâ€\n"
"并ä¸åœ¨åŒä¸€ä¸ªç‰ˆæœ¬åº“中"
-#: ../libsvn_client/switch.c:242
+#: ../libsvn_client/switch.c:240
#, c-format
msgid "'%s' shares no common ancestry with '%s'"
msgstr "“%sâ€ä¸Žâ€œ%sâ€æ²¡æœ‰å…±åŒçš„祖先"
-#: ../libsvn_client/util.c:329
+#: ../libsvn_client/update.c:762
+msgid "None of the targets are working copies"
+msgstr ""
+
+#: ../libsvn_client/util.c:341
#, c-format
msgid "Cannot mix repository and working copy targets"
msgstr "ä¸èƒ½æ··åˆç‰ˆæœ¬åº“和工作副本目标"
-#: ../libsvn_delta/svndiff.c:175
-msgid "Compression of svndiff data failed"
-msgstr "压缩 svndiff æ•°æ®å¤±è´¥"
-
-#: ../libsvn_delta/svndiff.c:538
-msgid "Decompression of svndiff data failed: no size"
-msgstr "解压 svndiff æ•°æ®å¤±è´¥: 没有长度"
-
-#: ../libsvn_delta/svndiff.c:541
-msgid "Decompression of svndiff data failed: size too large"
-msgstr "解压 svndiff æ•°æ®å¤±è´¥: 长度太大"
-
-#: ../libsvn_delta/svndiff.c:565
-msgid "Decompression of svndiff data failed"
-msgstr "解压 svndiff æ•°æ®å¤±è´¥"
-
-#: ../libsvn_delta/svndiff.c:572
-msgid "Size of uncompressed data does not match stored original length"
-msgstr "解压åŽçš„æ•°æ®é•¿åº¦ä¸ŽåŽŸå§‹é•¿åº¦ä¸ç›¸ç­‰"
-
-#: ../libsvn_delta/svndiff.c:648
+#: ../libsvn_delta/svndiff.c:436
#, c-format
msgid "Invalid diff stream: insn %d cannot be decoded"
msgstr "无效的差异æµ: insn %d ä¸èƒ½è§£ç "
-#: ../libsvn_delta/svndiff.c:652
+#: ../libsvn_delta/svndiff.c:440
#, c-format
msgid "Invalid diff stream: insn %d has length zero"
msgstr "无效的差异æµ: insn %d 出现 0 长度"
-#: ../libsvn_delta/svndiff.c:656
+#: ../libsvn_delta/svndiff.c:444
#, c-format
msgid "Invalid diff stream: insn %d overflows the target view"
msgstr "无效的差异æµ: insn %d 溢出目标视图"
-#: ../libsvn_delta/svndiff.c:665
+#: ../libsvn_delta/svndiff.c:453
#, c-format
msgid "Invalid diff stream: [src] insn %d overflows the source view"
msgstr "无效的差异æµ: [src] insn %d 溢出æºè§†å›¾"
-#: ../libsvn_delta/svndiff.c:672
+#: ../libsvn_delta/svndiff.c:460
#, c-format
-msgid ""
-"Invalid diff stream: [tgt] insn %d starts beyond the target view position"
+msgid "Invalid diff stream: [tgt] insn %d starts beyond the target view position"
msgstr "无效的差异æµ: [tgt] insn %d 起点超过目标视图ä½ç½®"
-#: ../libsvn_delta/svndiff.c:679
+#: ../libsvn_delta/svndiff.c:467
#, c-format
msgid "Invalid diff stream: [new] insn %d overflows the new data section"
msgstr "无效的差异æµ: [new] insn %d 溢出新数æ®åŒºåŸŸ"
-#: ../libsvn_delta/svndiff.c:689
+#: ../libsvn_delta/svndiff.c:477
msgid "Delta does not fill the target window"
msgstr "Delta 没有填充目标窗å£"
-#: ../libsvn_delta/svndiff.c:692
+#: ../libsvn_delta/svndiff.c:480
msgid "Delta does not contain enough new data"
msgstr "Delta 没有包å«è¶³å¤Ÿæ–°æ•°æ®"
-#: ../libsvn_delta/svndiff.c:797
+#: ../libsvn_delta/svndiff.c:608
msgid "Svndiff has invalid header"
msgstr "Svndiff æ•°æ®åŒ…å«æ— æ•ˆå¤´"
-#: ../libsvn_delta/svndiff.c:853 ../libsvn_delta/svndiff.c:1035
+#: ../libsvn_delta/svndiff.c:664 ../libsvn_delta/svndiff.c:853
msgid "Svndiff contains a too-large window"
msgstr "Svndiff æ•°æ®åŒ…å«å¤ªå¤§çš„窗å£"
-#: ../libsvn_delta/svndiff.c:860 ../libsvn_delta/svndiff.c:1042
+#: ../libsvn_delta/svndiff.c:671 ../libsvn_delta/svndiff.c:860
msgid "Svndiff contains corrupt window header"
msgstr "Svndiff æ•°æ®åŒ…å«æ— æ•ˆçª—å£"
-#: ../libsvn_delta/svndiff.c:869
+#: ../libsvn_delta/svndiff.c:680
msgid "Svndiff has backwards-sliding source views"
msgstr "Svndiff æ•°æ®åŒ…å«å‘åŽå˜åŒ–的资æºè§†å›¾"
-#: ../libsvn_delta/svndiff.c:926 ../libsvn_delta/svndiff.c:983
-#: ../libsvn_delta/svndiff.c:1064
+#: ../libsvn_delta/svndiff.c:737 ../libsvn_delta/svndiff.c:794
+#: ../libsvn_delta/svndiff.c:882
msgid "Unexpected end of svndiff input"
msgstr "svndiff 输入æ„料结æŸ"
-#: ../libsvn_diff/diff_file.c:1094
+#: ../libsvn_diff/diff_file.c:186
+#, c-format
+msgid "File '%s' is too large to be read in to memory"
+msgstr ""
+
+#: ../libsvn_diff/diff_file.c:1106
#, c-format
msgid "The file '%s' changed unexpectedly during diff"
msgstr "文件“%sâ€åœ¨æ¯”较期间æ„外改å˜"
-#: ../libsvn_diff/diff_file.c:1264
+#: ../libsvn_diff/diff_file.c:1280
msgid "Error in options to internal diff"
msgstr "内部比较的选项错误"
-#: ../libsvn_diff/diff_file.c:1290
+#: ../libsvn_diff/diff_file.c:1309
#, c-format
msgid "Invalid argument '%s' in diff options"
msgstr "diff 选项中å‚æ•°'%s'无效"
#. Order of date components can be different in different languages
-#: ../libsvn_diff/diff_file.c:1787
+#: ../libsvn_diff/diff_file.c:1808
msgid "%a %b %e %H:%M:%S %Y"
msgstr "%a %b %e %H:%M:%S %Y"
-#: ../libsvn_diff/diff_file.c:1863 ../libsvn_diff/diff_file.c:1879
+#: ../libsvn_diff/diff_file.c:1889 ../libsvn_diff/diff_file.c:1905
#, c-format
msgid "Path '%s' must be inside the directory '%s'"
-msgstr "路径 “%s†必须在目录 “%sâ€å†…"
+msgstr "路径“%sâ€å¿…须在目录“%sâ€ä¸­"
-#: ../libsvn_diff/diff_file.c:2397
+#: ../libsvn_diff/diff_file.c:2451
#, c-format
msgid "Failed to delete mmap '%s'"
msgstr "删除 mmap“%sâ€å¤±è´¥"
-#: ../libsvn_diff/util.c:463
+#: ../libsvn_diff/util.c:477
#, c-format
msgid " Reverse-merged %s:r%s%s"
msgstr " å·²ç»æ’¤é”€åˆå¹¶ %s:r%s%s"
-#: ../libsvn_diff/util.c:480
+#: ../libsvn_diff/util.c:494
#, c-format
msgid " Merged %s:r%s%s"
msgstr " å·²ç»åˆå¹¶ %s:r%s%s"
-#: ../libsvn_fs/editor.c:219
+#: ../libsvn_fs/editor.c:217
#, c-format
msgid "Revision for modifying '%s' is required"
-msgstr "修改“%sâ€éœ€è¦ç‰ˆæœ¬å·"
+msgstr ""
-#: ../libsvn_fs/editor.c:228
+#: ../libsvn_fs/editor.c:226
#, c-format
msgid "'%s' is out of date; try updating"
msgstr "“%s†已ç»è¿‡æ—¶ï¼›è¯·å…ˆæ›´æ–°"
-#: ../libsvn_fs/editor.c:265
+#: ../libsvn_fs/editor.c:258
#, c-format
msgid "'%s' has been modified since the commit began (restart the commit)"
msgstr "自æ交开始,“%s†已有本地修改 (é‡æ–°æ交)"
-#: ../libsvn_fs/editor.c:323
+#: ../libsvn_fs/editor.c:316
#, c-format
msgid "'%s' already exists, so may be out of date; try updating"
msgstr "“%s†已ç»å­˜åœ¨ï¼Œå› æ­¤å¯èƒ½è¿‡æ—¶ï¼›è¯·å…ˆæ›´æ–°"
-#: ../libsvn_fs/editor.c:456
+#: ../libsvn_fs/editor.c:449
msgid "The filesystem does not support 'absent' nodes"
msgstr "此文件系统ä¸æ”¯æŒ 'absent' 节点"
-#: ../libsvn_fs/fs-loader.c:120
+#: ../libsvn_fs/fs-loader.c:140
#, c-format
msgid "Invalid name for FS type '%s'"
msgstr "文件类型“%sâ€çš„å称无效"
-#: ../libsvn_fs/fs-loader.c:137 ../libsvn_ra/ra_loader.c:161
-#: ../libsvn_ra/ra_loader.c:174
+#: ../libsvn_fs/fs-loader.c:157 ../libsvn_ra/ra_loader.c:162
+#: ../libsvn_ra/ra_loader.c:175
#, c-format
msgid "'%s' does not define '%s()'"
msgstr "“%s†未定义 “%s()â€"
-#: ../libsvn_fs/fs-loader.c:163
+#: ../libsvn_fs/fs-loader.c:190
#, c-format
msgid "Failed to load module for FS type '%s'"
msgstr "加载 “%s†文件系统模å—失败"
-#: ../libsvn_fs/fs-loader.c:185
+#: ../libsvn_fs/fs-loader.c:211
#, c-format
-msgid ""
-"Mismatched FS module version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
+msgid "Mismatched FS module version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "æ–‡ä»¶ç³»ç»Ÿæ¨¡å— â€œ%s†版本ä¸åŒ¹é… : 找到 %d.%d.%d%s,期望 %d.%d.%d%s"
-#: ../libsvn_fs/fs-loader.c:265
+#: ../libsvn_fs/fs-loader.c:301
#, c-format
msgid "Unknown FS type '%s'"
msgstr "未知的文件系统类型 “%sâ€"
-#: ../libsvn_fs/fs-loader.c:387
+#: ../libsvn_fs/fs-loader.c:443
#, c-format
msgid "Path '%s' is not in UTF-8"
msgstr "路径 “%s†ä¸æ˜¯ UTF-8 ç¼–ç "
-#: ../libsvn_fs/fs-loader.c:395
+#: ../libsvn_fs/fs-loader.c:451
#, c-format
msgid "Path '%s' contains '.' or '..' element"
msgstr "路径 “%sâ€ åŒ…å« â€œ.†或 “..†元素"
-#: ../libsvn_fs/fs-loader.c:552 ../libsvn_repos/repos.c:1982
+#: ../libsvn_fs/fs-loader.c:636 ../libsvn_repos/repos.c:2175
msgid "Hotcopy source and destination are equal"
-msgstr "热å¤åˆ¶çš„æºåœ°å€ä¸Žç›®æ ‡åœ°å€ç›¸åŒ"
+msgstr ""
-#: ../libsvn_fs/fs-loader.c:562
+#: ../libsvn_fs/fs-loader.c:646
#, c-format
msgid "'%s' already exists and is a file"
msgstr "“%sâ€å·²å­˜åœ¨ï¼Œå®ƒæ˜¯æ–‡ä»¶"
-#: ../libsvn_fs/fs-loader.c:567
+#: ../libsvn_fs/fs-loader.c:651
#, c-format
msgid "'%s' already exists and has an unknown node kind"
msgstr "“%sâ€å·²å­˜åœ¨ï¼Œå…·æœ‰æœªçŸ¥çš„节点类型"
-#: ../libsvn_fs/fs-loader.c:585
+#: ../libsvn_fs/fs-loader.c:669
#, c-format
-msgid ""
-"The filesystem type of the hotcopy source ('%s') does not match the "
-"filesystem type of the hotcopy destination ('%s')"
-msgstr "热å¤åˆ¶æºåœ°å€çš„文件系统类型('%s') 与目标地å€('%s') çš„ä¸ç›¸åŒ"
+msgid "The filesystem type of the hotcopy source ('%s') does not match the filesystem type of the hotcopy destination ('%s')"
+msgstr ""
-#: ../libsvn_fs/fs-loader.c:1393
+#: ../libsvn_fs/fs-loader.c:1571
#, c-format
msgid "Malformed UUID '%s'"
msgstr "éžæ³• UUID “%sâ€"
-#: ../libsvn_fs/fs-loader.c:1421
+#: ../libsvn_fs/fs-loader.c:1600
+msgid "Negative expiration date passed to svn_fs_lock"
+msgstr "传递到 svn_fs_lock 的有效期éžæ³•"
+
+#: ../libsvn_fs/fs-loader.c:1615
#, c-format
msgid "Lock token URI '%s' has bad scheme; expected '%s'"
msgstr "é”令牌 URI '%s' 的方案错误;期望是 '%s'"
-#: ../libsvn_fs/fs-loader.c:1428
+#: ../libsvn_fs/fs-loader.c:1624
#, c-format
-msgid "Lock token '%s' is not ASCII at byte %u"
-msgstr "é”令牌 '%s' 在字节 %u 处ä¸æ˜¯ ASCII 字符"
+msgid "Lock token '%s' is not ASCII or is a control character at byte %u"
+msgstr "é”令牌 '%s' 在字节 %u 处,ä¸æ˜¯ ASCII 字符或者是一个控制字符"
-#: ../libsvn_fs/fs-loader.c:1435
+#: ../libsvn_fs/fs-loader.c:1632
#, c-format
msgid "Lock token URI '%s' is not XML-safe"
msgstr "é”令牌 URI '%s' ä¸æ˜¯ XML 安全的"
-#: ../libsvn_fs/fs-loader.c:1442
-msgid "Negative expiration date passed to svn_fs_lock"
-msgstr "传递到 svn_fs_lock 的有效期éžæ³•"
-
#: ../libsvn_fs_base/bdb/bdb-err.c:104
#, c-format
msgid "Berkeley DB error for filesystem '%s' while %s:\n"
@@ -2556,40 +2673,44 @@ msgstr "正在创建修改"
msgid "deleting changes"
msgstr "正在删除修改"
-#: ../libsvn_fs_base/bdb/changes-table.c:150 ../libsvn_fs_fs/fs_fs.c:5863
+#: ../libsvn_fs_base/bdb/changes-table.c:170 ../libsvn_fs_fs/transaction.c:665
+#: ../libsvn_fs_x/transaction.c:902
msgid "Missing required node revision ID"
msgstr "缺少必须的节点版本 ID"
-#: ../libsvn_fs_base/bdb/changes-table.c:161 ../libsvn_fs_fs/fs_fs.c:5873
+#: ../libsvn_fs_base/bdb/changes-table.c:181 ../libsvn_fs_fs/transaction.c:675
+#: ../libsvn_fs_x/transaction.c:912
msgid "Invalid change ordering: new node revision ID without delete"
msgstr "无效的改å˜é¡ºåº: 没有删除新节点版本 ID"
-#: ../libsvn_fs_base/bdb/changes-table.c:171 ../libsvn_fs_fs/fs_fs.c:5884
+#: ../libsvn_fs_base/bdb/changes-table.c:191 ../libsvn_fs_fs/transaction.c:686
+#: ../libsvn_fs_x/transaction.c:923
msgid "Invalid change ordering: non-add change on deleted path"
msgstr "无效的改å˜é¡ºåº: 在已ç»åˆ é™¤çš„路径执行éžå¢žåŠ ä¿®æ”¹"
-#: ../libsvn_fs_base/bdb/changes-table.c:180 ../libsvn_fs_fs/fs_fs.c:5893
+#: ../libsvn_fs_base/bdb/changes-table.c:200 ../libsvn_fs_fs/transaction.c:695
+#: ../libsvn_fs_x/transaction.c:932
msgid "Invalid change ordering: add change on preexisting path"
msgstr "无效的改å˜é¡ºåº: 在已有路径增加修改"
-#: ../libsvn_fs_base/bdb/changes-table.c:272
-#: ../libsvn_fs_base/bdb/changes-table.c:395
+#: ../libsvn_fs_base/bdb/changes-table.c:296
+#: ../libsvn_fs_base/bdb/changes-table.c:420
msgid "creating cursor for reading changes"
msgstr "正在为读å–修改创建指针"
-#: ../libsvn_fs_base/bdb/changes-table.c:297
-#: ../libsvn_fs_base/bdb/changes-table.c:416
+#: ../libsvn_fs_base/bdb/changes-table.c:321
+#: ../libsvn_fs_base/bdb/changes-table.c:441
#, c-format
msgid "Error reading changes for key '%s'"
msgstr "读å–é”® “%s†的修改时出错"
-#: ../libsvn_fs_base/bdb/changes-table.c:356
-#: ../libsvn_fs_base/bdb/changes-table.c:439
+#: ../libsvn_fs_base/bdb/changes-table.c:381
+#: ../libsvn_fs_base/bdb/changes-table.c:464
msgid "fetching changes"
msgstr "正在获å–修改"
-#: ../libsvn_fs_base/bdb/changes-table.c:369
-#: ../libsvn_fs_base/bdb/changes-table.c:452
+#: ../libsvn_fs_base/bdb/changes-table.c:394
+#: ../libsvn_fs_base/bdb/changes-table.c:477
msgid "closing changes cursor"
msgstr "正在关闭修改指针"
@@ -2690,9 +2811,7 @@ msgstr "正在å–出æ‚项记录"
#: ../libsvn_fs_base/bdb/node-origins-table.c:117
#, c-format
-msgid ""
-"Node origin for '%s' exists in filesystem '%s' with a different value (%s) "
-"than what we were about to store (%s)"
+msgid "Node origin for '%s' exists in filesystem '%s' with a different value (%s) than what we were about to store (%s)"
msgstr "“%s†的原始节点在文件系统 “%s†中,å–值(%s)与我们è¦å­˜å‚¨çš„值(%s)ä¸åŒ"
#: ../libsvn_fs_base/bdb/node-origins-table.c:127
@@ -2772,11 +2891,11 @@ msgstr "正在存储文件系统版本"
#: ../libsvn_fs_base/bdb/rev-table.c:179
msgid "getting youngest revision (creating cursor)"
-msgstr "正在å–出最新版本(创建游标)"
+msgstr ""
#: ../libsvn_fs_base/bdb/rev-table.c:203
msgid "getting youngest revision (finding last entry)"
-msgstr "正在å–出最新版本(查找最新项)"
+msgstr ""
#. You can't commit a transaction with open cursors, because:
#. 1) key/value pairs don't get deleted until the cursors referring
@@ -2786,7 +2905,7 @@ msgstr "正在å–出最新版本(查找最新项)"
#. undetectable database corruption.
#: ../libsvn_fs_base/bdb/rev-table.c:213
msgid "getting youngest revision (closing cursor)"
-msgstr "正在å–出最新版本(关闭游标)"
+msgstr ""
#: ../libsvn_fs_base/bdb/strings-table.c:94
#: ../libsvn_fs_base/bdb/strings-table.c:300
@@ -2800,7 +2919,7 @@ msgstr "正在移动指针"
#: ../libsvn_fs_base/bdb/strings-table.c:136
msgid "rerunning cursor move"
-msgstr "é‡æ–°æ‰§è¡Œæ¸¸æ ‡ç§»åŠ¨"
+msgstr ""
#: ../libsvn_fs_base/bdb/strings-table.c:228
#: ../libsvn_fs_base/bdb/strings-table.c:247
@@ -2854,7 +2973,7 @@ msgstr "正在写入已å¤åˆ¶çš„æ•°æ®"
#: ../libsvn_fs_base/bdb/strings-table.c:535
msgid "fetching string data for a copy"
-msgstr "正在å–出字符数æ®"
+msgstr ""
#: ../libsvn_fs_base/bdb/txn-table.c:99
msgid "storing transaction record"
@@ -2915,17 +3034,19 @@ msgstr "æŸåçš„æ•°æ®åº“: åˆå§‹çš„版本å·åœ¨æ–‡ä»¶ç³»ç»Ÿâ€œ%sâ€ä¸­ä¸æ˜¯â€
msgid "Attempted to get entries of a non-directory node"
msgstr "试图从éžç›®å½•èŠ‚点中获å–æ¡ç›®"
-#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:372
+#: ../libsvn_fs_base/dag.c:461 ../libsvn_fs_fs/dag.c:377
+#: ../libsvn_fs_x/dag.c:377
#, c-format
msgid "Attempted to create a node with an illegal name '%s'"
msgstr "试图用éžæ³•çš„å字“%sâ€åˆ›å»ºèŠ‚点"
-#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:378
+#: ../libsvn_fs_base/dag.c:467 ../libsvn_fs_fs/dag.c:383
+#: ../libsvn_fs_x/dag.c:383
msgid "Attempted to create entry in non-directory parent"
msgstr "试图在éžç›®å½•çš„父节点创建æ¡ç›®"
#: ../libsvn_fs_base/dag.c:473 ../libsvn_fs_base/dag.c:737
-#: ../libsvn_fs_fs/dag.c:384
+#: ../libsvn_fs_fs/dag.c:389 ../libsvn_fs_x/dag.c:389
#, c-format
msgid "Attempted to clone child of non-mutable node"
msgstr "试图克隆éžå¯å˜èŠ‚点的å­èŠ‚点"
@@ -2935,11 +3056,13 @@ msgstr "试图克隆éžå¯å˜èŠ‚点的å­èŠ‚点"
msgid "Attempted to create entry that already exists"
msgstr "试图创建已ç»å­˜åœ¨çš„æ¡ç›®"
-#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:462
+#: ../libsvn_fs_base/dag.c:529 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_x/dag.c:468
msgid "Attempted to set entry in non-directory node"
msgstr "试图在éžç›®å½•èŠ‚点中设置æ¡ç›®"
-#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:468
+#: ../libsvn_fs_base/dag.c:535 ../libsvn_fs_fs/dag.c:474
+#: ../libsvn_fs_x/dag.c:474
msgid "Attempted to set entry in immutable node"
msgstr "试图在ä¸å˜èŠ‚点设置æ¡ç›®"
@@ -3018,17 +3141,17 @@ msgstr "试图打开ä¸å­˜åœ¨çš„å­èŠ‚点“%sâ€"
msgid "Attempted to open node with an illegal name '%s'"
msgstr "试图以éžæ³•å字“%sâ€æ‰“开节点"
-#: ../libsvn_fs_base/dag.c:1700
+#: ../libsvn_fs_base/dag.c:1705
#, c-format
msgid "Attempted merge tracking info change on immutable node"
msgstr "试图在ä¸å˜èŠ‚点åˆå¹¶è·Ÿè¸ªä¿¡æ¯çš„修改"
-#: ../libsvn_fs_base/dag.c:1740
+#: ../libsvn_fs_base/dag.c:1745
#, c-format
msgid "Attempted mergeinfo count change on immutable node"
msgstr "试图在ä¸å˜èŠ‚点修改åˆå¹¶ä¿¡æ¯è®¡æ•°"
-#: ../libsvn_fs_base/dag.c:1752
+#: ../libsvn_fs_base/dag.c:1757
#, c-format
msgid "Invalid value (%%%s) for node revision mergeinfo count"
msgstr "节点åˆå¹¶ä¿¡æ¯è®¡æ•°çš„值éžæ³•(%%%s)"
@@ -3038,7 +3161,8 @@ msgstr "节点åˆå¹¶ä¿¡æ¯è®¡æ•°çš„值éžæ³•(%%%s)"
msgid "Corrupt filesystem revision %ld in filesystem '%s'"
msgstr "文件系统版本 %ld æŸå,其文件系统是 “%sâ€"
-#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/fs_fs.c:2267
+#: ../libsvn_fs_base/err.c:57 ../libsvn_fs_fs/cached_data.c:276
+#: ../libsvn_fs_x/cached_data.c:261
#, c-format
msgid "Reference to non-existent node '%s' in filesystem '%s'"
msgstr "引用ä¸å­˜åœ¨çš„节点 “%sâ€ï¼Œå…¶æ–‡ä»¶ç³»ç»Ÿæ˜¯ “%sâ€"
@@ -3113,186 +3237,186 @@ msgstr "ä¸æ­£ç¡®çš„æ•°æ®åº“版本: 用 %d.%d.%d 版本编译,正在è¿è¡Œç‰ˆ
msgid "Berkeley DB error for filesystem '%s' while closing environment:\n"
msgstr "关闭文件系统“%sâ€çš„BDB环境å¥æŸ„时出错: \n"
-#: ../libsvn_fs_base/fs.c:551
+#: ../libsvn_fs_base/fs.c:607
#, c-format
msgid "Berkeley DB error for filesystem '%s' while creating environment:\n"
msgstr "创建文件系统“%sâ€çš„BDB环境å¥æŸ„时出错: \n"
-#: ../libsvn_fs_base/fs.c:557
+#: ../libsvn_fs_base/fs.c:613
#, c-format
msgid "Berkeley DB error for filesystem '%s' while opening environment:\n"
msgstr "打开文件系统“%sâ€çš„BDB环境å¥æŸ„时出错: \n"
-#: ../libsvn_fs_base/fs.c:572
+#: ../libsvn_fs_base/fs.c:628
msgid "creating 'nodes' table"
msgstr "正在创建“nodesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:573
+#: ../libsvn_fs_base/fs.c:629
msgid "opening 'nodes' table"
msgstr "正在打开“nodesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:578
+#: ../libsvn_fs_base/fs.c:634
msgid "creating 'revisions' table"
msgstr "正在创建“revisionsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:579
+#: ../libsvn_fs_base/fs.c:635
msgid "opening 'revisions' table"
msgstr "正在打开“revisionsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:584
+#: ../libsvn_fs_base/fs.c:640
msgid "creating 'transactions' table"
msgstr "正在创建“transactionsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:585
+#: ../libsvn_fs_base/fs.c:641
msgid "opening 'transactions' table"
msgstr "正在打开“transactionsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:590
+#: ../libsvn_fs_base/fs.c:646
msgid "creating 'copies' table"
msgstr "正在创建“copiesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:591
+#: ../libsvn_fs_base/fs.c:647
msgid "opening 'copies' table"
msgstr "正在打开“copiesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:596
+#: ../libsvn_fs_base/fs.c:652
msgid "creating 'changes' table"
msgstr "正在创建“changesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:597
+#: ../libsvn_fs_base/fs.c:653
msgid "opening 'changes' table"
msgstr "正在打开“changesâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:602
+#: ../libsvn_fs_base/fs.c:658
msgid "creating 'representations' table"
msgstr "正在创建“representationsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:603
+#: ../libsvn_fs_base/fs.c:659
msgid "opening 'representations' table"
msgstr "正在打开“representationsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:608
+#: ../libsvn_fs_base/fs.c:664
msgid "creating 'strings' table"
msgstr "正在创建“stringsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:609
+#: ../libsvn_fs_base/fs.c:665
msgid "opening 'strings' table"
msgstr "正在打开“stringsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:614
+#: ../libsvn_fs_base/fs.c:670
msgid "creating 'uuids' table"
msgstr "正在创建“uuidsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:615
+#: ../libsvn_fs_base/fs.c:671
msgid "opening 'uuids' table"
msgstr "正在打开“uuidsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:620
+#: ../libsvn_fs_base/fs.c:676
msgid "creating 'locks' table"
msgstr "正在创建“locksâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:621
+#: ../libsvn_fs_base/fs.c:677
msgid "opening 'locks' table"
msgstr "正在打开“locksâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:626
+#: ../libsvn_fs_base/fs.c:682
msgid "creating 'lock-tokens' table"
msgstr "正在创建“lock-tokensâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:627
+#: ../libsvn_fs_base/fs.c:683
msgid "opening 'lock-tokens' table"
msgstr "正在打开“lock-tokensâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:635
+#: ../libsvn_fs_base/fs.c:691
msgid "creating 'node-origins' table"
msgstr "正在创建“node-originsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:636
+#: ../libsvn_fs_base/fs.c:692
msgid "opening 'node-origins' table"
msgstr "正在打开“node-originsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:645
+#: ../libsvn_fs_base/fs.c:701
msgid "creating 'miscellaneous' table"
msgstr "正在创建“miscellaneousâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:646
+#: ../libsvn_fs_base/fs.c:702
msgid "opening 'miscellaneous' table"
msgstr "正在打开“miscellaneousâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:655
+#: ../libsvn_fs_base/fs.c:711
msgid "creating 'checksum-reps' table"
msgstr "正在创建“checksum-repsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:656
+#: ../libsvn_fs_base/fs.c:712
msgid "opening 'checksum-reps' table"
msgstr "正在打开“checksum-repsâ€è¡¨"
-#: ../libsvn_fs_base/fs.c:728
+#: ../libsvn_fs_base/fs.c:802
#, c-format
-msgid ""
-"The '%s' feature requires version %d of the filesystem schema; filesystem "
-"'%s' uses only version %d"
+msgid "The '%s' feature requires version %d of the filesystem schema; filesystem '%s' uses only version %d"
msgstr "“%sâ€ç‰¹æ€§éœ€è¦æ–‡ä»¶ç³»ç»Ÿæ–¹æ¡ˆç‰ˆæœ¬ %d;文件系统“%sâ€ç‰ˆæœ¬ä»…为 %d"
-#: ../libsvn_fs_base/fs.c:747
+#: ../libsvn_fs_base/fs.c:821
#, c-format
msgid "Expected FS format '%d'; found format '%d'"
msgstr "期望文件系统格å¼â€œ%dâ€ï¼›å‘现格å¼â€œ%dâ€"
-#: ../libsvn_fs_base/fs.c:1213
+#: ../libsvn_fs_base/fs.c:1309
#, c-format
msgid "BDB repositories do not support incremental hotcopy"
-msgstr "BDB 版本库ä¸æ”¯æŒå¢žé‡çƒ­å¤åˆ¶"
+msgstr ""
-#: ../libsvn_fs_base/fs.c:1317
+#: ../libsvn_fs_base/fs.c:1413
msgid ""
"Error copying logfile; the DB_LOG_AUTOREMOVE feature\n"
"may be interfering with the hotcopy algorithm. If\n"
"the problem persists, try deactivating this feature\n"
"in DB_CONFIG"
msgstr ""
-"å¤åˆ¶æ—¥å¿—文件出错;DB_LOG_AUTOREMOVE 特性å¯èƒ½å¦¨ç¢çƒ­å¤åˆ¶ã€‚如果问题一直存在,"
-"请\n"
+"å¤åˆ¶æ—¥å¿—文件出错;DB_LOG_AUTOREMOVE 特性å¯èƒ½å¦¨ç¢çƒ­å¤åˆ¶ã€‚如果问题一直存在,请\n"
"å°è¯•åœ¨ DB_CONFIG 中ç¦ç”¨æ­¤ç‰¹æ€§ã€‚"
-#: ../libsvn_fs_base/fs.c:1336
+#: ../libsvn_fs_base/fs.c:1432
msgid ""
"Error running catastrophic recovery on hotcopy; the\n"
"DB_LOG_AUTOREMOVE feature may be interfering with the\n"
"hotcopy algorithm. If the problem persists, try deactivating\n"
"this feature in DB_CONFIG"
msgstr ""
-"热å¤åˆ¶æ—¶æ‰§è¡Œç¾éš¾æ¢å¤å‡ºé”™ï¼›DB_LOG_AUTOREMOVE 特性å¯èƒ½å¦¨ç¢çƒ­å¤åˆ¶ã€‚如果问题一"
-"ç›´\n"
+"热å¤åˆ¶æ—¶æ‰§è¡Œç¾éš¾æ¢å¤å‡ºé”™ï¼›DB_LOG_AUTOREMOVE 特性å¯èƒ½å¦¨ç¢çƒ­å¤åˆ¶ã€‚如果问题一直\n"
"存在,请å°è¯•åœ¨ DB_CONFIG 中ç¦ç”¨æ­¤ç‰¹æ€§ã€‚"
-#: ../libsvn_fs_base/fs.c:1381
+#: ../libsvn_fs_base/fs.c:1477
msgid "Module for working with a Berkeley DB repository."
msgstr "模å—åªèƒ½æ“作BDB版本库。"
-#: ../libsvn_fs_base/fs.c:1428
+#: ../libsvn_fs_base/fs.c:1526
#, c-format
msgid "Unsupported FS loader version (%d) for bdb"
msgstr "ä¸æ”¯æŒçš„BDB之FS加载器版本 (%d)"
-#: ../libsvn_fs_base/lock.c:108 ../libsvn_fs_base/lock.c:113
-#: ../libsvn_fs_fs/lock.c:786 ../libsvn_fs_fs/lock.c:791
-#: ../libsvn_fs_fs/lock.c:813
+#: ../libsvn_fs_base/lock.c:121 ../libsvn_fs_base/lock.c:126
+#: ../libsvn_fs_fs/lock.c:758 ../libsvn_fs_fs/lock.c:763
+#: ../libsvn_fs_fs/lock.c:784 ../libsvn_fs_x/lock.c:758
+#: ../libsvn_fs_x/lock.c:763 ../libsvn_fs_x/lock.c:784
#, c-format
msgid "Path '%s' doesn't exist in HEAD revision"
msgstr "HEAD中没有路径“%sâ€"
-#: ../libsvn_fs_base/lock.c:540 ../libsvn_fs_fs/lock.c:682
+#: ../libsvn_fs_base/lock.c:598 ../libsvn_fs_fs/lock.c:661
+#: ../libsvn_fs_x/lock.c:661
#, c-format
msgid "Cannot verify lock on path '%s'; no username available"
msgstr "ä¸èƒ½æ ¡éªŒè·¯å¾„“%sâ€ä¸Šçš„é”;没有用户å"
-#: ../libsvn_fs_base/lock.c:546 ../libsvn_fs_fs/lock.c:688
+#: ../libsvn_fs_base/lock.c:604 ../libsvn_fs_fs/lock.c:667
+#: ../libsvn_fs_x/lock.c:667
#, c-format
msgid "User '%s' does not own lock on path '%s' (currently locked by '%s')"
msgstr "用户 “%s†ä¸æ˜¯è·¯å¾„ “%s†的é”的所有者(当å‰ç”±ç”¨æˆ· “%s†é”定)"
-#: ../libsvn_fs_base/lock.c:552 ../libsvn_fs_fs/lock.c:694
+#: ../libsvn_fs_base/lock.c:610 ../libsvn_fs_fs/lock.c:673
+#: ../libsvn_fs_x/lock.c:673
#, c-format
msgid "Cannot verify lock on path '%s'; no matching lock-token available"
msgstr "ä¸èƒ½æ ¡éªŒè·¯å¾„“%sâ€çš„é”;没有匹é…çš„å¯ç”¨é”令牌"
@@ -3319,9 +3443,7 @@ msgstr "在修订版“%sâ€ä¸­diff的版本ä¸ä¸€è‡´"
#: ../libsvn_fs_base/reps-strings.c:532
#, c-format
-msgid ""
-"Corruption detected whilst reading delta chain from representation '%s' to "
-"'%s'"
+msgid "Corruption detected whilst reading delta chain from representation '%s' to '%s'"
msgstr "从修订版“%sâ€åˆ°â€œ%sâ€è¯»å·®å¼‚链时检测到数æ®æŸå"
#: ../libsvn_fs_base/reps-strings.c:798
@@ -3348,7 +3470,7 @@ msgstr "“%s†的 SHA1 校验和ä¸åŒ¹é…"
msgid "Null rep, but offset past zero already"
msgstr "空的版本,但是å移已ç»å¤§äºŽé›¶"
-#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1253
+#: ../libsvn_fs_base/reps-strings.c:1062 ../libsvn_fs_base/reps-strings.c:1254
#, c-format
msgid "Rep '%s' is not mutable"
msgstr "版本“%sâ€æ˜¯ä¸å¯å˜çš„"
@@ -3358,16 +3480,16 @@ msgstr "版本“%sâ€æ˜¯ä¸å¯å˜çš„"
msgid "Rep '%s' both mutable and non-fulltext"
msgstr "版本 “%s†å¯å˜å¹¶ä¸”éžå…¨æ–‡æœ¬"
-#: ../libsvn_fs_base/reps-strings.c:1372
+#: ../libsvn_fs_base/reps-strings.c:1373
msgid "Failed to get new string key"
msgstr "å–新的字符串键失败"
-#: ../libsvn_fs_base/reps-strings.c:1449
+#: ../libsvn_fs_base/reps-strings.c:1450
#, c-format
msgid "Attempt to deltify '%s' against itself"
msgstr "“%sâ€è¯•å›¾ä¸Žè‡ªèº«æ¯”较"
-#: ../libsvn_fs_base/reps-strings.c:1522
+#: ../libsvn_fs_base/reps-strings.c:1523
#, c-format
msgid "Failed to calculate MD5 digest for '%s'"
msgstr "计算“%sâ€çš„MD5摘è¦å¤±è´¥"
@@ -3382,767 +3504,1154 @@ msgstr "事务未结æŸ: “%sâ€"
msgid "Transaction is dead: '%s'"
msgstr "事务已结æŸ: “%sâ€"
-#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:9710
+#: ../libsvn_fs_base/revs-txns.c:272 ../libsvn_fs_fs/fs_fs.c:2079
+#: ../libsvn_fs_x/fs_x.c:1141
#, c-format
msgid "revprop '%s' has unexpected value in filesystem"
msgstr "revprop“%sâ€åœ¨æ–‡ä»¶ç³»ç»Ÿä¸­æœ‰ä¸æœŸæœ›çš„值"
-#: ../libsvn_fs_base/revs-txns.c:1030
+#: ../libsvn_fs_base/revs-txns.c:1045
msgid "Transaction aborted, but cleanup failed"
msgstr "事务终止,但清除失败"
#: ../libsvn_fs_base/trail.c:99
msgid "beginning Berkeley DB transaction"
-msgstr "正在开始 BDB 事务"
+msgstr ""
#: ../libsvn_fs_base/trail.c:134
msgid "aborting Berkeley DB transaction"
-msgstr "正在中止 BDB 事务"
+msgstr ""
#: ../libsvn_fs_base/trail.c:158
msgid "committing Berkeley DB transaction"
-msgstr "正在æ交 BDB 事务"
+msgstr ""
-#: ../libsvn_fs_base/tree.c:772 ../libsvn_fs_fs/tree.c:1046
+#: ../libsvn_fs_base/tree.c:773 ../libsvn_fs_fs/tree.c:1104
+#: ../libsvn_fs_x/tree.c:1083
#, c-format
msgid "Failure opening '%s'"
msgstr "打开“%sâ€å¤±è´¥"
-#: ../libsvn_fs_base/tree.c:1403 ../libsvn_fs_fs/tree.c:1497
+#: ../libsvn_fs_base/tree.c:1445 ../libsvn_fs_fs/tree.c:1623
+#: ../libsvn_fs_x/tree.c:1601
msgid "Cannot compare property value between two different filesystems"
msgstr "ä¸èƒ½åœ¨ä¸¤ä¸ªä¸åŒçš„文件系统之间比较属性值"
-#: ../libsvn_fs_base/tree.c:1849 ../libsvn_fs_base/tree.c:1919
+#: ../libsvn_fs_base/tree.c:1909 ../libsvn_fs_base/tree.c:1979
msgid "Corrupt DB: faulty predecessor count"
msgstr "æŸåçš„æ•°æ®åº“: å…ˆå‰çš„æ•°ç›®ä¸å®Œæ•´"
-#: ../libsvn_fs_base/tree.c:1976
+#: ../libsvn_fs_base/tree.c:2036
#, c-format
msgid "Unexpected immutable node at '%s'"
msgstr "“%sâ€æœ‰æ„外的ä¸å˜èŠ‚点"
-#: ../libsvn_fs_base/tree.c:1997 ../libsvn_fs_fs/tree.c:1527
-#: ../libsvn_repos/commit.c:1244
+#: ../libsvn_fs_base/tree.c:2057 ../libsvn_fs_fs/tree.c:1653
+#: ../libsvn_fs_x/tree.c:1631 ../libsvn_repos/commit.c:1241
#, c-format
msgid "Conflict at '%s'"
msgstr "在“%sâ€å†²çª"
-#: ../libsvn_fs_base/tree.c:2050 ../libsvn_fs_base/tree.c:2802
-#: ../libsvn_fs_fs/tree.c:1578 ../libsvn_fs_fs/tree.c:2115
+#: ../libsvn_fs_base/tree.c:2110 ../libsvn_fs_base/tree.c:2862
+#: ../libsvn_fs_fs/tree.c:1751 ../libsvn_fs_fs/tree.c:2305
+#: ../libsvn_fs_x/tree.c:1721 ../libsvn_fs_x/tree.c:2260
msgid "Bad merge; ancestor, source, and target not all in same fs"
msgstr "错误的åˆå¹¶ï¼›åˆå§‹ï¼ŒåŽŸå§‹ï¼Œç›®æ ‡ä¸åœ¨åŒä¸€ä¸ªæ–‡ä»¶ç³»ç»Ÿ"
-#: ../libsvn_fs_base/tree.c:2066 ../libsvn_fs_fs/tree.c:1594
+#: ../libsvn_fs_base/tree.c:2126 ../libsvn_fs_fs/tree.c:1767
+#: ../libsvn_fs_x/tree.c:1737
#, c-format
msgid "Bad merge; target '%s' has id '%s', same as ancestor"
msgstr "错误的åˆå¹¶: 目标“%sâ€æ‹¥æœ‰æ ‡è¯†â€œ%sâ€ï¼Œä¸Žåˆå§‹ç›¸åŒ"
-#: ../libsvn_fs_base/tree.c:2610
+#: ../libsvn_fs_base/tree.c:2670
#, c-format
msgid "Transaction '%s' out-of-date with respect to revision '%s'"
msgstr "事务 “%s†过时,对于版本 “%s†"
-#: ../libsvn_fs_base/tree.c:2886
+#: ../libsvn_fs_base/tree.c:2946
#, c-format
msgid "Cannot deltify revisions prior to r%ld"
msgstr "ä¸èƒ½åœ¨ r%ld 之å‰è®¡ç®—增é‡å˜åŒ–"
-#: ../libsvn_fs_base/tree.c:3004 ../libsvn_fs_fs/tree.c:2270
+#: ../libsvn_fs_base/tree.c:3064 ../libsvn_fs_fs/tree.c:2485
+#: ../libsvn_fs_x/tree.c:2423
msgid "The root directory cannot be deleted"
msgstr "ä¸èƒ½åˆ é™¤æ ¹ç›®å½•"
-#: ../libsvn_fs_base/tree.c:3217 ../libsvn_fs_fs/tree.c:2340
+#: ../libsvn_fs_base/tree.c:3277 ../libsvn_fs_fs/tree.c:2555
+#: ../libsvn_fs_x/tree.c:2492
#, c-format
msgid "Cannot copy between two different filesystems ('%s' and '%s')"
msgstr "ä¸èƒ½åœ¨ä¸¤ä¸ªä¸åŒçš„文件系统(“%sâ€å’Œâ€œ%sâ€)之间å¤åˆ¶"
-#: ../libsvn_fs_base/tree.c:3226 ../libsvn_fs_fs/tree.c:2346
+#: ../libsvn_fs_base/tree.c:3286 ../libsvn_fs_fs/tree.c:2562
+#: ../libsvn_fs_x/tree.c:2499
msgid "Copy from mutable tree not currently supported"
msgstr "当å‰ä¸æ”¯æŒä»Žå¯å˜çš„æ ‘å¤åˆ¶"
-#: ../libsvn_fs_base/tree.c:3736 ../libsvn_fs_fs/tree.c:2823
+#: ../libsvn_fs_base/tree.c:3796 ../libsvn_fs_fs/tree.c:2957
+#: ../libsvn_fs_x/tree.c:2886
#, c-format
msgid "Base checksum mismatch on '%s'"
msgstr "'%s' 的校验和错误"
-#: ../libsvn_fs_base/tree.c:3969 ../libsvn_fs_fs/tree.c:3038
+#: ../libsvn_fs_base/tree.c:4072 ../libsvn_fs_fs/tree.c:3167
+#: ../libsvn_fs_x/tree.c:3096
msgid "Cannot compare file contents between two different filesystems"
msgstr "ä¸èƒ½åœ¨ä¸¤ä¸ªä¸åŒçš„文件系统间比较文件内容"
-#: ../libsvn_fs_base/tree.c:5013 ../libsvn_fs_base/tree.c:5188
+#: ../libsvn_fs_base/tree.c:5121 ../libsvn_fs_base/tree.c:5296
#, c-format
msgid "Node-revision '%s' claims to have mergeinfo but doesn't"
msgstr "节点版本“%sâ€å£°ç§°è‡ªå·±æœ‰åˆå¹¶ä¿¡æ¯ï¼Œå®žé™…上å´æ²¡æœ‰"
-#: ../libsvn_fs_base/tree.c:5049
+#: ../libsvn_fs_base/tree.c:5157
#, c-format
-msgid ""
-"Node-revision '%s' claims to sit atop a tree containing mergeinfo but is not "
-"a directory"
+msgid "Node-revision '%s' claims to sit atop a tree containing mergeinfo but is not a directory"
msgstr "节点版本“%sâ€å£°ç§°è‡ªå·±æ˜¯åŒ…å«åˆå¹¶ä¿¡æ¯çš„树顶,实际上å´ä¸æ˜¯ç›®å½•"
-#: ../libsvn_fs_fs/dag.c:426 ../libsvn_fs_fs/dag.c:442
-#: ../libsvn_ra_serf/serf.c:971 ../libsvn_ra_serf/serf.c:1034
+#: ../libsvn_fs_fs/cached_data.c:709 ../libsvn_fs_x/cached_data.c:584
+msgid "Malformed svndiff data in representation"
+msgstr "修订版的 svndiff æ•°æ®éžæ³•"
+
+#: ../libsvn_fs_fs/cached_data.c:956 ../libsvn_fs_x/cached_data.c:844
+#, c-format
+msgid "No representation found at offset %s for item %s in revision %ld"
+msgstr "在å移 %s å‘现éžå±•çŽ°æ•°æ®ï¼Œé¡¹ç›® %s,版本 %ld"
+
+#: ../libsvn_fs_fs/cached_data.c:1522 ../libsvn_fs_fs/cached_data.c:1535
+#: ../libsvn_fs_fs/cached_data.c:2930 ../libsvn_fs_x/cached_data.c:1415
+#: ../libsvn_fs_x/cached_data.c:1428 ../libsvn_fs_x/cached_data.c:1702
+msgid "Reading one svndiff window read beyond the end of the representation"
+msgstr "读svndiff窗å£æ—¶è¶…出了结尾"
+
+#: ../libsvn_fs_fs/cached_data.c:1642 ../libsvn_fs_x/cached_data.c:1556
+msgid "svndiff window length is corrupt"
+msgstr "svndiff 的窗体长度已æŸå"
+
+#: ../libsvn_fs_fs/cached_data.c:2038 ../libsvn_fs_x/cached_data.c:2130
+msgid "Checksum mismatch while reading representation"
+msgstr "读å–修订版时校验和ä¸åŒ¹é…"
+
+#: ../libsvn_fs_fs/cached_data.c:2389 ../libsvn_fs_fs/cached_data.c:2403
+#: ../libsvn_fs_fs/cached_data.c:2410 ../libsvn_fs_x/cached_data.c:2486
+#: ../libsvn_fs_x/cached_data.c:2500 ../libsvn_fs_x/cached_data.c:2507
+#, c-format
+msgid "Directory entry corrupt in '%s'"
+msgstr "'%s' 的目录入å£æŸå"
+
+#: ../libsvn_fs_fs/cached_data.c:3111
+#, c-format
+msgid ""
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s for item %s in revision %ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/dag.c:431 ../libsvn_fs_fs/dag.c:448
+#: ../libsvn_fs_x/dag.c:431 ../libsvn_fs_x/dag.c:448
+#: ../libsvn_ra_serf/stat.c:583
msgid "Can't get entries of non-directory"
msgstr "ä¸èƒ½èŽ·å–éžç›®å½•çš„æ¡ç›®"
-#: ../libsvn_fs_fs/dag.c:551
+#: ../libsvn_fs_fs/dag.c:557 ../libsvn_fs_x/dag.c:556
#, c-format
-msgid ""
-"Can't increment mergeinfo count on node-revision %%s to negative value %%%s"
+msgid "Can't increment mergeinfo count on node-revision %%s to negative value %%%s"
msgstr "ä¸èƒ½åœ¨èŠ‚点版本 %%s 增加åˆå¹¶ä¿¡æ¯è®¡æ•°ï¼Œå› ä¸ºä¼šæº¢å‡ºåˆ°è´Ÿå€¼ %%%s"
-#: ../libsvn_fs_fs/dag.c:562
+#: ../libsvn_fs_fs/dag.c:568 ../libsvn_fs_x/dag.c:567
#, c-format
-msgid ""
-"Can't increment mergeinfo count on *file* node-revision %%s to %%%s (> 1)"
+msgid "Can't increment mergeinfo count on *file* node-revision %%s to %%%s (> 1)"
msgstr "ä¸èƒ½åœ¨*文件*修订节点增加åˆå¹¶ä¿¡æ¯è®¡æ•° %%s 到 %%%s (> 1)"
-#: ../libsvn_fs_fs/dag.c:1134
+#: ../libsvn_fs_fs/dag.c:1151 ../libsvn_fs_x/dag.c:1150
msgid "Empty noderev in cache"
msgstr "缓存中 noderev 为空"
-#: ../libsvn_fs_fs/dag.c:1326
+#: ../libsvn_fs_fs/dag.c:1355 ../libsvn_fs_x/dag.c:1352
#, c-format
msgid "Attempted to update ancestry of non-mutable node"
msgstr "试图更新éžå¯å˜èŠ‚点的å‰é©±"
-#: ../libsvn_fs_fs/fs.c:82
+#: ../libsvn_fs_fs/fs.c:101
#, c-format
msgid "Can't fetch FSFS shared data"
msgstr "ä¸èƒ½èŽ·å–文件系统互斥体"
-#: ../libsvn_fs_fs/fs.c:106
+#: ../libsvn_fs_fs/fs.c:130
#, c-format
msgid "Can't store FSFS shared data"
msgstr "ä¸èƒ½å­˜å‚¨æ–‡ä»¶ç³»ç»Ÿå…±äº«æ•°æ®"
-#: ../libsvn_fs_fs/fs.c:400
+#: ../libsvn_fs_fs/fs.c:546
msgid "Module for working with a plain file (FSFS) repository."
msgstr "模å—与文本文件(FSFS)版本库一起工作。"
-#: ../libsvn_fs_fs/fs.c:450
+#: ../libsvn_fs_fs/fs.c:607
#, c-format
msgid "Unsupported FS loader version (%d) for fsfs"
msgstr "ä¸æ”¯æŒçš„FSFS之FS加载器版本 (%d)"
-#: ../libsvn_fs_fs/fs_fs.c:727
+#: ../libsvn_fs_fs/fs_fs.c:443
#, c-format
-msgid "Can't unlock unknown transaction '%s'"
-msgstr "ä¸èƒ½è§£é”未知事务“%sâ€"
+msgid "Found format '%d', only created by unreleased dev builds; see http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
+msgstr "å‘现了文件系统格å¼â€œ%dâ€ï¼Œå®ƒæ˜¯ç”±æœªå‘布的开å‘版本创建的;å‚è§ http://subversion.apache.org/docs/release-notes/1.7#revprop-packing"
-#: ../libsvn_fs_fs/fs_fs.c:731
+#: ../libsvn_fs_fs/fs_fs.c:454 ../libsvn_fs_x/fs_x.c:101
#, c-format
-msgid "Can't unlock nonlocked transaction '%s'"
-msgstr "ä¸èƒ½è§£é”未é”事务“%sâ€"
+msgid "Expected FS format between '1' and '%d'; found format '%d'"
+msgstr "期望文件系统格å¼åœ¨â€œ1â€åˆ°â€œ%dâ€ä¹‹é—´ï¼›å‘现格å¼â€œ%dâ€"
-#: ../libsvn_fs_fs/fs_fs.c:738
+#: ../libsvn_fs_fs/fs_fs.c:505 ../libsvn_fs_x/fs_x.c:121
#, c-format
-msgid "Can't unlock prototype revision lockfile for transaction '%s'"
-msgstr "ä¸èƒ½ä¸ºäº‹åŠ¡â€œ%sâ€è§£é”原型版本é”文件"
+msgid "Can't read first line of format file '%s'"
+msgstr "ä¸èƒ½è¯»å–æ ¼å¼æ–‡ä»¶â€œ%sâ€çš„首行"
-#: ../libsvn_fs_fs/fs_fs.c:744
+#: ../libsvn_fs_fs/fs_fs.c:562 ../libsvn_fs_x/fs_x.c:142
#, c-format
-msgid "Can't close prototype revision lockfile for transaction '%s'"
-msgstr "ä¸èƒ½ä¸ºäº‹åŠ¡â€œ%sâ€å…³é—­åŽŸåž‹ç‰ˆæœ¬é”文件"
+msgid "'%s' contains invalid filesystem format option '%s'"
+msgstr "“%sâ€åŒ…å«éžæ³•æ–‡ä»¶ç³»ç»Ÿæ ¼å¼é€‰é¡¹â€œ%sâ€"
-#: ../libsvn_fs_fs/fs_fs.c:806
+#: ../libsvn_fs_fs/fs_fs.c:572
#, c-format
-msgid ""
-"Cannot write to the prototype revision file of transaction '%s' because a "
-"previous representation is currently being written by this process"
-msgstr "因为当å‰è¿›ç¨‹æ­£åœ¨å†™å…¥ä»¥å‰ç‰ˆæœ¬ï¼Œæ‰€ä»¥ä¸èƒ½ä¸ºäº‹åŠ¡ '%s' 写入原型版本文件。"
+msgid "'%s' specifies logical addressing for a non-sharded repository"
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:842
+#: ../libsvn_fs_fs/fs_fs.c:654 ../libsvn_fs_x/fs_x.c:201
#, c-format
-msgid ""
-"Cannot write to the prototype revision file of transaction '%s' because a "
-"previous representation is currently being written by another process"
-msgstr "因为其它进程正在写入以å‰ç‰ˆæœ¬ï¼Œæ‰€ä»¥ä¸èƒ½ä¸ºäº‹åŠ¡ '%s' 写入原型版本文件。"
+msgid "%s is too small for fsfs.conf setting '%s'."
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:849 ../libsvn_subr/io.c:2007
+#: ../libsvn_fs_fs/fs_fs.c:662 ../libsvn_fs_x/fs_x.c:209
#, c-format
-msgid "Can't get exclusive lock on file '%s'"
-msgstr "ä¸èƒ½èŽ·å–文件“%sâ€çš„排它é”"
+msgid "%s is too large for fsfs.conf setting '%s'."
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:968
+#: ../libsvn_fs_fs/fs_fs.c:673 ../libsvn_fs_x/fs_x.c:220
#, c-format
-msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
-msgstr "%s 文件“%sâ€åŒ…å«æ„外的éžæ•°å­—字符 '%c' 在 '%s' 中"
+msgid "%s is invalid for fsfs.conf setting '%s' because it is not a power of 2."
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:1027
+#: ../libsvn_fs_fs/fs_fs.c:1185
#, c-format
-msgid "Can't read first line of format file '%s'"
-msgstr "ä¸èƒ½è¯»å–æ ¼å¼æ–‡ä»¶â€œ%sâ€çš„首行"
+msgid "'%s' is not a regular file. Please move it out of the way and try again"
+msgstr "'%s' ä¸æ˜¯æ™®é€šæ–‡ä»¶ã€‚请移除åŽé‡è¯•"
-#: ../libsvn_fs_fs/fs_fs.c:1064
+#: ../libsvn_fs_fs/fs_fs.c:1350 ../libsvn_fs_x/fs_x.c:652
#, c-format
-msgid "'%s' contains invalid filesystem format option '%s'"
-msgstr "“%sâ€åŒ…å«éžæ³•æ–‡ä»¶ç³»ç»Ÿæ ¼å¼é€‰é¡¹â€œ%sâ€"
+msgid "Invalid revision number '%ld'"
+msgstr "无效的版本å·â€œ%ldâ€"
+
+#: ../libsvn_fs_fs/fs_fs.c:1776
+msgid "FSFS is not compatible with Subversion prior to 1.1"
+msgstr "FSFS 与 Subversion 1.1 之å‰çš„版本ä¸å…¼å®¹"
+
+#: ../libsvn_fs_fs/fs_fs.c:1978
+#, c-format
+msgid "Node origin for '%s' exists with a different value (%s) than what we were about to store (%s)"
+msgstr "“%s†的 origin 节点å–值(%s)与我们è¦å­˜å‚¨çš„值(%s)ä¸åŒ"
-#: ../libsvn_fs_fs/fs_fs.c:1130
+#: ../libsvn_fs_fs/hotcopy.c:107 ../libsvn_fs_x/hotcopy.c:108
+#: ../libsvn_subr/io.c:270
+#, c-format
+msgid "Error converting entry in directory '%s' to UTF-8"
+msgstr "目录 “%s†中的æ¡ç›®ä»Žæœ¬åœ°ç¼–ç è½¬æ¢åˆ° UTF8 失败"
+
+#: ../libsvn_fs_fs/hotcopy.c:147 ../libsvn_fs_x/hotcopy.c:148
+#: ../libsvn_subr/io.c:1045
+#, c-format
+msgid "Source '%s' is not a directory"
+msgstr "æº â€œ%s†ä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_fs_fs/hotcopy.c:153 ../libsvn_fs_x/hotcopy.c:154
+#: ../libsvn_subr/io.c:1051
+#, c-format
+msgid "Destination '%s' is not a directory"
+msgstr "目的 “%s†ä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_fs_fs/hotcopy.c:226 ../libsvn_fs_x/hotcopy.c:227
+#: ../libsvn_subr/io.c:1128 ../libsvn_subr/io.c:2678
+#, c-format
+msgid "Can't read directory '%s'"
+msgstr "无法读å–目录 “%sâ€"
+
+#: ../libsvn_fs_fs/hotcopy.c:231 ../libsvn_fs_x/hotcopy.c:232
+#: ../libsvn_subr/io.c:1133 ../libsvn_subr/io.c:2683 ../libsvn_subr/io.c:4374
+#, c-format
+msgid "Error closing directory '%s'"
+msgstr "关闭目录 “%s†出错"
+
+#: ../libsvn_fs_fs/hotcopy.c:490
+#, c-format
+msgid "The FSFS format (%d) of the hotcopy source does not match the FSFS format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:499 ../libsvn_fs_x/hotcopy.c:495
+msgid "The UUID of the hotcopy source does not match the UUID of the hotcopy destination"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:506 ../libsvn_fs_x/hotcopy.c:502
+msgid "The sharding layout configuration of the hotcopy source does not match the sharding layout configuration of the hotcopy destination"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:581 ../libsvn_fs_x/hotcopy.c:574
+#, c-format
+msgid "The hotcopy destination already contains more packed revisions (%lu) than the hotcopy source contains (%lu)"
+msgstr ""
+
+#: ../libsvn_fs_fs/hotcopy.c:878
+#, c-format
+msgid "Failed to create hotcopy at '%s'. The file '%s' is missing from the source repository. Please create this file, for instance by running 'svnadmin upgrade %s'"
+msgstr "在“%sâ€åˆ›å»ºçƒ­å¤‡ä»½å¤±è´¥ã€‚æºç‰ˆæœ¬åº“丢失了文件“%sâ€ã€‚请创建此文件,例如通过执行“svnadmin upgrade %sâ€æ¥åˆ›å»ºå®ƒã€‚"
+
+#: ../libsvn_fs_fs/hotcopy.c:905 ../libsvn_fs_x/hotcopy.c:784
+#, c-format
+msgid "The hotcopy destination already contains more revisions (%lu) than the hotcopy source contains (%lu); are source and destination swapped?"
+msgstr ""
+
+#: ../libsvn_fs_fs/index.c:288
+#, c-format
+msgid "Can't read index file '%s' at offset 0x%s"
+msgstr "ä¸èƒ½è¯»å–索引文件“%sâ€ï¼Œå移 0x%s"
+
+#: ../libsvn_fs_fs/index.c:298
+#, c-format
+msgid "Unexpected end of index file %s at offset 0x%s"
+msgstr "索引文件“%sâ€åœ¨å移 0x%s 处æ„外结æŸ"
+
+#: ../libsvn_fs_fs/index.c:333 ../libsvn_fs_x/index.c:339
+#, c-format
+msgid "Corrupt index: number too large"
+msgstr "æŸå的索引: 数字太大"
+
+#: ../libsvn_fs_fs/index.c:376 ../libsvn_fs_x/index.c:382
#, c-format
msgid ""
-"Found format '%d', only created by unreleased dev builds; see http://"
-"subversion.apache.org/docs/release-notes/1.7#revprop-packing"
+"Index stream header prefix mismatch.\n"
+" expected: %s found: %s"
msgstr ""
-"å‘现了文件系统格å¼â€œ%dâ€ï¼Œå®ƒæ˜¯ç”±æœªå‘布的开å‘版本创建的;å‚è§ http://subversion."
-"apache.org/docs/release-notes/1.7#revprop-packing"
+"索引头å‰ç¼€ä¸åŒ¹é…\n"
+" 期望: %s å‘现: %s"
-#: ../libsvn_fs_fs/fs_fs.c:1141
+#: ../libsvn_fs_fs/index.c:603 ../libsvn_fs_x/index.c:561
#, c-format
-msgid "Expected FS format between '1' and '%d'; found format '%d'"
-msgstr "期望文件系统格å¼åœ¨â€œ1â€åˆ°â€œ%dâ€ä¹‹é—´ï¼›å‘现格å¼â€œ%dâ€"
+msgid "UINT32 0x%s too large, max = 0x%s"
+msgstr "UINT32 0x%s 太大,最大值是 0x%s"
-#: ../libsvn_fs_fs/fs_fs.c:1581
+#: ../libsvn_fs_fs/index.c:635 ../libsvn_fs_x/index.c:593
#, c-format
-msgid "'%s' is not a regular file. Please move it out of the way and try again"
-msgstr "'%s' ä¸æ˜¯æ™®é€šæ–‡ä»¶ã€‚请移除åŽé‡è¯•"
+msgid "File offset 0x%s too large, max = 0x%s"
+msgstr "文件å移 0x%s 太大,最大值是 0x%s"
-#: ../libsvn_fs_fs/fs_fs.c:1752
+#: ../libsvn_fs_fs/index.c:809 ../libsvn_fs_x/index.c:942
#, c-format
-msgid "Can't read '%s'"
-msgstr "ä¸èƒ½è¯»å–“%sâ€"
+msgid "L2P index page size %s exceeds current limit of 2G entries"
+msgstr "L2P ç´¢å¼•é¡µå¤§å° %s è¶…å‡ºå½“å‰ 2G 的页é™åˆ¶"
-#: ../libsvn_fs_fs/fs_fs.c:1815 ../libsvn_fs_fs/fs_fs.c:1834
+#: ../libsvn_fs_fs/index.c:870 ../libsvn_fs_x/index.c:1005
#, c-format
-msgid "Found malformed header '%s' in revision file"
-msgstr "在版本文件中找到éžæ³•æ–‡ä»¶å¤´â€œ%sâ€"
+msgid "Item index %s too large in l2p proto index for revision %ld"
+msgstr "在 L2P å议索引中的项目索引 %s 太大,版本 %ld"
-#: ../libsvn_fs_fs/fs_fs.c:1870
+#: ../libsvn_fs_fs/index.c:891 ../libsvn_fs_x/index.c:1029
#, c-format
-msgid "Invalid revision number '%ld'"
-msgstr "无效的版本å·â€œ%ldâ€"
+msgid "L2P index page count %d exceeds current limit of 2G pages"
+msgstr "L2P 索引页计数 %d å¤§äºŽå½“å‰ 2G 的页é™åˆ¶"
+
+#: ../libsvn_fs_fs/index.c:994 ../libsvn_fs_fs/index.c:2197
+#: ../libsvn_fs_x/index.c:1296 ../libsvn_fs_x/index.c:2542
+msgid "Index rev / pack file revision numbers do not match"
+msgstr "索引版本与打包文件版本å·ä¸åŒ¹é…"
+
+#: ../libsvn_fs_fs/index.c:1000 ../libsvn_fs_x/index.c:1309
+msgid "L2P index page size is not a power of two"
+msgstr "L2P 索引页大å°ä¸æ˜¯2的幂"
+
+#: ../libsvn_fs_fs/index.c:1007 ../libsvn_fs_x/index.c:1303
+msgid "Invalid number of revisions in L2P index"
+msgstr "在 L2P 索引中,版本数字éžæ³•"
+
+#: ../libsvn_fs_fs/index.c:1013 ../libsvn_fs_x/index.c:1315
+#,
+msgid "Fewer L2P index pages than revisions"
+msgstr "L2P 索引页少于版本数目"
+
+#: ../libsvn_fs_fs/index.c:1016 ../libsvn_fs_x/index.c:1318
+msgid "L2P index page count implausibly large"
+msgstr "L2P 索引页数é‡éš¾ä»¥ç½®ä¿¡çš„大"
-#: ../libsvn_fs_fs/fs_fs.c:1885 ../libsvn_fs_fs/fs_fs.c:1940
-#: ../libsvn_fs_fs/fs_fs.c:1951 ../libsvn_repos/log.c:2268
-#: ../libsvn_repos/log.c:2272
+#: ../libsvn_fs_fs/index.c:1021 ../libsvn_fs_x/index.c:1323
#, c-format
-msgid "No such revision %ld"
-msgstr "没有版本 %ld"
+msgid "Corrupt L2P index for r%ld only covers r%ld:%ld"
+msgstr "r%ld çš„ L2P 索引æŸå,åªè¦†ç›–了 r%ld:%ld"
-#: ../libsvn_fs_fs/fs_fs.c:1985
-msgid "Unexpected EOF"
-msgstr "æµæ„外结æŸ"
+#: ../libsvn_fs_fs/index.c:1040 ../libsvn_fs_x/index.c:1343
+#,
+msgid "Revision with no L2P index pages"
+msgstr "版本没有 L2P 索引页"
+
+#: ../libsvn_fs_fs/index.c:1045 ../libsvn_fs_x/index.c:1348
+msgid "L2P page table exceeded"
+msgstr "L2P 页表溢出"
+
+#: ../libsvn_fs_fs/index.c:1052 ../libsvn_fs_x/index.c:1355
+#,
+msgid "Revisions do not cover the full L2P index page table"
+msgstr "版本没有覆盖全部 L2P 索引页表"
+
+#: ../libsvn_fs_fs/index.c:1060 ../libsvn_fs_x/index.c:1363
+msgid "Empty L2P index page"
+msgstr "空的 L2P 索引页"
-#: ../libsvn_fs_fs/fs_fs.c:1992
+#: ../libsvn_fs_fs/index.c:1066 ../libsvn_fs_x/index.c:1369
+msgid "Page exceeds L2P index page size"
+msgstr "页超出 L2P 索引页大å°"
+
+#: ../libsvn_fs_fs/index.c:1125 ../libsvn_fs_x/index.c:1124
#, c-format
-msgid "Number '%s' invalid or too large"
-msgstr "数字“%sâ€ä¸åˆæ³•ï¼Œæˆ–者太大"
+msgid "Revision %ld not covered by item index"
+msgstr "版本 %ld 没有被项目索引覆盖"
+
+#: ../libsvn_fs_fs/index.c:1151 ../libsvn_fs_x/index.c:1150
+#, c-format
+msgid "Item index %s exceeds l2p limit of %s for revision %ld"
+msgstr "项目索引 %s 超出 %s çš„ L2P é™åˆ¶ï¼Œç‰ˆæœ¬ %ld"
+
+#: ../libsvn_fs_fs/index.c:1358 ../libsvn_fs_x/index.c:1527
+msgid "L2P actual page size does not match page table value."
+msgstr "L2P 实际页大å°ä¸Žé¡µè¡¨å€¼ä¸åŒ¹é…"
+
+#: ../libsvn_fs_fs/index.c:1491 ../libsvn_fs_x/index.c:1570
+#, c-format
+msgid "Item index %s too large in revision %ld"
+msgstr "项目索引 %s 太大,版本 %ld"
+
+#: ../libsvn_fs_fs/index.c:1910 ../libsvn_fs_x/index.c:2148
+#, c-format
+msgid "Revision 0x%s too large, max = 0x%s"
+msgstr "版本 0x%s 太大,最大值是 0x%s"
+
+#: ../libsvn_fs_fs/index.c:2203 ../libsvn_fs_x/index.c:2548
+msgid "Index offset and rev / pack file size do not match"
+msgstr "索引å移与版本/打包文件大å°ä¸åŒ¹é…"
+
+#: ../libsvn_fs_fs/index.c:2209 ../libsvn_fs_x/index.c:2554
+msgid "P2L index page size is not a power of two"
+msgstr "P2L 索引页大å°ä¸æ˜¯2的幂"
+
+#: ../libsvn_fs_fs/index.c:2215 ../libsvn_fs_x/index.c:2560
+msgid "P2L page count does not match rev / pack file size"
+msgstr "P2L 页计数与版本/打包文件大å°ä¸åŒ¹é…"
+
+#: ../libsvn_fs_fs/index.c:2395 ../libsvn_fs_x/index.c:2649
+#,
+msgid "Invalid item type in P2L index"
+msgstr "在 P2L 索引中的项目类型éžæ³•"
+
+#: ../libsvn_fs_fs/index.c:2399 ../libsvn_fs_x/index.c:2702
+msgid "Changed path list must have item number 1"
+msgstr "路径修改列表必须具有项目 1"
+
+#: ../libsvn_fs_fs/index.c:2413 ../libsvn_fs_x/index.c:2659
+msgid "Invalid FNV1 checksum in P2L index"
+msgstr "在 P2L 索引中的 FNV1 校验和éžæ³•"
+
+#: ../libsvn_fs_fs/index.c:2422
+msgid "Empty regions must have item number 0 and checksum 0"
+msgstr "空区域必须具有项目 0 和校验和 0"
+
+#: ../libsvn_fs_fs/index.c:2492 ../libsvn_fs_x/index.c:2768
+msgid "P2L page description overlaps with next page description"
+msgstr "P2L 页æ述与下页的æè¿°é‡å "
+
+#: ../libsvn_fs_fs/index.c:2608 ../libsvn_fs_x/index.c:2883
+#, c-format
+msgid "Offset %s too large in revision %ld"
+msgstr "å移 %s 太大,版本 %ld"
+
+#: ../libsvn_fs_fs/index.c:2798 ../libsvn_fs_x/index.c:3086
+#, c-format
+msgid "Last P2L index entry extends beyond the last page in revision %ld."
+msgstr "最åŽçš„ P2L 索引入å£å»¶ä¼¸è¶…出最åŽçš„页,版本 %ld."
+
+#: ../libsvn_fs_fs/lock.c:121 ../libsvn_fs_x/lock.c:121
+#, c-format
+msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
+msgstr "路径 “%sâ€çš„é”文件æŸå,其文件系统是 “%sâ€"
-#: ../libsvn_fs_fs/fs_fs.c:2159 ../libsvn_fs_fs/fs_fs.c:2173
-#: ../libsvn_fs_fs/fs_fs.c:2181 ../libsvn_fs_fs/fs_fs.c:2189
-#: ../libsvn_fs_fs/fs_fs.c:2198 ../libsvn_fs_fs/fs_fs.c:2211
-#: ../libsvn_fs_fs/fs_fs.c:2220
+#: ../libsvn_fs_fs/lock.c:229 ../libsvn_fs_x/lock.c:229
+#, c-format
+msgid "Cannot write lock/entries hashfile '%s'"
+msgstr "无法写入é”/æ¡ç›®çš„哈希文件“%sâ€"
+
+#: ../libsvn_fs_fs/lock.c:280 ../libsvn_fs_x/lock.c:280
+#, c-format
+msgid "Can't parse lock/entries hashfile '%s'"
+msgstr "ä¸èƒ½è§£æžé”/æ¡ç›®çš„哈希文件“%s“"
+
+#: ../libsvn_fs_fs/lock.c:793 ../libsvn_fs_x/lock.c:793
+#, c-format
+msgid "Lock failed: newer version of '%s' exists"
+msgstr "加é”失败: “%sâ€çš„新版本已ç»å­˜åœ¨"
+
+#: ../libsvn_fs_fs/lock.c:1259 ../libsvn_fs_x/lock.c:1259
+#, c-format
+msgid "Failed to lock '%s'"
+msgstr "é”定“%sâ€å¤±è´¥"
+
+#: ../libsvn_fs_fs/lock.c:1347 ../libsvn_fs_x/lock.c:1347
+#, c-format
+msgid "Failed to unlock '%s'"
+msgstr "解锓%sâ€å¤±è´¥"
+
+#: ../libsvn_fs_fs/low_level.c:97 ../libsvn_fs_x/low_level.c:99
+#,
+msgid "Invalid character in revision number"
+msgstr "版本数字中包å«éžæ³•å­—符"
+
+#: ../libsvn_fs_fs/low_level.c:120
+#, c-format
+msgid "Revision file (r%ld) lacks trailing newline"
+msgstr "版本文件 (r%ld) 缺少结尾æ¢è¡Œ"
+
+#: ../libsvn_fs_fs/low_level.c:134
+#, c-format
+msgid "Final line in revision file (r%ld) longer than 64 characters"
+msgstr "版本文件 (r%ld) 的最åŽä¸€è¡Œå¤§äºŽ 64 个字符"
+
+#: ../libsvn_fs_fs/low_level.c:149
+#, c-format
+msgid "Final line in revision file r%ld missing space"
+msgstr "版本文件 (r%ld) 的最åŽä¸€è¡Œç¼ºå°‘空白字符"
+
+#: ../libsvn_fs_fs/low_level.c:208 ../libsvn_fs_fs/low_level.c:217
+#: ../libsvn_fs_fs/low_level.c:226 ../libsvn_fs_fs/low_level.c:235
+#: ../libsvn_fs_x/low_level.c:121 ../libsvn_fs_x/low_level.c:130
+#: ../libsvn_fs_x/low_level.c:139 ../libsvn_fs_x/low_level.c:148
+#,
+msgid "Invalid revision footer"
+msgstr "éžæ³•ç‰ˆæœ¬é¡µè„š"
+
+#: ../libsvn_fs_fs/low_level.c:293 ../libsvn_fs_fs/low_level.c:298
+#: ../libsvn_fs_fs/low_level.c:304 ../libsvn_fs_fs/low_level.c:321
+#: ../libsvn_fs_fs/low_level.c:354 ../libsvn_fs_fs/low_level.c:374
+#: ../libsvn_fs_fs/low_level.c:399 ../libsvn_fs_x/low_level.c:780
+#: ../libsvn_fs_x/low_level.c:785 ../libsvn_fs_x/low_level.c:791
+#: ../libsvn_fs_x/low_level.c:808 ../libsvn_fs_x/low_level.c:841
+#: ../libsvn_fs_x/low_level.c:861 ../libsvn_fs_x/low_level.c:881
+msgid "Invalid changes line in rev-file"
+msgstr "rev-file 中有éžæ³•ä¿®æ”¹è¡Œ"
+
+#: ../libsvn_fs_fs/low_level.c:347 ../libsvn_fs_x/low_level.c:834
+msgid "Invalid change kind in rev file"
+msgstr "rev 文件中有无效的改å˜ç§ç±»"
+
+#: ../libsvn_fs_fs/low_level.c:367 ../libsvn_fs_x/low_level.c:854
+msgid "Invalid text-mod flag in rev-file"
+msgstr "rev-file 中有无效的 text-mod 标志"
+
+#: ../libsvn_fs_fs/low_level.c:387 ../libsvn_fs_x/low_level.c:874
+msgid "Invalid prop-mod flag in rev-file"
+msgstr "rev-file 中有无效的 prop-mod 标志"
+
+#: ../libsvn_fs_fs/low_level.c:412 ../libsvn_fs_x/low_level.c:894
+#,
+msgid "Invalid mergeinfo-mod flag in rev-file"
+msgstr "rev-file 中有无效的 mergeinfo-mod 标志"
+
+#: ../libsvn_fs_fs/low_level.c:419 ../libsvn_fs_x/low_level.c:900
+#,
+msgid "Invalid path in changes line"
+msgstr "修改行中包å«æ— æ•ˆçš„路径"
+
+#: ../libsvn_fs_fs/low_level.c:439 ../libsvn_fs_x/low_level.c:923
+#,
+msgid "Invalid copy-from path in changes line"
+msgstr "修改行中包å«æ— æ•ˆçš„ copy-from 路径"
+
+#: ../libsvn_fs_fs/low_level.c:545 ../libsvn_fs_x/low_level.c:1024
+#, c-format
+msgid "Invalid change type %d"
+msgstr "无效的修改类型 %d"
+
+#: ../libsvn_fs_fs/low_level.c:673 ../libsvn_fs_fs/low_level.c:690
+#: ../libsvn_fs_x/low_level.c:203 ../libsvn_fs_x/low_level.c:220
+#, c-format
+msgid "Found malformed header '%s' in revision file"
+msgstr "在版本文件中找到éžæ³•æ–‡ä»¶å¤´â€œ%sâ€"
+
+#: ../libsvn_fs_fs/low_level.c:737 ../libsvn_fs_fs/low_level.c:746
+#: ../libsvn_fs_fs/low_level.c:754 ../libsvn_fs_fs/low_level.c:763
+#: ../libsvn_fs_fs/low_level.c:777 ../libsvn_fs_fs/low_level.c:788
+#: ../libsvn_fs_fs/low_level.c:795 ../libsvn_fs_fs/low_level.c:802
+#: ../libsvn_fs_x/low_level.c:256 ../libsvn_fs_x/low_level.c:271
+#: ../libsvn_fs_x/low_level.c:280 ../libsvn_fs_x/low_level.c:288
+#: ../libsvn_fs_x/low_level.c:297 ../libsvn_fs_x/low_level.c:312
msgid "Malformed text representation offset line in node-rev"
msgstr "node-rev 中有éžæ³•çš„文本修订版å移行"
-#: ../libsvn_fs_fs/fs_fs.c:2251
+#: ../libsvn_fs_fs/low_level.c:829 ../libsvn_fs_x/low_level.c:345
#, c-format
msgid "While reading representation offsets for node-revision '%s':"
msgstr "读å–节点版本“%sâ€çš„å移失败:"
-#: ../libsvn_fs_fs/fs_fs.c:2406
+#: ../libsvn_fs_fs/low_level.c:863 ../libsvn_fs_x/low_level.c:427
msgid "Missing id field in node-rev"
msgstr "node-rev 中没有 id"
-#: ../libsvn_fs_fs/fs_fs.c:2420
+#: ../libsvn_fs_fs/low_level.c:878 ../libsvn_fs_x/low_level.c:442
#, c-format
msgid "Missing kind field in node-rev '%s'"
msgstr "node-rev '%s' 中没有 kind 字段"
-#: ../libsvn_fs_fs/fs_fs.c:2455
+#: ../libsvn_fs_fs/low_level.c:913 ../libsvn_fs_x/low_level.c:477
#, c-format
msgid "Missing cpath field in node-rev '%s'"
msgstr "node-rev '%s' 中没有 cpath 字段"
-#: ../libsvn_fs_fs/fs_fs.c:2483 ../libsvn_fs_fs/fs_fs.c:2490
+#: ../libsvn_fs_fs/low_level.c:920 ../libsvn_fs_x/low_level.c:484
+#, c-format
+msgid "Non-canonical cpath field in node-rev '%s'"
+msgstr "node-rev '%s' 中包å«éžæ­£åˆ™ cpath 字段"
+
+#: ../libsvn_fs_fs/low_level.c:945 ../libsvn_fs_x/low_level.c:511
#, c-format
msgid "Malformed copyroot line in node-rev '%s'"
msgstr "node-rev '%s' 中的 copyroot è¡Œéžæ³•"
-#: ../libsvn_fs_fs/fs_fs.c:2507 ../libsvn_fs_fs/fs_fs.c:2514
+#: ../libsvn_fs_fs/low_level.c:963 ../libsvn_fs_x/low_level.c:531
#, c-format
msgid "Malformed copyfrom line in node-rev '%s'"
msgstr "node-rev '%s' 中的 copyfrom è¡Œéžæ³•"
-#: ../libsvn_fs_fs/fs_fs.c:2683 ../libsvn_fs_fs/fs_fs.c:7584
+#: ../libsvn_fs_fs/low_level.c:1168 ../libsvn_fs_x/low_level.c:722
+#, c-format
+msgid "Malformed representation header"
+msgstr "éžæ³•å±•çŽ°å¤´"
+
+#: ../libsvn_fs_fs/pack.c:1946
#, c-format
-msgid "Attempted to write to non-transaction '%s'"
-msgstr "试图写至éžäº‹åŠ¡ '%s'"
+msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
+msgstr "è¦æ‰“包的 FSFS æ ¼å¼ (%d) 太旧,请å‡çº§ã€‚"
-#: ../libsvn_fs_fs/fs_fs.c:2820
+#: ../libsvn_fs_fs/recovery.c:171
+msgid "Recovery encountered a non-directory node"
+msgstr "ä¿®å¤æ—¶é‡åˆ°éžç›®å½•èŠ‚点"
+
+#: ../libsvn_fs_fs/recovery.c:192
+msgid "Recovery encountered a deltified directory representation"
+msgstr "ä¿®å¤æ—¶é‡åˆ°å·®å¼‚目录表示"
+
+#: ../libsvn_fs_fs/recovery.c:232 ../libsvn_fs_fs/recovery.c:241
+#: ../libsvn_fs_fs/recovery.c:247
+msgid "Directory entry corrupt"
+msgstr "目录æ¡ç›®æŸå"
+
+#: ../libsvn_fs_fs/recovery.c:393 ../libsvn_fs_x/recovery.c:174
#, c-format
-msgid "Malformed representation header at %s"
-msgstr "ä½äºŽ %s 的修订版头éžæ³•"
+msgid "Expected current rev to be <= %ld but found %ld"
+msgstr "期望当å‰ç‰ˆæœ¬ <= %ld,但它是 %ld"
-#: ../libsvn_fs_fs/fs_fs.c:2852
+#: ../libsvn_fs_fs/recovery.c:444 ../libsvn_fs_x/recovery.c:189
#, c-format
-msgid "Missing node-id in node-rev at r%ld (offset %s)"
-msgstr "node-rev r%ld (å移 %s) 中没有 node-id"
+msgid "Revision %ld has a revs file but no revprops file"
+msgstr "版本 %ld 有版本文件,但是没有版本属性文件"
-#: ../libsvn_fs_fs/fs_fs.c:2861
+#: ../libsvn_fs_fs/recovery.c:451 ../libsvn_fs_x/recovery.c:196
#, c-format
-msgid "Corrupt node-id '%s' in node-rev at r%ld (offset %s)"
-msgstr "node-id '%s' æŸå,ä½äºŽ node-rev r%ld (å移 %s)"
+msgid "Revision %ld has a revs file but the revprops file is inaccessible"
+msgstr "版本 %ld 有版本文件,但是版本属性文件ä¸å¯è®¿é—®"
-#: ../libsvn_fs_fs/fs_fs.c:2952
+#: ../libsvn_fs_fs/recovery.c:460 ../libsvn_fs_x/recovery.c:205
#, c-format
-msgid "Revision file (r%ld) lacks trailing newline"
-msgstr "版本文件 (r%ld) 缺少结尾æ¢è¡Œ"
+msgid "Revision %ld has a non-file where its revprops file should be"
+msgstr "版本 %ld 有éžæ–‡ä»¶é¡¹ç›®ï¼Œä¸Žå…¶å±žæ€§æ–‡ä»¶çš„记录矛盾"
+
+#: ../libsvn_fs_fs/rep-cache.c:124 ../libsvn_fs_x/rep-cache.c:124
+msgid "Couldn't open rep-cache database"
+msgstr "无法打开缓存数æ®åº“"
+
+#: ../libsvn_fs_fs/rep-cache.c:257 ../libsvn_fs_fs/rep-cache.c:316
+#: ../libsvn_fs_x/rep-cache.c:253 ../libsvn_fs_x/rep-cache.c:311
+msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
+msgstr "在表 rep_cache 中,åªæœ‰ SHA1 校验和æ‰èƒ½ç”¨ä½œé”®ã€‚\n"
-#: ../libsvn_fs_fs/fs_fs.c:2966
+#: ../libsvn_fs_fs/revprops.c:319 ../libsvn_fs_x/revprops.c:795
+#, c-format
+msgid "Packed revprop manifest for r%ld not properly terminated"
+msgstr "r%ld 的打包的 revprop 清å•æ²¡æœ‰æ­£ç¡®ç»“æŸ"
+
+#: ../libsvn_fs_fs/revprops.c:361 ../libsvn_fs_x/revprops.c:837
#, c-format
-msgid "Final line in revision file (r%ld) longer than 64 characters"
-msgstr "版本文件 (r%ld) 的最åŽä¸€è¡Œå¤§äºŽ 64 个字符"
+msgid "Packed revprop manifest for r%ld has too many entries"
+msgstr "r%ld 的打包的 revprop 清å•åŒ…å«äº†å¤ªå¤šçš„项目"
-#: ../libsvn_fs_fs/fs_fs.c:2981
+#: ../libsvn_fs_fs/revprops.c:366 ../libsvn_fs_x/revprops.c:842
#, c-format
-msgid "Final line in revision file r%ld missing space"
-msgstr "版本文件 (r%ld) 的最åŽä¸€è¡Œç¼ºå°‘空白字符"
+msgid "Packed revprop manifest for r%ld has too few entries"
+msgstr "r%ld 的打包的 revprop 清å•åŒ…å«çš„项目太少"
-#: ../libsvn_fs_fs/fs_fs.c:3676
+#: ../libsvn_fs_fs/revprops.c:430 ../libsvn_fs_x/revprops.c:905
#, c-format
-msgid "Packed revprop manifest for rev %ld too small"
-msgstr "版本 %ld 打包的属性清å•å¤ªå°"
+msgid "Revprop pack for revision r%ld contains revprops for r%ld .. r%ld"
+msgstr ""
+
+#: ../libsvn_fs_fs/revprops.c:441 ../libsvn_fs_x/revprops.c:916
+#, c-format
+msgid "Revprop pack for revision r%ld starts at non-packed revisions r%ld"
+msgstr "r%ld 的打包的 revprop 起始于éžæ‰“包版本 r%ld"
-#: ../libsvn_fs_fs/fs_fs.c:3722
+#: ../libsvn_fs_fs/revprops.c:450 ../libsvn_fs_x/revprops.c:925
msgid "Header end not found"
msgstr "找ä¸åˆ° Header 的结æŸæ ‡è®°"
-#: ../libsvn_fs_fs/fs_fs.c:3750
+#: ../libsvn_fs_fs/revprops.c:482 ../libsvn_fs_x/revprops.c:957
msgid "Packed revprop size exceeds pack file size"
-msgstr "打包的版本属性大å°è¶…出了打包文件长度"
+msgstr "打包的 revprop 大å°è¶…出打包文件大å°"
-#: ../libsvn_fs_fs/fs_fs.c:3809
+#: ../libsvn_fs_fs/revprops.c:540 ../libsvn_fs_x/revprops.c:1015
#, c-format
msgid "No such packed revision %ld"
msgstr "没有此打包版本 %ld"
-#: ../libsvn_fs_fs/fs_fs.c:3849
-#, c-format
-msgid "Failed to read revprop pack file for rev %ld"
-msgstr "无法找到版本 %ld 打包的版本属性"
+#: ../libsvn_fs_fs/revprops.c:573 ../libsvn_fs_x/revprops.c:1056
+#, c-format
+msgid "Failed to read revprop pack file for r%ld"
+msgstr "è¯»å– r%ld çš„ revprop 打包文件失败"
-#: ../libsvn_fs_fs/fs_fs.c:3856
-#, c-format
-msgid "Revprop pack file for rev %ld is corrupt"
-msgstr "版本 %ld 的属性打包文件æŸå"
+#: ../libsvn_fs_fs/revprops.c:580 ../libsvn_fs_x/revprops.c:1063
+#, c-format
+msgid "Revprop pack file for r%ld is corrupt"
+msgstr "r%ld çš„ revprop 打包文件æŸå"
-#: ../libsvn_fs_fs/fs_fs.c:3929
+#: ../libsvn_fs_fs/revprops.c:637 ../libsvn_fs_x/revprops.c:1136
#, c-format
msgid "Could not read revprops for revision %ld"
msgstr "无法找到版本 %ld 的版本属性"
-#: ../libsvn_fs_fs/fs_fs.c:4154
+#: ../libsvn_fs_fs/revprops.c:862 ../libsvn_fs_x/revprops.c:1374
#, c-format
msgid "Packed file '%s' misses a tag"
-msgstr "打包文件“%sâ€åŽ»å“¦å°‘标签"
+msgstr "打包文件 '%s' 缺少一个标签"
-#: ../libsvn_fs_fs/fs_fs.c:4491
-msgid "Malformed svndiff data in representation"
-msgstr "修订版的 svndiff æ•°æ®éžæ³•"
+#: ../libsvn_fs_fs/transaction.c:258 ../libsvn_fs_x/transaction.c:503
+#, c-format
+msgid "Can't unlock unknown transaction '%s'"
+msgstr "ä¸èƒ½è§£é”未知事务“%sâ€"
-#: ../libsvn_fs_fs/fs_fs.c:4927 ../libsvn_fs_fs/fs_fs.c:4946
-msgid "Reading one svndiff window read beyond the end of the representation"
-msgstr "读svndiff窗å£æ—¶è¶…出了结尾"
+#: ../libsvn_fs_fs/transaction.c:262 ../libsvn_fs_x/transaction.c:507
+#, c-format
+msgid "Can't unlock nonlocked transaction '%s'"
+msgstr "ä¸èƒ½è§£é”未é”事务“%sâ€"
-#: ../libsvn_fs_fs/fs_fs.c:5034
-msgid "svndiff window length is corrupt"
-msgstr "svndiff 的窗体长度已æŸå"
+#: ../libsvn_fs_fs/transaction.c:269 ../libsvn_fs_x/transaction.c:514
+#, c-format
+msgid "Can't unlock prototype revision lockfile for transaction '%s'"
+msgstr "ä¸èƒ½ä¸ºäº‹åŠ¡â€œ%sâ€è§£é”原型版本é”文件"
-#: ../libsvn_fs_fs/fs_fs.c:5202
-msgid "Checksum mismatch while reading representation"
-msgstr "读å–修订版时校验和ä¸åŒ¹é…"
+#: ../libsvn_fs_fs/transaction.c:275 ../libsvn_fs_x/transaction.c:520
+#, c-format
+msgid "Can't close prototype revision lockfile for transaction '%s'"
+msgstr "ä¸èƒ½ä¸ºäº‹åŠ¡â€œ%sâ€å…³é—­åŽŸåž‹ç‰ˆæœ¬é”文件"
-#: ../libsvn_fs_fs/fs_fs.c:5565 ../libsvn_fs_fs/fs_fs.c:5579
-#: ../libsvn_fs_fs/fs_fs.c:5586
+#: ../libsvn_fs_fs/transaction.c:321 ../libsvn_fs_x/transaction.c:566
#, c-format
-msgid "Directory entry corrupt in '%s'"
-msgstr "'%s' 的目录入å£æŸå"
+msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by this process"
+msgstr "因为当å‰è¿›ç¨‹æ­£åœ¨å†™å…¥ä»¥å‰ç‰ˆæœ¬ï¼Œæ‰€ä»¥ä¸èƒ½ä¸ºäº‹åŠ¡ '%s' 写入原型版本文件。"
-#: ../libsvn_fs_fs/fs_fs.c:6064 ../libsvn_fs_fs/fs_fs.c:6069
-#: ../libsvn_fs_fs/fs_fs.c:6075 ../libsvn_fs_fs/fs_fs.c:6092
-#: ../libsvn_fs_fs/fs_fs.c:6125 ../libsvn_fs_fs/fs_fs.c:6145
-#: ../libsvn_fs_fs/fs_fs.c:6180 ../libsvn_fs_fs/fs_fs.c:6185
-msgid "Invalid changes line in rev-file"
-msgstr "rev-file 中有éžæ³•ä¿®æ”¹è¡Œ"
+#: ../libsvn_fs_fs/transaction.c:358 ../libsvn_fs_x/transaction.c:603
+#, c-format
+msgid "Cannot write to the prototype revision file of transaction '%s' because a previous representation is currently being written by another process"
+msgstr "因为其它进程正在写入以å‰ç‰ˆæœ¬ï¼Œæ‰€ä»¥ä¸èƒ½ä¸ºäº‹åŠ¡ '%s' 写入原型版本文件。"
-#: ../libsvn_fs_fs/fs_fs.c:6118
-msgid "Invalid change kind in rev file"
-msgstr "rev 文件中有无效的改å˜ç§ç±»"
+#: ../libsvn_fs_fs/transaction.c:366 ../libsvn_fs_x/transaction.c:610
+#: ../libsvn_subr/io.c:2168
+#, c-format
+msgid "Can't get exclusive lock on file '%s'"
+msgstr "ä¸èƒ½èŽ·å–文件“%sâ€çš„排它é”"
-#: ../libsvn_fs_fs/fs_fs.c:6138
-msgid "Invalid text-mod flag in rev-file"
-msgstr "rev-file 中有无效的 text-mod 标志"
+#: ../libsvn_fs_fs/transaction.c:414 ../libsvn_fs_x/transaction.c:655
+#, c-format
+msgid "p2l proto index offset %s beyond protorev file size %s for TXN %s"
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:6158
-msgid "Invalid prop-mod flag in rev-file"
-msgstr "rev-file 中有无效的 prop-mod 标志"
+#: ../libsvn_fs_fs/transaction.c:523 ../libsvn_fs_fs/transaction.c:2348
+#: ../libsvn_fs_x/transaction.c:760 ../libsvn_fs_x/transaction.c:2408
+#, c-format
+msgid "Attempted to write to non-transaction '%s'"
+msgstr "试图写至éžäº‹åŠ¡ '%s'"
-#: ../libsvn_fs_fs/fs_fs.c:6416
+#: ../libsvn_fs_fs/transaction.c:932 ../libsvn_fs_x/transaction.c:1169
msgid "Copying from transactions not allowed"
msgstr "ä¸å…许从事务å¤åˆ¶"
-#: ../libsvn_fs_fs/fs_fs.c:6549
+#: ../libsvn_fs_fs/transaction.c:1065
#, c-format
msgid "Unable to create transaction directory in '%s' for revision %ld"
msgstr "无法在“%sâ€ä¸­ä¸ºç‰ˆæœ¬ %ld 创建事务目录"
-#: ../libsvn_fs_fs/fs_fs.c:6614
+#: ../libsvn_fs_fs/transaction.c:1135 ../libsvn_fs_x/transaction.c:1312
msgid "Internal error: a null transaction id was passed to get_txn_proplist()"
msgstr "内部错误: å‘ get_txn_proplist() 传递了空事务标识"
-#: ../libsvn_fs_fs/fs_fs.c:6773 ../libsvn_fs_fs/fs_fs.c:6780
+#: ../libsvn_fs_fs/transaction.c:1312 ../libsvn_fs_fs/transaction.c:1318
+#: ../libsvn_fs_x/transaction.c:1570 ../libsvn_fs_x/transaction.c:1576
msgid "next-id file corrupt"
msgstr "next-id 文件æŸå"
-#: ../libsvn_fs_fs/fs_fs.c:6876
+#: ../libsvn_fs_fs/transaction.c:1431 ../libsvn_fs_x/transaction.c:1689
#, c-format
msgid "Transaction '%s' cleanup failed"
msgstr "事务 '%s' 清ç†å¤±è´¥"
-#: ../libsvn_fs_fs/fs_fs.c:7016
-#, c-format
-msgid "Invalid change type %d"
-msgstr "无效的修改类型 %d"
-
-#: ../libsvn_fs_fs/fs_fs.c:7604
+#: ../libsvn_fs_fs/transaction.c:2368 ../libsvn_fs_x/transaction.c:2428
msgid "Can't set text contents of a directory"
msgstr "无法设定目录的文本内容"
-#: ../libsvn_fs_fs/fs_fs.c:7690 ../libsvn_fs_fs/fs_fs.c:7695
-#: ../libsvn_fs_fs/fs_fs.c:7702
-msgid "Corrupt 'current' file"
-msgstr "文件 “current†æŸå"
-
-#: ../libsvn_fs_fs/fs_fs.c:7962
+#: ../libsvn_fs_fs/transaction.c:2774 ../libsvn_fs_x/transaction.c:2764
#, c-format
-msgid ""
-"predecessor count for the root node-revision is wrong: found (%d+%ld != %d), "
-"committing r%ld"
+msgid "predecessor count for the root node-revision is wrong: found (%d+%ld != %d), committing r%ld"
msgstr "根节点版本的å‰ä»»è®¡æ•°é”™è¯¯: å‘现 (%d+%ld != %d), 正在æ交 r%ld"
-#: ../libsvn_fs_fs/fs_fs.c:8097
+#: ../libsvn_fs_fs/transaction.c:2931
msgid "Truncated protorev file detected"
msgstr "检测到文件 protorev 被截断"
-#: ../libsvn_fs_fs/fs_fs.c:8497
+#: ../libsvn_fs_fs/transaction.c:3418 ../libsvn_fs_x/transaction.c:3319
msgid "Transaction out of date"
msgstr "事务过时"
-#: ../libsvn_fs_fs/fs_fs.c:8991
-msgid "Recovery encountered a non-directory node"
-msgstr "ä¿®å¤æ—¶é‡åˆ°éžç›®å½•èŠ‚点"
-
-#: ../libsvn_fs_fs/fs_fs.c:9013
-msgid "Recovery encountered a deltified directory representation"
-msgstr "ä¿®å¤æ—¶é‡åˆ°å·®å¼‚目录表示"
-
-#: ../libsvn_fs_fs/fs_fs.c:9049 ../libsvn_fs_fs/fs_fs.c:9058
-#: ../libsvn_fs_fs/fs_fs.c:9064
-msgid "Directory entry corrupt"
-msgstr "目录æ¡ç›®æŸå"
-
-#: ../libsvn_fs_fs/fs_fs.c:9237
+#: ../libsvn_fs_fs/transaction.c:3693 ../libsvn_fs_x/transaction.c:3578
#, c-format
-msgid "Expected current rev to be <= %ld but found %ld"
-msgstr "期望当å‰ç‰ˆæœ¬ <= %ld,但它是 %ld"
+msgid "No such transaction '%s'"
+msgstr "没有事务 '%s'"
-#: ../libsvn_fs_fs/fs_fs.c:9294
+#: ../libsvn_fs_fs/tree.c:2404 ../libsvn_subr/path.c:1229
#, c-format
-msgid "Revision %ld has a revs file but no revprops file"
-msgstr "版本 %ld 有版本文件,但是没有版本属性文件"
+msgid "Invalid control character '0x%02x' in path '%s'"
+msgstr "无效控制字符 “0x%02x†在路径 “%s†中"
-#: ../libsvn_fs_fs/fs_fs.c:9301
-#, c-format
-msgid "Revision %ld has a revs file but the revprops file is inaccessible"
-msgstr "版本 %ld 有版本文件,但是版本属性文件ä¸å¯è®¿é—®"
+#: ../libsvn_fs_fs/tree.c:2567 ../libsvn_fs_x/tree.c:2504
+#, fuzzy
+msgid "Copy immutable tree not supported"
+msgstr "当å‰ä¸æ”¯æŒä»Žå¯å˜çš„æ ‘å¤åˆ¶"
-#: ../libsvn_fs_fs/fs_fs.c:9310
+#: ../libsvn_fs_fs/tree.c:3882 ../libsvn_fs_x/tree.c:3666
#, c-format
-msgid "Revision %ld has a non-file where its revprops file should be"
-msgstr "版本 %ld 有éžæ–‡ä»¶é¡¹ç›®ï¼Œä¸Žå…¶å±žæ€§æ–‡ä»¶çš„记录矛盾"
+msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
+msgstr "节点版本 #“%s†声称有åˆå¹¶ä¿¡æ¯ï¼Œå®žé™…上å´æ²¡æœ‰"
-#: ../libsvn_fs_fs/fs_fs.c:9488
+#: ../libsvn_fs_fs/tree.c:3998 ../libsvn_fs_x/tree.c:3782
#, c-format
-msgid ""
-"Node origin for '%s' exists with a different value (%s) than what we were "
-"about to store (%s)"
-msgstr "“%s†的 origin 节点å–值(%s)与我们è¦å­˜å‚¨çš„值(%s)ä¸åŒ"
+msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
+msgstr "节点版本“%s@%ldâ€å£°ç§°æœ‰åˆå¹¶ä¿¡æ¯ï¼Œå®žé™…上å´æ²¡æœ‰"
-#: ../libsvn_fs_fs/fs_fs.c:9594
+#: ../libsvn_fs_fs/tree.c:4198
#, c-format
-msgid "No such transaction '%s'"
-msgstr "没有事务 '%s'"
+msgid "Querying mergeinfo requires version %d of the FSFS filesystem schema; filesystem '%s' uses only version %d"
+msgstr "查询åˆå¹¶ä¿¡æ¯éœ€è¦ FSFS 文件系统方案版本 %d;文件系统“%sâ€åªä½¿ç”¨ç‰ˆæœ¬ %d"
-#: ../libsvn_fs_fs/fs_fs.c:10311
+#: ../libsvn_fs_fs/util.c:387 ../libsvn_fs_x/util.c:437
#, c-format
-msgid "FSFS format (%d) too old to pack; please upgrade the filesystem."
-msgstr "è¦æ‰“包的 FSFS æ ¼å¼ (%d) 太旧,请å‡çº§ã€‚"
+msgid "%s file '%s' contains unexpected non-digit '%c' within '%s'"
+msgstr "%s 文件“%sâ€åŒ…å«æ„外的éžæ•°å­—字符 '%c' 在 '%s' 中"
-#: ../libsvn_fs_fs/fs_fs.c:10590 ../libsvn_subr/io.c:248
-#, c-format
-msgid "Error converting entry in directory '%s' to UTF-8"
-msgstr "目录 “%s†中的æ¡ç›®ä»Žæœ¬åœ°ç¼–ç è½¬æ¢åˆ° UTF8 失败"
+#: ../libsvn_fs_fs/util.c:477 ../libsvn_fs_fs/util.c:482
+#: ../libsvn_fs_fs/util.c:487 ../libsvn_fs_x/util.c:508
+msgid "Corrupt 'current' file"
+msgstr "文件 “current†æŸå"
-#: ../libsvn_fs_fs/fs_fs.c:10627 ../libsvn_subr/io.c:1021
+#: ../libsvn_fs_fs/util.c:598 ../libsvn_fs_x/util.c:619
#, c-format
-msgid "Source '%s' is not a directory"
-msgstr "æº â€œ%s†ä¸æ˜¯ç›®å½•"
+msgid "Can't read '%s'"
+msgstr "ä¸èƒ½è¯»å–“%sâ€"
-#: ../libsvn_fs_fs/fs_fs.c:10633 ../libsvn_subr/io.c:1027
-#, c-format
-msgid "Destination '%s' is not a directory"
-msgstr "目的 “%s†ä¸æ˜¯ç›®å½•"
+#: ../libsvn_fs_fs/util.c:619 ../libsvn_fs_x/util.c:646
+msgid "Unexpected EOF"
+msgstr "æµæ„外结æŸ"
-#: ../libsvn_fs_fs/fs_fs.c:10705 ../libsvn_subr/io.c:1104
-#: ../libsvn_subr/io.c:2485
+#: ../libsvn_fs_fs/util.c:626 ../libsvn_fs_x/util.c:653
#, c-format
-msgid "Can't read directory '%s'"
-msgstr "无法读å–目录 “%sâ€"
+msgid "Number '%s' invalid or too large"
+msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10710 ../libsvn_subr/io.c:1109
-#: ../libsvn_subr/io.c:2490 ../libsvn_subr/io.c:3995
-#, c-format
-msgid "Error closing directory '%s'"
-msgstr "关闭目录 “%s†出错"
+#: ../libsvn_fs_fs/verify.c:208 ../libsvn_fs_x/verify.c:181
+#, fuzzy, c-format
+msgid "%s checksum mismatch in file %s"
+msgstr "'%s' 的校验和错误"
-#: ../libsvn_fs_fs/fs_fs.c:10950
+#: ../libsvn_fs_fs/verify.c:303
#, c-format
-msgid ""
-"The FSFS format (%d) of the hotcopy source does not match the FSFS format "
-"(%d) of the hotcopy destination; please upgrade both repositories to the "
-"same format"
+msgid "p2l index entry not found for PHYS %s returned by l2p index for LOG r%ld:i%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10959
-msgid ""
-"The UUID of the hotcopy source does not match the UUID of the hotcopy "
-"destination"
+#: ../libsvn_fs_fs/verify.c:313 ../libsvn_fs_x/verify.c:289
+#, c-format
+msgid "p2l index info LOG r%ld:i%ld does not match l2p index for LOG r%ld:i%ld"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:10966
-msgid ""
-"The sharding layout configuration of the hotcopy source does not match the "
-"sharding layout configuration of the hotcopy destination"
+#: ../libsvn_fs_fs/verify.c:379 ../libsvn_fs_x/verify.c:355
+#, fuzzy, c-format
+msgid "p2l does not cover offset %s for revision %ld"
+msgstr "没有路径 “%s†在版本 %ld 中"
+
+#: ../libsvn_fs_fs/verify.c:404
+#, c-format
+msgid "Empty P2L entry for PHYS %s refers to revision %ld outside the rev / pack file (%ld-%ld)"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11071
+#: ../libsvn_fs_fs/verify.c:421
#, c-format
-msgid ""
-"Failed to create hotcopy at '%s'. The file '%s' is missing from the source "
-"repository. Please create this file, for instance by running 'svnadmin "
-"upgrade %s'"
+msgid "l2p index entry PHYS %sdoes not match p2l index value LOG r%ld:i%ld for PHYS %s"
msgstr ""
-"在“%sâ€åˆ›å»ºçƒ­å¤‡ä»½å¤±è´¥ã€‚æºç‰ˆæœ¬åº“丢失了文件“%sâ€ã€‚请创建此文件,例如通过执"
-"行“svnadmin upgrade %sâ€æ¥åˆ›å»ºå®ƒã€‚"
-#: ../libsvn_fs_fs/fs_fs.c:11097
+#: ../libsvn_fs_fs/verify.c:485 ../libsvn_fs_x/verify.c:451
#, c-format
-msgid ""
-"The hotcopy destination already contains more revisions (%lu) than the "
-"hotcopy source contains (%lu); are source and destination swapped?"
+msgid "Empty section in file %s contains non-NUL data at offset %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11133
+#: ../libsvn_fs_fs/verify.c:526 ../libsvn_fs_x/verify.c:493
#, c-format
-msgid ""
-"The hotcopy destination already contains more packed revisions (%lu) than "
-"the hotcopy source contains (%lu)"
+msgid "Checksum mismatch in item at offset %s of length %s bytes in file %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11246
+#: ../libsvn_fs_fs/verify.c:622 ../libsvn_fs_x/verify.c:589
#, c-format
-msgid ""
-"The assumed HEAD revision (%lu) of the hotcopy source has been packed while "
-"the hotcopy was in progress; please restart the hotcopy operation"
+msgid "File size of %s for revision r%ld does not match p2l index size of %s"
msgstr ""
-#: ../libsvn_fs_fs/fs_fs.c:11261
+#: ../libsvn_fs_fs/verify.c:667 ../libsvn_fs_x/verify.c:634
#, c-format
+msgid "p2l index entry for revision r%ld is non-contiguous between offsets %s and %s"
+msgstr ""
+
+#: ../libsvn_fs_util/fs-util.c:156
+msgid "Filesystem object has not been opened yet"
+msgstr "文件系统对象尚未打开"
+
+#: ../libsvn_fs_util/fs-util.c:159
+msgid "Filesystem object already open"
+msgstr "文件系统对象已ç»æ‰“å¼€"
+
+#: ../libsvn_fs_x/cached_data.c:2918
+#, fuzzy, c-format
msgid ""
-"Revision %lu disappeared from the hotcopy source while hotcopy was in "
-"progress"
-msgstr "当正在进行热å¤åˆ¶æ—¶ï¼Œç‰ˆæœ¬ %lu 从热å¤åˆ¶æºåœ°å€æ¶ˆå¤±"
+"Low-level checksum mismatch while reading\n"
+"%s bytes of meta data at offset %s "
+msgstr "读å–修订版时校验和ä¸åŒ¹é…"
-#: ../libsvn_fs_fs/lock.c:120
+#: ../libsvn_fs_x/changes.c:252
#, c-format
-msgid "Corrupt lockfile for path '%s' in filesystem '%s'"
-msgstr "路径 “%sâ€çš„é”文件æŸå,其文件系统是 “%sâ€"
+msgid "Changes list index %%%s exceeds container size %%d"
+msgstr ""
-#: ../libsvn_fs_fs/lock.c:228
+#: ../libsvn_fs_x/changes.c:519
#, c-format
-msgid "Cannot write lock/entries hashfile '%s'"
-msgstr "无法写入é”/æ¡ç›®çš„哈希文件“%sâ€"
+msgid "Changes list index %u exceeds container size %d"
+msgstr ""
-#: ../libsvn_fs_fs/lock.c:280
-#, c-format
-msgid "Can't parse lock/entries hashfile '%s'"
-msgstr "ä¸èƒ½è§£æžé”/æ¡ç›®çš„哈希文件“%s“"
+#: ../libsvn_fs_x/fs.c:100
+#, fuzzy, c-format
+msgid "Can't fetch FSX shared data"
+msgstr "ä¸èƒ½èŽ·å–文件系统互斥体"
-#: ../libsvn_fs_fs/lock.c:818
-#, c-format
-msgid "Lock failed: newer version of '%s' exists"
-msgstr "加é”失败: “%sâ€çš„新版本已ç»å­˜åœ¨"
+#: ../libsvn_fs_x/fs.c:129
+#, fuzzy, c-format
+msgid "Can't store FSX shared data"
+msgstr "ä¸èƒ½å­˜å‚¨æ–‡ä»¶ç³»ç»Ÿå…±äº«æ•°æ®"
-#: ../libsvn_fs_fs/rep-cache.c:113
-msgid "Couldn't open rep-cache database"
-msgstr "无法打开缓存数æ®åº“"
+#: ../libsvn_fs_x/fs.c:550
+#, fuzzy
+msgid "Module for working with an experimental (FSX) repository."
+msgstr "模å—与文本文件(FSFS)版本库一起工作。"
-#: ../libsvn_fs_fs/rep-cache.c:242 ../libsvn_fs_fs/rep-cache.c:287
-msgid "Only SHA1 checksums can be used as keys in the rep_cache table.\n"
-msgstr "在表 rep_cache 中,åªæœ‰ SHA1 校验和æ‰èƒ½ç”¨ä½œé”®ã€‚\n"
+#: ../libsvn_fs_x/fs.c:611
+#, fuzzy, c-format
+msgid "Unsupported FS loader version (%d) for fsx"
+msgstr "ä¸æ”¯æŒçš„FSFS之FS加载器版本 (%d)"
+
+#: ../libsvn_fs_x/fs_x.c:1017
+#, fuzzy
+msgid "FSX is not compatible with Subversion prior to 1.9"
+msgstr "“%sâ€ä¸æ˜¯æœ‰æ•ˆçš„ Subversion 属性å称"
-#: ../libsvn_fs_fs/rep-cache.c:323
+#: ../libsvn_fs_x/hotcopy.c:486
#, c-format
-msgid ""
-"Representation key for checksum '%%s' exists in filesystem '%%s' with a "
-"different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,"
-"%%%s,%%%s,%%%s)"
+msgid "The FSX format (%d) of the hotcopy source does not match the FSX format (%d) of the hotcopy destination; please upgrade both repositories to the same format"
msgstr ""
-"校验和 “%%s†的展现键已ç»å­˜åœ¨äºŽæ–‡ä»¶ç³»ç»Ÿ “%%s†中,å–值(%%ld,%%%s,%%%s,%%%s)与"
-"我们è¦å­˜å‚¨çš„值(%%ld,%%%s,%%%s,%%%s)ä¸åŒ"
-#: ../libsvn_fs_fs/tree.c:2190 ../libsvn_subr/path.c:1233
-#, c-format
-msgid "Invalid control character '0x%02x' in path '%s'"
-msgstr "无效控制字符 “0x%02x†在路径 “%s†中"
+#: ../libsvn_fs_x/index.c:294
+#, fuzzy
+msgid "Can't read index file '%s' at offset 0x%"
+msgstr "ä¸èƒ½è¯»å–文件“%sâ€"
+
+#: ../libsvn_fs_x/index.c:304
+#, fuzzy
+msgid "Unexpected end of index file %s at offset 0x%"
+msgstr "svndiff 输入æ„料结æŸ"
+
+#: ../libsvn_fs_x/index.c:2668
+msgid "Unused regions must be empty and have checksum 0"
+msgstr ""
+
+#: ../libsvn_fs_x/index.c:2682
+msgid "Only containers may have more than one sub-item"
+msgstr ""
-#: ../libsvn_fs_fs/tree.c:3789
+#: ../libsvn_fs_x/noderevs.c:367 ../libsvn_fs_x/noderevs.c:402
#, c-format
-msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
-msgstr "节点版本 #“%s†声称有åˆå¹¶ä¿¡æ¯ï¼Œå®žé™…上å´æ²¡æœ‰"
+msgid "Node revision ID index %d exceeds container size %d"
+msgstr ""
-#: ../libsvn_fs_fs/tree.c:3905
+#: ../libsvn_fs_x/noderevs.c:439
#, c-format
-msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
-msgstr "节点版本“%s@%ldâ€å£°ç§°æœ‰åˆå¹¶ä¿¡æ¯ï¼Œå®žé™…上å´æ²¡æœ‰"
+msgid "Node revision index %%%s exceeds container size %%d"
+msgstr ""
-#: ../libsvn_fs_fs/tree.c:4105
+#: ../libsvn_fs_x/noderevs.c:679
+#, fuzzy, c-format
+msgid "Unexpected MD5 digest size %%%s"
+msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
+
+#: ../libsvn_fs_x/noderevs.c:691
#, c-format
-msgid ""
-"Querying mergeinfo requires version %d of the FSFS filesystem schema; "
-"filesystem '%s' uses only version %d"
-msgstr "查询åˆå¹¶ä¿¡æ¯éœ€è¦ FSFS 文件系统方案版本 %d;文件系统“%sâ€åªä½¿ç”¨ç‰ˆæœ¬ %d"
+msgid "Unexpected SHA1 digest size %%%s"
+msgstr ""
-#: ../libsvn_fs_util/fs-util.c:154
-msgid "Filesystem object has not been opened yet"
-msgstr "文件系统对象尚未打开"
+#: ../libsvn_fs_x/reps.c:492
+msgid "Text body exceeds star delta container capacity"
+msgstr ""
-#: ../libsvn_fs_util/fs-util.c:157
-msgid "Filesystem object already open"
-msgstr "文件系统对象已ç»æ‰“å¼€"
+#: ../libsvn_fs_x/reps.c:497
+msgid "Instruction count exceeds star delta container capacity"
+msgstr ""
-#: ../libsvn_ra/compat.c:182
+#: ../libsvn_fs_x/verify.c:280
+#, c-format
+msgid "p2l index entry not found for PHYS o%s:s%ld returned by l2p index for LOG r%ld:i%ld"
+msgstr ""
+
+#: ../libsvn_fs_x/verify.c:385
+#, c-format
+msgid "l2p index entry PHYS o%s:s%ld does not match p2l index value LOG r%ld:i%ld for PHYS o%s:s%ld"
+msgstr ""
+
+#: ../libsvn_ra/compat.c:183
#, c-format
msgid "Missing changed-path information for '%s' in revision %ld"
msgstr "未æä¾› “%s†于版本 %ld 中的 changed-path ä¿¡æ¯"
-#: ../libsvn_ra/compat.c:326 ../libsvn_ra/compat.c:570
+#: ../libsvn_ra/compat.c:328 ../libsvn_ra/compat.c:572
#, c-format
msgid "Path '%s' doesn't exist in revision %ld"
msgstr "路径 “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_ra/compat.c:403
+#: ../libsvn_ra/compat.c:405
#, c-format
msgid "'%s' in revision %ld is an unrelated object"
msgstr "“%s†于版本 %ld 是一个无关对象"
-#: ../libsvn_ra/compat.c:843 ../libsvn_ra/ra_loader.c:1291
+#: ../libsvn_ra/compat.c:845 ../libsvn_ra/ra_loader.c:1436
#, c-format
msgid "Invalid peg revision %ld"
msgstr "无效的铆钉版本 %ld"
-#: ../libsvn_ra/compat.c:846 ../libsvn_ra/ra_loader.c:1294
-#: ../libsvn_repos/rev_hunt.c:214 ../libsvn_repos/rev_hunt.c:329
+#: ../libsvn_ra/compat.c:848 ../libsvn_ra/ra_loader.c:1439
+#: ../libsvn_repos/rev_hunt.c:212 ../libsvn_repos/rev_hunt.c:328
#, c-format
msgid "Invalid end revision %ld"
msgstr "无效结æŸç‰ˆæœ¬ %ld"
-#: ../libsvn_ra/compat.c:849 ../libsvn_ra/ra_loader.c:1297
+#: ../libsvn_ra/compat.c:851 ../libsvn_ra/ra_loader.c:1442
msgid "Peg revision must precede end revision"
msgstr "铆钉版本必须å°äºŽç»“æŸç‰ˆæœ¬"
-#: ../libsvn_ra/ra_loader.c:215
+#: ../libsvn_ra/ra_loader.c:216
#, c-format
msgid "Mismatched RA version for '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "“%s†的 RA 版本ä¸åŒ¹é…: 找到 %d.%d.%d%s,期望 %d.%d.%d%s"
-#: ../libsvn_ra/ra_loader.c:292 ../libsvn_ra_serf/serf.c:527
+#: ../libsvn_ra/ra_loader.c:294 ../libsvn_ra_serf/serf.c:819
#, c-format
msgid "Illegal repository URL '%s'"
msgstr "éžæ³•ç‰ˆæœ¬åº“ URL “%sâ€"
-#: ../libsvn_ra/ra_loader.c:399
+#: ../libsvn_ra/ra_loader.c:401
#, c-format
msgid "Invalid config: unknown HTTP library '%s'"
msgstr "无效é…ç½®: 未知的 HTTP 库“%sâ€"
-#: ../libsvn_ra/ra_loader.c:468
+#: ../libsvn_ra/ra_loader.c:474
#, c-format
msgid "Unrecognized URL scheme for '%s'"
msgstr "无法识别的URL方案(一般需è¦svn://,http://,file://等开头)“%sâ€"
-#: ../libsvn_ra/ra_loader.c:519
+#: ../libsvn_ra/ra_loader.c:491
+#, fuzzy, c-format
+msgid "Unable to connect to a repository at URL '%s'"
+msgstr "无法打开版本库“%sâ€"
+
+#: ../libsvn_ra/ra_loader.c:529
#, c-format
msgid "Repository UUID '%s' doesn't match expected UUID '%s'"
msgstr "版本库的 UUID“%sâ€ä¸ŽæœŸæœ›çš„ UUID“%sâ€ä¸åŒ¹é…"
-#: ../libsvn_ra/ra_loader.c:540
+#: ../libsvn_ra/ra_loader.c:589
#, c-format
msgid "'%s' isn't in the same repository as '%s'"
msgstr "“%sâ€ä¸Žâ€œ%sâ€å¹¶ä¸åœ¨åŒä¸€ä¸ªç‰ˆæœ¬åº“中"
-#: ../libsvn_ra/ra_loader.c:564
+#: ../libsvn_ra/ra_loader.c:613
#, c-format
msgid "'%s' isn't a child of session URL '%s'"
msgstr "“%s†ä¸æ˜¯ä¼šè¯ URL “%s†的å­èŠ‚点"
-#: ../libsvn_ra/ra_loader.c:580 ../libsvn_ra_svn/client.c:2398
+#: ../libsvn_ra/ra_loader.c:629 ../libsvn_ra_svn/client.c:2595
#, c-format
msgid "'%s' isn't a child of repository root URL '%s'"
msgstr "“%s†ä¸æ˜¯ç‰ˆæœ¬åº“æ ¹ URL “%s†的å­èŠ‚点"
-#: ../libsvn_ra/ra_loader.c:624
+#: ../libsvn_ra/ra_loader.c:673
#, c-format
-msgid ""
-"Specifying 'old_value_p' is not allowed when the '%s' capability is not "
-"advertised, and could indicate a bug in your client"
-msgstr ""
-"当特性 '%s' 没有广告时,ä¸å…许指定 'old_value_p',也说明您的客户端有问题"
+msgid "Specifying 'old_value_p' is not allowed when the '%s' capability is not advertised, and could indicate a bug in your client"
+msgstr "当特性 '%s' 没有广告时,ä¸å…许指定 'old_value_p',也说明您的客户端有问题"
-#: ../libsvn_ra/ra_loader.c:1445
+#: ../libsvn_ra/ra_loader.c:1587
#, c-format
msgid " - handles '%s' scheme\n"
msgstr " - 处ç†â€œ%sâ€æ–¹æ¡ˆ\n"
-#: ../libsvn_ra/ra_loader.c:1538
+#: ../libsvn_ra/ra_loader.c:1680
#, c-format
msgid "Unrecognized URL scheme '%s'"
msgstr "无法识别的URL方案(一般需è¦svn://,http://,file://等开头)“%sâ€"
-#: ../libsvn_ra/util.c:64
+#: ../libsvn_ra/util.c:55
+#, fuzzy
+msgid "<repository>"
+msgstr "获å–版本库 UUID"
+
+#: ../libsvn_ra/util.c:73
#, c-format
msgid "Retrieval of mergeinfo unsupported by '%s'"
msgstr "“%s†ä¸æ”¯æŒå–回åˆå¹¶ä¿¡æ¯"
-#: ../libsvn_ra/util.c:88
-#, c-format
+#: ../libsvn_ra/util.c:99
+#, fuzzy, c-format
msgid "The '%s' feature is not supported by '%s'"
-msgstr "特性“%sâ€ä¸è¢«â€œ%sâ€æ”¯æŒ"
+msgstr "“%s†ä¸æ”¯æŒå–回åˆå¹¶ä¿¡æ¯"
-#: ../libsvn_ra/util.c:129
+#: ../libsvn_ra/util.c:142
#, c-format
msgid "Lock was stolen by '%s'; unable to remove it"
msgstr "é”被 '%s' 窃å–ï¼›ä¸èƒ½åˆ é™¤"
-#: ../libsvn_ra/util.c:170
+#: ../libsvn_ra/util.c:183
#, c-format
msgid "Unable to determine local hostname"
msgstr "无法确定本地主机å称"
-#: ../libsvn_ra/util.c:265
+#: ../libsvn_ra/util.c:278
#, c-format
msgid "Couldn't get lock on destination repos after %d attempts"
msgstr "å°è¯• %d 次åŽï¼Œå¯¹ç›®æ ‡ç‰ˆæœ¬åº“加é”失败"
@@ -4153,260 +4662,202 @@ msgstr "éžæ³•çš„ memory-cache-size"
#. ----------------------------------------------------------------
#. ** The RA vtable routines **
-#: ../libsvn_ra_local/ra_plugin.c:502
+#: ../libsvn_ra_local/ra_plugin.c:503
msgid "Module for accessing a repository on local disk."
msgstr "访问本地ç£ç›˜çš„版本库模å—。"
-#: ../libsvn_ra_local/ra_plugin.c:578
-msgid "Unable to open an ra_local session to URL"
-msgstr "无法为 URL 打开 ra_local 会è¯"
-
-#: ../libsvn_ra_local/ra_plugin.c:611 ../libsvn_ra_serf/serf.c:519
+#: ../libsvn_ra_local/ra_plugin.c:675 ../libsvn_ra_serf/serf.c:811
#, c-format
msgid "URL '%s' is not a child of the session's repository root URL '%s'"
msgstr "URL “%s†ä¸æ˜¯ä¼šè¯ç‰ˆæœ¬åº“æ ¹ URL “%s†的å­èŠ‚点"
-#: ../libsvn_ra_local/ra_plugin.c:1139 ../libsvn_ra_local/ra_plugin.c:1596
-#: ../libsvn_ra_serf/util.c:2414
+#: ../libsvn_ra_local/ra_plugin.c:1191 ../libsvn_ra_local/ra_plugin.c:1657
+#: ../libsvn_ra_serf/util.c:1765
#, c-format
msgid "'%s' path not found"
msgstr "找ä¸åˆ°è·¯å¾„ “%sâ€"
-#: ../libsvn_ra_local/ra_plugin.c:1538 ../libsvn_ra_serf/options.c:616
-#: ../libsvn_ra_svn/client.c:2599
+#: ../libsvn_ra_local/ra_plugin.c:1599 ../libsvn_ra_serf/options.c:674
+#: ../libsvn_ra_svn/client.c:2796
#, c-format
msgid "Don't know anything about capability '%s'"
msgstr "ä¸çŸ¥é“特性 “%s†的任何信æ¯"
-#: ../libsvn_ra_local/ra_plugin.c:1744
+#: ../libsvn_ra_local/ra_plugin.c:1809
#, c-format
msgid "Unsupported RA loader version (%d) for ra_local"
msgstr "ä¸æ”¯æŒra_local RA加载器版本 %d"
-#: ../libsvn_ra_local/split_url.c:49 ../libsvn_ra_local/split_url.c:55
+#: ../libsvn_ra_local/split_url.c:50 ../libsvn_ra_local/split_url.c:56
#, c-format
msgid "Unable to open repository '%s'"
msgstr "无法打开版本库“%sâ€"
-#: ../libsvn_ra_serf/commit.c:219
-#, c-format
-msgid "%s of '%s': %d %s"
-msgstr "%s 于 '%s': %d %s"
-
-#: ../libsvn_ra_serf/commit.c:319
+#: ../libsvn_ra_serf/commit.c:291
msgid "No Location header received"
msgstr "没有收到ä½ç½®å¤´"
-#: ../libsvn_ra_serf/commit.c:329
+#: ../libsvn_ra_serf/commit.c:301
+#, fuzzy
msgid "Error parsing Location header value"
-msgstr "解æžä½ç½®å¤´å‡ºé”™"
-
-#: ../libsvn_ra_serf/commit.c:431
-#, c-format
-msgid "Directory '%s' is out of date; try updating"
-msgstr "目录 “%s†已ç»è¿‡æ—¶ï¼›è¯·å…ˆæ›´æ–°"
+msgstr "没有收到ä½ç½®å¤´"
-#: ../libsvn_ra_serf/commit.c:519 ../libsvn_repos/commit.c:512
+#: ../libsvn_ra_serf/commit.c:489 ../libsvn_repos/commit.c:512
#, c-format
msgid "Path '%s' not present"
msgstr "路径 “%s†ä¸å­˜åœ¨"
-#: ../libsvn_ra_serf/commit.c:569
-#, c-format
-msgid "File '%s' is out of date; try updating"
-msgstr "文件 “%s†已ç»è¿‡æ—¶ï¼›è¯·å…ˆæ›´æ–°"
-
-#: ../libsvn_ra_serf/commit.c:971
-msgid "At least one property change failed; repository is unchanged"
-msgstr "至少有一个属性å˜æ›´å¤±è´¥ï¼›ç‰ˆæœ¬åº“未改å˜"
-
-#: ../libsvn_ra_serf/commit.c:1171
-#, c-format
-msgid "Failed writing updated file"
-msgstr "更新文件失败"
-
-#: ../libsvn_ra_serf/commit.c:1359 ../libsvn_ra_serf/commit.c:1449
-#, c-format
-msgid "%s of '%s': %d %s (%s://%s)"
-msgstr "%s 于 '%s': %d %s (%s://%s)"
-
-#: ../libsvn_ra_serf/commit.c:1369
+#: ../libsvn_ra_serf/commit.c:1352
#, c-format
msgid "POST request did not return transaction information"
msgstr "POST 请求没有返回事务的信æ¯"
-#: ../libsvn_ra_serf/commit.c:1413
-msgid ""
-"The OPTIONS response did not include the requested activity-collection-set "
-"value"
+#: ../libsvn_ra_serf/commit.c:1399
+msgid "The OPTIONS response did not include the requested activity-collection-set value"
msgstr "OPTIONS å“应中没有包å«è¯·æ±‚çš„ activity-collection-set 值。"
-#: ../libsvn_ra_serf/commit.c:1678 ../libsvn_ra_serf/commit.c:2076
-#: ../libsvn_ra_serf/update.c:2631
+#: ../libsvn_ra_serf/commit.c:1627 ../libsvn_ra_serf/update.c:2260
#, c-format
msgid "Unable to parse URL '%s'"
msgstr "ä¸èƒ½è§£æž URL “%sâ€"
-#: ../libsvn_ra_serf/commit.c:1706 ../libsvn_ra_serf/util.c:2410
-#, c-format
-msgid "Access to '%s' forbidden"
-msgstr "ç¦æ­¢è®¿é—® '%s'"
-
-#: ../libsvn_ra_serf/commit.c:1710
-#, c-format
-msgid "Adding directory failed: %s on %s (%d %s)"
-msgstr "增加目录失败: “%s†于 “%sâ€(%d %s)"
-
-#: ../libsvn_ra_serf/commit.c:1928
+#: ../libsvn_ra_serf/commit.c:1906
#, c-format
msgid "File '%s' already exists"
msgstr "文件“%sâ€å·²å­˜åœ¨"
-#: ../libsvn_ra_serf/commit.c:2199
-#, c-format
-msgid "MERGE request failed: returned %d (during commit)"
-msgstr "MERGE 请求失败: 返回 %d (在æ交期间)"
-
-#: ../libsvn_ra_serf/commit.c:2464
-msgid ""
-"DAV request failed; it's possible that the repository's pre-revprop-change "
-"hook either failed or is non-existent"
-msgstr "DAV 请求失败;å¯èƒ½æ˜¯ç‰ˆæœ¬åº“çš„ pre-revprop-change é’©å­æ‰§è¡Œå¤±è´¥æˆ–者ä¸å­˜åœ¨"
-
-#: ../libsvn_ra_serf/get_deleted_rev.c:173
+#: ../libsvn_ra_serf/get_deleted_rev.c:175
#, c-format
msgid "'%s' REPORT not implemented"
msgstr "未实现 “%s†REPORT "
-#: ../libsvn_ra_serf/locks.c:234
-#, c-format
-msgid "Lock request failed: %d %s"
-msgstr "加é”请求失败: %d %s"
+#: ../libsvn_ra_serf/get_file.c:345
+msgid "Can't get text contents of a directory"
+msgstr "无法获得目录的文本内容"
-#: ../libsvn_ra_serf/locks.c:414
-msgid "Malformed URL for repository"
-msgstr "版本库的 URL éžæ³•"
+#: ../libsvn_ra_serf/get_lock.c:170 ../libsvn_ra_serf/lock.c:165
+#, fuzzy, c-format
+msgid "Invalid LOCK timeout value '%s'"
+msgstr "无效修剪计数 '%s'"
-#: ../libsvn_ra_serf/locks.c:420
+#: ../libsvn_ra_serf/get_lock.c:320
msgid "Server does not support locking features"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒåŠ é”"
-#: ../libsvn_ra_serf/locks.c:581
-#, c-format
-msgid "'%s' is not locked in the repository"
-msgstr "版本库中的“%sâ€æ²¡æœ‰è¢«é”定"
+#: ../libsvn_ra_serf/getdate.c:168
+#, fuzzy
+msgid "The REPORT response did not include the requested properties"
+msgstr "PROPFIND å“应中没有包å«è¯·æ±‚的属性"
-#: ../libsvn_ra_serf/locks.c:632 ../libsvn_ra_serf/locks.c:638
+#: ../libsvn_ra_serf/inherited_props.c:173 ../libsvn_ra_serf/property.c:244
+#: ../libsvn_ra_serf/update.c:1883
#, c-format
-msgid "Unlock request failed: %d %s"
+msgid "Got unrecognized encoding '%s'"
+msgstr "得到ä¸èƒ½è¯†åˆ«çš„ç¼–ç â€œ%sâ€"
+
+#: ../libsvn_ra_serf/lock.c:260
+#, fuzzy, c-format
+msgid "No lock on path '%s' (%d %s)"
+msgstr "路径“%sâ€æ²¡æœ‰è¢«é”定,其文件系统是“%sâ€"
+
+#: ../libsvn_ra_serf/lock.c:269
+#, fuzzy, c-format
+msgid "Unlock of '%s' failed (%d %s)"
msgstr "解é”请求失败: %d %s"
-#: ../libsvn_ra_serf/log.c:169
+#: ../libsvn_ra_serf/lock.c:277
+#, fuzzy, c-format
+msgid "Path '%s' doesn't exist in HEAD revision (%d %s)"
+msgstr "HEAD中没有路径“%sâ€"
+
+#: ../libsvn_ra_serf/lock.c:286
+#, fuzzy, c-format
+msgid "Path '%s' already locked (%d %s)"
+msgstr "å·²ç»é”定路径"
+
+#: ../libsvn_ra_serf/lock.c:600
+#, c-format
+msgid "'%s' is not locked in the repository"
+msgstr "版本库中的“%sâ€æ²¡æœ‰è¢«é”定"
+
+#: ../libsvn_ra_serf/log.c:172
#, c-format
msgid "Unsupported encoding '%s'"
msgstr "ä¸æ”¯æŒçš„ç¼–ç â€œ%sâ€"
-#: ../libsvn_ra_serf/log.c:568 ../libsvn_ra_svn/client.c:1551
+#: ../libsvn_ra_serf/log.c:573 ../libsvn_ra_svn/client.c:1717
msgid "Server does not support custom revprops via log"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒé€šè¿‡æ—¥å¿—自定义 revprops"
-#: ../libsvn_ra_serf/merge.c:200
+#: ../libsvn_ra_serf/merge.c:205
#, c-format
msgid "A MERGE response for '%s' is not a child of the destination ('%s')"
msgstr "“%sâ€çš„ MERGE å“应并ä¸æ˜¯ç›®æ ‡ (“%sâ€) çš„å­é¡¹"
-#: ../libsvn_ra_serf/options.c:599
+#: ../libsvn_ra_serf/multistatus.c:226 ../libsvn_ra_serf/multistatus.c:231
+#, fuzzy, c-format
+msgid "Malformed DAV:status '%s'"
+msgstr "éžæ³• DAV:status CDATA '%s'"
+
+#: ../libsvn_ra_serf/multistatus.c:536
+#, fuzzy, c-format
+msgid "Property operation on '%s' failed"
+msgstr "连接到“%sâ€å¤±è´¥"
+
+#: ../libsvn_ra_serf/multistatus.c:555
+#, fuzzy
+msgid "<blank error>"
+msgstr "未知错误"
+
+#: ../libsvn_ra_serf/multistatus.c:564
+#, fuzzy, c-format
+msgid "While handling the '%s' property on '%s':"
+msgstr "å½“å¤„ç† serf çš„å“应时:"
+
+#: ../libsvn_ra_serf/multistatus.c:568
+#, fuzzy, c-format
+msgid "While handling the '%s' path:"
+msgstr "å½“å¤„ç† serf çš„å“应时:"
+
+#: ../libsvn_ra_serf/options.c:445
+msgid "The OPTIONS response did not include the youngest revision"
+msgstr "OPTIONS å“应中没有包å«æœ€æ–°çš„版本"
+
+#: ../libsvn_ra_serf/options.c:657
#, c-format
msgid "Don't know how to handle '%s' for capability '%s'"
msgstr "ä¸çŸ¥é“如何处ç†â€œ%sâ€ï¼Œå¯¹äºŽç‰¹æ€§â€œ%sâ€"
-#: ../libsvn_ra_serf/options.c:623
+#: ../libsvn_ra_serf/options.c:681
#, c-format
msgid "Attempt to fetch capability '%s' resulted in '%s'"
msgstr "试图å–得特性 “%s†导致 “%sâ€"
-#: ../libsvn_ra_serf/property.c:279 ../libsvn_ra_serf/update.c:2473
-#, c-format
-msgid "Got unrecognized encoding '%s'"
-msgstr "得到ä¸èƒ½è¯†åˆ«çš„ç¼–ç â€œ%sâ€"
-
-#: ../libsvn_ra_serf/property.c:700
+#: ../libsvn_ra_serf/property.c:716
msgid "The PROPFIND response did not include the requested properties"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚的属性"
-#: ../libsvn_ra_serf/property.c:993
-msgid ""
-"The PROPFIND response did not include the requested baseline-collection value"
+#: ../libsvn_ra_serf/property.c:1006
+msgid "The PROPFIND response did not include the requested baseline-collection value"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚çš„ baseline-collection 值。"
-#: ../libsvn_ra_serf/property.c:1005
+#: ../libsvn_ra_serf/property.c:1026
msgid "The PROPFIND response did not include the requested version-name value"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚çš„ version-name 值。"
-#: ../libsvn_ra_serf/property.c:1043
+#: ../libsvn_ra_serf/property.c:1062
msgid "The OPTIONS response did not include the requested checked-in value"
msgstr "OPTIONS å“应中没有包å«è¯·æ±‚çš„ checked-in 值。"
-#: ../libsvn_ra_serf/property.c:1125
-msgid "The OPTIONS response did not include the youngest revision"
-msgstr "OPTIONS å“应中没有包å«æœ€æ–°çš„版本"
-
-#: ../libsvn_ra_serf/property.c:1218
+#: ../libsvn_ra_serf/property.c:1233
msgid "The PROPFIND response did not include the requested resourcetype value"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚çš„ resourcetype 值"
-#: ../libsvn_ra_serf/property.c:1253
+#: ../libsvn_ra_serf/property.c:1268
msgid "The PROPFIND response did not include the requested 'DAV:' properties"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚çš„ 'DAV:' 属性"
-#: ../libsvn_ra_serf/replay.c:223 ../libsvn_ra_serf/update.c:1660
-msgid "Missing revision attr in target-revision element"
-msgstr "元素“target-revision没有revision属性"
-
-#: ../libsvn_ra_serf/replay.c:241
-msgid "Missing revision attr in open-root element"
-msgstr "元素“open-root没有revisioin属性"
-
-#: ../libsvn_ra_serf/replay.c:261 ../libsvn_ra_serf/update.c:1888
-msgid "Missing name attr in delete-entry element"
-msgstr "元素 delete-entry 没有 attr 属性"
-
-#: ../libsvn_ra_serf/replay.c:267
-msgid "Missing revision attr in delete-entry element"
-msgstr "delete-entry元素没有revision属性"
-
-#: ../libsvn_ra_serf/replay.c:287 ../libsvn_ra_serf/update.c:1727
-msgid "Missing name attr in open-directory element"
-msgstr "元素 open-directory 没有 name 属性"
-
-#: ../libsvn_ra_serf/replay.c:293 ../libsvn_ra_serf/update.c:1678
-#: ../libsvn_ra_serf/update.c:1718
-msgid "Missing revision attr in open-directory element"
-msgstr "open-directory元素没有revision属性"
-
-#: ../libsvn_ra_serf/replay.c:313 ../libsvn_ra_serf/update.c:1765
-msgid "Missing name attr in add-directory element"
-msgstr "元素 add-directory 没有 name 属性"
-
-#: ../libsvn_ra_serf/replay.c:349 ../libsvn_ra_serf/update.c:1809
-msgid "Missing name attr in open-file element"
-msgstr "元素 open-file 没有 name 属性"
-
-#: ../libsvn_ra_serf/replay.c:355 ../libsvn_ra_serf/update.c:1818
-msgid "Missing revision attr in open-file element"
-msgstr "open-file元素没有revision属性"
-
-#: ../libsvn_ra_serf/replay.c:376 ../libsvn_ra_serf/update.c:1843
-msgid "Missing name attr in add-file element"
-msgstr "元素 add-file 没有 name 属性"
-
-#: ../libsvn_ra_serf/replay.c:442 ../libsvn_ra_serf/update.c:1984
-#: ../libsvn_ra_serf/update.c:2071
-#, c-format
-msgid "Missing name attr in %s element"
-msgstr "元素“%sâ€æ²¡æœ‰name属性"
-
-#: ../libsvn_ra_serf/replay.c:579
+#: ../libsvn_ra_serf/replay.c:482
msgid "Error writing stream: unexpected EOF"
msgstr "写入æµå‡ºé”™: æ„外的 EOF"
@@ -4414,415 +4865,483 @@ msgstr "写入æµå‡ºé”™: æ„外的 EOF"
msgid "Failed to read the request"
msgstr "读å–请求失败"
-#: ../libsvn_ra_serf/serf.c:62
+#: ../libsvn_ra_serf/serf.c:63
msgid "Module for accessing a repository via WebDAV protocol using serf."
msgstr "通过 WebDAV å议使用 serf 访问版本库的模å—。"
-#: ../libsvn_ra_serf/serf.c:122
-#, c-format
+#: ../libsvn_ra_serf/serf.c:66
+#, fuzzy, c-format
+msgid ""
+"Module for accessing a repository via WebDAV protocol using serf.\n"
+" - using serf %d.%d.%d"
+msgstr "通过 WebDAV å议使用 serf 访问版本库的模å—。"
+
+#: ../libsvn_ra_serf/serf.c:130
+#, fuzzy, c-format
msgid "Invalid config: unknown %s '%s'"
-msgstr "无效é…ç½®: 未知 %s “%sâ€"
+msgstr "无效é…ç½®: 未知的密ç å­˜å‚¨ “%sâ€"
-#: ../libsvn_ra_serf/serf.c:303
+#: ../libsvn_ra_serf/serf.c:362
msgid "Invalid config: illegal character in timeout value"
msgstr "无效é…ç½®: 超时数值中有éžæ³•å­—符"
-#: ../libsvn_ra_serf/serf.c:307
+#: ../libsvn_ra_serf/serf.c:366
msgid "Invalid config: negative timeout value"
msgstr "无效é…ç½®: 负的超时"
-#: ../libsvn_ra_serf/serf.c:320
+#: ../libsvn_ra_serf/serf.c:379
msgid "Invalid URL: illegal character in proxy port number"
msgstr "无效URL: 代ç†ç«¯å£ä¸­æœ‰éžæ³•å­—符"
-#: ../libsvn_ra_serf/serf.c:324
+#: ../libsvn_ra_serf/serf.c:383
msgid "Invalid URL: negative proxy port number"
msgstr "无效URL: 负的代ç†ç«¯å£"
-#: ../libsvn_ra_serf/serf.c:327
-msgid ""
-"Invalid URL: proxy port number greater than maximum TCP port number 65535"
+#: ../libsvn_ra_serf/serf.c:386
+msgid "Invalid URL: proxy port number greater than maximum TCP port number 65535"
msgstr "无效URL: 代ç†ç«¯å£å¤§äºŽTCP通信端å£æœ€å¤§å€¼65535"
-#: ../libsvn_ra_serf/serf.c:347
+#: ../libsvn_ra_serf/serf.c:406
#, c-format
msgid "Could not resolve proxy server '%s'"
msgstr "ä¸èƒ½è§£æžä»£ç†æœåŠ¡å™¨â€œ%sâ€"
-#: ../libsvn_ra_serf/serf.c:420
+#: ../libsvn_ra_serf/serf.c:514
#, c-format
msgid "Illegal URL '%s'"
msgstr "éžæ³• URL “%sâ€"
-#: ../libsvn_ra_serf/serf.c:488
+#: ../libsvn_ra_serf/serf.c:597
#, c-format
msgid "Connection to '%s' failed"
msgstr "连接到“%sâ€å¤±è´¥"
-#: ../libsvn_ra_serf/serf.c:1149
+#: ../libsvn_ra_serf/serf.c:1010
msgid "The UUID property was not found on the resource or any of its parents"
msgstr "无法在本资æºæˆ–其任何父项目中找到UUID属性"
-#: ../libsvn_ra_serf/serf.c:1223
+#: ../libsvn_ra_serf/serf.c:1085
#, c-format
msgid "Unsupported RA loader version (%d) for ra_serf"
msgstr "ä¸æ”¯æŒçš„ ra_serf RA 加载器版本(%d)"
-#: ../libsvn_ra_serf/serf.c:1237
+#: ../libsvn_ra_serf/serf.c:1099
#, c-format
-msgid ""
-"ra_serf was compiled for serf %d.%d.%d but loaded an incompatible %d.%d.%d "
-"library"
+msgid "ra_serf was compiled for serf %d.%d.%d but loaded an incompatible %d.%d.%d library"
msgstr "ra_serf 为 serf %d.%d.%d 编译,但是加载了ä¸å…¼å®¹çš„共享库 %d.%d.%d"
-#: ../libsvn_ra_serf/update.c:1118
+#: ../libsvn_ra_serf/stat.c:390 ../libsvn_ra_serf/stat.c:428
+#, fuzzy
+msgid "Can't get properties of non-directory"
+msgstr "ä¸èƒ½èŽ·å–éžç›®å½•çš„æ¡ç›®"
+
+#: ../libsvn_ra_serf/update.c:1133
#, c-format
msgid "GET request returned unexpected delta base: %s"
-msgstr "GET 请求返回ä¸æœŸæœ›çš„差异基础: %s"
+msgstr ""
-#: ../libsvn_ra_serf/update.c:1136
-#, c-format
-msgid "GET request failed: %d %s"
-msgstr "GET 请求失败: %d %s"
+#: ../libsvn_ra_serf/update.c:1689 ../libsvn_ra_serf/update.c:1739
+#, fuzzy, c-format
+msgid "Missing '%s' attribute"
+msgstr "缺少 XML 属性: '%s'"
-#: ../libsvn_ra_serf/update.c:1922
-msgid "Missing name attr in absent-directory element"
-msgstr "元素 absent-directory 没有 name 属性"
+#: ../libsvn_ra_serf/update.c:1953 ../libsvn_ra_serf/update.c:1983
+#, fuzzy
+msgid "The REPORT response did not include the requested checked-in value"
+msgstr "OPTIONS å“应中没有包å«è¯·æ±‚çš„ checked-in 值。"
-#: ../libsvn_ra_serf/update.c:1947
-msgid "Missing name attr in absent-file element"
-msgstr "元素 absent-file 没有 name 属性"
+#: ../libsvn_ra_serf/update.c:2633
+msgid "Missing update-report close tag"
+msgstr ""
-#: ../libsvn_ra_serf/update.c:2015 ../libsvn_ra_serf/update.c:2122
-#, c-format
-msgid "Unknown tag '%s' while at state %d"
-msgstr "未知标签“%sâ€ï¼Œä¸Šä¸‹æ–‡çŠ¶æ€ %d"
+#: ../libsvn_ra_serf/util.c:195
+msgid ": "
+msgstr ""
-#: ../libsvn_ra_serf/update.c:2190 ../libsvn_ra_serf/update.c:2314
-#: ../libsvn_ra_serf/update.c:2351
-msgid ""
-"The REPORT or PROPFIND response did not include the requested checked-in "
-"value"
-msgstr "REPORT 或 PROPFIND å“应中没有包å«è¯·æ±‚çš„ checked-in 值。"
+#: ../libsvn_ra_serf/util.c:197
+msgid ", "
+msgstr ""
-#: ../libsvn_ra_serf/update.c:2533
-#, c-format
-msgid "Error writing to '%s': unexpected EOF"
-msgstr "写入“%sâ€å‡ºé”™: æ„外的文件结æŸ"
+#: ../libsvn_ra_serf/util.c:407
+#, fuzzy
+msgid "Server SSL certificate verification failed"
+msgstr "æœåŠ¡å™¨çš„ SSL è¯ä¹¦ä¸è¢«ä¿¡ä»»"
-#: ../libsvn_ra_serf/update.c:2902
-msgid "Error retrieving REPORT"
-msgstr "获å–报告出错"
+#: ../libsvn_ra_serf/util.c:412
+#, fuzzy
+msgid "certificate is not yet valid"
+msgstr " - è¯ä¹¦æœªç”Ÿæ•ˆã€‚\n"
-#: ../libsvn_ra_serf/update.c:3111
-msgid "Missing update-report close tag"
-msgstr "缺少更新报告的关闭标签"
+#: ../libsvn_ra_serf/util.c:415
+#, fuzzy
+msgid "certificate has expired"
+msgstr " - è¯ä¹¦å·²è¿‡æœŸã€‚\n"
-#: ../libsvn_ra_serf/update.c:3581
-msgid "Can't get text contents of a directory"
-msgstr "无法获得目录的文本内容"
+#: ../libsvn_ra_serf/util.c:419
+msgid "certificate issued for a different hostname"
+msgstr ""
+
+#: ../libsvn_ra_serf/util.c:423
+#, fuzzy
+msgid "issuer is not trusted"
+msgstr "ä¸æ”¯æŒæ–‡ä»¶ç³»ç»Ÿå‡çº§"
+
+#: ../libsvn_ra_serf/util.c:426
+msgid "and other reason(s)"
+msgstr ""
-#: ../libsvn_ra_serf/util.c:347
+#: ../libsvn_ra_serf/util.c:473
#, c-format
msgid "Invalid config: unable to load certificate file '%s'"
msgstr "无效的é…ç½®: 无法加载è¯ä¹¦æ–‡ä»¶â€œ%sâ€"
-#: ../libsvn_ra_serf/util.c:783 ../libsvn_ra_serf/util.c:786
+#: ../libsvn_ra_serf/util.c:904 ../libsvn_ra_serf/util.c:907
msgid "Error running context"
msgstr "执行上下文错误"
-#: ../libsvn_ra_serf/util.c:1103 ../libsvn_ra_serf/util.c:1108
-#, c-format
-msgid "Malformed DAV:status CDATA '%s'"
-msgstr "éžæ³• DAV:status CDATA '%s'"
-
-#: ../libsvn_ra_serf/util.c:1400
-#, c-format
-msgid "XML parsing failed"
-msgstr "XML 解æžå¤±è´¥"
-
-#: ../libsvn_ra_serf/util.c:1403
-#, c-format
-msgid "XML parsing failed: (%d %s)"
-msgstr "XML 解æžå¤±è´¥: (%d %s)"
-
-#: ../libsvn_ra_serf/util.c:1778
+#: ../libsvn_ra_serf/util.c:1152
+#, fuzzy
msgid ""
"No more credentials or we tried too many times.\n"
"Authentication failed"
msgstr ""
-"没有更多凭æ®æˆ–å·²ç»è¯•äº†å¤ªå¤šæ¬¡ã€‚\n"
+"没有凭è¯æˆ–å·²ç»è¯•äº†å¤ªå¤šæ¬¡ã€‚\n"
"认è¯å¤±è´¥"
-#: ../libsvn_ra_serf/util.c:1800
+#: ../libsvn_ra_serf/util.c:1174
msgid "Proxy authentication failed"
msgstr "代ç†è®¤è¯å¤±è´¥"
-#: ../libsvn_ra_serf/util.c:1911
+#: ../libsvn_ra_serf/util.c:1229
+#, fuzzy, c-format
+msgid "%s request on '%s' failed"
+msgstr "%s 请求于 '%s' 失败: %d %s"
+
+#: ../libsvn_ra_serf/util.c:1301
#, c-format
msgid "Premature EOF seen from server (http status=%d)"
msgstr "从æœåŠ¡å™¨å‘现 EOF 太早 (http status=%d)"
-#: ../libsvn_ra_serf/util.c:1980
-#, c-format
-msgid "%s request on '%s' failed: %d %s"
-msgstr "%s 请求于 '%s' 失败: %d %s"
-
-#: ../libsvn_ra_serf/util.c:2302
-msgid ""
-"The PROPFIND response did not include the requested version-controlled-"
-"configuration value"
+#: ../libsvn_ra_serf/util.c:1651
+msgid "The PROPFIND response did not include the requested version-controlled-configuration value"
msgstr "PROPFIND å“应中没有包å«è¯·æ±‚çš„ version-controlled-configuration 值。"
-#: ../libsvn_ra_serf/util.c:2404
+#: ../libsvn_ra_serf/util.c:1755
#, c-format
msgid "Repository moved permanently to '%s'; please relocate"
msgstr "版本库永久移到 “%sâ€ï¼›è¯·é‡æ–°å®šä½ã€‚"
-#: ../libsvn_ra_serf/util.c:2406
+#: ../libsvn_ra_serf/util.c:1757
#, c-format
msgid "Repository moved temporarily to '%s'; please relocate"
msgstr "版本库临时移到‘%s’;请é‡æ–°å®šä½ã€‚"
-#: ../libsvn_ra_serf/util.c:2417
+#: ../libsvn_ra_serf/util.c:1761
+#, c-format
+msgid "Access to '%s' forbidden"
+msgstr "ç¦æ­¢è®¿é—® '%s'"
+
+#: ../libsvn_ra_serf/util.c:1768 ../libsvn_repos/commit.c:170
+#, c-format
+msgid "'%s' is out of date"
+msgstr "“%s†已ç»è¿‡æ—¶"
+
+#: ../libsvn_ra_serf/util.c:1771
+#, fuzzy, c-format
+msgid "'%s' conflicts"
+msgstr "“%sâ€ä¸æ˜¯ä¸€ä¸ªæ–‡ä»¶"
+
+#: ../libsvn_ra_serf/util.c:1774
+#, fuzzy, c-format
+msgid "Precondition on '%s' failed"
+msgstr "连接到“%sâ€å¤±è´¥"
+
+#: ../libsvn_ra_serf/util.c:1777
#, c-format
msgid "'%s': no lock token available"
msgstr "“%sâ€ï¼šæ²¡æœ‰å¯ç”¨çš„é”定令牌"
-#: ../libsvn_ra_serf/util.c:2421
+#: ../libsvn_ra_serf/util.c:1781
#, c-format
-msgid "DAV request failed: Content length required"
-msgstr "DAV 请求失败: 需è¦å†…容长度"
+msgid "DAV request failed: 411 Content length required. The server or an intermediate proxy does not accept chunked encoding. Try setting 'http-chunked-requests' to 'auto' or 'no' in your client configuration."
+msgstr ""
-#: ../libsvn_ra_serf/util.c:2427
-#, c-format
-msgid "Unexpected HTTP status %d '%s' on '%s'\n"
-msgstr "æ„外 HTTP çŠ¶æ€ %d “%sâ€äºŽâ€œ%sâ€\n"
+#: ../libsvn_ra_serf/util.c:1787
+#, fuzzy, c-format
+msgid "Unexpected server error %d '%s' on '%s'"
+msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
-#: ../libsvn_ra_serf/util.c:2571
+#: ../libsvn_ra_serf/util.c:1791
+#, fuzzy, c-format
+msgid "The requested feature is not supported by '%s'"
+msgstr "“%s†ä¸æ”¯æŒå–回åˆå¹¶ä¿¡æ¯"
+
+#: ../libsvn_ra_serf/util.c:1797
+#, fuzzy, c-format
+msgid "Unexpected HTTP status %d '%s' on '%s'"
+msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
+
+#: ../libsvn_ra_serf/util.c:1815
+#, fuzzy, c-format
+msgid "Path '%s' unexpectedly created"
+msgstr "节点 “%s†的类型æ„外改å˜"
+
+#: ../libsvn_ra_serf/util.c:1824
+#, fuzzy, c-format
+msgid "Unexpected HTTP status %d '%s' on '%s' request to '%s'"
+msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
+
+#: ../libsvn_ra_serf/xml.c:502
#, c-format
-msgid "The %s response contains invalid XML (%d %s)"
-msgstr "å“应 %s 包å«éžæ³• XML (%d %s)"
+msgid "XML stream truncated: closing '%s' missing"
+msgstr "XML æµè¢«æˆªæ–­: 丢失了 '%s' 的关闭标签"
+
+#: ../libsvn_ra_serf/xml.c:530
+#, fuzzy
+msgid "document element not found"
+msgstr "找ä¸åˆ° Header 的结æŸæ ‡è®°"
-#: ../libsvn_ra_serf/xml.c:674
+#: ../libsvn_ra_serf/xml.c:533
#, c-format
-msgid "Missing XML attribute: '%s'"
+msgid "XML stream truncated: %s"
+msgstr "XML æµè¢«æˆªæ–­: %s"
+
+#: ../libsvn_ra_serf/xml.c:698
+#, fuzzy, c-format
+msgid "XML Parsing failed: Unexpected root element '%s'"
+msgstr "XML 解æžå¤±è´¥: (%d %s)"
+
+#: ../libsvn_ra_serf/xml.c:758
+#, fuzzy, c-format
+msgid "Missing XML attribute '%s' on '%s' element"
msgstr "缺少 XML 属性: '%s'"
-#: ../libsvn_ra_serf/xml.c:749
-msgid "The response contains invalid XML"
+#: ../libsvn_ra_serf/xml.c:916
+#, fuzzy, c-format
+msgid "Malformed XML: %s"
+msgstr "éžæ³• XML: %s 在第 %ld è¡Œ"
+
+#: ../libsvn_ra_serf/xml.c:918
+#, fuzzy
+msgid "The XML response contains invalid XML"
msgstr "æ­¤å“应包å«éžæ³• XML"
-#: ../libsvn_ra_svn/client.c:141
+#: ../libsvn_ra_svn/client.c:142
#, c-format
msgid "Unknown hostname '%s'"
msgstr "未知的主机“%sâ€"
-#: ../libsvn_ra_svn/client.c:166
+#: ../libsvn_ra_svn/client.c:167
#, c-format
msgid "Can't connect to host '%s'"
msgstr "无法连接主机“%sâ€"
-#: ../libsvn_ra_svn/client.c:204
+#: ../libsvn_ra_svn/client.c:205
msgid "Prop diffs element not a list"
msgstr "Prop diffs 元素ä¸æ˜¯ä¸€ä¸ªåˆ—表"
-#: ../libsvn_ra_svn/client.c:402
+#: ../libsvn_ra_svn/client.c:404
#, c-format
msgid "Undefined tunnel scheme '%s'"
msgstr "无法识别的隧é“方案 “%sâ€"
-#: ../libsvn_ra_svn/client.c:419
+#: ../libsvn_ra_svn/client.c:421
#, c-format
msgid "Tunnel scheme %s requires environment variable %s to be defined"
msgstr "隧é“方案 %s 需è¦è®¾å®šçŽ¯å¢ƒå˜é‡ %s"
-#: ../libsvn_ra_svn/client.c:430
+#: ../libsvn_ra_svn/client.c:432
#, c-format
msgid "Can't tokenize command '%s'"
msgstr "ä¸èƒ½è§£æžå‘½ä»¤â€œ%sâ€"
-#: ../libsvn_ra_svn/client.c:463
+#: ../libsvn_ra_svn/client.c:475
#, c-format
msgid "Error in child process: %s"
msgstr "å­è¿›ç¨‹é”™è¯¯: %s"
-#: ../libsvn_ra_svn/client.c:538
-msgid ""
-"To better debug SSH connection problems, remove the -q option from 'ssh' in "
-"the [tunnels] section of your Subversion configuration file."
-msgstr ""
-"为了更好的诊断 SSH 连接问题,请从你的 Subversion é…置文件中,[tunnels] 节,删"
-"除 ssh 命令行å‚æ•° -q 。"
+#: ../libsvn_ra_svn/client.c:554
+msgid "To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file."
+msgstr "为了更好的诊断 SSH 连接问题,请从你的 Subversion é…置文件中,[tunnels] 节,删除 ssh 命令行å‚æ•° -q 。"
-#: ../libsvn_ra_svn/client.c:556
+#: ../libsvn_ra_svn/client.c:572
#, c-format
msgid "Illegal svn repository URL '%s'"
msgstr "éžæ³•çš„svn版本库URL“%sâ€"
-#: ../libsvn_ra_svn/client.c:636
+#: ../libsvn_ra_svn/client.c:719
#, c-format
msgid "Server requires minimum version %d"
msgstr "æœåŠ¡å™¨è¦æ±‚的最低版本是 %d"
-#: ../libsvn_ra_svn/client.c:640
+#: ../libsvn_ra_svn/client.c:723
#, c-format
msgid "Server only supports versions up to %d"
msgstr "æœåŠ¡å™¨æ”¯æŒçš„版本ä¸å¤§äºŽ %d"
-#: ../libsvn_ra_svn/client.c:648
+#: ../libsvn_ra_svn/client.c:731
msgid "Server does not support edit pipelining"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒæµæ°´çº¿ç¼–辑"
-#: ../libsvn_ra_svn/client.c:685
+#: ../libsvn_ra_svn/client.c:768
msgid "Impossibly long repository root from server"
msgstr "æœåŠ¡å™¨è¿”回的版本库根路径太长"
-#: ../libsvn_ra_svn/client.c:697
+#: ../libsvn_ra_svn/client.c:780
msgid ""
"Module for accessing a repository using the svn network protocol.\n"
" - with Cyrus SASL authentication"
msgstr "使用 svn 网络å议访问版本库的模å—。 - 使用 Cyrus SASL 认è¯"
-#: ../libsvn_ra_svn/client.c:701
+#: ../libsvn_ra_svn/client.c:784
msgid "Module for accessing a repository using the svn network protocol."
msgstr "使用 svn 网络å议访问版本库的模å—。"
-#: ../libsvn_ra_svn/client.c:911
+#: ../libsvn_ra_svn/client.c:1031
msgid "Server did not send repository root"
msgstr "æœåŠ¡å™¨æ²¡æœ‰è¿”回版本库根路径"
-#: ../libsvn_ra_svn/client.c:985
-msgid ""
-"Server doesn't support setting arbitrary revision properties during commit"
+#: ../libsvn_ra_svn/client.c:1104
+#, c-format
+msgid "ra_svn does not support not specifying a log message with pre-1.5 servers; consider passing an empty one, or upgrading the server"
+msgstr ""
+
+#: ../libsvn_ra_svn/client.c:1127
+msgid "Server doesn't support setting arbitrary revision properties during commit"
msgstr "在æ交时,æœåŠ¡å™¨ä¸æ”¯æŒè®¾ç½®ä»»æ„版本属性"
-#: ../libsvn_ra_svn/client.c:1088
+#: ../libsvn_ra_svn/client.c:1230
+#, fuzzy
msgid "Inherited proplist element not a list"
-msgstr "继承的属性列表元素ä¸æ˜¯åˆ—表"
+msgstr "Proplist 元素ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1163
+#: ../libsvn_ra_svn/client.c:1305
msgid "Non-string as part of file contents"
msgstr "部分文件内容ä¸æ˜¯å­—符串"
-#: ../libsvn_ra_svn/client.c:1249
+#: ../libsvn_ra_svn/client.c:1394
msgid "Dirlist element not a list"
msgstr "目录列表元素ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1334
+#: ../libsvn_ra_svn/client.c:1403
+#, fuzzy, c-format
+msgid "Invalid directory entry name '%s'"
+msgstr "无法在 “%s†读å–目录内容"
+
+#: ../libsvn_ra_svn/client.c:1486
msgid "Mergeinfo element is not a list"
msgstr "Mergeinfo 元素ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1539
+#: ../libsvn_ra_svn/client.c:1705
msgid "Log entry not a list"
msgstr "日志æ¡ç›®ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1586
+#: ../libsvn_ra_svn/client.c:1753
msgid "Changed-path entry not a list"
msgstr "已修改路径æ¡ç›®ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1711
+#: ../libsvn_ra_svn/client.c:1908
msgid "'stat' not implemented"
msgstr "未实现“statâ€"
-#: ../libsvn_ra_svn/client.c:1770
+#: ../libsvn_ra_svn/client.c:1967
msgid "'get-locations' not implemented"
msgstr "未实现“get-locationsâ€"
-#: ../libsvn_ra_svn/client.c:1785
+#: ../libsvn_ra_svn/client.c:1982
msgid "Location entry not a list"
msgstr "区域æ¡ç›®ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1824
+#: ../libsvn_ra_svn/client.c:2021
msgid "'get-location-segments' not implemented"
msgstr "未实现 “get-location-segmentsâ€"
-#: ../libsvn_ra_svn/client.c:1841
+#: ../libsvn_ra_svn/client.c:2038
msgid "Location segment entry not a list"
msgstr "ä½ç½®åˆ†æ®µå…¥å£ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1851
+#: ../libsvn_ra_svn/client.c:2048
msgid "Expected valid revision range"
msgstr "期望åˆæ³•çš„版本范围"
-#: ../libsvn_ra_svn/client.c:1892
+#: ../libsvn_ra_svn/client.c:2089
msgid "'get-file-revs' not implemented"
msgstr "未实现“get-file-revsâ€"
-#: ../libsvn_ra_svn/client.c:1916
+#: ../libsvn_ra_svn/client.c:2113
msgid "Revision entry not a list"
msgstr "版本æ¡ç›®ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:1933 ../libsvn_ra_svn/client.c:1963
+#: ../libsvn_ra_svn/client.c:2130 ../libsvn_ra_svn/client.c:2160
msgid "Text delta chunk not a string"
msgstr "文本差异å—ä¸æ˜¯å­—符串"
-#: ../libsvn_ra_svn/client.c:1975
+#: ../libsvn_ra_svn/client.c:2172
msgid "The get-file-revs command didn't return any revisions"
msgstr "get-file-revs 命令没有返回任何版本"
-#: ../libsvn_ra_svn/client.c:2022
+#: ../libsvn_ra_svn/client.c:2219
msgid "Server doesn't support the lock command"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒåŠ é”"
-#: ../libsvn_ra_svn/client.c:2086
+#: ../libsvn_ra_svn/client.c:2283
msgid "Server doesn't support the unlock command"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒè§£é”"
-#: ../libsvn_ra_svn/client.c:2184
+#: ../libsvn_ra_svn/client.c:2381
msgid "Lock response not a list"
msgstr "加é”å“应ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:2198
+#: ../libsvn_ra_svn/client.c:2395
msgid "Unknown status for lock command"
msgstr "加é”命令的状æ€æœªçŸ¥"
-#: ../libsvn_ra_svn/client.c:2222
+#: ../libsvn_ra_svn/client.c:2419
msgid "Didn't receive end marker for lock responses"
msgstr "加é”å“应没有结æŸæ ‡è®°"
-#: ../libsvn_ra_svn/client.c:2312
+#: ../libsvn_ra_svn/client.c:2509
msgid "Unlock response not a list"
msgstr "解é”å“应ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:2326
+#: ../libsvn_ra_svn/client.c:2523
msgid "Unknown status for unlock command"
msgstr "未知的解é”命令状æ€"
-#: ../libsvn_ra_svn/client.c:2349
+#: ../libsvn_ra_svn/client.c:2546
msgid "Didn't receive end marker for unlock responses"
msgstr "解é”å“应没有结æŸæ ‡è®°"
-#: ../libsvn_ra_svn/client.c:2373 ../libsvn_ra_svn/client.c:2425
+#: ../libsvn_ra_svn/client.c:2570 ../libsvn_ra_svn/client.c:2622
msgid "Server doesn't support the get-lock command"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒå‘½ä»¤ get-lock"
-#: ../libsvn_ra_svn/client.c:2439
+#: ../libsvn_ra_svn/client.c:2636
msgid "Lock element not a list"
msgstr "Lock元素ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/client.c:2482
+#: ../libsvn_ra_svn/client.c:2679
msgid "Server doesn't support the replay command"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒé‡æ”¾å‘½ä»¤"
-#: ../libsvn_ra_svn/client.c:2513
+#: ../libsvn_ra_svn/client.c:2710
msgid "Server doesn't support the replay-range command"
msgstr "æœåŠ¡å™¨ä¸æ”¯æŒé‡æ”¾èŒƒå›´å‘½ä»¤"
-#: ../libsvn_ra_svn/client.c:2531
+#: ../libsvn_ra_svn/client.c:2728
#, c-format
msgid "Expected 'revprops', found '%s'"
msgstr "期望“revpropsâ€ï¼Œå‘现“%sâ€"
-#: ../libsvn_ra_svn/client.c:2548
+#: ../libsvn_ra_svn/client.c:2745
msgid "Error while replaying commit"
msgstr "é‡æ¼”æ交æ“作错误"
-#: ../libsvn_ra_svn/client.c:2621
+#: ../libsvn_ra_svn/client.c:2818
msgid "'get-deleted-rev' not implemented"
msgstr "未实现 “get-deleted-revâ€"
-#: ../libsvn_ra_svn/client.c:2720
+#: ../libsvn_ra_svn/client.c:2929
#, c-format
msgid "Unsupported RA loader version (%d) for ra_svn"
msgstr "ä¸æ”¯æŒ ra_svn RA 加载器版本(%d)"
@@ -4848,38 +5367,38 @@ msgstr "ä¸èƒ½åˆå§‹åŒ– SASL 库: %s%s"
msgid "Could not create SASL context: %s%s"
msgstr "ä¸èƒ½åˆ›å»º SASL 上下文: %s%s"
-#: ../libsvn_ra_svn/cyrus_auth.c:921 ../libsvn_ra_svn/internal_auth.c:63
+#: ../libsvn_ra_svn/cyrus_auth.c:932 ../libsvn_ra_svn/internal_auth.c:63
#: ../libsvn_ra_svn/internal_auth.c:114
#, c-format
msgid "Authentication error from server: %s"
msgstr "æœåŠ¡å™¨æŠ¥å‘Šè®¤è¯é”™è¯¯: %s"
-#: ../libsvn_ra_svn/cyrus_auth.c:925
+#: ../libsvn_ra_svn/cyrus_auth.c:936
msgid "Can't get username or password"
msgstr "无法å–得用户å称或密ç "
-#: ../libsvn_ra_svn/editorp.c:145
+#: ../libsvn_ra_svn/editorp.c:147
msgid "Successful edit status returned too soon"
msgstr "太快返回编辑æˆåŠŸçŠ¶æ€"
-#: ../libsvn_ra_svn/editorp.c:487
+#: ../libsvn_ra_svn/editorp.c:491
msgid "Invalid file or dir token during edit"
msgstr "编辑时é‡åˆ°æ— æ•ˆçš„文件或目录令牌"
-#: ../libsvn_ra_svn/editorp.c:715
+#: ../libsvn_ra_svn/editorp.c:719
msgid "Apply-textdelta already active"
msgstr "å·²ç»æ¿€æ´» Apply-textdelta"
-#: ../libsvn_ra_svn/editorp.c:737 ../libsvn_ra_svn/editorp.c:755
+#: ../libsvn_ra_svn/editorp.c:741 ../libsvn_ra_svn/editorp.c:759
msgid "Apply-textdelta not active"
msgstr "没有激活 Apply-textdelta"
-#: ../libsvn_ra_svn/editorp.c:850
+#: ../libsvn_ra_svn/editorp.c:854
#, c-format
msgid "Command 'finish-replay' invalid outside of replays"
msgstr "finish-replay命令åªåœ¨é‡æ”¾æ—¶æœ‰æ•ˆ"
-#: ../libsvn_ra_svn/editorp.c:954 ../libsvn_ra_svn/marshal.c:1498
+#: ../libsvn_ra_svn/editorp.c:958 ../libsvn_ra_svn/marshal.c:1608
#, c-format
msgid "Unknown editor command '%s'"
msgstr "未知编辑器命令“%sâ€"
@@ -4888,63 +5407,63 @@ msgstr "未知编辑器命令“%sâ€"
msgid "Can't get password"
msgstr "无法å–得密ç "
-#: ../libsvn_ra_svn/marshal.c:151
+#: ../libsvn_ra_svn/marshal.c:147
msgid "Capability entry is not a word"
msgstr "容é‡ç±»åž‹ä¸æ˜¯ word "
-#: ../libsvn_ra_svn/marshal.c:941
+#: ../libsvn_ra_svn/marshal.c:952
msgid "String length larger than maximum"
msgstr "字符串长度超出上é™"
-#: ../libsvn_ra_svn/marshal.c:1007
-msgid "Too many nested items"
-msgstr "太多嵌套的项"
+#: ../libsvn_ra_svn/marshal.c:1019
+msgid "Items are nested too deeply"
+msgstr "æ¡ç›®åµŒå¥—太深"
-#: ../libsvn_ra_svn/marshal.c:1027 ../libsvn_ra_svn/marshal.c:1105
+#: ../libsvn_ra_svn/marshal.c:1040 ../libsvn_ra_svn/marshal.c:1159
msgid "Number is larger than maximum"
msgstr "数字超过上é™"
-#: ../libsvn_ra_svn/marshal.c:1133
+#: ../libsvn_ra_svn/marshal.c:1071
+#, fuzzy
+msgid "Word is too long"
+msgstr "原å­çš„å称太长"
+
+#: ../libsvn_ra_svn/marshal.c:1187
msgid "Word too long"
msgstr "å•è¯å¤ªé•¿"
-#: ../libsvn_ra_svn/marshal.c:1351
+#: ../libsvn_ra_svn/marshal.c:1447
msgid "Proplist element not a list"
msgstr "Proplist 元素ä¸æ˜¯åˆ—表"
-#: ../libsvn_ra_svn/marshal.c:1390
+#: ../libsvn_ra_svn/marshal.c:1486
msgid "Empty error list"
msgstr "错误列表为空"
-#: ../libsvn_ra_svn/marshal.c:1399 ../libsvn_ra_svn/marshal.c:1425
+#: ../libsvn_ra_svn/marshal.c:1495 ../libsvn_ra_svn/marshal.c:1521
msgid "Malformed error list"
msgstr "错误列表éžæ³•"
-#: ../libsvn_ra_svn/marshal.c:1454
+#: ../libsvn_ra_svn/marshal.c:1550
#, c-format
msgid "Unknown status '%s' in command response"
msgstr "命令å“åº”ä¸­çš„çŠ¶æ€ â€œ%s†未知"
-#: ../libsvn_ra_svn/streams.c:78 ../libsvn_ra_svn/streams.c:157
+#: ../libsvn_ra_svn/streams.c:110
+#, c-format
+msgid "Can't get socket timeout"
+msgstr "无法获得 socket 超时"
+
+#: ../libsvn_ra_svn/streams.c:123
#, c-format
msgid "Can't read from connection"
msgstr "无法读å–连接"
-#: ../libsvn_ra_svn/streams.c:91 ../libsvn_ra_svn/streams.c:170
+#: ../libsvn_ra_svn/streams.c:134
#, c-format
msgid "Can't write to connection"
msgstr "无法写入连接"
-#: ../libsvn_ra_svn/streams.c:144
-#, c-format
-msgid "Can't get socket timeout"
-msgstr "无法获得 socket 超时"
-
-#: ../libsvn_repos/commit.c:170
-#, c-format
-msgid "'%s' is out of date"
-msgstr "“%s†已ç»è¿‡æ—¶"
-
#: ../libsvn_repos/commit.c:291
#, c-format
msgid "Got source path but no source revision for '%s'"
@@ -4996,8 +5515,8 @@ msgstr ""
"æ交åŽçš„文件系统进程出错:\n"
"%s"
-#: ../libsvn_repos/commit.c:1255 ../libsvn_repos/fs-wrap.c:98
-#: ../libsvn_repos/load-fs-vtable.c:978
+#: ../libsvn_repos/commit.c:1252 ../libsvn_repos/fs-wrap.c:117
+#: ../libsvn_repos/load-fs-vtable.c:1030
msgid "Commit succeeded, but post-commit hook failed"
msgstr "æ交æˆåŠŸï¼Œä½†æ˜¯åŽç½®æ交钩å­(post-commit)失败"
@@ -5005,31 +5524,29 @@ msgstr "æ交æˆåŠŸï¼Œä½†æ˜¯åŽç½®æ交钩å­(post-commit)失败"
msgid "Unable to open root of edit"
msgstr "无法打开根æ¥ç¼–辑"
-#: ../libsvn_repos/delta.c:247
+#: ../libsvn_repos/delta.c:236
msgid "Invalid target path"
msgstr "无效目标路径"
-#: ../libsvn_repos/delta.c:251
+#: ../libsvn_repos/delta.c:240
msgid "Delta depth 'exclude' not supported"
msgstr "ä¸æ”¯æŒå·®å¼‚深度 “excludeâ€"
-#: ../libsvn_repos/delta.c:277
-msgid ""
-"Invalid editor anchoring; at least one of the input paths is not a directory "
-"and there was no source entry"
+#: ../libsvn_repos/delta.c:266
+msgid "Invalid editor anchoring; at least one of the input paths is not a directory and there was no source entry"
msgstr "无效编辑器定ä½ï¼›è‡³å°‘一个输入路径ä¸æ˜¯ç›®å½•ï¼Œå¹¶ä¸”没有æºå…¥å£"
-#: ../libsvn_repos/deprecated.c:614 ../svnadmin/svnadmin.c:812
+#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:923
#, c-format
msgid "* Dumped revision %ld.\n"
msgstr "* 已转存版本 %ld。\n"
-#: ../libsvn_repos/deprecated.c:620 ../svnadmin/svnadmin.c:818
+#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:929
#, c-format
msgid "* Verified revision %ld.\n"
msgstr "* 已校验版本 %ld。\n"
-#: ../libsvn_repos/deprecated.c:628 ../svnadmin/svnadmin.c:866
+#: ../libsvn_repos/deprecated.c:661 ../svnadmin/svnadmin.c:977
#, c-format
msgid ""
"\n"
@@ -5040,7 +5557,7 @@ msgstr ""
"------- æ交åŽç‰ˆæœ¬ %ld >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:634 ../svnadmin/svnadmin.c:872
+#: ../libsvn_repos/deprecated.c:667 ../svnadmin/svnadmin.c:983
#, c-format
msgid ""
"\n"
@@ -5051,130 +5568,189 @@ msgstr ""
"------- æ交新版本 %ld (从原始版本 %ld 装载) >>>\n"
"\n"
-#: ../libsvn_repos/deprecated.c:647 ../svnadmin/svnadmin.c:885
+#: ../libsvn_repos/deprecated.c:680 ../svnadmin/svnadmin.c:996
#, c-format
msgid " * editing path : %s ..."
msgstr " * 正在修改路径: %s ..."
-#: ../libsvn_repos/deprecated.c:653 ../svnadmin/svnadmin.c:891
+#: ../libsvn_repos/deprecated.c:686 ../svnadmin/svnadmin.c:1002
#, c-format
msgid " * deleting path : %s ..."
msgstr " * 正在删除路径: %s ..."
-#: ../libsvn_repos/deprecated.c:659 ../svnadmin/svnadmin.c:897
+#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:1008
#, c-format
msgid " * adding path : %s ..."
msgstr " * 正在增加路径: %s ..."
-#: ../libsvn_repos/deprecated.c:665 ../svnadmin/svnadmin.c:903
+#: ../libsvn_repos/deprecated.c:698 ../svnadmin/svnadmin.c:1014
#, c-format
msgid " * replacing path : %s ..."
msgstr " * 正在替æ¢è·¯å¾„: %s ..."
-#: ../libsvn_repos/deprecated.c:675 ../svnadmin/svnadmin.c:912
+#: ../libsvn_repos/deprecated.c:708 ../svnadmin/svnadmin.c:1023
msgid " done.\n"
msgstr "完æˆã€‚\n"
-#: ../libsvn_repos/deprecated.c:685 ../svnadmin/svnadmin.c:921
+#: ../libsvn_repos/deprecated.c:718 ../svnadmin/svnadmin.c:1032
#, c-format
msgid "<<< Started new transaction, based on original revision %ld\n"
msgstr "<<< 开始新的事务,基于原始版本 %ld\n"
-#: ../libsvn_repos/deprecated.c:692 ../svnadmin/svnadmin.c:934
+#: ../libsvn_repos/deprecated.c:725 ../svnadmin/svnadmin.c:1045
#, c-format
msgid " removing '\\r' from %s ..."
msgstr "正在从 '%s' 删除 '\\r' ..."
-#: ../libsvn_repos/dump.c:267
+#: ../libsvn_repos/dump.c:570
+#, fuzzy, c-format
+msgid "Path '%s' not found in r%ld."
+msgstr "路径 “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
+
+#: ../libsvn_repos/dump.c:575
+#, fuzzy, c-format
+msgid "Unexpected node kind %d for '%s' at r%ld. Expected kind was %d."
+msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
+
+#: ../libsvn_repos/dump.c:613
+#, fuzzy, c-format
+msgid "Path '%s' exists in r%ld."
+msgstr "路径 “%s†存在,但被排除"
+
+#: ../libsvn_repos/dump.c:643
+#, c-format
+msgid "Mergeinfo referencing revision(s) prior to the oldest dumped revision (r%ld). Loading this dump may result in invalid mergeinfo."
+msgstr "åˆå¹¶ä¿¡æ¯å¼•ç”¨çš„版本比最旧的转存版本 (r%ld) 还旧。加载这个转存å¯èƒ½å¯¼è‡´éžæ³•çš„åˆå¹¶ä¿¡æ¯ã€‚"
+
+#: ../libsvn_repos/dump.c:752
+#, c-format
+msgid "Duplicate representation of path '%s' in %s property of '%s'"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:868
#, c-format
msgid "E%06d: While validating fspath '%s': %s"
msgstr "E%06d: 当验è¯æ–‡ä»¶ç³»ç»Ÿè·¯å¾„“%sâ€æ—¶å‡ºé”™ï¼š%s"
-#: ../libsvn_repos/dump.c:389
+#: ../libsvn_repos/dump.c:907
+#, fuzzy, c-format
+msgid "Change invalid path '%s' in r%ld"
+msgstr "无法移动路径 “%s†到本身"
+
+#: ../libsvn_repos/dump.c:932
+#, fuzzy, c-format
+msgid "Replacing non-existent path '%s' in r%ld"
+msgstr "试图删除ä¸å­˜åœ¨çš„属性“%sâ€äºŽâ€œ%sâ€\n"
+
+#: ../libsvn_repos/dump.c:957
#, c-format
-msgid ""
-"Referencing data in revision %ld, which is older than the oldest dumped "
-"revision (r%ld). Loading this dump into an empty repository will fail."
+msgid "Replacing path '%s' in r%ld with invalid path"
msgstr ""
-"版本 %ld 引用的数æ®æ¯”最旧的转存版本 (r%ld) 还旧。加载这个转存到空的版本库会失"
-"败。"
-#: ../libsvn_repos/dump.c:494
+#: ../libsvn_repos/dump.c:989
#, c-format
-msgid ""
-"Mergeinfo referencing revision(s) prior to the oldest dumped revision (r"
-"%ld). Loading this dump may result in invalid mergeinfo."
+msgid "Deleting invalid path '%s' in r%ld"
msgstr ""
-"åˆå¹¶ä¿¡æ¯å¼•ç”¨çš„版本比最旧的转存版本 (r%ld) 还旧。加载这个转存å¯èƒ½å¯¼è‡´éžæ³•çš„åˆ"
-"并信æ¯ã€‚"
-#: ../libsvn_repos/dump.c:1124 ../libsvn_repos/dump.c:1416
+#: ../libsvn_repos/dump.c:1007
+#, c-format
+msgid "Adding already existing path '%s' in r%ld"
+msgstr ""
+
+#: ../libsvn_repos/dump.c:1030
+#, fuzzy, c-format
+msgid "Copying from invalid path to '%s' in r%ld"
+msgstr "é…置错误: 无效å–值 “%sâ€ï¼Œå¯¹äºŽé€‰é¡¹ “%sâ€"
+
+#: ../libsvn_repos/dump.c:1042
+#, c-format
+msgid "Referencing data in revision %ld, which is older than the oldest dumped revision (r%ld). Loading this dump into an empty repository will fail."
+msgstr "版本 %ld 引用的数æ®æ¯”最旧的转存版本 (r%ld) 还旧。加载这个转存到空的版本库会失败。"
+
+#: ../libsvn_repos/dump.c:1809 ../libsvn_repos/dump.c:2211
#, c-format
msgid "Start revision %ld is greater than end revision %ld"
msgstr "起始版本 %ld 大于结æŸç‰ˆæœ¬ %ld"
-#: ../libsvn_repos/dump.c:1129 ../libsvn_repos/dump.c:1421
+#: ../libsvn_repos/dump.c:1814 ../libsvn_repos/dump.c:2216
#, c-format
msgid "End revision %ld is invalid (youngest revision is %ld)"
msgstr "结æŸç‰ˆæœ¬ %ld 无效 (最新版本是 %ld)"
-#: ../libsvn_repos/dump.c:1267
-msgid ""
-"The range of revisions dumped contained references to copy sources outside "
-"that range."
+#: ../libsvn_repos/dump.c:1927
+msgid "The range of revisions dumped contained references to copy sources outside that range."
msgstr "导出的版本范围包å«çš„引用超出导出范围。"
-#: ../libsvn_repos/dump.c:1281
-msgid ""
-"The range of revisions dumped contained mergeinfo which reference revisions "
-"outside that range."
+#: ../libsvn_repos/dump.c:1939
+msgid "The range of revisions dumped contained mergeinfo which reference revisions outside that range."
msgstr "导出的版本范围包å«çš„åˆå¹¶ä¿¡æ¯ï¼Œå…¶å¼•ç”¨çš„版本超出导出范围。"
-#: ../libsvn_repos/dump.c:1340
+#: ../libsvn_repos/dump.c:1993
+#, fuzzy, c-format
+msgid "Node '%s' is not a directory."
+msgstr "“%sâ€ä¸æ˜¯ç›®å½•"
+
+#: ../libsvn_repos/dump.c:2001
+#, fuzzy, c-format
+msgid "Node '%s' is not a file."
+msgstr "节点 '%s' ä¸æ˜¯æ–‡ä»¶"
+
+#: ../libsvn_repos/dump.c:2006
#, c-format
msgid "Unexpected node kind %d for '%s'"
msgstr "æ„外å‘现节点ç§ç±» %d 于“%sâ€"
-#: ../libsvn_repos/fs-wrap.c:183
+#: ../libsvn_repos/dump.c:2053
+#, fuzzy, c-format
+msgid "Duplicate representation of path '%s'"
+msgstr "没有修订版“%sâ€"
+
+#: ../libsvn_repos/dump.c:2262 ../libsvn_repos/dump.c:2315
+#, fuzzy, c-format
+msgid "Repository '%s' failed to verify"
+msgstr "版本库已ç»ç§»åŠ¨"
+
+#: ../libsvn_repos/fs-wrap.c:213
#, c-format
-msgid ""
-"Storage of non-regular property '%s' is disallowed through the repository "
-"interface, and could indicate a bug in your client"
+msgid "Storage of non-regular property '%s' is disallowed through the repository interface, and could indicate a bug in your client"
msgstr "ä¸å…许通过版本库接å£å­˜å‚¨éžæ­£è§„属性“%sâ€ï¼Œå®ƒè¯´æ˜Žæ‚¨çš„客户端有æ¼æ´ž"
-#: ../libsvn_repos/fs-wrap.c:198
+#: ../libsvn_repos/fs-wrap.c:228
#, c-format
msgid "Cannot accept '%s' property because it is not encoded in UTF-8"
msgstr "ä¸èƒ½æŽ¥å—属性 “%sâ€ï¼Œå› ä¸ºå®ƒçš„ç¼–ç ä¸æ˜¯ UTF-8"
-#: ../libsvn_repos/fs-wrap.c:208
+#: ../libsvn_repos/fs-wrap.c:238
#, c-format
msgid "Cannot accept non-LF line endings in '%s' property"
msgstr "ä¸èƒ½æŽ¥å—属性 “%sâ€ çš„éž LF 行结æŸç¬¦"
-#: ../libsvn_repos/fs-wrap.c:249
+#: ../libsvn_repos/fs-wrap.c:279
#, c-format
-msgid ""
-"Commit rejected because mergeinfo on '%s' contains unexpected string "
-"terminator"
+msgid "Commit rejected because mergeinfo on '%s' contains unexpected string terminator"
msgstr "由于 '%s' 上的åˆå¹¶ä¿¡æ¯åŒ…å«æ„外的字符串终结符,æ交被拒ç»"
-#: ../libsvn_repos/fs-wrap.c:256
+#: ../libsvn_repos/fs-wrap.c:286
#, c-format
msgid "Commit rejected because mergeinfo on '%s' is syntactically invalid"
msgstr "由于 '%s' 上的åˆå¹¶ä¿¡æ¯éžæ³•ï¼Œæ交被拒ç»"
-#: ../libsvn_repos/fs-wrap.c:386
+#: ../libsvn_repos/fs-wrap.c:416
#, c-format
msgid "Write denied: not authorized to read all of revision %ld"
msgstr "æ‹’ç»å†™å…¥: 未授æƒè¯»å–版本 %ld 的所有数æ®ã€‚"
-#: ../libsvn_repos/fs-wrap.c:570
-#, c-format
-msgid "Cannot unlock path '%s', no authenticated username available"
+#: ../libsvn_repos/fs-wrap.c:629
+#, fuzzy
+msgid "Locking succeeded, but post-lock hook failed"
+msgstr "解é”æˆåŠŸï¼Œä½†æ˜¯åŽç½®è§£é”é’©å­(post-unlock)失败"
+
+#: ../libsvn_repos/fs-wrap.c:735
+#, fuzzy
+msgid "Cannot unlock, no authenticated username available"
msgstr "ä¸èƒ½è§£é™¤è·¯å¾„“%sâ€çš„é”定,没有å¯ç”¨çš„已授æƒç”¨æˆ·å"
-#: ../libsvn_repos/fs-wrap.c:586
+#: ../libsvn_repos/fs-wrap.c:783
msgid "Unlock succeeded, but post-unlock hook failed"
msgstr "解é”æˆåŠŸï¼Œä½†æ˜¯åŽç½®è§£é”é’©å­(post-unlock)失败"
@@ -5193,9 +5769,7 @@ msgstr "[没有å¯ç”¨çš„错误输出。]"
#: ../libsvn_repos/hooks.c:121
#, c-format
-msgid ""
-"'%s' hook failed (did not exit cleanly: apr_exit_why_e was %d, exitcode was "
-"%d). "
+msgid "'%s' hook failed (did not exit cleanly: apr_exit_why_e was %d, exitcode was %d). "
msgstr "é’©å­â€œ%sâ€å¤±è´¥(没有干净的退出: apr_exit_why_e 是 %d,exitcode 是 %d)。"
#: ../libsvn_repos/hooks.c:130
@@ -5247,79 +5821,79 @@ msgstr "å¯åŠ¨é’©å­â€œ%sâ€å¤±è´¥"
msgid "Error closing null file"
msgstr "关闭空文件出错"
-#: ../libsvn_repos/hooks.c:446
+#: ../libsvn_repos/hooks.c:454
#, c-format
msgid "Failed to run '%s' hook; broken symlink"
msgstr "è¿è¡Œé’©å­â€œ%sâ€å¤±è´¥ï¼›ç¬¦å·è¿žæŽ¥æŸå"
-#: ../libsvn_repos/hooks.c:664
+#: ../libsvn_repos/hooks.c:670
msgid ""
"Repository has not been enabled to accept revision propchanges;\n"
"ask the administrator to create a pre-revprop-change hook"
msgstr "此版本库ä¸å…许修改版本属性;请管ç†å‘˜åˆ›å»º pre-revprop-change é’©å­"
-#: ../libsvn_repos/load-fs-vtable.c:565 ../svnrdump/load_editor.c:766
+#: ../libsvn_repos/load-fs-vtable.c:576 ../svnrdump/load_editor.c:770
#, c-format
msgid "Relative source revision %ld is not available in current repository"
msgstr "当å‰ç‰ˆæœ¬åº“ä¸å­˜åœ¨ç›¸å¯¹æºç‰ˆæœ¬ %ld"
-#: ../libsvn_repos/load-fs-vtable.c:579
+#: ../libsvn_repos/load-fs-vtable.c:590
#, c-format
msgid ""
"Copy source checksum mismatch on copy from '%s'@%ld\n"
"to '%s' in rev based on r%ld"
msgstr "从 “%s@%ld†å¤åˆ¶åˆ° “%sâ€ï¼ŒåŸºäºŽç‰ˆæœ¬ r%ld çš„æºæ ¡éªŒå’Œä¸åŒ¹é…"
-#: ../libsvn_repos/load-fs-vtable.c:638
+#: ../libsvn_repos/load-fs-vtable.c:654
msgid "Malformed dumpstream: Revision 0 must not contain node records"
msgstr "éžæ³•çš„转存æµ: 版本 0 ä¸èƒ½åŒ…å«èŠ‚点记录"
-#: ../libsvn_repos/load-fs-vtable.c:654
+#: ../libsvn_repos/load-fs-vtable.c:670
#, c-format
msgid "Unrecognized node-action on node '%s'"
msgstr "节点“%sâ€çš„动作ä¸èƒ½è¯†åˆ«"
-#: ../libsvn_repos/load.c:54
+#: ../libsvn_repos/load.c:46
msgid "Premature end of content data in dumpstream"
msgstr "转存æµä¸­å†…容数æ®è¿‡æ—©ç»“æŸ"
-#: ../libsvn_repos/load.c:61
+#: ../libsvn_repos/load.c:53
msgid "Dumpstream data appears to be malformed"
msgstr "转存æµä¸­å‡ºçŽ°éžæ³•æ•°æ®"
-#: ../libsvn_repos/load.c:110
+#: ../libsvn_repos/load.c:102
#, c-format
msgid "Dump stream contains a malformed header (with no ':') at '%.20s'"
msgstr "转存æµåœ¨â€œ%.20sâ€åŒ…å«é”™è¯¯å¤´éƒ¨(没有“:â€)"
-#: ../libsvn_repos/load.c:123
+#: ../libsvn_repos/load.c:115
#, c-format
msgid "Dump stream contains a malformed header (with no value) at '%.20s'"
msgstr "转存æµåœ¨â€œ%.20sâ€åŒ…å«é”™è¯¯å¤´éƒ¨(没有值)"
-#: ../libsvn_repos/load.c:212
+#: ../libsvn_repos/load.c:204
msgid "Incomplete or unterminated property block"
msgstr "ä¸å®Œæ•´æˆ–未结æŸçš„属性å—"
-#: ../libsvn_repos/load.c:360
+#: ../libsvn_repos/load.c:344
msgid "Unexpected EOF writing contents"
msgstr "写内容时æ„外结æŸ"
-#: ../libsvn_repos/load.c:390
+#: ../libsvn_repos/load.c:374
#, c-format
msgid "Malformed dumpfile header '%s'"
msgstr "éžæ³•çš„转存文件头 '%s'"
-#: ../libsvn_repos/load.c:397
+#: ../libsvn_repos/load.c:381
#, c-format
msgid "Unsupported dumpfile version: %d"
msgstr "ä¸æ”¯æŒçš„转存文件版本: %d"
-#: ../libsvn_repos/load.c:538
+#: ../libsvn_repos/load.c:522
msgid "Unrecognized record type in stream"
msgstr "æµä¸­æœ‰æ— æ³•è¯†åˆ«çš„记录类型"
-#: ../libsvn_repos/load.c:645
+#: ../libsvn_repos/load.c:629
msgid "Sum of subblock sizes larger than total block content length"
msgstr "å­å—大å°ä¹‹å’Œå¤§äºŽå—内容长度"
@@ -5328,11 +5902,16 @@ msgstr "å­å—大å°ä¹‹å’Œå¤§äºŽå—内容长度"
msgid "'%s' not found in filesystem"
msgstr "在文件系统中找ä¸åˆ°â€œ%sâ€"
-#: ../libsvn_repos/replay.c:546 ../libsvn_repos/replay.c:1267
+#: ../libsvn_repos/replay.c:541 ../libsvn_repos/replay.c:1267
#, c-format
msgid "Filesystem path '%s' is neither a file nor a directory"
msgstr "文件系统中路径“%sâ€æ—¢ä¸æ˜¯æ–‡ä»¶ä¹Ÿä¸æ˜¯ç›®å½•"
+#: ../libsvn_repos/replay.c:556
+#, fuzzy
+msgid "Root directory already exists."
+msgstr "æ¡ç›®å·²å­˜åœ¨"
+
#: ../libsvn_repos/reporter.c:205
#, c-format
msgid "Invalid length (%%%s) when about to read a string"
@@ -5343,42 +5922,42 @@ msgstr "长度 (%%%s) 对于字符串éžæ³•"
msgid "Invalid depth (%c) for path '%s'"
msgstr "éžæ³•æ·±åº¦(%c)于路径 “%sâ€"
-#: ../libsvn_repos/reporter.c:951
+#: ../libsvn_repos/reporter.c:950
#, c-format
msgid "Working copy path '%s' does not exist in repository"
msgstr "工作副本路径“%sâ€ä¸åœ¨ç‰ˆæœ¬åº“中"
-#: ../libsvn_repos/reporter.c:1348
+#: ../libsvn_repos/reporter.c:1357
msgid "Not authorized to open root of edit operation"
msgstr "æ— æƒæ‰“开根进行编辑æ“作"
-#: ../libsvn_repos/reporter.c:1365
+#: ../libsvn_repos/reporter.c:1374
#, c-format
msgid "Target path '%s' does not exist"
msgstr "目标路径 “%s†ä¸å­˜åœ¨"
-#: ../libsvn_repos/reporter.c:1373
+#: ../libsvn_repos/reporter.c:1382
msgid "Cannot replace a directory from within"
msgstr "ä¸èƒ½åœ¨å­ç›®å½•ä¸­æ›¿æ¢ç›®å½•"
-#: ../libsvn_repos/reporter.c:1413
+#: ../libsvn_repos/reporter.c:1422
msgid "Invalid report for top level of working copy"
msgstr "最上层工作副本报告无效"
-#: ../libsvn_repos/reporter.c:1428
+#: ../libsvn_repos/reporter.c:1437
msgid "Two top-level reports with no target"
msgstr "两个最上层报告没有目标"
-#: ../libsvn_repos/reporter.c:1490
+#: ../libsvn_repos/reporter.c:1499
#, c-format
msgid "Unsupported report depth '%s'"
msgstr "ä¸æ”¯æŒæŠ¥å‘Šæ·±åº¦â€œ%sâ€"
-#: ../libsvn_repos/reporter.c:1520
+#: ../libsvn_repos/reporter.c:1529
msgid "Depth 'exclude' not supported for link"
msgstr "深度 “exclude†ä¸æ”¯æŒé“¾æŽ¥"
-#: ../libsvn_repos/reporter.c:1577
+#: ../libsvn_repos/reporter.c:1586
msgid "Request depth 'exclude' not supported"
msgstr "ä¸æ”¯æŒè¯·æ±‚的深度 “excludeâ€"
@@ -5399,131 +5978,137 @@ msgstr "正在创建数æ®åº“é”文件"
msgid "Creating lock dir"
msgstr "正在创建é”文件目录"
-#: ../libsvn_repos/repos.c:291
+#: ../libsvn_repos/repos.c:301
msgid "Creating hook directory"
msgstr "正在创建钩å­ç›®å½•"
-#: ../libsvn_repos/repos.c:373
+#: ../libsvn_repos/repos.c:385
msgid "Creating start-commit hook"
msgstr "正在创建 start-commit é’©å­"
-#: ../libsvn_repos/repos.c:465
+#: ../libsvn_repos/repos.c:479
msgid "Creating pre-commit hook"
msgstr "正在创建 pre-commit é’©å­"
-#: ../libsvn_repos/repos.c:543
+#: ../libsvn_repos/repos.c:559
msgid "Creating pre-revprop-change hook"
msgstr "正在创建 pre-revprop-change é’©å­"
-#: ../libsvn_repos/repos.c:783
+#: ../libsvn_repos/repos.c:805
msgid "Creating post-commit hook"
msgstr "正在创建 post-commit é’©å­"
-#: ../libsvn_repos/repos.c:975
+#: ../libsvn_repos/repos.c:998
msgid "Creating post-revprop-change hook"
msgstr "正在创建 post-revprop-change é’©å­"
-#: ../libsvn_repos/repos.c:987
+#: ../libsvn_repos/repos.c:1010
msgid "Creating conf directory"
msgstr "正在创建 conf 目录"
-#: ../libsvn_repos/repos.c:1071
+#: ../libsvn_repos/repos.c:1094
msgid "Creating svnserve.conf file"
msgstr "正在创建 svnserve.conf 文件"
-#: ../libsvn_repos/repos.c:1089
+#: ../libsvn_repos/repos.c:1112
msgid "Creating passwd file"
msgstr "正在创建 passwd 文件"
-#: ../libsvn_repos/repos.c:1131
+#: ../libsvn_repos/repos.c:1154
msgid "Creating authz file"
msgstr "正在创建 authz 文件"
-#: ../libsvn_repos/repos.c:1161
+#: ../libsvn_repos/repos.c:1184
+#, fuzzy
msgid "Creating hooks-env file"
-msgstr "正在创建 hooks-env 文件"
+msgstr "正在创建数æ®åº“é”文件"
-#: ../libsvn_repos/repos.c:1217
+#: ../libsvn_repos/repos.c:1240
msgid "Could not create top-level directory"
msgstr "无法创建最上层目录"
-#: ../libsvn_repos/repos.c:1227
+#: ../libsvn_repos/repos.c:1250
msgid "Creating DAV sandbox dir"
msgstr "正在创建 DAV 沙箱目录"
-#: ../libsvn_repos/repos.c:1296
+#: ../libsvn_repos/repos.c:1319
msgid "Error opening db lockfile"
msgstr "打开数æ®åº“é”文件出错"
-#: ../libsvn_repos/repos.c:1333
+#: ../libsvn_repos/repos.c:1357
#, c-format
msgid "'%s' is an existing repository"
msgstr "版本库的“%sâ€å·²ç»å­˜åœ¨"
-#: ../libsvn_repos/repos.c:1337
+#: ../libsvn_repos/repos.c:1362
#, c-format
msgid "'%s' is a subdirectory of an existing repository rooted at '%s'"
msgstr "“%s†是当å‰æ ¹ä¸º “%s†的版本库的å­ç›®å½•"
-#: ../libsvn_repos/repos.c:1345
+#: ../libsvn_repos/repos.c:1372
msgid "Repository creation failed"
msgstr "创建版本库失败"
-#: ../libsvn_repos/repos.c:1430
+#: ../libsvn_repos/repos.c:1462
#, c-format
msgid "Expected repository format '%d' or '%d'; found format '%d'"
msgstr "期望版本库格å¼æ˜¯â€œ%dâ€æˆ–“%dâ€ï¼›å‘现格å¼æ˜¯â€œ%dâ€"
-#: ../libsvn_repos/repos.c:1674
+#: ../libsvn_repos/repos.c:1766
#, c-format
msgid "unknown capability '%s'"
msgstr "未知特性“%sâ€"
-#: ../libsvn_repos/rev_hunt.c:71
+#: ../libsvn_repos/rev_hunt.c:73
#, c-format
msgid "Failed to find time on revision %ld"
msgstr "无法找到版本 %ld 的时间"
-#: ../libsvn_repos/rev_hunt.c:210 ../libsvn_repos/rev_hunt.c:325
+#: ../libsvn_repos/rev_hunt.c:208 ../libsvn_repos/rev_hunt.c:324
#, c-format
msgid "Invalid start revision %ld"
msgstr "无效起始版本 %ld"
-#: ../libsvn_repos/rev_hunt.c:518
+#: ../libsvn_repos/rev_hunt.c:500
msgid "Unreadable path encountered; access denied"
msgstr "é‡åˆ°ä¸å¯è¯»çš„路径;拒ç»è®¿é—®ã€‚"
-#: ../libsvn_repos/rev_hunt.c:1156 ../libsvn_repos/rev_hunt.c:1495
+#: ../libsvn_repos/rev_hunt.c:1120 ../libsvn_repos/rev_hunt.c:1459
#, c-format
msgid "'%s' is not a file in revision %ld"
msgstr "“%s†ä¸æ˜¯æ–‡ä»¶ï¼Œç‰ˆæœ¬ %ld"
-#: ../libsvn_subr/auth.c:221
+#: ../libsvn_subr/auth.c:224
+#, fuzzy
+msgid "No authentication providers registered"
+msgstr "所有的认è¯æ供者都ä¸å¯ç”¨"
+
+#: ../libsvn_subr/auth.c:230
#, c-format
msgid "No provider registered for '%s' credentials"
msgstr "没有æ供程åºä¸º '%s' 凭æ®æ³¨å†Œ"
-#: ../libsvn_subr/cache-membuffer.c:496
+#: ../libsvn_subr/cache-membuffer.c:640
#, c-format
msgid "Can't lock cache mutex"
msgstr "ä¸èƒ½é”定缓存互斥体"
-#: ../libsvn_subr/cache-membuffer.c:527 ../libsvn_subr/cache-membuffer.c:543
+#: ../libsvn_subr/cache-membuffer.c:678 ../libsvn_subr/cache-membuffer.c:702
#, c-format
msgid "Can't write-lock cache mutex"
msgstr "ä¸èƒ½èŽ·å¾—缓存互斥体的写入é”"
-#: ../libsvn_subr/cache-membuffer.c:562
+#: ../libsvn_subr/cache-membuffer.c:729
#, c-format
msgid "Can't unlock cache mutex"
msgstr "ä¸èƒ½è§£é”缓存互斥体"
-#: ../libsvn_subr/cache-membuffer.c:1299
+#: ../libsvn_subr/cache-membuffer.c:1830
#, c-format
msgid "Can't create cache mutex"
msgstr "无法创建缓存互斥体"
-#: ../libsvn_subr/cache-membuffer.c:2030
+#: ../libsvn_subr/cache-membuffer.c:2794
msgid "Can't iterate a membuffer-based cache"
msgstr "ä¸èƒ½è¿­ä»£åŸºäºŽå†…存的缓存"
@@ -5532,46 +6117,46 @@ msgstr "ä¸èƒ½è¿­ä»£åŸºäºŽå†…存的缓存"
msgid "Unknown memcached error while reading"
msgstr "当读å–时出现未知的 memcached 错误"
-#: ../libsvn_subr/cache-memcache.c:237
+#: ../libsvn_subr/cache-memcache.c:258
#, c-format
msgid "Unknown memcached error while writing"
msgstr "当写入时出现未知的 memcached 错误"
-#: ../libsvn_subr/cache-memcache.c:343
+#: ../libsvn_subr/cache-memcache.c:364
msgid "Can't iterate a memcached cache"
msgstr "ä¸èƒ½è¿­ä»£ memcached 缓存"
-#: ../libsvn_subr/cache-memcache.c:443
+#: ../libsvn_subr/cache-memcache.c:460
#, c-format
msgid "Error parsing memcache server '%s'"
msgstr "è§£æž memcache æœåŠ¡å™¨ “%s†时出错"
-#: ../libsvn_subr/cache-memcache.c:451
+#: ../libsvn_subr/cache-memcache.c:468
#, c-format
msgid "Scope not allowed in memcache server '%s'"
msgstr "memcache æœåŠ¡å™¨ “%s†中ä¸å…许出现范围"
-#: ../libsvn_subr/cache-memcache.c:459
+#: ../libsvn_subr/cache-memcache.c:476
#, c-format
msgid "Must specify host and port for memcache server '%s'"
msgstr "memcache æœåŠ¡å™¨ “%s†中必须指定主机和端å£"
-#: ../libsvn_subr/cache-memcache.c:479
+#: ../libsvn_subr/cache-memcache.c:496
#, c-format
msgid "Unknown error creating memcache server"
msgstr "创建 memcache æœåŠ¡å™¨æ—¶å‡ºçŽ°æœªçŸ¥é”™è¯¯"
-#: ../libsvn_subr/cache-memcache.c:487
+#: ../libsvn_subr/cache-memcache.c:504
#, c-format
msgid "Unknown error adding server to memcache"
msgstr "增加 memcache æœåŠ¡å™¨æ—¶å‡ºçŽ°æœªçŸ¥é”™è¯¯"
-#: ../libsvn_subr/cache-memcache.c:560
+#: ../libsvn_subr/cache-memcache.c:574
#, c-format
msgid "Unknown error creating apr_memcache_t"
msgstr "创建 memcache apr_memcache_t 时出现未知错误"
-#: ../libsvn_subr/checksum.c:470
+#: ../libsvn_subr/checksum.c:633
#, c-format
msgid ""
"%s:\n"
@@ -5582,102 +6167,120 @@ msgstr ""
" 期望: %s\n"
" 实际: %s\n"
-#: ../libsvn_subr/cmdline.c:646
+#: ../libsvn_subr/cmdline.c:760
#, c-format
msgid "Error initializing command line arguments"
msgstr "åˆå§‹åŒ–命令行å‚数出错"
-#: ../libsvn_subr/cmdline.c:735
+#: ../libsvn_subr/cmdline.c:849
msgid "Invalid syntax of argument of --config-option"
msgstr "å‚æ•° --config-option 的语法无效"
-#: ../libsvn_subr/cmdline.c:762
+#: ../libsvn_subr/cmdline.c:876
#, c-format
msgid "Unrecognized file in argument of %s"
msgstr "ä¸èƒ½è¯†åˆ«å‚æ•° %s 指定的文件"
-#: ../libsvn_subr/cmdline.c:1008
-msgid ""
-"The EDITOR, SVN_EDITOR or VISUAL environment variable or 'editor-cmd' run-"
-"time configuration option is empty or consists solely of whitespace. "
-"Expected a shell command."
-msgstr ""
-"环境å˜é‡ EDITOR,SVN_EDITOR,或 VISUAL;或者è¿è¡Œæ—¶é…置选项 “editor-cmd†为空"
-"或å–值包å«äº†ä¸åŠ å¼•å·çš„空格。期望外壳命令。"
+#: ../libsvn_subr/cmdline.c:1122
+msgid "The EDITOR, SVN_EDITOR or VISUAL environment variable or 'editor-cmd' run-time configuration option is empty or consists solely of whitespace. Expected a shell command."
+msgstr "环境å˜é‡ EDITOR,SVN_EDITOR,或 VISUAL;或者è¿è¡Œæ—¶é…置选项 “editor-cmd†为空或å–值包å«äº†ä¸åŠ å¼•å·çš„空格。期望外壳命令。"
-#: ../libsvn_subr/cmdline.c:1015
-msgid ""
-"None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and "
-"no 'editor-cmd' run-time configuration option was found"
-msgstr ""
-"没有设置 SVN_EDITOR,VISUAL 或 EDITOR 环境å˜é‡ï¼Œè¿è¡Œæ—¶çš„é…ç½®å‚数中也没有 "
-"“editor-cmd†选项"
+#: ../libsvn_subr/cmdline.c:1129
+msgid "None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found"
+msgstr "没有设置 SVN_EDITOR,VISUAL 或 EDITOR 环境å˜é‡ï¼Œè¿è¡Œæ—¶çš„é…ç½®å‚数中也没有 “editor-cmd†选项"
-#: ../libsvn_subr/cmdline.c:1040 ../libsvn_subr/cmdline.c:1124
+#: ../libsvn_subr/cmdline.c:1154 ../libsvn_subr/cmdline.c:1238
#, c-format
msgid "Can't get working directory"
msgstr "无法å–得工作目录"
-#: ../libsvn_subr/cmdline.c:1051 ../libsvn_subr/cmdline.c:1135
-#: ../libsvn_subr/cmdline.c:1160
+#: ../libsvn_subr/cmdline.c:1165 ../libsvn_subr/cmdline.c:1249
+#: ../libsvn_subr/cmdline.c:1274
#, c-format
msgid "Can't change working directory to '%s'"
msgstr "无法改å˜å·¥ä½œç›®å½•åˆ°â€œ%sâ€"
-#: ../libsvn_subr/cmdline.c:1059 ../libsvn_subr/cmdline.c:1307
+#: ../libsvn_subr/cmdline.c:1173 ../libsvn_subr/cmdline.c:1421
#, c-format
msgid "Can't restore working directory"
msgstr "无法还原工作目录"
-#: ../libsvn_subr/cmdline.c:1066 ../libsvn_subr/cmdline.c:1242
+#: ../libsvn_subr/cmdline.c:1180 ../libsvn_subr/cmdline.c:1356
#, c-format
msgid "system('%s') returned %d"
msgstr "system('%s') 返回 %d"
-#: ../libsvn_subr/cmdline.c:1187
+#: ../libsvn_subr/cmdline.c:1301
#, c-format
msgid "Can't write to '%s'"
msgstr "无法写入“%sâ€"
-#: ../libsvn_subr/cmdline.c:1202 ../libsvn_subr/cmdline.c:1217
-#: ../libsvn_subr/cmdline.c:1251 ../libsvn_subr/io.c:3609
+#: ../libsvn_subr/cmdline.c:1316 ../libsvn_subr/cmdline.c:1331
+#: ../libsvn_subr/cmdline.c:1365 ../libsvn_subr/io.c:3978
#, c-format
msgid "Can't stat '%s'"
msgstr "ä¸èƒ½å–得“%sâ€çš„状æ€"
-#: ../libsvn_subr/cmdline.c:1276
+#: ../libsvn_subr/cmdline.c:1390
msgid "Error normalizing edited contents to internal format"
msgstr "将编辑内容规格化为内部格å¼å‡ºé”™"
-#: ../libsvn_subr/config.c:739
+#: ../libsvn_subr/compress.c:143
+msgid "Compression of svndiff data failed"
+msgstr "压缩 svndiff æ•°æ®å¤±è´¥"
+
+#: ../libsvn_subr/compress.c:179
+#, fuzzy
+msgid "Decompression of zlib compressed data failed: no size"
+msgstr "解压 svndiff æ•°æ®å¤±è´¥: 没有长度"
+
+#: ../libsvn_subr/compress.c:182
+#, fuzzy
+msgid "Decompression of zlib compressed data failed: size too large"
+msgstr "解压 svndiff æ•°æ®å¤±è´¥: 长度太大"
+
+#: ../libsvn_subr/compress.c:207
+msgid "Decompression of svndiff data failed"
+msgstr "解压 svndiff æ•°æ®å¤±è´¥"
+
+#: ../libsvn_subr/compress.c:214
+msgid "Size of uncompressed data does not match stored original length"
+msgstr "解压åŽçš„æ•°æ®é•¿åº¦ä¸ŽåŽŸå§‹é•¿åº¦ä¸ç›¸ç­‰"
+
+#: ../libsvn_subr/compress.c:230
+#, fuzzy, c-format
+msgid "Unsupported compression method %d"
+msgstr "ä¸æ”¯æŒæŠ¥å‘Šæ·±åº¦â€œ%sâ€"
+
+#: ../libsvn_subr/config.c:804
#, c-format
msgid "Config error: invalid boolean value '%s' for '[%s] %s'"
msgstr "é…置错误: 无效布尔值 “%sâ€ï¼Œå¯¹äºŽ “[%s] %sâ€"
-#: ../libsvn_subr/config.c:744
+#: ../libsvn_subr/config.c:809
#, c-format
msgid "Config error: invalid boolean value '%s' for '%s'"
msgstr "é…置错误: 无效布尔值 “%sâ€ï¼Œå¯¹äºŽ “%sâ€"
-#: ../libsvn_subr/config.c:1173
+#: ../libsvn_subr/config.c:1238
#, c-format
msgid "Config error: invalid integer value '%s'"
msgstr "é…置错误: 无效整数值“%sâ€"
-#: ../libsvn_subr/config_auth.c:99
+#: ../libsvn_subr/config_auth.c:96
msgid "Unable to open auth file for reading"
msgstr "ä¸èƒ½æ‰“开认è¯æ–‡ä»¶è¯»å–æ•°æ®"
-#: ../libsvn_subr/config_auth.c:104
+#: ../libsvn_subr/config_auth.c:101
#, c-format
msgid "Error parsing '%s'"
msgstr "解æžâ€œ%sâ€æ—¶å‡ºé”™"
-#: ../libsvn_subr/config_auth.c:129
+#: ../libsvn_subr/config_auth.c:130
msgid "Unable to locate auth file"
msgstr "无法定ä½è®¤è¯æ–‡ä»¶æ–‡ä»¶"
-#: ../libsvn_subr/config_auth.c:140
+#: ../libsvn_subr/config_auth.c:142
msgid "Unable to open auth file for writing"
msgstr "无法打开认è¯æ–‡ä»¶å†™å…¥æ•°æ®"
@@ -5686,10 +6289,90 @@ msgstr "无法打开认è¯æ–‡ä»¶å†™å…¥æ•°æ®"
msgid "Error writing hash to '%s'"
msgstr "写哈希数æ®è‡³â€œ%sâ€æ—¶å‡ºé”™"
+#: ../libsvn_subr/config_file.c:344
+#, c-format
+msgid "line %d: Option must end with ':' or '='"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:387
+#, c-format
+msgid "line %d: Section header must end with ']'"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:554
+#, fuzzy, c-format
+msgid "Error while parsing config file: %s:"
+msgstr "é‡æ¼”æ交æ“作错误"
+
+#: ../libsvn_subr/config_file.c:596
+#, c-format
+msgid "line %d: Section header must start in the first column"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:609
+#, c-format
+msgid "line %d: Comment must start in the first column"
+msgstr ""
+
+#: ../libsvn_subr/config_file.c:624
+#, fuzzy, c-format
+msgid "line %d: Section header expected"
+msgstr "è¡Œæ„外结æŸ"
+
+#: ../libsvn_subr/config_file.c:628
+#, fuzzy, c-format
+msgid "line %d: Option expected"
+msgstr "è¡Œæ„外结æŸ"
+
+#: ../libsvn_subr/config_win.c:93
+#, fuzzy
+msgid "Can't determine the system config path"
+msgstr "ä¸èƒ½ç¡®å®šæœ¬åœ°è·¯å¾„ç¼–ç "
+
+#: ../libsvn_subr/config_win.c:94
+#, fuzzy
+msgid "Can't determine the user's config path"
+msgstr "ä¸èƒ½ç¡®å®šæœ¬åœ°è·¯å¾„ç¼–ç "
+
+#: ../libsvn_subr/config_win.c:137
+#, fuzzy
+msgid "Can't enumerate registry values"
+msgstr "无法创建目录 “%sâ€"
+
+#: ../libsvn_subr/config_win.c:154
+#, fuzzy
+msgid "Can't read registry value data"
+msgstr "无法读å–æµ"
+
+#: ../libsvn_subr/config_win.c:191
+#, fuzzy, c-format
+msgid "Unrecognised registry path '%s'"
+msgstr "“%s†的请求版本类型无法识别"
+
+#: ../libsvn_subr/config_win.c:203
+#, fuzzy, c-format
+msgid "Can't open registry key '%s'"
+msgstr "无法打开目录“%sâ€"
+
+#: ../libsvn_subr/config_win.c:207
+#, fuzzy, c-format
+msgid "Can't find registry key '%s'"
+msgstr "无法éšè—目录 “%sâ€"
+
+#: ../libsvn_subr/config_win.c:245
+#, fuzzy
+msgid "Can't enumerate registry keys"
+msgstr "无法创建目录 “%sâ€"
+
+#: ../libsvn_subr/config_win.c:255
+#, fuzzy
+msgid "Can't open existing subkey"
+msgstr "无法打开标准输入"
+
#: ../libsvn_subr/crypto.c:93
#, c-format
msgid "Failed to initialize cryptography subsystem"
-msgstr "åˆå§‹åŒ–加密å­ç³»ç»Ÿå¤±è´¥"
+msgstr ""
#: ../libsvn_subr/crypto.c:108
#, c-format
@@ -5699,7 +6382,7 @@ msgstr "ä»£ç  (%d), 原因 (\"%s\"), æ¶ˆæ¯ (\"%s\")"
#: ../libsvn_subr/crypto.c:134
#, c-format
msgid "Fetching error from APR"
-msgstr "从 APR å–出错误"
+msgstr "正在从 APR 获å–错误"
#: ../libsvn_subr/crypto.c:154
#, c-format
@@ -5708,11 +6391,11 @@ msgstr "获得éšæœºæ•°æ®å¤±è´¥"
#: ../libsvn_subr/crypto.c:224
msgid "OpenSSL crypto driver error"
-msgstr "OpenSSL 加密的驱动程åºé”™è¯¯"
+msgstr "OpenSSL 加密驱动错误"
#: ../libsvn_subr/crypto.c:228
msgid "Bad return value while loading crypto driver"
-msgstr "加载加密的驱动程åºæ—¶è¿”回ä¸æ­£ç¡®çš„值"
+msgstr "在加载加密驱动时,返回了错误的返回值"
#: ../libsvn_subr/crypto.c:234
msgid "Error creating OpenSSL crypto context"
@@ -5778,7 +6461,7 @@ msgstr "无法计算被请求的日期"
msgid "Can't expand time"
msgstr "无法明确时间"
-#: ../libsvn_subr/deprecated.c:360 ../libsvn_subr/opt.c:302
+#: ../libsvn_subr/deprecated.c:364 ../libsvn_subr/opt.c:302
msgid ""
"\n"
"Valid options:\n"
@@ -5786,7 +6469,7 @@ msgstr ""
"\n"
"有效选项: \n"
-#: ../libsvn_subr/deprecated.c:436 ../libsvn_subr/opt.c:417
+#: ../libsvn_subr/deprecated.c:440 ../libsvn_subr/opt.c:417
#, c-format
msgid ""
"\"%s\": unknown command.\n"
@@ -5795,335 +6478,332 @@ msgstr ""
"“%sâ€: 未知命令。\n"
"\n"
-#: ../libsvn_subr/deprecated.c:614 ../libsvn_subr/opt.c:1237
-#: ../svnrdump/svnrdump.c:646
+#: ../libsvn_subr/deprecated.c:618 ../libsvn_subr/opt.c:1232
+#: ../svnrdump/svnrdump.c:687
#, c-format
msgid "Type '%s help' for usage.\n"
msgstr "使用“%s helpâ€å¾—到用法。\n"
-#: ../libsvn_subr/deprecated.c:1022
+#: ../libsvn_subr/deprecated.c:1026
#, c-format
msgid "'%s' is neither a file nor a directory name"
msgstr "“%sâ€ä¸æ˜¯æ–‡ä»¶å也ä¸æ˜¯ç›®å½•å"
-#: ../libsvn_subr/dirent_uri.c:1604
+#: ../libsvn_subr/dirent_uri.c:1628
#, c-format
msgid "Couldn't determine absolute path of '%s'"
msgstr "ä¸èƒ½ç¡®å®šâ€œ%sâ€çš„ç»å¯¹è·¯å¾„"
-#: ../libsvn_subr/dirent_uri.c:2311
+#: ../libsvn_subr/dirent_uri.c:2342
#, c-format
msgid "Local URL '%s' does not contain 'file://' prefix"
msgstr "本地URL“%sâ€æ²¡æœ‰â€œfile://â€å‰ç¼€"
-#: ../libsvn_subr/dirent_uri.c:2390
+#: ../libsvn_subr/dirent_uri.c:2421
#, c-format
msgid "Local URL '%s' contains only a hostname, no path"
msgstr "本地URL“%sâ€åªæœ‰ä¸»æœºå称,没有路径"
-#: ../libsvn_subr/dirent_uri.c:2404
+#: ../libsvn_subr/dirent_uri.c:2435
#, c-format
msgid "Local URL '%s' contains unsupported hostname"
msgstr "本地URL“%sâ€åŒ…å«ä¸æ”¯æŒçš„主机å称"
-#: ../libsvn_subr/error.c:263
-msgid "Additional errors:"
-msgstr "é¢å¤–错误:"
-
-#: ../libsvn_subr/error.c:524
+#: ../libsvn_subr/error.c:530
msgid "Can't recode error string from APR"
msgstr "无法é‡æ–°ç¼–ç  APR 的错误信æ¯"
-#: ../libsvn_subr/error.c:624
+#: ../libsvn_subr/error.c:627
#, c-format
msgid "%swarning: W%06d: %s\n"
msgstr "%s 警告: W%06d: %s\n"
-#: ../libsvn_subr/error.c:706
+#: ../libsvn_subr/error.c:733
#, c-format
msgid "In file '%s' line %d: assertion failed (%s)"
msgstr "文件 “%sâ€ï¼Œè¡Œ %d:断言失败(%s)"
-#: ../libsvn_subr/error.c:710
+#: ../libsvn_subr/error.c:737
#, c-format
msgid "In file '%s' line %d: internal malfunction"
msgstr "文件 “%s†行 %d:内部故障"
-#: ../libsvn_subr/error.c:766
+#: ../libsvn_subr/error.c:799
msgid "stream error"
msgstr "æµå†™å…¥é”™è¯¯"
-#: ../libsvn_subr/error.c:771
+#: ../libsvn_subr/error.c:804
msgid "out of memory"
-msgstr "内存溢出"
+msgstr "内存ä¸è¶³"
-#: ../libsvn_subr/error.c:776
+#: ../libsvn_subr/error.c:809
msgid "buffer error"
msgstr "缓冲区写入错误"
-#: ../libsvn_subr/error.c:781
+#: ../libsvn_subr/error.c:814
msgid "version error"
msgstr "版本错误"
-#: ../libsvn_subr/error.c:786
+#: ../libsvn_subr/error.c:819
msgid "corrupt data"
msgstr "æŸåçš„æ•°æ®"
-#: ../libsvn_subr/error.c:791
+#: ../libsvn_subr/error.c:824
msgid "unknown error"
msgstr "未知错误"
-#: ../libsvn_subr/gpg_agent.c:342 ../libsvn_subr/prompt.c:631
+#: ../libsvn_subr/gpg_agent.c:409 ../libsvn_subr/prompt.c:627
#, c-format
msgid "Password for '%s': "
msgstr "“%sâ€çš„密ç : "
-#: ../libsvn_subr/gpg_agent.c:343
+#: ../libsvn_subr/gpg_agent.c:410
#, c-format
msgid "Enter your Subversion password for %s"
-msgstr "请为 %s 输入 Subversion 密ç "
+msgstr "为 %s 输入你的 Subversion 密ç "
-#: ../libsvn_subr/hash.c:120
+#: ../libsvn_subr/hash.c:126
msgid "Serialized hash missing terminator"
msgstr "åºåˆ—化哈希值没有终结符"
-#: ../libsvn_subr/hash.c:129 ../libsvn_subr/hash.c:142
-#: ../libsvn_subr/hash.c:153 ../libsvn_subr/hash.c:165
-#: ../libsvn_subr/hash.c:173 ../libsvn_subr/hash.c:183
-#: ../libsvn_subr/hash.c:196 ../libsvn_subr/hash.c:204
+#: ../libsvn_subr/hash.c:135 ../libsvn_subr/hash.c:148
+#: ../libsvn_subr/hash.c:160 ../libsvn_subr/hash.c:172
+#: ../libsvn_subr/hash.c:176 ../libsvn_subr/hash.c:186
+#: ../libsvn_subr/hash.c:199 ../libsvn_subr/hash.c:208
msgid "Serialized hash malformed"
msgstr "畸形的åºåˆ—化哈希值"
-#: ../libsvn_subr/hash.c:244
+#: ../libsvn_subr/hash.c:282
msgid "Cannot serialize negative length"
-msgstr "ä¸èƒ½åºåˆ—化负数长度"
+msgstr ""
-#: ../libsvn_subr/io.c:309
+#: ../libsvn_subr/io.c:331
#, c-format
msgid "Can't check path '%s'"
msgstr "无法检查路径 “%sâ€"
-#: ../libsvn_subr/io.c:537 ../libsvn_subr/io.c:4551
+#: ../libsvn_subr/io.c:559 ../libsvn_subr/io.c:4930
#, c-format
msgid "Can't open '%s'"
msgstr "ä¸èƒ½æ‰“å¼€ “%sâ€"
-#: ../libsvn_subr/io.c:563 ../libsvn_subr/io.c:649
+#: ../libsvn_subr/io.c:585 ../libsvn_subr/io.c:671
#, c-format
msgid "Unable to make name for '%s'"
msgstr "ä¸èƒ½ä¸º “%s†产生åå­—"
-#: ../libsvn_subr/io.c:636
+#: ../libsvn_subr/io.c:658
#, c-format
msgid "Can't create symbolic link '%s'"
msgstr "无法创建符å·è¿žæŽ¥ “%sâ€"
-#: ../libsvn_subr/io.c:653 ../libsvn_subr/io.c:686 ../libsvn_subr/io.c:714
+#: ../libsvn_subr/io.c:675 ../libsvn_subr/io.c:710 ../libsvn_subr/io.c:738
+#: ../libsvn_subr/io.c:1915
msgid "Symbolic links are not supported on this platform"
msgstr "此平å°ä¸æ”¯æŒç¬¦å·é“¾æŽ¥"
-#: ../libsvn_subr/io.c:676
+#: ../libsvn_subr/io.c:698 ../libsvn_subr/io.c:1874 ../libsvn_subr/io.c:1894
#, c-format
msgid "Can't read contents of link"
msgstr "ä¸èƒ½è¯»å–链接的内容"
-#: ../libsvn_subr/io.c:734
+#: ../libsvn_subr/io.c:758
#, c-format
msgid "Can't find a temporary directory"
msgstr "无法找到临时目录"
-#: ../libsvn_subr/io.c:852
+#: ../libsvn_subr/io.c:876
#, c-format
msgid "Can't copy '%s' to '%s'"
msgstr "ä¸èƒ½å¤åˆ¶ “%s†到 “%sâ€"
-#: ../libsvn_subr/io.c:895 ../libsvn_subr/io.c:917 ../libsvn_subr/io.c:963
+#: ../libsvn_subr/io.c:919 ../libsvn_subr/io.c:941 ../libsvn_subr/io.c:987
+#: ../libsvn_subr/io.c:5063
#, c-format
msgid "Can't set permissions on '%s'"
msgstr "ä¸èƒ½åœ¨ “%s†设置æƒé™"
-#: ../libsvn_subr/io.c:913 ../libsvn_subr/io.c:1977 ../libsvn_subr/io.c:2036
-#: ../libsvn_subr/io.c:4589
+#: ../libsvn_subr/io.c:937 ../libsvn_subr/io.c:2138 ../libsvn_subr/io.c:2197
+#: ../libsvn_subr/io.c:4968
#, c-format
msgid "Can't get file name"
msgstr "无法获å–文件å"
-#: ../libsvn_subr/io.c:987
+#: ../libsvn_subr/io.c:1011
#, c-format
msgid "Can't append '%s' to '%s'"
msgstr "ä¸èƒ½é™„加 “%s†到 “%sâ€"
-#: ../libsvn_subr/io.c:1033
+#: ../libsvn_subr/io.c:1057
#, c-format
msgid "Destination '%s' already exists"
msgstr "目的 “%s†已存在"
-#: ../libsvn_subr/io.c:1137
+#: ../libsvn_subr/io.c:1166
#, c-format
msgid "Can't make directory '%s'"
msgstr "无法创建目录 “%sâ€"
-#: ../libsvn_subr/io.c:1206
+#: ../libsvn_subr/io.c:1269
#, c-format
msgid "Can't set access time of '%s'"
msgstr "ä¸èƒ½è®¾ç½® “%s†的存å–时间"
-#: ../libsvn_subr/io.c:1523 ../libsvn_subr/io.c:1630
+#: ../libsvn_subr/io.c:1598 ../libsvn_subr/io.c:1700
#, c-format
msgid "Can't change perms of file '%s'"
msgstr "ä¸èƒ½æ”¹å˜æ–‡ä»¶ “%s†的æƒé™"
-#: ../libsvn_subr/io.c:1796
+#: ../libsvn_subr/io.c:1828
+#, fuzzy, c-format
+msgid "Can't get attributes of file '%s'"
+msgstr "无法从文件“%sâ€èŽ·å–属性信æ¯"
+
+#: ../libsvn_subr/io.c:1836
+#, fuzzy, c-format
+msgid "Can't set attributes of file '%s'"
+msgstr "无法从文件“%sâ€èŽ·å–属性信æ¯"
+
+#: ../libsvn_subr/io.c:1957
#, c-format
msgid "Can't set file '%s' read-only"
msgstr "无法设置文件 “%s†åªè¯»"
-#: ../libsvn_subr/io.c:1828
+#: ../libsvn_subr/io.c:1989
#, c-format
msgid "Can't set file '%s' read-write"
msgstr "无法设置文件 “%s†å¯è¯»å†™"
-#: ../libsvn_subr/io.c:1867 ../libsvn_subr/io.c:1901
+#: ../libsvn_subr/io.c:2028 ../libsvn_subr/io.c:2062
#, c-format
msgid "Error getting UID of process"
msgstr "获å–进程用户 ID(UID) 时出错"
-#: ../libsvn_subr/io.c:2003
+#: ../libsvn_subr/io.c:2164
#, c-format
msgid "Can't get shared lock on file '%s'"
msgstr "ä¸èƒ½èŽ·å–文件 “%s†的共享é”"
-#: ../libsvn_subr/io.c:2041
+#: ../libsvn_subr/io.c:2202
#, c-format
msgid "Can't unlock file '%s'"
msgstr "无法解é”文件“%sâ€"
-#: ../libsvn_subr/io.c:2096 ../libsvn_subr/io.c:3504
-#, c-format
-msgid "Can't flush file '%s'"
-msgstr "ä¸èƒ½åˆ·æ–°æ–‡ä»¶ “%sâ€"
-
-#: ../libsvn_subr/io.c:2097 ../libsvn_subr/io.c:3505
-#, c-format
-msgid "Can't flush stream"
-msgstr "ä¸èƒ½åˆ·æ–°æµ"
-
-#: ../libsvn_subr/io.c:2109 ../libsvn_subr/io.c:2126
+#: ../libsvn_subr/io.c:2300 ../libsvn_subr/io.c:2321
#, c-format
msgid "Can't flush file to disk"
msgstr "ä¸èƒ½åˆ·æ–°æ–‡ä»¶åˆ°ç£ç›˜"
-#: ../libsvn_subr/io.c:2218 ../libsvn_subr/prompt.c:197
-#: ../svnserve/svnserve.c:822
+#: ../libsvn_subr/io.c:2411 ../libsvn_subr/prompt.c:197
#, c-format
msgid "Can't open stdin"
msgstr "无法打开标准输入"
-#: ../libsvn_subr/io.c:2238
+#: ../libsvn_subr/io.c:2431
msgid "Reading from stdin is disallowed"
msgstr "ä¸æŽ¥å—从标准输入设备读å–"
-#: ../libsvn_subr/io.c:2305
+#: ../libsvn_subr/io.c:2498
#, c-format
msgid "Can't remove file '%s'"
msgstr "ä¸èƒ½ç§»åŠ¨æ–‡ä»¶â€œ%sâ€"
-#: ../libsvn_subr/io.c:2392
+#: ../libsvn_subr/io.c:2585
#, c-format
msgid "Can't remove '%s'"
msgstr "无法删除“%sâ€"
-#: ../libsvn_subr/io.c:2555
-#, c-format
+#: ../libsvn_subr/io.c:2748
+#, fuzzy, c-format
msgid "Path '%s' not found, case obstructed by '%s'"
-msgstr "没有å‘现路径“%sâ€ï¼Œå¤§å°å†™éšœç¢â€œ%sâ€"
+msgstr "路径 “%s†ä¸åœ¨ç‰ˆæœ¬ %ld 中"
-#: ../libsvn_subr/io.c:2594
-#, c-format
+#: ../libsvn_subr/io.c:2787
+#, fuzzy, c-format
msgid "Path '%s' not found"
-msgstr "路径“%sâ€æ‰¾ä¸åˆ°"
+msgstr "找ä¸åˆ° “%sâ€"
-#: ../libsvn_subr/io.c:2668
+#: ../libsvn_subr/io.c:2861
#, c-format
msgid "Can't create process '%s' attributes"
msgstr "无法创建进程“%sâ€çš„属性"
-#: ../libsvn_subr/io.c:2675
+#: ../libsvn_subr/io.c:2868
#, c-format
msgid "Can't set process '%s' cmdtype"
msgstr "无法设置进程“%sâ€çš„命令类型"
-#: ../libsvn_subr/io.c:2687
+#: ../libsvn_subr/io.c:2884
#, c-format
msgid "Can't set process '%s' directory"
msgstr "无法设定进程“%sâ€çš„目录"
-#: ../libsvn_subr/io.c:2701
+#: ../libsvn_subr/io.c:2898
#, c-format
msgid "Can't set process '%s' child input"
msgstr "无法设置“%sâ€çš„å­è¿›ç¨‹è¾“入文件"
-#: ../libsvn_subr/io.c:2709
+#: ../libsvn_subr/io.c:2906
#, c-format
msgid "Can't set process '%s' child outfile"
msgstr "无法设置“%sâ€çš„å­è¿›ç¨‹è¾“出文件"
-#: ../libsvn_subr/io.c:2717
+#: ../libsvn_subr/io.c:2914
#, c-format
msgid "Can't set process '%s' child errfile"
msgstr "无法设置“%sâ€çš„å­è¿›ç¨‹é”™è¯¯è¾“出文件"
-#: ../libsvn_subr/io.c:2731
+#: ../libsvn_subr/io.c:2928
#, c-format
msgid "Can't set process '%s' stdio pipes"
msgstr "无法设置进程“%sâ€çš„标准 IO 管é“"
-#: ../libsvn_subr/io.c:2739
+#: ../libsvn_subr/io.c:2936
#, c-format
msgid "Can't set process '%s' child errfile for error handler"
msgstr "无法为错误处ç†å‡½æ•°è®¾ç½®â€œ%sâ€çš„å­è¿›ç¨‹é”™è¯¯è¾“出文件"
-#: ../libsvn_subr/io.c:2746
+#: ../libsvn_subr/io.c:2943
#, c-format
msgid "Can't set process '%s' error handler"
msgstr "无法设置进程“%sâ€çš„错误处ç†å‡½æ•°"
-#: ../libsvn_subr/io.c:2769
+#: ../libsvn_subr/io.c:2966
#, c-format
msgid "Can't start process '%s'"
msgstr "ä¸èƒ½å–得进程“%sâ€çŠ¶æ€"
-#: ../libsvn_subr/io.c:2793
+#: ../libsvn_subr/io.c:2990
#, c-format
msgid "Error waiting for process '%s'"
msgstr "等待进程“%sâ€å‡ºé”™"
-#: ../libsvn_subr/io.c:2802
-#, c-format
+#: ../libsvn_subr/io.c:2999
+#, fuzzy, c-format
msgid "Process '%s' failed (signal %d, core dumped)"
-msgstr "进程“%sâ€å¤±è´¥(ä¿¡å· %d,已ç»æ ¸å¿ƒè½¬å‚¨)"
+msgstr "进程“%sâ€å¤±è´¥(返回 %d)"
-#: ../libsvn_subr/io.c:2807
-#, c-format
+#: ../libsvn_subr/io.c:3004
+#, fuzzy, c-format
msgid "Process '%s' failed (signal %d)"
-msgstr "进程“%sâ€å¤±è´¥(ä¿¡å· %d)"
+msgstr "进程“%sâ€å¤±è´¥(返回 %d)"
-#: ../libsvn_subr/io.c:2813
-#, c-format
+#: ../libsvn_subr/io.c:3010
+#, fuzzy, c-format
msgid "Process '%s' failed (exitwhy %d, exitcode %d)"
-msgstr "进程“%sâ€å¤±è´¥(exitwhy %d, exitcode %d)"
+msgstr "进程“%sâ€å¤±è´¥(返回 %d)"
-#: ../libsvn_subr/io.c:2821
+#: ../libsvn_subr/io.c:3018
#, c-format
msgid "Process '%s' returned error exitcode %d"
msgstr "进程“%sâ€è¿”å›žé”™è¯¯é€€å‡ºç  %d"
-#: ../libsvn_subr/io.c:2928
+#: ../libsvn_subr/io.c:3125
#, c-format
msgid "'%s' returned %d"
msgstr "“%s†返回 %d"
-#: ../libsvn_subr/io.c:3048
+#: ../libsvn_subr/io.c:3246
#, c-format
msgid ""
"Error running '%s': exitcode was %d, args were:\n"
@@ -6138,170 +6818,197 @@ msgstr ""
"%s\n"
"%s"
-#: ../libsvn_subr/io.c:3189
+#: ../libsvn_subr/io.c:3387
#, c-format
msgid "Can't detect MIME type of non-file '%s'"
msgstr "ä¸èƒ½æ£€æµ‹éžæ–‡ä»¶çš„“%sâ€ä¹‹MIME类型"
-#: ../libsvn_subr/io.c:3284
+#: ../libsvn_subr/io.c:3482
#, c-format
msgid "Can't open file '%s'"
msgstr "ä¸èƒ½æ‰“开文件“%sâ€"
-#: ../libsvn_subr/io.c:3324
+#: ../libsvn_subr/io.c:3522
#, c-format
msgid "Can't close file '%s'"
msgstr "无法关闭文件“%sâ€"
-#: ../libsvn_subr/io.c:3325
+#: ../libsvn_subr/io.c:3523
#, c-format
msgid "Can't close stream"
msgstr "无法关闭æµ"
-#: ../libsvn_subr/io.c:3334 ../libsvn_subr/io.c:3370 ../libsvn_subr/io.c:3395
+#: ../libsvn_subr/io.c:3532 ../libsvn_subr/io.c:3568 ../libsvn_subr/io.c:3593
+#: ../libsvn_subr/io.c:3682
#, c-format
msgid "Can't read file '%s'"
msgstr "ä¸èƒ½è¯»å–文件“%sâ€"
-#: ../libsvn_subr/io.c:3335 ../libsvn_subr/io.c:3371 ../libsvn_subr/io.c:3396
+#: ../libsvn_subr/io.c:3533 ../libsvn_subr/io.c:3569 ../libsvn_subr/io.c:3594
+#: ../libsvn_subr/io.c:3683
#, c-format
msgid "Can't read stream"
msgstr "无法读å–æµ"
-#: ../libsvn_subr/io.c:3344
+#: ../libsvn_subr/io.c:3542
#, c-format
msgid "Can't write file '%s'"
msgstr "无法写入文件“%sâ€"
-#: ../libsvn_subr/io.c:3345
+#: ../libsvn_subr/io.c:3543
#, c-format
msgid "Can't write stream"
msgstr "无法写入æµ"
-#: ../libsvn_subr/io.c:3359
+#: ../libsvn_subr/io.c:3557
#, c-format
msgid "Can't get attribute information from file '%s'"
msgstr "无法从文件“%sâ€èŽ·å–属性信æ¯"
-#: ../libsvn_subr/io.c:3360
+#: ../libsvn_subr/io.c:3558
#, c-format
msgid "Can't get attribute information from stream"
msgstr "无法从æµèŽ·å–属性信æ¯"
-#: ../libsvn_subr/io.c:3407
+#: ../libsvn_subr/io.c:3605
#, c-format
msgid "Can't set position pointer in file '%s'"
msgstr "无法在文件“%sâ€è®¾ç½®å®šä½æŒ‡é’ˆ"
-#: ../libsvn_subr/io.c:3408
+#: ../libsvn_subr/io.c:3606
#, c-format
msgid "Can't set position pointer in stream"
msgstr "无法在æµä¸­è®¾ç½®å®šä½æŒ‡é’ˆ"
-#: ../libsvn_subr/io.c:3419 ../libsvn_subr/io.c:3466
+#: ../libsvn_subr/io.c:3692
+#, fuzzy, c-format
+msgid "Can't seek in file '%s'"
+msgstr "ä¸èƒ½æ‰“开文件“%sâ€"
+
+#: ../libsvn_subr/io.c:3693
+#, fuzzy, c-format
+msgid "Can't seek in stream"
+msgstr "无法关闭æµ"
+
+#: ../libsvn_subr/io.c:3710 ../libsvn_subr/io.c:3767
#, c-format
msgid "Can't write to file '%s'"
msgstr "无法写入文件“%sâ€"
-#: ../libsvn_subr/io.c:3420 ../libsvn_subr/io.c:3467
+#: ../libsvn_subr/io.c:3711 ../libsvn_subr/io.c:3768
#, c-format
msgid "Can't write to stream"
msgstr "无法写入æµ"
-#: ../libsvn_subr/io.c:3509
+#: ../libsvn_subr/io.c:3721 ../libsvn_subr/io.c:3873
+#, c-format
+msgid "Can't flush file '%s'"
+msgstr "ä¸èƒ½åˆ·æ–°æ–‡ä»¶ “%sâ€"
+
+#: ../libsvn_subr/io.c:3722 ../libsvn_subr/io.c:3874
+#, c-format
+msgid "Can't flush stream"
+msgstr "ä¸èƒ½åˆ·æ–°æµ"
+
+#: ../libsvn_subr/io.c:3842
+#, fuzzy, c-format
+msgid "Can't write '%s' atomically"
+msgstr "无法写入“%sâ€"
+
+#: ../libsvn_subr/io.c:3878
#, c-format
msgid "Can't truncate file '%s'"
msgstr "ä¸èƒ½æˆªæ–­æ–‡ä»¶ “%sâ€"
-#: ../libsvn_subr/io.c:3510
+#: ../libsvn_subr/io.c:3879
#, c-format
msgid "Can't truncate stream"
msgstr "无法截断æµ"
-#: ../libsvn_subr/io.c:3583
+#: ../libsvn_subr/io.c:3952
#, c-format
msgid "Can't read length line in file '%s'"
msgstr "ä¸èƒ½ä»Žæ–‡ä»¶ “%s†中读å–é•¿è¡Œ"
-#: ../libsvn_subr/io.c:3587
+#: ../libsvn_subr/io.c:3956
msgid "Can't read length line in stream"
msgstr "无法从æµä¸­è¯»å–é•¿è¡Œ"
-#: ../libsvn_subr/io.c:3644
+#: ../libsvn_subr/io.c:4013 ../libsvn_subr/stream.c:2264
#, c-format
msgid "Can't move '%s' to '%s'"
msgstr "ä¸èƒ½ç§»åŠ¨ “%s†到 “%sâ€"
-#: ../libsvn_subr/io.c:3725
+#: ../libsvn_subr/io.c:4100
#, c-format
msgid "Can't create directory '%s'"
msgstr "无法创建目录 “%sâ€"
-#: ../libsvn_subr/io.c:3748
+#: ../libsvn_subr/io.c:4112 ../libsvn_subr/io.c:4126
#, c-format
msgid "Can't hide directory '%s'"
msgstr "无法éšè—目录 “%sâ€"
-#: ../libsvn_subr/io.c:3808 ../libsvn_subr/io.c:3931
+#: ../libsvn_subr/io.c:4187 ../libsvn_subr/io.c:4310
#, c-format
msgid "Can't open directory '%s'"
msgstr "无法打开目录“%sâ€"
-#: ../libsvn_subr/io.c:3843
+#: ../libsvn_subr/io.c:4222
#, c-format
msgid "Can't remove directory '%s'"
msgstr "无法删除目录 “%sâ€"
-#: ../libsvn_subr/io.c:3861
+#: ../libsvn_subr/io.c:4240
#, c-format
msgid "Can't read directory"
msgstr "无法读å–目录"
-#: ../libsvn_subr/io.c:3881
+#: ../libsvn_subr/io.c:4260
#, c-format
msgid "Error closing directory"
msgstr "关闭目录失败"
-#: ../libsvn_subr/io.c:3950
+#: ../libsvn_subr/io.c:4329
#, c-format
msgid "Can't read directory entry in '%s'"
msgstr "无法在 “%s†读å–目录内容"
-#: ../libsvn_subr/io.c:4076
+#: ../libsvn_subr/io.c:4455
#, c-format
msgid "Can't check directory '%s'"
msgstr "无法检查目录 “%sâ€"
-#: ../libsvn_subr/io.c:4138
+#: ../libsvn_subr/io.c:4517
#, c-format
msgid "Reading '%s'"
msgstr "æ­£åœ¨è¯»å– â€œ%sâ€"
-#: ../libsvn_subr/io.c:4157
+#: ../libsvn_subr/io.c:4536
#, c-format
msgid "First line of '%s' contains non-digit"
msgstr "“%s†的第一行包å«äº†éžæ•°å­—"
-#: ../libsvn_subr/io.c:4472
+#: ../libsvn_subr/io.c:4851
#, c-format
msgid "Can't create temporary file from template '%s'"
msgstr "无法从模版“%sâ€åˆ›å»ºä¸´æ—¶æ–‡ä»¶"
-#: ../libsvn_subr/io.c:4561
+#: ../libsvn_subr/io.c:4940
#, c-format
msgid "Can't set aside '%s'"
msgstr "ä¸èƒ½æ’¤é”€â€œ%sâ€"
-#: ../libsvn_subr/io.c:4573
+#: ../libsvn_subr/io.c:4952 ../libsvn_subr/stream.c:2078
#, c-format
msgid "Unable to make name in '%s'"
msgstr "ä¸èƒ½æŒ‰ç…§â€œ%sâ€ç”Ÿæˆåå­—"
-#: ../libsvn_subr/mergeinfo.c:100 ../libsvn_subr/mergeinfo.c:677
+#: ../libsvn_subr/mergeinfo.c:101 ../libsvn_subr/mergeinfo.c:698
msgid "Pathname not terminated by ':'"
msgstr "路径å称没有以 “:†结æŸ"
-#: ../libsvn_subr/mergeinfo.c:103
+#: ../libsvn_subr/mergeinfo.c:104
msgid "No pathname preceding ':'"
msgstr "没有路径å称å‰ç¼€ “:â€"
@@ -6322,8 +7029,7 @@ msgstr "ä¸èƒ½è§£æžåå‘的版本范围 “%ld - %ldâ€"
#: ../libsvn_subr/mergeinfo.c:545
#, c-format
-msgid ""
-"Unable to parse revision range '%ld-%ld' with same start and end revisions"
+msgid "Unable to parse revision range '%ld-%ld' with same start and end revisions"
msgstr "ä¸èƒ½è§£æžå¼€å§‹ä¸Žç»“æŸç‰ˆæœ¬ç›¸åŒçš„版本范围 “%ld-%ldâ€"
#: ../libsvn_subr/mergeinfo.c:582 ../libsvn_subr/mergeinfo.c:589
@@ -6335,90 +7041,54 @@ msgstr "在范围列表中å‘现无效字符 “%câ€"
msgid "Range list parsing ended before hitting newline"
msgstr "在é‡åˆ°æ–°è¡Œä¹‹å‰èŒƒå›´åˆ—表分æžç»“æŸ"
-#: ../libsvn_subr/mergeinfo.c:637
+#: ../libsvn_subr/mergeinfo.c:654
#, c-format
-msgid ""
-"Unable to parse overlapping revision ranges '%s' and '%s' with different "
-"inheritance types"
+msgid "Unable to parse overlapping revision ranges '%s' and '%s' with different inheritance types"
msgstr "ä¸æ”¯æŒè§£æžé‡å ä¸”继承类型ä¸åŒçš„版本范围 “%s†和 “%sâ€"
-#: ../libsvn_subr/mergeinfo.c:685
+#: ../libsvn_subr/mergeinfo.c:706
#, c-format
msgid "Mergeinfo for '%s' maps to an empty revision range"
msgstr "“%s†的åˆå¹¶ä¿¡æ¯æ˜ å°„到空的版本范围"
-#: ../libsvn_subr/mergeinfo.c:689
+#: ../libsvn_subr/mergeinfo.c:710
#, c-format
msgid "Could not find end of line in range list line in '%s'"
msgstr "在“%sâ€çš„范围列表行中没有找到行结æŸç¬¦"
-#: ../libsvn_subr/mergeinfo.c:753
+#: ../libsvn_subr/mergeinfo.c:779
#, c-format
msgid "Could not parse mergeinfo string '%s'"
msgstr "ä¸èƒ½è§£æžåˆå¹¶ä¿¡æ¯å­—符串“%sâ€"
-#: ../libsvn_subr/mergeinfo.c:2301
+#: ../libsvn_subr/mergeinfo.c:2340
msgid "NULL mergeinfo catalog\n"
msgstr "空值åˆå¹¶ä¿¡æ¯ç›®å½•\n"
-#: ../libsvn_subr/mergeinfo.c:2306
+#: ../libsvn_subr/mergeinfo.c:2345
msgid "empty mergeinfo catalog\n"
msgstr "空åˆå¹¶ä¿¡æ¯ç›®å½•\n"
-#: ../libsvn_subr/mutex.c:45
+#: ../libsvn_subr/mutex.c:69
#, c-format
msgid "Can't create mutex"
msgstr "无法创建互斥体"
-#: ../libsvn_subr/mutex.c:62
+#: ../libsvn_subr/mutex.c:86
#, c-format
msgid "Can't lock mutex"
msgstr "ä¸èƒ½é”定互斥体"
-#: ../libsvn_subr/mutex.c:78
+#: ../libsvn_subr/mutex.c:102
#, c-format
msgid "Can't unlock mutex"
msgstr "ä¸èƒ½è§£é”互斥体"
-#: ../libsvn_subr/named_atomic.c:335
-msgid "Not a valid atomic"
-msgstr "ä¸æ˜¯åˆæ³•çš„原å­æ•°æ®"
-
-#: ../libsvn_subr/named_atomic.c:474
-#, c-format
-msgid "MMAP failed for file '%s'"
-msgstr "创建内存映射文件“%sâ€å¤±è´¥"
-
-#: ../libsvn_subr/named_atomic.c:486
-msgid "Number of atomics in namespace is too large."
-msgstr "命å空间中的原å­æ•°é‡å¤ªå¤š"
-
-#: ../libsvn_subr/named_atomic.c:537
-msgid "Atomic's name is too long."
-msgstr "原å­çš„å称太长"
-
-#: ../libsvn_subr/named_atomic.c:543
-msgid "Namespace has not been initialized."
-msgstr "命å空间没有åˆå§‹åŒ–"
-
-#: ../libsvn_subr/named_atomic.c:591
-msgid "Out of slots for named atomic."
-msgstr "命å原å­çš„槽ä½å·²æ»¡"
-
-#: ../libsvn_subr/nls.c:80
+#: ../libsvn_subr/nls.c:69
#, c-format
-msgid "Can't convert string to UCS-2: '%s'"
-msgstr "ä¸èƒ½æŠŠå­—符串转æ¢ä¸º UCS-2: “%sâ€ã€‚"
-
-#: ../libsvn_subr/nls.c:87
msgid "Can't get module file name"
msgstr "无法获å–模å—文件å"
-#: ../libsvn_subr/nls.c:102
-#, c-format
-msgid "Can't convert module path to UTF-8 from UCS-2: '%s'"
-msgstr "ä¸èƒ½æŠŠæ¨¡å—路径从UCS-2转æ¢ä¸ºUTF-8: “%sâ€"
-
#: ../libsvn_subr/opt.c:189
msgid " ARG"
msgstr " ARG"
@@ -6431,42 +7101,37 @@ msgstr ""
"\n"
"全局选项: \n"
-#: ../libsvn_subr/opt.c:816
+#: ../libsvn_subr/opt.c:818
#, c-format
msgid "Syntax error parsing peg revision '%s'; did you mean '%s@'?"
msgstr "解æžé“†é’‰ç‰ˆæœ¬ '%s' æ—¶å‘生语法错误;你是ä¸æ˜¯æƒ³æ‰§è¡Œ '%s@'?"
-#: ../libsvn_subr/opt.c:822
+#: ../libsvn_subr/opt.c:824
#, c-format
msgid "Syntax error parsing peg revision '%s'"
msgstr "解æžé“†é’‰ç‰ˆæœ¬ '%s' æ—¶å‘生语法错误"
-#: ../libsvn_subr/opt.c:959
+#: ../libsvn_subr/opt.c:961
msgid "Revision property pair is empty"
msgstr "版本属性对为空"
-#: ../libsvn_subr/opt.c:979 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:336
+#: ../libsvn_subr/opt.c:981 ../svn/propedit-cmd.c:87 ../svn/propget-cmd.c:338
#: ../svn/propset-cmd.c:68
#, c-format
msgid "'%s' is not a valid Subversion property name"
msgstr "“%sâ€ä¸æ˜¯æœ‰æ•ˆçš„ Subversion 属性å称"
-#: ../libsvn_subr/opt.c:1016
-#, c-format
-msgid "'%s' is just a peg revision. Maybe try '%s@' instead?"
-msgstr "“%s†是铆钉版本。或许你应该使用 “%s@†?"
-
-#: ../libsvn_subr/opt.c:1062
+#: ../libsvn_subr/opt.c:1057
#, c-format
msgid "URL '%s' contains a '..' element"
msgstr "URL“%sâ€åŒ…å«â€œ..â€å…ƒç´ "
-#: ../libsvn_subr/opt.c:1095
+#: ../libsvn_subr/opt.c:1090
#, c-format
msgid "Error resolving case of '%s'"
msgstr "解æžâ€œ%sâ€å‡ºé”™"
-#: ../libsvn_subr/opt.c:1117
+#: ../libsvn_subr/opt.c:1112
#, c-format
msgid ""
"%s, version %s\n"
@@ -6477,7 +7142,7 @@ msgstr ""
" 编译于 %s,%s 在 %s\n"
"\n"
-#: ../libsvn_subr/opt.c:1134
+#: ../libsvn_subr/opt.c:1129
msgid ""
"System information:\n"
"\n"
@@ -6485,94 +7150,100 @@ msgstr ""
"系统信æ¯:\n"
"\n"
-#: ../libsvn_subr/opt.c:1135
-#, c-format
+#: ../libsvn_subr/opt.c:1130
+#, fuzzy, c-format
msgid "* running on %s\n"
msgstr "* è¿è¡ŒäºŽ %s\n"
-#: ../libsvn_subr/opt.c:1139
+#: ../libsvn_subr/opt.c:1134
#, c-format
msgid " - %s\n"
msgstr " - %s\n"
-#: ../libsvn_subr/opt.c:1149
+#: ../libsvn_subr/opt.c:1144
msgid "* linked dependencies:\n"
msgstr "* 链接的ä¾èµ–库:\n"
-#: ../libsvn_subr/opt.c:1174
+#: ../libsvn_subr/opt.c:1169
msgid "* loaded shared libraries:\n"
msgstr "* 已加载的共享库:\n"
+#: ../libsvn_subr/packed_data.c:736
+#, fuzzy
+msgid "Unexpected end of stream"
+msgstr "å…¥å£æ„外结æŸ"
+
+#: ../libsvn_subr/packed_data.c:742
+#, fuzzy
+msgid "Integer representation too long"
+msgstr "正在打开“representationsâ€è¡¨"
+
#: ../libsvn_subr/path.c:1114
#, c-format
msgid "Can't determine the native path encoding"
msgstr "ä¸èƒ½ç¡®å®šæœ¬åœ°è·¯å¾„ç¼–ç "
-#: ../libsvn_subr/path.c:1303
+#: ../libsvn_subr/path.c:1299
#, c-format
msgid "Improper relative URL '%s'"
msgstr "ä¸æ­£ç¡®çš„相对 URL“%sâ€"
#: ../libsvn_subr/prompt.c:147
+#, fuzzy
msgid "Can't close terminal"
-msgstr "ä¸èƒ½å…³é—­ç»ˆç«¯"
+msgstr "无法关闭æµ"
#: ../libsvn_subr/prompt.c:200
-#, c-format
+#, fuzzy, c-format
msgid "Can't open stderr"
-msgstr "ä¸èƒ½æ‰“开标准错误"
-
-#: ../libsvn_subr/prompt.c:263
-#, c-format
-msgid "Can't write to terminal"
-msgstr "无法写入终端"
+msgstr "无法打开标准输入"
-#: ../libsvn_subr/prompt.c:385 ../libsvn_subr/prompt.c:472
-#, c-format
+#: ../libsvn_subr/prompt.c:381 ../libsvn_subr/prompt.c:468
+#, fuzzy, c-format
msgid "Can't read from terminal"
-msgstr "无法读å–终端"
+msgstr "无法读å–连接"
-#: ../libsvn_subr/prompt.c:540
+#: ../libsvn_subr/prompt.c:536
msgid "End of file while reading from terminal"
msgstr "从终端读到了文件结æŸæ ‡è®°"
-#: ../libsvn_subr/prompt.c:602
+#: ../libsvn_subr/prompt.c:598 ../svn/auth-cmd.c:184
#, c-format
msgid "Authentication realm: %s\n"
msgstr "认è¯é¢†åŸŸ: %s\n"
-#: ../libsvn_subr/prompt.c:629 ../libsvn_subr/prompt.c:652
+#: ../libsvn_subr/prompt.c:625 ../libsvn_subr/prompt.c:648
msgid "Username: "
msgstr "用户å: "
-#: ../libsvn_subr/prompt.c:674
+#: ../libsvn_subr/prompt.c:670
#, c-format
msgid "Error validating server certificate for '%s':\n"
msgstr "验è¯â€œ%sâ€çš„æœåŠ¡å™¨è¯ä¹¦æ—¶å‡ºé”™: \n"
-#: ../libsvn_subr/prompt.c:680
+#: ../libsvn_subr/prompt.c:676
msgid ""
" - The certificate is not issued by a trusted authority. Use the\n"
" fingerprint to validate the certificate manually!\n"
msgstr " - æ­¤è¯ä¹¦å¹¶ä¸æ˜¯ç”±ä¿¡ä»»çš„æƒå¨æœºæƒé¢å‘。请使用此指纹手工验è¯å…¶æœ‰æ•ˆæ€§ï¼\n"
-#: ../libsvn_subr/prompt.c:687
+#: ../libsvn_subr/prompt.c:683
msgid " - The certificate hostname does not match.\n"
msgstr " - è¯ä¹¦çš„主机å称ä¸åŒ¹é…。\n"
-#: ../libsvn_subr/prompt.c:693
+#: ../libsvn_subr/prompt.c:689
msgid " - The certificate is not yet valid.\n"
msgstr " - è¯ä¹¦æœªç”Ÿæ•ˆã€‚\n"
-#: ../libsvn_subr/prompt.c:699
+#: ../libsvn_subr/prompt.c:695
msgid " - The certificate has expired.\n"
msgstr " - è¯ä¹¦å·²è¿‡æœŸã€‚\n"
-#: ../libsvn_subr/prompt.c:705
+#: ../libsvn_subr/prompt.c:701
msgid " - The certificate has an unknown error.\n"
msgstr " - è¯ä¹¦å‘生未知错误。\n"
-#: ../libsvn_subr/prompt.c:710
+#: ../libsvn_subr/prompt.c:706
#, c-format
msgid ""
"Certificate information:\n"
@@ -6587,48 +7258,48 @@ msgstr ""
" - å‘行者: %s\n"
" - 指纹: %s\n"
-#: ../libsvn_subr/prompt.c:725
+#: ../libsvn_subr/prompt.c:721
msgid "(R)eject, accept (t)emporarily or accept (p)ermanently? "
msgstr "(R)æ‹’ç»ï¼Œ(t)暂时接å—,或(p)永远接å—?"
-#: ../libsvn_subr/prompt.c:729
+#: ../libsvn_subr/prompt.c:725
msgid "(R)eject or accept (t)emporarily? "
msgstr "(R)æ‹’ç» æˆ– (t)æš‚æ—¶æŽ¥å— ï¼Ÿ"
-#: ../libsvn_subr/prompt.c:769
+#: ../libsvn_subr/prompt.c:765
msgid "Client certificate filename: "
msgstr "客户è¯ä¹¦æ–‡ä»¶å: "
-#: ../libsvn_subr/prompt.c:793
+#: ../libsvn_subr/prompt.c:789
#, c-format
msgid "Passphrase for '%s': "
msgstr "“%sâ€çš„密ç : "
-#: ../libsvn_subr/prompt.c:845
+#: ../libsvn_subr/prompt.c:841
msgid "yes"
msgstr "yes"
-#: ../libsvn_subr/prompt.c:846
+#: ../libsvn_subr/prompt.c:842
msgid "y"
msgstr "y"
-#: ../libsvn_subr/prompt.c:851
+#: ../libsvn_subr/prompt.c:847
msgid "no"
msgstr "no"
-#: ../libsvn_subr/prompt.c:852
+#: ../libsvn_subr/prompt.c:848
msgid "n"
msgstr "n"
-#: ../libsvn_subr/prompt.c:858
+#: ../libsvn_subr/prompt.c:854
msgid "Please type 'yes' or 'no': "
msgstr "请输入 'yes' 或 'no': "
-#: ../libsvn_subr/prompt.c:872
+#: ../libsvn_subr/prompt.c:868
msgid "Store password unencrypted (yes/no)? "
msgstr "ä¿å­˜æœªåŠ å¯†çš„密ç (yes/no)?"
-#: ../libsvn_subr/prompt.c:874
+#: ../libsvn_subr/prompt.c:870
#, c-format
msgid ""
"\n"
@@ -6659,11 +7330,11 @@ msgstr ""
"æ¥é¿å…å†æ¬¡å‡ºçŽ°æ­¤è­¦å‘Šã€‚\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:901
+#: ../libsvn_subr/prompt.c:897
msgid "Store passphrase unencrypted (yes/no)? "
msgstr "ä¿å­˜æœªåŠ å¯†çš„密ç (yes/no)?"
-#: ../libsvn_subr/prompt.c:903
+#: ../libsvn_subr/prompt.c:899
#, c-format
msgid ""
"\n"
@@ -6694,81 +7365,93 @@ msgstr ""
" 或 “no†æ¥é¿å…å†æ¬¡å‡ºçŽ°æ­¤è­¦å‘Šã€‚\n"
"-----------------------------------------------------------------------\n"
-#: ../libsvn_subr/prompt.c:949
+#: ../libsvn_subr/prompt.c:945
#, c-format
msgid "Password for '%s' GNOME keyring: "
msgstr "GNOME keyring [%s] 的密ç : "
-#: ../libsvn_subr/simple_providers.c:449
-#: ../libsvn_subr/ssl_client_cert_pw_providers.c:296
+#: ../libsvn_subr/simple_providers.c:444
+#: ../libsvn_subr/ssl_client_cert_pw_providers.c:286
#, c-format
msgid "Config error: invalid value '%s' for option '%s'"
msgstr "é…置错误: 无效å–值 “%sâ€ï¼Œå¯¹äºŽé€‰é¡¹ “%sâ€"
-#: ../libsvn_subr/sqlite.c:176
-#, c-format
+#: ../libsvn_subr/sqlite.c:220
+#, fuzzy, c-format
msgid "sqlite[S%d]: %s, executing statement '%s'"
-msgstr "sqlite[S%d]: %s, æ‰§è¡Œè¯­å¥ '%s'"
+msgstr "%s, æ‰§è¡Œè¯­å¥ '%s'"
-#: ../libsvn_subr/sqlite.c:265
+#: ../libsvn_subr/sqlite.c:309
+#, fuzzy
msgid "sqlite: Expected database row missing"
-msgstr "sqlite: 缺少期望的数æ®åº“è¡Œ"
+msgstr "丢失了期待的数æ®åº“è¡Œ"
-#: ../libsvn_subr/sqlite.c:266
+#: ../libsvn_subr/sqlite.c:310
+#, fuzzy
msgid "sqlite: Extra database row found"
-msgstr "sqlite: å‘现é¢å¤–çš„æ•°æ®åº“è¡Œ"
+msgstr "å‘现了é¢å¤–çš„æ•°æ®åº“è¡Œ"
-#: ../libsvn_subr/sqlite.c:726
+#: ../libsvn_subr/sqlite.c:781
#, c-format
msgid "SQLite compiled for %s, but running with %s"
msgstr "SQLite 编译为 %s,但是è¿è¡ŒäºŽ %s"
-#: ../libsvn_subr/sqlite.c:738
+#: ../libsvn_subr/sqlite.c:793
msgid "SQLite is required to be compiled and run in thread-safe mode"
msgstr "SQLite 需è¦åœ¨ç¼–译和è¿è¡Œæ—¶éƒ½å¤„于线程安全模å¼"
-#: ../libsvn_subr/sqlite.c:747
-#, c-format
+#: ../libsvn_subr/sqlite.c:802
+#, fuzzy, c-format
msgid "Could not configure SQLite [S%d]"
-msgstr "ä¸èƒ½é…ç½® SQLite [S%d]"
+msgstr "ä¸èƒ½é…ç½® SQLite"
-#: ../libsvn_subr/sqlite.c:749
+#: ../libsvn_subr/sqlite.c:804
msgid "Could not initialize SQLite"
msgstr "ä¸èƒ½åˆå§‹åŒ– SQLite"
-#: ../libsvn_subr/sqlite.c:1178
+#: ../libsvn_subr/sqlite.c:1432
#, c-format
msgid "SQLite hotcopy failed for %s"
msgstr "SQLite 由于 %s 导致热å¤åˆ¶å¤±è´¥"
-#: ../libsvn_subr/string.c:943 ../libsvn_subr/string.c:987
+#: ../libsvn_subr/stream.c:968
+#, c-format
+msgid "Polling for available data on filestream failed"
+msgstr ""
+
+#: ../libsvn_subr/string.c:990 ../libsvn_subr/string.c:1034
#, c-format
msgid "Could not convert '%s' into a number"
msgstr "æ— æ³•è½¬æ¢ '%s' 到数字"
-#: ../libsvn_subr/subst.c:1793 ../libsvn_wc/props.c:1660
+#: ../libsvn_subr/subst.c:1820 ../libsvn_wc/props.c:1765
#, c-format
msgid "File '%s' has inconsistent newlines"
msgstr "文件 “%s†内的æ¢è¡Œç¬¦ä¸ä¸€è‡´"
-#: ../libsvn_subr/sysinfo.c:1075
+#: ../libsvn_subr/subst.c:1858
+#, fuzzy, c-format
+msgid "Can't read special file: File '%s' not found"
+msgstr "ä¸èƒ½è¯»å–文件“%sâ€"
+
+#: ../libsvn_subr/sysinfo.c:1136
msgid "Intel"
msgstr "Intel"
-#: ../libsvn_subr/sysinfo.c:1076
+#: ../libsvn_subr/sysinfo.c:1137
msgid "Intel 64-bit"
msgstr "Intel 64 ä½"
-#: ../libsvn_subr/sysinfo.c:1077
+#: ../libsvn_subr/sysinfo.c:1138
msgid "PowerPC"
msgstr "PowerPC"
-#: ../libsvn_subr/sysinfo.c:1078
+#: ../libsvn_subr/sysinfo.c:1139
msgid "PowerPC 64-bit"
msgstr "PowerPC 64 ä½"
#. Human explanatory part, generated by apr_strftime as "Sat, 01 Jan 2000"
-#: ../libsvn_subr/time.c:85
+#: ../libsvn_subr/time.c:87
msgid " (%a, %d %b %Y)"
msgstr " (%a, %Y-%m-%d)"
@@ -6777,60 +7460,67 @@ msgstr " (%a, %Y-%m-%d)"
msgid "Token '%s' is unrecognized"
msgstr "无法识别令牌 “%sâ€"
-#: ../libsvn_subr/types.c:48
+#: ../libsvn_subr/types.c:52
+#, c-format
+msgid "Negative revision number found parsing '%s'"
+msgstr "è§£æž â€œ%s†时å‘现负的版本å·"
+
+#: ../libsvn_subr/types.c:53
#, c-format
msgid "Invalid revision number found parsing '%s'"
msgstr "è§£æž â€œ%s†时å‘现无效的版本å·"
-#: ../libsvn_subr/types.c:60
-#, c-format
-msgid "Negative revision number found parsing '%s'"
-msgstr "è§£æž â€œ%s†时å‘现负的版本å·"
+#: ../libsvn_subr/types.c:64
+#, fuzzy, c-format
+msgid "Revision number longer than 10 digits '%s'"
+msgstr "è§£æž â€œ%s†时å‘现无效的版本å·"
-#: ../libsvn_subr/utf.c:240
+#: ../libsvn_subr/types.c:70
+#, fuzzy, c-format
+msgid "Revision number too large '%s'"
+msgstr "è§£æž â€œ%s†时å‘现无效的版本å·"
+
+#: ../libsvn_subr/utf.c:239
#, c-format
msgid "Can't create a character converter from native encoding to '%s'"
msgstr "ä¸èƒ½åˆ›å»ºä»Žæœ¬åœ°ç¼–ç åˆ°â€œ%sâ€çš„字符转æ¢å™¨"
-#: ../libsvn_subr/utf.c:244
+#: ../libsvn_subr/utf.c:243
#, c-format
msgid "Can't create a character converter from '%s' to native encoding"
msgstr "ä¸èƒ½åˆ›å»ºä»Žâ€œ%sâ€åˆ°æœ¬åœ°ç¼–ç çš„字符转æ¢å™¨"
-#: ../libsvn_subr/utf.c:248
+#: ../libsvn_subr/utf.c:247
#, c-format
msgid "Can't create a character converter from '%s' to '%s'"
msgstr "ä¸èƒ½åˆ›å»ºä»Žâ€œ%sâ€åˆ°â€œ%sâ€çš„字符转æ¢å™¨"
-#: ../libsvn_subr/utf.c:590
+#: ../libsvn_subr/utf.c:543
#, c-format
msgid "Can't convert string from native encoding to '%s':"
msgstr "ä¸èƒ½æŠŠå­—符串从本地编ç è½¬æ¢ä¸ºâ€œ%sâ€ç¼–ç : "
-#: ../libsvn_subr/utf.c:594
+#: ../libsvn_subr/utf.c:547
#, c-format
msgid "Can't convert string from '%s' to native encoding:"
msgstr "ä¸èƒ½æŠŠå­—符串从â€%s“编ç è½¬æ¢ä¸ºæœ¬åœ°ç¼–ç ã€‚"
-#: ../libsvn_subr/utf.c:598
+#: ../libsvn_subr/utf.c:551
#, c-format
msgid "Can't convert string from '%s' to '%s':"
msgstr "ä¸èƒ½æŠŠå­—符串从“%sâ€ç¼–ç è½¬æ¢ä¸ºâ€œ%sâ€ç¼–ç ã€‚"
-#: ../libsvn_subr/utf.c:643
+#: ../libsvn_subr/utf.c:596
#, c-format
-msgid ""
-"Safe data '%s' was followed by non-ASCII byte %d: unable to convert to/from "
-"UTF-8"
+msgid "Safe data '%s' was followed by non-ASCII byte %d: unable to convert to/from UTF-8"
msgstr "安全数æ®â€œ%sâ€åŽé¢æ˜¯éžASCII字节 %d: ä¸èƒ½è½¬æ¢åˆ°/自 UTF-8"
-#: ../libsvn_subr/utf.c:651
+#: ../libsvn_subr/utf.c:604
#, c-format
-msgid ""
-"Non-ASCII character (code %d) detected, and unable to convert to/from UTF-8"
+msgid "Non-ASCII character (code %d) detected, and unable to convert to/from UTF-8"
msgstr "检测到éžASCII字符 (ä»£ç  %d),并且ä¸èƒ½è½¬æ¢åˆ°/自 UTF-8"
-#: ../libsvn_subr/utf.c:696
+#: ../libsvn_subr/utf.c:649
#, c-format
msgid ""
"Valid UTF-8 data\n"
@@ -6843,6 +7533,59 @@ msgstr ""
"åŽé¢æ˜¯æ— æ•ˆ UTF-8 åºåˆ—\n"
"(16进制: %s)"
+#: ../libsvn_subr/utf.c:1042 ../libsvn_subr/utf.c:1051
+#, fuzzy, c-format
+msgid "Conversion to UTF-16 failed"
+msgstr "连接到“%sâ€å¤±è´¥"
+
+#: ../libsvn_subr/utf.c:1080 ../libsvn_subr/utf.c:1090
+#, fuzzy, c-format
+msgid "Conversion from UTF-16 failed"
+msgstr "连接到“%sâ€å¤±è´¥"
+
+#: ../libsvn_subr/utf8proc.c:215
+#, fuzzy, c-format
+msgid "Invalid Unicode character U+%04lX"
+msgstr "无效的转义字符"
+
+#: ../libsvn_subr/utf8proc.c:258
+msgid "Cannot use a custom escape token in glob matching mode"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:289
+msgid "Escape token must be one character"
+msgstr ""
+
+#: ../libsvn_subr/utf8proc.c:292
+#, fuzzy, c-format
+msgid "Invalid escape character U+%04lX"
+msgstr "无效的转义字符"
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:117
+msgid "Memory for processing UTF-8 data could not be allocated."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:119
+msgid "UTF-8 string is too long to be processed."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:121
+#, fuzzy
+msgid "Invalid UTF-8 string"
+msgstr "无效URL“%sâ€"
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:123
+msgid "Unassigned Unicode code point found in UTF-8 string."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:125
+msgid "Invalid options for UTF-8 processing chosen."
+msgstr ""
+
+#: ../libsvn_subr/utf8proc/utf8proc.c:127
+msgid "An unknown error occured while processing UTF-8 data."
+msgstr ""
+
#: ../libsvn_subr/validate.c:56
#, c-format
msgid "MIME type '%s' has empty media type"
@@ -6863,14 +7606,23 @@ msgstr "MIME 类型“%sâ€çš„媒体类型中包å«éžæ³•å­—符“%câ€"
msgid "MIME type '%s' contains invalid character '0x%02x' in postfix"
msgstr "MIME 类型“%sâ€ä¸­åŒ…å«éžæ³•å­—符“0x%02xâ€"
-#: ../libsvn_subr/version.c:89
-#, c-format
-msgid "Version mismatch in '%s': found %d.%d.%d%s, expected %d.%d.%d%s"
+#: ../libsvn_subr/version.c:91
+#, fuzzy, c-format
+msgid "Version mismatch in '%s'%s: found %d.%d.%d%s, expected %d.%d.%d%s"
msgstr "“%sâ€çš„版本ä¸ä¸€è‡´: 找到 %d.%d.%d%s,期望 %d.%d.%d%s"
-#: ../libsvn_subr/version.c:132
+#: ../libsvn_subr/version.c:96
+msgid " (expecting equality)"
+msgstr " (期望相等)"
+
+#: ../libsvn_subr/version.c:98
+msgid " (expecting compatibility)"
+msgstr " (期望兼容)"
+
+#: ../libsvn_subr/version.c:139
+#, fuzzy
msgid ""
-"Copyright (C) 2013 The Apache Software Foundation.\n"
+"Copyright (C) 2014 The Apache Software Foundation.\n"
"This software consists of contributions made by many people;\n"
"see the NOTICE file for more information.\n"
"Subversion is open source software, see http://subversion.apache.org/\n"
@@ -6880,43 +7632,43 @@ msgstr ""
"Subversion 是开放æºä»£ç è½¯ä»¶ï¼Œè¯·å‚阅 http://subversion.apache.org/ 站点。\n"
"\n"
-#: ../libsvn_subr/version.c:210 ../libsvn_subr/version.c:221
-#: ../libsvn_subr/version.c:227 ../libsvn_subr/version.c:244
-#: ../libsvn_subr/version.c:251
-#, c-format
+#: ../libsvn_subr/version.c:217 ../libsvn_subr/version.c:228
+#: ../libsvn_subr/version.c:234 ../libsvn_subr/version.c:251
+#: ../libsvn_subr/version.c:258
+#, fuzzy, c-format
msgid "Failed to parse version number string '%s'"
-msgstr "ä¸èƒ½è§£æžç‰ˆæœ¬å·å­—符串“%sâ€"
+msgstr "ä¸èƒ½è§£æžåˆå¹¶ä¿¡æ¯å­—符串“%sâ€"
#: ../libsvn_subr/xml.c:416
#, c-format
msgid "Malformed XML: %s at line %ld"
msgstr "éžæ³• XML: %s 在第 %ld è¡Œ"
-#: ../libsvn_wc/adm_crawler.c:114
+#: ../libsvn_wc/adm_crawler.c:119
#, c-format
msgid "The existing node '%s' can not be restored."
msgstr "已有节点 '%s' ä¸èƒ½æ¢å¤ã€‚"
-#: ../libsvn_wc/adm_crawler.c:133
+#: ../libsvn_wc/adm_crawler.c:138
#, c-format
msgid "The node '%s' can not be restored."
msgstr "节点 '%s' ä¸èƒ½æ¢å¤ã€‚"
-#: ../libsvn_wc/adm_crawler.c:851
+#: ../libsvn_wc/adm_crawler.c:862
msgid "Error aborting report"
msgstr "å–消报告出错"
-#: ../libsvn_wc/adm_crawler.c:963
+#: ../libsvn_wc/adm_crawler.c:975
#, c-format
msgid "Pristine checksum for file '%s' is missing"
msgstr "文件“%sâ€çš„原始内容校验和丢失"
-#: ../libsvn_wc/adm_crawler.c:1128
+#: ../libsvn_wc/adm_crawler.c:1140
#, c-format
msgid "Checksum mismatch for text base of '%s'"
msgstr "'%s' 的文本校验和ä¸åŒ¹é…"
-#: ../libsvn_wc/adm_crawler.c:1139
+#: ../libsvn_wc/adm_crawler.c:1151
#, c-format
msgid "While preparing '%s' for commit"
msgstr "当为æ交æ“作准备“%sâ€æ—¶"
@@ -6933,15 +7685,12 @@ msgstr "åªèƒ½å–得文件的原始内容;“%sâ€ä¸æ˜¯æ–‡ä»¶"
#: ../libsvn_wc/adm_files.c:194 ../libsvn_wc/adm_files.c:256
#, c-format
-msgid ""
-"Cannot get the pristine contents of '%s' because its delete is already "
-"committed"
+msgid "Cannot get the pristine contents of '%s' because its delete is already committed"
msgstr "ä¸èƒ½å–得“%sâ€çš„原始内容,因为其删除æ“作已ç»æ交"
#: ../libsvn_wc/adm_files.c:202 ../libsvn_wc/adm_files.c:264
#, c-format
-msgid ""
-"Cannot get the pristine contents of '%s' because it has an unexpected status"
+msgid "Cannot get the pristine contents of '%s' because it has an unexpected status"
msgstr "ä¸èƒ½å–得“%sâ€çš„原始内容,因为其状æ€æœªçŸ¥"
#: ../libsvn_wc/adm_files.c:209
@@ -6949,52 +7698,47 @@ msgstr "ä¸èƒ½å–得“%sâ€çš„原始内容,因为其状æ€æœªçŸ¥"
msgid "Node '%s' has no pristine text"
msgstr "节点 '%s' 没有原始内容"
-#: ../libsvn_wc/adm_files.c:452
+#: ../libsvn_wc/adm_files.c:420
#, c-format
msgid "Revision %ld doesn't match existing revision %ld in '%s'"
msgstr "版本 %ld ä¸åŒ¹é…现有版本 %ld 于 “%sâ€"
-#: ../libsvn_wc/adm_files.c:489
+#: ../libsvn_wc/adm_files.c:460
#, c-format
-msgid ""
-"URL '%s' (uuid: '%s') doesn't match existing URL '%s' (uuid: '%s') in '%s'"
+msgid "URL '%s' (uuid: '%s') doesn't match existing URL '%s' (uuid: '%s') in '%s'"
msgstr "URL “%sâ€(uuid: '%s') ä¸åŒ¹é…现有 URL “%sâ€(uuid: '%s') 于 “%sâ€"
-#: ../libsvn_wc/adm_ops.c:601 ../libsvn_wc/update_editor.c:5206
+#: ../libsvn_wc/adm_ops.c:313 ../libsvn_wc/update_editor.c:5396
#, c-format
msgid "Can't find parent directory's node while trying to add '%s'"
msgstr "增加 “%s†时无法找到父目录节点"
-#: ../libsvn_wc/adm_ops.c:610 ../libsvn_wc/update_editor.c:5200
+#: ../libsvn_wc/adm_ops.c:322 ../libsvn_wc/update_editor.c:5390
#, c-format
msgid "Can't add '%s' to a parent directory scheduled for deletion"
msgstr "增加 “%s†到调度删除的目录中"
-#: ../libsvn_wc/adm_ops.c:617 ../libsvn_wc/update_editor.c:5213
+#: ../libsvn_wc/adm_ops.c:329 ../libsvn_wc/update_editor.c:5403
#, c-format
msgid "Can't schedule an addition of '%s' below a not-directory node"
msgstr "ä¸èƒ½åœ¨éžç›®å½•èŠ‚点 '%s' 下调度增加"
-#: ../libsvn_wc/adm_ops.c:676
+#: ../libsvn_wc/adm_ops.c:390
#, c-format
msgid "Can't create an entry with a reserved name while trying to add '%s'"
msgstr "增加 “%s†时无法创建使用ä¿ç•™å称的æ¡ç›®"
-#: ../libsvn_wc/adm_ops.c:880
+#: ../libsvn_wc/adm_ops.c:594
#, c-format
msgid "The URL '%s' has a different repository root than its parent"
msgstr "URL “%s†与其父目录的版本库根目录ä¸ç›¸åŒ"
-#: ../libsvn_wc/adm_ops.c:898
+#: ../libsvn_wc/adm_ops.c:614
#, c-format
-msgid ""
-"Can't schedule the working copy at '%s' from repository '%s' with uuid '%s' "
-"for addition under a working copy from repository '%s' with uuid '%s'."
-msgstr ""
-"ä¸èƒ½è°ƒåº¦å·¥ä½œå‰¯æœ¬ '%s' (版本库 '%s',uuid '%s') 在版本库 '%s' (uuid '%s') çš„å·¥"
-"作副本下增加。"
+msgid "Can't schedule the working copy at '%s' from repository '%s' with uuid '%s' for addition under a working copy from repository '%s' with uuid '%s'."
+msgstr "ä¸èƒ½è°ƒåº¦å·¥ä½œå‰¯æœ¬ '%s' (版本库 '%s',uuid '%s') 在版本库 '%s' (uuid '%s') 的工作副本下增加。"
-#: ../libsvn_wc/adm_ops.c:912
+#: ../libsvn_wc/adm_ops.c:628
#, c-format
msgid "Can't add '%s' with URL '%s', but with the data from '%s'"
msgstr "ä¸èƒ½å¢žåŠ  '%s' 为 URL '%s' (æ•°æ®æ¥è‡ª '%s')"
@@ -7009,156 +7753,159 @@ msgid "Log format too old, please use Subversion 1.6 or earlier"
msgstr "日志格å¼å¤ªæ—§ï¼Œè¯·ä½¿ç”¨ Subversion 1.6 或更新的版本"
#: ../libsvn_wc/conflicts.c:83
+#, fuzzy
msgid "Not a conflict skel"
-msgstr "ä¸æ˜¯å†²çªéª¨æž¶"
+msgstr "解æžæ ‘冲çªéª¨æž¶å‡ºé”™"
-#: ../libsvn_wc/conflicts.c:610 ../libsvn_wc/conflicts.c:707
+#: ../libsvn_wc/conflicts.c:607 ../libsvn_wc/conflicts.c:704
+#, fuzzy
msgid "Not a completed conflict skel"
-msgstr "ä¸æ˜¯å®Œæ•´çš„冲çªéª¨æž¶"
+msgstr "解æžæ ‘冲çªéª¨æž¶å‡ºé”™"
-#: ../libsvn_wc/conflicts.c:788 ../libsvn_wc/conflicts.c:861
-#: ../libsvn_wc/conflicts.c:951
+#: ../libsvn_wc/conflicts.c:785 ../libsvn_wc/conflicts.c:858
+#: ../libsvn_wc/conflicts.c:948
msgid "Conflict not set"
msgstr "没有设置冲çª"
-#: ../libsvn_wc/conflicts.c:1438 ../libsvn_wc/conflicts.c:1790
+#: ../libsvn_wc/conflicts.c:1327 ../libsvn_wc/conflicts.c:1700
msgid "Conflict callback violated API: returned no results"
msgstr "冲çªçš„回调函数è¿å API:没有返回结果。"
-#: ../libsvn_wc/conflicts.c:1482
+#: ../libsvn_wc/conflicts.c:1371
+#, fuzzy
msgid "Conflict callback violated API: returned no merged file"
msgstr "冲çªçš„回调函数è¿å API:没有返回åˆå¹¶æ–‡ä»¶ã€‚"
-#: ../libsvn_wc/conflicts.c:2468 ../libsvn_wc/conflicts.c:2644
+#: ../libsvn_wc/conflicts.c:2441 ../libsvn_wc/conflicts.c:2617
msgid "Invalid 'conflict_result' argument"
msgstr "无效的 “conflict_result†å‚æ•°"
-#: ../libsvn_wc/conflicts.c:2767 ../libsvn_wc/conflicts.c:2807
-#, c-format
-msgid ""
-"Tree conflict can only be resolved to 'working' or 'mine-conflict' state; "
-"'%s' not resolved"
-msgstr "树冲çªåªèƒ½è§£å†³ä¸ºâ€œworkingâ€æˆ–“mine-conflictâ€çŠ¶æ€ï¼›â€œ%s†还没有解决"
+#: ../libsvn_wc/conflicts.c:2762 ../libsvn_wc/conflicts.c:2818
+#, fuzzy, c-format
+msgid "Tree conflict can only be resolved to 'working' or 'mine-conflict' state; '%s' not resolved"
+msgstr "树冲çªåªèƒ½è§£å†³ä¸º “working†状æ€ï¼›â€œ%s†还没有解决"
-#: ../libsvn_wc/conflicts.c:2822
-#, c-format
-msgid ""
-"Tree conflict can only be resolved to 'working' state; '%s' not resolved"
-msgstr "树冲çªåªèƒ½è§£å†³ä¸ºâ€œworkingâ€çŠ¶æ€ï¼›â€œ%s†还没有解决"
+#: ../libsvn_wc/conflicts.c:2835
+#, fuzzy, c-format
+msgid "Tree conflict can only be resolved to 'working' state; '%s' not resolved"
+msgstr "树冲çªåªèƒ½è§£å†³ä¸º “working†状æ€ï¼›â€œ%s†还没有解决"
-#: ../libsvn_wc/conflicts.c:2924
+#: ../libsvn_wc/conflicts.c:2945
msgid "No conflict-callback and no pre-defined conflict-choice provided"
-msgstr "没有æ供冲çªå›žè°ƒæˆ–预定义的冲çªé€‰æ‹©"
+msgstr "没有冲çªå›žè°ƒï¼Œä¹Ÿæ²¡æœ‰æ供预定义的冲çªé€‰æ‹©"
+
+#: ../libsvn_wc/conflicts.c:3154
+#, fuzzy, c-format
+msgid "Unable to resolve pending conflict on '%s'"
+msgstr "无法删除目录 “%sâ€"
-#: ../libsvn_wc/copy.c:86
+#: ../libsvn_wc/conflicts.c:3165
+#, fuzzy, c-format
+msgid "Unable to resolve conflicts on '%s'"
+msgstr "无法删除目录 “%sâ€"
+
+#: ../libsvn_wc/copy.c:102
#, c-format
msgid "Source '%s' is unexpected kind"
msgstr "æº â€œ%s†具有æ„外的类型"
-#: ../libsvn_wc/copy.c:410
+#: ../libsvn_wc/copy.c:469
#, c-format
msgid "cannot handle node kind for '%s'"
msgstr "ä¸èƒ½ä¸º '%s'“处ç†èŠ‚点类型"
-#: ../libsvn_wc/copy.c:432 ../libsvn_wc/wc_db.c:4400 ../libsvn_wc/wc_db.c:4975
+#: ../libsvn_wc/copy.c:491 ../libsvn_wc/wc_db.c:4540 ../libsvn_wc/wc_db.c:5113
#, c-format
msgid "Cannot handle status of '%s'"
msgstr "ä¸èƒ½å¤„ç†â€œ%sâ€çš„状æ€"
-#: ../libsvn_wc/copy.c:441 ../libsvn_wc/wc_db.c:4391 ../libsvn_wc/wc_db.c:4969
-#: ../libsvn_wc/wc_db.c:5203
+#: ../libsvn_wc/copy.c:500 ../libsvn_wc/wc_db.c:4531 ../libsvn_wc/wc_db.c:5107
+#: ../libsvn_wc/wc_db.c:5350
#, c-format
msgid "Cannot copy '%s' excluded by server"
msgstr "ä¸èƒ½å¤åˆ¶è¢«æœåŠ¡å™¨æŽ’除的 '%s'"
-#: ../libsvn_wc/copy.c:578
+#: ../libsvn_wc/copy.c:641
#, c-format
msgid "Deleted node '%s' can't be copied."
msgstr "å·²ç»åˆ é™¤çš„节点“%sâ€ä¸èƒ½è¢«å¤åˆ¶ã€‚"
-#: ../libsvn_wc/copy.c:596
-#, c-format
+#: ../libsvn_wc/copy.c:659
+#, fuzzy, c-format
msgid "'%s' is the root of a working copy and cannot be moved"
-msgstr "“%sâ€æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•ï¼Œä¸èƒ½è¢«ç§»åŠ¨"
+msgstr "ä¸èƒ½åˆ é™¤å·¥ä½œå‰¯æœ¬æ ¹ç›®å½• '%s'"
-#: ../libsvn_wc/copy.c:604
-#, c-format
+#: ../libsvn_wc/copy.c:667
+#, fuzzy, c-format
msgid "'%s' represents the repository root and cannot be moved"
-msgstr "“%sâ€æ˜¯ç‰ˆæœ¬åº“根目录,ä¸èƒ½è¢«ç§»åŠ¨"
+msgstr "“%s†是ä¿ç•™å称,无法被导入"
-#: ../libsvn_wc/copy.c:673
+#: ../libsvn_wc/copy.c:742
#, c-format
msgid "Cannot copy to '%s', as it is not from repository '%s'; it is from '%s'"
msgstr "无法å¤åˆ¶åˆ°â€œ%sâ€ï¼Œå› ä¸ºå®ƒä¸åœ¨ç‰ˆæœ¬åº““%sâ€ä¸­ï¼›å®ƒæ¥è‡ªâ€œ%sâ€"
-#: ../libsvn_wc/copy.c:681
+#: ../libsvn_wc/copy.c:750
#, c-format
msgid "Cannot copy to '%s' as it is scheduled for deletion"
msgstr "无法å¤åˆ¶åˆ°â€œ%sâ€ï¼Œå› ä¸ºå®ƒå·²è°ƒåº¦åˆ é™¤"
-#: ../libsvn_wc/copy.c:709
+#: ../libsvn_wc/copy.c:778
#, c-format
msgid "'%s' is already under version control but is excluded."
msgstr "'%s' 已纳入版本控制,å´è¢«æŽ’除。"
-#: ../libsvn_wc/copy.c:724
+#: ../libsvn_wc/copy.c:793
#, c-format
msgid "There is already a versioned item '%s'"
msgstr "已有纳入版本控制项“%sâ€"
-#: ../libsvn_wc/copy.c:740
+#: ../libsvn_wc/copy.c:809
#, c-format
msgid "'%s' already exists and is in the way"
msgstr "“%sâ€å·²å­˜åœ¨ï¼Œå˜æˆæ‹¦è·¯è™Ž"
-#: ../libsvn_wc/copy.c:791
-#, c-format
-msgid ""
-"Cannot move mixed-revision subtree '%s' [%ld:%ld]; try updating it first"
-msgstr "ä¸èƒ½ç§»åŠ¨æœ‰æ··åˆç‰ˆæœ¬çš„å­æ ‘“%sâ€[%ld:%ld] 中;请先更新"
+#: ../libsvn_wc/copy.c:861
+#, fuzzy, c-format
+msgid "Cannot move mixed-revision subtree '%s' [%ld:%ld]; try updating it first"
+msgstr "ä¸èƒ½åˆå¹¶åˆ°æœ‰æ··åˆç‰ˆæœ¬çš„工作副本 [%lu:%lu] 中;请先更新"
-#: ../libsvn_wc/crop.c:207
+#: ../libsvn_wc/crop.c:208
#, c-format
msgid "Cannot exclude '%s': it is a working copy root"
msgstr "ä¸èƒ½æŽ’除 '%s': 它是工作副本根目录"
-#: ../libsvn_wc/crop.c:215
+#: ../libsvn_wc/crop.c:216
#, c-format
msgid "Cannot exclude '%s': it is a switched path"
msgstr "ä¸èƒ½æŽ’除 '%s':它是已切æ¢çš„路径"
-#: ../libsvn_wc/crop.c:242
+#: ../libsvn_wc/crop.c:243
#, c-format
-msgid ""
-"Cannot exclude '%s': it is to be added to the repository. Try commit instead"
+msgid "Cannot exclude '%s': it is to be added to the repository. Try commit instead"
msgstr "ä¸èƒ½æŽ’除 '%s': 它将è¦å¢žåŠ åˆ°ç‰ˆæœ¬åº“中。请先æ交"
-#: ../libsvn_wc/crop.c:249
+#: ../libsvn_wc/crop.c:250
#, c-format
-msgid ""
-"Cannot exclude '%s': it is to be deleted from the repository. Try commit "
-"instead"
+msgid "Cannot exclude '%s': it is to be deleted from the repository. Try commit instead"
msgstr "ä¸èƒ½æŽ’除 '%s': 它将è¦ä»Žç‰ˆæœ¬åº“中删除。请先æ交"
-#: ../libsvn_wc/crop.c:308
+#: ../libsvn_wc/crop.c:309
msgid "Can only crop a working copy with a restrictive depth"
msgstr "åªèƒ½ä¿®å‰ªå·¥ä½œå‰¯æœ¬åˆ°æœ‰é™æ·±åº¦"
-#: ../libsvn_wc/crop.c:319
+#: ../libsvn_wc/crop.c:320
msgid "Can only crop directories"
msgstr "åªèƒ½ä¿®å‰ªç›®å½•"
-#: ../libsvn_wc/crop.c:332
+#: ../libsvn_wc/crop.c:333
#, c-format
-msgid ""
-"Cannot crop '%s': it is going to be removed from repository. Try commit "
-"instead"
+msgid "Cannot crop '%s': it is going to be removed from repository. Try commit instead"
msgstr "无法修剪 “%sâ€: 它将è¦ä»Žç‰ˆæœ¬åº“中删除;请先æ交"
-#: ../libsvn_wc/crop.c:339
+#: ../libsvn_wc/crop.c:340
#, c-format
-msgid ""
-"Cannot crop '%s': it is to be added to the repository. Try commit instead"
+msgid "Cannot crop '%s': it is to be added to the repository. Try commit instead"
msgstr "无法修剪 '%s': 它将è¦å¢žåŠ åˆ°ç‰ˆæœ¬åº“中。请先æ交"
#: ../libsvn_wc/delete.c:237 ../libsvn_wc/delete.c:357
@@ -7172,16 +7919,16 @@ msgid "'%s' is the root of a working copy and cannot be deleted"
msgstr "ä¸èƒ½åˆ é™¤å·¥ä½œå‰¯æœ¬æ ¹ç›®å½• '%s'"
#: ../libsvn_wc/delete.c:262 ../libsvn_wc/delete.c:379
-#, c-format
+#, fuzzy, c-format
msgid "'%s' represents the repository root and cannot be deleted"
-msgstr "“%sâ€æ˜¯ç‰ˆæœ¬åº“根目录,ä¸èƒ½è¢«åˆ é™¤"
+msgstr "ä¸èƒ½åˆ é™¤å·¥ä½œå‰¯æœ¬æ ¹ç›®å½• '%s'"
#: ../libsvn_wc/delete.c:476
#, c-format
msgid "File '%s' has local modifications"
msgstr "文件“%sâ€æœ‰æœ¬åœ°ä¿®æ”¹"
-#: ../libsvn_wc/deprecated.c:2284
+#: ../libsvn_wc/deprecated.c:2362
#, c-format
msgid "Unexpectedly found '%s': path is marked 'missing'"
msgstr "æ„外å‘现“%sâ€: 路径被标记为“丢失â€"
@@ -7207,9 +7954,9 @@ msgid "The file '%s' has no checksum"
msgstr "文件 '%s' 没有校验和。"
#: ../libsvn_wc/entries.c:1619
-#, c-format
+#, fuzzy, c-format
msgid "Unable to upgrade '%s' at line %d"
-msgstr "ä¸èƒ½å‡çº§â€œ%sâ€ï¼Œç¬¬ %d è¡Œ"
+msgstr "ä¸èƒ½æŒ‰ç…§â€œ%sâ€ç”Ÿæˆåå­—"
#: ../libsvn_wc/entries.c:1837
#, c-format
@@ -7231,7 +7978,7 @@ msgstr "在目录“%sâ€ä¸­æ²¡æœ‰é»˜è®¤å…¥å£"
msgid "Directory '%s' has no THIS_DIR entry"
msgstr "目录“%sâ€æ²¡æœ‰ THIS_DIR å…¥å£"
-#: ../libsvn_wc/entries.c:2735 ../libsvn_wc/node.c:528
+#: ../libsvn_wc/entries.c:2735 ../libsvn_wc/node.c:514
#, c-format
msgid "'%s' has an unrecognized node kind"
msgstr "“%sâ€æœ‰æ— æ³•è¯†åˆ«çš„节点ç§ç±»"
@@ -7248,58 +7995,50 @@ msgstr "ä¸èƒ½åˆ†å‰²è¡Œåˆ°ç»„件:“%sâ€"
#: ../libsvn_wc/externals.c:257
#, c-format
-msgid ""
-"Invalid %s property on '%s': cannot use two absolute URLs ('%s' and '%s') in "
-"an external; one must be a path where an absolute or relative URL is checked "
-"out to"
-msgstr ""
-"éžæ³•å±žæ€§ “%s†于 “%sâ€: ä¸èƒ½åœ¨å¤–部定义中使用 2 个ç»å¯¹ URL(“%s†和 “%sâ€)ï¼›ç»å¯¹"
-"或相对 URL 必须检出到本地路径"
+msgid "Invalid %s property on '%s': cannot use two absolute URLs ('%s' and '%s') in an external; one must be a path where an absolute or relative URL is checked out to"
+msgstr "éžæ³•å±žæ€§ “%s†于 “%sâ€: ä¸èƒ½åœ¨å¤–部定义中使用 2 个ç»å¯¹ URL(“%s†和 “%sâ€)ï¼›ç»å¯¹æˆ–相对 URL 必须检出到本地路径"
#: ../libsvn_wc/externals.c:266 ../libsvn_wc/externals.c:274
#, c-format
-msgid ""
-"Invalid %s property on '%s': cannot use a URL '%s' as the target directory "
-"for an external definition"
+msgid "Invalid %s property on '%s': cannot use a URL '%s' as the target directory for an external definition"
msgstr "éžæ³•å±žæ€§ “%s†于 “%sâ€: 对于外部定义,ä¸èƒ½ä½¿ç”¨ URL \"%s\" 作为目标目录"
#: ../libsvn_wc/externals.c:316
#, c-format
-msgid ""
-"Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
+msgid "Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
msgstr "无效属性 %s ä½äºŽ “%sâ€: 目标 “%sâ€ åŒ…å« â€œ..†或是ç»å¯¹è·¯å¾„"
-#: ../libsvn_wc/externals.c:491 ../libsvn_wc/externals.c:514
+#: ../libsvn_wc/externals.c:489 ../libsvn_wc/externals.c:512
#, c-format
msgid "This editor can only update '%s'"
msgstr "此编辑器åªèƒ½æ›´æ–°â€œ%sâ€"
-#: ../libsvn_wc/externals.c:529
+#: ../libsvn_wc/externals.c:527 ../libsvn_wc/externals.c:974
#, c-format
msgid "Node '%s' is no existing file external"
msgstr "节点 '%s' 的外部链接ä¸æ˜¯çŽ°å­˜æ–‡ä»¶"
-#: ../libsvn_wc/externals.c:1516
+#: ../libsvn_wc/externals.c:1545
#, c-format
msgid "URL '%s' does not begin with a scheme"
msgstr "URL “%s†没有以方案开始"
-#: ../libsvn_wc/externals.c:1571
+#: ../libsvn_wc/externals.c:1600
#, c-format
msgid "Illegal parent directory URL '%s'"
msgstr "éžæ³•çˆ¶ç›®å½• URL “%sâ€"
-#: ../libsvn_wc/externals.c:1610
+#: ../libsvn_wc/externals.c:1639
#, c-format
msgid "Illegal repository root URL '%s'"
msgstr "éžæ³•ç‰ˆæœ¬åº“æ ¹ URL “%sâ€"
-#: ../libsvn_wc/externals.c:1655
+#: ../libsvn_wc/externals.c:1684
#, c-format
msgid "The external relative URL '%s' cannot have backpaths, i.e. '..'"
msgstr "外部相对 URL “%s†ä¸èƒ½åŒ…å«åŽé€€è·¯å¾„,例如 “..â€"
-#: ../libsvn_wc/externals.c:1683
+#: ../libsvn_wc/externals.c:1712
#, c-format
msgid "Unrecognized format for the relative external URL '%s'"
msgstr "外部相对 URL “%s†的格å¼æ— æ³•è¯†åˆ«"
@@ -7309,7 +8048,7 @@ msgstr "外部相对 URL “%s†的格å¼æ— æ³•è¯†åˆ«"
msgid "Path '%s' ends in '%s', which is unsupported for this operation"
msgstr "路径“%sâ€ä»¥â€œ%sâ€ç»“æŸï¼Œæ­¤æ“作ä¸æ”¯æŒ"
-#: ../libsvn_wc/lock.c:773 ../libsvn_wc/wc_db.c:13640
+#: ../libsvn_wc/lock.c:773
#, c-format
msgid "Working copy '%s' locked"
msgstr "工作副本“%sâ€å·²ç»é”定"
@@ -7339,7 +8078,8 @@ msgstr "目录“%sâ€ä¸¢å¤±"
msgid "Working copy '%s' is not locked"
msgstr "工作副本“%sâ€æœªè¢«é”定"
-#: ../libsvn_wc/lock.c:1382
+#: ../libsvn_wc/lock.c:1382 ../libsvn_wc/wc_db.c:15664
+#: ../libsvn_wc/wc_db_update_move.c:116
#, c-format
msgid "No write-lock in '%s'"
msgstr "“%sâ€æ²¡æœ‰å†™å…¥é”定"
@@ -7349,22 +8089,22 @@ msgstr "“%sâ€æ²¡æœ‰å†™å…¥é”定"
msgid "Can't obtain lock on non-directory '%s'."
msgstr "ä¸èƒ½èŽ·å–éžç›®å½•å¯¹è±¡ '%s' çš„é”"
-#: ../libsvn_wc/merge.c:1281 ../libsvn_wc/props.c:257
-#, c-format
+#: ../libsvn_wc/merge.c:1285 ../libsvn_wc/props.c:232
+#, fuzzy, c-format
msgid "Can't merge into conflicted node '%s'"
-msgstr "无法åˆå¹¶åˆ°å·²ç»å†²çªçš„节点“%sâ€"
+msgstr "无法写入文件“%sâ€"
-#: ../libsvn_wc/merge.c:1324 ../libsvn_wc/props.c:273
+#: ../libsvn_wc/merge.c:1328 ../libsvn_wc/props.c:248
#, c-format
msgid "The property '%s' may not be merged into '%s'."
msgstr "属性 “%s†ä¸èƒ½åˆå¹¶åˆ° “%sâ€ã€‚"
-#: ../libsvn_wc/node.c:1047
-#, c-format
+#: ../libsvn_wc/node.c:887
+#, fuzzy, c-format
msgid "Incomplete copy information on path '%s'."
-msgstr "路径“%sâ€ä¸Šçš„å¤åˆ¶ä¿¡æ¯ä¸å®Œæ•´"
+msgstr "å¤åˆ¶æºè·¯å¾„“%sâ€æ— æ•ˆ"
-#: ../libsvn_wc/node.c:1211
+#: ../libsvn_wc/node.c:1052
#, c-format
msgid "'%s' is not the root of the working copy '%s'"
msgstr "“%sâ€ä¸æ˜¯å·¥ä½œå‰¯æœ¬â€œ%sâ€çš„æ ¹"
@@ -7402,17 +8142,17 @@ msgstr "在外部引用的文件 “%s†中,å‘现ä¸æœŸæœ›çš„ \\0"
msgid "Illegal file external revision kind %d for path '%s'"
msgstr "éžæ³•çš„外部引用文件的版本类型 %d,在路径 “%s†中"
-#: ../libsvn_wc/old-and-busted.c:489 ../libsvn_wc/old-and-busted.c:843
+#: ../libsvn_wc/old-and-busted.c:489 ../libsvn_wc/old-and-busted.c:847
#, c-format
msgid "Entry '%s' has invalid node kind"
msgstr "å…¥å£â€œ%sâ€æœ‰æ— æ•ˆçš„节点ç§ç±»"
-#: ../libsvn_wc/old-and-busted.c:510 ../libsvn_wc/old-and-busted.c:823
+#: ../libsvn_wc/old-and-busted.c:510 ../libsvn_wc/old-and-busted.c:827
#, c-format
msgid "Entry for '%s' has invalid repository root"
msgstr "“%sâ€æ¡ç›®çš„版本库根目录无效"
-#: ../libsvn_wc/old-and-busted.c:531 ../libsvn_wc/old-and-busted.c:868
+#: ../libsvn_wc/old-and-busted.c:531 ../libsvn_wc/old-and-busted.c:872
#, c-format
msgid "Entry '%s' has invalid 'schedule' value"
msgstr "å…¥å£ '%s' 有无效 'schedule' 值"
@@ -7427,199 +8167,204 @@ msgstr "å…¥å£ '%s' 有无效 'depth' 值"
msgid "Entry '%s' has invalid '%s' value"
msgstr "å…¥å£â€œ%sâ€æœ‰æ— æ•ˆå€¼â€œ%sâ€"
-#: ../libsvn_wc/old-and-busted.c:1081
+#: ../libsvn_wc/old-and-busted.c:1085
#, c-format
msgid "XML parser failed in '%s'"
msgstr "XML 解æžå™¨å¤±è´¥äºŽâ€œ%sâ€"
-#: ../libsvn_wc/old-and-busted.c:1137
+#: ../libsvn_wc/old-and-busted.c:1141
msgid "Missing default entry"
msgstr "丢失默认æ¡ç›®"
-#: ../libsvn_wc/old-and-busted.c:1142
+#: ../libsvn_wc/old-and-busted.c:1146
msgid "Default entry has no revision number"
msgstr "默认æ¡ç›®æ²¡æœ‰ç‰ˆæœ¬å·"
-#: ../libsvn_wc/old-and-busted.c:1147
+#: ../libsvn_wc/old-and-busted.c:1151
msgid "Default entry is missing URL"
msgstr "默认æ¡ç›®æ²¡æœ‰URL"
-#: ../libsvn_wc/old-and-busted.c:1226
+#: ../libsvn_wc/old-and-busted.c:1230
#, c-format
msgid "Invalid version line in entries file of '%s'"
msgstr "“%sâ€æ–‡ä»¶ä¸­çš„版本行无效"
-#: ../libsvn_wc/old-and-busted.c:1243
+#: ../libsvn_wc/old-and-busted.c:1247
msgid "Missing entry terminator"
msgstr "æ¡ç›®ç»ˆç»“符丢失"
-#: ../libsvn_wc/old-and-busted.c:1246
+#: ../libsvn_wc/old-and-busted.c:1250
msgid "Invalid entry terminator"
msgstr "无效的æ¡ç›®ç»ˆæ­¢ç¬¦"
-#: ../libsvn_wc/old-and-busted.c:1250
+#: ../libsvn_wc/old-and-busted.c:1254
#, c-format
msgid "Error at entry %d in entries file for '%s':"
msgstr "æ¡ç›®æ–‡ä»¶ä¸­çš„æ¡ç›® %d 出错于 “%sâ€"
-#: ../libsvn_wc/props.c:236
+#: ../libsvn_wc/props.c:211
#, c-format
msgid "The node '%s' does not have properties in this state."
msgstr "节点 '%s' 没有属性。"
-#: ../libsvn_wc/props.c:401
+#: ../libsvn_wc/props.c:376
#, c-format
msgid ""
"Trying to add new property '%s'\n"
"but the property already exists.\n"
msgstr "试图增加新属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»å­˜åœ¨ã€‚\n"
-#: ../libsvn_wc/props.c:410
+#: ../libsvn_wc/props.c:385
#, c-format
msgid ""
"Trying to add new property '%s'\n"
"but the property has been locally deleted.\n"
msgstr "试图增加新属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«åˆ é™¤ã€‚\n"
-#: ../libsvn_wc/props.c:424
+#: ../libsvn_wc/props.c:399
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally added.\n"
msgstr "试图删除属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«å¢žåŠ ã€‚\n"
-#: ../libsvn_wc/props.c:440
+#: ../libsvn_wc/props.c:415
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally modified.\n"
msgstr "试图删除属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«ä¿®æ”¹ã€‚\n"
-#: ../libsvn_wc/props.c:450
+#: ../libsvn_wc/props.c:425
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the property has been locally deleted and had a different value.\n"
msgstr "试图删除属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«ä¿®æ”¹ï¼Œå¹¶ä¸”具有ä¸åŒçš„å–值。\n"
-#: ../libsvn_wc/props.c:462
+#: ../libsvn_wc/props.c:437
#, c-format
msgid ""
"Trying to delete property '%s'\n"
"but the local property value is different.\n"
msgstr "试图删除属性 “%sâ€ï¼Œä½†æ˜¯å®ƒçš„本地å–值ä¸åŒã€‚\n"
-#: ../libsvn_wc/props.c:481
+#: ../libsvn_wc/props.c:456
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the local property value conflicts with the incoming change.\n"
msgstr "试图修改属性 “%sâ€ï¼Œä½†æ˜¯å®ƒçš„本地å–值ä¸åŒã€‚\n"
-#: ../libsvn_wc/props.c:489
+#: ../libsvn_wc/props.c:464
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has already been locally changed to a different value.\n"
msgstr "试图修改属性 “%sâ€ï¼Œä½†æ˜¯å®ƒçš„本地å–值已ç»æ”¹å˜ã€‚\n"
-#: ../libsvn_wc/props.c:496
+#: ../libsvn_wc/props.c:471
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has been locally deleted.\n"
msgstr "试图修改属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«åˆ é™¤ã€‚\n"
-#: ../libsvn_wc/props.c:502
+#: ../libsvn_wc/props.c:477
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property has been locally added with a different value.\n"
msgstr "试图修改属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå·²ç»åœ¨æœ¬åœ°è¢«å¢žåŠ ï¼Œå¹¶ä¸”å–值ä¸åŒã€‚\n"
-#: ../libsvn_wc/props.c:508
+#: ../libsvn_wc/props.c:483
#, c-format
msgid ""
"Trying to change property '%s'\n"
"but the property does not exist locally.\n"
msgstr "试图修改属性 “%sâ€ï¼Œä½†æ˜¯å®ƒå¹¶ä¸å­˜åœ¨ã€‚\n"
-#: ../libsvn_wc/props.c:612
+#: ../libsvn_wc/props.c:593
msgid "<<<<<<< (local property value)"
msgstr "<<<<<<< (本地属性值)"
-#: ../libsvn_wc/props.c:613
-msgid ">>>>>>> (incoming property value)"
+#: ../libsvn_wc/props.c:594
+#, fuzzy
+msgid ">>>>>>> (incoming 'changed to' value)"
msgstr ">>>>>>> (æœåŠ¡å™¨ç«¯å±žæ€§å€¼)"
-#: ../libsvn_wc/props.c:648
+#: ../libsvn_wc/props.c:595
+msgid "||||||| (incoming 'changed from' value)"
+msgstr ""
+
+#: ../libsvn_wc/props.c:632
msgid "Local property value:\n"
msgstr "本地属性å–值:\n"
-#: ../libsvn_wc/props.c:650 ../libsvn_wc/props.c:661
+#: ../libsvn_wc/props.c:634 ../libsvn_wc/props.c:645
msgid "Cannot display: property value is binary data\n"
msgstr "无法显示: 属性å–值为二进制数æ®\n"
-#: ../libsvn_wc/props.c:659
+#: ../libsvn_wc/props.c:643
msgid "Incoming property value:\n"
msgstr "外部属性å–值:\n"
-#: ../libsvn_wc/props.c:1475 ../libsvn_wc/props.c:1884
-#: ../libsvn_wc/props.c:1985
+#: ../libsvn_wc/props.c:1580 ../libsvn_wc/props.c:1989
+#: ../libsvn_wc/props.c:2090
#, c-format
msgid "Property '%s' is an entry property"
msgstr "属性 “%s†是æ¡ç›®å±žæ€§"
-#: ../libsvn_wc/props.c:1512 ../libsvn_wc/props.c:1519
+#: ../libsvn_wc/props.c:1617 ../libsvn_wc/props.c:1624
msgid "Failed to load properties"
msgstr "加载属性失败"
-#: ../libsvn_wc/props.c:1555
+#: ../libsvn_wc/props.c:1660
#, c-format
msgid "Cannot set '%s' on a directory ('%s')"
msgstr "无法设定“%sâ€äºŽç›®å½• (“%sâ€)"
-#: ../libsvn_wc/props.c:1562
+#: ../libsvn_wc/props.c:1667
#, c-format
msgid "Cannot set '%s' on a file ('%s')"
msgstr "无法设定“%sâ€äºŽæ–‡ä»¶ (“%sâ€)"
-#: ../libsvn_wc/props.c:1641
-#, c-format
+#: ../libsvn_wc/props.c:1746
+#, fuzzy, c-format
msgid "Can't set '%s': file '%s' has binary mime type property"
-msgstr "ä¸èƒ½è®¾ç½®â€œ%sâ€: 文件“%sâ€æœ‰äºŒè¿›åˆ¶çš„ mime 类型属性"
+msgstr "文件“%sâ€æœ‰äºŒè¿›åˆ¶çš„ mime 类型属性"
-#: ../libsvn_wc/props.c:1686
+#: ../libsvn_wc/props.c:1791
msgid "Failed to load current properties"
msgstr "加载当å‰å±žæ€§å¤±è´¥"
-#: ../libsvn_wc/props.c:1906
+#: ../libsvn_wc/props.c:2011
#, c-format
msgid "Can't set properties on '%s': invalid status for updating properties."
msgstr "ä¸èƒ½å¯¹ '%s' 设置属性: 对于更新属性,状æ€éžæ³•ã€‚"
-#: ../libsvn_wc/props.c:1990
-#, c-format
+#: ../libsvn_wc/props.c:2095
+#, fuzzy, c-format
msgid "Property '%s' is a WC property, not a regular property"
-msgstr "“%sâ€æ˜¯å·¥ä½œå‰¯æœ¬å±žæ€§ï¼Œä¸æ˜¯å¸¸è§„属性"
+msgstr "属性 “%s†ä¸æ˜¯å¸¸è§„属性"
-#: ../libsvn_wc/props.c:2084
+#: ../libsvn_wc/props.c:2189
#, c-format
msgid "Unrecognized line ending style '%s' for '%s'"
msgstr "无法识别的行结æŸæ ·å¼â€œ%sâ€ï¼Œå¯¹äºŽâ€œ%sâ€"
#. scratch_
-#: ../libsvn_wc/props.c:2135
+#: ../libsvn_wc/props.c:2240
#, c-format
msgid " (%d more duplicate targets found)"
-msgstr " (å‘现了 %d 个或更多地é‡å¤ç›®æ ‡)"
+msgstr " (å‘现了 %d 个é‡å¤ç›®æ ‡)"
-#: ../libsvn_wc/props.c:2140
-#, c-format
+#: ../libsvn_wc/props.c:2245
+#, fuzzy, c-format
msgid "Invalid %s property on '%s': target '%s' appears more than once%s"
-msgstr "无效属性 %s 于“%sâ€: 目标“%sâ€å‡ºçŽ°å¤šæ¬¡%s"
+msgstr "无效属性 %s ä½äºŽ “%sâ€: 目标 “%sâ€ åŒ…å« â€œ..†或是ç»å¯¹è·¯å¾„"
-#: ../libsvn_wc/props.c:2171
+#: ../libsvn_wc/props.c:2276
#, c-format
msgid "Cannot set non-inheritable mergeinfo on a non-directory ('%s')"
msgstr "无法在éžç›®å½•å¯¹è±¡(“%sâ€)设定ä¸å¯ç»§æ‰¿çš„åˆå¹¶ä¿¡æ¯"
@@ -7631,9 +8376,7 @@ msgstr "ä¸èƒ½é‡æ–°å®šä½ '%s',因为它ä¸æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•"
#: ../libsvn_wc/relocate.c:118
#, c-format
-msgid ""
-"Cannot relocate '%s' as it is not the root of a working copy; try relocating "
-"'%s' instead"
+msgid "Cannot relocate '%s' as it is not the root of a working copy; try relocating '%s' instead"
msgstr "ä¸èƒ½é‡æ–°å®šä½ '%s',因为它ä¸æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•ï¼›è¯·é‡æ–°å®šä½ '%s'"
#: ../libsvn_wc/relocate.c:136
@@ -7655,33 +8398,33 @@ msgstr "éžæ³•è¿ç§»ç›®æ ‡: '%s' (ä¸æ˜¯ URL)"
msgid "Invalid relocation destination: '%s' (does not point to target)"
msgstr "éžæ³•è¿ç§»ç›®æ ‡: '%s' (没有指å‘目标)"
-#: ../libsvn_wc/tree_conflicts.c:136
+#: ../libsvn_wc/tree_conflicts.c:137
msgid "Unknown enumeration value in tree conflict description"
msgstr "树冲çªæ述中有未知的枚举值"
-#: ../libsvn_wc/tree_conflicts.c:160
+#: ../libsvn_wc/tree_conflicts.c:161
msgid "Invalid version info in tree conflict description"
msgstr "树冲çªæ述中有éžæ³•çš„版本信æ¯"
-#: ../libsvn_wc/tree_conflicts.c:218
+#: ../libsvn_wc/tree_conflicts.c:219
#, c-format
msgid "Invalid conflict info '%s' in tree conflict description"
msgstr "树冲çªæ述中有éžæ³•çš„冲çªä¿¡æ¯ '%s'"
-#: ../libsvn_wc/tree_conflicts.c:229
+#: ../libsvn_wc/tree_conflicts.c:230
msgid "Empty 'victim' field in tree conflict description"
msgstr "树冲çªæ述中的 “victim†域为空"
-#: ../libsvn_wc/tree_conflicts.c:237
+#: ../libsvn_wc/tree_conflicts.c:238
msgid "Invalid 'node_kind' field in tree conflict description"
msgstr "树冲çªæ述中有éžæ³•çš„ “node_kind†域"
-#: ../libsvn_wc/tree_conflicts.c:430
+#: ../libsvn_wc/tree_conflicts.c:432
#, c-format
msgid "Attempt to add tree conflict that already exists at '%s'"
msgstr "试图增加已ç»ä½äºŽâ€œ%sâ€çš„树冲çª"
-#: ../libsvn_wc/update_editor.c:998
+#: ../libsvn_wc/update_editor.c:978
#, c-format
msgid ""
"Checksum mismatch while updating '%s':\n"
@@ -7692,47 +8435,36 @@ msgstr ""
" 期望: %s\n"
" 实际: %s\n"
-#: ../libsvn_wc/update_editor.c:1129
-#, c-format
+#: ../libsvn_wc/update_editor.c:1113
+#, fuzzy, c-format
msgid "'%s' is not valid as filename in directory '%s'"
-msgstr "“%sâ€ä¸æ˜¯åˆæ³•æ–‡ä»¶å称于目录“%sâ€ä¸­"
+msgstr "“%sâ€ä¸æ˜¯æ–‡ä»¶æˆ–目录"
-#: ../libsvn_wc/update_editor.c:1606
-#, c-format
+#: ../libsvn_wc/update_editor.c:1585
+#, fuzzy, c-format
msgid "Unexpected attempt to add a node at path '%s'"
-msgstr "æ„外的试图在路径“%sâ€å¢žåŠ èŠ‚点"
+msgstr "“%sâ€æœ‰æ„外的ä¸å˜èŠ‚点"
-#: ../libsvn_wc/update_editor.c:1617
+#: ../libsvn_wc/update_editor.c:1596
#, c-format
msgid "Unexpected attempt to edit, delete, or replace a node at path '%s'"
-msgstr "æ„外的试图在路径“%sâ€ç¼–辑,删除或替æ¢èŠ‚点"
+msgstr ""
-#: ../libsvn_wc/update_editor.c:2019
+#: ../libsvn_wc/update_editor.c:2018
#, c-format
-msgid ""
-"Failed to add directory '%s': object of the same name as the administrative "
-"directory"
+msgid "Failed to add directory '%s': object of the same name as the administrative directory"
msgstr "无法增加目录“%sâ€: 对象与管ç†ç›®å½•åŒå"
-#: ../libsvn_wc/update_editor.c:2667
+#: ../libsvn_wc/update_editor.c:2684
msgid "Couldn't do property merge"
msgstr "无法进行属性åˆå¹¶"
-#: ../libsvn_wc/update_editor.c:3023
-#, c-format
-msgid ""
-"Failed to mark '%s' absent: item of the same name is already scheduled for "
-"addition"
-msgstr "无法将“%sâ€æ ‡è®°ä¸ºä¸å­˜åœ¨: åŒå项目已加入增加调度"
-
-#: ../libsvn_wc/update_editor.c:3111
+#: ../libsvn_wc/update_editor.c:3194
#, c-format
-msgid ""
-"Failed to add file '%s': object of the same name as the administrative "
-"directory"
+msgid "Failed to add file '%s': object of the same name as the administrative directory"
msgstr "无法增加文件“%sâ€: 对象与管ç†ç›®å½•åŒå"
-#: ../libsvn_wc/update_editor.c:3623
+#: ../libsvn_wc/update_editor.c:3716
#, c-format
msgid ""
"Checksum mismatch for '%s':\n"
@@ -7743,43 +8475,39 @@ msgstr ""
" 期望: %s\n"
" 记录: %s\n"
-#: ../libsvn_wc/update_editor.c:5181
+#: ../libsvn_wc/update_editor.c:5371
#, c-format
msgid "Node '%s' exists."
msgstr "节点“%sâ€å·²å­˜åœ¨"
-#: ../libsvn_wc/update_editor.c:5241
+#: ../libsvn_wc/update_editor.c:5431
#, c-format
msgid "Copyfrom-url '%s' has different repository root than '%s'"
msgstr "Copyfrom-url“%sâ€ä¸Žâ€œ%sâ€çš„版本库根目录ä¸ç›¸åŒ"
-#: ../libsvn_wc/update_editor.c:5439
-#, c-format
+#: ../libsvn_wc/update_editor.c:5643
+#, fuzzy, c-format
msgid "'%s' is not an unmodified copied directory"
-msgstr "“%sâ€ä¸æ˜¯æœªä¿®æ”¹çš„å¤åˆ¶ç›®å½•"
+msgstr "“%sâ€ä¸æ˜¯æ–‡ä»¶æˆ–目录"
-#: ../libsvn_wc/update_editor.c:5450
+#: ../libsvn_wc/update_editor.c:5654
#, c-format
msgid "Copyfrom '%s' doesn't match original location of '%s'"
-msgstr "Copyfrom“%sâ€ä¸Žâ€œ%sâ€çš„原始ä½ç½®ä¸åŒ¹é…"
+msgstr ""
#: ../libsvn_wc/upgrade.c:255
#, c-format
msgid "Missing end of line in wcprops file for '%s'"
-msgstr "“%sâ€çš„工作副本属性文件丢失了行结æŸç¬¦"
+msgstr "wcprops文件“%sâ€ä¸¢å¤±äº†è¡Œç»“æŸç¬¦"
#: ../libsvn_wc/upgrade.c:631
#, c-format
-msgid ""
-"Working copy '%s' can't be upgraded because the repository root is not "
-"available and can't be retrieved"
+msgid "Working copy '%s' can't be upgraded because the repository root is not available and can't be retrieved"
msgstr "由于版本库的根ä¸å¯ç”¨ï¼Œå¹¶ä¸”ä¸èƒ½æ‰¾å›žï¼Œæ‰€ä»¥å·¥ä½œå‰¯æœ¬â€œ%sâ€ä¸èƒ½è¢«å‡çº§"
#: ../libsvn_wc/upgrade.c:638
#, c-format
-msgid ""
-"Working copy '%s' can't be upgraded because the repository uuid is not "
-"available and can't be retrieved"
+msgid "Working copy '%s' can't be upgraded because the repository uuid is not available and can't be retrieved"
msgstr "由于版本库的 UUID ä¸å¯ç”¨ï¼Œå¹¶ä¸”ä¸èƒ½æ‰¾å›žï¼Œæ‰€ä»¥å·¥ä½œå‰¯æœ¬â€œ%sâ€ä¸èƒ½è¢«å‡çº§"
#: ../libsvn_wc/upgrade.c:645
@@ -7791,38 +8519,22 @@ msgstr "由于没有 URL,所以工作副本“%sâ€ä¸èƒ½è¢«å‡çº§"
msgid "Error parsing tree conflict skel"
msgstr "解æžæ ‘冲çªéª¨æž¶å‡ºé”™"
-#: ../libsvn_wc/upgrade.c:1173
+#: ../libsvn_wc/upgrade.c:1172
#, c-format
-msgid ""
-"The working copy at '%s' is format 22 with WORKING nodes; use a format 22 "
-"client to diff/revert before using this client"
-msgstr ""
-"ä½äºŽ '%s' 的工作副本是有 WORKING èŠ‚ç‚¹çš„æ ¼å¼ 22;请先使用支æŒæ ¼å¼ 22 的客户端"
-"比较/还原åŽï¼Œå†ä½¿ç”¨æ­¤å®¢æˆ·ç«¯"
+msgid "The working copy at '%s' is format 22 with WORKING nodes; use a format 22 client to diff/revert before using this client"
+msgstr "ä½äºŽ '%s' 的工作副本是有 WORKING èŠ‚ç‚¹çš„æ ¼å¼ 22;请先使用支æŒæ ¼å¼ 22 的客户端比较/还原åŽï¼Œå†ä½¿ç”¨æ­¤å®¢æˆ·ç«¯"
-#: ../libsvn_wc/upgrade.c:1217
+#: ../libsvn_wc/upgrade.c:1216
#, c-format
-msgid ""
-"The working copy at '%s' is format 26 with conflicts; use a format 26 client "
-"to resolve before using this client"
-msgstr ""
-"ä½äºŽ '%s' 的工作副本是有冲çªçš„æ ¼å¼ 26;请先使用支æŒæ ¼å¼ 26 的客户端解决冲çª"
-"åŽï¼Œå†ä½¿ç”¨æ­¤å®¢æˆ·ç«¯"
+msgid "The working copy at '%s' is format 26 with conflicts; use a format 26 client to resolve before using this client"
+msgstr "ä½äºŽ '%s' 的工作副本是有冲çªçš„æ ¼å¼ 26;请先使用支æŒæ ¼å¼ 26 的客户端解决冲çªåŽï¼Œå†ä½¿ç”¨æ­¤å®¢æˆ·ç«¯"
#: ../libsvn_wc/upgrade.c:1723
-msgid ""
-"Cannot upgrade with existing logs; run a cleanup operation on this working "
-"copy using a client version which is compatible with this working copy's "
-"format (such as the version you are upgrading from), then retry the upgrade "
-"with the current version"
-msgstr ""
-"ä¸èƒ½åœ¨æœ‰æ—¥å¿—文件时å‡çº§ï¼›è¯·å…ˆä½¿ç”¨ä¸Žæ­¤å·¥ä½œå‰¯æœ¬æ ¼å¼å…¼å®¹çš„客户端(例如生æˆæ­¤å·¥ä½œå‰¯"
-"本的客户端)执行清ç†æ“作,å†å‡çº§"
+msgid "Cannot upgrade with existing logs; run a cleanup operation on this working copy using a client version which is compatible with this working copy's format (such as the version you are upgrading from), then retry the upgrade with the current version"
+msgstr "ä¸èƒ½åœ¨æœ‰æ—¥å¿—文件时å‡çº§ï¼›è¯·å…ˆä½¿ç”¨ä¸Žæ­¤å·¥ä½œå‰¯æœ¬æ ¼å¼å…¼å®¹çš„客户端(例如生æˆæ­¤å·¥ä½œå‰¯æœ¬çš„客户端)执行清ç†æ“作,å†å‡çº§"
#: ../libsvn_wc/upgrade.c:1792
-msgid ""
-"This working copy is corrupt and cannot be upgraded. Please check out a new "
-"working copy."
+msgid "This working copy is corrupt and cannot be upgraded. Please check out a new working copy."
msgstr "此工作副本æŸå,ä¸èƒ½å‡çº§ã€‚请é‡æ–°æ£€å‡ºã€‚"
#: ../libsvn_wc/upgrade.c:1837
@@ -7836,285 +8548,283 @@ msgstr "工作副本 '%s' æ ¼å¼å¤ªæ—§ (æ ¼å¼ %d, Subversion %s 创建)"
#: ../libsvn_wc/upgrade.c:1863
#, c-format
-msgid ""
-"Working copy '%s' is an old development version (format %d); to upgrade it, "
-"use a format 18 client, then use 'tools/dev/wc-ng/bump-to-19.py', then use "
-"the current client"
-msgstr ""
-"工作副本 '%s' 是旧开å‘版本的格å¼(%d); è¯·ä½¿ç”¨æ ¼å¼ 18 客户端清ç†åŽï¼Œ å†ä½¿ç”¨ "
-"'tools/dev/wc-ng/bump-to-19.py' å‡çº§ï¼Œæœ€åŽä½¿ç”¨å½“å‰å®¢æˆ·ç«¯"
+msgid "Working copy '%s' is an old development version (format %d); to upgrade it, use a format 18 client, then use 'tools/dev/wc-ng/bump-to-19.py', then use the current client"
+msgstr "工作副本 '%s' 是旧开å‘版本的格å¼(%d); è¯·ä½¿ç”¨æ ¼å¼ 18 客户端清ç†åŽï¼Œ å†ä½¿ç”¨ 'tools/dev/wc-ng/bump-to-19.py' å‡çº§ï¼Œæœ€åŽä½¿ç”¨å½“å‰å®¢æˆ·ç«¯"
-#: ../libsvn_wc/upgrade.c:2088
-#, c-format
+#: ../libsvn_wc/upgrade.c:2092
+#, fuzzy, c-format
msgid "Can't upgrade '%s' as it is not a working copy"
-msgstr "ä¸èƒ½å‡çº§â€œ%sâ€ï¼Œå› ä¸ºå®ƒä¸æ˜¯å·¥ä½œå‰¯æœ¬ç›®å½•"
+msgstr "ä¸èƒ½å‡çº§ '%s',因为它ä¸æ˜¯ 1.7 之å‰çš„工作副本目录"
-#: ../libsvn_wc/upgrade.c:2137
-#, c-format
+#: ../libsvn_wc/upgrade.c:2141
+#, fuzzy, c-format
msgid "Can't upgrade '%s' as it is not a working copy root, the root is '%s'"
-msgstr "ä¸èƒ½å‡çº§â€œ%sâ€ï¼Œå› ä¸ºå®ƒä¸æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•ï¼Œæ ¹ç›®å½•æ˜¯ '%s'"
+msgstr "ä¸èƒ½å‡çº§ '%s',因为它ä¸æ˜¯ 1.7 之å‰çš„工作副本根目录,根目录是 '%s'"
-#: ../libsvn_wc/wc_db.c:452
+#: ../libsvn_wc/wc_db.c:446
#, c-format
msgid "No REPOSITORY table entry for id '%ld'"
msgstr "对于标识 '%ld' 没有 REPOSITORY 表入å£"
-#: ../libsvn_wc/wc_db.c:718
+#: ../libsvn_wc/wc_db.c:762
#, c-format
msgid "The file '%s' has no checksum."
msgstr "文件 '%s' 没有校验和。"
-#: ../libsvn_wc/wc_db.c:2456 ../libsvn_wc/wc_db.c:2837
-#: ../libsvn_wc/wc_db.c:8878
+#: ../libsvn_wc/wc_db.c:2533 ../libsvn_wc/wc_db.c:2949
+#: ../libsvn_wc/wc_db.c:9478
#, c-format
msgid "The node '%s' has a corrupt checksum value."
msgstr "节点 '%s' 的校验和æŸå。"
-#: ../libsvn_wc/wc_db.c:2641
+#: ../libsvn_wc/wc_db.c:2753
#, c-format
msgid "The node '%s' has a BASE status that has no properties."
msgstr ""
-#: ../libsvn_wc/wc_db.c:3467
+#: ../libsvn_wc/wc_db.c:3579
#, c-format
msgid "The node '%s' is not an external."
msgstr "节点 “%s†ä¸æ˜¯å¤–部对象"
-#: ../libsvn_wc/wc_db.c:3874
+#: ../libsvn_wc/wc_db.c:3993
#, c-format
msgid "Expected node '%s' to be deleted."
msgstr "期望节点“%sâ€è¢«åˆ é™¤ã€‚"
-#: ../libsvn_wc/wc_db.c:6355 ../libsvn_wc/wc_db.c:6433
+#: ../libsvn_wc/wc_db.c:6522 ../libsvn_wc/wc_db.c:6601
#, c-format
msgid "Can't revert '%s' without reverting children"
msgstr "ä¸èƒ½æ¢å¤ '%s',而ä¸æ¢å¤å­©å­ã€‚"
-#: ../libsvn_wc/wc_db.c:6530
+#: ../libsvn_wc/wc_db.c:6709
#, c-format
msgid "Can't revert '%s' without reverting parent"
msgstr "ä¸èƒ½æ¢å¤ '%s',而ä¸æ¢å¤çˆ¶äº²ã€‚"
-#: ../libsvn_wc/wc_db.c:6647
+#: ../libsvn_wc/wc_db.c:6844
#, c-format
msgid "Unsupported depth for revert of '%s'"
msgstr "对于æ¢å¤ '%s',其深度ä¸å—支æŒ"
-#: ../libsvn_wc/wc_db.c:7490
+#: ../libsvn_wc/wc_db.c:7430
+#, fuzzy, c-format
+msgid "The node '%s' is not a committed directory"
+msgstr "节点 '%s' ä¸æ˜¯æ–‡ä»¶"
+
+#: ../libsvn_wc/wc_db.c:7816
#, c-format
msgid "Cannot delete '%s' as '%s' is excluded by server"
msgstr "ä¸èƒ½åˆ é™¤ '%s',因为 '%s' 被æœåŠ¡å™¨æŽ’除"
-#: ../libsvn_wc/wc_db.c:7501
-#, c-format
+#: ../libsvn_wc/wc_db.c:7827
+#, fuzzy, c-format
msgid "Cannot delete '%s' as it is excluded by server"
-msgstr "ä¸èƒ½åˆ é™¤ '%s',因为它被æœåŠ¡å™¨æŽ’除"
+msgstr "ä¸èƒ½åˆ é™¤ '%s',因为 '%s' 被æœåŠ¡å™¨æŽ’除"
-#: ../libsvn_wc/wc_db.c:7508
-#, c-format
+#: ../libsvn_wc/wc_db.c:7834
+#, fuzzy, c-format
msgid "Cannot delete '%s' as it is excluded"
-msgstr "ä¸èƒ½åˆ é™¤ '%s',因为它被排除"
+msgstr "ä¸èƒ½åˆ é™¤ '%s',因为 '%s' 被æœåŠ¡å™¨æŽ’除"
-#: ../libsvn_wc/wc_db.c:7922
-#, c-format
+#: ../libsvn_wc/wc_db.c:8286
+#, fuzzy, c-format
msgid "Cannot move '%s' to '%s' because they are not in the same working copy"
-msgstr "ä¸èƒ½ç§»åŠ¨ '%s' 到 '%s',因为它们ä¸æ˜¯åŒä¸€å·¥ä½œå‰¯æœ¬"
+msgstr "ä¸èƒ½é‡æ–°å®šä½ '%s',因为它ä¸æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•"
-#: ../libsvn_wc/wc_db.c:8280
+#: ../libsvn_wc/wc_db.c:8644
#, c-format
msgid "Corrupt data for '%s'"
msgstr "'%s' çš„æ•°æ®æŸå"
-#: ../libsvn_wc/wc_db.c:8584
+#: ../libsvn_wc/wc_db.c:8718
+#, fuzzy, c-format
+msgid "Error reading node '%s'"
+msgstr "读å–é”® “%s†的修改时出错"
+
+#: ../libsvn_wc/wc_db.c:8954
#, c-format
-msgid ""
-"The node '%s' comes from unexpected repository '%s', expected '%s'; if this "
-"node is a file external using the correct URL in the external definition can "
-"fix the problem, see issue #4087"
-msgstr ""
-"节点“%sâ€æ¥è‡ªä¸æœŸæœ›çš„版本库“%sâ€ï¼ŒæœŸæœ›çš„版本库是“%sâ€ï¼›å¦‚果此节点是文件外部引"
-"用,那么在外部定义中使用正确的 URL å¯ä»¥ä¿®æ­£è¿™ä¸ªé—®é¢˜ï¼Œè¯·å‚è§é—®é¢˜ #4087 以获得"
-"详细信æ¯"
+msgid "The node '%s' comes from unexpected repository '%s', expected '%s'; if this node is a file external using the correct URL in the external definition can fix the problem, see issue #4087"
+msgstr "节点“%sâ€æ¥è‡ªä¸æœŸæœ›çš„版本库“%sâ€ï¼ŒæœŸæœ›çš„版本库是“%sâ€ï¼›å¦‚果此节点是文件外部引用,那么在外部定义中使用正确的 URL å¯ä»¥ä¿®æ­£è¿™ä¸ªé—®é¢˜ï¼Œè¯·å‚è§é—®é¢˜ #4087 以获得详细信æ¯"
-#: ../libsvn_wc/wc_db.c:9003
+#: ../libsvn_wc/wc_db.c:9603
#, c-format
msgid "The node '%s' is not in working copy '%s'"
msgstr "节点“%sâ€ä¸åœ¨å·¥ä½œå‰¯æœ¬â€œ%sâ€ä¸­"
-#: ../libsvn_wc/wc_db.c:9040
+#: ../libsvn_wc/wc_db.c:9640
#, c-format
msgid "The node '%s' is not installable"
msgstr "节点 '%s' ä¸å¯å®‰è£…"
-#: ../libsvn_wc/wc_db.c:9469 ../libsvn_wc/wc_db.c:9728
-#, c-format
+#: ../libsvn_wc/wc_db.c:10071 ../libsvn_wc/wc_db.c:10330
+#, fuzzy, c-format
msgid "The node '%s' has a status that has no properties."
-msgstr "节点 '%s' 有状æ€ï¼Œæ²¡æœ‰å±žæ€§ã€‚"
+msgstr "节点 '%s' 没有属性。"
-#: ../libsvn_wc/wc_db.c:11568
+#: ../libsvn_wc/wc_db.c:12151
#, c-format
msgid "Expected node '%s' to be added."
msgstr "期望节点“%sâ€è¢«å¢žåŠ ã€‚"
-#: ../libsvn_wc/wc_db.c:11914
-#, c-format
+#: ../libsvn_wc/wc_db.c:12458
+#, fuzzy, c-format
msgid "Path '%s' was not moved here"
-msgstr "路径“%sâ€ä¸æ˜¯ç§»åˆ°è¿™é‡Œ"
-
-#: ../libsvn_wc/wc_db.c:11983
-#, c-format
-msgid "The base node '%s' was not found."
-msgstr "找ä¸åˆ°åŸºç¡€èŠ‚点 '%s'。"
+msgstr "路径“%sâ€ä¸æ˜¯æ–‡ä»¶"
-#: ../libsvn_wc/wc_db.c:12415
+#: ../libsvn_wc/wc_db.c:12875
#, c-format
-msgid ""
-"The properties of '%s' are in an indeterminate state and cannot be upgraded. "
-"See issue #2530."
+msgid "The properties of '%s' are in an indeterminate state and cannot be upgraded. See issue #2530."
msgstr "'%s' 的属性处于ä¸ç¡®å®šçš„状æ€ï¼Œä¸èƒ½æ›´æ–°ã€‚详情å‚è§é—®é¢˜ #2530。"
-#: ../libsvn_wc/wc_db.c:12427
+#: ../libsvn_wc/wc_db.c:12887
#, c-format
msgid "Insufficient NODES rows for '%s'"
msgstr "'%s' 的节点行数ä¸è¶³"
-#: ../libsvn_wc/wc_db.c:12574
+#: ../libsvn_wc/wc_db.c:13034
#, c-format
msgid "Repository '%s' not found in the database"
msgstr "在数æ®åº“中找ä¸åˆ°ç‰ˆæœ¬åº““%sâ€"
-#: ../libsvn_wc/wc_db.c:13561 ../libsvn_wc/wc_db.c:13609
+#: ../libsvn_wc/wc_db.c:14026 ../libsvn_wc/wc_db.c:14074
#, c-format
msgid "'%s' is already locked."
msgstr "'%s' å·²ç»é”定。"
-#: ../libsvn_wc/wc_db.c:13566 ../libsvn_wc/wc_db.c:13617
+#: ../libsvn_wc/wc_db.c:14031 ../libsvn_wc/wc_db.c:14082
#, c-format
msgid "Working copy '%s' locked."
msgstr "工作副本 '%s' å·²ç»é”定。"
-#: ../libsvn_wc/wc_db.c:13689
+#: ../libsvn_wc/wc_db.c:14105
+#, fuzzy, c-format
+msgid "Failed to lock working copy '%s'."
+msgstr "åœ¨å·¥ä½œå‰¯æœ¬ä¸­å®šä½ â€œcopyfrom†的路径失败。"
+
+#: ../libsvn_wc/wc_db.c:14154
#, c-format
msgid "'%s' is already locked via '%s'."
msgstr "'%s' å·²ç»é€šè¿‡ '%s' é”定。"
-#: ../libsvn_wc/wc_db.c:13863
+#: ../libsvn_wc/wc_db.c:14328
#, c-format
msgid "Working copy not locked at '%s'."
msgstr "工作副本 '%s' 未被é”定。"
-#: ../libsvn_wc/wc_db.c:14246
+#: ../libsvn_wc/wc_db.c:14711
#, c-format
msgid "Modification of '%s' already exists"
msgstr "“%s†的修改已存在"
#. If EXPRESSION is false, cause the caller to return an SVN_ERR_WC_CORRUPT
#. * error, showing EXPRESSION and the caller's LOCAL_RELPATH in the message.
-#: ../libsvn_wc/wc_db.c:14888
+#: ../libsvn_wc/wc_db.c:15353
#, c-format
msgid "database inconsistency at local_relpath='%s' verifying expression '%s'"
msgstr "æ•°æ®åº“ä¸ä¸€è‡´ï¼Œè·¯å¾„是“%sâ€ï¼Œæ ¡éªŒè¡¨è¾¾å¼æ˜¯â€œ%sâ€"
-#: ../libsvn_wc/wc_db.c:15012
-#, c-format
+#: ../libsvn_wc/wc_db.c:15478
+#, fuzzy, c-format
msgid "Can't upgrade '%s' as it is not a working copy root"
-msgstr "ä¸èƒ½å‡çº§ '%s',因为它ä¸æ˜¯å·¥ä½œå‰¯æœ¬ç›®å½•"
+msgstr "ä¸èƒ½å‡çº§ '%s',因为它ä¸æ˜¯ 1.7 之å‰çš„工作副本目录"
-#: ../libsvn_wc/wc_db.c:15018
-#, c-format
-msgid ""
-"Working copy '%s' is too old and must be upgraded to at least format %d, as "
-"created by Subversion %s"
-msgstr "工作副本 '%s' æ ¼å¼å¤ªæ—§ï¼Œå¿…须至少å‡çº§åˆ°æ ¼å¼ %d, 被 Subversion %s 创建"
+#: ../libsvn_wc/wc_db.c:15484
+#, fuzzy, c-format
+msgid "Working copy '%s' is too old and must be upgraded to at least format %d, as created by Subversion %s"
+msgstr "工作副本 '%s' æ ¼å¼å¤ªæ—§ (æ ¼å¼ %d, Subversion %s 创建)"
-#: ../libsvn_wc/wc_db.c:15036
+#: ../libsvn_wc/wc_db.c:15502
+#, fuzzy
msgid "Working copy upgrade failed"
-msgstr "工作副本å‡çº§å¤±è´¥"
+msgstr "工作副本“%sâ€å·²ç»é”定"
-#: ../libsvn_wc/wc_db_pristine.c:125 ../libsvn_wc/wc_db_pristine.c:457
+#: ../libsvn_wc/wc_db.c:15603
+#, fuzzy, c-format
+msgid "The path '%s' is not in the working copy '%s'"
+msgstr "路径 “%s†ä¸åœ¨å·¥ä½œå‰¯æœ¬ä¸­"
+
+#: ../libsvn_wc/wc_db_pristine.c:128 ../libsvn_wc/wc_db_pristine.c:467
#, c-format
msgid "The pristine text with checksum '%s' was not found"
msgstr "找ä¸åˆ°æ ¡éªŒå’Œä¸ºâ€œ%sâ€çš„原始内容"
-#: ../libsvn_wc/wc_db_pristine.c:191
+#: ../libsvn_wc/wc_db_pristine.c:194
#, c-format
msgid "Pristine text '%s' not present"
msgstr "原始内容 “%s†ä¸å­˜åœ¨"
-#: ../libsvn_wc/wc_db_pristine.c:224
+#: ../libsvn_wc/wc_db_pristine.c:237
#, c-format
msgid "Can't read '%s' from pristine store because no checksum supplied"
msgstr "没有æ供校验和,因此ä¸èƒ½ä»ŽåŽŸå§‹å†…å®¹ä»“åº“ä¸­è¯»å– '%s'"
-#: ../libsvn_wc/wc_db_pristine.c:328
+#: ../libsvn_wc/wc_db_pristine.c:320
#, c-format
msgid "New pristine text '%s' has different size: %ld versus %ld"
msgstr "新原始内容 '%s' 有ä¸åŒçš„大å°: %ld 与 %ld"
-#: ../libsvn_wc/wc_db_pristine.c:496
+#: ../libsvn_wc/wc_db_pristine.c:506
#, c-format
msgid "The pristine text with MD5 checksum '%s' was not found"
msgstr "找ä¸åˆ° MD5 校验和为“%sâ€çš„原始内容"
-#: ../libsvn_wc/wc_db_update_move.c:282 ../libsvn_wc/wc_db_update_move.c:306
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:310 ../libsvn_wc/wc_db_update_move.c:334
+#, fuzzy, c-format
msgid "'%s' already in conflict"
-msgstr "“%s†已在冲çªä¸­"
+msgstr "“%s†已存在"
-#: ../libsvn_wc/wc_db_update_move.c:1382
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:1322
+#, fuzzy, c-format
msgid "'%s' is not in conflict"
-msgstr "“%sâ€ä¸åœ¨å†²çªä¸­"
+msgstr "“%sâ€ä¸æ˜¯ä¸€ä¸ªæ–‡ä»¶"
-#: ../libsvn_wc/wc_db_update_move.c:1395
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:1335
+#, fuzzy, c-format
msgid "'%s' is not a tree-conflict victim"
-msgstr "'%s' ä¸æ˜¯æ ‘冲çªç‰ºç‰²å“"
+msgstr "'%s' ä¸æ˜¯ç›¸å¯¹è·¯å¾„"
-#: ../libsvn_wc/wc_db_update_move.c:1754
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:1721
+#, fuzzy, c-format
msgid "Cannot auto-resolve tree-conflict on '%s'"
-msgstr "ä¸èƒ½åœ¨â€œ%sâ€è‡ªåŠ¨è§£å†³æ ‘冲çª"
+msgstr "无法删除目录 “%sâ€"
-#: ../libsvn_wc/wc_db_update_move.c:1817
+#: ../libsvn_wc/wc_db_update_move.c:1781
#, c-format
-msgid ""
-"Cannot apply update because move source %s' is a mixed-revision working copy"
+msgid "Cannot apply update because move source %s' is a mixed-revision working copy"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1828
+#: ../libsvn_wc/wc_db_update_move.c:1792
#, c-format
msgid "Cannot apply update because move source '%s' is a switched subtree"
msgstr ""
-#: ../libsvn_wc/wc_db_update_move.c:1879
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:1842
+#, fuzzy, c-format
msgid "The node '%s' has not been moved away"
-msgstr "节点“%sâ€æ²¡æœ‰è¢«ç§»èµ°"
+msgstr "节点 '%s' ä¸èƒ½æ¢å¤ã€‚"
-#: ../libsvn_wc/wc_db_update_move.c:1908
-#, c-format
+#: ../libsvn_wc/wc_db_update_move.c:1871
+#, fuzzy, c-format
msgid "'%s' is not deleted"
-msgstr "“%sâ€æ²¡æœ‰è¢«åˆ é™¤"
+msgstr "“%s†没有被é”定"
#: ../libsvn_wc/wc_db_util.c:69
#, c-format
msgid "Missing a row in WCROOT."
msgstr "WCROOT 中丢失了一行。"
-#: ../libsvn_wc/wc_db_util.c:135
-#, c-format
+#: ../libsvn_wc/wc_db_util.c:136
+#, fuzzy, c-format
msgid "Working copy database '%s' not found"
-msgstr "找ä¸åˆ°å·¥ä½œå‰¯æœ¬æ•°æ®åº““%sâ€"
+msgstr "工作副本“%sâ€æœªè¢«é”定"
-#: ../libsvn_wc/wc_db_wcroot.c:276
+#: ../libsvn_wc/wc_db_wcroot.c:284
#, c-format
-msgid ""
-"Working copy format of '%s' is too old (%d); please check out your working "
-"copy again"
+msgid "Working copy format of '%s' is too old (%d); please check out your working copy again"
msgstr "“%sâ€çš„工作副本格å¼å¤ªæ—§(%d);请é‡æ–°å–出工作副本"
-#: ../libsvn_wc/wc_db_wcroot.c:286
+#: ../libsvn_wc/wc_db_wcroot.c:294
#, c-format
msgid ""
"This client is too old to work with the working copy at\n"
@@ -8127,65 +8837,964 @@ msgstr ""
" http://subversion.apache.org/faq.html#working-copy-format-change\n"
"以获得更详细的信æ¯ã€‚\n"
-#: ../libsvn_wc/wc_db_wcroot.c:307
+#: ../libsvn_wc/wc_db_wcroot.c:315
msgid "Cleanup with an older 1.7 client before upgrading with this client"
msgstr "请在用此客户端å‡çº§ä¹‹å‰ï¼Œç”¨æ—§çš„ 1.7 客户端清ç†"
-#: ../libsvn_wc/wc_db_wcroot.c:318
+#: ../libsvn_wc/wc_db_wcroot.c:326
#, c-format
msgid ""
"The working copy at '%s'\n"
-"is too old (format %d) to work with client version '%s' (expects format %d). "
-"You need to upgrade the working copy first.\n"
+"is too old (format %d) to work with client version '%s' (expects format %d). You need to upgrade the working copy first.\n"
msgstr ""
-#: ../libsvn_wc/wc_db_wcroot.c:396
+#: ../libsvn_wc/wc_db_wcroot.c:404
#, c-format
msgid "The symlink at '%s' points nowhere"
-msgstr "ä½äºŽâ€œ%sâ€çš„符å·è¿žæŽ¥æ²¡æœ‰æŒ‡å‘任何地方"
+msgstr "符å·è¿žæŽ¥ '%s' 没有指å‘任何地方"
-#: ../libsvn_wc/wc_db_wcroot.c:661
+#: ../libsvn_wc/wc_db_wcroot.c:673
#, c-format
msgid "Missing a row in WCROOT for '%s'."
msgstr "WCROOT 中的 '%s' 丢失了一行。"
-#: ../libsvn_wc/wc_db_wcroot.c:709
-#, c-format
+#: ../libsvn_wc/wc_db_wcroot.c:728
+#, fuzzy, c-format
msgid "The working copy at '%s' is corrupt."
-msgstr "ä½äºŽâ€œ%sâ€çš„工作副本已æŸå。"
+msgstr "工作副本的å‚考文件æŸå"
-#: ../libsvn_wc/wc_db_wcroot.c:725
-#, c-format
+#: ../libsvn_wc/wc_db_wcroot.c:744
+#, fuzzy, c-format
msgid "The working copy database at '%s' is missing."
-msgstr "ä½äºŽâ€œ%sâ€çš„工作副本数æ®åº“丢失。"
+msgstr "工作副本丢失"
-#: ../libsvn_wc/wc_db_wcroot.c:734
-#, c-format
+#: ../libsvn_wc/wc_db_wcroot.c:753
+#, fuzzy, c-format
msgid "The working copy database at '%s' is corrupt."
-msgstr "ä½äºŽâ€œ%sâ€çš„工作副本数æ®åº“æŸå。"
+msgstr "工作副本的å‚考文件æŸå"
-#: ../libsvn_wc/wc_db_wcroot.c:881
+#: ../libsvn_wc/wc_db_wcroot.c:911
#, c-format
msgid "'%s' is not a working copy root"
msgstr "'%s' ä¸æ˜¯å·¥ä½œå‰¯æœ¬æ ¹ç›®å½•"
-#: ../libsvn_wc/workqueue.c:517
+#: ../libsvn_wc/workqueue.c:513
#, c-format
-msgid ""
-"Can't install '%s' from pristine store, because no checksum is recorded for "
-"this file"
+msgid "Can't install '%s' from pristine store, because no checksum is recorded for this file"
msgstr "文件 '%s' 没有校验和记录,因此ä¸èƒ½ä»ŽåŽŸå§‹å†…容仓库中安装"
-#: ../libsvn_wc/workqueue.c:1498
-#, c-format
+#: ../libsvn_wc/workqueue.c:1469
+#, fuzzy, c-format
msgid "Unrecognized work item in the queue"
-msgstr "队列中有无法识别的工作项"
+msgstr "“%s†关è”的队列中的项目无法识别"
+
+#: ../libsvn_wc/workqueue.c:1552
+#, c-format
+msgid "Failed to run the WC DB work queue associated with '%s', work item %d %s"
+msgstr ""
+
+#: ../svn-bench/help-cmd.c:49
+#, fuzzy
+msgid ""
+"usage: svn-bench <subcommand> [options] [args]\n"
+"Subversion benchmarking tool.\n"
+"Type 'svn-bench help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svn-bench --version' to see the program version and RA modules\n"
+" or 'svn-bench --version --quiet' to see just the version number.\n"
+"\n"
+"Most subcommands take file and/or directory arguments, recursing\n"
+"on the directories. If no arguments are supplied to such a\n"
+"command, it recurses on the current directory (inclusive) by default.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+"用法: svn <subcommand> [options] [args]\n"
+"Subversion 命令行客户端,版本 %s。\n"
+"使用“svn help <subcommand>†显示å­å‘½ä»¤çš„帮助信æ¯ã€‚\n"
+"使用“svn --versionâ€æŸ¥çœ‹ç¨‹åºçš„版本å·å’Œç‰ˆæœ¬åº“访问模å—,或者\n"
+"使用“svn --version --quietâ€åªæŸ¥çœ‹ç¨‹åºçš„版本å·ã€‚\n"
+"\n"
+"大多数的å­å‘½ä»¤å¯æŽ¥å—文件或目录å‚数,对目录进行递归处ç†ã€‚\n"
+"如果没有指定å‚数,默认对当å‰ç›®å½•(包å«å½“å‰ç›®å½•)递归处ç†ã€‚\n"
+"\n"
+"å¯ç”¨çš„å­å‘½ä»¤: \n"
+
+#: ../svn-bench/help-cmd.c:62 ../svn/help-cmd.c:66
+msgid ""
+"Subversion is a tool for version control.\n"
+"For additional information, see http://subversion.apache.org/\n"
+msgstr ""
+"Subversion 是版本控制工具。\n"
+"欲å–得详细资料,请å‚阅 http://subversion.apache.org/\n"
+
+#: ../svn-bench/help-cmd.c:66 ../svn/help-cmd.c:70 ../svnrdump/svnrdump.c:700
+#: ../svnsync/svnsync.c:1910
+msgid ""
+"The following repository access (RA) modules are available:\n"
+"\n"
+msgstr ""
+"å¯ä½¿ç”¨ä»¥ä¸‹çš„版本库访问模å—: \n"
+"\n"
+
+#: ../svn-bench/notify.c:107 ../svn/notify.c:246
+#, c-format
+msgid "Skipped missing target: '%s'\n"
+msgstr "跳过缺少的目标: “%sâ€\n"
+
+#: ../svn-bench/notify.c:114 ../svn/notify.c:253
+#, c-format
+msgid "Skipped target: '%s' -- copy-source is missing\n"
+msgstr "跳过目标: '%s' -- copy-source 丢失\n"
+
+#: ../svn-bench/notify.c:121 ../svn/notify.c:258
+#, c-format
+msgid "Skipped '%s'\n"
+msgstr "跳过“%sâ€\n"
+
+#: ../svn-bench/notify.c:128 ../svn/notify.c:265
+#, c-format
+msgid "Skipped '%s' -- An obstructing working copy was found\n"
+msgstr "忽略“%s†-- å‘现障ç¢å·¥ä½œå‰¯æœ¬\n"
+
+#: ../svn-bench/notify.c:135 ../svn/notify.c:271
+#, c-format
+msgid "Skipped '%s' -- Has no versioned parent\n"
+msgstr "已跳过 '%s' -- 没有已版本控制的父亲\n"
+
+#: ../svn-bench/notify.c:142 ../svn/notify.c:277
+#, c-format
+msgid "Skipped '%s' -- Access denied\n"
+msgstr "已跳过 '%s' -- æ‹’ç»è®¿é—®\n"
+
+#: ../svn-bench/notify.c:149 ../svn/notify.c:283
+#, c-format
+msgid "Skipped '%s' -- Node remains in conflict\n"
+msgstr "已跳过 '%s' -- 节点处于冲çªçŠ¶æ€\n"
+
+#: ../svn-bench/notify.c:233 ../svn/notify.c:354
+#, c-format
+msgid "Restored '%s'\n"
+msgstr "已还原“%sâ€\n"
+
+#: ../svn-bench/notify.c:239 ../svn/notify.c:359
+#, c-format
+msgid "Reverted '%s'\n"
+msgstr "å·²æ¢å¤â€œ%sâ€\n"
+
+#: ../svn-bench/notify.c:245 ../svn/notify.c:364
+#, c-format
+msgid "Failed to revert '%s' -- try updating instead.\n"
+msgstr "无法æ¢å¤â€œ%sâ€-- 请改用更新试试。\n"
+
+#: ../svn-bench/notify.c:253 ../svn/notify.c:371
+#, c-format
+msgid "Resolved conflicted state of '%s'\n"
+msgstr "“%sâ€çš„冲çªçŠ¶æ€å·²è§£å†³\n"
+
+#: ../svn-bench/notify.c:344 ../svn-bench/notify.c:384 ../svn/notify.c:461
+#: ../svn/notify.c:498
+#, c-format
+msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s"
+msgstr "> å·²åº”ç”¨å— ## -%lu,%lu +%lu,%lu ##,å移 %s"
+
+#: ../svn-bench/notify.c:361 ../svn-bench/notify.c:398 ../svn/notify.c:478
+#: ../svn/notify.c:512
+#, c-format
+msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s"
+msgstr "> å·²åº”ç”¨å— @@ -%lu,%lu +%lu,%lu @@ å移 %s"
+
+#: ../svn-bench/notify.c:419 ../svn/notify.c:530
+#, c-format
+msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %lu (%s)\n"
+msgstr "> å·²åº”ç”¨å— ## -%lu,%lu +%lu,%lu ## 模糊 %lu (%s)\n"
+
+#: ../svn-bench/notify.c:429 ../svn/notify.c:540
+#, c-format
+msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %lu\n"
+msgstr "> å·²åº”ç”¨å— @@ -%lu,%lu +%lu,%lu @@ 模糊 %lu\n"
+
+#: ../svn-bench/notify.c:447 ../svn/notify.c:556
+#, c-format
+msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n"
+msgstr "> 已拒ç»å— ## -%lu,%lu +%lu,%lu ## (%s)\n"
+
+#: ../svn-bench/notify.c:456 ../svn/notify.c:565
+#, c-format
+msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n"
+msgstr "> 已拒ç»çš„å— @@ -%lu,%lu +%lu,%lu @@\n"
+
+#: ../svn-bench/notify.c:470 ../svn/notify.c:577
+#, c-format
+msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n"
+msgstr "> å— ## -%lu,%lu +%lu,%lu ## å·²ç»åº”用 (%s)\n"
+
+#: ../svn-bench/notify.c:480 ../svn/notify.c:587
+#, c-format
+msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n"
+msgstr "> å— @@ -%lu,%lu +%lu,%lu @@ å·²ç»åº”用\n"
+
+#: ../svn-bench/notify.c:542 ../svn/notify.c:644
+#, c-format
+msgid ""
+"\n"
+"Fetching external item into '%s':\n"
+msgstr ""
+"\n"
+"正在å–得外部项目至 '%s':\n"
+
+#: ../svn-bench/notify.c:568 ../svn/notify.c:668
+#, c-format
+msgid "Error handling externals definition for '%s':"
+msgstr "处ç†å¤–部引用“%sâ€æ—¶å‡ºé”™ï¼š"
+
+#: ../svn-bench/notify.c:581 ../svn/notify.c:681
+#, c-format
+msgid "Updating '%s':\n"
+msgstr "正在å‡çº§ '%s':\n"
+
+#: ../svn-bench/notify.c:595 ../svn/notify.c:694
+#, c-format
+msgid "Exported external at revision %ld.\n"
+msgstr "已导出版本 %ld 的外部项目。\n"
+
+#: ../svn-bench/notify.c:596 ../svn/notify.c:695
+#, c-format
+msgid "Exported revision %ld.\n"
+msgstr "已导出版本 %ld。\n"
+
+#: ../svn-bench/notify.c:604 ../svn/notify.c:702
+#, c-format
+msgid "Checked out external at revision %ld.\n"
+msgstr "å–出版本 %ld 的外部项目。\n"
+
+#: ../svn-bench/notify.c:605 ../svn/notify.c:703
+#, c-format
+msgid "Checked out revision %ld.\n"
+msgstr "å–出版本 %ld。\n"
+
+#: ../svn-bench/notify.c:616 ../svn/notify.c:713
+#, c-format
+msgid "Updated external to revision %ld.\n"
+msgstr "更新外部项目至版本 %ld。\n"
+
+#: ../svn-bench/notify.c:617 ../svn/notify.c:714
+#, c-format
+msgid "Updated to revision %ld.\n"
+msgstr "更新到版本 %ld。\n"
+
+#: ../svn-bench/notify.c:625 ../svn/notify.c:721
+#, c-format
+msgid "External at revision %ld.\n"
+msgstr "外部项目版本 %ld。\n"
+
+#: ../svn-bench/notify.c:626 ../svn/notify.c:722
+#, c-format
+msgid "At revision %ld.\n"
+msgstr "版本 %ld。\n"
+
+#: ../svn-bench/notify.c:638 ../svn/notify.c:733
+#, c-format
+msgid "External export complete.\n"
+msgstr "完æˆå¤–部项目导出。\n"
+
+#: ../svn-bench/notify.c:639 ../svn/notify.c:734
+#, c-format
+msgid "Export complete.\n"
+msgstr "完æˆå¯¼å‡ºã€‚\n"
+
+#: ../svn-bench/notify.c:646 ../svn/notify.c:740
+#, c-format
+msgid "External checkout complete.\n"
+msgstr "完æˆå–出外部项目。\n"
+
+#: ../svn-bench/notify.c:647 ../svn/notify.c:741
+#, c-format
+msgid "Checkout complete.\n"
+msgstr "完æˆå–出。\n"
+
+#: ../svn-bench/notify.c:654 ../svn/notify.c:747
+#, c-format
+msgid "External update complete.\n"
+msgstr "完æˆå¤–部项目更新。\n"
+
+#: ../svn-bench/notify.c:655 ../svn/notify.c:748
+#, c-format
+msgid "Update complete.\n"
+msgstr "完æˆæ›´æ–°ã€‚\n"
+
+#: ../svn-bench/notify.c:671 ../svn/notify.c:762
+#, c-format
+msgid ""
+"\n"
+"Performing status on external item at '%s':\n"
+msgstr ""
+"\n"
+"对外部项目“%sâ€è¿›è¡ŒçŠ¶æ€æ£€æŸ¥:\n"
+
+#: ../svn-bench/notify.c:679 ../svn/notify.c:775
+#, c-format
+msgid "Status against revision: %6ld\n"
+msgstr "版本 %6ld 的状æ€\n"
+
+#: ../svn-bench/notify.c:688 ../svn/notify.c:783
+#, c-format
+msgid "Sending copy of %s\n"
+msgstr "正在å‘é€å‰¯æœ¬ %s\n"
+
+#: ../svn-bench/notify.c:689 ../svn/notify.c:784
+#, c-format
+msgid "Sending %s\n"
+msgstr "正在å‘é€ %s\n"
+
+#: ../svn-bench/notify.c:700 ../svn/notify.c:794
+#, c-format
+msgid "Adding copy of (bin) %s\n"
+msgstr "正在增加 (二进制) %s\n"
+
+#: ../svn-bench/notify.c:701 ../svn/notify.c:795
+#, c-format
+msgid "Adding (bin) %s\n"
+msgstr "正在增加 (二进制) %s\n"
+
+#: ../svn-bench/notify.c:709 ../svn/notify.c:802
+#, c-format
+msgid "Adding copy of %s\n"
+msgstr "正在增加副本 %s\n"
+
+#: ../svn-bench/notify.c:710 ../svn/notify.c:803
+#, c-format
+msgid "Adding %s\n"
+msgstr "正在增加 %s\n"
+
+#: ../svn-bench/notify.c:719 ../svn/notify.c:811
+#, c-format
+msgid "Deleting copy of %s\n"
+msgstr "正在删除副本 %s\n"
+
+#: ../svn-bench/notify.c:720 ../svn/notify.c:812
+#, c-format
+msgid "Deleting %s\n"
+msgstr "正在删除 %s\n"
+
+#: ../svn-bench/notify.c:729 ../svn/notify.c:820
+#, c-format
+msgid "Replacing copy of %s\n"
+msgstr "正在替æ¢å‰¯æœ¬ %s\n"
+
+#: ../svn-bench/notify.c:730 ../svn/notify.c:821
+#, c-format
+msgid "Replacing %s\n"
+msgstr "æ­£åœ¨æ›¿æ¢ %s\n"
+
+#: ../svn-bench/notify.c:740 ../svn/notify.c:830 ../svnsync/sync.c:327
+#, c-format
+msgid "Transmitting file data "
+msgstr "传输文件数æ®"
+
+#: ../svn-bench/notify.c:749 ../svn/notify.c:837 ../svnadmin/svnadmin.c:2116
+#, c-format
+msgid "'%s' locked by user '%s'.\n"
+msgstr "“%sâ€è¢«ç”¨æˆ·â€œ%sâ€é”定。\n"
+
+#: ../svn-bench/notify.c:755 ../svn/notify.c:842
+#, c-format
+msgid "'%s' unlocked.\n"
+msgstr "“%sâ€è§£é™¤é”定。\n"
+
+#: ../svn-bench/notify.c:782 ../svn/notify.c:866
+#, c-format
+msgid "--- Merging differences between repository URLs into '%s':\n"
+msgstr "--- 正在åˆå¹¶ç‰ˆæœ¬åº“ URL 之间的差异到 “%sâ€ï¼š\n"
+
+#: ../svn-bench/notify.c:787 ../svn/notify.c:871
+#, c-format
+msgid "--- Merging r%ld into '%s':\n"
+msgstr "--- 正在åˆå¹¶ r%ld 到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:791 ../svn/notify.c:875
+#, c-format
+msgid "--- Reverse-merging r%ld into '%s':\n"
+msgstr "--- 正在åå‘åˆå¹¶ r%ld 到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:795 ../svn/notify.c:879
+#, c-format
+msgid "--- Merging r%ld through r%ld into '%s':\n"
+msgstr "--- 正在åˆå¹¶ r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:801 ../svn/notify.c:885
+#, c-format
+msgid "--- Reverse-merging r%ld through r%ld into '%s':\n"
+msgstr "--- 正在åå‘åˆå¹¶ r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:813 ../svn/notify.c:895
+#, c-format
+msgid "--- Recording mergeinfo for merge between repository URLs into '%s':\n"
+msgstr "--- 记录版本库 URL 之间的åˆå¹¶ä¿¡æ¯åˆ°â€œ%sâ€ï¼š\n"
+
+#: ../svn-bench/notify.c:823 ../svn/notify.c:905
+#, c-format
+msgid "--- Recording mergeinfo for merge of r%ld into '%s':\n"
+msgstr "--- 记录åˆå¹¶ r%ld 到“%sâ€çš„ä¿¡æ¯:\n"
+
+#: ../svn-bench/notify.c:828 ../svn/notify.c:910
+#, c-format
+msgid "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"
+msgstr "--- 记录åå‘åˆå¹¶ r%ld 到“%sâ€çš„ä¿¡æ¯:\n"
+
+#: ../svn-bench/notify.c:833 ../svn/notify.c:915
+#, c-format
+msgid "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"
+msgstr "--- 记录åˆå¹¶ r%ld,ç»ç”± r%ld,到“%sâ€çš„ä¿¡æ¯:\n"
+
+#: ../svn-bench/notify.c:838 ../svn/notify.c:920
+#, c-format
+msgid "--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"
+msgstr "--- 记录åå‘åˆå¹¶ r%ld,ç»ç”± r%ld,到“%sâ€çš„ä¿¡æ¯:\n"
+
+#: ../svn-bench/notify.c:848 ../svn/notify.c:927
+#, c-format
+msgid "--- Eliding mergeinfo from '%s':\n"
+msgstr "--- 正在从 '%s' 删除åˆå¹¶ä¿¡æ¯:\n"
+
+#: ../svn-bench/notify.c:856 ../svn/notify.c:934
+#, c-format
+msgid "--- Merging differences between foreign repository URLs into '%s':\n"
+msgstr "--- 正在åˆå¹¶å¤–部版本库 URL 之间的差异到 “%sâ€ï¼š\n"
+
+#: ../svn-bench/notify.c:862 ../svn/notify.c:940
+#, c-format
+msgid "--- Merging (from foreign repository) r%ld into '%s':\n"
+msgstr "--- 正在åˆå¹¶(从外部版本库) r%ld 到 “%sâ€ï¼š\n"
+
+#: ../svn-bench/notify.c:867 ../svn/notify.c:945
+#, c-format
+msgid "--- Reverse-merging (from foreign repository) r%ld into '%s':\n"
+msgstr "--- 正在åå‘åˆå¹¶(从外部版本库) r%ld 到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:872 ../svn/notify.c:950
+#, c-format
+msgid "--- Merging (from foreign repository) r%ld through r%ld into '%s':\n"
+msgstr "--- 正在åˆå¹¶(从外部版本库) r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:878 ../svn/notify.c:956
+#, c-format
+msgid "--- Reverse-merging (from foreign repository) r%ld through r%ld into '%s':\n"
+msgstr "--- 正在åå‘åˆå¹¶(从外部版本库) r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
+
+#: ../svn-bench/notify.c:915 ../svn/notify.c:986
+#, c-format
+msgid "property '%s' set on '%s'\n"
+msgstr "设置属性 “%s†于 “%sâ€\n"
+
+#: ../svn-bench/notify.c:923 ../svn/notify.c:992
+#, c-format
+msgid "property '%s' deleted from '%s'.\n"
+msgstr "删除属性 “%s†于 “%sâ€ã€‚\n"
+
+#: ../svn-bench/notify.c:931 ../svn/notify.c:998
+#, c-format
+msgid "Attempting to delete nonexistent property '%s' on '%s'\n"
+msgstr "试图删除ä¸å­˜åœ¨çš„属性“%sâ€äºŽâ€œ%sâ€\n"
+
+#: ../svn-bench/notify.c:940 ../svn/notify.c:1005
+#, c-format
+msgid "property '%s' set on repository revision %ld\n"
+msgstr "设定属性 “%s†于版本库版本 %ld\n"
+
+#: ../svn-bench/notify.c:948 ../svn/notify.c:1011
+#, c-format
+msgid "property '%s' deleted from repository revision %ld\n"
+msgstr "删除属性 “%s†于版本库版本 %ld\n"
+
+#: ../svn-bench/notify.c:955 ../svn/notify.c:1016
+#, c-format
+msgid "Upgraded '%s'\n"
+msgstr "å·²å‡çº§çš„“%sâ€\n"
+
+#: ../svn-bench/notify.c:961 ../svn/notify.c:1020
+#, c-format
+msgid "Redirecting to URL '%s':\n"
+msgstr "正在é‡å®šå‘到 URL '%s':\n"
+
+#: ../svn-bench/null-export-cmd.c:334
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s bytes in files\n"
+"%15s properties\n"
+"%15s bytes in properties\n"
+msgstr ""
+
+#: ../svn-bench/null-info-cmd.c:273
+#, c-format
+msgid "Number of status notifications received: %d\n"
+msgstr ""
+
+#: ../svn-bench/null-info-cmd.c:283 ../svn/info-cmd.c:684
+msgid "Could not display info for all targets because some targets don't exist"
+msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡"
+
+#: ../svn-bench/null-list-cmd.c:153
+#, c-format
+msgid ""
+"%15s directories\n"
+"%15s files\n"
+"%15s locks\n"
+msgstr ""
+
+#: ../svn-bench/null-list-cmd.c:166 ../svn/list-cmd.c:422
+msgid "Could not list all targets because some targets don't exist"
+msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½åˆ—出全部目标"
+
+#: ../svn-bench/null-log-cmd.c:158 ../svn/log-cmd.c:751
+msgid "-c and -r are mutually exclusive"
+msgstr "-c 与 -r 是互斥的"
+
+#: ../svn-bench/null-log-cmd.c:190
+#, fuzzy, c-format
+msgid "Only relative paths can be specified after a URL for 'svn-bench log', but '%s' is not a relative path"
+msgstr "对于 'svn log',在 URL åŽåªèƒ½æŒ‡å®šç›¸å¯¹è·¯å¾„,但 '%s' ä¸æ˜¯ç›¸å¯¹è·¯å¾„"
+
+#: ../svn-bench/null-log-cmd.c:222
+#, c-format
+msgid ""
+"%15s revisions, %15s merged in %s merges\n"
+"%15s msg lines, %15s in merged revisions\n"
+"%15s changes, %15s in merged revisions\n"
+msgstr ""
+
+#: ../svn-bench/null-log-cmd.c:234
+#, c-format
+msgid ""
+"%15s revisions\n"
+"%15s msg lines\n"
+"%15s changes\n"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:85 ../svn-bench/svn-bench.c:86 ../svn/svn.c:160
+#: ../svn/svn.c:161 ../svnadmin/svnadmin.c:227 ../svnadmin/svnadmin.c:230
+#: ../svndumpfilter/svndumpfilter.c:1048 ../svndumpfilter/svndumpfilter.c:1051
+#: ../svnfsfs/svnfsfs.c:129 ../svnfsfs/svnfsfs.c:132 ../svnlook/svnlook.c:115
+#: ../svnlook/svnlook.c:127 ../svnsync/svnsync.c:275 ../svnsync/svnsync.c:277
+msgid "show help on a subcommand"
+msgstr "显示å­å‘½ä»¤å¸®åŠ©ä¿¡æ¯"
+
+#: ../svn-bench/svn-bench.c:87 ../svn/svn.c:163
+msgid "print nothing, or only summary information"
+msgstr "ä¸æ‰“å°ä¿¡æ¯ï¼Œæˆ–åªæ‰“å°æ¦‚è¦ä¿¡æ¯"
+
+#: ../svn-bench/svn-bench.c:88 ../svn/svn.c:164
+msgid "descend recursively, same as --depth=infinity"
+msgstr "å‘下递归,与 --depth=infinity 相åŒ"
+
+#: ../svn-bench/svn-bench.c:89 ../svn/svn.c:165
+msgid "obsolete; try --depth=files or --depth=immediates"
+msgstr "过时;å°è¯• --depth=files 或 --depth=immediates"
+
+#: ../svn-bench/svn-bench.c:91 ../svn/svn.c:167
+msgid ""
+"the change made by revision ARG (like -r ARG-1:ARG)\n"
+" If ARG is negative this is like -r ARG:ARG-1\n"
+" If ARG is of the form ARG1-ARG2 then this is like\n"
+" ARG1:ARG2, where ARG1 is inclusive"
+msgstr ""
+"版本 ARG (å¦‚åŒ -r ARG-1:ARG) åšçš„修改\n"
+" 如果 ARG 为负数则等价于 -r ARG:ARG-1 如果 ARG çš„æ ¼å¼æ˜¯ ARG1-ARG2,那么它等价于\n"
+" ARG1:ARG2ï¼ŒåŒ…å« ARG1"
+
+#: ../svn-bench/svn-bench.c:99 ../svn/svn.c:175
+msgid ""
+"ARG (some commands also take ARG1:ARG2 range)\n"
+" A revision argument can be one of:\n"
+" NUMBER revision number\n"
+" '{' DATE '}' revision at start of the date\n"
+" 'HEAD' latest in repository\n"
+" 'BASE' base rev of item's working copy\n"
+" 'COMMITTED' last commit at or before BASE\n"
+" 'PREV' revision just before COMMITTED"
+msgstr ""
+"ARG (一些命令也接å—ARG1:ARG2范围)\n"
+" 版本å‚æ•°å¯ä»¥æ˜¯å¦‚下之一: \n"
+" NUMBER 版本å·\n"
+" '{' DATE '}' 在指定时间以åŽçš„版本\n"
+" 'HEAD' 版本库中的最新版本\n"
+" 'BASE' 工作副本的基线版本\n"
+" 'COMMITTED' 最åŽæ交或基线之å‰\n"
+" 'PREV' COMMITTEDçš„å‰ä¸€ç‰ˆæœ¬"
+
+#: ../svn-bench/svn-bench.c:114 ../svn/svn.c:195 ../svnadmin/svnadmin.c:233
+#: ../svndumpfilter/svndumpfilter.c:1054 ../svnfsfs/svnfsfs.c:135
+#: ../svnlook/svnlook.c:172 ../svnrdump/svnrdump.c:157
+#: ../svnserve/svnserve.c:376 ../svnsync/svnsync.c:273
+#: ../svnversion/svnversion.c:144
+msgid "show program version information"
+msgstr "显示程åºç‰ˆæœ¬ä¿¡æ¯"
+
+#: ../svn-bench/svn-bench.c:115 ../svn/svn.c:196
+msgid "print extra information"
+msgstr "打å°é™„加信æ¯"
+
+#: ../svn-bench/svn-bench.c:116 ../svn/svn.c:198 ../svnrdump/svnrdump.c:141
+msgid "specify a username ARG"
+msgstr "指定用户å称 ARG"
+
+#: ../svn-bench/svn-bench.c:117 ../svnrdump/svnrdump.c:143
+msgid "specify a password ARG"
+msgstr "æŒ‡å®šå¯†ç  ARG"
+
+#: ../svn-bench/svn-bench.c:119 ../svn/svn.c:224
+msgid "pass contents of file ARG as additional args"
+msgstr "传递文件 ARG 内容为附件å‚æ•°"
+
+#: ../svn-bench/svn-bench.c:121 ../svn/svn.c:226
+msgid ""
+"limit operation by depth ARG ('empty', 'files',\n"
+" 'immediates', or 'infinity')"
+msgstr ""
+"é™åˆ¶æ“作深度是 ARG ('empty', 'files',\n"
+" 'immediates', 或 'infinity')"
+
+#: ../svn-bench/svn-bench.c:124 ../svn/svn.c:234
+msgid "use strict semantics"
+msgstr "使用严格的语法"
+
+#: ../svn-bench/svn-bench.c:126 ../svn/svn.c:236
+msgid "do not cross copies while traversing history"
+msgstr "查看历å²ä¸è¦è·¨è¶Šä¸åŒçš„副本"
+
+#: ../svn-bench/svn-bench.c:128 ../svn/svn.c:242 ../svnrdump/svnrdump.c:153
+#: ../svnsync/svnsync.c:197
+msgid "do not cache authentication tokens"
+msgstr "ä¸è¦ç¼“存用户认è¯ä»¤ç‰Œ"
+
+#: ../svn-bench/svn-bench.c:130 ../svn/svn.c:244 ../svnrdump/svnrdump.c:167
+#: ../svnsync/svnsync.c:207
+msgid "deprecated; same as --trust-unknown-ca"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:132 ../svn/svn.c:246 ../svnrdump/svnrdump.c:169
+#: ../svnsync/svnsync.c:209
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates from unknown certificate authorities"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:136 ../svn/svn.c:250 ../svnrdump/svnrdump.c:173
+#: ../svnsync/svnsync.c:213
+#, fuzzy
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates even if the server hostname does not\n"
+" match the certificate's common name attribute"
+msgstr "ä¸æ示的接å—未知的è¯ä¹¦é¢å‘机构å‘行的 SSL æœåŠ¡å™¨è¯ä¹¦(åªç”¨äºŽé€‰é¡¹ “--non-interactiveâ€)"
+
+#: ../svn-bench/svn-bench.c:142 ../svn/svn.c:256 ../svnrdump/svnrdump.c:179
+#: ../svnsync/svnsync.c:219
+#, fuzzy
+msgid ""
+"with --non-interactive, accept expired SSL server\n"
+" certificates"
+msgstr "如果版本库被其他进程å ç”¨ï¼Œç­‰å¾…而ä¸ç›´æŽ¥é€€å‡º"
+
+#: ../svn-bench/svn-bench.c:146 ../svn/svn.c:260 ../svnrdump/svnrdump.c:183
+#: ../svnsync/svnsync.c:223
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates from the future"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:150 ../svn/svn.c:264 ../svnrdump/svnrdump.c:187
+#: ../svnsync/svnsync.c:227
+msgid ""
+"with --non-interactive, accept SSL server\n"
+" certificates with failures other than the above"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:154
+msgid "do no interactive prompting"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:156 ../svn/svn.c:291 ../svnadmin/svnadmin.c:280
+#: ../svnrdump/svnrdump.c:139 ../svnsync/svnsync.c:239
+msgid "read user configuration files from directory ARG"
+msgstr "从目录 ARG 读å–用户é…置文件"
+
+#: ../svn-bench/svn-bench.c:158 ../svn/svn.c:293 ../svnrdump/svnrdump.c:159
+#: ../svnsync/svnsync.c:241
+msgid ""
+"set user configuration option in the format:\n"
+" FILE:SECTION:OPTION=[VALUE]\n"
+" For example:\n"
+" servers:global:http-library=serf"
+msgstr ""
+"以下属格å¼è®¾ç½®ç”¨æˆ·é…置选项:\n"
+" FILE:SECTION:OPTION=[VALUE]\n"
+" 例如:\n"
+" servers:global:http-library=serf"
+
+#: ../svn-bench/svn-bench.c:165 ../svn/svn.c:310
+msgid "maximum number of log entries"
+msgstr "日值项最大值"
+
+#: ../svn-bench/svn-bench.c:167 ../svn/svn.c:319
+msgid "retrieve all revision properties"
+msgstr "获å–所有版本属性"
+
+#: ../svn-bench/svn-bench.c:169 ../svn/svn.c:321
+msgid "retrieve no revision properties"
+msgstr "没有找回版本属性"
+
+#: ../svn-bench/svn-bench.c:171 ../svn/svn.c:323
+msgid ""
+"set revision property ARG in new revision\n"
+" using the name[=value] format"
+msgstr ""
+"在新版本设置版本属性 ARG\n"
+" ä½¿ç”¨æ ¼å¼ name[=value]"
+
+#: ../svn-bench/svn-bench.c:175 ../svn/svn.c:328
+msgid ""
+"use/display additional information from merge\n"
+" history"
+msgstr "从åˆå¹¶åŽ†å²ä½¿ç”¨/显示é¢å¤–ä¿¡æ¯"
+
+#: ../svn-bench/svn-bench.c:217 ../svn/svn.c:693
+msgid ""
+"Describe the usage of this program or its subcommands.\n"
+"usage: help [SUBCOMMAND...]\n"
+msgstr ""
+"æ述本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
+"用法: help [å­å‘½ä»¤...]\n"
+
+#: ../svn-bench/svn-bench.c:223
+msgid ""
+"Create an unversioned copy of a tree.\n"
+"usage: null-export [-r REV] URL[@PEGREV]\n"
+"\n"
+" Exports a clean directory tree from the repository specified by\n"
+" URL, at revision REV if it is given, otherwise at HEAD.\n"
+"\n"
+" If specified, PEGREV determines in which revision the target is first\n"
+" looked up.\n"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:234
+#, fuzzy
+msgid ""
+"List directory entries in the repository.\n"
+"usage: null-list [TARGET[@REV]...]\n"
+"\n"
+" List each TARGET file and the contents of each TARGET directory as\n"
+" they exist in the repository. If TARGET is a working copy path, the\n"
+" corresponding repository URL will be used. If specified, REV determines\n"
+" in which revision the target is first looked up.\n"
+"\n"
+" The default TARGET is '.', meaning the repository URL of the current\n"
+" working directory.\n"
+"\n"
+" With --verbose, the following fields will be fetched for each item:\n"
+"\n"
+" Revision number of the last commit\n"
+" Author of the last commit\n"
+" If locked, the letter 'O'. (Use 'svn info URL' to see details)\n"
+" Size (in bytes)\n"
+" Date and time of the last commit\n"
+msgstr ""
+"列出版本库中的目录内容。\n"
+"用法: list [TARGET[@REV]...]\n"
+"\n"
+" 显示版本库中文件和å­ç›®å½•åˆ—表。如果 TARGET 是工作副本路径,那么æ“作对应的\n"
+" 版本库URL指定的TARGET。REV指定从在哪个版本查找TARGET。\n"
+"\n"
+" TARGET默认是“.â€ï¼Œè¡¨ç¤ºå½“å‰å·¥ä½œç›®å½•å¯¹åº”的版本库URL。\n"
+"\n"
+" 使用 --verbose 时,æ¯ä¸ªæ¡ç›®ä¼šæ˜¾ç¤ºä»¥ä¸‹é¢å¤–ä¿¡æ¯: \n"
+"\n"
+" 最åŽä¸€æ¬¡æ交的版本å·ç \n"
+" 最åŽä¸€æ¬¡æ交的作者\n"
+" 如果被é”定,显示字æ¯â€œOâ€ã€‚(使用“svn info URLâ€æŸ¥çœ‹è¯¦ç»†ä¿¡æ¯)\n"
+" å¤§å° (以字节为å•ä½)\n"
+" 最åŽä¸€æ¬¡æ交的日期与时间\n"
+
+#: ../svn-bench/svn-bench.c:255
+msgid ""
+"Fetch the log messages for a set of revision(s) and/or path(s).\n"
+"usage: 1. null-log [PATH][@REV]\n"
+" 2. null-log URL[@REV] [PATH...]\n"
+"\n"
+" 1. Fetch the log messages for the URL corresponding to PATH\n"
+" (default: '.'). If specified, REV is the revision in which the\n"
+" URL is first looked up, and the default revision range is REV:1.\n"
+" If REV is not specified, the default revision range is BASE:1,\n"
+" since the URL might not exist in the HEAD revision.\n"
+"\n"
+" 2. Fetch the log messages for the PATHs (default: '.') under URL.\n"
+" If specified, REV is the revision in which the URL is first\n"
+" looked up, and the default revision range is REV:1; otherwise,\n"
+" the URL is looked up in HEAD, and the default revision range is\n"
+" HEAD:1.\n"
+"\n"
+" Multiple '-c' or '-r' options may be specified (but not a\n"
+" combination of '-c' and '-r' options), and mixing of forward and\n"
+" reverse ranges is allowed.\n"
+"\n"
+" With -v, also print all affected paths with each log message.\n"
+" With -q, don't print the log message body itself (note that this is\n"
+" compatible with -v).\n"
+"\n"
+" Each log message is printed just once, even if more than one of the\n"
+" affected paths for that revision were explicitly requested. Logs\n"
+" follow copy history by default. Use --stop-on-copy to disable this\n"
+" behavior, which can be useful for determining branchpoints.\n"
+msgstr ""
+
+#: ../svn-bench/svn-bench.c:286 ../svn/svn.c:835
+msgid "retrieve revision property ARG"
+msgstr "获å–版本属性 ARG"
+
+#: ../svn-bench/svn-bench.c:287 ../svn/svn.c:836
+msgid "the change made in revision ARG"
+msgstr "版本 ARG 引起的改å˜"
+
+#: ../svn-bench/svn-bench.c:290
+#, fuzzy
+msgid ""
+"Display information about a local or remote item.\n"
+"usage: null-info [TARGET[@REV]...]\n"
+"\n"
+" Print information about each TARGET (default: '.').\n"
+" TARGET may be either a working-copy path or URL. If specified, REV\n"
+" determines in which revision the target is first looked up.\n"
+msgstr ""
+"显示本地或远程æ¡ç›®çš„ä¿¡æ¯ã€‚\n"
+"用法: info [TARGET[@REV]...]\n"
+"\n"
+" 显示æ¯ä¸ª TARGET çš„ä¿¡æ¯ (默认: “.â€)。\n"
+" TARGET å¯ä»¥æ˜¯å·¥ä½œå‰¯æœ¬ä¸­çš„路径或版本库中的 URL。REV 指定从哪个\n"
+" 版本开始查找目标。\n"
+
+#: ../svn-bench/svn-bench.c:338 ../svn/svn.c:1764 ../svnadmin/svnadmin.c:97
+#: ../svnfsfs/svnfsfs.c:79 ../svnlook/svnlook.c:387 ../svnrdump/svnrdump.c:65
+#: ../svnsync/svnsync.c:332
+msgid "Caught signal"
+msgstr "æ•æ‰åˆ°ä¿¡å·"
+
+#: ../svn-bench/svn-bench.c:430 ../svn/svn.c:1910 ../svnlook/svnlook.c:2571
+msgid "Non-numeric limit argument given"
+msgstr "--limit å–值ä¸æ˜¯æ•°å­—"
+
+#: ../svn-bench/svn-bench.c:435 ../svn/svn.c:1915 ../svnlook/svnlook.c:2576
+msgid "Argument to --limit must be positive"
+msgstr "--limit å–值必须为正"
+
+#: ../svn-bench/svn-bench.c:471 ../svn/svn.c:1965
+#, c-format
+msgid "Negative number in range (%s) not supported with -c"
+msgstr "-c 选项ä¸æ”¯æŒè´Ÿæ•°åœ¨èŒƒå›´ (%s) 中"
+
+#: ../svn-bench/svn-bench.c:483 ../svn/svn.c:1977
+#, c-format
+msgid "Non-numeric change argument (%s) given to -c"
+msgstr "-c 选项的å–值(%s)ä¸æ˜¯æ•°å­—"
+
+#: ../svn-bench/svn-bench.c:490 ../svn/svn.c:1984
+msgid "There is no change 0"
+msgstr "没有版本 0"
+
+#: ../svn-bench/svn-bench.c:532 ../svn/svn.c:2025 ../svnadmin/svnadmin.c:2488
+#: ../svnfsfs/svnfsfs.c:331 ../svnrdump/svnrdump.c:962
+#: ../svnsync/svnsync.c:2107
+#, c-format
+msgid "Syntax error in revision argument '%s'"
+msgstr "版本å‚数“%sâ€ä¸­æœ‰è¯­æ³•é”™è¯¯"
+
+#: ../svn-bench/svn-bench.c:571 ../svn/svn.c:2088 ../svn/svn.c:2105
+#, c-format
+msgid "Error converting depth from locale to UTF-8"
+msgstr "将深度从本地编ç è½¬æ¢åˆ° UTF8 失败"
+
+#: ../svn-bench/svn-bench.c:578 ../svn/svn.c:2095
+#, c-format
+msgid "'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
+msgstr "“%s†ä¸æ˜¯æœ‰æ•ˆçš„深度;å°è¯• “emptyâ€ï¼Œâ€œfilesâ€ï¼Œâ€œimmediatesâ€ï¼Œæˆ– “infinityâ€"
-#: ../libsvn_wc/workqueue.c:1578
+#: ../svn-bench/svn-bench.c:708 ../svn/svn.c:2452
+#: ../svndumpfilter/svndumpfilter.c:1527 ../svnlook/svnlook.c:2675
#, c-format
+msgid "Subcommand argument required\n"
+msgstr "å¿…é¡»æä¾›å­å‘½ä»¤å‚æ•°\n"
+
+#: ../svn-bench/svn-bench.c:726 ../svn/svn.c:2470 ../svnadmin/svnadmin.c:2688
+#: ../svndumpfilter/svndumpfilter.c:1545 ../svnfsfs/svnfsfs.c:403
+#: ../svnlook/svnlook.c:2692 ../svnrdump/svnrdump.c:1078
+#, fuzzy, c-format
+msgid "Unknown subcommand: '%s'\n"
+msgstr "未知命令: “%sâ€\n"
+
+#: ../svn-bench/svn-bench.c:760
+#, fuzzy, c-format
msgid ""
-"Failed to run the WC DB work queue associated with '%s', work item %d %s"
-msgstr "è¿è¡Œä¸Žâ€œ%sâ€å…³è”的工作副本数æ®åº“工作队列失败,工作项 %d %s"
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svn-bench help %s' for usage.\n"
+msgstr ""
+"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
+"使用“svnsync help %sâ€å¾—到用法。\n"
+
+#: ../svn-bench/svn-bench.c:774 ../svn/svn.c:2530
+msgid "Multiple revision arguments encountered; can't specify -c twice, or both -c and -r"
+msgstr "é‡åˆ°äº†å¤šä¸ªç‰ˆæœ¬å‚æ•°ï¼›ä¸èƒ½æŒ‡å®š -c 两次或者åŒæ—¶ä½¿ç”¨ -c å’Œ -r"
+
+#: ../svn-bench/svn-bench.c:785 ../svn/svn.c:2550
+msgid "--with-all-revprops and --with-no-revprops are mutually exclusive"
+msgstr "--with-all-revprops 与 --with-no-revprops 是互斥的"
+
+#: ../svn-bench/svn-bench.c:794 ../svn/svn.c:2559
+msgid "--with-revprop and --with-no-revprops are mutually exclusive"
+msgstr "--with-revprop 与 --with-no-revprops 是互斥的"
+
+#: ../svn-bench/svn-bench.c:803 ../svn/svn.c:2598 ../svnmucc/svnmucc.c:669
+#: ../svnrdump/svnrdump.c:1136 ../svnsync/svnsync.c:2213
+#, fuzzy
+msgid "--trust-unknown-ca requires --non-interactive"
+msgstr "--trust-server-cert éœ€è¦ --non-interactive"
+
+#: ../svn-bench/svn-bench.c:807 ../svn/svn.c:2602 ../svnmucc/svnmucc.c:673
+#: ../svnrdump/svnrdump.c:1140 ../svnsync/svnsync.c:2217
+#, fuzzy
+msgid "--trust-cn-mismatch requires --non-interactive"
+msgstr "--trust-server-cert éœ€è¦ --non-interactive"
+
+#: ../svn-bench/svn-bench.c:811 ../svn/svn.c:2606 ../svnmucc/svnmucc.c:677
+#: ../svnrdump/svnrdump.c:1144 ../svnsync/svnsync.c:2221
+#, fuzzy
+msgid "--trust-expired requires --non-interactive"
+msgstr "--trust-server-cert éœ€è¦ --non-interactive"
+
+#: ../svn-bench/svn-bench.c:815 ../svn/svn.c:2610 ../svnmucc/svnmucc.c:681
+#: ../svnrdump/svnrdump.c:1148 ../svnsync/svnsync.c:2225
+#, fuzzy
+msgid "--trust-not-yet-valid requires --non-interactive"
+msgstr "--trust-server-cert éœ€è¦ --non-interactive"
+
+#: ../svn-bench/svn-bench.c:819 ../svn/svn.c:2614 ../svnmucc/svnmucc.c:685
+#: ../svnrdump/svnrdump.c:1152 ../svnsync/svnsync.c:2229
+#, fuzzy
+msgid "--trust-other-failure requires --non-interactive"
+msgstr "--trust-server-cert éœ€è¦ --non-interactive"
+
+#: ../svn-bench/svn-bench.c:963
+#, fuzzy, c-format
+msgid "Try 'svn-bench help %s' for more information"
+msgstr "请使用 “svn help†以得到更多信æ¯"
+
+#: ../svn-bench/svn-bench.c:969 ../svn/svn.c:3027
+msgid "Please see the 'svn upgrade' command"
+msgstr "请å‚阅命令 'svn upgrade'"
+
+#: ../svn-bench/svn-bench.c:977 ../svn/svn.c:3049
+msgid "Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)"
+msgstr "è¿è¡Œâ€œsvn cleanupâ€åˆ é™¤é” (è¿è¡Œâ€œsvn help cleanupâ€ä»¥å¾—到详细信æ¯)"
#: ../svn/add-cmd.c:101
msgid "Could not add all targets because some targets don't exist"
@@ -8195,211 +9804,403 @@ msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½å¢žåŠ å…¨éƒ¨ç›®æ ‡"
msgid "Could not add all targets because some targets are already versioned"
msgstr "因为一些目标已ç»ç‰ˆæœ¬åŒ–,所以ä¸èƒ½å¢žåŠ å…¨éƒ¨ç›®æ ‡"
-#: ../svn/blame-cmd.c:303 ../svn/list-cmd.c:300
+#: ../svn/auth-cmd.c:69
+#, c-format
+msgid "Automatic certificate validity check failed because:\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:74
+#, fuzzy, c-format
+msgid " The certificate is not yet valid.\n"
+msgstr " - è¯ä¹¦æœªç”Ÿæ•ˆã€‚\n"
+
+#: ../svn/auth-cmd.c:78
+#, fuzzy, c-format
+msgid " The certificate has expired.\n"
+msgstr " - è¯ä¹¦å·²è¿‡æœŸã€‚\n"
+
+#: ../svn/auth-cmd.c:82
+#, fuzzy, c-format
+msgid " The certificate's Common Name (hostname) does not match the remote hostname.\n"
+msgstr " - è¯ä¹¦çš„主机å称ä¸åŒ¹é…。\n"
+
+#: ../svn/auth-cmd.c:87
+#, fuzzy, c-format
+msgid " The certificate issuer is unknown.\n"
+msgstr " - è¯ä¹¦å‘生未知错误。\n"
+
+#: ../svn/auth-cmd.c:91
+#, c-format
+msgid " Unknown verification failure.\n"
+msgstr " 未知的验è¯å¤±è´¥ã€‚\n"
+
+#: ../svn/auth-cmd.c:182
+#, fuzzy, c-format
+msgid "Credential kind: %s\n"
+msgstr "没有ä¿å­˜å‡­è¯æ•°æ®"
+
+#: ../svn/auth-cmd.c:202
+#, fuzzy, c-format
+msgid "Password: %s\n"
+msgstr "“%sâ€çš„密ç : "
+
+#: ../svn/auth-cmd.c:204
+#, c-format
+msgid "Password: [not shown]\n"
+msgstr "密ç : [未显示]\n"
+
+#: ../svn/auth-cmd.c:210
+#, fuzzy, c-format
+msgid "Passphrase: %s\n"
+msgstr "“%sâ€çš„密ç : "
+
+#: ../svn/auth-cmd.c:213
+#, fuzzy, c-format
+msgid "Passphrase: [not shown]\n"
+msgstr "“%sâ€çš„密ç : "
+
+#: ../svn/auth-cmd.c:216
+#, fuzzy, c-format
+msgid "Password cache: %s\n"
+msgstr "“%sâ€çš„密ç : "
+
+#: ../svn/auth-cmd.c:219
+#, fuzzy, c-format
+msgid "Username: %s\n"
+msgstr "用户å: "
+
+#: ../svn/auth-cmd.c:223
+#, fuzzy, c-format
+msgid "Hostname: %s\n"
+msgstr "å称: %s\n"
+
+#: ../svn/auth-cmd.c:225
+#, fuzzy, c-format
+msgid "Valid from: %s\n"
+msgstr "移自: %s\n"
+
+#: ../svn/auth-cmd.c:228
+#, fuzzy, c-format
+msgid "Valid until: %s\n"
+msgstr ""
+"\n"
+"有效选项: \n"
+
+#: ../svn/auth-cmd.c:231
+#, fuzzy, c-format
+msgid "Issuer: %s\n"
+msgstr "所有者: %s\n"
+
+#: ../svn/auth-cmd.c:233
+#, fuzzy, c-format
+msgid "Fingerprint: %s\n"
+msgstr "修改列表: %s\n"
+
+#: ../svn/auth-cmd.c:283
+#, c-format
+msgid "Deleting %s credential for realm '%s'\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:330
+#, c-format
+msgid "Credentials cache in '%s' is empty\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:334 ../svn/auth-cmd.c:357
+#, c-format
+msgid "Credentials cache in '%s' contains no matching credentials"
+msgstr ""
+
+#: ../svn/auth-cmd.c:342
+#, c-format
+msgid "Credentials cache in '%s' contains %d credentials\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:346
+#, c-format
+msgid "Credentials cache in '%s' contains %d matching credentials\n"
+msgstr ""
+
+#: ../svn/auth-cmd.c:361
+#, c-format
+msgid "Deleted %d matching credentials from '%s'\n"
+msgstr ""
+
+#: ../svn/blame-cmd.c:303 ../svn/list-cmd.c:301
msgid "'verbose' option invalid in XML mode"
msgstr "在XML模å¼ä¸­â€œverboseâ€é€‰é¡¹æ— æ•ˆ"
-#: ../svn/blame-cmd.c:315 ../svn/info-cmd.c:613 ../svn/list-cmd.c:312
-#: ../svn/status-cmd.c:302
+#: ../svn/blame-cmd.c:315 ../svn/info-cmd.c:615 ../svn/list-cmd.c:313
+#: ../svn/status-cmd.c:308
msgid "'incremental' option only valid in XML mode"
msgstr "åªæœ‰åœ¨XML模å¼â€œincrementalâ€é€‰é¡¹æ‰æœ‰æ•ˆ"
#: ../svn/blame-cmd.c:378
-#, c-format
+#, fuzzy, c-format
msgid "Skipping binary file (use --force to treat as text): '%s'\n"
-msgstr "略过二进制文件(使用 --force 将之视为纯文本):“%sâ€\n"
+msgstr "略过二进制文件: “%sâ€\n"
#: ../svn/blame-cmd.c:415
msgid "Could not perform blame on all targets because some targets don't exist"
msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½è¿½æº¯å…¨éƒ¨ç›®æ ‡"
-#: ../svn/cat-cmd.c:102
+#: ../svn/cat-cmd.c:103
msgid "Could not cat all targets because some targets don't exist"
msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡"
-#: ../svn/cat-cmd.c:106
+#: ../svn/cat-cmd.c:107
msgid "Could not cat all targets because some targets are not versioned"
msgstr "因为一些目标没有版本化,所以ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡"
-#: ../svn/cat-cmd.c:110
+#: ../svn/cat-cmd.c:111
msgid "Could not cat all targets because some targets are directories"
msgstr "因为一些目标是目录,所以ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡"
#: ../svn/changelist-cmd.c:135
-msgid ""
-"Could not set changelists on all targets because some targets don't exist"
+msgid "Could not set changelists on all targets because some targets don't exist"
msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½å¯¹å…¨éƒ¨ç›®æ ‡è®¾ç½®ä¿®æ”¹åˆ—表"
#: ../svn/changelist-cmd.c:140
-msgid ""
-"Could not set changelists on all targets because some targets are not "
-"versioned"
+msgid "Could not set changelists on all targets because some targets are not versioned"
msgstr "因为一些目标没有版本化,所以ä¸èƒ½å¯¹å…¨éƒ¨ç›®æ ‡è®¾ç½®ä¿®æ”¹åˆ—表"
-#: ../svn/checkout-cmd.c:133 ../svn/switch-cmd.c:138
+#: ../svn/checkout-cmd.c:140 ../svn/switch-cmd.c:138
#, c-format
msgid "'%s' does not appear to be a URL"
msgstr "“%sâ€ä¸åƒæ˜¯URL"
-#: ../svn/cl-conflicts.c:80
+#: ../svn/checkout-cmd.c:181 ../svn/export-cmd.c:130 ../svn/list-cmd.c:413
+#: ../svn/switch-cmd.c:188 ../svn/update-cmd.c:177
+msgid "Failure occurred processing one or more externals definitions"
+msgstr "处ç†ä¸€ä¸ªæˆ–更多的外部定义失败"
+
+#: ../svn/cl-conflicts.c:82
msgid "local file edit"
msgstr "本地文件编辑"
-#: ../svn/cl-conflicts.c:82
+#: ../svn/cl-conflicts.c:84
+#, fuzzy
msgid "local file obstruction"
-msgstr "本地文件障ç¢"
+msgstr "阻塞"
-#: ../svn/cl-conflicts.c:84
+#: ../svn/cl-conflicts.c:86
msgid "local file delete"
msgstr "本地文件删除"
-#: ../svn/cl-conflicts.c:86
+#: ../svn/cl-conflicts.c:89
+#, fuzzy
+msgid "local file missing or deleted or moved away"
+msgstr "本地文件移走"
+
+#: ../svn/cl-conflicts.c:91
msgid "local file missing"
msgstr "本地文件缺失"
-#: ../svn/cl-conflicts.c:88
+#: ../svn/cl-conflicts.c:93
+#, fuzzy
msgid "local file unversioned"
-msgstr "本地文件未版本控制"
+msgstr "未版本控制"
-#: ../svn/cl-conflicts.c:90
+#: ../svn/cl-conflicts.c:95
msgid "local file add"
msgstr "本地文件增加"
-#: ../svn/cl-conflicts.c:92
+#: ../svn/cl-conflicts.c:97
+#, fuzzy
msgid "local file replace"
-msgstr "本地文件替æ¢"
+msgstr "调度: 替æ¢\n"
-#: ../svn/cl-conflicts.c:94
+#: ../svn/cl-conflicts.c:99
msgid "local file moved away"
msgstr "本地文件移走"
-#: ../svn/cl-conflicts.c:96
+#: ../svn/cl-conflicts.c:101
msgid "local file moved here"
msgstr "本地文件移入"
-#: ../svn/cl-conflicts.c:103
+#: ../svn/cl-conflicts.c:108
msgid "local dir edit"
msgstr "本地目录编辑"
-#: ../svn/cl-conflicts.c:105
+#: ../svn/cl-conflicts.c:110
+#, fuzzy
msgid "local dir obstruction"
-msgstr "本地目录障ç¢"
+msgstr "阻塞"
-#: ../svn/cl-conflicts.c:107
+#: ../svn/cl-conflicts.c:112
msgid "local dir delete"
msgstr "本地目录删除"
-#: ../svn/cl-conflicts.c:109
+#: ../svn/cl-conflicts.c:115
+#, fuzzy
+msgid "local dir missing or deleted or moved away"
+msgstr "本地目录移走"
+
+#: ../svn/cl-conflicts.c:117
msgid "local dir missing"
msgstr "本地目录缺失"
-#: ../svn/cl-conflicts.c:111
+#: ../svn/cl-conflicts.c:119
+#, fuzzy
msgid "local dir unversioned"
-msgstr "本地目录未版本控制"
+msgstr "未版本控制"
-#: ../svn/cl-conflicts.c:113
+#: ../svn/cl-conflicts.c:121
msgid "local dir add"
msgstr "本地目录增加"
-#: ../svn/cl-conflicts.c:115
+#: ../svn/cl-conflicts.c:123
msgid "local dir replace"
msgstr "本地目录替æ¢"
-#: ../svn/cl-conflicts.c:117
+#: ../svn/cl-conflicts.c:125
msgid "local dir moved away"
msgstr "本地目录移走"
-#: ../svn/cl-conflicts.c:119
+#: ../svn/cl-conflicts.c:127
msgid "local dir moved here"
msgstr "本地目录移入"
-#: ../svn/cl-conflicts.c:141
+#: ../svn/cl-conflicts.c:135 ../svn/cl-conflicts.c:242
+msgid "local edit"
+msgstr "本地编辑"
+
+#: ../svn/cl-conflicts.c:137 ../svn/cl-conflicts.c:251
+#, fuzzy
+msgid "local obstruction"
+msgstr "阻塞"
+
+#: ../svn/cl-conflicts.c:139 ../svn/cl-conflicts.c:248
+#, fuzzy
+msgid "local delete"
+msgstr "删除"
+
+#: ../svn/cl-conflicts.c:142
+#, fuzzy
+msgid "local missing or deleted or moved away"
+msgstr "本地目录移走"
+
+#: ../svn/cl-conflicts.c:144
+#, fuzzy
+msgid "local missing"
+msgstr "本地目录缺失"
+
+#: ../svn/cl-conflicts.c:146
+#, fuzzy
+msgid "local unversioned"
+msgstr "未版本控制"
+
+#: ../svn/cl-conflicts.c:148 ../svn/cl-conflicts.c:245
+#, fuzzy
+msgid "local add"
+msgstr "(本地)"
+
+#: ../svn/cl-conflicts.c:150
+#, fuzzy
+msgid "local replace"
+msgstr "本地目录替æ¢"
+
+#: ../svn/cl-conflicts.c:152
+#, fuzzy
+msgid "local moved away"
+msgstr "本地目录移走"
+
+#: ../svn/cl-conflicts.c:154
+#, fuzzy
+msgid "local moved here"
+msgstr "本地目录移入"
+
+#: ../svn/cl-conflicts.c:173
+#, fuzzy
msgid "incoming file edit"
-msgstr "进入的文件编辑"
+msgstr "传输文件数æ®"
-#: ../svn/cl-conflicts.c:143
+#: ../svn/cl-conflicts.c:175
+#, fuzzy
msgid "incoming file add"
-msgstr "进入的文件增加"
+msgstr "传输文件数æ®"
-#: ../svn/cl-conflicts.c:145
-msgid "incoming file delete"
-msgstr "进入的文件删除"
+#: ../svn/cl-conflicts.c:177
+#, fuzzy
+msgid "incoming file delete or move"
+msgstr "传输文件数æ®"
-#: ../svn/cl-conflicts.c:147
-msgid "incoming file replace"
-msgstr "进入的文件替æ¢"
+#: ../svn/cl-conflicts.c:179
+#, fuzzy
+msgid "incoming replace with file"
+msgstr "进入的目录替æ¢"
-#: ../svn/cl-conflicts.c:154
+#: ../svn/cl-conflicts.c:186
msgid "incoming dir edit"
msgstr "进入的目录编辑"
-#: ../svn/cl-conflicts.c:156
+#: ../svn/cl-conflicts.c:188
msgid "incoming dir add"
msgstr "进入的目录增加"
-#: ../svn/cl-conflicts.c:158
-msgid "incoming dir delete"
+#: ../svn/cl-conflicts.c:190
+#, fuzzy
+msgid "incoming dir delete or move"
msgstr "进入的目录删除"
-#: ../svn/cl-conflicts.c:160
-msgid "incoming dir replace"
+#: ../svn/cl-conflicts.c:192
+#, fuzzy
+msgid "incoming replace with dir"
msgstr "进入的目录替æ¢"
-#: ../svn/cl-conflicts.c:178
+#: ../svn/cl-conflicts.c:200 ../svn/cl-conflicts.c:262
+msgid "incoming edit"
+msgstr "进入的编辑"
+
+#: ../svn/cl-conflicts.c:202 ../svn/cl-conflicts.c:265
+msgid "incoming add"
+msgstr "进入的增加"
+
+#: ../svn/cl-conflicts.c:204
+#, fuzzy
+msgid "incoming delete or move"
+msgstr "进入的目录删除"
+
+#: ../svn/cl-conflicts.c:206
+#, fuzzy
+msgid "incoming replace"
+msgstr "进入的目录替æ¢"
+
+#: ../svn/cl-conflicts.c:220
+#, fuzzy
msgid "upon update"
-msgstr "接ç€æ›´æ–°"
+msgstr "æ›´æ–°"
-#: ../svn/cl-conflicts.c:179
+#: ../svn/cl-conflicts.c:221
+#, fuzzy
msgid "upon switch"
-msgstr "接ç€åˆ‡æ¢"
+msgstr "切æ¢"
-#: ../svn/cl-conflicts.c:180
+#: ../svn/cl-conflicts.c:222
+#, fuzzy
msgid "upon merge"
-msgstr "接ç€åˆå¹¶"
+msgstr "åˆå¹¶"
-#: ../svn/cl-conflicts.c:181
+#: ../svn/cl-conflicts.c:223
+#, fuzzy
msgid "upon none"
msgstr "æ— "
-#: ../svn/cl-conflicts.c:200
-msgid "local edit"
-msgstr "本地编辑"
-
-#: ../svn/cl-conflicts.c:203
-msgid "local add"
-msgstr "本地增加"
-
-#: ../svn/cl-conflicts.c:206
-msgid "local delete"
-msgstr "本地删除"
-
-#: ../svn/cl-conflicts.c:209
-msgid "local obstruction"
-msgstr "本地障ç¢"
-
-#: ../svn/cl-conflicts.c:212
-#, c-format
+#: ../svn/cl-conflicts.c:254
+#, fuzzy, c-format
msgid "local %s"
-msgstr "本地%s"
-
-#: ../svn/cl-conflicts.c:220
-msgid "incoming edit"
-msgstr "进入的编辑"
-
-#: ../svn/cl-conflicts.c:223
-msgid "incoming add"
-msgstr "进入的增加"
+msgstr "(本地)"
-#: ../svn/cl-conflicts.c:226
+#: ../svn/cl-conflicts.c:268
msgid "incoming delete"
msgstr "进入的删除"
-#: ../svn/cl-conflicts.c:229
+#: ../svn/cl-conflicts.c:271
#, c-format
msgid "incoming %s"
msgstr "进入的 %s"
-#: ../svn/cl-conflicts.c:235 ../svn/cl-conflicts.c:277
+#: ../svn/cl-conflicts.c:277 ../svn/cl-conflicts.c:320
#, c-format
msgid "%s, %s %s"
msgstr "%s, %s %s"
@@ -8407,339 +10208,327 @@ msgstr "%s, %s %s"
#. A catch-all message for very rare or nominally impossible cases.
#. It will not be pretty, but is closer to an internal error than
#. an ordinary user-facing string.
-#: ../svn/cl-conflicts.c:285
-#, c-format
+#: ../svn/cl-conflicts.c:328
+#, fuzzy, c-format
msgid "local: %s %s incoming: %s %s %s"
-msgstr "本地: %s %s 进入的: %s %s %s"
+msgstr "本地 %s,动作 %s,æ“作 %s"
+
+#: ../svn/cleanup-cmd.c:87
+msgid "Working copy locked; if no other Subversion client is currently using the working copy, try running 'svn cleanup' without the --remove-unversioned and --remove-ignored options first."
+msgstr "工作副本é”定;如果没有其它 Subversion 客户端正在使用此工作副本,请先å°è¯•æ‰§è¡Œå‘½ä»¤ 'svn cleanup',ä¸ä½¿ç”¨å‚æ•° --remove-unversioned å’Œ --remove-ignored。"
+
+#: ../svn/cleanup-cmd.c:95
+msgid "Cannot remove unversioned or ignored items from something that is not a working copy"
+msgstr ""
-#: ../svn/cleanup-cmd.c:92
+#: ../svn/cleanup-cmd.c:122
#, c-format
-msgid ""
-"Working copy locked; try running 'svn cleanup' on the root of the working "
-"copy ('%s') instead."
+msgid "Working copy locked; try running 'svn cleanup' on the root of the working copy ('%s') instead."
msgstr "工作副本被é”定;请先对工作副本(“%sâ€)根目录执行“svn cleanupâ€ã€‚"
#: ../svn/commit-cmd.c:80
#, c-format
-msgid ""
-"svn: The depth of this commit is '%s', but copies are always performed "
-"recursively in the repository.\n"
+msgid "svn: The depth of this commit is '%s', but copies are always performed recursively in the repository.\n"
msgstr "svn: æ­¤æ交的深度是“%sâ€ï¼Œä½†æ˜¯åœ¨ç‰ˆæœ¬åº“中执行的å¤åˆ¶æ€»æ˜¯é€’归的。\n"
#: ../svn/commit-cmd.c:116
msgid "Commit targets must be local paths"
msgstr "æ交目标必须是本地路径"
-#: ../svn/conflict-callbacks.c:155 ../svn/conflict-callbacks.c:172
+#: ../svn/conflict-callbacks.c:159 ../svn/conflict-callbacks.c:176
msgid "MINE"
msgstr "我的"
-#: ../svn/conflict-callbacks.c:160 ../svn/conflict-callbacks.c:170
+#: ../svn/conflict-callbacks.c:164 ../svn/conflict-callbacks.c:174
msgid "THEIRS"
msgstr "别人的"
-#: ../svn/conflict-callbacks.c:163
+#: ../svn/conflict-callbacks.c:167
msgid "MERGED"
msgstr "å·²åˆå¹¶"
-#: ../svn/conflict-callbacks.c:220 ../svn/conflict-callbacks.c:276
+#: ../svn/conflict-callbacks.c:229 ../svn/conflict-callbacks.c:289
msgid "||||||| ORIGINAL"
msgstr "||||||| 原始版本"
-#: ../svn/conflict-callbacks.c:221
+#: ../svn/conflict-callbacks.c:230
msgid "<<<<<<< MINE (select with 'mc')"
msgstr "<<<<<<< 我的版本 (使用 “mc†选择)"
-#: ../svn/conflict-callbacks.c:222
+#: ../svn/conflict-callbacks.c:231
msgid ">>>>>>> THEIRS (select with 'tc')"
msgstr ">>>>>>> 他人版本 (使用 “tc†选择)"
-#: ../svn/conflict-callbacks.c:277
+#: ../svn/conflict-callbacks.c:290
msgid "<<<<<<< MINE"
msgstr "<<<<<<< 我的"
-#: ../svn/conflict-callbacks.c:278
+#: ../svn/conflict-callbacks.c:291
msgid ">>>>>>> THEIRS"
msgstr ">>>>>>> 别人的"
-#: ../svn/conflict-callbacks.c:333 ../svn/file-merge.c:503
-msgid "No editor found."
-msgstr "没有å‘现编辑器。"
-
-#: ../svn/conflict-callbacks.c:342 ../svn/file-merge.c:515
-msgid "Error running editor."
-msgstr "执行编辑器错误。"
-
-#: ../svn/conflict-callbacks.c:352
+#: ../svn/conflict-callbacks.c:362
#, c-format
msgid ""
"Invalid option; there's no merged version to edit.\n"
"\n"
msgstr ""
-"无效选项;没有已åˆå¹¶çš„版本æ¥ç¼–辑。\n"
+"éžæ³•é€‰é¡¹ï¼›æ²¡æœ‰å·²åˆå¹¶çš„版本æ¥ç¼–辑。\n"
"\n"
-#: ../svn/conflict-callbacks.c:411
-msgid "No merge tool found, try '(m) merge' instead.\n"
-msgstr "没有å‘现åˆå¹¶å·¥å…·ï¼Œè¯·å°è¯•â€œ(m) mergeâ€ã€‚\n"
-
-#: ../svn/conflict-callbacks.c:419
-msgid "Error running merge tool, try '(m) merge' instead."
-msgstr "执行åˆå¹¶å·¥å…·é”™è¯¯ï¼Œè¯·å°è¯•â€œ(m) mergeâ€ã€‚"
-
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:420
msgid "change merged file in an editor [edit]"
msgstr "在编辑器中修改åˆå¹¶åŽçš„文件 [edit]"
#. Translators: keep long_desc below 70 characters (wrap with a left
#. margin of 9 spaces if needed); don't translate the words within square
#. brackets.
-#: ../svn/conflict-callbacks.c:451
+#: ../svn/conflict-callbacks.c:420
+#, fuzzy
msgid "edit file"
-msgstr "编辑文件"
+msgstr "深度: 文件\n"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:423
+#, fuzzy
msgid "show all changes made to merged file"
-msgstr "显示写入åˆå¹¶æ–‡ä»¶çš„所有改动"
+msgstr "无法将 svndiff 写入临时文件"
-#: ../svn/conflict-callbacks.c:454
+#: ../svn/conflict-callbacks.c:423
msgid "show diff"
msgstr "显示差异"
-#: ../svn/conflict-callbacks.c:456
+#: ../svn/conflict-callbacks.c:425
msgid "accept merged version of file"
msgstr "接å—文件的åˆå¹¶ç‰ˆæœ¬"
-#: ../svn/conflict-callbacks.c:456 ../svn/conflict-callbacks.c:504
-#: ../svn/conflict-callbacks.c:535 ../svn/conflict-callbacks.c:550
-#: ../svn/conflict-callbacks.c:566 ../svn/conflict-callbacks.c:582
-msgid "resolved"
-msgstr "已解决"
+#: ../svn/conflict-callbacks.c:425 ../svn/conflict-callbacks.c:478
+#: ../svn/conflict-callbacks.c:493
+#, fuzzy
+msgid "mark resolved"
+msgstr ",(r) 已解决"
-#: ../svn/conflict-callbacks.c:459 ../svn/conflict-callbacks.c:501
+#: ../svn/conflict-callbacks.c:428 ../svn/conflict-callbacks.c:473
+#, fuzzy
msgid "display conflict"
-msgstr "显示冲çª"
+msgstr "树冲çª"
-#: ../svn/conflict-callbacks.c:459
+#: ../svn/conflict-callbacks.c:428
msgid "show all conflicts (ignoring merged version)"
msgstr "æ˜¾ç¤ºæ‰€æœ‰å†²çª (忽略已åˆå¹¶ç‰ˆæœ¬)"
-#: ../svn/conflict-callbacks.c:461
+#: ../svn/conflict-callbacks.c:431
msgid "accept my version for all conflicts (same) [mine-conflict]"
-msgstr "对于所有冲çªï¼Œä½¿ç”¨æˆ‘的版本 [mine-conflict]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:461 ../svn/conflict-callbacks.c:547
-#: ../svn/conflict-callbacks.c:563 ../svn/conflict-callbacks.c:579
+#: ../svn/conflict-callbacks.c:431
+#, fuzzy
msgid "my side of conflict"
-msgstr "我这边的冲çª"
+msgstr "冲çªæ¦‚è¦ï¼š\n"
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:434
msgid "accept their version for all conflicts (same) [theirs-conflict]"
-msgstr "对于所有冲çªï¼Œä½¿ç”¨ä»–们的版本 [theirs-conflict]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:464
+#: ../svn/conflict-callbacks.c:434
+#, fuzzy
msgid "their side of conflict"
-msgstr "他们的冲çª"
+msgstr "树冲çª"
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:495
+#: ../svn/conflict-callbacks.c:439
msgid "accept my version of entire file (even non-conflicts) [mine-full]"
-msgstr "整个文件使用我的版本(纵然没有冲çª) [mine-full]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:469 ../svn/conflict-callbacks.c:495
-#: ../svn/conflict-callbacks.c:518
+#: ../svn/conflict-callbacks.c:439 ../svn/conflict-callbacks.c:467
+#, fuzzy
msgid "my version"
-msgstr "我的版本"
+msgstr "未版本控制"
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:498
+#: ../svn/conflict-callbacks.c:442
msgid "accept their version of entire file (same) [theirs-full]"
-msgstr "整个文件使用他们的版本 [theirs-full]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:472 ../svn/conflict-callbacks.c:498
-#: ../svn/conflict-callbacks.c:521
+#: ../svn/conflict-callbacks.c:442 ../svn/conflict-callbacks.c:470
msgid "their version"
-msgstr "他们的版本"
-
-#: ../svn/conflict-callbacks.c:476 ../svn/conflict-callbacks.c:492
-#: ../svn/conflict-callbacks.c:515
-msgid "mark the conflict to be resolved later [postpone]"
-msgstr "编辑冲çªæŽ¨è¿Ÿè§£å†³ [postpone]"
+msgstr "别人的版本"
-#: ../svn/conflict-callbacks.c:476 ../svn/conflict-callbacks.c:492
-#: ../svn/conflict-callbacks.c:515 ../svn/conflict-callbacks.c:533
-#: ../svn/conflict-callbacks.c:545 ../svn/conflict-callbacks.c:561
-#: ../svn/conflict-callbacks.c:577
-msgid "postpone"
-msgstr "推迟"
-
-#: ../svn/conflict-callbacks.c:479 ../svn/util.c:774
+#: ../svn/conflict-callbacks.c:446 ../svn/util.c:769
msgid "merge"
msgstr "åˆå¹¶"
-#: ../svn/conflict-callbacks.c:479
-msgid "use internal merge tool to resolve conflict"
-msgstr "使用内部åˆå¹¶å·¥å…·è§£å†³å†²çª"
+#: ../svn/conflict-callbacks.c:446
+#, fuzzy
+msgid "use merge tool to resolve conflict"
+msgstr "没有å‘现åˆå¹¶å·¥å…·ï¼›ä¸å¤„ç†å†²çªã€‚"
-#: ../svn/conflict-callbacks.c:481
-msgid "launch external tool to resolve conflict [launch]"
-msgstr "æ‰§è¡Œå¤–éƒ¨å·¥å…·è§£å†³å†²çª [launch]"
+#: ../svn/conflict-callbacks.c:448
+msgid "launch external merge tool to resolve conflict [launch]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:481
+#: ../svn/conflict-callbacks.c:448
msgid "launch tool"
-msgstr "执行工具"
+msgstr ""
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585
+#: ../svn/conflict-callbacks.c:451
+#, fuzzy
+msgid "internal merge tool"
+msgstr "没有外部åˆå¹¶å·¥å…·å¯ç”¨"
+
+#: ../svn/conflict-callbacks.c:451
+msgid "use built-in merge tool to resolve conflict"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:454 ../svn/conflict-callbacks.c:480
+msgid "mark the conflict to be resolved later [postpone]"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:454 ../svn/conflict-callbacks.c:480
+#: ../svn/conflict-callbacks.c:495 ../svn/conflict-callbacks.c:510
+#: ../svn/conflict-callbacks.c:525
+msgid "postpone"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:483
+#: ../svn/conflict-callbacks.c:497 ../svn/conflict-callbacks.c:512
+#: ../svn/conflict-callbacks.c:527
+#, fuzzy
msgid "postpone all remaining conflicts"
-msgstr "推迟解决所有剩余的冲çª"
+msgstr "æ交终止: “%s†处于冲çªçŠ¶æ€"
-#: ../svn/conflict-callbacks.c:483 ../svn/conflict-callbacks.c:506
-#: ../svn/conflict-callbacks.c:524 ../svn/conflict-callbacks.c:537
-#: ../svn/conflict-callbacks.c:553 ../svn/conflict-callbacks.c:569
-#: ../svn/conflict-callbacks.c:585
+#: ../svn/conflict-callbacks.c:457 ../svn/conflict-callbacks.c:483
+#: ../svn/conflict-callbacks.c:497 ../svn/conflict-callbacks.c:512
+#: ../svn/conflict-callbacks.c:527
+#, fuzzy
msgid "quit resolution"
-msgstr "退出解决冲çª"
+msgstr "解决冲çªå¤±è´¥"
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:459
+#, fuzzy
msgid "show all options"
-msgstr "显示全部选项"
+msgstr "(s) 显示全部选项: "
-#: ../svn/conflict-callbacks.c:485
+#: ../svn/conflict-callbacks.c:459
msgid "show this list (also 'h', '?')"
-msgstr "显示此列表(åŒ 'h' 或 '?')"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:467
+msgid "accept my version of entire property (even non-conflicts) [mine-full]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:501
+#: ../svn/conflict-callbacks.c:470
+msgid "accept their version of entire property (same) [theirs-full]"
+msgstr ""
+
+#: ../svn/conflict-callbacks.c:473
+#, fuzzy
msgid "show conflicts in this property"
-msgstr "显示此属性的冲çª"
+msgstr "æ“作时忽略属性"
-#: ../svn/conflict-callbacks.c:502
+#: ../svn/conflict-callbacks.c:475
msgid "change merged property value in an editor [edit]"
-msgstr "在编辑器中修改已ç»åˆå¹¶çš„属性值 [edit]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:502
+#: ../svn/conflict-callbacks.c:475
+#, fuzzy
msgid "edit property"
-msgstr "编辑属性"
+msgstr "属性å称错误"
-#: ../svn/conflict-callbacks.c:504
+#: ../svn/conflict-callbacks.c:478
+#, fuzzy
msgid "accept edited version of property"
-msgstr "接å—属性的编辑版本"
+msgstr "获å–版本属性 ARG"
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:555
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:514 ../svn/conflict-callbacks.c:529
msgid "help"
-msgstr "帮助"
+msgstr ""
-#: ../svn/conflict-callbacks.c:508 ../svn/conflict-callbacks.c:526
-#: ../svn/conflict-callbacks.c:539 ../svn/conflict-callbacks.c:555
-#: ../svn/conflict-callbacks.c:571 ../svn/conflict-callbacks.c:587
+#: ../svn/conflict-callbacks.c:485 ../svn/conflict-callbacks.c:499
+#: ../svn/conflict-callbacks.c:514 ../svn/conflict-callbacks.c:529
msgid "show this help (also '?')"
-msgstr "显示此帮助(åŒ '?')"
-
-#: ../svn/conflict-callbacks.c:518
-msgid "accept pre-existing item (ignore upstream addition) [mine-full]"
-msgstr "接å—已有项 (覆盖进入的项) [mine-full]"
-
-#: ../svn/conflict-callbacks.c:521
-msgid "accept incoming item (overwrite pre-existing item) [theirs-full]"
-msgstr "接å—进入的项 (覆盖已有项) [theirs-full]"
-
-#: ../svn/conflict-callbacks.c:533 ../svn/conflict-callbacks.c:545
-#: ../svn/conflict-callbacks.c:561 ../svn/conflict-callbacks.c:577
-msgid "resolve the conflict later [postpone]"
-msgstr "æŽ¨è¿Ÿè§£å†³å†²çª [postpone]"
+msgstr ""
-#: ../svn/conflict-callbacks.c:535
+#: ../svn/conflict-callbacks.c:493
+#, fuzzy
msgid "accept current working copy state"
-msgstr "接å—当å‰çš„工作副本路径状æ€"
+msgstr "目标必须是工作副本路径"
-#: ../svn/conflict-callbacks.c:547
-msgid "apply update to the move destination [mine-conflict]"
-msgstr ""
+#: ../svn/conflict-callbacks.c:495 ../svn/conflict-callbacks.c:510
+#: ../svn/conflict-callbacks.c:525
+#, fuzzy
+msgid "resolve the conflict later [postpone]"
+msgstr "“%sâ€çš„冲çªçŠ¶æ€å·²è§£å†³\n"
-#: ../svn/conflict-callbacks.c:550
-msgid "mark resolved (the move will become a copy)"
+#: ../svn/conflict-callbacks.c:506
+msgid "apply update to move destination (recommended)"
msgstr ""
-#: ../svn/conflict-callbacks.c:563
-msgid "keep any moves affected by this deletion [mine-conflict]"
+#: ../svn/conflict-callbacks.c:507
+msgid "apply incoming update to move destination [mine-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:566 ../svn/conflict-callbacks.c:582
-msgid "mark resolved (any affected moves will become copies)"
+#: ../svn/conflict-callbacks.c:521
+msgid "prepare for updating moved-away children, if any (recommended)"
msgstr ""
-#: ../svn/conflict-callbacks.c:579
-msgid "keep any moves affected by this replacement [mine-conflict]"
+#: ../svn/conflict-callbacks.c:522
+msgid "allow updating moved-away children with 'svn resolve' [mine-conflict]"
msgstr ""
-#: ../svn/conflict-callbacks.c:616
+#: ../svn/conflict-callbacks.c:558
msgid "Select:"
-msgstr "选择:"
+msgstr ""
-#: ../svn/conflict-callbacks.c:643
+#: ../svn/conflict-callbacks.c:585
#, c-format
msgid " (%s) %s"
-msgstr " (%s) %s"
+msgstr ""
-#: ../svn/conflict-callbacks.c:683
-msgid ""
-"Words in square brackets are the corresponding --accept option arguments.\n"
+#: ../svn/conflict-callbacks.c:625
+msgid "Words in square brackets are the corresponding --accept option arguments.\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:722
-#, c-format
+#: ../svn/conflict-callbacks.c:664
+#, fuzzy, c-format
msgid ""
"Unrecognized option.\n"
"\n"
msgstr ""
-"ä¸èƒ½è¯†åˆ«çš„选项。\n"
+"无效选项。\n"
"\n"
-#: ../svn/conflict-callbacks.c:750
-#, c-format
+#: ../svn/conflict-callbacks.c:693
+#, fuzzy, c-format
msgid "Conflict discovered in file '%s'.\n"
-msgstr "在文件“%sâ€ä¸­å‘现冲çªã€‚\n"
+msgstr "在 “%s†中å‘现冲çªã€‚\n"
-#: ../svn/conflict-callbacks.c:820
+#: ../svn/conflict-callbacks.c:763
#, c-format
msgid ""
"Invalid option; cannot display conflicts for a binary file.\n"
"\n"
msgstr ""
-"无效选项;ä¸èƒ½æ˜¾ç¤ºäºŒè¿›åˆ¶æ–‡ä»¶çš„冲çªã€‚\n"
+"éžæ³•é€‰é¡¹ï¼›ä¸èƒ½æ˜¾ç¤ºäºŒè¿›åˆ¶æ–‡ä»¶çš„冲çªã€‚\n"
"\n"
-#: ../svn/conflict-callbacks.c:829
+#: ../svn/conflict-callbacks.c:772
#, c-format
msgid ""
"Invalid option; original files not available.\n"
"\n"
msgstr ""
-"无效选项;原始文件ä¸å¯ç”¨ã€‚\n"
+"éžæ³•é€‰é¡¹ï¼›åŽŸå§‹æ–‡ä»¶ä¸å¯ç”¨ã€‚\n"
"\n"
-#: ../svn/conflict-callbacks.c:841
+#: ../svn/conflict-callbacks.c:787
#, c-format
msgid ""
"Invalid option; there's no merged version to diff.\n"
"\n"
msgstr ""
-"无效选项;没有已åˆå¹¶çš„版本æ¥æ¯”较差异。\n"
+"éžæ³•é€‰é¡¹ï¼›æ²¡æœ‰å·²åˆå¹¶çš„版本æ¥æ¯”较差异。\n"
"\n"
-#: ../svn/conflict-callbacks.c:861
-#, c-format
-msgid ""
-"Invalid option; can only resolve text conflicts with the internal merge "
-"tool.\n"
-"\n"
-msgstr ""
-"无效选项;åªèƒ½ä½¿ç”¨å†…部åˆå¹¶å·¥å…·æ¥è§£å†³çº¯æ–‡æœ¬å†²çªã€‚\n"
-"\n"
-
-#: ../svn/conflict-callbacks.c:887 ../svn/conflict-callbacks.c:904
+#: ../svn/conflict-callbacks.c:897
#, c-format
msgid ""
"Invalid option.\n"
@@ -8748,139 +10537,111 @@ msgstr ""
"无效选项。\n"
"\n"
-#: ../svn/conflict-callbacks.c:913
+#: ../svn/conflict-callbacks.c:926
#, c-format
msgid ""
"Invalid option; cannot choose based on conflicts in a binary file.\n"
"\n"
msgstr ""
-"无效选项;ä¸èƒ½ä¸ºäºŒè¿›åˆ¶æ–‡ä»¶å†²çªé€‰æ‹©åŸºå‡†ã€‚\n"
+"éžæ³•é€‰é¡¹ï¼›ä¸èƒ½ä¸ºäºŒè¿›åˆ¶æ–‡ä»¶å†²çªé€‰æ‹©åŸºå‡†ã€‚\n"
"\n"
-#: ../svn/conflict-callbacks.c:927
+#: ../svn/conflict-callbacks.c:940
#, c-format
msgid ""
-"Invalid option; use diff/edit/merge/launch before choosing 'resolved'.\n"
+"Invalid option; use diff/edit/merge/launch before choosing 'mark resolved'.\n"
"\n"
msgstr ""
-#: ../svn/conflict-callbacks.c:968
+#: ../svn/conflict-callbacks.c:981
#, c-format
msgid "Conflict for property '%s' discovered on '%s'.\n"
msgstr "属性 “%s†冲çªï¼Œä½äºŽ “%sâ€ã€‚\n"
-#: ../svn/conflict-callbacks.c:1026
-#, c-format
+#: ../svn/conflict-callbacks.c:1041
+#, fuzzy, c-format
msgid ""
"Invalid option; please edit the property first.\n"
"\n"
msgstr ""
-"无效选项;请先编辑属性。\n"
+"éžæ³•é€‰é¡¹ï¼›ä¸èƒ½æ˜¾ç¤ºå±žæ€§çš„冲çªã€‚\n"
"\n"
-#: ../svn/conflict-callbacks.c:1063
-#, c-format
+#: ../svn/conflict-callbacks.c:1078
+#, fuzzy, c-format
msgid ""
"Tree conflict on '%s'\n"
" > %s\n"
-msgstr ""
-"树冲çªäºŽâ€œ%sâ€\n"
-" > %s\n"
-
-#: ../svn/conflict-callbacks.c:1128
-#, c-format
-msgid ""
-"Conflict discovered when trying to add '%s'.\n"
-"An object of the same name already exists.\n"
-msgstr ""
-"增加 “%s†时出现冲çªã€‚\n"
-"åŒå对象已存在。\n"
-
-#: ../svn/conflict-callbacks.c:1226
-msgid "No editor found; leaving all conflicts."
-msgstr "没有å‘现编辑器;ä¸å¤„ç†å†²çªã€‚"
-
-#: ../svn/conflict-callbacks.c:1235
-msgid "Error running editor; leaving all conflicts."
-msgstr "执行编辑器错误;ä¸å¤„ç†å†²çªã€‚"
-
-#: ../svn/conflict-callbacks.c:1271
-msgid "No merge tool found; leaving all conflicts."
-msgstr "没有å‘现åˆå¹¶å·¥å…·ï¼›ä¸å¤„ç†å†²çªã€‚"
-
-#: ../svn/conflict-callbacks.c:1280
-msgid "Error running merge tool; leaving all conflicts."
-msgstr "执行åˆå¹¶å·¥å…·é”™è¯¯ï¼›ä¸å¤„ç†å†²çªã€‚"
+msgstr " 树冲çªï¼š%u\n"
-#: ../svn/copy-cmd.c:123 ../svn/util.c:957
+#: ../svn/copy-cmd.c:123 ../svn/export-cmd.c:94 ../svn/util.c:952
#, c-format
msgid "'%s': a peg revision is not allowed here"
msgstr "'%s': 此处ä¸å…许铆钉版本范围"
-#: ../svn/copy-cmd.c:163 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
+#: ../svn/copy-cmd.c:162 ../svn/delete-cmd.c:69 ../svn/mkdir-cmd.c:68
#: ../svn/move-cmd.c:77 ../svn/propedit-cmd.c:260
-msgid ""
-"Local, non-commit operations do not take a log message or revision properties"
+msgid "Local, non-commit operations do not take a log message or revision properties"
msgstr "本地æ“作,éžæ交æ“作无须日志信æ¯æˆ–版本属性"
-#: ../svn/diff-cmd.c:208
+#: ../svn/diff-cmd.c:210
msgid "'--xml' option only valid with '--summarize' option"
msgstr "“--xml†选项åªèƒ½ä¸Ž “--summarize†åŒæ—¶ä½¿ç”¨"
-#: ../svn/diff-cmd.c:299
+#: ../svn/diff-cmd.c:301
msgid "'--new' option only valid with '--old' option"
msgstr "“--new†选项åªèƒ½ä¸Ž “--old†åŒæ—¶ä½¿ç”¨"
-#: ../svn/diff-cmd.c:317
-msgid ""
-"'svn diff [-r N[:M]] [TARGET[@REV]...]' does not support mixed target types. "
-"Try using the --old and --new options or one of the shorthand invocations "
-"listed in 'svn help diff'."
+#: ../svn/diff-cmd.c:319
+msgid "'svn diff [-r N[:M]] [TARGET[@REV]...]' does not support mixed target types. Try using the --old and --new options or one of the shorthand invocations listed in 'svn help diff'."
msgstr ""
-"“svn diff [-r N[:M]] [TARGET[@REV]...]â€ä¸æ”¯æŒæ··åˆç›®æ ‡ç±»åž‹ã€‚请å°è¯•ä½¿ç”¨ --old "
-"å’Œ --new 选项或者“svn help diffâ€åˆ—出的缩写。"
-#: ../svn/diff-cmd.c:355
+#: ../svn/diff-cmd.c:372
#, c-format
msgid "Path '%s' not relative to base URLs"
msgstr "路径“%sâ€ä¸æ˜¯ç›¸å¯¹äºŽåŸºç¡€ URL"
-#: ../svn/export-cmd.c:113
-msgid ""
-"Destination directory exists; please remove the directory or use --force to "
-"overwrite"
+#: ../svn/export-cmd.c:121
+msgid "Destination directory exists; please remove the directory or use --force to overwrite"
msgstr "目的目录已存在;请删除目录或用 --force æ¥è¦†ç›–目录"
-#: ../svn/export-cmd.c:122 ../svn/list-cmd.c:412 ../svn/switch-cmd.c:188
-#: ../svn/update-cmd.c:177
-msgid "Failure occurred processing one or more externals definitions"
-msgstr "处ç†ä¸€ä¸ªæˆ–更多的外部定义失败"
-
-#: ../svn/file-merge.c:135 ../svn/file-merge.c:785
+#: ../svn/file-merge.c:139 ../svn/file-merge.c:809
+#, fuzzy
msgid "Could not write data to merged file"
-msgstr "无法写入数æ®åˆ°å·²ç»åˆå¹¶æ–‡ä»¶"
+msgstr "无法将 svndiff 写入临时文件"
-#: ../svn/file-merge.c:491
+#: ../svn/file-merge.c:495
+#, fuzzy
msgid "Could not write data to temporary file"
-msgstr "无法写入数æ®åˆ°ä¸´æ—¶æ–‡ä»¶"
+msgstr "无法将 svndiff 写入临时文件"
+
+#: ../svn/file-merge.c:507
+msgid "No editor found."
+msgstr "没有å‘现编辑器。"
+
+#: ../svn/file-merge.c:519
+msgid "Error running editor."
+msgstr "执行编辑器错误。"
-#: ../svn/file-merge.c:600
+#: ../svn/file-merge.c:604
msgid "Conflicting section found during merge:"
msgstr ""
-#: ../svn/file-merge.c:603
+#: ../svn/file-merge.c:607
#, c-format
msgid "(1) their version (at line %lu)"
-msgstr "(1) 他们的版本 (第 %lu 行)"
+msgstr ""
-#: ../svn/file-merge.c:608
+#: ../svn/file-merge.c:612
#, c-format
msgid "(2) your version (at line %lu)"
-msgstr "(2) 你的版本 (第 %lu 行)"
+msgstr ""
-#: ../svn/file-merge.c:657
+#: ../svn/file-merge.c:661
msgid ""
"Select: (1) use their version, (2) use your version,\n"
+" (12) their version first, then yours,\n"
+" (21) your version first, then theirs,\n"
" (e1) edit their version and use the result,\n"
" (e2) edit your version and use the result,\n"
" (eb) edit both versions and use the result,\n"
@@ -8888,38 +10649,40 @@ msgid ""
" (a) abort file merge and return to main menu: "
msgstr ""
-#: ../svn/file-merge.c:868
-#, c-format
+#: ../svn/file-merge.c:894
+#, fuzzy, c-format
msgid "Merging '%s'.\n"
-msgstr "正在åˆå¹¶â€œ%sâ€ã€‚\n"
+msgstr "æ­£åœ¨è¯»å– â€œ%sâ€"
-#: ../svn/file-merge.c:915
+#: ../svn/file-merge.c:942
#, c-format
msgid "Merge of '%s' aborted.\n"
-msgstr "路径 '%s' çš„åˆå¹¶ä¸­æ­¢ã€‚\n"
+msgstr ""
-#: ../svn/file-merge.c:933
+#: ../svn/file-merge.c:960
#, c-format
msgid ""
"Could not write merged result to '%s', saved instead at '%s'.\n"
"'%s' remains in conflict.\n"
msgstr ""
-#: ../svn/file-merge.c:951
-#, c-format
+#: ../svn/file-merge.c:978
+#, fuzzy, c-format
msgid "Merge of '%s' completed (remains in conflict).\n"
-msgstr "“%sâ€çš„åˆå¹¶å®Œæˆ(ä»æ—§å¤„于冲çªçŠ¶æ€)。\n"
+msgstr "已跳过 '%s' -- 节点处于冲çªçŠ¶æ€\n"
-#: ../svn/file-merge.c:955
-#, c-format
+#: ../svn/file-merge.c:982
+#, fuzzy, c-format
msgid "Merge of '%s' completed.\n"
-msgstr "“%sâ€çš„åˆå¹¶å®Œæˆã€‚\n"
+msgstr ""
+"\n"
+"完æˆå‡çº§ã€‚\n"
#: ../svn/help-cmd.c:53
-#, c-format
+#, fuzzy
msgid ""
"usage: svn <subcommand> [options] [args]\n"
-"Subversion command-line client, version %s.\n"
+"Subversion command-line client.\n"
"Type 'svn help <subcommand>' for help on a specific subcommand.\n"
"Type 'svn --version' to see the program version and RA modules\n"
" or 'svn --version --quiet' to see just the version number.\n"
@@ -8941,26 +10704,30 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svn/help-cmd.c:66
+#: ../svn/help-cmd.c:124
msgid ""
-"Subversion is a tool for version control.\n"
-"For additional information, see http://subversion.apache.org/\n"
+"WARNING: Plaintext password storage is enabled!\n"
+"\n"
msgstr ""
-"Subversion 是版本控制工具。\n"
-"欲å–得详细资料,请å‚阅 http://subversion.apache.org/\n"
-#: ../svn/help-cmd.c:73 ../svnrdump/svnrdump.c:659 ../svnsync/svnsync.c:1856
+#: ../svn/help-cmd.c:147
+#, fuzzy
msgid ""
-"The following repository access (RA) modules are available:\n"
+"\n"
+"The following authentication credential caches are available:\n"
"\n"
msgstr ""
"å¯ä½¿ç”¨ä»¥ä¸‹çš„版本库访问模å—: \n"
"\n"
-#: ../svn/help-cmd.c:127
-msgid ""
-"WARNING: Plaintext password storage is enabled!\n"
-"\n"
+#: ../svn/help-cmd.c:152
+#, c-format
+msgid "%s* Wincrypt cache in %s\n"
+msgstr ""
+
+#: ../svn/help-cmd.c:159
+#, c-format
+msgid "%s* Plaintext cache in %s\n"
msgstr ""
#: ../svn/import-cmd.c:87
@@ -8980,206 +10747,207 @@ msgstr "无效URL“%sâ€"
msgid "Resource is not under version control."
msgstr "资æºå°šæœªçº³å…¥ç‰ˆæœ¬æŽ§åˆ¶"
-#: ../svn/info-cmd.c:266 ../svnadmin/svnadmin.c:1774
+#: ../svn/info-cmd.c:268 ../svnadmin/svnadmin.c:1949
+#: ../svnadmin/svnadmin.c:2167
#, c-format
msgid "Path: %s\n"
msgstr "路径: %s\n"
-#: ../svn/info-cmd.c:273
+#: ../svn/info-cmd.c:275
#, c-format
msgid "Name: %s\n"
msgstr "å称: %s\n"
-#: ../svn/info-cmd.c:277
+#: ../svn/info-cmd.c:279
#, c-format
msgid "Working Copy Root Path: %s\n"
msgstr "工作副本根目录: %s\n"
-#: ../svn/info-cmd.c:283
+#: ../svn/info-cmd.c:285
#, c-format
msgid "URL: %s\n"
msgstr "URL: %s\n"
-#: ../svn/info-cmd.c:286
-#, c-format
+#: ../svn/info-cmd.c:288
+#, fuzzy, c-format
msgid "Relative URL: ^/%s\n"
-msgstr "正确的相对 URL: ^/%s\n"
+msgstr "ä¸æ­£ç¡®çš„相对 URL“%sâ€"
-#: ../svn/info-cmd.c:293
+#: ../svn/info-cmd.c:295
#, c-format
msgid "Repository Root: %s\n"
msgstr "版本库根: %s\n"
-#: ../svn/info-cmd.c:297
+#: ../svn/info-cmd.c:299
#, c-format
msgid "Repository UUID: %s\n"
msgstr "版本库 UUID: %s\n"
-#: ../svn/info-cmd.c:301
+#: ../svn/info-cmd.c:303
#, c-format
msgid "Revision: %ld\n"
msgstr "版本: %ld\n"
-#: ../svn/info-cmd.c:306
+#: ../svn/info-cmd.c:308
#, c-format
msgid "Node Kind: file\n"
msgstr "节点ç§ç±»: 文件\n"
-#: ../svn/info-cmd.c:310
+#: ../svn/info-cmd.c:312
#, c-format
msgid "Node Kind: directory\n"
msgstr "节点ç§ç±»: 目录\n"
-#: ../svn/info-cmd.c:314
+#: ../svn/info-cmd.c:316
#, c-format
msgid "Node Kind: none\n"
msgstr "节点ç§ç±»: æ— \n"
-#: ../svn/info-cmd.c:319
+#: ../svn/info-cmd.c:321
#, c-format
msgid "Node Kind: unknown\n"
msgstr "节点ç§ç±»: 未知\n"
-#: ../svn/info-cmd.c:328
+#: ../svn/info-cmd.c:330
#, c-format
msgid "Schedule: normal\n"
msgstr "调度: 正常\n"
-#: ../svn/info-cmd.c:332
+#: ../svn/info-cmd.c:334
#, c-format
msgid "Schedule: add\n"
msgstr "调度: 增加\n"
-#: ../svn/info-cmd.c:336
+#: ../svn/info-cmd.c:338
#, c-format
msgid "Schedule: delete\n"
msgstr "调度: 删除\n"
-#: ../svn/info-cmd.c:340
+#: ../svn/info-cmd.c:342
#, c-format
msgid "Schedule: replace\n"
msgstr "调度: 替æ¢\n"
-#: ../svn/info-cmd.c:356
+#: ../svn/info-cmd.c:358
#, c-format
msgid "Depth: empty\n"
msgstr "深度: 空\n"
-#: ../svn/info-cmd.c:360
+#: ../svn/info-cmd.c:362
#, c-format
msgid "Depth: files\n"
msgstr "深度: 文件\n"
-#: ../svn/info-cmd.c:364
+#: ../svn/info-cmd.c:366
#, c-format
msgid "Depth: immediates\n"
msgstr "深度: 直接\n"
-#: ../svn/info-cmd.c:368
+#: ../svn/info-cmd.c:370
#, c-format
msgid "Depth: exclude\n"
msgstr "深度: 排除\n"
#. Other depths should never happen here.
-#: ../svn/info-cmd.c:379
+#: ../svn/info-cmd.c:381
#, c-format
msgid "Depth: INVALID\n"
msgstr "深度: éžæ³•\n"
-#: ../svn/info-cmd.c:383
+#: ../svn/info-cmd.c:385
#, c-format
msgid "Copied From URL: %s\n"
msgstr "从URL %s å¤åˆ¶: \n"
-#: ../svn/info-cmd.c:387
+#: ../svn/info-cmd.c:389
#, c-format
msgid "Copied From Rev: %ld\n"
msgstr "从版本 %ld å¤åˆ¶: \n"
-#: ../svn/info-cmd.c:396 ../svn/info-cmd.c:398
+#: ../svn/info-cmd.c:398 ../svn/info-cmd.c:400
#, c-format
msgid "Moved From: %s\n"
msgstr "移自: %s\n"
-#: ../svn/info-cmd.c:409 ../svn/info-cmd.c:411
+#: ../svn/info-cmd.c:411 ../svn/info-cmd.c:413
#, c-format
msgid "Moved To: %s\n"
msgstr "移到: %s\n"
-#: ../svn/info-cmd.c:417
+#: ../svn/info-cmd.c:419
#, c-format
msgid "Last Changed Author: %s\n"
msgstr "最åŽä¿®æ”¹çš„作者: %s\n"
-#: ../svn/info-cmd.c:421
+#: ../svn/info-cmd.c:423
#, c-format
msgid "Last Changed Rev: %ld\n"
msgstr "最åŽä¿®æ”¹çš„版本: %ld\n"
-#: ../svn/info-cmd.c:426
+#: ../svn/info-cmd.c:428
msgid "Last Changed Date"
msgstr "最åŽä¿®æ”¹çš„时间"
-#: ../svn/info-cmd.c:432
+#: ../svn/info-cmd.c:434
msgid "Text Last Updated"
msgstr "文本最åŽæ›´æ–°"
-#: ../svn/info-cmd.c:435
+#: ../svn/info-cmd.c:437
#, c-format
msgid "Checksum: %s\n"
msgstr "校验和: %s\n"
-#: ../svn/info-cmd.c:456
+#: ../svn/info-cmd.c:458
#, c-format
msgid "Conflict Previous Base File: %s\n"
msgstr "与之å‰çš„å‚考文件冲çª: %s\n"
-#: ../svn/info-cmd.c:463
+#: ../svn/info-cmd.c:465
#, c-format
msgid "Conflict Previous Working File: %s\n"
msgstr "与之å‰çš„工作文件冲çª: %s\n"
-#: ../svn/info-cmd.c:470
+#: ../svn/info-cmd.c:472
#, c-format
msgid "Conflict Current Base File: %s\n"
msgstr "与当å‰çš„å‚考文件冲çª: %s\n"
-#: ../svn/info-cmd.c:479
+#: ../svn/info-cmd.c:481
#, c-format
msgid "Conflict Properties File: %s\n"
msgstr "属性冲çªçš„文件: %s\n"
-#: ../svn/info-cmd.c:491
+#: ../svn/info-cmd.c:493
msgid "Tree conflict"
msgstr "树冲çª"
-#: ../svn/info-cmd.c:517
+#: ../svn/info-cmd.c:519
msgid "Source left"
msgstr "æº å·¦è¾¹"
-#: ../svn/info-cmd.c:526
+#: ../svn/info-cmd.c:528
msgid "Source right"
msgstr "æº å³è¾¹"
-#: ../svn/info-cmd.c:535
+#: ../svn/info-cmd.c:537
#, c-format
msgid "Lock Token: %s\n"
msgstr "é”定令牌: %s\n"
-#: ../svn/info-cmd.c:539
+#: ../svn/info-cmd.c:541
#, c-format
msgid "Lock Owner: %s\n"
msgstr "é”定所有者: %s\n"
-#: ../svn/info-cmd.c:544
+#: ../svn/info-cmd.c:546
msgid "Lock Created"
msgstr "已创建é”定"
-#: ../svn/info-cmd.c:548
+#: ../svn/info-cmd.c:550
msgid "Lock Expires"
msgstr "é”定过期"
-#: ../svn/info-cmd.c:556
+#: ../svn/info-cmd.c:558
#, c-format
msgid ""
"Lock Comment (%i line):\n"
@@ -9191,15 +10959,11 @@ msgstr[0] ""
"é”定注释(%i è¡Œ): \n"
"%s\n"
-#: ../svn/info-cmd.c:565
+#: ../svn/info-cmd.c:567
#, c-format
msgid "Changelist: %s\n"
msgstr "修改列表: %s\n"
-#: ../svn/info-cmd.c:679
-msgid "Could not display info for all targets because some targets don't exist"
-msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡"
-
#: ../svn/list-cmd.c:73
msgid "%b %d %H:%M"
msgstr "%b %d %H:%M"
@@ -9215,157 +10979,147 @@ msgstr ""
"\n"
"正在å–得外部项目至 '%s':\n"
-#: ../svn/list-cmd.c:421
-msgid "Could not list all targets because some targets don't exist"
-msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½åˆ—出全部目标"
-
#: ../svn/lock-cmd.c:58
msgid "Lock comment contains a zero byte"
msgstr "加é”注释中有一个零字节"
-#: ../svn/log-cmd.c:144
+#: ../svn/log-cmd.c:109
msgid "\n"
msgstr "\n"
-#: ../svn/log-cmd.c:354
+#: ../svn/log-cmd.c:321
msgid "(no author)"
msgstr "(没有作者信æ¯)"
-#: ../svn/log-cmd.c:360
+#: ../svn/log-cmd.c:327
msgid "(no date)"
msgstr "(没有时间信æ¯)"
-#: ../svn/log-cmd.c:385
+#: ../svn/log-cmd.c:357
#, c-format
msgid " | %d line"
msgid_plural " | %d lines"
msgstr[0] " | %d 行"
-#: ../svn/log-cmd.c:401
+#: ../svn/log-cmd.c:374
#, c-format
msgid "Changed paths:\n"
msgstr "改å˜çš„路径: \n"
-#: ../svn/log-cmd.c:418
+#: ../svn/log-cmd.c:394
#, c-format
msgid " (from %s:%ld)"
msgstr " (从 %s:%ld)"
-#: ../svn/log-cmd.c:434
+#: ../svn/log-cmd.c:412
#, c-format
msgid "Reverse merged via:"
msgstr "å·²ç»æ’¤é”€åˆå¹¶ï¼Œé€šè¿‡:"
-#: ../svn/log-cmd.c:436
+#: ../svn/log-cmd.c:414
#, c-format
msgid "Merged via:"
msgstr "åˆå¹¶é€šè¿‡: "
-#: ../svn/log-cmd.c:689
+#: ../svn/log-cmd.c:697
msgid "'with-all-revprops' option only valid in XML mode"
msgstr "åªæœ‰åœ¨ XML æ¨¡å¼ â€œwith-all-revprops†选项æ‰æœ‰æ•ˆ"
-#: ../svn/log-cmd.c:693
+#: ../svn/log-cmd.c:701
msgid "'with-no-revprops' option only valid in XML mode"
msgstr "åªæœ‰åœ¨ XML æ¨¡å¼ â€œwith-no-revprops†选项æ‰æœ‰æ•ˆ"
-#: ../svn/log-cmd.c:697
+#: ../svn/log-cmd.c:705
msgid "'with-revprop' option only valid in XML mode"
msgstr "åªæœ‰åœ¨ XML æ¨¡å¼ â€œwith-revprop†选项æ‰æœ‰æ•ˆ"
-#: ../svn/log-cmd.c:704
+#: ../svn/log-cmd.c:712
msgid "'diff' option is not supported in XML mode"
msgstr "在 XML 模å¼ä¸æ”¯æŒ 'diff' 选项"
-#: ../svn/log-cmd.c:710
+#: ../svn/log-cmd.c:718
msgid "'quiet' and 'diff' options are mutually exclusive"
msgstr "'quiet' 与 'diff' 选项是互斥的"
-#: ../svn/log-cmd.c:714
+#: ../svn/log-cmd.c:722
msgid "'diff-cmd' option requires 'diff' option"
msgstr "'diff-cmd' é€‰é¡¹éœ€è¦ 'diff' 选项"
-#: ../svn/log-cmd.c:718
+#: ../svn/log-cmd.c:726
msgid "'internal-diff' option requires 'diff' option"
msgstr "'internal-diff' é€‰é¡¹éœ€è¦ 'diff' 选项"
-#: ../svn/log-cmd.c:722
+#: ../svn/log-cmd.c:730
msgid "'extensions' option requires 'diff' option"
msgstr "'extensions' 选项å¾å•Šå“Ÿ 'diff' 选项"
-#: ../svn/log-cmd.c:727
+#: ../svn/log-cmd.c:735
msgid "'depth' option requires 'diff' option"
msgstr "'depth' é€‰é¡¹éœ€è¦ 'diff' 选项"
-#: ../svn/log-cmd.c:743
-msgid "-c and -r are mutually exclusive"
-msgstr "-c 与 -r 是互斥的"
-
-#: ../svn/log-cmd.c:775
+#: ../svn/log-cmd.c:783
#, c-format
-msgid ""
-"Only relative paths can be specified after a URL for 'svn log', but '%s' is "
-"not a relative path"
+msgid "Only relative paths can be specified after a URL for 'svn log', but '%s' is not a relative path"
msgstr "对于 'svn log',在 URL åŽåªèƒ½æŒ‡å®šç›¸å¯¹è·¯å¾„,但 '%s' ä¸æ˜¯ç›¸å¯¹è·¯å¾„"
-#: ../svn/log-cmd.c:821
+#: ../svn/log-cmd.c:829
#, c-format
msgid "cannot assign with 'with-revprop' option (drop the '=')"
msgstr "选项 'with-revprop' ä¸æŽ¥å—赋值(请删除 '=')"
-#: ../svn/merge-cmd.c:107 ../svn/merge-cmd.c:131
-#, c-format
+#: ../svn/merge-cmd.c:103 ../svn/merge-cmd.c:127
+#, fuzzy, c-format
msgid "--- Merging\n"
-msgstr "--- 正在åˆå¹¶\n"
+msgstr "æ­£åœ¨è¯»å– â€œ%sâ€"
-#: ../svn/merge-cmd.c:175
+#: ../svn/merge-cmd.c:171
msgid "-r and -c can't be used with --reintegrate"
msgstr "-r å’Œ -c ä¸èƒ½ä¸Ž --reintegrate 共存"
-#: ../svn/merge-cmd.c:230
+#: ../svn/merge-cmd.c:226
msgid "Merge source required"
msgstr "需è¦åˆå¹¶æº"
-#: ../svn/merge-cmd.c:276
+#: ../svn/merge-cmd.c:272
msgid "Second revision required"
msgstr "需è¦ç¬¬äºŒä¸ªç‰ˆæœ¬"
-#: ../svn/merge-cmd.c:285 ../svn/merge-cmd.c:312 ../svn/mergeinfo-cmd.c:267
-#: ../svnadmin/svnadmin.c:1749 ../svnlook/svnlook.c:2060
-#: ../svnlook/svnlook.c:2253 ../svnlook/svnlook.c:2357
-#: ../svnlook/svnlook.c:2392
+#: ../svn/merge-cmd.c:281 ../svn/merge-cmd.c:308 ../svn/mergeinfo-cmd.c:361
+#: ../svnadmin/svnadmin.c:2138 ../svnlook/svnlook.c:2077
+#: ../svnlook/svnlook.c:2271 ../svnlook/svnlook.c:2375
+#: ../svnlook/svnlook.c:2410
msgid "Too many arguments given"
msgstr "å‚数过多"
-#: ../svn/merge-cmd.c:302
+#: ../svn/merge-cmd.c:298
msgid "Cannot specify a revision range with two URLs"
msgstr "ä¸èƒ½å¯¹ä¸¤ä¸ª URL 指定版本范围"
-#: ../svn/merge-cmd.c:406
+#: ../svn/merge-cmd.c:402
msgid "--reintegrate cannot be used with --ignore-ancestry"
msgstr "--reintegrate ä¸èƒ½ä¸Ž --ignore-ancestry 共存"
-#: ../svn/merge-cmd.c:411
+#: ../svn/merge-cmd.c:407
msgid "--reintegrate cannot be used with --record-only"
msgstr "--reintegrate ä¸èƒ½ä¸Ž --record-only 共存"
-#: ../svn/merge-cmd.c:416
+#: ../svn/merge-cmd.c:412
msgid "--depth cannot be used with --reintegrate"
msgstr "--depth ä¸èƒ½ä¸Ž --reintegrate 共存"
-#: ../svn/merge-cmd.c:421
+#: ../svn/merge-cmd.c:417
msgid "--force cannot be used with --reintegrate"
msgstr "--force ä¸èƒ½ä¸Ž --reintegrate 共存"
-#: ../svn/merge-cmd.c:426
+#: ../svn/merge-cmd.c:422
msgid "--reintegrate can only be used with a single merge source"
msgstr "--reintegrate åªèƒ½ç”¨äºŽå•ä¸€åˆå¹¶æº"
-#: ../svn/merge-cmd.c:430
+#: ../svn/merge-cmd.c:426
msgid "--allow-mixed-revisions cannot be used with --reintegrate"
msgstr "--allow-mixed-revisions ä¸èƒ½ä¸Ž --reintegrate 共存"
-#: ../svn/merge-cmd.c:445
+#: ../svn/merge-cmd.c:441
msgid ""
"Merge tracking not possible, use --ignore-ancestry or\n"
"fix invalid mergeinfo in target with 'svn propset'"
@@ -9373,34 +11127,56 @@ msgstr ""
"ä¸èƒ½æ‰§è¡Œåˆå¹¶è·Ÿè¸ªï¼Œå¯¹ç›®æ ‡ä½¿ç”¨â€œsvn propsetâ€ä¿®æ­£éžæ³•åˆå¹¶ä¿¡æ¯ï¼Œæˆ–者使用选项\n"
"--ignore-ancestry"
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "last full merge"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:171
+#: ../svn/mergeinfo-cmd.c:193
msgid "youngest common ancestor"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
+#, fuzzy
msgid "repository path"
-msgstr "版本库路径"
+msgstr "获å–版本库 UUID"
-#: ../svn/mergeinfo-cmd.c:172
+#: ../svn/mergeinfo-cmd.c:194
msgid "tip of branch"
msgstr ""
-#: ../svn/mergeinfo-cmd.c:264
+#: ../svn/mergeinfo-cmd.c:358
msgid "Not enough arguments given"
msgstr "没有æ供足够的å‚æ•°"
-#: ../svn/mergeinfo-cmd.c:342
+#: ../svn/mergeinfo-cmd.c:404
+#, fuzzy
+msgid "--quiet (-q) option valid only with --log option"
+msgstr "“--new†选项åªèƒ½ä¸Ž “--old†åŒæ—¶ä½¿ç”¨"
+
+#: ../svn/mergeinfo-cmd.c:409
+#, fuzzy
+msgid "--verbose (-v) option valid only with --log option"
+msgstr "“--new†选项åªèƒ½ä¸Ž “--old†åŒæ—¶ä½¿ç”¨"
+
+#: ../svn/mergeinfo-cmd.c:414
+#, fuzzy
+msgid "--incremental option valid only with --log option"
+msgstr "“--xml†选项åªèƒ½ä¸Ž “--summarize†åŒæ—¶ä½¿ç”¨"
+
+#: ../svn/mergeinfo-cmd.c:444
+#, fuzzy
msgid "--revision (-r) option valid only with --show-revs option"
-msgstr "--revision (-r) 选项åªèƒ½ä¸Ž --show-revs åŒæ—¶ä½¿ç”¨"
+msgstr "“--new†选项åªèƒ½ä¸Ž “--old†åŒæ—¶ä½¿ç”¨"
-#: ../svn/mergeinfo-cmd.c:346
+#: ../svn/mergeinfo-cmd.c:448
msgid "Depth specification options valid only with --show-revs option"
msgstr ""
+#: ../svn/mergeinfo-cmd.c:452
+#, fuzzy
+msgid "--log option valid only with --show-revs option"
+msgstr "“--xml†选项åªèƒ½ä¸Ž “--summarize†åŒæ—¶ä½¿ç”¨"
+
#: ../svn/mkdir-cmd.c:92
msgid "Try 'svn add' or 'svn add --non-recursive' instead?"
msgstr "å°è¯•ç”¨ “svn addâ€æˆ– “svn add --non-recursiveâ€ä»£æ›¿ï¼Ÿ"
@@ -9413,443 +11189,104 @@ msgstr "å°è¯• “svn mkdir --parentsâ€ï¼Ÿ"
#, c-format
msgid "%d remaining"
msgid_plural "%d remaining"
-msgstr[0] "剩余 %d"
+msgstr[0] ""
#: ../svn/notify.c:141
-#, c-format
+#, fuzzy, c-format
msgid "and %d already resolved"
msgid_plural "and %d already resolved"
-msgstr[0] "%d 个已ç»è§£å†³"
+msgstr[0] "å·²ç»é”定路径"
-#: ../svn/notify.c:163 ../svn/status-cmd.c:90
+#: ../svn/notify.c:163 ../svn/status-cmd.c:93
#, c-format
msgid "Summary of conflicts:\n"
msgstr "冲çªæ¦‚è¦ï¼š\n"
#: ../svn/notify.c:169
-#, c-format
+#, fuzzy, c-format
msgid " Text conflicts: %d\n"
-msgstr " 正文冲çªï¼š%d\n"
+msgstr " 正文冲çªï¼š%u\n"
#: ../svn/notify.c:173
-#, c-format
+#, fuzzy, c-format
msgid " Property conflicts: %d\n"
-msgstr " 属性冲çªï¼š%d\n"
+msgstr " 属性冲çªï¼š%u\n"
#: ../svn/notify.c:177
-#, c-format
+#, fuzzy, c-format
msgid " Tree conflicts: %d\n"
-msgstr " 树冲çªï¼š%d\n"
+msgstr " 树冲çªï¼š%u\n"
#: ../svn/notify.c:184
-#, c-format
+#, fuzzy, c-format
msgid " Text conflicts: %s (%s)\n"
-msgstr " 正文冲çªï¼š%s (%s)\n"
+msgstr " 正文冲çªï¼š%u\n"
#: ../svn/notify.c:189
-#, c-format
+#, fuzzy, c-format
msgid " Property conflicts: %s (%s)\n"
-msgstr " 属性冲çªï¼š%s (%s)\n"
+msgstr " 属性冲çªï¼š%u\n"
#: ../svn/notify.c:194
-#, c-format
+#, fuzzy, c-format
msgid " Tree conflicts: %s (%s)\n"
-msgstr " 树冲çªï¼š%s (%s)\n"
+msgstr " 树冲çªï¼š%u\n"
#: ../svn/notify.c:200
-#, c-format
+#, fuzzy, c-format
msgid " Skipped paths: %d\n"
-msgstr " 跳过的路径:%d\n"
-
-#: ../svn/notify.c:235
-#, c-format
-msgid "Skipped missing target: '%s'\n"
-msgstr "跳过缺少的目标: “%sâ€\n"
-
-#: ../svn/notify.c:242
-#, c-format
-msgid "Skipped target: '%s' -- copy-source is missing\n"
-msgstr "跳过目标: '%s' -- copy-source 丢失\n"
-
-#: ../svn/notify.c:249
-#, c-format
-msgid "Skipped '%s'\n"
-msgstr "跳过“%sâ€\n"
-
-#: ../svn/notify.c:256
-#, c-format
-msgid "Skipped '%s' -- An obstructing working copy was found\n"
-msgstr "忽略“%s†-- å‘现障ç¢å·¥ä½œå‰¯æœ¬\n"
-
-#: ../svn/notify.c:263
-#, c-format
-msgid "Skipped '%s' -- Has no versioned parent\n"
-msgstr "已跳过 '%s' -- 没有已版本控制的父亲\n"
-
-#: ../svn/notify.c:270
-#, c-format
-msgid "Skipped '%s' -- Access denied\n"
-msgstr "已跳过 '%s' -- æ‹’ç»è®¿é—®\n"
-
-#: ../svn/notify.c:277
-#, c-format
-msgid "Skipped '%s' -- Node remains in conflict\n"
-msgstr "已跳过 '%s' -- 节点处于冲çªçŠ¶æ€\n"
-
-#: ../svn/notify.c:358
-#, c-format
-msgid "Restored '%s'\n"
-msgstr "已还原“%sâ€\n"
-
-#: ../svn/notify.c:364
-#, c-format
-msgid "Reverted '%s'\n"
-msgstr "å·²æ¢å¤â€œ%sâ€\n"
-
-#: ../svn/notify.c:370
-#, c-format
-msgid "Failed to revert '%s' -- try updating instead.\n"
-msgstr "无法æ¢å¤â€œ%sâ€-- 请改用更新试试。\n"
-
-#: ../svn/notify.c:378
-#, c-format
-msgid "Resolved conflicted state of '%s'\n"
-msgstr "“%sâ€çš„冲çªçŠ¶æ€å·²è§£å†³\n"
-
-#: ../svn/notify.c:473 ../svn/notify.c:513
-#, c-format
-msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s"
-msgstr "> å·²åº”ç”¨å— ## -%lu,%lu +%lu,%lu ##,å移 %s"
-
-#: ../svn/notify.c:490 ../svn/notify.c:527
-#, c-format
-msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s"
-msgstr "> å·²åº”ç”¨å— @@ -%lu,%lu +%lu,%lu @@ å移 %s"
-
-#: ../svn/notify.c:548
-#, c-format
-msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %lu (%s)\n"
-msgstr "> å·²åº”ç”¨å— ## -%lu,%lu +%lu,%lu ## 模糊 %lu (%s)\n"
-
-#: ../svn/notify.c:558
-#, c-format
-msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %lu\n"
-msgstr "> å·²åº”ç”¨å— @@ -%lu,%lu +%lu,%lu @@ 模糊 %lu\n"
-
-#: ../svn/notify.c:576
-#, c-format
-msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n"
-msgstr "> 已拒ç»å— ## -%lu,%lu +%lu,%lu ## (%s)\n"
+msgstr " 跳过的路径:%u\n"
-#: ../svn/notify.c:585
-#, c-format
-msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n"
-msgstr "> 已拒ç»çš„å— @@ -%lu,%lu +%lu,%lu @@\n"
+#: ../svn/notify.c:299
+#, fuzzy, c-format
+msgid "Removed external '%s': %s\n"
+msgstr "删除 “%s†上的é”。\n"
-#: ../svn/notify.c:599
-#, c-format
-msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n"
-msgstr "> å— ## -%lu,%lu +%lu,%lu ## å·²ç»åº”用 (%s)\n"
+#: ../svn/notify.c:304
+#, fuzzy, c-format
+msgid "Removed external '%s'\n"
+msgstr "删除 “%s†上的é”。\n"
-#: ../svn/notify.c:609
-#, c-format
-msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n"
-msgstr "> å— @@ -%lu,%lu +%lu,%lu @@ å·²ç»åº”用\n"
+#: ../svn/notify.c:310
+#, fuzzy, c-format
+msgid "Left local modifications as '%s'\n"
+msgstr "文件“%sâ€æœ‰æœ¬åœ°ä¿®æ”¹"
-#: ../svn/notify.c:669
-#, c-format
+#: ../svn/notify.c:768
+#, fuzzy, c-format
msgid ""
"\n"
-"Fetching external item into '%s':\n"
+"Performing info on external item at '%s':\n"
msgstr ""
"\n"
-"正在å–得外部项目至 '%s':\n"
-
-#: ../svn/notify.c:695
-#, c-format
-msgid "Error handling externals definition for '%s':"
-msgstr "处ç†å¤–部引用“%sâ€æ—¶å‡ºé”™ï¼š"
-
-#: ../svn/notify.c:708
-#, c-format
-msgid "Updating '%s':\n"
-msgstr "正在å‡çº§ '%s':\n"
-
-#: ../svn/notify.c:722
-#, c-format
-msgid "Exported external at revision %ld.\n"
-msgstr "已导出版本 %ld 的外部项目。\n"
-
-#: ../svn/notify.c:723
-#, c-format
-msgid "Exported revision %ld.\n"
-msgstr "已导出版本 %ld。\n"
-
-#: ../svn/notify.c:731
-#, c-format
-msgid "Checked out external at revision %ld.\n"
-msgstr "å–出版本 %ld 的外部项目。\n"
-
-#: ../svn/notify.c:732
-#, c-format
-msgid "Checked out revision %ld.\n"
-msgstr "å–出版本 %ld。\n"
-
-#: ../svn/notify.c:743
-#, c-format
-msgid "Updated external to revision %ld.\n"
-msgstr "更新外部项目至版本 %ld。\n"
-
-#: ../svn/notify.c:744
-#, c-format
-msgid "Updated to revision %ld.\n"
-msgstr "更新到版本 %ld。\n"
-
-#: ../svn/notify.c:752
-#, c-format
-msgid "External at revision %ld.\n"
-msgstr "外部项目版本 %ld。\n"
-
-#: ../svn/notify.c:753
-#, c-format
-msgid "At revision %ld.\n"
-msgstr "版本 %ld。\n"
-
-#: ../svn/notify.c:765
-#, c-format
-msgid "External export complete.\n"
-msgstr "完æˆå¤–部项目导出。\n"
-
-#: ../svn/notify.c:766
-#, c-format
-msgid "Export complete.\n"
-msgstr "完æˆå¯¼å‡ºã€‚\n"
-
-#: ../svn/notify.c:773
-#, c-format
-msgid "External checkout complete.\n"
-msgstr "完æˆå–出外部项目。\n"
-
-#: ../svn/notify.c:774
-#, c-format
-msgid "Checkout complete.\n"
-msgstr "完æˆå–出。\n"
+"对外部项目“%sâ€è¿›è¡ŒçŠ¶æ€æ£€æŸ¥:\n"
-#: ../svn/notify.c:781
-#, c-format
-msgid "External update complete.\n"
-msgstr "完æˆå¤–部项目更新。\n"
+#: ../svn/notify.c:1044
+#, fuzzy, c-format
+msgid "--- Copying from foreign repository URL '%s':\n"
+msgstr "--- 正在åˆå¹¶(从外部版本库) r%ld 到 “%sâ€ï¼š\n"
-#: ../svn/notify.c:782
-#, c-format
-msgid "Update complete.\n"
-msgstr "完æˆæ›´æ–°ã€‚\n"
+#: ../svn/notify.c:1051
+#, fuzzy, c-format
+msgid "Breaking move with source path '%s'\n"
+msgstr "å¤åˆ¶æºè·¯å¾„“%sâ€æ— æ•ˆ"
-#: ../svn/notify.c:798
-#, c-format
-msgid ""
-"\n"
-"Performing status on external item at '%s':\n"
+#: ../svn/notify.c:1057
+#, fuzzy, c-format
+msgid "Performing cleanup on external item at '%s'.\n"
msgstr ""
"\n"
"对外部项目“%sâ€è¿›è¡ŒçŠ¶æ€æ£€æŸ¥:\n"
-#: ../svn/notify.c:806
-#, c-format
-msgid "Status against revision: %6ld\n"
-msgstr "版本 %6ld 的状æ€\n"
-
-#: ../svn/notify.c:815
-#, c-format
-msgid "Sending copy of %s\n"
-msgstr "正在å‘é€å‰¯æœ¬ %s\n"
-
-#: ../svn/notify.c:816
-#, c-format
-msgid "Sending %s\n"
-msgstr "正在å‘é€ %s\n"
-
-#: ../svn/notify.c:827
-#, c-format
-msgid "Adding copy of (bin) %s\n"
-msgstr "正在增加 (二进制) %s\n"
-
-#: ../svn/notify.c:828
-#, c-format
-msgid "Adding (bin) %s\n"
-msgstr "正在增加 (二进制) %s\n"
-
-#: ../svn/notify.c:836
-#, c-format
-msgid "Adding copy of %s\n"
-msgstr "正在增加副本 %s\n"
-
-#: ../svn/notify.c:837
-#, c-format
-msgid "Adding %s\n"
-msgstr "正在增加 %s\n"
-
-#: ../svn/notify.c:846
-#, c-format
-msgid "Deleting copy of %s\n"
-msgstr "正在删除副本 %s\n"
-
-#: ../svn/notify.c:847
-#, c-format
-msgid "Deleting %s\n"
-msgstr "正在删除 %s\n"
-
-#: ../svn/notify.c:856
-#, c-format
-msgid "Replacing copy of %s\n"
-msgstr "正在替æ¢å‰¯æœ¬ %s\n"
-
-#: ../svn/notify.c:857
-#, c-format
-msgid "Replacing %s\n"
-msgstr "æ­£åœ¨æ›¿æ¢ %s\n"
-
-#: ../svn/notify.c:867 ../svnsync/sync.c:327
-#, c-format
-msgid "Transmitting file data "
-msgstr "传输文件数æ®"
-
-#: ../svn/notify.c:876 ../svnadmin/svnadmin.c:1728
-#, c-format
-msgid "'%s' locked by user '%s'.\n"
-msgstr "“%sâ€è¢«ç”¨æˆ·â€œ%sâ€é”定。\n"
-
-#: ../svn/notify.c:882
-#, c-format
-msgid "'%s' unlocked.\n"
-msgstr "“%sâ€è§£é™¤é”定。\n"
-
-#: ../svn/notify.c:909
-#, c-format
-msgid "--- Merging differences between repository URLs into '%s':\n"
-msgstr "--- 正在åˆå¹¶ç‰ˆæœ¬åº“ URL 之间的差异到 “%sâ€ï¼š\n"
-
-#: ../svn/notify.c:914
-#, c-format
-msgid "--- Merging r%ld into '%s':\n"
-msgstr "--- 正在åˆå¹¶ r%ld 到 “%sâ€:\n"
-
-#: ../svn/notify.c:918
-#, c-format
-msgid "--- Reverse-merging r%ld into '%s':\n"
-msgstr "--- 正在åå‘åˆå¹¶ r%ld 到 “%sâ€:\n"
-
-#: ../svn/notify.c:922
-#, c-format
-msgid "--- Merging r%ld through r%ld into '%s':\n"
-msgstr "--- 正在åˆå¹¶ r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
-
-#: ../svn/notify.c:928
-#, c-format
-msgid "--- Reverse-merging r%ld through r%ld into '%s':\n"
-msgstr "--- 正在åå‘åˆå¹¶ r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
-
-#: ../svn/notify.c:940
-#, c-format
-msgid "--- Recording mergeinfo for merge between repository URLs into '%s':\n"
-msgstr "--- 记录版本库 URL 之间的åˆå¹¶ä¿¡æ¯åˆ°â€œ%sâ€ï¼š\n"
-
-#: ../svn/notify.c:950
-#, c-format
-msgid "--- Recording mergeinfo for merge of r%ld into '%s':\n"
-msgstr "--- 记录åˆå¹¶ r%ld 到“%sâ€çš„ä¿¡æ¯:\n"
-
-#: ../svn/notify.c:955
-#, c-format
-msgid "--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"
-msgstr "--- 记录åå‘åˆå¹¶ r%ld 到“%sâ€çš„ä¿¡æ¯:\n"
-
-#: ../svn/notify.c:960
-#, c-format
-msgid "--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"
-msgstr "--- 记录åˆå¹¶ r%ld,ç»ç”± r%ld,到“%sâ€çš„ä¿¡æ¯:\n"
-
-#: ../svn/notify.c:965
-#, c-format
-msgid ""
-"--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"
-msgstr "--- 记录åå‘åˆå¹¶ r%ld,ç»ç”± r%ld,到“%sâ€çš„ä¿¡æ¯:\n"
-
-#: ../svn/notify.c:975
-#, c-format
-msgid "--- Eliding mergeinfo from '%s':\n"
-msgstr "--- 正在从 '%s' 删除åˆå¹¶ä¿¡æ¯:\n"
-
-#: ../svn/notify.c:983
-#, c-format
-msgid "--- Merging differences between foreign repository URLs into '%s':\n"
-msgstr "--- 正在åˆå¹¶å¤–部版本库 URL 之间的差异到 “%sâ€ï¼š\n"
-
-#: ../svn/notify.c:989
-#, c-format
-msgid "--- Merging (from foreign repository) r%ld into '%s':\n"
-msgstr "--- 正在åˆå¹¶(从外部版本库) r%ld 到 “%sâ€ï¼š\n"
-
-#: ../svn/notify.c:994
-#, c-format
-msgid "--- Reverse-merging (from foreign repository) r%ld into '%s':\n"
-msgstr "--- 正在åå‘åˆå¹¶(从外部版本库) r%ld 到 “%sâ€:\n"
-
-#: ../svn/notify.c:999
-#, c-format
-msgid "--- Merging (from foreign repository) r%ld through r%ld into '%s':\n"
-msgstr "--- 正在åˆå¹¶(从外部版本库) r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
-
-#: ../svn/notify.c:1005
-#, c-format
-msgid ""
-"--- Reverse-merging (from foreign repository) r%ld through r%ld into '%s':\n"
-msgstr "--- 正在åå‘åˆå¹¶(从外部版本库) r%ld,ç»ç”± r%ld,到 “%sâ€:\n"
-
-#: ../svn/notify.c:1041
-#, c-format
-msgid "property '%s' set on '%s'\n"
-msgstr "设置属性 “%s†于 “%sâ€\n"
-
-#: ../svn/notify.c:1049
-#, c-format
-msgid "property '%s' deleted from '%s'.\n"
-msgstr "删除属性 “%s†于 “%sâ€ã€‚\n"
-
-#: ../svn/notify.c:1057
-#, c-format
-msgid "Attempting to delete nonexistent property '%s' on '%s'\n"
-msgstr "试图删除ä¸å­˜åœ¨çš„属性“%sâ€äºŽâ€œ%sâ€\n"
+#: ../svn/notify.c:1064
+#, fuzzy, c-format
+msgid "done\n"
+msgstr "完æˆã€‚\n"
#: ../svn/notify.c:1066
#, c-format
-msgid "property '%s' set on repository revision %ld\n"
-msgstr "设定属性 “%s†于版本库版本 %ld\n"
-
-#: ../svn/notify.c:1074
-#, c-format
-msgid "property '%s' deleted from repository revision %ld\n"
-msgstr "删除属性 “%s†于版本库版本 %ld\n"
-
-#: ../svn/notify.c:1081
-#, c-format
-msgid "Upgraded '%s'\n"
-msgstr "å·²å‡çº§çš„“%sâ€\n"
-
-#: ../svn/notify.c:1087
-#, c-format
-msgid "Redirecting to URL '%s':\n"
-msgstr "正在é‡å®šå‘到 URL '%s':\n"
-
-#: ../svn/notify.c:1115
-#, c-format
-msgid "--- Copying from foreign repository URL '%s':\n"
-msgstr "--- 正在从外部版本库 URL '%s' å¤åˆ¶:\n"
-
-#: ../svn/notify.c:1124
-#, c-format
-msgid "Breaking move with source path '%s'\n"
-msgstr "æºè·¯å¾„“%sâ€ç§»åŠ¨å¤±è´¥\n"
+msgid "Committing transaction...\n"
+msgstr "正在读å–事务\n"
#: ../svn/propdel-cmd.c:88
#, c-format
@@ -9862,8 +11299,7 @@ msgid "Set new value for property '%s' on '%s'\n"
msgstr "属性 “%s†于 “%s†被设为新值\n"
#: ../svn/propedit-cmd.c:96 ../svn/propset-cmd.c:97
-msgid ""
-"--encoding option applies only to textual Subversion-controlled properties"
+msgid "--encoding option applies only to textual Subversion-controlled properties"
msgstr "--encoding 选项åªèƒ½ç”¨äºŽ Subversion 的文本属性"
#: ../svn/propedit-cmd.c:162
@@ -9895,13 +11331,13 @@ msgstr "“%sâ€ä¸åƒæ˜¯å·¥ä½œå‰¯æœ¬è·¯å¾„"
msgid "No changes to property '%s' on '%s'\n"
msgstr "属性 “%s†于 “%s†没有改å˜\n"
-#: ../svn/propget-cmd.c:66
+#: ../svn/propget-cmd.c:67
msgid "Error writing to stream"
msgstr "写入æµå‡ºé”™"
-#: ../svn/propget-cmd.c:186 ../svn/proplist-cmd.c:156
-#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1753
-#: ../svnlook/svnlook.c:1907
+#: ../svn/propget-cmd.c:187 ../svn/proplist-cmd.c:156
+#: ../svn/proplist-cmd.c:160 ../svnlook/svnlook.c:1769
+#: ../svnlook/svnlook.c:1923
#, fuzzy, c-format
msgid ""
"Inherited properties on '%s',\n"
@@ -9909,46 +11345,50 @@ msgid ""
msgstr "版本 %ld 上的未纳入版本控制的属性: \n"
#. Not a --revprop
-#: ../svn/propget-cmd.c:196 ../svn/proplist-cmd.c:175
-#: ../svnlook/svnlook.c:1789 ../svnlook/svnlook.c:1942
+#: ../svn/propget-cmd.c:197 ../svn/proplist-cmd.c:175
+#: ../svnlook/svnlook.c:1804 ../svnlook/svnlook.c:1958
#, c-format
msgid "Properties on '%s':\n"
msgstr "“%s†上的属性: \n"
-#: ../svn/propget-cmd.c:326
+#: ../svn/propget-cmd.c:328
msgid "--verbose cannot be used with --revprop or --strict or --xml"
msgstr "--verbose ä¸èƒ½ä¸Ž --revprop, --strict 或 --xml 共存"
-#: ../svn/propget-cmd.c:358 ../svn/proplist-cmd.c:214
+#: ../svn/propget-cmd.c:360 ../svn/proplist-cmd.c:214
+#, fuzzy
msgid "--show-inherited-props can't be used with --revprop"
-msgstr "--show-inherited-props ä¸èƒ½ä¸Ž --revprop 共存"
+msgstr "--reintegrate ä¸èƒ½ä¸Ž --record-only 共存"
-#: ../svn/propget-cmd.c:425
-msgid ""
-"Strict output of property values only available for single-target, non-"
-"recursive propget operations"
+#: ../svn/propget-cmd.c:373
+#, fuzzy, c-format
+msgid "Property '%s' not found on revision %s"
+msgstr "属性“%sâ€åœ¨ç‰ˆæœ¬ %ld 中找ä¸åˆ°"
+
+#: ../svn/propget-cmd.c:438
+msgid "Strict output of property values only available for single-target, non-recursive propget operations"
msgstr "精确的输出属性值åªé€‚用于å•ä¸€ç›®æ ‡çš„éžé€’å½’æ“作 propget"
+#: ../svn/propget-cmd.c:493
+#, fuzzy, c-format
+msgid "Property '%s' not found on '%s'"
+msgstr "属性“%sâ€åœ¨ç‰ˆæœ¬ %ld 中找ä¸åˆ°"
+
#: ../svn/proplist-cmd.c:246
#, c-format
msgid "Unversioned properties on revision %ld:\n"
msgstr "版本 %ld 上的未纳入版本控制的属性: \n"
#: ../svn/proplist-cmd.c:321
-msgid ""
-"Could not display properties of all targets because some targets don't exist"
+msgid "Could not display properties of all targets because some targets don't exist"
msgstr "因为一些目标ä¸å­˜åœ¨ï¼Œæ‰€ä»¥ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡çš„属性"
#: ../svn/proplist-cmd.c:326
-msgid ""
-"Could not display properties of all targets because some targets are not "
-"versioned"
+msgid "Could not display properties of all targets because some targets are not versioned"
msgstr "因为一些目标没有版本化,所以ä¸èƒ½æ˜¾ç¤ºå…¨éƒ¨ç›®æ ‡çš„属性"
#: ../svn/props.c:66
-msgid ""
-"Must specify the revision as a number, a date or 'HEAD' when operating on a "
-"revision property"
+msgid "Must specify the revision as a number, a date or 'HEAD' when operating on a revision property"
msgstr "æ“作版本属性时,必须指定数字ã€æ—¥æœŸå½¢å¼çš„版本å·æˆ–“HEADâ€ã€‚"
#: ../svn/props.c:73
@@ -9971,17 +11411,17 @@ msgstr ""
#: ../svn/props.c:177
#, c-format
msgid "(To set the '%s' property, re-run with '--force'.)"
-msgstr "(请使用“--forceâ€é‡æ–°æ‰§è¡Œï¼Œè®¾ç½®â€œ%sâ€å±žæ€§ã€‚)"
+msgstr ""
#: ../svn/props.c:182
#, c-format
msgid "(To edit the '%s' property, re-run with '--force'.)"
-msgstr "(请使用“--forceâ€é‡æ–°æ‰§è¡Œï¼Œç¼–辑“%sâ€å±žæ€§ã€‚)"
+msgstr ""
#: ../svn/props.c:188
#, c-format
msgid "(To use the '%s' property, re-run with '--force'.)"
-msgstr "(请使用“--forceâ€é‡æ–°æ‰§è¡Œï¼Œä½¿ç”¨â€œ%sâ€å±žæ€§ã€‚)"
+msgstr ""
#: ../svn/props.c:202
#, fuzzy, c-format
@@ -10043,26 +11483,26 @@ msgstr "无效的 “accept†å‚æ•°"
msgid "Failure occurred resolving one or more conflicts"
msgstr "处ç†ä¸€ä¸ªæˆ–更多的冲çªå¤±è´¥"
-#: ../svn/revert-cmd.c:77
+#: ../svn/revert-cmd.c:79
msgid "Try 'svn revert --depth infinity' instead?"
msgstr "å°è¯• “svn revert --depth infinityâ€ï¼Ÿ"
-#: ../svn/status-cmd.c:94
+#: ../svn/status-cmd.c:97
#, c-format
msgid " Text conflicts: %u\n"
msgstr " 正文冲çªï¼š%u\n"
-#: ../svn/status-cmd.c:98
+#: ../svn/status-cmd.c:101
#, c-format
msgid " Property conflicts: %u\n"
msgstr " 属性冲çªï¼š%u\n"
-#: ../svn/status-cmd.c:102
+#: ../svn/status-cmd.c:105
#, c-format
msgid " Tree conflicts: %u\n"
msgstr " 树冲çªï¼š%u\n"
-#: ../svn/status-cmd.c:388
+#: ../svn/status-cmd.c:399
#, c-format
msgid ""
"\n"
@@ -10071,137 +11511,70 @@ msgstr ""
"\n"
"--- 修改列表 '%s':\n"
-#: ../svn/status.c:302
+#: ../svn/status.c:318
#, c-format
msgid "swapped places with %s"
msgstr ""
-#: ../svn/status.c:316
+#: ../svn/status.c:333
#, c-format
msgid "moved from %s"
msgstr "移自 %s"
-#: ../svn/status.c:327
+#: ../svn/status.c:345
#, c-format
msgid "moved to %s"
msgstr "移到 %s"
-#: ../svn/svn.c:146
+#: ../svn/svn.c:157
msgid "force operation to run"
msgstr "强制æ“作è¿è¡Œ"
-#: ../svn/svn.c:148
+#: ../svn/svn.c:159
msgid "force validity of log message source"
msgstr "强制校验日志信æ¯èµ„æº"
-#: ../svn/svn.c:149 ../svn/svn.c:150 ../svnadmin/svnadmin.c:208
-#: ../svnadmin/svnadmin.c:211 ../svndumpfilter/svndumpfilter.c:1018
-#: ../svndumpfilter/svndumpfilter.c:1021 ../svnlook/svnlook.c:113
-#: ../svnlook/svnlook.c:125 ../svnsync/svnsync.c:243 ../svnsync/svnsync.c:245
-msgid "show help on a subcommand"
-msgstr "显示å­å‘½ä»¤å¸®åŠ©ä¿¡æ¯"
-
-#: ../svn/svn.c:151
+#: ../svn/svn.c:162
msgid "specify log message ARG"
msgstr "指定日志信æ¯ARG"
-#: ../svn/svn.c:152
-msgid "print nothing, or only summary information"
-msgstr "ä¸æ‰“å°ä¿¡æ¯ï¼Œæˆ–åªæ‰“å°æ¦‚è¦ä¿¡æ¯"
-
-#: ../svn/svn.c:153
-msgid "descend recursively, same as --depth=infinity"
-msgstr "å‘下递归,与 --depth=infinity 相åŒ"
-
-#: ../svn/svn.c:154
-msgid "obsolete; try --depth=files or --depth=immediates"
-msgstr "过时;å°è¯• --depth=files 或 --depth=immediates"
-
-#: ../svn/svn.c:156
-msgid ""
-"the change made by revision ARG (like -r ARG-1:ARG)\n"
-" If ARG is negative this is like -r ARG:ARG-1\n"
-" If ARG is of the form ARG1-ARG2 then this is "
-"like\n"
-" ARG1:ARG2, where ARG1 is inclusive"
-msgstr ""
-"版本 ARG (å¦‚åŒ -r ARG-1:ARG) åšçš„修改\n"
-" 如果 ARG 为负数则等价于 -r ARG:"
-"ARG-1 如果 ARG çš„æ ¼å¼æ˜¯ ARG1-ARG2,那么它等价于\n"
-" ARG1:ARG2ï¼ŒåŒ…å« ARG1"
-
-#: ../svn/svn.c:164
-msgid ""
-"ARG (some commands also take ARG1:ARG2 range)\n"
-" A revision argument can be one of:\n"
-" NUMBER revision number\n"
-" '{' DATE '}' revision at start of the date\n"
-" 'HEAD' latest in repository\n"
-" 'BASE' base rev of item's working "
-"copy\n"
-" 'COMMITTED' last commit at or before BASE\n"
-" 'PREV' revision just before COMMITTED"
-msgstr ""
-"ARG (一些命令也接å—ARG1:ARG2范围)\n"
-" 版本å‚æ•°å¯ä»¥æ˜¯å¦‚下之一: \n"
-" NUMBER 版本å·\n"
-" '{' DATE '}' 在指定时间以åŽçš„版本\n"
-" 'HEAD' 版本库中的最新版本\n"
-" 'BASE' 工作副本的基线版本\n"
-" 'COMMITTED' 最åŽæ交或基线之å‰\n"
-" 'PREV' COMMITTEDçš„å‰ä¸€ç‰ˆæœ¬"
-
-#: ../svn/svn.c:179
+#: ../svn/svn.c:190
msgid "read log message from file ARG"
msgstr "从文件ARG读å–日志信æ¯"
-#: ../svn/svn.c:181
+#: ../svn/svn.c:192
msgid "give output suitable for concatenation"
msgstr "给予适åˆä¸²è”的输出"
-#: ../svn/svn.c:183
+#: ../svn/svn.c:194
msgid "treat value as being in charset encoding ARG"
msgstr "å°†ARG的值视为字符编ç "
-#: ../svn/svn.c:184 ../svnadmin/svnadmin.c:214
-#: ../svndumpfilter/svndumpfilter.c:1024 ../svnlook/svnlook.c:167
-#: ../svnrdump/svnrdump.c:144 ../svnserve/svnserve.c:288
-#: ../svnsync/svnsync.c:241 ../svnversion/svnversion.c:140
-msgid "show program version information"
-msgstr "显示程åºç‰ˆæœ¬ä¿¡æ¯"
-
-#: ../svn/svn.c:185
-msgid "print extra information"
-msgstr "打å°é™„加信æ¯"
-
-#: ../svn/svn.c:186
+#: ../svn/svn.c:197
msgid "display update information"
msgstr "显示更新信æ¯"
-#: ../svn/svn.c:187 ../svnrdump/svnrdump.c:128
-msgid "specify a username ARG"
-msgstr "指定用户å称 ARG"
-
-#: ../svn/svn.c:188 ../svnrdump/svnrdump.c:130
-msgid "specify a password ARG"
-msgstr "æŒ‡å®šå¯†ç  ARG"
+#: ../svn/svn.c:200
+#, fuzzy
+msgid ""
+"specify a password ARG (caution: on many operating\n"
+" systems, other users will be able to see this)"
+msgstr ""
+"æŒ‡å®šå¯†ç  ARG (å·²ç»è¿‡æ—¶;\n"
+" å‚看 --source-password å’Œ --sync-password)"
-#: ../svn/svn.c:190
+#: ../svn/svn.c:204
#, fuzzy
msgid ""
"Specify differencing options for external diff or\n"
-" internal diff or blame. Default: '-u'. Options "
-"are\n"
-" separated by spaces. Internal diff and blame "
-"take:\n"
-" -u, --unified: Show 3 lines of unified "
-"context\n"
+" internal diff or blame. Default: '-u'. Options are\n"
+" separated by spaces. Internal diff and blame take:\n"
+" -u, --unified: Show 3 lines of unified context\n"
" -b, --ignore-space-change: Ignore changes in\n"
" amount of white space\n"
-" -w, --ignore-all-space: Ignore all white "
-"space\n"
-" --ignore-eol-style: Ignore changes in EOL "
-"style\n"
+" -w, --ignore-all-space: Ignore all white space\n"
+" --ignore-eol-style: Ignore changes in EOL style\n"
+" -U ARG, --context ARG: Show ARG lines of context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
"缺çœ: “-uâ€ã€‚当 Subversion 调用外部比较程åºæ—¶ï¼ŒARG 直接传给它。但是当\n"
@@ -10218,19 +11591,7 @@ msgstr ""
" -p (--show-c-function):\n"
" 在比较输出中显示 C 函数å称。"
-#: ../svn/svn.c:208
-msgid "pass contents of file ARG as additional args"
-msgstr "传递文件 ARG 内容为附件å‚æ•°"
-
-#: ../svn/svn.c:210
-msgid ""
-"limit operation by depth ARG ('empty', 'files',\n"
-" 'immediates', or 'infinity')"
-msgstr ""
-"é™åˆ¶æ“作深度是 ARG ('empty', 'files',\n"
-" 'immediates', 或 'infinity')"
-
-#: ../svn/svn.c:214
+#: ../svn/svn.c:230
msgid ""
"set new working copy depth to ARG ('exclude',\n"
" 'empty', 'files', 'immediates', or 'infinity')"
@@ -10238,118 +11599,79 @@ msgstr ""
"设置工作副本的新深度为 ARG('exclude',\n"
" 'empty', 'files', 'immediates', 或 'infinity')"
-#: ../svn/svn.c:217 ../svnlook/svnlook.c:170
+#: ../svn/svn.c:233 ../svnlook/svnlook.c:175
msgid "output in XML"
msgstr "输出为 XML"
-#: ../svn/svn.c:218
-msgid "use strict semantics"
-msgstr "使用严格的语法"
-
-#: ../svn/svn.c:220
-msgid "do not cross copies while traversing history"
-msgstr "查看历å²ä¸è¦è·¨è¶Šä¸åŒçš„副本"
-
-#: ../svn/svn.c:222
+#: ../svn/svn.c:238
#, fuzzy
msgid ""
"disregard default and svn:ignore and\n"
" svn:global-ignores property ignores"
msgstr "忽略默认值和 svn:ignore 属性"
-#: ../svn/svn.c:226 ../svnrdump/svnrdump.c:140 ../svnsync/svnsync.c:187
-msgid "do not cache authentication tokens"
-msgstr "ä¸è¦ç¼“存用户认è¯ä»¤ç‰Œ"
-
-#: ../svn/svn.c:228 ../svnrdump/svnrdump.c:154 ../svnsync/svnsync.c:197
-msgid ""
-"accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but "
-"only\n"
-" with '--non-interactive')"
-msgstr ""
-"ä¸æ示的接å—未知的è¯ä¹¦é¢å‘机构å‘行的 SSL æœåŠ¡å™¨è¯ä¹¦(åªç”¨äºŽé€‰é¡¹ “--non-"
-"interactiveâ€)"
-
-#: ../svn/svn.c:234 ../svnrdump/svnrdump.c:132 ../svnsync/svnsync.c:179
+#: ../svn/svn.c:268 ../svnrdump/svnrdump.c:145 ../svnsync/svnsync.c:189
msgid ""
"do no interactive prompting (default is to prompt\n"
" only if standard input is a terminal device)"
msgstr ""
-#: ../svn/svn.c:238 ../svnrdump/svnrdump.c:136 ../svnsync/svnsync.c:183
+#: ../svn/svn.c:272 ../svnrdump/svnrdump.c:149 ../svnsync/svnsync.c:193
#, fuzzy
msgid ""
"do interactive prompting even if standard input\n"
" is not a terminal device"
msgstr "如果版本库被其他进程å ç”¨ï¼Œç­‰å¾…而ä¸ç›´æŽ¥é€€å‡º"
-#: ../svn/svn.c:242
+#: ../svn/svn.c:276
msgid "try operation but make no changes"
msgstr "å°è¯•æ“作但没有修改"
-#: ../svn/svn.c:244
+#: ../svn/svn.c:278
msgid "disable merge tracking; diff nodes as if related"
msgstr ""
-#: ../svn/svn.c:246
+#: ../svn/svn.c:280
msgid "ignore externals definitions"
msgstr "忽略外部项目"
-#: ../svn/svn.c:247
+#: ../svn/svn.c:281
msgid "use ARG as merge command"
msgstr "使用 ARG 作为åˆå¹¶å‘½ä»¤"
-#: ../svn/svn.c:248
+#: ../svn/svn.c:282
msgid "use ARG as external editor"
msgstr "使用 ARG 作为外部编辑器"
-#: ../svn/svn.c:250
+#: ../svn/svn.c:284
msgid "merge only mergeinfo differences"
msgstr "åªåˆå¹¶åˆå¹¶ä¿¡æ¯çš„差异"
-#: ../svn/svn.c:251
+#: ../svn/svn.c:285
msgid "use ARG as the older target"
msgstr "使用 ARG 作为旧目标"
-#: ../svn/svn.c:252
+#: ../svn/svn.c:286
msgid "use ARG as the newer target"
msgstr "使用 ARG 作为新目标"
-#: ../svn/svn.c:254
+#: ../svn/svn.c:288
msgid "operate on a revision property (use with -r)"
msgstr "在版本属性上æ“作(使用-rå‚æ•°)"
-#: ../svn/svn.c:255
+#: ../svn/svn.c:289
msgid "relocate via URL-rewriting"
msgstr "通过URL改写é‡æ–°å®šä½"
-#: ../svn/svn.c:257 ../svnadmin/svnadmin.c:256 ../svnrdump/svnrdump.c:126
-#: ../svnsync/svnsync.c:211
-msgid "read user configuration files from directory ARG"
-msgstr "从目录 ARG 读å–用户é…置文件"
-
-#: ../svn/svn.c:259 ../svnrdump/svnrdump.c:146 ../svnsync/svnsync.c:213
-msgid ""
-"set user configuration option in the format:\n"
-" FILE:SECTION:OPTION=[VALUE]\n"
-" For example:\n"
-" servers:global:http-library=serf"
-msgstr ""
-"以下属格å¼è®¾ç½®ç”¨æˆ·é…置选项:\n"
-" FILE:SECTION:OPTION=[VALUE]\n"
-" 例如:\n"
-" servers:global:http-library=serf"
-
-#: ../svn/svn.c:266
+#: ../svn/svn.c:300
msgid "enable automatic properties"
msgstr "å¯ç”¨è‡ªåŠ¨å±žæ€§"
-#: ../svn/svn.c:267
+#: ../svn/svn.c:301
msgid "disable automatic properties"
msgstr "关闭自动属性"
-#: ../svn/svn.c:269
+#: ../svn/svn.c:303
msgid ""
"use a different EOL marker than the standard\n"
" system marker for files with the svn:eol-style\n"
@@ -10360,75 +11682,45 @@ msgstr ""
" 系统中立的文件标记 svn:eol-style 属性å–值为 “nativeâ€ã€‚\n"
" ARG å¯ä»¥æ˜¯ä»¥ä¸‹ä¹‹ä¸€â€œLFâ€ï¼Œâ€œCRâ€ï¼Œâ€œCRLFâ€"
-#: ../svn/svn.c:276
-msgid "maximum number of log entries"
-msgstr "日值项最大值"
-
-#: ../svn/svn.c:277
+#: ../svn/svn.c:311
msgid "don't unlock the targets"
msgstr "ä¸è¦è§£é”目标"
-#: ../svn/svn.c:278
+#: ../svn/svn.c:312
msgid "remove changelist association"
msgstr "删除修改列表耦åˆ"
-#: ../svn/svn.c:280
+#: ../svn/svn.c:314
msgid "operate only on members of changelist ARG"
msgstr "åªèƒ½å¯¹ä¿®æ”¹åˆ—表 ARG çš„æˆå‘˜æ“作"
-#: ../svn/svn.c:282
+#: ../svn/svn.c:316
msgid "don't delete changelists after commit"
msgstr "ä¸è¦åœ¨æ交åŽåˆ é™¤ä¿®æ”¹åˆ—表"
-#: ../svn/svn.c:283
+#: ../svn/svn.c:317
msgid "keep path in working copy"
msgstr "在工作副本中ä¿ç•™è·¯å¾„"
-#: ../svn/svn.c:285
-msgid "retrieve all revision properties"
-msgstr "获å–所有版本属性"
-
-#: ../svn/svn.c:287
-msgid "retrieve no revision properties"
-msgstr "没有找回版本属性"
-
-#: ../svn/svn.c:289
-msgid ""
-"set revision property ARG in new revision\n"
-" using the name[=value] format"
-msgstr ""
-"在新版本设置版本属性 ARG\n"
-" ä½¿ç”¨æ ¼å¼ name[=value]"
-
-#: ../svn/svn.c:292
+#: ../svn/svn.c:326
msgid "make intermediate directories"
msgstr "创建中间目录"
-#: ../svn/svn.c:294
-msgid ""
-"use/display additional information from merge\n"
-" history"
-msgstr "从åˆå¹¶åŽ†å²ä½¿ç”¨/显示é¢å¤–ä¿¡æ¯"
-
-#: ../svn/svn.c:298
+#: ../svn/svn.c:332
msgid ""
"specify automatic conflict resolution action\n"
-" ('postpone', 'working', 'base', 'mine-"
-"conflict',\n"
+" ('postpone', 'working', 'base', 'mine-conflict',\n"
" 'theirs-conflict', 'mine-full', 'theirs-full',\n"
" 'edit', 'launch')\n"
-" (shorthand: 'p', 'mc', 'tc', 'mf', 'tf', 'e', "
-"'l')"
+" (shorthand: 'p', 'mc', 'tc', 'mf', 'tf', 'e', 'l')"
msgstr ""
"指定自动解决冲çªåŠ¨ä½œ\n"
-" ('postpone', 'working', 'base', 'mine-"
-"conflict',\n"
+" ('postpone', 'working', 'base', 'mine-conflict',\n"
" 'theirs-conflict', 'mine-full', 'theirs-full',\n"
" 'edit', 'launch')\n"
-" (shorthand: 'p', 'mc', 'tc', 'mf', 'tf', 'e', "
-"'l')"
+" (shorthand: 'p', 'mc', 'tc', 'mf', 'tf', 'e', 'l')"
-#: ../svn/svn.c:309
+#: ../svn/svn.c:343
msgid ""
"specify which collection of revisions to display\n"
" ('merged', 'eligible')"
@@ -10436,22 +11728,20 @@ msgstr ""
"指定显示哪个版本集åˆ\n"
" ('merged', 'eligible')"
-#: ../svn/svn.c:313
+#: ../svn/svn.c:347
msgid "deprecated"
-msgstr "å·²ç»æ·˜æ±°"
+msgstr ""
-#: ../svn/svn.c:315
+#: ../svn/svn.c:349
msgid ""
"number of leading path components to strip from\n"
" paths parsed from the patch file. --strip 0\n"
" is the default and leaves paths unmodified.\n"
" --strip 1 would change the path\n"
-" 'doc/fudge/crunchy.html' to 'fudge/crunchy."
-"html'.\n"
+" 'doc/fudge/crunchy.html' to 'fudge/crunchy.html'.\n"
" --strip 2 would leave just 'crunchy.html'\n"
" The expected component separator is '/' on all\n"
-" platforms. A leading '/' counts as one "
-"component."
+" platforms. A leading '/' counts as one component."
msgstr ""
"需è¦ä»Žè¡¥ä¸æ–‡ä»¶ä¸­çš„路径中è£å‰ªçš„å‰å¯¼è·¯å¾„组件数é‡ã€‚\n"
" 默认 --strip 0 ä¸ä¿®æ”¹è·¯å¾„。指定 --strip 1 会将\n"
@@ -10460,65 +11750,66 @@ msgstr ""
" 'crunchy.html' 。在所有平å°ä¸­æœŸæœ›çš„组件分隔符\n"
" 都是 '/'。å‰å¯¼ '/' 被计算为一个组件。"
-#: ../svn/svn.c:331
+#: ../svn/svn.c:365
msgid "don't expand keywords"
msgstr "ä¸è¦å±•å¼€å…³é”®å­—"
-#: ../svn/svn.c:333
+#: ../svn/svn.c:367
msgid "apply the unidiff in reverse"
msgstr "åå‘应用补ä¸"
-#: ../svn/svn.c:335
+#: ../svn/svn.c:369
msgid "ignore whitespace during pattern matching"
msgstr "在模å¼åŒ¹é…时,忽略空白"
-#: ../svn/svn.c:336
+#: ../svn/svn.c:370
msgid "produce diff output"
msgstr "产生差异输出"
#. maps to show_diff
#. diff options
-#: ../svn/svn.c:338 ../svnlook/svnlook.c:137
+#: ../svn/svn.c:372 ../svnlook/svnlook.c:139
msgid "use ARG as diff command"
msgstr "使用 ARG 作为比较命令"
-#: ../svn/svn.c:340
+#: ../svn/svn.c:374
msgid "override diff-cmd specified in config file"
msgstr "覆盖é…置文件中指定的 diff-cmd"
-#: ../svn/svn.c:342 ../svnlook/svnlook.c:131
+#: ../svn/svn.c:376 ../svnlook/svnlook.c:133
msgid "do not print differences for added files"
msgstr "ä¸è¦è¾“出增加文件造æˆçš„差异"
-#: ../svn/svn.c:344 ../svnlook/svnlook.c:134
+#: ../svn/svn.c:378 ../svnlook/svnlook.c:136
msgid "do not print differences for deleted files"
msgstr "ä¸è¦è¾“出删除文件造æˆçš„差异"
-#: ../svn/svn.c:346
+#: ../svn/svn.c:380
msgid "don't diff copied or moved files with their source"
msgstr "请ä¸è¦å°†å¤åˆ¶æˆ–移动的文件与其æºæ–‡ä»¶æ¯”较"
-#: ../svn/svn.c:348
+#: ../svn/svn.c:382
msgid "diff unrelated nodes as delete and add"
msgstr ""
-#: ../svn/svn.c:349
+#: ../svn/svn.c:383
msgid "show a summary of the results"
msgstr "显示结果的概è¦"
-#: ../svn/svn.c:351
+#: ../svn/svn.c:385
msgid "use git's extended diff format"
msgstr "使用 git 的扩展差异格å¼"
-#: ../svn/svn.c:353 ../svnlook/svnlook.c:140
+#: ../svn/svn.c:387 ../svnlook/svnlook.c:142
msgid "ignore properties during the operation"
msgstr "æ“作时忽略属性"
-#: ../svn/svn.c:355 ../svnlook/svnlook.c:143
+#: ../svn/svn.c:389 ../svnlook/svnlook.c:145
+#, fuzzy
msgid "show only properties during the operation"
-msgstr "æ“作时åªæ˜¾ç¤ºå±žæ€§"
+msgstr "æ“作时忽略属性"
-#: ../svn/svn.c:357
+#: ../svn/svn.c:391
#, fuzzy
msgid ""
"generate diff suitable for generic third-party\n"
@@ -10528,7 +11819,7 @@ msgstr ""
"生æˆé€‚用于第三方工具的差异格å¼ï¼›å½“å‰ç­‰ä»·äºŽ\n"
" --show-copies-as-adds --ignore-properties\n"
-#: ../svn/svn.c:365
+#: ../svn/svn.c:399
#, fuzzy
msgid ""
"Allow operation on mixed-revision working copy.\n"
@@ -10539,27 +11830,48 @@ msgstr ""
" ä¸å»ºè®®ä½¿ç”¨æ­¤é€‰é¡¹!\n"
" 请先执行 'svn update' 。"
-#: ../svn/svn.c:371
+#: ../svn/svn.c:405
+#, fuzzy
msgid ""
-"Also commit file and dir externals reached by\n"
-" recursion. This does not include externals with "
-"a\n"
-" fixed revision. (See the svn:externals property)"
-msgstr ""
+"also operate on externals defined by\n"
+" svn:externals properties"
+msgstr "如果版本库被其他进程å ç”¨ï¼Œç­‰å¾…而ä¸ç›´æŽ¥é€€å‡º"
-#: ../svn/svn.c:377
+#: ../svn/svn.c:409
+#, fuzzy
msgid "retrieve target's inherited properties"
-msgstr "获å–目标继承的属性"
+msgstr "获å–所有版本属性"
-#: ../svn/svn.c:379
+#: ../svn/svn.c:411
msgid "use ARG as search pattern (glob syntax)"
msgstr ""
-#: ../svn/svn.c:381
+#: ../svn/svn.c:413
msgid "combine ARG with the previous search pattern"
msgstr ""
-#: ../svn/svn.c:429
+#: ../svn/svn.c:415
+msgid "show revision log message, author and date"
+msgstr ""
+
+#: ../svn/svn.c:417
+#, fuzzy
+msgid "remove unversioned items"
+msgstr "ä¸æ‰“å°æœªç‰ˆæœ¬æŽ§åˆ¶çš„æ¡ç›®"
+
+#: ../svn/svn.c:418
+msgid "remove ignored items"
+msgstr ""
+
+#: ../svn/svn.c:419 ../svnlook/svnlook.c:148 ../svnversion/svnversion.c:140
+msgid "do not output the trailing newline"
+msgstr "ä¸è¾“出其åŽçš„æ¢è¡Œç¬¦"
+
+#: ../svn/svn.c:420
+msgid "show cached passwords"
+msgstr ""
+
+#: ../svn/svn.c:471
msgid ""
"Put files and directories under version control, scheduling\n"
"them for addition to repository. They will be added in next commit.\n"
@@ -10568,11 +11880,40 @@ msgstr ""
"把文件和目录纳入版本控制,通过调度加到版本库。它们会在下一次æ交时加入。\n"
"用法: add 路径...\n"
-#: ../svn/svn.c:434
+#: ../svn/svn.c:476
msgid "add intermediate parents"
msgstr "增加中间父目录"
-#: ../svn/svn.c:437
+#: ../svn/svn.c:479
+msgid ""
+"Manage cached authentication credentials.\n"
+"usage: 1. svn auth [PATTERN ...]\n"
+"usage: 2. svn auth --remove PATTERN [PATTERN ...]\n"
+"\n"
+" With no arguments, list all cached authentication credentials.\n"
+" Authentication credentials include usernames, passwords,\n"
+" SSL certificates, and SSL client-certificate passphrases.\n"
+" If PATTERN is specified, only list credentials with attributes matching one\n"
+" or more patterns. With the --remove option, remove cached authentication\n"
+" credentials matching one or more patterns.\n"
+"\n"
+" If more than one pattern is specified credentials are considered only they\n"
+" match all specified patterns. Patterns are matched case-sensitively and may\n"
+" contain glob wildcards:\n"
+" ? matches any single character\n"
+" * matches a sequence of arbitrary characters\n"
+" [abc] matches any of the characters listed inside the brackets\n"
+" Note that wildcards will usually need to be quoted or escaped on the\n"
+" command line because many command shells will interfere by trying to\n"
+" expand them.\n"
+msgstr ""
+
+#: ../svn/svn.c:500
+#, fuzzy
+msgid "remove matching authentication credentials"
+msgstr "ä¸è¦ç¼“存用户认è¯ä»¤ç‰Œ"
+
+#: ../svn/svn.c:505
msgid ""
"Output the content of specified files or\n"
"URLs with revision and author information in-line.\n"
@@ -10588,7 +11929,7 @@ msgstr ""
" 如果指定了版本,将从指定的版本开始查找。\n"
" \n"
-#: ../svn/svn.c:446
+#: ../svn/svn.c:514
msgid ""
"Output the content of specified files or URLs.\n"
"usage: cat TARGET[@REV]...\n"
@@ -10602,7 +11943,7 @@ msgstr ""
" 如果指定了版本,将从指定的版本开始查找。\n"
" \n"
-#: ../svn/svn.c:454
+#: ../svn/svn.c:522
msgid ""
"Associate (or dissociate) changelist CLNAME with the named files.\n"
"usage: 1. changelist CLNAME PATH...\n"
@@ -10612,7 +11953,7 @@ msgstr ""
"使用: 1. changelist CLNAME PATH...\n"
" 2. changelist --remove PATH...\n"
-#: ../svn/svn.c:460
+#: ../svn/svn.c:528
msgid ""
"Check out a working copy from a repository.\n"
"usage: checkout URL[@REV]... [PATH]\n"
@@ -10649,24 +11990,39 @@ msgstr ""
"\n"
" 如果使用了 “--force†选项,在工作副本中未版本控制的障ç¢è·¯å¾„,ä¸ä¼šè‡ªåŠ¨å¯¼\n"
" 致签出失败。 如果障ç¢è·¯å¾„与版本库中的对应路径类型相åŒ(文件或目录),它将æˆ\n"
-" 为å—版本控制的路径,但是内容ä¸æ”¹å˜ã€‚它æ„味ç€éšœç¢è·¯å¾„çš„å­©å­ï¼Œå¦‚果也是障ç¢"
-"è·¯\n"
-" 径,那么也会å—版本控制。对于障ç¢è·¯å¾„中的文件,如果与版本库内的ä¸åŒï¼Œå°†è§†ä¸º"
-"å·¥\n"
+" 为å—版本控制的路径,但是内容ä¸æ”¹å˜ã€‚它æ„味ç€éšœç¢è·¯å¾„çš„å­©å­ï¼Œå¦‚果也是障ç¢è·¯\n"
+" 径,那么也会å—版本控制。对于障ç¢è·¯å¾„中的文件,如果与版本库内的ä¸åŒï¼Œå°†è§†ä¸ºå·¥\n"
" 作副本å‘生本地修改。版本库中的所有属性都应用于障ç¢è·¯å¾„。\n"
"\n"
" å‚è§ â€œsvn help update†以获å–报告执行动作的字符列表。\n"
-#: ../svn/svn.c:487
+#: ../svn/svn.c:555
msgid ""
-"Recursively clean up the working copy, removing locks, resuming\n"
+"Recursively clean up the working copy, removing write locks, resuming\n"
"unfinished operations, etc.\n"
"usage: cleanup [WCPATH...]\n"
+"\n"
+" By default, finish any unfinished business in the working copy at WCPATH,\n"
+" and remove write locks (shown as 'L' by the 'svn status' command) from\n"
+" the working copy. Usually, this is only necessary if a Subversion client\n"
+" has crashed while using the working copy, leaving it in an unusable state.\n"
+"\n"
+" WARNING: There is no mechanism that will protect write locks still\n"
+" being used by other Subversion clients. Running this command\n"
+" while another client is using the working copy can corrupt\n"
+" the working copy beyond repair!\n"
+"\n"
+" If the --remove-unversioned option or the --remove-ignored option\n"
+" is given, remove any unversioned or ignored items within WCPATH.\n"
+" To prevent accidental working copy corruption, unversioned or ignored\n"
+" items can only be removed if the working copy is not already locked\n"
+" for writing by another Subversion client.\n"
+" Note that the 'svn status' command shows unversioned items as '?',\n"
+" and ignored items as 'I' if the --no-ignore option is given to it.\n"
msgstr ""
-"递归清ç†å·¥ä½œå‰¯æœ¬ï¼Œåˆ é™¤é”,继续未完æˆæ“作,等等。\n"
-"用法: cleanup [路径...]\n"
-#: ../svn/svn.c:493
+#: ../svn/svn.c:580
+#, fuzzy
msgid ""
"Send changes from your working copy to the repository.\n"
"usage: commit [PATH...]\n"
@@ -10675,6 +12031,10 @@ msgid ""
" given by a --message or --file option, an editor will be started.\n"
" If any targets are (or contain) locked items, those will be\n"
" unlocked after a successful commit.\n"
+"\n"
+" If --include-externals is given, also commit file and directory\n"
+" externals reached by recursion. Do not commit externals with a\n"
+" fixed revision.\n"
msgstr ""
"把工作副本的修改æ交到版本库。\n"
"用法: commit [路径...]\n"
@@ -10683,7 +12043,7 @@ msgstr ""
" 选项,编辑器会被å¯åŠ¨ã€‚如果有目标是é”定的或者包å«é”定æ¡ç›®ï¼Œåˆ™åœ¨æˆåŠŸ\n"
" æ交åŽä¼šè¢«è§£é”。\n"
-#: ../svn/svn.c:504
+#: ../svn/svn.c:595
#, fuzzy
msgid ""
"Copy files and directories in a working copy or repository.\n"
@@ -10719,7 +12079,7 @@ msgstr ""
"æ“作ä¸ä¼šä¸Žç‰ˆæœ¬åº“通信。åŒæ ·åœ°ï¼Œåœ¨ç¼ºçœæƒ…况下,ä¸èƒ½ä»Žå¤åˆ¶æºåˆ°ç›®çš„地传播åˆ\n"
"并跟踪信æ¯ã€‚\n"
-#: ../svn/svn.c:523
+#: ../svn/svn.c:614
msgid ""
"Remove files and directories from version control.\n"
"usage: 1. delete PATH...\n"
@@ -10747,14 +12107,13 @@ msgstr ""
"\n"
" 2ã€æ¯ä¸ª URL 指定的项目会通过立å³æ交从版本库中删除。\n"
-#: ../svn/svn.c:539
+#: ../svn/svn.c:630
#, fuzzy
msgid ""
"Display local changes or differences between two revisions or paths.\n"
"usage: 1. diff\n"
" 2. diff [-c M | -r N[:M]] [TARGET[@REV]...]\n"
-" 3. diff [-r N[:M]] --old=OLD-TGT[@OLDREV] [--new=NEW-TGT[@NEWREV]] "
-"\\\n"
+" 3. diff [-r N[:M]] --old=OLD-TGT[@OLDREV] [--new=NEW-TGT[@NEWREV]] \\\n"
" [PATH...]\n"
" 4. diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]\n"
" 5. diff OLD-URL[@OLDREV] NEW-PATH[@NEWREV]\n"
@@ -10773,8 +12132,7 @@ msgid ""
" NEW-TGT as it was seen in NEWREV. PATHs, if given, are relative to\n"
" OLD-TGT and NEW-TGT and restrict the output to differences for those\n"
" paths. OLD-TGT and NEW-TGT may be working copy paths or URL[@REV].\n"
-" NEW-TGT defaults to OLD-TGT if not specified. -r N makes OLDREV "
-"default\n"
+" NEW-TGT defaults to OLD-TGT if not specified. -r N makes OLDREV default\n"
" to N, -r N:M makes OLDREV default to N and NEWREV default to M.\n"
" If OLDREV or NEWREV are not specified, they default to WORKING for\n"
" working copy targets and to HEAD for URL targets.\n"
@@ -10785,10 +12143,8 @@ msgid ""
" Diffing unversioned targets against URL targets is not supported.\n"
"\n"
" 4. Shorthand for 'svn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]'\n"
-" 5. Shorthand for 'svn diff --old=OLD-URL[@OLDREV] --new=NEW-PATH"
-"[@NEWREV]'\n"
-" 6. Shorthand for 'svn diff --old=OLD-PATH[@OLDREV] --new=NEW-URL"
-"[@NEWREV]'\n"
+" 5. Shorthand for 'svn diff --old=OLD-URL[@OLDREV] --new=NEW-PATH[@NEWREV]'\n"
+" 6. Shorthand for 'svn diff --old=OLD-PATH[@OLDREV] --new=NEW-URL[@NEWREV]'\n"
msgstr ""
"显示两个版本或路径的差异。\n"
"用法: 1. diff [-c M | -r N[:M]] [TARGET[@REV]...]\n"
@@ -10798,20 +12154,18 @@ msgstr ""
"\n"
" 1ã€æ˜¾ç¤ºç‰ˆæœ¬ REV 中 TARGET 在两个ä¸åŒçš„版本之间的差异。TARGET è¦ä¹ˆå…¨æ˜¯\n"
" 工作副本路径,è¦ä¹ˆå…¨æ˜¯ URL。如果 TARGET 是工作副本路径,N 默认为\n"
-" BASE,M 默认为工作副本;如果 TARGET 是 URL,N 必须指定, M 默认为 "
-"HEAD。\n"
+" BASE,M 默认为工作副本;如果 TARGET 是 URL,N 必须指定, M 默认为 HEAD。\n"
" “-c M†等价于 “-r M-1:Mâ€ï¼Œâ€œ-c -M†等价于 “-r M:M-1â€ã€‚\n"
"\n"
" 2ã€æ˜¾ç¤ºæ–°æ—§ç‰ˆæœ¬ä¸­å¯¹åº”目标的差异。PATH 是相对于新旧目标的相对路径,\n"
-" 它é™åˆ¶åªè¾“出这些路径上的差异。新旧目标å¯ä»¥æ˜¯å·¥ä½œå‰¯æœ¬è·¯å¾„æˆ–åœ°å€ URL"
-"[@REV]。\n"
+" 它é™åˆ¶åªè¾“出这些路径上的差异。新旧目标å¯ä»¥æ˜¯å·¥ä½œå‰¯æœ¬è·¯å¾„æˆ–åœ°å€ URL[@REV]。\n"
" 新目标默认与旧目标相åŒï¼ŒOLDREV 默认为 N,NEWREV 默认为 M。\n"
"\n"
" 3ã€â€œsvn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]†的简写。\n"
"\n"
" 使用ä¸åŠ å‚æ•°çš„ “svn diff†显示工作副本中的本地修改。\n"
-#: ../svn/svn.c:580
+#: ../svn/svn.c:671
msgid ""
"Create an unversioned copy of a tree.\n"
"usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -10849,15 +12203,7 @@ msgstr ""
" 如果指定了 PEGREV ,将从指定的版本本开始查找。\n"
"\n"
-#: ../svn/svn.c:602
-msgid ""
-"Describe the usage of this program or its subcommands.\n"
-"usage: help [SUBCOMMAND...]\n"
-msgstr ""
-"æ述本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
-"用法: help [å­å‘½ä»¤...]\n"
-
-#: ../svn/svn.c:608
+#: ../svn/svn.c:699
msgid ""
"Commit an unversioned file or tree into the repository.\n"
"usage: import [PATH] URL\n"
@@ -10877,10 +12223,9 @@ msgstr ""
" 如果çœç•¥ PATH,则默认为 “.â€ã€‚\n"
" 父目录会根æ®éœ€è¦åœ¨ç‰ˆæœ¬åº“内创建。\n"
" 如果 PATH 是目录,则其下的内容直接加入到 URL 指定的ä½ç½®å†…。\n"
-" 如果使用了 “--forceâ€ï¼Œé‚£ä¹ˆä¸èƒ½çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶çš„项目,例如设备文件,管é“等,会"
-"被忽略。\n"
+" 如果使用了 “--forceâ€ï¼Œé‚£ä¹ˆä¸èƒ½çº³å…¥ç‰ˆæœ¬æŽ§åˆ¶çš„项目,例如设备文件,管é“等,会被忽略。\n"
-#: ../svn/svn.c:622
+#: ../svn/svn.c:713
msgid ""
"Display information about a local or remote item.\n"
"usage: info [TARGET[@REV]...]\n"
@@ -10896,7 +12241,7 @@ msgstr ""
" TARGET å¯ä»¥æ˜¯å·¥ä½œå‰¯æœ¬ä¸­çš„路径或版本库中的 URL。REV 指定从哪个\n"
" 版本开始查找目标。\n"
-#: ../svn/svn.c:632
+#: ../svn/svn.c:724
msgid ""
"List directory entries in the repository.\n"
"usage: list [TARGET[@REV]...]\n"
@@ -10933,11 +12278,7 @@ msgstr ""
" å¤§å° (以字节为å•ä½)\n"
" 最åŽä¸€æ¬¡æ交的日期与时间\n"
-#: ../svn/svn.c:652
-msgid "include externals definitions"
-msgstr "包å«å¤–部定义"
-
-#: ../svn/svn.c:655
+#: ../svn/svn.c:746
msgid ""
"Lock working copy paths or URLs in the repository, so that\n"
"no other user can commit changes to them.\n"
@@ -10950,19 +12291,19 @@ msgstr ""
"\n"
" 使用 --force 选项å¯ä»¥ä»Žå…¶ä»–用户或工作副本窃å–到é”。\n"
-#: ../svn/svn.c:661
+#: ../svn/svn.c:752
msgid "read lock comment from file ARG"
msgstr "从文件 ARG 读å–加é”注释"
-#: ../svn/svn.c:662
+#: ../svn/svn.c:753
msgid "specify lock comment ARG"
msgstr "指定加é”注释ARG"
-#: ../svn/svn.c:663
+#: ../svn/svn.c:754
msgid "force validity of lock comment source"
msgstr "强制校验é”定注释æº"
-#: ../svn/svn.c:666
+#: ../svn/svn.c:757
#, fuzzy
msgid ""
"Show the log messages for a set of revision(s) and/or path(s).\n"
@@ -11044,23 +12385,20 @@ msgstr ""
"用法: 1ã€log [PATH][@REV]\n"
" 2ã€log URL[@REV] [PATH...]\n"
"\n"
-" 1ã€æ˜¾ç¤ºä¸Žæœ¬åœ° PATH (默认: “.â€) 对应的 URL 的日志信æ¯ã€‚如果指定了 REV,版"
-"本\n"
+" 1ã€æ˜¾ç¤ºä¸Žæœ¬åœ° PATH (默认: “.â€) 对应的 URL 的日志信æ¯ã€‚如果指定了 REV,版本\n"
" 范围是 REV:1。默认的版本范围是 BASE:1,因为 URL 未必在 HEAD 中存在。\n"
"\n"
" 2ã€æ˜¾ç¤º URL 中 PATH (默认: “.â€) 的日志信æ¯ã€‚如果指定了 REV,版本范围是\n"
" REV:1。å¦åˆ™ç‰ˆæœ¬èŒƒå›´æ˜¯ HEAD:1。\n"
"\n"
-" å¯ä»¥æŒ‡å®šå¤šä¸ª “-c†或 “-r†选项 (但是ä¸å…许åŒæ—¶ä½¿ç”¨ “-c†和 “-r†选项),以"
-"åŠ\n"
+" å¯ä»¥æŒ‡å®šå¤šä¸ª “-c†或 “-r†选项 (但是ä¸å…许åŒæ—¶ä½¿ç”¨ “-c†和 “-r†选项),以åŠ\n"
" æ··åˆä½¿ç”¨å‰å‘å’ŒåŽå‘范围。\n"
"\n"
" 使用 -v 时,在日志信æ¯ä¸­æ˜¾ç¤ºå—å½±å“的路径å。\n"
" 使用 -q 时,ä¸æ˜¾ç¤ºæ—¥å¿—ä¿¡æ¯ä¸»ä½“ (请注æ„,它å¯ä¸Ž -v 并存)。\n"
"\n"
" æ¯æ¡æ—¥å¿—ä¿¡æ¯åªä¼šæ˜¾ç¤ºä¸€æ¬¡ï¼Œå³ä½¿æŒ‡å®šäº†æ­¤ç‰ˆæœ¬æ¶‰åŠåˆ°çš„多个路径。默认日志信æ¯\n"
-" 会追溯å¤åˆ¶åŽ†å²ï¼›ä½¿ç”¨ --stop-on-copy å¯ä»¥å…³é—­è¿™ç§è¡Œä¸ºï¼Œè¿™å¯ä»¥ç”¨æ¥æ‰¾å‡ºåˆ†æ”¯"
-"点。\n"
+" 会追溯å¤åˆ¶åŽ†å²ï¼›ä½¿ç”¨ --stop-on-copy å¯ä»¥å…³é—­è¿™ç§è¡Œä¸ºï¼Œè¿™å¯ä»¥ç”¨æ¥æ‰¾å‡ºåˆ†æ”¯ç‚¹ã€‚\n"
"\n"
" 范例: \n"
" svn log\n"
@@ -11070,18 +12408,20 @@ msgstr ""
" svn log http://www.example.com/repo/project foo.c bar.c\n"
" svn log http://www.example.com/repo/project@50 foo.c bar.c\n"
-#: ../svn/svn.c:744
-msgid "retrieve revision property ARG"
-msgstr "获å–版本属性 ARG"
+#: ../svn/svn.c:837
+#, fuzzy
+msgid "also print all affected paths"
+msgstr "ä¸è¦è§£é”目标"
-#: ../svn/svn.c:745
-msgid "the change made in revision ARG"
-msgstr "版本 ARG 引起的改å˜"
+#: ../svn/svn.c:838
+#, fuzzy
+msgid "do not print the log message"
+msgstr "ä¸è¦è§£é”目标"
#. For this large section, let's keep it unindented for easier
#. * viewing/editing. It has been vim-treated with a textwidth=75 and 'gw'
#. * (with quotes and newlines removed).
-#: ../svn/svn.c:751
+#: ../svn/svn.c:844
msgid ""
"Merge changes into a working copy.\n"
"usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]\n"
@@ -11168,8 +12508,7 @@ msgid ""
"\n"
" Subversion will locate all the changes on 'trunk' that have not yet\n"
" been merged into the 'feature' branch. In this case that is a single\n"
-" range, r100:200. In the diagram above, L marks the left side "
-"(trunk@100)\n"
+" range, r100:200. In the diagram above, L marks the left side (trunk@100)\n"
" and R marks the right side (trunk@200) of the merge source. The\n"
" difference between L and R will be applied to the target working copy\n"
" path. In this case, the working copy is a clean checkout of the entire\n"
@@ -11413,7 +12752,11 @@ msgid ""
" repositories.\n"
msgstr ""
-#: ../svn/svn.c:1083
+#: ../svn/svn.c:1174
+msgid "force deletions even if deleted contents don't match"
+msgstr ""
+
+#: ../svn/svn.c:1178
msgid ""
"Display merge-related information.\n"
"usage: 1. mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -11445,7 +12788,7 @@ msgid ""
" The depth can be 'empty' or 'infinity'; the default is 'empty'.\n"
msgstr ""
-#: ../svn/svn.c:1114
+#: ../svn/svn.c:1210
msgid ""
"Create a new directory under version control.\n"
"usage: 1. mkdir PATH...\n"
@@ -11476,7 +12819,7 @@ msgstr ""
" 在这两个情况下,所有的中间目录都必须事先存在,\n"
" 除éžä½¿ç”¨é€‰é¡¹ --parents。\n"
-#: ../svn/svn.c:1131
+#: ../svn/svn.c:1227
msgid ""
"Move (rename) an item in a working copy or repository.\n"
"usage: move SRC... DST\n"
@@ -11493,13 +12836,12 @@ msgid ""
" Furthermore, WC -> WC moves will refuse to move a mixed-revision subtree.\n"
" To avoid unnecessary conflicts, it is recommended to run 'svn update'\n"
" to update the subtree to a single revision before moving it.\n"
-" The --allow-mixed-revisions option is provided for backward "
-"compatibility.\n"
+" The --allow-mixed-revisions option is provided for backward compatibility.\n"
"\n"
" The --revision option has no use and is deprecated.\n"
msgstr ""
-#: ../svn/svn.c:1153
+#: ../svn/svn.c:1249
msgid ""
"Apply a patch to a working copy.\n"
"usage: patch PATCHFILE [WCPATH]\n"
@@ -11546,7 +12888,7 @@ msgid ""
" HEAD revision. This way, conflicts can be resolved interactively.\n"
msgstr ""
-#: ../svn/svn.c:1201
+#: ../svn/svn.c:1297
msgid ""
"Remove a property from files, dirs, or revisions.\n"
"usage: 1. propdel PROPNAME [PATH...]\n"
@@ -11563,7 +12905,7 @@ msgstr ""
" 1ã€åˆ é™¤å·¥ä½œå‰¯æœ¬ä¸­çº³å…¥ç‰ˆæœ¬ç®¡ç†çš„文件或目录的属性。\n"
" 2ã€åˆ é™¤ç‰ˆæœ¬åº“中版本的属性。TARGETåªç”¨æ¥åˆ¤æ–­è®¿é—®å“ªä¸ªç‰ˆæœ¬åº“。\n"
-#: ../svn/svn.c:1211
+#: ../svn/svn.c:1307
#, fuzzy
msgid ""
"Edit a property with an external editor.\n"
@@ -11586,7 +12928,7 @@ msgstr ""
"\n"
"å‚è§ â€œsvn help propset†以获得更多设置属性的信æ¯ã€‚\n"
-#: ../svn/svn.c:1223
+#: ../svn/svn.c:1319
#, fuzzy
msgid ""
"Print the value of a property on files, dirs, or revisions.\n"
@@ -11604,9 +12946,9 @@ msgid ""
" 'empty', the target path is printed on the same line before each value.\n"
"\n"
" By default, an extra newline is printed after the property value so that\n"
-" the output looks pretty. With a single TARGET and depth 'empty', you can\n"
-" use the --strict option to disable this (useful when redirecting a binary\n"
-" property value to a file, for example).\n"
+" the output looks pretty. With a single TARGET, depth 'empty' and without\n"
+" --show-inherited-props, you can use the --strict option to disable this\n"
+" (useful when redirecting a binary property value to a file, for example).\n"
msgstr ""
"显示目录ã€æ–‡ä»¶æˆ–版本的属性å–值。\n"
"用法: 1ã€propget PROPNAME [TARGET[@REV]...]\n"
@@ -11621,15 +12963,16 @@ msgstr ""
" 使用 --strict 选项å¯ä»¥å…³é—­è¿™äº›ç¾ŽåŒ–行为 (它很有用,例如将二进制属\n"
" 性内容é‡å®šå‘到一个文件,但是仅用于å•ä¸€ç›®æ ‡çš„éžé€’å½’æ“作)。\n"
-#: ../svn/svn.c:1243 ../svn/svn.c:1260
+#: ../svn/svn.c:1339 ../svn/svn.c:1356
msgid "print path, name and value on separate lines"
-msgstr "在å•ç‹¬çš„行打å°è·¯å¾„,å称和å–值"
+msgstr ""
-#: ../svn/svn.c:1244
+#: ../svn/svn.c:1340
+#, fuzzy
msgid "don't print an extra newline"
-msgstr "ä¸æ‰“å°é¢å¤–çš„æ–°è¡Œ"
+msgstr "ä¸æ‰“å°æœªç‰ˆæœ¬æŽ§åˆ¶çš„æ¡ç›®"
-#: ../svn/svn.c:1247
+#: ../svn/svn.c:1343
#, fuzzy
msgid ""
"List all properties on files, dirs, or revisions.\n"
@@ -11641,8 +12984,7 @@ msgid ""
" 2. Lists unversioned remote props on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"
-" With --verbose, the property values are printed as well, like 'svn "
-"propget\n"
+" With --verbose, the property values are printed as well, like 'svn propget\n"
" --verbose'. With --quiet, the paths are not printed.\n"
msgstr ""
"列出目录ã€æ–‡ä»¶æˆ–版本的所有属性。\n"
@@ -11652,11 +12994,12 @@ msgstr ""
" 1ã€æ˜¾ç¤ºç›®æ ‡çš„属性。REV 指定从哪个版本开始查找目标。\n"
" 2ã€åˆ—出版本库中版本的属性。TARGET åªç”¨æ¥åˆ¤æ–­è®¿é—®å“ªä¸ªç‰ˆæœ¬åº“。\n"
-#: ../svn/svn.c:1261
+#: ../svn/svn.c:1357
+#, fuzzy
msgid "don't print the path"
-msgstr "ä¸è¦æ‰“å°è·¯å¾„"
+msgstr "ä¸è¦è§£é”目标"
-#: ../svn/svn.c:1264
+#: ../svn/svn.c:1360
msgid ""
"Set the value of a property on files, dirs, or revisions.\n"
"usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -11689,8 +13032,7 @@ msgid ""
" %r - The number of the revision which last changed the file.\n"
" %R - The URL to the root of the repository.\n"
" %u - The URL of the file.\n"
-" %_ - A space (keyword definitions cannot contain a literal "
-"space).\n"
+" %_ - A space (keyword definitions cannot contain a literal space).\n"
" %% - A literal '%'.\n"
" %H - Equivalent to %P%_%r%_%d%_%a.\n"
" %I - Equivalent to %b%_%r%_%d%_%a.\n"
@@ -11712,8 +13054,7 @@ msgid ""
"\n"
" Subversion recognizes the following special versioned properties on a\n"
" directory:\n"
-" svn:ignore - A list of file glob patterns to ignore, one per "
-"line.\n"
+" svn:ignore - A list of file glob patterns to ignore, one per line.\n"
" svn:global-ignores - Like svn:ignore, but inheritable.\n"
" svn:externals - A list of module specifiers, one per line, in the\n"
" following format similar to the syntax of 'svn checkout':\n"
@@ -11731,6 +13072,7 @@ msgid ""
" ^/ to the repository root\n"
" / to the server root\n"
" // to the URL scheme\n"
+" ^/../ to a sibling repository beneath the same SVNParentPath location\n"
" Use of the following format is discouraged but is supported for\n"
" interoperability with Subversion 1.4 and earlier clients:\n"
" LOCALPATH [-r PEG] URL\n"
@@ -11739,11 +13081,11 @@ msgid ""
" Lines starting with a '#' character are ignored.\n"
msgstr ""
-#: ../svn/svn.c:1343
+#: ../svn/svn.c:1440
msgid "read property value from file ARG"
msgstr "从文件 ARG 读å–属性值"
-#: ../svn/svn.c:1346
+#: ../svn/svn.c:1443
msgid ""
"Relocate the working copy to point to a different repository root URL.\n"
"usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
@@ -11784,7 +13126,7 @@ msgstr ""
" svn relocate http://www.example.com/repo/project \\\n"
" svn://svn.example.com/repo/project\n"
-#: ../svn/svn.c:1369
+#: ../svn/svn.c:1466
msgid ""
"Resolve conflicts on working copy files or directories.\n"
"usage: resolve [PATH...]\n"
@@ -11797,7 +13139,7 @@ msgid ""
" In this mode, the command is not recursive by default (depth 'empty').\n"
msgstr ""
-#: ../svn/svn.c:1379
+#: ../svn/svn.c:1476
msgid ""
"specify automatic conflict resolution source\n"
" ('base', 'working', 'mine-conflict',\n"
@@ -11807,7 +13149,7 @@ msgstr ""
" ('base', 'working', 'mine-conflict',\n"
" 'theirs-conflict', 'mine-full', 'theirs-full')"
-#: ../svn/svn.c:1386
+#: ../svn/svn.c:1483
msgid ""
"Remove 'conflicted' state on working copy files or directories.\n"
"usage: resolved PATH...\n"
@@ -11824,7 +13166,7 @@ msgstr ""
" 附加文件,让 PATH å¯ä»¥è¢«å†æ¬¡æ交。它已ç»è¿‡æ—¶ï¼Œè¢«\n"
" “svn resolve --accept workingâ€å–代。\n"
-#: ../svn/svn.c:1396
+#: ../svn/svn.c:1493
msgid ""
"Restore pristine working copy state (undo local changes).\n"
"usage: revert PATH...\n"
@@ -11837,7 +13179,7 @@ msgid ""
" the output of 'svn help merge' for 'undo'.\n"
msgstr ""
-#: ../svn/svn.c:1408
+#: ../svn/svn.c:1505
#, fuzzy
msgid ""
"Print the status of working copy files and directories.\n"
@@ -11869,15 +13211,14 @@ msgid ""
" another Subversion client modifying the working copy\n"
" ' ' not locked for writing\n"
" 'L' locked for writing\n"
-" Fourth column: Scheduled commit will contain addition-with-history\n"
-" ' ' no history scheduled with commit\n"
-" '+' history scheduled with commit\n"
+" Fourth column: Scheduled commit will create a copy (addition-with-history)\n"
+" ' ' no history scheduled with commit (item was newly added)\n"
+" '+' history scheduled with commit (item was copied)\n"
" Fifth column: Whether the item is switched or a file external\n"
" ' ' normal\n"
" 'S' the item has a Switched URL relative to the parent\n"
" 'X' a versioned file created by an eXternals definition\n"
-" Sixth column: Whether the item is locked in repository for exclusive "
-"commit\n"
+" Sixth column: Whether the item is locked in repository for exclusive commit\n"
" (without -u)\n"
" ' ' not locked by this working copy\n"
" 'K' locked by this working copy, but lock might be stolen or broken\n"
@@ -11886,8 +13227,7 @@ msgid ""
" 'K' locked in repository, lock owned by this working copy\n"
" 'O' locked in repository, lock owned by another working copy\n"
" 'T' locked in repository, lock owned by this working copy was stolen\n"
-" 'B' not locked in repository, lock owned by this working copy is "
-"broken\n"
+" 'B' not locked in repository, lock owned by this working copy is broken\n"
" Seventh column: Whether the item is the victim of a tree conflict\n"
" ' ' normal\n"
" 'C' tree-Conflicted\n"
@@ -11994,8 +13334,7 @@ msgstr ""
" 工作副本路径总是最åŽä¸€æ ï¼Œæ‰€ä»¥å®ƒå¯ä»¥åŒ…å«ç©ºç™½å­—符。\n"
"\n"
" é—®å·æ ‡è®° (“?â€) 出现在工作版本,最åŽæ交的版本,或最åŽæ交的作者ä½ç½®æ—¶ï¼Œ\n"
-" 它指示信æ¯æœªçŸ¥ï¼Œæˆ–者给出此项目的状æ€æ˜¯ä¸æ°å½“çš„ (例如项目是å¤åˆ¶æ“作的结"
-"果)。\n"
+" 它指示信æ¯æœªçŸ¥ï¼Œæˆ–者给出此项目的状æ€æ˜¯ä¸æ°å½“çš„ (例如项目是å¤åˆ¶æ“作的结果)。\n"
" é—®å·æ ‡è®°ç”¨æ¥ä½œä¸ºä¸€ä¸ªè§†è§‰å ä½ç¬¦ï¼Œæ˜“于解æž\n"
"\n"
" 范例输出: \n"
@@ -12022,11 +13361,11 @@ msgstr ""
" > local missing, incoming edit upon update\n"
" D wc/qax.c\n"
-#: ../svn/svn.c:1501
+#: ../svn/svn.c:1598
msgid "don't print unversioned items"
msgstr "ä¸æ‰“å°æœªç‰ˆæœ¬æŽ§åˆ¶çš„æ¡ç›®"
-#: ../svn/svn.c:1504
+#: ../svn/svn.c:1601
msgid ""
"Update the working copy to a different URL within the same repository.\n"
"usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -12044,8 +13383,7 @@ msgid ""
" or directory) as the corresponding path in the repository it becomes\n"
" versioned but its contents are left 'as-is' in the working copy.\n"
" This means that an obstructing directory's unversioned children may\n"
-" also obstruct and become versioned. For files, any content "
-"differences\n"
+" also obstruct and become versioned. For files, any content differences\n"
" between the obstruction and the repository are treated like a local\n"
" modification to the working copy. All properties from the repository\n"
" are applied to the obstructing path.\n"
@@ -12073,8 +13411,7 @@ msgstr ""
"用法: 1ã€switch URL[@PEGREV] [PATH]\n"
" 2ã€switch --relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
"\n"
-" 1ã€æ›´æ–°å·¥ä½œå‰¯æœ¬ï¼Œä¸ŽåŒä¸€ç‰ˆæœ¬åº“中的新 URL 对应。其行为跟 “svn update†很"
-"åƒï¼Œ\n"
+" 1ã€æ›´æ–°å·¥ä½œå‰¯æœ¬ï¼Œä¸ŽåŒä¸€ç‰ˆæœ¬åº“中的新 URL 对应。其行为跟 “svn update†很åƒï¼Œ\n"
" 也是将工作副本切æ¢åˆ°åŒä¸€ç‰ˆæœ¬åº“中æŸä¸ªåˆ†æ”¯æˆ–者标签的方法。PEGREV 决定从\n"
" 哪个版本查找目标。\n"
"\n"
@@ -12086,8 +13423,7 @@ msgstr ""
"\n"
" 使用 “--set-depth†选项设置此æ“作目标的工作副本之新深度。\n"
"\n"
-" 如果新 URL 与工作副本路径没有版本继承关系,Subversion 将会拒ç»æ“作。选"
-"项\n"
+" 如果新 URL 与工作副本路径没有版本继承关系,Subversion 将会拒ç»æ“作。选项\n"
" '--ignore-ancestry' å¯ä»¥ç¦æ­¢æ­¤æ£€æŸ¥ã€‚\n"
"\n"
" 2ã€é€‰é¡¹ “--relocate†已ç»æ·˜æ±°ã€‚它的å¥æ³•ç­‰ä»·äºŽ\n"
@@ -12101,11 +13437,15 @@ msgstr ""
" svn switch --relocate http://www.example.com/repo/project \\\n"
" svn://svn.example.com/repo/project\n"
-#: ../svn/svn.c:1546
+#: ../svn/svn.c:1643
msgid "allow switching to a node with no common ancestor"
msgstr ""
-#: ../svn/svn.c:1550
+#: ../svn/svn.c:1645 ../svn/svn.c:1705
+msgid "handle unversioned obstructions as changes"
+msgstr ""
+
+#: ../svn/svn.c:1649
msgid ""
"Unlock working copy paths or URLs.\n"
"usage: unlock TARGET...\n"
@@ -12117,7 +13457,7 @@ msgstr ""
"\n"
" 使用 --force 终止é”定。\n"
-#: ../svn/svn.c:1557
+#: ../svn/svn.c:1656
msgid ""
"Bring changes from the repository into the working copy.\n"
"usage: update [PATH...]\n"
@@ -12200,7 +13540,7 @@ msgstr ""
"\n"
" 使用“--set-depthâ€é€‰é¡¹è®¾ç½®æ­¤æ“作目标的工作副本之新深度。\n"
-#: ../svn/svn.c:1607
+#: ../svn/svn.c:1708
msgid ""
"Upgrade the metadata storage format for a working copy.\n"
"usage: upgrade [WCPATH...]\n"
@@ -12212,117 +13552,65 @@ msgstr ""
"\n"
" ä¿ç•™æœ¬åœ°ä¿®æ”¹ã€‚\n"
-#: ../svn/svn.c:1653 ../svnadmin/svnadmin.c:90 ../svnlook/svnlook.c:379
-#: ../svnrdump/svnrdump.c:65 ../svnsync/svnsync.c:296
-msgid "Caught signal"
-msgstr "æ•æ‰åˆ°ä¿¡å·"
-
-#: ../svn/svn.c:1806 ../svnlook/svnlook.c:2564
-msgid "Non-numeric limit argument given"
-msgstr "--limit å–值ä¸æ˜¯æ•°å­—"
-
-#: ../svn/svn.c:1812 ../svnlook/svnlook.c:2570
-msgid "Argument to --limit must be positive"
-msgstr "--limit å–值必须为正"
+#: ../svn/svn.c:1715
+msgid ""
+"Print the youngest revision number of a target's repository.\n"
+"usage: youngest [TARGET]\n"
+"\n"
+" Print the revision number of the youngest revision in the repository\n"
+" with which TARGET is associated.\n"
+msgstr ""
-#: ../svn/svn.c:1833 ../svn/svn.c:2110
+#: ../svn/svn.c:1935 ../svn/svn.c:2213
msgid "Can't specify -c with --old"
msgstr "ä¸èƒ½åŒæ—¶æŒ‡å®š -c å’Œ --old"
-#: ../svn/svn.c:1864
-#, c-format
-msgid "Negative number in range (%s) not supported with -c"
-msgstr "-c 选项ä¸æ”¯æŒè´Ÿæ•°åœ¨èŒƒå›´ (%s) 中"
-
-#: ../svn/svn.c:1877
-#, c-format
-msgid "Non-numeric change argument (%s) given to -c"
-msgstr "-c 选项的å–值(%s)ä¸æ˜¯æ•°å­—"
-
-#: ../svn/svn.c:1885
-msgid "There is no change 0"
-msgstr "没有版本 0"
-
-#: ../svn/svn.c:1928 ../svnadmin/svnadmin.c:2067 ../svnrdump/svnrdump.c:937
-#: ../svnsync/svnsync.c:2051
-#, c-format
-msgid "Syntax error in revision argument '%s'"
-msgstr "版本å‚数“%sâ€ä¸­æœ‰è¯­æ³•é”™è¯¯"
-
-#: ../svn/svn.c:1994 ../svn/svn.c:2013
-#, c-format
-msgid "Error converting depth from locale to UTF-8"
-msgstr "将深度从本地编ç è½¬æ¢åˆ° UTF8 失败"
-
-#: ../svn/svn.c:2002
-#, c-format
-msgid ""
-"'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
-msgstr ""
-"“%s†ä¸æ˜¯æœ‰æ•ˆçš„深度;å°è¯• “emptyâ€ï¼Œâ€œfilesâ€ï¼Œâ€œimmediatesâ€ï¼Œæˆ– “infinityâ€"
-
-#: ../svn/svn.c:2021
+#: ../svn/svn.c:2112
#, c-format
-msgid ""
-"'%s' is not a valid depth; try 'exclude', 'empty', 'files', 'immediates', or "
-"'infinity'"
-msgstr ""
-"“%s†ä¸æ˜¯æœ‰æ•ˆçš„深度;å°è¯• “excludeâ€ï¼Œâ€œemptyâ€ï¼Œâ€œfilesâ€ï¼Œâ€œimmediatesâ€ï¼Œæˆ– "
-"“infinityâ€"
+msgid "'%s' is not a valid depth; try 'exclude', 'empty', 'files', 'immediates', or 'infinity'"
+msgstr "“%s†ä¸æ˜¯æœ‰æ•ˆçš„深度;å°è¯• “excludeâ€ï¼Œâ€œemptyâ€ï¼Œâ€œfilesâ€ï¼Œâ€œimmediatesâ€ï¼Œæˆ– “infinityâ€"
-#: ../svn/svn.c:2150
+#: ../svn/svn.c:2250
#, c-format
msgid "Syntax error in native-eol argument '%s'"
msgstr "原生æ¢è¡Œç¬¦å·å‚æ•° “%s†中有语法错误"
-#: ../svn/svn.c:2170
+#: ../svn/svn.c:2268
+#, fuzzy
msgid "Changelist names must not be empty"
-msgstr "修改列表的å称ä¸èƒ½ä¸ºç©º"
+msgstr "目标修改列表的å称ä¸èƒ½ä¸ºç©º"
-#: ../svn/svn.c:2204
+#: ../svn/svn.c:2301
#, c-format
msgid "'%s' is not a valid --accept value"
msgstr "“%s†是éžæ³• --accept å–值"
-#: ../svn/svn.c:2212
+#: ../svn/svn.c:2309
#, c-format
msgid "'%s' is not a valid --show-revs value"
msgstr "“%s†是éžæ³• --show-revs å–值"
-#: ../svn/svn.c:2224
+#: ../svn/svn.c:2325
#, c-format
msgid "Invalid strip count '%s'"
msgstr "无效修剪计数 '%s'"
-#: ../svn/svn.c:2230
+#: ../svn/svn.c:2331
msgid "Argument to --strip must be positive"
msgstr "--strip å‚æ•°çš„å–值必须为正"
-#: ../svn/svn.c:2285 ../svnmucc/svnmucc.c:1207 ../svnrdump/svnrdump.c:993
-#: ../svnsync/svnsync.c:2095
+#: ../svn/svn.c:2399 ../svnmucc/svnmucc.c:658 ../svnrdump/svnrdump.c:1034
+#: ../svnsync/svnsync.c:2164
+#, fuzzy
msgid "--non-interactive and --force-interactive are mutually exclusive"
-msgstr "--non-interactive 与 --force-interactive 是互斥的"
-
-#: ../svn/svn.c:2339 ../svndumpfilter/svndumpfilter.c:1509
-#: ../svnlook/svnlook.c:2666
-#, c-format
-msgid "Subcommand argument required\n"
-msgstr "å¿…é¡»æä¾›å­å‘½ä»¤å‚æ•°\n"
-
-#: ../svn/svn.c:2356 ../svnadmin/svnadmin.c:2250
-#: ../svndumpfilter/svndumpfilter.c:1529 ../svnlook/svnlook.c:2685
-#: ../svnrdump/svnrdump.c:1039
-#, c-format
-msgid "Unknown subcommand: '%s'\n"
-msgstr "未知å­å‘½ä»¤: “%sâ€\n"
+msgstr "--relocate 与 --non-recursive (-N) 是互斥的"
-#: ../svn/svn.c:2365
+#: ../svn/svn.c:2479
#, c-format
-msgid ""
-"Undo is done using either the 'svn revert' or the 'svn merge' command.\n"
+msgid "Undo is done using either the 'svn revert' or the 'svn merge' command.\n"
msgstr ""
-#: ../svn/svn.c:2400
+#: ../svn/svn.c:2515
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -12331,113 +13619,70 @@ msgstr ""
"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
"输入“svn help %sâ€å¾—到用法。\n"
-#: ../svn/svn.c:2414
-msgid ""
-"Multiple revision arguments encountered; can't specify -c twice, or both -c "
-"and -r"
-msgstr "é‡åˆ°äº†å¤šä¸ªç‰ˆæœ¬å‚æ•°ï¼›ä¸èƒ½æŒ‡å®š -c 两次或者åŒæ—¶ä½¿ç”¨ -c å’Œ -r"
-
-#: ../svn/svn.c:2426
+#: ../svn/svn.c:2541
msgid "--depth and --set-depth are mutually exclusive"
msgstr "--depth 与 --set-depth 是互斥的"
-#: ../svn/svn.c:2436
-msgid "--with-all-revprops and --with-no-revprops are mutually exclusive"
-msgstr "--with-all-revprops 与 --with-no-revprops 是互斥的"
-
-#: ../svn/svn.c:2446
-msgid "--with-revprop and --with-no-revprops are mutually exclusive"
-msgstr "--with-revprop 与 --with-no-revprops 是互斥的"
-
-#: ../svn/svn.c:2459
+#: ../svn/svn.c:2589
msgid "--message (-m) and --file (-F) are mutually exclusive"
msgstr "--message (-m) 与 --file (-F) 是互斥的"
-#: ../svn/svn.c:2468 ../svnmucc/svnmucc.c:1218 ../svnrdump/svnrdump.c:1098
-#: ../svnsync/svnsync.c:2146
-msgid "--trust-server-cert requires --non-interactive"
-msgstr "--trust-server-cert éœ€è¦ --non-interactive"
-
-#: ../svn/svn.c:2478
+#: ../svn/svn.c:2623
msgid "--diff-cmd and --internal-diff are mutually exclusive"
msgstr "--diff-cmd 与 --internal-diff 是互斥的"
-#: ../svn/svn.c:2520
+#: ../svn/svn.c:2665
msgid "--relocate and --depth are mutually exclusive"
msgstr "--relocate 与 --depth 是互斥的"
-#: ../svn/svn.c:2528
+#: ../svn/svn.c:2672
msgid "--relocate and --non-recursive (-N) are mutually exclusive"
msgstr "--relocate 与 --non-recursive (-N) 是互斥的"
-#: ../svn/svn.c:2650
+#: ../svn/svn.c:2791
msgid "Log message file is a versioned file; use '--force-log' to override"
msgstr "日志信æ¯æ–‡ä»¶å—版本控制;请使用 “--force-log†强制执行"
-#: ../svn/svn.c:2657
+#: ../svn/svn.c:2798
msgid "Lock comment file is a versioned file; use '--force-log' to override"
msgstr "é”注释文件å—版本控制;请使用 “--force-log†强制执行"
-#: ../svn/svn.c:2678
-msgid ""
-"The log message is a pathname (was -F intended?); use '--force-log' to "
-"override"
-msgstr ""
-"日志信æ¯æ˜¯è·¯å¾„å称 (本æ¥æƒ³ç”¨ -F 选项的å—?);请使用“--force-logâ€å¼ºåˆ¶æ‰§è¡Œ"
+#: ../svn/svn.c:2818
+msgid "The log message is a pathname (was -F intended?); use '--force-log' to override"
+msgstr "日志信æ¯æ˜¯è·¯å¾„å称 (本æ¥æƒ³ç”¨ -F 选项的å—?);请使用“--force-logâ€å¼ºåˆ¶æ‰§è¡Œ"
-#: ../svn/svn.c:2685
-msgid ""
-"The lock comment is a pathname (was -F intended?); use '--force-log' to "
-"override"
+#: ../svn/svn.c:2825
+msgid "The lock comment is a pathname (was -F intended?); use '--force-log' to override"
msgstr "é”注释是路径å称 (本æ¥æƒ³ç”¨-F 选项的å—?);请使用“--force-logâ€å¼ºåˆ¶æ‰§è¡Œ"
-#: ../svn/svn.c:2709
+#: ../svn/svn.c:2848
msgid "--auto-props and --no-auto-props are mutually exclusive"
msgstr "--auto-props 与 --no-auto-props 是互斥的"
-#: ../svn/svn.c:2814 ../svn/svn.c:2821
+#: ../svn/svn.c:2957 ../svn/svn.c:2964
#, c-format
msgid "--accept=%s incompatible with --non-interactive"
msgstr "--accept=%s 与 --non-interactive ä¸å…¼å®¹"
-#: ../svn/svn.c:2877
-#, c-format
+#: ../svn/svn.c:3021
+#, fuzzy, c-format
msgid "Try 'svn help %s' for more information"
-msgstr "请使用 “svn help %s†以得到更多信æ¯"
-
-#: ../svn/svn.c:2883
-msgid "Please see the 'svn upgrade' command"
-msgstr "请å‚阅命令 'svn upgrade'"
+msgstr "请使用 “svn help†以得到更多信æ¯"
-#: ../svn/svn.c:2889 ../svnmucc/svnmucc.c:1449 ../svnrdump/svnrdump.c:1175
-msgid ""
-"Authentication failed and interactive prompting is disabled; see the --force-"
-"interactive option"
+#: ../svn/svn.c:3033 ../svnmucc/svnmucc.c:966 ../svnrdump/svnrdump.c:1228
+msgid "Authentication failed and interactive prompting is disabled; see the --force-interactive option"
msgstr ""
-#: ../svn/svn.c:2894
-msgid ""
-"Reading file from standard input because of -F option; this can interfere "
-"with interactive prompting"
+#: ../svn/svn.c:3038
+msgid "Reading file from standard input because of -F option; this can interfere with interactive prompting"
msgstr ""
-#: ../svn/svn.c:2905
-msgid "Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)"
-msgstr "è¿è¡Œâ€œsvn cleanupâ€åˆ é™¤é” (è¿è¡Œâ€œsvn help cleanupâ€ä»¥å¾—到详细信æ¯)"
-
-#: ../svn/svn.c:2912
-msgid ""
-"Another process is blocking the working copy database, or the underlying "
-"filesystem does not support file locking; if the working copy is on a "
-"network filesystem, make sure file locking has been enabled on the file "
-"server"
+#: ../svn/svn.c:3056
+msgid "Another process is blocking the working copy database, or the underlying filesystem does not support file locking; if the working copy is on a network filesystem, make sure file locking has been enabled on the file server"
msgstr ""
-#: ../svn/svn.c:2925
-msgid ""
-"When using svn+ssh:// URLs, keep in mind that the --username and --password "
-"options are ignored because authentication is performed by SSH, not "
-"Subversion"
+#: ../svn/svn.c:3069
+msgid "When using svn+ssh:// URLs, keep in mind that the --username and --password options are ignored because authentication is performed by SSH, not Subversion"
msgstr ""
#: ../svn/switch-cmd.c:63
@@ -12447,18 +13692,12 @@ msgstr "“%sâ€åˆ°â€œ%sâ€ä¸æ˜¯æœ‰æ•ˆçš„é‡å®šä½"
#: ../svn/switch-cmd.c:170
#, c-format
-msgid ""
-"Path '%s' does not share common version control ancestry with the requested "
-"switch location. Use --ignore-ancestry to disable this check."
-msgstr ""
-"路径“%sâ€ä¸Žè¯·æ±‚的切æ¢ä½ç½®æ²¡æœ‰å…±åŒçš„祖先。使用 --ignore-ancestry å¯ä»¥ç¦ç”¨æ­¤æ£€"
-"查。"
+msgid "Path '%s' does not share common version control ancestry with the requested switch location. Use --ignore-ancestry to disable this check."
+msgstr "路径“%sâ€ä¸Žè¯·æ±‚的切æ¢ä½ç½®æ²¡æœ‰å…±åŒçš„祖先。使用 --ignore-ancestry å¯ä»¥ç¦ç”¨æ­¤æ£€æŸ¥ã€‚"
#: ../svn/switch-cmd.c:180
-msgid ""
-"'svn switch' does not support switching a working copy to a different "
-"repository"
-msgstr "“svn switchâ€ä¸æ”¯æŒå°†å·¥ä½œå‰¯æœ¬åˆ‡æ¢åˆ°ä¸åŒçš„版本库"
+msgid "'svn switch' does not support switching a working copy to a different repository"
+msgstr ""
#: ../svn/update-cmd.c:93
#, c-format
@@ -12472,11 +13711,8 @@ msgstr "更新 '%s' 到版本 %ld。\n"
#: ../svn/util.c:79
#, c-format
-msgid ""
-"\n"
-"Committed revision %ld%s.\n"
+msgid "Committed revision %ld%s.\n"
msgstr ""
-"\n"
"æ交åŽçš„版本为 %ld%s。\n"
#: ../svn/util.c:83
@@ -12493,21 +13729,16 @@ msgstr ""
"警告: %s\n"
#: ../svn/util.c:133
-msgid ""
-"The SVN_MERGE environment variable is empty or consists solely of "
-"whitespace. Expected a shell command.\n"
+msgid "The SVN_MERGE environment variable is empty or consists solely of whitespace. Expected a shell command.\n"
msgstr "环境å˜é‡ SVN_MERGE 没有设置或者由空白组æˆã€‚期望外壳命令。\n"
#: ../svn/util.c:139
-msgid ""
-"The environment variable SVN_MERGE and the merge-tool-cmd run-time "
-"configuration option were not set.\n"
-msgstr ""
-"环境å˜é‡ SVN_MERGE 没有设置,è¿è¡Œæ—¶çš„é…置中也没有设置 “merge-tool-cmdâ€ã€‚\n"
+msgid "The environment variable SVN_MERGE and the merge-tool-cmd run-time configuration option were not set.\n"
+msgstr "环境å˜é‡ SVN_MERGE 没有设置,è¿è¡Œæ—¶çš„é…置中也没有设置 “merge-tool-cmdâ€ã€‚\n"
-#: ../svn/util.c:169
-#, c-format
-msgid "The external merge tool exited with exit code %d"
+#: ../svn/util.c:168
+#, fuzzy, c-format
+msgid "The external merge tool '%s' exited with exit code %d."
msgstr "外部åˆå¹¶å·¥å…·å·²ç»é€€å‡ºï¼Œä»£ç æ˜¯ %d"
#: ../svn/util.c:211
@@ -12527,24 +13758,19 @@ msgstr "您的æ交信æ¯ä¿ç•™åœ¨ä¸´æ—¶æ–‡ä»¶ä¸­: "
msgid "--This line, and those below, will be ignored--"
msgstr "--此行åŠä»¥ä¸‹å†…容将会被忽略--"
-#: ../svn/util.c:360
+#: ../svn/util.c:351 ../svnmucc/svnmucc.c:423
msgid "Error normalizing log message to internal format"
msgstr "将日志内容规格化为内部格å¼å‡ºé”™"
-#: ../svn/util.c:447 ../svnmucc/svnmucc.c:763
+#: ../svn/util.c:442 ../svnmucc/svnmucc.c:433
msgid "Cannot invoke editor to get log message when non-interactive"
msgstr "在éžäº¤äº’å¼çŽ¯å¢ƒä¸­ä¸èƒ½è°ƒç”¨ç¼–辑器获得日志信æ¯"
-#: ../svn/util.c:460
-msgid ""
-"Could not use external editor to fetch log message; consider setting the "
-"$SVN_EDITOR environment variable or using the --message (-m) or --file (-F) "
-"options"
-msgstr ""
-"无法使用外部编辑器获得日志信æ¯ï¼›è€ƒè™‘设置环境å˜é‡ $SVN_EDITOR,或者使用 --"
-"message (-m) 或 --file (-F) 选项"
+#: ../svn/util.c:455
+msgid "Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options"
+msgstr "无法使用外部编辑器获得日志信æ¯ï¼›è€ƒè™‘设置环境å˜é‡ $SVN_EDITOR,或者使用 --message (-m) 或 --file (-F) 选项"
-#: ../svn/util.c:496
+#: ../svn/util.c:491
msgid ""
"\n"
"Log message unchanged or not specified\n"
@@ -12554,130 +13780,143 @@ msgstr ""
"日志信æ¯æœªä¿®æ”¹ï¼Œæˆ–未指定\n"
"a)终止,c)继续,e)编辑:\n"
-#: ../svn/util.c:549
-msgid ""
-"Use --force to override this restriction (local modifications may be lost)"
+#: ../svn/util.c:544
+msgid "Use --force to override this restriction (local modifications may be lost)"
msgstr "请使用 --force 选项强制执行(å¯èƒ½ä¼šä¸¢å¤±æœ¬åœ°ä¿®æ”¹)"
-#: ../svn/util.c:738 ../svn/util.c:771
+#: ../svn/util.c:733 ../svn/util.c:766
msgid "none"
msgstr "æ— "
-#: ../svn/util.c:739
+#: ../svn/util.c:734
msgid "file"
msgstr "文件"
-#: ../svn/util.c:740
+#: ../svn/util.c:735
msgid "dir"
msgstr "目录"
-#: ../svn/util.c:772
+#: ../svn/util.c:767
msgid "update"
msgstr "æ›´æ–°"
-#: ../svn/util.c:773
+#: ../svn/util.c:768
msgid "switch"
msgstr "切æ¢"
-#: ../svn/util.c:896
+#: ../svn/util.c:891
msgid "(invalid date)"
msgstr "(éžæ³•æ—¥æœŸ)"
-#: ../svn/util.c:1069
+#: ../svn/util.c:1051
#, c-format
-msgid ""
-"svn: warning: '%s' is a binary mime-type but file '%s' looks like text; "
-"diff, merge, blame, and other operations will stop working on this file\n"
+msgid "svn: warning: '%s' is a binary mime-type but file '%s' looks like text; diff, merge, blame, and other operations will stop working on this file\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:217 ../svnrdump/svnrdump.c:120
+#: ../svnadmin/svnadmin.c:236 ../svnfsfs/svnfsfs.c:141
+#: ../svnrdump/svnrdump.c:131
msgid "specify revision number ARG (or X:Y range)"
msgstr "指定版本 ARG (或 X:Y 范围)"
-#: ../svnadmin/svnadmin.c:220 ../svnlook/svnlook.c:161
+#: ../svnadmin/svnadmin.c:239 ../svnlook/svnlook.c:166
msgid "specify transaction name ARG"
msgstr "指定事务å称 ARG"
-#: ../svnadmin/svnadmin.c:223
+#: ../svnadmin/svnadmin.c:242
msgid "dump or hotcopy incrementally"
msgstr "以增é‡æ–¹å¼è¿›è¡Œè½¬å­˜æˆ–热å¤åˆ¶"
-#: ../svnadmin/svnadmin.c:226
+#: ../svnadmin/svnadmin.c:245
msgid "use deltas in dump output"
msgstr "在转存输出中使用差异"
-#: ../svnadmin/svnadmin.c:229
+#: ../svnadmin/svnadmin.c:248
msgid "bypass the repository hook system"
msgstr "跳过版本库钩å­ç³»ç»Ÿ"
-#: ../svnadmin/svnadmin.c:232
+#: ../svnadmin/svnadmin.c:251
msgid "bypass property validation logic"
msgstr "跳过属性校验逻辑"
-#: ../svnadmin/svnadmin.c:235 ../svnlook/svnlook.c:192
-#: ../svnrdump/svnrdump.c:122 ../svnserve/svnserve.c:290
-#: ../svnversion/svnversion.c:142
-msgid "no progress (only errors) to stderr"
+#: ../svnadmin/svnadmin.c:254
+#, fuzzy
+msgid "ignore revision datestamps found in the stream"
+msgstr "忽略所有æµä¸­çš„版本库 UUID"
+
+#: ../svnadmin/svnadmin.c:257 ../svnfsfs/svnfsfs.c:138
+#, fuzzy
+msgid "no progress (only errors to stderr)"
msgstr "在标准错误输出ä¸æ˜¾ç¤ºè¿›åº¦ (仅错误)"
-#: ../svnadmin/svnadmin.c:238
+#: ../svnadmin/svnadmin.c:260
msgid "ignore any repos UUID found in the stream"
msgstr "忽略所有æµä¸­çš„版本库 UUID"
-#: ../svnadmin/svnadmin.c:241
+#: ../svnadmin/svnadmin.c:263
msgid "set repos UUID to that found in stream, if any"
msgstr "如果æµä¸­å­˜åœ¨UUID,则设定为版本库的 UUID"
-#: ../svnadmin/svnadmin.c:244
-msgid "type of repository: 'fsfs' (default) or 'bdb'"
-msgstr "版本库类型: “fsfsâ€(默认)或“bdbâ€"
+#: ../svnadmin/svnadmin.c:266
+#, fuzzy
+msgid ""
+"type of repository:\n"
+" 'fsfs' (default), 'bdb' or 'fsx'\n"
+" CAUTION: FSX is for EXPERIMENTAL use only!"
+msgstr ""
+"是å¦å¯¹æ–‡ä»¶å†…容å¯ç”¨ç¼“å­˜\n"
+" 默认值: 是。\n"
+" [仅用于 FSFS 仓库]"
-#: ../svnadmin/svnadmin.c:247
+#: ../svnadmin/svnadmin.c:271
msgid "load at specified directory in repository"
msgstr "加载到版本库指定的目录中"
-#: ../svnadmin/svnadmin.c:250
+#: ../svnadmin/svnadmin.c:274
msgid "disable fsync at transaction commit [Berkeley DB]"
msgstr "在æ交事务时ç¦ç”¨fsync [BDB]"
-#: ../svnadmin/svnadmin.c:253
+#: ../svnadmin/svnadmin.c:277
msgid "disable automatic log file removal [Berkeley DB]"
msgstr "ç¦ç”¨è‡ªåŠ¨åˆ é™¤æ—¥å¿—文件 [BDB]"
-#: ../svnadmin/svnadmin.c:259
+#: ../svnadmin/svnadmin.c:283
msgid ""
"remove redundant Berkeley DB log files\n"
" from source repository [Berkeley DB]"
msgstr "删除æºç‰ˆæœ¬åº“中多余的BDB日志文件 [BDB]"
-#: ../svnadmin/svnadmin.c:263
+#: ../svnadmin/svnadmin.c:287
msgid "call pre-commit hook before committing revisions"
msgstr "æ交版本å‰è°ƒç”¨ pre-commit é’©å­"
-#: ../svnadmin/svnadmin.c:266
+#: ../svnadmin/svnadmin.c:290
msgid "call post-commit hook after committing revisions"
msgstr "æ交版本åŽè°ƒç”¨ post-commit é’©å­"
-#: ../svnadmin/svnadmin.c:269
+#: ../svnadmin/svnadmin.c:293
msgid "call hook before changing revision property"
msgstr "修改属性å‰è°ƒç”¨é’©å­"
-#: ../svnadmin/svnadmin.c:272
+#: ../svnadmin/svnadmin.c:296
msgid "call hook after changing revision property"
msgstr "修改属性åŽè°ƒç”¨é’©å­"
-#: ../svnadmin/svnadmin.c:275
+#: ../svnadmin/svnadmin.c:299
msgid ""
"wait instead of exit if the repository is in\n"
" use by another process"
msgstr "如果版本库被其他进程å ç”¨ï¼Œç­‰å¾…而ä¸ç›´æŽ¥é€€å‡º"
-#: ../svnadmin/svnadmin.c:279 ../svnadmin/svnadmin.c:282
-#: ../svnadmin/svnadmin.c:285
+#: ../svnadmin/svnadmin.c:303 ../svnadmin/svnadmin.c:306
+#: ../svnadmin/svnadmin.c:309
msgid "deprecated; see --compatible-version"
-msgstr "å·²ç»æ·˜æ±°; å‚è§ --compatible-version"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:312
+msgid "continue verification after detecting a corruption"
+msgstr ""
-#: ../svnadmin/svnadmin.c:288
+#: ../svnadmin/svnadmin.c:315
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations. Default: 16.\n"
@@ -12687,18 +13926,42 @@ msgstr ""
" 默认值: 16。\n"
" [仅用于 FSFS 仓库]"
-#: ../svnadmin/svnadmin.c:293
+#: ../svnadmin/svnadmin.c:320
#, fuzzy
msgid ""
"use repository format compatible with Subversion\n"
" version ARG (\"1.5.5\", \"1.7\", etc.)"
msgstr "使用 Subversion 1.5 之å‰ç‰ˆæœ¬çš„æ ¼å¼"
-#: ../svnadmin/svnadmin.c:296
+#: ../svnadmin/svnadmin.c:323
+#, fuzzy
msgid "read repository paths from file ARG"
-msgstr "从文件 ARG 读å–版本库路径"
+msgstr "从文件 ARG 读å–属性值"
+
+#: ../svnadmin/svnadmin.c:326
+#, fuzzy
+msgid ""
+"report any names within the same directory or\n"
+" svn:mergeinfo property value that differ only\n"
+" in character representation, but are otherwise\n"
+" identical"
+msgstr ""
+"在需è¦æ—¶çªƒå–é”。请å°å¿ƒä½¿ç”¨\n"
+" 如果你的镜åƒåŒ…å«è¿‡æ—¶çš„é”,并且没有其它 svnsync\n"
+" 实例åŒæ—¶è¿è¡Œã€‚"
+
+#: ../svnadmin/svnadmin.c:332
+#, fuzzy
+msgid ""
+"verify metadata only (ignored for BDB),\n"
+" checking against external corruption in\n"
+" Subversion 1.9+ format repositories.\n"
+msgstr ""
+"用æ¥å‡å°‘冗余æ“作的内存中的é¢å¤–缓存的大å°(MB)\n"
+" 默认值: 16。\n"
+" [仅用于 FSFS 仓库]"
-#: ../svnadmin/svnadmin.c:308
+#: ../svnadmin/svnadmin.c:346
msgid ""
"usage: svnadmin crashtest REPOS_PATH\n"
"\n"
@@ -12707,10 +13970,9 @@ msgid ""
msgstr ""
"用法: svnadmin crashtest REPOS_PATH\n"
"\n"
-"打开ä½äºŽ REPOS_PATH 的版本库, 然åŽç»ˆæ­¢, 从而模拟一个æŒæœ‰ç‰ˆæœ¬åº“å¥æŸ„进程的崩"
-"溃。\n"
+"打开ä½äºŽ REPOS_PATH 的版本库, 然åŽç»ˆæ­¢, 从而模拟一个æŒæœ‰ç‰ˆæœ¬åº“å¥æŸ„进程的崩溃。\n"
-#: ../svnadmin/svnadmin.c:314
+#: ../svnadmin/svnadmin.c:352
msgid ""
"usage: svnadmin create REPOS_PATH\n"
"\n"
@@ -12720,7 +13982,33 @@ msgstr ""
"\n"
"在 REPOS_PATH 创建一个新的空版本库。\n"
-#: ../svnadmin/svnadmin.c:323
+#: ../svnadmin/svnadmin.c:361
+#, fuzzy
+msgid ""
+"usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n"
+" 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n"
+"\n"
+"1. Delete the property NAME on revision REVISION.\n"
+"\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
+"\n"
+"NOTE: Revision properties are not versioned, so this command will\n"
+"irreversibly destroy the previous value of the property.\n"
+"\n"
+"2. Delete the property NAME on transaction TXN.\n"
+msgstr ""
+"用法: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+"\n"
+" 将版本 REVISION 的属性 NAME 设为 FILE 的内容。使用\n"
+" --use-pre-revprop-change-hook/--use-post-revprop-change-hook æ¥è§¦å‘与修\n"
+" 改属性相关的钩å­(例如,你需è¦åœ¨ä½ çš„ post-revprop-change é’©å­ä¸­å‘é€ email\n"
+" 通知)。\n"
+"\n"
+" 注æ„: 修订属性并未纳入版本管ç†ï¼Œæ‰€ä»¥è¿™ä¸ªå‘½ä»¤ä¼šè¦†ç›–以å‰çš„属性å–值。\n"
+
+#: ../svnadmin/svnadmin.c:374
msgid ""
"usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n"
"\n"
@@ -12735,7 +14023,7 @@ msgstr ""
"在指定的版本范围中,对其中å˜åŠ¨çš„路径增é‡è®¡ç®—。借助åªå‚¨å­˜ä¸Žä»¥å‰ç‰ˆæœ¬çš„差异,\n"
"它本质上å¯åŽ‹ç¼©ç‰ˆæœ¬åº“。如果没有指定版本则直接对 HEAD 版本进行。\n"
-#: ../svnadmin/svnadmin.c:332
+#: ../svnadmin/svnadmin.c:383
msgid ""
"usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n"
"\n"
@@ -12751,16 +14039,13 @@ msgid ""
msgstr ""
"用法: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]\n"
"\n"
-"将文件系统的内容,以å¯ç§»æ¤â€œè½¬å­˜â€æ ¼å¼è¾“出到标准输出,并将å馈输出到标准错"
-"误。\n"
+"将文件系统的内容,以å¯ç§»æ¤â€œè½¬å­˜â€æ ¼å¼è¾“出到标准输出,并将å馈输出到标准错误。\n"
"转存 LOWER 与 UPPER 版本之间的内容。如果没有指定版本,则转储所有的版本树。\n"
-"如果åªæœ‰æŒ‡å®š LOWER ,则åªè½¬å‚¨ä¸€ä¸ªç‰ˆæœ¬æ ‘。如果使用了 --incremental 选项,那"
-"么\n"
-"第一个转存的版本åªæ述它改å˜çš„路径;å¦åˆ™å®ƒä¼šæ述此版本在版本库中涉åŠåˆ°çš„æ¯"
-"个\n"
+"如果åªæœ‰æŒ‡å®š LOWER ,则åªè½¬å‚¨ä¸€ä¸ªç‰ˆæœ¬æ ‘。如果使用了 --incremental 选项,那么\n"
+"第一个转存的版本åªæ述它改å˜çš„路径;å¦åˆ™å®ƒä¼šæ述此版本在版本库中涉åŠåˆ°çš„æ¯ä¸ª\n"
"路径。(在任何情况下,第二个以åŠåŽç»­çš„版本,åªæ述这些版本改å˜çš„路径。)\n"
-#: ../svnadmin/svnadmin.c:345
+#: ../svnadmin/svnadmin.c:396
msgid ""
"usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n"
@@ -12772,7 +14057,7 @@ msgid ""
" locked in the same order as they are listed in the file.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:355
+#: ../svnadmin/svnadmin.c:406
msgid ""
"usage: svnadmin help [SUBCOMMAND...]\n"
"\n"
@@ -12782,17 +14067,27 @@ msgstr ""
"\n"
"显示本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
-#: ../svnadmin/svnadmin.c:360
+#: ../svnadmin/svnadmin.c:411
msgid ""
"usage: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH\n"
"\n"
"Make a hot copy of a repository.\n"
"If --incremental is passed, data which already exists at the destination\n"
-"is not copied again. Incremental mode is implemented for FSFS "
-"repositories.\n"
+"is not copied again. Incremental mode is implemented for FSFS repositories.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:367
+#: ../svnadmin/svnadmin.c:418
+#, fuzzy
+msgid ""
+"usage: svnadmin info REPOS_PATH\n"
+"\n"
+"Print information about the repository at REPOS_PATH.\n"
+msgstr ""
+"用法: svnadmin create REPOS_PATH\n"
+"\n"
+"在 REPOS_PATH 创建一个新的空版本库。\n"
+
+#: ../svnadmin/svnadmin.c:423
msgid ""
"usage: svnadmin list-dblogs REPOS_PATH\n"
"\n"
@@ -12807,7 +14102,7 @@ msgstr ""
"\n"
"警告: 修改或删除ä»åœ¨ä½¿ç”¨ä¸­çš„记录文件将导致版本库æŸå。\n"
-#: ../svnadmin/svnadmin.c:374
+#: ../svnadmin/svnadmin.c:430
msgid ""
"usage: svnadmin list-unused-dblogs REPOS_PATH\n"
"\n"
@@ -12819,7 +14114,8 @@ msgstr ""
"列出无用的BDB日志文件。\n"
"\n"
-#: ../svnadmin/svnadmin.c:379
+#: ../svnadmin/svnadmin.c:435
+#, fuzzy
msgid ""
"usage: svnadmin load REPOS_PATH\n"
"\n"
@@ -12834,10 +14130,9 @@ msgstr ""
"\n"
"从标准输入读å–“转存â€æ ¼å¼çš„æµï¼Œå°†æ–°çš„版本æ交至版本库的文件\n"
"系统中。如果版本库原先是空的,默认会将其 UUID 以æµä¸­çš„数值代替。\n"
-"进度报告会é€è‡³æ ‡å‡†è¾“出。如果使用了 --revision,那么就åªåŠ è½½è½¬å­˜\n"
-"æµä¸­ä¸ŽæŒ‡å®šèŒƒå›´ä¸€è‡´çš„版本。\n"
+"进度报告会é€è‡³æ ‡å‡†è¾“出。\n"
-#: ../svnadmin/svnadmin.c:391
+#: ../svnadmin/svnadmin.c:448
msgid ""
"usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n"
"\n"
@@ -12846,7 +14141,7 @@ msgid ""
"triggering the pre-lock and post-lock hook scripts.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:398
+#: ../svnadmin/svnadmin.c:455
msgid ""
"usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
"\n"
@@ -12855,11 +14150,10 @@ msgid ""
msgstr ""
"用法: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
"\n"
-"显示ä½äºŽ PATH-IN-REPOS 或其å­å­™ä¸Šçš„所有é”çš„æè¿°(如果没有æä¾› PATH-IN-"
-"REPOS,\n"
+"显示ä½äºŽ PATH-IN-REPOS 或其å­å­™ä¸Šçš„所有é”çš„æè¿°(如果没有æä¾› PATH-IN-REPOS,\n"
"那么显示版本库根的信æ¯)。\n"
-#: ../svnadmin/svnadmin.c:404
+#: ../svnadmin/svnadmin.c:461
msgid ""
"usage: svnadmin lstxns REPOS_PATH\n"
"\n"
@@ -12869,7 +14163,7 @@ msgstr ""
"\n"
"显示所有未æ交事务的å称。\n"
-#: ../svnadmin/svnadmin.c:409
+#: ../svnadmin/svnadmin.c:466
msgid ""
"usage: svnadmin pack REPOS_PATH\n"
"\n"
@@ -12881,7 +14175,7 @@ msgstr ""
"使用更有效的存储模型压缩版本库。\n"
"它å¯èƒ½ä¸é€‚用于所有的版本库,此时直接结æŸã€‚\n"
-#: ../svnadmin/svnadmin.c:415
+#: ../svnadmin/svnadmin.c:472
msgid ""
"usage: svnadmin recover REPOS_PATH\n"
"\n"
@@ -12895,7 +14189,7 @@ msgstr ""
"对版本库è¿è¡Œä¿®å¤ç¨‹åºã€‚当你é‡åˆ°åº”当执行修å¤çš„错误指示时,请执行此命令。\n"
"ä¿®å¤ Berkeley DB 需è¦ç‹¬å è®¿é—®ï¼Œå¦‚果版本库被其它进程使用,它会立å³é€€å‡ºã€‚\n"
-#: ../svnadmin/svnadmin.c:423
+#: ../svnadmin/svnadmin.c:480
msgid ""
"usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n"
"\n"
@@ -12905,7 +14199,7 @@ msgstr ""
"\n"
"æ— æ¡ä»¶åœ°ä»Žæ¯ä¸ª LOCKED_PATH 删除é”。\n"
-#: ../svnadmin/svnadmin.c:428
+#: ../svnadmin/svnadmin.c:485
msgid ""
"usage: svnadmin rmtxns REPOS_PATH TXN_NAME...\n"
"\n"
@@ -12915,7 +14209,7 @@ msgstr ""
"\n"
"从版本库删除命å事务。\n"
-#: ../svnadmin/svnadmin.c:433
+#: ../svnadmin/svnadmin.c:490
msgid ""
"usage: svnadmin setlog REPOS_PATH -r REVISION FILE\n"
"\n"
@@ -12937,17 +14231,22 @@ msgstr ""
"\n"
" 注æ„: 修订属性并未纳入版本管ç†ï¼Œæ‰€ä»¥è¿™ä¸ªå‘½ä»¤ä¼šè¦†ç›–以å‰çš„属性å–值。\n"
-#: ../svnadmin/svnadmin.c:445
+#: ../svnadmin/svnadmin.c:502
+#, fuzzy
msgid ""
-"usage: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+"usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+" 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n"
"\n"
-"Set the property NAME on revision REVISION to the contents of FILE. Use\n"
-"--use-pre-revprop-change-hook/--use-post-revprop-change-hook to trigger\n"
-"the revision property-related hooks (for example, if you want an email\n"
-"notification sent from your post-revprop-change hook).\n"
+"1. Set the property NAME on revision REVISION to the contents of FILE.\n"
+"\n"
+"Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+"trigger the revision property-related hooks (for example, if you want\n"
+"an email notification sent from your post-revprop-change hook).\n"
"\n"
"NOTE: Revision properties are not versioned, so this command will\n"
"overwrite the previous value of the property.\n"
+"\n"
+"2. Set the property NAME on transaction TXN to the contents of FILE.\n"
msgstr ""
"用法: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
"\n"
@@ -12958,7 +14257,7 @@ msgstr ""
"\n"
" 注æ„: 修订属性并未纳入版本管ç†ï¼Œæ‰€ä»¥è¿™ä¸ªå‘½ä»¤ä¼šè¦†ç›–以å‰çš„属性å–值。\n"
-#: ../svnadmin/svnadmin.c:456
+#: ../svnadmin/svnadmin.c:515
msgid ""
"usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n"
"\n"
@@ -12971,7 +14270,7 @@ msgstr ""
"é‡ç½®ä½äºŽ REPOS_PATH 的版本库 UUID。如果æä¾› NEW_UUID,那么它就æˆä¸ºç‰ˆæœ¬åº“çš„\n"
"æ–° UUIDï¼›å¦åˆ™å°±ä¸ºç‰ˆæœ¬åº“生æˆä¸€ä¸ªæ–°çš„ UUID。\n"
-#: ../svnadmin/svnadmin.c:463
+#: ../svnadmin/svnadmin.c:522
msgid ""
"usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n"
"\n"
@@ -12980,7 +14279,7 @@ msgid ""
"triggering the pre-unlock and post-unlock hook scripts.\n"
msgstr ""
-#: ../svnadmin/svnadmin.c:470
+#: ../svnadmin/svnadmin.c:529
msgid ""
"usage: svnadmin upgrade REPOS_PATH\n"
"\n"
@@ -13004,7 +14303,8 @@ msgstr ""
"æ下执行最少的工作æ¥å®Œæˆå‡çº§ã€‚它ä¸æ‹…ä¿ç‰ˆæœ¬åº“的状æ€ä¸Žå¯¼å‡ºåŽåŠ è½½çš„å‡çº§æ–¹\n"
"案一样最优化。\n"
-#: ../svnadmin/svnadmin.c:483
+#: ../svnadmin/svnadmin.c:542
+#, fuzzy
msgid ""
"usage: svnadmin verify REPOS_PATH\n"
"\n"
@@ -13014,67 +14314,97 @@ msgstr ""
"\n"
"校验版本库中的数æ®ã€‚\n"
-#: ../svnadmin/svnadmin.c:545
+#: ../svnadmin/svnadmin.c:606
msgid "Invalid revision specifier"
msgstr "无效的版本说明"
-#: ../svnadmin/svnadmin.c:549
+#: ../svnadmin/svnadmin.c:610
#, c-format
msgid "Revisions must not be greater than the youngest revision (%ld)"
msgstr "版本å·ä¸èƒ½å¤§äºŽæœ€æ–°çš„版本å·(%ld)"
-#: ../svnadmin/svnadmin.c:656
+#: ../svnadmin/svnadmin.c:628
+#, fuzzy, c-format
+msgid "Path '%s' is not a local path"
+msgstr "“%sâ€ä¸æ˜¯æœ¬åœ°è·¯å¾„"
+
+#: ../svnadmin/svnadmin.c:657
+#, fuzzy
+msgid "Not enough arguments"
+msgstr "没有æ供足够的å‚æ•°"
+
+#: ../svnadmin/svnadmin.c:660
+#, fuzzy
+msgid "Too many arguments"
+msgstr "å‚数过多"
+
+#: ../svnadmin/svnadmin.c:696
#, c-format
msgid ""
-"%swarning: The \"%s\" repository back-end is deprecated, consider using \"%s"
-"\" instead.\n"
-msgstr "%s警告: “%sâ€ç‰ˆæœ¬åº“åŽç«¯å·²ç»æ·˜æ±°ï¼Œè¯·è€ƒè™‘使用“%sâ€æ¥ä»£æ›¿ã€‚\n"
+"Successfully opened repository '%s'.\n"
+"Will now crash to simulate a crashing server process.\n"
+msgstr ""
-#: ../svnadmin/svnadmin.c:696
+#: ../svnadmin/svnadmin.c:735
+#, c-format
+msgid "%swarning: The \"%s\" repository back-end is deprecated, consider using \"%s\" instead.\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:776
msgid "Repositories compatible with 1.0.x must use --fs-type=bdb"
msgstr ""
-#: ../svnadmin/svnadmin.c:739 ../svnadmin/svnadmin.c:1041
-#: ../svnadmin/svnadmin.c:1222
+#: ../svnadmin/svnadmin.c:784
+#, c-format
+msgid "Repositories compatible with 1.8.x or earlier cannot use --fs-type=%s"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:829 ../svnadmin/svnadmin.c:1196
+#: ../svnadmin/svnadmin.c:1381
msgid "First revision cannot be higher than second"
msgstr "第一个版本ä¸å¯å¤§äºŽç¬¬äºŒä¸ª"
-#: ../svnadmin/svnadmin.c:748
+#: ../svnadmin/svnadmin.c:838
#, c-format
msgid "Deltifying revision %ld..."
msgstr "正在计算版本 %ld 差异..."
-#: ../svnadmin/svnadmin.c:752 ../svnadmin/svnadmin.c:844
-#: ../svnadmin/svnadmin.c:859
+#: ../svnadmin/svnadmin.c:842 ../svnadmin/svnadmin.c:955
+#: ../svnadmin/svnadmin.c:970
#, c-format
msgid "done.\n"
msgstr "完æˆã€‚\n"
-#: ../svnadmin/svnadmin.c:825
+#: ../svnadmin/svnadmin.c:900
+#, fuzzy, c-format
+msgid "* Error verifying revision %ld.\n"
+msgstr "* 已校验版本 %ld。\n"
+
+#: ../svnadmin/svnadmin.c:936
msgid "* Verifying repository metadata ...\n"
-msgstr "* æ­£åœ¨æ ¡éªŒç‰ˆæœ¬åº“å…ƒæ•°æ® ...\n"
+msgstr ""
-#: ../svnadmin/svnadmin.c:828
-#, c-format
+#: ../svnadmin/svnadmin.c:939
+#, fuzzy, c-format
msgid "* Verifying metadata at revision %ld ...\n"
-msgstr "* 正在校验版本 %ld çš„å…ƒæ•°æ® ...\n"
+msgstr "* 已校验版本 %ld。\n"
-#: ../svnadmin/svnadmin.c:838
+#: ../svnadmin/svnadmin.c:949
#, c-format
msgid "Packing revisions in shard %s..."
msgstr "正在打包版本碎片 %s ..."
-#: ../svnadmin/svnadmin.c:853
+#: ../svnadmin/svnadmin.c:964
#, c-format
msgid "Packing revprops in shard %s..."
msgstr "正在打包版本属性碎片 %s ..."
-#: ../svnadmin/svnadmin.c:928
+#: ../svnadmin/svnadmin.c:1039
#, c-format
msgid "<<< Skipped original revision %ld\n"
msgstr "<<< 已跳过原始版本 %ld\n"
-#: ../svnadmin/svnadmin.c:945
+#: ../svnadmin/svnadmin.c:1056
msgid ""
"Repository lock acquired.\n"
"Please wait; recovering the repository may take some time...\n"
@@ -13082,7 +14412,7 @@ msgstr ""
"å·²å–得版本库é”定。\n"
"请ç¨å€™ï¼›ä¿®å¤ç‰ˆæœ¬åº“å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´...\n"
-#: ../svnadmin/svnadmin.c:952
+#: ../svnadmin/svnadmin.c:1063
msgid ""
"Repository lock acquired.\n"
"Please wait; upgrading the repository may take some time...\n"
@@ -13090,13 +14420,40 @@ msgstr ""
"å·²å–得版本库é”定。\n"
"请ç¨å€™ï¼›å‡çº§ç‰ˆæœ¬åº“å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´...\n"
+#: ../svnadmin/svnadmin.c:1074
+#, fuzzy, c-format
+msgid "Packing revision properties in shard %s..."
+msgstr "正在打包版本碎片 %s ..."
+
+#: ../svnadmin/svnadmin.c:1086
+#, fuzzy, c-format
+msgid "Removing non-packed revision properties in shard %s..."
+msgstr "正在打包版本碎片 %s ..."
+
+#: ../svnadmin/svnadmin.c:1094
+#, fuzzy, c-format
+msgid "Bumped repository format to %ld\n"
+msgstr "版本库钩å­é”™è¯¯"
+
#: ../svnadmin/svnadmin.c:1102
+#, fuzzy, c-format
+msgid "* Copied revision %ld.\n"
+msgstr "* 已转存版本 %ld。\n"
+
+#: ../svnadmin/svnadmin.c:1108
+#, fuzzy, c-format
+msgid "* Copied revisions from %ld to %ld.\n"
+msgstr "* 已转存版本 %ld。\n"
+
+#: ../svnadmin/svnadmin.c:1257
msgid "No program provided"
msgstr "没有æ供程åº"
-#: ../svnadmin/svnadmin.c:1138
+#: ../svnadmin/svnadmin.c:1295
+#, fuzzy
msgid ""
"general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository administration tool.\n"
"Type 'svnadmin help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnadmin --version' to see the program version and FS modules.\n"
"\n"
@@ -13108,8 +14465,8 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svnadmin/svnadmin.c:1145 ../svnlook/svnlook.c:2225
-#: ../svnserve/svnserve.c:336
+#: ../svnadmin/svnadmin.c:1303 ../svnlook/svnlook.c:2243
+#: ../svnserve/svnserve.c:427
msgid ""
"The following repository back-end (FS) modules are available:\n"
"\n"
@@ -13117,24 +14474,20 @@ msgstr ""
"下列版本库åŽç«¯(FS) 模å—å¯ç”¨: \n"
"\n"
-#: ../svnadmin/svnadmin.c:1174
+#: ../svnadmin/svnadmin.c:1332
#, c-format
msgid "Invalid revision number (%ld) specified"
msgstr "指定了无效的版本 (%ld)"
-#: ../svnadmin/svnadmin.c:1184
+#: ../svnadmin/svnadmin.c:1342
msgid "Non-numeric revision specified"
msgstr "指定了éžæ•°å­—版本"
-#: ../svnadmin/svnadmin.c:1243
-msgid ""
-"Invalid property value found in dumpstream; consider repairing the source or "
-"using --bypass-prop-validation while loading."
-msgstr ""
-"在转储æµä¸­å‘现éžæ³•çš„属性值;考虑修å¤ï¼Œæˆ–者在加载时使用选项 '--bypass-prop-"
-"validation' 。"
+#: ../svnadmin/svnadmin.c:1403
+msgid "Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading."
+msgstr "在转储æµä¸­å‘现éžæ³•çš„属性值;考虑修å¤ï¼Œæˆ–者在加载时使用选项 '--bypass-prop-validation' 。"
-#: ../svnadmin/svnadmin.c:1309 ../svnadmin/svnadmin.c:1941
+#: ../svnadmin/svnadmin.c:1469 ../svnadmin/svnadmin.c:2336
msgid ""
"Failed to get exclusive repository access; perhaps another process\n"
"such as httpd, svnserve or svn has it open?"
@@ -13142,12 +14495,12 @@ msgstr ""
"无法独å è®¿é—®ç‰ˆæœ¬åº“ï¼›å¯èƒ½æ˜¯å…¶å®ƒå¦‚ httpd,svnserve 或 svn 等进程已ç»æ‰“开它,\n"
"尚未关闭?"
-#: ../svnadmin/svnadmin.c:1314 ../svnadmin/svnadmin.c:1946
+#: ../svnadmin/svnadmin.c:1474 ../svnadmin/svnadmin.c:2341
#, c-format
msgid "Waiting on repository lock; perhaps another process has it open?\n"
msgstr "等待版本库é”定中;也许其它的进程把它打开了?\n"
-#: ../svnadmin/svnadmin.c:1322
+#: ../svnadmin/svnadmin.c:1482
#, c-format
msgid ""
"\n"
@@ -13156,52 +14509,131 @@ msgstr ""
"\n"
"完æˆä¿®å¤ã€‚\n"
-#: ../svnadmin/svnadmin.c:1329
+#: ../svnadmin/svnadmin.c:1489
#, c-format
msgid "The latest repos revision is %ld.\n"
msgstr "最新的版本库版本是 %ld。\n"
-#: ../svnadmin/svnadmin.c:1444
+#: ../svnadmin/svnadmin.c:1604
#, c-format
msgid "Transaction '%s' removed.\n"
msgstr "事务“%sâ€è¢«åˆ é™¤ã€‚\n"
-#: ../svnadmin/svnadmin.c:1506 ../svnadmin/svnadmin.c:1551
+#: ../svnadmin/svnadmin.c:1686 ../svnadmin/svnadmin.c:1800
+#: ../svnadmin/svnadmin.c:2386
+#, fuzzy, c-format
+msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
+msgstr "--message (-m) 与 --file (-F) 是互斥的"
+
+#: ../svnadmin/svnadmin.c:1692 ../svnadmin/svnadmin.c:2392
+#, c-format
+msgid "Calling hooks is incompatible with --transaction (-t)"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1697 ../svnadmin/svnadmin.c:1742
+#: ../svnadmin/svnadmin.c:2397
#, c-format
msgid "Missing revision"
msgstr "丢失版本"
-#: ../svnadmin/svnadmin.c:1509 ../svnadmin/svnadmin.c:1554
+#: ../svnadmin/svnadmin.c:1700 ../svnadmin/svnadmin.c:1745
+#: ../svnadmin/svnadmin.c:2400
#, c-format
msgid "Only one revision allowed"
msgstr "åªå…许一个版本"
-#: ../svnadmin/svnadmin.c:1608
+#: ../svnadmin/svnadmin.c:1862
+msgid ""
+"\n"
+"-----Summary of corrupt revisions-----\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1954
#, c-format
-msgid "--revision (-r) and --transaction (-t) are mutually exclusive"
-msgstr "--revision (-r) 与 --transaction (-t) 是互斥的"
+msgid "UUID: %s\n"
+msgstr "UUID: %s\n"
+
+#: ../svnadmin/svnadmin.c:1960
+#, c-format
+msgid "Repository Format: %d\n"
+msgstr "版本库格å¼: %d\n"
+
+#: ../svnadmin/svnadmin.c:1974
+#, c-format
+msgid "Compatible With Version: %d.%d.0\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:1993
+#, c-format
+msgid "Repository Capability: %s\n"
+msgstr "版本库特性: %s\n"
+
+#: ../svnadmin/svnadmin.c:2002
+#, c-format
+msgid "Filesystem Type: %s\n"
+msgstr "文件系统类型: %s\n"
+
+#: ../svnadmin/svnadmin.c:2004
+#, c-format
+msgid "Filesystem Format: %d\n"
+msgstr "文件系统格å¼: %d\n"
+
+#: ../svnadmin/svnadmin.c:2013
+#, c-format
+msgid "FSFS Sharded: yes\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2015
+#, c-format
+msgid "FSFS Sharded: no\n"
+msgstr ""
-#: ../svnadmin/svnadmin.c:1775 ../svnlook/svnlook.c:2288
+#: ../svnadmin/svnadmin.c:2018
+#, c-format
+msgid "FSFS Shard Size: %d\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2027
+#, c-format
+msgid "FSFS Shards Packed: %ld/%ld\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2032
+#, c-format
+msgid "FSFS Logical Addressing: yes\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2034
+#, c-format
+msgid "FSFS Logical Addressing: no\n"
+msgstr ""
+
+#: ../svnadmin/svnadmin.c:2044
+#, c-format
+msgid "Configuration File: %s\n"
+msgstr "é…置文件: %s\n"
+
+#: ../svnadmin/svnadmin.c:2168 ../svnlook/svnlook.c:2306
#, c-format
msgid "UUID Token: %s\n"
msgstr "UUID 标识: %s\n"
-#: ../svnadmin/svnadmin.c:1776 ../svnlook/svnlook.c:2289
+#: ../svnadmin/svnadmin.c:2169 ../svnlook/svnlook.c:2307
#, c-format
msgid "Owner: %s\n"
msgstr "所有者: %s\n"
-#: ../svnadmin/svnadmin.c:1777 ../svnlook/svnlook.c:2290
+#: ../svnadmin/svnadmin.c:2170 ../svnlook/svnlook.c:2308
#, c-format
msgid "Created: %s\n"
msgstr "已创建: %s\n"
-#: ../svnadmin/svnadmin.c:1778 ../svnlook/svnlook.c:2291
+#: ../svnadmin/svnadmin.c:2171 ../svnlook/svnlook.c:2309
#, c-format
msgid "Expires: %s\n"
msgstr "过期: %s\n"
-#: ../svnadmin/svnadmin.c:1780
+#: ../svnadmin/svnadmin.c:2173
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -13216,38 +14648,34 @@ msgstr[0] ""
"%s\n"
"\n"
-#: ../svnadmin/svnadmin.c:1826
+#: ../svnadmin/svnadmin.c:2221
msgid "No paths to unlock provided"
msgstr "没有æ供解é”的路径"
-#: ../svnadmin/svnadmin.c:1844
+#: ../svnadmin/svnadmin.c:2239
#, c-format
msgid "Path '%s' isn't locked.\n"
msgstr "路径 “%s†没有被é”定。\n"
-#: ../svnadmin/svnadmin.c:1856
+#: ../svnadmin/svnadmin.c:2251
#, c-format
msgid "Removed lock on '%s'.\n"
msgstr "删除 “%s†上的é”。\n"
-#: ../svnadmin/svnadmin.c:1909
+#: ../svnadmin/svnadmin.c:2304
#, c-format
msgid "'%s' unlocked by user '%s'.\n"
msgstr "“%sâ€è¢«ç”¨æˆ·â€œ%sâ€è§£é”。\n"
-#: ../svnadmin/svnadmin.c:1956
-msgid ""
-"Upgrade of this repository's underlying versioned filesystem is not "
-"supported; consider dumping and loading the data elsewhere"
+#: ../svnadmin/svnadmin.c:2351
+msgid "Upgrade of this repository's underlying versioned filesystem is not supported; consider dumping and loading the data elsewhere"
msgstr "文件系统ä¸æ”¯æŒå‡çº§æ­¤ç‰ˆæœ¬åº“;请考虑使用导出åŽåŠ è½½æ•°æ®çš„å‡çº§æ–¹æ¡ˆ"
-#: ../svnadmin/svnadmin.c:1963
-msgid ""
-"Upgrade of this repository is not supported; consider dumping and loading "
-"the data elsewhere"
+#: ../svnadmin/svnadmin.c:2358
+msgid "Upgrade of this repository is not supported; consider dumping and loading the data elsewhere"
msgstr "ä¸æ”¯æŒå‡çº§æ­¤ç‰ˆæœ¬åº“;请考虑使用导出åŽåŠ è½½æ•°æ®çš„å‡çº§æ–¹æ¡ˆ"
-#: ../svnadmin/svnadmin.c:1969
+#: ../svnadmin/svnadmin.c:2364
#, c-format
msgid ""
"\n"
@@ -13256,36 +14684,36 @@ msgstr ""
"\n"
"完æˆå‡çº§ã€‚\n"
-#: ../svnadmin/svnadmin.c:2054 ../svnrdump/svnrdump.c:923
-msgid ""
-"Multiple revision arguments encountered; try '-r N:M' instead of '-r N -r M'"
+#: ../svnadmin/svnadmin.c:2478 ../svnfsfs/svnfsfs.c:321
+#: ../svnrdump/svnrdump.c:950
+msgid "Multiple revision arguments encountered; try '-r N:M' instead of '-r N -r M'"
msgstr "é‡åˆ°äº†å¤šä¸ªç‰ˆæœ¬å‚数;请使用“-r N:Mâ€ä»£æ›¿â€œ-r M -r Nâ€"
-#: ../svnadmin/svnadmin.c:2132
+#: ../svnadmin/svnadmin.c:2558
#, c-format
msgid "Cannot create pre-1.0-compatible repositories"
-msgstr "ä¸èƒ½åˆ›å»ºä¸Žæ—©äºŽ 1.0 版本兼容的版本库"
+msgstr ""
-#: ../svnadmin/svnadmin.c:2145
+#: ../svnadmin/svnadmin.c:2570
#, c-format
msgid "Cannot guarantee compatibility beyond the current running version (%s)"
msgstr ""
-#: ../svnadmin/svnadmin.c:2234
+#: ../svnadmin/svnadmin.c:2671 ../svnfsfs/svnfsfs.c:386
#, c-format
msgid "subcommand argument required\n"
msgstr "å¿…é¡»æä¾›å­å‘½ä»¤å‚æ•°\n"
-#: ../svnadmin/svnadmin.c:2269
+#: ../svnadmin/svnadmin.c:2708 ../svnfsfs/svnfsfs.c:421
msgid "Repository argument required"
msgstr "需è¦ç‰ˆæœ¬åº“å‚æ•°"
-#: ../svnadmin/svnadmin.c:2282
+#: ../svnadmin/svnadmin.c:2716 ../svnfsfs/svnfsfs.c:429
#, c-format
msgid "'%s' is a URL when it should be a local path"
msgstr "“%sâ€åº”该是本地路径,实际上å´æ˜¯ URL"
-#: ../svnadmin/svnadmin.c:2313
+#: ../svnadmin/svnadmin.c:2746
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -13294,98 +14722,101 @@ msgstr ""
"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
"使用“svnadmin help %sâ€å¾—到用法。\n"
-#: ../svnadmin/svnadmin.c:2356
+#: ../svnadmin/svnadmin.c:2790
msgid "Try 'svnadmin help' for more info"
msgstr "请使用“svnadmin helpâ€ä»¥å¾—到更多信æ¯"
-#: ../svndumpfilter/svndumpfilter.c:78
+#: ../svndumpfilter/svndumpfilter.c:79
#, c-format
msgid "Can't open stdio file"
msgstr "无法打开标准输出/入文件"
-#: ../svndumpfilter/svndumpfilter.c:405
+#: ../svndumpfilter/svndumpfilter.c:406
msgid "This is an empty revision for padding."
msgstr "这是一个用æ¥å¡«å……的空版本。"
-#: ../svndumpfilter/svndumpfilter.c:488
+#: ../svndumpfilter/svndumpfilter.c:489
#, c-format
msgid "Revision %ld committed as %ld.\n"
msgstr "版本 %ld æ交为 %ld。\n"
-#: ../svndumpfilter/svndumpfilter.c:511
+#: ../svndumpfilter/svndumpfilter.c:512
#, c-format
msgid "Revision %ld skipped.\n"
msgstr "跳过版本 %ld。\n"
-#: ../svndumpfilter/svndumpfilter.c:605
+#: ../svndumpfilter/svndumpfilter.c:608
#, c-format
msgid "Invalid copy source path '%s'"
msgstr "å¤åˆ¶æºè·¯å¾„“%sâ€æ— æ•ˆ"
-#: ../svndumpfilter/svndumpfilter.c:662
+#: ../svndumpfilter/svndumpfilter.c:649
+#, fuzzy, c-format
+msgid "Missing Node-action for path '%s'"
+msgstr "路径 “%s†有ä¸æ”¯æŒçš„节点ç§ç±»"
+
+#: ../svndumpfilter/svndumpfilter.c:692
#, c-format
msgid "No valid copyfrom revision in filtered stream"
msgstr "在过滤æµä¸­æ²¡æœ‰æœ‰æ•ˆçš„copyfrom版本"
-#: ../svndumpfilter/svndumpfilter.c:787
+#: ../svndumpfilter/svndumpfilter.c:817
#, c-format
msgid "Missing merge source path '%s'; try with --skip-missing-merge-sources"
msgstr "缺少åˆå¹¶æºè·¯å¾„ “%sâ€ï¼›å°è¯• --skip-missing-merge-sources"
-#: ../svndumpfilter/svndumpfilter.c:809
+#: ../svndumpfilter/svndumpfilter.c:839
#, c-format
msgid "No valid revision range 'start' in filtered stream"
msgstr "在过滤æµä¸­æ²¡æœ‰æœ‰æ•ˆçš„版本范围 “startâ€"
-#: ../svndumpfilter/svndumpfilter.c:816
+#: ../svndumpfilter/svndumpfilter.c:846
#, c-format
msgid "No valid revision range 'end' in filtered stream"
msgstr "在过滤æµä¸­æ²¡æœ‰æœ‰æ•ˆçš„版本范围 “endâ€"
-#: ../svndumpfilter/svndumpfilter.c:862 ../svndumpfilter/svndumpfilter.c:893
+#: ../svndumpfilter/svndumpfilter.c:892 ../svndumpfilter/svndumpfilter.c:923
#, c-format
-msgid ""
-"Delta property block detected, but deltas are not enabled for node '%s' in "
-"original revision %ld"
+msgid "Delta property block detected, but deltas are not enabled for node '%s' in original revision %ld"
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1026
+#: ../svndumpfilter/svndumpfilter.c:1056
msgid "Do not display filtering statistics."
msgstr "ä¸æ˜¾ç¤ºè¿‡æ»¤çš„统计数æ®ã€‚"
-#: ../svndumpfilter/svndumpfilter.c:1028
+#: ../svndumpfilter/svndumpfilter.c:1058
msgid "Treat the path prefixes as file glob patterns."
msgstr "将路径å‰ç¼€è§†ä¸ºæ–‡ä»¶ç»Ÿé…模å¼ã€‚"
-#: ../svndumpfilter/svndumpfilter.c:1030
+#: ../svndumpfilter/svndumpfilter.c:1060
msgid "Remove revisions emptied by filtering."
msgstr "删除因过滤而产生的空版本。"
-#: ../svndumpfilter/svndumpfilter.c:1032
+#: ../svndumpfilter/svndumpfilter.c:1062
msgid ""
"Remove all empty revisions found in dumpstream\n"
" except revision 0."
msgstr ""
-#: ../svndumpfilter/svndumpfilter.c:1035
+#: ../svndumpfilter/svndumpfilter.c:1065
msgid "Renumber revisions left after filtering."
msgstr "过滤åŽé‡ç¼–余下的版本。"
-#: ../svndumpfilter/svndumpfilter.c:1038
+#: ../svndumpfilter/svndumpfilter.c:1068
msgid "Skip missing merge sources."
msgstr "跳过缺少的åˆå¹¶æº"
-#: ../svndumpfilter/svndumpfilter.c:1040
+#: ../svndumpfilter/svndumpfilter.c:1070
msgid "Don't filter revision properties."
msgstr "ä¸è¿‡æ»¤ç‰ˆæœ¬å±žæ€§ã€‚"
-#: ../svndumpfilter/svndumpfilter.c:1042
+#: ../svndumpfilter/svndumpfilter.c:1072
msgid ""
"Read additional prefixes, one per line, from\n"
" file ARG."
msgstr "从文件 ARG 中读å–é¢å¤–çš„å‰ç¼€ï¼Œæ¯ä¸ªä¸€è¡Œã€‚"
-#: ../svndumpfilter/svndumpfilter.c:1054
+#: ../svndumpfilter/svndumpfilter.c:1084
msgid ""
"Filter out nodes with given prefixes from dumpstream.\n"
"usage: svndumpfilter exclude PATH_PREFIX...\n"
@@ -13393,7 +14824,7 @@ msgstr ""
"从转存æµåˆ é™¤åŒ¹é…指定å‰ç¼€çš„节点。\n"
"用法: svndumpfilter exclude PATH_PREFIX...\n"
-#: ../svndumpfilter/svndumpfilter.c:1063
+#: ../svndumpfilter/svndumpfilter.c:1093
msgid ""
"Filter out nodes without given prefixes from dumpstream.\n"
"usage: svndumpfilter include PATH_PREFIX...\n"
@@ -13401,7 +14832,7 @@ msgstr ""
"从转储串æµä¸­åˆ é™¤æœªåŒ…å«æŒ‡å®šå‰ç¼€çš„节点。\n"
"用法: svndumpfilter include PATH_PREFIX...\n"
-#: ../svndumpfilter/svndumpfilter.c:1072
+#: ../svndumpfilter/svndumpfilter.c:1102
msgid ""
"Describe the usage of this program or its subcommands.\n"
"usage: svndumpfilter help [SUBCOMMAND...]\n"
@@ -13409,9 +14840,11 @@ msgstr ""
"æ述本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
"用法: svndumpfilter help [SUBCOMMAND...]\n"
-#: ../svndumpfilter/svndumpfilter.c:1148
+#: ../svndumpfilter/svndumpfilter.c:1178
+#, fuzzy
msgid ""
"general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]\n"
+"Subversion repository dump filtering tool.\n"
"Type 'svndumpfilter help <subcommand>' for help on a specific subcommand.\n"
"Type 'svndumpfilter --version' to see the program version.\n"
"\n"
@@ -13423,47 +14856,47 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svndumpfilter/svndumpfilter.c:1206
+#: ../svndumpfilter/svndumpfilter.c:1237
#, c-format
msgid "Excluding (and dropping empty revisions for) prefix patterns:\n"
msgstr "排除(以åŠä¸¢å¼ƒç©ºç‰ˆæœ¬)çš„å‰ç¼€åŒ¹é…模å¼: \n"
-#: ../svndumpfilter/svndumpfilter.c:1208
+#: ../svndumpfilter/svndumpfilter.c:1239
#, c-format
msgid "Excluding prefix patterns:\n"
msgstr "排除å‰ç¼€åŒ¹é…模å¼: \n"
-#: ../svndumpfilter/svndumpfilter.c:1211
+#: ../svndumpfilter/svndumpfilter.c:1242
#, c-format
msgid "Including (and dropping empty revisions for) prefix patterns:\n"
msgstr "包å«(以åŠä¸¢å¼ƒç©ºç‰ˆæœ¬)çš„å‰ç¼€åŒ¹é…模å¼: \n"
-#: ../svndumpfilter/svndumpfilter.c:1213
+#: ../svndumpfilter/svndumpfilter.c:1244
#, c-format
msgid "Including prefix patterns:\n"
msgstr "包å«çš„å‰ç¼€åŒ¹é…模å¼: \n"
-#: ../svndumpfilter/svndumpfilter.c:1221
+#: ../svndumpfilter/svndumpfilter.c:1252
#, c-format
msgid "Excluding (and dropping empty revisions for) prefixes:\n"
msgstr "排除 (以åŠä¸¢å¼ƒç©ºç‰ˆæœ¬) çš„å‰ç¼€: \n"
-#: ../svndumpfilter/svndumpfilter.c:1223
+#: ../svndumpfilter/svndumpfilter.c:1254
#, c-format
msgid "Excluding prefixes:\n"
msgstr "排除å‰ç¼€: \n"
-#: ../svndumpfilter/svndumpfilter.c:1226
+#: ../svndumpfilter/svndumpfilter.c:1257
#, c-format
msgid "Including (and dropping empty revisions for) prefixes:\n"
msgstr "åŒ…å« (以åŠä¸¢å¼ƒç©ºç‰ˆæœ¬) çš„å‰ç¼€: \n"
-#: ../svndumpfilter/svndumpfilter.c:1228
+#: ../svndumpfilter/svndumpfilter.c:1259
#, c-format
msgid "Including prefixes:\n"
msgstr "包å«çš„å‰ç¼€: \n"
-#: ../svndumpfilter/svndumpfilter.c:1256
+#: ../svndumpfilter/svndumpfilter.c:1287
#, c-format
msgid ""
"Dropped %d revision.\n"
@@ -13475,26 +14908,27 @@ msgstr[0] ""
"删除 %d 个版本。\n"
"\n"
-#: ../svndumpfilter/svndumpfilter.c:1264
+#: ../svndumpfilter/svndumpfilter.c:1295
msgid "Revisions renumbered as follows:\n"
msgstr "版本被é‡æ–°ç¼–å·å¦‚下: \n"
-#: ../svndumpfilter/svndumpfilter.c:1292
+#: ../svndumpfilter/svndumpfilter.c:1322
#, c-format
msgid " %ld => (dropped)\n"
msgstr " %ld => (丢弃)\n"
-#: ../svndumpfilter/svndumpfilter.c:1307
+#: ../svndumpfilter/svndumpfilter.c:1337
#, c-format
msgid "Dropped %d node:\n"
msgid_plural "Dropped %d nodes:\n"
msgstr[0] "丢弃 %d 个节点: \n"
-#: ../svndumpfilter/svndumpfilter.c:1476
+#: ../svndumpfilter/svndumpfilter.c:1495
+#, fuzzy
msgid "--drop-empty-revs cannot be used with --drop-all-empty-revs"
-msgstr "--drop-empty-rev ä¸èƒ½ä¸Ž --drop-all-empty-revs 共存"
+msgstr "--depth ä¸èƒ½ä¸Ž --reintegrate 共存"
-#: ../svndumpfilter/svndumpfilter.c:1596
+#: ../svndumpfilter/svndumpfilter.c:1612
#, c-format
msgid ""
"\n"
@@ -13503,7 +14937,7 @@ msgstr ""
"\n"
"错误: 没有æä¾›å‰ç¼€ã€‚\n"
-#: ../svndumpfilter/svndumpfilter.c:1627
+#: ../svndumpfilter/svndumpfilter.c:1643
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -13512,64 +14946,250 @@ msgstr ""
"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
"使用“svndumpfilter help %sâ€å¾—到用法。\n"
-#: ../svndumpfilter/svndumpfilter.c:1645
+#: ../svndumpfilter/svndumpfilter.c:1661
msgid "Try 'svndumpfilter help' for more info"
msgstr "请使用“svndumpfilter helpâ€ä»¥å¾—到更多信æ¯"
-#: ../svnlook/svnlook.c:116
+#: ../svnfsfs/load-index-cmd.c:54
+#, fuzzy, c-format
+msgid "Unknown item type '%s'"
+msgstr "未知的文件系统类型 “%sâ€"
+
+#: ../svnfsfs/load-index-cmd.c:73
+#, c-format
+msgid "%i columns needed, %i provided"
+msgstr ""
+
+#: ../svnfsfs/load-index-cmd.c:83
+#, fuzzy, c-format
+msgid "%s is not a value HEX string"
+msgstr "路径ä¸æ˜¯å­—符串"
+
+#: ../svnfsfs/stats-cmd.c:41
+#, c-format
+msgid ""
+"%20s bytes in %12s reps\n"
+"%20s bytes in %12s shared reps\n"
+"%20s bytes expanded size\n"
+"%20s bytes expanded shared size\n"
+"%20s bytes with rep-sharing off\n"
+"%20s shared references\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:65
+#, c-format
+msgid "%12s r%-8ld %s\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:91
+#, c-format
+msgid " [2^%2d, 2^%2d) %15s (%2d%%) bytes in %12s (%2d%%) items\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:210 ../svnfsfs/stats-cmd.c:217
+#, c-format
+msgid "%11s %20s (%2d%%) representations\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:240 ../svnfsfs/stats-cmd.c:247
+#: ../svnfsfs/stats-cmd.c:270 ../svnfsfs/stats-cmd.c:277
+#, c-format
+msgid "%11s %20s (%2d%%) bytes\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:318
+#, c-format
+msgid ""
+"%20s bytes in %12s revisions\n"
+"%20s bytes in %12s changes\n"
+"%20s bytes in %12s node revision records\n"
+"%20s bytes in %12s representations\n"
+"%20s bytes expanded representation size\n"
+"%20s bytes with rep-sharing off\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:338
+#, c-format
+msgid ""
+"%20s bytes in %12s nodes total\n"
+"%20s bytes in %12s directory noderevs\n"
+"%20s bytes in %12s file noderevs\n"
+msgstr ""
+
+#: ../svnfsfs/stats-cmd.c:349
+#, c-format
+msgid ""
+"%20s bytes in %12s representations total\n"
+"%20s bytes in %12s directory representations\n"
+"%20s bytes in %12s file representations\n"
+"%20s bytes in %12s representations of added file nodes\n"
+"%20s bytes in %12s directory property representations\n"
+"%20s bytes in %12s file property representations\n"
+"%20s bytes in header & footer overhead\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:144
+#, fuzzy
+msgid ""
+"size of the extra in-memory cache in MB used to\n"
+" minimize redundant operations. Default: 16."
+msgstr ""
+"用æ¥å‡å°‘冗余æ“作的内存中的é¢å¤–缓存的大å°(MB)\n"
+" 默认值: 16。\n"
+" [仅用于 FSFS 仓库]"
+
+#: ../svnfsfs/svnfsfs.c:157
+#, fuzzy
+msgid ""
+"usage: svnfsfs help [SUBCOMMAND...]\n"
+"\n"
+"Describe the usage of this program or its subcommands.\n"
+msgstr ""
+"用法: svnsync help [SUBCOMMAND...]\n"
+"\n"
+"显示本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
+
+#: ../svnfsfs/svnfsfs.c:162
+msgid ""
+"usage: svnfsfs dump-index REPOS_PATH -r REV\n"
+"\n"
+"Dump the index contents for the revision / pack file containing revision REV\n"
+"to console. This is only available for FSFS format 7 (SVN 1.9+) repositories.\n"
+"The table produced contains a header in the first line followed by one line\n"
+"per index entry, ordered by location in the revision / pack file. Columns:\n"
+"\n"
+" * Byte offset (hex) at which the item starts\n"
+" * Length (hex) of the item in bytes\n"
+" * Item type (string) is one of the following:\n"
+"\n"
+" none ... Unused section. File contents shall be NULs.\n"
+" frep ... File representation.\n"
+" drep ... Directory representation.\n"
+" fprop .. File property.\n"
+" dprop .. Directory property.\n"
+" node ... Node revision.\n"
+" chgs ... Changed paths list.\n"
+" rep .... Representation of unknown type. Should not be used.\n"
+" ??? .... Invalid. Index data is corrupt.\n"
+"\n"
+" The distinction between frep, drep, fprop and dprop is a mere internal\n"
+" classification used for various optimizations and does not affect the\n"
+" operational correctness.\n"
+"\n"
+" * Revision that the item belongs to (decimal)\n"
+" * Item number (decimal) within that revision\n"
+" * Modified FNV1a checksum (8 hex digits)\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:188
+msgid ""
+"usage: svnfsfs load-index REPOS_PATH\n"
+"\n"
+"Read index contents from console. The format is the same as produced by the\n"
+"dump-index command, except that checksum as well as header are optional and will\n"
+"be ignored. The data must cover the full revision / pack file; the revision\n"
+"number is automatically extracted from input stream. No ordering is required.\n"
+msgstr ""
+
+#: ../svnfsfs/svnfsfs.c:196
+#, fuzzy
+msgid ""
+"usage: svnfsfs stats REPOS_PATH\n"
+"\n"
+"Write object size statistics to console.\n"
+msgstr ""
+"用法: svnlook youngest REPOS_PATH\n"
+"\n"
+"显示最新的版本å·ã€‚\n"
+
+#: ../svnfsfs/svnfsfs.c:216
+#, fuzzy, c-format
+msgid "%s repositories are not supported"
+msgstr "ä¸æ”¯æŒç‰ˆæœ¬åº“å‡çº§"
+
+#: ../svnfsfs/svnfsfs.c:232
+#, fuzzy
+msgid ""
+"general usage: svnfsfs SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion FSFS repository manipulation tool.\n"
+"Type 'svnfsfs help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnfsfs --version' to see the program version.\n"
+"\n"
+"Available subcommands:\n"
+msgstr ""
+"一般用法: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"使用“svnadmin help <subcommand>†得到å­å‘½ä»¤çš„帮助信æ¯ã€‚\n"
+"使用“svnadmin --versionâ€æŸ¥çœ‹ç¨‹åºçš„版本å·å’Œæ–‡ä»¶ç³»ç»Ÿæ¨¡å—。\n"
+"\n"
+"å¯ç”¨çš„å­å‘½ä»¤: \n"
+
+#: ../svnfsfs/svnfsfs.c:459
+#, fuzzy, c-format
+msgid ""
+"Subcommand '%s' doesn't accept option '%s'\n"
+"Type 'svnfsfs help %s' for usage.\n"
+msgstr ""
+"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
+"输入“svn help %sâ€å¾—到用法。\n"
+
+#: ../svnfsfs/svnfsfs.c:503
+#, fuzzy
+msgid "Try 'svnfsfs help' for more info"
+msgstr "请使用 “svnsync help†以得到更多信æ¯"
+
+#: ../svnlook/svnlook.c:118
msgid "show details for copies"
msgstr "显示æ¯ä¸ªå‰¯æœ¬çš„详细信æ¯"
-#: ../svnlook/svnlook.c:119
+#: ../svnlook/svnlook.c:121
msgid "print differences against the copy source"
msgstr "显示与原始内容的差异"
-#: ../svnlook/svnlook.c:122
+#: ../svnlook/svnlook.c:124
msgid "show full paths instead of indenting them"
msgstr "显示完整路径(代替缩进)"
-#: ../svnlook/svnlook.c:128
+#: ../svnlook/svnlook.c:130
msgid "maximum number of history entries"
msgstr "历å²é¡¹æœ€å¤§æ•°é‡"
-#: ../svnlook/svnlook.c:146
+#: ../svnlook/svnlook.c:151
msgid "operate on single directory only"
msgstr "åªåœ¨å•ä¸ªç›®å½•æ“作"
-#: ../svnlook/svnlook.c:149
+#: ../svnlook/svnlook.c:154
msgid "specify revision number ARG"
msgstr "æŒ‡å®šç‰ˆæœ¬ç¼–å· ARG"
-#: ../svnlook/svnlook.c:152
+#: ../svnlook/svnlook.c:157
msgid "operate on a revision property (use with -r or -t)"
msgstr "æ“作版本的属性(使用 -r 或 -t)"
-#: ../svnlook/svnlook.c:155
+#: ../svnlook/svnlook.c:160
msgid "show node revision ids for each path"
msgstr "为æ¯ä¸ªè·¯å¾„显示节点版本编å·"
-#: ../svnlook/svnlook.c:158
+#: ../svnlook/svnlook.c:163
+#, fuzzy
msgid "show path's inherited properties"
-msgstr "显示路径继承的属性"
+msgstr "显示完整路径(代替缩进)"
-#: ../svnlook/svnlook.c:164
+#: ../svnlook/svnlook.c:169
msgid "be verbose"
msgstr "详细"
-#: ../svnlook/svnlook.c:173
+#: ../svnlook/svnlook.c:178
#, fuzzy
msgid ""
"Specify differencing options for external diff or\n"
" internal diff. Default: '-u'. Options are\n"
" separated by spaces. Internal diff takes:\n"
-" -u, --unified: Show 3 lines of unified "
-"context\n"
+" -u, --unified: Show 3 lines of unified context\n"
" -b, --ignore-space-change: Ignore changes in\n"
" amount of white space\n"
-" -w, --ignore-all-space: Ignore all white "
-"space\n"
-" --ignore-eol-style: Ignore changes in EOL "
-"style\n"
+" -w, --ignore-all-space: Ignore all white space\n"
+" --ignore-eol-style: Ignore changes in EOL style\n"
+" -U ARG, --context ARG: Show ARG lines of context\n"
" -p, --show-c-function: Show C function name"
msgstr ""
"缺çœ: “-uâ€ã€‚当 Subversion 调用外部比较程åºæ—¶ï¼ŒARG 直接传给它。但是当\n"
@@ -13586,7 +15206,12 @@ msgstr ""
" -p (--show-c-function):\n"
" 在比较输出中显示 C 函数å称。"
-#: ../svnlook/svnlook.c:204
+#: ../svnlook/svnlook.c:199 ../svnrdump/svnrdump.c:133
+#: ../svnserve/svnserve.c:378 ../svnversion/svnversion.c:146
+msgid "no progress (only errors) to stderr"
+msgstr "在标准错误输出ä¸æ˜¾ç¤ºè¿›åº¦ (仅错误)"
+
+#: ../svnlook/svnlook.c:211
msgid ""
"usage: svnlook author REPOS_PATH\n"
"\n"
@@ -13596,7 +15221,7 @@ msgstr ""
"\n"
"显示作者。\n"
-#: ../svnlook/svnlook.c:209
+#: ../svnlook/svnlook.c:216
msgid ""
"usage: svnlook cat REPOS_PATH FILE_PATH\n"
"\n"
@@ -13606,7 +15231,7 @@ msgstr ""
"\n"
"显示文件的内容。å¯çœç•¥ FILE_PATH å‰çš„“/â€ã€‚\n"
-#: ../svnlook/svnlook.c:214
+#: ../svnlook/svnlook.c:221
msgid ""
"usage: svnlook changed REPOS_PATH\n"
"\n"
@@ -13616,7 +15241,7 @@ msgstr ""
"\n"
"显示已改å˜çš„路径。\n"
-#: ../svnlook/svnlook.c:219
+#: ../svnlook/svnlook.c:226
msgid ""
"usage: svnlook date REPOS_PATH\n"
"\n"
@@ -13626,7 +15251,7 @@ msgstr ""
"\n"
"显示时戳。\n"
-#: ../svnlook/svnlook.c:224
+#: ../svnlook/svnlook.c:231
msgid ""
"usage: svnlook diff REPOS_PATH\n"
"\n"
@@ -13636,7 +15261,7 @@ msgstr ""
"\n"
"以 GNU æ ·å¼ï¼Œæ˜¾ç¤ºç‰ˆæœ¬åº“中改å˜çš„文件与属性差异。\n"
-#: ../svnlook/svnlook.c:231
+#: ../svnlook/svnlook.c:238
msgid ""
"usage: svnlook dirs-changed REPOS_PATH\n"
"\n"
@@ -13647,7 +15272,7 @@ msgstr ""
"\n"
"æ˜¾ç¤ºæœ¬èº«æ”¹å˜ (编辑属性) 的目录,或是其中的文件修改过的目录。\n"
-#: ../svnlook/svnlook.c:237
+#: ../svnlook/svnlook.c:244
msgid ""
"usage: svnlook filesize REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -13658,7 +15283,7 @@ msgstr ""
"\n"
"显示ä½äºŽ PATH_IN_REPOS 的文件在版本库中展现的大å°(字节)\n"
-#: ../svnlook/svnlook.c:243
+#: ../svnlook/svnlook.c:250
msgid ""
"usage: svnlook help [SUBCOMMAND...]\n"
"\n"
@@ -13668,7 +15293,7 @@ msgstr ""
"\n"
"显示本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
-#: ../svnlook/svnlook.c:248
+#: ../svnlook/svnlook.c:255
msgid ""
"usage: svnlook history REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -13679,7 +15304,7 @@ msgstr ""
"\n"
"显示版本库中,æŸä¸ªè·¯å¾„的历å²è®°å½•ä¿¡æ¯ (如果没有指定路径,则为根目录)。\n"
-#: ../svnlook/svnlook.c:254
+#: ../svnlook/svnlook.c:261
msgid ""
"usage: svnlook info REPOS_PATH\n"
"\n"
@@ -13689,7 +15314,7 @@ msgstr ""
"\n"
"显示作者,时戳,日志信æ¯å¤§å°ï¼Œä»¥åŠæ—¥å¿—ä¿¡æ¯ã€‚\n"
-#: ../svnlook/svnlook.c:259
+#: ../svnlook/svnlook.c:266
msgid ""
"usage: svnlook lock REPOS_PATH PATH_IN_REPOS\n"
"\n"
@@ -13699,7 +15324,7 @@ msgstr ""
"\n"
"如果版本库中的路径存在é”,显示其详细信æ¯ã€‚\n"
-#: ../svnlook/svnlook.c:264
+#: ../svnlook/svnlook.c:271
msgid ""
"usage: svnlook log REPOS_PATH\n"
"\n"
@@ -13709,7 +15334,7 @@ msgstr ""
"\n"
"显示日志信æ¯ã€‚\n"
-#: ../svnlook/svnlook.c:269
+#: ../svnlook/svnlook.c:276
msgid ""
"usage: 1. svnlook propget REPOS_PATH PROPNAME PATH_IN_REPOS\n"
" 2. svnlook propget --revprop REPOS_PATH PROPNAME\n"
@@ -13723,7 +15348,7 @@ msgstr ""
"显示版本库中指定路径上属性的原始值。\n"
"用 --revprop 选项显示版本属性的原始值。\n"
-#: ../svnlook/svnlook.c:278
+#: ../svnlook/svnlook.c:285
msgid ""
"usage: 1. svnlook proplist REPOS_PATH PATH_IN_REPOS\n"
" 2. svnlook proplist --revprop REPOS_PATH\n"
@@ -13739,7 +15364,7 @@ msgstr ""
"使用 --revprop 选项列出版本属性。\n"
"使用 -v 选项显示属性的内容。\n"
-#: ../svnlook/svnlook.c:289
+#: ../svnlook/svnlook.c:296
msgid ""
"usage: svnlook tree REPOS_PATH [PATH_IN_REPOS]\n"
"\n"
@@ -13751,7 +15376,7 @@ msgstr ""
"显示目录树,从 PATH_IN_REPOS 开始 (如果çœç•¥æ­¤å‚数就从版本库的根目录开始),\n"
"å¯é€‰çš„显示节点版本 id。\n"
-#: ../svnlook/svnlook.c:295
+#: ../svnlook/svnlook.c:302
msgid ""
"usage: svnlook uuid REPOS_PATH\n"
"\n"
@@ -13761,7 +15386,7 @@ msgstr ""
"\n"
"显示版本库的 UUID。\n"
-#: ../svnlook/svnlook.c:300
+#: ../svnlook/svnlook.c:307
msgid ""
"usage: svnlook youngest REPOS_PATH\n"
"\n"
@@ -13771,28 +15396,28 @@ msgstr ""
"\n"
"显示最新的版本å·ã€‚\n"
-#: ../svnlook/svnlook.c:860
+#: ../svnlook/svnlook.c:870
#, c-format
msgid "Copied: %s (from rev %ld, %s)\n"
msgstr "å·²å¤åˆ¶: %s (æ¥è‡ªç‰ˆæœ¬ %ld,%s)\n"
-#: ../svnlook/svnlook.c:928
+#: ../svnlook/svnlook.c:938
msgid "Added"
msgstr "已增加"
-#: ../svnlook/svnlook.c:929
+#: ../svnlook/svnlook.c:939
msgid "Deleted"
msgstr "已删除"
-#: ../svnlook/svnlook.c:930
+#: ../svnlook/svnlook.c:940
msgid "Modified"
msgstr "已修改"
-#: ../svnlook/svnlook.c:931
+#: ../svnlook/svnlook.c:941
msgid "Index"
msgstr "索引"
-#: ../svnlook/svnlook.c:942
+#: ../svnlook/svnlook.c:952
msgid ""
"(Binary files differ)\n"
"\n"
@@ -13800,30 +15425,30 @@ msgstr ""
"(二进制文件ä¸åŒ)\n"
"\n"
-#: ../svnlook/svnlook.c:1221
+#: ../svnlook/svnlook.c:1232
msgid "unknown"
msgstr "未知"
-#: ../svnlook/svnlook.c:1278
+#: ../svnlook/svnlook.c:1289
#, c-format
msgid "Transaction '%s' is not based on a revision; how odd"
msgstr "事务“%sâ€å¹¶éžåŸºäºŽæŸä¸ªç‰ˆæœ¬ï¼›å¤šç¥žç§˜å•Šï¼"
-#: ../svnlook/svnlook.c:1421
+#: ../svnlook/svnlook.c:1432
#, c-format
msgid "'%s' is a URL, probably should be a path"
msgstr "“%sâ€æ˜¯ URL,也许应该是路径。"
-#: ../svnlook/svnlook.c:1444 ../svnlook/svnlook.c:1467
+#: ../svnlook/svnlook.c:1455 ../svnlook/svnlook.c:1478
#, c-format
msgid "Path '%s' is not a file"
msgstr "路径“%sâ€ä¸æ˜¯æ–‡ä»¶"
-#: ../svnlook/svnlook.c:1603
+#: ../svnlook/svnlook.c:1614
msgid "History item limit reached"
msgstr "达到历å²é¡¹ç›®é™åˆ¶"
-#: ../svnlook/svnlook.c:1622
+#: ../svnlook/svnlook.c:1633
#, c-format
msgid ""
"REVISION PATH <ID>\n"
@@ -13832,7 +15457,7 @@ msgstr ""
"修 订 版 路径 <ID>\n"
"-------- ---------\n"
-#: ../svnlook/svnlook.c:1627
+#: ../svnlook/svnlook.c:1638
#, c-format
msgid ""
"REVISION PATH\n"
@@ -13841,47 +15466,50 @@ msgstr ""
"修 订 版 路径\n"
"-------- ----\n"
-#: ../svnlook/svnlook.c:1699
+#: ../svnlook/svnlook.c:1711
#, c-format
msgid "Property '%s' not found on revision %ld"
msgstr "属性“%sâ€åœ¨ç‰ˆæœ¬ %ld 中找ä¸åˆ°"
-#: ../svnlook/svnlook.c:1708
+#: ../svnlook/svnlook.c:1715
#, fuzzy, c-format
-msgid ""
-"Property '%s' not found on path '%s' or inherited from a parent in revision "
-"%ld"
+msgid "Property '%s' not found on transaction %s"
+msgstr "属性“%sâ€åœ¨ç‰ˆæœ¬ %ld 中找ä¸åˆ°"
+
+#: ../svnlook/svnlook.c:1724
+#, fuzzy, c-format
+msgid "Property '%s' not found on path '%s' or inherited from a parent in revision %ld"
msgstr "属性 “%s†ä¸åœ¨è·¯å¾„ “%s†的版本 %ld 中"
-#: ../svnlook/svnlook.c:1714
+#: ../svnlook/svnlook.c:1730
#, c-format
msgid "Property '%s' not found on path '%s' in revision %ld"
msgstr "属性 “%s†ä¸åœ¨è·¯å¾„ “%s†的版本 %ld 中"
-#: ../svnlook/svnlook.c:1722
+#: ../svnlook/svnlook.c:1738
#, fuzzy, c-format
-msgid ""
-"Property '%s' not found on path '%s' or inherited from a parent in "
-"transaction %s"
+msgid "Property '%s' not found on path '%s' or inherited from a parent in transaction %s"
msgstr "属性 “%s†ä¸åœ¨è·¯å¾„ “%s†中,事务 “%sâ€"
-#: ../svnlook/svnlook.c:1728
+#: ../svnlook/svnlook.c:1744
#, c-format
msgid "Property '%s' not found on path '%s' in transaction %s"
msgstr "属性 “%s†ä¸åœ¨è·¯å¾„ “%s†中,事务 “%sâ€"
-#: ../svnlook/svnlook.c:2063
+#: ../svnlook/svnlook.c:2080
msgid "Missing repository path argument"
msgstr "未æ供版本库路径å‚æ•°"
-#: ../svnlook/svnlook.c:2215
+#: ../svnlook/svnlook.c:2232
+#, fuzzy
msgid ""
"general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+"Subversion repository inspection tool.\n"
+"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
+"Type 'svnlook --version' to see the program version and FS modules.\n"
"Note: any subcommand which takes the '--revision' and '--transaction'\n"
" options will, if invoked without one of those options, act on\n"
" the repository's youngest revision.\n"
-"Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
-"Type 'svnlook --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n"
msgstr ""
@@ -13893,7 +15521,7 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svnlook/svnlook.c:2293
+#: ../svnlook/svnlook.c:2311
#, c-format
msgid ""
"Comment (%i line):\n"
@@ -13905,50 +15533,48 @@ msgstr[0] ""
"注释 (%i 行): \n"
"%s\n"
-#: ../svnlook/svnlook.c:2345
+#: ../svnlook/svnlook.c:2363
#, c-format
msgid "Missing propname argument"
msgstr "丢失属性åå‚æ•°"
-#: ../svnlook/svnlook.c:2346
+#: ../svnlook/svnlook.c:2364
#, c-format
msgid "Missing propname and repository path arguments"
msgstr "未æ供属性å称与版本库路径å‚æ•°"
-#: ../svnlook/svnlook.c:2352
+#: ../svnlook/svnlook.c:2370
msgid "Missing propname or repository path argument"
msgstr "未æ供属性å称或版本库路径å‚æ•°"
-#: ../svnlook/svnlook.c:2516
+#: ../svnlook/svnlook.c:2523
msgid "Invalid revision number supplied"
msgstr "æ供了无效的版本å·ç "
-#: ../svnlook/svnlook.c:2628
-msgid ""
-"The '--transaction' (-t) and '--revision' (-r) arguments cannot co-exist"
+#: ../svnlook/svnlook.c:2637
+msgid "The '--transaction' (-t) and '--revision' (-r) arguments cannot co-exist"
msgstr "“--transaction†(-t) 与 “--revision†(-r) å‚æ•°ä¸èƒ½åŒæ—¶å­˜åœ¨"
-#: ../svnlook/svnlook.c:2635
-msgid ""
-"Cannot use the '--show-inherited-props' option with the '--revprop' option"
+#: ../svnlook/svnlook.c:2644
+msgid "Cannot use the '--show-inherited-props' option with the '--revprop' option"
msgstr ""
-#: ../svnlook/svnlook.c:2694
-#, c-format
+#: ../svnlook/svnlook.c:2701
+#, fuzzy, c-format
msgid "Try 'svnadmin verify' instead.\n"
-msgstr "请è¿è¡Œâ€œsvnadmin verifyâ€ã€‚\n"
+msgstr "å°è¯• “svn revert --depth infinityâ€ï¼Ÿ"
-#: ../svnlook/svnlook.c:2728
+#: ../svnlook/svnlook.c:2734
#, c-format
msgid "Repository argument required\n"
msgstr "需è¦ç‰ˆæœ¬åº“å‚æ•°\n"
-#: ../svnlook/svnlook.c:2737
+#: ../svnlook/svnlook.c:2743
#, c-format
msgid "'%s' is a URL when it should be a path\n"
msgstr "“%sâ€åº”该是路径,å´æ˜¯URL\n"
-#: ../svnlook/svnlook.c:2789
+#: ../svnlook/svnlook.c:2793
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -13957,14 +15583,20 @@ msgstr ""
"å­å‘½ä»¤â€œ%sâ€å¹¶ä¸æŽ¥å—选项“%sâ€\n"
"使用“svnlook help %sâ€å¾—到用法。\n"
-#: ../svnlook/svnlook.c:2832
+#: ../svnlook/svnlook.c:2836
msgid "Try 'svnlook help' for more info"
msgstr "请使用“svnlook helpâ€ä»¥å¾—到更多信æ¯"
-#: ../svnmucc/svnmucc.c:926
+#: ../svnmucc/svnmucc.c:258
+#, fuzzy, c-format
+msgid "Type 'svnmucc --help' for usage.\n"
+msgstr "使用“%s --helpâ€å¾—到用法。\n"
+
+#: ../svnmucc/svnmucc.c:266
msgid ""
-"Subversion multiple URL command client\n"
"usage: svnmucc ACTION...\n"
+"Subversion multiple URL command client.\n"
+"Type 'svnmucc --version' to see the program version and RA modules.\n"
"\n"
" Perform one or more Subversion repository URL-based ACTIONs, committing\n"
" the result as a (single) new revision.\n"
@@ -13994,9 +15626,18 @@ msgid ""
" prompt only if standard input is a terminal)\n"
" --force-interactive : do interactive prompting even if standard\n"
" input is not a terminal\n"
-" --trust-server-cert : accept SSL server certificates from unknown\n"
-" certificate authorities without prompting (but\n"
-" only with '--non-interactive')\n"
+" --trust-server-cert : deprecated; same as --trust-unknown-ca\n"
+" --trust-unknown-ca : with --non-interactive, accept SSL server\n"
+" certificates from unknown certificate authorities\n"
+" --trust-cn-mismatch : with --non-interactive, accept SSL server\n"
+" certificates even if the server hostname does not\n"
+" match the certificate's common name attribute\n"
+" --trust-expired : with --non-interactive, accept expired SSL server\n"
+" certificates\n"
+" --trust-not-yet-valid : with --non-interactive, accept SSL server\n"
+" certificates from the future\n"
+" --trust-other-failure : with --non-interactive, accept SSL server\n"
+" certificates with failures other than the above\n"
" -X [--extra-args] ARG : append arguments from file ARG (one per line;\n"
" use \"-\" to read from standard input)\n"
" --config-dir ARG : use ARG to override the config directory\n"
@@ -14005,24 +15646,26 @@ msgid ""
" --version : print version information\n"
msgstr ""
-#: ../svnmucc/svnmucc.c:1002
-msgid ""
-"--message (-m), --file (-F), and --with-revprop=svn:log are mutually "
-"exclusive"
-msgstr "--message (-m),--file (-F) 与 --with-revprop=svn:log 是互斥的"
+#: ../svnmucc/svnmucc.c:349
+#, fuzzy
+msgid "--message (-m), --file (-F), and --with-revprop=svn:log are mutually exclusive"
+msgstr "--message (-m) 与 --file (-F) 是互斥的"
-#: ../svnrdump/load_editor.c:382 ../svnsync/svnsync.c:326
+#: ../svnmucc/svnmucc.c:590
+#, fuzzy, c-format
+msgid "Invalid revision number '%s'"
+msgstr "无效的版本å·â€œ%ldâ€"
+
+#: ../svnrdump/load_editor.c:386 ../svnsync/svnsync.c:362
#, c-format
msgid "Failed to get lock on destination repos, currently held by '%s'\n"
msgstr "从目标版本库获得é”失败,当å‰è¢«â€œ%sâ€æŒæœ‰\n"
-#: ../svnrdump/load_editor.c:526
-msgid ""
-"Target server does not support atomic revision property edits; consider "
-"upgrading it to 1.7."
+#: ../svnrdump/load_editor.c:530
+msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7."
msgstr "目标æœåŠ¡å™¨ä¸æ”¯æŒåŽŸå­ç‰ˆæœ¬çš„属性编辑; 请考虑å‡çº§åˆ° 1.7 。"
-#: ../svnrdump/svnrdump.c:101
+#: ../svnrdump/svnrdump.c:112
msgid ""
"usage: svnrdump dump URL [-r LOWER[:UPPER]]\n"
"\n"
@@ -14032,11 +15675,10 @@ msgid ""
msgstr ""
"用法: svnrdump dump URL [-r LOWER[:UPPER]]\n"
"\n"
-"以å¯ç§»æ¤çš„ 'dumpfile' æ ¼å¼å¯¼å‡ºè¿œç¨‹ç‰ˆæœ¬åº“ URL 中的 LOWER 到 UPPER 的所有版本到"
-"标准输出。\n"
+"以å¯ç§»æ¤çš„ 'dumpfile' æ ¼å¼å¯¼å‡ºè¿œç¨‹ç‰ˆæœ¬åº“ URL 中的 LOWER 到 UPPER 的所有版本到标准输出。\n"
"如果åªç»™å‡º LOWER,那么就导出这一个版本。\n"
-#: ../svnrdump/svnrdump.c:107
+#: ../svnrdump/svnrdump.c:118
msgid ""
"usage: svnrdump load URL\n"
"\n"
@@ -14046,7 +15688,7 @@ msgstr ""
"\n"
"从标准输入加载 'dumpfile' 到远程版本库 URL。\n"
-#: ../svnrdump/svnrdump.c:111
+#: ../svnrdump/svnrdump.c:122
msgid ""
"usage: svnrdump help [SUBCOMMAND...]\n"
"\n"
@@ -14056,18 +15698,24 @@ msgstr ""
"\n"
"显示本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
-#: ../svnrdump/svnrdump.c:124
+#: ../svnrdump/svnrdump.c:135
msgid "dump incrementally"
msgstr "以增é‡æ–¹å¼è¿›è¡Œè½¬å­˜"
-#: ../svnrdump/svnrdump.c:142 ../svnserve/svnserve.c:282
-#: ../svnversion/svnversion.c:138
+#: ../svnrdump/svnrdump.c:137
+msgid "skip revision property ARG (e.g., \"svn:author\")"
+msgstr ""
+
+#: ../svnrdump/svnrdump.c:155 ../svnserve/svnserve.c:370
+#: ../svnversion/svnversion.c:142
msgid "display this help"
msgstr "显示本帮助"
-#: ../svnrdump/svnrdump.c:731
+#: ../svnrdump/svnrdump.c:755
+#, fuzzy
msgid ""
"general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+"Subversion remote repository dump and load tool.\n"
"Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnrdump --version' to see the program version and RA modules.\n"
"\n"
@@ -14079,22 +15727,20 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svnrdump/svnrdump.c:775 ../svnrdump/svnrdump.c:809
+#: ../svnrdump/svnrdump.c:800 ../svnrdump/svnrdump.c:834
msgid "Unsupported revision specifier used; use only integer values or 'HEAD'"
msgstr "使用了ä¸æ”¯æŒçš„版本格å¼ï¼›è¯·åªä½¿ç”¨ 'HEAD' 或整数"
-#: ../svnrdump/svnrdump.c:783 ../svnrdump/svnrdump.c:817
+#: ../svnrdump/svnrdump.c:808 ../svnrdump/svnrdump.c:842
#, c-format
msgid "Revision '%ld' does not exist"
msgstr "版本 '%ld' ä¸å­˜åœ¨"
-#: ../svnrdump/svnrdump.c:827
-msgid ""
-"LOWER revision cannot be greater than UPPER revision; consider reversing "
-"your revision range"
+#: ../svnrdump/svnrdump.c:852
+msgid "LOWER revision cannot be greater than UPPER revision; consider reversing your revision range"
msgstr "LOWER 版本å·ä¸èƒ½å¤§äºŽ UPPER 版本å·ï¼›è€ƒè™‘将你的版本范围翻转"
-#: ../svnrdump/svnrdump.c:1072
+#: ../svnrdump/svnrdump.c:1111
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14107,69 +15753,84 @@ msgstr ""
msgid "Could not initialize the SASL library"
msgstr "ä¸èƒ½åˆå§‹åŒ– SASL 库"
-#: ../svnserve/cyrus_auth.c:260
+#: ../svnserve/cyrus_auth.c:191
+#, fuzzy, c-format
+msgid "Initial token is too long"
+msgstr "原å­çš„å称太长"
+
+#: ../svnserve/cyrus_auth.c:222
+#, fuzzy, c-format
+msgid "Step response is too long"
+msgstr "原å­çš„å称太长"
+
+#: ../svnserve/cyrus_auth.c:272
#, c-format
msgid "Can't get hostname"
msgstr "无法获å–主机å称"
-#: ../svnserve/cyrus_auth.c:325
+#: ../svnserve/cyrus_auth.c:329
msgid "Could not obtain the list of SASL mechanisms"
msgstr "ä¸èƒ½èŽ·å¾—SASL机制列表"
-#: ../svnserve/cyrus_auth.c:367
+#: ../svnserve/cyrus_auth.c:372
msgid "Couldn't obtain the authenticated username"
msgstr "ä¸èƒ½èŽ·å¾—å·²ç»è®¤è¯çš„用户å称"
-#: ../svnserve/serve.c:2042
+#: ../svnserve/serve.c:2079
msgid "Path is not a string"
msgstr "路径ä¸æ˜¯å­—符串"
-#: ../svnserve/serve.c:2199
+#: ../svnserve/serve.c:2249
msgid "Log revprop entry not a string"
msgstr "日志 revprop å…¥å£ä¸æ˜¯å­—符串"
-#: ../svnserve/serve.c:2205
+#: ../svnserve/serve.c:2255
#, c-format
msgid "Unknown revprop word '%s' in log command"
msgstr "日志命令中有未知的 revprop å•è¯ “%sâ€"
-#: ../svnserve/serve.c:2221
+#: ../svnserve/serve.c:2271
msgid "Log path entry not a string"
msgstr "日志路径入å£ä¸æ˜¯å­—符串"
-#: ../svnserve/svnserve.c:161
+#: ../svnserve/serve.c:2871 ../svnserve/serve.c:3047
+#, fuzzy, c-format
+msgid "No result for '%s'."
+msgstr "'%s' çš„æ•°æ®æŸå"
+
+#: ../svnserve/svnserve.c:216
msgid "daemon mode"
msgstr "åŽå°æ¨¡å¼"
-#: ../svnserve/svnserve.c:162
+#: ../svnserve/svnserve.c:217
msgid "inetd mode"
msgstr "inetd 模å¼"
-#: ../svnserve/svnserve.c:163
+#: ../svnserve/svnserve.c:218
msgid "tunnel mode"
msgstr "隧é“模å¼"
-#: ../svnserve/svnserve.c:164
+#: ../svnserve/svnserve.c:219
msgid "listen-once mode (useful for debugging)"
msgstr "监å¬ä¸€æ¬¡æ–¹å¼(调试用)"
-#: ../svnserve/svnserve.c:167
+#: ../svnserve/svnserve.c:222
msgid "Windows service mode (Service Control Manager)"
msgstr "Windows æœåŠ¡æ–¹å¼(æœåŠ¡ç®¡ç†å™¨)"
-#: ../svnserve/svnserve.c:169
+#: ../svnserve/svnserve.c:224
msgid "root of directory to serve"
msgstr "æœåŠ¡çš„根目录"
-#: ../svnserve/svnserve.c:171
+#: ../svnserve/svnserve.c:226
msgid "force read only, overriding repository config file"
msgstr "强制åªè¯»ï¼›è¦†ç›–版本库é…置文件"
-#: ../svnserve/svnserve.c:173
+#: ../svnserve/svnserve.c:228
msgid "read configuration from file ARG"
msgstr "从文件 ARG 读å–é…ç½®"
-#: ../svnserve/svnserve.c:176
+#: ../svnserve/svnserve.c:231
#, fuzzy
msgid ""
"listen port. The default port is 3690.\n"
@@ -14178,7 +15839,7 @@ msgstr ""
"写进程 PID 到文件 ARG\n"
" [æ–¹å¼: daemon, listen-once]"
-#: ../svnserve/svnserve.c:180
+#: ../svnserve/svnserve.c:235
#, fuzzy
msgid ""
"listen port. The default port is 3690.\n"
@@ -14187,7 +15848,7 @@ msgstr ""
"写进程 PID 到文件 ARG\n"
" [æ–¹å¼: daemon, listen-once]"
-#: ../svnserve/svnserve.c:186
+#: ../svnserve/svnserve.c:241
#, fuzzy
msgid ""
"listen hostname or IP address\n"
@@ -14197,7 +15858,7 @@ msgstr ""
"监å¬ä¸»æœºå称或IP地å€\n"
" [æ–¹å¼: daemon, service, listen-once]"
-#: ../svnserve/svnserve.c:192
+#: ../svnserve/svnserve.c:247
#, fuzzy
msgid ""
"listen hostname or IP address\n"
@@ -14207,22 +15868,18 @@ msgstr ""
"监å¬ä¸»æœºå称或IP地å€\n"
" [æ–¹å¼: daemon, listen-once]"
-#: ../svnserve/svnserve.c:199
+#: ../svnserve/svnserve.c:254
msgid ""
"prefer IPv6 when resolving the listen hostname\n"
-" [IPv4 is preferred by default. Using IPv4 and "
-"IPv6\n"
-" at the same time is not supported in daemon "
-"mode.\n"
+" [IPv4 is preferred by default. Using IPv4 and IPv6\n"
+" at the same time is not supported in daemon mode.\n"
" Use inetd mode or tunnel mode if you need this.]"
msgstr ""
"在使用主机å称监å¬æ—¶ï¼Œé¦–选 IPv6\n"
-" [默认首选 IPv4。ä¸æ”¯æŒåœ¨å®ˆæŠ¤è¿›ç¨‹æ¨¡å¼ä¸­åŒæ—¶ä½¿ç”¨ "
-"IPv4\n"
-" å’Œ IPv6。如果需è¦ï¼Œè¯·ä½¿ç”¨ inetd 模å¼æˆ–隧é“模"
-"å¼ã€‚]"
+" [默认首选 IPv4。ä¸æ”¯æŒåœ¨å®ˆæŠ¤è¿›ç¨‹æ¨¡å¼ä¸­åŒæ—¶ä½¿ç”¨ IPv4\n"
+" å’Œ IPv6。如果需è¦ï¼Œè¯·ä½¿ç”¨ inetd 模å¼æˆ–隧é“模å¼ã€‚]"
-#: ../svnserve/svnserve.c:207
+#: ../svnserve/svnserve.c:262
msgid ""
"compression level to use for network transmissions\n"
" [0 .. no compression, 5 .. default, \n"
@@ -14232,59 +15889,58 @@ msgstr ""
" [0 .. ä¸åŽ‹ç¼©, 5 .. 默认, \n"
" 9 .. 最大压缩]"
-#: ../svnserve/svnserve.c:213
+#: ../svnserve/svnserve.c:268
+#, fuzzy
msgid ""
"size of the extra in-memory cache in MB used to\n"
" minimize redundant operations.\n"
-" Default is 128 for threaded and 16 for non-\n"
-" threaded mode.\n"
-" [used for FSFS repositories only]"
+" Default is 16.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
-"用æ¥å‡å°‘冗余æ“作的内存中的é¢å¤–高速缓存的大å°(MB)\n"
-" 线程模型的默认值是 128,éžçº¿ç¨‹æ¨¡åž‹çš„默认值是 "
-"16。\n"
+"用æ¥å‡å°‘冗余æ“作的内存中的é¢å¤–缓存的大å°(MB)\n"
+" 默认值: 16。\n"
" [仅用于 FSFS 仓库]"
-#: ../svnserve/svnserve.c:223
+#: ../svnserve/svnserve.c:276
+#, fuzzy
msgid ""
"enable or disable caching of deltas between older\n"
" revisions.\n"
-" Default is no.\n"
-" [used for FSFS repositories only]"
+" Default is yes.\n"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
" 默认值: å¦ã€‚\n"
" [仅用于 FSFS 仓库]"
-#: ../svnserve/svnserve.c:231
+#: ../svnserve/svnserve.c:284
+#, fuzzy
msgid ""
"enable or disable caching of file contents\n"
" Default is yes.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"是å¦å¯¹æ–‡ä»¶å†…容å¯ç”¨ç¼“å­˜\n"
" 默认值: 是。\n"
" [仅用于 FSFS 仓库]"
-#: ../svnserve/svnserve.c:237
+#: ../svnserve/svnserve.c:290
#, fuzzy
msgid ""
"enable or disable caching of revision properties.\n"
-" Consult the documentation before activating "
-"this.\n"
+" Consult the documentation before activating this.\n"
" Default is no.\n"
-" [used for FSFS repositories only]"
+" [used for FSFS and FSX repositories only]"
msgstr ""
"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
" 默认值: å¦ã€‚\n"
" [仅用于 FSFS 仓库]"
-#: ../svnserve/svnserve.c:245
+#: ../svnserve/svnserve.c:298
#, fuzzy
msgid ""
"Optimize network handling based on the assumption\n"
-" that most clients are connected with a bitrate "
-"of\n"
+" that most clients are connected with a bitrate of\n"
" ARG Mbit/s.\n"
" Default is 0 (optimizations disabled)."
msgstr ""
@@ -14292,13 +15948,61 @@ msgstr ""
" 默认值: å¦ã€‚\n"
" [仅用于 FSFS 仓库]"
+#: ../svnserve/svnserve.c:306
+#, fuzzy
+msgid ""
+"Parse and cache all data found in block instead\n"
+" of just the requested item.\n"
+" Default is no.\n"
+" [used for FSFS repositories in 1.9 format only]"
+msgstr ""
+"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
+" 默认值: å¦ã€‚\n"
+" [仅用于 FSFS 仓库]"
+
#. ### Making the assumption here that WIN32 never has fork and so
#. * ### this option never exists when --service exists.
-#: ../svnserve/svnserve.c:255
+#: ../svnserve/svnserve.c:316
msgid "use threads instead of fork [mode: daemon]"
msgstr "使用线程代替进程 [æ–¹å¼: daemon]"
-#: ../svnserve/svnserve.c:259
+#: ../svnserve/svnserve.c:319
+#, fuzzy
+msgid ""
+"Minimum number of server threads, even if idle.\n"
+" Caped to max-threads; minimum value is 0.\n"
+" Default is 1.\n"
+" [used only with --threads]"
+msgstr ""
+"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
+" 默认值: å¦ã€‚\n"
+" [仅用于 FSFS 仓库]"
+
+#: ../svnserve/svnserve.c:328
+#, fuzzy
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 64.\n"
+" [used only with --threads]"
+msgstr ""
+"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
+" 默认值: å¦ã€‚\n"
+" [仅用于 FSFS 仓库]"
+
+#: ../svnserve/svnserve.c:337
+#, fuzzy
+msgid ""
+"Maximum number of server threads, even if there\n"
+" are more connections. Minimum value is 1.\n"
+" Default is 256.\n"
+" [used only with --threads]"
+msgstr ""
+"是å¦å¯¹æ—§ç‰ˆæœ¬ä¹‹é—´çš„差异å¯ç”¨ç¼“å­˜\n"
+" 默认值: å¦ã€‚\n"
+" [仅用于 FSFS 仓库]"
+
+#: ../svnserve/svnserve.c:347
msgid ""
"run in foreground (useful for debugging)\n"
" [mode: daemon]"
@@ -14306,17 +16010,17 @@ msgstr ""
"在å‰å°è¿è¡Œ(调试用)\n"
" [æ–¹å¼: daemon]"
-#: ../svnserve/svnserve.c:263
+#: ../svnserve/svnserve.c:351
msgid ""
-"handle one connection at a time in the parent process\n"
-" (useful for debugging)"
+"handle one connection at a time in the parent\n"
+" process (useful for debugging)"
msgstr ""
-#: ../svnserve/svnserve.c:267
+#: ../svnserve/svnserve.c:355
msgid "svnserve log file"
msgstr "svnserve 日志文件"
-#: ../svnserve/svnserve.c:270
+#: ../svnserve/svnserve.c:358
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once, service]"
@@ -14324,7 +16028,7 @@ msgstr ""
"写进程 PID 到文件 ARG\n"
" [æ–¹å¼: daemon, listen-once, service]"
-#: ../svnserve/svnserve.c:274
+#: ../svnserve/svnserve.c:362
msgid ""
"write server process ID to file ARG\n"
" [mode: daemon, listen-once]"
@@ -14332,7 +16036,7 @@ msgstr ""
"写进程 PID 到文件 ARG\n"
" [æ–¹å¼: daemon, listen-once]"
-#: ../svnserve/svnserve.c:279
+#: ../svnserve/svnserve.c:367
msgid ""
"tunnel username (default is current uid's name)\n"
" [mode: tunnel]"
@@ -14340,20 +16044,23 @@ msgstr ""
"隧é“用户å(默认是当å‰UID对应的用户å)\n"
" [æ–¹å¼: tunnel]"
-#: ../svnserve/svnserve.c:284
+#: ../svnserve/svnserve.c:372
msgid ""
"virtual host mode (look for repo in directory\n"
" of provided hostname)"
msgstr ""
-#: ../svnserve/svnserve.c:301
+#: ../svnserve/svnserve.c:388
#, c-format
msgid "Type '%s --help' for usage.\n"
msgstr "使用“%s --helpâ€å¾—到用法。\n"
-#: ../svnserve/svnserve.c:311
+#: ../svnserve/svnserve.c:397
+#, fuzzy
msgid ""
"usage: svnserve [-d | -i | -t | -X | --service] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
@@ -14361,17 +16068,16 @@ msgstr ""
"\n"
"有效选项: \n"
-#: ../svnserve/svnserve.c:317
+#: ../svnserve/svnserve.c:406
msgid ""
"usage: svnserve [-d | -i | -t | -X] [options]\n"
+"Subversion repository server.\n"
+"Type 'svnserve --version' to see the program version.\n"
"\n"
"Valid options:\n"
msgstr ""
-"用法: svnserve [-d | -i | -t | -X] [options]\n"
-"\n"
-"有效选项: \n"
-#: ../svnserve/svnserve.c:345
+#: ../svnserve/svnserve.c:436
msgid ""
"\n"
"Cyrus SASL authentication is available.\n"
@@ -14379,79 +16085,77 @@ msgstr ""
"\n"
"Cyrus SASL 认è¯å¯ç”¨ã€‚\n"
-#: ../svnserve/svnserve.c:616
+#: ../svnserve/svnserve.c:522
+#, c-format
+msgid "Can't accept client connection"
+msgstr "无法接å—客户连接"
+
+#: ../svnserve/svnserve.c:794
#, c-format
msgid "Invalid port '%s'"
msgstr "无效端å£â€œ%sâ€"
-#: ../svnserve/svnserve.c:657
-#, c-format
-msgid "svnserve: Root path '%s' does not exist or is not a directory.\n"
+#: ../svnserve/svnserve.c:830
+#, fuzzy, c-format
+msgid "Root path '%s' does not exist or is not a directory"
msgstr "svnserve: 根路径“%sâ€ä¸å­˜åœ¨ï¼Œæˆ–者ä¸æ˜¯ç›®å½•ã€‚\n"
-#: ../svnserve/svnserve.c:770
+#: ../svnserve/svnserve.c:953
msgid "You must specify exactly one of -d, -i, -t, --service or -X.\n"
msgstr "您必须指定 -d, -i, -t, --service 或 -X 中的一个。\n"
-#: ../svnserve/svnserve.c:773
+#: ../svnserve/svnserve.c:956
msgid "You must specify exactly one of -d, -i, -t or -X.\n"
msgstr "您必须指定 -d, -i, -t 或 -X 中的一个。\n"
-#: ../svnserve/svnserve.c:782
+#: ../svnserve/svnserve.c:967
msgid "You may only specify one of -T or --single-thread\n"
msgstr ""
-#: ../svnserve/svnserve.c:810
-#, c-format
-msgid "Option --tunnel-user is only valid in tunnel mode.\n"
+#: ../svnserve/svnserve.c:1017
+#, fuzzy
+msgid "Option --tunnel-user is only valid in tunnel mode"
msgstr "选项 --tunnel-user åªåœ¨éš§é“模å¼æœ‰æ•ˆã€‚\n"
-#: ../svnserve/svnserve.c:829
+#: ../svnserve/svnserve.c:1086
#, c-format
-msgid "Can't open stdout"
-msgstr "无法打开标准输出"
-
-#: ../svnserve/svnserve.c:883
-#, c-format
-msgid ""
-"svnserve: The --service flag is only valid if the process is started by the "
-"Service Control Manager.\n"
+msgid "svnserve: The --service flag is only valid if the process is started by the Service Control Manager.\n"
msgstr "svnserve: åªæœ‰è¢«æœåŠ¡æŽ§åˆ¶ç®¡ç†å™¨å¯åŠ¨æ—¶ --service 选项æ‰æœ‰æ•ˆã€‚\n"
-#: ../svnserve/svnserve.c:933
+#: ../svnserve/svnserve.c:1137
#, c-format
msgid "Can't get address info"
msgstr "ä¸èƒ½èŽ·å–地å€ä¿¡æ¯"
-#: ../svnserve/svnserve.c:947
+#: ../svnserve/svnserve.c:1150
#, c-format
msgid "Can't create server socket"
msgstr "无法创建æœåŠ¡å™¨å¥—接字"
-#: ../svnserve/svnserve.c:958
+#: ../svnserve/svnserve.c:1158
#, c-format
-msgid "Can't bind server socket"
-msgstr "ä¸èƒ½ç»‘定æœåŠ¡å™¨å¥—接字"
+msgid "Can't set options on server socket"
+msgstr "ä¸èƒ½å¯¹æœåŠ¡å™¨å¥—接字设置选项"
-#: ../svnserve/svnserve.c:1056
+#: ../svnserve/svnserve.c:1164
#, c-format
-msgid "Can't accept client connection"
-msgstr "无法接å—客户连接"
+msgid "Can't bind server socket"
+msgstr "ä¸èƒ½ç»‘定æœåŠ¡å™¨å¥—接字"
-#: ../svnserve/svnserve.c:1137
+#: ../svnserve/svnserve.c:1170
#, c-format
-msgid "Can't create threadattr"
-msgstr "无法创建线程属性"
+msgid "Can't listen on server socket"
+msgstr "ä¸èƒ½ç›‘å¬æœåŠ¡å™¨å¥—接字"
-#: ../svnserve/svnserve.c:1145
+#: ../svnserve/svnserve.c:1251
#, c-format
-msgid "Can't set detached state"
-msgstr "ä¸èƒ½è®¾ç½®åˆ†ç¦»çš„状æ€"
+msgid "Can't create thread pool"
+msgstr "无法创建线程池"
-#: ../svnserve/svnserve.c:1158
+#: ../svnserve/svnserve.c:1314
#, c-format
-msgid "Can't create thread"
-msgstr "无法创建线程"
+msgid "Can't push task"
+msgstr "ä¸èƒ½åˆ›å»ºçº¿ç¨‹æ± ä»»åŠ¡"
#: ../svnserve/winservice.c:346
#, c-format
@@ -14470,12 +16174,10 @@ msgstr "连接æœåŠ¡ç®¡ç†å™¨å¤±è´¥"
#: ../svnserve/winservice.c:416
#, c-format
-msgid ""
-"The service failed to start; an internal error occurred while starting the "
-"service"
+msgid "The service failed to start; an internal error occurred while starting the service"
msgstr "å‘生内部错误,å¯åŠ¨æœåŠ¡å¤±è´¥"
-#: ../svnsync/svnsync.c:91
+#: ../svnsync/svnsync.c:101
msgid ""
"usage: svnsync initialize DEST_URL SOURCE_URL\n"
"\n"
@@ -14514,7 +16216,7 @@ msgstr ""
"除了 svnsync 外,你ä¸åº”该在目标版本库中æ交,或者修改版本属性。也就是说,\n"
"目标版本库应该是æºç‰ˆæœ¬åº“çš„åªè¯»é•œåƒã€‚\n"
-#: ../svnsync/svnsync.c:117
+#: ../svnsync/svnsync.c:127
msgid ""
"usage: svnsync synchronize DEST_URL [SOURCE_URL]\n"
"\n"
@@ -14535,7 +16237,7 @@ msgstr ""
"æº URL。如果有ä¸ä¿¡ä»»çš„用户/管ç†å‘˜å¯ä»¥å†™å…¥ä½äºŽ DEST_URL 的版本库,那么特别\n"
"推è指定 SOURCE_URL。\n"
-#: ../svnsync/svnsync.c:130
+#: ../svnsync/svnsync.c:140
msgid ""
"usage:\n"
"\n"
@@ -14571,7 +16273,7 @@ msgstr ""
"\n"
"æ ¼å¼ 2 是已ç»åºŸå¼ƒçš„语法,等价于指定 \"-rREV[:REV2]\" 。\n"
-#: ../svnsync/svnsync.c:151
+#: ../svnsync/svnsync.c:161
msgid ""
"usage: svnsync info DEST_URL\n"
"\n"
@@ -14582,7 +16284,7 @@ msgstr ""
"\n"
"打å°ä½äºŽ DEST_URL çš„åŒæ­¥ç›®æ ‡ç‰ˆæœ¬åº“ä¿¡æ¯ã€‚\n"
-#: ../svnsync/svnsync.c:157
+#: ../svnsync/svnsync.c:167
msgid ""
"usage: svnsync help [SUBCOMMAND...]\n"
"\n"
@@ -14592,11 +16294,11 @@ msgstr ""
"\n"
"显示本程åºæˆ–å…¶å­å‘½ä»¤çš„用法。\n"
-#: ../svnsync/svnsync.c:167
+#: ../svnsync/svnsync.c:177
msgid "print as little as possible"
msgstr "å°½å¯èƒ½å°‘打å°"
-#: ../svnsync/svnsync.c:169
+#: ../svnsync/svnsync.c:179
msgid ""
"operate on revision ARG (or range ARG1:ARG2)\n"
" A revision argument can be one of:\n"
@@ -14608,11 +16310,11 @@ msgstr ""
" æ•´æ•° 版本å·\n"
" 'HEAD' 最新版本"
-#: ../svnsync/svnsync.c:177
+#: ../svnsync/svnsync.c:187
msgid "allow a non-empty destination repository"
msgstr "å…许éžç©ºç›®æ ‡ç‰ˆæœ¬åº“"
-#: ../svnsync/svnsync.c:189
+#: ../svnsync/svnsync.c:199
msgid ""
"specify a username ARG (deprecated;\n"
" see --source-username and --sync-username)"
@@ -14620,7 +16322,7 @@ msgstr ""
"指定用户å称 ARG (å·²ç»è¿‡æ—¶;\n"
" å‚看 --source-username å’Œ --sync-username)"
-#: ../svnsync/svnsync.c:193
+#: ../svnsync/svnsync.c:203
msgid ""
"specify a password ARG (deprecated;\n"
" see --source-password and --sync-password)"
@@ -14628,193 +16330,182 @@ msgstr ""
"æŒ‡å®šå¯†ç  ARG (å·²ç»è¿‡æ—¶;\n"
" å‚看 --source-password å’Œ --sync-password)"
-#: ../svnsync/svnsync.c:203
+#: ../svnsync/svnsync.c:231
msgid "connect to source repository with username ARG"
msgstr "使用用户å称 ARG 连接æºç‰ˆæœ¬åº“"
-#: ../svnsync/svnsync.c:205
+#: ../svnsync/svnsync.c:233
msgid "connect to source repository with password ARG"
msgstr "ä½¿ç”¨å¯†ç  ARG 连接æºç‰ˆæœ¬åº“"
-#: ../svnsync/svnsync.c:207
+#: ../svnsync/svnsync.c:235
msgid "connect to sync repository with username ARG"
msgstr "使用用户å称 ARG 连接目的版本库"
-#: ../svnsync/svnsync.c:209
+#: ../svnsync/svnsync.c:237
msgid "connect to sync repository with password ARG"
msgstr "ä½¿ç”¨å¯†ç  ARG 连接目的版本库"
-#: ../svnsync/svnsync.c:221
+#: ../svnsync/svnsync.c:249
msgid ""
"convert translatable properties from encoding ARG\n"
-" to UTF-8. If not specified, then properties "
-"are\n"
+" to UTF-8. If not specified, then properties are\n"
" presumed to be encoded in UTF-8."
msgstr ""
"å°†å¯ç¿»è¯‘çš„å±žæ€§ä»Žç¼–ç  ARG 转æ¢åˆ° UTF-8。如果ä¸æŒ‡å®šï¼Œé‚£ä¹ˆå‡å®šå±žæ€§çš„ç¼–ç æ˜¯\n"
" UTF-8。"
-#: ../svnsync/svnsync.c:227
+#: ../svnsync/svnsync.c:255
msgid ""
"Disable built-in locking. Use of this option can\n"
-" corrupt the mirror unless you ensure that no "
-"other\n"
+" corrupt the mirror unless you ensure that no other\n"
" instance of svnsync is running concurrently."
msgstr ""
"ç¦ç”¨å†…ç½®é”。使用此选项å¯èƒ½\n"
" 会æŸåé•œåƒï¼Œé™¤éžä½ èƒ½ç¡®è®¤æ²¡æœ‰å…¶å®ƒ svnsync\n"
" 实例åŒæ—¶è¿è¡Œã€‚"
-#: ../svnsync/svnsync.c:233
+#: ../svnsync/svnsync.c:261
msgid ""
"Steal locks as necessary. Use, with caution,\n"
" if your mirror repository contains stale locks\n"
-" and is not being concurrently accessed by "
-"another\n"
+" and is not being concurrently accessed by another\n"
" svnsync instance."
msgstr ""
"在需è¦æ—¶çªƒå–é”。请å°å¿ƒä½¿ç”¨\n"
" 如果你的镜åƒåŒ…å«è¿‡æ—¶çš„é”,并且没有其它 svnsync\n"
" 实例åŒæ—¶è¿è¡Œã€‚"
-#: ../svnsync/svnsync.c:356
+#: ../svnsync/svnsync.c:269
+#, fuzzy
msgid ""
-"Target server does not support atomic revision property edits; consider "
-"upgrading it to 1.7 or using an external locking program"
+"size of the extra in-memory cache in MB used to\n"
+" minimize operations for local 'file' scheme.\n"
msgstr ""
-"目标æœåŠ¡å™¨ä¸æ”¯æŒåŽŸå­ç‰ˆæœ¬çš„属性编辑; 请考虑å‡çº§åˆ° 1.7 或者使用外部加é”程åº"
+"用æ¥å‡å°‘冗余æ“作的内存中的é¢å¤–缓存的大å°(MB)\n"
+" 默认值: 16。\n"
+" [仅用于 FSFS 仓库]"
+
+#: ../svnsync/svnsync.c:392
+msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program"
+msgstr "目标æœåŠ¡å™¨ä¸æ”¯æŒåŽŸå­ç‰ˆæœ¬çš„属性编辑; 请考虑å‡çº§åˆ° 1.7 或者使用外部加é”程åº"
-#: ../svnsync/svnsync.c:370
+#: ../svnsync/svnsync.c:406
#, c-format
msgid "Stole lock previously held by '%s'\n"
msgstr "窃å–被 '%s' æŒæœ‰çš„é”\n"
-#: ../svnsync/svnsync.c:459
+#: ../svnsync/svnsync.c:495
#, c-format
msgid "Session is rooted at '%s' but the repos root is '%s'"
msgstr "会è¯æ ¹æ˜¯â€œ%sâ€ï¼Œä½†æ˜¯ç‰ˆæœ¬åº“根是“%sâ€"
-#: ../svnsync/svnsync.c:601
+#: ../svnsync/svnsync.c:637
#, c-format
msgid "Copied properties for revision %ld (%s* properties skipped).\n"
msgstr "从版本 %ld (忽略 %s* 属性)å¤åˆ¶å±žæ€§ã€‚\n"
-#: ../svnsync/svnsync.c:606
+#: ../svnsync/svnsync.c:642
#, c-format
msgid "Copied properties for revision %ld.\n"
msgstr "å¤åˆ¶ç‰ˆæœ¬ %ld 的属性。\n"
-#: ../svnsync/svnsync.c:622
+#: ../svnsync/svnsync.c:658
#, c-format
-msgid ""
-"NOTE: Normalized %s* properties to LF line endings (%d rev-props, %d node-"
-"props).\n"
+msgid "NOTE: Normalized %s* properties to LF line endings (%d rev-props, %d node-props).\n"
msgstr "注æ„: å·²ç»æ ‡å‡†åŒ– %s* 属性为 LF 行尾 (%d rev-props, %d node-props)。\n"
-#: ../svnsync/svnsync.c:752
-msgid ""
-"Destination repository already contains revision history; consider using --"
-"allow-non-empty if the repository's revisions are known to mirror their "
-"respective revisions in the source repository"
+#: ../svnsync/svnsync.c:788
+msgid "Destination repository already contains revision history; consider using --allow-non-empty if the repository's revisions are known to mirror their respective revisions in the source repository"
msgstr ""
"目标版本库已ç»åŒ…å«ç‰ˆæœ¬åŽ†å²ï¼›å¦‚果你确信它们是镜åƒæºç‰ˆæœ¬åº“的对应版本的è¯ï¼Œ\n"
"考虑使用选项 '--allow-non-empty'"
-#: ../svnsync/svnsync.c:761
+#: ../svnsync/svnsync.c:797
#, c-format
msgid "Destination repository is already synchronizing from '%s'"
msgstr "目标版本库已ç»ä¸Žâ€œ%sâ€åŒæ­¥"
-#: ../svnsync/svnsync.c:796
+#: ../svnsync/svnsync.c:832
msgid "Destination repository has more revisions than source repository"
msgstr "目标版本库的版本数é‡æ¯”æºç‰ˆæœ¬åº“多"
-#: ../svnsync/svnsync.c:861 ../svnsync/svnsync.c:864 ../svnsync/svnsync.c:1517
-#: ../svnsync/svnsync.c:1524 ../svnsync/svnsync.c:1761
-#: ../svnsync/svnsync.c:1764 ../svnsync/svnsync.c:1808
+#: ../svnsync/svnsync.c:897 ../svnsync/svnsync.c:900 ../svnsync/svnsync.c:1570
+#: ../svnsync/svnsync.c:1577 ../svnsync/svnsync.c:1814
+#: ../svnsync/svnsync.c:1817 ../svnsync/svnsync.c:1861
#, c-format
msgid "Path '%s' is not a URL"
msgstr "路径“%sâ€ä¸æ˜¯URL"
-#: ../svnsync/svnsync.c:891
+#: ../svnsync/svnsync.c:927
#, c-format
msgid "Committed revision %ld.\n"
msgstr "å·²æ交版本 %ld。\n"
-#: ../svnsync/svnsync.c:934
+#: ../svnsync/svnsync.c:970
msgid "Destination repository has not been initialized"
msgstr "目标版本库没有åˆå§‹åŒ–"
-#: ../svnsync/svnsync.c:1300
-#, c-format
-msgid "Commit created rev %ld but should have created %ld"
+#: ../svnsync/svnsync.c:1345
+#, fuzzy, c-format
+msgid "Commit created r%ld but should have created r%ld"
msgstr "æ交创建版本 %ld,应该创建版本 %ld"
-#: ../svnsync/svnsync.c:1415
+#: ../svnsync/svnsync.c:1463
#, c-format
-msgid ""
-"Revision being currently copied (%ld), last merged revision (%ld), and "
-"destination HEAD (%ld) are inconsistent; have you committed to the "
-"destination without using svnsync?"
-msgstr ""
-"当å‰å¤åˆ¶ç‰ˆæœ¬(%ld), 最åŽåˆå¹¶ç‰ˆæœ¬(%ld), 和目标 HEAD (%ld) ä¸ä¸€è‡´ï¼›ä½ æ˜¯å¦ä½¿ç”¨éž"
-"svnsync方法æ交到目标版本库?"
+msgid "Revision being currently copied (%ld), last merged revision (%ld), and destination HEAD (%ld) are inconsistent; have you committed to the destination without using svnsync?"
+msgstr "当å‰å¤åˆ¶ç‰ˆæœ¬(%ld), 最åŽåˆå¹¶ç‰ˆæœ¬(%ld), 和目标 HEAD (%ld) ä¸ä¸€è‡´ï¼›ä½ æ˜¯å¦ä½¿ç”¨éžsvnsync方法æ交到目标版本库?"
-#: ../svnsync/svnsync.c:1452
+#: ../svnsync/svnsync.c:1500
#, c-format
-msgid ""
-"Destination HEAD (%ld) is not the last merged revision (%ld); have you "
-"committed to the destination without using svnsync?"
-msgstr ""
-"目标 HEAD (%ld)ä¸æ˜¯æœ€åŽåˆå¹¶ç‰ˆæœ¬(%ld);你是å¦ä½¿ç”¨éž svnsync 方法æ交到目标版本"
-"库?"
+msgid "Destination HEAD (%ld) is not the last merged revision (%ld); have you committed to the destination without using svnsync?"
+msgstr "目标 HEAD (%ld)ä¸æ˜¯æœ€åŽåˆå¹¶ç‰ˆæœ¬(%ld);你是å¦ä½¿ç”¨éž svnsync 方法æ交到目标版本库?"
-#: ../svnsync/svnsync.c:1575 ../svnsync/svnsync.c:1580
+#: ../svnsync/svnsync.c:1628 ../svnsync/svnsync.c:1633
#, c-format
-msgid ""
-"Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
+msgid "Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
msgstr "ä¸èƒ½åœ¨å°šæœªåŒæ­¥æ—¶å¤åˆ¶ç‰ˆæœ¬(%ld)çš„ revprops"
-#: ../svnsync/svnsync.c:1644 ../svnsync/svnsync.c:1664
+#: ../svnsync/svnsync.c:1697 ../svnsync/svnsync.c:1717
#, c-format
msgid "Invalid revision number (%ld)"
msgstr "æ— æ•ˆçš„ç‰ˆæœ¬å· (%ld)"
-#: ../svnsync/svnsync.c:1714
-msgid ""
-"Cannot specify revisions via both command-line arguments and the --revision "
-"(-r) option"
+#: ../svnsync/svnsync.c:1767
+msgid "Cannot specify revisions via both command-line arguments and the --revision (-r) option"
msgstr "ä¸èƒ½åŒæ—¶ä½¿ç”¨ "
-#: ../svnsync/svnsync.c:1722 ../svnsync/svnsync.c:2065
+#: ../svnsync/svnsync.c:1775 ../svnsync/svnsync.c:2120
#, c-format
msgid "Invalid revision range '%s' provided"
msgstr "æ供了无效的版本范围 '%s'"
-#: ../svnsync/svnsync.c:1821
+#: ../svnsync/svnsync.c:1874
#, c-format
msgid "Repository '%s' is not initialized for synchronization"
msgstr "版本库“%sâ€æ²¡æœ‰ä¸ºåŒæ­¥åˆå§‹åŒ–"
#. Print the info.
-#: ../svnsync/svnsync.c:1827
+#: ../svnsync/svnsync.c:1880
#, c-format
msgid "Source URL: %s\n"
msgstr "æº URL: %s\n"
-#: ../svnsync/svnsync.c:1829
+#: ../svnsync/svnsync.c:1882
#, c-format
msgid "Source Repository UUID: %s\n"
msgstr "æºç‰ˆæœ¬åº“ UUID: %s\n"
-#: ../svnsync/svnsync.c:1832
+#: ../svnsync/svnsync.c:1885
#, c-format
msgid "Last Merged Revision: %s\n"
msgstr "最åŽåˆå¹¶çš„版本: %s\n"
-#: ../svnsync/svnsync.c:1849
+#: ../svnsync/svnsync.c:1902
+#, fuzzy
msgid ""
"general usage: svnsync SUBCOMMAND DEST_URL [ARGS & OPTIONS ...]\n"
+"Subversion repository replication tool.\n"
"Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnsync --version' to see the program version and RA modules.\n"
"\n"
@@ -14826,19 +16517,15 @@ msgstr ""
"\n"
"å¯ç”¨çš„å­å‘½ä»¤: \n"
-#: ../svnsync/svnsync.c:2113
-msgid ""
-"Cannot use --username or --password with any of --source-username, --source-"
-"password, --sync-username, or --sync-password.\n"
-msgstr ""
-"ä¸èƒ½å°† --username 或 --password 与 --source-username, --source-password, --"
-"sync-username, 或 --sync-password 一起使用。\n"
+#: ../svnsync/svnsync.c:2181
+msgid "Cannot use --username or --password with any of --source-username, --source-password, --sync-username, or --sync-password.\n"
+msgstr "ä¸èƒ½å°† --username 或 --password 与 --source-username, --source-password, --sync-username, 或 --sync-password 一起使用。\n"
-#: ../svnsync/svnsync.c:2137
+#: ../svnsync/svnsync.c:2204
msgid "--disable-locking and --steal-lock are mutually exclusive"
msgstr "--disable-locking 与 --steal-lock 是互斥的"
-#: ../svnsync/svnsync.c:2213
+#: ../svnsync/svnsync.c:2293
#, c-format
msgid ""
"Subcommand '%s' doesn't accept option '%s'\n"
@@ -14847,7 +16534,7 @@ msgstr ""
"å­å‘½ä»¤â€œ%sâ€ä¸æŽ¥å—选项“%sâ€\n"
"使用“svnsync help %sâ€å¾—到用法。\n"
-#: ../svnsync/svnsync.c:2296
+#: ../svnsync/svnsync.c:2383
msgid "Try 'svnsync help' for more info"
msgstr "请使用 “svnsync help†以得到更多信æ¯"
@@ -14856,10 +16543,12 @@ msgstr "请使用 “svnsync help†以得到更多信æ¯"
msgid "Type 'svnversion --help' for usage.\n"
msgstr "使用 “svnversion --help†得到用法。\n"
-#: ../svnversion/svnversion.c:60
+#: ../svnversion/svnversion.c:59
#, fuzzy, c-format
msgid ""
"usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n"
+"Subversion working copy identification tool.\n"
+"Type 'svnversion --version' to see the program version.\n"
"\n"
" Produce a compact version identifier for the working copy path\n"
" WC_PATH. TRAIL_URL is the trailing portion of the URL used to\n"
@@ -14918,41 +16607,115 @@ msgstr ""
"\n"
"有效选项: \n"
-#: ../svnversion/svnversion.c:136
-msgid "do not output the trailing newline"
-msgstr "ä¸è¾“出其åŽçš„æ¢è¡Œç¬¦"
-
-#: ../svnversion/svnversion.c:137
+#: ../svnversion/svnversion.c:141
msgid "last changed rather than current revisions"
msgstr "最近一次改å˜çš„,而ä¸æ˜¯ç›®å‰çš„版本"
-#: ../svnversion/svnversion.c:245
+#: ../svnversion/svnversion.c:241
#, c-format
msgid "Unversioned symlink%s"
msgstr "未版本控制的符å·é“¾æŽ¥ %s"
-#: ../svnversion/svnversion.c:248
+#: ../svnversion/svnversion.c:244
#, c-format
msgid "Unversioned directory%s"
msgstr "目录 %s 未版本控制"
-#: ../svnversion/svnversion.c:251
+#: ../svnversion/svnversion.c:247
#, c-format
msgid "Unversioned file%s"
msgstr "文件 %s 未版本控制"
-#: ../svnversion/svnversion.c:257
+#: ../svnversion/svnversion.c:253
#, c-format
msgid "'%s' doesn't exist\n"
msgstr "“%s†ä¸å­˜åœ¨\n"
-#: ../svnversion/svnversion.c:258
+#: ../svnversion/svnversion.c:254
#, c-format
msgid "'%s' is of unknown type\n"
msgstr "“%s†的类型未知\n"
#. Local uncommitted modifications, no revision info was found.
-#: ../svnversion/svnversion.c:273
+#: ../svnversion/svnversion.c:268
#, c-format
msgid "Uncommitted local addition, copy or move%s"
msgstr "未æ交的本地增加,å¤åˆ¶æˆ–移动 %s"
+
+#, fuzzy
+#~ msgid "do not output trailing newline"
+#~ msgstr "ä¸è¾“出其åŽçš„æ¢è¡Œç¬¦"
+
+#~ msgid "Representation key for checksum '%%s' exists in filesystem '%%s' with a different value (%%ld,%%%s,%%%s,%%%s) than what we were about to store (%%ld,%%%s,%%%s,%%%s)"
+#~ msgstr "校验和 “%%s†的展现键已ç»å­˜åœ¨äºŽæ–‡ä»¶ç³»ç»Ÿ “%%s†中,å–值(%%ld,%%%s,%%%s,%%%s)与我们è¦å­˜å‚¨çš„值(%%ld,%%%s,%%%s,%%%s)ä¸åŒ"
+
+#, fuzzy
+#~ msgid "Move-from node is out-of-date"
+#~ msgstr "æ¡ç›®è¿‡æ—¶"
+
+#, fuzzy
+#~ msgid "Path '%s' has been moved without being deleted"
+#~ msgstr "路径“%sâ€ä¸æ˜¯æ–‡ä»¶"
+
+#, fuzzy
+#~ msgid "Path '%s' has been moved to more than one target"
+#~ msgstr "路径“%sâ€ä¸æ˜¯æ–‡ä»¶"
+
+#~ msgid "Move without a suitable deletion"
+#~ msgstr "没有适当删除的移动"
+
+#~ msgid "Ambiguous move"
+#~ msgstr "ä¸æ˜Žç¡®çš„移动"
+
+#~ msgid ""
+#~ "Conflict discovered when trying to add '%s'.\n"
+#~ "An object of the same name already exists.\n"
+#~ msgstr ""
+#~ "增加 “%s†时出现冲çªã€‚\n"
+#~ "åŒå对象已存在。\n"
+
+#~ msgid "incoming file replace"
+#~ msgstr "进入的文件替æ¢"
+
+#~ msgid "Failed to mark '%s' absent: item of the same name is already scheduled for addition"
+#~ msgstr "无法将“%sâ€æ ‡è®°ä¸ºä¸å­˜åœ¨: åŒå项目已加入增加调度"
+
+#~ msgid "Out of slots for named atomic."
+#~ msgstr "命å原å­çš„槽ä½å·²æ»¡"
+
+#~ msgid "Namespace has not been initialized."
+#~ msgstr "命å空间没有åˆå§‹åŒ–"
+
+#~ msgid "Atomic's name is too long."
+#~ msgstr "原å­çš„å称太长"
+
+#, fuzzy
+#~ msgid "Number of atomics in namespace is too large."
+#~ msgstr "原å­çš„å称太长"
+
+#, fuzzy
+#~ msgid "MMAP failed for file '%s'"
+#~ msgstr "“%sâ€åŸŸçš„值无效"
+
+#~ msgid "Not a valid atomic"
+#~ msgstr "ä¸æ˜¯åˆæ³•çš„原å­æ•°æ®"
+
+#, fuzzy
+#~ msgid "No write access to file '%s'"
+#~ msgstr "无法写入文件“%sâ€"
+
+#, fuzzy
+#~ msgid "No read access to file '%s'"
+#~ msgstr "ä¸èƒ½è®¾ç½® “%s†的存å–时间"
+
+#, fuzzy
+#~ msgid "Incomplete read in file '%s'"
+#~ msgstr "ä¸èƒ½è¯»å–文件“%sâ€"
+
+#, fuzzy
+#~ msgid "Revision file (r%ld) has corrupt footer"
+#~ msgstr "版本文件 (r%ld) 缺少结尾æ¢è¡Œ"
+
+#, fuzzy
+#~ msgid "Recursive locks are not supported"
+#~ msgstr "ä¸æ”¯æŒéžé€’å½’çš„é‡æ–°å®šä½"
diff --git a/subversion/po/zh_TW.po b/subversion/po/zh_TW.po
index 9e7daf2..789bd47 100644
--- a/subversion/po/zh_TW.po
+++ b/subversion/po/zh_TW.po
@@ -22,7 +22,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: subversion 1.8\n"
+"Project-Id-Version: subversion 1.9\n"
"Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
"POT-Creation-Date: 2010-11-12 08:49-0600\n"
"PO-Revision-Date: 2004-09-12 22:05+0800\n"
@@ -10123,13 +10123,11 @@ msgid "local %s, incoming %s upon %s"
msgstr ""
#: ../svn/util.c:74
-#, fuzzy, c-format
+#, c-format
msgid ""
-"\n"
"Committed revision %ld%s.\n"
msgstr ""
-"\n"
-"é€äº¤ä¿®è¨‚版 %ld.\n"
+"é€äº¤ä¿®è¨‚版 %ld%s.\n"
#: ../svn/util.c:78
msgid " (the answer to life, the universe, and everything)"
diff --git a/subversion/svn/add-cmd.c b/subversion/svn/add-cmd.c
index 44f73c7..f0791fb 100644
--- a/subversion/svn/add-cmd.c
+++ b/subversion/svn/add-cmd.c
@@ -83,7 +83,7 @@ svn_cl__add(apr_getopt_t *os,
errors, opt_state->quiet,
SVN_ERR_ENTRY_EXISTS,
SVN_ERR_WC_PATH_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
}
svn_pool_destroy(iterpool);
diff --git a/subversion/svn/auth-cmd.c b/subversion/svn/auth-cmd.c
new file mode 100644
index 0000000..68ca067
--- /dev/null
+++ b/subversion/svn/auth-cmd.c
@@ -0,0 +1,483 @@
+/*
+ * auth-cmd.c: Subversion auth creds cache administration
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/*** Includes. ***/
+
+#include <apr_general.h>
+#include <apr_getopt.h>
+#include <apr_fnmatch.h>
+#include <apr_tables.h>
+
+#include "svn_private_config.h"
+
+#include "svn_private_config.h"
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_opt.h"
+#include "svn_dirent_uri.h"
+#include "svn_hash.h"
+#include "svn_utf.h"
+#include "svn_cmdline.h"
+#include "svn_config.h"
+#include "svn_auth.h"
+#include "svn_sorts.h"
+#include "svn_base64.h"
+#include "svn_x509.h"
+#include "svn_time.h"
+
+#include "private/svn_cmdline_private.h"
+#include "private/svn_token.h"
+#include "private/svn_sorts_private.h"
+
+#include "cl.h"
+
+/* The separator between credentials . */
+#define SEP_STRING \
+ "------------------------------------------------------------------------\n"
+
+static svn_error_t *
+show_cert_failures(const char *failure_string,
+ apr_pool_t *scratch_pool)
+{
+ unsigned int failures;
+
+ SVN_ERR(svn_cstring_atoui(&failures, failure_string));
+
+ if (0 == (failures & (SVN_AUTH_SSL_NOTYETVALID | SVN_AUTH_SSL_EXPIRED |
+ SVN_AUTH_SSL_CNMISMATCH | SVN_AUTH_SSL_UNKNOWNCA |
+ SVN_AUTH_SSL_OTHER)))
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _("Automatic certificate validity check failed "
+ "because:\n")));
+
+ if (failures & SVN_AUTH_SSL_NOTYETVALID)
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _(" The certificate is not yet valid.\n")));
+
+ if (failures & SVN_AUTH_SSL_EXPIRED)
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _(" The certificate has expired.\n")));
+
+ if (failures & SVN_AUTH_SSL_CNMISMATCH)
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _(" The certificate's Common Name (hostname) "
+ "does not match the remote hostname.\n")));
+
+ if (failures & SVN_AUTH_SSL_UNKNOWNCA)
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _(" The certificate issuer is unknown.\n")));
+
+ if (failures & SVN_AUTH_SSL_OTHER)
+ SVN_ERR(svn_cmdline_printf(
+ scratch_pool, _(" Unknown verification failure.\n")));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* decodes from format we store certs in for auth creds and
+ * turns parsing errors into warnings if PRINT_WARNING is TRUE
+ * and ignores them otherwise. returns NULL if it couldn't
+ * parse a cert for any reason. */
+static svn_x509_certinfo_t *
+parse_certificate(const svn_string_t *ascii_cert,
+ svn_boolean_t print_warning,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_x509_certinfo_t *certinfo;
+ const svn_string_t *der_cert;
+ svn_error_t *err;
+
+ /* Convert header-less PEM to DER by undoing base64 encoding. */
+ der_cert = svn_base64_decode_string(ascii_cert, scratch_pool);
+
+ err = svn_x509_parse_cert(&certinfo, der_cert->data, der_cert->len,
+ result_pool, scratch_pool);
+ if (err)
+ {
+ /* Just display X.509 parsing errors as warnings and continue */
+ if (print_warning)
+ svn_handle_warning2(stderr, err, "svn: ");
+ svn_error_clear(err);
+ return NULL;
+ }
+
+ return certinfo;
+}
+
+
+struct walk_credentials_baton_t
+{
+ int matches;
+ svn_boolean_t list;
+ svn_boolean_t delete;
+ svn_boolean_t show_passwords;
+ apr_array_header_t *patterns;
+};
+
+static svn_boolean_t
+match_pattern(const char *pattern, const char *value,
+ svn_boolean_t caseblind, apr_pool_t *scratch_pool)
+{
+ const char *p = apr_psprintf(scratch_pool, "*%s*", pattern);
+ int flags = (caseblind ? APR_FNM_CASE_BLIND : 0);
+
+ return (apr_fnmatch(p, value, flags) == APR_SUCCESS);
+}
+
+static svn_boolean_t
+match_certificate(svn_x509_certinfo_t **certinfo,
+ const char *pattern,
+ const svn_string_t *ascii_cert,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *value;
+ const svn_checksum_t *checksum;
+ const apr_array_header_t *hostnames;
+ int i;
+
+ *certinfo = parse_certificate(ascii_cert, FALSE, result_pool, scratch_pool);
+ if (*certinfo == NULL)
+ return FALSE;
+
+ value = svn_x509_certinfo_get_subject(*certinfo, scratch_pool);
+ if (match_pattern(pattern, value, FALSE, scratch_pool))
+ return TRUE;
+
+ value = svn_x509_certinfo_get_issuer(*certinfo, scratch_pool);
+ if (match_pattern(pattern, value, FALSE, scratch_pool))
+ return TRUE;
+
+ checksum = svn_x509_certinfo_get_digest(*certinfo);
+ value = svn_checksum_to_cstring_display(checksum, scratch_pool);
+ if (match_pattern(pattern, value, TRUE, scratch_pool))
+ return TRUE;
+
+ hostnames = svn_x509_certinfo_get_hostnames(*certinfo);
+ if (hostnames)
+ {
+ for (i = 0; i < hostnames->nelts; i++)
+ {
+ const char *hostname = APR_ARRAY_IDX(hostnames, i, const char *);
+ if (match_pattern(pattern, hostname, TRUE, scratch_pool))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+static svn_error_t *
+match_credential(svn_boolean_t *match,
+ svn_x509_certinfo_t **certinfo,
+ const char *cred_kind,
+ const char *realmstring,
+ apr_array_header_t *patterns,
+ apr_array_header_t *cred_items,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ *match = FALSE;
+
+ for (i = 0; i < patterns->nelts; i++)
+ {
+ const char *pattern = APR_ARRAY_IDX(patterns, i, const char *);
+ int j;
+
+ *match = match_pattern(pattern, cred_kind, FALSE, iterpool);
+ if (!*match)
+ *match = match_pattern(pattern, realmstring, FALSE, iterpool);
+ if (!*match)
+ {
+ svn_pool_clear(iterpool);
+ for (j = 0; j < cred_items->nelts; j++)
+ {
+ svn_sort__item_t item;
+ const char *key;
+ svn_string_t *value;
+
+ item = APR_ARRAY_IDX(cred_items, j, svn_sort__item_t);
+ key = item.key;
+ value = item.value;
+ if (strcmp(key, SVN_CONFIG_AUTHN_PASSWORD_KEY) == 0 ||
+ strcmp(key, SVN_CONFIG_AUTHN_PASSPHRASE_KEY) == 0)
+ continue; /* don't match secrets */
+ else if (strcmp(key, SVN_CONFIG_AUTHN_ASCII_CERT_KEY) == 0)
+ *match = match_certificate(certinfo, pattern, value,
+ result_pool, iterpool);
+ else
+ *match = match_pattern(pattern, value->data, FALSE, iterpool);
+
+ if (*match)
+ break;
+ }
+ }
+ if (!*match)
+ break;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+show_cert(svn_x509_certinfo_t *certinfo, const svn_string_t *pem_cert,
+ apr_pool_t *scratch_pool)
+{
+ const apr_array_header_t *hostnames;
+
+ if (certinfo == NULL)
+ certinfo = parse_certificate(pem_cert, TRUE, scratch_pool, scratch_pool);
+ if (certinfo == NULL)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Subject: %s\n"),
+ svn_x509_certinfo_get_subject(certinfo, scratch_pool)));
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Valid from: %s\n"),
+ svn_time_to_human_cstring(
+ svn_x509_certinfo_get_valid_from(certinfo),
+ scratch_pool)));
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Valid until: %s\n"),
+ svn_time_to_human_cstring(
+ svn_x509_certinfo_get_valid_to(certinfo),
+ scratch_pool)));
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Issuer: %s\n"),
+ svn_x509_certinfo_get_issuer(certinfo, scratch_pool)));
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Fingerprint: %s\n"),
+ svn_checksum_to_cstring_display(
+ svn_x509_certinfo_get_digest(certinfo),
+ scratch_pool)));
+
+ hostnames = svn_x509_certinfo_get_hostnames(certinfo);
+ if (hostnames && !apr_is_empty_array(hostnames))
+ {
+ int i;
+ svn_stringbuf_t *buf = svn_stringbuf_create_empty(scratch_pool);
+ for (i = 0; i < hostnames->nelts; ++i)
+ {
+ const char *hostname = APR_ARRAY_IDX(hostnames, i, const char*);
+ if (i > 0)
+ svn_stringbuf_appendbytes(buf, ", ", 2);
+ svn_stringbuf_appendbytes(buf, hostname, strlen(hostname));
+ }
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Hostnames: %s\n"),
+ buf->data));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+list_credential(const char *cred_kind,
+ const char *realmstring,
+ apr_array_header_t *cred_items,
+ svn_boolean_t show_passwords,
+ svn_x509_certinfo_t *certinfo,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_cmdline_printf(scratch_pool, SEP_STRING));
+ SVN_ERR(svn_cmdline_printf(scratch_pool,
+ _("Credential kind: %s\n"), cred_kind));
+ SVN_ERR(svn_cmdline_printf(scratch_pool,
+ _("Authentication realm: %s\n"), realmstring));
+
+ for (i = 0; i < cred_items->nelts; i++)
+ {
+ svn_sort__item_t item;
+ const char *key;
+ svn_string_t *value;
+
+ svn_pool_clear(iterpool);
+ item = APR_ARRAY_IDX(cred_items, i, svn_sort__item_t);
+ key = item.key;
+ value = item.value;
+ if (strcmp(value->data, realmstring) == 0)
+ continue; /* realm string was already shown above */
+ else if (strcmp(key, SVN_CONFIG_AUTHN_PASSWORD_KEY) == 0)
+ {
+ if (show_passwords)
+ SVN_ERR(svn_cmdline_printf(iterpool,
+ _("Password: %s\n"), value->data));
+ else
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Password: [not shown]\n")));
+ }
+ else if (strcmp(key, SVN_CONFIG_AUTHN_PASSPHRASE_KEY) == 0)
+ {
+ if (show_passwords)
+ SVN_ERR(svn_cmdline_printf(iterpool,
+ _("Passphrase: %s\n"), value->data));
+ else
+ SVN_ERR(svn_cmdline_printf(iterpool,
+ _("Passphrase: [not shown]\n")));
+ }
+ else if (strcmp(key, SVN_CONFIG_AUTHN_PASSTYPE_KEY) == 0)
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Password cache: %s\n"),
+ value->data));
+ else if (strcmp(key, SVN_CONFIG_AUTHN_USERNAME_KEY) == 0)
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Username: %s\n"), value->data));
+ else if (strcmp(key, SVN_CONFIG_AUTHN_ASCII_CERT_KEY) == 0)
+ SVN_ERR(show_cert(certinfo, value, iterpool));
+ else if (strcmp(key, SVN_CONFIG_AUTHN_FAILURES_KEY) == 0)
+ SVN_ERR(show_cert_failures(value->data, iterpool));
+ else
+ SVN_ERR(svn_cmdline_printf(iterpool, "%s: %s\n", key, value->data));
+ }
+ svn_pool_destroy(iterpool);
+
+ SVN_ERR(svn_cmdline_printf(scratch_pool, "\n"));
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_config_auth_walk_func_t` */
+static svn_error_t *
+walk_credentials(svn_boolean_t *delete_cred,
+ void *baton,
+ const char *cred_kind,
+ const char *realmstring,
+ apr_hash_t *cred_hash,
+ apr_pool_t *scratch_pool)
+{
+ struct walk_credentials_baton_t *b = baton;
+ apr_array_header_t *sorted_cred_items;
+ svn_x509_certinfo_t *certinfo = NULL;
+
+ *delete_cred = FALSE;
+
+ sorted_cred_items = svn_sort__hash(cred_hash,
+ svn_sort_compare_items_lexically,
+ scratch_pool);
+ if (b->patterns->nelts > 0)
+ {
+ svn_boolean_t match;
+
+ SVN_ERR(match_credential(&match, &certinfo, cred_kind, realmstring,
+ b->patterns, sorted_cred_items,
+ scratch_pool, scratch_pool));
+ if (!match)
+ return SVN_NO_ERROR;
+ }
+
+ b->matches++;
+
+ if (b->list)
+ SVN_ERR(list_credential(cred_kind, realmstring, sorted_cred_items,
+ b->show_passwords, certinfo, scratch_pool));
+ if (b->delete)
+ {
+ *delete_cred = TRUE;
+ SVN_ERR(svn_cmdline_printf(scratch_pool,
+ _("Deleting %s credential for realm '%s'\n"),
+ cred_kind, realmstring));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+svn_cl__auth(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ const char *config_path;
+ struct walk_credentials_baton_t b;
+
+ b.matches = 0;
+ b.show_passwords = opt_state->show_passwords;
+ b.list = !opt_state->remove;
+ b.delete = opt_state->remove;
+ b.patterns = apr_array_make(pool, 1, sizeof(const char *));
+ for (; os->ind < os->argc; os->ind++)
+ {
+ /* The apr_getopt targets are still in native encoding. */
+ const char *raw_target = os->argv[os->ind];
+ const char *utf8_target;
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_target,
+ raw_target, pool));
+ APR_ARRAY_PUSH(b.patterns, const char *) = utf8_target;
+ }
+
+ SVN_ERR(svn_config_get_user_config_path(&config_path,
+ opt_state->config_dir, NULL,
+ pool));
+
+ if (b.delete && b.patterns->nelts < 1)
+ return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL);
+
+ SVN_ERR(svn_config_walk_auth_data(config_path, walk_credentials, &b, pool));
+
+ if (b.list)
+ {
+ if (b.matches == 0)
+ {
+ if (b.patterns->nelts == 0)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Credentials cache in '%s' is empty\n"),
+ svn_dirent_local_style(config_path, pool)));
+ else
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, 0,
+ _("Credentials cache in '%s' contains "
+ "no matching credentials"),
+ svn_dirent_local_style(config_path, pool));
+ }
+ else
+ {
+ if (b.patterns->nelts == 0)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Credentials cache in '%s' contains %d credentials\n"),
+ svn_dirent_local_style(config_path, pool), b.matches));
+ else
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Credentials cache in '%s' contains %d matching "
+ "credentials\n"),
+ svn_dirent_local_style(config_path, pool), b.matches));
+ }
+
+ }
+
+ if (b.delete)
+ {
+ if (b.matches == 0)
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, 0,
+ _("Credentials cache in '%s' contains "
+ "no matching credentials"),
+ svn_dirent_local_style(config_path, pool));
+ else
+ SVN_ERR(svn_cmdline_printf(pool, _("Deleted %d matching credentials "
+ "from '%s'\n"), b.matches,
+ svn_dirent_local_style(config_path, pool)));
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svn/blame-cmd.c b/subversion/svn/blame-cmd.c
index 174a199..3911a64 100644
--- a/subversion/svn/blame-cmd.c
+++ b/subversion/svn/blame-cmd.c
@@ -31,6 +31,7 @@
#include "svn_pools.h"
#include "svn_props.h"
#include "svn_cmdline.h"
+#include "svn_sorts.h"
#include "svn_xml.h"
#include "svn_time.h"
#include "cl.h"
@@ -42,6 +43,8 @@ typedef struct blame_baton_t
svn_cl__opt_state_t *opt_state;
svn_stream_t *out;
svn_stringbuf_t *sbuf;
+
+ int rev_maxlength;
} blame_baton_t;
@@ -63,9 +66,9 @@ blame_receiver_xml(void *baton,
svn_boolean_t local_change,
apr_pool_t *pool)
{
- svn_cl__opt_state_t *opt_state =
- ((blame_baton_t *) baton)->opt_state;
- svn_stringbuf_t *sb = ((blame_baton_t *) baton)->sbuf;
+ blame_baton_t *bb = baton;
+ svn_cl__opt_state_t *opt_state = bb->opt_state;
+ svn_stringbuf_t *sb = bb->sbuf;
/* "<entry ...>" */
/* line_no is 0-based, but the rest of the world is probably Pascal
@@ -74,7 +77,7 @@ blame_receiver_xml(void *baton,
"line-number",
apr_psprintf(pool, "%" APR_INT64_T_FMT,
line_no + 1),
- NULL);
+ SVN_VA_NULL);
if (SVN_IS_VALID_REVNUM(revision))
svn_cl__print_xml_commit(&sb, revision,
@@ -88,7 +91,7 @@ blame_receiver_xml(void *baton,
{
/* "<merged>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "merged",
- "path", merged_path, NULL);
+ "path", merged_path, SVN_VA_NULL);
svn_cl__print_xml_commit(&sb, merged_revision,
svn_prop_get_value(merged_rev_props,
@@ -119,23 +122,13 @@ print_line_info(svn_stream_t *out,
const char *date,
const char *path,
svn_boolean_t verbose,
- svn_revnum_t end_revnum,
+ int rev_maxlength,
apr_pool_t *pool)
{
const char *time_utf8;
const char *time_stdout;
const char *rev_str;
- int rev_maxlength;
- /* The standard column width for the revision number is 6 characters.
- If the revision number can potentially be larger (i.e. if the end_revnum
- is larger than 1000000), we increase the column width as needed. */
- rev_maxlength = 6;
- while (end_revnum >= 1000000)
- {
- rev_maxlength++;
- end_revnum = end_revnum / 10;
- }
rev_str = SVN_IS_VALID_REVNUM(revision)
? apr_psprintf(pool, "%*ld", rev_maxlength, revision)
: apr_psprintf(pool, "%*s", rev_maxlength, "-");
@@ -189,11 +182,26 @@ blame_receiver(void *baton,
svn_boolean_t local_change,
apr_pool_t *pool)
{
- svn_cl__opt_state_t *opt_state =
- ((blame_baton_t *) baton)->opt_state;
- svn_stream_t *out = ((blame_baton_t *)baton)->out;
+ blame_baton_t *bb = baton;
+ svn_cl__opt_state_t *opt_state = bb->opt_state;
+ svn_stream_t *out = bb->out;
svn_boolean_t use_merged = FALSE;
+ if (!bb->rev_maxlength)
+ {
+ svn_revnum_t max_revnum = MAX(start_revnum, end_revnum);
+ /* The standard column width for the revision number is 6 characters.
+ If the revision number can potentially be larger (i.e. if the end_revnum
+ is larger than 1000000), we increase the column width as needed. */
+
+ bb->rev_maxlength = 6;
+ while (max_revnum >= 1000000)
+ {
+ bb->rev_maxlength++;
+ max_revnum = max_revnum / 10;
+ }
+ }
+
if (opt_state->use_merge_history)
{
/* Choose which revision to use. If they aren't equal, prefer the
@@ -216,7 +224,8 @@ blame_receiver(void *baton,
SVN_PROP_REVISION_AUTHOR),
svn_prop_get_value(merged_rev_props,
SVN_PROP_REVISION_DATE),
- merged_path, opt_state->verbose, end_revnum,
+ merged_path, opt_state->verbose,
+ bb->rev_maxlength,
pool));
else
SVN_ERR(print_line_info(out, revision,
@@ -224,7 +233,8 @@ blame_receiver(void *baton,
SVN_PROP_REVISION_AUTHOR),
svn_prop_get_value(rev_props,
SVN_PROP_REVISION_DATE),
- NULL, opt_state->verbose, end_revnum,
+ NULL, opt_state->verbose,
+ bb->rev_maxlength,
pool));
return svn_stream_printf(out, pool, "%s%s", line, APR_EOL_STR);
@@ -286,6 +296,7 @@ svn_cl__blame(apr_getopt_t *os,
bl.sbuf = svn_stringbuf_create_empty(pool);
bl.opt_state = opt_state;
+ bl.rev_maxlength = 0;
subpool = svn_pool_create(pool);
@@ -350,7 +361,7 @@ svn_cl__blame(apr_getopt_t *os,
if (! svn_path_is_url(target))
outpath = svn_dirent_local_style(truepath, subpool);
svn_xml_make_open_tag(&bl.sbuf, pool, svn_xml_normal, "target",
- "path", outpath, NULL);
+ "path", outpath, SVN_VA_NULL);
receiver = blame_receiver_xml;
}
diff --git a/subversion/svn/cat-cmd.c b/subversion/svn/cat-cmd.c
index 551420e..eef7696 100644
--- a/subversion/svn/cat-cmd.c
+++ b/subversion/svn/cat-cmd.c
@@ -76,15 +76,16 @@ svn_cl__cat(apr_getopt_t *os,
SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target,
subpool));
- SVN_ERR(svn_cl__try(svn_client_cat2(out, truepath, &peg_revision,
+ SVN_ERR(svn_cl__try(svn_client_cat3(NULL, out, truepath, &peg_revision,
&(opt_state->start_revision),
- ctx, subpool),
+ !opt_state->ignore_keywords,
+ ctx, subpool, subpool),
errors, opt_state->quiet,
SVN_ERR_UNVERSIONED_RESOURCE,
SVN_ERR_ENTRY_NOT_FOUND,
SVN_ERR_CLIENT_IS_DIRECTORY,
SVN_ERR_FS_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
}
svn_pool_destroy(subpool);
diff --git a/subversion/svn/changelist-cmd.c b/subversion/svn/changelist-cmd.c
index 46347b6..27de62b 100644
--- a/subversion/svn/changelist-cmd.c
+++ b/subversion/svn/changelist-cmd.c
@@ -72,25 +72,7 @@ svn_cl__changelist(apr_getopt_t *os,
SVN_ERR(svn_cl__check_targets_are_local_paths(targets));
if (opt_state->quiet)
- /* FIXME: This is required because svn_client_create_context()
- always initializes ctx->notify_func2 to a wrapper function
- which calls ctx->notify_func() if it isn't NULL. In other
- words, typically, ctx->notify_func2 is never NULL. This isn't
- usually a problem, but the changelist logic generates
- svn_error_t's as part of its notification.
-
- So, svn_wc_set_changelist() checks its notify_func (our
- ctx->notify_func2) for NULL-ness, and seeing non-NULL-ness,
- generates a notificaton object and svn_error_t to describe some
- problem. It passes that off to its notify_func (our
- ctx->notify_func2) which drops the notification on the floor
- (because it wraps a NULL ctx->notify_func). But svn_error_t's
- dropped on the floor cause SEGFAULTs at pool cleanup time --
- they need instead to be cleared.
-
- SOOOooo... we set our ctx->notify_func2 to NULL so the WC code
- doesn't even generate the errors. */
- ctx->notify_func2 = NULL;
+ ctx->notify_func2 = NULL; /* Easy out: avoid unneeded work */
if (depth == svn_depth_unknown)
depth = svn_depth_empty;
@@ -106,7 +88,7 @@ svn_cl__changelist(apr_getopt_t *os,
errors, opt_state->quiet,
SVN_ERR_UNVERSIONED_RESOURCE,
SVN_ERR_WC_PATH_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
}
else
{
@@ -117,7 +99,7 @@ svn_cl__changelist(apr_getopt_t *os,
errors, opt_state->quiet,
SVN_ERR_UNVERSIONED_RESOURCE,
SVN_ERR_WC_PATH_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
}
if (errors->nelts > 0)
diff --git a/subversion/svn/checkout-cmd.c b/subversion/svn/checkout-cmd.c
index 6c192a0..56fd02b 100644
--- a/subversion/svn/checkout-cmd.c
+++ b/subversion/svn/checkout-cmd.c
@@ -72,6 +72,7 @@ svn_cl__checkout(apr_getopt_t *os,
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_pool_t *subpool;
apr_array_header_t *targets;
+ struct svn_cl__check_externals_failed_notify_baton nwb;
const char *last_target, *local_dir;
int i;
@@ -113,6 +114,12 @@ svn_cl__checkout(apr_getopt_t *os,
if (! opt_state->quiet)
SVN_ERR(svn_cl__notifier_mark_checkout(ctx->notify_baton2));
+ nwb.wrapped_func = ctx->notify_func2;
+ nwb.wrapped_baton = ctx->notify_baton2;
+ nwb.had_externals_error = FALSE;
+ ctx->notify_func2 = svn_cl__check_externals_failed_notify_wrapper;
+ ctx->notify_baton2 = &nwb;
+
subpool = svn_pool_create(pool);
for (i = 0; i < targets->nelts; ++i)
{
@@ -169,5 +176,10 @@ svn_cl__checkout(apr_getopt_t *os,
}
svn_pool_destroy(subpool);
+ if (nwb.had_externals_error)
+ return svn_error_create(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, NULL,
+ _("Failure occurred processing one or "
+ "more externals definitions"));
+
return SVN_NO_ERROR;
}
diff --git a/subversion/svn/cl-conflicts.c b/subversion/svn/cl-conflicts.c
index 440c9d7..8507e8c 100644
--- a/subversion/svn/cl-conflicts.c
+++ b/subversion/svn/cl-conflicts.c
@@ -69,11 +69,13 @@ static const svn_token_map_t map_conflict_kind_xml[] =
/* Return a localised string representation of the local part of a conflict;
NULL for non-localised odd cases. */
static const char *
-local_reason_str(svn_node_kind_t kind, svn_wc_conflict_reason_t reason)
+local_reason_str(svn_node_kind_t kind, svn_wc_conflict_reason_t reason,
+ svn_wc_operation_t operation)
{
switch (kind)
{
case svn_node_file:
+ case svn_node_symlink:
switch (reason)
{
case svn_wc_conflict_reason_edited:
@@ -83,7 +85,10 @@ local_reason_str(svn_node_kind_t kind, svn_wc_conflict_reason_t reason)
case svn_wc_conflict_reason_deleted:
return _("local file delete");
case svn_wc_conflict_reason_missing:
- return _("local file missing");
+ if (operation == svn_wc_operation_merge)
+ return _("local file missing or deleted or moved away");
+ else
+ return _("local file missing");
case svn_wc_conflict_reason_unversioned:
return _("local file unversioned");
case svn_wc_conflict_reason_added:
@@ -106,7 +111,10 @@ local_reason_str(svn_node_kind_t kind, svn_wc_conflict_reason_t reason)
case svn_wc_conflict_reason_deleted:
return _("local dir delete");
case svn_wc_conflict_reason_missing:
- return _("local dir missing");
+ if (operation == svn_wc_operation_merge)
+ return _("local dir missing or deleted or moved away");
+ else
+ return _("local dir missing");
case svn_wc_conflict_reason_unversioned:
return _("local dir unversioned");
case svn_wc_conflict_reason_added:
@@ -119,9 +127,32 @@ local_reason_str(svn_node_kind_t kind, svn_wc_conflict_reason_t reason)
return _("local dir moved here");
}
break;
- case svn_node_symlink:
case svn_node_none:
case svn_node_unknown:
+ switch (reason)
+ {
+ case svn_wc_conflict_reason_edited:
+ return _("local edit");
+ case svn_wc_conflict_reason_obstructed:
+ return _("local obstruction");
+ case svn_wc_conflict_reason_deleted:
+ return _("local delete");
+ case svn_wc_conflict_reason_missing:
+ if (operation == svn_wc_operation_merge)
+ return _("local missing or deleted or moved away");
+ else
+ return _("local missing");
+ case svn_wc_conflict_reason_unversioned:
+ return _("local unversioned");
+ case svn_wc_conflict_reason_added:
+ return _("local add");
+ case svn_wc_conflict_reason_replaced:
+ return _("local replace");
+ case svn_wc_conflict_reason_moved_away:
+ return _("local moved away");
+ case svn_wc_conflict_reason_moved_here:
+ return _("local moved here");
+ }
break;
}
return NULL;
@@ -135,6 +166,7 @@ incoming_action_str(svn_node_kind_t kind, svn_wc_conflict_action_t action)
switch (kind)
{
case svn_node_file:
+ case svn_node_symlink:
switch (action)
{
case svn_wc_conflict_action_edit:
@@ -142,9 +174,9 @@ incoming_action_str(svn_node_kind_t kind, svn_wc_conflict_action_t action)
case svn_wc_conflict_action_add:
return _("incoming file add");
case svn_wc_conflict_action_delete:
- return _("incoming file delete");
+ return _("incoming file delete or move");
case svn_wc_conflict_action_replace:
- return _("incoming file replace");
+ return _("incoming replace with file");
}
break;
case svn_node_dir:
@@ -155,14 +187,24 @@ incoming_action_str(svn_node_kind_t kind, svn_wc_conflict_action_t action)
case svn_wc_conflict_action_add:
return _("incoming dir add");
case svn_wc_conflict_action_delete:
- return _("incoming dir delete");
+ return _("incoming dir delete or move");
case svn_wc_conflict_action_replace:
- return _("incoming dir replace");
+ return _("incoming replace with dir");
}
break;
- case svn_node_symlink:
case svn_node_none:
case svn_node_unknown:
+ switch (action)
+ {
+ case svn_wc_conflict_action_edit:
+ return _("incoming edit");
+ case svn_wc_conflict_action_add:
+ return _("incoming add");
+ case svn_wc_conflict_action_delete:
+ return _("incoming delete or move");
+ case svn_wc_conflict_action_replace:
+ return _("incoming replace");
+ }
break;
}
return NULL;
@@ -267,7 +309,8 @@ svn_cl__get_human_readable_tree_conflict_description(
incoming_kind = conflict->src_right_version->node_kind;
}
- reason = local_reason_str(conflict->node_kind, conflict->reason);
+ reason = local_reason_str(conflict->node_kind, conflict->reason,
+ conflict->operation);
action = incoming_action_str(incoming_kind, conflict->action);
operation = operation_str(conflict->operation);
SVN_ERR_ASSERT(operation);
@@ -294,6 +337,27 @@ svn_cl__get_human_readable_tree_conflict_description(
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_cl__get_human_readable_action_description(
+ const char **desc,
+ svn_wc_conflict_action_t action,
+ svn_wc_operation_t operation,
+ svn_node_kind_t kind,
+ apr_pool_t *pool)
+{
+ const char *action_s, *operation_s;
+
+ action_s = incoming_action_str(kind, action);
+ operation_s = operation_str(operation);
+
+ SVN_ERR_ASSERT(operation_s);
+
+ *desc = apr_psprintf(pool, _("%s %s"),
+ action_s, operation_s);
+
+ return SVN_NO_ERROR;
+}
+
/* Helper for svn_cl__append_tree_conflict_info_xml().
* Appends the attributes of the given VERSION to ATT_HASH.
diff --git a/subversion/svn/cl-conflicts.h b/subversion/svn/cl-conflicts.h
index 07591a0..d488074 100644
--- a/subversion/svn/cl-conflicts.h
+++ b/subversion/svn/cl-conflicts.h
@@ -63,6 +63,16 @@ svn_cl__get_human_readable_tree_conflict_description(
const svn_wc_conflict_description2_t *conflict,
apr_pool_t *pool);
+/* Like svn_cl__get_human_readable_tree_conflict_description but
+ for other conflict types */
+svn_error_t *
+svn_cl__get_human_readable_action_description(
+ const char **desc,
+ svn_wc_conflict_action_t action,
+ svn_wc_operation_t operation,
+ svn_node_kind_t kind,
+ apr_pool_t *pool);
+
/**
* Append to @a str an XML representation of the conflict data
* for @a conflict, in a format suitable for 'svn info --xml'.
diff --git a/subversion/svn/cl-log.h b/subversion/svn/cl-log.h
new file mode 100644
index 0000000..5b4c7aa
--- /dev/null
+++ b/subversion/svn/cl-log.h
@@ -0,0 +1,105 @@
+/*
+ * cl-log.h: Log entry receiver
+ *
+ * ====================================================================
+ * 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_CL_LOG_H
+#define SVN_CL_LOG_H
+
+/*** Includes. ***/
+#include <apr_pools.h>
+
+#include "svn_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* The separator between log messages. */
+#define SVN_CL__LOG_SEP_STRING \
+ "------------------------------------------------------------------------\n"
+
+/* Baton for log_entry_receiver() and log_entry_receiver_xml(). */
+typedef struct svn_cl__log_receiver_baton
+{
+ /* Client context. */
+ svn_client_ctx_t *ctx;
+
+ /* The target of the log operation. */
+ const char *target_path_or_url;
+ svn_opt_revision_t target_peg_revision;
+
+ /* Don't print log message body nor its line count. */
+ svn_boolean_t omit_log_message;
+
+ /* Whether to show diffs in the log. (maps to --diff) */
+ svn_boolean_t show_diff;
+
+ /* Depth applied to diff output. */
+ svn_depth_t depth;
+
+ /* Diff arguments received from command line. */
+ const char *diff_extensions;
+
+ /* Stack which keeps track of merge revision nesting, using svn_revnum_t's */
+ apr_array_header_t *merge_stack;
+
+ /* Log message search patterns. Log entries will only be shown if the author,
+ * the log message, or a changed path matches one of these patterns. */
+ apr_array_header_t *search_patterns;
+
+ /* Pool for persistent allocations. */
+ apr_pool_t *pool;
+} svn_cl__log_receiver_baton;
+
+/* Implement `svn_log_entry_receiver_t', printing the logs in
+ * a human-readable and machine-parseable format.
+ *
+ * BATON is of type `struct svn_cl__log_receiver_baton'.
+ *
+ * First, print a header line. Then if CHANGED_PATHS is non-null,
+ * print all affected paths in a list headed "Changed paths:\n",
+ * immediately following the header line. Then print a newline
+ * followed by the message body, unless BATON->omit_log_message is true.
+ */
+svn_error_t *
+svn_cl__log_entry_receiver(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool);
+
+/* This implements `svn_log_entry_receiver_t', printing the logs in XML.
+ *
+ * BATON is of type `struct svn_cl__log_receiver_baton'.
+ */
+svn_error_t *
+svn_cl__log_entry_receiver_xml(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_CL_LOG_H */
diff --git a/subversion/svn/cl.h b/subversion/svn/cl.h
index 8a732c7..42e770e 100644
--- a/subversion/svn/cl.h
+++ b/subversion/svn/cl.h
@@ -158,7 +158,7 @@ typedef struct svn_cl__opt_state_t
/* Was --no-unlock specified? */
svn_boolean_t no_unlock;
- const char *message; /* log message */
+ const char *message; /* log message (not converted to UTF-8) */
svn_boolean_t force; /* be more forceful, as in "svn rm -f ..." */
svn_boolean_t force_log; /* force validity of a suspect log msg file */
svn_boolean_t incremental; /* yield output suitable for concatenation */
@@ -167,20 +167,22 @@ typedef struct svn_cl__opt_state_t
svn_boolean_t version; /* print version information */
svn_boolean_t verbose; /* be verbose */
svn_boolean_t update; /* contact the server for the full story */
- svn_boolean_t strict; /* do strictly what was requested */
- svn_stringbuf_t *filedata; /* contents of file used as option data */
- const char *encoding; /* the locale/encoding of the data*/
+ svn_stringbuf_t *filedata; /* contents of file used as option data
+ (not converted to UTF-8) */
+ const char *encoding; /* the locale/encoding of 'message' and of
+ 'filedata' (not converted to UTF-8) */
svn_boolean_t help; /* print usage message */
- const char *auth_username; /* auth username */ /* UTF-8! */
- const char *auth_password; /* auth password */ /* UTF-8! */
- const char *extensions; /* subprocess extension args */ /* UTF-8! */
- apr_array_header_t *targets; /* target list from file */ /* UTF-8! */
+ const char *auth_username; /* auth username */
+ const char *auth_password; /* auth password */
+ const char *extensions; /* subprocess extension args */
+ apr_array_header_t *targets; /* target list from file */
svn_boolean_t xml; /* output in xml, e.g., "svn log --xml" */
svn_boolean_t no_ignore; /* disregard default ignores & svn:ignore's */
svn_boolean_t no_auth_cache; /* do not cache authentication information */
struct
{
- const char *diff_cmd; /* the external diff command to use */
+ const char *diff_cmd; /* the external diff command to use
+ (not converted to UTF-8) */
svn_boolean_t internal_diff; /* override diff_cmd in config file */
svn_boolean_t no_diff_added; /* do not show diffs for deleted files */
svn_boolean_t no_diff_deleted; /* do not show diffs for deleted files */
@@ -197,8 +199,10 @@ typedef struct svn_cl__opt_state_t
svn_boolean_t stop_on_copy; /* don't cross copies during processing */
svn_boolean_t dry_run; /* try operation but make no changes */
svn_boolean_t revprop; /* operate on a revision property */
- const char *merge_cmd; /* the external merge command to use */
- const char *editor_cmd; /* the external editor command to use */
+ const char *merge_cmd; /* the external merge command to use
+ (not converted to UTF-8) */
+ const char *editor_cmd; /* the external editor command to use
+ (not converted to UTF-8) */
svn_boolean_t record_only; /* whether to record mergeinfo */
const char *old_target; /* diff target */
const char *new_target; /* diff target */
@@ -210,21 +214,24 @@ typedef struct svn_cl__opt_state_t
const char *native_eol; /* override system standard eol marker */
svn_boolean_t remove; /* deassociate a changelist */
apr_array_header_t *changelists; /* changelist filters */
- const char *changelist; /* operate on this changelist
- THIS IS TEMPORARY (LAST OF CHANGELISTS) */
svn_boolean_t keep_changelists;/* don't remove changelists after commit */
svn_boolean_t keep_local; /* delete path only from repository */
svn_boolean_t all_revprops; /* retrieve all revprops */
svn_boolean_t no_revprops; /* retrieve no revprops */
- apr_hash_t *revprop_table; /* table of revision properties to get/set */
+ apr_hash_t *revprop_table; /* table of revision properties to get/set
+ (not converted to UTF-8) */
svn_boolean_t parents; /* create intermediate directories */
svn_boolean_t use_merge_history; /* use/display extra merge information */
svn_cl__accept_t accept_which; /* how to handle conflicts */
svn_cl__show_revs_t show_revs; /* mergeinfo flavor */
svn_depth_t set_depth; /* new sticky ambient depth value */
svn_boolean_t reintegrate; /* use "reintegrate" merge-source heuristic */
- svn_boolean_t trust_server_cert; /* trust server SSL certs that would
- otherwise be rejected as "untrusted" */
+ /* trust server SSL certs that would otherwise be rejected as "untrusted" */
+ 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;
int strip; /* number of leading path components to strip */
svn_boolean_t ignore_keywords; /* do not expand keywords */
svn_boolean_t reverse_diff; /* reverse a diff (e.g. when patching) */
@@ -235,6 +242,13 @@ typedef struct svn_cl__opt_state_t
svn_boolean_t include_externals; /* Recurses (in)to file & dir externals */
svn_boolean_t show_inherited_props; /* get inherited properties */
apr_array_header_t* search_patterns; /* pattern arguments for --search */
+ svn_boolean_t mergeinfo_log; /* show log message in mergeinfo command */
+ svn_boolean_t remove_unversioned;/* remove unversioned items */
+ svn_boolean_t remove_ignored; /* remove ignored items */
+ svn_boolean_t no_newline; /* do not output the trailing newline */
+ svn_boolean_t show_passwords; /* show cached passwords */
+ svn_boolean_t pin_externals; /* pin externals to last-changed revisions */
+ const char *show_item; /* print only the given item */
} svn_cl__opt_state_t;
@@ -248,6 +262,7 @@ typedef struct svn_cl__cmd_baton_t
/* Declare all the command procedures */
svn_opt_subcommand_t
svn_cl__add,
+ svn_cl__auth,
svn_cl__blame,
svn_cl__cat,
svn_cl__changelist,
@@ -310,7 +325,7 @@ extern const apr_getopt_option_t svn_cl__options[];
*
* Typically, error codes like SVN_ERR_UNVERSIONED_RESOURCE,
* SVN_ERR_ENTRY_NOT_FOUND, etc, are supplied in varargs. Don't
- * forget to terminate the argument list with SVN_NO_ERROR.
+ * forget to terminate the argument list with 0 (or APR_SUCCESS).
*/
svn_error_t *
svn_cl__try(svn_error_t *err,
@@ -347,6 +362,14 @@ svn_cl__conflict_stats_resolved(svn_cl__conflict_stats_t *conflict_stats,
const char *path_local,
svn_wc_conflict_kind_t conflict_kind);
+/* Print the conflict stats accumulated in CONFLICT_STATS.
+ *
+ * Return any error encountered during printing.
+ * See also svn_cl__notifier_print_conflict_stats().
+ */
+svn_error_t *
+svn_cl__print_conflict_stats(svn_cl__conflict_stats_t *conflict_stats,
+ apr_pool_t *scratch_pool);
/* Create and return an baton for use with svn_cl__conflict_func_interactive
* in *B, allocated from RESULT_POOL, and initialised with the values
@@ -514,7 +537,8 @@ svn_cl__merge_file_externally(const char *base_path,
/* Like svn_cl__merge_file_externally, but using a built-in merge tool
* with help from an external editor specified by EDITOR_CMD. */
svn_error_t *
-svn_cl__merge_file(const char *base_path,
+svn_cl__merge_file(svn_boolean_t *remains_in_conflict,
+ const char *base_path,
const char *their_path,
const char *my_path,
const char *merged_path,
@@ -522,7 +546,8 @@ svn_cl__merge_file(const char *base_path,
const char *path_prefix,
const char *editor_cmd,
apr_hash_t *config,
- svn_boolean_t *remains_in_conflict,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool);
@@ -571,7 +596,9 @@ svn_cl__check_externals_failed_notify_wrapper(void *baton,
apr_pool_t *pool);
/* Print the conflict stats accumulated in BATON, which is the
- * notifier baton from svn_cl__get_notifier().
+ * notifier baton from svn_cl__get_notifier(). This is just like
+ * calling svn_cl__print_conflict_stats().
+ *
* Return any error encountered during printing.
*/
svn_error_t *
@@ -828,6 +855,48 @@ svn_cl__deprecated_merge_reintegrate(const char *source_path_or_url,
svn_client_ctx_t *ctx,
apr_pool_t *pool);
+
+/* Forward declaration of the similarity check context. */
+typedef struct svn_cl__simcheck_context_t svn_cl__simcheck_context_t;
+
+/* Token definition for the similarity check. */
+typedef struct svn_cl__simcheck_t
+{
+ /* The token we're checking for similarity. */
+ svn_string_t token;
+
+ /* User data associated with this token. */
+ const void *data;
+
+ /*
+ * The following fields are populated by svn_cl__similarity_check.
+ */
+
+ /* Similarity score [0..SVN_STRING__SIM_RANGE_MAX] */
+ apr_size_t score;
+
+ /* Number of characters of difference from the key. */
+ apr_size_t diff;
+
+ /* Similarity check context (private) */
+ svn_cl__simcheck_context_t *context;
+} svn_cl__simcheck_t;
+
+/* Find the entries in TOKENS that are most similar to KEY.
+ * TOKEN_COUNT is the number of entries in the (mutable) TOKENS array.
+ * Use SCRATCH_POOL for temporary allocations.
+ *
+ * On return, the TOKENS array will be sorted according to similarity
+ * to KEY, in descending order. The return value will be zero if the
+ * first token is an exact match; otherwise, it will be one more than
+ * the number of tokens that are at least two-thirds similar to KEY.
+ */
+apr_size_t
+svn_cl__similarity_check(const char *key,
+ svn_cl__simcheck_t **tokens,
+ apr_size_t token_count,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/svn/cleanup-cmd.c b/subversion/svn/cleanup-cmd.c
index 64fa400..6b0b62e 100644
--- a/subversion/svn/cleanup-cmd.c
+++ b/subversion/svn/cleanup-cmd.c
@@ -47,7 +47,7 @@ svn_cl__cleanup(apr_getopt_t *os,
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
- apr_pool_t *subpool;
+ apr_pool_t *iterpool;
int i;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
@@ -61,30 +61,60 @@ svn_cl__cleanup(apr_getopt_t *os,
SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
- subpool = svn_pool_create(pool);
+ iterpool = svn_pool_create(pool);
for (i = 0; i < targets->nelts; i++)
{
const char *target = APR_ARRAY_IDX(targets, i, const char *);
- svn_error_t *err;
+ const char *target_abspath;
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
- err = svn_client_cleanup(target, ctx, subpool);
- if (err && err->apr_err == SVN_ERR_WC_LOCKED)
+
+ SVN_ERR(svn_dirent_get_absolute(&target_abspath, target, iterpool));
+
+ if (opt_state->remove_unversioned || opt_state->remove_ignored)
{
- const char *target_abspath;
- svn_error_t *err2 = svn_dirent_get_absolute(&target_abspath,
- target, subpool);
- if (err2)
- {
- err = svn_error_compose_create(err, err2);
- }
- else
+ svn_error_t *err = svn_client_vacuum(target_abspath,
+ opt_state->remove_unversioned,
+ opt_state->remove_ignored,
+ TRUE /* fix_timestamps */,
+ FALSE /* vacuum_pristines */,
+ opt_state->include_externals,
+ ctx, iterpool);
+
+ if (err && err->apr_err == SVN_ERR_WC_LOCKED)
+ err = svn_error_create(SVN_ERR_WC_LOCKED, err,
+ _("Working copy locked; if no other "
+ "Subversion client is currently "
+ "using the working copy, try running "
+ "'svn cleanup' without the "
+ "--remove-unversioned and "
+ "--remove-ignored options first."));
+ else if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
+ err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Cannot remove unversioned or ignored "
+ "items from something that is not a "
+ "working copy"));
+
+ SVN_ERR(err);
+ }
+ else
+ {
+ svn_error_t *err = svn_client_cleanup2(target_abspath,
+ TRUE /* break_locks */,
+ TRUE /* fix_timestamps */,
+ TRUE /* clear_dav_cache */,
+ TRUE /* vacuum_pristines */,
+ opt_state->include_externals,
+ ctx, iterpool);
+
+ if (err && err->apr_err == SVN_ERR_WC_LOCKED)
{
const char *wcroot_abspath;
+ svn_error_t *err2;
err2 = svn_client_get_wc_root(&wcroot_abspath, target_abspath,
- ctx, subpool, subpool);
+ ctx, iterpool, iterpool);
if (err2)
err = svn_error_compose_create(err, err2);
else
@@ -93,12 +123,12 @@ svn_cl__cleanup(apr_getopt_t *os,
"'svn cleanup' on the root of the "
"working copy ('%s') instead."),
svn_dirent_local_style(wcroot_abspath,
- subpool));
+ iterpool));
}
+ SVN_ERR(err);
}
- SVN_ERR(err);
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
diff --git a/subversion/svn/client_errors.h b/subversion/svn/client_errors.h
deleted file mode 100644
index 19f0bdf..0000000
--- a/subversion/svn/client_errors.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * client_errors.h: error codes this command line client features
- *
- * ====================================================================
- * 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_CLIENT_ERRORS_H
-#define SVN_CLIENT_ERRORS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * This error defining system is copied from and explained in
- * ../../include/svn_error_codes.h
- */
-
-/* Process this file if we're building an error array, or if we have
- not defined the enumerated constants yet. */
-#if defined(SVN_ERROR_BUILD_ARRAY) || !defined(SVN_CMDLINE_ERROR_ENUM_DEFINED)
-
-#if defined(SVN_ERROR_BUILD_ARRAY)
-
-#error "Need to update err_defn for r1464679 and un-typo 'CDMLINE'"
-
-#define SVN_ERROR_START \
- static const err_defn error_table[] = { \
- { SVN_ERR_CDMLINE__WARNING, "Warning" },
-#define SVN_ERRDEF(n, s) { n, s },
-#define SVN_ERROR_END { 0, NULL } };
-
-#elif !defined(SVN_CMDLINE_ERROR_ENUM_DEFINED)
-
-#define SVN_ERROR_START \
- typedef enum svn_client_errno_t { \
- SVN_ERR_CDMLINE__WARNING = SVN_ERR_LAST + 1,
-#define SVN_ERRDEF(n, s) n,
-#define SVN_ERROR_END SVN_ERR_CMDLINE__ERR_LAST } svn_client_errno_t;
-
-#define SVN_CMDLINE_ERROR_ENUM_DEFINED
-
-#endif
-
-/* Define custom command line client error numbers */
-
-SVN_ERROR_START
-
- /* BEGIN Client errors */
-
-SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_WRITE,
- "Failed writing to temporary file.")
-
- SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_STAT,
- "Failed getting info about temporary file.")
-
- SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_OPEN,
- "Failed opening temporary file.")
-
- /* END Client errors */
-
-
-SVN_ERROR_END
-
-#undef SVN_ERROR_START
-#undef SVN_ERRDEF
-#undef SVN_ERROR_END
-
-#endif /* SVN_ERROR_BUILD_ARRAY || !SVN_CMDLINE_ERROR_ENUM_DEFINED */
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* SVN_CLIENT_ERRORS_H */
diff --git a/subversion/svn/commit-cmd.c b/subversion/svn/commit-cmd.c
index 2d04c69..45eef3b 100644
--- a/subversion/svn/commit-cmd.c
+++ b/subversion/svn/commit-cmd.c
@@ -137,7 +137,9 @@ svn_cl__commit(apr_getopt_t *os,
if (opt_state->depth == svn_depth_unknown)
opt_state->depth = svn_depth_infinity;
- cfg = svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG);
+ cfg = ctx->config
+ ? svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG)
+ : NULL;
if (cfg)
SVN_ERR(svn_config_get_bool(cfg, &no_unlock,
SVN_CONFIG_SECTION_MISCELLANY,
diff --git a/subversion/svn/conflict-callbacks.c b/subversion/svn/conflict-callbacks.c
index 0f12413..a9cb39a 100644
--- a/subversion/svn/conflict-callbacks.c
+++ b/subversion/svn/conflict-callbacks.c
@@ -44,6 +44,9 @@
#include "svn_private_config.h"
#define ARRAY_LEN(ary) ((sizeof (ary)) / (sizeof ((ary)[0])))
+#define MAX_ARRAY_LEN(aryx, aryz) \
+ (ARRAY_LEN((aryx)) > ARRAY_LEN((aryz)) \
+ ? ARRAY_LEN((aryx)) : ARRAY_LEN((aryz)))
@@ -56,6 +59,7 @@ struct svn_cl__interactive_conflict_baton_t {
const char *path_prefix;
svn_boolean_t quit;
svn_cl__conflict_stats_t *conflict_stats;
+ svn_boolean_t printed_summary;
};
svn_error_t *
@@ -82,6 +86,7 @@ svn_cl__get_conflict_func_interactive_baton(
SVN_ERR(svn_dirent_get_absolute(&(*b)->path_prefix, "", result_pool));
(*b)->quit = FALSE;
(*b)->conflict_stats = conflict_stats;
+ (*b)->printed_summary = FALSE;
return SVN_NO_ERROR;
}
@@ -127,6 +132,8 @@ svn_cl__accept_from_word(const char *word)
static svn_error_t *
show_diff(const svn_wc_conflict_description2_t *desc,
const char *path_prefix,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
const char *path1, *path2;
@@ -184,11 +191,14 @@ show_diff(const svn_wc_conflict_description2_t *desc,
SVN_ERR(svn_stream_for_stdout(&output, pool));
SVN_ERR(svn_diff_file_diff_2(&diff, path1, path2,
options, pool));
- return svn_diff_file_output_unified3(output, diff,
+ return svn_diff_file_output_unified4(output, diff,
path1, path2,
label1, label2,
APR_LOCALE_CHARSET,
- NULL, FALSE,
+ NULL,
+ options->show_c_function,
+ options->context_size,
+ cancel_func, cancel_baton,
pool);
}
@@ -197,6 +207,8 @@ show_diff(const svn_wc_conflict_description2_t *desc,
* and 'my' files of DESC. */
static svn_error_t *
show_conflicts(const svn_wc_conflict_description2_t *desc,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
svn_diff_t *diff;
@@ -213,7 +225,7 @@ show_conflicts(const svn_wc_conflict_description2_t *desc,
options, pool));
/* ### Consider putting the markers/labels from
### svn_wc__merge_internal in the conflict description. */
- return svn_diff_file_output_merge2(output, diff,
+ return svn_diff_file_output_merge3(output, diff,
desc->base_abspath,
desc->my_abspath,
desc->their_abspath,
@@ -222,6 +234,8 @@ show_conflicts(const svn_wc_conflict_description2_t *desc,
_(">>>>>>> THEIRS (select with 'tc')"),
"=======",
svn_diff_conflict_display_only_conflicts,
+ cancel_func,
+ cancel_baton,
pool);
}
@@ -237,6 +251,8 @@ static svn_error_t *
merge_prop_conflict(svn_stream_t *output,
const svn_wc_conflict_description2_t *desc,
const char *merged_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
const char *base_abspath = desc->base_abspath;
@@ -268,7 +284,7 @@ merge_prop_conflict(svn_stream_t *output,
merged_abspath ? merged_abspath : my_abspath,
their_abspath,
options, pool));
- SVN_ERR(svn_diff_file_output_merge2(output, diff,
+ SVN_ERR(svn_diff_file_output_merge3(output, diff,
base_abspath,
merged_abspath ? merged_abspath
: my_abspath,
@@ -278,6 +294,8 @@ merge_prop_conflict(svn_stream_t *output,
_(">>>>>>> THEIRS"),
"=======",
svn_diff_conflict_display_modified_original_latest,
+ cancel_func,
+ cancel_baton,
pool));
return SVN_NO_ERROR;
@@ -293,12 +311,15 @@ merge_prop_conflict(svn_stream_t *output,
static svn_error_t *
show_prop_conflict(const svn_wc_conflict_description2_t *desc,
const char *merged_abspath,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
svn_stream_t *output;
SVN_ERR(svn_stream_for_stdout(&output, pool));
- SVN_ERR(merge_prop_conflict(output, desc, merged_abspath, pool));
+ SVN_ERR(merge_prop_conflict(output, desc, merged_abspath,
+ cancel_func, cancel_baton, pool));
return SVN_NO_ERROR;
}
@@ -324,22 +345,14 @@ open_editor(svn_boolean_t *performed_edit,
{
err = svn_cmdline__edit_file_externally(merged_file, b->editor_cmd,
b->config, pool);
- if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_EDITOR))
+ if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_EDITOR ||
+ err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
{
- svn_error_t *root_err = svn_error_root_cause(err);
+ char buf[1024];
+ const char *message;
- SVN_ERR(svn_cmdline_fprintf(stderr, pool, "%s\n",
- root_err->message ? root_err->message :
- _("No editor found.")));
- svn_error_clear(err);
- }
- else if (err && (err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
- {
- svn_error_t *root_err = svn_error_root_cause(err);
-
- SVN_ERR(svn_cmdline_fprintf(stderr, pool, "%s\n",
- root_err->message ? root_err->message :
- _("Error running editor.")));
+ message = svn_err_best_message(err, buf, sizeof(buf));
+ SVN_ERR(svn_cmdline_fprintf(stderr, pool, "%s\n", message));
svn_error_clear(err);
}
else if (err)
@@ -375,60 +388,18 @@ edit_prop_conflict(const char **merged_file_path,
result_pool, scratch_pool));
merged_prop = svn_stream_from_aprfile2(file, TRUE /* disown */,
scratch_pool);
- SVN_ERR(merge_prop_conflict(merged_prop, desc, NULL, scratch_pool));
+ SVN_ERR(merge_prop_conflict(merged_prop, desc, NULL,
+ b->pb->cancel_func,
+ b->pb->cancel_baton,
+ scratch_pool));
SVN_ERR(svn_stream_close(merged_prop));
- SVN_ERR(svn_io_file_flush_to_disk(file, scratch_pool));
+ SVN_ERR(svn_io_file_flush(file, scratch_pool));
SVN_ERR(open_editor(&performed_edit, file_path, b, scratch_pool));
*merged_file_path = (performed_edit ? file_path : NULL);
return SVN_NO_ERROR;
}
-/* Run an external merge tool, passing it the 'base', 'their', 'my' and
- * 'merged' files in DESC. The tool to use is determined by B->config and
- * environment variables; see svn_cl__merge_file_externally() for details.
- *
- * If the tool runs, set *PERFORMED_EDIT to true; if a tool is not
- * configured or cannot run, do not touch *PERFORMED_EDIT, report the error
- * on stderr, and return SVN_NO_ERROR; if any other error is encountered,
- * return that error. */
-static svn_error_t *
-launch_resolver(svn_boolean_t *performed_edit,
- const svn_wc_conflict_description2_t *desc,
- svn_cl__interactive_conflict_baton_t *b,
- apr_pool_t *pool)
-{
- svn_error_t *err;
-
- err = svn_cl__merge_file_externally(desc->base_abspath, desc->their_abspath,
- desc->my_abspath, desc->merged_file,
- desc->local_abspath, b->config, NULL,
- pool);
- if (err && err->apr_err == SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)
- {
- SVN_ERR(svn_cmdline_fprintf(stderr, pool, "%s\n",
- err->message ? err->message :
- _("No merge tool found, "
- "try '(m) merge' instead.\n")));
- svn_error_clear(err);
- }
- else if (err && err->apr_err == SVN_ERR_EXTERNAL_PROGRAM)
- {
- SVN_ERR(svn_cmdline_fprintf(stderr, pool, "%s\n",
- err->message ? err->message :
- _("Error running merge tool, "
- "try '(m) merge' instead.")));
- svn_error_clear(err);
- }
- else if (err)
- return svn_error_trace(err);
- else if (performed_edit)
- *performed_edit = TRUE;
-
- return SVN_NO_ERROR;
-}
-
-
/* Maximum line length for the prompt string. */
#define MAX_PROMPT_WIDTH 70
@@ -438,7 +409,8 @@ typedef struct resolver_option_t
const char *code; /* one or two characters */
const char *short_desc; /* label in prompt (localized) */
const char *long_desc; /* longer description (localized) */
- svn_wc_conflict_choice_t choice; /* or -1 if not a simple choice */
+ svn_wc_conflict_choice_t choice;
+ /* or ..._undefined if not a simple choice */
} resolver_option_t;
/* Resolver options for a text conflict */
@@ -450,14 +422,15 @@ static const resolver_option_t text_conflict_options[] =
brackets. */
{ "e", N_("edit file"), N_("change merged file in an editor"
" [edit]"),
- -1 },
+ svn_wc_conflict_choose_undefined },
{ "df", N_("show diff"), N_("show all changes made to merged file"),
- -1 },
- { "r", N_("mark resolved"), N_("accept merged version of file"),
+ svn_wc_conflict_choose_undefined },
+ { "r", N_("mark resolved"), N_("accept merged version of file [working]"),
svn_wc_conflict_choose_merged },
{ "", "", "", svn_wc_conflict_choose_unspecified },
{ "dc", N_("display conflict"), N_("show all conflicts "
- "(ignoring merged version)"), -1 },
+ "(ignoring merged version)"),
+ svn_wc_conflict_choose_undefined },
{ "mc", N_("my side of conflict"), N_("accept my version for all conflicts "
"(same) [mine-conflict]"),
svn_wc_conflict_choose_mine_conflict },
@@ -473,16 +446,43 @@ static const resolver_option_t text_conflict_options[] =
"(same) [theirs-full]"),
svn_wc_conflict_choose_theirs_full },
{ "", "", "", svn_wc_conflict_choose_unspecified },
- { "m", N_("merge"), N_("use internal merge tool to resolve "
- "conflict"), -1 },
- { "l", N_("launch tool"), N_("launch external tool to resolve "
- "conflict [launch]"), -1 },
+ { "m", N_("merge"), N_("use merge tool to resolve conflict"),
+ svn_wc_conflict_choose_undefined },
+ { "l", N_("launch tool"), N_("launch external merge tool to resolve "
+ "conflict [launch]"),
+ svn_wc_conflict_choose_undefined },
+ { "i", N_("internal merge tool"), N_("use built-in merge tool to "
+ "resolve conflict"),
+ svn_wc_conflict_choose_undefined },
{ "p", N_("postpone"), N_("mark the conflict to be resolved later"
" [postpone]"),
svn_wc_conflict_choose_postpone },
{ "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
svn_wc_conflict_choose_postpone },
- { "s", N_("show all options"), N_("show this list (also 'h', '?')"), -1 },
+ { "s", N_("show all options"), N_("show this list (also 'h', '?')"),
+ svn_wc_conflict_choose_undefined },
+ { NULL }
+};
+
+/* Resolver options for a binary file conflict. */
+static const resolver_option_t binary_conflict_options[] =
+{
+ /* Translators: keep long_desc below 70 characters (wrap with a left
+ margin of 9 spaces if needed); don't translate the words within square
+ brackets. */
+ { "r", N_("mark resolved"), N_("accept the working copy version of file "
+ " [working]"),
+ svn_wc_conflict_choose_merged },
+ { "tf", N_("their version"), N_("accept the incoming version of file "
+ " [theirs-full]"),
+ svn_wc_conflict_choose_theirs_full },
+ { "p", N_("postpone"), N_("mark the conflict to be resolved later "
+ " [postpone]"),
+ svn_wc_conflict_choose_postpone },
+ { "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
+ svn_wc_conflict_choose_postpone },
+ { "s", N_("show all options"), N_("show this list (also 'h', '?')"),
+ svn_wc_conflict_choose_undefined },
{ NULL }
};
@@ -495,9 +495,11 @@ static const resolver_option_t prop_conflict_options[] =
{ "tf", N_("their version"), N_("accept their version of entire property "
"(same) [theirs-full]"),
svn_wc_conflict_choose_theirs_full },
- { "dc", N_("display conflict"), N_("show conflicts in this property"), -1 },
+ { "dc", N_("display conflict"), N_("show conflicts in this property"),
+ svn_wc_conflict_choose_undefined },
{ "e", N_("edit property"), N_("change merged property value in an editor"
- " [edit]"), -1 },
+ " [edit]"),
+ svn_wc_conflict_choose_undefined },
{ "r", N_("mark resolved"), N_("accept edited version of property"),
svn_wc_conflict_choose_merged },
{ "p", N_("postpone"), N_("mark the conflict to be resolved later"
@@ -505,7 +507,8 @@ static const resolver_option_t prop_conflict_options[] =
svn_wc_conflict_choose_postpone },
{ "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
+ { "h", N_("help"), N_("show this help (also '?')"),
+ svn_wc_conflict_choose_undefined },
{ NULL }
};
@@ -518,31 +521,14 @@ static const resolver_option_t tree_conflict_options[] =
svn_wc_conflict_choose_postpone },
{ "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
+ { "h", N_("help"), N_("show this help (also '?')"),
+ svn_wc_conflict_choose_undefined },
{ NULL }
};
static const resolver_option_t tree_conflict_options_update_moved_away[] =
{
- { "mc", N_("apply update (recommended)"),
- N_("apply update to the move destination"
- " [mine-conflict]"),
- svn_wc_conflict_choose_mine_conflict },
- { "r", N_("discard update (breaks move)"), N_("discard update, mark "
- "resolved, the move will "
- "will become a copy"),
- svn_wc_conflict_choose_merged },
- { "p", N_("postpone"), N_("resolve the conflict later [postpone]"),
- svn_wc_conflict_choose_postpone },
- { "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
- svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
- { NULL }
-};
-
-static const resolver_option_t tree_conflict_options_update_edit_moved_away[] =
-{
- { "mc", N_("apply update to move destination"),
+ { "mc", N_("apply update to move destination (recommended)"),
N_("apply incoming update to move destination"
" [mine-conflict]"),
svn_wc_conflict_choose_mine_conflict },
@@ -550,43 +536,26 @@ static const resolver_option_t tree_conflict_options_update_edit_moved_away[] =
svn_wc_conflict_choose_postpone },
{ "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
- { NULL }
-};
-
-static const resolver_option_t tree_conflict_options_update_deleted[] =
-{
- { "mc", N_("keep affected local moves"), N_("keep any local moves affected "
- "by this deletion [mine-conflict]"),
- svn_wc_conflict_choose_mine_conflict },
- { "r", N_("mark resolved (breaks moves)"), N_("mark resolved, any affected "
- "moves will become copies"),
- svn_wc_conflict_choose_merged },
- { "p", N_("postpone"), N_("resolve the conflict later [postpone]"),
- svn_wc_conflict_choose_postpone },
- { "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
- svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
+ { "h", N_("help"), N_("show this help (also '?')"),
+ svn_wc_conflict_choose_undefined },
{ NULL }
};
-static const resolver_option_t tree_conflict_options_update_replaced[] =
+static const resolver_option_t tree_conflict_options_update_edit_deleted_dir[] =
{
- { "mc", N_("keep affected local moves"), N_("keep any moves affected by this "
- "replacement [mine-conflict]"),
+ { "mc", N_("prepare for updating moved-away children, if any (recommended)"),
+ N_("allow updating moved-away children "
+ "with 'svn resolve' [mine-conflict]"),
svn_wc_conflict_choose_mine_conflict },
- { "r", N_("mark resolved (breaks moves)"), N_("mark resolved (any affected "
- "moves will become copies)"),
- svn_wc_conflict_choose_merged },
{ "p", N_("postpone"), N_("resolve the conflict later [postpone]"),
svn_wc_conflict_choose_postpone },
{ "q", N_("quit resolution"), N_("postpone all remaining conflicts"),
svn_wc_conflict_choose_postpone },
- { "h", N_("help"), N_("show this help (also '?')"), -1 },
+ { "h", N_("help"), N_("show this help (also '?')"),
+ svn_wc_conflict_choose_undefined },
{ NULL }
};
-
/* Return a pointer to the option description in OPTIONS matching the
* one- or two-character OPTION_CODE. Return NULL if not found. */
static const resolver_option_t *
@@ -637,21 +606,21 @@ prompt_string(const resolver_option_t *options,
}
if (! first)
- result = apr_pstrcat(pool, result, ",", (char *)NULL);
+ result = apr_pstrcat(pool, result, ",", SVN_VA_NULL);
s = apr_psprintf(pool, _(" (%s) %s"),
opt->code, _(opt->short_desc));
slen = svn_utf_cstring_utf8_width(s);
/* Break the line if adding the next option would make it too long */
if (this_line_len + slen > MAX_PROMPT_WIDTH)
{
- result = apr_pstrcat(pool, result, line_sep, (char *)NULL);
+ result = apr_pstrcat(pool, result, line_sep, SVN_VA_NULL);
this_line_len = left_margin;
}
- result = apr_pstrcat(pool, result, s, (char *)NULL);
+ result = apr_pstrcat(pool, result, s, SVN_VA_NULL);
this_line_len += slen;
first = FALSE;
}
- return apr_pstrcat(pool, result, ": ", (char *)NULL);
+ return apr_pstrcat(pool, result, ": ", SVN_VA_NULL);
}
/* Return a help string listing the OPTIONS. */
@@ -674,13 +643,13 @@ help_string(const resolver_option_t *options,
}
else
{
- result = apr_pstrcat(pool, result, "\n", (char *)NULL);
+ result = apr_pstrcat(pool, result, "\n", SVN_VA_NULL);
}
}
result = apr_pstrcat(pool, result,
_("Words in square brackets are the corresponding "
"--accept option arguments.\n"),
- (char *)NULL);
+ SVN_VA_NULL);
return result;
}
@@ -736,31 +705,50 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
svn_boolean_t diff_allowed = FALSE;
/* Have they done something that might have affected the merged
- file (so that we need to save a .edited copy)? */
+ file (so that we need to save a .edited copy by setting the
+ result->save_merge flag)? */
svn_boolean_t performed_edit = FALSE;
/* Have they done *something* (edit, look at diff, etc) to
give them a rational basis for choosing (r)esolved? */
svn_boolean_t knows_something = FALSE;
+ const char *local_relpath;
SVN_ERR_ASSERT(desc->kind == svn_wc_conflict_kind_text);
- SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
- _("Conflict discovered in file '%s'.\n"),
- svn_cl__local_style_skip_ancestor(
- b->path_prefix, desc->local_abspath,
- scratch_pool)));
+ local_relpath = svn_cl__local_style_skip_ancestor(b->path_prefix,
+ desc->local_abspath,
+ scratch_pool);;
+
+ if (desc->is_binary)
+ SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
+ _("Conflict discovered in binary file '%s'.\n"),
+ local_relpath));
+ else
+ SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
+ _("Conflict discovered in file '%s'.\n"),
+ local_relpath));
+
+ /* ### TODO This whole feature availability check is grossly outdated.
+ DIFF_ALLOWED needs either to be redefined or to go away.
+ */
/* Diffing can happen between base and merged, to show conflict
markers to the user (this is the typical 3-way merge
scenario), or if no base is available, we can show a diff
between mine and theirs. */
- if ((desc->merged_file && desc->base_abspath)
- || (!desc->base_abspath && desc->my_abspath && desc->their_abspath))
+ if (!desc->is_binary &&
+ ((desc->merged_file && desc->base_abspath)
+ || (!desc->base_abspath && desc->my_abspath && desc->their_abspath)))
diff_allowed = TRUE;
while (TRUE)
{
- const char *options[ARRAY_LEN(text_conflict_options)];
+ const char *options[1 + MAX_ARRAY_LEN(binary_conflict_options,
+ text_conflict_options)];
+
+ const resolver_option_t *conflict_options = desc->is_binary
+ ? binary_conflict_options
+ : text_conflict_options;
const char **next_option = options;
const resolver_option_t *opt;
@@ -769,31 +757,39 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
*next_option++ = "p";
if (diff_allowed)
{
- *next_option++ = "df";
+ /* We need one more path for this feature. */
+ if (desc->my_abspath)
+ *next_option++ = "df";
+
*next_option++ = "e";
- *next_option++ = "m";
+
+ /* We need one more path for this feature. */
+ if (desc->my_abspath)
+ *next_option++ = "m";
if (knows_something)
*next_option++ = "r";
- if (! desc->is_binary)
- {
- *next_option++ = "mc";
- *next_option++ = "tc";
- }
+ *next_option++ = "mc";
+ *next_option++ = "tc";
}
else
{
- if (knows_something)
+ if (knows_something || desc->is_binary)
*next_option++ = "r";
- *next_option++ = "mf";
+
+ /* The 'mine-full' option selects the ".mine" file so only offer
+ * it if that file exists. It does not exist for binary files,
+ * for example (questionable historical behaviour since 1.0). */
+ if (desc->my_abspath)
+ *next_option++ = "mf";
+
*next_option++ = "tf";
}
*next_option++ = "s";
*next_option++ = NULL;
- SVN_ERR(prompt_user(&opt, text_conflict_options, options, b->pb,
- iterpool));
+ SVN_ERR(prompt_user(&opt, conflict_options, options, b->pb, iterpool));
if (! opt)
continue;
@@ -807,7 +803,7 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
else if (strcmp(opt->code, "s") == 0)
{
SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "\n%s\n",
- help_string(text_conflict_options,
+ help_string(conflict_options,
iterpool)));
}
else if (strcmp(opt->code, "dc") == 0)
@@ -828,12 +824,16 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
"files not available.\n\n")));
continue;
}
- SVN_ERR(show_conflicts(desc, iterpool));
+ SVN_ERR(show_conflicts(desc,
+ b->pb->cancel_func,
+ b->pb->cancel_baton,
+ iterpool));
knows_something = TRUE;
}
else if (strcmp(opt->code, "df") == 0)
{
- if (! diff_allowed)
+ /* Re-check preconditions. */
+ if (! diff_allowed || ! desc->my_abspath)
{
SVN_ERR(svn_cmdline_fprintf(stderr, iterpool,
_("Invalid option; there's no "
@@ -841,7 +841,9 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
continue;
}
- SVN_ERR(show_diff(desc, b->path_prefix, iterpool));
+ SVN_ERR(show_diff(desc, b->path_prefix,
+ b->pb->cancel_func, b->pb->cancel_baton,
+ iterpool));
knows_something = TRUE;
}
else if (strcmp(opt->code, "e") == 0 || strcmp(opt->code, ":-E") == 0)
@@ -853,36 +855,68 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
else if (strcmp(opt->code, "m") == 0 || strcmp(opt->code, ":-g") == 0 ||
strcmp(opt->code, "=>-") == 0 || strcmp(opt->code, ":>.") == 0)
{
- if (desc->kind != svn_wc_conflict_kind_text)
+ svn_error_t *err;
+
+ /* Re-check preconditions. */
+ if (! desc->my_abspath)
{
SVN_ERR(svn_cmdline_fprintf(stderr, iterpool,
- _("Invalid option; can only "
- "resolve text conflicts with "
- "the internal merge tool."
- "\n\n")));
+ _("Invalid option; there's no "
+ "base path to merge.\n\n")));
continue;
}
- if (desc->base_abspath && desc->their_abspath &&
- desc->my_abspath && desc->merged_file)
+ err = svn_cl__merge_file_externally(desc->base_abspath,
+ desc->their_abspath,
+ desc->my_abspath,
+ desc->merged_file,
+ desc->local_abspath, b->config,
+ NULL, iterpool);
+ if (err)
{
- svn_boolean_t remains_in_conflict;
-
- SVN_ERR(svn_cl__merge_file(desc->base_abspath,
- desc->their_abspath,
- desc->my_abspath,
- desc->merged_file,
- desc->local_abspath,
- b->path_prefix,
- b->editor_cmd,
- b->config,
- &remains_in_conflict,
- iterpool));
- knows_something = !remains_in_conflict;
+ if (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)
+ {
+ svn_boolean_t remains_in_conflict = TRUE;
+
+ /* Try the internal merge tool. */
+ svn_error_clear(err);
+ SVN_ERR(svn_cl__merge_file(&remains_in_conflict,
+ desc->base_abspath,
+ desc->their_abspath,
+ desc->my_abspath,
+ desc->merged_file,
+ desc->local_abspath,
+ b->path_prefix,
+ b->editor_cmd,
+ b->config,
+ b->pb->cancel_func,
+ b->pb->cancel_baton,
+ iterpool));
+ knows_something = !remains_in_conflict;
+ }
+ else if (err->apr_err == SVN_ERR_EXTERNAL_PROGRAM)
+ {
+ char buf[1024];
+ const char *message;
+
+ message = svn_err_best_message(err, buf, sizeof(buf));
+ SVN_ERR(svn_cmdline_fprintf(stderr, iterpool,
+ "%s\n", message));
+ svn_error_clear(err);
+ continue;
+ }
+ else
+ return svn_error_trace(err);
}
else
- SVN_ERR(svn_cmdline_fprintf(stderr, iterpool,
- _("Invalid option.\n\n")));
+ {
+ /* The external merge tool's exit code was either 0 or 1.
+ * The tool may leave the file conflicted by exiting with
+ * exit code 1, and we allow the user to mark the conflict
+ * resolved in this case. */
+ performed_edit = TRUE;
+ knows_something = TRUE;
+ }
}
else if (strcmp(opt->code, "l") == 0 || strcmp(opt->code, ":-l") == 0)
{
@@ -893,7 +927,29 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
if (desc->base_abspath && desc->their_abspath &&
desc->my_abspath && desc->merged_file)
{
- SVN_ERR(launch_resolver(&performed_edit, desc, b, iterpool));
+ svn_error_t *err;
+ char buf[1024];
+ const char *message;
+
+ err = svn_cl__merge_file_externally(desc->base_abspath,
+ desc->their_abspath,
+ desc->my_abspath,
+ desc->merged_file,
+ desc->local_abspath,
+ b->config, NULL, iterpool);
+ if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL ||
+ err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
+ {
+ message = svn_err_best_message(err, buf, sizeof(buf));
+ SVN_ERR(svn_cmdline_fprintf(stderr, iterpool, "%s\n",
+ message));
+ svn_error_clear(err);
+ }
+ else if (err)
+ return svn_error_trace(err);
+ else
+ performed_edit = TRUE;
+
if (performed_edit)
knows_something = TRUE;
}
@@ -901,7 +957,27 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
SVN_ERR(svn_cmdline_fprintf(stderr, iterpool,
_("Invalid option.\n\n")));
}
- else if (opt->choice != -1)
+ else if (strcmp(opt->code, "i") == 0)
+ {
+ svn_boolean_t remains_in_conflict = TRUE;
+
+ SVN_ERR(svn_cl__merge_file(&remains_in_conflict,
+ desc->base_abspath,
+ desc->their_abspath,
+ desc->my_abspath,
+ desc->merged_file,
+ desc->local_abspath,
+ b->path_prefix,
+ b->editor_cmd,
+ b->config,
+ b->pb->cancel_func,
+ b->pb->cancel_baton,
+ iterpool));
+
+ if (!remains_in_conflict)
+ knows_something = TRUE;
+ }
+ else if (opt->choice != svn_wc_conflict_choose_undefined)
{
if ((opt->choice == svn_wc_conflict_choose_mine_conflict
|| opt->choice == svn_wc_conflict_choose_theirs_conflict)
@@ -918,7 +994,7 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
the file if they've edited it, or at least looked at
the diff. */
if (opt->choice == svn_wc_conflict_choose_merged
- && ! knows_something)
+ && ! knows_something && diff_allowed)
{
SVN_ERR(svn_cmdline_fprintf(
stderr, iterpool,
@@ -1008,7 +1084,9 @@ handle_prop_conflict(svn_wc_conflict_result_t *result,
}
else if (strcmp(opt->code, "dc") == 0)
{
- SVN_ERR(show_prop_conflict(desc, merged_file_path, scratch_pool));
+ SVN_ERR(show_prop_conflict(desc, merged_file_path,
+ b->pb->cancel_func, b->pb->cancel_baton,
+ scratch_pool));
}
else if (strcmp(opt->code, "e") == 0)
{
@@ -1030,7 +1108,7 @@ handle_prop_conflict(svn_wc_conflict_result_t *result,
result->choice = svn_wc_conflict_choose_merged;
break;
}
- else if (opt->choice != -1)
+ else if (opt->choice != svn_wc_conflict_choose_undefined)
{
result->choice = opt->choice;
break;
@@ -1072,25 +1150,23 @@ handle_tree_conflict(svn_wc_conflict_result_t *result,
svn_pool_clear(iterpool);
+ tc_opts = tree_conflict_options;
+
if (desc->operation == svn_wc_operation_update ||
desc->operation == svn_wc_operation_switch)
{
if (desc->reason == svn_wc_conflict_reason_moved_away)
{
- if (desc->action == svn_wc_conflict_action_edit)
- tc_opts = tree_conflict_options_update_edit_moved_away;
- else
- tc_opts = tree_conflict_options_update_moved_away;
+ tc_opts = tree_conflict_options_update_moved_away;
+ }
+ else if (desc->reason == svn_wc_conflict_reason_deleted ||
+ desc->reason == svn_wc_conflict_reason_replaced)
+ {
+ if (desc->action == svn_wc_conflict_action_edit &&
+ desc->node_kind == svn_node_dir)
+ tc_opts = tree_conflict_options_update_edit_deleted_dir;
}
- else if (desc->reason == svn_wc_conflict_reason_deleted)
- tc_opts = tree_conflict_options_update_deleted;
- else if (desc->reason == svn_wc_conflict_reason_replaced)
- tc_opts = tree_conflict_options_update_replaced;
- else
- tc_opts = tree_conflict_options;
}
- else
- tc_opts = tree_conflict_options;
SVN_ERR(prompt_user(&opt, tc_opts, NULL, b->pb, iterpool));
if (! opt)
@@ -1103,7 +1179,7 @@ handle_tree_conflict(svn_wc_conflict_result_t *result,
b->quit = TRUE;
break;
}
- else if (opt->choice != -1)
+ else if (opt->choice != svn_wc_conflict_choose_undefined)
{
result->choice = opt->choice;
break;
@@ -1172,21 +1248,15 @@ conflict_func_interactive(svn_wc_conflict_result_t **result,
err = svn_cmdline__edit_file_externally(desc->merged_file,
b->editor_cmd, b->config,
scratch_pool);
- if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_EDITOR))
- {
- SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s\n",
- err->message ? err->message :
- _("No editor found;"
- " leaving all conflicts.")));
- svn_error_clear(err);
- b->external_failed = TRUE;
- }
- else if (err && (err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
+ if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_EDITOR ||
+ err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
{
+ char buf[1024];
+ const char *message;
+
+ message = svn_err_best_message(err, buf, sizeof(buf));
SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s\n",
- err->message ? err->message :
- _("Error running editor;"
- " leaving all conflicts.")));
+ message));
svn_error_clear(err);
b->external_failed = TRUE;
}
@@ -1217,21 +1287,15 @@ conflict_func_interactive(svn_wc_conflict_result_t **result,
b->config,
&remains_in_conflict,
scratch_pool);
- if (err && err->apr_err == SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL)
- {
- SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s\n",
- err->message ? err->message :
- _("No merge tool found;"
- " leaving all conflicts.")));
- b->external_failed = TRUE;
- return svn_error_trace(err);
- }
- else if (err && err->apr_err == SVN_ERR_EXTERNAL_PROGRAM)
+ if (err && (err->apr_err == SVN_ERR_CL_NO_EXTERNAL_MERGE_TOOL ||
+ err->apr_err == SVN_ERR_EXTERNAL_PROGRAM))
{
+ char buf[1024];
+ const char *message;
+
+ message = svn_err_best_message(err, buf, sizeof(buf));
SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool, "%s\n",
- err->message ? err->message :
- _("Error running merge tool;"
- " leaving all conflicts.")));
+ message));
b->external_failed = TRUE;
return svn_error_trace(err);
}
@@ -1248,6 +1312,13 @@ conflict_func_interactive(svn_wc_conflict_result_t **result,
break;
}
+ /* Print a summary of conflicts before starting interactive resolution */
+ if (! b->printed_summary)
+ {
+ SVN_ERR(svn_cl__print_conflict_stats(b->conflict_stats, scratch_pool));
+ b->printed_summary = TRUE;
+ }
+
/* We're in interactive mode and either the user gave no --accept
option or the option did not apply; let's prompt. */
@@ -1293,7 +1364,7 @@ svn_cl__conflict_func_interactive(svn_wc_conflict_result_t **result,
b->path_prefix, desc->local_abspath, scratch_pool);
svn_cl__conflict_stats_resolved(b->conflict_stats, local_path,
- desc->kind);
+ desc->kind);
}
return SVN_NO_ERROR;
}
diff --git a/subversion/svn/copy-cmd.c b/subversion/svn/copy-cmd.c
index e6fbd4b..5b50713 100644
--- a/subversion/svn/copy-cmd.c
+++ b/subversion/svn/copy-cmd.c
@@ -150,8 +150,7 @@ svn_cl__copy(apr_getopt_t *os,
}
else
{
- /* URL -> URL, meaning that no notification is needed. */
- ctx->notify_func2 = NULL;
+ /* URL -> URL */
}
if (! dst_is_url)
@@ -168,8 +167,11 @@ svn_cl__copy(apr_getopt_t *os,
SVN_ERR(svn_cl__make_log_msg_baton(&(ctx->log_msg_baton3), opt_state,
NULL, ctx->config, pool));
- err = svn_client_copy6(sources, dst_path, TRUE,
+ err = svn_client_copy7(sources, dst_path, TRUE,
opt_state->parents, opt_state->ignore_externals,
+ FALSE /* metadata_only */,
+ opt_state->pin_externals,
+ NULL, /* pin all externals */
opt_state->revprop_table,
(opt_state->quiet ? NULL : svn_cl__print_commit_info),
NULL,
diff --git a/subversion/svn/diff-cmd.c b/subversion/svn/diff-cmd.c
index 2cbd202..71853c7 100644
--- a/subversion/svn/diff-cmd.c
+++ b/subversion/svn/diff-cmd.c
@@ -37,6 +37,7 @@
#include "svn_types.h"
#include "svn_cmdline.h"
#include "svn_xml.h"
+#include "svn_hash.h"
#include "cl.h"
#include "svn_private_config.h"
@@ -81,6 +82,7 @@ kind_to_word(svn_client_diff_summarize_kind_t kind)
struct summarize_baton_t
{
const char *anchor;
+ svn_boolean_t ignore_properties;
};
/* Print summary information about a given change as XML, implements the
@@ -97,6 +99,11 @@ summarize_xml(const svn_client_diff_summarize_t *summary,
* baton, and appending the target's relative path. */
const char *path = b->anchor;
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
+ const char *prop_change;
+
+ if (b->ignore_properties &&
+ summary->summarize_kind == svn_client_diff_summarize_kind_normal)
+ return SVN_NO_ERROR;
/* Tack on the target path, so we can differentiate between different parts
* of the output when we're given multiple targets. */
@@ -113,11 +120,15 @@ summarize_xml(const svn_client_diff_summarize_t *summary,
path = svn_dirent_local_style(path, pool);
}
+ prop_change = summary->prop_changed ? "modified" : "none";
+ if (b->ignore_properties)
+ prop_change = "none";
+
svn_xml_make_open_tag(&sb, pool, svn_xml_protect_pcdata, "path",
"kind", svn_cl__node_kind_str_xml(summary->node_kind),
"item", kind_to_word(summary->summarize_kind),
- "props", summary->prop_changed ? "modified" : "none",
- NULL);
+ "props", prop_change,
+ SVN_VA_NULL);
svn_xml_escape_cdata_cstring(&sb, path, pool);
svn_xml_make_close_tag(&sb, pool, "path");
@@ -134,6 +145,11 @@ summarize_regular(const svn_client_diff_summarize_t *summary,
{
struct summarize_baton_t *b = baton;
const char *path = b->anchor;
+ char prop_change;
+
+ if (b->ignore_properties &&
+ summary->summarize_kind == svn_client_diff_summarize_kind_normal)
+ return SVN_NO_ERROR;
/* Tack on the target path, so we can differentiate between different parts
* of the output when we're given multiple targets. */
@@ -154,11 +170,13 @@ summarize_regular(const svn_client_diff_summarize_t *summary,
* thus the blank spaces where information that is not relevant to
* a diff summary would go. */
- SVN_ERR(svn_cmdline_printf(pool,
- "%c%c %s\n",
+ prop_change = summary->prop_changed ? 'M' : ' ';
+ if (b->ignore_properties)
+ prop_change = ' ';
+
+ SVN_ERR(svn_cmdline_printf(pool, "%c%c %s\n",
kind_to_char(summary->summarize_kind),
- summary->prop_changed ? 'M' : ' ',
- path));
+ prop_change, path));
return svn_cmdline_fflush(stdout);
}
@@ -179,6 +197,7 @@ svn_cl__diff(apr_getopt_t *os,
const char *old_target, *new_target;
apr_pool_t *iterpool;
svn_boolean_t pegged_diff = FALSE;
+ svn_boolean_t ignore_content_type;
svn_boolean_t show_copies_as_adds =
opt_state->diff.patch_compatible || opt_state->diff.show_copies_as_adds;
svn_boolean_t ignore_properties =
@@ -211,7 +230,7 @@ svn_cl__diff(apr_getopt_t *os,
SVN_ERR(svn_cl__xml_print_header("diff", pool));
sb = svn_stringbuf_create_empty(pool);
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "paths", NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "paths", SVN_VA_NULL);
SVN_ERR(svn_cl__error_checked_fputs(sb->data, stdout));
}
@@ -337,6 +356,25 @@ svn_cl__diff(apr_getopt_t *os,
}
+ /* Should we ignore the content-type when deciding what to diff? */
+ if (opt_state->force)
+ {
+ ignore_content_type = TRUE;
+ }
+ else if (ctx->config)
+ {
+ SVN_ERR(svn_config_get_bool(svn_hash_gets(ctx->config,
+ SVN_CONFIG_CATEGORY_CONFIG),
+ &ignore_content_type,
+ SVN_CONFIG_SECTION_MISCELLANY,
+ SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE,
+ FALSE));
+ }
+ else
+ {
+ ignore_content_type = FALSE;
+ }
+
svn_opt_push_implicit_dot_target(targets, pool);
iterpool = svn_pool_create(pool);
@@ -374,6 +412,7 @@ svn_cl__diff(apr_getopt_t *os,
if (opt_state->diff.summarize)
{
summarize_baton.anchor = target1;
+ summarize_baton.ignore_properties = ignore_properties;
SVN_ERR(svn_client_diff_summarize2(
target1,
@@ -399,7 +438,7 @@ svn_cl__diff(apr_getopt_t *os,
opt_state->diff.no_diff_added,
opt_state->diff.no_diff_deleted,
show_copies_as_adds,
- opt_state->force,
+ ignore_content_type,
ignore_properties,
opt_state->diff.properties_only,
opt_state->diff.use_git_diff_format,
@@ -426,6 +465,7 @@ svn_cl__diff(apr_getopt_t *os,
if (opt_state->diff.summarize)
{
summarize_baton.anchor = truepath;
+ summarize_baton.ignore_properties = ignore_properties;
SVN_ERR(svn_client_diff_summarize_peg2(
truepath,
&peg_revision,
@@ -450,7 +490,7 @@ svn_cl__diff(apr_getopt_t *os,
opt_state->diff.no_diff_added,
opt_state->diff.no_diff_deleted,
show_copies_as_adds,
- opt_state->force,
+ ignore_content_type,
ignore_properties,
opt_state->diff.properties_only,
opt_state->diff.use_git_diff_format,
diff --git a/subversion/svn/export-cmd.c b/subversion/svn/export-cmd.c
index 75b6723..45554fa 100644
--- a/subversion/svn/export-cmd.c
+++ b/subversion/svn/export-cmd.c
@@ -85,7 +85,15 @@ svn_cl__export(apr_getopt_t *os,
if (strcmp("", to) != 0)
/* svn_cl__eat_peg_revisions() but only on one target */
- SVN_ERR(svn_opt__split_arg_at_peg_revision(&to, NULL, to, pool));
+ {
+ const char *peg;
+
+ SVN_ERR(svn_opt__split_arg_at_peg_revision(&to, &peg, to, pool));
+ if (peg[0] && peg[1])
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("'%s': a peg revision is not allowed here"),
+ APR_ARRAY_IDX(targets, 1, const char *));
+ }
}
SVN_ERR(svn_cl__check_target_is_local_path(to));
diff --git a/subversion/svn/file-merge.c b/subversion/svn/file-merge.c
index c64f577..14017db 100644
--- a/subversion/svn/file-merge.c
+++ b/subversion/svn/file-merge.c
@@ -51,6 +51,10 @@
#include <fcntl.h>
#include <stdlib.h>
+#if defined(HAVE_TERMIOS_H)
+#include <termios.h>
+#endif
+
/* Baton for functions in this file which implement svn_diff_output_fns_t. */
struct file_merge_baton {
/* The files being merged. */
@@ -75,12 +79,12 @@ struct file_merge_baton {
/* The client configuration hash. */
apr_hash_t *config;
- /* Wether the merge should be aborted. */
+ /* Whether the merge should be aborted. */
svn_boolean_t abort_merge;
/* Pool for temporary allocations. */
apr_pool_t *scratch_pool;
-} file_merge_baton;
+};
/* Copy LEN lines from SOURCE_FILE to the MERGED_FILE, starting at
* line START. The CURRENT_LINE is the current line in the source file.
@@ -490,7 +494,7 @@ edit_chunk(apr_array_header_t **merged_chunk,
return svn_error_create(SVN_ERR_IO_WRITE_ERROR, NULL,
_("Could not write data to temporary file"));
}
- SVN_ERR(svn_io_file_flush_to_disk(temp_file, scratch_pool));
+ SVN_ERR(svn_io_file_flush(temp_file, scratch_pool));
err = svn_cmdline__edit_file_externally(temp_file_name, editor_cmd,
config, scratch_pool);
@@ -853,7 +857,8 @@ static svn_diff_output_fns_t file_merge_diff_output_fns = {
};
svn_error_t *
-svn_cl__merge_file(const char *base_path,
+svn_cl__merge_file(svn_boolean_t *remains_in_conflict,
+ const char *base_path,
const char *their_path,
const char *my_path,
const char *merged_path,
@@ -861,7 +866,8 @@ svn_cl__merge_file(const char *base_path,
const char *path_prefix,
const char *editor_cmd,
apr_hash_t *config,
- svn_boolean_t *remains_in_conflict,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_diff_t *diff;
@@ -918,7 +924,8 @@ svn_cl__merge_file(const char *base_path,
fmb.abort_merge = FALSE;
fmb.scratch_pool = scratch_pool;
- SVN_ERR(svn_diff_output(diff, &fmb, &file_merge_diff_output_fns));
+ SVN_ERR(svn_diff_output2(diff, &fmb, &file_merge_diff_output_fns,
+ cancel_func, cancel_baton));
SVN_ERR(svn_io_file_close(original_file, scratch_pool));
SVN_ERR(svn_io_file_close(modified_file, scratch_pool));
diff --git a/subversion/svn/help-cmd.c b/subversion/svn/help-cmd.c
index 93fecc3..b095d30 100644
--- a/subversion/svn/help-cmd.c
+++ b/subversion/svn/help-cmd.c
@@ -30,8 +30,8 @@
#include "svn_hash.h"
#include "svn_string.h"
#include "svn_config.h"
+#include "svn_dirent_uri.h"
#include "svn_error.h"
-#include "svn_version.h"
#include "cl.h"
#include "svn_private_config.h"
@@ -47,11 +47,11 @@ svn_cl__help(apr_getopt_t *os,
{
svn_cl__opt_state_t *opt_state = NULL;
svn_stringbuf_t *version_footer = NULL;
+ const char *config_path;
- /* xgettext: the %s is for SVN_VER_NUMBER. */
- char help_header_template[] =
+ char help_header[] =
N_("usage: svn <subcommand> [options] [args]\n"
- "Subversion command-line client, version %s.\n"
+ "Subversion command-line client.\n"
"Type 'svn help <subcommand>' for help on a specific subcommand.\n"
"Type 'svn --version' to see the program version and RA modules\n"
" or 'svn --version --quiet' to see just the version number.\n"
@@ -66,9 +66,6 @@ svn_cl__help(apr_getopt_t *os,
N_("Subversion is a tool for version control.\n"
"For additional information, see http://subversion.apache.org/\n");
- char *help_header =
- apr_psprintf(pool, _(help_header_template), SVN_VER_NUMBER);
-
const char *ra_desc_start
= _("The following repository access (RA) modules are available:\n\n");
@@ -138,6 +135,46 @@ svn_cl__help(apr_getopt_t *os,
version_footer = svn_stringbuf_create(ra_desc_start, pool);
SVN_ERR(svn_ra_print_modules(version_footer, pool));
+ /*
+ * Show auth creds storage providers.
+ */
+ SVN_ERR(svn_config_get_user_config_path(&config_path,
+ opt_state ? opt_state->config_dir
+ : NULL,
+ NULL,
+ pool));
+ svn_stringbuf_appendcstr(version_footer,
+ _("\nThe following authentication credential caches are available:\n\n"));
+
+ /*### There is no API to query available providers at run time. */
+#if (defined(WIN32) && !defined(__MINGW32__))
+ version_footer =
+ svn_stringbuf_create(apr_psprintf(pool, _("%s* Wincrypt cache in %s\n"),
+ version_footer->data,
+ svn_dirent_local_style(config_path,
+ pool)),
+ pool);
+#elif !defined(SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE)
+ version_footer =
+ svn_stringbuf_create(apr_psprintf(pool, _("%s* Plaintext cache in %s\n"),
+ version_footer->data,
+ svn_dirent_local_style(config_path,
+ pool)),
+ pool);
+#endif
+#ifdef SVN_HAVE_GNOME_KEYRING
+ svn_stringbuf_appendcstr(version_footer, "* Gnome Keyring\n");
+#endif
+#ifdef SVN_HAVE_GPG_AGENT
+ svn_stringbuf_appendcstr(version_footer, "* GPG-Agent\n");
+#endif
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
+ svn_stringbuf_appendcstr(version_footer, "* Mac OS X Keychain\n");
+#endif
+#ifdef SVN_HAVE_KWALLET
+ svn_stringbuf_appendcstr(version_footer, "* KWallet (KDE)\n");
+#endif
+
return svn_opt_print_help4(os,
"svn", /* ### erm, derive somehow? */
opt_state ? opt_state->version : FALSE,
diff --git a/subversion/svn/info-cmd.c b/subversion/svn/info-cmd.c
index 56833f6..fafc398 100644
--- a/subversion/svn/info-cmd.c
+++ b/subversion/svn/info-cmd.c
@@ -76,6 +76,168 @@ schedule_str(svn_wc_schedule_t schedule)
}
}
+/* Return a relative URL from information in INFO using POOL for
+ temporary allocation. */
+static const char*
+relative_url(const svn_client_info2_t *info, apr_pool_t *pool)
+{
+ return apr_pstrcat(pool, "^/",
+ svn_path_uri_encode(
+ svn_uri_skip_ancestor(info->repos_root_URL,
+ info->URL, pool),
+ pool), SVN_VA_NULL);
+}
+
+
+/* The kinds of items for print_info_item(). */
+typedef enum
+{
+ /* Entry kind */
+ info_item_kind,
+
+ /* Repository location. */
+ info_item_url,
+ info_item_relative_url,
+ info_item_repos_root_url,
+ info_item_repos_uuid,
+
+ /* Working copy revision or repository HEAD revision */
+ info_item_revision,
+
+ /* Commit details. */
+ info_item_last_changed_rev,
+ info_item_last_changed_date,
+ info_item_last_changed_author,
+
+ /* Working copy information */
+ info_item_wc_root
+} info_item_t;
+
+/* Mapping between option keywords and info_item_t. */
+typedef struct info_item_map_t
+{
+ const svn_string_t keyword;
+ const info_item_t print_what;
+} info_item_map_t;
+
+#define MAKE_STRING(x) { x, sizeof(x) - 1 }
+static const info_item_map_t info_item_map[] =
+ {
+ { MAKE_STRING("kind"), info_item_kind },
+ { MAKE_STRING("url"), info_item_url },
+ { MAKE_STRING("relative-url"), info_item_relative_url },
+ { MAKE_STRING("repos-root-url"), info_item_repos_root_url },
+ { MAKE_STRING("repos-uuid"), info_item_repos_uuid },
+ { MAKE_STRING("revision"), info_item_revision },
+ { MAKE_STRING("last-changed-revision"),
+ info_item_last_changed_rev },
+ { MAKE_STRING("last-changed-date"), info_item_last_changed_date },
+ { MAKE_STRING("last-changed-author"), info_item_last_changed_author },
+ { MAKE_STRING("wc-root"), info_item_wc_root }
+ };
+#undef MAKE_STRING
+
+static const apr_size_t info_item_map_len =
+ (sizeof(info_item_map) / sizeof(info_item_map[0]));
+
+
+/* The baton type used by the info receiver functions. */
+typedef struct print_info_baton_t
+{
+ /* The path prefix that output paths should be normalized to. */
+ const char *path_prefix;
+
+ /*
+ * The following fields are used by print_info_item().
+ */
+
+ /* Which item to print. */
+ info_item_t print_what;
+
+ /* Do we expect to show info for multiple targets? */
+ svn_boolean_t multiple_targets;
+
+ /* TRUE iff the current is a local path. */
+ svn_boolean_t target_is_path;
+
+ /* Did we already print a line of output? */
+ svn_boolean_t start_new_line;
+} print_info_baton_t;
+
+
+/* Find the appropriate info_item_t for KEYWORD and initialize
+ * RECEIVER_BATON for print_info_item(). Use SCRATCH_POOL for
+ * temporary allocation.
+ */
+static svn_error_t *
+find_print_what(const char *keyword,
+ print_info_baton_t *receiver_baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_cl__simcheck_t **keywords = apr_palloc(
+ scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t*));
+ svn_cl__simcheck_t *kwbuf = apr_palloc(
+ scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t));
+ apr_size_t i;
+
+ for (i = 0; i < info_item_map_len; ++i)
+ {
+ keywords[i] = &kwbuf[i];
+ kwbuf[i].token.data = info_item_map[i].keyword.data;
+ kwbuf[i].token.len = info_item_map[i].keyword.len;
+ kwbuf[i].data = &info_item_map[i];
+ }
+
+ switch (svn_cl__similarity_check(keyword, keywords,
+ info_item_map_len, scratch_pool))
+ {
+ const info_item_map_t *kw0;
+ const info_item_map_t *kw1;
+ const info_item_map_t *kw2;
+
+ case 0: /* Exact match. */
+ kw0 = keywords[0]->data;
+ receiver_baton->print_what = kw0->print_what;
+ return SVN_NO_ERROR;
+
+ case 1:
+ /* The best alternative isn't good enough */
+ return svn_error_createf(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid value for --show-item"),
+ keyword);
+
+ case 2:
+ /* There is only one good candidate */
+ kw0 = keywords[0]->data;
+ return svn_error_createf(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid value for --show-item;"
+ " did you mean '%s'?"),
+ keyword, kw0->keyword.data);
+
+ case 3:
+ /* Suggest a list of the most likely candidates */
+ kw0 = keywords[0]->data;
+ kw1 = keywords[1]->data;
+ return svn_error_createf(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid value for --show-item;"
+ " did you mean '%s' or '%s'?"),
+ keyword, kw0->keyword.data, kw1->keyword.data);
+
+ default:
+ /* Never suggest more than three candidates */
+ kw0 = keywords[0]->data;
+ kw1 = keywords[1]->data;
+ kw2 = keywords[2]->data;
+ return svn_error_createf(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid value for --show-item;"
+ " did you mean '%s', '%s' or '%s'?"),
+ keyword, kw0->keyword.data, kw1->keyword.data, kw2->keyword.data);
+ }
+}
/* A callback of type svn_client_info_receiver2_t.
Prints svn info in xml mode to standard out */
@@ -87,7 +249,7 @@ print_info_xml(void *baton,
{
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
const char *rev_str;
- const char *path_prefix = baton;
+ print_info_baton_t *const receiver_baton = baton;
if (SVN_IS_VALID_REVNUM(info->rev))
rev_str = apr_psprintf(pool, "%ld", info->rev);
@@ -97,10 +259,10 @@ print_info_xml(void *baton,
/* "<entry ...>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "entry",
"path", svn_cl__local_style_skip_ancestor(
- path_prefix, target, pool),
+ receiver_baton->path_prefix, target, pool),
"kind", svn_cl__node_kind_str_xml(info->kind),
"revision", rev_str,
- NULL);
+ SVN_VA_NULL);
/* "<url> xx </url>" */
svn_cl__xml_tagged_cdata(&sb, pool, "url", info->URL);
@@ -109,19 +271,14 @@ print_info_xml(void *baton,
{
/* "<relative-url> xx </relative-url>" */
svn_cl__xml_tagged_cdata(&sb, pool, "relative-url",
- apr_pstrcat(pool, "^/",
- svn_path_uri_encode(
- svn_uri_skip_ancestor(
- info->repos_root_URL,
- info->URL, pool),
- pool),
- NULL));
+ relative_url(info, pool));
}
if (info->repos_root_URL || info->repos_UUID)
{
/* "<repository>" */
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "repository", NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "repository",
+ SVN_VA_NULL);
/* "<root> xx </root>" */
svn_cl__xml_tagged_cdata(&sb, pool, "root", info->repos_root_URL);
@@ -136,7 +293,8 @@ print_info_xml(void *baton,
if (info->wc_info)
{
/* "<wc-info>" */
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "wc-info", NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "wc-info",
+ SVN_VA_NULL);
/* "<wcroot-abspath> xx </wcroot-abspath>" */
if (info->wc_info->wcroot_abspath)
@@ -261,11 +419,11 @@ print_info(void *baton,
const svn_client_info2_t *info,
apr_pool_t *pool)
{
- const char *path_prefix = baton;
+ print_info_baton_t *const receiver_baton = baton;
SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"),
svn_cl__local_style_skip_ancestor(
- path_prefix, target, pool)));
+ receiver_baton->path_prefix, target, pool)));
/* ### remove this someday: it's only here for cmdline output
compatibility with svn 1.1 and older. */
@@ -283,11 +441,8 @@ print_info(void *baton,
SVN_ERR(svn_cmdline_printf(pool, _("URL: %s\n"), info->URL));
if (info->URL && info->repos_root_URL)
- SVN_ERR(svn_cmdline_printf(pool, _("Relative URL: ^/%s\n"),
- svn_path_uri_encode(
- svn_uri_skip_ancestor(info->repos_root_URL,
- info->URL, pool),
- pool)));
+ SVN_ERR(svn_cmdline_printf(pool, _("Relative URL: %s\n"),
+ relative_url(info, pool)));
if (info->repos_root_URL)
SVN_ERR(svn_cmdline_printf(pool, _("Repository Root: %s\n"),
@@ -387,30 +542,18 @@ print_info(void *baton,
SVN_ERR(svn_cmdline_printf(pool, _("Copied From Rev: %ld\n"),
info->wc_info->copyfrom_rev));
if (info->wc_info->moved_from_abspath)
- {
- const char *relpath;
-
- relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
- info->wc_info->moved_from_abspath);
- if (relpath && relpath[0] != '\0')
- SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"), relpath));
- else
- SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"),
- info->wc_info->moved_from_abspath));
- }
+ SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"),
+ svn_cl__local_style_skip_ancestor(
+ receiver_baton->path_prefix,
+ info->wc_info->moved_from_abspath,
+ pool)));
if (info->wc_info->moved_to_abspath)
- {
- const char *relpath;
-
- relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath,
- info->wc_info->moved_to_abspath);
- if (relpath && relpath[0] != '\0')
- SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"), relpath));
- else
- SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"),
- info->wc_info->moved_to_abspath));
- }
+ SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"),
+ svn_cl__local_style_skip_ancestor(
+ receiver_baton->path_prefix,
+ info->wc_info->moved_to_abspath,
+ pool)));
}
if (info->last_changed_author)
@@ -439,6 +582,7 @@ print_info(void *baton,
if (info->wc_info->conflicts)
{
svn_boolean_t printed_prop_conflict_file = FALSE;
+ svn_boolean_t printed_tc = FALSE;
int i;
for (i = 0; i < info->wc_info->conflicts->nelts; i++)
@@ -455,21 +599,24 @@ print_info(void *baton,
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Previous Base File: %s\n"),
svn_cl__local_style_skip_ancestor(
- path_prefix, conflict->base_abspath,
+ receiver_baton->path_prefix,
+ conflict->base_abspath,
pool)));
if (conflict->my_abspath)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Previous Working File: %s\n"),
svn_cl__local_style_skip_ancestor(
- path_prefix, conflict->my_abspath,
+ receiver_baton->path_prefix,
+ conflict->my_abspath,
pool)));
if (conflict->their_abspath)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Current Base File: %s\n"),
svn_cl__local_style_skip_ancestor(
- path_prefix, conflict->their_abspath,
+ receiver_baton->path_prefix,
+ conflict->their_abspath,
pool)));
break;
@@ -477,12 +624,15 @@ print_info(void *baton,
if (! printed_prop_conflict_file)
SVN_ERR(svn_cmdline_printf(pool,
_("Conflict Properties File: %s\n"),
- svn_dirent_local_style(conflict->their_abspath,
- pool)));
+ svn_cl__local_style_skip_ancestor(
+ receiver_baton->path_prefix,
+ conflict->prop_reject_abspath,
+ pool)));
printed_prop_conflict_file = TRUE;
break;
case svn_wc_conflict_kind_tree:
+ printed_tc = TRUE;
SVN_ERR(
svn_cl__get_human_readable_tree_conflict_description(
&desc, conflict, pool));
@@ -504,6 +654,19 @@ print_info(void *baton,
APR_ARRAY_IDX(info->wc_info->conflicts, 0,
const svn_wc_conflict_description2_t *);
+ if (!printed_tc)
+ {
+ const char *desc;
+
+ SVN_ERR(svn_cl__get_human_readable_action_description(&desc,
+ svn_wc_conflict_action_edit,
+ conflict->operation,
+ conflict->node_kind, pool));
+
+ SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n",
+ _("Conflict Details"), desc));
+ }
+
src_left_version =
svn_cl__node_description(conflict->src_left_version,
info->repos_root_URL, pool);
@@ -570,6 +733,123 @@ print_info(void *baton,
}
+/* Helper for print_info_item(): Print the value TEXT for TARGET_PATH,
+ either of which may be NULL. Use POOL for temporary allocation. */
+static svn_error_t *
+print_info_item_string(const char *text, const char *target_path,
+ apr_pool_t *pool)
+{
+ if (text)
+ {
+ if (target_path)
+ SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", text, target_path));
+ else
+ SVN_ERR(svn_cmdline_fputs(text, stdout, pool));
+ }
+ else if (target_path)
+ SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path));
+
+ return SVN_NO_ERROR;
+}
+
+/* Helper for print_info_item(): Print the revision number REV, which
+ may be SVN_INVALID_REVNUM, for TARGET_PATH, which may be NULL. Use
+ POOL for temporary allocation. */
+static svn_error_t *
+print_info_item_revision(svn_revnum_t rev, const char *target_path,
+ apr_pool_t *pool)
+{
+ if (SVN_IS_VALID_REVNUM(rev))
+ {
+ if (target_path)
+ SVN_ERR(svn_cmdline_printf(pool, "%-10ld %s", rev, target_path));
+ else
+ SVN_ERR(svn_cmdline_printf(pool, "%ld", rev));
+ }
+ else if (target_path)
+ SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path));
+
+ return SVN_NO_ERROR;
+}
+
+/* A callback of type svn_client_info_receiver2_t. */
+static svn_error_t *
+print_info_item(void *baton,
+ const char *target,
+ const svn_client_info2_t *info,
+ apr_pool_t *pool)
+{
+ print_info_baton_t *const receiver_baton = baton;
+ const char *const target_path =
+ (!receiver_baton->multiple_targets ? NULL
+ : (!receiver_baton->target_is_path ? info->URL
+ : svn_cl__local_style_skip_ancestor(
+ receiver_baton->path_prefix, target, pool)));
+
+ if (receiver_baton->start_new_line)
+ SVN_ERR(svn_cmdline_fputs("\n", stdout, pool));
+
+ switch (receiver_baton->print_what)
+ {
+ case info_item_kind:
+ SVN_ERR(print_info_item_string(svn_node_kind_to_word(info->kind),
+ target_path, pool));
+ break;
+
+ case info_item_url:
+ SVN_ERR(print_info_item_string(info->URL, target_path, pool));
+ break;
+
+ case info_item_relative_url:
+ SVN_ERR(print_info_item_string(relative_url(info, pool),
+ target_path, pool));
+ break;
+
+ case info_item_repos_root_url:
+ SVN_ERR(print_info_item_string(info->repos_root_URL, target_path, pool));
+ break;
+
+ case info_item_repos_uuid:
+ SVN_ERR(print_info_item_string(info->repos_UUID, target_path, pool));
+ break;
+
+ case info_item_revision:
+ SVN_ERR(print_info_item_revision(info->rev, target_path, pool));
+ break;
+
+ case info_item_last_changed_rev:
+ SVN_ERR(print_info_item_revision(info->last_changed_rev,
+ target_path, pool));
+ break;
+
+ case info_item_last_changed_date:
+ SVN_ERR(print_info_item_string(
+ (!info->last_changed_date ? NULL
+ : svn_time_to_cstring(info->last_changed_date, pool)),
+ target_path, pool));
+ break;
+
+ case info_item_last_changed_author:
+ SVN_ERR(print_info_item_string(info->last_changed_author,
+ target_path, pool));
+ break;
+
+ case info_item_wc_root:
+ SVN_ERR(print_info_item_string(
+ (info->wc_info && info->wc_info->wcroot_abspath
+ ? info->wc_info->wcroot_abspath : NULL),
+ target_path, pool));
+ break;
+
+ default:
+ SVN_ERR_MALFUNCTION();
+ }
+
+ receiver_baton->start_new_line = TRUE;
+ return SVN_NO_ERROR;
+}
+
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__info(apr_getopt_t *os,
@@ -585,7 +865,7 @@ svn_cl__info(apr_getopt_t *os,
svn_boolean_t seen_nonexistent_target = FALSE;
svn_opt_revision_t peg_revision;
svn_client_info_receiver2_t receiver;
- const char *path_prefix;
+ print_info_baton_t receiver_baton = { 0 };
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -598,26 +878,59 @@ svn_cl__info(apr_getopt_t *os,
{
receiver = print_info_xml;
+ if (opt_state->show_item)
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--show-item is not valid in --xml mode"));
+ if (opt_state->no_newline)
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--no-newline is not valid in --xml mode"));
+
/* If output is not incremental, output the XML header and wrap
everything in a top-level element. This makes the output in
its entirety a well-formed XML document. */
if (! opt_state->incremental)
SVN_ERR(svn_cl__xml_print_header("info", pool));
}
+ else if (opt_state->show_item)
+ {
+ receiver = print_info_item;
+
+ if (opt_state->incremental)
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--incremental is only valid in --xml mode"));
+
+ receiver_baton.multiple_targets = (opt_state->depth > svn_depth_empty
+ || targets->nelts > 1);
+ if (receiver_baton.multiple_targets && opt_state->no_newline)
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--no-newline is only available for single-target,"
+ " non-recursive info operations"));
+
+ SVN_ERR(find_print_what(opt_state->show_item, &receiver_baton, pool));
+ receiver_baton.start_new_line = FALSE;
+ }
else
{
receiver = print_info;
if (opt_state->incremental)
- return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'incremental' option only valid in XML "
- "mode"));
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--incremental is only valid in --xml mode"));
+ if (opt_state->no_newline)
+ return svn_error_create(
+ SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--no-newline' is only valid with --show-item"));
}
if (opt_state->depth == svn_depth_unknown)
opt_state->depth = svn_depth_empty;
- SVN_ERR(svn_dirent_get_absolute(&path_prefix, "", pool));
+ SVN_ERR(svn_dirent_get_absolute(&receiver_baton.path_prefix, "", pool));
for (i = 0; i < targets->nelts; i++)
{
@@ -635,17 +948,22 @@ svn_cl__info(apr_getopt_t *os,
{
if (peg_revision.kind == svn_opt_revision_unspecified)
peg_revision.kind = svn_opt_revision_head;
+ receiver_baton.target_is_path = FALSE;
}
else
{
SVN_ERR(svn_dirent_get_absolute(&truepath, truepath, subpool));
+ receiver_baton.target_is_path = TRUE;
}
- err = svn_client_info3(truepath,
+ err = svn_client_info4(truepath,
&peg_revision, &(opt_state->start_revision),
- opt_state->depth, TRUE, TRUE,
+ opt_state->depth,
+ TRUE /* fetch_excluded */,
+ TRUE /* fetch_actual_only */,
+ opt_state->include_externals,
opt_state->changelists,
- receiver, (void *) path_prefix,
+ receiver, &receiver_baton,
ctx, subpool);
if (err)
@@ -672,6 +990,9 @@ svn_cl__info(apr_getopt_t *os,
if (opt_state->xml && (! opt_state->incremental))
SVN_ERR(svn_cl__xml_print_footer("info", pool));
+ else if (opt_state->show_item && !opt_state->no_newline
+ && receiver_baton.start_new_line)
+ SVN_ERR(svn_cmdline_fputs("\n", stdout, pool));
if (seen_nonexistent_target)
return svn_error_create(
diff --git a/subversion/svn/list-cmd.c b/subversion/svn/list-cmd.c
index efe4279..5ea140f 100644
--- a/subversion/svn/list-cmd.c
+++ b/subversion/svn/list-cmd.c
@@ -49,6 +49,12 @@ struct print_baton {
svn_boolean_t in_external;
};
+/* Field flags required for this function */
+static const apr_uint32_t print_dirent_fields = SVN_DIRENT_KIND;
+static const apr_uint32_t print_dirent_fields_verbose = (
+ SVN_DIRENT_KIND | SVN_DIRENT_SIZE | SVN_DIRENT_TIME |
+ SVN_DIRENT_CREATED_REV | SVN_DIRENT_LAST_AUTHOR);
+
/* This implements the svn_client_list_func2_t API, printing a single
directory entry in text format. */
static svn_error_t *
@@ -161,7 +167,10 @@ print_dirent(void *baton,
}
}
-
+/* Field flags required for this function */
+static const apr_uint32_t print_dirent_xml_fields = (
+ SVN_DIRENT_KIND | SVN_DIRENT_SIZE | SVN_DIRENT_TIME |
+ SVN_DIRENT_CREATED_REV | SVN_DIRENT_LAST_AUTHOR);
/* This implements the svn_client_list_func2_t API, printing a single dirent
in XML format. */
static svn_error_t *
@@ -213,7 +222,7 @@ print_dirent_xml(void *baton,
svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal, "external",
"parent_url", external_parent_url,
"target", external_target,
- NULL);
+ SVN_VA_NULL);
pb->last_external_parent_url = external_parent_url;
pb->last_external_target = external_target;
@@ -223,7 +232,7 @@ print_dirent_xml(void *baton,
svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal, "entry",
"kind", svn_cl__node_kind_str_xml(dirent->kind),
- NULL);
+ SVN_VA_NULL);
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "name", entryname);
@@ -237,7 +246,7 @@ print_dirent_xml(void *baton,
svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal, "commit",
"revision",
apr_psprintf(scratch_pool, "%ld", dirent->created_rev),
- NULL);
+ SVN_VA_NULL);
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "author", dirent->last_author);
if (dirent->time)
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "date",
@@ -246,7 +255,8 @@ print_dirent_xml(void *baton,
if (lock)
{
- svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal, "lock", NULL);
+ svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal, "lock",
+ SVN_VA_NULL);
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "token", lock->token);
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "owner", lock->owner);
svn_cl__xml_tagged_cdata(&sb, scratch_pool, "comment", lock->comment);
@@ -313,10 +323,12 @@ svn_cl__list(apr_getopt_t *os,
"mode"));
}
- if (opt_state->verbose || opt_state->xml)
- dirent_fields = SVN_DIRENT_ALL;
+ if (opt_state->xml)
+ dirent_fields = print_dirent_xml_fields;
+ else if (opt_state->verbose)
+ dirent_fields = print_dirent_fields_verbose;
else
- dirent_fields = SVN_DIRENT_KIND; /* the only thing we actually need... */
+ dirent_fields = print_dirent_fields;
pb.ctx = ctx;
pb.verbose = opt_state->verbose;
@@ -359,7 +371,7 @@ svn_cl__list(apr_getopt_t *os,
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "list",
"path", truepath[0] == '\0' ? "." : truepath,
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_cl__error_checked_fputs(sb->data, stdout));
}
@@ -419,6 +431,8 @@ svn_cl__list(apr_getopt_t *os,
if (seen_nonexistent_target)
err = svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
_("Could not list all targets because some targets don't exist"));
+ else
+ err = NULL;
return svn_error_compose_create(externals_err, err);
}
diff --git a/subversion/svn/lock-cmd.c b/subversion/svn/lock-cmd.c
index c2795da..e527ff8 100644
--- a/subversion/svn/lock-cmd.c
+++ b/subversion/svn/lock-cmd.c
@@ -80,6 +80,29 @@ get_comment(const char **comment, svn_client_ctx_t *ctx,
return SVN_NO_ERROR;
}
+/* Baton for notify_lock_handler */
+struct notify_lock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__lock */
+static void
+notify_lock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_lock_baton_t *nlb = baton;
+
+ if (notify->action == svn_wc_notify_failed_lock)
+ nlb->had_failure = TRUE;
+
+ if (nlb->inner_notify)
+ nlb->inner_notify(nlb->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__lock(apr_getopt_t *os,
@@ -90,6 +113,7 @@ svn_cl__lock(apr_getopt_t *os,
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
const char *comment;
+ struct notify_lock_baton_t nlb;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -106,5 +130,18 @@ svn_cl__lock(apr_getopt_t *os,
SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
- return svn_client_lock(targets, comment, opt_state->force, ctx, pool);
+ nlb.inner_notify = ctx->notify_func2;
+ nlb.inner_baton = ctx->notify_baton2;
+ nlb.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_lock_handler;
+ ctx->notify_baton2 = &nlb;
+
+ SVN_ERR(svn_client_lock(targets, comment, opt_state->force, ctx, pool));
+
+ if (nlb.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be obtained"));
+
+ return SVN_NO_ERROR;
}
diff --git a/subversion/svn/log-cmd.c b/subversion/svn/log-cmd.c
index af57cf4..44f8a4c 100644
--- a/subversion/svn/log-cmd.c
+++ b/subversion/svn/log-cmd.c
@@ -37,51 +37,16 @@
#include "svn_pools.h"
#include "private/svn_cmdline_private.h"
+#include "private/svn_sorts_private.h"
#include "cl.h"
+#include "cl-log.h"
#include "svn_private_config.h"
/*** Code. ***/
-/* Baton for log_entry_receiver() and log_entry_receiver_xml(). */
-struct log_receiver_baton
-{
- /* Client context. */
- svn_client_ctx_t *ctx;
-
- /* The target of the log operation. */
- const char *target_path_or_url;
- svn_opt_revision_t target_peg_revision;
-
- /* Don't print log message body nor its line count. */
- svn_boolean_t omit_log_message;
-
- /* Whether to show diffs in the log. (maps to --diff) */
- svn_boolean_t show_diff;
-
- /* Depth applied to diff output. */
- svn_depth_t depth;
-
- /* Diff arguments received from command line. */
- const char *diff_extensions;
-
- /* Stack which keeps track of merge revision nesting, using svn_revnum_t's */
- apr_array_header_t *merge_stack;
-
- /* Log message search patterns. Log entries will only be shown if the author,
- * the log message, or a changed path matches one of these patterns. */
- apr_array_header_t *search_patterns;
-
- /* Pool for persistent allocations. */
- apr_pool_t *pool;
-};
-
-
-/* The separator between log messages. */
-#define SEP_STRING \
- "------------------------------------------------------------------------\n"
/* Display a diff of the subtree TARGET_PATH_OR_URL@TARGET_PEG_REVISION as
@@ -182,14 +147,14 @@ match_search_pattern(const char *search_pattern,
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
svn_log_changed_path2_t *log_item;
if (apr_fnmatch(pattern, path, flags) == APR_SUCCESS)
return TRUE;
/* Match copy-from paths, too. */
- log_item = svn__apr_hash_index_val(hi);
+ log_item = apr_hash_this_val(hi);
if (log_item->copyfrom_path
&& SVN_IS_VALID_REVNUM(log_item->copyfrom_rev)
&& apr_fnmatch(pattern,
@@ -249,7 +214,7 @@ match_search_patterns(apr_array_header_t *search_patterns,
/* Implement `svn_log_entry_receiver_t', printing the logs in
* a human-readable and machine-parseable format.
*
- * BATON is of type `struct log_receiver_baton'.
+ * BATON is of type `svn_cl__log_receiver_baton'.
*
* First, print a header line. Then if CHANGED_PATHS is non-null,
* print all affected paths in a list headed "Changed paths:\n",
@@ -323,12 +288,12 @@ match_search_patterns(apr_array_header_t *search_patterns,
* ------------------------------------------------------------------------
*
*/
-static svn_error_t *
-log_entry_receiver(void *baton,
- svn_log_entry_t *log_entry,
- apr_pool_t *pool)
+svn_error_t *
+svn_cl__log_entry_receiver(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool)
{
- struct log_receiver_baton *lb = baton;
+ svn_cl__log_receiver_baton *lb = baton;
const char *author;
const char *date;
const char *message;
@@ -343,7 +308,9 @@ log_entry_receiver(void *baton,
if (! SVN_IS_VALID_REVNUM(log_entry->revision))
{
- apr_array_pop(lb->merge_stack);
+ if (lb->merge_stack)
+ apr_array_pop(lb->merge_stack);
+
return SVN_NO_ERROR;
}
@@ -367,13 +334,18 @@ log_entry_receiver(void *baton,
log_entry->changed_paths2, pool))
{
if (log_entry->has_children)
- APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ {
+ if (! lb->merge_stack)
+ lb->merge_stack = apr_array_make(lb->pool, 1, sizeof(svn_revnum_t));
+
+ APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ }
return SVN_NO_ERROR;
}
SVN_ERR(svn_cmdline_printf(pool,
- SEP_STRING "r%ld | %s | %s",
+ SVN_CL__LOG_SEP_STRING "r%ld | %s | %s",
log_entry->revision, author, date));
if (message != NULL)
@@ -392,6 +364,7 @@ log_entry_receiver(void *baton,
{
apr_array_header_t *sorted_paths;
int i;
+ apr_pool_t *iterpool;
/* Get an array of sorted hash keys. */
sorted_paths = svn_sort__hash(log_entry->changed_paths2,
@@ -399,6 +372,7 @@ log_entry_receiver(void *baton,
SVN_ERR(svn_cmdline_printf(pool,
_("Changed paths:\n")));
+ iterpool = svn_pool_create(pool);
for (i = 0; i < sorted_paths->nelts; i++)
{
svn_sort__item_t *item = &(APR_ARRAY_IDX(sorted_paths, i,
@@ -407,6 +381,8 @@ log_entry_receiver(void *baton,
svn_log_changed_path2_t *log_item = item->value;
const char *copy_data = "";
+ svn_pool_clear(iterpool);
+
if (lb->ctx->cancel_func)
SVN_ERR(lb->ctx->cancel_func(lb->ctx->cancel_baton));
@@ -414,34 +390,39 @@ log_entry_receiver(void *baton,
&& SVN_IS_VALID_REVNUM(log_item->copyfrom_rev))
{
copy_data
- = apr_psprintf(pool,
+ = apr_psprintf(iterpool,
_(" (from %s:%ld)"),
log_item->copyfrom_path,
log_item->copyfrom_rev);
}
- SVN_ERR(svn_cmdline_printf(pool, " %c %s%s\n",
+ SVN_ERR(svn_cmdline_printf(iterpool, " %c %s%s\n",
log_item->action, path,
copy_data));
}
+ svn_pool_destroy(iterpool);
}
- if (lb->merge_stack->nelts > 0)
+ if (lb->merge_stack && lb->merge_stack->nelts > 0)
{
int i;
+ apr_pool_t *iterpool;
/* Print the result of merge line */
if (log_entry->subtractive_merge)
SVN_ERR(svn_cmdline_printf(pool, _("Reverse merged via:")));
else
SVN_ERR(svn_cmdline_printf(pool, _("Merged via:")));
+ iterpool = svn_pool_create(pool);
for (i = 0; i < lb->merge_stack->nelts; i++)
{
svn_revnum_t rev = APR_ARRAY_IDX(lb->merge_stack, i, svn_revnum_t);
- SVN_ERR(svn_cmdline_printf(pool, " r%ld%c", rev,
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_cmdline_printf(iterpool, " r%ld%c", rev,
i == lb->merge_stack->nelts - 1 ?
'\n' : ','));
}
+ svn_pool_destroy(iterpool);
}
if (message != NULL)
@@ -473,7 +454,12 @@ log_entry_receiver(void *baton,
}
if (log_entry->has_children)
- APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ {
+ if (! lb->merge_stack)
+ lb->merge_stack = apr_array_make(lb->pool, 1, sizeof(svn_revnum_t));
+
+ APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ }
return SVN_NO_ERROR;
}
@@ -481,7 +467,7 @@ log_entry_receiver(void *baton,
/* This implements `svn_log_entry_receiver_t', printing the logs in XML.
*
- * BATON is of type `struct log_receiver_baton'.
+ * BATON is of type `svn_cl__log_receiver_baton'.
*
* Here is an example of the output; note that the "<log>" and
* "</log>" tags are not emitted by this function:
@@ -515,12 +501,12 @@ log_entry_receiver(void *baton,
* </log>
*
*/
-static svn_error_t *
-log_entry_receiver_xml(void *baton,
- svn_log_entry_t *log_entry,
- apr_pool_t *pool)
+svn_error_t *
+svn_cl__log_entry_receiver_xml(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool)
{
- struct log_receiver_baton *lb = baton;
+ svn_cl__log_receiver_baton *lb = baton;
/* Collate whole log message into sb before printing. */
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
char *revstr;
@@ -540,7 +526,8 @@ log_entry_receiver_xml(void *baton,
{
svn_xml_make_close_tag(&sb, pool, "logentry");
SVN_ERR(svn_cl__error_checked_fputs(sb->data, stdout));
- apr_array_pop(lb->merge_stack);
+ if (lb->merge_stack)
+ apr_array_pop(lb->merge_stack);
return SVN_NO_ERROR;
}
@@ -551,7 +538,12 @@ log_entry_receiver_xml(void *baton,
log_entry->changed_paths2, pool))
{
if (log_entry->has_children)
- APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ {
+ if (! lb->merge_stack)
+ lb->merge_stack = apr_array_make(lb->pool, 1, sizeof(svn_revnum_t));
+
+ APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ }
return SVN_NO_ERROR;
}
@@ -565,8 +557,19 @@ log_entry_receiver_xml(void *baton,
revstr = apr_psprintf(pool, "%ld", log_entry->revision);
/* <logentry revision="xxx"> */
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "logentry",
- "revision", revstr, NULL);
+ if (lb->merge_stack && lb->merge_stack->nelts > 0)
+ {
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "logentry",
+ "revision", revstr, "reverse-merge",
+ log_entry->subtractive_merge ? "true" : "false",
+ SVN_VA_NULL);
+
+ }
+ else
+ {
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "logentry",
+ "revision", revstr, SVN_VA_NULL);
+ }
/* <author>xxx</author> */
svn_cl__xml_tagged_cdata(&sb, pool, "author", author);
@@ -587,7 +590,7 @@ log_entry_receiver_xml(void *baton,
/* <paths> */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "paths",
- NULL);
+ SVN_VA_NULL);
/* Get an array of sorted hash keys. */
sorted_paths = svn_sort__hash(log_entry->changed_paths2,
@@ -619,7 +622,7 @@ log_entry_receiver_xml(void *baton,
log_item->text_modified),
"prop-mods", svn_tristate__to_word(
log_item->props_modified),
- NULL);
+ SVN_VA_NULL);
}
else
{
@@ -632,7 +635,7 @@ log_entry_receiver_xml(void *baton,
log_item->text_modified),
"prop-mods", svn_tristate__to_word(
log_item->props_modified),
- NULL);
+ SVN_VA_NULL);
}
/* xxx</path> */
svn_xml_escape_cdata_cstring(&sb, path, pool);
@@ -652,7 +655,7 @@ log_entry_receiver_xml(void *baton,
svn_compat_log_revprops_clear(log_entry->revprops);
if (log_entry->revprops && apr_hash_count(log_entry->revprops) > 0)
{
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "revprops", NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "revprops", SVN_VA_NULL);
SVN_ERR(svn_cmdline__print_xml_prop_hash(&sb, log_entry->revprops,
FALSE, /* name_only */
FALSE, pool));
@@ -660,7 +663,12 @@ log_entry_receiver_xml(void *baton,
}
if (log_entry->has_children)
- APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ {
+ if (! lb->merge_stack)
+ lb->merge_stack = apr_array_make(lb->pool, 1, sizeof(svn_revnum_t));
+
+ APR_ARRAY_PUSH(lb->merge_stack, svn_revnum_t) = log_entry->revision;
+ }
else
svn_xml_make_close_tag(&sb, pool, "logentry");
@@ -677,7 +685,7 @@ svn_cl__log(apr_getopt_t *os,
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
- struct log_receiver_baton lb;
+ svn_cl__log_receiver_baton lb;
const char *target;
int i;
apr_array_header_t *revprops;
@@ -785,7 +793,7 @@ svn_cl__log(apr_getopt_t *os,
lb.depth = opt_state->depth == svn_depth_unknown ? svn_depth_infinity
: opt_state->depth;
lb.diff_extensions = opt_state->extensions;
- lb.merge_stack = apr_array_make(pool, 0, sizeof(svn_revnum_t));
+ lb.merge_stack = NULL;
lb.search_patterns = opt_state->search_patterns;
lb.pool = pool;
@@ -813,8 +821,8 @@ svn_cl__log(apr_getopt_t *os,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *property = svn__apr_hash_index_key(hi);
- svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *property = apr_hash_this_key(hi);
+ svn_string_t *value = apr_hash_this_val(hi);
if (value && value->data[0] != '\0')
return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -839,7 +847,7 @@ svn_cl__log(apr_getopt_t *os,
opt_state->stop_on_copy,
opt_state->use_merge_history,
revprops,
- log_entry_receiver_xml,
+ svn_cl__log_entry_receiver_xml,
&lb,
ctx,
pool));
@@ -862,13 +870,13 @@ svn_cl__log(apr_getopt_t *os,
opt_state->stop_on_copy,
opt_state->use_merge_history,
revprops,
- log_entry_receiver,
+ svn_cl__log_entry_receiver,
&lb,
ctx,
pool));
if (! opt_state->incremental)
- SVN_ERR(svn_cmdline_printf(pool, SEP_STRING));
+ SVN_ERR(svn_cmdline_printf(pool, SVN_CL__LOG_SEP_STRING));
}
return SVN_NO_ERROR;
diff --git a/subversion/svn/merge-cmd.c b/subversion/svn/merge-cmd.c
index 17507a2..cbc818b 100644
--- a/subversion/svn/merge-cmd.c
+++ b/subversion/svn/merge-cmd.c
@@ -37,10 +37,6 @@
#include "svn_private_config.h"
-/* A handy constant */
-static const svn_opt_revision_t unspecified_revision
- = { svn_opt_revision_unspecified, { 0 } };
-
/*** Code. ***/
@@ -127,6 +123,11 @@ run_merge(svn_boolean_t two_sources_specified,
_("Merge sources must both be "
"either paths or URLs"));
+ if (svn_path_is_url(targetpath))
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Merge target '%s' must be a local path "
+ "but looks like a URL"), targetpath);
+
if (opt_state->verbose)
SVN_ERR(svn_cmdline_printf(scratch_pool, _("--- Merging\n")));
merge_err = svn_client_merge5(sourcepath1,
diff --git a/subversion/svn/mergeinfo-cmd.c b/subversion/svn/mergeinfo-cmd.c
index 41edcda..c3c0305 100644
--- a/subversion/svn/mergeinfo-cmd.c
+++ b/subversion/svn/mergeinfo-cmd.c
@@ -27,7 +27,9 @@
/*** Includes. ***/
+#include "svn_compat.h"
#include "svn_pools.h"
+#include "svn_props.h"
#include "svn_client.h"
#include "svn_cmdline.h"
#include "svn_path.h"
@@ -35,6 +37,7 @@
#include "svn_error_codes.h"
#include "svn_types.h"
#include "cl.h"
+#include "cl-log.h"
#include "svn_private_config.h"
@@ -55,6 +58,25 @@ print_log_rev(void *baton,
return SVN_NO_ERROR;
}
+/* Implements a svn_log_entry_receiver_t interface that filters out changed
+ * paths data before calling the svn_cl__log_entry_receiver(). Right now we
+ * always have to pass TRUE for discover_changed_paths for
+ * svn_client_mergeinfo_log2() due to the side effect of that option. The
+ * svn_cl__log_entry_receiver() discovers if it should print the changed paths
+ * implicitly by the path info existing. As a result this filter is needed
+ * to allow expected output without changed paths.
+ */
+static svn_error_t *
+print_log_details(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool)
+{
+ log_entry->changed_paths = NULL;
+ log_entry->changed_paths2 = NULL;
+
+ return svn_cl__log_entry_receiver(baton, log_entry, pool);
+}
+
/* Draw a diagram (by printing text to the console) summarizing the state
* of merging between two branches, given the merge description
* indicated by YCA, BASE, RIGHT, TARGET, REINTEGRATE_LIKE. */
@@ -218,7 +240,8 @@ mergeinfo_summary(
target_is_wc = (! svn_path_is_url(target_path_or_url))
&& (target_revision->kind == svn_opt_revision_unspecified
- || target_revision->kind == svn_opt_revision_working);
+ || target_revision->kind == svn_opt_revision_working
+ || target_revision->kind == svn_opt_revision_base);
SVN_ERR(svn_client_get_merging_summary(
&is_reintegration,
&yca_url, &yca_rev,
@@ -238,6 +261,77 @@ mergeinfo_summary(
return SVN_NO_ERROR;
}
+static svn_error_t *
+mergeinfo_log(svn_boolean_t finding_merged,
+ const char *target,
+ const svn_opt_revision_t *tgt_peg_revision,
+ const char *source,
+ const svn_opt_revision_t *src_peg_revision,
+ const svn_opt_revision_t *src_start_revision,
+ const svn_opt_revision_t *src_end_revision,
+ svn_depth_t depth,
+ svn_boolean_t include_log_details,
+ svn_boolean_t quiet,
+ svn_boolean_t verbose,
+ svn_boolean_t incremental,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *revprops;
+ svn_log_entry_receiver_t log_receiver;
+ void *log_receiver_baton;
+
+ if (include_log_details)
+ {
+ svn_cl__log_receiver_baton *baton;
+
+ revprops = apr_array_make(pool, 3, sizeof(const char *));
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_AUTHOR;
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE;
+ if (!quiet)
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
+
+ if (verbose)
+ log_receiver = svn_cl__log_entry_receiver;
+ else
+ log_receiver = print_log_details;
+
+ baton = apr_palloc(pool, sizeof(svn_cl__log_receiver_baton));
+ baton->ctx = ctx;
+ baton->target_path_or_url = target;
+ baton->target_peg_revision = *tgt_peg_revision;
+ baton->omit_log_message = quiet;
+ baton->show_diff = FALSE;
+ baton->depth = depth;
+ baton->diff_extensions = NULL;
+ baton->merge_stack = NULL;
+ baton->search_patterns = NULL;
+ baton->pool = pool;
+ log_receiver_baton = baton;
+ }
+ else
+ {
+ /* We need only revisions number, not revision properties. */
+ revprops = apr_array_make(pool, 0, sizeof(const char *));
+ log_receiver = print_log_rev;
+ log_receiver_baton = NULL;
+ }
+
+ SVN_ERR(svn_client_mergeinfo_log2(finding_merged, target,
+ tgt_peg_revision,
+ source, src_peg_revision,
+ src_start_revision,
+ src_end_revision,
+ log_receiver, log_receiver_baton,
+ TRUE, depth, revprops, ctx,
+ pool));
+
+ if (include_log_details && !incremental)
+ SVN_ERR(svn_cmdline_printf(pool, SVN_CL__LOG_SEP_STRING));
+
+ return SVN_NO_ERROR;
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__mergeinfo(apr_getopt_t *os,
@@ -303,36 +397,44 @@ svn_cl__mergeinfo(apr_getopt_t *os,
else
src_end_revision = &(opt_state->end_revision);
- /* Do the real work, depending on the requested data flavor. */
- if (opt_state->show_revs == svn_cl__show_revs_merged)
+ if (!opt_state->mergeinfo_log)
{
- apr_array_header_t *revprops;
+ if (opt_state->quiet)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--quiet (-q) option valid only with --log "
+ "option"));
- /* We need only revisions number, not revision properties. */
- revprops = apr_array_make(pool, 0, sizeof(const char *));
+ if (opt_state->verbose)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--verbose (-v) option valid only with "
+ "--log option"));
- SVN_ERR(svn_client_mergeinfo_log2(TRUE, target, &tgt_peg_revision,
- source, &src_peg_revision,
- src_start_revision,
- src_end_revision,
- print_log_rev, NULL,
- TRUE, depth, revprops, ctx,
- pool));
+ if (opt_state->incremental)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--incremental option valid only with "
+ "--log option"));
+ }
+
+ /* Do the real work, depending on the requested data flavor. */
+ if (opt_state->show_revs == svn_cl__show_revs_merged)
+ {
+ SVN_ERR(mergeinfo_log(TRUE, target, &tgt_peg_revision,
+ source, &src_peg_revision,
+ src_start_revision,
+ src_end_revision,
+ depth, opt_state->mergeinfo_log,
+ opt_state->quiet, opt_state->verbose,
+ opt_state->incremental, ctx, pool));
}
else if (opt_state->show_revs == svn_cl__show_revs_eligible)
{
- apr_array_header_t *revprops;
-
- /* We need only revisions number, not revision properties. */
- revprops = apr_array_make(pool, 0, sizeof(const char *));
-
- SVN_ERR(svn_client_mergeinfo_log2(FALSE, target, &tgt_peg_revision,
- source, &src_peg_revision,
- src_start_revision,
- src_end_revision,
- print_log_rev, NULL,
- TRUE, depth, revprops, ctx,
- pool));
+ SVN_ERR(mergeinfo_log(FALSE, target, &tgt_peg_revision,
+ source, &src_peg_revision,
+ src_start_revision,
+ src_end_revision,
+ depth, opt_state->mergeinfo_log,
+ opt_state->quiet, opt_state->verbose,
+ opt_state->incremental, ctx, pool));
}
else
{
@@ -345,6 +447,11 @@ svn_cl__mergeinfo(apr_getopt_t *os,
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Depth specification options valid only "
"with --show-revs option"));
+ if (opt_state->mergeinfo_log)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--log option valid only with "
+ "--show-revs option"));
+
SVN_ERR(mergeinfo_summary(source, &src_peg_revision,
target, &tgt_peg_revision,
diff --git a/subversion/svn/notify.c b/subversion/svn/notify.c
index 6498fb1..c530694 100644
--- a/subversion/svn/notify.c
+++ b/subversion/svn/notify.c
@@ -52,7 +52,7 @@ struct notify_baton
svn_boolean_t is_export;
svn_boolean_t is_wc_to_repos_copy;
svn_boolean_t sent_first_txdelta;
- svn_boolean_t in_external;
+ int in_external;
svn_boolean_t had_print_error; /* Used to not keep printing error messages
when we've already had one print error. */
@@ -129,7 +129,7 @@ svn_cl__conflict_stats_resolved(svn_cl__conflict_stats_t *conflict_stats,
static const char *
remaining_str(apr_pool_t *pool, int n_remaining)
{
- return apr_psprintf(pool, Q_("%d remaining",
+ return apr_psprintf(pool, Q_("%d remaining",
"%d remaining",
n_remaining),
n_remaining);
@@ -145,20 +145,20 @@ resolved_str(apr_pool_t *pool, int n_resolved)
}
svn_error_t *
-svn_cl__notifier_print_conflict_stats(void *baton, apr_pool_t *scratch_pool)
+svn_cl__print_conflict_stats(svn_cl__conflict_stats_t *conflict_stats,
+ apr_pool_t *scratch_pool)
{
- struct notify_baton *nb = baton;
- int n_text = apr_hash_count(nb->conflict_stats->text_conflicts);
- int n_prop = apr_hash_count(nb->conflict_stats->prop_conflicts);
- int n_tree = apr_hash_count(nb->conflict_stats->tree_conflicts);
- int n_text_r = nb->conflict_stats->text_conflicts_resolved;
- int n_prop_r = nb->conflict_stats->prop_conflicts_resolved;
- int n_tree_r = nb->conflict_stats->tree_conflicts_resolved;
+ int n_text = apr_hash_count(conflict_stats->text_conflicts);
+ int n_prop = apr_hash_count(conflict_stats->prop_conflicts);
+ int n_tree = apr_hash_count(conflict_stats->tree_conflicts);
+ int n_text_r = conflict_stats->text_conflicts_resolved;
+ int n_prop_r = conflict_stats->prop_conflicts_resolved;
+ int n_tree_r = conflict_stats->tree_conflicts_resolved;
if (n_text > 0 || n_text_r > 0
|| n_prop > 0 || n_prop_r > 0
|| n_tree > 0 || n_tree_r > 0
- || nb->conflict_stats->skipped_paths > 0)
+ || conflict_stats->skipped_paths > 0)
SVN_ERR(svn_cmdline_printf(scratch_pool,
_("Summary of conflicts:\n")));
@@ -195,32 +195,43 @@ svn_cl__notifier_print_conflict_stats(void *baton, apr_pool_t *scratch_pool)
remaining_str(scratch_pool, n_tree),
resolved_str(scratch_pool, n_tree_r)));
}
- if (nb->conflict_stats->skipped_paths > 0)
+ if (conflict_stats->skipped_paths > 0)
SVN_ERR(svn_cmdline_printf(scratch_pool,
_(" Skipped paths: %d\n"),
- nb->conflict_stats->skipped_paths));
+ conflict_stats->skipped_paths));
return SVN_NO_ERROR;
}
-/* This implements `svn_wc_notify_func2_t'.
- * NOTE: This function can't fail, so we just ignore any print errors. */
-static void
-notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
+svn_error_t *
+svn_cl__notifier_print_conflict_stats(void *baton, apr_pool_t *scratch_pool)
{
struct notify_baton *nb = baton;
+
+ SVN_ERR(svn_cl__print_conflict_stats(nb->conflict_stats, scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+/* The body for notify() function with standard error handling semantic.
+ * Handling of errors implemented at caller side. */
+static svn_error_t *
+notify_body(struct notify_baton *nb,
+ const svn_wc_notify_t *n,
+ apr_pool_t *pool)
+{
char statchar_buf[5] = " ";
const char *path_local;
- svn_error_t *err;
if (n->url)
path_local = n->url;
else
{
+ /* Skip the path prefix in N, if supplied, or else the path prefix
+ in NB (which was set to the current working directory). */
if (n->path_prefix)
path_local = svn_cl__local_style_skip_ancestor(n->path_prefix, n->path,
pool);
- else /* skip nb->path_prefix, if it's non-null */
+ else
path_local = svn_cl__local_style_skip_ancestor(nb->path_prefix, n->path,
pool);
}
@@ -231,90 +242,78 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
nb->conflict_stats->skipped_paths++;
if (n->content_state == svn_wc_notify_state_missing)
{
- if ((err = svn_cmdline_printf
- (pool, _("Skipped missing target: '%s'\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Skipped missing target: '%s'\n"),
+ path_local));
}
else if (n->content_state == svn_wc_notify_state_source_missing)
{
- if ((err = svn_cmdline_printf
- (pool, _("Skipped target: '%s' -- copy-source is missing\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool,
+ _("Skipped target: '%s' -- copy-source is missing\n"),
+ path_local));
}
else
{
- if ((err = svn_cmdline_printf
- (pool, _("Skipped '%s'\n"), path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Skipped '%s'\n"), path_local));
}
break;
case svn_wc_notify_update_skip_obstruction:
nb->conflict_stats->skipped_paths++;
- if ((err = svn_cmdline_printf(
- pool, _("Skipped '%s' -- An obstructing working copy was found\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool,
+ _("Skipped '%s' -- An obstructing working copy was found\n"),
+ path_local));
break;
case svn_wc_notify_update_skip_working_only:
nb->conflict_stats->skipped_paths++;
- if ((err = svn_cmdline_printf(
- pool, _("Skipped '%s' -- Has no versioned parent\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Has no versioned parent\n"),
+ path_local));
break;
case svn_wc_notify_update_skip_access_denied:
nb->conflict_stats->skipped_paths++;
- if ((err = svn_cmdline_printf(
- pool, _("Skipped '%s' -- Access denied\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Access denied\n"),
+ path_local));
break;
case svn_wc_notify_skip_conflicted:
nb->conflict_stats->skipped_paths++;
- if ((err = svn_cmdline_printf(
- pool, _("Skipped '%s' -- Node remains in conflict\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Node remains in conflict\n"),
+ path_local));
break;
case svn_wc_notify_update_delete:
case svn_wc_notify_exclude:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, "D %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "D %s\n", path_local));
break;
case svn_wc_notify_update_broken_lock:
- if ((err = svn_cmdline_printf(pool, "B %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "B %s\n", path_local));
break;
case svn_wc_notify_update_external_removed:
nb->received_some_change = TRUE;
if (n->err && n->err->message)
{
- if ((err = svn_cmdline_printf(pool, "Removed external '%s': %s\n",
- path_local, n->err->message)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Removed external '%s': %s\n"),
+ path_local, n->err->message));
}
else
{
- if ((err = svn_cmdline_printf(pool, "Removed external '%s'\n",
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Removed external '%s'\n"),
+ path_local));
}
break;
case svn_wc_notify_left_local_modifications:
- if ((err = svn_cmdline_printf(pool, "Left local modifications as '%s'\n",
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Left local modifications as '%s'\n"),
+ path_local));
break;
case svn_wc_notify_update_replace:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, "R %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "R %s\n", path_local));
break;
case svn_wc_notify_update_add:
@@ -322,13 +321,11 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
if (n->content_state == svn_wc_notify_state_conflicted)
{
store_path(nb, nb->conflict_stats->text_conflicts, path_local);
- if ((err = svn_cmdline_printf(pool, "C %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "C %s\n", path_local));
}
else
{
- if ((err = svn_cmdline_printf(pool, "A %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "A %s\n", path_local));
}
break;
@@ -350,34 +347,29 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
else if (n->prop_state == svn_wc_notify_state_merged)
statchar_buf[1] = 'G';
- if ((err = svn_cmdline_printf(pool, "%s %s\n", statchar_buf, path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "%s %s\n", statchar_buf, path_local));
break;
case svn_wc_notify_restore:
- if ((err = svn_cmdline_printf(pool, _("Restored '%s'\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Restored '%s'\n"),
+ path_local));
break;
case svn_wc_notify_revert:
- if ((err = svn_cmdline_printf(pool, _("Reverted '%s'\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Reverted '%s'\n"),
+ path_local));
break;
case svn_wc_notify_failed_revert:
- if (( err = svn_cmdline_printf(pool, _("Failed to revert '%s' -- "
- "try updating instead.\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Failed to revert '%s' -- "
+ "try updating instead.\n"),
+ path_local));
break;
case svn_wc_notify_resolved:
- if ((err = svn_cmdline_printf(pool,
- _("Resolved conflicted state of '%s'\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Resolved conflicted state of '%s'\n"),
+ path_local));
break;
case svn_wc_notify_add:
@@ -386,23 +378,20 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
is a binary addition. */
if (n->mime_type && (svn_mime_type_is_binary(n->mime_type)))
{
- if ((err = svn_cmdline_printf(pool, "A (bin) %s\n",
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "A (bin) %s\n",
+ path_local));
}
else
{
- if ((err = svn_cmdline_printf(pool, "A %s\n",
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "A %s\n",
+ path_local));
}
break;
case svn_wc_notify_delete:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, "D %s\n",
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "D %s\n",
+ path_local));
break;
case svn_wc_notify_patch:
@@ -431,9 +420,8 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ')
{
- if ((err = svn_cmdline_printf(pool, "%s %s\n",
- statchar_buf, path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "%s %s\n",
+ statchar_buf, path_local));
}
}
break;
@@ -473,37 +461,34 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## "
"with offset %s");
- err = svn_cmdline_printf(pool,
- apr_pstrcat(pool, s,
- "%"APR_UINT64_T_FMT
- " and fuzz %lu (%s)\n",
- (char *)NULL),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- minus, off, n->hunk_fuzz,
- n->prop_name);
+ SVN_ERR(svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT
+ " and fuzz %lu (%s)\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->hunk_fuzz,
+ n->prop_name));
}
else
{
s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
"with offset %s");
- err = svn_cmdline_printf(pool,
- apr_pstrcat(pool, s,
- "%"APR_UINT64_T_FMT
- " and fuzz %lu\n",
- (char *)NULL),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- minus, off, n->hunk_fuzz);
+ SVN_ERR(svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT
+ " and fuzz %lu\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->hunk_fuzz));
}
-
- if (err)
- goto print_error;
}
else
{
@@ -512,39 +497,36 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
{
s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## "
"with offset %s");
- err = svn_cmdline_printf(pool,
- apr_pstrcat(pool, s,
- "%"APR_UINT64_T_FMT" (%s)\n",
- (char *)NULL),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- minus, off, n->prop_name);
+ SVN_ERR(svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT" (%s)\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->prop_name));
}
else
{
s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
"with offset %s");
- err = svn_cmdline_printf(pool,
- apr_pstrcat(pool, s,
- "%"APR_UINT64_T_FMT"\n",
- (char *)NULL),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- minus, off);
+ SVN_ERR(svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT"\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off));
}
-
- if (err)
- goto print_error;
}
}
else if (n->hunk_fuzz)
{
if (n->prop_name)
- err = svn_cmdline_printf(pool,
+ SVN_ERR(svn_cmdline_printf(pool,
_("> applied hunk ## -%lu,%lu +%lu,%lu ## "
"with fuzz %lu (%s)\n"),
n->hunk_original_start,
@@ -552,18 +534,16 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
n->hunk_modified_start,
n->hunk_modified_length,
n->hunk_fuzz,
- n->prop_name);
+ n->prop_name));
else
- err = svn_cmdline_printf(pool,
+ SVN_ERR(svn_cmdline_printf(pool,
_("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
"with fuzz %lu\n"),
n->hunk_original_start,
n->hunk_original_length,
n->hunk_modified_start,
n->hunk_modified_length,
- n->hunk_fuzz);
- if (err)
- goto print_error;
+ n->hunk_fuzz));
}
break;
@@ -572,49 +552,45 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
nb->received_some_change = TRUE;
if (n->prop_name)
- err = svn_cmdline_printf(pool,
- _("> rejected hunk "
- "## -%lu,%lu +%lu,%lu ## (%s)\n"),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- n->prop_name);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("> rejected hunk "
+ "## -%lu,%lu +%lu,%lu ## (%s)\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->prop_name));
else
- err = svn_cmdline_printf(pool,
- _("> rejected hunk "
- "@@ -%lu,%lu +%lu,%lu @@\n"),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("> rejected hunk "
+ "@@ -%lu,%lu +%lu,%lu @@\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length));
break;
case svn_wc_notify_patch_hunk_already_applied:
nb->received_some_change = TRUE;
if (n->prop_name)
- err = svn_cmdline_printf(pool,
- _("> hunk "
- "## -%lu,%lu +%lu,%lu ## "
- "already applied (%s)\n"),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length,
- n->prop_name);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("> hunk "
+ "## -%lu,%lu +%lu,%lu ## "
+ "already applied (%s)\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->prop_name));
else
- err = svn_cmdline_printf(pool,
- _("> hunk "
- "@@ -%lu,%lu +%lu,%lu @@ "
- "already applied\n"),
- n->hunk_original_start,
- n->hunk_original_length,
- n->hunk_modified_start,
- n->hunk_modified_length);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("> hunk "
+ "@@ -%lu,%lu +%lu,%lu @@ "
+ "already applied\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length));
break;
case svn_wc_notify_update_update:
@@ -652,23 +628,21 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
if (statchar_buf[0] != ' ' || statchar_buf[1] != ' '
|| statchar_buf[2] != ' ')
{
- if ((err = svn_cmdline_printf(pool, "%s %s\n",
- statchar_buf, path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "%s %s\n",
+ statchar_buf, path_local));
}
}
break;
case svn_wc_notify_update_external:
/* Remember that we're now "inside" an externals definition. */
- nb->in_external = TRUE;
+ ++nb->in_external;
/* Currently this is used for checkouts and switches too. If we
want different output, we'll have to add new actions. */
- if ((err = svn_cmdline_printf(pool,
- _("\nFetching external item into '%s':\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("\nFetching external item into '%s':\n"),
+ path_local));
break;
case svn_wc_notify_failed_external:
@@ -679,9 +653,8 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
if (nb->in_external)
{
svn_handle_warning2(stderr, n->err, "svn: ");
- nb->in_external = FALSE;
- if ((err = svn_cmdline_printf(pool, "\n")))
- goto print_error;
+ --nb->in_external;
+ SVN_ERR(svn_cmdline_printf(pool, "\n"));
}
/* Otherwise, we'll just print two warnings. Why? Because
svn_handle_warning2() only shows the single "best message",
@@ -691,7 +664,7 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
else
{
svn_error_t *warn_err =
- svn_error_createf(SVN_ERR_BASE, NULL,
+ svn_error_createf(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, NULL,
_("Error handling externals definition for '%s':"),
path_local);
svn_handle_warning2(stderr, warn_err, "svn: ");
@@ -705,9 +678,8 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
nb->is_checkout ||
nb->is_export))
{
- if ((err = svn_cmdline_printf(pool, _("Updating '%s':\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Updating '%s':\n"),
+ path_local));
}
break;
@@ -717,42 +689,38 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
{
if (nb->is_export)
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("Exported external at revision %ld.\n")
- : _("Exported revision %ld.\n"),
- n->revision)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("Exported external at revision %ld.\n")
+ : _("Exported revision %ld.\n"),
+ n->revision));
}
else if (nb->is_checkout)
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("Checked out external at revision %ld.\n")
- : _("Checked out revision %ld.\n"),
- n->revision)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("Checked out external at revision %ld.\n")
+ : _("Checked out revision %ld.\n"),
+ n->revision));
}
else
{
if (nb->received_some_change)
{
nb->received_some_change = FALSE;
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("Updated external to revision %ld.\n")
- : _("Updated to revision %ld.\n"),
- n->revision)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("Updated external to revision %ld.\n")
+ : _("Updated to revision %ld.\n"),
+ n->revision));
}
else
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("External at revision %ld.\n")
- : _("At revision %ld.\n"),
- n->revision)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("External at revision %ld.\n")
+ : _("At revision %ld.\n"),
+ n->revision));
}
}
}
@@ -760,128 +728,119 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
{
if (nb->is_export)
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("External export complete.\n")
- : _("Export complete.\n"))))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("External export complete.\n")
+ : _("Export complete.\n")));
}
else if (nb->is_checkout)
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("External checkout complete.\n")
- : _("Checkout complete.\n"))))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("External checkout complete.\n")
+ : _("Checkout complete.\n")));
}
else
{
- if ((err = svn_cmdline_printf
- (pool, nb->in_external
- ? _("External update complete.\n")
- : _("Update complete.\n"))))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, nb->in_external
+ ? _("External update complete.\n")
+ : _("Update complete.\n")));
}
}
}
if (nb->in_external)
{
- nb->in_external = FALSE;
- if ((err = svn_cmdline_printf(pool, "\n")))
- goto print_error;
+ --nb->in_external;
+ SVN_ERR(svn_cmdline_printf(pool, "\n"));
}
break;
case svn_wc_notify_status_external:
- if ((err = svn_cmdline_printf
- (pool, _("\nPerforming status on external item at '%s':\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(
+ pool, _("\nPerforming status on external item at '%s':\n"),
+ path_local));
+ break;
+
+ case svn_wc_notify_info_external:
+ SVN_ERR(svn_cmdline_printf(
+ pool, _("\nPerforming info on external item at '%s':\n"),
+ path_local));
break;
case svn_wc_notify_status_completed:
if (SVN_IS_VALID_REVNUM(n->revision))
- if ((err = svn_cmdline_printf(pool,
- _("Status against revision: %6ld\n"),
- n->revision)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Status against revision: %6ld\n"),
+ n->revision));
break;
case svn_wc_notify_commit_modified:
/* xgettext: Align the %s's on this and the following 4 messages */
- if ((err = svn_cmdline_printf(pool,
- nb->is_wc_to_repos_copy
- ? _("Sending copy of %s\n")
- : _("Sending %s\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Sending copy of %s\n")
+ : _("Sending %s\n"),
+ path_local));
break;
case svn_wc_notify_commit_added:
case svn_wc_notify_commit_copied:
if (n->mime_type && svn_mime_type_is_binary(n->mime_type))
{
- if ((err = svn_cmdline_printf(pool,
- nb->is_wc_to_repos_copy
- ? _("Adding copy of (bin) %s\n")
- : _("Adding (bin) %s\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Adding copy of (bin) %s\n")
+ : _("Adding (bin) %s\n"),
+ path_local));
}
else
{
- if ((err = svn_cmdline_printf(pool,
- nb->is_wc_to_repos_copy
- ? _("Adding copy of %s\n")
- : _("Adding %s\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Adding copy of %s\n")
+ : _("Adding %s\n"),
+ path_local));
}
break;
case svn_wc_notify_commit_deleted:
- if ((err = svn_cmdline_printf(pool,
- nb->is_wc_to_repos_copy
- ? _("Deleting copy of %s\n")
- : _("Deleting %s\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Deleting copy of %s\n")
+ : _("Deleting %s\n"),
+ path_local));
break;
case svn_wc_notify_commit_replaced:
case svn_wc_notify_commit_copied_replaced:
- if ((err = svn_cmdline_printf(pool,
- nb->is_wc_to_repos_copy
- ? _("Replacing copy of %s\n")
- : _("Replacing %s\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Replacing copy of %s\n")
+ : _("Replacing %s\n"),
+ path_local));
break;
case svn_wc_notify_commit_postfix_txdelta:
if (! nb->sent_first_txdelta)
{
nb->sent_first_txdelta = TRUE;
- if ((err = svn_cmdline_printf(pool,
- _("Transmitting file data "))))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Transmitting file data ")));
}
- if ((err = svn_cmdline_printf(pool, ".")))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "."));
break;
case svn_wc_notify_locked:
- if ((err = svn_cmdline_printf(pool, _("'%s' locked by user '%s'.\n"),
- path_local, n->lock->owner)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("'%s' locked by user '%s'.\n"),
+ path_local, n->lock->owner));
break;
case svn_wc_notify_unlocked:
- if ((err = svn_cmdline_printf(pool, _("'%s' unlocked.\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("'%s' unlocked.\n"),
+ path_local));
break;
case svn_wc_notify_failed_lock:
@@ -890,212 +849,182 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
break;
case svn_wc_notify_changelist_set:
- if ((err = svn_cmdline_printf(pool, "A [%s] %s\n",
- n->changelist_name, path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "A [%s] %s\n",
+ n->changelist_name, path_local));
break;
case svn_wc_notify_changelist_clear:
case svn_wc_notify_changelist_moved:
- if ((err = svn_cmdline_printf(pool,
- "D [%s] %s\n",
- n->changelist_name, path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ "D [%s] %s\n",
+ n->changelist_name, path_local));
break;
case svn_wc_notify_merge_begin:
if (n->merge_range == NULL)
- err = svn_cmdline_printf(pool,
- _("--- Merging differences between "
- "repository URLs into '%s':\n"),
- path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Merging differences between "
+ "repository URLs into '%s':\n"),
+ path_local));
else if (n->merge_range->start == n->merge_range->end - 1
|| n->merge_range->start == n->merge_range->end)
- err = svn_cmdline_printf(pool, _("--- Merging r%ld into '%s':\n"),
- n->merge_range->end, path_local);
+ SVN_ERR(svn_cmdline_printf(pool, _("--- Merging r%ld into '%s':\n"),
+ n->merge_range->end, path_local));
else if (n->merge_range->start - 1 == n->merge_range->end)
- err = svn_cmdline_printf(pool,
- _("--- Reverse-merging r%ld into '%s':\n"),
- n->merge_range->start, path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Reverse-merging r%ld into '%s':\n"),
+ n->merge_range->start, path_local));
else if (n->merge_range->start < n->merge_range->end)
- err = svn_cmdline_printf(pool,
- _("--- Merging r%ld through r%ld into "
- "'%s':\n"),
- n->merge_range->start + 1,
- n->merge_range->end, path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Merging r%ld through r%ld into "
+ "'%s':\n"),
+ n->merge_range->start + 1,
+ n->merge_range->end, path_local));
else /* n->merge_range->start > n->merge_range->end - 1 */
- err = svn_cmdline_printf(pool,
- _("--- Reverse-merging r%ld through r%ld "
- "into '%s':\n"),
- n->merge_range->start,
- n->merge_range->end + 1, path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Reverse-merging r%ld through r%ld "
+ "into '%s':\n"),
+ n->merge_range->start,
+ n->merge_range->end + 1, path_local));
break;
case svn_wc_notify_merge_record_info_begin:
if (!n->merge_range)
{
- err = svn_cmdline_printf(pool,
- _("--- Recording mergeinfo for merge "
- "between repository URLs into '%s':\n"),
- path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Recording mergeinfo for merge "
+ "between repository URLs into '%s':\n"),
+ path_local));
}
else
{
if (n->merge_range->start == n->merge_range->end - 1
|| n->merge_range->start == n->merge_range->end)
- err = svn_cmdline_printf(
+ SVN_ERR(svn_cmdline_printf(
pool,
_("--- Recording mergeinfo for merge of r%ld into '%s':\n"),
- n->merge_range->end, path_local);
+ n->merge_range->end, path_local));
else if (n->merge_range->start - 1 == n->merge_range->end)
- err = svn_cmdline_printf(
+ SVN_ERR(svn_cmdline_printf(
pool,
_("--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"),
- n->merge_range->start, path_local);
+ n->merge_range->start, path_local));
else if (n->merge_range->start < n->merge_range->end)
- err = svn_cmdline_printf(
+ SVN_ERR(svn_cmdline_printf(
pool,
_("--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"),
- n->merge_range->start + 1, n->merge_range->end, path_local);
+ n->merge_range->start + 1, n->merge_range->end, path_local));
else /* n->merge_range->start > n->merge_range->end - 1 */
- err = svn_cmdline_printf(
+ SVN_ERR(svn_cmdline_printf(
pool,
_("--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"),
- n->merge_range->start, n->merge_range->end + 1, path_local);
+ n->merge_range->start, n->merge_range->end + 1, path_local));
}
-
- if (err)
- goto print_error;
break;
case svn_wc_notify_merge_elide_info:
- if ((err = svn_cmdline_printf(pool,
- _("--- Eliding mergeinfo from '%s':\n"),
- path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Eliding mergeinfo from '%s':\n"),
+ path_local));
break;
case svn_wc_notify_foreign_merge_begin:
if (n->merge_range == NULL)
- err = svn_cmdline_printf(pool,
- _("--- Merging differences between "
- "foreign repository URLs into '%s':\n"),
- path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Merging differences between "
+ "foreign repository URLs into '%s':\n"),
+ path_local));
else if (n->merge_range->start == n->merge_range->end - 1
|| n->merge_range->start == n->merge_range->end)
- err = svn_cmdline_printf(pool,
- _("--- Merging (from foreign repository) "
- "r%ld into '%s':\n"),
- n->merge_range->end, path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Merging (from foreign repository) "
+ "r%ld into '%s':\n"),
+ n->merge_range->end, path_local));
else if (n->merge_range->start - 1 == n->merge_range->end)
- err = svn_cmdline_printf(pool,
- _("--- Reverse-merging (from foreign "
- "repository) r%ld into '%s':\n"),
- n->merge_range->start, path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Reverse-merging (from foreign "
+ "repository) r%ld into '%s':\n"),
+ n->merge_range->start, path_local));
else if (n->merge_range->start < n->merge_range->end)
- err = svn_cmdline_printf(pool,
- _("--- Merging (from foreign repository) "
- "r%ld through r%ld into '%s':\n"),
- n->merge_range->start + 1,
- n->merge_range->end, path_local);
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Merging (from foreign repository) "
+ "r%ld through r%ld into '%s':\n"),
+ n->merge_range->start + 1,
+ n->merge_range->end, path_local));
else /* n->merge_range->start > n->merge_range->end - 1 */
- err = svn_cmdline_printf(pool,
- _("--- Reverse-merging (from foreign "
- "repository) r%ld through r%ld into "
- "'%s':\n"),
- n->merge_range->start,
- n->merge_range->end + 1, path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("--- Reverse-merging (from foreign "
+ "repository) r%ld through r%ld into "
+ "'%s':\n"),
+ n->merge_range->start,
+ n->merge_range->end + 1, path_local));
break;
case svn_wc_notify_tree_conflict:
store_path(nb, nb->conflict_stats->tree_conflicts, path_local);
- if ((err = svn_cmdline_printf(pool, " C %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, " C %s\n", path_local));
break;
case svn_wc_notify_update_shadowed_add:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, " A %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, " A %s\n", path_local));
break;
case svn_wc_notify_update_shadowed_update:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, " U %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, " U %s\n", path_local));
break;
case svn_wc_notify_update_shadowed_delete:
nb->received_some_change = TRUE;
- if ((err = svn_cmdline_printf(pool, " D %s\n", path_local)))
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, " D %s\n", path_local));
break;
case svn_wc_notify_property_modified:
case svn_wc_notify_property_added:
- err = svn_cmdline_printf(pool,
- _("property '%s' set on '%s'\n"),
- n->prop_name, path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("property '%s' set on '%s'\n"),
+ n->prop_name, path_local));
break;
case svn_wc_notify_property_deleted:
- err = svn_cmdline_printf(pool,
- _("property '%s' deleted from '%s'.\n"),
- n->prop_name, path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("property '%s' deleted from '%s'.\n"),
+ n->prop_name, path_local));
break;
case svn_wc_notify_property_deleted_nonexistent:
- err = svn_cmdline_printf(pool,
- _("Attempting to delete nonexistent "
- "property '%s' on '%s'\n"), n->prop_name,
- path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Attempting to delete nonexistent "
+ "property '%s' on '%s'\n"), n->prop_name,
+ path_local));
break;
case svn_wc_notify_revprop_set:
- err = svn_cmdline_printf(pool,
+ SVN_ERR(svn_cmdline_printf(pool,
_("property '%s' set on repository revision %ld\n"),
- n->prop_name, n->revision);
- if (err)
- goto print_error;
+ n->prop_name, n->revision));
break;
case svn_wc_notify_revprop_deleted:
- err = svn_cmdline_printf(pool,
+ SVN_ERR(svn_cmdline_printf(pool,
_("property '%s' deleted from repository revision %ld\n"),
- n->prop_name, n->revision);
- if (err)
- goto print_error;
+ n->prop_name, n->revision));
break;
case svn_wc_notify_upgraded_path:
- err = svn_cmdline_printf(pool, _("Upgraded '%s'\n"), path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Upgraded '%s'\n"), path_local));
break;
case svn_wc_notify_url_redirect:
- err = svn_cmdline_printf(pool, _("Redirecting to URL '%s':\n"),
- n->url);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, _("Redirecting to URL '%s':\n"),
+ n->url));
break;
case svn_wc_notify_path_nonexistent:
- err = svn_cmdline_printf(pool, "%s\n",
- apr_psprintf(pool, _("'%s' is not under version control"),
- path_local));
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool, "%s\n",
+ apr_psprintf(pool, _("'%s' is not under version control"),
+ path_local)));
break;
case svn_wc_notify_conflict_resolver_starting:
@@ -1110,37 +1039,56 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
case svn_wc_notify_foreign_copy_begin:
if (n->merge_range == NULL)
{
- err = svn_cmdline_printf(
+ SVN_ERR(svn_cmdline_printf(
pool,
_("--- Copying from foreign repository URL '%s':\n"),
- n->url);
- if (err)
- goto print_error;
+ n->url));
}
break;
case svn_wc_notify_move_broken:
- err = svn_cmdline_printf(pool,
- _("Breaking move with source path '%s'\n"),
- path_local);
- if (err)
- goto print_error;
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Breaking move with source path '%s'\n"),
+ path_local));
+ break;
+
+ case svn_wc_notify_cleanup_external:
+ SVN_ERR(svn_cmdline_printf
+ (pool, _("Performing cleanup on external item at '%s'.\n"),
+ path_local));
+ break;
+
+ case svn_wc_notify_commit_finalizing:
+ if (nb->sent_first_txdelta)
+ {
+ SVN_ERR(svn_cmdline_printf(pool, _("done\n")));
+ }
+ SVN_ERR(svn_cmdline_printf(pool, _("Committing transaction...\n")));
break;
default:
break;
}
- if ((err = svn_cmdline_fflush(stdout)))
- goto print_error;
+ SVN_ERR(svn_cmdline_fflush(stdout));
- return;
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_wc_notify_func2_t'.
+ * NOTE: This function can't fail, so we just ignore any print errors. */
+static void
+notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
+{
+ struct notify_baton *nb = baton;
+ svn_error_t *err;
+
+ err = notify_body(nb, n, pool);
- print_error:
/* If we had no errors before, print this error to stderr. Else, don't print
anything. The user already knows there were some output errors,
so there is no point in flooding her with an error per notification. */
- if (!nb->had_print_error)
+ if (err && !nb->had_print_error)
{
nb->had_print_error = TRUE;
/* Issue #3014:
@@ -1156,7 +1104,6 @@ notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
svn_error_clear(err);
}
-
svn_error_t *
svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
void **notify_baton_p,
@@ -1170,7 +1117,7 @@ svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
nb->is_checkout = FALSE;
nb->is_export = FALSE;
nb->is_wc_to_repos_copy = FALSE;
- nb->in_external = FALSE;
+ nb->in_external = 0;
nb->had_print_error = FALSE;
nb->conflict_stats = conflict_stats;
SVN_ERR(svn_dirent_get_absolute(&nb->path_prefix, "", pool));
diff --git a/subversion/svn/propget-cmd.c b/subversion/svn/propget-cmd.c
index e291911..fa04c20 100644
--- a/subversion/svn/propget-cmd.c
+++ b/subversion/svn/propget-cmd.c
@@ -44,7 +44,8 @@
#include "cl.h"
#include "private/svn_cmdline_private.h"
-
+#include "private/svn_opt_private.h"
+#include "private/svn_sorts_private.h"
#include "svn_private_config.h"
@@ -88,7 +89,7 @@ print_properties_xml(const char *pname,
const char *name_local;
svn_prop_inherited_item_t *iprop =
APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
- svn_string_t *propval = svn__apr_hash_index_val(
+ svn_string_t *propval = apr_hash_this_val(
apr_hash_first(pool, iprop->prop_hash));
sb = NULL;
@@ -100,7 +101,7 @@ print_properties_xml(const char *pname,
name_local = svn_dirent_local_style(iprop->path_or_url, iterpool);
svn_xml_make_open_tag(&sb, iterpool, svn_xml_normal, "target",
- "path", name_local, NULL);
+ "path", name_local, SVN_VA_NULL);
svn_cmdline__print_xml_prop(&sb, pname, propval, TRUE, iterpool);
svn_xml_make_close_tag(&sb, iterpool, "target");
@@ -123,7 +124,7 @@ print_properties_xml(const char *pname,
svn_pool_clear(iterpool);
svn_xml_make_open_tag(&sb, iterpool, svn_xml_normal, "target",
- "path", filename, NULL);
+ "path", filename, SVN_VA_NULL);
svn_cmdline__print_xml_prop(&sb, pname, propval, FALSE, iterpool);
svn_xml_make_close_tag(&sb, iterpool, "target");
@@ -277,7 +278,7 @@ print_properties(svn_stream_t *out,
{
svn_prop_inherited_item_t *iprop =
APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
- svn_string_t *propval = svn__apr_hash_index_val(apr_hash_first(pool,
+ svn_string_t *propval = apr_hash_this_val(apr_hash_first(pool,
iprop->prop_hash));
SVN_ERR(print_single_prop(propval, target_abspath_or_url,
iprop->path_or_url,
@@ -319,12 +320,13 @@ svn_cl__propget(apr_getopt_t *os,
const char *pname, *pname_utf8;
apr_array_header_t *args, *targets;
svn_stream_t *out;
+ svn_boolean_t warned = FALSE;
- if (opt_state->verbose && (opt_state->revprop || opt_state->strict
+ if (opt_state->verbose && (opt_state->revprop || opt_state->no_newline
|| opt_state->xml))
return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--verbose cannot be used with --revprop or "
- "--strict or --xml"));
+ "--no-newline or --xml"));
/* PNAME is first argument (and PNAME_UTF8 will be a UTF-8 version
thereof) */
@@ -365,7 +367,17 @@ svn_cl__propget(apr_getopt_t *os,
URL, &(opt_state->start_revision),
&rev, ctx, pool));
- if (propval != NULL)
+ if (propval == NULL)
+ {
+ return svn_error_createf(SVN_ERR_PROPERTY_NOT_FOUND, NULL,
+ _("Property '%s' not found on "
+ "revision %s"),
+ pname_utf8,
+ svn_opt__revision_to_string(
+ &opt_state->start_revision,
+ pool));
+ }
+ else
{
if (opt_state->xml)
{
@@ -376,7 +388,7 @@ svn_cl__propget(apr_getopt_t *os,
svn_xml_make_open_tag(&sb, pool, svn_xml_normal,
"revprops",
- "rev", revstr, NULL);
+ "rev", revstr, SVN_VA_NULL);
svn_cmdline__print_xml_prop(&sb, pname_utf8, propval, FALSE,
pool);
@@ -399,7 +411,7 @@ svn_cl__propget(apr_getopt_t *os,
SVN_ERR(stream_write(out, printable_val->data,
printable_val->len));
- if (! opt_state->strict)
+ if (! opt_state->no_newline)
SVN_ERR(stream_write(out, APR_EOL_STR, strlen(APR_EOL_STR)));
}
}
@@ -415,15 +427,16 @@ svn_cl__propget(apr_getopt_t *os,
if (opt_state->depth == svn_depth_unknown)
opt_state->depth = svn_depth_empty;
- /* Strict mode only makes sense for a single target. So make
+ /* No-newline mode only makes sense for a single target. So make
sure we have only a single target, and that we're not being
asked to recurse on that target. */
- if (opt_state->strict
- && ((targets->nelts > 1) || (opt_state->depth != svn_depth_empty)))
+ if (opt_state->no_newline
+ && ((targets->nelts > 1) || (opt_state->depth != svn_depth_empty)
+ || (opt_state->show_inherited_props)))
return svn_error_create
(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Strict output of property values only available for single-"
- "target, non-recursive propget operations"));
+ _("--no-newline is only available for single-target,"
+ " non-recursive propget operations"));
for (i = 0; i < targets->nelts; i++)
{
@@ -459,15 +472,30 @@ svn_cl__propget(apr_getopt_t *os,
/* Any time there is more than one thing to print, or where
the path associated with a printed thing is not obvious,
we'll print filenames. That is, unless we've been told
- not to do so with the --strict option. */
+ not to do so with the --no-newline option. */
print_filenames = ((opt_state->depth > svn_depth_empty
|| targets->nelts > 1
|| apr_hash_count(props) > 1
|| opt_state->verbose
|| opt_state->show_inherited_props)
- && (! opt_state->strict));
- omit_newline = opt_state->strict;
- like_proplist = opt_state->verbose && !opt_state->strict;
+ && (! opt_state->no_newline));
+ omit_newline = opt_state->no_newline;
+ like_proplist = opt_state->verbose && !opt_state->no_newline;
+
+ /* If there are no properties, and exactly one node was queried,
+ then warn. */
+ if (opt_state->depth == svn_depth_empty
+ && !opt_state->show_inherited_props
+ && apr_hash_count(props) == 0)
+ {
+ svn_error_t *err;
+ err = svn_error_createf(SVN_ERR_PROPERTY_NOT_FOUND, NULL,
+ _("Property '%s' not found on '%s'"),
+ pname_utf8, target);
+ svn_handle_warning2(stderr, err, "svn: ");
+ svn_error_clear(err);
+ warned = TRUE;
+ }
if (opt_state->xml)
SVN_ERR(print_properties_xml(
@@ -489,5 +517,8 @@ svn_cl__propget(apr_getopt_t *os,
svn_pool_destroy(subpool);
}
+ if (warned)
+ return svn_error_create(SVN_ERR_BASE, NULL, NULL);
+
return SVN_NO_ERROR;
}
diff --git a/subversion/svn/proplist-cmd.c b/subversion/svn/proplist-cmd.c
index fe23a67..80e0364 100644
--- a/subversion/svn/proplist-cmd.c
+++ b/subversion/svn/proplist-cmd.c
@@ -83,7 +83,7 @@ proplist_receiver_xml(void *baton,
name_local = svn_dirent_local_style(iprop->path_or_url, iterpool);
svn_xml_make_open_tag(&sb, iterpool, svn_xml_normal, "target",
- "path", name_local, NULL);
+ "path", name_local, SVN_VA_NULL);
SVN_ERR(svn_cmdline__print_xml_prop_hash(&sb, iprop->prop_hash,
(! opt_state->verbose),
TRUE, iterpool));
@@ -105,7 +105,7 @@ proplist_receiver_xml(void *baton,
{
/* "<target ...>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "target",
- "path", name_local, NULL);
+ "path", name_local, SVN_VA_NULL);
SVN_ERR(svn_cmdline__print_xml_prop_hash(&sb, prop_hash,
(! opt_state->verbose),
@@ -230,7 +230,7 @@ svn_cl__proplist(apr_getopt_t *os,
svn_xml_make_open_tag(&sb, scratch_pool, svn_xml_normal,
"revprops",
- "rev", revstr, NULL);
+ "rev", revstr, SVN_VA_NULL);
SVN_ERR(svn_cmdline__print_xml_prop_hash(&sb, proplist,
(! opt_state->verbose),
FALSE, scratch_pool));
@@ -299,7 +299,7 @@ svn_cl__proplist(apr_getopt_t *os,
errors, opt_state->quiet,
SVN_ERR_UNVERSIONED_RESOURCE,
SVN_ERR_ENTRY_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
}
svn_pool_destroy(iterpool);
diff --git a/subversion/svn/props.c b/subversion/svn/props.c
index 2a41ac8..b4a75f5 100644
--- a/subversion/svn/props.c
+++ b/subversion/svn/props.c
@@ -112,59 +112,6 @@ svn_cl__check_boolean_prop_val(const char *propname, const char *propval,
}
}
-
-/* Context for sorting property names */
-struct simprop_context_t
-{
- svn_string_t name; /* The name of the property we're comparing with */
- svn_membuf_t buffer; /* Buffer for similarity testing */
-};
-
-struct simprop_t
-{
- const char *propname; /* The original svn: property name */
- svn_string_t name; /* The property name without the svn: prefix */
- unsigned int score; /* The similarity score */
- apr_size_t diff; /* Number of chars different from context.name */
- struct simprop_context_t *context; /* Sorting context for qsort() */
-};
-
-/* Similarity test between two property names */
-static APR_INLINE unsigned int
-simprop_key_diff(const svn_string_t *key, const svn_string_t *ctx,
- svn_membuf_t *buffer, apr_size_t *diff)
-{
- apr_size_t lcs;
- const unsigned int score = svn_string__similarity(key, ctx, buffer, &lcs);
- if (key->len > ctx->len)
- *diff = key->len - lcs;
- else
- *diff = ctx->len - lcs;
- return score;
-}
-
-/* Key comparator for qsort for simprop_t */
-static int
-simprop_compare(const void *pkeya, const void *pkeyb)
-{
- struct simprop_t *const keya = *(struct simprop_t *const *)pkeya;
- struct simprop_t *const keyb = *(struct simprop_t *const *)pkeyb;
- struct simprop_context_t *const context = keya->context;
-
- if (keya->score == -1)
- keya->score = simprop_key_diff(&keya->name, &context->name,
- &context->buffer, &keya->diff);
- if (keyb->score == -1)
- keyb->score = simprop_key_diff(&keyb->name, &context->name,
- &context->buffer, &keyb->diff);
-
- return (keya->score < keyb->score ? 1
- : (keya->score > keyb->score ? -1
- : (keya->diff > keyb->diff ? 1
- : (keya->diff < keyb->diff ? -1 : 0))));
-}
-
-
static const char*
force_prop_option_message(svn_cl__prop_use_t prop_use, const char *prop_name,
apr_pool_t *scratch_pool)
@@ -174,18 +121,18 @@ force_prop_option_message(svn_cl__prop_use_t prop_use, const char *prop_name,
case svn_cl__prop_use_set:
return apr_psprintf(
scratch_pool,
- _("(To set the '%s' property, re-run with '--force'.)"),
+ _("Use '--force' to set the '%s' property."),
prop_name);
case svn_cl__prop_use_edit:
return apr_psprintf(
scratch_pool,
- _("(To edit the '%s' property, re-run with '--force'.)"),
+ _("Use '--force' to edit the '%s' property."),
prop_name);
case svn_cl__prop_use_use:
default:
return apr_psprintf(
scratch_pool,
- _("(To use the '%s' property, re-run with '--force'.)"),
+ _("Use '--force' to use the '%s' property'."),
prop_name);
}
}
@@ -199,21 +146,18 @@ wrong_prop_error_message(svn_cl__prop_use_t prop_use, const char *prop_name,
case svn_cl__prop_use_set:
return apr_psprintf(
scratch_pool,
- _("'%s' is not a valid %s property name;"
- " re-run with '--force' to set it"),
+ _("'%s' is not a valid %s property name; use '--force' to set it"),
prop_name, SVN_PROP_PREFIX);
case svn_cl__prop_use_edit:
return apr_psprintf(
scratch_pool,
- _("'%s' is not a valid %s property name;"
- " re-run with '--force' to edit it"),
+ _("'%s' is not a valid %s property name; use '--force' to edit it"),
prop_name, SVN_PROP_PREFIX);
case svn_cl__prop_use_use:
default:
return apr_psprintf(
scratch_pool,
- _("'%s' is not a valid %s property name;"
- " re-run with '--force' to use it"),
+ _("'%s' is not a valid %s property name; use '--force' to use it"),
prop_name, SVN_PROP_PREFIX);
}
}
@@ -239,33 +183,34 @@ svn_cl__check_svn_prop_name(const char *propname,
const char *const *const proplist = (revprop ? revprops : nodeprops);
const apr_size_t numprops = (revprop ? revprops_len : nodeprops_len);
- struct simprop_t **propkeys;
- struct simprop_t *propbuf;
+ svn_cl__simcheck_t **propkeys;
+ svn_cl__simcheck_t *propbuf;
apr_size_t i;
- struct simprop_context_t context;
+ svn_string_t propstring;
svn_string_t prefix;
+ svn_membuf_t buffer;
- context.name.data = propname;
- context.name.len = strlen(propname);
+ propstring.data = propname;
+ propstring.len = strlen(propname);
prefix.data = SVN_PROP_PREFIX;
prefix.len = strlen(SVN_PROP_PREFIX);
- svn_membuf__create(&context.buffer, 0, scratch_pool);
+ svn_membuf__create(&buffer, 0, scratch_pool);
/* First, check if the name is even close to being in the svn: namespace.
It must contain a colon in the right place, and we only allow
one-char typos or a single transposition. */
- if (context.name.len < prefix.len
- || context.name.data[prefix.len - 1] != prefix.data[prefix.len - 1])
+ if (propstring.len < prefix.len
+ || propstring.data[prefix.len - 1] != prefix.data[prefix.len - 1])
return SVN_NO_ERROR; /* Wrong prefix, ignore */
else
{
apr_size_t lcs;
- const apr_size_t name_len = context.name.len;
- context.name.len = prefix.len; /* Only check up to the prefix length */
- svn_string__similarity(&context.name, &prefix, &context.buffer, &lcs);
- context.name.len = name_len; /* Restore the original propname length */
+ const apr_size_t name_len = propstring.len;
+ propstring.len = prefix.len; /* Only check up to the prefix length */
+ svn_string__similarity(&propstring, &prefix, &buffer, &lcs);
+ propstring.len = name_len; /* Restore the original propname length */
if (lcs < prefix.len - 1)
return SVN_NO_ERROR; /* Wrong prefix, ignore */
@@ -276,11 +221,11 @@ svn_cl__check_svn_prop_name(const char *propname,
for (i = 0; i < numprops; ++i)
{
if (0 == strcmp(proplist[i] + prefix.len, propname + prefix.len))
- return svn_error_createf(
+ return svn_error_quick_wrap(svn_error_createf(
SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
_("'%s' is not a valid %s property name;"
- " did you mean '%s'?\n%s"),
- propname, SVN_PROP_PREFIX, proplist[i],
+ " did you mean '%s'?"),
+ propname, SVN_PROP_PREFIX, proplist[i]),
force_prop_option_message(prop_use, propname, scratch_pool));
}
return SVN_NO_ERROR;
@@ -292,65 +237,59 @@ svn_cl__check_svn_prop_name(const char *propname,
we already know that it's the same and looking at it would only
skew the results. */
propkeys = apr_palloc(scratch_pool,
- numprops * sizeof(struct simprop_t*));
+ numprops * sizeof(svn_cl__simcheck_t*));
propbuf = apr_palloc(scratch_pool,
- numprops * sizeof(struct simprop_t));
- context.name.data += prefix.len;
- context.name.len -= prefix.len;
+ numprops * sizeof(svn_cl__simcheck_t));
+ propstring.data += prefix.len;
+ propstring.len -= prefix.len;
for (i = 0; i < numprops; ++i)
{
propkeys[i] = &propbuf[i];
- propbuf[i].propname = proplist[i];
- propbuf[i].name.data = proplist[i] + prefix.len;
- propbuf[i].name.len = strlen(propbuf[i].name.data);
- propbuf[i].score = (unsigned int)-1;
- propbuf[i].context = &context;
+ propbuf[i].token.data = proplist[i] + prefix.len;
+ propbuf[i].token.len = strlen(propbuf[i].token.data);
+ propbuf[i].data = proplist[i];
}
- qsort(propkeys, numprops, sizeof(*propkeys), simprop_compare);
-
- if (0 == propkeys[0]->diff)
- return SVN_NO_ERROR; /* We found an exact match. */
-
- /* See if we can suggest a sane alternative spelling */
- for (i = 0; i < numprops; ++i)
- if (propkeys[i]->score < 666) /* 2/3 similarity required */
- break;
-
- switch (i)
+ switch (svn_cl__similarity_check(
+ propstring.data, propkeys, numprops, scratch_pool))
{
case 0:
+ return SVN_NO_ERROR; /* We found an exact match. */
+
+ case 1:
/* The best alternative isn't good enough */
return svn_error_create(
SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
wrong_prop_error_message(prop_use, propname, scratch_pool));
- case 1:
+ case 2:
/* There is only one good candidate */
- return svn_error_createf(
+ return svn_error_quick_wrap(svn_error_createf(
SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
- _("'%s' is not a valid %s property name; did you mean '%s'?\n%s"),
- propname, SVN_PROP_PREFIX, propkeys[0]->propname,
+ _("'%s' is not a valid %s property name; did you mean '%s'?"),
+ propname, SVN_PROP_PREFIX,
+ (const char *)propkeys[0]->data),
force_prop_option_message(prop_use, propname, scratch_pool));
- case 2:
+ case 3:
/* Suggest a list of the most likely candidates */
- return svn_error_createf(
+ return svn_error_quick_wrap(svn_error_createf(
SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
- _("'%s' is not a valid %s property name\n"
- "Did you mean '%s' or '%s'?\n%s"),
+ _("'%s' is not a valid %s property name; "
+ "did you mean '%s' or '%s'?"),
propname, SVN_PROP_PREFIX,
- propkeys[0]->propname, propkeys[1]->propname,
+ (const char *)propkeys[0]->data, (const char *)propkeys[1]->data),
force_prop_option_message(prop_use, propname, scratch_pool));
default:
/* Never suggest more than three candidates */
- return svn_error_createf(
+ return svn_error_quick_wrap(svn_error_createf(
SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
- _("'%s' is not a valid %s property name\n"
- "Did you mean '%s', '%s' or '%s'?\n%s"),
+ _("'%s' is not a valid %s property name; "
+ "did you mean '%s', '%s' or '%s'?"),
propname, SVN_PROP_PREFIX,
- propkeys[0]->propname, propkeys[1]->propname, propkeys[2]->propname,
+ (const char *)propkeys[0]->data,
+ (const char *)propkeys[1]->data, (const char *)propkeys[2]->data),
force_prop_option_message(prop_use, propname, scratch_pool));
}
}
diff --git a/subversion/svn/resolve-cmd.c b/subversion/svn/resolve-cmd.c
index ce4818e..035bf29 100644
--- a/subversion/svn/resolve-cmd.c
+++ b/subversion/svn/resolve-cmd.c
@@ -123,7 +123,7 @@ svn_cl__resolve(apr_getopt_t *os,
svn_pool_destroy(iterpool);
if (had_error)
- return svn_error_create(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, NULL,
+ return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("Failure occurred resolving one or more "
"conflicts"));
diff --git a/subversion/svn/revert-cmd.c b/subversion/svn/revert-cmd.c
index d17aeb6..74d7ff1 100644
--- a/subversion/svn/revert-cmd.c
+++ b/subversion/svn/revert-cmd.c
@@ -67,8 +67,11 @@ svn_cl__revert(apr_getopt_t *os,
SVN_ERR(svn_cl__check_targets_are_local_paths(targets));
- err = svn_client_revert2(targets, opt_state->depth,
- opt_state->changelists, ctx, scratch_pool);
+ err = svn_client_revert3(targets, opt_state->depth,
+ opt_state->changelists,
+ FALSE /* clear_changelists */,
+ FALSE /* metadata_only */,
+ ctx, scratch_pool);
if (err
&& (err->apr_err == SVN_ERR_WC_INVALID_OPERATION_DEPTH)
&& (! SVN_DEPTH_IS_RECURSIVE(opt_state->depth)))
diff --git a/subversion/svn/similarity.c b/subversion/svn/similarity.c
new file mode 100644
index 0000000..0bcf0f5
--- /dev/null
+++ b/subversion/svn/similarity.c
@@ -0,0 +1,126 @@
+/*
+ * similarity.c: Utility functions for finding similar strings in lists
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include <stdlib.h>
+
+#include "svn_string.h"
+#include "cl.h"
+
+#include "private/svn_string_private.h"
+
+#include "svn_private_config.h"
+
+
+/* Context for token similarity checking */
+struct svn_cl__simcheck_context_t
+{
+ svn_string_t key; /* The token we're comparing with */
+ svn_membuf_t buffer; /* Buffer for similarity testing */
+};
+
+
+/* Similarity test between two property names */
+static APR_INLINE apr_size_t
+simcheck_key_diff(const svn_string_t *key, const svn_string_t *ctx,
+ svn_membuf_t *buffer, apr_size_t *diff)
+{
+ apr_size_t lcs;
+ const apr_size_t score = svn_string__similarity(key, ctx, buffer, &lcs);
+ if (key->len > ctx->len)
+ *diff = key->len - lcs;
+ else
+ *diff = ctx->len - lcs;
+ return score;
+}
+
+
+/* Key comparator for qsort for svn_cl__simcheck_t */
+static int
+simcheck_compare(const void *pkeya, const void *pkeyb)
+{
+ svn_cl__simcheck_t *const keya = *(svn_cl__simcheck_t *const *)pkeya;
+ svn_cl__simcheck_t *const keyb = *(svn_cl__simcheck_t *const *)pkeyb;
+ svn_cl__simcheck_context_t *const context = keya->context;
+
+ if (keya->score == -1)
+ keya->score = simcheck_key_diff(&keya->token, &context->key,
+ &context->buffer, &keya->diff);
+ if (keyb->score == -1)
+ keyb->score = simcheck_key_diff(&keyb->token, &context->key,
+ &context->buffer, &keyb->diff);
+
+ return (keya->score < keyb->score ? 1
+ : (keya->score > keyb->score ? -1
+ : (keya->diff > keyb->diff ? 1
+ : (keya->diff < keyb->diff ? -1 : 0))));
+}
+
+apr_size_t
+svn_cl__similarity_check(const char *key,
+ svn_cl__simcheck_t **tokens,
+ apr_size_t token_count,
+ apr_pool_t *scratch_pool)
+{
+ apr_size_t result;
+ apr_size_t i;
+
+ svn_cl__simcheck_context_t context;
+ context.key.data = key;
+ context.key.len = strlen(key);
+ svn_membuf__create(&context.buffer, 0, scratch_pool);
+
+ /* Populate the score, diff and context members. */
+ for (i = 0; i < token_count; ++i)
+ {
+ svn_cl__simcheck_t *const token = tokens[i];
+ token->score = -1;
+ token->diff = 0;
+ token->context = &context;
+ }
+
+ /* Sort the tokens by similarity. */
+ qsort(tokens, token_count, sizeof(*tokens), simcheck_compare);
+
+ /* Remove references to the context, since it points to the stack,
+ and calculate the number of results that are at least two-thirds
+ similar to the key. */
+ for (i = 0, result = 1; i < token_count; ++i)
+ {
+ svn_cl__simcheck_t *const token = tokens[i];
+ token->context = NULL;
+ /* If you update this factor, consider updating
+ * ../libsvn_subr/cmdline.c:most_similar(). */
+ if (token->score >= (2 * SVN_STRING__SIM_RANGE_MAX + 1) / 3)
+ ++result;
+ }
+
+ if (0 == tokens[0]->diff)
+ return 0; /* We found an exact match. */
+ return result;
+}
diff --git a/subversion/svn/status-cmd.c b/subversion/svn/status-cmd.c
index 9840cd2..7692eb3 100644
--- a/subversion/svn/status-cmd.c
+++ b/subversion/svn/status-cmd.c
@@ -115,7 +115,7 @@ print_start_target_xml(const char *target, apr_pool_t *pool)
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "target",
- "path", target, NULL);
+ "path", target, SVN_VA_NULL);
return svn_cl__error_checked_fputs(sb->data, stdout);
}
@@ -135,7 +135,7 @@ print_finish_target_xml(svn_revnum_t repos_rev,
const char *repos_rev_str;
repos_rev_str = apr_psprintf(pool, "%ld", repos_rev);
svn_xml_make_open_tag(&sb, pool, svn_xml_self_closing, "against",
- "revision", repos_rev_str, NULL);
+ "revision", repos_rev_str, SVN_VA_NULL);
}
svn_xml_make_close_tag(&sb, pool, "target");
@@ -187,7 +187,7 @@ print_status(void *baton,
* ### _read_info() returns. The svn_wc_status_func4_t callback is
* ### suppposed to handle the gathering of additional information from the
* ### WORKING nodes on its own. Until we've agreed on how the CLI should
- * ### handle the revision information, we use this appproach to stay compat
+ * ### handle the revision information, we use this approach to stay compat
* ### with our testsuite. */
if (status->versioned
&& !SVN_IS_VALID_REVNUM(status->revision)
@@ -288,8 +288,15 @@ svn_cl__status(apr_getopt_t *os,
SVN_ERR(svn_cl__check_targets_are_local_paths(targets));
- /* We want our -u statuses to be against HEAD. */
- rev.kind = svn_opt_revision_head;
+ /* We want our -u statuses to be against HEAD by default. */
+ if (opt_state->start_revision.kind == svn_opt_revision_unspecified)
+ rev.kind = svn_opt_revision_head;
+ else if (! opt_state->update)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--revision (-r) option valid only with "
+ "--show-updates (-u) option"));
+ else
+ rev = opt_state->start_revision;
sb.had_print_error = FALSE;
@@ -345,10 +352,11 @@ svn_cl__status(apr_getopt_t *os,
/* Retrieve a hash of status structures with the information
requested by the user. */
- SVN_ERR(svn_cl__try(svn_client_status5(&repos_rev, ctx, target, &rev,
+ SVN_ERR(svn_cl__try(svn_client_status6(&repos_rev, ctx, target, &rev,
opt_state->depth,
opt_state->verbose,
opt_state->update,
+ TRUE /* check_working_copy */,
opt_state->no_ignore,
opt_state->ignore_externals,
FALSE /* depth_as_sticky */,
@@ -359,13 +367,13 @@ svn_cl__status(apr_getopt_t *os,
/* not versioned: */
SVN_ERR_WC_NOT_WORKING_COPY,
SVN_ERR_WC_PATH_NOT_FOUND,
- SVN_NO_ERROR));
+ 0));
if (opt_state->xml)
SVN_ERR(print_finish_target_xml(repos_rev, iterpool));
}
- /* If any paths were cached because they were associatied with
+ /* If any paths were cached because they were associated with
changelists, we can now display them as grouped changelists. */
if (apr_hash_count(master_cl_hash) > 0)
{
@@ -378,8 +386,8 @@ svn_cl__status(apr_getopt_t *os,
for (hi = apr_hash_first(scratch_pool, master_cl_hash); hi;
hi = apr_hash_next(hi))
{
- const char *changelist_name = svn__apr_hash_index_key(hi);
- apr_array_header_t *path_array = svn__apr_hash_index_val(hi);
+ const char *changelist_name = apr_hash_this_key(hi);
+ apr_array_header_t *path_array = apr_hash_this_val(hi);
int j;
/* ### TODO: For non-XML output, we shouldn't print the
@@ -390,7 +398,7 @@ svn_cl__status(apr_getopt_t *os,
svn_stringbuf_setempty(buf);
svn_xml_make_open_tag(&buf, scratch_pool, svn_xml_normal,
"changelist", "name", changelist_name,
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_cl__error_checked_fputs(buf->data, stdout));
}
else
diff --git a/subversion/svn/status.c b/subversion/svn/status.c
index 9f1ad34..9ab9c59 100644
--- a/subversion/svn/status.c
+++ b/subversion/svn/status.c
@@ -138,37 +138,38 @@ generate_status_desc(enum svn_wc_status_kind status)
/* Make a relative path containing '..' elements as needed.
TARGET_ABSPATH shall be the absolute version of TARGET_PATH.
- TARGET_ABSPATH, TARGET_PATH and PATH shall be canonical.
+ TARGET_ABSPATH, TARGET_PATH and LOCAL_ABSPATH shall be canonical
If above conditions are met, a relative path that leads to PATH
from TARGET_PATH is returned, but there is no error checking involved.
The returned path is allocated from RESULT_POOL, all other
- allocations are made in SCRATCH_POOL. */
+ allocations are made in SCRATCH_POOL.
+
+ Note that it is not possible to just join the resulting path to
+ reconstruct the real path as the "../" paths are relative from
+ a different base than the normal relative paths!
+ */
static const char *
make_relpath(const char *target_abspath,
const char *target_path,
- const char *path,
+ const char *local_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *la;
const char *parent_dir_els = "";
- const char *abspath, *relative;
- svn_error_t *err = svn_dirent_get_absolute(&abspath, path, scratch_pool);
+ const char *t_relpath;
+ const char *p_relpath;
- if (err)
- {
- /* We probably got passed some invalid path. */
- svn_error_clear(err);
- return apr_pstrdup(result_pool, path);
- }
+#ifdef SVN_DEBUG
+ SVN_ERR_ASSERT_NO_RETURN(svn_dirent_is_absolute(local_abspath));
+#endif
- relative = svn_dirent_skip_ancestor(target_abspath, abspath);
- if (relative)
- {
- return svn_dirent_join(target_path, relative, result_pool);
- }
+ t_relpath = svn_dirent_skip_ancestor(target_abspath, local_abspath);
+
+ if (t_relpath)
+ return svn_dirent_join(target_path, t_relpath, result_pool);
/* An example:
* relative_to_path = /a/b/c
@@ -180,17 +181,16 @@ make_relpath(const char *target_abspath,
* path = C:/wc
* result = C:/wc
*/
-
/* Skip the common ancestor of both paths, here '/a'. */
- la = svn_dirent_get_longest_ancestor(target_abspath, abspath,
+ la = svn_dirent_get_longest_ancestor(target_abspath, local_abspath,
scratch_pool);
if (*la == '\0')
{
/* Nothing in common: E.g. C:/ vs F:/ on Windows */
- return apr_pstrdup(result_pool, path);
+ return apr_pstrdup(result_pool, local_abspath);
}
- relative = svn_dirent_skip_ancestor(la, target_abspath);
- path = svn_dirent_skip_ancestor(la, path);
+ t_relpath = svn_dirent_skip_ancestor(la, target_abspath);
+ p_relpath = svn_dirent_skip_ancestor(la, local_abspath);
/* In above example, we'd now have:
* relative_to_path = b/c
@@ -198,14 +198,14 @@ make_relpath(const char *target_abspath,
/* Count the elements of relative_to_path and prepend as many '..' elements
* to path. */
- while (*relative)
+ while (*t_relpath)
{
- svn_dirent_split(&relative, NULL, relative,
- scratch_pool);
+ t_relpath = svn_dirent_dirname(t_relpath, scratch_pool);
parent_dir_els = svn_dirent_join(parent_dir_els, "..", scratch_pool);
}
- return svn_dirent_join(parent_dir_els, path, result_pool);
+ /* This returns a ../ style path relative from the status target */
+ return svn_dirent_join(parent_dir_els, p_relpath, result_pool);
}
@@ -232,8 +232,6 @@ print_status(const char *target_abspath,
const char *moved_from_line = "";
const char *moved_to_line = "";
- path = make_relpath(target_abspath, target_path, path, pool, pool);
-
/* For historic reasons svn ignores the property status for added nodes, even
if these nodes were copied and have local property changes.
@@ -317,7 +315,7 @@ print_status(const char *target_abspath,
apr_psprintf(pool,
_("swapped places with %s"),
relpath),
- (char *)NULL);
+ SVN_VA_NULL);
}
else if (status->moved_from_abspath || status->moved_to_abspath)
{
@@ -332,7 +330,7 @@ print_status(const char *target_abspath,
moved_from_line = apr_pstrcat(pool, "\n > ",
apr_psprintf(pool, _("moved from %s"),
relpath),
- (char *)NULL);
+ SVN_VA_NULL);
}
if (status->moved_to_abspath)
@@ -344,7 +342,7 @@ print_status(const char *target_abspath,
moved_to_line = apr_pstrcat(pool, "\n > ",
apr_psprintf(pool, _("moved to %s"),
relpath),
- (char *)NULL);
+ SVN_VA_NULL);
}
}
@@ -487,10 +485,9 @@ svn_cl__print_status_xml(const char *target_abspath,
SVN_ERR(svn_wc_conflicted_p3(NULL, NULL, &tree_conflicted,
ctx->wc_ctx, local_abspath, pool));
- path = make_relpath(target_abspath, target_path, path, pool, pool);
-
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "entry",
- "path", svn_dirent_local_style(path, pool), NULL);
+ "path", svn_dirent_local_style(path, pool),
+ SVN_VA_NULL);
att_hash = apr_hash_make(pool);
svn_hash_sets(att_hash, "item",
@@ -560,7 +557,7 @@ svn_cl__print_status_xml(const char *target_abspath,
generate_status_desc(combined_repos_status(status)),
"props",
generate_status_desc(status->repos_prop_status),
- NULL);
+ SVN_VA_NULL);
if (status->repos_lock)
svn_cl__print_xml_lock(&sb, status->repos_lock, pool);
diff --git a/subversion/svn/svn.c b/subversion/svn/svn.c
index 38d4ce1..058be70 100644
--- a/subversion/svn/svn.c
+++ b/subversion/svn/svn.c
@@ -110,7 +110,7 @@ typedef enum svn_cl__longopt_t {
opt_remove,
opt_revprop,
opt_stop_on_copy,
- opt_strict,
+ opt_strict, /* ### DEPRECATED */
opt_targets,
opt_depth,
opt_set_depth,
@@ -125,6 +125,7 @@ typedef enum svn_cl__longopt_t {
opt_show_revs,
opt_reintegrate,
opt_trust_server_cert,
+ opt_trust_server_cert_failures,
opt_strip,
opt_ignore_keywords,
opt_reverse_diff,
@@ -134,7 +135,14 @@ typedef enum svn_cl__longopt_t {
opt_include_externals,
opt_show_inherited_props,
opt_search,
- opt_search_and
+ opt_search_and,
+ opt_mergeinfo_log,
+ opt_remove_unversioned,
+ opt_remove_ignored,
+ opt_no_newline,
+ opt_show_passwords,
+ opt_pin_externals,
+ opt_show_item,
} svn_cl__longopt_t;
@@ -186,7 +194,10 @@ const apr_getopt_option_t svn_cl__options[] =
{"verbose", 'v', 0, N_("print extra information")},
{"show-updates", 'u', 0, N_("display update information")},
{"username", opt_auth_username, 1, N_("specify a username ARG")},
- {"password", opt_auth_password, 1, N_("specify a password ARG")},
+ {"password", opt_auth_password, 1,
+ N_("specify a password ARG (caution: on many operating\n"
+ " "
+ "systems, other users will be able to see this)")},
{"extensions", 'x', 1,
N_("Specify differencing options for external diff or\n"
" "
@@ -204,6 +215,8 @@ const apr_getopt_option_t svn_cl__options[] =
" "
" --ignore-eol-style: Ignore changes in EOL style\n"
" "
+ " -U ARG, --context ARG: Show ARG lines of context\n"
+ " "
" -p, --show-c-function: Show C function name")},
{"targets", opt_targets, 1,
N_("pass contents of file ARG as additional args")},
@@ -216,7 +229,7 @@ const apr_getopt_option_t svn_cl__options[] =
" "
"'empty', 'files', 'immediates', or 'infinity')")},
{"xml", opt_xml, 0, N_("output in XML")},
- {"strict", opt_strict, 0, N_("use strict semantics")},
+ {"strict", opt_strict, 0, N_("DEPRECATED")},
{"stop-on-copy", opt_stop_on_copy, 0,
N_("do not cross copies while traversing history")},
{"no-ignore", opt_no_ignore, 0,
@@ -226,11 +239,23 @@ const apr_getopt_option_t svn_cl__options[] =
{"no-auth-cache", opt_no_auth_cache, 0,
N_("do not cache authentication tokens")},
{"trust-server-cert", opt_trust_server_cert, 0,
- N_("accept SSL server certificates from unknown\n"
+ N_("deprecated; same as\n"
+ " "
+ "--trust-server-cert-failures=unknown-ca")},
+ {"trust-server-cert-failures", opt_trust_server_cert_failures, 1,
+ N_("with --non-interactive, accept SSL server\n"
+ " "
+ "certificates with failures; ARG is comma-separated\n"
+ " "
+ "list of 'unknown-ca' (Unknown Authority),\n"
" "
- "certificate authorities without prompting (but only\n"
+ "'cn-mismatch' (Hostname mismatch), 'expired'\n"
" "
- "with '--non-interactive')") },
+ "(Expired certificate), 'not-yet-valid' (Not yet\n"
+ " "
+ "valid certificate) and 'other' (all other not\n"
+ " "
+ "separately classified certificate errors).")},
{"non-interactive", opt_non_interactive, 0,
N_("do no interactive prompting (default is to prompt\n"
" "
@@ -369,17 +394,36 @@ const apr_getopt_option_t svn_cl__options[] =
" "
"Please run 'svn update' instead.")},
{"include-externals", opt_include_externals, 0,
- N_("Also commit file and dir externals reached by\n"
+ N_("also operate on externals defined by\n"
" "
- "recursion. This does not include externals with a\n"
- " "
- "fixed revision. (See the svn:externals property)")},
+ "svn:externals properties")},
{"show-inherited-props", opt_show_inherited_props, 0,
- N_("retrieve target's inherited properties")},
+ N_("retrieve properties set on parents of the target")},
{"search", opt_search, 1,
N_("use ARG as search pattern (glob syntax)")},
{"search-and", opt_search_and, 1,
N_("combine ARG with the previous search pattern")},
+ {"log", opt_mergeinfo_log, 0,
+ N_("show revision log message, author and date")},
+ {"remove-unversioned", opt_remove_unversioned, 0,
+ N_("remove unversioned items")},
+ {"remove-ignored", opt_remove_ignored, 0, N_("remove ignored items")},
+ {"no-newline", opt_no_newline, 0, N_("do not output the trailing newline")},
+ {"show-passwords", opt_show_passwords, 0, N_("show cached passwords")},
+ {"pin-externals", opt_pin_externals, 0,
+ N_("pin externals with no explicit revision to their\n"
+ " "
+ "current revision (recommended when tagging)")},
+ {"show-item", opt_show_item, 1,
+ N_("print only the item identified by ARG ('kind',\n"
+ " "
+ "'url', 'relative-url', 'repos-root-url',\n"
+ " "
+ "'repos-uuid', 'revision', 'last-changed-revision',\n"
+ " "
+ "'last-changed-date', 'last-changed-author',\n"
+ " "
+ "'wc-root')")},
/* Long-opt Aliases
*
@@ -412,8 +456,9 @@ const apr_getopt_option_t svn_cl__options[] =
willy-nilly to every invocation of 'svn') . */
const int svn_cl__global_options[] =
{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
- opt_force_interactive, opt_trust_server_cert, opt_config_dir,
- opt_config_options, 0
+ opt_force_interactive, opt_trust_server_cert,
+ opt_trust_server_cert_failures,
+ opt_config_dir, opt_config_options, 0
};
/* Options for giving a log message. (Some of these also have other uses.)
@@ -434,13 +479,54 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
opt_no_autoprops, opt_parents },
{{opt_parents, N_("add intermediate parents")}} },
+ { "auth", svn_cl__auth, {0}, N_
+ ("Manage cached authentication credentials.\n"
+ "usage: 1. svn auth [PATTERN ...]\n"
+ "usage: 2. svn auth --remove PATTERN [PATTERN ...]\n"
+ "\n"
+ " With no arguments, list all cached authentication credentials.\n"
+ " Authentication credentials include usernames, passwords,\n"
+ " SSL certificates, and SSL client-certificate passphrases.\n"
+ " If PATTERN is specified, only list credentials with attributes matching one\n"
+ " or more patterns. With the --remove option, remove cached authentication\n"
+ " credentials matching one or more patterns.\n"
+ "\n"
+ " If more than one pattern is specified credentials are considered only they\n"
+ " match all specified patterns. Patterns are matched case-sensitively and may\n"
+ " contain glob wildcards:\n"
+ " ? matches any single character\n"
+ " * matches a sequence of arbitrary characters\n"
+ " [abc] matches any of the characters listed inside the brackets\n"
+ " Note that wildcards will usually need to be quoted or escaped on the\n"
+ " command line because many command shells will interfere by trying to\n"
+ " expand them.\n"),
+ { opt_remove, opt_show_passwords },
+ { {opt_remove, N_("remove matching authentication credentials")} }
+
+ },
+
{ "blame", svn_cl__blame, {"praise", "annotate", "ann"}, N_
- ("Output the content of specified files or\n"
- "URLs with revision and author information in-line.\n"
- "usage: blame TARGET[@REV]...\n"
+ ("Show when each line of a file was last (or\n"
+ "next) changed.\n"
+ "usage: blame [-rM:N] TARGET[@REV]...\n"
+ "\n"
+ " Annotate each line of a file with the revision number and author of the\n"
+ " last change (or optionally the next change) to that line.\n"
+ "\n"
+ " With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n"
+ " annotate each line that is present in revision N of the file, with\n"
+ " the last revision at or before rN that changed or added the line,\n"
+ " looking back no further than rM.\n"
+ "\n"
+ " With a reverse revision range '-r M:N' where M > N,\n"
+ " annotate each line that is present in revision N of the file, with\n"
+ " the next revision after rN that changed or deleted the line,\n"
+ " looking forward no further than rM.\n"
"\n"
" If specified, REV determines in which revision the target is first\n"
- " looked up.\n"),
+ " looked up.\n"
+ "\n"
+ " Write the annotated result to standard output.\n"),
{'r', 'v', 'g', opt_incremental, opt_xml, 'x', opt_force} },
{ "cat", svn_cl__cat, {0}, N_
@@ -449,7 +535,7 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
"\n"
" If specified, REV determines in which revision the target is first\n"
" looked up.\n"),
- {'r'} },
+ {'r', opt_ignore_keywords} },
{ "changelist", svn_cl__changelist, {"cl"}, N_
("Associate (or dissociate) changelist CLNAME with the named files.\n"
@@ -489,16 +575,25 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
"unfinished operations, etc.\n"
"usage: cleanup [WCPATH...]\n"
"\n"
- " Finish any unfinished business in the working copy at WCPATH, and remove\n"
- " write locks (shown as 'L' by the 'svn status' command) from the working\n"
- " copy. Usually, this is only necessary if a Subversion client has crashed\n"
- " while using the working copy, leaving it in an unusable state.\n"
+ " By default, finish any unfinished business in the working copy at WCPATH,\n"
+ " and remove write locks (shown as 'L' by the 'svn status' command) from\n"
+ " the working copy. Usually, this is only necessary if a Subversion client\n"
+ " has crashed while using the working copy, leaving it in an unusable state.\n"
"\n"
" WARNING: There is no mechanism that will protect write locks still\n"
" being used by other Subversion clients. Running this command\n"
" while another client is using the working copy can corrupt\n"
- " the working copy beyond repair!\n"),
- {opt_merge_cmd} },
+ " the working copy beyond repair!\n"
+ "\n"
+ " If the --remove-unversioned option or the --remove-ignored option\n"
+ " is given, remove any unversioned or ignored items within WCPATH.\n"
+ " To prevent accidental working copy corruption, unversioned or ignored\n"
+ " items can only be removed if the working copy is not already locked\n"
+ " for writing by another Subversion client.\n"
+ " Note that the 'svn status' command shows unversioned items as '?',\n"
+ " and ignored items as 'I' if the --no-ignore option is given to it.\n"),
+ {opt_merge_cmd, opt_remove_unversioned, opt_remove_ignored,
+ opt_include_externals, 'q'} },
{ "commit", svn_cl__commit, {"ci"},
N_("Send changes from your working copy to the repository.\n"
@@ -507,7 +602,11 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" A log message must be provided, but it can be empty. If it is not\n"
" given by a --message or --file option, an editor will be started.\n"
" If any targets are (or contain) locked items, those will be\n"
- " unlocked after a successful commit.\n"),
+ " unlocked after a successful commit.\n"
+ "\n"
+ " If --include-externals is given, also commit file and directory\n"
+ " externals reached by recursion. Do not commit externals with a\n"
+ " fixed revision.\n"),
{'q', 'N', opt_depth, opt_targets, opt_no_unlock, SVN_CL__LOG_MSG_OPTIONS,
opt_changelist, opt_keep_changelists, opt_include_externals} },
@@ -528,7 +627,8 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" contact the repository. As such, they may not, by default, be able\n"
" to propagate merge tracking information from the source of the copy\n"
" to the destination.\n"),
- {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
+ {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS,
+ opt_pin_externals} },
{ "delete", svn_cl__delete, {"del", "remove", "rm"}, N_
("Remove files and directories from version control.\n"
@@ -635,8 +735,24 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
"\n"
" Print information about each TARGET (default: '.').\n"
" TARGET may be either a working-copy path or URL. If specified, REV\n"
- " determines in which revision the target is first looked up.\n"),
- {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, opt_changelist}
+ " determines in which revision the target is first looked up.\n"
+ "\n"
+ " With --show-item, print only the value of one item of information\n"
+ " about TARGET. One of the following items can be selected:\n"
+ " kind the kind of TARGET\n"
+ " url the URL of TARGET in the repository\n"
+ " relative-url the repository-relative URL\n"
+ " repos-root-url the repository root URL\n"
+ " repos-uuid the repository UUID\n"
+ " revision the revision of TARGET (defaults to BASE\n"
+ " for working copy paths and HEAD for URLs)\n"
+ " last-changed-revision the most recent revision in which TARGET\n"
+ " was changed\n"
+ " last-changed-date the date of the last-changed revision\n"
+ " last-changed-author the author of the last-changed revision\n"
+ " wc-root the root of TARGET's working copy\n"),
+ {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml,
+ opt_changelist, opt_include_externals, opt_show_item, opt_no_newline}
},
{ "list", svn_cl__list, {"ls"}, N_
@@ -659,8 +775,7 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" Size (in bytes)\n"
" Date and time of the last commit\n"),
{'r', 'v', 'R', opt_depth, opt_incremental, opt_xml,
- opt_include_externals },
- {{opt_include_externals, N_("include externals definitions")}} },
+ opt_include_externals}, },
{ "lock", svn_cl__lock, {0}, N_
("Lock working copy paths or URLs in the repository, so that\n"
@@ -748,12 +863,14 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" Show the log message for the revision in which /branches/foo\n"
" was created:\n"
" svn log --stop-on-copy --limit 1 -r0:HEAD ^/branches/foo\n"),
- {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy, opt_incremental,
- opt_xml, 'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop,
- opt_depth, opt_diff, opt_diff_cmd, opt_internal_diff, 'x', opt_search,
- opt_search_and, },
+ {'r', 'c', 'q', 'v', 'g', opt_targets, opt_stop_on_copy, opt_incremental,
+ opt_xml, 'l', opt_with_all_revprops, opt_with_no_revprops,
+ opt_with_revprop, opt_depth, opt_diff, opt_diff_cmd,
+ opt_internal_diff, 'x', opt_search, opt_search_and },
{{opt_with_revprop, N_("retrieve revision property ARG")},
- {'c', N_("the change made in revision ARG")}} },
+ {'c', N_("the change made in revision ARG")},
+ {'v', N_("also print all affected paths")},
+ {'q', N_("do not print the log message")}} },
{ "merge", svn_cl__merge, {0}, N_
( /* For this large section, let's keep it unindented for easier
@@ -1088,7 +1205,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" repositories.\n"),
{'r', 'c', 'N', opt_depth, 'q', opt_force, opt_dry_run, opt_merge_cmd,
opt_record_only, 'x', opt_ignore_ancestry, opt_accept, opt_reintegrate,
- opt_allow_mixed_revisions, 'v'} },
+ opt_allow_mixed_revisions, 'v'},
+ { { opt_force, N_("force deletions even if deleted contents don't match") } }
+ },
{ "mergeinfo", svn_cl__mergeinfo, {0}, N_
("Display merge-related information.\n"
@@ -1119,7 +1238,8 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" and the default for TARGET is HEAD for a URL or BASE for a WC path.\n"
"\n"
" The depth can be 'empty' or 'infinity'; the default is 'empty'.\n"),
- {'r', 'R', opt_depth, opt_show_revs} },
+ {'r', 'R', 'q', 'v', opt_depth, opt_show_revs, opt_mergeinfo_log,
+ opt_incremental } },
{ "mkdir", svn_cl__mkdir, {0}, N_
("Create a new directory under version control.\n"
@@ -1215,7 +1335,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
"\n"
" 1. Removes versioned props in working copy.\n"
" 2. Removes unversioned remote prop on repos revision.\n"
- " TARGET only determines which repository to access.\n"),
+ " TARGET only determines which repository to access.\n"
+ "\n"
+ " See 'svn help propset' for descriptions of the svn:* special properties.\n"),
{'q', 'R', opt_depth, 'r', opt_revprop, opt_changelist} },
{ "propedit", svn_cl__propedit, {"pedit", "pe"}, N_
@@ -1227,7 +1349,7 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" 2. Edits unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"
- " See 'svn help propset' for more on setting properties.\n"),
+ " See 'svn help propset' for descriptions of the svn:* special properties.\n"),
{'r', opt_revprop, SVN_CL__LOG_MSG_OPTIONS, opt_force} },
{ "propget", svn_cl__propget, {"pget", "pg"}, N_
@@ -1246,13 +1368,15 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" 'empty', the target path is printed on the same line before each value.\n"
"\n"
" By default, an extra newline is printed after the property value so that\n"
- " the output looks pretty. With a single TARGET and depth 'empty', you can\n"
- " use the --strict option to disable this (useful when redirecting a binary\n"
- " property value to a file, for example).\n"),
- {'v', 'R', opt_depth, 'r', opt_revprop, opt_strict, opt_xml,
+ " the output looks pretty. With a single TARGET, depth 'empty' and without\n"
+ " --show-inherited-props, you can use the --no-newline option to disable this\n"
+ " (useful when redirecting a binary property value to a file, for example).\n"
+ "\n"
+ " See 'svn help propset' for descriptions of the svn:* special properties.\n"),
+ {'v', 'R', opt_depth, 'r', opt_revprop, opt_strict, opt_no_newline, opt_xml,
opt_changelist, opt_show_inherited_props },
{{'v', N_("print path, name and value on separate lines")},
- {opt_strict, N_("don't print an extra newline")}} },
+ {opt_strict, N_("(deprecated; use --no-newline)")}} },
{ "proplist", svn_cl__proplist, {"plist", "pl"}, N_
("List all properties on files, dirs, or revisions.\n"
@@ -1265,7 +1389,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" TARGET only determines which repository to access.\n"
"\n"
" With --verbose, the property values are printed as well, like 'svn propget\n"
- " --verbose'. With --quiet, the paths are not printed.\n"),
+ " --verbose'. With --quiet, the paths are not printed.\n"
+ "\n"
+ " See 'svn help propset' for descriptions of the svn:* special properties.\n"),
{'v', 'R', opt_depth, 'r', 'q', opt_revprop, opt_xml, opt_changelist,
opt_show_inherited_props },
{{'v', N_("print path, name and value on separate lines")},
@@ -1327,6 +1453,13 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" directory:\n"
" svn:ignore - A list of file glob patterns to ignore, one per line.\n"
" svn:global-ignores - Like svn:ignore, but inheritable.\n"
+ " svn:auto-props - Automatically set properties on files when they are\n"
+ " added or imported. Contains key-value pairs, one per line, in the format:\n"
+ " PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...]\n"
+ " Example (where a literal ';' is escaped by adding another ';'):\n"
+ " *.html = svn:eol-style=native;svn:mime-type=text/html;; charset=UTF8\n"
+ " Applies recursively to all files added or imported under the directory\n"
+ " it is set on. See also [auto-props] in the client configuration file.\n"
" svn:externals - A list of module specifiers, one per line, in the\n"
" following format similar to the syntax of 'svn checkout':\n"
" [-r REV] URL[@PEG] LOCALPATH\n"
@@ -1343,6 +1476,7 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" ^/ to the repository root\n"
" / to the server root\n"
" // to the URL scheme\n"
+ " ^/../ to a sibling repository beneath the same SVNParentPath location\n"
" Use of the following format is discouraged but is supported for\n"
" interoperability with Subversion 1.4 and earlier clients:\n"
" LOCALPATH [-r PEG] URL\n"
@@ -1445,9 +1579,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" another Subversion client modifying the working copy\n"
" ' ' not locked for writing\n"
" 'L' locked for writing\n"
- " Fourth column: Scheduled commit will contain addition-with-history\n"
- " ' ' no history scheduled with commit\n"
- " '+' history scheduled with commit\n"
+ " Fourth column: Scheduled commit will create a copy (addition-with-history)\n"
+ " ' ' no history scheduled with commit (item was newly added)\n"
+ " '+' history scheduled with commit (item was copied)\n"
" Fifth column: Whether the item is switched or a file external\n"
" ' ' normal\n"
" 'S' the item has a Switched URL relative to the parent\n"
@@ -1507,8 +1641,8 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" ! C wc/qaz.c\n"
" > local missing, incoming edit upon update\n"
" D wc/qax.c\n"),
- { 'u', 'v', 'N', opt_depth, 'q', opt_no_ignore, opt_incremental, opt_xml,
- opt_ignore_externals, opt_changelist},
+ { 'u', 'v', 'N', opt_depth, 'r', 'q', opt_no_ignore, opt_incremental,
+ opt_xml, opt_ignore_externals, opt_changelist},
{{'q', N_("don't print unversioned items")}} },
{ "switch", svn_cl__switch, {"sw"}, N_
@@ -1554,7 +1688,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
{ 'r', 'N', opt_depth, opt_set_depth, 'q', opt_merge_cmd, opt_relocate,
opt_ignore_externals, opt_ignore_ancestry, opt_force, opt_accept},
{{opt_ignore_ancestry,
- N_("allow switching to a node with no common ancestor")}}
+ N_("allow switching to a node with no common ancestor")},
+ {opt_force,
+ N_("handle unversioned obstructions as changes")}}
},
{ "unlock", svn_cl__unlock, {0}, N_
@@ -1612,7 +1748,9 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
" targets of this operation.\n"),
{'r', 'N', opt_depth, opt_set_depth, 'q', opt_merge_cmd, opt_force,
opt_ignore_externals, opt_changelist, opt_editor_cmd, opt_accept,
- opt_parents} },
+ opt_parents},
+ { {opt_force,
+ N_("handle unversioned obstructions as changes")} } },
{ "upgrade", svn_cl__upgrade, {0}, N_
("Upgrade the metadata storage format for a working copy.\n"
@@ -1660,6 +1798,8 @@ signal_handler(int signum)
svn_error_t *
svn_cl__check_cancel(void *baton)
{
+ /* Cancel baton should be always NULL in command line client. */
+ SVN_ERR_ASSERT(baton == NULL);
if (cancelled)
return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Caught signal"));
else
@@ -1708,23 +1848,13 @@ add_search_pattern_to_latest_group(svn_cl__opt_state_t *opt_state,
/*** Main. ***/
-/* Report and clear the error ERR, and return EXIT_FAILURE. Suppress the
- * error message if it is SVN_ERR_IO_PIPE_WRITE_ERROR. */
-#define EXIT_ERROR(err) \
- svn_cmdline_handle_exit_error(err, NULL, "svn: ")
-
-/* A redefinition of the public SVN_INT_ERR macro, that suppresses the
- * error message if it is SVN_ERR_IO_PIPE_WRITE_ERROR. */
-#undef SVN_INT_ERR
-#define SVN_INT_ERR(expr) \
- do { \
- svn_error_t *svn_err__temp = (expr); \
- if (svn_err__temp) \
- return EXIT_ERROR(svn_err__temp); \
- } while (0)
-
-static int
-sub_main(int argc, const char *argv[], apr_pool_t *pool)
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_t *err;
int opt_id;
@@ -1734,7 +1864,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
apr_array_header_t *received_opts;
int i;
const svn_opt_subcommand_desc2_t *subcommand = NULL;
- const char *dash_m_arg = NULL, *dash_F_arg = NULL;
+ const char *dash_F_arg = NULL;
svn_cl__cmd_baton_t command_baton;
svn_auth_baton_t *ab;
svn_config_t *cfg_config;
@@ -1751,18 +1881,18 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
/* Check library versions */
- SVN_INT_ERR(check_lib_versions());
+ SVN_ERR(check_lib_versions());
#if defined(WIN32) || defined(__CYGWIN__)
/* Set the working copy administrative directory name. */
if (getenv("SVN_ASP_DOT_NET_HACK"))
{
- SVN_INT_ERR(svn_wc_set_adm_dir("_svn", pool));
+ SVN_ERR(svn_wc_set_adm_dir("_svn", pool));
}
#endif
/* Initialize the RA library. */
- SVN_INT_ERR(svn_ra_initialize(pool));
+ SVN_ERR(svn_ra_initialize(pool));
/* Init our changelists hash. */
changelists = apr_hash_make(pool);
@@ -1780,12 +1910,13 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* No args? Show usage. */
if (argc <= 1)
{
- SVN_INT_ERR(svn_cl__help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Else, parse options. */
- SVN_INT_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
while (1)
@@ -1800,8 +1931,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
break;
else if (apr_err)
{
- SVN_INT_ERR(svn_cl__help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Stash the option code in an array before parsing it. */
@@ -1810,39 +1942,37 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
switch (opt_id) {
case 'l':
{
- err = svn_cstring_atoi(&opt_state.limit, opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ err = svn_cstring_atoi(&opt_state.limit, utf8_opt_arg);
if (err)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
- _("Non-numeric limit argument given"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Non-numeric limit argument given"));
}
if (opt_state.limit <= 0)
{
- err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Argument to --limit must be positive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Argument to --limit must be positive"));
}
}
break;
case 'm':
- /* Note that there's no way here to detect if the log message
- contains a zero byte -- if it does, then opt_arg will just
- be shorter than the user intended. Oh well. */
+ /* We store the raw message here. We will convert it to UTF-8
+ * later, according to the value of the '--encoding' option. */
opt_state.message = apr_pstrdup(pool, opt_arg);
- dash_m_arg = opt_arg;
break;
case 'c':
{
- apr_array_header_t *change_revs =
- svn_cstring_split(opt_arg, ", \n\r\t\v", TRUE, pool);
+ apr_array_header_t *change_revs;
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ change_revs = svn_cstring_split(utf8_opt_arg, ", \n\r\t\v", TRUE,
+ pool);
if (opt_state.old_target)
{
- err = svn_error_create
- (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Can't specify -c with --old"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Can't specify -c with --old"));
}
for (i = 0; i < change_revs->nelts; i++)
@@ -1870,12 +2000,11 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (changeno < 0 || is_negative)
{
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR,
- NULL,
- _("Negative number in range (%s)"
- " not supported with -c"),
- change_str);
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR,
+ NULL,
+ _("Negative number in range (%s)"
+ " not supported with -c"),
+ change_str);
}
s = end + 1;
while (*s == 'r')
@@ -1884,17 +2013,15 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
}
if (end == change_str || *end != '\0')
{
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Non-numeric change argument (%s) "
- "given to -c"), change_str);
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Non-numeric change argument (%s) "
+ "given to -c"), change_str);
}
if (changeno == 0)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("There is no change 0"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("There is no change 0"));
}
if (is_negative)
@@ -1930,15 +2057,13 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
break;
case 'r':
opt_state.used_revision_arg = TRUE;
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
if (svn_opt_parse_revision_to_range(opt_state.revision_ranges,
- opt_arg, pool) != 0)
+ utf8_opt_arg, pool) != 0)
{
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- err = svn_error_createf
- (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Syntax error in revision argument '%s'"),
utf8_opt_arg);
- return EXIT_ERROR(err);
}
break;
case 'v':
@@ -1958,23 +2083,22 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.incremental = TRUE;
break;
case 'F':
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- SVN_INT_ERR(svn_stringbuf_from_file2(&(opt_state.filedata),
- utf8_opt_arg, pool));
+ /* We read the raw file content here. We will convert it to UTF-8
+ * later (if it's a log/lock message or an svn:* prop value),
+ * according to the value of the '--encoding' option. */
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&(opt_state.filedata),
+ utf8_opt_arg, pool));
reading_file_from_stdin = (strcmp(utf8_opt_arg, "-") == 0);
- dash_F_arg = opt_arg;
+ dash_F_arg = utf8_opt_arg;
break;
case opt_targets:
{
svn_stringbuf_t *buffer, *buffer_utf8;
- /* We need to convert to UTF-8 now, even before we divide
- the targets into an array, because otherwise we wouldn't
- know what delimiter to use for svn_cstring_split(). */
-
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- SVN_INT_ERR(svn_stringbuf_from_file2(&buffer, utf8_opt_arg, pool));
- SVN_INT_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&buffer, utf8_opt_arg, pool));
+ SVN_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool));
opt_state.targets = svn_cstring_split(buffer_utf8->data, "\n\r",
TRUE, pool);
}
@@ -2000,51 +2124,47 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
case opt_depth:
err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
if (err)
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
- _("Error converting depth "
- "from locale to UTF-8")));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Error converting depth "
+ "from locale to UTF-8"));
opt_state.depth = svn_depth_from_word(utf8_opt_arg);
if (opt_state.depth == svn_depth_unknown
|| opt_state.depth == svn_depth_exclude)
{
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'%s' is not a valid depth; try "
- "'empty', 'files', 'immediates', "
- "or 'infinity'"),
- utf8_opt_arg));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid depth; try "
+ "'empty', 'files', 'immediates', "
+ "or 'infinity'"),
+ utf8_opt_arg);
}
break;
case opt_set_depth:
err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
if (err)
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
- _("Error converting depth "
- "from locale to UTF-8")));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Error converting depth "
+ "from locale to UTF-8"));
opt_state.set_depth = svn_depth_from_word(utf8_opt_arg);
/* svn_depth_exclude is okay for --set-depth. */
if (opt_state.set_depth == svn_depth_unknown)
{
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'%s' is not a valid depth; try "
- "'exclude', 'empty', 'files', "
- "'immediates', or 'infinity'"),
- utf8_opt_arg));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid depth; try "
+ "'exclude', 'empty', 'files', "
+ "'immediates', or 'infinity'"),
+ utf8_opt_arg);
}
break;
case opt_version:
opt_state.version = TRUE;
break;
case opt_auth_username:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_username,
- opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_username,
+ opt_arg, pool));
break;
case opt_auth_password:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
- opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
+ opt_arg, pool));
break;
case opt_encoding:
opt_state.encoding = apr_pstrdup(pool, opt_arg);
@@ -2055,9 +2175,6 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
case opt_stop_on_copy:
opt_state.stop_on_copy = TRUE;
break;
- case opt_strict:
- opt_state.strict = TRUE;
- break;
case opt_no_ignore:
opt_state.no_ignore = TRUE;
break;
@@ -2070,8 +2187,18 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
case opt_force_interactive:
force_interactive = TRUE;
break;
- case opt_trust_server_cert:
- opt_state.trust_server_cert = TRUE;
+ case opt_trust_server_cert: /* backwards compat to 1.8 */
+ opt_state.trust_server_cert_unknown_ca = TRUE;
+ break;
+ case opt_trust_server_cert_failures:
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &opt_state.trust_server_cert_unknown_ca,
+ &opt_state.trust_server_cert_cn_mismatch,
+ &opt_state.trust_server_cert_expired,
+ &opt_state.trust_server_cert_not_yet_valid,
+ &opt_state.trust_server_cert_other_failure,
+ utf8_opt_arg, pool));
break;
case opt_no_diff_added:
opt_state.diff.no_diff_added = TRUE;
@@ -2098,8 +2225,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.relocate = TRUE;
break;
case 'x':
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.extensions,
- opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.extensions,
+ opt_arg, pool));
break;
case opt_diff_cmd:
opt_state.diff.diff_cmd = apr_pstrdup(pool, opt_arg);
@@ -2116,22 +2243,19 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
case opt_old_cmd:
if (opt_state.used_change_arg)
{
- err = svn_error_create
- (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Can't specify -c with --old"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Can't specify -c with --old"));
}
- opt_state.old_target = apr_pstrdup(pool, opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.old_target = apr_pstrdup(pool, utf8_opt_arg);
break;
case opt_new_cmd:
- opt_state.new_target = apr_pstrdup(pool, opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.new_target = apr_pstrdup(pool, utf8_opt_arg);
break;
case opt_config_dir:
- {
- const char *path_utf8;
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&path_utf8, opt_arg, pool));
- opt_state.config_dir = svn_dirent_internal_style(path_utf8, pool);
- }
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.config_dir = svn_dirent_internal_style(utf8_opt_arg, pool);
break;
case opt_config_options:
if (!opt_state.config_options)
@@ -2139,9 +2263,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
apr_array_make(pool, 1,
sizeof(svn_cmdline__config_argument_t*));
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
- SVN_INT_ERR(svn_cmdline__parse_config_option(opt_state.config_options,
- opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options,
+ utf8_opt_arg, "svn: ", pool));
break;
case opt_autoprops:
opt_state.autoprops = TRUE;
@@ -2150,17 +2274,15 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.no_autoprops = TRUE;
break;
case opt_native_eol:
- if ( !strcmp("LF", opt_arg) || !strcmp("CR", opt_arg) ||
- !strcmp("CRLF", opt_arg))
- opt_state.native_eol = apr_pstrdup(pool, opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ if ( !strcmp("LF", utf8_opt_arg) || !strcmp("CR", utf8_opt_arg) ||
+ !strcmp("CRLF", utf8_opt_arg))
+ opt_state.native_eol = utf8_opt_arg;
else
{
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- err = svn_error_createf
- (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Syntax error in native-eol argument '%s'"),
utf8_opt_arg);
- return EXIT_ERROR(err);
}
break;
case opt_no_unlock:
@@ -2173,15 +2295,13 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.remove = TRUE;
break;
case opt_changelist:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- opt_state.changelist = utf8_opt_arg;
- if (opt_state.changelist[0] == '\0')
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ if (utf8_opt_arg[0] == '\0')
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Changelist names must not be empty"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Changelist names must not be empty"));
}
- svn_hash_sets(changelists, opt_state.changelist, (void *)1);
+ svn_hash_sets(changelists, utf8_opt_arg, (void *)1);
break;
case opt_keep_changelists:
opt_state.keep_changelists = TRUE;
@@ -2198,8 +2318,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.no_revprops = TRUE;
break;
case opt_with_revprop:
- SVN_INT_ERR(svn_opt_parse_revprop(&opt_state.revprop_table,
- opt_arg, pool));
+ SVN_ERR(svn_opt_parse_revprop(&opt_state.revprop_table,
+ opt_arg, pool));
break;
case opt_parents:
opt_state.parents = TRUE;
@@ -2208,38 +2328,41 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.use_merge_history = TRUE;
break;
case opt_accept:
- opt_state.accept_which = svn_cl__accept_from_word(opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.accept_which = svn_cl__accept_from_word(utf8_opt_arg);
if (opt_state.accept_which == svn_cl__accept_invalid)
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'%s' is not a valid --accept value"),
- opt_arg));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid --accept value"),
+ utf8_opt_arg);
break;
case opt_show_revs:
- opt_state.show_revs = svn_cl__show_revs_from_word(opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.show_revs = svn_cl__show_revs_from_word(utf8_opt_arg);
if (opt_state.show_revs == svn_cl__show_revs_invalid)
- return EXIT_ERROR
- (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'%s' is not a valid --show-revs value"),
- opt_arg));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid --show-revs value"),
+ utf8_opt_arg);
+ break;
+ case opt_mergeinfo_log:
+ opt_state.mergeinfo_log = TRUE;
break;
case opt_reintegrate:
opt_state.reintegrate = TRUE;
break;
case opt_strip:
{
- err = svn_cstring_atoi(&opt_state.strip, opt_arg);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ err = svn_cstring_atoi(&opt_state.strip, utf8_opt_arg);
if (err)
{
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
- _("Invalid strip count '%s'"), opt_arg);
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Invalid strip count '%s'"),
+ utf8_opt_arg);
}
if (opt_state.strip < 0)
{
- err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Argument to --strip must be positive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Argument to --strip must be positive"));
}
}
break;
@@ -2277,10 +2400,32 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.diff.properties_only = TRUE;
break;
case opt_search:
- add_search_pattern_group(&opt_state, opt_arg, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ add_search_pattern_group(&opt_state, utf8_opt_arg, pool);
break;
case opt_search_and:
- add_search_pattern_to_latest_group(&opt_state, opt_arg, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ add_search_pattern_to_latest_group(&opt_state, utf8_opt_arg, pool);
+ case opt_remove_unversioned:
+ opt_state.remove_unversioned = TRUE;
+ break;
+ case opt_remove_ignored:
+ opt_state.remove_ignored = TRUE;
+ break;
+ case opt_no_newline:
+ case opt_strict: /* ### DEPRECATED */
+ opt_state.no_newline = TRUE;
+ break;
+ case opt_show_passwords:
+ opt_state.show_passwords = TRUE;
+ break;
+ case opt_pin_externals:
+ opt_state.pin_externals = TRUE;
+ break;
+ case opt_show_item:
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ opt_state.show_item = utf8_opt_arg;
+ break;
default:
/* Hmmm. Perhaps this would be a good place to squirrel away
opts that commands like svn diff might need. Hmmm indeed. */
@@ -2292,10 +2437,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
* exclusive. */
if (opt_state.non_interactive && force_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--non-interactive and --force-interactive "
- "are mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--non-interactive and --force-interactive "
+ "are mutually exclusive"));
}
else
opt_state.non_interactive = !svn_cmdline__be_interactive(
@@ -2303,7 +2447,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
force_interactive);
/* Turn our hash of changelists into an array of unique ones. */
- SVN_INT_ERR(svn_hash_keys(&(opt_state.changelists), changelists, pool));
+ SVN_ERR(svn_hash_keys(&(opt_state.changelists), changelists, pool));
/* ### This really belongs in libsvn_client. The trouble is,
there's no one place there to run it from, no
@@ -2315,7 +2459,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
hand, the alternative is effectively to demand that they call
svn_config_ensure() instead, so maybe we should have a generic
init function anyway. Thoughts? */
- SVN_INT_ERR(svn_config_ensure(opt_state.config_dir, pool));
+ SVN_ERR(svn_config_ensure(opt_state.config_dir, pool));
/* If the user asked for help, then the rest of the arguments are
the names of subcommands to get help on (if any), or else they're
@@ -2349,7 +2493,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
(svn_cmdline_fprintf(stderr, pool,
_("Subcommand argument required\n")));
svn_error_clear(svn_cl__help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -2360,8 +2505,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (subcommand == NULL)
{
const char *first_arg_utf8;
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
- first_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
+ first_arg, pool));
svn_error_clear
(svn_cmdline_fprintf(stderr, pool,
_("Unknown subcommand: '%s'\n"),
@@ -2378,7 +2523,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
"command.\n")));
}
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -2411,7 +2557,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
(stderr, pool, _("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svn help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name));
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
@@ -2421,11 +2568,10 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (opt_state.revision_ranges->nelts > 1)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Multiple revision arguments "
- "encountered; can't specify -c twice, "
- "or both -c and -r"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Multiple revision arguments "
+ "encountered; can't specify -c twice, "
+ "or both -c and -r"));
}
}
@@ -2433,32 +2579,47 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if ((opt_state.depth != svn_depth_unknown)
&& (opt_state.set_depth != svn_depth_unknown))
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--depth and --set-depth are mutually "
- "exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--depth and --set-depth are mutually "
+ "exclusive"));
}
/* Disallow simultaneous use of both --with-all-revprops and
--with-no-revprops. */
if (opt_state.all_revprops && opt_state.no_revprops)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--with-all-revprops and --with-no-revprops "
- "are mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--with-all-revprops and --with-no-revprops "
+ "are mutually exclusive"));
}
/* Disallow simultaneous use of both --with-revprop and
--with-no-revprops. */
if (opt_state.revprop_table && opt_state.no_revprops)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--with-revprop and --with-no-revprops "
- "are mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--with-revprop and --with-no-revprops "
+ "are mutually exclusive"));
}
+#ifdef SVN_CL__OPTION_WITH_REVPROP_CAN_SET_PROPERTIES_IN_SVN_NAMESPACE
+ /* XXX This is incomplete, since we do not yet check for --force, nor
+ do all the commands that accept --with-revprop also accept --force. */
+
+ /* Check the spelling of the revision properties given by --with-revprop. */
+ if (opt_state.revprop_table)
+ {
+ apr_hash_index_t *hi;
+ for (hi = apr_hash_first(pool, opt_state.revprop_table);
+ hi; hi = apr_hash_next(hi))
+ {
+ SVN_ERR(svn_cl__check_svn_prop_name(apr_hash_this_key(hi),
+ TRUE, svn_cl__prop_use_use,
+ pool));
+ }
+ }
+#endif /* SVN_CL__OPTION_WITH_REVPROP_CAN_SET_PROPERTIES_IN_SVN_NAMESPACE */
+
/* Disallow simultaneous use of both -m and -F, when they are
both used to pass a commit message or lock comment. ('propset'
takes the property value, not a commit message, from -F.)
@@ -2466,29 +2627,31 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (opt_state.filedata && opt_state.message
&& subcommand->cmd_func != svn_cl__propset)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--message (-m) and --file (-F) "
- "are mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--message (-m) and --file (-F) "
+ "are mutually exclusive"));
}
- /* --trust-server-cert can only be used with --non-interactive */
- if (opt_state.trust_server_cert && !opt_state.non_interactive)
+ /* --trust-* options can only be used with --non-interactive */
+ if (!opt_state.non_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--trust-server-cert requires "
- "--non-interactive"));
- return EXIT_ERROR(err);
+ if (opt_state.trust_server_cert_unknown_ca
+ || opt_state.trust_server_cert_cn_mismatch
+ || opt_state.trust_server_cert_expired
+ || opt_state.trust_server_cert_not_yet_valid
+ || opt_state.trust_server_cert_other_failure)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--trust-server-cert-failures requires "
+ "--non-interactive"));
}
/* Disallow simultaneous use of both --diff-cmd and
--internal-diff. */
if (opt_state.diff.diff_cmd && opt_state.diff.internal_diff)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--diff-cmd and --internal-diff "
- "are mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--diff-cmd and --internal-diff "
+ "are mutually exclusive"));
}
/* Ensure that 'revision_ranges' has at least one item, and make
@@ -2514,18 +2677,13 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (APR_STATUS_IS_EACCES(err->apr_err)
|| SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))
{
- svn_config_t *empty_cfg;
-
svn_handle_warning2(stderr, err, "svn: ");
svn_error_clear(err);
- cfg_hash = apr_hash_make(pool);
- SVN_INT_ERR(svn_config_create2(&empty_cfg, FALSE, FALSE, pool));
- svn_hash_sets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG, empty_cfg);
- SVN_INT_ERR(svn_config_create2(&empty_cfg, FALSE, FALSE, pool));
- svn_hash_sets(cfg_hash, SVN_CONFIG_CATEGORY_SERVERS, empty_cfg);
+
+ SVN_ERR(svn_config__get_default_config(&cfg_hash, pool));
}
else
- return EXIT_ERROR(err);
+ return err;
}
/* Relocation is infinite-depth only. */
@@ -2533,18 +2691,16 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (opt_state.depth != svn_depth_unknown)
{
- err = svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
- _("--relocate and --depth are mutually "
- "exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
+ _("--relocate and --depth are mutually "
+ "exclusive"));
}
if (! descend)
{
- err = svn_error_create(
+ return svn_error_create(
SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("--relocate and --non-recursive (-N) are mutually "
"exclusive"));
- return EXIT_ERROR(err);
}
}
@@ -2558,8 +2714,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (opt_state.end_revision.kind != svn_opt_revision_unspecified)
{
- err = svn_error_create(SVN_ERR_CLIENT_REVISION_RANGE, NULL, NULL);
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CLIENT_REVISION_RANGE, NULL, NULL);
}
}
@@ -2586,8 +2741,6 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
}
}
- cfg_config = svn_hash_gets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG);
-
/* Update the options in the config */
if (opt_state.config_options)
{
@@ -2597,6 +2750,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
"svn: ", "--config-option"));
}
+ cfg_config = svn_hash_gets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG);
#if !defined(SVN_CL_NO_EXCLUSIVE_LOCK)
{
const char *exclusive_clients_option;
@@ -2626,7 +2780,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* Create a client context object. */
command_baton.opt_state = &opt_state;
- SVN_INT_ERR(svn_client_create_context2(&ctx, cfg_hash, pool));
+ SVN_ERR(svn_client_create_context2(&ctx, cfg_hash, pool));
command_baton.ctx = ctx;
/* If we're running a command that could result in a commit, verify
@@ -2662,19 +2816,18 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (subcommand->cmd_func != svn_cl__lock)
{
- err = svn_error_create(
+ return svn_error_create(
SVN_ERR_CL_LOG_MESSAGE_IS_VERSIONED_FILE, NULL,
_("Log message file is a versioned file; "
"use '--force-log' to override"));
}
else
{
- err = svn_error_create(
+ return svn_error_create(
SVN_ERR_CL_LOG_MESSAGE_IS_VERSIONED_FILE, NULL,
_("Lock comment file is a versioned file; "
"use '--force-log' to override"));
}
- return EXIT_ERROR(err);
}
}
svn_error_clear(err);
@@ -2682,27 +2835,26 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* If the -m argument is a file at all, that's probably not what
the user intended. */
- if (dash_m_arg)
+ if (opt_state.message)
{
apr_finfo_t finfo;
- if (apr_stat(&finfo, dash_m_arg,
+ if (apr_stat(&finfo, opt_state.message /* not converted to UTF-8 */,
APR_FINFO_MIN, pool) == APR_SUCCESS)
{
if (subcommand->cmd_func != svn_cl__lock)
{
- err = svn_error_create
+ return svn_error_create
(SVN_ERR_CL_LOG_MESSAGE_IS_PATHNAME, NULL,
_("The log message is a pathname "
"(was -F intended?); use '--force-log' to override"));
}
else
{
- err = svn_error_create
+ return svn_error_create
(SVN_ERR_CL_LOG_MESSAGE_IS_PATHNAME, NULL,
_("The lock comment is a pathname "
"(was -F intended?); use '--force-log' to override"));
}
- return EXIT_ERROR(err);
}
}
}
@@ -2722,10 +2874,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* Check for mutually exclusive args --auto-props and --no-auto-props */
if (opt_state.autoprops && opt_state.no_autoprops)
{
- err = svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
- _("--auto-props and --no-auto-props are "
- "mutually exclusive"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
+ _("--auto-props and --no-auto-props are "
+ "mutually exclusive"));
}
/* Update auto-props-enable option, and populate the MIME types map,
@@ -2739,8 +2890,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
SVN_CONFIG_OPTION_MIMETYPES_FILE, FALSE);
if (mimetypes_file && *mimetypes_file)
{
- SVN_INT_ERR(svn_io_parse_mimetypes_file(&(ctx->mimetypes_map),
- mimetypes_file, pool));
+ SVN_ERR(svn_io_parse_mimetypes_file(&(ctx->mimetypes_map),
+ mimetypes_file, pool));
}
if (opt_state.autoprops)
@@ -2778,8 +2929,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
use_notifier = FALSE;
if (use_notifier)
{
- SVN_INT_ERR(svn_cl__get_notifier(&ctx->notify_func2, &ctx->notify_baton2,
- conflict_stats, pool));
+ SVN_ERR(svn_cl__get_notifier(&ctx->notify_func2, &ctx->notify_baton2,
+ conflict_stats, pool));
}
/* Set up our cancellation support. */
@@ -2809,35 +2960,41 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
#endif
/* Set up Authentication stuff. */
- SVN_INT_ERR(svn_cmdline_create_auth_baton(&ab,
- opt_state.non_interactive,
- opt_state.auth_username,
- opt_state.auth_password,
- opt_state.config_dir,
- opt_state.no_auth_cache,
- opt_state.trust_server_cert,
- cfg_config,
- ctx->cancel_func,
- ctx->cancel_baton,
- pool));
+ SVN_ERR(svn_cmdline_create_auth_baton2(
+ &ab,
+ opt_state.non_interactive,
+ opt_state.auth_username,
+ opt_state.auth_password,
+ opt_state.config_dir,
+ opt_state.no_auth_cache,
+ opt_state.trust_server_cert_unknown_ca,
+ opt_state.trust_server_cert_cn_mismatch,
+ opt_state.trust_server_cert_expired,
+ opt_state.trust_server_cert_not_yet_valid,
+ opt_state.trust_server_cert_other_failure,
+ cfg_config,
+ ctx->cancel_func,
+ ctx->cancel_baton,
+ pool));
ctx->auth_baton = ab;
if (opt_state.non_interactive)
{
if (opt_state.accept_which == svn_cl__accept_edit)
- return EXIT_ERROR(
- svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--accept=%s incompatible with"
" --non-interactive"),
- SVN_CL__ACCEPT_EDIT));
-
+ SVN_CL__ACCEPT_EDIT);
+ }
if (opt_state.accept_which == svn_cl__accept_launch)
- return EXIT_ERROR(
- svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("--accept=%s incompatible with"
" --non-interactive"),
- SVN_CL__ACCEPT_LAUNCH));
+ SVN_CL__ACCEPT_LAUNCH);
+ }
/* The default action when we're non-interactive is to postpone
* conflict resolution. */
@@ -2848,10 +3005,10 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* Check whether interactive conflict resolution is disabled by
* the configuration file. If no --accept option was specified
* we postpone all conflicts in this case. */
- SVN_INT_ERR(svn_config_get_bool(cfg_config, &interactive_conflicts,
- SVN_CONFIG_SECTION_MISCELLANY,
- SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS,
- TRUE));
+ SVN_ERR(svn_config_get_bool(cfg_config, &interactive_conflicts,
+ SVN_CONFIG_SECTION_MISCELLANY,
+ SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS,
+ TRUE));
if (!interactive_conflicts)
{
/* Make 'svn resolve' non-interactive. */
@@ -2872,7 +3029,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
ctx->conflict_baton = NULL;
ctx->conflict_func2 = svn_cl__conflict_func_interactive;
- SVN_INT_ERR(svn_cl__get_conflict_func_interactive_baton(
+ SVN_ERR(svn_cl__get_conflict_func_interactive_baton(
&b,
opt_state.accept_which,
ctx->config, opt_state.editor_cmd, conflict_stats,
@@ -2889,10 +3046,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS
|| err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR)
{
- err = svn_error_quick_wrap(
- err, apr_psprintf(pool,
- _("Try 'svn help %s' for more information"),
- subcommand->name));
+ err = svn_error_quick_wrapf(
+ err, _("Try 'svn help %s' for more information"),
+ subcommand->name);
}
if (err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED)
{
@@ -2945,27 +3101,18 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
"Subversion"));
}
- /* Ensure that stdout is flushed, so the user will see any write errors.
- This makes sure that output is not silently lost. */
- err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
-
- return EXIT_ERROR(err);
+ return err;
}
- else
- {
- /* Ensure that stdout is flushed, so the user will see any write errors.
- This makes sure that output is not silently lost. */
- SVN_INT_ERR(svn_cmdline_fflush(stdout));
- return EXIT_SUCCESS;
- }
+ return SVN_NO_ERROR;
}
int
main(int argc, const char *argv[])
{
apr_pool_t *pool;
- int exit_code;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
/* Initialize the app. */
if (svn_cmdline_init("svn", stderr) != EXIT_SUCCESS)
@@ -2976,7 +3123,17 @@ main(int argc, const char *argv[])
*/
pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
- exit_code = sub_main(argc, argv, pool);
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svn: ");
+ }
svn_pool_destroy(pool);
return exit_code;
diff --git a/subversion/svn/unlock-cmd.c b/subversion/svn/unlock-cmd.c
index 0f94d2a..3818d1f 100644
--- a/subversion/svn/unlock-cmd.c
+++ b/subversion/svn/unlock-cmd.c
@@ -39,6 +39,29 @@
/*** Code. ***/
+/* Baton for notify_unlock_handler */
+struct notify_unlock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__unlock */
+static void
+notify_unlock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_unlock_baton_t *nub = baton;
+
+ if (notify->action == svn_wc_notify_failed_unlock)
+ nub->had_failure = TRUE;
+
+ if (nub->inner_notify)
+ nub->inner_notify(nub->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
@@ -49,6 +72,7 @@ svn_cl__unlock(apr_getopt_t *os,
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
+ struct notify_unlock_baton_t nub;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -63,6 +87,18 @@ svn_cl__unlock(apr_getopt_t *os,
SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
- return svn_error_trace(
- svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+ nub.inner_notify = ctx->notify_func2;
+ nub.inner_baton = ctx->notify_baton2;
+ nub.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_unlock_handler;
+ ctx->notify_baton2 = &nub;
+
+ SVN_ERR(svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+
+ if (nub.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be released"));
+
+ return SVN_NO_ERROR;
}
diff --git a/subversion/svn/util.c b/subversion/svn/util.c
index 092bc7e..88ae27b 100644
--- a/subversion/svn/util.c
+++ b/subversion/svn/util.c
@@ -75,8 +75,15 @@ svn_cl__print_commit_info(const svn_commit_info_t *commit_info,
void *baton,
apr_pool_t *pool)
{
+ /* Be very careful with returning errors from this callback as those
+ will be returned as errors from editor->close_edit(...), which may
+ cause callers to assume that the commit itself failed.
+
+ See log message of r1659867 and the svn_ra_get_commit_editor3
+ documentation for details on error scenarios. */
+
if (SVN_IS_VALID_REVNUM(commit_info->revision))
- SVN_ERR(svn_cmdline_printf(pool, _("\nCommitted revision %ld%s.\n"),
+ SVN_ERR(svn_cmdline_printf(pool, _("Committed revision %ld%s.\n"),
commit_info->revision,
commit_info->revision == 42 &&
getenv("SVN_I_LOVE_PANGALACTIC_GARGLE_BLASTERS")
@@ -164,9 +171,9 @@ svn_cl__merge_file_externally(const char *base_path,
* is OK to continue with the merge.
* Any other exit code means there was a real problem. */
if (exitcode != 0 && exitcode != 1)
- return svn_error_createf
- (SVN_ERR_EXTERNAL_PROGRAM, NULL,
- _("The external merge tool exited with exit code %d"), exitcode);
+ return svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL,
+ _("The external merge tool '%s' exited with exit code %d."),
+ merge_tool, exitcode);
else if (remains_in_conflict)
*remains_in_conflict = exitcode == 1;
}
@@ -197,7 +204,7 @@ svn_cl__make_log_msg_baton(void **baton,
apr_hash_t *config,
apr_pool_t *pool)
{
- struct log_msg_baton *lmb = apr_palloc(pool, sizeof(*lmb));
+ struct log_msg_baton *lmb = apr_pcalloc(pool, sizeof(*lmb));
if (opt_state->filedata)
{
@@ -230,8 +237,10 @@ svn_cl__make_log_msg_baton(void **baton,
SVN_CONFIG_OPTION_LOG_ENCODING,
NULL);
}
+ else
+ lmb->message_encoding = NULL;
- lmb->base_dir = base_dir ? base_dir : "";
+ lmb->base_dir = base_dir;
lmb->tmpfile_left = NULL;
lmb->config = config;
lmb->keep_locks = opt_state->no_unlock;
@@ -343,22 +352,17 @@ svn_cl__get_log_message(const char **log_msg,
*tmp_file = NULL;
if (lmb->message)
{
- svn_stringbuf_t *log_msg_buf = svn_stringbuf_create(lmb->message, pool);
- svn_string_t *log_msg_str = apr_pcalloc(pool, sizeof(*log_msg_str));
-
- /* Trim incoming messages of the EOF marker text and the junk
- that follows it. */
- truncate_buffer_at_prefix(&(log_msg_buf->len), log_msg_buf->data,
- EDITOR_EOF_PREFIX);
+ svn_string_t *log_msg_str = svn_string_create(lmb->message, pool);
- /* Make a string from a stringbuf, sharing the data allocation. */
- log_msg_str->data = log_msg_buf->data;
- log_msg_str->len = log_msg_buf->len;
- SVN_ERR_W(svn_subst_translate_string2(&log_msg_str, FALSE, FALSE,
+ SVN_ERR_W(svn_subst_translate_string2(&log_msg_str, NULL, NULL,
log_msg_str, lmb->message_encoding,
FALSE, pool, pool),
_("Error normalizing log message to internal format"));
+ /* Strip off the EOF marker text and the junk that follows it. */
+ truncate_buffer_at_prefix(&(log_msg_str->len), (char *)log_msg_str->data,
+ EDITOR_EOF_PREFIX);
+
*log_msg = log_msg_str->data;
return SVN_NO_ERROR;
}
@@ -388,14 +392,11 @@ svn_cl__get_log_message(const char **log_msg,
if (! path)
path = item->url;
- else if (! *path)
- path = ".";
-
- if (! svn_path_is_url(path) && lmb->base_dir)
+ else if (lmb->base_dir)
path = svn_dirent_is_child(lmb->base_dir, path, pool);
/* If still no path, then just use current directory. */
- if (! path)
+ if (! path || !*path)
path = ".";
if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
@@ -434,7 +435,8 @@ svn_cl__get_log_message(const char **log_msg,
if (! lmb->non_interactive)
{
err = svn_cmdline__edit_string_externally(&msg_string, &lmb->tmpfile_left,
- lmb->editor_cmd, lmb->base_dir,
+ lmb->editor_cmd,
+ lmb->base_dir ? lmb->base_dir : "",
msg_string, "svn-commit",
lmb->config, TRUE,
lmb->message_encoding,
@@ -466,7 +468,7 @@ svn_cl__get_log_message(const char **log_msg,
if (msg_string)
message = svn_stringbuf_create_from_string(msg_string, pool);
- /* Strip the prefix from the buffer. */
+ /* Strip off the EOF marker text and the junk that follows it. */
if (message)
truncate_buffer_at_prefix(&message->len, message->data,
EDITOR_EOF_PREFIX);
@@ -565,8 +567,8 @@ svn_cl__error_checked_fputs(const char *string, FILE* stream)
if (fputs(string, stream) == EOF)
{
- if (errno)
- return svn_error_wrap_apr(errno, _("Write error"));
+ if (apr_get_os_error()) /* is errno on POSIX */
+ return svn_error_wrap_apr(apr_get_os_error(), _("Write error"));
else
return svn_error_create(SVN_ERR_IO_WRITE_ERROR, NULL, NULL);
}
@@ -631,7 +633,7 @@ svn_cl__xml_tagged_cdata(svn_stringbuf_t **sb,
if (string)
{
svn_xml_make_open_tag(sb, pool, svn_xml_protect_pcdata,
- tagname, NULL);
+ tagname, SVN_VA_NULL);
svn_xml_escape_cdata_cstring(sb, string, pool);
svn_xml_make_close_tag(sb, pool, tagname);
}
@@ -648,7 +650,7 @@ svn_cl__print_xml_commit(svn_stringbuf_t **sb,
/* "<commit ...>" */
svn_xml_make_open_tag(sb, pool, svn_xml_normal, "commit",
"revision",
- apr_psprintf(pool, "%ld", revision), NULL);
+ apr_psprintf(pool, "%ld", revision), SVN_VA_NULL);
/* "<author>xx</author>" */
if (author)
@@ -669,7 +671,7 @@ svn_cl__print_xml_lock(svn_stringbuf_t **sb,
apr_pool_t *pool)
{
/* "<lock>" */
- svn_xml_make_open_tag(sb, pool, svn_xml_normal, "lock", NULL);
+ svn_xml_make_open_tag(sb, pool, svn_xml_normal, "lock", SVN_VA_NULL);
/* "<token>xx</token>" */
svn_cl__xml_tagged_cdata(sb, pool, "token", lock->token);
@@ -704,7 +706,7 @@ svn_cl__xml_print_header(const char *tagname,
svn_xml_make_header2(&sb, "UTF-8", pool);
/* "<TAGNAME>" */
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, tagname, NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, tagname, SVN_VA_NULL);
return svn_cl__error_checked_fputs(sb->data, stdout);
}
diff --git a/subversion/svn_private_config.h.in b/subversion/svn_private_config.h.in
index b322e83..3e9d592 100644
--- a/subversion/svn_private_config.h.in
+++ b/subversion/svn_private_config.h.in
@@ -22,6 +22,9 @@
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
#undef HAVE_DOPRNT
+/* Define to 1 if you have the `getpid' function. */
+#undef HAVE_GETPID
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@@ -46,6 +49,9 @@
/* Define to 1 if you have the <serf.h> header file. */
#undef HAVE_SERF_H
+/* Define to 1 if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@@ -115,12 +121,12 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
+/* Defined to build against httpd 2.4 with broken auth */
+#undef SVN_ALLOW_BROKEN_HTTPD_AUTH
+
/* Define to the Python/C API format character suitable for apr_int64_t */
#undef SVN_APR_INT64_T_PYCFMT
-/* Define if circular linkage is not possible on this platform. */
-#undef SVN_AVOID_CIRCULAR_LINKAGE_AT_ALL_COSTS_HACK
-
/* Defined to be the path to the installed binaries */
#undef SVN_BINDIR
@@ -199,6 +205,9 @@
/* Defined if libsvn_fs should link against libsvn_fs_fs */
#undef SVN_LIBSVN_FS_LINKS_FS_FS
+/* Defined if libsvn_fs should link against libsvn_fs_x */
+#undef SVN_LIBSVN_FS_LINKS_FS_X
+
/* Defined to be the path to the installed locale dirs */
#undef SVN_LOCALE_DIR
@@ -217,6 +226,9 @@
/* Defined if svn should try to load DSOs */
#undef SVN_USE_DSO
+/* Defined to build with patched httpd 2.4 and working auth */
+#undef SVN_USE_FORCE_AUTHN
+
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
@@ -254,3 +266,27 @@
#define dgettext(domain, x) (x)
#endif
+/* compiler hints */
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+# define SVN__PREDICT_FALSE(x) (__builtin_expect(x, 0))
+# define SVN__PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
+#else
+# define SVN__PREDICT_FALSE(x) (x)
+# define SVN__PREDICT_TRUE(x) (x)
+#endif
+
+#if defined(SVN_DEBUG)
+# define SVN__FORCE_INLINE
+# define SVN__PREVENT_INLINE
+#elif defined(__GNUC__)
+# define SVN__FORCE_INLINE APR_INLINE __attribute__ ((always_inline))
+# define SVN__PREVENT_INLINE __attribute__ ((noinline))
+#else
+# define SVN__FORCE_INLINE APR_INLINE
+# define SVN__PREVENT_INLINE
+#endif
+
+/* Macro used to specify that a variable is intentionally left unused.
+ Supresses compiler warnings about the variable being unused. */
+#define SVN_UNUSED(v) ( (void)(v) )
+
diff --git a/subversion/svn_private_config.hw b/subversion/svn_private_config.hw
index 61517f9..4ac6bad 100644
--- a/subversion/svn_private_config.hw
+++ b/subversion/svn_private_config.hw
@@ -48,7 +48,6 @@
#define SVN_FS_WANT_DB_MINOR 0
#define SVN_FS_WANT_DB_PATCH 14
-
/* Path separator for local filesystem */
#define SVN_PATH_LOCAL_SEPARATOR '\\'
@@ -58,6 +57,9 @@
/* Link fs fs library into the fs library */
#define SVN_LIBSVN_FS_LINKS_FS_FS
+/* Link fs fs library into the fs library */
+#define SVN_LIBSVN_FS_LINKS_FS_X
+
/* Link local repos access library to client */
#define SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL
@@ -101,6 +103,25 @@
#define dgettext(domain, x) (x)
#endif
+/* compiler hints as supported by MS VC */
+#if defined(SVN_DEBUG)
+# define SVN__FORCE_INLINE
+# define SVN__PREVENT_INLINE
+#elif defined(_MSC_VER)
+# define SVN__FORCE_INLINE __forceinline
+# define SVN__PREVENT_INLINE __declspec(noinline)
+#else
+# define SVN__FORCE_INLINE APR_INLINE
+# define SVN__PREVENT_INLINE
+#endif
+
+#define SVN__PREDICT_TRUE(x) (x)
+#define SVN__PREDICT_FALSE(x) (x)
+
+/* Macro used to specify that a variable is intentionally left unused.
+ Supresses compiler warnings about the variable being unused. */
+#define SVN_UNUSED(v) ( (void)(v) )
+
#endif /* SVN_PRIVATE_CONFIG_HW */
/* Inclusion of Berkeley DB header */
diff --git a/subversion/svnadmin/svnadmin.c b/subversion/svnadmin/svnadmin.c
index cfbcf66..2ee5410 100644
--- a/subversion/svnadmin/svnadmin.c
+++ b/subversion/svnadmin/svnadmin.c
@@ -39,19 +39,26 @@
#include "svn_cache_config.h"
#include "svn_version.h"
#include "svn_props.h"
+#include "svn_sorts.h"
#include "svn_time.h"
#include "svn_user.h"
#include "svn_xml.h"
+#include "private/svn_cmdline_private.h"
#include "private/svn_opt_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
-#include "private/svn_cmdline_private.h"
#include "svn_private_config.h"
/*** Code. ***/
+/* FSFS format 7's "block-read" feature performs poorly with small caches.
+ * Enable it only if caches above this threshold have been configured.
+ * The current threshold is 64MB. */
+#define BLOCK_READ_CACHE_THRESHOLD (0x40 * 0x100000)
+
/* A flag to see if we've been cancelled by the client or not. */
static volatile sig_atomic_t cancelled = FALSE;
@@ -100,7 +107,7 @@ warning_func(void *baton,
{
if (! err)
return;
- svn_handle_error2(err, stderr, FALSE, "svnadmin: ");
+ svn_handle_warning2(stderr, err, "svnadmin: ");
}
@@ -111,6 +118,10 @@ open_repos(svn_repos_t **repos,
const char *path,
apr_pool_t *pool)
{
+ /* Enable the "block-read" feature (where it applies)? */
+ svn_boolean_t use_block_read
+ = svn_cache_config_get()->cache_size > BLOCK_READ_CACHE_THRESHOLD;
+
/* construct FS configuration parameters: enable caches for r/o data */
apr_hash_t *fs_config = apr_hash_make(pool);
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS, "1");
@@ -118,9 +129,11 @@ open_repos(svn_repos_t **repos,
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "2");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
svn_uuid_generate(pool));
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
+ use_block_read ? "1" : "0");
/* now, open the requested repository */
- SVN_ERR(svn_repos_open2(repos, path, fs_config, pool));
+ SVN_ERR(svn_repos_open3(repos, path, fs_config, pool, pool));
svn_fs_set_warning_func(svn_repos_fs(*repos), warning_func, NULL);
return SVN_NO_ERROR;
}
@@ -150,11 +163,13 @@ check_lib_versions(void)
static svn_opt_subcommand_t
subcommand_crashtest,
subcommand_create,
+ subcommand_delrevprop,
subcommand_deltify,
subcommand_dump,
subcommand_freeze,
subcommand_help,
subcommand_hotcopy,
+ subcommand_info,
subcommand_load,
subcommand_list_dblogs,
subcommand_list_unused_dblogs,
@@ -176,6 +191,7 @@ enum svnadmin__cmdline_options_t
{
svnadmin__version = SVN_OPT_FIRST_LONGOPT_ID,
svnadmin__incremental,
+ svnadmin__keep_going,
svnadmin__deltas,
svnadmin__ignore_uuid,
svnadmin__force_uuid,
@@ -186,6 +202,7 @@ enum svnadmin__cmdline_options_t
svnadmin__config_dir,
svnadmin__bypass_hooks,
svnadmin__bypass_prop_validation,
+ svnadmin__ignore_dates,
svnadmin__use_pre_commit_hook,
svnadmin__use_post_commit_hook,
svnadmin__use_pre_revprop_change_hook,
@@ -195,7 +212,9 @@ enum svnadmin__cmdline_options_t
svnadmin__pre_1_4_compatible,
svnadmin__pre_1_5_compatible,
svnadmin__pre_1_6_compatible,
- svnadmin__compatible_version
+ svnadmin__compatible_version,
+ svnadmin__check_normalization,
+ svnadmin__metadata_only
};
/* Option codes and descriptions.
@@ -231,8 +250,11 @@ static const apr_getopt_option_t options_table[] =
{"bypass-prop-validation", svnadmin__bypass_prop_validation, 0,
N_("bypass property validation logic")},
+ {"ignore-dates", svnadmin__ignore_dates, 0,
+ N_("ignore revision datestamps found in the stream")},
+
{"quiet", 'q', 0,
- N_("no progress (only errors) to stderr")},
+ N_("no progress (only errors to stderr)")},
{"ignore-uuid", svnadmin__ignore_uuid, 0,
N_("ignore any repos UUID found in the stream")},
@@ -241,7 +263,9 @@ static const apr_getopt_option_t options_table[] =
N_("set repos UUID to that found in stream, if any")},
{"fs-type", svnadmin__fs_type, 1,
- N_("type of repository: 'fsfs' (default) or 'bdb'")},
+ N_("type of repository:\n"
+ " 'fsfs' (default), 'bdb' or 'fsx'\n"
+ " CAUTION: FSX is for EXPERIMENTAL use only!")},
{"parent-dir", svnadmin__parent_dir, 1,
N_("load at specified directory in repository")},
@@ -284,6 +308,9 @@ static const apr_getopt_option_t options_table[] =
{"pre-1.6-compatible", svnadmin__pre_1_6_compatible, 0,
N_("deprecated; see --compatible-version")},
+ {"keep-going", svnadmin__keep_going, 0,
+ N_("continue verification after detecting a corruption")},
+
{"memory-cache-size", 'M', 1,
N_("size of the extra in-memory cache in MB used to\n"
" minimize redundant operations. Default: 16.\n"
@@ -295,6 +322,17 @@ static const apr_getopt_option_t options_table[] =
{"file", 'F', 1, N_("read repository paths from file ARG")},
+ {"check-normalization", svnadmin__check_normalization, 0,
+ N_("report any names within the same directory or\n"
+ " svn:mergeinfo property value that differ only\n"
+ " in character representation, but are otherwise\n"
+ " identical")},
+
+ {"metadata-only", svnadmin__metadata_only, 0,
+ N_("verify metadata only (ignored for BDB),\n"
+ " checking against external corruption in\n"
+ " Subversion 1.9+ format repositories.\n")},
+
{NULL}
};
@@ -319,6 +357,19 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
svnadmin__pre_1_6_compatible
} },
+ {"delrevprop", subcommand_delrevprop, {0}, N_
+ ("usage: 1. svnadmin delrevprop REPOS_PATH -r REVISION NAME\n"
+ " 2. svnadmin delrevprop REPO_PATH -t TXN NAME\n\n"
+ "1. Delete the property NAME on revision REVISION.\n\n"
+ "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+ "trigger the revision property-related hooks (for example, if you want\n"
+ "an email notification sent from your post-revprop-change hook).\n\n"
+ "NOTE: Revision properties are not versioned, so this command will\n"
+ "irreversibly destroy the previous value of the property.\n\n"
+ "2. Delete the property NAME on transaction TXN.\n"),
+ {'r', 't', svnadmin__use_pre_revprop_change_hook,
+ svnadmin__use_post_revprop_change_hook} },
+
{"deltify", subcommand_deltify, {0}, N_
("usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n\n"
"Run over the requested revision range, performing predecessor delti-\n"
@@ -345,6 +396,7 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
("usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n\n"
"1. Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n"
+ " Allows safe use of third-party backup tools on a live repository.\n"
"\n"
"2. Like 1 except all repositories listed in FILE are locked. The file\n"
" format is repository paths separated by newlines. Repositories are\n"
@@ -361,7 +413,12 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
"Make a hot copy of a repository.\n"
"If --incremental is passed, data which already exists at the destination\n"
"is not copied again. Incremental mode is implemented for FSFS repositories.\n"),
- {svnadmin__clean_logs, svnadmin__incremental} },
+ {svnadmin__clean_logs, svnadmin__incremental, 'q'} },
+
+ {"info", subcommand_info, {0}, N_
+ ("usage: svnadmin info REPOS_PATH\n\n"
+ "Print information about the repository at REPOS_PATH.\n"),
+ {0} },
{"list-dblogs", subcommand_list_dblogs, {0}, N_
("usage: svnadmin list-dblogs REPOS_PATH\n\n"
@@ -384,6 +441,7 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
"If --revision is specified, limit the loaded revisions to only those\n"
"in the dump stream whose revision numbers match the specified range.\n"),
{'q', 'r', svnadmin__ignore_uuid, svnadmin__force_uuid,
+ svnadmin__ignore_dates,
svnadmin__use_pre_commit_hook, svnadmin__use_post_commit_hook,
svnadmin__parent_dir, svnadmin__bypass_prop_validation, 'M'} },
@@ -409,7 +467,7 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
("usage: svnadmin pack REPOS_PATH\n\n"
"Possibly compact the repository into a more efficient storage model.\n"
"This may not apply to all repositories, in which case, exit.\n"),
- {'q'} },
+ {'q', 'M'} },
{"recover", subcommand_recover, {0}, N_
("usage: svnadmin recover REPOS_PATH\n\n"
@@ -442,14 +500,16 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
{'r', svnadmin__bypass_hooks} },
{"setrevprop", subcommand_setrevprop, {0}, N_
- ("usage: svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n\n"
- "Set the property NAME on revision REVISION to the contents of FILE. Use\n"
- "--use-pre-revprop-change-hook/--use-post-revprop-change-hook to trigger\n"
- "the revision property-related hooks (for example, if you want an email\n"
- "notification sent from your post-revprop-change hook).\n\n"
+ ("usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
+ " 2. svnadmin setrevprop REPOS_PATH -t TXN NAME FILE\n\n"
+ "1. Set the property NAME on revision REVISION to the contents of FILE.\n\n"
+ "Use --use-pre-revprop-change-hook/--use-post-revprop-change-hook to\n"
+ "trigger the revision property-related hooks (for example, if you want\n"
+ "an email notification sent from your post-revprop-change hook).\n\n"
"NOTE: Revision properties are not versioned, so this command will\n"
- "overwrite the previous value of the property.\n"),
- {'r', svnadmin__use_pre_revprop_change_hook,
+ "overwrite the previous value of the property.\n\n"
+ "2. Set the property NAME on transaction TXN to the contents of FILE.\n"),
+ {'r', 't', svnadmin__use_pre_revprop_change_hook,
svnadmin__use_post_revprop_change_hook} },
{"setuuid", subcommand_setuuid, {0}, N_
@@ -482,7 +542,8 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
{"verify", subcommand_verify, {0}, N_
("usage: svnadmin verify REPOS_PATH\n\n"
"Verify the data stored in the repository.\n"),
- {'t', 'r', 'q', 'M'} },
+ {'t', 'r', 'q', svnadmin__keep_going, 'M',
+ svnadmin__check_normalization, svnadmin__metadata_only} },
{ NULL, NULL, {0}, NULL, {0} }
};
@@ -493,9 +554,6 @@ struct svnadmin_opt_state
{
const char *repository_path;
const char *fs_type; /* --fs-type */
- svn_boolean_t pre_1_4_compatible; /* --pre-1.4-compatible */
- svn_boolean_t pre_1_5_compatible; /* --pre-1.5-compatible */
- svn_boolean_t pre_1_6_compatible; /* --pre-1.6-compatible */
svn_version_t *compatible_version; /* --compatible-version */
svn_opt_revision_t start_revision, end_revision; /* -r X[:Y] */
const char *txn_id; /* -t TXN */
@@ -513,11 +571,15 @@ struct svnadmin_opt_state
svn_boolean_t clean_logs; /* --clean-logs */
svn_boolean_t bypass_hooks; /* --bypass-hooks */
svn_boolean_t wait; /* --wait */
+ svn_boolean_t keep_going; /* --keep-going */
+ svn_boolean_t check_normalization; /* --check-normalization */
+ svn_boolean_t metadata_only; /* --metadata-only */
svn_boolean_t bypass_prop_validation; /* --bypass-prop-validation */
+ svn_boolean_t ignore_dates; /* --ignore-dates */
enum svn_repos_load_uuid uuid_action; /* --ignore-uuid,
--force-uuid */
apr_uint64_t memory_cache_size; /* --memory-cache-size M */
- const char *parent_dir;
+ const char *parent_dir; /* --parent-dir */
svn_stringbuf_t *filedata; /* --file */
const char *config_dir; /* Overriding Configuration Directory */
@@ -564,7 +626,7 @@ target_arg_to_dirent(const char **dirent,
SVN_ERR(svn_utf_cstring_to_utf8(&path, arg, pool));
if (svn_path_is_url(path))
return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- "Path '%s' is not a local path", path);
+ _("Path '%s' is not a local path"), path);
*dirent = svn_dirent_internal_style(path, pool);
return SVN_NO_ERROR;
}
@@ -593,10 +655,10 @@ parse_args(apr_array_header_t **args,
if ((min_expected >= 0) && (num_args < min_expected))
return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0,
- "Not enough arguments");
+ _("Not enough arguments"));
if ((max_expected >= 0) && (num_args > max_expected))
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0,
- "Too many arguments");
+ _("Too many arguments"));
if (args)
{
*args = apr_array_make(pool, num_args, sizeof(const char *));
@@ -611,6 +673,17 @@ parse_args(apr_array_header_t **args,
}
+/* This implements 'svn_error_malfunction_handler_t. */
+static svn_error_t *
+crashtest_malfunction_handler(svn_boolean_t can_return,
+ const char *file,
+ int line,
+ const char *expr)
+{
+ abort();
+ return SVN_NO_ERROR; /* Not reached. */
+}
+
/* This implements `svn_opt_subcommand_t'. */
static svn_error_t *
subcommand_crashtest(apr_getopt_t *os, void *baton, apr_pool_t *pool)
@@ -618,7 +691,14 @@ subcommand_crashtest(apr_getopt_t *os, void *baton, apr_pool_t *pool)
struct svnadmin_opt_state *opt_state = baton;
svn_repos_t *repos;
+ (void)svn_error_set_malfunction_handler(crashtest_malfunction_handler);
SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("Successfully opened repository '%s'.\n"
+ "Will now crash to simulate a crashing "
+ "server process.\n"),
+ svn_dirent_local_style(opt_state->repository_path,
+ pool)));
SVN_ERR_MALFUNCTION();
/* merely silence a compiler warning (this will never be executed) */
@@ -662,17 +742,6 @@ subcommand_create(apr_getopt_t *os, void *baton, apr_pool_t *pool)
svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, opt_state->fs_type);
}
- /* Prior to 1.8, we had explicit options to specify compatibility
- with a handful of prior Subversion releases. */
- if (opt_state->pre_1_4_compatible)
- svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE, "1");
- if (opt_state->pre_1_5_compatible)
- svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_5_COMPATIBLE, "1");
- if (opt_state->pre_1_6_compatible)
- svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE, "1");
-
- /* In 1.8, we figured out that we didn't have to keep extending this
- madness indefinitely. */
if (opt_state->compatible_version)
{
if (! svn_version__at_least(opt_state->compatible_version, 1, 4, 0))
@@ -683,18 +752,40 @@ subcommand_create(apr_getopt_t *os, void *baton, apr_pool_t *pool)
svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE, "1");
if (! svn_version__at_least(opt_state->compatible_version, 1, 8, 0))
svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE, "1");
+ /* In 1.9, we figured out that we didn't have to keep extending this
+ madness indefinitely. */
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_COMPATIBLE_VERSION,
+ apr_psprintf(pool, "%d.%d.%d%s%s",
+ opt_state->compatible_version->major,
+ opt_state->compatible_version->minor,
+ opt_state->compatible_version->patch,
+ opt_state->compatible_version->tag
+ ? "-" : "",
+ opt_state->compatible_version->tag
+ ? opt_state->compatible_version->tag : ""));
}
- if (opt_state->compatible_version
- && ! svn_version__at_least(opt_state->compatible_version, 1, 1, 0)
- /* ### TODO: this NULL check hard-codes knowledge of the library's
- default fs-type value */
- && (opt_state->fs_type == NULL
- || !strcmp(opt_state->fs_type, SVN_FS_TYPE_FSFS)))
+ if (opt_state->compatible_version)
{
- return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Repositories compatible with 1.0.x must use "
- "--fs-type=bdb"));
+ if (! svn_version__at_least(opt_state->compatible_version, 1, 1, 0)
+ /* ### TODO: this NULL check hard-codes knowledge of the library's
+ default fs-type value */
+ && (opt_state->fs_type == NULL
+ || !strcmp(opt_state->fs_type, SVN_FS_TYPE_FSFS)))
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Repositories compatible with 1.0.x must "
+ "use --fs-type=bdb"));
+ }
+
+ if (! svn_version__at_least(opt_state->compatible_version, 1, 9, 0)
+ && opt_state->fs_type && !strcmp(opt_state->fs_type, SVN_FS_TYPE_FSX))
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Repositories compatible with 1.8.x or "
+ "earlier cannot use --fs-type=%s"),
+ SVN_FS_TYPE_FSX);
+ }
}
SVN_ERR(svn_repos_create(&repos, opt_state->repository_path,
@@ -756,16 +847,87 @@ subcommand_deltify(apr_getopt_t *os, void *baton, apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* Structure for errors encountered during 'svnadmin verify --keep-going'. */
+struct verification_error
+{
+ svn_revnum_t rev;
+ svn_error_t *err;
+};
+
+/* Pool cleanup function to clear an svn_error_t *. */
+static apr_status_t
+err_cleanup(void *data)
+{
+ svn_error_t *err = data;
+
+ svn_error_clear(err);
+
+ return APR_SUCCESS;
+}
+
+struct repos_verify_callback_baton
+{
+ /* Should we continue after receiving a first verification error? */
+ svn_boolean_t keep_going;
+
+ /* List of errors encountered during 'svnadmin verify --keep-going'. */
+ apr_array_header_t *error_summary;
+
+ /* Pool for data collected during callback invocations. */
+ apr_pool_t *result_pool;
+};
+
+/* Implementation of svn_repos_verify_callback_t to handle errors coming
+ from svn_repos_verify_fs3(). */
+static svn_error_t *
+repos_verify_callback(void *baton,
+ svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool)
+{
+ struct repos_verify_callback_baton *b = baton;
+
+ if (revision == SVN_INVALID_REVNUM)
+ {
+ SVN_ERR(svn_cmdline_fputs(_("* Error verifying repository metadata.\n"),
+ stderr, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
+ _("* Error verifying revision %ld.\n"),
+ revision));
+ }
+
+ if (b->keep_going)
+ {
+ struct verification_error *verr;
+
+ svn_handle_error2(verify_err, stderr, FALSE, "svnadmin: ");
+
+ /* Remember the error in B->ERROR_SUMMARY. */
+ verr = apr_palloc(b->result_pool, sizeof(*verr));
+ verr->rev = revision;
+ verr->err = svn_error_dup(verify_err);
+ apr_pool_cleanup_register(b->result_pool, verr->err, err_cleanup,
+ apr_pool_cleanup_null);
+ APR_ARRAY_PUSH(b->error_summary, struct verification_error *) = verr;
+
+ return SVN_NO_ERROR;
+ }
+ else
+ return svn_error_trace(svn_error_dup(verify_err));
+}
/* Implementation of svn_repos_notify_func_t to wrap the output to a
- response stream for svn_repos_dump_fs2() and svn_repos_verify_fs() */
+ response stream for svn_repos_dump_fs2(), svn_repos_verify_fs(),
+ svn_repos_hotcopy3() and others. */
static void
repos_notify_handler(void *baton,
const svn_repos_notify_t *notify,
apr_pool_t *scratch_pool)
{
svn_stream_t *feedback_stream = baton;
- apr_size_t len;
switch (notify->action)
{
@@ -789,7 +951,7 @@ repos_notify_handler(void *baton,
case svn_repos_notify_verify_rev_structure:
if (notify->revision == SVN_INVALID_REVNUM)
- svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ svn_error_clear(svn_stream_puts(feedback_stream,
_("* Verifying repository metadata ...\n")));
else
svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
@@ -877,13 +1039,11 @@ repos_notify_handler(void *baton,
return;
case svn_repos_notify_load_node_done:
- svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
- "%s", _(" done.\n")));
+ svn_error_clear(svn_stream_puts(feedback_stream, _(" done.\n")));
return;
case svn_repos_notify_load_copied_node:
- len = 9;
- svn_error_clear(svn_stream_write(feedback_stream, "COPIED...", &len));
+ svn_error_clear(svn_stream_puts(feedback_stream, "COPIED..."));
return;
case svn_repos_notify_load_txn_start:
@@ -911,7 +1071,7 @@ repos_notify_handler(void *baton,
return;
case svn_repos_notify_recover_start:
- svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ svn_error_clear(svn_stream_puts(feedback_stream,
_("Repository lock acquired.\n"
"Please wait; recovering the"
" repository may take some time...\n")));
@@ -924,6 +1084,49 @@ repos_notify_handler(void *baton,
" repository may take some time...\n")));
return;
+ case svn_repos_notify_pack_revprops:
+ {
+ const char *shardstr = apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ notify->shard);
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("Packed revision properties in shard %s\n"),
+ shardstr));
+ return;
+ }
+
+ case svn_repos_notify_cleanup_revprops:
+ {
+ const char *shardstr = apr_psprintf(scratch_pool,
+ "%" APR_INT64_T_FMT,
+ notify->shard);
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("Removed non-packed revision properties"
+ " in shard %s\n"),
+ shardstr));
+ return;
+ }
+
+ case svn_repos_notify_format_bumped:
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("Bumped repository format to %ld\n"),
+ notify->revision));
+ return;
+
+ case svn_repos_notify_hotcopy_rev_range:
+ if (notify->start_revision == notify->end_revision)
+ {
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("* Copied revision %ld.\n"),
+ notify->start_revision));
+ }
+ else
+ {
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("* Copied revisions from %ld to %ld.\n"),
+ notify->start_revision, notify->end_revision));
+ }
+
default:
return;
}
@@ -980,7 +1183,7 @@ subcommand_dump(apr_getopt_t *os, void *baton, apr_pool_t *pool)
svn_stream_t *stdout_stream;
svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM;
svn_revnum_t youngest;
- svn_stream_t *progress_stream = NULL;
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1014,12 +1217,12 @@ subcommand_dump(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/* Progress feedback goes to STDERR, unless they asked to suppress it. */
if (! opt_state->quiet)
- progress_stream = recode_stream_create(stderr, pool);
+ feedback_stream = recode_stream_create(stderr, pool);
SVN_ERR(svn_repos_dump_fs3(repos, stdout_stream, lower, upper,
opt_state->incremental, opt_state->use_deltas,
!opt_state->quiet ? repos_notify_handler : NULL,
- progress_stream, check_cancel, NULL, pool));
+ feedback_stream, check_cancel, NULL, pool));
return SVN_NO_ERROR;
}
@@ -1079,8 +1282,10 @@ subcommand_freeze(apr_getopt_t *os, void *baton, apr_pool_t *pool)
}
else
{
+ const char *utf8;
/* All repositories in filedata. */
- paths = svn_cstring_split(opt_state->filedata->data, "\n", FALSE, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8, opt_state->filedata->data, pool));
+ paths = svn_cstring_split(utf8, "\r\n", FALSE, pool);
}
b.command = APR_ARRAY_IDX(args, 0, const char *);
@@ -1106,6 +1311,7 @@ subcommand_help(apr_getopt_t *os, void *baton, apr_pool_t *pool)
struct svnadmin_opt_state *opt_state = baton;
const char *header =
_("general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+ "Subversion repository administration tool.\n"
"Type 'svnadmin help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnadmin --version' to see the program version and FS modules.\n"
"\n"
@@ -1165,7 +1371,8 @@ subcommand_load(apr_getopt_t *os, void *baton, apr_pool_t *pool)
struct svnadmin_opt_state *opt_state = baton;
svn_repos_t *repos;
svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM;
- svn_stream_t *stdin_stream, *stdout_stream = NULL;
+ svn_stream_t *stdin_stream;
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1199,15 +1406,16 @@ subcommand_load(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/* Progress feedback goes to STDOUT, unless they asked to suppress it. */
if (! opt_state->quiet)
- stdout_stream = recode_stream_create(stdout, pool);
+ feedback_stream = recode_stream_create(stdout, pool);
- err = svn_repos_load_fs4(repos, stdin_stream, lower, upper,
+ err = svn_repos_load_fs5(repos, stdin_stream, lower, upper,
opt_state->uuid_action, opt_state->parent_dir,
opt_state->use_pre_commit_hook,
opt_state->use_post_commit_hook,
!opt_state->bypass_prop_validation,
+ opt_state->ignore_dates,
opt_state->quiet ? NULL : repos_notify_handler,
- stdout_stream, check_cancel, NULL, pool);
+ feedback_stream, check_cancel, NULL, pool);
if (err && err->apr_err == SVN_ERR_BAD_PROPERTY_VALUE)
return svn_error_quick_wrap(err,
_("Invalid property value found in "
@@ -1254,12 +1462,12 @@ subcommand_recover(apr_getopt_t *os, void *baton, apr_pool_t *pool)
svn_repos_t *repos;
svn_error_t *err;
struct svnadmin_opt_state *opt_state = baton;
- svn_stream_t *stdout_stream;
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
- SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
+ SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool));
/* Restore default signal handlers until after we have acquired the
* exclusive lock so that the user interrupt before we actually
@@ -1267,7 +1475,7 @@ subcommand_recover(apr_getopt_t *os, void *baton, apr_pool_t *pool)
setup_cancellation_signals(SIG_DFL);
err = svn_repos_recover4(opt_state->repository_path, TRUE,
- repos_notify_handler, stdout_stream,
+ repos_notify_handler, feedback_stream,
check_cancel, NULL, pool);
if (err)
{
@@ -1285,7 +1493,7 @@ subcommand_recover(apr_getopt_t *os, void *baton, apr_pool_t *pool)
" another process has it open?\n")));
SVN_ERR(svn_cmdline_fflush(stdout));
SVN_ERR(svn_repos_recover4(opt_state->repository_path, FALSE,
- repos_notify_handler, stdout_stream,
+ repos_notify_handler, feedback_stream,
check_cancel, NULL, pool));
}
@@ -1423,30 +1631,47 @@ subcommand_rmtxns(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/* A helper for the 'setrevprop' and 'setlog' commands. Expects
- OPT_STATE->use_pre_revprop_change_hook and
- OPT_STATE->use_post_revprop_change_hook to be set appropriately. */
+ OPT_STATE->txn_id, OPT_STATE->use_pre_revprop_change_hook and
+ OPT_STATE->use_post_revprop_change_hook to be set appropriately.
+ If FILENAME is NULL, delete property PROP_NAME. */
static svn_error_t *
set_revprop(const char *prop_name, const char *filename,
struct svnadmin_opt_state *opt_state, apr_pool_t *pool)
{
svn_repos_t *repos;
- svn_string_t *prop_value = svn_string_create_empty(pool);
- svn_stringbuf_t *file_contents;
+ svn_string_t *prop_value;
+
+ if (filename)
+ {
+ svn_stringbuf_t *file_contents;
- SVN_ERR(svn_stringbuf_from_file2(&file_contents, filename, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&file_contents, filename, pool));
- prop_value->data = file_contents->data;
- prop_value->len = file_contents->len;
+ prop_value = svn_string_create_empty(pool);
+ prop_value->data = file_contents->data;
+ prop_value->len = file_contents->len;
- SVN_ERR(svn_subst_translate_string2(&prop_value, NULL, NULL, prop_value,
- NULL, FALSE, pool, pool));
+ SVN_ERR(svn_subst_translate_string2(&prop_value, NULL, NULL, prop_value,
+ NULL, FALSE, pool, pool));
+ }
+ else
+ {
+ prop_value = NULL;
+ }
/* Open the filesystem */
SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
- /* If we are bypassing the hooks system, we just hit the filesystem
- directly. */
- SVN_ERR(svn_repos_fs_change_rev_prop4(
+ if (opt_state->txn_id)
+ {
+ svn_fs_t *fs = svn_repos_fs(repos);
+ svn_fs_txn_t *txn;
+
+ SVN_ERR(svn_fs_open_txn(&txn, fs, opt_state->txn_id, pool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, prop_name, prop_value, pool));
+ }
+ else
+ SVN_ERR(svn_repos_fs_change_rev_prop4(
repos, opt_state->start_revision.value.number,
NULL, prop_name, NULL, prop_value,
opt_state->use_pre_revprop_change_hook,
@@ -1471,7 +1696,21 @@ subcommand_setrevprop(apr_getopt_t *os, void *baton, apr_pool_t *pool)
filename = APR_ARRAY_IDX(args, 1, const char *);
SVN_ERR(target_arg_to_dirent(&filename, filename, pool));
- if (opt_state->start_revision.kind != svn_opt_revision_number)
+ if (opt_state->txn_id)
+ {
+ if (opt_state->start_revision.kind != svn_opt_revision_unspecified
+ || opt_state->end_revision.kind != svn_opt_revision_unspecified)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--revision (-r) and --transaction (-t) "
+ "are mutually exclusive"));
+
+ if (opt_state->use_pre_revprop_change_hook
+ || opt_state->use_post_revprop_change_hook)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Calling hooks is incompatible with "
+ "--transaction (-t)"));
+ }
+ else if (opt_state->start_revision.kind != svn_opt_revision_number)
return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Missing revision"));
else if (opt_state->end_revision.kind != svn_opt_revision_unspecified)
@@ -1540,7 +1779,7 @@ subcommand_pack(apr_getopt_t *os, void *baton, apr_pool_t *pool)
{
struct svnadmin_opt_state *opt_state = baton;
svn_repos_t *repos;
- svn_stream_t *progress_stream = NULL;
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1549,11 +1788,11 @@ subcommand_pack(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/* Progress feedback goes to STDOUT, unless they asked to suppress it. */
if (! opt_state->quiet)
- progress_stream = recode_stream_create(stdout, pool);
+ feedback_stream = recode_stream_create(stdout, pool);
return svn_error_trace(
svn_repos_fs_pack2(repos, !opt_state->quiet ? repos_notify_handler : NULL,
- progress_stream, check_cancel, NULL, pool));
+ feedback_stream, check_cancel, NULL, pool));
}
@@ -1565,7 +1804,8 @@ subcommand_verify(apr_getopt_t *os, void *baton, apr_pool_t *pool)
svn_repos_t *repos;
svn_fs_t *fs;
svn_revnum_t youngest, lower, upper;
- svn_stream_t *progress_stream = NULL;
+ svn_stream_t *feedback_stream = NULL;
+ struct repos_verify_callback_baton verify_baton = { 0 };
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1609,13 +1849,93 @@ subcommand_verify(apr_getopt_t *os, void *baton, apr_pool_t *pool)
upper = lower;
}
- if (! opt_state->quiet)
- progress_stream = recode_stream_create(stderr, pool);
+ if (!opt_state->quiet)
+ feedback_stream = recode_stream_create(stdout, pool);
+
+ verify_baton.keep_going = opt_state->keep_going;
+ verify_baton.error_summary =
+ apr_array_make(pool, 0, sizeof(struct verification_error *));
+ verify_baton.result_pool = pool;
+
+ SVN_ERR(svn_repos_verify_fs3(repos, lower, upper,
+ opt_state->check_normalization,
+ opt_state->metadata_only,
+ !opt_state->quiet
+ ? repos_notify_handler : NULL,
+ feedback_stream,
+ repos_verify_callback, &verify_baton,
+ check_cancel, NULL, pool));
+
+ /* Show the --keep-going error summary. */
+ if (!opt_state->quiet
+ && opt_state->keep_going
+ && verify_baton.error_summary->nelts > 0)
+ {
+ int rev_maxlength;
+ svn_revnum_t end_revnum;
+ apr_pool_t *iterpool;
+ int i;
+
+ svn_error_clear(
+ svn_stream_puts(feedback_stream,
+ _("\n-----Summary of corrupt revisions-----\n")));
+
+ /* The standard column width for the revision number is 6 characters.
+ If the revision number can potentially be larger (i.e. if end_revnum
+ is larger than 1000000), we increase the column width as needed. */
+ rev_maxlength = 6;
+ end_revnum = APR_ARRAY_IDX(verify_baton.error_summary,
+ verify_baton.error_summary->nelts - 1,
+ struct verification_error *)->rev;
+ while (end_revnum >= 1000000)
+ {
+ rev_maxlength++;
+ end_revnum = end_revnum / 10;
+ }
+
+ iterpool = svn_pool_create(pool);
+ for (i = 0; i < verify_baton.error_summary->nelts; i++)
+ {
+ struct verification_error *verr;
+ svn_error_t *err;
+ const char *rev_str;
+
+ svn_pool_clear(iterpool);
+
+ verr = APR_ARRAY_IDX(verify_baton.error_summary, i,
+ struct verification_error *);
+
+ if (verr->rev != SVN_INVALID_REVNUM)
+ {
+ rev_str = apr_psprintf(iterpool, "r%ld", verr->rev);
+ rev_str = apr_psprintf(iterpool, "%*s", rev_maxlength, rev_str);
+ for (err = svn_error_purge_tracing(verr->err);
+ err != SVN_NO_ERROR; err = err->child)
+ {
+ char buf[512];
+ const char *message;
+
+ message = svn_err_best_message(err, buf, sizeof(buf));
+ svn_error_clear(svn_stream_printf(feedback_stream, iterpool,
+ "%s: E%06d: %s\n",
+ rev_str, err->apr_err,
+ message));
+ }
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ if (verify_baton.error_summary->nelts > 0)
+ {
+ return svn_error_createf(SVN_ERR_CL_REPOS_VERIFY_FAILED, NULL,
+ _("Failed to verify repository '%s'"),
+ svn_dirent_local_style(
+ opt_state->repository_path, pool));
+ }
- return svn_repos_verify_fs2(repos, lower, upper,
- !opt_state->quiet
- ? repos_notify_handler : NULL,
- progress_stream, check_cancel, NULL, pool);
+ return SVN_NO_ERROR;
}
/* This implements `svn_opt_subcommand_t'. */
@@ -1623,6 +1943,7 @@ svn_error_t *
subcommand_hotcopy(apr_getopt_t *os, void *baton, apr_pool_t *pool)
{
struct svnadmin_opt_state *opt_state = baton;
+ svn_stream_t *feedback_stream = NULL;
apr_array_header_t *targets;
const char *new_repos_path;
@@ -1631,9 +1952,136 @@ subcommand_hotcopy(apr_getopt_t *os, void *baton, apr_pool_t *pool)
new_repos_path = APR_ARRAY_IDX(targets, 0, const char *);
SVN_ERR(target_arg_to_dirent(&new_repos_path, new_repos_path, pool));
- return svn_repos_hotcopy2(opt_state->repository_path, new_repos_path,
+ /* Progress feedback goes to STDOUT, unless they asked to suppress it. */
+ if (! opt_state->quiet)
+ feedback_stream = recode_stream_create(stdout, pool);
+
+ return svn_repos_hotcopy3(opt_state->repository_path, new_repos_path,
opt_state->clean_logs, opt_state->incremental,
- check_cancel, NULL, pool);
+ !opt_state->quiet ? repos_notify_handler : NULL,
+ feedback_stream, check_cancel, NULL, pool);
+}
+
+svn_error_t *
+subcommand_info(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ struct svnadmin_opt_state *opt_state = baton;
+ svn_repos_t *repos;
+ svn_fs_t *fs;
+ int fs_format;
+ const char *uuid;
+
+ /* Expect no more arguments. */
+ SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+
+ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
+ fs = svn_repos_fs(repos);
+ SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"),
+ svn_dirent_local_style(svn_repos_path(repos, pool),
+ pool)));
+
+ SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool));
+ SVN_ERR(svn_cmdline_printf(pool, _("UUID: %s\n"), uuid));
+ {
+ int repos_format, minor;
+ svn_version_t *repos_version, *fs_version;
+ SVN_ERR(svn_repos_info_format(&repos_format, &repos_version,
+ repos, pool, pool));
+ SVN_ERR(svn_cmdline_printf(pool, _("Repository Format: %d\n"),
+ repos_format));
+
+ SVN_ERR(svn_fs_info_format(&fs_format, &fs_version,
+ fs, pool, pool));
+ /* fs_format will be printed later. */
+
+ SVN_ERR_ASSERT(repos_version->major == SVN_VER_MAJOR);
+ SVN_ERR_ASSERT(fs_version->major == SVN_VER_MAJOR);
+ SVN_ERR_ASSERT(repos_version->patch == 0);
+ SVN_ERR_ASSERT(fs_version->patch == 0);
+
+ minor = (repos_version->minor > fs_version->minor)
+ ? repos_version->minor : fs_version->minor;
+ SVN_ERR(svn_cmdline_printf(pool, _("Compatible With Version: %d.%d.0\n"),
+ SVN_VER_MAJOR, minor));
+ }
+
+ {
+ apr_hash_t *capabilities_set;
+ apr_array_header_t *capabilities;
+ int i;
+
+ SVN_ERR(svn_repos_capabilities(&capabilities_set, repos, pool, pool));
+ capabilities = svn_sort__hash(capabilities_set,
+ svn_sort_compare_items_lexically,
+ pool);
+
+ for (i = 0; i < capabilities->nelts; i++)
+ {
+ svn_sort__item_t *item = &APR_ARRAY_IDX(capabilities, i,
+ svn_sort__item_t);
+ const char *capability = item->key;
+ SVN_ERR(svn_cmdline_printf(pool, _("Repository Capability: %s\n"),
+ capability));
+ }
+ }
+
+ {
+ const svn_fs_info_placeholder_t *info;
+
+ SVN_ERR(svn_fs_info(&info, fs, pool, pool));
+ SVN_ERR(svn_cmdline_printf(pool, _("Filesystem Type: %s\n"),
+ info->fs_type));
+ SVN_ERR(svn_cmdline_printf(pool, _("Filesystem Format: %d\n"),
+ fs_format));
+ if (!strcmp(info->fs_type, SVN_FS_TYPE_FSFS))
+ {
+ const svn_fs_fsfs_info_t *fsfs_info = (const void *)info;
+ svn_revnum_t youngest;
+ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
+
+ if (fsfs_info->shard_size)
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Sharded: yes\n")));
+ else
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Sharded: no\n")));
+
+ if (fsfs_info->shard_size)
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Shard Size: %d\n"),
+ fsfs_info->shard_size));
+
+ /* Print packing statistics, if enabled on the FS. */
+ if (fsfs_info->shard_size)
+ {
+ const int shard_size = fsfs_info->shard_size;
+ const long shards_packed = fsfs_info->min_unpacked_rev / shard_size;
+ const long shards_full = (youngest + 1) / shard_size;
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Shards Packed: %ld/%ld\n"),
+ shards_packed, shards_full));
+ }
+
+ if (fsfs_info->log_addressing)
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: yes\n")));
+ else
+ SVN_ERR(svn_cmdline_printf(pool, _("FSFS Logical Addressing: no\n")));
+ }
+ }
+
+ {
+ apr_array_header_t *files;
+ int i;
+
+ SVN_ERR(svn_fs_info_config_files(&files, fs, pool, pool));
+ for (i = 0; i < files->nelts; i++)
+ SVN_ERR(svn_cmdline_printf(pool, _("Configuration File: %s\n"),
+ svn_dirent_local_style(
+ APR_ARRAY_IDX(files, i, const char *),
+ pool)));
+ }
+
+ /* 'svn info' prints an extra newline here, to support multiple targets.
+ We'll do the same. */
+ SVN_ERR(svn_cmdline_printf(pool, "\n"));
+
+ return SVN_NO_ERROR;
}
/* This implements `svn_opt_subcommand_t'. */
@@ -1709,6 +2157,7 @@ subcommand_lslocks(apr_getopt_t *os, void *baton, apr_pool_t *pool)
const char *fs_path = "/";
apr_hash_t *locks;
apr_hash_index_t *hi;
+ apr_pool_t *iterpool = svn_pool_create(pool);
SVN_ERR(svn_opt__args_to_target_array(&targets, os,
apr_array_make(pool, 0,
@@ -1729,24 +2178,28 @@ subcommand_lslocks(apr_getopt_t *os, void *baton, apr_pool_t *pool)
for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
{
const char *cr_date, *exp_date = "";
- const char *path = svn__apr_hash_index_key(hi);
- svn_lock_t *lock = svn__apr_hash_index_val(hi);
+ const char *path = apr_hash_this_key(hi);
+ svn_lock_t *lock = apr_hash_this_val(hi);
int comment_lines = 0;
- cr_date = svn_time_to_human_cstring(lock->creation_date, pool);
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(check_cancel(NULL));
+
+ cr_date = svn_time_to_human_cstring(lock->creation_date, iterpool);
if (lock->expiration_date)
- exp_date = svn_time_to_human_cstring(lock->expiration_date, pool);
+ exp_date = svn_time_to_human_cstring(lock->expiration_date, iterpool);
if (lock->comment)
comment_lines = svn_cstring_count_newlines(lock->comment) + 1;
- SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"), path));
- SVN_ERR(svn_cmdline_printf(pool, _("UUID Token: %s\n"), lock->token));
- SVN_ERR(svn_cmdline_printf(pool, _("Owner: %s\n"), lock->owner));
- SVN_ERR(svn_cmdline_printf(pool, _("Created: %s\n"), cr_date));
- SVN_ERR(svn_cmdline_printf(pool, _("Expires: %s\n"), exp_date));
- SVN_ERR(svn_cmdline_printf(pool,
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Path: %s\n"), path));
+ SVN_ERR(svn_cmdline_printf(iterpool, _("UUID Token: %s\n"), lock->token));
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Owner: %s\n"), lock->owner));
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Created: %s\n"), cr_date));
+ SVN_ERR(svn_cmdline_printf(iterpool, _("Expires: %s\n"), exp_date));
+ SVN_ERR(svn_cmdline_printf(iterpool,
Q_("Comment (%i line):\n%s\n\n",
"Comment (%i lines):\n%s\n\n",
comment_lines),
@@ -1754,6 +2207,8 @@ subcommand_lslocks(apr_getopt_t *os, void *baton, apr_pool_t *pool)
lock->comment ? lock->comment : ""));
}
+ svn_pool_destroy(iterpool);
+
return SVN_NO_ERROR;
}
@@ -1888,18 +2343,18 @@ subcommand_upgrade(apr_getopt_t *os, void *baton, apr_pool_t *pool)
{
svn_error_t *err;
struct svnadmin_opt_state *opt_state = baton;
- svn_stream_t *stdout_stream;
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
- SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
+ SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool));
/* Restore default signal handlers. */
setup_cancellation_signals(SIG_DFL);
err = svn_repos_upgrade2(opt_state->repository_path, TRUE,
- repos_notify_handler, stdout_stream, pool);
+ repos_notify_handler, feedback_stream, pool);
if (err)
{
if (APR_STATUS_IS_EAGAIN(err->apr_err))
@@ -1917,7 +2372,7 @@ subcommand_upgrade(apr_getopt_t *os, void *baton, apr_pool_t *pool)
" another process has it open?\n")));
SVN_ERR(svn_cmdline_fflush(stdout));
SVN_ERR(svn_repos_upgrade2(opt_state->repository_path, FALSE,
- repos_notify_handler, stdout_stream,
+ repos_notify_handler, feedback_stream,
pool));
}
else if (err->apr_err == SVN_ERR_FS_UNSUPPORTED_UPGRADE)
@@ -1941,26 +2396,53 @@ subcommand_upgrade(apr_getopt_t *os, void *baton, apr_pool_t *pool)
}
+/* This implements `svn_opt_subcommand_t'. */
+static svn_error_t *
+subcommand_delrevprop(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ struct svnadmin_opt_state *opt_state = baton;
+ apr_array_header_t *args;
+ const char *prop_name;
+
+ /* Expect one more argument: NAME */
+ SVN_ERR(parse_args(&args, os, 1, 1, pool));
+ prop_name = APR_ARRAY_IDX(args, 0, const char *);
+
+ if (opt_state->txn_id)
+ {
+ if (opt_state->start_revision.kind != svn_opt_revision_unspecified
+ || opt_state->end_revision.kind != svn_opt_revision_unspecified)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--revision (-r) and --transaction (-t) "
+ "are mutually exclusive"));
+
+ if (opt_state->use_pre_revprop_change_hook
+ || opt_state->use_post_revprop_change_hook)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Calling hooks is incompatible with "
+ "--transaction (-t)"));
+ }
+ else if (opt_state->start_revision.kind != svn_opt_revision_number)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Missing revision"));
+ else if (opt_state->end_revision.kind != svn_opt_revision_unspecified)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Only one revision allowed"));
+
+ return set_revprop(prop_name, NULL, opt_state, pool);
+}
+
+
/** Main. **/
-/* Report and clear the error ERR, and return EXIT_FAILURE. */
-#define EXIT_ERROR(err) \
- svn_cmdline_handle_exit_error(err, NULL, "svnadmin: ")
-
-/* A redefinition of the public SVN_INT_ERR macro, that suppresses the
- * error message if it is SVN_ERR_IO_PIPE_WRITE_ERROR, amd with the
- * program name 'svnadmin' instead of 'svn'. */
-#undef SVN_INT_ERR
-#define SVN_INT_ERR(expr) \
- do { \
- svn_error_t *svn_err__temp = (expr); \
- if (svn_err__temp) \
- return EXIT_ERROR(svn_err__temp); \
- } while (0)
-
-static int
-sub_main(int argc, const char *argv[], apr_pool_t *pool)
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_t *err;
apr_status_t apr_err;
@@ -1976,15 +2458,16 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
/* Check library versions */
- SVN_INT_ERR(check_lib_versions());
+ SVN_ERR(check_lib_versions());
/* Initialize the FS library. */
- SVN_INT_ERR(svn_fs_initialize(pool));
+ SVN_ERR(svn_fs_initialize(pool));
if (argc <= 1)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Initialize opt_state. */
@@ -1993,7 +2476,7 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.memory_cache_size = svn_cache_config_get()->cache_size;
/* Parse options. */
- SVN_INT_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
@@ -2008,8 +2491,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
break;
else if (apr_err)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Stash the option code in an array before parsing it. */
@@ -2020,23 +2504,19 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
if (opt_state.start_revision.kind != svn_opt_revision_unspecified)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Multiple revision arguments encountered; "
- "try '-r N:M' instead of '-r N -r M'"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Multiple revision arguments encountered; "
+ "try '-r N:M' instead of '-r N -r M'"));
}
if (svn_opt_parse_revision(&(opt_state.start_revision),
&(opt_state.end_revision),
opt_arg, pool) != 0)
{
- err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg,
- pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- if (! err)
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Syntax error in revision argument '%s'"),
utf8_opt_arg);
- return EXIT_ERROR(err);
}
}
break;
@@ -2056,8 +2536,8 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
= 0x100000 * apr_strtoi64(opt_arg, NULL, 0);
break;
case 'F':
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
- SVN_INT_ERR(svn_stringbuf_from_file2(&(opt_state.filedata),
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&(opt_state.filedata),
utf8_opt_arg, pool));
dash_F_arg = TRUE;
case svnadmin__version:
@@ -2076,13 +2556,19 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
opt_state.uuid_action = svn_repos_load_uuid_force;
break;
case svnadmin__pre_1_4_compatible:
- opt_state.pre_1_4_compatible = TRUE;
+ opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t));
+ opt_state.compatible_version->major = 1;
+ opt_state.compatible_version->minor = 3;
break;
case svnadmin__pre_1_5_compatible:
- opt_state.pre_1_5_compatible = TRUE;
+ opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t));
+ opt_state.compatible_version->major = 1;
+ opt_state.compatible_version->minor = 4;
break;
case svnadmin__pre_1_6_compatible:
- opt_state.pre_1_6_compatible = TRUE;
+ opt_state.compatible_version = apr_pcalloc(pool, sizeof(svn_version_t));
+ opt_state.compatible_version->major = 1;
+ opt_state.compatible_version->minor = 5;
break;
case svnadmin__compatible_version:
{
@@ -2092,16 +2578,15 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
/* Parse the version string which carries our target
compatibility. */
- SVN_INT_ERR(svn_version__parse_version_string(&compatible_version,
+ SVN_ERR(svn_version__parse_version_string(&compatible_version,
opt_arg, pool));
/* We can't create repository with a version older than 1.0.0. */
if (! svn_version__at_least(compatible_version, 1, 0, 0))
{
- err = svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("Cannot create pre-1.0-compatible "
- "repositories"));
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Cannot create pre-1.0-compatible "
+ "repositories"));
}
/* We can't create repository with a version newer than what
@@ -2111,22 +2596,30 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
compatible_version->minor,
compatible_version->patch))
{
- err = svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("Cannot guarantee compatibility "
- "beyond the current running version "
- "(%s)"),
- SVN_VER_NUM );
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("Cannot guarantee compatibility "
+ "beyond the current running version "
+ "(%s)"),
+ SVN_VER_NUM);
}
opt_state.compatible_version = compatible_version;
}
break;
+ case svnadmin__keep_going:
+ opt_state.keep_going = TRUE;
+ break;
+ case svnadmin__check_normalization:
+ opt_state.check_normalization = TRUE;
+ break;
+ case svnadmin__metadata_only:
+ opt_state.metadata_only = TRUE;
+ break;
case svnadmin__fs_type:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.fs_type, opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.fs_type, opt_arg, pool));
break;
case svnadmin__parent_dir:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.parent_dir, opt_arg,
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.parent_dir, opt_arg,
pool));
opt_state.parent_dir
= svn_dirent_internal_style(opt_state.parent_dir, pool);
@@ -2155,11 +2648,14 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
case svnadmin__bypass_prop_validation:
opt_state.bypass_prop_validation = TRUE;
break;
+ case svnadmin__ignore_dates:
+ opt_state.ignore_dates = TRUE;
+ break;
case svnadmin__clean_logs:
opt_state.clean_logs = TRUE;
break;
case svnadmin__config_dir:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
opt_state.config_dir =
apr_pstrdup(pool, svn_dirent_canonicalize(utf8_opt_arg, pool));
break;
@@ -2168,8 +2664,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
break;
default:
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
} /* close `switch' */
} /* close `while' */
@@ -2202,8 +2699,9 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_clear(svn_cmdline_fprintf(stderr, pool,
_("subcommand argument required\n")));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -2213,14 +2711,15 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (subcommand == NULL)
{
const char *first_arg_utf8;
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
first_arg, pool));
svn_error_clear(
svn_cmdline_fprintf(stderr, pool,
_("Unknown subcommand: '%s'\n"),
first_arg_utf8));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -2235,23 +2734,17 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
if (os->ind >= os->argc)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Repository argument required"));
- return EXIT_ERROR(err);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Repository argument required"));
}
- if ((err = svn_utf_cstring_to_utf8(&repos_path,
- os->argv[os->ind++], pool)))
- {
- return EXIT_ERROR(err);
- }
+ SVN_ERR(svn_utf_cstring_to_utf8(&repos_path, os->argv[os->ind++], pool));
if (svn_path_is_url(repos_path))
{
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("'%s' is a URL when it should be a "
- "local path"), repos_path);
- return EXIT_ERROR(err);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is a URL when it should be a "
+ "local path"), repos_path);
}
opt_state.repository_path = svn_dirent_internal_style(repos_path, pool);
@@ -2277,13 +2770,14 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
pool);
svn_opt_format_option(&optstr, badopt, FALSE, pool);
if (subcommand->name[0] == '-')
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
else
svn_error_clear(svn_cmdline_fprintf(stderr, pool
, _("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnadmin help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name));
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
@@ -2325,26 +2819,18 @@ sub_main(int argc, const char *argv[], apr_pool_t *pool)
err = svn_error_quick_wrap(err,
_("Try 'svnadmin help' for more info"));
}
- return EXIT_ERROR(err);
- }
- else
- {
- /* Ensure that everything is written to stdout, so the user will
- see any print errors. */
- err = svn_cmdline_fflush(stdout);
- if (err)
- {
- return EXIT_ERROR(err);
- }
- return EXIT_SUCCESS;
+ return err;
}
+
+ return SVN_NO_ERROR;
}
int
main(int argc, const char *argv[])
{
apr_pool_t *pool;
- int exit_code;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
/* Initialize the app. */
if (svn_cmdline_init("svnadmin", stderr) != EXIT_SUCCESS)
@@ -2355,7 +2841,17 @@ main(int argc, const char *argv[])
*/
pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
- exit_code = sub_main(argc, argv, pool);
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnadmin: ");
+ }
svn_pool_destroy(pool);
return exit_code;
diff --git a/subversion/svnbench/cl.h b/subversion/svnbench/cl.h
new file mode 100644
index 0000000..5b15fe5
--- /dev/null
+++ b/subversion/svnbench/cl.h
@@ -0,0 +1,203 @@
+/*
+ * cl.h: shared stuff in the command line program
+ *
+ * ====================================================================
+ * 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_CL_H
+#define SVN_CL_H
+
+/*** Includes. ***/
+
+#include <apr_tables.h>
+
+#include "svn_client.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*** Command dispatch. ***/
+
+/* Hold results of option processing that are shared by multiple
+ commands. */
+typedef struct svn_cl__opt_state_t
+{
+ /* An array of svn_opt_revision_range_t *'s representing revisions
+ ranges indicated on the command-line via the -r and -c options.
+ For each range in the list, if only one revision was provided
+ (-rN), its 'end' member remains 'svn_opt_revision_unspecified'.
+ This array always has at least one element, even if that is a
+ null range in which both ends are 'svn_opt_revision_unspecified'. */
+ apr_array_header_t *revision_ranges;
+
+ /* These are simply a copy of the range start and end values present
+ in the first item of the revision_ranges list. */
+ svn_opt_revision_t start_revision;
+ svn_opt_revision_t end_revision;
+
+ /* Flag which is only set if the '-c' option was used. */
+ svn_boolean_t used_change_arg;
+
+ /* Flag which is only set if the '-r' option was used. */
+ svn_boolean_t used_revision_arg;
+
+ /* Max number of log messages to get back from svn_client_log2. */
+ int limit;
+
+ /* After option processing is done, reflects the switch actually
+ given on the command line, or svn_depth_unknown if none. */
+ svn_depth_t depth;
+
+ svn_boolean_t quiet; /* sssh...avoid unnecessary output */
+ svn_boolean_t non_interactive; /* do no interactive prompting */
+ svn_boolean_t version; /* print version information */
+ svn_boolean_t verbose; /* be verbose */
+ svn_boolean_t strict; /* do strictly what was requested */
+ const char *encoding; /* the locale/encoding of the data*/
+ svn_boolean_t help; /* print usage message */
+ const char *auth_username; /* auth username */ /* UTF-8! */
+ const char *auth_password; /* auth password */ /* UTF-8! */
+ apr_array_header_t *targets; /* target list from file */ /* UTF-8! */
+ svn_boolean_t no_auth_cache; /* do not cache authentication information */
+ svn_boolean_t stop_on_copy; /* don't cross copies during processing */
+ const char *config_dir; /* over-riding configuration directory */
+ apr_array_header_t *config_options; /* over-riding configuration options */
+ svn_boolean_t all_revprops; /* retrieve all revprops */
+ svn_boolean_t no_revprops; /* retrieve no revprops */
+ apr_hash_t *revprop_table; /* table of revision properties to get/set */
+ svn_boolean_t use_merge_history; /* use/display extra merge information */
+ /* trust server SSL certs that would otherwise be rejected as "untrusted" */
+ 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_cl__opt_state_t;
+
+
+typedef struct svn_cl__cmd_baton_t
+{
+ svn_cl__opt_state_t *opt_state;
+ svn_client_ctx_t *ctx;
+} svn_cl__cmd_baton_t;
+
+
+/* Declare all the command procedures */
+svn_opt_subcommand_t
+ svn_cl__help,
+ svn_cl__null_blame,
+ svn_cl__null_export,
+ svn_cl__null_list,
+ svn_cl__null_log,
+ svn_cl__null_info;
+
+
+/* See definition in main.c for documentation. */
+extern const svn_opt_subcommand_desc2_t svn_cl__cmd_table[];
+
+/* See definition in main.c for documentation. */
+extern const int svn_cl__global_options[];
+
+/* See definition in main.c for documentation. */
+extern const apr_getopt_option_t svn_cl__options[];
+
+
+/* A helper for the many subcommands that wish to merely warn when
+ * invoked on an unversioned, nonexistent, or otherwise innocuously
+ * errorful resource. Meant to be wrapped with SVN_ERR().
+ *
+ * If ERR is null, return SVN_NO_ERROR.
+ *
+ * Else if ERR->apr_err is one of the error codes supplied in varargs,
+ * then handle ERR as a warning (unless QUIET is true), clear ERR, and
+ * return SVN_NO_ERROR, and push the value of ERR->apr_err into the
+ * ERRORS_SEEN array, if ERRORS_SEEN is not NULL.
+ *
+ * Else return ERR.
+ *
+ * Typically, error codes like SVN_ERR_UNVERSIONED_RESOURCE,
+ * SVN_ERR_ENTRY_NOT_FOUND, etc, are supplied in varargs. Don't
+ * forget to terminate the argument list with 0 (or APR_SUCCESS).
+ */
+svn_error_t *
+svn_cl__try(svn_error_t *err,
+ apr_array_header_t *errors_seen,
+ svn_boolean_t quiet,
+ ...);
+
+
+/* Our cancellation callback. */
+svn_error_t *
+svn_cl__check_cancel(void *baton);
+
+
+
+/*** Notification functions to display results on the terminal. */
+
+/* Set *NOTIFY_FUNC_P and *NOTIFY_BATON_P to a notifier/baton for all
+ * operations, allocated in POOL.
+ */
+svn_error_t *
+svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
+ void **notify_baton_p,
+ apr_pool_t *pool);
+
+/* Make the notifier for use with BATON print the appropriate summary
+ * line at the end of the output.
+ */
+svn_error_t *
+svn_cl__notifier_mark_export(void *baton);
+
+/* Like svn_client_args_to_target_array() but, if the only error is that some
+ * arguments are reserved file names, then print warning messages for those
+ * targets, store the rest of the targets in TARGETS_P and return success. */
+svn_error_t *
+svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets_p,
+ apr_getopt_t *os,
+ const apr_array_header_t *known_targets,
+ svn_client_ctx_t *ctx,
+ svn_boolean_t keep_dest_origpath_on_truepath_collision,
+ apr_pool_t *pool);
+
+/* Return an error if TARGET is a URL; otherwise return SVN_NO_ERROR. */
+svn_error_t *
+svn_cl__check_target_is_local_path(const char *target);
+
+/* Return a copy of PATH, converted to the local path style, skipping
+ * PARENT_PATH if it is non-null and is a parent of or equal to PATH.
+ *
+ * This function assumes PARENT_PATH and PATH are both absolute "dirents"
+ * or both relative "dirents". */
+const char *
+svn_cl__local_style_skip_ancestor(const char *parent_path,
+ const char *path,
+ apr_pool_t *pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_CL_H */
diff --git a/subversion/svnbench/help-cmd.c b/subversion/svnbench/help-cmd.c
new file mode 100644
index 0000000..ead4861
--- /dev/null
+++ b/subversion/svnbench/help-cmd.c
@@ -0,0 +1,90 @@
+/*
+ * help-cmd.c -- Provide help
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include "svn_string.h"
+#include "svn_error.h"
+#include "svn_version.h"
+#include "cl.h"
+
+#include "svn_private_config.h"
+
+
+/*** Code. ***/
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__help(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state;
+
+ char help_header[] =
+ N_("usage: svnbench <subcommand> [options] [args]\n"
+ "Subversion benchmarking tool.\n"
+ "Type 'svnbench help <subcommand>' for help on a specific subcommand.\n"
+ "Type 'svnbench --version' to see the program version and RA modules\n"
+ " or 'svnbench --version --quiet' to see just the version number.\n"
+ "\n"
+ "Most subcommands take file and/or directory arguments, recursing\n"
+ "on the directories. If no arguments are supplied to such a\n"
+ "command, it recurses on the current directory (inclusive) by default.\n"
+ "\n"
+ "Available subcommands:\n");
+
+ char help_footer[] =
+ N_("Subversion is a tool for version control.\n"
+ "For additional information, see http://subversion.apache.org/\n");
+
+ const char *ra_desc_start
+ = _("The following repository access (RA) modules are available:\n\n");
+
+ svn_stringbuf_t *version_footer;
+
+ if (baton)
+ opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ else
+ opt_state = NULL;
+
+ version_footer = svn_stringbuf_create(ra_desc_start, pool);
+ SVN_ERR(svn_ra_print_modules(version_footer, pool));
+
+ return svn_opt_print_help4(os,
+ "svnbench", /* ### erm, derive somehow? */
+ opt_state ? opt_state->version : FALSE,
+ opt_state ? opt_state->quiet : FALSE,
+ opt_state ? opt_state->verbose : FALSE,
+ version_footer->data,
+ help_header, /* already gettext()'d */
+ svn_cl__cmd_table,
+ svn_cl__options,
+ svn_cl__global_options,
+ _(help_footer),
+ pool);
+}
diff --git a/subversion/svnbench/notify.c b/subversion/svnbench/notify.c
new file mode 100644
index 0000000..b8ca2ef
--- /dev/null
+++ b/subversion/svnbench/notify.c
@@ -0,0 +1,1045 @@
+/*
+ * notify.c: feedback handlers for cmdline client.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#define APR_WANT_STDIO
+#define APR_WANT_STRFUNC
+#include <apr_want.h>
+
+#include "svn_cmdline.h"
+#include "svn_pools.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_sorts.h"
+#include "cl.h"
+
+#include "svn_private_config.h"
+
+
+/* Baton for notify and friends. */
+struct notify_baton
+{
+ svn_boolean_t received_some_change;
+ svn_boolean_t is_checkout;
+ svn_boolean_t is_export;
+ svn_boolean_t is_wc_to_repos_copy;
+ svn_boolean_t sent_first_txdelta;
+ svn_boolean_t in_external;
+ svn_boolean_t had_print_error; /* Used to not keep printing error messages
+ when we've already had one print error. */
+
+ /* Conflict stats for update and merge. */
+ unsigned int text_conflicts;
+ unsigned int prop_conflicts;
+ unsigned int tree_conflicts;
+ unsigned int skipped_paths;
+ apr_hash_t *conflicted_paths;
+
+ /* The cwd, for use in decomposing absolute paths. */
+ const char *path_prefix;
+};
+
+
+/* Add a conflicted path to the list of conflicted paths stored
+ * in the notify baton. */
+static void
+add_conflicted_path(struct notify_baton *nb, const char *path)
+{
+ apr_hash_set(nb->conflicted_paths,
+ apr_pstrdup(apr_hash_pool_get(nb->conflicted_paths), path),
+ APR_HASH_KEY_STRING, "");
+}
+
+/* This implements `svn_wc_notify_func2_t'.
+ * NOTE: This function can't fail, so we just ignore any print errors. */
+static void
+notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool)
+{
+ struct notify_baton *nb = baton;
+ char statchar_buf[5] = " ";
+ const char *path_local;
+ svn_error_t *err;
+
+ if (n->url)
+ path_local = n->url;
+ else
+ {
+ if (n->path_prefix)
+ path_local = svn_cl__local_style_skip_ancestor(n->path_prefix, n->path,
+ pool);
+ else /* skip nb->path_prefix, if it's non-null */
+ path_local = svn_cl__local_style_skip_ancestor(nb->path_prefix, n->path,
+ pool);
+ }
+
+ switch (n->action)
+ {
+ case svn_wc_notify_skip:
+ nb->skipped_paths++;
+ if (n->content_state == svn_wc_notify_state_missing)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, _("Skipped missing target: '%s'\n"),
+ path_local)))
+ goto print_error;
+ }
+ else if (n->content_state == svn_wc_notify_state_source_missing)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, _("Skipped target: '%s' -- copy-source is missing\n"),
+ path_local)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf
+ (pool, _("Skipped '%s'\n"), path_local)))
+ goto print_error;
+ }
+ break;
+ case svn_wc_notify_update_skip_obstruction:
+ nb->skipped_paths++;
+ if ((err = svn_cmdline_printf(
+ pool, _("Skipped '%s' -- An obstructing working copy was found\n"),
+ path_local)))
+ goto print_error;
+ break;
+ case svn_wc_notify_update_skip_working_only:
+ nb->skipped_paths++;
+ if ((err = svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Has no versioned parent\n"),
+ path_local)))
+ goto print_error;
+ break;
+ case svn_wc_notify_update_skip_access_denied:
+ nb->skipped_paths++;
+ if ((err = svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Access denied\n"),
+ path_local)))
+ goto print_error;
+ break;
+ case svn_wc_notify_skip_conflicted:
+ nb->skipped_paths++;
+ if ((err = svn_cmdline_printf(
+ pool, _("Skipped '%s' -- Node remains in conflict\n"),
+ path_local)))
+ goto print_error;
+ break;
+ case svn_wc_notify_update_delete:
+ case svn_wc_notify_exclude:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, "D %s\n", path_local)))
+ goto print_error;
+ break;
+ case svn_wc_notify_update_broken_lock:
+ if ((err = svn_cmdline_printf(pool, "B %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_external_removed:
+ nb->received_some_change = TRUE;
+ if (n->err && n->err->message)
+ {
+ if ((err = svn_cmdline_printf(pool, "Removed external '%s': %s\n",
+ path_local, n->err->message)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf(pool, "Removed external '%s'\n",
+ path_local)))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_left_local_modifications:
+ if ((err = svn_cmdline_printf(pool, "Left local modifications as '%s'\n",
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_replace:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, "R %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_add:
+ nb->received_some_change = TRUE;
+ if (n->content_state == svn_wc_notify_state_conflicted)
+ {
+ nb->text_conflicts++;
+ add_conflicted_path(nb, n->path);
+ if ((err = svn_cmdline_printf(pool, "C %s\n", path_local)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf(pool, "A %s\n", path_local)))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_exists:
+ nb->received_some_change = TRUE;
+ if (n->content_state == svn_wc_notify_state_conflicted)
+ {
+ nb->text_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[0] = 'C';
+ }
+ else
+ statchar_buf[0] = 'E';
+
+ if (n->prop_state == svn_wc_notify_state_conflicted)
+ {
+ nb->prop_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[1] = 'C';
+ }
+ else if (n->prop_state == svn_wc_notify_state_merged)
+ statchar_buf[1] = 'G';
+
+ if ((err = svn_cmdline_printf(pool, "%s %s\n", statchar_buf, path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_restore:
+ if ((err = svn_cmdline_printf(pool, _("Restored '%s'\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_revert:
+ if ((err = svn_cmdline_printf(pool, _("Reverted '%s'\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_failed_revert:
+ if (( err = svn_cmdline_printf(pool, _("Failed to revert '%s' -- "
+ "try updating instead.\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_resolved:
+ if ((err = svn_cmdline_printf(pool,
+ _("Resolved conflicted state of '%s'\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_add:
+ /* We *should* only get the MIME_TYPE if PATH is a file. If we
+ do get it, and the mime-type is not textual, note that this
+ is a binary addition. */
+ if (n->mime_type && (svn_mime_type_is_binary(n->mime_type)))
+ {
+ if ((err = svn_cmdline_printf(pool, "A (bin) %s\n",
+ path_local)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf(pool, "A %s\n",
+ path_local)))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_delete:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, "D %s\n",
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_patch:
+ {
+ nb->received_some_change = TRUE;
+ if (n->content_state == svn_wc_notify_state_conflicted)
+ {
+ nb->text_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[0] = 'C';
+ }
+ else if (n->kind == svn_node_file)
+ {
+ if (n->content_state == svn_wc_notify_state_merged)
+ statchar_buf[0] = 'G';
+ else if (n->content_state == svn_wc_notify_state_changed)
+ statchar_buf[0] = 'U';
+ }
+
+ if (n->prop_state == svn_wc_notify_state_conflicted)
+ {
+ nb->prop_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[1] = 'C';
+ }
+ else if (n->prop_state == svn_wc_notify_state_changed)
+ statchar_buf[1] = 'U';
+
+ if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ')
+ {
+ if ((err = svn_cmdline_printf(pool, "%s %s\n",
+ statchar_buf, path_local)))
+ goto print_error;
+ }
+ }
+ break;
+
+ case svn_wc_notify_patch_applied_hunk:
+ nb->received_some_change = TRUE;
+ if (n->hunk_original_start != n->hunk_matched_line)
+ {
+ apr_uint64_t off;
+ const char *s;
+ const char *minus;
+
+ if (n->hunk_matched_line > n->hunk_original_start)
+ {
+ off = n->hunk_matched_line - n->hunk_original_start;
+ minus = "";
+ }
+ else
+ {
+ off = n->hunk_original_start - n->hunk_matched_line;
+ minus = "-";
+ }
+
+ /* ### We're creating the localized strings without
+ * ### APR_INT64_T_FMT since it isn't translator-friendly */
+ if (n->hunk_fuzz)
+ {
+
+ if (n->prop_name)
+ {
+ s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## "
+ "with offset %s");
+
+ err = svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT
+ " and fuzz %lu (%s)\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->hunk_fuzz,
+ n->prop_name);
+ }
+ else
+ {
+ s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
+ "with offset %s");
+
+ err = svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT
+ " and fuzz %lu\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->hunk_fuzz);
+ }
+
+ if (err)
+ goto print_error;
+ }
+ else
+ {
+
+ if (n->prop_name)
+ {
+ s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## "
+ "with offset %s");
+ err = svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT" (%s)\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off, n->prop_name);
+ }
+ else
+ {
+ s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
+ "with offset %s");
+ err = svn_cmdline_printf(pool,
+ apr_pstrcat(pool, s,
+ "%"APR_UINT64_T_FMT"\n",
+ SVN_VA_NULL),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ minus, off);
+ }
+
+ if (err)
+ goto print_error;
+ }
+ }
+ else if (n->hunk_fuzz)
+ {
+ if (n->prop_name)
+ err = svn_cmdline_printf(pool,
+ _("> applied hunk ## -%lu,%lu +%lu,%lu ## "
+ "with fuzz %lu (%s)\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->hunk_fuzz,
+ n->prop_name);
+ else
+ err = svn_cmdline_printf(pool,
+ _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ "
+ "with fuzz %lu\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->hunk_fuzz);
+ if (err)
+ goto print_error;
+
+ }
+ break;
+
+ case svn_wc_notify_patch_rejected_hunk:
+ nb->received_some_change = TRUE;
+
+ if (n->prop_name)
+ err = svn_cmdline_printf(pool,
+ _("> rejected hunk "
+ "## -%lu,%lu +%lu,%lu ## (%s)\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->prop_name);
+ else
+ err = svn_cmdline_printf(pool,
+ _("> rejected hunk "
+ "@@ -%lu,%lu +%lu,%lu @@\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_patch_hunk_already_applied:
+ nb->received_some_change = TRUE;
+ if (n->prop_name)
+ err = svn_cmdline_printf(pool,
+ _("> hunk "
+ "## -%lu,%lu +%lu,%lu ## "
+ "already applied (%s)\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length,
+ n->prop_name);
+ else
+ err = svn_cmdline_printf(pool,
+ _("> hunk "
+ "@@ -%lu,%lu +%lu,%lu @@ "
+ "already applied\n"),
+ n->hunk_original_start,
+ n->hunk_original_length,
+ n->hunk_modified_start,
+ n->hunk_modified_length);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_update:
+ case svn_wc_notify_merge_record_info:
+ {
+ if (n->content_state == svn_wc_notify_state_conflicted)
+ {
+ nb->text_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[0] = 'C';
+ }
+ else if (n->kind == svn_node_file)
+ {
+ if (n->content_state == svn_wc_notify_state_merged)
+ statchar_buf[0] = 'G';
+ else if (n->content_state == svn_wc_notify_state_changed)
+ statchar_buf[0] = 'U';
+ }
+
+ if (n->prop_state == svn_wc_notify_state_conflicted)
+ {
+ nb->prop_conflicts++;
+ add_conflicted_path(nb, n->path);
+ statchar_buf[1] = 'C';
+ }
+ else if (n->prop_state == svn_wc_notify_state_merged)
+ statchar_buf[1] = 'G';
+ else if (n->prop_state == svn_wc_notify_state_changed)
+ statchar_buf[1] = 'U';
+
+ if (n->lock_state == svn_wc_notify_lock_state_unlocked)
+ statchar_buf[2] = 'B';
+
+ if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ')
+ nb->received_some_change = TRUE;
+
+ if (statchar_buf[0] != ' ' || statchar_buf[1] != ' '
+ || statchar_buf[2] != ' ')
+ {
+ if ((err = svn_cmdline_printf(pool, "%s %s\n",
+ statchar_buf, path_local)))
+ goto print_error;
+ }
+ }
+ break;
+
+ case svn_wc_notify_update_external:
+ /* Remember that we're now "inside" an externals definition. */
+ nb->in_external = TRUE;
+
+ /* Currently this is used for checkouts and switches too. If we
+ want different output, we'll have to add new actions. */
+ if ((err = svn_cmdline_printf(pool,
+ _("\nFetching external item into '%s':\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_failed_external:
+ /* If we are currently inside the handling of an externals
+ definition, then we can simply present n->err as a warning
+ and feel confident that after this, we aren't handling that
+ externals definition any longer. */
+ if (nb->in_external)
+ {
+ svn_handle_warning2(stderr, n->err, "svn: ");
+ nb->in_external = FALSE;
+ if ((err = svn_cmdline_printf(pool, "\n")))
+ goto print_error;
+ }
+ /* Otherwise, we'll just print two warnings. Why? Because
+ svn_handle_warning2() only shows the single "best message",
+ but we have two pretty important ones: that the external at
+ '/some/path' didn't pan out, and then the more specific
+ reason why (from n->err). */
+ else
+ {
+ svn_error_t *warn_err =
+ svn_error_createf(SVN_ERR_BASE, NULL,
+ _("Error handling externals definition for '%s':"),
+ path_local);
+ svn_handle_warning2(stderr, warn_err, "svn: ");
+ svn_error_clear(warn_err);
+ svn_handle_warning2(stderr, n->err, "svn: ");
+ }
+ break;
+
+ case svn_wc_notify_update_started:
+ if (! (nb->in_external ||
+ nb->is_checkout ||
+ nb->is_export))
+ {
+ if ((err = svn_cmdline_printf(pool, _("Updating '%s':\n"),
+ path_local)))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_update_completed:
+ {
+ if (SVN_IS_VALID_REVNUM(n->revision))
+ {
+ if (nb->is_export)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("Exported external at revision %ld.\n")
+ : _("Exported revision %ld.\n"),
+ n->revision)))
+ goto print_error;
+ }
+ else if (nb->is_checkout)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("Checked out external at revision %ld.\n")
+ : _("Checked out revision %ld.\n"),
+ n->revision)))
+ goto print_error;
+ }
+ else
+ {
+ if (nb->received_some_change)
+ {
+ nb->received_some_change = FALSE;
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("Updated external to revision %ld.\n")
+ : _("Updated to revision %ld.\n"),
+ n->revision)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("External at revision %ld.\n")
+ : _("At revision %ld.\n"),
+ n->revision)))
+ goto print_error;
+ }
+ }
+ }
+ else /* no revision */
+ {
+ if (nb->is_export)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("External export complete.\n")
+ : _("Export complete.\n"))))
+ goto print_error;
+ }
+ else if (nb->is_checkout)
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("External checkout complete.\n")
+ : _("Checkout complete.\n"))))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf
+ (pool, nb->in_external
+ ? _("External update complete.\n")
+ : _("Update complete.\n"))))
+ goto print_error;
+ }
+ }
+ }
+
+ if (nb->in_external)
+ {
+ nb->in_external = FALSE;
+ if ((err = svn_cmdline_printf(pool, "\n")))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_status_external:
+ if ((err = svn_cmdline_printf
+ (pool, _("\nPerforming status on external item at '%s':\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_status_completed:
+ if (SVN_IS_VALID_REVNUM(n->revision))
+ if ((err = svn_cmdline_printf(pool,
+ _("Status against revision: %6ld\n"),
+ n->revision)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_commit_modified:
+ /* xgettext: Align the %s's on this and the following 4 messages */
+ if ((err = svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Sending copy of %s\n")
+ : _("Sending %s\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_commit_added:
+ case svn_wc_notify_commit_copied:
+ if (n->mime_type && svn_mime_type_is_binary(n->mime_type))
+ {
+ if ((err = svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Adding copy of (bin) %s\n")
+ : _("Adding (bin) %s\n"),
+ path_local)))
+ goto print_error;
+ }
+ else
+ {
+ if ((err = svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Adding copy of %s\n")
+ : _("Adding %s\n"),
+ path_local)))
+ goto print_error;
+ }
+ break;
+
+ case svn_wc_notify_commit_deleted:
+ if ((err = svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Deleting copy of %s\n")
+ : _("Deleting %s\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_commit_replaced:
+ case svn_wc_notify_commit_copied_replaced:
+ if ((err = svn_cmdline_printf(pool,
+ nb->is_wc_to_repos_copy
+ ? _("Replacing copy of %s\n")
+ : _("Replacing %s\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_commit_postfix_txdelta:
+ if (! nb->sent_first_txdelta)
+ {
+ nb->sent_first_txdelta = TRUE;
+ if ((err = svn_cmdline_printf(pool,
+ _("Transmitting file data "))))
+ goto print_error;
+ }
+
+ if ((err = svn_cmdline_printf(pool, ".")))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_locked:
+ if ((err = svn_cmdline_printf(pool, _("'%s' locked by user '%s'.\n"),
+ path_local, n->lock->owner)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_unlocked:
+ if ((err = svn_cmdline_printf(pool, _("'%s' unlocked.\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_failed_lock:
+ case svn_wc_notify_failed_unlock:
+ svn_handle_warning2(stderr, n->err, "svn: ");
+ break;
+
+ case svn_wc_notify_changelist_set:
+ if ((err = svn_cmdline_printf(pool, "A [%s] %s\n",
+ n->changelist_name, path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_changelist_clear:
+ case svn_wc_notify_changelist_moved:
+ if ((err = svn_cmdline_printf(pool,
+ "D [%s] %s\n",
+ n->changelist_name, path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_merge_begin:
+ if (n->merge_range == NULL)
+ err = svn_cmdline_printf(pool,
+ _("--- Merging differences between "
+ "repository URLs into '%s':\n"),
+ path_local);
+ else if (n->merge_range->start == n->merge_range->end - 1
+ || n->merge_range->start == n->merge_range->end)
+ err = svn_cmdline_printf(pool, _("--- Merging r%ld into '%s':\n"),
+ n->merge_range->end, path_local);
+ else if (n->merge_range->start - 1 == n->merge_range->end)
+ err = svn_cmdline_printf(pool,
+ _("--- Reverse-merging r%ld into '%s':\n"),
+ n->merge_range->start, path_local);
+ else if (n->merge_range->start < n->merge_range->end)
+ err = svn_cmdline_printf(pool,
+ _("--- Merging r%ld through r%ld into "
+ "'%s':\n"),
+ n->merge_range->start + 1,
+ n->merge_range->end, path_local);
+ else /* n->merge_range->start > n->merge_range->end - 1 */
+ err = svn_cmdline_printf(pool,
+ _("--- Reverse-merging r%ld through r%ld "
+ "into '%s':\n"),
+ n->merge_range->start,
+ n->merge_range->end + 1, path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_merge_record_info_begin:
+ if (!n->merge_range)
+ {
+ err = svn_cmdline_printf(pool,
+ _("--- Recording mergeinfo for merge "
+ "between repository URLs into '%s':\n"),
+ path_local);
+ }
+ else
+ {
+ if (n->merge_range->start == n->merge_range->end - 1
+ || n->merge_range->start == n->merge_range->end)
+ err = svn_cmdline_printf(
+ pool,
+ _("--- Recording mergeinfo for merge of r%ld into '%s':\n"),
+ n->merge_range->end, path_local);
+ else if (n->merge_range->start - 1 == n->merge_range->end)
+ err = svn_cmdline_printf(
+ pool,
+ _("--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"),
+ n->merge_range->start, path_local);
+ else if (n->merge_range->start < n->merge_range->end)
+ err = svn_cmdline_printf(
+ pool,
+ _("--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"),
+ n->merge_range->start + 1, n->merge_range->end, path_local);
+ else /* n->merge_range->start > n->merge_range->end - 1 */
+ err = svn_cmdline_printf(
+ pool,
+ _("--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"),
+ n->merge_range->start, n->merge_range->end + 1, path_local);
+ }
+
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_merge_elide_info:
+ if ((err = svn_cmdline_printf(pool,
+ _("--- Eliding mergeinfo from '%s':\n"),
+ path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_foreign_merge_begin:
+ if (n->merge_range == NULL)
+ err = svn_cmdline_printf(pool,
+ _("--- Merging differences between "
+ "foreign repository URLs into '%s':\n"),
+ path_local);
+ else if (n->merge_range->start == n->merge_range->end - 1
+ || n->merge_range->start == n->merge_range->end)
+ err = svn_cmdline_printf(pool,
+ _("--- Merging (from foreign repository) "
+ "r%ld into '%s':\n"),
+ n->merge_range->end, path_local);
+ else if (n->merge_range->start - 1 == n->merge_range->end)
+ err = svn_cmdline_printf(pool,
+ _("--- Reverse-merging (from foreign "
+ "repository) r%ld into '%s':\n"),
+ n->merge_range->start, path_local);
+ else if (n->merge_range->start < n->merge_range->end)
+ err = svn_cmdline_printf(pool,
+ _("--- Merging (from foreign repository) "
+ "r%ld through r%ld into '%s':\n"),
+ n->merge_range->start + 1,
+ n->merge_range->end, path_local);
+ else /* n->merge_range->start > n->merge_range->end - 1 */
+ err = svn_cmdline_printf(pool,
+ _("--- Reverse-merging (from foreign "
+ "repository) r%ld through r%ld into "
+ "'%s':\n"),
+ n->merge_range->start,
+ n->merge_range->end + 1, path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_tree_conflict:
+ nb->tree_conflicts++;
+ add_conflicted_path(nb, n->path);
+ if ((err = svn_cmdline_printf(pool, " C %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_shadowed_add:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " A %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_shadowed_update:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " U %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_shadowed_delete:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " D %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_property_modified:
+ case svn_wc_notify_property_added:
+ err = svn_cmdline_printf(pool,
+ _("property '%s' set on '%s'\n"),
+ n->prop_name, path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_property_deleted:
+ err = svn_cmdline_printf(pool,
+ _("property '%s' deleted from '%s'.\n"),
+ n->prop_name, path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_property_deleted_nonexistent:
+ err = svn_cmdline_printf(pool,
+ _("Attempting to delete nonexistent "
+ "property '%s' on '%s'\n"), n->prop_name,
+ path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_revprop_set:
+ err = svn_cmdline_printf(pool,
+ _("property '%s' set on repository revision %ld\n"),
+ n->prop_name, n->revision);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_revprop_deleted:
+ err = svn_cmdline_printf(pool,
+ _("property '%s' deleted from repository revision %ld\n"),
+ n->prop_name, n->revision);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_upgraded_path:
+ err = svn_cmdline_printf(pool, _("Upgraded '%s'\n"), path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_url_redirect:
+ err = svn_cmdline_printf(pool, _("Redirecting to URL '%s':\n"),
+ n->url);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_path_nonexistent:
+ err = svn_cmdline_printf(pool, _("'%s' is not under version control"),
+ path_local);
+ if (err)
+ goto print_error;
+ break;
+
+ case svn_wc_notify_conflict_resolver_starting:
+ /* Once all operations invoke the interactive conflict resolution after
+ * they've completed, we can run svn_cl__print_conflict_stats() here. */
+ break;
+
+ case svn_wc_notify_conflict_resolver_done:
+ break;
+
+ default:
+ break;
+ }
+
+ if ((err = svn_cmdline_fflush(stdout)))
+ goto print_error;
+
+ return;
+
+ print_error:
+ /* If we had no errors before, print this error to stderr. Else, don't print
+ anything. The user already knows there were some output errors,
+ so there is no point in flooding her with an error per notification. */
+ if (!nb->had_print_error)
+ {
+ nb->had_print_error = TRUE;
+ /* Issue #3014:
+ * Don't print anything on broken pipes. The pipe was likely
+ * closed by the process at the other end. We expect that
+ * process to perform error reporting as necessary.
+ *
+ * ### This assumes that there is only one error in a chain for
+ * ### SVN_ERR_IO_PIPE_WRITE_ERROR. See svn_cmdline_fputs(). */
+ if (err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR)
+ svn_handle_error2(err, stderr, FALSE, "svn: ");
+ }
+ svn_error_clear(err);
+}
+
+
+svn_error_t *
+svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
+ void **notify_baton_p,
+ apr_pool_t *pool)
+{
+ struct notify_baton *nb = apr_pcalloc(pool, sizeof(*nb));
+
+ nb->received_some_change = FALSE;
+ nb->sent_first_txdelta = FALSE;
+ nb->is_checkout = FALSE;
+ nb->is_export = FALSE;
+ nb->is_wc_to_repos_copy = FALSE;
+ nb->in_external = FALSE;
+ nb->had_print_error = FALSE;
+ nb->text_conflicts = 0;
+ nb->prop_conflicts = 0;
+ nb->tree_conflicts = 0;
+ nb->skipped_paths = 0;
+ nb->conflicted_paths = apr_hash_make(pool);
+ SVN_ERR(svn_dirent_get_absolute(&nb->path_prefix, "", pool));
+
+ *notify_func_p = notify;
+ *notify_baton_p = nb;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_cl__notifier_mark_export(void *baton)
+{
+ struct notify_baton *nb = baton;
+
+ nb->is_export = TRUE;
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnbench/null-blame-cmd.c b/subversion/svnbench/null-blame-cmd.c
new file mode 100644
index 0000000..74d87dc
--- /dev/null
+++ b/subversion/svnbench/null-blame-cmd.c
@@ -0,0 +1,276 @@
+/*
+ * null-blame-cmd.c -- Subversion export command
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include "svn_client.h"
+#include "svn_cmdline.h"
+#include "svn_error.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+#include "cl.h"
+
+#include "svn_private_config.h"
+#include "private/svn_string_private.h"
+#include "private/svn_client_private.h"
+
+struct file_rev_baton {
+ apr_int64_t byte_count;
+ apr_int64_t delta_count;
+ apr_int64_t rev_count;
+};
+
+/* Implements svn_txdelta_window_handler_t */
+static svn_error_t *
+delta_handler(svn_txdelta_window_t *window, void *baton)
+{
+ struct file_rev_baton *frb = baton;
+
+ if (window != NULL)
+ frb->byte_count += window->tview_len;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implementes svn_file_rev_handler_t */
+static svn_error_t *
+file_rev_handler(void *baton, const char *path, svn_revnum_t revnum,
+ apr_hash_t *rev_props,
+ svn_boolean_t merged_revision,
+ svn_txdelta_window_handler_t *content_delta_handler,
+ void **content_delta_baton,
+ apr_array_header_t *prop_diffs,
+ apr_pool_t *pool)
+{
+ struct file_rev_baton *frb = baton;
+
+ frb->rev_count++;
+
+ if (content_delta_handler)
+ {
+ *content_delta_handler = delta_handler;
+ *content_delta_baton = baton;
+ frb->delta_count++;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+bench_null_blame(const char *target,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *start,
+ const svn_opt_revision_t *end,
+ svn_boolean_t include_merged_revisions,
+ svn_boolean_t quiet,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ struct file_rev_baton frb = { 0, 0, 0};
+ svn_ra_session_t *ra_session;
+ svn_revnum_t start_revnum, end_revnum;
+ svn_boolean_t backwards;
+ const char *target_abspath_or_url;
+
+ if (start->kind == svn_opt_revision_unspecified
+ || end->kind == svn_opt_revision_unspecified)
+ return svn_error_create
+ (SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL);
+
+ if (svn_path_is_url(target))
+ target_abspath_or_url = target;
+ else
+ 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, NULL,
+ target, NULL, peg_revision,
+ peg_revision,
+ ctx, pool));
+
+ SVN_ERR(svn_client__get_revision_number(&start_revnum, NULL, ctx->wc_ctx,
+ target_abspath_or_url, ra_session,
+ start, pool));
+
+ 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));
+ }
+
+ backwards = (start_revnum > end_revnum);
+
+ /* Collect all blame information.
+ We need to ensure that we get one revision before the start_rev,
+ if available so that we can know what was actually changed in the start
+ revision. */
+ SVN_ERR(svn_ra_get_file_revs2(ra_session, "",
+ backwards ? start_revnum
+ : MAX(0, start_revnum-1),
+ end_revnum,
+ include_merged_revisions,
+ file_rev_handler, &frb, pool));
+
+ if (!quiet)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("%15s revisions\n"
+ "%15s deltas\n"
+ "%15s bytes in deltas\n"),
+ svn__ui64toa_sep(frb.rev_count, ',', pool),
+ svn__ui64toa_sep(frb.delta_count, ',', pool),
+ svn__ui64toa_sep(frb.byte_count, ',', pool)));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__null_blame(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
+ apr_pool_t *iterpool;
+ apr_array_header_t *targets;
+ int i;
+ svn_boolean_t end_revision_unspecified = FALSE;
+ svn_boolean_t seen_nonexistent_target = FALSE;
+
+ SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
+ opt_state->targets,
+ ctx, FALSE, pool));
+
+ /* Blame needs a file on which to operate. */
+ if (! targets->nelts)
+ return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL);
+
+ if (opt_state->end_revision.kind == svn_opt_revision_unspecified)
+ {
+ if (opt_state->start_revision.kind != svn_opt_revision_unspecified)
+ {
+ /* In the case that -rX was specified, we actually want to set the
+ range to be -r1:X. */
+
+ opt_state->end_revision = opt_state->start_revision;
+ opt_state->start_revision.kind = svn_opt_revision_number;
+ opt_state->start_revision.value.number = 1;
+ }
+ else
+ end_revision_unspecified = TRUE;
+ }
+
+ if (opt_state->start_revision.kind == svn_opt_revision_unspecified)
+ {
+ opt_state->start_revision.kind = svn_opt_revision_number;
+ opt_state->start_revision.value.number = 1;
+ }
+
+ /* The final conclusion from issue #2431 is that blame info
+ is client output (unlike 'svn cat' which plainly cats the file),
+ so the EOL style should be the platform local one.
+ */
+ iterpool = svn_pool_create(pool);
+
+ for (i = 0; i < targets->nelts; i++)
+ {
+ svn_error_t *err;
+ const char *target = APR_ARRAY_IDX(targets, i, const char *);
+ const char *parsed_path;
+ svn_opt_revision_t peg_revision;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
+
+ /* Check for a peg revision. */
+ SVN_ERR(svn_opt_parse_path(&peg_revision, &parsed_path, target,
+ iterpool));
+
+ if (end_revision_unspecified)
+ {
+ if (peg_revision.kind != svn_opt_revision_unspecified)
+ opt_state->end_revision = peg_revision;
+ else if (svn_path_is_url(target))
+ opt_state->end_revision.kind = svn_opt_revision_head;
+ else
+ opt_state->end_revision.kind = svn_opt_revision_working;
+ }
+
+ err = bench_null_blame(parsed_path,
+ &peg_revision,
+ &opt_state->start_revision,
+ &opt_state->end_revision,
+ opt_state->use_merge_history,
+ opt_state->quiet,
+ ctx,
+ iterpool);
+
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND ||
+ err->apr_err == SVN_ERR_ENTRY_NOT_FOUND ||
+ err->apr_err == SVN_ERR_FS_NOT_FILE ||
+ err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_handle_warning2(stderr, err, "svn: ");
+ svn_error_clear(err);
+ err = NULL;
+ seen_nonexistent_target = TRUE;
+ }
+ else
+ {
+ return svn_error_trace(err);
+ }
+ }
+ }
+ svn_pool_destroy(iterpool);
+
+ if (seen_nonexistent_target)
+ return svn_error_create(
+ SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Could not perform blame on all targets because some "
+ "targets don't exist"));
+ else
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnbench/null-export-cmd.c b/subversion/svnbench/null-export-cmd.c
new file mode 100644
index 0000000..8220bfb
--- /dev/null
+++ b/subversion/svnbench/null-export-cmd.c
@@ -0,0 +1,346 @@
+/*
+ * export-cmd.c -- Subversion export command
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include "svn_client.h"
+#include "svn_error.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_cmdline.h"
+#include "cl.h"
+
+#include "svn_private_config.h"
+#include "private/svn_string_private.h"
+#include "private/svn_client_private.h"
+
+/*** The export editor code. ***/
+
+/* ---------------------------------------------------------------------- */
+
+/*** A dedicated 'export' editor, which does no .svn/ accounting. ***/
+
+typedef struct edit_baton_t
+{
+ apr_int64_t file_count;
+ apr_int64_t dir_count;
+ apr_int64_t byte_count;
+ apr_int64_t prop_count;
+ apr_int64_t prop_byte_count;
+} edit_baton_t;
+
+static svn_error_t *
+set_target_revision(void *edit_baton,
+ svn_revnum_t target_revision,
+ apr_pool_t *pool)
+{
+ return SVN_NO_ERROR;
+}
+
+
+/* Just ensure that the main export directory exists. */
+static svn_error_t *
+open_root(void *edit_baton,
+ svn_revnum_t base_revision,
+ apr_pool_t *pool,
+ void **root_baton)
+{
+ *root_baton = edit_baton;
+ return SVN_NO_ERROR;
+}
+
+
+/* Ensure the directory exists, and send feedback. */
+static svn_error_t *
+add_directory(const char *path,
+ void *parent_baton,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_revision,
+ apr_pool_t *pool,
+ void **baton)
+{
+ edit_baton_t *eb = parent_baton;
+ eb->dir_count++;
+
+ *baton = parent_baton;
+ return SVN_NO_ERROR;
+}
+
+
+/* Build a file baton. */
+static svn_error_t *
+add_file(const char *path,
+ void *parent_baton,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_revision,
+ apr_pool_t *pool,
+ void **baton)
+{
+ edit_baton_t *eb = parent_baton;
+ eb->file_count++;
+
+ *baton = parent_baton;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+window_handler(svn_txdelta_window_t *window, void *baton)
+{
+ edit_baton_t *eb = baton;
+ if (window != NULL)
+ eb->byte_count += window->tview_len;
+
+ return SVN_NO_ERROR;
+}
+
+/* Write incoming data into the tmpfile stream */
+
+static svn_error_t *
+apply_textdelta(void *file_baton,
+ const char *base_checksum,
+ apr_pool_t *pool,
+ svn_txdelta_window_handler_t *handler,
+ void **handler_baton)
+{
+ *handler_baton = file_baton;
+ *handler = window_handler;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+change_file_prop(void *file_baton,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ edit_baton_t *eb = file_baton;
+ eb->prop_count++;
+ eb->prop_byte_count += value->len;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+change_dir_prop(void *dir_baton,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ edit_baton_t *eb = dir_baton;
+ eb->prop_count++;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+close_file(void *file_baton,
+ const char *text_checksum,
+ apr_pool_t *pool)
+{
+ return SVN_NO_ERROR;
+}
+
+
+/*** Public Interfaces ***/
+
+static svn_error_t *
+bench_null_export(svn_revnum_t *result_rev,
+ const char *from_path_or_url,
+ svn_opt_revision_t *peg_revision,
+ svn_opt_revision_t *revision,
+ svn_depth_t depth,
+ void *baton,
+ svn_client_ctx_t *ctx,
+ svn_boolean_t quiet,
+ apr_pool_t *pool)
+{
+ svn_revnum_t edit_revision = SVN_INVALID_REVNUM;
+ svn_boolean_t from_is_url = svn_path_is_url(from_path_or_url);
+
+ SVN_ERR_ASSERT(peg_revision != NULL);
+ SVN_ERR_ASSERT(revision != NULL);
+
+ if (peg_revision->kind == svn_opt_revision_unspecified)
+ peg_revision->kind = svn_path_is_url(from_path_or_url)
+ ? svn_opt_revision_head
+ : svn_opt_revision_working;
+
+ if (revision->kind == svn_opt_revision_unspecified)
+ revision = peg_revision;
+
+ if (from_is_url || ! SVN_CLIENT__REVKIND_IS_LOCAL_TO_WC(revision->kind))
+ {
+ svn_client__pathrev_t *loc;
+ svn_ra_session_t *ra_session;
+ svn_node_kind_t kind;
+
+ /* Get the RA connection. */
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc,
+ from_path_or_url, NULL,
+ peg_revision,
+ revision, ctx, pool));
+
+ SVN_ERR(svn_ra_check_path(ra_session, "", loc->rev, &kind, pool));
+
+ if (kind == svn_node_file)
+ {
+ apr_hash_t *props;
+
+ /* Since you cannot actually root an editor at a file, we
+ * manually drive a few functions of our editor. */
+
+ /* Step outside the editor-likeness for a moment, to actually talk
+ * to the repository. */
+ /* ### note: the stream will not be closed */
+ SVN_ERR(svn_ra_get_file(ra_session, "", loc->rev,
+ svn_stream_empty(pool),
+ NULL, &props, pool));
+ }
+ else if (kind == svn_node_dir)
+ {
+ void *edit_baton = NULL;
+ const svn_delta_editor_t *export_editor = NULL;
+ const svn_ra_reporter3_t *reporter;
+ void *report_baton;
+
+ svn_delta_editor_t *editor = svn_delta_default_editor(pool);
+
+ editor->set_target_revision = set_target_revision;
+ editor->open_root = open_root;
+ editor->add_directory = add_directory;
+ editor->add_file = add_file;
+ editor->apply_textdelta = apply_textdelta;
+ editor->close_file = close_file;
+ editor->change_file_prop = change_file_prop;
+ editor->change_dir_prop = change_dir_prop;
+
+ /* for ra_svn, we don't need an editior in quiet mode */
+ if (!quiet || strncmp(loc->repos_root_url, "svn:", 4))
+ SVN_ERR(svn_delta_get_cancellation_editor(ctx->cancel_func,
+ ctx->cancel_baton,
+ editor,
+ baton,
+ &export_editor,
+ &edit_baton,
+ pool));
+
+ /* Manufacture a basic 'report' to the update reporter. */
+ SVN_ERR(svn_ra_do_update3(ra_session,
+ &reporter, &report_baton,
+ loc->rev,
+ "", /* no sub-target */
+ depth,
+ FALSE, /* don't want copyfrom-args */
+ FALSE, /* don't want ignore_ancestry */
+ export_editor, edit_baton,
+ pool, pool));
+
+ SVN_ERR(reporter->set_path(report_baton, "", loc->rev,
+ /* Depth is irrelevant, as we're
+ passing start_empty=TRUE anyway. */
+ svn_depth_infinity,
+ TRUE, /* "help, my dir is empty!" */
+ NULL, pool));
+
+ SVN_ERR(reporter->finish_report(report_baton, pool));
+ }
+ else if (kind == svn_node_none)
+ {
+ return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+ _("URL '%s' doesn't exist"),
+ from_path_or_url);
+ }
+ /* kind == svn_node_unknown not handled */
+ }
+
+
+ if (result_rev)
+ *result_rev = edit_revision;
+
+ return SVN_NO_ERROR;
+}
+
+
+/*** Code. ***/
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__null_export(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
+ const char *from;
+ apr_array_header_t *targets;
+ svn_error_t *err;
+ svn_opt_revision_t peg_revision;
+ const char *truefrom;
+ edit_baton_t eb = { 0 };
+
+ SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
+ opt_state->targets,
+ ctx, FALSE, pool));
+
+ /* We want exactly 1 or 2 targets for this subcommand. */
+ if (targets->nelts < 1)
+ return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL);
+ if (targets->nelts > 2)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, NULL);
+
+ /* The first target is the `from' path. */
+ from = APR_ARRAY_IDX(targets, 0, const char *);
+
+ /* Get the peg revision if present. */
+ SVN_ERR(svn_opt_parse_path(&peg_revision, &truefrom, from, pool));
+
+ if (opt_state->depth == svn_depth_unknown)
+ opt_state->depth = svn_depth_infinity;
+
+ /* Do the export. */
+ err = bench_null_export(NULL, truefrom, &peg_revision,
+ &(opt_state->start_revision),
+ opt_state->depth,
+ &eb,
+ ctx, opt_state->quiet, pool);
+
+ if (!opt_state->quiet)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("%15s directories\n"
+ "%15s files\n"
+ "%15s bytes in files\n"
+ "%15s properties\n"
+ "%15s bytes in properties\n"),
+ svn__ui64toa_sep(eb.dir_count, ',', pool),
+ svn__ui64toa_sep(eb.file_count, ',', pool),
+ svn__ui64toa_sep(eb.byte_count, ',', pool),
+ svn__ui64toa_sep(eb.prop_count, ',', pool),
+ svn__ui64toa_sep(eb.prop_byte_count, ',', pool)));
+
+ return svn_error_trace(err);
+}
diff --git a/subversion/svnbench/null-info-cmd.c b/subversion/svnbench/null-info-cmd.c
new file mode 100644
index 0000000..c9b8710
--- /dev/null
+++ b/subversion/svnbench/null-info-cmd.c
@@ -0,0 +1,287 @@
+/*
+ * info-cmd.c -- Display information about a resource
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include "svn_string.h"
+#include "svn_cmdline.h"
+#include "svn_wc.h"
+#include "svn_pools.h"
+#include "svn_error_codes.h"
+#include "svn_error.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_time.h"
+#include "svn_xml.h"
+#include "cl.h"
+
+#include "svn_private_config.h"
+#include "private/svn_client_private.h"
+
+
+/*** Code. ***/
+
+/* The dirent fields we care about for our calls to svn_ra_get_dir2. */
+#define DIRENT_FIELDS (SVN_DIRENT_KIND | \
+ SVN_DIRENT_CREATED_REV | \
+ SVN_DIRENT_TIME | \
+ SVN_DIRENT_LAST_AUTHOR)
+
+/* Helper func for recursively fetching svn_dirent_t's from a remote
+ directory and pushing them at an info-receiver callback.
+
+ DEPTH is the depth starting at DIR, even though RECEIVER is never
+ invoked on DIR: if DEPTH is svn_depth_immediates, then increment
+ *COUNTER on all children of DIR, but none of their children; if
+ svn_depth_files, then increment *COUNTER on file children of DIR but
+ not on subdirectories; if svn_depth_infinity, recurse fully.
+ DIR is a relpath, relative to the root of RA_SESSION.
+*/
+static svn_error_t *
+push_dir_info(svn_ra_session_t *ra_session,
+ const svn_client__pathrev_t *pathrev,
+ const char *dir,
+ int *counter,
+ svn_depth_t depth,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ apr_hash_t *tmpdirents;
+ apr_hash_index_t *hi;
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ SVN_ERR(svn_ra_get_dir2(ra_session, &tmpdirents, NULL, NULL,
+ dir, pathrev->rev, DIRENT_FIELDS, pool));
+
+ for (hi = apr_hash_first(pool, tmpdirents); hi; hi = apr_hash_next(hi))
+ {
+ const char *path;
+ const char *name = apr_hash_this_key(hi);
+ svn_dirent_t *the_ent = apr_hash_this_val(hi);
+ svn_client__pathrev_t *child_pathrev;
+
+ svn_pool_clear(subpool);
+
+ if (ctx->cancel_func)
+ SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
+
+ path = svn_relpath_join(dir, name, subpool);
+ child_pathrev = svn_client__pathrev_join_relpath(pathrev, name, subpool);
+
+ if (depth >= svn_depth_immediates
+ || (depth == svn_depth_files && the_ent->kind == svn_node_file))
+ ++(*counter);
+
+ if (depth == svn_depth_infinity && the_ent->kind == svn_node_dir)
+ SVN_ERR(push_dir_info(ra_session, child_pathrev, path,
+ counter, depth, ctx, subpool));
+ }
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Stripped-down version of svn_client_info3 */
+static svn_error_t *
+client_info(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,
+ const apr_array_header_t *changelists,
+ int *counter,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ svn_ra_session_t *ra_session;
+ svn_client__pathrev_t *pathrev;
+ svn_lock_t *lock;
+ const char *base_name;
+ svn_dirent_t *the_ent;
+ svn_error_t *err;
+
+ if (depth == svn_depth_unknown)
+ depth = svn_depth_empty;
+
+ /* Go repository digging instead. */
+
+ /* Trace rename history (starting at path_or_url@peg_revision) and
+ return RA session to the possibly-renamed URL as it exists in REVISION.
+ The ra_session returned will be anchored on this "final" URL. */
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev,
+ abspath_or_url, NULL, peg_revision,
+ revision, ctx, pool));
+
+ svn_uri_split(NULL, &base_name, pathrev->url, pool);
+
+ /* Get the dirent for the URL itself. */
+ SVN_ERR(svn_ra_stat(ra_session, "", pathrev->rev, &the_ent, pool));
+
+ if (! the_ent)
+ return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+ _("URL '%s' non-existent in revision %ld"),
+ pathrev->url, pathrev->rev);
+
+ /* check for locks */
+ err = svn_ra_get_lock(ra_session, &lock, "", pool);
+
+ /* An old mod_dav_svn will always work; there's nothing wrong with
+ doing a PROPFIND for a property named "DAV:supportedlock". But
+ an old svnserve will error. */
+ if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
+ {
+ svn_error_clear(err);
+ lock = NULL;
+ }
+ else if (err)
+ return svn_error_trace(err);
+
+ /* Push the URL's dirent (and lock) at the callback.*/
+ ++(*counter);
+
+ /* Possibly recurse, using the original RA session. */
+ if (depth > svn_depth_empty && (the_ent->kind == svn_node_dir))
+ {
+ apr_hash_t *locks;
+
+ if (peg_revision->kind == svn_opt_revision_head)
+ {
+ err = svn_ra_get_locks2(ra_session, &locks, "", depth, pool);
+
+ /* Catch specific errors thrown by old mod_dav_svn or svnserve. */
+ if (err &&
+ (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED
+ || err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE))
+ svn_error_clear(err);
+ else if (err)
+ return svn_error_trace(err);
+ }
+
+ SVN_ERR(push_dir_info(ra_session, pathrev, "",
+ counter, depth, ctx, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__null_info(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
+ apr_array_header_t *targets = NULL;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ int i;
+ svn_error_t *err;
+ svn_boolean_t seen_nonexistent_target = FALSE;
+ svn_opt_revision_t peg_revision;
+ const char *path_prefix;
+
+ SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
+ opt_state->targets,
+ ctx, FALSE, pool));
+
+ /* Add "." if user passed 0 arguments. */
+ svn_opt_push_implicit_dot_target(targets, pool);
+
+ if (opt_state->depth == svn_depth_unknown)
+ opt_state->depth = svn_depth_empty;
+
+ SVN_ERR(svn_dirent_get_absolute(&path_prefix, "", pool));
+
+ for (i = 0; i < targets->nelts; i++)
+ {
+ const char *truepath;
+ const char *target = APR_ARRAY_IDX(targets, i, const char *);
+ int received_count = 0;
+
+ svn_pool_clear(subpool);
+ SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
+
+ /* Get peg revisions. */
+ SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target, subpool));
+
+ /* If no peg-rev was attached to a URL target, then assume HEAD. */
+ if (svn_path_is_url(truepath))
+ {
+ if (peg_revision.kind == svn_opt_revision_unspecified)
+ peg_revision.kind = svn_opt_revision_head;
+ }
+ else
+ {
+ SVN_ERR(svn_dirent_get_absolute(&truepath, truepath, subpool));
+ }
+
+ err = client_info(truepath,
+ &peg_revision, &(opt_state->start_revision),
+ opt_state->depth, TRUE, TRUE,
+ NULL,
+ &received_count,
+ ctx, subpool);
+
+ if (err)
+ {
+ /* If one of the targets is a non-existent URL or wc-entry,
+ don't bail out. Just warn and move on to the next target. */
+ if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND ||
+ err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
+ {
+ svn_handle_warning2(stderr, err, "svnbench: ");
+ svn_error_clear(svn_cmdline_fprintf(stderr, subpool, "\n"));
+ }
+ else
+ {
+ return svn_error_trace(err);
+ }
+
+ svn_error_clear(err);
+ err = NULL;
+ seen_nonexistent_target = TRUE;
+ }
+ else
+ {
+ SVN_ERR(svn_cmdline_printf(pool, _("Number of status notifications "
+ "received: %d\n"),
+ received_count));
+ }
+ }
+ svn_pool_destroy(subpool);
+
+ if (seen_nonexistent_target)
+ return svn_error_create(
+ SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Could not display info for all targets because some "
+ "targets don't exist"));
+ else
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnbench/null-list-cmd.c b/subversion/svnbench/null-list-cmd.c
new file mode 100644
index 0000000..3f19209
--- /dev/null
+++ b/subversion/svnbench/null-list-cmd.c
@@ -0,0 +1,169 @@
+/*
+ * list-cmd.c -- list a URL
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_cmdline.h"
+#include "svn_client.h"
+#include "svn_error.h"
+#include "svn_pools.h"
+#include "svn_time.h"
+#include "svn_xml.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_utf.h"
+#include "svn_opt.h"
+
+#include "cl.h"
+
+#include "svn_private_config.h"
+#include "private/svn_string_private.h"
+
+
+
+/* Baton used when printing directory entries. */
+struct print_baton {
+ svn_boolean_t verbose;
+ apr_int64_t directories;
+ apr_int64_t files;
+ apr_int64_t locks;
+ svn_client_ctx_t *ctx;
+};
+
+/* This implements the svn_client_list_func2_t API, printing a single
+ directory entry in text format. */
+static svn_error_t *
+print_dirent(void *baton,
+ const char *path,
+ const svn_dirent_t *dirent,
+ const svn_lock_t *lock,
+ const char *abs_path,
+ const char *external_parent_url,
+ const char *external_target,
+ apr_pool_t *pool)
+{
+ struct print_baton *pb = baton;
+
+ if (pb->ctx->cancel_func)
+ SVN_ERR(pb->ctx->cancel_func(pb->ctx->cancel_baton));
+
+ if (dirent->kind == svn_node_dir)
+ pb->directories++;
+ if (dirent->kind == svn_node_file)
+ pb->files++;
+ if (lock)
+ pb->locks++;
+
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__null_list(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
+ apr_array_header_t *targets;
+ int i;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ apr_uint32_t dirent_fields;
+ struct print_baton pb = { FALSE };
+ svn_boolean_t seen_nonexistent_target = FALSE;
+ svn_error_t *err;
+
+ SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
+ opt_state->targets,
+ ctx, FALSE, pool));
+
+ /* Add "." if user passed 0 arguments */
+ svn_opt_push_implicit_dot_target(targets, pool);
+
+ if (opt_state->verbose)
+ dirent_fields = SVN_DIRENT_ALL;
+ else
+ dirent_fields = SVN_DIRENT_KIND; /* the only thing we actually need... */
+
+ pb.ctx = ctx;
+ pb.verbose = opt_state->verbose;
+
+ if (opt_state->depth == svn_depth_unknown)
+ opt_state->depth = svn_depth_immediates;
+
+ /* For each target, try to list it. */
+ for (i = 0; i < targets->nelts; i++)
+ {
+ const char *target = APR_ARRAY_IDX(targets, i, const char *);
+ const char *truepath;
+ svn_opt_revision_t peg_revision;
+
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
+
+ /* Get peg revisions. */
+ SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target,
+ subpool));
+
+ err = svn_client_list3(truepath, &peg_revision,
+ &(opt_state->start_revision),
+ opt_state->depth,
+ dirent_fields,
+ opt_state->verbose,
+ FALSE, /* include externals */
+ print_dirent,
+ &pb, ctx, subpool);
+
+ if (err)
+ {
+ /* If one of the targets is a non-existent URL or wc-entry,
+ don't bail out. Just warn and move on to the next target. */
+ if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND ||
+ err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ svn_handle_warning2(stderr, err, "svnbench: ");
+ else
+ return svn_error_trace(err);
+
+ svn_error_clear(err);
+ err = NULL;
+ seen_nonexistent_target = TRUE;
+ }
+ else if (!opt_state->quiet)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("%15s directories\n"
+ "%15s files\n"
+ "%15s locks\n"),
+ svn__ui64toa_sep(pb.directories, ',', pool),
+ svn__ui64toa_sep(pb.files, ',', pool),
+ svn__ui64toa_sep(pb.locks, ',', pool)));
+ }
+
+ svn_pool_destroy(subpool);
+
+ if (seen_nonexistent_target)
+ return svn_error_create(
+ SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Could not list all targets because some targets don't exist"));
+ else
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnbench/null-log-cmd.c b/subversion/svnbench/null-log-cmd.c
new file mode 100644
index 0000000..e8f9734
--- /dev/null
+++ b/subversion/svnbench/null-log-cmd.c
@@ -0,0 +1,243 @@
+/*
+ * log-cmd.c -- Display log messages
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#define APR_WANT_STRFUNC
+#define APR_WANT_STDIO
+#include <apr_want.h>
+
+#include "svn_cmdline.h"
+#include "svn_compat.h"
+#include "svn_path.h"
+#include "svn_props.h"
+
+#include "cl.h"
+
+#include "svn_private_config.h"
+#include "private/svn_string_private.h"
+
+
+/*** Code. ***/
+
+/* Baton for log_entry_receiver() and log_entry_receiver_xml(). */
+struct log_receiver_baton
+{
+ /* Client context. */
+ svn_client_ctx_t *ctx;
+
+ /* Level of merge revision nesting */
+ apr_size_t merge_depth;
+
+ /* collect counters? */
+ svn_boolean_t quiet;
+
+ /* total revision counters */
+ apr_int64_t revisions;
+ apr_int64_t changes;
+ apr_int64_t message_lines;
+
+ /* part that came from merges */
+ apr_int64_t merges;
+ apr_int64_t merged_revs;
+ apr_int64_t merged_changes;
+ apr_int64_t merged_message_lines;
+};
+
+
+/* Implement `svn_log_entry_receiver_t', printing the logs in
+ * a human-readable and machine-parseable format.
+ *
+ * BATON is of type `struct log_receiver_baton'.
+ */
+static svn_error_t *
+log_entry_receiver(void *baton,
+ svn_log_entry_t *log_entry,
+ apr_pool_t *pool)
+{
+ struct log_receiver_baton *lb = baton;
+ const char *author;
+ const char *date;
+ const char *message;
+
+ if (lb->ctx->cancel_func)
+ SVN_ERR(lb->ctx->cancel_func(lb->ctx->cancel_baton));
+
+ if (! SVN_IS_VALID_REVNUM(log_entry->revision))
+ {
+ lb->merge_depth--;
+ return SVN_NO_ERROR;
+ }
+
+ /* if we don't want counters, we are done */
+ if (lb->quiet)
+ return SVN_NO_ERROR;
+
+ /* extract the message and do all the other counting */
+ svn_compat_log_revprops_out(&author, &date, &message, log_entry->revprops);
+ if (log_entry->revision == 0 && message == NULL)
+ return SVN_NO_ERROR;
+
+ lb->revisions++;
+ if (lb->merge_depth)
+ lb->merged_revs++;
+
+ if (message != NULL)
+ {
+ int count = svn_cstring_count_newlines(message) + 1;
+ lb->message_lines += count;
+ if (lb->merge_depth)
+ lb->merged_message_lines += count;
+ }
+
+ if (log_entry->changed_paths2)
+ {
+ unsigned count = apr_hash_count(log_entry->changed_paths2);
+ lb->changes += count;
+ if (lb->merge_depth)
+ lb->merged_changes += count;
+ }
+
+ if (log_entry->has_children)
+ {
+ lb->merge_depth++;
+ lb->merges++;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements the `svn_opt_subcommand_t' interface. */
+svn_error_t *
+svn_cl__null_log(apr_getopt_t *os,
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
+ apr_array_header_t *targets;
+ struct log_receiver_baton lb = { 0 };
+ const char *target;
+ int i;
+ apr_array_header_t *revprops;
+ svn_opt_revision_t target_peg_revision;
+ const char *target_path_or_url;
+
+ SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
+ opt_state->targets,
+ ctx, FALSE, pool));
+
+ /* Add "." if user passed 0 arguments */
+ svn_opt_push_implicit_dot_target(targets, pool);
+
+ /* Determine if they really want a two-revision range. */
+ if (opt_state->used_change_arg)
+ {
+ if (opt_state->used_revision_arg && opt_state->revision_ranges->nelts > 1)
+ {
+ return svn_error_create
+ (SVN_ERR_CLIENT_BAD_REVISION, NULL,
+ _("-c and -r are mutually exclusive"));
+ }
+ for (i = 0; i < opt_state->revision_ranges->nelts; i++)
+ {
+ svn_opt_revision_range_t *range;
+ range = APR_ARRAY_IDX(opt_state->revision_ranges, i,
+ svn_opt_revision_range_t *);
+ if (range->start.value.number < range->end.value.number)
+ range->start.value.number++;
+ else
+ range->end.value.number++;
+ }
+ }
+
+ /* Parse the first target into path-or-url and peg revision. */
+ target = APR_ARRAY_IDX(targets, 0, const char *);
+ SVN_ERR(svn_opt_parse_path(&target_peg_revision, &target_path_or_url,
+ target, pool));
+ if (target_peg_revision.kind == svn_opt_revision_unspecified)
+ target_peg_revision.kind = (svn_path_is_url(target)
+ ? svn_opt_revision_head
+ : svn_opt_revision_working);
+ APR_ARRAY_IDX(targets, 0, const char *) = target_path_or_url;
+
+ if (svn_path_is_url(target))
+ {
+ for (i = 1; i < targets->nelts; i++)
+ {
+ target = APR_ARRAY_IDX(targets, i, const char *);
+
+ if (svn_path_is_url(target) || target[0] == '/')
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Only relative paths can be specified"
+ " after a URL for 'svnbench log', "
+ "but '%s' is not a relative path"),
+ target);
+ }
+ }
+
+ lb.ctx = ctx;
+ lb.quiet = opt_state->quiet;
+
+ revprops = apr_array_make(pool, 3, sizeof(char *));
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_AUTHOR;
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE;
+ if (!opt_state->quiet)
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
+ SVN_ERR(svn_client_log5(targets,
+ &target_peg_revision,
+ opt_state->revision_ranges,
+ opt_state->limit,
+ opt_state->verbose,
+ opt_state->stop_on_copy,
+ opt_state->use_merge_history,
+ revprops,
+ log_entry_receiver,
+ &lb,
+ ctx,
+ pool));
+
+ if (!opt_state->quiet)
+ {
+ if (opt_state->use_merge_history)
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("%15s revisions, %15s merged in %s merges\n"
+ "%15s msg lines, %15s in merged revisions\n"
+ "%15s changes, %15s in merged revisions\n"),
+ svn__ui64toa_sep(lb.revisions, ',', pool),
+ svn__ui64toa_sep(lb.merged_revs, ',', pool),
+ svn__ui64toa_sep(lb.merges, ',', pool),
+ svn__ui64toa_sep(lb.message_lines, ',', pool),
+ svn__ui64toa_sep(lb.merged_message_lines, ',', pool),
+ svn__ui64toa_sep(lb.changes, ',', pool),
+ svn__ui64toa_sep(lb.merged_changes, ',', pool)));
+ else
+ SVN_ERR(svn_cmdline_printf(pool,
+ _("%15s revisions\n"
+ "%15s msg lines\n"
+ "%15s changes\n"),
+ svn__ui64toa_sep(lb.revisions, ',', pool),
+ svn__ui64toa_sep(lb.message_lines, ',', pool),
+ svn__ui64toa_sep(lb.changes, ',', pool)));
+ }
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnbench/svnbench.c b/subversion/svnbench/svnbench.c
new file mode 100644
index 0000000..bd67e0b
--- /dev/null
+++ b/subversion/svnbench/svnbench.c
@@ -0,0 +1,1005 @@
+/*
+ * svnbench.c: Subversion benchmark client.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include <string.h>
+#include <assert.h>
+
+#include <apr_signal.h>
+
+#include "svn_cmdline.h"
+#include "svn_dirent_uri.h"
+#include "svn_pools.h"
+#include "svn_utf.h"
+#include "svn_version.h"
+
+#include "cl.h"
+
+#include "private/svn_opt_private.h"
+#include "private/svn_cmdline_private.h"
+
+#include "svn_private_config.h"
+
+
+/*** Option Processing ***/
+
+/* Add an identifier here for long options that don't have a short
+ option. Options that have both long and short options should just
+ use the short option letter as identifier. */
+typedef enum svn_cl__longopt_t {
+ opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+ opt_auth_username,
+ opt_config_dir,
+ opt_config_options,
+ opt_depth,
+ opt_no_auth_cache,
+ opt_non_interactive,
+ opt_stop_on_copy,
+ opt_strict,
+ opt_targets,
+ opt_version,
+ opt_with_revprop,
+ opt_with_all_revprops,
+ opt_with_no_revprops,
+ opt_trust_server_cert,
+ opt_trust_server_cert_failures,
+ opt_changelist
+} svn_cl__longopt_t;
+
+
+/* Option codes and descriptions for the command line client.
+ *
+ * The entire list must be terminated with an entry of nulls.
+ */
+const apr_getopt_option_t svn_cl__options[] =
+{
+ {"help", 'h', 0, N_("show help on a subcommand")},
+ {NULL, '?', 0, N_("show help on a subcommand")},
+ {"quiet", 'q', 0, N_("print nothing, or only summary information")},
+ {"recursive", 'R', 0, N_("descend recursively, same as --depth=infinity")},
+ {"non-recursive", 'N', 0, N_("obsolete; try --depth=files or --depth=immediates")},
+ {"change", 'c', 1,
+ N_("the change made by revision ARG (like -r ARG-1:ARG)\n"
+ " "
+ "If ARG is negative this is like -r ARG:ARG-1\n"
+ " "
+ "If ARG is of the form ARG1-ARG2 then this is like\n"
+ " "
+ "ARG1:ARG2, where ARG1 is inclusive")},
+ {"revision", 'r', 1,
+ N_("ARG (some commands also take ARG1:ARG2 range)\n"
+ " "
+ "A revision argument can be one of:\n"
+ " "
+ " NUMBER revision number\n"
+ " "
+ " '{' DATE '}' revision at start of the date\n"
+ " "
+ " 'HEAD' latest in repository\n"
+ " "
+ " 'BASE' base rev of item's working copy\n"
+ " "
+ " 'COMMITTED' last commit at or before BASE\n"
+ " "
+ " 'PREV' revision just before COMMITTED")},
+ {"version", opt_version, 0, N_("show program version information")},
+ {"verbose", 'v', 0, N_("print extra information")},
+ {"username", opt_auth_username, 1, N_("specify a username ARG")},
+ {"password", opt_auth_password, 1, N_("specify a password ARG")},
+ {"targets", opt_targets, 1,
+ N_("pass contents of file ARG as additional args")},
+ {"depth", opt_depth, 1,
+ N_("limit operation by depth ARG ('empty', 'files',\n"
+ " "
+ "'immediates', or 'infinity')")},
+ {"strict", opt_strict, 0, N_("use strict semantics")},
+ {"stop-on-copy", opt_stop_on_copy, 0,
+ N_("do not cross copies while traversing history")},
+ {"no-auth-cache", opt_no_auth_cache, 0,
+ N_("do not cache authentication tokens")},
+ {"trust-server-cert", opt_trust_server_cert, 0,
+ N_("deprecated; same as\n"
+ " "
+ "--trust-server-cert-failures=unknown-ca")},
+ {"trust-server-cert-failures", opt_trust_server_cert_failures, 1,
+ N_("with --non-interactive, accept SSL server\n"
+ " "
+ "certificates with failures; ARG is comma-separated\n"
+ " "
+ "list of 'unknown-ca' (Unknown Authority),\n"
+ " "
+ "'cn-mismatch' (Hostname mismatch), 'expired'\n"
+ " "
+ "(Expired certificate), 'not-yet-valid' (Not yet\n"
+ " "
+ "valid certificate) and 'other' (all other not\n"
+ " "
+ "separately classified certificate errors).")},
+ {"non-interactive", opt_non_interactive, 0,
+ N_("do no interactive prompting")},
+ {"config-dir", opt_config_dir, 1,
+ N_("read user configuration files from directory ARG")},
+ {"config-option", opt_config_options, 1,
+ N_("set user configuration option in the format:\n"
+ " "
+ " FILE:SECTION:OPTION=[VALUE]\n"
+ " "
+ "For example:\n"
+ " "
+ " servers:global:http-library=serf")},
+ {"limit", 'l', 1, N_("maximum number of log entries")},
+ {"with-all-revprops", opt_with_all_revprops, 0,
+ N_("retrieve all revision properties")},
+ {"with-no-revprops", opt_with_no_revprops, 0,
+ N_("retrieve no revision properties")},
+ {"with-revprop", opt_with_revprop, 1,
+ N_("set revision property ARG in new revision\n"
+ " "
+ "using the name[=value] format")},
+ {"use-merge-history", 'g', 0,
+ N_("use/display additional information from merge\n"
+ " "
+ "history")},
+
+ /* Long-opt Aliases
+ *
+ * These have NULL desriptions, but an option code that matches some
+ * other option (whose description should probably mention its aliases).
+ */
+
+ {0, 0, 0, 0},
+};
+
+
+
+/*** Command dispatch. ***/
+
+/* Our array of available subcommands.
+ *
+ * The entire list must be terminated with an entry of nulls.
+ *
+ * In most of the help text "PATH" is used where a working copy path is
+ * required, "URL" where a repository URL is required and "TARGET" when
+ * either a path or a url can be used. Hmm, should this be part of the
+ * help text?
+ */
+
+/* Options that apply to all commands. (While not every command may
+ currently require authentication or be interactive, allowing every
+ command to take these arguments allows scripts to just pass them
+ willy-nilly to every invocation of 'svn') . */
+const int svn_cl__global_options[] =
+{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+ opt_trust_server_cert, opt_trust_server_cert_failures,
+ opt_config_dir, opt_config_options, 0
+};
+
+const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
+{
+ { "help", svn_cl__help, {"?", "h"}, N_
+ ("Describe the usage of this program or its subcommands.\n"
+ "usage: help [SUBCOMMAND...]\n"),
+ {0} },
+ /* This command is also invoked if we see option "--help", "-h" or "-?". */
+
+ { "null-blame", svn_cl__null_blame, {0}, N_
+ ("Fetch all versions of a file in a batch.\n"
+ "usage: null-blame [-rM:N] TARGET[@REV]...\n"
+ "\n"
+ " With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n"
+ " annotate each line that is present in revision N of the file, with\n"
+ " the last revision at or before rN that changed or added the line,\n"
+ " looking back no further than rM.\n"
+ "\n"
+ " With a reverse revision range '-r M:N' where M > N,\n"
+ " annotate each line that is present in revision N of the file, with\n"
+ " the next revision after rN that changed or deleted the line,\n"
+ " looking forward no further than rM.\n"
+ "\n"
+ " If specified, REV determines in which revision the target is first\n"
+ " looked up.\n"
+ "\n"
+ " Write the annotated result to standard output.\n"),
+ {'r', 'g'} },
+
+ { "null-export", svn_cl__null_export, {0}, N_
+ ("Create an unversioned copy of a tree.\n"
+ "usage: null-export [-r REV] URL[@PEGREV]\n"
+ "\n"
+ " Exports a clean directory tree from the repository specified by\n"
+ " URL, at revision REV if it is given, otherwise at HEAD.\n"
+ "\n"
+ " If specified, PEGREV determines in which revision the target is first\n"
+ " looked up.\n"),
+ {'r', 'q', 'N', opt_depth} },
+
+ { "null-list", svn_cl__null_list, {"ls"}, N_
+ ("List directory entries in the repository.\n"
+ "usage: null-list [TARGET[@REV]...]\n"
+ "\n"
+ " List each TARGET file and the contents of each TARGET directory as\n"
+ " they exist in the repository. If TARGET is a working copy path, the\n"
+ " corresponding repository URL will be used. If specified, REV determines\n"
+ " in which revision the target is first looked up.\n"
+ "\n"
+ " The default TARGET is '.', meaning the repository URL of the current\n"
+ " working directory.\n"
+ "\n"
+ " With --verbose, the following fields will be fetched for each item:\n"
+ "\n"
+ " Revision number of the last commit\n"
+ " Author of the last commit\n"
+ " If locked, the letter 'O'. (Use 'svn info URL' to see details)\n"
+ " Size (in bytes)\n"
+ " Date and time of the last commit\n"),
+ {'r', 'v', 'q', 'R', opt_depth} },
+
+ { "null-log", svn_cl__null_log, {0}, N_
+ ("Fetch the log messages for a set of revision(s) and/or path(s).\n"
+ "usage: 1. null-log [PATH][@REV]\n"
+ " 2. null-log URL[@REV] [PATH...]\n"
+ "\n"
+ " 1. Fetch the log messages for the URL corresponding to PATH\n"
+ " (default: '.'). If specified, REV is the revision in which the\n"
+ " URL is first looked up, and the default revision range is REV:1.\n"
+ " If REV is not specified, the default revision range is BASE:1,\n"
+ " since the URL might not exist in the HEAD revision.\n"
+ "\n"
+ " 2. Fetch the log messages for the PATHs (default: '.') under URL.\n"
+ " If specified, REV is the revision in which the URL is first\n"
+ " looked up, and the default revision range is REV:1; otherwise,\n"
+ " the URL is looked up in HEAD, and the default revision range is\n"
+ " HEAD:1.\n"
+ "\n"
+ " Multiple '-c' or '-r' options may be specified (but not a\n"
+ " combination of '-c' and '-r' options), and mixing of forward and\n"
+ " reverse ranges is allowed.\n"
+ "\n"
+ " With -v, also print all affected paths with each log message.\n"
+ " With -q, don't print the log message body itself (note that this is\n"
+ " compatible with -v).\n"
+ "\n"
+ " Each log message is printed just once, even if more than one of the\n"
+ " affected paths for that revision were explicitly requested. Logs\n"
+ " follow copy history by default. Use --stop-on-copy to disable this\n"
+ " behavior, which can be useful for determining branchpoints.\n"),
+ {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy,
+ 'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop,},
+ {{opt_with_revprop, N_("retrieve revision property ARG")},
+ {'c', N_("the change made in revision ARG")}} },
+
+ { "null-info", svn_cl__null_info, {0}, N_
+ ("Display information about a local or remote item.\n"
+ "usage: null-info [TARGET[@REV]...]\n"
+ "\n"
+ " Print information about each TARGET (default: '.').\n"
+ " TARGET may be either a working-copy path or URL. If specified, REV\n"
+ " determines in which revision the target is first looked up.\n"),
+ {'r', 'R', opt_depth, opt_targets, opt_changelist}
+ },
+
+ { NULL, NULL, {0}, NULL, {0} }
+};
+
+
+/* Version compatibility check */
+static svn_error_t *
+check_lib_versions(void)
+{
+ static const svn_version_checklist_t checklist[] =
+ {
+ { "svn_subr", svn_subr_version },
+ { "svn_client", svn_client_version },
+ { "svn_wc", svn_wc_version },
+ { "svn_ra", svn_ra_version },
+ { "svn_delta", svn_delta_version },
+ { NULL, NULL }
+ };
+ SVN_VERSION_DEFINE(my_version);
+
+ return svn_ver_check_list2(&my_version, checklist, svn_ver_equal);
+}
+
+
+/* A flag to see if we've been cancelled by the client or not. */
+static volatile sig_atomic_t cancelled = FALSE;
+
+/* A signal handler to support cancellation. */
+static void
+signal_handler(int signum)
+{
+ apr_signal(signum, SIG_IGN);
+ cancelled = TRUE;
+}
+
+/* Our cancellation callback. */
+svn_error_t *
+svn_cl__check_cancel(void *baton)
+{
+ if (cancelled)
+ return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Caught signal"));
+ else
+ return SVN_NO_ERROR;
+}
+
+
+/*** Main. ***/
+
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
+{
+ svn_error_t *err;
+ int opt_id;
+ apr_getopt_t *os;
+ svn_cl__opt_state_t opt_state = { 0, { 0 } };
+ svn_client_ctx_t *ctx;
+ apr_array_header_t *received_opts;
+ int i;
+ const svn_opt_subcommand_desc2_t *subcommand = NULL;
+ svn_cl__cmd_baton_t command_baton;
+ svn_auth_baton_t *ab;
+ svn_config_t *cfg_config;
+ svn_boolean_t descend = TRUE;
+ svn_boolean_t use_notifier = TRUE;
+
+ received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+ /* Check library versions */
+ SVN_ERR(check_lib_versions());
+
+#if defined(WIN32) || defined(__CYGWIN__)
+ /* Set the working copy administrative directory name. */
+ if (getenv("SVN_ASP_DOT_NET_HACK"))
+ {
+ SVN_ERR(svn_wc_set_adm_dir("_svn", pool));
+ }
+#endif
+
+ /* Initialize the RA library. */
+ SVN_ERR(svn_ra_initialize(pool));
+
+ /* Begin processing arguments. */
+ opt_state.start_revision.kind = svn_opt_revision_unspecified;
+ opt_state.end_revision.kind = svn_opt_revision_unspecified;
+ opt_state.revision_ranges =
+ apr_array_make(pool, 0, sizeof(svn_opt_revision_range_t *));
+ opt_state.depth = svn_depth_unknown;
+
+ /* No args? Show usage. */
+ if (argc <= 1)
+ {
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Else, parse options. */
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
+
+ os->interleave = 1;
+ while (1)
+ {
+ const char *opt_arg;
+ const char *utf8_opt_arg;
+
+ /* Parse the next option. */
+ apr_status_t apr_err = apr_getopt_long(os, svn_cl__options, &opt_id,
+ &opt_arg);
+ if (APR_STATUS_IS_EOF(apr_err))
+ break;
+ else if (apr_err)
+ {
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Stash the option code in an array before parsing it. */
+ APR_ARRAY_PUSH(received_opts, int) = opt_id;
+
+ switch (opt_id) {
+ case 'l':
+ {
+ err = svn_cstring_atoi(&opt_state.limit, opt_arg);
+ if (err)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Non-numeric limit argument given"));
+ }
+ if (opt_state.limit <= 0)
+ {
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Argument to --limit must be positive"));
+ }
+ }
+ break;
+ case 'c':
+ {
+ apr_array_header_t *change_revs =
+ svn_cstring_split(opt_arg, ", \n\r\t\v", TRUE, pool);
+
+ for (i = 0; i < change_revs->nelts; i++)
+ {
+ char *end;
+ svn_revnum_t changeno, changeno_end;
+ const char *change_str =
+ APR_ARRAY_IDX(change_revs, i, const char *);
+ const char *s = change_str;
+ svn_boolean_t is_negative;
+
+ /* Check for a leading minus to allow "-c -r42".
+ * The is_negative flag is used to handle "-c -42" and "-c -r42".
+ * The "-c r-42" case is handled by strtol() returning a
+ * negative number. */
+ is_negative = (*s == '-');
+ if (is_negative)
+ s++;
+
+ /* Allow any number of 'r's to prefix a revision number. */
+ while (*s == 'r')
+ s++;
+ changeno = changeno_end = strtol(s, &end, 10);
+ if (end != s && *end == '-')
+ {
+ if (changeno < 0 || is_negative)
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR,
+ NULL,
+ _("Negative number in range (%s)"
+ " not supported with -c"),
+ change_str);
+ }
+ s = end + 1;
+ while (*s == 'r')
+ s++;
+ changeno_end = strtol(s, &end, 10);
+ }
+ if (end == change_str || *end != '\0')
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Non-numeric change argument (%s) "
+ "given to -c"), change_str);
+ }
+
+ if (changeno == 0)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("There is no change 0"));
+ }
+
+ if (is_negative)
+ changeno = -changeno;
+
+ /* Figure out the range:
+ -c N -> -r N-1:N
+ -c -N -> -r N:N-1
+ -c M-N -> -r M-1:N for M < N
+ -c M-N -> -r M:N-1 for M > N
+ -c -M-N -> error (too confusing/no valid use case)
+ */
+ if (changeno > 0)
+ {
+ if (changeno <= changeno_end)
+ changeno--;
+ else
+ changeno_end--;
+ }
+ else
+ {
+ changeno = -changeno;
+ changeno_end = changeno - 1;
+ }
+
+ opt_state.used_change_arg = TRUE;
+ APR_ARRAY_PUSH(opt_state.revision_ranges,
+ svn_opt_revision_range_t *)
+ = svn_opt__revision_range_from_revnums(changeno, changeno_end,
+ pool);
+ }
+ }
+ break;
+ case 'r':
+ opt_state.used_revision_arg = TRUE;
+ if (svn_opt_parse_revision_to_range(opt_state.revision_ranges,
+ opt_arg, pool) != 0)
+ {
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ return svn_error_createf
+ (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Syntax error in revision argument '%s'"),
+ utf8_opt_arg);
+ }
+ break;
+ case 'v':
+ opt_state.verbose = TRUE;
+ break;
+ case 'h':
+ case '?':
+ opt_state.help = TRUE;
+ break;
+ case 'q':
+ opt_state.quiet = TRUE;
+ break;
+ case opt_targets:
+ {
+ svn_stringbuf_t *buffer, *buffer_utf8;
+
+ /* We need to convert to UTF-8 now, even before we divide
+ the targets into an array, because otherwise we wouldn't
+ know what delimiter to use for svn_cstring_split(). */
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&buffer, utf8_opt_arg, pool));
+ SVN_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool));
+ opt_state.targets = svn_cstring_split(buffer_utf8->data, "\n\r",
+ TRUE, pool);
+ }
+ break;
+ case 'R':
+ opt_state.depth = svn_depth_infinity;
+ break;
+ case 'N':
+ descend = FALSE;
+ break;
+ case opt_depth:
+ err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
+ if (err)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Error converting depth "
+ "from locale to UTF-8"));
+ opt_state.depth = svn_depth_from_word(utf8_opt_arg);
+ if (opt_state.depth == svn_depth_unknown
+ || opt_state.depth == svn_depth_exclude)
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a valid depth; try "
+ "'empty', 'files', 'immediates', "
+ "or 'infinity'"),
+ utf8_opt_arg);
+ }
+ break;
+ case opt_version:
+ opt_state.version = TRUE;
+ break;
+ case opt_auth_username:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_username,
+ opt_arg, pool));
+ break;
+ case opt_auth_password:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
+ opt_arg, pool));
+ break;
+ case opt_stop_on_copy:
+ opt_state.stop_on_copy = TRUE;
+ break;
+ case opt_strict:
+ opt_state.strict = TRUE;
+ break;
+ case opt_no_auth_cache:
+ opt_state.no_auth_cache = TRUE;
+ break;
+ case opt_non_interactive:
+ opt_state.non_interactive = TRUE;
+ break;
+ case opt_trust_server_cert: /* backwards compat to 1.8 */
+ opt_state.trust_server_cert_unknown_ca = TRUE;
+ break;
+ case opt_trust_server_cert_failures:
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &opt_state.trust_server_cert_unknown_ca,
+ &opt_state.trust_server_cert_cn_mismatch,
+ &opt_state.trust_server_cert_expired,
+ &opt_state.trust_server_cert_not_yet_valid,
+ &opt_state.trust_server_cert_other_failure,
+ utf8_opt_arg, pool));
+ break;
+ case opt_config_dir:
+ {
+ const char *path_utf8;
+ SVN_ERR(svn_utf_cstring_to_utf8(&path_utf8, opt_arg, pool));
+ opt_state.config_dir = svn_dirent_internal_style(path_utf8, pool);
+ }
+ break;
+ case opt_config_options:
+ if (!opt_state.config_options)
+ opt_state.config_options =
+ apr_array_make(pool, 1,
+ sizeof(svn_cmdline__config_argument_t*));
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options,
+ opt_arg, "svnbench: ", pool));
+ break;
+ case opt_with_all_revprops:
+ /* If --with-all-revprops is specified along with one or more
+ * --with-revprops options, --with-all-revprops takes precedence. */
+ opt_state.all_revprops = TRUE;
+ break;
+ case opt_with_no_revprops:
+ opt_state.no_revprops = TRUE;
+ break;
+ case opt_with_revprop:
+ SVN_ERR(svn_opt_parse_revprop(&opt_state.revprop_table,
+ opt_arg, pool));
+ break;
+ case 'g':
+ opt_state.use_merge_history = TRUE;
+ break;
+ default:
+ /* Hmmm. Perhaps this would be a good place to squirrel away
+ opts that commands like svn diff might need. Hmmm indeed. */
+ break;
+ }
+ }
+
+ /* ### This really belongs in libsvn_client. The trouble is,
+ there's no one place there to run it from, no
+ svn_client_init(). We'd have to add it to all the public
+ functions that a client might call. It's unmaintainable to do
+ initialization from within libsvn_client itself, but it seems
+ burdensome to demand that all clients call svn_client_init()
+ before calling any other libsvn_client function... On the other
+ hand, the alternative is effectively to demand that they call
+ svn_config_ensure() instead, so maybe we should have a generic
+ init function anyway. Thoughts? */
+ SVN_ERR(svn_config_ensure(opt_state.config_dir, pool));
+
+ /* If the user asked for help, then the rest of the arguments are
+ the names of subcommands to get help on (if any), or else they're
+ just typos/mistakes. Whatever the case, the subcommand to
+ actually run is svn_cl__help(). */
+ if (opt_state.help)
+ subcommand = svn_opt_get_canonical_subcommand2(svn_cl__cmd_table, "help");
+
+ /* If we're not running the `help' subcommand, then look for a
+ subcommand in the first argument. */
+ if (subcommand == NULL)
+ {
+ if (os->ind >= os->argc)
+ {
+ if (opt_state.version)
+ {
+ /* Use the "help" subcommand to handle the "--version" option. */
+ static const svn_opt_subcommand_desc2_t pseudo_cmd =
+ { "--version", svn_cl__help, {0}, "",
+ {opt_version, /* must accept its own option */
+ 'q', /* brief output */
+ 'v', /* verbose output */
+ opt_config_dir /* all commands accept this */
+ } };
+
+ subcommand = &pseudo_cmd;
+ }
+ else
+ {
+ svn_error_clear
+ (svn_cmdline_fprintf(stderr, pool,
+ _("Subcommand argument required\n")));
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+ else
+ {
+ const char *first_arg = os->argv[os->ind++];
+ subcommand = svn_opt_get_canonical_subcommand2(svn_cl__cmd_table,
+ first_arg);
+ if (subcommand == NULL)
+ {
+ const char *first_arg_utf8;
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
+ first_arg, pool));
+ svn_error_clear
+ (svn_cmdline_fprintf(stderr, pool,
+ _("Unknown subcommand: '%s'\n"),
+ first_arg_utf8));
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+ }
+
+ /* Check that the subcommand wasn't passed any inappropriate options. */
+ for (i = 0; i < received_opts->nelts; i++)
+ {
+ opt_id = APR_ARRAY_IDX(received_opts, i, int);
+
+ /* All commands implicitly accept --help, so just skip over this
+ when we see it. Note that we don't want to include this option
+ in their "accepted options" list because it would be awfully
+ redundant to display it in every commands' help text. */
+ if (opt_id == 'h' || opt_id == '?')
+ continue;
+
+ if (! svn_opt_subcommand_takes_option3(subcommand, opt_id,
+ svn_cl__global_options))
+ {
+ const char *optstr;
+ const apr_getopt_option_t *badopt =
+ svn_opt_get_option_from_code2(opt_id, svn_cl__options,
+ subcommand, pool);
+ svn_opt_format_option(&optstr, badopt, FALSE, pool);
+ if (subcommand->name[0] == '-')
+ SVN_ERR(svn_cl__help(NULL, NULL, pool));
+ else
+ svn_error_clear
+ (svn_cmdline_fprintf
+ (stderr, pool, _("Subcommand '%s' doesn't accept option '%s'\n"
+ "Type 'svnbench help %s' for usage.\n"),
+ subcommand->name, optstr, subcommand->name));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Only merge and log support multiple revisions/revision ranges. */
+ if (subcommand->cmd_func != svn_cl__null_log)
+ {
+ if (opt_state.revision_ranges->nelts > 1)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Multiple revision arguments "
+ "encountered; can't specify -c twice, "
+ "or both -c and -r"));
+ }
+ }
+
+ /* Disallow simultaneous use of both --with-all-revprops and
+ --with-no-revprops. */
+ if (opt_state.all_revprops && opt_state.no_revprops)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--with-all-revprops and --with-no-revprops "
+ "are mutually exclusive"));
+ }
+
+ /* Disallow simultaneous use of both --with-revprop and
+ --with-no-revprops. */
+ if (opt_state.revprop_table && opt_state.no_revprops)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--with-revprop and --with-no-revprops "
+ "are mutually exclusive"));
+ }
+
+ /* --trust-* options can only be used with --non-interactive */
+ if (!opt_state.non_interactive)
+ {
+ if (opt_state.trust_server_cert_unknown_ca
+ || opt_state.trust_server_cert_cn_mismatch
+ || opt_state.trust_server_cert_expired
+ || opt_state.trust_server_cert_not_yet_valid
+ || opt_state.trust_server_cert_other_failure)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--trust-server-cert-failures requires "
+ "--non-interactive"));
+ }
+
+ /* Ensure that 'revision_ranges' has at least one item, and make
+ 'start_revision' and 'end_revision' match that item. */
+ if (opt_state.revision_ranges->nelts == 0)
+ {
+ svn_opt_revision_range_t *range = apr_palloc(pool, sizeof(*range));
+ range->start.kind = svn_opt_revision_unspecified;
+ range->end.kind = svn_opt_revision_unspecified;
+ APR_ARRAY_PUSH(opt_state.revision_ranges,
+ svn_opt_revision_range_t *) = range;
+ }
+ opt_state.start_revision = APR_ARRAY_IDX(opt_state.revision_ranges, 0,
+ svn_opt_revision_range_t *)->start;
+ opt_state.end_revision = APR_ARRAY_IDX(opt_state.revision_ranges, 0,
+ svn_opt_revision_range_t *)->end;
+
+ /* Create a client context object. */
+ command_baton.opt_state = &opt_state;
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ command_baton.ctx = ctx;
+
+ /* Only a few commands can accept a revision range; the rest can take at
+ most one revision number. */
+ if (subcommand->cmd_func != svn_cl__null_blame
+ && subcommand->cmd_func != svn_cl__null_log)
+ {
+ if (opt_state.end_revision.kind != svn_opt_revision_unspecified)
+ {
+ return svn_error_create(SVN_ERR_CLIENT_REVISION_RANGE, NULL, NULL);
+ }
+ }
+
+ /* -N has a different meaning depending on the command */
+ if (!descend)
+ opt_state.depth = svn_depth_files;
+
+ err = svn_config_get_config(&(ctx->config),
+ opt_state.config_dir, pool);
+ if (err)
+ {
+ /* Fallback to default config if the config directory isn't readable
+ or is not a directory. */
+ if (APR_STATUS_IS_EACCES(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))
+ {
+ svn_handle_warning2(stderr, err, "svn: ");
+ svn_error_clear(err);
+ }
+ else
+ return err;
+ }
+
+ cfg_config = apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG,
+ APR_HASH_KEY_STRING);
+
+ /* Update the options in the config */
+ if (opt_state.config_options)
+ {
+ svn_error_clear(
+ svn_cmdline__apply_config_options(ctx->config,
+ opt_state.config_options,
+ "svn: ", "--config-option"));
+ }
+
+ /* Set up the notifier.
+
+ In general, we use it any time we aren't in --quiet mode. 'svn
+ status' is unique, though, in that we don't want it in --quiet mode
+ unless we're also in --verbose mode. When in --xml mode,
+ though, we never want it. */
+ if (opt_state.quiet)
+ use_notifier = FALSE;
+ if (use_notifier)
+ {
+ SVN_ERR(svn_cl__get_notifier(&ctx->notify_func2, &ctx->notify_baton2,
+ pool));
+ }
+
+ /* Set up our cancellation support. */
+ ctx->cancel_func = svn_cl__check_cancel;
+ apr_signal(SIGINT, signal_handler);
+#ifdef SIGBREAK
+ /* SIGBREAK is a Win32 specific signal generated by ctrl-break. */
+ apr_signal(SIGBREAK, signal_handler);
+#endif
+#ifdef SIGHUP
+ apr_signal(SIGHUP, signal_handler);
+#endif
+#ifdef SIGTERM
+ apr_signal(SIGTERM, signal_handler);
+#endif
+
+#ifdef SIGPIPE
+ /* Disable SIGPIPE generation for the platforms that have it. */
+ apr_signal(SIGPIPE, SIG_IGN);
+#endif
+
+#ifdef SIGXFSZ
+ /* Disable SIGXFSZ generation for the platforms that have it, otherwise
+ * working with large files when compiled against an APR that doesn't have
+ * large file support will crash the program, which is uncool. */
+ apr_signal(SIGXFSZ, SIG_IGN);
+#endif
+
+ /* Set up Authentication stuff. */
+ SVN_ERR(svn_cmdline_create_auth_baton2(
+ &ab,
+ opt_state.non_interactive,
+ opt_state.auth_username,
+ opt_state.auth_password,
+ opt_state.config_dir,
+ opt_state.no_auth_cache,
+ opt_state.trust_server_cert_unknown_ca,
+ opt_state.trust_server_cert_cn_mismatch,
+ opt_state.trust_server_cert_expired,
+ opt_state.trust_server_cert_not_yet_valid,
+ opt_state.trust_server_cert_other_failure,
+ cfg_config,
+ ctx->cancel_func,
+ ctx->cancel_baton,
+ pool));
+
+ ctx->auth_baton = ab;
+
+ /* The new svn behavior is to postpone everything until after the operation
+ completed */
+ ctx->conflict_func = NULL;
+ ctx->conflict_baton = NULL;
+ ctx->conflict_func2 = NULL;
+ ctx->conflict_baton2 = NULL;
+
+ /* And now we finally run the subcommand. */
+ err = (*subcommand->cmd_func)(os, &command_baton, pool);
+ if (err)
+ {
+ /* For argument-related problems, suggest using the 'help'
+ subcommand. */
+ if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS
+ || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR)
+ {
+ err = svn_error_quick_wrapf(
+ err, _("Try 'svnbench help %s' for more information"),
+ subcommand->name);
+ }
+ if (err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED)
+ {
+ err = svn_error_quick_wrap(err,
+ _("Please see the 'svn upgrade' command"));
+ }
+
+ /* Tell the user about 'svn cleanup' if any error on the stack
+ was about locked working copies. */
+ if (svn_error_find_cause(err, SVN_ERR_WC_LOCKED))
+ {
+ err = svn_error_quick_wrap(
+ err, _("Run 'svn cleanup' to remove locks "
+ "(type 'svn help cleanup' for details)"));
+ }
+
+ return err;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnbench", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnbench: ");
+ }
+
+ svn_pool_destroy(pool);
+ return exit_code;
+}
diff --git a/subversion/svnbench/util.c b/subversion/svnbench/util.c
new file mode 100644
index 0000000..2aedde6
--- /dev/null
+++ b/subversion/svnbench/util.c
@@ -0,0 +1,92 @@
+/*
+ * util.c: Subversion command line client utility functions. Any
+ * functions that need to be shared across subcommands should be put
+ * in here.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ==================================================================== */
+
+
+
+/*** Includes. ***/
+
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "svn_private_config.h"
+#include "svn_error.h"
+#include "svn_path.h"
+
+#include "cl.h"
+
+
+
+svn_error_t *
+svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets,
+ apr_getopt_t *os,
+ const apr_array_header_t *known_targets,
+ svn_client_ctx_t *ctx,
+ svn_boolean_t keep_last_origpath_on_truepath_collision,
+ apr_pool_t *pool)
+{
+ svn_error_t *err = svn_client_args_to_target_array2(targets,
+ os,
+ known_targets,
+ ctx,
+ keep_last_origpath_on_truepath_collision,
+ pool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_RESERVED_FILENAME_SPECIFIED)
+ {
+ svn_handle_error2(err, stderr, FALSE, "svn: Skipping argument: ");
+ svn_error_clear(err);
+ }
+ else
+ return svn_error_trace(err);
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_cl__check_target_is_local_path(const char *target)
+{
+ if (svn_path_is_url(target))
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is not a local path"), target);
+ return SVN_NO_ERROR;
+}
+
+const char *
+svn_cl__local_style_skip_ancestor(const char *parent_path,
+ const char *path,
+ apr_pool_t *pool)
+{
+ const char *relpath = NULL;
+
+ if (parent_path)
+ relpath = svn_dirent_skip_ancestor(parent_path, path);
+
+ return svn_dirent_local_style(relpath ? relpath : path, pool);
+}
+
diff --git a/subversion/svndumpfilter/svndumpfilter.c b/subversion/svndumpfilter/svndumpfilter.c
index 0e5bbc6..922482b 100644
--- a/subversion/svndumpfilter/svndumpfilter.c
+++ b/subversion/svndumpfilter/svndumpfilter.c
@@ -43,9 +43,10 @@
#include "svn_mergeinfo.h"
#include "svn_version.h"
+#include "private/svn_repos_private.h"
#include "private/svn_mergeinfo_private.h"
#include "private/svn_cmdline_private.h"
-#include "private/svn_subr_private.h"
+#include "private/svn_sorts_private.h"
#ifdef _WIN32
typedef apr_status_t (__stdcall *open_fn_t)(apr_file_t **, apr_pool_t *);
@@ -240,7 +241,6 @@ struct revision_baton_t
/* Does this revision have node or prop changes? */
svn_boolean_t has_nodes;
- svn_boolean_t has_props;
/* Did we drop any nodes? */
svn_boolean_t had_dropped_nodes;
@@ -253,7 +253,7 @@ struct revision_baton_t
svn_revnum_t rev_actual;
/* Pointers to dumpfile data. */
- svn_stringbuf_t *header;
+ apr_hash_t *original_headers;
apr_hash_t *props;
};
@@ -278,7 +278,7 @@ struct node_baton_t
svn_filesize_t tcl;
/* Pointers to dumpfile data. */
- svn_stringbuf_t *header;
+ svn_repos__dumpfile_headers_t *headers;
svn_stringbuf_t *props;
/* Expect deltas? */
@@ -287,6 +287,8 @@ struct node_baton_t
/* We might need the node path in a parse error message. */
char *node_path;
+
+ apr_pool_t *node_pool;
};
@@ -310,6 +312,24 @@ magic_header_record(int version, void *parse_baton, apr_pool_t *pool)
}
+/* Return a deep copy of a (char * -> char *) hash. */
+static apr_hash_t *
+headers_dup(apr_hash_t *headers,
+ apr_pool_t *pool)
+{
+ apr_hash_t *new_hash = apr_hash_make(pool);
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(pool, headers); hi; hi = apr_hash_next(hi))
+ {
+ const char *key = apr_hash_this_key(hi);
+ const char *val = apr_hash_this_val(hi);
+
+ svn_hash_sets(new_hash, apr_pstrdup(pool, key), apr_pstrdup(pool, val));
+ }
+ return new_hash;
+}
+
/* New revision: set up revision_baton, decide if we skip it. */
static svn_error_t *
new_revision_record(void **revision_baton,
@@ -318,21 +338,16 @@ new_revision_record(void **revision_baton,
apr_pool_t *pool)
{
struct revision_baton_t *rb;
- apr_hash_index_t *hi;
const char *rev_orig;
- svn_stream_t *header_stream;
*revision_baton = apr_palloc(pool, sizeof(struct revision_baton_t));
rb = *revision_baton;
rb->pb = parse_baton;
rb->has_nodes = FALSE;
- rb->has_props = FALSE;
rb->had_dropped_nodes = FALSE;
rb->writing_begun = FALSE;
- rb->header = svn_stringbuf_create_empty(pool);
rb->props = apr_hash_make(pool);
-
- header_stream = svn_stream_from_stringbuf(rb->header, pool);
+ rb->original_headers = headers_dup(headers, pool);
rev_orig = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_REVISION_NUMBER);
rb->rev_orig = SVN_STR_TO_REV(rev_orig);
@@ -342,28 +357,6 @@ new_revision_record(void **revision_baton,
else
rb->rev_actual = rb->rev_orig;
- SVN_ERR(svn_stream_printf(header_stream, pool,
- SVN_REPOS_DUMPFILE_REVISION_NUMBER ": %ld\n",
- rb->rev_actual));
-
- for (hi = apr_hash_first(pool, headers); hi; hi = apr_hash_next(hi))
- {
- const char *key = svn__apr_hash_index_key(hi);
- const char *val = svn__apr_hash_index_val(hi);
-
- if ((!strcmp(key, SVN_REPOS_DUMPFILE_CONTENT_LENGTH))
- || (!strcmp(key, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH))
- || (!strcmp(key, SVN_REPOS_DUMPFILE_REVISION_NUMBER)))
- continue;
-
- /* passthru: put header into header stringbuf. */
-
- SVN_ERR(svn_stream_printf(header_stream, pool, "%s: %s\n",
- key, val));
- }
-
- SVN_ERR(svn_stream_close(header_stream));
-
return SVN_NO_ERROR;
}
@@ -375,12 +368,8 @@ new_revision_record(void **revision_baton,
static svn_error_t *
output_revision(struct revision_baton_t *rb)
{
- int bytes_used;
- char buf[SVN_KEYLINE_MAXLEN];
- apr_hash_index_t *hi;
svn_boolean_t write_out_rev = FALSE;
apr_pool_t *hash_pool = apr_hash_pool_get(rb->props);
- svn_stringbuf_t *props = svn_stringbuf_create_empty(hash_pool);
apr_pool_t *subpool = svn_pool_create(hash_pool);
rb->writing_begun = TRUE;
@@ -398,7 +387,6 @@ output_revision(struct revision_baton_t *rb)
&& (! rb->pb->drop_all_empty_revs))
{
apr_hash_t *old_props = rb->props;
- rb->has_props = TRUE;
rb->props = apr_hash_make(hash_pool);
svn_hash_sets(rb->props, SVN_PROP_REVISION_DATE,
svn_hash_gets(old_props, SVN_PROP_REVISION_DATE));
@@ -407,39 +395,6 @@ output_revision(struct revision_baton_t *rb)
"padding."), hash_pool));
}
- /* Now, "rasterize" the props to a string, and append the property
- information to the header string. */
- if (rb->has_props)
- {
- for (hi = apr_hash_first(subpool, rb->props);
- hi;
- hi = apr_hash_next(hi))
- {
- const char *pname = svn__apr_hash_index_key(hi);
- const svn_string_t *pval = svn__apr_hash_index_val(hi);
-
- write_prop_to_stringbuf(props, pname, pval);
- }
- svn_stringbuf_appendcstr(props, "PROPS-END\n");
- svn_stringbuf_appendcstr(rb->header,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH);
- bytes_used = apr_snprintf(buf, sizeof(buf), ": %" APR_SIZE_T_FMT,
- props->len);
- svn_stringbuf_appendbytes(rb->header, buf, bytes_used);
- svn_stringbuf_appendbyte(rb->header, '\n');
- }
-
- svn_stringbuf_appendcstr(rb->header, SVN_REPOS_DUMPFILE_CONTENT_LENGTH);
- bytes_used = apr_snprintf(buf, sizeof(buf), ": %" APR_SIZE_T_FMT, props->len);
- svn_stringbuf_appendbytes(rb->header, buf, bytes_used);
- svn_stringbuf_appendbyte(rb->header, '\n');
-
- /* put an end to headers */
- svn_stringbuf_appendbyte(rb->header, '\n');
-
- /* put an end to revision */
- svn_stringbuf_appendbyte(props, '\n');
-
/* write out the revision */
/* Revision is written out in the following cases:
1. If the revision has nodes or
@@ -459,10 +414,12 @@ output_revision(struct revision_baton_t *rb)
if (write_out_rev)
{
/* This revision is a keeper. */
- SVN_ERR(svn_stream_write(rb->pb->out_stream,
- rb->header->data, &(rb->header->len)));
- SVN_ERR(svn_stream_write(rb->pb->out_stream,
- props->data, &(props->len)));
+ SVN_ERR(svn_repos__dump_revision_record(rb->pb->out_stream,
+ rb->rev_actual,
+ rb->original_headers,
+ rb->props,
+ FALSE /*props_section_always*/,
+ subpool));
/* Stash the oldest original rev not dropped. */
if (rb->rev_orig > 0
@@ -544,6 +501,7 @@ new_node_record(void **node_baton,
*node_baton = apr_palloc(pool, sizeof(struct node_baton_t));
nb = *node_baton;
nb->rb = rev_baton;
+ nb->node_pool = pool;
pb = nb->rb->pb;
node_path = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_NODE_PATH);
@@ -551,9 +509,9 @@ new_node_record(void **node_baton,
/* Ensure that paths start with a leading '/'. */
if (node_path[0] != '/')
- node_path = apr_pstrcat(pool, "/", node_path, (char *)NULL);
+ node_path = apr_pstrcat(pool, "/", node_path, SVN_VA_NULL);
if (copyfrom_path && copyfrom_path[0] != '/')
- copyfrom_path = apr_pstrcat(pool, "/", copyfrom_path, (char *)NULL);
+ copyfrom_path = apr_pstrcat(pool, "/", copyfrom_path, SVN_VA_NULL);
nb->do_skip = skip_path(node_path, pb->prefixes,
pb->do_exclude, pb->glob);
@@ -615,7 +573,7 @@ new_node_record(void **node_baton,
nb->has_text_delta = FALSE;
nb->writing_begun = FALSE;
nb->tcl = tcl ? svn__atoui64(tcl) : 0;
- nb->header = svn_stringbuf_create_empty(pool);
+ nb->headers = svn_repos__dumpfile_headers_create(pool);
nb->props = svn_stringbuf_create_empty(pool);
nb->node_path = apr_pstrdup(pool, node_path);
@@ -627,23 +585,20 @@ new_node_record(void **node_baton,
/* A node record is required to begin with 'Node-path', skip the
leading '/' to match the form used by 'svnadmin dump'. */
- SVN_ERR(svn_stream_printf(nb->rb->pb->out_stream,
- pool, "%s: %s\n",
- SVN_REPOS_DUMPFILE_NODE_PATH, node_path + 1));
+ svn_repos__dumpfile_header_push(
+ nb->headers, SVN_REPOS_DUMPFILE_NODE_PATH, node_path + 1);
/* Node-kind is next and is optional. */
kind = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_NODE_KIND);
if (kind)
- SVN_ERR(svn_stream_printf(nb->rb->pb->out_stream,
- pool, "%s: %s\n",
- SVN_REPOS_DUMPFILE_NODE_KIND, kind));
+ svn_repos__dumpfile_header_push(
+ nb->headers, SVN_REPOS_DUMPFILE_NODE_KIND, kind);
/* Node-action is next and required. */
action = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_NODE_ACTION);
if (action)
- SVN_ERR(svn_stream_printf(nb->rb->pb->out_stream,
- pool, "%s: %s\n",
- SVN_REPOS_DUMPFILE_NODE_ACTION, action));
+ svn_repos__dumpfile_header_push(
+ nb->headers, SVN_REPOS_DUMPFILE_NODE_ACTION, action);
else
return svn_error_createf(SVN_ERR_INCOMPLETE_DATA, 0,
_("Missing Node-action for path '%s'"),
@@ -651,8 +606,8 @@ new_node_record(void **node_baton,
for (hi = apr_hash_first(pool, headers); hi; hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- const char *val = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ const char *val = apr_hash_this_val(hi);
if ((!strcmp(key, SVN_REPOS_DUMPFILE_PROP_DELTA))
&& (!strcmp(val, "true")))
@@ -690,18 +645,14 @@ new_node_record(void **node_baton,
return svn_error_createf
(SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
_("No valid copyfrom revision in filtered stream"));
- SVN_ERR(svn_stream_printf
- (nb->rb->pb->out_stream, pool,
- SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV ": %ld\n",
- cf_renum_val->rev));
+ svn_repos__dumpfile_header_pushf(
+ nb->headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV,
+ "%ld", cf_renum_val->rev);
continue;
}
/* passthru: put header straight to output */
-
- SVN_ERR(svn_stream_printf(nb->rb->pb->out_stream,
- pool, "%s: %s\n",
- key, val));
+ svn_repos__dumpfile_header_push(nb->headers, key, val);
}
}
@@ -709,65 +660,6 @@ new_node_record(void **node_baton,
}
-/* Output node header and props to dumpstream
- This will be called by set_fulltext() after setting nb->has_text to TRUE,
- if the node has any text, or by close_node() otherwise. This must only
- be called if nb->writing_begun is FALSE. */
-static svn_error_t *
-output_node(struct node_baton_t *nb)
-{
- int bytes_used;
- char buf[SVN_KEYLINE_MAXLEN];
-
- nb->writing_begun = TRUE;
-
- /* when there are no props nb->props->len would be zero and won't mess up
- Content-Length. */
- if (nb->has_props)
- svn_stringbuf_appendcstr(nb->props, "PROPS-END\n");
-
- /* 1. recalculate & check text-md5 if present. Passed through right now. */
-
- /* 2. recalculate and add content-lengths */
-
- if (nb->has_props)
- {
- svn_stringbuf_appendcstr(nb->header,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH);
- bytes_used = apr_snprintf(buf, sizeof(buf), ": %" APR_SIZE_T_FMT,
- nb->props->len);
- svn_stringbuf_appendbytes(nb->header, buf, bytes_used);
- svn_stringbuf_appendbyte(nb->header, '\n');
- }
- if (nb->has_text)
- {
- svn_stringbuf_appendcstr(nb->header,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH);
- bytes_used = apr_snprintf(buf, sizeof(buf), ": %" SVN_FILESIZE_T_FMT,
- nb->tcl);
- svn_stringbuf_appendbytes(nb->header, buf, bytes_used);
- svn_stringbuf_appendbyte(nb->header, '\n');
- }
- svn_stringbuf_appendcstr(nb->header, SVN_REPOS_DUMPFILE_CONTENT_LENGTH);
- bytes_used = apr_snprintf(buf, sizeof(buf), ": %" SVN_FILESIZE_T_FMT,
- (svn_filesize_t) (nb->props->len + nb->tcl));
- svn_stringbuf_appendbytes(nb->header, buf, bytes_used);
- svn_stringbuf_appendbyte(nb->header, '\n');
-
- /* put an end to headers */
- svn_stringbuf_appendbyte(nb->header, '\n');
-
- /* 3. output all the stuff */
-
- SVN_ERR(svn_stream_write(nb->rb->pb->out_stream,
- nb->header->data , &(nb->header->len)));
- SVN_ERR(svn_stream_write(nb->rb->pb->out_stream,
- nb->props->data , &(nb->props->len)));
-
- return SVN_NO_ERROR;
-}
-
-
/* Examine the mergeinfo in INITIAL_VAL, omitting missing merge
sources or renumbering revisions in rangelists as appropriate, and
return the (possibly new) mergeinfo in *FINAL_VAL (allocated from
@@ -794,6 +686,13 @@ adjust_mergeinfo(svn_string_t **final_val, const svn_string_t *initial_val,
want filtered.
If the oldest rev is r0 then there is nothing to filter. */
+
+ /* ### This seems to cater only for use cases where the revisions being
+ processed are not following on from revisions that will already
+ exist in the destination repository. If the revisions being
+ processed do follow on, then we might want to keep the mergeinfo
+ that refers to those older revisions. */
+
if (rb->pb->skip_missing_merge_sources && rb->pb->oldest_original_rev > 0)
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
&mergeinfo, mergeinfo,
@@ -802,8 +701,8 @@ adjust_mergeinfo(svn_string_t **final_val, const svn_string_t *initial_val,
for (hi = apr_hash_first(subpool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *merge_source = svn__apr_hash_index_key(hi);
- svn_rangelist_t *rangelist = svn__apr_hash_index_val(hi);
+ const char *merge_source = apr_hash_this_key(hi);
+ svn_rangelist_t *rangelist = apr_hash_this_val(hi);
struct parse_baton_t *pb = rb->pb;
/* Determine whether the merge_source is a part of the prefix. */
@@ -867,7 +766,6 @@ set_revision_property(void *revision_baton,
struct revision_baton_t *rb = revision_baton;
apr_pool_t *hash_pool = apr_hash_pool_get(rb->props);
- rb->has_props = TRUE;
svn_hash_sets(rb->props,
apr_pstrdup(hash_pool, name),
svn_string_dup(value, hash_pool));
@@ -886,6 +784,9 @@ set_node_property(void *node_baton,
if (nb->do_skip)
return SVN_NO_ERROR;
+ /* Try to detect if a delta-mode property occurs unexpectedly. HAS_PROPS
+ can be false here only if the parser didn't call remove_node_props(),
+ so this may indicate a bug rather than bad data. */
if (! (nb->has_props || nb->has_prop_delta))
return svn_error_createf(SVN_ERR_STREAM_MALFORMED_DATA, NULL,
_("Delta property block detected, but deltas "
@@ -931,14 +832,17 @@ delete_node_property(void *node_baton, const char *name)
}
+/* The parser calls this method if the node record has a non-delta
+ * property content section, before any calls to set_node_property().
+ * If the node record uses property deltas, this is not called.
+ */
static svn_error_t *
remove_node_props(void *node_baton)
{
struct node_baton_t *nb = node_baton;
/* In this case, not actually indicating that the node *has* props,
- rather that we know about all the props that it has, since it now
- has none. */
+ rather that it has a property content section. */
nb->has_props = TRUE;
return SVN_NO_ERROR;
@@ -954,7 +858,20 @@ set_fulltext(svn_stream_t **stream, void *node_baton)
{
nb->has_text = TRUE;
if (! nb->writing_begun)
- SVN_ERR(output_node(nb));
+ {
+ nb->writing_begun = TRUE;
+ if (nb->has_props)
+ {
+ svn_stringbuf_appendcstr(nb->props, "PROPS-END\n");
+ }
+ SVN_ERR(svn_repos__dump_node_record(nb->rb->pb->out_stream,
+ nb->headers,
+ nb->has_props ? nb->props : NULL,
+ nb->has_text,
+ nb->tcl,
+ TRUE /*content_length_always*/,
+ nb->node_pool));
+ }
*stream = nb->rb->pb->out_stream;
}
@@ -975,7 +892,20 @@ close_node(void *node_baton)
/* If the node was not flushed already to output its text, do it now. */
if (! nb->writing_begun)
- SVN_ERR(output_node(nb));
+ {
+ nb->writing_begun = TRUE;
+ if (nb->has_props)
+ {
+ svn_stringbuf_appendcstr(nb->props, "PROPS-END\n");
+ }
+ SVN_ERR(svn_repos__dump_node_record(nb->rb->pb->out_stream,
+ nb->headers,
+ nb->has_props ? nb->props : NULL,
+ nb->has_text,
+ nb->tcl,
+ TRUE /*content_length_always*/,
+ nb->node_pool));
+ }
/* put an end to node. */
SVN_ERR(svn_stream_write(nb->rb->pb->out_stream, "\n\n", &len));
@@ -999,7 +929,7 @@ close_revision(void *revision_baton)
/* Filtering vtable */
-svn_repos_parse_fns3_t filtering_vtable =
+static svn_repos_parse_fns3_t filtering_vtable =
{
magic_header_record,
uuid_record,
@@ -1175,6 +1105,7 @@ subcommand_help(apr_getopt_t *os, void *baton, apr_pool_t *pool)
struct svndumpfilter_opt_state *opt_state = baton;
const char *header =
_("general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]\n"
+ "Subversion repository dump filtering tool.\n"
"Type 'svndumpfilter help <subcommand>' for help on a "
"specific subcommand.\n"
"Type 'svndumpfilter --version' to see the program version.\n"
@@ -1301,12 +1232,11 @@ do_filter(apr_getopt_t *os,
hi;
hi = apr_hash_next(hi))
{
- const svn_revnum_t *revnum = svn__apr_hash_index_key(hi);
+ const svn_revnum_t *revnum = apr_hash_this_key(hi);
APR_ARRAY_PUSH(keys, svn_revnum_t) = *revnum;
}
- qsort(keys->elts, keys->nelts,
- keys->elt_size, svn_sort_compare_revisions);
+ svn_sort__array(keys, svn_sort_compare_revisions);
for (i = 0; i < keys->nelts; i++)
{
svn_revnum_t this_key;
@@ -1345,11 +1275,11 @@ do_filter(apr_getopt_t *os,
hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
APR_ARRAY_PUSH(keys, const char *) = path;
}
- qsort(keys->elts, keys->nelts, keys->elt_size, svn_sort_compare_paths);
+ svn_sort__array(keys, svn_sort_compare_paths);
for (i = 0; i < keys->nelts; i++)
{
svn_pool_clear(subpool);
@@ -1383,12 +1313,16 @@ subcommand_include(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/** Main. **/
-int
-main(int argc, const char *argv[])
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_t *err;
apr_status_t apr_err;
- apr_pool_t *pool;
const svn_opt_subcommand_desc2_t *subcommand = NULL;
struct svndumpfilter_opt_state opt_state;
@@ -1397,33 +1331,19 @@ main(int argc, const char *argv[])
apr_array_header_t *received_opts;
int i;
-
- /* Initialize the app. */
- if (svn_cmdline_init("svndumpfilter", stderr) != EXIT_SUCCESS)
- return EXIT_FAILURE;
-
- /* Create our top-level pool. Use a separate mutexless allocator,
- * given this application is single threaded.
- */
- pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-
/* Check library versions */
- err = check_lib_versions();
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svndumpfilter: ");
+ SVN_ERR(check_lib_versions());
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
/* Initialize the FS library. */
- err = svn_fs_initialize(pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svndumpfilter: ");
+ SVN_ERR(svn_fs_initialize(pool));
if (argc <= 1)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Initialize opt_state. */
@@ -1432,9 +1352,7 @@ main(int argc, const char *argv[])
opt_state.end_revision.kind = svn_opt_revision_unspecified;
/* Parse options. */
- err = svn_cmdline__getopt_init(&os, argc, argv, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svndumpfilter: ");
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
while (1)
@@ -1447,9 +1365,9 @@ main(int argc, const char *argv[])
break;
else if (apr_err)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Stash the option code in an array before parsing it. */
@@ -1490,9 +1408,9 @@ main(int argc, const char *argv[])
break;
default:
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
} /* close `switch' */
} /* close `while' */
@@ -1501,10 +1419,10 @@ main(int argc, const char *argv[])
--drop-all-empty-revs. */
if (opt_state.drop_empty_revs && opt_state.drop_all_empty_revs)
{
- err = svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
- _("--drop-empty-revs cannot be used with "
- "--drop-all-empty-revs"));
- return svn_cmdline_handle_exit_error(err, pool, "svndumpfilter: ");
+ return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS,
+ NULL,
+ _("--drop-empty-revs cannot be used with "
+ "--drop-all-empty-revs"));
}
/* If the user asked for help, then the rest of the arguments are
@@ -1536,9 +1454,9 @@ main(int argc, const char *argv[])
svn_error_clear(svn_cmdline_fprintf
(stderr, pool,
_("Subcommand argument required\n")));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -1548,18 +1466,16 @@ main(int argc, const char *argv[])
if (subcommand == NULL)
{
const char* first_arg_utf8;
- if ((err = svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg,
- pool)))
- return svn_cmdline_handle_exit_error(err, pool,
- "svndumpfilter: ");
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg,
+ pool));
svn_error_clear(
svn_cmdline_fprintf(stderr, pool,
_("Unknown subcommand: '%s'\n"),
first_arg_utf8));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -1579,10 +1495,10 @@ main(int argc, const char *argv[])
/* Ensure that each prefix is UTF8-encoded, in internal
style, and absolute. */
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool));
prefix = svn_relpath__internal_style(prefix, pool);
if (prefix[0] != '/')
- prefix = apr_pstrcat(pool, "/", prefix, (char *)NULL);
+ prefix = apr_pstrcat(pool, "/", prefix, SVN_VA_NULL);
APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix;
}
@@ -1597,12 +1513,12 @@ main(int argc, const char *argv[])
the targets into an array, because otherwise we wouldn't
know what delimiter to use for svn_cstring_split(). */
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_targets_file,
- opt_state.targets_file, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_targets_file,
+ opt_state.targets_file, pool));
- SVN_INT_ERR(svn_stringbuf_from_file2(&buffer, utf8_targets_file,
- pool));
- SVN_INT_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&buffer, utf8_targets_file,
+ pool));
+ SVN_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool));
targets = apr_array_append(pool,
svn_cstring_split(buffer_utf8->data, "\n\r",
@@ -1613,7 +1529,7 @@ main(int argc, const char *argv[])
{
const char *prefix = APR_ARRAY_IDX(targets, i, const char *);
if (prefix[0] != '/')
- prefix = apr_pstrcat(pool, "/", prefix, (char *)NULL);
+ prefix = apr_pstrcat(pool, "/", prefix, SVN_VA_NULL);
APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix;
}
}
@@ -1623,8 +1539,8 @@ main(int argc, const char *argv[])
svn_error_clear(svn_cmdline_fprintf
(stderr, pool,
_("\nError: no prefixes supplied.\n")));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
@@ -1649,15 +1565,15 @@ main(int argc, const char *argv[])
pool);
svn_opt_format_option(&optstr, badopt, FALSE, pool);
if (subcommand->name[0] == '-')
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
else
svn_error_clear(svn_cmdline_fprintf
(stderr, pool,
_("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svndumpfilter help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
@@ -1674,14 +1590,40 @@ main(int argc, const char *argv[])
_("Try 'svndumpfilter help' for more "
"info"));
}
- return svn_cmdline_handle_exit_error(err, pool, "svndumpfilter: ");
+ return err;
}
- else
- {
- svn_pool_destroy(pool);
- /* Flush stdout, making sure the user will see any print errors. */
- SVN_INT_ERR(svn_cmdline_fflush(stdout));
- return EXIT_SUCCESS;
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svndumpfilter", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svndumpfilter: ");
}
+
+ svn_pool_destroy(pool);
+ return exit_code;
}
diff --git a/subversion/svnfsfs/dump-index-cmd.c b/subversion/svnfsfs/dump-index-cmd.c
new file mode 100644
index 0000000..5598c98
--- /dev/null
+++ b/subversion/svnfsfs/dump-index-cmd.c
@@ -0,0 +1,106 @@
+/* dump-index-cmd.c -- implements the dump-index sub-command.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#define APR_WANT_BYTEFUNC
+
+#include "svn_dirent_uri.h"
+#include "svn_pools.h"
+#include "private/svn_fs_fs_private.h"
+
+#include "svnfsfs.h"
+
+/* Return the 8 digit hex string for FNVV1, allocated in POOL.
+ */
+static const char *
+fnv1_to_string(apr_uint32_t fnv1,
+ apr_pool_t *pool)
+{
+ /* Construct a checksum object containing FNV1. */
+ svn_checksum_t checksum = { NULL, svn_checksum_fnv1a_32 };
+ apr_uint32_t digest = htonl(fnv1);
+ checksum.digest = (const unsigned char *)&digest;
+
+ /* Convert the digest to hex. */
+ return svn_checksum_to_cstring_display(&checksum, pool);
+}
+
+/* Map svn_fs_fs__p2l_entry_t.type to C string. */
+static const char *item_type_str[]
+ = {"none ", "frep ", "drep ", "fprop", "dprop", "node ", "chgs ", "rep "};
+
+/* Implements svn_fs_fs__dump_index_func_t as printing one table row
+ * containing the fields of ENTRY to the console.
+ */
+static svn_error_t *
+dump_index_entry(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *type_str
+ = entry->type < (sizeof(item_type_str) / sizeof(item_type_str[0]))
+ ? item_type_str[entry->type]
+ : "???";
+
+ printf("%12" APR_UINT64_T_HEX_FMT " %12" APR_UINT64_T_HEX_FMT
+ " %s %9ld %8" APR_UINT64_T_FMT " %s\n",
+ (apr_uint64_t)entry->offset, (apr_uint64_t)entry->size,
+ type_str, entry->item.revision, entry->item.number,
+ fnv1_to_string(entry->fnv1_checksum, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the repository at PATH beginning with revision START_REVISION and
+ * return the result in *FS. Allocate caches with MEMSIZE bytes total
+ * capacity. Use POOL for non-cache allocations.
+ */
+static svn_error_t *
+dump_index(const char *path,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+
+ /* Check repository type and open it. */
+ SVN_ERR(open_fs(&fs, path, pool));
+
+ /* Write header line. */
+ printf(" Start Length Type Revision Item Checksum\n");
+
+ /* Dump the whole index contents */
+ SVN_ERR(svn_fs_fs__dump_index(fs, revision, dump_index_entry, NULL,
+ check_cancel, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+subcommand__dump_index(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svnfsfs__opt_state *opt_state = baton;
+
+ SVN_ERR(dump_index(opt_state->repository_path,
+ opt_state->start_revision.value.number, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnfsfs/load-index-cmd.c b/subversion/svnfsfs/load-index-cmd.c
new file mode 100644
index 0000000..4df86bd
--- /dev/null
+++ b/subversion/svnfsfs/load-index-cmd.c
@@ -0,0 +1,193 @@
+/* load-index-cmd.c -- implements the dump-index sub-command.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_ctype.h"
+#include "svn_dirent_uri.h"
+#include "svn_io.h"
+#include "svn_pools.h"
+
+#include "private/svn_fs_fs_private.h"
+#include "private/svn_sorts_private.h"
+
+#include "svn_private_config.h"
+
+#include "svnfsfs.h"
+
+/* Map svn_fs_fs__p2l_entry_t.type to C string. */
+static const char *item_type_str[]
+ = {"none", "frep", "drep", "fprop", "dprop", "node", "chgs", "rep"};
+
+/* Reverse lookup in ITEM_TYPE_STR: Set *TYPE to the index that contains STR.
+ * Return an error for invalid strings. */
+static svn_error_t *
+str_to_item_type(unsigned *type,
+ const char *str)
+{
+ unsigned i;
+ for (i = 0; i < sizeof(item_type_str) / sizeof(item_type_str[0]); ++i)
+ if (strcmp(item_type_str[i], str) == 0)
+ {
+ *type = i;
+ return SVN_NO_ERROR;
+ }
+
+ return svn_error_createf(SVN_ERR_BAD_TOKEN, NULL,
+ _("Unknown item type '%s'"), str);
+}
+
+/* Parse the string given as const char * at IDX in TOKENS and return its
+ * value in *VALUE_P. Assume that the string an integer with base RADIX.
+ * Check for index overflows and non-hex chars.
+ */
+static svn_error_t *
+token_to_i64(apr_int64_t *value_p,
+ apr_array_header_t *tokens,
+ int idx,
+ int radix)
+{
+ const char *hex;
+ char *end;
+ apr_int64_t value;
+
+ /* Tell the user when there is not enough information. */
+ SVN_ERR_ASSERT(idx >= 0);
+ if (tokens->nelts <= idx)
+ return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL,
+ _("%i columns needed, %i provided"),
+ idx + 1, tokens->nelts);
+
+ /* hex -> int conversion */
+ hex = APR_ARRAY_IDX(tokens, idx, const char *);
+ value = apr_strtoi64(hex, &end, radix);
+
+ /* Has the whole token be parsed without error? */
+ if (errno || *end != '\0')
+ return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL,
+ _("%s is not a value HEX string"), hex);
+
+ *value_p = value;
+ return SVN_NO_ERROR;
+}
+
+/* Parse the P2L entry given as space separated values in LINE and return it
+ * in *ENTRY. Ignore extra columns. Allocate the result in RESULT_POOL and
+ * use SCRATCH_POOL for temporaries.
+ */
+static svn_error_t *
+parse_index_line(svn_fs_fs__p2l_entry_t **entry,
+ svn_stringbuf_t *line,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *tokens = svn_cstring_split(line->data, " ", TRUE,
+ scratch_pool);
+ svn_fs_fs__p2l_entry_t *result = apr_pcalloc(result_pool, sizeof(*result));
+ apr_int64_t value;
+
+ /* Parse the hex columns. */
+ SVN_ERR(token_to_i64(&value, tokens, 0, 16));
+ result->offset = (apr_off_t)value;
+ SVN_ERR(token_to_i64(&value, tokens, 1, 16));
+ result->size = (apr_off_t)value;
+
+ /* Parse the rightmost colum that we care of. */
+ SVN_ERR(token_to_i64(&value, tokens, 4, 10));
+ result->item.number = (apr_uint64_t)value;
+
+ /* We now know that there were at least 5 columns.
+ * Parse the non-hex columns without index check. */
+ SVN_ERR(str_to_item_type(&result->type,
+ APR_ARRAY_IDX(tokens, 2, const char *)));
+ SVN_ERR(svn_revnum_parse(&result->item.revision,
+ APR_ARRAY_IDX(tokens, 3, const char *), NULL));
+
+ *entry = result;
+ return SVN_NO_ERROR;
+}
+
+/* Parse the space separated P2L index table from INPUT, one entry per line.
+ * Rewrite the respective index files in PATH. Allocate from POOL. */
+static svn_error_t *
+load_index(const char *path,
+ svn_stream_t *input,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t revision = SVN_INVALID_REVNUM;
+ apr_array_header_t *entries = apr_array_make(pool, 16, sizeof(void*));
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Check repository type and open it. */
+ SVN_ERR(open_fs(&fs, path, pool));
+
+ while (TRUE)
+ {
+ svn_stringbuf_t *line;
+ svn_fs_fs__p2l_entry_t *entry;
+ svn_boolean_t eol;
+
+ /* Get the next line from the input and stop if there is none. */
+ svn_pool_clear(iterpool);
+ svn_stream_readline(input, &line, "\n", &eol, iterpool);
+ if (eol)
+ break;
+
+ /* Skip header line(s). They contain the sub-string [Ss]tart. */
+ if (strstr(line->data, "tart"))
+ continue;
+
+ /* Ignore empty lines (mostly trailing ones but we don't really care).
+ */
+ svn_stringbuf_strip_whitespace(line);
+ if (line->len == 0)
+ continue;
+
+ /* Parse the entry and append it to ENTRIES. */
+ SVN_ERR(parse_index_line(&entry, line, pool, iterpool));
+ APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t *) = entry;
+
+ /* There should be at least one item that is not empty.
+ * Get a revision from (probably inside) the respective shard. */
+ if ( revision == SVN_INVALID_REVNUM
+ && entry->item.revision != SVN_INVALID_REVNUM)
+ revision = entry->item.revision;
+ }
+
+ /* Rewrite the indexes. */
+ SVN_ERR(svn_fs_fs__load_index(fs, revision, entries, iterpool));
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+subcommand__load_index(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svnfsfs__opt_state *opt_state = baton;
+ svn_stream_t *input;
+
+ SVN_ERR(svn_stream_for_stdin(&input, pool));
+ SVN_ERR(load_index(opt_state->repository_path, input, pool));
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnfsfs/stats-cmd.c b/subversion/svnfsfs/stats-cmd.c
new file mode 100644
index 0000000..6e820cb
--- /dev/null
+++ b/subversion/svnfsfs/stats-cmd.c
@@ -0,0 +1,509 @@
+/* stats-cmd.c -- implements the size stats sub-command.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <assert.h>
+
+#include "svn_fs.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
+#include "private/svn_sorts_private.h"
+#include "private/svn_string_private.h"
+#include "private/svn_fs_fs_private.h"
+
+#include "svn_private_config.h"
+#include "svnfsfs.h"
+
+/* Return the string, allocated in RESULT_POOL, describing the value 2**I.
+ */
+static const char *
+print_two_power(int i,
+ apr_pool_t *result_pool)
+{
+ /* These are the SI prefixes for base-1000, the binary ones with base-1024
+ are too clumsy and require appending B for "byte" to be intelligible,
+ e.g. "MiB".
+
+ Therefore, we ignore the official standard and revert to the traditional
+ contextual use were the base-1000 prefixes are understood as base-1024
+ when it came to data sizes.
+ */
+ const char *si_prefixes = " kMGTPEZY";
+
+ int number = (i >= 0) ? (1 << (i % 10)) : 0;
+ int thousands = (i >= 0) ? (i / 10) : 0;
+
+ char si_prefix = (thousands < strlen(si_prefixes))
+ ? si_prefixes[thousands]
+ : '?';
+
+ if (si_prefix == ' ')
+ return apr_psprintf(result_pool, "%d", number);
+
+ return apr_psprintf(result_pool, "%d%c", number, si_prefix);
+}
+
+/* Print statistics for the given group of representations to console.
+ * Use POOL for allocations.
+ */
+static void
+print_rep_stats(svn_fs_fs__representation_stats_t *stats,
+ apr_pool_t *pool)
+{
+ printf(_("%20s bytes in %12s reps\n"
+ "%20s bytes in %12s shared reps\n"
+ "%20s bytes expanded size\n"
+ "%20s bytes expanded shared size\n"
+ "%20s bytes with rep-sharing off\n"
+ "%20s shared references\n"),
+ svn__ui64toa_sep(stats->total.packed_size, ',', pool),
+ svn__ui64toa_sep(stats->total.count, ',', pool),
+ svn__ui64toa_sep(stats->shared.packed_size, ',', pool),
+ svn__ui64toa_sep(stats->shared.count, ',', pool),
+ svn__ui64toa_sep(stats->total.expanded_size, ',', pool),
+ svn__ui64toa_sep(stats->shared.expanded_size, ',', pool),
+ svn__ui64toa_sep(stats->expanded_size, ',', pool),
+ svn__ui64toa_sep(stats->references - stats->total.count, ',', pool));
+}
+
+/* Print the (used) contents of CHANGES. Use POOL for allocations.
+ */
+static void
+print_largest_reps(svn_fs_fs__largest_changes_t *changes,
+ apr_pool_t *pool)
+{
+ apr_size_t i;
+ for (i = 0; i < changes->count && changes->changes[i]->size; ++i)
+ printf(_("%12s r%-8ld %s\n"),
+ svn__ui64toa_sep(changes->changes[i]->size, ',', pool),
+ changes->changes[i]->revision,
+ changes->changes[i]->path->data);
+}
+
+/* Print the non-zero section of HISTOGRAM to console.
+ * Use POOL for allocations.
+ */
+static void
+print_histogram(svn_fs_fs__histogram_t *histogram,
+ apr_pool_t *pool)
+{
+ int first = 0;
+ int last = 63;
+ int i;
+
+ /* identify non-zero range */
+ while (last > 0 && histogram->lines[last].count == 0)
+ --last;
+
+ while (first <= last && histogram->lines[first].count == 0)
+ ++first;
+
+ /* display histogram lines */
+ for (i = last; i >= first; --i)
+ printf(_(" %4s .. < %-4s %19s (%2d%%) bytes in %12s (%2d%%) items\n"),
+ print_two_power(i-1, pool), print_two_power(i, pool),
+ svn__ui64toa_sep(histogram->lines[i].sum, ',', pool),
+ (int)(histogram->lines[i].sum * 100 / histogram->total.sum),
+ svn__ui64toa_sep(histogram->lines[i].count, ',', pool),
+ (int)(histogram->lines[i].count * 100 / histogram->total.count));
+}
+
+/* COMPARISON_FUNC for svn_sort__hash.
+ * Sort extension_info_t values by total count in descending order.
+ */
+static int
+compare_count(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_fs__extension_info_t *lhs = a->value;
+ const svn_fs_fs__extension_info_t *rhs = b->value;
+ apr_int64_t diff = lhs->node_histogram.total.count
+ - rhs->node_histogram.total.count;
+
+ return diff > 0 ? -1 : (diff < 0 ? 1 : 0);
+}
+
+/* COMPARISON_FUNC for svn_sort__hash.
+ * Sort extension_info_t values by total uncompressed size in descending order.
+ */
+static int
+compare_node_size(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_fs__extension_info_t *lhs = a->value;
+ const svn_fs_fs__extension_info_t *rhs = b->value;
+ apr_int64_t diff = lhs->node_histogram.total.sum
+ - rhs->node_histogram.total.sum;
+
+ return diff > 0 ? -1 : (diff < 0 ? 1 : 0);
+}
+
+/* COMPARISON_FUNC for svn_sort__hash.
+ * Sort extension_info_t values by total prep count in descending order.
+ */
+static int
+compare_rep_size(const svn_sort__item_t *a,
+ const svn_sort__item_t *b)
+{
+ const svn_fs_fs__extension_info_t *lhs = a->value;
+ const svn_fs_fs__extension_info_t *rhs = b->value;
+ apr_int64_t diff = lhs->rep_histogram.total.sum
+ - rhs->rep_histogram.total.sum;
+
+ return diff > 0 ? -1 : (diff < 0 ? 1 : 0);
+}
+
+/* Return an array of extension_info_t* for the (up to) 16 most prominent
+ * extensions in STATS according to the sort criterion COMPARISON_FUNC.
+ * Allocate results in POOL.
+ */
+static apr_array_header_t *
+get_by_extensions(svn_fs_fs__stats_t *stats,
+ int (*comparison_func)(const svn_sort__item_t *,
+ const svn_sort__item_t *),
+ apr_pool_t *pool)
+{
+ /* sort all data by extension */
+ apr_array_header_t *sorted
+ = svn_sort__hash(stats->by_extension, comparison_func, pool);
+
+ /* select the top (first) 16 entries */
+ int count = MIN(sorted->nelts, 16);
+ apr_array_header_t *result
+ = apr_array_make(pool, count, sizeof(svn_fs_fs__extension_info_t*));
+ int i;
+
+ for (i = 0; i < count; ++i)
+ APR_ARRAY_PUSH(result, svn_fs_fs__extension_info_t*)
+ = APR_ARRAY_IDX(sorted, i, svn_sort__item_t).value;
+
+ return result;
+}
+
+/* Add all extension_info_t* entries of TO_ADD not already in TARGET to
+ * TARGET.
+ */
+static void
+merge_by_extension(apr_array_header_t *target,
+ apr_array_header_t *to_add)
+{
+ int i, k, count;
+
+ count = target->nelts;
+ for (i = 0; i < to_add->nelts; ++i)
+ {
+ svn_fs_fs__extension_info_t *info
+ = APR_ARRAY_IDX(to_add, i, svn_fs_fs__extension_info_t *);
+ for (k = 0; k < count; ++k)
+ if (info == APR_ARRAY_IDX(target, k, svn_fs_fs__extension_info_t *))
+ break;
+
+ if (k == count)
+ APR_ARRAY_PUSH(target, svn_fs_fs__extension_info_t*) = info;
+ }
+}
+
+/* Print the (up to) 16 extensions in STATS with the most changes.
+ * Use POOL for allocations.
+ */
+static void
+print_extensions_by_changes(svn_fs_fs__stats_t *stats,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *data = get_by_extensions(stats, compare_count, pool);
+ apr_int64_t sum = 0;
+ int i;
+
+ for (i = 0; i < data->nelts; ++i)
+ {
+ svn_fs_fs__extension_info_t *info
+ = APR_ARRAY_IDX(data, i, svn_fs_fs__extension_info_t *);
+
+ /* If there are elements, then their count cannot be 0. */
+ assert(stats->file_histogram.total.count);
+
+ sum += info->node_histogram.total.count;
+ printf(_("%11s %20s (%2d%%) representations\n"),
+ info->extension,
+ svn__ui64toa_sep(info->node_histogram.total.count, ',', pool),
+ (int)(info->node_histogram.total.count * 100 /
+ stats->file_histogram.total.count));
+ }
+
+ if (stats->file_histogram.total.count)
+ {
+ printf(_("%11s %20s (%2d%%) representations\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->file_histogram.total.count - sum, ',',
+ pool),
+ (int)((stats->file_histogram.total.count - sum) * 100 /
+ stats->file_histogram.total.count));
+ }
+}
+
+/* Calculate a percentage, handling edge cases. */
+static int
+get_percentage(apr_uint64_t part,
+ apr_uint64_t total)
+{
+ /* This include total == 0. */
+ if (part >= total)
+ return 100;
+
+ /* Standard case. */
+ return (int)(part * 100.0 / total);
+}
+
+/* Print the (up to) 16 extensions in STATS with the largest total size of
+ * changed file content. Use POOL for allocations.
+ */
+static void
+print_extensions_by_nodes(svn_fs_fs__stats_t *stats,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *data = get_by_extensions(stats, compare_node_size, pool);
+ apr_int64_t sum = 0;
+ int i;
+
+ for (i = 0; i < data->nelts; ++i)
+ {
+ svn_fs_fs__extension_info_t *info
+ = APR_ARRAY_IDX(data, i, svn_fs_fs__extension_info_t *);
+ sum += info->node_histogram.total.sum;
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ info->extension,
+ svn__ui64toa_sep(info->node_histogram.total.sum, ',', pool),
+ get_percentage(info->node_histogram.total.sum,
+ stats->file_histogram.total.sum));
+ }
+
+ if (stats->file_histogram.total.sum > sum)
+ {
+ /* Total sum can't be zero here. */
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->file_histogram.total.sum - sum, ',',
+ pool),
+ get_percentage(stats->file_histogram.total.sum - sum,
+ stats->file_histogram.total.sum));
+ }
+}
+
+/* Print the (up to) 16 extensions in STATS with the largest total size of
+ * changed file content. Use POOL for allocations.
+ */
+static void
+print_extensions_by_reps(svn_fs_fs__stats_t *stats,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *data = get_by_extensions(stats, compare_rep_size, pool);
+ apr_int64_t sum = 0;
+ int i;
+
+ for (i = 0; i < data->nelts; ++i)
+ {
+ svn_fs_fs__extension_info_t *info
+ = APR_ARRAY_IDX(data, i, svn_fs_fs__extension_info_t *);
+ sum += info->rep_histogram.total.sum;
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ info->extension,
+ svn__ui64toa_sep(info->rep_histogram.total.sum, ',', pool),
+ get_percentage(info->rep_histogram.total.sum,
+ stats->rep_size_histogram.total.sum));
+ }
+
+ if (stats->rep_size_histogram.total.sum > sum)
+ {
+ /* Total sum can't be zero here. */
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->rep_size_histogram.total.sum - sum, ',',
+ pool),
+ get_percentage(stats->rep_size_histogram.total.sum - sum,
+ stats->rep_size_histogram.total.sum));
+ }
+}
+
+/* Print per-extension histograms for the most frequent extensions in STATS.
+ * Use POOL for allocations. */
+static void
+print_histograms_by_extension(svn_fs_fs__stats_t *stats,
+ apr_pool_t *pool)
+{
+ apr_array_header_t *data = get_by_extensions(stats, compare_count, pool);
+ int i;
+
+ merge_by_extension(data, get_by_extensions(stats, compare_node_size, pool));
+ merge_by_extension(data, get_by_extensions(stats, compare_rep_size, pool));
+
+ for (i = 0; i < data->nelts; ++i)
+ {
+ svn_fs_fs__extension_info_t *info
+ = APR_ARRAY_IDX(data, i, svn_fs_fs__extension_info_t *);
+ printf("\nHistogram of '%s' file sizes:\n", info->extension);
+ print_histogram(&info->node_histogram, pool);
+ printf("\nHistogram of '%s' file representation sizes:\n",
+ info->extension);
+ print_histogram(&info->rep_histogram, pool);
+ }
+}
+
+/* Print the contents of STATS to the console.
+ * Use POOL for allocations.
+ */
+static void
+print_stats(svn_fs_fs__stats_t *stats,
+ apr_pool_t *pool)
+{
+ /* print results */
+ printf("\nGlobal statistics:\n");
+ printf(_("%20s bytes in %12s revisions\n"
+ "%20s bytes in %12s changes\n"
+ "%20s bytes in %12s node revision records\n"
+ "%20s bytes in %12s representations\n"
+ "%20s bytes expanded representation size\n"
+ "%20s bytes with rep-sharing off\n"),
+ svn__ui64toa_sep(stats->total_size, ',', pool),
+ svn__ui64toa_sep(stats->revision_count, ',', pool),
+ svn__ui64toa_sep(stats->change_len, ',', pool),
+ svn__ui64toa_sep(stats->change_count, ',', pool),
+ svn__ui64toa_sep(stats->total_node_stats.size, ',', pool),
+ svn__ui64toa_sep(stats->total_node_stats.count, ',', pool),
+ svn__ui64toa_sep(stats->total_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->total_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->total_rep_stats.total.expanded_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->total_rep_stats.expanded_size, ',', pool));
+
+ printf("\nNoderev statistics:\n");
+ printf(_("%20s bytes in %12s nodes total\n"
+ "%20s bytes in %12s directory noderevs\n"
+ "%20s bytes in %12s file noderevs\n"),
+ svn__ui64toa_sep(stats->total_node_stats.size, ',', pool),
+ svn__ui64toa_sep(stats->total_node_stats.count, ',', pool),
+ svn__ui64toa_sep(stats->dir_node_stats.size, ',', pool),
+ svn__ui64toa_sep(stats->dir_node_stats.count, ',', pool),
+ svn__ui64toa_sep(stats->file_node_stats.size, ',', pool),
+ svn__ui64toa_sep(stats->file_node_stats.count, ',', pool));
+
+ printf("\nRepresentation statistics:\n");
+ printf(_("%20s bytes in %12s representations total\n"
+ "%20s bytes in %12s directory representations\n"
+ "%20s bytes in %12s file representations\n"
+ "%20s bytes in %12s representations of added file nodes\n"
+ "%20s bytes in %12s directory property representations\n"
+ "%20s bytes in %12s file property representations\n"
+ "%20s bytes in header & footer overhead\n"),
+ svn__ui64toa_sep(stats->total_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->total_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->dir_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->dir_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->file_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->file_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->added_rep_size_histogram.total.sum, ',',
+ pool),
+ svn__ui64toa_sep(stats->added_rep_size_histogram.total.count, ',',
+ pool),
+ svn__ui64toa_sep(stats->dir_prop_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->dir_prop_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->file_prop_rep_stats.total.packed_size, ',',
+ pool),
+ svn__ui64toa_sep(stats->file_prop_rep_stats.total.count, ',', pool),
+ svn__ui64toa_sep(stats->total_rep_stats.total.overhead_size, ',',
+ pool));
+
+ printf("\nDirectory representation statistics:\n");
+ print_rep_stats(&stats->dir_rep_stats, pool);
+ printf("\nFile representation statistics:\n");
+ print_rep_stats(&stats->file_rep_stats, pool);
+ printf("\nDirectory property representation statistics:\n");
+ print_rep_stats(&stats->dir_prop_rep_stats, pool);
+ printf("\nFile property representation statistics:\n");
+ print_rep_stats(&stats->file_prop_rep_stats, pool);
+
+ printf("\nLargest representations:\n");
+ print_largest_reps(stats->largest_changes, pool);
+ printf("\nExtensions by number of representations:\n");
+ print_extensions_by_changes(stats, pool);
+ printf("\nExtensions by size of changed files:\n");
+ print_extensions_by_nodes(stats, pool);
+ printf("\nExtensions by size of representations:\n");
+ print_extensions_by_reps(stats, pool);
+
+ printf("\nHistogram of expanded node sizes:\n");
+ print_histogram(&stats->node_size_histogram, pool);
+ printf("\nHistogram of representation sizes:\n");
+ print_histogram(&stats->rep_size_histogram, pool);
+ printf("\nHistogram of file sizes:\n");
+ print_histogram(&stats->file_histogram, pool);
+ printf("\nHistogram of file representation sizes:\n");
+ print_histogram(&stats->file_rep_histogram, pool);
+ printf("\nHistogram of file property sizes:\n");
+ print_histogram(&stats->file_prop_histogram, pool);
+ printf("\nHistogram of file property representation sizes:\n");
+ print_histogram(&stats->file_prop_rep_histogram, pool);
+ printf("\nHistogram of directory sizes:\n");
+ print_histogram(&stats->dir_histogram, pool);
+ printf("\nHistogram of directory representation sizes:\n");
+ print_histogram(&stats->dir_rep_histogram, pool);
+ printf("\nHistogram of directory property sizes:\n");
+ print_histogram(&stats->dir_prop_histogram, pool);
+ printf("\nHistogram of directory property representation sizes:\n");
+ print_histogram(&stats->dir_prop_rep_histogram, pool);
+
+ print_histograms_by_extension(stats, pool);
+}
+
+/* Our progress function simply prints the REVISION number and makes it
+ * appear immediately.
+ */
+static void
+print_progress(svn_revnum_t revision,
+ void *baton,
+ apr_pool_t *pool)
+{
+ printf("%8ld", revision);
+ fflush(stdout);
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+subcommand__stats(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svnfsfs__opt_state *opt_state = baton;
+ svn_fs_fs__stats_t *stats;
+ svn_fs_t *fs;
+
+ printf("Reading revisions\n");
+ SVN_ERR(open_fs(&fs, opt_state->repository_path, pool));
+ SVN_ERR(svn_fs_fs__get_stats(&stats, fs, print_progress, NULL,
+ check_cancel, NULL, pool, pool));
+
+ print_stats(stats, pool);
+
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnfsfs/svnfsfs.c b/subversion/svnfsfs/svnfsfs.c
new file mode 100644
index 0000000..f8b1e4b
--- /dev/null
+++ b/subversion/svnfsfs/svnfsfs.c
@@ -0,0 +1,541 @@
+/*
+ * svnfsfs.c: FSFS repository manipulation tool main file.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <apr_signal.h>
+
+#include "svn_pools.h"
+#include "svn_cmdline.h"
+#include "svn_opt.h"
+#include "svn_utf.h"
+#include "svn_path.h"
+#include "svn_dirent_uri.h"
+#include "svn_repos.h"
+#include "svn_cache_config.h"
+#include "svn_version.h"
+
+#include "private/svn_cmdline_private.h"
+
+#include "svn_private_config.h"
+
+#include "svnfsfs.h"
+
+
+/*** Code. ***/
+
+/* A flag to see if we've been cancelled by the client or not. */
+static volatile sig_atomic_t cancelled = FALSE;
+
+/* A signal handler to support cancellation. */
+static void
+signal_handler(int signum)
+{
+ apr_signal(signum, SIG_IGN);
+ cancelled = TRUE;
+}
+
+
+/* A helper to set up the cancellation signal handlers. */
+static void
+setup_cancellation_signals(void (*handler)(int signum))
+{
+ apr_signal(SIGINT, handler);
+#ifdef SIGBREAK
+ /* SIGBREAK is a Win32 specific signal generated by ctrl-break. */
+ apr_signal(SIGBREAK, handler);
+#endif
+#ifdef SIGHUP
+ apr_signal(SIGHUP, handler);
+#endif
+#ifdef SIGTERM
+ apr_signal(SIGTERM, handler);
+#endif
+}
+
+
+svn_error_t *
+check_cancel(void *baton)
+{
+ if (cancelled)
+ return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Caught signal"));
+ else
+ return SVN_NO_ERROR;
+}
+
+
+/* Custom filesystem warning function. */
+static void
+warning_func(void *baton,
+ svn_error_t *err)
+{
+ if (! err)
+ return;
+ svn_handle_warning2(stderr, err, "svnfsfs: ");
+}
+
+
+/* Version compatibility check */
+static svn_error_t *
+check_lib_versions(void)
+{
+ static const svn_version_checklist_t checklist[] =
+ {
+ { "svn_subr", svn_subr_version },
+ { "svn_repos", svn_repos_version },
+ { "svn_fs", svn_fs_version },
+ { "svn_delta", svn_delta_version },
+ { NULL, NULL }
+ };
+ SVN_VERSION_DEFINE(my_version);
+
+ return svn_ver_check_list2(&my_version, checklist, svn_ver_equal);
+}
+
+
+
+/** Subcommands. **/
+
+enum svnfsfs__cmdline_options_t
+ {
+ svnfsfs__version = SVN_OPT_FIRST_LONGOPT_ID
+ };
+
+/* Option codes and descriptions.
+ *
+ * The entire list must be terminated with an entry of nulls.
+ */
+static const apr_getopt_option_t options_table[] =
+ {
+ {"help", 'h', 0,
+ N_("show help on a subcommand")},
+
+ {NULL, '?', 0,
+ N_("show help on a subcommand")},
+
+ {"version", svnfsfs__version, 0,
+ N_("show program version information")},
+
+ {"quiet", 'q', 0,
+ N_("no progress (only errors to stderr)")},
+
+ {"revision", 'r', 1,
+ N_("specify revision number ARG (or X:Y range)")},
+
+ {"memory-cache-size", 'M', 1,
+ N_("size of the extra in-memory cache in MB used to\n"
+ " minimize redundant operations. Default: 16.")},
+
+ {NULL}
+ };
+
+
+/* Array of available subcommands.
+ * The entire list must be terminated with an entry of nulls.
+ */
+static const svn_opt_subcommand_desc2_t cmd_table[] =
+{
+ {"help", subcommand__help, {"?", "h"}, N_
+ ("usage: svnfsfs help [SUBCOMMAND...]\n\n"
+ "Describe the usage of this program or its subcommands.\n"),
+ {0} },
+
+ {"dump-index", subcommand__dump_index, {0}, N_
+ ("usage: svnfsfs dump-index REPOS_PATH -r REV\n\n"
+ "Dump the index contents for the revision / pack file containing revision REV\n"
+ "to console. This is only available for FSFS format 7 (SVN 1.9+) repositories.\n"
+ "The table produced contains a header in the first line followed by one line\n"
+ "per index entry, ordered by location in the revision / pack file. Columns:\n\n"
+ " * Byte offset (hex) at which the item starts\n"
+ " * Length (hex) of the item in bytes\n"
+ " * Item type (string) is one of the following:\n\n"
+ " none ... Unused section. File contents shall be NULs.\n"
+ " frep ... File representation.\n"
+ " drep ... Directory representation.\n"
+ " fprop .. File property.\n"
+ " dprop .. Directory property.\n"
+ " node ... Node revision.\n"
+ " chgs ... Changed paths list.\n"
+ " rep .... Representation of unknown type. Should not be used.\n"
+ " ??? .... Invalid. Index data is corrupt.\n\n"
+ " The distinction between frep, drep, fprop and dprop is a mere internal\n"
+ " classification used for various optimizations and does not affect the\n"
+ " operational correctness.\n\n"
+ " * Revision that the item belongs to (decimal)\n"
+ " * Item number (decimal) within that revision\n"
+ " * Modified FNV1a checksum (8 hex digits)\n"),
+ {'r', 'M'} },
+
+ {"load-index", subcommand__load_index, {0}, N_
+ ("usage: svnfsfs load-index REPOS_PATH\n\n"
+ "Read index contents from console. The format is the same as produced by the\n"
+ "dump-index command, except that checksum as well as header are optional and will\n"
+ "be ignored. The data must cover the full revision / pack file; the revision\n"
+ "number is automatically extracted from input stream. No ordering is required.\n"),
+ {'M'} },
+
+ {"stats", subcommand__stats, {0}, N_
+ ("usage: svnfsfs stats REPOS_PATH\n\n"
+ "Write object size statistics to console.\n"),
+ {'M'} },
+
+ { NULL, NULL, {0}, NULL, {0} }
+};
+
+
+svn_error_t *
+open_fs(svn_fs_t **fs,
+ const char *path,
+ apr_pool_t *pool)
+{
+ const char *fs_type;
+
+ /* Verify that we can handle the repository type. */
+ path = svn_dirent_join(path, "db", pool);
+ SVN_ERR(svn_fs_type(&fs_type, path, pool));
+ if (strcmp(fs_type, SVN_FS_TYPE_FSFS))
+ return svn_error_createf(SVN_ERR_FS_UNSUPPORTED_TYPE, NULL,
+ _("%s repositories are not supported"),
+ fs_type);
+
+ /* Now open it. */
+ SVN_ERR(svn_fs_open2(fs, path, NULL, pool, pool));
+ svn_fs_set_warning_func(*fs, warning_func, NULL);
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+subcommand__help(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svnfsfs__opt_state *opt_state = baton;
+ const char *header =
+ _("general usage: svnfsfs SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+ "Subversion FSFS repository manipulation tool.\n"
+ "Type 'svnfsfs help <subcommand>' for help on a specific subcommand.\n"
+ "Type 'svnfsfs --version' to see the program version.\n"
+ "\n"
+ "Available subcommands:\n");
+
+ SVN_ERR(svn_opt_print_help4(os, "svnfsfs",
+ opt_state ? opt_state->version : FALSE,
+ opt_state ? opt_state->quiet : FALSE,
+ /*###opt_state ? opt_state->verbose :*/ FALSE,
+ NULL,
+ header, cmd_table, options_table, NULL, NULL,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+/** Main. **/
+
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
+{
+ svn_error_t *err;
+ apr_status_t apr_err;
+
+ const svn_opt_subcommand_desc2_t *subcommand = NULL;
+ svnfsfs__opt_state opt_state = { 0 };
+ apr_getopt_t *os;
+ int opt_id;
+ apr_array_header_t *received_opts;
+ int i;
+
+ received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+ /* Check library versions */
+ SVN_ERR(check_lib_versions());
+
+ /* Initialize the FS library. */
+ SVN_ERR(svn_fs_initialize(pool));
+
+ if (argc <= 1)
+ {
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Initialize opt_state. */
+ opt_state.start_revision.kind = svn_opt_revision_unspecified;
+ opt_state.end_revision.kind = svn_opt_revision_unspecified;
+ opt_state.memory_cache_size = svn_cache_config_get()->cache_size;
+
+ /* Parse options. */
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
+
+ os->interleave = 1;
+
+ while (1)
+ {
+ const char *opt_arg;
+ const char *utf8_opt_arg;
+
+ /* Parse the next option. */
+ apr_err = apr_getopt_long(os, options_table, &opt_id, &opt_arg);
+ if (APR_STATUS_IS_EOF(apr_err))
+ break;
+ else if (apr_err)
+ {
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+
+ /* Stash the option code in an array before parsing it. */
+ APR_ARRAY_PUSH(received_opts, int) = opt_id;
+
+ switch (opt_id) {
+ case 'r':
+ {
+ if (opt_state.start_revision.kind != svn_opt_revision_unspecified)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Multiple revision arguments encountered; "
+ "try '-r N:M' instead of '-r N -r M'"));
+ }
+ if (svn_opt_parse_revision(&(opt_state.start_revision),
+ &(opt_state.end_revision),
+ opt_arg, pool) != 0)
+ {
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Syntax error in revision argument '%s'"),
+ utf8_opt_arg);
+ }
+ }
+ break;
+ case 'q':
+ opt_state.quiet = TRUE;
+ break;
+ case 'h':
+ case '?':
+ opt_state.help = TRUE;
+ break;
+ case 'M':
+ opt_state.memory_cache_size
+ = 0x100000 * apr_strtoi64(opt_arg, NULL, 0);
+ break;
+ case svnfsfs__version:
+ opt_state.version = TRUE;
+ break;
+ default:
+ {
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ } /* close `switch' */
+ } /* close `while' */
+
+ /* If the user asked for help, then the rest of the arguments are
+ the names of subcommands to get help on (if any), or else they're
+ just typos/mistakes. Whatever the case, the subcommand to
+ actually run is subcommand_help(). */
+ if (opt_state.help)
+ subcommand = svn_opt_get_canonical_subcommand2(cmd_table, "help");
+
+ /* If we're not running the `help' subcommand, then look for a
+ subcommand in the first argument. */
+ if (subcommand == NULL)
+ {
+ if (os->ind >= os->argc)
+ {
+ if (opt_state.version)
+ {
+ /* Use the "help" subcommand to handle the "--version" option. */
+ static const svn_opt_subcommand_desc2_t pseudo_cmd =
+ { "--version", subcommand__help, {0}, "",
+ {svnfsfs__version, /* must accept its own option */
+ 'q', /* --quiet */
+ } };
+
+ subcommand = &pseudo_cmd;
+ }
+ else
+ {
+ svn_error_clear(svn_cmdline_fprintf(stderr, pool,
+ _("subcommand argument required\n")));
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+ else
+ {
+ const char *first_arg = os->argv[os->ind++];
+ subcommand = svn_opt_get_canonical_subcommand2(cmd_table, first_arg);
+ if (subcommand == NULL)
+ {
+ const char *first_arg_utf8;
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8,
+ first_arg, pool));
+ svn_error_clear(
+ svn_cmdline_fprintf(stderr, pool,
+ _("Unknown subcommand: '%s'\n"),
+ first_arg_utf8));
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+ }
+
+ /* Every subcommand except `help' requires a second argument -- the
+ repository path. Parse it out here and store it in opt_state. */
+ if (!(subcommand->cmd_func == subcommand__help))
+ {
+ const char *repos_path = NULL;
+
+ if (os->ind >= os->argc)
+ {
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Repository argument required"));
+ }
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&repos_path, os->argv[os->ind++], pool));
+
+ if (svn_path_is_url(repos_path))
+ {
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("'%s' is a URL when it should be a "
+ "local path"), repos_path);
+ }
+
+ opt_state.repository_path = svn_dirent_internal_style(repos_path, pool);
+ }
+
+ /* Check that the subcommand wasn't passed any inappropriate options. */
+ for (i = 0; i < received_opts->nelts; i++)
+ {
+ opt_id = APR_ARRAY_IDX(received_opts, i, int);
+
+ /* All commands implicitly accept --help, so just skip over this
+ when we see it. Note that we don't want to include this option
+ in their "accepted options" list because it would be awfully
+ redundant to display it in every commands' help text. */
+ if (opt_id == 'h' || opt_id == '?')
+ continue;
+
+ if (! svn_opt_subcommand_takes_option3(subcommand, opt_id, NULL))
+ {
+ const char *optstr;
+ const apr_getopt_option_t *badopt =
+ svn_opt_get_option_from_code2(opt_id, options_table, subcommand,
+ pool);
+ svn_opt_format_option(&optstr, badopt, FALSE, pool);
+ if (subcommand->name[0] == '-')
+ SVN_ERR(subcommand__help(NULL, NULL, pool));
+ else
+ svn_error_clear(svn_cmdline_fprintf(stderr, pool
+ , _("Subcommand '%s' doesn't accept option '%s'\n"
+ "Type 'svnfsfs help %s' for usage.\n"),
+ subcommand->name, optstr, subcommand->name));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
+ }
+
+ /* Set up our cancellation support. */
+ setup_cancellation_signals(signal_handler);
+
+#ifdef SIGPIPE
+ /* Disable SIGPIPE generation for the platforms that have it. */
+ apr_signal(SIGPIPE, SIG_IGN);
+#endif
+
+#ifdef SIGXFSZ
+ /* Disable SIGXFSZ generation for the platforms that have it, otherwise
+ * working with large files when compiled against an APR that doesn't have
+ * large file support will crash the program, which is uncool. */
+ apr_signal(SIGXFSZ, SIG_IGN);
+#endif
+
+ /* Configure FSFS caches for maximum efficiency with svnfsfs.
+ * Also, apply the respective command line parameters, if given. */
+ {
+ svn_cache_config_t settings = *svn_cache_config_get();
+
+ settings.cache_size = opt_state.memory_cache_size;
+ settings.single_threaded = TRUE;
+
+ svn_cache_config_set(&settings);
+ }
+
+ /* Run the subcommand. */
+ err = (*subcommand->cmd_func)(os, &opt_state, pool);
+ if (err)
+ {
+ /* For argument-related problems, suggest using the 'help'
+ subcommand. */
+ if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS
+ || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR)
+ {
+ err = svn_error_quick_wrap(err,
+ _("Try 'svnfsfs help' for more info"));
+ }
+ return err;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnfsfs", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnfsfs: ");
+ }
+
+ svn_pool_destroy(pool);
+ return exit_code;
+}
diff --git a/subversion/svnfsfs/svnfsfs.h b/subversion/svnfsfs/svnfsfs.h
new file mode 100644
index 0000000..132b2bc
--- /dev/null
+++ b/subversion/svnfsfs/svnfsfs.h
@@ -0,0 +1,73 @@
+/*
+ * svnfsfs.h: shared stuff in the command line program
+ *
+ * ====================================================================
+ * 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 SVNFSFS_H
+#define SVNFSFS_H
+
+/*** Includes. ***/
+
+#include "svn_opt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*** Command dispatch. ***/
+
+/* Baton for passing option/argument state to a subcommand function. */
+typedef struct svnfsfs__opt_state
+{
+ const char *repository_path;
+ svn_opt_revision_t start_revision, end_revision; /* -r X[:Y] */
+ svn_boolean_t help; /* --help or -? */
+ svn_boolean_t version; /* --version */
+ svn_boolean_t quiet; /* --quiet */
+ apr_uint64_t memory_cache_size; /* --memory-cache-size M */
+} svnfsfs__opt_state;
+
+/* Declare all the command procedures */
+svn_opt_subcommand_t
+ subcommand__help,
+ subcommand__dump_index,
+ subcommand__load_index,
+ subcommand__stats;
+
+
+/* Check that the filesystem at PATH is an FSFS repository and then open it.
+ * Return the filesystem in *FS, allocated in POOL. */
+svn_error_t *
+open_fs(svn_fs_t **fs,
+ const char *path,
+ apr_pool_t *pool);
+
+/* Our cancellation callback. */
+svn_error_t *
+check_cancel(void *baton);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVNFSFS_H */
diff --git a/subversion/svnlook/svnlook.c b/subversion/svnlook/svnlook.c
index 8162e41..53ff297 100644
--- a/subversion/svnlook/svnlook.c
+++ b/subversion/svnlook/svnlook.c
@@ -54,11 +54,11 @@
#include "svn_version.h"
#include "svn_xml.h"
-#include "private/svn_diff_private.h"
#include "private/svn_cmdline_private.h"
+#include "private/svn_diff_private.h"
#include "private/svn_fspath.h"
#include "private/svn_io_private.h"
-#include "private/svn_subr_private.h"
+#include "private/svn_sorts_private.h"
#include "svn_private_config.h"
@@ -102,7 +102,8 @@ enum
svnlook__ignore_properties,
svnlook__properties_only,
svnlook__diff_cmd,
- svnlook__show_inherited_props
+ svnlook__show_inherited_props,
+ svnlook__no_newline
};
/*
@@ -143,6 +144,9 @@ static const apr_getopt_option_t options_table[] =
{"properties-only", svnlook__properties_only, 0,
N_("show only properties during the operation")},
+ {"no-newline", svnlook__no_newline, 0,
+ N_("do not output the trailing newline")},
+
{"non-recursive", 'N', 0,
N_("operate on single directory only")},
@@ -187,6 +191,8 @@ static const apr_getopt_option_t options_table[] =
" "
" --ignore-eol-style: Ignore changes in EOL style\n"
" "
+ " -U ARG, --context ARG: Show ARG lines of context\n"
+ " "
" -p, --show-c-function: Show C function name")},
{"quiet", 'q', 0,
@@ -300,7 +306,7 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
{"youngest", subcommand_youngest, {0},
N_("usage: svnlook youngest REPOS_PATH\n\n"
"Print the youngest revision number.\n"),
- {0} },
+ {svnlook__no_newline} },
{ NULL, NULL, {0}, NULL, {0} }
};
@@ -333,6 +339,7 @@ struct svnlook_opt_state
svn_boolean_t properties_only; /* --properties-only */
const char *diff_cmd; /* --diff-cmd */
svn_boolean_t show_inherited_props; /* --show-inherited-props */
+ svn_boolean_t no_newline; /* --no-newline */
};
@@ -667,7 +674,8 @@ dump_contents(svn_stream_t *stream,
non-textual data -- in this case, the *IS_BINARY flag is set and no
temporary files are created.
- Use POOL for all that allocation goodness. */
+ TMPFILE1 and TMPFILE2 will be removed when RESULT_POOL is destroyed.
+ */
static svn_error_t *
prepare_tmpfiles(const char **tmpfile1,
const char **tmpfile2,
@@ -676,8 +684,8 @@ prepare_tmpfiles(const char **tmpfile1,
const char *path1,
svn_fs_root_t *root2,
const char *path2,
- const char *tmpdir,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_string_t *mimetype;
svn_stream_t *stream;
@@ -694,7 +702,7 @@ prepare_tmpfiles(const char **tmpfile1,
if (root1)
{
SVN_ERR(svn_fs_node_prop(&mimetype, root1, path1,
- SVN_PROP_MIME_TYPE, pool));
+ SVN_PROP_MIME_TYPE, scratch_pool));
if (mimetype && svn_mime_type_is_binary(mimetype->data))
{
*is_binary = TRUE;
@@ -704,7 +712,7 @@ prepare_tmpfiles(const char **tmpfile1,
if (root2)
{
SVN_ERR(svn_fs_node_prop(&mimetype, root2, path2,
- SVN_PROP_MIME_TYPE, pool));
+ SVN_PROP_MIME_TYPE, scratch_pool));
if (mimetype && svn_mime_type_is_binary(mimetype->data))
{
*is_binary = TRUE;
@@ -714,17 +722,15 @@ prepare_tmpfiles(const char **tmpfile1,
/* Now, prepare the two temporary files, each of which will either
be empty, or will have real contents. */
- SVN_ERR(svn_stream_open_unique(&stream, tmpfile1,
- tmpdir,
- svn_io_file_del_none,
- pool, pool));
- SVN_ERR(dump_contents(stream, root1, path1, pool));
-
- SVN_ERR(svn_stream_open_unique(&stream, tmpfile2,
- tmpdir,
- svn_io_file_del_none,
- pool, pool));
- SVN_ERR(dump_contents(stream, root2, path2, pool));
+ SVN_ERR(svn_stream_open_unique(&stream, tmpfile1, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(dump_contents(stream, root1, path1, scratch_pool));
+
+ SVN_ERR(svn_stream_open_unique(&stream, tmpfile2, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ result_pool, scratch_pool));
+ SVN_ERR(dump_contents(stream, root2, path2, scratch_pool));
return SVN_NO_ERROR;
}
@@ -804,7 +810,9 @@ display_prop_diffs(svn_stream_t *outstream,
SVN_ERR(svn_diff__display_prop_diffs(
outstream, encoding, propchanges, original_props,
- FALSE /* pretty_print_mergeinfo */, pool));
+ FALSE /* pretty_print_mergeinfo */,
+ -1 /* context_size */,
+ check_cancel, NULL, pool));
return SVN_NO_ERROR;
}
@@ -821,7 +829,6 @@ print_diff_tree(svn_stream_t *out_stream,
const char *path /* UTF-8! */,
const char *base_path /* UTF-8! */,
const svnlook_ctxt_t *c,
- const char *tmpdir,
apr_pool_t *pool)
{
const char *orig_path = NULL, *new_path = NULL;
@@ -830,7 +837,7 @@ print_diff_tree(svn_stream_t *out_stream,
svn_boolean_t is_copy = FALSE;
svn_boolean_t binary = FALSE;
svn_boolean_t diff_header_printed = FALSE;
- apr_pool_t *subpool;
+ apr_pool_t *iterpool;
svn_stringbuf_t *header;
SVN_ERR(check_cancel(NULL));
@@ -891,7 +898,7 @@ print_diff_tree(svn_stream_t *out_stream,
do_diff = TRUE;
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
base_root, base_path, root, path,
- tmpdir, pool));
+ pool, pool));
}
else if (c->diff_copy_from && node->action == 'A' && is_copy)
{
@@ -900,7 +907,7 @@ print_diff_tree(svn_stream_t *out_stream,
do_diff = TRUE;
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
base_root, base_path, root, path,
- tmpdir, pool));
+ pool, pool));
}
}
else if (! c->no_diff_added && node->action == 'A')
@@ -909,14 +916,14 @@ print_diff_tree(svn_stream_t *out_stream,
orig_empty = TRUE;
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
NULL, base_path, root, path,
- tmpdir, pool));
+ pool, pool));
}
else if (! c->no_diff_deleted && node->action == 'D')
{
do_diff = TRUE;
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
base_root, base_path, NULL, path,
- tmpdir, pool));
+ pool, pool));
}
/* The header for the copy case has already been created, and we don't
@@ -1058,11 +1065,12 @@ print_diff_tree(svn_stream_t *out_stream,
SVN_ERR(generate_label(&orig_label, base_root,
base_path, pool));
SVN_ERR(generate_label(&new_label, root, path, pool));
- SVN_ERR(svn_diff_file_output_unified3
- (out_stream, diff, orig_path, new_path,
+ SVN_ERR(svn_diff_file_output_unified4(
+ out_stream, diff, orig_path, new_path,
orig_label, new_label,
svn_cmdline_output_encoding(pool), NULL,
- opts->show_c_function, pool));
+ opts->show_c_function, opts->context_size,
+ check_cancel, NULL, pool));
SVN_ERR(svn_stream_printf_from_utf8(out_stream, encoding, pool,
"\n"));
diff_header_printed = TRUE;
@@ -1081,12 +1089,6 @@ print_diff_tree(svn_stream_t *out_stream,
}
}
- /* Make sure we delete any temporary files. */
- if (orig_path)
- SVN_ERR(svn_io_remove_file2(orig_path, FALSE, pool));
- if (new_path)
- SVN_ERR(svn_io_remove_file2(new_path, FALSE, pool));
-
/*** Now handle property diffs ***/
if ((node->prop_mod) && (node->action != 'D') && (! c->ignore_properties))
{
@@ -1133,26 +1135,21 @@ print_diff_tree(svn_stream_t *out_stream,
}
/* Return here if the node has no children. */
- node = node->child;
- if (! node)
+ if (! node->child)
return SVN_NO_ERROR;
/* Recursively handle the node's children. */
- subpool = svn_pool_create(pool);
- SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, node,
- svn_dirent_join(path, node->name, subpool),
- svn_dirent_join(base_path, node->name, subpool),
- c, tmpdir, subpool));
- while (node->sibling)
+ iterpool = svn_pool_create(pool);
+ for (node = node->child; node; node = node->sibling)
{
- svn_pool_clear(subpool);
- node = node->sibling;
+ svn_pool_clear(iterpool);
+
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, node,
- svn_dirent_join(path, node->name, subpool),
- svn_dirent_join(base_path, node->name, subpool),
- c, tmpdir, subpool));
+ svn_dirent_join(path, node->name, iterpool),
+ svn_dirent_join(base_path, node->name, iterpool),
+ c, iterpool));
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
@@ -1515,12 +1512,10 @@ do_diff(svnlook_ctxt_t *c, apr_pool_t *pool)
SVN_ERR(generate_delta_tree(&tree, c->repos, root, base_rev_id, pool));
if (tree)
{
- const char *tmpdir;
svn_stream_t *out_stream;
const char *encoding = svn_cmdline_output_encoding(pool);
SVN_ERR(svn_fs_revision_root(&base_root, c->fs, base_rev_id, pool));
- SVN_ERR(svn_io_temp_dir(&tmpdir, pool));
/* This fflush() might seem odd, but it was added to deal
with this bug report:
@@ -1549,7 +1544,7 @@ do_diff(svnlook_ctxt_t *c, apr_pool_t *pool)
SVN_ERR(svn_stream_for_stdout(&out_stream, pool));
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, tree,
- "", "", c, tmpdir, pool));
+ "", "", c, pool));
}
return SVN_NO_ERROR;
}
@@ -1599,7 +1594,7 @@ print_history(void *baton,
{
phb->count++;
if (phb->count >= phb->limit)
- /* Not L10N'd, since this error is supressed by the caller. */
+ /* Not L10N'd, since this error is suppressed by the caller. */
return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL,
_("History item limit reached"));
}
@@ -1696,9 +1691,14 @@ do_pget(svnlook_ctxt_t *c,
if (path == NULL)
{
/* We're operating on a revprop (e.g. c->is_revision). */
- err_msg = apr_psprintf(pool,
- _("Property '%s' not found on revision %ld"),
- propname, c->rev_id);
+ if (SVN_IS_VALID_REVNUM(c->rev_id))
+ err_msg = apr_psprintf(pool,
+ _("Property '%s' not found on revision %ld"),
+ propname, c->rev_id);
+ else
+ err_msg = apr_psprintf(pool,
+ _("Property '%s' not found on transaction %s"),
+ propname, c->txn_name);
}
else
{
@@ -1761,8 +1761,7 @@ do_pget(svnlook_ctxt_t *c,
else
{
svn_string_t *propval =
- svn__apr_hash_index_val(apr_hash_first(pool,
- elt->prop_hash));
+ apr_hash_this_val(apr_hash_first(pool, elt->prop_hash));
SVN_ERR(svn_stream_printf(
stdout_stream, pool, "%s - ",
@@ -1877,7 +1876,8 @@ do_plist(svnlook_ctxt_t *c,
svn_xml_make_header2(&sb, "UTF-8", pool);
/* "<properties>" */
- svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "properties", NULL);
+ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "properties",
+ SVN_VA_NULL);
}
if (inherited_props)
@@ -1896,7 +1896,7 @@ do_plist(svnlook_ctxt_t *c,
svn_xml_make_open_tag(
&sb, pool, svn_xml_normal, "target", "path",
svn_fspath__canonicalize(elt->path_or_url, pool),
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_cmdline__print_xml_prop_hash(&sb, elt->prop_hash,
!verbose, TRUE,
pool));
@@ -1923,19 +1923,19 @@ do_plist(svnlook_ctxt_t *c,
char *revstr = apr_psprintf(pool, "%ld", c->rev_id);
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "revprops",
- "rev", revstr, NULL);
+ "rev", revstr, SVN_VA_NULL);
}
else
{
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "revprops",
- "txn", c->txn_name, NULL);
+ "txn", c->txn_name, SVN_VA_NULL);
}
}
else
{
/* "<target ...>" */
svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "target",
- "path", path, NULL);
+ "path", path, SVN_VA_NULL);
}
}
@@ -1944,8 +1944,8 @@ do_plist(svnlook_ctxt_t *c,
for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
{
- const char *pname = svn__apr_hash_index_key(hi);
- svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *pname = apr_hash_this_key(hi);
+ svn_string_t *propval = apr_hash_this_val(hi);
SVN_ERR(check_cancel(NULL));
@@ -1982,7 +1982,7 @@ do_plist(svnlook_ctxt_t *c,
}
else if (xml)
svn_xml_make_open_tag(&sb, pool, svn_xml_self_closing, "property",
- "name", pname, NULL);
+ "name", pname, SVN_VA_NULL);
else
printf(" %s\n", pname);
}
@@ -2003,10 +2003,11 @@ do_plist(svnlook_ctxt_t *c,
/* "</properties>" */
svn_xml_make_close_tag(&sb, pool, "properties");
+ errno = 0;
if (fputs(sb->data, stdout) == EOF)
{
- if (errno)
- return svn_error_wrap_apr(errno, _("Write error"));
+ if (apr_get_os_error()) /* is errno on POSIX */
+ return svn_error_wrap_apr(apr_get_os_error(), _("Write error"));
else
return svn_error_create(SVN_ERR_IO_WRITE_ERROR, NULL, NULL);
}
@@ -2074,8 +2075,8 @@ get_ctxt_baton(svnlook_ctxt_t **baton_p,
{
svnlook_ctxt_t *baton = apr_pcalloc(pool, sizeof(*baton));
- SVN_ERR(svn_repos_open2(&(baton->repos), opt_state->repos_path, NULL,
- pool));
+ SVN_ERR(svn_repos_open3(&(baton->repos), opt_state->repos_path, NULL,
+ pool, pool));
baton->fs = svn_repos_fs(baton->repos);
svn_fs_set_warning_func(baton->fs, warning_func, NULL);
baton->show_ids = opt_state->show_ids;
@@ -2214,11 +2215,12 @@ subcommand_help(apr_getopt_t *os, void *baton, apr_pool_t *pool)
struct svnlook_opt_state *opt_state = baton;
const char *header =
_("general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]\n"
+ "Subversion repository inspection tool.\n"
+ "Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
+ "Type 'svnlook --version' to see the program version and FS modules.\n"
"Note: any subcommand which takes the '--revision' and '--transaction'\n"
" options will, if invoked without one of those options, act on\n"
" the repository's youngest revision.\n"
- "Type 'svnlook help <subcommand>' for help on a specific subcommand.\n"
- "Type 'svnlook --version' to see the program version and FS modules.\n"
"\n"
"Available subcommands:\n");
@@ -2409,7 +2411,8 @@ subcommand_youngest(apr_getopt_t *os, void *baton, apr_pool_t *pool)
SVN_ERR(check_number_of_args(opt_state, 0));
SVN_ERR(get_ctxt_baton(&c, opt_state, pool));
- SVN_ERR(svn_cmdline_printf(pool, "%ld\n", c->rev_id));
+ SVN_ERR(svn_cmdline_printf(pool, "%ld%s", c->rev_id,
+ opt_state->no_newline ? "" : "\n"));
return SVN_NO_ERROR;
}
@@ -2433,12 +2436,16 @@ subcommand_uuid(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/*** Main. ***/
-int
-main(int argc, const char *argv[])
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_t *err;
apr_status_t apr_err;
- apr_pool_t *pool;
const svn_opt_subcommand_desc2_t *subcommand = NULL;
struct svnlook_opt_state opt_state;
@@ -2447,32 +2454,19 @@ main(int argc, const char *argv[])
apr_array_header_t *received_opts;
int i;
- /* Initialize the app. */
- if (svn_cmdline_init("svnlook", stderr) != EXIT_SUCCESS)
- return EXIT_FAILURE;
-
- /* Create our top-level pool. Use a separate mutexless allocator,
- * given this application is single threaded.
- */
- pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-
received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
/* Check library versions */
- err = check_lib_versions();
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ SVN_ERR(check_lib_versions());
/* Initialize the FS library. */
- err = svn_fs_initialize(pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ SVN_ERR(svn_fs_initialize(pool));
if (argc <= 1)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Initialize opt_state. */
@@ -2480,9 +2474,7 @@ main(int argc, const char *argv[])
opt_state.rev = SVN_INVALID_REVNUM;
/* Parse options. */
- err = svn_cmdline__getopt_init(&os, argc, argv, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
while (1)
@@ -2495,9 +2487,9 @@ main(int argc, const char *argv[])
break;
else if (apr_err)
{
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Stash the option code in an array before parsing it. */
@@ -2512,9 +2504,8 @@ main(int argc, const char *argv[])
if ((! SVN_IS_VALID_REVNUM(opt_state.rev))
|| (! digits_end)
|| *digits_end)
- SVN_INT_ERR(svn_error_create
- (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Invalid revision number supplied")));
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Invalid revision number supplied"));
}
break;
@@ -2561,15 +2552,13 @@ main(int argc, const char *argv[])
opt_state.limit = strtol(opt_arg, &end, 10);
if (end == opt_arg || *end != '\0')
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Non-numeric limit argument given"));
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Non-numeric limit argument given"));
}
if (opt_state.limit <= 0)
{
- err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Argument to --limit must be positive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
}
}
break;
@@ -2614,27 +2603,31 @@ main(int argc, const char *argv[])
opt_state.show_inherited_props = TRUE;
break;
+ case svnlook__no_newline:
+ opt_state.no_newline = TRUE;
+ break;
+
default:
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
/* The --transaction and --revision options may not co-exist. */
if ((opt_state.rev != SVN_INVALID_REVNUM) && opt_state.txn)
- SVN_INT_ERR(svn_error_create
+ return svn_error_create
(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("The '--transaction' (-t) and '--revision' (-r) arguments "
- "cannot co-exist")));
+ "cannot co-exist"));
/* The --show-inherited-props and --revprop options may not co-exist. */
if (opt_state.show_inherited_props && opt_state.revprop)
- SVN_INT_ERR(svn_error_create
+ return svn_error_create
(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
_("Cannot use the '--show-inherited-props' option with the "
- "'--revprop' option")));
+ "'--revprop' option"));
/* If the user asked for help, then the rest of the arguments are
the names of subcommands to get help on (if any), or else they're
@@ -2665,9 +2658,9 @@ main(int argc, const char *argv[])
svn_error_clear
(svn_cmdline_fprintf(stderr, pool,
_("Subcommand argument required\n")));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -2677,15 +2670,13 @@ main(int argc, const char *argv[])
if (subcommand == NULL)
{
const char *first_arg_utf8;
- err = svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg,
- pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg,
+ pool));
svn_error_clear(
svn_cmdline_fprintf(stderr, pool,
_("Unknown subcommand: '%s'\n"),
first_arg_utf8));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
/* Be kind to people who try 'svnlook verify'. */
if (strcmp(first_arg_utf8, "verify") == 0)
@@ -2695,9 +2686,8 @@ main(int argc, const char *argv[])
_("Try 'svnadmin verify' instead.\n")));
}
-
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -2716,9 +2706,9 @@ main(int argc, const char *argv[])
/* Get the repository. */
if (os->ind < os->argc)
{
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&repos_path,
- os->argv[os->ind++],
- pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&repos_path,
+ os->argv[os->ind++],
+ pool));
repos_path = svn_dirent_internal_style(repos_path, pool);
}
@@ -2727,9 +2717,9 @@ main(int argc, const char *argv[])
svn_error_clear
(svn_cmdline_fprintf(stderr, pool,
_("Repository argument required\n")));
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
else if (svn_path_is_url(repos_path))
{
@@ -2737,8 +2727,8 @@ main(int argc, const char *argv[])
(svn_cmdline_fprintf(stderr, pool,
_("'%s' is a URL when it should be a path\n"),
repos_path));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
opt_state.repos_path = repos_path;
@@ -2746,8 +2736,7 @@ main(int argc, const char *argv[])
/* Get next arg (arg1), if any. */
if (os->ind < os->argc)
{
- SVN_INT_ERR(svn_utf_cstring_to_utf8
- (&arg1, os->argv[os->ind++], pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&arg1, os->argv[os->ind++], pool));
arg1 = svn_dirent_internal_style(arg1, pool);
}
opt_state.arg1 = arg1;
@@ -2755,8 +2744,7 @@ main(int argc, const char *argv[])
/* Get next arg (arg2), if any. */
if (os->ind < os->argc)
{
- SVN_INT_ERR(svn_utf_cstring_to_utf8
- (&arg2, os->argv[os->ind++], pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&arg2, os->argv[os->ind++], pool));
arg2 = svn_dirent_internal_style(arg2, pool);
}
opt_state.arg2 = arg2;
@@ -2782,7 +2770,7 @@ main(int argc, const char *argv[])
pool);
svn_opt_format_option(&optstr, badopt, FALSE, pool);
if (subcommand->name[0] == '-')
- SVN_INT_ERR(subcommand_help(NULL, NULL, pool));
+ SVN_ERR(subcommand_help(NULL, NULL, pool));
else
svn_error_clear
(svn_cmdline_fprintf
@@ -2790,8 +2778,8 @@ main(int argc, const char *argv[])
_("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnlook help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
@@ -2832,14 +2820,40 @@ main(int argc, const char *argv[])
err = svn_error_quick_wrap(err,
_("Try 'svnlook help' for more info"));
}
- return svn_cmdline_handle_exit_error(err, pool, "svnlook: ");
+ return err;
}
- else
+
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnlook", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
{
- svn_pool_destroy(pool);
- /* Ensure everything is printed on stdout, so the user sees any
- print errors. */
- SVN_INT_ERR(svn_cmdline_fflush(stdout));
- return EXIT_SUCCESS;
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnlook: ");
}
+
+ svn_pool_destroy(pool);
+ return exit_code;
}
diff --git a/subversion/svnmucc/svnmucc.c b/subversion/svnmucc/svnmucc.c
index d53f18f..1d2be38 100644
--- a/subversion/svnmucc/svnmucc.c
+++ b/subversion/svnmucc/svnmucc.c
@@ -40,96 +40,40 @@
#include <apr_lib.h>
+#include "svn_private_config.h"
#include "svn_hash.h"
#include "svn_client.h"
+#include "private/svn_client_mtcc.h"
#include "svn_cmdline.h"
#include "svn_config.h"
#include "svn_error.h"
#include "svn_path.h"
#include "svn_pools.h"
#include "svn_props.h"
-#include "svn_ra.h"
#include "svn_string.h"
#include "svn_subst.h"
#include "svn_utf.h"
#include "svn_version.h"
#include "private/svn_cmdline_private.h"
-#include "private/svn_ra_private.h"
-#include "private/svn_string_private.h"
#include "private/svn_subr_private.h"
-#include "svn_private_config.h"
-
-static void handle_error(svn_error_t *err, apr_pool_t *pool)
-{
- if (err)
- svn_handle_error2(err, stderr, FALSE, "svnmucc: ");
- svn_error_clear(err);
- if (pool)
- svn_pool_destroy(pool);
- exit(EXIT_FAILURE);
-}
-
-static apr_pool_t *
-init(const char *application)
-{
- svn_error_t *err;
- const svn_version_checklist_t checklist[] = {
- {"svn_client", svn_client_version},
- {"svn_subr", svn_subr_version},
- {"svn_ra", svn_ra_version},
- {NULL, NULL}
- };
- SVN_VERSION_DEFINE(my_version);
-
- if (svn_cmdline_init(application, stderr))
- exit(EXIT_FAILURE);
-
- err = svn_ver_check_list2(&my_version, checklist, svn_ver_equal);
- if (err)
- handle_error(err, NULL);
-
- return apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-}
-
+/* Version compatibility check */
static svn_error_t *
-open_tmp_file(apr_file_t **fp,
- void *callback_baton,
- apr_pool_t *pool)
+check_lib_versions(void)
{
- /* Open a unique file; use APR_DELONCLOSE. */
- return svn_io_open_unique_file3(fp, NULL, NULL, svn_io_file_del_on_close,
- pool, pool);
-}
-
-static svn_error_t *
-create_ra_callbacks(svn_ra_callbacks2_t **callbacks,
- const char *username,
- const char *password,
- const char *config_dir,
- svn_config_t *cfg_config,
- svn_boolean_t non_interactive,
- svn_boolean_t trust_server_cert,
- svn_boolean_t no_auth_cache,
- apr_pool_t *pool)
-{
- SVN_ERR(svn_ra_create_callbacks(callbacks, pool));
-
- SVN_ERR(svn_cmdline_create_auth_baton(&(*callbacks)->auth_baton,
- non_interactive,
- username, password, config_dir,
- no_auth_cache,
- trust_server_cert,
- cfg_config, NULL, NULL, pool));
-
- (*callbacks)->open_tmp_file = open_tmp_file;
+ static const svn_version_checklist_t checklist[] =
+ {
+ { "svn_client", svn_client_version },
+ { "svn_subr", svn_subr_version },
+ { "svn_ra", svn_ra_version },
+ { NULL, NULL }
+ };
+ SVN_VERSION_DEFINE(my_version);
- return SVN_NO_ERROR;
+ return svn_ver_check_list2(&my_version, checklist, svn_ver_equal);
}
-
-
static svn_error_t *
commit_callback(const svn_commit_info_t *commit_info,
void *baton,
@@ -154,204 +98,6 @@ typedef enum action_code_t {
ACTION_RM
} action_code_t;
-struct operation {
- enum {
- OP_OPEN,
- OP_DELETE,
- OP_ADD,
- OP_REPLACE,
- OP_PROPSET /* only for files for which no other operation is
- occuring; directories are OP_OPEN with non-empty
- props */
- } operation;
- svn_node_kind_t kind; /* to copy, mkdir, put or set revprops */
- svn_revnum_t rev; /* to copy, valid for add and replace */
- const char *url; /* to copy, valid for add and replace */
- const char *src_file; /* for put, the source file for contents */
- apr_hash_t *children; /* const char *path -> struct operation * */
- apr_hash_t *prop_mods; /* const char *prop_name ->
- const svn_string_t *prop_value */
- apr_array_header_t *prop_dels; /* const char *prop_name deletions */
- void *baton; /* as returned by the commit editor */
-};
-
-
-/* An iterator (for use via apr_table_do) which sets node properties.
- REC is a pointer to a struct driver_state. */
-static svn_error_t *
-change_props(const svn_delta_editor_t *editor,
- void *baton,
- struct operation *child,
- apr_pool_t *pool)
-{
- apr_pool_t *iterpool = svn_pool_create(pool);
-
- if (child->prop_dels)
- {
- int i;
- for (i = 0; i < child->prop_dels->nelts; i++)
- {
- const char *prop_name;
-
- svn_pool_clear(iterpool);
- prop_name = APR_ARRAY_IDX(child->prop_dels, i, const char *);
- if (child->kind == svn_node_dir)
- SVN_ERR(editor->change_dir_prop(baton, prop_name,
- NULL, iterpool));
- else
- SVN_ERR(editor->change_file_prop(baton, prop_name,
- NULL, iterpool));
- }
- }
- if (apr_hash_count(child->prop_mods))
- {
- apr_hash_index_t *hi;
- for (hi = apr_hash_first(pool, child->prop_mods);
- hi; hi = apr_hash_next(hi))
- {
- const char *propname = svn__apr_hash_index_key(hi);
- const svn_string_t *val = svn__apr_hash_index_val(hi);
-
- svn_pool_clear(iterpool);
- if (child->kind == svn_node_dir)
- SVN_ERR(editor->change_dir_prop(baton, propname, val, iterpool));
- else
- SVN_ERR(editor->change_file_prop(baton, propname, val, iterpool));
- }
- }
-
- svn_pool_destroy(iterpool);
- return SVN_NO_ERROR;
-}
-
-
-/* Drive EDITOR to affect the change represented by OPERATION. HEAD
- is the last-known youngest revision in the repository. */
-static svn_error_t *
-drive(struct operation *operation,
- svn_revnum_t head,
- const svn_delta_editor_t *editor,
- apr_pool_t *pool)
-{
- apr_pool_t *subpool = svn_pool_create(pool);
- apr_hash_index_t *hi;
-
- for (hi = apr_hash_first(pool, operation->children);
- hi; hi = apr_hash_next(hi))
- {
- const char *key = svn__apr_hash_index_key(hi);
- struct operation *child = svn__apr_hash_index_val(hi);
- void *file_baton = NULL;
-
- svn_pool_clear(subpool);
-
- /* Deletes and replacements are simple -- delete something. */
- if (child->operation == OP_DELETE || child->operation == OP_REPLACE)
- {
- SVN_ERR(editor->delete_entry(key, head, operation->baton, subpool));
- }
- /* Opens could be for directories or files. */
- if (child->operation == OP_OPEN || child->operation == OP_PROPSET)
- {
- if (child->kind == svn_node_dir)
- {
- SVN_ERR(editor->open_directory(key, operation->baton, head,
- subpool, &child->baton));
- }
- else
- {
- SVN_ERR(editor->open_file(key, operation->baton, head,
- subpool, &file_baton));
- }
- }
- /* Adds and replacements could also be for directories or files. */
- if (child->operation == OP_ADD || child->operation == OP_REPLACE)
- {
- if (child->kind == svn_node_dir)
- {
- SVN_ERR(editor->add_directory(key, operation->baton,
- child->url, child->rev,
- subpool, &child->baton));
- }
- else
- {
- SVN_ERR(editor->add_file(key, operation->baton, child->url,
- child->rev, subpool, &file_baton));
- }
- }
- /* If there's a source file and an open file baton, we get to
- change textual contents. */
- if ((child->src_file) && (file_baton))
- {
- svn_txdelta_window_handler_t handler;
- void *handler_baton;
- svn_stream_t *contents;
-
- SVN_ERR(editor->apply_textdelta(file_baton, NULL, subpool,
- &handler, &handler_baton));
- if (strcmp(child->src_file, "-") != 0)
- {
- SVN_ERR(svn_stream_open_readonly(&contents, child->src_file,
- pool, pool));
- }
- else
- {
- SVN_ERR(svn_stream_for_stdin(&contents, pool));
- }
- SVN_ERR(svn_txdelta_send_stream(contents, handler,
- handler_baton, NULL, pool));
- }
- /* If we opened a file, we need to apply outstanding propmods,
- then close it. */
- if (file_baton)
- {
- if (child->kind == svn_node_file)
- {
- SVN_ERR(change_props(editor, file_baton, child, subpool));
- }
- SVN_ERR(editor->close_file(file_baton, NULL, subpool));
- }
- /* If we opened, added, or replaced a directory, we need to
- recurse, apply outstanding propmods, and then close it. */
- if ((child->kind == svn_node_dir)
- && child->operation != OP_DELETE)
- {
- SVN_ERR(change_props(editor, child->baton, child, subpool));
-
- SVN_ERR(drive(child, head, editor, subpool));
-
- SVN_ERR(editor->close_directory(child->baton, subpool));
- }
- }
- svn_pool_destroy(subpool);
- return SVN_NO_ERROR;
-}
-
-
-/* Find the operation associated with PATH, which is a single-path
- component representing a child of the path represented by
- OPERATION. If no such child operation exists, create a new one of
- type OP_OPEN. */
-static struct operation *
-get_operation(const char *path,
- struct operation *operation,
- apr_pool_t *pool)
-{
- struct operation *child = svn_hash_gets(operation->children, path);
- if (! child)
- {
- child = apr_pcalloc(pool, sizeof(*child));
- child->children = apr_hash_make(pool);
- child->operation = OP_OPEN;
- child->rev = SVN_INVALID_REVNUM;
- child->kind = svn_node_dir;
- child->prop_mods = apr_hash_make(pool);
- child->prop_dels = apr_array_make(pool, 1, sizeof(const char *));
- svn_hash_sets(operation->children, path, child);
- }
- return child;
-}
-
/* Return the portion of URL that is relative to ANCHOR (URI-decoded). */
static const char *
subtract_anchor(const char *anchor, const char *url, apr_pool_t *pool)
@@ -359,221 +105,6 @@ subtract_anchor(const char *anchor, const char *url, apr_pool_t *pool)
return svn_uri_skip_ancestor(anchor, url, pool);
}
-/* Add PATH to the operations tree rooted at OPERATION, creating any
- intermediate nodes that are required. Here's what's expected for
- each action type:
-
- ACTION URL REV SRC-FILE PROPNAME
- ------------ ----- ------- -------- --------
- ACTION_MKDIR NULL invalid NULL NULL
- ACTION_CP valid valid NULL NULL
- ACTION_PUT NULL invalid valid NULL
- ACTION_RM NULL invalid NULL NULL
- ACTION_PROPSET valid invalid NULL valid
- ACTION_PROPDEL valid invalid NULL valid
-
- Node type information is obtained for any copy source (to determine
- whether to create a file or directory) and for any deleted path (to
- ensure it exists since svn_delta_editor_t->delete_entry doesn't
- return an error on non-existent nodes). */
-static svn_error_t *
-build(action_code_t action,
- const char *path,
- const char *url,
- svn_revnum_t rev,
- const char *prop_name,
- const svn_string_t *prop_value,
- const char *src_file,
- svn_revnum_t head,
- const char *anchor,
- svn_ra_session_t *session,
- struct operation *operation,
- apr_pool_t *pool)
-{
- apr_array_header_t *path_bits = svn_path_decompose(path, pool);
- const char *path_so_far = "";
- const char *copy_src = NULL;
- svn_revnum_t copy_rev = SVN_INVALID_REVNUM;
- int i;
-
- /* Look for any previous operations we've recognized for PATH. If
- any of PATH's ancestors have not yet been traversed, we'll be
- creating OP_OPEN operations for them as we walk down PATH's path
- components. */
- for (i = 0; i < path_bits->nelts; ++i)
- {
- const char *path_bit = APR_ARRAY_IDX(path_bits, i, const char *);
- path_so_far = svn_relpath_join(path_so_far, path_bit, pool);
- operation = get_operation(path_so_far, operation, pool);
-
- /* If we cross a replace- or add-with-history, remember the
- source of those things in case we need to lookup the node kind
- of one of their children. And if this isn't such a copy,
- but we've already seen one in of our parent paths, we just need
- to extend that copy source path by our current path
- component. */
- if (operation->url
- && SVN_IS_VALID_REVNUM(operation->rev)
- && (operation->operation == OP_REPLACE
- || operation->operation == OP_ADD))
- {
- copy_src = subtract_anchor(anchor, operation->url, pool);
- copy_rev = operation->rev;
- }
- else if (copy_src)
- {
- copy_src = svn_relpath_join(copy_src, path_bit, pool);
- }
- }
-
- /* Handle property changes. */
- if (prop_name)
- {
- if (operation->operation == OP_DELETE)
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "cannot set properties on a location being"
- " deleted ('%s')", path);
- /* If we're not adding this thing ourselves, check for existence. */
- if (! ((operation->operation == OP_ADD) ||
- (operation->operation == OP_REPLACE)))
- {
- SVN_ERR(svn_ra_check_path(session,
- copy_src ? copy_src : path,
- copy_src ? copy_rev : head,
- &operation->kind, pool));
- if (operation->kind == svn_node_none)
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "propset: '%s' not found", path);
- else if ((operation->kind == svn_node_file)
- && (operation->operation == OP_OPEN))
- operation->operation = OP_PROPSET;
- }
- if (! prop_value)
- APR_ARRAY_PUSH(operation->prop_dels, const char *) = prop_name;
- else
- svn_hash_sets(operation->prop_mods, prop_name, prop_value);
- if (!operation->rev)
- operation->rev = rev;
- return SVN_NO_ERROR;
- }
-
- /* We won't fuss about multiple operations on the same path in the
- following cases:
-
- - the prior operation was, in fact, a no-op (open)
- - the prior operation was a propset placeholder
- - the prior operation was a deletion
-
- Note: while the operation structure certainly supports the
- ability to do a copy of a file followed by a put of new contents
- for the file, we don't let that happen (yet).
- */
- if (operation->operation != OP_OPEN
- && operation->operation != OP_PROPSET
- && operation->operation != OP_DELETE)
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "unsupported multiple operations on '%s'", path);
-
- /* For deletions, we validate that there's actually something to
- delete. If this is a deletion of the child of a copied
- directory, we need to remember to look in the copy source tree to
- verify that this thing actually exists. */
- if (action == ACTION_RM)
- {
- operation->operation = OP_DELETE;
- SVN_ERR(svn_ra_check_path(session,
- copy_src ? copy_src : path,
- copy_src ? copy_rev : head,
- &operation->kind, pool));
- if (operation->kind == svn_node_none)
- {
- if (copy_src && strcmp(path, copy_src))
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "'%s' (from '%s:%ld') not found",
- path, copy_src, copy_rev);
- else
- return svn_error_createf(SVN_ERR_BAD_URL, NULL, "'%s' not found",
- path);
- }
- }
- /* Handle copy operations (which can be adds or replacements). */
- else if (action == ACTION_CP)
- {
- if (rev > head)
- return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- "Copy source revision cannot be younger "
- "than base revision");
- operation->operation =
- operation->operation == OP_DELETE ? OP_REPLACE : OP_ADD;
- if (operation->operation == OP_ADD)
- {
- /* There is a bug in the current version of mod_dav_svn
- which incorrectly replaces existing directories.
- Therefore we need to check if the target exists
- and raise an error here. */
- SVN_ERR(svn_ra_check_path(session,
- copy_src ? copy_src : path,
- copy_src ? copy_rev : head,
- &operation->kind, pool));
- if (operation->kind != svn_node_none)
- {
- if (copy_src && strcmp(path, copy_src))
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "'%s' (from '%s:%ld') already exists",
- path, copy_src, copy_rev);
- else
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "'%s' already exists", path);
- }
- }
- SVN_ERR(svn_ra_check_path(session, subtract_anchor(anchor, url, pool),
- rev, &operation->kind, pool));
- if (operation->kind == svn_node_none)
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "'%s' not found",
- subtract_anchor(anchor, url, pool));
- operation->url = url;
- operation->rev = rev;
- }
- /* Handle mkdir operations (which can be adds or replacements). */
- else if (action == ACTION_MKDIR)
- {
- operation->operation =
- operation->operation == OP_DELETE ? OP_REPLACE : OP_ADD;
- operation->kind = svn_node_dir;
- }
- /* Handle put operations (which can be adds, replacements, or opens). */
- else if (action == ACTION_PUT)
- {
- if (operation->operation == OP_DELETE)
- {
- operation->operation = OP_REPLACE;
- }
- else
- {
- SVN_ERR(svn_ra_check_path(session,
- copy_src ? copy_src : path,
- copy_src ? copy_rev : head,
- &operation->kind, pool));
- if (operation->kind == svn_node_file)
- operation->operation = OP_OPEN;
- else if (operation->kind == svn_node_none)
- operation->operation = OP_ADD;
- else
- return svn_error_createf(SVN_ERR_BAD_URL, NULL,
- "'%s' is not a file", path);
- }
- operation->kind = svn_node_file;
- operation->src_file = src_file;
- }
- else
- {
- /* We shouldn't get here. */
- SVN_ERR_MALFUNCTION();
- }
-
- return SVN_NO_ERROR;
-}
struct action {
action_code_t action;
@@ -597,274 +128,89 @@ struct action {
const svn_string_t *prop_value;
};
-struct fetch_baton
-{
- svn_ra_session_t *session;
- svn_revnum_t head;
-};
-
-static svn_error_t *
-fetch_base_func(const char **filename,
- void *baton,
- const char *path,
- svn_revnum_t base_revision,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- struct fetch_baton *fb = baton;
- svn_stream_t *fstream;
- svn_error_t *err;
-
- if (! SVN_IS_VALID_REVNUM(base_revision))
- base_revision = fb->head;
-
- SVN_ERR(svn_stream_open_unique(&fstream, filename, NULL,
- svn_io_file_del_on_pool_cleanup,
- result_pool, scratch_pool));
-
- err = svn_ra_get_file(fb->session, path, base_revision, fstream, NULL, NULL,
- scratch_pool);
- if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- SVN_ERR(svn_stream_close(fstream));
-
- *filename = NULL;
- return SVN_NO_ERROR;
- }
- else if (err)
- return svn_error_trace(err);
-
- SVN_ERR(svn_stream_close(fstream));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_props_func(apr_hash_t **props,
- void *baton,
- const char *path,
- svn_revnum_t base_revision,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- struct fetch_baton *fb = baton;
- svn_node_kind_t node_kind;
-
- if (! SVN_IS_VALID_REVNUM(base_revision))
- base_revision = fb->head;
-
- SVN_ERR(svn_ra_check_path(fb->session, path, base_revision, &node_kind,
- scratch_pool));
-
- if (node_kind == svn_node_file)
- {
- SVN_ERR(svn_ra_get_file(fb->session, path, base_revision, NULL, NULL,
- props, result_pool));
- }
- else if (node_kind == svn_node_dir)
- {
- apr_array_header_t *tmp_props;
-
- SVN_ERR(svn_ra_get_dir2(fb->session, NULL, NULL, props, path,
- base_revision, 0 /* Dirent fields */,
- result_pool));
- tmp_props = svn_prop_hash_to_array(*props, result_pool);
- SVN_ERR(svn_categorize_props(tmp_props, NULL, NULL, &tmp_props,
- result_pool));
- *props = svn_prop_array_to_hash(tmp_props, result_pool);
- }
- else
- {
- *props = apr_hash_make(result_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_kind_func(svn_node_kind_t *kind,
- void *baton,
- const char *path,
- svn_revnum_t base_revision,
- apr_pool_t *scratch_pool)
-{
- struct fetch_baton *fb = baton;
-
- if (! SVN_IS_VALID_REVNUM(base_revision))
- base_revision = fb->head;
-
- SVN_ERR(svn_ra_check_path(fb->session, path, base_revision, kind,
- scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-static svn_delta_shim_callbacks_t *
-get_shim_callbacks(svn_ra_session_t *session,
- svn_revnum_t head,
- apr_pool_t *result_pool)
-{
- svn_delta_shim_callbacks_t *callbacks =
- svn_delta_shim_callbacks_default(result_pool);
- struct fetch_baton *fb = apr_pcalloc(result_pool, sizeof(*fb));
-
- fb->session = session;
- fb->head = head;
-
- callbacks->fetch_props_func = fetch_props_func;
- callbacks->fetch_kind_func = fetch_kind_func;
- callbacks->fetch_base_func = fetch_base_func;
- callbacks->fetch_baton = fb;
-
- return callbacks;
-}
-
static svn_error_t *
execute(const apr_array_header_t *actions,
const char *anchor,
apr_hash_t *revprops,
- const char *username,
- const char *password,
- const char *config_dir,
- const apr_array_header_t *config_options,
- svn_boolean_t non_interactive,
- svn_boolean_t trust_server_cert,
- svn_boolean_t no_auth_cache,
svn_revnum_t base_revision,
+ svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
- svn_ra_session_t *session;
- svn_ra_session_t *aux_session;
- const char *repos_root;
- svn_revnum_t head;
- const svn_delta_editor_t *editor;
- svn_ra_callbacks2_t *ra_callbacks;
- void *editor_baton;
- struct operation root;
+ svn_client__mtcc_t *mtcc;
+ apr_pool_t *iterpool = svn_pool_create(pool);
svn_error_t *err;
- apr_hash_t *config;
- svn_config_t *cfg_config;
int i;
- SVN_ERR(svn_config_get_config(&config, config_dir, pool));
- SVN_ERR(svn_cmdline__apply_config_options(config, config_options,
- "svnmucc: ", "--config-option"));
- cfg_config = svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG);
-
- if (! svn_hash_gets(revprops, SVN_PROP_REVISION_LOG))
- {
- svn_string_t *msg = svn_string_create("", pool);
-
- /* If we can do so, try to pop up $EDITOR to fetch a log message. */
- if (non_interactive)
- {
- return svn_error_create
- (SVN_ERR_CL_INSUFFICIENT_ARGS, NULL,
- _("Cannot invoke editor to get log message "
- "when non-interactive"));
- }
- else
- {
- SVN_ERR(svn_cmdline__edit_string_externally(
- &msg, NULL, NULL, "", msg, "svnmucc-commit", config,
- TRUE, NULL, apr_hash_pool_get(revprops)));
- }
-
- svn_hash_sets(revprops, SVN_PROP_REVISION_LOG, msg);
- }
-
- SVN_ERR(create_ra_callbacks(&ra_callbacks, username, password, config_dir,
- cfg_config, non_interactive, trust_server_cert,
- no_auth_cache, pool));
- SVN_ERR(svn_ra_open4(&session, NULL, anchor, NULL, ra_callbacks,
- NULL, config, pool));
- /* Open, then reparent to avoid AUTHZ errors when opening the reposroot */
- SVN_ERR(svn_ra_open4(&aux_session, NULL, anchor, NULL, ra_callbacks,
- NULL, config, pool));
- SVN_ERR(svn_ra_get_repos_root2(aux_session, &repos_root, pool));
- SVN_ERR(svn_ra_reparent(aux_session, repos_root, pool));
- SVN_ERR(svn_ra_get_latest_revnum(session, &head, pool));
-
- /* Reparent to ANCHOR's dir, if ANCHOR is not a directory. */
- {
- svn_node_kind_t kind;
-
- SVN_ERR(svn_ra_check_path(aux_session,
- svn_uri_skip_ancestor(repos_root, anchor, pool),
- head, &kind, pool));
- if (kind != svn_node_dir)
- {
- anchor = svn_uri_dirname(anchor, pool);
- SVN_ERR(svn_ra_reparent(session, anchor, pool));
- }
- }
-
- if (SVN_IS_VALID_REVNUM(base_revision))
- {
- if (base_revision > head)
- return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
- "No such revision %ld (youngest is %ld)",
- base_revision, head);
- head = base_revision;
- }
-
- memset(&root, 0, sizeof(root));
- root.children = apr_hash_make(pool);
- root.operation = OP_OPEN;
- root.kind = svn_node_dir; /* For setting properties */
- root.prop_mods = apr_hash_make(pool);
- root.prop_dels = apr_array_make(pool, 1, sizeof(const char *));
+ SVN_ERR(svn_client__mtcc_create(&mtcc, anchor,
+ SVN_IS_VALID_REVNUM(base_revision)
+ ? base_revision
+ : SVN_INVALID_REVNUM,
+ ctx, pool, iterpool));
for (i = 0; i < actions->nelts; ++i)
{
struct action *action = APR_ARRAY_IDX(actions, i, struct action *);
const char *path1, *path2;
+ svn_node_kind_t kind;
+
+ svn_pool_clear(iterpool);
+
switch (action->action)
{
case ACTION_MV:
path1 = subtract_anchor(anchor, action->path[0], pool);
path2 = subtract_anchor(anchor, action->path[1], pool);
- SVN_ERR(build(ACTION_RM, path1, NULL,
- SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
- session, &root, pool));
- SVN_ERR(build(ACTION_CP, path2, action->path[0],
- head, NULL, NULL, NULL, head, anchor,
- session, &root, pool));
+ SVN_ERR(svn_client__mtcc_add_move(path1, path2, mtcc, iterpool));
break;
case ACTION_CP:
+ path1 = subtract_anchor(anchor, action->path[0], pool);
path2 = subtract_anchor(anchor, action->path[1], pool);
- if (action->rev == SVN_INVALID_REVNUM)
- action->rev = head;
- SVN_ERR(build(ACTION_CP, path2, action->path[0],
- action->rev, NULL, NULL, NULL, head, anchor,
- session, &root, pool));
+ SVN_ERR(svn_client__mtcc_add_copy(path1, action->rev, path2,
+ mtcc, iterpool));
break;
case ACTION_RM:
path1 = subtract_anchor(anchor, action->path[0], pool);
- SVN_ERR(build(ACTION_RM, path1, NULL,
- SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
- session, &root, pool));
+ SVN_ERR(svn_client__mtcc_add_delete(path1, mtcc, iterpool));
break;
case ACTION_MKDIR:
path1 = subtract_anchor(anchor, action->path[0], pool);
- SVN_ERR(build(ACTION_MKDIR, path1, action->path[0],
- SVN_INVALID_REVNUM, NULL, NULL, NULL, head, anchor,
- session, &root, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir(path1, mtcc, iterpool));
break;
case ACTION_PUT:
path1 = subtract_anchor(anchor, action->path[0], pool);
- SVN_ERR(build(ACTION_PUT, path1, action->path[0],
- SVN_INVALID_REVNUM, NULL, NULL, action->path[1],
- head, anchor, session, &root, pool));
+ SVN_ERR(svn_client__mtcc_check_path(&kind, path1, TRUE, mtcc, pool));
+
+ if (kind == svn_node_dir)
+ {
+ SVN_ERR(svn_client__mtcc_add_delete(path1, mtcc, pool));
+ kind = svn_node_none;
+ }
+
+ {
+ svn_stream_t *src;
+
+ if (strcmp(action->path[1], "-") != 0)
+ SVN_ERR(svn_stream_open_readonly(&src, action->path[1],
+ pool, iterpool));
+ else
+ SVN_ERR(svn_stream_for_stdin(&src, pool));
+
+
+ if (kind == svn_node_file)
+ SVN_ERR(svn_client__mtcc_add_update_file(path1, src, NULL,
+ NULL, NULL,
+ mtcc, iterpool));
+ else if (kind == svn_node_none)
+ SVN_ERR(svn_client__mtcc_add_add_file(path1, src, NULL,
+ mtcc, iterpool));
+ }
break;
case ACTION_PROPSET:
case ACTION_PROPDEL:
path1 = subtract_anchor(anchor, action->path[0], pool);
- SVN_ERR(build(action->action, path1, action->path[0],
- SVN_INVALID_REVNUM,
- action->prop_name, action->prop_value,
- NULL, head, anchor, session, &root, pool));
+ SVN_ERR(svn_client__mtcc_add_propset(path1, action->prop_name,
+ action->prop_value, FALSE,
+ mtcc, iterpool));
break;
case ACTION_PROPSETF:
default:
@@ -872,25 +218,11 @@ execute(const apr_array_header_t *actions,
}
}
- SVN_ERR(svn_ra__register_editor_shim_callbacks(session,
- get_shim_callbacks(aux_session, head, pool)));
- SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &editor_baton, revprops,
- commit_callback, NULL, NULL, FALSE, pool));
+ err = svn_client__mtcc_commit(revprops, commit_callback, NULL,
+ mtcc, iterpool);
- SVN_ERR(editor->open_root(editor_baton, head, pool, &root.baton));
- err = change_props(editor, root.baton, &root, pool);
- if (!err)
- err = drive(&root, head, editor, pool);
- if (!err)
- err = editor->close_directory(root.baton, pool);
- if (!err)
- err = editor->close_edit(editor_baton, pool);
-
- if (err)
- err = svn_error_compose_create(err,
- editor->abort_edit(editor_baton, pool));
-
- return err;
+ svn_pool_destroy(iterpool);
+ return svn_error_trace(err);
}
static svn_error_t *
@@ -920,12 +252,20 @@ sanitize_url(const char *url,
}
static void
-usage(apr_pool_t *pool, int exit_val)
+usage(apr_pool_t *pool)
+{
+ svn_error_clear(svn_cmdline_fprintf
+ (stderr, pool, _("Type 'svnmucc --help' for usage.\n")));
+}
+
+/* Print a usage message on STREAM. */
+static void
+help(FILE *stream, apr_pool_t *pool)
{
- FILE *stream = exit_val == EXIT_SUCCESS ? stdout : stderr;
svn_error_clear(svn_cmdline_fputs(
- _("Subversion multiple URL command client\n"
- "usage: svnmucc ACTION...\n"
+ _("usage: svnmucc ACTION...\n"
+ "Subversion multiple URL command client.\n"
+ "Type 'svnmucc --version' to see the program version and RA modules.\n"
"\n"
" Perform one or more Subversion repository URL-based ACTIONs, committing\n"
" the result as a (single) new revision.\n"
@@ -955,9 +295,16 @@ usage(apr_pool_t *pool, int exit_val)
" prompt only if standard input is a terminal)\n"
" --force-interactive : do interactive prompting even if standard\n"
" input is not a terminal\n"
- " --trust-server-cert : accept SSL server certificates from unknown\n"
- " certificate authorities without prompting (but\n"
- " only with '--non-interactive')\n"
+ " --trust-server-cert : deprecated;\n"
+ " same as --trust-server-cert-failures=unknown-ca\n"
+ " --trust-server-cert-failures ARG\n"
+ " with --non-interactive, accept SSL server\n"
+ " certificates with failures; ARG is comma-separated\n"
+ " list of 'unknown-ca' (Unknown Authority),\n"
+ " 'cn-mismatch' (Hostname mismatch), 'expired'\n"
+ " (Expired certificate),'not-yet-valid' (Not yet\n"
+ " valid certificate) and 'other' (all other not\n"
+ " separately classified certificate errors).\n"
" -X [--extra-args] ARG : append arguments from file ARG (one per line;\n"
" use \"-\" to read from standard input)\n"
" --config-dir ARG : use ARG to override the config directory\n"
@@ -965,20 +312,17 @@ usage(apr_pool_t *pool, int exit_val)
" --no-auth-cache : do not cache authentication tokens\n"
" --version : print version information\n"),
stream, pool));
- svn_pool_destroy(pool);
- exit(exit_val);
}
-static void
-insufficient(apr_pool_t *pool)
+static svn_error_t *
+insufficient(void)
{
- handle_error(svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- "insufficient arguments"),
- pool);
+ return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "insufficient arguments");
}
static svn_error_t *
-display_version(apr_getopt_t *os, apr_pool_t *pool)
+display_version(apr_pool_t *pool)
{
const char *ra_desc_start
= "The following repository access (RA) modules are available:\n\n";
@@ -987,7 +331,7 @@ display_version(apr_getopt_t *os, apr_pool_t *pool)
version_footer = svn_stringbuf_create(ra_desc_start, pool);
SVN_ERR(svn_ra_print_modules(version_footer, pool));
- SVN_ERR(svn_opt_print_help4(os, "svnmucc", TRUE, FALSE, FALSE,
+ SVN_ERR(svn_opt_print_help4(NULL, "svnmucc", TRUE, FALSE, FALSE,
version_footer->data,
NULL, NULL, NULL, NULL, NULL, pool));
@@ -1005,46 +349,113 @@ mutually_exclusive_logs_error(void)
"exclusive"));
}
-/* Ensure that the REVPROPS hash contains a command-line-provided log
- message, if any, and that there was but one source of such a thing
- provided on that command-line. */
+/* Obtain the log message from multiple sources, producing an error
+ if there are multiple sources. Store the result in *FINAL_MESSAGE. */
static svn_error_t *
-sanitize_log_sources(apr_hash_t *revprops,
+sanitize_log_sources(const char **final_message,
const char *message,
- svn_stringbuf_t *filedata)
+ apr_hash_t *revprops,
+ svn_stringbuf_t *filedata,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *hash_pool = apr_hash_pool_get(revprops);
+ svn_string_t *msg;
+ *final_message = NULL;
/* If we already have a log message in the revprop hash, then just
make sure the user didn't try to also use -m or -F. Otherwise,
we need to consult -m or -F to find a log message, if any. */
- if (svn_hash_gets(revprops, SVN_PROP_REVISION_LOG))
+ msg = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG);
+ if (msg)
{
if (filedata || message)
return mutually_exclusive_logs_error();
+
+ *final_message = apr_pstrdup(result_pool, msg->data);
+
+ /* Will be re-added by libsvn_client */
+ svn_hash_sets(revprops, SVN_PROP_REVISION_LOG, NULL);
}
else if (filedata)
{
if (message)
return mutually_exclusive_logs_error();
- SVN_ERR(svn_utf_cstring_to_utf8(&message, filedata->data, hash_pool));
- svn_hash_sets(revprops, SVN_PROP_REVISION_LOG,
- svn_stringbuf__morph_into_string(filedata));
+ *final_message = apr_pstrdup(result_pool, filedata->data);
}
else if (message)
{
- svn_hash_sets(revprops, SVN_PROP_REVISION_LOG,
- svn_string_create(message, hash_pool));
+ *final_message = apr_pstrdup(result_pool, message);
}
return SVN_NO_ERROR;
}
-int
-main(int argc, const char **argv)
+/* Baton for log_message_func */
+struct log_message_baton
+{
+ svn_boolean_t non_interactive;
+ const char *log_message;
+ svn_client_ctx_t *ctx;
+};
+
+/* Implements svn_client_get_commit_log3_t */
+static svn_error_t *
+log_message_func(const char **log_msg,
+ const char **tmp_file,
+ const apr_array_header_t *commit_items,
+ void *baton,
+ apr_pool_t *pool)
+{
+ struct log_message_baton *lmb = baton;
+
+ *tmp_file = NULL;
+
+ if (lmb->log_message)
+ {
+ svn_string_t *message = svn_string_create(lmb->log_message, pool);
+
+ SVN_ERR_W(svn_subst_translate_string2(&message, NULL, NULL,
+ message, NULL, FALSE,
+ pool, pool),
+ _("Error normalizing log message to internal format"));
+
+ *log_msg = message->data;
+
+ return SVN_NO_ERROR;
+ }
+
+ if (lmb->non_interactive)
+ {
+ return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, NULL,
+ _("Cannot invoke editor to get log message "
+ "when non-interactive"));
+ }
+ else
+ {
+ svn_string_t *msg = svn_string_create("", pool);
+
+ SVN_ERR(svn_cmdline__edit_string_externally(
+ &msg, NULL, NULL, "", msg, "svnmucc-commit",
+ lmb->ctx->config, TRUE, NULL, pool));
+
+ if (msg && msg->data)
+ *log_msg = msg->data;
+ else
+ *log_msg = NULL;
+
+ return SVN_NO_ERROR;
+ }
+}
+
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
- apr_pool_t *pool = init("svnmucc");
apr_array_header_t *actions = apr_array_make(pool, 1,
sizeof(struct action *));
const char *anchor = NULL;
@@ -1058,7 +469,8 @@ main(int argc, const char **argv)
with_revprop_opt,
non_interactive_opt,
force_interactive_opt,
- trust_server_cert_opt
+ trust_server_cert_opt,
+ trust_server_cert_failures_opt,
};
static const apr_getopt_option_t options[] = {
{"message", 'm', 1, ""},
@@ -1074,6 +486,7 @@ main(int argc, const char **argv)
{"non-interactive", non_interactive_opt, 0, ""},
{"force-interactive", force_interactive_opt, 0, ""},
{"trust-server-cert", trust_server_cert_opt, 0, ""},
+ {"trust-server-cert-failures", trust_server_cert_failures_opt, 1, ""},
{"config-dir", config_dir_opt, 1, ""},
{"config-option", config_inline_opt, 1, ""},
{"no-auth-cache", no_auth_cache_opt, 0, ""},
@@ -1088,13 +501,26 @@ main(int argc, const char **argv)
apr_array_header_t *config_options;
svn_boolean_t non_interactive = FALSE;
svn_boolean_t force_interactive = FALSE;
- svn_boolean_t trust_server_cert = FALSE;
+ svn_boolean_t trust_unknown_ca = FALSE;
+ svn_boolean_t trust_cn_mismatch = FALSE;
+ svn_boolean_t trust_expired = FALSE;
+ svn_boolean_t trust_not_yet_valid = FALSE;
+ svn_boolean_t trust_other_failure = FALSE;
svn_boolean_t no_auth_cache = FALSE;
+ svn_boolean_t show_version = FALSE;
+ svn_boolean_t show_help = FALSE;
svn_revnum_t base_revision = SVN_INVALID_REVNUM;
apr_array_header_t *action_args;
apr_hash_t *revprops = apr_hash_make(pool);
+ apr_hash_t *cfg_hash;
+ svn_config_t *cfg_config;
+ svn_client_ctx_t *ctx;
+ struct log_message_baton lmb;
int i;
+ /* Check library versions */
+ SVN_ERR(check_lib_versions());
+
config_options = apr_array_make(pool, 0,
sizeof(svn_cmdline__config_argument_t*));
@@ -1110,22 +536,21 @@ main(int argc, const char **argv)
if (APR_STATUS_IS_EOF(status))
break;
if (status != APR_SUCCESS)
- handle_error(svn_error_wrap_apr(status, "getopt failure"), pool);
+ {
+ usage(pool);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
switch(opt)
{
case 'm':
- err = svn_utf_cstring_to_utf8(&message, arg, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&message, arg, pool));
break;
case 'F':
{
const char *arg_utf8;
- err = svn_utf_cstring_to_utf8(&arg_utf8, arg, pool);
- if (! err)
- err = svn_stringbuf_from_file2(&filedata, arg, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&arg_utf8, arg, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&filedata, arg, pool));
}
break;
case 'u':
@@ -1135,31 +560,29 @@ main(int argc, const char **argv)
password = apr_pstrdup(pool, arg);
break;
case 'U':
- err = svn_utf_cstring_to_utf8(&root_url, arg, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&root_url, arg, pool));
if (! svn_path_is_url(root_url))
- handle_error(svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- "'%s' is not a URL\n", root_url),
- pool);
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "'%s' is not a URL\n", root_url);
root_url = sanitize_url(root_url, pool);
break;
case 'r':
{
+ const char *saved_arg = arg;
char *digits_end = NULL;
+ while (*arg == 'r')
+ arg++;
base_revision = strtol(arg, &digits_end, 10);
if ((! SVN_IS_VALID_REVNUM(base_revision))
|| (! digits_end)
|| *digits_end)
- handle_error(svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR,
- NULL, "Invalid revision number"),
- pool);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Invalid revision number '%s'"),
+ saved_arg);
}
break;
case with_revprop_opt:
- err = svn_opt_parse_revprop(&revprops, arg, pool);
- if (err != SVN_NO_ERROR)
- handle_error(err, pool);
+ SVN_ERR(svn_opt_parse_revprop(&revprops, arg, pool));
break;
case 'X':
extra_args_file = apr_pstrdup(pool, arg);
@@ -1170,72 +593,81 @@ main(int argc, const char **argv)
case force_interactive_opt:
force_interactive = TRUE;
break;
- case trust_server_cert_opt:
- trust_server_cert = TRUE;
+ case trust_server_cert_opt: /* backward compat */
+ trust_unknown_ca = TRUE;
+ break;
+ case trust_server_cert_failures_opt:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &trust_unknown_ca,
+ &trust_cn_mismatch,
+ &trust_expired,
+ &trust_not_yet_valid,
+ &trust_other_failure,
+ opt_arg, pool));
break;
case config_dir_opt:
- err = svn_utf_cstring_to_utf8(&config_dir, arg, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&config_dir, arg, pool));
break;
case config_inline_opt:
- err = svn_utf_cstring_to_utf8(&opt_arg, arg, pool);
- if (err)
- handle_error(err, pool);
-
- err = svn_cmdline__parse_config_option(config_options, opt_arg,
- pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(config_options, opt_arg,
+ "svnmucc: ",
+ pool));
break;
case no_auth_cache_opt:
no_auth_cache = TRUE;
break;
case version_opt:
- SVN_INT_ERR(display_version(opts, pool));
- exit(EXIT_SUCCESS);
+ show_version = TRUE;
break;
case 'h':
case '?':
- usage(pool, EXIT_SUCCESS);
+ show_help = TRUE;
break;
}
}
+ if (show_help)
+ {
+ help(stdout, pool);
+ return SVN_NO_ERROR;
+ }
+
+ if (show_version)
+ {
+ SVN_ERR(display_version(pool));
+ return SVN_NO_ERROR;
+ }
+
if (non_interactive && force_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--non-interactive and --force-interactive "
- "are mutually exclusive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnmucc: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--non-interactive and --force-interactive "
+ "are mutually exclusive"));
}
else
non_interactive = !svn_cmdline__be_interactive(non_interactive,
force_interactive);
- if (trust_server_cert && !non_interactive)
+ if (!non_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--trust-server-cert requires "
- "--non-interactive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnmucc: ");
+ if (trust_unknown_ca || trust_cn_mismatch || trust_expired
+ || trust_not_yet_valid || trust_other_failure)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--trust-server-cert-failures requires "
+ "--non-interactive"));
}
- /* Make sure we have a log message to use. */
- err = sanitize_log_sources(revprops, message, filedata);
- if (err)
- handle_error(err, pool);
-
/* Copy the rest of our command-line arguments to an array,
UTF-8-ing them along the way. */
action_args = apr_array_make(pool, opts->argc, sizeof(const char *));
while (opts->ind < opts->argc)
{
const char *arg = opts->argv[opts->ind++];
- if ((err = svn_utf_cstring_to_utf8(&(APR_ARRAY_PUSH(action_args,
- const char *)),
- arg, pool)))
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&APR_ARRAY_PUSH(action_args,
+ const char *),
+ arg, pool));
}
/* If there are extra arguments in a supplementary file, tack those
@@ -1245,18 +677,69 @@ main(int argc, const char **argv)
const char *extra_args_file_utf8;
svn_stringbuf_t *contents, *contents_utf8;
- err = svn_utf_cstring_to_utf8(&extra_args_file_utf8,
- extra_args_file, pool);
- if (! err)
- err = svn_stringbuf_from_file2(&contents, extra_args_file_utf8, pool);
- if (! err)
- err = svn_utf_stringbuf_to_utf8(&contents_utf8, contents, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(svn_utf_cstring_to_utf8(&extra_args_file_utf8,
+ extra_args_file, pool));
+ SVN_ERR(svn_stringbuf_from_file2(&contents, extra_args_file_utf8, pool));
+ SVN_ERR(svn_utf_stringbuf_to_utf8(&contents_utf8, contents, pool));
svn_cstring_split_append(action_args, contents_utf8->data, "\n\r",
FALSE, pool);
}
+ /* Now initialize the client context */
+
+ err = svn_config_get_config(&cfg_hash, config_dir, pool);
+ if (err)
+ {
+ /* Fallback to default config if the config directory isn't readable
+ or is not a directory. */
+ if (APR_STATUS_IS_EACCES(err->apr_err)
+ || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err))
+ {
+ svn_handle_warning2(stderr, err, "svnmucc: ");
+ svn_error_clear(err);
+
+ SVN_ERR(svn_config__get_default_config(&cfg_hash, pool));
+ }
+ else
+ return err;
+ }
+
+ if (config_options)
+ {
+ svn_error_clear(
+ svn_cmdline__apply_config_options(cfg_hash, config_options,
+ "svnmucc: ", "--config-option"));
+ }
+
+ SVN_ERR(svn_client_create_context2(&ctx, cfg_hash, pool));
+
+ cfg_config = svn_hash_gets(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG);
+ SVN_ERR(svn_cmdline_create_auth_baton2(
+ &ctx->auth_baton,
+ non_interactive,
+ username,
+ password,
+ config_dir,
+ no_auth_cache,
+ trust_unknown_ca,
+ trust_cn_mismatch,
+ trust_expired,
+ trust_not_yet_valid,
+ trust_other_failure,
+ cfg_config,
+ ctx->cancel_func,
+ ctx->cancel_baton,
+ pool));
+
+ lmb.non_interactive = non_interactive;
+ lmb.ctx = ctx;
+ /* Make sure we have a log message to use. */
+ SVN_ERR(sanitize_log_sources(&lmb.log_message, message, revprops, filedata,
+ pool, pool));
+
+ ctx->log_msg_func3 = log_message_func;
+ ctx->log_msg_baton3 = &lmb;
+
/* Now, we iterate over the combined set of arguments -- our actions. */
for (i = 0; i < action_args->nelts; )
{
@@ -1283,13 +766,16 @@ main(int argc, const char **argv)
action->action = ACTION_PROPDEL;
else if (! strcmp(action_string, "?") || ! strcmp(action_string, "h")
|| ! strcmp(action_string, "help"))
- usage(pool, EXIT_SUCCESS);
+ {
+ help(stdout, pool);
+ return SVN_NO_ERROR;
+ }
else
- handle_error(svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- "'%s' is not an action\n",
- action_string), pool);
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "'%s' is not an action\n",
+ action_string);
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
/* For copies, there should be a revision number next. */
if (action->action == ACTION_CP)
@@ -1308,12 +794,12 @@ main(int argc, const char **argv)
action->rev = strtol(rev_str, &end, 0);
if (*end)
- handle_error(svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- "'%s' is not a revision\n",
- rev_str), pool);
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "'%s' is not a revision\n",
+ rev_str);
}
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
}
else
{
@@ -1327,7 +813,7 @@ main(int argc, const char **argv)
svn_dirent_internal_style(APR_ARRAY_IDX(action_args, i,
const char *), pool);
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
}
/* For propset, propsetf, and propdel, a property name (and
@@ -1338,7 +824,7 @@ main(int argc, const char **argv)
{
action->prop_name = APR_ARRAY_IDX(action_args, i, const char *);
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
if (action->action == ACTION_PROPDEL)
{
@@ -1350,7 +836,7 @@ main(int argc, const char **argv)
svn_string_create(APR_ARRAY_IDX(action_args, i,
const char *), pool);
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
}
else
{
@@ -1359,12 +845,10 @@ main(int argc, const char **argv)
const char *), pool);
if (++i == action_args->nelts)
- insufficient(pool);
+ return insufficient();
- err = read_propvalue_file(&(action->prop_value),
- propval_file, pool);
- if (err)
- handle_error(err, pool);
+ SVN_ERR(read_propvalue_file(&(action->prop_value),
+ propval_file, pool));
action->action = ACTION_PROPSET;
}
@@ -1373,14 +857,10 @@ main(int argc, const char **argv)
&& svn_prop_needs_translation(action->prop_name))
{
svn_string_t *translated_value;
- err = svn_subst_translate_string2(&translated_value, NULL,
- NULL, action->prop_value, NULL,
- FALSE, pool, pool);
- if (err)
- handle_error(
- svn_error_quick_wrap(err,
- "Error normalizing property value"),
- pool);
+ SVN_ERR_W(svn_subst_translate_string2(&translated_value, NULL,
+ NULL, action->prop_value,
+ NULL, FALSE, pool, pool),
+ "Error normalizing property value");
action->prop_value = translated_value;
}
}
@@ -1408,14 +888,14 @@ main(int argc, const char **argv)
if (! svn_path_is_url(url))
{
if (! root_url)
- handle_error(svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- "'%s' is not a URL, and "
- "--root-url (-U) not provided\n",
- url), pool);
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "'%s' is not a URL, and "
+ "--root-url (-U) not provided\n",
+ url);
/* ### These relpaths are already URI-encoded. */
url = apr_pstrcat(pool, root_url, "/",
svn_relpath_canonicalize(url, pool),
- (char *)NULL);
+ SVN_VA_NULL);
}
url = sanitize_url(url, pool);
action->path[j] = url;
@@ -1433,36 +913,66 @@ main(int argc, const char **argv)
{
anchor = svn_uri_get_longest_ancestor(anchor, url, pool);
if (!anchor || !anchor[0])
- handle_error(svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- "URLs in the action list do not "
- "share a common ancestor"),
- pool);
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ "URLs in the action list do not "
+ "share a common ancestor");
}
if ((++i == action_args->nelts) && (j + 1 < num_url_args))
- insufficient(pool);
+ return insufficient();
}
+
APR_ARRAY_PUSH(actions, struct action *) = action;
}
if (! actions->nelts)
- usage(pool, EXIT_FAILURE);
+ {
+ *exit_code = EXIT_FAILURE;
+ help(stderr, pool);
+ return SVN_NO_ERROR;
+ }
- if ((err = execute(actions, anchor, revprops, username, password,
- config_dir, config_options, non_interactive,
- trust_server_cert, no_auth_cache, base_revision, pool)))
+ if ((err = execute(actions, anchor, revprops, base_revision, ctx, pool)))
{
if (err->apr_err == SVN_ERR_AUTHN_FAILED && non_interactive)
err = svn_error_quick_wrap(err,
_("Authentication failed and interactive"
" prompting is disabled; see the"
" --force-interactive option"));
- handle_error(err, pool);
+ return err;
}
- /* Ensure that stdout is flushed, so the user will see all results. */
- svn_error_clear(svn_cmdline_fflush(stdout));
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnmucc", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnmucc: ");
+ }
svn_pool_destroy(pool);
- return EXIT_SUCCESS;
+ return exit_code;
}
diff --git a/subversion/svnrdump/dump_editor.c b/subversion/svnrdump/dump_editor.c
index faf029f..bf4f81c 100644
--- a/subversion/svnrdump/dump_editor.c
+++ b/subversion/svnrdump/dump_editor.c
@@ -30,6 +30,7 @@
#include "svn_subst.h"
#include "svn_dirent_uri.h"
+#include "private/svn_repos_private.h"
#include "private/svn_subr_private.h"
#include "private/svn_dep_compat.h"
#include "private/svn_editor.h"
@@ -39,28 +40,16 @@
#define ARE_VALID_COPY_ARGS(p,r) ((p) && SVN_IS_VALID_REVNUM(r))
-#if 0
-#define LDR_DBG(x) SVN_DBG(x)
-#else
-#define LDR_DBG(x) while(0)
-#endif
/* A directory baton used by all directory-related callback functions
* in the dump editor. */
struct dir_baton
{
struct dump_edit_baton *eb;
- struct dir_baton *parent_dir_baton;
/* Pool for per-directory allocations */
apr_pool_t *pool;
- /* is this directory a new addition to this revision? */
- svn_boolean_t added;
-
- /* has this directory been written to the output stream? */
- svn_boolean_t written_out;
-
/* the path to this directory */
const char *repos_relpath; /* a relpath */
@@ -68,6 +57,9 @@ struct dir_baton
const char *copyfrom_path; /* a relpath */
svn_revnum_t copyfrom_rev;
+ /* Headers accumulated so far for this directory */
+ svn_repos__dumpfile_headers_t *headers;
+
/* Properties which were modified during change_dir_prop. */
apr_hash_t *props;
@@ -80,9 +72,8 @@ struct dir_baton
us, although they're all really within this directory. */
apr_hash_t *deleted_entries;
- /* Flags to trigger dumping props and record termination newlines. */
+ /* Flag to trigger dumping props. */
svn_boolean_t dump_props;
- svn_boolean_t dump_newlines;
};
/* A file baton used by all file-related callback functions in the dump
@@ -90,7 +81,6 @@ struct dir_baton
struct file_baton
{
struct dump_edit_baton *eb;
- struct dir_baton *parent_dir_baton;
/* Pool for per-file allocations */
apr_pool_t *pool;
@@ -120,13 +110,6 @@ struct file_baton
svn_boolean_t dump_props;
};
-/* A handler baton to be used in window_handler(). */
-struct handler_baton
-{
- svn_txdelta_window_handler_t apply_handler;
- void *apply_baton;
-};
-
/* The baton used by the dump editor. */
struct dump_edit_baton {
/* The output stream we write the dumpfile to */
@@ -155,11 +138,10 @@ struct dump_edit_baton {
/* The revision we're currently dumping. */
svn_revnum_t current_revision;
- /* The kind (file or directory) and baton of the item whose block of
+ /* The baton of the directory node whose block of
dump stream data has not been fully completed; NULL if there's no
such item. */
- svn_node_kind_t pending_kind;
- void *pending_baton;
+ struct dir_baton *pending_db;
};
/* Make a directory baton to represent the directory at PATH (relative
@@ -171,16 +153,15 @@ struct dump_edit_baton {
* copy source.
*
* PB is the directory baton of this directory's parent, or NULL if
- * this is the top-level directory of the edit. ADDED indicates if
- * this directory is newly added in this revision. Perform all
- * allocations in POOL. */
+ * this is the top-level directory of the edit.
+ *
+ * Perform all allocations in POOL. */
static struct dir_baton *
make_dir_baton(const char *path,
const char *copyfrom_path,
svn_revnum_t copyfrom_rev,
void *edit_baton,
struct dir_baton *pb,
- svn_boolean_t added,
apr_pool_t *pool)
{
struct dump_edit_baton *eb = edit_baton;
@@ -199,15 +180,13 @@ make_dir_baton(const char *path,
copyfrom_path = svn_relpath_canonicalize(copyfrom_path, pool);
new_db->eb = eb;
- new_db->parent_dir_baton = pb;
new_db->pool = pool;
new_db->repos_relpath = repos_relpath;
new_db->copyfrom_path = copyfrom_path
? svn_relpath_canonicalize(copyfrom_path, pool)
: NULL;
new_db->copyfrom_rev = copyfrom_rev;
- new_db->added = added;
- new_db->written_out = FALSE;
+ new_db->headers = NULL;
new_db->props = apr_hash_make(pool);
new_db->deleted_props = apr_hash_make(pool);
new_db->deleted_entries = apr_hash_make(pool);
@@ -227,7 +206,6 @@ make_file_baton(const char *path,
struct file_baton *new_fb = apr_pcalloc(pool, sizeof(*new_fb));
new_fb->eb = pb->eb;
- new_fb->parent_dir_baton = pb;
new_fb->pool = pool;
new_fb->repos_relpath = svn_relpath_canonicalize(path, pool);
new_fb->props = apr_hash_make(pool);
@@ -240,9 +218,11 @@ make_file_baton(const char *path,
return new_fb;
}
-/* Return in *HEADER and *CONTENT the headers and content for PROPS. */
+/* Append to HEADERS the required headers, and set *CONTENT to the property
+ * content section, to represent the property delta of PROPS/DELETED_PROPS.
+ */
static svn_error_t *
-get_props_content(svn_stringbuf_t **header,
+get_props_content(svn_repos__dumpfile_headers_t *headers,
svn_stringbuf_t **content,
apr_hash_t *props,
apr_hash_t *deleted_props,
@@ -251,10 +231,8 @@ get_props_content(svn_stringbuf_t **header,
{
svn_stream_t *content_stream;
apr_hash_t *normal_props;
- const char *buf;
*content = svn_stringbuf_create_empty(result_pool);
- *header = svn_stringbuf_create_empty(result_pool);
content_stream = svn_stream_from_stringbuf(*content, scratch_pool);
@@ -265,101 +243,63 @@ get_props_content(svn_stringbuf_t **header,
SVN_ERR(svn_stream_close(content_stream));
/* Prop-delta: true */
- *header = svn_stringbuf_createf(result_pool, SVN_REPOS_DUMPFILE_PROP_DELTA
- ": true\n");
-
- /* Prop-content-length: 193 */
- buf = apr_psprintf(scratch_pool, SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n", (*content)->len);
- svn_stringbuf_appendcstr(*header, buf);
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_PROP_DELTA, "true");
return SVN_NO_ERROR;
}
-/* Extract and dump properties stored in PROPS and property deletions
- * stored in DELETED_PROPS. If TRIGGER_VAR is not NULL, it is set to
- * FALSE.
+/* A special case of dump_node(), for a delete record.
*
- * If PROPSTRING is non-NULL, set *PROPSTRING to a string containing
- * the content block of the property changes; otherwise, dump that to
- * the stream, too.
+ * The only thing special about this version is it only writes one blank
+ * line, not two, after the headers. Why? Historical precedent for the
+ * case where a delete record is used as part of a (delete + add-with-history)
+ * in implementing a replacement.
*/
static svn_error_t *
-do_dump_props(svn_stringbuf_t **propstring,
- svn_stream_t *stream,
- apr_hash_t *props,
- apr_hash_t *deleted_props,
- svn_boolean_t *trigger_var,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+dump_node_delete(svn_stream_t *stream,
+ const char *node_relpath,
+ apr_pool_t *pool)
{
- svn_stringbuf_t *header;
- svn_stringbuf_t *content;
- apr_size_t len;
+ svn_repos__dumpfile_headers_t *headers
+ = svn_repos__dumpfile_headers_create(pool);
- if (trigger_var && !*trigger_var)
- return SVN_NO_ERROR;
-
- SVN_ERR(get_props_content(&header, &content, props, deleted_props,
- result_pool, scratch_pool));
- len = header->len;
- SVN_ERR(svn_stream_write(stream, header->data, &len));
+ assert(svn_relpath_is_canonical(node_relpath));
- if (propstring)
- {
- *propstring = content;
- }
- else
- {
- /* Content-length: 14 */
- SVN_ERR(svn_stream_printf(stream, scratch_pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n\n",
- content->len));
-
- len = content->len;
- SVN_ERR(svn_stream_write(stream, content->data, &len));
-
- /* No text is going to be dumped. Write a couple of newlines and
- wait for the next node/ revision. */
- SVN_ERR(svn_stream_puts(stream, "\n\n"));
-
- /* Cleanup so that data is never dumped twice. */
- apr_hash_clear(props);
- apr_hash_clear(deleted_props);
- if (trigger_var)
- *trigger_var = FALSE;
- }
+ /* Node-path: ... */
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_PATH, node_relpath);
- return SVN_NO_ERROR;
-}
+ /* Node-action: delete */
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete");
-static svn_error_t *
-do_dump_newlines(struct dump_edit_baton *eb,
- svn_boolean_t *trigger_var,
- apr_pool_t *pool)
-{
- if (trigger_var && *trigger_var)
- {
- SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
- *trigger_var = FALSE;
- }
+ SVN_ERR(svn_repos__dump_node_record(stream, headers,
+ NULL, FALSE, 0, /* props & text */
+ FALSE /*content_length_always*/, pool));
return SVN_NO_ERROR;
}
-/*
- * Write out a node record for PATH of type KIND under EB->FS_ROOT.
+/* Set *HEADERS_P to contain some headers for the node at PATH of type KIND.
+ *
* ACTION describes what is happening to the node (see enum
- * svn_node_action). Write record to writable EB->STREAM, using
- * EB->BUFFER to write in chunks.
+ * svn_node_action).
*
* If the node was itself copied, IS_COPY is TRUE and the
* path/revision of the copy source are in COPYFROM_PATH/COPYFROM_REV.
* If IS_COPY is FALSE, yet COPYFROM_PATH/COPYFROM_REV are valid, this
* node is part of a copied subtree.
+ *
+ * Iff ACTION is svn_node_action_replace and IS_COPY, then first write a
+ * complete deletion record to the dump stream.
+ *
+ * If ACTION is svn_node_action_delete, then the node record will be
+ * complete. (The caller may want to write two blank lines after the
+ * header block.)
*/
static svn_error_t *
-dump_node(struct dump_edit_baton *eb,
+dump_node(svn_repos__dumpfile_headers_t **headers_p,
+ struct dump_edit_baton *eb,
const char *repos_relpath,
struct dir_baton *db,
struct file_baton *fb,
@@ -370,6 +310,8 @@ dump_node(struct dump_edit_baton *eb,
apr_pool_t *pool)
{
const char *node_relpath = repos_relpath;
+ svn_repos__dumpfile_headers_t *headers
+ = svn_repos__dumpfile_headers_create(pool);
assert(svn_relpath_is_canonical(repos_relpath));
assert(!copyfrom_path || svn_relpath_is_canonical(copyfrom_path));
@@ -381,17 +323,16 @@ dump_node(struct dump_edit_baton *eb,
node_relpath, pool);
/* Node-path: ... */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_PATH ": %s\n",
- node_relpath));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_PATH, node_relpath);
/* Node-kind: "file" | "dir" */
if (fb)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_KIND ": file\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_KIND, "file");
else if (db)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_KIND ": dir\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_KIND, "dir");
/* Write the appropriate Node-action header */
@@ -403,26 +344,22 @@ dump_node(struct dump_edit_baton *eb,
do here but print node action information.
Node-action: change. */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": change\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "change");
+ break;
+
+ case svn_node_action_delete:
+ /* Node-action: delete */
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete");
break;
case svn_node_action_replace:
- if (is_copy)
- {
- /* Delete the original, and then re-add the replacement as a
- copy using recursive calls into this function. */
- SVN_ERR(dump_node(eb, repos_relpath, db, fb, svn_node_action_delete,
- FALSE, NULL, SVN_INVALID_REVNUM, pool));
- SVN_ERR(dump_node(eb, repos_relpath, db, fb, svn_node_action_add,
- is_copy, copyfrom_path, copyfrom_rev, pool));
- }
- else
+ if (! is_copy)
{
/* Node-action: replace */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION
- ": replace\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "replace");
/* Wait for a change_*_prop to be called before dumping
anything */
@@ -430,45 +367,36 @@ dump_node(struct dump_edit_baton *eb,
fb->dump_props = TRUE;
else if (db)
db->dump_props = TRUE;
+ break;
}
- break;
-
- case svn_node_action_delete:
- /* Node-action: delete */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": delete\n"));
+ else
+ {
+ /* More complex case: is_copy is true, and copyfrom_path/
+ copyfrom_rev are present: delete the original, and then re-add
+ it */
+ /* ### Why not write a 'replace' record? Don't know. */
- /* We can leave this routine quietly now. Nothing more to do-
- print a couple of newlines because we're not dumping props or
- text. */
- SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
+ /* ### Unusually, we end this 'delete' node record with only a single
+ blank line after the header block -- no extra blank line. */
+ SVN_ERR(dump_node_delete(eb->stream, repos_relpath, pool));
- break;
+ /* The remaining action is a non-replacing add-with-history */
+ /* action = svn_node_action_add; */
+ }
+ /* FALL THROUGH to 'add' */
case svn_node_action_add:
/* Node-action: add */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": add\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "add");
if (is_copy)
{
/* Node-copyfrom-rev / Node-copyfrom-path */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV
- ": %ld\n"
- SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH
- ": %s\n",
- copyfrom_rev, copyfrom_path));
-
- /* Ugly hack: If a directory was copied from a previous
- revision, nothing like close_file() will be called to write two
- blank lines. If change_dir_prop() is called, props are dumped
- (along with the necessary PROPS-END\n\n and we're good. So
- set DUMP_NEWLINES here to print the newlines unless
- change_dir_prop() is called next otherwise the `svnadmin load`
- parser will fail. */
- if (db)
- db->dump_newlines = TRUE;
+ svn_repos__dumpfile_header_pushf(
+ headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV, "%ld", copyfrom_rev);
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH, copyfrom_path);
}
else
{
@@ -496,6 +424,11 @@ dump_node(struct dump_edit_baton *eb,
break;
}
+
+ /* Return the headers so far. We don't necessarily have all the headers
+ yet -- there may be property-related and content length headers to
+ come, if this was not a 'delete' record. */
+ *headers_p = headers;
return SVN_NO_ERROR;
}
@@ -504,35 +437,29 @@ dump_mkdir(struct dump_edit_baton *eb,
const char *repos_relpath,
apr_pool_t *pool)
{
- svn_stringbuf_t *prop_header, *prop_content;
- apr_size_t len;
- const char *buf;
+ svn_stringbuf_t *prop_content;
+ svn_repos__dumpfile_headers_t *headers
+ = svn_repos__dumpfile_headers_create(pool);
/* Node-path: ... */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_PATH ": %s\n",
- repos_relpath));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_PATH, repos_relpath);
/* Node-kind: dir */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_NODE_KIND ": dir\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_KIND, "dir");
/* Node-action: add */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_NODE_ACTION ": add\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "add");
/* Dump the (empty) property block. */
- SVN_ERR(get_props_content(&prop_header, &prop_content,
+ SVN_ERR(get_props_content(headers, &prop_content,
apr_hash_make(pool), apr_hash_make(pool),
pool, pool));
- len = prop_header->len;
- SVN_ERR(svn_stream_write(eb->stream, prop_header->data, &len));
- len = prop_content->len;
- buf = apr_psprintf(pool, SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n", len);
- SVN_ERR(svn_stream_puts(eb->stream, buf));
- SVN_ERR(svn_stream_puts(eb->stream, "\n"));
- SVN_ERR(svn_stream_write(eb->stream, prop_content->data, &len));
+ SVN_ERR(svn_repos__dump_node_record(eb->stream, headers, prop_content,
+ FALSE, 0, FALSE /*content_length_always*/,
+ pool));
/* Newlines to tie it all off. */
SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
@@ -540,40 +467,43 @@ dump_mkdir(struct dump_edit_baton *eb,
return SVN_NO_ERROR;
}
-/* Dump pending items from the specified node, to allow starting the dump
- of a child node */
+/* Dump pending headers and properties for the directory EB->pending_db (if
+ * not null), to allow starting the dump of a child node */
static svn_error_t *
-dump_pending(struct dump_edit_baton *eb,
- apr_pool_t *scratch_pool)
+dump_pending_dir(struct dump_edit_baton *eb,
+ apr_pool_t *scratch_pool)
{
- if (! eb->pending_baton)
+ struct dir_baton *db = eb->pending_db;
+ svn_stringbuf_t *prop_content = NULL;
+
+ if (! db)
return SVN_NO_ERROR;
- if (eb->pending_kind == svn_node_dir)
+ /* Some pending properties to dump? */
+ if (db->dump_props)
{
- struct dir_baton *db = eb->pending_baton;
+ SVN_ERR(get_props_content(db->headers, &prop_content,
+ db->props, db->deleted_props,
+ scratch_pool, scratch_pool));
+ }
+ SVN_ERR(svn_repos__dump_node_record(eb->stream, db->headers, prop_content,
+ FALSE, 0, FALSE /*content_length_always*/,
+ scratch_pool));
- /* Some pending properties to dump? */
- SVN_ERR(do_dump_props(NULL, eb->stream, db->props, db->deleted_props,
- &(db->dump_props), db->pool, scratch_pool));
+ /* No text is going to be dumped. Write a couple of newlines and
+ wait for the next node/ revision. */
+ SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
- /* Some pending newlines to dump? */
- SVN_ERR(do_dump_newlines(eb, &(db->dump_newlines), scratch_pool));
- }
- else if (eb->pending_kind == svn_node_file)
+ if (db->dump_props)
{
- struct file_baton *fb = eb->pending_baton;
-
- /* Some pending properties to dump? */
- SVN_ERR(do_dump_props(NULL, eb->stream, fb->props, fb->deleted_props,
- &(fb->dump_props), fb->pool, scratch_pool));
+ /* Cleanup so that data is never dumped twice. */
+ apr_hash_clear(db->props);
+ apr_hash_clear(db->deleted_props);
+ db->dump_props = FALSE;
}
- else
- abort();
/* Anything that was pending is pending no longer. */
- eb->pending_baton = NULL;
- eb->pending_kind = svn_node_none;
+ eb->pending_db = NULL;
return SVN_NO_ERROR;
}
@@ -594,8 +524,6 @@ open_root(void *edit_baton,
/* Clear the per-revision pool after each revision */
svn_pool_clear(eb->pool);
- LDR_DBG(("open_root %p\n", *root_baton));
-
if (eb->update_anchor_relpath)
{
int i;
@@ -628,16 +556,15 @@ open_root(void *edit_baton,
/* ... but for the source directory itself, we'll defer
to letting the typical plumbing handle this task. */
new_db = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM,
- edit_baton, NULL, TRUE, pool);
- SVN_ERR(dump_node(eb, new_db->repos_relpath, new_db,
+ edit_baton, NULL, pool);
+ SVN_ERR(dump_node(&new_db->headers,
+ eb, new_db->repos_relpath, new_db,
NULL, svn_node_action_add, FALSE,
NULL, SVN_INVALID_REVNUM, pool));
/* Remember that we've started but not yet finished
handling this directory. */
- new_db->written_out = TRUE;
- eb->pending_baton = new_db;
- eb->pending_kind = svn_node_dir;
+ eb->pending_db = new_db;
}
}
svn_pool_destroy(iterpool);
@@ -646,7 +573,7 @@ open_root(void *edit_baton,
if (! new_db)
{
new_db = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM,
- edit_baton, NULL, FALSE, pool);
+ edit_baton, NULL, pool);
}
*root_baton = new_db;
@@ -661,15 +588,13 @@ delete_entry(const char *path,
{
struct dir_baton *pb = parent_baton;
- LDR_DBG(("delete_entry %s\n", path));
-
- SVN_ERR(dump_pending(pb->eb, pool));
+ SVN_ERR(dump_pending_dir(pb->eb, pool));
/* We don't dump this deletion immediate. Rather, we add this path
to the deleted_entries of the parent directory baton. That way,
we can tell (later) an addition from a replacement. All the real
deletions get handled in close_directory(). */
- svn_hash_sets(pb->deleted_entries, apr_pstrdup(pb->eb->pool, path), pb);
+ svn_hash_sets(pb->deleted_entries, apr_pstrdup(pb->pool, path), pb);
return SVN_NO_ERROR;
}
@@ -683,40 +608,37 @@ add_directory(const char *path,
void **child_baton)
{
struct dir_baton *pb = parent_baton;
- void *val;
+ void *was_deleted;
struct dir_baton *new_db;
svn_boolean_t is_copy;
- LDR_DBG(("add_directory %s\n", path));
-
- SVN_ERR(dump_pending(pb->eb, pool));
+ SVN_ERR(dump_pending_dir(pb->eb, pool));
new_db = make_dir_baton(path, copyfrom_path, copyfrom_rev, pb->eb,
- pb, TRUE, pb->eb->pool);
+ pb, pb->pool);
/* This might be a replacement -- is the path already deleted? */
- val = svn_hash_gets(pb->deleted_entries, path);
+ was_deleted = svn_hash_gets(pb->deleted_entries, path);
/* Detect an add-with-history */
is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev);
/* Dump the node */
- SVN_ERR(dump_node(pb->eb, new_db->repos_relpath, new_db, NULL,
- val ? svn_node_action_replace : svn_node_action_add,
+ SVN_ERR(dump_node(&new_db->headers,
+ pb->eb, new_db->repos_relpath, new_db, NULL,
+ was_deleted ? svn_node_action_replace : svn_node_action_add,
is_copy,
is_copy ? new_db->copyfrom_path : NULL,
is_copy ? copyfrom_rev : SVN_INVALID_REVNUM,
pool));
- if (val)
+ if (was_deleted)
/* Delete the path, it's now been dumped */
svn_hash_sets(pb->deleted_entries, path, NULL);
/* Remember that we've started, but not yet finished handling this
directory. */
- new_db->written_out = TRUE;
- pb->eb->pending_baton = new_db;
- pb->eb->pending_kind = svn_node_dir;
+ pb->eb->pending_db = new_db;
*child_baton = new_db;
return SVN_NO_ERROR;
@@ -734,9 +656,7 @@ open_directory(const char *path,
const char *copyfrom_path = NULL;
svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM;
- LDR_DBG(("open_directory %s\n", path));
-
- SVN_ERR(dump_pending(pb->eb, pool));
+ SVN_ERR(dump_pending_dir(pb->eb, pool));
/* If the parent directory has explicit comparison path and rev,
record the same for this one. */
@@ -744,12 +664,12 @@ open_directory(const char *path,
{
copyfrom_path = svn_relpath_join(pb->copyfrom_path,
svn_relpath_basename(path, NULL),
- pb->eb->pool);
+ pb->pool);
copyfrom_rev = pb->copyfrom_rev;
}
new_db = make_dir_baton(path, copyfrom_path, copyfrom_rev, pb->eb, pb,
- FALSE, pb->eb->pool);
+ pb->pool);
*child_baton = new_db;
return SVN_NO_ERROR;
@@ -763,12 +683,10 @@ close_directory(void *dir_baton,
apr_hash_index_t *hi;
svn_boolean_t this_pending;
- LDR_DBG(("close_directory %p\n", dir_baton));
-
/* Remember if this directory is the one currently pending. */
- this_pending = (db->eb->pending_baton == db);
+ this_pending = (db->eb->pending_db == db);
- SVN_ERR(dump_pending(db->eb, pool));
+ SVN_ERR(dump_pending_dir(db->eb, pool));
/* If this directory was pending, then dump_pending() should have
taken care of all the props and such. Of course, the only way
@@ -781,22 +699,23 @@ close_directory(void *dir_baton,
directory. */
if ((! this_pending) && (db->dump_props))
{
- SVN_ERR(dump_node(db->eb, db->repos_relpath, db, NULL,
+ SVN_ERR(dump_node(&db->headers,
+ db->eb, db->repos_relpath, db, NULL,
svn_node_action_change, FALSE,
NULL, SVN_INVALID_REVNUM, pool));
- db->eb->pending_baton = db;
- db->eb->pending_kind = svn_node_dir;
- SVN_ERR(dump_pending(db->eb, pool));
+ db->eb->pending_db = db;
+ SVN_ERR(dump_pending_dir(db->eb, pool));
}
/* Dump the deleted directory entries */
for (hi = apr_hash_first(pool, db->deleted_entries); hi;
hi = apr_hash_next(hi))
{
- const char *path = svn__apr_hash_index_key(hi);
+ const char *path = apr_hash_this_key(hi);
- SVN_ERR(dump_node(db->eb, path, NULL, NULL, svn_node_action_delete,
- FALSE, NULL, SVN_INVALID_REVNUM, pool));
+ SVN_ERR(dump_node_delete(db->eb->stream, path, pool));
+ /* This deletion record is complete -- write an extra newline */
+ SVN_ERR(svn_stream_puts(db->eb->stream, "\n"));
}
/* ### should be unnecessary */
@@ -815,17 +734,15 @@ add_file(const char *path,
{
struct dir_baton *pb = parent_baton;
struct file_baton *fb;
- void *val;
+ void *was_deleted;
- LDR_DBG(("add_file %s\n", path));
-
- SVN_ERR(dump_pending(pb->eb, pool));
+ SVN_ERR(dump_pending_dir(pb->eb, pool));
/* Make the file baton. */
fb = make_file_baton(path, pb, pool);
/* This might be a replacement -- is the path already deleted? */
- val = svn_hash_gets(pb->deleted_entries, path);
+ was_deleted = svn_hash_gets(pb->deleted_entries, path);
/* Detect add-with-history. */
if (ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev))
@@ -834,10 +751,10 @@ add_file(const char *path,
fb->copyfrom_rev = copyfrom_rev;
fb->is_copy = TRUE;
}
- fb->action = val ? svn_node_action_replace : svn_node_action_add;
+ fb->action = was_deleted ? svn_node_action_replace : svn_node_action_add;
/* Delete the path, it's now been dumped. */
- if (val)
+ if (was_deleted)
svn_hash_sets(pb->deleted_entries, path, NULL);
*file_baton = fb;
@@ -854,9 +771,7 @@ open_file(const char *path,
struct dir_baton *pb = parent_baton;
struct file_baton *fb;
- LDR_DBG(("open_file %s\n", path));
-
- SVN_ERR(dump_pending(pb->eb, pool));
+ SVN_ERR(dump_pending_dir(pb->eb, pool));
/* Make the file baton. */
fb = make_file_baton(path, pb, pool);
@@ -867,7 +782,7 @@ open_file(const char *path,
{
fb->copyfrom_path = svn_relpath_join(pb->copyfrom_path,
svn_relpath_basename(path, NULL),
- pb->eb->pool);
+ pb->pool);
fb->copyfrom_rev = pb->copyfrom_rev;
}
@@ -884,13 +799,11 @@ change_dir_prop(void *parent_baton,
struct dir_baton *db = parent_baton;
svn_boolean_t this_pending;
- LDR_DBG(("change_dir_prop %p\n", parent_baton));
-
/* This directory is not pending, but something else is, so handle
the "something else". */
- this_pending = (db->eb->pending_baton == db);
+ this_pending = (db->eb->pending_db == db);
if (! this_pending)
- SVN_ERR(dump_pending(db->eb, pool));
+ SVN_ERR(dump_pending_dir(db->eb, pool));
if (svn_property_kind2(name) != svn_prop_regular_kind)
return SVN_NO_ERROR;
@@ -902,9 +815,7 @@ change_dir_prop(void *parent_baton,
else
svn_hash_sets(db->deleted_props, apr_pstrdup(db->pool, name), "");
- /* Make sure we eventually output the props, and disable printing
- a couple of extra newlines */
- db->dump_newlines = FALSE;
+ /* Make sure we eventually output the props */
db->dump_props = TRUE;
return SVN_NO_ERROR;
@@ -918,8 +829,6 @@ change_file_prop(void *file_baton,
{
struct file_baton *fb = file_baton;
- LDR_DBG(("change_file_prop %p\n", file_baton));
-
if (svn_property_kind2(name) != svn_prop_regular_kind)
return SVN_NO_ERROR;
@@ -939,22 +848,6 @@ change_file_prop(void *file_baton,
}
static svn_error_t *
-window_handler(svn_txdelta_window_t *window, void *baton)
-{
- struct handler_baton *hb = baton;
- static svn_error_t *err;
-
- err = hb->apply_handler(window, hb->apply_baton);
- if (window != NULL && !err)
- return SVN_NO_ERROR;
-
- if (err)
- SVN_ERR(err);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
apply_textdelta(void *file_baton, const char *base_checksum,
apr_pool_t *pool,
svn_txdelta_window_handler_t *handler,
@@ -962,31 +855,19 @@ apply_textdelta(void *file_baton, const char *base_checksum,
{
struct file_baton *fb = file_baton;
struct dump_edit_baton *eb = fb->eb;
- struct handler_baton *hb;
svn_stream_t *delta_filestream;
- LDR_DBG(("apply_textdelta %p\n", file_baton));
-
- /* This is custom handler_baton, allocated from a separate pool. */
- hb = apr_pcalloc(eb->pool, sizeof(*hb));
-
/* Use a temporary file to measure the Text-content-length */
delta_filestream = svn_stream_from_aprfile2(eb->delta_file, TRUE, pool);
/* Prepare to write the delta to the delta_filestream */
- svn_txdelta_to_svndiff3(&(hb->apply_handler), &(hb->apply_baton),
+ svn_txdelta_to_svndiff3(handler, handler_baton,
delta_filestream, 0,
SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, pool);
/* Record that there's text to be dumped, and its base checksum. */
fb->dump_text = TRUE;
- fb->base_checksum = apr_pstrdup(eb->pool, base_checksum);
-
- /* The actual writing takes place when this function has
- finished. Set handler and handler_baton now so for
- window_handler() */
- *handler = window_handler;
- *handler_baton = hb;
+ fb->base_checksum = apr_pstrdup(fb->pool, base_checksum);
return SVN_NO_ERROR;
}
@@ -999,22 +880,25 @@ close_file(void *file_baton,
struct file_baton *fb = file_baton;
struct dump_edit_baton *eb = fb->eb;
apr_finfo_t *info = apr_pcalloc(pool, sizeof(apr_finfo_t));
- svn_stringbuf_t *propstring;
+ svn_stringbuf_t *propstring = NULL;
+ svn_repos__dumpfile_headers_t *headers;
- LDR_DBG(("close_file %p\n", file_baton));
+ SVN_ERR(dump_pending_dir(eb, pool));
- SVN_ERR(dump_pending(eb, pool));
-
- /* Dump the node. */
- SVN_ERR(dump_node(eb, fb->repos_relpath, NULL, fb,
+ /* Start dumping this node, by collecting some basic headers for it. */
+ SVN_ERR(dump_node(&headers, eb, fb->repos_relpath, NULL, fb,
fb->action, fb->is_copy, fb->copyfrom_path,
fb->copyfrom_rev, pool));
/* Some pending properties to dump? We'll dump just the headers for
now, then dump the actual propchange content only after dumping
the text headers too (if present). */
- SVN_ERR(do_dump_props(&propstring, eb->stream, fb->props, fb->deleted_props,
- &(fb->dump_props), pool, pool));
+ if (fb->dump_props)
+ {
+ SVN_ERR(get_props_content(headers, &propstring,
+ fb->props, fb->deleted_props,
+ pool, pool));
+ }
/* Dump the text headers */
if (fb->dump_text)
@@ -1022,9 +906,8 @@ close_file(void *file_baton,
apr_status_t err;
/* Text-delta: true */
- SVN_ERR(svn_stream_puts(eb->stream,
- SVN_REPOS_DUMPFILE_TEXT_DELTA
- ": true\n"));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_DELTA, "true");
err = apr_file_info_get(info, APR_FINFO_SIZE, eb->delta_file);
if (err)
@@ -1032,43 +915,22 @@ close_file(void *file_baton,
if (fb->base_checksum)
/* Text-delta-base-md5: */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5
- ": %s\n",
- fb->base_checksum));
-
- /* Text-content-length: 39 */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH
- ": %lu\n",
- (unsigned long)info->size));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5, fb->base_checksum);
/* Text-content-md5: 82705804337e04dcd0e586bfa2389a7f */
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5
- ": %s\n",
- text_checksum));
+ svn_repos__dumpfile_header_push(
+ headers, SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5, text_checksum);
}
- /* Content-length: 1549 */
- /* If both text and props are absent, skip this header */
- if (fb->dump_props)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %ld\n\n",
- (unsigned long)info->size + propstring->len));
- else if (fb->dump_text)
- SVN_ERR(svn_stream_printf(eb->stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %ld\n\n",
- (unsigned long)info->size));
-
- /* Dump the props now */
+ /* Dump the headers and props now */
+ SVN_ERR(svn_repos__dump_node_record(eb->stream, headers, propstring,
+ fb->dump_text, info->size,
+ FALSE /*content_length_always*/,
+ pool));
+
if (fb->dump_props)
{
- SVN_ERR(svn_stream_write(eb->stream, propstring->data,
- &(propstring->len)));
-
/* Cleanup */
fb->dump_props = FALSE;
apr_hash_clear(fb->props);
@@ -1235,7 +1097,7 @@ svn_rdump__get_dump_editor(const svn_delta_editor_t **editor,
eb->ra_session = ra_session;
eb->update_anchor_relpath = update_anchor_relpath;
eb->current_revision = revision;
- eb->pending_kind = svn_node_none;
+ eb->pending_db = NULL;
/* Create a special per-revision pool */
eb->pool = svn_pool_create(pool);
diff --git a/subversion/svnrdump/load_editor.c b/subversion/svnrdump/load_editor.c
index c35a289..15dac6e 100644
--- a/subversion/svnrdump/load_editor.c
+++ b/subversion/svnrdump/load_editor.c
@@ -43,14 +43,7 @@
#define ARE_VALID_COPY_ARGS(p,r) ((p) && SVN_IS_VALID_REVNUM(r))
-#if 0
-#define LDR_DBG(x) SVN_DBG(x)
-#else
-#define LDR_DBG(x) while(0)
-#endif
-
-
/**
* General baton used by the parser functions.
*/
@@ -68,9 +61,6 @@ struct parse_baton
/* To bleep, or not to bleep? (What kind of question is that?) */
svn_boolean_t quiet;
- /* UUID found in the dumpstream, if any; NULL otherwise. */
- const char *uuid;
-
/* Root URL of the target repository. */
const char *root_url;
@@ -93,17 +83,20 @@ struct parse_baton
/* The oldest revision loaded from the dump stream, or
SVN_INVALID_REVNUM if none have been loaded. */
svn_revnum_t oldest_dumpstream_rev;
+
+ /* An hash containing specific revision properties to skip while
+ loading. */
+ apr_hash_t *skip_revprops;
};
/**
* Use to wrap the dir_context_t in commit.c so we can keep track of
- * depth, relpath and parent for open_directory and close_directory.
+ * relpath and parent for open_directory and close_directory.
*/
struct directory_baton
{
void *baton;
const char *relpath;
- int depth;
/* The copy-from source of this directory, no matter whether it is
copied explicitly (the root node of a copy) or implicitly (being an
@@ -190,160 +183,6 @@ get_revision_mapping(apr_hash_t *rev_map,
}
-/* Prepend the mergeinfo source paths in MERGEINFO_ORIG with
- PARENT_DIR, and return it in *MERGEINFO_VAL. */
-/* ### FIXME: Consider somehow sharing code with
- ### libsvn_repos/load-fs-vtable.c:prefix_mergeinfo_paths() */
-static svn_error_t *
-prefix_mergeinfo_paths(svn_string_t **mergeinfo_val,
- const svn_string_t *mergeinfo_orig,
- const char *parent_dir,
- apr_pool_t *pool)
-{
- apr_hash_t *prefixed_mergeinfo, *mergeinfo;
- apr_hash_index_t *hi;
- void *rangelist;
-
- SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_orig->data, pool));
- prefixed_mergeinfo = apr_hash_make(pool);
- for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
- {
- const void *key;
- const char *path, *merge_source;
-
- apr_hash_this(hi, &key, NULL, &rangelist);
- merge_source = svn_relpath_canonicalize(key, pool);
-
- /* The svn:mergeinfo property syntax demands a repos abspath */
- path = svn_fspath__canonicalize(svn_relpath_join(parent_dir,
- merge_source, pool),
- pool);
- svn_hash_sets(prefixed_mergeinfo, path, rangelist);
- }
- return svn_mergeinfo_to_string(mergeinfo_val, prefixed_mergeinfo, pool);
-}
-
-
-/* Examine the mergeinfo in INITIAL_VAL, renumber revisions in rangelists
- as appropriate, and return the (possibly new) mergeinfo in *FINAL_VAL
- (allocated from POOL). */
-/* ### FIXME: Consider somehow sharing code with
- ### libsvn_repos/load-fs-vtable.c:renumber_mergeinfo_revs() */
-static svn_error_t *
-renumber_mergeinfo_revs(svn_string_t **final_val,
- const svn_string_t *initial_val,
- struct revision_baton *rb,
- apr_pool_t *pool)
-{
- apr_pool_t *subpool = svn_pool_create(pool);
- svn_mergeinfo_t mergeinfo, predates_stream_mergeinfo;
- svn_mergeinfo_t final_mergeinfo = apr_hash_make(subpool);
- apr_hash_index_t *hi;
-
- SVN_ERR(svn_mergeinfo_parse(&mergeinfo, initial_val->data, subpool));
-
- /* Issue #3020
- http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16
- Remove mergeinfo older than the oldest revision in the dump stream
- and adjust its revisions by the difference between the head rev of
- the target repository and the current dump stream rev. */
- if (rb->pb->oldest_dumpstream_rev > 1)
- {
- SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
- &predates_stream_mergeinfo, mergeinfo,
- rb->pb->oldest_dumpstream_rev - 1, 0,
- TRUE, subpool, subpool));
- SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
- &mergeinfo, mergeinfo,
- rb->pb->oldest_dumpstream_rev - 1, 0,
- FALSE, subpool, subpool));
- SVN_ERR(svn_mergeinfo__adjust_mergeinfo_rangelists(
- &predates_stream_mergeinfo,
- predates_stream_mergeinfo,
- -rb->rev_offset, subpool, subpool));
- }
- else
- {
- predates_stream_mergeinfo = NULL;
- }
-
- for (hi = apr_hash_first(subpool, mergeinfo); hi; hi = apr_hash_next(hi))
- {
- svn_rangelist_t *rangelist;
- struct parse_baton *pb = rb->pb;
- int i;
- const void *path;
- apr_ssize_t pathlen;
- void *val;
-
- apr_hash_this(hi, &path, &pathlen, &val);
- rangelist = val;
-
- /* Possibly renumber revisions in merge source's rangelist. */
- for (i = 0; i < rangelist->nelts; i++)
- {
- svn_revnum_t rev_from_map;
- svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, i,
- svn_merge_range_t *);
- rev_from_map = get_revision_mapping(pb->rev_map, range->start);
- if (SVN_IS_VALID_REVNUM(rev_from_map))
- {
- range->start = rev_from_map;
- }
- else if (range->start == pb->oldest_dumpstream_rev - 1)
- {
- /* Since the start revision of svn_merge_range_t are not
- inclusive there is one possible valid start revision that
- won't be found in the PB->REV_MAP mapping of load stream
- revsions to loaded revisions: The revision immediately
- preceeding the oldest revision from the load stream.
- This is a valid revision for mergeinfo, but not a valid
- copy from revision (which PB->REV_MAP also maps for) so it
- will never be in the mapping.
-
- If that is what we have here, then find the mapping for the
- oldest rev from the load stream and subtract 1 to get the
- renumbered, non-inclusive, start revision. */
- rev_from_map = get_revision_mapping(pb->rev_map,
- pb->oldest_dumpstream_rev);
- if (SVN_IS_VALID_REVNUM(rev_from_map))
- range->start = rev_from_map - 1;
- }
- else
- {
- /* If we can't remap the start revision then don't even bother
- trying to remap the end revision. It's possible we might
- actually succeed at the latter, which can result in invalid
- mergeinfo with a start rev > end rev. If that gets into the
- repository then a world of bustage breaks loose anytime that
- bogus mergeinfo is parsed. See
- http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16.
- */
- continue;
- }
-
- rev_from_map = get_revision_mapping(pb->rev_map, range->end);
- if (SVN_IS_VALID_REVNUM(rev_from_map))
- range->end = rev_from_map;
- }
- apr_hash_set(final_mergeinfo, path, pathlen, rangelist);
- }
-
- if (predates_stream_mergeinfo)
- {
- SVN_ERR(svn_mergeinfo_merge2(final_mergeinfo, predates_stream_mergeinfo,
- subpool, subpool));
- }
-
- SVN_ERR(svn_mergeinfo__canonicalize_ranges(final_mergeinfo, subpool));
-
- SVN_ERR(svn_mergeinfo_to_string(final_val, final_mergeinfo, pool));
- svn_pool_destroy(subpool);
-
- return SVN_NO_ERROR;
-}
-
-
static svn_error_t *
commit_callback(const svn_commit_info_t *commit_info,
void *baton,
@@ -564,8 +403,8 @@ new_revision_record(void **revision_baton,
for (hi = apr_hash_first(pool, headers); hi; hi = apr_hash_next(hi))
{
- const char *hname = svn__apr_hash_index_key(hi);
- const char *hval = svn__apr_hash_index_val(hi);
+ const char *hname = apr_hash_this_key(hi);
+ const char *hval = apr_hash_this_val(hi);
if (strcmp(hname, SVN_REPOS_DUMPFILE_REVISION_NUMBER) == 0)
rb->rev = atoi(hval);
@@ -606,9 +445,6 @@ uuid_record(const char *uuid,
void *parse_baton,
apr_pool_t *pool)
{
- struct parse_baton *pb;
- pb = parse_baton;
- pb->uuid = apr_pstrdup(pool, uuid);
return SVN_NO_ERROR;
}
@@ -704,8 +540,6 @@ new_node_record(void **node_baton,
rb->rev - rb->rev_offset - 1,
rb->pool, &child_baton));
- LDR_DBG(("Opened root %p\n", child_baton));
-
/* child_baton corresponds to the root directory baton here */
push_directory(rb, child_baton, "", TRUE /*is_added*/,
NULL, SVN_INVALID_REVNUM);
@@ -713,8 +547,8 @@ new_node_record(void **node_baton,
for (hi = apr_hash_first(rb->pool, headers); hi; hi = apr_hash_next(hi))
{
- const char *hname = svn__apr_hash_index_key(hi);
- const char *hval = svn__apr_hash_index_val(hi);
+ const char *hname = apr_hash_this_key(hi);
+ const char *hval = apr_hash_this_val(hi);
/* Parse the different kinds of headers we can encounter and
stuff them into the node_baton for writing later */
@@ -741,6 +575,9 @@ new_node_record(void **node_baton,
nb->copyfrom_path = apr_pstrdup(rb->pool, hval);
}
+ /* Before handling the new node, ensure depth-first editing order by
+ traversing the directory hierarchy from the old node's to the new
+ node's parent directory. */
nb_dirname = svn_relpath_dirname(nb->path, pool);
if (svn_path_compare_paths(nb_dirname,
rb->db->relpath) != 0)
@@ -751,9 +588,6 @@ new_node_record(void **node_baton,
int i;
apr_size_t n;
- /* Before attempting to handle the action, call open_directory
- for all the path components and set the directory baton
- accordingly */
ancestor_path =
svn_relpath_get_longest_ancestor(nb_dirname,
rb->db->relpath, pool);
@@ -771,7 +605,6 @@ new_node_record(void **node_baton,
/* Don't worry about destroying the actual rb->db object,
since the pool we're using has the lifetime of one
revision anyway */
- LDR_DBG(("Closing dir %p\n", rb->db->baton));
SVN_ERR(commit_editor->close_directory(rb->db->baton, rb->pool));
rb->db = rb->db->parent;
}
@@ -786,7 +619,6 @@ new_node_record(void **node_baton,
rb->db->baton,
rb->rev - rb->rev_offset - 1,
rb->pool, &child_baton));
- LDR_DBG(("Opened dir %p\n", child_baton));
push_directory(rb, child_baton, relpath_compose, TRUE /*is_added*/,
NULL, SVN_INVALID_REVNUM);
}
@@ -816,6 +648,7 @@ new_node_record(void **node_baton,
if (rb->pb->parent_dir)
nb->copyfrom_path = svn_relpath_join(rb->pb->parent_dir,
nb->copyfrom_path, rb->pool);
+ /* Convert to a URL, as the commit editor requires. */
nb->copyfrom_url = svn_path_url_add_component2(rb->pb->root_url,
nb->copyfrom_path,
rb->pool);
@@ -826,7 +659,6 @@ new_node_record(void **node_baton,
{
case svn_node_action_delete:
case svn_node_action_replace:
- LDR_DBG(("Deleting entry %s in %p\n", nb->path, rb->db->baton));
SVN_ERR(commit_editor->delete_entry(nb->path,
rb->rev - rb->rev_offset - 1,
rb->db->baton, rb->pool));
@@ -843,16 +675,12 @@ new_node_record(void **node_baton,
nb->copyfrom_url,
nb->copyfrom_rev,
rb->pool, &(nb->file_baton)));
- LDR_DBG(("Added file %s to dir %p as %p\n",
- nb->path, rb->db->baton, nb->file_baton));
break;
case svn_node_dir:
SVN_ERR(commit_editor->add_directory(nb->path, rb->db->baton,
nb->copyfrom_url,
nb->copyfrom_rev,
rb->pool, &child_baton));
- LDR_DBG(("Added dir %s to dir %p as %p\n",
- nb->path, rb->db->baton, child_baton));
push_directory(rb, child_baton, nb->path, TRUE /*is_added*/,
nb->copyfrom_path, nb->copyfrom_rev);
break;
@@ -896,11 +724,13 @@ set_revision_property(void *baton,
if (rb->rev > 0)
{
- svn_hash_sets(rb->revprop_table,
- apr_pstrdup(rb->pool, name),
- svn_string_dup(value, rb->pool));
+ if (! svn_hash_gets(rb->pb->skip_revprops, name))
+ svn_hash_sets(rb->revprop_table,
+ apr_pstrdup(rb->pool, name),
+ svn_string_dup(value, rb->pool));
}
- else if (rb->rev_offset == -1)
+ else if (rb->rev_offset == -1
+ && ! svn_hash_gets(rb->pb->skip_revprops, name))
{
/* Special case: set revision 0 properties directly (which is
safe because the commit_editor hasn't been created yet), but
@@ -925,51 +755,30 @@ set_node_property(void *baton,
const svn_string_t *value)
{
struct node_baton *nb = baton;
+ struct revision_baton *rb = nb->rb;
+ struct parse_baton *pb = rb->pb;
apr_pool_t *pool = nb->rb->pool;
svn_prop_t *prop;
if (value && strcmp(name, SVN_PROP_MERGEINFO) == 0)
{
- svn_string_t *renumbered_mergeinfo;
- svn_string_t prop_val;
-
- /* Tolerate mergeinfo with "\r\n" line endings because some
- dumpstream sources might contain as much. If so normalize
- the line endings to '\n' and make a notification to
- PARSE_BATON->FEEDBACK_STREAM that we have made this
- correction. */
- if (strstr(value->data, "\r"))
+ svn_string_t *new_value;
+ svn_error_t *err;
+
+ err = svn_repos__adjust_mergeinfo_property(&new_value, value,
+ pb->parent_dir,
+ pb->rev_map,
+ pb->oldest_dumpstream_rev,
+ rb->rev_offset,
+ NULL, NULL, /*notify*/
+ pool, pool);
+ if (err)
{
- const char *prop_eol_normalized;
-
- SVN_ERR(svn_subst_translate_cstring2(value->data,
- &prop_eol_normalized,
- "\n", /* translate to LF */
- FALSE, /* no repair */
- NULL, /* no keywords */
- FALSE, /* no expansion */
- pool));
- prop_val.data = prop_eol_normalized;
- prop_val.len = strlen(prop_eol_normalized);
- value = &prop_val;
-
- /* ### TODO: notify? */
+ return svn_error_quick_wrap(err,
+ _("Invalid svn:mergeinfo value"));
}
- /* Renumber mergeinfo as appropriate. */
- SVN_ERR(renumber_mergeinfo_revs(&renumbered_mergeinfo, value,
- nb->rb, pool));
- value = renumbered_mergeinfo;
-
- if (nb->rb->pb->parent_dir)
- {
- /* Prefix the merge source paths with PB->parent_dir. */
- /* ASSUMPTION: All source paths are included in the dump stream. */
- svn_string_t *mergeinfo_val;
- SVN_ERR(prefix_mergeinfo_paths(&mergeinfo_val, value,
- nb->rb->pb->parent_dir, pool));
- value = mergeinfo_val;
- }
+ value = new_value;
}
SVN_ERR(svn_rdump__normalize_prop(name, &value, pool));
@@ -978,7 +787,7 @@ set_node_property(void *baton,
prop = apr_palloc(nb->rb->pool, sizeof (*prop));
prop->name = apr_pstrdup(pool, name);
- prop->value = value ? svn_string_dup(value, pool) : NULL;
+ prop->value = svn_string_dup(value, pool);
svn_hash_sets(nb->prop_changes, prop->name, prop);
return SVN_NO_ERROR;
@@ -1024,7 +833,6 @@ remove_node_props(void *baton)
/* Find the path and revision that has the node's original properties */
if (ARE_VALID_COPY_ARGS(nb->copyfrom_path, nb->copyfrom_rev))
{
- LDR_DBG(("using nb->copyfrom %s@%ld", nb->copyfrom_path, nb->copyfrom_rev));
orig_path = nb->copyfrom_path;
orig_rev = nb->copyfrom_rev;
}
@@ -1033,8 +841,6 @@ remove_node_props(void *baton)
{
/* If this is a dir, then it's described by rb->db;
if this is a file, then it's a child of the dir in rb->db. */
- LDR_DBG(("using rb->db->copyfrom (k=%d) %s@%ld",
- nb->kind, rb->db->copyfrom_path, rb->db->copyfrom_rev));
orig_path = (nb->kind == svn_node_dir)
? rb->db->copyfrom_path
: svn_relpath_join(rb->db->copyfrom_path,
@@ -1044,13 +850,11 @@ remove_node_props(void *baton)
}
else
{
- LDR_DBG(("using self.path@head %s@%ld", nb->path, SVN_INVALID_REVNUM));
/* ### Should we query at a known, fixed, "head" revision number
instead of passing SVN_INVALID_REVNUM and getting a moving target? */
orig_path = nb->path;
orig_rev = SVN_INVALID_REVNUM;
}
- LDR_DBG(("Trying %s@%ld", orig_path, orig_rev));
if ((nb->action == svn_node_action_add
|| nb->action == svn_node_action_replace)
@@ -1071,7 +875,7 @@ remove_node_props(void *baton)
for (hi = apr_hash_first(pool, props); hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
+ const char *name = apr_hash_this_key(hi);
svn_prop_kind_t kind = svn_property_kind2(name);
if (kind == svn_prop_regular_kind)
@@ -1091,7 +895,6 @@ set_fulltext(svn_stream_t **stream,
void *handler_baton;
apr_pool_t *pool = nb->rb->pool;
- LDR_DBG(("Setting fulltext for %p\n", nb->file_baton));
SVN_ERR(commit_editor->apply_textdelta(nb->file_baton, nb->base_checksum,
pool, &handler, &handler_baton));
*stream = svn_txdelta_target_push(handler, handler_baton,
@@ -1108,7 +911,6 @@ apply_textdelta(svn_txdelta_window_handler_t *handler,
const struct svn_delta_editor_t *commit_editor = nb->rb->pb->commit_editor;
apr_pool_t *pool = nb->rb->pool;
- LDR_DBG(("Applying textdelta to %p\n", nb->file_baton));
SVN_ERR(commit_editor->apply_textdelta(nb->file_baton, nb->base_checksum,
pool, handler, handler_baton));
@@ -1126,8 +928,8 @@ close_node(void *baton)
for (hi = apr_hash_first(pool, nb->prop_changes);
hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_prop_t *prop = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_prop_t *prop = apr_hash_this_val(hi);
switch (nb->kind)
{
@@ -1148,7 +950,6 @@ close_node(void *baton)
deleted the file (which doesn't require us to open it). */
if ((nb->kind == svn_node_file) && (nb->file_baton))
{
- LDR_DBG(("Closing file %p\n", nb->file_baton));
SVN_ERR(commit_editor->close_file(nb->file_baton, NULL, nb->rb->pool));
}
@@ -1178,12 +979,10 @@ close_revision(void *baton)
session itself */
while (rb->db && rb->db->parent)
{
- LDR_DBG(("Closing dir %p\n", rb->db->baton));
SVN_ERR(commit_editor->close_directory(rb->db->baton, rb->pool));
rb->db = rb->db->parent;
}
/* root dir's baton */
- LDR_DBG(("Closing edit on %p\n", commit_edit_baton));
SVN_ERR(commit_editor->close_directory(rb->db->baton, rb->pool));
SVN_ERR(commit_editor->close_edit(commit_edit_baton, rb->pool));
}
@@ -1201,8 +1000,6 @@ close_revision(void *baton)
rb->rev - rb->rev_offset - 1,
rb->pool, &child_baton));
- LDR_DBG(("Opened root %p\n", child_baton));
- LDR_DBG(("Closing edit on %p\n", commit_edit_baton));
SVN_ERR(commit_editor->close_directory(child_baton, rb->pool));
SVN_ERR(commit_editor->close_edit(commit_edit_baton, rb->pool));
}
@@ -1222,16 +1019,22 @@ close_revision(void *baton)
if (SVN_IS_VALID_REVNUM(committed_rev))
{
- SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_DATE,
- rb->datestamp, rb->pool));
- SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev,
- SVN_PROP_REVISION_DATE,
- NULL, rb->datestamp, rb->pool));
- SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_AUTHOR,
- rb->author, rb->pool));
- SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev,
- SVN_PROP_REVISION_AUTHOR,
- NULL, rb->author, rb->pool));
+ if (!svn_hash_gets(rb->pb->skip_revprops, SVN_PROP_REVISION_DATE))
+ {
+ SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_DATE,
+ rb->datestamp, rb->pool));
+ SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev,
+ SVN_PROP_REVISION_DATE,
+ NULL, rb->datestamp, rb->pool));
+ }
+ if (!svn_hash_gets(rb->pb->skip_revprops, SVN_PROP_REVISION_AUTHOR))
+ {
+ SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_AUTHOR,
+ rb->author, rb->pool));
+ SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev,
+ SVN_PROP_REVISION_AUTHOR,
+ NULL, rb->author, rb->pool));
+ }
}
svn_pool_destroy(rb->pool);
@@ -1244,6 +1047,7 @@ svn_rdump__load_dumpstream(svn_stream_t *stream,
svn_ra_session_t *session,
svn_ra_session_t *aux_session,
svn_boolean_t quiet,
+ apr_hash_t *skip_revprops,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool)
@@ -1287,6 +1091,7 @@ svn_rdump__load_dumpstream(svn_stream_t *stream,
parse_baton->rev_map = apr_hash_make(pool);
parse_baton->last_rev_mapped = SVN_INVALID_REVNUM;
parse_baton->oldest_dumpstream_rev = SVN_INVALID_REVNUM;
+ parse_baton->skip_revprops = skip_revprops;
err = svn_repos_parse_dumpstream3(stream, parser, parse_baton, FALSE,
cancel_func, cancel_baton, pool);
diff --git a/subversion/svnrdump/svnrdump.c b/subversion/svnrdump/svnrdump.c
index 6bf409c..df0286b 100644
--- a/subversion/svnrdump/svnrdump.c
+++ b/subversion/svnrdump/svnrdump.c
@@ -39,6 +39,7 @@
#include "svnrdump.h"
+#include "private/svn_repos_private.h"
#include "private/svn_cmdline_private.h"
#include "private/svn_ra_private.h"
@@ -80,9 +81,11 @@ enum svn_svnrdump__longopt_t
opt_auth_password,
opt_auth_nocache,
opt_non_interactive,
+ opt_skip_revprop,
opt_force_interactive,
opt_incremental,
opt_trust_server_cert,
+ opt_trust_server_cert_failures,
opt_version
};
@@ -92,6 +95,7 @@ enum svn_svnrdump__longopt_t
opt_auth_password, \
opt_auth_nocache, \
opt_trust_server_cert, \
+ opt_trust_server_cert_failures, \
opt_non_interactive, \
opt_force_interactive
@@ -106,7 +110,7 @@ static const svn_opt_subcommand_desc2_t svnrdump__cmd_table[] =
{ "load", load_cmd, { 0 },
N_("usage: svnrdump load URL\n\n"
"Load a 'dumpfile' given on stdin to a repository at remote URL.\n"),
- { 'q', SVN_SVNRDUMP__BASE_OPTIONS } },
+ { 'q', opt_skip_revprop, SVN_SVNRDUMP__BASE_OPTIONS } },
{ "help", 0, { "?", "h" },
N_("usage: svnrdump help [SUBCOMMAND...]\n\n"
"Describe the usage of this program or its subcommands.\n"),
@@ -122,6 +126,8 @@ static const apr_getopt_option_t svnrdump__options[] =
N_("no progress (only errors) to stderr")},
{"incremental", opt_incremental, 0,
N_("dump incrementally")},
+ {"skip-revprop", opt_skip_revprop, 1,
+ N_("skip revision property ARG (e.g., \"svn:author\")")},
{"config-dir", opt_config_dir, 1,
N_("read user configuration files from directory ARG")},
{"username", opt_auth_username, 1,
@@ -150,12 +156,24 @@ static const apr_getopt_option_t svnrdump__options[] =
"For example:\n"
" "
" servers:global:http-library=serf")},
- {"trust-server-cert", opt_trust_server_cert, 0,
- N_("accept SSL server certificates from unknown\n"
- " "
- "certificate authorities without prompting (but only\n"
- " "
- "with '--non-interactive')") },
+ {"trust-server-cert", opt_trust_server_cert, 0,
+ N_("deprecated; same as\n"
+ " "
+ "--trust-server-cert-failures=unknown-ca")},
+ {"trust-server-cert-failures", opt_trust_server_cert_failures, 1,
+ N_("with --non-interactive, accept SSL server\n"
+ " "
+ "certificates with failures; ARG is comma-separated\n"
+ " "
+ "list of 'unknown-ca' (Unknown Authority),\n"
+ " "
+ "'cn-mismatch' (Hostname mismatch), 'expired'\n"
+ " "
+ "(Expired certificate), 'not-yet-valid' (Not yet\n"
+ " "
+ "valid certificate) and 'other' (all other not\n"
+ " "
+ "separately classified certificate errors).")},
{0, 0, 0, 0}
};
@@ -182,6 +200,7 @@ typedef struct opt_baton_t {
svn_opt_revision_t end_revision;
svn_boolean_t quiet;
svn_boolean_t incremental;
+ apr_hash_t *skip_revprops;
} opt_baton_t;
/* Print dumpstream-formatted information about REVISION.
@@ -197,38 +216,13 @@ replay_revstart(svn_revnum_t revision,
{
struct replay_baton *rb = replay_baton;
apr_hash_t *normal_props;
- svn_stringbuf_t *propstring;
- svn_stream_t *stdout_stream;
- svn_stream_t *revprop_stream;
-
- SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
- /* Revision-number: 19 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_REVISION_NUMBER
- ": %ld\n", revision));
+ /* Normalize and dump the revprops */
SVN_ERR(svn_rdump__normalize_props(&normal_props, rev_props, pool));
- propstring = svn_stringbuf_create_ensure(0, pool);
- revprop_stream = svn_stream_from_stringbuf(propstring, pool);
- SVN_ERR(svn_hash_write2(normal_props, revprop_stream, "PROPS-END", pool));
- SVN_ERR(svn_stream_close(revprop_stream));
-
- /* Prop-content-length: 13 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n", propstring->len));
-
- /* Content-length: 29 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n\n", propstring->len));
-
- /* Property data. */
- SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
- &(propstring->len)));
-
- SVN_ERR(svn_stream_puts(stdout_stream, "\n"));
- SVN_ERR(svn_stream_close(stdout_stream));
+ SVN_ERR(svn_repos__dump_revision_record(rb->stdout_stream, revision, NULL,
+ normal_props,
+ TRUE /*props_section_always*/,
+ pool));
SVN_ERR(svn_rdump__get_dump_editor(editor, edit_baton, revision,
rb->stdout_stream, rb->extra_ra_session,
@@ -271,38 +265,13 @@ replay_revstart_v2(svn_revnum_t revision,
{
struct replay_baton *rb = replay_baton;
apr_hash_t *normal_props;
- svn_stringbuf_t *propstring;
- svn_stream_t *stdout_stream;
- svn_stream_t *revprop_stream;
-
- SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
- /* Revision-number: 19 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_REVISION_NUMBER
- ": %ld\n", revision));
+ /* Normalize and dump the revprops */
SVN_ERR(svn_rdump__normalize_props(&normal_props, rev_props, pool));
- propstring = svn_stringbuf_create_ensure(0, pool);
- revprop_stream = svn_stream_from_stringbuf(propstring, pool);
- SVN_ERR(svn_hash_write2(normal_props, revprop_stream, "PROPS-END", pool));
- SVN_ERR(svn_stream_close(revprop_stream));
-
- /* Prop-content-length: 13 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n", propstring->len));
-
- /* Content-length: 29 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n\n", propstring->len));
-
- /* Property data. */
- SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
- &(propstring->len)));
-
- SVN_ERR(svn_stream_puts(stdout_stream, "\n"));
- SVN_ERR(svn_stream_close(stdout_stream));
+ SVN_ERR(svn_repos__dump_revision_record(rb->stdout_stream, revision,
+ normal_props,
+ TRUE /*props_section_always*/,
+ pool));
SVN_ERR(svn_rdump__get_dump_editor_v2(editor, revision,
rb->stdout_stream,
@@ -348,7 +317,11 @@ init_client_context(svn_client_ctx_t **ctx_p,
const char *config_dir,
const char *repos_url,
svn_boolean_t no_auth_cache,
- svn_boolean_t trust_server_cert,
+ svn_boolean_t trust_unknown_ca,
+ svn_boolean_t trust_cn_mismatch,
+ svn_boolean_t trust_expired,
+ svn_boolean_t trust_not_yet_valid,
+ svn_boolean_t trust_other_failure,
apr_array_header_t *config_options,
apr_pool_t *pool)
{
@@ -412,11 +385,14 @@ init_client_context(svn_client_ctx_t **ctx_p,
ctx->cancel_func = check_cancel;
/* Default authentication providers for non-interactive use */
- SVN_ERR(svn_cmdline_create_auth_baton(&(ctx->auth_baton), non_interactive,
- username, password, config_dir,
- no_auth_cache, trust_server_cert,
- cfg_config, ctx->cancel_func,
- ctx->cancel_baton, pool));
+ SVN_ERR(svn_cmdline_create_auth_baton2(&(ctx->auth_baton), non_interactive,
+ username, password, config_dir,
+ no_auth_cache, trust_unknown_ca,
+ trust_cn_mismatch, trust_expired,
+ trust_not_yet_valid,
+ trust_other_failure,
+ cfg_config, ctx->cancel_func,
+ ctx->cancel_baton, pool));
*ctx_p = ctx;
return SVN_NO_ERROR;
}
@@ -432,35 +408,12 @@ dump_revision_header(svn_ra_session_t *session,
apr_pool_t *pool)
{
apr_hash_t *prophash;
- svn_stringbuf_t *propstring;
- svn_stream_t *propstream;
-
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_REVISION_NUMBER
- ": %ld\n", revision));
- prophash = apr_hash_make(pool);
- propstring = svn_stringbuf_create_empty(pool);
SVN_ERR(svn_ra_rev_proplist(session, revision, &prophash, pool));
-
- propstream = svn_stream_from_stringbuf(propstring, pool);
- SVN_ERR(svn_hash_write2(prophash, propstream, "PROPS-END", pool));
- SVN_ERR(svn_stream_close(propstream));
-
- /* Property-content-length: 14; Content-length: 14 */
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n",
- propstring->len));
- SVN_ERR(svn_stream_printf(stdout_stream, pool,
- SVN_REPOS_DUMPFILE_CONTENT_LENGTH
- ": %" APR_SIZE_T_FMT "\n\n",
- propstring->len));
- /* The properties */
- SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
- &(propstring->len)));
- SVN_ERR(svn_stream_puts(stdout_stream, "\n"));
-
+ SVN_ERR(svn_repos__dump_revision_record(stdout_stream, revision, NULL,
+ prophash,
+ TRUE /*props_section_always*/,
+ pool));
return SVN_NO_ERROR;
}
@@ -608,6 +561,7 @@ load_revisions(svn_ra_session_t *session,
svn_ra_session_t *aux_session,
const char *url,
svn_boolean_t quiet,
+ apr_hash_t *skip_revprops,
apr_pool_t *pool)
{
apr_file_t *stdin_file;
@@ -617,7 +571,8 @@ load_revisions(svn_ra_session_t *session,
stdin_stream = svn_stream_from_aprfile2(stdin_file, FALSE, pool);
SVN_ERR(svn_rdump__load_dumpstream(stdin_stream, session, aux_session,
- quiet, check_cancel, NULL, pool));
+ quiet, skip_revprops,
+ check_cancel, NULL, pool));
SVN_ERR(svn_stream_close(stdin_stream));
@@ -667,23 +622,6 @@ version(const char *progname,
}
-/* A statement macro, similar to @c SVN_ERR, but returns an integer.
- * Evaluate @a expr. If it yields an error, handle that error and
- * return @c EXIT_FAILURE.
- */
-#define SVNRDUMP_ERR(expr) \
- do \
- { \
- svn_error_t *svn_err__temp = (expr); \
- if (svn_err__temp) \
- { \
- svn_handle_error2(svn_err__temp, stderr, FALSE, "svnrdump: "); \
- svn_error_clear(svn_err__temp); \
- return EXIT_FAILURE; \
- } \
- } \
- while (0)
-
/* Handle the "dump" subcommand. Implements `svn_opt_subcommand_t'. */
static svn_error_t *
dump_cmd(apr_getopt_t *os,
@@ -718,7 +656,7 @@ load_cmd(apr_getopt_t *os,
SVN_ERR(svn_client_open_ra_session2(&aux_session, opt_baton->url, NULL,
opt_baton->ctx, pool, pool));
return load_revisions(opt_baton->session, aux_session, opt_baton->url,
- opt_baton->quiet, pool);
+ opt_baton->quiet, opt_baton->skip_revprops, pool);
}
/* Handle the "help" subcommand. Implements `svn_opt_subcommand_t'. */
@@ -729,6 +667,7 @@ help_cmd(apr_getopt_t *os,
{
const char *header =
_("general usage: svnrdump SUBCOMMAND URL [-r LOWER[:UPPER]]\n"
+ "Subversion remote repository dump and load tool.\n"
"Type 'svnrdump help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnrdump --version' to see the program version and RA modules.\n"
"\n"
@@ -831,19 +770,27 @@ validate_and_resolve_revisions(opt_baton_t *opt_baton,
return SVN_NO_ERROR;
}
-int
-main(int argc, const char **argv)
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
svn_error_t *err = SVN_NO_ERROR;
const svn_opt_subcommand_desc2_t *subcommand = NULL;
opt_baton_t *opt_baton;
svn_revnum_t latest_revision = SVN_INVALID_REVNUM;
- apr_pool_t *pool = NULL;
const char *config_dir = NULL;
const char *username = NULL;
const char *password = NULL;
svn_boolean_t no_auth_cache = FALSE;
- svn_boolean_t trust_server_cert = FALSE;
+ svn_boolean_t trust_unknown_ca = FALSE;
+ svn_boolean_t trust_cn_mismatch = FALSE;
+ svn_boolean_t trust_expired = FALSE;
+ svn_boolean_t trust_not_yet_valid = FALSE;
+ svn_boolean_t trust_other_failure = FALSE;
svn_boolean_t non_interactive = FALSE;
svn_boolean_t force_interactive = FALSE;
apr_array_header_t *config_options = NULL;
@@ -852,20 +799,13 @@ main(int argc, const char **argv)
apr_array_header_t *received_opts;
int i;
- if (svn_cmdline_init ("svnrdump", stderr) != EXIT_SUCCESS)
- return EXIT_FAILURE;
-
- /* Create our top-level pool. Use a separate mutexless allocator,
- * given this application is single threaded.
- */
- pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-
opt_baton = apr_pcalloc(pool, sizeof(*opt_baton));
opt_baton->start_revision.kind = svn_opt_revision_unspecified;
opt_baton->end_revision.kind = svn_opt_revision_unspecified;
opt_baton->url = NULL;
+ opt_baton->skip_revprops = apr_hash_make(pool);
- SVNRDUMP_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = TRUE; /* Options and arguments can be interleaved */
@@ -905,8 +845,9 @@ main(int argc, const char **argv)
break;
if (status != APR_SUCCESS)
{
- SVNRDUMP_ERR(usage(argv[0], pool));
- exit(EXIT_FAILURE);
+ SVN_ERR(usage(argv[0], pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* Stash the option code in an array before parsing it. */
@@ -919,11 +860,10 @@ main(int argc, const char **argv)
/* Make sure we've not seen -r already. */
if (opt_baton->start_revision.kind != svn_opt_revision_unspecified)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Multiple revision arguments "
- "encountered; try '-r N:M' instead "
- "of '-r N -r M'"));
- return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Multiple revision arguments "
+ "encountered; try '-r N:M' instead "
+ "of '-r N -r M'"));
}
/* Parse the -r argument. */
if (svn_opt_parse_revision(&(opt_baton->start_revision),
@@ -931,12 +871,10 @@ main(int argc, const char **argv)
opt_arg, pool) != 0)
{
const char *utf8_opt_arg;
- err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
- if (! err)
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Syntax error in revision "
- "argument '%s'"), utf8_opt_arg);
- return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Syntax error in revision "
+ "argument '%s'"), utf8_opt_arg);
}
}
break;
@@ -953,10 +891,10 @@ main(int argc, const char **argv)
opt_baton->help = TRUE;
break;
case opt_auth_username:
- SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&username, opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&username, opt_arg, pool));
break;
case opt_auth_password:
- SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&password, opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&password, opt_arg, pool));
break;
case opt_auth_nocache:
no_auth_cache = TRUE;
@@ -970,8 +908,22 @@ main(int argc, const char **argv)
case opt_incremental:
opt_baton->incremental = TRUE;
break;
- case opt_trust_server_cert:
- trust_server_cert = TRUE;
+ case opt_skip_revprop:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ svn_hash_sets(opt_baton->skip_revprops, opt_arg, opt_arg);
+ break;
+ case opt_trust_server_cert: /* backward compat */
+ trust_unknown_ca = TRUE;
+ break;
+ case opt_trust_server_cert_failures:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &trust_unknown_ca,
+ &trust_cn_mismatch,
+ &trust_expired,
+ &trust_not_yet_valid,
+ &trust_other_failure,
+ opt_arg, pool));
break;
case opt_config_option:
if (!config_options)
@@ -979,9 +931,11 @@ main(int argc, const char **argv)
apr_array_make(pool, 1,
sizeof(svn_cmdline__config_argument_t*));
- SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
- SVNRDUMP_ERR(svn_cmdline__parse_config_option(config_options,
- opt_arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(config_options,
+ opt_arg,
+ "svnrdump: ",
+ pool));
}
}
@@ -989,10 +943,9 @@ main(int argc, const char **argv)
* exclusive. */
if (non_interactive && force_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--non-interactive and --force-interactive "
- "are mutually exclusive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--non-interactive and --force-interactive "
+ "are mutually exclusive"));
}
if (opt_baton->help)
@@ -1017,9 +970,9 @@ main(int argc, const char **argv)
else
{
- SVNRDUMP_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- exit(EXIT_FAILURE);
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -1031,16 +984,15 @@ main(int argc, const char **argv)
if (subcommand == NULL)
{
const char *first_arg_utf8;
- err = svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+ SVN_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8, first_arg,
+ pool));
svn_error_clear(
svn_cmdline_fprintf(stderr, pool,
_("Unknown subcommand: '%s'\n"),
first_arg_utf8));
- SVNRDUMP_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- exit(EXIT_FAILURE);
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -1065,69 +1017,64 @@ main(int argc, const char **argv)
subcommand, pool);
svn_opt_format_option(&optstr, badopt, FALSE, pool);
if (subcommand->name[0] == '-')
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
+ SVN_ERR(help_cmd(NULL, NULL, pool));
else
svn_error_clear(svn_cmdline_fprintf(
stderr, pool,
_("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnrdump help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
- if (subcommand && strcmp(subcommand->name, "--version") == 0)
+ if (strcmp(subcommand->name, "--version") == 0)
{
- SVNRDUMP_ERR(version(argv[0], opt_baton->quiet, pool));
- svn_pool_destroy(pool);
- exit(EXIT_SUCCESS);
+ SVN_ERR(version(argv[0], opt_baton->quiet, pool));
+ return SVN_NO_ERROR;
}
- if (subcommand && strcmp(subcommand->name, "help") == 0)
+ if (strcmp(subcommand->name, "help") == 0)
{
- SVNRDUMP_ERR(help_cmd(os, opt_baton, pool));
- svn_pool_destroy(pool);
- exit(EXIT_SUCCESS);
+ SVN_ERR(help_cmd(os, opt_baton, pool));
+ return SVN_NO_ERROR;
}
- /* --trust-server-cert can only be used with --non-interactive */
- if (trust_server_cert && !non_interactive)
+ /* --trust-* can only be used with --non-interactive */
+ if (!non_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--trust-server-cert requires "
- "--non-interactive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnrdump: ");
+ if (trust_unknown_ca || trust_cn_mismatch || trust_expired
+ || trust_not_yet_valid || trust_other_failure)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--trust-server-cert-failures requires "
+ "--non-interactive"));
}
/* Expect one more non-option argument: the repository URL. */
if (os->ind != os->argc - 1)
{
- SVNRDUMP_ERR(usage(argv[0], pool));
- svn_pool_destroy(pool);
- exit(EXIT_FAILURE);
+ SVN_ERR(usage(argv[0], pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
else
{
const char *repos_url;
- SVNRDUMP_ERR(svn_utf_cstring_to_utf8(&repos_url,
- os->argv[os->ind], pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&repos_url, os->argv[os->ind], pool));
if (! svn_path_is_url(repos_url))
{
- err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, 0,
- "Target '%s' is not a URL",
- repos_url);
- SVNRDUMP_ERR(err);
- svn_pool_destroy(pool);
- exit(EXIT_FAILURE);
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, 0,
+ "Target '%s' is not a URL",
+ repos_url);
}
opt_baton->url = svn_uri_canonicalize(repos_url, pool);
}
if (strcmp(subcommand->name, "load") == 0)
{
- /*
+ /*
* By default (no --*-interactive options given), the 'load' subcommand
* is interactive unless username and password were provided on the
* command line. This allows prompting for auth creds to work without
@@ -1141,16 +1088,20 @@ main(int argc, const char **argv)
non_interactive = !svn_cmdline__be_interactive(non_interactive,
force_interactive);
- SVNRDUMP_ERR(init_client_context(&(opt_baton->ctx),
- non_interactive,
- username,
- password,
- config_dir,
- opt_baton->url,
- no_auth_cache,
- trust_server_cert,
- config_options,
- pool));
+ SVN_ERR(init_client_context(&(opt_baton->ctx),
+ non_interactive,
+ username,
+ password,
+ config_dir,
+ opt_baton->url,
+ no_auth_cache,
+ trust_unknown_ca,
+ trust_cn_mismatch,
+ trust_expired,
+ trust_not_yet_valid,
+ trust_other_failure,
+ config_options,
+ pool));
err = svn_client_open_ra_session2(&(opt_baton->session),
opt_baton->url, NULL,
@@ -1171,15 +1122,45 @@ main(int argc, const char **argv)
if (err && err->apr_err == SVN_ERR_AUTHN_FAILED && non_interactive)
{
- err = svn_error_quick_wrap(err,
- _("Authentication failed and interactive"
- " prompting is disabled; see the"
- " --force-interactive option"));
+ return svn_error_quick_wrap(err,
+ _("Authentication failed and interactive"
+ " prompting is disabled; see the"
+ " --force-interactive option"));
}
+ else if (err)
+ return err;
+ else
+ return SVN_NO_ERROR;
+}
- SVNRDUMP_ERR(err);
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
- svn_pool_destroy(pool);
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnrdump", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
- return EXIT_SUCCESS;
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnrdump: ");
+ }
+
+ svn_pool_destroy(pool);
+ return exit_code;
}
diff --git a/subversion/svnrdump/svnrdump.h b/subversion/svnrdump/svnrdump.h
index 2a81014..919ea5e 100644
--- a/subversion/svnrdump/svnrdump.h
+++ b/subversion/svnrdump/svnrdump.h
@@ -89,6 +89,7 @@ svn_rdump__load_dumpstream(svn_stream_t *stream,
svn_ra_session_t *session,
svn_ra_session_t *aux_session,
svn_boolean_t quiet,
+ apr_hash_t *skip_revprops,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *pool);
diff --git a/subversion/svnrdump/util.c b/subversion/svnrdump/util.c
index 2586cd1..9a89c89 100644
--- a/subversion/svnrdump/util.c
+++ b/subversion/svnrdump/util.c
@@ -61,8 +61,8 @@ svn_rdump__normalize_props(apr_hash_t **normal_props,
for (hi = apr_hash_first(result_pool, props); hi;
hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- const svn_string_t *value = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ const svn_string_t *value = apr_hash_this_val(hi);
SVN_ERR(svn_rdump__normalize_prop(key, &value,
result_pool));
diff --git a/subversion/svnserve/cyrus_auth.c b/subversion/svnserve/cyrus_auth.c
index 2d75047..40f4228 100644
--- a/subversion/svnserve/cyrus_auth.c
+++ b/subversion/svnserve/cyrus_auth.c
@@ -74,6 +74,8 @@ static int canonicalize_username(sasl_conn_t *conn,
{
/* The only valid realm is user_realm (i.e. the repository's realm).
If the user gave us another realm, complain. */
+ if (realm_len != inlen-(pos-in+1))
+ return SASL_BADPROT;
if (strncmp(pos+1, user_realm, inlen-(pos-in+1)) != 0)
return SASL_BADPROT;
}
@@ -177,16 +179,22 @@ static svn_error_t *try_auth(svn_ra_svn_conn_t *conn,
SVN_ERR(svn_ra_svn__read_tuple(conn, pool, "w(?s)", &mech, &in));
if (strcmp(mech, "EXTERNAL") == 0 && !in)
- in = svn_string_create(b->tunnel_user, pool);
+ in = svn_string_create(b->client_info->tunnel_user, pool);
else if (in)
in = svn_base64_decode_string(in, pool);
/* For CRAM-MD5, we don't base64-encode stuff. */
use_base64 = (strcmp(mech, "CRAM-MD5") != 0);
+ /* sasl uses unsigned int for the length of strings, we use apr_size_t
+ * which may not be the same size. Deal with potential integer overflow */
+ if (in && in->len > UINT_MAX)
+ return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("Initial token is too long"));
+
result = sasl_server_start(sasl_ctx, mech,
in ? in->data : NULL,
- in ? in->len : 0, &out, &outlen);
+ in ? (unsigned int) in->len : 0, &out, &outlen);
if (result != SASL_OK && result != SASL_CONTINUE)
return fail_auth(conn, pool, sasl_ctx);
@@ -210,7 +218,13 @@ static svn_error_t *try_auth(svn_ra_svn_conn_t *conn,
in = item->u.string;
if (use_base64)
in = svn_base64_decode_string(in, pool);
- result = sasl_server_step(sasl_ctx, in->data, in->len, &out, &outlen);
+
+ if (in->len > UINT_MAX)
+ return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ _("Step response is too long"));
+
+ result = sasl_server_step(sasl_ctx, in->data, (unsigned int) in->len,
+ &out, &outlen);
}
if (result != SASL_OK)
@@ -246,7 +260,7 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
apr_pool_t *subpool;
apr_status_t apr_err;
const char *localaddrport = NULL, *remoteaddrport = NULL;
- const char *mechlist, *val;
+ const char *mechlist;
char hostname[APRMAXHOSTLEN + 1];
sasl_security_properties_t secprops;
svn_boolean_t success, no_anonymous;
@@ -265,7 +279,7 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
/* Create a SASL context. SASL_SUCCESS_DATA tells SASL that the protocol
supports sending data along with the final "success" message. */
result = sasl_server_new(SVN_RA_SVN_SASL_NAME,
- hostname, b->realm,
+ hostname, b->repository->realm,
localaddrport, remoteaddrport,
NULL, SASL_SUCCESS_DATA,
&sasl_ctx);
@@ -285,21 +299,12 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
svn_ra_svn__default_secprops(&secprops);
/* Don't allow ANONYMOUS if a username is required. */
- no_anonymous = needs_username || get_access(b, UNAUTHENTICATED) < required;
+ no_anonymous = needs_username || b->repository->anon_access < required;
if (no_anonymous)
secprops.security_flags |= SASL_SEC_NOANONYMOUS;
- svn_config_get(b->cfg, &val,
- SVN_CONFIG_SECTION_SASL,
- SVN_CONFIG_OPTION_MIN_SSF,
- "0");
- SVN_ERR(svn_cstring_atoui(&secprops.min_ssf, val));
-
- svn_config_get(b->cfg, &val,
- SVN_CONFIG_SECTION_SASL,
- SVN_CONFIG_OPTION_MAX_SSF,
- "256");
- SVN_ERR(svn_cstring_atoui(&secprops.max_ssf, val));
+ secprops.min_ssf = b->repository->min_ssf;
+ secprops.max_ssf = b->repository->max_ssf;
/* Set security properties. */
result = sasl_setprop(sasl_ctx, SASL_SEC_PROPS, &secprops);
@@ -307,8 +312,9 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
return fail_cmd(conn, pool, sasl_ctx);
/* SASL needs to know if we are externally authenticated. */
- if (b->tunnel_user)
- result = sasl_setprop(sasl_ctx, SASL_AUTH_EXTERNAL, b->tunnel_user);
+ if (b->client_info->tunnel_user)
+ result = sasl_setprop(sasl_ctx, SASL_AUTH_EXTERNAL,
+ b->client_info->tunnel_user);
if (result != SASL_OK)
return fail_cmd(conn, pool, sasl_ctx);
@@ -330,7 +336,7 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
/* Send the list of mechanisms and the realm to the client. */
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "(w)c",
- mechlist, b->realm));
+ mechlist, b->repository->realm));
/* The main authentication loop. */
subpool = svn_pool_create(pool);
@@ -358,7 +364,8 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
if ((p = strchr(user, '@')) != NULL)
{
/* Drop the realm part. */
- b->user = apr_pstrndup(b->pool, user, p - (const char *)user);
+ b->client_info->user = apr_pstrndup(b->pool, user,
+ p - (const char *)user);
}
else
{
diff --git a/subversion/svnserve/logger.c b/subversion/svnserve/logger.c
new file mode 100644
index 0000000..19b6bd4
--- /dev/null
+++ b/subversion/svnserve/logger.c
@@ -0,0 +1,161 @@
+/*
+ * logger.c : Implementation of the SvnServe logger API
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+
+
+#define APR_WANT_STRFUNC
+#include <apr_want.h>
+
+#include "svn_error.h"
+#include "svn_io.h"
+#include "svn_pools.h"
+#include "svn_time.h"
+
+#include "private/svn_mutex.h"
+
+#include "svn_private_config.h"
+#include "logger.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* For getpid() */
+#endif
+
+struct logger_t
+{
+ /* actual log file / stream object */
+ svn_stream_t *stream;
+
+ /* mutex used to serialize access to this structure */
+ svn_mutex__t *mutex;
+
+ /* private pool used for temporary allocations */
+ apr_pool_t *pool;
+};
+
+svn_error_t *
+logger__create_for_stderr(logger_t **logger,
+ apr_pool_t *pool)
+{
+ logger_t *result = apr_pcalloc(pool, sizeof(*result));
+ result->pool = svn_pool_create(pool);
+
+ SVN_ERR(svn_stream_for_stderr(&result->stream, pool));
+ SVN_ERR(svn_mutex__init(&result->mutex, TRUE, pool));
+
+ *logger = result;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+logger__create(logger_t **logger,
+ const char *filename,
+ apr_pool_t *pool)
+{
+ logger_t *result = apr_pcalloc(pool, sizeof(*result));
+ apr_file_t *file;
+
+ SVN_ERR(svn_io_file_open(&file, filename,
+ APR_WRITE | APR_CREATE | APR_APPEND,
+ APR_OS_DEFAULT, pool));
+ SVN_ERR(svn_mutex__init(&result->mutex, TRUE, pool));
+
+ result->stream = svn_stream_from_aprfile2(file, FALSE, pool);
+ result->pool = svn_pool_create(pool);
+
+ *logger = result;
+
+ return SVN_NO_ERROR;
+}
+
+void
+logger__log_error(logger_t *logger,
+ svn_error_t *err,
+ repository_t *repository,
+ client_info_t *client_info)
+{
+ if (logger && err)
+ {
+ const char *timestr, *continuation;
+ const char *user, *repos, *remote_host;
+ char errbuf[256];
+ /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */
+ char errstr[8192];
+
+ svn_error_clear(svn_mutex__lock(logger->mutex));
+
+ timestr = svn_time_to_cstring(apr_time_now(), logger->pool);
+ remote_host = client_info && client_info->remote_host
+ ? client_info->remote_host
+ : "-";
+ user = client_info && client_info->user
+ ? client_info->user
+ : "-";
+ repos = repository && repository->repos_name
+ ? repository->repos_name
+ : "-";
+
+ continuation = "";
+ while (err)
+ {
+ const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf));
+ /* based on httpd-2.2.4/server/log.c:log_error_core */
+ apr_size_t len = apr_snprintf(errstr, sizeof(errstr),
+ "%" APR_PID_T_FMT
+ " %s %s %s %s ERR%s %s %ld %d ",
+ getpid(), timestr, remote_host, user,
+ repos, continuation,
+ err->file ? err->file : "-", err->line,
+ err->apr_err);
+
+ len += escape_errorlog_item(errstr + len, message,
+ sizeof(errstr) - len);
+ /* Truncate for the terminator (as apr_snprintf does) */
+ if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) {
+ len = sizeof(errstr) - sizeof(APR_EOL_STR);
+ }
+
+ memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR));
+ len += sizeof(APR_EOL_STR) -1; /* add NL, ex terminating NUL */
+
+ svn_error_clear(svn_stream_write(logger->stream, errstr, &len));
+
+ continuation = "-";
+ err = err->child;
+ }
+
+ svn_pool_clear(logger->pool);
+
+ svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR));
+ }
+}
+
+svn_error_t *
+logger__write(logger_t *logger,
+ const char *errstr,
+ apr_size_t len)
+{
+ SVN_MUTEX__WITH_LOCK(logger->mutex,
+ svn_stream_write(logger->stream, errstr, &len));
+ return SVN_NO_ERROR;
+}
diff --git a/subversion/svnserve/logger.h b/subversion/svnserve/logger.h
new file mode 100644
index 0000000..aac804b
--- /dev/null
+++ b/subversion/svnserve/logger.h
@@ -0,0 +1,79 @@
+/*
+ * logger.h : Public definitions for the Repository Cache
+ *
+ * ====================================================================
+ * 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 LOGGER_H
+#define LOGGER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "server.h"
+
+
+
+/* Opaque svnserve log file writer data structure. Access to the log
+ * file will be serialized among threads within the same process.
+ */
+typedef struct logger_t logger_t;
+
+/* In POOL, create a writer object that will write log messages to stderr
+ * and return it in *LOGGER. The log file will not add any buffering
+ * on top of stderr.
+ */
+svn_error_t *
+logger__create_for_stderr(logger_t **logger,
+ apr_pool_t *pool);
+
+/* In POOL, create a writer object for log file FILENAME and return it
+ * in *LOGGER. The log file will be flushed & closed when POOL gets
+ * cleared or destroyed.
+ */
+svn_error_t *
+logger__create(logger_t **logger,
+ const char *filename,
+ apr_pool_t *pool);
+
+/* Write the first LEN bytes from ERRSTR to the log file managed by LOGGER.
+ */
+svn_error_t *
+logger__write(logger_t *logger,
+ const char *errstr,
+ apr_size_t len);
+
+/* Write a description of ERR with additional information from REPOSITORY
+ * and CLIENT_INFO to the log file managed by LOGGER. REPOSITORY as well
+ * as CLIENT_INFO may be NULL. If either ERR or LOGGER are NULL, this
+ * becomes a no-op.
+ */
+void
+logger__log_error(logger_t *logger,
+ svn_error_t *err,
+ repository_t *repository,
+ client_info_t *client_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LOGGER_H */
diff --git a/subversion/svnserve/serve.c b/subversion/svnserve/serve.c
index 23ef6ed..91f1d5a 100644
--- a/subversion/svnserve/serve.c
+++ b/subversion/svnserve/serve.c
@@ -61,6 +61,7 @@
#endif
#include "server.h"
+#include "logger.h"
typedef struct commit_callback_baton_t {
apr_pool_t *pool;
@@ -96,7 +97,6 @@ typedef struct file_revs_baton_t {
typedef struct fs_warning_baton_t {
server_baton_t *server;
svn_ra_svn_conn_t *conn;
- apr_pool_t *pool;
} fs_warning_baton_t;
typedef struct authz_baton_t {
@@ -104,81 +104,23 @@ typedef struct authz_baton_t {
svn_ra_svn_conn_t *conn;
} authz_baton_t;
-/* Write LEN bytes of ERRSTR to LOG_FILE with svn_io_file_write(). */
-static svn_error_t *
-log_write(apr_file_t *log_file, const char *errstr, apr_size_t len,
- apr_pool_t *pool)
-{
- return svn_io_file_write(log_file, errstr, &len, pool);
-}
-
-void
-log_error(svn_error_t *err, apr_file_t *log_file, const char *remote_host,
- const char *user, const char *repos, apr_pool_t *pool)
-{
- const char *timestr, *continuation;
- char errbuf[256];
- /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */
- char errstr[8192];
-
- if (err == SVN_NO_ERROR)
- return;
-
- if (log_file == NULL)
- return;
-
- timestr = svn_time_to_cstring(apr_time_now(), pool);
- remote_host = (remote_host ? remote_host : "-");
- user = (user ? user : "-");
- repos = (repos ? repos : "-");
-
- continuation = "";
- while (err != NULL)
- {
- const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf));
- /* based on httpd-2.2.4/server/log.c:log_error_core */
- apr_size_t len = apr_snprintf(errstr, sizeof(errstr),
- "%" APR_PID_T_FMT
- " %s %s %s %s ERR%s %s %ld %d ",
- getpid(), timestr, remote_host, user,
- repos, continuation,
- err->file ? err->file : "-", err->line,
- err->apr_err);
-
- len += escape_errorlog_item(errstr + len, message,
- sizeof(errstr) - len);
- /* Truncate for the terminator (as apr_snprintf does) */
- if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) {
- len = sizeof(errstr) - sizeof(APR_EOL_STR);
- }
- strcpy(errstr + len, APR_EOL_STR);
- len += strlen(APR_EOL_STR);
- svn_error_clear(log_write(log_file, errstr, len, pool));
-
- continuation = "-";
- err = err->child;
- }
-}
-
-/* Call log_error with log_file, remote_host, user, and repos
- arguments from SERVER and CONN. */
+/* svn_error_create() a new error, log_server_error() it, and
+ return it. */
static void
-log_server_error(svn_error_t *err, server_baton_t *server,
- svn_ra_svn_conn_t *conn, apr_pool_t *pool)
+log_error(svn_error_t *err, server_baton_t *server)
{
- log_error(err, server->log_file, svn_ra_svn_conn_remote_host(conn),
- server->user, server->repos_name, pool);
+ logger__log_error(server->logger, err, server->repository,
+ server->client_info);
}
/* svn_error_create() a new error, log_server_error() it, and
return it. */
static svn_error_t *
error_create_and_log(apr_status_t apr_err, svn_error_t *child,
- const char *message, server_baton_t *server,
- svn_ra_svn_conn_t *conn, apr_pool_t *pool)
+ const char *message, server_baton_t *server)
{
svn_error_t *err = svn_error_create(apr_err, child, message);
- log_server_error(err, server, conn, pool);
+ log_error(err, server);
return err;
}
@@ -190,7 +132,7 @@ log_fail_and_flush(svn_error_t *err, server_baton_t *server,
{
svn_error_t *io_err;
- log_server_error(err, server, conn, pool);
+ log_error(err, server);
io_err = svn_ra_svn__write_cmd_failure(conn, pool, err);
svn_error_clear(err);
SVN_ERR(io_err);
@@ -207,7 +149,7 @@ static svn_error_t *log_command(server_baton_t *b,
va_list ap;
apr_size_t nbytes;
- if (b->log_file == NULL)
+ if (b->logger == NULL)
return SVN_NO_ERROR;
remote_host = svn_ra_svn_conn_remote_host(conn);
@@ -221,10 +163,11 @@ static svn_error_t *log_command(server_baton_t *b,
" %s %s %s %s %s" APR_EOL_STR,
getpid(), timestr,
(remote_host ? remote_host : "-"),
- (b->user ? b->user : "-"), b->repos_name, log);
+ (b->client_info->user ? b->client_info->user : "-"),
+ b->repository->repos_name, log);
nbytes = strlen(line);
- return log_write(b->log_file, line, nbytes, pool);
+ return logger__write(b->logger, line, nbytes);
}
/* Log an authz failure */
@@ -232,56 +175,59 @@ static svn_error_t *
log_authz_denied(const char *path,
svn_repos_authz_access_t required,
server_baton_t *b,
- svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
const char *timestr, *remote_host, *line;
- if (b->log_file == NULL)
+ if (!b->logger)
return SVN_NO_ERROR;
- if (!b->user)
+ if (!b->client_info || !b->client_info->user)
return SVN_NO_ERROR;
timestr = svn_time_to_cstring(apr_time_now(), pool);
- remote_host = svn_ra_svn_conn_remote_host(conn);
+ remote_host = b->client_info->remote_host;
line = apr_psprintf(pool, "%" APR_PID_T_FMT
" %s %s %s %s Authorization Failed %s%s %s" APR_EOL_STR,
getpid(), timestr,
(remote_host ? remote_host : "-"),
- (b->user ? b->user : "-"),
- b->repos_name,
+ b->client_info->user,
+ b->repository->repos_name,
(required & svn_authz_recursive ? "recursive " : ""),
(required & svn_authz_write ? "write" : "read"),
(path && path[0] ? path : "/"));
- return log_write(b->log_file, line, strlen(line), pool);
+ return logger__write(b->logger, line, strlen(line));
}
-
-svn_error_t *load_pwdb_config(server_baton_t *server,
- svn_ra_svn_conn_t *conn,
- apr_pool_t *pool)
+/* If CFG specifies a path to the password DB, read that DB through
+ * CONFIG_POOL and store it in REPOSITORY->PWDB.
+ */
+static svn_error_t *
+load_pwdb_config(repository_t *repository,
+ svn_config_t *cfg,
+ svn_repos__config_pool_t *config_pool,
+ apr_pool_t *pool)
{
const char *pwdb_path;
svn_error_t *err;
- svn_config_get(server->cfg, &pwdb_path, SVN_CONFIG_SECTION_GENERAL,
+ svn_config_get(cfg, &pwdb_path,
+ SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_PASSWORD_DB, NULL);
- server->pwdb = NULL;
+ repository->pwdb = NULL;
if (pwdb_path)
{
pwdb_path = svn_dirent_internal_style(pwdb_path, pool);
- pwdb_path = svn_dirent_join(server->base, pwdb_path, pool);
+ pwdb_path = svn_dirent_join(repository->base, pwdb_path, pool);
- err = svn_config_read3(&server->pwdb, pwdb_path, TRUE,
- FALSE, FALSE, pool);
+ err = svn_repos__config_pool_get(&repository->pwdb, NULL, config_pool,
+ pwdb_path, TRUE, FALSE,
+ repository->repos, pool);
if (err)
{
- log_server_error(err, server, conn, pool);
-
/* Because it may be possible to read the pwdb file with some
access methods and not others, ignore errors reading the pwdb
file and just don't present password authentication as an
@@ -294,11 +240,7 @@ svn_error_t *load_pwdb_config(server_baton_t *server,
if (err->apr_err != SVN_ERR_BAD_FILENAME
&& ! APR_STATUS_IS_EACCES(err->apr_err))
{
- /* Now that we've logged the error, clear it and return a
- * nice, generic error to the user:
- * http://subversion.tigris.org/issues/show_bug.cgi?id=2271 */
- svn_error_clear(err);
- return svn_error_create(SVN_ERR_AUTHN_FAILED, NULL, NULL);
+ return svn_error_create(SVN_ERR_AUTHN_FAILED, err, NULL);
}
else
/* Ignore SVN_ERR_BAD_FILENAME and APR_EACCES and proceed. */
@@ -310,11 +252,11 @@ svn_error_t *load_pwdb_config(server_baton_t *server,
}
/* Canonicalize *ACCESS_FILE based on the type of argument. Results are
- * placed in *ACCESS_FILE. SERVER baton is used to convert relative paths to
+ * placed in *ACCESS_FILE. REPOSITORY is used to convert relative paths to
* absolute paths rooted at the server root. REPOS_ROOT is used to calculate
* an absolute URL for repos-relative URLs. */
static svn_error_t *
-canonicalize_access_file(const char **access_file, server_baton_t *server,
+canonicalize_access_file(const char **access_file, repository_t *repository,
const char *repos_root, apr_pool_t *pool)
{
if (svn_path_is_url(*access_file))
@@ -334,26 +276,33 @@ canonicalize_access_file(const char **access_file, server_baton_t *server,
else
{
*access_file = svn_dirent_internal_style(*access_file, pool);
- *access_file = svn_dirent_join(server->base, *access_file, pool);
+ *access_file = svn_dirent_join(repository->base, *access_file, pool);
}
return SVN_NO_ERROR;
}
-svn_error_t *load_authz_config(server_baton_t *server,
- svn_ra_svn_conn_t *conn,
- const char *repos_root,
- apr_pool_t *pool)
+/* Load the authz database for the listening server through AUTHZ_POOL
+ based on the entries in the SERVER struct.
+
+ SERVER and CONN must not be NULL. The real errors will be logged with
+ SERVER and CONN but return generic errors to the client. */
+static svn_error_t *
+load_authz_config(repository_t *repository,
+ const char *repos_root,
+ svn_config_t *cfg,
+ svn_repos__authz_pool_t *authz_pool,
+ apr_pool_t *pool)
{
const char *authzdb_path;
const char *groupsdb_path;
svn_error_t *err;
/* Read authz configuration. */
- svn_config_get(server->cfg, &authzdb_path, SVN_CONFIG_SECTION_GENERAL,
+ svn_config_get(cfg, &authzdb_path, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_AUTHZ_DB, NULL);
- svn_config_get(server->cfg, &groupsdb_path, SVN_CONFIG_SECTION_GENERAL,
+ svn_config_get(cfg, &groupsdb_path, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_GROUPS_DB, NULL);
if (authzdb_path)
@@ -361,48 +310,71 @@ svn_error_t *load_authz_config(server_baton_t *server,
const char *case_force_val;
/* Canonicalize and add the base onto the authzdb_path (if needed). */
- err = canonicalize_access_file(&authzdb_path, server,
+ err = canonicalize_access_file(&authzdb_path, repository,
repos_root, pool);
/* Same for the groupsdb_path if it is present. */
if (groupsdb_path && !err)
- err = canonicalize_access_file(&groupsdb_path, server,
+ err = canonicalize_access_file(&groupsdb_path, repository,
repos_root, pool);
if (!err)
- err = svn_repos_authz_read2(&server->authzdb, authzdb_path,
- groupsdb_path, TRUE, pool);
+ err = svn_repos__authz_pool_get(&repository->authzdb, authz_pool,
+ authzdb_path, groupsdb_path, TRUE,
+ repository->repos, pool);
if (err)
- {
- log_server_error(err, server, conn, pool);
- svn_error_clear(err);
- return svn_error_create(SVN_ERR_AUTHZ_INVALID_CONFIG, NULL, NULL);
- }
+ return svn_error_create(SVN_ERR_AUTHZ_INVALID_CONFIG, err, NULL);
/* Are we going to be case-normalizing usernames when we consult
* this authz file? */
- svn_config_get(server->cfg, &case_force_val, SVN_CONFIG_SECTION_GENERAL,
+ svn_config_get(cfg, &case_force_val,
+ SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_FORCE_USERNAME_CASE, NULL);
if (case_force_val)
{
if (strcmp(case_force_val, "upper") == 0)
- server->username_case = CASE_FORCE_UPPER;
+ repository->username_case = CASE_FORCE_UPPER;
else if (strcmp(case_force_val, "lower") == 0)
- server->username_case = CASE_FORCE_LOWER;
+ repository->username_case = CASE_FORCE_LOWER;
else
- server->username_case = CASE_ASIS;
+ repository->username_case = CASE_ASIS;
}
}
else
{
- server->authzdb = NULL;
- server->username_case = CASE_ASIS;
+ repository->authzdb = NULL;
+ repository->username_case = CASE_ASIS;
}
return SVN_NO_ERROR;
}
+/* If ERROR is a AUTH* error as returned by load_pwdb_config or
+ * load_authz_config, write it to SERVER's log file.
+ * Return a sanitized version of ERROR.
+ */
+static svn_error_t *
+handle_config_error(svn_error_t *error,
+ server_baton_t *server)
+{
+ if ( error
+ && ( error->apr_err == SVN_ERR_AUTHZ_INVALID_CONFIG
+ || error->apr_err == SVN_ERR_AUTHN_FAILED))
+ {
+ apr_status_t apr_err = error->apr_err;
+ log_error(error, server);
+
+ /* Now that we've logged the error, clear it and return a
+ * nice, generic error to the user:
+ * http://subversion.tigris.org/issues/show_bug.cgi?id=2271 */
+ svn_error_clear(error);
+ return svn_error_create(apr_err, NULL, NULL);
+ }
+
+ return error;
+}
+
/* Set *FS_PATH to the portion of URL that is the path within the
repository, if URL is inside REPOS_URL (if URL is not inside
REPOS_URL, then error, with the effect on *FS_PATH undefined).
@@ -450,14 +422,16 @@ static svn_error_t *authz_check_access(svn_boolean_t *allowed,
const char *path,
svn_repos_authz_access_t required,
server_baton_t *b,
- svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
+ repository_t *repository = b->repository;
+ client_info_t *client_info = b->client_info;
+
/* If authz cannot be performed, grant access. This is NOT the same
as the default policy when authz is performed on a path with no
rules. In the latter case, the default is to deny access, and is
set by svn_repos_authz_check_access. */
- if (!b->authzdb)
+ if (!repository->authzdb)
{
*allowed = TRUE;
return SVN_NO_ERROR;
@@ -475,21 +449,23 @@ static svn_error_t *authz_check_access(svn_boolean_t *allowed,
/* If we have a username, and we've not yet used it + any username
case normalization that might be requested to determine "the
username we used for authz purposes", do so now. */
- if (b->user && (! b->authz_user))
+ if (client_info->user && (! client_info->authz_user))
{
- char *authz_user = apr_pstrdup(b->pool, b->user);
- if (b->username_case == CASE_FORCE_UPPER)
+ char *authz_user = apr_pstrdup(b->pool, client_info->user);
+ if (repository->username_case == CASE_FORCE_UPPER)
convert_case(authz_user, TRUE);
- else if (b->username_case == CASE_FORCE_LOWER)
+ else if (repository->username_case == CASE_FORCE_LOWER)
convert_case(authz_user, FALSE);
- b->authz_user = authz_user;
+
+ client_info->authz_user = authz_user;
}
- SVN_ERR(svn_repos_authz_check_access(b->authzdb, b->authz_repos_name,
- path, b->authz_user, required,
- allowed, pool));
+ SVN_ERR(svn_repos_authz_check_access(repository->authzdb,
+ repository->authz_repos_name,
+ path, client_info->authz_user,
+ required, allowed, pool));
if (!*allowed)
- SVN_ERR(log_authz_denied(path, required, b, conn, pool));
+ SVN_ERR(log_authz_denied(path, required, b, pool));
return SVN_NO_ERROR;
}
@@ -507,14 +483,14 @@ static svn_error_t *authz_check_access_cb(svn_boolean_t *allowed,
authz_baton_t *sb = baton;
return authz_check_access(allowed, path, svn_authz_read,
- sb->server, sb->conn, pool);
+ sb->server, pool);
}
/* If authz is enabled in the specified BATON, return a read authorization
function. Otherwise, return NULL. */
static svn_repos_authz_func_t authz_check_access_cb_func(server_baton_t *baton)
{
- if (baton->authzdb)
+ if (baton->repository->authzdb)
return authz_check_access_cb;
return NULL;
}
@@ -533,27 +509,50 @@ static svn_error_t *authz_commit_cb(svn_repos_authz_access_t required,
{
authz_baton_t *sb = baton;
- return authz_check_access(allowed, path, required,
- sb->server, sb->conn, pool);
+ return authz_check_access(allowed, path, required, sb->server, pool);
}
-
-enum access_type get_access(server_baton_t *b, enum authn_type auth)
+/* Return the access level specified for OPTION in CFG. If no such
+ * setting exists, use DEF. If READ_ONLY is set, unconditionally disable
+ * write access.
+ */
+static enum access_type
+get_access(svn_config_t *cfg,
+ const char *option,
+ const char *def,
+ svn_boolean_t read_only)
{
- const char *var = (auth == AUTHENTICATED) ? SVN_CONFIG_OPTION_AUTH_ACCESS :
- SVN_CONFIG_OPTION_ANON_ACCESS;
- const char *val, *def = (auth == AUTHENTICATED) ? "write" : "read";
enum access_type result;
+ const char *val;
- svn_config_get(b->cfg, &val, SVN_CONFIG_SECTION_GENERAL, var, def);
+ svn_config_get(cfg, &val, SVN_CONFIG_SECTION_GENERAL, option, def);
result = (strcmp(val, "write") == 0 ? WRITE_ACCESS :
strcmp(val, "read") == 0 ? READ_ACCESS : NO_ACCESS);
- return (result == WRITE_ACCESS && b->read_only) ? READ_ACCESS : result;
+
+ return result == WRITE_ACCESS && read_only ? READ_ACCESS : result;
}
-static enum access_type current_access(server_baton_t *b)
+/* Set the *_ACCESS members in REPOSITORY according to the settings in
+ * CFG. If READ_ONLY is set, unconditionally disable write access.
+ */
+static void
+set_access(repository_t *repository,
+ svn_config_t *cfg,
+ svn_boolean_t read_only)
{
- return get_access(b, (b->user) ? AUTHENTICATED : UNAUTHENTICATED);
+ repository->auth_access = get_access(cfg, SVN_CONFIG_OPTION_AUTH_ACCESS,
+ "write", read_only);
+ repository->anon_access = get_access(cfg, SVN_CONFIG_OPTION_ANON_ACCESS,
+ "read", read_only);
+}
+
+/* Return the access level for the user in B.
+ */
+static enum access_type
+current_access(server_baton_t *b)
+{
+ return b->client_info->user ? b->repository->auth_access
+ : b->repository->anon_access;
}
/* Send authentication mechs for ACCESS_TYPE to the client. If NEEDS_USERNAME
@@ -563,11 +562,11 @@ static svn_error_t *send_mechs(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
server_baton_t *b, enum access_type required,
svn_boolean_t needs_username)
{
- if (!needs_username && get_access(b, UNAUTHENTICATED) >= required)
+ if (!needs_username && b->repository->anon_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "ANONYMOUS"));
- if (b->tunnel_user && get_access(b, AUTHENTICATED) >= required)
+ if (b->client_info->tunnel_user && b->repository->auth_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "EXTERNAL"));
- if (b->pwdb && get_access(b, AUTHENTICATED) >= required)
+ if (b->repository->pwdb && b->repository->auth_access >= required)
SVN_ERR(svn_ra_svn__write_word(conn, pool, "CRAM-MD5"));
return SVN_NO_ERROR;
}
@@ -607,15 +606,15 @@ create_fs_access(server_baton_t *b, apr_pool_t *pool)
svn_fs_access_t *fs_access;
struct cleanup_fs_access_baton *cleanup_baton;
- if (!b->user)
+ if (!b->client_info->user)
return SVN_NO_ERROR;
- SVN_ERR(svn_fs_create_access(&fs_access, b->user, pool));
- SVN_ERR(svn_fs_set_access(b->fs, fs_access));
+ SVN_ERR(svn_fs_create_access(&fs_access, b->client_info->user, pool));
+ SVN_ERR(svn_fs_set_access(b->repository->fs, fs_access));
cleanup_baton = apr_pcalloc(pool, sizeof(*cleanup_baton));
cleanup_baton->pool = pool;
- cleanup_baton->fs = b->fs;
+ cleanup_baton->fs = b->repository->fs;
apr_pool_cleanup_register(pool, cleanup_baton, cleanup_fs_access,
apr_pool_cleanup_null);
@@ -637,19 +636,19 @@ static svn_error_t *auth(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
const char *user;
*success = FALSE;
- if (get_access(b, AUTHENTICATED) >= required
- && b->tunnel_user && strcmp(mech, "EXTERNAL") == 0)
+ if (b->repository->auth_access >= required
+ && b->client_info->tunnel_user && strcmp(mech, "EXTERNAL") == 0)
{
- if (*mecharg && strcmp(mecharg, b->tunnel_user) != 0)
+ if (*mecharg && strcmp(mecharg, b->client_info->tunnel_user) != 0)
return svn_ra_svn__write_tuple(conn, pool, "w(c)", "failure",
"Requested username does not match");
- b->user = b->tunnel_user;
+ b->client_info->user = b->client_info->tunnel_user;
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w()", "success"));
*success = TRUE;
return SVN_NO_ERROR;
}
- if (get_access(b, UNAUTHENTICATED) >= required
+ if (b->repository->anon_access >= required
&& strcmp(mech, "ANONYMOUS") == 0 && ! needs_username)
{
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w()", "success"));
@@ -657,11 +656,12 @@ static svn_error_t *auth(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return SVN_NO_ERROR;
}
- if (get_access(b, AUTHENTICATED) >= required
- && b->pwdb && strcmp(mech, "CRAM-MD5") == 0)
+ if (b->repository->auth_access >= required
+ && b->repository->pwdb && strcmp(mech, "CRAM-MD5") == 0)
{
- SVN_ERR(svn_ra_svn_cram_server(conn, pool, b->pwdb, &user, success));
- b->user = apr_pstrdup(b->pool, user);
+ SVN_ERR(svn_ra_svn_cram_server(conn, pool, b->repository->pwdb,
+ &user, success));
+ b->client_info->user = apr_pstrdup(b->pool, user);
return SVN_NO_ERROR;
}
@@ -680,7 +680,7 @@ internal_auth_request(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
SVN_ERR(send_mechs(conn, pool, b, required, needs_username));
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)c)", b->realm));
+ SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)c)", b->repository->realm));
do
{
SVN_ERR(svn_ra_svn__read_tuple(conn, pool, "w(?c)", &mech, &mecharg));
@@ -702,7 +702,7 @@ static svn_error_t *auth_request(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_boolean_t needs_username)
{
#ifdef SVN_HAVE_SASL
- if (b->use_sasl)
+ if (b->repository->use_sasl)
return cyrus_auth_request(conn, pool, b, required, needs_username);
#endif
@@ -732,7 +732,6 @@ static svn_error_t *trivial_auth_request(svn_ra_svn_conn_t *conn,
*/
static svn_boolean_t lookup_access(apr_pool_t *pool,
server_baton_t *baton,
- svn_ra_svn_conn_t *conn,
svn_repos_authz_access_t required,
const char *path,
svn_boolean_t needs_username)
@@ -743,12 +742,12 @@ static svn_boolean_t lookup_access(apr_pool_t *pool,
svn_error_t *err;
/* Get authz's opinion on the access. */
- err = authz_check_access(&authorized, path, required, baton, conn, pool);
+ err = authz_check_access(&authorized, path, required, baton, pool);
/* If an error made lookup fail, deny access. */
if (err)
{
- log_server_error(err, baton, conn, pool);
+ log_error(err, baton);
svn_error_clear(err);
return FALSE;
}
@@ -758,7 +757,7 @@ static svn_boolean_t lookup_access(apr_pool_t *pool,
lookup has succeeded. */
if (current_access(baton) >= req
&& authorized
- && (! needs_username || baton->user))
+ && (! needs_username || baton->client_info->user))
return TRUE;
return FALSE;
@@ -791,7 +790,7 @@ static svn_error_t *must_have_access(svn_ra_svn_conn_t *conn,
/* See whether the user already has the required access. If so,
nothing needs to be done. Create the FS access and send a
trivial auth request. */
- if (lookup_access(pool, b, conn, required, path, needs_username))
+ if (lookup_access(pool, b, required, path, needs_username))
{
SVN_ERR(create_fs_access(b, pool));
return trivial_auth_request(conn, pool, b);
@@ -803,17 +802,18 @@ static svn_error_t *must_have_access(svn_ra_svn_conn_t *conn,
requiring a username because we need one to be able to check
authz configuration again with a different user credentials than
the first time round. */
- if (b->user == NULL
- && get_access(b, AUTHENTICATED) >= req
- && (b->tunnel_user || b->pwdb || b->use_sasl))
+ if (b->client_info->user == NULL
+ && b->repository->auth_access >= req
+ && (b->client_info->tunnel_user || b->repository->pwdb
+ || b->repository->use_sasl))
SVN_ERR(auth_request(conn, pool, b, req, TRUE));
/* Now that an authentication has been done get the new take of
authz on the request. */
- if (! lookup_access(pool, b, conn, required, path, needs_username))
+ if (! lookup_access(pool, b, required, path, needs_username))
return svn_error_create(SVN_ERR_RA_SVN_CMD_ERR,
error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
- NULL, NULL, b, conn, pool),
+ NULL, NULL, b),
NULL);
/* Else, access is granted, and there is much rejoicing. */
@@ -966,17 +966,18 @@ static svn_error_t *accept_report(svn_boolean_t *only_empty_entry,
/* Make an svn_repos report baton. Tell it to drive the network editor
* when the report is complete. */
svn_ra_svn_get_editor(&editor, &edit_baton, conn, pool, NULL, NULL);
- SVN_CMD_ERR(svn_repos_begin_report3(&report_baton, rev, b->repos,
- b->fs_path->data, target, tgt_path,
- text_deltas, depth, ignore_ancestry,
- send_copyfrom_args,
+ SVN_CMD_ERR(svn_repos_begin_report3(&report_baton, rev,
+ b->repository->repos,
+ b->repository->fs_path->data, target,
+ tgt_path, text_deltas, depth,
+ ignore_ancestry, send_copyfrom_args,
editor, edit_baton,
authz_check_access_cb_func(b),
&ab, svn_ra_svn_zero_copy_limit(conn),
pool));
rb.sb = b;
- rb.repos_url = svn_path_uri_decode(b->repos_url, pool);
+ rb.repos_url = svn_path_uri_decode(b->repository->repos_url, pool);
rb.report_baton = report_baton;
rb.err = NULL;
rb.entry_counter = 0;
@@ -1028,7 +1029,7 @@ static svn_error_t *write_prop_diffs(svn_ra_svn_conn_t *conn,
/* Write out a lock to the client. */
static svn_error_t *write_lock(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- svn_lock_t *lock)
+ const svn_lock_t *lock)
{
const char *cdate, *edate;
@@ -1065,8 +1066,7 @@ get_props(apr_hash_t **props,
/* Hardcode the values for the committed revision, date, and author. */
SVN_ERR(svn_repos_get_committed_info(&crev, &cdate, &cauthor, root,
path, pool));
- str = svn_string_create(apr_psprintf(pool, "%ld", crev),
- pool);
+ str = svn_string_createf(pool, "%ld", crev);
svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_REV, str);
str = (cdate) ? svn_string_create(cdate, pool) : NULL;
svn_hash_sets(*props, SVN_PROP_ENTRY_COMMITTED_DATE, str);
@@ -1102,11 +1102,11 @@ static svn_error_t *reparent(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &url));
url = svn_uri_canonicalize(url, pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repos_url, pool),
+ SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url, pool),
svn_path_uri_decode(url, pool),
&fs_path));
SVN_ERR(log_command(b, conn, pool, "%s", svn_log__reparent(fs_path, pool)));
- svn_stringbuf_set(b->fs_path, fs_path);
+ svn_stringbuf_set(b->repository->fs_path, fs_path);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
}
@@ -1120,7 +1120,7 @@ static svn_error_t *get_latest_rev(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(log_command(b, conn, pool, "get-latest-rev"));
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", rev));
return SVN_NO_ERROR;
}
@@ -1138,7 +1138,7 @@ static svn_error_t *get_dated_rev(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_CMD_ERR(svn_time_from_cstring(&tm, timestr, pool));
- SVN_CMD_ERR(svn_repos_dated_revision(&rev, b->repos, tm, pool));
+ SVN_CMD_ERR(svn_repos_dated_revision(&rev, b->repository->repos, tm, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", rev));
return SVN_NO_ERROR;
}
@@ -1160,7 +1160,8 @@ static svn_error_t *do_change_rev_prop(svn_ra_svn_conn_t *conn,
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write, NULL, FALSE));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__change_rev_prop(rev, name, pool)));
- SVN_CMD_ERR(svn_repos_fs_change_rev_prop4(b->repos, rev, b->user,
+ SVN_CMD_ERR(svn_repos_fs_change_rev_prop4(b->repository->repos, rev,
+ b->client_info->user,
name, old_value_p, value,
TRUE, TRUE,
authz_check_access_cb_func(b), &ab,
@@ -1239,9 +1240,10 @@ static svn_error_t *rev_proplist(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(log_command(b, conn, pool, "%s", svn_log__rev_proplist(rev, pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props, b->repos, rev,
- authz_check_access_cb_func(b), &ab,
- pool));
+ SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props, b->repository->repos,
+ rev,
+ authz_check_access_cb_func(b),
+ &ab, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
SVN_ERR(svn_ra_svn__write_proplist(conn, pool, props));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
@@ -1265,9 +1267,9 @@ static svn_error_t *rev_prop(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_log__rev_prop(rev, name, pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_CMD_ERR(svn_repos_fs_revision_prop(&value, b->repos, rev, name,
- authz_check_access_cb_func(b), &ab,
- pool));
+ SVN_CMD_ERR(svn_repos_fs_revision_prop(&value, b->repository->repos, rev,
+ name, authz_check_access_cb_func(b),
+ &ab, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "(?s)", value));
return SVN_NO_ERROR;
}
@@ -1294,15 +1296,14 @@ static svn_error_t *commit_done(const svn_commit_info_t *commit_info,
* violates the authz configuration, return SVN_ERR_RA_NOT_AUTHORIZED
* to the client. Use POOL for temporary allocations only.
*/
-static svn_error_t *add_lock_tokens(svn_ra_svn_conn_t *conn,
- const apr_array_header_t *lock_tokens,
+static svn_error_t *add_lock_tokens(const apr_array_header_t *lock_tokens,
server_baton_t *sb,
apr_pool_t *pool)
{
int i;
svn_fs_access_t *fs_access;
- SVN_ERR(svn_fs_get_access(&fs_access, sb->fs));
+ SVN_ERR(svn_fs_get_access(&fs_access, sb->repository->fs));
/* If there is no access context, nowhere to add the tokens. */
if (! fs_access)
@@ -1329,14 +1330,13 @@ static svn_error_t *add_lock_tokens(svn_ra_svn_conn_t *conn,
"Lock token isn't a string");
path = path_item->u.string->data;
- full_path = svn_fspath__join(sb->fs_path->data,
+ full_path = svn_fspath__join(sb->repository->fs_path->data,
svn_relpath_canonicalize(path, pool),
pool);
- if (! lookup_access(pool, sb, conn, svn_authz_write,
- full_path, TRUE))
+ if (! lookup_access(pool, sb, svn_authz_write, full_path, TRUE))
return error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL, NULL,
- sb, conn, pool);
+ sb);
token = token_item->u.string->data;
SVN_ERR(svn_fs_access_add_lock_token2(fs_access, path, token));
@@ -1345,45 +1345,58 @@ static svn_error_t *add_lock_tokens(svn_ra_svn_conn_t *conn,
return SVN_NO_ERROR;
}
+/* Implements svn_fs_lock_callback_t. */
+static svn_error_t *
+lock_cb(void *baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ server_baton_t *sb = baton;
+
+ log_error(fs_err, sb);
+
+ return SVN_NO_ERROR;
+}
+
/* Unlock the paths with lock tokens in LOCK_TOKENS, ignoring any errors.
LOCK_TOKENS contains svn_ra_svn_item_t elements, assumed to be lists. */
static svn_error_t *unlock_paths(const apr_array_header_t *lock_tokens,
server_baton_t *sb,
- svn_ra_svn_conn_t *conn,
apr_pool_t *pool)
{
int i;
- apr_pool_t *iterpool;
-
- iterpool = svn_pool_create(pool);
+ apr_pool_t *subpool = svn_pool_create(pool);
+ apr_hash_t *targets = apr_hash_make(subpool);
+ svn_error_t *err;
for (i = 0; i < lock_tokens->nelts; ++i)
{
svn_ra_svn_item_t *item, *path_item, *token_item;
const char *path, *token, *full_path;
- svn_error_t *err;
- svn_pool_clear(iterpool);
item = &APR_ARRAY_IDX(lock_tokens, i, svn_ra_svn_item_t);
path_item = &APR_ARRAY_IDX(item->u.list, 0, svn_ra_svn_item_t);
token_item = &APR_ARRAY_IDX(item->u.list, 1, svn_ra_svn_item_t);
path = path_item->u.string->data;
+ full_path = svn_fspath__join(sb->repository->fs_path->data,
+ svn_relpath_canonicalize(path, subpool),
+ subpool);
token = token_item->u.string->data;
+ svn_hash_sets(targets, full_path, token);
+ }
- full_path = svn_fspath__join(sb->fs_path->data,
- svn_relpath_canonicalize(path, iterpool),
- iterpool);
- /* The lock may have become defunct after the commit, so ignore such
- errors. */
- err = svn_repos_fs_unlock(sb->repos, full_path, token,
- FALSE, iterpool);
- log_server_error(err, sb, conn, iterpool);
- svn_error_clear(err);
- }
+ /* The lock may have become defunct after the commit, so ignore such
+ errors. */
+ err = svn_repos_fs_unlock_many(sb->repository->repos, targets, FALSE,
+ lock_cb, sb, subpool, subpool);
+ log_error(err, sb);
+ svn_error_clear(err);
- svn_pool_destroy(iterpool);
+ svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
@@ -1392,13 +1405,13 @@ static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
- const char *log_msg = NULL,
+ const char *log_msg,
*date = NULL,
*author = NULL,
*post_commit_err = NULL;
apr_array_header_t *lock_tokens;
svn_boolean_t keep_locks;
- apr_array_header_t *revprop_list = NULL;
+ apr_array_header_t *revprop_list;
apr_hash_t *revprop_table;
const svn_delta_editor_t *editor;
void *edit_baton;
@@ -1439,7 +1452,7 @@ static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
/* Authorize the lock tokens and give them to the FS if we got
any. */
if (lock_tokens && lock_tokens->nelts)
- SVN_CMD_ERR(add_lock_tokens(conn, lock_tokens, b, pool));
+ SVN_CMD_ERR(add_lock_tokens(lock_tokens, b, pool));
/* Ignore LOG_MSG, per the protocol. See ra_svn_commit(). */
if (revprop_list)
@@ -1454,7 +1467,9 @@ static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
/* Get author from the baton, making sure clients can't circumvent
the authentication via the revision props. */
svn_hash_sets(revprop_table, SVN_PROP_REVISION_AUTHOR,
- b->user ? svn_string_create(b->user, pool) : NULL);
+ b->client_info->user
+ ? svn_string_create(b->client_info->user, pool)
+ : NULL);
ccb.pool = pool;
ccb.new_rev = &new_rev;
@@ -1463,9 +1478,9 @@ static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
ccb.post_commit_err = &post_commit_err;
/* ### Note that svn_repos_get_commit_editor5 actually wants a decoded URL. */
SVN_CMD_ERR(svn_repos_get_commit_editor5
- (&editor, &edit_baton, b->repos, NULL,
- svn_path_uri_decode(b->repos_url, pool),
- b->fs_path->data, revprop_table,
+ (&editor, &edit_baton, b->repository->repos, NULL,
+ svn_path_uri_decode(b->repository->repos_url, pool),
+ b->repository->fs_path->data, revprop_table,
commit_done, &ccb,
authz_commit_cb, &ab, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
@@ -1482,18 +1497,18 @@ static svn_error_t *commit(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
and thus kill the server. But otherwise, deltify after
answering the client, to avoid user-visible delay. */
- if (b->tunnel)
- SVN_ERR(svn_fs_deltify_revision(b->fs, new_rev, pool));
+ if (b->client_info->tunnel)
+ SVN_ERR(svn_fs_deltify_revision(b->repository->fs, new_rev, pool));
/* Unlock the paths. */
if (! keep_locks && lock_tokens && lock_tokens->nelts)
- SVN_ERR(unlock_paths(lock_tokens, b, conn, pool));
+ SVN_ERR(unlock_paths(lock_tokens, b, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "r(?c)(?c)(?c)",
new_rev, date, author, post_commit_err));
- if (! b->tunnel)
- SVN_ERR(svn_fs_deltify_revision(b->fs, new_rev, pool));
+ if (! b->client_info->tunnel)
+ SVN_ERR(svn_fs_deltify_revision(b->repository->fs, new_rev, pool));
}
return SVN_NO_ERROR;
}
@@ -1529,7 +1544,7 @@ static svn_error_t *get_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
if (wants_inherited_props == SVN_RA_SVN_UNSPECIFIED_NUMBER)
wants_inherited_props = FALSE;
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
@@ -1537,14 +1552,14 @@ static svn_error_t *get_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_file(full_path, rev,
want_contents, want_props, pool)));
/* Fetch the properties and a stream for the contents. */
- SVN_CMD_ERR(svn_fs_revision_root(&root, b->fs, rev, pool));
+ SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, root,
full_path, TRUE, pool));
hex_digest = svn_checksum_to_cstring_display(checksum, pool);
@@ -1594,7 +1609,7 @@ static svn_error_t *get_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
while (1)
{
len = sizeof(buf);
- err = svn_stream_read(contents, buf, &len);
+ err = svn_stream_read_full(contents, buf, &len);
if (err)
break;
if (len > 0)
@@ -1683,7 +1698,7 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
}
}
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
@@ -1691,7 +1706,7 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_dir(full_path, rev,
@@ -1699,7 +1714,7 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
dirent_fields, pool)));
/* Fetch the root of the appropriate revision. */
- SVN_CMD_ERR(svn_fs_revision_root(&root, b->fs, rev, pool));
+ SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
/* Fetch the directory's explicit and/or inherited properties if
requested. Although the wants-iprops boolean was added to the
@@ -1731,8 +1746,8 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
subpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_fs_dirent_t *fsent = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_fs_dirent_t *fsent = apr_hash_this_val(hi);
const char *file_path;
/* The fields in the entry tuple. */
@@ -1751,8 +1766,7 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_pool_clear(subpool);
file_path = svn_fspath__join(full_path, name, subpool);
- if (! lookup_access(subpool, b, conn, svn_authz_read,
- file_path, FALSE))
+ if (! lookup_access(subpool, b, svn_authz_read, file_path, FALSE))
continue;
if (dirent_fields & SVN_DIRENT_KIND)
@@ -1765,12 +1779,9 @@ static svn_error_t *get_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
if (dirent_fields & SVN_DIRENT_HAS_PROPS)
{
- apr_hash_t *file_props;
-
/* has_props */
- SVN_CMD_ERR(svn_fs_node_proplist(&file_props, root, file_path,
+ SVN_CMD_ERR(svn_fs_node_has_props(&has_props, root, file_path,
subpool));
- has_props = (apr_hash_count(file_props) > 0);
}
if ((dirent_fields & SVN_DIRENT_LAST_AUTHOR)
@@ -1834,15 +1845,15 @@ static svn_error_t *update(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_revnum_t rev;
const char *target, *full_path, *depth_word;
svn_boolean_t recurse;
- apr_uint64_t send_copyfrom_args; /* Optional; default FALSE */
- apr_uint64_t ignore_ancestry; /* Optional; default FALSE */
+ svn_tristate_t send_copyfrom_args; /* Optional; default FALSE */
+ svn_tristate_t ignore_ancestry; /* Optional; default FALSE */
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
svn_boolean_t is_checkout;
/* Parse the arguments. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cb?wB?B", &rev, &target,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cb?w3?3", &rev, &target,
&recurse, &depth_word,
&send_copyfrom_args, &ignore_ancestry));
target = svn_relpath_canonicalize(target, pool);
@@ -1852,18 +1863,18 @@ static svn_error_t *update(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
else
depth = SVN_DEPTH_INFINITY_OR_FILES(recurse);
- full_path = svn_fspath__join(b->fs_path->data, target, pool);
+ full_path = svn_fspath__join(b->repository->fs_path->data, target, pool);
/* Check authorization and authenticate the user if necessary. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read, full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(accept_report(&is_checkout, NULL,
conn, pool, b, rev, target, NULL, TRUE,
depth,
- (send_copyfrom_args == TRUE) /* send_copyfrom_args */,
- (ignore_ancestry == TRUE) /* ignore_ancestry */));
+ (send_copyfrom_args == svn_tristate_true),
+ (ignore_ancestry == svn_tristate_true)));
if (is_checkout)
{
SVN_ERR(log_command(b, conn, pool, "%s",
@@ -1874,7 +1885,9 @@ static svn_error_t *update(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
{
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__update(full_path, rev, depth,
- send_copyfrom_args, pool)));
+ (send_copyfrom_args
+ == svn_tristate_true),
+ pool)));
}
return SVN_NO_ERROR;
@@ -1891,11 +1904,11 @@ static svn_error_t *switch_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
/* Default to unknown. Old clients won't send depth, but we'll
handle that by converting recurse if necessary. */
svn_depth_t depth = svn_depth_unknown;
- apr_uint64_t send_copyfrom_args; /* Optional; default FALSE */
- apr_uint64_t ignore_ancestry; /* Optional; default TRUE */
+ svn_tristate_t send_copyfrom_args; /* Optional; default FALSE */
+ svn_tristate_t ignore_ancestry; /* Optional; default TRUE */
/* Parse the arguments. */
- SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cbc?w?BB", &rev, &target,
+ SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?r)cbc?w?33", &rev, &target,
&recurse, &switch_url, &depth_word,
&send_copyfrom_args, &ignore_ancestry));
target = svn_relpath_canonicalize(target, pool);
@@ -1908,14 +1921,16 @@ static svn_error_t *switch_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
- SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repos_url, pool),
+ SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url,
+ pool),
svn_path_uri_decode(switch_url, pool),
&switch_path));
{
- const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
+ const char *full_path = svn_fspath__join(b->repository->fs_path->data,
+ target, pool);
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__switch(full_path, switch_path, rev,
depth, pool)));
@@ -1924,8 +1939,8 @@ static svn_error_t *switch_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return accept_report(NULL, NULL,
conn, pool, b, rev, target, switch_path, TRUE,
depth,
- (send_copyfrom_args == TRUE) /* send_copyfrom_args */,
- (ignore_ancestry != FALSE) /* ignore_ancestry */);
+ (send_copyfrom_args == svn_tristate_true),
+ (ignore_ancestry != svn_tristate_false));
}
static svn_error_t *status(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
@@ -1951,10 +1966,11 @@ static svn_error_t *status(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
{
- const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
+ const char *full_path = svn_fspath__join(b->repository->fs_path->data,
+ target, pool);
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__status(full_path, rev, depth, pool)));
}
@@ -2002,13 +2018,15 @@ static svn_error_t *diff(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(trivial_auth_request(conn, pool, b));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
- SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repos_url, pool),
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
+ SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repository->repos_url,
+ pool),
svn_path_uri_decode(versus_url, pool),
&versus_path));
{
- const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
+ const char *full_path = svn_fspath__join(b->repository->fs_path->data,
+ target, pool);
svn_revnum_t from_rev;
SVN_ERR(accept_report(NULL, &from_rev,
conn, pool, b, rev, target, versus_path,
@@ -2060,7 +2078,7 @@ static svn_error_t *get_mergeinfo(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Path is not a string"));
full_path = svn_relpath_canonicalize(item->u.string->data, pool);
- full_path = svn_fspath__join(b->fs_path->data, full_path, pool);
+ full_path = svn_fspath__join(b->repository->fs_path->data, full_path, pool);
APR_ARRAY_PUSH(canonical_paths, const char *) = full_path;
}
@@ -2070,20 +2088,20 @@ static svn_error_t *get_mergeinfo(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
pool)));
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_CMD_ERR(svn_repos_fs_get_mergeinfo(&mergeinfo, b->repos,
+ SVN_CMD_ERR(svn_repos_fs_get_mergeinfo(&mergeinfo, b->repository->repos,
canonical_paths, rev,
inherit,
include_descendants,
authz_check_access_cb_func(b), &ab,
pool));
SVN_ERR(svn_mergeinfo__remove_prefix_from_catalog(&mergeinfo, mergeinfo,
- b->fs_path->data, pool));
+ b->repository->fs_path->data, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
iterpool = svn_pool_create(pool);
for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- svn_mergeinfo_t value = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ svn_mergeinfo_t value = apr_hash_this_val(hi);
svn_string_t *mergeinfo_string;
svn_pool_clear(iterpool);
@@ -2107,9 +2125,8 @@ static svn_error_t *log_receiver(void *baton,
svn_ra_svn_conn_t *conn = b->conn;
apr_hash_index_t *h;
svn_boolean_t invalid_revnum = FALSE;
- char action[2];
- const char *author, *date, *message;
- apr_uint64_t revprop_count;
+ const svn_string_t *author, *date, *message;
+ unsigned revprop_count;
if (log_entry->revision == SVN_INVALID_REVNUM)
{
@@ -2125,43 +2142,57 @@ static svn_error_t *log_receiver(void *baton,
b->stack_depth--;
}
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "(!"));
+ svn_compat_log_revprops_out_string(&author, &date, &message,
+ log_entry->revprops);
+ svn_compat_log_revprops_clear(log_entry->revprops);
+ if (log_entry->revprops)
+ revprop_count = apr_hash_count(log_entry->revprops);
+ else
+ revprop_count = 0;
+
+ /* send LOG_ENTRY */
+ SVN_ERR(svn_ra_svn__start_list(conn, pool));
+
+ /* send LOG_ENTRY->CHANGED_PATHS2 */
+ SVN_ERR(svn_ra_svn__start_list(conn, pool));
if (log_entry->changed_paths2)
{
for (h = apr_hash_first(pool, log_entry->changed_paths2); h;
h = apr_hash_next(h))
{
- const char *path = svn__apr_hash_index_key(h);
- svn_log_changed_path2_t *change = svn__apr_hash_index_val(h);
+ const char *path = apr_hash_this_key(h);
+ svn_log_changed_path2_t *change = apr_hash_this_val(h);
- action[0] = change->action;
- action[1] = '\0';
- SVN_ERR(svn_ra_svn__write_tuple(
- conn, pool, "cw(?cr)(cbb)",
+ SVN_ERR(svn_ra_svn__write_data_log_changed_path(
+ conn, pool,
path,
- action,
+ change->action,
change->copyfrom_path,
change->copyfrom_rev,
- svn_node_kind_to_word(change->node_kind),
+ change->node_kind,
/* text_modified and props_modified are never unknown */
change->text_modified == svn_tristate_true,
change->props_modified == svn_tristate_true));
}
}
- svn_compat_log_revprops_out(&author, &date, &message, log_entry->revprops);
- svn_compat_log_revprops_clear(log_entry->revprops);
- if (log_entry->revprops)
- revprop_count = apr_hash_count(log_entry->revprops);
- else
- revprop_count = 0;
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)r(?c)(?c)(?c)bbn(!",
- log_entry->revision,
- author, date, message,
- log_entry->has_children,
- invalid_revnum, revprop_count));
- SVN_ERR(svn_ra_svn__write_proplist(conn, pool, log_entry->revprops));
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!)b",
- log_entry->subtractive_merge));
+ SVN_ERR(svn_ra_svn__end_list(conn, pool));
+
+ /* send LOG_ENTRY main members */
+ SVN_ERR(svn_ra_svn__write_data_log_entry(conn, pool,
+ log_entry->revision,
+ author, date, message,
+ log_entry->has_children,
+ invalid_revnum, revprop_count));
+
+ /* send LOG_ENTRY->REVPROPS */
+ SVN_ERR(svn_ra_svn__start_list(conn, pool));
+ if (revprop_count)
+ SVN_ERR(svn_ra_svn__write_proplist(conn, pool, log_entry->revprops));
+ SVN_ERR(svn_ra_svn__end_list(conn, pool));
+
+ /* send LOG_ENTRY members that were added in later SVN releases */
+ SVN_ERR(svn_ra_svn__write_boolean(conn, pool, log_entry->subtractive_merge));
+ SVN_ERR(svn_ra_svn__end_list(conn, pool));
if (log_entry->has_children)
b->stack_depth++;
@@ -2239,7 +2270,8 @@ static svn_error_t *log_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Log path entry not a string"));
full_path = svn_relpath_canonicalize(elt->u.string->data, pool),
- full_path = svn_fspath__join(b->fs_path->data, full_path, pool);
+ full_path = svn_fspath__join(b->repository->fs_path->data, full_path,
+ pool);
APR_ARRAY_PUSH(full_paths, const char *) = full_path;
}
SVN_ERR(trivial_auth_request(conn, pool, b));
@@ -2251,14 +2283,14 @@ static svn_error_t *log_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
revprops, pool)));
/* Get logs. (Can't report errors back to the client at this point.) */
- lb.fs_path = b->fs_path->data;
+ lb.fs_path = b->repository->fs_path->data;
lb.conn = conn;
lb.stack_depth = 0;
- err = svn_repos_get_logs4(b->repos, full_paths, start_rev, end_rev,
- (int) limit, send_changed_paths, strict_node,
- include_merged_revisions, revprops,
- authz_check_access_cb_func(b), &ab, log_receiver,
- &lb, pool);
+ err = svn_repos_get_logs4(b->repository->repos, full_paths, start_rev,
+ end_rev, (int) limit, send_changed_paths,
+ strict_node, include_merged_revisions,
+ revprops, authz_check_access_cb_func(b), &ab,
+ log_receiver, &lb, pool);
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
@@ -2281,7 +2313,7 @@ static svn_error_t *check_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_node_kind_t kind;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)", &path, &rev));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
@@ -2289,12 +2321,12 @@ static svn_error_t *check_path(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "check-path %s@%d",
svn_path_uri_encode(full_path, pool), rev));
- SVN_CMD_ERR(svn_fs_revision_root(&root, b->fs, rev, pool));
+ SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_fs_check_path(&kind, root, full_path, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "w",
svn_node_kind_to_word(kind)));
@@ -2311,7 +2343,7 @@ static svn_error_t *stat_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_dirent_t *dirent;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?r)", &path, &rev));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Check authorizations */
@@ -2319,12 +2351,12 @@ static svn_error_t *stat_cmd(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "stat %s@%d",
svn_path_uri_encode(full_path, pool), rev));
- SVN_CMD_ERR(svn_fs_revision_root(&root, b->fs, rev, pool));
+ SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, pool));
SVN_CMD_ERR(svn_repos_stat(&dirent, root, full_path, pool));
/* Need to return the equivalent of "(?l)", since that's what the
@@ -2372,7 +2404,8 @@ static svn_error_t *get_locations(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
&loc_revs_proto));
relative_path = svn_relpath_canonicalize(relative_path, pool);
- abs_path = svn_fspath__join(b->fs_path->data, relative_path, pool);
+ abs_path = svn_fspath__join(b->repository->fs_path->data, relative_path,
+ pool);
location_revisions = apr_array_make(pool, loc_revs_proto->nelts,
sizeof(svn_revnum_t));
@@ -2397,8 +2430,9 @@ static svn_error_t *get_locations(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
/* We store both err and write_err here, so the client will get
* the "done" even if there was an error in fetching the results. */
- err = svn_repos_trace_node_locations(b->fs, &fs_locations, abs_path,
- peg_revision, location_revisions,
+ err = svn_repos_trace_node_locations(b->repository->fs, &fs_locations,
+ abs_path, peg_revision,
+ location_revisions,
authz_check_access_cb_func(b), &ab,
pool);
@@ -2412,8 +2446,8 @@ static svn_error_t *get_locations(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
for (iter = apr_hash_first(pool, fs_locations); iter;
iter = apr_hash_next(iter))
{
- const svn_revnum_t *iter_key = svn__apr_hash_index_key(iter);
- const char *iter_value = svn__apr_hash_index_val(iter);
+ const svn_revnum_t *iter_key = apr_hash_this_key(iter);
+ const char *iter_value = apr_hash_this_val(iter);
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "rc",
*iter_key, iter_value));
@@ -2466,7 +2500,8 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
&start_rev, &end_rev));
relative_path = svn_relpath_canonicalize(relative_path, pool);
- abs_path = svn_fspath__join(b->fs_path->data, relative_path, pool);
+ abs_path = svn_fspath__join(b->repository->fs_path->data, relative_path,
+ pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(baton, conn, pool, "%s",
@@ -2479,7 +2514,16 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
{
svn_revnum_t youngest;
- SVN_CMD_ERR(svn_fs_youngest_rev(&youngest, b->fs, pool));
+ err = svn_fs_youngest_rev(&youngest, b->repository->fs, pool);
+
+ if (err)
+ {
+ err = svn_error_compose_create(
+ svn_ra_svn__write_word(conn, pool, "done"),
+ err);
+
+ return log_fail_and_flush(err, b, conn, pool);
+ }
if (!SVN_IS_VALID_REVNUM(start_rev))
start_rev = youngest;
@@ -2493,7 +2537,8 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
if (end_rev > start_rev)
{
- err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ err = svn_ra_svn__write_word(conn, pool, "done");
+ err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, err,
"Get-location-segments end revision must not be "
"younger than start revision");
return log_fail_and_flush(err, b, conn, pool);
@@ -2501,7 +2546,8 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
if (start_rev > peg_revision)
{
- err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ err = svn_ra_svn__write_word(conn, pool, "done");
+ err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, err,
"Get-location-segments start revision must not "
"be younger than peg revision");
return log_fail_and_flush(err, b, conn, pool);
@@ -2513,7 +2559,7 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
/* We store both err and write_err here, so the client will get
* the "done" even if there was an error in fetching the results. */
- err = svn_repos_node_location_segments(b->repos, abs_path,
+ err = svn_repos_node_location_segments(b->repository->repos, abs_path,
peg_revision, start_rev, end_rev,
gls_receiver, (void *)conn,
authz_check_access_cb_func(b), &ab,
@@ -2521,8 +2567,7 @@ static svn_error_t *get_location_segments(svn_ra_svn_conn_t *conn,
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
- svn_error_clear(err);
- return write_err;
+ return svn_error_compose_create(write_err, err);
}
SVN_CMD_ERR(err);
@@ -2621,7 +2666,7 @@ static svn_error_t *get_file_revs(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
&include_merged_revs_param));
path = svn_relpath_canonicalize(path, pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
- full_path = svn_fspath__join(b->fs_path->data, path, pool);
+ full_path = svn_fspath__join(b->repository->fs_path->data, path, pool);
if (include_merged_revs_param == SVN_RA_SVN_UNSPECIFIED_NUMBER)
include_merged_revisions = FALSE;
@@ -2636,8 +2681,8 @@ static svn_error_t *get_file_revs(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
frb.conn = conn;
frb.pool = NULL;
- err = svn_repos_get_file_revs2(b->repos, full_path, start_rev, end_rev,
- include_merged_revisions,
+ err = svn_repos_get_file_revs2(b->repository->repos, full_path, start_rev,
+ end_rev, include_merged_revisions,
authz_check_access_cb_func(b), &ab,
file_rev_handler, &frb, pool);
write_err = svn_ra_svn__write_word(conn, pool, "done");
@@ -2665,7 +2710,7 @@ static svn_error_t *lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)b(?r)", &path, &comment,
&steal_lock, &current_rev));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
@@ -2673,8 +2718,8 @@ static svn_error_t *lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__lock_one_path(full_path, steal_lock, pool)));
- SVN_CMD_ERR(svn_repos_fs_lock(&l, b->repos, full_path, NULL, comment, 0,
- 0, /* No expiration time. */
+ SVN_CMD_ERR(svn_repos_fs_lock(&l, b->repository->repos, full_path, NULL,
+ comment, 0, 0, /* No expiration time. */
current_rev, steal_lock, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(!", "success"));
@@ -2684,6 +2729,48 @@ static svn_error_t *lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return SVN_NO_ERROR;
}
+struct lock_result_t {
+ const svn_lock_t *lock;
+ svn_error_t *err;
+};
+
+struct lock_many_baton_t {
+ apr_hash_t *results;
+ apr_pool_t *pool;
+};
+
+/* Implements svn_fs_lock_callback_t. */
+static svn_error_t *
+lock_many_cb(void *baton,
+ const char *path,
+ const svn_lock_t *fs_lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_many_baton_t *b = baton;
+ struct lock_result_t *result = apr_palloc(b->pool,
+ sizeof(struct lock_result_t));
+
+ result->lock = fs_lock;
+ result->err = svn_error_dup(fs_err);
+ svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
+
+ return SVN_NO_ERROR;
+}
+
+static void
+clear_lock_result_hash(apr_hash_t *results,
+ apr_pool_t *scratch_pool)
+{
+ apr_hash_index_t *hi;
+
+ for (hi = apr_hash_first(scratch_pool, results); hi; hi = apr_hash_next(hi))
+ {
+ struct lock_result_t *result = apr_hash_this_val(hi);
+ svn_error_clear(result->err);
+ }
+}
+
static svn_error_t *lock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *params, void *baton)
{
@@ -2693,12 +2780,11 @@ static svn_error_t *lock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_boolean_t steal_lock;
int i;
apr_pool_t *subpool;
- const char *path;
- const char *full_path;
- svn_revnum_t current_rev;
- apr_array_header_t *log_paths;
- svn_lock_t *l;
- svn_error_t *err = SVN_NO_ERROR, *write_err;
+ svn_error_t *err, *write_err = SVN_NO_ERROR;
+ apr_hash_t *targets = apr_hash_make(pool);
+ apr_hash_t *authz_results = apr_hash_make(pool);
+ apr_hash_index_t *hi;
+ struct lock_many_baton_t lmb;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "(?c)bl", &comment, &steal_lock,
&path_revs));
@@ -2711,12 +2797,14 @@ static svn_error_t *lock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
an error. */
SVN_ERR(must_have_access(conn, pool, b, svn_authz_write, NULL, TRUE));
- /* Loop through the lock requests. */
- log_paths = apr_array_make(pool, path_revs->nelts, sizeof(full_path));
+ /* Parse the lock requests from PATH_REVS into TARGETS. */
for (i = 0; i < path_revs->nelts; ++i)
{
+ const char *path, *full_path;
+ svn_revnum_t current_rev;
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(path_revs, i,
svn_ra_svn_item_t);
+ svn_fs_lock_target_t *target;
svn_pool_clear(subpool);
@@ -2724,56 +2812,112 @@ static svn_error_t *lock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
"Lock requests should be list of lists");
- SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, pool, "c(?r)", &path,
+ SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?r)", &path,
&current_rev));
- /* Allocate the full_path out of pool so it will survive for use
- * by operational logging, after this loop. */
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
pool);
- APR_ARRAY_PUSH(log_paths, const char *) = full_path;
+ target = svn_fs_lock_target_create(NULL, current_rev, pool);
+
+ /* Any duplicate paths, once canonicalized, get collapsed into a
+ single path that is processed once. The result is then
+ returned multiple times. */
+ svn_hash_sets(targets, full_path, target);
+ }
+
+ SVN_ERR(log_command(b, conn, subpool, "%s",
+ svn_log__lock(targets, steal_lock, subpool)));
- if (! lookup_access(pool, b, conn, svn_authz_write, full_path, TRUE))
+ /* Check authz.
+
+ Note: From here on we need to make sure any errors in authz_results, or
+ results, are cleared before returning from this function. */
+ for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *full_path = apr_hash_this_key(hi);
+
+ svn_pool_clear(subpool);
+
+ if (! lookup_access(subpool, b, svn_authz_write, full_path, TRUE))
{
- err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL, NULL,
- b, conn, pool);
- break;
+ struct lock_result_t *result
+ = apr_palloc(pool, sizeof(struct lock_result_t));
+
+ result->lock = NULL;
+ result->err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
+ NULL, NULL, b);
+ svn_hash_sets(authz_results, full_path, result);
+ svn_hash_sets(targets, full_path, NULL);
}
+ }
- err = svn_repos_fs_lock(&l, b->repos, full_path,
- NULL, comment, FALSE,
- 0, /* No expiration time. */
- current_rev,
- steal_lock, subpool);
+ lmb.results = apr_hash_make(pool);
+ lmb.pool = pool;
- if (err)
+ err = svn_repos_fs_lock_many(b->repository->repos, targets,
+ comment, FALSE,
+ 0, /* No expiration time. */
+ steal_lock, lock_many_cb, &lmb,
+ pool, subpool);
+
+ /* Return results in the same order as the paths were supplied. */
+ for (i = 0; i < path_revs->nelts; ++i)
+ {
+ const char *path, *full_path;
+ svn_revnum_t current_rev;
+ svn_ra_svn_item_t *item = &APR_ARRAY_IDX(path_revs, i,
+ svn_ra_svn_item_t);
+ struct lock_result_t *result;
+
+ svn_pool_clear(subpool);
+
+ write_err = svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?r)", &path,
+ &current_rev);
+ if (write_err)
+ break;
+
+ full_path = svn_fspath__join(b->repository->fs_path->data,
+ svn_relpath_canonicalize(path, subpool),
+ subpool);
+
+ result = svn_hash_gets(lmb.results, full_path);
+ if (!result)
+ result = svn_hash_gets(authz_results, full_path);
+ if (!result)
{
- if (SVN_ERR_IS_LOCK_ERROR(err))
- {
- write_err = svn_ra_svn__write_cmd_failure(conn, pool, err);
- svn_error_clear(err);
- err = NULL;
- SVN_ERR(write_err);
- }
- else
- break;
+ /* No result? Something really odd happened, create a
+ placeholder error so that any other results can be
+ reported in the correct order. */
+ result = apr_palloc(pool, sizeof(struct lock_result_t));
+ result->err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED, 0,
+ _("No result for '%s'."), path);
+ svn_hash_sets(lmb.results, full_path, result);
}
+
+ if (result->err)
+ write_err = svn_ra_svn__write_cmd_failure(conn, subpool,
+ result->err);
else
{
- SVN_ERR(svn_ra_svn__write_tuple(conn, subpool, "w!", "success"));
- SVN_ERR(write_lock(conn, subpool, l));
- SVN_ERR(svn_ra_svn__write_tuple(conn, subpool, "!"));
+ write_err = svn_ra_svn__write_tuple(conn, subpool,
+ "w!", "success");
+ if (!write_err)
+ write_err = write_lock(conn, subpool, result->lock);
+ if (!write_err)
+ write_err = svn_ra_svn__write_tuple(conn, subpool, "!");
}
+ if (write_err)
+ break;
}
- svn_pool_destroy(subpool);
+ clear_lock_result_hash(authz_results, subpool);
+ clear_lock_result_hash(lmb.results, subpool);
- SVN_ERR(log_command(b, conn, pool, "%s",
- svn_log__lock(log_paths, steal_lock, pool)));
+ svn_pool_destroy(subpool);
- /* NOTE: err might contain a fatal locking error from the loop above. */
- write_err = svn_ra_svn__write_word(conn, pool, "done");
+ if (!write_err)
+ write_err = svn_ra_svn__write_word(conn, pool, "done");
if (!write_err)
SVN_CMD_ERR(err);
svn_error_clear(err);
@@ -2793,7 +2937,7 @@ static svn_error_t *unlock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c(?c)b", &path, &token,
&break_lock));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
/* Username required unless break_lock was specified. */
@@ -2802,8 +2946,8 @@ static svn_error_t *unlock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__unlock_one_path(full_path, break_lock, pool)));
- SVN_CMD_ERR(svn_repos_fs_unlock(b->repos, full_path, token, break_lock,
- pool));
+ SVN_CMD_ERR(svn_repos_fs_unlock(b->repository->repos, full_path, token,
+ break_lock, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
@@ -2818,11 +2962,11 @@ static svn_error_t *unlock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
apr_array_header_t *unlock_tokens;
int i;
apr_pool_t *subpool;
- const char *path;
- const char *full_path;
- apr_array_header_t *log_paths;
- const char *token;
- svn_error_t *err = SVN_NO_ERROR, *write_err;
+ svn_error_t *err = SVN_NO_ERROR, *write_err = SVN_NO_ERROR;
+ apr_hash_t *targets = apr_hash_make(pool);
+ apr_hash_t *authz_results = apr_hash_make(pool);
+ apr_hash_index_t *hi;
+ struct lock_many_baton_t lmb;
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "bl", &break_lock,
&unlock_tokens));
@@ -2832,12 +2976,12 @@ static svn_error_t *unlock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
subpool = svn_pool_create(pool);
- /* Loop through the unlock requests. */
- log_paths = apr_array_make(pool, unlock_tokens->nelts, sizeof(full_path));
+ /* Parse the unlock requests from PATH_REVS into TARGETS. */
for (i = 0; i < unlock_tokens->nelts; i++)
{
svn_ra_svn_item_t *item = &APR_ARRAY_IDX(unlock_tokens, i,
svn_ra_svn_item_t);
+ const char *path, *full_path, *token;
svn_pool_clear(subpool);
@@ -2847,51 +2991,106 @@ static svn_error_t *unlock_many(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?c)", &path,
&token));
+ if (!token)
+ token = "";
- /* Allocate the full_path out of pool so it will survive for use
- * by operational logging, after this loop. */
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, subpool),
pool);
- APR_ARRAY_PUSH(log_paths, const char *) = full_path;
- if (! lookup_access(subpool, b, conn, svn_authz_write, full_path,
+ /* Any duplicate paths, once canonicalized, get collapsed into a
+ single path that is processed once. The result is then
+ returned multiple times. */
+ svn_hash_sets(targets, full_path, token);
+ }
+
+ SVN_ERR(log_command(b, conn, subpool, "%s",
+ svn_log__unlock(targets, break_lock, subpool)));
+
+ /* Check authz.
+
+ Note: From here on we need to make sure any errors in authz_results, or
+ results, are cleared before returning from this function. */
+ for (hi = apr_hash_first(pool, targets); hi; hi = apr_hash_next(hi))
+ {
+ const char *full_path = apr_hash_this_key(hi);
+
+ svn_pool_clear(subpool);
+
+ if (! lookup_access(subpool, b, svn_authz_write, full_path,
! break_lock))
- return svn_error_create(SVN_ERR_RA_SVN_CMD_ERR,
- error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
- NULL, NULL,
- b, conn, pool),
- NULL);
-
- err = svn_repos_fs_unlock(b->repos, full_path, token, break_lock,
- subpool);
- if (err)
{
- if (SVN_ERR_IS_UNLOCK_ERROR(err))
- {
- write_err = svn_ra_svn__write_cmd_failure(conn, pool, err);
- svn_error_clear(err);
- err = NULL;
- SVN_ERR(write_err);
- }
- else
- break;
+ struct lock_result_t *result
+ = apr_palloc(pool, sizeof(struct lock_result_t));
+
+ result->lock = NULL;
+ result->err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED,
+ NULL, NULL, b);
+ svn_hash_sets(authz_results, full_path, result);
+ svn_hash_sets(targets, full_path, NULL);
}
+ }
+
+ lmb.results = apr_hash_make(pool);
+ lmb.pool = pool;
+
+ err = svn_repos_fs_unlock_many(b->repository->repos, targets,
+ break_lock, lock_many_cb, &lmb,
+ pool, subpool);
+
+ /* Return results in the same order as the paths were supplied. */
+ for (i = 0; i < unlock_tokens->nelts; ++i)
+ {
+ const char *path, *token, *full_path;
+ svn_ra_svn_item_t *item = &APR_ARRAY_IDX(unlock_tokens, i,
+ svn_ra_svn_item_t);
+ struct lock_result_t *result;
+
+ svn_pool_clear(subpool);
+
+ write_err = svn_ra_svn__parse_tuple(item->u.list, subpool, "c(?c)", &path,
+ &token);
+ if (write_err)
+ break;
+
+ full_path = svn_fspath__join(b->repository->fs_path->data,
+ svn_relpath_canonicalize(path, subpool),
+ pool);
+
+ result = svn_hash_gets(lmb.results, full_path);
+ if (!result)
+ result = svn_hash_gets(authz_results, full_path);
+ if (!result)
+ {
+ /* No result? Something really odd happened, create a
+ placeholder error so that any other results can be
+ reported in the correct order. */
+ result = apr_palloc(pool, sizeof(struct lock_result_t));
+ result->err = svn_error_createf(SVN_ERR_FS_LOCK_OPERATION_FAILED, 0,
+ _("No result for '%s'."), path);
+ svn_hash_sets(lmb.results, full_path, result);
+ }
+
+ if (result->err)
+ write_err = svn_ra_svn__write_cmd_failure(conn, pool, result->err);
else
- SVN_ERR(svn_ra_svn__write_tuple(conn, subpool, "w(c)", "success",
- path));
+ write_err = svn_ra_svn__write_tuple(conn, subpool, "w(c)", "success",
+ path);
+ if (write_err)
+ break;
}
- svn_pool_destroy(subpool);
+ clear_lock_result_hash(authz_results, subpool);
+ clear_lock_result_hash(lmb.results, subpool);
- SVN_ERR(log_command(b, conn, pool, "%s",
- svn_log__unlock(log_paths, break_lock, pool)));
+ svn_pool_destroy(subpool);
- /* NOTE: err might contain a fatal unlocking error from the loop above. */
- write_err = svn_ra_svn__write_word(conn, pool, "done");
+ if (!write_err)
+ write_err = svn_ra_svn__write_word(conn, pool, "done");
if (! write_err)
SVN_CMD_ERR(err);
svn_error_clear(err);
+ SVN_ERR(write_err);
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, ""));
return SVN_NO_ERROR;
@@ -2907,7 +3106,7 @@ static svn_error_t *get_lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "c", &path));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -2915,7 +3114,7 @@ static svn_error_t *get_lock(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
SVN_ERR(log_command(b, conn, pool, "get-lock %s",
svn_path_uri_encode(full_path, pool)));
- SVN_CMD_ERR(svn_fs_get_lock(&l, b->fs, full_path, pool));
+ SVN_CMD_ERR(svn_fs_get_lock(&l, b->repository->fs, full_path, pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
if (l)
@@ -2954,21 +3153,22 @@ static svn_error_t *get_locks(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
return log_fail_and_flush(err, b, conn, pool);
}
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(trivial_auth_request(conn, pool, b));
SVN_ERR(log_command(b, conn, pool, "get-locks %s",
svn_path_uri_encode(full_path, pool)));
- SVN_CMD_ERR(svn_repos_fs_get_locks2(&locks, b->repos, full_path, depth,
+ SVN_CMD_ERR(svn_repos_fs_get_locks2(&locks, b->repository->repos,
+ full_path, depth,
authz_check_access_cb_func(b), &ab,
pool));
SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "success"));
for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
{
- svn_lock_t *l = svn__apr_hash_index_val(hi);
+ svn_lock_t *l = apr_hash_this_val(hi);
SVN_ERR(write_lock(conn, pool, l));
}
@@ -2994,15 +3194,16 @@ static svn_error_t *replay_one_revision(svn_ra_svn_conn_t *conn,
ab.conn = conn;
SVN_ERR(log_command(b, conn, pool,
- svn_log__replay(b->fs_path->data, rev, pool)));
+ svn_log__replay(b->repository->fs_path->data, rev,
+ pool)));
svn_ra_svn_get_editor(&editor, &edit_baton, conn, pool, NULL, NULL);
- err = svn_fs_revision_root(&root, b->fs, rev, pool);
+ err = svn_fs_revision_root(&root, b->repository->fs, rev, pool);
if (! err)
- err = svn_repos_replay2(root, b->fs_path->data, low_water_mark,
- send_deltas, editor, edit_baton,
+ err = svn_repos_replay2(root, b->repository->fs_path->data,
+ low_water_mark, send_deltas, editor, edit_baton,
authz_check_access_cb_func(b), &ab, pool);
if (err)
@@ -3057,7 +3258,8 @@ static svn_error_t *replay_range(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
svn_pool_clear(iterpool);
- SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props, b->repos, rev,
+ SVN_CMD_ERR(svn_repos_fs_revision_proplist(&props,
+ b->repository->repos, rev,
authz_check_access_cb_func(b),
&ab,
iterpool));
@@ -3090,12 +3292,12 @@ get_deleted_rev(svn_ra_svn_conn_t *conn,
SVN_ERR(svn_ra_svn__parse_tuple(params, pool, "crr",
&path, &peg_revision, &end_revision));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, pool), pool);
SVN_ERR(log_command(b, conn, pool, "get-deleted-rev"));
SVN_ERR(trivial_auth_request(conn, pool, b));
- SVN_ERR(svn_repos_deleted_rev(b->fs, full_path, peg_revision, end_revision,
- &revision_deleted, pool));
+ SVN_ERR(svn_repos_deleted_rev(b->repository->fs, full_path, peg_revision,
+ end_revision, &revision_deleted, pool));
SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "r", revision_deleted));
return SVN_NO_ERROR;
}
@@ -3121,7 +3323,7 @@ get_inherited_props(svn_ra_svn_conn_t *conn,
/* Parse arguments. */
SVN_ERR(svn_ra_svn__parse_tuple(params, iterpool, "c(?r)", &path, &rev));
- full_path = svn_fspath__join(b->fs_path->data,
+ full_path = svn_fspath__join(b->repository->fs_path->data,
svn_relpath_canonicalize(path, iterpool),
pool);
@@ -3130,14 +3332,14 @@ get_inherited_props(svn_ra_svn_conn_t *conn,
full_path, FALSE));
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
+ SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->repository->fs, pool));
SVN_ERR(log_command(b, conn, pool, "%s",
svn_log__get_inherited_props(full_path, rev,
iterpool)));
/* Fetch the properties and a stream for the contents. */
- SVN_CMD_ERR(svn_fs_revision_root(&root, b->fs, rev, iterpool));
+ SVN_CMD_ERR(svn_fs_revision_root(&root, b->repository->fs, rev, iterpool));
SVN_CMD_ERR(get_props(NULL, &inherited_props, &ab, root, full_path, pool));
/* Send successful command response with revision and props. */
@@ -3251,18 +3453,30 @@ repos_path_valid(const char *path)
}
/* Look for the repository given by URL, using ROOT as the virtual
- * repository root. If we find one, fill in the repos, fs, cfg,
- * repos_url, and fs_path fields of B. Set B->repos's client
- * capabilities to CAPABILITIES, which must be at least as long-lived
- * as POOL, and whose elements are SVN_RA_CAPABILITY_*.
+ * repository root. If we find one, fill in the repos, fs, repos_url,
+ * and fs_path fields of REPOSITORY. VHOST and READ_ONLY flags are the
+ * same as in the server baton.
+ *
+ * CONFIG_POOL and AUTHZ_POOL shall be used to load any object of the
+ * respective type.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ *
*/
-static svn_error_t *find_repos(const char *url, const char *root,
- server_baton_t *b,
- svn_ra_svn_conn_t *conn,
- const apr_array_header_t *capabilities,
- apr_pool_t *pool)
-{
- const char *path, *full_path, *repos_root, *fs_path, *hooks_env;
+static svn_error_t *
+find_repos(const char *url,
+ const char *root,
+ svn_boolean_t vhost,
+ svn_boolean_t read_only,
+ svn_config_t *cfg,
+ repository_t *repository,
+ svn_repos__config_pool_t *config_pool,
+ svn_repos__authz_pool_t *authz_pool,
+ apr_hash_t *fs_config,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *path, *full_path, *fs_path, *hooks_env;
svn_stringbuf_t *url_buf;
/* Skip past the scheme and authority part. */
@@ -3271,14 +3485,14 @@ static svn_error_t *find_repos(const char *url, const char *root,
return svn_error_createf(SVN_ERR_BAD_URL, NULL,
"Non-svn URL passed to svn server: '%s'", url);
- if (! b->vhost)
+ if (! vhost)
{
path = strchr(path, '/');
if (path == NULL)
path = "";
}
- path = svn_relpath_canonicalize(path, pool);
- path = svn_path_uri_decode(path, pool);
+ path = svn_relpath_canonicalize(path, scratch_pool);
+ path = svn_path_uri_decode(path, scratch_pool);
/* Ensure that it isn't possible to escape the root by disallowing
'..' segments. */
@@ -3287,82 +3501,95 @@ static svn_error_t *find_repos(const char *url, const char *root,
"Couldn't determine repository path");
/* Join the server-configured root with the client path. */
- full_path = svn_dirent_join(svn_dirent_canonicalize(root, pool),
- path, pool);
+ full_path = svn_dirent_join(svn_dirent_canonicalize(root, scratch_pool),
+ path, scratch_pool);
/* Search for a repository in the full path. */
- repos_root = svn_repos_find_root_path(full_path, pool);
- if (!repos_root)
+ repository->repos_root = svn_repos_find_root_path(full_path, result_pool);
+ if (!repository->repos_root)
return svn_error_createf(SVN_ERR_RA_SVN_REPOS_NOT_FOUND, NULL,
"No repository found in '%s'", url);
/* Open the repository and fill in b with the resulting information. */
- SVN_ERR(svn_repos_open2(&b->repos, repos_root, b->fs_config, pool));
- SVN_ERR(svn_repos_remember_client_capabilities(b->repos, capabilities));
- b->fs = svn_repos_fs(b->repos);
- fs_path = full_path + strlen(repos_root);
- b->fs_path = svn_stringbuf_create(*fs_path ? fs_path : "/", pool);
- url_buf = svn_stringbuf_create(url, pool);
+ SVN_ERR(svn_repos_open3(&repository->repos, repository->repos_root,
+ fs_config, result_pool, scratch_pool));
+ SVN_ERR(svn_repos_remember_client_capabilities(repository->repos,
+ repository->capabilities));
+ repository->fs = svn_repos_fs(repository->repos);
+ fs_path = full_path + strlen(repository->repos_root);
+ repository->fs_path = svn_stringbuf_create(*fs_path ? fs_path : "/",
+ result_pool);
+ url_buf = svn_stringbuf_create(url, result_pool);
svn_path_remove_components(url_buf,
- svn_path_component_count(b->fs_path->data));
- b->repos_url = url_buf->data;
- b->authz_repos_name = svn_dirent_is_child(root, repos_root, pool);
- if (b->authz_repos_name == NULL)
- b->repos_name = svn_dirent_basename(repos_root, pool);
+ svn_path_component_count(repository->fs_path->data));
+ repository->repos_url = url_buf->data;
+ repository->authz_repos_name = svn_dirent_is_child(root,
+ repository->repos_root,
+ result_pool);
+ if (repository->authz_repos_name == NULL)
+ repository->repos_name = svn_dirent_basename(repository->repos_root,
+ result_pool);
else
- b->repos_name = b->authz_repos_name;
- b->repos_name = svn_path_uri_encode(b->repos_name, pool);
+ repository->repos_name = repository->authz_repos_name;
+ repository->repos_name = svn_path_uri_encode(repository->repos_name,
+ result_pool);
/* If the svnserve configuration has not been loaded then load it from the
* repository. */
- if (NULL == b->cfg)
+ if (NULL == cfg)
{
- b->base = svn_repos_conf_dir(b->repos, pool);
+ repository->base = svn_repos_conf_dir(repository->repos, result_pool);
- SVN_ERR(svn_config_read3(&b->cfg, svn_repos_svnserve_conf(b->repos, pool),
- FALSE, /* must_exist */
- FALSE, /* section_names_case_sensitive */
- FALSE, /* option_names_case_sensitive */
- pool));
- SVN_ERR(load_pwdb_config(b, conn, pool));
- SVN_ERR(load_authz_config(b, conn, repos_root, pool));
- }
- /* svnserve.conf has been loaded via the --config-file option so need
- * to load pwdb and authz. */
- else
- {
- SVN_ERR(load_pwdb_config(b, conn, pool));
- SVN_ERR(load_authz_config(b, conn, repos_root, pool));
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_repos_svnserve_conf
+ (repository->repos, result_pool),
+ FALSE, FALSE, repository->repos,
+ result_pool));
}
+ SVN_ERR(load_pwdb_config(repository, cfg, config_pool, result_pool));
+ SVN_ERR(load_authz_config(repository, repository->repos_root, cfg,
+ authz_pool, result_pool));
+
#ifdef SVN_HAVE_SASL
- /* Should we use Cyrus SASL? */
- SVN_ERR(svn_config_get_bool(b->cfg, &b->use_sasl, SVN_CONFIG_SECTION_SASL,
- SVN_CONFIG_OPTION_USE_SASL, FALSE));
+ {
+ const char *val;
+
+ /* Should we use Cyrus SASL? */
+ SVN_ERR(svn_config_get_bool(cfg, &repository->use_sasl,
+ SVN_CONFIG_SECTION_SASL,
+ SVN_CONFIG_OPTION_USE_SASL, FALSE));
+
+ svn_config_get(cfg, &val, SVN_CONFIG_SECTION_SASL,
+ SVN_CONFIG_OPTION_MIN_SSF, "0");
+ SVN_ERR(svn_cstring_atoui(&repository->min_ssf, val));
+
+ svn_config_get(cfg, &val, SVN_CONFIG_SECTION_SASL,
+ SVN_CONFIG_OPTION_MAX_SSF, "256");
+ SVN_ERR(svn_cstring_atoui(&repository->max_ssf, val));
+ }
#endif
/* Use the repository UUID as the default realm. */
- SVN_ERR(svn_fs_get_uuid(b->fs, &b->realm, pool));
- svn_config_get(b->cfg, &b->realm, SVN_CONFIG_SECTION_GENERAL,
- SVN_CONFIG_OPTION_REALM, b->realm);
+ SVN_ERR(svn_fs_get_uuid(repository->fs, &repository->realm, scratch_pool));
+ svn_config_get(cfg, &repository->realm, SVN_CONFIG_SECTION_GENERAL,
+ SVN_CONFIG_OPTION_REALM, repository->realm);
+ repository->realm = apr_pstrdup(result_pool, repository->realm);
/* Make sure it's possible for the client to authenticate. Note
that this doesn't take into account any authz configuration read
above, because we can't know about access it grants until paths
are given by the client. */
- if (get_access(b, UNAUTHENTICATED) == NO_ACCESS
- && (get_access(b, AUTHENTICATED) == NO_ACCESS
- || (!b->tunnel_user && !b->pwdb && !b->use_sasl)))
- return error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
- "No access allowed to this repository",
- b, conn, pool);
+ set_access(repository, cfg, read_only);
/* Configure hook script environment variables. */
- svn_config_get(b->cfg, &hooks_env, SVN_CONFIG_SECTION_GENERAL,
+ svn_config_get(cfg, &hooks_env, SVN_CONFIG_SECTION_GENERAL,
SVN_CONFIG_OPTION_HOOKS_ENV, NULL);
if (hooks_env)
- hooks_env = svn_dirent_internal_style(hooks_env, pool);
- SVN_ERR(svn_repos_hooks_setenv(b->repos, hooks_env, pool));
+ hooks_env = svn_dirent_internal_style(hooks_env, scratch_pool);
+
+ SVN_ERR(svn_repos_hooks_setenv(repository->repos, hooks_env, scratch_pool));
+ repository->hooks_env = apr_pstrdup(result_pool, hooks_env);
return SVN_NO_ERROR;
}
@@ -3385,9 +3612,7 @@ static void
fs_warning_func(void *baton, svn_error_t *err)
{
fs_warning_baton_t *b = baton;
- log_server_error(err, b->server, b->conn, b->pool);
- /* TODO: Keep log_pool in the server baton, cleared after every log? */
- svn_pool_clear(b->pool);
+ log_error(err, b->server);
}
/* Return the normalized repository-relative path for the given PATH
@@ -3404,7 +3629,7 @@ get_normalized_repo_rel_path(void *baton,
if (svn_path_is_url(path))
{
/* This is a copyfrom URL. */
- path = svn_uri_skip_ancestor(sb->repos_url, path, pool);
+ path = svn_uri_skip_ancestor(sb->repository->repos_url, path, pool);
path = svn_fspath__canonicalize(path, pool);
}
else
@@ -3412,7 +3637,7 @@ get_normalized_repo_rel_path(void *baton,
/* This is a base-relative path. */
if ((path)[0] != '/')
/* Get an absolute path for use in the FS. */
- path = svn_fspath__join(sb->fs_path->data, path, pool);
+ path = svn_fspath__join(sb->repository->fs_path->data, path, pool);
}
return path;
@@ -3431,9 +3656,9 @@ get_revision_root(svn_fs_root_t **fs_root,
server_baton_t *sb = baton;
if (!SVN_IS_VALID_REVNUM(revision))
- SVN_ERR(svn_fs_youngest_rev(&revision, sb->fs, pool));
+ SVN_ERR(svn_fs_youngest_rev(&revision, sb->repository->fs, pool));
- SVN_ERR(svn_fs_revision_root(fs_root, sb->fs, revision, pool));
+ SVN_ERR(svn_fs_revision_root(fs_root, sb->repository->fs, revision, pool));
return SVN_NO_ERROR;
}
@@ -3518,46 +3743,60 @@ fetch_base_func(const char **filename,
return SVN_NO_ERROR;
}
-svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
- apr_pool_t *pool)
+client_info_t *
+get_client_info(svn_ra_svn_conn_t *conn,
+ serve_params_t *params,
+ apr_pool_t *pool)
+{
+ client_info_t *client_info = apr_pcalloc(pool, sizeof(*client_info));
+
+ client_info->tunnel = params->tunnel;
+ client_info->tunnel_user = get_tunnel_user(params, pool);
+ client_info->user = NULL;
+ client_info->authz_user = NULL;
+ client_info->remote_host = svn_ra_svn_conn_remote_host(conn);
+
+ return client_info;
+}
+
+/* Construct the server baton for CONN using PARAMS and return it in *BATON.
+ * It's lifetime is the same as that of CONN. SCRATCH_POOL
+ */
+static svn_error_t *
+construct_server_baton(server_baton_t **baton,
+ svn_ra_svn_conn_t *conn,
+ serve_params_t *params,
+ apr_pool_t *scratch_pool)
{
svn_error_t *err, *io_err;
apr_uint64_t ver;
- const char *uuid, *client_url, *ra_client_string, *client_string;
- apr_array_header_t *caplist, *cap_words;
- server_baton_t b;
- fs_warning_baton_t warn_baton;
- svn_stringbuf_t *cap_log = svn_stringbuf_create_empty(pool);
-
- b.tunnel = params->tunnel;
- b.tunnel_user = get_tunnel_user(params, pool);
- b.read_only = params->read_only;
- b.user = NULL;
- b.username_case = params->username_case;
- b.authz_user = NULL;
- b.base = params->base;
- b.cfg = params->cfg;
- b.pwdb = NULL;
- b.authzdb = NULL;
- b.realm = NULL;
- b.log_file = params->log_file;
- b.pool = pool;
- b.use_sasl = FALSE;
- b.vhost = params->vhost;
-
- /* construct FS configuration parameters */
- b.fs_config = apr_hash_make(pool);
- svn_hash_sets(b.fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS,
- params->cache_txdeltas ? "1" :"0");
- svn_hash_sets(b.fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
- params->cache_fulltexts ? "1" :"0");
- svn_hash_sets(b.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
- params->cache_revprops ? "1" :"0");
+ const char *client_url, *ra_client_string, *client_string;
+ apr_array_header_t *caplist;
+ apr_pool_t *conn_pool = svn_ra_svn__get_pool(conn);
+ server_baton_t *b = apr_pcalloc(conn_pool, sizeof(*b));
+ fs_warning_baton_t *warn_baton;
+ svn_stringbuf_t *cap_log = svn_stringbuf_create_empty(scratch_pool);
+
+ b->repository = apr_pcalloc(conn_pool, sizeof(*b->repository));
+ b->repository->username_case = params->username_case;
+ b->repository->base = params->base;
+ b->repository->pwdb = NULL;
+ b->repository->authzdb = NULL;
+ b->repository->realm = NULL;
+ b->repository->use_sasl = FALSE;
+
+ b->read_only = params->read_only;
+ b->pool = conn_pool;
+ b->vhost = params->vhost;
+
+ b->logger = params->logger;
+ b->client_info = get_client_info(conn, params, conn_pool);
/* Send greeting. We don't support version 1 any more, so we can
* send an empty mechlist. */
if (params->compression_level > 0)
- SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "nn()(wwwwwwwwwww)",
+ SVN_ERR(svn_ra_svn__write_cmd_response(conn, scratch_pool,
+ "nn()(wwwwwwwwwww)",
(apr_uint64_t) 2, (apr_uint64_t) 2,
SVN_RA_SVN_CAP_EDIT_PIPELINE,
SVN_RA_SVN_CAP_SVNDIFF1,
@@ -3572,7 +3811,8 @@ svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE
));
else
- SVN_ERR(svn_ra_svn__write_cmd_response(conn, pool, "nn()(wwwwwwwwww)",
+ SVN_ERR(svn_ra_svn__write_cmd_response(conn, scratch_pool,
+ "nn()(wwwwwwwwww)",
(apr_uint64_t) 2, (apr_uint64_t) 2,
SVN_RA_SVN_CAP_EDIT_PIPELINE,
SVN_RA_SVN_CAP_ABSENT_ENTRIES,
@@ -3589,14 +3829,14 @@ svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
/* Read client response, which we assume to be in version 2 format:
* version, capability list, and client URL; then we do an auth
* request. */
- SVN_ERR(svn_ra_svn__read_tuple(conn, pool, "nlc?c(?c)",
+ SVN_ERR(svn_ra_svn__read_tuple(conn, scratch_pool, "nlc?c(?c)",
&ver, &caplist, &client_url,
&ra_client_string,
&client_string));
if (ver != 2)
return SVN_NO_ERROR;
- client_url = svn_uri_canonicalize(client_url, pool);
+ client_url = svn_uri_canonicalize(client_url, conn_pool);
SVN_ERR(svn_ra_svn_set_capabilities(conn, caplist));
/* All released versions of Subversion support edit-pipeline,
@@ -3617,14 +3857,15 @@ svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
int i;
svn_ra_svn_item_t *item;
- cap_words = apr_array_make(pool, 1, sizeof(const char *));
+ b->repository->capabilities = apr_array_make(conn_pool, 1,
+ sizeof(const char *));
for (i = 0; i < caplist->nelts; i++)
{
item = &APR_ARRAY_IDX(caplist, i, svn_ra_svn_item_t);
/* ra_svn_set_capabilities() already type-checked for us */
if (strcmp(item->u.word, SVN_RA_SVN_CAP_MERGEINFO) == 0)
{
- APR_ARRAY_PUSH(cap_words, const char *)
+ APR_ARRAY_PUSH(b->repository->capabilities, const char *)
= SVN_RA_CAPABILITY_MERGEINFO;
}
/* Save for operational log. */
@@ -3634,46 +3875,40 @@ svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
}
}
- err = find_repos(client_url, params->root, &b, conn, cap_words, pool);
+ err = handle_config_error(find_repos(client_url, params->root, b->vhost,
+ b->read_only, params->cfg,
+ b->repository, params->config_pool,
+ params->authz_pool, params->fs_config,
+ conn_pool, scratch_pool),
+ b);
+ if (!err)
+ {
+ if (b->repository->anon_access == NO_ACCESS
+ && (b->repository->auth_access == NO_ACCESS
+ || (!b->client_info->tunnel_user && !b->repository->pwdb
+ && !b->repository->use_sasl)))
+ err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+ "No access allowed to this repository",
+ b);
+ }
if (!err)
{
- SVN_ERR(auth_request(conn, pool, &b, READ_ACCESS, FALSE));
- if (current_access(&b) == NO_ACCESS)
+ SVN_ERR(auth_request(conn, scratch_pool, b, READ_ACCESS, FALSE));
+ if (current_access(b) == NO_ACCESS)
err = error_create_and_log(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
- "Not authorized for access",
- &b, conn, pool);
+ "Not authorized for access", b);
}
if (err)
{
- log_error(err, b.log_file, svn_ra_svn_conn_remote_host(conn),
- b.user, NULL, pool);
- io_err = svn_ra_svn__write_cmd_failure(conn, pool, err);
+ log_error(err, b);
+ io_err = svn_ra_svn__write_cmd_failure(conn, scratch_pool, err);
svn_error_clear(err);
SVN_ERR(io_err);
- return svn_ra_svn__flush(conn, pool);
+ return svn_ra_svn__flush(conn, scratch_pool);
}
- /* Log the open. */
- if (ra_client_string == NULL || ra_client_string[0] == '\0')
- ra_client_string = "-";
- else
- ra_client_string = svn_path_uri_encode(ra_client_string, pool);
- if (client_string == NULL || client_string[0] == '\0')
- client_string = "-";
- else
- client_string = svn_path_uri_encode(client_string, pool);
- SVN_ERR(log_command(&b, conn, pool,
- "open %" APR_UINT64_T_FMT " cap=(%s) %s %s %s",
- ver, cap_log->data,
- svn_path_uri_encode(b.fs_path->data, pool),
- ra_client_string, client_string));
-
- warn_baton.server = &b;
- warn_baton.conn = conn;
- warn_baton.pool = svn_pool_create(pool);
- svn_fs_set_warning_func(b.fs, fs_warning_func, &warn_baton);
-
- SVN_ERR(svn_fs_get_uuid(b.fs, &uuid, pool));
+ SVN_ERR(svn_fs_get_uuid(b->repository->fs, &b->repository->uuid,
+ conn_pool));
/* We can't claim mergeinfo capability until we know whether the
repository supports mergeinfo (i.e., is not a 1.4 repository),
@@ -3683,28 +3918,161 @@ svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
the client has sent the url. */
{
svn_boolean_t supports_mergeinfo;
- SVN_ERR(svn_repos_has_capability(b.repos, &supports_mergeinfo,
- SVN_REPOS_CAPABILITY_MERGEINFO, pool));
-
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(cc(!",
- "success", uuid, b.repos_url));
+ SVN_ERR(svn_repos_has_capability(b->repository->repos,
+ &supports_mergeinfo,
+ SVN_REPOS_CAPABILITY_MERGEINFO,
+ scratch_pool));
+
+ SVN_ERR(svn_ra_svn__write_tuple(conn, scratch_pool, "w(cc(!",
+ "success", b->repository->uuid,
+ b->repository->repos_url));
if (supports_mergeinfo)
- SVN_ERR(svn_ra_svn__write_word(conn, pool, SVN_RA_SVN_CAP_MERGEINFO));
- SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "!))"));
+ SVN_ERR(svn_ra_svn__write_word(conn, scratch_pool,
+ SVN_RA_SVN_CAP_MERGEINFO));
+ SVN_ERR(svn_ra_svn__write_tuple(conn, scratch_pool, "!))"));
+ SVN_ERR(svn_ra_svn__flush(conn, scratch_pool));
}
+ /* Log the open. */
+ if (ra_client_string == NULL || ra_client_string[0] == '\0')
+ ra_client_string = "-";
+ else
+ ra_client_string = svn_path_uri_encode(ra_client_string, scratch_pool);
+ if (client_string == NULL || client_string[0] == '\0')
+ client_string = "-";
+ else
+ client_string = svn_path_uri_encode(client_string, scratch_pool);
+ SVN_ERR(log_command(b, conn, scratch_pool,
+ "open %" APR_UINT64_T_FMT " cap=(%s) %s %s %s",
+ ver, cap_log->data,
+ svn_path_uri_encode(b->repository->fs_path->data,
+ scratch_pool),
+ ra_client_string, client_string));
+
+ warn_baton = apr_pcalloc(conn_pool, sizeof(*warn_baton));
+ warn_baton->server = b;
+ warn_baton->conn = conn;
+ svn_fs_set_warning_func(b->repository->fs, fs_warning_func, warn_baton);
+
/* Set up editor shims. */
{
svn_delta_shim_callbacks_t *callbacks =
- svn_delta_shim_callbacks_default(pool);
+ svn_delta_shim_callbacks_default(conn_pool);
callbacks->fetch_base_func = fetch_base_func;
callbacks->fetch_props_func = fetch_props_func;
callbacks->fetch_kind_func = fetch_kind_func;
- callbacks->fetch_baton = &b;
+ callbacks->fetch_baton = b;
SVN_ERR(svn_ra_svn__set_shim_callbacks(conn, callbacks));
}
- return svn_ra_svn__handle_commands2(conn, pool, main_commands, &b, FALSE);
+ *baton = b;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+serve_interruptable(svn_boolean_t *terminate_p,
+ connection_t *connection,
+ svn_boolean_t (* is_busy)(connection_t *),
+ apr_pool_t *pool)
+{
+ svn_boolean_t terminate = FALSE;
+ svn_error_t *err = NULL;
+ const svn_ra_svn_cmd_entry_t *command;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Prepare command parser. */
+ apr_hash_t *cmd_hash = apr_hash_make(pool);
+ for (command = main_commands; command->cmdname; command++)
+ svn_hash_sets(cmd_hash, command->cmdname, command);
+
+ /* Auto-initialize connection */
+ if (! connection->conn)
+ {
+ apr_status_t ar;
+
+ /* Enable TCP keep-alives on the socket so we time out when
+ * the connection breaks due to network-layer problems.
+ * If the peer has dropped the connection due to a network partition
+ * or a crash, or if the peer no longer considers the connection
+ * valid because we are behind a NAT and our public IP has changed,
+ * it will respond to the keep-alive probe with a RST instead of an
+ * acknowledgment segment, which will cause svn to abort the session
+ * even while it is currently blocked waiting for data from the peer. */
+ ar = apr_socket_opt_set(connection->usock, APR_SO_KEEPALIVE, 1);
+ if (ar)
+ {
+ /* It's not a fatal error if we cannot enable keep-alives. */
+ }
+
+ /* create the connection, configure ports etc. */
+ connection->conn
+ = svn_ra_svn_create_conn4(connection->usock, NULL, NULL,
+ connection->params->compression_level,
+ connection->params->zero_copy_limit,
+ connection->params->error_check_interval,
+ connection->pool);
+
+ /* Construct server baton and open the repository for the first time. */
+ err = construct_server_baton(&connection->baton, connection->conn,
+ connection->params, pool);
+ }
+
+ /* If we can't access the repo for some reason, end this connection. */
+ if (err)
+ terminate = TRUE;
+
+ /* Process incoming commands. */
+ while (!terminate && !err)
+ {
+ svn_pool_clear(iterpool);
+ if (is_busy && is_busy(connection))
+ {
+ svn_boolean_t has_command;
+
+ /* If the server is busy, execute just one command and only if
+ * there is one currently waiting in our receive buffers.
+ */
+ err = svn_ra_svn__has_command(&has_command, &terminate,
+ connection->conn, iterpool);
+ if (!err && has_command)
+ err = svn_ra_svn__handle_command(&terminate, cmd_hash,
+ connection->baton,
+ connection->conn,
+ FALSE, iterpool);
+
+ break;
+ }
+ else
+ {
+ /* The server is not busy, thus let's serve whichever command
+ * comes in next and whenever it comes in. This requires the
+ * busy() callback test to return TRUE while there are still some
+ * resources left.
+ */
+ err = svn_ra_svn__handle_command(&terminate, cmd_hash,
+ connection->baton,
+ connection->conn,
+ FALSE, iterpool);
+ }
+ }
+
+ /* error or normal end of session. Close the connection */
+ svn_pool_destroy(iterpool);
+ if (terminate_p)
+ *terminate_p = terminate;
+
+ return svn_error_trace(err);
+}
+
+svn_error_t *serve(svn_ra_svn_conn_t *conn,
+ serve_params_t *params,
+ apr_pool_t *pool)
+{
+ server_baton_t *baton = NULL;
+
+ SVN_ERR(construct_server_baton(&baton, conn, params, pool));
+ return svn_ra_svn__handle_commands2(conn, pool, main_commands, baton, FALSE);
}
diff --git a/subversion/svnserve/server.h b/subversion/svnserve/server.h
index 926a96f..d366e0c 100644
--- a/subversion/svnserve/server.h
+++ b/subversion/svnserve/server.h
@@ -36,39 +36,61 @@ extern "C" {
#include "svn_repos.h"
#include "svn_ra_svn.h"
+#include "private/svn_atomic.h"
+#include "private/svn_mutex.h"
+#include "private/svn_repos_private.h"
+#include "private/svn_subr_private.h"
+
enum username_case_type { CASE_FORCE_UPPER, CASE_FORCE_LOWER, CASE_ASIS };
-typedef struct server_baton_t {
+enum authn_type { UNAUTHENTICATED, AUTHENTICATED };
+enum access_type { NO_ACCESS, READ_ACCESS, WRITE_ACCESS };
+
+typedef struct repository_t {
svn_repos_t *repos;
const char *repos_name; /* URI-encoded name of repository (not for authz) */
+ const char *repos_root; /* Repository root directory */
svn_fs_t *fs; /* For convenience; same as svn_repos_fs(repos) */
const char *base; /* Base directory for config files */
- svn_config_t *cfg; /* Parsed repository svnserve.conf */
svn_config_t *pwdb; /* Parsed password database */
svn_authz_t *authzdb; /* Parsed authz rules */
const char *authz_repos_name; /* The name of the repository for authz */
const char *realm; /* Authentication realm */
const char *repos_url; /* URL to base of repository */
+ const char *hooks_env; /* Path to the hooks environment file or NULL */
+ const char *uuid; /* Repository ID */
+ apr_array_header_t *capabilities;
+ /* Client capabilities (SVN_RA_CAPABILITY_*) */
svn_stringbuf_t *fs_path;/* Decoded base in-repos path (w/ leading slash) */
- apr_hash_t *fs_config; /* Additional FS configuration parameters */
- const char *user; /* Authenticated username of the user */
enum username_case_type username_case; /* Case-normalize the username? */
+ svn_boolean_t use_sasl; /* Use Cyrus SASL for authentication;
+ always false if SVN_HAVE_SASL not defined */
+ unsigned min_ssf; /* min-encryption SASL parameter */
+ unsigned max_ssf; /* max-encryption SASL parameter */
+
+ enum access_type auth_access; /* access granted to authenticated users */
+ enum access_type anon_access; /* access granted to annonymous users */
+
+} repository_t;
+
+typedef struct client_info_t {
+ const char *user; /* Authenticated username of the user */
+ const char *remote_host; /* IP of the client that contacted the server */
const char *authz_user; /* Username for authz ('user' + 'username_case') */
svn_boolean_t tunnel; /* Tunneled through login agent */
const char *tunnel_user; /* Allow EXTERNAL to authenticate as this */
+} client_info_t;
+
+typedef struct server_baton_t {
+ repository_t *repository; /* repository-specific data to use */
+ client_info_t *client_info; /* client-specific data to use */
+ struct logger_t *logger; /* Log file data structure.
+ May be NULL even if log_file is not. */
svn_boolean_t read_only; /* Disallow write access (global flag) */
- svn_boolean_t use_sasl; /* Use Cyrus SASL for authentication;
- always false if SVN_HAVE_SASL not defined */
- apr_file_t *log_file; /* Log filehandle. */
svn_boolean_t vhost; /* Use virtual-host-based path to repo. */
apr_pool_t *pool;
} server_baton_t;
-enum authn_type { UNAUTHENTICATED, AUTHENTICATED };
-enum access_type { NO_ACCESS, READ_ACCESS, WRITE_ACCESS };
-
-enum access_type get_access(server_baton_t *b, enum authn_type auth);
-
typedef struct serve_params_t {
/* The virtual root of the repositories to serve. The client URL
path is interpreted relative to this root and is not allowed to
@@ -97,20 +119,21 @@ typedef struct serve_params_t {
per-repository svnserve.conf are not read. */
svn_config_t *cfg;
- /* A filehandle open for writing logs to; possibly NULL. */
- apr_file_t *log_file;
+ /* logging data structure; possibly NULL. */
+ struct logger_t *logger;
- /* Username case normalization style. */
- enum username_case_type username_case;
+ /* all configurations should be opened through this factory */
+ svn_repos__config_pool_t *config_pool;
- /* Enable text delta caching for all FSFS repositories. */
- svn_boolean_t cache_txdeltas;
+ /* all authz data should be opened through this factory */
+ svn_repos__authz_pool_t *authz_pool;
- /* Enable full-text caching for all FSFS repositories. */
- svn_boolean_t cache_fulltexts;
+ /* The FS configuration to be applied to all repositories.
+ It mainly contains things like cache settings. */
+ apr_hash_t *fs_config;
- /* Enable revprop caching for all FSFS repositories. */
- svn_boolean_t cache_revprops;
+ /* Username case normalization style. */
+ enum username_case_type username_case;
/* Size of the in-memory cache (used by FSFS only). */
apr_uint64_t memory_cache_size;
@@ -133,28 +156,65 @@ typedef struct serve_params_t {
svn_boolean_t vhost;
} serve_params_t;
+/* This structure contains all data that describes a client / server
+ connection. Their lifetime is separated from the thread-local
+ serving pools. */
+typedef struct connection_t
+{
+ /* socket return by accept() */
+ apr_socket_t *usock;
+
+ /* server-global parameters */
+ serve_params_t *params;
+
+ /* connection-specific objects */
+ server_baton_t *baton;
+
+ /* buffered connection object used by the marshaller */
+ svn_ra_svn_conn_t *conn;
+
+ /* memory pool for objects with connection lifetime */
+ apr_pool_t *pool;
+
+ /* Number of threads using the pool.
+ The pool passed to apr_thread_create can only be released when both
+
+ A: the call to apr_thread_create has returned to the calling thread
+ B: the new thread has started running and reached apr_thread_start_t
+
+ So we set the atomic counter to 2 then both the calling thread and
+ the new thread decrease it and when it reaches 0 the pool can be
+ released. */
+ svn_atomic_t ref_count;
+
+} connection_t;
+
+/* Return a client_info_t structure allocated in POOL and initialize it
+ * with data from CONN. */
+client_info_t * get_client_info(svn_ra_svn_conn_t *conn,
+ serve_params_t *params,
+ apr_pool_t *pool);
+
/* Serve the connection CONN according to the parameters PARAMS. */
svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
apr_pool_t *pool);
-/* Load the password database for the listening server based on the
- entries in the SERVER struct.
+/* Serve the connection CONNECTION for as long as IS_BUSY does not
+ return TRUE. If IS_BUSY is NULL, serve the connection until it
+ either gets terminated or there is an error. If TERMINATE_P is
+ not NULL, set *TERMINATE_P to TRUE if the connection got
+ terminated.
- SERVER and CONN must not be NULL. The real errors will be logged with
- SERVER and CONN but return generic errors to the client. */
-svn_error_t *load_pwdb_config(server_baton_t *server,
- svn_ra_svn_conn_t *conn,
- apr_pool_t *pool);
-
-/* Load the authz database for the listening server based on the
- entries in the SERVER struct.
-
- SERVER and CONN must not be NULL. The real errors will be logged with
- SERVER and CONN but return generic errors to the client. */
-svn_error_t *load_authz_config(server_baton_t *server,
- svn_ra_svn_conn_t *conn,
- const char *repos_root,
- apr_pool_t *pool);
+ For the first call, CONNECTION->CONN may be NULL in which case we
+ will create an ra_svn connection object. Subsequent calls will
+ check for an open repository and automatically re-open the repo
+ in pool if necessary.
+ */
+svn_error_t *
+serve_interruptable(svn_boolean_t *terminate_p,
+ connection_t *connection,
+ svn_boolean_t (* is_busy)(connection_t *),
+ apr_pool_t *pool);
/* Initialize the Cyrus SASL library. POOL is used for allocations. */
svn_error_t *cyrus_init(apr_pool_t *pool);
@@ -172,13 +232,6 @@ svn_error_t *cyrus_auth_request(svn_ra_svn_conn_t *conn,
apr_size_t escape_errorlog_item(char *dest, const char *source,
apr_size_t buflen);
-/* Log ERR to LOG_FILE if LOG_FILE is not NULL. Include REMOTE_HOST,
- USER, and REPOS in the log if they are not NULL. Allocate temporary
- char buffers in POOL (which caller can then clear or dispose of). */
-void
-log_error(svn_error_t *err, apr_file_t *log_file, const char *remote_host,
- const char *user, const char *repos, apr_pool_t *pool);
-
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/svnserve/svnserve.c b/subversion/svnserve/svnserve.c
index 3d83323..f3a483d 100644
--- a/subversion/svnserve/svnserve.c
+++ b/subversion/svnserve/svnserve.c
@@ -48,14 +48,20 @@
#include "svn_cache_config.h"
#include "svn_version.h"
#include "svn_io.h"
+#include "svn_hash.h"
#include "svn_private_config.h"
#include "private/svn_dep_compat.h"
#include "private/svn_cmdline_private.h"
#include "private/svn_atomic.h"
+#include "private/svn_mutex.h"
#include "private/svn_subr_private.h"
+#if APR_HAS_THREADS
+# include <apr_thread_pool.h>
+#endif
+
#include "winservice.h"
#ifdef HAVE_UNISTD_H
@@ -63,6 +69,7 @@
#endif
#include "server.h"
+#include "logger.h"
/* The strategy for handling incoming connections. Some of these may be
unavailable due to platform limitations. */
@@ -103,6 +110,50 @@ enum run_mode {
#endif
+/* Parameters for the worker thread pool used in threaded mode. */
+
+/* Have at least this many worker threads (even if there are no requests
+ * to handle).
+ *
+ * A 0 value is legal but increases the latency for the next incoming
+ * request. Higher values may be useful for servers that experience short
+ * bursts of concurrent requests followed by longer idle periods.
+ */
+#define THREADPOOL_MIN_SIZE 1
+
+/* Maximum number of worker threads. If there are more concurrent requests
+ * than worker threads, the extra requests get queued.
+ *
+ * Since very slow connections will hog a full thread for a potentially
+ * long time before timing out, be sure to not set this limit too low.
+ *
+ * On the other hand, keep in mind that every thread will allocate up to
+ * 4MB of unused RAM in the APR allocator of its root pool. 32 bit servers
+ * must hence do with fewer threads.
+ */
+#if (APR_SIZEOF_VOIDP <= 4)
+#define THREADPOOL_MAX_SIZE 64
+#else
+#define THREADPOOL_MAX_SIZE 256
+#endif
+
+/* Number of microseconds that an unused thread remains in the pool before
+ * being terminated.
+ *
+ * Higher values are useful if clients frequently send small requests and
+ * you want to minimize the latency for those.
+ */
+#define THREADPOOL_THREAD_IDLE_LIMIT 1000000
+
+/* Number of client to server connections that may concurrently in the
+ * TCP 3-way handshake state, i.e. are in the process of being created.
+ *
+ * Larger values improve scalability with lots of small requests coming
+ * on over long latency networks.
+ *
+ * The OS may actually use a lower limit than specified here.
+ */
+#define ACCEPT_BACKLOG 128
#ifdef WIN32
static apr_os_sock_t winservice_svnserve_accept_socket = INVALID_SOCKET;
@@ -156,6 +207,9 @@ void winservice_notify_stop(void)
#define SVNSERVE_OPT_SINGLE_CONN 268
#define SVNSERVE_OPT_CLIENT_SPEED 269
#define SVNSERVE_OPT_VIRTUAL_HOST 270
+#define SVNSERVE_OPT_MIN_THREADS 271
+#define SVNSERVE_OPT_MAX_THREADS 272
+#define SVNSERVE_OPT_BLOCK_READ 273
static const apr_getopt_option_t svnserve__options[] =
{
@@ -217,21 +271,23 @@ static const apr_getopt_option_t svnserve__options[] =
" "
"Default is 16.\n"
" "
- "[used for FSFS repositories only]")},
+ "0 switches to dynamically sized caches.\n"
+ " "
+ "[used for FSFS and FSX repositories only]")},
{"cache-txdeltas", SVNSERVE_OPT_CACHE_TXDELTAS, 1,
N_("enable or disable caching of deltas between older\n"
" "
"revisions.\n"
" "
- "Default is no.\n"
+ "Default is yes.\n"
" "
- "[used for FSFS repositories only]")},
+ "[used for FSFS and FSX repositories only]")},
{"cache-fulltexts", SVNSERVE_OPT_CACHE_FULLTEXTS, 1,
N_("enable or disable caching of file contents\n"
" "
"Default is yes.\n"
" "
- "[used for FSFS repositories only]")},
+ "[used for FSFS and FSX repositories only]")},
{"cache-revprops", SVNSERVE_OPT_CACHE_REVPROPS, 1,
N_("enable or disable caching of revision properties.\n"
" "
@@ -239,7 +295,7 @@ static const apr_getopt_option_t svnserve__options[] =
" "
"Default is no.\n"
" "
- "[used for FSFS repositories only]")},
+ "[used for FSFS and FSX repositories only]")},
{"client-speed", SVNSERVE_OPT_CLIENT_SPEED, 1,
N_("Optimize network handling based on the assumption\n"
" "
@@ -248,20 +304,55 @@ static const apr_getopt_option_t svnserve__options[] =
"ARG Mbit/s.\n"
" "
"Default is 0 (optimizations disabled).")},
+ {"block-read", SVNSERVE_OPT_BLOCK_READ, 1,
+ N_("Parse and cache all data found in block instead\n"
+ " "
+ "of just the requested item.\n"
+ " "
+ "Default is no.\n"
+ " "
+ "[used for FSFS repositories in 1.9 format only]")},
#ifdef CONNECTION_HAVE_THREAD_OPTION
/* ### Making the assumption here that WIN32 never has fork and so
* ### this option never exists when --service exists. */
{"threads", 'T', 0, N_("use threads instead of fork "
"[mode: daemon]")},
+ {"min-threads", SVNSERVE_OPT_MIN_THREADS, 1,
+ N_("Minimum number of server threads, even if idle.\n"
+ " "
+ "Capped to max-threads; minimum value is 0.\n"
+ " "
+ "Default is 1.\n"
+ " "
+ "[used only with --threads]")},
+#if (APR_SIZEOF_VOIDP <= 4)
+ {"max-threads", SVNSERVE_OPT_MAX_THREADS, 1,
+ N_("Maximum number of server threads, even if there\n"
+ " "
+ "are more connections. Minimum value is 1.\n"
+ " "
+ "Default is 64.\n"
+ " "
+ "[used only with --threads]")},
+#else
+ {"max-threads", SVNSERVE_OPT_MAX_THREADS, 1,
+ N_("Maximum number of server threads, even if there\n"
+ " "
+ "are more connections. Minimum value is 1.\n"
+ " "
+ "Default is 256.\n"
+ " "
+ "[used only with --threads]")},
+#endif
#endif
{"foreground", SVNSERVE_OPT_FOREGROUND, 0,
N_("run in foreground (useful for debugging)\n"
" "
"[mode: daemon]")},
{"single-thread", SVNSERVE_OPT_SINGLE_CONN, 0,
- N_("handle one connection at a time in the parent process\n"
+ N_("handle one connection at a time in the parent\n"
" "
- "(useful for debugging)")},
+ "process (useful for debugging)")},
{"log-file", SVNSERVE_OPT_LOG_FILE, 1,
N_("svnserve log file")},
{"pid-file", SVNSERVE_OPT_PID_FILE, 1,
@@ -290,7 +381,6 @@ static const apr_getopt_option_t svnserve__options[] =
{0, 0, 0, 0}
};
-
static void usage(const char *progname, apr_pool_t *pool)
{
if (!progname)
@@ -299,7 +389,6 @@ static void usage(const char *progname, apr_pool_t *pool)
svn_error_clear(svn_cmdline_fprintf(stderr, pool,
_("Type '%s --help' for usage.\n"),
progname));
- exit(1);
}
static void help(apr_pool_t *pool)
@@ -309,15 +398,21 @@ static void help(apr_pool_t *pool)
#ifdef WIN32
svn_error_clear(svn_cmdline_fputs(_("usage: svnserve [-d | -i | -t | -X "
"| --service] [options]\n"
+ "Subversion repository server.\n"
+ "Type 'svnserve --version' to see the "
+ "program version.\n"
"\n"
"Valid options:\n"),
- stdout, pool));
+ stdout, pool));
#else
svn_error_clear(svn_cmdline_fputs(_("usage: svnserve [-d | -i | -t | -X] "
"[options]\n"
+ "Subversion repository server.\n"
+ "Type 'svnserve --version' to see the "
+ "program version.\n"
"\n"
"Valid options:\n"),
- stdout, pool));
+ stdout, pool));
#endif
for (i = 0; svnserve__options[i].name && svnserve__options[i].optch; i++)
{
@@ -326,7 +421,6 @@ static void help(apr_pool_t *pool)
svn_error_clear(svn_cmdline_fprintf(stdout, pool, " %s\n", optstr));
}
svn_error_clear(svn_cmdline_fprintf(stdout, pool, "\n"));
- exit(0);
}
static svn_error_t * version(svn_boolean_t quiet, apr_pool_t *pool)
@@ -378,56 +472,149 @@ static apr_status_t redirect_stdout(void *arg)
return apr_file_dup2(out_file, err_file, pool);
}
-#if APR_HAS_THREADS
-/* The pool passed to apr_thread_create can only be released when both
+/* Wait for the next client connection to come in from SOCK. Allocate
+ * the connection in a root pool from CONNECTION_POOLS and assign PARAMS.
+ * Return the connection object in *CONNECTION.
+ *
+ * Use HANDLING_MODE for proper internal cleanup.
+ */
+static svn_error_t *
+accept_connection(connection_t **connection,
+ apr_socket_t *sock,
+ serve_params_t *params,
+ enum connection_handling_mode handling_mode,
+ apr_pool_t *pool)
+{
+ apr_status_t status;
- A: the call to apr_thread_create has returned to the calling thread
- B: the new thread has started running and reached apr_thread_start_t
+ /* Non-standard pool handling. The main thread never blocks to join
+ * the connection threads so it cannot clean up after each one. So
+ * separate pools that can be cleared at thread exit are used. */
- So we set the atomic counter to 2 then both the calling thread and
- the new thread decrease it and when it reaches 0 the pool can be
- released. */
-struct shared_pool_t {
- svn_atomic_t count;
- apr_pool_t *pool;
-};
+ apr_pool_t *connection_pool = svn_pool_create(pool);
+ *connection = apr_pcalloc(connection_pool, sizeof(**connection));
+ (*connection)->pool = connection_pool;
+ (*connection)->params = params;
+ (*connection)->ref_count = 1;
-static struct shared_pool_t *
-attach_shared_pool(apr_pool_t *pool)
-{
- struct shared_pool_t *shared = apr_palloc(pool, sizeof(struct shared_pool_t));
+ do
+ {
+ #ifdef WIN32
+ if (winservice_is_stopping())
+ exit(0);
+ #endif
- shared->pool = pool;
- svn_atomic_set(&shared->count, 2);
+ status = apr_socket_accept(&(*connection)->usock, sock,
+ connection_pool);
+ if (handling_mode == connection_mode_fork)
+ {
+ apr_proc_t proc;
+
+ /* Collect any zombie child processes. */
+ while (apr_proc_wait_all_procs(&proc, NULL, NULL, APR_NOWAIT,
+ connection_pool) == APR_CHILD_DONE)
+ ;
+ }
+ }
+ while (APR_STATUS_IS_EINTR(status)
+ || APR_STATUS_IS_ECONNABORTED(status)
+ || APR_STATUS_IS_ECONNRESET(status));
- return shared;
+ return status
+ ? svn_error_wrap_apr(status, _("Can't accept client connection"))
+ : SVN_NO_ERROR;
}
+/* Add a reference to CONNECTION, i.e. keep it and it's pool valid unless
+ * that reference gets released using release_shared_pool().
+ */
static void
-release_shared_pool(struct shared_pool_t *shared)
+attach_connection(connection_t *connection)
{
- if (svn_atomic_dec(&shared->count) == 0)
- svn_pool_destroy(shared->pool);
+ svn_atomic_inc(&connection->ref_count);
}
-#endif
-/* "Arguments" passed from the main thread to the connection thread */
-struct serve_thread_t {
- svn_ra_svn_conn_t *conn;
- serve_params_t *params;
- struct shared_pool_t *shared_pool;
-};
+/* Release a reference to CONNECTION. If there are no more references,
+ * the connection will be
+ */
+static void
+close_connection(connection_t *connection)
+{
+ /* this will automatically close USOCK */
+ if (svn_atomic_dec(&connection->ref_count) == 0)
+ svn_pool_destroy(connection->pool);
+}
+
+/* Wrapper around serve() that takes a socket instead of a connection.
+ * This is to off-load work from the main thread in threaded and fork modes.
+ *
+ * If an error occurs, log it and also return it.
+ */
+static svn_error_t *
+serve_socket(connection_t *connection,
+ apr_pool_t *pool)
+{
+ /* process the actual request and log errors */
+ svn_error_t *err = serve_interruptable(NULL, connection, NULL, pool);
+ if (err)
+ logger__log_error(connection->params->logger, err, NULL,
+ get_client_info(connection->conn, connection->params,
+ pool));
+
+ return svn_error_trace(err);
+}
#if APR_HAS_THREADS
+
+/* allocate and recycle root pools for connection objects.
+ There should be at most THREADPOOL_MAX_SIZE such pools. */
+static svn_root_pools__t *connection_pools;
+
+/* The global thread pool serving all connections. */
+static apr_thread_pool_t *threads;
+
+/* Very simple load determination callback for serve_interruptable:
+ With less than half the threads in THREADS in use, we can afford to
+ wait in the socket read() function. Otherwise, poll them round-robin. */
+static svn_boolean_t
+is_busy(connection_t *connection)
+{
+ return apr_thread_pool_threads_count(threads) * 2
+ > apr_thread_pool_thread_max_get(threads);
+}
+
+/* Serve the connection given by DATA. Under high load, serve only
+ the current command (if any) and then put the connection back into
+ THREAD's task pool. */
static void * APR_THREAD_FUNC serve_thread(apr_thread_t *tid, void *data)
{
- struct serve_thread_t *d = data;
+ svn_boolean_t done;
+ connection_t *connection = data;
+ svn_error_t *err;
+
+ apr_pool_t *pool = svn_root_pools__acquire_pool(connection_pools);
+
+ /* process the actual request and log errors */
+ err = serve_interruptable(&done, connection, is_busy, pool);
+ if (err)
+ {
+ logger__log_error(connection->params->logger, err, NULL,
+ get_client_info(connection->conn, connection->params,
+ pool));
+ svn_error_clear(err);
+ done = TRUE;
+ }
+ svn_root_pools__release_pool(pool, connection_pools);
- svn_error_clear(serve(d->conn, d->params, d->shared_pool->pool));
- release_shared_pool(d->shared_pool);
+ /* Close or re-schedule connection. */
+ if (done)
+ close_connection(connection);
+ else
+ apr_thread_pool_push(threads, serve_thread, connection, 0, NULL);
return NULL;
}
+
#endif
/* Write the PID of the current process as a decimal number, followed by a
@@ -469,31 +656,33 @@ check_lib_versions(void)
}
-int main(int argc, const char *argv[])
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
enum run_mode run_mode = run_mode_unspecified;
svn_boolean_t foreground = FALSE;
- apr_socket_t *sock, *usock;
- apr_file_t *in_file, *out_file;
+ apr_socket_t *sock;
apr_sockaddr_t *sa;
- apr_pool_t *pool;
- apr_pool_t *connection_pool;
svn_error_t *err;
apr_getopt_t *os;
int opt;
serve_params_t params;
const char *arg;
apr_status_t status;
- svn_ra_svn_conn_t *conn;
+#ifndef WIN32
apr_proc_t proc;
-#if APR_HAS_THREADS
- apr_threadattr_t *tattr;
- apr_thread_t *tid;
- struct shared_pool_t *shared_pool;
-
- struct serve_thread_t *thread_data;
#endif
+ svn_boolean_t is_multi_threaded;
enum connection_handling_mode handling_mode = CONNECTION_DEFAULT;
+ svn_boolean_t cache_fulltexts = TRUE;
+ svn_boolean_t cache_txdeltas = TRUE;
+ svn_boolean_t cache_revprops = FALSE;
+ svn_boolean_t use_block_read = FALSE;
apr_uint16_t port = SVN_RA_SVN_PORT;
const char *host = NULL;
int family = APR_INET;
@@ -509,31 +698,19 @@ int main(int argc, const char *argv[])
const char *pid_filename = NULL;
const char *log_filename = NULL;
svn_node_kind_t kind;
-
- /* Initialize the app. */
- if (svn_cmdline_init("svnserve", stderr) != EXIT_SUCCESS)
- return EXIT_FAILURE;
-
- /* Create our top-level pool. */
- pool = svn_pool_create(NULL);
-
+ apr_size_t min_thread_count = THREADPOOL_MIN_SIZE;
+ apr_size_t max_thread_count = THREADPOOL_MAX_SIZE;
#ifdef SVN_HAVE_SASL
- SVN_INT_ERR(cyrus_init(pool));
+ SVN_ERR(cyrus_init(pool));
#endif
/* Check library versions */
- err = check_lib_versions();
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ SVN_ERR(check_lib_versions());
/* Initialize the FS library. */
- err = svn_fs_initialize(pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ SVN_ERR(svn_fs_initialize(pool));
- err = svn_cmdline__getopt_init(&os, argc, argv, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
params.root = "/";
params.tunnel = FALSE;
@@ -542,13 +719,13 @@ int main(int argc, const char *argv[])
params.base = NULL;
params.cfg = NULL;
params.compression_level = SVN_DELTA_COMPRESSION_LEVEL_DEFAULT;
- params.log_file = NULL;
+ params.logger = NULL;
+ params.config_pool = NULL;
+ params.authz_pool = NULL;
+ params.fs_config = NULL;
params.vhost = FALSE;
params.username_case = CASE_ASIS;
params.memory_cache_size = (apr_uint64_t)-1;
- params.cache_fulltexts = TRUE;
- params.cache_txdeltas = FALSE;
- params.cache_revprops = FALSE;
params.zero_copy_limit = 0;
params.error_check_interval = 4096;
@@ -558,7 +735,11 @@ int main(int argc, const char *argv[])
if (APR_STATUS_IS_EOF(status))
break;
if (status != APR_SUCCESS)
- usage(argv[0], pool);
+ {
+ usage(argv[0], pool);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
switch (opt)
{
case '6':
@@ -570,7 +751,7 @@ int main(int argc, const char *argv[])
case 'h':
help(pool);
- break;
+ return SVN_NO_ERROR;
case 'q':
quiet = TRUE;
@@ -611,10 +792,8 @@ int main(int argc, const char *argv[])
err = svn_cstring_strtoui64(&val, arg, 0, APR_UINT16_MAX, 10);
if (err)
- return svn_cmdline_handle_exit_error(
- svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
- _("Invalid port '%s'"), arg),
- pool, "svnserve: ");
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Invalid port '%s'"), arg);
port = (apr_uint16_t)val;
}
break;
@@ -644,23 +823,18 @@ int main(int argc, const char *argv[])
break;
case 'r':
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&params.root, arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&params.root, arg, pool));
- err = svn_io_check_resolved_path(params.root, &kind, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ SVN_ERR(svn_io_check_resolved_path(params.root, &kind, pool));
if (kind != svn_node_dir)
{
- svn_error_clear
- (svn_cmdline_fprintf
- (stderr, pool,
- _("svnserve: Root path '%s' does not exist "
- "or is not a directory.\n"), params.root));
- return EXIT_FAILURE;
+ return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("Root path '%s' does not exist "
+ "or is not a directory"), params.root);
}
params.root = svn_dirent_internal_style(params.root, pool);
- SVN_INT_ERR(svn_dirent_get_absolute(&params.root, params.root, pool));
+ SVN_ERR(svn_dirent_get_absolute(&params.root, params.root, pool));
break;
case 'R':
@@ -685,18 +859,19 @@ int main(int argc, const char *argv[])
break;
case SVNSERVE_OPT_CACHE_TXDELTAS:
- params.cache_txdeltas
- = svn_tristate__from_word(arg) == svn_tristate_true;
+ cache_txdeltas = svn_tristate__from_word(arg) == svn_tristate_true;
break;
case SVNSERVE_OPT_CACHE_FULLTEXTS:
- params.cache_fulltexts
- = svn_tristate__from_word(arg) == svn_tristate_true;
+ cache_fulltexts = svn_tristate__from_word(arg) == svn_tristate_true;
break;
case SVNSERVE_OPT_CACHE_REVPROPS:
- params.cache_revprops
- = svn_tristate__from_word(arg) == svn_tristate_true;
+ cache_revprops = svn_tristate__from_word(arg) == svn_tristate_true;
+ break;
+
+ case SVNSERVE_OPT_BLOCK_READ:
+ use_block_read = svn_tristate__from_word(arg) == svn_tristate_true;
break;
case SVNSERVE_OPT_CLIENT_SPEED:
@@ -716,6 +891,14 @@ int main(int argc, const char *argv[])
}
break;
+ case SVNSERVE_OPT_MIN_THREADS:
+ min_thread_count = (apr_size_t)apr_strtoi64(arg, NULL, 0);
+ break;
+
+ case SVNSERVE_OPT_MAX_THREADS:
+ max_thread_count = (apr_size_t)apr_strtoi64(arg, NULL, 0);
+ break;
+
#ifdef WIN32
case SVNSERVE_OPT_SERVICE:
if (run_mode != run_mode_service)
@@ -727,17 +910,16 @@ int main(int argc, const char *argv[])
#endif
case SVNSERVE_OPT_CONFIG_FILE:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&config_filename, arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&config_filename, arg, pool));
config_filename = svn_dirent_internal_style(config_filename, pool);
- SVN_INT_ERR(svn_dirent_get_absolute(&config_filename, config_filename,
- pool));
+ SVN_ERR(svn_dirent_get_absolute(&config_filename, config_filename,
+ pool));
break;
case SVNSERVE_OPT_PID_FILE:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&pid_filename, arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&pid_filename, arg, pool));
pid_filename = svn_dirent_internal_style(pid_filename, pool);
- SVN_INT_ERR(svn_dirent_get_absolute(&pid_filename, pid_filename,
- pool));
+ SVN_ERR(svn_dirent_get_absolute(&pid_filename, pid_filename, pool));
break;
case SVNSERVE_OPT_VIRTUAL_HOST:
@@ -745,10 +927,9 @@ int main(int argc, const char *argv[])
break;
case SVNSERVE_OPT_LOG_FILE:
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&log_filename, arg, pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&log_filename, arg, pool));
log_filename = svn_dirent_internal_style(log_filename, pool);
- SVN_INT_ERR(svn_dirent_get_absolute(&log_filename, log_filename,
- pool));
+ SVN_ERR(svn_dirent_get_absolute(&log_filename, log_filename, pool));
break;
}
@@ -756,12 +937,16 @@ int main(int argc, const char *argv[])
if (is_version)
{
- SVN_INT_ERR(version(quiet, pool));
- exit(0);
+ SVN_ERR(version(quiet, pool));
+ return SVN_NO_ERROR;
}
if (os->ind != argc)
- usage(argv[0], pool);
+ {
+ usage(argv[0], pool);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
+ }
if (mode_opt_count != 1)
{
@@ -774,6 +959,8 @@ int main(int argc, const char *argv[])
#endif
stderr, pool));
usage(argv[0], pool);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
if (handling_opt_count > 1)
@@ -782,65 +969,83 @@ int main(int argc, const char *argv[])
_("You may only specify one of -T or --single-thread\n"),
stderr, pool));
usage(argv[0], pool);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
+ /* construct object pools */
+ is_multi_threaded = handling_mode == connection_mode_thread;
+ params.fs_config = apr_hash_make(pool);
+ svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS,
+ cache_txdeltas ? "1" :"0");
+ svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
+ cache_fulltexts ? "1" :"0");
+ svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
+ cache_revprops ? "2" :"0");
+ svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
+ use_block_read ? "1" :"0");
+
+ SVN_ERR(svn_repos__config_pool_create(&params.config_pool,
+ is_multi_threaded,
+ pool));
+ SVN_ERR(svn_repos__authz_pool_create(&params.authz_pool,
+ params.config_pool,
+ is_multi_threaded,
+ pool));
+
/* If a configuration file is specified, load it and any referenced
* password and authorization files. */
if (config_filename)
{
params.base = svn_dirent_dirname(config_filename, pool);
- SVN_INT_ERR(svn_config_read3(&params.cfg, config_filename,
- TRUE, /* must_exist */
- FALSE, /* section_names_case_sensitive */
- FALSE, /* option_names_case_sensitive */
- pool));
+ SVN_ERR(svn_repos__config_pool_get(&params.cfg, NULL,
+ params.config_pool,
+ config_filename,
+ TRUE, /* must_exist */
+ FALSE, /* names_case_sensitive */
+ NULL,
+ pool));
}
if (log_filename)
- SVN_INT_ERR(svn_io_file_open(&params.log_file, log_filename,
- APR_WRITE | APR_CREATE | APR_APPEND,
- APR_OS_DEFAULT, pool));
+ SVN_ERR(logger__create(&params.logger, log_filename, pool));
+ else if (run_mode == run_mode_listen_once)
+ SVN_ERR(logger__create_for_stderr(&params.logger, pool));
if (params.tunnel_user && run_mode != run_mode_tunnel)
{
- svn_error_clear
- (svn_cmdline_fprintf
- (stderr, pool,
- _("Option --tunnel-user is only valid in tunnel mode.\n")));
- exit(1);
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Option --tunnel-user is only valid in tunnel mode"));
}
if (run_mode == run_mode_inetd || run_mode == run_mode_tunnel)
{
+ apr_pool_t *connection_pool;
+ svn_ra_svn_conn_t *conn;
+ svn_stream_t *stdin_stream;
+ svn_stream_t *stdout_stream;
+
params.tunnel = (run_mode == run_mode_tunnel);
apr_pool_cleanup_register(pool, pool, apr_pool_cleanup_null,
redirect_stdout);
- status = apr_file_open_stdin(&in_file, pool);
- if (status)
- {
- err = svn_error_wrap_apr(status, _("Can't open stdin"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
- }
- status = apr_file_open_stdout(&out_file, pool);
- if (status)
- {
- err = svn_error_wrap_apr(status, _("Can't open stdout"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
- }
+ SVN_ERR(svn_stream_for_stdin(&stdin_stream, pool));
+ SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
/* Use a subpool for the connection to ensure that if SASL is used
* the pool cleanup handlers that call sasl_dispose() (connection_pool)
* and sasl_done() (pool) are run in the right order. See issue #3664. */
connection_pool = svn_pool_create(pool);
- conn = svn_ra_svn_create_conn3(NULL, in_file, out_file,
+ conn = svn_ra_svn_create_conn4(NULL, stdin_stream, stdout_stream,
params.compression_level,
params.zero_copy_limit,
params.error_check_interval,
connection_pool);
- svn_error_clear(serve(conn, &params, connection_pool));
- exit(0);
+ err = serve(conn, &params, connection_pool);
+ svn_pool_destroy(connection_pool);
+
+ return err;
}
#ifdef WIN32
@@ -885,7 +1090,8 @@ int main(int argc, const char *argv[])
}
svn_error_clear(err);
- exit(1);
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
/* The service is now in the "starting" state. Before the SCM will
@@ -930,8 +1136,7 @@ int main(int argc, const char *argv[])
sockaddr_info_flags, pool);
if (status)
{
- err = svn_error_wrap_apr(status, _("Can't get address info"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ return svn_error_wrap_apr(status, _("Can't get address info"));
}
@@ -944,25 +1149,32 @@ int main(int argc, const char *argv[])
#endif
if (status)
{
- err = svn_error_wrap_apr(status, _("Can't create server socket"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ return svn_error_wrap_apr(status, _("Can't create server socket"));
}
/* Prevents "socket in use" errors when server is killed and quickly
* restarted. */
- apr_socket_opt_set(sock, APR_SO_REUSEADDR, 1);
+ status = apr_socket_opt_set(sock, APR_SO_REUSEADDR, 1);
+ if (status)
+ {
+ return svn_error_wrap_apr(status, _("Can't set options on server socket"));
+ }
status = apr_socket_bind(sock, sa);
if (status)
{
- err = svn_error_wrap_apr(status, _("Can't bind server socket"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ return svn_error_wrap_apr(status, _("Can't bind server socket"));
}
- apr_socket_listen(sock, 7);
+ status = apr_socket_listen(sock, ACCEPT_BACKLOG);
+ if (status)
+ {
+ return svn_error_wrap_apr(status, _("Can't listen on server socket"));
+ }
#if APR_HAS_FORK
if (run_mode != run_mode_listen_once && !foreground)
+ /* ### ignoring errors... */
apr_proc_detach(APR_PROC_DETACH_DAEMONIZE);
apr_signal(SIGCHLD, sigchld_handler);
@@ -981,7 +1193,7 @@ int main(int argc, const char *argv[])
#endif
if (pid_filename)
- SVN_INT_ERR(write_pid_file(pid_filename, pool));
+ SVN_ERR(write_pid_file(pid_filename, pool));
#ifdef WIN32
status = apr_os_sock_get(&winservice_svnserve_accept_socket, sock);
@@ -1021,107 +1233,72 @@ int main(int argc, const char *argv[])
svn_cache_config_set(&settings);
}
- while (1)
- {
-#ifdef WIN32
- if (winservice_is_stopping())
- return ERROR_SUCCESS;
-#endif
-
- /* Non-standard pool handling. The main thread never blocks to join
- the connection threads so it cannot clean up after each one. So
- separate pools that can be cleared at thread exit are used. */
-
- connection_pool
- = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+#if APR_HAS_THREADS
+ SVN_ERR(svn_root_pools__create(&connection_pools));
- status = apr_socket_accept(&usock, sock, connection_pool);
- if (handling_mode == connection_mode_fork)
- {
- /* Collect any zombie child processes. */
- while (apr_proc_wait_all_procs(&proc, NULL, NULL, APR_NOWAIT,
- connection_pool) == APR_CHILD_DONE)
- ;
- }
- if (APR_STATUS_IS_EINTR(status)
- || APR_STATUS_IS_ECONNABORTED(status)
- || APR_STATUS_IS_ECONNRESET(status))
- {
- svn_pool_destroy(connection_pool);
- continue;
- }
+ if (handling_mode == connection_mode_thread)
+ {
+ /* create the thread pool with a valid range of threads */
+ if (max_thread_count < 1)
+ max_thread_count = 1;
+ if (min_thread_count > max_thread_count)
+ min_thread_count = max_thread_count;
+
+ status = apr_thread_pool_create(&threads,
+ min_thread_count,
+ max_thread_count,
+ pool);
if (status)
{
- err = svn_error_wrap_apr
- (status, _("Can't accept client connection"));
- return svn_cmdline_handle_exit_error(err, pool, "svnserve: ");
+ return svn_error_wrap_apr(status, _("Can't create thread pool"));
}
- /* Enable TCP keep-alives on the socket so we time out when
- * the connection breaks due to network-layer problems.
- * If the peer has dropped the connection due to a network partition
- * or a crash, or if the peer no longer considers the connection
- * valid because we are behind a NAT and our public IP has changed,
- * it will respond to the keep-alive probe with a RST instead of an
- * acknowledgment segment, which will cause svn to abort the session
- * even while it is currently blocked waiting for data from the peer. */
- status = apr_socket_opt_set(usock, APR_SO_KEEPALIVE, 1);
- if (status)
- {
- /* It's not a fatal error if we cannot enable keep-alives. */
- }
+ /* let idle threads linger for a while in case more requests are
+ coming in */
+ apr_thread_pool_idle_wait_set(threads, THREADPOOL_THREAD_IDLE_LIMIT);
- conn = svn_ra_svn_create_conn3(usock, NULL, NULL,
- params.compression_level,
- params.zero_copy_limit,
- params.error_check_interval,
- connection_pool);
+ /* don't queue requests unless we reached the worker thread limit */
+ apr_thread_pool_threshold_set(threads, 0);
+ }
+ else
+ {
+ threads = NULL;
+ }
+#endif
+ while (1)
+ {
+ connection_t *connection = NULL;
+ SVN_ERR(accept_connection(&connection, sock, &params, handling_mode,
+ pool));
if (run_mode == run_mode_listen_once)
{
- err = serve(conn, &params, connection_pool);
-
- if (err)
- svn_handle_error2(err, stdout, FALSE, "svnserve: ");
- svn_error_clear(err);
-
- apr_socket_close(usock);
- apr_socket_close(sock);
- exit(0);
+ err = serve_socket(connection, connection->pool);
+ close_connection(connection);
+ return err;
}
switch (handling_mode)
{
case connection_mode_fork:
#if APR_HAS_FORK
- status = apr_proc_fork(&proc, connection_pool);
+ status = apr_proc_fork(&proc, connection->pool);
if (status == APR_INCHILD)
{
+ /* the child would't listen to the main server's socket */
apr_socket_close(sock);
- err = serve(conn, &params, connection_pool);
- log_error(err, params.log_file,
- svn_ra_svn_conn_remote_host(conn),
- NULL, NULL, /* user, repos */
- connection_pool);
- svn_error_clear(err);
- apr_socket_close(usock);
- exit(0);
- }
- else if (status == APR_INPARENT)
- {
- apr_socket_close(usock);
+
+ /* serve_socket() logs any error it returns, so ignore it. */
+ svn_error_clear(serve_socket(connection, connection->pool));
+ close_connection(connection);
+ return SVN_NO_ERROR;
}
- else
+ else if (status != APR_INPARENT)
{
err = svn_error_wrap_apr(status, "apr_proc_fork");
- log_error(err, params.log_file,
- svn_ra_svn_conn_remote_host(conn),
- NULL, NULL, /* user, repos */
- connection_pool);
+ logger__log_error(params.logger, err, NULL, NULL);
svn_error_clear(err);
- apr_socket_close(usock);
}
- svn_pool_destroy(connection_pool);
#endif
break;
@@ -1130,46 +1307,64 @@ int main(int argc, const char *argv[])
particularly sophisticated strategy for a threaded server, it's
little different from forking one process per connection. */
#if APR_HAS_THREADS
- shared_pool = attach_shared_pool(connection_pool);
- status = apr_threadattr_create(&tattr, connection_pool);
- if (status)
- {
- err = svn_error_wrap_apr(status, _("Can't create threadattr"));
- svn_handle_error2(err, stderr, FALSE, "svnserve: ");
- svn_error_clear(err);
- exit(1);
- }
- status = apr_threadattr_detach_set(tattr, 1);
- if (status)
- {
- err = svn_error_wrap_apr(status, _("Can't set detached state"));
- svn_handle_error2(err, stderr, FALSE, "svnserve: ");
- svn_error_clear(err);
- exit(1);
- }
- thread_data = apr_palloc(connection_pool, sizeof(*thread_data));
- thread_data->conn = conn;
- thread_data->params = &params;
- thread_data->shared_pool = shared_pool;
- status = apr_thread_create(&tid, tattr, serve_thread, thread_data,
- shared_pool->pool);
+ attach_connection(connection);
+
+ status = apr_thread_pool_push(threads, serve_thread, connection,
+ 0, NULL);
if (status)
{
- err = svn_error_wrap_apr(status, _("Can't create thread"));
- svn_handle_error2(err, stderr, FALSE, "svnserve: ");
- svn_error_clear(err);
- exit(1);
+ return svn_error_wrap_apr(status, _("Can't push task"));
}
- release_shared_pool(shared_pool);
#endif
break;
case connection_mode_single:
/* Serve one connection at a time. */
- svn_error_clear(serve(conn, &params, connection_pool));
- svn_pool_destroy(connection_pool);
+ /* serve_socket() logs any error it returns, so ignore it. */
+ svn_error_clear(serve_socket(connection, connection->pool));
}
+
+ close_connection(connection);
}
/* NOTREACHED */
}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnserve", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(TRUE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnserve: ");
+ }
+
+#if APR_HAS_THREADS
+ /* Explicitly wait for all threads to exit. As we found out with similar
+ code in our C test framework, the memory pool cleanup below cannot be
+ trusted to do the right thing. */
+ if (threads)
+ apr_thread_pool_destroy(threads);
+#endif
+
+ /* this will also close the server's socket */
+ svn_pool_destroy(pool);
+ return exit_code;
+}
diff --git a/subversion/svnsync/svnsync.c b/subversion/svnsync/svnsync.c
index 621b782..6dde1f1 100644
--- a/subversion/svnsync/svnsync.c
+++ b/subversion/svnsync/svnsync.c
@@ -38,7 +38,6 @@
#include "private/svn_opt_private.h"
#include "private/svn_ra_private.h"
#include "private/svn_cmdline_private.h"
-#include "private/svn_subr_private.h"
#include "sync.h"
@@ -69,6 +68,8 @@ enum svnsync__opt {
svnsync_opt_disable_locking,
svnsync_opt_version,
svnsync_opt_trust_server_cert,
+ svnsync_opt_trust_server_cert_failures_src,
+ svnsync_opt_trust_server_cert_failures_dst,
svnsync_opt_allow_non_empty,
svnsync_opt_steal_lock
};
@@ -79,6 +80,8 @@ enum svnsync__opt {
svnsync_opt_auth_username, \
svnsync_opt_auth_password, \
svnsync_opt_trust_server_cert, \
+ svnsync_opt_trust_server_cert_failures_src, \
+ svnsync_opt_trust_server_cert_failures_dst, \
svnsync_opt_source_username, \
svnsync_opt_source_password, \
svnsync_opt_sync_username, \
@@ -113,7 +116,7 @@ static const svn_opt_subcommand_desc2_t svnsync_cmd_table[] =
"mirror of the source repository.\n"),
{ SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q',
svnsync_opt_allow_non_empty, svnsync_opt_disable_locking,
- svnsync_opt_steal_lock } },
+ svnsync_opt_steal_lock, 'M' } },
{ "synchronize", synchronize_cmd, { "sync" },
N_("usage: svnsync synchronize DEST_URL [SOURCE_URL]\n"
"\n"
@@ -126,7 +129,7 @@ static const svn_opt_subcommand_desc2_t svnsync_cmd_table[] =
"if untrusted users/administrators may have write access to the\n"
"DEST_URL repository.\n"),
{ SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q',
- svnsync_opt_disable_locking, svnsync_opt_steal_lock } },
+ svnsync_opt_disable_locking, svnsync_opt_steal_lock, 'M' } },
{ "copy-revprops", copy_revprops_cmd, { 0 },
N_("usage:\n"
"\n"
@@ -147,7 +150,7 @@ static const svn_opt_subcommand_desc2_t svnsync_cmd_table[] =
"\n"
"Form 2 is deprecated syntax, equivalent to specifying \"-rREV[:REV2]\".\n"),
{ SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_prop_encoding, 'q', 'r',
- svnsync_opt_disable_locking, svnsync_opt_steal_lock } },
+ svnsync_opt_disable_locking, svnsync_opt_steal_lock, 'M' } },
{ "info", info_cmd, { 0 },
N_("usage: svnsync info DEST_URL\n"
"\n"
@@ -195,11 +198,37 @@ static const apr_getopt_option_t svnsync_options[] =
" "
"see --source-password and --sync-password)") },
{"trust-server-cert", svnsync_opt_trust_server_cert, 0,
- N_("accept SSL server certificates from unknown\n"
+ N_("deprecated; same as\n"
+ " "
+ "--source-trust-server-cert-failures=unknown-ca\n"
+ " "
+ "--sync-trust-server-cert-failures=unknown-ca")},
+ {"source-trust-server-cert-failures", svnsync_opt_trust_server_cert_failures_src, 1,
+ N_("with --non-interactive, accept SSL\n"
+ " "
+ "server certificates with failures.\n"
+ " "
+ "ARG is a comma-separated list of:\n"
+ " "
+ "- 'unknown-ca' (Unknown Authority)\n"
+ " "
+ "- 'cn-mismatch' (Hostname mismatch)\n"
+ " "
+ "- 'expired' (Expired certificate)\n"
+ " "
+ "- 'not-yet-valid' (Not yet valid certificate)\n"
+ " "
+ "- 'other' (all other not separately classified\n"
+ " "
+ " certificate errors).\n"
+ " "
+ "Applied to the source URL.")},
+ {"sync-trust-server-cert-failures", svnsync_opt_trust_server_cert_failures_dst, 1,
+ N_("Like\n"
" "
- "certificate authorities without prompting (but only\n"
+ "--source-trust-server-cert-failures,\n"
" "
- "with '--non-interactive')") },
+ "but applied to the destination URL.")},
{"source-username", svnsync_opt_source_username, 1,
N_("connect to source repository with username ARG") },
{"source-password", svnsync_opt_source_password, 1,
@@ -238,6 +267,10 @@ static const apr_getopt_option_t svnsync_options[] =
"and is not being concurrently accessed by another\n"
" "
"svnsync instance.")},
+ {"memory-cache-size", 'M', 1,
+ N_("size of the extra in-memory cache in MB used to\n"
+ " "
+ "minimize operations for local 'file' scheme.\n")},
{"version", svnsync_opt_version, 0,
N_("show program version information")},
{"help", 'h', 0,
@@ -249,7 +282,13 @@ static const apr_getopt_option_t svnsync_options[] =
typedef struct opt_baton_t {
svn_boolean_t non_interactive;
- svn_boolean_t trust_server_cert;
+ struct {
+ 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;
+ } src_trust, dst_trust;
svn_boolean_t no_auth_cache;
svn_auth_baton_t *source_auth_baton;
svn_auth_baton_t *sync_auth_baton;
@@ -483,7 +522,7 @@ remove_props_not_in_source(svn_ra_session_t *session,
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
+ const char *propname = apr_hash_this_key(hi);
svn_pool_clear(subpool);
@@ -527,8 +566,8 @@ filter_props(int *filtered_count, apr_hash_t *props,
for (hi = apr_hash_first(pool, props); hi ; hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- void *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ void *propval = apr_hash_this_val(hi);
/* Copy all properties:
- not matching the exclude pattern if provided OR
@@ -569,8 +608,8 @@ write_revprops(int *filtered_count,
for (hi = apr_hash_first(pool, rev_props); hi; hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- const svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ const svn_string_t *propval = apr_hash_this_val(hi);
svn_pool_clear(subpool);
@@ -729,8 +768,10 @@ open_target_session(svn_ra_session_t **to_session_p,
/*** `svnsync init' ***/
/* Initialize the repository associated with RA session TO_SESSION,
- * using information found in BATON, while the repository is
- * locked. Implements `with_locked_func_t' interface.
+ * using information found in BATON.
+ *
+ * Implements `with_locked_func_t' interface. The caller has
+ * acquired a lock on the repository if locking is needed.
*/
static svn_error_t *
do_initialize(svn_ra_session_t *to_session,
@@ -937,7 +978,8 @@ open_source_session(svn_ra_session_t **from_session,
/* ### TODO: Should we validate that FROM_URL_STR->data matches any
provided FROM_URL here? */
if (! from_url)
- from_url = from_url_str->data;
+ SVN_ERR(svn_opt__arg_canonicalize_url(&from_url, from_url_str->data,
+ pool));
/* Open the session to copy the revision data. */
SVN_ERR(svn_ra_open4(from_session, NULL, from_url, from_uuid_str->data,
@@ -967,14 +1009,18 @@ open_target_session(svn_ra_session_t **target_session_p,
typedef struct replay_baton_t {
svn_ra_session_t *from_session;
svn_ra_session_t *to_session;
- /* Extra 'backdoor' session for fetching data *from* the target repo. */
- svn_ra_session_t *extra_to_session;
svn_revnum_t current_revision;
subcommand_baton_t *sb;
svn_boolean_t has_commit_revprops_capability;
+ svn_boolean_t has_atomic_revprops_capability;
int normalized_rev_props_count;
int normalized_node_props_count;
const char *to_root;
+
+#ifdef ENABLE_EV2_SHIMS
+ /* Extra 'backdoor' session for fetching data *from* the target repo. */
+ svn_ra_session_t *extra_to_session;
+#endif
} replay_baton_t;
/* Return a replay baton allocated from POOL and populated with
@@ -1051,7 +1097,7 @@ filter_include_log(const char *key)
return ! filter_exclude_log(key);
}
-
+#ifdef ENABLE_EV2_SHIMS
static svn_error_t *
fetch_base_func(const char **filename,
void *baton,
@@ -1179,6 +1225,7 @@ get_shim_callbacks(replay_baton_t *rb,
return callbacks;
}
+#endif
/* Callback function for svn_ra_replay_range, invoked when starting to parse
@@ -1247,8 +1294,10 @@ replay_rev_started(svn_revnum_t revision,
rb->sb->source_prop_encoding, pool));
rb->normalized_rev_props_count += normalized_count;
+#ifdef ENABLE_EV2_SHIMS
SVN_ERR(svn_ra__register_editor_shim_callbacks(rb->to_session,
get_shim_callbacks(rb, pool)));
+#endif
SVN_ERR(svn_ra_get_commit_editor3(rb->to_session, &commit_editor,
&commit_baton,
filtered,
@@ -1291,6 +1340,7 @@ replay_rev_finished(svn_revnum_t revision,
apr_hash_t *filtered, *existing_props;
int filtered_count;
int normalized_count;
+ const svn_string_t *rev_str;
SVN_ERR(editor->close_edit(edit_baton, pool));
@@ -1330,21 +1380,24 @@ replay_rev_finished(svn_revnum_t revision,
svn_pool_clear(subpool);
+ rev_str = svn_string_createf(subpool, "%ld", revision);
+
/* Ok, we're done, bring the last-merged-rev property up to date. */
SVN_ERR(svn_ra_change_rev_prop2(
rb->to_session,
0,
SVNSYNC_PROP_LAST_MERGED_REV,
NULL,
- svn_string_create(apr_psprintf(pool, "%ld", revision),
- subpool),
+ rev_str,
subpool));
/* And finally drop the currently copying prop, since we're done
with this revision. */
SVN_ERR(svn_ra_change_rev_prop2(rb->to_session, 0,
SVNSYNC_PROP_CURRENTLY_COPYING,
- NULL, NULL, subpool));
+ rb->has_atomic_revprops_capability
+ ? &rev_str : NULL,
+ NULL, subpool));
/* Notify the user that we copied revision properties. */
if (! rb->sb->quiet)
@@ -1356,8 +1409,10 @@ replay_rev_finished(svn_revnum_t revision,
}
/* Synchronize the repository associated with RA session TO_SESSION,
- * using information found in BATON, while the repository is
- * locked. Implements `with_locked_func_t' interface.
+ * using information found in BATON.
+ *
+ * Implements `with_locked_func_t' interface. The caller has
+ * acquired a lock on the repository if locking is needed.
*/
static svn_error_t *
do_synchronize(svn_ra_session_t *to_session,
@@ -1474,6 +1529,11 @@ do_synchronize(svn_ra_session_t *to_session,
SVN_RA_CAPABILITY_COMMIT_REVPROPS,
pool));
+ SVN_ERR(svn_ra_has_capability(rb->to_session,
+ &rb->has_atomic_revprops_capability,
+ SVN_RA_CAPABILITY_ATOMIC_REVPROPS,
+ pool));
+
start_revision = last_merged + 1;
end_revision = from_latest;
@@ -1545,8 +1605,10 @@ synchronize_cmd(apr_getopt_t *os, void *b, apr_pool_t *pool)
/*** `svnsync copy-revprops' ***/
/* Copy revision properties to the repository associated with RA
- * session TO_SESSION, using information found in BATON, while the
- * repository is locked. Implements `with_locked_func_t' interface.
+ * session TO_SESSION, using information found in BATON.
+ *
+ * Implements `with_locked_func_t' interface. The caller has
+ * acquired a lock on the repository if locking is needed.
*/
static svn_error_t *
do_copy_revprops(svn_ra_session_t *to_session,
@@ -1848,6 +1910,7 @@ help_cmd(apr_getopt_t *os, void *baton, apr_pool_t *pool)
const char *header =
_("general usage: svnsync SUBCOMMAND DEST_URL [ARGS & OPTIONS ...]\n"
+ "Subversion repository replication tool.\n"
"Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
"Type 'svnsync --version' to see the program version and RA modules.\n"
"\n"
@@ -1876,8 +1939,13 @@ help_cmd(apr_getopt_t *os, void *baton, apr_pool_t *pool)
/*** Main ***/
-int
-main(int argc, const char *argv[])
+/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ */
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
const svn_opt_subcommand_desc2_t *subcommand = NULL;
apr_array_header_t *received_opts;
@@ -1885,7 +1953,6 @@ main(int argc, const char *argv[])
svn_config_t *config;
apr_status_t apr_err;
apr_getopt_t *os;
- apr_pool_t *pool;
svn_error_t *err;
int opt_id, i;
const char *username = NULL, *source_username = NULL, *sync_username = NULL;
@@ -1894,23 +1961,10 @@ main(int argc, const char *argv[])
const char *source_prop_encoding = NULL;
svn_boolean_t force_interactive = FALSE;
- if (svn_cmdline_init("svnsync", stderr) != EXIT_SUCCESS)
- {
- return EXIT_FAILURE;
- }
+ /* Check library versions */
+ SVN_ERR(check_lib_versions());
- err = check_lib_versions();
- if (err)
- return svn_cmdline_handle_exit_error(err, NULL, "svnsync: ");
-
- /* Create our top-level pool. Use a separate mutexless allocator,
- * given this application is single threaded.
- */
- pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-
- err = svn_ra_initialize(pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ SVN_ERR(svn_ra_initialize(pool));
/* Initialize the option baton. */
memset(&opt_baton, 0, sizeof(opt_baton));
@@ -1921,14 +1975,12 @@ main(int argc, const char *argv[])
if (argc <= 1)
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
- err = svn_cmdline__getopt_init(&os, argc, argv, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
@@ -1942,9 +1994,9 @@ main(int argc, const char *argv[])
break;
else if (apr_err)
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
APR_ARRAY_PUSH(received_opts, int) = opt_id;
@@ -1959,8 +2011,31 @@ main(int argc, const char *argv[])
force_interactive = TRUE;
break;
- case svnsync_opt_trust_server_cert:
- opt_baton.trust_server_cert = TRUE;
+ case svnsync_opt_trust_server_cert: /* backwards compat */
+ opt_baton.src_trust.trust_server_cert_unknown_ca = TRUE;
+ opt_baton.dst_trust.trust_server_cert_unknown_ca = TRUE;
+ break;
+
+ case svnsync_opt_trust_server_cert_failures_src:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &opt_baton.src_trust.trust_server_cert_unknown_ca,
+ &opt_baton.src_trust.trust_server_cert_cn_mismatch,
+ &opt_baton.src_trust.trust_server_cert_expired,
+ &opt_baton.src_trust.trust_server_cert_not_yet_valid,
+ &opt_baton.src_trust.trust_server_cert_other_failure,
+ opt_arg, pool));
+ break;
+
+ case svnsync_opt_trust_server_cert_failures_dst:
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_trust_options(
+ &opt_baton.dst_trust.trust_server_cert_unknown_ca,
+ &opt_baton.dst_trust.trust_server_cert_cn_mismatch,
+ &opt_baton.dst_trust.trust_server_cert_expired,
+ &opt_baton.dst_trust.trust_server_cert_not_yet_valid,
+ &opt_baton.dst_trust.trust_server_cert_other_failure,
+ opt_arg, pool));
break;
case svnsync_opt_no_auth_cache:
@@ -2006,12 +2081,10 @@ main(int argc, const char *argv[])
apr_array_make(pool, 1,
sizeof(svn_cmdline__config_argument_t*));
- err = svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool);
- if (!err)
- err = svn_cmdline__parse_config_option(config_options,
- opt_arg, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(config_options,
+ opt_arg, "svnsync: ",
+ pool));
break;
case svnsync_opt_source_prop_encoding:
@@ -2045,13 +2118,11 @@ main(int argc, const char *argv[])
opt_arg, pool) != 0)
{
const char *utf8_opt_arg;
- err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
- if (! err)
- err = svn_error_createf(
+ SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
+ return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Syntax error in revision argument '%s'"),
utf8_opt_arg);
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
}
/* We only allow numbers and 'HEAD'. */
@@ -2061,13 +2132,28 @@ main(int argc, const char *argv[])
(opt_baton.end_rev.kind != svn_opt_revision_head) &&
(opt_baton.end_rev.kind != svn_opt_revision_unspecified)))
{
- err = svn_error_createf(
+ return svn_error_createf(
SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Invalid revision range '%s' provided"), opt_arg);
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
}
break;
+ case 'M':
+ if (!config_options)
+ config_options =
+ apr_array_make(pool, 1,
+ sizeof(svn_cmdline__config_argument_t*));
+
+ SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool));
+ SVN_ERR(svn_cmdline__parse_config_option(
+ config_options,
+ apr_psprintf(pool,
+ "config:miscellany:memory-cache-size=%s",
+ opt_arg),
+ NULL /* won't be used */,
+ pool));
+ break;
+
case '?':
case 'h':
opt_baton.help = TRUE;
@@ -2075,14 +2161,14 @@ main(int argc, const char *argv[])
default:
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
- if(opt_err)
- return svn_cmdline_handle_exit_error(opt_err, pool, "svnsync: ");
+ if (opt_err)
+ return opt_err;
}
if (opt_baton.help)
@@ -2092,10 +2178,9 @@ main(int argc, const char *argv[])
* exclusive. */
if (opt_baton.non_interactive && force_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--non-interactive and --force-interactive "
- "are mutually exclusive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--non-interactive and --force-interactive "
+ "are mutually exclusive"));
}
else
opt_baton.non_interactive = !svn_cmdline__be_interactive(
@@ -2109,12 +2194,11 @@ main(int argc, const char *argv[])
&& (source_username || sync_username
|| source_password || sync_password))
{
- err = svn_error_create
+ return svn_error_create
(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Cannot use --username or --password with any of "
"--source-username, --source-password, --sync-username, "
"or --sync-password.\n"));
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
}
if (username)
{
@@ -2134,24 +2218,32 @@ main(int argc, const char *argv[])
/* Disallow mixing of --steal-lock and --disable-locking. */
if (opt_baton.steal_lock && opt_baton.disable_locking)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--disable-locking and --steal-lock are "
- "mutually exclusive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--disable-locking and --steal-lock are "
+ "mutually exclusive"));
}
- /* --trust-server-cert can only be used with --non-interactive */
- if (opt_baton.trust_server_cert && !opt_baton.non_interactive)
+ /* --trust-* can only be used with --non-interactive */
+ if (!opt_baton.non_interactive)
{
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("--trust-server-cert requires "
- "--non-interactive"));
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ if (opt_baton.src_trust.trust_server_cert_unknown_ca
+ || opt_baton.src_trust.trust_server_cert_cn_mismatch
+ || opt_baton.src_trust.trust_server_cert_expired
+ || opt_baton.src_trust.trust_server_cert_not_yet_valid
+ || opt_baton.src_trust.trust_server_cert_other_failure
+ || opt_baton.dst_trust.trust_server_cert_unknown_ca
+ || opt_baton.dst_trust.trust_server_cert_cn_mismatch
+ || opt_baton.dst_trust.trust_server_cert_expired
+ || opt_baton.dst_trust.trust_server_cert_not_yet_valid
+ || opt_baton.dst_trust.trust_server_cert_other_failure)
+ return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("--source-trust-server-cert-failures "
+ "and "
+ "--sync-trust-server-cert-failures require "
+ "--non-interactive"));
}
- err = svn_config_ensure(opt_baton.config_dir, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "synsync: ");
+ SVN_ERR(svn_config_ensure(opt_baton.config_dir, pool));
if (subcommand == NULL)
{
@@ -2170,9 +2262,9 @@ main(int argc, const char *argv[])
}
else
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
else
@@ -2182,9 +2274,9 @@ main(int argc, const char *argv[])
first_arg);
if (subcommand == NULL)
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(help_cmd(NULL, NULL, pool));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
}
}
@@ -2205,23 +2297,20 @@ main(int argc, const char *argv[])
svn_opt_format_option(&optstr, badopt, FALSE, pool);
if (subcommand->name[0] == '-')
{
- SVN_INT_ERR(help_cmd(NULL, NULL, pool));
+ SVN_ERR(help_cmd(NULL, NULL, pool));
}
else
{
- err = svn_error_createf
+ return svn_error_createf
(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Subcommand '%s' doesn't accept option '%s'\n"
"Type 'svnsync help %s' for usage.\n"),
subcommand->name, optstr, subcommand->name);
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
}
}
}
- err = svn_config_get_config(&opt_baton.config, opt_baton.config_dir, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ SVN_ERR(svn_config_get_config(&opt_baton.config, opt_baton.config_dir, pool));
/* Update the options in the config */
if (config_options)
@@ -2263,27 +2352,37 @@ main(int argc, const char *argv[])
apr_signal(SIGXFSZ, SIG_IGN);
#endif
- err = svn_cmdline_create_auth_baton(&opt_baton.source_auth_baton,
- opt_baton.non_interactive,
- opt_baton.source_username,
- opt_baton.source_password,
- opt_baton.config_dir,
- opt_baton.no_auth_cache,
- opt_baton.trust_server_cert,
- config,
- check_cancel, NULL,
- pool);
+ err = svn_cmdline_create_auth_baton2(
+ &opt_baton.source_auth_baton,
+ opt_baton.non_interactive,
+ opt_baton.source_username,
+ opt_baton.source_password,
+ opt_baton.config_dir,
+ opt_baton.no_auth_cache,
+ opt_baton.src_trust.trust_server_cert_unknown_ca,
+ opt_baton.src_trust.trust_server_cert_cn_mismatch,
+ opt_baton.src_trust.trust_server_cert_expired,
+ opt_baton.src_trust.trust_server_cert_not_yet_valid,
+ opt_baton.src_trust.trust_server_cert_other_failure,
+ config,
+ check_cancel, NULL,
+ pool);
if (! err)
- err = svn_cmdline_create_auth_baton(&opt_baton.sync_auth_baton,
- opt_baton.non_interactive,
- opt_baton.sync_username,
- opt_baton.sync_password,
- opt_baton.config_dir,
- opt_baton.no_auth_cache,
- opt_baton.trust_server_cert,
- config,
- check_cancel, NULL,
- pool);
+ err = svn_cmdline_create_auth_baton2(
+ &opt_baton.sync_auth_baton,
+ opt_baton.non_interactive,
+ opt_baton.sync_username,
+ opt_baton.sync_password,
+ opt_baton.config_dir,
+ opt_baton.no_auth_cache,
+ opt_baton.dst_trust.trust_server_cert_unknown_ca,
+ opt_baton.dst_trust.trust_server_cert_cn_mismatch,
+ opt_baton.dst_trust.trust_server_cert_expired,
+ opt_baton.dst_trust.trust_server_cert_not_yet_valid,
+ opt_baton.dst_trust.trust_server_cert_other_failure,
+ config,
+ check_cancel, NULL,
+ pool);
if (! err)
err = (*subcommand->cmd_func)(os, &opt_baton, pool);
if (err)
@@ -2297,10 +2396,40 @@ main(int argc, const char *argv[])
_("Try 'svnsync help' for more info"));
}
- return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
+ return err;
}
- svn_pool_destroy(pool);
+ return SVN_NO_ERROR;
+}
- return EXIT_SUCCESS;
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnsync", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
+
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnsync: ");
+ }
+
+ svn_pool_destroy(pool);
+ return exit_code;
}
diff --git a/subversion/svnsync/sync.c b/subversion/svnsync/sync.c
index 4d54ee8..8773042 100644
--- a/subversion/svnsync/sync.c
+++ b/subversion/svnsync/sync.c
@@ -195,8 +195,8 @@ svnsync_normalize_revprops(apr_hash_t *rev_props,
hi;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- const svn_string_t *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ const svn_string_t *propval = apr_hash_this_val(hi);
if (svn_prop_needs_translation(propname))
{
diff --git a/subversion/svnversion/svnversion.c b/subversion/svnversion/svnversion.c
index 94ac588..8e4ceff 100644
--- a/subversion/svnversion/svnversion.c
+++ b/subversion/svnversion/svnversion.c
@@ -29,7 +29,6 @@
#include "private/svn_opt_private.h"
#include "private/svn_cmdline_private.h"
-#include "private/svn_subr_private.h"
#include "svn_private_config.h"
@@ -48,7 +47,6 @@ usage(apr_pool_t *pool)
{
svn_error_clear(svn_cmdline_fprintf
(stderr, pool, _("Type 'svnversion --help' for usage.\n")));
- exit(1);
}
@@ -58,7 +56,10 @@ help(const apr_getopt_option_t *options, apr_pool_t *pool)
svn_error_clear
(svn_cmdline_fprintf
(stdout, pool,
- _("usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n\n"
+ _("usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]\n"
+ "Subversion working copy identification tool.\n"
+ "Type 'svnversion --version' to see the program version.\n"
+ "\n"
" Produce a compact version identifier for the working copy path\n"
" WC_PATH. TRAIL_URL is the trailing portion of the URL used to\n"
" determine if WC_PATH itself is switched (detection of switches\n"
@@ -95,7 +96,6 @@ help(const apr_getopt_option_t *options, apr_pool_t *pool)
++options;
}
svn_error_clear(svn_cmdline_fprintf(stdout, pool, "\n"));
- exit(0);
}
@@ -115,16 +115,19 @@ check_lib_versions(void)
}
/*
+ * On success, leave *EXIT_CODE untouched and return SVN_NO_ERROR. On error,
+ * either return an error to be displayed, or set *EXIT_CODE to non-zero and
+ * return SVN_NO_ERROR.
+ *
* Why is this not an svn subcommand? I have this vague idea that it could
* be run as part of the build process, with the output embedded in the svn
* program. Obviously we don't want to have to run svn when building svn.
*/
-int
-main(int argc, const char *argv[])
+static svn_error_t *
+sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
{
const char *wc_path, *trail_url;
const char *local_abspath;
- apr_pool_t *pool;
svn_wc_revision_status_t *res;
svn_boolean_t no_newline = FALSE, committed = FALSE;
svn_error_t *err;
@@ -144,33 +147,18 @@ main(int argc, const char *argv[])
{0, 0, 0, 0}
};
- /* Initialize the app. */
- if (svn_cmdline_init("svnversion", stderr) != EXIT_SUCCESS)
- return EXIT_FAILURE;
-
- /* Create our top-level pool. Use a separate mutexless allocator,
- * given this application is single threaded.
- */
- pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
-
/* Check library versions */
- err = check_lib_versions();
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnversion: ");
+ SVN_ERR(check_lib_versions());
#if defined(WIN32) || defined(__CYGWIN__)
/* Set the working copy administrative directory name. */
if (getenv("SVN_ASP_DOT_NET_HACK"))
{
- err = svn_wc_set_adm_dir("_svn", pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnversion: ");
+ SVN_ERR(svn_wc_set_adm_dir("_svn", pool));
}
#endif
- err = svn_cmdline__getopt_init(&os, argc, argv, pool);
- if (err)
- return svn_cmdline_handle_exit_error(err, pool, "svnversion: ");
+ SVN_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool));
os->interleave = 1;
while (1)
@@ -181,7 +169,11 @@ main(int argc, const char *argv[])
if (APR_STATUS_IS_EOF(status))
break;
if (status != APR_SUCCESS)
- usage(pool); /* this will exit() */
+ {
+ *exit_code = EXIT_FAILURE;
+ usage(pool);
+ return SVN_NO_ERROR;
+ }
switch (opt)
{
@@ -196,35 +188,39 @@ main(int argc, const char *argv[])
break;
case 'h':
help(options, pool);
- break;
+ return SVN_NO_ERROR;
case SVNVERSION_OPT_VERSION:
is_version = TRUE;
break;
default:
- usage(pool); /* this will exit() */
+ *exit_code = EXIT_FAILURE;
+ usage(pool);
+ return SVN_NO_ERROR;
}
}
if (is_version)
{
- SVN_INT_ERR(version(quiet, pool));
- exit(0);
+ SVN_ERR(version(quiet, pool));
+ return SVN_NO_ERROR;
}
if (os->ind > argc || os->ind < argc - 2)
- usage(pool); /* this will exit() */
+ {
+ *exit_code = EXIT_FAILURE;
+ usage(pool);
+ return SVN_NO_ERROR;
+ }
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&wc_path,
- (os->ind < argc) ? os->argv[os->ind]
- : ".",
- pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&wc_path,
+ (os->ind < argc) ? os->argv[os->ind] : ".",
+ pool));
- SVN_INT_ERR(svn_opt__arg_canonicalize_path(&wc_path, wc_path, pool));
- SVN_INT_ERR(svn_dirent_get_absolute(&local_abspath, wc_path, pool));
- SVN_INT_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
+ SVN_ERR(svn_opt__arg_canonicalize_path(&wc_path, wc_path, pool));
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath, wc_path, pool));
+ SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
if (os->ind+1 < argc)
- SVN_INT_ERR(svn_utf_cstring_to_utf8(&trail_url, os->argv[os->ind+1],
- pool));
+ SVN_ERR(svn_utf_cstring_to_utf8(&trail_url, os->argv[os->ind+1], pool));
else
trail_url = NULL;
@@ -239,63 +235,87 @@ main(int argc, const char *argv[])
svn_error_clear(err);
- SVN_INT_ERR(svn_io_check_special_path(local_abspath, &kind, &special,
- pool));
+ SVN_ERR(svn_io_check_special_path(local_abspath, &kind, &special, pool));
if (special)
- SVN_INT_ERR(svn_cmdline_printf(pool, _("Unversioned symlink%s"),
- no_newline ? "" : "\n"));
+ SVN_ERR(svn_cmdline_printf(pool, _("Unversioned symlink%s"),
+ no_newline ? "" : "\n"));
else if (kind == svn_node_dir)
- SVN_INT_ERR(svn_cmdline_printf(pool, _("Unversioned directory%s"),
- no_newline ? "" : "\n"));
+ SVN_ERR(svn_cmdline_printf(pool, _("Unversioned directory%s"),
+ no_newline ? "" : "\n"));
else if (kind == svn_node_file)
- SVN_INT_ERR(svn_cmdline_printf(pool, _("Unversioned file%s"),
- no_newline ? "" : "\n"));
+ SVN_ERR(svn_cmdline_printf(pool, _("Unversioned file%s"),
+ no_newline ? "" : "\n"));
else
{
- SVN_INT_ERR(svn_cmdline_fprintf(stderr, pool,
- kind == svn_node_none
- ? _("'%s' doesn't exist\n")
- : _("'%s' is of unknown type\n"),
- svn_dirent_local_style(local_abspath,
- pool)));
- svn_pool_destroy(pool);
- return EXIT_FAILURE;
+ SVN_ERR(svn_cmdline_fprintf(stderr, pool,
+ kind == svn_node_none
+ ? _("'%s' doesn't exist\n")
+ : _("'%s' is of unknown type\n"),
+ svn_dirent_local_style(local_abspath,
+ pool)));
+ *exit_code = EXIT_FAILURE;
+ return SVN_NO_ERROR;
}
- svn_pool_destroy(pool);
- return EXIT_SUCCESS;
+ return SVN_NO_ERROR;
}
- SVN_INT_ERR(err);
+ SVN_ERR(err);
if (! SVN_IS_VALID_REVNUM(res->min_rev))
{
/* Local uncommitted modifications, no revision info was found. */
- SVN_INT_ERR(svn_cmdline_printf(pool, _("Uncommitted local addition, "
- "copy or move%s"),
- no_newline ? "" : "\n"));
- svn_pool_destroy(pool);
- return EXIT_SUCCESS;
+ SVN_ERR(svn_cmdline_printf(pool, _("Uncommitted local addition, "
+ "copy or move%s"),
+ no_newline ? "" : "\n"));
+ return SVN_NO_ERROR;
}
/* Build compact '123[:456]M?S?' string. */
- SVN_INT_ERR(svn_cmdline_printf(pool, "%ld", res->min_rev));
+ SVN_ERR(svn_cmdline_printf(pool, "%ld", res->min_rev));
if (res->min_rev != res->max_rev)
- SVN_INT_ERR(svn_cmdline_printf(pool, ":%ld", res->max_rev));
+ SVN_ERR(svn_cmdline_printf(pool, ":%ld", res->max_rev));
if (res->modified)
- SVN_INT_ERR(svn_cmdline_fputs("M", stdout, pool));
+ SVN_ERR(svn_cmdline_fputs("M", stdout, pool));
if (res->switched)
- SVN_INT_ERR(svn_cmdline_fputs("S", stdout, pool));
+ SVN_ERR(svn_cmdline_fputs("S", stdout, pool));
if (res->sparse_checkout)
- SVN_INT_ERR(svn_cmdline_fputs("P", stdout, pool));
+ SVN_ERR(svn_cmdline_fputs("P", stdout, pool));
if (! no_newline)
- SVN_INT_ERR(svn_cmdline_fputs("\n", stdout, pool));
+ SVN_ERR(svn_cmdline_fputs("\n", stdout, pool));
- svn_pool_destroy(pool);
+ return SVN_NO_ERROR;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ apr_pool_t *pool;
+ int exit_code = EXIT_SUCCESS;
+ svn_error_t *err;
+
+ /* Initialize the app. */
+ if (svn_cmdline_init("svnversion", stderr) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
- /* Flush stdout to make sure that the user will see any printing errors. */
- SVN_INT_ERR(svn_cmdline_fflush(stdout));
+ /* Create our top-level pool. Use a separate mutexless allocator,
+ * given this application is single threaded.
+ */
+ pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+ err = sub_main(&exit_code, argc, argv, pool);
+
+ /* Flush stdout and report if it fails. It would be flushed on exit anyway
+ but this makes sure that output is not silently lost if it fails. */
+ err = svn_error_compose_create(err, svn_cmdline_fflush(stdout));
- return EXIT_SUCCESS;
+ if (err)
+ {
+ exit_code = EXIT_FAILURE;
+ svn_cmdline_handle_exit_error(err, NULL, "svnversion: ");
+ }
+
+ svn_pool_destroy(pool);
+ return exit_code;
}
diff --git a/subversion/tests/cmdline/README b/subversion/tests/cmdline/README
index 9674cac..65dcc28 100644
--- a/subversion/tests/cmdline/README
+++ b/subversion/tests/cmdline/README
@@ -12,7 +12,7 @@ command-line client. It has no access to code internals; it never
looks inside the .svn/ directory; it only performs actions that a
human user would do.
-These tests require Python 2.5 or later.
+These tests require Python 2.7 or later.
[ For more general information on Subversion's testing system,
please read the README in subversion/tests/. ]
@@ -83,6 +83,133 @@ paths adjusted appropriately:
Require valid-user
</Location>
+ <Location /authz-test-work/anon>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ # This may seem unnecessary but granting access to everyone here is necessary
+ # to exercise a bug with httpd 2.3.x+. The "Require all granted" syntax is
+ # new to 2.3.x+ which we can detect with the mod_authz_core.c module
+ # signature. Use the "Allow from all" syntax with older versions for symmetry.
+ <IfModule mod_authz_core.c>
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ Allow from all
+ </IfMOdule>
+ </Location>
+ <Location /authz-test-work/mixed>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ Satisfy Any
+ </Location>
+ <Location /authz-test-work/mixed-noauthwhenanon>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ AuthzSVNNoAuthWhenAnonymousAllowed On
+ </Location>
+ <Location /authz-test-work/authn>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ </Location>
+ <Location /authz-test-work/authn-anonoff>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ AuthzSVNAnonymous Off
+ </Location>
+ <Location /authz-test-work/authn-lcuser>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ AuthzForceUsernameCase Lower
+ </Location>
+ <Location /authz-test-work/authn-lcuser>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ Require valid-user
+ AuthzForceUsernameCase Lower
+ </Location>
+ <Location /authz-test-work/authn-group>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ AuthGroupFile /usr/local/apache2/conf/groups
+ Require group random
+ AuthzSVNAuthoritative Off
+ </Location>
+ <IfModule mod_authz_core.c>
+ <Location /authz-test-work/sallrany>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ AuthzSendForbiddenOnFailure On
+ Satisfy All
+ <RequireAny>
+ Require valid-user
+ Require expr req('ALLOW') == '1'
+ </RequireAny>
+ </Location>
+ <Location /authz-test-work/sallrall>
+ DAV svn
+ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
+ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /usr/local/apache2/conf/users
+ AuthzSendForbiddenOnFailure On
+ Satisfy All
+ <RequireAll>
+ Require valid-user
+ Require expr req('ALLOW') == '1'
+ </RequireAll>
+ </Location>
+ </IfModule>
+
+
RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)$ /svn-test-work/repositories/$1
RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)$ /svn-test-work/repositories/$1
@@ -101,6 +228,15 @@ just drop the following 2-line snippet into the
----------------------------
jrandom:xCGl35kV9oWCY
jconstant:xCGl35kV9oWCY
+JRANDOM:xCGl35kV9oWCY
+JCONSTANT:xCGl35kV9oWCY
+----------------------------
+
+and these lines into the
+/usr/local/apache/conf/groups file:
+----------------------------
+random: jrandom
+constant: jconstant
----------------------------
Now, (re)start Apache and run the tests over mod_dav_svn.
@@ -138,6 +274,8 @@ Note [1]: It would be quite too much to expect those password entries
----------------------------
jrandom:$apr1$3p1.....$FQW6RceW5QhJ2blWDQgKn0
jconstant:$apr1$jp1.....$Usrqji1c9H6AbOxOGAzzb0
+ JRANDOM:$apr1$3p1.....$FQW6RceW5QhJ2blWDQgKn0
+ JCONSTANT:$apr1$jp1.....$Usrqji1c9H6AbOxOGAzzb0
----------------------------
@@ -151,7 +289,13 @@ it will run just one suite or just one test:
$ ./davautocheck.sh basic
$ ./davautocheck.sh basic 15
-It also respects some environment variables.
+With '--no-tests' argument, it will start httpd but not run any tests. This is
+useful for manual testing --- create repositories in
+./svn-test-work/repositories/<$repo> and they will be accessible at
+<URL>/svn-test-work/repositories/<$repo>. You can also run individual tests by passing the --url option to them, as described above.
+
+davautocheck.sh also respects some environment variables; see the comments at
+the top of the script for details.
Running over ra_svn
-------------------
@@ -174,8 +318,8 @@ or if you're running an individual test,
$ ./basic_tests.py --url=svn://localhost --enable-sasl 3
-Note that to do this you'll have to have a subversion.conf file in your
-SASL lib dir (i.e. something like /usr/lib/sasl2/subversion.conf), it
+Note that to do this you'll have to have a svn.conf file in your
+SASL lib dir (i.e. something like /usr/lib/sasl2/svn.conf), it
should contain something like:
pwcheck_method: auxprop
@@ -189,6 +333,16 @@ $ saslpasswd2 -c -u svntest jconstant
As usual, both users should use the password 'rayjandom'.
+To enable DUMP_LOAD_CROSS_CHECK to work a third user is required,
+
+$ saslpasswd2 -c -u svntest __dumpster__
+
+with password '__loadster__'.
+
+The user running the tests will need read access to the sasl database
+and on some systems this can be arranged by adding the user to the sasl
+group.
+
There are 'make svnserveautocheck' and ./svnserveautocheck.sh commands,
analogous to davautocheck.sh documented above.
@@ -245,9 +399,25 @@ Directory Contents
/verify.py: Verifies output from Subversion.
- /entry.py: Parse an `entries' file (### not used yet)
+ /testcase.py: Control of test case execution - contains
+ decorators for expected failures and conditionally
+ executed tests.
+
+ /sandbox.py: Tools for manipulating a test's working area
+ ("a sandbox"), those are handy for most simple
+ actions a test might want to perform on a wc.
+ /objects.py: Objects that keep track of state during a test.
+ (not directly used by the test scripts.)
+ /mergetrees.py: Routines that create merge scenarios.
+
+ /factory.py: Automatically generate a (near-)complete new
+ cmdline test from a series of shell commands.
+
+ /error.py: Error codes as constants, for convenience.
+ (auto-generated by tools/dev/gen-py-error.py)
+
What the Python Tests are Doing
===============================
@@ -341,7 +511,7 @@ the bottom of the file. To avoid renumbering of existing tests, you
should add new tests to the end of the list.
-Testing Compatability With Previous Release
+Testing Compatibility With Previous Release
===========================================
You can run the Python test suite against older installed versions of
diff --git a/subversion/tests/cmdline/atomic-ra-revprop-change.c b/subversion/tests/cmdline/atomic-ra-revprop-change.c
index 5ef443f..b2fd956 100644
--- a/subversion/tests/cmdline/atomic-ra-revprop-change.c
+++ b/subversion/tests/cmdline/atomic-ra-revprop-change.c
@@ -118,13 +118,13 @@ change_rev_prop(const char *url,
}
else if (! want_error && ! err)
/* Expectation was matched. Get out. */
- return SVN_NO_ERROR;
+ return SVN_NO_ERROR;
else if (want_error && ! err)
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"An error was expected but not seen");
else
- /* A real (non-SVN_ERR_FS_PROP_BASEVALUE_MISMATCH) error. */
- return svn_error_trace(err);
+ /* A real (non-SVN_ERR_FS_PROP_BASEVALUE_MISMATCH) error. */
+ return svn_error_trace(err);
}
else
/* Running under --server-minor-version? */
diff --git a/subversion/tests/cmdline/authz_tests.py b/subversion/tests/cmdline/authz_tests.py
index 20c833d..5e1952e 100755
--- a/subversion/tests/cmdline/authz_tests.py
+++ b/subversion/tests/cmdline/authz_tests.py
@@ -45,6 +45,7 @@ XFail = svntest.testcase.XFail_deco
Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
+SkipDumpLoadCrossCheck = svntest.testcase.SkipDumpLoadCrossCheck_deco
######################################################################
# Tests
@@ -82,7 +83,7 @@ def authz_open_root(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
None,
- None,
+ [],
mu_path)
#----------------------------------------------------------------------
@@ -118,11 +119,10 @@ def authz_open_directory(sbox):
# Commit the working copy.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None,
- wc_dir)
+ None)
@Skip(svntest.main.is_ra_type_file)
+@SkipDumpLoadCrossCheck()
def broken_authz_file(sbox):
"broken authz files cause errors"
@@ -169,12 +169,12 @@ def authz_read_access(sbox):
fws_empty_folder_url = fws_url + '/empty folder'
if sbox.repo_url.startswith("http"):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
# create some folders with spaces in their names
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'logmsg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'logmsg',
fws_url, fws_empty_folder_url)
write_restrictive_svnserve_conf(sbox.repo_dir)
@@ -191,73 +191,65 @@ def authz_read_access(sbox):
(svntest.main.wc_author + " = r")})
# read a remote file
- svntest.actions.run_and_verify_svn(None, ["This is the file 'iota'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'iota'.\n"],
[], 'cat',
iota_url)
# read a remote file, readably by user specific exception
- svntest.actions.run_and_verify_svn(None, ["This is the file 'chi'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'chi'.\n"],
[], 'cat',
chi_url)
# read a remote file, unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cat',
lambda_url)
# read a remote file, unreadable through recursion: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cat',
alpha_url)
# read a remote file, user specific authorization is ignored because * = rw
- svntest.actions.run_and_verify_svn(None, ["This is the file 'pi'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'pi'.\n"],
[], 'cat',
pi_url)
# open a remote folder(ls)
- svntest.actions.run_and_verify_svn("ls remote root folder",
- ["A/\n", "iota\n"],
+ svntest.actions.run_and_verify_svn(["A/\n", "iota\n"],
[], 'ls',
root_url)
# open a remote folder(ls), unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, svntest.verify.AnyOutput, 'ls',
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, 'ls',
B_url)
# open a remote folder(ls) with spaces, should succeed
- svntest.actions.run_and_verify_svn(None,
- None, [], 'ls',
+ svntest.actions.run_and_verify_svn(None, [], 'ls',
fws_empty_folder_url)
# open a remote folder(ls), unreadable through recursion: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ls',
E_url)
# copy a remote file
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
iota_url, D_url,
'-m', 'logmsg')
# copy a remote file, source is unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
lambda_url, D_url)
# copy a remote folder
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
C_url, D_url,
'-m', 'logmsg')
# copy a remote folder, source is unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
E_url, D_url)
@@ -268,15 +260,13 @@ def authz_read_access(sbox):
# into two operations, a committed copy followed by a committed
# deletion. But the editor drive required to do these atomically
# today is prohibitive.
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv', '-m', 'logmsg',
alpha_url, F_alpha_url)
## copy a remote file, source/target ancestor is readonly
## we fail here due to issue #3242.
- #svntest.actions.run_and_verify_svn(None,
- # None, [],
+ #svntest.actions.run_and_verify_svn(# None, [],
# 'cp', '-m', 'logmsg',
# alpha_url, F_alpha_url)
@@ -291,7 +281,7 @@ def authz_write_access(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
if sbox.repo_url.startswith('http'):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E220004: Access denied.*"
@@ -310,64 +300,55 @@ def authz_write_access(sbox):
D_url = A_url + '/D'
# copy a remote file, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
lambda_url, D_url)
# copy a remote folder, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
E_url, D_url)
# delete a file, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'rm',
'-m', 'logmsg',
iota_url)
# delete a folder, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'rm',
'-m', 'logmsg',
D_url)
# create a folder, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mkdir',
'-m', 'logmsg',
A_url+'/newfolder')
# move a remote file, source is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv',
'-m', 'logmsg',
mu_url, C_url)
# move a remote folder, source is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv',
'-m', 'logmsg',
D_url, C_url)
# move a remote file, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv',
'-m', 'logmsg',
lambda_url, D_url)
# move a remote folder, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv',
'-m', 'logmsg',
B_url, D_url)
@@ -387,14 +368,14 @@ def authz_checkout_test(sbox):
# write an authz file with *= on /
if sbox.repo_url.startswith('http'):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
write_authz_file(sbox, { "/": "* ="})
# checkout a working copy, should fail
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'co', sbox.repo_url, local_dir)
# 2nd part: now enable read access
@@ -409,9 +390,9 @@ def authz_checkout_test(sbox):
expected_wc = svntest.main.greek_state
svntest.actions.run_and_verify_checkout(sbox.repo_url,
- local_dir,
- expected_output,
- expected_wc)
+ local_dir,
+ expected_output,
+ expected_wc)
@Skip(svntest.main.is_ra_type_file)
def authz_checkout_and_update_test(sbox):
@@ -473,9 +454,7 @@ def authz_checkout_and_update_test(sbox):
expected_output,
expected_wc,
expected_status,
- None,
- None, None,
- None, None, 1)
+ [], True)
@Skip(svntest.main.is_ra_type_file)
def authz_partial_export_test(sbox):
@@ -524,7 +503,7 @@ def authz_log_and_tracing_test(sbox):
# write an authz file with *=rw on /
if sbox.repo_url.startswith('http'):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
@@ -538,24 +517,24 @@ def authz_log_and_tracing_test(sbox):
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
svntest.main.file_append(rho_path, 'new appended text for rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'add file rho', sbox.wc_dir)
svntest.main.file_append(rho_path, 'extra change in rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'changed file rho',
sbox.wc_dir)
# copy a remote file
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
rho_path, D_url,
'-m', 'copy rho to readable area')
# now disable read access on the first version of rho, keep the copy in
# /A/D readable.
if sbox.repo_url.startswith('http'):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
@@ -568,8 +547,7 @@ def authz_log_and_tracing_test(sbox):
# changed file in this rev. is not readable anymore, so author and date
# should be hidden, like this:
# r2 | (no author) | (no date) | 1 line
- svntest.actions.run_and_verify_svn(None,
- ".*(no author).*(no date).*|-+\n|\n", [],
+ svntest.actions.run_and_verify_svn(".*(no author).*(no date).*|-+\n|\n", [],
'log', '-r', '2', '--limit', '1',
wc_dir)
@@ -581,20 +559,19 @@ def authz_log_and_tracing_test(sbox):
# if we do the same thing directly on the unreadable file, we get:
# svn: Item is not readable
- svntest.actions.run_and_verify_svn(None, None, expected_err2,
+ svntest.actions.run_and_verify_svn(None, expected_err2,
'log', rho_path)
# while the HEAD rev of the copy is readable in /A/D, its parent in
# /A/D/G is not, so don't spill any info there either.
- svntest.actions.run_and_verify_svn(None,
- ".*(no author).*(no date).*|-+\n|\n", [],
+ svntest.actions.run_and_verify_svn(".*(no author).*(no date).*|-+\n|\n", [],
'log', '-r', '2', '--limit', '1', D_url)
# Test that only author/date are shown for partially visible revisions.
svntest.actions.enable_revprop_changes(sbox.repo_dir)
write_authz_file(sbox, { "/": "* = rw"})
svntest.actions.run_and_verify_svn(
- None, None, [], # message, expected_stdout, expected_stderr
+ None, [], # expected_stdout, expected_stderr
'ps', '--revprop', '-r1', 'foobar', 'foo bar', sbox.repo_url)
svntest.actions.run_and_verify_log_xml(
expected_revprops=[{'svn:author': svntest.main.wc_author, 'svn:date': '',
@@ -610,7 +587,10 @@ def authz_log_and_tracing_test(sbox):
## cat
# now see if we can look at the older version of rho
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+
+ expected_err2 = ".*svn: E195012: Unable to find repository location.*"
+
+ svntest.actions.run_and_verify_svn(None, expected_err2,
'cat', '-r', '2', D_url+'/rho')
if sbox.repo_url.startswith('http'):
@@ -618,19 +598,20 @@ def authz_log_and_tracing_test(sbox):
else:
expected_err2 = ".*svn: E220001: Unreadable path encountered; access denied.*"
- svntest.actions.run_and_verify_svn(None, None, expected_err2,
+ svntest.actions.run_and_verify_svn(None, expected_err2,
'cat', '-r', '2', G_url+'/rho')
## diff
# we shouldn't see the diff of a file in an unreadable path
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'diff', '-r', 'HEAD', G_url+'/rho')
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ # diff treats the unreadable path as indicating an add so no error
+ svntest.actions.run_and_verify_svn(None, [],
'diff', '-r', '2', D_url+'/rho')
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, [],
'diff', '-r', '2:4', D_url+'/rho')
# test whether read access is correctly granted and denied
@@ -644,7 +625,7 @@ def authz_aliases(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
if sbox.repo_url.startswith("http"):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
@@ -658,16 +639,14 @@ def authz_aliases(sbox):
iota_url = root_url + '/iota'
# copy a remote file, target is readonly for jconstant: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'--username', svntest.main.wc_author2,
'-m', 'logmsg',
iota_url, B_url)
# try the same action, but as user jray (alias of jrandom), should work.
- svntest.actions.run_and_verify_svn(None,
- None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
'-m', 'logmsg',
iota_url, B_url)
@@ -691,15 +670,14 @@ def authz_validate(sbox):
"/A/B" : "@undefined_group = rw" })
if sbox.repo_url.startswith("http"):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
elif sbox.repo_url.startswith("svn"):
expected_err = ".*Invalid authz configuration"
else:
expected_err = ".*@undefined_group.*"
# validation of this authz file should fail, so no repo access
- svntest.actions.run_and_verify_svn("ls remote folder",
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ls',
A_url)
@@ -711,15 +689,14 @@ devs2 = @admins, dev2
devs = @devs1, dev3, dev4""" })
if sbox.repo_url.startswith("http"):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
elif sbox.repo_url.startswith("svn"):
expected_err = ".*Invalid authz configuration"
else:
expected_err = ".*Circular dependency.*"
# validation of this authz file should fail, so no repo access
- svntest.actions.run_and_verify_svn("ls remote folder",
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ls',
A_url)
@@ -733,8 +710,7 @@ users = @devs1, @devs2, user1, user2""" })
# validation of this authz file should *not* fail (where formerly,
# it complained about circular dependencies that do not, in fact,
# exist), so this is business as usual.
- svntest.actions.run_and_verify_svn("ls remote folder",
- ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
+ svntest.actions.run_and_verify_svn(['B/\n', 'C/\n', 'D/\n', 'mu\n'],
[],
'ls',
A_url)
@@ -751,9 +727,9 @@ def authz_locking(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
if sbox.repo_url.startswith('http'):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
- expected_err = ".*svn: E170001: Authorization failed.*"
+ expected_err = ".*svn: warning: W170001: Authorization failed.*"
root_url = sbox.repo_url
wc_dir = sbox.wc_dir
@@ -763,15 +739,13 @@ def authz_locking(sbox):
mu_path = os.path.join(wc_dir, 'A', 'mu')
# lock a file url, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'lock',
'-m', 'lock msg',
iota_url)
# lock a file path, target is readonly: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'lock',
'-m', 'lock msg',
iota_path)
@@ -780,8 +754,7 @@ def authz_locking(sbox):
# Get a lock on /A/mu and try to commit it.
# lock a file path, target is writeable: should succeed
- svntest.actions.run_and_verify_svn(None,
- None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'lock',
'-m', 'lock msg',
mu_path)
@@ -795,9 +768,38 @@ def authz_locking(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
[],
- None,
+ [],
mu_path)
+ # Lock two paths one of which fails. First add read access to '/' so
+ # that OPTIONS on common ancestor works.
+ write_authz_file(sbox, {"/": "jrandom = r", "/A": "jrandom = rw"})
+
+ # Two unlocked paths
+ svntest.actions.run_and_verify_info([{'Lock Token' : None}],
+ sbox.ospath('iota'))
+ svntest.actions.run_and_verify_info([{'Lock Token' : None}],
+ sbox.ospath('A/mu'))
+
+ if sbox.repo_url.startswith('http'):
+ expected_err = ".*svn: warning: W160039: Unlock.*[Ff]orbidden.*"
+ else:
+ expected_err = ".*svn: warning: W170001: Authorization failed.*"
+
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'lock',
+ '-m', 'lock msg',
+ mu_path,
+ iota_path)
+
+ # One path locked, one still unlocked
+ svntest.actions.run_and_verify_info([{'Lock Token' : None}],
+ sbox.ospath('iota'))
+ svntest.actions.run_and_verify_info([{'Lock Token' : 'opaquelocktoken:.*'}],
+ sbox.ospath('A/mu'))
+
+
+
# test for issue #2712: if anon-access == read, svnserve should also check
# authz to determine whether a checkout/update is actually allowed for
# anonymous users, and, if not, attempt authentication.
@@ -824,23 +826,23 @@ def authz_svnserve_anon_access_read(sbox):
"/A/D" : "* = r" })
# Perform a checkout of /A/B, expecting to see no errors.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
B_url, B_path)
# Anonymous users should be able to check out /A/D.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
D_url, D_path)
# Now try a switch.
svntest.main.safe_rmtree(D_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', D_url, B_path)
# Check out /A/B with an unknown username, expect error.
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*Authentication error from server: Username not found.*",
'checkout',
'--non-interactive',
@@ -848,12 +850,12 @@ def authz_svnserve_anon_access_read(sbox):
B_url, B_path + '_unsuccessful')
# Check out a second copy of /A/B, make changes for later merge.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
B_url, other_B_path)
other_alpha_path = os.path.join(other_B_path, 'E', 'alpha')
svntest.main.file_append(other_alpha_path, "fish\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'log msg',
other_B_path)
@@ -862,7 +864,7 @@ def authz_svnserve_anon_access_read(sbox):
# authz here, not the semantics of the merge. (Merges had been
# failing in authz, for the reasons summarized in
# http://subversion.tigris.org/issues/show_bug.cgi?id=2712#desc13.)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c', '2',
B_url, B_path)
@@ -980,13 +982,13 @@ def multiple_matches(sbox):
root_url = sbox.repo_url
write_restrictive_svnserve_conf(sbox.repo_dir)
if sbox.repo_url.startswith("http"):
- expected_err = ".*[Ff]orbidden.*"
+ expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
else:
expected_err = ".*svn: E170001: Authorization failed.*"
# Prohibit access and commit fails
write_authz_file(sbox, {'/': 'jrandom ='})
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp', '-m', 'fail copy',
root_url, root_url + '/fail')
@@ -1033,7 +1035,7 @@ def wc_wc_copy_revert(sbox):
expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: E155035: Cannot copy.*excluded by server',
'cp', sbox.ospath('A'), sbox.ospath('A2'))
@@ -1046,17 +1048,17 @@ def wc_wc_copy_revert(sbox):
'! - ? ? ' + sbox.ospath('A2/B/E') + '\n',
])
expected_output.match_all = False
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '--verbose', sbox.ospath('A2'))
# Issue 4025, info SEGV on incomplete working node
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: E145000: .*unrecognized node kind',
'info', sbox.ospath('A2/B/E'))
# Issue 4026, copy assertion on incomplete working node
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: E145001: cannot handle node kind',
'cp', sbox.ospath('A2/B'), sbox.ospath('B3'))
@@ -1065,10 +1067,10 @@ def wc_wc_copy_revert(sbox):
'! - ? ? ' + sbox.ospath('B3/E') + '\n',
])
expected_output.match_all = False
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '--verbose', sbox.ospath('B3'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive',
sbox.ospath('A2'), sbox.ospath('B3'))
@@ -1106,8 +1108,7 @@ def authz_recursive_ls(sbox):
'A/D/gamma',
'iota',
]
- svntest.actions.run_and_verify_svn('recursive ls from /',
- map(lambda x: x + '\n', expected_entries),
+ svntest.actions.run_and_verify_svn(map(lambda x: x + '\n', expected_entries),
[], 'ls', '-R',
sbox.repo_url)
@@ -1132,7 +1133,7 @@ def case_sensitive_authz(sbox):
})
# error messages
- expected_error_for_commit = "Commit failed"
+ expected_error_for_commit = ".*Commit failed.*"
if sbox.repo_url.startswith("http"):
expected_error_for_cat = ".*[Ff]orbidden.*"
@@ -1142,7 +1143,7 @@ def case_sensitive_authz(sbox):
# test the case-sensitivity of the path inside the repo
write_authz_file(sbox, {"/": "jrandom = r",
"/A/mu": "jrandom =", "/a/Mu": "jrandom = rw"})
- svntest.actions.run_and_verify_svn2(None, None,
+ svntest.actions.run_and_verify_svn2(None,
expected_error_for_cat,
1, 'cat', mu_url)
@@ -1175,7 +1176,7 @@ def case_sensitive_authz(sbox):
os.path.basename(sbox.repo_dir) + ":/A/mu": "jrandom =",
mixed_case_repo_dir + ":/A/mu": "jrandom = rw"}
write_authz_file(sbox, {}, sec_mixed_case)
- svntest.actions.run_and_verify_svn2(None, None,
+ svntest.actions.run_and_verify_svn2(None,
expected_error_for_cat,
1, 'cat', mu_url)
@@ -1195,14 +1196,13 @@ def case_sensitive_authz(sbox):
write_authz_file(sbox, {"/": "jrandom = r",
"/A": "jrandom = r", "/A/mu": "jrandom = rw"})
- svntest.actions.run_and_verify_svn2('No error',
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn2(svntest.verify.AnyOutput, [],
0, 'cat', mu_url)
# Commit the file.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
None,
- None,
+ [],
mu_path)
@Skip(svntest.main.is_ra_type_file)
@@ -1221,17 +1221,17 @@ def authz_tree_conflict(sbox):
# And now create an obstruction
sbox.simple_mkdir('A/C')
- expected_output = svntest.wc.State(wc_dir, {})
- expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
- expected_status.tweak('A/C', status='A ', wc_rev='0')
- expected_status.tweak('A', '', status='! ', wc_rev='1')
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/C' : Item(status=' ', treeconflict='C'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/C', status='R ', treeconflict='C')
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
None,
expected_status,
- "Failed to mark '.*C' (server|absent):",
- None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
@Issue(3900)
@@ -1260,9 +1260,9 @@ def wc_delete(sbox):
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
expected_err = ".*svn: E155035: .*excluded by server*"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
- 'rm', sbox.ospath('A/B/E'))
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'rm', sbox.ospath('A/B/E'), '--force')
+ svntest.actions.run_and_verify_svn(None, expected_err,
'rm', sbox.ospath('A'))
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
@@ -1281,9 +1281,9 @@ def wc_commit_error_handling(sbox):
write_authz_file(sbox, {'/' : '* = r', })
# Creating editor fail: unfriendly error
- expected_err = "(svn: E175013: .*orbidden.*)|" + \
+ expected_err = "(svn: E175013: .*[Ff]orbidden.*)|" + \
"(svn: E170001: Authorization failed)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
write_authz_file(sbox, {'/' : '* = rw',
@@ -1294,7 +1294,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing directory '.*Z' is forbidden)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*Z' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/Z')
@@ -1307,7 +1307,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing file '.*zeta' is forbidden)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*zeta' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/zeta')
@@ -1315,9 +1315,9 @@ def wc_commit_error_handling(sbox):
# Allow a generic dav error and the ra_svn specific one that is returned
# on editor->edit_close().
- expected_err = "(svn: E175013: .*orbidden.*)|" + \
+ expected_err = "(svn: E175013: .*[Ff]orbidden.*)|" + \
"(svn: E220004: Access denied)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/D')
@@ -1329,7 +1329,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing file '.*lambda' is forbidden.*)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*lambda' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/B/lambda')
@@ -1340,7 +1340,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing file '.*lambda' is forbidden.*)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*lambda' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/B/lambda')
@@ -1351,7 +1351,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing directory '.*F' is forbidden.*)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*F' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
sbox.simple_revert('A/B/F')
@@ -1361,7 +1361,7 @@ def wc_commit_error_handling(sbox):
expected_err = "(svn: E195023: Changing file '.*mu' is forbidden.*)|" + \
"(svn: E220004: Access denied)|" + \
"(svn: E175013: Access to '.*mu' forbidden)"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'ci', wc_dir, '-m', '')
@@ -1381,15 +1381,15 @@ def upgrade_absent(sbox):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'info', sbox.wc_dir)
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# Relocate to allow finding the repository
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'svn://127.0.0.1/authz_tests-2',
sbox.repo_url, sbox.wc_dir)
@@ -1430,9 +1430,7 @@ def remove_subdir_with_authz_and_tc(sbox):
expected_output,
None,
expected_status,
- None,
- None, None,
- None, None, False,
+ [], False,
wc_dir, '-r', '1')
# Perform some edit operation to introduce a tree conflict
@@ -1447,11 +1445,7 @@ def remove_subdir_with_authz_and_tc(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
None,
- None,
- None,
- None, None,
- None, None, False,
- wc_dir)
+ None)
@SkipUnless(svntest.main.is_ra_type_svn)
def authz_svnserve_groups(sbox):
@@ -1481,37 +1475,34 @@ def authz_svnserve_groups(sbox):
expected_err = ".*svn: E170001: Authorization failed.*"
# read a remote file
- svntest.actions.run_and_verify_svn(None, ["This is the file 'lambda'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'lambda'.\n"],
[], 'cat',
lambda_url)
# read a remote file
- svntest.actions.run_and_verify_svn(None, ["This is the file 'pi'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'pi'.\n"],
[], 'cat',
pi_url)
# read a remote file, unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cat',
alpha_url)
# copy a remote file, source is unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
alpha_url, B_url)
# copy a remote folder
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
'-m', 'logmsg',
F_url, D_url)
# copy a remote folder, source is unreadable: should fail
- svntest.actions.run_and_verify_svn(None,
- None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'cp',
'-m', 'logmsg',
E_url, D_url)
@@ -1527,27 +1518,26 @@ def authz_del_from_subdir(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.repo_url + '/A/mu',
'-m', '')
-@XFail()
@SkipUnless(svntest.main.is_ra_type_dav) # dontdothat is dav only
-@SkipUnless(svntest.main.is_os_windows) # until the buildbots are configured
def log_diff_dontdothat(sbox):
"log --diff on dontdothat"
sbox.build(create_wc = False)
ddt_url = sbox.repo_url.replace('/svn-test-work/', '/ddt-test-work/')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'log', sbox.repo_url,
'-c', 1, '--diff')
# We should expect a PASS or a proper error message instead of
# svn: E175009: XML parsing failed: (403 Forbidden)
- svntest.actions.run_and_verify_svn(None, None, [],
+ expected_err = ".*E175013: Access to '.*authz_tests-28.*' forbidden"
+ svntest.actions.run_and_verify_svn(None, expected_err,
'log', ddt_url,
'-c', 1, '--diff')
@@ -1573,7 +1563,7 @@ def authz_file_external_to_authz(sbox):
svntest.actions.run_and_verify_update(wc_dir,
None, None, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', repo_url + '/A',
repo_url + '/Z',
'-m', 'Add Z')
@@ -1589,6 +1579,88 @@ def authz_file_external_to_authz(sbox):
svntest.actions.run_and_verify_update(wc_dir,
None, None, expected_status)
+@Skip(svntest.main.is_ra_type_file)
+def authz_log_censor_revprops(sbox):
+ "log censors revprops for partially visible revs"
+
+ sbox.build(create_wc = False)
+
+ svntest.actions.enable_revprop_changes(sbox.repo_dir)
+ write_restrictive_svnserve_conf(sbox.repo_dir)
+ write_authz_file(sbox, {"/" : "* = rw"})
+
+ # Add the revision property 's'.
+ svntest.actions.run_and_verify_svn(None, [], 'ps', '--revprop',
+ '-r1', 's', 'secret', sbox.repo_url)
+
+ # With blanket access, both 'svn:author' and 's' are a part of the output.
+ svntest.actions.run_and_verify_log_xml(
+ expected_revprops=[{'svn:author': svntest.main.wc_author, 's': 'secret'}],
+ args=['--with-revprop', 'svn:author', '--with-revprop', 's',
+ '-r1', sbox.repo_url])
+
+ # Make the revision partially visible, but ask for both 'svn:author' and
+ # 's'. The second revision property should be censored out, as we only
+ # allow 'svn:author' and 'svn:date' for partially visible revisions.
+ # This used to fail around trunk@1658379.
+ write_authz_file(sbox, {"/" : "* = rw", "/A/B" : "* = "})
+
+ svntest.actions.run_and_verify_log_xml(
+ expected_revprops=[{'svn:author': svntest.main.wc_author}],
+ args=['--with-revprop', 'svn:author', '--with-revprop', 's',
+ '-r1', sbox.repo_url])
+
+@Skip(svntest.main.is_ra_type_file)
+def remove_access_after_commit(sbox):
+ "remove a subdir with authz file"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.main.write_restrictive_svnserve_conf(sbox.repo_dir)
+ svntest.main.write_authz_file(sbox, { "/" : "*=rw"})
+
+ # Modification in subtree
+ sbox.simple_append('A/B/E/alpha', 'appended\n')
+ sbox.simple_append('A/D/G/rho', 'appended\n')
+ sbox.simple_commit()
+
+ svntest.main.write_authz_file(sbox, { "/" : "*=rw",
+ "/A/B" : "*=",
+ "/A/D" : "*="})
+
+ # Local modification
+ sbox.simple_append('A/D/G/pi', 'appended\n')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B' : Item(status='D '),
+ 'A/D' : Item(status=' ', treeconflict='C'),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak('A/D/G/rho',
+ contents="This is the file 'rho'.\nappended\n")
+ expected_disk.tweak('A/D/G/pi',
+ contents="This is the file 'pi'.\nappended\n")
+ expected_disk.remove('A/B', 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
+ 'A/B/F', 'A/B/lambda')
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+
+ expected_status.tweak('A/D', status='R ',treeconflict='C', )
+ expected_status.tweak('A/D', 'A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau',
+ 'A/D/H', 'A/D/H/omega', 'A/D/H/chi', 'A/D/H/psi',
+ 'A/D/gamma', copied='+', wc_rev='-')
+ expected_status.tweak('A/D/G/pi', status='M ')
+ expected_status.remove('A/B', 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F',
+ 'A/B/lambda')
+
+ # And expect a mixed rev copy
+ expected_status.tweak('A/D/G/rho', status='A ', entry_status=' ')
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ expected_disk,
+ expected_status,
+ [], True)
+
########################################################################
# Run the tests
@@ -1624,6 +1696,8 @@ test_list = [ None,
authz_del_from_subdir,
log_diff_dontdothat,
authz_file_external_to_authz,
+ authz_log_censor_revprops,
+ remove_access_after_commit,
]
serial_only = True
diff --git a/subversion/tests/cmdline/autoprop_tests.py b/subversion/tests/cmdline/autoprop_tests.py
index f27504f..d6a65a2 100755
--- a/subversion/tests/cmdline/autoprop_tests.py
+++ b/subversion/tests/cmdline/autoprop_tests.py
@@ -102,9 +102,7 @@ def autoprops_test(sbox, cmd, cfgenable, clienable, subdir):
# some directories
wc_dir = sbox.wc_dir
- tmp_dir = os.path.join(os.path.abspath(svntest.main.temp_dir), sbox.name)
- if not os.path.isdir(tmp_dir):
- os.makedirs(tmp_dir)
+ tmp_dir = os.path.abspath(sbox.add_wc_path('autoprops'))
config_dir = os.path.join(tmp_dir, 'autoprops_config_' + sbox.name)
repos_url = sbox.repo_url
@@ -320,7 +318,7 @@ def fail_add_mixed_eol_style(sbox):
expected_stderr = "svn: E200009: File '.*" + filename + \
"' has inconsistent newlines" + \
"|" + "svn: E135000: Inconsistent line ending style\n"
- run_and_verify_svn(None, [], expected_stderr,
+ run_and_verify_svn([], expected_stderr,
'add', filepath, *parameters)
expected_status = svntest.wc.State(sbox.wc_dir,
@@ -417,7 +415,7 @@ def inheritable_autoprops_test(sbox, cmd, cfgenable, clienable, subdir,
# some directories
wc_dir = sbox.wc_dir
- tmp_dir = os.path.abspath(svntest.main.temp_dir)
+ tmp_dir = os.path.abspath(sbox.add_wc_path('iautoprops'))
config_dir = os.path.join(tmp_dir, 'autoprops_config_' + sbox.name)
repos_url = sbox.repo_url
@@ -468,7 +466,7 @@ def inheritable_autoprops_test(sbox, cmd, cfgenable, clienable, subdir,
sbox.simple_propset(SVN_PROP_INHERITABLE_AUTOPROPS,
'*.py = svn:mime-type=text/x-python',
'A/D')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Add some ' + SVN_PROP_INHERITABLE_AUTOPROPS +
' properties', wc_dir)
@@ -648,7 +646,7 @@ def svn_prop_inheritable_autoprops_add_versioned_target(sbox):
#
# Then revert the previous additions and add again, only the
# svn:auto-props should be applied.
- tmp_dir = os.path.abspath(svntest.main.temp_dir)
+ tmp_dir = os.path.abspath(sbox.add_wc_path('temp'))
config_dir = os.path.join(tmp_dir,
'autoprops_config_disabled_' + sbox.name)
create_inherited_autoprops_config(config_dir, False)
@@ -676,7 +674,7 @@ def svn_prop_inheritable_autoprops_propset_file_target(sbox):
sbox.build()
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*Cannot set '" + SVN_PROP_INHERITABLE_AUTOPROPS + "' on a file.*",
'ps', SVN_PROP_INHERITABLE_AUTOPROPS, '*.c=svn:eol-style=native',
sbox.ospath('iota'))
@@ -697,8 +695,7 @@ def svn_prop_inheritable_autoprops_unversioned_subtrees_versioned_target(sbox):
'*.c=svn:eol-style=CR', sbox.ospath('A/B'))
svntest.main.run_svn(None, 'ps', SVN_PROP_INHERITABLE_AUTOPROPS,
'*.c=svn:eol-style=native', sbox.ospath('A/D'))
- svntest.main.run_svn(None, 'ci', '-m', 'Add inheritable autoprops',
- sbox.wc_dir)
+ sbox.simple_commit(message='Add inheritable autoprops')
# Create two subtrees, each with one new file.
os.mkdir(Z_path)
@@ -721,9 +718,9 @@ def svn_prop_inheritable_autoprops_unversioned_subtrees_versioned_target(sbox):
os.chdir(saved_wd)
# Check the resulting autoprops.
- svntest.actions.run_and_verify_svn(None, 'native\n', [],
+ svntest.actions.run_and_verify_svn('native\n', [],
'pg', 'svn:eol-style', foo_path)
- svntest.actions.run_and_verify_svn(None, 'CR\n', [],
+ svntest.actions.run_and_verify_svn('CR\n', [],
'pg', 'svn:eol-style', bar_path)
########################################################################
diff --git a/subversion/tests/cmdline/basic_tests.py b/subversion/tests/cmdline/basic_tests.py
index c51d80a..58f7554 100755
--- a/subversion/tests/cmdline/basic_tests.py
+++ b/subversion/tests/cmdline/basic_tests.py
@@ -60,8 +60,7 @@ def basic_checkout(sbox):
# Checkout of a different URL into a working copy fails
A_url = sbox.repo_url + '/A'
- svntest.actions.run_and_verify_svn("No error where some expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
# "Obstructed update",
'co', A_url,
wc_dir)
@@ -73,7 +72,7 @@ def basic_checkout(sbox):
os.remove(lambda_path)
G_path = sbox.ospath('A/D/G')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', G_path)
expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
expected_output.tweak('A/mu', status='M ')
@@ -88,7 +87,7 @@ def basic_checkout(sbox):
# Repeat checkout of original URL into working copy with modifications
url = sbox.repo_url
- svntest.actions.run_and_verify_svn("Repeat checkout failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', url,
wc_dir)
@@ -141,9 +140,7 @@ def basic_commit(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -177,7 +174,7 @@ def basic_update(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = wc.State(wc_backup, {
@@ -204,17 +201,30 @@ def basic_update(sbox):
expected_status)
# Unversioned paths, those that are not immediate children of a versioned
- # path, are skipped and do not raise an error
+ # path, are skipped and do raise an error if they are the only targets
xx_path = sbox.ospath('xx/xx')
- exit_code, out, err = svntest.actions.run_and_verify_svn(
- "update xx/xx",
- ["Skipped '"+xx_path+"'\n",
- ] + svntest.main.summary_of_conflicts(skipped_paths=1),
- [], 'update', xx_path)
- exit_code, out, err = svntest.actions.run_and_verify_svn(
- "update xx/xx", [], [],
+ expected_err = "svn: E155007: "
+ svntest.actions.run_and_verify_svn(
+ ["Skipped '"+xx_path+"'\n", ],
+ expected_err,
+ 'update', xx_path)
+ svntest.actions.run_and_verify_svn(
+ [], expected_err,
'update', '--quiet', xx_path)
+ # Unversioned paths, that are not the only targets of the command are
+ # skipped without an error
+ svntest.actions.run_and_verify_svn(
+ ["Updating '"+mu_path+"':\n",
+ "At revision 2.\n",
+ "Skipped '"+xx_path+"'\n",
+ "Summary of updates:\n",
+ " Updated '"+mu_path+"' to r2.\n"
+ ] + svntest.main.summary_of_conflicts(skipped_paths=1),
+ [], 'update', mu_path, xx_path)
+ svntest.actions.run_and_verify_svn(
+ [], [], 'update', '--quiet', mu_path, xx_path)
+
#----------------------------------------------------------------------
def basic_mkdir_url(sbox):
"basic mkdir URL"
@@ -224,8 +234,8 @@ def basic_mkdir_url(sbox):
Y_url = sbox.repo_url + '/Y'
Y_Z_url = sbox.repo_url + '/Y/Z'
- svntest.actions.run_and_verify_svn("mkdir URL URL/subdir",
- ["\n", "Committed revision 2.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
'mkdir', '-m', 'log_msg', Y_url, Y_Z_url)
expected_output = wc.State(sbox.wc_dir, {
@@ -262,19 +272,18 @@ def basic_mkdir_url_with_parents(sbox):
U_url = sbox.repo_url + '/U'
U_V_url = sbox.repo_url + '/U/V'
U_V_W_url = sbox.repo_url + '/U/V/W'
- svntest.actions.run_and_verify_svn("erroneous mkdir sans --parents",
- [],
+ svntest.actions.run_and_verify_svn(None,
".*Try 'svn mkdir --parents' instead.*",
'mkdir', '-m', 'log_msg',
X_Y_Z_url, X_Y_Z2_url, X_T_C_url, U_V_W_url)
- svntest.actions.run_and_verify_svn("mkdir",
- ["\n", "Committed revision 2.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
'mkdir', '-m', 'log_msg',
X_url, U_url)
- svntest.actions.run_and_verify_svn("mkdir --parents",
- ["\n", "Committed revision 3.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 3.\n"], [],
'mkdir', '-m', 'log_msg', '--parents',
X_Y_Z_url, X_Y_Z2_url, X_T_C_url, U_V_W_url)
@@ -328,11 +337,11 @@ def basic_mkdir_wc_with_parents(sbox):
Y_Z_path = sbox.ospath('Y/Z')
- svntest.actions.run_and_verify_svn("erroneous mkdir dir/subdir", [],
+ svntest.actions.run_and_verify_svn([],
".*Try 'svn mkdir --parents' instead.*",
'mkdir', Y_Z_path)
- svntest.actions.run_and_verify_svn("mkdir dir/subdir", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '--parents', Y_Z_path)
# Verify the WC status, because there was a regression in which parts of
@@ -395,8 +404,7 @@ def basic_commit_corruption(sbox):
# This commit should fail due to text base corruption.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
None, # expected_status,
- "svn: E200014: Checksum",
- wc_dir)
+ "svn: E200014: Checksum")
# Restore the uncorrupted text base.
os.chmod(tb_dir_path, 0777)
@@ -408,7 +416,7 @@ def basic_commit_corruption(sbox):
# This commit should succeed.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
def basic_update_corruption(sbox):
@@ -433,7 +441,7 @@ def basic_update_corruption(sbox):
# Make the "other" working copy
other_wc = sbox.add_wc_path('other')
- svntest.actions.run_and_verify_svn("Checkout to wc2", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', sbox.repo_url, other_wc)
# Make a local mod to mu
@@ -452,7 +460,7 @@ def basic_update_corruption(sbox):
# This commit should succeed.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the other_wc.
expected_output = wc.State(other_wc, {
@@ -488,7 +496,7 @@ def basic_update_corruption(sbox):
fail_output,
expected_disk,
fail_status,
- "svn: E155017: Checksum", other_wc)
+ "svn: E155017: Checksum")
# Restore the uncorrupted text base.
os.chmod(tb_dir_path, 0777)
@@ -545,7 +553,7 @@ def basic_merging_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir)
# Make a backup copy of the working copy
@@ -571,7 +579,7 @@ def basic_merging_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir)
# Make local mods to wc_backup by recreating mu and rho
@@ -652,7 +660,7 @@ def basic_conflict(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = wc.State(wc_backup, {
@@ -666,6 +674,7 @@ def basic_conflict(sbox):
contents="\n".join(["This is the file 'mu'.",
"<<<<<<< .mine",
"Conflicting appended text for mu",
+ "||||||| .r1",
"=======",
"Original appended text for mu",
">>>>>>> .r2",
@@ -674,6 +683,7 @@ def basic_conflict(sbox):
contents="\n".join(["This is the file 'rho'.",
"<<<<<<< .mine",
"Conflicting appended text for rho",
+ "||||||| .r1",
"=======",
"Original appended text for rho",
">>>>>>> .r2",
@@ -694,9 +704,7 @@ def basic_conflict(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files)
+ extra_files=extra_files)
# verify that the extra_files list is now empty.
if len(extra_files) != 0:
@@ -753,7 +761,7 @@ def basic_cleanup(sbox):
svntest.main.safe_rmtree(tmp_path)
# Run cleanup (### todo: cleanup doesn't currently print anything)
- svntest.actions.run_and_verify_svn("Cleanup command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cleanup', wc_dir)
# Verify unlocked status.
@@ -781,12 +789,12 @@ def basic_revert(sbox):
svntest.main.file_append(rho_path, "Added some text to 'rho'.\n")
svntest.main.file_append(zeta_path, "Added some text to 'zeta'.\n")
- svntest.actions.run_and_verify_svn("Add command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', zeta_path)
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
gamma_path)
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
iota_path)
@@ -802,19 +810,19 @@ def basic_revert(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_output)
# Run revert (### todo: revert doesn't currently print anything)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', beta_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', gamma_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', iota_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', rho_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', zeta_path)
# Verify unmodified status.
@@ -846,7 +854,7 @@ def basic_revert(sbox):
# Finally, check that reverted file is not readonly
os.remove(beta_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', beta_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', beta_path)
if not (open(beta_path, 'r+')):
raise svntest.Failure
@@ -854,7 +862,7 @@ def basic_revert(sbox):
# removed, can be reverted.
X_path = sbox.ospath('X')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', X_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', X_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({
@@ -863,7 +871,7 @@ def basic_revert(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
svntest.main.safe_rmtree(X_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', X_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', X_path)
expected_status.remove('X')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -875,7 +883,7 @@ def basic_revert(sbox):
### Most of the rest of this test is ineffective, due to the
### problems described in issue #1611.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', E_path)
svntest.main.safe_rmtree(E_path)
expected_status.tweak('A/B/E', status='D ')
expected_status.tweak('A/B/E', wc_rev='?')
@@ -916,7 +924,7 @@ def basic_revert(sbox):
# try updating instead."
#
# ...but due to test suite lossage, it'll still look like success.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', E_path)
### FIXME: Again, the problem described in issue #1611 bites us here.
#
@@ -956,7 +964,7 @@ def basic_switch(sbox):
# First, try the switch without the --ignore-ancestry flag,
# expecting failure.
expected_error = "svn: E195012: .*no common ancestry.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'switch', gamma_url, iota_path)
# Now ignore ancestry so we can ge through this switch.
@@ -964,7 +972,7 @@ def basic_switch(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
### Switch the directory `A/D/H' to `A/D/G'.
@@ -1016,7 +1024,7 @@ def basic_switch(sbox):
# First, try the switch without the --ignore-ancestry flag,
# expecting failure.
expected_error = "svn: E195012: .*no common ancestry.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'switch', ADG_url, ADH_path)
# Do the switch and check the results in three ways.
@@ -1024,7 +1032,7 @@ def basic_switch(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
#----------------------------------------------------------------------
@@ -1108,31 +1116,31 @@ def basic_delete(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_output)
# 'svn rm' that should fail
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', chi_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', chi_parent_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', rho_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', rho_parent_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', F_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', F_parent_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', sigma_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', sigma_parent_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', X_path)
# check status has not changed
@@ -1140,22 +1148,22 @@ def basic_delete(sbox):
# 'svn rm' that should work
E_path = sbox.ospath('A/B/E')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', E_path)
# 'svn rm --force' that should work
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--force',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force',
chi_parent_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', rho_parent_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', F_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', sigma_parent_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', X_path)
# Deleting an unchanged copy shouldn't error.
@@ -1167,18 +1175,18 @@ def basic_delete(sbox):
# Deleting already removed from wc versioned item with --force
iota_path = sbox.ospath('iota')
os.remove(iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', iota_path)
# and without --force
gamma_path = sbox.ospath('A/D/gamma')
os.remove(gamma_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', gamma_path)
# Deleting already scheduled for deletion doesn't require --force
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', gamma_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', E_path)
# check status
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1204,7 +1212,7 @@ def basic_delete(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# issue 687 delete directory with uncommitted directory child
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', Y_parent_path)
expected_status.tweak('A/D', status='D ')
@@ -1237,21 +1245,21 @@ def basic_delete(sbox):
# Deleting unversioned file explicitly
foo_path = sbox.ospath('foo')
svntest.main.file_append(foo_path, 'unversioned foo')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force', foo_path)
verify_file_deleted("Failed to remove unversioned file foo", foo_path)
# At one stage deleting a URL dumped core
iota_URL = sbox.repo_url + '/iota'
- svntest.actions.run_and_verify_svn(None,
- ["\n", "Committed revision 2.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
'rm', '-m', 'delete iota URL',
iota_URL)
# Issue 4074, deleting a root url SEGV.
expected_error = 'svn: E170000: .*not within a repository'
- svntest.actions.run_and_verify_svn(None, [], expected_error,
+ svntest.actions.run_and_verify_svn([], expected_error,
'rm', sbox.repo_url,
'--message', 'delete root')
@@ -1265,8 +1273,7 @@ def basic_checkout_deleted(sbox):
# Delete A/D and commit.
D_path = sbox.ospath('A/D')
- svntest.actions.run_and_verify_svn("error scheduling A/D for deletion",
- None, [], 'rm', '--force', D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force', D_path)
expected_output = wc.State(wc_dir, {
'A/D' : Item(verb='Deleting'),
@@ -1278,14 +1285,12 @@ def basic_checkout_deleted(sbox):
'A/D/gamma')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Now try to checkout revision 1 of A/D.
url = sbox.repo_url + '/A/D'
wc2 = sbox.ospath('new_D')
- svntest.actions.run_and_verify_svn("error checking out r1 of A/D",
- None, [], 'co', '-r', '1',
+ svntest.actions.run_and_verify_svn(None, [], 'co', '-r', '1',
url + "@1", wc2)
#----------------------------------------------------------------------
@@ -1309,7 +1314,7 @@ def basic_node_kind_change(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Try and fail to create a directory (file scheduled for deletion)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', gamma_path)
# Status is replaced
expected_status.tweak('A/D/gamma', status='R ')
@@ -1322,23 +1327,21 @@ def basic_node_kind_change(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/gamma', status=' ', wc_rev='2')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Try and fail to create a directory (file deleted)
- svntest.actions.run_and_verify_svn(None,
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'mkdir', gamma_path)
# Status is unchanged
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Update to finally get rid of file
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# mkdir should succeed
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', gamma_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', gamma_path)
expected_status.tweak(wc_rev=2)
expected_status.add({
@@ -1362,7 +1365,7 @@ def basic_import(sbox):
# import new files into repository
url = sbox.repo_url + "/dirA/dirB/new_file"
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- 'Cannot change node kind', None, [], 'import',
+ None, [], 'import',
'-m', 'Log message for new import', new_path, url)
lastline = output.pop().strip()
@@ -1402,8 +1405,7 @@ def basic_import(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ [], True)
#----------------------------------------------------------------------
@@ -1417,7 +1419,7 @@ def basic_cat(sbox):
# Get repository text even if wc is modified
svntest.main.file_append(mu_path, "some text")
- svntest.actions.run_and_verify_svn(None, ["This is the file 'mu'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'mu'.\n"],
[], 'cat',
###TODO is user/pass really necessary?
mu_path)
@@ -1436,33 +1438,27 @@ def basic_ls(sbox):
cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn("ls implicit current directory",
- ["A/\n", "iota\n"],
+ svntest.actions.run_and_verify_svn(["A/\n", "iota\n"],
[], 'ls')
os.chdir(cwd)
- svntest.actions.run_and_verify_svn('ls the root of working copy',
- ['A/\n', 'iota\n'],
+ svntest.actions.run_and_verify_svn(['A/\n', 'iota\n'],
[], 'ls',
wc_dir)
- svntest.actions.run_and_verify_svn('ls a working copy directory',
- ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
+ svntest.actions.run_and_verify_svn(['B/\n', 'C/\n', 'D/\n', 'mu\n'],
[], 'ls',
sbox.ospath('A'))
- svntest.actions.run_and_verify_svn('ls working copy directory with -r BASE',
- ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
+ svntest.actions.run_and_verify_svn(['B/\n', 'C/\n', 'D/\n', 'mu\n'],
[], 'ls', '-r', 'BASE',
sbox.ospath('A'))
- svntest.actions.run_and_verify_svn('ls a single file',
- ['mu\n'],
+ svntest.actions.run_and_verify_svn(['mu\n'],
[], 'ls',
sbox.ospath('A/mu'))
- svntest.actions.run_and_verify_svn('recursive ls',
- ['E/\n', 'E/alpha\n', 'E/beta\n', 'F/\n',
+ svntest.actions.run_and_verify_svn(['E/\n', 'E/alpha\n', 'E/beta\n', 'F/\n',
'lambda\n' ], [], 'ls', '-R',
sbox.ospath('A/B'))
@@ -1497,11 +1493,11 @@ def nonexistent_repository(sbox):
# the root directory, the test could fail, and that's just too bad :-).
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, svntest.verify.AnyOutput,
+ None, svntest.verify.AnyOutput,
'log', 'file:///nonexistent_path')
for line in errput:
- if re.match(".*Unable to open an ra_local session to URL.*", line):
+ if re.match(".*Unable to connect to a repository at URL.*", line):
return
# Else never matched the expected error output, so the test failed.
@@ -1525,18 +1521,18 @@ def basic_auth_cache(sbox):
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
# Failed with "not locked" error on missing directory
svntest.main.safe_rmtree(sbox.ospath('A/B/E'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'status', '-u',
sbox.ospath('A/B'))
# Failed with "already locked" error on new dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
repo_url + '/A/B/E',
sbox.ospath('A/D/G'))
@@ -1565,7 +1561,7 @@ def basic_add_ignores(sbox):
open(foo_o_path, 'w')
exit_code, output, err = svntest.actions.run_and_verify_svn(
- "No output where some expected", svntest.verify.AnyOutput, [],
+ svntest.verify.AnyOutput, [],
'add', dir_path)
for line in output:
@@ -1589,11 +1585,11 @@ def basic_add_local_ignores(sbox):
dir_path = sbox.ospath('dir')
file_path = os.path.join(dir_path, 'app.lock')
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'mkdir', dir_path)
svntest.main.run_svn(None, 'propset', 'svn:ignore', '*.lock', dir_path)
open(file_path, 'w')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'add', '--force', dir_path)
#----------------------------------------------------------------------
@@ -1618,7 +1614,7 @@ def basic_add_no_ignores(sbox):
open(foo_rej_path, 'w')
exit_code, output, err = svntest.actions.run_and_verify_svn(
- "No output where some expected", svntest.verify.AnyOutput, [],
+ svntest.verify.AnyOutput, [],
'add', '--no-ignore', dir_path)
for line in output:
@@ -1653,7 +1649,7 @@ def basic_add_parents(sbox):
o.close()
# Add the file, with it's parents
- svntest.actions.run_and_verify_svn(None, None, [], 'add', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'add', '--parents',
zeta_path)
# Build expected state
@@ -1675,14 +1671,12 @@ def basic_add_parents(sbox):
# Commit and verify
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', X_path, '--keep-local')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', '--parents', zeta_path)
#----------------------------------------------------------------------
@@ -1696,8 +1690,7 @@ def uri_syntax(sbox):
url = sbox.repo_url
scheme = url[:url.find(":")]
url = scheme + "://some_nonexistent_host_with_no_trailing_slash"
- svntest.actions.run_and_verify_svn("No error where one expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'co', url, local_dir)
# Different RA layers give different errors for failed checkouts;
@@ -1793,15 +1786,15 @@ def basic_peg_revision(sbox):
# Without the trailing "@", expect failure.
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, None, ".*Syntax error parsing peg revision 'abc'", 'cat', wc_file)
+ None, ".*Syntax error parsing peg revision 'abc'", 'cat', wc_file)
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, None, ".*Syntax error parsing peg revision 'abc'", 'cat', url)
+ None, ".*Syntax error parsing peg revision 'abc'", 'cat', url)
# With the trailing "@", expect success.
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, ["xyz\n"], [], 'cat', wc_file + '@')
+ ["xyz\n"], [], 'cat', wc_file + '@')
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, ["xyz\n"], [], 'cat', url + '@')
+ ["xyz\n"], [], 'cat', url + '@')
# Test with leading @ character in filename.
filename = '@abc'
@@ -1810,23 +1803,23 @@ def basic_peg_revision(sbox):
svntest.main.file_append(wc_file, 'xyz\n')
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, None, [], 'add', wc_file + '@')
+ None, [], 'add', wc_file + '@')
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, None, [], 'ci', '-m', 'secret log msg', wc_file + '@')
+ None, [], 'ci', '-m', 'secret log msg', wc_file + '@')
# With a leading "@" which isn't escaped, expect failure.
# Note that we just test with filename starting with '@', because
# wc_file + '@' + filename is a different situation where svn
# will try to parse filename as a peg revision.
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, None, ".*'%s' is just a peg revision.*" % filename,
+ None, ".*'%s' is just a peg revision.*" % filename,
'cat', filename)
# With a leading "@" which is escaped, expect success.
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, ["xyz\n"], [], 'cat', wc_file + '@')
+ ["xyz\n"], [], 'cat', wc_file + '@')
exit_code, output, errlines = svntest.actions.run_and_verify_svn(
- None, ["xyz\n"], [], 'cat', repos_dir + '/' + filename + '@')
+ ["xyz\n"], [], 'cat', repos_dir + '/' + filename + '@')
def info_nonhead(sbox):
"info on file not existing in HEAD"
@@ -1838,7 +1831,7 @@ def info_nonhead(sbox):
furl = repo_url + "/iota"
# Remove iota and commit.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"delete", fname)
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Deleting'),
@@ -1847,9 +1840,7 @@ def info_nonhead(sbox):
expected_status.remove("iota")
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Get info for old iota at r1.
expected_infos = [
{ 'URL' : '.*' },
@@ -1868,8 +1859,7 @@ def ls_nonhead(sbox):
# Delete A/D/rho and commit.
G_path = sbox.ospath('A/D/G')
- svntest.actions.run_and_verify_svn("error scheduling A/D/G for deletion",
- None, [], 'rm', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', G_path)
expected_output = wc.State(wc_dir, {
'A/D/G' : Item(verb='Deleting'),
@@ -1879,12 +1869,11 @@ def ls_nonhead(sbox):
expected_status.remove('A/D/G', 'A/D/G/rho', 'A/D/G/pi', 'A/D/G/tau',)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Check that we can list a file in A/D/G at revision 1.
rho_url = sbox.repo_url + "/A/D/G/rho"
- svntest.actions.run_and_verify_svn(None, '.* rho\n', [],
+ svntest.actions.run_and_verify_svn('.* rho\n', [],
'ls', '--verbose', rho_url + '@1')
@@ -1900,12 +1889,10 @@ def cat_added_PREV(sbox):
# Create and add a file.
svntest.main.file_append(f_path, 'new text')
- svntest.actions.run_and_verify_svn("adding file",
- None, [], 'add', f_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', f_path)
# Cat'ing the previous version should fail.
- svntest.actions.run_and_verify_svn("cat PREV version of file",
- None, ".*has no committed revision.*",
+ svntest.actions.run_and_verify_svn(None, ".*has no committed revision.*",
'cat', '-rPREV', f_path)
# Issue #2612.
@@ -1916,8 +1903,7 @@ def ls_space_in_repo_name(sbox):
sbox.build(name = "repo with spaces")
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn('ls the root of the repository',
- ['A/\n', 'iota\n'],
+ svntest.actions.run_and_verify_svn(['A/\n', 'iota\n'],
[], 'ls',
sbox.repo_url)
@@ -1931,11 +1917,11 @@ def delete_keep_local(sbox):
C_path = sbox.ospath('A/C')
# Remove file iota
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--keep-local',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--keep-local',
iota_path)
# Remove directory 'A/C'
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--keep-local',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--keep-local',
C_path)
# Commit changes
@@ -1950,9 +1936,7 @@ def delete_keep_local(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Update working copy to check disk state still greek tree
expected_disk = svntest.main.greek_state.copy()
@@ -1972,31 +1956,72 @@ def delete_keep_local_twice(sbox):
dir = sbox.ospath('dir')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', dir)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--keep-local', dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--keep-local', dir)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--keep-local', dir)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--keep-local', dir)
if not os.path.isdir(dir):
logger.warn('Directory was really deleted')
raise svntest.Failure
-def windows_paths_in_repos(sbox):
+@XFail(svntest.main.is_mod_dav_url_quoting_broken)
+def special_paths_in_repos(sbox):
"use folders with names like 'c:hi'"
sbox.build(create_wc = False)
+ test_file_source = os.path.join(sbox.repo_dir, 'format')
repo_url = sbox.repo_url
- chi_url = sbox.repo_url + '/c:hi'
+ test_urls = [ sbox.repo_url + '/c:hi',
+ sbox.repo_url + '/C:',
+ sbox.repo_url + '/C&',
+ sbox.repo_url + '/C<',
+ sbox.repo_url + '/C# hi',
+ sbox.repo_url + '/C?',
+ sbox.repo_url + '/C+',
+ sbox.repo_url + '/C%']
- # do some manipulations on a folder containing a windows drive name.
- svntest.actions.run_and_verify_svn(None, None, [],
- 'mkdir', '-m', 'log_msg',
- chi_url)
+ # On Windows Apache HTTPD breaks '\' for us :(
+ if not (svntest.main.is_os_windows() and
+ svntest.main.is_ra_type_dav()):
+ test_urls += [ sbox.repo_url + '/C\\ri' ]
+
+ for test_url in test_urls:
+ test_file_url = test_url + '/' + test_url[test_url.rindex('/')+1:]
+
+ # do some manipulations on a folder which problematic names
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ test_url)
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-m', 'log_msg',
+ 'put', test_file_source,
+ test_file_url)
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ 'propset', '-m', 'log_msg',
+ 'propname', 'propvalue', test_url)
+
+ svntest.actions.run_and_verify_svn('propvalue', [],
+ 'propget', 'propname', test_url)
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ 'propset', '-m', 'log_msg',
+ 'propname', 'propvalue', test_file_url)
+
+ svntest.actions.run_and_verify_svn('propvalue', [],
+ 'propget', 'propname', test_file_url)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'rm', '-m', 'log_msg',
+ test_file_url)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'rm', '-m', 'log_msg',
+ test_url)
- svntest.actions.run_and_verify_svn(None, None, [],
- 'rm', '-m', 'log_msg',
- chi_url)
def basic_rm_urls_one_repo(sbox):
"remotely remove directories from one repository"
@@ -2008,7 +2033,7 @@ def basic_rm_urls_one_repo(sbox):
# Test 1: remotely delete one directory
E_url = repo_url + '/A/B/E'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '-m', 'log_msg',
E_url)
@@ -2031,7 +2056,7 @@ def basic_rm_urls_one_repo(sbox):
F_url = repo_url + '/A/B/F'
C_url = repo_url + '/A/C'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '-m', 'log_msg',
F_url, C_url)
@@ -2068,8 +2093,7 @@ def basic_rm_urls_multi_repos(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path("other")
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 1)
other_wc_dir = sbox.add_wc_path("other")
- svntest.actions.run_and_verify_svn("Unexpected error during co",
- svntest.verify.AnyOutput, [], "co",
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], "co",
other_repo_url,
other_wc_dir)
@@ -2079,7 +2103,7 @@ def basic_rm_urls_multi_repos(sbox):
F2_url = other_repo_url + '/A/B/F'
C2_url = other_repo_url + '/A/C'
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '-m', 'log_msg',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '-m', 'log_msg',
F_url, C_url, F2_url, C2_url)
# Check that the two rm's to each of the repositories were handled in one
@@ -2167,7 +2191,7 @@ def automatic_conflict_resolution(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = wc.State(wc_backup, {
@@ -2184,6 +2208,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'lambda'.",
"<<<<<<< .mine",
"Conflicting appended text for lambda",
+ "||||||| .r1",
"=======",
"Original appended text for lambda",
">>>>>>> .r2",
@@ -2192,6 +2217,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'mu'.",
"<<<<<<< .mine",
"Conflicting appended text for mu",
+ "||||||| .r1",
"=======",
"Original appended text for mu",
">>>>>>> .r2",
@@ -2200,6 +2226,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'rho'.",
"<<<<<<< .mine",
"Conflicting appended text for rho",
+ "||||||| .r1",
"=======",
"Original appended text for rho",
">>>>>>> .r2",
@@ -2208,6 +2235,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'tau'.",
"<<<<<<< .mine",
"Conflicting appended text for tau",
+ "||||||| .r1",
"=======",
"Original appended text for tau",
">>>>>>> .r2",
@@ -2216,6 +2244,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'omega'.",
"<<<<<<< .mine",
"Conflicting appended text for omega",
+ "||||||| .r1",
"=======",
"Original appended text for omega",
">>>>>>> .r2",
@@ -2241,66 +2270,49 @@ def automatic_conflict_resolution(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files)
-
- # verify that the extra_files list is now empty.
- if len(extra_files) != 0:
- # Because we want to be a well-behaved test, we silently raise if
- # the test fails. However, these two print statements would
- # probably reveal the cause for the failure, if they were
- # uncommented:
- #
- # logger.warn("Not all extra reject files have been accounted for:")
- # logger.warn(extra_files)
- ### we should raise a less generic error here. which?
- raise svntest.Failure
+ extra_files=extra_files)
# So now lambda, mu and rho are all in a "conflicted" state. Run 'svn
# resolve' with the respective "--accept[mine|orig|repo]" flag.
# But first, check --accept actions resolved does not accept.
- svntest.actions.run_and_verify_svn(None,
- # stdout, stderr
+ svntest.actions.run_and_verify_svn(# stdout, stderr
None,
".*invalid 'accept' ARG",
'resolve', '--accept=postpone')
- svntest.actions.run_and_verify_svn(None,
- # stdout, stderr
+ svntest.actions.run_and_verify_svn(# stdout, stderr
None,
".*invalid 'accept' ARG",
'resolve', '--accept=edit',
'--force-interactive')
- svntest.actions.run_and_verify_svn(None,
- # stdout, stderr
+ svntest.actions.run_and_verify_svn(# stdout, stderr
None,
".*invalid 'accept' ARG",
'resolve', '--accept=launch',
'--force-interactive')
# Run 'svn resolved --accept=NOPE. Using omega for the test.
- svntest.actions.run_and_verify_svn("Resolve command", None,
+ svntest.actions.run_and_verify_svn(None,
".*NOPE' is not a valid --accept value",
'resolve',
'--accept=NOPE',
omega_path_backup)
# Resolve lambda, mu, and rho with different --accept options.
- svntest.actions.run_and_verify_svn("Resolve command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve', '--accept=base',
lambda_path_backup)
- svntest.actions.run_and_verify_svn("Resolve command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-full',
mu_path_backup)
- svntest.actions.run_and_verify_svn("Resolve command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=theirs-full',
rho_path_backup)
fp = open(tau_path_backup, 'w')
fp.write("Resolution text for 'tau'.\n")
fp.close()
- svntest.actions.run_and_verify_svn("Resolve command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=working',
tau_path_backup)
@@ -2318,6 +2330,7 @@ def automatic_conflict_resolution(sbox):
contents="\n".join(["This is the file 'omega'.",
"<<<<<<< .mine",
"Conflicting appended text for omega",
+ "||||||| .r1",
"=======",
"Original appended text for omega",
">>>>>>> .r2",
@@ -2345,9 +2358,7 @@ def automatic_conflict_resolution(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files)
+ extra_files=extra_files)
def info_nonexisting_file(sbox):
"get info on a file not in the repo"
@@ -2390,8 +2401,7 @@ def basic_relative_url_using_current_dir(sbox):
orig_dir = os.getcwd()
os.chdir(sbox.wc_dir)
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [],
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '^/iota')
os.chdir(orig_dir)
@@ -2423,8 +2433,7 @@ def basic_relative_url_using_other_targets(sbox):
" 3 jrandom New contents for mu\n",
]
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [], 'blame',
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [], 'blame',
'^/iota', mu_url)
def basic_relative_url_multi_repo(sbox):
@@ -2438,8 +2447,7 @@ def basic_relative_url_multi_repo(sbox):
repo_dir2, repo_url2 = sbox.add_repo_path("other")
svntest.main.copy_repos(repo_dir1, repo_dir2, 1, 1)
wc_dir2 = sbox.add_wc_path("other")
- svntest.actions.run_and_verify_svn("Unexpected error during co",
- svntest.verify.AnyOutput, [], "co",
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], "co",
repo_url2,
wc_dir2)
@@ -2447,7 +2455,7 @@ def basic_relative_url_multi_repo(sbox):
iota_url_repo1 = repo_url1 + '/iota'
iota_url_repo2 = repo_url2 + '/iota'
- exit_code, output, error = svntest.actions.run_and_verify_svn(None, [],
+ exit_code, output, error = svntest.actions.run_and_verify_svn([],
svntest.verify.AnyOutput, 'blame',
'^/A/mu', iota_url_repo1, iota_url_repo2)
@@ -2466,12 +2474,10 @@ def basic_relative_url_non_canonical(sbox):
"iota\n"
]
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [], 'ls',
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [], 'ls',
'^/A/', iota_url)
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [], 'ls',
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [], 'ls',
'^//A/', iota_url)
def basic_relative_url_with_peg_revisions(sbox):
@@ -2506,13 +2512,11 @@ def basic_relative_url_with_peg_revisions(sbox):
]
# Canonical version with peg revision
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [], 'ls', '-r3',
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [], 'ls', '-r3',
'^/A/@3', iota_url)
# Non-canonical version with peg revision
- exit_code, output, error = svntest.actions.run_and_verify_svn(None,
- expected_output, [], 'ls', '-r3',
+ exit_code, output, error = svntest.actions.run_and_verify_svn(expected_output, [], 'ls', '-r3',
'^//A/@3', iota_url)
@@ -2578,7 +2582,7 @@ def basic_add_svn_format_file(sbox):
# The .svn directory and the format file should not be added as this
# breaks the administrative area handling, so we expect some error here
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*reserved name.*",
'add', '--parents', entries_path)
@@ -2595,7 +2599,7 @@ def basic_mkdir_mix_targets(sbox):
Y_url = sbox.repo_url + '/Y'
expected_error = "svn: E200009: Cannot mix repository and working copy targets"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'mkdir', '-m', 'log_msg', Y_url, 'subdir')
def delete_from_url_with_spaces(sbox):
@@ -2606,15 +2610,15 @@ def delete_from_url_with_spaces(sbox):
sbox.simple_mkdir('Dir With')
sbox.simple_mkdir('Dir With/Spaces')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', sbox.wc_dir, '-m', 'Added dir')
# This fails on 1.6.11 with an escaping error.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.repo_url + '/Dir%20With%20Spaces',
'-m', 'Deleted')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.repo_url + '/Dir%20With/Spaces',
'-m', 'Deleted')
@@ -2623,8 +2627,7 @@ def meta_correct_library_being_used(sbox):
"verify that neon/serf are compiled if tested"
expected_re = (r'^\* ra_%s :' % svntest.main.options.http_library)
expected_output = svntest.verify.RegexOutput(expected_re, match_all=False)
- svntest.actions.run_and_verify_svn("is $http_library available",
- expected_output, [], '--version')
+ svntest.actions.run_and_verify_svn(expected_output, [], '--version')
def delete_and_add_same_file(sbox):
"commit deletes a file and adds one with same text"
@@ -2653,9 +2656,7 @@ def delete_and_add_same_file(sbox):
# not found".
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def delete_child_parent_update(sbox):
"rm child, commit, rm parent"
@@ -2674,9 +2675,7 @@ def delete_child_parent_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
svntest.main.run_svn(wc_dir, 'rm', sbox.ospath('A/B/E'))
expected_status.tweak('A/B/E', 'A/B/E/beta', status='D ')
@@ -2720,29 +2719,29 @@ def basic_relocate(sbox):
# No-op relocation of just the scheme.
scheme = repo_url[:repo_url.index('://')+3]
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '--relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '--relocate',
scheme, scheme, wc_dir)
_verify_url(wc_dir, repo_url)
# No-op relocation of a bit more of the URL.
substring = repo_url[:repo_url.index('://')+7]
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '--relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '--relocate',
substring, substring, wc_dir)
_verify_url(wc_dir, repo_url)
# Real relocation to OTHER_REPO_URL.
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '--relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '--relocate',
repo_url, other_repo_url, wc_dir)
_verify_url(wc_dir, other_repo_url)
# ... and back again, using the newer 'svn relocate' subcommand.
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
other_repo_url, repo_url, wc_dir)
_verify_url(wc_dir, repo_url)
# To OTHER_REPO_URL again, this time with the single-URL form of
# 'svn relocate'.
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
other_repo_url, wc_dir)
_verify_url(wc_dir, other_repo_url)
@@ -2756,19 +2755,19 @@ def delete_urls_with_spaces(sbox):
sbox.build(create_wc = False)
# Create three directories with a space in their name
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
sbox.repo_url + '/A spaced',
sbox.repo_url + '/B spaced',
sbox.repo_url + '/C spaced',
'-m', 'Created dirs')
# Try to delete the first
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
sbox.repo_url + '/A spaced',
'-m', 'Deleted A')
# And then two at once
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
sbox.repo_url + '/B spaced',
sbox.repo_url + '/C spaced',
'-m', 'Deleted B and C')
@@ -2781,8 +2780,7 @@ def ls_url_special_characters(sbox):
sbox.repo_url + '%2F' + 'A']
for url in special_urls:
- svntest.actions.run_and_verify_svn('ls URL with special characters',
- ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
+ svntest.actions.run_and_verify_svn(['B/\n', 'C/\n', 'D/\n', 'mu\n'],
[], 'ls',
url)
@@ -2797,7 +2795,7 @@ def ls_multiple_and_non_existent_targets(sbox):
non_existent_path = sbox.ospath('non-existent')
expected_err = ".*W155010.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err,
+ svntest.actions.run_and_verify_svn2(None, expected_err,
1, 'ls', non_existent_path)
def non_existent_url_target():
@@ -2805,7 +2803,7 @@ def ls_multiple_and_non_existent_targets(sbox):
non_existent_url = sbox.repo_url + '/non-existent'
expected_err = ".*W160013.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err,
+ svntest.actions.run_and_verify_svn2(None, expected_err,
1, 'ls', non_existent_url)
def multiple_wc_targets():
"multiple wc targets"
@@ -2815,7 +2813,7 @@ def ls_multiple_and_non_existent_targets(sbox):
non_existent_path = sbox.ospath('non-existent')
# All targets are existing
- svntest.actions.run_and_verify_svn2(None, None, [],
+ svntest.actions.run_and_verify_svn2(None, [],
0, 'ls', alpha, beta)
# One non-existing target
@@ -2838,7 +2836,7 @@ def ls_multiple_and_non_existent_targets(sbox):
non_existent_url = sbox.repo_url + '/non-existent'
# All targets are existing
- svntest.actions.run_and_verify_svn2(None, None, [],
+ svntest.actions.run_and_verify_svn2(None, [],
0, 'ls', alpha, beta)
# One non-existing target
@@ -2893,7 +2891,7 @@ def add_multiple_targets(sbox):
expected_status = svntest.verify.UnorderedOutput(
['A ' + file1 + '\n',
'A ' + file2 + '\n'])
- svntest.actions.run_and_verify_svn(None, expected_status, [],
+ svntest.actions.run_and_verify_svn(expected_status, [],
'status', wc_dir)
@@ -2904,29 +2902,29 @@ def quiet_commits(sbox):
svntest.main.file_append(sbox.ospath('A/mu'), 'xxx')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'commit', sbox.wc_dir,
'--message', 'commit', '--quiet')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'mkdir', sbox.repo_url + '/X',
'--message', 'mkdir URL', '--quiet')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'import', sbox.ospath('A/mu'),
sbox.repo_url + '/f',
'--message', 'import', '--quiet')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'rm', sbox.repo_url + '/f',
'--message', 'rm URL', '--quiet')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'copy', sbox.repo_url + '/X',
sbox.repo_url + '/Y',
'--message', 'cp URL URL', '--quiet')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'move', sbox.repo_url + '/Y',
sbox.repo_url + '/Z',
'--message', 'mv URL URL', '--quiet')
@@ -2980,7 +2978,7 @@ def rm_missing_with_case_clashing_ondisk_item(sbox):
# Verify that the casing is not updated, because the path is on-disk.
expected_output = [ 'D %s\n' % iota_path ]
# 'svn rm' iota, should leave IOTA alone.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'rm', iota_path)
# Test status: the unversioned IOTA should still be there.
@@ -3001,14 +2999,14 @@ def delete_conflicts_one_of_many(sbox):
svntest.main.file_append(sbox.ospath('A/D/G/rho'), 'new rho')
sbox.simple_commit()
svntest.main.file_append(sbox.ospath('A/D/G/rho'), 'conflict rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '-r1', '--accept', 'postpone',
wc_dir)
if not os.path.exists(sbox.ospath('A/D/G/rho.mine')):
raise svntest.Failure("conflict file rho.mine missing")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--force',
sbox.ospath('A/D/G/rho'),
sbox.ospath('A/D/G/tau'))
@@ -3043,12 +3041,38 @@ def peg_rev_on_non_existent_wc_path(sbox):
# test something.
sbox.simple_update()
# This currently fails with ENOENT on A/mu3.
- svntest.actions.run_and_verify_svn(None, ['r2\n'], [],
+ svntest.actions.run_and_verify_svn(['r2\n'], [],
'cat', '-r2', sbox.ospath('A3/mu3') + '@3')
os.chdir(sbox.ospath('A4'))
- svntest.actions.run_and_verify_svn(None, ['r2\n'], [],
+ svntest.actions.run_and_verify_svn(['r2\n'], [],
'cat', '-r2', sbox.ospath('mu3') + '@3')
+
+# With 'svn mkdir --parents' the target directory may already exist on disk.
+# In that case it was wrongly performing a recursive 'add' on its contents.
+def mkdir_parents_target_exists_on_disk(sbox):
+ "mkdir parents target exists on disk"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ Y_path = sbox.ospath('Y')
+ Y_Z_path = sbox.ospath('Y/Z')
+
+ os.mkdir(Y_path)
+ os.mkdir(Y_Z_path)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '--parents', Y_path)
+
+ # Y should be added, and Z should not. There was a regression in which Z
+ # was also added.
+ expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
+ expected_status.add({
+ 'Y' : Item(status='A ', wc_rev=0),
+ })
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+
########################################################################
# Run the tests
@@ -3091,7 +3115,7 @@ test_list = [ None,
ls_space_in_repo_name,
delete_keep_local,
delete_keep_local_twice,
- windows_paths_in_repos,
+ special_paths_in_repos,
basic_rm_urls_one_repo,
basic_rm_urls_multi_repos,
automatic_conflict_resolution,
@@ -3117,6 +3141,7 @@ test_list = [ None,
rm_missing_with_case_clashing_ondisk_item,
delete_conflicts_one_of_many,
peg_rev_on_non_existent_wc_path,
+ mkdir_parents_target_exists_on_disk,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/blame_tests.py b/subversion/tests/cmdline/blame_tests.py
index fdbb688..f824d25 100755
--- a/subversion/tests/cmdline/blame_tests.py
+++ b/subversion/tests/cmdline/blame_tests.py
@@ -34,7 +34,7 @@ from svntest.main import server_has_mergeinfo
from prop_tests import binary_mime_type_on_text_file_warning
# For some basic merge setup used by blame -g tests.
-from merge_tests import set_up_branch
+from svntest.mergetrees import set_up_branch
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -213,11 +213,11 @@ def blame_in_xml(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# Retrieve last changed date from svn info
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'log', file_path, '--xml', '-r1:2')
date1 = None
@@ -257,7 +257,7 @@ def blame_in_xml(sbox):
'</blame>\n']
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'blame', file_path, '--xml')
for i in range(0, len(output)):
@@ -284,17 +284,17 @@ def blame_on_unknown_revision(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'blame', file_path, '-rHEAD:HEAD')
if output[0].find(" - This is the file 'iota'.") == -1:
raise svntest.Failure
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'blame', file_path, '--verbose', '-rHEAD:HEAD')
if output[0].find(" - This is the file 'iota'.") == -1:
@@ -325,12 +325,12 @@ def blame_peg_rev(sbox):
# Check that we get a blame of r1 when we specify a peg revision of r1
# and no explicit revision.
- svntest.actions.run_and_verify_svn(None, expected_output_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1, [],
'blame', 'iota@1')
# Check that an explicit revision overrides the default provided by
# the peg revision.
- svntest.actions.run_and_verify_svn(None, expected_output_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1, [],
'blame', 'iota@2', '-r1')
def blame_eol_styles(sbox):
@@ -355,16 +355,16 @@ def blame_eol_styles(sbox):
for i in range(1,3):
svntest.main.file_append(file_path, "Extra line %d" % (i) + "\n")
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
svntest.main.run_svn(None, 'propset', 'svn:eol-style', eol,
file_path)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'blame', file_path, '-r1:HEAD')
# output is a list of lines, there should be 3 lines
@@ -389,7 +389,7 @@ def blame_ignore_whitespace(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# commit only whitespace changes
svntest.main.file_write(file_path,
@@ -400,7 +400,7 @@ def blame_ignore_whitespace(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# match the blame output, as defined in the blame code:
# "%6ld %10s %s %s%s", rev, author ? author : " -",
@@ -412,7 +412,7 @@ def blame_ignore_whitespace(sbox):
]
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, expected_output, [],
+ expected_output, [],
'blame', '-x', '-w', file_path)
# commit some changes
@@ -425,7 +425,7 @@ def blame_ignore_whitespace(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
expected_output = [
" 2 jrandom A a \n",
@@ -434,7 +434,7 @@ def blame_ignore_whitespace(sbox):
" 2 jrandom C c \n",
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '-x', '-w', file_path)
def blame_ignore_eolstyle(sbox):
@@ -454,7 +454,7 @@ def blame_ignore_eolstyle(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# commit only eol changes
svntest.main.file_write(file_path,
@@ -465,7 +465,7 @@ def blame_ignore_eolstyle(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
expected_output = [
" 2 jrandom Aa\n",
@@ -474,7 +474,7 @@ def blame_ignore_eolstyle(sbox):
]
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, expected_output, [],
+ expected_output, [],
'blame', '-x', '--ignore-eol-style', file_path)
@@ -490,7 +490,7 @@ def blame_merge_info(sbox):
mu_path = os.path.join(wc_dir, 'trunk', 'A', 'mu')
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [], 'blame', '-g', iota_path)
+ None, [], 'blame', '-g', iota_path)
expected_blame = [
{ 'revision' : 2,
@@ -507,7 +507,7 @@ def blame_merge_info(sbox):
parse_and_verify_blame(output, expected_blame, 1)
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [], 'blame', '-g', '-r10:11', iota_path)
+ None, [], 'blame', '-g', '-r10:11', iota_path)
expected_blame = [
{ 'revision' : None,
@@ -524,7 +524,7 @@ def blame_merge_info(sbox):
parse_and_verify_blame(output, expected_blame, 1)
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [], 'blame', '-g', '-r16:17', mu_path)
+ None, [], 'blame', '-g', '-r16:17', mu_path)
expected_blame = [
{ 'revision' : None,
@@ -557,7 +557,7 @@ def blame_merge_out_of_range(sbox):
upsilon_path = os.path.join(wc_dir, 'trunk', 'A', 'upsilon')
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'blame', '-g', upsilon_path)
expected_blame = [
@@ -599,12 +599,12 @@ def blame_peg_rev_file_not_in_head(sbox):
# Check that we get a blame of r1 when we specify a peg revision of r1
# and no explicit revision.
- svntest.actions.run_and_verify_svn(None, expected_output_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1, [],
'blame', 'iota@1')
# Check that an explicit revision overrides the default provided by
# the peg revision.
- svntest.actions.run_and_verify_svn(None, expected_output_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1, [],
'blame', 'iota@2', '-r1')
def blame_file_not_in_head(sbox):
@@ -616,9 +616,10 @@ def blame_file_not_in_head(sbox):
# Check that a correct error message is printed when blaming a target that
# doesn't exist (in HEAD).
expected_err = ".*notexisting' (is not a file.*|path not found|does not exist)"
- svntest.actions.run_and_verify_svn(None, [], expected_err,
+ svntest.actions.run_and_verify_svn([], expected_err,
'blame', notexisting_url)
+@SkipUnless(server_has_mergeinfo)
def blame_output_after_merge(sbox):
"blame -g output with inserted lines"
@@ -630,7 +631,8 @@ def blame_output_after_merge(sbox):
A_url = sbox.repo_url + '/A'
# r2: mv greek tree in trunk.
- svntest.actions.run_and_verify_svn(None, ["\n","Committed revision 2.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
'mv', "--parents", A_url, trunk_A_url,
"-m", "move greek tree to trunk")
@@ -650,11 +652,12 @@ def blame_output_after_merge(sbox):
'trunk/A/mu' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# r4: create branches/br from trunk
branches_br_url = sbox.repo_url + "/branches/br"
- svntest.actions.run_and_verify_svn(None, ["\n","Committed revision 4.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 4.\n"], [],
'cp', '--parents',
trunk_url, branches_br_url,
"-m", "create branch")
@@ -675,7 +678,7 @@ def blame_output_after_merge(sbox):
'branches/br/A/mu' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# r6: Insert a single line in branches/A/mu
svntest.main.file_write(branch_mu_path,
@@ -691,11 +694,11 @@ def blame_output_after_merge(sbox):
'branches/br/A/mu' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# r7: merge branches/br back to trunk
trunk_path = os.path.join(wc_dir, "trunk")
- svntest.actions.run_and_verify_svn(wc_dir, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
'-r', '4:HEAD',
branches_br_url, trunk_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -703,7 +706,7 @@ def blame_output_after_merge(sbox):
'trunk/A/mu' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# Now test blame, first without the -g option
expected_output = [ " 3 jrandom New version of file 'mu'.\n",
@@ -714,7 +717,7 @@ def blame_output_after_merge(sbox):
" 3 jrandom 5th line in file 'mu'.\n",
" 3 jrandom 6th line in file 'mu'.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', mu_path)
# Next test with the -g option
@@ -727,7 +730,7 @@ def blame_output_after_merge(sbox):
" 3 jrandom 5th line in file 'mu'.\n",
" 3 jrandom 6th line in file 'mu'.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '-g', mu_path)
# Now test with -rN:M
@@ -739,19 +742,19 @@ def blame_output_after_merge(sbox):
" - - 5th line in file 'mu'.\n",
" - - 6th line in file 'mu'.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '-r', '4:head', mu_path)
# Next test with the -g option with -rN:M
expected_output = [ " - - New version of file 'mu'.\n",
" - - 2nd line in file 'mu'.\n",
- "G - - new 3rd line in file 'mu'.\n",
+ "G 5 jrandom new 3rd line in file 'mu'.\n",
"G 6 jrandom add 3.5 line in file 'mu'.\n",
" - - 4th line in file 'mu'.\n",
" - - 5th line in file 'mu'.\n",
" - - 6th line in file 'mu'.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '-g', '-r', '6:head', mu_path)
#----------------------------------------------------------------------
@@ -772,7 +775,7 @@ def merge_sensitive_blame_and_empty_mergeinfo(sbox):
# Make an edit to A/D/H/psi in r3.
svntest.main.file_append(psi_path, "trunk edit in revision three.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'trunk edit', wc_dir)
+ sbox.simple_commit(message='trunk edit')
# Merge r3 from A to A_COPY, reverse merge r3 from A/D/H/psi
# to A_COPY/D/H/psi, and commit as r4. This results in empty
@@ -782,21 +785,18 @@ def merge_sensitive_blame_and_empty_mergeinfo(sbox):
sbox.repo_url + '/A', A_COPY_path)
svntest.main.run_svn(None, 'merge', '-c-3',
sbox.repo_url + '/A/D/H/psi', psi_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m',
- 'Sync merge A to A_COPY excepting A_COPY/D/H/psi',
- wc_dir)
+ sbox.simple_commit(message='Sync merge A to A_COPY excepting A_COPY/D/H/psi')
# Make an edit to A/D/H/psi in r5.
svntest.main.file_append(psi_path, "trunk edit in revision five.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'trunk edit', wc_dir)
+ sbox.simple_commit(message='trunk edit')
# Sync merge A/D/H/psi to A_COPY/D/H/psi and commit as r6. This replaces
# the empty mergeinfo on A_COPY/D/H/psi with '/A/D/H/psi:2-5'.
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A/D/H/psi',
psi_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m',
- 'Sync merge A/D/H/psi to A_COPY/D/H/psi', wc_dir)
+ sbox.simple_commit(message='Sync merge A/D/H/psi to A_COPY/D/H/psi')
# Check the blame -g output:
# Currently this test fails because the trunk edit done in r3 is
@@ -810,7 +810,7 @@ def merge_sensitive_blame_and_empty_mergeinfo(sbox):
" 1 jrandom This is the file 'psi'.\n",
"G 3 jrandom trunk edit in revision three.\n",
"G 5 jrandom trunk edit in revision five.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', '-g', psi_COPY_path)
def blame_multiple_targets(sbox):
@@ -819,53 +819,33 @@ def blame_multiple_targets(sbox):
sbox.build()
# First, make a new revision of iota.
- iota = os.path.join(sbox.wc_dir, 'iota')
- svntest.main.file_append(iota, "New contents for iota\n")
- svntest.main.run_svn(None, 'ci', '-m', '', iota)
+ sbox.simple_append('iota', "New contents for iota\n")
+ sbox.simple_commit()
+ iota = sbox.ospath('iota')
expected_output = [
" 1 jrandom This is the file 'iota'.\n",
" 2 jrandom New contents for iota\n",
]
- def multiple_wc_targets():
- "multiple wc targets"
-
- non_existent = os.path.join(sbox.wc_dir, 'non-existent')
-
- expected_err = ".*W155010.*\n.*E200009.*"
- expected_err_re = re.compile(expected_err, re.DOTALL)
-
- exit_code, output, error = svntest.main.run_svn(1, 'blame',
- non_existent, iota)
+ # We use --force to avoid an early bail from the current blame code,
+ # that performs a property check before the actual blame.
- # Verify error
- if not expected_err_re.match("".join(error)):
- raise svntest.Failure('blame failed: expected error "%s", but received '
- '"%s"' % (expected_err, "".join(error)))
- svntest.verify.verify_outputs(None, output, None, expected_output, None)
+ non_existent = os.path.join(sbox.wc_dir, 'non-existent')
+ svntest.actions.run_and_verify_svn(None,
+ ".*W155010: The node.*non-existent'.*",
+ 'blame', non_existent, iota,
+ '--force')
- def multiple_url_targets():
- "multiple url targets"
+ iota_url = sbox.repo_url + '/iota'
+ non_existent_url = sbox.repo_url + '/non-existent'
- iota_url = sbox.repo_url + '/iota'
- non_existent = sbox.repo_url + '/non-existent'
+ # SVN_ERR_FS_NOT_FILE | SVN_ERR_FS_NOT_FOUND
+ svntest.actions.run_and_verify_svn(None,
+ ".*W1600(13|17): '.*non-existent' .*not",
+ 'blame', non_existent_url, iota_url,
+ '--force')
- expected_err = ".*(W160017|W160013|W150000).*\n.*E200009.*"
- expected_err_re = re.compile(expected_err, re.DOTALL)
-
- exit_code, output, error = svntest.main.run_svn(1, 'blame',
- non_existent, iota_url)
-
- # Verify error
- if not expected_err_re.match("".join(error)):
- raise svntest.Failure('blame failed: expected error "%s", but received '
- '"%s"' % (expected_err, "".join(error)))
- svntest.verify.verify_outputs(None, output, None, expected_output, None)
-
- # Test one by one
- multiple_wc_targets()
- multiple_url_targets()
@Issue(4034)
def blame_eol_handling(sbox):
@@ -923,10 +903,10 @@ def blame_eol_handling(sbox):
' %d jrandom line 5 \n' % rev,
]
- svntest.actions.run_and_verify_svn(f1 + '-base', expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', f1)
- svntest.actions.run_and_verify_svn(f2 + '-base', expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', f2)
file_data = 'line 1 ' + eol + \
@@ -952,13 +932,133 @@ def blame_eol_handling(sbox):
' %d jrandom line 5 \n' % rev,
]
- svntest.actions.run_and_verify_svn(f1 + '-modified', expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', f1)
- svntest.actions.run_and_verify_svn(f2 + '-modified', expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'blame', f2)
+@SkipUnless(svntest.main.server_has_reverse_get_file_revs)
+def blame_youngest_to_oldest(sbox):
+ "blame_youngest_to_oldest"
+
+ sbox.build()
+
+ # First, make a new revision of iota.
+ iota = sbox.ospath('iota')
+ orig_line = open(iota).read()
+ line = "New contents for iota\n"
+ svntest.main.file_append(iota, line)
+ sbox.simple_commit() #r2
+
+ # Move the file, to check that the operation will peg correctly.
+ iota_moved = sbox.ospath('iota_moved')
+ sbox.simple_move('iota', 'iota_moved')
+ sbox.simple_commit() #r3
+
+ # Delete a line.
+ open(iota_moved, 'w').write(line)
+ sbox.simple_commit() #r4
+
+ expected_output = [
+ ' %d jrandom %s\n' % (4, orig_line[:-1]),
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-r4:1', iota_moved)
+
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:1', iota_moved)
+
+ expected_output = [
+ ' %d jrandom %s\n' % (2, line[:-1]),
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-r1:HEAD', iota_moved)
+
+@Issue(4467)
+def blame_reverse_no_change(sbox):
+ "blame reverse towards a revision with no change"
+
+ sbox.build()
+
+ # Introduce a revision where iota doesn't change!
+ sbox.simple_propset('a', 'b', 'A')
+ sbox.simple_commit('') #r2
+
+ sbox.simple_append('iota', 'new line\n')
+ sbox.simple_commit('') #r3
+
+ sbox.simple_append('iota', 'another new line\n')
+ sbox.simple_commit('') #r4
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ' 3 jrandom new line\n',
+ ' 4 jrandom another new line\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-r2:HEAD', sbox.ospath('iota'))
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ]
+ # This used to trigger an assertion on 1.9.x before 1.9.0
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:2', sbox.ospath('iota'))
+
+ # Drop the middle line
+ sbox.simple_append('iota', 'This is the file \'iota\'.\n'
+ 'another new line\n', truncate=True)
+ sbox.simple_commit('') #r5
+
+ # Back to start
+ sbox.simple_append('iota', 'This is the file \'iota\'.\n', truncate=True)
+ sbox.simple_commit('') #r6
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:2', sbox.ospath('iota'))
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ' 5 jrandom new line\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:3', sbox.ospath('iota'))
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ' 5 jrandom new line\n',
+ ' 6 jrandom another new line\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:4', sbox.ospath('iota'))
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ' 6 jrandom another new line\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:5', sbox.ospath('iota'))
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-rHEAD:6', sbox.ospath('iota'))
+
+
+ expected_output = [
+ ' - - This is the file \'iota\'.\n',
+ ' 5 jrandom new line\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'blame', '-r5:3', sbox.ospath('iota'))
+
+
########################################################################
# Run the tests
@@ -982,6 +1082,8 @@ test_list = [ None,
merge_sensitive_blame_and_empty_mergeinfo,
blame_multiple_targets,
blame_eol_handling,
+ blame_youngest_to_oldest,
+ blame_reverse_no_change,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/cat_tests.py b/subversion/tests/cmdline/cat_tests.py
index b3227cb..8246bc2 100755
--- a/subversion/tests/cmdline/cat_tests.py
+++ b/subversion/tests/cmdline/cat_tests.py
@@ -59,7 +59,7 @@ def cat_local_directory(sbox):
re.escape(os.path.abspath(A_path)) + \
"' refers to a directory"
- svntest.actions.run_and_verify_svn2(None, None, expected_err,
+ svntest.actions.run_and_verify_svn2(None, expected_err,
1, 'cat', A_path)
def cat_remote_directory(sbox):
@@ -70,7 +70,7 @@ def cat_remote_directory(sbox):
expected_err = "svn: warning: W195007: URL '" + A_url + \
"' refers to a directory\n.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err,
+ svntest.actions.run_and_verify_svn2(None, expected_err,
1, 'cat', A_url)
def cat_base(sbox):
@@ -101,7 +101,7 @@ def cat_nonexistent_file(sbox):
re.escape(os.path.abspath(bogus_path)) + \
"' is not under version control"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 1,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 1,
'cat', bogus_path)
def cat_skip_uncattable(sbox):
@@ -128,18 +128,17 @@ def cat_skip_uncattable(sbox):
expected_err = "svn: warning: W200005: '" + \
re.escape(os.path.abspath(item_to_cat)) + \
"' is not under version control"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 1,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 1,
'cat', item_to_cat)
elif os.path.isdir(item_to_cat):
expected_err = "svn: warning: W195007: '" + \
re.escape(os.path.abspath(item_to_cat)) + \
"' refers to a directory"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 1,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 1,
'cat', item_to_cat)
else:
- svntest.actions.run_and_verify_svn(None,
- ["This is the file '"+file+"'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file '"+file+"'.\n"],
[], 'cat', item_to_cat)
G_path = os.path.join(dir_path, 'G')
@@ -149,13 +148,13 @@ def cat_skip_uncattable(sbox):
expected_err1 = "svn: warning: W195007: '" + \
re.escape(os.path.abspath(G_path)) + \
"' refers to a directory\n"
- svntest.actions.run_and_verify_svn2(None, expected_out, expected_err1, 1,
+ svntest.actions.run_and_verify_svn2(expected_out, expected_err1, 1,
'cat', rho_path, G_path)
expected_err2 = "svn: warning: W200005: '" + \
re.escape(os.path.abspath(new_file_path)) + \
"' is not under version control\n"
- svntest.actions.run_and_verify_svn2(None, expected_out, expected_err2, 1,
+ svntest.actions.run_and_verify_svn2(expected_out, expected_err2, 1,
'cat', rho_path, new_file_path)
expected_err3 = expected_err1 + expected_err2 + \
@@ -163,6 +162,8 @@ def cat_skip_uncattable(sbox):
expected_err_re = re.compile(expected_err3, re.DOTALL)
exit_code, output, error = svntest.main.run_svn(1, 'cat', rho_path, G_path, new_file_path)
+ error = [line for line in error
+ if not re.compile(svntest.main.stack_trace_regexp).match(line)]
# Verify output
if output[0] != expected_out:
@@ -184,9 +185,9 @@ def cat_unversioned_file(sbox):
iota_path = os.path.join(wc_dir, 'iota')
# Delete a file an commit the deletion.
- svntest.actions.run_and_verify_svn2(None, None, [], 0,
+ svntest.actions.run_and_verify_svn2(None, [], 0,
'delete', iota_path)
- svntest.actions.run_and_verify_svn2(None, None, [], 0,
+ svntest.actions.run_and_verify_svn2(None, [], 0,
'commit', '-m', 'delete a file',
iota_path)
@@ -194,13 +195,13 @@ def cat_unversioned_file(sbox):
expected_error = "svn: warning: W200005: '" + \
re.escape(os.path.abspath(iota_path)) + \
"' is not under version control"
- svntest.actions.run_and_verify_svn2(None, [], expected_error, 1,
+ svntest.actions.run_and_verify_svn2([], expected_error, 1,
'cat', iota_path)
# Put an unversioned file at 'iota' and try to cat it again, the result
# should still be the same.
svntest.main.file_write(iota_path, "This the unversioned file 'iota'.\n")
- svntest.actions.run_and_verify_svn2(None, [], expected_error, 1,
+ svntest.actions.run_and_verify_svn2([], expected_error, 1,
'cat', iota_path)
def cat_keywords(sbox):
@@ -209,20 +210,18 @@ def cat_keywords(sbox):
wc_dir = sbox.wc_dir
iota_path = os.path.join(wc_dir, 'iota')
- svntest.actions.run_and_verify_svn(None,
- ["This is the file 'iota'.\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'iota'.\n"],
[], 'cat', iota_path)
svntest.main.file_append(iota_path, "$Revision$\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords', 'Revision',
iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'r2', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["This is the file 'iota'.\n", "$Revision: 2 $\n"],
+ svntest.actions.run_and_verify_svn(["This is the file 'iota'.\n", "$Revision: 2 $\n"],
[], 'cat', iota_path)
def cat_url_special_characters(sbox):
@@ -237,7 +236,7 @@ def cat_url_special_characters(sbox):
"' refers to a directory\n.*"
for url in special_urls:
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 1,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 1,
'cat', url)
def cat_non_existing_remote_file(sbox):
@@ -249,7 +248,7 @@ def cat_non_existing_remote_file(sbox):
non_existing_path.split('/')[1]
# cat operation on non-existing remote path should return 1
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 1,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 1,
'cat', non_existing_path)
########################################################################
diff --git a/subversion/tests/cmdline/changelist_tests.py b/subversion/tests/cmdline/changelist_tests.py
index 4652acc..1bbb4a6 100755
--- a/subversion/tests/cmdline/changelist_tests.py
+++ b/subversion/tests/cmdline/changelist_tests.py
@@ -442,7 +442,7 @@ def commit_one_changelist(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir,
"--changelist",
"a")
@@ -483,7 +483,7 @@ def commit_multiple_changelists(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir,
"--changelist", "a",
"--changelist", "i")
@@ -814,8 +814,7 @@ def update_with_changelists(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
"-r", "1",
"--changelist", "a",
"--changelist", "i",
@@ -856,8 +855,7 @@ def update_with_changelists(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
"-r", "1",
"--changelist", "a",
"--changelist", "i",
@@ -907,7 +905,7 @@ def tree_conflicts_and_changelists_on_commit1(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir,
"--changelist",
"list")
@@ -930,23 +928,23 @@ def tree_conflicts_and_changelists_on_commit2(sbox):
expected_output = svntest.verify.RegexOutput(
"Deleting.*" + re.escape(C),
False)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'commit', '-m', 'delete A/C', C)
expected_output = svntest.verify.RegexOutput(
"A.*" + re.escape(C), False)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'update', C, "-r1")
expected_output = svntest.verify.RegexOutput(
".*'propname' set on '"
+ re.escape(C) + "'", False)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propset', 'propname', 'propval', C)
expected_output = svntest.verify.RegexOutput(
" C " + re.escape(C), False)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'update', wc_dir)
@@ -980,7 +978,7 @@ def tree_conflicts_and_changelists_on_commit2(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir,
"--changelist",
"list")
@@ -1031,7 +1029,7 @@ def move_added_keeps_changelist(sbox):
svntest.main.run_svn(None, "rename", kappa_path, kappa2_path)
# kappa not under version control
- svntest.actions.run_and_verify_svnversion(None, kappa_path, repo_url,
+ svntest.actions.run_and_verify_svnversion(kappa_path, repo_url,
[], ".*doesn't exist.*")
# kappa2 in a changelist
expected_infos = [
@@ -1054,17 +1052,17 @@ def change_to_dir(sbox):
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu visible in changelist
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'changelist', 'qq', sbox.ospath('A/mu'))
expected_infos = [{'Name' : 'mu', 'Changelist' : 'qq'}]
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu still visible after delete
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', sbox.ospath('A/mu'))
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A/mu'))
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu removed from changelist after replace with directory
- svntest.actions.run_and_verify_svn(None, '^A|' + _re_cl_rem_pattern, [],
+ svntest.actions.run_and_verify_svn('^A|' + _re_cl_rem_pattern, [],
'mkdir', sbox.ospath('A/mu'))
expected_infos = [{'Changelist' : None}] # No Name for directories?
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
@@ -1078,7 +1076,7 @@ def change_to_dir(sbox):
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu visible in changelist
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'changelist', 'qq', sbox.ospath('A/mu'))
expected_infos = [{'Name' : 'mu', 'Changelist' : 'qq'}]
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
@@ -1101,26 +1099,26 @@ def revert_deleted_in_changelist(sbox):
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu visible in changelist
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'changelist', 'qq', sbox.ospath('A/mu'))
expected_infos = [{'Name' : 'mu', 'Changelist' : 'qq'}]
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu still visible after delete
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', sbox.ospath('A/mu'))
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A/mu'))
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu still visible after revert
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', sbox.ospath('A/mu'))
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu still visible after parent delete
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', sbox.ospath('A'))
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A'))
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
# A/mu still visible after revert
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', sbox.ospath('A'))
svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
@@ -1135,11 +1133,11 @@ def add_remove_non_existent_target(sbox):
re.escape(os.path.abspath(bogus_path)) + \
"' was not found"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'changelist', 'testlist',
bogus_path)
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'changelist', bogus_path,
'--remove')
@@ -1154,11 +1152,11 @@ def add_remove_unversioned_target(sbox):
re.escape(os.path.abspath(unversioned)) + \
"' was not found"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'changelist', 'testlist',
unversioned)
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'changelist', unversioned,
'--remove')
@@ -1171,7 +1169,7 @@ def readd_after_revert(sbox):
svntest.main.file_write(dummy, "dummy contents")
sbox.simple_add('dummy')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'changelist', 'testlist',
dummy)
@@ -1179,7 +1177,7 @@ def readd_after_revert(sbox):
svntest.main.file_write(dummy, "dummy contents")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', dummy)
diff --git a/subversion/tests/cmdline/checkout_tests.py b/subversion/tests/cmdline/checkout_tests.py
index 7456221..4d939c3 100755
--- a/subversion/tests/cmdline/checkout_tests.py
+++ b/subversion/tests/cmdline/checkout_tests.py
@@ -206,8 +206,8 @@ def checkout_with_obstructions(sbox):
'A/B/lambda', 'A/D', 'A/D/G', 'A/D/G/rho', 'A/D/G/pi', 'A/D/G/tau',
'A/D/H', 'A/D/H/psi', 'A/D/H/omega', 'A/D/H/chi', 'A/D/gamma', 'A/C')
- actions.run_and_verify_checkout2(False, url, wc_dir, expected_output,
- expected_disk, None, None, None, None)
+ actions.run_and_verify_checkout(url, wc_dir, expected_output,
+ expected_disk)
# svn status
expected_status = actions.get_virginal_state(wc_dir, 1)
@@ -243,7 +243,7 @@ def checkout_with_obstructions(sbox):
expected_status = actions.get_virginal_state(wc_dir, 1)
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status,)
@@ -291,7 +291,7 @@ def forced_checkout_of_file_with_dir_obstructions(sbox):
expected_disk.tweak('iota', contents=None)
actions.run_and_verify_checkout(url, wc_dir_other, expected_output,
- expected_disk, None, None, None, None, '--force')
+ expected_disk, [], '--force')
#----------------------------------------------------------------------
@@ -356,7 +356,7 @@ def forced_checkout_of_dir_with_file_obstructions(sbox):
expected_disk.tweak('A', contents='The file A\n')
actions.run_and_verify_checkout(url, wc_dir_other, expected_output,
- expected_disk, None, None, None, None, '--force')
+ expected_disk, [], '--force')
# Now see to it that we can recover from the obstructions.
@@ -374,7 +374,7 @@ def forced_checkout_of_dir_with_file_obstructions(sbox):
svntest.main.run_svn(None, 'revert', '-R', os.path.join(wc_dir_other, 'A'))
actions.run_and_verify_update(wc_dir_other, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir_other)
+ expected_status)
#----------------------------------------------------------------------
@@ -390,8 +390,7 @@ def forced_checkout_with_faux_obstructions(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url,
sbox.wc_dir, expected_output,
- expected_wc, None, None, None,
- None, '--force')
+ expected_wc, [], '--force')
#----------------------------------------------------------------------
@@ -411,8 +410,7 @@ def forced_checkout_with_real_obstructions(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url,
sbox.wc_dir, expected_output,
- expected_wc, None, None, None,
- None, '--force')
+ expected_wc, [], '--force')
#----------------------------------------------------------------------
@@ -436,8 +434,7 @@ def forced_checkout_with_real_obstructions_and_unversioned_files(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url,
sbox.wc_dir, expected_output,
- expected_wc, None, None, None,
- None, '--force')
+ expected_wc, [], '--force')
#----------------------------------------------------------------------
@@ -462,14 +459,12 @@ def forced_checkout_with_versioned_obstruction(sbox):
os.mkdir(other_wc_dir)
# Checkout "A" from the first repos to a fresh dir.
- svntest.actions.run_and_verify_svn("Unexpected error during co",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
"co", repo_url + "/A",
fresh_wc_dir_A)
# Checkout "A" from the second repos to the other dir.
- svntest.actions.run_and_verify_svn("Unexpected error during co",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
"co", other_repo_url + "/A",
other_wc_dir_A)
@@ -483,8 +478,7 @@ def forced_checkout_with_versioned_obstruction(sbox):
expected_wc = svntest.main.greek_state.copy()
svntest.actions.run_and_verify_checkout(repo_url, fresh_wc_dir,
expected_output, expected_wc,
- None, None, None, None,
- '--force')
+ [], '--force')
# Checkout the entire first repos into the other dir. This should
# fail because it's a different repository.
@@ -495,14 +489,13 @@ def forced_checkout_with_versioned_obstruction(sbox):
expected_wc = svntest.main.greek_state.copy()
svntest.actions.run_and_verify_checkout(repo_url, other_wc_dir,
expected_output, expected_wc,
- None, None, None, None,
- '--force')
+ [], '--force')
#ensure that other_wc_dir_A is not affected by this forced checkout.
- svntest.actions.run_and_verify_svn("empty status output", None,
+ svntest.actions.run_and_verify_svn(None,
[], "st", other_wc_dir_A)
exit_code, sout, serr = svntest.actions.run_and_verify_svn(
- "it should still point to other_repo_url/A", None, [], "info",
+ None, [], "info",
other_wc_dir_A)
#TODO rename test_stderr to test_regex or something.
@@ -511,7 +504,7 @@ def forced_checkout_with_versioned_obstruction(sbox):
#ensure that other_wc_dir is in a consistent state though it may be
#missing few items.
exit_code, sout, serr = svntest.actions.run_and_verify_svn(
- "it should still point to other_repo_url", None, [], "info",
+ None, [], "info",
other_wc_dir)
#TODO rename test_stderr to test_regex or something.
test_stderr("URL: " + sbox.repo_url + '$', sout)
@@ -544,7 +537,7 @@ def import_and_checkout(sbox):
# Import import_from_dir to the other repos
expected_output = svntest.wc.State(sbox.wc_dir, {})
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'-m', 'import', import_from_dir,
other_repo_url)
@@ -575,8 +568,7 @@ def import_and_checkout(sbox):
svntest.actions.run_and_verify_checkout(other_repo_url, import_from_dir,
expected_output, expected_wc,
- None, None, None, None,
- '--force')
+ [], '--force')
#----------------------------------------------------------------------
# Issue #2529.
@@ -586,7 +578,8 @@ def checkout_broken_eol(sbox):
svntest.actions.load_repo(sbox, os.path.join(os.path.dirname(sys.argv[0]),
'update_tests_data',
- 'checkout_broken_eol.dump'))
+ 'checkout_broken_eol.dump'),
+ create_wc=False)
URL = sbox.repo_url
@@ -633,7 +626,7 @@ def checkout_peg_rev(sbox):
mu_path = os.path.join(wc_dir, 'A', 'mu')
svntest.main.file_append(mu_path, 'appended mu text')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'changed file mu', wc_dir)
# now checkout the repo@1 in another folder, this should create our initial
@@ -664,7 +657,7 @@ def checkout_peg_rev_date(sbox):
## Get svn:date.
exit_code, output, errput = svntest.main.run_svn(None, 'propget', 'svn:date',
'--revprop', '-r1',
- '--strict',
+ '--no-newline',
sbox.repo_url)
if exit_code or errput != [] or len(output) != 1:
raise svntest.Failure("svn:date propget failed")
@@ -688,7 +681,7 @@ def checkout_peg_rev_date(sbox):
mu_path = os.path.join(wc_dir, 'A', 'mu')
svntest.main.file_append(mu_path, 'appended mu text')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'changed file mu', wc_dir)
# now checkout the repo@peg_string in another folder, this should create our
@@ -709,7 +702,7 @@ def checkout_peg_rev_date(sbox):
expected_output,
expected_wc)
- # now try another checkout with repo@r1_string
+ # now try another checkout with repo@r1_string
checkout_target = sbox.add_wc_path('checkout2')
os.mkdir(checkout_target)
@@ -809,7 +802,7 @@ def co_with_obstructing_local_adds(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create various paths scheduled for addition which will obstruct
# the adds coming from the repos.
@@ -858,6 +851,7 @@ def co_with_obstructing_local_adds(sbox):
'A/D/H/I/K/xi' : Item("This is file 'xi'\n"),
'A/D/H/I/K/eta' : Item("\n".join(["<<<<<<< .mine",
"This is WC file 'eta'",
+ "||||||| .r0",
"=======",
"This is REPOS file 'eta'",
">>>>>>> .r2",
@@ -865,6 +859,7 @@ def co_with_obstructing_local_adds(sbox):
'A/D/H/I/L' : Item(),
'A/D/kappa' : Item("\n".join(["<<<<<<< .mine",
"This is WC file 'kappa'",
+ "||||||| .r0",
"=======",
"This is REPOS file 'kappa'",
">>>>>>> .r2",
@@ -895,9 +890,8 @@ def co_with_obstructing_local_adds(sbox):
# wc_backup before performing the checkout otherwise.
svntest.actions.run_and_verify_checkout(sbox.repo_url, wc_backup,
expected_output, expected_disk,
- svntest.tree.detect_conflict_files,
- extra_files, None, None,
- '--force')
+ [], '--force',
+ extra_files=extra_files)
svntest.actions.run_and_verify_status(wc_backup, expected_status)
@@ -909,7 +903,7 @@ def co_with_obstructing_local_adds(sbox):
# URL to URL copy of A/D/G to A/D/M.
G_URL = sbox.repo_url + '/A/D/G'
M_URL = sbox.repo_url + '/A/D/M'
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', G_URL, M_URL, '-m', '')
# WC to WC copy of A/D/H to A/D/M. (M is now scheduled for addition
@@ -918,13 +912,13 @@ def co_with_obstructing_local_adds(sbox):
H_path = os.path.join(wc_dir, 'A', 'D', 'H')
M_path = os.path.join(wc_dir, 'A', 'D', 'M')
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', H_path, M_path)
# URL to URL copy of A/B/E/alpha to A/B/F/omicron.
omega_URL = sbox.repo_url + '/A/B/E/alpha'
omicron_URL = sbox.repo_url + '/A/B/F/omicron'
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', omega_URL, omicron_URL,
'-m', '')
@@ -935,7 +929,7 @@ def co_with_obstructing_local_adds(sbox):
omicron_path = os.path.join(wc_dir, 'A', 'B', 'F', 'omicron')
chi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'chi')
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', chi_path,
omicron_path)
@@ -1001,8 +995,7 @@ def co_with_obstructing_local_adds(sbox):
D_path,
expected_output,
expected_disk,
- None, None, None, None,
- '--force')
+ [], '--force')
expected_status.tweak('A/D/M', treeconflict='C', status='R ')
expected_status.tweak(
@@ -1041,8 +1034,7 @@ def co_with_obstructing_local_adds(sbox):
F_path,
expected_output,
expected_disk,
- None, None, None, None,
- '--force')
+ [], '--force')
expected_status.tweak('A/B/F/omicron', treeconflict='C', status='R ')
expected_status.add({
@@ -1122,8 +1114,7 @@ def checkout_wc_from_drive(sbox):
'iota' : Item(status='A '),
})
svntest.actions.run_and_verify_checkout(repo_url, wc_dir,
- expected_output, expected_wc,
- None, None, None, None)
+ expected_output, expected_wc)
wc2_dir = sbox.add_wc_path('2')
expected_output = wc.State(wc2_dir, {
@@ -1146,9 +1137,25 @@ def checkout_wc_from_drive(sbox):
'B/F' : Item(status='A '),
'B/lambda' : Item(status='A '),
})
+
+ expected_wc = wc.State('', {
+ 'C' : Item(),
+ 'B/E/beta' : Item(contents="This is the file 'beta'.\n"),
+ 'B/E/alpha' : Item(contents="This is the file 'alpha'.\n"),
+ 'B/lambda' : Item(contents="This is the file 'lambda'.\n"),
+ 'B/F' : Item(),
+ 'D/H/omega' : Item(contents="This is the file 'omega'.\n"),
+ 'D/H/psi' : Item(contents="This is the file 'psi'.\n"),
+ 'D/H/chi' : Item(contents="This is the file 'chi'.\n"),
+ 'D/G/rho' : Item(contents="This is the file 'rho'.\n"),
+ 'D/G/tau' : Item(contents="This is the file 'tau'.\n"),
+ 'D/G/pi' : Item(contents="This is the file 'pi'.\n"),
+ 'D/gamma' : Item(contents="This is the file 'gamma'.\n"),
+ 'mu' : Item(contents="This is the file 'mu'.\n"),
+ })
+
svntest.actions.run_and_verify_checkout(repo_url + '/A', wc2_dir,
- expected_output, None,
- None, None, None, None)
+ expected_output, expected_wc)
wc3_dir = sbox.add_wc_path('3')
expected_output = wc.State(wc3_dir, {
@@ -1163,9 +1170,18 @@ def checkout_wc_from_drive(sbox):
'gamma' : Item(status='A '),
})
+ expected_wc = wc.State('', {
+ 'H/chi' : Item(contents="This is the file 'chi'.\n"),
+ 'H/psi' : Item(contents="This is the file 'psi'.\n"),
+ 'H/omega' : Item(contents="This is the file 'omega'.\n"),
+ 'G/pi' : Item(contents="This is the file 'pi'.\n"),
+ 'G/tau' : Item(contents="This is the file 'tau'.\n"),
+ 'G/rho' : Item(contents="This is the file 'rho'.\n"),
+ 'gamma' : Item(contents="This is the file 'gamma'.\n"),
+ })
+
svntest.actions.run_and_verify_checkout(repo_url + '/A/D', wc3_dir,
- expected_output, None,
- None, None, None, None)
+ expected_output, expected_wc)
finally:
os.chdir(was_cwd)
diff --git a/subversion/tests/cmdline/commit_tests.py b/subversion/tests/cmdline/commit_tests.py
index 02ba0c6..b9a7037 100755
--- a/subversion/tests/cmdline/commit_tests.py
+++ b/subversion/tests/cmdline/commit_tests.py
@@ -174,7 +174,7 @@ def commit_one_file(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
omega_path)
@@ -200,7 +200,7 @@ def commit_one_new_file(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
gloo_path)
@@ -229,7 +229,7 @@ def commit_one_new_binary_file(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
gloo_path)
@@ -283,7 +283,7 @@ def commit_multiple_targets(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
psi_path, AB_path, pi_path)
#----------------------------------------------------------------------
@@ -339,7 +339,7 @@ def commit_multiple_targets_2(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
psi_path, AB_path,
omega_path, pi_path)
@@ -375,7 +375,7 @@ def commit_inclusive_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
D_path)
#----------------------------------------------------------------------
@@ -417,7 +417,7 @@ def commit_top_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir)
#----------------------------------------------------------------------
@@ -449,7 +449,7 @@ def commit_unversioned_thing(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
None,
None,
- "is not under version control",
+ ".*is not under version control.*",
os.path.join(wc_dir,'blorg'))
#----------------------------------------------------------------------
@@ -527,9 +527,7 @@ def nested_dir_replacements(sbox):
# Commit from the top of the working copy and verify output & status.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -560,8 +558,7 @@ def hudson_part_1(sbox):
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now gamma should be marked as `deleted' under the hood. When we
# update, we should no output, and a perfect, virginal status list
@@ -611,8 +608,7 @@ def hudson_part_1_variation_1(sbox):
# Commit the deletion of H and verify.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now H should be marked as `deleted' under the hood. When we
# update, we should no see output, and a perfect, virginal status
@@ -662,8 +658,7 @@ def hudson_part_1_variation_2(sbox):
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now gamma should be marked as `deleted' under the hood.
# Go ahead and re-add gamma, so that is *also* scheduled for addition.
@@ -688,8 +683,7 @@ def hudson_part_1_variation_2(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -722,8 +716,7 @@ def hudson_part_2(sbox):
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now gamma should be marked as `deleted' under the hood, at
# revision 2. Meanwhile, A/D is still lagging at revision 1.
@@ -735,8 +728,7 @@ def hudson_part_2(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
None,
None,
- "[Oo]ut.of.date",
- wc_dir)
+ ".*[Oo]ut of date.*")
#----------------------------------------------------------------------
@@ -787,8 +779,7 @@ def hudson_part_2_1(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now, assuming all three files in H are marked as 'deleted', an
# update of H should print absolutely nothing.
@@ -849,7 +840,7 @@ fp.close()"""
svntest.main.file_append(iota_path, "More stuff in iota")
# Commit, no output expected.
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'ci', '--quiet',
'-m', 'log msg', wc_dir)
@@ -905,8 +896,7 @@ def merge_mixed_revisions(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# 2. svn up A/D/H
@@ -940,8 +930,7 @@ def merge_mixed_revisions(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# 4. echo "moo" >> A/D/H/chi; svn ci A/D/H/chi
@@ -955,8 +944,7 @@ def merge_mixed_revisions(sbox):
expected_status.tweak('iota', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# 5. echo "moo" >> iota; svn ci iota
svntest.main.file_append(iota_path, "moomoo")
@@ -969,8 +957,7 @@ def merge_mixed_revisions(sbox):
expected_status.tweak('iota', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# At this point, here is what our tree should look like:
# _ 1 ( 5) working_copies/commit_tests-10
@@ -1011,8 +998,7 @@ def merge_mixed_revisions(sbox):
expected_status.tweak('A/D/H/chi', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -1089,8 +1075,7 @@ def commit_uri_unsafe(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -1126,8 +1111,7 @@ def commit_deleted_edited(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -1202,8 +1186,7 @@ def commit_rmd_and_deleted_file(sbox):
svntest.main.run_svn(None, 'rm', mu_path)
# Commit, hoping to see no errors
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'commit', '-m', 'logmsg', mu_path)
#----------------------------------------------------------------------
@@ -1235,9 +1218,7 @@ def commit_add_file_twice(sbox):
# Commit should succeed
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Update to state before commit
svntest.main.run_svn(None, 'up', '-r', '1', wc_dir)
@@ -1250,8 +1231,7 @@ def commit_add_file_twice(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
None,
None,
- "E160020: File.*already exists",
- wc_dir)
+ ".*E160020: File.*already exists.*")
#----------------------------------------------------------------------
@@ -1287,9 +1267,7 @@ def commit_from_long_dir(sbox):
svntest.actions.run_and_verify_commit(abs_wc_dir,
expected_output,
- None,
- None,
- abs_wc_dir)
+ None)
#----------------------------------------------------------------------
@@ -1310,12 +1288,10 @@ def commit_with_lock(sbox):
None,
None,
'svn: E155004: '
- 'Working copy \'.*\' locked',
- wc_dir)
+ 'Working copy \'.*\' locked')
# unlock directory
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- [], [],
+ svntest.actions.run_and_verify_svn([], [],
'cleanup', D_path)
# this commit should succeed
@@ -1326,9 +1302,7 @@ def commit_with_lock(sbox):
expected_status.tweak('A/D/gamma', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -1352,9 +1326,7 @@ def commit_current_dir(sbox):
})
svntest.actions.run_and_verify_commit('.',
expected_output,
- None,
- None,
- '.')
+ None)
os.chdir(was_cwd)
# I can't get the status check to work as part of run_and_verify_commit.
@@ -1385,23 +1357,15 @@ def failed_commit(sbox):
svntest.main.file_append(other_iota_path, "More different stuff in iota")
# Commit both working copies. The second commit should fail.
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'commit', '-m', 'log', wc_dir)
- svntest.actions.run_and_verify_svn("Output on stderr expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'commit', '-m', 'log', other_wc_dir)
# Now list the txns in the repo. The list should be empty.
- exit_code, output, errput = svntest.main.run_svnadmin('lstxns',
- sbox.repo_dir)
- svntest.verify.compare_and_display_lines(
- "Error running 'svnadmin lstxns'.",
- 'STDERR', [], errput)
- svntest.verify.compare_and_display_lines(
- "Output of 'svnadmin lstxns' is unexpected.",
- 'STDOUT', [], output)
+ svntest.actions.run_and_verify_svnadmin([], [],
+ 'lstxns', sbox.repo_dir)
#----------------------------------------------------------------------
@@ -1419,8 +1383,7 @@ def commit_multiple_wc_nested(sbox):
# Checkout a second working copy
wc2_dir = sbox.ospath('A/wc2')
url = sbox.repo_url
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'checkout',
url, wc2_dir)
@@ -1439,8 +1402,7 @@ def commit_multiple_wc_nested(sbox):
svntest.actions.run_and_verify_status(wc2_dir, expected_status2)
# Commit should succeed, even though one target is a "child" of the other.
- svntest.actions.run_and_verify_svn("Ouput on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'commit', '-m', 'log',
wc_dir, wc2_dir)
@@ -1465,12 +1427,10 @@ def commit_multiple_wc(sbox):
wc1_dir = sbox.ospath('wc1')
wc2_dir = sbox.ospath('wc2')
url = sbox.repo_url
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'checkout',
url, wc1_dir)
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'checkout',
url, wc2_dir)
@@ -1489,8 +1449,7 @@ def commit_multiple_wc(sbox):
svntest.actions.run_and_verify_status(wc2_dir, expected_status2)
# Commit should succeed.
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'commit', '-m', 'log',
wc1_dir, wc2_dir)
@@ -1520,12 +1479,10 @@ def commit_multiple_wc_multiple_repos(sbox):
# Checkout two wcs
wc1_dir = sbox.ospath('wc1')
wc2_dir = sbox.ospath('wc2')
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'checkout',
sbox.repo_url, wc1_dir)
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'checkout',
url2, wc2_dir)
@@ -1549,8 +1506,7 @@ def commit_multiple_wc_multiple_repos(sbox):
error_re = ( ".*(is not a working copy" +
"|Are all targets part of the same working copy" +
"|was not found).*" )
- svntest.actions.run_and_verify_svn("Expected output on stderr doesn't match",
- [], error_re,
+ svntest.actions.run_and_verify_svn([], error_re,
'commit', '-m', 'log',
wc1_dir, wc2_dir)
@@ -1606,7 +1562,7 @@ def commit_nonrecursive(sbox):
svntest.main.file_append(sbox.ospath(file4_path), 'this is file4')
# Add them to version control.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'add', '--depth=empty',
sbox.ospath(file1_path),
sbox.ospath(dir1_path),
@@ -1640,7 +1596,7 @@ def commit_nonrecursive(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'-N',
sbox.ospath(file1_path),
sbox.ospath(dir1_path),
@@ -1725,7 +1681,7 @@ def commit_nonrecursive(sbox):
svntest.main.file_append(sbox.ospath(nope_2_path), 'nope_2')
# Add them to version control.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'add', '-N',
sbox.ospath(dirA_path),
sbox.ospath(fileA_path),
@@ -1767,7 +1723,7 @@ def commit_nonrecursive(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'-N', sbox.ospath(dirA_path))
#----------------------------------------------------------------------
@@ -1797,7 +1753,7 @@ def commit_out_of_date_deletions(sbox):
I_path = sbox.ospath('A/I')
os.mkdir(I_path)
svntest.main.run_svn(None, 'add', I_path)
- svntest.main.run_svn(None, 'ci', '-m', 'prep', wc_dir)
+ sbox.simple_commit(message='prep')
svntest.main.run_svn(None, 'up', wc_dir)
# Make a backup copy of the working copy
@@ -1837,7 +1793,7 @@ def commit_out_of_date_deletions(sbox):
status=' ')
expected_status.remove('A/B/F', 'A/D/H/chi', 'A/B/E/beta', 'A/D/H/psi')
commit = svntest.actions.run_and_verify_commit
- commit(wc_dir, expected_output, expected_status, None, wc_dir)
+ commit(wc_dir, expected_output, expected_status, [], wc_dir)
# Edits in wc backup
I_path = os.path.join(wc_backup, 'A', 'I')
@@ -1858,7 +1814,7 @@ def commit_out_of_date_deletions(sbox):
# A commit of any one of these files or dirs should fail, preferably
# with an out-of-date error message.
- error_re = "(out of date|not found)"
+ error_re = ".*(out of date|not found).*"
commit(wc_backup, None, None, error_re, C_path)
commit(wc_backup, None, None, error_re, I_path)
commit(wc_backup, None, None, error_re, F_path)
@@ -1886,7 +1842,7 @@ def commit_with_bad_log_message(sbox):
# Commit and expect an error.
svntest.actions.run_and_verify_commit(wc_dir,
None, None,
- "contains a zero byte",
+ ".*contains a zero byte.*",
'-F', log_msg_path,
iota_path)
@@ -1908,9 +1864,10 @@ def commit_with_mixed_line_endings(sbox):
svntest.main.file_append(log_msg_path, "test\nthis\n\rcase\r\n--This line, and those below, will be ignored--\n")
# Commit and expect an error.
+ expected_stderr = ".*E135000: Error normalizing log message to internal format.*"
svntest.actions.run_and_verify_commit(wc_dir,
None, None,
- "Error normalizing log message to internal format",
+ expected_stderr,
'-F', log_msg_path,
iota_path)
@@ -1941,7 +1898,7 @@ def commit_with_mixed_line_endings_in_ignored_part(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
iota_path)
def from_wc_top_with_bad_editor(sbox):
@@ -1970,12 +1927,10 @@ def from_wc_top_with_bad_editor(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn("Unexpected failure from propset.",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'pset', 'fish', 'food', wc_dir)
os.chdir(wc_dir)
exit_code, out, err = svntest.actions.run_and_verify_svn(
- "Commit succeeded when should have failed.",
None, svntest.verify.AnyOutput,
'--force-interactive',
'ci', '--editor-cmd', 'no_such-editor')
@@ -1995,7 +1950,7 @@ def mods_in_schedule_delete(sbox):
# Schedule a delete, then put in local mods
C_path = sbox.ospath('A/C')
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'rm', C_path)
if not os.path.exists(C_path):
@@ -2011,8 +1966,7 @@ def mods_in_schedule_delete(sbox):
'A/C' : Item(verb='Deleting'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Unversioned file still exists
actual_contents = open(foo_path).read()
@@ -2093,29 +2047,29 @@ def local_mods_are_not_commits(sbox):
expected_error = '.*Local, non-commit operations do not take a log message.*'
# copy wc->wc
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'cp', '-m', 'log msg',
sbox.ospath('iota'),
sbox.ospath('iota2'))
# copy repos->wc
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'cp', '-m', 'log msg',
sbox.repo_url + "/iota",
sbox.ospath('iota2'))
# delete
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'rm', '-m', 'log msg',
sbox.ospath('A/D/gamma'))
# mkdir
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'mkdir', '-m', 'log msg',
sbox.ospath('newdir'))
# rename
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'cp', '-m', 'log msg',
sbox.ospath('A/mu'),
sbox.ospath('A/yu'))
@@ -2147,7 +2101,8 @@ def post_commit_hook_test(sbox):
# filesystem will report an absolute path because that's the way the
# filesystem is created by this test suite.
expected_output = [ "Sending "+ iota_path + "\n",
- "Transmitting file data .\n",
+ "Transmitting file data .done\n",
+ "Committing transaction...\n",
"Committed revision 2.\n",
"\n",
"Warning: " +
@@ -2155,7 +2110,7 @@ def post_commit_hook_test(sbox):
error_msg + "\n",
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'ci', '-m', 'log msg', iota_path)
#----------------------------------------------------------------------
@@ -2184,7 +2139,7 @@ def commit_same_folder_in_targets(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'-N',
wc_dir,
iota_path)
@@ -2212,7 +2167,7 @@ def commit_inconsistent_eol(sbox):
expected_err = ".*iota.*"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'commit', '-m', 'log message',
wc_dir)
@@ -2224,16 +2179,16 @@ def mkdir_with_revprop(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
'--with-revprop', 'bug=42', remote_dir)
expected = svntest.verify.UnorderedOutput(
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '42', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('42', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2243,19 +2198,19 @@ def delete_with_revprop(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
remote_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'delete', '-m', 'msg',
'--with-revprop', 'bug=52', remote_dir)
expected = svntest.verify.UnorderedOutput(
['Unversioned properties on revision 3:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 3, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '52', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('52', [], 'propget', 'bug',
'--revprop', '-r', 3, sbox.repo_url)
@@ -2280,7 +2235,7 @@ def commit_with_revprop(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'-m', 'msg',
'--with-revprop', 'bug=62',
omega_path, gloo_path)
@@ -2289,9 +2244,9 @@ def commit_with_revprop(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '62', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('62', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2305,7 +2260,7 @@ def import_with_revprop(sbox):
os.mkdir(local_dir)
svntest.main.file_write(local_file, "xxxx")
- svntest.actions.run_and_verify_svn(None, None, [], 'import', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'import', '-m', 'msg',
'--with-revprop', 'bug=72', local_dir,
sbox.repo_url)
@@ -2313,9 +2268,9 @@ def import_with_revprop(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '72', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('72', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2326,10 +2281,10 @@ def copy_R2R_with_revprop(sbox):
sbox.build()
remote_dir1 = sbox.repo_url + "/dir1"
remote_dir2 = sbox.repo_url + "/dir2"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
remote_dir1)
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'copy', '-m', 'msg',
'--with-revprop', 'bug=82', remote_dir1,
remote_dir2)
@@ -2337,9 +2292,9 @@ def copy_R2R_with_revprop(sbox):
['Unversioned properties on revision 3:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 3, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '82', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('82', [], 'propget', 'bug',
'--revprop', '-r', 3, sbox.repo_url)
@@ -2350,10 +2305,10 @@ def copy_WC2R_with_revprop(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
local_dir = sbox.ospath('folder')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', local_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'copy', '-m', 'msg',
'--with-revprop', 'bug=92', local_dir,
remote_dir)
@@ -2361,9 +2316,9 @@ def copy_WC2R_with_revprop(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '92', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('92', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2374,10 +2329,10 @@ def move_R2R_with_revprop(sbox):
sbox.build()
remote_dir1 = sbox.repo_url + "/dir1"
remote_dir2 = sbox.repo_url + "/dir2"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
remote_dir1)
- svntest.actions.run_and_verify_svn(None, None, [], 'move', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'move', '-m', 'msg',
'--with-revprop', 'bug=102', remote_dir1,
remote_dir2)
@@ -2385,9 +2340,9 @@ def move_R2R_with_revprop(sbox):
['Unversioned properties on revision 3:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 3, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '102', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('102', [], 'propget', 'bug',
'--revprop', '-r', 3, sbox.repo_url)
@@ -2398,7 +2353,7 @@ def propedit_with_revprop(sbox):
sbox.build()
svntest.main.use_editor('append_foo')
- svntest.actions.run_and_verify_svn(None, None, [], 'propedit', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'propedit', '-m', 'msg',
'--with-revprop', 'bug=112', 'prop',
sbox.repo_url)
@@ -2406,9 +2361,9 @@ def propedit_with_revprop(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '112', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('112', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2419,7 +2374,7 @@ def set_multiple_props_with_revprop(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
'--with-revprop', 'bug=32',
'--with-revprop', 'ref=22', remote_dir)
@@ -2427,11 +2382,11 @@ def set_multiple_props_with_revprop(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n', ' ref\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '32', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('32', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '22', [], 'propget', 'ref',
+ svntest.actions.run_and_verify_svn('22', [], 'propget', 'ref',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2442,7 +2397,7 @@ def use_empty_value_in_revprop_pair(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
'--with-revprop', 'bug=',
'--with-revprop', 'ref=', remote_dir)
@@ -2450,11 +2405,11 @@ def use_empty_value_in_revprop_pair(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n', ' ref\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '', [], 'propget', 'ref',
+ svntest.actions.run_and_verify_svn('', [], 'propget', 'ref',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2464,7 +2419,7 @@ def no_equals_in_revprop_pair(sbox):
sbox.build()
remote_dir = sbox.repo_url + "/dir"
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '-m', 'msg',
'--with-revprop', 'bug',
'--with-revprop', 'ref', remote_dir)
@@ -2472,11 +2427,11 @@ def no_equals_in_revprop_pair(sbox):
['Unversioned properties on revision 2:\n',
' svn:author\n',' svn:date\n', ' svn:log\n',
' bug\n', ' ref\n'])
- svntest.actions.run_and_verify_svn(None, expected, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected, [], 'proplist',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '', [], 'propget', 'bug',
+ svntest.actions.run_and_verify_svn('', [], 'propget', 'bug',
'--revprop', '-r', 2, sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, '', [], 'propget', 'ref',
+ svntest.actions.run_and_verify_svn('', [], 'propget', 'ref',
'--revprop', '-r', 2, sbox.repo_url)
@@ -2488,17 +2443,17 @@ def set_invalid_revprops(sbox):
remote_dir = sbox.repo_url + "/dir"
# Try to set svn: revprops.
expected = '.*Standard properties can\'t.*'
- svntest.actions.run_and_verify_svn(None, [], expected, 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn([], expected, 'mkdir', '-m', 'msg',
'--with-revprop', 'svn:author=42', remote_dir)
- svntest.actions.run_and_verify_svn(None, [], expected, 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn([], expected, 'mkdir', '-m', 'msg',
'--with-revprop', 'svn:log=42', remote_dir)
- svntest.actions.run_and_verify_svn(None, [], expected, 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn([], expected, 'mkdir', '-m', 'msg',
'--with-revprop', 'svn:date=42', remote_dir)
- svntest.actions.run_and_verify_svn(None, [], expected, 'mkdir', '-m', 'msg',
+ svntest.actions.run_and_verify_svn([], expected, 'mkdir', '-m', 'msg',
'--with-revprop', 'svn:foo=bar', remote_dir)
# Empty revprop pair.
- svntest.actions.run_and_verify_svn(None, [],
+ svntest.actions.run_and_verify_svn([],
'svn: E205000: '
'Revision property pair is empty',
'mkdir', '-m', 'msg',
@@ -2546,14 +2501,8 @@ def start_commit_hook_test(sbox):
expected_stderr, actual_stderr)
# Now list the txns in the repo. The list should be empty.
- exit_code, output, errput = svntest.main.run_svnadmin('lstxns',
- sbox.repo_dir)
- svntest.verify.compare_and_display_lines(
- "Error running 'svnadmin lstxns'.",
- 'STDERR', [], errput)
- svntest.verify.compare_and_display_lines(
- "Output of 'svnadmin lstxns' is unexpected.",
- 'STDOUT', [], output)
+ svntest.actions.run_and_verify_svnadmin([], [],
+ 'lstxns', sbox.repo_dir)
#----------------------------------------------------------------------
@Issue(3553)
@@ -2611,21 +2560,21 @@ def versioned_log_message(sbox):
svntest.main.file_append(iota_path, "2")
# try to check in a change using a versioned file as your log entry.
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'ci', '-F', log_path)
# force it. should not produce any errors.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-F', log_path, '--force-log')
svntest.main.file_append(mu_path, "2")
# try the same thing, but specifying the file to commit explicitly.
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'ci', '-F', log_path, mu_path)
# force it... should succeed.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-F', log_path,
'--force-log', mu_path)
@@ -2646,7 +2595,7 @@ def changelist_near_conflict(sbox):
# Create a changelist.
changelist_name = "logical-changeset"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"changelist", changelist_name,
mu_path, gloo_path)
@@ -2662,7 +2611,7 @@ def changelist_near_conflict(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
"--changelist=" + changelist_name,
"-m", "msg", wc_dir)
@@ -2690,13 +2639,11 @@ def commit_out_of_date_file(sbox):
expected_status.tweak("A/D/G/pi", wc_rev=2, status=" ")
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- "-m", "log message", wc_dir)
+ expected_status)
svntest.main.file_append(backup_pi_path, "hello")
expected_err = ".*(pi.*out of date|Out of date.*pi).*"
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'commit', '-m', 'log message',
wc_backup)
@@ -2724,7 +2671,7 @@ def start_commit_detect_capabilities(sbox):
# Commit something.
iota_path = sbox.ospath('iota')
svntest.main.file_append(iota_path, "More stuff in iota")
- svntest.actions.run_and_verify_svn(None, [], [], 'ci', '--quiet',
+ svntest.actions.run_and_verify_svn([], [], 'ci', '--quiet',
'-m', 'log msg', wc_dir)
# Check that "mergeinfo" was detected.
@@ -2756,8 +2703,7 @@ def commit_added_missing(sbox):
os.remove(b_path)
# Commit, hoping to see an error
- svntest.actions.run_and_verify_svn("Commit should have failed",
- [], ".* is scheduled for addition, but is missing",
+ svntest.actions.run_and_verify_svn([], ".* is scheduled for addition, but is missing",
'commit', '-m', 'logmsg', wc_dir)
#----------------------------------------------------------------------
@@ -2783,7 +2729,7 @@ def tree_conflicts_block_commit(sbox):
D = sbox.ospath('A/D')
G = sbox.ospath('A/D/G')
- error_re = "remains in conflict"
+ error_re = ".*remains in conflict.*"
commit_fails_at_path(wc_dir, wc_dir, error_re)
commit_fails_at_path(A, A, error_re)
commit_fails_at_path(D, D, error_re)
@@ -2857,9 +2803,7 @@ def commit_incomplete(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Reported here:
@@ -2909,8 +2853,7 @@ def commit_danglers(sbox):
svntest.actions.run_and_verify_commit(mu_copied,
None,
None,
- expected_error,
- mu_copied)
+ expected_error)
# But now do the same thing via changelist filtering
svntest.main.run_svn(None, 'changelist', 'L', mu_copied, sbox.ospath('A/mu'))
@@ -2955,6 +2898,22 @@ def last_changed_of_copied_subdir(sbox):
}
svntest.actions.run_and_verify_info([expected], E_copied)
+def commit_unversioned(sbox):
+ "verify behavior on unversioned targets"
+
+ sbox.build(read_only=True)
+ wc_dir = sbox.wc_dir
+
+ expected_err = '.*E200009: .*existing.*\' is not under version control.*'
+
+ # Unversioned, but existing file
+ svntest.main.file_write(sbox.ospath('existing'), "xxxx")
+ svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
+ sbox.ospath('existing'))
+
+ # Unversioned, not existing
+ svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err,
+ sbox.ospath('not-existing'))
@Issue(4400)
def commit_cp_with_deep_delete(sbox):
@@ -3004,9 +2963,7 @@ def commit_cp_with_deep_delete(sbox):
# Commit the copy without the one dir.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def commit_deep_deleted(sbox):
"try to commit a deep descendant of a deleted node"
@@ -3018,9 +2975,9 @@ def commit_deep_deleted(sbox):
sbox.simple_propset('k', 'v', 'AA/D/G')
# Committing some added descendant returns a proper error
- expected_err = ('svn: E200009: \'%s\' is not known to exist in the ' +
+ expected_err = ('.*svn: E200009: \'%s\' is not known to exist in the ' +
'repository and is not part of the commit, yet its ' +
- 'child \'%s\' is part of the commit') % (
+ 'child \'%s\' is part of the commit.*') % (
re.escape(os.path.abspath(sbox.ospath('AA'))),
re.escape(os.path.abspath(sbox.ospath('AA/D/G'))))
@@ -3095,7 +3052,7 @@ def commit_mergeinfo_ood(sbox):
' into \'%s\':\n' % sbox.ospath('branch'),
' U %s\n' % sbox.ospath('branch'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c4', '^/trunk',
sbox.ospath('branch'))
@@ -3109,15 +3066,53 @@ def commit_mergeinfo_ood(sbox):
'--- Recording mergeinfo for merge of r5 into \'%s\':\n' % sbox.ospath('branch'),
' U %s\n' % sbox.ospath('branch'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c5', '^/trunk',
sbox.ospath('branch'))
# Currently this commit succeeds with dav over HTTPv2, while it should really fail
expected_err = '.*out of date.*'
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'commit', sbox.ospath(''), '-m', 'M')
+@Issue(2295)
+def mkdir_conflict_proper_error(sbox):
+ "mkdir conflict should produce a proper error"
+
+ sbox.build(create_wc=False)
+ repo_url = sbox.repo_url
+
+ expected_error = "svn: E160020: .* already exists.*'/A'"
+ svntest.actions.run_and_verify_svn(None, expected_error,
+ 'mkdir', repo_url + '/A',
+ '-m', '')
+
+def commit_xml(sbox):
+ "commit an xml file"
+
+ sbox.build()
+
+ sbox.simple_add_text('index.xml', 'index.xml')
+ sbox.simple_add_text('index.html', 'index.html')
+ sbox.simple_propset('svn:mime-type', 'text/xml', 'index.xml')
+ sbox.simple_propset('svn:mime-type', 'text/html', 'index.html')
+
+ # This currently (2015-04-09) makes mod_dav return a 'HTTP/1.1 201 Created'
+ # result with content type text/xml (copied from file), which used to
+ # invoke the error parsing.
+ #
+ # Depending on the Apache version and config, this may cause an xml error.
+ sbox.simple_commit()
+
+ # This currently (2015-04-09) makes mod_dav return a 'HTTP/1.1 204 Updated'
+ # result with content type text/xml (copied from file), which used to
+ # invoke the error parsing.
+ #
+ # Depending on the Apache version and config, this may cause an xml error.
+ sbox.simple_append('index.xml', '<Q></R>', True)
+ sbox.simple_append('index.html', '<Q></R>', True)
+ sbox.simple_commit()
+
########################################################################
# Run the tests
@@ -3189,9 +3184,12 @@ test_list = [ None,
commit_add_subadd,
commit_danglers,
last_changed_of_copied_subdir,
+ commit_unversioned,
commit_cp_with_deep_delete,
commit_deep_deleted,
commit_mergeinfo_ood,
+ mkdir_conflict_proper_error,
+ commit_xml,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/copy_tests.py b/subversion/tests/cmdline/copy_tests.py
index 39a686b..e873ea2 100755
--- a/subversion/tests/cmdline/copy_tests.py
+++ b/subversion/tests/cmdline/copy_tests.py
@@ -25,7 +25,7 @@
######################################################################
# General modules
-import stat, os, re, shutil, logging, sys
+import stat, os, re, shutil, logging
logger = logging.getLogger()
@@ -64,7 +64,7 @@ or a url (when false) copy source is used."""
# File scheduled for deletion
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
# Status before attempting copies
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -77,7 +77,7 @@ or a url (when false) copy source is used."""
else:
pi_src = sbox.repo_url + '/A/D/G/pi'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', pi_src, rho_path)
# Now commit
@@ -91,8 +91,7 @@ or a url (when false) copy source is used."""
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Helper for wc_copy_replace_with_props and
# repos_to_wc_copy_replace_with_props
@@ -113,11 +112,11 @@ def copy_replace_with_props(sbox, wc_copy):
# Set props on file which is copy-source later on
pi_path = sbox.ospath('A/D/G/pi')
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'phony-prop', '-F',
prop_path, pi_path)
os.remove(prop_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:eol-style', 'LF', rho_path)
# Verify props having been set
@@ -139,14 +138,13 @@ def copy_replace_with_props(sbox, wc_copy):
expected_status.tweak('A/D/G/rho', wc_rev='2')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Bring wc into sync
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# File scheduled for deletion
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
# Status before attempting copies
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
@@ -159,7 +157,7 @@ def copy_replace_with_props(sbox, wc_copy):
else:
pi_src = sbox.repo_url + '/A/D/G/pi'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', pi_src, rho_path)
# Verify both content and props have been copied
@@ -184,8 +182,7 @@ def copy_replace_with_props(sbox, wc_copy):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
######################################################################
@@ -282,18 +279,18 @@ def basic_copy_and_move_files(sbox):
svntest.main.file_append(rho_path, 'new appended text for rho')
# Copy rho to D -- local mods
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', rho_path, D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', rho_path, D_path)
# Copy alpha to C -- no local mods, and rename it to 'alpha2' also
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
alpha_path, alpha2_path)
# Move mu to H -- local mods
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
mu_path, H_path)
# Move iota to F -- no local mods
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', iota_path, F_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', iota_path, F_path)
# Created expected output tree for 'svn ci':
# We should see four adds, two deletes, and one change in total.
@@ -324,9 +321,7 @@ def basic_copy_and_move_files(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Issue 1091, alpha2 would now have the wrong checksum and so a
# subsequent commit would fail
@@ -337,17 +332,15 @@ def basic_copy_and_move_files(sbox):
expected_status.tweak('A/C/alpha2', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Assure that attempts at local copy and move fail when a log
# message is provided.
expected_stderr = \
".*Local, non-commit operations do not take a log message"
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'cp', '-m', 'op fails', rho_path, D_path)
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'mv', '-m', 'op fails', rho_path, D_path)
@@ -373,7 +366,7 @@ def receive_copy_in_update(sbox):
newG_path = sbox.ospath('A/B/newG')
# Copy directory A/D to A/B/newG
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', G_path, newG_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', G_path, newG_path)
# Created expected output tree for 'svn ci':
expected_output = svntest.wc.State(wc_dir, {
@@ -391,9 +384,7 @@ def receive_copy_in_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Now update the other working copy; it should receive a full add of
# the newG directory and its contents.
@@ -450,7 +441,7 @@ def resurrect_deleted_dir(sbox):
G_path = sbox.ospath('A/D/G')
# Delete directory A/D/G, commit that as r2.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--force',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force',
G_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -465,14 +456,12 @@ def resurrect_deleted_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Use 'svn cp URL@1 URL' to resurrect the deleted directory, where
# the two URLs are identical. This used to trigger a failure.
url = sbox.repo_url + '/A/D/G'
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
url + '@1', url,
'-m', 'logmsg')
@@ -503,7 +492,7 @@ def copy_deleted_dir_into_prefix(sbox):
D_path = sbox.ospath('A/D')
# Delete directory A/D, commit that as r2.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--force',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force',
D_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -512,15 +501,13 @@ def copy_deleted_dir_into_prefix(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None,
- wc_dir)
+ None)
# Ok, copy from a deleted URL into a prefix of that URL, this used to
# result in an assert failing.
url1 = sbox.repo_url + '/A/D/G'
url2 = sbox.repo_url + '/A/D'
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
url1 + '@1', url2,
'-m', 'logmsg')
@@ -547,20 +534,18 @@ def no_copy_overwrites(sbox):
dirURL2 = sbox.repo_url + "/A/D/H"
# Expect out-of-date failure if 'svn cp URL URL' tries to overwrite a file
- svntest.actions.run_and_verify_svn("Whoa, I was able to overwrite a file!",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cp', fileURL1, fileURL2,
'-m', 'fooogle')
# Create A/D/H/G by running 'svn cp ...A/D/G .../A/D/H'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', dirURL1, dirURL2,
'-m', 'fooogle')
# Repeat the last command. It should *fail* because A/D/H/G already exists.
svntest.actions.run_and_verify_svn(
- "Whoa, I was able to overwrite a directory!",
- None, svntest.verify.AnyOutput,
+ None, ".*'/A/D/H/G'.*",
'cp', dirURL1, dirURL2,
'-m', 'fooogle')
@@ -586,9 +571,9 @@ def no_wc_copy_overwrites(sbox):
# These copies should fail
pi_path = sbox.ospath('A/D/G/pi')
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cp', pi_path, rho_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cp', pi_path, tau_path)
# Status after failed copies should not have changed
@@ -607,7 +592,7 @@ def copy_modify_commit(sbox):
B_path = sbox.ospath('A/B')
B2_path = sbox.ospath('A/B2')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
B_path, B2_path)
alpha_path = sbox.ospath('A/B2/E/alpha')
@@ -620,9 +605,7 @@ def copy_modify_commit(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None,
- wc_dir)
+ None)
#----------------------------------------------------------------------
@@ -637,7 +620,7 @@ def copy_files_with_properties(sbox):
# Set a property on a file
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'pname', 'pval', rho_path)
# and commit it
@@ -647,22 +630,21 @@ def copy_files_with_properties(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/rho', status=' ', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Set another property, but don't commit it yet
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'pname2', 'pval2', rho_path)
# WC to WC copy of file with committed and uncommitted properties
rho_wc_path = sbox.ospath('A/D/G/rho_wc')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', rho_path, rho_wc_path)
# REPOS to WC copy of file with properties
rho_url_path = sbox.ospath('A/D/G/rho_url')
rho_url = sbox.repo_url + '/A/D/G/rho'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', rho_url, rho_url_path)
# Properties are not visible in WC status 'A'
@@ -674,11 +656,11 @@ def copy_files_with_properties(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Check properties explicitly
- svntest.actions.run_and_verify_svn(None, ['pval\n'], [],
+ svntest.actions.run_and_verify_svn(['pval\n'], [],
'propget', 'pname', rho_wc_path)
- svntest.actions.run_and_verify_svn(None, ['pval2\n'], [],
+ svntest.actions.run_and_verify_svn(['pval2\n'], [],
'propget', 'pname2', rho_wc_path)
- svntest.actions.run_and_verify_svn(None, ['pval\n'], [],
+ svntest.actions.run_and_verify_svn(['pval\n'], [],
'propget', 'pname', rho_url_path)
# Commit and properties are visible in status
@@ -694,8 +676,7 @@ def copy_files_with_properties(sbox):
'A/D/G/rho_url' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
#----------------------------------------------------------------------
@@ -710,13 +691,13 @@ def copy_delete_commit(sbox):
B2_path = sbox.ospath('A/B2')
# copy a tree
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
B_path, B2_path)
# delete two files
lambda_path = sbox.ospath('A/B2/lambda')
alpha_path = sbox.ospath('A/B2/E/alpha')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', alpha_path, lambda_path)
# commit copied tree containing a deleted file
@@ -727,18 +708,16 @@ def copy_delete_commit(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None,
- wc_dir)
+ None)
# copy a tree
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A/B'),
sbox.ospath('A/B3'))
# delete a directory
E_path = sbox.ospath('A/B3/E')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', E_path)
# commit copied tree containing a deleted directory
expected_output = svntest.wc.State(wc_dir, {
@@ -747,9 +726,7 @@ def copy_delete_commit(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None,
- wc_dir)
+ None)
#----------------------------------------------------------------------
@@ -764,7 +741,7 @@ def mv_and_revert_directory(sbox):
new_E_path = os.path.join(F_path, 'E')
# Issue 931: move failed to lock the directory being deleted
- svntest.actions.run_and_verify_svn(None, None, [], 'move',
+ svntest.actions.run_and_verify_svn(None, [], 'move',
E_path, F_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B/E/alpha', 'A/B/E/beta', status='D ')
@@ -778,7 +755,7 @@ def mv_and_revert_directory(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Issue 932: revert failed to lock the parent directory
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '--recursive',
new_E_path)
expected_status.remove('A/B/F/E', 'A/B/F/E/alpha', 'A/B/F/E/beta')
expected_status.tweak('A/B/E', moved_to=None)
@@ -803,13 +780,13 @@ def copy_preserve_executable_bit(sbox):
# Create the first file.
svntest.main.file_append(newpath1, "a new file")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', newpath1)
+ svntest.actions.run_and_verify_svn(None, [], 'add', newpath1)
mode1 = os.stat(newpath1)[stat.ST_MODE]
# Doing this to get the executable bit set on systems that support
# that -- the property itself is not the point.
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:executable', 'on', newpath1)
mode2 = os.stat(newpath1)[stat.ST_MODE]
@@ -819,12 +796,12 @@ def copy_preserve_executable_bit(sbox):
raise svntest.Failure
# Commit the file
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'create file and set svn:executable',
wc_dir)
# Copy the file
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', newpath1, newpath2)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', newpath1, newpath2)
mode3 = os.stat(newpath2)[stat.ST_MODE]
@@ -850,17 +827,17 @@ def wc_to_repos(sbox):
# modify some items to be copied
svntest.main.file_append(sbox.ospath('A/D/H/omega'),
"new otext\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'propset', 'foo', 'bar',
+ svntest.actions.run_and_verify_svn(None, [], 'propset', 'foo', 'bar',
beta_path)
# copy a file
- svntest.actions.run_and_verify_svn(None, None, [], '-m', 'fumble file',
+ svntest.actions.run_and_verify_svn(None, [], '-m', 'fumble file',
'copy', beta_path, beta2_url)
# and a directory
- svntest.actions.run_and_verify_svn(None, None, [], '-m', 'fumble dir',
+ svntest.actions.run_and_verify_svn(None, [], '-m', 'fumble dir',
'copy', H_path, H2_url)
# copy a file to a directory
- svntest.actions.run_and_verify_svn(None, None, [], '-m', 'fumble file',
+ svntest.actions.run_and_verify_svn(None, [], '-m', 'fumble file',
'copy', beta_path, H2_url)
# update the working copy. post-update mereinfo elision will remove
@@ -900,7 +877,7 @@ def wc_to_repos(sbox):
expected_status)
# check local property was copied
- svntest.actions.run_and_verify_svn(None, ['bar\n'], [],
+ svntest.actions.run_and_verify_svn(['bar\n'], [],
'propget', 'foo',
beta_path + "2")
@@ -927,8 +904,8 @@ def repos_to_wc(sbox):
pi_url = sbox.repo_url + "/A/D/G/pi"
pi_path = sbox.ospath('pi')
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', E_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', pi_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', E_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', pi_url, wc_dir)
# Extra test: modify file ASAP to check there was a timestamp sleep
svntest.main.file_append(pi_path, 'zig\n')
@@ -955,7 +932,7 @@ def repos_to_wc(sbox):
raise svntest.Failure
# Revert everything and verify.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.main.safe_rmtree(sbox.ospath('E'))
@@ -966,7 +943,7 @@ def repos_to_wc(sbox):
# Copy an empty directory from the same repository, see issue #1444.
C_url = sbox.repo_url + "/A/C"
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', C_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', C_url, wc_dir)
expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
expected_output.add({
@@ -975,7 +952,7 @@ def repos_to_wc(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_output)
# Revert everything and verify.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.main.safe_rmtree(sbox.ospath('C'))
@@ -995,14 +972,14 @@ def repos_to_wc(sbox):
'A %s\n' % sbox.ospath('E/beta'),
'A %s\n' % sbox.ospath('E/alpha'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'copy', E_url, wc_dir)
expected_output = [
'--- Copying from foreign repository URL \'%s\':\n' % pi_url,
'A %s\n' % sbox.ospath('pi'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'copy', pi_url, wc_dir)
expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1015,7 +992,7 @@ def repos_to_wc(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_output)
# Revert everything and verify.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
# URL->wc copy:
@@ -1024,7 +1001,7 @@ def repos_to_wc(sbox):
B_url = sbox.repo_url + "/A/B"
D_dir = sbox.ospath('A/D')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', B_url, D_dir)
expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1038,8 +1015,8 @@ def repos_to_wc(sbox):
})
svntest.actions.run_and_verify_status(wc_dir, expected_output)
- # Validate the merge info of the copy destination (we expect none)
- svntest.actions.run_and_verify_svn(None, [], [],
+ # Validate the mergeinfo of the copy destination (we expect none)
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
'propget', SVN_PROP_MERGEINFO,
os.path.join(D_dir, 'B'))
@@ -1055,7 +1032,7 @@ def copy_to_root(sbox):
root = sbox.repo_url
mu = root + '/A/mu'
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
'-m', '',
mu, root)
@@ -1093,8 +1070,8 @@ def url_copy_parent_into_child(sbox):
F_url = sbox.repo_url + "/A/B/F"
# Issue 1367 parent/child URL-to-URL was rejected.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'cp',
'-m', 'a can of worms',
B_url, F_url)
@@ -1144,7 +1121,7 @@ def wc_copy_parent_into_child(sbox):
# Want a smaller WC
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
B_url, wc_dir)
@@ -1154,9 +1131,9 @@ def wc_copy_parent_into_child(sbox):
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ['Adding copy of .\n',
- '\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Adding copy of .\n',
+ 'Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'cp',
'-m', 'a larger can',
'.', F_B_url)
@@ -1217,7 +1194,7 @@ def resurrect_deleted_file(sbox):
# Delete a file in the repository via immediate commit
rho_url = sbox.repo_url + '/A/D/G/rho'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', rho_url, '-m', 'rev 2')
# Update the wc to HEAD (r2)
@@ -1234,7 +1211,7 @@ def resurrect_deleted_file(sbox):
expected_status)
# repos->wc copy, to resurrect deleted file.
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', rho_url + '@1', wc_dir)
# status should now show the file scheduled for addition-with-history
@@ -1258,11 +1235,11 @@ def diff_repos_to_wc_copy(sbox):
target_wc_path = sbox.ospath('new_file')
# Copy a file from the repository to the working copy.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
iota_repos_path, target_wc_path)
# Run diff.
- svntest.actions.run_and_verify_svn(None, None, [], 'diff', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'diff', wc_dir)
#-------------------------------------------------------------
@@ -1287,20 +1264,20 @@ def repos_to_wc_copy_eol_keywords(sbox):
"Hello\nSubversion\n$LastChangedRevision$\n",
"ab")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:eol-style',
'CRLF', iota_wc_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords',
'Rev', iota_wc_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'log msg',
wc_dir)
# Copy a file from the repository to the working copy.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
iota_repos_path, target_wc_path)
# The original bug was that the copy would seg fault. So we test
@@ -1342,12 +1319,10 @@ def revision_kinds_local_source(sbox):
expected_output = svntest.wc.State(wc_dir, {
'A/mu' : Item(verb='Sending'), })
svntest.main.file_append(mu_path, "New r2 text.\n")
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
svntest.main.file_append(mu_path, "New r3 text.\n")
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r2', mu_path)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r2', mu_path)
svntest.main.file_append(mu_path, "Working copy.\n")
r1 = "This is the file 'mu'.\n"
@@ -1369,10 +1344,10 @@ def revision_kinds_local_source(sbox):
for dst, from_rev, text, peg_rev in sub_tests:
dst_path = os.path.join(wc_dir, dst)
if peg_rev is None:
- svntest.actions.run_and_verify_svn(None, None, [], "copy",
+ svntest.actions.run_and_verify_svn(None, [], "copy",
mu_path, dst_path)
else:
- svntest.actions.run_and_verify_svn(None, None, [], "copy",
+ svntest.actions.run_and_verify_svn(None, [], "copy",
mu_path + "@" + peg_rev, dst_path)
expected_disk.add({ dst: Item(contents=text) })
@@ -1405,10 +1380,10 @@ def copy_over_missing_file(sbox):
os.remove(mu_path)
# Try both wc->wc copy and repos->wc copy, expect failures:
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cp', iota_path, mu_path)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cp', iota_url, mu_path)
# Make sure that the working copy is not corrupted:
@@ -1433,7 +1408,7 @@ def repos_to_wc_1634(sbox):
# First delete a subdirectory and commit.
E_path = sbox.ospath('A/B/E')
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'delete', E_path)
expected_output = svntest.wc.State(wc_dir, {
'A/B/E' : Item(verb='Deleting'),
})
@@ -1441,12 +1416,11 @@ def repos_to_wc_1634(sbox):
expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now copy the directory back.
E_url = sbox.repo_url + "/A/B/E@1"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', E_url, E_path)
expected_status.add({
'A/B/E' : Item(status='A ', copied='+', wc_rev='-'),
@@ -1455,7 +1429,7 @@ def repos_to_wc_1634(sbox):
})
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.add({
'A/B/E' : Item(status='A ', copied='+', wc_rev='-'),
@@ -1475,27 +1449,27 @@ def double_uri_escaping_1814(sbox):
base_url = sbox.repo_url + '/base'
# rev. 2
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'mybase',
base_url)
orig_url = base_url + '/foo%20bar'
# rev. 3
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'r1',
orig_url)
orig_rev = 3
# rev. 4
new_url = base_url + '/foo_bar'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', '-m', 'r2',
orig_url, new_url)
# This had failed with ra_neon because "foo bar" would be double-encoded
# "foo bar" ==> "foo%20bar" ==> "foo%2520bar"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ls', ('-r'+str(orig_rev)),
'-R', base_url)
@@ -1536,7 +1510,7 @@ def wc_to_wc_copy_deleted(sbox):
B2_path = sbox.ospath('A/B2')
# Schedule for delete
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
os.path.join(B_path, 'E', 'alpha'),
os.path.join(B_path, 'lambda'),
os.path.join(B_path, 'F'))
@@ -1553,11 +1527,10 @@ def wc_to_wc_copy_deleted(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Copy including stuff in state not-present
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', B_path, B2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', B_path, B2_path)
expected_status.add({
'A/B2' : Item(status='A ', wc_rev='-', copied='+'),
'A/B2/E' : Item(status=' ', wc_rev='-', copied='+'),
@@ -1574,7 +1547,7 @@ def wc_to_wc_copy_deleted(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Revert the entire copy including the schedule not-present bits
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '--recursive',
B2_path)
expected_status.remove('A/B2',
'A/B2/E',
@@ -1586,7 +1559,7 @@ def wc_to_wc_copy_deleted(sbox):
svntest.main.safe_rmtree(B2_path)
# Copy again and commit
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', B_path, B2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', B_path, B2_path)
expected_status.add({
'A/B2' : Item(status='A ', copied='+', wc_rev='-'),
@@ -1610,8 +1583,7 @@ def wc_to_wc_copy_deleted(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Test for copy into a non-existent URL path
@@ -1655,11 +1627,11 @@ def non_existent_url_to_url(sbox):
pi_url = sbox.repo_url + '/A/D/G/pi'
new_url = sbox.repo_url + '/newfile'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete',
adg_url, '-m', '')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
pi_url + '@1', new_url,
'-m', '')
@@ -1676,19 +1648,19 @@ def old_dir_url_to_url(sbox):
new_url = sbox.repo_url + '/newfile'
# Delete a directory
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete',
adg_url, '-m', '')
# Copy a file to where the directory used to be
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
iota_url, adg_url,
'-m', '')
# Try copying a file that was in the deleted directory that is now a
# file
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
pi_url + '@1', new_url,
'-m', '')
@@ -1710,7 +1682,7 @@ def wc_copy_dir_to_itself(sbox):
dir_path = os.path.join(wc_dir, dirname)
# try to copy dir to itself
- svntest.actions.run_and_verify_svn(None, [],
+ svntest.actions.run_and_verify_svn([],
'.*Cannot copy .* into its own child.*',
'copy', dir_path, dir_path)
@@ -1742,28 +1714,55 @@ def mixed_wc_to_url(sbox):
rho_path = sbox.ospath('A/D/G/rho')
# Remove A/D/G/pi, then commit that removal.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', pi_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'rm', pi_path)
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', "Delete pi.", wc_dir)
# Make a modification to A/D/G/rho, then commit that modification.
svntest.main.file_append(rho_path, "\nFirst modification to rho.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', "Modify rho.", wc_dir)
# Make another modification to A/D/G/rho, but don't commit it.
svntest.main.file_append(rho_path, "Second modification to rho.\n")
# Copy into the source, delete part of the copy, add a non-copied directory
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', B_path, X_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', Y_path)
# Now copy local A/D/G to create new directory A/D/Z the repository.
- svntest.actions.run_and_verify_svn(None, None, [],
+
+ expected_status = svntest.wc.State(G_path, {
+ '' : Item(status=' ', wc_rev='1'),
+ 'X' : Item(status='A ', copied='+', wc_rev='-'),
+ 'X/F' : Item(status=' ', copied='+', wc_rev='-'),
+ 'X/E' : Item(status=' ', copied='+', wc_rev='-'),
+ 'X/E/alpha' : Item(status='D ', copied='+', wc_rev='-'),
+ 'X/E/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'X/lambda' : Item(status=' ', copied='+', wc_rev='-'),
+ 'Y' : Item(status='A ', wc_rev='-'),
+ 'rho' : Item(status='M ', wc_rev='3'),
+ 'tau' : Item(status=' ', wc_rev='1'),
+ })
+
+ svntest.actions.run_and_verify_status(G_path, expected_status)
+
+ expected_output = svntest.verify.UnorderedOutput([
+ 'Adding copy of %s\n' % sbox.ospath('A/D/G'),
+ 'Adding copy of %s\n' % sbox.ospath('A/D/G/X'),
+ 'Deleting copy of %s\n' % sbox.ospath('A/D/G/X/E/alpha'),
+ 'Adding copy of %s\n' % sbox.ospath('A/D/G/Y'),
+ 'Deleting copy of %s\n' % sbox.ospath('A/D/G/pi'),
+ 'Replacing copy of %s\n' % sbox.ospath('A/D/G/rho'),
+ 'Transmitting file data .done\n',
+ 'Committing transaction...\n',
+ 'Committed revision 4.\n',
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
'cp', '-m', "Make a copy.",
G_path, Z_url)
expected_output = svntest.verify.UnorderedOutput([
@@ -1778,12 +1777,12 @@ def mixed_wc_to_url(sbox):
'A + A/D/Z/rho\n',
' (from A/D/G/rho:r3)\n',
])
- svntest.actions.run_and_verify_svnlook(None, expected_output, [],
+ svntest.actions.run_and_verify_svnlook(expected_output, [],
'changed', sbox.repo_dir,
'--copy-info')
# Copy from copied source
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', "Make a copy.",
E_path, Z2_url)
expected_output = svntest.verify.UnorderedOutput([
@@ -1791,14 +1790,14 @@ def mixed_wc_to_url(sbox):
' (from A/B/E/:r1)\n',
'D A/D/Z2/alpha\n',
])
- svntest.actions.run_and_verify_svnlook(None, expected_output, [],
+ svntest.actions.run_and_verify_svnlook(expected_output, [],
'changed', sbox.repo_dir,
'--copy-info')
# Check out A/D/Z. If it has pi, that's a bug; or if its rho does
# not have the second local mod, that's also a bug.
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', Z_url, wc_dir)
if os.path.exists(sbox.ospath('pi')):
@@ -1848,7 +1847,7 @@ def delete_replaced_file(sbox):
# File scheduled for deletion.
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
# Status before attempting copies
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1857,14 +1856,14 @@ def delete_replaced_file(sbox):
# Copy 'pi' over 'rho' with history.
pi_src = sbox.ospath('A/D/G/pi')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', pi_src, rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', pi_src, rho_path)
# Check that file copied.
expected_status.tweak('A/D/G/rho', status='R ', copied='+', wc_rev='-')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now delete replaced file.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
'--force', rho_path)
# Verify status after deletion.
@@ -1889,13 +1888,13 @@ def mv_unversioned_file(sbox):
svntest.main.file_append(unver_path_2, "another unversioned file")
# Try to move an unversioned file.
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*unversioned1' " +
"(does not exist|is not under version control)",
'mv', unver_path_1, dest_path_1)
# Try to forcibly move an unversioned file.
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*unversioned2.* " +
"(does not exist|is not under version control)",
'mv',
@@ -1932,7 +1931,7 @@ def force_move(sbox):
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, move_output,
+ svntest.actions.run_and_verify_svn(move_output,
[],
'move',
file_name, "dest")
@@ -1959,9 +1958,8 @@ def force_move(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn('Cat file', expected_file_content, [],
+ expected_status)
+ svntest.actions.run_and_verify_svn(expected_file_content, [],
'cat',
sbox.repo_url + '/dest')
@@ -1979,11 +1977,11 @@ def copy_copied_file_and_dir(sbox):
rho_copy_path_2 = sbox.ospath('A/B/F/rho_copy_2')
# Copy A/D/G/rho to A/D/rho_copy_1
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
rho_path, rho_copy_path_1)
# Copy the copied file: A/D/rho_copy_1 to A/B/F/rho_copy_2
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
rho_copy_path_1, rho_copy_path_2)
E_path = sbox.ospath('A/B/E')
@@ -1991,11 +1989,11 @@ def copy_copied_file_and_dir(sbox):
E_path_copy_2 = sbox.ospath('A/D/G/E_copy_2')
# Copy A/B/E to A/B/F/E_copy_1
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
E_path, E_path_copy_1)
# Copy the copied dir: A/B/F/E_copy_1 to A/D/G/E_copy_2
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
E_path_copy_1, E_path_copy_2)
# Created expected output tree for 'svn ci':
@@ -2021,9 +2019,7 @@ def copy_copied_file_and_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_copied_file_and_dir(sbox):
@@ -2037,11 +2033,11 @@ def move_copied_file_and_dir(sbox):
rho_copy_move_path = sbox.ospath('A/B/F/rho_copy_moved')
# Copy A/D/G/rho to A/D/rho_copy
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
rho_path, rho_copy_path)
# Move the copied file: A/D/rho_copy to A/B/F/rho_copy_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
rho_copy_path, rho_copy_move_path)
E_path = sbox.ospath('A/B/E')
@@ -2049,11 +2045,11 @@ def move_copied_file_and_dir(sbox):
E_path_copy_move = sbox.ospath('A/D/G/E_copy_moved')
# Copy A/B/E to A/B/F/E_copy
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
E_path, E_path_copy)
# Move the copied file: A/B/F/E_copy to A/D/G/E_copy_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
E_path_copy, E_path_copy_move)
# Created expected output tree for 'svn ci':
@@ -2076,9 +2072,7 @@ def move_copied_file_and_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_moved_file_and_dir(sbox):
@@ -2092,11 +2086,11 @@ def move_moved_file_and_dir(sbox):
rho_move_moved_path = sbox.ospath('A/B/F/rho_move_moved')
# Move A/D/G/rho to A/D/rho_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
rho_path, rho_move_path)
# Move the moved file: A/D/rho_moved to A/B/F/rho_move_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
rho_move_path, rho_move_moved_path)
E_path = sbox.ospath('A/B/E')
@@ -2104,11 +2098,11 @@ def move_moved_file_and_dir(sbox):
E_path_move_moved = sbox.ospath('A/D/G/E_move_moved')
# Copy A/B/E to A/B/F/E_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
E_path, E_path_moved)
# Move the moved file: A/B/F/E_moved to A/D/G/E_move_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
E_path_moved, E_path_move_moved)
# Created expected output tree for 'svn ci':
@@ -2135,9 +2129,7 @@ def move_moved_file_and_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_file_within_moved_dir(sbox):
@@ -2150,7 +2142,7 @@ def move_file_within_moved_dir(sbox):
D_path_moved = sbox.ospath('A/B/F/D_moved')
# Move A/B/D to A/B/F/D_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
D_path, D_path_moved)
chi_path = sbox.ospath('A/B/F/D_moved/H/chi')
@@ -2161,9 +2153,9 @@ def move_file_within_moved_dir(sbox):
# Move A/B/F/D_moved/H/chi to A/B/F/D_moved/H/chi_moved
# then move that to A/B/F/D_moved/H/chi_moved_again
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
chi_path, chi_moved_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
chi_moved_path,
chi_moved_again_path)
@@ -2204,9 +2196,7 @@ def move_file_within_moved_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_file_out_of_moved_dir(sbox):
@@ -2219,7 +2209,7 @@ def move_file_out_of_moved_dir(sbox):
D_path_moved = sbox.ospath('A/B/F/D_moved')
# Move A/B/D to A/B/F/D_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
D_path, D_path_moved)
chi_path = sbox.ospath('A/B/F/D_moved/H/chi')
@@ -2229,9 +2219,9 @@ def move_file_out_of_moved_dir(sbox):
# Move A/B/F/D_moved/H/chi to A/B/F/D_moved/H/chi_moved
# then move that to A/C/chi_moved_again
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
chi_path, chi_moved_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
chi_moved_path,
chi_moved_again_path)
@@ -2272,9 +2262,7 @@ def move_file_out_of_moved_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_dir_within_moved_dir(sbox):
@@ -2287,7 +2275,7 @@ def move_dir_within_moved_dir(sbox):
D_path_moved = sbox.ospath('A/B/F/D_moved')
# Move A/D to A/B/F/D_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
D_path, D_path_moved)
H_path = sbox.ospath('A/B/F/D_moved/H')
@@ -2297,9 +2285,9 @@ def move_dir_within_moved_dir(sbox):
# Move A/B/F/D_moved/H to A/B/F/D_moved/H_moved
# then move that to A/B/F/D_moved/H_moved_again
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
H_path, H_moved_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
H_moved_path,
H_moved_again_path)
@@ -2340,9 +2328,7 @@ def move_dir_within_moved_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def move_dir_out_of_moved_dir(sbox):
@@ -2355,7 +2341,7 @@ def move_dir_out_of_moved_dir(sbox):
D_path_moved = sbox.ospath('A/B/F/D_moved')
# Move A/D to A/B/F/D_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
D_path, D_path_moved)
H_path = sbox.ospath('A/B/F/D_moved/H')
@@ -2364,9 +2350,9 @@ def move_dir_out_of_moved_dir(sbox):
# Move A/B/F/D_moved/H to A/B/F/D_moved/H_moved
# then move that to A/C/H_moved_again
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
H_path, H_moved_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
H_moved_path,
H_moved_again_path)
@@ -2407,9 +2393,7 @@ def move_dir_out_of_moved_dir(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Includes regression testing for issue #3429 ("svn mv A B; svn mv B A"
# generates replace without history).
@@ -2424,9 +2408,9 @@ def move_file_back_and_forth(sbox):
rho_move_path = sbox.ospath('A/D/rho_moved')
# Move A/D/G/rho away from and then back to its original path
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
rho_path, rho_move_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
rho_move_path, rho_path)
# Check expected status before commit
@@ -2438,9 +2422,7 @@ def move_file_back_and_forth(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Includes regression testing for issue #3429 ("svn mv A B; svn mv B A"
@@ -2456,13 +2438,13 @@ def move_dir_back_and_forth(sbox):
D_move_path = sbox.ospath('D_moved')
# Move A/D to D_moved
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
D_path, D_move_path)
# Move the moved dir: D_moved back to its starting
# location at A/D.
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', D_move_path, D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', D_move_path, D_path)
# Verify that the status indicates a replace with history
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -2477,7 +2459,7 @@ def copy_move_added_paths(sbox):
# Create a new file and schedule it for addition
upsilon_path = sbox.ospath('A/D/upsilon')
svntest.main.file_write(upsilon_path, "This is the file 'upsilon'\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', upsilon_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', upsilon_path)
# Create a dir with children and schedule it for addition
I_path = sbox.ospath('A/D/I')
@@ -2490,12 +2472,12 @@ def copy_move_added_paths(sbox):
svntest.main.file_write(eta_path, "This is the file 'eta'\n")
svntest.main.file_write(theta_path, "This is the file 'theta'\n")
svntest.main.file_write(kappa_path, "This is the file 'kappa'\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', I_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', I_path)
# Create another dir and schedule it for addition
K_path = sbox.ospath('K')
os.mkdir(K_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', K_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', K_path)
# Verify all the adds took place correctly.
expected_status_after_adds = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -2522,30 +2504,30 @@ def copy_move_added_paths(sbox):
# Copy added dir A/D/I to added dir K/I
I_copy_path = os.path.join(K_path, 'I')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
I_path, I_copy_path)
# Copy added file A/D/upsilon into added dir K
upsilon_copy_path = os.path.join(K_path, 'upsilon')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
upsilon_path, upsilon_copy_path)
# Move added file A/D/upsilon to upsilon,
# then move it again to A/upsilon
upsilon_move_path = sbox.ospath('upsilon')
upsilon_move_path_2 = sbox.ospath('A/upsilon')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
upsilon_path, upsilon_move_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
upsilon_move_path, upsilon_move_path_2)
# Move added dir A/D/I to A/B/I,
# then move it again to A/D/H/I
I_move_path = sbox.ospath('A/B/I')
I_move_path_2 = sbox.ospath('A/D/H/I')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
I_path, I_move_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
I_move_path, I_move_path_2)
# Created expected output tree for 'svn ci'
@@ -2585,9 +2567,7 @@ def copy_move_added_paths(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Run_and_verify_commit() doesn't handle status of unversioned paths
# so manually confirm unversioned paths got copied and moved too.
@@ -2614,15 +2594,15 @@ def copy_added_paths_with_props(sbox):
# Create a new file, schedule it for addition and set properties
upsilon_path = sbox.ospath('A/D/upsilon')
svntest.main.file_write(upsilon_path, "This is the file 'upsilon'\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', upsilon_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'add', upsilon_path)
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'foo', 'bar', upsilon_path)
# Create a dir and schedule it for addition and set properties
I_path = sbox.ospath('A/D/I')
os.mkdir(I_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', I_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'add', I_path)
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'foo', 'bar', I_path)
# Verify all the adds took place correctly.
@@ -2644,12 +2624,12 @@ def copy_added_paths_with_props(sbox):
# Copy added dir I to dir A/C
I_copy_path = sbox.ospath('A/C/I')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
I_path, I_copy_path)
# Copy added file A/upsilon into dir A/C
upsilon_copy_path = sbox.ospath('A/C/upsilon')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
upsilon_path, upsilon_copy_path)
# Created expected output tree for 'svn ci'
@@ -2678,9 +2658,7 @@ def copy_added_paths_with_props(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk.old_tree(), True)
def copy_added_paths_to_URL(sbox):
@@ -2692,7 +2670,7 @@ def copy_added_paths_to_URL(sbox):
# Create a new file and schedule it for addition
upsilon_path = sbox.ospath('A/D/upsilon')
svntest.main.file_write(upsilon_path, "This is the file 'upsilon'\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', upsilon_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', upsilon_path)
# Create a dir with children and schedule it for addition
I_path = sbox.ospath('A/D/I')
@@ -2705,7 +2683,7 @@ def copy_added_paths_to_URL(sbox):
svntest.main.file_write(eta_path, "This is the file 'eta'\n")
svntest.main.file_write(theta_path, "This is the file 'theta'\n")
svntest.main.file_write(kappa_path, "This is the file 'kappa'\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', I_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', I_path)
# Verify all the adds took place correctly.
expected_status_after_adds = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -2732,18 +2710,18 @@ def copy_added_paths_to_URL(sbox):
# Copy added file A/D/upsilon to URL://A/C/upsilon
upsilon_copy_URL = sbox.repo_url + '/A/C/upsilon'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', '',
upsilon_path, upsilon_copy_URL)
- # Validate the merge info of the copy destination (we expect none).
- svntest.actions.run_and_verify_svn(None, [], [],
+ # Validate the mergeinfo of the copy destination (we expect none).
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
'propget',
SVN_PROP_MERGEINFO, upsilon_copy_URL)
# Copy added dir A/D/I to URL://A/D/G/I
I_copy_URL = sbox.repo_url + '/A/D/G/I'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', '',
I_path, I_copy_URL)
@@ -2770,9 +2748,7 @@ def copy_added_paths_to_URL(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Created expected output for update
expected_output = svntest.wc.State(wc_dir, {
@@ -2931,7 +2907,7 @@ def move_multiple_wc(sbox):
C_path = sbox.ospath('A/C')
# Move chi, psi, omega and E to A/C
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', chi_path, psi_path,
+ svntest.actions.run_and_verify_svn(None, [], 'mv', chi_path, psi_path,
omega_path, E_path, C_path)
# Create expected output
@@ -2965,9 +2941,7 @@ def move_multiple_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -2986,7 +2960,7 @@ def copy_multiple_wc(sbox):
C_path = sbox.ospath('A/C')
# Copy chi, psi, omega and E to A/C
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', chi_path, psi_path,
+ svntest.actions.run_and_verify_svn(None, [], 'cp', chi_path, psi_path,
omega_path, E_path, C_path)
# Create expected output
@@ -3012,9 +2986,7 @@ def copy_multiple_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -3034,7 +3006,7 @@ def move_multiple_repo(sbox):
# Move three files and a directory in the repo to a different location
# in the repo
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
chi_url, psi_url, omega_url, E_url, C_url,
'-m', 'logmsg')
@@ -3100,7 +3072,7 @@ def copy_multiple_repo(sbox):
# Copy three files and a directory in the repo to a different location
# in the repo
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
chi_url, psi_url, omega_url, E_url, C_url,
'-m', 'logmsg')
@@ -3158,12 +3130,12 @@ def copy_multiple_repo_wc(sbox):
# We need this in order to check that we don't end up with URI-encoded
# paths in the WC (issue #2955)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', '-m', 'log_msg',
+ svntest.actions.run_and_verify_svn(None, [], 'mv', '-m', 'log_msg',
sbox.repo_url + '/A/D/H/omega',
omega_with_space_url)
# Perform the copy and check the output
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
chi_url, psi_url, omega_with_space_url,
E_url, C_path)
@@ -3187,8 +3159,7 @@ def copy_multiple_repo_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -3207,7 +3178,7 @@ def copy_multiple_wc_repo(sbox):
C_url = sbox.repo_url + '/A/C'
# Perform the copy and check the output
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
chi_path, psi_path, omega_path, E_path,
C_url, '-m', 'logmsg')
@@ -3268,27 +3239,27 @@ def copy_peg_rev_local_files(sbox):
# Play a shell game with some WC files, then commit the changes back
# to the repository (making r2).
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
psi_path, new_iota_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
iota_path, psi_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
new_iota_path, iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 2',
wc_dir)
# Copy using a peg rev (remember, the object at iota_path at HEAD
# was at psi_path back at r1).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
iota_path + '@HEAD', '-r', '1',
sigma_path)
# Commit and verify disk contents
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', 'rev 3')
@@ -3321,46 +3292,46 @@ def copy_peg_rev_local_dirs(sbox):
alpha_path = os.path.join(E_path, 'alpha')
# Make some changes to the repository
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 2',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv',
E_path, I_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 3',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv',
G_path, E_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 4',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv',
I_path, G_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 5',
wc_dir)
# Copy using a peg rev
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
G_path + '@HEAD', '-r', '1',
J_path)
# Commit and verify disk contents
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', 'rev 6')
@@ -3406,14 +3377,14 @@ def copy_peg_rev_url(sbox):
iota_text = "This is the file 'iota'.\n"
# Make some changes to the repository
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
psi_path, new_iota_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
iota_path, psi_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
new_iota_path, iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci',
'-m', 'rev 2',
wc_dir)
@@ -3421,13 +3392,13 @@ def copy_peg_rev_url(sbox):
# Copy using a peg rev
# Add an empty peg specifier ('@') to sigma_url when copying, to test for
# issue #3651 "svn copy does not eat peg revision within copy target path".
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
iota_url + '@HEAD', '-r', '1',
sigma_url + '@', '-m', 'rev 3')
# Validate the copy destination's mergeinfo (we expect none).
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
'propget', SVN_PROP_MERGEINFO, sigma_url)
# Update to HEAD and verify disk contents
@@ -3465,15 +3436,15 @@ def old_dir_wc_to_wc(sbox):
alpha_url = E_url + '/alpha'
# delete E/alpha in r2
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '-m', '', alpha_url)
# delete E in r3
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '-m', '', E_url)
# Copy an old revision of E into a new path in the WC
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-r1', E, E2)
# Create expected output tree.
@@ -3491,9 +3462,7 @@ def old_dir_wc_to_wc(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -3509,7 +3478,7 @@ def copy_make_parents_wc_wc(sbox):
new_iota_path = sbox.ospath('X/Y/Z/iota')
# Copy iota
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
iota_path, new_iota_path)
# Create expected output
@@ -3533,9 +3502,7 @@ def copy_make_parents_wc_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Test copying and creating parents from the repo to the wc
@@ -3550,7 +3517,7 @@ def copy_make_parents_repo_wc(sbox):
new_iota_path = sbox.ospath('X/Y/Z/iota')
# Copy iota
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '--parents',
iota_url, new_iota_path)
@@ -3575,9 +3542,7 @@ def copy_make_parents_repo_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -3593,7 +3558,7 @@ def copy_make_parents_wc_repo(sbox):
new_iota_url = sbox.repo_url + '/X/Y/Z/iota'
# Copy iota
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '--parents',
'-m', 'log msg',
iota_path, new_iota_url)
@@ -3641,7 +3606,7 @@ def copy_make_parents_repo_repo(sbox):
new_iota_url = sbox.repo_url + '/X/Y/Z/iota'
# Copy iota
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '--parents',
'-m', 'log msg',
iota_url, new_iota_url)
@@ -3752,7 +3717,7 @@ def URI_encoded_repos_to_wc(sbox):
})
# Make a copy
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'copy',
sbox.repo_url + '/' + URL_rel_path,
os.path.join(wc_dir,
@@ -3762,8 +3727,7 @@ def URI_encoded_repos_to_wc(sbox):
{dest_name : Item(verb='Adding')})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
copy_URL_to_WC('A', 'A COPY', 2)
copy_URL_to_WC('A COPY', 'A_COPY_2', 3)
@@ -3784,7 +3748,6 @@ def allow_unversioned_parent_for_copy_src(sbox):
# Copy the wc-in-unversioned-parent working copy to our original wc.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'cp',
wc2_dir,
@@ -3830,7 +3793,7 @@ def unneeded_parents(sbox):
A_url = sbox.repo_url + '/A'
# The --parents is unnecessary, but should still work (not segfault).
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
'-m', 'log msg', iota_url, A_url)
# Verify that it worked.
@@ -3859,7 +3822,7 @@ def double_parents_with_url(sbox):
Z_url = sbox.repo_url + '/A/B/Z'
# --parents shouldn't result in a double commit of the same directory.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
'-m', 'log msg', E_url, Z_url)
# Verify that it worked.
@@ -3901,12 +3864,11 @@ def copy_into_missing_dir(sbox):
# svn: Error processing command 'modify-entry' in '.'
# svn: Error modifying entry for 'A'
# svn: Entry 'A' is already under version control
- svntest.actions.run_and_verify_svn(None,
- None, ".*: Path '.*' is not a directory",
+ svntest.actions.run_and_verify_svn(None, ".*: Path '.*' is not a directory",
'cp', iota_path, A_path)
# 'cleanup' should not error.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cleanup', wc_dir)
@@ -3946,12 +3908,12 @@ def find_copyfrom_information_upstairs(sbox):
A2_path = sbox.ospath('A2')
B2_path = os.path.join(A2_path, 'B')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', A_path, A2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', A_path, A2_path)
saved_cwd = os.getcwd()
try:
os.chdir(B2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', 'blah')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', 'lambda', 'blah')
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', 'blah')
+ svntest.actions.run_and_verify_svn(None, [], 'mv', 'lambda', 'blah')
finally:
os.chdir(saved_cwd)
@@ -3989,9 +3951,9 @@ def path_move_and_copy_between_wcs_2475(sbox):
# Do a checkout, and verify the resulting output and disk contents.
svntest.actions.run_and_verify_checkout(repo_url2,
- wc2_dir,
- expected_output,
- expected_wc)
+ wc2_dir,
+ expected_output,
+ expected_wc)
# Copy a file from wc to wc2
mu_path = sbox.ospath('A/mu')
@@ -4071,10 +4033,10 @@ def commit_copy_depth_empty(sbox):
a = sbox.ospath('A')
new_a = sbox.ospath('new_A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', a, new_a)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
new_a, '--depth', 'empty',
'-m', 'Copied directory')
@@ -4089,12 +4051,12 @@ def copy_below_copy(sbox):
new_A_mu = os.path.join(new_A, 'mu')
new_A_new_mu = os.path.join(new_A, 'new_mu')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', A, new_A)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', new_A_D, new_A_new_D)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', new_A_mu, new_A_new_mu)
expected_output = svntest.wc.State(sbox.wc_dir, {
@@ -4139,8 +4101,7 @@ def copy_below_copy(sbox):
svntest.actions.run_and_verify_commit(sbox.wc_dir,
expected_output,
- expected_status,
- None, sbox.wc_dir)
+ expected_status)
def move_below_move(sbox):
"move a dir below a moved dir"
@@ -4153,12 +4114,12 @@ def move_below_move(sbox):
new_A_mu = os.path.join(new_A, 'mu')
new_A_new_mu = os.path.join(new_A, 'new_mu')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', A, new_A)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', new_A_D, new_A_new_D)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', new_A_mu, new_A_new_mu)
expected_output = svntest.wc.State(sbox.wc_dir, {
@@ -4201,8 +4162,7 @@ def move_below_move(sbox):
svntest.actions.run_and_verify_commit(sbox.wc_dir,
expected_output,
- expected_status,
- None, sbox.wc_dir)
+ expected_status)
def reverse_merge_move(sbox):
@@ -4218,10 +4178,10 @@ def reverse_merge_move(sbox):
# Create another working copy path and checkout.
wc2_dir = sbox.add_wc_path('2')
- rav_svn(None, None, [], 'co', sbox.repo_url, wc2_dir)
+ rav_svn(None, [], 'co', sbox.repo_url, wc2_dir)
# Update working directory and ensure that we are at revision 1.
- rav_svn(None, exp_noop_up_out(1), [], 'up', wc_dir)
+ rav_svn(exp_noop_up_out(1), [], 'up', wc_dir)
# Add new folder and file, later commit
new_path = os.path.join(a_dir, 'New')
@@ -4229,21 +4189,21 @@ def reverse_merge_move(sbox):
first_path = os.path.join(new_path, 'first')
svntest.main.file_append(first_path, 'appended first text')
svntest.main.run_svn(None, "add", new_path)
- rav_svn(None, None, [], 'ci', wc_dir, '-m', 'Add new folder %s' % new_path)
- rav_svn(None, exp_noop_up_out(2), [], 'up', wc_dir)
+ rav_svn(None, [], 'ci', wc_dir, '-m', 'Add new folder %s' % new_path)
+ rav_svn(exp_noop_up_out(2), [], 'up', wc_dir)
# Reverse merge to revert previous changes and commit
- rav_svn(None, None, [], 'merge', '-c', '-2', a_repo_url, a_dir)
- rav_svn(None, None, [], 'ci', '-m', 'Reverting svn merge -c -2.', a_dir)
- rav_svn(None, exp_noop_up_out(3), [], 'up', wc_dir)
+ rav_svn(None, [], 'merge', '-c', '-2', a_repo_url, a_dir)
+ rav_svn(None, [], 'ci', '-m', 'Reverting svn merge -c -2.', a_dir)
+ rav_svn(exp_noop_up_out(3), [], 'up', wc_dir)
# Reverse merge again to undo last revert.
- rav_svn(None, None, [], 'merge', '-c', '-3', a_repo_url, a_dir)
+ rav_svn(None, [], 'merge', '-c', '-3', a_repo_url, a_dir)
# Move new added file to another one and commit.
second_path = os.path.join(new_path, 'second')
- rav_svn(None, None, [], 'move', first_path, second_path)
- rav_svn(None, "Adding.*New|Adding.*first||Committed revision 4.", [],
+ rav_svn(None, [], 'move', first_path, second_path)
+ rav_svn("Adding.*New|Adding.*first||Committed revision 4.", [],
'ci', '-m',
'Revert svn merge. svn mv %s %s.' % (first_path, second_path), a_dir)
@@ -4323,7 +4283,7 @@ def nonrecursive_commit_of_copy(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir, '--depth', 'immediates')
# Regression test for issue #3474 - making a new subdir, moving files into it
@@ -4342,9 +4302,9 @@ def copy_added_dir_with_copy(sbox):
# Alias for svntest.actions.run_and_verify_svn
rav_svn = svntest.actions.run_and_verify_svn
- rav_svn(None, None, [], 'mkdir', new_dir)
- rav_svn(None, None, [], 'cp', sbox.ospath('A/mu'), new_dir)
- rav_svn(None, None, [], 'cp', new_dir, new_dir2)
+ rav_svn(None, [], 'mkdir', new_dir)
+ rav_svn(None, [], 'cp', sbox.ospath('A/mu'), new_dir)
+ rav_svn(None, [], 'cp', new_dir, new_dir2)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -4359,7 +4319,7 @@ def copy_added_dir_with_copy(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# move of added dir also retains copy history of children
- rav_svn(None, None, [], 'mv', new_dir, new_dir3)
+ rav_svn(None, [], 'mv', new_dir, new_dir3)
expected_status.remove('NewDir', 'NewDir/mu')
expected_status.add(
{
@@ -4386,7 +4346,7 @@ def copy_broken_symlink(sbox):
sbox.simple_add_symlink('linktarget', 'new_symlink')
- rav_svn(None, None, [], 'cp', new_symlink, copied_symlink)
+ rav_svn(None, [], 'cp', new_symlink, copied_symlink)
# Check whether both new_symlink and copied_symlink are added to the
# working copy
@@ -4405,15 +4365,15 @@ def move_dir_containing_move(sbox):
"""move a directory containing moved node"""
sbox.build()
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B/E/alpha'),
sbox.ospath('A/B/E/alpha_moved'))
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B/F'),
sbox.ospath('A/B/F_moved'))
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B'),
sbox.ospath('A/B_tmp'))
@@ -4444,7 +4404,7 @@ def move_dir_containing_move(sbox):
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B_tmp'),
sbox.ospath('A/B_moved'))
expected_status.tweak('A/B', moved_to='A/B_moved')
@@ -4502,8 +4462,7 @@ def move_dir_containing_move(sbox):
'A/B_moved/F_moved', moved_from=None)
svntest.actions.run_and_verify_commit(sbox.wc_dir,
expected_output,
- expected_status,
- None, sbox.wc_dir)
+ expected_status)
def copy_dir_with_space(sbox):
"""copy a directory with whitespace to one without"""
@@ -4511,11 +4470,11 @@ def copy_dir_with_space(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A/B/E'),
sbox.ospath('E with spaces'))
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A/B/E/alpha'),
sbox.ospath('E with spaces/al pha'))
@@ -4532,15 +4491,14 @@ def copy_dir_with_space(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('E with spaces'),
sbox.ospath('E also spaces')
)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('E with spaces/al pha'),
sbox.ospath('E also spaces/al b')
)
@@ -4558,15 +4516,14 @@ def copy_dir_with_space(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('E with spaces'),
sbox.ospath('E new spaces')
)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('E new spaces/al pha'),
sbox.ospath('E also spaces/al c')
)
@@ -4591,8 +4548,7 @@ def copy_dir_with_space(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Regression test for issue #3676
@Issue(3676)
@@ -4606,13 +4562,13 @@ def changed_data_should_match_checkout(sbox):
verify_dir = sbox.add_wc_path('verify')
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', A_B_E, E_new)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', A_B_E, E_new)
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'co', sbox.repo_url, verify_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'co', sbox.repo_url, verify_dir)
was_cwd = os.getcwd()
os.chdir(verify_dir)
@@ -4622,7 +4578,7 @@ def changed_data_should_match_checkout(sbox):
os.chdir(was_cwd)
os.chdir(wc_dir)
verify_out = svntest.verify.UnorderedOutput(verify_out)
- svntest.actions.run_and_verify_svn(None, verify_out, [], 'status', '-v')
+ svntest.actions.run_and_verify_svn(verify_out, [], 'status', '-v')
os.chdir(was_cwd)
# Regression test for issue #3676 for copies including directories
@@ -4637,13 +4593,13 @@ def changed_dir_data_should_match_checkout(sbox):
verify_dir = sbox.add_wc_path('verify')
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', A_B, B_new)
+ svntest.actions.run_and_verify_svn(None, [], 'copy', A_B, B_new)
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'co', sbox.repo_url, verify_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'co', sbox.repo_url, verify_dir)
was_cwd = os.getcwd()
os.chdir(verify_dir)
@@ -4666,7 +4622,7 @@ def move_added_nodes(sbox):
sbox.build(read_only=True)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
sbox.ospath('X'),
sbox.ospath('X/Y'))
@@ -4677,21 +4633,21 @@ def move_added_nodes(sbox):
})
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('X/Y'),
sbox.ospath('X/Z'))
expected_status.remove('X/Y')
expected_status.add({'X/Z' : Item(status='A ', wc_rev='0')})
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('X/Z'),
sbox.ospath('Z'))
expected_status.remove('X/Z')
expected_status.add({'Z' : Item(status='A ', wc_rev='0')})
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('Z'),
sbox.ospath('X/Z'))
expected_status.remove('Z')
@@ -4724,9 +4680,7 @@ def mixed_rev_copy_del(sbox):
expected_status.remove('A/B/E/alpha')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Update to r2, then update A/B/E/alpha and A/B/E/beta to r1
svntest.main.run_svn(None, 'up', wc_dir)
@@ -4743,8 +4697,7 @@ def mixed_rev_copy_del(sbox):
expected_status.tweak('A/B/E/beta', wc_rev=1)
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None,
- expected_status, [],
- None, None, None, None, None,
+ expected_status, [], False,
'-r1',
sbox.ospath('A/B/E/alpha'),
sbox.ospath('A/B/E/beta'))
@@ -4752,7 +4705,7 @@ def mixed_rev_copy_del(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Copy A/B/E to A/B/E_copy
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A/B/E'),
sbox.ospath('A/B/E_copy'))
expected_status.add({
@@ -4781,9 +4734,7 @@ def mixed_rev_copy_del(sbox):
expected_status.remove('A/B/E_copy/alpha', 'A/B/E_copy/beta')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def copy_delete_undo(sbox, use_revert):
"copy, delete child, undo"
@@ -4963,12 +4914,12 @@ def move_wc_and_repo_dir_to_itself(sbox):
repo_url = sbox.repo_url + '/A'
# try to move wc dir to itself
- svntest.actions.run_and_verify_svn(None, [],
+ svntest.actions.run_and_verify_svn([],
'.*Cannot move path.* into itself.*',
'move', wc_dir, wc_dir)
# try to move repo dir to itself
- svntest.actions.run_and_verify_svn(None, [],
+ svntest.actions.run_and_verify_svn([],
'.*Cannot move URL.* into itself.*',
'move', repo_url, repo_url)
@@ -5058,7 +5009,7 @@ def copy_wc_url_with_absent(sbox):
expected_output,
None,
None,
- None, None, None, None, None, False,
+ [], False,
wc_dir, '--set-depth', 'infinity')
# Except for A/no, the 3 directories should now have the same children
@@ -5102,10 +5053,10 @@ def copy_url_shortcut(sbox):
wc_dir = sbox.wc_dir
# Can't use ^/A/D/G shortcut here because wc/X is unversioned.
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.ospath('A/D/G'), sbox.ospath('X'))
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
sbox.ospath('X/pi'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -5118,7 +5069,7 @@ def copy_url_shortcut(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Can use ^/A/D/G even though X/pi is a delete within a copy.
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
'^/A/D/G/pi', sbox.ospath('X/pi'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -5181,12 +5132,12 @@ def copy_base_of_deleted(sbox):
sbox.build(read_only = True)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', sbox.ospath('A/mu'))
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A/mu'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', status='D ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', '-rBASE',
+ svntest.actions.run_and_verify_svn(None, [], 'cp', '-rBASE',
sbox.ospath('A/mu'), sbox.ospath('A/mu2'))
expected_status.add({
'A/mu2' : Item(status='A ', copied='+', wc_rev='-'),
@@ -5433,6 +5384,13 @@ def copy_and_move_conflicts(sbox):
'D/G/pi',
'D/G/rho',
'D/G/tau')
+ expected_status.tweak('B', moved_from='../A/B')
+ expected_status.tweak('D', moved_from='../A/D')
+ expected_status.tweak('H', moved_from='D/H')
+ expected_status.tweak('Q', moved_from='../A/Q')
+ expected_status.tweak('D/H', moved_to='H')
+ expected_status.tweak('alpha', moved_from='B/E/alpha')
+ expected_status.tweak('B/E/alpha', moved_to='alpha')
svntest.actions.run_and_verify_status(wc('move-dest'), expected_status)
expected_disk = svntest.wc.State('', {
@@ -5467,14 +5425,14 @@ def copy_deleted_dir(sbox):
# E155035 - SVN_ERR_WC_PATH_UNEXPECTED_STATUS
# E155010 - SVN_ERR_WC_PATH_NOT_FOUND
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: (E145000|E155035|E155010): ' +
'(Path \'.*iota\' does not exist)|' +
'(Deleted node .*iota\' copied)',
'cp', sbox.ospath('iota'),
sbox.ospath('new_iota'))
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: (E145000|E155035|E155010): ' +
'(Path \'.*D\' does not exist)|' +
'(Deleted node .*D\' copied)',
@@ -5486,13 +5444,13 @@ def copy_deleted_dir(sbox):
os.mkdir(sbox.ospath('A/D'))
# At one time these two invocations raised an assertion.
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: (E155035|E155010): ' +
'(Path \'.*iota\' does not exist)|' +
'(Deleted node.* .*iota\' can\'t be.*)',
'cp', sbox.ospath('iota'),
sbox.ospath('new_iota'))
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: (E155035|E155010): ' +
'(Path \'.*D\' does not exist)|' +
'(Deleted node.* .*D\' can\'t be.*)',
@@ -5509,11 +5467,11 @@ def commit_copied_half_of_move(sbox):
D_path = sbox.ospath('A/D')
# iota -> A/D/iota; verify we cannot commit just A/D/iota
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', iota_path, D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', iota_path, D_path)
expected_error = "svn: E200009: Cannot commit '.*%s' because it was " \
"moved from '.*%s'" % (re.escape(sbox.ospath('A/D/iota')),
re.escape(iota_path))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo',
os.path.join(D_path, 'iota'))
@@ -5521,28 +5479,28 @@ def commit_copied_half_of_move(sbox):
expected_error = "svn: E200009: Cannot commit '.*%s' because it was " \
"moved from '.*%s'" % (re.escape(sbox.ospath('A/D/iota')),
re.escape(iota_path))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo', D_path)
# A/D -> A/C/D; verify we cannot commit just A/C
C_path = sbox.ospath('A/C')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', D_path, C_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', D_path, C_path)
expected_error = "svn: E200009: Cannot commit '.*%s' because it was moved " \
"from '.*%s'" % (re.escape(os.path.join(C_path, "D")),
re.escape(D_path))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo', C_path)
# A/C/D/iota -> A/iota; verify that iota's moved-from hasn't changed
D_iota_path = sbox.ospath('A/C/D/iota')
A_iota_path = sbox.ospath('A/iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', D_iota_path,
+ svntest.actions.run_and_verify_svn(None, [], 'mv', D_iota_path,
A_iota_path)
expected_error = "svn: E200009: Cannot commit '.*%s' because it was " \
"moved from '.*%s'" % (re.escape(A_iota_path),
re.escape(iota_path))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo', A_iota_path)
@@ -5557,21 +5515,21 @@ def commit_deleted_half_of_move(sbox):
D_path = sbox.ospath('A/D')
# iota -> A/D/iota; verify we cannot commit just iota
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', iota_path, D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', iota_path, D_path)
expected_error = "svn: E200009: Cannot commit '.*%s' because it was moved " \
"to '.*%s'" % (re.escape(iota_path),
re.escape(os.path.join(D_path, "iota")))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo', iota_path)
# A/D -> C; verify we cannot commit just A
C_path = sbox.ospath('C')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', D_path, C_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', D_path, C_path)
expected_error = "svn: E200009: Cannot commit '.*%s' because it was moved " \
"to '.*%s'" % (re.escape(D_path), re.escape(C_path))
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'commit', '-m', 'foo', A_path)
@Issue(4026)
@@ -5594,7 +5552,7 @@ def wc_wc_copy_incomplete(sbox):
svntest.actions.set_incomplete(sbox.ospath('A/B/F'), 2)
# Copy fails with no changes to wc
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: E155035: Cannot handle status',
'copy',
sbox.ospath('A/B/E'),
@@ -5605,7 +5563,7 @@ def wc_wc_copy_incomplete(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Copy fails part way through
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
'svn: E155035: Cannot handle status',
'copy',
sbox.ospath('A/B'),
@@ -5632,8 +5590,7 @@ def wc_wc_copy_incomplete(sbox):
expected_status.remove('A/B2/E', 'A/B2/F')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
expected_status.add({
'A/B2/E' : Item(status='! ', wc_rev=3),
'A/B2/F' : Item(status='! ', wc_rev=3),
@@ -5662,13 +5619,13 @@ def three_nested_moves(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B'),
sbox.ospath('A/B2'))
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B2/E'),
sbox.ospath('A/B2/E2'))
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
sbox.ospath('A/B2/E2/alpha'),
sbox.ospath('A/B2/E2/alpha2'))
@@ -5694,8 +5651,7 @@ def three_nested_moves(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
def copy_to_unversioned_parent(sbox):
"copy to unversioned parent"
@@ -5703,14 +5659,14 @@ def copy_to_unversioned_parent(sbox):
sbox.build()
# This succeeds
- #svntest.actions.run_and_verify_svn(None, None, [], 'cp', '--parents',
+ #svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
# sbox.ospath('A/B'),
# sbox.ospath('New/B2'))
# And this currently fails with The node '.*Unversioned' was not found,
# while it should succeed or returns some error that a GUI client can use.
os.mkdir(sbox.ospath('Unversioned'))
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'cp', '--parents',
sbox.ospath('A/B'),
sbox.ospath('Unversioned/B2'))
@@ -5728,7 +5684,7 @@ def copy_text_conflict(sbox):
sbox.simple_update(revision='1')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A'),
sbox.ospath('A_copied'))
@@ -5769,19 +5725,19 @@ def copy_over_excluded(sbox):
sbox.build(read_only = True)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '--set-depth', 'exclude',
sbox.ospath('A/D'))
expected_error = "svn: E155000: Path '.*D' exists.*excluded.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'cp',
sbox.repo_url + '/A/C',
sbox.ospath('A/D'))
expected_error = "svn: E155000: Path '.*D' exists.*excluded.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'cp',
sbox.ospath('A/C'),
sbox.ospath('A/D'))
@@ -5792,25 +5748,18 @@ def copy_relocate(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- tmp_dir = sbox.add_wc_path('relocated')
+ tmp_dir, url = sbox.add_repo_path('relocated')
shutil.copytree(sbox.repo_dir, tmp_dir)
- url = 'file://'
-
- if sys.platform == 'win32':
- url += '/'
-
- url += os.path.abspath(tmp_dir).replace(os.path.sep, '/')
-
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'relocate', url, wc_dir)
copiedpath = sbox.ospath('AA')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', url + '/A', copiedpath)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'info', copiedpath)
def ext_wc_copy_deleted(sbox):
@@ -5824,14 +5773,14 @@ def ext_wc_copy_deleted(sbox):
sbox.simple_rm('A/B')
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude',
sbox.ospath('A/D'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', sbox.repo_url, wc2_dir, '-r', 1)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', sbox.path('A'), os.path.join(wc2_dir,'AA'))
expected_output = expected_output = svntest.wc.State(wc2_dir, {
@@ -5840,8 +5789,7 @@ def ext_wc_copy_deleted(sbox):
})
svntest.actions.run_and_verify_commit(wc2_dir,
- expected_output, None, None,
- wc2_dir)
+ expected_output, None)
def copy_subtree_deleted(sbox):
"copy to-be-deleted subtree"
@@ -5860,11 +5808,11 @@ def copy_subtree_deleted(sbox):
'AA/B' : Item(verb='Deleting'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, None, None,
+ expected_output, None, [],
sbox.ospath('AA'))
# Commit copy between working copies
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', sbox.path('A'),
os.path.join(wc2_dir,'AA2'))
expected_output = expected_output = svntest.wc.State(wc2_dir, {
@@ -5872,9 +5820,19 @@ def copy_subtree_deleted(sbox):
'AA2/B' : Item(verb='Deleting'),
})
svntest.actions.run_and_verify_commit(wc2_dir,
- expected_output, None, None,
- wc2_dir)
+ expected_output, None)
+
+def resurrect_at_root(sbox):
+ "resurrect directory at root"
+
+ sbox.build(create_wc=False)
+
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.repo_url + '/A',
+ '-m', '')
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
+ sbox.repo_url + '/A/D/H@1',
+ sbox.repo_url + '/A', '-m', '')
########################################################################
# Run the tests
@@ -5996,6 +5954,7 @@ test_list = [ None,
copy_relocate,
ext_wc_copy_deleted,
copy_subtree_deleted,
+ resurrect_at_root,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/dav-mirror-autocheck.sh b/subversion/tests/cmdline/dav-mirror-autocheck.sh
index 42afa28..298a8ba 100755
--- a/subversion/tests/cmdline/dav-mirror-autocheck.sh
+++ b/subversion/tests/cmdline/dav-mirror-autocheck.sh
@@ -23,7 +23,7 @@
# to the slave. The test should be able to throw all kinds
# of svn operations at one or the other, and master/slave
# verified as identical in the end.
-#
+#
# Master / slave setup is achieved in a single httpd process
# using virtual hosts bound to different addresses on the
# loopback network (127.0.0.1, 127.0.0.2) for slave and
@@ -34,7 +34,7 @@
# http://subversion.tigris.org/issues/show_bug.cgi?id=2939
# But of course, any svn traffic liable to break over
# mirroring would be a good addition.
-#
+#
# Most of the httpd setup was lifted from davautocheck.sh.
# The common boilerplate snippets to setup/start/stop httpd
# between the two could be factored out and shared.
@@ -95,7 +95,7 @@ function get_prog_name() {
return 1
}
-# splat out httpd config
+# splat out httpd config
function setup_config() {
say "setting up config: " $1
@@ -152,7 +152,7 @@ CustomLog "${HTTPD_ROOT}/ops" "%t %u %{SVN-REPOS-NAME}e %{SVN-ACTION}e
ServerName ${SLAVE_HOST}
CustomLog "${HTTPD_ROOT}/slave_access_log" common
ErrorLog "${HTTPD_ROOT}/slave_error_log"
-# slave 'normal' location
+# slave 'normal' location
<Location "/${SLAVE_LOCATION}">
DAV svn
SVNPath "${SLAVE_REPOS}"
@@ -196,7 +196,7 @@ function usage() {
echo
echo " " '<test-work-directory>' must not exist, \
I will not clobber it for you 1>&2
- exit 1
+ exit 1
}
### Start execution here ###
@@ -403,7 +403,7 @@ $SVNSYNC initialize --non-interactive "$SYNC_URL" "$MASTER_URL" \
#
# reproducible test case from:
# http://subversion.tigris.org/issues/show_bug.cgi?id=2939
-#
+#
BASE_URL="$SLAVE_URL"
say running svnmucc test to $BASE_URL
svnmucc="$SVNMUCC --non-interactive --username jrandom --password rayjandom -mm"
@@ -492,7 +492,7 @@ say "Some house-keeping..."
say "Re-activating the post-commit hook on the master repo: $MASTER_REPOS."
mv "$MASTER_REPOS/hooks/post-commit_" "$MASTER_REPOS/hooks/post-commit"
say "Syncing slave with master."
-$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync --password=svnsync
+$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync --password=svnsync
# shut it down
echo -n "${SCRIPT}: stopping httpd: "
$HTTPD -f $HTTPD_CONFIG -k stop
diff --git a/subversion/tests/cmdline/davautocheck.sh b/subversion/tests/cmdline/davautocheck.sh
index 21fe418..31b2057 100755
--- a/subversion/tests/cmdline/davautocheck.sh
+++ b/subversion/tests/cmdline/davautocheck.sh
@@ -25,7 +25,7 @@
# This script simplifies preparation of environment for Subversion client
# communicating with a server via DAV protocol. The prerequisites of such
# testing are:
-# - Subversion built using --enable-shared --enable-dso --with-apxs options,
+# - Subversion built using --enable-shared --with-apxs options,
# - Working Apache 2 HTTPD Server with the apxs program reachable through
# PATH or specified via the APXS Makefile variable or environment variable,
# - Modules dav_module and log_config_module compiled as DSO or built into
@@ -62,7 +62,7 @@
# one version's client against another version's server) specify both APXS
# *and* MODULE_PATH for the other server:
#
-# APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \
+# APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \
# subversion/tests/cmdline/davautocheck.sh
#
# To prevent the server from advertising httpv2, pass USE_HTTPV1 in
@@ -71,7 +71,7 @@
# To enable "SVNCacheRevProps on" set CACHE_REVPROPS in the environment.
#
# To test over https set USE_SSL in the environment.
-#
+#
# To use value for "SVNPathAuthz" directive set SVN_PATH_AUTHZ with
# appropriate value in the environment.
#
@@ -79,12 +79,14 @@
# environment.
#
# Passing --no-tests as argv[1] will have the script start a server
-# but not run any tests.
+# but not run any tests. Passing --gdb will do the same, and in addition
+# spawn gdb in the foreground attached to the running server.
PYTHON=${PYTHON:-python}
SCRIPTDIR=$(dirname $0)
SCRIPT=$(basename $0)
+STOPSCRIPT=$SCRIPTDIR/.$SCRIPT.stop
trap stop_httpd_and_die HUP TERM INT
@@ -112,14 +114,18 @@ query() {
if [ -n "$BASH_VERSION" ]; then
read -n 1 -t 32
else
- #
- prog=$(cat) <<'EOF'
+ #
+ prog="
import select as s
import sys
+import tty, termios
+tty.setcbreak(sys.stdin.fileno(), termios.TCSANOW)
if s.select([sys.stdin.fileno()], [], [], 32)[0]:
sys.stdout.write(sys.stdin.read(1))
-EOF
- REPLY=`stty cbreak; $PYTHON -c "$prog" "$@"; stty -cbreak`
+"
+ stty_state=`stty -g`
+ REPLY=`$PYTHON -u -c "$prog" "$@"`
+ stty $stty_state
fi
echo
[ "${REPLY:-$2}" = 'y' ]
@@ -136,7 +142,7 @@ get_loadmodule_config() {
fi
# maybe it's built-in?
- "$HTTPD" -l | grep -q "$1\\.c" && return
+ "$HTTPD" -l | grep "$1\\.c" >/dev/null && return
return 1
}
@@ -157,6 +163,7 @@ get_prog_name() {
}
# Don't assume sbin is in the PATH.
+# ### Presumably this is used to locate /usr/sbin/apxs or /usr/sbin/apache2
PATH="$PATH:/usr/sbin:/usr/local/sbin"
# Find the source and build directories. The build dir can be found if it is
@@ -217,15 +224,19 @@ fi
if [ ${MODULE_PATH:+set} ]; then
MOD_DAV_SVN="$MODULE_PATH/mod_dav_svn.so"
MOD_AUTHZ_SVN="$MODULE_PATH/mod_authz_svn.so"
+ MOD_DONTDOTHAT="$MODULE_PATH/mod_dontdothat.so"
else
MOD_DAV_SVN="$ABS_BUILDDIR/subversion/mod_dav_svn/.libs/mod_dav_svn.so"
MOD_AUTHZ_SVN="$ABS_BUILDDIR/subversion/mod_authz_svn/.libs/mod_authz_svn.so"
+ MOD_DONTDOTHAT="$ABS_BUILDDIR/tools/server-side/mod_dontdothat/.libs/mod_dontdothat.so"
fi
[ -r "$MOD_DAV_SVN" ] \
- || fail "dav_svn_module not found, please use '--enable-shared --enable-dso --with-apxs' with your 'configure' script"
+ || fail "dav_svn_module not found, please use '--enable-shared --with-apxs' with your 'configure' script"
[ -r "$MOD_AUTHZ_SVN" ] \
- || fail "authz_svn_module not found, please use '--enable-shared --enable-dso --with-apxs' with your 'configure' script"
+ || fail "authz_svn_module not found, please use '--enable-shared --with-apxs' with your 'configure' script"
+[ -r "$MOD_DONTDOTHAT" ] \
+ || fail "dontdothat_module not found, please use '--enable-shared --with-apxs' with your 'configure' script"
for d in "$ABS_BUILDDIR"/subversion/*/.libs; do
if [ -z "$BUILDDIR_LIBRARY_PATH" ]; then
@@ -237,12 +248,10 @@ done
case "`uname`" in
Darwin*)
- LDD='otool -L'
DYLD_LIBRARY_PATH="$BUILDDIR_LIBRARY_PATH:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH
;;
*)
- LDD='ldd'
LD_LIBRARY_PATH="$BUILDDIR_LIBRARY_PATH:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
;;
@@ -255,8 +264,6 @@ HTTPD=$(get_prog_name $httpd) || fail "HTTPD '$HTTPD' not found"
"$HTTPD" -v 1>/dev/null 2>&1 \
|| fail "HTTPD '$HTTPD' doesn't start properly"
-say "Using '$HTTPD'..."
-
HTPASSWD=$(get_prog_name htpasswd htpasswd2) \
|| fail "Could not find htpasswd or htpasswd2"
[ -x $HTPASSWD ] \
@@ -289,8 +296,6 @@ LOAD_MOD_AUTHN_CORE="$(get_loadmodule_config mod_authn_core)" \
|| fail "Authn_Core module not found."
LOAD_MOD_AUTHZ_CORE="$(get_loadmodule_config mod_authz_core)" \
|| fail "Authz_Core module not found."
-LOAD_MOD_AUTHZ_HOST="$(get_loadmodule_config mod_authz_host)" \
- || fail "Authz_Host module not found."
LOAD_MOD_UNIXD=$(get_loadmodule_config mod_unixd) \
|| fail "UnixD module not found"
}
@@ -298,6 +303,10 @@ LOAD_MOD_AUTHN_FILE="$(get_loadmodule_config mod_authn_file)" \
|| fail "Authn_File module not found."
LOAD_MOD_AUTHZ_USER="$(get_loadmodule_config mod_authz_user)" \
|| fail "Authz_User module not found."
+LOAD_MOD_AUTHZ_GROUPFILE="$(get_loadmodule_config mod_authz_groupfile)" \
+ || fail "Authz_GroupFile module not found."
+LOAD_MOD_AUTHZ_HOST="$(get_loadmodule_config mod_authz_host)" \
+ || fail "Authz_Host module not found."
}
if [ ${APACHE_MPM:+set} ]; then
LOAD_MOD_MPM=$(get_loadmodule_config mod_mpm_$APACHE_MPM) \
@@ -308,17 +317,16 @@ if [ ${USE_SSL:+set} ]; then
|| fail "SSL module not found"
fi
-random_port() {
- if [ -n "$BASH_VERSION" ]; then
- echo $(($RANDOM+1024))
- else
- $PYTHON -c 'import random; print random.randint(1024, 2**16-1)'
- fi
-}
+# Stop any previous instances, os we can re-use the port.
+if [ -x $STOPSCRIPT ]; then $STOPSCRIPT ; sleep 1; fi
-HTTPD_PORT=$(random_port)
-while netstat -an | grep $HTTPD_PORT | grep 'LISTEN'; do
- HTTPD_PORT=$(random_port)
+HTTPD_PORT=3691
+while netstat -an | grep $HTTPD_PORT | grep 'LISTEN' >/dev/null; do
+ HTTPD_PORT=$(( HTTPD_PORT + 1 ))
+ if [ $HTTPD_PORT -eq 65536 ]; then
+ # Most likely the loop condition is true regardless of $HTTPD_PORT
+ fail "netstat claims you have no free ports for httpd to listen on."
+ fi
done
HTTPD_ROOT="$ABS_BUILDDIR/subversion/tests/cmdline/httpd-$(date '+%Y%m%d-%H%M%S')"
HTTPD_CFG="$HTTPD_ROOT/cfg"
@@ -326,8 +334,16 @@ HTTPD_PID="$HTTPD_ROOT/pid"
HTTPD_ACCESS_LOG="$HTTPD_ROOT/access_log"
HTTPD_ERROR_LOG="$HTTPD_ROOT/error_log"
HTTPD_MIME_TYPES="$HTTPD_ROOT/mime.types"
-BASE_URL="http://localhost:$HTTPD_PORT"
+HTTPD_DONTDOTHAT="$HTTPD_ROOT/dontdothat"
+if [ -z "$BASE_URL" ]; then
+ BASE_URL="http://localhost:$HTTPD_PORT"
+else
+ # Specify the public name of the host when using a proxy on another host, the
+ # port number will be appended.
+ BASE_URL="$BASE_URL:$HTTPD_PORT"
+fi
HTTPD_USERS="$HTTPD_ROOT/users"
+HTTPD_GROUPS="$HTTPD_ROOT/groups"
mkdir "$HTTPD_ROOT" \
|| fail "couldn't create temporary directory '$HTTPD_ROOT'"
@@ -388,9 +404,24 @@ fi
say "Adding users for lock authentication"
$HTPASSWD -bc $HTTPD_USERS jrandom rayjandom
$HTPASSWD -b $HTTPD_USERS jconstant rayjandom
+$HTPASSWD -b $HTTPD_USERS __dumpster__ __loadster__
+$HTPASSWD -b $HTTPD_USERS JRANDOM rayjandom
+$HTPASSWD -b $HTTPD_USERS JCONSTANT rayjandom
+
+say "Adding groups for mod_authz_svn tests"
+cat > "$HTTPD_GROUPS" <<__EOF__
+random: jrandom
+constant: jconstant
+__EOF__
touch $HTTPD_MIME_TYPES
+cat > "$HTTPD_DONTDOTHAT" <<__EOF__
+[recursive-actions]
+/ = deny
+
+__EOF__
+
cat > "$HTTPD_CFG" <<__EOF__
$LOAD_MOD_MPM
$LOAD_MOD_SSL
@@ -405,8 +436,11 @@ $LOAD_MOD_AUTHN_CORE
$LOAD_MOD_AUTHN_FILE
$LOAD_MOD_AUTHZ_CORE
$LOAD_MOD_AUTHZ_USER
+$LOAD_MOD_AUTHZ_GROUPFILE
$LOAD_MOD_AUTHZ_HOST
+$LOAD_MOD_ACCESS_COMPAT
LoadModule authz_svn_module "$MOD_AUTHZ_SVN"
+LoadModule dontdothat_module "$MOD_DONTDOTHAT"
__EOF__
@@ -443,10 +477,10 @@ cat >> "$HTTPD_CFG" <<__EOF__
Listen $HTTPD_PORT
ServerName localhost
PidFile "$HTTPD_PID"
-LogFormat "%h %l %u %t \"%r\" %>s %b" common
+LogFormat "%h %l %u %t \"%r\" %>s %b \"%f\"" common
CustomLog "$HTTPD_ACCESS_LOG" common
ErrorLog "$HTTPD_ERROR_LOG"
-LogLevel Debug
+LogLevel debug
ServerRoot "$HTTPD_ROOT"
DocumentRoot "$HTTPD_ROOT"
ScoreBoardFile "$HTTPD_ROOT/run"
@@ -486,6 +520,19 @@ CustomLog "$HTTPD_ROOT/ops" "%t %u %{SVN-REPOS-NAME}e %{SVN-ACTION}e"
SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
${SVN_PATH_AUTHZ_LINE}
</Location>
+<Location /ddt-test-work/repositories>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/repositories"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ ${SVN_PATH_AUTHZ_LINE}
+ DontDoThatConfigFile "$HTTPD_DONTDOTHAT"
+</Location>
<Location /svn-test-work/local_tmp/repos>
DAV svn
SVNPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp/repos"
@@ -497,11 +544,180 @@ CustomLog "$HTTPD_ROOT/ops" "%t %u %{SVN-REPOS-NAME}e %{SVN-ACTION}e"
SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
${SVN_PATH_AUTHZ_LINE}
</Location>
+<Location /authz-test-work/anon>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ # This may seem unnecessary but granting access to everyone here is necessary
+ # to exercise a bug with httpd 2.3.x+. The "Require all granted" syntax is
+ # new to 2.3.x+ which we can detect with the mod_authz_core.c module
+ # signature. Use the "Allow from all" syntax with older versions for symmetry.
+ <IfModule mod_authz_core.c>
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ Allow from all
+ </IfMOdule>
+ ${SVN_PATH_AUTHZ_LINE}
+</Location>
+<Location /authz-test-work/mixed>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ Satisfy Any
+ ${SVN_PATH_AUTHZ_LINE}
+</Location>
+<Location /authz-test-work/mixed-noauthwhenanon>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ AuthzSVNNoAuthWhenAnonymousAllowed On
+ SVNPathAuthz On
+</Location>
+<Location /authz-test-work/authn>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ ${SVN_PATH_AUTHZ_LINE}
+</Location>
+<Location /authz-test-work/authn-anonoff>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ AuthzSVNAnonymous Off
+ SVNPathAuthz On
+</Location>
+<Location /authz-test-work/authn-lcuser>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ AuthzForceUsernameCase Lower
+ ${SVN_PATH_AUTHZ_LINE}
+</Location>
+<Location /authz-test-work/authn-lcuser>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ Require valid-user
+ AuthzForceUsernameCase Lower
+ ${SVN_PATH_AUTHZ_LINE}
+</Location>
+<Location /authz-test-work/authn-group>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ AuthGroupFile $HTTPD_GROUPS
+ Require group random
+ AuthzSVNAuthoritative Off
+ SVNPathAuthz On
+</Location>
+<IfModule mod_authz_core.c>
+ <Location /authz-test-work/sallrany>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ AuthzSendForbiddenOnFailure On
+ Satisfy All
+ <RequireAny>
+ Require valid-user
+ Require expr req('ALLOW') == '1'
+ </RequireAny>
+ ${SVN_PATH_AUTHZ_LINE}
+ </Location>
+ <Location /authz-test-work/sallrall>
+ DAV svn
+ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
+ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
+ SVNListParentPath On
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile $HTTPD_USERS
+ AuthzSendForbiddenOnFailure On
+ Satisfy All
+ <RequireAll>
+ Require valid-user
+ Require expr req('ALLOW') == '1'
+ </RequireAll>
+ ${SVN_PATH_AUTHZ_LINE}
+ </Location>
+</IfModule>
RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)\$ /svn-test-work/repositories/\$1
RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)\$ /svn-test-work/repositories/\$1
__EOF__
START="$HTTPD -f $HTTPD_CFG"
+printf \
+'#!/bin/sh
+if [ -d "%s" ]; then
+ printf "Stopping previous HTTPD instance..."
+ if %s -k stop; then
+ # httpd had no output; echo a newline.
+ echo ""
+ elif [ -s "%s" ]; then
+ # httpd would have printed an error terminated by a newline.
+ kill -9 "`cat %s`"
+ fi
+fi
+' >$STOPSCRIPT "$HTTPD_ROOT" "$START" "$HTTPD_PID" "$HTTPD_PID"
+chmod +x $STOPSCRIPT
$START -t \
|| fail "Configuration file didn't pass the check, most likely modules couldn't be loaded"
@@ -531,41 +747,48 @@ if [ $? -ne 0 ]; then
HTTP_FETCH_OUTPUT='-s -k -o'
fi
$HTTP_FETCH $HTTP_FETCH_OUTPUT "$HTTPD_CFG-copy" "$BASE_URL/cfg"
-diff -q "$HTTPD_CFG" "$HTTPD_CFG-copy" > /dev/null \
+diff "$HTTPD_CFG" "$HTTPD_CFG-copy" > /dev/null \
|| fail "HTTPD doesn't operate according to the generated configuration"
rm "$HTTPD_CFG-copy"
say "HTTPD is good"
if [ $# -eq 1 ] && [ "x$1" = 'x--no-tests' ]; then
- echo "http://localhost:$HTTPD_PORT"
+ echo "http://localhost:$HTTPD_PORT/svn-test-work/repositories"
+ exit
+fi
+
+if [ $# -eq 1 ] && [ "x$1" = 'x--gdb' ]; then
+ echo "http://localhost:$HTTPD_PORT/svn-test-work/repositories"
+ $STOPSCRIPT && gdb -silent -ex r -args $START -X
exit
fi
+
if type time > /dev/null; then
TIME_CMD=time
else
TIME_CMD=""
fi
+MAKE=${MAKE:-make}
+
say "starting the tests..."
CLIENT_CMD="$ABS_BUILDDIR/subversion/svn/svn"
-$LDD "$CLIENT_CMD" | grep -q 'not found' \
- && fail "Subversion client couldn't be fully linked at run-time"
if [ "$HTTP_LIBRARY" = "" ]; then
say "Using default dav library"
- "$CLIENT_CMD" --version | egrep -q '^[*] ra_(neon|serf)' \
+ "$CLIENT_CMD" --version | egrep '^[*] ra_(neon|serf)' >/dev/null \
|| fail "Subversion client couldn't find and/or load ra_dav library"
else
say "Requesting dav library '$HTTP_LIBRARY'"
- "$CLIENT_CMD" --version | egrep -q "^[*] ra_$HTTP_LIBRARY" \
+ "$CLIENT_CMD" --version | egrep "^[*] ra_$HTTP_LIBRARY" >/dev/null \
|| fail "Subversion client couldn't find and/or load ra_dav library '$HTTP_LIBRARY'"
fi
if [ $# = 0 ]; then
- $TIME_CMD make check "BASE_URL=$BASE_URL" $SSL_MAKE_VAR
+ $TIME_CMD "$MAKE" check "BASE_URL=$BASE_URL" $SSL_MAKE_VAR
r=$?
else
(cd "$ABS_BUILDDIR/subversion/tests/cmdline/"
diff --git a/subversion/tests/cmdline/depth_tests.py b/subversion/tests/cmdline/depth_tests.py
index 18af743..5a1d2c7 100755
--- a/subversion/tests/cmdline/depth_tests.py
+++ b/subversion/tests/cmdline/depth_tests.py
@@ -73,7 +73,6 @@ def set_up_depthy_working_copies(sbox, empty=False, files=False,
wc_empty = sbox.wc_dir + '-depth-empty'
sbox.add_test_path(wc_empty, True)
svntest.actions.run_and_verify_svn(
- "Unexpected error from co --depth=empty",
svntest.verify.AnyOutput, [],
"co", "--depth", "empty", sbox.repo_url, wc_empty)
@@ -82,7 +81,6 @@ def set_up_depthy_working_copies(sbox, empty=False, files=False,
wc_files = sbox.wc_dir + '-depth-files'
sbox.add_test_path(wc_files, True)
svntest.actions.run_and_verify_svn(
- "Unexpected error from co --depth=files",
svntest.verify.AnyOutput, [],
"co", "--depth", "files", sbox.repo_url, wc_files)
@@ -91,7 +89,6 @@ def set_up_depthy_working_copies(sbox, empty=False, files=False,
wc_immediates = sbox.wc_dir + '-depth-immediates'
sbox.add_test_path(wc_immediates, True)
svntest.actions.run_and_verify_svn(
- "Unexpected error from co --depth=immediates",
svntest.verify.AnyOutput, [],
"co", "--depth", "immediates",
sbox.repo_url, wc_immediates)
@@ -102,7 +99,7 @@ def verify_depth(msg, depth, path="."):
"""Verifies that PATH has depth DEPTH. MSG is the failure message."""
if depth == "infinity":
# Check for absence of depth line.
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None,
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None,
[], "info", path)
for line in out:
if line.startswith("Depth:"):
@@ -111,7 +108,7 @@ def verify_depth(msg, depth, path="."):
expected_stdout = svntest.verify.ExpectedOutput("Depth: %s\n" % depth,
match_all=False)
svntest.actions.run_and_verify_svn(
- msg, expected_stdout, [], "info", path)
+ expected_stdout, [], "info", path)
#----------------------------------------------------------------------
# Ensure that 'checkout --depth=empty' results in a depth-empty working copy.
@@ -144,8 +141,7 @@ def depth_files_same_as_nonrecursive(sbox, opt):
if os.path.exists(sbox.wc_dir):
svntest.main.safe_rmtree(sbox.wc_dir)
- svntest.actions.run_and_verify_svn("Unexpected error during co %s" % opt,
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
"co", opt, sbox.repo_url, sbox.wc_dir)
# Should create a depth-files top directory, so both iota and A
@@ -187,8 +183,7 @@ def depth_empty_update_bypass_single_file(sbox):
expected_status.tweak('iota', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-empty wc, expecting not to receive the change to iota.
expected_output = svntest.wc.State(wc_empty, { })
@@ -198,8 +193,7 @@ def depth_empty_update_bypass_single_file(sbox):
svntest.actions.run_and_verify_update(wc_empty,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
# And the wc should still be depth-empty.
verify_depth(None, "empty", wc_empty)
@@ -210,7 +204,7 @@ def depth_empty_update_bypass_single_file(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
"--depth=infinity", wc_empty)
# And the wc should still be depth-empty.
@@ -239,8 +233,7 @@ def depth_immediates_get_top_file_mod_only(sbox):
expected_status.tweak('A/mu', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-immediates wc, expecting to receive only the
# change to iota.
@@ -259,8 +252,7 @@ def depth_immediates_get_top_file_mod_only(sbox):
svntest.actions.run_and_verify_update(wc_immediates,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
verify_depth(None, "immediates", wc_immediates)
@@ -275,7 +267,7 @@ def depth_empty_commit(sbox):
wc_empty_iota = os.path.join(wc_empty, 'iota')
# Update 'iota' in the depth-empty working copy and modify it
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_empty_iota)
svntest.main.file_write(wc_empty_iota, "iota modified")
@@ -290,9 +282,7 @@ def depth_empty_commit(sbox):
})
svntest.actions.run_and_verify_commit(wc_empty,
expected_output,
- expected_status,
- None,
- wc_empty)
+ expected_status)
#----------------------------------------------------------------------
def depth_empty_with_file(sbox):
@@ -310,7 +300,7 @@ def depth_empty_with_file(sbox):
### minutes of trying to figure out how, I decided to compromise.
# Update iota by name, expecting to receive it.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'up', iota_path)
# Test that we did receive it.
if not os.path.exists(iota_path):
@@ -324,19 +314,17 @@ def depth_empty_with_file(sbox):
expected_status.tweak('iota', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Delete iota in the "other" wc.
other_iota_path = os.path.join(wc, 'iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', other_iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', other_iota_path)
expected_output = svntest.wc.State(wc, { 'iota' : Item(verb='Deleting'), })
expected_status = svntest.actions.get_virginal_state(wc, 1)
expected_status.remove('iota')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-empty wc just a little, expecting to receive
# the change in iota.
@@ -351,7 +339,7 @@ def depth_empty_with_file(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'-r2', wc_empty)
# Update the depth-empty wc all the way, expecting to receive the deletion
@@ -364,8 +352,7 @@ def depth_empty_with_file(sbox):
svntest.actions.run_and_verify_update(wc_empty,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
#----------------------------------------------------------------------
@@ -409,8 +396,7 @@ def depth_empty_with_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
A_path)
# Commit a change to A/mu in the "other" wc.
@@ -421,8 +407,7 @@ def depth_empty_with_dir(sbox):
expected_status.tweak('A/mu', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update "A" by name in wc_empty, expect to receive the change to A/mu.
expected_output = svntest.wc.State(wc_empty, { 'A/mu' : Item(status='U ') })
@@ -436,20 +421,18 @@ def depth_empty_with_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
A_path)
# Commit the deletion of A/mu from the "other" wc.
svntest.main.file_write(other_mu_path, "new text\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', other_mu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', other_mu_path)
expected_output = svntest.wc.State(wc, { 'A/mu' : Item(verb='Deleting'), })
expected_status = svntest.actions.get_virginal_state(wc, 1)
expected_status.remove('A/mu')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update "A" by name in wc_empty, expect to A/mu to disappear.
@@ -465,8 +448,7 @@ def depth_empty_with_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
A_path)
@@ -499,31 +481,13 @@ def depth_immediates_bring_in_file(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
A_mu_path)
# Run 'svn up A/D/gamma' to test the edge case 'Skipped'.
- expected_output = svntest.wc.State(wc_imm, {
- 'A/D/gamma' : Item(verb='Skipped'),
- })
- expected_disk = svntest.main.greek_state.copy()
- expected_disk.remove('A/C', 'A/B/lambda', 'A/B/E', 'A/B/E/alpha',
- 'A/B/E/beta', 'A/B/F', 'A/B', 'A/D/gamma', 'A/D/G',
- 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau', 'A/D/H/chi',
- 'A/D/H/psi', 'A/D/H/omega', 'A/D/H', 'A/D')
- expected_status = svntest.actions.get_virginal_state(wc_imm, 1)
- expected_status.remove('A/C', 'A/B/lambda', 'A/B/E', 'A/B/E/alpha',
- 'A/B/E/beta', 'A/B/F', 'A/B', 'A/D/gamma', 'A/D/G',
- 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau', 'A/D/H/chi',
- 'A/D/H/psi', 'A/D/H/omega', 'A/D/H', 'A/D')
- svntest.actions.run_and_verify_update(wc_imm,
- expected_output,
- expected_disk,
- expected_status,
- None, None, None,
- None, None, None,
- gamma_path)
+ svntest.actions.run_and_verify_svn(["Skipped '"+gamma_path+"'\n", ],
+ "svn: E155007: ", 'update', gamma_path)
+ svntest.actions.run_and_verify_status(wc_imm, expected_status)
#----------------------------------------------------------------------
def depth_immediates_fill_in_dir(sbox):
@@ -560,8 +524,7 @@ def depth_immediates_fill_in_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'infinity',
A_path)
@@ -593,8 +556,7 @@ def depth_mixed_bring_in_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files',
A_path)
# Check that A was added at depth=files.
@@ -621,8 +583,7 @@ def depth_mixed_bring_in_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates',
B_path)
# Check that A/B was added at depth=immediates.
@@ -646,8 +607,7 @@ def depth_mixed_bring_in_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty',
C_path)
# Check that A/C was added at depth=empty.
@@ -664,14 +624,13 @@ def depth_empty_unreceive_delete(sbox):
iota_path = os.path.join(wc, 'iota')
# Commit in the "other" wc.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota_path)
expected_output = svntest.wc.State(wc, { 'iota' : Item(verb='Deleting'), })
expected_status = svntest.actions.get_virginal_state(wc, 1)
expected_status.remove('iota')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-empty wc, expecting not to receive the deletion of iota.
expected_output = svntest.wc.State(wc_empty, { })
@@ -681,8 +640,7 @@ def depth_empty_unreceive_delete(sbox):
svntest.actions.run_and_verify_update(wc_empty,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
#----------------------------------------------------------------------
@@ -698,14 +656,13 @@ def depth_immediates_unreceive_delete(sbox):
mu_path = os.path.join(wc, 'A', 'mu')
# Commit in the "other" wc.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', mu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', mu_path)
expected_output = svntest.wc.State(wc, { 'A/mu' : Item(verb='Deleting'), })
expected_status = svntest.actions.get_virginal_state(wc, 1)
expected_status.remove('A/mu')
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-immediates wc, expecting not to receive the deletion
# of A/mu.
@@ -722,8 +679,7 @@ def depth_immediates_unreceive_delete(sbox):
svntest.actions.run_and_verify_update(wc_immed,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
#----------------------------------------------------------------------
def depth_immediates_receive_delete(sbox):
@@ -738,7 +694,7 @@ def depth_immediates_receive_delete(sbox):
A_path = os.path.join(wc, 'A')
# Commit in the "other" wc.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', A_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', A_path)
expected_output = svntest.wc.State(wc, { 'A' : Item(verb='Deleting'), })
expected_status = svntest.wc.State(wc, {
'' : Item(status=' ', wc_rev=1),
@@ -746,8 +702,7 @@ def depth_immediates_receive_delete(sbox):
})
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-immediates wc, expecting to receive the deletion of A.
expected_output = svntest.wc.State(wc_immed, {
@@ -763,8 +718,7 @@ def depth_immediates_receive_delete(sbox):
svntest.actions.run_and_verify_update(wc_immed,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
#----------------------------------------------------------------------
def depth_immediates_subdir_propset_1(sbox):
@@ -775,7 +729,7 @@ def depth_immediates_subdir_propset_1(sbox):
A_path = os.path.join(wc_immediates, 'A')
# Set a property on an immediate subdirectory of the working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'pset', 'foo', 'bar',
A_path)
@@ -795,7 +749,7 @@ def depth_immediates_subdir_propset_1(sbox):
svntest.actions.run_and_verify_commit(wc_immediates,
expected_output,
expected_status,
- None,
+ [],
A_path)
# Create expected output tree for the update.
@@ -814,7 +768,7 @@ def depth_immediates_subdir_propset_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
def depth_immediates_subdir_propset_2(sbox):
@@ -829,16 +783,15 @@ def depth_immediates_subdir_propset_2(sbox):
A_path = sbox.ospath('A')
# Set a property on an immediate subdirectory of the working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'pset', 'foo', 'bar',
A_path)
# Commit.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'logmsg', A_path)
# Update at depth=immediates in the other wc, expecting to see no errors.
- svntest.actions.run_and_verify_svn("Output on stderr where none expected",
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'update', '--depth', 'immediates',
other_wc)
@@ -865,8 +818,7 @@ def depth_update_to_more_depth(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files')
verify_depth(None, "files")
@@ -887,8 +839,7 @@ def depth_update_to_more_depth(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates')
verify_depth(None, "immediates")
verify_depth(None, "empty", "A")
@@ -912,8 +863,7 @@ def depth_update_to_more_depth(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', 'A')
verify_depth(None, "immediates")
verify_depth(None, "files", "A")
@@ -944,8 +894,7 @@ def depth_update_to_more_depth(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'infinity')
verify_depth("Non-infinity depth detected after an upgrade to depth-infinity",
"infinity")
@@ -969,13 +918,13 @@ def commit_propmods_with_depth_empty_helper(sbox, depth_arg):
chi_path = os.path.join(H_path, 'chi')
# Set some properties, modify some files.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar-val', D_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'baz', 'baz-val', G_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'qux', 'qux-val', H_path)
svntest.main.file_append(iota_path, "new iota\n")
svntest.main.file_append(gamma_path, "new gamma\n")
@@ -1003,7 +952,7 @@ def commit_propmods_with_depth_empty_helper(sbox, depth_arg):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
depth_arg,
wc_dir, D_path)
@@ -1032,18 +981,18 @@ def diff_in_depthy_wc(sbox):
gamma_path = os.path.join(wc, 'A', 'D', 'gamma')
# Make some changes in the depth-infinity wc, and commit them
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', wc)
svntest.main.file_write(iota_path, "new text\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar-val', A_path)
svntest.main.file_write(mu_path, "new text\n")
svntest.main.file_write(gamma_path, "new text\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', '', wc)
- from diff_tests import make_diff_header, make_diff_prop_header
- from diff_tests import make_diff_prop_deleted, make_diff_prop_added
+ from svntest.verify import make_diff_header, make_diff_prop_header, \
+ make_diff_prop_deleted, make_diff_prop_added
diff_mu = make_diff_header('A/mu', 'revision 2', 'working copy') + [
"@@ -1 +1 @@\n",
"-new text\n",
@@ -1063,48 +1012,48 @@ def diff_in_depthy_wc(sbox):
expected_output = svntest.verify.UnorderedOutput(diff_dot)
# The diff should contain only the propchange on '.'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-rHEAD')
# Upgrade to depth-files.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'files', '-r1')
# The diff should contain only the propchange on '.' and the
# contents change on iota.
expected_output = svntest.verify.UnorderedOutput(diff_iota + diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-rHEAD')
# Do a diff at --depth empty.
expected_output = svntest.verify.UnorderedOutput(diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--depth', 'empty', '-rHEAD')
# Upgrade to depth-immediates.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'immediates', '-r1')
# The diff should contain the propchanges on '.' and 'A' and the
# contents change on iota.
expected_output = svntest.verify.UnorderedOutput(diff_A + diff_iota +
diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-rHEAD')
# Do a diff at --depth files.
expected_output = svntest.verify.UnorderedOutput(diff_iota + diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--depth', 'files', '-rHEAD')
# Upgrade A to depth-files.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'files', '-r1', 'A')
# The diff should contain everything but the contents change on
# gamma (which does not exist in this working copy).
expected_output = svntest.verify.UnorderedOutput(diff_mu + diff_A +
diff_iota + diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-rHEAD')
# Do a diff at --depth immediates.
expected_output = svntest.verify.UnorderedOutput(diff_A + diff_iota + diff_dot)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--depth', 'immediates', '-rHEAD')
@Issue(2882)
@@ -1151,6 +1100,7 @@ def commit_depth_immediates(sbox):
# Sending A/D/G/rho
# Sending iota
# Transmitting file data ..
+ # Committing transaction...
# Committed revision 2.
iota_path = sbox.ospath('iota')
@@ -1173,7 +1123,7 @@ def commit_depth_immediates(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'--depth', 'immediates',
wc_dir, G_path)
@@ -1192,7 +1142,7 @@ def depth_immediates_receive_new_dir(sbox):
svntest.main.file_write(zeta_path, "This is the file 'zeta'.\n")
# Commit in the "other" wc.
- svntest.actions.run_and_verify_svn(None, None, [], 'add', I_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', I_path)
expected_output = svntest.wc.State(wc, {
'I' : Item(verb='Adding'),
'I/zeta' : Item(verb='Adding'),
@@ -1204,8 +1154,7 @@ def depth_immediates_receive_new_dir(sbox):
})
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None, wc)
+ expected_status)
# Update the depth-immediates wc, expecting to receive just the
# new directory, without the file.
@@ -1226,8 +1175,7 @@ def depth_immediates_receive_new_dir(sbox):
svntest.actions.run_and_verify_update(wc_immed,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None)
+ expected_status)
# Check that the new directory was added at depth=empty.
verify_depth(None, "empty", other_I_path)
@@ -1245,20 +1193,20 @@ def add_tree_with_depth(sbox):
os.mkdir(new3_path)
os.mkdir(new4_path)
# Simple case, add new1 only, set depth to files
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"add", "--depth", "files", new1_path)
verify_depth(None, "infinity", new1_path)
# Force add new1 at new1 again, should include new2 at empty, the depth of
# new1 should not change
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"add", "--depth", "immediates",
"--force", new1_path)
verify_depth(None, "infinity", new1_path)
verify_depth(None, "infinity", new2_path)
# add new4 with intermediate path, the intermediate path is added at empty
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"add", "--depth", "immediates",
"--parents", new4_path)
verify_depth(None, "infinity", new3_path)
@@ -1302,8 +1250,8 @@ def upgrade_from_above(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, None,
- '--set-depth=files')
+ [], False,
+ '--set-depth=files', '.')
verify_depth(None, "files")
finally:
os.chdir(saved_cwd)
@@ -1324,7 +1272,7 @@ def upgrade_from_above(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, None,
+ [], False,
'--set-depth=files', wc)
verify_depth(None, "files", wc)
@@ -1340,14 +1288,14 @@ def status_in_depthy_wc(sbox):
gamma_path = os.path.join(wc, 'A', 'D', 'gamma')
# Make some changes in the depth-infinity wc, and commit them
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', wc)
svntest.main.file_write(iota_path, "new text\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar-val', A_path)
svntest.main.file_write(mu_path, "new text\n")
svntest.main.file_write(gamma_path, "new text\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', '', wc)
status = [
@@ -1362,44 +1310,44 @@ def status_in_depthy_wc(sbox):
expected_output = svntest.verify.UnorderedOutput(status[:2])
# The output should contain only the change on '.'.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u')
# Upgrade to depth-files.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'files', '-r1')
# The output should contain only the changes on '.' and 'iota'.
expected_output = svntest.verify.UnorderedOutput(status[:3])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u')
# Do a status -u at --depth empty.
expected_output = svntest.verify.UnorderedOutput(status[:2])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u', '--depth', 'empty')
# Upgrade to depth-immediates.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'immediates', '-r1')
# The output should contain the changes on '.', 'A' and 'iota'.
expected_output = svntest.verify.UnorderedOutput(status[:4])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u')
# Do a status -u at --depth files.
expected_output = svntest.verify.UnorderedOutput(status[:3])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u', '--depth', 'files')
# Upgrade A to depth-files.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'files', '-r1', 'A')
# The output should contain everything but the change on
# gamma (which does not exist in this working copy).
expected_output = svntest.verify.UnorderedOutput(status)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u')
# Do a status -u at --depth immediates.
expected_output = svntest.verify.UnorderedOutput(status[:4])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'st', '-u', '--depth', 'immediates')
#----------------------------------------------------------------------
@@ -1417,7 +1365,7 @@ def depthy_update_above_dir_to_be_deleted(sbox):
}
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
"delete", "-m", "Delete A.", sbox.repo_url + "/A")
def empty_output(wc_dir):
@@ -1466,8 +1414,7 @@ def depthy_update_above_dir_to_be_deleted(sbox):
expected_output_func(wc_dir),
expected_disk,
expected_status_func(wc_dir),
- None, None, None, None, None,
- False,
+ [], False,
"--depth=%s" % depth, wc_dir)
@@ -1512,8 +1459,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', E_path)
verify_depth(None, "immediates", E_path)
@@ -1523,8 +1469,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', E_path)
verify_depth(None, "files", E_path)
@@ -1540,8 +1485,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', B_path)
verify_depth(None, "immediates", B_path)
verify_depth(None, "empty", E_path)
@@ -1560,8 +1504,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty', H_path)
verify_depth(None, "empty", H_path)
@@ -1578,8 +1521,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', D_path)
verify_depth(None, "immediates", D_path)
verify_depth(None, "empty", G_path)
@@ -1597,8 +1539,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty', D_path)
verify_depth(None, "empty", D_path)
@@ -1615,8 +1556,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', A_path)
verify_depth(None, "immediates", A_path)
verify_depth(None, "empty", C_path)
@@ -1635,8 +1575,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', A_path)
verify_depth(None, "files", A_path)
@@ -1651,8 +1590,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty', A_path)
verify_depth(None, "empty", A_path)
@@ -1667,8 +1605,7 @@ def depth_folding_clean_trees_1(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', wc_dir)
verify_depth(None, "files", wc_dir)
@@ -1693,13 +1630,13 @@ def depth_folding_clean_trees_2(sbox):
G_path = os.path.join(D_path, 'G')
# pull in directory A at immediates
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--depth', 'immediates', A_path)
# check to see if it's really at immediates
verify_depth(None, "immediates", A_path)
# pull in directory D at infinity
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'infinity', D_path)
# Run 'svn up --set-depth=immediates' to directory A/D.
@@ -1739,8 +1676,7 @@ def depth_folding_clean_trees_2(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', D_path)
verify_depth(None, "immediates", D_path)
verify_depth(None, "empty", G_path)
@@ -1759,14 +1695,13 @@ def depth_folding_clean_trees_2(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', A_path)
verify_depth(None, "immediates", A_path)
verify_depth(None, "empty", D_path)
# pull in directory D at infinity
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'infinity', D_path)
# Run 'svn up --set-depth=immediates' to directory A.
@@ -1780,14 +1715,13 @@ def depth_folding_clean_trees_2(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', A_path)
verify_depth(None, "immediates", A_path)
verify_depth(None, "empty", D_path)
# pull in directory D at files
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'files', D_path)
# Run 'svn up --set-depth=immediates' to directory A.
@@ -1799,8 +1733,7 @@ def depth_folding_clean_trees_2(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', A_path)
verify_depth(None, "immediates", A_path)
verify_depth(None, "empty", D_path)
@@ -1826,8 +1759,7 @@ def depth_folding_clean_trees_2(sbox):
# expected_output,
# expected_disk,
# expected_status,
-# None, None,
-# None, None, None, None,
+# [], False,
# '--set-depth', 'empty', A_path)
def depth_fold_expand_clean_trees(sbox):
@@ -1843,12 +1775,12 @@ def depth_fold_expand_clean_trees(sbox):
D_path = os.path.join(A_path, 'D')
# pull in directory A at empty
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--depth', 'empty', A_path)
verify_depth(None, "empty", A_path)
# pull in directory D at infinity
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', D_path)
# Make the other working copy.
@@ -1884,8 +1816,7 @@ def depth_fold_expand_clean_trees(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', A_path)
verify_depth(None, "immediates", A_path)
verify_depth(None, "empty", B_path)
@@ -1912,8 +1843,7 @@ def depth_fold_expand_clean_trees(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', Other_A_path)
verify_depth(None, "files", Other_A_path)
@@ -1950,7 +1880,7 @@ def pull_in_tree_with_depth_option(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
"--depth=immediates", A_path)
# Check that the A directory was pull ed in at depth=immediates.
@@ -1976,22 +1906,29 @@ def fold_tree_with_unversioned_modified_items(sbox):
# Fold the A dir to empty, expect the modified & unversioned ones left
# unversioned rather than removed, along with paths to those items.
- # Even though the directory B and D is not deleted because of local
- # modificatoin or unversioned items, there will be only one notification at
- # B and D.
+ # Directories B and D won't be deleted, because that would remove their
+ # local modifications. Their unmodified descendants are deleted though.
expected_output = svntest.wc.State(wc_dir, {
- 'A/B' : Item(status='D '),
+ 'A/B/E' : Item(status='D '),
+ 'A/B/F' : Item(status='D '),
+ 'A/B/lambda' : Item(status='D '),
'A/C' : Item(status='D '),
- 'A/D' : Item(status='D '),
- 'A/mu' : Item(status='D '),
+ 'A/D/G/rho' : Item(status='D '),
+ 'A/D/G/tau' : Item(status='D '),
+ 'A/D/H' : Item(status='D '),
+ 'A/D/gamma' : Item(status='D '),
})
# unversioned items will be ignored in in the status tree, since the
# run_and_verify_update() function uses a quiet version of svn status
- # Dir A is still versioned, since the wc root is in depth-infinity
expected_status = svntest.wc.State(wc_dir, {
'' : Item(status=' ', wc_rev=1),
'iota' : Item(status=' ', wc_rev=1),
- 'A' : Item(status=' ', wc_rev=1)
+ 'A' : Item(status=' ', wc_rev=1),
+ 'A/D' : Item(status=' ', wc_rev='1'),
+ 'A/D/G' : Item(status=' ', wc_rev='1'),
+ 'A/D/G/pi' : Item(status='M ', wc_rev='1'),
+ 'A/B' : Item(status=' ', wc_rev='1'),
+ 'A/mu' : Item(status='M ', wc_rev='1'),
})
expected_disk = svntest.wc.State('', {
'iota' : Item(contents="This is the file 'iota'.\n"),
@@ -2007,8 +1944,7 @@ def fold_tree_with_unversioned_modified_items(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty', A_path)
verify_depth(None, "empty", A_path)
@@ -2026,8 +1962,7 @@ def depth_empty_update_on_file(sbox):
expected_status.tweak('iota', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Update iota with depth=empty.
expected_output = svntest.wc.State(wc_dir,
@@ -2038,7 +1973,7 @@ def depth_empty_update_on_file(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'--depth=empty', '-r1', iota_path)
# Check the revision and created rev.
@@ -2074,8 +2009,7 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'exclude', E_path)
# verify_depth exclude? not implemented yet
@@ -2093,13 +2027,12 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', B_path)
verify_depth(None, "immediates", B_path)
# Exclude A/B/E again
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', E_path)
# Exclude path B totally, in which contains an excluded subtree.
@@ -2112,8 +2045,7 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'exclude', B_path)
# Explicitly pull in excluded path B.
@@ -2131,8 +2063,7 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
B_path)
# Test issue #
@@ -2146,8 +2077,7 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'exclude', iota_path)
# Update the whole WC to depth=infinity.
@@ -2163,8 +2093,7 @@ def excluded_path_update_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'infinity', wc_dir)
def excluded_path_misc_operation(sbox):
@@ -2192,13 +2121,12 @@ def excluded_path_misc_operation(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'exclude', E_path)
# copy A/B to A/L, excluded entry should be copied too
expected_output = ['A '+L_path+'\n']
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'cp', B_path, L_path)
# verify_depth exclude? not implemented yet
#verify_depth(None, "empty", LE_path)
@@ -2209,16 +2137,16 @@ def excluded_path_misc_operation(sbox):
expected_output = svntest.verify.UnorderedOutput([
"Reverted '%s'\n" % path for path in revert_paths])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '--depth=infinity', L_path)
# copy A/B to A/L and then cp A/L to A/M, excluded entry should be
# copied both times
expected_output = ['A '+L_path+'\n']
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'cp', B_path, L_path)
expected_output = ['A '+M_path+'\n']
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'cp', L_path, M_path)
# commit this copy, with an excluded item.
@@ -2236,9 +2164,7 @@ def excluded_path_misc_operation(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Relocate wc, with excluded items in it.
repo_dir = sbox.repo_dir
@@ -2246,17 +2172,17 @@ def excluded_path_misc_operation(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path('other')
svntest.main.copy_repos(repo_dir, other_repo_dir, 2, 0)
svntest.main.safe_rmtree(repo_dir, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '--relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '--relocate',
repo_url, other_repo_url, wc_dir)
# remove the new directory A/L, with an excluded item.
# If successed, no error will be thrown
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', L_path)
# revert the delete
# If successed, no error will be thrown
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--depth=infinity', L_path)
@@ -2283,12 +2209,11 @@ def excluded_receive_remote_removal(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
"--set-depth", "exclude", B_path)
# Remove path B in the repos.
- svntest.actions.run_and_verify_svn(None, None, [], "delete", "-m",
+ svntest.actions.run_and_verify_svn(None, [], "delete", "-m",
"Delete B.", sbox.repo_url + "/A/B")
# Update wc, should receive the removal of excluded path B
@@ -2299,15 +2224,13 @@ def excluded_receive_remote_removal(sbox):
svntest.actions.run_and_verify_update(wc,
None,
expected_disk,
- expected_status,
- None, None,
- None, None, None, None)
+ expected_status)
# Introduce a new path with the same name B.
# This should succeed if the exclude entry is gone with the update,
# otherwise a name conflict will rise up.
expected_output = ['A '+B_path+'\n']
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'cp', C_path, B_path)
@@ -2327,7 +2250,7 @@ def exclude_keeps_hidden_entries(sbox):
# we could grep the 'entries' file, but...
# or we could use 'info', but info_excluded() is XFail.
expected_stderr = ".*svn: E150002: '.*C' is already under version control.*"
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'mkdir', 'C')
@@ -2383,7 +2306,7 @@ def make_depth_tree_conflicts(sbox):
g = j(D, 'gamma')
# Store node modifications as rev 2
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', B)
svntest.main.file_append(m, "Modified mu.\n")
svntest.main.file_append(g, "Modified gamma.\n")
@@ -2401,7 +2324,7 @@ def make_depth_tree_conflicts(sbox):
svntest.actions.run_and_verify_commit(wc,
expected_output,
expected_status,
- None,
+ [],
A)
# Go back to rev 1
@@ -2416,12 +2339,12 @@ def make_depth_tree_conflicts(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'-r1', A)
# Perform node deletions so that items become unversioned and
# will have tree-conflicts upon update.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', m, B, g)
# Update so that conflicts appear
@@ -2458,7 +2381,7 @@ def make_depth_tree_conflicts(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
wc)
@@ -2538,8 +2461,7 @@ def update_excluded_path_sticky_depths(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'exclude', B_path)
# Update to depth 'empty' for the excluded path A/B
@@ -2556,8 +2478,7 @@ def update_excluded_path_sticky_depths(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'empty', B_path)
verify_depth(None, "empty", B_path)
expected_info = {
@@ -2569,7 +2490,7 @@ def update_excluded_path_sticky_depths(sbox):
svntest.actions.run_and_verify_info([expected_info], B_path)
# Exclude A/B again
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', B_path)
# Update to depth 'files' for the excluded path A/B
@@ -2589,8 +2510,7 @@ def update_excluded_path_sticky_depths(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'files', B_path)
verify_depth(None, "files", B_path)
expected_info = {
@@ -2602,7 +2522,7 @@ def update_excluded_path_sticky_depths(sbox):
svntest.actions.run_and_verify_info([expected_info], B_path)
# Exclude A/B again
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', B_path)
# Update to depth 'immediates' for the excluded path A/B
@@ -2628,8 +2548,7 @@ def update_excluded_path_sticky_depths(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'immediates', B_path)
verify_depth(None, "immediates", B_path)
expected_info = {
@@ -2641,7 +2560,7 @@ def update_excluded_path_sticky_depths(sbox):
svntest.actions.run_and_verify_info([expected_info], B_path)
# Exclude A/B again
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', B_path)
# Update to depth 'infinity' for the excluded path A/B
@@ -2659,8 +2578,7 @@ def update_excluded_path_sticky_depths(sbox):
expected_output,
expected_disk,
expected_status,
- None, None,
- None, None, None, None,
+ [], False,
'--set-depth', 'infinity', B_path)
verify_depth(None, "infinity", B_path)
expected_info = {
@@ -2681,7 +2599,7 @@ def update_depth_empty_root_of_infinite_children(sbox):
A_path = os.path.join(wc_dir, 'A')
# Update A to depth 'infinity'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'infinity', A_path)
# Tweak some files in the full working copy and commit.
@@ -2689,7 +2607,7 @@ def update_depth_empty_root_of_infinite_children(sbox):
"Modified alpha.\n")
svntest.main.file_append(os.path.join(wc_other, 'A', 'D', 'G', 'rho'),
"Modified rho.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '', wc_other)
# Now update the original working copy and make sure we get those changes.
@@ -2706,9 +2624,7 @@ def update_depth_empty_root_of_infinite_children(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status,
- None, None,
- None, None, None, None, wc_dir)
+ expected_status)
def sparse_update_with_dash_dash_parents(sbox):
"""update --parents"""
@@ -2721,7 +2637,6 @@ def sparse_update_with_dash_dash_parents(sbox):
# Start with a depth=empty root checkout.
svntest.actions.run_and_verify_svn(
- "Unexpected error from co --depth=empty",
svntest.verify.AnyOutput, [],
"co", "--depth", "empty", sbox.repo_url, sbox.wc_dir)
@@ -2749,7 +2664,7 @@ def sparse_update_with_dash_dash_parents(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'--parents', alpha_path)
expected_output = svntest.wc.State(sbox.wc_dir, {
@@ -2771,7 +2686,7 @@ def sparse_update_with_dash_dash_parents(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'--parents', pi_path)
expected_output = svntest.wc.State(sbox.wc_dir, {
@@ -2790,7 +2705,7 @@ def sparse_update_with_dash_dash_parents(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'--parents', omega_path)
def update_below_depth_empty(sbox):
@@ -2807,11 +2722,11 @@ def update_below_depth_empty(sbox):
'A/D' : Item(status='D '),
})
svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output, None,
- None, None, None, None, None, None,
- False,
+ None,
+ [], False,
'--set-depth', 'empty', A)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', repo_url + '/iota',
repo_url + '/A/B',
'-m', 'remote copy')
@@ -2821,7 +2736,7 @@ def update_below_depth_empty(sbox):
# This update should just update the revision of the working copy
svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output, None,
- None, None)
+ None)
# Test for issue #4136.
@Issue(4136)
@@ -2842,9 +2757,7 @@ def commit_then_immediates_update(sbox):
expected_status.tweak('A/mu', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Now, update --depth immediates in the root of the working copy.
expected_output = svntest.wc.State(wc_dir, { })
@@ -2860,7 +2773,7 @@ def commit_then_immediates_update(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
"--depth=immediates", wc_dir)
def revert_depth_files(sbox):
@@ -2875,7 +2788,7 @@ def revert_depth_files(sbox):
sbox.simple_rm('A/mu')
# Expect reversion of just 'mu'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '--depth=immediates', sbox.ospath('A'))
# Apply an unrelated directory delete
@@ -2883,7 +2796,7 @@ def revert_depth_files(sbox):
sbox.simple_rm('A/mu')
# Expect reversion of just 'mu'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '--depth=files', sbox.ospath('A'))
@Issue(4257)
@@ -2901,13 +2814,88 @@ def spurious_nodes_row(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
"--depth=empty", sbox.wc_dir)
val2 = svntest.wc.sqlite_stmt(sbox.wc_dir, "select count(*) from nodes")
if (val1 != val2):
# ra_neon added a spurious not-present row that does not show up in status
raise svntest.Failure("count changed from '%s' to '%s'" % (val1, val2))
+def commit_excluded(sbox):
+ "commit an excluded node"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/D/G' : Item(status='D '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.remove('A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau')
+
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ None,
+ expected_status,
+ [], False,
+ "--set-depth=exclude",
+ sbox.ospath('A/D/G'))
+
+ sbox.simple_copy('A/D', 'D')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'D' : Item(verb='Adding'),
+ })
+
+ expected_status.add({
+ 'D' : Item(status=' ', wc_rev='2'),
+ 'D/H' : Item(status=' ', wc_rev='2'),
+ 'D/H/chi' : Item(status=' ', wc_rev='2'),
+ 'D/H/psi' : Item(status=' ', wc_rev='2'),
+ 'D/H/omega' : Item(status=' ', wc_rev='2'),
+ 'D/gamma' : Item(status=' ', wc_rev='2')
+ })
+
+ svntest.actions.run_and_verify_commit(wc_dir,
+ expected_output,
+ expected_status)
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/D/G' : Item(status='A '),
+ 'A/D/G/pi' : Item(status='A '),
+ 'A/D/G/tau' : Item(status='A '),
+ 'A/D/G/rho' : Item(status='A '),
+ 'D/G' : Item(status='A '),
+ 'D/G/pi' : Item(status='A '),
+ 'D/G/tau' : Item(status='A '),
+ 'D/G/rho' : Item(status='A ')
+ })
+
+ expected_status.tweak(wc_rev=2)
+
+ expected_status.add({
+ 'D' : Item(status=' ', wc_rev='2'),
+ 'D/G' : Item(status=' ', wc_rev='2'),
+ 'D/G/pi' : Item(status=' ', wc_rev='2'),
+ 'D/G/rho' : Item(status=' ', wc_rev='2'),
+ 'D/G/tau' : Item(status=' ', wc_rev='2'),
+ 'D/H' : Item(status=' ', wc_rev='2'),
+ 'D/H/chi' : Item(status=' ', wc_rev='2'),
+ 'D/H/psi' : Item(status=' ', wc_rev='2'),
+ 'D/H/omega' : Item(status=' ', wc_rev='2'),
+ 'D/gamma' : Item(status=' ', wc_rev='2'),
+ 'A/D/G' : Item(status=' ', wc_rev='2'),
+ 'A/D/G/rho' : Item(status=' ', wc_rev='2'),
+ 'A/D/G/tau' : Item(status=' ', wc_rev='2'),
+ 'A/D/G/pi' : Item(status=' ', wc_rev='2')
+ })
+
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ None,
+ expected_status,
+ [], False,
+ "--set-depth=infinity", wc_dir)
#----------------------------------------------------------------------
# list all tests here, starting with None:
@@ -2959,6 +2947,7 @@ test_list = [ None,
commit_then_immediates_update,
revert_depth_files,
spurious_nodes_row,
+ commit_excluded,
]
if __name__ == "__main__":
diff --git a/subversion/tests/cmdline/diff_tests.py b/subversion/tests/cmdline/diff_tests.py
index aae8c46..f21f887 100755
--- a/subversion/tests/cmdline/diff_tests.py
+++ b/subversion/tests/cmdline/diff_tests.py
@@ -35,6 +35,11 @@ import svntest
from svntest import err, wc
from prop_tests import binary_mime_type_on_text_file_warning
+from svntest.verify import make_diff_header, make_no_diff_deleted_header, \
+ make_diff_header, make_no_diff_deleted_header, \
+ make_git_diff_header, make_diff_prop_header, \
+ make_diff_prop_val, make_diff_prop_deleted, \
+ make_diff_prop_added, make_diff_prop_modified
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -49,172 +54,6 @@ Item = svntest.wc.StateItem
######################################################################
# Generate expected output
-def make_diff_header(path, old_tag, new_tag, src_label=None, dst_label=None):
- """Generate the expected diff header for file PATH, with its old and new
- versions described in parentheses by OLD_TAG and NEW_TAG. SRC_LABEL and
- DST_LABEL are paths or urls that are added to the diff labels if we're
- diffing against the repository or diffing two arbitrary paths.
- Return the header as an array of newline-terminated strings."""
- if src_label:
- src_label = src_label.replace('\\', '/')
- src_label = '\t(.../' + src_label + ')'
- else:
- src_label = ''
- if dst_label:
- dst_label = dst_label.replace('\\', '/')
- dst_label = '\t(.../' + dst_label + ')'
- else:
- dst_label = ''
- path_as_shown = path.replace('\\', '/')
- return [
- "Index: " + path_as_shown + "\n",
- "===================================================================\n",
- "--- " + path_as_shown + src_label + "\t(" + old_tag + ")\n",
- "+++ " + path_as_shown + dst_label + "\t(" + new_tag + ")\n",
- ]
-
-def make_no_diff_deleted_header(path, old_tag, new_tag):
- """Generate the expected diff header for a deleted file PATH when in
- 'no-diff-deleted' mode. (In that mode, no further details appear after the
- header.) Return the header as an array of newline-terminated strings."""
- path_as_shown = path.replace('\\', '/')
- return [
- "Index: " + path_as_shown + " (deleted)\n",
- "===================================================================\n",
- ]
-
-def make_git_diff_header(target_path, repos_relpath,
- old_tag, new_tag, add=False, src_label=None,
- dst_label=None, delete=False, text_changes=True,
- cp=False, mv=False, copyfrom_path=None,
- copyfrom_rev=None):
- """ Generate the expected 'git diff' header for file TARGET_PATH.
- REPOS_RELPATH is the location of the path relative to the repository root.
- The old and new versions ("revision X", or "working copy") must be
- specified in OLD_TAG and NEW_TAG.
- SRC_LABEL and DST_LABEL are paths or urls that are added to the diff
- labels if we're diffing against the repository. ADD, DELETE, CP and MV
- denotes the operations performed on the file. COPYFROM_PATH is the source
- of a copy or move. Return the header as an array of newline-terminated
- strings."""
-
- path_as_shown = target_path.replace('\\', '/')
- if src_label:
- src_label = src_label.replace('\\', '/')
- src_label = '\t(.../' + src_label + ')'
- else:
- src_label = ''
- if dst_label:
- dst_label = dst_label.replace('\\', '/')
- dst_label = '\t(.../' + dst_label + ')'
- else:
- dst_label = ''
-
- output = [
- "Index: " + path_as_shown + "\n",
- "===================================================================\n"
- ]
- if add:
- output.extend([
- "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
- "new file mode 10644\n",
- ])
- if text_changes:
- output.extend([
- "--- /dev/null\t(" + old_tag + ")\n",
- "+++ b/" + repos_relpath + dst_label + "\t(" + new_tag + ")\n"
- ])
- elif delete:
- output.extend([
- "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
- "deleted file mode 10644\n",
- ])
- if text_changes:
- output.extend([
- "--- a/" + repos_relpath + src_label + "\t(" + old_tag + ")\n",
- "+++ /dev/null\t(" + new_tag + ")\n"
- ])
- elif cp:
- if copyfrom_rev:
- copyfrom_rev = '@' + copyfrom_rev
- else:
- copyfrom_rev = ''
- output.extend([
- "diff --git a/" + copyfrom_path + " b/" + repos_relpath + "\n",
- "copy from " + copyfrom_path + copyfrom_rev + "\n",
- "copy to " + repos_relpath + "\n",
- ])
- if text_changes:
- output.extend([
- "--- a/" + copyfrom_path + src_label + "\t(" + old_tag + ")\n",
- "+++ b/" + repos_relpath + "\t(" + new_tag + ")\n"
- ])
- elif mv:
- output.extend([
- "diff --git a/" + copyfrom_path + " b/" + path_as_shown + "\n",
- "rename from " + copyfrom_path + "\n",
- "rename to " + repos_relpath + "\n",
- ])
- if text_changes:
- output.extend([
- "--- a/" + copyfrom_path + src_label + "\t(" + old_tag + ")\n",
- "+++ b/" + repos_relpath + "\t(" + new_tag + ")\n"
- ])
- else:
- output.extend([
- "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
- "--- a/" + repos_relpath + src_label + "\t(" + old_tag + ")\n",
- "+++ b/" + repos_relpath + dst_label + "\t(" + new_tag + ")\n",
- ])
- return output
-
-def make_diff_prop_header(path):
- """Return a property diff sub-header, as a list of newline-terminated
- strings."""
- return [
- "\n",
- "Property changes on: " + path.replace('\\', '/') + "\n",
- "___________________________________________________________________\n"
- ]
-
-def make_diff_prop_val(plus_minus, pval):
- "Return diff for prop value PVAL, with leading PLUS_MINUS (+ or -)."
- if len(pval) > 0 and pval[-1] != '\n':
- return [plus_minus + pval + "\n","\\ No newline at end of property\n"]
- return [plus_minus + pval]
-
-def make_diff_prop_deleted(pname, pval):
- """Return a property diff for deletion of property PNAME, old value PVAL.
- PVAL is a single string with no embedded newlines. Return the result
- as a list of newline-terminated strings."""
- return [
- "Deleted: " + pname + "\n",
- "## -1 +0,0 ##\n"
- ] + make_diff_prop_val("-", pval)
-
-def make_diff_prop_added(pname, pval):
- """Return a property diff for addition of property PNAME, new value PVAL.
- PVAL is a single string with no embedded newlines. Return the result
- as a list of newline-terminated strings."""
- return [
- "Added: " + pname + "\n",
- "## -0,0 +1 ##\n",
- ] + make_diff_prop_val("+", pval)
-
-def make_diff_prop_modified(pname, pval1, pval2):
- """Return a property diff for modification of property PNAME, old value
- PVAL1, new value PVAL2.
-
- PVAL is a single string with no embedded newlines. A newline at the
- end is significant: without it, we add an extra line saying '\ No
- newline at end of property'.
-
- Return the result as a list of newline-terminated strings.
- """
- return [
- "Modified: " + pname + "\n",
- "## -1 +1 ##\n",
- ] + make_diff_prop_val("-", pval1) + make_diff_prop_val("+", pval2)
######################################################################
# Diff output checker
@@ -721,20 +560,9 @@ def diff_non_version_controlled_file(sbox):
svntest.main.file_append(sbox.ospath('A/D/foo'), "a new file")
- exit_code, diff_output, err_output = svntest.main.run_svn(
- 1, 'diff', sbox.ospath('A/D/foo'))
-
- if count_diff_output(diff_output) != 0: raise svntest.Failure
-
- # At one point this would crash, so we would only get a 'Segmentation Fault'
- # error message. The appropriate response is a few lines of errors. I wish
- # there was a way to figure out if svn crashed, but all run_svn gives us is
- # the output, so here we are...
- for line in err_output:
- if re.search("foo' is not under version control$", line):
- break
- else:
- raise svntest.Failure
+ svntest.actions.run_and_verify_svn(None,
+ 'svn: E155010: .*foo\' was not found.',
+ 'diff', sbox.ospath('A/D/foo'))
# test 9
def diff_pure_repository_update_a_file(sbox):
@@ -822,29 +650,29 @@ def diff_only_property_change(sbox):
make_diff_prop_added("svn:eol-style", "native")
os.chdir(sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'svn:eol-style', 'native', 'iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'empty-msg')
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-r', '1:2')
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-c', '2')
- svntest.actions.run_and_verify_svn(None, expected_reverse_output, [],
+ svntest.actions.run_and_verify_svn(expected_reverse_output, [],
'diff', '-r', '2:1')
- svntest.actions.run_and_verify_svn(None, expected_reverse_output, [],
+ svntest.actions.run_and_verify_svn(expected_reverse_output, [],
'diff', '-c', '-2')
- svntest.actions.run_and_verify_svn(None, expected_rev1_output, [],
+ svntest.actions.run_and_verify_svn(expected_rev1_output, [],
'diff', '-r', '1')
- svntest.actions.run_and_verify_svn(None, expected_rev1_output, [],
+ svntest.actions.run_and_verify_svn(expected_rev1_output, [],
'diff', '-r', 'PREV', 'iota')
@@ -881,7 +709,7 @@ def dont_diff_binary_file(sbox):
# Commit the new binary file, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update the whole working copy to HEAD (rev 2)
expected_output = svntest.wc.State(wc_dir, {})
@@ -901,8 +729,7 @@ def dont_diff_binary_file(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- 1) # verify props, too.
+ check_props=True)
# Make a local mod to the binary file.
svntest.main.file_append(theta_path, "some extra junk")
@@ -944,7 +771,7 @@ def dont_diff_binary_file(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Third diff use-case: 'svn diff -r2:3 wc' will compare two
# repository trees.
@@ -1010,7 +837,7 @@ def diff_head_of_moved_file(sbox):
'\ No newline at end of file\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-r', 'HEAD', new_mu_path)
@@ -1041,7 +868,7 @@ def diff_base_to_repos(sbox):
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_output = svntest.wc.State(wc_dir, {})
expected_disk = svntest.main.greek_state.copy()
@@ -1059,7 +886,7 @@ def diff_base_to_repos(sbox):
# the rev2 changes and local mods. That's because the working files
# are being compared to the repository.
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '1', wc_dir)
+ None, [], 'diff', '-r', '1', wc_dir)
# Makes diff output look the same on all platforms.
def strip_eols(lines):
@@ -1079,7 +906,7 @@ def diff_base_to_repos(sbox):
# the rev2 changes and NOT the local mods. That's because the
# text-bases are being compared to the repository.
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'BASE:1', wc_dir)
+ None, [], 'diff', '-r', 'BASE:1', wc_dir)
expected_output_lines = make_diff_header(iota_path, "working copy",
"revision 1") + [
@@ -1097,7 +924,7 @@ def diff_base_to_repos(sbox):
# look exactly the same as 'svn diff -r2:1'. (If you remove the
# header commentary)
exit_code, diff_output2, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '2:1', wc_dir)
+ None, [], 'diff', '-r', '2:1', wc_dir)
diff_output[2:4] = []
diff_output2[2:4] = []
@@ -1107,10 +934,10 @@ def diff_base_to_repos(sbox):
# and similarly, does 'svn diff -r1:2' == 'svn diff -r1:BASE' ?
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '1:2', wc_dir)
+ None, [], 'diff', '-r', '1:2', wc_dir)
exit_code, diff_output2, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '1:BASE', wc_dir)
+ None, [], 'diff', '-r', '1:BASE', wc_dir)
diff_output[2:4] = []
diff_output2[2:4] = []
@@ -1135,16 +962,16 @@ def diff_base_to_repos(sbox):
# -r2:1 and -rBASE:1. None of these diffs should mention the
# scheduled addition or deletion.
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '1:2', wc_dir)
+ None, [], 'diff', '-r', '1:2', wc_dir)
exit_code, diff_output2, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '1:BASE', wc_dir)
+ None, [], 'diff', '-r', '1:BASE', wc_dir)
exit_code, diff_output3, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '2:1', wc_dir)
+ None, [], 'diff', '-r', '2:1', wc_dir)
exit_code, diff_output4, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'BASE:1', wc_dir)
+ None, [], 'diff', '-r', 'BASE:1', wc_dir)
diff_output[2:4] = []
diff_output2[2:4] = []
@@ -1171,7 +998,7 @@ def diff_base_to_repos(sbox):
'A/D/newfile' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_output = svntest.wc.State(wc_dir, {})
expected_disk = svntest.main.greek_state.copy()
@@ -1192,10 +1019,10 @@ def diff_base_to_repos(sbox):
# Now 'svn diff -r3:2' should == 'svn diff -rBASE:2', showing the
# removal of changes to iota, the adding of mu, and deletion of newfile.
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', '3:2', wc_dir)
+ None, [], 'diff', '-r', '3:2', wc_dir)
exit_code, diff_output2, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'BASE:2', wc_dir)
+ None, [], 'diff', '-r', 'BASE:2', wc_dir)
# to do the comparison, remove all output lines starting with +++ or ---
re_infoline = re.compile('^(\+\+\+|---).*$')
@@ -1239,7 +1066,7 @@ def diff_deleted_in_head(sbox):
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_output = svntest.wc.State(wc_dir, {})
expected_disk = svntest.main.greek_state.copy()
@@ -1262,12 +1089,12 @@ def diff_deleted_in_head(sbox):
'A/C')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Doing an 'svn diff -r1:2' on the URL of directory A should work,
# especially over the DAV layer.
the_url = sbox.repo_url + '/A'
- diff_output = svntest.actions.run_and_verify_svn(None, None, [],
+ diff_output = svntest.actions.run_and_verify_svn(None, [],
'diff', '-r',
'1:2', the_url + "@2")
@@ -1351,22 +1178,22 @@ def diff_branches(sbox):
A_url = sbox.repo_url + '/A'
A2_url = sbox.repo_url + '/A2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg',
A_url, A2_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
A_alpha = sbox.ospath('A/B/E/alpha')
A2_alpha = sbox.ospath('A2/B/E/alpha')
svntest.main.file_append(A_alpha, "\nfoo\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
svntest.main.file_append(A2_alpha, "\nbar\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
svntest.main.file_append(A_alpha, "zig\n")
@@ -1375,21 +1202,21 @@ def diff_branches(sbox):
# another branch
rel_path = os.path.join('B', 'E', 'alpha')
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '--old', A_url, '--new', A2_url, rel_path)
+ None, [], 'diff', '--old', A_url, '--new', A2_url, rel_path)
verify_expected_output(diff_output, "-foo")
verify_expected_output(diff_output, "+bar")
# Same again but using whole branch
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '--old', A_url, '--new', A2_url)
+ None, [], 'diff', '--old', A_url, '--new', A2_url)
verify_expected_output(diff_output, "-foo")
verify_expected_output(diff_output, "+bar")
# Compare two repository files on different branches
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'diff', A_url + '/B/E/alpha', A2_url + '/B/E/alpha')
verify_expected_output(diff_output, "-foo")
@@ -1397,14 +1224,14 @@ def diff_branches(sbox):
# Compare two versions of a file on a single branch
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'diff', A_url + '/B/E/alpha@2', A_url + '/B/E/alpha@3')
verify_expected_output(diff_output, "+foo")
# Compare identical files on different branches
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, [], [],
+ [], [],
'diff', A_url + '/B/E/alpha@2', A2_url + '/B/E/alpha@3')
@@ -1417,22 +1244,22 @@ def diff_repos_and_wc(sbox):
A_url = sbox.repo_url + '/A'
A2_url = sbox.repo_url + '/A2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg',
A_url, A2_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
A_alpha = sbox.ospath('A/B/E/alpha')
A2_alpha = sbox.ospath('A2/B/E/alpha')
svntest.main.file_append(A_alpha, "\nfoo\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
svntest.main.file_append(A2_alpha, "\nbar\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
svntest.main.file_append(A_alpha, "zig\n")
@@ -1442,7 +1269,7 @@ def diff_repos_and_wc(sbox):
A_path = sbox.ospath('A')
rel_path = os.path.join('B', 'E', 'alpha')
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'diff', '--old', A2_url, '--new', A_path, rel_path)
verify_expected_output(diff_output, "-bar")
@@ -1451,7 +1278,7 @@ def diff_repos_and_wc(sbox):
# Same again but using whole branch
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'diff', '--old', A2_url, '--new', A_path)
verify_expected_output(diff_output, "-bar")
@@ -1475,32 +1302,32 @@ def diff_file_urls(sbox):
os.remove(iota_path)
svntest.main.file_append(iota_path, "foo\nbar\nsnafu\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', iota_path)
# Now, copy the file elsewhere, twice.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg',
iota_url, iota_copy_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg',
iota_url, iota_copy2_url)
# Update (to get the copies)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
# Now, make edits to one of the copies of iota, and commit.
os.remove(iota_copy_path)
svntest.main.file_append(iota_copy_path, "foo\nsnafu\nabcdefg\nopqrstuv\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', iota_copy_path)
# Finally, do a diff between the first and second copies of iota,
# and verify that we got the expected lines. And then do it in reverse!
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff',
iota_copy_url,
iota_copy2_url)
@@ -1509,7 +1336,7 @@ def diff_file_urls(sbox):
verify_expected_output(out, "-abcdefg")
verify_expected_output(out, "-opqrstuv")
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff',
iota_copy2_url,
iota_copy_url)
@@ -1528,16 +1355,16 @@ def diff_prop_change_local_edit(sbox):
iota_url = sbox.repo_url + '/iota'
# Change a property on iota, and commit.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'pname', 'pvalue', iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', iota_path)
# Make local edits to iota.
svntest.main.file_append(iota_path, "\nMore text.\n")
# diff r1:COMMITTED should show the property change but not the local edit.
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff',
'-r1:COMMITTED',
iota_path)
@@ -1547,7 +1374,7 @@ def diff_prop_change_local_edit(sbox):
verify_expected_output(out, "+pvalue")
# diff r1:BASE should show the property change but not the local edit.
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff', '-r1:BASE',
iota_path)
for line in out:
@@ -1556,7 +1383,7 @@ def diff_prop_change_local_edit(sbox):
verify_expected_output(out, "+pvalue") # fails at r7481
# diff r1:WC should show the local edit as well as the property change.
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff', '-r1',
iota_path)
verify_expected_output(out, "+More text.") # fails at r7481
@@ -1570,37 +1397,37 @@ def check_for_omitted_prefix_in_path_component(sbox):
svntest.actions.do_sleep_for_timestamps()
prefix_path = sbox.ospath('prefix_mydir')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', prefix_path)
other_prefix_path = sbox.ospath('prefix_other')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', other_prefix_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
file_path = os.path.join(prefix_path, "test.txt")
svntest.main.file_write(file_path, "Hello\nThere\nIota\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', file_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', sbox.wc_dir)
prefix_url = sbox.repo_url + "/prefix_mydir"
other_prefix_url = sbox.repo_url + "/prefix_other/mytag"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg', prefix_url,
other_prefix_url)
svntest.main.file_write(file_path, "Hello\nWorld\nIota\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', prefix_path)
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'diff', prefix_url,
other_prefix_url)
@@ -1627,12 +1454,12 @@ def diff_renamed_file(sbox):
pi2_path = os.path.join('A', 'D', 'pi2')
svntest.main.file_write(pi_path, "new pi")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg')
svntest.main.file_append(pi_path, "even more pi")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg')
svntest.main.run_svn(None, 'mv', pi_path, pi2_path)
@@ -1703,7 +1530,7 @@ def diff_renamed_file(sbox):
raise svntest.Failure
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg')
# Repos->WC diff of file after the rename
@@ -1758,7 +1585,7 @@ def diff_within_renamed_dir(sbox):
'M') :
raise svntest.Failure
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg')
# Check repos->wc after commit
@@ -1801,15 +1628,15 @@ def diff_prop_on_named_dir(sbox):
os.chdir(sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'p', 'v', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', 'p', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '')
exit_code, diff_output, err_output = svntest.main.run_svn(None, 'diff',
@@ -1825,7 +1652,7 @@ def diff_keywords(sbox):
iota_path = sbox.ospath('iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps',
'svn:keywords',
'Id Rev Date',
@@ -1840,18 +1667,18 @@ def diff_keywords(sbox):
fp.write("$Rev::%s$\n" % (' ' * 80))
fp.close()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'keywords', sbox.wc_dir)
svntest.main.file_append(iota_path, "bar\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'added bar', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'prev:head', sbox.wc_dir)
+ None, [], 'diff', '-r', 'prev:head', sbox.wc_dir)
verify_expected_output(diff_output, "+bar")
verify_excluded_output(diff_output, "$Date:")
@@ -1859,7 +1686,7 @@ def diff_keywords(sbox):
verify_excluded_output(diff_output, "$Id:")
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'head:prev', sbox.wc_dir)
+ None, [], 'diff', '-r', 'head:prev', sbox.wc_dir)
verify_expected_output(diff_output, "-bar")
verify_excluded_output(diff_output, "$Date:")
@@ -1877,13 +1704,13 @@ def diff_keywords(sbox):
fp.write("$Rev::%s$\n" % (' ' * 79))
fp.close()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'keywords 2', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
exit_code, diff_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'prev:head', sbox.wc_dir)
+ None, [], 'diff', '-r', 'prev:head', sbox.wc_dir)
# these should show up
verify_expected_output(diff_output, "+$Id:: ")
@@ -1899,7 +1726,7 @@ def diff_keywords(sbox):
def diff_force(sbox):
- "show diffs for binary files with --force"
+ "show diffs for binary files"
sbox.build()
wc_dir = sbox.wc_dir
@@ -1925,7 +1752,7 @@ def diff_force(sbox):
# Commit iota, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Add another line, while keeping he file as binary.
svntest.main.file_append(iota_path, "another line")
@@ -1941,36 +1768,22 @@ def diff_force(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
- # Check that we get diff when the first, the second and both files are
- # marked as binary.
+ # Check that we get diff when the first, the second and both files
+ # are marked as binary. First we'll use --force. Then we'll use
+ # the configuration option 'diff-ignore-content-type'.
re_nodisplay = re.compile('^Cannot display:')
- exit_code, stdout, stderr = svntest.main.run_svn(None,
- 'diff', '-r1:2', iota_path,
- '--force')
-
- for line in stdout:
- if (re_nodisplay.match(line)):
- raise svntest.Failure
-
- exit_code, stdout, stderr = svntest.main.run_svn(None,
- 'diff', '-r2:1', iota_path,
- '--force')
-
- for line in stdout:
- if (re_nodisplay.match(line)):
- raise svntest.Failure
-
- exit_code, stdout, stderr = svntest.main.run_svn(None,
- 'diff', '-r2:3', iota_path,
- '--force')
-
- for line in stdout:
- if (re_nodisplay.match(line)):
- raise svntest.Failure
+ for opt in ['--force',
+ '--config-option=config:miscellany:diff-ignore-content-type=yes']:
+ for range in ['-r1:2', '-r2:1', '-r2:3']:
+ exit_code, stdout, stderr = svntest.main.run_svn(None, 'diff', range,
+ iota_path, opt)
+ for line in stdout:
+ if (re_nodisplay.match(line)):
+ raise svntest.Failure
#----------------------------------------------------------------------
# Regression test for issue #2333: Renaming a directory should produce
@@ -2017,7 +1830,7 @@ def diff_renamed_dir(sbox):
raise svntest.Failure
# Commit
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg')
# Check repos->wc after commit
@@ -2144,61 +1957,61 @@ def diff_property_changes_to_base(sbox):
os.chdir(sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'fileprop', 'r2value', 'iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'dirprop', 'r2value', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'empty-msg')
# Check that forward and reverse repos-repos diffs are as expected.
expected = svntest.verify.UnorderedOutput(expected_output_r1_r2)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '1:2')
expected = svntest.verify.UnorderedOutput(expected_output_r2_r1)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '2:1')
# Now check repos->WORKING, repos->BASE, and BASE->repos.
# (BASE is r1, and WORKING has no local mods, so this should produce
# the same output as above).
expected = svntest.verify.UnorderedOutput(expected_output_r1)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '1')
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '1:BASE')
expected = svntest.verify.UnorderedOutput(expected_output_base_r1)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', 'BASE:1')
# Modify some properties.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'fileprop', 'workingvalue', 'iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'dirprop', 'workingvalue', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset',
'fileprop', 'workingvalue', 'A/mu')
# Check that the earlier diffs against BASE are unaffected by the
# presence of local mods (with the exception of diff header changes).
expected = svntest.verify.UnorderedOutput(expected_output_r1)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '1:BASE')
expected = svntest.verify.UnorderedOutput(expected_output_base_r1)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', 'BASE:1')
def diff_schedule_delete(sbox):
@@ -2207,37 +2020,37 @@ def diff_schedule_delete(sbox):
sbox.build()
expected_output_r2_working = make_diff_header("foo", "revision 2",
- "working copy") + [
+ "nonexistent") + [
"@@ -1 +0,0 @@\n",
"-xxx\n"
]
expected_output_r2_base = make_diff_header("foo", "revision 2",
- "working copy") + [
+ "nonexistent") + [
"@@ -1 +0,0 @@\n",
"-xxx\n",
]
- expected_output_base_r2 = make_diff_header("foo", "revision 0",
+ expected_output_base_r2 = make_diff_header("foo", "nonexistent",
"revision 2") + [
"@@ -0,0 +1 @@\n",
"+xxx\n",
]
- expected_output_r1_base = make_diff_header("foo", "revision 0",
+ expected_output_r1_base = make_diff_header("foo", "nonexistent",
"working copy") + [
"@@ -0,0 +1,2 @@\n",
"+xxx\n",
"+yyy\n"
]
expected_output_base_r1 = make_diff_header("foo", "working copy",
- "revision 1") + [
+ "nonexistent") + [
"@@ -1,2 +0,0 @@\n",
"-xxx\n",
"-yyy\n"
]
expected_output_base_working = expected_output_base_r1[:]
expected_output_base_working[2] = "--- foo\t(revision 3)\n"
- expected_output_base_working[3] = "+++ foo\t(working copy)\n"
+ expected_output_base_working[3] = "+++ foo\t(nonexistent)\n"
wc_dir = sbox.wc_dir
os.chdir(wc_dir)
@@ -2260,23 +2073,23 @@ def diff_schedule_delete(sbox):
# in WORKING, but diffs against BASE should remain unaffected.
# 1. repos-wc diff: file not present in repos.
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'diff', '-r', '1')
- svntest.actions.run_and_verify_svn(None, expected_output_r1_base, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_base, [],
'diff', '-r', '1:BASE')
- svntest.actions.run_and_verify_svn(None, expected_output_base_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_base_r1, [],
'diff', '-r', 'BASE:1')
# 2. repos-wc diff: file present in repos.
- svntest.actions.run_and_verify_svn(None, expected_output_r2_working, [],
+ svntest.actions.run_and_verify_svn(expected_output_r2_working, [],
'diff', '-r', '2')
- svntest.actions.run_and_verify_svn(None, expected_output_r2_base, [],
+ svntest.actions.run_and_verify_svn(expected_output_r2_base, [],
'diff', '-r', '2:BASE')
- svntest.actions.run_and_verify_svn(None, expected_output_base_r2, [],
+ svntest.actions.run_and_verify_svn(expected_output_base_r2, [],
'diff', '-r', 'BASE:2')
# 3. wc-wc diff.
- svntest.actions.run_and_verify_svn(None, expected_output_base_working, [],
+ svntest.actions.run_and_verify_svn(expected_output_base_working, [],
'diff')
#----------------------------------------------------------------------
@@ -2303,40 +2116,40 @@ def diff_mime_type_changes(sbox):
# Append some text to iota (r2).
svntest.main.file_append('iota', "revision 2 text.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Check that forward and reverse repos-BASE diffs are as expected.
- svntest.actions.run_and_verify_svn(None, expected_output_r1_wc, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_wc, [],
'diff', '-r', '1:BASE')
- svntest.actions.run_and_verify_svn(None, expected_output_wc_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_wc_r1, [],
'diff', '-r', 'BASE:1')
# Mark iota as a binary file in the working copy.
- svntest.actions.run_and_verify_svn2(None, None,
+ svntest.actions.run_and_verify_svn2(None,
binary_mime_type_on_text_file_warning, 0,
'propset', 'svn:mime-type',
'application/octet-stream', 'iota')
# Check that the earlier diffs against BASE are unaffected by the
# presence of local svn:mime-type property mods.
- svntest.actions.run_and_verify_svn(None, expected_output_r1_wc, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_wc, [],
'diff', '-r', '1:BASE')
- svntest.actions.run_and_verify_svn(None, expected_output_wc_r1, [],
+ svntest.actions.run_and_verify_svn(expected_output_wc_r1, [],
'diff', '-r', 'BASE:1')
# Commit the change (r3) (so that BASE has the binary MIME type), then
# mark iota as a text file again in the working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', 'svn:mime-type', 'iota')
# Now diffs against BASE will fail, but diffs against WORKNG should be
# fine.
- svntest.actions.run_and_verify_svn(None, expected_output_r1_wc, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_wc, [],
'diff', '-r', '1')
@@ -2361,37 +2174,37 @@ def diff_prop_change_local_propmod(sbox):
os.chdir(sbox.wc_dir)
# Set a property on A/ and iota, and commit them (r2).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'dirprop',
'r2value', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'fileprop',
'r2value', 'iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Change the property values on A/ and iota, and commit them (r3).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'dirprop',
'r3value', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'fileprop',
'r3value', 'iota')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Finally, change the property values one last time.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'dirprop',
'workingvalue', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'fileprop',
'workingvalue', 'iota')
# And also add some properties that only exist in WORKING.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'newdirprop',
'newworkingvalue', 'A')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'newfileprop',
'newworkingvalue', 'iota')
@@ -2404,7 +2217,7 @@ def diff_prop_change_local_propmod(sbox):
# are included in the output, since they won't be listed in a simple
# BASE->r2 diff.
expected = svntest.verify.UnorderedOutput(expected_output_r2_wc)
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
'diff', '-r', '2')
@@ -2430,17 +2243,17 @@ def diff_repos_wc_add_with_props(sbox):
] + make_diff_prop_header("X/bar") + \
make_diff_prop_added("propname", "propvalue")
- diff_X_r1_base = make_diff_header("X", "revision 0",
+ diff_X_r1_base = make_diff_header("X", "nonexistent",
"working copy") + diff_X
- diff_X_base_r3 = make_diff_header("X", "revision 0",
+ diff_X_base_r3 = make_diff_header("X", "nonexistent",
"revision 3") + diff_X
- diff_foo_r1_base = make_diff_header("foo", "revision 0",
+ diff_foo_r1_base = make_diff_header("foo", "nonexistent",
"revision 3") + diff_foo
- diff_foo_base_r3 = make_diff_header("foo", "revision 0",
+ diff_foo_base_r3 = make_diff_header("foo", "nonexistent",
"revision 3") + diff_foo
- diff_X_bar_r1_base = make_diff_header("X/bar", "revision 0",
+ diff_X_bar_r1_base = make_diff_header("X/bar", "nonexistent",
"revision 3") + diff_X_bar
- diff_X_bar_base_r3 = make_diff_header("X/bar", "revision 0",
+ diff_X_bar_base_r3 = make_diff_header("X/bar", "nonexistent",
"revision 3") + diff_X_bar
expected_output_r1_base = svntest.verify.UnorderedOutput(diff_X_r1_base +
@@ -2456,32 +2269,32 @@ def diff_repos_wc_add_with_props(sbox):
os.makedirs('X')
svntest.main.file_append('foo', "content\n")
svntest.main.file_append(os.path.join('X', 'bar'), "content\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', 'X', 'foo')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Set a property on all three items, and commit them (r3).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'propname',
'propvalue', 'X', 'foo',
os.path.join('X', 'bar'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Now, if we diff r1 to WORKING or BASE, we should see the content
# addition for foo and X/bar, and property additions for all three.
- svntest.actions.run_and_verify_svn(None, expected_output_r1_base, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_base, [],
'diff', '-r', '1')
- svntest.actions.run_and_verify_svn(None, expected_output_r1_base, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_base, [],
'diff', '-r', '1:BASE')
# Update the BASE and WORKING revisions to r1.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1')
# If we diff BASE to r3, we should see the same output as above.
- svntest.actions.run_and_verify_svn(None, expected_output_base_r3, [],
+ svntest.actions.run_and_verify_svn(expected_output_base_r3, [],
'diff', '-r', 'BASE:3')
@@ -2526,11 +2339,11 @@ def diff_repos_working_added_dir(sbox):
sbox.build()
- expected_output_r1_BASE = make_diff_header("X/bar", "revision 0",
+ expected_output_r1_BASE = make_diff_header("X/bar", "nonexistent",
"revision 2") + [
"@@ -0,0 +1 @@\n",
"+content\n" ]
- expected_output_r1_WORKING = make_diff_header("X/bar", "revision 0",
+ expected_output_r1_WORKING = make_diff_header("X/bar", "nonexistent",
"working copy") + [
"@@ -0,0 +1,2 @@\n",
"+content\n",
@@ -2541,9 +2354,9 @@ def diff_repos_working_added_dir(sbox):
# Create directory X and file X/bar, and commit them (r2).
os.makedirs('X')
svntest.main.file_append(os.path.join('X', 'bar'), "content\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', 'X')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log_msg')
# Make a local modification to X/bar.
@@ -2551,9 +2364,9 @@ def diff_repos_working_added_dir(sbox):
# Now, if we diff r1 to WORKING or BASE, we should see the content
# addition for X/bar, and (for WORKING) the local modification.
- svntest.actions.run_and_verify_svn(None, expected_output_r1_BASE, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_BASE, [],
'diff', '-r', '1:BASE')
- svntest.actions.run_and_verify_svn(None, expected_output_r1_WORKING, [],
+ svntest.actions.run_and_verify_svn(expected_output_r1_WORKING, [],
'diff', '-r', '1')
@@ -2572,12 +2385,12 @@ def diff_base_repos_moved(sbox):
# Move, modify and commit a file
svntest.main.run_svn(None, 'mv', oldfile, newfile)
svntest.main.file_write(newfile, "new content\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '')
# Check that a base->repos diff with copyfrom shows deleted and added lines.
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, svntest.verify.AnyOutput, [], 'diff', '-rBASE:1', newfile)
+ svntest.verify.AnyOutput, [], 'diff', '-rBASE:1', newfile)
if check_diff_output(out, newfile, 'M'):
raise svntest.Failure
@@ -2599,14 +2412,14 @@ def diff_added_subtree(sbox):
os.chdir(sbox.wc_dir)
# Roll the wc back to r0 (i.e. an empty wc).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r0')
# We shouldn't get any errors when we request a diff showing the
# addition of the greek tree. The diff contains additions of files
# and directories with parents that don't currently exist in the wc,
# which is what we're testing here.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'diff', '-r', 'BASE:1')
#----------------------------------------------------------------------
@@ -2766,6 +2579,20 @@ def basic_diff_summarize(sbox):
svntest.actions.run_and_verify_diff_summarize(expected_reverse_diff,
wc_dir, '-c-3')
+ # Get the differences between a deep newly added dir Issue(4421)
+ expected_diff = svntest.wc.State(wc_dir, {
+ 'Q/R' : Item(status='A '),
+ 'Q/R/newfile' : Item(status='A '),
+ })
+ expected_reverse_diff = svntest.wc.State(wc_dir, {
+ 'Q/R' : Item(status='D '),
+ 'Q/R/newfile' : Item(status='D '),
+ })
+ svntest.actions.run_and_verify_diff_summarize(expected_diff,
+ p('Q/R'), '-c3')
+ svntest.actions.run_and_verify_diff_summarize(expected_reverse_diff,
+ p('Q/R'), '-c-3')
+
#----------------------------------------------------------------------
def diff_weird_author(sbox):
"diff with svn:author that has < in it"
@@ -2785,14 +2612,13 @@ def diff_weird_author(sbox):
expected_status.tweak("A/mu", wc_rev=2)
svntest.actions.run_and_verify_commit(sbox.wc_dir, expected_output,
- expected_status, None, sbox.wc_dir)
+ expected_status)
svntest.main.run_svn(None,
"propset", "--revprop", "-r", "2", "svn:author",
"J. Random <jrandom@example.com>", sbox.repo_url)
- svntest.actions.run_and_verify_svn(None,
- ["J. Random <jrandom@example.com>\n"],
+ svntest.actions.run_and_verify_svn(["J. Random <jrandom@example.com>\n"],
[],
"pget", "--revprop", "-r" "2",
"svn:author", sbox.repo_url)
@@ -2803,7 +2629,7 @@ def diff_weird_author(sbox):
"+new content\n"
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-r1:2', sbox.repo_url)
# test for issue 2121, use -x -w option for ignoring whitespace during diff
@@ -2825,7 +2651,7 @@ def diff_ignore_whitespace(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None,)
# only whitespace changes, should return no changes
svntest.main.file_write(file_path,
@@ -2833,7 +2659,7 @@ def diff_ignore_whitespace(sbox):
" B b \n"
" C c \n")
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'diff', '-x', '-w', file_path)
# some changes + whitespace
@@ -2851,7 +2677,7 @@ def diff_ignore_whitespace(sbox):
"+ Bb b \n",
" Cc\n" ]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-x', '-w', file_path)
def diff_ignore_eolstyle(sbox):
@@ -2871,7 +2697,7 @@ def diff_ignore_eolstyle(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# commit only eol changes
svntest.main.file_write(file_path,
@@ -2888,7 +2714,7 @@ def diff_ignore_eolstyle(sbox):
"+Cc\n",
"\ No newline at end of file\n" ]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-x', '--ignore-eol-style',
file_path)
@@ -2919,7 +2745,7 @@ def diff_in_renamed_folder(sbox):
### child of the A/D/C copy. thus, it appears in the status output as a
### (M)odified child.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
expected_output = svntest.wc.State(wc_dir, {
'A/D/C/kappa' : Item(verb='Sending'),
@@ -2929,7 +2755,7 @@ def diff_in_renamed_folder(sbox):
for i in range(3, 5):
svntest.main.file_append(kappa_path, str(i) + "\n")
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
expected_output = make_diff_header(kappa_path, "revision 3",
"revision 4") + [
@@ -2939,7 +2765,7 @@ def diff_in_renamed_folder(sbox):
"+4\n"
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-r3:4', kappa_path)
def diff_with_depth(sbox):
@@ -2989,17 +2815,17 @@ def diff_with_depth(sbox):
# Test wc-wc diff.
expected_diffs = create_expected_diffs("revision 1", "working copy")
for depth in ['empty', 'files', 'immediates', 'infinity']:
- svntest.actions.run_and_verify_svn(None, expected_diffs[depth], [],
+ svntest.actions.run_and_verify_svn(expected_diffs[depth], [],
'diff', '--depth', depth)
# Commit the changes.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '')
# Test repos-repos diff.
expected_diffs = create_expected_diffs("revision 1", "revision 2")
for depth in ['empty', 'files', 'immediates', 'infinity']:
- svntest.actions.run_and_verify_svn(None, expected_diffs[depth], [],
+ svntest.actions.run_and_verify_svn(expected_diffs[depth], [],
'diff', '-c2', '--depth', depth)
def create_expected_repos_wc_diffs():
@@ -3042,7 +2868,7 @@ def diff_with_depth(sbox):
diff_dot)
return expected
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r1')
sbox.simple_propset('foo1', 'baz1', '.')
@@ -3055,7 +2881,7 @@ def diff_with_depth(sbox):
# Test wc-repos diff.
expected_diffs = create_expected_repos_wc_diffs()
for depth in ['empty', 'files', 'immediates', 'infinity']:
- svntest.actions.run_and_verify_svn(None, expected_diffs[depth], [],
+ svntest.actions.run_and_verify_svn(expected_diffs[depth], [],
'diff', '-rHEAD', '--depth', depth)
# test for issue 2920: ignore eol-style on empty lines
@@ -3079,7 +2905,7 @@ def diff_ignore_eolstyle_empty_lines(sbox):
'iota' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# sleep to guarantee timestamp change
time.sleep(1.1)
@@ -3093,7 +2919,7 @@ def diff_ignore_eolstyle_empty_lines(sbox):
"Cc\012",
mode="wb")
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'diff', '-x', '--ignore-eol-style',
file_path)
@@ -3115,13 +2941,13 @@ def diff_backward_repos_wc_copy(sbox):
svntest.main.run_svn(None, 'up', '-r1')
# diff r2 against working copy
- diff_repos_wc = make_diff_header("A/mucopy", "revision 2", "working copy")
+ diff_repos_wc = make_diff_header("A/mucopy", "revision 2", "nonexistent")
diff_repos_wc += [
"@@ -1 +0,0 @@\n",
"-This is the file 'mu'.\n",
]
- svntest.actions.run_and_verify_svn(None, diff_repos_wc, [],
+ svntest.actions.run_and_verify_svn(diff_repos_wc, [],
'diff', '-r' , '2')
#----------------------------------------------------------------------
@@ -3186,11 +3012,11 @@ def diff_summarize_xml(sbox):
[], wc_dir, paths, items, props, kinds, wc_dir)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# 1) Test --xml without --summarize
svntest.actions.run_and_verify_svn(
- None, None, ".*--xml' option only valid with '--summarize' option",
+ None, ".*--xml' option only valid with '--summarize' option",
'diff', wc_dir, '--xml')
# 2) Test --xml on invalid revision
@@ -3234,7 +3060,7 @@ def diff_wrong_extension_type(sbox):
"'svn diff -x wc -r#' should return error"
sbox.build(read_only = True)
- svntest.actions.run_and_verify_svn(None, [], err.INVALID_DIFF_OPTION,
+ svntest.actions.run_and_verify_svn([], err.INVALID_DIFF_OPTION,
'diff', '-x', sbox.wc_dir, '-r', '1')
# Check the order of the arguments for an external diff tool
@@ -3270,7 +3096,7 @@ def diff_external_diffcmd(sbox):
# Check that the output of diff corresponds with the expected arguments,
# in the correct order.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--diff-cmd', diff_script_path,
iota_path)
@@ -3309,16 +3135,16 @@ def diff_url_against_local_mods(sbox):
A2 = 'A2'
A2_url = sbox.repo_url + '/A2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'log msg',
A_url, A2_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up')
# In A, add, remove and change a file, and commit.
make_file_edit_del_add(A)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'committing A')
# In A2, do the same changes but leave uncommitted.
@@ -3327,12 +3153,12 @@ def diff_url_against_local_mods(sbox):
# Diff Path of A against working copy of A2.
# Output using arbritrary diff handling should be empty.
expected_output = []
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--old', A, '--new', A2)
# Diff URL of A against working copy of A2. Output should be empty.
expected_output = []
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--old', A_url, '--new', A2)
@@ -3349,7 +3175,7 @@ def diff_preexisting_rev_against_local_add(sbox):
# remove
svntest.main.run_svn(None, 'remove', beta)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'removing beta')
# re-add, without committing
@@ -3387,7 +3213,7 @@ def diff_git_format_wc_wc(sbox):
expected_output = make_git_diff_header(
alpha_copied_path, "A/B/E/alpha_copied",
- "revision 0", "working copy",
+ "revision 1", "working copy",
copyfrom_path="A/B/E/alpha",
copyfrom_rev='1', cp=True,
text_changes=True) + [
@@ -3401,7 +3227,7 @@ def diff_git_format_wc_wc(sbox):
copyfrom_rev='1', cp=True,
text_changes=False) \
+ make_git_diff_header(mu_path, "A/mu", "revision 1",
- "working copy",
+ "nonexistent",
delete=True) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'mu'.\n",
@@ -3410,7 +3236,7 @@ def diff_git_format_wc_wc(sbox):
"@@ -1 +1,2 @@\n",
" This is the file 'iota'.\n",
"+Changed 'iota'.\n",
- ] + make_git_diff_header(new_path, "new", "revision 0",
+ ] + make_git_diff_header(new_path, "new", "nonexistent",
"working copy", add=True) + [
"@@ -0,0 +1 @@\n",
"+This is the file 'new'.\n",
@@ -3418,7 +3244,7 @@ def diff_git_format_wc_wc(sbox):
expected = expected_output
- svntest.actions.run_and_verify_svn(None, expected, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected, [], 'diff',
'--git', wc_dir)
@Issue(4294)
@@ -3438,19 +3264,19 @@ def diff_git_format_wc_wc_dir_mv(sbox):
svntest.main.run_svn(None, 'mv', g_path, g2_path)
expected_output = make_git_diff_header(pi_path, "A/D/G/pi",
- "revision 1", "working copy",
+ "revision 1", "nonexistent",
delete=True) \
+ [
"@@ -1 +0,0 @@\n",
"-This is the file 'pi'.\n"
] + make_git_diff_header(rho_path, "A/D/G/rho",
- "revision 1", "working copy",
+ "revision 1", "nonexistent",
delete=True) \
+ [
"@@ -1 +0,0 @@\n",
"-This is the file 'rho'.\n"
] + make_git_diff_header(tau_path, "A/D/G/tau",
- "revision 1", "working copy",
+ "revision 1", "nonexistent",
delete=True) \
+ [
"@@ -1 +0,0 @@\n",
@@ -3464,7 +3290,7 @@ def diff_git_format_wc_wc_dir_mv(sbox):
expected = expected_output
- svntest.actions.run_and_verify_svn(None, expected, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected, [], 'diff',
'--git', wc_dir)
def diff_git_format_url_wc(sbox):
@@ -3485,11 +3311,11 @@ def diff_git_format_url_wc(sbox):
svntest.main.run_svn(None, 'commit', '-m', 'Committing changes', wc_dir)
svntest.main.run_svn(None, 'up', wc_dir)
- expected_output = make_git_diff_header(new_path, "new", "revision 0",
+ expected_output = make_git_diff_header(new_path, "new", "nonexistent",
"revision 2", add=True) + [
"@@ -0,0 +1 @@\n",
"+This is the file 'new'.\n",
- ] + make_git_diff_header(mu_path, "A/mu", "revision 1", "working copy",
+ ] + make_git_diff_header(mu_path, "A/mu", "revision 1", "nonexistent",
delete=True) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'mu'.\n",
@@ -3502,7 +3328,7 @@ def diff_git_format_url_wc(sbox):
expected = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected, [], 'diff',
'--git',
'--old', repo_url + '@1', '--new',
wc_dir)
@@ -3527,11 +3353,11 @@ def diff_git_format_url_url(sbox):
svntest.main.run_svn(None, 'up', wc_dir)
expected_output = make_git_diff_header("A/mu", "A/mu", "revision 1",
- "revision 2",
+ "nonexistent",
delete=True) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'mu'.\n",
- ] + make_git_diff_header("new", "new", "revision 0", "revision 2",
+ ] + make_git_diff_header("new", "new", "nonexistent", "revision 2",
add=True) + [
"@@ -0,0 +1 @@\n",
"+This is the file 'new'.\n",
@@ -3544,7 +3370,7 @@ def diff_git_format_url_url(sbox):
expected = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected, [], 'diff',
'--git',
'--old', repo_url + '@1', '--new',
repo_url + '@2')
@@ -3575,7 +3401,7 @@ def diff_prop_missing_context(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
prop_val = "".join([
"line 3\n",
@@ -3599,7 +3425,7 @@ def diff_prop_missing_context(sbox):
"-line 7\n",
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', iota_path)
def diff_prop_multiple_hunks(sbox):
@@ -3632,7 +3458,7 @@ def diff_prop_multiple_hunks(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
prop_val = "".join([
"line 1\n",
@@ -3675,7 +3501,7 @@ def diff_prop_multiple_hunks(sbox):
" line 13\n",
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', iota_path)
def diff_git_empty_files(sbox):
"create a diff in git format for empty files"
@@ -3696,13 +3522,13 @@ def diff_git_empty_files(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
svntest.main.file_write(new_path, "")
svntest.main.run_svn(None, 'add', new_path)
svntest.main.run_svn(None, 'rm', iota_path)
- expected_output = make_git_diff_header(new_path, "new", "revision 0",
+ expected_output = make_git_diff_header(new_path, "new", "nonexistent",
"working copy",
add=True, text_changes=False) + [
] + make_git_diff_header(iota_path, "iota", "revision 2", "working copy",
@@ -3711,7 +3537,7 @@ def diff_git_empty_files(sbox):
# Two files in diff may be in any order.
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'--git', wc_dir)
def diff_git_with_props(sbox):
@@ -3733,7 +3559,7 @@ def diff_git_with_props(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
svntest.main.file_write(new_path, "")
svntest.main.run_svn(None, 'add', new_path)
@@ -3741,7 +3567,7 @@ def diff_git_with_props(sbox):
svntest.main.run_svn(None, 'propset', 'svn:keywords', 'Id', iota_path)
expected_output = make_git_diff_header(new_path, "new",
- "revision 0", "working copy",
+ "nonexistent", "working copy",
add=True, text_changes=False) + \
make_diff_prop_header("new") + \
make_diff_prop_added("svn:eol-style", "native") + \
@@ -3754,7 +3580,7 @@ def diff_git_with_props(sbox):
# Files in diff may be in any order.
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'--git', wc_dir)
@Issue(4010)
@@ -3775,7 +3601,7 @@ def diff_correct_wc_base_revnum(sbox):
'iota' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Child's base is now 2; parent's is still 1.
# Make a local mod.
@@ -3787,12 +3613,12 @@ def diff_correct_wc_base_revnum(sbox):
make_diff_prop_added("svn:keywords", "Id")
# Diff the parent.
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'--git', wc_dir)
- # The same again, but specifying the target explicity. This should
+ # The same again, but specifying the target explicitly. This should
# give the same output.
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'--git', iota_path)
def diff_git_with_props_on_dir(sbox):
@@ -3814,7 +3640,7 @@ def diff_git_with_props_on_dir(sbox):
sbox.simple_propset('k','v', '', 'A')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
was_cwd = os.getcwd()
os.chdir(wc_dir)
@@ -3829,7 +3655,7 @@ def diff_git_with_props_on_dir(sbox):
make_diff_prop_header("") + \
make_diff_prop_added("k", "v")
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'-c2', '--git')
os.chdir(was_cwd)
@@ -3842,7 +3668,7 @@ def diff_abs_localpath_from_wc_folder(sbox):
A_path = sbox.ospath('A')
B_abs_path = os.path.abspath(sbox.ospath('A/B'))
os.chdir(os.path.abspath(A_path))
- svntest.actions.run_and_verify_svn(None, None, [], 'diff', B_abs_path)
+ svntest.actions.run_and_verify_svn(None, [], 'diff', B_abs_path)
@Issue(3449)
def no_spurious_conflict(sbox):
@@ -3855,7 +3681,7 @@ def no_spurious_conflict(sbox):
data_dir = os.path.join(os.path.dirname(sys.argv[0]), 'diff_tests_data')
shutil.copyfile(os.path.join(data_dir, '3449_spurious_v1'),
sbox.ospath('3449_spurious'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', sbox.ospath('3449_spurious'))
sbox.simple_commit()
shutil.copyfile(os.path.join(data_dir, '3449_spurious_v2'),
@@ -3865,9 +3691,9 @@ def no_spurious_conflict(sbox):
sbox.ospath('3449_spurious'))
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '-r2', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c4', '^/', wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
@@ -3878,7 +3704,7 @@ def no_spurious_conflict(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# This update produces a conflict in 1.6
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '--accept', 'postpone', wc_dir)
expected_status.tweak(wc_rev=4)
expected_status.tweak('3449_spurious', status=' ')
@@ -3924,23 +3750,23 @@ def diff_two_working_copies(sbox):
src_label = os.path.basename(wc_dir_old)
dst_label = os.path.basename(wc_dir)
- expected_output = make_diff_header('newdir/newfile', 'working copy',
+ expected_output = make_diff_header('newdir/newfile', 'nonexistent',
'working copy',
src_label, dst_label) + [
"@@ -0,0 +1 @@\n",
"+new text\n",
] + make_diff_header('A/mu', 'working copy',
- 'working copy',
+ 'nonexistent',
src_label, dst_label) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'mu'.\n",
- ] + make_diff_header('A/B/F', 'working copy',
+ ] + make_diff_header('A/B/F', 'nonexistent',
'working copy',
src_label, dst_label) + [
"@@ -0,0 +1 @@\n",
"+new text\n",
] + make_diff_prop_header('A/B/F') + \
- make_diff_prop_modified("newprop", "propval-old\n",
+ make_diff_prop_added("newprop",
"propval-new\n") + \
make_diff_header('A/B/lambda', 'working copy',
'working copy',
@@ -3958,35 +3784,40 @@ def diff_two_working_copies(sbox):
make_diff_prop_header('A/D/gamma') + \
make_diff_prop_added("newprop", "propval") + \
make_diff_header('A/D/G/pi', 'working copy',
- 'working copy',
+ 'nonexistent',
src_label, dst_label) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'pi'.\n",
- ] + make_diff_header('A/D/G/pi', 'working copy',
+ ] + make_diff_header('A/D/G/pi', 'nonexistent',
'working copy',
src_label, dst_label) + \
make_diff_prop_header('A/D/G/pi') + \
make_diff_prop_added("newprop", "propval") + \
make_diff_header('A/D/H/chi', 'working copy',
- 'working copy',
+ 'nonexistent',
src_label, dst_label) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'chi'.\n",
] + make_diff_header('A/D/H/omega', 'working copy',
- 'working copy',
+ 'nonexistent',
src_label, dst_label) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'omega'.\n",
] + make_diff_header('A/D/H/psi', 'working copy',
- 'working copy',
+ 'nonexistent',
src_label, dst_label) + [
"@@ -1 +0,0 @@\n",
"-This is the file 'psi'.\n",
- ]
+ ] + make_diff_header('A/B/F', 'working copy',
+ 'nonexistent',
+ src_label, dst_label) + \
+ make_diff_prop_header('A/B/F') + \
+ make_diff_prop_deleted('newprop', 'propval-old\n')
- # Files in diff may be in any order.
+
+ # Files in diff may be in any order. #### Not any more, but test order is wrong.
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--old', wc_dir_old,
'--new', wc_dir)
@@ -4000,22 +3831,22 @@ def diff_deleted_url(sbox):
sbox.simple_commit()
# A diff of r2 with target A/D/H should show the removed children
- expected_output = make_diff_header("chi", "revision 1", "revision 2") + [
+ expected_output = make_diff_header("chi", "revision 1", "nonexistent") + [
"@@ -1 +0,0 @@\n",
"-This is the file 'chi'.\n",
] + make_diff_header("omega", "revision 1",
- "revision 2") + [
+ "nonexistent") + [
"@@ -1 +0,0 @@\n",
"-This is the file 'omega'.\n",
] + make_diff_header("psi", "revision 1",
- "revision 2") + [
+ "nonexistent") + [
"@@ -1 +0,0 @@\n",
"-This is the file 'psi'.\n",
]
# Files in diff may be in any order.
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-c2',
sbox.repo_url + '/A/D/H')
@@ -4031,44 +3862,44 @@ def diff_arbitrary_files_and_dirs(sbox):
"-This is the file 'iota'.\n",
"+This is the file 'mu'.\n"
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--old', sbox.ospath('iota'),
'--new', sbox.ospath('A/mu'))
# diff A/B/E with A/D
- expected_output = make_diff_header("G/pi", "working copy", "working copy",
+ expected_output = make_diff_header("G/pi", "nonexistent", "working copy",
"B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'pi'.\n"
- ] + make_diff_header("G/rho", "working copy",
+ ] + make_diff_header("G/rho", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'rho'.\n"
- ] + make_diff_header("G/tau", "working copy",
+ ] + make_diff_header("G/tau", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'tau'.\n"
- ] + make_diff_header("H/chi", "working copy",
+ ] + make_diff_header("H/chi", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'chi'.\n"
- ] + make_diff_header("H/omega", "working copy",
+ ] + make_diff_header("H/omega", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'omega'.\n"
- ] + make_diff_header("H/psi", "working copy",
+ ] + make_diff_header("H/psi", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'psi'.\n"
] + make_diff_header("alpha", "working copy",
- "working copy", "B/E", "D") + [
+ "nonexistent", "B/E", "D") + [
"@@ -1 +0,0 @@\n",
"-This is the file 'alpha'.\n"
] + make_diff_header("beta", "working copy",
- "working copy", "B/E", "D") + [
+ "nonexistent", "B/E", "D") + [
"@@ -1 +0,0 @@\n",
"-This is the file 'beta'.\n"
- ] + make_diff_header("gamma", "working copy",
+ ] + make_diff_header("gamma", "nonexistent",
"working copy", "B/E", "D") + [
"@@ -0,0 +1 @@\n",
"+This is the file 'gamma'.\n"
@@ -4076,7 +3907,7 @@ def diff_arbitrary_files_and_dirs(sbox):
# Files in diff may be in any order.
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--old', sbox.ospath('A/B/E'),
'--new', sbox.ospath('A/D'))
@@ -4108,20 +3939,20 @@ def diff_properties_only(sbox):
sbox.simple_commit() # r2
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--properties-only', '-r', '1:2',
sbox.repo_url + '/iota')
- svntest.actions.run_and_verify_svn(None, expected_reverse_output, [],
+ svntest.actions.run_and_verify_svn(expected_reverse_output, [],
'diff', '--properties-only', '-r', '2:1',
sbox.repo_url + '/iota')
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, expected_rev1_output, [],
+ svntest.actions.run_and_verify_svn(expected_rev1_output, [],
'diff', '--properties-only', '-r', '1',
'iota')
- svntest.actions.run_and_verify_svn(None, expected_rev1_output, [],
+ svntest.actions.run_and_verify_svn(expected_rev1_output, [],
'diff', '--properties-only',
'-r', 'PREV', 'iota')
@@ -4157,8 +3988,8 @@ def diff_properties_no_newline(sbox):
make_diff_prop_modified(pname, old_val, new_val)
sbox.simple_propset(pname, new_val, 'iota')
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff')
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', 'iota')
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff')
+ svntest.actions.run_and_verify_svn(None, [], 'revert', 'iota')
os.chdir(old_cwd)
@@ -4173,12 +4004,12 @@ def diff_arbitrary_same(sbox):
sbox.simple_copy('A', 'A2')
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'diff',
'--old', sbox.ospath('A'),
'--new', sbox.ospath('A2'))
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'diff', '--summarize',
'--old', sbox.ospath('A'),
'--new', sbox.ospath('A2'))
@@ -4216,7 +4047,7 @@ def simple_ancestry(sbox):
line,
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', sbox.wc_dir,
'-r', '1',
'--notice-ancestry',
@@ -4249,7 +4080,7 @@ def simple_ancestry(sbox):
line,
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', sbox.wc_dir,
'-r', 'HEAD',
'--notice-ancestry',
@@ -4287,7 +4118,7 @@ def simple_ancestry(sbox):
line,
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', sbox.wc_dir,
'-r', '1',
'--notice-ancestry',
@@ -4298,7 +4129,7 @@ def simple_ancestry(sbox):
sbox.simple_commit()
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', sbox.wc_dir,
'-r', '1',
'--notice-ancestry',
@@ -4315,10 +4146,10 @@ def local_tree_replace(sbox):
sbox.simple_add_text('extra', 'A/B/F/extra')
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--keep-local',
sbox.ospath('A/B'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', sbox.ospath('A/B'))
# And now check with ancestry
@@ -4344,7 +4175,7 @@ def local_tree_replace(sbox):
line,
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', wc_dir,
'-r', '2',
'--notice-ancestry',
@@ -4357,7 +4188,7 @@ def local_tree_replace(sbox):
cwd = os.getcwd()
os.chdir(wc_dir)
- _, out, _ = svntest.actions.run_and_verify_svn(None, None, [],
+ _, out, _ = svntest.actions.run_and_verify_svn(None, [],
'diff', '.',
'-r', '2',
'--notice-ancestry',
@@ -4366,7 +4197,7 @@ def local_tree_replace(sbox):
os.chdir(cwd)
# And try to apply it
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
expected_output = svntest.verify.UnorderedOutput([
'D %s\n' % sbox.ospath('A/B/F/extra'),
@@ -4386,7 +4217,7 @@ def local_tree_replace(sbox):
])
# And this currently fails because the ordering is broken, but also
# because it hits an issue in 'svn patch'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'patch', patch, wc_dir)
def diff_dir_replaced_by_file(sbox):
@@ -4402,25 +4233,25 @@ def diff_dir_replaced_by_file(sbox):
'Index: %s\n' % sbox.path('A/B/E/alpha'),
'===================================================================\n',
'--- %s\t(revision 1)\n' % sbox.path('A/B/E/alpha'),
- '+++ %s\t(working copy)\n' % sbox.path('A/B/E/alpha'),
+ '+++ %s\t(nonexistent)\n' % sbox.path('A/B/E/alpha'),
'@@ -1 +0,0 @@\n',
'-This is the file \'alpha\'.\n',
'Index: %s\n' % sbox.path('A/B/E/beta'),
'===================================================================\n',
'--- %s\t(revision 1)\n' % sbox.path('A/B/E/beta'),
- '+++ %s\t(working copy)\n' % sbox.path('A/B/E/beta'),
+ '+++ %s\t(nonexistent)\n' % sbox.path('A/B/E/beta'),
'@@ -1 +0,0 @@\n',
'-This is the file \'beta\'.\n',
'Index: %s\n' % sbox.path('A/B/E'),
'===================================================================\n',
- '--- %s\t(revision 0)\n' % sbox.path('A/B/E'),
+ '--- %s\t(nonexistent)\n' % sbox.path('A/B/E'),
'+++ %s\t(working copy)\n' % sbox.path('A/B/E'),
'@@ -0,0 +1 @@\n',
'+text\n',
'\ No newline at end of file\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', wc_dir)
def diff_dir_replaced_by_dir(sbox):
@@ -4440,24 +4271,24 @@ def diff_dir_replaced_by_dir(sbox):
'Index: %s\n' % sbox.path('A/B/E/alpha'),
'===================================================================\n',
'--- %s\t(revision 1)\n' % sbox.path('A/B/E/alpha'),
- '+++ %s\t(working copy)\n' % sbox.path('A/B/E/alpha'),
+ '+++ %s\t(nonexistent)\n' % sbox.path('A/B/E/alpha'),
'@@ -1 +0,0 @@\n',
'-This is the file \'alpha\'.\n',
'Index: %s\n' % sbox.path('A/B/E/beta'),
'===================================================================\n',
'--- %s\t(revision 1)\n' % sbox.path('A/B/E/beta'),
- '+++ %s\t(working copy)\n' % sbox.path('A/B/E/beta'),
+ '+++ %s\t(nonexistent)\n' % sbox.path('A/B/E/beta'),
'@@ -1 +0,0 @@\n',
'-This is the file \'beta\'.\n',
'Index: %s\n' % sbox.path('A/B/E/beta'),
'===================================================================\n',
- '--- %s\t(revision 0)\n' % sbox.path('A/B/E/beta'),
+ '--- %s\t(nonexistent)\n' % sbox.path('A/B/E/beta'),
'+++ %s\t(working copy)\n' % sbox.path('A/B/E/beta'),
'@@ -0,0 +1 @@\n',
'+New beta\n',
'Index: %s\n' % sbox.path('A/B/E'),
'===================================================================\n',
- '--- %s\t(revision 0)\n' % sbox.path('A/B/E'),
+ '--- %s\t(nonexistent)\n' % sbox.path('A/B/E'),
'+++ %s\t(working copy)\n' % sbox.path('A/B/E'),
'\n',
'Property changes on: %s\n' % sbox.path('A/B/E'),
@@ -4467,7 +4298,7 @@ def diff_dir_replaced_by_dir(sbox):
'+b\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--notice-ancestry', wc_dir)
# And summarized. Currently produces directory adds after their children
@@ -4478,7 +4309,7 @@ def diff_dir_replaced_by_dir(sbox):
'A %s\n' % sbox.ospath('A/B/E'),
'A %s\n' % sbox.ospath('A/B/E/beta'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--summarize', wc_dir,
'--notice-ancestry')
@@ -4487,7 +4318,7 @@ def diff_dir_replaced_by_dir(sbox):
'Index: %s\n' % sbox.path('A/B/E/alpha'),
'===================================================================\n',
'--- %s\t(revision 1)\n' % sbox.path('A/B/E/alpha'),
- '+++ %s\t(working copy)\n' % sbox.path('A/B/E/alpha'),
+ '+++ %s\t(nonexistent)\n' % sbox.path('A/B/E/alpha'),
'@@ -1 +0,0 @@\n',
'-This is the file \'alpha\'.\n',
'Index: %s\n' % sbox.path('A/B/E/beta'),
@@ -4509,7 +4340,7 @@ def diff_dir_replaced_by_dir(sbox):
'+b\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', wc_dir)
expected_output = [
@@ -4517,7 +4348,7 @@ def diff_dir_replaced_by_dir(sbox):
'M %s\n' % sbox.ospath('A/B/E/beta'),
' M %s\n' % sbox.ospath('A/B/E'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '--summarize', wc_dir)
@@ -4539,14 +4370,14 @@ def diff_repos_empty_file_addition(sbox):
'newfile' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(sbox.wc_dir, expected_output,
- expected_status, None, sbox.wc_dir)
+ expected_status)
# Now diff the revision that added the empty file.
expected_output = [
'Index: newfile\n',
'===================================================================\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff', '-c', '2', sbox.repo_url)
def diff_missing_tree_conflict_victim(sbox):
@@ -4586,13 +4417,13 @@ def diff_missing_tree_conflict_victim(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, None,
- False, '--ignore-ancestry', wc_dir)
+ [], False, False,
+ '--ignore-ancestry', wc_dir)
# 'svn diff' should show no change for the working copy
# This currently fails because svn errors out with a 'node not found' error
expected_output = [ ]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff', wc_dir)
@Issue(4396)
def diff_local_missing_obstruction(sbox):
@@ -4608,7 +4439,7 @@ def diff_local_missing_obstruction(sbox):
# Expect no output for missing and obstructed files
expected_output = [
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff', wc_dir)
sbox.simple_propset('K', 'V', 'iota', 'A/mu')
sbox.simple_append('IotA', 'Content')
@@ -4638,13 +4469,13 @@ def diff_local_missing_obstruction(sbox):
'+V\n',
'\ No newline at end of property\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff', wc_dir)
# Create an external. This produces an error in 1.8.0.
sbox.simple_propset('svn:externals', 'AA/BB ' + sbox.repo_url + '/A', '.')
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'diff', wc_dir)
@@ -4665,8 +4496,290 @@ def diff_move_inside_copy(sbox):
sbox.simple_append(chi_moved, 'a new line')
# Bug: Diffing the copied-along parent directory asserts
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'diff', sbox.ospath(h_path))
+@XFail()
+@Issue(4464)
+def diff_repo_wc_copies(sbox):
+ "diff repo to wc of a copy"
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ iota_copy = sbox.ospath('iota_copy')
+ iota_url = sbox.repo_url + '/iota'
+
+ sbox.simple_copy('iota', 'iota_copy')
+ expected_output = make_diff_header(iota_copy, "nonexistent", "working copy",
+ iota_url, iota_copy) + [
+ "@@ -0,0 +1 @@\n",
+ "+This is the file 'iota'.\n" ]
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
+ '--show-copies-as-adds',
+ iota_url, iota_copy)
+
+@Issue(4460)
+def diff_repo_wc_file_props(sbox):
+ "diff repo to wc file target with props"
+ sbox.build()
+ iota = sbox.ospath('iota')
+
+ # add a mime-type and a line to iota to test the binary check
+ sbox.simple_propset('svn:mime-type', 'text/plain', 'iota')
+ sbox.simple_append('iota','second line\n')
+
+ # test that we get the line and the property add
+ expected_output = make_diff_header(iota, 'revision 1', 'working copy') + \
+ [ '@@ -1 +1,2 @@\n',
+ " This is the file 'iota'.\n",
+ "+second line\n", ] + \
+ make_diff_prop_header(iota) + \
+ make_diff_prop_added('svn:mime-type', 'text/plain')
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r1', iota)
+
+ # reverse the diff, should get a property delete and line delete
+ expected_output = make_diff_header(iota, 'working copy', 'revision 1') + \
+ [ '@@ -1,2 +1 @@\n',
+ " This is the file 'iota'.\n",
+ "-second line\n", ] + \
+ make_diff_prop_header(iota) + \
+ make_diff_prop_deleted('svn:mime-type', 'text/plain')
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '--old', iota,
+ '--new', iota + '@1')
+
+ # copy iota to test with --show-copies as adds
+ sbox.simple_copy('iota', 'iota_copy')
+ iota_copy = sbox.ospath('iota_copy')
+
+ # test that we get all lines as added and the property added
+ # TODO: We only test that this test doesn't error out because of Issue #4464
+ # if and when that issue is fixed this test should check output
+ svntest.actions.run_and_verify_svn(None, [], 'diff',
+ '--show-copies-as-adds', '-r1', iota_copy)
+
+ # reverse the diff, should get all lines as a delete and no property
+ # TODO: We only test that this test doesn't error out because of Issue #4464
+ # if and when that issue is fixed this test should check output
+ svntest.actions.run_and_verify_svn(None, [], 'diff',
+ '--show-copies-as-adds',
+ '--old', iota_copy,
+ '--new', iota + '@1')
+
+ # revert and commit with the eol-style of LF and then update so
+ # that we can see a change on either windows or *nix.
+ sbox.simple_revert('iota', 'iota_copy')
+ sbox.simple_propset('svn:eol-style', 'LF', 'iota')
+ sbox.simple_commit() #r2
+ sbox.simple_update()
+
+ # now that we have a LF file on disk switch to CRLF
+ sbox.simple_propset('svn:eol-style', 'CRLF', 'iota')
+
+ # test that not only the property but also the file changes
+ # i.e. that the line endings substitution works
+ if svntest.main.is_os_windows():
+ # test suite normalizes crlf output into just lf on Windows.
+ # so we have to assume it worked because there is an add and
+ # remove line with the same content. Fortunately, it doesn't
+ # do this on *nix so we can be pretty sure that it works right.
+ # TODO: Provide a way to handle this better
+ crlf = '\n'
+ else:
+ crlf = '\r\n'
+ expected_output = make_diff_header(iota, 'revision 1', 'working copy') + \
+ [ '@@ -1 +1 @@\n',
+ "-This is the file 'iota'.\n",
+ "+This is the file 'iota'." + crlf ] + \
+ make_diff_prop_header(iota) + \
+ make_diff_prop_added('svn:eol-style', 'CRLF')
+
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r1', iota)
+
+
+@Issue(4460)
+def diff_repo_repo_added_file_mime_type(sbox):
+ "diff repo to repo added file with mime-type"
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ newfile = sbox.ospath('newfile')
+
+ # add a file with a mime-type
+ sbox.simple_append('newfile', "This is the file 'newfile'.\n")
+ sbox.simple_add('newfile')
+ sbox.simple_propset('svn:mime-type', 'text/plain', 'newfile')
+ sbox.simple_commit() # r2
+
+ # try to diff across the addition
+ expected_output = make_diff_header(newfile, 'nonexistent', 'revision 2') + \
+ [ '@@ -0,0 +1 @@\n',
+ "+This is the file 'newfile'.\n" ] + \
+ make_diff_prop_header(newfile) + \
+ make_diff_prop_added('svn:mime-type', 'text/plain')
+
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
+ '-r1:2', newfile)
+
+ # reverse the diff to diff across a deletion
+ expected_output = make_diff_header(newfile, 'revision 2', 'nonexistent') + \
+ [ '@@ -1 +0,0 @@\n',
+ "-This is the file 'newfile'.\n",
+ '\n',
+ 'Property changes on: %s\n' % sbox.path('newfile'),
+ '__________________________________________________' +
+ '_________________\n',
+ 'Deleted: svn:mime-type\n',
+ '## -1 +0,0 ##\n',
+ '-text/plain\n',
+ '\ No newline at end of property\n']
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
+ '-r2:1', newfile)
+
+def diff_switched_file(sbox):
+ "diff a switched file against repository"
+
+ sbox.build()
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
+ sbox.repo_url + '/A/mu',
+ sbox.ospath('iota'), '--ignore-ancestry')
+ sbox.simple_append('iota', 'Mu????')
+
+ # This diffs the file against its origin
+ expected_output = [
+ 'Index: %s\n' % sbox.path('iota'),
+ '===================================================================\n',
+ '--- %s\t(.../A/mu)\t(revision 1)\n' % sbox.path('iota'),
+ '+++ %s\t(.../iota)\t(working copy)\n' % sbox.path('iota'),
+ '@@ -1 +1,2 @@\n',
+ ' This is the file \'mu\'.\n',
+ '+Mu????\n',
+ '\ No newline at end of file\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r', '1', sbox.ospath('iota'))
+
+ # And this undoes the switch for the diff
+ expected_output = [
+ 'Index: %s\n' % sbox.path('iota'),
+ '===================================================================\n',
+ '--- %s\t(revision 1)\n' % sbox.path('iota'),
+ '+++ %s\t(working copy)\n' % sbox.path('iota'),
+ '@@ -1 +1,2 @@\n',
+ '-This is the file \'iota\'.\n',
+ '+This is the file \'mu\'.\n',
+ '+Mu????\n',
+ '\ No newline at end of file\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r', '1', sbox.ospath(''))
+
+def diff_parent_dir(sbox):
+ "diff parent directory"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url, '-m', 'Q',
+ 'mkdir', 'A/ZZZ',
+ 'propset', 'A', 'B', 'A/ZZZ')
+
+ was_cwd = os.getcwd()
+ os.chdir(os.path.join(wc_dir, 'A', 'B'))
+ try:
+ # This currently (1.8.9, 1.9.0 development) triggers an assertion failure
+ # as a non canonical relpath ".." is used as diff target
+
+ expected_output = [
+ 'Index: ../ZZZ\n',
+ '===================================================================\n',
+ '--- ../ZZZ (revision 2)\n',
+ '+++ ../ZZZ (nonexistent)\n',
+ '\n',
+ 'Property changes on: ../ZZZ\n',
+ '___________________________________________________________________\n',
+ 'Deleted: A\n',
+ '## -1 +0,0 ##\n',
+ '-B\n',
+ '\ No newline at end of property\n',
+ ]
+
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r', '2', '..')
+
+ expected_output = [
+ 'Index: ../../A/ZZZ\n',
+ '===================================================================\n',
+ '--- ../../A/ZZZ (revision 2)\n',
+ '+++ ../../A/ZZZ (nonexistent)\n',
+ '\n',
+ 'Property changes on: ../../A/ZZZ\n',
+ '___________________________________________________________________\n',
+ 'Deleted: A\n',
+ '## -1 +0,0 ##\n',
+ '-B\n',
+ '\ No newline at end of property\n',
+ ]
+
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', '-r', '2', '../..')
+ finally:
+ os.chdir(was_cwd)
+
+def diff_deleted_in_move_against_repos(sbox):
+ "diff deleted in move against repository"
+
+ sbox.build()
+ sbox.simple_move('A/B', 'BB')
+ sbox.simple_move('BB/E/alpha', 'BB/q')
+ sbox.simple_rm('BB/E/beta')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', sbox.repo_url + '/BB/E',
+ '--parents', '-m', 'Create dir')
+
+ # OK. Local diff
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.wc_dir)
+
+ # OK. Walks nodes locally from wc-root, notices ancestry
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.wc_dir, '-r1',
+ '--notice-ancestry')
+
+ # OK. Walks nodes locally from BB, notices ancestry
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.wc_dir, '-r2',
+ '--notice-ancestry')
+
+ # OK. Walks nodes locally from wc-root
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.wc_dir, '-r1')
+
+ # Assertion. Walks nodes locally from BB.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.wc_dir, '-r2')
+
+def diff_replaced_moved(sbox):
+ "diff against a replaced moved node"
+
+ sbox.build(read_only=True)
+ sbox.simple_move('A', 'AA')
+ sbox.simple_rm('AA/B')
+ sbox.simple_move('AA/D', 'AA/B')
+
+ # Ok
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.ospath('.'), '-r1')
+
+ # Ok (rhuijben: Works through a hack assuming some BASE knowledge)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.ospath('AA'), '-r1')
+
+ # Error (misses BASE node because the diff editor is driven incorrectly)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'diff', sbox.ospath('AA/B'), '-r1')
+
# Regression test for the fix in r1619380. Prior to this (and in releases
# 1.8.0 through 1.8.10) a local diff incorrectly showed a copied dir's
# properties as added, whereas it should show only the changes against the
@@ -4705,13 +4818,56 @@ def diff_local_copied_dir(sbox):
'\ No newline at end of property\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output_C2, [],
+ svntest.actions.run_and_verify_svn(expected_output_C2, [],
'diff', 'C2')
- svntest.actions.run_and_verify_svn(None, expected_output_C3, [],
+ svntest.actions.run_and_verify_svn(expected_output_C3, [],
'diff', 'C3')
finally:
os.chdir(was_cwd)
+
+def diff_summarize_ignore_properties(sbox):
+ "diff --summarize --ignore-properties"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Make a property change and a content change to 'iota'
+ sbox.simple_propset('svn:eol-style', 'native', 'iota')
+ svntest.main.file_append(sbox.ospath('iota'), 'new text')
+
+ # Make a property change to 'A/mu'
+ sbox.simple_propset('svn:eol-style', 'native', 'A/mu')
+
+ # Make a content change to 'A/B/lambda'
+ svntest.main.file_append(sbox.ospath('A/B/lambda'), 'new text')
+
+ # Add a file.
+ svntest.main.file_write(sbox.ospath('new'), 'new text')
+ sbox.simple_add('new')
+
+ # Delete a file
+ sbox.simple_rm('A/B/E/alpha')
+
+ expected_diff = svntest.wc.State(wc_dir, {
+ 'iota': Item(status='M '),
+ 'new': Item(status='A '),
+ 'A/B/lambda': Item(status='M '),
+ 'A/B/E/alpha': Item(status='D '),
+ })
+ svntest.actions.run_and_verify_diff_summarize(expected_diff,
+ '--ignore-properties',
+ sbox.wc_dir)
+
+ # test with --xml, too
+ paths = ['iota', 'new', 'A/B/lambda', 'A/B/E/alpha']
+ items = ['modified', 'added', 'modified', 'deleted' ]
+ kinds = ['file','file', 'file', 'file']
+ props = ['none', 'none', 'none', 'none']
+ svntest.actions.run_and_verify_diff_summarize_xml(
+ [], wc_dir, paths, items, props, kinds, wc_dir, '--ignore-properties')
+
+
########################################################################
#Run the tests
@@ -4794,7 +4950,15 @@ test_list = [ None,
diff_missing_tree_conflict_victim,
diff_local_missing_obstruction,
diff_move_inside_copy,
+ diff_repo_wc_copies,
+ diff_repo_wc_file_props,
+ diff_repo_repo_added_file_mime_type,
+ diff_switched_file,
+ diff_parent_dir,
+ diff_deleted_in_move_against_repos,
+ diff_replaced_moved,
diff_local_copied_dir,
+ diff_summarize_ignore_properties,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/entries-dump.c b/subversion/tests/cmdline/entries-dump.c
index e4edc61..cfdb1e0 100644
--- a/subversion/tests/cmdline/entries-dump.c
+++ b/subversion/tests/cmdline/entries-dump.c
@@ -118,15 +118,15 @@ entries_dump(const char *dir_path, svn_wc_adm_access_t *related, apr_pool_t *poo
SVN_ERR(svn_wc__read_entries_old(&entries, dir_abspath, pool, pool));
lockfile_path = svn_dirent_join_many(pool, dir_path,
svn_wc_get_adm_dir(pool),
- "lock", NULL);
+ "lock", SVN_VA_NULL);
SVN_ERR(svn_io_check_path(lockfile_path, &kind, pool));
locked = (kind == svn_node_file);
}
for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
{
- const char *key = svn__apr_hash_index_key(hi);
- const svn_wc_entry_t *entry = svn__apr_hash_index_val(hi);
+ const char *key = apr_hash_this_key(hi);
+ const svn_wc_entry_t *entry = apr_hash_this_val(hi);
SVN_ERR_ASSERT(strcmp(key, entry->name) == 0);
@@ -230,7 +230,7 @@ directory_dump_old(struct directory_walk_baton *bt,
scratch_pool, scratch_pool));
for (hi = apr_hash_first(scratch_pool, entries); hi; hi = apr_hash_next(hi))
{
- const svn_wc_entry_t *entry = svn__apr_hash_index_val(hi);
+ const svn_wc_entry_t *entry = apr_hash_this_val(hi);
const char *local_abspath;
if (entry->deleted || entry->absent || entry->kind != svn_node_dir)
@@ -287,6 +287,16 @@ tree_dump_dir(const char *local_abspath,
if (kind != svn_node_dir)
return SVN_NO_ERROR;
+ if (strcmp(local_abspath, bt->root_abspath) != 0)
+ {
+ svn_boolean_t is_wcroot;
+ SVN_ERR(svn_wc__db_is_wcroot(&is_wcroot, bt->wc_ctx->db,
+ local_abspath, scratch_pool));
+
+ if (is_wcroot)
+ return SVN_NO_ERROR; /* Report the stub, but not the data */
+ }
+
/* If LOCAL_ABSPATH a child of or equal to ROOT_ABSPATH, then display
a relative path starting with PREFIX_PATH. */
path = svn_dirent_skip_ancestor(bt->root_abspath, local_abspath);
@@ -304,19 +314,6 @@ tree_dump_dir(const char *local_abspath,
}
static svn_error_t *
-tree_dump_txn(void *baton, svn_sqlite__db_t *db, apr_pool_t *scratch_pool)
-{
- struct directory_walk_baton *bt = baton;
-
- SVN_ERR(svn_wc__internal_walk_children(bt->wc_ctx->db, bt->root_abspath, FALSE,
- NULL, tree_dump_dir, bt,
- svn_depth_infinity,
- NULL, NULL, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
tree_dump(const char *path,
apr_pool_t *scratch_pool)
{
@@ -341,7 +338,12 @@ tree_dump(const char *path,
SVN_ERR(svn_wc__db_temp_borrow_sdb(&sdb, bt.wc_ctx->db, bt.root_abspath,
scratch_pool));
- SVN_ERR(svn_sqlite__with_lock(sdb, tree_dump_txn, &bt, scratch_pool));
+ SVN_SQLITE__WITH_LOCK(
+ svn_wc__internal_walk_children(db, bt.root_abspath, FALSE,
+ NULL, tree_dump_dir, &bt,
+ svn_depth_infinity,
+ NULL, NULL, scratch_pool),
+ sdb);
/* And close everything we've opened */
SVN_ERR(svn_wc_context_destroy(bt.wc_ctx));
diff --git a/subversion/tests/cmdline/entries_tests.py b/subversion/tests/cmdline/entries_tests.py
index 92baa7e..0fcdc1a 100755
--- a/subversion/tests/cmdline/entries_tests.py
+++ b/subversion/tests/cmdline/entries_tests.py
@@ -85,11 +85,11 @@ def basic_entries(sbox):
iota2_path = os.path.join(wc_dir, 'A', 'B', 'E', 'iota2')
# Remove 'alpha'. When it is committed, it will be marked DELETED.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', alpha_path)
# Tweak 'beta' in order to bump its revision to ensure the replacement
# gets the new revision (2), not the value from the parent (1).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
beta_path)
@@ -102,11 +102,11 @@ def basic_entries(sbox):
expected_status.tweak('A/B/E/beta', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output, expected_status,
- None,
+ [],
alpha_path, beta_path)
# bump 'G' and iota another revision (3) for later testing
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
G_path, iota_path)
@@ -117,23 +117,23 @@ def basic_entries(sbox):
expected_status.tweak('A/D/G', 'iota', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output, expected_status,
- None,
+ [],
G_path, iota_path)
# Add a file over the DELETED 'alpha'. It should be schedule-add.
open(alpha_path, 'w').write('New alpha contents\n')
# Delete 'beta', then add a file over it. Should be schedule-replace.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', beta_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', beta_path)
open(beta_path, 'w').write('New beta contents\n')
# Plain old add. Should have revision == 0.
open(added_path, 'w').write('Added file contents\n')
- svntest.actions.run_and_verify_svn(None, None, [], 'add',
+ svntest.actions.run_and_verify_svn(None, [], 'add',
alpha_path, beta_path, added_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
iota_path, iota2_path)
entries = svntest.main.run_entriesdump(os.path.join(wc_dir, 'A', 'B', 'E'))
@@ -153,7 +153,7 @@ def basic_entries(sbox):
validate(entries['iota2'], schedule=SCHEDULE_ADD, revision=1, copied=True,
copyfrom_rev=3)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', G_path, G2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', G_path, G2_path)
entries = svntest.main.run_entriesdump(G2_path)
check_names(entries, 'pi', 'rho', 'tau')
@@ -210,7 +210,7 @@ def deletion_details(sbox):
# blast iota, then verify the now-deleted entry still contains much of
# the same information.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota_path)
entries = svntest.main.run_entriesdump(wc_dir)
check_names(entries, 'iota')
validate(entries['iota'], revision=iota.revision,
@@ -219,8 +219,8 @@ def deletion_details(sbox):
# even deleted nodes have a URL
validate(entries['iota'], url='%s/iota' % sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', D_path, D2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', D2_G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', D_path, D2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', D2_G_path)
entries = svntest.main.run_entriesdump(D2_path)
check_names(entries, 'gamma', 'G')
@@ -244,8 +244,8 @@ def deletion_details(sbox):
### for now... this test case is done. just return
return
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', H_path, E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', E_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', H_path, E_path)
entries = svntest.main.run_entriesdump(E_path)
check_names(entries, 'chi', 'omega', 'psi', 'alpha', 'beta')
diff --git a/subversion/tests/cmdline/export_tests.py b/subversion/tests/cmdline/export_tests.py
index d108847..92d1d52 100755
--- a/subversion/tests/cmdline/export_tests.py
+++ b/subversion/tests/cmdline/export_tests.py
@@ -84,8 +84,7 @@ def export_nonexistent_url(sbox):
svntest.main.safe_rmtree(sbox.wc_dir)
export_target = os.path.join(sbox.wc_dir, 'nonexistent')
nonexistent_url = sbox.repo_url + "/nonexistent"
- svntest.actions.run_and_verify_svn("Error about nonexistent URL expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'export', nonexistent_url, export_target)
def export_working_copy(sbox):
@@ -189,8 +188,7 @@ def export_over_existing_dir(sbox):
# the export operation to fail.
os.mkdir(export_target)
- svntest.actions.run_and_verify_svn("No error where one is expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'export', sbox.wc_dir, export_target)
# As an extra precaution, make sure export_target doesn't have
@@ -470,8 +468,7 @@ def export_nonexistent_file(sbox):
export_target = sbox.add_wc_path('export')
- svntest.actions.run_and_verify_svn("No error where one is expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'export', kappa_path, export_target)
def export_unversioned_file(sbox):
@@ -485,8 +482,7 @@ def export_unversioned_file(sbox):
export_target = sbox.add_wc_path('export')
- svntest.actions.run_and_verify_svn("No error where one is expected",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'export', kappa_path, export_target)
def export_with_state_deleted(sbox):
@@ -497,15 +493,14 @@ def export_with_state_deleted(sbox):
# state deleted=true caused export to crash
alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', alpha_path)
expected_output = svntest.wc.State(wc_dir, {
'A/B/E/alpha' : Item(verb='Deleting'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/B/E/alpha')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
export_target = sbox.add_wc_path('export')
expected_output = svntest.wc.State(export_target, {
@@ -557,7 +552,7 @@ def export_HEADplus1_fails(sbox):
sbox.build(create_wc = False, read_only = True)
- svntest.actions.run_and_verify_svn(None, None, '.*No such revision.*',
+ svntest.actions.run_and_verify_svn(None, '.*No such revision.*',
'export', sbox.repo_url, sbox.wc_dir,
'-r', 38956)
@@ -613,7 +608,7 @@ def export_file_overwrite_fails(sbox):
# Run it for source local
open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
- svntest.actions.run_and_verify_svn(None, [], '.*exist.*',
+ svntest.actions.run_and_verify_svn([], '.*exist.*',
'export', iota_path, tmpdir)
# Verify it failed
@@ -624,7 +619,7 @@ def export_file_overwrite_fails(sbox):
# Run it for source URL
open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
- svntest.actions.run_and_verify_svn(None, [], '.*exist.*',
+ svntest.actions.run_and_verify_svn([], '.*exist.*',
'export', iota_url, tmpdir)
# Verify it failed
@@ -736,11 +731,11 @@ def export_with_url_unsafe_characters(sbox):
# Create the file with special name and commit it.
svntest.main.file_write(url_unsafe_path, 'This is URL unsafe path file.')
svntest.main.run_svn(None, 'add', url_unsafe_path + '@')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', 'log msg',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m', 'log msg',
'--quiet', wc_dir)
# Export the file and verify it.
- svntest.actions.run_and_verify_svn(None, None, [], 'export',
+ svntest.actions.run_and_verify_svn(None, [], 'export',
url_unsafe_path_url, export_target + '@')
if not os.path.exists(export_target):
@@ -906,14 +901,14 @@ def export_file_overwrite_with_force(sbox):
# Run it for WC export
open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput,
[], 'export', '--force',
iota_path, tmpdir)
svntest.actions.verify_disk(tmpdir, expected_disk)
# Run it for URL export
open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput,
[], 'export', '--force',
iota_url, tmpdir)
svntest.actions.verify_disk(tmpdir, expected_disk)
@@ -956,7 +951,7 @@ def export_custom_keywords(sbox):
export_file = os.path.join(export_target, 'alpha')
os.remove(export_file)
expected_output = ['A %s\n' % export_file, 'Export complete.\n']
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'export', '--force',
sbox.repo_url + '/A/B/E/alpha',
export_target)
@@ -1020,18 +1015,18 @@ def export_file_external(sbox):
@Issue(4427)
def export_file_externals2(sbox):
"exporting file externals"
-
+
sbox.build()
sbox.simple_mkdir('DIR', 'DIR2')
-
+
sbox.simple_propset('svn:externals', '^/iota file', 'DIR')
sbox.simple_propset('svn:externals', '^/DIR TheDir', 'DIR2')
sbox.simple_commit()
sbox.simple_update()
-
+
tmp = sbox.add_wc_path('tmp')
os.mkdir(tmp)
-
+
expected_output = svntest.wc.State(tmp, {
'file' : Item(status='A '),
})
@@ -1044,7 +1039,7 @@ def export_file_externals2(sbox):
tmp,
expected_output,
expected_disk)
-
+
expected_output = svntest.wc.State(tmp, {
'DIR/file' : Item(status='A '),
})
@@ -1056,7 +1051,7 @@ def export_file_externals2(sbox):
os.path.join(tmp, 'DIR'),
expected_output,
expected_disk)
-
+
expected_output = svntest.wc.State(tmp, {
'DIR2/TheDir/file' : Item(status='A '),
})
diff --git a/subversion/tests/cmdline/externals_tests.py b/subversion/tests/cmdline/externals_tests.py
index 36ccaa6..34f471f 100755
--- a/subversion/tests/cmdline/externals_tests.py
+++ b/subversion/tests/cmdline/externals_tests.py
@@ -115,7 +115,7 @@ def externals_test_setup(sbox):
D_path = os.path.join(wc_init_dir, "A/D")
# Create a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_init_dir)
@@ -123,22 +123,22 @@ def externals_test_setup(sbox):
# post-commit status checks.
svntest.main.file_append(mu_path, "Added to mu in revision 2.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(pi_path, "Added to pi in revision 3.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(lambda_path, "Added to lambda in revision 4.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(omega_path, "Added to omega in revision 5.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
@@ -206,8 +206,7 @@ def externals_test_setup(sbox):
svntest.actions.run_and_verify_commit(wc_init_dir,
expected_output,
- expected_status,
- None, wc_init_dir)
+ expected_status)
return external_url_for
@@ -217,7 +216,7 @@ def change_external(path, new_val, commit=True):
svntest.actions.set_prop('svn:externals', new_val, path)
if commit:
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'log msg', '--quiet', path)
def change_external_expect_error(path, new_val, expected_err):
@@ -269,7 +268,7 @@ def checkout_with_externals(sbox):
repo_url = sbox.repo_url
# Create a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -310,11 +309,11 @@ def update_receive_new_external(sbox):
other_repo_url = repo_url + ".other"
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, other_wc_dir)
@@ -358,11 +357,11 @@ def update_lose_external(sbox):
repo_url = sbox.repo_url
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, other_wc_dir)
@@ -433,11 +432,11 @@ def update_change_pristine_external(sbox):
other_repo_url = repo_url + ".other"
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, other_wc_dir)
@@ -486,11 +485,11 @@ def update_change_modified_external(sbox):
other_repo_url = repo_url + ".other"
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, other_wc_dir)
@@ -548,11 +547,11 @@ def update_receive_change_under_external(sbox):
other_repo_url = repo_url + ".other"
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
other_repo_url, other_wc_dir)
@@ -567,8 +566,7 @@ def update_receive_change_under_external(sbox):
expected_status.tweak('A/D/gamma', wc_rev=6)
svntest.actions.run_and_verify_commit(other_wc_dir,
expected_output,
- expected_status,
- None, other_wc_dir)
+ expected_status)
# Now update the regular wc to see if we get the change. Note that
# none of the module *properties* in this wc have been changed; only
@@ -603,8 +601,7 @@ def update_receive_change_under_external(sbox):
expected_status.tweak('A/D/G/rho', wc_rev=7)
svntest.actions.run_and_verify_commit(other_wc_dir,
expected_output,
- expected_status,
- None, other_wc_dir)
+ expected_status)
expected_output = svntest.wc.State(sbox.ospath('A/C'), {
'exdir_G/rho' : Item(status='U '),
@@ -629,7 +626,7 @@ def modify_and_update_receive_new_external(sbox):
repo_url = sbox.repo_url
# Checkout a working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -651,8 +648,7 @@ def modify_and_update_receive_new_external(sbox):
# Once upon a time there was a core-dump here
- svntest.actions.run_and_verify_svn("update failed",
- svntest.verify.AnyOutput, [], 'up' )
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], 'up' )
os.chdir(was_cwd)
@@ -668,7 +664,7 @@ def disallow_dot_or_dotdot_directory_reference(sbox):
repo_url = sbox.repo_url
# Checkout a working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -739,7 +735,7 @@ def export_with_externals(sbox):
repo_url = sbox.repo_url
# Create a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'export',
repo_url, wc_dir)
@@ -786,11 +782,11 @@ def export_wc_with_externals(sbox):
export_target = sbox.add_wc_path('export')
# Create a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
# Export the working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'export', wc_dir, export_target)
### We should be able to check exactly the paths that externals_test_setup()
@@ -815,7 +811,7 @@ def export_wc_with_externals(sbox):
svntest.main.safe_rmtree(export_target)
# Export it again, without externals.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'export', '--ignore-externals',
wc_dir, export_target)
probe_paths_missing(paths)
@@ -830,12 +826,12 @@ def external_with_peg_and_op_revision(sbox):
repo_url = sbox.repo_url
# Checkout a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
# remove A/D/H in the other repo
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm',
external_url_for["A/D/exdir_A/H"],
'-m', 'remove original A/D/H')
@@ -875,7 +871,7 @@ def new_style_externals(sbox):
repo_url = sbox.repo_url
# Checkout a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -975,7 +971,7 @@ def old_style_externals_ignore_peg_reg(sbox):
repo_url = sbox.repo_url
# Checkout a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -998,8 +994,7 @@ def old_style_externals_ignore_peg_reg(sbox):
expected_error = "|".join([".*Error handling externals definition.*",
".*URL .*/A/D/G@HEAD' .* doesn't exist.*",
])
- svntest.actions.run_and_verify_svn2("External '%s' used pegs" % ext.strip(),
- None,
+ svntest.actions.run_and_verify_svn2(None,
expected_error,
1,
'up',
@@ -1016,13 +1011,12 @@ def cannot_move_or_remove_file_externals(sbox):
repo_url = sbox.repo_url
# Checkout a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
# Should not be able to delete the file external.
- svntest.actions.run_and_verify_svn("Able to delete file external",
- None,
+ svntest.actions.run_and_verify_svn(None,
".*Cannot remove the external at "
".*gamma.*; please .* "
"the svn:externals .*",
@@ -1030,8 +1024,7 @@ def cannot_move_or_remove_file_externals(sbox):
sbox.ospath('A/B/gamma'))
# Should not be able to move the file external.
- svntest.actions.run_and_verify_svn("Able to move file external",
- None,
+ svntest.actions.run_and_verify_svn(None,
".*Cannot move the external at "
".*gamma.*; please .*edit.*"
"svn:externals.*",
@@ -1042,7 +1035,7 @@ def cannot_move_or_remove_file_externals(sbox):
# But the directory that contains it can be deleted.
expected_status = svntest.actions.get_virginal_state(wc_dir, 6)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm',
sbox.ospath('A/B'))
@@ -1103,8 +1096,7 @@ def cannot_move_or_remove_file_externals(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Bring the working copy up to date and check that the file the file
# external is switched to still exists.
@@ -1126,7 +1118,7 @@ def cant_place_file_external_into_dir_external(sbox):
other_repo_url = repo_url + ".other"
# Checkout a working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -1138,7 +1130,7 @@ def cant_place_file_external_into_dir_external(sbox):
# Bring the working copy up to date and check that the file the file
# external is switched to still exists.
- svntest.actions.run_and_verify_svn(None, None, 'svn: E205011: ' +
+ svntest.actions.run_and_verify_svn(None, 'svn: E205011: ' +
'Failure occurred.*definitions',
'up', wc_dir)
@@ -1212,7 +1204,7 @@ def binary_file_externals(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create a file external on the binary file A/theta
@@ -1252,8 +1244,7 @@ def binary_file_externals(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
#----------------------------------------------------------------------
@@ -1297,11 +1288,10 @@ def update_lose_file_external(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
# now remove the svn:external prop
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', 'svn:externals', C)
# commit the property change
@@ -1313,7 +1303,7 @@ def update_lose_file_external(sbox):
expected_status.tweak('A/C', wc_rev = 3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# try to actually get rid of the external via an update
expected_output = svntest.wc.State(wc_dir, {
@@ -1334,8 +1324,7 @@ def update_lose_file_external(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
probe_paths_missing([sbox.ospath('A/C/external')])
@@ -1370,15 +1359,15 @@ def switch_relative_external(sbox):
})
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None, None)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
'--quiet', A_path, A_copy_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
'--quiet', wc_dir)
# Okay. We now want to switch A to A_copy, which *should* cause
# A/D/ext to point to the URL for A_copy/B (instead of A/B).
- svntest.actions.run_and_verify_svn(None, None, [], 'sw',
+ svntest.actions.run_and_verify_svn(None, [], 'sw',
A_copy_url, A_path)
expected_infos = [
@@ -1415,13 +1404,13 @@ def export_sparse_wc_with_externals(sbox):
# Create a working copy with depth=empty itself but children that are
# depth=infinity.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout', '--depth=empty',
repo_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', *child_paths)
# Export the working copy.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'export', wc_dir, export_target)
# It failed with "'gamma' is not under version control" because the
# depth-infinity children led it wrongly to try to process externals
@@ -1482,8 +1471,7 @@ def relegate_external(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
#----------------------------------------------------------------------
@@ -1514,7 +1502,7 @@ def wc_repos_file_externals(sbox):
# Commit the new file, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create a file external on the file A/theta
@@ -1550,8 +1538,7 @@ def wc_repos_file_externals(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
# Copy A/C to a new tag in the repos
tag_url = repo_url + '/A/I'
@@ -1584,10 +1571,10 @@ def wc_repos_file_externals(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
#----------------------------------------------------------------------
+@SkipUnless(svntest.main.server_has_mergeinfo)
@Issue(3843)
def merge_target_with_externals(sbox):
"merge target with externals"
@@ -1604,7 +1591,7 @@ def merge_target_with_externals(sbox):
A_branch_path = sbox.ospath('A-branch')
A_gamma_branch_path = sbox.ospath('A-branch/D/gamma')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -1614,12 +1601,12 @@ def merge_target_with_externals(sbox):
change_external(sbox.ospath('A'), externals_prop)
# Branch A@1 to A-branch and make a simple text change on the latter in r8.
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', A_path + '@1',
+ svntest.actions.run_and_verify_svn(None, [], 'copy', A_path + '@1',
A_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'make a copy', wc_dir)
svntest.main.file_write(A_gamma_branch_path, "The new gamma!\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'branch edit', wc_dir)
expected_output = svntest.wc.State(wc_dir, {
'A/external' : Item(status='A '),
@@ -1630,10 +1617,9 @@ def merge_target_with_externals(sbox):
# Merge r8 from A-branch back to A. There should be explicit mergeinfo
# only at the root of A; the externals should not get any.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c8',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c8',
repo_url + '/A-branch', A_path)
svntest.actions.run_and_verify_svn(
- "Unexpected subtree mergeinfo created",
["Properties on '" + A_path + "':\n",
" svn:mergeinfo\n",
" /A-branch:8\n"],
@@ -1664,8 +1650,7 @@ def update_modify_file_external(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
# Modify A/mu
svntest.main.file_append(sbox.ospath('A/mu'), 'appended mu text')
@@ -1675,9 +1660,7 @@ def update_modify_file_external(sbox):
expected_status.tweak('A/mu', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Update to modify the file external, this asserts in update_editor.c
expected_output = svntest.wc.State(wc_dir, {
@@ -1694,8 +1677,7 @@ def update_modify_file_external(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
# Test for issue #2267
@Issue(2267)
@@ -1709,7 +1691,7 @@ def update_external_on_locally_added_dir(sbox):
other_repo_url = repo_url + ".other"
# Checkout a working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -1786,13 +1768,13 @@ def switch_external_on_locally_added_dir(sbox):
# Create a branch of A
# Checkout a working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
A_path, A_copy_path,
'-m', 'Create branch of A')
# Checkout a working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
A_path, wc_dir)
@@ -1816,7 +1798,7 @@ def switch_external_on_locally_added_dir(sbox):
change_external(new_dir, new_externals_desc, commit=False)
# Switch the working copy to the branch, see if we get the new item.
- svntest.actions.run_and_verify_svn(None, None, [], 'sw', A_copy_path, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'sw', A_copy_path, wc_dir)
probe_paths_exist([sbox.ospath('foo/exdir_E')])
@@ -1834,8 +1816,7 @@ def file_external_in_sibling(sbox):
sbox.simple_update()
os.chdir(sbox.ospath("A"))
- svntest.actions.run_and_verify_svn(None,
- svntest.actions.expected_noop_update_output(2),
+ svntest.actions.run_and_verify_svn(svntest.actions.expected_noop_update_output(2),
[], 'update')
@Issue(3823)
@@ -1894,7 +1875,7 @@ def exclude_externals(sbox):
repo_url = sbox.repo_url
# Checkout two working copies.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -1902,8 +1883,7 @@ def exclude_externals(sbox):
# or register the file external as excluded (preferred behavior)
svntest.actions.run_and_verify_update(sbox.ospath('A/B/gamma'),
None, None, None,
- '.*Cannot exclude.*',
- None, None, None, None, False,
+ '.*Cannot exclude.*', False,
'--set-depth', 'exclude',
sbox.ospath('A/B/gamma'))
@@ -1911,8 +1891,7 @@ def exclude_externals(sbox):
# or register the directory external as excluded (preferred behavior)
svntest.actions.run_and_verify_update(sbox.ospath('A/C/exdir_G'),
None, None, None,
- '.*Cannot exclude.*',
- None, None, None, None, False,
+ '.*Cannot exclude.*', False,
'--set-depth', 'exclude',
sbox.ospath('A/C/exdir_G'))
@@ -1969,8 +1948,8 @@ def exclude_externals(sbox):
'A/D/x/y/z/blah/F' : Item(status=' ', wc_rev='5'),
})
svntest.actions.run_and_verify_update(wc_dir,
- None, None, expected_status, None,
- None, None, None, None, False,
+ None, None, expected_status,
+ [], False,
'--set-depth', 'infinity', wc_dir)
def file_externals_different_url(sbox):
@@ -2013,7 +1992,7 @@ def file_externals_different_url(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None,
- expected_status, None)
+ expected_status)
# Verify that all file external URLs are descendants of r1_url
for e in ['r1-e-1', 'r1-e-2', 'r2-e-1', 'r2-e-2', 'rr-e-1']:
@@ -2021,7 +2000,7 @@ def file_externals_different_url(sbox):
os.path.join(sbox.wc_dir, e))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'relocate', r1_url, r2_url, wc_dir)
@@ -2031,7 +2010,7 @@ def file_externals_different_url(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None,
- expected_status, None)
+ expected_status)
# Verify that all file external URLs are descendants of r2_url
for e in ['r1-e-1', 'r1-e-2', 'r2-e-1', 'r2-e-2', 'rr-e-1']:
@@ -2053,7 +2032,7 @@ def file_external_in_unversioned(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output, None, None)
# At one point this failed with SVN_DEBUG wcng consistency checks enabled
- svntest.actions.run_and_verify_svn(None, None, [], 'cleanup', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'cleanup', wc_dir)
from svntest import verify, actions, main
@@ -2076,12 +2055,12 @@ def copy_file_externals(sbox):
# svn mkdir X
expected_stdout = ['A ' + X + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir', X)
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir', X)
# svn ps svn:externals "^/iota xiota" X
expected_stdout = ["property 'svn:externals' set on '" + X + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals', '''
^/iota xiota
^/A/mu xmu
@@ -2116,8 +2095,7 @@ def copy_file_externals(sbox):
'X' : Item(status=' ', wc_rev='2'),
})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {
@@ -2139,7 +2117,7 @@ def copy_file_externals(sbox):
expected_status.tweak(wc_rev='2')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# have a commit on one of the files
# echo mod >> X/xmu
@@ -2153,7 +2131,7 @@ def copy_file_externals(sbox):
expected_status.tweak('X/xmu', wc_rev='3')
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, X_xmu)
+ [], X_xmu)
# svn up
expected_output = svntest.wc.State(wc_dir, {
@@ -2166,13 +2144,13 @@ def copy_file_externals(sbox):
expected_status.tweak(wc_rev='3')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# now perform the WC->WC copy
# svn cp X X_copy
expected_stdout = ['A ' + X_copy + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'cp', X,
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'cp', X,
X_copy)
# svn ci
@@ -2184,8 +2162,7 @@ def copy_file_externals(sbox):
'X_copy' : Item(status=' ', wc_rev='4'),
})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# verify disk state, also verifying props
expected_disk.add({
@@ -2214,7 +2191,7 @@ def copy_file_externals(sbox):
expected_status.tweak(wc_rev='4')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, True, wc_dir)
+ expected_status, check_props=True)
def commit_include_externals(sbox):
"commit --include-externals"
@@ -2259,7 +2236,7 @@ def commit_include_externals(sbox):
'A ' + Z_zeta + '\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'add', Z)
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'add', Z)
# svn mkdir --parents Xpegged X/Y
expected_stdout = verify.UnorderedOutput([
@@ -2268,7 +2245,7 @@ def commit_include_externals(sbox):
'A ' + X_Y + '\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir',
'--parents', Xpegged, X_Y)
# svn ci
@@ -2289,8 +2266,7 @@ def commit_include_externals(sbox):
'Xpegged' : Item(status=' ', wc_rev='2'),
})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {})
@@ -2307,18 +2283,18 @@ def commit_include_externals(sbox):
expected_status.tweak(wc_rev='2')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# svn ps svn:externals "^/Z xZ" A/D/H
expected_stdout = ["property 'svn:externals' set on '" + A_D_H + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals', '^/Z xZ', A_D_H)
# svn ps svn:externals "^/iota@1 Xpegged/xiota" wc_dir
expected_stdout = ["property 'svn:externals' set on '" + wc_dir + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals',
'''
^/iota@1 Xpegged/xiota
@@ -2394,8 +2370,7 @@ def commit_include_externals(sbox):
expected_status.tweak('', 'A/D/H', wc_rev='3')
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {
@@ -2464,7 +2439,7 @@ def commit_include_externals(sbox):
expected_status.tweak('Xpegged/xiota', wc_rev='1')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# echo mod >> Xpegged/xE/alpha
main.file_append(Xpegged_xE_alpha, 'mod\n')
@@ -2495,22 +2470,21 @@ def commit_include_externals(sbox):
# svn ci
expected_output = svntest.wc.State(wc_dir, {})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# Expect no externals to be committed, because pegged
# svn ci --include-externals Xpegged
expected_output = svntest.wc.State(wc_dir, {})
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--include-externals', Xpegged)
+ [], '--include-externals', Xpegged)
# Expect no externals to be committed, because of depth
# svn ci --depth=immediates --include-externals
expected_output = svntest.wc.State(wc_dir, {})
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--depth=immediates', '--include-externals', wc_dir)
+ [], '--depth=immediates', '--include-externals', wc_dir)
# Expect only unpegged externals to be committed (those in X/)
# svn ci --include-externals
@@ -2529,7 +2503,7 @@ def commit_include_externals(sbox):
expected_status.tweak('Xpegged/xE/alpha', status='M ')
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--include-externals', wc_dir)
+ [], '--include-externals', wc_dir)
# svn up
expected_output = svntest.wc.State(wc_dir, {
@@ -2561,7 +2535,7 @@ def commit_include_externals(sbox):
'Xpegged/xE/beta', wc_rev=1)
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# new mods to check more cases
# echo mod >> X/xmu
@@ -2590,7 +2564,7 @@ def commit_include_externals(sbox):
expected_output = svntest.wc.State(wc_dir, {})
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--include-externals', '--depth=empty', X)
+ [], '--include-externals', '--depth=empty', X)
# Expect only file external xmu to be committed, because of depth
# svn ci --include-externals --depth=files X
@@ -2604,7 +2578,7 @@ def commit_include_externals(sbox):
'X/Y/xH/xZ/zeta', 'Xpegged/xE/alpha', status='M ')
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--include-externals', '--depth=files', X)
+ [], '--include-externals', '--depth=files', X)
# svn status
actions.run_and_verify_unquiet_status(wc_dir, expected_status)
@@ -2633,7 +2607,7 @@ def commit_include_externals(sbox):
expected_status.tweak('X/Y/xH/chi', status='M ')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# echo mod >> X/xG/pi
main.file_append(X_xG_pi, 'mod\n')
@@ -2654,7 +2628,7 @@ def commit_include_externals(sbox):
status='M ')
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, X_Y_xlambda, X_xG)
+ [], X_Y_xlambda, X_xG)
# svn status
actions.run_and_verify_unquiet_status(wc_dir, expected_status)
@@ -2693,7 +2667,7 @@ def include_immediate_dir_externals(sbox):
# svn mkdir X
expected_stdout = ['A ' + X + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir', X)
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir', X)
# svn ci
expected_output = svntest.wc.State(wc_dir, {
@@ -2705,8 +2679,7 @@ def include_immediate_dir_externals(sbox):
'X' : Item(status=' ', wc_rev='2'),
})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {})
@@ -2719,12 +2692,12 @@ def include_immediate_dir_externals(sbox):
expected_status.tweak(wc_rev='2')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# svn ps svn:externals "^/A/B/E X/XE" wc_dir
expected_stdout = ["property 'svn:externals' set on '" + wc_dir + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals', '^/A/B/E X/XE', wc_dir)
# svn ci
@@ -2734,8 +2707,7 @@ def include_immediate_dir_externals(sbox):
expected_status.tweak('', wc_rev='3')
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {
@@ -2757,7 +2729,7 @@ def include_immediate_dir_externals(sbox):
})
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
sbox.simple_propset('some', 'change', 'X/XE')
@@ -2790,7 +2762,7 @@ def include_immediate_dir_externals(sbox):
#
# >
actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, '--include-externals', '--depth=immediates', X)
+ [], '--include-externals', '--depth=immediates', X)
@Issue(4085)
@@ -2828,17 +2800,17 @@ def remap_file_external_with_prop_del(sbox):
mu_path = sbox.ospath('A/mu')
# Add a property to A/mu
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'propname', 'propval', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'New property on a file',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Add a new file external A/external pointing to ^/A/mu
externals_prop = "^/A/mu external\n"
change_external(A_path, externals_prop)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Change A/external to point to ^/iota
externals_prop = "^/iota external\n"
@@ -2847,7 +2819,7 @@ def remap_file_external_with_prop_del(sbox):
# Now update to bring the new external down.
# This previously segfaulted as described in
# http://subversion.tigris.org/issues/show_bug.cgi?id=4093#desc1
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Test for issue #4053 'svn:externals with explicit rev checks out HEAD'
@@ -2884,13 +2856,12 @@ def dir_external_with_dash_r_only(sbox):
expected_status = actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B/E/alpha', wc_rev='2')
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn ps svn:externals ' -r1 ^/A/B/E E_ext' .
expected_stdout = ["property 'svn:externals' set on '" + wc_dir + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals', ' -r1 ^/A/B/E E_ext', wc_dir)
# svn up
@@ -2916,7 +2887,7 @@ def dir_external_with_dash_r_only(sbox):
})
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# svn info E_ext/alpha
expected_info = { 'Revision': '1' }
@@ -2933,12 +2904,12 @@ def url_to_wc_copy_of_externals(sbox):
repo_url = sbox.repo_url
# Create an external A/C/external pointing to ^/A/D/G.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
'svn:externals', '^/A/D/G external',
sbox.ospath('A/C'))
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'create an external', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Copy ^/A/C to External-WC-to-URL-Copy.
#
@@ -2987,7 +2958,7 @@ def url_to_wc_copy_of_externals(sbox):
"A " + external_root_path + "\n"
])
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
- "OUTPUT", expected_stdout, [], 0, 'copy', repo_url + '/A/C',
+ expected_stdout, [], 0, 'copy', repo_url + '/A/C',
sbox.ospath('External-WC-to-URL-Copy'))
@Issue(4227)
@@ -3015,31 +2986,31 @@ def duplicate_targets(sbox):
match_all=False)
# svn ps svn:externals "^/A/B/E barf\n^/A/B/E barf" .
- actions.run_and_verify_svn2('OUTPUT', [], expected_stderr, 1, 'ps',
+ actions.run_and_verify_svn2([], expected_stderr, 1, 'ps',
'svn:externals', '^/A/B/E barf\n^/A/B/E barf', wc_dir)
# svn ps svn:externals "^/A/B/E barf\n^/A/D/G barf" .
- actions.run_and_verify_svn2('OUTPUT', [], expected_stderr, 1, 'ps',
+ actions.run_and_verify_svn2([], expected_stderr, 1, 'ps',
'svn:externals', '^/A/B/E barf\n^/A/D/G barf', wc_dir)
# svn ps svn:externals "^/A/B/E barf/.\n^/A/D/G ./barf" .
- actions.run_and_verify_svn2('OUTPUT', [], expected_stderr, 1, 'ps',
+ actions.run_and_verify_svn2([], expected_stderr, 1, 'ps',
'svn:externals', '^/A/B/E barf/.\n^/A/D/G ./barf', wc_dir)
# svn ps svn:externals "^/A/B/E ././barf\n^/A/D/G .//barf" .
- actions.run_and_verify_svn2('OUTPUT', [], expected_stderr, 1, 'ps',
+ actions.run_and_verify_svn2([], expected_stderr, 1, 'ps',
'svn:externals', '^/A/B/E ././barf\n^/A/D/G .//barf', wc_dir)
# svn pg svn:externals .
- expected_stdout = []
+ expected_stderr = '.*W200017: Property.*not found'
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'pg',
+ actions.run_and_verify_svn2([], expected_stderr, 1, 'pg',
'svn:externals', wc_dir)
# svn ps svn:externals "^/A/B/E ok" .
expected_stdout = ["property 'svn:externals' set on '" + wc_dir + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'svn:externals', '^/A/B/E ok', wc_dir)
# svn pg svn:externals .
@@ -3048,7 +3019,7 @@ def duplicate_targets(sbox):
'\n'
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'pg',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'pg',
'svn:externals', wc_dir)
@Issue(4225)
@@ -3060,7 +3031,7 @@ def list_include_externals(sbox):
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -3083,10 +3054,10 @@ def list_include_externals(sbox):
"gamma" + "\n"])
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
- "OUTPUT", expected_stdout, [], 0, 'ls', '--include-externals', B_path)
+ expected_stdout, [], 0, 'ls', '--include-externals', B_path)
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
- "OUTPUT", expected_stdout, [], 0, 'ls', '--include-externals', B_url)
+ expected_stdout, [], 0, 'ls', '--include-externals', B_url)
expected_stdout = verify.UnorderedOutput([
list_external_string("exdir_G", C_url)+ "\n",
@@ -3099,10 +3070,10 @@ def list_include_externals(sbox):
"psi" + "\n"])
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
- "OUTPUT", expected_stdout, [], 0, 'ls', '--include-externals', C_path)
+ expected_stdout, [], 0, 'ls', '--include-externals', C_path)
exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
- "OUTPUT", expected_stdout, [], 0, 'ls', '--include-externals', C_url)
+ expected_stdout, [], 0, 'ls', '--include-externals', C_url)
@Issue(4293)
def move_with_file_externals(sbox):
@@ -3120,7 +3091,7 @@ def move_with_file_externals(sbox):
sbox.simple_commit()
sbox.simple_update()
-@Issue(4185)
+@Issue(4185,4529)
def pinned_externals(sbox):
"pinned external"
@@ -3133,13 +3104,14 @@ def pinned_externals(sbox):
sbox.simple_mkdir('Z')
sbox.simple_commit('')
+ repo_X_C = repo_url + '/X/C'
repo_X_mu = repo_url + '/X/mu'
expected_output = verify.RegexOutput(
'^ 1 jrandom .* mu$'
)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'list', repo_X_mu, '-v')
# So, we copied A/mu to X/mu in r2, but its last changed revision is
@@ -3152,14 +3124,10 @@ def pinned_externals(sbox):
'old-rev -r 1 ' + repo_X_mu + '\n' +
repo_X_mu + ' new-plain\n' +
'-r1 ' + repo_X_mu + ' new-rev\n' +
- repo_X_mu + '@1 new-peg\n',
+ repo_X_mu + '@1 new-peg\n'
+ '-r1 ' + repo_X_C + ' new-dir-rev\n',
'Z')
- expected_output = svntest.wc.State(wc_dir, {
- 'A/D' : Item(status=' U'),
- 'A/D/exdir_E/beta' : Item(status='A '),
- 'A/D/exdir_E/alpha' : Item(status='A '),
- })
expected_error = "svn: E205011: Failure.*externals"
expected_disk = svntest.main.greek_state.copy()
expected_disk.add({
@@ -3167,6 +3135,7 @@ def pinned_externals(sbox):
'Z/old-plain' : Item(contents="This is the file 'mu'.\n"),
'Z/new-plain' : Item(contents="This is the file 'mu'.\n"),
'Z/new-rev' : Item(contents="This is the file 'mu'.\n"),
+ 'Z/new-dir-rev' : Item(),
# And verifying X
'X/D/H/psi' : Item(contents="This is the file 'psi'.\n"),
@@ -3212,7 +3181,7 @@ def update_dir_external_shallow(sbox):
})
svntest.actions.run_and_verify_update(sbox.wc_dir,
expected_output, None, None,
- None, None, None, None, None, False,
+ [], False,
'--set-depth=empty',
sbox.ospath('A/B/E'))
@@ -3226,7 +3195,7 @@ def update_dir_external_shallow(sbox):
})
svntest.actions.run_and_verify_update(sbox.wc_dir,
expected_output, None, None,
- None, None, None, None, None, False,
+ [], False,
'--set-depth=infinity',
sbox.ospath('A/B/E'))
@@ -3249,7 +3218,7 @@ def switch_parent_relative_file_external(sbox):
# Check out A/B_copy to a new working copy
branch_wc = sbox.add_wc_path("branch")
branch_url = sbox.repo_url + '/A_copy'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout', branch_url,
branch_wc)
@@ -3259,14 +3228,161 @@ def switch_parent_relative_file_external(sbox):
# Switch the branch working copy to the new branch URL
new_branch_url = sbox.repo_url + '/A_copy2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', new_branch_url,
branch_wc)
# Bug: The branch working copy can no longer be updated.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', branch_wc)
+@Issue(4420)
+def file_external_unversioned_obstruction(sbox):
+ """file externals unversioned obstruction"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ expected_output = verify.RegexOutput('r2 committed .*')
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
+ '-U', sbox.repo_url, '-m', 'r2: set external',
+ 'propset', 'svn:externals', '^/A/mu mu-ext', 'A')
+
+ sbox.simple_append('A/mu-ext', 'unversioned obstruction')
+
+ # Update reports a tree-conflict but status doesn't show any such
+ # conflict. I'm no sure whether this is correct.
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(status=' U'),
+ 'A/mu-ext' : Item(status=' ', treeconflict='A'),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.add({
+ 'A/mu-ext' : Item('unversioned obstruction'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'A/mu-ext' : Item(status='M ', wc_rev='2', switched='X'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, expected_disk,
+ expected_status)
+
+@Issue(4001)
+@XFail()
+def file_external_versioned_obstruction(sbox):
+ """file externals versioned obstruction"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ expected_output = verify.RegexOutput('r2 committed .*')
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
+ '-U', sbox.repo_url, '-m', 'r2: set external',
+ 'propset', 'svn:externals', '^/A/mu mu-ext', 'A')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(status=' U'),
+ 'A/mu-ext' : Item(status='A '),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.add({
+ 'A/mu-ext' : Item('This is the file \'mu\'.\n'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'A/mu-ext' : Item(status=' ', wc_rev='2', switched='X'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, expected_disk,
+ expected_status)
+
+ # Update skips adding the versioned node because of the file
+ # external obstruction then when the external is deleted the
+ # versioned node is missing from disk and wc.db. Not really sure
+ # what should happen, perhaps a not-present node?
+ expected_output = verify.RegexOutput('r3 committed .*')
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
+ '-U', sbox.repo_url, '-m', 'r3: copy file',
+ 'cp', 'head', 'A/mu', 'A/mu-ext',
+ 'propdel', 'svn:externals', 'A')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(status=' U'),
+ 'A/mu-ext' : Item(verb='Removed external', prev_verb='Skipped'),
+ })
+ expected_disk.tweak('A/mu-ext', content='This is the file \'mu\'.\n')
+ expected_status.tweak(wc_rev=3)
+ expected_status.tweak('A/mu-ext', switched=None)
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, expected_disk,
+ expected_status)
+
+@Issue(4495)
+def update_external_peg_rev(sbox):
+ "update external peg rev"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_rm('A/B/E/alpha')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ sbox.simple_propset('svn:externals', '^/A/B/E@1 xE', 'A/B/F')
+ sbox.simple_commit()
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B/F/xE/alpha' : Item(status='A '),
+ 'A/B/F/xE/beta' : Item(status='A '),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.remove('A/B/E/alpha')
+ expected_disk.add({
+ 'A/B/F/xE' : Item(),
+ 'A/B/F/xE/alpha' : Item('This is the file \'alpha\'.\n'),
+ 'A/B/F/xE/beta' : Item('This is the file \'beta\'.\n'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+ expected_status.remove('A/B/E/alpha')
+ expected_status.add({
+ 'A/B/F/xE' : Item(status=' ', wc_rev='1', prev_status='X '),
+ 'A/B/F/xE/alpha' : Item(status=' ', wc_rev='1'),
+ 'A/B/F/xE/beta' : Item(status=' ', wc_rev='1'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ expected_disk,
+ expected_status)
+
+ sbox.simple_propset('svn:externals', '^/A/B/E@2 xE', 'A/B/F')
+ sbox.simple_commit()
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B/F/xE/alpha' : Item(status='D '),
+ })
+ expected_disk.remove('A/B/F/xE/alpha')
+ expected_status.remove('A/B/F/xE/alpha')
+ expected_status.tweak(wc_rev=4)
+ expected_status.tweak('A/B/F/xE', 'A/B/F/xE/beta', wc_rev=2)
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ expected_disk,
+ expected_status)
+
+ # XFAIL: EXTERNALS.def_revision and EXTERNALS.def_operational_revision
+ # are still r1 for 'A/B/F/xE' so status is not against the expected r2.
+ # No testsuite support for ood marker so examine status output manually.
+ expected_output = [
+ "X %s\n" % sbox.ospath('A/B/F/xE'),
+ "Status against revision: 4\n",
+ "\n",
+ "Performing status on external item at '%s':\n" % sbox.ospath('A/B/F/xE'),
+ "Status against revision: 2\n",
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'status', '-u', sbox.wc_dir)
+
def update_deletes_file_external(sbox):
"update deletes a file external"
@@ -3278,18 +3394,17 @@ def update_deletes_file_external(sbox):
sbox.simple_update()
# Create a branch
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
'-m', 'create branch',
sbox.repo_url + '/A',
sbox.repo_url + '/A_copy')
# Update the working copy
- sbox.simple_commit()
sbox.simple_update()
# Remove the branch
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm',
'-m', 'remove branch',
sbox.repo_url + '/A_copy')
@@ -3297,7 +3412,7 @@ def update_deletes_file_external(sbox):
# As of r1448345, this update fails:
# E000002: Can't remove directory '.../A_copy/C': No such file or directory
sbox.simple_update()
-
+
@Issue(4519)
def switch_relative_externals(sbox):
@@ -3305,7 +3420,7 @@ def switch_relative_externals(sbox):
sbox.build(create_wc=False)
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-U', sbox.repo_url, '-m', 'Q',
'mkdir', 'branches',
'cp', '1', 'A', 'trunk',
@@ -3319,21 +3434,926 @@ def switch_relative_externals(sbox):
wc = sbox.add_wc_path('wc')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', sbox.repo_url + '/trunk', wc)
# This forgets to update some externals data
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', sbox.repo_url + '/branches/A', wc)
# This upgrade makes the following update fail
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', wc)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc)
+def copy_file_external_to_repo(sbox):
+ "explicitly copy file external to repo"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ change_external(sbox.ospath('A'), '^/A/mu ext')
+ sbox.simple_update()
+
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
+ '--message', 'external copy',
+ sbox.ospath('A/ext'),
+ sbox.repo_url + '/ext_copy')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'ext_copy' : Item(status='A '),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.add({
+ 'A/ext' : Item('This is the file \'mu\'.\n'),
+ 'ext_copy' : Item('This is the file \'mu\'.\n'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, expected_disk, None)
+
+@Issue(4550)
+def replace_tree_with_foreign_external(sbox):
+ "replace tree with foreign external"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ repo_dir = sbox.repo_dir
+
+ other_repo_dir, other_repo_url = sbox.add_repo_path('other')
+ svntest.main.copy_repos(repo_dir, other_repo_dir, 1)
+
+ sbox.simple_propset('svn:externals', other_repo_url + '/A/B X', 'A')
+ sbox.simple_commit()
+ sbox.simple_propdel('svn:externals', 'A')
+ sbox.simple_mkdir('A/X')
+ sbox.simple_mkdir('A/X/E')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/X' : Item(status='D '),
+ 'A' : Item(status=' U'),
+ 'A/X/lambda' : Item(status='A '),
+ 'A/X/E' : Item(status='A '),
+ 'A/X/E/alpha' : Item(status='A '),
+ 'A/X/E/beta' : Item(status='A '),
+ 'A/X/F' : Item(status='A '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'A/X' : Item(status=' ', wc_rev=1, prev_status='X '),
+ 'A/X/E' : Item(status=' ', wc_rev=1, prev_status=' '),
+ 'A/X/E/alpha' : Item(status=' ', wc_rev=1),
+ 'A/X/E/beta' : Item(status=' ', wc_rev=1),
+ 'A/X/F' : Item(status=' ', wc_rev=1),
+ 'A/X/lambda' : Item(status=' ', wc_rev=1),
+ })
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, None, expected_status,
+ [], True,
+ '-r', '2', wc_dir)
+
+
+def verify_pinned_externals(sbox, external_url_for, base_path_or_url,
+ external_youngest_rev, other_external_youngest_rev):
+ "helper for pin-externals tests"
+
+ expected_output = [
+ '%s@%d gamma\n' % (external_url_for["A/B/gamma"],
+ external_youngest_rev),
+ '\n',
+ ]
+ if svntest.sandbox.is_url(base_path_or_url):
+ target = base_path_or_url + '/A_copy/B'
+ else:
+ target = sbox.ospath('A_copy/B')
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'propget', 'svn:externals',
+ target)
+ expected_output = [
+ 'exdir_G -r%d %s\n' % (other_external_youngest_rev,
+ external_url_for["A/C/exdir_G"]),
+ '%s exdir_H\n' % external_url_for["A/C/exdir_H"],
+ '\n',
+ ]
+ if svntest.sandbox.is_url(base_path_or_url):
+ target = base_path_or_url + '/A_copy/C'
+ else:
+ target = sbox.ospath('A_copy/C')
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'propget', 'svn:externals',
+ target)
+ expected_output = [
+ '%s@%d exdir_A\n' % (external_url_for["A/D/exdir_A"],
+ other_external_youngest_rev),
+ '%s@%d exdir_A/G\n' % (external_url_for["A/D/exdir_A/G/"],
+ other_external_youngest_rev),
+ 'exdir_A/H -r1 %s\n' % external_url_for["A/D/exdir_A/H"],
+ '%s@%d x/y/z/blah\n' % (external_url_for["A/D/x/y/z/blah"],
+ other_external_youngest_rev),
+ '\n',
+ ]
+ if svntest.sandbox.is_url(base_path_or_url):
+ target = base_path_or_url + '/A_copy/D'
+ else:
+ target = sbox.ospath('A_copy/D')
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'propget', 'svn:externals',
+ target)
+
+
+def copy_pin_externals_repos_repos(sbox):
+ "svn copy --pin-externals repos->repos"
+
+ external_url_for = externals_test_setup(sbox)
+
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_dir = repo_dir + ".other"
+
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+ # Perform a repos->repos copy, pinning externals
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ repo_url + '/A',
+ repo_url + '/A_copy',
+ '-m', 'copy',
+ '--pin-externals')
+ verify_pinned_externals(sbox, external_url_for, repo_url,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_repos_wc(sbox):
+ "svn copy --pin-externals repos->wc"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_dir = repo_dir + ".other"
+
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ # Perform a repos->wc copy, pinning externals
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ repo_url + '/A',
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+ verify_pinned_externals(sbox, external_url_for, wc_dir,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_repos(sbox):
+ "svn copy --pin-externals wc->repos"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_dir = repo_dir + ".other"
+
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ # Perform a wc->repos copy, pinning externals
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ repo_url + '/A_copy',
+ '-m', 'copy',
+ '--pin-externals')
+ verify_pinned_externals(sbox, external_url_for, repo_url,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_wc(sbox):
+ "svn copy --pin-externals wc->wc"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_dir = repo_dir + ".other"
+
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ # Perform a wc->wc copy, pinning externals
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+ verify_pinned_externals(sbox, external_url_for, wc_dir,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_moved_external(sbox):
+ "pin externals which were moved since last changed"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_dir = repo_dir + ".other"
+
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ # Test behaviour for external URLs which were moved since
+ # their last-changed revision.
+ sbox.simple_move('A/D/gamma', 'A/D/gamma-moved')
+ sbox.simple_commit()
+ change_external(sbox.ospath('A/B'), '^/A/D/gamma-moved gamma', commit=True)
+ sbox.simple_update()
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+ external_url_for["A/B/gamma"] = '^/A/D/gamma-moved'
+ verify_pinned_externals(sbox, external_url_for, wc_dir,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_removed_in_head(sbox):
+ "already pinned external which was removed in HEAD"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_url = repo_url + ".other"
+ other_repo_dir = repo_dir + ".other"
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ # Test an already pinned external which was removed in HEAD.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'rm',
+ other_repo_url + '/A/D/H',
+ '-m', 'remove A/D/H')
+ sbox.simple_update()
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+ verify_pinned_externals(sbox, external_url_for, wc_dir,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_from_old_rev(sbox):
+ "copy from an old revision with pinning"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+ repo_dir = sbox.repo_dir
+ other_repo_url = repo_url + ".other"
+ other_repo_dir = repo_dir + ".other"
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+ # Create a couple of revisions affecting 'A'.
+ for i in range(5):
+ svntest.main.file_append(sbox.ospath('A/mu'), 'a new line')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # Test a copy from an old revision with pinning.
+ external_youngest_rev = svntest.main.youngest(repo_dir)
+ other_external_youngest_rev = svntest.main.youngest(other_repo_dir)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy',
+ os.path.join(wc_dir, 'A@6'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+ external_url_for["A/B/gamma"] = '^/A/D/gamma'
+ verify_pinned_externals(sbox, external_url_for, wc_dir,
+ external_youngest_rev, other_external_youngest_rev)
+
+
+def copy_pin_externals_wc_local_mods(sbox):
+ "cannot pin WC externals with local mods"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ svntest.main.file_append(sbox.ospath('A/C/exdir_G/pi'), 'this file changed')
+ expected_stderr = verify.RegexOutput(".*Cannot pin.*local modifications.*",
+ match_all=False)
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+
+
+def copy_pin_externals_wc_switched_subtrees(sbox):
+ "cannot pin WC externals with switched subtrees"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'switch', '--ignore-ancestry', '^/A/B',
+ sbox.ospath('A/D/exdir_A/C'))
+ expected_stderr = verify.RegexOutput(".*Cannot pin.*switched subtree.*",
+ match_all=False)
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+
+
+def copy_pin_externals_wc_mixed_revisions(sbox):
+ "cannot pin WC externals with mixed revisions"
+
+ external_url_for = externals_test_setup(sbox)
+
+ wc_dir = sbox.wc_dir
+ repo_url = sbox.repo_url
+
+ # Create a working copy.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'checkout',
+ repo_url, wc_dir)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'update', '-r1',
+ sbox.ospath('A/D/exdir_A/mu'))
+ expected_stderr = verify.RegexOutput(".*Cannot pin.*mixed-revision.*",
+ match_all=False)
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
+ 'copy',
+ os.path.join(wc_dir, 'A'),
+ os.path.join(wc_dir, 'A_copy'),
+ '--pin-externals')
+
+@Issue(4558)
+def copy_pin_externals_whitepace_dir(sbox):
+ "copy --pin-externals with whitepace dir"
+
+ sbox.build(empty=True)
+ repo_url = sbox.repo_url
+ wc_dir = sbox.wc_dir
+ ss_path = repo_url[repo_url.find('//'):]
+
+ extdef = sbox.get_tempname('extdef')
+ info = sbox.get_tempname('info')
+
+ open(extdef, 'w').write(
+ '"' + ss_path +'/deps/sqlite" ext/sqlite\n' +
+ '"^/deps/A P R" \'ext/A P R\'\n' +
+ '^/deps/B\ D\ B\' ext/B\ D\ B\'\n' +
+ repo_url + '/deps/wors%23+t ext/wors#+t')
+ open(info, 'w').write('info\n')
+
+ svntest.actions.run_and_verify_svnmucc(None, [], '-U', repo_url,
+ 'mkdir', 'trunk',
+ 'mkdir', 'branches',
+ 'mkdir', 'deps',
+ 'mkdir', 'deps/sqlite',
+ 'put', info, 'deps/sqlite/readme',
+ 'mkdir', 'deps/A P R',
+ 'put', info, 'deps/A P R/about',
+ 'mkdir', 'deps/B D B\'',
+ 'put', info, 'deps/B D B\'/copying',
+ 'mkdir', 'deps/wors#+t',
+ 'put', info, 'deps/wors#+t/brood',
+ 'propsetf', 'svn:externals', extdef,
+ 'trunk',
+ '-mm'
+ )
+
+ svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk'),
+ '--ignore-externals')
+ sbox.simple_update('branches')
+
+ expected_status = svntest.wc.State(wc_dir, {
+ '' : Item(status=' ', wc_rev='0'),
+ 'trunk' : Item(status=' ', wc_rev='1'),
+ 'branches' : Item(status=' ', wc_rev='1'),
+ })
+
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ trunk_url = repo_url + '/trunk'
+ branches_url = repo_url + '/branches'
+ trunk_wc = sbox.ospath('trunk')
+
+ # Create a new revision to creat interesting pinning revisions
+ sbox.simple_propset('A', 'B', 'trunk')
+ sbox.simple_commit('trunk')
+
+ # And let's copy/pin
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--pin-externals',
+ trunk_url, branches_url + '/url-url', '-mm')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--pin-externals',
+ trunk_url, sbox.ospath('branches/url-wc'))
+ sbox.simple_commit('branches/url-wc')
+
+ # Now try to copy without externals in the WC
+ expected_err = '.*E155035: Cannot pin external.*'
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'copy', '--pin-externals',
+ trunk_wc, branches_url + '/wc-url', '-mm')
+
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'copy', '--pin-externals',
+ trunk_wc, sbox.ospath('branches/wc-wc'))
+
+ # Bring in the externals on trunk
+ svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk'))
+ expected_status = svntest.wc.State(wc_dir, {
+ 'trunk' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext' : Item(status='X '),
+ 'trunk/ext/sqlite' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/sqlite/readme' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/A P R' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/A P R/about' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/B D B\'' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/wors#+t' : Item(status=' ', wc_rev='4'),
+ 'trunk/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'),
+ })
+ svntest.actions.run_and_verify_status(sbox.ospath('trunk'), expected_status)
+
+ # And copy again
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--pin-externals',
+ trunk_wc, branches_url + '/wc-url', '-mm')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--pin-externals',
+ trunk_wc, sbox.ospath('branches/wc-wc'))
+ sbox.simple_commit('branches/wc-wc')
+
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'branches/url-url' : Item(status='A '),
+ 'branches/url-url/ext/A P R/about' : Item(status='A '),
+ 'branches/url-url/ext/B D B\'/copying' : Item(status='A '),
+ 'branches/url-url/ext/wors#+t/brood' : Item(status='A '),
+ 'branches/url-url/ext/sqlite/readme' : Item(status='A '),
+
+ # url-wc is already up to date
+
+ 'branches/wc-url' : Item(status='A '),
+ 'branches/wc-url/ext/wors#+t/brood' : Item(status='A '),
+ 'branches/wc-url/ext/sqlite/readme' : Item(status='A '),
+ 'branches/wc-url/ext/B D B\'/copying' : Item(status='A '),
+ 'branches/wc-url/ext/A P R/about' : Item(status='A '),
+
+ ## branches/wc-wc should checkout its externals here
+ })
+ expected_status = svntest.wc.State(wc_dir, {
+ 'branches' : Item(status=' ', wc_rev='6'),
+
+ 'branches/url-url' : Item(status=' ', wc_rev='6'),
+ 'branches/url-url/ext' : Item(status='X '),
+ 'branches/url-url/ext/A P R' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/A P R/about' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/sqlite' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/sqlite/readme' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/wors#+t' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/wors#+t/brood' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/B D B\'' : Item(status=' ', wc_rev='2'),
+ 'branches/url-url/ext/B D B\'/copying' : Item(status=' ', wc_rev='2'),
+
+ 'branches/url-wc' : Item(status=' ', wc_rev='6'),
+ 'branches/url-wc/ext' : Item(status='X '),
+ 'branches/url-wc/ext/wors#+t' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/wors#+t/brood' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/B D B\'' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/B D B\'/copying' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/sqlite' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/sqlite/readme' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/A P R' : Item(status=' ', wc_rev='3'),
+ 'branches/url-wc/ext/A P R/about' : Item(status=' ', wc_rev='3'),
+
+ 'branches/wc-url' : Item(status=' ', wc_rev='6'),
+ 'branches/wc-url/ext' : Item(status='X '),
+ 'branches/wc-url/ext/wors#+t' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/sqlite' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/sqlite/readme' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/B D B\'' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/A P R' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-url/ext/A P R/about' : Item(status=' ', wc_rev='4'),
+
+ 'branches/wc-wc' : Item(status=' ', wc_rev='6'),
+ 'branches/wc-wc/ext' : Item(status='X '),
+ 'branches/wc-wc/ext/wors#+t' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/sqlite' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/sqlite/readme' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/B D B\'' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/A P R' : Item(status=' ', wc_rev='4'),
+ 'branches/wc-wc/ext/A P R/about' : Item(status=' ', wc_rev='4'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir + '/branches', expected_output,
+ None, expected_status)
+
+ # Now let's use our existing setup to perform some copies with dynamic
+ # destinations
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--parents', '--pin-externals',
+ repo_url + '/branches/wc-url',
+ repo_url + '/branches/url-url',
+ trunk_url,
+ branches_url + '/3x-url-url',
+ '-mm')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--parents', '--pin-externals',
+ repo_url + '/branches/wc-url',
+ repo_url + '/branches/url-url',
+ trunk_url,
+ sbox.ospath('branches/3x-url-wc'))
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--parents', '--pin-externals',
+ sbox.ospath('branches/wc-url'),
+ sbox.ospath('branches/url-url'),
+ sbox.ospath('trunk'),
+ branches_url + '/3x-wc-url',
+ '-mm')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', '--parents', '--pin-externals',
+ sbox.ospath('branches/wc-url'),
+ sbox.ospath('branches/url-url'),
+ sbox.ospath('trunk'),
+ sbox.ospath('branches/3x-wc-wc'))
+
+def nested_notification(sbox):
+ "notification for nested externals"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ repo_dir = sbox.repo_dir
+
+ sbox.simple_mkdir('D1')
+ sbox.simple_mkdir('D2')
+ sbox.simple_mkdir('D3')
+ sbox.simple_mkdir('D4')
+ sbox.simple_propset('svn:externals', '^/D2 X', 'D1')
+ sbox.simple_propset('svn:externals', '^/D3 X', 'D2')
+ sbox.simple_propset('svn:externals', '^/D4 X', 'D3')
+ sbox.simple_commit()
+ expected_output = [
+ 'Updating \'' + sbox.ospath('D1') + '\':\n',
+ '\n',
+ 'Fetching external item into \'' + sbox.ospath('D1/X') + '\':\n',
+ ' U ' + sbox.ospath('D1/X') + '\n',
+ '\n',
+ 'Fetching external item into \'' + sbox.ospath('D1/X/X') + '\':\n',
+ ' U ' + sbox.ospath('D1/X/X') + '\n',
+ '\n',
+ 'Fetching external item into \'' + sbox.ospath('D1/X/X/X') + '\':\n',
+ 'Updated external to revision 2.\n',
+ '\n',
+ 'External at revision 2.\n',
+ '\n',
+ 'External at revision 2.\n',
+ '\n',
+ 'At revision 2.\n'
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'update', sbox.ospath('D1'))
+
+def file_external_to_normal_file(sbox):
+ "change a file external to a normal file"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ sbox.simple_propset('svn:externals', '^/iota iota', 'A')
+ sbox.simple_commit()
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'A/iota' : Item(status=' ', wc_rev='2', switched='X'),
+ })
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/iota' : Item(status='A '),
+ })
+
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+ # Create second working copy in this state
+ sbox2 = sbox.clone_dependent(copy_wc=True)
+
+ sbox.simple_propdel('svn:externals', 'A')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/iota' : Item(verb='Removed external'),
+ })
+ expected_status.remove('A/iota')
+ expected_status.tweak('A', status=' M')
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+ sbox.simple_copy('iota', 'A/iota')
+ sbox.simple_commit()
+
+ expected_output = svntest.wc.State(wc_dir, {
+ })
+ expected_status.tweak(wc_rev=3)
+ expected_status.tweak('A', status=' ')
+ expected_status.add({
+ # This case used to triggered a switched status in 1.8.x before this
+ # test (and the fix for this problem) where added.
+ 'A/iota' : Item(status=' ', wc_rev='3'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+
+ wc_dir = sbox2.wc_dir
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(status=' U'),
+ 'A/iota' : Item(verb='Removed external', prev_verb='Skipped'),
+ })
+ # This reports an obstruction and removes the file external
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+ expected_status.add({
+ 'A/iota' : Item(status=' ', wc_rev='3'),
+ })
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/iota' : Item(status='A '),
+ })
+ # This should bring in the new file
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+@Issue(4580)
+def file_external_recorded_info(sbox):
+ "check file external recorded info"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # r2 - Create file external
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', '',
+ 'propset', 'svn:externals',
+ '^/iota i', '')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ '' : Item(status=' U'),
+ 'i' : Item(status='A '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'i' : Item(status=' ', wc_rev='2', switched='X')
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status, [], False,
+ '-r', 2, wc_dir)
+
+ expected_infos = [{
+ 'Path': re.escape(sbox.ospath('i')),
+ 'Relative URL': re.escape('^/iota'),
+ 'Revision': '2',
+ 'Last Changed Rev': '1',
+ 'Last Changed Author': 'jrandom'
+ }]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('i'))
+
+ # r3 - No-op change
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', '',
+ 'cp', '1', 'iota', 'iotb')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'iotb' : Item(status='A '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+ expected_status.add({
+ 'i' : Item(status=' ', wc_rev='3', switched='X'),
+ 'iotb' : Item(status=' ', wc_rev='3')
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status, [], False,
+ '-r', 3, wc_dir)
+
+ expected_infos = [{
+ 'Path': re.escape(sbox.ospath('i')),
+ 'Relative URL': re.escape('^/iota'),
+ 'Revision': '3',
+ 'Last Changed Rev': '1',
+ 'Last Changed Author': 'jrandom'
+ }]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('i'))
+
+ # r4 - Update url
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', '',
+ 'propset', 'svn:externals',
+ '^/iotb i', '')
+
+
+ expected_output = svntest.wc.State(wc_dir, {
+ '' : Item(status=' U'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 4)
+ expected_status.add({
+ 'i' : Item(status=' ', wc_rev='4', switched='X'),
+ 'iotb' : Item(status=' ', wc_rev='4')
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status, [], False,
+ '-r', 4, wc_dir)
+
+ expected_infos = [{
+ 'Path': re.escape(sbox.ospath('i')),
+ 'Relative URL': re.escape('^/iotb'),
+ 'Revision': '4',
+ 'Last Changed Rev': '3',
+ 'Last Changed Author': 'jrandom'
+ }]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('i'))
+
+ # r5 - Replace file
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', '',
+ 'rm', 'iotb',
+ 'cp', '3', 'A/mu', 'iotb')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'i' : Item(status='U '),
+ 'iotb' : Item(status='A ', prev_status='D '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 5)
+ expected_status.add({
+ 'i' : Item(status=' ', wc_rev='5', switched='X'),
+ 'iotb' : Item(status=' ', wc_rev='5')
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status, [], False,
+ '-r', 5, wc_dir)
+
+ expected_infos = [{
+ 'Path': re.escape(sbox.ospath('i')),
+ 'Relative URL': re.escape('^/iotb'),
+ 'Revision': '5',
+ 'Last Changed Rev': '5',
+ 'Last Changed Author': 'jrandom'
+ }]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('i'))
+
+ # Back to r2. But with a conflict
+ sbox.simple_append('i', 'i')
+ expected_output = svntest.wc.State(wc_dir, {
+ '' : Item(status=' U'),
+ 'iotb' : Item(status='D '),
+ 'i' : Item(status='C '),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'i' : Item(status='C ', wc_rev='5', switched='X'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status, [], False,
+ '-r', 2, wc_dir)
+
+ expected_infos = [{
+ 'Path': re.escape(sbox.ospath('i')),
+ 'Relative URL': re.escape('^/iota'),
+ 'Revision': '5',
+ 'Last Changed Rev': '1',
+ 'Last Changed Author': 'jrandom',
+ 'Conflict Details': re.escape('incoming file edit upon switch'
+ ' Source left: (file) ^/iotb@5'
+ ' Source right: (file) ^/iota@5')
+ }]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('i'))
+
+def external_externally_removed(sbox):
+ "external externally removed"
+
+ sbox.build(read_only = True)
+
+ sbox.simple_propset('svn:externals', '^/A/B B', '')
+
+ # Try fetching the external with a versioned obstruction
+ sbox.simple_mkdir('B')
+ expected_err = ".*W155035: The external.*B' is already a versioned path"
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'up', sbox.wc_dir)
+ sbox.simple_rm('B')
+
+
+ os.makedirs(sbox.ospath('B'))
+ expected_err2 = "svn: warning: W155007:.*B'"
+ svntest.actions.run_and_verify_svn(None, expected_err2,
+ 'up', sbox.wc_dir)
+ os.rmdir(sbox.ospath('B'))
+
+ # Fetch the external
+ sbox.simple_update()
+
+ svntest.main.safe_rmtree(sbox.ospath('B'))
+ sbox.simple_update() # Fetched again
+ if not os.path.isdir(sbox.ospath('B')):
+ raise svntest.Failure("B not recreated")
+
+ svntest.main.safe_rmtree(sbox.ospath('B'))
+ sbox.simple_propdel('svn:externals', '')
+
+ expected_output = [
+ "Updating '%s':\n" % sbox.wc_dir,
+ "Removed external '%s'\n" % sbox.ospath('B'),
+ "Updated to revision 1.\n"
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'up', sbox.wc_dir)
+
+
+ sbox.simple_propset('svn:externals', '^/A/B B', '')
+ sbox.simple_update()
+ svntest.main.safe_rmtree(sbox.ospath('B'))
+ sbox.simple_mkdir('B')
+
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'up', sbox.wc_dir)
+
+ sbox.simple_propdel('svn:externals', '')
+ sbox.simple_update() # Should succeed
+
########################################################################
# Run the tests
@@ -3387,8 +4407,28 @@ test_list = [ None,
pinned_externals,
update_dir_external_shallow,
switch_parent_relative_file_external,
+ file_external_unversioned_obstruction,
+ file_external_versioned_obstruction,
+ update_external_peg_rev,
update_deletes_file_external,
switch_relative_externals,
+ copy_file_external_to_repo,
+ replace_tree_with_foreign_external,
+ copy_pin_externals_repos_repos,
+ copy_pin_externals_repos_wc,
+ copy_pin_externals_wc_repos,
+ copy_pin_externals_wc_wc,
+ copy_pin_externals_moved_external,
+ copy_pin_externals_removed_in_head,
+ copy_pin_externals_from_old_rev,
+ copy_pin_externals_wc_local_mods,
+ copy_pin_externals_wc_switched_subtrees,
+ copy_pin_externals_wc_mixed_revisions,
+ copy_pin_externals_whitepace_dir,
+ nested_notification,
+ file_external_to_normal_file,
+ file_external_recorded_info,
+ external_externally_removed,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/getopt_tests.py b/subversion/tests/cmdline/getopt_tests.py
index a258c6b..f4e6398 100755
--- a/subversion/tests/cmdline/getopt_tests.py
+++ b/subversion/tests/cmdline/getopt_tests.py
@@ -74,6 +74,15 @@ del_lines_res = [
re.compile(r" - with Cyrus SASL authentication"),
re.compile(r" - using serf \d+\.\d+\.\d+"),
re.compile(r"\* fs_(base|fs) :"),
+
+ # Remove 'svn --version' list of platform-specific
+ # auth cache providers.
+ re.compile(r"\* Wincrypt cache.*"),
+ re.compile(r"\* Plaintext cache.*"),
+ re.compile(r"\* Gnome Keyring"),
+ re.compile(r"\* GPG-Agent"),
+ re.compile(r"\* Mac OS X Keychain"),
+ re.compile(r"\* KWallet \(KDE\)"),
]
# This is a list of lines to search and replace text on.
@@ -90,13 +99,6 @@ rep_lines_res = [
# In 'svn --version --quiet', we print only the version
# number in a single line.
(re.compile(r'^\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?$'), 'X.Y.Z\n'),
- # 'svn --help' has a line with the version number.
- # It can vary, for example:
- # "Subversion command-line client, version 1.1.0."
- # "Subversion command-line client, version 1.1.0-dev."
- (re.compile(r'Subversion command-line client, '
- 'version \d+\.\d+\.\d+(.|-[a-zA-Z0-9]+\.)$'),
- 'Subversion command-line client, version X.Y.Z.'),
]
# This is a trigger pattern that selects the secondary set of
@@ -221,6 +223,18 @@ def getopt_help_bogus_cmd(sbox):
"run svn help bogus-cmd"
run_one_test(sbox, 'svn_help_bogus-cmd', 'help', 'bogus-cmd')
+def getopt_config_option(sbox):
+ "--config-option's spell checking"
+ sbox.build(create_wc=False, read_only=True)
+ expected_stderr = '.*W205000.*did you mean.*'
+ expected_stdout = svntest.verify.AnyOutput
+ svntest.actions.run_and_verify_svn2(expected_stdout, expected_stderr, 0,
+ 'info',
+ '--config-option',
+ 'config:miscellanous:diff-extensions=' +
+ '-u -p',
+ sbox.repo_url)
+
########################################################################
# Run the tests
@@ -235,6 +249,7 @@ test_list = [ None,
getopt_help,
getopt_help_bogus_cmd,
getopt_help_log_switch,
+ getopt_config_option,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout b/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout
index 0cd234d..06e5e03 100644
--- a/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout
+++ b/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout
@@ -1,5 +1,5 @@
usage: svn <subcommand> [options] [args]
-Subversion command-line client, version X.Y.Z.
+Subversion command-line client.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
or 'svn --version --quiet' to see just the version number.
@@ -10,6 +10,7 @@ command, it recurses on the current directory (inclusive) by default.
Available subcommands:
add
+ auth
blame (praise, annotate, ann)
cat
changelist (cl)
diff --git a/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout b/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
index ab183ee..bb30055 100644
--- a/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
+++ b/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
@@ -1,5 +1,5 @@
-svn, version 1.8.0-dev (under development)
- compiled Sep 10 2012, 14:00:24 on i386-apple-darwin11.4.0
+svn, version 1.9.0-dev (under development)
+ compiled Feb 26 2014, 15:15:42 on x86_64-unknown-openbsd5.5
Copyright (C) 2012 The Apache Software Foundation.
This software consists of contributions made by many people;
@@ -14,9 +14,16 @@ The following repository access (RA) modules are available:
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
+ - using serf 1.3.3
- handles 'http' scheme
- handles 'https' scheme
+The following authentication credential caches are available:
+
+* Plaintext cache in /home/stsp/.subversion
+* Gnome Keyring
+* GPG-Agent
+
System information:
* running on i386-apple-darwin11.4.0
diff --git a/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout b/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout
index 346f218..513ec11 100644
--- a/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout
+++ b/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout
@@ -1,18 +1,26 @@
-svn, version 0.16.0 (r3987)
- compiled Dec 5 2002, 00:02:51
+svn, version 1.9.0-dev (under development)
+ compiled Feb 26 2014, 15:15:42 on x86_64-unknown-openbsd5.5
-Copyright (C) 2010 The Apache Software Foundation.
+Copyright (C) 2014 The Apache Software Foundation.
This software consists of contributions made by many people;
see the NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository access (RA) modules are available:
-* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
- - handles 'http' scheme
- - handles 'https' scheme
-* ra_local : Module for accessing a repository on local disk.
- - handles 'file' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
+ - with Cyrus SASL authentication
- handles 'svn' scheme
+* ra_local : Module for accessing a repository on local disk.
+ - handles 'file' scheme
+* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
+ - using serf 1.3.3
+ - handles 'http' scheme
+ - handles 'https' scheme
+
+The following authentication credential caches are available:
+
+* Plaintext cache in /home/stsp/.subversion
+* Gnome Keyring
+* GPG-Agent
diff --git a/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout b/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
index 59b92aa..4d06339 100644
--- a/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
+++ b/subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
@@ -82,11 +82,11 @@ Valid options:
'BASE' base rev of item's working copy
'COMMITTED' last commit at or before BASE
'PREV' revision just before COMMITTED
- -q [--quiet] : print nothing, or only summary information
- -v [--verbose] : print extra information
+ -c [--change] ARG : the change made in revision ARG
+ -q [--quiet] : do not print the log message
+ -v [--verbose] : also print all affected paths
-g [--use-merge-history] : use/display additional information from merge
history
- -c [--change] ARG : the change made in revision ARG
--targets ARG : pass contents of file ARG as additional args
--stop-on-copy : do not cross copies while traversing history
--incremental : give output suitable for concatenation
@@ -108,21 +108,29 @@ Valid options:
amount of white space
-w, --ignore-all-space: Ignore all white space
--ignore-eol-style: Ignore changes in EOL style
+ -U ARG, --context ARG: Show ARG lines of context
-p, --show-c-function: Show C function name
--search ARG : use ARG as search pattern (glob syntax)
--search-and ARG : combine ARG with the previous search pattern
Global options:
--username ARG : specify a username ARG
- --password ARG : specify a password ARG
+ --password ARG : specify a password ARG (caution: on many operating
+ systems, other users will be able to see this)
--no-auth-cache : do not cache authentication tokens
--non-interactive : do no interactive prompting (default is to prompt
only if standard input is a terminal device)
--force-interactive : do interactive prompting even if standard input
is not a terminal device
- --trust-server-cert : accept SSL server certificates from unknown
- certificate authorities without prompting (but only
- with '--non-interactive')
+ --trust-server-cert : deprecated; same as
+ --trust-server-cert-failures=unknown-ca
+ --trust-server-cert-failures ARG : with --non-interactive, accept SSL server
+ certificates with failures; ARG is comma-separated
+ list of 'unknown-ca' (Unknown Authority),
+ 'cn-mismatch' (Hostname mismatch), 'expired'
+ (Expired certificate), 'not-yet-valid' (Not yet
+ valid certificate) and 'other' (all other not
+ separately classified certificate errors).
--config-dir ARG : read user configuration files from directory ARG
--config-option ARG : set user configuration option in the format:
FILE:SECTION:OPTION=[VALUE]
@@ -188,7 +196,7 @@ Valid options:
--relocate : relocate via URL-rewriting
--ignore-externals : ignore externals definitions
--ignore-ancestry : allow switching to a node with no common ancestor
- --force : force operation to run
+ --force : handle unversioned obstructions as changes
--accept ARG : specify automatic conflict resolution action
('postpone', 'working', 'base', 'mine-conflict',
'theirs-conflict', 'mine-full', 'theirs-full',
@@ -197,15 +205,22 @@ Valid options:
Global options:
--username ARG : specify a username ARG
- --password ARG : specify a password ARG
+ --password ARG : specify a password ARG (caution: on many operating
+ systems, other users will be able to see this)
--no-auth-cache : do not cache authentication tokens
--non-interactive : do no interactive prompting (default is to prompt
only if standard input is a terminal device)
--force-interactive : do interactive prompting even if standard input
is not a terminal device
- --trust-server-cert : accept SSL server certificates from unknown
- certificate authorities without prompting (but only
- with '--non-interactive')
+ --trust-server-cert : deprecated; same as
+ --trust-server-cert-failures=unknown-ca
+ --trust-server-cert-failures ARG : with --non-interactive, accept SSL server
+ certificates with failures; ARG is comma-separated
+ list of 'unknown-ca' (Unknown Authority),
+ 'cn-mismatch' (Hostname mismatch), 'expired'
+ (Expired certificate), 'not-yet-valid' (Not yet
+ valid certificate) and 'other' (all other not
+ separately classified certificate errors).
--config-dir ARG : read user configuration files from directory ARG
--config-option ARG : set user configuration option in the format:
FILE:SECTION:OPTION=[VALUE]
diff --git a/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout b/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout
index 0cd234d..06e5e03 100644
--- a/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout
+++ b/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout
@@ -1,5 +1,5 @@
usage: svn <subcommand> [options] [args]
-Subversion command-line client, version X.Y.Z.
+Subversion command-line client.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
or 'svn --version --quiet' to see just the version number.
@@ -10,6 +10,7 @@ command, it recurses on the current directory (inclusive) by default.
Available subcommands:
add
+ auth
blame (praise, annotate, ann)
cat
changelist (cl)
diff --git a/subversion/tests/cmdline/history_tests.py b/subversion/tests/cmdline/history_tests.py
index 8fd9c2c..31588e2 100755
--- a/subversion/tests/cmdline/history_tests.py
+++ b/subversion/tests/cmdline/history_tests.py
@@ -70,16 +70,13 @@ def cat_traces_renames(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# rename pi to rho. commit r3.
svntest.main.run_svn(None, 'mv', pi_path, rho_path)
# svn cat -r1 rho --> should show pi's contents.
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'pi'.\n"], [],
+ svntest.actions.run_and_verify_svn([ "This is the file 'pi'.\n"], [],
'cat', '-r', '1', rho_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -94,9 +91,7 @@ def cat_traces_renames(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# update whole wc to HEAD
expected_output = svntest.wc.State(wc_dir, { }) # no output
@@ -115,28 +110,24 @@ def cat_traces_renames(sbox):
expected_status)
# 'svn cat bloo' --> should show rho's contents.
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'rho'.\n"], [],
+ svntest.actions.run_and_verify_svn([ "This is the file 'rho'.\n"], [],
'cat', bloo_path)
# svn cat -r1 bloo --> should still show rho's contents.
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'rho'.\n"], [],
+ svntest.actions.run_and_verify_svn([ "This is the file 'rho'.\n"], [],
'cat', '-r', '1', bloo_path)
# svn cat -r1 rho --> should show pi's contents.
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'pi'.\n"], [],
+ svntest.actions.run_and_verify_svn([ "This is the file 'pi'.\n"], [],
'cat', '-r', '1', rho_path)
# svn up -r1
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r', '1', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r', '1', wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# svn cat -rHEAD rho --> should see 'unrelated object' error.
- svntest.actions.run_and_verify_svn("unrelated object",
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cat', '-r', 'HEAD', rho_path)
@Issue(1970)
@@ -189,26 +180,23 @@ def cat_avoids_false_identities(sbox):
svntest.main.run_svn(None, 'del', iota_path)
svntest.main.file_append(iota_path, "YOU SHOULD NOT SEE THIS\n")
svntest.main.run_svn(None, 'add', iota_path)
- svntest.main.run_svn(None, 'ci', '-m', 'log msg',
- wc_dir)
+ sbox.simple_commit(message='log msg')
svntest.main.run_svn(None, 'up', wc_dir)
# r3
svntest.main.run_svn(None, 'del', iota_path)
- svntest.main.run_svn(None, 'ci', '-m', 'log msg',
- wc_dir)
+ sbox.simple_commit(message='log msg')
svntest.main.run_svn(None, 'up', wc_dir)
# r4
svntest.main.run_svn(None, 'cp', iota_url + '@1', wc_dir)
- svntest.main.run_svn(None, 'ci', '-m', 'log msg',
- wc_dir)
+ sbox.simple_commit(message='log msg')
svntest.main.run_svn(None, 'up', wc_dir)
# 'svn cat -r2 iota' should error, because the line of history
# currently identified by /iota did not exist in r2, even though a
# totally unrelated file of the same name did.
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'cat', '-r', '2', iota_path)
diff --git a/subversion/tests/cmdline/import_tests.py b/subversion/tests/cmdline/import_tests.py
index 7adf4a8..0d1ccad 100755
--- a/subversion/tests/cmdline/import_tests.py
+++ b/subversion/tests/cmdline/import_tests.py
@@ -79,7 +79,7 @@ def import_executable(sbox):
# import new files into repository
url = sbox.repo_url
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'import',
+ None, [], 'import',
'-m', 'Log message for new import', xt_path, url)
lastline = output.pop().strip()
@@ -126,8 +126,7 @@ def import_executable(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
def import_ignores(sbox):
@@ -158,7 +157,7 @@ def import_ignores(sbox):
url = sbox.repo_url + '/dir'
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'import',
+ None, [], 'import',
'-m', 'Log message for new import',
dir_path, url)
@@ -197,8 +196,7 @@ def import_ignores(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
def import_no_ignores(sbox):
@@ -225,7 +223,7 @@ def import_no_ignores(sbox):
url = sbox.repo_url + '/dir'
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'import',
+ None, [], 'import',
'-m', 'Log message for new import', '--no-ignore',
dir_path, url)
@@ -272,8 +270,7 @@ def import_no_ignores(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
def import_avoid_empty_revision(sbox):
"avoid creating empty revisions with import"
@@ -286,15 +283,14 @@ def import_avoid_empty_revision(sbox):
os.makedirs(empty_dir)
url = sbox.repo_url
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'-m', 'Log message for new import',
empty_dir, url)
svntest.main.safe_rmtree(empty_dir)
# Verify that an empty revision has not been created
- svntest.actions.run_and_verify_svn(None,
- exp_noop_up_out(1),
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(1),
[], "update",
empty_dir)
#----------------------------------------------------------------------
@@ -333,7 +329,7 @@ enable-auto-props = yes
os.mkdir(imp_dir_path, 0755)
svntest.main.file_write(imp_file_path, "This is file test.dsp.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'-m', 'Log message for new import',
imp_dir_path,
sbox.repo_url,
@@ -371,7 +367,7 @@ enable-auto-props = yes
"+Extra line" + crlf
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'diff',
file_path,
'--config-dir', config_dir)
@@ -389,7 +385,7 @@ enable-auto-props = yes
"The third line.\r")
# The import should succeed and not error out
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'-m', 'Log message for new import',
imp_dir_path,
sbox.repo_url,
@@ -407,7 +403,7 @@ def import_into_foreign_repo(sbox):
svntest.main.safe_rmtree(other_repo_dir, 1)
svntest.main.create_repos(other_repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'-m', 'Log message for new import',
sbox.ospath('A/mu'), other_repo_url + '/f')
@@ -478,7 +474,7 @@ def import_inherited_ignores(sbox):
# global-ignores config. Lastly, ^/A/B/E should not get any *.foo paths
# because of the svn:ignore property on ^/A/B/E, but non-immediate children
# of ^/A/B/E are permitted *.foo paths.
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'--config-dir', config_dir,
import_tree_dir,
sbox.repo_url + '/A/B/E',
@@ -493,13 +489,13 @@ def import_inherited_ignores(sbox):
'A ' + os.path.join(E_path, dir7_path) + '\n',
'A ' + os.path.join(E_path, file7_path) + '\n',
'Updated to revision 3.\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'up', wc_dir)
# Import the tree to ^/A/B/E/Z. The only difference from above is that
# DIR3.foo and its child file2.txt are also imported. Why? Because now
# we are creating a new directory in ^/A/B/E, so the svn:ignore property
# set on ^/A/B/E doesn't apply.
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'--config-dir', config_dir,
import_tree_dir,
sbox.repo_url + '/A/B/E/Z',
@@ -517,12 +513,12 @@ def import_inherited_ignores(sbox):
'A ' + os.path.join(Z_path, dir3_path) + '\n',
'A ' + os.path.join(Z_path, file2_path) + '\n',
'Updated to revision 4.\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'up', wc_dir)
# Import the tree to ^/A/B/F with the --no-ignore option.
# No ignores should be considered and the whole tree should
# be imported.
- svntest.actions.run_and_verify_svn(None, None, [], 'import',
+ svntest.actions.run_and_verify_svn(None, [], 'import',
'--config-dir', config_dir,
'--no-ignore', import_tree_dir,
sbox.repo_url + '/A/B/F',
@@ -546,12 +542,12 @@ def import_inherited_ignores(sbox):
'A ' + os.path.join(F_path, file7_path) + '\n',
'A ' + os.path.join(F_path, dir8_path) + '\n',
'Updated to revision 5.\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'up', wc_dir)
# Try importing a single file into a directory which has svn:ignore set
# on it with a matching pattern of the imported file. The import should
# be a no-op.
- svntest.actions.run_and_verify_svn(None, [], [], 'import',
+ svntest.actions.run_and_verify_svn([], [], 'import',
'--config-dir', config_dir,
os.path.join(import_tree_dir,
'DIR6', 'file6.foo'),
@@ -560,7 +556,7 @@ def import_inherited_ignores(sbox):
# Try the above, but this time with --no-ignore, this time the import
# should succeed.
- svntest.actions.run_and_verify_svn(None, None, [], 'import', '--no-ignore',
+ svntest.actions.run_and_verify_svn(None, [], 'import', '--no-ignore',
'--config-dir', config_dir,
os.path.join(import_tree_dir,
'DIR6', 'file6.foo'),
@@ -570,7 +566,7 @@ def import_inherited_ignores(sbox):
["Updating '" + wc_dir + "':\n",
'A ' + os.path.join(E_path, 'file6.foo') + '\n',
'Updated to revision 6.\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'up', wc_dir)
#----------------------------------------------------------------------
diff --git a/subversion/tests/cmdline/info_tests.py b/subversion/tests/cmdline/info_tests.py
index 8feaf46..187cd7f 100755
--- a/subversion/tests/cmdline/info_tests.py
+++ b/subversion/tests/cmdline/info_tests.py
@@ -180,7 +180,7 @@ def info_with_tree_conflicts(sbox):
svntest.actions.run_and_verify_info([expected_info], path)
# check XML info
- exit_code, output, error = svntest.actions.run_and_verify_svn(None, None,
+ exit_code, output, error = svntest.actions.run_and_verify_svn(None,
[], 'info',
path,
'--xml')
@@ -208,7 +208,7 @@ def info_with_tree_conflicts(sbox):
def info_on_added_file(sbox):
"""info on added file"""
- svntest.actions.make_repo_and_wc(sbox)
+ sbox.build()
wc_dir = sbox.wc_dir
# create new file
@@ -233,7 +233,7 @@ def info_on_added_file(sbox):
svntest.actions.run_and_verify_info([expected], new_file)
# check XML info
- exit_code, output, error = svntest.actions.run_and_verify_svn(None, None,
+ exit_code, output, error = svntest.actions.run_and_verify_svn(None,
[], 'info',
new_file,
'--xml')
@@ -251,7 +251,7 @@ def info_on_added_file(sbox):
def info_on_mkdir(sbox):
"""info on new dir with mkdir"""
- svntest.actions.make_repo_and_wc(sbox)
+ sbox.build()
wc_dir = sbox.wc_dir
# create a new directory using svn mkdir
@@ -273,7 +273,7 @@ def info_on_mkdir(sbox):
svntest.actions.run_and_verify_info([expected], new_dir)
# check XML info
- exit_code, output, error = svntest.actions.run_and_verify_svn(None, None,
+ exit_code, output, error = svntest.actions.run_and_verify_svn(None,
[], 'info',
new_dir,
'--xml')
@@ -351,7 +351,7 @@ def info_multiple_targets(sbox):
non_existent_path = os.path.join(wc_dir, 'non-existent')
# All targets are existing
- svntest.actions.run_and_verify_svn2(None, None, [],
+ svntest.actions.run_and_verify_svn2(None, [],
0, 'info', alpha, beta)
# One non-existing target
@@ -374,7 +374,7 @@ def info_multiple_targets(sbox):
non_existent_url = sbox.repo_url + '/non-existent'
# All targets are existing
- svntest.actions.run_and_verify_svn2(None, None, [],
+ svntest.actions.run_and_verify_svn2(None, [],
0, 'info', alpha, beta)
# One non-existing target
@@ -483,12 +483,12 @@ def info_show_exclude(sbox):
expected_error = 'svn: E200009: Could not display info for all targets.*'
# Expect error on iota (status = not-present)
- svntest.actions.run_and_verify_svn(None, [], expected_error, 'info', iota)
+ svntest.actions.run_and_verify_svn([], expected_error, 'info', iota)
sbox.simple_update()
# Expect error on iota (unversioned)
- svntest.actions.run_and_verify_svn(None, [], expected_error, 'info', iota)
+ svntest.actions.run_and_verify_svn([], expected_error, 'info', iota)
@Issue(3998)
def binary_tree_conflict(sbox):
@@ -516,7 +516,7 @@ def binary_tree_conflict(sbox):
})
svntest.actions.run_and_verify_update(iota,
expected_output, None, expected_status,
- None, None, None, None, None, False,
+ [], False,
iota, '-r', '2')
expected_info = [{
@@ -558,7 +558,7 @@ def relpath_escaping(sbox):
# Also test the local path (to help resolving the relative path) and an
# unescaped path which the client should automatically encode
- svntest.actions.run_and_verify_svn(None, None, [], 'info',
+ svntest.actions.run_and_verify_svn(None, [], 'info',
info[0]['Relative URL'],
info[0]['URL'],
testpath,
@@ -591,6 +591,162 @@ def relpath_escaping(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None, None)
+def node_hidden_info(sbox):
+ "fetch svn info on 'hidden' nodes"
+
+ sbox.build()
+
+ sbox.simple_rm('A/B/E/alpha')
+ sbox.simple_commit()
+ svntest.actions.run_and_verify_svn(None, [],
+ 'up', '--set-depth', 'exclude',
+ sbox.ospath('A/B/E/beta'))
+
+ sbox.simple_copy('A/B/E', 'E')
+
+ # Running info on BASE not-present fails
+ expected_err = '.*(E|W)155010: The node \'.*alpha\' was not found.*'
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'info', sbox.ospath('A/B/E/alpha'))
+
+ expected_info = [
+ {
+ 'Path': re.escape(sbox.ospath('A/B/E/beta')),
+ 'Schedule': 'normal',
+ 'Depth': 'exclude',
+ 'Node Kind': 'file',
+ },
+ {
+ 'Path': re.escape(sbox.ospath('E/alpha')),
+ 'Schedule': 'delete',
+ 'Depth': 'exclude',
+ 'Node Kind': 'unknown',
+ },
+ {
+ 'Path': re.escape(sbox.ospath('E/beta')),
+ 'Schedule': 'normal',
+ 'Depth': 'exclude',
+ 'Node Kind': 'file',
+ }
+ ]
+
+ svntest.actions.run_and_verify_info(expected_info,
+ sbox.ospath('A/B/E/beta'),
+ sbox.ospath('E/alpha'),
+ sbox.ospath('E/beta'))
+
+
+def info_item_simple(sbox):
+ "show one info item"
+
+ sbox.build(read_only=True)
+ svntest.actions.run_and_verify_svn(
+ ['1'], [],
+ 'info', '--show-item=revision', '--no-newline',
+ sbox.ospath(''))
+
+
+def info_item_simple_multiple(sbox):
+ "show one info item with multiple targets"
+
+ sbox.build(read_only=True)
+
+ svntest.actions.run_and_verify_svn(
+ r'^jrandom\s+\S+(/|\\)info_tests-\d+((/|\\)[^/\\]+)?$', [],
+ 'info', '--show-item=last-changed-author',
+ '--depth=immediates', sbox.ospath(''))
+
+ svntest.actions.run_and_verify_svn(
+ r'^1\s+\S+(/|\\)info_tests-\d+(/|\\)[^/\\]+$', [],
+ 'info', '--show-item=last-changed-revision',
+ sbox.ospath('A'), sbox.ospath('iota'))
+
+
+def info_item_url(sbox):
+ "show one info item with URL targets"
+
+ sbox.build(create_wc=False, read_only=True)
+
+ svntest.actions.run_and_verify_svn(
+ '1', [],
+ 'info', '--show-item=last-changed-revision',
+ sbox.repo_url)
+
+
+ svntest.actions.run_and_verify_svn(
+ r'^1\s+[^/:]+://.+/repos/[^/]+$', [],
+ 'info', '--show-item=last-changed-revision',
+ sbox.repo_url + '/A', sbox.repo_url + '/iota')
+
+
+ # Empty working copy root on URL targets
+ svntest.actions.run_and_verify_svn(
+ '', [],
+ 'info', '--show-item=wc-root',
+ sbox.repo_url)
+
+
+def info_item_uncommmitted(sbox):
+ "show one info item on uncommitted targets"
+
+ sbox.build()
+
+ svntest.main.file_write(sbox.ospath('newfile'), 'newfile')
+ sbox.simple_add('newfile')
+ sbox.simple_mkdir('newdir')
+
+ svntest.actions.run_and_verify_svn(
+ '', [],
+ 'info', '--show-item=last-changed-revision',
+ sbox.ospath('newfile'))
+
+ svntest.actions.run_and_verify_svn(
+ '', [],
+ 'info', '--show-item=last-changed-author',
+ sbox.ospath('newdir'))
+
+ svntest.actions.run_and_verify_svn(
+ r'\s+\S+(/|\\)new(file|dir)', [],
+ 'info', '--show-item=last-changed-date',
+ sbox.ospath('newfile'), sbox.ospath('newdir'))
+
+ svntest.actions.run_and_verify_svn(
+ r'\^/new(file|dir)\s+\S+(/|\\)new(file|dir)', [],
+ 'info', '--show-item=relative-url',
+ sbox.ospath('newfile'), sbox.ospath('newdir'))
+
+
+def info_item_failures(sbox):
+ "failure modes of 'svn info --show-item'"
+
+ sbox.build(read_only=True)
+
+ svntest.actions.run_and_verify_svn(
+ None, r'.*E200009:.*',
+ 'info', '--show-item=revision',
+ sbox.ospath('not-there'))
+
+ svntest.actions.run_and_verify_svn(
+ None, r".*E205000: .*; did you mean 'wc-root'\?",
+ 'info', '--show-item=root',
+ sbox.ospath(''))
+
+ svntest.actions.run_and_verify_svn(
+ None, (r".*E205000: --show-item is not valid in --xml mode"),
+ 'info', '--show-item=revision', '--xml',
+ sbox.ospath(''))
+
+ svntest.actions.run_and_verify_svn(
+ None, (r".*E205000: --incremental is only valid in --xml mode"),
+ 'info', '--show-item=revision', '--incremental',
+ sbox.ospath(''))
+
+ svntest.actions.run_and_verify_svn(
+ None, (r".*E205000: --no-newline is only available.*"),
+ 'info', '--show-item=revision', '--no-newline',
+ sbox.ospath('A'), sbox.ospath('iota'))
+
+
########################################################################
# Run the tests
@@ -606,6 +762,12 @@ test_list = [ None,
info_show_exclude,
binary_tree_conflict,
relpath_escaping,
+ node_hidden_info,
+ info_item_simple,
+ info_item_simple_multiple,
+ info_item_url,
+ info_item_uncommmitted,
+ info_item_failures,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/input_validation_tests.py b/subversion/tests/cmdline/input_validation_tests.py
index a454ac9..e1d74a6 100755
--- a/subversion/tests/cmdline/input_validation_tests.py
+++ b/subversion/tests/cmdline/input_validation_tests.py
@@ -52,7 +52,7 @@ def run_and_verify_svn_in_wc(sbox, expected_stderr, *varargs):
old_dir = os.getcwd()
try:
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [], expected_stderr,
+ svntest.actions.run_and_verify_svn([], expected_stderr,
*varargs)
finally:
os.chdir(old_dir)
@@ -266,31 +266,31 @@ def delete_repos_root(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, sbox.ospath('A/D/G'),
repo_url,
None, None, expected_status,
- None, None, None, None, None, None,
+ [], False,
'--set-depth', 'empty', '--ignore-ancestry')
expected_status.tweak('A/B/F', switched='S')
svntest.actions.run_and_verify_switch(sbox.wc_dir, sbox.ospath('A/B/F'),
repo_url,
None, None, expected_status,
- None, None, None, None, None, None,
+ [], False,
'--depth', 'empty', '--ignore-ancestry')
# Delete the wcroot (which happens to be the repository root)
expected_error = 'svn: E155035: \'.*\' is the root of a working copy ' + \
'and cannot be deleted'
- svntest.actions.run_and_verify_svn('Delete root', [], expected_error,
+ svntest.actions.run_and_verify_svn([], expected_error,
'rm', wc_dir)
# This should produce some error, because we can never commit this
expected_error = '.*repository root.*'
- svntest.actions.run_and_verify_svn('Move root', None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'mv', sbox.ospath('A/D/G'),
sbox.ospath('Z'))
# And this currently fails with another nasty error about a wc-lock
expected_error = '.*repository root.*'
- svntest.actions.run_and_verify_svn('Delete root', [], expected_error,
+ svntest.actions.run_and_verify_svn([], expected_error,
'rm', sbox.ospath('A/B/F'))
########################################################################
diff --git a/subversion/tests/cmdline/iprop_authz_tests.py b/subversion/tests/cmdline/iprop_authz_tests.py
index e306373..835cd37 100755
--- a/subversion/tests/cmdline/iprop_authz_tests.py
+++ b/subversion/tests/cmdline/iprop_authz_tests.py
@@ -110,7 +110,7 @@ def iprops_authz(sbox):
else:
expected_err = ".*svn: E170001: Authorization failed.*"
svntest.actions.run_and_verify_svn(
- None, None, expected_err, 'proplist', '-v',
+ None, expected_err, 'proplist', '-v',
'--show-inherited-props', sbox.repo_url + '/A/D/H/psi')
########################################################################
diff --git a/subversion/tests/cmdline/iprop_tests.py b/subversion/tests/cmdline/iprop_tests.py
index cc57e59..bff8a38 100755
--- a/subversion/tests/cmdline/iprop_tests.py
+++ b/subversion/tests/cmdline/iprop_tests.py
@@ -160,7 +160,7 @@ def iprops_basic_working(sbox):
psi_path, expected_iprops, expected_explicit_props)
# Proplist file target with only explicit props.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', wc_dir)
expected_iprops = {}
expected_explicit_props = {'FileProp1' : 'File-Prop-Val1'}
svntest.actions.run_and_verify_inherited_prop_xml(
@@ -184,7 +184,7 @@ def iprops_basic_repos(sbox):
svntest.main.run_svn(None, 'commit', '-m', 'Add some file properties',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
sbox.simple_propset('RootProp1', 'Root-Prop-Val1', '.')
sbox.simple_propset('RootProp2', 'Root-Prop-Val2', '.')
sbox.simple_propset('DirProp2', 'Dir-Prop-Val-Root', '.')
@@ -317,7 +317,7 @@ def iprops_switched_subtrees(sbox):
sbox.repo_url + '/branch2', '-m', 'Make branch2')
# Create a root property and two branch properties
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
sbox.simple_propset('Root-Prop-1', 'Root-Prop-Val1', '.')
sbox.simple_propset('Branch-Name', 'Feature #1', 'branch1')
sbox.simple_propset('Branch-Name', 'Feature #2', 'branch2')
@@ -348,7 +348,7 @@ def iprops_switched_subtrees(sbox):
# which does inherit properties from ^/branch1 and ^/. The inherited
# properties cache should be updated to reflect this when asking what
# properties branch2/B/lambda inherits.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_iprops = {
sbox.repo_url : {'Root-Prop-1' : 'Root-Prop-Val1'},
sbox.repo_url + '/branch1' : {'Branch-Name' : 'Feature #1'}}
@@ -359,20 +359,20 @@ def iprops_switched_subtrees(sbox):
# Now update the WC back to r3, where there are no properties. The
# inheritable properties cache for the WC-root at branch2/B should be
# cleared and no inheritable properties found for branch2/B/lambda.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r3', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r3', wc_dir)
expected_iprops = {}
expected_explicit_props = {}
svntest.actions.run_and_verify_inherited_prop_xml(
branch2_lambda_path, expected_iprops, expected_explicit_props)
# Update back to HEAD=r4 before continuing.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Now unswitch branch2/B and check branch2/B/lambda's inherited props.
# Now no iprop cache for branch2/B should exist and branch2/B/lambda
# should inherit from branch2 and '.'.
svntest.main.run_svn(None, 'switch', sbox.repo_url + '/branch2/B',
branch2_B_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_iprops = {
### Working copy parents! ###
wc_dir : {'Root-Prop-1' : 'Root-Prop-Val1'},
@@ -893,8 +893,8 @@ def iprops_pegged_wc_targets(sbox):
# Inherited props should always come from the repository parent of
# ^/A/B/E/alpha and so should not include the property (working or
# otherwise) on A/D.
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', G_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'delete', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.repo_url + '/A/B', G_path)
# Operation | Target | Peg Revision | Operative Revision
@@ -1138,11 +1138,11 @@ def iprops_pegged_wc_targets(sbox):
# Revert the replacement with history of A/D/G and once again
# replace A/D/G, but this time without history (using and export
# of A/B.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', G_path, '-R')
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', G_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'export',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', G_path, '-R')
+ svntest.actions.run_and_verify_svn(None, [], 'delete', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'export',
sbox.repo_url + '/A/B', G_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', G_path)
# Set a working prop on a file within the replaced tree, we should *never*
# see this property if asking about the
# file@[HEAD | PREV | COMMITTED | BASE]
@@ -1156,21 +1156,21 @@ def iprops_pegged_wc_targets(sbox):
#
# proplist/propget WC-PATH@HEAD
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*Unknown node kind for '" + sbox.repo_url + "/A/D/G/E/alpha'\n",
'pl', '-v', '--show-inherited-props', replaced_alpha_path + '@HEAD')
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*'" + sbox.repo_url + "/A/D/G/E/alpha' does not exist in revision 3\n",
'pg', 'RootProp1', '-v', '--show-inherited-props',
replaced_alpha_path + '@HEAD')
# proplist/propget WC-PATH@PREV
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*Path '.*alpha' has no committed revision\n",
'pl', '-v', '--show-inherited-props', replaced_alpha_path + '@PREV')
svntest.actions.run_and_verify_svn(
- None, None,
+ None,
".*Path '.*alpha' has no committed revision\n",
'pg', 'RootProp1', '-v', '--show-inherited-props', replaced_alpha_path + '@PREV')
# proplist/propget WC-PATH@COMMITTED
@@ -1421,7 +1421,7 @@ def iprops_shallow_operative_depths(sbox):
# r2 - Create a branch..
svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
sbox.repo_url + '/branch1', '-m', 'Make branch1')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# r3 - Create a root property and some branch properties
sbox.simple_propset('Root-Prop-1', 'Root-Prop-Val1', '.')
@@ -1437,7 +1437,7 @@ def iprops_shallow_operative_depths(sbox):
svntest.main.run_svn(None, 'commit', '-m', 'Change some properties',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Switch the WC to ^/branch1:
svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
@@ -1449,7 +1449,7 @@ def iprops_shallow_operative_depths(sbox):
svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/mu',
sbox.ospath('mu'))
# Update the whole WC back to r3.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r3', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r3', wc_dir)
# Check the inherited props on B/E within the switched subtree
# and the switched file mu. The props should all be inherited
@@ -1467,7 +1467,7 @@ def iprops_shallow_operative_depths(sbox):
# Again check the inherited props on B/E. This shouldn't affect the
# switched subtree at all, the props it inherits should still reflect
# the values at r3.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--depth=empty', wc_dir)
svntest.actions.run_and_verify_inherited_prop_xml(
sbox.ospath('B/E'), expected_iprops, expected_explicit_props)
@@ -1476,7 +1476,7 @@ def iprops_shallow_operative_depths(sbox):
# Update the root of the WC (to HEAD=r4) at depth=files. B/E should
# still inherit vales from r3, but mu should now inherit props from r4.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--depth=files', wc_dir)
svntest.actions.run_and_verify_inherited_prop_xml(
sbox.ospath('B/E'), expected_iprops, expected_explicit_props)
@@ -1489,7 +1489,7 @@ def iprops_shallow_operative_depths(sbox):
# Update the root of the WC (to HEAD=r4) at depth=immediates. Now both B/E
# and mu inherit props from r4.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--depth=immediates', wc_dir)
svntest.actions.run_and_verify_inherited_prop_xml(
sbox.ospath('B/E'), expected_iprops, expected_explicit_props)
@@ -1509,7 +1509,7 @@ def iprops_with_directory_externals(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path("other")
other_wc_dir = sbox.add_wc_path("other")
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'co', other_repo_url,
+ svntest.actions.run_and_verify_svn(None, [], 'co', other_repo_url,
other_wc_dir)
# Create a root property on the first WC.
@@ -1518,7 +1518,7 @@ def iprops_with_directory_externals(sbox):
wc_dir)
# Create a root property on the "other" WC.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'Other-Root-Prop',
+ svntest.actions.run_and_verify_svn(None, [], 'ps', 'Other-Root-Prop',
'Root-Prop-Val-from-other', other_wc_dir)
svntest.main.run_svn(None, 'commit', '-m', 'Add a root property',
other_wc_dir)
@@ -1533,20 +1533,20 @@ def iprops_with_directory_externals(sbox):
sbox.simple_propset('svn:externals',
other_repo_url + '/A/D/G X-Other-Repos',
'E')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Add external point to other WC',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Create an external in the first WC that points to a location in the
# same WC.
sbox.simple_propset('svn:externals',
sbox.repo_url + '/A/D/H X-Same-Repos',
'F')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Add external pointing to same repos',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Check the properties inherited by the external from the same repository.
# It should inherit the props from the root of the same repository.
@@ -1590,9 +1590,9 @@ def iprops_with_file_externals(sbox):
sbox.simple_propset('svn:externals',
sbox.repo_url + '/A/D/H/psi@4 file-external-pegged',
'A/B/F')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Add a file external', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Check the properties inherited by the external files. Both should
# inherit the properties from ^/ and ^/A/D.
@@ -1622,7 +1622,7 @@ def iprops_with_file_externals(sbox):
expected_explicit_props)
# ...We update the external:
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# The pegged file external's iprops should remain unchanged.
svntest.actions.run_and_verify_inherited_prop_xml(
sbox.ospath('A/B/F/file-external-pegged'), expected_iprops,
diff --git a/subversion/tests/libsvn_subr/named_atomic-test-proc.c b/subversion/tests/cmdline/lock-helper.c
index 534247c..47a333c 100644
--- a/subversion/tests/libsvn_subr/named_atomic-test-proc.c
+++ b/subversion/tests/cmdline/lock-helper.c
@@ -1,5 +1,5 @@
/*
- * named_atomic-test-proc.c: a collection of svn_named_atomic__t tests
+ * lock-helper.c : create locks with an expiry date
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -21,66 +21,55 @@
* ====================================================================
*/
-/* ====================================================================
- To add tests, look toward the bottom of this file.
-*/
+#include <stdlib.h>
-
-#include <stdio.h>
+#include "svn_pools.h"
+#include "svn_dirent_uri.h"
+#include "svn_fs.h"
-/* shared test implementation */
-#include "named_atomic-test-common.h"
-
-/* Very simple process frame around the actual test code */
int
main(int argc, const char *argv[])
{
- svn_boolean_t got_error = FALSE;
apr_pool_t *pool;
- svn_error_t *err;
+ const char *fs_path, *file_path, *username;
+ apr_int64_t seconds;
+ apr_time_t expiration_date;
+ svn_fs_t *fs;
+ svn_fs_access_t *access;
+ svn_lock_t *lock;
- int id = 0;
- int count = 0;
- int iterations = 0;
+ if (argc != 5)
+ {
+ fprintf(stderr, "usage: lock-helper repo_path file_path user seconds\n");
+ exit(1);
+ }
- /* Initialize APR (Apache pools) */
if (apr_initialize() != APR_SUCCESS)
{
- printf("apr_initialize() failed.\n");
+ fprintf(stderr, "apr_initialize() failed.\n");
exit(1);
}
pool = svn_pool_create(NULL);
- /* lean & mean parameter parsing */
- if (argc != 5)
- {
- if (argc == 1) /* used to test that this executable can be started */
- exit(0);
-
- printf("Usage: named_atomic-proc-test ID COUNT ITERATIONS NS.\n");
- exit(1);
- }
+ fs_path = svn_dirent_internal_style(argv[1], pool);
+ fs_path = svn_dirent_join(fs_path, "db", pool);
+ file_path = svn_dirent_canonicalize(argv[2], pool);
+ username = argv[3];
+ SVN_INT_ERR(svn_cstring_atoi64(&seconds, argv[4]));
- id = (int)apr_atoi64(argv[1]);
- count = (int)apr_atoi64(argv[2]);
- iterations = (int)apr_atoi64(argv[3]);
- name_namespace = argv[4];
+ SVN_INT_ERR(svn_fs_open2(&fs, fs_path, NULL, pool, pool));
+ SVN_INT_ERR(svn_fs_create_access(&access, username, pool));
+ SVN_INT_ERR(svn_fs_set_access(fs, access));
- /* run test routine */
+ expiration_date = apr_time_now() + apr_time_from_sec(seconds);
- err = test_pipeline(id, count, iterations, pool);
- if (err)
- {
- const char *prefix = apr_psprintf(pool, "Process %d: ", id);
- got_error = TRUE;
- svn_handle_error2(err, stdout, FALSE, prefix);
- svn_error_clear(err);
- }
+ SVN_INT_ERR(svn_fs_lock(&lock, fs, file_path, NULL, "created by lock-helper",
+ FALSE, expiration_date, SVN_INVALID_REVNUM, FALSE,
+ pool));
- /* Clean up APR */
svn_pool_destroy(pool);
apr_terminate();
- return got_error;
+ return EXIT_SUCCESS;
}
diff --git a/subversion/tests/cmdline/lock_tests.py b/subversion/tests/cmdline/lock_tests.py
index aaca991..c27a4f4 100755
--- a/subversion/tests/cmdline/lock_tests.py
+++ b/subversion/tests/cmdline/lock_tests.py
@@ -87,7 +87,7 @@ def lock_file(sbox):
svntest.main.file_append(file_path, "This represents a binary file\n")
svntest.main.run_svn(None, 'commit',
'-m', '', file_path)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_path)
# --- Meanwhile, in our other working copy... ---
@@ -135,7 +135,7 @@ def commit_file_keep_lock(sbox):
wc_dir = sbox.wc_dir
# lock 'A/mu' as wc_author
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'some lock comment',
sbox.ospath('A/mu'))
@@ -158,21 +158,25 @@ def commit_file_unlock(sbox):
wc_dir = sbox.wc_dir
# lock A/mu and iota as wc_author
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'some lock comment',
sbox.ospath('A/mu'),
sbox.ospath('iota'))
# make a change and commit it, allowing lock to be released
sbox.simple_append('A/mu', 'Tweak!\n')
- sbox.simple_commit()
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/mu' : Item(verb='Sending'),
+ })
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
- expected_status.tweak('iota', wc_rev=2)
- # Make sure the file is unlocked
- svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ # Make sure both iota an mu are unlocked, but only mu is bumped
+ svntest.actions.run_and_verify_commit(wc_dir,
+ expected_output,
+ expected_status)
#----------------------------------------------------------------------
def commit_propchange(sbox):
@@ -182,7 +186,7 @@ def commit_propchange(sbox):
wc_dir = sbox.wc_dir
# lock A/mu as wc_author
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'some lock comment',
sbox.ospath('A/mu'))
@@ -220,7 +224,7 @@ def break_lock(sbox):
file_path = sbox.ospath('iota')
file_path_b = sbox.ospath('iota', wc_dir=wc_b)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_path)
# --- Meanwhile, in our other working copy... ---
@@ -230,11 +234,11 @@ def break_lock(sbox):
# attempt (and fail) to unlock file
# This should give a "iota' is not locked in this working copy" error
- svntest.actions.run_and_verify_svn(None, None, ".*not locked",
+ svntest.actions.run_and_verify_svn(None, ".*not locked",
'unlock',
file_path_b)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [],
+ svntest.actions.run_and_verify_svn(".*unlocked", [],
'unlock', '--force',
file_path_b)
@@ -262,7 +266,7 @@ def steal_lock(sbox):
file_path = sbox.ospath('iota')
file_path_b = sbox.ospath('iota', wc_dir=wc_b)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_path)
# --- Meanwhile, in our other working copy... ---
@@ -271,13 +275,13 @@ def steal_lock(sbox):
# attempt (and fail) to lock file
- # This should give a "iota' is already locked... error, but exits 0.
- svntest.actions.run_and_verify_svn2(None, None,
- ".*already locked", 0,
- 'lock',
- '-m', 'trying to break', file_path_b)
+ # This should give a "iota' is already locked error
+ svntest.actions.run_and_verify_svn(None,
+ ".*already locked",
+ 'lock',
+ '-m', 'trying to break', file_path_b)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [],
+ svntest.actions.run_and_verify_svn(".*locked by user", [],
'lock', '--force',
'-m', 'trying to break', file_path_b)
@@ -307,7 +311,7 @@ def handle_defunct_lock(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
# lock the file
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', sbox.ospath('iota'))
# Make a second copy of the working copy
@@ -318,7 +322,7 @@ def handle_defunct_lock(sbox):
# --- Meanwhile, in our other working copy... ---
# Try unlocking the file in the second wc.
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
file_path_b)
@@ -370,7 +374,7 @@ def enforce_lock(sbox):
raise svntest.Failure
# obtain a lock on one of these files...
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', iota_path)
# ...and verify that the write bit gets set...
@@ -379,7 +383,7 @@ def enforce_lock(sbox):
raise svntest.Failure
# ...and unlock it...
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
iota_path)
# ...and verify that the write bit gets unset
@@ -408,7 +412,7 @@ def update_while_needing_lock(sbox):
sbox.simple_update()
# Lock, modify, commit, unlock, to create r3.
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', sbox.ospath('iota'))
sbox.simple_append('iota', 'This line added in r2.\n')
sbox.simple_commit('iota') # auto-unlocks
@@ -447,12 +451,12 @@ def defunct_lock(sbox):
svntest.main.run_svn(None, 'update', wc_b)
# lock iota in wc_b
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', iota_path_b)
# break the lock iota in wc a
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock', '--force',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock', '--force',
'-m', '', iota_path)
# update wc_b
svntest.main.run_svn(None, 'update', wc_b)
@@ -476,16 +480,16 @@ def deleted_path_lock(sbox):
iota_path = sbox.ospath('iota')
iota_url = sbox.repo_url + '/iota'
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', iota_path)
sbox.simple_rm('iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'--no-unlock',
'-m', '', iota_path)
# Now make sure that we can delete the lock from iota via a URL
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
iota_url)
@@ -505,14 +509,14 @@ def lock_unlock(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau', writelocked='K')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', pi_path, rho_path, tau_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
expected_status.tweak('A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau', writelocked=None)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
pi_path, rho_path, tau_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -529,11 +533,11 @@ def deleted_dir_lock(sbox):
rho_path = sbox.ospath('A/D/G/rho')
tau_path = sbox.ospath('A/D/G/tau')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', pi_path, rho_path, tau_path)
sbox.simple_rm('A/D/G') # the parent directory
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'--no-unlock',
'-m', '', sbox.ospath('A/D/G'))
@@ -699,11 +703,11 @@ def out_of_date(sbox):
'-m', '', file_path)
# --- Meanwhile, in our other working copy... ---
- svntest.actions.run_and_verify_svn2(None, None,
- ".*newer version of '/iota' exists", 0,
- 'lock',
- '--username', svntest.main.wc_author2,
- '-m', '', file_path_b)
+ svntest.actions.run_and_verify_svn(None,
+ ".*newer version of '/iota' exists",
+ 'lock',
+ '--username', svntest.main.wc_author2,
+ '-m', '', file_path_b)
#----------------------------------------------------------------------
# Tests reverting a svn:needs-lock file
@@ -718,11 +722,11 @@ def revert_lock(sbox):
mode = stat.S_IWGRP | stat.S_IWOTH | stat.S_IWRITE
# set the prop in wc
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:needs-lock', 'foo', iota_path)
# commit r2
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', '', iota_path)
# make sure that iota got set to read-only
@@ -737,7 +741,7 @@ def revert_lock(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# remove read-only-ness
- svntest.actions.run_and_verify_svn(None, None, [], 'propdel',
+ svntest.actions.run_and_verify_svn(None, [], 'propdel',
'svn:needs-lock', iota_path)
# make sure that iota got read-only-ness removed
@@ -747,7 +751,7 @@ def revert_lock(sbox):
raise svntest.Failure
# revert the change
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', iota_path)
# make sure that iota got set back to read-only
if (os.stat(iota_path)[0] & mode):
@@ -760,7 +764,7 @@ def revert_lock(sbox):
extra_name = 'xx'
# now lock the file
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', iota_path)
# modify it
@@ -772,7 +776,7 @@ def revert_lock(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# revert it
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', iota_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', iota_path)
# make sure it is still writable since we have the lock
if (os.stat(iota_path)[0] & mode == 0):
@@ -809,7 +813,7 @@ def lock_several_files(sbox):
lambda_path = os.path.join(sbox.wc_dir, 'A', 'B', 'lambda')
alpha_path = os.path.join(sbox.wc_dir, 'A', 'B', 'E', 'alpha')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'--username', svntest.main.wc_author2,
'-m', 'lock several',
iota_path, lambda_path, alpha_path)
@@ -818,7 +822,7 @@ def lock_several_files(sbox):
expected_status.tweak('iota', 'A/B/lambda', 'A/B/E/alpha', writelocked='K')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
'--username', svntest.main.wc_author2,
iota_path, lambda_path, alpha_path)
@@ -837,10 +841,10 @@ def lock_switched_files(sbox):
iota_URL = sbox.repo_url + '/iota'
alpha_URL = sbox.repo_url + '/A/B/E/alpha'
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
iota_URL, gamma_path,
'--ignore-ancestry')
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
alpha_URL, lambda_path,
'--ignore-ancestry')
@@ -848,7 +852,7 @@ def lock_switched_files(sbox):
expected_status.tweak('A/D/gamma', 'A/B/lambda', switched='S')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'lock several',
gamma_path, lambda_path)
@@ -859,7 +863,7 @@ def lock_switched_files(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
gamma_path, lambda_path)
expected_status.tweak('A/D/gamma', 'A/B/lambda', writelocked=None)
@@ -877,7 +881,7 @@ def lock_uri_encoded(sbox):
file_path = sbox.ospath(fname)
svntest.main.file_append(file_path, "This represents a binary file\n")
- svntest.actions.run_and_verify_svn(None, None, [], "add", file_path)
+ svntest.actions.run_and_verify_svn(None, [], "add", file_path)
expected_output = svntest.wc.State(wc_dir, {
fname : Item(verb='Adding'),
@@ -890,17 +894,17 @@ def lock_uri_encoded(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
file_path)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_path)
# Make sure that the file was locked.
expected_status.tweak(fname, writelocked='K')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
file_path)
# Make sure it was successfully unlocked again.
@@ -909,14 +913,14 @@ def lock_uri_encoded(sbox):
# And now the URL case.
file_url = sbox.repo_url + '/' + fname
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_url)
# Make sure that the file was locked.
expected_status.tweak(fname, writelocked='O')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
file_url)
# Make sure it was successfully unlocked again.
@@ -941,15 +945,15 @@ def lock_and_exebit1(sbox):
gamma_path = sbox.ospath('A/D/gamma')
expected_err = ".*svn: warning: W125005: To turn off the svn:needs-lock property,.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 0,
'ps', 'svn:needs-lock', ' ', gamma_path)
expected_err = ".*svn: warning: W125005: To turn off the svn:executable property,.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 0,
'ps', 'svn:executable', ' ', gamma_path)
# commit
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', '', gamma_path)
# mode should be +r, -w, +x
gamma_stat = os.stat(gamma_path)[0]
@@ -961,7 +965,7 @@ def lock_and_exebit1(sbox):
raise svntest.Failure
# lock
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', gamma_path)
# mode should be +r, +w, +x
gamma_stat = os.stat(gamma_path)[0]
@@ -976,7 +980,7 @@ def lock_and_exebit1(sbox):
svntest.main.file_append(gamma_path, "check stat output after mod & unlock")
# unlock
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
gamma_path)
# Mode should be +r, -w, +x
@@ -989,7 +993,7 @@ def lock_and_exebit1(sbox):
raise svntest.Failure
# ci
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', '', gamma_path)
# Mode should be still +r, -w, +x
@@ -1018,15 +1022,15 @@ def lock_and_exebit2(sbox):
gamma_path = sbox.ospath('A/D/gamma')
expected_err = ".*svn: warning: W125005: To turn off the svn:needs-lock property,.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 0,
'ps', 'svn:needs-lock', ' ', gamma_path)
expected_err = ".*svn: warning: W125005: To turn off the svn:executable property,.*"
- svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+ svntest.actions.run_and_verify_svn2(None, expected_err, 0,
'ps', 'svn:executable', ' ', gamma_path)
# commit
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', '', gamma_path)
# mode should be +r, -w, +x
gamma_stat = os.stat(gamma_path)[0]
@@ -1038,7 +1042,7 @@ def lock_and_exebit2(sbox):
raise svntest.Failure
# lock
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', gamma_path)
# mode should be +r, +w, +x
gamma_stat = os.stat(gamma_path)[0]
@@ -1053,7 +1057,7 @@ def lock_and_exebit2(sbox):
svntest.main.file_append(gamma_path, "check stat output after mod & unlock")
# commit
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', '', gamma_path)
# Mode should be +r, -w, +x
@@ -1079,7 +1083,7 @@ def commit_xml_unsafe_file_unlock(sbox):
'commit', '-m', '', file_path)
# lock fname as wc_author
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'some lock comment', file_path)
# make a change and commit it, allowing lock to be released
@@ -1106,7 +1110,7 @@ def repos_lock_with_info(sbox):
file_url = sbox.repo_url + '/' + fname
# lock wc file
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'--username', svntest.main.wc_author2,
'-m', comment, file_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1114,7 +1118,7 @@ def repos_lock_with_info(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Steal lock on wc file
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'--username', svntest.main.wc_author2,
'--force',
'-m', comment, file_url)
@@ -1149,7 +1153,7 @@ def unlock_already_unlocked_files(sbox):
alpha_path = sbox.ospath('A/B/E/alpha')
gamma_path = sbox.ospath('A/D/gamma')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'--username', svntest.main.wc_author2,
'-m', 'lock several',
iota_path, lambda_path, alpha_path)
@@ -1160,14 +1164,14 @@ def unlock_already_unlocked_files(sbox):
error_msg = ".*Path '/A/B/E/alpha' is already locked by user '" + \
svntest.main.wc_author2 + "'.*"
- svntest.actions.run_and_verify_svn2(None, None, error_msg, 0,
- 'lock',
- '--username', svntest.main.wc_author2,
- alpha_path, gamma_path)
+ svntest.actions.run_and_verify_svn(None, error_msg,
+ 'lock',
+ '--username', svntest.main.wc_author2,
+ alpha_path, gamma_path)
expected_status.tweak('A/D/gamma', writelocked='K')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ".*unlocked", [], 'unlock',
+ svntest.actions.run_and_verify_svn(".*unlocked", [], 'unlock',
'--username', svntest.main.wc_author2,
lambda_path)
@@ -1176,11 +1180,11 @@ def unlock_already_unlocked_files(sbox):
error_msg = "(.*No lock on path '/A/B/lambda'.*)" + \
"|(.*'A/B/lambda' is not locked.*)"
- svntest.actions.run_and_verify_svn2(None, None, error_msg, 0,
- 'unlock',
- '--username', svntest.main.wc_author2,
- '--force',
- iota_path, lambda_path, alpha_path)
+ svntest.actions.run_and_verify_svn(None, error_msg,
+ 'unlock',
+ '--username', svntest.main.wc_author2,
+ '--force',
+ iota_path, lambda_path, alpha_path)
expected_status.tweak('iota', 'A/B/E/alpha', writelocked=None)
@@ -1196,7 +1200,7 @@ def info_moved_path(sbox):
fname2 = sbox.ospath("iota2")
# Move iota, creating r2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"mv", fname, fname2)
expected_output = svntest.wc.State(wc_dir, {
'iota2' : Item(verb='Adding'),
@@ -1209,13 +1213,11 @@ def info_moved_path(sbox):
expected_status.remove("iota")
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Create a new, unrelated iota, creating r3.
svntest.main.file_append(fname, "Another iota")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"add", fname)
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Adding'),
@@ -1225,12 +1227,10 @@ def info_moved_path(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Lock the new iota.
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [],
+ svntest.actions.run_and_verify_svn(".*locked by user", [],
"lock", fname)
expected_status.tweak("iota", writelocked="K")
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1252,10 +1252,10 @@ def ls_url_encoded(sbox):
fname = os.path.join(dirname, "f")
# Create a dir with a space in its name and a file therein.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"mkdir", dirname)
svntest.main.file_append(fname, "someone was here")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"add", fname)
expected_output = svntest.wc.State(wc_dir, {
'space dir' : Item(verb='Adding'),
@@ -1268,19 +1268,16 @@ def ls_url_encoded(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Lock the file.
- svntest.actions.run_and_verify_svn("Lock space dir/f", ".*locked by user",
+ svntest.actions.run_and_verify_svn(".*locked by user",
[], "lock", fname)
# Make sure ls shows it being locked.
expected_output = " +2 " + re.escape(svntest.main.wc_author) + " +O .+f|" \
" +2 " + re.escape(svntest.main.wc_author) + " .+\./"
- svntest.actions.run_and_verify_svn("List space dir",
- expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
"list", "-v", dirname)
#----------------------------------------------------------------------
@@ -1297,20 +1294,19 @@ def unlock_wrong_token(sbox):
file_path = os.path.join(sbox.wc_dir, fname)
file_url = sbox.repo_url + "/iota"
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
file_path)
# Steal the lock as the same author, but using a URL to keep the old token
# in the WC.
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
"--force", file_url)
# Then, unlocking the WC path should fail.
### The error message returned is actually this, but let's worry about that
### another day...
- svntest.actions.run_and_verify_svn2(
- None, None, ".*((No lock on path)|(400 Bad Request))", 0,
- 'unlock', file_path)
+ svntest.actions.run_and_verify_svn(None, ".*(No lock on path)",
+ 'unlock', file_path)
#----------------------------------------------------------------------
# Verify that info shows lock info for locked files with URI-unsafe names
@@ -1325,7 +1321,7 @@ def examine_lock_encoded_recurse(sbox):
file_path = os.path.join(sbox.wc_dir, fname)
svntest.main.file_append(file_path, "This represents a binary file\n")
- svntest.actions.run_and_verify_svn(None, None, [], "add", file_path)
+ svntest.actions.run_and_verify_svn(None, [], "add", file_path)
expected_output = svntest.wc.State(wc_dir, {
fname : Item(verb='Adding'),
@@ -1338,7 +1334,7 @@ def examine_lock_encoded_recurse(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
file_path)
# lock the file and validate the contents
@@ -1358,21 +1354,21 @@ def unlocked_lock_of_other_user(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/pi', writelocked='K')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', pi_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# now try to unlock with user jconstant, should fail but exit 0.
if sbox.repo_url.startswith("http"):
- expected_err = ".*403 Forbidden.*"
+ expected_err = "svn: warning: W160039: .*[Uu]nlock of .*403 Forbidden.*"
else:
expected_err = "svn: warning: W160039: User '%s' is trying to use a lock owned by "\
"'%s'.*" % (svntest.main.wc_author2, svntest.main.wc_author)
- svntest.actions.run_and_verify_svn2(None, [], expected_err, 0,
- 'unlock',
- '--username', svntest.main.wc_author2,
- pi_path)
+ svntest.actions.run_and_verify_svn([], expected_err,
+ 'unlock',
+ '--username', svntest.main.wc_author2,
+ pi_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1390,7 +1386,7 @@ def lock_funky_comment_chars(sbox):
svntest.main.file_append(file_path, "This represents a binary file\n")
svntest.main.run_svn(None, 'commit',
'-m', '', file_path)
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', 'lock & load', file_path)
#----------------------------------------------------------------------
@@ -1407,26 +1403,26 @@ def lock_twice_in_one_wc(sbox):
# Create a needs-lock file
svntest.actions.set_prop('svn:needs-lock', '*', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', wc_dir, '-m', '')
# Mark the file readonly
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
# Switch a second location for the same file in the same working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', sbox.repo_url + '/A',
sbox.ospath('A/B'),
'--ignore-ancestry')
# Lock location 1
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'lock', mu_path, '-m', 'Locked here')
- # Locking in location 2 should fail ### Currently returns exitcode 0
- svntest.actions.run_and_verify_svn2(None, None, ".*is already locked.*", 0,
- 'lock', '-m', '', mu2_path)
+ # Locking in location 2 should fail
+ svntest.actions.run_and_verify_svn(None, ".*is already locked.*",
+ 'lock', '-m', '', mu2_path)
# Change the file anyway
os.chmod(mu2_path, 0700)
@@ -1435,7 +1431,7 @@ def lock_twice_in_one_wc(sbox):
# Commit will just succeed as the DB owns the lock. It's a user decision
# to commit the other target instead of the one originally locked
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', mu2_path, '-m', '')
#----------------------------------------------------------------------
@@ -1454,14 +1450,13 @@ def lock_path_not_in_head(sbox):
# Commit deletion of A/D and A/B/lambda as r2, then update the WC
# back to r1. Then attempt to lock some paths that no longer exist
# in HEAD. These should fail gracefully.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete', lambda_path, D_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Some deletions', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r1', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r1', wc_dir)
expected_lock_fail_err_re = "svn: warning: W160042: " \
- "((Path .* doesn't exist in HEAD revision)" \
- "|(L(ock|OCK) request (on '.*' )?failed: 405 Method Not Allowed))"
+ "(Path .* doesn't exist in HEAD revision)"
# Issue #3524 These lock attemtps were triggering an assert over ra_serf:
#
# working_copies\lock_tests-37>svn lock A\D
@@ -1473,11 +1468,11 @@ def lock_path_not_in_head(sbox):
# ..\..\..\subversion\libsvn_client\ra.c:275: (apr_err=235000)
# svn: In file '..\..\..\subversion\libsvn_ra_serf\util.c' line 1120:
# assertion failed (ctx->status_code)
- svntest.actions.run_and_verify_svn2(None, None, expected_lock_fail_err_re,
- 0, 'lock', lambda_path)
+ svntest.actions.run_and_verify_svn(None, expected_lock_fail_err_re,
+ 'lock', lambda_path)
expected_err = 'svn: E155008: The node \'.*D\' is not a file'
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'lock', D_path)
@@ -1500,7 +1495,7 @@ def verify_path_escaping(sbox):
svntest.main.run_svn(None, 'add', file1, file2, file3)
- svntest.main.run_svn(None, 'ci', '-m', 'commit', wc_dir)
+ sbox.simple_commit(message='commit')
svntest.main.run_svn(None, 'lock', '-m', 'lock 1', file1)
svntest.main.run_svn(None, 'lock', '-m', 'lock 2', sbox.repo_url + '/file%20%232')
@@ -1533,37 +1528,37 @@ def replace_and_propset_locked_path(sbox):
rho_path = sbox.ospath('A/D/G/rho')
# Lock mu and A/D/G/rho.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'lock', mu_path, rho_path,
'-m', 'Locked')
# Now replace and propset on mu.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--keep-local', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'bar', mu_path)
# Commit mu.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', '', mu_path)
# Let's try this again where directories are involved, shall we?
# Replace A/D/G and A/D/G/rho, propset on A/D/G/rho.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', G_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', G_path)
svntest.main.file_append(rho_path, "This is the new file 'rho'.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', rho_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'bar', rho_path)
# And commit G.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', '', G_path)
@@ -1676,15 +1671,15 @@ def block_unlock_if_pre_unlock_hook_fails(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/pi', writelocked='K')
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', pi_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Make sure the unlock operation fails as pre-unlock hook blocks it.
- expected_unlock_fail_err_re = ".*error text|.*500 Internal Server Error"
- svntest.actions.run_and_verify_svn2(None, None, expected_unlock_fail_err_re,
- 1, 'unlock', pi_path)
+ expected_unlock_fail_err_re = ".*error text"
+ svntest.actions.run_and_verify_svn(None, expected_unlock_fail_err_re,
+ 'unlock', pi_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
#----------------------------------------------------------------------
@@ -1703,10 +1698,10 @@ def lock_invalid_token(sbox):
fname = 'iota'
file_path = os.path.join(sbox.wc_dir, fname)
- svntest.actions.run_and_verify_svn2(None, None,
- "svn: warning: W160037: " \
- ".*scheme.*'opaquelocktoken'", 0,
- 'lock', '-m', '', file_path)
+ svntest.actions.run_and_verify_svn(None,
+ "svn: warning: W160037: " \
+ ".*scheme.*'opaquelocktoken'",
+ 'lock', '-m', '', file_path)
@Issue(3105)
def lock_multi_wc(sbox):
@@ -1720,19 +1715,19 @@ def lock_multi_wc(sbox):
wc2_name = os.path.basename(sbox2.wc_dir)
expected_output = svntest.verify.UnorderedOutput([
- '\'%s\' locked by user \'jrandom\'.\n' % os.path.join(wc_name, 'iota'),
- '\'%s\' locked by user \'jrandom\'.\n' % os.path.join(wc2_name, 'A', 'mu'),
+ '\'%s\' locked by user \'jrandom\'.\n' % sbox.ospath('iota'),
+ '\'%s\' locked by user \'jrandom\'.\n' % sbox2.ospath('A/mu'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'lock', sbox.ospath('iota'),
sbox2.ospath('A/mu'))
expected_output = svntest.verify.UnorderedOutput([
- '\'%s\' unlocked.\n' % os.path.join(wc_name, 'iota'),
- '\'%s\' unlocked.\n' % os.path.join(wc2_name, 'A', 'mu'),
+ '\'%s\' unlocked.\n' % sbox.ospath('iota'),
+ '\'%s\' unlocked.\n' % sbox2.ospath('A/mu'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'unlock', sbox.ospath('iota'),
sbox2.ospath('A/mu'))
@@ -1744,7 +1739,7 @@ def locks_stick_over_switch(sbox):
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', sbox.ospath('A'), repo_url + '/AA',
'-m', '')
@@ -1753,7 +1748,7 @@ def locks_stick_over_switch(sbox):
'\'%s\' locked by user \'jrandom\'.\n' % os.path.join('A', 'D', 'H', 'chi'),
'\'%s\' locked by user \'jrandom\'.\n' % os.path.join('A', 'mu'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'lock', sbox.ospath('A/D/H/chi'),
sbox.ospath('A/mu'),
sbox.ospath('iota'))
@@ -1793,7 +1788,7 @@ def lock_unlock_deleted(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.ospath('A/mu'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1801,13 +1796,13 @@ def lock_unlock_deleted(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
expected_output = '\'mu\' locked by user \'jrandom\'.'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'lock', sbox.ospath('A/mu'))
expected_status.tweak('A/mu', writelocked='K')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
expected_output = '\'mu\' unlocked.'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'unlock', sbox.ospath('A/mu'))
expected_status.tweak('A/mu', writelocked=None)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1822,8 +1817,8 @@ def commit_stolen_lock(sbox):
sbox.simple_append('A/mu', 'zig-zag')
sbox.simple_lock('A/mu')
- expected_output = '\'mu\' locked by user \'jrandom\'.'
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ expected_output = '\'.*mu\' locked by user \'jrandom\'.'
+ svntest.actions.run_and_verify_svn(expected_output, [],
'lock', '--force',
sbox.repo_url + '/A/mu')
@@ -1834,11 +1829,10 @@ def commit_stolen_lock(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
[],
expected_status,
- err_re,
- wc_dir)
+ err_re)
-# When removing directories, the locks of contained files were not
-# correctly removed from the working copy database, thus they later
+# When removing directories, the locks of contained files were not
+# correctly removed from the working copy database, thus they later
# magically reappeared when new files or directories with the same
# pathes were added.
@Issue(4364)
@@ -1853,15 +1847,13 @@ def drop_locks_on_parent_deletion(sbox):
sbox.simple_lock('A/B/E/alpha')
sbox.simple_lock('A/B/E/beta')
sbox.simple_rm('A/B')
-
+
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove_subtree('A/B')
-
+
svntest.actions.run_and_verify_commit(wc_dir,
[],
- expected_status,
- None,
- wc_dir)
+ expected_status)
# now re-add entities to the deleted pathes.
sbox.simple_mkdir('A/B')
@@ -1870,32 +1862,231 @@ def drop_locks_on_parent_deletion(sbox):
# The bug also resurrected locks on directories when their path
# matched a former file.
sbox.simple_mkdir('A/B/E', 'A/B/E/alpha')
-
+
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B',
- 'A/B/E',
- 'A/B/E/alpha',
- 'A/B/F',
- 'A/B/lambda',
- wc_rev='3')
+ 'A/B/E',
+ 'A/B/E/alpha',
+ 'A/B/F',
+ 'A/B/lambda',
+ wc_rev='3')
expected_status.remove('A/B/E/beta')
-
+
svntest.actions.run_and_verify_commit(wc_dir,
[],
- expected_status,
- None,
- wc_dir)
-
-
-@SkipUnless(svntest.main.is_ra_type_dav)
+ expected_status)
+
+
+def copy_with_lock(sbox):
+ """copy with lock on source"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ lock_url = sbox.repo_url + '/A/B/E/alpha'
+
+ svntest.actions.run_and_validate_lock(lock_url, svntest.main.wc_author)
+ sbox.simple_copy('A/B/E', 'A/B/E2')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B/E2' : Item(verb='Adding'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/B/E/alpha', writelocked='O')
+ expected_status.add({
+ 'A/B/E2' : Item(status=' ', wc_rev=2),
+ 'A/B/E2/alpha' : Item(status=' ', wc_rev=2),
+ 'A/B/E2/beta' : Item(status=' ', wc_rev=2),
+ })
+
+ # This is really a regression test for httpd: 2.2.25 and 2.4.6, and
+ # earlier, have a bug that causes mod_dav to check for locks on the
+ # copy source and so the commit fails.
+ svntest.actions.run_and_verify_commit(wc_dir,
+ expected_output,
+ expected_status)
+
+def lock_hook_messages(sbox):
+ "verify (un)lock message is transferred correctly"
+
+ sbox.build(create_wc = False)
+ repo_dir = sbox.repo_dir
+
+ iota_url = sbox.repo_url + "/iota"
+ mu_url = sbox.repo_url + "/A/mu"
+
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
+ iota_url)
+
+ error_msg = "Text with <angle brackets> & ampersand"
+ svntest.actions.create_failing_hook(repo_dir, "pre-lock", error_msg)
+ svntest.actions.create_failing_hook(repo_dir, "pre-unlock", error_msg)
+
+ _, _, actual_stderr = svntest.actions.run_and_verify_svn(
+ [], svntest.verify.AnyOutput,
+ 'lock', mu_url)
+ if len(actual_stderr) > 4:
+ actual_stderr = actual_stderr[-4:-2] + actual_stderr[-1:]
+ expected_err = [
+ 'svn: warning: W165001: ' + svntest.actions.hook_failure_message('pre-lock'),
+ error_msg + "\n",
+ "svn: E200009: One or more locks could not be obtained\n",
+ ]
+ svntest.verify.compare_and_display_lines(None, 'STDERR',
+ expected_err, actual_stderr)
+
+
+ _, _, actual_stderr = svntest.actions.run_and_verify_svn(
+ [], svntest.verify.AnyOutput,
+ 'unlock', iota_url)
+ if len(actual_stderr) > 4:
+ actual_stderr = actual_stderr[-4:-2] + actual_stderr[-1:]
+ expected_err = [
+ 'svn: warning: W165001: ' + svntest.actions.hook_failure_message('pre-unlock'),
+ error_msg + "\n",
+ "svn: E200009: One or more locks could not be released\n",
+ ]
+ svntest.verify.compare_and_display_lines(None, 'STDERR',
+ expected_err, actual_stderr)
+
+
+def failing_post_hooks(sbox):
+ "locking with failing post-lock and post-unlock"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ repo_dir = sbox.repo_dir
+
+ svntest.actions.create_failing_hook(repo_dir, "post-lock", "error text")
+ svntest.actions.create_failing_hook(repo_dir, "post-unlock", "error text")
+
+ pi_path = sbox.ospath('A/D/G/pi')
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/D/G/pi', writelocked='K')
+
+ if svntest.main.is_ra_type_dav():
+ expected_lock_err = []
+ expected_unlock_err = '.*svn: E165009: Unlock succeeded.*' #
+ else:
+ expected_unlock_err = expected_lock_err = ".*error text"
+
+ # Failing post-lock doesn't stop lock being created.
+ svntest.actions.run_and_verify_svn("'pi' locked by user",
+ expected_lock_err,
+ 'lock', '-m', '', pi_path)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ expected_status.tweak('A/D/G/pi', writelocked=None)
+
+ # Failing post-unlock doesn't stop lock being removed.
+ svntest.actions.run_and_verify_svn("'pi' unlocked",
+ expected_unlock_err,
+ 'unlock', pi_path)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+def break_delete_add(sbox):
+ "break a lock, delete and add the file"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.run_and_verify_svn(".*locked by user", [],
+ 'lock',
+ '-m', 'some lock comment',
+ sbox.ospath('A/mu'))
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', writelocked='K')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ svntest.actions.run_and_verify_svn(".*unlocked", [],
+ 'unlock', '--force',
+ sbox.repo_url + '/A/mu')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'rm',
+ '-m', 'delete file',
+ sbox.repo_url + '/A/mu')
+
+ # Update removes the locked file and should remove the lock token.
+ sbox.simple_update()
+
+ # Lock token not visible on newly added file.
+ sbox.simple_append('A/mu', 'another mu')
+ sbox.simple_add('A/mu')
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.tweak('A/mu', status='A ', wc_rev='-')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ ### XFAIL Broken lock token now visible in status.
+ sbox.simple_commit()
+ expected_status.tweak('A/mu', status=' ', wc_rev=3)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
def dav_lock_timeout(sbox):
"unlock a lock with timeout"
+ # Locks with timeouts are only created by generic DAV clients but a
+ # Subversion client may need to view or unlock one over any RA
+ # layer.
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.main.run_lock_helper(sbox.repo_dir, 'iota', 'some_user', 999)
+ # Lock should have an expiration date
+ expiration_date = svntest.actions.run_and_parse_info(sbox.repo_url + '/iota')[0]['Lock Expires']
+
+ # Verify that there is a lock, by trying to obtain one
+ svntest.actions.run_and_verify_svn(None, ".*locked by user",
+ 'lock', '-m', '', sbox.ospath('iota'))
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('iota', writelocked='O')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # This used to fail over serf with a parse error of the timeout.
+ expected_err = "svn: warning: W160039:"
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'unlock', sbox.repo_url + '/iota')
+
+ # Force unlock via working copy, this also used to fail over serf.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'unlock', sbox.ospath('iota'), '--force')
+ expected_status.tweak('iota', writelocked=None)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # Lock again
+ svntest.main.run_lock_helper(sbox.repo_dir, 'iota', 'some_user', 999)
+ expected_status.tweak('iota', writelocked='O')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # Force unlock via URL, this also used to fail over serf
+ svntest.actions.run_and_verify_svn(None, [],
+ 'unlock', sbox.repo_url + '/iota',
+ '--force')
+ expected_status.tweak('iota', writelocked=None)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # Lock again
+ svntest.main.run_lock_helper(sbox.repo_dir, 'iota', 'some_user', 999)
+ expected_status.tweak('iota', writelocked='O')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # Force lock via working copy, this also used to fail over serf.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'lock', sbox.ospath('iota'), '--force')
+ expected_status.tweak('iota', writelocked='K')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def create_dav_lock_timeout(sbox):
+ "create generic DAV lock with timeout"
+
import httplib
from urlparse import urlparse
import base64
sbox.build()
+ wc_dir = sbox.wc_dir
loc = urlparse(sbox.repo_url)
if loc.scheme == 'http':
@@ -1924,18 +2115,12 @@ def dav_lock_timeout(sbox):
r = h.getresponse()
- # Verify that there is a lock, by trying to obtain one
- svntest.actions.run_and_verify_svn2(None, None, ".*locked by user", 0,
- 'lock', '-m', '', sbox.ospath('iota'))
-
- # Before this patch this used to fail with a parse error of the timeout
- svntest.actions.run_and_verify_svn2(None, None, ".*W160039.*Unlock.*403", 0,
- 'unlock', sbox.repo_url + '/iota')
-
- svntest.actions.run_and_verify_svn(None, None, [],
- 'unlock', sbox.ospath('iota'), '--force')
-
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('iota', writelocked='O')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ # Lock should have an expiration date
+ expiration_date = svntest.actions.run_and_parse_info(sbox.repo_url + '/iota')[0]['Lock Expires']
def non_root_locks(sbox):
"locks for working copies not at repos root"
@@ -1943,16 +2128,16 @@ def non_root_locks(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', sbox.repo_url, sbox.repo_url + '/X',
'-m', 'copy greek tree')
- sbox.simple_switch(sbox.repo_url + '/X')
+ sbox.simple_switch(sbox.repo_url + '/X')
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Lock a file
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [],
+ svntest.actions.run_and_verify_svn(".*locked by user", [],
'lock', sbox.ospath('A/D/G/pi'),
'-m', '')
expected_status.tweak('A/D/G/pi', writelocked='K')
@@ -1965,7 +2150,7 @@ def non_root_locks(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Break the lock
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'unlock', sbox.repo_url + '/X/A/D/G/pi')
# Subdir update reports the break
@@ -1974,12 +2159,12 @@ def non_root_locks(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Relock and break
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [],
+ svntest.actions.run_and_verify_svn(".*locked by user", [],
'lock', sbox.ospath('A/D/G/pi'),
'-m', '')
expected_status.tweak('A/D/G/pi', writelocked='K')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'unlock', sbox.repo_url + '/X/A/D/G/pi')
# Root update reports the break
@@ -1987,6 +2172,56 @@ def non_root_locks(sbox):
expected_status.tweak('A/D/G/pi', writelocked=None)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
+def many_locks_hooks(sbox):
+ "many locks with hooks"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Prevent locking '/A/D/G/pi'.
+ svntest.main.create_python_hook_script(os.path.join(sbox.repo_dir,
+ 'hooks', 'pre-lock'),
+ 'import sys\n'
+ 'if sys.argv[2] == "/A/D/G/pi":\n'
+ ' sys.exit(1)\n'
+ 'sys.exit(0)\n')
+
+ # Prevent unlocking '/A/mu'.
+ svntest.main.create_python_hook_script(os.path.join(sbox.repo_dir,
+ 'hooks', 'pre-unlock'),
+ 'import sys\n'
+ 'if sys.argv[2] == "/A/mu":\n'
+ ' sys.exit(1)\n'
+ 'sys.exit(0)\n')
+
+ svntest.actions.run_and_verify_svn(".* locked",
+ "svn: warning: W165001: .*",
+ 'lock',
+ sbox.ospath('iota'),
+ sbox.ospath('A/mu'),
+ sbox.ospath('A/B/E/alpha'),
+ sbox.ospath('A/D/G/pi'),
+ sbox.ospath('A/D/G/rho'))
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('iota', 'A/mu', 'A/B/E/alpha', 'A/D/G/rho',
+ writelocked='K')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ svntest.actions.run_and_verify_svn(".* unlocked",
+ "svn: warning: W165001: .*",
+ 'unlock',
+ sbox.ospath('iota'),
+ sbox.ospath('A/mu'),
+ sbox.ospath('A/B/E/alpha'),
+ sbox.ospath('A/D/G/rho'))
+
+ expected_status.tweak('iota', 'A/B/E/alpha', 'A/D/G/rho',
+ writelocked=None)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+
+
@Issue(3515)
@SkipUnless(svntest.main.is_ra_type_dav)
def dav_lock_refresh(sbox):
@@ -1999,7 +2234,7 @@ def dav_lock_refresh(sbox):
sbox.build(create_wc = False)
# Acquire lock on 'iota'
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
sbox.repo_url + '/iota')
# Try to refresh lock using 'If' header
@@ -2033,14 +2268,27 @@ def delete_locked_file_with_percent(sbox):
"lock and delete a file called 'a %( ) .txt'"
sbox.build()
+ wc_dir = sbox.wc_dir
locked_filename = 'a %( ) .txt'
locked_path = sbox.ospath(locked_filename)
svntest.main.file_write(locked_path, "content\n")
sbox.simple_add(locked_filename)
sbox.simple_commit()
-
+
sbox.simple_lock(locked_filename)
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'a %( ) .txt' : Item(status=' ', wc_rev='2', writelocked='K')
+ })
+ expected_infos = [
+ { 'Lock Owner' : 'jrandom' },
+ ]
+ svntest.actions.run_and_verify_info(expected_infos, sbox.path('a %( ) .txt'),
+ '-rHEAD')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
sbox.simple_rm(locked_filename)
# XFAIL: With a 1.8.x client, this commit fails with:
@@ -2049,6 +2297,200 @@ def delete_locked_file_with_percent(sbox):
# Invalid percent encoded URI in tagged If-header [400, #104]
sbox.simple_commit()
+def lock_commit_bump(sbox):
+ "a commit should not bump just locked files"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ sbox.simple_lock('iota')
+
+ changed_file = sbox.ospath('changed')
+ sbox.simple_append('changed', 'Changed!')
+
+ svntest.actions.run_and_verify_svn(None, [], 'unlock', '--force',
+ sbox.repo_url + '/iota')
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url, '-m', 'Q',
+ 'put', changed_file, 'iota')
+
+ sbox.simple_append('A/mu', 'GOAAAAAAAAL!')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/mu' : Item(verb='Sending'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', wc_rev=3)
+
+ svntest.actions.run_and_verify_commit(wc_dir,
+ expected_output,
+ expected_status)
+
+ # We explicitly check both the Revision and Last Changed Revision.
+ expected_infos = [ {
+ 'Revision' : '1' ,
+ 'Last Changed Rev' : '1' ,
+ 'URL' : '.*',
+ 'Lock Token' : None, }
+ ]
+ svntest.actions.run_and_verify_info(expected_infos,
+ sbox.ospath('iota'))
+
+def copy_dir_with_locked_file(sbox):
+ "copy a directory containing a locked file"
+
+ sbox.build()
+ AA_url = sbox.repo_url + '/AA'
+ AA2_url = sbox.repo_url + '/AA2'
+ A_url = sbox.repo_url + '/A'
+ mu_url = A_url + '/mu'
+
+ svntest.main.run_svn(None, 'lock', '-m', 'locked', mu_url)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'cp', A_url, AA_url,
+ '-m', '')
+
+ expected_err = "svn: E160037: .*no matching lock-token available"
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'mv', A_url, AA2_url,
+ '-m', '')
+
+@Issue(4557)
+def delete_dir_with_lots_of_locked_files(sbox):
+ "delete a directory containing lots of locked files"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # A lot of paths.
+ nfiles = 75 # NOTE: test XPASSES with 50 files!!!
+ locked_paths = []
+ for i in range(nfiles):
+ locked_paths.append(sbox.ospath("A/locked_files/file-%i" % i))
+
+ # Create files at these paths
+ os.mkdir(sbox.ospath("A/locked_files"))
+ for file_path in locked_paths:
+ svntest.main.file_write(file_path, "This is '%s'.\n" % (file_path,))
+ sbox.simple_add("A/locked_files")
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # lock all the files
+ svntest.actions.run_and_verify_svn(None, [], 'lock',
+ '-m', 'All locks',
+ *locked_paths)
+ # Locally delete A (regression against earlier versions, which
+ # always used a special non-standard request)
+ sbox.simple_rm("A")
+
+ # Commit the deletion
+ # XFAIL: As of 1.8.10, this commit fails with:
+ # svn: E175002: Unexpected HTTP status 400 'Bad Request' on '<path>'
+ # and the following error in the httpd error log:
+ # request failed: error reading the headers
+ # This problem was introduced on the 1.8.x branch in r1606976.
+ sbox.simple_commit()
+
+def delete_locks_on_depth_commit(sbox):
+ "delete locks on depth-limited commit"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.run_and_verify_svn(None, [], 'lock',
+ '-m', 'All files',
+ *(sbox.ospath(x)
+ for x in ['iota', 'A/B/E/alpha',
+ 'A/B/E/beta', 'A/B/lambda',
+ 'A/D/G/pi', 'A/D/G/rho',
+ 'A/D/G/tau', 'A/D/H/chi',
+ 'A/D/H/omega', 'A/D/H/psi',
+ 'A/D/gamma', 'A/mu']))
+
+ sbox.simple_rm("A")
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(verb='Deleting'),
+ })
+
+ expected_status = svntest.wc.State(wc_dir, {
+ '' : Item(status=' ', wc_rev='1'),
+ 'iota' : Item(status=' ', wc_rev='1'),
+ })
+
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status, [],
+ wc_dir, '--depth', 'immediates')
+
+ sbox.simple_update() # r2
+
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
+ sbox.repo_url + '/A@1', sbox.ospath('A'))
+
+ expected_output = [
+ 'Adding %s\n' % sbox.ospath('A'),
+ 'svn: The depth of this commit is \'immediates\', but copies ' \
+ 'are always performed recursively in the repository.\n',
+ 'Committing transaction...\n',
+ 'Committed revision 3.\n',
+ ]
+
+ # Verifying the warning line... so can't use verify_commit()
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'commit', wc_dir, '--depth', 'immediates',
+ '-mm')
+
+ # Verify that all locks are gone at the server and at the client
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+ expected_status.tweak('', 'iota', wc_rev=2)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+@Issue(4557)
+@XFail(svntest.main.is_ra_type_dav)
+def replace_dir_with_lots_of_locked_files(sbox):
+ "replace directory containing lots of locked files"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # A lot of paths.
+ nfiles = 75 # NOTE: test XPASSES with 50 files!!!
+ locked_paths = []
+ for i in range(nfiles):
+ locked_paths.append(sbox.ospath("A/locked_files/file-%i" % i))
+
+ # Create files at these paths
+ os.mkdir(sbox.ospath("A/locked_files"))
+ for file_path in locked_paths:
+ svntest.main.file_write(file_path, "This is '%s'.\n" % (file_path,))
+ sbox.simple_add("A/locked_files")
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # lock all the files
+ svntest.actions.run_and_verify_svn(None, [], 'lock',
+ '-m', 'All locks',
+ *locked_paths)
+ # Locally delete A (regression against earlier versions, which
+ # always used a special non-standard request)
+ sbox.simple_rm("A")
+
+ # But a further replacement never worked
+ sbox.simple_mkdir("A")
+ # And an additional propset didn't work either
+ # (but doesn't require all lock tokens recursively)
+ sbox.simple_propset("k", "v", "A")
+
+ # Commit the deletion
+ # XFAIL: As of 1.8.10, this commit fails with:
+ # svn: E175002: Unexpected HTTP status 400 'Bad Request' on '<path>'
+ # and the following error in the httpd error log:
+ # request failed: error reading the headers
+ # This problem was introduced on the 1.8.x branch in r1606976.
+ sbox.simple_commit()
+
########################################################################
# Run the tests
@@ -2102,10 +2544,21 @@ test_list = [ None,
lock_unlock_deleted,
commit_stolen_lock,
drop_locks_on_parent_deletion,
+ copy_with_lock,
+ lock_hook_messages,
+ failing_post_hooks,
+ break_delete_add,
dav_lock_timeout,
+ create_dav_lock_timeout,
non_root_locks,
+ many_locks_hooks,
dav_lock_refresh,
delete_locked_file_with_percent,
+ lock_commit_bump,
+ copy_dir_with_locked_file,
+ delete_dir_with_lots_of_locked_files,
+ delete_locks_on_depth_commit,
+ replace_dir_with_lots_of_locked_files,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/log_tests.py b/subversion/tests/cmdline/log_tests.py
index ffcdace..bdb749c 100755
--- a/subversion/tests/cmdline/log_tests.py
+++ b/subversion/tests/cmdline/log_tests.py
@@ -33,8 +33,8 @@ from svntest import wc
from svntest.main import server_has_mergeinfo
from svntest.main import SVN_PROP_MERGEINFO
-from merge_tests import set_up_branch
-from diff_tests import make_diff_header, make_no_diff_deleted_header
+from svntest.mergetrees import set_up_branch
+from svntest.verify import make_diff_header, make_no_diff_deleted_header
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -227,12 +227,7 @@ def merge_history_repos(sbox):
branch_c = os.path.join('branches', 'c')
# Create an empty repository - r0
- svntest.main.safe_rmtree(sbox.repo_dir, 1)
- svntest.main.safe_rmtree(sbox.wc_dir, 1)
- svntest.main.create_repos(sbox.repo_dir)
-
- svntest.actions.run_and_verify_svn(None, None, [], "co", sbox.repo_url,
- sbox.wc_dir)
+ sbox.build(empty=True)
was_cwd = os.getcwd()
os.chdir(sbox.wc_dir)
@@ -407,7 +402,6 @@ def merge_history_repos(sbox):
# Restore working directory
os.chdir(was_cwd)
-
# For errors seen while parsing log data.
class SVNLogParseError(Exception):
pass
@@ -718,6 +712,13 @@ def compare_diff_output(expected_diffs, output):
if diffs.issubset(expected_diffs) and diffs.issuperset(expected_diffs):
return
+ print("=============== DIFFS NOT EQUAL ===================")
+ print("Expected")
+ for line in expected_diffs:
+ print(line)
+ print("Actual:")
+ for line in output:
+ print(line)
raise svntest.Failure("Diffs not equal")
@@ -733,7 +734,7 @@ def plain_log(sbox):
os.chdir(sbox.wc_dir)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log')
log_chain = parse_log_output(output)
@@ -745,10 +746,9 @@ def log_with_empty_repos(sbox):
"'svn log' on an empty repository"
# Create virgin repos
- svntest.main.safe_rmtree(sbox.repo_dir, 1)
- svntest.main.create_repos(sbox.repo_dir)
+ sbox.build(create_wc=False, empty=True)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'log',
sbox.repo_url)
@@ -768,13 +768,13 @@ def log_where_nothing_changed(sbox):
rho_path = os.path.join(sbox.wc_dir, 'A', 'D', 'G', 'rho')
svntest.main.file_append(rho_path, "some new material in rho")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m',
'log msg', rho_path)
# Now run 'svn log -r2' on a directory unaffected by revision 2.
H_path = os.path.join(sbox.wc_dir, 'A', 'D', 'H')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'log', '-r', '2', H_path)
@@ -785,7 +785,7 @@ def log_to_revision_zero(sbox):
# This used to segfault the server.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'log', '-v',
'-r', '1:0', sbox.wc_dir)
@@ -798,7 +798,7 @@ def log_with_path_args(sbox):
os.chdir(sbox.wc_dir)
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'log', sbox.repo_url, 'A/D/G', 'A/D/H')
log_chain = parse_log_output(output)
@@ -827,7 +827,7 @@ def log_wc_with_peg_revision(sbox):
"'svn log wc_target@N'"
guarantee_repos_and_wc(sbox)
my_path = os.path.join(sbox.wc_dir, "A", "B", "E", "beta") + "@8"
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', my_path)
check_log_chain(parse_log_output(output), [1])
@@ -839,7 +839,7 @@ def url_missing_in_head(sbox):
my_url = sbox.repo_url + "/A/B/E/alpha" + "@8"
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', my_url)
check_log_chain(parse_log_output(output), [3, 1])
@@ -870,38 +870,38 @@ def log_through_copyfrom_history(sbox):
svntest.main.file_write(msg_file, msg2)
svntest.main.file_append(mu_path, "2")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-F', msg_file)
svntest.main.file_append(mu2_path, "this is mu2")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', mu2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'add', mu2_path)
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', "Log message for revision 3")
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', mu2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', mu2_path)
svntest.main.file_write(msg_file, msg4)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-F', msg_file)
svntest.main.file_append(mu_path, "5")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', "Log message for revision 5")
svntest.main.file_write(msg_file, msg6)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-r', '5', mu_URL, mu2_URL,
'-F', msg_file)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# The full log for mu2 is relatively unsurprising
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', mu2_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [6, 5, 2, 1])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', mu2_URL)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [6, 5, 2, 1])
@@ -909,25 +909,25 @@ def log_through_copyfrom_history(sbox):
# First "oddity", the full log for mu2 doesn't include r3, but the -r3
# log works!
peg_mu2_path = mu2_path + "@3"
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-r', '3',
peg_mu2_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [3])
peg_mu2_URL = mu2_URL + "@3"
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-r', '3',
peg_mu2_URL)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [3])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-r', '2',
mu2_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [2])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-r', '2',
mu2_URL)
log_chain = parse_log_output(output)
@@ -980,7 +980,7 @@ PROPS-END
# run log
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', URL)
+ None, [], 'log', URL)
# Verify the output contains either the expected fuzzy escape
# sequence, or the literal control char.
@@ -1010,7 +1010,7 @@ def log_xml_empty_date(sbox):
# Ensure that we get a date before we delete the property.
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--xml', '-r1', sbox.wc_dir)
+ None, [], 'log', '--xml', '-r1', sbox.wc_dir)
matched = 0
for line in output:
@@ -1020,12 +1020,12 @@ def log_xml_empty_date(sbox):
raise svntest.Failure("log contains no date element")
# Set the svn:date revprop to the empty string on revision 1.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'pdel', '--revprop', '-r1', 'svn:date',
sbox.wc_dir)
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--xml', '-r1', sbox.wc_dir)
+ None, [], 'log', '--xml', '-r1', sbox.wc_dir)
for line in output:
if date_re.search(line):
@@ -1036,14 +1036,14 @@ def log_limit(sbox):
"svn log --limit"
guarantee_repos_and_wc(sbox)
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log',
'--limit', '2',
sbox.repo_url)
log_chain = parse_log_output(out)
check_log_chain(log_chain, [9, 8])
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log',
'--limit', '2',
sbox.repo_url,
@@ -1052,7 +1052,7 @@ def log_limit(sbox):
check_log_chain(log_chain, [9, 6])
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'log', '--limit', '2', '--revision', '2:HEAD', sbox.repo_url, 'A/B')
log_chain = parse_log_output(out)
@@ -1060,7 +1060,7 @@ def log_limit(sbox):
# Use -l instead of --limit to test both option forms.
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'log', '-l', '2', '--revision', '1', sbox.repo_url, 'A/B')
log_chain = parse_log_output(out)
@@ -1069,11 +1069,11 @@ def log_limit(sbox):
must_be_positive = ".*Argument to --limit must be positive.*"
# error expected when limit <= 0
- svntest.actions.run_and_verify_svn(None, None, must_be_positive,
+ svntest.actions.run_and_verify_svn(None, must_be_positive,
'log', '--limit', '0', '--revision', '1',
sbox.repo_url, 'A/B')
- svntest.actions.run_and_verify_svn(None, None, must_be_positive,
+ svntest.actions.run_and_verify_svn(None, must_be_positive,
'log', '--limit', '-1', '--revision', '1',
sbox.repo_url, 'A/B')
@@ -1083,16 +1083,16 @@ def log_base_peg(sbox):
target = os.path.join(sbox.wc_dir, 'A', 'B', 'E', 'beta') + '@BASE'
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log', target)
log_chain = parse_log_output(out)
check_log_chain(log_chain, [9, 1])
- svntest.actions.run_and_verify_svn(None, None, [], 'update', '-r', '1',
+ svntest.actions.run_and_verify_svn(None, [], 'update', '-r', '1',
sbox.wc_dir)
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log', target)
log_chain = parse_log_output(out)
@@ -1103,7 +1103,7 @@ def log_verbose(sbox):
"run log with verbose output"
guarantee_repos_and_wc(sbox)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-v',
sbox.wc_dir)
@@ -1262,7 +1262,7 @@ def merge_sensitive_log_single_revision(sbox):
}
os.chdir(TRUNK_path)
# First try a single rev using -rN
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'-r14')
@@ -1270,7 +1270,7 @@ def merge_sensitive_log_single_revision(sbox):
log_chain = parse_log_output(output)
check_merge_results(log_chain, expected_merges)
# Then try a single rev using --limit 1
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'--limit', '1',
'-r14:1')
@@ -1285,13 +1285,13 @@ def merge_sensitive_log_single_revision(sbox):
11 : [12],
}
# First try a single rev using -rN
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'-r12',
BRANCH_B_path)
log_chain = parse_log_output(output)
check_merge_results(log_chain, expected_merges)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'--limit', '1',
'-r12:1',
@@ -1311,7 +1311,7 @@ def merge_sensitive_log_branching_revision(sbox):
BRANCH_B_path = os.path.join(wc_dir, "branches", "b")
# Run log on a copying revision
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'-r10',
BRANCH_B_path)
@@ -1333,7 +1333,7 @@ def merge_sensitive_log_non_branching_revision(sbox):
TRUNK_path = os.path.join(sbox.wc_dir, "trunk")
# Run log on a non-copying revision that adds mergeinfo
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'-r6',
TRUNK_path)
@@ -1357,7 +1357,7 @@ def merge_sensitive_log_added_path(sbox):
XI_path = os.path.join(sbox.wc_dir, "trunk", "A", "xi")
# Run log on a non-copying revision that adds mergeinfo
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
XI_path)
@@ -1387,7 +1387,7 @@ def log_single_change(sbox):
guarantee_repos_and_wc(sbox)
repo_url = sbox.repo_url
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-c',
4, repo_url)
log_chain = parse_log_output(output)
@@ -1399,7 +1399,7 @@ def log_changes_range(sbox):
guarantee_repos_and_wc(sbox)
repo_url = sbox.repo_url
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-c',
'2-5', repo_url)
@@ -1412,7 +1412,7 @@ def log_changes_list(sbox):
guarantee_repos_and_wc(sbox)
repo_url = sbox.repo_url
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-c',
'2,5,7',
repo_url)
@@ -1426,7 +1426,7 @@ def log_changes_complex(sbox):
guarantee_repos_and_wc(sbox)
repo_url = sbox.repo_url
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-c',
'2,5-3,-8,6-7', repo_url)
@@ -1474,7 +1474,7 @@ def retrieve_revprops(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
'-m', msg2,
omega_path)
@@ -1482,10 +1482,10 @@ def retrieve_revprops(sbox):
# Set custom property on r1 and r2.
svntest.actions.run_and_verify_svn(
- None, None, [], # message, expected_stdout, expected_stderr
+ None, [], # message, expected_stdout, expected_stderr
'ps', '--revprop', '-r1', custom_name, custom_value, sbox.repo_url)
svntest.actions.run_and_verify_svn(
- None, None, [], # message, expected_stdout, expected_stderr
+ None, [], # message, expected_stdout, expected_stderr
'ps', '--revprop', '-r2', custom_name, custom_value, sbox.repo_url)
# Can't set revprops with log.
@@ -1580,8 +1580,8 @@ def merge_sensitive_log_target_with_bogus_mergeinfo(sbox):
svntest.main.run_svn(None, 'ci', '-m', 'setting bogus mergeinfo', wc_path)
# The tests: Check that 'svn log -g' doesn't error on these.
- svntest.actions.run_and_verify_svn(None, None, [], 'log', '-g', C_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'log', '-g', D_path)
+ svntest.actions.run_and_verify_svn(None, [], 'log', '-g', C_path)
+ svntest.actions.run_and_verify_svn(None, [], 'log', '-g', D_path)
@SkipUnless(server_has_mergeinfo)
@Issue(3235)
@@ -1646,8 +1646,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Commit the merge.
expected_output = svntest.wc.State(wc_dir, {
@@ -1661,8 +1660,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
'A_COPY/D/H/omega',
'A_COPY/D/H/psi',
wc_rev=7)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
wc_disk.tweak("A_COPY/D",
props={SVN_PROP_MERGEINFO : '/A/D:2-6'})
wc_disk.tweak("A_COPY/D/G/rho", "A_COPY/D/H/omega", "A_COPY/D/H/psi",
@@ -1671,8 +1669,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
# Reverse merge r3 from 'A/D/H' to 'A_COPY/D/H' and commit as r8.
# First update the wc so mergeinfo inheritance can occur. This is
# necessary so A_COPY/D/H 'knows' that r3 has been merged into it.
- svntest.actions.run_and_verify_svn(None,
- exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
wc_status.tweak(wc_rev=7)
expected_output = wc.State(H_COPY_path, {
@@ -1703,7 +1700,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Commit the merge.
expected_output = svntest.wc.State(wc_dir, {
@@ -1713,8 +1710,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
wc_status.tweak('A_COPY/D/H',
'A_COPY/D/H/psi',
wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
wc_disk.tweak("A_COPY/D/H",
props={SVN_PROP_MERGEINFO : '/A/D:2,4-6'})
wc_disk.tweak("A_COPY/D/G/rho", "A_COPY/D/H/omega", "A_COPY/D/H/psi",
@@ -1735,7 +1731,7 @@ def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
8 : []}
expected_reverse_merges = {
3 : [8]}
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None,
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None,
[],
'log', '-g',
'-r8',
@@ -1788,7 +1784,7 @@ def merge_sensitive_log_propmod_merge_inheriting_path(sbox):
3 : [7],
}
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-g', '-r7', log_target)
+ None, [], 'log', '-g', '-r7', log_target)
log_chain = parse_log_output(output)
check_merge_results(log_chain, expected_merges)
run_log_g_r7(wc_dir)
@@ -1798,7 +1794,7 @@ def merge_sensitive_log_propmod_merge_inheriting_path(sbox):
def run_log_g_r8(log_target):
expected_merges = { 8 : [] }
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-g', '-r8', log_target)
+ None, [], 'log', '-g', '-r8', log_target)
log_chain = parse_log_output(output)
check_merge_results(log_chain, expected_merges)
run_log_g_r8(wc_dir)
@@ -1820,14 +1816,14 @@ def log_of_local_copy(sbox):
# Get the logs for a directory and a file.
exit_code, C_log_out, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-v', C_path)
+ None, [], 'log', '-v', C_path)
exit_code, psi_log_out, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-v', psi_path)
+ None, [], 'log', '-v', psi_path)
# Move that directory and file.
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
C_path, C_moved_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
psi_path, psi_moved_path)
# Get the logs for the move destinations.
@@ -1843,9 +1839,9 @@ def log_of_local_copy(sbox):
# svn: File not found: revision 9, path '/A/C_MOVED'
#
exit_code, C_moved_log_out, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-v', C_moved_path)
+ None, [], 'log', '-v', C_moved_path)
exit_code, psi_moved_log_out, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-v', psi_moved_path)
+ None, [], 'log', '-v', psi_moved_path)
# The logs of the move source and destinations should be the same.
if C_log_out != C_moved_log_out:
@@ -1875,20 +1871,18 @@ def merge_sensitive_log_reverse_merges(sbox):
# Merge -c3,5 from A to A_COPY, commit as r7
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', '-c3,5', A_path, A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Merge -c3,5 from A to A_COPY',
- wc_dir)
+ sbox.simple_commit(message='Merge -c3,5 from A to A_COPY')
# Merge -c-3,-5,4,6 from A to A_COPY, commit as r8
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', '-c-3,4,-5,6', A_path, A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Merge -c-3,-5,4,6 from A to A_COPY',
- wc_dir)
+ sbox.simple_commit(message='Merge -c-3,-5,4,6 from A to A_COPY')
# Update so
svntest.main.run_svn(None, 'up', wc_dir)
# Run log -g on path with explicit mergeinfo (A_COPY).
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g', '-r8',
A_COPY_path)
log_chain = parse_log_output(out)
@@ -1904,7 +1898,7 @@ def merge_sensitive_log_reverse_merges(sbox):
check_merge_results(log_chain, expected_merges, expected_reverse_merges)
# Run log -g on path with inherited mergeinfo (A_COPY/D).
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g', '-r8',
D_COPY_path)
log_chain = parse_log_output(out)
@@ -1938,58 +1932,55 @@ def merge_sensitive_log_ignores_cyclic_merges(sbox):
# Make an edit on the "branch" to A_COPY/mu, commit as r7.
svntest.main.file_write(mu_COPY_path, "Branch edit.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Branch edit', wc_dir)
+ sbox.simple_commit(message='Branch edit')
# Make an edit on both the "trunk" and the "branch", commit as r8.
svntest.main.file_write(chi_path, "Trunk edit.\n")
svntest.main.file_write(tau_COPY_path, "Branch edit.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Branch and trunk edits in one rev',
- wc_dir)
+ sbox.simple_commit(message='Branch and trunk edits in one rev')
# Sync merge A to A_COPY, commit as r9
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Sync merge A to A_COPY', wc_dir)
+ sbox.simple_commit(message='Sync merge A to A_COPY')
# Reintegrate A_COPY to A, commit as r10
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', '--reintegrate',
sbox.repo_url + '/A_COPY', A_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Reintegrate A_COPY to A', wc_dir)
+ sbox.simple_commit(message='Reintegrate A_COPY to A')
# Do a --record-only merge of r10 from A to A_COPY, commit as r11.
# This will allow us to continue using the branch without deleting it.
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m',
- '--record-only merge r10 from A to A_COPY', wc_dir)
+ sbox.simple_commit(message='--record-only merge r10 from A to A_COPY')
# Make an edit on the "branch"; add A_COPY/C and A_COPY/C/Z/nu,
# commit as r12.
svntest.main.run_svn(None, 'mkdir', Z_COPY_path)
svntest.main.file_write(nu_COPY_path, "A new branch file.\n")
svntest.main.run_svn(None, 'add', nu_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Branch edit: Add a subtree', wc_dir)
+ sbox.simple_commit(message='Branch edit: Add a subtree')
# Make an edit on the "trunk"; add A/C/X and A/C/X/kappa,
# commit as r13.
svntest.main.run_svn(None, 'mkdir', X_path)
svntest.main.file_write(kappa_path, "A new trunk file.\n")
svntest.main.run_svn(None, 'add', kappa_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Trunk edit: Add a subtree', wc_dir)
+ sbox.simple_commit(message='Trunk edit: Add a subtree')
svntest.main.run_svn(None, 'up', wc_dir)
# Sync merge A to A_COPY, commit as r14
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Sync merge A to A_COPY', wc_dir)
+ sbox.simple_commit(message='Sync merge A to A_COPY')
# Reintegrate A_COPY to A, commit as r15
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', '--reintegrate',
sbox.repo_url + '/A_COPY', A_path)
- svntest.main.run_svn(None, 'ci', '-m', '2nd reintegrate of A_COPY to A',
- wc_dir)
+ sbox.simple_commit(message='2nd reintegrate of A_COPY to A')
# Run 'svn log -g A'. We expect to see r13, r10, r6, r5, r4, and r3 only
# once, as part of A's own history, not as merged in from A_COPY.
@@ -2011,7 +2002,7 @@ def merge_sensitive_log_ignores_cyclic_merges(sbox):
1 : [],
}
svntest.main.run_svn(None, 'up', wc_dir)
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
A_path)
log_chain = parse_log_output(out)
@@ -2028,21 +2019,21 @@ def log_with_unrelated_peg_and_operative_revs(sbox):
# log for /A/D/G/rho, deleted in revision 5, recreated in revision 8
expected_error = ".*(File|path) not found.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', '6:7', target)
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', '7:6', target)
expected_error = ".*Unable to find repository location for.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', '2:9', target)
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', '9:2', target)
expected_error = ".*Unable to find repository location for.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', '2:HEAD', target)
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-r', 'HEAD:2', target)
#----------------------------------------------------------------------
@@ -2057,24 +2048,25 @@ def log_on_nonexistent_path_and_valid_rev(sbox):
bad_path_real_rev = sbox.repo_url + '/Z@1'
bad_path_default_rev = sbox.repo_url + '/Z'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'log', '-q', real_path_real_rev)
expected_error = ".*No such revision 99*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-q', real_path_bad_rev)
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-q', bad_url_bad_rev)
expected_error = ".*not found.*"
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-q', bad_path_real_rev)
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'log', '-q', bad_path_default_rev)
#----------------------------------------------------------------------
# Test for issue #4022 'svn log -g interprets change in inherited mergeinfo
# due to move as a merge'.
+@SkipUnless(server_has_mergeinfo)
@Issue(4022)
def merge_sensitive_log_copied_path_inherited_mergeinfo(sbox):
"log -g on copied path with inherited mergeinfo"
@@ -2090,17 +2082,17 @@ def merge_sensitive_log_copied_path_inherited_mergeinfo(sbox):
# r3 - Modify a file (A_COPY/D/gamma) on the branch
svntest.main.file_write(gamma_COPY_path, "Branch edit.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Branch edit', wc_dir)
+ sbox.simple_commit(message='Branch edit')
# r4 - Reintegrate A_COPY to A
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', '--reintegrate',
sbox.repo_url + '/A_COPY', A_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Reintegrate A_COPY to A', wc_dir)
+ sbox.simple_commit(message='Reintegrate A_COPY to A')
# r5 - Move file modified by reintegrate (A/D/gamma to A/C/gamma).
svntest.main.run_svn(None, 'move', old_gamma_path, new_gamma_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Move file', wc_dir)
+ sbox.simple_commit(message='Move file')
# 'svn log -g --stop-on-copy ^/A/C/gamma' hould return *only* r5
# Previously this test failed because the change in gamma's inherited
@@ -2132,7 +2124,7 @@ def merge_sensitive_log_copied_path_inherited_mergeinfo(sbox):
expected_merges = {5 : []}
svntest.main.run_svn(None, 'up', wc_dir)
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-g', '--stop-on-copy',
+ None, [], 'log', '-g', '--stop-on-copy',
sbox.repo_url + '/A/C/gamma')
log_chain = parse_log_output(out)
check_merge_results(log_chain, expected_merges)
@@ -2146,7 +2138,7 @@ def log_diff(sbox):
was_cwd = os.getcwd()
os.chdir(sbox.wc_dir)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff')
os.chdir(was_cwd)
@@ -2164,7 +2156,7 @@ def log_diff(sbox):
sbox.simple_commit()
os.chdir(sbox.wc_dir)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff',
'-r10:8', 'A2')
os.chdir(was_cwd)
@@ -2177,7 +2169,7 @@ def log_diff(sbox):
"\ No newline at end of file\n",
]
]
- r8diff = [ make_diff_header('A2/D/G/rho', 'revision 0', 'revision 8')
+ r8diff = [ make_diff_header('A2/D/G/rho', 'nonexistent', 'revision 8')
+ [ "@@ -0,0 +1 @@\n",
"+88\n",
"\ No newline at end of file\n",
@@ -2189,6 +2181,7 @@ def log_diff(sbox):
compare_diff_output(r9diff, log_chain[1]['diff_lines'])
compare_diff_output(r8diff, log_chain[2]['diff_lines'])
+@Skip(svntest.main.is_fs_type_fsx)
def log_xml_old(sbox):
"log --xml shows kind for old style repository"
@@ -2224,7 +2217,7 @@ def log_diff_moved(sbox):
mu_at_1 = sbox.repo_url + '/A/mu@1'
mu3_at_3 = sbox.repo_url + '/A/mu3@3'
- r1diff = [make_diff_header('mu', 'revision 0', 'revision 1')
+ r1diff = [make_diff_header('mu', 'nonexistent', 'revision 1')
+ ["@@ -0,0 +1 @@\n",
"+This is the file 'mu'.\n"]]
@@ -2244,7 +2237,7 @@ def log_diff_moved(sbox):
" now mu2\n",
"+now mu3\n"]]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff',
mu_at_1)
log_chain = parse_log_output(output, with_diffs=True)
@@ -2252,7 +2245,7 @@ def log_diff_moved(sbox):
raise SVNLogParseError("%d logs found, 1 expected" % len(log_chain))
compare_diff_output(r1diff, log_chain[0]['diff_lines'])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff',
'-r3', mu3_at_3)
log_chain = parse_log_output(output, with_diffs=True)
@@ -2260,7 +2253,7 @@ def log_diff_moved(sbox):
raise SVNLogParseError("%d logs found, 1 expected" % len(log_chain))
compare_diff_output(r3diff, log_chain[0]['diff_lines'])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff',
'-r3:2', mu3_at_3)
log_chain = parse_log_output(output, with_diffs=True)
@@ -2269,8 +2262,7 @@ def log_diff_moved(sbox):
compare_diff_output(r3diff, log_chain[0]['diff_lines'])
compare_diff_output(r2diff, log_chain[1]['diff_lines'])
- # XFAIL mu3 not found at revisions 0 and 1
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '--diff',
mu3_at_3)
log_chain = parse_log_output(output, with_diffs=True)
@@ -2290,7 +2282,7 @@ def log_search(sbox):
os.chdir(sbox.wc_dir)
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--search',
+ None, [], 'log', '--search',
'for revision [367]')
log_chain = parse_log_output(output)
@@ -2298,7 +2290,7 @@ def log_search(sbox):
# search is case-sensitive
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--search',
+ None, [], 'log', '--search',
'FOR REVISION [367]')
log_chain = parse_log_output(output)
@@ -2306,7 +2298,7 @@ def log_search(sbox):
# multi-pattern search
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log',
+ None, [], 'log',
'--search', 'for revision 3',
'--search', 'for revision 6',
'--search', 'for revision 7')
@@ -2316,7 +2308,7 @@ def log_search(sbox):
# combined pattern search
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--verbose',
+ None, [], 'log', '--verbose',
'--search', 'for revision 8',
'--search-and', 'test the code',
'--search', 'for revision 7',
@@ -2329,7 +2321,7 @@ def log_search(sbox):
check_log_chain(log_chain, [8, 6])
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '--verbose',
+ None, [], 'log', '--verbose',
'--search', 'for revision 8',
'--search-and', 'this won\'t match ',
'--search', 'for revision 7',
@@ -2351,7 +2343,7 @@ def merge_sensitive_log_with_search(sbox):
# Run log -g on a non-copying revision that adds mergeinfo,
# and perform a search that only matches the merged revision
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'log', '-g',
'-r6',
'--search',
@@ -2365,13 +2357,9 @@ def merge_sensitive_log_with_search(sbox):
}
check_merge_results(log_chain, expected_merges)
-#----------------------------------------------------------------------
-# Test for issue #4355 'svn_client_log5 broken with multiple revisions
-# which span a rename'.
-@Issue(4355)
-@SkipUnless(server_has_mergeinfo)
-def log_multiple_revs_spanning_rename(sbox):
- "log for multiple revs which span a rename"
+# Helper function for a few tests
+def create_renaming_history_repos(sbox):
+ "create a repository containing renames and a suitable working copy"
sbox.build()
wc_dir = sbox.wc_dir
@@ -2379,7 +2367,6 @@ def log_multiple_revs_spanning_rename(sbox):
msg_file=os.path.abspath(msg_file)
mu_path1 = os.path.join(wc_dir, 'A', 'mu')
mu_path2 = os.path.join(wc_dir, 'trunk', 'mu')
- trunk_path = os.path.join(wc_dir, 'trunk')
# r2 - Change a file.
msg=""" Log message for revision 2
@@ -2404,21 +2391,42 @@ def log_multiple_revs_spanning_rename(sbox):
svntest.main.run_svn(None, 'ci', '-F', msg_file, wc_dir)
svntest.main.run_svn(None, 'up', wc_dir)
+ # r5 - Cyclic exchange.
+ svntest.main.run_svn(None, 'up', wc_dir)
+ sbox.simple_move(os.path.join('trunk', 'D'), os.path.join('trunk', 'X'))
+ sbox.simple_move(os.path.join('trunk', 'C'), os.path.join('trunk', 'D'))
+ sbox.simple_move(os.path.join('trunk', 'X'), os.path.join('trunk', 'C'))
+ svntest.main.run_svn(None, 'ci', '-m', "Log message for revision 5",
+ wc_dir)
+
+
+#----------------------------------------------------------------------
+# Test for issue #4355 'svn_client_log5 broken with multiple revisions
+# which span a rename'.
+@Issue(4355)
+@SkipUnless(server_has_mergeinfo)
+def log_multiple_revs_spanning_rename(sbox):
+ "log for multiple revs which span a rename"
+
+ trunk_path = sbox.ospath('trunk')
+
+ create_renaming_history_repos(sbox)
+
# Check that log can handle a revision range that spans a rename.
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r2:4', sbox.repo_url + '/trunk/mu')
+ None, [], 'log', '-r2:4', sbox.repo_url + '/trunk/mu')
log_chain = parse_log_output(output)
check_log_chain(log_chain, [2,3,4])
# Check that log can handle discrete revisions that don't span a rename.
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-c3,4', sbox.repo_url + '/trunk/mu')
+ None, [], 'log', '-c3,4', sbox.repo_url + '/trunk/mu')
log_chain = parse_log_output(output)
check_log_chain(log_chain, [3,4])
# Check that log can handle discrete revisions that span a rename.
#
- # Currently this fails with:
+ # Previously this failed with:
#
# >svn log ^/trunk -c2,3,1
# ------------------------------------------------------------------------
@@ -2440,19 +2448,21 @@ def log_multiple_revs_spanning_rename(sbox):
# (apr_err=SVN_ERR_FS_NOT_FOUND)
# svn: E160013: File not found: revision 1, path '/trunk'
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-c2,3,1', sbox.repo_url + '/trunk/mu')
+ None, [], 'log', '-c2,3,1', sbox.repo_url + '/trunk/mu')
log_chain = parse_log_output(output)
check_log_chain(log_chain, [2,3,1])
+ mu_path2 = sbox.ospath('trunk/mu')
+
# Should work with a WC target too.
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-c2,3,1', mu_path2)
+ None, [], 'log', '-c2,3,1', mu_path2)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [2,3,1])
# Discreet revision *ranges* which span a rename should work too.
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r1', '-r4:2', sbox.repo_url + '/trunk')
+ None, [], 'log', '-r1', '-r4:2', sbox.repo_url + '/trunk')
log_chain = parse_log_output(output)
check_log_chain(log_chain, [1,4,3,2])
@@ -2473,26 +2483,210 @@ def log_multiple_revs_spanning_rename(sbox):
# (apr_err=SVN_ERR_FS_NOT_FOUND)
# svn: E160013: File not found: revision 4, path '/A'
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r1', '-r2:4', sbox.repo_url + '/trunk')
+ None, [], 'log', '-r1', '-r2:4', sbox.repo_url + '/trunk')
log_chain = parse_log_output(output)
check_log_chain(log_chain, [1,2,3,4])
# Discrete revs with WC-only opt revs shouldn't cause any problems.
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r1', '-rPREV', trunk_path)
+ None, [], 'log', '-r1', '-rPREV', trunk_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [1,3])
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r1', '-rCOMMITTED', trunk_path)
+ None, [], 'log', '-r1', '-rCOMMITTED', trunk_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [1,4])
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', '-r1', '-rBASE', trunk_path)
+ None, [], 'log', '-r1', '-rBASE', trunk_path)
log_chain = parse_log_output(output)
check_log_chain(log_chain, [1,4])
+@SkipUnless(server_has_mergeinfo)
+def mergeinfo_log(sbox):
+ "'mergeinfo --log' on a path with mergeinfo"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # make a branch 'A2'
+ sbox.simple_repo_copy('A', 'A2') # r2
+ # make a change in branch 'A'
+ sbox.simple_mkdir('A/newdir')
+ sbox.simple_commit(message="Log message for revision 3.") # r3
+ sbox.simple_update()
+
+ # Dummy up some mergeinfo.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'ps', SVN_PROP_MERGEINFO, '/A:3',
+ sbox.ospath('A2'))
+
+ # test --log
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
+ 'mergeinfo', '--show-revs=merged',
+ '--log', sbox.repo_url + '/A',
+ sbox.ospath('A2'))
+ check_log_chain(parse_log_output(output), [3])
+
+ # test --log -v
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
+ 'mergeinfo', '--show-revs=merged',
+ '--log', '-v', sbox.repo_url + '/A',
+ sbox.ospath('A2'))
+ check_log_chain(parse_log_output(output), [3], [1])
+
+ # test --log -q
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mergeinfo', '--show-revs=merged',
+ '--log', '-q', sbox.repo_url + '/A',
+ sbox.ospath('A2'))
+ # TODO: Validate the output, the check_log_chain() function assumes it
+ # gets the output of the message
+
+@SkipUnless(server_has_mergeinfo)
+@Issue(4463)
+def merge_sensitive_log_xml_reverse_merges(sbox):
+ "log -g --xml differentiates forward/reverse merges"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ wc_disk, wc_status = set_up_branch(sbox)
+
+ A_path = os.path.join(wc_dir, 'A')
+ A_COPY_path = os.path.join(wc_dir, 'A_COPY')
+ D_COPY_path = os.path.join(wc_dir, 'A_COPY', 'D')
+
+ # Merge -c3,5 from A to A_COPY, commit as r7
+ svntest.main.run_svn(None, 'up', wc_dir)
+ svntest.main.run_svn(None, 'merge', '-c3,5', A_path, A_COPY_path)
+ sbox.simple_commit(message='Merge -c3,5 from A to A_COPY')
+
+ # Merge -c-3,-5,4,6 from A to A_COPY, commit as r8
+ svntest.main.run_svn(None, 'up', wc_dir)
+ svntest.main.run_svn(None, 'merge', '-c-3,4,-5,6', A_path, A_COPY_path)
+ sbox.simple_commit(message='Merge -c-3,-5,4,6 from A to A_COPY')
+
+ # Update so
+ svntest.main.run_svn(None, 'up', wc_dir)
+
+ # Run log -g --xml on path with explicit mergeinfo (A_COPY).
+ log_attrs = [
+ {
+ u'revision': u'8',
+ },
+ {
+ u'revision': u'6',
+ u'reverse-merge': u'false',
+ },
+ {
+ u'revision': u'5',
+ u'reverse-merge': u'true',
+ },
+ {
+ u'revision': u'4',
+ u'reverse-merge': u'false',
+ },
+ {
+ u'revision': u'3',
+ u'reverse-merge': u'true',
+ }]
+ svntest.actions.run_and_verify_log_xml(expected_log_attrs=log_attrs,
+ args=['-g', '-r8', A_COPY_path])
+
+ # Run log -g --xml on path with inherited mergeinfo (A_COPY/D).
+ # r5 only affects A_COPY/B/E/beta so not listed
+ log_attrs = [
+ {
+ u'revision': u'8',
+ },
+ {
+ u'revision': u'6',
+ u'reverse-merge': u'false',
+ },
+ {
+ u'revision': u'4',
+ u'reverse-merge': u'false',
+ },
+ {
+ u'revision': u'3',
+ u'reverse-merge': u'true',
+ }]
+ svntest.actions.run_and_verify_log_xml(expected_log_attrs=log_attrs,
+ args=['-g', '-r8', D_COPY_path])
+
+def log_revision_move_copy(sbox):
+ "log revision handling over move/copy"
+
+ sbox.build()
+
+ sbox.simple_move('iota', 'iotb')
+ sbox.simple_append('iotb', 'new line\n')
+
+ sbox.simple_copy('A/mu', 'mutb')
+ sbox.simple_append('mutb', 'mutb\n')
+
+ sbox.simple_move('A/B/E', 'E')
+ sbox.simple_move('E/alpha', 'alpha')
+
+ #r2
+ svntest.actions.run_and_verify_svn(None, [],
+ 'rm', sbox.repo_url + '/A/D', '-mm')
+
+ sbox.simple_commit() #r3
+
+ # This introduces a copy and a move in r3, but check how the history
+ # of these nodes behaves in r2.
+
+ # This one might change behavior once we improve move handling
+ expected_output = [
+ '------------------------------------------------------------------------\n'
+ ]
+ expected_err = []
+ svntest.actions.run_and_verify_svn(expected_output, expected_err,
+ 'log', '-v',sbox.ospath('iotb'),
+ '-r2')
+
+ # While this one
+ expected_output = []
+ expected_err = '.*E195012: Unable to find repository location.*'
+ svntest.actions.run_and_verify_svn(expected_output, expected_err,
+ 'log', '-v', sbox.ospath('mutb'),
+ '-r2')
+
+ # And just for fun, do the same thing for blame
+ expected_output = [
+ ' 1 jrandom This is the file \'iota\'.\n'
+ ]
+ expected_err = []
+ svntest.actions.run_and_verify_svn(expected_output, expected_err,
+ 'blame', sbox.ospath('iotb'),
+ '-r2')
+
+ expected_output = None
+ expected_err = '.*E195012: Unable to find repository location.*'
+ svntest.actions.run_and_verify_svn(expected_output, expected_err,
+ 'blame', sbox.ospath('mutb'),
+ '-r2')
+
+ expected_output = svntest.verify.RegexListOutput([
+ '-+\\n',
+ 'r3\ .*\n',
+ re.escape('Changed paths:\n'),
+ re.escape(' D /A/B/E\n'),
+ re.escape(' A /E (from /A/B/E:2)\n'), # Patched - Direct move
+ re.escape(' D /E/alpha\n'),
+ re.escape(' A /alpha (from /A/B/E/alpha:1)\n'), # Indirect move - Not patched
+ re.escape(' D /iota\n'),
+ re.escape(' A /iotb (from /iota:2)\n'), # Patched - Direct move
+ re.escape(' A /mutb (from /A/mu:1)\n'), # Copy (always r1)
+ '-+\\n'
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'log', '-v', '-q', sbox.wc_dir,
+ '-c3')
+
+
########################################################################
# Run the tests
@@ -2539,6 +2733,9 @@ test_list = [ None,
log_search,
merge_sensitive_log_with_search,
log_multiple_revs_spanning_rename,
+ mergeinfo_log,
+ merge_sensitive_log_xml_reverse_merges,
+ log_revision_move_copy,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/merge_authz_tests.py b/subversion/tests/cmdline/merge_authz_tests.py
index 8bf1968..8e14089 100755
--- a/subversion/tests/cmdline/merge_authz_tests.py
+++ b/subversion/tests/cmdline/merge_authz_tests.py
@@ -41,8 +41,8 @@ Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
from svntest.main import SVN_PROP_MERGEINFO
from svntest.main import write_restrictive_svnserve_conf
from svntest.main import write_authz_file
@@ -112,7 +112,7 @@ def mergeinfo_and_skipped_paths(sbox):
# Checkout just the branch under the newly restricted authz.
wc_restricted = sbox.add_wc_path('restricted')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url,
wc_restricted)
@@ -194,8 +194,7 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r4:8 into the restricted WC's A_COPY_2.
#
@@ -270,8 +269,7 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ check_props=True)
# Merge r5:7 into the restricted WC's A_COPY_3.
#
@@ -335,9 +333,8 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
+ check_props=True)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '--recursive',
wc_restricted)
# Test issue #2997. If a merge requires two separate editor drives and the
@@ -379,23 +376,23 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0, '-c5', '-c8',
+ [], True, False,
+ '-c5', '-c8',
A_COPY_2_H_path)
# Test issue #2829 'Improve handling for skipped paths encountered
# during a merge'
# Revert previous changes to restricted WC
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '--recursive',
wc_restricted)
# Add new path 'A/D/H/zeta'
svntest.main.file_write(zeta_path, "This is the file 'zeta'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', zeta_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', zeta_path)
expected_output = wc.State(wc_dir, {'A/D/H/zeta' : Item(verb='Adding')})
wc_status.add({'A/D/H/zeta' : Item(status=' ', wc_rev=9)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge -r7:9 to the restricted WC's A_COPY_2/D/H.
#
@@ -436,8 +433,7 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ check_props=True)
# Merge -r4:9 to the restricted WC's A_COPY_2/D/H.
#
@@ -445,7 +441,7 @@ def mergeinfo_and_skipped_paths(sbox):
# non-inheritable mergeinfo (due to the fact 'A_COPY_2/D/H/psi' is missing
# and skipped). 'A_COPY_2/D/H/zeta' must therefore get its own explicit
# mergeinfo from this merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '--recursive',
wc_restricted)
expected_output = wc.State(A_COPY_2_H_path, {
'omega' : Item(status='U '),
@@ -483,8 +479,7 @@ def mergeinfo_and_skipped_paths(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ check_props=True)
@SkipUnless(server_has_mergeinfo)
@Issue(2876)
@@ -526,13 +521,13 @@ def merge_fails_if_subtree_is_deleted_on_src(sbox):
# Commit the new content
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', A_url, Acopy_url,
+ svntest.actions.run_and_verify_svn(None, [], 'cp', A_url, Acopy_url,
'-m', 'create a new copy of A')
# Update working copy
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
svntest.main.file_substitute(gamma_path, "line1", "this is line1")
# Create expected output tree for commit
@@ -566,10 +561,10 @@ def merge_fails_if_subtree_is_deleted_on_src(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Delete A/D/gamma from working copy
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', gamma_path)
+ svntest.actions.run_and_verify_svn(None, [], 'delete', gamma_path)
# Create expected output tree for commit
expected_output = wc.State(wc_dir, {
'A/D/gamma' : Item(verb='Deleting'),
@@ -580,10 +575,9 @@ def merge_fails_if_subtree_is_deleted_on_src(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None,
+ [],
wc_dir, wc_dir)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3,4]],
['U ' + Acopy_gamma_path + '\n',
' U ' + Acopy_gamma_path + '\n']),
@@ -603,7 +597,6 @@ def merge_fails_if_subtree_is_deleted_on_src(sbox):
# see notes/tree-conflicts/detection.txt, but --force currently avoids
# this.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3,6]],
['D ' + Acopy_gamma_path + '\n',
' U ' + Acopy_path + '\n']),
@@ -642,7 +635,7 @@ def reintegrate_fails_if_no_root_access(sbox):
expected_output = wc.State(wc_dir, {'A_COPY/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A_COPY/mu', contents='Changed on the branch.')
# Update the WC.
@@ -657,9 +650,9 @@ def reintegrate_fails_if_no_root_access(sbox):
'U ' + psi_COPY_path + '\n',
# Mergeinfo notification
' U ' + A_COPY_path + '\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
sbox.repo_url + '/A', A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'synch A_COPY with A', wc_dir)
+ sbox.simple_commit(message='synch A_COPY with A')
# Update so we are ready for reintegrate.
svntest.main.run_svn(None, 'up', wc_dir)
@@ -733,10 +726,177 @@ def reintegrate_fails_if_no_root_access(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, True, True,
+ [], True, True,
'--reintegrate', A_path)
+def diff_unauth_parent(sbox):
+ "diff directory without reading parent"
+
+ sbox.build(create_wc=False)
+
+ # Create r2: Change A a bit
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ 'propset', 'k', 'v',
+ sbox.repo_url + '/A',
+ '-m', 'set prop')
+
+ # Create r3 Mark E and G
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ 'propset', 'this-is', 'E',
+ sbox.repo_url + '/A/B/E',
+ 'propset', 'this-is', 'G',
+ sbox.repo_url + '/A/D/G',
+ '-m', 'set prop')
+
+ # Create r4: Replace A/B/E with A/D/G
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ 'rm', sbox.repo_url + '/A/B/E',
+ 'cp', '3', sbox.repo_url + '/A/D/G',
+ sbox.repo_url + '/A/B/E',
+ '-m', 'replace A/B/E')
+
+
+ if is_ra_type_svn() or is_ra_type_dav():
+ write_restrictive_svnserve_conf(sbox.repo_dir)
+ write_authz_file(sbox, {"/" : "* =",
+ "/A" : "* = rw"})
+
+ # Diff the property change
+ expected_output = [
+ 'Index: .\n',
+ '===================================================================\n',
+ '--- .\t(revision 1)\n',
+ '+++ .\t(revision 2)\n',
+ '\n',
+ 'Property changes on: .\n',
+ '___________________________________________________________________\n',
+ 'Added: k\n',
+ '## -0,0 +1 ##\n',
+ '+v\n',
+ '\ No newline at end of property\n'
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', sbox.repo_url + '/A', '-c', '2')
+
+ if is_ra_type_svn() or is_ra_type_dav():
+ write_authz_file(sbox, {"/" : "* =",
+ "/A/B/E" : "* = rw"})
+
+ # Diff the replacement
+ expected_output = [
+ 'Index: alpha\n',
+ '===================================================================\n',
+ '--- alpha\t(revision 3)\n',
+ '+++ alpha\t(nonexistent)\n',
+ '@@ -1 +0,0 @@\n',
+ '-This is the file \'alpha\'.\n',
+ 'Index: beta\n',
+ '===================================================================\n',
+ '--- beta\t(revision 3)\n',
+ '+++ beta\t(nonexistent)\n',
+ '@@ -1 +0,0 @@\n',
+ '-This is the file \'beta\'.\n',
+ 'Index: tau\n',
+ '===================================================================\n',
+ '--- tau\t(nonexistent)\n',
+ '+++ tau\t(revision 4)\n',
+ '@@ -0,0 +1 @@\n',
+ '+This is the file \'tau\'.\n',
+ 'Index: rho\n',
+ '===================================================================\n',
+ '--- rho\t(nonexistent)\n',
+ '+++ rho\t(revision 4)\n',
+ '@@ -0,0 +1 @@\n',
+ '+This is the file \'rho\'.\n',
+ 'Index: pi\n',
+ '===================================================================\n',
+ '--- pi\t(nonexistent)\n',
+ '+++ pi\t(revision 4)\n',
+ '@@ -0,0 +1 @@\n',
+ '+This is the file \'pi\'.\n',
+ ]
+
+ if is_ra_type_svn() or is_ra_type_dav():
+ # Because we can't anchor above C we see just a changed C, not a
+ # replacement
+ expected_output += [
+ 'Index: .\n',
+ '===================================================================\n',
+ '--- .\t(revision 3)\n',
+ '+++ .\t(revision 4)\n',
+ '\n',
+ 'Property changes on: .\n',
+ '___________________________________________________________________\n',
+ 'Modified: this-is\n',
+ '## -1 +1 ##\n',
+ '-E\n',
+ '\ No newline at end of property\n',
+ '+G\n',
+ '\ No newline at end of property\n',
+ ]
+ else:
+ # ### We should also see a property deletion here!
+ expected_output += [
+ 'Index: .\n',
+ '===================================================================\n',
+ '--- .\t(revision 3)\n',
+ '+++ .\t(nonexistent)\n',
+ '\n',
+ 'Property changes on: .\n',
+ '___________________________________________________________________\n',
+ 'Deleted: this-is\n',
+ '## -1 +0,0 ##\n',
+ '-E\n',
+ '\ No newline at end of property\n',
+ 'Index: .\n',
+ '===================================================================\n',
+ '--- .\t(nonexistent)\n',
+ '+++ .\t(revision 4)\n',
+ '\n',
+ 'Property changes on: .\n',
+ '___________________________________________________________________\n',
+ 'Added: this-is\n',
+ '## -0,0 +1 ##\n',
+ '+G\n',
+ '\ No newline at end of property\n',
+ ]
+
+ # Use two url diff, because 'svn diff url -c' uses copyfrom to diff against
+ expected_output = svntest.verify.UnorderedOutput(expected_output)
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', sbox.repo_url + '/A/B/E@3',
+ sbox.repo_url + '/A/B/E@4',
+ '--notice-ancestry')
+
+ # Do the same thing with summarize to really see directory deletes and adds
+ if is_ra_type_svn() or is_ra_type_dav():
+ # With no rights on the parent directory we just see a property change on E
+ expected_output = [
+ 'D %s/A/B/E/alpha\n' % sbox.repo_url,
+ 'D %s/A/B/E/beta\n' % sbox.repo_url,
+ 'A %s/A/B/E/tau\n' % sbox.repo_url,
+ 'A %s/A/B/E/rho\n' % sbox.repo_url,
+ 'A %s/A/B/E/pi\n' % sbox.repo_url,
+ ' M %s/A/B/E\n' % sbox.repo_url,
+ ]
+ else:
+ # But with rights on the parent we see a replacement of E
+ expected_output = [
+ 'D %s/A/B/E/alpha\n' % sbox.repo_url,
+ 'D %s/A/B/E/beta\n' % sbox.repo_url,
+ 'D %s/A/B/E\n' % sbox.repo_url,
+ 'A %s/A/B/E/tau\n' % sbox.repo_url,
+ 'A %s/A/B/E/rho\n' % sbox.repo_url,
+ 'A %s/A/B/E/pi\n' % sbox.repo_url,
+ 'A %s/A/B/E\n' % sbox.repo_url,
+ ]
+
+ expected_output = svntest.verify.UnorderedOutput(expected_output)
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'diff', sbox.repo_url + '/A/B/E@3',
+ sbox.repo_url + '/A/B/E@4',
+ '--notice-ancestry', '--summarize')
+
########################################################################
# Run the tests
@@ -746,6 +906,7 @@ test_list = [ None,
mergeinfo_and_skipped_paths,
merge_fails_if_subtree_is_deleted_on_src,
reintegrate_fails_if_no_root_access,
+ diff_unauth_parent,
]
serial_only = True
diff --git a/subversion/tests/cmdline/merge_automatic_tests.py b/subversion/tests/cmdline/merge_automatic_tests.py
index 350ae3e..fbdf395 100755
--- a/subversion/tests/cmdline/merge_automatic_tests.py
+++ b/subversion/tests/cmdline/merge_automatic_tests.py
@@ -43,10 +43,10 @@ Wimp = svntest.testcase.Wimp_deco
from svntest.main import SVN_PROP_MERGEINFO
from svntest.main import server_has_mergeinfo
-from merge_tests import local_path
-from merge_tests import expected_merge_output
-from merge_tests import svn_merge
-from merge_tests import set_up_branch
+from svntest.mergetrees import local_path
+from svntest.mergetrees import expected_merge_output
+from svntest.mergetrees import svn_merge
+from svntest.mergetrees import set_up_branch
#----------------------------------------------------------------------
@@ -188,7 +188,7 @@ def logical_changes_in_branch(sbox, branch):
def get_mergeinfo_change(sbox, target):
"""Return a list of revision numbers representing the mergeinfo change
on TARGET (working version against base). Non-recursive."""
- exit, out, err = actions.run_and_verify_svn(None, None, [],
+ exit, out, err = actions.run_and_verify_svn(None, [],
'diff', '--depth=empty',
sbox.ospath(target))
merged_revs = []
@@ -302,7 +302,7 @@ def automatic_merge(sbox, source, target, args=[],
before_changes = logical_changes_in_branch(sbox, target)
exp_out = expected_automatic_merge_output(target, expect_3ways)
- exit, out, err = svntest.actions.run_and_verify_svn(None, exp_out, [],
+ exit, out, err = svntest.actions.run_and_verify_svn(exp_out, [],
'merge',
'^/' + source, target,
*args)
@@ -334,7 +334,6 @@ def three_way_merge_no_op(base_node, source_right_node):
def cherry_pick(sbox, rev, source, target):
"""Cherry-pick merge revision REV from branch SOURCE to branch TARGET
(both WC-relative paths), and commit."""
- sbox.simple_update(target)
svn_merge(rev, source, target)
sbox.simple_commit()
@@ -691,6 +690,7 @@ def cherry1_fwd(sbox):
# 2 34 5 67 8 9 0 1
init_mod_merge_mod(sbox, mod_6=True, mod_7=False)
+ sbox.simple_update()
modify_branch(sbox, 'A', 8)
cherry_pick(sbox, 8, 'A', 'B')
modify_branch(sbox, 'A', 10)
@@ -782,20 +782,20 @@ def subtree_to_and_fro(sbox):
# r7 - Edit a file on the branch.
svntest.main.file_write(A_COPY_gamma_path, "Branch edit to 'gamma'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Edit a file on our branch')
# r8 - Do a subtree sync merge from ^/A/D to A_COPY/D.
# Note that among other things this changes A_COPY/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D', A_COPY_D_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Automatic subtree merge')
# r9 - Make an edit to A/D/H/psi.
svntest.main.file_write(psi_path, "Trunk Edit to 'psi'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Edit a file on our trunk')
# Now reintegrate ^/A_COPY back to A. Prior to issue #4258's fix, the
@@ -820,9 +820,9 @@ def subtree_to_and_fro(sbox):
# U A
# Summary of conflicts:
# Text conflicts: 1
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, [], svntest.verify.AnyOutput,
+ [], svntest.verify.AnyOutput,
'merge', sbox.repo_url + '/A_COPY', A_path)
# Better to produce the same warning that explicitly using the
@@ -876,13 +876,13 @@ def merge_to_reverse_cherry_subtree_to_merge_to(sbox):
# Properties on 'A_COPY\B':
# svn:mergeinfo
# /A/B:2-4,6
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c-5',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c-5',
sbox.repo_url + '/A/B',
A_COPY_B_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir, '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir, '-m',
'sync merge and reverse subtree merge')
# Try an automatic sync merge from ^/A to A_COPY. Revision 5 should be
@@ -917,7 +917,7 @@ def merge_to_reverse_cherry_subtree_to_merge_to(sbox):
# ___________________________________________________________________
# Modified: svn:mergeinfo
# Merged /A:r7
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY_path, {
'B/E/beta' : Item(status='U '),
})
@@ -980,8 +980,8 @@ def merge_to_reverse_cherry_subtree_to_merge_to(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0, A_COPY_path)
+ [], True, False,
+ A_COPY_path)
#----------------------------------------------------------------------
# Automatic merges should notice ancestory for replaced files
@@ -1073,8 +1073,8 @@ def merge_replacement(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0, A_path)
+ [], True, False,
+ A_path)
@SkipUnless(server_has_mergeinfo)
@Issue(4313)
@@ -1117,7 +1117,6 @@ def auto_merge_handles_replacements_in_merge_source(sbox):
# unusual way.
# Please contact the application's support team for more information.
svntest.actions.run_and_verify_svn(
- None,
["--- Recording mergeinfo for merge of r2 into '" + branch2_path + "':\n",
" U " + branch2_path + "\n",
"--- Recording mergeinfo for merge of r3 into '" + branch2_path + "':\n",
@@ -1175,7 +1174,7 @@ def effective_sync_results_in_reintegrate(sbox):
"--- Recording mergeinfo for merge between repository URLs into '" +
A_path + "':\n",
" U " + A_path + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
sbox.repo_url + '/branch', A_path,
'--reintegrate')
@@ -1198,8 +1197,8 @@ def effective_sync_results_in_reintegrate(sbox):
# Conflict discovered in file 'A\mu'.
# Select: (p) postpone, (df) diff-full, (e) edit, (m) merge,
# (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', A_path, '-R')
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', A_path, '-R')
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
sbox.repo_url + '/branch', A_path)
@Issue(4481)
@@ -1225,7 +1224,7 @@ def reintegrate_subtree_not_updated(sbox):
+ sbox.ospath('A/D/G') + "':\n",
" U "
+ sbox.ospath('A/D/G') + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/D_1/G',
sbox.ospath('A/D/G'))
@@ -1238,7 +1237,7 @@ def reintegrate_subtree_not_updated(sbox):
+ sbox.ospath('A/D/H') + "':\n",
" U "
+ sbox.ospath('A/D/H') + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/D_1/H',
sbox.ospath('A/D/H'))
@@ -1274,7 +1273,7 @@ def reintegrate_subtree_not_updated(sbox):
+ sbox.ospath('D_2/G') + "':\n",
" U "
+ sbox.ospath('D_2/G') + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/A/D',
sbox.ospath('D_2'))
@@ -1295,7 +1294,7 @@ def reintegrate_subtree_not_updated(sbox):
+ sbox.ospath('A/D') + "\n",
" U "
+ sbox.ospath('A/D/G') + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/D_2',
sbox.ospath('A/D'))
@@ -1321,13 +1320,85 @@ def reintegrate_subtree_not_updated(sbox):
+ sbox.ospath('D_2') + "\n",
" G "
+ sbox.ospath('D_2/G') + "\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/A/D',
sbox.ospath('D_2'))
sbox.simple_commit()
sbox.simple_update()
+def merge_to_copy_and_add(sbox):
+ "merge peg to a copy and add"
+
+ sbox.build()
+
+ sbox.simple_copy('A', 'AA')
+ sbox.simple_append('A/mu', 'A/mu')
+ sbox.simple_commit('A')
+
+ # This is the scenario the code is supposed to support; a copy
+ svntest.actions.run_and_verify_svn(None, [],
+ 'merge', '^/A', sbox.ospath('AA'))
+
+ sbox.simple_mkdir('A3')
+ # And this case currently segfaults, because merge doesn't check
+ # if the path has a repository location
+ expected_err = ".*svn: E195012: Can't perform .*A3'.*added.*"
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'merge', '^/A', sbox.ospath('A3'))
+ # Try the same merge with --reintegrate, for completeness' sake.
+ expected_err = ".*svn: E195012: Can't reintegrate into .*A3'.*added.*"
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'merge', '--reintegrate', '^/A',
+ sbox.ospath('A3'))
+
+def merge_delete_crlf_file(sbox):
+ "merge the deletion of a strict CRLF file"
+
+ sbox.build()
+
+ sbox.simple_copy('A', 'AA')
+
+ # Let commit fix the eols
+ sbox.simple_add_text('with\rCRLF\rhere!', 'A/crlf')
+ sbox.simple_add_text('with\rnative\r\eol', 'A/native')
+ sbox.simple_add_text('with\rCR\r\eol', 'A/cr')
+ sbox.simple_add_text('with\rLF\r\eol', 'A/lf')
+
+ # And apply the magic property
+ sbox.simple_propset('svn:eol-style', 'CRLF', 'A/crlf')
+ sbox.simple_propset('svn:eol-style', 'native', 'A/native')
+ sbox.simple_propset('svn:eol-style', 'CR', 'A/cr')
+ sbox.simple_propset('svn:eol-style', 'LF', 'A/lf')
+
+ sbox.simple_commit('A') # r2
+
+ # Merge the addition of the files
+ svntest.actions.run_and_verify_svn(None, [],
+ 'merge', '^/A', sbox.ospath('AA'))
+ sbox.simple_commit('AA') # r3
+
+ sbox.simple_rm('A/D', 'A/mu', 'A/crlf', 'A/native', 'A/cr', 'A/lf')
+ sbox.simple_commit('A') # r4
+
+ sbox.simple_update('') # Make single revision r4
+
+ # And now merge the deletes
+ expected_output = svntest.verify.UnorderedOutput([
+ '--- Merging r3 through r4 into \'%s\':\n' % sbox.ospath('AA'),
+ 'D %s\n' % sbox.ospath('AA/cr'),
+ 'D %s\n' % sbox.ospath('AA/crlf'),
+ 'D %s\n' % sbox.ospath('AA/lf'),
+ 'D %s\n' % sbox.ospath('AA/native'),
+ 'D %s\n' % sbox.ospath('AA/mu'),
+ 'D %s\n' % sbox.ospath('AA/D'),
+ '--- Recording mergeinfo for merge of r3 through r4 into \'%s\':\n'
+ % sbox.ospath('AA'),
+ ' U %s\n' % sbox.ospath('AA')
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'merge', '^/A', sbox.ospath('AA'))
+
########################################################################
# Run the tests
@@ -1357,6 +1428,8 @@ test_list = [ None,
auto_merge_handles_replacements_in_merge_source,
effective_sync_results_in_reintegrate,
reintegrate_subtree_not_updated,
+ merge_to_copy_and_add,
+ merge_delete_crlf_file
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/merge_reintegrate_tests.py b/subversion/tests/cmdline/merge_reintegrate_tests.py
index 8b3e91f..553a2dc 100755
--- a/subversion/tests/cmdline/merge_reintegrate_tests.py
+++ b/subversion/tests/cmdline/merge_reintegrate_tests.py
@@ -44,8 +44,8 @@ exp_noop_up_out = svntest.actions.expected_noop_update_output
from svntest.main import SVN_PROP_MERGEINFO
from svntest.main import server_has_mergeinfo
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
#----------------------------------------------------------------------
def run_reintegrate(src_url, tgt_path):
@@ -53,7 +53,7 @@ def run_reintegrate(src_url, tgt_path):
there is nothing on stdout, anything on stderr, or a non-zero exit
code.
"""
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', '--reintegrate',
src_url, tgt_path)
@@ -71,7 +71,7 @@ def run_reintegrate_expect_error(src_url, tgt_path,
# ourselves, but as the 'actual_stdout' argument, that way each line of
# error must match the regex.
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, expected_stdout, svntest.verify.AnyOutput,
+ expected_stdout, svntest.verify.AnyOutput,
'merge', '--reintegrate',
src_url, tgt_path)
assert exit_code
@@ -86,7 +86,7 @@ def run_and_verify_reintegrate(tgt_dir, src_url,
mergeinfo_output_tree,
elision_output_tree,
disk_tree, status_tree, skip_tree,
- error_re_string = None,
+ expected_stderr = [],
check_props = True,
dry_run = True):
"""Run 'svn merge --reintegrate SRC_URL TGT_DIR'. Raise an error if
@@ -98,8 +98,7 @@ def run_and_verify_reintegrate(tgt_dir, src_url,
tgt_dir, None, None, src_url, None,
output_tree, mergeinfo_output_tree, elision_output_tree,
disk_tree, status_tree, skip_tree,
- error_re_string,
- None, None, None, None, check_props, dry_run,
+ expected_stderr, check_props, dry_run,
'--reintegrate', tgt_dir)
@@ -122,7 +121,7 @@ def basic_reintegrate(sbox):
expected_output = wc.State(wc_dir, {'A_COPY/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A_COPY/mu', contents='Changed on the branch.')
# Update the wcs.
@@ -130,7 +129,7 @@ def basic_reintegrate(sbox):
expected_status.tweak(wc_rev='7')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# Merge from trunk to branch (ie, r3-6), using normal cherry-harvest.
A_COPY_path = sbox.ospath('A_COPY')
@@ -196,8 +195,7 @@ def basic_reintegrate(sbox):
k_expected_disk,
k_expected_status,
expected_skip,
- None, None, None, None,
- None, True)
+ [], True)
expected_disk.tweak('A_COPY', props={SVN_PROP_MERGEINFO: '/A:2-7'})
expected_disk.tweak('A_COPY/B/E/beta', contents="New content")
expected_disk.tweak('A_COPY/D/G/rho', contents="New content")
@@ -215,14 +213,14 @@ def basic_reintegrate(sbox):
expected_status.tweak('A_COPY', 'A_COPY/D/H/psi', 'A_COPY/D/G/rho',
'A_COPY/B/E/beta', 'A_COPY/D/H/omega', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update the wcs again.
expected_output = wc.State(wc_dir, {})
expected_status.tweak(wc_rev='8')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# *finally*, actually run merge --reintegrate in trunk with the
@@ -268,7 +266,7 @@ def basic_reintegrate(sbox):
k_expected_disk,
k_expected_status,
expected_skip,
- None, True, True)
+ [], True, True)
# Test issue #3640:
#
@@ -276,14 +274,14 @@ def basic_reintegrate(sbox):
# targeting A_MOVED this time. This should work with almost the same
# results. The only differences being the inclusion of r9 in the
# mergeinfo and the A-->A_MOVED path difference.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 9.\n'],
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 9.\n'],
[], 'move',
sbox.repo_url + '/A',
sbox.repo_url + '/A_MOVED',
'-m', 'Copy A to A_MOVED')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
A_MOVED_path = sbox.ospath('A_MOVED')
expected_output = wc.State(A_MOVED_path, {
'mu' : Item(status='U '),
@@ -325,9 +323,10 @@ def basic_reintegrate(sbox):
k_expected_disk,
expected_status,
expected_skip,
- None, True, True)
+ [], True, True)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def reintegrate_with_rename(sbox):
"merge --reintegrate with renamed file on branch"
@@ -342,7 +341,7 @@ def reintegrate_with_rename(sbox):
expected_output = wc.State(wc_dir, {'A_COPY/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A_COPY/mu', contents='Changed on the branch.')
# Update the wcs.
@@ -350,7 +349,7 @@ def reintegrate_with_rename(sbox):
expected_status.tweak(wc_rev='7')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# Merge from trunk to branch (ie, r3-6), using normal cherry-harvest.
A_COPY_path = sbox.ospath('A_COPY')
@@ -416,8 +415,7 @@ def reintegrate_with_rename(sbox):
k_expected_disk,
k_expected_status,
expected_skip,
- None, None, None, None,
- None, True)
+ [], True)
expected_disk.tweak('A_COPY', props={SVN_PROP_MERGEINFO: '/A:2-7'})
expected_disk.tweak('A_COPY/B/E/beta', contents="New content")
expected_disk.tweak('A_COPY/D/G/rho', contents="New content")
@@ -435,7 +433,7 @@ def reintegrate_with_rename(sbox):
expected_status.tweak('A_COPY', 'A_COPY/D/H/psi', 'A_COPY/D/G/rho',
'A_COPY/B/E/beta', 'A_COPY/D/H/omega', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update the wcs again.
@@ -473,11 +471,11 @@ def reintegrate_with_rename(sbox):
expected_status.tweak(wc_rev='8')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# Make another change on the branch: copy tau to tauprime. Commit
# in r9.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.repo_url + '/A_COPY/D/G/tau',
sbox.repo_url + '/A_COPY/D/G/tauprime',
'-m',
@@ -499,7 +497,7 @@ def reintegrate_with_rename(sbox):
expected_status.tweak(wc_rev='9')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# *finally*, actually run merge --reintegrate in trunk with the
# branch URL. This should bring in the mu change and the tauprime
@@ -552,7 +550,7 @@ def reintegrate_with_rename(sbox):
k_expected_disk,
k_expected_status,
expected_skip,
- None, True, True)
+ [], True, True)
# Finally, commit the result of the merge (r10).
expected_output = wc.State(wc_dir, {
@@ -565,9 +563,10 @@ def reintegrate_with_rename(sbox):
})
expected_status.tweak('A', 'A/mu', wc_rev=10)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def reintegrate_branch_never_merged_to(sbox):
"merge --reintegrate on a never-updated branch"
@@ -582,7 +581,7 @@ def reintegrate_branch_never_merged_to(sbox):
expected_output = wc.State(wc_dir, {'A_COPY/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A_COPY/mu', contents='Changed on the branch.')
# Update the wcs.
@@ -590,11 +589,11 @@ def reintegrate_branch_never_merged_to(sbox):
expected_status.tweak(wc_rev='7')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# Make another change on the branch: copy tau to tauprime. Commit
# in r8.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
os.path.join(wc_dir, 'A_COPY', 'D', 'G',
'tau'),
os.path.join(wc_dir, 'A_COPY', 'D', 'G',
@@ -604,7 +603,7 @@ def reintegrate_branch_never_merged_to(sbox):
})
expected_status.add({'A_COPY/D/G/tauprime': Item(status=' ', wc_rev=8)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.add({
'A_COPY/D/G/tauprime' : Item(contents="This is the file 'tau'.\n")
})
@@ -615,7 +614,7 @@ def reintegrate_branch_never_merged_to(sbox):
expected_status.tweak(wc_rev='8')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, True)
+ check_props=True)
# *finally*, actually run merge --reintegrate in trunk with the
# branch URL. This should bring in the mu change and the tauprime
@@ -683,7 +682,7 @@ def reintegrate_branch_never_merged_to(sbox):
k_expected_disk,
k_expected_status,
expected_skip,
- None, True, True)
+ [], True, True)
# Finally, commit the result of the merge (r9).
expected_output = wc.State(wc_dir, {
@@ -696,9 +695,10 @@ def reintegrate_branch_never_merged_to(sbox):
})
expected_status.tweak('A', 'A/mu', wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def reintegrate_fail_on_modified_wc(sbox):
"merge --reintegrate should fail in modified wc"
sbox.build()
@@ -714,14 +714,16 @@ def reintegrate_fail_on_modified_wc(sbox):
sbox.simple_commit()
svntest.main.file_write(mu_path, "Changed on 'trunk' (the merge target).")
+ expected_skip = wc.State(wc_dir, {})
sbox.simple_update() # avoid mixed-revision error
run_and_verify_reintegrate(
A_path, sbox.repo_url + '/A_COPY', None, None, None,
- None, None, None,
+ None, None, expected_skip,
".*Cannot merge into a working copy that has local modifications.*",
True, False)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def reintegrate_fail_on_mixed_rev_wc(sbox):
"merge --reintegrate should fail in mixed-rev wc"
sbox.build()
@@ -736,15 +738,17 @@ def reintegrate_fail_on_mixed_rev_wc(sbox):
})
expected_status.tweak('A/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
+ expected_skip = wc.State(wc_dir, {})
# Try merging into that same wc, expecting failure.
run_and_verify_reintegrate(
A_path, sbox.repo_url + '/A_COPY', None, None, None,
- None, None, None,
+ None, None, expected_skip,
".*Cannot merge into mixed-revision working copy.*",
True, False)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def reintegrate_fail_on_switched_wc(sbox):
"merge --reintegrate should fail in switched wc"
sbox.build()
@@ -801,18 +805,20 @@ def reintegrate_fail_on_switched_wc(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
sbox.simple_update() # avoid mixed-revision error
+ expected_skip = wc.State(wc_dir, {})
run_and_verify_reintegrate(
A_path, sbox.repo_url + '/A_COPY', None, None, None,
- None, None, None,
+ None, None, expected_skip,
".*Cannot merge into a working copy with a switched subtree.*",
True, False)
#----------------------------------------------------------------------
# Test for issue #3603 'allow reintegrate merges into WCs with
# missing subtrees'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3603)
def reintegrate_on_shallow_wc(sbox):
"merge --reintegrate in shallow wc"
@@ -840,8 +846,8 @@ def reintegrate_on_shallow_wc(sbox):
# depth of A/D to empty. Since the only change made on the branch
# since the branch point is to A_COPY/mu, the reintegrate should
# simply work and update A/mu with the branch's contents.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth', 'empty', A_D_path)
expected_output = wc.State(A_path, {
'mu' : Item(status='U '),
@@ -886,13 +892,13 @@ def reintegrate_on_shallow_wc(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, 1, 1)
+ [], 1, 1)
# Now revert the reintegrate and make a second change on the
# branch in r4, but this time change a subtree that corresponds
# to the missing (shallow) portion of the source. The reintegrate
# should still succeed.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.main.file_write(psi_COPY_path, "more branch work")
svntest.main.run_svn(None, 'commit', '-m',
'Some more work on the A_COPY branch', wc_dir)
@@ -923,7 +929,7 @@ def reintegrate_on_shallow_wc(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, 1, 1)
+ [], 1, 1)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -935,10 +941,10 @@ def reintegrate_fail_on_stale_source(sbox):
A_path = sbox.ospath('A')
mu_path = os.path.join(A_path, "mu")
svntest.main.file_append(mu_path, 'some text appended to mu\n')
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'a change to mu', mu_path)
# Unmix the revisions in the working copy.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# The merge --reintegrate succeeds but since there were no changes
# on A_COPY after it was branched the only result is updated mergeinfo
# on the reintegrate target.
@@ -1003,6 +1009,7 @@ def reintegrate_fail_on_stale_source(sbox):
[], True, True)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def merge_file_with_space_in_its_path(sbox):
"merge a file with space in its path"
@@ -1016,17 +1023,17 @@ def merge_file_with_space_in_its_path(sbox):
os.mkdir(some_dir)
svntest.main.file_append(file1, "Initial text in the file.\n")
svntest.main.run_svn(None, "add", some_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r2", wc_dir)
# Make r3.
svntest.main.run_svn(None, "copy", file1, file2)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r3", wc_dir)
# Make r4.
svntest.main.file_append(file2, "Next line of text in the file.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r4", wc_dir)
target_url = sbox.repo_url + '/some%20dir/file2'
@@ -1096,16 +1103,15 @@ def reintegrate_with_subtree_mergeinfo(sbox):
expected_output = wc.State(wc_dir, {'A_COPY_3/D/gamma' : Item(verb='Sending')})
expected_status.tweak('A_COPY_3/D/gamma', wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r10 - Merge r9 from A_COPY_3/D to A/D, creating explicit subtree
# mergeinfo under A. For this and every subsequent merge we update the WC
# first to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
expected_status.tweak(wc_rev=9)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[9]],
['U ' + gamma_path + '\n',
' U ' + D_path + '\n',]),
@@ -1115,21 +1121,20 @@ def reintegrate_with_subtree_mergeinfo(sbox):
'A/D/gamma' : Item(verb='Sending')})
expected_status.tweak('A/D', 'A/D/gamma', wc_rev=10)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r11 - Make a text change to A_COPY_2/mu
svntest.main.file_write(mu_COPY_2_path, "New content")
expected_output = wc.State(wc_dir, {'A_COPY_2/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY_2/mu', wc_rev=11)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r12 - Merge r11 from A_COPY_2/mu to A_COPY/mu
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(11), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(11), [], 'up',
wc_dir)
expected_status.tweak(wc_rev=11)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[11]],
['U ' + mu_COPY_path + '\n',
' U ' + mu_COPY_path + '\n',]),
@@ -1138,15 +1143,14 @@ def reintegrate_with_subtree_mergeinfo(sbox):
{'A_COPY/mu' : Item(verb='Sending')})
expected_status.tweak('A_COPY/mu', wc_rev=12)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r13 - Do a 'synch' cherry harvest merge of all available revisions
# from A to A_COPY
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(12), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(12), [], 'up',
wc_dir)
expected_status.tweak(wc_rev=12)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2,12]],
['U ' + beta_COPY_path + '\n',
'U ' + gamma_COPY_path + '\n',
@@ -1176,17 +1180,17 @@ def reintegrate_with_subtree_mergeinfo(sbox):
'A_COPY/D/gamma',
wc_rev=13)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r14 - Make a text change on A_COPY/B/E/alpha
svntest.main.file_write(alpha_COPY_path, "New content")
expected_output = wc.State(wc_dir, {'A_COPY/B/E/alpha' : Item(verb='Sending')})
expected_status.tweak('A_COPY/B/E/alpha', wc_rev=14)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now, reintegrate A_COPY to A. This should succeed.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(14), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(14), [], 'up',
wc_dir)
expected_status.tweak(wc_rev=14)
expected_output = wc.State(A_path, {
@@ -1256,7 +1260,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, 1, 1)
+ [], 1, 1)
# Make some more changes to A_COPY so that the same revisions have *not*
# been uniformly applied from A to A_COPY. In this case the reintegrate
@@ -1275,12 +1279,11 @@ def reintegrate_with_subtree_mergeinfo(sbox):
# A_COPY_2 3-------------[11]--
# First revert the previous reintegrate merge
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', wc_dir)
# r15 - Reverse Merge r8 from A/D to A_COPY/D.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-8]],
['U ' + omega_COPY_path + '\n',
' U ' + D_COPY_path + '\n',]),
@@ -1290,7 +1293,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
'A_COPY/D/H/omega' : Item(verb='Sending')})
expected_status.tweak('A_COPY/D', 'A_COPY/D/H/omega', wc_rev=15)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now reintegrate A_COPY back to A. Since A_COPY/D no longer has r8 merged
# to it from A, the merge should fail. Further we expect an error message
@@ -1325,7 +1328,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
#
# D) Synch merge the changes in C) from 'trunk' to 'branch' and commit in
# rev N+3. The renamed subtree on 'branch' now has additional explicit
- # mergeinfo decribing the synch merge from trunk@N+1 to trunk@N+2.
+ # mergeinfo describing the synch merge from trunk@N+1 to trunk@N+2.
#
# E) Reintegrate 'branch' to 'trunk'.
#
@@ -1345,12 +1348,12 @@ def reintegrate_with_subtree_mergeinfo(sbox):
# r874258 WC-to-WC moves won't create mergeinfo on the dest if the source
# doesn't have any. So do a repos-to-repos move so explicit mergeinfo
# *is* created on the destination.
- svntest.actions.run_and_verify_svn(None, None,[], 'move',
+ svntest.actions.run_and_verify_svn(None,[], 'move',
sbox.repo_url + '/A/D/gamma',
sbox.repo_url + '/A/D/gamma_moved',
'-m', 'REPOS-to-REPOS move'
)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_status.tweak(wc_rev=16)
expected_status.remove('A/D/gamma')
expected_status.add({'A/D/gamma_moved' : Item(status=' ', wc_rev=16)})
@@ -1365,7 +1368,6 @@ def reintegrate_with_subtree_mergeinfo(sbox):
# behavior pass.
# r17 - B) Synch merge from A to A_COPY
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[8], [13,16], [2,16]],
['U ' + omega_COPY_path + '\n',
'A ' + gamma_moved_COPY_path + '\n',
@@ -1391,18 +1393,17 @@ def reintegrate_with_subtree_mergeinfo(sbox):
wc_rev=17)
expected_status.add({'A_COPY/D/gamma_moved' : Item(status=' ', wc_rev=17)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r18 - C) Text mod to A/D/gamma_moved
svntest.main.file_write(gamma_moved_path, "Even newer content")
expected_output = wc.State(wc_dir, {'A/D/gamma_moved' : Item(verb='Sending')})
expected_status.tweak('A/D/gamma_moved', wc_rev=18)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r19 - D) Synch merge from A to A_COPY
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[17,18], [2,18]],
['U ' + gamma_moved_COPY_path + '\n',
' U ' + A_COPY_path + '\n',
@@ -1420,7 +1421,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
'A_COPY/D/gamma_moved',
wc_rev=19)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Reintegrate A_COPY to A, this should work since
# A_COPY/D/gamma_moved's natural history,
@@ -1430,7 +1431,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
# /A_COPY/D/gamma_moved:17-19
#
# shows that it is fully synched up with trunk.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(19), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(19), [], 'up',
wc_dir)
expected_output = wc.State(A_path, {
'B/E/alpha' : Item(status='U '),
@@ -1528,7 +1529,7 @@ def reintegrate_with_subtree_mergeinfo(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, 1, 1)
+ [], 1, 1)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -1555,71 +1556,71 @@ def multiple_reintegrates_from_the_same_branch(sbox):
# the reintegrate target.
#
# r7 - Create the feature branch.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A_path, Feature_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'Make a feature branch',
wc_dir)
# r8 - Make a change under 'A'.
svntest.main.file_write(mu_path, "New trunk content.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"A text change under 'A'",
wc_dir)
# r9 - Make a change on the feature branch.
svntest.main.file_write(Feature_beta_path, "New branch content.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"A text change on the feature branch",
wc_dir)
# r10 - Sync merge all changes from 'A' to the feature branch.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A',
Feature_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"Sync merge 'A' to feature branch",
wc_dir)
# r11 - Reintegrate the feature branch back to 'A'.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
run_reintegrate(sbox.repo_url + '/A_FEATURE_BRANCH', A_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"Reintegrate feature branch back to 'A'",
wc_dir)
# r12 - Do a --record-only merge from 'A' to the feature branch so we
# don't try to merge r11 from trunk during the next sync merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c11',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c11',
'--record-only',
sbox.repo_url + '/A',
Feature_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"Sync merge 'A' to feature branch",
wc_dir)
# r13 - Make another change on the feature branch.
svntest.main.file_write(Feature_beta_path, "Even newer branch content.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"Different text on the feature branch",
wc_dir)
# r14 - Sync merge all changes from 'A' to the feature branch in
# preparation for a second reintegrate from this branch.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A',
Feature_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"2nd Sync merge 'A' to feature branch",
wc_dir)
# r15 - Reintegrate the feature branch back to 'A' a second time.
# No self-referential mergeinfo should be applied on 'A'.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_path, {
#'' : Item(status=' U'), #<-- no self-referential mergeinfo applied!
'B/E/beta' : Item(status='U '),
@@ -1685,25 +1686,24 @@ def multiple_reintegrates_from_the_same_branch(sbox):
expected_disk,
expected_status,
expected_skip,
- None, 1, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ [], 1, 1)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"2nd Reintegrate feature branch back to 'A'",
wc_dir)
# Demonstrate the danger of any self-referential mergeinfo on trunk.
#
# Merge all available revisions except r3 from 'A' to 'A_COPY'.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-r3:HEAD',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-r3:HEAD',
sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
"Merge -r3:HEAD from 'A' to 'A_COPY'",
wc_dir)
# No self-referential mergeinfo should have been carried on 'A_COPY' from
# 'A' that would prevent the following merge from being operative.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2,3],[2,16]],
['U ' + psi_COPY_path + '\n',
' U ' + A_COPY_path + '\n',]),
@@ -1716,6 +1716,7 @@ def multiple_reintegrates_from_the_same_branch(sbox):
#
# Also tests Issue #3591 'reintegrate merges update subtree mergeinfo
# unconditionally'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3591)
def reintegrate_with_self_referential_mergeinfo(sbox):
"source has target's history as explicit mergeinfo"
@@ -1735,38 +1736,38 @@ def reintegrate_with_self_referential_mergeinfo(sbox):
# r6 Copy A to A2 and then manually set some self-referential mergeinfo on
# A2/B and A2.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(5), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(5), [],
'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A_path, A2_path)
# /A:3 describes A2's natural history, a.k.a. it's implicit mergeinfo, so
# it is self-referential. Same for /A/B:4 and A2/B. Normally this is
# redundant but not harmful.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:mergeinfo', '/A:3', A2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:mergeinfo', '/A/B:4', A2_B_path)
svntest.actions.run_and_verify_svn(
- None, None, [], 'ci', '-m',
+ None, [], 'ci', '-m',
'copy A to A2 and set some self-referential mergeinfo on the latter.',
wc_dir)
# r7 Copy A2 to A2.1
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A2_path, A2_1_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'copy A2to A2.1.', wc_dir)
# r8 Make a change on A2.1/mu
svntest.main.file_write(A2_1_mu_path, 'New A2.1 stuff')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Work done on the A2.1 branch.',
wc_dir)
# Update to uniform revision and reintegrate A2.1 back to A2.
# Note that the mergeinfo on A2/B is not changed by the reintegration
# and so is not expected to by updated to describe the merge.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
expected_output = wc.State(A2_path, {
'mu' : Item(status='U '),
@@ -1841,7 +1842,7 @@ def reintegrate_with_self_referential_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, 1, 0)
+ [], 1, 0)
#----------------------------------------------------------------------
# Test for issue #3577 '1.7 subtree mergeinfo recording breaks reintegrate'
@@ -1877,20 +1878,20 @@ def reintegrate_with_subtree_merges(sbox):
# from A to A_COPY, but do it via subtree merges so the mergeinfo
# record of the merges insn't neatly reflected in the root of the
# branch. Commit the merge as r8.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c5',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c5',
sbox.repo_url + '/A/B',
B_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c4',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c4',
sbox.repo_url + '/A/D/G/rho',
rho_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c3',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c3',
sbox.repo_url + '/A/D/H',
H_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c6',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c6',
sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'commit', '-m',
'Merge everything from A to A_COPY',
wc_dir)
@@ -1915,7 +1916,7 @@ def reintegrate_with_subtree_merges(sbox):
# Missing ranges: /A/D/G/rho:2-3,5-6
# A_COPY/D/H
# Missing ranges: /A/D/H:2,4-5
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_path, {
'mu' : Item(status='U '),
})
@@ -1976,14 +1977,14 @@ def reintegrate_with_subtree_merges(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, 1, 1)
+ [], 1, 1)
# Test issue #4329. Revert previous merge and commit a new edit to
# A/D/H/psi. Attempt the same merge without the --reintegrate option.
# It should succeed because the automatic merge code should detect that
# a reintegrate-style merge is required, that merge should succeed and
# there should be not conflict on A/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.main.file_write(psi_path, "Non-conflicting trunk edit.\n")
svntest.main.run_svn(None, 'commit', '-m',
'An edit on trunk prior to reintegrate.', wc_dir)
@@ -1997,11 +1998,12 @@ def reintegrate_with_subtree_merges(sbox):
expected_mergeinfo_output,
expected_elision_output,
expected_A_disk, expected_A_status,
- expected_A_skip, None, None, None,
- None, None, True, False, A_path)
+ expected_A_skip,
+ [], True, False, A_path)
#----------------------------------------------------------------------
# Test for issue #3654 'added subtrees with mergeinfo break reintegrate'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3654)
def added_subtrees_with_mergeinfo_break_reintegrate(sbox):
"added subtrees with mergeinfo break reintegrate"
@@ -2024,93 +2026,93 @@ def added_subtrees_with_mergeinfo_break_reintegrate(sbox):
# r8 - Add a new file A_COPY_2/C/nu.
svntest.main.file_write(nu_COPY_2_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_COPY_2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Add new file in A_COPY_2 branch',
wc_dir)
# r9 - Cyclic cherry pick merge r8 from A_COPY_2 back to A.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', '-c', '8',
sbox.repo_url + '/A_COPY_2',
A_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Merge r8 from A_COPY_2 to A.',
wc_dir)
# r10 - Make an edit to A_COPY_2/C/nu.
svntest.main.file_write(nu_COPY_2_path, "A_COPY_2 edit to file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Edit new file on A_COPY_2 branch',
wc_dir)
# r11 - Cyclic subtree cherry pick merge r10 from A_COPY_2/C/nu
# back to A/C/nu.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', '-c', '10',
sbox.repo_url + '/A_COPY_2/C/nu',
nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r8 from A_COPY_2/C/nu to A/C/nu.',
wc_dir)
# r12 - Edit under A_COPY.
svntest.main.file_write(mu_path, "mu edits on A_COPY.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Work on A_COPY branch.',
wc_dir)
# r13 - Sync merge A to A_COPY in preparation for reintegrate.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Prep for reintegrate: Sync A to A_COPY.',
wc_dir)
# r14 - Reintegrate A_COPY to A.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
run_reintegrate(sbox.repo_url + '/A_COPY', A_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Reintegrate A_COPY to A.',
wc_dir)
# r15 - Delete A_COPY.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'delete', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Delete A_COPY branch', wc_dir)
# r16 - Create new A_COPY from A@HEAD=15.
#
# Update so we copy HEAD:
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'copy', A_path, A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Create new A_COPY branch from A', wc_dir)
# r17 - Unrelated edits under both A and A_COPY.
svntest.main.file_write(nu_path, "Trunk work on nu.\n")
svntest.main.file_write(lambda_COPY_path, "lambda edit on A_COPY.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Unrelated edits on A and A_COPY branch.',
wc_dir)
# r18 - Sync A to A_COPY in preparation for another reintegrate.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Prep for reintegrate: Sync A to A_COPY.',
wc_dir)
# Reintegrate A_COPY back to A. We just synced A_COPY with A, so this
# should work. The only text change should be the change made to
# A_COPY/B/lambda in r17 after the new A_COPY was created.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_path, {
'' : Item(status=' U'),
'B/lambda' : Item(status='U '),
@@ -2190,11 +2192,12 @@ def added_subtrees_with_mergeinfo_break_reintegrate(sbox):
expected_disk,
expected_status,
expected_skip,
- None, 1, 1)
+ [], 1, 1)
#----------------------------------------------------------------------
# Test for issue #3648 '2-URL merges incorrectly reverse-merge mergeinfo
# for merge target'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3648)
def two_URL_merge_removes_valid_mergeinfo_from_target(sbox):
"2-URL merge removes valid mergeinfo from target"
@@ -2215,42 +2218,40 @@ def two_URL_merge_removes_valid_mergeinfo_from_target(sbox):
# r8 - A simple text edit on the A_COPY branch.
svntest.main.file_write(lambda_COPY_path, "Edit on 'branch 1'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', "Work on 'branch 1'.",
wc_dir)
# r9 - Sync the A_COPY branch with A up the HEAD (r8). Now A_COPY
# differs from A only by the change made in r8 and by the mergeinfo
# '/A:2-8' on A_COPY which was set to describe the merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Sync A to A_COPY.',
wc_dir)
# r10 - A simple text edit on our "trunk" A.
svntest.main.file_write(mu_path, "Edit on 'trunk'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', "Work on 'trunk'",
wc_dir)
# r11 - Sync the A_COPY_2 branch with A up to HEAD (r10).
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'merge', sbox.repo_url + '/A',
A_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Sync A to A_COPY_2.',
wc_dir)
# Confirm that the mergeinfo on each branch is what we expect.
- svntest.actions.run_and_verify_svn(None,
- [A_COPY_path + ' - /A:2-8\n'],
+ svntest.actions.run_and_verify_svn([A_COPY_path + ' - /A:2-8\n'],
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- [A_COPY_2_path + ' - /A:3-10\n'],
+ svntest.actions.run_and_verify_svn([A_COPY_2_path + ' - /A:3-10\n'],
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_2_path)
@@ -2285,7 +2286,7 @@ def two_URL_merge_removes_valid_mergeinfo_from_target(sbox):
#
# Before issue #3648 was fixed this test failed because the valid mergeinfo
# '/A:r3-8' on A_COPY_2 was removed by the merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY_2_path, {
'' : Item(status=' G'),
'B/lambda' : Item(status='U '),
@@ -2349,12 +2350,12 @@ def two_URL_merge_removes_valid_mergeinfo_from_target(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
# Test for issue #3867 'reintegrate merges create mergeinfo for
# non-existent paths'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3867)
def reintegrate_creates_bogus_mergeinfo(sbox):
"reintegrate creates bogus mergeinfo"
@@ -2436,7 +2437,7 @@ def reintegrate_creates_bogus_mergeinfo(sbox):
expected_mergeinfo_output,
expected_elision_output,
expected_disk, None, expected_skip,
- None,
+ [],
1, 1)
@@ -2445,6 +2446,7 @@ def reintegrate_creates_bogus_mergeinfo(sbox):
# subtree mergeinfo is reintegrated into a target with subtree
# mergeinfo. Deliberately written in a style that works with the 1.6
# testsuite.
+@SkipUnless(server_has_mergeinfo)
@Issue(3957)
def no_source_subtree_mergeinfo(sbox):
"source without subtree mergeinfo"
@@ -2516,7 +2518,9 @@ def no_source_subtree_mergeinfo(sbox):
svntest.main.run_svn(None, 'update', wc_dir)
# Verify that merge results in no subtree mergeinfo
- svntest.actions.run_and_verify_svn(None, [], [], 'propget', 'svn:mergeinfo',
+ expected_stderr = '.*W200017: Property.*not found'
+ svntest.actions.run_and_verify_svn([], expected_stderr,
+ 'propget', 'svn:mergeinfo',
sbox.repo_url + '/A/B2/E')
# Merge trunk to branch-2
@@ -2525,7 +2529,8 @@ def no_source_subtree_mergeinfo(sbox):
svntest.main.run_svn(None, 'update', wc_dir)
# Verify that there is still no subtree mergeinfo
- svntest.actions.run_and_verify_svn(None, [], [], 'propget', 'svn:mergeinfo',
+ svntest.actions.run_and_verify_svn([], expected_stderr,
+ 'propget', 'svn:mergeinfo',
sbox.repo_url + '/A/B2/E')
# Reintegrate branch-2 to trunk, this fails in 1.6.x from 1.6.13.
@@ -2558,7 +2563,7 @@ def no_source_subtree_mergeinfo(sbox):
expected_output, expected_mergeinfo,
expected_elision, expected_disk,
None, expected_skip,
- None,
+ [],
1, 1)
#----------------------------------------------------------------------
@@ -2584,13 +2589,13 @@ def reintegrate_replaced_source(sbox):
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
'-c3')
- svntest.main.run_svn(None, 'ci', '-m', 'Merge r3 from A to A_COPY', wc_dir)
+ sbox.simple_commit(message='Merge r3 from A to A_COPY')
# r8 - Merge r4 from A to A_COPY
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
'-c4')
- svntest.main.run_svn(None, 'ci', '-m', 'Merge r4 from A to A_COPY', wc_dir)
+ sbox.simple_commit(message='Merge r4 from A to A_COPY')
# r9 - Merge r5 from A to A_COPY. Make an additional edit to
# A_COPY/B/E/beta.
@@ -2598,7 +2603,7 @@ def reintegrate_replaced_source(sbox):
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path,
'-c5')
svntest.main.file_write(beta_COPY_path, "Branch edit mistake.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Merge r5 from A to A_COPY', wc_dir)
+ sbox.simple_commit(message='Merge r5 from A to A_COPY')
# r10 - Delete A_COPY and replace it with A_COPY@8. This removes the edit
# we made above in r9 to A_COPY/B/E/beta.
@@ -2606,19 +2611,17 @@ def reintegrate_replaced_source(sbox):
svntest.main.run_svn(None, 'delete', A_COPY_path)
svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A_COPY@8',
A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Replace A_COPY with A_COPY@8',
- wc_dir)
+ sbox.simple_commit(message='Replace A_COPY with A_COPY@8')
# r11 - Make an edit on A_COPY/mu.
svntest.main.file_write(mu_COPY_path, "Branch edit.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Branch edit',
- wc_dir)
+ sbox.simple_commit(message='Branch edit')
# r12 - Do a final sync merge of A to A_COPY in preparation for
# reintegration.
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Sycn A_COPY with A', wc_dir)
+ sbox.simple_commit(message='Sync A_COPY with A')
# Reintegrate A_COPY to A. The resulting mergeinfo should be
# '/A_COPY:2-8,10-12' because of the replacement which removed /A_COPY:9
@@ -2688,6 +2691,7 @@ def reintegrate_replaced_source(sbox):
#----------------------------------------------------------------------
@SkipUnless(svntest.main.is_posix_os)
+@SkipUnless(server_has_mergeinfo)
@Issue(4052)
def reintegrate_symlink_deletion(sbox):
"reintegrate symlink deletion"
@@ -2724,6 +2728,7 @@ def reintegrate_symlink_deletion(sbox):
run_reintegrate(A_COPY_url, A_path)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def no_op_reintegrate(sbox):
"""no-op reintegrate"""
@@ -2744,6 +2749,7 @@ def no_op_reintegrate(sbox):
run_reintegrate(sbox.repo_url + '/A_COPY', A_path)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
def renamed_branch_reintegrate(sbox):
"""reintegrate a branch that has been renamed"""
@@ -2782,6 +2788,38 @@ def renamed_branch_reintegrate(sbox):
# ### TODO: Check the result more carefully than merely that it completed.
run_reintegrate(sbox.repo_url + '/RENAMED@8', A_path)
+@SkipUnless(server_has_mergeinfo)
+def reintegrate_noop_branch_into_renamed_branch(sbox):
+ """reintegrate no-op branch into renamed branch"""
+ # In this test, the branch has no unique changes but contains a
+ # revision cherry-picked from trunk. Reintegrating such a branch
+ # should work, but used to error out when this test was written.
+
+ # Make A_COPY branch in r2, and do a few more commits to A in r3-6.
+ sbox.build()
+
+ wc_dir = sbox.wc_dir
+ A_path = sbox.ospath('A')
+ A_COPY_path = sbox.ospath('A_COPY')
+ expected_disk, expected_status = set_up_branch(sbox)
+
+ # Cherry-pick merge from trunk to branch
+ youngest_rev = sbox.youngest()
+ svntest.main.run_svn(None, 'merge', '-c', youngest_rev,
+ sbox.repo_url + '/A', A_COPY_path)
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # Rename the trunk
+ sbox.simple_move('A', 'A_RENAMED')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # Try to reintegrate the branch. This should work but used to fail with:
+ # svn: E160013: File not found: revision 5, path '/A_RENAMED'
+ run_reintegrate(sbox.repo_url + '/A_COPY', sbox.ospath('A_RENAMED'))
+
+
########################################################################
# Run the tests
@@ -2809,6 +2847,7 @@ test_list = [ None,
reintegrate_symlink_deletion,
no_op_reintegrate,
renamed_branch_reintegrate,
+ reintegrate_noop_branch_into_renamed_branch,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/merge_tests.py b/subversion/tests/cmdline/merge_tests.py
index d116118..4321e37 100755
--- a/subversion/tests/cmdline/merge_tests.py
+++ b/subversion/tests/cmdline/merge_tests.py
@@ -51,86 +51,16 @@ from svntest.actions import make_conflict_marker_text
from svntest.actions import inject_conflict_into_expected_state
from svntest.verify import RegexListOutput
-def expected_merge_output(rev_ranges, additional_lines=[], foreign=False,
- elides=False, two_url=False, target=None,
- text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
- text_resolved=0, prop_resolved=0, tree_resolved=0,
- skipped_paths=0):
- """Generate an (inefficient) regex representing the expected merge
- output and mergeinfo notifications from REV_RANGES and ADDITIONAL_LINES.
-
- REV_RANGES is a list of revision ranges for which mergeinfo is being
- recorded. Each range is of the form [start, end] (where both START and
- END are inclusive, unlike in '-rX:Y') or the form [single_rev] (which is
- like '-c SINGLE_REV'). If REV_RANGES is None then only the standard
- notification for a 3-way merge is expected.
-
- ADDITIONAL_LINES is a list of strings to match the other lines of output;
- these are basically regular expressions except that backslashes will be
- escaped herein. If ADDITIONAL_LINES is a single string, it is interpreted
- the same as a list containing that string.
-
- If ELIDES is true, add to the regex an expression representing elision
- notification. If TWO_URL is true, tweak the regex to expect the
- appropriate mergeinfo notification for a 3-way merge.
-
- TARGET is the local path to the target, as it should appear in
- notifications; if None, it is not checked.
-
- TEXT_CONFLICTS, PROP_CONFLICTS, TREE_CONFLICTS and SKIPPED_PATHS specify
- the number of each kind of conflict to expect.
- """
-
- if rev_ranges is None:
- lines = [svntest.main.merge_notify_line(None, None, False, foreign)]
- else:
- lines = []
- for rng in rev_ranges:
- start_rev = rng[0]
- if len(rng) > 1:
- end_rev = rng[1]
- else:
- end_rev = None
- lines += [svntest.main.merge_notify_line(start_rev, end_rev,
- True, foreign, target)]
- lines += [svntest.main.mergeinfo_notify_line(start_rev, end_rev, target)]
-
- if (elides):
- lines += ["--- Eliding mergeinfo from .*\n"]
-
- if (two_url):
- lines += ["--- Recording mergeinfo for merge between repository URLs .*\n"]
-
- # Address "The Backslash Plague"
- #
- # If ADDITIONAL_LINES are present there are possibly paths in it with
- # multiple components and on Windows these components are separated with
- # '\'. These need to be escaped properly in the regexp for the match to
- # work correctly. See http://aspn.activestate.com/ASPN/docs/ActivePython
- # /2.2/howto/regex/regex.html#SECTION000420000000000000000.
- if isinstance(additional_lines, str):
- additional_lines = [additional_lines]
- if sys.platform == 'win32':
- additional_lines = [line.replace("\\", "\\\\") for line in additional_lines]
- lines += additional_lines
-
- lines += svntest.main.summary_of_conflicts(
- text_conflicts, prop_conflicts, tree_conflicts,
- text_resolved, prop_resolved, tree_resolved,
- skipped_paths,
- as_regex=True)
-
- return "|".join(lines)
-
-def check_mergeinfo_recursively(root_path, subpaths_mergeinfo):
- """Check that the mergeinfo properties on and under ROOT_PATH are those in
- SUBPATHS_MERGEINFO, a {path: mergeinfo-prop-val} dictionary."""
- expected = svntest.verify.UnorderedOutput(
- [path + ' - ' + subpaths_mergeinfo[path] + '\n'
- for path in subpaths_mergeinfo])
- svntest.actions.run_and_verify_svn(None, expected, [],
- 'propget', '-R', SVN_PROP_MERGEINFO,
- root_path)
+from svntest.mergetrees import expected_merge_output, \
+ check_mergeinfo_recursively, \
+ set_up_dir_replace, \
+ set_up_branch, \
+ local_path, \
+ svn_mkfile, \
+ svn_modfile, \
+ svn_copy, \
+ svn_merge, \
+ noninheritable_mergeinfo_test_set_up
######################################################################
# Tests
@@ -224,9 +154,7 @@ def textual_merges_galore(sbox):
# Initial commit.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make the "other" working copy
other_wc = sbox.add_wc_path('other')
@@ -260,9 +188,7 @@ def textual_merges_galore(sbox):
# Commit revision 3.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make local mods in wc.other
other_pi_path = os.path.join(other_wc, 'A', 'D', 'G', 'pi')
@@ -278,7 +204,7 @@ def textual_merges_galore(sbox):
# We skip A/D/G/rho in this merge; it will be tested with a separate
# merge command. Temporarily put it back to revision 1, so this
# merge succeeds cleanly.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1', other_rho_path)
# For A/D/G/tau, we append few different lines, to conflict with the
@@ -317,7 +243,7 @@ def textual_merges_galore(sbox):
inject_conflict_into_expected_state('A/D/G/tau', expected_disk,
expected_status, other_tau_text, tau_text,
- 3)
+ 1, 3)
expected_skip = wc.State('', { })
@@ -333,12 +259,9 @@ def textual_merges_galore(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- svntest.tree.detect_conflict_files,
- (list(tau_conflict_support_files)),
- None, None, False, True,
- '--allow-mixed-revisions',
- other_wc)
+ [], False, True,
+ '--allow-mixed-revisions', other_wc,
+ extra_files=list(tau_conflict_support_files))
# Now reverse merge r3 into A/D/G/rho, give it non-conflicting local
# mods, then merge in the 2:3 change. ### Not bothering to do the
@@ -350,7 +273,6 @@ def textual_merges_galore(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-3]],
['G ' + other_rho_path + '\n',
' G ' + other_rho_path + '\n',]),
@@ -406,7 +328,7 @@ def textual_merges_galore(sbox):
})
inject_conflict_into_expected_state('tau', expected_disk, expected_status,
- other_tau_text, tau_text, 3)
+ other_tau_text, tau_text, 1, 3)
# Do the merge, but check svn:mergeinfo props separately since
# run_and_verify_merge would attempt to proplist tau's conflict
@@ -421,11 +343,10 @@ def textual_merges_galore(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- svntest.tree.detect_conflict_files, list(tau_conflict_support_files))
+ extra_files=list(tau_conflict_support_files))
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
'propget', SVN_PROP_MERGEINFO,
os.path.join(other_wc,
"A", "D", "G", "rho"))
@@ -481,9 +402,7 @@ def add_with_history(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
expected_output = wc.State(C_path, {
'Q' : Item(status='A '),
@@ -533,8 +452,7 @@ def add_with_history(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1) # check props
+ check_props=True)
expected_output = svntest.wc.State(wc_dir, {
'A/C' : Item(verb='Sending'),
@@ -561,9 +479,7 @@ def add_with_history(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Issue 953
@@ -580,14 +496,14 @@ def simple_property_merges(sbox):
beta_path = sbox.ospath('A/B/E/beta')
E_path = sbox.ospath('A/B/E')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
alpha_path)
# A binary, non-UTF8 property value
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo\201val',
beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
E_path)
@@ -601,31 +517,30 @@ def simple_property_merges(sbox):
expected_status.tweak('A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Copy B to B2 as rev 3
B_url = sbox.repo_url + '/A/B'
B2_url = sbox.repo_url + '/A/B2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', '-m', 'copy B to B2',
B_url, B2_url)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Modify a property and add a property for the file and directory
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'mod_foo', alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar_val', alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'mod\201foo', beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar\201val', beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'mod_foo', E_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'bar', 'bar_val', E_path)
# Commit change as rev 4
@@ -641,9 +556,8 @@ def simple_property_merges(sbox):
'A/B2/lambda' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
pristine_status = expected_status
pristine_status.tweak(wc_rev=4)
@@ -689,10 +603,10 @@ def simple_property_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Revert merge
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
svntest.actions.run_and_verify_status(wc_dir, pristine_status)
@@ -710,13 +624,15 @@ def simple_property_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
def error_message(property, old_value, new_value):
return "Trying to change property '%s'\n" \
"but the property has been locally deleted.\n" \
- "<<<<<<< (local property value)\n=======\n" \
- "%s>>>>>>> (incoming property value)\n" % (property, new_value)
+ "<<<<<<< (local property value)\n" \
+ "||||||| (incoming 'changed from' value)\n" \
+ "%s=======\n" \
+ "%s>>>>>>> (incoming 'changed to' value)\n" % (property, old_value, new_value)
# Merge B 3:4 into B2 now causes a conflict
expected_disk.add({
@@ -726,7 +642,7 @@ def simple_property_merges(sbox):
'E/alpha.prej'
: Item(error_message('foo', 'foo_val', 'mod_foo')),
'E/beta.prej'
- : Item(error_message('foo', 'foo?\\129val', 'mod?\\129foo')),
+ : Item(error_message('foo', 'foo?\\81val', 'mod?\\81foo')),
})
expected_disk.tweak('E', 'E/alpha', props={'bar' : 'bar_val'})
expected_disk.tweak('E/beta', props={'bar' : 'bar\201val'})
@@ -742,25 +658,25 @@ def simple_property_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# issue 1109 : single file property merge. This test performs a merge
# that should be a no-op (adding properties that are already present).
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
svntest.actions.run_and_verify_status(wc_dir, pristine_status)
# Copy A at rev 4 to A2 to make revision 5.
A_url = sbox.repo_url + '/A'
A2_url = sbox.repo_url + '/A2'
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 5.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 5.\n'], [],
'copy', '-m', 'copy A to A2',
A_url, A2_url)
# Re-root the WC at A2.
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
A2_url, wc_dir)
# Attempt to re-merge rev 4 of the original A's alpha. Mergeinfo
@@ -770,10 +686,10 @@ def simple_property_merges(sbox):
alpha_path = sbox.ospath('B/E/alpha')
# Cannot use run_and_verify_merge with a file target
- svntest.actions.run_and_verify_svn(None, [], [], 'merge', '-r', '3:4',
+ svntest.actions.run_and_verify_svn([], [], 'merge', '-r', '3:4',
alpha_url, alpha_path)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'pl', alpha_path)
saw_foo = 0
@@ -832,10 +748,10 @@ def merge_similar_unrelated_trees(sbox):
os.rename(os.path.join(base2_path, 'A', 'B', 'beta'),
os.path.join(base2_path, 'A', 'B', 'zeta'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', base1_path, base2_path, apply_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'rev 2', wc_dir)
expected_output = wc.State(apply_path, {
@@ -846,7 +762,7 @@ def merge_similar_unrelated_trees(sbox):
# run_and_verify_merge doesn't support 'svn merge URL URL path'
### TODO: We can use run_and_verify_merge() here now.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge',
'--ignore-ancestry',
base1_url, base2_url,
@@ -890,12 +806,10 @@ def merge_one_file_helper(sbox, arg_flav, record_only = 0):
expected_status.tweak('A/D/G/rho', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Backdate rho to revision 1, so we can merge in the rev 2 changes.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1', rho_path)
# Try one merge with an explicit target; it should succeed.
@@ -904,21 +818,18 @@ def merge_one_file_helper(sbox, arg_flav, record_only = 0):
# right. I think something is still assuming a directory target.
if arg_flav == 'r':
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2]],
['U ' + rho_path + '\n',
' U ' + rho_path + '\n']),
[], 'merge', '-r', '1:2', rho_url, rho_path)
elif arg_flav == 'c':
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2]],
['U ' + rho_path + '\n',
' U ' + rho_path + '\n']),
[], 'merge', '-c', '2', rho_url, rho_path)
elif arg_flav == '*':
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2]],
['U ' + rho_path + '\n',
' U ' + rho_path + '\n']),
@@ -934,7 +845,7 @@ def merge_one_file_helper(sbox, arg_flav, record_only = 0):
raise svntest.Failure("Unexpected text in merged '" + rho_path + "'")
# Restore rho to pristine revision 1, for another merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', rho_path)
expected_status.tweak('A/D/G/rho', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -962,7 +873,7 @@ def merge_one_file_helper(sbox, arg_flav, record_only = 0):
rho_expected_status = 'MM'
merge_cmd.append(rho_url)
- svntest.actions.run_and_verify_svn(None, expected_output, [], *merge_cmd)
+ svntest.actions.run_and_verify_svn(expected_output, [], *merge_cmd)
# Inspect rho, make sure it's right.
rho_text = svntest.tree.get_text('rho')
@@ -1041,9 +952,7 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
# Initial commit.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make the "other" working copy, at r1
other_wc = sbox.add_wc_path('other')
@@ -1059,15 +968,13 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
# merge using filename for sourcepath
# Cannot use run_and_verify_merge with a file target
if arg_flav == 'r':
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[2]],
['U mu\n',
' U mu\n']),
[],
'merge', '-r', '1:2', 'mu')
elif arg_flav == 'c':
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[2]],
['U mu\n',
' U mu\n']),
[],
@@ -1077,9 +984,8 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
# Without a peg revision, the default merge range of BASE:1 (which
# is a no-op) will be chosen. Let's do it both ways (no-op first,
# of course).
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', 'mu')
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[2]],
+ svntest.actions.run_and_verify_svn(None, [], 'merge', 'mu')
+ svntest.actions.run_and_verify_svn(expected_merge_output([[2]],
['U mu\n',
' U mu\n']),
[],
@@ -1091,8 +997,7 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
# merge using URL for sourcepath
if arg_flav == 'r':
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[-2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[-2]],
['G mu\n',
' U mu\n',
' G mu\n',],
@@ -1100,8 +1005,7 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
[],
'merge', '-r', '2:1', mu_url)
elif arg_flav == 'c':
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[-2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[-2]],
['G mu\n',
' U mu\n',
' G mu\n'],
@@ -1112,8 +1016,7 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
# Implicit merge source URL and revision range detection is for
# forward merges only (e.g. non-reverts). Undo application of
# r2 to enable continuation of the test case.
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[-2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[-2]],
['G mu\n',
' U mu\n',
' G mu\n'],
@@ -1127,6 +1030,7 @@ def merge_with_implicit_target_helper(sbox, arg_flav):
(svntest.tree.get_text('mu'), orig_mu_text))
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
@Issue(785)
def merge_with_implicit_target_using_r(sbox):
"merging a file w/no explicit target path using -r"
@@ -1180,9 +1084,7 @@ def merge_with_prev(sbox):
# Initial commit.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make some other working copies
other_wc = sbox.add_wc_path('other')
@@ -1197,8 +1099,7 @@ def merge_with_prev(sbox):
# Try to revert the last change to mu via svn merge
# Cannot use run_and_verify_merge with a file target
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[-2]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[-2]],
['U mu\n',
' U mu\n'],
elides=True),
@@ -1220,11 +1121,11 @@ def merge_with_prev(sbox):
os.chdir(another_wc)
# ensure 'A' will be at revision 2
- svntest.actions.run_and_verify_svn(None, None, [], 'up')
+ svntest.actions.run_and_verify_svn(None, [], 'up')
# now try a revert on a directory, and verify that it removed the zot
# file we had added previously
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-r', 'COMMITTED:PREV',
'A', 'A')
@@ -1269,8 +1170,7 @@ def merge_binary_file(sbox):
'A/theta' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# Make the "other" working copy
other_wc = sbox.add_wc_path('other')
@@ -1286,8 +1186,7 @@ def merge_binary_file(sbox):
'A/theta' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# In second working copy, attempt to 'svn merge -r 2:3'.
# We should *not* see a conflict during the update, but a 'U'.
@@ -1321,7 +1220,7 @@ def merge_binary_file(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
+ [],
True, True, '--allow-mixed-revisions',
other_wc)
@@ -1340,21 +1239,21 @@ def merge_in_new_file_and_diff(sbox):
trunk_url = sbox.repo_url + '/A/B/E'
# Create a branch
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
trunk_url,
sbox.repo_url + '/branch',
'-m', "Creating the Branch")
# Update to revision 2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
new_file_path = sbox.ospath('A/B/E/newfile')
svntest.main.file_write(new_file_path, "newfile\n")
# Add the new file, and commit revision 3.
- svntest.actions.run_and_verify_svn(None, None, [], "add", new_file_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], "add", new_file_path)
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m',
"Changing the trunk.", wc_dir)
@@ -1396,7 +1295,7 @@ def merge_in_new_file_and_diff(sbox):
expected_output = [
"Index: " + url_branch_path + "/newfile\n",
"===================================================================\n",
- "--- "+ url_branch_path + "/newfile (revision 0)\n",
+ "--- "+ url_branch_path + "/newfile (nonexistent)\n",
"+++ "+ url_branch_path + "/newfile (working copy)\n",
"@@ -0,0 +1 @@\n",
"+newfile\n",
@@ -1409,9 +1308,10 @@ def merge_in_new_file_and_diff(sbox):
"Property changes on: " + url_branch_path + "\n",
"___________________________________________________________________\n",
"Added: " + SVN_PROP_MERGEINFO + "\n",
+ "## -0,0 +0,1 ##\n",
" Merged /A/B/E:r2-3\n",
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'--show-copies-as-adds', branch_path)
@@ -1453,9 +1353,7 @@ def merge_skips_obstructions(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
pre_merge_status = expected_status
@@ -1497,14 +1395,13 @@ def merge_skips_obstructions(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 0)
+ [], True)
# Revert the local mods, and this time make "Q" obstructed. An
# unversioned file called "Q" will obstruct the adding of the
# directory of the same name.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', wc_dir)
os.unlink(os.path.join(C_path, "foo"))
svntest.main.safe_rmtree(os.path.join(C_path, "Q"))
@@ -1540,17 +1437,16 @@ def merge_skips_obstructions(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 0)
+ [], True)
# Revert the local mods, and commit the deletion of iota and A/D/G. (r3)
os.unlink(os.path.join(C_path, "foo"))
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.actions.run_and_verify_status(wc_dir, pre_merge_status)
iota_path = sbox.ospath('iota')
G_path = sbox.ospath('A/D/G')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path, G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota_path, G_path)
expected_output = wc.State(wc_dir, {
'A/D/G' : Item(verb='Deleting'),
@@ -1560,8 +1456,7 @@ def merge_skips_obstructions(sbox):
expected_status.remove('iota', 'A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now create unversioned iota and A/D/G, try running a merge -r2:3.
# The merge process should skip over these targets, since they're
@@ -1601,14 +1496,14 @@ def merge_skips_obstructions(sbox):
expected_disk,
expected_status.copy(wc_dir),
expected_skip,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
wc_dir)
# Revert the local mods, and commit a change to A/B/lambda (r4), and then
# commit the deletion of the same file. (r5)
svntest.main.safe_rmtree(G_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
expected_status.tweak('', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1620,10 +1515,9 @@ def merge_skips_obstructions(sbox):
expected_status.tweak('A/B/lambda', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', lambda_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', lambda_path)
expected_output = wc.State(wc_dir, {
'A/B/lambda' : Item(verb='Deleting'),
@@ -1631,8 +1525,7 @@ def merge_skips_obstructions(sbox):
expected_status.remove('A/B/lambda')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# lambda is gone, so create an unversioned lambda in its place.
# Then attempt to merge -r3:4, which is a change to lambda. The merge
@@ -1666,7 +1559,7 @@ def merge_skips_obstructions(sbox):
expected_disk,
expected_status_short,
expected_skip,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
wc_dir)
@@ -1674,10 +1567,10 @@ def merge_skips_obstructions(sbox):
# working file. Then re-run the -r3:4 merge, and see how svn deals
# with a file being under version control, but missing.
- svntest.actions.run_and_verify_svn(None, None, [], 'add', lambda_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', lambda_path)
# Mergeinfo prop changed so update to avoid out of date error.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(wc_dir, {
'' : Item(verb='Sending'),
@@ -1692,8 +1585,7 @@ def merge_skips_obstructions(sbox):
expected_status.tweak('', status=' ', wc_rev=6)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
os.unlink(lambda_path)
expected_output = wc.State(wc_dir, { })
@@ -1716,7 +1608,7 @@ def merge_skips_obstructions(sbox):
expected_disk,
expected_status.copy(wc_dir),
expected_skip,
- None, None, None, None, None,
+ [],
1, 0, '--ignore-ancestry',
'--allow-mixed-revisions', wc_dir)
@@ -1738,9 +1630,9 @@ def merge_into_missing(sbox):
Q_path = os.path.join(F_path, 'Q')
foo_path = os.path.join(F_path, 'foo')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', Q_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', Q_path)
svntest.main.file_append(foo_path, "foo")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', foo_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', foo_path)
expected_output = wc.State(wc_dir, {
'A/B/F/Q' : Item(verb='Adding'),
@@ -1753,17 +1645,16 @@ def merge_into_missing(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
R_path = os.path.join(Q_path, 'R')
bar_path = os.path.join(R_path, 'bar')
baz_path = os.path.join(Q_path, 'baz')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', R_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', R_path)
svntest.main.file_append(bar_path, "bar")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', bar_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', bar_path)
svntest.main.file_append(baz_path, "baz")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', baz_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', baz_path)
expected_output = wc.State(wc_dir, {
'A/B/F/Q/R' : Item(verb='Adding'),
@@ -1777,8 +1668,7 @@ def merge_into_missing(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
os.unlink(foo_path)
svntest.main.safe_rmtree(Q_path)
@@ -1817,8 +1707,8 @@ def merge_into_missing(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 0, 0, '--dry-run',
+ [], False, False,
+ '--dry-run',
'--ignore-ancestry',
'--allow-mixed-revisions',
F_path)
@@ -1842,8 +1732,7 @@ def merge_into_missing(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 0, 0,
+ [], False, False,
'--ignore-ancestry',
'--allow-mixed-revisions',
F_path)
@@ -1884,8 +1773,8 @@ def dry_run_adds_file_with_prop(sbox):
# Commit a new file which has a property.
zig_path = sbox.ospath('A/B/E/zig')
svntest.main.file_append(zig_path, "zig contents")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', zig_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'add', zig_path)
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
zig_path)
@@ -1898,8 +1787,7 @@ def dry_run_adds_file_with_prop(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Do a regular merge of that change into a different dir.
F_path = sbox.ospath('A/B/F')
@@ -1927,9 +1815,7 @@ def dry_run_adds_file_with_prop(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, # please check props
- 1) # and do a dry-run also)
+ [], True, True)
#----------------------------------------------------------------------
# Regression test for issue #1673
@@ -1966,9 +1852,7 @@ def merge_binary_with_common_ancestry(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Create the first branch
J_path = sbox.ospath('J')
@@ -1985,9 +1869,7 @@ def merge_binary_with_common_ancestry(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Create the path where the files will be merged
K_path = sbox.ospath('K')
@@ -2003,9 +1885,7 @@ def merge_binary_with_common_ancestry(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Copy 'I/theta' to 'K/'. This file will be merged later.
theta_K_path = os.path.join(K_path, 'theta')
@@ -2021,9 +1901,7 @@ def merge_binary_with_common_ancestry(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Modify the original ancestry 'I/theta'
svntest.main.file_append(theta_I_path, "some extra junk")
@@ -2036,9 +1914,7 @@ def merge_binary_with_common_ancestry(sbox):
expected_status.tweak('I/theta', wc_rev=6)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Create the second branch from the modified ancestry
L_path = sbox.ospath('L')
@@ -2056,9 +1932,7 @@ def merge_binary_with_common_ancestry(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None,
- wc_dir)
+ expected_output, expected_status)
# Now merge first ('J/') and second ('L/') branches into 'K/'
saved_cwd = os.getcwd()
@@ -2066,8 +1940,7 @@ def merge_binary_with_common_ancestry(sbox):
os.chdir(K_path)
theta_J_url = sbox.repo_url + '/J/theta'
theta_L_url = sbox.repo_url + '/L/theta'
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(None,
+ svntest.actions.run_and_verify_svn(expected_merge_output(None,
['U theta\n',
' U theta\n',
' G theta\n',],
@@ -2115,11 +1988,11 @@ def merge_funny_chars_on_path(sbox):
target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1],
target[2])
svntest.main.file_append(target_path, "%s/%s" % (target[1], target[2]))
- svntest.actions.run_and_verify_svn(None, None, [], 'add', target_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'add', target_dir)
elif target[0] == 'f':
target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1])
svntest.main.file_append(target_path, "%s" % target[1])
- svntest.actions.run_and_verify_svn(None, None, [], 'add', target_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', target_path)
else:
raise svntest.Failure
@@ -2127,12 +2000,12 @@ def merge_funny_chars_on_path(sbox):
for target in add_by_mkdir:
if target[0] == 'd':
target_dir = os.path.join(wc_dir, 'A', 'B', 'E', target[1])
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', target_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', target_dir)
if target[2]:
target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1],
target[2])
svntest.main.file_append(target_path, "%s/%s" % (target[1], target[2]))
- svntest.actions.run_and_verify_svn(None, None, [], 'add', target_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', target_path)
expected_output_dic = {}
expected_status_dic = {}
@@ -2156,8 +2029,7 @@ def merge_funny_chars_on_path(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Do a regular merge of that change into a different dir.
F_path = sbox.ospath('A/B/F')
@@ -2198,9 +2070,9 @@ def merge_funny_chars_on_path(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 0, # don't check props
- 1) # but do a dry-run
+ [],
+ False, # don't check props
+ True) # but do a dry-run
expected_output_dic = {}
@@ -2216,8 +2088,7 @@ def merge_funny_chars_on_path(sbox):
svntest.actions.run_and_verify_commit(F_path,
expected_output,
- None,
- None, wc_dir)
+ None)
#-----------------------------------------------------------------------
# Regression test for issue #2064
@@ -2236,29 +2107,29 @@ def merge_keyword_expansions(sbox):
os.mkdir(tpath)
svntest.main.run_svn(None, "add", tpath)
# Commit r2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r2", wcpath)
# Copy t to b.
svntest.main.run_svn(None, "cp", tpath, bpath)
# Commit r3
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r3", wcpath)
# Add a file to t.
svntest.main.file_append(t_fpath, "$Revision$")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', t_fpath)
# Ask for keyword expansion in the file.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords', 'Revision',
t_fpath)
# Commit r4
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'r4', wcpath)
# Update the wc before the merge.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wcpath)
expected_status = svntest.actions.get_virginal_state(wcpath, 4)
@@ -2307,7 +2178,7 @@ def merge_prop_change_to_deleted_target(sbox):
# Add a property to alpha.
alpha_path = sbox.ospath('A/B/E/alpha')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
alpha_path)
@@ -2318,13 +2189,12 @@ def merge_prop_change_to_deleted_target(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B/E/alpha', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# Remove alpha entirely.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', alpha_path)
expected_output = wc.State(wc_dir, {
'A/B/E/alpha' : Item(verb='Deleting'),
})
@@ -2333,7 +2203,7 @@ def merge_prop_change_to_deleted_target(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None, alpha_path)
+ [], alpha_path)
# Try merging the original propset, which applies to a target that
# no longer exists. The bug would only reproduce when run from
@@ -2341,123 +2211,10 @@ def merge_prop_change_to_deleted_target(sbox):
# --ignore-ancestry here because our merge logic will otherwise
# prevent a merge of changes we already have.
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn("Merge errored unexpectedly",
- svntest.verify.AnyOutput, [], 'merge',
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [], 'merge',
'-r1:2', '--ignore-ancestry', '.')
#----------------------------------------------------------------------
-def set_up_dir_replace(sbox):
- """Set up the working copy for directory replace tests, creating
- directory 'A/B/F/foo' with files 'new file' and 'new file2' within
- it (r2), and merging 'foo' onto 'C' (r3), then deleting 'A/B/F/foo'
- (r4)."""
-
- sbox.build()
- wc_dir = sbox.wc_dir
-
- C_path = sbox.ospath('A/C')
- F_path = sbox.ospath('A/B/F')
- F_url = sbox.repo_url + '/A/B/F'
-
- foo_path = os.path.join(F_path, 'foo')
- new_file = os.path.join(foo_path, "new file")
- new_file2 = os.path.join(foo_path, "new file 2")
-
- # Make directory foo in F, and add some files within it.
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
- svntest.main.file_append(new_file, "Initial text in new file.\n")
- svntest.main.file_append(new_file2, "Initial text in new file 2.\n")
- svntest.main.run_svn(None, "add", new_file)
- svntest.main.run_svn(None, "add", new_file2)
-
- # Commit all the new content, creating r2.
- expected_output = wc.State(wc_dir, {
- 'A/B/F/foo' : Item(verb='Adding'),
- 'A/B/F/foo/new file' : Item(verb='Adding'),
- 'A/B/F/foo/new file 2' : Item(verb='Adding'),
- })
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.add({
- 'A/B/F/foo' : Item(status=' ', wc_rev=2),
- 'A/B/F/foo/new file' : Item(status=' ', wc_rev=2),
- 'A/B/F/foo/new file 2' : Item(status=' ', wc_rev=2),
- })
- svntest.actions.run_and_verify_commit(wc_dir,
- expected_output,
- expected_status,
- None, wc_dir)
-
- # Merge foo onto C
- expected_output = wc.State(C_path, {
- 'foo' : Item(status='A '),
- 'foo/new file' : Item(status='A '),
- 'foo/new file 2' : Item(status='A '),
- })
- expected_mergeinfo_output = wc.State(C_path, {
- '' : Item(status=' U'),
- })
- expected_elision_output = wc.State(C_path, {
- })
- expected_disk = wc.State('', {
- '' : Item(props={SVN_PROP_MERGEINFO : '/A/B/F:2'}),
- 'foo' : Item(),
- 'foo/new file' : Item("Initial text in new file.\n"),
- 'foo/new file 2' : Item("Initial text in new file 2.\n"),
- })
- expected_status = wc.State(C_path, {
- '' : Item(status=' M', wc_rev=1),
- 'foo' : Item(status='A ', wc_rev='-', copied='+'),
- 'foo/new file' : Item(status=' ', wc_rev='-', copied='+'),
- 'foo/new file 2' : Item(status=' ', wc_rev='-', copied='+'),
- })
- expected_skip = wc.State(C_path, { })
- svntest.actions.run_and_verify_merge(C_path, '1', '2', F_url, None,
- expected_output,
- expected_mergeinfo_output,
- expected_elision_output,
- expected_disk,
- expected_status,
- expected_skip,
- None, None, None, None, None, 1)
- # Commit merge of foo onto C, creating r3.
- expected_output = svntest.wc.State(wc_dir, {
- 'A/C' : Item(verb='Sending'),
- 'A/C/foo' : Item(verb='Adding'),
- })
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.add({
- 'A/B/F/foo' : Item(status=' ', wc_rev=2),
- 'A/C' : Item(status=' ', wc_rev=3),
- 'A/B/F/foo/new file' : Item(status=' ', wc_rev=2),
- 'A/B/F/foo/new file 2' : Item(status=' ', wc_rev=2),
- 'A/C/foo' : Item(status=' ', wc_rev=3),
- 'A/C/foo/new file' : Item(status=' ', wc_rev=3),
- 'A/C/foo/new file 2' : Item(status=' ', wc_rev=3),
-
- })
- svntest.actions.run_and_verify_commit(wc_dir,
- expected_output,
- expected_status,
- None, wc_dir)
-
- # Delete foo on F, creating r4.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', foo_path)
- expected_output = svntest.wc.State(wc_dir, {
- 'A/B/F/foo' : Item(verb='Deleting'),
- })
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.add({
- 'A/C' : Item(status=' ', wc_rev=3),
- 'A/C/foo' : Item(status=' ', wc_rev=3),
- 'A/C/foo/new file' : Item(status=' ', wc_rev=3),
- 'A/C/foo/new file 2' : Item(status=' ', wc_rev=3),
- })
- svntest.actions.run_and_verify_commit(wc_dir,
- expected_output,
- expected_status,
- None, wc_dir)
-
-#----------------------------------------------------------------------
# A merge that replaces a directory
# Tests for Issue #2144 and Issue #2607
@SkipUnless(server_has_mergeinfo)
@@ -2480,8 +2237,8 @@ def merge_dir_replace(sbox):
new_file3 = os.path.join(bar_path, "new file 3")
# Make a couple of directories, and add some files within them.
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', bar_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', foo_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', bar_path)
svntest.main.file_append(new_file3, "Initial text in new file 3.\n")
svntest.main.run_svn(None, "add", new_file3)
svntest.main.file_append(foo_file, "Initial text in file foo.\n")
@@ -2507,8 +2264,7 @@ def merge_dir_replace(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Merge replacement of foo onto C
expected_output = wc.State(C_path, {
'foo' : Item(status='R '),
@@ -2545,10 +2301,9 @@ def merge_dir_replace(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1,
- 0) # don't do a dry-run
- # the output differs
+ [], True,
+ False) # don't do a dry-run
+ # the output differs
# Commit merge of foo onto C
expected_output = svntest.wc.State(wc_dir, {
@@ -2569,8 +2324,7 @@ def merge_dir_replace(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# A merge that replaces a directory and one of its children
@@ -2591,8 +2345,8 @@ def merge_dir_and_file_replace(sbox):
# Recreate foo and 'new file 2' in F and add a new folder with a file
bar_path = os.path.join(foo_path, 'bar')
new_file3 = os.path.join(bar_path, "new file 3")
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', bar_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', foo_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', bar_path)
svntest.main.file_append(new_file3, "Initial text in new file 3.\n")
svntest.main.run_svn(None, "add", new_file3)
svntest.main.file_append(new_file2, "New text in new file 2.\n")
@@ -2617,8 +2371,7 @@ def merge_dir_and_file_replace(sbox):
expected_status.tweak('A/C', wc_rev=3) # From mergeinfo
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Merge replacement of foo onto C
expected_output = wc.State(C_path, {
'foo' : Item(status='R '),
@@ -2654,10 +2407,10 @@ def merge_dir_and_file_replace(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1,
- 0) # don't do a dry-run
- # the output differs
+ [],
+ True,
+ False) # don't do a dry-run
+ # the output differs
# Commit merge of foo onto C
expected_output = svntest.wc.State(wc_dir, {
@@ -2679,16 +2432,15 @@ def merge_dir_and_file_replace(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Confirm the files are present in the repository.
new_file_2_url = sbox.repo_url + '/A/C/foo/new file 2'
- svntest.actions.run_and_verify_svn(None, ["New text in new file 2.\n"],
+ svntest.actions.run_and_verify_svn(["New text in new file 2.\n"],
[], 'cat',
new_file_2_url)
new_file_3_url = sbox.repo_url + '/A/C/foo/bar/new file 3'
- svntest.actions.run_and_verify_svn(None, ["Initial text in new file 3.\n"],
+ svntest.actions.run_and_verify_svn(["Initial text in new file 3.\n"],
[], 'cat',
new_file_3_url)
@@ -2704,12 +2456,12 @@ def merge_file_with_space_in_its_name(sbox):
# Make r2.
svntest.main.file_append(new_file, "Initial text in the file.\n")
svntest.main.run_svn(None, "add", new_file)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r2", wc_dir)
# Make r3.
svntest.main.file_append(new_file, "Next line of text in the file.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"ci", "-m", "r3", wc_dir)
# Try to reverse merge.
@@ -2719,7 +2471,7 @@ def merge_file_with_space_in_its_name(sbox):
# file (i.e., the URL basename) lives.
os.chdir(wc_dir)
target_url = sbox.repo_url + '/new%20file'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"merge", "-r3:2", target_url)
#----------------------------------------------------------------------
@@ -2740,7 +2492,7 @@ def merge_dir_branches(sbox):
# Create foo in F
foo_path = os.path.join(F_path, 'foo')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', foo_path)
expected_output = wc.State(wc_dir, {
'A/B/F/foo' : Item(verb='Adding'),
@@ -2751,8 +2503,7 @@ def merge_dir_branches(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create an unversioned foo
foo_path = sbox.ospath('foo')
@@ -2763,7 +2514,7 @@ def merge_dir_branches(sbox):
# syntax of the merge command.
### TODO: We can use run_and_verify_merge() here now.
expected_output = expected_merge_output(None, "A " + foo_path + "\n")
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '--allow-mixed-revisions',
C_url, F_url, wc_dir)
@@ -2793,10 +2544,10 @@ def safe_property_merge(sbox):
beta_path = sbox.ospath('A/B/E/beta')
E_path = sbox.ospath('A/B/E')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
alpha_path, beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
E_path)
@@ -2809,27 +2560,26 @@ def safe_property_merge(sbox):
expected_status.tweak('A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Copy B to B2 as rev 3 (making a branch)
B_url = sbox.repo_url + '/A/B'
B2_url = sbox.repo_url + '/A/B2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', '-m', 'copy B to B2',
B_url, B2_url)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Change the properties underneath B again, and commit as r4
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val2',
alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', 'foo',
beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val2',
E_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -2838,19 +2588,18 @@ def safe_property_merge(sbox):
'A/B/E/beta' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, None,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, None)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Make local propchanges to E, alpha and beta in the branch.
alpha_path2 = sbox.ospath('A/B2/E/alpha')
beta_path2 = sbox.ospath('A/B2/E/beta')
E_path2 = sbox.ospath('A/B2/E')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'branchval',
alpha_path2, beta_path2)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'branchval',
E_path2)
@@ -2901,12 +2650,8 @@ def safe_property_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, # expected error string
- svntest.tree.detect_conflict_files,
- extra_files,
- None, None, # no B singleton handler
- 1, # check props
- 0) # dry_run
+ [], True, False,
+ extra_files=extra_files)
#----------------------------------------------------------------------
# Test for issue 2035, whereby 'svn merge' wouldn't always mark
@@ -2923,10 +2668,10 @@ def property_merge_from_branch(sbox):
alpha_path = sbox.ospath('A/B/E/alpha')
E_path = sbox.ospath('A/B/E')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
E_path)
@@ -2937,24 +2682,23 @@ def property_merge_from_branch(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B/E', 'A/B/E/alpha', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Copy B to B2 as rev 3 (making a branch)
B_url = sbox.repo_url + '/A/B'
B2_url = sbox.repo_url + '/A/B2'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', '-m', 'copy B to B2',
B_url, B2_url)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Change the properties underneath B again, and commit as r4
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val2',
alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val2',
E_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -2962,18 +2706,17 @@ def property_merge_from_branch(sbox):
'A/B/E/alpha' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, None,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, None)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Make different propchanges changes to the B2 branch and commit as r5.
alpha_path2 = sbox.ospath('A/B2/E/alpha')
E_path2 = sbox.ospath('A/B2/E')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'branchval',
alpha_path2)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'branchval',
E_path2)
expected_output = svntest.wc.State(wc_dir, {
@@ -2981,9 +2724,8 @@ def property_merge_from_branch(sbox):
'A/B2/E/alpha' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, None,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, None)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Now merge the recent B change to the branch. There are no local
# mods anywhere, but we should still get property conflicts anyway!
@@ -3031,12 +2773,8 @@ def property_merge_from_branch(sbox):
expected_disk,
expected_status,
expected_skip,
- None, # expected error string
- svntest.tree.detect_conflict_files,
- extra_files,
- None, None, # no B singleton handler
- 1, # check props
- 0) # dry_run
+ [], True, False,
+ extra_files=extra_files)
#----------------------------------------------------------------------
# Another test for issue 2035, whereby sometimes 'svn merge' marked
@@ -3050,7 +2788,7 @@ def property_merge_undo_redo(sbox):
# Add a property to a file, commit as r2.
alpha_path = sbox.ospath('A/B/E/alpha')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
alpha_path)
@@ -3061,9 +2799,8 @@ def property_merge_undo_redo(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B/E/alpha', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_output, expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Use 'svn merge' to undo the commit. ('svn merge -r2:1')
# Result should be a single local-prop-mod.
@@ -3089,11 +2826,7 @@ def property_merge_undo_redo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, # expected error string
- None, None, # no A singleton handler
- None, None, # no B singleton handler
- 1, # check props
- 0) # dry_run
+ [], True, False)
# Change mind, re-apply the change ('svn merge -r1:2').
# This should merge cleanly into existing prop-mod, status shows nothing.
@@ -3123,11 +2856,7 @@ def property_merge_undo_redo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, # expected error string
- None, None, # no A singleton handler
- None, None, # no B singleton handler
- 1, # check props
- 0, # dry_run
+ [], True, False,
'--ignore-ancestry', wc_dir)
@@ -3147,25 +2876,24 @@ def cherry_pick_text_conflict(sbox):
branch_mu_path = sbox.ospath('copy-of-A/mu')
# Create a branch of A.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
A_url, branch_A_url,
'-m', "Creating copy-of-A")
# Update to get the branch.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
# Change mu's text on the branch, producing r3 through r6.
for rev in range(3, 7):
svntest.main.file_append(branch_mu_path, ("r%d\n" % rev) * 3)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m',
'Add lines to mu in r%d.' % rev, wc_dir)
# Mark r5 as merged into trunk, to create disparate revision ranges
# which need to be merged.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
[' U ' + A_path + '\n']),
[], 'merge', '-c5', '--record-only',
@@ -3176,12 +2904,15 @@ def cherry_pick_text_conflict(sbox):
expected_output = wc.State(A_path, {
'mu' : Item(status='C '),
})
- expected_mergeinfo_output = wc.State(A_path, {})
+ expected_mergeinfo_output = wc.State(A_path, {
+ '' : Item(status=' G')
+ })
expected_elision_output = wc.State(A_path, {
})
expected_disk = wc.State('', {
'mu' : Item("This is the file 'mu'.\n"
- + make_conflict_marker_text("r3\n" * 3, "r4\n" * 3, 4)),
+ + make_conflict_marker_text('', "r3\n" * 3 + "r4\n" * 3, 3, 4,
+ old_text='r3\n' * 3)),
'B' : Item(),
'B/lambda' : Item("This is the file 'lambda'.\n"),
'B/E' : Item(),
@@ -3223,7 +2954,7 @@ def cherry_pick_text_conflict(sbox):
})
expected_status.tweak(wc_rev=2)
expected_skip = wc.State('', { })
- expected_error = "conflicts were produced while merging r3:4"
+ expected_error = ".*conflicts were produced while merging r3:4.*"
svntest.actions.run_and_verify_merge(A_path, '3', '6', branch_A_url, None,
expected_output,
expected_mergeinfo_output,
@@ -3232,13 +2963,10 @@ def cherry_pick_text_conflict(sbox):
expected_status,
expected_skip,
expected_error,
- svntest.tree.detect_conflict_files,
+ extra_files=
["mu\.working",
"mu\.merge-right\.r4",
- "mu\.merge-left\.r3"],
- None, None, # no singleton handler
- 0, # don't check props
- 0) # not a dry_run
+ "mu\.merge-left\.r3"])
#----------------------------------------------------------------------
# Test for issue 2135
@@ -3251,7 +2979,7 @@ def merge_file_replace(sbox):
# File scheduled for deletion
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/rho', status='D ')
@@ -3266,11 +2994,10 @@ def merge_file_replace(sbox):
# Commit rev 2
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create and add a new file.
svntest.main.file_write(rho_path, "new rho\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', rho_path)
# Commit revsion 3
expected_status.add({
@@ -3283,8 +3010,7 @@ def merge_file_replace(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None,
- None, wc_dir)
+ None)
# Update working copy
expected_output = svntest.wc.State(wc_dir, {})
@@ -3327,9 +3053,7 @@ def merge_file_replace(sbox):
expected_status.tweak('A/D/G/rho', status=' ', copied=None, wc_rev='4')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Test for issue 2522
@@ -3343,7 +3067,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
# File scheduled for deletion
rho_path = sbox.ospath('A/D/G/rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/rho', status='D ')
@@ -3358,8 +3082,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
# Commit rev 2
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Update working copy
expected_disk = svntest.main.greek_state.copy()
@@ -3374,7 +3097,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
# Create and add a new file.
svntest.main.file_write(rho_path, "new rho\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', rho_path)
# Commit revsion 3
expected_status.add({
@@ -3391,8 +3114,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# merge changes from r3:1...
#
@@ -3404,9 +3126,9 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
# Normally we'd simply update the whole working copy, but since that would
# defeat the purpose of this test (see the comment below), instead we'll
# update only "." using --depth empty. This preserves the intent of the
- # orginal mixed-rev test for this issue, but allows the merge tracking
+ # original mixed-rev test for this issue, but allows the merge tracking
# logic to consider r3 as valid for reverse merging.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--depth', 'empty', wc_dir)
expected_status.tweak('', wc_rev=3)
expected_output = svntest.wc.State(wc_dir, {
@@ -3429,7 +3151,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
wc_dir)
@@ -3444,9 +3166,7 @@ def merge_file_replace_to_mixed_rev_wc(sbox):
expected_status.tweak('A/D/G/rho', status=' ', copied=None, wc_rev='4')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# use -x -w option for ignoring whitespace during merge
@@ -3469,8 +3189,7 @@ def merge_ignore_whitespace(sbox):
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# change the file, mostly whitespace changes + an extra line
svntest.main.file_write(file_path, "A a\nBb \n Cc\nNew line in iota\n")
@@ -3479,12 +3198,10 @@ def merge_ignore_whitespace(sbox):
expected_status.tweak(file_name, wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Backdate iota to revision 2, so we can merge in the rev 3 changes.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '2', file_path)
# Make some local whitespace changes, these should not conflict
# with the remote whitespace changes as both will be ignored.
@@ -3517,8 +3234,8 @@ def merge_ignore_whitespace(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 0, 0, '--allow-mixed-revisions',
+ [], False, False,
+ '--allow-mixed-revisions',
'-x', '-w', wc_dir)
#----------------------------------------------------------------------
@@ -3543,8 +3260,7 @@ def merge_ignore_eolstyle(sbox):
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# change the file, mostly eol changes + an extra line
svntest.main.file_write(file_path,
@@ -3558,12 +3274,10 @@ def merge_ignore_eolstyle(sbox):
expected_status.tweak(file_name, wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Backdate iota to revision 2, so we can merge in the rev 3 changes.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '2', file_path)
# Make some local eol changes, these should not conflict
# with the remote eol changes as both will be ignored.
@@ -3600,8 +3314,8 @@ def merge_ignore_eolstyle(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 0, 0, '--allow-mixed-revisions',
+ [], False, False,
+ '--allow-mixed-revisions',
'-x', '--ignore-eol-style', wc_dir)
#----------------------------------------------------------------------
@@ -3630,7 +3344,7 @@ def merge_conflict_markers_matching_eol(sbox):
# Checkout a second working copy
wc_backup = sbox.add_wc_path('backup')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url, wc_backup)
# set starting revision
@@ -3663,8 +3377,7 @@ def merge_conflict_markers_matching_eol(sbox):
# Commit the original change and note the 'base' revision number
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
cur_rev = cur_rev + 1
base_rev = cur_rev
@@ -3696,6 +3409,7 @@ def merge_conflict_markers_matching_eol(sbox):
'A/mu' : Item(contents= "This is the file 'mu'." + eolchar +
"<<<<<<< .working" + eolchar +
"Conflicting appended text for mu" + eolchar +
+ "||||||| .merge-left.r" + str(cur_rev - 1) + eolchar +
"=======" + eolchar +
"Original appended text for mu" + eolchar +
">>>>>>> .merge-right.r" + str(cur_rev) + eolchar),
@@ -3771,7 +3485,7 @@ def merge_eolstyle_handling(sbox):
# Checkout a second working copy
wc_backup = sbox.add_wc_path('backup')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url, wc_backup)
path_backup = os.path.join(wc_backup, 'A', 'mu')
@@ -3895,8 +3609,7 @@ def create_deep_trees(wc_dir):
'A/B/F/E/beta' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
svntest.main.run_svn(None, 'cp', A_B_F_E_path, A_B_F_E1_path)
@@ -3910,11 +3623,10 @@ def create_deep_trees(wc_dir):
'A/B/F/E1/beta' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# Bring the entire WC up to date with rev 3.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
expected_status.tweak(wc_rev=3)
# Copy B and commit, creating revision 4.
@@ -3935,8 +3647,7 @@ def create_deep_trees(wc_dir):
'A/copy-of-B/lambda' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
expected_disk = svntest.main.greek_state.copy()
expected_disk.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
@@ -3960,7 +3671,7 @@ def create_deep_trees(wc_dir):
svntest.actions.verify_disk(wc_dir, expected_disk, True)
# Bring the entire WC up to date with rev 4.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
svntest.actions.verify_disk(wc_dir, expected_disk, True)
@@ -3994,11 +3705,10 @@ def avoid_repeated_merge_using_inherited_merge_info(sbox):
})
expected_status.tweak('A/B/F/E/alpha', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# Bring the entire WC up to date with rev 5.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Merge changes from rev 5 of B (to alpha) into copy_of_B.
expected_output = wc.State(copy_of_B_path, {
@@ -4041,11 +3751,7 @@ def avoid_repeated_merge_using_inherited_merge_info(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- None,
- None,
- None,
- None, 1)
+ check_props=True)
# Commit the result of the merge, creating revision 6.
expected_output = svntest.wc.State(copy_of_B_path, {
@@ -4053,14 +3759,14 @@ def avoid_repeated_merge_using_inherited_merge_info(sbox):
'F/E/alpha' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(copy_of_B_path, expected_output,
- None, None, wc_dir)
+ None)
# Update the WC to bring /A/copy_of_B/F from rev 4 to rev 6.
# Without this update, a subsequent merge will not find any merge
# info for /A/copy_of_B/F -- nor its parent dir in the repos -- at
# rev 4. Mergeinfo wasn't introduced until rev 6.
copy_of_B_F_E_path = os.path.join(copy_of_B_path, 'F', 'E')
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Attempt to re-merge changes to alpha from rev 4. Use the merge
# info inherited from the grandparent (copy-of-B) of our merge
@@ -4071,7 +3777,6 @@ def avoid_repeated_merge_using_inherited_merge_info(sbox):
'beta' : Item(status=' ', wc_rev=6),
})
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
[' U ' + copy_of_B_F_E_path + '\n',
' G ' + copy_of_B_F_E_path + '\n'],
@@ -4118,7 +3823,7 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
})
expected_status.tweak('A/B/F/E/alpha', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
for path_and_mergeinfo in (('E', '/A/B/F/E:5'),
('E1', '/A/B/F/E:5')):
@@ -4152,11 +3857,7 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- None,
- None,
- None,
- None, 1)
+ check_props=True)
# Commit the result of the merge, creating new revision.
expected_output = svntest.wc.State(path_name, {
@@ -4164,7 +3865,7 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
'alpha' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(path_name,
- expected_output, None, None, wc_dir)
+ expected_output, None, [], wc_dir)
# Edit A/B/F/E/alpha and commit it, creating revision 8.
new_content_for_alpha = 'new content to alpha\none more line\n'
@@ -4179,12 +3880,12 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
'beta' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(A_B_F_E_path, expected_output,
- expected_status, None, wc_dir)
+ expected_status, [], wc_dir)
# Update the WC to bring /A/copy_of_B to rev 8.
# Without this update expected_status tree would be cumbersome to
# understand.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Merge changes from rev 4:8 of A/B into A/copy_of_B. A/copy_of_B/F/E1
# has explicit mergeinfo and exists at r4 in the merge source, so it
@@ -4234,17 +3935,13 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- None,
- None,
- None,
- None, 1)
+ check_props=True)
# Test for part of Issue #2821, see
# http://subversion.tigris.org/issues/show_bug.cgi?id=2821#desc22
#
# Revert all local changes.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Make a text mod to A/copy-of-B/F/E/alpha
newer_content_for_alpha = "Conflicting content"
@@ -4292,11 +3989,7 @@ def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- None,
- None,
- None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
def tweak_src_then_merge_to_dest(sbox, src_path, dst_path,
@@ -4316,11 +4009,11 @@ def tweak_src_then_merge_to_dest(sbox, src_path, dst_path,
{ '': Item(wc_rev=new_rev, status=' ')})
svntest.actions.run_and_verify_commit(src_path, expected_output,
- expected_status, None, src_path)
+ expected_status)
# Update the WC to new_rev so that it would be easier to expect everyone
# to be at new_rev.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Merge new_rev of src_path to dst_path.
@@ -4332,7 +4025,6 @@ def tweak_src_then_merge_to_dest(sbox, src_path, dst_path,
merge_url = merge_url.replace('\\', '/')
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[new_rev]],
['U ' + dst_path + '\n',
' U ' + dst_path + '\n']),
@@ -4380,7 +4072,7 @@ def obey_reporter_api_semantics_while_doing_subtree_merges(sbox):
'A/copy-of-D/gamma' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
cur_rev = 2
@@ -4403,8 +4095,7 @@ def obey_reporter_api_semantics_while_doing_subtree_merges(sbox):
file_contents, cur_rev)
copy_of_A_D_wc_rev = cur_rev
- svntest.actions.run_and_verify_svn(None,
- ['\n',
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
'Committed revision ' + str(cur_rev+1) +
'.\n'],
[],
@@ -4472,158 +4163,7 @@ def obey_reporter_api_semantics_while_doing_subtree_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- None,
- None,
- None,
- None, 1)
-
-#----------------------------------------------------------------------
-def set_up_branch(sbox, branch_only = False, nbr_of_branches = 1):
- '''Starting with standard greek tree, copy 'A' NBR_OF_BRANCHES times
- to A_COPY, A_COPY_2, A_COPY_3, and so on. Then make four modifications
- (setting file contents to "New content") under A:
- r(2 + NBR_OF_BRANCHES) - A/D/H/psi
- r(3 + NBR_OF_BRANCHES) - A/D/G/rho
- r(4 + NBR_OF_BRANCHES) - A/B/E/beta
- r(5 + NBR_OF_BRANCHES) - A/D/H/omega
- Return (expected_disk, expected_status).'''
-
- # With the default parameters, the branching looks like this:
- #
- # A -1-----3-4-5-6--
- # \
- # A_COPY 2-----------
-
- wc_dir = sbox.wc_dir
-
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_disk = svntest.main.greek_state.copy()
-
- def copy_A(dest_name, rev):
- expected = svntest.verify.UnorderedOutput(
- ["A " + os.path.join(wc_dir, dest_name, "B") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "B", "lambda") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "B", "E") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "B", "E", "alpha") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "B", "E", "beta") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "B", "F") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "mu") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "C") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "gamma") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "G") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "G", "pi") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "G", "rho") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "G", "tau") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "H") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "H", "chi") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "H", "omega") + "\n",
- "A " + os.path.join(wc_dir, dest_name, "D", "H", "psi") + "\n",
- "Checked out revision " + str(rev - 1) + ".\n",
- "A " + os.path.join(wc_dir, dest_name) + "\n"])
- expected_status.add({
- dest_name + "/B" : Item(status=' ', wc_rev=rev),
- dest_name + "/B/lambda" : Item(status=' ', wc_rev=rev),
- dest_name + "/B/E" : Item(status=' ', wc_rev=rev),
- dest_name + "/B/E/alpha" : Item(status=' ', wc_rev=rev),
- dest_name + "/B/E/beta" : Item(status=' ', wc_rev=rev),
- dest_name + "/B/F" : Item(status=' ', wc_rev=rev),
- dest_name + "/mu" : Item(status=' ', wc_rev=rev),
- dest_name + "/C" : Item(status=' ', wc_rev=rev),
- dest_name + "/D" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/gamma" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/G" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/G/pi" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/G/rho" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/G/tau" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/H" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/H/chi" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/H/omega" : Item(status=' ', wc_rev=rev),
- dest_name + "/D/H/psi" : Item(status=' ', wc_rev=rev),
- dest_name : Item(status=' ', wc_rev=rev)})
- expected_disk.add({
- dest_name : Item(),
- dest_name + '/B' : Item(),
- dest_name + '/B/lambda' : Item("This is the file 'lambda'.\n"),
- dest_name + '/B/E' : Item(),
- dest_name + '/B/E/alpha' : Item("This is the file 'alpha'.\n"),
- dest_name + '/B/E/beta' : Item("This is the file 'beta'.\n"),
- dest_name + '/B/F' : Item(),
- dest_name + '/mu' : Item("This is the file 'mu'.\n"),
- dest_name + '/C' : Item(),
- dest_name + '/D' : Item(),
- dest_name + '/D/gamma' : Item("This is the file 'gamma'.\n"),
- dest_name + '/D/G' : Item(),
- dest_name + '/D/G/pi' : Item("This is the file 'pi'.\n"),
- dest_name + '/D/G/rho' : Item("This is the file 'rho'.\n"),
- dest_name + '/D/G/tau' : Item("This is the file 'tau'.\n"),
- dest_name + '/D/H' : Item(),
- dest_name + '/D/H/chi' : Item("This is the file 'chi'.\n"),
- dest_name + '/D/H/omega' : Item("This is the file 'omega'.\n"),
- dest_name + '/D/H/psi' : Item("This is the file 'psi'.\n"),
- })
-
- # Make a branch A_COPY to merge into.
- svntest.actions.run_and_verify_svn(None, expected, [], 'copy',
- sbox.repo_url + "/A",
- os.path.join(wc_dir,
- dest_name))
-
- expected_output = wc.State(wc_dir, {dest_name : Item(verb='Adding')})
- svntest.actions.run_and_verify_commit(wc_dir,
- expected_output,
- expected_status,
- None,
- wc_dir)
- for i in range(nbr_of_branches):
- if i == 0:
- copy_A('A_COPY', i + 2)
- else:
- copy_A('A_COPY_' + str(i + 1), i + 2)
-
- if branch_only:
- return expected_disk, expected_status
-
- # Make some changes under A which we'll later merge under A_COPY:
-
- # r(nbr_of_branches + 2) - modify and commit A/D/H/psi
- svntest.main.file_write(sbox.ospath('A/D/H/psi'),
- "New content")
- expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
- expected_status.tweak('A/D/H/psi', wc_rev=nbr_of_branches + 2)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- expected_disk.tweak('A/D/H/psi', contents="New content")
-
- # r(nbr_of_branches + 3) - modify and commit A/D/G/rho
- svntest.main.file_write(sbox.ospath('A/D/G/rho'),
- "New content")
- expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
- expected_status.tweak('A/D/G/rho', wc_rev=nbr_of_branches + 3)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- expected_disk.tweak('A/D/G/rho', contents="New content")
-
- # r(nbr_of_branches + 4) - modify and commit A/B/E/beta
- svntest.main.file_write(sbox.ospath('A/B/E/beta'),
- "New content")
- expected_output = wc.State(wc_dir, {'A/B/E/beta' : Item(verb='Sending')})
- expected_status.tweak('A/B/E/beta', wc_rev=nbr_of_branches + 4)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- expected_disk.tweak('A/B/E/beta', contents="New content")
-
- # r(nbr_of_branches + 5) - modify and commit A/D/H/omega
- svntest.main.file_write(sbox.ospath('A/D/H/omega'),
- "New content")
- expected_output = wc.State(wc_dir, {'A/D/H/omega' : Item(verb='Sending')})
- expected_status.tweak('A/D/H/omega', wc_rev=nbr_of_branches + 5)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- expected_disk.tweak('A/D/H/omega', contents="New content")
-
- return expected_disk, expected_status
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -4705,8 +4245,7 @@ def mergeinfo_inheritance(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r4 again, this time into A_COPY/D/G. An ancestor directory
# (A_COPY/D) exists with identical local mergeinfo, so the merge
@@ -4740,8 +4279,7 @@ def mergeinfo_inheritance(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r5 into A_COPY/B. Again, r1 should be inherited from
# A_COPY (Issue #2733)
@@ -4779,8 +4317,7 @@ def mergeinfo_inheritance(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r5 again, this time into A_COPY/B/E/beta. An ancestor
# directory (A_COPY/B) exists with identical local mergeinfo, so
@@ -4791,7 +4328,7 @@ def mergeinfo_inheritance(sbox):
# run_and_verify_merge doesn't support merging to a file WCPATH
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
- svntest.actions.run_and_verify_svn(None, [], [], 'merge', '-c5',
+ svntest.actions.run_and_verify_svn([], [], 'merge', '-c5',
sbox.repo_url + '/A/B/E/beta',
beta_COPY_path)
@@ -4866,8 +4403,7 @@ def mergeinfo_inheritance(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r6 into A_COPY/D/H/omega, it should inherit it's nearest
# ancestor's (A_COPY/D) mergeinfo (Issue #2733 with a file as the
@@ -4877,7 +4413,6 @@ def mergeinfo_inheritance(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[6]],
['U ' + omega_COPY_path + '\n',
' G ' + omega_COPY_path + '\n']),
@@ -4886,8 +4421,7 @@ def mergeinfo_inheritance(sbox):
omega_COPY_path)
# Check that mergeinfo was properly set on A_COPY/D/H/omega
- svntest.actions.run_and_verify_svn(None,
- ["/A/D/H/omega:3-4,6\n"],
+ svntest.actions.run_and_verify_svn(["/A/D/H/omega:3-4,6\n"],
[],
'propget', SVN_PROP_MERGEINFO,
omega_COPY_path)
@@ -4916,9 +4450,7 @@ def mergeinfo_inheritance(sbox):
wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# In single-db mode you can't create a disconnected working copy by just
# copying a subdir
@@ -4930,7 +4462,7 @@ def mergeinfo_inheritance(sbox):
#
## Update the disconnected WC it so it will get the most recent mergeinfo
## from the repos when merging.
- #svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [], 'up',
+ #svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [], 'up',
# other_wc)
#
## Merge r5:4 into the root of the disconnected WC.
@@ -4968,8 +4500,7 @@ def mergeinfo_inheritance(sbox):
# expected_disk,
# expected_status,
# expected_skip,
- # None, None, None, None,
- # None, 1)
+ # check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -5000,7 +4531,6 @@ def mergeinfo_elision(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + beta_COPY_path + '\n',
' U ' + beta_COPY_path + '\n']),
@@ -5014,7 +4544,7 @@ def mergeinfo_elision(sbox):
})
svntest.actions.run_and_verify_status(beta_COPY_path, expected_status)
- svntest.actions.run_and_verify_svn(None, ["/A/B/E/beta:5\n"], [],
+ svntest.actions.run_and_verify_svn(["/A/B/E/beta:5\n"], [],
'propget', SVN_PROP_MERGEINFO,
beta_COPY_path)
@@ -5025,12 +4555,10 @@ def mergeinfo_elision(sbox):
wc_status.tweak('A_COPY/B/E/beta', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# Update A_COPY to get all paths to the same working revision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
wc_status.tweak(wc_rev=7)
@@ -5065,8 +4593,7 @@ def mergeinfo_elision(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge r3:6 into A_COPY. The merge doesn't touch either of A_COPY's
# subtrees with explicit mergeinfo, so those are left alone.
@@ -5130,8 +4657,7 @@ def mergeinfo_elision(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# New repeat the above merge but with the --record-only option.
# This would result in identical mergeinfo
# (r4-6) on A_COPY and two of its descendants, A_COPY/D/G and
@@ -5165,8 +4691,8 @@ def mergeinfo_elision(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 1, '--record-only',
+ [], True, True,
+ '--record-only',
A_COPY_path)
# Reverse merge r5 out of A_COPY/B/E/beta. The mergeinfo on
@@ -5178,7 +4704,6 @@ def mergeinfo_elision(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-5]],
['U ' + beta_COPY_path + '\n',
' G ' + beta_COPY_path + '\n']),
@@ -5192,7 +4717,7 @@ def mergeinfo_elision(sbox):
})
svntest.actions.run_and_verify_status(beta_COPY_path, expected_status)
- svntest.actions.run_and_verify_svn(None, ["/A/B/E/beta:4,6\n"], [],
+ svntest.actions.run_and_verify_svn(["/A/B/E/beta:4,6\n"], [],
'propget', SVN_PROP_MERGEINFO,
beta_COPY_path)
@@ -5202,7 +4727,6 @@ def mergeinfo_elision(sbox):
# run_and_verify_merge doesn't support merging to a file WCPATH
# so use run_and_verify_svn.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['G ' + beta_COPY_path + '\n',
' G ' + beta_COPY_path + '\n', # Update mergeinfo
@@ -5219,7 +4743,7 @@ def mergeinfo_elision(sbox):
svntest.actions.run_and_verify_status(beta_COPY_path, expected_status)
# Once again A_COPY/B/E/beta has no mergeinfo.
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
'propget', SVN_PROP_MERGEINFO,
beta_COPY_path)
@@ -5252,7 +4776,6 @@ def mergeinfo_inheritance_and_discontinuous_ranges(sbox):
os.chdir(A_COPY_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]],
['U ' + os.path.join("D", "G", "rho") + '\n',
' U .\n']),
@@ -5263,7 +4786,7 @@ def mergeinfo_inheritance_and_discontinuous_ranges(sbox):
expected_status.tweak("A_COPY", status=' M')
expected_status.tweak("A_COPY/D/G/rho", status='M ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, ["/A:4\n"], [],
+ svntest.actions.run_and_verify_svn(["/A:4\n"], [],
'propget', SVN_PROP_MERGEINFO,
A_COPY_path)
@@ -5315,15 +4838,13 @@ def mergeinfo_inheritance_and_discontinuous_ranges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Wipe the memory of a portion of the previous merge...
### It'd be nice to use 'merge --record-only' here, but we can't (yet)
### wipe all ranges for a file due to the bug pointed out in r864719.
mu_copy_path = os.path.join(A_COPY_path, 'mu')
- svntest.actions.run_and_verify_svn(None,
- ["property '" + SVN_PROP_MERGEINFO
+ svntest.actions.run_and_verify_svn(["property '" + SVN_PROP_MERGEINFO
+ "' set on '" +
mu_copy_path + "'\n"], [], 'propset',
SVN_PROP_MERGEINFO, '', mu_copy_path)
@@ -5334,11 +4855,11 @@ def mergeinfo_inheritance_and_discontinuous_ranges(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
None,
- None,
+ [],
mu_copy_path)
# ...and that the presence of the property is retained, even when
# the value has been wiped.
- svntest.actions.run_and_verify_svn(None, ['\n'], [], 'propget',
+ svntest.actions.run_and_verify_svn(['\n'], [], 'propget',
SVN_PROP_MERGEINFO, mu_copy_path)
#----------------------------------------------------------------------
@@ -5359,7 +4880,7 @@ def merge_to_target_with_copied_children(sbox):
rho_COPY_COPY_path = sbox.ospath('A_COPY/D/G/rho_copy')
# URL to URL copy A_COPY/D/G/rho to A_COPY/D/G/rho_copy
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.repo_url + '/A_COPY/D/G/rho',
sbox.repo_url + '/A_COPY/D/G/rho_copy',
'-m', 'copy')
@@ -5376,12 +4897,10 @@ def merge_to_target_with_copied_children(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Merge r4 into A_COPY/D/G/rho_copy.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]],
['U ' + rho_COPY_COPY_path + '\n',
' U ' + rho_COPY_COPY_path + '\n']),
@@ -5422,8 +4941,7 @@ def merge_to_target_with_copied_children(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -5454,7 +4972,7 @@ def merge_to_switched_path(sbox):
"A " + G_COPY_path + "\n"])
# r7 - Copy A/D/G to A/D/G_COPY and commit.
- svntest.actions.run_and_verify_svn(None, expected, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected, [], 'copy',
sbox.repo_url + "/A/D/G",
G_COPY_path)
@@ -5466,16 +4984,14 @@ def merge_to_switched_path(sbox):
"A/D/G_COPY/tau" : Item(status=' ', wc_rev=7),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# r8 - modify and commit A/D/G_COPY/rho
svntest.main.file_write(sbox.ospath('A/D/G_COPY/rho'),
"New *and* improved rho content")
expected_output = wc.State(wc_dir, {'A/D/G_COPY/rho' : Item(verb='Sending')})
wc_status.tweak('A/D/G_COPY/rho', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Switch A_COPY/D/G to A/D/G.
wc_disk.add({
@@ -5496,17 +5012,16 @@ def merge_to_switched_path(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_D_G_path,
sbox.repo_url + "/A/D/G",
expected_output, wc_disk, wc_status,
- None, None, None, None, None, 1)
+ [], 1)
# Update working copy to allow elision (if any).
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
# Set some mergeinfo on a working copy parent of our switched subtree
# A_COPY/D/G. Because the subtree is switched it should *not* inherit
# this mergeinfo.
- svntest.actions.run_and_verify_svn(None,
- ["property '" + SVN_PROP_MERGEINFO +
+ svntest.actions.run_and_verify_svn(["property '" + SVN_PROP_MERGEINFO +
"' set on '" + A_COPY_path + "'" +
"\n"], [], 'ps', SVN_PROP_MERGEINFO,
'/A:4', A_COPY_path)
@@ -5546,7 +5061,7 @@ def merge_to_switched_path(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Check that the mergeinfo set on a switched target can elide to the
# repository.
@@ -5562,19 +5077,16 @@ def merge_to_switched_path(sbox):
# but as it is switched this empty mergeinfo just elides to the
# repository (empty mergeinfo on a path can elide if that path doesn't
# inherit *any* mergeinfo).
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '" + A_COPY_path+ "'\n",
+ svntest.actions.run_and_verify_svn(["Reverted '" + A_COPY_path+ "'\n",
"Reverted '" + A_COPY_D_G_path+ "'\n",
"Reverted '" + A_COPY_D_G_rho_path +
"'\n"],
[], 'revert', '-R', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["property '" + SVN_PROP_MERGEINFO +
+ svntest.actions.run_and_verify_svn(["property '" + SVN_PROP_MERGEINFO +
"' set on '" + A_COPY_D_path+ "'" +
"\n"], [], 'ps', SVN_PROP_MERGEINFO,
'/A/D:4', A_COPY_D_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-4]],
['U ' + A_COPY_D_G_rho_path + '\n',
' U ' + A_COPY_D_G_path + '\n'],
@@ -5646,7 +5158,7 @@ def merge_to_path_with_switched_children(sbox):
A_COPY_gamma_path = sbox.ospath('A_COPY/D/gamma')
H_COPY_2_path = sbox.ospath('A_COPY_2/D/H')
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=8)
@@ -5658,7 +5170,7 @@ def merge_to_path_with_switched_children(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_G_path,
sbox.repo_url + "/A_COPY_2/D/G",
expected_output, wc_disk, wc_status,
- None, None, None, None, None, 1)
+ [], 1)
# Switch A_COPY/D/G/rho to A_COPY_3/D/G/rho.
wc_status.tweak("A_COPY/D/G/rho", switched='S')
@@ -5666,7 +5178,7 @@ def merge_to_path_with_switched_children(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_rho_path,
sbox.repo_url + "/A_COPY_3/D/G/rho",
expected_output, wc_disk, wc_status,
- None, None, None, None, None, 1)
+ [], 1)
# Switch A_COPY/D/H/psi to A_COPY_2/D/H/psi.
wc_status.tweak("A_COPY/D/H/psi", switched='S')
@@ -5674,7 +5186,7 @@ def merge_to_path_with_switched_children(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_psi_path,
sbox.repo_url + "/A_COPY_2/D/H/psi",
expected_output, wc_disk, wc_status,
- None, None, None, None, None, 1)
+ [], 1)
# Target with switched file child:
#
@@ -5721,7 +5233,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Target with switched dir child:
#
@@ -5772,7 +5284,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk_D,
expected_status_D, expected_skip_D,
- None, None, None, None, None, 1)
+ check_props=True)
# Merge r5 from A/D into A_COPY/D. This updates the mergeinfo on the
@@ -5801,7 +5313,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk_D,
expected_status_D, expected_skip_D,
- None, None, None, None, None, 1)
+ check_props=True)
# Finally, merge r4:8 into A_COPY. A_COPY gets mergeinfo for r5-8 added but
# since none of A_COPY's subtrees with mergeinfo are affected, none of them
@@ -5866,7 +5378,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Commit changes thus far.
expected_output = svntest.wc.State(wc_dir, {
'A_COPY' : Item(verb='Sending'),
@@ -5881,8 +5393,7 @@ def merge_to_path_with_switched_children(sbox):
wc_status.tweak('A_COPY', 'A_COPY/B/E/beta', 'A_COPY/D', 'A_COPY/D/G',
'A_COPY/D/G/rho', 'A_COPY/D/H', 'A_COPY/D/H/omega',
'A_COPY/D/H/psi', wc_rev=9)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Unswitch A_COPY/D/H/psi.
expected_output = svntest.wc.State(wc_dir, {
@@ -5907,7 +5418,7 @@ def merge_to_path_with_switched_children(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_psi_path,
sbox.repo_url + "/A_COPY/D/H/psi",
expected_output, wc_disk, wc_status,
- None, None, None, None, None, 1)
+ [], 1)
# Non-inheritable mergeinfo ranges on a target don't prevent repeat
# merges of that range on the target's children.
@@ -5952,7 +5463,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
A_COPY_H_path)
@@ -5963,8 +5474,7 @@ def merge_to_path_with_switched_children(sbox):
# A_COPY/D has a switched child it gets r10 added as a non-inheritable
# range. Repeat the same merge checking that no repeat merge is
# attempted on A_COPY/D.
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
D_path + "'\n"], [], 'ps',
'prop:name', 'propval', D_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -5974,8 +5484,7 @@ def merge_to_path_with_switched_children(sbox):
})
wc_status.tweak('A_COPY/D', wc_rev=9)
wc_status.tweak('A/D', 'A_COPY/D/H', 'A_COPY/D/H/psi', wc_rev=10)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
expected_output = wc.State(A_COPY_D_path, {
'' : Item(status=' U')
})
@@ -6004,7 +5513,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk_D,
expected_status_D, expected_skip_D,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
A_COPY_D_path)
# Repeated merge is a no-op, though we still see the notification reporting
@@ -6021,7 +5530,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk_D,
expected_status_D, expected_skip_D,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
A_COPY_D_path)
@@ -6036,11 +5545,11 @@ def merge_to_path_with_switched_children(sbox):
# Revert all local changes. This leaves just the mergeinfo for r5-8
# on A_COPY and its various subtrees.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Update merge target so working revisions are uniform and all
# possible elision occurs.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(10), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(10), [],
'up', A_COPY_path)
# Do the reverse merge.
@@ -6113,7 +5622,7 @@ def merge_to_path_with_switched_children(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue 2047: Merge from parent dir fails while it succeeds from
@@ -6139,16 +5648,16 @@ def merge_with_implicit_target_file(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update to revision 2.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Revert the change committed in r2
os.chdir(wc_dir)
# run_and_verify_merge doesn't accept file paths.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-r', '2:1',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-r', '2:1',
'A/mu')
#----------------------------------------------------------------------
@@ -6173,7 +5682,7 @@ def empty_mergeinfo(sbox):
# B) Empty mergeinfo elides to empty mergeinfo.
#
# C) If a merge sets empty mergeinfo on its target and that target has
- # no ancestor in either the WC or the repository with explict
+ # no ancestor in either the WC or the repository with explicit
# mergeinfo, then the target's mergeinfo is removed (a.k.a. elides
# to nothing).
sbox.build()
@@ -6249,8 +5758,7 @@ def empty_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Now do the reverse merge into the subtree.
expected_output = wc.State(H_COPY_path, {
'psi' : Item(status='G '),
@@ -6281,8 +5789,7 @@ def empty_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Test areas B and C -- Reverse merge r3 into A_COPY, this would result in
# empty mergeinfo on A_COPY and A_COPY/D/H, but the empty mergeinfo on the
@@ -6296,13 +5803,14 @@ def empty_mergeinfo(sbox):
' U ' + H_COPY_path + '\n',
' U ' + A_COPY_path + '\n',],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-r4:2',
sbox.repo_url + '/A',
A_COPY_path)
svntest.actions.run_and_verify_status(wc_dir, wc_status)
# Check that A_COPY's mergeinfo is gone.
- svntest.actions.run_and_verify_svn(None, [], [], 'pg', 'svn:mergeinfo',
+ svntest.actions.run_and_verify_svn([], '.*W200017: Property.*not found',
+ 'pg', 'svn:mergeinfo',
A_COPY_path)
#----------------------------------------------------------------------
@@ -6324,8 +5832,7 @@ def prop_add_to_child_with_mergeinfo(sbox):
B_COPY_path = sbox.ospath('A_COPY/B')
# Set a non-mergeinfo prop on a file.
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
beta_path + "'\n"], [], 'ps',
'prop:name', 'propval', beta_path)
expected_disk.tweak('A/B/E/beta', props={'prop:name' : 'propval'})
@@ -6334,13 +5841,10 @@ def prop_add_to_child_with_mergeinfo(sbox):
{'A/B/E/beta' : Item(verb='Sending')})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Merge r4:5 from A/B/E/beta into A_COPY/B/E/beta.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + beta_COPY_path +'\n',
' U ' + beta_COPY_path +'\n',]),
@@ -6386,8 +5890,7 @@ def prop_add_to_child_with_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@Issue(2788,3383)
@@ -6411,8 +5914,7 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
# Merge r3:4 (using implied peg revisions) from 'other' repos into
# A_COPY/D/G. Merge should succeed, but no mergeinfo should be set.
G_COPY_path = sbox.ospath('A_COPY/D/G')
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[4]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[4]],
'U ' +
os.path.join(G_COPY_path,
"rho") + '\n', True),
@@ -6423,8 +5925,7 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
# Merge r4:5 (using explicit peg revisions) from 'other' repos into
# A_COPY/B/E. Merge should succeed, but no mergeinfo should be set.
E_COPY_path = sbox.ospath('A_COPY/B/E')
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[5]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[5]],
'U ' +
os.path.join(E_COPY_path,
"beta") +'\n', True),
@@ -6437,10 +5938,10 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Set up for test of issue #3383.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Get a working copy for the foreign repos.
- svntest.actions.run_and_verify_svn(None, None, [], 'co', other_repo_url,
+ svntest.actions.run_and_verify_svn(None, [], 'co', other_repo_url,
other_wc_dir)
# Create mergeinfo on the foreign repos on an existing directory and
@@ -6449,13 +5950,13 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
# simple merges to *death* elsewhere.
# Create mergeinfo on an existing directory.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
other_repo_url + '/A',
os.path.join(other_wc_dir, 'A_COPY'),
'-c5')
# Create mergeinfo on an existing file.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
other_repo_url + '/A/D/H/psi',
os.path.join(other_wc_dir, 'A_COPY',
'D', 'H', 'psi'),
@@ -6463,15 +5964,15 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
# Add a new directory with mergeinfo in the foreign repos.
new_dir = os.path.join(other_wc_dir, 'A_COPY', 'N')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', new_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', new_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
SVN_PROP_MERGEINFO, '', new_dir)
# Add a new file with mergeinfo in the foreign repos.
new_file = os.path.join(other_wc_dir, 'A_COPY', 'nu')
svntest.main.file_write(new_file, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', new_file)
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'add', new_file)
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
SVN_PROP_MERGEINFO, '', new_file)
expected_output = wc.State(other_wc_dir,{
@@ -6482,19 +5983,19 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
'A_COPY/nu' : Item(verb='Adding'), # Has empty mergeinfo
})
svntest.actions.run_and_verify_commit(other_wc_dir, expected_output,
- None, None, other_wc_dir,
+ None, [], other_wc_dir,
'-m',
'create mergeinfo on foreign repos')
# Now merge a diff from the foreign repos that contains the mergeinfo
# addition in r7 to A_COPY. The mergeinfo diff should *not* be applied
# to A_COPY since it refers to a foreign repository...
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
other_repo_url + '/A@1',
other_repo_url + '/A_COPY@7',
sbox.ospath('A_COPY'))
#...which means there should be no mergeinfo anywhere in WC_DIR, since
# this test never created any.
- svntest.actions.run_and_verify_svn(None, [], [], 'pg',
+ svntest.actions.run_and_verify_svn([], [], 'pg',
SVN_PROP_MERGEINFO, '-vR',
wc_dir)
@@ -6505,7 +6006,18 @@ def foreign_repos_does_not_update_mergeinfo(sbox):
def avoid_reflected_revs(sbox):
"avoid repeated merges for cyclic merging"
- ## See http://subversion.tigris.org/issues/show_bug.cgi?id=2897. ##
+ # See <http://subversion.tigris.org/issues/show_bug.cgi?id=2897>.
+ #
+ # This test cherry-picks some changes (all of them, in fact) from the
+ # parent branch 'A' to the child branch 'A_COPY', and then tries to
+ # reintegrate 'A_COPY' to 'A' (explicitly specifying a revision range
+ # on the source branch). It expects the changes that are unique to the
+ # branch 'A_COPY' to be merged to 'A'.
+ #
+ # A --1----[3]---[5]----------?
+ # \ \_____\___ /
+ # \ \ \ /
+ # A_COPY 2-[---4-----6--7--8]-
# Create a WC with a single branch
sbox.build()
@@ -6529,27 +6041,27 @@ def avoid_reflected_revs(sbox):
# We'll consider A as the trunk and A_COPY as the feature branch
# r3 - Create a tfile1 in A
svntest.main.file_write(tfile1_path, tfile1_content)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', tfile1_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', tfile1_path)
expected_output = wc.State(wc_dir, {'A/tfile1' : Item(verb='Adding')})
wc_status.add({'A/tfile1' : Item(status=' ', wc_rev=3)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r4 - Create a bfile1 in A_COPY
svntest.main.file_write(bfile1_path, bfile1_content)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', bfile1_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', bfile1_path)
expected_output = wc.State(wc_dir, {'A_COPY/bfile1' : Item(verb='Adding')})
wc_status.add({'A_COPY/bfile1' : Item(status=' ', wc_rev=4)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r5 - Create one more file in A
svntest.main.file_write(tfile2_path, tfile2_content)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', tfile2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', tfile2_path)
expected_output = wc.State(wc_dir, {'A/tfile2' : Item(verb='Adding')})
wc_status.add({'A/tfile2' : Item(status=' ', wc_rev=5)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge r5 from /A to /A_COPY, creating r6
expected_output = wc.State(A_COPY_path, {
@@ -6616,17 +6128,17 @@ def avoid_reflected_revs(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1,
- None, A_COPY_path,
+ [], True, False,
+ A_COPY_path,
'--allow-mixed-revisions')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(wc_dir, {
'A_COPY' : Item(verb='Sending'),
'A_COPY/tfile2' : Item(verb='Adding'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# Merge r3 from /A to /A_COPY, creating r7
expected_output = wc.State(A_COPY_path, {
@@ -6656,21 +6168,21 @@ def avoid_reflected_revs(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1,
- None, A_COPY_path,
+ [], True, False,
+ A_COPY_path,
'--allow-mixed-revisions')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(wc_dir, {
'A_COPY' : Item(verb='Sending'),
'A_COPY/tfile1' : Item(verb='Adding'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# r8 - Add bfile2 to A_COPY
svntest.main.file_write(bfile2_path, bfile2_content)
- svntest.actions.run_and_verify_svn(None, None, [], 'add', bfile2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', bfile2_path)
expected_output = wc.State(wc_dir, {'A_COPY/bfile2' : Item(verb='Adding')})
wc_status.tweak(wc_rev=6)
wc_status.add({
@@ -6680,7 +6192,7 @@ def avoid_reflected_revs(sbox):
'A_COPY/tfile1' : Item(status=' ', wc_rev=7),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge 2:8 from A_COPY(feature branch) to A(trunk).
expected_output = wc.State(A_path, {
@@ -6753,7 +6265,7 @@ def avoid_reflected_revs(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -6772,10 +6284,12 @@ def update_loses_mergeinfo(sbox):
A_B_url = sbox.repo_url + '/A/B'
A_B_J_url = sbox.repo_url + '/A/B/J'
A_B_K_url = sbox.repo_url + '/A/B/K'
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 2.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'],
[],
'mkdir', '-m', 'rev 2', A_B_J_url)
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 3.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'],
[],
'mkdir', '-m', 'rev 3', A_B_K_url)
@@ -6819,9 +6333,7 @@ def update_loses_mergeinfo(sbox):
)
svntest.actions.run_and_verify_commit(A_C_wc_dir,
expected_output,
- expected_status,
- None,
- A_C_wc_dir)
+ expected_status)
other_A_C_wc_dir = os.path.join(other_wc, 'A', 'C')
expected_output = wc.State(other_A_C_wc_dir, {'K' : Item(status='A ')})
@@ -6871,7 +6383,7 @@ def update_loses_mergeinfo(sbox):
expected_output,
expected_disk,
expected_status,
- check_props=1)
+ check_props=True)
#----------------------------------------------------------------------
# Tests part of issue# 2829.
@@ -6892,10 +6404,12 @@ def merge_loses_mergeinfo(sbox):
A_B_url = sbox.repo_url + '/A/B'
A_B_J_url = sbox.repo_url + '/A/B/J'
A_B_K_url = sbox.repo_url + '/A/B/K'
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 2.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'],
[],
'mkdir', '-m', 'rev 2', A_B_J_url)
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 3.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'],
[],
'mkdir', '-m', 'rev 3', A_B_K_url)
@@ -6936,9 +6450,7 @@ def merge_loses_mergeinfo(sbox):
)
svntest.actions.run_and_verify_commit(A_C_wc_dir,
expected_output,
- expected_status,
- None,
- A_C_wc_dir)
+ expected_status)
expected_output = wc.State(A_C_wc_dir, {'J' : Item(status='D ')})
expected_elision_output = wc.State(A_C_wc_dir, {
'' : Item(status=' U'),
@@ -7012,12 +6524,10 @@ def single_file_replace_style_merge_capability(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Merge the file mu alone to rev1
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(None,
+ svntest.actions.run_and_verify_svn(expected_merge_output(None,
['R ' + mu_path + '\n']),
[],
'merge',
@@ -7074,7 +6584,7 @@ def merge_to_out_of_date_target(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Commit merge to first WC.
wc_status.tweak('A_COPY/D/H/psi', 'A_COPY/D/H', wc_rev=7)
@@ -7084,8 +6594,7 @@ def merge_to_out_of_date_target(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None, wc_dir)
+ wc_status)
# Merge -c6 into A_COPY/D/H of other WC.
expected_output = wc.State(other_A_COPY_H_path, {
@@ -7116,7 +6625,7 @@ def merge_to_out_of_date_target(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=1)
# Update A_COPY/D/H in other WC. Local mergeinfo for r6 on A_COPY/D/H
# should be *merged* with r3 from first WC.
@@ -7140,7 +6649,7 @@ def merge_to_out_of_date_target(sbox):
expected_output,
other_disk,
other_status,
- check_props=1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -7159,7 +6668,7 @@ def merge_with_depth_files(sbox):
Acopy_url = sbox.repo_url + '/A_copy'
# Copy A_url to A_copy_url
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
A_url, Acopy_url,
'-m', 'create a new copy of A')
@@ -7182,12 +6691,10 @@ def merge_with_depth_files(sbox):
# Commit the modified contents
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Update working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', Acopy_path)
# Merge r1:3 into A_copy with --depth files. The merge only affects
@@ -7255,7 +6762,7 @@ def merge_with_depth_files(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--depth', 'files', Acopy_path)
#----------------------------------------------------------------------
@@ -7292,18 +6799,17 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
nu_COPY_path = sbox.ospath('A_COPY/nu')
# Make a change to directory A/D/H and commit as r8.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'update', wc_dir)
svntest.actions.run_and_verify_svn(
- None, ["property 'prop:name' set on '" + H_path + "'\n"], [],
+ ["property 'prop:name' set on '" + H_path + "'\n"], [],
'ps', 'prop:name', 'propval', H_path)
expected_output = svntest.wc.State(wc_dir, {
'A/D/H' : Item(verb='Sending'),})
wc_status.tweak(wc_rev=7)
wc_status.tweak('A/D/H', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge r6:8 --depth immediates to A_COPY/D. This should merge the
# prop change from r8 to A_COPY/H but not the change to A_COPY/D/H/omega
@@ -7352,7 +6858,7 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--depth', 'immediates', D_COPY_path)
# Repeat the previous merge but at default depth of infinity. The change
@@ -7384,36 +6890,35 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
# Now test the problem described in
# http://svn.haxx.se/dev/archive-2008-12/0133.shtml.
#
# First revert all local mods.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# r9: Merge all available revisions from A to A_COPY at a depth of empty
# this will create non-inheritable mergeinfo on A_COPY.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
wc_status.tweak(wc_rev=8)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '--depth', 'empty',
sbox.repo_url + '/A', A_COPY_path)
wc_status.tweak('A_COPY', wc_rev=9)
expected_output = wc.State(wc_dir, {'A_COPY' : Item(verb='Sending')})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# r10: Add the file A/nu.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir, {'A/nu' : Item(verb='Adding')})
wc_status.add({'A/nu' : Item(status=' ', wc_rev=10)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Now merge -c10 from A to A_COPY.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State('', {
'nu': Item(status='A '),
})
@@ -7481,8 +6986,7 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
os.chdir(saved_cwd)
# If a merge target has inheritable and non-inheritable ranges and has a
@@ -7492,21 +6996,20 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
# *and* the mergeinfo inherited from it's parent.
#
# First revert all local changes and remove A_COPY/C/nu from disk.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Make a text change to A_COPY_2/mu in r11 and then merge that
# change to A/mu in r12. This will create mergeinfo of '/A_COPY_2/mu:11'
# on A/mu.
svntest.main.file_write(mu_2_path, 'new content')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', 'log msg',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m', 'log msg',
wc_dir)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[11]],
['U ' + mu_path + '\n',
' U ' + mu_path + '\n']),
[], 'merge', '-c11', sbox.repo_url + '/A_COPY_2/mu', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', 'log msg',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m', 'log msg',
wc_dir)
# Now merge r12 from A to A_COPY. A_COPY/mu should get the mergeinfo from
@@ -7579,16 +7082,14 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1,
- False) # No dry-run.
+ [], True, False)
os.chdir(saved_cwd)
# Test for issue #3392
#
# Revert local changes and update.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Merge r8 from A/D/H to A_COPY_D/H at depth empty. Since r8 affects only
# A_COPY/D/H itself, the resulting mergeinfo is inheritable. Commit this
@@ -7622,11 +7123,11 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--depth', 'empty', H_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'commit', '-m',
'log msg', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Now reverse the prior merge. Issue #3392 manifests itself here with
# a mergeinfo parsing error:
# >svn merge %url%/A/D/H merge_tests-62\A_COPY_2\D\H -c-8
@@ -7651,29 +7152,27 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Test issue #3407 'Shallow merges incorrectly set mergeinfo on children'.
#
# Revert all local mods.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Merge all available changes from A to A_COPY at --depth empty. Only the
# mergeinfo on A_COPY should be affected.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[9,13]],
[' U ' + A_COPY_path + '\n']),
[], 'merge', '--depth', 'empty',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- [A_COPY_path + ' - /A:2-13*\n'],
+ svntest.actions.run_and_verify_svn([A_COPY_path + ' - /A:2-13*\n'],
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_path)
# Merge all available changes from A to A_COPY at --depth files. Only the
# mergeinfo on A_COPY and its file children should be affected.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Revisions 2-13 are already merged to A_COPY and now they will be merged
# to A_COPY's file children. Due to the way we drive the merge editor
# r2-3, which are inoperative on A_COPY's file children, do not show up
@@ -7687,15 +7186,14 @@ def merge_away_subtrees_noninheritable_ranges(sbox):
' U %s\n' % (A_COPY_path),
' G %s\n' % (mu_COPY_path),
' U %s\n' % (nu_COPY_path),])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '--depth', 'files',
sbox.repo_url + '/A', A_COPY_path)
expected_output = svntest.verify.UnorderedOutput(
[A_COPY_path + ' - /A:2-13*\n',
mu_COPY_path + ' - /A/mu:2-13\n',
nu_COPY_path + ' - /A/nu:10-13\n',])
- svntest.actions.run_and_verify_svn(None,
- expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_path)
@@ -7729,14 +7227,13 @@ def merge_to_sparse_directories(sbox):
expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
wc_status.tweak('A/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
wc_disk.tweak('A/mu', contents="New content")
# r8 - Add a prop to A/D and commit.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
D_path + "'\n"], [], 'ps',
'prop:name', 'propval', D_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -7744,14 +7241,12 @@ def merge_to_sparse_directories(sbox):
})
wc_status.tweak(wc_rev=7)
wc_status.tweak('A/D', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# r9 - Add a prop to A and commit.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
A_path + "'\n"], [], 'ps',
'prop:name', 'propval', A_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -7759,8 +7254,7 @@ def merge_to_sparse_directories(sbox):
})
wc_status.tweak(wc_rev=8)
wc_status.tweak('A', wc_rev=9)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Do an --immediates checkout of A_COPY
immediates_dir = sbox.add_wc_path('immediates')
@@ -7779,7 +7273,7 @@ def merge_to_sparse_directories(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url + "/A_COPY",
immediates_dir,
expected_output, expected_disk,
- None, None, None, None,
+ [],
"--depth", "immediates")
# Merge r4:9 into the immediates WC.
@@ -7836,8 +7330,7 @@ def merge_to_sparse_directories(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Do a --files checkout of A_COPY
files_dir = sbox.add_wc_path('files')
@@ -7850,7 +7343,7 @@ def merge_to_sparse_directories(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url + "/A_COPY",
files_dir,
expected_output, expected_disk,
- None, None, None, None,
+ [],
"--depth", "files")
# Merge r4:9 into the files WC.
@@ -7893,8 +7386,7 @@ def merge_to_sparse_directories(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Do an --empty checkout of A_COPY
empty_dir = sbox.add_wc_path('empty')
@@ -7903,7 +7395,7 @@ def merge_to_sparse_directories(sbox):
svntest.actions.run_and_verify_checkout(sbox.repo_url + "/A_COPY",
empty_dir,
expected_output, expected_disk,
- None, None, None, None,
+ [],
"--depth", "empty")
# Merge r4:9 into the empty WC.
@@ -7940,16 +7432,15 @@ def merge_to_sparse_directories(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Check that default depth for merge is infinity.
#
# Revert the previous changes to the immediates WC and update one
# child in that WC to depth infinity.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R',
immediates_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '--set-depth',
+ svntest.actions.run_and_verify_svn(None, [], 'up', '--set-depth',
'infinity',
os.path.join(immediates_dir, 'D'))
# Now merge r6 into the immediates WC, even though the root of the
@@ -8004,8 +7495,7 @@ def merge_to_sparse_directories(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -8032,16 +7522,16 @@ def merge_old_and_new_revs_from_renamed_dir(sbox):
svntest.main.file_write(mu_path, "This is the file 'mu' modified.\n")
expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
wc_status.add({'A/mu' : Item(status=' ', wc_rev=3)})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Move A to A_MOVED
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 4.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 4.\n'],
[], 'mv', '-m', 'mv A to A_MOVED',
A_url, A_MOVED_url)
# Update the working copy to get A_MOVED
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Make a modification to A_MOVED/mu
svntest.main.file_write(A_MOVED_mu_path, "This is 'mu' in A_MOVED.\n")
@@ -8095,7 +7585,7 @@ def merge_old_and_new_revs_from_renamed_dir(sbox):
'A_COPY/D/H/psi' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge /A_MOVED to /A_COPY - this happens in multiple passes
# because /A_MOVED has renames in its history between the boundaries
@@ -8162,8 +7652,7 @@ def merge_old_and_new_revs_from_renamed_dir(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- True, False)
+ [], True, False)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -8205,11 +7694,11 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ expected_status)
+ svntest.actions.run_and_verify_svn(None, [],
'cp', A_url, A_COPY_url, '-m', 'rev 3')
# Update the working copy to get A_COPY
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_status.add({'A_COPY' : Item(status=' '),
'A_COPY/mu' : Item(status=' '),
'A_COPY/C' : Item(status=' '),
@@ -8234,8 +7723,8 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
svntest.main.file_write(mu_path, tweaked_7th_line)
expected_status.tweak('A/mu', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ expected_status)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_status.tweak(wc_rev=4)
tweaked_17th_line = tweaked_7th_line.replace('line17', 'LINE 17')
svntest.main.file_write(mu_path, tweaked_17th_line)
@@ -8249,16 +7738,15 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_status.tweak('A', wc_rev=5)
expected_status.tweak('A/mu', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
tweaked_27th_line = tweaked_17th_line.replace('line27', 'LINE 27')
svntest.main.file_write(mu_path, tweaked_27th_line)
expected_status.tweak('A/mu', wc_rev=6)
expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge r5 to A_COPY/mu
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + A_COPY_mu_path + '\n',
' U ' + A_COPY_mu_path + '\n']),
@@ -8327,10 +7815,9 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Revert r5 and r6 on A_COPY/mu
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[6,5]],
['G ' + A_COPY_mu_path + '\n',
' G ' + A_COPY_mu_path + '\n']),
@@ -8361,7 +7848,7 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
expected_disk.add({'' : Item(props={SVN_PROP_MERGEINFO : '/A:4-6',
'prop1' : 'val1'})})
@@ -8385,10 +7872,9 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
#Revert r5 on A_COPY/mu
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-5]],
['G ' + A_COPY_mu_path + '\n',
' G ' + A_COPY_mu_path + '\n']),
@@ -8422,7 +7908,7 @@ def merge_with_child_having_different_rev_ranges_to_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -8444,7 +7930,8 @@ def merge_old_and_new_revs_from_renamed_file(sbox):
mu_MOVED_path = sbox.ospath('A/mu_MOVED')
# Copy mu to mu_COPY
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 2.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'],
[], 'cp', '-m', 'cp mu to mu_COPY',
mu_url, mu_COPY_url)
@@ -8454,15 +7941,16 @@ def merge_old_and_new_revs_from_renamed_file(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Move mu to mu_MOVED
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 4.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 4.\n'],
[], 'mv', '-m', 'mv mu to mu_MOVED',
mu_url, mu_MOVED_url)
# Update the working copy to get mu_MOVED
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Make a modification to mu_MOVED
svntest.main.file_write(mu_MOVED_path, "This is 'mu' in mu_MOVED.\n")
@@ -8474,7 +7962,7 @@ def merge_old_and_new_revs_from_renamed_file(sbox):
'A/mu_COPY' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge A/mu_MOVED to A/mu_COPY - this happens in multiple passes
# because A/mu_MOVED has renames in its history between the
@@ -8484,11 +7972,11 @@ def merge_old_and_new_revs_from_renamed_file(sbox):
' U %s\n' % (mu_COPY_path),
'G %s\n' % (mu_COPY_path),
' G %s\n' % (mu_COPY_path),])
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-r', '1:5',
mu_MOVED_url,
mu_COPY_path)
- svntest.actions.run_and_verify_svn(None, ['/A/mu:2-3\n',
+ svntest.actions.run_and_verify_svn(['/A/mu:2-3\n',
'/A/mu_MOVED:4-5\n'],
[], 'propget', SVN_PROP_MERGEINFO,
mu_COPY_path)
@@ -8512,13 +8000,13 @@ def merge_with_auto_rev_range_detection(sbox):
A_COPY_path = sbox.ospath('A_COPY')
# Create B1 inside A
- svntest.actions.run_and_verify_svn(None, ["A " + B1_path + "\n"],
+ svntest.actions.run_and_verify_svn(["A " + B1_path + "\n"],
[], 'mkdir',
B1_path)
# Add a file mu inside B1
svntest.main.file_write(B1_mu_path, "This is the file 'mu'.\n")
- svntest.actions.run_and_verify_svn(None, ["A " + B1_mu_path + "\n"],
+ svntest.actions.run_and_verify_svn(["A " + B1_mu_path + "\n"],
[], 'add', B1_mu_path)
# Commit B1 and B1/mu
@@ -8532,10 +8020,11 @@ def merge_with_auto_rev_range_detection(sbox):
'A/B1/mu' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Copy A to A_COPY
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 3.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'],
[], 'cp', '-m', 'cp A to A_COPY',
A_url, A_COPY_url)
@@ -8548,10 +8037,10 @@ def merge_with_auto_rev_range_detection(sbox):
'A/B1/mu' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update the working copy to get A_COPY
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Merge /A to /A_COPY
expected_output = wc.State(A_COPY_path, {
@@ -8617,8 +8106,7 @@ def merge_with_auto_rev_range_detection(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
# Test for issue 2818: Provide a 'merge' API which allows for merging of
@@ -8648,28 +8136,24 @@ def cherry_picking(sbox):
wc_status.tweak(wc_rev='6')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
wc_disk, wc_status,
- None, None, None, None, None, True)
+ check_props=True)
# Make some prop changes to some dirs.
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
G_path + "'\n"], [], 'ps',
'prop:name', 'propval', G_path)
expected_output = svntest.wc.State(wc_dir, {'A/D/G': Item(verb='Sending'),})
wc_status.tweak('A/D/G', wc_rev=7)
wc_disk.tweak('A/D/G', props={'prop:name' : 'propval'})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
H_path + "'\n"], [], 'ps',
'prop:name', 'propval', H_path)
expected_output = svntest.wc.State(wc_dir, {'A/D/H': Item(verb='Sending'),})
wc_status.tweak('A/D/H', wc_rev=8)
wc_disk.tweak('A/D/H', props={'prop:name' : 'propval'})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Do multiple additive merges to a file"
# Merge -r2:4 -c6 into A_COPY/D/G/rho.
@@ -8678,7 +8162,6 @@ def cherry_picking(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3,4],[6]],
['U ' + rho_COPY_path + '\n',
' U ' + rho_COPY_path + '\n',
@@ -8690,7 +8173,7 @@ def cherry_picking(sbox):
expected_status = wc.State(rho_COPY_path,
{'' : Item(status='MM', wc_rev=6)})
svntest.actions.run_and_verify_status(rho_COPY_path, expected_status)
- svntest.actions.run_and_verify_svn(None, ["/A/D/G/rho:3-4,6\n"], [],
+ svntest.actions.run_and_verify_svn(["/A/D/G/rho:3-4,6\n"], [],
'propget', SVN_PROP_MERGEINFO,
rho_COPY_path)
@@ -8701,7 +8184,7 @@ def cherry_picking(sbox):
['U ' + omega_COPY_path + '\n',
' U ' + H_COPY_path + '\n',
' G ' + H_COPY_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-c6', '-c8',
sbox.repo_url + '/A/D/H',
H_COPY_path)
@@ -8713,8 +8196,7 @@ def cherry_picking(sbox):
'chi' : Item(status=' ', wc_rev=6),
'omega': Item(status='M ', wc_rev=6),})
svntest.actions.run_and_verify_status(H_COPY_path, expected_status)
- svntest.actions.run_and_verify_svn(None,
- [H_COPY_path + " - /A/D/H:6,8\n"],
+ svntest.actions.run_and_verify_svn([H_COPY_path + " - /A/D/H:6,8\n"],
[], 'propget', '-R', SVN_PROP_MERGEINFO,
H_COPY_path)
@@ -8728,7 +8210,7 @@ def cherry_picking(sbox):
' G ' + A_COPY_path + '\n',
' G ' + H_COPY_path + '\n',],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-c-3', '-c-6',
sbox.repo_url + '/A',
A_COPY_path)
@@ -8760,7 +8242,7 @@ def cherry_picking(sbox):
# Construct proper regex for '\' infested Windows paths.
if sys.platform == 'win32':
expected_out = expected_out.replace("\\", "\\\\")
- svntest.actions.run_and_verify_svn(None, expected_out, [],
+ svntest.actions.run_and_verify_svn(expected_out, [],
'propget', '-R', SVN_PROP_MERGEINFO,
A_COPY_path)
@@ -8779,7 +8261,7 @@ def cherry_picking(sbox):
' U ' + rho_COPY_path + '\n',
' G ' + rho_COPY_path + '\n'],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
'-r2:3', '-c-4', '-r4:7',
sbox.repo_url + '/A/D',
D_COPY_path)
@@ -8801,7 +8283,7 @@ def cherry_picking(sbox):
# Construct proper regex for '\' infested Windows paths.
if sys.platform == 'win32':
expected_out = expected_out.replace("\\", "\\\\")
- svntest.actions.run_and_verify_svn(None, expected_out, [],
+ svntest.actions.run_and_verify_svn(expected_out, [],
'propget', '-R', SVN_PROP_MERGEINFO,
D_COPY_path)
@@ -8839,7 +8321,7 @@ def propchange_of_subdir_raises_conflict(sbox):
'A/B/E' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge /A/B to /A_COPY/B ie., r1 to r3 with depth files
expected_output = wc.State(A_COPY_B_path, {
@@ -8878,8 +8360,8 @@ def propchange_of_subdir_raises_conflict(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1, '--depth', 'files',
+ [], True, True,
+ '--depth', 'files',
A_COPY_B_path)
# Merge /A/B to /A_COPY/B ie., r1 to r3 with infinite depth
@@ -8918,8 +8400,7 @@ def propchange_of_subdir_raises_conflict(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1)
+ [], 1, 1)
#----------------------------------------------------------------------
# Test for issue #2971: Reverse merge of prop add segfaults if
@@ -8939,16 +8420,14 @@ def reverse_merge_prop_add_on_child(sbox):
G_COPY_path = sbox.ospath('A_COPY/D/G')
# Make some prop changes to some dirs.
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
G_path + "'\n"], [], 'ps',
'prop:name', 'propval', G_path)
expected_output = svntest.wc.State(wc_dir, {'A/D/G': Item(verb='Sending'),})
wc_status.tweak('A/D/G', wc_rev=3)
wc_disk.tweak('A/D/G', props={'prop:name' : 'propval'})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge -c3's prop add to A_COPY/D/G
expected_output = wc.State(G_COPY_path, {
@@ -8981,8 +8460,7 @@ def reverse_merge_prop_add_on_child(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Now merge -c-3 but target the previous target's parent instead.
expected_output = wc.State(D_COPY_path, {
@@ -9028,8 +8506,7 @@ def reverse_merge_prop_add_on_child(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@XFail()
@@ -9053,7 +8530,7 @@ def merge_target_with_non_inheritable_mergeinfo(sbox):
# Make a modifications to A/B/lambda and add A/B/E/newfile
svntest.main.file_write(lambda_path, "This is the file 'lambda' modified.\n")
svntest.main.file_write(newfile_path, "This is the file 'newfile'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', newfile_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', newfile_path)
expected_output = wc.State(wc_dir, {
'A/B/lambda' : Item(verb='Sending'),
'A/B/E/newfile' : Item(verb='Adding'),
@@ -9063,7 +8540,7 @@ def merge_target_with_non_inheritable_mergeinfo(sbox):
'A/B/E/newfile' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge /A/B to /A_COPY/B ie., r1 to r3 with depth immediates
expected_output = wc.State(A_COPY_B_path, {
@@ -9106,8 +8583,8 @@ def merge_target_with_non_inheritable_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1, '--depth', 'immediates',
+ [], True, True,
+ '--depth', 'immediates',
A_COPY_B_path)
# Merge /A/B to /A_COPY/B ie., r1 to r3 with infinite depth
@@ -9146,8 +8623,7 @@ def merge_target_with_non_inheritable_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -9173,13 +8649,11 @@ def self_reverse_merge(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# update to HEAD so that the to-be-undone revision is found in the
# implicit mergeinfo (the natural history) of the target.
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
expected_output = wc.State(wc_dir, {
'A/mu' : Item(status='U ')
@@ -9200,12 +8674,12 @@ def self_reverse_merge(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ [], True, True)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# record dummy self mergeinfo to test the fact that self-reversal should work
# irrespective of mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ svntest.actions.run_and_verify_svn(None, [], 'ps', SVN_PROP_MERGEINFO,
'/:1', wc_dir)
# Bad svntest.main.greek_state does not have '', so adding it explicitly.
@@ -9224,7 +8698,7 @@ def self_reverse_merge(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -9251,9 +8725,9 @@ def ignore_ancestry_and_mergeinfo(sbox):
'A/B/lambda' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Merge /A/B to /A_COPY/B ie., r1 to r3 with depth immediates
expected_output = wc.State(A_COPY_B_path, {
@@ -9290,10 +8764,10 @@ def ignore_ancestry_and_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
# Now, revert lambda and repeat the merge. Nothing should happen.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R',
A_COPY_lambda_path)
expected_output.remove('lambda')
expected_disk.tweak('lambda', contents="This is the file 'lambda'.\n")
@@ -9309,7 +8783,7 @@ def ignore_ancestry_and_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
# Now, try the merge again with --ignore-ancestry. We should get
# lambda re-modified. */
@@ -9330,7 +8804,7 @@ def ignore_ancestry_and_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--ignore-ancestry', A_COPY_B_path)
#----------------------------------------------------------------------
@@ -9361,7 +8835,7 @@ def merge_from_renamed_branch_fails_while_avoiding_repeat_merge(sbox):
svntest.main.run_svn(None, 'cp', A_C_url, A_COPY_C_url, '-m', 'copy...')
svntest.main.run_svn(None, 'mv', A_COPY_C_url, A_RENAMED_C_url, '-m',
'rename...')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
svntest.main.file_write(A_RENAMED_C_file1_path, "This is the file1.\n")
svntest.main.run_svn(None, 'add', A_RENAMED_C_file1_path)
@@ -9373,8 +8847,7 @@ def merge_from_renamed_branch_fails_while_avoiding_repeat_merge(sbox):
'file1' : Item(status=' ', wc_rev=4),
})
svntest.actions.run_and_verify_commit(A_RENAMED_C_path, expected_output,
- expected_status, None,
- A_RENAMED_C_path)
+ expected_status)
svntest.main.file_write(A_RENAMED_C_file1_path,
"This is the file1 modified.\n")
expected_output = wc.State(A_RENAMED_C_path, {
@@ -9382,8 +8855,7 @@ def merge_from_renamed_branch_fails_while_avoiding_repeat_merge(sbox):
})
expected_status.tweak('file1', wc_rev=5)
svntest.actions.run_and_verify_commit(A_RENAMED_C_path, expected_output,
- expected_status, None,
- A_RENAMED_C_path)
+ expected_status)
expected_skip = wc.State(A_C_path, {})
expected_output = wc.State(A_C_path, {
@@ -9410,7 +8882,7 @@ def merge_from_renamed_branch_fails_while_avoiding_repeat_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
expected_output = wc.State(A_C_path, {
'file1' : Item(status='U '),
@@ -9434,7 +8906,7 @@ def merge_from_renamed_branch_fails_while_avoiding_repeat_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
# Test for part of issue #2877: 'do subtree merge only if subtree has
@@ -9455,7 +8927,8 @@ def merge_source_normalization_and_subtree_merges(sbox):
wc_disk, wc_status = set_up_branch(sbox)
# r7 - Move A to A_MOVED
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 7.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 7.\n'],
[], 'mv', '-m', 'mv A to A_MOVED',
sbox.repo_url + '/A',
sbox.repo_url + '/A_MOVED')
@@ -9487,7 +8960,7 @@ def merge_source_normalization_and_subtree_merges(sbox):
wc_status.tweak(status=' ', wc_rev=7)
# Update the WC
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
# r8 - Make a text mod to 'A_MOVED/D/G/tau'
@@ -9496,8 +8969,7 @@ def merge_source_normalization_and_subtree_merges(sbox):
expected_output = wc.State(wc_dir,
{'A_MOVED/D/G/tau' : Item(verb='Sending')})
wc_status.tweak('A_MOVED/D/G/tau', status=' ', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge -c4 URL/A_MOVED/D/G A_COPY/D/G.
#
@@ -9535,8 +9007,7 @@ def merge_source_normalization_and_subtree_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge -c8 URL/A_MOVED/D A_COPY/D.
#
@@ -9587,8 +9058,7 @@ def merge_source_normalization_and_subtree_merges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Tests for issue #3067: 'subtrees with intersecting mergeinfo, that don't
@@ -9612,16 +9082,14 @@ def new_subtrees_should_not_break_merge(sbox):
# Create 'A/D/H/nu', commit it as r7, make a text mod to it in r8.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Adding')})
wc_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=7)})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
svntest.main.file_write(nu_path, "New content")
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Sending')})
wc_status.tweak('A/D/H/nu', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge r7 to A_COPY/D/H, then, so it has it's own explicit mergeinfo,
# then merge r8 to A_COPY/D/H/nu so it too has explicit mergeinfo.
@@ -9655,12 +9123,11 @@ def new_subtrees_should_not_break_merge(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# run_and_verify_merge doesn't support merging to a file WCPATH
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[8]],
['U ' + nu_COPY_path + '\n',
' G ' + nu_COPY_path + '\n']),
@@ -9732,8 +9199,7 @@ def new_subtrees_should_not_break_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
expected_output = wc.State(D_COPY_path, {
'H/omega': Item(status='G '),
})
@@ -9778,8 +9244,7 @@ def new_subtrees_should_not_break_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Now once again merge r6 to A_COPY. A_COPY already has r6 in its mergeinfo
# so we expect only subtree merges on A_COPY/D, A_COPY_D_H, and
# A_COPY/D/H/nu. The fact that A/D/H/nu doesn't exist at r6 should not cause
@@ -9850,13 +9315,12 @@ def new_subtrees_should_not_break_merge(sbox):
expected_disk_1,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Commit this merge as r9.
#
# Update the wc first to make setting the expected status a bit easier.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
wc_status.tweak(wc_rev=8)
expected_output = wc.State(wc_dir, {
@@ -9872,15 +9336,14 @@ def new_subtrees_should_not_break_merge(sbox):
'A_COPY/D/H/omega',
wc_rev=9)
wc_status.add({'A_COPY/D/H/nu' : Item(status=' ', wc_rev=9)})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Update the WC.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [],
'up', wc_dir)
wc_status.tweak(wc_rev=9)
# Yet another test for issue #3067. Merge -rX:Y, where X>Y (reverse merge)
- # and the merge target has a subtree that came into existance at some rev
+ # and the merge target has a subtree that came into existence at some rev
# N where X < N < Y. This merge should simply delete the subtree.
#
# For this test merge -r9:2 to A_COPY. This should revert all the merges
@@ -9950,14 +9413,12 @@ def new_subtrees_should_not_break_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Revert the previous merge, then merge r4 to A_COPY/D/G/rho. Commit
# this merge as r10.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]],
['U ' + rho_COPY_path + '\n',
' G ' + rho_COPY_path + '\n']),
@@ -9965,9 +9426,8 @@ def new_subtrees_should_not_break_merge(sbox):
expected_output = wc.State(wc_dir, {
'A_COPY/D/G/rho' : Item(verb='Sending'),})
wc_status.tweak('A_COPY/D/G/rho', wc_rev=10)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(10), [],
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(10), [],
'up', wc_dir)
wc_status.tweak(wc_rev=10)
@@ -10022,8 +9482,7 @@ def new_subtrees_should_not_break_merge(sbox):
expected_disk_1,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -10106,8 +9565,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
expected_A_COPY_disk,
expected_A_COPY_status,
expected_A_COPY_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Change 'A_COPY/mu'
svntest.main.file_write(mu_COPY_path, "New content")
@@ -10121,9 +9579,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
wc_status.tweak('A_COPY', 'A_COPY/D/H/psi', 'A_COPY/mu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# Merge r7 back to the 'A'
expected_output = wc.State(A_path, {
@@ -10185,13 +9641,11 @@ def dont_add_mergeinfo_from_own_history(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, None, None, None,
- None, True, False,
+ [], True, False,
'--allow-mixed-revisions', A_path)
# Revert all local mods
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '" + A_path + "'\n",
+ svntest.actions.run_and_verify_svn(["Reverted '" + A_path + "'\n",
"Reverted '" + mu_path + "'\n"],
[], 'revert', '-R', wc_dir)
@@ -10200,8 +9654,8 @@ def dont_add_mergeinfo_from_own_history(sbox):
# 'A_MOVED', but 'A_MOVED@3' is 'A', so again this mergeinfo is filtered
# out, leaving the only the mergeinfo created from the merge itself:
# '/A_COPY:7'.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 8.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 8.\n'],
[], 'move',
sbox.repo_url + '/A',
sbox.repo_url + '/A_MOVED',
@@ -10285,8 +9739,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
expected_output,
wc_disk,
wc_status,
- None, None, None, None, None,
- True)
+ check_props=True)
expected_output = wc.State(A_MOVED_path, {
'mu' : Item(status='U '),
@@ -10326,12 +9779,10 @@ def dont_add_mergeinfo_from_own_history(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Revert all local mods
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '" + A_MOVED_path + "'\n",
+ svntest.actions.run_and_verify_svn(["Reverted '" + A_MOVED_path + "'\n",
"Reverted '" + mu_MOVED_path + "'\n"],
[], 'revert', '-R', wc_dir)
@@ -10364,7 +9815,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
"A " + sbox.ospath('A/D/H/psi') + "\n",
"Exported revision 1.\n",]
)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'export', sbox.repo_url + '/A@1',
A_path)
expected_output = svntest.verify.UnorderedOutput(
@@ -10388,7 +9839,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
"A " + sbox.ospath('A/D/H/omega') + "\n",
"A " + sbox.ospath('A/D/H/psi') + "\n",]
)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'add', A_path)
# Commit the new 'A' as r9
expected_output = wc.State(wc_dir, {
@@ -10437,9 +9888,7 @@ def dont_add_mergeinfo_from_own_history(sbox):
wc_status.tweak(status=' ')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
expected_output = wc.State(A_path, {
'mu' : Item(status='U '),
@@ -10502,10 +9951,10 @@ def dont_add_mergeinfo_from_own_history(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
@Issue(3094)
def merge_range_predates_history(sbox):
"merge range predates history"
@@ -10523,7 +9972,7 @@ def merge_range_predates_history(sbox):
# Tweak a file and commit. (r2)
svntest.main.file_append(iota_path, "More data.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'tweak iota', wc_dir)
+ sbox.simple_commit(message='tweak iota')
# Create our trunk and branches directory, and update working copy. (r3)
svntest.main.run_svn(None, 'mkdir', trunk_url, branches_url,
@@ -10533,7 +9982,7 @@ def merge_range_predates_history(sbox):
# Add a file to the trunk and commit. (r4)
svntest.main.file_append(trunk_file_path, "This is the file 'file'.\n")
svntest.main.run_svn(None, 'add', trunk_file_path)
- svntest.main.run_svn(None, 'ci', '-m', 'add trunk file', wc_dir)
+ sbox.simple_commit(message='add trunk file')
# Branch trunk from r3, and update working copy. (r5)
svntest.main.run_svn(None, 'cp', trunk_url, branch_url, '-r3',
@@ -10545,7 +9994,7 @@ def merge_range_predates_history(sbox):
expected_output = expected_merge_output([[4,5]],
['A ' + branch_file_path + '\n',
' U ' + branch_path + '\n'])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
trunk_url, branch_path)
#----------------------------------------------------------------------
@@ -10636,9 +10085,7 @@ def foreign_repos(sbox):
+ added_contents)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk, True)
# Now, merge our committed revision into a working copy of another
@@ -10647,7 +10094,7 @@ def foreign_repos(sbox):
### TODO: Use run_and_verify_merge() ###
svntest.main.run_svn(None, 'merge', '-c2', sbox.repo_url, wc_dir2)
- svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+ sbox2.simple_commit(message='Merge from foreign repo')
svntest.actions.verify_disk(wc_dir2, expected_disk, True)
# Now, let's make a third checkout -- our second from the original
@@ -10656,7 +10103,7 @@ def foreign_repos(sbox):
# This is a regression test for issue #3623 in which wc_dir2 had the
# correct state but the committed state was wrong.
wc_dir3 = sbox.add_wc_path('wc3')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox2.repo_url, wc_dir3)
svntest.actions.verify_disk(wc_dir3, expected_disk, True)
@@ -10703,13 +10150,11 @@ def foreign_repos_uuid(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk, True)
svntest.main.run_svn(None, 'merge', '-c2', sbox.repo_url, wc_dir2)
- svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+ sbox2.simple_commit(message='Merge from foreign repos')
# Run info to check the copied rev to make sure it's right
zeta2_path = os.path.join(wc_dir2, 'A', 'D', 'G', 'zeta')
@@ -10813,9 +10258,7 @@ def foreign_repos_2_url(sbox):
+ added_contents)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk, True)
# Now, "tag" the new state of the repository.
@@ -10831,7 +10274,7 @@ def foreign_repos_2_url(sbox):
svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A-tag1',
sbox.repo_url + '/A-tag2',
os.path.join(wc_dir2, 'A'))
- svntest.main.run_svn(None, 'ci', '-m', 'Merge from foreign repos', wc_dir2)
+ sbox2.simple_commit(message='Merge from foreign repos')
svntest.actions.verify_disk(wc_dir2, expected_disk, True)
#----------------------------------------------------------------------
@@ -10854,9 +10297,11 @@ def merge_added_subtree(sbox):
A_COPY_url = url + "/A_COPY"
A_path = sbox.ospath('A')
- svntest.actions.run_and_verify_svn("",["\n", "Committed revision 2.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
"cp", "-m", "", A_url, A_COPY_url)
- svntest.actions.run_and_verify_svn("",["\n", "Committed revision 3.\n"], [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 3.\n"], [],
"cp", "-m", "",
A_COPY_url + '/D',
A_COPY_url + '/D2')
@@ -10905,14 +10350,14 @@ def merge_added_subtree(sbox):
})
# Using the above information, verify a REPO->WC copy
- svntest.actions.run_and_verify_svn("", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"cp", A_COPY_url + '/D2',
os.path.join(A_path, "D2"))
svntest.actions.verify_disk(A_path, expected_disk)
svntest.actions.run_and_verify_status(A_path, expected_status)
# Remove the copy artifacts
- svntest.actions.run_and_verify_svn("", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"revert", "-R", A_path)
svntest.main.safe_rmtree(os.path.join(A_path, "D2"))
@@ -10943,14 +10388,14 @@ def merge_unknown_url(sbox):
# remove a path from the repo and commit.
iota_path = sbox.ospath('iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path)
- svntest.actions.run_and_verify_svn("", None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota_path)
+ svntest.actions.run_and_verify_svn(None, [],
"ci", wc_dir, "-m", "log message")
url = sbox.repo_url + "/iota"
expected_err = ".*File not found.*iota.*|.*iota.*path not found.*"
- svntest.actions.run_and_verify_svn("", None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
"merge", url, wc_dir)
#----------------------------------------------------------------------
@@ -10995,7 +10440,7 @@ def reverse_merge_away_all_mergeinfo(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Commit the merge as r7
expected_output = wc.State(wc_dir, {
@@ -11007,9 +10452,7 @@ def reverse_merge_away_all_mergeinfo(sbox):
wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# Now reverse merge r7 from itself, all mergeinfo should be removed.
expected_output = wc.State(A_COPY_H_path, {
@@ -11042,7 +10485,7 @@ def reverse_merge_away_all_mergeinfo(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None,
+ [],
True, False, '--allow-mixed-revisions',
A_COPY_H_path)
@@ -11087,35 +10530,35 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
expected_status.tweak('A/D/H/psi', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A/D/H/psi', contents="New content")
# Create 'A/D/H/nu' and commit it as r3.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Adding')})
expected_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=3)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Delete 'A/D/H/nu' and commit it as r4.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', nu_path)
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Deleting')})
expected_status.remove('A/D/H/nu')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Copy 'A/D/H/nu' from r3 and commit it as r5.
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.repo_url + '/A/D/H/nu@3', nu_path)
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Adding')})
expected_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=5)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Copy 'A/D/H' to 'H_COPY' in r6.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 6.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 6.\n'],
[], 'copy',
sbox.repo_url + "/A/D/H",
sbox.repo_url + "/H_COPY",
@@ -11136,7 +10579,7 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Sending')})
expected_status.tweak('A/D/H/nu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Remove A/D/H/nu and commit it as r8.
# We do this deletion so that following cherry harvest has a *tough*
@@ -11145,7 +10588,7 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Deleting')})
expected_status.remove('A/D/H/nu')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make another text mod to 'A/D/H/psi' that can be merged to 'H_COPY'
# during a cherry harvest and commit it as r9.
@@ -11153,7 +10596,7 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
expected_status.tweak('A/D/H/psi', wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A/D/H/psi', contents="Even *newer* content")
# Update WC so elision occurs smoothly.
@@ -11162,7 +10605,6 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
# Merge r7 from 'A/D/H/nu' to 'H_COPY/nu'.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[7]],
['U ' + nu_COPY_path + '\n',
' U ' + nu_COPY_path + '\n']),
@@ -11178,13 +10620,12 @@ def dont_merge_revs_into_subtree_that_predate_it(sbox):
expected_skip = wc.State(H_COPY_path, { })
#Cherry pick r2 prior to cherry harvest.
- svntest.actions.run_and_verify_svn(None, [], [], 'merge', '-c2',
+ svntest.actions.run_and_verify_svn([], [], 'merge', '-c2',
sbox.repo_url + '/A/D/H',
H_COPY_path)
# H_COPY needs r6-9 applied while H_COPY/nu needs only 6,8-9.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output(
[[7,9], # Merge notification
[6,9]], # Mergeinfo notification
@@ -11233,7 +10674,7 @@ def set_up_renamed_subtree(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
expected_status.tweak('A/D/H/psi', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A/D/H/psi', contents="New content")
# Make a text mod to 'A/D/H/omega' and commit it as r3
@@ -11241,11 +10682,11 @@ def set_up_renamed_subtree(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/omega' : Item(verb='Sending')})
expected_status.tweak('A/D/H/omega', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.tweak('A/D/H/omega', contents="New omega")
# Move 'A/D/H/psi' to 'A/D/H/psi_moved' and commit it as r4.
- svntest.actions.run_and_verify_svn(None, None, [], 'move',
+ svntest.actions.run_and_verify_svn(None, [], 'move',
psi_path, psi_moved_path)
expected_output = wc.State(wc_dir, {
'A/D/H/psi' : Item(verb='Deleting'),
@@ -11259,15 +10700,15 @@ def set_up_renamed_subtree(sbox):
# this so we still want to test that the issue #3067 fixes tested by
# merge_chokes_on_renamed_subtrees and subtrees_with_empty_mergeinfo
# still work.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ svntest.actions.run_and_verify_svn(None, [], 'ps', SVN_PROP_MERGEINFO,
"", psi_moved_path)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Copy 'A/D/H' to 'H_COPY' in r5.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 5.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 5.\n'],
[], 'copy',
sbox.repo_url + "/A/D/H",
sbox.repo_url + "/H_COPY",
@@ -11288,7 +10729,7 @@ def set_up_renamed_subtree(sbox):
{'A/D/H/psi_moved' : Item(verb='Sending')})
expected_status.tweak('A/D/H/psi_moved', wc_rev=6)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
expected_disk.remove('A/D/H/psi')
expected_disk.add({
'A/D/H/psi_moved' : Item("Even *Newer* content"),
@@ -11321,7 +10762,6 @@ def merge_chokes_on_renamed_subtrees(sbox):
# Here is where issue #3174 appears, the merge fails with:
# svn: svn: File not found: revision 3, path '/A/D/H/psi'
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5,6],[3,6]],
['U ' + psi_COPY_moved_path + '\n',
' U ' + psi_COPY_moved_path + '\n',
@@ -11353,7 +10793,7 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
nu_copy_path = sbox.ospath('A_copy/D/H/nu')
def _commit_and_update(rev, action):
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'r%d - %s' % (rev, action),
sbox.wc_dir)
svntest.main.run_svn(None, 'up', wc_dir)
@@ -11381,7 +10821,6 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
# a propget.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]], ['U ' + A_copy_mu_path + '\n',
' U ' + A_copy_mu_path + '\n']),
[], 'merge', '-c5', sbox.repo_url + '/A_copy2/mu', A_copy_mu_path)
@@ -11450,13 +10889,13 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# Revert the previous merges and try a cherry harvest merge where
# the subtree's natural history is a proper subset of the merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
wc_status = svntest.actions.get_virginal_state(wc_dir, 5)
wc_status.add({
'A_copy' : Item(),
@@ -11502,18 +10941,18 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
# r6 - Add the file 'A/D/H/nu'.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Adding')})
wc_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=6)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r7 - Make a change to 'A/D/H/nu'.
svntest.main.file_write(nu_path, "Nu content")
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Sending')})
wc_status.tweak('A/D/H/nu', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r8 - Merge r6 to 'A_copy'.
expected_output = wc.State(A_copy_path, {
@@ -11577,8 +11016,7 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
expected_A_copy_disk,
expected_A_copy_status,
expected_A_copy_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
wc_status.add({'A_copy/D/H/nu' : Item(status=' ', wc_rev=8)})
wc_status.tweak('A_copy', wc_rev=8)
expected_output = wc.State(wc_dir, {
@@ -11586,7 +11024,7 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
'A_copy' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r9 - Merge r7 to 'A_copy/D/H/nu'.
expected_skip = wc.State(nu_copy_path, { })
@@ -11594,7 +11032,6 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[7]],
['U ' + nu_copy_path + '\n',
' G ' + nu_copy_path + '\n',]),
@@ -11602,10 +11039,10 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
expected_output = wc.State(wc_dir, {'A_copy/D/H/nu' : Item(verb='Sending')})
wc_status.tweak('A_copy/D/H/nu', wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Update WC
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
wc_status.tweak(wc_rev=9)
# r10 - Make another change to 'A/D/H/nu'.
@@ -11613,10 +11050,10 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Sending')})
wc_status.tweak('A/D/H/nu', wc_rev=10)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Update WC
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
wc_status.tweak(wc_rev=10)
# Now do a cherry harvest merge to 'A_copy'.
@@ -11683,8 +11120,7 @@ def dont_explicitly_record_implicit_mergeinfo(sbox):
expected_A_copy_disk,
expected_A_copy_status,
expected_A_copy_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue where merging a change to a broken link fails
@@ -11709,7 +11145,6 @@ def merge_broken_link(sbox):
os.symlink('beta', link_path)
svntest.main.run_svn(None, 'commit', '-m', 'Fix a broken link', link_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]],
['U ' + copy_path + '/beta_link\n',
' U ' + copy_path + '\n']),
@@ -11750,12 +11185,12 @@ def subtree_merges_dont_intersect_with_targets(sbox):
})
wc_status.tweak('A/D/gamma', 'A/D/H/psi', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
wc_disk.tweak('A/D/gamma', contents="New content")
wc_disk.tweak('A/D/H/psi', contents="Even newer content")
# Update the WC.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'update', wc_dir)
wc_status.tweak(wc_rev=8)
@@ -11774,27 +11209,27 @@ def subtree_merges_dont_intersect_with_targets(sbox):
# run_and_verify_merge() because these types of simple merges are
# tested to death elsewhere and this is just setup for the "real"
# test.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c4',
sbox.repo_url + '/A/D/H/psi',
psi_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c8',
sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c-8',
sbox.repo_url + '/A/D/H/psi',
psi_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge',
sbox.repo_url + '/A',
A_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c-5',
sbox.repo_url + '/A',
A_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c5', '-c-8',
sbox.repo_url + '/A/D/H',
H_COPY_2_path)
@@ -11823,12 +11258,10 @@ def subtree_merges_dont_intersect_with_targets(sbox):
wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# Update the WC.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [],
'update', wc_dir)
# Make sure we have mergeinfo that meets the two criteria set out above.
@@ -11912,8 +11345,7 @@ def subtree_merges_dont_intersect_with_targets(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merging to the criterion 1 branch.
#
@@ -11986,8 +11418,7 @@ def subtree_merges_dont_intersect_with_targets(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Test the notification portion of issue #3199.
#
@@ -12004,7 +11435,7 @@ def subtree_merges_dont_intersect_with_targets(sbox):
### shortcomings (and allowed merges to file targets).
#
# Revert the previous merges.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
# Repeat the forward merge
expected_output = expected_merge_output(
@@ -12014,7 +11445,7 @@ def subtree_merges_dont_intersect_with_targets(sbox):
' U %s\n' % (H_COPY_2_path),
' U %s\n' % (A_COPY_2_path),],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-r', '3:9',
sbox.repo_url + '/A',
A_COPY_2_path)
@@ -12026,7 +11457,7 @@ def subtree_merges_dont_intersect_with_targets(sbox):
' U %s\n' % (A_COPY_path),
' U %s\n' % (psi_COPY_path)],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-r', '9:3',
sbox.repo_url + '/A',
A_COPY_path)
@@ -12053,7 +11484,7 @@ def subtree_source_missing_in_requested_range(sbox):
omega_COPY_path = sbox.ospath('A_COPY/D/H/omega')
# r7 Delete A/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete', psi_path)
sbox.simple_commit(message='delete psi')
@@ -12065,7 +11496,7 @@ def subtree_source_missing_in_requested_range(sbox):
expected_output = expected_merge_output(
[[3]], ['U %s\n' % (psi_COPY_path),
' U %s\n' % (psi_COPY_path),])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c', '3',
sbox.repo_url + '/A/D/H/psi@3',
psi_COPY_path)
@@ -12075,12 +11506,12 @@ def subtree_source_missing_in_requested_range(sbox):
expected_output = expected_merge_output(
[[6]], ['U %s\n' % (omega_COPY_path),
' U %s\n' % (omega_COPY_path),])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c', '6',
sbox.repo_url + '/A/D/H/omega',
omega_COPY_path)
sbox.simple_commit(message='merge r6 to A_COPY')
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(10), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(10), [], 'up',
wc_dir)
# r11 - Merge r8 to A_COPY.
@@ -12088,7 +11519,7 @@ def subtree_source_missing_in_requested_range(sbox):
[[8]], ['U %s\n' % (omega_COPY_path),
' U %s\n' % (omega_COPY_path),
' U %s\n' % (A_COPY_path)])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c', '8',
sbox.repo_url + '/A',
A_COPY_path)
@@ -12102,12 +11533,12 @@ def subtree_source_missing_in_requested_range(sbox):
[[8]], [' G %s\n' % (omega_COPY_path),
' U %s\n' % (psi_COPY_path),
' G %s\n' % (A_COPY_path)])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c', '8',
sbox.repo_url + '/A',
A_COPY_path, '--record-only')
sbox.simple_commit(message='merge r8 to A_COPY/D/H/omega')
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(11), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(11), [], 'up',
wc_dir)
# r12 - modify A/D/H/omega yet again.
@@ -12119,12 +11550,12 @@ def subtree_source_missing_in_requested_range(sbox):
expected_output = expected_merge_output(
[[9,12],[2,12]], ['U %s\n' % (omega_COPY_path),
' U %s\n' % (omega_COPY_path)])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge',
sbox.repo_url + '/A/D/H/omega',
omega_COPY_path)
sbox.simple_commit(message='cherry harvest to A_COPY/D/H/omega')
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(13), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(13), [], 'up',
wc_dir)
# Check that svn:mergeinfo is as expected.
@@ -12134,7 +11565,7 @@ def subtree_source_missing_in_requested_range(sbox):
psi_COPY_path : '/A/D/H/psi:3,8' })
# Now test a reverse merge where part of the requested range postdates
- # a subtree's existance. Merge -r12:1 to A_COPY. This should revert
+ # a subtree's existence. Merge -r12:1 to A_COPY. This should revert
# all of the merges done thus far. The fact that A/D/H/psi no longer
# exists after r7 shouldn't break the subtree merge into A_COPY/D/H/psi.
# A_COPY/D/H/psi should simply have r3 reverse merged. No paths under
@@ -12204,11 +11635,10 @@ def subtree_source_missing_in_requested_range(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, True, False)
+ [], True, False)
# Revert the previous merge.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', wc_dir)
# Merge r12 to A_COPY and commit as r14.
expected_output = wc.State(A_COPY_path, {})
@@ -12270,8 +11700,7 @@ def subtree_source_missing_in_requested_range(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, True, False)
+ [], True, False)
# As we did earlier, repeat the merge with the --record-only option to
# preserve the old behavior of recording mergeinfo on every subtree, thus
# allowing this test to actually test the issue #3067 fixes.
@@ -12280,7 +11709,7 @@ def subtree_source_missing_in_requested_range(sbox):
' G %s\n' % (A_COPY_path),
' U %s\n' % (psi_COPY_path),
' U %s\n' % (omega_COPY_path),])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '-c', '12',
sbox.repo_url + '/A',
A_COPY_path, '--record-only')
@@ -12289,7 +11718,7 @@ def subtree_source_missing_in_requested_range(sbox):
# Update A_COPY/D/H/rho back to r13 so it's mergeinfo doesn't include
# r12. Then merge a range, -r6:12 which should delete a subtree
# (A_COPY/D/H/psi).
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(14), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(14), [], 'up',
wc_dir)
expected_output = wc.State(A_COPY_path, {
'D/H/psi' : Item(status='D '),
@@ -12350,8 +11779,7 @@ def subtree_source_missing_in_requested_range(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, True, False)
+ [], True, False)
#----------------------------------------------------------------------
# Another test for issue #3067: 'subtrees that don't exist at the start
@@ -12406,11 +11834,12 @@ def subtrees_with_empty_mergeinfo(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3240 'commits to subtrees added by merge
# corrupt working copy and repos'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3240)
def commit_to_subtree_added_by_merge(sbox):
"commits to subtrees added by merge wreak havoc"
@@ -12432,14 +11861,14 @@ def commit_to_subtree_added_by_merge(sbox):
# subtree as r3.
os.mkdir(N_path)
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', N_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', N_path)
expected_output = wc.State(wc_dir,
{'A/D/H/N' : Item(verb='Adding'),
'A/D/H/N/nu' : Item(verb='Adding')})
wc_status.add({'A/D/H/N' : Item(status=' ', wc_rev=3),
'A/D/H/N/nu' : Item(status=' ', wc_rev=3)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Merge r3 to 'A_COPY/D/H', creating A_COPY/D/H/N' and 'A_COPY/D/H/N/nu'.
# Commit the merge as r4.
@@ -12477,7 +11906,7 @@ def commit_to_subtree_added_by_merge(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
expected_output = wc.State(wc_dir, {
'A_COPY/D/H' : Item(verb='Sending'),
'A_COPY/D/H/N' : Item(verb='Adding'),
@@ -12486,7 +11915,7 @@ def commit_to_subtree_added_by_merge(sbox):
'A_COPY/D/H/N/nu' : Item(status=' ', wc_rev=4)})
wc_status.tweak('A_COPY/D/H', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Make a text change to 'A_COPY/D/H/N/nu' and commit it as r5. This
# is the first place issue #3240 appears over DAV layers, and the
@@ -12505,94 +11934,16 @@ def commit_to_subtree_added_by_merge(sbox):
{'A_COPY/D/H/N/nu' : Item(verb='Sending')})
wc_status.tweak('A_COPY/D/H/N/nu', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# The second place issue #3240 shows up is in the fact that the commit
# *did* succeed, but the wrong path ('A/D/H/nu' rather than 'A_COPY/D/H/nu')
# is affected. We can see this by running an update; since we just
# committed there shouldn't be any incoming changes.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(5), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(5), [], 'up',
wc_dir)
#----------------------------------------------------------------------
-# Helper functions. These take local paths using '/' separators.
-
-def local_path(path):
- "Convert a path from '/' separators to the local style."
- return os.sep.join(path.split('/'))
-
-def svn_mkfile(path):
- "Make and add a file with some default content, and keyword expansion."
- path = local_path(path)
- dirname, filename = os.path.split(path)
- svntest.main.file_write(path, "This is the file '" + filename + "'.\n" +
- "Last changed in '$Revision$'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', path)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
- 'svn:keywords', 'Revision', path)
-
-def svn_modfile(path):
- "Make text and property mods to a WC file."
- path = local_path(path)
- svntest.main.file_append(path, "An extra line.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
- 'newprop', 'v', path)
-
-def svn_copy(s_rev, path1, path2):
- "Copy a WC path locally."
- path1 = local_path(path1)
- path2 = local_path(path2)
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', '--parents',
- '-r', s_rev, path1, path2)
-
-def svn_merge(rev_range, source, target, lines=None, elides=[],
- text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
- text_resolved=0, prop_resolved=0, tree_resolved=0,
- args=[]):
- """Merge a single change from path SOURCE to path TARGET and verify the
- output and that there is no error. (The changes made are not verified.)
-
- REV_RANGE is either a number (to cherry-pick that specific change) or a
- two-element list [X,Y] to pick the revision range '-r(X-1):Y'.
-
- LINES is a list of regular expressions to match other lines of output; if
- LINES is 'None' then match all normal (non-conflicting) merges.
-
- ELIDES is a list of paths on which mergeinfo elision should be reported.
-
- TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
- each kind of conflict to expect.
-
- ARGS are additional arguments passed to svn merge.
- """
-
- source = local_path(source)
- target = local_path(target)
- elides = [local_path(p) for p in elides]
- if isinstance(rev_range, int):
- mi_rev_range = [rev_range]
- rev_arg = '-c' + str(rev_range)
- else:
- mi_rev_range = rev_range
- rev_arg = '-r' + str(rev_range[0] - 1) + ':' + str(rev_range[1])
- if lines is None:
- lines = ["(A |D |[UG] | [UG]|[UG][UG]) " + target + ".*\n"]
- else:
- # Expect mergeinfo on the target; caller must supply matches for any
- # subtree mergeinfo paths.
- lines.append(" [UG] " + target + "\n")
- exp_out = expected_merge_output([mi_rev_range], lines, target=target,
- elides=elides,
- text_conflicts=text_conflicts,
- prop_conflicts=prop_conflicts,
- tree_conflicts=tree_conflicts,
- text_resolved=text_resolved,
- prop_resolved=prop_resolved,
- tree_resolved=tree_resolved)
- svntest.actions.run_and_verify_svn(None, exp_out, [],
- 'merge', rev_arg, source, target, *args)
-
-#----------------------------------------------------------------------
# Tests for merging the deletion of a node, where the node to be deleted
# is the same as or different from the node that was deleted.
@@ -12697,19 +12048,18 @@ def subtree_merges_dont_cause_spurious_conflicts(sbox):
expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
wc_status.tweak('A/D/G/rho', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
wc_disk.tweak('A/D/G/rho', contents="Newer content")
# r8 Make another text change to A/D/G/rho.
svntest.main.file_write(rho_path, "Even *newer* content")
expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
wc_status.tweak('A/D/G/rho', wc_rev=8)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
wc_disk.tweak('A/D/G/rho', contents="Even *newer* content")
# Update the WC to allow full mergeinfo inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=8)
@@ -12776,12 +12126,11 @@ def subtree_merges_dont_cause_spurious_conflicts(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1)
+ check_props=True)
# run_and_verify_merge doesn't support merging to a file WCPATH
# so use run_and_verify_svn.
### TODO: We can use run_and_verify_merge() here now.
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[-3]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[-3]],
['G ' + psi_COPY_path + '\n',
' G ' + psi_COPY_path + '\n']),
[], 'merge', '-c-3',
@@ -12802,10 +12151,10 @@ def subtree_merges_dont_cause_spurious_conflicts(sbox):
'A_COPY/D/H/omega',
wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Update the WC to allow full mergeinfo inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=9)
@@ -12892,7 +12241,7 @@ def subtree_merges_dont_cause_spurious_conflicts(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 0)
+ check_props=True)
#----------------------------------------------------------------------
# Test for yet another variant of issue #3067.
@@ -12918,18 +12267,18 @@ def merge_target_and_subtrees_need_nonintersecting_ranges(sbox):
# Add file A/D/G/nu in r7.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir, {'A/D/G/nu' : Item(verb='Adding')})
wc_status.add({'A/D/G/nu' : Item(status=' ', wc_rev=7)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Make a text mod to A/D/G/nu in r8.
svntest.main.file_write(nu_path, "New content")
expected_output = wc.State(wc_dir, {'A/D/G/nu' : Item(verb='Sending')})
wc_status.tweak('A/D/G/nu', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Do several merges to setup a situation where the merge
# target and two of its subtrees need non-intersecting ranges
@@ -12945,7 +12294,7 @@ def merge_target_and_subtrees_need_nonintersecting_ranges(sbox):
# of merges to death we don't use run_and_verify_merge() on these
# intermediate merges.
svntest.actions.run_and_verify_svn(
- None, expected_merge_output([[2,7]],
+ expected_merge_output([[2,7]],
['U ' + beta_COPY_path + '\n',
'A ' + nu_COPY_path + '\n',
'U ' + rho_COPY_path + '\n',
@@ -12955,12 +12304,12 @@ def merge_target_and_subtrees_need_nonintersecting_ranges(sbox):
),
[], 'merge', '-r0:7', sbox.repo_url + '/A', A_COPY_path)
svntest.actions.run_and_verify_svn(
- None, expected_merge_output([[8]], ['U ' + nu_COPY_path + '\n',
+ expected_merge_output([[8]], ['U ' + nu_COPY_path + '\n',
' G ' + nu_COPY_path + '\n']),
[], 'merge', '-c8', sbox.repo_url + '/A/D/G/nu', nu_COPY_path)
svntest.actions.run_and_verify_svn(
- None, expected_merge_output([[-6]], ['G ' + omega_COPY_path + '\n',
+ expected_merge_output([[-6]], ['G ' + omega_COPY_path + '\n',
' G ' + omega_COPY_path + '\n']),
[], 'merge', '-c-6', sbox.repo_url + '/A/D/H/omega', omega_COPY_path)
wc_status.add({'A_COPY/D/G/nu' : Item(status=' ', wc_rev=9)})
@@ -12978,11 +12327,10 @@ def merge_target_and_subtrees_need_nonintersecting_ranges(sbox):
'A_COPY/D/H/omega' : Item(verb='Sending'),
'A_COPY/D/H/psi' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Update the WC to allow full mergeinfo inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
# Merge all available revisions from A to A_COPY, the merge logic
@@ -13055,8 +12403,7 @@ def merge_target_and_subtrees_need_nonintersecting_ranges(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Part of this test is a regression test for issue #3250 "Repeated merging
@@ -13118,7 +12465,7 @@ def merge_two_edits_to_same_prop(sbox):
# the conflict, so it no longer tests the original #3250 scenario.
#
# Revert changes to branch wc
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', A_COPY_path)
# In the branch, make two successive changes to the same property
@@ -13135,7 +12482,7 @@ def merge_two_edits_to_same_prop(sbox):
], prop_conflicts=1, args=['--allow-mixed-revisions'])
# Revert changes to trunk wc, to test next scenario of #3250
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', A_path)
# Merge the first change, then the second, to trunk.
@@ -13235,7 +12582,7 @@ def merge_adds_mergeinfo_correctly(sbox):
D_COPY_2_path = sbox.ospath('A_COPY_2/D')
# Update working copy to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
wc_status.tweak(wc_rev=7)
@@ -13300,8 +12647,7 @@ def merge_adds_mergeinfo_correctly(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
wc_status.tweak('A_COPY',
'A_COPY/D/G/rho',
wc_rev=8)
@@ -13309,8 +12655,7 @@ def merge_adds_mergeinfo_correctly(sbox):
'A_COPY' : Item(verb='Sending'),
'A_COPY/D/G/rho' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge r7 from A/D to A_COPY_2/D and commit as r9.
# This creates explicit mergeinfo on A_COPY_2/D of '/A/D:7'.
@@ -13355,8 +12700,7 @@ def merge_adds_mergeinfo_correctly(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
wc_status.tweak('A_COPY_2/D',
'A_COPY_2/D/H/omega',
wc_rev=9)
@@ -13364,8 +12708,7 @@ def merge_adds_mergeinfo_correctly(sbox):
'A_COPY_2/D' : Item(verb='Sending'),
'A_COPY_2/D/H/omega' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Merge r9 from A_COPY_2 to A_COPY. A_COPY/D gets the explicit mergeinfo
# '/A/D/:7' added from r9. But it prior to the merge it inherited '/A/D:5'
@@ -13373,7 +12716,7 @@ def merge_adds_mergeinfo_correctly(sbox):
# the mergeinfo describing this merge '/A_COPY_2:9' should also be present
# in A_COPY's explicit mergeinfo.
# Update working copy to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [],
'up', wc_dir)
expected_output = wc.State(A_COPY_path, {
'D' : Item(status=' U'),
@@ -13436,16 +12779,15 @@ def merge_adds_mergeinfo_correctly(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Revert and repeat the above merge, but this time create some
# uncommitted mergeinfo on A_COPY/D, this should not cause a write
# lock error as was seen in http://subversion.tigris.org/
# ds/viewMessage.do?dsForumId=462&dsMessageId=103945
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', SVN_PROP_MERGEINFO, '',
D_COPY_path)
expected_output = wc.State(A_COPY_path, {
@@ -13466,8 +12808,7 @@ def merge_adds_mergeinfo_correctly(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -13581,27 +12922,25 @@ def natural_history_filtering(sbox):
"A_COPY_2" + '/D/H/omega' : Item("This is the file 'omega'.\n"),
"A_COPY_2" + '/D/H/psi' : Item("New content"),
})
- svntest.actions.run_and_verify_svn(None, expected, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected, [], 'copy',
sbox.repo_url + "/A",
A_COPY_2_path)
expected_output = wc.State(wc_dir, {"A_COPY_2" : Item(verb='Adding')})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- wc_status,
- None,
- wc_dir)
+ wc_status)
# r8: Make a text change under A, to A/D/H/chi.
svntest.main.file_write(chi_path, "New content")
expected_output = wc.State(wc_dir, {'A/D/H/chi' : Item(verb='Sending')})
wc_status.tweak('A/D/H/chi', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
wc_disk.tweak('A/D/H/psi', contents="New content")
# r9: Merge all available revisions from A to A_COPY. But first
# update working copy to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
wc_status.tweak(wc_rev=8)
expected_output = wc.State(A_COPY_path, {
@@ -13667,8 +13006,7 @@ def natural_history_filtering(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
wc_status.tweak('A_COPY',
'A_COPY/B/E/beta',
'A_COPY/D/G/rho',
@@ -13684,11 +13022,10 @@ def natural_history_filtering(sbox):
'A_COPY/D/H/psi' : Item(verb='Sending'),
'A_COPY/D/H/omega' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# Again update the working copy to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [],
'up', wc_dir)
wc_status.tweak(wc_rev=9)
@@ -13757,8 +13094,7 @@ def natural_history_filtering(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -13797,7 +13133,7 @@ def subtree_gets_changes_even_if_ultimately_deleted(sbox):
sbox.simple_commit(message='mod psi')
# r8: Delete A/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete', psi_path)
sbox.simple_commit(message='delete psi')
@@ -13836,10 +13172,9 @@ def subtree_gets_changes_even_if_ultimately_deleted(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 0,
+ [], True, False,
'-c3,7', H_COPY_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-7]],
['G ' + psi_COPY_path + '\n',
' G ' + psi_COPY_path + '\n',]),
@@ -13886,7 +13221,7 @@ def subtree_gets_changes_even_if_ultimately_deleted(sbox):
expected_elision_output,
expected_disk,
expected_status, expected_skip,
- None, None, None, None, None, 1, 0)
+ [], True, False)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -13906,8 +13241,7 @@ def no_self_referential_filtering_on_added_path(sbox):
wc_disk, wc_status = set_up_branch(sbox, False, 2)
# r8: Make a prop change on A_COPY/C.
- svntest.actions.run_and_verify_svn(None,
- ["property 'propname' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'propname' set on '" +
C_COPY_path + "'\n"], [],
'ps', 'propname', 'propval',
C_COPY_path)
@@ -13916,17 +13250,15 @@ def no_self_referential_filtering_on_added_path(sbox):
wc_status.tweak('A_COPY/C', wc_rev=8)
wc_disk.tweak("A_COPY/C",
props={'propname' : 'propval'})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# r9: Merge r8 from A_COPY to A.
#
# Update first to avoid an out of date error.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=8)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[8]],
[' U ' + C_path + '\n',
' U ' + A_path + '\n',]),
@@ -13935,8 +13267,7 @@ def no_self_referential_filtering_on_added_path(sbox):
{'A' : Item(verb='Sending'),
'A/C' : Item(verb='Sending')})
wc_status.tweak('A', 'A/C', wc_rev=9)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
wc_disk.tweak("A/C",
props={'propname' : 'propval'})
@@ -13944,13 +13275,13 @@ def no_self_referential_filtering_on_added_path(sbox):
props={SVN_PROP_MERGEINFO : '/A_COPY:8'})
# r10: Move A/C to A/C_MOVED.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 10.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 10.\n'],
[], 'move',
sbox.repo_url + '/A/C',
sbox.repo_url + '/A/C_MOVED',
'-m', 'Copy A/C to A/C_MOVED')
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
wc_dir)
# Now try to merge all available revisions from A to A_COPY_2.
@@ -14038,8 +13369,7 @@ def no_self_referential_filtering_on_added_path(sbox):
expected_A_COPY_2_disk,
expected_A_COPY_2_status,
expected_A_COPY_2_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3324
@@ -14087,27 +13417,26 @@ def merge_range_prior_to_rename_source_existence(sbox):
# r8 - Text change to A/B/E/alpha
svntest.main.file_write(alpha_path, "New content")
wc_status.tweak('A/B/E/alpha', wc_rev=8)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Text change', wc_dir)
# r9 - Add the file A/D/H/nu and make another change to A/B/E/alpha.
svntest.main.file_write(alpha_path, "Even newer content")
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
expected_output = wc.State(wc_dir,
{'A/D/H/nu' : Item(verb='Adding'),
'A/B/E/alpha' : Item(verb='Sending')})
wc_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=9)})
wc_status.tweak('A/B/E/alpha', wc_rev=9)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r10 - Merge all available revisions (i.e. -r1:9) from A to A_COPY.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=9)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[2,9]],
['A ' + nu_COPY_path + '\n',
'U ' + alpha_COPY_path + '\n',
@@ -14134,14 +13463,13 @@ def merge_range_prior_to_rename_source_existence(sbox):
wc_rev=10)
wc_status.add({'A_COPY/D/H/nu' : Item(status=' ', wc_rev=10)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r11 - Reverse merge -r9:1 from A/B to A_COPY/B
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(10), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(10), [], 'up',
wc_dir)
wc_status.tweak(wc_rev=10)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[9,2]], ['U ' + alpha_COPY_path + '\n',
'U ' + beta_COPY_path + '\n',
' G ' + B_COPY_path + '\n',]),
@@ -14155,10 +13483,10 @@ def merge_range_prior_to_rename_source_existence(sbox):
'A_COPY/B/E/beta',
wc_rev=11)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# r12 - Move A/D/H/nu to A/D/H/nu_moved
- svntest.actions.run_and_verify_svn(None, ["\n",
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
"Committed revision 12.\n"], [],
'move', sbox.repo_url + '/A/D/H/nu',
sbox.repo_url + '/A/D/H/nu_moved',
@@ -14169,7 +13497,7 @@ def merge_range_prior_to_rename_source_existence(sbox):
"A " + nu_moved_path + "\n",
"Updated to revision 12.\n"],
)
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'up', wc_dir)
# Now merge -r7:12 from A to A_COPY.
@@ -14246,9 +13574,8 @@ def merge_range_prior_to_rename_source_existence(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ check_props=True)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge -r7:12 from A to A_COPY', wc_dir)
# Now run a similar scenario as above on the second branch, but with
@@ -14264,20 +13591,19 @@ def merge_range_prior_to_rename_source_existence(sbox):
# Properties on 'A_COPY_2\B':
# svn:mergeinfo
# /A/B:3-13
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(13), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(13), [], 'up',
wc_dir)
- svntest.actions.run_and_verify_svn(None,
- None, # Don't check stdout, we test this
+ svntest.actions.run_and_verify_svn(None, # Don't check stdout, we test this
# type of merge to death elsewhere.
[], 'merge', sbox.repo_url + '/A/B',
B_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None,[], 'merge', '-r', '2:9',
+ svntest.actions.run_and_verify_svn(None,[], 'merge', '-r', '2:9',
sbox.repo_url + '/A', A_COPY_2_path)
svntest.actions.run_and_verify_svn(
- None, None, [], 'ci', '-m',
+ None, [], 'ci', '-m',
'Merge all from A/B to A_COPY_2/B\nMerge -r2:9 from A to A_COPY_2',
wc_dir)
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(14), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(14), [], 'up',
wc_dir)
# Now reverse merge -r13:7 from A to A_COPY_2.
@@ -14377,8 +13703,7 @@ def merge_range_prior_to_rename_source_existence(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
def set_up_natural_history_gap(sbox):
@@ -14408,23 +13733,26 @@ def set_up_natural_history_gap(sbox):
# r6: Delete 'A'
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, "(Committed revision 6.)|(\n)", [],
+ ["Committing transaction...\n",
+ "Committed revision 6.\n"], [],
'delete', sbox.repo_url + '/A', '-m', 'Delete A')
# r7: Resurrect 'A' by copying 'A@2' to 'A'.
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, "(Committed revision 7.)|(\n)", [],
+ ["Committing transaction...\n",
+ "Committed revision 7.\n"], [],
'copy', sbox.repo_url + '/A@2', sbox.repo_url + '/A',
'-m', 'Resurrect A from A@2')
# r8: Branch the resurrected 'A' to 'A_COPY'.
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, "(Committed revision 8.)|(\n)", [],
+ ["Committing transaction...\n",
+ "Committed revision 8.\n"], [],
'copy', sbox.repo_url + '/A', sbox.repo_url + '/A_COPY',
'-m', 'Copy A to A_COPY')
# Update to bring all the repos side changes down.
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
wc_status.add({
"A_COPY/B" : Item(status=' '),
@@ -14455,8 +13783,8 @@ def set_up_natural_history_gap(sbox):
# Update the WC to a uniform revision.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [],
+ wc_status)
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [],
'up', wc_dir)
return wc_disk, wc_status
@@ -14548,8 +13876,7 @@ def dont_merge_gaps_in_history(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3432 'Merge can record mergeinfo from natural history
@@ -14643,8 +13970,7 @@ def handle_gaps_in_implicit_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Now reverse merge -r9:2 from 'A@HEAD' to 'A_COPY'. This should be
# a no-op since the only operative change made on 'A@HEAD' between r2:9
@@ -14666,8 +13992,7 @@ def handle_gaps_in_implicit_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Now merge all available revisions from 'A' to 'A_COPY'.
# The mergeinfo '/A:4' on 'A_COPY' should have no impact on this merge
@@ -14687,8 +14012,7 @@ def handle_gaps_in_implicit_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3323 'Mergeinfo deleted by a merge should disappear'
@@ -14712,43 +14036,42 @@ def mergeinfo_deleted_by_a_merge_should_disappear(sbox):
# r7: Merge all available revisions from A/D to A_COPY/D, this creates
# mergeinfo on A_COPY/D.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None,
- None, # Don't check stdout, we test this
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, # Don't check stdout, we test this
# type of merge to death elsewhere.
[], 'merge', sbox.repo_url + '/A/D',
D_COPY_path)
svntest.actions.run_and_verify_svn(
- None, None, [], 'ci', '-m',
+ None, [], 'ci', '-m',
'Merge all available revisions from A/D to A_COPY/D', wc_dir)
# r8: Copy A_COPY to A_COPY_2, this carries the mergeinf on A_COPY/D
# to A_COPY_2/D.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None,[],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None,[],
'copy', A_COPY_path, A_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Copy A_COPY to A_COPY_2', wc_dir)
# r9: Propdel the mergeinfo on A_COPY/D.
- svntest.actions.run_and_verify_svn(None, None,[],
+ svntest.actions.run_and_verify_svn(None,[],
'pd', SVN_PROP_MERGEINFO, D_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Propdel the mergeinfo on A_COPY/D',
wc_dir)
# r10: Merge r5 from A to A_COPY_2 so the latter gets some explicit
# mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c5',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c5',
sbox.repo_url + '/A', A_COPY_2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r5 from A to A_COPY_2', wc_dir)
# Now merge r9 from A_COPY to A_COPY_2. Since the merge itself cleanly
# removes all explicit mergeinfo from A_COPY_2/D, we should not set any
# mergeinfo on that subtree describing the merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY_2_path, {
'D' : Item(status=' U'),
})
@@ -14809,8 +14132,7 @@ def mergeinfo_deleted_by_a_merge_should_disappear(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# File merge optimization caused segfault during noop file merge
@@ -14836,35 +14158,33 @@ def noop_file_merge(sbox):
# eligible ranges to be merged to A_COPY/D/H/chi into two discrete
# sets: r1-4 and r5-HEAD
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + beta_COPY_path + '\n',
' U ' + A_COPY_path + '\n',]),
[], 'merge', '-c5', sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'commit', '-m',
'Merge r5 from A to A_COPY',
wc_dir)
# Update working copy to allow full inheritance and elision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
# Merge all available revisions from A/D/H/chi to A_COPY/D/H/chi.
# There are no operative changes in the source, so this should
# not produce any output other than mergeinfo updates on
# A_COPY/D/H/chi. This is where the segfault occurred.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D/H/chi',
chi_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- [' M ' + chi_COPY_path + '\n'],
+ svntest.actions.run_and_verify_svn([' M ' + chi_COPY_path + '\n'],
[], 'st', chi_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- ['/A/D/H/chi:2-7\n'],
+ svntest.actions.run_and_verify_svn(['/A/D/H/chi:2-7\n'],
[], 'pg', SVN_PROP_MERGEINFO,
chi_COPY_path)
#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
@Issue(2690)
def copy_then_replace_via_merge(sbox):
"copy then replace via merge"
@@ -14901,17 +14221,17 @@ def copy_then_replace_via_merge(sbox):
main.file_append(AJK_zeta, 'new text')
main.file_append(AJL_zeta, 'new text')
main.run_svn(None, 'add', AJ)
- main.run_svn(None, 'ci', wc_dir, '-m', 'create tree J') # r3
+ sbox.simple_commit(message='create tree J') # r3
main.run_svn(None, 'up', wc_dir)
# Copy J to the branch via merge
main.run_svn(None, 'merge', url_A, branch)
- main.run_svn(None, 'ci', wc_dir, '-m', 'merge to branch') # r4
+ sbox.simple_commit(message='merge to branch') # r4
main.run_svn(None, 'up', wc_dir)
# In A, replace J with a slightly different tree
main.run_svn(None, 'rm', AJ)
- main.run_svn(None, 'ci', wc_dir, '-m', 'rm AJ') # r5
+ sbox.simple_commit(message='rm AJ') # r5
main.run_svn(None, 'up', wc_dir)
os.makedirs(AJL)
@@ -14921,7 +14241,7 @@ def copy_then_replace_via_merge(sbox):
main.file_append(AJL_zeta, 'really new text')
main.file_append(AJM_zeta, 'really new text')
main.run_svn(None, 'add', AJ)
- main.run_svn(None, 'ci', wc_dir, '-m', 'create tree J again') # r6
+ sbox.simple_commit(message='create tree J again') # r6
main.run_svn(None, 'up', wc_dir)
# Run merge to replace /branch/J in one swell foop.
@@ -14961,8 +14281,7 @@ def copy_then_replace_via_merge(sbox):
})
actions.run_and_verify_commit(branch_J,
expected_output,
- expected_status,
- None, branch_J)
+ expected_status)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -14985,33 +14304,32 @@ def record_only_merge(sbox):
nu_COPY_path = sbox.ospath('A_COPY/C/nu')
# r7 - Copy the branch A_COPY@2 to A2 and update the WC.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A_COPY_path, A2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'Branch the branch',
wc_dir)
# r8 - Add A/C/nu and A/B/Z.
# Add a new file with mergeinfo in the foreign repos.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', Z_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', Z_path)
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'Add subtrees',
wc_dir)
# r9 - Edit A/C/nu and add a random property on A/B/Z.
svntest.main.file_write(nu_path, "New content.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'propname', 'propval', Z_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'Subtree changes',
wc_dir)
# r10 - Merge r8 from A to A_COPY.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(
+ svntest.actions.run_and_verify_svn(expected_merge_output(
[[8]],
['A ' + Z_COPY_path + '\n',
'A ' + nu_COPY_path + '\n',
@@ -15019,7 +14337,7 @@ def record_only_merge(sbox):
[], 'merge', '-c8',
sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'Root merge of r8',
wc_dir)
@@ -15029,8 +14347,7 @@ def record_only_merge(sbox):
# r6 from A/D/H to A_COPY/D/H
# r9 from A/C/nu to A_COPY/C/nu
# r9 from A/B/Z to A_COPY/B/Z
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(
+ svntest.actions.run_and_verify_svn(expected_merge_output(
[[4]],
['U ' + rho_COPY_path + '\n',
' U ' + rho_COPY_path + '\n',]),
@@ -15038,32 +14355,29 @@ def record_only_merge(sbox):
sbox.repo_url + '/A/D/G/rho',
rho_COPY_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[6]],
['U ' + omega_COPY_path + '\n',
' U ' + H_COPY_path + '\n',]),
[], 'merge', '-c6', sbox.repo_url + '/A/D/H', H_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(
+ svntest.actions.run_and_verify_svn(expected_merge_output(
[[9]],
['U ' + nu_COPY_path + '\n',
' G ' + nu_COPY_path + '\n',]),
[], 'merge', '-c9',
sbox.repo_url + '/A/C/nu',
nu_COPY_path)
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output(
+ svntest.actions.run_and_verify_svn(expected_merge_output(
[[9]],
[' U ' + Z_COPY_path + '\n',
' G ' + Z_COPY_path + '\n']),
[], 'merge', '-c9',
sbox.repo_url + '/A/B/Z',
Z_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'Several subtree merges',
wc_dir)
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(11), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(11), [], 'up',
wc_dir)
# Now do a --record-only merge of r10 and r11 from A_COPY to A2.
@@ -15150,7 +14464,7 @@ def record_only_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 0,
+ [], True, False,
'--record-only', A2_path)
#----------------------------------------------------------------------
@@ -15171,7 +14485,7 @@ def merge_automatic_conflict_resolution(sbox):
# r7 - Make a change on A_COPY that will conflict with r3 on A
svntest.main.file_write(psi_COPY_path, "BASE.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'log msg', wc_dir)
# Set up our base expectations, we'll tweak accordingly for each option.
@@ -15228,6 +14542,8 @@ def merge_automatic_conflict_resolution(sbox):
})
expected_disk.tweak('D/H/psi', contents="<<<<<<< .working\n"
"BASE.\n"
+ "||||||| .merge-left.r2\n"
+ "This is the file 'psi'.\n"
"=======\n"
"New content>>>>>>> .merge-right.r3\n")
expected_status.tweak('D/H/psi', status='C ')
@@ -15242,14 +14558,13 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None,
- svntest.tree.detect_conflict_files,
- list(psi_conflict_support_files),
- None, None, 1, 1,
+ [], True, True,
'--accept', 'postpone',
'--allow-mixed-revisions',
- A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ A_COPY_path,
+ extra_files=
+ list(psi_conflict_support_files))
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
# Test --accept mine-conflict and mine-full
@@ -15265,12 +14580,11 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, 1, 0,
+ [], True, False,
'--accept', 'mine-conflict',
'--allow-mixed-revisions',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
svntest.actions.run_and_verify_merge(A_COPY_path, '2', '3',
sbox.repo_url + '/A', None,
@@ -15280,12 +14594,11 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, 1, 0,
+ [], True, False,
'--accept', 'mine-full',
'--allow-mixed-revisions',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
# Test --accept theirs-conflict and theirs-full
@@ -15301,12 +14614,11 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, 1, 0,
+ [], True, False,
'--accept', 'theirs-conflict',
'--allow-mixed-revisions',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
svntest.actions.run_and_verify_merge(A_COPY_path, '2', '3',
sbox.repo_url + '/A', None,
@@ -15316,12 +14628,11 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, 1, 0,
+ [], True, False,
'--accept', 'theirs-full',
'--allow-mixed-revisions',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
# Test --accept base
### TODO: Also test that the output has a 'Resolved' line for this path.
@@ -15338,8 +14649,7 @@ def merge_automatic_conflict_resolution(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, 1, 0,
+ [], True, False,
'--accept', 'base',
'--allow-mixed-revisions',
A_COPY_path)
@@ -15347,6 +14657,7 @@ def merge_automatic_conflict_resolution(sbox):
#----------------------------------------------------------------------
# Test for issue #3440 'Skipped paths get incorrect override mergeinfo
# during merge'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3440)
def skipped_files_get_correct_mergeinfo(sbox):
"skipped files get correct mergeinfo set"
@@ -15377,7 +14688,6 @@ def skipped_files_get_correct_mergeinfo(sbox):
# Merge r3 from A to A_COPY, this will create explicit mergeinfo of
# '/A:3' on A_COPY. Commit this merge as r8.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3]],
['U ' + psi_COPY_path + '\n',
' U ' + A_COPY_path + '\n',]),
@@ -15395,9 +14705,9 @@ def skipped_files_get_correct_mergeinfo(sbox):
#
# Issue #3440 occurred when empty mergeinfo was set on A_COPY/D/H, making
# it appear that r3 was never merged.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [],
'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth=empty', H_COPY_path)
expected_status = wc.State(A_COPY_path, {
'' : Item(status=' M'),
@@ -15458,8 +14768,7 @@ def skipped_files_get_correct_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
# Test for issue #3115 'Case only renames resulting from merges don't
@@ -15476,8 +14785,8 @@ def committed_case_only_move_and_revert(sbox):
A_COPY_path = sbox.ospath('A_COPY')
# r3: A case-only file rename on the server
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 3.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'],
[], 'move',
sbox.repo_url + '/A/mu',
sbox.repo_url + '/A/MU',
@@ -15545,8 +14854,7 @@ def committed_case_only_move_and_revert(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ [], True, False)
# Commit the merge
expected_output = svntest.wc.State(wc_dir, {
@@ -15558,8 +14866,7 @@ def committed_case_only_move_and_revert(sbox):
wc_status.remove('A_COPY/mu')
wc_status.add({'A_COPY/MU': Item(status=' ', wc_rev=4)})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status,
- None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, wc_status)
# In issue #3115 the WC gets corrupted and any subsequent revert
# attempts fail with this error:
@@ -15577,11 +14884,11 @@ def committed_case_only_move_and_revert(sbox):
# ..\..\..\subversion\libsvn_wc\workqueue.c:490: (apr_err=2)
# svn: Error restoring text for 'C:\SVN\src-trunk\Debug\subversion\tests
# \cmdline\svn-test-work\working_copies\merge_tests-139\A_COPY\MU'
- svntest.actions.run_and_verify_svn(None, [], [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn([], [], 'revert', '-R', wc_dir)
# r5: A case-only directory rename on the server
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 5.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 5.\n'],
[], 'move',
sbox.repo_url + '/A/C',
sbox.repo_url + '/A/c',
@@ -15614,13 +14921,13 @@ def committed_case_only_move_and_revert(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0,
+ [], True, False,
'--allow-mixed-revisions', A_COPY_path)
#----------------------------------------------------------------------
# This is a test for issue #3221 'Unable to merge into working copy of
# deleted branch'.
+@SkipUnless(server_has_mergeinfo)
@Issue(3221)
def merge_into_wc_for_deleted_branch(sbox):
"merge into WC of deleted branch should work"
@@ -15637,7 +14944,7 @@ def merge_into_wc_for_deleted_branch(sbox):
# r7 - Delete the branch on the repository, obviously it still
# exists in our WC.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete', sbox.repo_url + '/A_COPY',
'-m', 'Delete A_COPY directly in repos')
@@ -15725,8 +15032,7 @@ def merge_into_wc_for_deleted_branch(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ check_props=True)
#----------------------------------------------------------------------
def foreign_repos_del_and_props(sbox):
@@ -15739,32 +15045,32 @@ def foreign_repos_del_and_props(sbox):
(r2_path, r2_url) = sbox.add_repo_path('fgn')
svntest.main.create_repos(r2_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
r2_url, wc2_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:eol-style', 'native',
sbox.ospath('iota'))
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
sbox.ospath('A/D'),
sbox.ospath('D'))
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
sbox.ospath('A/D'),
sbox.ospath('D/G'))
new_file = sbox.ospath('new-file')
svntest.main.file_write(new_file, 'new-file')
- svntest.actions.run_and_verify_svn(None, None, [], 'add', new_file)
+ svntest.actions.run_and_verify_svn(None, [], 'add', new_file)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:eol-style', 'native', new_file)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'commit', wc_dir,
'-m', 'changed')
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url, wc2_dir,
'-r', '0:1')
@@ -15778,10 +15084,10 @@ def foreign_repos_del_and_props(sbox):
expected_status = svntest.actions.get_virginal_state(wc2_dir, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit', wc2_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'commit', wc2_dir,
'-m', 'Merged r1')
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url, wc2_dir,
'-r', '1:2', '--allow-mixed-revisions')
@@ -15809,7 +15115,7 @@ def foreign_repos_del_and_props(sbox):
" svn:eol-style\n",
"Properties on '%s':\n" % (os.path.join(wc2_dir, 'new-file')),
" svn:eol-style\n" ]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'proplist',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'proplist',
os.path.join(wc2_dir, 'iota'),
os.path.join(wc2_dir, 'new-file'))
@@ -15828,7 +15134,7 @@ def immediate_depth_merge_creates_minimal_subtree_mergeinfo(sbox):
B_COPY_path = sbox.ospath('A_COPY/B')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Merge -c5 from A/B to A_COPY/B at --depth immediates.
# This should create only the minimum subtree mergeinfo
@@ -15875,13 +15181,14 @@ def immediate_depth_merge_creates_minimal_subtree_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1, '--depth', 'immediates',
+ [], True, True,
+ '--depth', 'immediates',
B_COPY_path)
#----------------------------------------------------------------------
# Test for issue #3646 'cyclic --record-only merges create self-referential
# mergeinfo'
+@SkipUnless(server_has_mergeinfo)
@Issue(3646)
def record_only_merge_creates_self_referential_mergeinfo(sbox):
"merge creates self referential mergeinfo"
@@ -15902,15 +15209,15 @@ def record_only_merge_creates_self_referential_mergeinfo(sbox):
# Make a change to A/mu in r2.
svntest.main.file_write(mu_path, "Trunk edit\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', 'trunk edit',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m', 'trunk edit',
wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Copy A to A-branch in r3
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A_path, A_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Branch A to A-branch', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Merge A-branch back to A. This should record the mergeinfo '/A-branch:3'
# on A.
@@ -15971,7 +15278,7 @@ def record_only_merge_creates_self_referential_mergeinfo(sbox):
expected_A_disk,
expected_A_status,
expected_A_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--record-only', A_path)
#----------------------------------------------------------------------
@@ -15991,44 +15298,44 @@ def dav_skelta_mode_causes_spurious_conflicts(sbox):
A_branch_path = sbox.ospath('A-branch')
C_branch_path = sbox.ospath('A-branch/C')
- # r2 - Set some intial properties:
+ # r2 - Set some initial properties:
#
# 'dir-prop'='value1' on A/C.
# 'svn:eol-style'='native' on A/mu.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'dir-prop', 'initial-val',
C_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:eol-style', 'native',
mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'Set some properties',
wc_dir)
# r3 - Branch 'A' to 'A-branch':
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'copy', A_path, A_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'Create a branch of A',
wc_dir)
# r4 - Make a text mod to 'A/mu' and add new props to 'A/mu' and 'A/C':
svntest.main.file_write(mu_path, "The new mu!\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'prop-name', 'prop-val', mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'another-dir-prop', 'initial-val',
C_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Edit a file and make some prop changes',
wc_dir)
# r5 - Modify the sole property on 'A-branch/C':
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'dir-prop', 'branch-val',
C_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'prop mod on branch', wc_dir)
# Now merge r4 from 'A' to 'A-branch'.
@@ -16055,7 +15362,7 @@ def dav_skelta_mode_causes_spurious_conflicts(sbox):
# Summary of conflicts:
# Text conflicts: 1
# Property conflicts: 1
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_branch_path, {
'mu' : Item(status='UU'),
'C' : Item(status=' U'),
@@ -16121,7 +15428,7 @@ def dav_skelta_mode_causes_spurious_conflicts(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
@@ -16165,8 +15472,8 @@ def merge_into_locally_added_file(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- True, True, new_path)
+ [], True, True,
+ new_path)
sbox.simple_commit()
#----------------------------------------------------------------------
@@ -16226,13 +15533,14 @@ def merge_into_locally_added_directory(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- True, True, new_dir_path)
+ [], True, True,
+ new_dir_path)
sbox.simple_commit()
#----------------------------------------------------------------------
# Test for issue #2915 'Handle mergeinfo for subtrees missing due to removal
# by non-svn command'
+@SkipUnless(server_has_mergeinfo)
@Issue(2915)
def merge_with_os_deleted_subtrees(sbox):
"merge tracking fails if target missing subtrees"
@@ -16277,7 +15585,7 @@ def merge_with_os_deleted_subtrees(sbox):
"|(.*A_COPY" + re_sep + "C\n)" + \
"|(.*A_COPY" + re_sep + "D" + re_sep + "H" + re_sep + "psi\n)"
exit_code, out, err = svntest.actions.run_and_verify_svn(
- "Missing subtrees should raise error", [], svntest.verify.AnyOutput,
+ [], svntest.verify.AnyOutput,
'merge', sbox.repo_url + '/A', A_COPY_path)
svntest.verify.verify_outputs("Merge failed but not in the way expected",
err, None, err_re + missing, None,
@@ -16289,7 +15597,7 @@ def merge_with_os_deleted_subtrees(sbox):
missing = "|(.*A_COPY" + re_sep + "mu\n)" + \
"|(.*A_COPY" + re_sep + "C\n)"
exit_code, out, err = svntest.actions.run_and_verify_svn(
- "Missing subtrees should raise error", [], svntest.verify.AnyOutput,
+ [], svntest.verify.AnyOutput,
'merge', sbox.repo_url + '/A', A_COPY_path, '--depth=immediates')
svntest.verify.verify_outputs("Merge failed but not in the way expected",
err, None, err_re + missing, None, True)
@@ -16299,7 +15607,7 @@ def merge_with_os_deleted_subtrees(sbox):
# as missing.
missing = "|(.*A_COPY" + re_sep + "mu\n)"
exit_code, out, err = svntest.actions.run_and_verify_svn(
- "Missing subtrees should raise error", [], svntest.verify.AnyOutput,
+ [], svntest.verify.AnyOutput,
'merge', sbox.repo_url + '/A', A_COPY_path, '--depth=files')
svntest.verify.verify_outputs("Merge failed but not in the way expected",
err, None, err_re + missing, None, True)
@@ -16308,7 +15616,6 @@ def merge_with_os_deleted_subtrees(sbox):
# Only the...oh, wait, the target is present and that is as deep
# as the merge goes, so this merge should succeed!
svntest.actions.run_and_verify_svn(
- "Depth empty merge should succeed as long at the target is present",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A',
A_COPY_path, '--depth=empty')
@@ -16338,45 +15645,43 @@ def no_self_referential_or_nonexistent_inherited_mergeinfo(sbox):
# r7 - Add the file A/C/nu
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Add file', wc_dir)
# r8 - Sync merge A to A_COPY
svntest.actions.run_and_verify_svn(
- "Synch merge failed unexpectedly",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Sync A_COPY with A', wc_dir)
# r9 - Add the subtree A/D/J
# A/D/J/zeta
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', J_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', J_path)
svntest.main.file_write(zeta_path, "This is the file 'zeta'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', zeta_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'add', zeta_path)
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Add subtree', wc_dir)
# Update the WC in preparation for merges.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# r10 - Sync merge A to A_COPY
svntest.actions.run_and_verify_svn(
- "Synch merge failed unexpectedly",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A',
A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Sync A_COPY with A', wc_dir)
# r11 - Text changes to A/C/nu and A/D/J/zeta.
svntest.main.file_write(nu_path, "This is the EDITED file 'nu'.\n")
svntest.main.file_write(zeta_path, "This is the EDITED file 'zeta'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Edit added files', wc_dir)
# Update the WC in preparation for merges.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# This test is marked as XFail because the following two merges
# create mergeinfo with both non-existent path-revs and self-referential
@@ -16412,8 +15717,7 @@ def no_self_referential_or_nonexistent_inherited_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Merge all available revisions from A/D/J to A_COPY/D/J. Like the
# previous merge, the target should not have any non-existent ('/A/D/J:2-8')
@@ -16443,8 +15747,7 @@ def no_self_referential_or_nonexistent_inherited_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3756 'subtree merge can inherit invalid working mergeinfo',
@@ -16470,26 +15773,25 @@ def subtree_merges_inherit_invalid_working_mergeinfo(sbox):
# r7 - Add the file A/C/nu
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Add file', wc_dir)
# r8 Merge c7 from A to A_COPY.
svntest.actions.run_and_verify_svn(
- "Merge failed unexpectedly",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A',
A_COPY_path, '-c7')
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Merge subtree file addition',
wc_dir)
# r9 - A text change to A/C/nu.
svntest.main.file_write(nu_path, "This is the EDITED file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'Edit added file', wc_dir)
# Update the WC in preparation for merges.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Now do two merges. The first, r3 to the root of the branch A_COPY.
# This creates working mergeinfo '/A:3,7' on A_COPY. Then do a subtree
@@ -16503,15 +15805,12 @@ def subtree_merges_inherit_invalid_working_mergeinfo(sbox):
# Currently this test is marked as XFail because the resulting mergeinfo is
# '/A/C/nu:3,7,9' and thus includes a non-existent path-rev.
svntest.actions.run_and_verify_svn(
- "Merge failed unexpectedly",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A',
A_COPY_path, '-c3')
svntest.actions.run_and_verify_svn(
- "Merge failed unexpectedly",
svntest.verify.AnyOutput, [], 'merge', sbox.repo_url + '/A/C/nu',
nu_COPY_path, '-c9')
svntest.actions.run_and_verify_svn(
- "Subtree merge under working merge produced the wrong mergeinfo",
'/A/C/nu:9', [], 'pg', SVN_PROP_MERGEINFO, nu_COPY_path)
@@ -16519,6 +15818,7 @@ def subtree_merges_inherit_invalid_working_mergeinfo(sbox):
# Test for issue #3686 'executable flag not correctly set on merge'
# See http://subversion.tigris.org/issues/show_bug.cgi?id=3686
@Issue(3686)
+@SkipUnless(server_has_mergeinfo)
@SkipUnless(svntest.main.is_posix_os)
def merge_change_to_file_with_executable(sbox):
"executable flag is maintained during binary merge"
@@ -16534,18 +15834,18 @@ def merge_change_to_file_with_executable(sbox):
beta_path = sbox.ospath('A/B/E/beta')
# Force one of the files to be a binary type
- svntest.actions.run_and_verify_svn2(None, None,
+ svntest.actions.run_and_verify_svn2(None,
binary_mime_type_on_text_file_warning, 0,
'propset', 'svn:mime-type',
'application/octet-stream',
alpha_path)
# Set the 'svn:executable' property on both files
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:executable', 'ON',
beta_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:executable', 'ON',
alpha_path)
@@ -16565,7 +15865,7 @@ def merge_change_to_file_with_executable(sbox):
raise svntest.Failure("beta is not marked as executable before commit")
# Create the branch
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
trunk_url,
sbox.repo_url + '/branch',
'-m', "Creating the Branch")
@@ -16577,7 +15877,7 @@ def merge_change_to_file_with_executable(sbox):
# Re-root the WC at the branch
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url + '/branch', wc_dir)
# Recalculate the paths
@@ -16617,8 +15917,7 @@ def merge_change_to_file_with_executable(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None,
- None, None, True, True)
+ [], True, True)
# Verify the executable bit has been set
@@ -16662,8 +15961,7 @@ def dry_run_merge_conflicting_binary(sbox):
'A/theta' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# Make the "other" working copy
other_wc = sbox.add_wc_path('other')
@@ -16679,8 +15977,7 @@ def dry_run_merge_conflicting_binary(sbox):
'A/theta' : Item(status=' ', wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# In second working copy, append different content to the binary
# and attempt to 'svn merge -r 2:3'.
@@ -16728,8 +16025,8 @@ def dry_run_merge_conflicting_binary(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- True, True, '--allow-mixed-revisions',
+ [], True, True,
+ '--allow-mixed-revisions',
other_wc)
#----------------------------------------------------------------------
@@ -16746,19 +16043,19 @@ def foreign_repos_prop_conflict(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path("other")
other_wc_dir = sbox.add_wc_path("other")
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'co', other_repo_url,
+ svntest.actions.run_and_verify_svn(None, [], 'co', other_repo_url,
other_wc_dir)
# Add properties in the first repos and commit.
sbox.simple_propset('red', 'rojo', 'A/D/G')
sbox.simple_propset('yellow', 'amarillo', 'A/D/G')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'spenglish', wc_dir)
# Tweak properties in the first repos and commit.
sbox.simple_propset('red', 'rosso', 'A/D/G')
sbox.simple_propset('yellow', 'giallo', 'A/D/G')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'engtalian', wc_dir)
# Now, merge the propchange to the *second* working copy.
@@ -16766,8 +16063,7 @@ def foreign_repos_prop_conflict(sbox):
"A", "D", "G"))]
expected_output = expected_merge_output([[3]], expected_output, True,
prop_conflicts=1)
- svntest.actions.run_and_verify_svn(None,
- expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'merge', '-c3',
sbox.repo_url,
other_wc_dir)
@@ -16793,36 +16089,36 @@ def merge_adds_subtree_with_mergeinfo(sbox):
# r8 - Add the file A_COPY/C/nu.
svntest.main.file_write(nu_COPY_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_COPY_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Add a file on the A_COPY branch',
wc_dir)
# r9 - Cherry pick r8 from A_COPY to A.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A_COPY',
A_path, '-c8')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r8 from A_COPY to A', wc_dir)
# r10 - Make a modification to A_COPY/C/nu
svntest.main.file_append(nu_COPY_path,
"More work on the A_COPY branch.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Some work on the A_COPY branch', wc_dir)
# r9 - Cherry pick r10 from A_COPY/C/nu to A/C/nu. Make some
# changes to A/C/nu before committing the merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A_COPY/C/nu',
nu_path, '-c10')
svntest.main.file_append(nu_path, "A faux conflict resolution.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r8 from A_COPY to A', wc_dir)
# Sync merge A to A_COPY_2
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY2_path, {
'B/E/beta' : Item(status='U '),
'C/nu' : Item(status='A '),
@@ -16900,8 +16196,7 @@ def merge_adds_subtree_with_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, False)
+ check_props=True)
#----------------------------------------------------------------------
# A test for issue #3978 'reverse merge which adds subtree fails'.
@@ -16922,26 +16217,26 @@ def reverse_merge_adds_subtree(sbox):
H_COPY_path = sbox.ospath('A_COPY/D/H')
# r7 - Delete A\D\H\chi
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', chi_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'delete', chi_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Delete a file', wc_dir)
# r8 - Merge r7 from A to A_COPY
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A',
A_COPY_path, '-c7')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Cherry-pick r7 from A to A_COPY', wc_dir)
# r9 - File depth sync merge from A/D/H to A_COPY/D/H/
# This shallow merge does not create non-inheritable mergeinfo because of
# the issue #4057 fix; all subtrees affected by the diff are present, so
# non-inheritable mergeinfo is not required.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D/H',
H_COPY_path, '--depth', 'files')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Cherry-pick r7 from A to A_COPY', wc_dir)
# Reverse merge r7 from A to A_COPY
@@ -16973,7 +16268,7 @@ def reverse_merge_adds_subtree(sbox):
# ..\..\..\subversion\libsvn_subr\mergeinfo.c:504: (apr_err=200022)
# ..\..\..\subversion\libsvn_subr\kitchensink.c:57: (apr_err=200022)
# svn: E200022: Negative revision number found parsing '-7'
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY_path, {
'D/H/chi' : Item(status='A '),
})
@@ -17036,8 +16331,7 @@ def reverse_merge_adds_subtree(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, False)
+ check_props=True)
#----------------------------------------------------------------------
# A test for issue #3989 'merge which deletes file with native eol-style
@@ -17057,22 +16351,22 @@ def merged_deletion_causes_tree_conflict(sbox):
H_branch_path = sbox.ospath('branch/D/H')
# r2 - Set svn:eol-style native on A/D/H/psi
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'svn:eol-style',
+ svntest.actions.run_and_verify_svn(None, [], 'ps', 'svn:eol-style',
'native', psi_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Set eol-style native on a path',
wc_dir)
# r3 - Branch ^/A to ^/branch
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.repo_url + '/A',
sbox.repo_url + '/branch',
'-m', 'Copy ^/A to ^/branch')
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# r4 - Delete A/D/H/psi
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', psi_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'delete', psi_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Delete a a path with native eol-style',
wc_dir)
@@ -17081,7 +16375,7 @@ def merged_deletion_causes_tree_conflict(sbox):
# branch/D/H/psi is, ignoring differences caused by svn:eol-style, identical
# to ^/A/D/H/psi when the latter was deleted, so the deletion should merge
# cleanly.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(H_branch_path, {
'psi' : Item(status='D '),
})
@@ -17110,8 +16404,7 @@ def merged_deletion_causes_tree_conflict(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, False)
+ check_props=True)
#----------------------------------------------------------------------
# A test for issue #3976 'record-only merges which add new subtree mergeinfo
@@ -17132,7 +16425,7 @@ def record_only_merge_adds_new_subtree_mergeinfo(sbox):
H_COPY2_path = sbox.ospath('A_COPY_2/D/H')
# r7 - Copy ^/A_COPY to ^/A_COPY_2
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', '-m', 'copy A_COPY to A_COPY_2',
sbox.repo_url + '/A_COPY',
sbox.repo_url + '/A_COPY_2')
@@ -17144,13 +16437,13 @@ def record_only_merge_adds_new_subtree_mergeinfo(sbox):
svntest.main.run_svn(None, 'commit', '-m', 'set svn:eol-style', wc_dir)
# r9 - Merge r3 from ^/A/D/H/psi to A_COPY/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D/H/psi',
psi_COPY_path, '-c3')
svntest.main.run_svn(None, 'commit', '-m', 'Subtree merge', wc_dir)
# r10 - Merge r8 from ^/A/D/H/psi to A_COPY/D/H/psi.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D/H/psi',
psi_COPY_path, '-c8')
svntest.main.run_svn(None, 'commit', '-m', 'Subtree merge', wc_dir)
@@ -17163,7 +16456,7 @@ def record_only_merge_adds_new_subtree_mergeinfo(sbox):
# 2) The mergeinfo '/A/D/H/psi:8' from r10.
#
# 3) The mergeinfo '/A_COPY/D/H/psi:10' describing the merge itself.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(H_COPY2_path, {
'psi' : Item(status=' U'),
})
@@ -17197,64 +16490,7 @@ def record_only_merge_adds_new_subtree_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, False)
-
-#----------------------------------------------------------------------
-# Setup helper for issue #4056 and issue #4057 tests.
-def noninheritable_mergeinfo_test_set_up(sbox):
- '''Starting with standard greek tree, copy 'A' to 'branch' in r2 and
- then made a file edit to A/B/lambda in r3.
- Return (expected_output, expected_mergeinfo_output, expected_elision_output,
- expected_status, expected_disk, expected_skip) for a merge of
- r3 from ^/A/B to branch/B.'''
-
- sbox.build()
- wc_dir = sbox.wc_dir
-
- lambda_path = sbox.ospath('A/B/lambda')
- B_branch_path = sbox.ospath('branch/B')
-
- # r2 - Branch ^/A to ^/branch.
- svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
- sbox.repo_url + '/branch', '-m', 'make a branch')
-
- # r3 - Make an edit to A/B/lambda.
- svntest.main.file_write(lambda_path, "trunk edit.\n")
- svntest.main.run_svn(None, 'commit', '-m', 'file edit', wc_dir)
- svntest.main.run_svn(None, 'up', wc_dir)
-
- expected_output = wc.State(B_branch_path, {
- 'lambda' : Item(status='U '),
- })
- expected_mergeinfo_output = wc.State(B_branch_path, {
- '' : Item(status=' U'),
- 'lambda' : Item(status=' U'),
- })
- expected_elision_output = wc.State(B_branch_path, {
- 'lambda' : Item(status=' U'),
- })
- expected_status = wc.State(B_branch_path, {
- '' : Item(status=' M'),
- 'lambda' : Item(status='M '),
- 'E' : Item(status=' '),
- 'E/alpha' : Item(status=' '),
- 'E/beta' : Item(status=' '),
- 'F' : Item(status=' '),
- })
- expected_status.tweak(wc_rev='3')
- expected_disk = wc.State('', {
- '' : Item(props={SVN_PROP_MERGEINFO : '/A/B:3'}),
- 'lambda' : Item("trunk edit.\n"),
- 'E' : Item(),
- 'E/alpha' : Item("This is the file 'alpha'.\n"),
- 'E/beta' : Item("This is the file 'beta'.\n"),
- 'F' : Item(),
- })
- expected_skip = wc.State(B_branch_path, {})
-
- return expected_output, expected_mergeinfo_output, expected_elision_output, \
- expected_status, expected_disk, expected_skip
+ check_props=True)
#----------------------------------------------------------------------
@@ -17298,7 +16534,7 @@ def unnecessary_noninheritable_mergeinfo_missing_subtrees(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
B_branch_path)
#----------------------------------------------------------------------
@@ -17341,20 +16577,19 @@ def unnecessary_noninheritable_mergeinfo_shallow_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--depth', 'files', B_branch_path)
# Revert the merge and then make a prop change to A/B/E in r4.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None,
- ["property 'prop:name' set on '" +
+ svntest.actions.run_and_verify_svn(["property 'prop:name' set on '" +
E_path + "'\n"], [], 'ps',
'prop:name', 'propval', E_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'A new property on a dir',
sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', sbox.wc_dir)
# Merge r4 from ^/A/B to branch/B at operational depth=immediates
@@ -17406,7 +16641,7 @@ def unnecessary_noninheritable_mergeinfo_shallow_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, 1, 1,
+ [], True, True,
'--depth', 'immediates', B_branch_path)
#----------------------------------------------------------------------
@@ -17436,14 +16671,14 @@ def svnmucc_abuse_1(sbox):
sbox.simple_commit()
## r5: fail to revert it
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-m', 'r5',
'-U', sbox.repo_url,
'rm', 'A',
'cp', 'HEAD', 'A', 'A')
## r6: really revert it
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-m', 'r6',
'-U', sbox.repo_url,
'rm', 'A',
@@ -17496,12 +16731,11 @@ def merge_source_with_replacement(sbox):
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'del', A_path)
svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A@5', A_path)
- svntest.main.run_svn(None, 'ci', '-m',
- 'Replace A with older version of itself', wc_dir)
+ sbox.simple_commit(message='Replace A with older version of itself')
# r8: Make an edit to A/D/H/omega:
svntest.main.file_write(omega_path, "New content for 'omega'.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'file edit', wc_dir)
+ sbox.simple_commit(message='file edit')
# Update and sync merge ^/A to A_COPY.
#
@@ -17540,14 +16774,13 @@ def merge_source_with_replacement(sbox):
'U ' + psi_COPY_path + '\n',
' U ' + A_COPY_path + '\n',
' G ' + A_COPY_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', sbox.repo_url + '/A',
A_COPY_path)
# Misleading notifications are one thing, incorrect mergeinfo is quite
# another.
- svntest.actions.run_and_verify_svn(None,
- [A_COPY_path + ' - /A:2-5,7-8\n'],
+ svntest.actions.run_and_verify_svn([A_COPY_path + ' - /A:2-5,7-8\n'],
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_path)
@@ -17564,7 +16797,7 @@ def merge_source_with_replacement(sbox):
' U ' + A_COPY_path + '\n',
' G ' + A_COPY_path + '\n',],
elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', sbox.repo_url + '/A',
A_COPY_path, '-r8:1')
@@ -17594,26 +16827,25 @@ def reverse_merge_with_rename(sbox):
wc_disk, wc_status = set_up_branch(sbox)
# r7 - Rename ^/A to ^/trunk.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 7.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 7.\n'],
[], 'move',
sbox.repo_url + '/A',
sbox.repo_url + '/trunk',
'-m', "Rename 'A' to 'trunk'")
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# r8 - Make and edit to trunk/D/H/omega (which was also edited in r6).
svntest.main.file_write(omega_path, "Edit 'omega' on trunk.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'Another omega edit', wc_dir)
+ sbox.simple_commit(message='Another omega edit')
# r9 - Sync merge ^/trunk to A_COPY.
- svntest.actions.run_and_verify_svn(None,
- None, # Don't check stdout, we test this
+ svntest.actions.run_and_verify_svn(None, # Don't check stdout, we test this
# type of merge to death elsewhere.
[], 'merge', sbox.repo_url + '/trunk',
A_COPY_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Sync A_COPY with ^/trunk', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ sbox.simple_commit(message='Sync A_COPY with ^/trunk')
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Reverse merge -r9:1 from ^/trunk to A_COPY. This should return
# A_COPY to the same state it had prior to the sync merge in r2.
@@ -17649,7 +16881,7 @@ def reverse_merge_with_rename(sbox):
'U ' + psi_COPY_path + '\n',
' U ' + A_COPY_path + '\n',
' G ' + A_COPY_path + '\n',], elides=True)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', sbox.repo_url + '/trunk',
A_COPY_path, '-r9:1')
@@ -17673,18 +16905,18 @@ def merge_adds_then_deletes_subtree(sbox):
nu_branch_path = sbox.ospath('branch/C/nu')
# Make a branch.
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.repo_url + '/A',
sbox.repo_url + '/branch',
'-m', 'Make a branch.')
# On the branch parent: Add a file in r3 and then delete it in r4.
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Add a file')
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'delete', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Delete a file')
# Merge r3 and r4 from ^/A/C to branch/C as part of one merge
@@ -17715,9 +16947,8 @@ def merge_adds_then_deletes_subtree(sbox):
# svn: E155010: The node 'C:\SVN\src-trunk\Debug\subversion\tests
# \cmdline\svn-test-work\working_copies\merge_tests-128\branch\C\nu'
# was not found.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3],[4]],
['A ' + nu_branch_path + '\n',
'D ' + nu_branch_path + '\n',
@@ -17752,35 +16983,35 @@ def merge_with_added_subtrees_with_mergeinfo(sbox):
wc_disk, wc_status = set_up_branch(sbox, nbr_of_branches=2)
# r8 - Add a subtree under A.
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', '--parents',
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', '--parents',
Z_path)
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Add a subtree on our "trunk"')
# r9 - Sync ^/A to the first branch A_COPY.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Sync ^/A to ^/A_COPY')
# r10 - Make some edits on the first branch.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'branch-prop-foo',
+ svntest.actions.run_and_verify_svn(None, [], 'ps', 'branch-prop-foo',
'bar', Y_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', W_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', W_COPY_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Make some edits on "branch 1"')
# r11 - Cherry-pick r10 on the first branch back to A, but
# do so at depth=empty so non-inheritable mergeinfo is created.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c10', '--depth=empty',
sbox.repo_url + '/A_COPY/C/X/Y', Y_path)
svntest.actions.run_and_verify_svn(
- None, None, [], 'ci', wc_dir,
+ None, [], 'ci', wc_dir,
'-m', 'Depth empty subtree cherry pick from "branch 1" to "trunk"')
# Sync ^/A to the second branch A_COPY_2.
@@ -17821,7 +17052,7 @@ def merge_with_added_subtrees_with_mergeinfo(sbox):
# svn:mergeinfo
# /A/C/X/Y/Z:8-11
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_output = wc.State(A_COPY2_path, {
'B/E/beta' : Item(status='U '),
'D/G/rho' : Item(status='U '),
@@ -17899,8 +17130,7 @@ def merge_with_added_subtrees_with_mergeinfo(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ check_props=True)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -17923,34 +17153,33 @@ def merge_with_externals_with_mergeinfo(sbox):
wc_disk, wc_status = set_up_branch(sbox)
svntest.main.file_write(mu_COPY_path, "branch edit")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'file edit on the branch', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Create a file external under 'A' and set some bogus mergeinfo
# on it (the fact that this mergeinfo is bogus has no bearing on
# this test).
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:externals',
'^/iota file-external', A_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'set file external', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'ps', SVN_PROP_MERGEINFO,
"/bogus-mergeinfo:5", file_external_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'set mergeinfo on file external',
file_external_path)
# Sync merge ^/A to A_COPY and then reintegrate A_COPY back to A.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'sync merge', wc_dir)
# This was segfaulting, see
# http://svn.haxx.se/dev/archive-2012-10/0364.shtml
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output(None,
['U ' + mu_path + '\n',
' U ' + A_path + '\n'],
@@ -18020,7 +17249,6 @@ def merge_binary_file_with_keywords(sbox):
# merge back
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3,4]],
['C ' + sbox.ospath(file_mod_both) + '\n',
'U ' + sbox.ospath(file_mod_src) + '\n',
@@ -18063,7 +17291,6 @@ def merge_conflict_when_keywords_removed(sbox):
# sync merge
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3,4]],
['U '+ sbox.ospath('A2/keyfile') + '\n',
' U A2\n']),
@@ -18078,7 +17305,6 @@ def merge_conflict_when_keywords_removed(sbox):
# sync merge again
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5,6]],
['UU ' + sbox.ospath('A2/keyfile') + '\n',
' U A2\n']),
@@ -18119,7 +17345,7 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'.\':\n',
' U .\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir', '-c', '4')
svntest.main.run_svn(None, 'revert', '-R', '.')
@@ -18131,7 +17357,7 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
' U binary-file\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir/binary-file', '-c', '4')
svntest.main.run_svn(None, 'revert', '-R', '.')
@@ -18143,7 +17369,7 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'.\':\n',
' U .\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir', '-c', '4', '.')
svntest.main.run_svn(None, 'revert', '-R', '.')
@@ -18155,7 +17381,7 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
' U binary-file\n',
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir/binary-file', '-c', '4', 'binary-file')
svntest.main.run_svn(None, 'revert', '-R', '.')
@@ -18167,7 +17393,7 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'.\':\n',
' U .\n',
] + svntest.main.summary_of_conflicts(tree_conflicts=1)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir/binary-file', '-c', '4', '.')
svntest.main.run_svn(None, 'revert', '-R', '.')
@@ -18179,10 +17405,11 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
' U binary-file\n',
] + svntest.main.summary_of_conflicts(tree_conflicts=1)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '^/dir', '-c', '4', 'binary-file')
-@Issue(3405)
+@SkipUnless(server_has_mergeinfo)
+@Issue(3405) # seems to be the wrong issue number
def merge_properties_on_adds(sbox):
"merged directory properties are added"
@@ -18200,7 +17427,7 @@ def merge_properties_on_adds(sbox):
sbox.simple_commit()
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '^/A/D/G', sbox.ospath('G'))
expected_output = svntest.verify.UnorderedOutput([
@@ -18215,7 +17442,7 @@ def merge_properties_on_adds(sbox):
'Properties on \'%s\':\n' % sbox.ospath('G/M/file'),
' key\n',
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'proplist', '-R', sbox.ospath('G'))
expected_output = svntest.verify.UnorderedOutput([
@@ -18232,7 +17459,7 @@ def merge_properties_on_adds(sbox):
# I merged the tree, which should include history but only the files have
# the properties stored in PRISTINE. All directories have the properties
# as local changes in ACTUAL.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'proplist', '-R', sbox.ospath('G'),
'-r', 'BASE')
@@ -18404,7 +17631,7 @@ def check_mergeinfo(expected_mergeinfo, tgt_ospath):
EXPECTED_MERGEINFO (list of lines).
"""
svntest.actions.run_and_verify_svn(
- None, expected_mergeinfo, [], 'pg', SVN_PROP_MERGEINFO, tgt_ospath)
+ expected_mergeinfo, [], 'pg', SVN_PROP_MERGEINFO, tgt_ospath)
def simple_merge(src_path, tgt_ospath, rev_args):
"""Merge from ^/SRC_PATH to TGT_OSPATH using revision arguments REV_ARGS
@@ -18419,7 +17646,7 @@ def simple_merge(src_path, tgt_ospath, rev_args):
target=tgt_ospath)
src_url = '^/' + src_path
svntest.actions.run_and_verify_svn(
- None, expected_out, [],
+ expected_out, [],
'merge', src_url, tgt_ospath, '--accept', 'postpone', *rev_args)
@SkipUnless(server_has_mergeinfo)
@@ -18463,14 +17690,14 @@ def conflict_aborted_mergeinfo_described_partial_merge(sbox):
sbox.simple_commit()
# r14: merge some changes to the branch so that later merges will be split
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c5,9',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c5,9',
'^/' + trunk, sbox.ospath(branch),
'--accept', 'theirs-conflict')
sbox.simple_commit()
sbox.simple_update()
def revert_branch():
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R',
sbox.ospath(branch))
def try_merge(relpath, conflict_rev, rev_args,
@@ -18501,7 +17728,7 @@ def conflict_aborted_mergeinfo_described_partial_merge(sbox):
src_url = '^/' + src_path
svntest.actions.run_and_verify_svn(
- None, expected_out, expected_err,
+ expected_out, expected_err,
'merge', src_url, tgt_ospath, '--accept', 'postpone',
*rev_args)
@@ -18645,9 +17872,9 @@ def multiple_editor_drive_merge_notifications(sbox):
sbox.simple_commit()
# Cherry pick merge r5 and r6 to each branch and commit.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '^/iota',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '^/iota',
'-c', '5,7', iota_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '^/A/C',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '^/A/C',
'-c', '5,7', C_branch_path)
sbox.simple_commit()
@@ -18658,7 +17885,6 @@ def multiple_editor_drive_merge_notifications(sbox):
# re checking the merge notification headers -- which need to be improved
# at some point.
svntest.actions.run_and_verify_svn(
- None,
["--- Merging r2 through r4 into '" + C_branch_path + "':\n",
" U " + C_branch_path + "\n",
"--- Merging r6 into '" + C_branch_path + "':\n",
@@ -18693,7 +17919,6 @@ def multiple_editor_drive_merge_notifications(sbox):
# --- Recording mergeinfo for merge of r2 through r9 into 'iota-copy':
# U iota-copy
svntest.actions.run_and_verify_svn(
- None,
["--- Merging r2 through r4 into '" + iota_branch_path + "':\n",
" U " + iota_branch_path + "\n",
"--- Merging r6 into '" + iota_branch_path + "':\n",
@@ -18726,7 +17951,7 @@ def single_editor_drive_merge_notifications(sbox):
set_up_branch(sbox)
# r7 - Subtree merge
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '^/A/D',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '^/A/D',
'-c4', D_copy_path)
sbox.simple_commit()
sbox.simple_update()
@@ -18766,13 +17991,13 @@ def single_editor_drive_merge_notifications(sbox):
" U " + D_copy_path + "\n",
"--- Eliding mergeinfo from '" + D_copy_path + "':\n",
" U " + D_copy_path + "\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
sbox.repo_url + '/A', A_copy_path)
# r8 and r9 - Commit and do reverse subtree merge.
sbox.simple_commit()
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '^/A/D',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '^/A/D',
'-c-4', D_copy_path)
sbox.simple_commit()
@@ -18793,7 +18018,7 @@ def single_editor_drive_merge_notifications(sbox):
" U " + D_copy_path + "\n",
"--- Eliding mergeinfo from '" + D_copy_path + "':\n",
" U " + D_copy_path + "\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'merge',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'merge',
'-r9:2', sbox.repo_url + '/A',
A_copy_path)
@@ -18841,14 +18066,14 @@ def conflicted_split_merge_with_resolve(sbox):
sbox.simple_commit()
# r14: merge some changes to the branch so that later merges will be split
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c5,9',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '-c5,9',
'^/' + trunk, sbox.ospath(branch),
'--accept', 'theirs-conflict')
sbox.simple_commit()
sbox.simple_update()
def revert_branch():
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R',
sbox.ospath(branch))
def try_merge(relpath, conflict_rev, rev_args,
@@ -18879,7 +18104,7 @@ def conflicted_split_merge_with_resolve(sbox):
src_url = '^/' + src_path + '@11'
svntest.actions.run_and_verify_svn(
- None, expected_out, expected_err,
+ expected_out, expected_err,
'merge', src_url, tgt_ospath, '--accept', 'mine-full',
*rev_args)
@@ -19021,7 +18246,7 @@ def merge_to_empty_target_merge_to_infinite_target(sbox):
C1_path = sbox.ospath('A/C/C1')
test3_path = sbox.ospath('A/C/C1/test.txt')
-
+
# r3 - Add some subtrees:
# A /A/B/B1
# A /A/B/B1/B1a
@@ -19048,16 +18273,16 @@ def merge_to_empty_target_merge_to_infinite_target(sbox):
sbox.simple_commit()
# r6 - Set depth of A_COPY to empty, merge all available revs from ^/A.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth=empty', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth=infinity', C_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '^/A',
+ svntest.actions.run_and_verify_svn(None, [], 'merge', '^/A',
A_COPY_path)
sbox.simple_commit()
# Update A_COPY back to depth infinity and retry the prior merge.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--set-depth=infinity', A_COPY_path)
expected_output = wc.State(A_COPY_path, {
@@ -19137,36 +18362,11 @@ def merge_to_empty_target_merge_to_infinite_target(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None,
- None, 1, 0)
+ [], True, False)
# Commit the merge.
#sbox.simple_commit()
-def merge_dir_delete_force(sbox):
- "merge a directory delete with --force"
-
- sbox.build()
-
- sbox.simple_rm('A/D/G')
- sbox.simple_commit() # r2
-
- sbox.simple_update(revision=1)
-
- # Just merging r2 on r1 succeeds
- svntest.actions.run_and_verify_svn(sbox.wc_dir, None, [],
- 'merge', '-c2', '^/', sbox.wc_dir,
- '--ignore-ancestry')
-
- # Bring working copy to r1 again
- svntest.actions.run_and_verify_svn(sbox.wc_dir, None, [],
- 'revert', '-R', sbox.wc_dir)
-
- # But when using --force this same merge caused a segfault in 1.8.0-1.8.8
- svntest.actions.run_and_verify_svn(sbox.wc_dir, None, [],
- 'merge', '-c2', '^/', sbox.wc_dir,
- '--ignore-ancestry', '--force')
-
def conflict_naming(sbox):
"verify conflict file naming"
@@ -19196,6 +18396,8 @@ def conflict_naming(sbox):
'file.txt.r2' : Item(contents="This is the initial content\n"),
'file.txt' : Item(contents="<<<<<<< .mine\n" \
"This is conflicting content\n" \
+ "||||||| .r3\n" \
+ "This is the new content\n" \
"=======\n" \
"This is the initial content\n" \
">>>>>>> .r2\n"),
@@ -19204,8 +18406,7 @@ def conflict_naming(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output, expected_disk,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
wc_dir, '-r', '2')
sbox.simple_revert('file.txt')
@@ -19227,6 +18428,8 @@ def conflict_naming(sbox):
'file.txt.r2.txt' : Item(contents="This is the initial content\n"),
'file.txt' : Item(contents="<<<<<<< .mine.txt\n" \
"This is conflicting content\n" \
+ "||||||| .r3.txt\n" \
+ "This is the new content\n" \
"=======\n" \
"This is the initial content\n" \
">>>>>>> .r2.txt\n"),
@@ -19235,7 +18438,7 @@ def conflict_naming(sbox):
svntest.actions.run_and_verify_update(
wc_dir,
expected_output, expected_disk, expected_status,
- None, None, None, None, None, None,
+ [], False,
wc_dir, '-r', '2',
'--config-option',
'config:miscellany:preserved-conflict-file-exts=' +
@@ -19256,13 +18459,15 @@ def conflict_naming(sbox):
'file.txt.merge-right.r2': Item(contents="This is the initial content\n"),
'file.txt' : Item(contents="<<<<<<< .working\n" \
"This is conflicting content\n" \
+ "||||||| .merge-left.r3\n" \
+ "This is the new content\n" \
"=======\n" \
"This is the initial content\n" \
">>>>>>> .merge-right.r2\n"),
'file.txt.working' : Item(contents="This is conflicting content\n"),
})
- svntest.actions.run_and_verify_svn(wc_dir, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c-3', '^/', sbox.ospath(''))
svntest.actions.run_and_verify_status(wc_dir, expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk)
@@ -19281,6 +18486,8 @@ def conflict_naming(sbox):
'file.txt.merge-right.r2.txt': Item(contents="This is the initial content\n"),
'file.txt' : Item(contents="<<<<<<< .working.txt\n" \
"This is conflicting content\n" \
+ "||||||| .merge-left.r3.txt\n" \
+ "This is the new content\n" \
"=======\n" \
"This is the initial content\n" \
">>>>>>> .merge-right.r2.txt\n"),
@@ -19288,7 +18495,7 @@ def conflict_naming(sbox):
})
svntest.actions.run_and_verify_svn(
- wc_dir, None, [],
+ None, [],
'merge', '-c-3', '^/', sbox.ospath(''),
'--config-option',
'config:miscellany:preserved-conflict-file-exts=' +
@@ -19296,6 +18503,30 @@ def conflict_naming(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk)
+def merge_dir_delete_force(sbox):
+ "merge a directory delete with --force"
+
+ sbox.build()
+
+ sbox.simple_rm('A/D/G')
+ sbox.simple_commit() # r2
+
+ sbox.simple_update(revision=1)
+
+ # Just merging r2 on r1 succeeds
+ svntest.actions.run_and_verify_svn(None, [],
+ 'merge', '-c2', '^/', sbox.wc_dir,
+ '--ignore-ancestry')
+
+ # Bring working copy to r1 again
+ svntest.actions.run_and_verify_svn(None, [],
+ 'revert', '-R', sbox.wc_dir)
+
+ # But when using --force this same merge caused a segfault in 1.8.0-1.8.8
+ svntest.actions.run_and_verify_svn(None, [],
+ 'merge', '-c2', '^/', sbox.wc_dir,
+ '--ignore-ancestry', '--force')
+
########################################################################
# Run the tests
@@ -19441,8 +18672,8 @@ test_list = [ None,
single_editor_drive_merge_notifications,
conflicted_split_merge_with_resolve,
merge_to_empty_target_merge_to_infinite_target,
- merge_dir_delete_force,
conflict_naming,
+ merge_dir_delete_force,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/merge_tree_conflict_tests.py b/subversion/tests/cmdline/merge_tree_conflict_tests.py
index 15287d3..28c1f33 100755
--- a/subversion/tests/cmdline/merge_tree_conflict_tests.py
+++ b/subversion/tests/cmdline/merge_tree_conflict_tests.py
@@ -43,10 +43,10 @@ Wimp = svntest.testcase.Wimp_deco
from svntest.main import SVN_PROP_MERGEINFO
from svntest.main import server_has_mergeinfo
-from merge_tests import set_up_branch
-from merge_tests import svn_copy
-from merge_tests import svn_merge
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import svn_copy
+from svntest.mergetrees import svn_merge
+from svntest.mergetrees import expected_merge_output
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -61,7 +61,7 @@ def delete_file_and_dir(sbox):
B2_path = os.path.join(wc_dir, 'A', 'B2')
B_url = sbox.repo_url + '/A/B'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', B_path, B2_path)
expected_output = wc.State(wc_dir, {
@@ -78,14 +78,12 @@ def delete_file_and_dir(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Rev 3 delete E and lambda from B
E_path = os.path.join(B_path, 'E')
lambda_path = os.path.join(B_path, 'lambda')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'delete', E_path, lambda_path)
expected_output = wc.State(wc_dir, {
@@ -98,15 +96,13 @@ def delete_file_and_dir(sbox):
'A/B/lambda')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
def modify_B2():
# Local mods in B2
B2_E_path = os.path.join(B2_path, 'E')
B2_lambda_path = os.path.join(B2_path, 'lambda')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo_val',
B2_E_path, B2_lambda_path)
expected_status.tweak(
@@ -157,8 +153,7 @@ def delete_file_and_dir(sbox):
expected_disk,
expected_status2,
expected_skip,
- None, None, None, None, None,
- True)
+ check_props=True)
#----------------------------------------------------------------------
# This is a regression for issue #1176.
@@ -180,10 +175,10 @@ def merge_catches_nonexistent_target(sbox):
Q_url = sbox.repo_url + '/A/D/Q'
# Copy dir A/D/G to A/D/Q
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', G_path, Q_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', G_path, Q_path)
svntest.main.file_append(newfile_path, 'This is newfile.\n')
- svntest.actions.run_and_verify_svn(None, None, [], 'add', newfile_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', newfile_path)
# Add newfile to dir G, creating r2.
expected_output = wc.State(wc_dir, {
@@ -203,8 +198,7 @@ def merge_catches_nonexistent_target(sbox):
### (M)odified child.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Change newfile, creating r3.
svntest.main.file_append(newfile_path, 'A change to newfile.\n')
@@ -214,8 +208,7 @@ def merge_catches_nonexistent_target(sbox):
expected_status.tweak('A/D/Q/newfile', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Merge the change to newfile (from r3) into G, where newfile
# doesn't exist. This is a tree conflict (use case 4, see
@@ -258,7 +251,7 @@ def merge_catches_nonexistent_target(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None, True)
+ check_props=True)
expected_status.add({
'newfile' : Item(status='! ', treeconflict='C'),
@@ -284,21 +277,21 @@ def merge_tree_deleted_in_target(sbox):
# Copy B to I, creating r1.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', B_url, I_url, '-m', 'rev 2')
# Change some files, creating r2.
svntest.main.file_append(alpha_path, 'A change to alpha.\n')
svntest.main.file_append(os.path.join(B_path, 'lambda'), 'change lambda.\n')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'rev 3', B_path)
# Remove E, creating r3.
E_url = sbox.repo_url + '/A/I/E'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', E_url, '-m', 'rev 4')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', os.path.join(wc_dir,'A'))
expected_output = wc.State(I_path, {
@@ -333,8 +326,7 @@ def merge_tree_deleted_in_target(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 0)
+ check_props=True)
expected_status.add({
'E' : Item(status='! ', treeconflict='C'),
})
@@ -354,7 +346,7 @@ def three_way_merge_add_of_existing_binary_file(sbox):
# Create a branch of A, creating revision 2.
A_url = sbox.repo_url + "/A"
branch_A_url = sbox.repo_url + "/copy-of-A"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"cp",
A_url, branch_A_url,
"-m", "Creating copy-of-A")
@@ -377,8 +369,7 @@ def three_way_merge_add_of_existing_binary_file(sbox):
"A/theta" : Item(status=" ", wc_rev=3),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# In the working copy, attempt to 'svn merge branch_A_url@2 A_url@3 A'.
# We should *not* see a conflict during the merge, but an 'A'.
@@ -423,8 +414,8 @@ def three_way_merge_add_of_existing_binary_file(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 0, '--allow-mixed-revisions', A_path)
+ [], True, False,
+ '--allow-mixed-revisions', A_path)
#----------------------------------------------------------------------
# Issue #2515
@@ -447,16 +438,16 @@ def merge_added_dir_to_deleted_in_target(sbox):
I_path = os.path.join(wc_dir, 'A', 'I')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', B_url, I_url, '-m', 'rev 2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', F_url, '-m', 'rev 3')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'rev 4', J_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', os.path.join(wc_dir,'A'))
expected_output = wc.State(I_path, {
@@ -482,9 +473,7 @@ def merge_added_dir_to_deleted_in_target(sbox):
expected_elision_output,
expected_disk,
None,
- expected_skip,
- None, None, None, None, None,
- 0, 0)
+ expected_skip)
#----------------------------------------------------------------------
# Issue 2584
@@ -514,8 +503,7 @@ def merge_add_over_versioned_file_conflicts(sbox):
'A/C/alpha' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
# Merge r1:2 from A/C to A/B/E. This will attempt to add A/C/alpha,
# but since A/B/E/alpha already exists we get a tree conflict.
@@ -573,17 +561,17 @@ def mergeinfo_recording_in_skipped_merge(sbox):
expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
wc_status.add({'A/mu' : Item(status=' ', wc_rev=3)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Make a modification to A/B/E/alpha
svntest.main.file_write(alpha_path, "This is the file 'alpha' modified.\n")
expected_output = wc.State(wc_dir, {'A/B/E/alpha' : Item(verb='Sending')})
wc_status.add({'A/B/E/alpha' : Item(status=' ', wc_rev=4)})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- wc_status, None, wc_dir)
+ wc_status)
# Delete A_COPY/B/E
- svntest.actions.run_and_verify_svn(None, None, [], 'rm',
+ svntest.actions.run_and_verify_svn(None, [], 'rm',
A_COPY_B_E_path)
# Merge /A to /A_COPY ie., r1 to r4
@@ -644,8 +632,7 @@ def mergeinfo_recording_in_skipped_merge(sbox):
expected_disk,
expected_status,
expected_skip,
- None, None, None, None, None,
- 1, 1)
+ [], True, True)
#----------------------------------------------------------------------
def del_differing_file(sbox):
@@ -673,7 +660,7 @@ def del_differing_file(sbox):
target = 'A/D/G2'
svn_copy(s_rev_orig, source, target)
svntest.main.file_append(target+"/tau", "An extra line in the target.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'newprop', 'v', target+"/pi")
dir_D = os.path.join('A','D')
@@ -693,7 +680,7 @@ def del_differing_file(sbox):
target = 'A/D/G3'
svn_copy(s_rev_orig, source, target)
svntest.main.file_append(target+"/tau", "An extra line in the target.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'newprop', 'v', target+"/pi")
sbox.simple_commit(target)
@@ -728,18 +715,18 @@ def tree_conflicts_and_obstructions(sbox):
br_alpha_moved = os.path.join(branch_path, 'alpha-moved')
# Create a branch
- svntest.actions.run_and_verify_svn(None, None, [], 'cp',
+ svntest.actions.run_and_verify_svn(None, [], 'cp',
trunk_url,
sbox.repo_url + '/branch',
'-m', "Creating the Branch")
- svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ svntest.actions.run_and_verify_svn(None, [], 'mv',
trunk_url + '/alpha',
trunk_url + '/alpha-moved',
'-m', "Move alpha to alpha-moved")
# Update to revision 2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
svntest.main.file_write(br_alpha_moved, "I am blocking myself from trunk\n")
@@ -1456,12 +1443,12 @@ def merge_replace_setup(sbox):
# make a branch of A
# svn cp $URL/A $URL/branch
- expected_stdout = verify.UnorderedOutput([
- '\n',
+ expected_stdout = [
+ 'Committing transaction...\n',
'Committed revision 2.\n',
- ])
+ ]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'cp', url_A,
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'cp', url_A,
url_branch, '-m', 'copy log')
# svn up
@@ -1534,7 +1521,7 @@ def merge_replace_setup(sbox):
})
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# ACTIONS ON THE MERGE SOURCE (branch)
# various deletes of files and dirs
@@ -1551,7 +1538,7 @@ def merge_replace_setup(sbox):
'D ' + branch_D_H + '\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'delete',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'delete',
branch_mu, branch_B_E, branch_D_G_pi, branch_D_H)
# svn ci
@@ -1566,8 +1553,7 @@ def merge_replace_setup(sbox):
'branch/D/H/chi', 'branch/D/H/psi', 'branch/D/G/pi', 'branch/B/E',
'branch/B/E/beta', 'branch/B/E/alpha')
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# svn up
expected_output = svntest.wc.State(wc_dir, {})
@@ -1579,7 +1565,7 @@ def merge_replace_setup(sbox):
expected_status.tweak(wc_rev='3')
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# replacements.
# file-with-file
@@ -1589,33 +1575,33 @@ def merge_replace_setup(sbox):
# svn add branch/mu
expected_stdout = ['A ' + branch_mu + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'add',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'add',
branch_mu)
# dir-with-dir
# svn mkdir branch/B/E
expected_stdout = ['A ' + branch_B_E + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir',
branch_B_E)
# svn ps propname propval branch/B/E
expected_stdout = ["property 'propname' set on '" + branch_B_E + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'propname', 'propval', branch_B_E)
# file-with-dir
# svn mkdir branch/D/G/pi
expected_stdout = ['A ' + branch_D_G_pi + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir',
branch_D_G_pi)
# svn ps propname propval branch/D/G/pi
expected_stdout = ["property 'propname' set on '" + branch_D_G_pi + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'propname', 'propval', branch_D_G_pi)
# dir-with-file
@@ -1625,7 +1611,7 @@ def merge_replace_setup(sbox):
# svn add branch/D/H
expected_stdout = ['A ' + branch_D_H + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'add',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'add',
branch_D_H)
# svn ci
@@ -1643,8 +1629,7 @@ def merge_replace_setup(sbox):
'branch/mu' : Item(status=' ', wc_rev='4'),
})
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
return expected_disk, expected_status
@@ -1686,7 +1671,7 @@ def merge_replace_causes_tree_conflict(sbox):
# svn ps propname otherpropval A/B/E
expected_stdout = ["property 'propname' set on '" + A_B_E + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'propname', 'otherpropval', A_B_E)
# echo modified > A/D/G/pi
@@ -1695,7 +1680,7 @@ def merge_replace_causes_tree_conflict(sbox):
# svn ps propname propval A/D/H
expected_stdout = ["property 'propname' set on '" + A_D_H + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'ps',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'ps',
'propname', 'propval', A_D_H)
# svn merge $URL/A $URL/branch A
@@ -1709,7 +1694,7 @@ def merge_replace_causes_tree_conflict(sbox):
' U ' + A + '\n',
], target=A, two_url=True, tree_conflicts=4)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
url_A, url_branch, A)
# svn st
@@ -1775,7 +1760,7 @@ def merge_replace_causes_tree_conflict2(sbox):
'D ' + os.path.join(A_D_H, 'psi') + '\n',
'D ' + A_D_H + '\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'delete',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'delete',
A_mu, A_B_E, A_D_G_pi, A_D_H)
expected_status.tweak('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/D/G/pi',
'A/D/H', 'A/D/H/chi', 'A/D/H/omega', 'A/D/H/psi',
@@ -1795,7 +1780,7 @@ def merge_replace_causes_tree_conflict2(sbox):
" U " + A_mu + "\n", # mergeinfo -> 'RM' status
], target=A, two_url=True, tree_conflicts=1)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
url_A, url_branch, A, '--depth=files')
# New mergeinfo describing the merge.
expected_status.tweak('A', status=' M')
@@ -1815,7 +1800,7 @@ def merge_replace_causes_tree_conflict2(sbox):
" U " + A_B + "\n", # mergeinfo
], target=A_B, two_url=True, tree_conflicts=1)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
url_A_B, url_branch_B, A_B)
# New mergeinfo describing the merge.
expected_status.tweak('A/B', status=' M')
@@ -1835,7 +1820,7 @@ def merge_replace_causes_tree_conflict2(sbox):
" U " + A_D + "\n", # mergeinfo
], target=A_D, two_url=True, tree_conflicts=1)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
'--depth=immediates', url_A_D, url_branch_D, A_D)
# New mergeinfo describing the merge.
expected_status.tweak('A/D', 'A/D/G', status=' M')
@@ -1855,7 +1840,7 @@ def merge_replace_causes_tree_conflict2(sbox):
" U " + A_D_G + "\n", # mergeinfo
], target=A_D_G, two_url=True, tree_conflicts=1)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
url_A_D_G, url_branch_D_G, A_D_G)
# New mergeinfo describing the merge.
expected_status.tweak('A/D/G', status=' M')
@@ -1876,7 +1861,7 @@ def merge_replace_causes_tree_conflict2(sbox):
'|( \>.*)'
tree_conflicted_path = [A_B_E, A_mu, A_D_G_pi, A_D_H]
for path in tree_conflicted_path:
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'st',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'st',
'--depth=empty', path)
#----------------------------------------------------------------------
@@ -1894,25 +1879,25 @@ def merge_replace_on_del_fails(sbox):
C_branch_path = os.path.join(wc_dir, 'branch', 'C')
# r2 - Copy ^/A to ^/branch
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.repo_url + '/A',
sbox.repo_url + '/branch',
'-m', 'Create a branch')
# r3 - Replace A/C
- svntest.actions.run_and_verify_svn(None, None, [], 'del', C_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', C_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'del', C_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', C_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Replace A/C', wc_dir)
# r4 - Delete branch/C
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'del', C_branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'del', C_branch_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Delete branch/C', wc_dir)
# Sync merge ^/A to branch
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
expected_stdout = expected_merge_output([[2,4]], [
' C ' + C_branch_path + '\n', # merge
' U ' + branch_path + '\n', # mergeinfo
@@ -1946,38 +1931,190 @@ def merge_replace_on_del_fails(sbox):
# svn: E155010: The node 'C:\SVN\src-trunk\Debug\subversion\tests\
# cmdline\svn-test-work\working_copies\merge_tree_conflict_tests-24\
# branch\C' was not found.
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'merge',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge',
sbox.repo_url + '/A', branch_path)
+def merge_conflict_details(sbox):
+ "merge conflict details"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('A/B/E/new', 'new\n')
+ sbox.simple_add('A/B/E/new')
+ sbox.simple_append('A/B/E/alpha', '\nextra\nlines\n')
+ sbox.simple_rm('A/B/E/beta', 'A/B/F')
+ sbox.simple_propset('key', 'VAL', 'A/B/E', 'A/B')
+ sbox.simple_mkdir('A/B/E/new-dir1')
+ sbox.simple_mkdir('A/B/E/new-dir2')
+ sbox.simple_mkdir('A/B/E/new-dir3')
+ sbox.simple_rm('A/B/lambda')
+ sbox.simple_mkdir('A/B/lambda')
+ sbox.simple_commit()
+
+ sbox.simple_update('', 1)
+
+ sbox.simple_move('A/B', 'B')
+
+ sbox.simple_propset('key', 'vAl', 'B')
+ sbox.simple_move('B/E/beta', 'beta')
+ sbox.simple_propset('a', 'b', 'B/F', 'B/lambda')
+ sbox.simple_append('B/E/alpha', 'other\nnew\nlines')
+ sbox.simple_mkdir('B/E/new')
+ sbox.simple_mkdir('B/E/new-dir1')
+ sbox.simple_append('B/E/new-dir2', 'something')
+ sbox.simple_append('B/E/new-dir3', 'something')
+ sbox.simple_add('B/E/new-dir3')
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'B' : Item(status=' C', copied='+', moved_from='A/B',
+ wc_rev='-', entry_status='AC'),
+ 'B/E' : Item(status=' M', copied='+', wc_rev='-'),
+ 'B/E/new' : Item(status='A ', treeconflict='C', wc_rev='-'),
+ 'B/E/beta' : Item(status='D ', copied='+', treeconflict='C',
+ wc_rev='-', moved_to='beta'),
+ 'B/E/alpha' : Item(status='C ', copied='+', wc_rev='-'),
+ 'B/E/new-dir3' : Item(status='A ', treeconflict='C', wc_rev='-'),
+ 'B/E/new-dir1' : Item(status='A ', treeconflict='C', wc_rev='-'),
+ 'B/F' : Item(status=' M', copied='+', treeconflict='C',
+ wc_rev='-'),
+ 'B/lambda' : Item(status=' M', copied='+', treeconflict='C',
+ wc_rev='-'),
+ 'beta' : Item(status='A ', copied='+',
+ moved_from='B/E/beta', wc_rev='-')
+ })
+ expected_status.tweak('A/B', status='D ', wc_rev='1', moved_to='B')
+ expected_status.tweak('A/B/lambda', 'A/B/E', 'A/B/E/beta', 'A/B/E/alpha',
+ 'A/B/F', status='D ')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'B' : Item(status=' C'),
+ 'B/E' : Item(status=' U'),
+ 'B/E/new' : Item(status=' ', treeconflict='C'),
+ 'B/E/beta' : Item(status=' ', treeconflict='C'),
+ 'B/E/alpha' : Item(status='C '),
+ 'B/E/new-dir3' : Item(status=' ', treeconflict='C'),
+ 'B/E/new-dir1' : Item(status=' ', treeconflict='C'),
+ 'B/F' : Item(status=' ', treeconflict='C'),
+ 'B/lambda' : Item(status=' ', treeconflict='C'),
+ })
+ expected_skip = wc.State(wc_dir, {
+ 'B/E/new-dir2' : Item(verb='Skipped'),
+ })
+ svntest.actions.run_and_verify_merge(sbox.ospath('B'),
+ 1, 2, '^/A/B', '^/A/B',
+ expected_output,
+ None, None,
+ None, None, expected_skip)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ expected_info = [
+ {
+ "Path" : re.escape(sbox.ospath('B')),
+
+ "Conflict Properties File" :
+ re.escape(sbox.ospath('B/dir_conflicts.prej')) + '.*',
+ "Conflict Details": re.escape(
+ 'incoming dir edit upon merge' +
+ ' Source left: (dir) ^/A/B@1' +
+ ' Source right: (dir) ^/A/B@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E')),
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/alpha')),
+ "Conflict Previous Base File" : '.*alpha.*',
+ "Conflict Previous Working File" : '.*alpha.*',
+ "Conflict Current Base File": '.*alpha.*',
+ "Conflict Details": re.escape(
+ 'incoming file edit upon merge' +
+ ' Source left: (file) ^/A/B/E/alpha@1' +
+ ' Source right: (file) ^/A/B/E/alpha@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/beta')),
+ "Tree conflict": re.escape(
+ 'local file moved away, incoming file delete or move upon merge' +
+ ' Source left: (file) ^/A/B/E/beta@1' +
+ ' Source right: (none) ^/A/B/E/beta@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new')),
+ "Tree conflict": re.escape(
+ 'local dir add, incoming file add upon merge' +
+ ' Source left: (none) ^/A/B/E/new@1' +
+ ' Source right: (file) ^/A/B/E/new@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new-dir1')),
+ "Tree conflict": re.escape(
+ 'local dir add, incoming dir add upon merge' +
+ ' Source left: (none) ^/A/B/E/new-dir1@1' +
+ ' Source right: (dir) ^/A/B/E/new-dir1@2')
+ },
+ #{ ### Skipped
+ # "Path" : re.escape(sbox.ospath('B/E/new-dir2')),
+ # "Tree conflict": re.escape(
+ # 'local file unversioned, incoming dir add upon merge' +
+ # ' Source left: (none) ^/A/B/E/new-dir2@1' +
+ # ' Source right: (dir) ^/A/B/E/new-dir2@2')
+ #},
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new-dir3')),
+ "Tree conflict": re.escape(
+ 'local file add, incoming dir add upon merge' +
+ ' Source left: (none) ^/A/B/E/new-dir3@1' +
+ ' Source right: (dir) ^/A/B/E/new-dir3@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/F')),
+ "Tree conflict": re.escape(
+ 'local dir edit, incoming dir delete or move upon merge' +
+ ' Source left: (dir) ^/A/B/F@1' +
+ ' Source right: (none) ^/A/B/F@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/lambda')),
+ "Tree conflict": re.escape(
+ 'local file edit, incoming replace with dir upon merge' +
+ ' Source left: (file) ^/A/B/lambda@1' +
+ ' Source right: (dir) ^/A/B/lambda@2')
+ },
+ ]
+
+ svntest.actions.run_and_verify_info(expected_info, sbox.ospath('B'),
+ '--depth', 'infinity')
+
def merge_obstruction_recording(sbox):
"merge obstruction recording"
- sbox.build()
+ sbox.build(empty=True)
wc_dir = sbox.wc_dir
- sbox.simple_rm('iota', 'A')
sbox.simple_mkdir('trunk')
sbox.simple_mkdir('branches')
- sbox.simple_commit() #r2
+ sbox.simple_commit() #r1
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', sbox.repo_url + '/trunk',
sbox.repo_url + '/branches/branch',
- '-mCopy') # r3
+ '-mCopy') # r2
sbox.simple_mkdir('trunk/dir')
sbox.simple_add_text('The file on trunk\n', 'trunk/dir/file.txt')
- sbox.simple_commit() #r4
+ sbox.simple_commit() #r3
sbox.simple_update()
sbox.simple_mkdir('branches/branch/dir')
sbox.simple_add_text('The file on branch\n', 'branches/branch/dir/file.txt')
- sbox.simple_commit() #r5
+ sbox.simple_commit() #r4
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', '^/branches/branch', wc_dir,
'--ignore-ancestry')
@@ -1987,23 +2124,21 @@ def merge_obstruction_recording(sbox):
})
expected_mergeinfo_output = wc.State(wc_dir, {
'' : Item(status=' U'),
- 'dir' : Item(status=' U'), # Because dir already exists
})
expected_elision_output = wc.State(wc_dir, {
})
expected_disk = wc.State('', {
'dir/file.txt' : Item(contents="The file on branch\n"),
- 'dir' : Item(props={'svn:mergeinfo':''}),
- '.' : Item(props={'svn:mergeinfo':'/trunk:3-5'}),
+ '.' : Item(props={'svn:mergeinfo':'/trunk:2-4'}),
})
expected_status = wc.State(wc_dir, {
- '' : Item(status=' M', wc_rev='5'),
- 'dir' : Item(status=' M', treeconflict='C', wc_rev='5'),
- 'dir/file.txt' : Item(status=' ', wc_rev='5'),
+ '' : Item(status=' M', wc_rev='4'),
+ 'dir' : Item(status=' ', treeconflict='C', wc_rev='4'),
+ 'dir/file.txt' : Item(status=' ', wc_rev='4'),
})
expected_skip = wc.State('', {
})
- svntest.actions.run_and_verify_merge(wc_dir, '2', '5', sbox.repo_url + '/trunk',
+ svntest.actions.run_and_verify_merge(wc_dir, '1', '4', sbox.repo_url + '/trunk',
None,
expected_output,
expected_mergeinfo_output,
@@ -2017,8 +2152,8 @@ def merge_obstruction_recording(sbox):
"Path" : re.escape(sbox.ospath('dir')),
"Tree conflict": re.escape(
'local dir obstruction, incoming dir add upon merge' +
- ' Source left: (dir) ^/trunk/dir@2' + # Should be '(none)'
- ' Source right: (dir) ^/trunk/dir@5')
+ ' Source left: (none) ^/trunk/dir@1' +
+ ' Source right: (dir) ^/trunk/dir@4')
},
]
@@ -2027,38 +2162,210 @@ def merge_obstruction_recording(sbox):
# How should the user handle this conflict?
# ### Would be nice if we could just accept mine (leave as is, fix mergeinfo)
# ### or accept theirs (delete what is here and insert copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve', '--accept=working',
sbox.ospath('dir'))
# Redo the skipped merge as record only merge
expected_output = [
- '--- Recording mergeinfo for merge of r5 into \'%s\':\n' % \
+ '--- Recording mergeinfo for merge of r4 into \'%s\':\n' % \
sbox.ospath('dir'),
- ' G %s\n' % sbox.ospath('dir'),
+ ' U %s\n' % sbox.ospath('dir'),
]
# ### Why are r1-r3 not recorded?
# ### Guess: Because dir's history only exists since r4.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'merge', '--record-only',
sbox.repo_url + '/trunk/dir',
sbox.ospath('dir'),
- '-c', '2-5')
+ '-c', '1-4')
expected_disk = wc.State('', {
- 'dir' : Item(props={'svn:mergeinfo':'/trunk/dir:5'}),
+ 'dir' : Item(props={'svn:mergeinfo':'/trunk/dir:4'}),
'dir/file.txt' : Item(contents="The file on branch\n"),
- '.' : Item(props={'svn:mergeinfo':'/trunk:3-5'}),
+ '.' : Item(props={'svn:mergeinfo':'/trunk:2-4'}),
})
svntest.actions.verify_disk(wc_dir, expected_disk, check_props=True)
- # Because r2-r4 are not recorded, the mergeinfo is not elided :(
+ # Because r1-r3 are not recorded, the mergeinfo is not elided :(
# Even something like a two url merge wouldn't work, because dir
- # didn't exist below trunk in r2 either.
+ # didn't exist below trunk in r1 either.
# A resolver action could be smarter though...
+def added_revision_recording_in_tree_conflict(sbox):
+ "tree conflict stores added revision for victim"
+
+ sbox.build(empty=True)
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_mkdir('trunk')
+ sbox.simple_commit() #r1
+
+ # Create a branch
+ svntest.actions.run_and_verify_svn(None, [],
+ 'copy', sbox.repo_url + '/trunk',
+ sbox.repo_url + '/branch',
+ '-mcopy') # r2
+
+ sbox.simple_add_text('The file on trunk\n', 'trunk/foo')
+ sbox.simple_commit() #r3
+
+ sbox.simple_update()
+
+ # Merge ^/trunk into ^/branch
+ expected_output = svntest.wc.State(sbox.ospath('branch'), {
+ 'foo' : Item(status='A '),
+ })
+ expected_mergeinfo_output = wc.State(sbox.ospath('branch'), {
+ '' : Item(status=' U')
+ })
+ expected_elision_output = wc.State(wc_dir, {
+ })
+ expected_disk = wc.State('', {
+ 'foo' : Item(contents="The file on trunk\n"),
+ '.' : Item(props={u'svn:mergeinfo': u'/trunk:2-3'}),
+ })
+ expected_status = wc.State(sbox.ospath('branch'), {
+ '' : Item(status=' M', wc_rev='3'),
+ 'foo' : Item(status='A ', copied='+', wc_rev='-'),
+ })
+ expected_skip = wc.State('', {
+ })
+ svntest.actions.run_and_verify_merge(sbox.ospath('branch'), None, None,
+ sbox.repo_url + '/trunk',
+ None,
+ expected_output,
+ expected_mergeinfo_output,
+ expected_elision_output,
+ expected_disk,
+ expected_status,
+ expected_skip,
+ check_props=True)
+
+ sbox.simple_commit() #r4
+
+ # Edit the file on the branch
+ sbox.simple_append('branch/foo', 'The file on the branch\n')
+ sbox.simple_commit() #r5
+
+ # Replace file with a directory on trunk
+ sbox.simple_rm('trunk/foo')
+ sbox.simple_mkdir('trunk/foo')
+ sbox.simple_commit() #r6
+
+ sbox.simple_update()
+
+ # Merge ^/trunk into ^/branch
+ expected_output = svntest.wc.State(sbox.ospath('branch'), {
+ 'foo' : Item(status=' ', treeconflict='C')
+ })
+ expected_mergeinfo_output = wc.State(sbox.ospath('branch'), {
+ '' : Item(status=' U'),
+ })
+ expected_elision_output = wc.State(wc_dir, {
+ })
+ expected_disk = wc.State('', {
+ 'foo' : Item(contents="The file on trunk\nThe file on the branch\n"),
+ '.' : Item(props={u'svn:mergeinfo': u'/trunk:2-6'}),
+ })
+ expected_status = wc.State(sbox.ospath('branch'), {
+ '' : Item(status=' M', wc_rev='6'),
+ 'foo' : Item(status=' ', treeconflict='C', wc_rev='6'),
+ })
+ expected_skip = wc.State('', {
+ })
+ svntest.actions.run_and_verify_merge(sbox.ospath('branch'), None, None,
+ sbox.repo_url + '/trunk',
+ None,
+ expected_output,
+ expected_mergeinfo_output,
+ expected_elision_output,
+ expected_disk,
+ expected_status,
+ expected_skip,
+ check_props=True)
+
+ # Ensure that revisions in tree conflict info match what we expect.
+ # We used to record source left as ^/trunk/foo@1 instead of ^/trunk/foo@3.
+ # Note that foo was first added in r3.
+ expected_info = [
+ {
+ "Path" : re.escape(sbox.ospath('branch/foo')),
+ "Tree conflict": re.escape(
+ 'local file edit, incoming replace with dir upon merge' +
+ ' Source left: (file) ^/trunk/foo@3' +
+ ' Source right: (dir) ^/trunk/foo@6'),
+ },
+ ]
+ svntest.actions.run_and_verify_info(expected_info, sbox.ospath('branch/foo'))
+
+def spurios_tree_conflict_with_added_file(sbox):
+ "spurious tree conflict with unmodified added file"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Create a branch of A, A_copy
+ sbox.simple_copy('A', 'A_branch')
+ sbox.simple_commit()
+
+ # Create a new file on the trunk
+ sbox.simple_append('A/new', 'new\n')
+ sbox.simple_add('A/new')
+ sbox.simple_commit()
+
+ # Sync the branch with the trunk
+ sbox.simple_update()
+ expected_output = wc.State(wc_dir, {
+ "A_branch/new" : Item(status="A "),
+ })
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_merge(sbox.ospath('A_branch'),
+ None, None, '^/A', None,
+ expected_output,
+ None, None,
+ None, None, expected_skip)
+ sbox.simple_commit()
+
+ # Reintegrate the branch (a no-op change, but users are free to do this)
+ sbox.simple_update()
+ expected_output = wc.State(wc_dir, { })
+ svntest.actions.run_and_verify_merge(sbox.ospath('A'),
+ None, None, '^/A_branch', None,
+ expected_output,
+ None, None,
+ None, None, expected_skip,
+ [], False, True, '--reintegrate',
+ sbox.ospath('A'))
+
+ # Delete the new file on the branch
+ sbox.simple_rm('A_branch/new')
+ sbox.simple_commit()
+
+ # Make an unrelated change on the trunk
+ sbox.simple_append('A/mu', 'more text\n')
+ sbox.simple_commit()
+
+ # Merge the trunk to the branch. Forcing a reintegrate merge here since
+ # this is what the automatic merge does, as of the time this test was written.
+ # This merge would raise an 'local missing vs incoming edit' tree conflict
+ # on the new file, which is bogus since there are no incoming edits.
+ expected_output = wc.State(wc_dir, {
+ 'A_branch/mu' : Item(status='U '),
+ })
+ expected_mergeinfo_output = wc.State(wc_dir, {
+ 'A_branch' : Item(status=' U'),
+ })
+ svntest.actions.run_and_verify_merge(sbox.ospath('A_branch'),
+ None, None, '^/A', None,
+ expected_output,
+ expected_mergeinfo_output, None,
+ None, None, expected_skip,
+ [], False, True, '--reintegrate',
+ sbox.ospath('A_branch'))
+
########################################################################
# Run the tests
@@ -2090,7 +2397,10 @@ test_list = [ None,
merge_replace_causes_tree_conflict,
merge_replace_causes_tree_conflict2,
merge_replace_on_del_fails,
+ merge_conflict_details,
merge_obstruction_recording,
+ added_revision_recording_in_tree_conflict,
+ spurios_tree_conflict_with_added_file,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/mergeinfo_tests.py b/subversion/tests/cmdline/mergeinfo_tests.py
index adb7925..328a9f2 100755
--- a/subversion/tests/cmdline/mergeinfo_tests.py
+++ b/subversion/tests/cmdline/mergeinfo_tests.py
@@ -44,10 +44,9 @@ exp_noop_up_out = svntest.actions.expected_noop_update_output
from svntest.main import SVN_PROP_MERGEINFO
from svntest.main import server_has_mergeinfo
-# Get a couple merge helpers from merge_tests.py
-import merge_tests
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+# Get a couple merge helpers
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
def adjust_error_for_server_version(expected_err):
"Return the expected error regexp appropriate for the server version."
@@ -75,6 +74,7 @@ def no_mergeinfo(sbox):
sbox.repo_url + '/A2',
"--show-revs=merged")
+@SkipUnless(server_has_mergeinfo)
def mergeinfo(sbox):
"'mergeinfo' on a path with mergeinfo"
@@ -89,7 +89,7 @@ def mergeinfo(sbox):
sbox.simple_update()
# Dummy up some mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', SVN_PROP_MERGEINFO, '/A:3',
sbox.ospath('A2'))
svntest.actions.run_and_verify_mergeinfo(adjust_error_for_server_version(""),
@@ -173,6 +173,7 @@ def mergeinfo_non_source(sbox):
#----------------------------------------------------------------------
# Issue #3138
+@SkipUnless(server_has_mergeinfo)
@Issue(3138)
def mergeinfo_on_unknown_url(sbox):
"mergeinfo of an unknown url should return error"
@@ -182,20 +183,21 @@ def mergeinfo_on_unknown_url(sbox):
# remove a path from the repo and commit.
iota_path = os.path.join(wc_dir, 'iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota_path)
- svntest.actions.run_and_verify_svn("", None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota_path)
+ svntest.actions.run_and_verify_svn(None, [],
"ci", wc_dir, "-m", "log message")
url = sbox.repo_url + "/iota"
expected_err = adjust_error_for_server_version(".*File not found.*iota.*|"
".*iota.*path not found.*")
- svntest.actions.run_and_verify_svn("", None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
"mergeinfo", "--show-revs", "eligible",
url, wc_dir)
# Test for issue #3126 'svn mergeinfo shows too few or too many
# eligible revisions'. Specifically
# http://subversion.tigris.org/issues/show_bug.cgi?id=3126#desc5.
+@SkipUnless(server_has_mergeinfo)
@Issue(3126)
def non_inheritable_mergeinfo(sbox):
"non-inheritable mergeinfo shows as merged"
@@ -211,11 +213,10 @@ def non_inheritable_mergeinfo(sbox):
# Update the WC, then merge r4 from A to A_COPY and r6 from A to A_COPY
# at --depth empty and commit the merges as r7.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(6), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(6), [], 'up',
wc_dir)
expected_status.tweak(wc_rev=6)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]],
['U ' + rho_COPY_path + '\n',
' U ' + A_COPY_path + '\n',]),
@@ -223,7 +224,6 @@ def non_inheritable_mergeinfo(sbox):
sbox.repo_url + '/A',
A_COPY_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[6]], ' G ' + A_COPY_path + '\n'),
[], 'merge', '-c6',
sbox.repo_url + '/A',
@@ -234,10 +234,10 @@ def non_inheritable_mergeinfo(sbox):
})
expected_status.tweak('A_COPY', 'A_COPY/D/G/rho', wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update the WC a last time to ensure full inheritance.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [], 'up',
wc_dir)
# Despite being non-inheritable, r6 should still show as merged to A_COPY
@@ -294,26 +294,25 @@ def recursive_mergeinfo(sbox):
nu2_path = os.path.join(wc_dir, "A2", "C", "nu2")
# Rename A to A2 in r7.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(6), [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(6), [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'ren', A_path, A2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir, '-m', 'rename A to A2')
# Add the files A/B/F/nu and A/C/nu2 and commit them as r8.
svntest.main.file_write(nu_path, "A new file.\n")
svntest.main.file_write(nu2_path, "Another new file.\n")
svntest.main.run_svn(None, "add", nu_path, nu2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir, '-m', 'Add 2 new files')
# Do several merges to create varied subtree mergeinfo
# Merge r4 from A2 to A_COPY at depth empty
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(8), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(8), [], 'up',
wc_dir)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[4]], ' U ' + A_COPY_path + '\n'),
[], 'merge', '-c4', '--depth', 'empty',
sbox.repo_url + '/A2',
@@ -321,7 +320,6 @@ def recursive_mergeinfo(sbox):
# Merge r6 from A2/D/H to A_COPY/D/H
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[6]],
['U ' + omega_COPY_path + '\n',
' G ' + H_COPY_path + '\n']),
@@ -331,7 +329,6 @@ def recursive_mergeinfo(sbox):
# Merge r5 from A2 to A_COPY
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + beta_COPY_path + '\n',
' G ' + A_COPY_path + '\n',
@@ -345,7 +342,6 @@ def recursive_mergeinfo(sbox):
# Reverse merge -r5 from A2/C to A_COPY/C leaving empty mergeinfo on
# A_COPY/C.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[-5]],
' G ' + C_COPY_path + '\n'),
[], 'merge', '-c-5',
@@ -353,7 +349,6 @@ def recursive_mergeinfo(sbox):
# Merge r8 from A2/B/F to A_COPY/B/F
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[8]],
['A ' + nu_COPY_path + '\n',
' G ' + F_COPY_path + '\n']),
@@ -362,9 +357,9 @@ def recursive_mergeinfo(sbox):
F_COPY_path)
# Commit everything this far as r9
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir, '-m', 'Many merges')
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(9), [], 'up',
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(9), [], 'up',
wc_dir)
# Test svn mergeinfo -R / --depth infinity.
@@ -459,26 +454,24 @@ def mergeinfo_on_pegged_wc_path(sbox):
#
# r7 - Merge -c3,6 from A to A_COPY.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3],[6]],
['U ' + psi_COPY_path + '\n',
'U ' + omega_COPY_path + '\n',
' U ' + A_COPY_path + '\n',
' G ' + A_COPY_path + '\n',]),
[], 'merge', '-c3,6', sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', 'Merge r3 and r6')
# r8 - Merge -c5 from A to A_COPY.
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[5]],
['U ' + beta_COPY_path + '\n',
' U ' + A_COPY_path + '\n']),
[], 'merge', '-c5', '--allow-mixed-revisions',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', wc_dir,
'-m', 'Merge r5')
@@ -572,19 +565,19 @@ def wc_target_inherits_mergeinfo_from_repos(sbox):
# Properties on 'A_COPY':
# svn:mergeinfo
# /A:7
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/D/G/rho',
rho_COPY_path, '-c5')
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A',
A_COPY_path, '-c7')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Cherrypicks to branch subtree and root',
wc_dir)
# Checkout a new wc rooted at ^/A_COPY/D.
subtree_wc = sbox.add_wc_path('D_COPY')
- svntest.actions.run_and_verify_svn(None, None, [], 'co',
+ svntest.actions.run_and_verify_svn(None, [], 'co',
sbox.repo_url + '/A_COPY/D',
subtree_wc)
@@ -620,10 +613,10 @@ def wc_target_inherits_mergeinfo_from_repos(sbox):
# source.
#
# In r9 make a change that effects two branches:
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
svntest.main.file_write(gamma_2_path, "New content.\n")
svntest.main.file_write(tau_path, "New content.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Make changes under both A and A_COPY_2',
wc_dir)
@@ -638,10 +631,10 @@ def wc_target_inherits_mergeinfo_from_repos(sbox):
# Properties on 'A_COPY\D\G\rho':
# svn:mergeinfo
# /A/D/G/rho:5
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A_COPY_2',
A_COPY_path, '-c9')
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r8 from A_COPY_2 to A_COPY',
wc_dir)
@@ -671,8 +664,8 @@ def wc_target_inherits_mergeinfo_from_repos(sbox):
'--show-revs', 'merged', '-R')
# Test while the target is the full WC and then with the subtree WC:
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', subtree_wc)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', subtree_wc)
test_svn_mergeinfo_4_way(D_COPY_path)
test_svn_mergeinfo_4_way(subtree_wc)
@@ -695,27 +688,27 @@ def natural_history_is_not_eligible_nor_merged(sbox):
# r7 - Add a new file A/C/nu
svntest.main.file_write(nu_path, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', nu_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'add', nu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Add a file', wc_dir)
# r8 - Sync merge ^/A to A_COPY
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Add a file', wc_dir)
# r9 - Modify the file added in r7
svntest.main.file_write(nu_path, "Modification to file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Modify added file', wc_dir)
# r10 - Merge ^/A/C/nu to A_COPY/C/nu, creating subtree mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A/C/nu', nu_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci',
+ svntest.actions.run_and_verify_svn(None, [], 'ci',
'-m', 'Add a file', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# We've effectively merged everything from ^/A to A_COPY, check
# that svn mergeinfo -R agrees.
@@ -756,13 +749,13 @@ def noninheritable_mergeinfo_not_always_eligible(sbox):
svntest.main.run_svn(None, 'up', wc_dir)
# r4 - Merge r3 from ^/A to branch at depth=empty.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ svntest.actions.run_and_verify_svn(None, [], 'merge',
sbox.repo_url + '/A', branch_path,
'-c3', '--depth=empty')
# Forcibly set non-inheritable mergeinfo to replicate the pre-1.8 behavior,
# where prior to the fix for issue #4057, non-inheritable mergeinfo was
# unconditionally set for merges with shallow operational depths.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', SVN_PROP_MERGEINFO,
'/A:3*\n', branch_path)
svntest.main.run_svn(None, 'commit', '-m', 'shallow merge', wc_dir)
@@ -780,9 +773,184 @@ def noninheritable_mergeinfo_not_always_eligible(sbox):
[], sbox.repo_url + '/A', sbox.repo_url + '/branch',
'--show-revs', 'eligible', '-R')
+@SkipUnless(server_has_mergeinfo)
+@Issue(4301)
+def mergeinfo_local_move(sbox):
+ "'mergeinfo' on a locally moved path"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_move('A', 'A2')
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mergeinfo', sbox.repo_url + '/A',
+ sbox.ospath('A2'))
+
+@SkipUnless(server_has_mergeinfo)
+@Issue(4582)
+def no_mergeinfo_on_tree_conflict_victim(sbox):
+ "do not record mergeinfo on tree conflict victims"
+ sbox.build()
+
+ # Create a branch of A called A_copy
+ sbox.simple_copy('A', 'A_copy')
+ sbox.simple_commit()
+
+ # Add a new directory and file on both branches
+ sbox.simple_mkdir('A/dir')
+ sbox.simple_add_text('new file', 'A/dir/f')
+ sbox.simple_commit()
+
+ sbox.simple_mkdir('A_copy/dir')
+ sbox.simple_add_text('new file', 'A_copy/dir/f')
+ sbox.simple_commit()
+
+ # Run a merge from A to A_copy
+ expected_output = wc.State(sbox.ospath('A_copy'), {
+ 'dir' : Item(status=' ', treeconflict='C'),
+ 'dir/f' : Item(status=' ', treeconflict='A'),
+ })
+ expected_mergeinfo_output = wc.State(sbox.ospath('A_copy'), {
+ '' : Item(status=' U'),
+ })
+ expected_elision_output = wc.State(sbox.ospath('A_copy'), {
+ })
+
+ expected_disk = svntest.wc.State('', {
+ 'C' : Item(),
+ 'B/E/beta' : Item(contents="This is the file 'beta'.\n"),
+ 'B/E/alpha' : Item(contents="This is the file 'alpha'.\n"),
+ 'B/lambda' : Item(contents="This is the file 'lambda'.\n"),
+ 'B/F' : Item(),
+ 'D/H/omega' : Item(contents="This is the file 'omega'.\n"),
+ 'D/H/psi' : Item(contents="This is the file 'psi'.\n"),
+ 'D/H/chi' : Item(contents="This is the file 'chi'.\n"),
+ 'D/G/tau' : Item(contents="This is the file 'tau'.\n"),
+ 'D/G/pi' : Item(contents="This is the file 'pi'.\n"),
+ 'D/G/rho' : Item(contents="This is the file 'rho'.\n"),
+ 'D/gamma' : Item(contents="This is the file 'gamma'.\n"),
+ 'dir/f' : Item(contents="new file"),
+ 'mu' : Item(contents="This is the file 'mu'.\n"),
+ })
+
+ # The merge will create an add vs add tree conflict on A_copy/dir
+ expected_status = svntest.wc.State(sbox.ospath('A_copy'), {
+ '' : Item(status=' M', wc_rev='4'),
+ 'D' : Item(status=' ', wc_rev='4'),
+ 'D/G' : Item(status=' ', wc_rev='4'),
+ 'D/G/pi' : Item(status=' ', wc_rev='4'),
+ 'D/G/rho' : Item(status=' ', wc_rev='4'),
+ 'D/G/tau' : Item(status=' ', wc_rev='4'),
+ 'D/H' : Item(status=' ', wc_rev='4'),
+ 'D/H/psi' : Item(status=' ', wc_rev='4'),
+ 'D/H/omega' : Item(status=' ', wc_rev='4'),
+ 'D/H/chi' : Item(status=' ', wc_rev='4'),
+ 'D/gamma' : Item(status=' ', wc_rev='4'),
+ 'B' : Item(status=' ', wc_rev='4'),
+ 'B/F' : Item(status=' ', wc_rev='4'),
+ 'B/E' : Item(status=' ', wc_rev='4'),
+ 'B/E/alpha' : Item(status=' ', wc_rev='4'),
+ 'B/E/beta' : Item(status=' ', wc_rev='4'),
+ 'B/lambda' : Item(status=' ', wc_rev='4'),
+ 'C' : Item(status=' ', wc_rev='4'),
+ 'dir' : Item(status=' ', treeconflict='C', wc_rev='4'),
+ 'dir/f' : Item(status=' ', wc_rev='4'),
+ 'mu' : Item(status=' ', wc_rev='4'),
+ })
+
+ expected_skip = wc.State('', { })
+
+ sbox.simple_update('A_copy')
+ svntest.actions.run_and_verify_merge(sbox.ospath('A_copy'),
+ None, None, # rev1, rev2
+ '^/A',
+ None, # URL2
+ expected_output,
+ expected_mergeinfo_output,
+ expected_elision_output,
+ expected_disk,
+ expected_status,
+ expected_skip)
+
+ # Resolve the tree conflict by accepting the working copy state left
+ # behind by the merge. This preserves the line of history of A_copy/dir,
+ # which originated on the branch 'A_copy', rather than replacing it with
+ # Jthe line f history of A/dir which originated on branch 'A'
+ svntest.actions.run_and_verify_resolve([sbox.ospath('A_copy/dir')],
+ '--accept', 'working',
+ sbox.ospath('A_copy/dir'))
+ sbox.simple_commit('A_copy')
+
+ # Now try to merge the 'A_copy' branch back to 'A"
+ expected_output = wc.State(sbox.ospath('A'), {
+ 'dir' : Item(status='R '), # changes line of history of A/dir
+ 'dir/f' : Item(status='A '),
+ })
+ expected_mergeinfo_output = wc.State(sbox.ospath('A'), {
+ '' : Item(status=' U'),
+ })
+ expected_elision_output = wc.State(sbox.ospath('A'), {
+ })
+
+ expected_disk = svntest.wc.State('', {
+ 'C' : Item(),
+ 'B/E/beta' : Item(contents="This is the file 'beta'.\n"),
+ 'B/E/alpha' : Item(contents="This is the file 'alpha'.\n"),
+ 'B/F' : Item(),
+ 'B/lambda' : Item(contents="This is the file 'lambda'.\n"),
+ 'D/H/omega' : Item(contents="This is the file 'omega'.\n"),
+ 'D/H/psi' : Item(contents="This is the file 'psi'.\n"),
+ 'D/H/chi' : Item(contents="This is the file 'chi'.\n"),
+ 'D/G/tau' : Item(contents="This is the file 'tau'.\n"),
+ 'D/G/pi' : Item(contents="This is the file 'pi'.\n"),
+ 'D/G/rho' : Item(contents="This is the file 'rho'.\n"),
+ 'D/gamma' : Item(contents="This is the file 'gamma'.\n"),
+ 'dir/f' : Item(contents="new file"),
+ 'mu' : Item(contents="This is the file 'mu'.\n"),
+ })
+
+ expected_status = svntest.wc.State(sbox.ospath('A'), {
+ '' : Item(status=' M', wc_rev='5'),
+ 'dir' : Item(status='R ', copied='+', wc_rev='-'),
+ 'dir/f' : Item(status=' ', copied='+', wc_rev='-'),
+ 'D' : Item(status=' ', wc_rev='5'),
+ 'D/H' : Item(status=' ', wc_rev='5'),
+ 'D/H/chi' : Item(status=' ', wc_rev='5'),
+ 'D/H/omega' : Item(status=' ', wc_rev='5'),
+ 'D/H/psi' : Item(status=' ', wc_rev='5'),
+ 'D/G' : Item(status=' ', wc_rev='5'),
+ 'D/G/pi' : Item(status=' ', wc_rev='5'),
+ 'D/G/rho' : Item(status=' ', wc_rev='5'),
+ 'D/G/tau' : Item(status=' ', wc_rev='5'),
+ 'D/gamma' : Item(status=' ', wc_rev='5'),
+ 'B' : Item(status=' ', wc_rev='5'),
+ 'B/E' : Item(status=' ', wc_rev='5'),
+ 'B/E/beta' : Item(status=' ', wc_rev='5'),
+ 'B/E/alpha' : Item(status=' ', wc_rev='5'),
+ 'B/lambda' : Item(status=' ', wc_rev='5'),
+ 'B/F' : Item(status=' ', wc_rev='5'),
+ 'mu' : Item(status=' ', wc_rev='5'),
+ 'C' : Item(status=' ', wc_rev='5'),
+ })
+
+ expected_skip = wc.State('', { })
+ sbox.simple_update('A')
+ svntest.actions.run_and_verify_merge(sbox.ospath('A'),
+ None, None, # rev1, rev2
+ '^/A_copy',
+ None, # URL2
+ expected_output,
+ expected_mergeinfo_output,
+ expected_elision_output,
+ expected_disk,
+ expected_status,
+ expected_skip)
+ sbox.simple_commit('A')
+
########################################################################
# Run the tests
+# Note that mergeinfo --log is tested in log_tests.py
# list all tests here, starting with None:
test_list = [ None,
@@ -797,6 +965,8 @@ test_list = [ None,
wc_target_inherits_mergeinfo_from_repos,
natural_history_is_not_eligible_nor_merged,
noninheritable_mergeinfo_not_always_eligible,
+ mergeinfo_local_move,
+ no_mergeinfo_on_tree_conflict_victim,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/mod_authz_svn_tests.py b/subversion/tests/cmdline/mod_authz_svn_tests.py
new file mode 100644
index 0000000..d04690f
--- /dev/null
+++ b/subversion/tests/cmdline/mod_authz_svn_tests.py
@@ -0,0 +1,1073 @@
+#!/usr/bin/env python
+#
+# mod_authz_svn_tests.py: testing mod_authz_svn
+#
+# Subversion is a tool for revision control.
+# See http://subversion.apache.org for more information.
+#
+# ====================================================================
+# 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.
+######################################################################
+
+# General modules
+import os, re, logging
+
+logger = logging.getLogger()
+
+# Our testing module
+import svntest
+
+# (abbreviation)
+Skip = svntest.testcase.Skip_deco
+SkipUnless = svntest.testcase.SkipUnless_deco
+XFail = svntest.testcase.XFail_deco
+Issues = svntest.testcase.Issues_deco
+Issue = svntest.testcase.Issue_deco
+Wimp = svntest.testcase.Wimp_deco
+
+ls_of_D_no_H = '''<html><head><title>repos - Revision 1: /A/D</title></head>
+<body>
+ <h2>repos - Revision 1: /A/D</h2>
+ <ul>
+ <li><a href="../">..</a></li>
+ <li><a href="G/">G/</a></li>
+ <li><a href="gamma">gamma</a></li>
+ </ul>
+</body></html>'''
+
+ls_of_D_H = '''<html><head><title>repos - Revision 1: /A/D</title></head>
+<body>
+ <h2>repos - Revision 1: /A/D</h2>
+ <ul>
+ <li><a href="../">..</a></li>
+ <li><a href="G/">G/</a></li>
+ <li><a href="H/">H/</a></li>
+ <li><a href="gamma">gamma</a></li>
+ </ul>
+</body></html>'''
+
+ls_of_H = '''<html><head><title>repos - Revision 1: /A/D/H</title></head>
+<body>
+ <h2>repos - Revision 1: /A/D/H</h2>
+ <ul>
+ <li><a href="../">..</a></li>
+ <li><a href="chi">chi</a></li>
+ <li><a href="omega">omega</a></li>
+ <li><a href="psi">psi</a></li>
+ </ul>
+</body></html>'''
+
+user1 = svntest.main.wc_author
+user1_upper = user1.upper()
+user1_pass = svntest.main.wc_passwd
+user1_badpass = 'XXX'
+assert user1_pass != user1_badpass, "Passwords can't match"
+user2 = svntest.main.wc_author2
+user2_upper = user2.upper()
+user2_pass = svntest.main.wc_passwd
+user2_badpass = 'XXX'
+assert user2_pass != user2_badpass, "Passwords can't match"
+
+def write_authz_file(sbox):
+ svntest.main.write_authz_file(sbox, {
+ '/': '$anonymous = r\n' +
+ 'jrandom = rw\n' +
+ 'jconstant = rw',
+ '/A/D/H': '$anonymous =\n' +
+ '$authenticated =\n' +
+ 'jrandom = rw'
+ })
+
+def write_authz_file_groups(sbox):
+ authz_name = sbox.authz_name()
+ svntest.main.write_authz_file(sbox,{
+ '/': '* =',
+ })
+
+def verify_get(test_area_url, path, user, pw,
+ expected_status, expected_body, headers):
+ import httplib
+ from urlparse import urlparse
+ import base64
+
+ req_url = test_area_url + path
+
+ loc = urlparse(req_url)
+
+ if loc.scheme == 'http':
+ h = httplib.HTTPConnection(loc.hostname, loc.port)
+ else:
+ h = httplib.HTTPSConnection(loc.hostname, loc.port)
+
+ if headers is None:
+ headers = {}
+
+ if user and pw:
+ auth_info = user + ':' + pw
+ headers['Authorization'] = 'Basic ' + base64.b64encode(auth_info)
+ else:
+ auth_info = "anonymous"
+
+ h.request('GET', req_url, None, headers)
+
+ r = h.getresponse()
+
+ actual_status = r.status
+ if expected_status and expected_status != actual_status:
+
+ logger.warn("Expected status '" + str(expected_status) +
+ "' but got '" + str(actual_status) +
+ "' on url '" + req_url + "' (" +
+ auth_info + ").")
+ raise svntest.Failure
+
+ if expected_body:
+ actual_body = r.read()
+ if expected_body != actual_body:
+ logger.warn("Expected body:")
+ logger.warn(expected_body)
+ logger.warn("But got:")
+ logger.warn(actual_body)
+ logger.warn("on url '" + req_url + "' (" + auth_info + ").")
+ raise svntest.Failure
+
+def verify_gets(test_area_url, tests):
+ for test in tests:
+ verify_get(test_area_url, test['path'], test.get('user'), test.get('pw'),
+ test['status'], test.get('body'), test.get('headers'))
+
+
+######################################################################
+# Tests
+#
+# Each test must return on success or raise on failure.
+
+
+#----------------------------------------------------------------------
+
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def anon(sbox):
+ "test anonymous access"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/anon')
+
+ write_authz_file(sbox)
+
+ anon_tests = (
+ { 'path': '', 'status': 301 },
+ { 'path': '/', 'status': 200 },
+ { 'path': '/repos', 'status': 301 },
+ { 'path': '/repos/', 'status': 200 },
+ { 'path': '/repos/A', 'status': 301 },
+ { 'path': '/repos/A/', 'status': 200 },
+ { 'path': '/repos/A/D', 'status': 301 },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H },
+ { 'path': '/repos/A/D/gamma', 'status': 200 },
+ { 'path': '/repos/A/D/H', 'status': 403 },
+ { 'path': '/repos/A/D/H/', 'status': 403 },
+ { 'path': '/repos/A/D/H/chi', 'status': 403 },
+ # auth isn't configured so nothing should change when passing
+ # authn details
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ )
+
+ verify_gets(test_area_url, anon_tests)
+
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def mixed(sbox):
+ "test mixed anonymous and authenticated access"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/mixed')
+
+ write_authz_file(sbox)
+
+ mixed_tests = (
+ { 'path': '', 'status': 301, },
+ { 'path': '/', 'status': 200, },
+ { 'path': '/repos', 'status': 301, },
+ { 'path': '/repos/', 'status': 200, },
+ { 'path': '/repos/A', 'status': 301, },
+ { 'path': '/repos/A/', 'status': 200, },
+ { 'path': '/repos/A/D', 'status': 301, },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ },
+ { 'path': '/repos/A/D/gamma', 'status': 200, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access to H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ )
+
+ verify_gets(test_area_url, mixed_tests)
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+@XFail(svntest.main.is_httpd_authz_provider_enabled)
+# uses the AuthzSVNNoAuthWhenAnonymousAllowed On directive
+# this is broken with httpd 2.3.x+ since it requires the auth system to accept
+# r->user == NULL and there is a test for this in server/request.c now. It
+# was intended as a workaround for the lack of Satisfy Any in 2.3.x+ which
+# was resolved by httpd with mod_access_compat in 2.3.x+.
+def mixed_noauthwhenanon(sbox):
+ "test mixed with noauthwhenanon directive"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/mixed-noauthwhenanon')
+
+ write_authz_file(sbox)
+
+ noauthwhenanon_tests = (
+ { 'path': '', 'status': 301, },
+ { 'path': '/', 'status': 200, },
+ { 'path': '/repos', 'status': 301, },
+ { 'path': '/repos/', 'status': 200, },
+ { 'path': '/repos/A', 'status': 301, },
+ { 'path': '/repos/A/', 'status': 200, },
+ { 'path': '/repos/A/D', 'status': 301, },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ },
+ { 'path': '/repos/A/D/gamma', 'status': 200, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access to H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ # try with the wrong password for user1
+ # note that unlike doing this with Satisfy Any this case
+ # actually provides anon access when provided with an invalid
+ # password
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ )
+
+ verify_gets(test_area_url, noauthwhenanon_tests)
+
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def authn(sbox):
+ "test authenticated only access"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/authn')
+
+ write_authz_file(sbox)
+
+ authn_tests = (
+ { 'path': '', 'status': 401, },
+ { 'path': '/', 'status': 401, },
+ { 'path': '/repos', 'status': 401, },
+ { 'path': '/repos/', 'status': 401, },
+ { 'path': '/repos/A', 'status': 401, },
+ { 'path': '/repos/A/', 'status': 401, },
+ { 'path': '/repos/A/D', 'status': 401, },
+ { 'path': '/repos/A/D/', 'status': 401, },
+ { 'path': '/repos/A/D/gamma', 'status': 401, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access to H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ # try with upper case username for user1
+ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with upper case username for user2
+ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ )
+
+ verify_gets(test_area_url, authn_tests)
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def authn_anonoff(sbox):
+ "test authenticated only access with anonoff"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/authn-anonoff')
+
+ write_authz_file(sbox)
+
+ anonoff_tests = (
+ { 'path': '', 'status': 401, },
+ { 'path': '/', 'status': 401, },
+ { 'path': '/repos', 'status': 401, },
+ { 'path': '/repos/', 'status': 401, },
+ { 'path': '/repos/A', 'status': 401, },
+ { 'path': '/repos/A/', 'status': 401, },
+ { 'path': '/repos/A/D', 'status': 401, },
+ { 'path': '/repos/A/D/', 'status': 401, },
+ { 'path': '/repos/A/D/gamma', 'status': 401, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access to H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ # try with upper case username for user1
+ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with upper case username for user2
+ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ )
+
+ verify_gets(test_area_url, anonoff_tests)
+
+@SkipUnless(svntest.main.is_ra_type_dav)
+def authn_lcuser(sbox):
+ "test authenticated only access with lcuser"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/authn-lcuser')
+
+ write_authz_file(sbox)
+
+ lcuser_tests = (
+ # try with upper case username for user1 (works due to lcuser option)
+ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1_upper, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
+ # try with upper case username for user2 (works due to lcuser option)
+ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
+ )
+
+ verify_gets(test_area_url, lcuser_tests)
+
+# authenticated access only by group - a excuse to use AuthzSVNAuthoritative Off
+# this is terribly messed up, Require group runs after mod_authz_svn.
+# so if mod_authz_svn grants the access then it doesn't matter what the group
+# requirement says. If we reject the access then you can use the AuthzSVNAuthoritative Off
+# directive to fall through to the group check. Overall the behavior of setups like this
+# is almost guaranteed to not be what users expect.
+@SkipUnless(svntest.main.is_ra_type_dav)
+def authn_group(sbox):
+ "test authenticated only access via groups"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/authn-group')
+
+ # Can't use write_authz_file() as most tests because we want to deny all
+ # access with mod_authz_svn so the tests fall through to the group handling
+ authz_name = sbox.authz_name()
+ svntest.main.write_authz_file(sbox, {
+ '/': '* =',
+ })
+
+ group_tests = (
+ { 'path': '', 'status': 401, },
+ { 'path': '/', 'status': 401, },
+ { 'path': '/repos', 'status': 401, },
+ { 'path': '/repos/', 'status': 401, },
+ { 'path': '/repos/A', 'status': 401, },
+ { 'path': '/repos/A/', 'status': 401, },
+ { 'path': '/repos/A/D', 'status': 401, },
+ { 'path': '/repos/A/D/', 'status': 401, },
+ { 'path': '/repos/A/D/gamma', 'status': 401, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access repo including H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ )
+
+ verify_gets(test_area_url, group_tests)
+
+# This test exists to validate our behavior when used with the new authz
+# provider system introduced in httpd 2.3.x. The Satisfy directive
+# determines how older authz hooks are combined and the RequireA(ll|ny)
+# blocks handles how new authz providers are combined. The overall results of
+# all the authz providers (combined per the Require* blocks) are then
+# combined with the other authz hooks via the Satisfy directive.
+# Meaning this test requires that mod_authz_svn says yes and there is
+# either a valid user or the ALLOW header is 1. The header may seem
+# like a silly test but it's easier to excercise than say a host directive
+# in a repeatable test.
+@SkipUnless(svntest.main.is_httpd_authz_provider_enabled)
+def authn_sallrany(sbox):
+ "test satisfy all require any config"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/sallrany')
+
+ write_authz_file(sbox)
+
+ allow_header = { 'ALLOW': '1' }
+
+ sallrany_tests = (
+ #anon access isn't allowed without ALLOW header
+ { 'path': '', 'status': 401, },
+ { 'path': '/', 'status': 401, },
+ { 'path': '/repos', 'status': 401, },
+ { 'path': '/repos/', 'status': 401, },
+ { 'path': '/repos/A', 'status': 401, },
+ { 'path': '/repos/A/', 'status': 401, },
+ { 'path': '/repos/A/D', 'status': 401, },
+ { 'path': '/repos/A/D/', 'status': 401, },
+ { 'path': '/repos/A/D/gamma', 'status': 401, },
+ { 'path': '/repos/A/D/H', 'status': 401, },
+ { 'path': '/repos/A/D/H/', 'status': 401, },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, },
+ # auth is configured and user1 is allowed access repo including H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
+ # anon is allowed with the ALLOW header
+ { 'path': '', 'status': 301, 'headers': allow_header },
+ { 'path': '/', 'status': 200, 'headers': allow_header },
+ { 'path': '/repos', 'status': 301, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 200, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 301, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 200, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 301, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'headers': allow_header },
+ # these 3 tests return 403 instead of 401 becasue the config allows
+ # the anon user with the ALLOW header without any auth and the old hook
+ # system has no way of knowing it should return 401 since authentication is
+ # configured and can change the behavior. It could decide to return 401 just on
+ # the basis of authentication being configured but then that leaks info in other
+ # cases so it's better for this case to be "broken".
+ { 'path': '/repos/A/D/H', 'status': 403, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 403, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'headers': allow_header },
+ # auth is configured and user1 is allowed access repo including H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+
+ )
+
+ verify_gets(test_area_url, sallrany_tests)
+
+# See comments on authn_sallrany test for some background on the interaction
+# of Satisfy Any and the newer Require blocks.
+@SkipUnless(svntest.main.is_httpd_authz_provider_enabled)
+def authn_sallrall(sbox):
+ "test satisfy all require all config"
+ sbox.build(read_only = True, create_wc = False)
+
+ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
+ '/authz-test-work/sallrall')
+
+ write_authz_file(sbox)
+
+ allow_header = { 'ALLOW': '1' }
+
+ sallrall_tests = (
+ #anon access isn't allowed without ALLOW header
+ { 'path': '', 'status': 403, },
+ { 'path': '/', 'status': 403, },
+ { 'path': '/repos', 'status': 403, },
+ { 'path': '/repos/', 'status': 403, },
+ { 'path': '/repos/A', 'status': 403, },
+ { 'path': '/repos/A/', 'status': 403, },
+ { 'path': '/repos/A/D', 'status': 403, },
+ { 'path': '/repos/A/D/', 'status': 403, },
+ { 'path': '/repos/A/D/gamma', 'status': 403, },
+ { 'path': '/repos/A/D/H', 'status': 403, },
+ { 'path': '/repos/A/D/H/', 'status': 403, },
+ { 'path': '/repos/A/D/H/chi', 'status': 403, },
+ # auth is configured but no access is allowed without the ALLOW header
+ { 'path': '', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_pass},
+ # try with the wrong password for user1
+ { 'path': '', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_badpass},
+ # auth is configured but no access is allowed without the ALLOW header
+ { 'path': '', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
+ # try with the wrong password for user2
+ { 'path': '', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_badpass},
+ # anon is not allowed even with ALLOW header
+ { 'path': '', 'status': 401, 'headers': allow_header },
+ { 'path': '/', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 401, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'headers': allow_header },
+ # auth is configured and user1 is allowed access repo including H
+ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
+ 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
+ # try with the wrong password for user1
+ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
+ # auth is configured and user2 is not allowed access to H
+ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
+ 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
+ # try with the wrong password for user2
+ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
+
+ )
+
+ verify_gets(test_area_url, sallrall_tests)
+
+
+########################################################################
+# Run the tests
+
+
+# list all tests here, starting with None:
+test_list = [ None,
+ anon,
+ mixed,
+ mixed_noauthwhenanon,
+ authn,
+ authn_anonoff,
+ authn_lcuser,
+ authn_group,
+ authn_sallrany,
+ authn_sallrall,
+ ]
+serial_only = True
+
+if __name__ == '__main__':
+ svntest.main.run_tests(test_list)
+ # NOTREACHED
+
+
+### End of file.
diff --git a/subversion/tests/cmdline/move_tests.py b/subversion/tests/cmdline/move_tests.py
index 4495b59..b9f921c 100755
--- a/subversion/tests/cmdline/move_tests.py
+++ b/subversion/tests/cmdline/move_tests.py
@@ -152,7 +152,7 @@ def move_file_test(sbox, source, dest, move_func, test):
# update to start_rev
svntest.actions.run_and_verify_update(wc_dir, test['start_output'],
test['start_disk'], test['start_status'],
- None, None, None, None, None, False,
+ [], False,
'-r', test['start_rev'], wc_dir)
# execute the move
move_func(test['start_rev'])
@@ -162,7 +162,7 @@ def move_file_test(sbox, source, dest, move_func, test):
# properties.
svntest.actions.run_and_verify_update(wc_dir, test['up_output'],
test['up_disk'], test['up_status'],
- None, None, None, None, None, True,
+ [], True,
'-r', test['end_rev'], wc_dir)
revert_paths = None
@@ -182,8 +182,7 @@ def move_file_test(sbox, source, dest, move_func, test):
resolve['disk'] = None
if 'revert_paths' in resolve:
revert_paths = resolve['revert_paths']
- svntest.actions.run_and_verify_svn('Resolve modification to source of move',
- resolve['output'], resolve['error'],
+ svntest.actions.run_and_verify_svn(resolve['output'], resolve['error'],
'resolve', '--accept', resolve_accept,
'-R', wc_dir)
@@ -246,11 +245,6 @@ def build_simple_file_move_tests(sbox, source, dest):
copied='+', wc_rev='-')})
mc['disk'] = test['up_disk'].copy()
mc['disk'].tweak(dest, contents="This is the file 'lambda'.\nmodified\n")
- # theirs-conflict doesn't work
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
# working breaks the move
working = {}
working['output'] = svntest.verify.ExpectedOutput(
@@ -263,7 +257,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].tweak(source, status='D ')
working['status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -286,15 +280,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'] = svntest.actions.get_virginal_state(wc_dir, test['end_rev'])
test['up_status'].tweak(source, status='! ', treeconflict='C', wc_rev=None)
test['up_status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doen't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't say it broke the move it should.
working['output'] = svntest.verify.ExpectedOutput(
@@ -306,7 +296,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].remove(source)
working['disk'] = test['up_disk']
working['revert_paths'] = [dest_path]
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [dest_path, source_path]
tests.append(test)
@@ -331,15 +321,11 @@ def build_simple_file_move_tests(sbox, source, dest):
# XXX: Is entry_status=' ' really right here?
test['up_status'].tweak(source, status='! ', treeconflict='C', entry_status=' ')
test['up_status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Broke the move but doesn't notify that it does.
working['output'] = svntest.verify.ExpectedOutput(
@@ -350,7 +336,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].tweak(source, status='! ')
working['status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -374,15 +360,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't say what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -394,7 +376,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -419,15 +401,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
working['accept'] = 'working'
# XXX: Doesn't say what it did.
@@ -440,7 +418,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -488,15 +466,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't say what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -508,7 +482,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -532,15 +506,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't say what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -552,7 +522,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -576,15 +546,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Didn't tell us what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -596,7 +562,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -620,15 +586,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't tell you what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -640,7 +602,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -664,15 +626,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='D ', moved_to=dest)
test['up_status'].add({dest: Item(status='R ', copied='+', treeconflict='C',
wc_rev='-', moved_from=source)})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
# XXX: Doesn't tell you what it did.
working['output'] = svntest.verify.ExpectedOutput(
@@ -684,7 +642,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].add({dest: Item(status='R ', moved_from=source,
copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -720,11 +678,6 @@ def build_simple_file_move_tests(sbox, source, dest):
copied='+', wc_rev='-')})
mc['disk'] = test['up_disk'].copy()
mc['disk'].tweak(dest, props={u'foo': u'bar'})
- # theirs-conflict doesn't work
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
working['output'] = svntest.verify.ExpectedOutput(
[
@@ -737,7 +690,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].tweak(source, status='D ')
working['status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -773,11 +726,6 @@ def build_simple_file_move_tests(sbox, source, dest):
copied='+', wc_rev='-')})
mc['disk'] = test['up_disk'].copy()
mc['disk'].tweak(dest, props={u'foo': u'baz'})
- # theirs-conflict doesn't work
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
working['output'] = svntest.verify.ExpectedOutput(
[
@@ -790,7 +738,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].tweak(source, status='D ')
working['status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -826,11 +774,6 @@ def build_simple_file_move_tests(sbox, source, dest):
copied='+', wc_rev='-')})
mc['disk'] = test['up_disk'].copy()
mc['disk'].tweak(dest, props={})
- # theirs-conflict doesn't work
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
working['output'] = svntest.verify.ExpectedOutput(
[
@@ -843,7 +786,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].tweak(source, status='D ')
working['status'].add({dest: Item(status='A ', copied='+', wc_rev='-')})
working['disk'] = test['up_disk']
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [source_path, dest_path]
tests.append(test)
@@ -870,15 +813,11 @@ def build_simple_file_move_tests(sbox, source, dest):
test['up_status'].tweak(source, status='! ', treeconflict='C', wc_rev=None)
test['up_status'].add({dest: Item(status='R ', copied='+', wc_rev='-',
treeconflict='C')})
- # mine-conflict and theirs-conflict don't work.
+ # mine-conflict doesn't work.
mc = {}
mc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
mc['status'] = test['up_status']
mc['disk'] = test['up_disk']
- tc = {}
- tc['error'] = svntest.verify.RegexOutput(".*: .*: W155027:.*", match_all=False)
- tc['status'] = test['up_status']
- tc['disk'] = test['up_disk']
working = {}
working['output'] = svntest.verify.ExpectedOutput(
"Resolved conflicted state of '%s'\n" % source_path, match_all=False
@@ -889,7 +828,7 @@ def build_simple_file_move_tests(sbox, source, dest):
working['status'].remove(source)
working['disk'] = test['up_disk']
working['revert_paths'] = [dest_path]
- test['resolves'] = {'mine-conflict': mc, 'theirs-conflict': tc,
+ test['resolves'] = {'mine-conflict': mc,
'working': working}
test['revert_paths'] = [dest_path, source_path]
tests.append(test)
@@ -904,7 +843,7 @@ def build_simple_file_move_func(sbox, source, dest):
# Setup the move function
def move_func(rev):
# execute the move
- svntest.actions.run_and_verify_svn(None, None, [], "move",
+ svntest.actions.run_and_verify_svn(None, [], "move",
source_path, dest_path)
if move_func.extra_mv_tests:
mv_status = svntest.actions.get_virginal_state(wc_dir, rev)
@@ -914,13 +853,13 @@ def build_simple_file_move_func(sbox, source, dest):
mv_info_src = [
{
'Path' : re.escape(source_path),
- 'Moved To' : re.escape(dest),
+ 'Moved To' : re.escape(sbox.ospath(dest)),
}
]
mv_info_dst = [
{
'Path' : re.escape(dest_path),
- 'Moved From' : re.escape(source),
+ 'Moved From' : re.escape(sbox.ospath(source)),
}
]
@@ -1098,7 +1037,7 @@ def property_merge(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
sbox.simple_update()
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/C'))
@@ -1140,29 +1079,33 @@ def property_merge(sbox):
"""Trying to add new property 'key1'
but the property already exists.
<<<<<<< (local property value)
-value2=======
-value3>>>>>>> (incoming property value)
+value2||||||| (incoming 'changed from' value)
+=======
+value3>>>>>>> (incoming 'changed to' value)
"""),
'A/C2/D5/dir_conflicts.prej' : Item(contents=
"""Trying to change property 'key1'
but the property has already been locally changed to a different value.
<<<<<<< (local property value)
-value2=======
-value3>>>>>>> (incoming property value)
+value2||||||| (incoming 'changed from' value)
+value1=======
+value3>>>>>>> (incoming 'changed to' value)
"""),
'A/C2/f4.prej' : Item(contents=
"""Trying to add new property 'key1'
but the property already exists.
<<<<<<< (local property value)
-value2=======
-value3>>>>>>> (incoming property value)
+value2||||||| (incoming 'changed from' value)
+=======
+value3>>>>>>> (incoming 'changed to' value)
"""),
'A/C2/f5.prej' : Item(contents=
"""Trying to change property 'key1'
but the property has already been locally changed to a different value.
<<<<<<< (local property value)
-value2=======
-value3>>>>>>> (incoming property value)
+value2||||||| (incoming 'changed from' value)
+value1=======
+value3>>>>>>> (incoming 'changed to' value)
"""),
})
@@ -1205,7 +1148,7 @@ def move_missing(sbox):
# This move currently fails halfway between adding the dest and
# deleting the source
- svntest.actions.run_and_verify_svn(None, None, expected_err,
+ svntest.actions.run_and_verify_svn(None, expected_err,
'mv', sbox.ospath('A/D/G'),
sbox.ospath('R'))
@@ -1213,27 +1156,119 @@ def move_missing(sbox):
expected_status.tweak('A/D/G', 'A/D/G/tau', 'A/D/G/pi', 'A/D/G/rho',
status='! ', entry_status=' ')
- expected_status.add({
- 'R' : Item(status='! ', wc_rev='-',
- entry_status='A ', entry_copied='+'),
- 'R/pi' : Item(status='! ', wc_rev='-',
- entry_status=' ', entry_copied='+'),
- 'R/tau' : Item(status='! ', wc_rev='-',
- entry_status=' ', entry_copied='+'),
- 'R/rho' : Item(status='! ', wc_rev='-',
- entry_status=' ', entry_copied='+'),
- })
-
# Verify that the status processing doesn't crash
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# The issue is a crash when the destination is present
os.mkdir(sbox.ospath('R'))
- expected_status.tweak('R', status='A ', copied='+')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
+def nested_replaces(sbox):
+ "nested replaces"
+
+ sbox.build(create_wc=False, empty=True)
+ repo_url = sbox.repo_url
+ wc_dir = sbox.wc_dir
+ ospath = sbox.ospath
+
+ ## r1: setup
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', repo_url,
+ '-m', 'r1: create tree',
+ 'mkdir', 'A', 'mkdir', 'A/B', 'mkdir', 'A/B/C',
+ 'mkdir', 'X', 'mkdir', 'X/Y', 'mkdir', 'X/Y/Z',
+ # sentinel files
+ 'put', os.devnull, 'A/a',
+ 'put', os.devnull, 'A/B/b',
+ 'put', os.devnull, 'A/B/C/c',
+ 'put', os.devnull, 'X/x',
+ 'put', os.devnull, 'X/Y/y',
+ 'put', os.devnull, 'X/Y/Z/z')
+
+ svntest.main.run_svn(None, 'checkout', '-q', repo_url, wc_dir)
+ r1_status = svntest.wc.State(wc_dir, {
+ '' : Item(status=' ', wc_rev='1'),
+ 'A' : Item(status=' ', wc_rev='1'),
+ 'A/B' : Item(status=' ', wc_rev='1'),
+ 'A/B/C' : Item(status=' ', wc_rev='1'),
+ 'X' : Item(status=' ', wc_rev='1'),
+ 'X/Y' : Item(status=' ', wc_rev='1'),
+ 'X/Y/Z' : Item(status=' ', wc_rev='1'),
+ 'A/a' : Item(status=' ', wc_rev='1'),
+ 'A/B/b' : Item(status=' ', wc_rev='1'),
+ 'A/B/C/c' : Item(status=' ', wc_rev='1'),
+ 'X/x' : Item(status=' ', wc_rev='1'),
+ 'X/Y/y' : Item(status=' ', wc_rev='1'),
+ 'X/Y/Z/z' : Item(status=' ', wc_rev='1'),
+ })
+ svntest.actions.run_and_verify_status(wc_dir, r1_status)
+
+ ## r2: juggling
+ moves = [
+ ('A', 'A2'),
+ ('X', 'X2'),
+ ('A2/B/C', 'X'),
+ ('X2/Y/Z', 'A'),
+ ('A2/B', 'A/B'),
+ ('X2/Y', 'X/Y'),
+ ('A2', 'X/Y/Z'),
+ ('X2', 'A/B/C'),
+ ]
+ for src, dst in moves:
+ svntest.main.run_svn(None, 'mv', ospath(src), ospath(dst))
+ r2_status = svntest.wc.State(wc_dir, {
+ '' : Item(status=' ', wc_rev='1'),
+ 'A' : Item(status='R ', copied='+', moved_from='X/Y/Z', moved_to='X/Y/Z', wc_rev='-'),
+ 'A/B' : Item(status='A ', copied='+', moved_from='X/Y/Z/B', wc_rev='-', entry_status='R '),
+ 'A/B/C' : Item(status='R ', copied='+', moved_from='X', moved_to='X', wc_rev='-'),
+ 'A/B/C/Y' : Item(status='D ', copied='+', wc_rev='-', moved_to='X/Y'),
+ 'A/B/C/Y/y' : Item(status='D ', copied='+', wc_rev='-'),
+ 'A/B/C/Y/Z' : Item(status='D ', copied='+', wc_rev='-'),
+ 'A/B/C/Y/Z/z':Item(status='D ', copied='+', wc_rev='-'),
+ 'X' : Item(status='R ', copied='+', moved_from='A/B/C', moved_to='A/B/C', wc_rev='-'),
+ 'X/Y' : Item(status='A ', copied='+', moved_from='A/B/C/Y', wc_rev='-', entry_status='R '),
+ 'X/Y/Z' : Item(status='R ', copied='+', moved_from='A', moved_to='A', wc_rev='-'),
+ 'X/Y/Z/B' : Item(status='D ', copied='+', wc_rev='-', moved_to='A/B'),
+ 'X/Y/Z/B/b' : Item(status='D ', copied='+', wc_rev='-'),
+ 'X/Y/Z/B/C' : Item(status='D ', copied='+', wc_rev='-'),
+ 'X/Y/Z/B/C/c':Item(status='D ', copied='+', wc_rev='-'),
+ 'A/a' : Item(status='D ', wc_rev='1'),
+ 'A/B/b' : Item(status='D ', wc_rev='1'),
+ 'A/B/C/c' : Item(status='D ', copied='+', wc_rev='-'),
+ 'X/x' : Item(status='D ', wc_rev='1'),
+ 'X/Y/y' : Item(status='D ', wc_rev='1'),
+ 'X/Y/Z/z' : Item(status='D ', copied='+', wc_rev='-'),
+ 'X/c' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/z' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/b' : Item(status=' ', copied='+', wc_rev='-'),
+ 'X/Y/y' : Item(status=' ', copied='+', wc_rev='-'),
+ 'X/Y/Z/a' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/C/x' : Item(status=' ', copied='+', wc_rev='-'),
+ })
+ svntest.actions.run_and_verify_status(wc_dir, r2_status)
+
+ svntest.main.run_svn(None, 'commit', '-m', 'r2: juggle the tree', wc_dir)
+ expected_output = svntest.verify.UnorderedRegexListOutput(map(re.escape, [
+ ' R /A (from /X/Y/Z:1)',
+ ' A /A/B (from /A/B:1)',
+ ' R /A/B/C (from /X:1)',
+ ' R /X (from /A/B/C:1)',
+ ' A /X/Y (from /X/Y:1)',
+ ' R /X/Y/Z (from /A:1)',
+ ' D /X/Y/Z/B',
+ ' D /A/B/C/Y',
+ ]) + [
+ '^-', '^r2', '^-', '^Changed paths:',
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'log', '-qvr2', repo_url)
+
+ ## Test updating to r1.
+ svntest.main.run_svn(None, 'update', '-r1', wc_dir)
+ svntest.actions.run_and_verify_status(wc_dir, r1_status)
+
def setup_move_many(sbox):
"helper function which creates a wc with node A/A/A which is moved 3 times"
@@ -1309,7 +1344,7 @@ def move_many_update_delete(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# And now create a tree conflict
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.repo_url + '/B',
'-m', '')
@@ -1326,10 +1361,9 @@ def move_many_update_delete(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
expected_status)
- # Would be nice if we could run the resolver as a separate step,
+ # Would be nice if we could run the resolver as a separate step,
# but 'svn resolve' just fails for any value but working
-@XFail()
def move_many_update_add(sbox):
"move many and add-on-update"
@@ -1343,7 +1377,7 @@ def move_many_update_add(sbox):
#svntest.actions.run_and_verify_status(wc_dir, expected_status)
# And now create a tree conflict
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', sbox.repo_url + '/B/A/A/BB',
'-m', '')
@@ -1353,7 +1387,7 @@ def move_many_update_add(sbox):
'B/A/A' : Item(status=' ', treeconflict='U'),
'B/A/A/BB' : Item(status=' ', treeconflict='A'),
# And while resolving
- 'A/A/' : Item(status=' ', treeconflict='C')
+ 'A/A' : Item(status=' ', treeconflict='C')
})
expected_status.tweak('',
@@ -1369,21 +1403,28 @@ def move_many_update_add(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
wc_dir, '--accept', 'mine-conflict')
# And another one
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', sbox.repo_url + '/C/A/A/BB',
'-m', '')
expected_status.tweak('',
'B', 'B/A', 'B/A/A', 'B/A/A/A',
'C', 'C/A', 'C/A/A', 'C/A/A/A',
+ 'B/A/A/BB',
wc_rev='4')
+ expected_status.add({
+ 'C/A/A/BB' : Item(status='D ', wc_rev='4'),
+ })
+
+ expected_status.tweak('A/A/A', treeconflict='C')
+
expected_output = svntest.wc.State(wc_dir, {
+ 'A/A/A' : Item(status=' ', treeconflict='C'),
'C/A' : Item(status=' ', treeconflict='C'),
'C/A/A' : Item(status=' ', treeconflict='U'),
'C/A/A/BB' : Item(status=' ', treeconflict='A'),
@@ -1392,13 +1433,13 @@ def move_many_update_add(sbox):
# This currently triggers an assertion failure
svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
wc_dir, '--accept', 'mine-conflict')
@Issue(4437)
def move_del_moved(sbox):
"delete moved node, still a move"
+
sbox.build()
wc_dir = sbox.wc_dir
@@ -1428,7 +1469,7 @@ def copy_move_commit(sbox):
# create table bbb (Id int not null)
# - Commit
# Repro Issue 2
- # - Copy folder aaa under same parent folder (i.e. as a sibling). (using Ctrl drag/drop).
+ # - Copy folder aaa under same parent folder (i.e. as a sibling). (using Ctrl drag/drop).
# Creates Copy of aaa
# - Rename Copy of aaa to eee
# - Commit
@@ -1441,7 +1482,6 @@ def copy_move_commit(sbox):
sbox.simple_move('A/D/GG', 'A/D/GG-moved')
sbox.simple_commit('A/D/GG-moved')
-
def move_to_from_external(sbox):
"move to and from an external"
@@ -1449,87 +1489,211 @@ def move_to_from_external(sbox):
sbox.simple_propset('svn:externals', '^/A/D/G GG', '')
sbox.simple_update()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'move',
sbox.ospath('GG/tau'),
sbox.ospath('tau'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'move',
sbox.ospath('iota'),
sbox.ospath('GG/tau'))
-
- svntest.actions.run_and_verify_svn(None, None, [],
+
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'Commit both',
sbox.ospath(''),
sbox.ospath('GG'))
-
-def move_conflict_markers(sbox):
- "move conflict markers"
+
+def revert_del_root_of_move(sbox):
+ "revert delete root of move"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ sbox.simple_copy('A/mu', 'A/B/E/mu')
+ sbox.simple_copy('A/mu', 'A/B/F/mu')
+ sbox.simple_commit()
+ sbox.simple_update('', 1)
+ sbox.simple_move('A/B/E', 'E')
+ sbox.simple_rm('A/B')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B' : Item(status=' ', treeconflict='C'),
+ 'A/B/E' : Item(status=' ', treeconflict='U'),
+ 'A/B/E/mu' : Item(status=' ', treeconflict='A'),
+ 'A/B/F' : Item(status=' ', treeconflict='U'),
+ 'A/B/F/mu' : Item(status=' ', treeconflict='A'),
+ })
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.tweak('A/B', status='D ', treeconflict='C')
+ expected_status.tweak('A/B/E', status='D ', moved_to='E')
+ expected_status.tweak('A/B/F', 'A/B/lambda', 'A/B/E/alpha', 'A/B/E/beta',
+ status='D ')
+ expected_status.add({
+ 'A/B/F/mu' : Item(status='D ', wc_rev='2'),
+ 'A/B/E/mu' : Item(status='D ', wc_rev='2'),
+ 'E' : Item(status='A ', copied='+', moved_from='A/B/E', wc_rev='-'),
+ 'E/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'E/alpha' : Item(status=' ', copied='+', wc_rev='-'),
+ })
+
+ svntest.actions.run_and_verify_update(wc_dir, expected_output, None,
+ expected_status)
+
+ expected_output = [
+ "Reverted '%s'\n" % sbox.ospath('A/B'), # Reverted
+ " C %s\n" % sbox.ospath('A/B/E') # New tree conflict
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'revert', sbox.ospath('A/B'),
+ '--depth', 'empty')
+
+ expected_status.tweak('A/B', status=' ', treeconflict=None)
+ expected_status.tweak('A/B/E', treeconflict='C')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+def move_conflict_details(sbox):
+ "move conflict details"
sbox.build()
- wc_dir = sbox.wc_dir
- sbox.simple_propset('key','val', 'iota', 'A/B/E', 'A/B/E/beta')
+
+ sbox.simple_append('A/B/E/new', 'new\n')
+ sbox.simple_add('A/B/E/new')
+ sbox.simple_append('A/B/E/alpha', '\nextra\nlines\n')
+ sbox.simple_rm('A/B/E/beta', 'A/B/F')
+ sbox.simple_propset('key', 'VAL', 'A/B/E', 'A/B')
+ sbox.simple_mkdir('A/B/E/new-dir1')
+ sbox.simple_mkdir('A/B/E/new-dir2')
+ sbox.simple_mkdir('A/B/E/new-dir3')
+ sbox.simple_rm('A/B/lambda')
+ sbox.simple_mkdir('A/B/lambda')
sbox.simple_commit()
+
sbox.simple_update('', 1)
- sbox.simple_propset('key','false', 'iota', 'A/B/E', 'A/B/E/beta')
- expected_output = svntest.wc.State(wc_dir, {
- 'A/B/E' : Item(status=' C'),
- 'A/B/E/beta' : Item(status=' C'),
- 'iota' : Item(status=' C'),
- })
- expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
- expected_status.tweak('iota', 'A/B/E', 'A/B/E/beta', status=' C')
- expected_disk = svntest.main.greek_state.copy()
- expected_disk.add({
- 'A/B/E/dir_conflicts.prej' : Item(contents=
- "Trying to add new property 'key'\n"
- "but the property already exists.\n"
- "<<<<<<< (local property value)\n"
- "false=======\n"
- "val>>>>>>> (incoming property value)\n"),
- 'A/B/E/beta.prej' : Item(contents=
- "Trying to add new property 'key'\n"
- "but the property already exists.\n"
- "<<<<<<< (local property value)\n"
- "false=======\n"
- "val>>>>>>> (incoming property value)\n"),
- 'iota.prej' : Item(contents=
- "Trying to add new property 'key'\n"
- "but the property already exists.\n"
- "<<<<<<< (local property value)\n"
- "false=======\n"
- "val>>>>>>> (incoming property value)\n"),
- })
- svntest.actions.run_and_verify_update(wc_dir,
- expected_output,
- expected_disk,
- expected_status)
+ sbox.simple_move('A/B', 'B')
- sbox.simple_move('iota', 'A/iotb')
- sbox.simple_move('A/B/E', 'E')
+ sbox.simple_update('', 2)
+
+ expected_info = [
+ {
+ "Moved To": re.escape(sbox.ospath("B")),
+ "Tree conflict": re.escape(
+ 'local dir moved away, incoming dir edit upon update' +
+ ' Source left: (dir) ^/A/B@1' +
+ ' Source right: (dir) ^/A/B@2')
+ }
+ ]
+ svntest.actions.run_and_verify_info(expected_info, sbox.ospath('A/B'))
+
+ sbox.simple_propset('key', 'vAl', 'B')
+ sbox.simple_move('B/E/beta', 'beta')
+ sbox.simple_propset('a', 'b', 'B/F', 'B/lambda')
+ sbox.simple_append('B/E/alpha', 'other\nnew\nlines')
+ sbox.simple_mkdir('B/E/new')
+ sbox.simple_mkdir('B/E/new-dir1')
+ sbox.simple_append('B/E/new-dir2', 'something')
+ sbox.simple_append('B/E/new-dir3', 'something')
+ sbox.simple_add('B/E/new-dir3')
+
+
+ expected_output = [
+ " C %s\n" % sbox.ospath('B'), # Property conflicted
+ " U %s\n" % sbox.ospath('B/E'), # Just updated
+ "C %s\n" % sbox.ospath('B/E/alpha'), # Text conflicted
+ " C %s\n" % sbox.ospath('B/E/beta'),
+ " C %s\n" % sbox.ospath('B/E/new'),
+ " C %s\n" % sbox.ospath('B/E/new-dir1'),
+ " C %s\n" % sbox.ospath('B/E/new-dir2'),
+ " C %s\n" % sbox.ospath('B/E/new-dir3'),
+ " C %s\n" % sbox.ospath('B/F'),
+ " C %s\n" % sbox.ospath('B/lambda'),
+ "Updated to revision 2.\n",
+ "Resolved conflicted state of '%s'\n" % sbox.ospath('A/B')
+ ]
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'resolve', sbox.ospath('A/B'),
+ '--depth', 'empty',
+ '--accept', 'mine-conflict')
+
+ expected_info = [
+ {
+ "Path" : re.escape(sbox.ospath('B')),
+
+ "Conflict Properties File" :
+ re.escape(sbox.ospath('B/dir_conflicts.prej')) + '.*',
+ "Conflict Details": re.escape(
+ 'incoming dir edit upon update' +
+ ' Source left: (dir) ^/A/B@1' +
+ ' Source right: (dir) ^/A/B@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E')),
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/alpha')),
+ "Conflict Previous Base File" : '.*alpha.*',
+ "Conflict Previous Working File" : '.*alpha.*',
+ "Conflict Current Base File": '.*alpha.*',
+ "Conflict Details": re.escape(
+ 'incoming file edit upon update' +
+ ' Source left: (file) ^/A/B/E/alpha@1' +
+ ' Source right: (file) ^/A/B/E/alpha@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/beta')),
+ "Tree conflict": re.escape(
+ 'local file moved away, incoming file delete or move upon update' +
+ ' Source left: (file) ^/A/B/E/beta@1' +
+ ' Source right: (none) ^/A/B/E/beta@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new')),
+ "Tree conflict": re.escape(
+ 'local dir add, incoming file add upon update' +
+ ' Source left: (none) ^/A/B/E/new@1' +
+ ' Source right: (file) ^/A/B/E/new@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new-dir1')),
+ "Tree conflict": re.escape(
+ 'local dir add, incoming dir add upon update' +
+ ' Source left: (none) ^/A/B/E/new-dir1@1' +
+ ' Source right: (dir) ^/A/B/E/new-dir1@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new-dir2')),
+ "Tree conflict": re.escape(
+ 'local file unversioned, incoming dir add upon update' +
+ ' Source left: (none) ^/A/B/E/new-dir2@1' +
+ ' Source right: (dir) ^/A/B/E/new-dir2@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/E/new-dir3')),
+ "Tree conflict": re.escape(
+ 'local file add, incoming dir add upon update' +
+ ' Source left: (none) ^/A/B/E/new-dir3@1' +
+ ' Source right: (dir) ^/A/B/E/new-dir3@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/F')),
+ "Tree conflict": re.escape(
+ 'local dir edit, incoming dir delete or move upon update' +
+ ' Source left: (dir) ^/A/B/F@1' +
+ ' Source right: (none) ^/A/B/F@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('B/lambda')),
+ "Tree conflict": re.escape(
+ 'local file edit, incoming replace with dir upon update' +
+ ' Source left: (file) ^/A/B/lambda@1' +
+ ' Source right: (dir) ^/A/B/lambda@2')
+ },
+ ]
+
+ svntest.actions.run_and_verify_info(expected_info, sbox.ospath('B'),
+ '--depth', 'infinity')
- expected_status.tweak('iota', status='D ', moved_to='A/iotb')
- expected_status.tweak('A/B/E', status='D ', moved_to='E')
- expected_status.tweak('A/B/E/alpha', 'A/B/E/beta', status='D ')
- expected_status.add({
- 'A/iotb' : Item(status='A ', copied='+', moved_from='iota', wc_rev='-'),
- 'E' : Item(status='A ', copied='+', moved_from='A/B/E', wc_rev='-'),
- 'E/beta' : Item(status=' M', copied='+', wc_rev='-'),
- 'E/alpha' : Item(status=' ', copied='+', wc_rev='-'),
- })
- expected_disk.remove('iota', 'iota.prej',
- 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
- 'A/B/E/dir_conflicts.prej',
- 'A/B/E/beta.prej')
- expected_disk.add({
- 'A/iotb' : Item(contents="This is the file 'iota'.\n"),
- 'E/beta' : Item(contents="This is the file 'beta'.\n"),
- 'E/alpha' : Item(contents="This is the file 'alpha'.\n"),
- })
- svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.verify_disk(wc_dir, expected_disk)
#######################################################################
# Run the tests
@@ -1542,12 +1706,14 @@ test_list = [ None,
deeper_move_file_test,
property_merge,
move_missing,
+ nested_replaces,
move_many_update_delete,
move_many_update_add,
move_del_moved,
copy_move_commit,
move_to_from_external,
- move_conflict_markers,
+ revert_del_root_of_move,
+ move_conflict_details,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/patch_tests.py b/subversion/tests/cmdline/patch_tests.py
index b17da63..8e16adc 100755
--- a/subversion/tests/cmdline/patch_tests.py
+++ b/subversion/tests/cmdline/patch_tests.py
@@ -102,7 +102,7 @@ def patch(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -377,7 +377,7 @@ def patch_offset(sbox):
expected_status.tweak('A/mu', wc_rev=2)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -546,7 +546,7 @@ def patch_chopped_leading_spaces(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -716,7 +716,7 @@ def patch_strip1(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -869,7 +869,7 @@ def patch_no_index_line(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/gamma', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
unidiff_patch = [
"--- A/D/gamma\t(revision 1)\n",
"+++ A/D/gamma\t(working copy)\n",
@@ -1079,9 +1079,9 @@ def patch_remove_empty_dirs(sbox):
svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
F_path = sbox.ospath('A/B/F')
- svntest.actions.run_and_verify_svn("Deleting F failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', F_path)
- svntest.actions.run_and_verify_svn("Update failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# We should be able to handle one path beeing missing.
@@ -1148,7 +1148,7 @@ def patch_reject(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/gamma', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
patch_file_path = make_patch_path(sbox)
@@ -1219,7 +1219,7 @@ def patch_keywords(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/gamma', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
patch_file_path = make_patch_path(sbox)
@@ -1308,7 +1308,7 @@ def patch_with_fuzz(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
unidiff_patch = [
"Index: mu\n",
@@ -1444,7 +1444,7 @@ def patch_reverse(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -1673,7 +1673,7 @@ def patch_no_svn_eol_style(sbox):
1) # dry-run
expected_output = ["Reverted '" + mu_path + "'\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'revert', '-R', wc_dir)
def patch_with_svn_eol_style(sbox):
"patch target with svn:eol-style"
@@ -1788,7 +1788,7 @@ def patch_with_svn_eol_style(sbox):
1) # dry-run
expected_output = ["Reverted '" + mu_path + "'\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'revert', '-R', wc_dir)
def patch_with_svn_eol_style_uncommitted(sbox):
"patch target with uncommitted svn:eol-style"
@@ -1897,7 +1897,7 @@ def patch_with_svn_eol_style_uncommitted(sbox):
1) # dry-run
expected_output = ["Reverted '" + mu_path + "'\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'revert', '-R', wc_dir)
def patch_with_ignore_whitespace(sbox):
"ignore whitespace when patching"
@@ -1943,7 +1943,7 @@ def patch_with_ignore_whitespace(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch with leading and trailing spaces removed and tabs transformed
# to spaces. The patch should match and the hunks should be written to the
@@ -2077,7 +2077,7 @@ def patch_replace_locally_deleted_file(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Locally delete mu
svntest.main.run_svn(None, 'rm', mu_path)
@@ -2143,7 +2143,7 @@ def patch_no_eol_at_eof(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
unidiff_patch = [
"--- iota\t(revision 1)\n",
"+++ iota\t(working copy)\n",
@@ -2213,7 +2213,7 @@ def patch_with_properties(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
unidiff_patch = [
@@ -2306,7 +2306,7 @@ def patch_same_twice(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -2491,7 +2491,7 @@ def patch_dir_properties(sbox):
expected_status.tweak('', wc_rev=2)
expected_status.tweak('A/B', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
unidiff_patch = [
@@ -2713,7 +2713,7 @@ def patch_prop_offset(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -2888,7 +2888,7 @@ def patch_prop_with_fuzz(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
unidiff_patch = [
"Index: mu\n",
@@ -3072,7 +3072,7 @@ def patch_old_target_names(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -3198,7 +3198,7 @@ def patch_reverse_revert(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
@@ -3520,7 +3520,7 @@ def patch_moved_away(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Move mu away
sbox.simple_move("A/mu", "A/mu2")
@@ -3681,7 +3681,7 @@ def patch_deletes_prop(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Apply patch
unidiff_patch = [
@@ -3828,7 +3828,7 @@ def patch_reversed_add_with_props2(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({'newfile' : Item(wc_rev=2, status=' ')})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now, we'll try to reverse-apply the very diff we just created. We
# expect the original state of the working copy in r1 plus 'newfile'
@@ -4019,7 +4019,7 @@ def patch_target_no_eol_at_eof(sbox):
expected_status.tweak('iota', wc_rev=2)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
unidiff_patch = [
"Index: A/mu\n",
"===================================================================\n",
@@ -4222,22 +4222,20 @@ def patch_change_symlink_target(sbox):
expected_output = svntest.wc.State(wc_dir, {
'link' : Item(verb='Adding'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
patch_output = [
'U %s\n' % sbox.ospath('link'),
]
- svntest.actions.run_and_verify_svn(None, patch_output, [],
+ svntest.actions.run_and_verify_svn(patch_output, [],
'patch', patch_file_path, wc_dir)
# r3 - Store result
expected_output = svntest.wc.State(wc_dir, {
'link' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# r4 - Now as symlink
sbox.simple_rm('link')
@@ -4245,10 +4243,9 @@ def patch_change_symlink_target(sbox):
expected_output = svntest.wc.State(wc_dir, {
'link' : Item(verb='Replacing'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
- svntest.actions.run_and_verify_svn(None, patch_output, [],
+ svntest.actions.run_and_verify_svn(patch_output, [],
'patch', patch_file_path, wc_dir)
# TODO: when it passes, verify that the on-disk 'link' is correct ---
@@ -4357,7 +4354,7 @@ def patch_replace_dir_with_file_and_vv(sbox):
'A %s\n' % sbox.ospath('iota'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'patch', patch_file_path, sbox.wc_dir)
@Issue(4297)
@@ -4391,7 +4388,7 @@ def single_line_mismatch(sbox):
'> rejected hunk @@ -1,1 +1,1 @@\n',
] + svntest.main.summary_of_conflicts(text_conflicts=1)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'patch', patch_file_path, wc_dir)
@Issue(3644)
@@ -4442,7 +4439,7 @@ def patch_empty_file(sbox):
]
# Current result: lf.txt patched ok, new created, empty succeeds with offset.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'patch', patch_file_path, wc_dir)
expected_disk = svntest.main.greek_state.copy()
@@ -4556,7 +4553,7 @@ def patch_apply_no_fuz(sbox):
]
# Current result: lf.txt patched ok, new created, empty succeeds with offset.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'patch', patch_path, wc_dir)
if not filecmp.cmp(sbox.ospath('test.txt'), sbox.ospath('test_v2.txt')):
@@ -4657,8 +4654,38 @@ def patch_with_custom_keywords(sbox):
expected_output, expected_disk,
expected_status, expected_skip)
+def patch_git_rename(sbox):
+ """--git patch with rename header"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # a simple --git rename patch
+ unidiff_patch = [
+ "diff --git a/iota b/iota2\n",
+ "similarity index 100%\n",
+ "rename from iota\n",
+ "rename to iota2\n",
+ ]
+
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ expected_output = [ 'A %s\n' % sbox.ospath('iota2'),
+ 'D %s\n' % sbox.ospath('iota')]
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.remove('iota')
+ expected_disk.add({'iota2' : Item(contents="This is the file 'iota'.\n")})
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'iota2' : Item(status='A ', copied='+', wc_rev='-', moved_from='iota'),
+ })
+ expected_status.tweak('iota', status='D ', wc_rev=1, moved_to='iota2')
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
-@XFail()
@Issue(4533)
def patch_hunk_avoid_reorder(sbox):
"""avoid reordering hunks"""
@@ -4787,6 +4814,27 @@ def patch_hunk_avoid_reorder(sbox):
sbox.simple_revert('A/mu')
+@Issue(4533)
+def patch_hunk_avoid_reorder2(sbox):
+ """avoid reordering hunks 2"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('A/mu',
+ 'AA\n' 'BB\n' 'CC\n' 'DD\n' 'EE\n' 'FF\n'
+ 'TT\n' 'UU\n' 'VV\n' 'WW\n' 'XX\n' 'YY\n'
+ 'GG\n' 'HH\n' 'II\n' 'JJ\n' 'KK\n' 'LL\n'
+ '33333\n' '33333\n' '33333\n'
+ '33333\n' '33333\n' '33333\n'
+ '33333\n' '33333\n' '33333\n'
+ '33333\n' '33333\n' '33333\n'
+ 'MM\n' 'NN\n' 'OO\n' 'PP\n' 'QQ\n' 'RR\n'
+ 'SS\n' 'TT\n' 'UU\n' 'VV\n' 'WW\n' 'XX\n'
+ 'YY\n' 'ZZ\n', truncate=True)
+ sbox.simple_commit()
+
+ # two hunks, first matches at offset +18, second matches at both -13
# change patch so second hunk matches at both -12 and +19, we still
# want the second match
unidiff_patch = [
@@ -4895,6 +4943,500 @@ def patch_hunk_reorder(sbox):
expected_output, expected_disk,
expected_status, expected_skip)
+ # In the following case the reordered hunk2 is smaller offset
+ # magnitude than hunk2 at the end and the reorder is preferred.
+ sbox.simple_revert('A/mu')
+ sbox.simple_append('A/mu',
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 100 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n',
+ truncate=True)
+ sbox.simple_commit()
+
+ unidiff_patch = [
+ "Index: A/mu\n"
+ "===================================================================\n",
+ "--- A/mu\t(revision 2)\n",
+ "+++ A/mu\t(working copy)\n",
+ "@@ -28,7 +28,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk1\n",
+ "+hunk1-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ "@@ -44,7 +44,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk2\n",
+ "+hunk2-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ ]
+
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ expected_output = [
+ 'U %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -44,7 +44,7 @@ with offset -32\n',
+ '> applied hunk @@ -28,7 +28,7 @@ with offset 1\n',
+ ]
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 100 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n')
+
+ expected_status.tweak('A/mu', status='M ', wc_rev=3)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+ sbox.simple_revert('A/mu')
+
+ # In this case the reordered hunk2 is further than hunk2 at the end
+ # and the reordered is not preferred.
+ unidiff_patch = [
+ "Index: A/mu\n"
+ "===================================================================\n",
+ "--- A/mu\t(revision 2)\n",
+ "+++ A/mu\t(working copy)\n",
+ "@@ -28,7 +28,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk1\n",
+ "+hunk1-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ "@@ -110,7 +110,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk2\n",
+ "+hunk2-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ ]
+
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ expected_output = [
+ 'U %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -28,7 +28,7 @@ with offset 1\n',
+ '> applied hunk @@ -110,7 +110,7 @@ with offset 26\n',
+ ]
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 2 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 100 +
+ '1\n' '2\n' '3\n' 'hunk2-mod\n' '4\n' '5\n' '6\n')
+
+ expected_status.tweak('A/mu', status='M ', wc_rev=3)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+@XFail()
+def patch_hunk_overlap(sbox):
+ """hunks that overlap"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('A/mu',
+ 'AA\n' 'BB\n' 'CC\n' 'DD\n' 'EE\n' 'FF\n'
+ 'GG\n' 'HH\n' 'II\n', truncate=True)
+ sbox.simple_commit()
+
+ # Two hunks that overlap when applied, GNU patch can apply both hunks.
+ unidiff_patch = [
+ "Index: A/mu\n"
+ "===================================================================\n",
+ "--- A/mu\t(revision 1)\n",
+ "+++ A/mu\t(working copy)\n",
+ "@@ -2,6 +2,7 @@\n",
+ " BB\n",
+ " CC\n",
+ " DD\n",
+ "+11111\n",
+ " EE\n",
+ " FF\n",
+ " GG\n",
+ "@@ -9,6 +10,7 @@\n",
+ " DD\n",
+ " EE\n",
+ " FF\n",
+ "+22222\n",
+ " GG\n",
+ " HH\n",
+ " II\n",
+ ]
+
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ expected_output = [
+ 'U %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -9,6 +10,7 @@ with offset -5\n',
+ ]
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak('A/mu', contents=
+ 'AA\n' 'BB\n' 'CC\n' 'DD\n' '11111\n' 'EE\n' 'FF\n'
+ '22222\n' 'GG\n' 'HH\n' 'II\n')
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=2)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+def patch_delete_modified(sbox):
+ """patch delete modified"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # A patch that deletes beta.
+ unidiff_patch = [
+ "Index: A/B/E/beta\n",
+ "===================================================================\n",
+ "--- A/B/E/beta (revision 1)\n",
+ "+++ A/B/E/beta (working copy)\n",
+ "@@ -1 +0,0 @@\n",
+ "-This is the file 'beta'.\n",
+ ]
+
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ # First application deletes beta
+ expected_output = [
+ 'D %s\n' % sbox.ospath('A/B/E/beta'),
+ ]
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.remove('A/B/E/beta')
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/B/E/beta', status='D ')
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Second application skips
+ expected_output = [
+ 'Skipped \'%s\'\n' % sbox.ospath('A/B/E/beta'),
+ ] + svntest.main.summary_of_conflicts(skipped_paths=1)
+ expected_skip = wc.State('', {
+ sbox.ospath('A/B/E/beta') : Item(verb='Skipped'),
+ })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Third application, with file present even though state is 'D', also skips
+ sbox.simple_append('A/B/E/beta', 'Modified', truncate=True)
+ expected_disk.add({'A/B/E/beta' : Item(contents='Modified')})
+ expected_output = [
+ 'Skipped \'%s\'\n' % sbox.ospath('A/B/E/beta'),
+ ] + svntest.main.summary_of_conflicts(skipped_paths=1)
+ expected_skip = wc.State('', {
+ sbox.ospath('A/B/E/beta') : Item(verb='Skipped'),
+ })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Revert and modify beta, fourth application gives a text conflict.
+ sbox.simple_revert('A/B/E/beta')
+ sbox.simple_append('A/B/E/beta', 'Modified', truncate=True)
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/B/E/beta'),
+ '> rejected hunk @@ -1,1 +0,0 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_skip = wc.State('', { })
+ reject_file_contents = [
+ "--- A/B/E/beta\n",
+ "+++ A/B/E/beta\n",
+ "@@ -1,1 +0,0 @@\n",
+ "-This is the file 'beta'.\n",
+ ]
+ expected_disk.add({'A/B/E/beta.svnpatch.rej'
+ : Item(contents=''.join(reject_file_contents))
+ })
+ expected_status.tweak('A/B/E/beta', status='M ')
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+def patch_closest(sbox):
+ "find closest hunk"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ unidiff_patch = [
+ "Index: A/mu\n"
+ "===================================================================\n",
+ "--- A/mu\t(revision 2)\n",
+ "+++ A/mu\t(working copy)\n",
+ "@@ -47,7 +47,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk1\n",
+ "+hunk1-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ "@@ -66,7 +66,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-rejected-hunk2-\n",
+ "+rejected-hunk2-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ "@@ -180,7 +180,7 @@\n",
+ " 1\n",
+ " 2\n",
+ " 3\n",
+ "-hunk3\n",
+ "+hunk3-mod\n",
+ " 4\n",
+ " 5\n",
+ " 6\n",
+ ]
+ patch_file_path = make_patch_path(sbox)
+ svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+ # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+ # of -19 and +18, prefer +18 gives final offset +22
+ sbox.simple_append('A/mu',
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 30 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10,
+ truncate=True)
+ sbox.simple_commit()
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+ '> applied hunk @@ -180,7 +180,7 @@ with offset 22\n',
+ '> rejected hunk @@ -66,7 +66,7 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.add({'A/mu.svnpatch.rej' : Item(contents=
+ "--- A/mu\n" +
+ "+++ A/mu\n" +
+ "@@ -66,7 +66,7 @@\n" +
+ " 1\n" +
+ " 2\n" +
+ " 3\n" +
+ "-rejected-hunk2-\n" +
+ "+rejected-hunk2-mod\n" +
+ " 4\n" +
+ " 5\n" +
+ " 6\n")})
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 30 +
+ '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10)
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=2)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+ # of -19 and +20, prefer -19 gives final offset -15
+ sbox.simple_append('A/mu',
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 32 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10,
+ truncate=True)
+ sbox.simple_commit()
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+ '> applied hunk @@ -180,7 +180,7 @@ with offset -15\n',
+ '> rejected hunk @@ -66,7 +66,7 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 32 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10)
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=3)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+ # of -19 and +19, prefer -19 gives final offset -15
+ sbox.simple_append('A/mu',
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 31 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10,
+ truncate=True)
+ sbox.simple_commit()
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+ '> applied hunk @@ -180,7 +180,7 @@ with offset -15\n',
+ '> rejected hunk @@ -66,7 +66,7 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 31 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10)
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=4)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+ # of +173 and -173, prefer +173 gives final offset +177
+ sbox.simple_append('A/mu',
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 33 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 242 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10,
+ truncate=True)
+ sbox.simple_commit()
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+ '> applied hunk @@ -180,7 +180,7 @@ with offset 177\n',
+ '> rejected hunk @@ -66,7 +66,7 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 33 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 242 +
+ '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10)
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=5)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
+ # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+ # of +174 and -173, prefer -173 gives final offset -169
+ sbox.simple_append('A/mu',
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 33 +
+ '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 243 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10,
+ truncate=True)
+ sbox.simple_commit()
+
+ expected_output = [
+ 'C %s\n' % sbox.ospath('A/mu'),
+ '> applied hunk @@ -180,7 +180,7 @@ with offset -169\n',
+ '> applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+ '> rejected hunk @@ -66,7 +66,7 @@\n',
+ ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+ expected_disk.tweak('A/mu', contents=
+ 'x\n' * 10 +
+ '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 33 +
+ '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 50 +
+ '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 243 +
+ '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+ 'x\n' * 10)
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', wc_rev=6)
+ expected_skip = wc.State('', { })
+ svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+ expected_output, expected_disk,
+ expected_status, expected_skip)
+
########################################################################
#Run the tests
@@ -4947,8 +5489,13 @@ test_list = [ None,
patch_apply_no_fuz,
patch_lacking_trailing_eol_on_context,
patch_with_custom_keywords,
+ patch_git_rename,
patch_hunk_avoid_reorder,
+ patch_hunk_avoid_reorder2,
patch_hunk_reorder,
+ patch_hunk_overlap,
+ patch_delete_modified,
+ patch_closest,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/prop_tests.py b/subversion/tests/cmdline/prop_tests.py
index e3f963e..0d8d89b 100755
--- a/subversion/tests/cmdline/prop_tests.py
+++ b/subversion/tests/cmdline/prop_tests.py
@@ -100,8 +100,7 @@ def make_local_props(sbox):
# Edit without actually changing the property
svntest.main.use_editor('identity')
- svntest.actions.run_and_verify_svn(None,
- "No changes to property 'editme' on '.*'",
+ svntest.actions.run_and_verify_svn("No changes to property 'editme' on '.*'",
[],
'propedit', 'editme',
os.path.join(wc_dir, 'A', 'mu'))
@@ -134,9 +133,7 @@ def commit_props(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
@@ -170,16 +167,14 @@ def update_props(sbox):
# Commit property mods
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Add more properties
sbox.simple_propset('blue2', 'azul2', 'A/mu')
sbox.simple_propset('red2', 'rojo2', 'A/D/H')
expected_status.tweak('A/mu', 'A/D/H', wc_rev=3, status=' ')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = svntest.wc.State(wc_backup, {
@@ -202,7 +197,7 @@ def update_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1,
+ [], 1,
'-r', '2', wc_backup)
# This adds properties to nodes that have properties
@@ -215,7 +210,7 @@ def update_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1,
+ [], 1,
'-r', '3', wc_backup)
@@ -244,8 +239,7 @@ def downdate_props(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Make some mod (something to commit)
svntest.main.file_append(mu_path, "some mod")
@@ -262,8 +256,7 @@ def downdate_props(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected output tree for an update.
expected_output = svntest.wc.State(wc_dir, {
@@ -282,7 +275,7 @@ def downdate_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1,
+ [], 1,
'-r', '1', wc_dir)
#----------------------------------------------------------------------
@@ -314,8 +307,7 @@ def remove_props(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -363,14 +355,8 @@ def update_conflict_props(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files,
- None, None, 1)
-
- if len(extra_files) != 0:
- logger.warn("didn't get expected conflict files")
- raise svntest.verify.SVNUnexpectedOutput
+ check_props=True,
+ extra_files=extra_files)
# Resolve the conflicts
svntest.actions.run_and_verify_resolved([mu_path, A_path])
@@ -405,8 +391,7 @@ def commit_conflict_dirprops(sbox):
sbox.simple_propset('foo', 'eek', '')
svntest.actions.run_and_verify_commit(wc_dir, None, None,
- "[oO]ut[- ]of[- ]date",
- wc_dir)
+ ".*[oO]ut[- ]of[- ]date.*")
#----------------------------------------------------------------------
@@ -465,8 +450,7 @@ def commit_replacement_props(sbox):
expected_status.tweak('A/B/lambda', wc_rev=3, status=' ')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -530,8 +514,7 @@ def revert_replacement_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- 1)
+ check_props=True)
#----------------------------------------------------------------------
@Issues(920,2065)
@@ -550,51 +533,50 @@ def inappropriate_props(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# These should produce an error
- svntest.actions.run_and_verify_svn('Illegal target',
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'propset', 'svn:executable', 'on', A_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:keywords', 'LastChangedDate',
A_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:eol-style', 'native', A_path)
- svntest.actions.run_and_verify_svn('Invalid svn:eol-style', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:eol-style', 'invalid value',
os.path.join(A_path, 'mu'))
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:mime-type', 'image/png', A_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:ignore', '*.o', iota_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:externals',
'foo http://host.com/repos', iota_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:author', 'socrates', iota_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:log', 'log message', iota_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:date', 'Tue Jan 19 04:14:07 2038',
iota_path)
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput, 'propset',
'svn:original-date',
'Thu Jan 1 01:00:00 1970', iota_path)
@@ -603,7 +585,7 @@ def inappropriate_props(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Recursive setting of inappropriate dir prop should work on files
- svntest.actions.run_and_verify_svn(None, None, [], 'propset', '-R',
+ svntest.actions.run_and_verify_svn(None, [], 'propset', '-R',
'svn:executable', 'on', E_path)
expected_status.tweak('A/B/E/alpha', 'A/B/E/beta', status=' M')
@@ -620,7 +602,7 @@ def inappropriate_props(sbox):
'propset', 'svn:mime-type', 'application/octet-stream',
sbox.ospath('binary'))
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput,
'propset', 'svn:eol-style',
'CRLF', path)
@@ -629,7 +611,7 @@ def inappropriate_props(sbox):
svntest.main.file_append(path, "line1\rline2\n")
sbox.simple_add('multi-eol')
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput,
'propset', 'svn:eol-style',
'LF', path)
@@ -638,7 +620,7 @@ def inappropriate_props(sbox):
svntest.main.file_append(path, "line1\n\r")
sbox.simple_add('backwards-eol')
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput,
'propset', 'svn:eol-style',
'native', path)
@@ -647,7 +629,7 @@ def inappropriate_props(sbox):
svntest.main.file_append(path, "line1\r\n\r")
sbox.simple_add('incomplete-eol')
- svntest.actions.run_and_verify_svn('Illegal target', None,
+ svntest.actions.run_and_verify_svn(None,
svntest.verify.AnyOutput,
'propset', 'svn:eol-style',
'CR', path)
@@ -657,25 +639,25 @@ def inappropriate_props(sbox):
path = sbox.ospath('binary')
svntest.main.file_append(path, "binary")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--force',
'svn:eol-style', 'CRLF',
path)
path = sbox.ospath('multi-eol')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--force',
'svn:eol-style', 'LF',
path)
path = sbox.ospath('backwards-eol')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--force',
'svn:eol-style', 'native',
path)
path = sbox.ospath('incomplete-eol')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--force',
'svn:eol-style', 'CR',
path)
@@ -684,18 +666,18 @@ def inappropriate_props(sbox):
path = sbox.ospath('A/D')
# ...grammatically incorrect
- svntest.actions.run_and_verify_svn('illegal grammar', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Pathname not terminated by ':'\n",
'propset', SVN_PROP_MERGEINFO, '/trunk',
path)
- svntest.actions.run_and_verify_svn('illegal grammar', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200022: Invalid revision number found "
"parsing 'one'\n",
'propset', SVN_PROP_MERGEINFO,
'/trunk:one', path)
# ...contain overlapping revision ranges of differing inheritability.
- svntest.actions.run_and_verify_svn('overlapping ranges', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Unable to parse overlapping "
"revision ranges '9-20\\*' and "
"'18-22' with different "
@@ -703,7 +685,7 @@ def inappropriate_props(sbox):
'propset', SVN_PROP_MERGEINFO,
'/branch:5-7,9-20*,18-22', path)
- svntest.actions.run_and_verify_svn('overlapping ranges', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Unable to parse overlapping "
"revision ranges "
"(('3' and '3\\*')|('3\\*' and '3')) "
@@ -714,21 +696,21 @@ def inappropriate_props(sbox):
# ...contain revision ranges with start revisions greater than or
# equal to end revisions.
- svntest.actions.run_and_verify_svn('range start >= range end', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Unable to parse reversed "
"revision range '20-5'\n",
'propset', SVN_PROP_MERGEINFO,
'/featureX:4,20-5', path)
# ...contain paths mapped to empty revision ranges
- svntest.actions.run_and_verify_svn('empty ranges', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Mergeinfo for '/trunk' maps to "
"an empty revision range\n",
'propset', SVN_PROP_MERGEINFO,
'/trunk:', path)
# ...contain non-inheritable ranges when the target is a file.
- svntest.actions.run_and_verify_svn('empty ranges', None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200020: Cannot set non-inheritable "
"mergeinfo on a non-directory*",
'propset', SVN_PROP_MERGEINFO,
@@ -808,54 +790,49 @@ def copy_inherits_special_props(sbox):
# non-Posix platforms, we won't have to skip here:
@Skip(is_non_posix_and_non_windows_os)
@Issue(3086)
-@XFail(svntest.main.is_ra_type_dav)
def revprop_change(sbox):
"set, get, and delete a revprop change"
sbox.build()
# First test the error when no revprop-change hook exists.
- svntest.actions.run_and_verify_svn(None, None, '.*pre-revprop-change',
+ svntest.actions.run_and_verify_svn(None, '.*pre-revprop-change',
'propset', '--revprop', '-r', '0',
'cash-sound', 'cha-ching!', sbox.wc_dir)
# Now test error output from revprop-change hook.
svntest.actions.disable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, '.*pre-revprop-change.* 0 jrandom cash-sound A',
+ svntest.actions.run_and_verify_svn(None, '.*pre-revprop-change.* 0 jrandom cash-sound A',
'propset', '--revprop', '-r', '0',
'cash-sound', 'cha-ching!', sbox.wc_dir)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--revprop', '-r', '0',
'cash-sound', 'cha-ching!', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propget', '--revprop', '-r', '0',
'cash-sound', sbox.wc_dir)
# Now test that blocking the revprop delete.
svntest.actions.disable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, '.*pre-revprop-change.* 0 jrandom cash-sound D',
+ svntest.actions.run_and_verify_svn(None, '.*pre-revprop-change.* 0 jrandom cash-sound D',
'propdel', '--revprop', '-r', '0',
'cash-sound', sbox.wc_dir)
# Now test actually deleting the revprop.
svntest.actions.enable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', '--revprop', '-r', '0',
'cash-sound', sbox.wc_dir)
- actual_exit, actual_stdout, actual_stderr = svntest.main.run_svn(
- None, 'pg', '--revprop', '-r', '0', 'cash-sound', sbox.wc_dir)
-
# The property should have been deleted.
- regex = 'cha-ching'
- for line in actual_stdout:
- if re.match(regex, line):
- raise svntest.Failure
+ svntest.actions.run_and_verify_svn(None,
+ '.*(E195011|E200017).*cash-sound.*',
+ 'propget', '--revprop', '-r', '0', 'cash-sound', sbox.wc_dir)
#----------------------------------------------------------------------
@@ -910,7 +887,7 @@ def prop_value_conversions(sbox):
svntest.actions.set_prop('some-prop', 'bar\n', iota_path)
# NOTE: When writing out multi-line prop values in svn:* props, the
- # client converts to local encoding and local eoln style.
+ # client converts to local encoding and local eol style.
# Therefore, the expected output must contain the right kind of eoln
# strings. That's why we use os.linesep in the tests below, not just
# plain '\n'. The _last_ \n is also from the client, but it's not
@@ -1008,9 +985,7 @@ def binary_props(sbox):
# Commit the propsets.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Create expected output, disk, and status trees for an update of
# the wc_backup.
@@ -1028,8 +1003,7 @@ def binary_props(sbox):
svntest.actions.run_and_verify_update(wc_backup,
expected_output,
expected_disk,
- expected_status,
- None, None, None, None, None, 0)
+ expected_status)
# Now, check those properties.
svntest.actions.check_prop('prop_zb', B_path_bak, [prop_zb])
@@ -1121,7 +1095,7 @@ def recursive_base_wc_ops(sbox):
})
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '-R', 'svn:keywords', 'Date',
os.path.join(wc_dir, 'A', 'B'))
expected_status.tweak('A/B/lambda', 'A/B/E/alpha', 'A/B/E/beta', status=' M')
@@ -1159,9 +1133,9 @@ def url_props_ops(sbox):
sbox.simple_commit()
# Test propget
- svntest.actions.run_and_verify_svn(None, [ propval1 + '\n' ], [],
+ svntest.actions.run_and_verify_svn([ propval1 + '\n' ], [],
'propget', prop1, iota_url)
- svntest.actions.run_and_verify_svn(None, [ propval1 + '\n' ], [],
+ svntest.actions.run_and_verify_svn([ propval1 + '\n' ], [],
'propget', prop1, A_url)
# Test normal proplist
@@ -1197,15 +1171,14 @@ def url_props_ops(sbox):
'propedit', prop1, '-m', 'editlog', iota_url)
svntest.main.run_svn(None,
'propedit', prop1, '-m', 'editlog', A_url)
- svntest.actions.run_and_verify_svn(None, [ propval1 + '\n' ], [],
+ svntest.actions.run_and_verify_svn([ propval1 + '\n' ], [],
'propget', prop1, iota_url)
- svntest.actions.run_and_verify_svn(None, [ propval1 + '\n' ], [],
+ svntest.actions.run_and_verify_svn([ propval1 + '\n' ], [],
'propget', prop1, A_url)
# Edit without actually changing the property
svntest.main.use_editor('identity')
- svntest.actions.run_and_verify_svn(None,
- "No changes to property '%s' on '.*'"
+ svntest.actions.run_and_verify_svn("No changes to property '%s' on '.*'"
% prop1,
[],
'propedit', prop1, '-m', 'nocommit',
@@ -1233,20 +1206,20 @@ def removal_schedule_added_props(sbox):
# create new fs file
open(newfile_path, 'w').close()
# Add it and set a property
- svntest.actions.run_and_verify_svn(None, file_add_output, [], 'add', newfile_path)
- svntest.actions.run_and_verify_svn(None, propset_output, [], 'propset',
+ svntest.actions.run_and_verify_svn(file_add_output, [], 'add', newfile_path)
+ svntest.actions.run_and_verify_svn(propset_output, [], 'propset',
'newprop', 'newvalue', newfile_path)
- svntest.actions.run_and_verify_svn(None, propls_output, [],
+ svntest.actions.run_and_verify_svn(propls_output, [],
'proplist', '-v', newfile_path)
# remove the file
- svntest.actions.run_and_verify_svn(None, file_rm_output, [],
+ svntest.actions.run_and_verify_svn(file_rm_output, [],
'rm', '--force', newfile_path)
# recreate the file and add it again
open(newfile_path, 'w').close()
- svntest.actions.run_and_verify_svn(None, file_add_output, [], 'add', newfile_path)
+ svntest.actions.run_and_verify_svn(file_add_output, [], 'add', newfile_path)
# Now there should be NO properties leftover...
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'proplist', '-v', newfile_path)
#----------------------------------------------------------------------
@@ -1276,8 +1249,7 @@ def update_props_on_wc_root(sbox):
# Commit the working copy
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = svntest.wc.State(wc_backup, {
@@ -1297,7 +1269,7 @@ def update_props_on_wc_root(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1)
+ check_props=True)
# test for issue 2743
@Issue(2743)
@@ -1449,23 +1421,23 @@ def invalid_propnames(sbox):
expected_stdout = (".*Attempting to delete nonexistent property "
"'%s'.*" % (propname,))
- svntest.actions.run_and_verify_svn(None, expected_stdout, [],
+ svntest.actions.run_and_verify_svn(expected_stdout, [],
'propdel', propname)
expected_stderr = (".*'%s' is not a valid Subversion"
' property name' % (propname,))
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'propedit', propname)
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'propget', propname)
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'propset', propname, propval)
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'commit', '--with-revprop',
'='.join([propname, propval]))
# Now swap them: --with-revprop should accept propname as a property
# value; no concept of validity there.
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'commit', '--with-revprop',
'='.join([propval, propname]))
@@ -1486,15 +1458,15 @@ def perms_on_symlink(sbox):
saved_cwd = os.getcwd()
os.chdir(sbox.wc_dir)
try:
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', 'newdir')
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', 'newdir')
os.symlink('newdir', 'symlink')
- svntest.actions.run_and_verify_svn(None, None, [], 'add', 'symlink')
+ svntest.actions.run_and_verify_svn(None, [], 'add', 'symlink')
old_mode = os.stat('newdir')[stat.ST_MODE]
# The only property on 'symlink' is svn:special, so attempting to remove
# 'svn:executable' should result in an error
expected_stdout = (".*Attempting to delete nonexistent property "
"'svn:executable'.*")
- svntest.actions.run_and_verify_svn(None, expected_stdout, [], 'propdel',
+ svntest.actions.run_and_verify_svn(expected_stdout, [], 'propdel',
'svn:executable', 'symlink')
new_mode = os.stat('newdir')[stat.ST_MODE]
if not old_mode == new_mode:
@@ -1535,8 +1507,7 @@ def remove_custom_ns_props(sbox):
# Commit the one file.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected trees for the update.
expected_output = svntest.wc.State(wc_backup, {
@@ -1551,7 +1522,7 @@ def remove_custom_ns_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1)
+ check_props=True)
def props_over_time(sbox):
"property retrieval with peg and operative revs"
@@ -1606,12 +1577,13 @@ def props_over_time(sbox):
pget_expected = expected
if pget_expected:
pget_expected = [ pget_expected + "\n" ]
+ expected_err = [] if expected else '.*W200017: Property.*not found.*'
if op_rev != 0:
- svntest.actions.run_and_verify_svn(None, pget_expected, [],
+ svntest.actions.run_and_verify_svn(pget_expected, expected_err,
'propget', 'revision', peg_path,
'-r', str(op_rev))
else:
- svntest.actions.run_and_verify_svn(None, pget_expected, [],
+ svntest.actions.run_and_verify_svn(pget_expected, expected_err,
'propget', 'revision', peg_path)
### Test 'svn proplist -v'
@@ -1624,17 +1596,16 @@ def props_over_time(sbox):
" " + expected + "\n" ]
if op_rev != 0:
- svntest.actions.run_and_verify_svn(None, plist_expected, [],
+ svntest.actions.run_and_verify_svn(plist_expected, [],
'proplist', '-v', peg_path,
'-r', str(op_rev))
else:
- svntest.actions.run_and_verify_svn(None, plist_expected, [],
+ svntest.actions.run_and_verify_svn(plist_expected, [],
'proplist', '-v', peg_path)
# XFail the same reason revprop_change() is.
@SkipUnless(svntest.main.server_enforces_date_syntax)
-@XFail(svntest.main.is_ra_type_dav)
@Issue(3086)
def invalid_propvalues(sbox):
"test handling invalid svn:* property values"
@@ -1646,7 +1617,7 @@ def invalid_propvalues(sbox):
svntest.actions.enable_revprop_changes(repo_dir)
expected_stderr = '.*unexpected property value.*|.*Bogus date.*'
- svntest.actions.run_and_verify_svn(None, [], expected_stderr,
+ svntest.actions.run_and_verify_svn([], expected_stderr,
'propset', '--revprop', '-r', '0',
'svn:date', 'Sat May 10 12:12:31 2008',
repo_url)
@@ -1678,7 +1649,7 @@ def same_replacement_props(sbox):
expected_out = [ "Properties on '" + foo_url + "':\n",
" someprop\n",
" someval\n" ]
- svntest.actions.run_and_verify_svn(None, expected_out, [],
+ svntest.actions.run_and_verify_svn(expected_out, [],
'proplist', '-v', foo_url)
def added_moved_file(sbox):
@@ -1720,7 +1691,7 @@ def delete_nonexistent_property(sbox):
# Remove one property
expected_stdout = ".*Attempting to delete nonexistent property 'yellow'.*"
- svntest.actions.run_and_verify_svn(None, expected_stdout, [],
+ svntest.actions.run_and_verify_svn(expected_stdout, [],
'propdel', 'yellow',
os.path.join(wc_dir, 'A', 'D', 'G'))
@@ -1740,17 +1711,17 @@ def post_revprop_change_hook(sbox):
svntest.actions.create_failing_hook(repo_dir, 'post-revprop-change',
error_msg)
- # serf/neon/mod_dav_svn give SVN_ERR_RA_DAV_REQUEST_FAILED
+ # serf/mod_dav_svn give SVN_ERR_RA_DAV_PROPPATCH_FAILED
# file/svn give SVN_ERR_REPOS_HOOK_FAILURE
- expected_error = 'svn: (E175002|E165001).*post-revprop-change hook failed'
+ expected_error = 'svn: (E175008|E165001).*post-revprop-change hook failed'
- svntest.actions.run_and_verify_svn(None, [], expected_error,
+ svntest.actions.run_and_verify_svn([], expected_error,
'ps', '--revprop', '-r0', 'p', 'v',
wc_dir)
# Verify change has stuck -- at one time mod_dav_svn would rollback
# revprop changes on post-revprop-change hook errors
- svntest.actions.run_and_verify_svn(None, 'v', [],
+ svntest.actions.run_and_verify_svn('v', [],
'pg', '--revprop', '-r0', 'p',
wc_dir)
@@ -1786,7 +1757,7 @@ def rm_of_replaced_file(sbox):
svntest.main.run_svn(None, 'rm', '--force', mu_path)
svntest.actions.run_and_verify_svn(
- None, [],
+ [],
'svn: E200009.*some targets are not versioned.*',
'proplist', '-v', mu_path)
@@ -1884,8 +1855,9 @@ def prop_reject_grind(sbox):
"Trying to change property 'edit.none'\n"
"but the property does not exist locally.\n"
"<<<<<<< (local property value)\n"
- "=======\n"
- "repos.changed>>>>>>> (incoming property value)\n",
+ "||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ "repos.changed>>>>>>> (incoming 'changed to' value)\n",
"Trying to delete property 'del.del'\n"
"but the property has been locally deleted and had a different value.\n",
@@ -1893,75 +1865,84 @@ def prop_reject_grind(sbox):
"Trying to delete property 'del.edit'\n"
"but the local property value is different.\n"
"<<<<<<< (local property value)\n"
- "local.changed=======\n"
- ">>>>>>> (incoming property value)\n",
+ "local.changed||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ ">>>>>>> (incoming 'changed to' value)\n",
"Trying to change property 'edit.del'\n"
"but the property has been locally deleted.\n"
"<<<<<<< (local property value)\n"
- "=======\n"
- "repos.changed>>>>>>> (incoming property value)\n",
+ "||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ "repos.changed>>>>>>> (incoming 'changed to' value)\n",
"Trying to change property 'edit.edit'\n"
"but the property has already been locally changed to a different value.\n"
"<<<<<<< (local property value)\n"
- "local.changed=======\n"
- "repos.changed>>>>>>> (incoming property value)\n",
+ "local.changed||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ "repos.changed>>>>>>> (incoming 'changed to' value)\n",
"Trying to delete property 'del.edit2'\n"
"but the property has been locally modified.\n"
"<<<<<<< (local property value)\n"
- "repos.changed=======\n"
- ">>>>>>> (incoming property value)\n",
+ "repos.changed||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ ">>>>>>> (incoming 'changed to' value)\n",
"Trying to delete property 'del.add'\n"
"but the property has been locally added.\n"
"<<<<<<< (local property value)\n"
- "local=======\n"
- ">>>>>>> (incoming property value)\n",
+ "local||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ ">>>>>>> (incoming 'changed to' value)\n",
"Trying to delete property 'del.diff'\n"
"but the local property value is different.\n"
"<<<<<<< (local property value)\n"
- "local=======\n"
- ">>>>>>> (incoming property value)\n",
+ "local||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ ">>>>>>> (incoming 'changed to' value)\n",
"Trying to change property 'edit.add'\n"
"but the property has been locally added with a different value.\n"
"<<<<<<< (local property value)\n"
- "local=======\n"
- "repos.changed>>>>>>> (incoming property value)\n",
+ "local||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ "repos.changed>>>>>>> (incoming 'changed to' value)\n",
"Trying to change property 'edit.diff'\n"
"but the local property value conflicts with the incoming change.\n"
"<<<<<<< (local property value)\n"
- "local=======\n"
- "repos.changed>>>>>>> (incoming property value)\n",
+ "local||||||| (incoming 'changed from' value)\n"
+ "repos=======\n"
+ "repos.changed>>>>>>> (incoming 'changed to' value)\n",
"Trying to add new property 'add.add'\n"
"but the property already exists.\n"
"<<<<<<< (local property value)\n"
- "local=======\n"
- "repos>>>>>>> (incoming property value)\n",
+ "local||||||| (incoming 'changed from' value)\n"
+ "=======\n"
+ "repos>>>>>>> (incoming 'changed to' value)\n",
"Trying to add new property 'add.diff'\n"
"but the property already exists.\n"
- "Local property value:\n"
- "local\n"
- "Incoming property value:\n"
- "repos\n",
+ "<<<<<<< (local property value)\n"
+ "local||||||| (incoming 'changed from' value)\n"
+ "=======\n"
+ "repos>>>>>>> (incoming 'changed to' value)\n",
"Trying to add new property 'add.del'\n"
"but the property has been locally deleted.\n"
- "<<<<<<< (local property value)\n"
- "=======\n"
- "repos>>>>>>> (incoming property value)\n",
+ "Incoming property value:\n"
+ "repos\n",
"Trying to add new property 'add.edit'\n"
"but the property already exists.\n"
"<<<<<<< (local property value)\n"
- "local.changed=======\n"
- "repos>>>>>>> (incoming property value)\n",
+ "local.changed||||||| (incoming 'changed from' value)\n"
+ "=======\n"
+ "repos>>>>>>> (incoming 'changed to' value)\n",
]
# Get the contents of mu.prej. The error messages are in the prej file
@@ -2048,7 +2029,7 @@ def atomic_over_ra(sbox):
# Initial state.
svntest.actions.enable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--revprop', '-r', '0',
'flower', s1, repo_url)
@@ -2059,8 +2040,8 @@ def atomic_over_ra(sbox):
# so we should fail.
expected_stderr = ".*doesn't advertise.*ATOMIC_REVPROP"
svntest.actions.run_and_verify_atomic_ra_revprop_change(
- None, None, expected_stderr, 1, repo_url, 0, 'flower',
- old_value, proposed_value)
+ None, expected_stderr, 1, repo_url, 0, 'flower',
+ old_value, proposed_value, True)
# The original value is still there.
svntest.actions.check_prop('flower', repo_url, [s1], 0)
@@ -2068,7 +2049,7 @@ def atomic_over_ra(sbox):
def FAILS_WITH_BPV(not_the_old_value, proposed_value):
if svntest.main.server_has_atomic_revprop():
svntest.actions.run_and_verify_atomic_ra_revprop_change(
- None, None, [], 0, repo_url, 0, 'flower',
+ None, [], 0, repo_url, 0, 'flower',
not_the_old_value, proposed_value, True)
else:
expect_old_server_fail(not_the_old_value, proposed_value)
@@ -2076,7 +2057,7 @@ def atomic_over_ra(sbox):
def PASSES_WITHOUT_BPV(yes_the_old_value, proposed_value):
if svntest.main.server_has_atomic_revprop():
svntest.actions.run_and_verify_atomic_ra_revprop_change(
- None, None, [], 0, repo_url, 0, 'flower',
+ None, [], 0, repo_url, 0, 'flower',
yes_the_old_value, proposed_value, False)
else:
expect_old_server_fail(yes_the_old_value, proposed_value)
@@ -2247,16 +2228,16 @@ def propget_redirection(sbox):
# Set the 'big' mergeinfo prop on A/B, A/C, and A/D.
svntest.main.file_write(prop_val_file, big_prop_val)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
SVN_PROP_MERGEINFO, '-F', prop_val_file,
B_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
SVN_PROP_MERGEINFO, '-F', prop_val_file,
C_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
SVN_PROP_MERGEINFO, '-F', prop_val_file,
D_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'ps some large svn:mergeinfos', wc_dir)
# Run propget -vR svn:mergeinfo, redirecting the stdout to a file.
@@ -2300,7 +2281,7 @@ def file_matching_dir_prop_reject(sbox):
# Add file with awkward name
svntest.main.file_append(sbox.ospath('A/dir_conflicts'), "some content\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', sbox.ospath('A/dir_conflicts'))
sbox.simple_propset('prop', 'val1', 'A/dir_conflicts')
sbox.simple_propset('prop', 'val1', 'A')
@@ -2314,7 +2295,7 @@ def file_matching_dir_prop_reject(sbox):
'A/dir_conflicts' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Modify/commit property change
sbox.simple_propset('prop', 'val2', 'A/dir_conflicts')
@@ -2325,7 +2306,7 @@ def file_matching_dir_prop_reject(sbox):
})
expected_status.tweak('A', 'A/dir_conflicts', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Local property mod
sbox.simple_propset('prop', 'val3', 'A/dir_conflicts')
@@ -2344,21 +2325,18 @@ def file_matching_dir_prop_reject(sbox):
expected_status.tweak(wc_rev=2)
expected_status.tweak('A', 'A/dir_conflicts', status=' C')
+ # Conflict: BASE=val2 WORKING=val3 INCOMING_OLD=val2 INCOMING_NEW=val1
extra_files = ['dir_conflicts.prej', 'dir_conflicts.2.prej']
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files,
- None, None, True, '-r', '2', wc_dir)
- if len(extra_files) != 0:
- logger.warn("didn't get expected conflict files")
- raise svntest.verify.SVNUnexpectedOutput
+ [], True,
+ '-r', '2', wc_dir,
+ extra_files=extra_files)
# Revert and update to check that conflict files are removed
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', '-R', wc_dir)
expected_status.tweak('A', 'A/dir_conflicts', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -2372,7 +2350,7 @@ def file_matching_dir_prop_reject(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, True)
+ check_props=True)
def pristine_props_listed(sbox):
"check if pristine properties are visible"
@@ -2386,13 +2364,13 @@ def pristine_props_listed(sbox):
expected_output = ["Properties on '" + sbox.ospath('A') + "':\n", " prop\n"]
# Now we see the pristine properties
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'proplist', '-R', wc_dir, '-r', 'BASE')
sbox.simple_propset('prop', 'needs-fix', 'A')
# And now we see no property at all
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'proplist', '-R', wc_dir, '-r', 'BASE')
def create_inherited_ignores_config(config_dir):
@@ -2470,7 +2448,7 @@ def inheritable_ignores(sbox):
['? ' + X_dir_path + '\n',
'? ' + Y_dir_path + '\n',
'? ' + Z_dir_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'st',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'st',
'--config-dir', config_dir, wc_dir)
# Check status without the custom config.
@@ -2482,7 +2460,7 @@ def inheritable_ignores(sbox):
'? ' + Z_dir_path + '\n',
'? ' + boo_dir_path + '\n',
'? ' + goo_file_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'st', wc_dir)
+ svntest.actions.run_and_verify_svn(expected_output, [], 'st', wc_dir)
# Check status with the custom config and --no-ignore.
expected_output = svntest.verify.UnorderedOutput(
@@ -2497,7 +2475,7 @@ def inheritable_ignores(sbox):
'I ' + goo_file_path + '\n',
'I ' + moo_file_path + '\n',
'I ' + foo_file_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'st',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'st',
'--config-dir', config_dir,
'--no-ignore', wc_dir)
@@ -2516,7 +2494,7 @@ def inheritable_ignores(sbox):
'? ' + goo_file_path + '\n',
'I ' + moo_file_path + '\n',
'I ' + foo_file_path + '\n',])
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'st',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'st',
'--no-ignore', wc_dir)
# Perform the add with the --force flag, targeting the root of the WC.
@@ -2531,14 +2509,14 @@ def inheritable_ignores(sbox):
['A ' + 'ADD-ME-DIR-X\n',
'A ' + os.path.join('A', 'ADD-ME-DIR-Y.doo') + '\n',
'A ' + os.path.join('A', 'D', 'G', 'ADD-ME-DIR-Z.doo') + '\n'])
- svntest.actions.run_and_verify_svn("Adds in spite of ignores", expected,
+ svntest.actions.run_and_verify_svn(expected,
[], 'add', '.', '--force',
'--config-dir', config_dir)
os.chdir(saved_wd)
# Now revert and try the add with the --no-ignore flag, nothing should
# be ignored.
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', wc_dir, '-R')
+ svntest.actions.run_and_verify_svn(None, [], 'revert', wc_dir, '-R')
saved_wd = os.getcwd()
os.chdir(sbox.wc_dir)
expected = svntest.verify.UnorderedOutput(
@@ -2561,8 +2539,7 @@ def inheritable_ignores(sbox):
'ignore-me-file.roo') + '\n',
'A ' + os.path.join('A', 'D', 'IGNORE-ME-DIR.moo') + '\n',
'A ' + os.path.join('A', 'D', 'ignore-me-file.moo') + '\n'])
- svntest.actions.run_and_verify_svn("Files ignored with --no-ignore",
- expected, [], 'add', '.', '--force',
+ svntest.actions.run_and_verify_svn(expected, [], 'add', '.', '--force',
'--no-ignore', '--config-dir',
config_dir)
@@ -2595,7 +2572,7 @@ def almost_known_prop_names(sbox):
svntest.actions.set_prop('svn:foobar', 'x', iota_path,
"svn: E195011: 'svn:foobar'"
" is not a valid svn: property name;"
- " re-run with '--force' to set it")
+ " use '--force' to set it")
@Issue(3231)
def peg_rev_base_working(sbox):
@@ -2608,10 +2585,173 @@ def peg_rev_base_working(sbox):
svntest.actions.set_prop('ordinal', 'ninth\n', sbox.ospath('iota'))
sbox.simple_commit(message='r2')
svntest.actions.set_prop('cardinal', 'nine\n', sbox.ospath('iota'))
- svntest.actions.run_and_verify_svn(None, ['ninth\n'], [],
- 'propget', '--strict', 'ordinal',
+ svntest.actions.run_and_verify_svn(['ninth\n'], [],
+ 'propget', '--no-newline', 'ordinal',
sbox.ospath('iota') + '@BASE')
+@Issue(4415)
+def xml_unsafe_author(sbox):
+ "svn:author with XML unsafe chars"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.enable_revprop_changes(sbox.repo_dir)
+
+ # client sends svn:author (via PROPPATCH for DAV)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'propset', '--revprop', '-r', '1',
+ 'svn:author', 'foo\bbar', wc_dir)
+
+ # mod_dav_svn sends svn:author (via REPORT for DAV)
+ sbox.simple_update(revision=0)
+ sbox.simple_update(revision=1)
+ expected_info = [{
+ 'Path' : re.escape(wc_dir),
+ 'Repository Root' : sbox.repo_url,
+ 'Repository UUID' : svntest.actions.get_wc_uuid(wc_dir),
+ 'Last Changed Author' : 'foo\bbar',
+ }]
+ svntest.actions.run_and_verify_info(expected_info, wc_dir)
+
+ # mod_dav_svn sends svn:author (via PROPFIND for DAV)
+ # Since r1553367 this works correctly on ra_serf, since we now request
+ # a single property value which skips creating the creator-displayname property
+ svntest.actions.run_and_verify_svn(['foo\bbar'], [],
+ 'propget', '--revprop', '-r', '1',
+ 'svn:author', '--no-newline', wc_dir)
+
+ # Ensure a stable date
+ svntest.actions.run_and_verify_svn(None, [],
+ 'propset', '--revprop', '-r', '1',
+ 'svn:date', '2015-01-01T00:00:00.0Z', wc_dir)
+
+ # But a proplist of this property value still fails via DAV.
+ expected_output = svntest.verify.UnorderedOutput([
+ 'Unversioned properties on revision 1:\n',
+ ' svn:author\n',
+ ' foo\bbar\n',
+ ' svn:date\n',
+ ' 2015-01-01T00:00:00.0Z\n',
+ ' svn:log\n',
+ ' Log message for revision 1.\n'
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'proplist', '--revprop', '-r', '1', '-v',
+ wc_dir)
+
+@Issue(4415)
+def xml_unsafe_author2(sbox):
+ "svn:author with XML unsafe chars 2"
+
+ sbox.build(create_wc = False)
+ repo_url = sbox.repo_url
+
+ svntest.actions.enable_revprop_changes(sbox.repo_dir)
+
+ # client sends svn:author (via PROPPATCH for DAV)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'propset', '--revprop', '-r', '1',
+ 'svn:author', 'foo\bbar', repo_url)
+
+ # Ensure a stable date
+ svntest.actions.run_and_verify_svn(None, [],
+ 'propset', '--revprop', '-r', '1',
+ 'svn:date', '2000-01-01T12:00:00.0Z',
+ repo_url)
+
+ if svntest.main.is_ra_type_dav():
+ # This receives the filtered author (but that is better than an Xml fail)
+ expected_author = 'foobar'
+ else:
+ expected_author = 'foo\bbar'
+
+ # Use svn ls in --xml mode to test locale independent output.
+ expected_output = [
+ '<?xml version="1.0" encoding="UTF-8"?>\n',
+ '<lists>\n',
+ '<list\n',
+ ' path="%s">\n' % sbox.repo_url,
+ '<entry\n',
+ ' kind="dir">\n',
+ '<name>A</name>\n',
+ '<commit\n',
+ ' revision="1">\n',
+ '<author>%s</author>\n' % expected_author,
+ '<date>2000-01-01T12:00:00.000000Z</date>\n',
+ '</commit>\n',
+ '</entry>\n',
+ '<entry\n',
+ ' kind="file">\n',
+ '<name>iota</name>\n',
+ '<size>25</size>\n',
+ '<commit\n',
+ ' revision="1">\n',
+ '<author>%s</author>\n' % expected_author,
+ '<date>2000-01-01T12:00:00.000000Z</date>\n',
+ '</commit>\n',
+ '</entry>\n',
+ '</list>\n',
+ '</lists>\n'
+ ]
+
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'ls', '--xml', repo_url)
+
+ expected_info = [{
+ 'Repository Root' : sbox.repo_url,
+ 'Last Changed Author' : expected_author,
+ }]
+ svntest.actions.run_and_verify_info(expected_info, repo_url)
+
+def dir_prop_conflict_details(sbox):
+ "verify dir property conflict details"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Apply some changes
+ sbox.simple_propset('svn:mergeinfo', '/B:1', 'A')
+ sbox.simple_propset('my-prop', 'my-val', 'A')
+ sbox.simple_commit()
+
+ # Revert to r1
+ sbox.simple_update('', revision=1)
+
+ # Apply some incompatible changes
+ sbox.simple_propset('svn:mergeinfo', '/C:1', 'A')
+ sbox.simple_propset('my-prop', 'other-val', 'A')
+
+ # This should report out of date because there are incompatible property
+ # changes that can't be merged on the server
+ svntest.actions.run_and_verify_commit(wc_dir,
+ None,
+ None,
+ '.*[Oo]ut of date.*')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A' : Item(status=' C'),
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.tweak('A', status=' C')
+
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ None,
+ expected_status,
+ check_props=True)
+
+ # The conflict properties file line was shown for previous versions, but the
+ # conflict source urls are new since 1.8.
+ expected_info = {
+ 'Conflict Properties File' : re.escape(sbox.ospath('A/dir_conflicts.prej')),
+ 'Conflict Details': re.escape('incoming dir edit upon update'
+ + ' Source left: (dir) ^/A@1'
+ + ' Source right: (dir) ^/A@2')
+ }
+ svntest.actions.run_and_verify_info([expected_info], sbox.path('A'))
+
+
def iprops_list_abspath(sbox):
"test listing iprops via abspath"
@@ -2620,14 +2760,14 @@ def iprops_list_abspath(sbox):
sbox.simple_propset('im', 'root', '')
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', '^/A/D', sbox.ospath(''),
'--ignore-ancestry')
sbox.simple_propset('im', 'GammA', 'gamma')
expected_output = [
- 'Inherited properties on \'%s\',\n' % sbox.ospath('')[:-1],
+ 'Inherited properties on \'%s\',\n' % sbox.ospath(''),
'from \'%s\':\n' % sbox.repo_url,
' im\n',
' root\n',
@@ -2635,7 +2775,7 @@ def iprops_list_abspath(sbox):
' im\n',
' GammA\n'
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'pl', '-R',
'--show-inherited-props', '-v',
sbox.ospath(''))
@@ -2649,7 +2789,7 @@ def iprops_list_abspath(sbox):
' im\n',
' GammA\n'
]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'pl', '-R',
'--show-inherited-props', '-v',
os.path.abspath(sbox.ospath('')))
@@ -2659,14 +2799,39 @@ def wc_propop_on_url(sbox):
sbox.build(create_wc = False)
- svntest.actions.run_and_verify_svn(None, None, '.*E195000:.*path',
+ svntest.actions.run_and_verify_svn(None, '.*E195000:.*path',
'pl', '-r', 'PREV',
sbox.repo_url)
- svntest.actions.run_and_verify_svn(None, None, '.*E195000:.*path',
+ svntest.actions.run_and_verify_svn(None, '.*E195000:.*path',
'pg', 'my:Q', '-r', 'PREV',
sbox.repo_url)
+def prop_conflict_root(sbox):
+ """property conflict on wc root"""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_propset('propname', 'propval1', '')
+ sbox.simple_commit()
+ sbox.simple_propset('propname', 'propval2', '')
+ sbox.simple_commit()
+ sbox.simple_update(revision=2)
+ sbox.simple_propset('propname', 'propvalconflict', '')
+
+ expected_output = svntest.wc.State(wc_dir, {
+ '' : Item(status=' C'),
+ })
+ expected_disk = svntest.main.greek_state.copy()
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
+ expected_status.tweak('', status=' C')
+ extra_files = ['dir_conflicts.prej']
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output,
+ expected_disk,
+ expected_status,
+ extra_files=extra_files)
########################################################################
# Run the tests
@@ -2713,8 +2878,12 @@ test_list = [ None,
inheritable_ignores,
almost_known_prop_names,
peg_rev_base_working,
+ xml_unsafe_author,
+ xml_unsafe_author2,
+ dir_prop_conflict_details,
iprops_list_abspath,
wc_propop_on_url,
+ prop_conflict_root,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/redirect_tests.py b/subversion/tests/cmdline/redirect_tests.py
index 3262c1b..e8196a3 100755
--- a/subversion/tests/cmdline/redirect_tests.py
+++ b/subversion/tests/cmdline/redirect_tests.py
@@ -154,7 +154,7 @@ def redirected_nonroot_update(sbox):
checkout_url, wc_dir)
if err:
raise svntest.Failure
-
+
# Relocate (by cheating) the working copy to the redirect URL. When
# we then update, we'll expect to find ourselves automagically back
# to the original URL. (This is because we can't easily introduce a
@@ -178,6 +178,88 @@ def redirected_nonroot_update(sbox):
verify_url(wc_dir, checkout_url)
#----------------------------------------------------------------------
+@SkipUnless(svntest.main.is_ra_type_dav)
+def redirected_externals(sbox):
+ "redirected externals"
+
+ sbox.build()
+
+ sbox.simple_propset('svn:externals',
+ '^/A/B/E/alpha fileX\n'
+ '^/A/B/F dirX',
+ 'A/C')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ wc_dir = sbox.add_wc_path("my")
+ co_url = sbox.redirected_root_url()
+ exit_code, out, err = svntest.main.run_svn(None, 'co', co_url, wc_dir)
+ if err:
+ raise svntest.Failure
+ if not redirect_regex.match(out[0]):
+ raise svntest.Failure
+
+ verify_url(wc_dir, sbox.repo_url)
+ verify_url(sbox.ospath('A/C/fileX'), sbox.repo_url + '/A/B/E/alpha',
+ wc_path_is_file=True)
+ verify_url(sbox.ospath('A/C/dirX'), sbox.repo_url + '/A/B/F')
+
+#----------------------------------------------------------------------
+@SkipUnless(svntest.main.is_ra_type_dav)
+def redirected_copy(sbox):
+ "redirected copy"
+
+ sbox.build(create_wc=False)
+
+ # E170011 = SVN_ERR_RA_SESSION_URL_MISMATCH
+ expected_error = "svn: E170011: Repository moved permanently"
+
+ # This tests the actual copy handling
+ svntest.actions.run_and_verify_svn(None, expected_error,
+ 'cp', '-m', 'failed copy',
+ sbox.redirected_root_url() + '/A',
+ sbox.redirected_root_url() + '/A_copied')
+
+ # This tests the cmdline handling of '^/copy-of-A'
+ svntest.actions.run_and_verify_svn(None, expected_error,
+ 'cp', '-m', 'failed copy',
+ sbox.redirected_root_url() + '/A',
+ '^/copy-of-A')
+
+ # E170011 = SVN_ERR_RA_SESSION_URL_MISMATCH
+ expected_error = "svn: E170011: Repository moved temporarily"
+
+ # This tests the actual copy handling
+ svntest.actions.run_and_verify_svn(None, expected_error,
+ 'cp', '-m', 'failed copy',
+ sbox.redirected_root_url(temporary=True) + '/A',
+ sbox.redirected_root_url(temporary=True) + '/A_copied')
+
+ # This tests the cmdline handling of '^/copy-of-A'
+ svntest.actions.run_and_verify_svn(None, expected_error,
+ 'cp', '-m', 'failed copy',
+ sbox.redirected_root_url(temporary=True) + '/A',
+ '^/copy-of-A')
+#----------------------------------------------------------------------
+@SkipUnless(svntest.main.is_ra_type_dav)
+def redirected_commands(sbox):
+ "redirected commands"
+
+ sbox.build(create_wc=False)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'log',
+ sbox.redirected_root_url() + '/A')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'ls',
+ sbox.redirected_root_url() + '/A')
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'info',
+ sbox.redirected_root_url() + '/A')
+
+#----------------------------------------------------------------------
########################################################################
# Run the tests
@@ -188,6 +270,9 @@ test_list = [ None,
redirected_checkout,
redirected_update,
redirected_nonroot_update,
+ redirected_externals,
+ redirected_copy,
+ redirected_commands,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/relocate_tests.py b/subversion/tests/cmdline/relocate_tests.py
index 7e6ea19..40ffb49 100755
--- a/subversion/tests/cmdline/relocate_tests.py
+++ b/subversion/tests/cmdline/relocate_tests.py
@@ -42,7 +42,7 @@ Item = svntest.wc.StateItem
from svntest.main import SVN_PROP_MERGEINFO, server_has_mergeinfo
from externals_tests import change_external
-from switch_tests import do_routine_switching
+from svntest.deeptrees import do_routine_switching
#----------------------------------------------------------------------
@@ -53,7 +53,7 @@ def relocate_deleted_missing_copied(sbox):
# Delete A/mu to create a deleted entry for mu in A/.svn/entries
mu_path = os.path.join(wc_dir, 'A', 'mu')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', mu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', mu_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/mu')
expected_output = svntest.wc.State(wc_dir, {
@@ -61,8 +61,7 @@ def relocate_deleted_missing_copied(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Remove A/B/F to create a missing entry
svntest.main.safe_rmtree(os.path.join(wc_dir, 'A', 'B', 'F'))
@@ -70,11 +69,11 @@ def relocate_deleted_missing_copied(sbox):
# Copy A/D to A/D2
D_path = os.path.join(wc_dir, 'A', 'D')
D2_path = os.path.join(wc_dir, 'A', 'D2')
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
D_path, D2_path)
# Delete within the copy
D2G_path = os.path.join(wc_dir, 'A', 'D2', 'G')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', D2G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', D2G_path)
expected_status.add({
'A/D2' : Item(status='A ', wc_rev='-', copied='+'),
@@ -97,7 +96,7 @@ def relocate_deleted_missing_copied(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path('other')
svntest.main.copy_repos(repo_dir, other_repo_dir, 2, 0)
svntest.main.safe_rmtree(repo_dir, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '--relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '--relocate',
repo_url, other_repo_url, wc_dir)
# Deleted and missing entries should be preserved, so update should
@@ -141,8 +140,7 @@ def relocate_deleted_missing_copied(sbox):
status=' ', wc_rev='3', copied=None)
expected_status.remove('A/D2/G', 'A/D2/G/pi', 'A/D2/G/rho', 'A/D2/G/tau')
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
#----------------------------------------------------------------------
@@ -163,26 +161,26 @@ def relocate_beyond_repos_root(sbox):
other_B_url = other_repo_url + "/B"
svntest.main.safe_rmtree(wc_dir, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
repo_url + '/A', wc_dir)
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 0)
# A relocate that changes the repo path part of the URL shouldn't work.
# This tests for issue #2380.
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*Invalid relocation destination.*",
'relocate',
A_url, other_B_url, A_wc_dir)
# Another way of trying to change the fs path, leading to an invalid
# repository root.
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*is not the root.*",
'relocate',
repo_url, other_B_url, A_wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'relocate',
A_url, other_A_url, A_wc_dir)
@@ -208,21 +206,16 @@ def relocate_and_propset(sbox):
# Create virgin repos and working copy
svntest.main.safe_rmtree(sbox.repo_dir, 1)
svntest.main.create_repos(sbox.repo_dir)
+ svntest.actions.guarantee_greek_repository(
+ sbox.repo_dir, svntest.main.options.server_minor_version)
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
repo_url = sbox.repo_url
- # import the greek tree
- svntest.main.greek_state.write_to_disk(svntest.main.greek_dump_dir)
- exit_code, output, errput = svntest.main.run_svn(
- None, 'import', '-m', 'Log message for revision 1.',
- svntest.main.greek_dump_dir, sbox.repo_url)
-
# checkout
svntest.main.safe_rmtree(wc_dir, 1)
- svntest.actions.run_and_verify_svn(None,
- None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -230,7 +223,7 @@ def relocate_and_propset(sbox):
other_repo_dir, other_repo_url = sbox.add_repo_path('other')
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 0)
svntest.main.safe_rmtree(repo_dir, 1)
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
repo_url, other_repo_url, wc_dir)
# Remove gamma from the working copy.
@@ -250,8 +243,7 @@ def relocate_and_propset(sbox):
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Now gamma should be marked as `deleted' under the hood, at
# revision 2. Meanwhile, A/D is still lagging at revision 1.
@@ -263,8 +255,7 @@ def relocate_and_propset(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
None,
None,
- "[Oo]ut.of.date",
- wc_dir)
+ ".*[Oo]ut of date.*")
#----------------------------------------------------------------------
@@ -273,24 +264,19 @@ def single_file_relocate(sbox):
# Create virgin repos and working copy
svntest.main.safe_rmtree(sbox.repo_dir, 1)
- svntest.main.create_repos(sbox.repo_dir)
+ svntest.actions.guarantee_greek_repository(
+ sbox.repo_dir, svntest.main.options.server_minor_version)
wc_dir = sbox.wc_dir
iota_path = os.path.join(sbox.wc_dir, 'iota')
repo_dir = sbox.repo_dir
repo_url = sbox.repo_url
iota_url = repo_url + '/iota'
-
- # import the greek tree
- svntest.main.greek_state.write_to_disk(svntest.main.greek_dump_dir)
- exit_code, output, errput = svntest.main.run_svn(
- None, 'import', '-m', 'Log message for revision 1.',
- svntest.main.greek_dump_dir, sbox.repo_url)
+ greek_dump_dir = sbox.add_wc_path('greek-dump')
# checkout
svntest.main.safe_rmtree(wc_dir, 1)
- svntest.actions.run_and_verify_svn(None,
- None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
repo_url, wc_dir)
@@ -299,7 +285,7 @@ def single_file_relocate(sbox):
other_iota_url = other_repo_url + '/iota'
svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 0)
svntest.main.safe_rmtree(repo_dir, 1)
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*Cannot relocate.*",
'relocate',
iota_url, other_iota_url, iota_path)
@@ -322,7 +308,7 @@ def relocate_with_switched_children(sbox):
svntest.main.safe_rmtree(repo_dir, 1)
# Do the switch and check the results in three ways.
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
repo_url, other_repo_url, wc_dir)
# Attempt to commit changes and examine results
@@ -340,8 +326,7 @@ def relocate_with_switched_children(sbox):
# This won't actually do a commit, because nothing should be modified.
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Check the URLs of various nodes.
info_output = {
@@ -369,7 +354,7 @@ def relocate_with_relative_externals(sbox):
# Add a relative external.
change_external(os.path.join(wc_dir, 'A', 'B'),
"^/A/D/G G-ext\n../D/H H-ext", commit=True)
- svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'update', wc_dir)
# Move our repository to another location.
repo_dir = sbox.repo_dir
@@ -379,7 +364,7 @@ def relocate_with_relative_externals(sbox):
svntest.main.safe_rmtree(repo_dir, 1)
# Now relocate our working copy.
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
repo_url, other_repo_url, wc_dir)
# Check the URLs of the externals -- were they updated to point to the
diff --git a/subversion/tests/cmdline/resolve_tests.py b/subversion/tests/cmdline/resolve_tests.py
index c032b06..0d3b28a 100755
--- a/subversion/tests/cmdline/resolve_tests.py
+++ b/subversion/tests/cmdline/resolve_tests.py
@@ -41,8 +41,8 @@ Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
-from merge_tests import set_up_branch
-from merge_tests import expected_merge_output
+from svntest.mergetrees import set_up_branch
+from svntest.mergetrees import expected_merge_output
######################################################################
@@ -70,13 +70,12 @@ def automatic_conflict_resolution(sbox):
# Make a change on the A_COPY branch such that a subsequent merge
# conflicts.
svntest.main.file_write(psi_COPY_path, "Branch content.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'log msg', wc_dir)
def do_text_conflicting_merge():
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', A_COPY_path)
svntest.actions.run_and_verify_svn(
- None,
expected_merge_output([[3]], [
"C %s\n" % psi_COPY_path,
" U %s\n" % A_COPY_path],
@@ -126,10 +125,10 @@ def prop_conflict_resolution(sbox):
psi_path = os.path.join(wc_dir, "A", "D", "H", "psi")
# r2 - Set property 'propname:propval' on iota, A/mu, and A/D/gamma.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'propname', 'propval',
iota_path, mu_path, gamma_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'-m', 'create some new properties',
wc_dir)
@@ -138,15 +137,15 @@ def prop_conflict_resolution(sbox):
# iota : Delete property 'propname'
# A/mu : Change property 'propname' to 'incoming-conflict'
# A/D/gamma : Change property 'propname' to 'incoming-no-conflict'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'pd', 'propname', iota_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'propname', 'incoming-conflict',
mu_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'propname', 'incoming-no-conflict',
gamma_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit', '-m', 'delete a property',
wc_dir)
@@ -156,7 +155,7 @@ def prop_conflict_resolution(sbox):
"""Revert the WC, update it to r2, and set the following properties:
- itoa : 'propname' = 'local_edit'
+ iota : 'propname' = 'local_edit'
'newprop' = 'new-val-no-incoming'
A/mu : 'propname' = 'local_edit'
A/D/gamma : 'propname' = 'incoming-no-conflict'
@@ -168,9 +167,9 @@ def prop_conflict_resolution(sbox):
Using svn propget, check that the resolution results in the following
properties:
- itoa : 'propname' = RESOLVED_EDITED_PROP_VAL_OUTPUT
+ iota : 'propname' = RESOLVED_DELETED_PROP_VAL_OUTPUT
'newprop' = 'new-val-no-incoming'
- A/mu : 'propname' = RESOLVED_DELETED_PROP_VAL_OUTPUT
+ A/mu : 'propname' = RESOLVED_EDITED_PROP_VAL_OUTPUT
A/D/gamma : 'propname' = 'incoming-no-conflict'
A/D/H/psi : 'newprop' = 'new-val-no-incoming'
@@ -178,50 +177,46 @@ def prop_conflict_resolution(sbox):
both follow the rules for the expected_stdout arg to
run_and_verify_svn2()"""
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '--recursive', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r2', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r2', wc_dir)
# Set some properties that will conflict when we update.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
'propname', 'local_edit',
iota_path, mu_path)
# Set a property that should always merge cleanly with the update.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
'propname', 'incoming-no-conflict',
gamma_path)
# Set a property that has no update coming.
- svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+ svntest.actions.run_and_verify_svn(None, [], 'ps',
'newprop', 'new-val-no-incoming',
psi_path,
iota_path)
# Update, postponing all conflict resolution.
- svntest.actions.run_and_verify_svn(None, None, [], 'up',
+ svntest.actions.run_and_verify_svn(None, [], 'up',
'--accept=postpone', wc_dir)
svntest.actions.run_and_verify_resolve([iota_path, mu_path], '-R',
'--accept', resolve_accept, wc_dir)
+ if resolved_deleted_prop_val_output:
+ expected_deleted_stderr = []
+ else:
+ expected_deleted_stderr = '.*W200017: Property.*not found'
+
svntest.actions.run_and_verify_svn(
- 'svn revolve -R --accept=' + resolve_accept + ' of prop conflict '
- 'not resolved as expected;',
- resolved_deleted_prop_val_output, [], 'pg', 'propname', iota_path)
+ resolved_deleted_prop_val_output, expected_deleted_stderr,
+ 'pg', 'propname', iota_path)
svntest.actions.run_and_verify_svn(
- 'svn revolve -R --accept=' + resolve_accept + ' of prop conflict '
- 'not resolved as expected;',
['new-val-no-incoming\n'], [], 'pg', 'newprop', iota_path)
svntest.actions.run_and_verify_svn(
- 'svn revolve -R --accept=' + resolve_accept + ' of prop conflict '
- 'not resolved as expected;',
resolved_edited_prop_val_output, [], 'pg', 'propname', mu_path)
svntest.actions.run_and_verify_svn(
- 'svn revolve -R --accept=' + resolve_accept + ' modified a '
- 'non-conflicted property',
['incoming-no-conflict\n'], [], 'pg', 'propname', gamma_path)
svntest.actions.run_and_verify_svn(
- 'svn revolve -R --accept=' + resolve_accept + ' modified a '
- 'non-conflicted property',
['new-val-no-incoming\n'], [], 'pg', 'newprop', psi_path)
# Test how svn resolve deals with prop conflicts and other local
@@ -294,7 +289,7 @@ def resolved_on_wc_root(sbox):
# Commit mods
svntest.main.file_append(i, "changed iota.\n")
svntest.main.file_append(g, "changed gamma.\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', B)
expected_output = svntest.wc.State(wc, {
@@ -308,9 +303,7 @@ def resolved_on_wc_root(sbox):
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None,
- wc)
+ expected_status)
# Go back to rev 1
expected_output = svntest.wc.State(wc, {
@@ -324,12 +317,12 @@ def resolved_on_wc_root(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
'-r1', wc)
# Deletions so that the item becomes unversioned and
# will have a tree-conflict upon update.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', i, B, g)
# Update so that conflicts appear
@@ -356,7 +349,7 @@ def resolved_on_wc_root(sbox):
expected_output,
expected_disk,
None,
- None, None, None, None, None, False,
+ [], False,
wc)
svntest.actions.run_and_verify_unquiet_status(wc, expected_status)
@@ -367,6 +360,7 @@ def resolved_on_wc_root(sbox):
svntest.actions.run_and_verify_unquiet_status(wc, expected_status)
#----------------------------------------------------------------------
+@SkipUnless(svntest.main.server_has_mergeinfo)
def resolved_on_deleted_item(sbox):
"resolved on deleted item"
@@ -384,7 +378,7 @@ def resolved_on_deleted_item(sbox):
A2_url = sbox.repo_url + '/A2'
# make a copy of A
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', A_url, A2_url, '-m', 'm')
expected_output = svntest.wc.State(wc, {
@@ -454,13 +448,13 @@ def resolved_on_deleted_item(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, False,
+ [], False,
wc)
# Create some conflicts...
# Modify the paths in the one directory.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'foo-val', B)
svntest.main.file_append(g, "Modified gamma.\n")
@@ -473,12 +467,10 @@ def resolved_on_deleted_item(sbox):
svntest.actions.run_and_verify_commit(wc,
expected_output,
- expected_status,
- None,
- wc)
+ expected_status)
# Delete the paths in the second directory.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', B2, g2)
expected_output = svntest.wc.State(wc, {
@@ -494,7 +486,7 @@ def resolved_on_deleted_item(sbox):
svntest.actions.run_and_verify_commit(wc,
expected_output,
expected_status,
- None,
+ [],
A2)
# Now merge A to A2, creating conflicts...
@@ -547,7 +539,7 @@ def resolved_on_deleted_item(sbox):
expected_mergeinfo_output,
expected_elision_output,
expected_disk, None, expected_skip,
- None, dry_run = False)
+ [], dry_run = False)
svntest.actions.run_and_verify_unquiet_status(A2, expected_status)
# Now resolve by recursing on the working copy root.
@@ -570,7 +562,7 @@ def theirs_conflict_in_subdir(sbox):
alpha_path2 = os.path.join(wc2, 'A', 'B', 'E', 'alpha')
svntest.main.file_append(alpha_path, "Modified alpha.\n")
- svntest.main.run_svn(None, 'ci', '-m', 'logmsg', wc)
+ sbox.simple_commit(message='logmsg')
svntest.main.file_append(alpha_path2, "Modified alpha, too.\n")
svntest.main.run_svn(None, 'up', wc2)
@@ -606,6 +598,66 @@ def multi_range_merge_with_accept(sbox):
svntest.main.run_svn(None, 'merge', '-c4,3', '^/iota', 'iota',
'--accept=theirs-conflict')
+#----------------------------------------------------------------------
+
+# Test for issue #4647 'auto resolution mine-full fails on binary file'
+@Issue(4647)
+def automatic_binary_conflict_resolution(sbox):
+ "resolve -R --accept [base | mf | tf] binary file"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Some paths we'll care about
+ A_COPY_path = os.path.join(wc_dir, "A_COPY")
+
+ # Add a binary file to the project in revision 2.
+ theta_contents = open(os.path.join(sys.path[0], "theta.bin"), 'rb').read()
+ theta_path = sbox.ospath('A/theta')
+ svntest.main.file_write(theta_path, theta_contents, 'wb')
+ svntest.main.run_svn(None, 'add', theta_path)
+ svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+ # Branch A to A_COPY in revision 3.
+ svntest.main.run_svn(None, 'copy', wc_dir + "/A", A_COPY_path)
+ svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+ # Modify the binary file on trunk and in the branch, so that both versions
+ # differ.
+ theta_branch_path = sbox.ospath('A_COPY/theta')
+ svntest.main.file_append_binary(theta_path, theta_contents)
+ svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+ svntest.main.file_append_binary(theta_branch_path, theta_contents)
+ svntest.main.file_append_binary(theta_branch_path, theta_contents)
+ svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+ # Run an svn update now to prevent mixed-revision working copy [1:4] error.
+ svntest.main.run_svn(None, 'update', wc_dir)
+
+
+ def do_binary_conflicting_merge():
+ svntest.actions.run_and_verify_svn(None, [],
+ 'revert', '--recursive', A_COPY_path)
+ svntest.main.run_svn(None, 'merge', sbox.repo_url + "/A/theta", wc_dir + "/A_COPY/theta")
+
+ # Test 'svn resolve -R --accept base'
+ do_binary_conflicting_merge()
+ svntest.actions.run_and_verify_resolve([theta_branch_path],
+ '-R', '--accept', 'base',
+ A_COPY_path)
+
+ # Test 'svn resolve -R --accept mine-full'
+ do_binary_conflicting_merge()
+ svntest.actions.run_and_verify_resolve([theta_branch_path],
+ '-R', '--accept', 'mine-full',
+ A_COPY_path)
+
+ # Test 'svn resolve -R --accept theirs-full'
+ do_binary_conflicting_merge()
+ svntest.actions.run_and_verify_resolve([theta_branch_path],
+ '-R', '--accept', 'tf',
+ A_COPY_path)
+
########################################################################
# Run the tests
@@ -619,6 +671,7 @@ test_list = [ None,
resolved_on_deleted_item,
theirs_conflict_in_subdir,
multi_range_merge_with_accept,
+ automatic_binary_conflict_resolution,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/revert_tests.py b/subversion/tests/cmdline/revert_tests.py
index cf7b1fc..3d718e6 100755
--- a/subversion/tests/cmdline/revert_tests.py
+++ b/subversion/tests/cmdline/revert_tests.py
@@ -64,11 +64,11 @@ def revert_replacement_with_props(sbox, wc_copy):
# Set props on file which is copy-source later on
pi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'phony-prop', '-F', prop_path,
pi_path)
os.remove(prop_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:eol-style', 'LF', rho_path)
# Verify props having been set
@@ -91,14 +91,13 @@ def revert_replacement_with_props(sbox, wc_copy):
expected_status.tweak('A/D/G/rho', wc_rev='2')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Bring wc into sync
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# File scheduled for deletion
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
# Status before attempting copies
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
@@ -111,7 +110,7 @@ def revert_replacement_with_props(sbox, wc_copy):
else:
pi_src = sbox.repo_url + '/A/D/G/pi'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', pi_src, rho_path)
# Verify both content and props have been copied
@@ -131,7 +130,7 @@ def revert_replacement_with_props(sbox, wc_copy):
expected_status.tweak('A/D/G/rho', status=' ', copied=None, wc_rev='2')
expected_output = ["Reverted '" + rho_path + "'\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '-R', wc_dir)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -175,18 +174,18 @@ def revert_from_wc_root(sbox):
svntest.main.file_append(rho_path, "Added some text to 'rho'.\n")
svntest.main.file_append(zeta_path, "Added some text to 'zeta'.\n")
- svntest.actions.run_and_verify_svn("Add command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', zeta_path)
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
gamma_path)
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
iota_path)
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
'.')
- svntest.actions.run_and_verify_svn("Add prop command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'random-prop', 'propvalue',
'A')
@@ -202,25 +201,25 @@ def revert_from_wc_root(sbox):
svntest.actions.run_and_verify_status('', expected_output)
# Run revert
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', beta_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', gamma_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', iota_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', rho_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', zeta_path)
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '.')
- svntest.actions.run_and_verify_svn("Revert command", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', 'A')
# Verify unmodified status.
@@ -303,13 +302,13 @@ def revert_reexpand_keyword(sbox):
# This commit fails because newfile2_path is missing, but only after
# we call svn_wc__internal_file_modified_p() on new_file.
- svntest.actions.run_and_verify_commit(wc_dir, None, None, "2' is scheduled"+
- " for addition, but is missing",
+ svntest.actions.run_and_verify_commit(wc_dir, None, None, ".*2' is scheduled"+
+ " for addition, but is missing.*",
newfile_path, newfile2_path,
'-m', "Shouldn't be committed")
# Revert the file. The file is not reverted!
- svntest.actions.run_and_verify_svn(None, [], [], 'revert', newfile_path)
+ svntest.actions.run_and_verify_svn([], [], 'revert', newfile_path)
#----------------------------------------------------------------------
@@ -326,7 +325,7 @@ def revert_replaced_file_without_props(sbox):
# Add a new file, file1, that has no prop-base
svntest.main.file_append(file1_path, "This is the file 'file1' revision 2.")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', file1_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', file1_path)
# commit file1
expected_output = svntest.wc.State(wc_dir, {
@@ -339,10 +338,10 @@ def revert_replaced_file_without_props(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# delete file1
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', file1_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', file1_path)
# test that file1 is scheduled for deletion.
expected_status.tweak('file1', status='D ')
@@ -350,14 +349,14 @@ def revert_replaced_file_without_props(sbox):
# recreate and add file1
svntest.main.file_append(file1_path, "This is the file 'file1' revision 3.")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', file1_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', file1_path)
# Test to see if file1 is schedule for replacement
expected_status.tweak('file1', status='R ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# revert file1
- svntest.actions.run_and_verify_svn(None, ["Reverted '" + file1_path + "'\n"],
+ svntest.actions.run_and_verify_svn(["Reverted '" + file1_path + "'\n"],
[], 'revert', file1_path)
# test that file1 really was reverted
@@ -389,7 +388,7 @@ def revert_moved_file(sbox):
'D ' + iota + '\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mv', iota,
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mv', iota,
iota_moved)
# svn st
@@ -405,7 +404,7 @@ def revert_moved_file(sbox):
# svn revert iota
expected_stdout = ["Reverted '" + iota + "'\n"]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'revert',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'revert',
iota)
# svn st
@@ -429,7 +428,7 @@ def revert_file_merge_replace_with_history(sbox):
# File scheduled for deletion
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/rho', status='D ')
@@ -444,13 +443,12 @@ def revert_file_merge_replace_with_history(sbox):
# Commit rev 2
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# create new rho file
svntest.main.file_write(rho_path, "new rho\n")
# Add the new file
- svntest.actions.run_and_verify_svn(None, None, [], 'add', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', rho_path)
# Commit revsion 3
expected_status.add({
@@ -463,7 +461,7 @@ def revert_file_merge_replace_with_history(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- None, None, wc_dir)
+ None)
# Update working copy
expected_output = svntest.wc.State(wc_dir, {})
@@ -501,7 +499,6 @@ def revert_file_merge_replace_with_history(sbox):
# Now revert
svntest.actions.run_and_verify_svn(None,
- None,
[], 'revert', rho_path)
# test that rho really was reverted
@@ -535,7 +532,7 @@ def revert_after_second_replace(sbox):
# File scheduled for deletion
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', rho_path)
# Status before attempting copy
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -545,14 +542,14 @@ def revert_after_second_replace(sbox):
# Replace file for the first time
pi_src = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', pi_src, rho_path)
expected_status.tweak('A/D/G/rho', status='R ', copied='+', wc_rev='-')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now delete replaced file.
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--force', rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force', rho_path)
# Status should be same as after first delete
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -562,13 +559,13 @@ def revert_after_second_replace(sbox):
# Replace file for the second time
pi_src = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', pi_src, rho_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', pi_src, rho_path)
expected_status.tweak('A/D/G/rho', status='R ', copied='+', wc_rev='-')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now revert
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R', wc_dir)
# Check disk status
@@ -608,9 +605,9 @@ def revert_after_manual_conflict_resolution__text(sbox):
os.remove(iota_path_2 + '.r2')
# Verify no output from status, diff, or revert
- svntest.actions.run_and_verify_svn(None, [], [], "status", wc_dir_2)
- svntest.actions.run_and_verify_svn(None, [], [], "diff", wc_dir_2)
- svntest.actions.run_and_verify_svn(None, [], [], "revert", "-R", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "status", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "diff", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "revert", "-R", wc_dir_2)
def revert_after_manual_conflict_resolution__prop(sbox):
"revert after manual property-conflict resolution"
@@ -636,9 +633,9 @@ def revert_after_manual_conflict_resolution__prop(sbox):
os.remove(iota_path_2 + '.prej')
# Verify no output from status, diff, or revert
- svntest.actions.run_and_verify_svn(None, [], [], "status", wc_dir_2)
- svntest.actions.run_and_verify_svn(None, [], [], "diff", wc_dir_2)
- svntest.actions.run_and_verify_svn(None, [], [], "revert", "-R", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "status", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "diff", wc_dir_2)
+ svntest.actions.run_and_verify_svn([], [], "revert", "-R", wc_dir_2)
def revert_propset__dir(sbox):
"revert a simple propset on a dir"
@@ -648,7 +645,7 @@ def revert_propset__dir(sbox):
a_path = os.path.join(wc_dir, 'A')
svntest.main.run_svn(None, 'propset', 'foo', 'x', a_path)
expected_output = re.escape("Reverted '" + a_path + "'")
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert",
a_path)
def revert_propset__file(sbox):
@@ -659,7 +656,7 @@ def revert_propset__file(sbox):
iota_path = os.path.join(wc_dir, 'iota')
svntest.main.run_svn(None, 'propset', 'foo', 'x', iota_path)
expected_output = re.escape("Reverted '" + iota_path + "'")
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert",
iota_path)
def revert_propdel__dir(sbox):
@@ -673,7 +670,7 @@ def revert_propdel__dir(sbox):
'commit', '-m', 'ps', a_path)
svntest.main.run_svn(None, 'propdel', 'foo', a_path)
expected_output = re.escape("Reverted '" + a_path + "'")
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert",
a_path)
def revert_propdel__file(sbox):
@@ -687,7 +684,7 @@ def revert_propdel__file(sbox):
'commit', '-m', 'ps', iota_path)
svntest.main.run_svn(None, 'propdel', 'foo', iota_path)
expected_output = re.escape("Reverted '" + iota_path + "'")
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert",
iota_path)
def revert_replaced_with_history_file_1(sbox):
@@ -699,7 +696,7 @@ def revert_replaced_with_history_file_1(sbox):
mu_path = os.path.join(wc_dir, 'A', 'mu')
# Remember the original text of 'mu'
- exit_code, text_r1, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, text_r1, err = svntest.actions.run_and_verify_svn(None, [],
'cat', mu_path)
# delete mu and replace it with a copy of iota
svntest.main.run_svn(None, 'rm', mu_path)
@@ -714,8 +711,7 @@ def revert_replaced_with_history_file_1(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# update the working copy
svntest.main.run_svn(None, 'up', wc_dir)
@@ -755,20 +751,19 @@ def revert_replaced_with_history_file_1(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Verify the content of 'mu'
- svntest.actions.run_and_verify_svn(None, text_r1, [], 'cat', mu_path)
+ svntest.actions.run_and_verify_svn(text_r1, [], 'cat', mu_path)
# situation: no local modifications, mu has its original content again.
# revert 'mu' locally, shouldn't change a thing.
- svntest.actions.run_and_verify_svn(None, [], [], "revert",
+ svntest.actions.run_and_verify_svn([], [], "revert",
mu_path)
# Verify the content of 'mu'
- svntest.actions.run_and_verify_svn(None, text_r1, [], 'cat', mu_path)
+ svntest.actions.run_and_verify_svn(text_r1, [], 'cat', mu_path)
#----------------------------------------------------------------------
# Test for issue #2804.
@@ -780,9 +775,9 @@ def status_of_missing_dir_after_revert(sbox):
wc_dir = sbox.wc_dir
A_D_G_path = os.path.join(wc_dir, "A", "D", "G")
- svntest.actions.run_and_verify_svn(None, None, [], "rm", A_D_G_path)
+ svntest.actions.run_and_verify_svn(None, [], "rm", A_D_G_path)
expected_output = re.escape("Reverted '" + A_D_G_path + "'")
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert",
A_D_G_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -796,7 +791,7 @@ def status_of_missing_dir_after_revert(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# When using single-db, we can get back to the virginal state.
- svntest.actions.run_and_verify_svn(None, None, [], "revert",
+ svntest.actions.run_and_verify_svn(None, [], "revert",
"-R", A_D_G_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -814,7 +809,7 @@ def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):
# delete A/D/G and commit
G_path = os.path.join(wc_dir, "A", "D", "G")
- svntest.actions.run_and_verify_svn(None, None, [], "rm", G_path)
+ svntest.actions.run_and_verify_svn(None, [], "rm", G_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/D/G', 'A/D/G/rho', 'A/D/G/pi', 'A/D/G/tau')
expected_output = svntest.wc.State(wc_dir, {
@@ -822,12 +817,11 @@ def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# copy A/D/G from A/B/E and commit
E_path = os.path.join(wc_dir, "A", "B", "E")
- svntest.actions.run_and_verify_svn(None, None, [], "cp", E_path, G_path)
+ svntest.actions.run_and_verify_svn(None, [], "cp", E_path, G_path)
expected_status.add({
'A/D/G' : Item(status=' ', wc_rev='3'),
'A/D/G/alpha' : Item(status=' ', wc_rev='3'),
@@ -838,8 +832,7 @@ def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# update the working copy
svntest.main.run_svn(None, 'up', wc_dir)
@@ -887,10 +880,10 @@ def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):
expected_output = svntest.verify.UnorderedOutput([
"Reverted '%s'\n" % path for path in revert_paths])
- svntest.actions.run_and_verify_svn(None, expected_output, [], "revert", "-R",
+ svntest.actions.run_and_verify_svn(expected_output, [], "revert", "-R",
G_path)
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
"status", wc_dir)
svntest.main.safe_rmtree(G_path)
@@ -899,7 +892,7 @@ def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):
["! " + G_path + "\n",
"! " + os.path.join(G_path, "alpha") + "\n",
"! " + os.path.join(G_path, "beta") + "\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [], "status",
+ svntest.actions.run_and_verify_svn(expected_output, [], "status",
wc_dir)
# Test for issue #2928.
@@ -929,8 +922,7 @@ def revert_replaced_with_history_file_2(sbox):
expected_status.tweak('A/mu', status=' ', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@@ -973,7 +965,7 @@ def revert_tree_conflicts_in_updated_files(sbox):
expected_disk.remove('A/D/G/tau')
# Revert individually in wc
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', G_pi, G_rho, G_tau)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
svntest.actions.verify_disk(wc_dir, expected_disk)
@@ -988,7 +980,7 @@ def revert_tree_conflicts_in_updated_files(sbox):
expected_status.wc_dir = wc_dir_2
# Revert recursively in wc 2
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '-R', G2)
svntest.actions.run_and_verify_status(wc_dir_2, expected_status)
svntest.actions.verify_disk(wc_dir_2, expected_disk)
@@ -1000,7 +992,7 @@ def revert_add_over_not_present_dir(sbox):
wc_dir = sbox.wc_dir
main.run_svn(None, 'rm', os.path.join(wc_dir, 'A/C'))
- main.run_svn(None, 'ci', wc_dir, '-m', 'Deleted dir')
+ sbox.simple_commit(message='Deleted dir')
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/C')
@@ -1019,7 +1011,7 @@ def revert_added_tree(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', sbox.ospath('X'), sbox.ospath('X/Y'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({
@@ -1030,7 +1022,7 @@ def revert_added_tree(sbox):
# Revert is non-recursive and fails, status is unchanged
expected_error = '.*Try \'svn revert --depth infinity\'.*'
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'revert', sbox.ospath('X'))
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1041,7 +1033,7 @@ def revert_child_of_copy(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp',
sbox.ospath('A/B/E'),
sbox.ospath('A/B/E2'))
@@ -1058,13 +1050,13 @@ def revert_child_of_copy(sbox):
# First revert removes text change, child is still copied
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E2/beta')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E2/beta'))
expected_status.tweak('A/B/E2/beta', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Second revert of child does nothing, child is still copied
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', sbox.ospath('A/B/E2/beta'))
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1075,7 +1067,7 @@ def revert_non_recusive_after_delete(sbox):
sbox.build(read_only=True)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', sbox.ospath('A/B'))
+ svntest.actions.run_and_verify_svn(None, [], 'rm', sbox.ospath('A/B'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/B', 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F',
'A/B/lambda', status='D ')
@@ -1083,19 +1075,19 @@ def revert_non_recusive_after_delete(sbox):
# This appears to work but gets the op-depth wrong
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B'))
expected_status.tweak('A/B', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', sbox.ospath('A/B/E'))
expected_status.tweak('A/B/E', status='R ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Since the op-depth was wrong A/B/E erroneously remains deleted
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E'))
expected_status.tweak('A/B/E', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -1143,7 +1135,7 @@ def revert_permissions_only(sbox):
os.chmod(sbox.ospath('A/B/E/alpha'), 0444) # read-only
is_readonly(sbox.ospath('A/B/E/alpha'))
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E/alpha')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E/alpha'))
is_writable(sbox.ospath('A/B/E/alpha'))
@@ -1151,14 +1143,14 @@ def revert_permissions_only(sbox):
os.chmod(sbox.ospath('A/B/E/beta'), 0777) # executable
is_executable(sbox.ospath('A/B/E/beta'))
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E/beta')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E/beta'))
is_non_executable(sbox.ospath('A/B/E/beta'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:needs-lock', '1',
sbox.ospath('A/B/E/alpha'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:executable', '1',
sbox.ospath('A/B/E/beta'))
@@ -1171,13 +1163,12 @@ def revert_permissions_only(sbox):
expected_status.tweak('A/B/E/beta', wc_rev='2')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
os.chmod(sbox.ospath('A/B/E/alpha'), 0666) # not read-only
is_writable(sbox.ospath('A/B/E/alpha'))
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E/alpha')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E/alpha'))
is_readonly(sbox.ospath('A/B/E/alpha'))
@@ -1185,18 +1176,18 @@ def revert_permissions_only(sbox):
os.chmod(sbox.ospath('A/B/E/beta'), 0666) # not executable
is_non_executable(sbox.ospath('A/B/E/beta'))
expected_output = ["Reverted '%s'\n" % sbox.ospath('A/B/E/beta')]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', sbox.ospath('A/B/E/beta'))
is_executable(sbox.ospath('A/B/E/beta'))
# copied file is always writeable
sbox.simple_update()
expected_output = ["A %s\n" % sbox.ospath('A/B/E2')]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'copy',
sbox.ospath('A/B/E'),
sbox.ospath('A/B/E2'))
is_writable(sbox.ospath('A/B/E2/alpha'))
- svntest.actions.run_and_verify_svn(None, [], [],
+ svntest.actions.run_and_verify_svn([], [],
'revert', sbox.ospath('A/B/E2/alpha'))
is_writable(sbox.ospath('A/B/E2/alpha'))
@@ -1208,7 +1199,7 @@ def revert_copy_depth_files(sbox):
sbox.build(read_only=True)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy',
sbox.ospath('A/B/E'),
sbox.ospath('A/B/E2'))
@@ -1226,7 +1217,7 @@ def revert_copy_depth_files(sbox):
'A/B/E2/alpha',
'A/B/E2/beta']])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '--depth', 'files',
sbox.ospath('A/B/E2'))
@@ -1241,7 +1232,7 @@ def revert_nested_add_depth_immediates(sbox):
sbox.build(read_only=True)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '--parents', sbox.ospath('A/X/Y'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1254,7 +1245,7 @@ def revert_nested_add_depth_immediates(sbox):
expected_output = svntest.verify.UnorderedOutput([
"Reverted '%s'\n" % sbox.ospath(path) for path in ['A/X', 'A/X/Y']])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', '--depth', 'immediates',
sbox.ospath('A/X'))
@@ -1272,7 +1263,7 @@ def create_superflous_actual_node(sbox):
sbox.simple_update()
# Create a NODES row with op-depth>0
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', '-r', '1',
sbox.repo_url + '/A/B/E/alpha',
sbox.ospath('alpha'))
@@ -1284,7 +1275,7 @@ def create_superflous_actual_node(sbox):
})
svntest.actions.run_and_verify_status(wc_dir, expected_status)
svntest.main.file_append(sbox.ospath('alpha'), 'my text\n')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '--accept', 'postpone',
'^/A/B/E/alpha', sbox.ospath('alpha'))
expected_status.tweak('alpha', status='CM', entry_status='A ')
@@ -1300,6 +1291,7 @@ def create_superflous_actual_node(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@Issue(3859)
+@SkipUnless(svntest.main.server_has_mergeinfo)
def revert_empty_actual(sbox):
"revert with superfluous actual node"
@@ -1307,8 +1299,7 @@ def revert_empty_actual(sbox):
wc_dir = sbox.wc_dir
# Non-recursive code path works
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '%s'\n" % sbox.ospath('alpha')],
+ svntest.actions.run_and_verify_svn(["Reverted '%s'\n" % sbox.ospath('alpha')],
[],
'revert', sbox.ospath('alpha'))
@@ -1316,16 +1307,16 @@ def revert_empty_actual(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@Issue(3859)
+@SkipUnless(svntest.main.server_has_mergeinfo)
def revert_empty_actual_recursive(sbox):
- "recusive revert with superfluous actual node"
+ "recursive revert with superfluous actual node"
create_superflous_actual_node(sbox)
wc_dir = sbox.wc_dir
# Recursive code path fails, the superfluous actual node suppresses the
# notification
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '%s'\n" % sbox.ospath('alpha')],
+ svntest.actions.run_and_verify_svn(["Reverted '%s'\n" % sbox.ospath('alpha')],
[],
'revert', '-R', sbox.ospath('alpha'))
@@ -1502,7 +1493,7 @@ def create_no_text_change_conflict(sbox):
# Update to create a conflict
svntest.main.file_append(sbox.ospath('A/B/E/alpha'), 'my text\n')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r1', '--accept', 'postpone',
wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1520,8 +1511,7 @@ def revert_no_text_change_conflict(sbox):
create_no_text_change_conflict(sbox)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '%s'\n"
+ svntest.actions.run_and_verify_svn(["Reverted '%s'\n"
% sbox.ospath('A/B/E/alpha')],
[],
'revert', sbox.ospath('A/B/E/alpha'))
@@ -1536,8 +1526,7 @@ def revert_no_text_change_conflict_recursive(sbox):
create_no_text_change_conflict(sbox)
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None,
- ["Reverted '%s'\n"
+ svntest.actions.run_and_verify_svn(["Reverted '%s'\n"
% sbox.ospath('A/B/E/alpha')],
[],
'revert', '-R', wc_dir)
@@ -1573,7 +1562,7 @@ def revert_with_unversioned_targets(sbox):
"Skipped '%s'\n" % sbox.ospath('A/D/H/delta'),
"Reverted '%s'\n" % sbox.ospath('A/D/H/psi'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'revert', chi_path, delta_path, psi_path)
# verify status
@@ -1593,7 +1582,7 @@ def revert_with_unversioned_targets(sbox):
def revert_nonexistent(sbox):
'svn revert -R nonexistent'
sbox.build(read_only=True)
- svntest.actions.run_and_verify_svn(None, 'Skipped.*nonexistent', [],
+ svntest.actions.run_and_verify_svn('Skipped.*nonexistent', [],
'revert', '-R', sbox.ospath('nonexistent'))
@Issue(4168)
@@ -1609,13 +1598,13 @@ def revert_obstructing_wc(sbox):
# Checkout wc as depth empty
svntest.actions.run_and_verify_checkout(sbox.repo_url, wc_dir,
expected_output, expected_disk,
- None, None, None, None,
+ [],
'--depth', 'empty')
# And create an obstructing working copy as A
svntest.actions.run_and_verify_checkout(sbox.repo_url, wc_dir + '/A',
expected_output, expected_disk,
- None, None, None, None,
+ [],
'--depth', 'empty')
# Now try to fetch the entire wc, which will find an obstruction
@@ -1629,21 +1618,25 @@ def revert_obstructing_wc(sbox):
# A is not versioned but exists
})
- # Use expected_status.old_tree() to avoid doing an entries comparion
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None,
- expected_status.old_tree(),
- None, None, None,
- None, None, None,
+ expected_status,
+ [], False,
wc_dir, '--set-depth', 'infinity')
# Revert should do nothing (no local changes), and report the obstruction
- # (reporting the obstruction is nice for debuging, but not really required
+ # (reporting the obstruction is nice for debugging, but not really required
# in this specific case, as the node was not modified)
- svntest.actions.run_and_verify_svn(None, "Skipped '.*A' -- .*obstruct.*", [],
+ svntest.actions.run_and_verify_svn("Skipped '.*A' -- .*obstruct.*", [],
'revert', '-R', wc_dir)
+def revert_moved_dir_partial(sbox):
+ "partial revert moved_dir"
+
+ sbox.build(read_only = True)
+ sbox.simple_move('A', 'A_')
+ svntest.actions.run_and_verify_svn(None, [], 'revert', sbox.ospath('A'))
########################################################################
@@ -1686,6 +1679,7 @@ test_list = [ None,
revert_with_unversioned_targets,
revert_nonexistent,
revert_obstructing_wc,
+ revert_moved_dir_partial,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/schedule_tests.py b/subversion/tests/cmdline/schedule_tests.py
index d27fbf7..6000588 100755
--- a/subversion/tests/cmdline/schedule_tests.py
+++ b/subversion/tests/cmdline/schedule_tests.py
@@ -184,15 +184,17 @@ def add_executable(sbox):
file_ospath = sbox.ospath(fileName)
if executable:
expected_out = ["*\n"]
+ expected_err = []
else:
expected_out = []
+ expected_err = '.*W200017: Property.*not found'
# create an empty file
open(file_ospath, "w")
os.chmod(file_ospath, perm)
sbox.simple_add(fileName)
- svntest.actions.run_and_verify_svn(None, expected_out, [],
+ svntest.actions.run_and_verify_svn(expected_out, expected_err,
'propget', "svn:executable", file_ospath)
test_cases = [
@@ -276,7 +278,7 @@ def revert_add_files(sbox):
epsilon_path = sbox.ospath('A/D/G/epsilon')
files = [delta_path, zeta_path, epsilon_path]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -296,7 +298,7 @@ def revert_add_directories(sbox):
Z_path = sbox.ospath('A/D/H/Z')
files = [X_path, Y_path, Z_path]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -322,7 +324,7 @@ def revert_nested_adds(sbox):
+ [os.path.join(Z_path, child)
for child in ['R', 'zeta']])
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -343,7 +345,7 @@ def revert_add_executable(sbox):
other_path = sbox.ospath('other_exe')
files = [all_path, none_path, user_path, group_path, other_path]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -364,7 +366,7 @@ def revert_delete_files(sbox):
omega_path = sbox.ospath('A/D/H/omega')
files = [iota_path, mu_path, omega_path, rho_path]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -390,7 +392,7 @@ def revert_delete_dirs(sbox):
files = [E_path, F_path, H_path,
alpha_path, beta_path, chi_path, omega_path, psi_path]
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'revert',
'--recursive',
wc_dir)
@@ -493,8 +495,7 @@ def delete_missing(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Regression test for issue #854:
@@ -553,7 +554,7 @@ def status_add_deleted_directory(sbox):
# Update will *not* remove the entry for A despite it being marked
# deleted.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(2), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(2), [],
'up', wc_dir)
expected_status.tweak('', 'iota', wc_rev=2)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -567,10 +568,9 @@ def status_add_deleted_directory(sbox):
def add_recursive_already_versioned(sbox):
"'svn add' should traverse already-versioned dirs"
+ sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.make_repo_and_wc(sbox)
-
# Create some files, then schedule them for addition
delta_path = sbox.ospath('delta')
zeta_path = sbox.ospath('A/B/zeta')
@@ -616,8 +616,7 @@ def fail_add_directory(sbox):
os.makedirs(sbox.wc_dir)
os.chdir(sbox.wc_dir)
- svntest.actions.run_and_verify_svn('Failed mkdir',
- None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'mkdir', 'A')
if os.path.exists('A'):
raise svntest.Failure('svn mkdir created an unversioned directory')
@@ -636,7 +635,7 @@ def delete_non_existent(sbox):
wc_dir = sbox.wc_dir
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
'rm', '--force', 'non-existent')
@@ -651,7 +650,7 @@ def delete_redelete_fudgery(sbox):
B_path = os.path.join(wc_dir, 'A', 'B')
# Delete 'A/B' using --keep-local, then remove at the OS level.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--keep-local', B_path)
svntest.main.safe_rmtree(B_path)
@@ -669,10 +668,10 @@ def delete_redelete_fudgery(sbox):
### information stored now in the working copy root's one DB. That
### could change the whole flow of this test, possible leading us to
### remove it as altogether irrelevant. --cmpilato
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
# Now try to run
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '--keep-local', B_path)
def propset_on_deleted_should_fail(sbox):
@@ -681,9 +680,9 @@ def propset_on_deleted_should_fail(sbox):
wc_dir = sbox.wc_dir
iota = os.path.join(wc_dir, 'iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', iota)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', iota)
- svntest.actions.run_and_verify_svn(None, None, "svn: E155023: Can't set propert.*",
+ svntest.actions.run_and_verify_svn(None, "svn: E155023: Can't set propert.*",
'ps', 'prop', 'val', iota)
@Issue(3468)
@@ -721,8 +720,7 @@ def replace_dir_delete_child(sbox):
svntest.actions.run_and_verify_commit(sbox.wc_dir,
expected_output,
- expected_status,
- None, sbox.wc_dir)
+ expected_status)
########################################################################
diff --git a/subversion/tests/cmdline/special_tests.py b/subversion/tests/cmdline/special_tests.py
index 6340002..2af1529 100755
--- a/subversion/tests/cmdline/special_tests.py
+++ b/subversion/tests/cmdline/special_tests.py
@@ -86,20 +86,19 @@ def general_symlink(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
## Now we should update to the previous version, verify that no
## symlink is present, then update back to HEAD and see if the symlink
## is regenerated properly.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1', wc_dir)
# Is the symlink gone?
if os.path.isfile(newfile_path) or os.path.islink(newfile_path):
raise svntest.Failure
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '2', wc_dir)
# Is the symlink back?
@@ -118,7 +117,7 @@ def general_symlink(sbox):
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [ "M newfile\n" ], [], 'st')
+ svntest.actions.run_and_verify_svn([ "M newfile\n" ], [], 'st')
os.chdir(was_cwd)
@@ -133,7 +132,7 @@ def general_symlink(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
@SkipUnless(svntest.main.is_posix_os)
@@ -152,7 +151,7 @@ def replace_file_with_symlink(sbox):
# Does status show the obstruction?
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [ "~ iota\n" ], [], 'st')
+ svntest.actions.run_and_verify_svn([ "~ iota\n" ], [], 'st')
# And does a commit fail?
os.chdir(was_cwd)
@@ -183,7 +182,7 @@ def import_export_symlink(sbox):
# import this symlink into the repository
url = sbox.repo_url + "/dirA/dirB/new_link"
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- 'Import a symlink', None, [], 'import',
+ None, [], 'import',
'-m', 'log msg', new_path, url)
regex = "(Committed|Imported) revision [0-9]+."
@@ -197,7 +196,7 @@ def import_export_symlink(sbox):
os.remove(new_path)
# run update and verify that the symlink is put back into place
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# Is the symlink back?
@@ -213,7 +212,7 @@ def import_export_symlink(sbox):
for export_src, dest_dir in [(sbox.wc_dir, 'export-wc'),
(sbox.repo_url, 'export-url')]:
export_target = sbox.add_wc_path(dest_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'export', export_src, export_target)
# is the link at the correct place?
@@ -250,11 +249,11 @@ def copy_tree_with_symlink(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Copy H to H2
H_path = os.path.join(wc_dir, 'A', 'D', 'H')
H2_path = os.path.join(wc_dir, 'A', 'D', 'H2')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', H_path, H2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', H_path, H2_path)
# 'svn status' should show just "A/D/H2 A +". Nothing broken.
expected_status.add({
@@ -297,7 +296,7 @@ def replace_symlink_with_file(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now replace the symlink with a normal file and try to commit, we
@@ -308,7 +307,7 @@ def replace_symlink_with_file(sbox):
# Does status show the obstruction?
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [ "~ newfile\n" ], [], 'st')
+ svntest.actions.run_and_verify_svn([ "~ newfile\n" ], [], 'st')
# And does a commit fail?
os.chdir(was_cwd)
@@ -350,10 +349,10 @@ def remove_symlink(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now remove it
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', newfile_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', newfile_path)
# Commit and verify that it worked
expected_output = svntest.wc.State(wc_dir, {
@@ -366,7 +365,7 @@ def remove_symlink(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -395,8 +394,7 @@ def merge_symlink_into_file(sbox):
'A/Dprime/gamma' : Item(verb='Deleting'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# Commit a symlink in its place
linktarget_path = os.path.join(wc_dir, 'linktarget')
@@ -407,8 +405,7 @@ def merge_symlink_into_file(sbox):
'A/Dprime/gamma' : Item(verb='Adding'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# merge the creation of the symlink into the original directory
svntest.main.run_svn(None,
@@ -430,8 +427,7 @@ def merge_symlink_into_file(sbox):
'A/D/gamma' : Item(verb='Replacing'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
@@ -460,8 +456,7 @@ def merge_file_into_symlink(sbox):
'A/Dprime/gamma' : Item(verb='Deleting'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# Commit a symlink in its place
linktarget_path = os.path.join(wc_dir, 'linktarget')
@@ -472,8 +467,7 @@ def merge_file_into_symlink(sbox):
'A/Dprime/gamma' : Item(verb='Adding'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
svntest.main.file_write(gamma_path, 'changed file', 'w+')
@@ -481,8 +475,7 @@ def merge_file_into_symlink(sbox):
'A/D/gamma' : Item(verb='Sending'),
})
- svntest.actions.run_and_verify_commit(wc_dir, expected_output, None, None,
- wc_dir)
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output, None)
# ok, now merge the change to the file into the symlink we created, this
# gives us a weird error
@@ -498,7 +491,8 @@ def checkout_repo_with_symlinks(sbox):
svntest.actions.load_repo(sbox, os.path.join(os.path.dirname(sys.argv[0]),
'special_tests_data',
- 'symlink.dump'))
+ 'symlink.dump'),
+ create_wc=False)
expected_output = svntest.wc.State(sbox.wc_dir, {
'from': Item(status='A '),
@@ -537,7 +531,7 @@ def diff_symlink_to_dir(sbox):
expected_output = [
"Index: link\n",
"===================================================================\n",
- "--- link\t(revision 0)\n",
+ "--- link\t(nonexistent)\n",
"+++ link\t(working copy)\n",
"@@ -0,0 +1 @@\n",
"+link A/D\n",
@@ -550,10 +544,10 @@ def diff_symlink_to_dir(sbox):
"+*\n",
"\\ No newline at end of property\n"
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff',
'.')
# We should get the same output if we the diff the symlink itself.
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff', 'link')
+ svntest.actions.run_and_verify_svn(expected_output, [], 'diff', 'link')
#----------------------------------------------------------------------
# Issue 2692 (part of): Check that the client can check out a repository
@@ -564,7 +558,8 @@ def checkout_repo_with_unknown_special_type(sbox):
svntest.actions.load_repo(sbox, os.path.join(os.path.dirname(sys.argv[0]),
'special_tests_data',
- 'bad-special-type.dump'))
+ 'bad-special-type.dump'),
+ create_wc=False)
expected_output = svntest.wc.State(sbox.wc_dir, {
'special': Item(status='A '),
@@ -595,7 +590,7 @@ def replace_symlink_with_dir(sbox):
# Does status show the obstruction?
was_cwd = os.getcwd()
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [ "~ from\n" ], [], 'st')
+ svntest.actions.run_and_verify_svn([ "~ from\n" ], [], 'st')
# The commit shouldn't do anything.
# I'd expect a failed commit here, but replacing a file locally with a
@@ -604,46 +599,84 @@ def replace_symlink_with_dir(sbox):
expected_output = svntest.wc.State(wc_dir, {
})
- error_re_string = 'E145001: (Entry|Node).*has.*changed (special|kind)'
+ error_re_string = '.*E145001: (Entry|Node).*has.*changed (special|kind).*'
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, error_re_string, wc_dir)
+ None, error_re_string)
# test for issue #1808: svn up deletes local symlink that obstructs
# versioned file
@Issue(1808)
-@SkipUnless(svntest.main.is_posix_os)
def update_obstructing_symlink(sbox):
"symlink obstructs incoming delete"
sbox.build()
wc_dir = sbox.wc_dir
- mu_path = os.path.join(wc_dir, 'A', 'mu')
- mu_url = sbox.repo_url + '/A/mu'
- iota_path = os.path.join(wc_dir, 'iota')
+ mu_path = sbox.ospath('A/mu')
- # delete A/mu and replace it with a symlink
- svntest.main.run_svn(None, 'rm', mu_path)
- os.symlink(iota_path, mu_path)
+ iota_abspath = os.path.abspath(sbox.ospath('iota'))
- svntest.main.run_svn(None, 'rm', mu_url,
- '-m', 'log msg')
+ # delete mu and replace it with an (not-added) symlink
+ sbox.simple_rm('A/mu')
+ sbox.simple_symlink(iota_abspath, 'A/mu')
- svntest.main.run_svn(None,
- 'up', wc_dir)
+ # delete pi and replace it with an added symlink
+ sbox.simple_rm('A/D/G/pi')
+ sbox.simple_add_symlink(iota_abspath, 'A/D/G/pi')
- # check that the symlink is still there
- target = os.readlink(mu_path)
- if target != iota_path:
- raise svntest.Failure
+ if not os.path.exists(mu_path):
+ raise svntest.Failure("mu should be there")
+
+ # Now remove mu and pi in the repository
+ svntest.main.run_svn(None, 'rm', '-m', 'log msg',
+ sbox.repo_url + '/A/mu',
+ sbox.repo_url + '/A/D/G/pi')
+
+ # We expect tree conflicts
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/mu': Item(status=' ', treeconflict='C'),
+ 'A/D/G/pi': Item(status=' ', treeconflict='C')
+ })
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.tweak('A/mu', status='? ', treeconflict='C',
+ wc_rev=None)
+
+ expected_status.tweak('A/D/G/pi', status='A ',treeconflict='C',
+ wc_rev='-')
+
+ svntest.actions.run_and_verify_update(wc_dir,
+ expected_output, None,
+ expected_status)
+
+ expected_info = [
+ {
+ 'Path': re.escape(sbox.ospath('A/D/G/pi')),
+ 'Tree conflict': 'local file replace, incoming file delete or move.*'
+ },
+ {
+ 'Path': re.escape(sbox.ospath('A/mu')),
+ 'Tree conflict': 'local file delete, incoming file delete or move.*'
+ }
+ ]
+
+ svntest.actions.run_and_verify_info(expected_info,
+ sbox.ospath('A/D/G/pi'),
+ sbox.ospath('A/mu'))
+
+ # check that the symlink is still there
+ if not os.path.exists(mu_path):
+ raise svntest.Failure("mu should be there")
+ if svntest.main.is_posix_os():
+ target = os.readlink(mu_path)
+ if target != iota_abspath:
+ raise svntest.Failure("mu no longer points to the same location")
def warn_on_reserved_name(sbox):
"warn when attempt operation on a reserved name"
sbox.build()
reserved_path = os.path.join(sbox.wc_dir, svntest.main.get_admin_name())
svntest.actions.run_and_verify_svn(
- "Locking a file with a reserved name failed to result in an error",
None,
".*Skipping argument: E200025: '.+' ends in a reserved name.*",
'lock', reserved_path)
@@ -666,8 +699,8 @@ def propvalue_normalized(sbox):
# Property value should be SVN_PROP_BOOLEAN_TRUE
expected_propval = ['*']
- svntest.actions.run_and_verify_svn(None, expected_propval, [],
- 'propget', '--strict', 'svn:special',
+ svntest.actions.run_and_verify_svn(expected_propval, [],
+ 'propget', '--no-newline', 'svn:special',
iota2_path)
# Commit and check again.
@@ -679,12 +712,11 @@ def propvalue_normalized(sbox):
'iota2' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
- wc_dir)
+ expected_status)
svntest.main.run_svn(None, 'update', wc_dir)
- svntest.actions.run_and_verify_svn(None, expected_propval, [],
- 'propget', '--strict', 'svn:special',
+ svntest.actions.run_and_verify_svn(expected_propval, [],
+ 'propget', '--no-newline', 'svn:special',
iota2_path)
@@ -702,7 +734,7 @@ def unrelated_changed_special_status(sbox):
os.unlink('psi')
os.symlink('omega', 'psi') # omega is versioned!
svntest.main.run_svn(None, 'changelist', 'chi cl', 'chi')
- svntest.actions.run_and_verify_svn(None, None, [], 'commit',
+ svntest.actions.run_and_verify_svn(None, [], 'commit',
'--changelist', 'chi cl',
'-m', 'psi changed special status')
@@ -728,7 +760,7 @@ def symlink_destination_change(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Modify the symlink to point somewhere else
os.remove(newfile_path)
@@ -746,7 +778,7 @@ def symlink_destination_change(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Issue 3972, repeat revert produces no output
- svntest.actions.run_and_verify_svn(None, [], [], 'revert', '-R', wc_dir)
+ svntest.actions.run_and_verify_svn([], [], 'revert', '-R', wc_dir)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now replace the symlink with a normal file and try to commit, we
@@ -850,8 +882,7 @@ def symlink_to_wc_svnversion(sbox):
symlink_basename = os.path.basename(symlink_path)
# Some basic tests
- svntest.actions.run_and_verify_svnversion("Unmodified symlink to wc",
- symlink_path, sbox.repo_url,
+ svntest.actions.run_and_verify_svnversion(symlink_path, sbox.repo_url,
[ "1\n" ], [])
#----------------------------------------------------------------------
@@ -901,8 +932,7 @@ def update_symlink(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
#----------------------------------------------------------------------
@Issue(4091)
@@ -1108,7 +1138,7 @@ def cat_added_symlink(sbox):
kappa_path = sbox.ospath('kappa')
sbox.simple_add_symlink('iota', 'kappa')
- svntest.actions.run_and_verify_svn(None, "link iota", [],
+ svntest.actions.run_and_verify_svn("link iota", [],
"cat", kappa_path)
#----------------------------------------------------------------------
@@ -1144,8 +1174,7 @@ def incoming_symlink_changes(sbox):
's-in-place' : Item(verb='Sending'),
})
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, None, None,
- wc_dir)
+ expected_output, None)
# r4
svntest.main.run_svnmucc('propdel', 'svn:special',
@@ -1176,7 +1205,6 @@ def incoming_symlink_changes(sbox):
expected_output,
None,
expected_status,
- None, None, None, None, None,
check_props=True)
# Update back to r2, to prepare some local changes
@@ -1193,8 +1221,7 @@ def incoming_symlink_changes(sbox):
expected_output,
None,
expected_status,
- None, None, None, None, None,
- True,
+ [], True,
wc_dir, '-r', '2')
# Ok, now add a property on all of them to make future symlinkness changes
@@ -1218,8 +1245,65 @@ def incoming_symlink_changes(sbox):
expected_output,
None,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
+
+#----------------------------------------------------------------------
+@Issue(4479)
+def multiline_special(sbox):
+ "multiline file with svn:special"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('iota', 'A second line.\n')
+ sbox.simple_commit();
+ tmp = sbox.get_tempname()
+ svntest.main.file_write(tmp, '*', 'w+')
+ svntest.main.run_svnmucc('propsetf', 'svn:special', tmp,
+ sbox.repo_url + '/iota',
+ '-m', 'set svn:special')
+
+ sbox.simple_update(revision=1);
+ sbox.simple_update();
+
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak()
+ expected_disk.tweak('iota',
+ contents="This is the file 'iota'.\nA second line.\n",
+ props={'svn:special' : '*'})
+ svntest.actions.verify_disk(wc_dir, expected_disk.old_tree(), True)
+
+#----------------------------------------------------------------------
+@Issue(4482)
+@XFail(svntest.main.is_posix_os)
+def multiline_symlink_special(sbox):
+ "multiline link file with svn:special"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('dodgy-link1', 'link foo\n')
+ sbox.simple_append('dodgy-link2', 'link foo\nbar\n')
+ svntest.main.run_svnmucc('put', sbox.ospath('dodgy-link1'), 'dodgy-link1',
+ 'put', sbox.ospath('dodgy-link2'), 'dodgy-link2',
+ 'propset', 'svn:special', 'X', 'dodgy-link1',
+ 'propset', 'svn:special', 'X', 'dodgy-link2',
+ '-U', sbox.repo_url,
+ '-m', 'Create dodgy symlinks')
+ os.remove(sbox.ospath('dodgy-link1'))
+ os.remove(sbox.ospath('dodgy-link2'))
+
+ sbox.simple_update();
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'dodgy-link1' : Item(status=' ', wc_rev=2),
+ 'dodgy-link2' : Item(status=' ', wc_rev=2),
+ })
+ # XFAIL: Only content before \n used when creating the link but all
+ # content used when detecting modifications, so the pristine working
+ # copy shows up as modified.
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
########################################################################
# Run the tests
@@ -1252,6 +1336,8 @@ test_list = [ None,
externals_as_symlink_targets,
cat_added_symlink,
incoming_symlink_changes,
+ multiline_special,
+ multiline_symlink_special,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/stat_tests.py b/subversion/tests/cmdline/stat_tests.py
index 6e706ef..602dc76 100755
--- a/subversion/tests/cmdline/stat_tests.py
+++ b/subversion/tests/cmdline/stat_tests.py
@@ -66,7 +66,7 @@ def status_unversioned_file_in_current_dir(sbox):
svntest.main.file_append('foo', 'a new file')
- svntest.actions.run_and_verify_svn(None, [ "? foo\n" ], [],
+ svntest.actions.run_and_verify_svn([ "? foo\n" ], [],
'stat', 'foo')
#----------------------------------------------------------------------
@@ -107,7 +107,7 @@ def status_update_with_nested_adds(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now we go to the backup working copy, still at revision 1.
# We will run 'svn st -u', and make sure that newdir/newfile is reported
@@ -136,7 +136,7 @@ def status_shows_all_in_current_dir(sbox):
wc_dir = sbox.wc_dir
os.chdir(wc_dir)
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'stat', '-vN')
if (len(output) != len(os.listdir("."))):
@@ -155,14 +155,14 @@ def status_missing_file(sbox):
os.remove('iota')
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'status')
for line in output:
if not re.match("! +iota", line):
raise svntest.Failure
# This invocation is for issue #2127.
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'status', '-u',
'iota')
found_it = 0
@@ -213,7 +213,7 @@ def status_type_change(sbox):
expected_output = [s.replace('/', os.path.sep) for s in expected_output]
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[], 'status')
# Now change the file that is obstructing the versioned dir into an
@@ -247,7 +247,7 @@ def status_type_change(sbox):
# Fix separator for Windows
expected_output = [s.replace('/', os.path.sep) for s in expected_output]
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[], 'status')
# Now change the versioned dir that is obstructing the file into an
@@ -255,7 +255,7 @@ def status_type_change(sbox):
svntest.main.safe_rmtree('iota')
os.mkdir('iota')
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[], 'status')
#----------------------------------------------------------------------
@@ -288,7 +288,7 @@ def status_type_change_to_symlink(sbox):
'~ iota\n',
]
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[], 'status')
# "valid" symlinks
@@ -297,7 +297,7 @@ def status_type_change_to_symlink(sbox):
os.symlink('A/mu', 'iota')
os.symlink('C', 'A/D')
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[], 'status')
#----------------------------------------------------------------------
@@ -318,7 +318,7 @@ def status_with_new_files_pending(sbox):
svntest.main.run_svn(None,
'up', '-r', '1')
- exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, err = svntest.actions.run_and_verify_svn(None, [],
'status', '-u')
# The bug fixed in revision 3686 was a segmentation fault.
@@ -353,8 +353,7 @@ def status_for_unignored_file(sbox):
['I newdir\n',
'I newfile\n',
' M .\n'])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
'status', '--no-ignore', '.')
@@ -362,8 +361,7 @@ def status_for_unignored_file(sbox):
expected = svntest.verify.UnorderedOutput(
['I newdir\n',
'I newfile\n'])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
'status', 'newdir', 'newfile')
@@ -379,7 +377,7 @@ def status_for_nonexistent_file(sbox):
os.chdir(wc_dir)
exit_code, output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'status', 'nonexistent-file')
+ None, [], 'status', 'nonexistent-file')
# there should *not* be a status line printed for the nonexistent file
for line in output:
@@ -403,10 +401,10 @@ def status_nonrecursive_update_different_cwd(sbox):
J_url = sbox.repo_url + '/A/C/J'
K_path = os.path.join(wc_dir, 'A', 'C', 'K' )
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'rev 2', J_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', K_path)
os.chdir(wc_dir)
@@ -418,8 +416,7 @@ def status_nonrecursive_update_different_cwd(sbox):
'Status against revision: 2\n' ]
os.chdir('A')
- svntest.actions.run_and_verify_svn(None,
- UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[],
'status', '-v', '-N', '-u', 'C')
@@ -430,8 +427,7 @@ def status_nonrecursive_update_different_cwd(sbox):
'Status against revision: 2\n']
os.chdir('C')
- svntest.actions.run_and_verify_svn(None,
- UnorderedOutput(expected_output),
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
[],
'status', '-v', '-N', '-u', '.')
@@ -494,7 +490,7 @@ def status_file_needs_update(sbox):
# the -v flag, which we don't want, as this bug never appeared when
# -v was passed. So we run status by hand:
os.chdir(was_cwd)
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'status', '-u',
other_wc)
@@ -558,7 +554,7 @@ def status_uninvited_parent_directory(sbox):
# the bug is present). So run status by hand:
os.chdir(was_cwd)
exit_code, out, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'status', '-u', os.path.join(other_wc, 'newfile'))
for line in out:
@@ -592,7 +588,7 @@ def status_on_forward_deletion(sbox):
# svn: Working copy not locked
# svn: directory '' not locked
#
- svntest.actions.run_and_verify_svn(None, None, [], 'st', '-u', 'wc')
+ svntest.actions.run_and_verify_svn(None, [], 'st', '-u', 'wc')
# Try again another way; the error would look like this:
#
@@ -607,13 +603,13 @@ def status_on_forward_deletion(sbox):
svntest.main.safe_rmtree('wc')
svntest.main.run_svn(None,
'co', '-r1', A_url + "@1", 'wc')
- svntest.actions.run_and_verify_svn(None, None, [], 'st', '-u', 'wc')
+ svntest.actions.run_and_verify_svn(None, [], 'st', '-u', 'wc')
#----------------------------------------------------------------------
def get_last_changed_date(path):
"get the Last Changed Date for path using svn info"
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'info', path)
for line in out:
if re.match("^Last Changed Date", line):
@@ -624,7 +620,7 @@ def get_last_changed_date(path):
# Helper for timestamp_behaviour test
def get_text_timestamp(path):
"get the text-time for path using svn info"
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'info', path)
for line in out:
if re.match("^Text Last Updated", line):
@@ -634,7 +630,7 @@ def get_text_timestamp(path):
def no_text_timestamp(path):
"ensure no text-time for path using svn info"
- exit_code, out, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, out, err = svntest.actions.run_and_verify_svn(None, [],
'info', path)
for line in out:
if re.match("^Text Last Updated", line):
@@ -670,9 +666,9 @@ def text_time_behaviour(wc_dir, wc_path, status_path, expected_status, cmd):
# revert/cleanup change the text-time even though the text doesn't change
if cmd == 'cleanup':
- svntest.actions.run_and_verify_svn(None, None, [], cmd, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], cmd, wc_dir)
else:
- svntest.actions.run_and_verify_svn(None, None, [], cmd, wc_path)
+ svntest.actions.run_and_verify_svn(None, [], cmd, wc_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
text_time = get_text_timestamp(wc_path)
if text_time == pre_text_time:
@@ -718,7 +714,7 @@ use-commit-times = yes
svntest.main.create_config_dir(config_dir, config_contents)
other_wc = sbox.add_wc_path('other')
- svntest.actions.run_and_verify_svn("checkout failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', sbox.repo_url,
other_wc,
'--config-dir', config_dir)
@@ -739,7 +735,7 @@ use-commit-times = yes
expected_status = svntest.actions.get_virginal_state(other_wc, 1)
svntest.actions.run_and_verify_update(other_wc, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
other_wc, '--config-dir', config_dir)
iota_text_timestamp = get_text_timestamp(other_iota_path)
if (iota_text_timestamp[17] != ':' or
@@ -794,7 +790,7 @@ def status_on_unversioned_dotdot(sbox):
os.mkdir(new_subsub)
os.chdir(new_subsub)
- svntest.actions.run_and_verify_svn2(None, None,
+ svntest.actions.run_and_verify_svn2(None,
"svn: warning: W155(010|007):.*'.*'.*not",
0, 'st', '..')
@@ -868,7 +864,7 @@ def missing_dir_in_anchor(sbox):
wc_dir = sbox.wc_dir
foo_path = sbox.ospath('foo')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', foo_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({
'foo' : Item(status='A ', wc_rev=0),
@@ -894,7 +890,7 @@ def status_in_xml(sbox):
# Retrieve last changed date from svn log
exit_code, output, error = svntest.actions.run_and_verify_svn(
- None, None, [], 'log', file_path, '--xml', '-rHEAD')
+ None, [], 'log', file_path, '--xml', '-rHEAD')
info_msg = "<date>"
for line in output:
@@ -912,7 +908,7 @@ def status_in_xml(sbox):
svntest.actions.run_and_verify_status_xml(expected_entries, file_path, '-u')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-m', 'repo-to-repo copy',
sbox.repo_url + '/iota',
sbox.repo_url + '/iota2')
@@ -926,7 +922,7 @@ def status_in_xml(sbox):
svntest.actions.run_and_verify_status_xml(expected_entries, file_path, '-u')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', '-m', 'repo delete',
sbox.repo_url + '/A/B/E/alpha')
@@ -951,15 +947,15 @@ def status_ignored_dir(sbox):
new_dir = sbox.ospath('dir.o')
new_dir_url = sbox.repo_url + "/dir.o"
- svntest.actions.run_and_verify_svn("Create dir", "\n|Committed revision 2.", [],
+ svntest.actions.run_and_verify_svn(["Committing transaction...\n",
+ "Committed revision 2.\n"], [],
'mkdir', new_dir_url, '-m', 'msg')
# Make a dir that is ignored by the default ignore patterns.
os.mkdir(new_dir)
# run_and_verify_status doesn't handle this weird kind of entry.
- svntest.actions.run_and_verify_svn(None,
- ['I * ' + new_dir + "\n",
+ svntest.actions.run_and_verify_svn(['I * ' + new_dir + "\n",
' * 1 ' + wc_dir + "\n",
'Status against revision: 2\n'], [],
"status", "-u", wc_dir)
@@ -977,7 +973,7 @@ def status_unversioned_dir_in_wc(sbox):
expected_err = "svn: warning: (W155007|W155010): .*'.*(/|\\\\)" + \
os.path.basename(path) + \
"' was not found"
- svntest.actions.run_and_verify_svn2(None, [], expected_err, 0,
+ svntest.actions.run_and_verify_svn2([], expected_err, 0,
"status", path)
#----------------------------------------------------------------------
@@ -1000,7 +996,7 @@ def status_missing_dir(sbox):
expected = [ s.replace('A/D/G', a_d_g).replace('/', os.path.sep)
for s in expected ]
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected), [],
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected), [],
"status", wc_dir)
expected = [
@@ -1012,7 +1008,7 @@ def status_missing_dir(sbox):
]
# now run status -u, we should be able to do this without crashing
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected), [],
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected), [],
"status", "-u", wc_dir)
# Finally run an explicit status request directly on the missing directory.
@@ -1025,7 +1021,7 @@ def status_missing_dir(sbox):
expected = [ s.replace('A/D/G', a_d_g).replace('/', os.path.sep)
for s in expected ]
- svntest.actions.run_and_verify_svn(None, UnorderedOutput(expected), [],
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected), [],
"status", a_d_g)
def status_add_plus_conflict(sbox):
@@ -1038,42 +1034,42 @@ def status_add_plus_conflict(sbox):
branch_url = sbox.repo_url + '/branch'
trunk_url = sbox.repo_url + '/trunk'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'rev 2',
branch_url, trunk_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', wc_dir)
branch_file = sbox.ospath('branch/file')
svntest.main.file_write(branch_file, "line 1\nline2\nline3\n", 'wb+')
- svntest.actions.run_and_verify_svn(None, None, [], 'add', branch_file)
+ svntest.actions.run_and_verify_svn(None, [], 'add', branch_file)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit',
branch_file, '-m', 'rev 3')
svntest.main.file_write(branch_file, "line 1\nline3\n", 'wb')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit',
branch_file, '-m', 'rev 4')
svntest.main.file_write(branch_file, "line 1\nline2\n", 'wb')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'commit',
branch_file, '-m', 'rev 5')
trunk_dir = sbox.ospath('trunk')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge',
branch_url, '-r', '2:3', trunk_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'merge',
branch_url, '-r', '4:5', trunk_dir)
@@ -1088,7 +1084,7 @@ def status_add_plus_conflict(sbox):
expected_output = svntest.verify.UnorderedOutput(lines)
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'status', wc_dir)
#----------------------------------------------------------------------
@@ -1102,8 +1098,7 @@ def inconsistent_eol(sbox):
svntest.main.file_write(iota_path, "line 1\nline 2\n", "wb")
- svntest.actions.run_and_verify_svn(None,
- "property 'svn:eol-style' set on.*iota",
+ svntest.actions.run_and_verify_svn("property 'svn:eol-style' set on.*iota",
[],
'propset', 'svn:eol-style', 'native',
sbox.ospath('iota'))
@@ -1116,7 +1111,7 @@ def inconsistent_eol(sbox):
expected_status.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make the eol style inconsistent and verify that status says nothing.
svntest.main.file_write(iota_path, "line 1\nline 2\r\n", "wb")
@@ -1149,8 +1144,7 @@ def status_update_with_incoming_props(sbox):
# Commit the working copy
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected trees for an update to revision 1.
expected_output = svntest.wc.State(wc_dir, {
@@ -1165,7 +1159,7 @@ def status_update_with_incoming_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1,
+ [], True,
'-r', '1', wc_dir)
# Can't use run_and_verify_status here because the out-of-date
@@ -1175,8 +1169,7 @@ def status_update_with_incoming_props(sbox):
" * 1 " + wc_dir + "\n",
"Status against revision: 2\n" ])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u",
wc_dir)
@@ -1188,12 +1181,12 @@ def status_update_with_incoming_props(sbox):
" * 1 1 jrandom " + wc_dir + "\n",
"Status against revision: 2\n" ])
- svntest.actions.run_and_verify_svn(None, expected, [],
+ svntest.actions.run_and_verify_svn(expected, [],
"status", "-uvN",
wc_dir)
# Retrieve last changed date from svn log
- exit_code, output, error = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, output, error = svntest.actions.run_and_verify_svn(None, [],
'log', wc_dir,
'--xml', '-r1')
@@ -1254,8 +1247,7 @@ def status_update_verbose_with_incoming_props(sbox):
# Commit the working copy
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected trees for an update to revision 1.
expected_output = svntest.wc.State(wc_dir, {
@@ -1271,7 +1263,7 @@ def status_update_verbose_with_incoming_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 1,
+ [], True,
'-r', '1', wc_dir)
# Can't use run_and_verify_status here because the out-of-date
@@ -1301,8 +1293,7 @@ def status_update_verbose_with_incoming_props(sbox):
" *" + common + wc_dir + "\n",
"Status against revision: 2\n" ])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-uv", wc_dir)
@@ -1333,8 +1324,7 @@ def status_nonrecursive_update(sbox):
expected_status.tweak('A/D/gamma', wc_rev=2, status=' ')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Create expected trees for an update to revision 1.
expected_output = svntest.wc.State(wc_dir, {
@@ -1349,15 +1339,14 @@ def status_nonrecursive_update(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
# Check the remote status of folder A (non-recursively)
xout = [" * 1 " + sbox.ospath('A/mu') + "\n",
"Status against revision: 2\n" ]
- svntest.actions.run_and_verify_svn(None,
- xout,
+ svntest.actions.run_and_verify_svn(xout,
[],
"status", "-uN", A_path)
@@ -1390,8 +1379,7 @@ def change_files_and_commit(wc_dir, files, baserev=1):
expected_status.tweak(file, wc_rev=commitrev, status=' ')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
def status_depth_local(sbox):
"run 'status --depth=X' with local changes"
@@ -1414,8 +1402,7 @@ def status_depth_local(sbox):
# depth=empty
expected = svntest.verify.UnorderedOutput(
[" M %s\n" % A_path])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "--depth=empty", A_path)
@@ -1424,8 +1411,7 @@ def status_depth_local(sbox):
[" M %s\n" % A_path,
"M %s\n" % mu_path])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "--depth=files", A_path)
@@ -1435,8 +1421,7 @@ def status_depth_local(sbox):
" M %s\n" % D_path,
"M %s\n" % mu_path])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "--depth=immediates", A_path)
@@ -1447,8 +1432,7 @@ def status_depth_local(sbox):
"M %s\n" % mu_path,
"M %s\n" % gamma_path])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "--depth=infinity", A_path)
@@ -1468,7 +1452,7 @@ def status_depth_update(sbox):
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'propset', '--force', 'svn:test', 'value', A_path)
svntest.main.run_svn(None, 'propset', '--force', 'svn:test', 'value', D_path)
- svntest.main.run_svn(None, 'ci', '-m', 'log message', wc_dir)
+ sbox.simple_commit(message='log message')
# update to r1
svntest.main.run_svn(None, 'up', '-r', '1', wc_dir)
@@ -1480,8 +1464,7 @@ def status_depth_update(sbox):
[" * 1 %s\n" % A_path,
"Status against revision: 3\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=empty", A_path)
@@ -1491,8 +1474,7 @@ def status_depth_update(sbox):
" * 1 %s\n" % A_path,
"Status against revision: 3\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=files",
A_path)
@@ -1504,8 +1486,7 @@ def status_depth_update(sbox):
" * 1 %s\n" % mu_path,
"Status against revision: 3\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=immediates",
A_path)
@@ -1518,8 +1499,7 @@ def status_depth_update(sbox):
" * 1 %s\n" % gamma_path,
"Status against revision: 3\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=infinity",
A_path)
@@ -1548,8 +1528,7 @@ def status_depth_update_local_modifications(sbox):
[" M 1 %s\n" % A_path,
"Status against revision: 1\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=empty", A_path)
@@ -1557,8 +1536,7 @@ def status_depth_update_local_modifications(sbox):
["M 1 %s\n" % mu_path,
"Status against revision: 1\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=empty", mu_path)
@@ -1568,8 +1546,7 @@ def status_depth_update_local_modifications(sbox):
" M 1 %s\n" % A_path,
"Status against revision: 1\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=files",
A_path)
@@ -1581,8 +1558,7 @@ def status_depth_update_local_modifications(sbox):
"M 1 %s\n" % mu_path,
"Status against revision: 1\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=immediates",
A_path)
@@ -1595,8 +1571,7 @@ def status_depth_update_local_modifications(sbox):
"M 1 %s\n" % gamma_path,
"Status against revision: 1\n"])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "--depth=infinity",
A_path)
@@ -1613,7 +1588,7 @@ def status_dash_u_deleted_directories(sbox):
B_path = os.path.join(A_path, 'B')
# delete the B directory
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', B_path)
# now run status -u on B and its children
@@ -1630,8 +1605,7 @@ def status_dash_u_deleted_directories(sbox):
"D 1 %s\n" % os.path.join("B", "E", "beta"),
"D 1 %s\n" % os.path.join("B", "F"),
"Status against revision: 1\n" ])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", "B")
@@ -1647,8 +1621,7 @@ def status_dash_u_deleted_directories(sbox):
"D 1 %s\n" % os.path.join("E", "beta"),
"D 1 %s\n" % "F",
"Status against revision: 1\n" ])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u", ".")
@@ -1661,8 +1634,7 @@ def status_dash_u_deleted_directories(sbox):
os.chdir(was_cwd)
os.chdir(A_path)
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u",
os.path.join("B", "E"))
@@ -1687,8 +1659,7 @@ def status_dash_u_type_change(sbox):
xout = ["~ 1 iota\n",
"Status against revision: 1\n" ]
- svntest.actions.run_and_verify_svn(None,
- xout,
+ svntest.actions.run_and_verify_svn(xout,
[],
"status", "-u")
@@ -1723,8 +1694,7 @@ def status_dash_u_type_change(sbox):
[s.replace('/', os.path.sep)
for s in output])
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-u")
@@ -1747,15 +1717,14 @@ def status_with_tree_conflicts(sbox):
# check status of G
expected = svntest.verify.UnorderedOutput(
["A + C %s\n" % rho,
- " > local file edit, incoming file delete upon update\n",
+ " > local file edit, incoming file delete or move upon update\n",
"D C %s\n" % pi,
" > local file delete, incoming file edit upon update\n",
"! C %s\n" % tau,
- " > local file delete, incoming file delete upon update\n",
+ " > local file delete, incoming file delete or move upon update\n",
] + svntest.main.summary_of_conflicts(tree_conflicts=3))
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", G)
@@ -1765,13 +1734,12 @@ def status_with_tree_conflicts(sbox):
"D C 2 2 jrandom %s\n" % pi,
" > local file delete, incoming file edit upon update\n",
"A + C - 1 jrandom %s\n" % rho,
- " > local file edit, incoming file delete upon update\n",
+ " > local file edit, incoming file delete or move upon update\n",
"! C %s\n" % tau,
- " > local file delete, incoming file delete upon update\n",
+ " > local file delete, incoming file delete or move upon update\n",
] + svntest.main.summary_of_conflicts(tree_conflicts=3))
- svntest.actions.run_and_verify_svn(None,
- expected,
+ svntest.actions.run_and_verify_svn(expected,
[],
"status", "-v", G)
@@ -1829,7 +1797,7 @@ def status_nested_wc_old_format(sbox):
svntest.main.file_append(sbox.ospath('subdir/.svn/format'),
'10\n') # format 10 was the Subversion 1.6 format
os.chdir(wc_dir)
- svntest.actions.run_and_verify_svn(None, [ "? subdir\n" ], [], 'st')
+ svntest.actions.run_and_verify_svn([ "? subdir\n" ], [], 'st')
#----------------------------------------------------------------------
# Regression test for issue #3855 "status doesn't show 'K' on a locked
@@ -1842,9 +1810,9 @@ def status_locked_deleted(sbox):
iota_path = sbox.ospath('iota')
sbox.simple_rm('iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'lock',
+ svntest.actions.run_and_verify_svn(None, [], 'lock',
os.path.join(sbox.wc_dir, 'iota'))
- svntest.actions.run_and_verify_svn(None, ['D K %s\n' % iota_path], [],
+ svntest.actions.run_and_verify_svn(['D K %s\n' % iota_path], [],
'status', iota_path)
@Issue(3774)
@@ -1856,7 +1824,7 @@ def wc_wc_copy_timestamp(sbox):
time.sleep(1.1)
svntest.main.file_append(sbox.ospath('A/D/H/psi'), 'modified\n')
- svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+ svntest.actions.run_and_verify_svn(None, [], 'copy',
sbox.ospath('A/D/H'),
sbox.ospath('A/D/H2'))
@@ -1887,7 +1855,7 @@ def wc_wc_copy_timestamp(sbox):
raise svntest.Failure("psi timestamps should be the same")
# Cleanup repairs timestamps, so this should be a no-op.
- svntest.actions.run_and_verify_svn(None, None, [], 'cleanup', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'cleanup', wc_dir)
chi_dst_timestamp2 = get_text_timestamp(sbox.ospath('A/D/H2/chi'))
if chi_dst_timestamp2 != chi_dst_timestamp1:
raise svntest.Failure("chi timestamps should be the same")
@@ -1915,7 +1883,7 @@ def wclock_status(sbox):
'A/D/G',
'A/D/H']
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'status', wc_dir)
# Second non-recursive lock
@@ -1929,7 +1897,7 @@ def wclock_status(sbox):
'A/D/G',
'A/D/H']
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'status', wc_dir)
@@ -1951,12 +1919,12 @@ def modified_modulo_translation(sbox):
# Run status. Expect some output.
# TODO: decide how such files should show in the output; whether they
# always show, or only with some --flag; and adjust this accordingly.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'status', wc_dir)
# Expect the file to be renormalized (to LF) after a revert.
sbox.simple_revert('iota')
- svntest.actions.run_and_verify_svn(None, [], [], 'status', wc_dir)
+ svntest.actions.run_and_verify_svn([], [], 'status', wc_dir)
def status_not_present(sbox):
"no status on not-present and excluded nodes"
@@ -1970,7 +1938,7 @@ def status_not_present(sbox):
sbox.ospath('A/mu'), sbox.ospath('A/B'))
sbox.simple_commit()
- svntest.actions.run_and_verify_svn(None, [], [],'status',
+ svntest.actions.run_and_verify_svn([], [],'status',
sbox.ospath('iota'),
sbox.ospath('A/B'),
sbox.ospath('A/C'),
@@ -1987,7 +1955,7 @@ def status_unversioned_dir(sbox):
# This should work on UNIX-like systems and Windows systems
expected_err = "svn: warning: W1550(07|10): .*'.*(/|\\\\)" + \
"' is not a working copy"
- svntest.actions.run_and_verify_svn2(None, [], expected_err, 0,
+ svntest.actions.run_and_verify_svn2([], expected_err, 0,
"status", "/")
def status_case_changed(sbox):
@@ -2073,7 +2041,7 @@ def move_update_timestamps(sbox):
expected_status)
time.sleep(1.1)
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B/E'))
@@ -2121,12 +2089,12 @@ def status_path_handling(sbox):
def status_move_missing_direct(sbox):
"move information when status is called directly"
-
+
sbox.build()
sbox.simple_copy('A', 'Z')
sbox.simple_commit('')
sbox.simple_update('')
-
+
sbox.simple_move('Z', 'ZZ')
sbox.simple_move('A', 'Z')
sbox.simple_move('Z/B', 'ZB')
@@ -2136,18 +2104,18 @@ def status_move_missing_direct(sbox):
# Somehow 'svn status' now shows different output for 'ZB/E'
# when called directly and via an ancestor, as this handles
# multi-layer in a different way
-
+
# Note that the status output may change over different Subversion revisions,
# but the status on a node should be identical anyway 'svn status' is called
# on it.
-
+
expected_output = [
'A + %s\n' % sbox.ospath('ZB'),
- ' > moved from %s\n' % os.path.join('..', 'Z', 'B'),
+ ' > moved from %s\n' % os.path.join('..', 'Z', 'B'),
'D + %s\n' % sbox.ospath('ZB/E'),
' > moved to %s\n' % os.path.join('..', 'Z', 'B', 'E'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'status',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'status',
sbox.ospath('ZB'), '--depth', 'immediates')
# And calling svn status on just 'ZB/E' should have the same result for this node
@@ -2156,12 +2124,12 @@ def status_move_missing_direct(sbox):
'D + %s\n' % sbox.ospath('ZB/E'),
' > moved to %s\n' % os.path.join('..', '..', 'Z', 'B', 'E'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'status',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'status',
sbox.ospath('ZB/E'), '--depth', 'empty')
def status_move_missing_direct_base(sbox):
"move when status is called directly with base"
-
+
sbox.build()
sbox.simple_copy('A', 'Z')
sbox.simple_mkdir('Q')
@@ -2169,10 +2137,10 @@ def status_move_missing_direct_base(sbox):
sbox.simple_mkdir('Q/ZB/E')
sbox.simple_commit('')
sbox.simple_update('')
-
+
sbox.simple_rm('Q')
sbox.simple_mkdir('Q')
-
+
sbox.simple_move('Z', 'ZZ')
sbox.simple_move('A', 'Z')
sbox.simple_move('Z/B', 'Q/ZB')
@@ -2182,21 +2150,21 @@ def status_move_missing_direct_base(sbox):
# Somehow 'svn status' now shows different output for 'Q/ZB/E'
# when called directly and via an ancestor, as this handles
# multi-layer in a different way
-
+
# Note that the status output may change over different Subversion revisions,
# but the status on a node should be identical anyway 'svn status' is called
# on it.
-
+
# This test had a different result as status_move_missing_direct at the time of
# writing this test.
-
+
expected_output = [
'A + %s\n' % sbox.ospath('Q/ZB'),
' > moved from %s\n' % os.path.join('..', '..', 'Z', 'B'),
'D + %s\n' % sbox.ospath('Q/ZB/E'),
' > moved to %s\n' % os.path.join('..', '..', 'Z', 'B', 'E'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'status',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'status',
sbox.ospath('Q/ZB'), '--depth', 'immediates')
# And calling svn status on just 'ZB/E' should have the same result for this node,
@@ -2205,9 +2173,99 @@ def status_move_missing_direct_base(sbox):
'D + %s\n' % sbox.ospath('Q/ZB/E'),
' > moved to %s\n' % os.path.join('..', '..', '..', 'Z', 'B', 'E'),
]
- svntest.actions.run_and_verify_svn(None, expected_output, [], 'status',
+ svntest.actions.run_and_verify_svn(expected_output, [], 'status',
sbox.ospath('Q/ZB/E'), '--depth', 'empty')
+def status_missing_conflicts(sbox):
+ "status missing certain conflicts"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ sbox.simple_propset('q', 'r', 'A/B/E/alpha', 'A/B/E/beta')
+ sbox.simple_commit()
+
+ sbox.simple_move('A/B/E/alpha', 'alpha')
+ sbox.simple_move('A/B/E/beta', 'beta')
+
+ sbox.simple_rm('A/B/E')
+
+ sbox.simple_update('A/B/E', revision=1)
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/B/E', status='D ', treeconflict='C', wc_rev=1)
+ expected_status.tweak('A/B/E/alpha', status='D ', treeconflict='C', wc_rev=1,
+ moved_to='alpha')
+ expected_status.tweak('A/B/E/beta', status='D ', treeconflict='C', wc_rev=1,
+ moved_to='beta')
+ expected_status.add({
+ 'alpha' : Item(status='A ', copied='+', moved_from='A/B/E/alpha', wc_rev='-'),
+ 'beta' : Item(status='A ', copied='+', moved_from='A/B/E/beta', wc_rev='-')
+ })
+
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ expected_info = [
+ {
+ 'Tree conflict': 'local file moved away, incoming file edit upon update.*'
+ },
+ {
+ 'Tree conflict': 'local file moved away, incoming file edit upon update.*'
+ }
+ ]
+ svntest.actions.run_and_verify_info(expected_info,
+ sbox.ospath('A/B/E/alpha'),
+ sbox.ospath('A/B/E/beta'))
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'resolve', '--accept=mine-conflict',
+ '--depth=empty', sbox.ospath('A/B/E'))
+ expected_status.tweak('A/B/E', treeconflict=None)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ # Now replace with directory
+ sbox.simple_mkdir('A/B/E')
+ expected_status.tweak('A/B/E', status='R ')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ svntest.actions.run_and_verify_info(expected_info,
+ sbox.ospath('A/B/E/alpha'),
+ sbox.ospath('A/B/E/beta'))
+
+ #Recreate scenario for file
+ sbox.simple_rm('A/B/E', 'alpha', 'beta')
+ svntest.actions.run_and_verify_svn(None, [],
+ 'revert', '-R', sbox.ospath('A/B/E'))
+
+ sbox.simple_update('A/B/E', revision=2)
+
+ sbox.simple_move('A/B/E/alpha', 'alpha')
+ sbox.simple_move('A/B/E/beta', 'beta')
+
+ sbox.simple_rm('A/B/E')
+ sbox.simple_update('A/B/E', revision=1)
+ svntest.actions.run_and_verify_svn(None, [],
+ 'resolve', '--accept=mine-conflict',
+ '--depth=empty', sbox.ospath('A/B/E'))
+
+ sbox.simple_append('A/B/E', 'something')
+ expected_status.tweak('A/B/E', status='D ')
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ sbox.simple_add('A/B/E')
+
+ # In the entries world A/B/E doesn't have children..
+ expected_status.tweak('A/B/E', status='R ', entry_kind='file')
+
+ # Tree conflicts still in db
+ svntest.actions.run_and_verify_info(expected_info,
+ sbox.ospath('A/B/E/alpha'),
+ sbox.ospath('A/B/E/beta'))
+
+ # But not in status!
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+
+
+
########################################################################
# Run the tests
@@ -2258,6 +2316,7 @@ test_list = [ None,
status_path_handling,
status_move_missing_direct,
status_move_missing_direct_base,
+ status_missing_conflicts,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/svnadmin_tests.py b/subversion/tests/cmdline/svnadmin_tests.py
index e32681d..470db65 100755
--- a/subversion/tests/cmdline/svnadmin_tests.py
+++ b/subversion/tests/cmdline/svnadmin_tests.py
@@ -26,11 +26,13 @@
# General modules
import os
+import logging
import re
import shutil
import sys
import threading
-import logging
+import time
+import gzip
logger = logging.getLogger()
@@ -48,6 +50,7 @@ XFail = svntest.testcase.XFail_deco
Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
+SkipDumpLoadCrossCheck = svntest.testcase.SkipDumpLoadCrossCheck_deco
Item = svntest.wc.StateItem
def check_hotcopy_bdb(src, dst):
@@ -61,8 +64,7 @@ def check_hotcopy_bdb(src, dst):
if origerr or backerr or origout != backout:
raise svntest.Failure
-def check_hotcopy_fsfs(src, dst):
- "Verify that the SRC FSFS repository has been correctly copied to DST."
+def check_hotcopy_fsfs_fsx(src, dst):
# Walk the source and compare all files to the destination
for src_dirpath, src_dirs, src_files in os.walk(src):
# Verify that the current directory exists in the destination
@@ -72,16 +74,34 @@ def check_hotcopy_fsfs(src, dst):
"destination" % dst_dirpath)
# Verify that all dirents in the current directory also exist in source
for dst_dirent in os.listdir(dst_dirpath):
+ # Ignore auto-created empty lock files as they may or may not
+ # be present and are neither required by nor do they harm to
+ # the destination repository.
+ if dst_dirent == 'pack-lock':
+ continue
+ if dst_dirent == 'write-lock':
+ continue
+
+ # Ignore auto-created rep-cache.db-journal file
+ if dst_dirent == 'rep-cache.db-journal':
+ continue
+
src_dirent = os.path.join(src_dirpath, dst_dirent)
if not os.path.exists(src_dirent):
raise svntest.Failure("%s does not exist in hotcopy "
"source" % src_dirent)
# Compare all files in this directory
for src_file in src_files:
- # Exclude temporary files
- if src_file == 'rev-prop-atomics.shm':
+ # Ignore auto-created empty lock files as they may or may not
+ # be present and are neither required by nor do they harm to
+ # the destination repository.
+ if src_file == 'pack-lock':
continue
- if src_file == 'rev-prop-atomics.mutex':
+ if src_file == 'write-lock':
+ continue
+
+ # Ignore auto-created rep-cache.db-journal file
+ if src_file == 'rep-cache.db-journal':
continue
src_path = os.path.join(src_dirpath, src_file)
@@ -90,6 +110,20 @@ def check_hotcopy_fsfs(src, dst):
raise svntest.Failure("%s does not exist in hotcopy "
"destination" % dst_path)
+ # Special case for db/uuid: Only the UUID in the first line needs
+ # to match. Source and target must have the same number of lines
+ # (due to having the same format).
+ if src_path == os.path.join(src, 'db', 'uuid'):
+ lines1 = open(src_path, 'rb').read().split("\n")
+ lines2 = open(dst_path, 'rb').read().split("\n")
+ if len(lines1) != len(lines2):
+ raise svntest.Failure("%s differs in number of lines"
+ % dst_path)
+ if lines1[0] != lines2[0]:
+ raise svntest.Failure("%s contains different uuid: '%s' vs. '%s'"
+ % (dst_path, lines1[0], lines2[0]))
+ continue
+
# Special case for rep-cache: It will always differ in a byte-by-byte
# comparison, so compare db tables instead.
if src_file == 'rep-cache.db':
@@ -106,14 +140,14 @@ def check_hotcopy_fsfs(src, dst):
for i in range(len(rows1)):
if rows1[i] != rows2[i]:
raise svntest.Failure("rep-cache row %i differs: '%s' vs. '%s'"
- % (row, rows1[i]))
+ % (i, rows1[i], rows2[i]))
continue
# Special case for revprop-generation: It will always be zero in
# the hotcopy destination (i.e. a fresh cache generation)
if src_file == 'revprop-generation':
f2 = open(dst_path, 'r')
- revprop_gen = int(f2.read().strip())
+ revprop_gen = int(f2.read().strip().split()[1])
if revprop_gen != 0:
raise svntest.Failure("Hotcopy destination has non-zero " +
"revprop generation")
@@ -146,6 +180,14 @@ def check_hotcopy_fsfs(src, dst):
f1.close()
f2.close()
+def check_hotcopy_fsfs(src, dst):
+ "Verify that the SRC FSFS repository has been correctly copied to DST."
+ check_hotcopy_fsfs_fsx(src, dst)
+
+def check_hotcopy_fsx(src, dst):
+ "Verify that the SRC FSX repository has been correctly copied to DST."
+ check_hotcopy_fsfs_fsx(src, dst)
+
#----------------------------------------------------------------------
# How we currently test 'svnadmin' --
@@ -189,6 +231,24 @@ def get_txns(repo_dir):
return txns
+def patch_format(repo_dir, shard_size):
+ """Rewrite the format of the FSFS or FSX repository REPO_DIR so
+ that it would use sharding with SHARDS revisions per shard."""
+
+ format_path = os.path.join(repo_dir, "db", "format")
+ contents = open(format_path, 'rb').read()
+ processed_lines = []
+
+ for line in contents.split("\n"):
+ if line.startswith("layout "):
+ processed_lines.append("layout sharded %d" % shard_size)
+ else:
+ processed_lines.append(line)
+
+ new_contents = "\n".join(processed_lines)
+ os.chmod(format_path, 0666)
+ open(format_path, 'wb').write(new_contents)
+
def load_and_verify_dumpstream(sbox, expected_stdout, expected_stderr,
revs, check_props, dump, *varargs):
"""Load the array of lines passed in DUMP into the current tests'
@@ -225,8 +285,7 @@ def load_and_verify_dumpstream(sbox, expected_stdout, expected_stderr,
if revs:
# verify revs as wc states
for rev in range(len(revs)):
- svntest.actions.run_and_verify_svn("Updating to r%s" % (rev+1),
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
"update", "-r%s" % (rev+1),
sbox.wc_dir)
@@ -238,42 +297,140 @@ def load_dumpstream(sbox, dump, *varargs):
return load_and_verify_dumpstream(sbox, None, None, None, False, dump,
*varargs)
-######################################################################
-# Tests
-
+class FSFS_Index:
+ """Manages indexes of a rev file in a FSFS format 7 repository.
+ The interface returns P2L information and allows for item offsets
+ and lengths to be modified. """
+
+ def __init__(self, sbox, revision):
+ self.by_item = { }
+ self.revision = revision
+ self.repo_dir = sbox.repo_dir
+
+ self._read()
+
+ def _read(self):
+ """ Read P2L index using svnfsfs. """
+ exit_code, output, errput = svntest.main.run_svnfsfs('dump-index',
+ '-r' + str(self.revision),
+ self.repo_dir)
+ svntest.verify.verify_outputs("Error while dumping index",
+ [], errput, [], [])
+ svntest.verify.verify_exit_code(None, exit_code, 0)
+
+ self.by_item.clear()
+ for line in output:
+ values = line.split()
+ if len(values) >= 4 and values[0] != 'Start':
+ item = long(values[4])
+ self.by_item[item] = values
+
+ def _write(self):
+ """ Rewrite indexes using svnfsfs. """
+ by_offset = {}
+ for values in self.by_item.itervalues():
+ by_offset[long(values[0], 16)] = values
+
+ lines = []
+ for (offset, values) in sorted(by_offset.items()):
+ values = by_offset[offset]
+ line = values[0] + ' ' + values[1] + ' ' + values[2] + ' ' + \
+ values[3] + ' ' + values[4] + '\n';
+ lines.append(line)
+
+ exit_code, output, errput = svntest.main.run_command_stdin(
+ svntest.main.svnfsfs_binary, 0, 0, True, lines,
+ 'load-index', self.repo_dir)
+
+ svntest.verify.verify_outputs("Error while rewriting index",
+ output, errput, [], [])
+ svntest.verify.verify_exit_code(None, exit_code, 0)
+
+ def get_item(self, item):
+ """ Return offset, length and type of ITEM. """
+ values = self.by_item[item]
+
+ offset = long(values[0], 16)
+ len = long(values[1], 16)
+ type = values[2]
+
+ return (offset, len, type)
+
+ def modify_item(self, item, offset, len):
+ """ Modify offset and length of ITEM. """
+ values = self.by_item[item]
+
+ values[0] = '%x' % offset
+ values[1] = '%x' % len
+
+ self._write()
+
+def repo_format(sbox):
+ """ Return the repository format number for SBOX."""
+
+ format_file = open(os.path.join(sbox.repo_dir, "db", "format"))
+ format = int(format_file.read()[:1])
+ format_file.close()
-#----------------------------------------------------------------------
+ return format
-def test_create(sbox):
- "'svnadmin create'"
+def set_changed_path_list(sbox, revision, changes):
+ """ Replace the changed paths list in the revision file REVISION in SBOX
+ with the text CHANGES."""
+ idx = None
- repo_dir = sbox.repo_dir
- wc_dir = sbox.wc_dir
+ # read full file
+ fp = open(fsfs_file(sbox.repo_dir, 'revs', str(revision)), 'r+b')
+ contents = fp.read()
+ length = len(contents)
- svntest.main.safe_rmtree(repo_dir, 1)
- svntest.main.safe_rmtree(wc_dir)
-
- svntest.main.create_repos(repo_dir)
-
- svntest.actions.run_and_verify_svn("Creating rev 0 checkout",
- ["Checked out revision 0.\n"], [],
- "checkout",
- sbox.repo_url, wc_dir)
+ if repo_format(sbox) < 7:
+ # replace the changed paths list
+ header = contents[contents.rfind('\n', length - 64, length - 1):]
+ body_len = long(header.split(' ')[1])
+ else:
+ # read & parse revision file footer
+ footer_length = ord(contents[length-1]);
+ footer = contents[length - footer_length - 1:length-1]
+ l2p_offset = long(footer.split(' ')[0])
+ l2p_checksum = footer.split(' ')[1]
+ p2l_offset = long(footer.split(' ')[2])
+ p2l_checksum = footer.split(' ')[3]
+
+ idx = FSFS_Index(sbox, revision)
+ (offset, item_len, item_type) = idx.get_item(1)
+
+ # split file contents
+ body_len = offset
+ indexes = contents[l2p_offset:length - footer_length - 1]
+
+ # construct new footer, include indexes as are
+ file_len = body_len + len(changes) + 1
+ p2l_offset += file_len - l2p_offset
+
+ header = str(file_len) + ' ' + l2p_checksum + ' ' \
+ + str(p2l_offset) + ' ' + p2l_checksum
+ header += chr(len(header))
+ header = '\n' + indexes + header
+
+ contents = contents[:body_len] + changes + header
+
+ # set new contents
+ fp.seek(0)
+ fp.write(contents)
+ fp.truncate()
+ fp.close()
- svntest.actions.run_and_verify_svn(
- "Running status",
- [], [],
- "status", wc_dir)
+ if repo_format(sbox) >= 7:
+ idx.modify_item(1, offset, len(changes) + 1)
- svntest.actions.run_and_verify_svn(
- "Running verbose status",
- [" 0 0 ? %s\n" % wc_dir], [],
- "status", "--verbose", wc_dir)
+######################################################################
+# Tests
- # success
+#----------------------------------------------------------------------
# dump stream tests need a dump file
@@ -306,7 +463,7 @@ dumpfile_revisions = \
def extra_headers(sbox):
"loading of dumpstream with extra headers"
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile = clean_dumpfile()
@@ -321,7 +478,7 @@ def extra_headers(sbox):
def extra_blockcontent(sbox):
"load success on oversized Content-length"
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile = clean_dumpfile()
@@ -339,7 +496,7 @@ def extra_blockcontent(sbox):
def inconsistent_headers(sbox):
"load failure on undersized Content-length"
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile = clean_dumpfile()
@@ -355,7 +512,7 @@ def inconsistent_headers(sbox):
def empty_date(sbox):
"preserve date-less revisions in load"
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile = clean_dumpfile()
@@ -370,8 +527,8 @@ def empty_date(sbox):
'--ignore-uuid')
# Verify that the revision still lacks the svn:date property.
- svntest.actions.run_and_verify_svn(None, [], [], "propget",
- "--revprop", "-r1", "svn:date",
+ svntest.actions.run_and_verify_svn([], '.*(E195011|E200017).*svn:date',
+ "propget", "--revprop", "-r1", "svn:date",
sbox.wc_dir)
#----------------------------------------------------------------------
@@ -386,8 +543,7 @@ def dump_copied_dir(sbox):
old_C_path = os.path.join(wc_dir, 'A', 'C')
new_C_path = os.path.join(wc_dir, 'A', 'B', 'C')
svntest.main.run_svn(None, 'cp', old_C_path, new_C_path)
- svntest.main.run_svn(None, 'ci', wc_dir, '--quiet',
- '-m', 'log msg')
+ sbox.simple_commit(message='log msg')
exit_code, output, errput = svntest.main.run_svnadmin("dump", repo_dir)
if svntest.verify.compare_and_display_lines(
@@ -410,8 +566,7 @@ def dump_move_dir_modify_child(sbox):
Q_path = os.path.join(wc_dir, 'A', 'Q')
svntest.main.run_svn(None, 'cp', B_path, Q_path)
svntest.main.file_append(os.path.join(Q_path, 'lambda'), 'hello')
- svntest.main.run_svn(None, 'ci', wc_dir, '--quiet',
- '-m', 'log msg')
+ sbox.simple_commit(message='log msg')
exit_code, output, errput = svntest.main.run_svnadmin("dump", repo_dir)
svntest.verify.compare_and_display_lines(
"Output of 'svnadmin dump' is unexpected.",
@@ -452,15 +607,17 @@ def hotcopy_dot(sbox):
os.chdir(backup_dir)
svntest.actions.run_and_verify_svnadmin(
- None, None, [],
+ None, [],
"hotcopy", os.path.join(cwd, sbox.repo_dir), '.')
os.chdir(cwd)
if svntest.main.is_fs_type_fsfs():
check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
- else:
+ if svntest.main.is_fs_type_bdb():
check_hotcopy_bdb(sbox.repo_dir, backup_dir)
+ if svntest.main.is_fs_type_fsx():
+ check_hotcopy_fsx(sbox.repo_dir, backup_dir)
#----------------------------------------------------------------------
@@ -495,24 +652,29 @@ def hotcopy_format(sbox):
#----------------------------------------------------------------------
def setrevprop(sbox):
- "'setlog' and 'setrevprop', bypassing hooks'"
+ "setlog, setrevprop, delrevprop; bypass hooks"
sbox.build()
# Try a simple log property modification.
iota_path = os.path.join(sbox.wc_dir, "iota")
- exit_code, output, errput = svntest.main.run_svnadmin("setlog",
- sbox.repo_dir,
- "-r0",
- "--bypass-hooks",
- iota_path)
- if errput:
- logger.warn("Error: 'setlog' failed")
- raise svntest.Failure
+ mu_path = sbox.ospath('A/mu')
+ svntest.actions.run_and_verify_svnadmin([], [],
+ "setlog", sbox.repo_dir, "-r0",
+ "--bypass-hooks",
+ iota_path)
+
+ # Make sure it fails without --bypass-hooks. (We haven't called
+ # svntest.actions.enable_revprop_changes().)
+ #
+ # Note that we attempt to set the log message to a different value than the
+ # successful call.
+ svntest.actions.run_and_verify_svnadmin([], svntest.verify.AnyOutput,
+ "setlog", sbox.repo_dir, "-r0",
+ mu_path)
# Verify that the revprop value matches what we set when retrieved
# through the client.
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'iota'.\n", "\n" ],
+ svntest.actions.run_and_verify_svn([ "This is the file 'iota'.\n", "\n" ],
[], "propget", "--revprop", "-r0",
"svn:log", sbox.wc_dir)
@@ -530,10 +692,18 @@ def setrevprop(sbox):
# Verify that the revprop value matches what we set when retrieved
# through the client.
- svntest.actions.run_and_verify_svn(None, [ "foo\n" ], [], "propget",
+ svntest.actions.run_and_verify_svn([ "foo\n" ], [], "propget",
"--revprop", "-r0", "svn:author",
sbox.wc_dir)
+ # Delete the property.
+ svntest.actions.run_and_verify_svnadmin([], [],
+ "delrevprop", "-r0", sbox.repo_dir,
+ "svn:author")
+ svntest.actions.run_and_verify_svnlook([], ".*E200017.*svn:author.*",
+ "propget", "--revprop", "-r0",
+ sbox.repo_dir, "svn:author")
+
def verify_windows_paths_in_repos(sbox):
"verify a repository containing paths like 'c:hi'"
@@ -542,28 +712,38 @@ def verify_windows_paths_in_repos(sbox):
repo_url = sbox.repo_url
chi_url = sbox.repo_url + '/c:hi'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'log_msg',
chi_url)
exit_code, output, errput = svntest.main.run_svnadmin("verify",
sbox.repo_dir)
+ if errput:
+ raise SVNUnexpectedStderr(errput)
- # unfortunately, FSFS needs to do more checks than BDB resulting in
- # different progress output
- if svntest.main.is_fs_type_fsfs():
+ # unfortunately, some backends needs to do more checks than other
+ # resulting in different progress output
+ if svntest.main.is_fs_log_addressing():
svntest.verify.compare_and_display_lines(
"Error while running 'svnadmin verify'.",
- 'STDERR', ["* Verifying repository metadata ...\n",
+ 'STDOUT', ["* Verifying metadata at revision 0 ...\n",
+ "* Verifying repository metadata ...\n",
"* Verified revision 0.\n",
"* Verified revision 1.\n",
- "* Verified revision 2.\n"], errput)
+ "* Verified revision 2.\n"], output)
+ elif svntest.main.fs_has_rep_sharing():
+ svntest.verify.compare_and_display_lines(
+ "Error while running 'svnadmin verify'.",
+ 'STDOUT', ["* Verifying repository metadata ...\n",
+ "* Verified revision 0.\n",
+ "* Verified revision 1.\n",
+ "* Verified revision 2.\n"], output)
else:
svntest.verify.compare_and_display_lines(
"Error while running 'svnadmin verify'.",
- 'STDERR', ["* Verified revision 0.\n",
+ 'STDOUT', ["* Verified revision 0.\n",
"* Verified revision 1.\n",
- "* Verified revision 2.\n"], errput)
+ "* Verified revision 2.\n"], output)
#----------------------------------------------------------------------
@@ -596,12 +776,14 @@ def verify_incremental_fsfs(sbox):
"""svnadmin verify detects corruption dump can't"""
# setup a repo with a directory 'c:hi'
- sbox.build(create_wc = False)
+ # use physical addressing as this is hard to provoke with logical addressing
+ sbox.build(create_wc = False,
+ minor_version = min(svntest.main.options.server_minor_version,8))
repo_url = sbox.repo_url
E_url = sbox.repo_url + '/A/B/E'
# Create A/B/E/bravo in r2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'log_msg',
E_url + '/bravo')
# Corrupt r2's reference to A/C by replacing "dir 7-1.0.r1/1568" with
@@ -834,7 +1016,7 @@ def load_with_parent_dir(sbox):
"'svnadmin load --parent-dir' reparents mergeinfo"
## See http://subversion.tigris.org/issues/show_bug.cgi?id=2983. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svnadmin_tests_data',
@@ -842,20 +1024,18 @@ def load_with_parent_dir(sbox):
dumpfile = open(dumpfile_location).read()
# Create 'sample' dir in sbox.repo_url, and load the dump stream there.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 1.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 1.\n'],
[], "mkdir", sbox.repo_url + "/sample",
"-m", "Create sample dir")
load_dumpstream(sbox, dumpfile, '--parent-dir', '/sample')
# Verify the svn:mergeinfo properties for '--parent-dir'
- svntest.actions.run_and_verify_svn(None,
- [sbox.repo_url +
+ svntest.actions.run_and_verify_svn([sbox.repo_url +
"/sample/branch - /sample/trunk:5-7\n"],
[], 'propget', 'svn:mergeinfo', '-R',
sbox.repo_url + '/sample/branch')
- svntest.actions.run_and_verify_svn(None,
- [sbox.repo_url +
+ svntest.actions.run_and_verify_svn([sbox.repo_url +
"/sample/branch1 - " +
"/sample/branch:6-9\n"],
[], 'propget', 'svn:mergeinfo', '-R',
@@ -864,21 +1044,19 @@ def load_with_parent_dir(sbox):
# Create 'sample-2' dir in sbox.repo_url, and load the dump stream again.
# This time, don't include a leading slash on the --parent-dir argument.
# See issue #3547.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 11.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 11.\n'],
[], "mkdir", sbox.repo_url + "/sample-2",
"-m", "Create sample-2 dir")
load_dumpstream(sbox, dumpfile, '--parent-dir', 'sample-2')
# Verify the svn:mergeinfo properties for '--parent-dir'.
- svntest.actions.run_and_verify_svn(None,
- [sbox.repo_url +
+ svntest.actions.run_and_verify_svn([sbox.repo_url +
"/sample-2/branch - " +
"/sample-2/trunk:15-17\n"],
[], 'propget', 'svn:mergeinfo', '-R',
sbox.repo_url + '/sample-2/branch')
- svntest.actions.run_and_verify_svn(None,
- [sbox.repo_url +
+ svntest.actions.run_and_verify_svn([sbox.repo_url +
"/sample-2/branch1 - " +
"/sample-2/branch:16-19\n"],
[], 'propget', 'svn:mergeinfo', '-R',
@@ -898,11 +1076,11 @@ def set_uuid(sbox):
orig_uuid = output[0].rstrip()
# Try setting a new, bogus UUID.
- svntest.actions.run_and_verify_svnadmin(None, None, '^.*Malformed UUID.*$',
+ svntest.actions.run_and_verify_svnadmin(None, '^.*Malformed UUID.*$',
'setuuid', sbox.repo_dir, 'abcdef')
# Try generating a brand new UUID.
- svntest.actions.run_and_verify_svnadmin(None, [], None,
+ svntest.actions.run_and_verify_svnadmin([], None,
'setuuid', sbox.repo_dir)
exit_code, output, errput = svntest.main.run_svnlook('uuid', sbox.repo_dir)
if errput:
@@ -913,7 +1091,7 @@ def set_uuid(sbox):
raise svntest.Failure
# Now, try setting the UUID back to the original value.
- svntest.actions.run_and_verify_svnadmin(None, [], None,
+ svntest.actions.run_and_verify_svnadmin([], None,
'setuuid', sbox.repo_dir, orig_uuid)
exit_code, output, errput = svntest.main.run_svnlook('uuid', sbox.repo_dir)
if errput:
@@ -930,7 +1108,7 @@ def reflect_dropped_renumbered_revs(sbox):
## See http://subversion.tigris.org/issues/show_bug.cgi?id=3020. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
@@ -938,7 +1116,8 @@ def reflect_dropped_renumbered_revs(sbox):
dumpfile = open(dumpfile_location).read()
# Create 'toplevel' dir in sbox.repo_url
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 1.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 1.\n'],
[], "mkdir", sbox.repo_url + "/toplevel",
"-m", "Create toplevel dir")
@@ -954,7 +1133,7 @@ def reflect_dropped_renumbered_revs(sbox):
url + "/trunk - /branch1:5-9\n",
url + "/toplevel/trunk - /toplevel/branch1:14-18\n",
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -969,10 +1148,10 @@ def fsfs_recover_handle_missing_revs_or_revprops_file(sbox):
# Commit up to r3, so we can test various recovery scenarios.
svntest.main.file_append(os.path.join(sbox.wc_dir, 'iota'), 'newer line\n')
- svntest.main.run_svn(None, 'ci', sbox.wc_dir, '--quiet', '-m', 'log msg')
+ sbox.simple_commit(message='log msg')
svntest.main.file_append(os.path.join(sbox.wc_dir, 'iota'), 'newest line\n')
- svntest.main.run_svn(None, 'ci', sbox.wc_dir, '--quiet', '-m', 'log msg')
+ sbox.simple_commit(message='log msg')
rev_3 = fsfs_file(sbox.repo_dir, 'revs', '3')
rev_was_3 = rev_3 + '.was'
@@ -1029,20 +1208,19 @@ def fsfs_recover_handle_missing_revs_or_revprops_file(sbox):
".*Revision 3 has a non-file where its revprops file should be.*"):
raise svntest.Failure
+ # Restore the r3 revprops file, thus repairing the repository.
+ os.rmdir(revprop_3)
+ os.rename(revprop_was_3, revprop_3)
+
#----------------------------------------------------------------------
+@Skip(svntest.main.tests_use_prepacakaged_repository)
def create_in_repo_subdir(sbox):
"'svnadmin create /path/to/repo/subdir'"
+ sbox.build(create_wc=False, empty=True)
repo_dir = sbox.repo_dir
- wc_dir = sbox.wc_dir
-
- svntest.main.safe_rmtree(repo_dir, 1)
- svntest.main.safe_rmtree(wc_dir)
-
- # This should succeed
- svntest.main.create_repos(repo_dir)
success = False
try:
@@ -1070,22 +1248,21 @@ def create_in_repo_subdir(sbox):
@SkipUnless(svntest.main.is_fs_type_fsfs)
+@SkipDumpLoadCrossCheck()
def verify_with_invalid_revprops(sbox):
"svnadmin verify detects invalid revprops file"
+ sbox.build(create_wc=False, empty=True)
repo_dir = sbox.repo_dir
- svntest.main.safe_rmtree(repo_dir, 1)
-
- # This should succeed
- svntest.main.create_repos(repo_dir)
-
# Run a test verify
exit_code, output, errput = svntest.main.run_svnadmin("verify",
sbox.repo_dir)
+ if errput:
+ raise SVNUnexpectedStderr(errput)
if svntest.verify.verify_outputs(
- "Output of 'svnadmin verify' is unexpected.", None, errput, None,
+ "Output of 'svnadmin verify' is unexpected.", None, output, None,
".*Verified revision 0*"):
raise svntest.Failure
@@ -1127,7 +1304,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
"don't filter mergeinfo revs from incremental dump"
# Create an empty repos.
- test_create(sbox)
+ sbox.build(empty=True)
# PART 1: Load a full dump to an empty repository.
#
@@ -1139,7 +1316,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
# | | | |
# trunk---r2---r3-----r5---r6-------r8---r9---------------> | |
# r1 | | | | | |
- # intial | | | |______ | |
+ # initial | | | |______ | |
# import copy | copy | merge merge
# | | | merge (r5) (r8)
# | | | (r9) | |
@@ -1187,7 +1364,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
url + "B2 - /trunk:9\n",
url + "B1/B/E - /branches/B2/B/E:11-12\n",
"/trunk/B/E:5-6,8-9\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -1216,7 +1393,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
dump_fp.close()
# Blow away the current repos and create an empty one in its place.
- test_create(sbox)
+ sbox.build(empty=True)
# Load the three incremental dump files in sequence.
load_dumpstream(sbox, open(dump_file_r1_10).read(), '--ignore-uuid')
@@ -1226,7 +1403,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
# Check the mergeinfo, we use the same expected output as before,
# as it (duh!) should be exactly the same as when we loaded the
# repos in one shot.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -1236,7 +1413,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
# PART 3: Load a full dump to an non-empty repository.
#
# Reset our sandbox.
- test_create(sbox)
+ sbox.build(empty=True)
# Load this skeleton repos into the empty target:
#
@@ -1280,14 +1457,14 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
url + "B2 - /Projects/Project-X/trunk:15\n",
url + "B1/B/E - /Projects/Project-X/branches/B2/B/E:17-18\n",
"/Projects/Project-X/trunk/B/E:11-12,14-15\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
# PART 4: Load a a series of incremental dumps to an non-empty repository.
#
# Reset our sandbox.
- test_create(sbox)
+ sbox.build(empty=True)
# Load this skeleton repos into the empty target:
load_dumpstream(sbox, dumpfile_skeleton, '--ignore-uuid')
@@ -1303,7 +1480,7 @@ def dont_drop_valid_mergeinfo_during_incremental_loads(sbox):
# Check the resulting mergeinfo. We expect the exact same results
# as Part 3.
# See http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -1315,14 +1492,12 @@ def hotcopy_symlink(sbox):
## See http://subversion.tigris.org/issues/show_bug.cgi?id=2591. ##
+ # Create a repository.
+ sbox.build(create_wc=False, empty=True)
original_repo = sbox.repo_dir
hotcopy_repo, hotcopy_url = sbox.add_repo_path('hotcopy')
- # Create a repository.
- svntest.main.safe_rmtree(original_repo, 1)
- svntest.main.create_repos(original_repo)
-
# Create a file, a dir and a missing path outside the repoitory.
svntest.main.safe_rmtree(sbox.wc_dir, 1)
os.mkdir(sbox.wc_dir)
@@ -1355,7 +1530,7 @@ def hotcopy_symlink(sbox):
os.symlink(target_abspath, symlink_path + '_abs')
svntest.actions.run_and_verify_svnadmin(
- None, None, [],
+ None, [],
"hotcopy", original_repo, hotcopy_repo)
# Check if the symlinks were copied correctly.
@@ -1418,7 +1593,7 @@ text
"""
- test_create(sbox)
+ sbox.build(empty=True)
# Try to load the dumpstream, expecting a failure (because of mixed EOLs).
load_and_verify_dumpstream(sbox, [], svntest.verify.AnyOutput,
@@ -1440,7 +1615,11 @@ def verify_non_utf8_paths(sbox):
"svnadmin verify with non-UTF-8 paths"
dumpfile = clean_dumpfile()
- test_create(sbox)
+
+ # Corruption only possible in physically addressed revisions created
+ # with pre-1.6 servers.
+ sbox.build(empty=True,
+ minor_version=min(svntest.main.options.server_minor_version,8))
# Load the dumpstream
load_and_verify_dumpstream(sbox, [], [], dumpfile_revisions, False,
@@ -1457,15 +1636,15 @@ def verify_non_utf8_paths(sbox):
if line == "A\n":
# replace 'A' with a latin1 character -- the new path is not valid UTF-8
fp_new.write("\xE6\n")
- elif line == "text: 1 279 32 0 d63ecce65d8c428b86f4f8b0920921fe\n":
- # fix up the representation checksum
- fp_new.write("text: 1 279 32 0 b50b1d5ed64075b5f632f3b8c30cd6b2\n")
- elif line == "text: 1 280 32 32 d63ecce65d8c428b86f4f8b0920921fe\n":
- # fix up the representation checksum
- fp_new.write("text: 1 280 32 32 b50b1d5ed64075b5f632f3b8c30cd6b2\n")
+ elif line == "text: 1 279 32 32 d63ecce65d8c428b86f4f8b0920921fe\n":
+ # phys, PLAIN directories: fix up the representation checksum
+ fp_new.write("text: 1 279 32 32 b50b1d5ed64075b5f632f3b8c30cd6b2\n")
elif line == "text: 1 292 44 32 a6be7b4cf075fd39e6a99eb69a31232b\n":
- # fix up the representation checksum
+ # phys, deltified directories: fix up the representation checksum
fp_new.write("text: 1 292 44 32 f2e93e73272cac0f18fccf16f224eb93\n")
+ elif line == "text: 1 6 31 31 90f306aa9bfd72f456072076a2bd94f7\n":
+ # log addressing: fix up the representation checksum
+ fp_new.write("text: 1 6 31 31 db2d4a0bad5dff0aea9a288dec02f1fb\n")
elif line == "cpath: /A\n":
# also fix up the 'created path' field
fp_new.write("cpath: /\xE6\n")
@@ -1491,8 +1670,8 @@ def verify_non_utf8_paths(sbox):
expected_stderr = [
"* Dumped revision 0.\n",
"WARNING 0x0002: E160005: "
- "While validating fspath '?\\230': "
- "Path '?\\230' is not in UTF-8"
+ "While validating fspath '?\\E6': "
+ "Path '?\\E6' is not in UTF-8"
"\n",
"* Dumped revision 1.\n",
]
@@ -1515,12 +1694,12 @@ def test_lslocks_and_rmlocks(sbox):
if exit_code or errput or output:
raise svntest.Failure("Error: 'lslocks' failed")
- expected_output = UnorderedOutput(
- ["'A/B/lambda' locked by user 'jrandom'.\n",
- "'iota' locked by user 'jrandom'.\n"])
+ expected_output = svntest.verify.UnorderedRegexListOutput(
+ ["'.*lambda' locked by user 'jrandom'.\n",
+ "'.*iota' locked by user 'jrandom'.\n"])
# Lock iota and A/B/lambda using svn client
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], "lock", "-m", "Locking files",
iota_url, lambda_url)
@@ -1582,7 +1761,7 @@ def load_ranges(sbox):
"'svnadmin load --revision X:Y'"
## See http://subversion.tigris.org/issues/show_bug.cgi?id=3734. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svnadmin_tests_data',
@@ -1593,17 +1772,27 @@ def load_ranges(sbox):
# Load our dumpfile, 2 revisions at a time, verifying that we have
# the correct youngest revision after each load.
load_dumpstream(sbox, dumpdata, '-r0:2')
- svntest.actions.run_and_verify_svnlook("Unexpected output", ['2\n'],
+ svntest.actions.run_and_verify_svnlook(['2\n'],
None, 'youngest', sbox.repo_dir)
load_dumpstream(sbox, dumpdata, '-r3:4')
- svntest.actions.run_and_verify_svnlook("Unexpected output", ['4\n'],
+ svntest.actions.run_and_verify_svnlook(['4\n'],
None, 'youngest', sbox.repo_dir)
load_dumpstream(sbox, dumpdata, '-r5:6')
- svntest.actions.run_and_verify_svnlook("Unexpected output", ['6\n'],
+ svntest.actions.run_and_verify_svnlook(['6\n'],
None, 'youngest', sbox.repo_dir)
# There are ordering differences in the property blocks.
- expected_dump = UnorderedOutput(dumplines)
+ if (svntest.main.options.server_minor_version < 6):
+ temp = []
+
+ for line in dumplines:
+ if not "Text-content-sha1:" in line:
+ temp.append(line)
+
+ expected_dump = UnorderedOutput(temp)
+ else:
+ expected_dump = UnorderedOutput(dumplines)
+
new_dumpdata = svntest.actions.run_and_verify_dump(sbox.repo_dir)
svntest.verify.compare_and_display_lines("Dump files", "DUMP",
expected_dump, new_dumpdata)
@@ -1620,7 +1809,7 @@ def hotcopy_incremental(sbox):
for i in [1, 2, 3]:
os.chdir(backup_dir)
svntest.actions.run_and_verify_svnadmin(
- None, None, [],
+ None, [],
"hotcopy", "--incremental", os.path.join(cwd, sbox.repo_dir), '.')
os.chdir(cwd)
@@ -1632,28 +1821,30 @@ def hotcopy_incremental(sbox):
sbox.simple_commit()
@SkipUnless(svntest.main.is_fs_type_fsfs)
+@SkipUnless(svntest.main.fs_has_pack)
def hotcopy_incremental_packed(sbox):
"'svnadmin hotcopy --incremental' with packing"
+
+ # Configure two files per shard to trigger packing.
sbox.build()
+ patch_format(sbox.repo_dir, shard_size=2)
backup_dir, backup_url = sbox.add_repo_path('backup')
os.mkdir(backup_dir)
cwd = os.getcwd()
- # Configure two files per shard to trigger packing
- format_file = open(os.path.join(sbox.repo_dir, 'db', 'format'), 'wb')
- format_file.write("6\nlayout sharded 2\n")
- format_file.close()
- # Pack revisions 0 and 1.
- svntest.actions.run_and_verify_svnadmin(
- None, ['Packing revisions in shard 0...done.\n'], [], "pack",
- os.path.join(cwd, sbox.repo_dir))
+ # Pack revisions 0 and 1 if not already packed.
+ if not (svntest.main.is_fs_type_fsfs and svntest.main.options.fsfs_packing
+ and svntest.main.options.fsfs_sharding == 2):
+ svntest.actions.run_and_verify_svnadmin(
+ ['Packing revisions in shard 0...done.\n'], [], "pack",
+ os.path.join(cwd, sbox.repo_dir))
# Commit 5 more revs, hotcopy and pack after each commit.
for i in [1, 2, 3, 4, 5]:
os.chdir(backup_dir)
svntest.actions.run_and_verify_svnadmin(
- None, None, [],
+ None, [],
"hotcopy", "--incremental", os.path.join(cwd, sbox.repo_dir), '.')
os.chdir(cwd)
@@ -1663,12 +1854,13 @@ def hotcopy_incremental_packed(sbox):
if i < 5:
sbox.simple_mkdir("newdir-%i" % i)
sbox.simple_commit()
- if not i % 2:
+ if (svntest.main.is_fs_type_fsfs and not svntest.main.options.fsfs_packing
+ and not i % 2):
expected_output = ['Packing revisions in shard %d...done.\n' % (i/2)]
else:
expected_output = []
svntest.actions.run_and_verify_svnadmin(
- None, expected_output, [], "pack", os.path.join(cwd, sbox.repo_dir))
+ expected_output, [], "pack", os.path.join(cwd, sbox.repo_dir))
def locking(sbox):
@@ -1683,7 +1875,7 @@ def locking(sbox):
# Test illegal character in comment file.
expected_error = ".*svnadmin: E130004:.*"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "lock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1691,7 +1883,7 @@ def locking(sbox):
# Test locking path with --bypass-hooks
expected_output = "'iota' locked by user 'jrandom'."
- svntest.actions.run_and_verify_svnadmin(None, expected_output,
+ svntest.actions.run_and_verify_svnadmin(expected_output,
None, "lock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1699,13 +1891,13 @@ def locking(sbox):
"--bypass-hooks")
# Remove lock
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
None, "rmlocks",
sbox.repo_dir, "iota")
# Test locking path without --bypass-hooks
expected_output = "'iota' locked by user 'jrandom'."
- svntest.actions.run_and_verify_svnadmin(None, expected_output,
+ svntest.actions.run_and_verify_svnadmin(expected_output,
None, "lock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1713,7 +1905,7 @@ def locking(sbox):
# Test locking already locked path.
expected_error = ".*svnadmin: E160035:.*"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "lock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1721,7 +1913,7 @@ def locking(sbox):
# Test locking non-existent path.
expected_error = ".*svnadmin: E160013:.*"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "lock",
sbox.repo_dir,
"non-existent", "jrandom",
@@ -1730,7 +1922,7 @@ def locking(sbox):
# Test locking a path while specifying a lock token.
expected_output = "'A/D/G/rho' locked by user 'jrandom'."
lock_token = "opaquelocktoken:01234567-89ab-cdef-89ab-cdef01234567"
- svntest.actions.run_and_verify_svnadmin(None, expected_output,
+ svntest.actions.run_and_verify_svnadmin(expected_output,
None, "lock",
sbox.repo_dir,
"A/D/G/rho", "jrandom",
@@ -1739,7 +1931,7 @@ def locking(sbox):
# Test unlocking a path, but provide the wrong lock token.
expected_error = ".*svnadmin: E160040:.*"
wrong_lock_token = "opaquelocktoken:12345670-9ab8-defc-9ab8-def01234567c"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "unlock",
sbox.repo_dir,
"A/D/G/rho", "jrandom",
@@ -1748,7 +1940,7 @@ def locking(sbox):
# Test unlocking the path again, but this time provide the correct
# lock token.
expected_output = "'A/D/G/rho' unlocked."
- svntest.actions.run_and_verify_svnadmin(None, expected_output,
+ svntest.actions.run_and_verify_svnadmin(expected_output,
None, "unlock",
sbox.repo_dir,
"A/D/G/rho", "jrandom",
@@ -1763,7 +1955,7 @@ def locking(sbox):
# Test locking a path. Don't use --bypass-hooks, though, as we wish
# to verify that hook script is really getting executed.
expected_error = ".*svnadmin: E165001:.*"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "lock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1785,7 +1977,7 @@ def locking(sbox):
# Try to unlock a path while providing the correct lock token but
# with a preventative hook in place.
expected_error = ".*svnadmin: E165001:.*"
- svntest.actions.run_and_verify_svnadmin(None, None,
+ svntest.actions.run_and_verify_svnadmin(None,
expected_error, "unlock",
sbox.repo_dir,
"iota", "jrandom",
@@ -1794,7 +1986,7 @@ def locking(sbox):
# Finally, use --bypass-hooks to unlock the path (again using the
# correct lock token).
expected_output = "'iota' unlocked."
- svntest.actions.run_and_verify_svnadmin(None, expected_output,
+ svntest.actions.run_and_verify_svnadmin(expected_output,
None, "unlock",
"--bypass-hooks",
sbox.repo_dir,
@@ -1842,15 +2034,370 @@ def mergeinfo_race(sbox):
@Issue(4213)
+@Skip(svntest.main.is_fs_type_fsx)
def recover_old_empty(sbox):
"recover empty --compatible-version=1.3"
- svntest.main.safe_rmtree(sbox.repo_dir, 1)
- svntest.main.create_repos(sbox.repo_dir, minor_version=3)
- svntest.actions.run_and_verify_svnadmin(None, None, [],
+ sbox.build(create_wc=False, empty=True, minor_version=3)
+ svntest.actions.run_and_verify_svnadmin(None, [],
"recover", sbox.repo_dir)
@SkipUnless(svntest.main.is_fs_type_fsfs)
+def verify_keep_going(sbox):
+ "svnadmin verify --keep-going test"
+
+ sbox.build(create_wc = False)
+ repo_url = sbox.repo_url
+ B_url = sbox.repo_url + '/B'
+ C_url = sbox.repo_url + '/C'
+
+ # Create A/B/E/bravo in r2.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ B_url)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ C_url)
+
+ r2 = fsfs_file(sbox.repo_dir, 'revs', '2')
+ fp = open(r2, 'r+b')
+ fp.write("""inserting junk to corrupt the rev""")
+ fp.close()
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ "--keep-going",
+ sbox.repo_dir)
+
+ exp_out = svntest.verify.RegexListOutput([".*Verified revision 0.",
+ ".*Verified revision 1.",
+ ".*",
+ ".*Summary.*",
+ ".*r2: E160004:.*",
+ ".*r2: E160004:.*",
+ ".*r3: E160004:.*",
+ ".*r3: E160004:.*"])
+
+ if (svntest.main.fs_has_rep_sharing()):
+ exp_out.insert(0, ".*Verifying.*metadata.*")
+
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*",
+ ".*Error verifying revision 3.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*",
+ "svnadmin: E205012:.*"], False)
+
+ if (svntest.main.is_fs_log_addressing()):
+ exp_err.insert(0, ".*Error verifying repository metadata.")
+ exp_err.insert(1, "svnadmin: E160004:.*")
+
+ if svntest.verify.verify_outputs("Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ sbox.repo_dir)
+
+ if (svntest.main.is_fs_log_addressing()):
+ exp_out = svntest.verify.RegexListOutput([".*Verifying metadata at revision 0"])
+ else:
+ exp_out = svntest.verify.RegexListOutput([".*Verified revision 0.",
+ ".*Verified revision 1."])
+ if (svntest.main.fs_has_rep_sharing()):
+ exp_out.insert(0, ".*Verifying repository metadata.*")
+
+ if (svntest.main.is_fs_log_addressing()):
+ exp_err = svntest.verify.RegexListOutput([
+ ".*Error verifying repository metadata.",
+ "svnadmin: E160004:.*"], False)
+ else:
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*"], False)
+
+ if svntest.verify.verify_outputs("Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ "--quiet",
+ sbox.repo_dir)
+
+ if (svntest.main.is_fs_log_addressing()):
+ exp_err = svntest.verify.RegexListOutput([
+ ".*Error verifying repository metadata.",
+ "svnadmin: E160004:.*"], False)
+ else:
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*"], False)
+
+ if svntest.verify.verify_outputs("Output of 'svnadmin verify' is unexpected.",
+ None, errput, None, exp_err):
+ raise svntest.Failure
+
+ # Don't leave a corrupt repository
+ svntest.main.safe_rmtree(sbox.repo_dir, True)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def verify_keep_going_quiet(sbox):
+ "svnadmin verify --keep-going --quiet test"
+
+ sbox.build(create_wc = False)
+ repo_url = sbox.repo_url
+ B_url = sbox.repo_url + '/B'
+ C_url = sbox.repo_url + '/C'
+
+ # Create A/B/E/bravo in r2.
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ B_url)
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ C_url)
+
+ r2 = fsfs_file(sbox.repo_dir, 'revs', '2')
+ fp = open(r2, 'r+b')
+ fp.write("""inserting junk to corrupt the rev""")
+ fp.close()
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ "--keep-going",
+ "--quiet",
+ sbox.repo_dir)
+
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*",
+ ".*Error verifying revision 3.",
+ "svnadmin: E160004:.*",
+ "svnadmin: E160004:.*",
+ "svnadmin: E205012:.*"], False)
+
+ # Insert another expected error from checksum verification
+ if (svntest.main.is_fs_log_addressing()):
+ exp_err.insert(0, ".*Error verifying repository metadata.")
+ exp_err.insert(1, "svnadmin: E160004:.*")
+
+ if svntest.verify.verify_outputs(
+ "Unexpected error while running 'svnadmin verify'.",
+ output, errput, None, exp_err):
+ raise svntest.Failure
+
+ # Don't leave a corrupt repository
+ svntest.main.safe_rmtree(sbox.repo_dir, True)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def verify_invalid_path_changes(sbox):
+ "detect invalid changed path list entries"
+
+ sbox.build(create_wc = False)
+ repo_url = sbox.repo_url
+
+ # Create a number of revisions each adding a single path
+ for r in range(2,20):
+ svntest.actions.run_and_verify_svn(None, [],
+ 'mkdir', '-m', 'log_msg',
+ sbox.repo_url + '/B' + str(r))
+
+ # modify every other revision to make sure that errors are not simply
+ # "carried over" but that all corrupts we get detected independently
+
+ # add existing node
+ set_changed_path_list(sbox, 2,
+ "_0.0.t1-1 add-dir false false /A\n\n")
+
+ # add into non-existent parent
+ set_changed_path_list(sbox, 4,
+ "_0.0.t3-2 add-dir false false /C/X\n\n")
+
+ # del non-existent node
+ set_changed_path_list(sbox, 6,
+ "_0.0.t5-2 delete-dir false false /C\n\n")
+
+ # del existent node of the wrong kind
+ #
+ # THIS WILL NOT BE DETECTED
+ # since dump mechanism and file don't care about the types of deleted nodes
+ set_changed_path_list(sbox, 8,
+ "_0.0.t7-2 delete-file false false /B3\n\n")
+
+ # copy from non-existent node
+ set_changed_path_list(sbox, 10,
+ "_0.0.t9-2 add-dir false false /B10\n"
+ "6 /B8\n")
+
+ # copy from existing node of the wrong kind
+ set_changed_path_list(sbox, 12,
+ "_0.0.t11-2 add-file false false /B12\n"
+ "9 /B8\n")
+
+ # modify non-existent node
+ set_changed_path_list(sbox, 14,
+ "_0.0.t13-2 modify-file false false /A/D/H/foo\n\n")
+
+ # modify existent node of the wrong kind
+ set_changed_path_list(sbox, 16,
+ "_0.0.t15-2 modify-file false false /B12\n\n")
+
+ # replace non-existent node
+ set_changed_path_list(sbox, 18,
+ "_0.0.t17-2 replace-file false false /A/D/H/foo\n\n")
+
+ # find corruptions
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ "--keep-going",
+ sbox.repo_dir)
+
+ exp_out = svntest.verify.RegexListOutput([".*Verified revision 0.",
+ ".*Verified revision 1.",
+ ".*Verified revision 3.",
+ ".*Verified revision 5.",
+ ".*Verified revision 7.",
+ ".*Verified revision 8.",
+ ".*Verified revision 9.",
+ ".*Verified revision 11.",
+ ".*Verified revision 13.",
+ ".*Verified revision 15.",
+ ".*Verified revision 17.",
+ ".*Verified revision 19.",
+ ".*",
+ ".*Summary.*",
+ ".*r2: E160020:.*",
+ ".*r2: E160020:.*",
+ ".*r4: E160013:.*",
+ ".*r6: E160013:.*",
+ ".*r6: E160013:.*",
+ ".*r10: E160013:.*",
+ ".*r10: E160013:.*",
+ ".*r12: E145001:.*",
+ ".*r12: E145001:.*",
+ ".*r14: E160013:.*",
+ ".*r14: E160013:.*",
+ ".*r16: E145001:.*",
+ ".*r16: E145001:.*",
+ ".*r18: E160013:.*",
+ ".*r18: E160013:.*"])
+ if (svntest.main.fs_has_rep_sharing()):
+ exp_out.insert(0, ".*Verifying.*metadata.*")
+ if svntest.main.is_fs_log_addressing():
+ exp_out.insert(1, ".*Verifying.*metadata.*")
+
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160020:.*",
+ "svnadmin: E160020:.*",
+ ".*Error verifying revision 4.",
+ "svnadmin: E160013:.*",
+ ".*Error verifying revision 6.",
+ "svnadmin: E160013:.*",
+ "svnadmin: E160013:.*",
+ ".*Error verifying revision 10.",
+ "svnadmin: E160013:.*",
+ "svnadmin: E160013:.*",
+ ".*Error verifying revision 12.",
+ "svnadmin: E145001:.*",
+ "svnadmin: E145001:.*",
+ ".*Error verifying revision 14.",
+ "svnadmin: E160013:.*",
+ "svnadmin: E160013:.*",
+ ".*Error verifying revision 16.",
+ "svnadmin: E145001:.*",
+ "svnadmin: E145001:.*",
+ ".*Error verifying revision 18.",
+ "svnadmin: E160013:.*",
+ "svnadmin: E160013:.*",
+ "svnadmin: E205012:.*"], False)
+
+
+ if svntest.verify.verify_outputs("Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ sbox.repo_dir)
+
+ exp_out = svntest.verify.RegexListOutput([".*Verified revision 0.",
+ ".*Verified revision 1."])
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160020:.*",
+ "svnadmin: E160020:.*"], False)
+
+ if (svntest.main.fs_has_rep_sharing()):
+ exp_out.insert(0, ".*Verifying.*metadata.*")
+ if svntest.main.is_fs_log_addressing():
+ exp_out.insert(1, ".*Verifying.*metadata.*")
+ if svntest.verify.verify_outputs("Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ "--quiet",
+ sbox.repo_dir)
+
+ exp_out = []
+ exp_err = svntest.verify.RegexListOutput([".*Error verifying revision 2.",
+ "svnadmin: E160020:.*",
+ "svnadmin: E160020:.*"], False)
+
+ if svntest.verify.verify_outputs("Output of 'svnadmin verify' is unexpected.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+ # Don't leave a corrupt repository
+ svntest.main.safe_rmtree(sbox.repo_dir, True)
+
+
+def verify_denormalized_names(sbox):
+ "detect denormalized names and name collisions"
+
+ sbox.build(create_wc=False, empty=True)
+
+ dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
+ 'svnadmin_tests_data',
+ 'normalization_check.dump')
+ load_dumpstream(sbox, open(dumpfile_location).read())
+
+ exit_code, output, errput = svntest.main.run_svnadmin(
+ "verify", "--check-normalization", sbox.repo_dir)
+
+ expected_output_regex_list = [
+ ".*Verified revision 0.",
+ ".*Verified revision 1.",
+ ".*Verified revision 2.",
+ ".*Verified revision 3.",
+ # A/{Eacute}/{aring}lpha
+ "WARNING 0x0003: Duplicate representation of path 'A/.*/.*lpha'",
+ ".*Verified revision 4.",
+ ".*Verified revision 5.",
+ # Q/{aring}lpha
+ "WARNING 0x0004: Duplicate representation of path '/Q/.*lpha'"
+ # A/{Eacute}
+ " in svn:mergeinfo property of 'A/.*'",
+ ".*Verified revision 6.",
+ ".*Verified revision 7."]
+
+ # The BDB backend doesn't do global metadata verification.
+ if (svntest.main.fs_has_rep_sharing()):
+ expected_output_regex_list.insert(0, ".*Verifying repository metadata.*")
+
+ if svntest.main.is_fs_log_addressing():
+ expected_output_regex_list.insert(0, ".* Verifying metadata at revision 0.*")
+
+ exp_out = svntest.verify.RegexListOutput(expected_output_regex_list)
+ exp_err = svntest.verify.ExpectedOutput([])
+
+ svntest.verify.verify_outputs(
+ "Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
def fsfs_recover_old_non_empty(sbox):
"fsfs recover non-empty --compatible-version=1.3"
@@ -1859,7 +2406,7 @@ def fsfs_recover_old_non_empty(sbox):
# svnadmin: E200002: Serialized hash missing terminator
sbox.build(create_wc=False, minor_version=3)
- svntest.actions.run_and_verify_svnadmin(None, None, [], "recover",
+ svntest.actions.run_and_verify_svnadmin(None, [], "recover",
sbox.repo_dir)
@@ -1873,12 +2420,694 @@ def fsfs_hotcopy_old_non_empty(sbox):
sbox.build(create_wc=False, minor_version=3)
backup_dir, backup_url = sbox.add_repo_path('backup')
- svntest.actions.run_and_verify_svnadmin(None, None, [], "hotcopy",
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
sbox.repo_dir, backup_dir)
check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+def load_ignore_dates(sbox):
+ "svnadmin load --ignore-dates"
+
+ # All revisions in the loaded repository should come after this time.
+ start_time = time.localtime()
+ time.sleep(1)
+
+ sbox.build(create_wc=False, empty=True)
+
+ dumpfile_skeleton = open(os.path.join(os.path.dirname(sys.argv[0]),
+ 'svnadmin_tests_data',
+ 'skeleton_repos.dump')).read()
+
+ load_dumpstream(sbox, dumpfile_skeleton, '--ignore-dates')
+ svntest.actions.run_and_verify_svnlook(['6\n'],
+ None, 'youngest', sbox.repo_dir)
+ for rev in range(1, 6):
+ exit_code, output, errput = svntest.main.run_svnlook('date', '-r', rev,
+ sbox.repo_dir)
+ if errput:
+ raise SVNUnexpectedStderr(errput)
+ rev_time = time.strptime(output[0].rstrip()[:19], '%Y-%m-%d %H:%M:%S')
+ if rev_time < start_time:
+ raise svntest.Failure("Revision time for r%d older than load start time\n"
+ " rev_time: %s\n"
+ " start_time: %s"
+ % (rev, str(rev_time), str(start_time)))
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def fsfs_hotcopy_old_with_id_changes(sbox):
+ "fsfs hotcopy old with node-id and copy-id changes"
+
+ # Around trunk@1573728, running 'svnadmin hotcopy' for the
+ # --compatible-version=1.3 repository with certain node-id and copy-id
+ # changes ended with mismatching db/current in source and destination:
+ #
+ # source: "2 l 1" destination: "2 k 1",
+ # "3 l 2" "3 4 2"
+ # (and so on...)
+ #
+ # We test this case by creating a --compatible-version=1.3 repository
+ # and committing things that result in node-id and copy-id changes.
+ # After every commit, we hotcopy the repository to a new destination
+ # and check whether the source of the backup and the backup itself are
+ # identical. We also maintain a separate --incremental backup, which
+ # is updated and checked after every commit.
+ sbox.build(create_wc=True, minor_version=3)
+
+ inc_backup_dir, inc_backup_url = sbox.add_repo_path('incremental-backup')
+
+ # r1 = Initial greek tree sandbox.
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r1')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r2 = Add a new property.
+ sbox.simple_propset('foo', 'bar', 'A/mu')
+ sbox.simple_commit(message='r2')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r2')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r3 = Copy a file.
+ sbox.simple_copy('A/B/E', 'A/B/E1')
+ sbox.simple_commit(message='r3')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r3')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r4 = Remove an existing file ...
+ sbox.simple_rm('A/D/gamma')
+ sbox.simple_commit(message='r4')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r4')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r5 = ...and replace it with a new file here.
+ sbox.simple_add_text("This is the replaced file.\n", 'A/D/gamma')
+ sbox.simple_commit(message='r5')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r5')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r6 = Add an entirely new file.
+ sbox.simple_add_text('This is an entirely new file.\n', 'A/C/mu1')
+ sbox.simple_commit(message='r6')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r6')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+ # r7 = Change the content of the existing file (this changeset does
+ # not bump the next-id and copy-id counters in the repository).
+ sbox.simple_append('A/mu', 'This is change in the existing file.\n')
+ sbox.simple_commit(message='r7')
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-after-r7')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ "--incremental",
+ sbox.repo_dir, inc_backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, backup_dir)
+ check_hotcopy_fsfs(sbox.repo_dir, inc_backup_dir)
+
+
+@SkipUnless(svntest.main.fs_has_pack)
+def verify_packed(sbox):
+ "verify packed with small shards"
+
+ # Configure two files per shard to trigger packing.
+ sbox.build()
+ patch_format(sbox.repo_dir, shard_size=2)
+
+ # Play with our greek tree. These changesets fall into two
+ # separate shards with r2 and r3 being in shard 1 ...
+ sbox.simple_append('iota', "Line.\n")
+ sbox.simple_append('A/D/gamma', "Another line.\n")
+ sbox.simple_commit(message='r2')
+ sbox.simple_propset('foo', 'bar', 'iota')
+ sbox.simple_propset('foo', 'baz', 'A/mu')
+ sbox.simple_commit(message='r3')
+
+ # ...and r4 and r5 being in shard 2.
+ sbox.simple_rm('A/C')
+ sbox.simple_copy('A/B/E', 'A/B/E1')
+ sbox.simple_move('A/mu', 'A/B/mu')
+ sbox.simple_commit(message='r4')
+ sbox.simple_propdel('foo', 'A/B/mu')
+ sbox.simple_commit(message='r5')
+
+ if svntest.main.is_fs_type_fsfs and svntest.main.options.fsfs_packing:
+ # With --fsfs-packing, everything is already packed and we
+ # can skip this part.
+ pass
+ else:
+ expected_output = ["Packing revisions in shard 0...done.\n",
+ "Packing revisions in shard 1...done.\n",
+ "Packing revisions in shard 2...done.\n"]
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ "pack", sbox.repo_dir)
+
+ if svntest.main.is_fs_log_addressing():
+ expected_output = ["* Verifying metadata at revision 0 ...\n",
+ "* Verifying metadata at revision 2 ...\n",
+ "* Verifying metadata at revision 4 ...\n",
+ "* Verifying repository metadata ...\n",
+ "* Verified revision 0.\n",
+ "* Verified revision 1.\n",
+ "* Verified revision 2.\n",
+ "* Verified revision 3.\n",
+ "* Verified revision 4.\n",
+ "* Verified revision 5.\n"]
+ else:
+ expected_output = ["* Verifying repository metadata ...\n",
+ "* Verified revision 0.\n",
+ "* Verified revision 1.\n",
+ "* Verified revision 2.\n",
+ "* Verified revision 3.\n",
+ "* Verified revision 4.\n",
+ "* Verified revision 5.\n"]
+
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ "verify", sbox.repo_dir)
+
+# Test that 'svnadmin freeze' is nestable. (For example, this ensures it
+# won't take system-global locks, only repository-scoped ones.)
+#
+# This could be useful to easily freeze a small number of repositories at once.
+#
+# ### We don't actually test that freeze takes a write lock anywhere (not even
+# ### in C tests.)
+def freeze_freeze(sbox):
+ "svnadmin freeze svnadmin freeze (some-cmd)"
+
+ sbox.build(create_wc=False, read_only=True)
+ second_repo_dir, _ = sbox.add_repo_path('backup')
+ svntest.actions.run_and_verify_svnadmin(None, [], "hotcopy",
+ sbox.repo_dir, second_repo_dir)
+
+ if svntest.main.is_fs_type_fsx() or \
+ (svntest.main.is_fs_type_fsfs() and \
+ svntest.main.options.server_minor_version < 9):
+ # FSFS repositories created with --compatible-version=1.8 and less
+ # erroneously share the filesystem data (locks, shared transaction
+ # data, ...) between hotcopy source and destination. This is fixed
+ # for new FS formats, but in order to avoid a deadlock for old formats,
+ # we have to manually assign a new UUID for the hotcopy destination.
+ # As of trunk@1618024, the same applies to FSX repositories.
+ svntest.actions.run_and_verify_svnadmin([], None,
+ 'setuuid', second_repo_dir)
+
+ svntest.actions.run_and_verify_svnadmin(None, [],
+ 'freeze', '--', sbox.repo_dir,
+ svntest.main.svnadmin_binary, 'freeze', '--', second_repo_dir,
+ sys.executable, '-c', 'True')
+
+ arg_file = sbox.get_tempname()
+ svntest.main.file_write(arg_file,
+ "%s\n%s\n" % (sbox.repo_dir, second_repo_dir))
+
+ svntest.actions.run_and_verify_svnadmin(None, [],
+ 'freeze', '-F', arg_file, '--',
+ sys.executable, '-c', 'True')
+
+def verify_metadata_only(sbox):
+ "verify metadata only"
+
+ sbox.build(create_wc = False)
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ sbox.repo_dir,
+ "--metadata-only")
+ if errput:
+ raise SVNUnexpectedStderr(errput)
+
+ # Unfortunately, older formats won't test as thoroughly than newer ones
+ # resulting in different progress output. BDB will do a full check but
+ # not produce any output.
+ if svntest.main.is_fs_log_addressing():
+ svntest.verify.compare_and_display_lines(
+ "Unexpected error while running 'svnadmin verify'.",
+ 'STDOUT', ["* Verifying metadata at revision 0 ...\n",
+ "* Verifying repository metadata ...\n"], output)
+ elif svntest.main.fs_has_rep_sharing() \
+ and not svntest.main.is_fs_type_bdb():
+ svntest.verify.compare_and_display_lines(
+ "Unexpected error while running 'svnadmin verify'.",
+ 'STDOUT', ["* Verifying repository metadata ...\n"], output)
+ else:
+ svntest.verify.compare_and_display_lines(
+ "Unexpected error while running 'svnadmin verify'.",
+ 'STDOUT', [], output)
+
+
+@Skip(svntest.main.is_fs_type_bdb)
+def verify_quickly(sbox):
+ "verify quickly using metadata"
+
+ sbox.build(create_wc = False)
+ rev_file = open(fsfs_file(sbox.repo_dir, 'revs', '1'), 'r+b')
+
+ # set new contents
+ rev_file.seek(8)
+ rev_file.write('#')
+ rev_file.close()
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify",
+ sbox.repo_dir,
+ "--metadata-only")
+
+ # unfortunately, some backends needs to do more checks than other
+ # resulting in different progress output
+ if svntest.main.is_fs_log_addressing():
+ exp_out = svntest.verify.RegexListOutput([])
+ exp_err = svntest.verify.RegexListOutput(["svnadmin: E160004:.*"], False)
+ else:
+ exp_out = svntest.verify.RegexListOutput([])
+ exp_err = svntest.verify.RegexListOutput([])
+
+ if (svntest.main.fs_has_rep_sharing()):
+ exp_out.insert(0, ".*Verifying.*metadata.*")
+ if svntest.verify.verify_outputs("Unexpected error while running 'svnadmin verify'.",
+ output, errput, exp_out, exp_err):
+ raise svntest.Failure
+
+ # Don't leave a corrupt repository
+ svntest.main.safe_rmtree(sbox.repo_dir, True)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+@SkipUnless(svntest.main.fs_has_pack)
+def fsfs_hotcopy_progress(sbox):
+ "hotcopy progress reporting"
+
+ # Check how 'svnadmin hotcopy' reports progress for non-incremental
+ # and incremental scenarios. The progress output can be affected by
+ # the --fsfs-packing option, so skip the test if that is the case.
+ if svntest.main.options.fsfs_packing:
+ raise svntest.Skip
+
+ # Create an empty repository, configure three files per shard.
+ sbox.build(create_wc=False, empty=True)
+ patch_format(sbox.repo_dir, shard_size=3)
+
+ inc_backup_dir, inc_backup_url = sbox.add_repo_path('incremental-backup')
+
+ # Nothing really exciting for the empty repository.
+ expected_full = [
+ "* Copied revision 0.\n"
+ ]
+ expected_incremental = [
+ "* Copied revision 0.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-0')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+ # Commit three revisions. After this step we have a full shard
+ # (r0, r1, r2) and the second shard (r3) with a single revision.
+ for i in range(3):
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir-%i' % i)
+ expected_full = [
+ "* Copied revision 0.\n",
+ "* Copied revision 1.\n",
+ "* Copied revision 2.\n",
+ "* Copied revision 3.\n",
+ ]
+ expected_incremental = [
+ "* Copied revision 1.\n",
+ "* Copied revision 2.\n",
+ "* Copied revision 3.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-1')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+ # Pack everything (r3 is still unpacked) and hotcopy again. In this case,
+ # the --incremental output should track the incoming (r0, r1, r2) pack and
+ # should not mention r3, because it is already a part of the destination
+ # and is *not* a part of the incoming pack.
+ svntest.actions.run_and_verify_svnadmin(None, [], 'pack',
+ sbox.repo_dir)
+ expected_full = [
+ "* Copied revisions from 0 to 2.\n",
+ "* Copied revision 3.\n",
+ ]
+ expected_incremental = [
+ "* Copied revisions from 0 to 2.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-2')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+ # Fill the second shard, pack again, commit several unpacked revisions
+ # on top of it. Rerun the hotcopy and check the progress output.
+ for i in range(4, 6):
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir-%i' % i)
+
+ svntest.actions.run_and_verify_svnadmin(None, [], 'pack',
+ sbox.repo_dir)
+
+ for i in range(6, 8):
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir-%i' % i)
+ expected_full = [
+ "* Copied revisions from 0 to 2.\n",
+ "* Copied revisions from 3 to 5.\n",
+ "* Copied revision 6.\n",
+ "* Copied revision 7.\n",
+ ]
+ expected_incremental = [
+ "* Copied revisions from 3 to 5.\n",
+ "* Copied revision 6.\n",
+ "* Copied revision 7.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-3')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def fsfs_hotcopy_progress_with_revprop_changes(sbox):
+ "incremental hotcopy progress with changed revprops"
+
+ # The progress output can be affected by the --fsfs-packing
+ # option, so skip the test if that is the case.
+ if svntest.main.options.fsfs_packing:
+ raise svntest.Skip
+
+ # Create an empty repository, commit several revisions and hotcopy it.
+ sbox.build(create_wc=False, empty=True)
+
+ for i in range(6):
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir-%i' % i)
+ expected_output = [
+ "* Copied revision 0.\n",
+ "* Copied revision 1.\n",
+ "* Copied revision 2.\n",
+ "* Copied revision 3.\n",
+ "* Copied revision 4.\n",
+ "* Copied revision 5.\n",
+ "* Copied revision 6.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup')
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+
+ # Amend a few log messages in the source, run the --incremental hotcopy.
+ # The progress output should only mention the corresponding revisions.
+ revprop_file = sbox.get_tempname()
+ svntest.main.file_write(revprop_file, "Modified log message.")
+
+ for i in [1, 3, 6]:
+ svntest.actions.run_and_verify_svnadmin(None, [],
+ 'setrevprop',
+ sbox.repo_dir, '-r', i,
+ 'svn:log', revprop_file)
+ expected_output = [
+ "* Copied revision 1.\n",
+ "* Copied revision 3.\n",
+ "* Copied revision 6.\n",
+ ]
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, backup_dir)
+
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def fsfs_hotcopy_progress_old(sbox):
+ "hotcopy --compatible-version=1.3 progress"
+
+ sbox.build(create_wc=False, empty=True, minor_version=3)
+
+ inc_backup_dir, inc_backup_url = sbox.add_repo_path('incremental-backup')
+
+ # Nothing really exciting for the empty repository.
+ expected_full = [
+ "* Copied revision 0.\n"
+ ]
+ expected_incremental = [
+ "* Copied revision 0.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-0')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+ # Commit three revisions, hotcopy and check the progress output.
+ for i in range(3):
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir-%i' % i)
+
+ expected_full = [
+ "* Copied revision 0.\n",
+ "* Copied revision 1.\n",
+ "* Copied revision 2.\n",
+ "* Copied revision 3.\n",
+ ]
+ expected_incremental = [
+ "* Copied revision 1.\n",
+ "* Copied revision 2.\n",
+ "* Copied revision 3.\n",
+ ]
+
+ backup_dir, backup_url = sbox.add_repo_path('backup-1')
+ svntest.actions.run_and_verify_svnadmin(expected_full, [],
+ 'hotcopy',
+ sbox.repo_dir, backup_dir)
+ svntest.actions.run_and_verify_svnadmin(expected_incremental, [],
+ 'hotcopy', '--incremental',
+ sbox.repo_dir, inc_backup_dir)
+
+
+@SkipUnless(svntest.main.fs_has_unique_freeze)
+def freeze_same_uuid(sbox):
+ "freeze multiple repositories with same UUID"
+
+ sbox.build(create_wc=False)
+
+ first_repo_dir, _ = sbox.add_repo_path('first')
+ second_repo_dir, _ = sbox.add_repo_path('second')
+
+ # Test that 'svnadmin freeze A (svnadmin freeze B)' does not deadlock for
+ # new FSFS formats, even if 'A' and 'B' share the same UUID. Create two
+ # repositories by loading the same dump file, ...
+ svntest.main.create_repos(first_repo_dir)
+ svntest.main.create_repos(second_repo_dir)
+
+ dump_path = os.path.join(os.path.dirname(sys.argv[0]),
+ 'svnadmin_tests_data',
+ 'skeleton_repos.dump')
+ dump_contents = open(dump_path, 'rb').readlines()
+ svntest.actions.run_and_verify_load(first_repo_dir, dump_contents)
+ svntest.actions.run_and_verify_load(second_repo_dir, dump_contents)
+
+ # ...and execute the 'svnadmin freeze -F' command.
+ arg_file = sbox.get_tempname()
+ svntest.main.file_write(arg_file,
+ "%s\n%s\n" % (first_repo_dir, second_repo_dir))
+
+ svntest.actions.run_and_verify_svnadmin(None, None,
+ 'freeze', '-F', arg_file, '--',
+ sys.executable, '-c', 'True')
+
+
+@Skip(svntest.main.is_fs_type_fsx)
+def upgrade(sbox):
+ "upgrade --compatible-version=1.3"
+
+ sbox.build(create_wc=False, minor_version=3)
+ svntest.actions.run_and_verify_svnadmin(None, [], "upgrade",
+ sbox.repo_dir)
+ # Does the repository work after upgrade?
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [], 'mkdir',
+ '-m', svntest.main.make_log_msg(),
+ sbox.repo_url + '/dir')
+
+def load_txdelta(sbox):
+ "exercising svn_txdelta_target on BDB"
+
+ sbox.build(empty=True)
+
+ # This dumpfile produced a BDB repository that generated cheksum
+ # mismatches on read caused by the improper handling of
+ # svn_txdelta_target ops. The bug was fixed by r1640832.
+
+ dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
+ 'svnadmin_tests_data',
+ 'load_txdelta.dump.gz')
+ dumpfile = gzip.open(dumpfile_location).read()
+
+ load_dumpstream(sbox, dumpfile)
+
+ # Verify would fail with a checksum mismatch:
+ # * Error verifying revision 14.
+ # svnadmin: E200014: MD5 checksum mismatch on representation 'r':
+ # expected: 5182e8876ed894dc7fe28f6ff5b2fee6
+ # actual: 5121f82875508863ad70daa8244e6947
+
+ exit_code, output, errput = svntest.main.run_svnadmin("verify", sbox.repo_dir)
+ if errput:
+ raise SVNUnexpectedStderr(errput)
+ if svntest.verify.verify_outputs(
+ "Output of 'svnadmin verify' is unexpected.", None, output, None,
+ ".*Verified revision *"):
+ raise svntest.Failure
+
+@Issues(4563)
+def load_no_svndate_r0(sbox):
+ "load without svn:date on r0"
+
+ sbox.build(create_wc=False, empty=True)
+
+ # svn:date exits
+ svntest.actions.run_and_verify_svnlook([' svn:date\n'], [],
+ 'proplist', '--revprop', '-r0',
+ sbox.repo_dir)
+
+ dump_old = ["SVN-fs-dump-format-version: 2\n", "\n",
+ "UUID: bf52886d-358d-4493-a414-944a6e5ad4f5\n", "\n",
+ "Revision-number: 0\n",
+ "Prop-content-length: 10\n",
+ "Content-length: 10\n", "\n",
+ "PROPS-END\n", "\n"]
+ svntest.actions.run_and_verify_load(sbox.repo_dir, dump_old)
+
+ # svn:date should have been removed
+ svntest.actions.run_and_verify_svnlook([], [],
+ 'proplist', '--revprop', '-r0',
+ sbox.repo_dir)
+
+# This is only supported for FSFS
+# The port to FSX is still pending, BDB won't support it.
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def hotcopy_read_only(sbox):
+ "'svnadmin hotcopy' a read-only source repository"
+ sbox.build()
+ svntest.main.chmod_tree(sbox.repo_dir, 0, 0222)
+
+ backup_dir, backup_url = sbox.add_repo_path('backup')
+ exit_code, output, errput = svntest.main.run_svnadmin("hotcopy",
+ sbox.repo_dir,
+ backup_dir)
+
+ # r/o repos are hard to clean up. Make it writable again.
+ svntest.main.chmod_tree(sbox.repo_dir, 0222, 0222)
+ if errput:
+ logger.warn("Error: hotcopy failed")
+ raise SVNUnexpectedStderr(errput)
+
+@XFail(svntest.main.is_fs_type_fsx)
+@Issue(4598)
+def dump_no_op_change(sbox):
+ "svnadmin dump with no-op changes"
+
+ sbox.build(create_wc=False, empty=True)
+ empty_file = sbox.get_tempname()
+ svntest.main.file_write(empty_file, '')
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', svntest.main.make_log_msg(),
+ 'put', empty_file, 'bar')
+ # Commit a no-op change.
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', sbox.repo_url,
+ '-m', svntest.main.make_log_msg(),
+ 'put', empty_file, 'bar')
+ # Dump and load the repository.
+ _, dump, _ = svntest.actions.run_and_verify_svnadmin(None, [],
+ 'dump', '-q',
+ sbox.repo_dir)
+ sbox2 = sbox.clone_dependent()
+ sbox2.build(create_wc=False, empty=True)
+ load_and_verify_dumpstream(sbox2, None, [], None, False, dump)
+
+ # We expect svn log -v to yield identical results for both original and
+ # reconstructed repositories. This used to fail as described in the
+ # Issue 4598 (https://issues.apache.org/jira/browse/SVN-4598), at least
+ # around r1706415.
+ #
+ # Test svn log -v for r2:
+ _, expected, _ = svntest.actions.run_and_verify_svn(None, [], 'log', '-v',
+ '-r2', sbox.repo_url)
+ svntest.actions.run_and_verify_svn(expected, [], 'log', '-v',
+ '-r2', sbox2.repo_url)
+ # Test svn log -v for /bar:
+ _, expected, _ = svntest.actions.run_and_verify_svn(None, [], 'log', '-v',
+ sbox.repo_url + '/bar')
+ svntest.actions.run_and_verify_svn(expected, [], 'log', '-v',
+ sbox2.repo_url + '/bar')
+
########################################################################
# Run the tests
@@ -1916,8 +3145,27 @@ test_list = [ None,
locking,
mergeinfo_race,
recover_old_empty,
+ verify_keep_going,
+ verify_keep_going_quiet,
+ verify_invalid_path_changes,
+ verify_denormalized_names,
fsfs_recover_old_non_empty,
fsfs_hotcopy_old_non_empty,
+ load_ignore_dates,
+ fsfs_hotcopy_old_with_id_changes,
+ verify_packed,
+ freeze_freeze,
+ verify_metadata_only,
+ verify_quickly,
+ fsfs_hotcopy_progress,
+ fsfs_hotcopy_progress_with_revprop_changes,
+ fsfs_hotcopy_progress_old,
+ freeze_same_uuid,
+ upgrade,
+ load_txdelta,
+ load_no_svndate_r0,
+ hotcopy_read_only,
+ dump_no_op_change,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/svnadmin_tests_data/load_txdelta.dump.gz b/subversion/tests/cmdline/svnadmin_tests_data/load_txdelta.dump.gz
new file mode 100644
index 0000000..900d357
--- /dev/null
+++ b/subversion/tests/cmdline/svnadmin_tests_data/load_txdelta.dump.gz
Binary files differ
diff --git a/subversion/tests/cmdline/svnadmin_tests_data/normalization_check.dump b/subversion/tests/cmdline/svnadmin_tests_data/normalization_check.dump
new file mode 100644
index 0000000..32ae006
--- /dev/null
+++ b/subversion/tests/cmdline/svnadmin_tests_data/normalization_check.dump
@@ -0,0 +1,259 @@
+SVN-fs-dump-format-version: 2
+
+UUID: bf695de5-cd61-4024-8cb3-a12d299c7c62
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2013-11-24T02:29:36.942478Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 126
+Content-length: 126
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T02:34:17.982927Z
+K 7
+svn:log
+V 24
+Denormalized tree import
+PROPS-END
+
+Node-path: A
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/EÌ
+Node-kind: dir
+Node-action: add
+Prop-content-length: 47
+Content-length: 47
+
+K 13
+svn:mergeinfo
+V 12
+/Q/Ã¥lpha:69
+PROPS-END
+
+
+Node-path: A/EÌ/Ã¥lpha
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 0
+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/îöta
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 0
+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 128
+Content-length: 128
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T02:34:39.316466Z
+K 7
+svn:log
+V 26
+Modified denormalized file
+PROPS-END
+
+Node-path: A/îöta
+Node-kind: file
+Node-action: change
+Text-content-length: 9
+Text-content-md5: d2508118d0d39e198d1129d87d692d59
+Text-content-sha1: e2fb5f2139d086ded2cb600d5a91a196e76bf020
+Content-length: 9
+
+modified
+
+
+Revision-number: 3
+Prop-content-length: 126
+Content-length: 126
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T02:35:09.976189Z
+K 7
+svn:log
+V 24
+Modified normalized file
+PROPS-END
+
+Node-path: A/EÌ/Ã¥lpha
+Node-kind: file
+Node-action: change
+Text-content-length: 9
+Text-content-md5: d2508118d0d39e198d1129d87d692d59
+Text-content-sha1: e2fb5f2139d086ded2cb600d5a91a196e76bf020
+Content-length: 9
+
+modified
+
+
+Revision-number: 4
+Prop-content-length: 124
+Content-length: 124
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T02:36:11.674695Z
+K 7
+svn:log
+V 22
+Created name collision
+PROPS-END
+
+Node-path: A/EÌ/aÌŠlpha
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 0
+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 5
+Prop-content-length: 125
+Content-length: 125
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T02:36:52.182891Z
+K 7
+svn:log
+V 23
+Modified colliding file
+PROPS-END
+
+Node-path: A/EÌ/aÌŠlpha
+Node-kind: file
+Node-action: change
+Text-content-length: 9
+Text-content-md5: d2508118d0d39e198d1129d87d692d59
+Text-content-sha1: e2fb5f2139d086ded2cb600d5a91a196e76bf020
+Content-length: 9
+
+modified
+
+
+Revision-number: 6
+Prop-content-length: 127
+Content-length: 127
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T18:04:43.128158Z
+K 7
+svn:log
+V 25
+Update mergeinfo on A/EÌ
+PROPS-END
+
+Node-path: A/EÌ
+Node-kind: dir
+Node-action: change
+Prop-content-length: 61
+Content-length: 61
+
+K 13
+svn:mergeinfo
+V 26
+/Q/aÌŠlpha:71
+/Q/Ã¥lpha:69
+PROPS-END
+
+
+Revision-number: 7
+Prop-content-length: 130
+Content-length: 130
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2013-11-24T18:04:51.128158Z
+K 7
+svn:log
+V 25
+Update mergeinfo on A/EÌ
+PROPS-END
+
+Node-path: A/EÌ
+Node-kind: dir
+Node-action: change
+Prop-content-length: 64
+Content-length: 64
+
+K 13
+svn:mergeinfo
+V 29
+/Q/aÌŠlpha:71
+/Q/Ã¥lpha:69,71
+PROPS-END
+
+
diff --git a/subversion/tests/cmdline/svnauthz_tests.py b/subversion/tests/cmdline/svnauthz_tests.py
index fc93b23..7c1396c 100755
--- a/subversion/tests/cmdline/svnauthz_tests.py
+++ b/subversion/tests/cmdline/svnauthz_tests.py
@@ -92,20 +92,20 @@ def svnauthz_validate_file_test(sbox):
svntest.main.file_write(authz_path, authz_content)
# Valid authz file
- svntest.actions.run_and_verify_svnauthz("Valid authz file", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
0, False, "validate", authz_path)
# Invalid authz file, expect exit code 1, we found the file loaded it
# but found an error
svntest.main.file_write(authz_path, 'x\n')
- svntest.actions.run_and_verify_svnauthz("Invalid authz file", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
1, False, "validate", authz_path)
- # Non-existant authz file
+ # Non-existent authz file
# exit code 2, operational error since we can't test the file.
os.close(authz_fd)
os.remove(authz_path)
- svntest.actions.run_and_verify_svnauthz("Non-existant authz file", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 2, False, "validate",
authz_path)
@@ -128,24 +128,23 @@ def svnauthz_validate_repo_test(sbox):
expected_status.add({
'A/authz' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
# Valid authz url (file stored in repo)
authz_url = repo_url + '/A/authz'
- svntest.actions.run_and_verify_svnauthz("Valid authz url", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
0, False, "validate", authz_url)
# Invalid authz url (again use the iota file in the repo)
# expect exit code 1, we found the file loaded it but found an error
iota_url = repo_url + '/iota'
- svntest.actions.run_and_verify_svnauthz("Invalid authz url", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
1, False, "validate", iota_url)
- # Non-existant authz url
+ # Non-existent authz url
# exit code 2, operational error since we can't test the file.
- svntest.actions.run_and_verify_svnauthz("Non-existant authz file", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 2, False, "validate",
repo_url + "/zilch")
@@ -174,9 +173,8 @@ def svnauthz_validate_txn_test(sbox):
expected_status.add({
'A/authz' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = ['Exit 0\n']
verify_logfile(logfilepath, expected_data)
@@ -184,9 +182,8 @@ def svnauthz_validate_txn_test(sbox):
svntest.main.file_append(authz_path, 'x')
expected_output = wc.State(wc_dir, {'A/authz' : Item(verb='Sending')})
expected_status.tweak('A/authz', status=' ', wc_rev=3)
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = svntest.verify.RegexOutput(".*?Error parsing authz file: '.*?'",
match_all=False)
verify_logfile(logfilepath, expected_data, delete_log=False)
@@ -201,7 +198,7 @@ def svnauthz_validate_txn_test(sbox):
svntest.main.file_append(authz_path, 'x')
expected_status.tweak('A/authz', status=' ', wc_rev=4)
if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
+ expected_status):
raise svntest.Failure
expected_data = svntest.verify.ExpectedOutput("Exit 2\n", match_all=False)
verify_logfile(logfilepath, expected_data)
@@ -220,38 +217,35 @@ def svnauthz_accessof_file_test(sbox):
# Anonymous access with no path, and no repository should be rw
# since it returns the highest level of access granted anywhere.
# So /bios being rw for everyone means this will be rw.
- svntest.actions.run_and_verify_svnauthz("Anonymous access", ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_path)
# Anonymous access on /jokes should be r, no repo so won't match
# the slapstick:/jokes section.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path",
- ["r\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None, 0, False, "accessof",
authz_path, "--path", "/jokes")
# Anonymous access on /jokes on slapstick repo should be no
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path with repo",
- ["no\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--repository", "slapstick")
# User access with no path, and no repository should be rw
# since it returns the h ighest level of access anywhere.
# So /bios being rw for everyone means this will be rw.
- svntest.actions.run_and_verify_svnauthz("User access", ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_path,
"--username", "groucho")
# User groucho specified on /jokes with no repo, will not match any of the
# repo specific sections, so is r since everyone has read access.
- svntest.actions.run_and_verify_svnauthz("User access on path", ["r\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None,
0, False, "accessof", authz_path,
"--path", "/jokes", "--username",
"groucho")
# User groucho specified on /jokes with the repo comedy will be rw
- svntest.actions.run_and_verify_svnauthz("User access on path with repo",
- ["rw\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy")
@@ -282,45 +276,42 @@ def svnauthz_accessof_repo_test(sbox):
'A/authz' : Item(status=' ', wc_rev=2),
})
if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
+ expected_status):
raise svntest.Failure
# Anonymous access with no path, and no repository should be rw
# since it returns the highest level of access granted anywhere.
# So /bios being rw for everyone means this will be rw.
authz_url = repo_url + "/A/authz"
- svntest.actions.run_and_verify_svnauthz("Anonymous access", ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_url)
# Anonymous access on /jokes should be r, no repo so won't match
# the slapstick:/jokes section.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path",
- ["r\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None, 0, False, "accessof",
authz_url, "--path", "/jokes")
# Anonymous access on /jokes on slapstick repo should be no
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path with repo",
- ["no\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--repository", "slapstick")
# User access with no path, and no repository should be rw
# since it returns the h ighest level of access anywhere.
# So /bios being rw for everyone means this will be rw.
- svntest.actions.run_and_verify_svnauthz("User access", ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_url,
"--username", "groucho")
# User groucho specified on /jokes with no repo, will not match any of the
# repo specific sections, so is r since everyone has read access.
- svntest.actions.run_and_verify_svnauthz("User access on path", ["r\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None,
0, False, "accessof", authz_url,
"--path", "/jokes", "--username",
"groucho")
# User groucho specified on /jokes with the repo comedy will be rw
- svntest.actions.run_and_verify_svnauthz("User access on path with repo",
- ["rw\n"], None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy")
@@ -341,29 +332,26 @@ def svnauthz_accessof_groups_file_test(sbox):
# Anonymous access with no path, and no repository should be no
# since it returns the highest level of access granted anywhere.
- svntest.actions.run_and_verify_svnauthz("Anonymous access", ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_path,
"--groups-file", groups_path)
# User stafford (@musicians) access with no path, and no repository should
# be no since it returns the highest level of access granted anywhere.
- svntest.actions.run_and_verify_svnauthz("Group 1 access",
- ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_path,
"--groups-file", groups_path,
"--username", "stafford")
# User groucho (@comedians) access with no path, and no repository should
# be no since it returns the highest level of access granted anywhere.
- svntest.actions.run_and_verify_svnauthz("Group 2 access",
- ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_path,
"--groups-file", groups_path,
"--username", "groucho")
# Anonymous access specified on /jokes with the repo comedy will be no.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path with repo",
- ["no\n"], None, 0, False,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None, 0, False,
"accessof", authz_path,
"--groups-file", groups_path,
"--path", "jokes",
@@ -371,8 +359,7 @@ def svnauthz_accessof_groups_file_test(sbox):
# User stafford (@musicians) specified on /jokes with the repo comedy
# will be no.
- svntest.actions.run_and_verify_svnauthz("Group 1 access on path with repo",
- ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_path,
"--groups-file", groups_path,
"--path", "jokes",
@@ -381,8 +368,7 @@ def svnauthz_accessof_groups_file_test(sbox):
# User groucho (@comedians) specified on /jokes with the repo
# comedy will be r.
- svntest.actions.run_and_verify_svnauthz("Group 2 access on path with repo",
- ["r\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None,
0, False, "accessof", authz_path,
"--groups-file", groups_path,
"--path", "jokes",
@@ -423,37 +409,33 @@ def svnauthz_accessof_groups_repo_test(sbox):
'A/groups' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
# Anonymous access with no path, and no repository should be no
# since it returns the highest level of access granted anywhere.
authz_url = repo_url + "/A/authz"
groups_url = repo_url + "/A/groups"
- svntest.actions.run_and_verify_svnauthz("Anonymous access", ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_url,
"--groups-file", groups_url)
# User stafford (@musicians) access with no path, and no repository should
# be no since it returns the highest level of access granted anywhere.
- svntest.actions.run_and_verify_svnauthz("Group 1 access",
- ["rw\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["rw\n"], None,
0, False, "accessof", authz_url,
"--groups-file", groups_url,
"--username", "stafford")
# User groucho (@comedians) access with no path, and no repository should
# be no since it returns the highest level of access granted anywhere.
- svntest.actions.run_and_verify_svnauthz("Group 2 access",
- ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_url,
"--groups-file", groups_url,
"--username", "groucho")
# Anonymous access specified on /jokes with the repo comedy will be no.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path with repo",
- ["no\n"], None, 0, False,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None, 0, False,
"accessof", authz_url,
"--groups-file", groups_url,
"--path", "jokes",
@@ -461,8 +443,7 @@ def svnauthz_accessof_groups_repo_test(sbox):
# User stafford (@musicians) specified on /jokes with the repo comedy
# will be no.
- svntest.actions.run_and_verify_svnauthz("Group 1 access on path with repo",
- ["no\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["no\n"], None,
0, False, "accessof", authz_url,
"--groups-file", groups_url,
"--path", "jokes",
@@ -471,8 +452,7 @@ def svnauthz_accessof_groups_repo_test(sbox):
# User groucho (@comedians) specified on /jokes with the repo
# comedy will be r.
- svntest.actions.run_and_verify_svnauthz("Group 2 access on path with repo",
- ["r\n"], None,
+ svntest.actions.run_and_verify_svnauthz(["r\n"], None,
0, False, "accessof", authz_url,
"--groups-file", groups_url,
"--path", "jokes",
@@ -495,7 +475,7 @@ def svnauthz_accessof_is_file_test(sbox):
expected_output = svntest.verify.RegexOutput(
".*'x' is not a valid argument for --is", match_all=False
)
- svntest.actions.run_and_verify_svnauthz("--is x fails", None,
+ svntest.actions.run_and_verify_svnauthz(None,
expected_output, 2, False,
"accessof", authz_path, "--is", "x")
@@ -503,52 +483,46 @@ def svnauthz_accessof_is_file_test(sbox):
# since it returns the highest level of access granted anywhere.
# So /bios being rw for everyone means this will be rw.
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is rw", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 0, False, "accessof",
authz_path, "--is", "rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is r", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_path, "--is", "r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is no", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_path, "--is", "no")
# Anonymous access on /jokes should be r, no repo so won't match
# the slapstick:/jokes section.
# Test --is r returns 0.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--is", "r")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--is", "rw")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--is", "no")
# Anonymous access on /jokes on slapstick repo should be no
# Test --is no returns 0.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--repository", "slapstick",
"--is", "no")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--repository", "slapstick",
"--is", "rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--repository", "slapstick",
"--is", "r")
@@ -557,17 +531,17 @@ def svnauthz_accessof_is_file_test(sbox):
# since it returns the h ighest level of access anywhere.
# So /bios being rw for everyone means this will be rw.
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("User access --is rw", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
0, False, "accessof", authz_path,
"--username", "groucho", "--is",
"rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("User access --is r", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
3, False, "accessof", authz_path,
"--username", "groucho", "--is",
"r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access --is no", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
3, False, "accessof", authz_path,
"--username", "groucho", "--is",
"no")
@@ -575,18 +549,18 @@ def svnauthz_accessof_is_file_test(sbox):
# User groucho specified on /jokes with no repo, will not match any of the
# repo specific sections, so is r since everyone has read access.
# Test --is r returns 0.
- svntest.actions.run_and_verify_svnauthz("User access on path --is r", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho", "--is", "r")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path --is rw", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
"--is", "rw")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path --is no", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
@@ -594,22 +568,19 @@ def svnauthz_accessof_is_file_test(sbox):
# User groucho specified on /jokes with the repo comedy will be rw
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is rw",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
"rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
"r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_path, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
@@ -622,8 +593,7 @@ def svnauthz_accessof_is_file_test(sbox):
".*Error while parsing config file:",
match_all=False
)
- svntest.actions.run_and_verify_svnauthz("--is with invalid authz file",
- None, expected_out, 1, False,
+ svntest.actions.run_and_verify_svnauthz(None, expected_out, 1, False,
"accessof", authz_path, "--path",
"/jokes", "--username", "groucho",
"--repository", "comedy", "--is",
@@ -654,9 +624,8 @@ def svnauthz_accessof_is_repo_test(sbox):
expected_status.add({
'A/authz' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
# Test an invalid --is option, should get an error message and exit code
# of 2.
@@ -664,7 +633,7 @@ def svnauthz_accessof_is_repo_test(sbox):
expected_output = svntest.verify.RegexOutput(
".*'x' is not a valid argument for --is", match_all=False
)
- svntest.actions.run_and_verify_svnauthz("--is x fails", None,
+ svntest.actions.run_and_verify_svnauthz(None,
expected_output, 2, False,
"accessof", authz_url, "--is", "x")
@@ -672,52 +641,46 @@ def svnauthz_accessof_is_repo_test(sbox):
# since it returns the highest level of access granted anywhere.
# So /bios being rw for everyone means this will be rw.
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is rw", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 0, False, "accessof",
authz_url, "--is", "rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is r", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_url, "--is", "r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access --is no", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_url, "--is", "no")
# Anonymous access on /jokes should be r, no repo so won't match
# the slapstick:/jokes section.
# Test --is r returns 0.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--is", "r")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--is", "rw")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("Anonymous access on path --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--is", "no")
# Anonymous access on /jokes on slapstick repo should be no
# Test --is no returns 0.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--repository", "slapstick",
"--is", "no")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--repository", "slapstick",
"--is", "rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("Anon access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--repository", "slapstick",
"--is", "r")
@@ -726,17 +689,17 @@ def svnauthz_accessof_is_repo_test(sbox):
# since it returns the h ighest level of access anywhere.
# So /bios being rw for everyone means this will be rw.
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("User access --is rw", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
0, False, "accessof", authz_url,
"--username", "groucho", "--is",
"rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("User access --is r", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
3, False, "accessof", authz_url,
"--username", "groucho", "--is",
"r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access --is no", None, None,
+ svntest.actions.run_and_verify_svnauthz(None, None,
3, False, "accessof", authz_url,
"--username", "groucho", "--is",
"no")
@@ -744,18 +707,18 @@ def svnauthz_accessof_is_repo_test(sbox):
# User groucho specified on /jokes with no repo, will not match any of the
# repo specific sections, so is r since everyone has read access.
# Test --is r returns 0.
- svntest.actions.run_and_verify_svnauthz("User access on path --is r", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho", "--is", "r")
# Test --is rw returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path --is rw", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
"--is", "rw")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path --is no", None,
+ svntest.actions.run_and_verify_svnauthz(None,
None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
@@ -763,22 +726,19 @@ def svnauthz_accessof_is_repo_test(sbox):
# User groucho specified on /jokes with the repo comedy will be rw
# Test --is rw returns 0.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is rw",
- None, None, 0, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
"rw")
# Test --is r returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is r",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
"r")
# Test --is no returns 3.
- svntest.actions.run_and_verify_svnauthz("User access on path w/ repo --is no",
- None, None, 3, False, "accessof",
+ svntest.actions.run_and_verify_svnauthz(None, None, 3, False, "accessof",
authz_url, "--path", "/jokes",
"--username", "groucho",
"--repository", "comedy", "--is",
@@ -788,17 +748,15 @@ def svnauthz_accessof_is_repo_test(sbox):
svntest.main.file_append(authz_path, "x\n")
expected_output = wc.State(wc_dir, {'A/authz' : Item(verb='Sending')})
expected_status.tweak('A/authz', wc_rev=3)
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
# Check that --is returns 1 when the syntax is invalid with a url.
expected_out = svntest.verify.RegexOutput(
".*Error while parsing config file:",
match_all=False
)
- svntest.actions.run_and_verify_svnauthz("--is with invalid authz url",
- None, expected_out, 1, False,
+ svntest.actions.run_and_verify_svnauthz(None, expected_out, 1, False,
"accessof", authz_url, "--path",
"/jokes", "--username", "groucho",
"--repository", "comedy", "--is",
@@ -833,9 +791,8 @@ def svnauthz_accessof_txn_test(sbox):
expected_status.add({
'A/authz' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = ['Exit 0\n']
verify_logfile(logfilepath, expected_data)
@@ -848,33 +805,30 @@ def svnauthz_accessof_txn_test(sbox):
expected_output = wc.State(wc_dir, {'A/authz' : Item(verb='Sending')})
expected_status.tweak('A/authz', status=' ', wc_rev=3)
svntest.main.file_append(authz_path, "groucho = r\n")
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = svntest.verify.ExpectedOutput('Exit 3\n', match_all=False)
verify_logfile(logfilepath, expected_data)
- # break the authz file with a non-existant group and check for an exit 1.
+ # break the authz file with a non-existent group and check for an exit 1.
expected_status.tweak('A/authz', status=' ', wc_rev=4)
svntest.main.file_append(authz_path, "@friends = rw\n")
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = svntest.verify.ExpectedOutput('Exit 1\n', match_all=False)
verify_logfile(logfilepath, expected_data)
- # break the authz file with a non-existant gropu and check for an exit 2.
+ # break the authz file with a non-existent gropu and check for an exit 2.
expected_output = wc.State(wc_dir, {'A/authz' : Item(verb='Deleting')})
expected_status.remove('A/authz')
svntest.main.run_svn(None, 'rm', authz_path)
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
expected_data = svntest.verify.ExpectedOutput('Exit 2\n', match_all=False)
verify_logfile(logfilepath, expected_data)
def svnauthz_compat_mode_file_test(sbox):
- "test 'svnauthz-validate' compatability mode file"
+ "test 'svnauthz-validate' compatibility mode file"
# Create an authz file
@@ -883,30 +837,28 @@ def svnauthz_compat_mode_file_test(sbox):
svntest.main.file_write(authz_path, authz_content)
# Check a valid file.
- svntest.actions.run_and_verify_svnauthz("svnauthz-validate on file",
- None, None, 0, True,
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, True,
authz_path)
# Check an invalid file.
svntest.main.file_append(authz_path, "x\n")
- svntest.actions.run_and_verify_svnauthz("svnauthz-validate on invalid file",
- None, None, 1, True,
+ svntest.actions.run_and_verify_svnauthz(None, None, 1, True,
authz_path)
# Remove the file.
os.close(authz_fd)
os.remove(authz_path)
- # Check a non-existant file.
+ # Check a non-existent file.
svntest.actions.run_and_verify_svnauthz(
- "svnauthz-validate on non-existant file", None, None, 2, True,
+ None, None, 2, True,
authz_path
)
@SkipUnless(svntest.main.is_ra_type_file)
def svnauthz_compat_mode_repo_test(sbox):
- "test 'svnauthz-validate' compatability mode url"
+ "test 'svnauthz-validate' compatibility mode url"
sbox.build()
wc_dir = sbox.wc_dir
@@ -925,28 +877,24 @@ def svnauthz_compat_mode_repo_test(sbox):
expected_status.add({
'A/authz' : Item(status=' ', wc_rev=2),
})
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
- svntest.actions.run_and_verify_svnauthz("svnauthz-validate on url",
- None, None, 0, True,
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
+ svntest.actions.run_and_verify_svnauthz(None, None, 0, True,
authz_url)
# Check an invalid url.
svntest.main.file_append(authz_path, "x\n")
expected_output = wc.State(wc_dir, {'A/authz' : Item(verb='Sending')})
expected_status.tweak('A/authz', status=' ', wc_rev=3)
- if svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir):
- raise svntest.Failure
- svntest.actions.run_and_verify_svnauthz("svnauthz-validate on invalid file",
- None, None, 1, True,
+ svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+ expected_status)
+ svntest.actions.run_and_verify_svnauthz(None, None, 1, True,
authz_path)
- # Check a non-existant url.
+ # Check a non-existent url.
# Exit code really should be 2 since this is an operational error.
svntest.actions.run_and_verify_svnauthz(
- "svnauthz-validate on non-existant file", None, None, 2, True,
+ None, None, 2, True,
repo_url + "/zilch"
)
diff --git a/subversion/tests/cmdline/svndumpfilter_tests.py b/subversion/tests/cmdline/svndumpfilter_tests.py
index 93a3244..abd47f6 100755
--- a/subversion/tests/cmdline/svndumpfilter_tests.py
+++ b/subversion/tests/cmdline/svndumpfilter_tests.py
@@ -34,8 +34,7 @@ import svntest
from svntest.verify import SVNExpectedStdout, SVNExpectedStderr
# Get some helper routines
-from svnadmin_tests import (load_and_verify_dumpstream, load_dumpstream,
- test_create)
+from svnadmin_tests import load_and_verify_dumpstream, load_dumpstream
from svntest.main import run_svn, run_svnadmin
# (abbreviation)
@@ -60,15 +59,10 @@ def filter_and_return_output(dump, bufsize=0, *varargs):
dump = [ dump ]
# Does the caller want the stderr?
- try:
- varargs.index('-q')
+ if '-q' in varargs or '--quiet' in varargs:
expected_errput = None # Stderr with -q or --quiet is a real error!
- except:
- try:
- varargs.index('--quiet')
- expected_errput = None
- except:
- expected_errput = svntest.verify.AnyOutput
+ else:
+ expected_errput = svntest.verify.AnyOutput
## TODO: Should we handle exit_code?
exit_code, output, errput = svntest.main.run_command_stdin(
svntest.main.svndumpfilter_binary, expected_errput, bufsize, True,
@@ -92,7 +86,7 @@ def reflect_dropped_renumbered_revs(sbox):
## See http://subversion.tigris.org/issues/show_bug.cgi?id=2982. ##
# Test svndumpfilter with include option
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
'with_merges.dump')
@@ -112,13 +106,13 @@ def reflect_dropped_renumbered_revs(sbox):
expected_output = svntest.verify.UnorderedOutput([
url + "/trunk - /branch1:4-5\n",
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
# Test svndumpfilter with exclude option
- test_create(sbox)
+ sbox.build(empty=True)
filtered_out, filtered_err = filter_and_return_output(
dumpfile, 0, "exclude", "branch1",
"--skip-missing-merge-sources",
@@ -131,7 +125,7 @@ def reflect_dropped_renumbered_revs(sbox):
expected_output = svntest.verify.UnorderedOutput([
url + "/trunk - \n",
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -142,7 +136,7 @@ def svndumpfilter_loses_mergeinfo(sbox):
## See http://subversion.tigris.org/issues/show_bug.cgi?id=3181. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
'with_merges.dump')
@@ -158,7 +152,7 @@ def svndumpfilter_loses_mergeinfo(sbox):
expected_output = svntest.verify.UnorderedOutput([
url + "/trunk - /branch1:4-8\n",
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -225,7 +219,7 @@ def dumpfilter_with_targets(sbox):
"svndumpfilter --targets blah"
## See http://subversion.tigris.org/issues/show_bug.cgi?id=2697. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
@@ -248,7 +242,7 @@ def dumpfilter_with_targets(sbox):
def dumpfilter_with_patterns(sbox):
"svndumpfilter --pattern PATH_PREFIX"
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
@@ -268,7 +262,7 @@ def dumpfilter_with_patterns(sbox):
def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
"filter mergeinfo revs outside of dump stream"
- test_create(sbox)
+ sbox.build(empty=True)
# Load a partial dump into an existing repository.
#
@@ -283,7 +277,7 @@ def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
# | | | |
# trunk---r2---r3-----r5---r6-------r8---r9---------------> | |
# r1 | | | | | |
- # intial | | | |______ | |
+ # initial | | | |______ | |
# import copy | copy | merge merge
# | | | merge (r5) (r8)
# | | | (r9) | |
@@ -357,7 +351,7 @@ def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
url + "/B2 - /trunk:4\n",
url + "/B1/B/E - /branches/B2/B/E:6-7\n",
"/trunk/B/E:3-4\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -371,7 +365,7 @@ def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
# Project-Z (Added r5)
# docs/ (Added r6)
# README (Added r6).
- test_create(sbox)
+ sbox.build(empty=True)
skeleton_dumpfile = open(os.path.join(os.path.dirname(sys.argv[0]),
'svnadmin_tests_data',
'skeleton_repos.dump')).read()
@@ -484,7 +478,7 @@ def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
expected_output = svntest.verify.UnorderedOutput([
url + "/B1 - /Projects/Project-X/trunk:9\n",
url + "/B1/B/E - /Projects/Project-X/trunk/B/E:8-9\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -500,7 +494,7 @@ def filter_mergeinfo_revs_outside_of_dump_stream(sbox):
def dropped_but_not_renumbered_empty_revs(sbox):
"mergeinfo maps correctly when dropping revs"
- test_create(sbox)
+ sbox.build(empty=True)
# The dump file mergeinfo_included_full.dump represents this repository:
#
@@ -511,7 +505,7 @@ def dropped_but_not_renumbered_empty_revs(sbox):
# | | | |
# trunk---r2---r3-----r5---r6-------r8---r9---------------> | |
# r1 | | | | | |
- # intial | | | |______ | |
+ # initial | | | |______ | |
# import copy | copy | merge merge
# | | | merge (r5) (r8)
# | | | (r9) | |
@@ -590,7 +584,7 @@ def dropped_but_not_renumbered_empty_revs(sbox):
expected_output = svntest.verify.UnorderedOutput([
url + "/B1 - /trunk:6,8\n",
url + "/B1/B/E - /trunk/B/E:5-8\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -616,7 +610,7 @@ def match_empty_prefix(sbox):
raise verify.UnexpectedStderr(filtered_err)
# Load the filtered dump into a repo and check the result
- test_create(sbox)
+ sbox.build(empty=True)
load_dumpstream(sbox, filtered_output, '--ignore-uuid')
svntest.actions.run_and_verify_update(sbox.wc_dir,
expected_output,
@@ -650,7 +644,7 @@ def accepts_deltas(sbox):
"accepts deltas in the input"
# Accept format v3 (as created by 'svnadmin --deltas' or svnrdump).
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
'simple_v3.dump')
@@ -684,7 +678,7 @@ def dumpfilter_targets_expect_leading_slash_prefixes(sbox):
"dumpfilter targets expect leading '/' in prefixes"
## See http://subversion.tigris.org/issues/show_bug.cgi?id=4234. ##
- test_create(sbox)
+ sbox.build(empty=True)
dumpfile_location = os.path.join(os.path.dirname(sys.argv[0]),
'svndumpfilter_tests_data',
diff --git a/subversion/tests/cmdline/svnfsfs_tests.py b/subversion/tests/cmdline/svnfsfs_tests.py
new file mode 100755
index 0000000..fece34b
--- /dev/null
+++ b/subversion/tests/cmdline/svnfsfs_tests.py
@@ -0,0 +1,200 @@
+#!/usr/bin/env python
+#
+# svnfsfs_tests.py: testing the 'svnfsfs' tool.
+#
+# Subversion is a tool for revision control.
+# See http://subversion.apache.org for more information.
+#
+# ====================================================================
+# 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.
+######################################################################
+
+# General modules
+import os
+import logging
+import re
+import shutil
+import sys
+import threading
+import time
+import gzip
+
+logger = logging.getLogger()
+
+# Our testing module
+import svntest
+from svntest.verify import SVNExpectedStdout, SVNExpectedStderr
+from svntest.verify import SVNUnexpectedStderr
+from svntest.verify import UnorderedOutput
+from svntest.main import SVN_PROP_MERGEINFO
+
+# (abbreviation)
+Skip = svntest.testcase.Skip_deco
+SkipUnless = svntest.testcase.SkipUnless_deco
+XFail = svntest.testcase.XFail_deco
+Issues = svntest.testcase.Issues_deco
+Issue = svntest.testcase.Issue_deco
+Wimp = svntest.testcase.Wimp_deco
+SkipDumpLoadCrossCheck = svntest.testcase.SkipDumpLoadCrossCheck_deco
+Item = svntest.wc.StateItem
+
+#----------------------------------------------------------------------
+
+# How we currently test 'svnfsfs' --
+#
+# 'svnadmin create': Create an empty repository, test that the
+# root node has a proper created-revision,
+# because there was once a bug where it
+# didn't.
+#
+# Note also that "svnadmin create" is tested
+# implicitly every time we run a python test
+# script. (An empty repository is always
+# created and then imported into; if this
+# subcommand failed catastrophically, every
+# test would fail and we would know instantly.)
+#
+# 'svnadmin createtxn'
+# 'svnadmin rmtxn': See below.
+#
+# 'svnadmin lstxns': We don't care about the contents of transactions;
+# we only care that they exist or not.
+# Therefore, we can simply parse transaction headers.
+#
+# 'svnadmin dump': A couple regression tests that ensure dump doesn't
+# error out, and one to check that the --quiet option
+# really does what it's meant to do. The actual
+# contents of the dump aren't verified at all.
+#
+######################################################################
+# Helper routines
+
+def patch_format(repo_dir, shard_size):
+ """Rewrite the format of the FSFS repository REPO_DIR so
+ that it would use sharding with SHARDS revisions per shard."""
+
+ format_path = os.path.join(repo_dir, "db", "format")
+ contents = open(format_path, 'rb').read()
+ processed_lines = []
+
+ for line in contents.split("\n"):
+ if line.startswith("layout "):
+ processed_lines.append("layout sharded %d" % shard_size)
+ else:
+ processed_lines.append(line)
+
+ new_contents = "\n".join(processed_lines)
+ os.chmod(format_path, 0666)
+ open(format_path, 'wb').write(new_contents)
+
+######################################################################
+# Tests
+
+#----------------------------------------------------------------------
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+@SkipUnless(svntest.main.fs_has_pack)
+@SkipUnless(svntest.main.is_fs_log_addressing)
+def load_index_sharded(sbox):
+ "load-index in a packed repo"
+
+ # Configure two files per shard to trigger packing.
+ sbox.build()
+ patch_format(sbox.repo_dir, shard_size=2)
+
+ # With --fsfs-packing, everything is already packed and we
+ # can skip this part.
+ if not svntest.main.options.fsfs_packing:
+ expected_output = ["Packing revisions in shard 0...done.\n"]
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ "pack", sbox.repo_dir)
+
+ # Read P2L index using svnfsfs.
+ exit_code, items, errput = \
+ svntest.actions.run_and_verify_svnfsfs(None, [], "dump-index", "-r0",
+ sbox.repo_dir)
+
+ # load-index promises to deal with input that
+ #
+ # * uses the same encoding as the dump-index output
+ # * is not in ascending item offset order
+ # * ignores lines with the full table header
+ # * ignores the checksum column and beyond
+ # * figures out the correct target revision even if the first item
+ # does not match the first revision in the pack file
+ #
+ # So, let's mess with the ITEMS list to call in on these promises.
+
+ # not in ascending order
+ items.reverse()
+
+ # multiple headers (there is already one now at the bottom)
+ items.insert(0, " Start Length Type Revision Item Checksum\n")
+
+ # make columns have a variable size
+ # mess with the checksums
+ # add a junk column
+ # keep header lines as are
+ for i in range(0, len(items)):
+ if items[i].find("Start") == -1:
+ columns = items[i].split()
+ columns[5] = columns[5].replace('f','-').replace('0','9')
+ columns.append("junk")
+ items[i] = ' '.join(columns) + "\n"
+
+ # first entry is for rev 1, pack starts at rev 0, though
+ assert(items[1].split()[3] == "1")
+
+ # Reload the index
+ exit_code, output, errput = svntest.main.run_command_stdin(
+ svntest.main.svnfsfs_binary, [], 0, False, items,
+ "load-index", sbox.repo_dir)
+
+ # Run verify to see whether we broke anything.
+ expected_output = ["* Verifying metadata at revision 0 ...\n",
+ "* Verifying repository metadata ...\n",
+ "* Verified revision 0.\n",
+ "* Verified revision 1.\n"]
+ svntest.actions.run_and_verify_svnadmin(expected_output, [],
+ "verify", sbox.repo_dir)
+
+@SkipUnless(svntest.main.is_fs_type_fsfs)
+def test_stats_on_empty_repo(sbox):
+ "stats on empty repo shall not crash"
+
+ sbox.build(create_wc=False, empty=True)
+
+ exit_code, output, errput = \
+ svntest.actions.run_and_verify_svnfsfs(None, [], 'stats', sbox.repo_dir)
+
+########################################################################
+# Run the tests
+
+
+# list all tests here, starting with None:
+test_list = [ None,
+ load_index_sharded,
+ test_stats_on_empty_repo,
+ ]
+
+if __name__ == '__main__':
+ svntest.main.run_tests(test_list)
+ # NOTREACHED
+
+
+### End of file.
diff --git a/subversion/tests/cmdline/svnlook_tests.py b/subversion/tests/cmdline/svnlook_tests.py
index f7c620b..d6c49c0 100755
--- a/subversion/tests/cmdline/svnlook_tests.py
+++ b/subversion/tests/cmdline/svnlook_tests.py
@@ -95,9 +95,7 @@ def test_misc(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# give the repo a new UUID
uuid = "01234567-89ab-cdef-89ab-cdef01234567"
@@ -209,9 +207,9 @@ def delete_file_in_moved_dir(sbox):
# move E to E2 and delete E2/alpha
E_path = os.path.join(wc_dir, 'A', 'B', 'E')
E2_path = os.path.join(wc_dir, 'A', 'B', 'E2')
- svntest.actions.run_and_verify_svn(None, None, [], 'mv', E_path, E2_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mv', E_path, E2_path)
alpha_path = os.path.join(E2_path, 'alpha')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', alpha_path)
# commit
expected_output = svntest.wc.State(wc_dir, {
@@ -234,9 +232,7 @@ def delete_file_in_moved_dir(sbox):
### in order to get this commit working again.
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
exit_code, output, errput = svntest.main.run_svnlook("dirs-changed",
repo_dir)
@@ -263,16 +259,16 @@ def test_print_property_diffs(sbox):
# Add a bogus property to iota
iota_path = os.path.join(wc_dir, 'iota')
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'bogus_prop', 'bogus_val', iota_path)
# commit the change
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', iota_path)
# Grab the diff
exit_code, expected_output, err = svntest.actions.run_and_verify_svn(
- None, None, [], 'diff', '-r', 'PREV', iota_path)
+ None, [], 'diff', '-r', 'PREV', iota_path)
exit_code, output, errput = svntest.main.run_svnlook("diff", repo_dir)
if errput:
@@ -370,7 +366,7 @@ def changed_copy_info(sbox):
E_path = os.path.join(wc_dir, 'A', 'B', 'E')
alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
alpha2_path = os.path.join(wc_dir, 'A', 'alpha2')
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', alpha_path,
+ svntest.actions.run_and_verify_svn(None, [], 'cp', alpha_path,
alpha2_path)
# commit
@@ -383,9 +379,7 @@ def changed_copy_info(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
exit_code, output, errput = svntest.main.run_svnlook("changed", repo_dir)
if errput:
@@ -446,10 +440,10 @@ def limit_history(sbox):
"history --limit"
sbox.build(create_wc=False)
repo_url = sbox.repo_url
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', '-m', 'log msg',
repo_url + "/iota", repo_url + "/iota2")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', '-m', 'log msg',
repo_url + "/A/mu", repo_url + "/iota")
history = run_svnlook("history", "--limit=1", sbox.repo_dir)
@@ -481,9 +475,7 @@ def diff_ignore_whitespace(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Check the output of 'svnlook diff -x --ignore-space-change' on mu.
# It should not print anything.
@@ -536,13 +528,11 @@ def diff_ignore_eolstyle(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Grab the diff
exit_code, expected_output, err = svntest.actions.run_and_verify_svn(
- None, None, [],
+ None, [],
'diff', '-r', 'PREV', '-x', '--ignore-eol-style', mu_path)
@@ -676,9 +666,9 @@ fp.close()"""
svntest.main.file_append(rho_path, 'new appended text for rho')
# commit, and check the hook's logfile
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
expected_data = [ 'U A/D/G/rho\n', 'U A/mu\n', 'A/\n', 'A/D/G/\n' ]
@@ -694,9 +684,9 @@ fp.close()"""
svntest.main.create_python_hook_script(pre_commit_hook,
hook_instance)
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'bogus_prop', 'bogus_val\n', A_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', wc_dir,
'--with-revprop', 'bogus_rev_prop=bogus_rev_val\n')
# Now check the logfile
@@ -705,16 +695,15 @@ fp.close()"""
"Properties on '/A':\n",
' bogus_prop\n',
' svn:log\n', ' svn:author\n',
- ' svn:check-locks\n', # internal prop, not really expected
' bogus_rev_prop\n',
' svn:date\n',
' svn:txn-client-compat-version\n',
+ ' svn:txn-user-agent\n',
]
- # ra_dav and ra_svn add the user-agent ephemeral property
- if svntest.main.is_ra_type_dav() or svntest.main.is_ra_type_svn():
- expected_data.append(' svn:txn-user-agent\n')
verify_logfile(logfilepath, svntest.verify.UnorderedOutput(expected_data))
+# From r1293375 until fixed in r1303856, 'svnlook changed' and 'svnlook diff'
+# produced no output on a property delete.
def property_delete(sbox):
"property delete"
@@ -726,9 +715,7 @@ def property_delete(sbox):
sbox.simple_propdel('foo', 'A/mu')
sbox.simple_commit()
- # XFail since r1293375, changed and diff produce no output on a
- # property delete
- svntest.actions.run_and_verify_svnlook(None, ["_U A/mu\n"], [],
+ svntest.actions.run_and_verify_svnlook(["_U A/mu\n"], [],
'changed', repo_dir)
diff --git a/subversion/tests/cmdline/svnmucc_tests.py b/subversion/tests/cmdline/svnmucc_tests.py
index 604ee67..b910017 100755
--- a/subversion/tests/cmdline/svnmucc_tests.py
+++ b/subversion/tests/cmdline/svnmucc_tests.py
@@ -43,7 +43,7 @@ def reject_bogus_mergeinfo(sbox):
# At present this tests the server, but if we ever make svnmucc
# validate the mergeinfo up front then it will only test the client
- svntest.actions.run_and_verify_svnmucc(None, [], expected_error,
+ svntest.actions.run_and_verify_svnmucc([], expected_error,
'propset', 'svn:mergeinfo', '/B:0',
'-m', 'log msg',
sbox.repo_url + '/A')
@@ -106,7 +106,9 @@ def basic_svnmucc(sbox):
sbox.build()
empty_file = sbox.ospath('empty')
+ file = sbox.ospath('file')
svntest.main.file_append(empty_file, '')
+ svntest.main.file_append(file, 'file')
# revision 2
test_svnmucc(sbox.repo_url,
@@ -301,6 +303,14 @@ def basic_svnmucc(sbox):
'propsetf', 'testprop', empty_file, 'foo/z.c',
'propsetf', 'testprop', empty_file, 'foo/foo')
+ # revision 21
+ test_svnmucc(sbox.repo_url,
+ ['M /foo/z.c',
+ ], #---------
+ '-m', 'log msg',
+ 'propset', 'testprop', 'false', 'foo/z.c',
+ 'put', file, 'foo/z.c')
+
# Expected missing revision error
xtest_svnmucc(sbox.repo_url,
["svnmucc: E200004: 'a' is not a revision"
@@ -310,22 +320,21 @@ def basic_svnmucc(sbox):
# Expected cannot be younger error
xtest_svnmucc(sbox.repo_url,
- ['svnmucc: E205000: Copy source revision cannot be younger ' +
- 'than base revision',
+ ['svnmucc: E160006: No such revision 42',
], #---------
'-m', 'log msg',
'cp', '42', 'a', 'b')
# Expected already exists error
xtest_svnmucc(sbox.repo_url,
- ["svnmucc: E125002: 'foo' already exists",
+ ["svnmucc: E160020: Path 'foo' already exists",
], #---------
'-m', 'log msg',
'cp', '17', 'a', 'foo')
# Expected copy_src already exists error
xtest_svnmucc(sbox.repo_url,
- ["svnmucc: E125002: 'a/bar' (from 'foo/bar:17') already exists",
+ ["svnmucc: E160020: Path 'a/bar' already exists",
], #---------
'-m', 'log msg',
'cp', '17', 'foo', 'a',
@@ -333,7 +342,7 @@ def basic_svnmucc(sbox):
# Expected not found error
xtest_svnmucc(sbox.repo_url,
- ["svnmucc: E125002: 'a' not found",
+ ["svnmucc: E160013: Path 'a' not found in revision 17",
], #---------
'-m', 'log msg',
'cp', '17', 'a', 'b')
@@ -341,21 +350,22 @@ def basic_svnmucc(sbox):
def propset_root_internal(sbox, target):
## propset on ^/
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-m', 'log msg',
'propset', 'foo', 'bar',
target)
- svntest.actions.run_and_verify_svn(None, 'bar', [],
- 'propget', '--strict', 'foo',
+ svntest.actions.run_and_verify_svn('bar', [],
+ 'propget', '--no-newline', 'foo',
target)
## propdel on ^/
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-m', 'log msg',
'propdel', 'foo',
target)
- svntest.actions.run_and_verify_svn(None, [], [],
- 'propget', '--strict', 'foo',
+ svntest.actions.run_and_verify_svn([],
+ '.*W200017: Property.*not found',
+ 'propget', '--no-newline', 'foo',
target)
@Issues(3663)
@@ -411,6 +421,174 @@ def no_log_msg_non_interactive(sbox):
'mkdir', 'A/subdir')
+def nested_replaces(sbox):
+ "nested replaces"
+
+ sbox.build(create_wc=False)
+ repo_url = sbox.repo_url
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', repo_url, '-m', 'r2: create tree',
+ 'rm', 'A',
+ 'rm', 'iota',
+ 'mkdir', 'A', 'mkdir', 'A/B', 'mkdir', 'A/B/C',
+ 'mkdir', 'M', 'mkdir', 'M/N', 'mkdir', 'M/N/O',
+ 'mkdir', 'X', 'mkdir', 'X/Y', 'mkdir', 'X/Y/Z')
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', repo_url, '-m', 'r3: nested replaces',
+ *("""
+rm A rm M rm X
+cp HEAD X/Y/Z A cp HEAD A/B/C M cp HEAD M/N/O X
+cp HEAD A/B A/B cp HEAD M/N M/N cp HEAD X/Y X/Y
+rm A/B/C rm M/N/O rm X/Y/Z
+cp HEAD X A/B/C cp HEAD A M/N/O cp HEAD M X/Y/Z
+rm A/B/C/Y
+ """.split()))
+
+ # ### TODO: need a smarter run_and_verify_log() that verifies copyfrom
+ expected_output = svntest.verify.UnorderedRegexListOutput(map(re.escape, [
+ ' R /A (from /X/Y/Z:2)',
+ ' A /A/B (from /A/B:2)',
+ ' R /A/B/C (from /X:2)',
+ ' R /M (from /A/B/C:2)',
+ ' A /M/N (from /M/N:2)',
+ ' R /M/N/O (from /A:2)',
+ ' R /X (from /M/N/O:2)',
+ ' A /X/Y (from /X/Y:2)',
+ ' R /X/Y/Z (from /M:2)',
+ ' D /A/B/C/Y',
+ ]) + [
+ '^-', '^r3', '^-', '^Changed paths:',
+ ])
+ svntest.actions.run_and_verify_svn(expected_output, [],
+ 'log', '-qvr3', repo_url)
+
+
+def prohibited_deletes_and_moves(sbox):
+ "test prohibited delete and move operations"
+
+ # These action sequences were allowed in 1.8.13, but are prohibited in 1.9.x
+ # and later. Most of them probably indicate an inadvertent user mistake.
+ # See dev@, 2015-05-11, "Re: Issue 4579 / svnmucc fails to process certain
+ # deletes", <http://svn.haxx.se/dev/archive-2015-05/0038.shtml>
+
+ sbox.build(read_only = True)
+ svntest.main.file_write(sbox.ospath('file'), "New contents")
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'iota'",
+ ], #---------
+ '-m', 'r2: modify and delete /iota',
+ 'put', sbox.ospath('file'), 'iota',
+ 'rm', 'iota')
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'iota'",
+ ], #---------
+ '-m', 'r2: propset and delete /iota',
+ 'propset', 'prop', 'val', 'iota',
+ 'rm', 'iota')
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E160013: Can't delete node at 'iota' as it does "
+ "not exist",
+ ], #---------
+ '-m', 'r2: delete and delete /iota',
+ 'rm', 'iota',
+ 'rm', 'iota')
+
+ # Subversion 1.8.13 used to move /iota without applying the text change.
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'iota'",
+ ], #---------
+ '-m', 'r2: modify and move /iota',
+ 'put', sbox.ospath('file'), 'iota',
+ 'mv', 'iota', 'iota2')
+
+ # Subversion 1.8.13 used to move /A without applying the inner remove.
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'A'",
+ ], #---------
+ '-m', 'r2: delete /A/B and move /A',
+ 'rm', 'A/B',
+ 'mv', 'A', 'A1')
+
+def svnmucc_type_errors(sbox):
+ "test type errors"
+
+ sbox.build(read_only=True)
+
+ sbox.simple_append('file', 'New contents')
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E160016: Can't operate on 'B' "
+ "because 'A' is not a directory"],
+ '-m', '',
+ 'put', sbox.ospath('file'), 'A',
+ 'mkdir', 'A/B',
+ 'propset', 'iota', 'iota', 'iota')
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'A'"],
+ '-m', '',
+ 'mkdir', 'A/Z',
+ 'put', sbox.ospath('file'), 'A')
+
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E160020: Path 'Z' already exists"],
+ '-m', '',
+ 'mkdir', 'A/Z',
+ 'put', sbox.ospath('file'), 'A/Z')
+
+def svnmucc_propset_and_put(sbox):
+ "propset and put"
+
+ sbox.build()
+
+ sbox.simple_append('file', 'New contents')
+
+ # First in the sane order: put, then propset
+ xtest_svnmucc(sbox.repo_url,
+ [],
+ '-m', '',
+ 'put', sbox.ospath('file'), 't1',
+ 'propset', 't1', 't1', 't1')
+
+ # And now in an impossible order: propset, then put
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't set properties at not existing 't2'"],
+ '-m', '',
+ 'propset', 't2', 't2', 't2',
+ 'put', sbox.ospath('file'), 't2')
+
+ # And if the target already exists (dir)
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't delete node at 'A'"],
+ '-m', '',
+ 'propset', 'A', 'A', 'A',
+ 'put', sbox.ospath('file'), 'A')
+
+ # And if the target already exists (file) # fixed in r1702467
+ xtest_svnmucc(sbox.repo_url,
+ [],
+ '-m', '',
+ 'propset', 'iota', 'iota', 'iota',
+ 'put', sbox.ospath('file'), 'iota')
+
+ # Put same file twice (non existing)
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E160020: Path 't3' already exists"],
+ '-m', '',
+ 'put', sbox.ospath('file'), 't3',
+ 'put', sbox.ospath('file'), 't3')
+
+ # Put same file twice (existing)
+ xtest_svnmucc(sbox.repo_url,
+ ["svnmucc: E200009: Can't update file at 't1'"],
+ '-m', '',
+ 'put', sbox.ospath('file'), 't1',
+ 'put', sbox.ospath('file'), 't1')
+
+
######################################################################
test_list = [ None,
@@ -419,6 +597,10 @@ test_list = [ None,
propset_root,
too_many_log_messages,
no_log_msg_non_interactive,
+ nested_replaces,
+ prohibited_deletes_and_moves,
+ svnmucc_type_errors,
+ svnmucc_propset_and_put,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/svnrdump_tests.py b/subversion/tests/cmdline/svnrdump_tests.py
index 334bd15..1b564d7 100755
--- a/subversion/tests/cmdline/svnrdump_tests.py
+++ b/subversion/tests/cmdline/svnrdump_tests.py
@@ -34,7 +34,6 @@ from svntest.verify import SVNUnexpectedStdout, SVNUnexpectedStderr
from svntest.verify import SVNExpectedStderr
from svntest.main import write_restrictive_svnserve_conf
from svntest.main import server_has_partial_replay
-from svnadmin_tests import test_create
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -61,36 +60,27 @@ mismatched_headers_re = re.compile(
######################################################################
# Helper routines
-def build_repos(sbox):
- """Build an empty sandbox repository"""
-
- # Cleanup after the last run by removing any left-over repository.
- svntest.main.safe_rmtree(sbox.repo_dir)
-
- # Create an empty repository.
- svntest.main.create_repos(sbox.repo_dir)
-
-def compare_repos_dumps(svnrdump_sbox, svnadmin_dumpfile):
- """Compare two dumpfiles, one created from SVNRDUMP_SBOX, and other given
- by SVNADMIN_DUMPFILE. The dumpfiles do not need to match linewise, as the
- SVNADMIN_DUMPFILE contents will first be loaded into a repository and then
+def compare_repos_dumps(sbox, other_dumpfile,
+ bypass_prop_validation=False):
+ """Compare two dumpfiles, one created from SBOX, and other given
+ by OTHER_DUMPFILE. The dumpfiles do not need to match linewise, as the
+ OTHER_DUMPFILE contents will first be loaded into a repository and then
re-dumped to do the match, which should generate the same dumpfile as
- dumping SVNRDUMP_SBOX."""
-
- svnrdump_contents = svntest.actions.run_and_verify_dump(
- svnrdump_sbox.repo_dir)
+ dumping SBOX."""
- svnadmin_sbox = svnrdump_sbox.clone_dependent()
- svntest.main.safe_rmtree(svnadmin_sbox.repo_dir)
- svntest.main.create_repos(svnadmin_sbox.repo_dir)
- svntest.actions.run_and_verify_load(svnadmin_sbox.repo_dir, svnadmin_dumpfile)
+ sbox_dumpfile = svntest.actions.run_and_verify_dump(sbox.repo_dir)
- svnadmin_contents = svntest.actions.run_and_verify_dump(
- svnadmin_sbox.repo_dir)
+ # Load and dump the other dumpfile (using svnadmin)
+ other_sbox = sbox.clone_dependent()
+ other_sbox.build(create_wc=False, empty=True)
+ svntest.actions.run_and_verify_load(other_sbox.repo_dir, other_dumpfile,
+ bypass_prop_validation)
+ other_dumpfile = svntest.actions.run_and_verify_dump(other_sbox.repo_dir)
+ ### This call kind-of assumes EXPECTED is first and ACTUAL is second.
svntest.verify.compare_dump_files(
- "Dump files", "DUMP", svnadmin_contents, svnrdump_contents)
+ "Dump files", "DUMP", other_dumpfile, sbox_dumpfile)
def run_dump_test(sbox, dumpfile_name, expected_dumpfile_name = None,
subdir = None, bypass_prop_validation = False,
@@ -103,7 +93,7 @@ def run_dump_test(sbox, dumpfile_name, expected_dumpfile_name = None,
array of optional additional options to pass to 'svnrdump dump'."""
# Create an empty sandbox repository
- build_repos(sbox)
+ sbox.build(create_wc=False, empty=True)
# This directory contains all the dump files
svnrdump_tests_dir = os.path.join(os.path.dirname(sys.argv[0]),
@@ -111,11 +101,10 @@ def run_dump_test(sbox, dumpfile_name, expected_dumpfile_name = None,
# Load the specified dump file into the sbox repository using
# svnadmin load
- svnadmin_dumpfile = open(os.path.join(svnrdump_tests_dir,
+ original_dumpfile = open(os.path.join(svnrdump_tests_dir,
dumpfile_name),
'rb').readlines()
-
- svntest.actions.run_and_verify_load(sbox.repo_dir, svnadmin_dumpfile,
+ svntest.actions.run_and_verify_load(sbox.repo_dir, original_dumpfile,
bypass_prop_validation)
repo_url = sbox.repo_url
@@ -129,28 +118,29 @@ def run_dump_test(sbox, dumpfile_name, expected_dumpfile_name = None,
[], 0, *opts)
if expected_dumpfile_name:
- svnadmin_dumpfile = open(os.path.join(svnrdump_tests_dir,
+ expected_dumpfile = open(os.path.join(svnrdump_tests_dir,
expected_dumpfile_name),
'rb').readlines()
# Compare the output from stdout
if ignore_base_checksums:
- svnadmin_dumpfile = [l for l in svnadmin_dumpfile
+ expected_dumpfile = [l for l in expected_dumpfile
if not l.startswith('Text-delta-base-md5')]
svnrdump_dumpfile = [l for l in svnrdump_dumpfile
if not l.startswith('Text-delta-base-md5')]
- svnadmin_dumpfile = [l for l in svnadmin_dumpfile
+ expected_dumpfile = [l for l in expected_dumpfile
if not mismatched_headers_re.match(l)]
svnrdump_dumpfile = [l for l in svnrdump_dumpfile
if not mismatched_headers_re.match(l)]
- svnadmin_dumpfile = svntest.verify.UnorderedOutput(svnadmin_dumpfile)
+ expected_dumpfile = svntest.verify.UnorderedOutput(expected_dumpfile)
svntest.verify.compare_and_display_lines(
- "Dump files", "DUMP", svnadmin_dumpfile, svnrdump_dumpfile,
+ "Dump files", "DUMP", expected_dumpfile, svnrdump_dumpfile,
None)
else:
- compare_repos_dumps(sbox, svnadmin_dumpfile)
+ # The expected dumpfile is the result of dumping SBOX.
+ compare_repos_dumps(sbox, svnrdump_dumpfile, bypass_prop_validation)
def run_load_test(sbox, dumpfile_name, expected_dumpfile_name = None,
expect_deltas = True):
@@ -158,7 +148,7 @@ def run_load_test(sbox, dumpfile_name, expected_dumpfile_name = None,
dump' and check that the same dumpfile is produced"""
# Create an empty sandbox repository
- build_repos(sbox)
+ sbox.build(create_wc=False, empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -169,36 +159,37 @@ def run_load_test(sbox, dumpfile_name, expected_dumpfile_name = None,
# Load the specified dump file into the sbox repository using
# svnrdump load
- svnrdump_dumpfile = open(os.path.join(svnrdump_tests_dir,
+ original_dumpfile = open(os.path.join(svnrdump_tests_dir,
dumpfile_name),
'rb').readlines()
# Set the UUID of the sbox repository to the UUID specified in the
# dumpfile ### RA layer doesn't have a set_uuid functionality
- uuid = svnrdump_dumpfile[2].split(' ')[1][:-1]
- svntest.actions.run_and_verify_svnadmin2("Setting UUID", None, None, 0,
+ uuid = original_dumpfile[2].split(' ')[1][:-1]
+ svntest.actions.run_and_verify_svnadmin2(None, None, 0,
'setuuid', sbox.repo_dir,
uuid)
- svntest.actions.run_and_verify_svnrdump(svnrdump_dumpfile,
+ svntest.actions.run_and_verify_svnrdump(original_dumpfile,
svntest.verify.AnyOutput,
[], 0, 'load', sbox.repo_url)
- # Create a dump file using svnadmin dump
- svnadmin_dumpfile = svntest.actions.run_and_verify_dump(sbox.repo_dir,
+ # Re-dump the rdump-loaded repo using svnadmin dump
+ resulted_dumpfile = svntest.actions.run_and_verify_dump(sbox.repo_dir,
expect_deltas)
if expected_dumpfile_name:
- svnrdump_dumpfile = open(os.path.join(svnrdump_tests_dir,
+ expected_dumpfile = open(os.path.join(svnrdump_tests_dir,
expected_dumpfile_name),
'rb').readlines()
# Compare the output from stdout
svntest.verify.compare_and_display_lines(
- "Dump files", "DUMP", svnrdump_dumpfile, svnadmin_dumpfile)
+ "Dump files", "DUMP", expected_dumpfile, resulted_dumpfile)
else:
- compare_repos_dumps(sbox, svnrdump_dumpfile)
+ expected_dumpfile = original_dumpfile
+ compare_repos_dumps(sbox, expected_dumpfile)
######################################################################
# Tests
@@ -410,7 +401,7 @@ def reflect_dropped_renumbered_revs(sbox):
"svnrdump renumbers dropped revs in mergeinfo"
# Create an empty sandbox repository
- build_repos(sbox)
+ sbox.build(create_wc=False, empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -431,7 +422,8 @@ def reflect_dropped_renumbered_revs(sbox):
# Create the 'toplevel' directory in repository and then load the same
# dumpfile into that subtree.
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 10.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 10.\n'],
[], "mkdir", sbox.repo_url + "/toplevel",
"-m", "Create toplevel dir to load into")
svntest.actions.run_and_verify_svnrdump(svnrdump_dumpfile,
@@ -444,7 +436,7 @@ def reflect_dropped_renumbered_revs(sbox):
url + "/trunk - /branch1:4-8\n",
url + "/toplevel/trunk - /toplevel/branch1:14-18\n",
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -473,7 +465,7 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
"don't drop mergeinfo revs in incremental svnrdump"
# Create an empty repos.
- test_create(sbox)
+ sbox.build(empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -488,7 +480,7 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
# | | | |
# trunk---r2---r3-----r5---r6-------r8---r9---------------> | |
# r1 | | | | | |
- # intial | | | |______ | |
+ # initial | | | |______ | |
# import copy | copy | merge merge
# | | | merge (r5) (r8)
# | | | (r9) | |
@@ -542,7 +534,7 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
url + "B2 - /trunk:9\n",
url + "B1/B/E - /branches/B2/B/E:11-12\n",
"/trunk/B/E:5-6,8-9\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -579,7 +571,8 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
dump_fp.close()
# Blow away the current repos and create an empty one in its place.
- test_create(sbox)
+ svntest.main.safe_rmtree(sbox.repo_dir, True) # Fix race with bdb in svnserve
+ sbox.build(empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -604,7 +597,7 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
# Check the mergeinfo, we use the same expected output as before,
# as it (duh!) should be exactly the same as when we loaded the
# repos in one shot.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -614,7 +607,8 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
# PART 3: Load a full dump to an non-empty repository.
#
# Reset our sandbox.
- test_create(sbox)
+ svntest.main.safe_rmtree(sbox.repo_dir, True) # Fix race with bdb in svnserve
+ sbox.build(empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -668,14 +662,15 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
url + "B2 - /Projects/Project-X/trunk:15\n",
url + "B1/B/E - /Projects/Project-X/branches/B2/B/E:17-18\n",
"/Projects/Project-X/trunk/B/E:11-12,14-15\n"])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
# PART 4: Load a a series of incremental dumps to an non-empty repository.
#
# Reset our sandbox.
- test_create(sbox)
+ svntest.main.safe_rmtree(sbox.repo_dir, True) # Fix race with bdb in svnserve
+ sbox.build(empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
@@ -710,7 +705,7 @@ def dont_drop_valid_mergeinfo_during_incremental_svnrdump_loads(sbox):
# Check the resulting mergeinfo. We expect the exact same results
# as Part 3.
# See http://subversion.tigris.org/issues/show_bug.cgi?id=3020#desc16.
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'propget', 'svn:mergeinfo', '-R',
sbox.repo_url)
@@ -720,14 +715,15 @@ def svnrdump_load_partial_incremental_dump(sbox):
"svnrdump load partial incremental dump"
# Create an empty sandbox repository
- build_repos(sbox)
+ sbox.build(create_wc=False, empty=True)
# Create the revprop-change hook for this test
svntest.actions.enable_revprop_changes(sbox.repo_dir)
# Create the 'A' directory in repository and then load the partial
# incremental dump into the root of the repository.
- svntest.actions.run_and_verify_svn(None, ['\n', 'Committed revision 1.\n'],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 1.\n'],
[], "mkdir", sbox.repo_url + "/A",
"-m", "Create toplevel dir to load into")
@@ -769,6 +765,53 @@ def only_trunk_A_range_dump(sbox):
#----------------------------------------------------------------------
+@Issue(4490)
+def load_prop_change_in_non_deltas_dump(sbox):
+ "load: prop change in non-deltas dump"
+ # 'svnrdump load' crashed when processing a node record with a non-delta
+ # properties block if the node previously had any svn:* properties.
+
+ sbox.build()
+ sbox.simple_propset('svn:eol-style', 'native', 'iota', 'A/mu', 'A/B/lambda')
+ sbox.simple_commit()
+
+ # Any prop change on a node that had an svn:* prop triggered the crash,
+ # so test an svn:* prop deletion and also some other prop changes.
+ sbox.simple_propdel('svn:eol-style', 'iota')
+ sbox.simple_propset('svn:eol-style', 'LF', 'A/mu')
+ sbox.simple_propset('p1', 'v1', 'A/B/lambda')
+ sbox.simple_commit()
+
+ # Create a non-deltas dump. Use 'svnadmin', as svnrdump doesn't have that
+ # option.
+ dump = svntest.actions.run_and_verify_dump(sbox.repo_dir, deltas=False)
+
+ # Try to load that dump.
+ sbox.build(create_wc=False, empty=True)
+ svntest.actions.enable_revprop_changes(sbox.repo_dir)
+ svntest.actions.run_and_verify_svnrdump(dump,
+ [], [], 0,
+ '-q', 'load', sbox.repo_url)
+
+#----------------------------------------------------------------------
+
+@Issue(4476)
+def dump_mergeinfo_contains_r0(sbox):
+ "dump: mergeinfo that contains r0"
+ ### We pass the original dump file name as 'expected_dumpfile_name' because
+ ### run_dump_test is currently broken when we don't.
+ run_dump_test(sbox, "mergeinfo-contains-r0.dump",
+ bypass_prop_validation=True)
+
+#----------------------------------------------------------------------
+
+@XFail()
+@Issue(4476)
+def load_mergeinfo_contains_r0(sbox):
+ "load: mergeinfo that contains r0"
+ run_load_test(sbox, "mergeinfo-contains-r0.dump",
+ expected_dumpfile_name="mergeinfo-contains-r0.expected.dump")
+
#----------------------------------------------------------------------
# Regression test for issue 4551 "svnrdump load commits wrong properties,
@@ -870,6 +913,30 @@ def load_non_deltas_replace_copy_with_props(sbox):
actual = map(str.strip, out)
svntest.verify.compare_and_display_lines(None, 'PROPS', expected, actual)
+# Regression test for issue #4552 "svnrdump writes duplicate headers for a
+# replace-with-copy". 'svnrdump dump' wrote the Node-path and Node-kind
+# headers twice for the 'delete' record of a replace-with-copy.
+@Issue(4552)
+def dump_replace_with_copy(sbox):
+ "dump replace with copy"
+ sbox.build()
+
+ # Copy file/dir, replacing something
+ sbox.simple_rm('A/D/gamma', 'A/C')
+ sbox.simple_copy('A/mu@1', 'A/D/gamma')
+ sbox.simple_copy('A/B@1', 'A/C')
+ sbox.simple_commit()
+
+ # Dump with 'svnrdump'
+ dumpfile = svntest.actions.run_and_verify_svnrdump(
+ None, svntest.verify.AnyOutput, [], 0,
+ 'dump', '--quiet', '--incremental', '-r2',
+ sbox.repo_url)
+
+ # Check the 'delete' record headers: expect this parse to fail if headers
+ # are duplicated
+ svntest.verify.DumpParser(dumpfile).parse()
+
# Regression test for issue 4551 "svnrdump load commits wrong properties,
# or fails, on a non-deltas dumpfile". In this test, a node's props are
# modified, and the failure mode is that RA-serf would end up deleting
@@ -969,8 +1036,12 @@ test_list = [ None,
range_dump,
only_trunk_range_dump,
only_trunk_A_range_dump,
+ load_prop_change_in_non_deltas_dump,
+ dump_mergeinfo_contains_r0,
+ load_mergeinfo_contains_r0,
load_non_deltas_copy_with_props,
load_non_deltas_replace_copy_with_props,
+ dump_replace_with_copy,
load_non_deltas_with_props,
]
diff --git a/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.dump b/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.dump
new file mode 100644
index 0000000..2b7b50e
--- /dev/null
+++ b/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.dump
Binary files differ
diff --git a/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.expected.dump b/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.expected.dump
new file mode 100644
index 0000000..6fdbf1c
--- /dev/null
+++ b/subversion/tests/cmdline/svnrdump_tests_data/mergeinfo-contains-r0.expected.dump
Binary files differ
diff --git a/subversion/tests/cmdline/svnserveautocheck.sh b/subversion/tests/cmdline/svnserveautocheck.sh
index d537731..7c17784 100755
--- a/subversion/tests/cmdline/svnserveautocheck.sh
+++ b/subversion/tests/cmdline/svnserveautocheck.sh
@@ -98,6 +98,8 @@ else
TIME_CMD=""
fi
+MAKE=${MAKE:-make}
+
SVNSERVE_PORT=$(random_port)
while netstat -an | grep $SVNSERVE_PORT | grep 'LISTEN'; do
SVNSERVE_PORT=$(random_port)
@@ -119,7 +121,7 @@ fi
BASE_URL=svn://127.0.0.1:$SVNSERVE_PORT
if [ $# = 0 ]; then
- $TIME_CMD make check "BASE_URL=$BASE_URL"
+ $TIME_CMD "$MAKE" check "BASE_URL=$BASE_URL"
r=$?
else
cd "$ABS_BUILDDIR/subversion/tests/cmdline/"
diff --git a/subversion/tests/cmdline/svnsync_authz_tests.py b/subversion/tests/cmdline/svnsync_authz_tests.py
index 62e79c6..54dc099 100755
--- a/subversion/tests/cmdline/svnsync_authz_tests.py
+++ b/subversion/tests/cmdline/svnsync_authz_tests.py
@@ -30,17 +30,18 @@
import sys, os
# Test suite-specific modules
-import locale, re, urllib
+import locale, re
# Our testing module
import svntest
from svntest.verify import SVNUnexpectedStdout, SVNUnexpectedStderr
from svntest.verify import SVNExpectedStderr
from svntest.main import write_restrictive_svnserve_conf
+from svntest.main import write_authz_file
from svntest.main import server_has_partial_replay
# Shared helpers
-from svnsync_tests import build_repos, run_init, run_sync, run_test
+from svnsync_tests import run_init, run_sync, run_test
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -56,27 +57,25 @@ Item = svntest.wc.StateItem
def basic_authz(sbox):
"verify that unreadable content is not synced"
- sbox.build("svnsync-basic-authz")
+ sbox.build(create_wc = False)
write_restrictive_svnserve_conf(sbox.repo_dir)
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
run_init(dest_sbox.repo_url, sbox.repo_url)
- args = tuple(s.authz_name() for s in [sbox, sbox, dest_sbox])
- svntest.main.file_write(sbox.authz_file,
- "[%s:/]\n"
- "* = r\n"
- "\n"
- "[%s:/A/B]\n"
- "* = \n"
- "\n"
- "[%s:/]\n"
- "* = rw\n" % args)
+ src_authz = sbox.authz_name()
+ dst_authz = dest_sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A/B': '* =',
+ dst_authz + ':/': '* = rw',
+ })
run_sync(dest_sbox.repo_url)
@@ -84,13 +83,11 @@ def basic_authz(sbox):
iota_url = dest_sbox.repo_url + '/iota'
# this file should have been blocked by authz
- svntest.actions.run_and_verify_svn(None,
- [], svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn([], svntest.verify.AnyOutput,
'cat',
lambda_url)
# this file should have been synced
- svntest.actions.run_and_verify_svn(None,
- svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'cat',
iota_url)
@@ -99,7 +96,7 @@ def basic_authz(sbox):
def copy_from_unreadable_dir(sbox):
"verify that copies from unreadable dirs work"
- sbox.build("svnsync-copy-from-unreadable-dir")
+ sbox.build()
B_url = sbox.repo_url + '/A/B'
P_url = sbox.repo_url + '/A/P'
@@ -107,7 +104,6 @@ def copy_from_unreadable_dir(sbox):
# Set a property on the directory we're going to copy, and a file in it, to
# confirm that they're transmitted when we later sync the copied directory
svntest.actions.run_and_verify_svn(None,
- None,
[],
'pset',
'foo',
@@ -115,7 +111,6 @@ def copy_from_unreadable_dir(sbox):
sbox.wc_dir + '/A/B/lambda')
svntest.actions.run_and_verify_svn(None,
- None,
[],
'pset',
'baz',
@@ -123,7 +118,6 @@ def copy_from_unreadable_dir(sbox):
sbox.wc_dir + '/A/B')
svntest.actions.run_and_verify_svn(None,
- None,
[],
'ci',
sbox.wc_dir + '/A/B',
@@ -131,7 +125,6 @@ def copy_from_unreadable_dir(sbox):
# Now copy that directory so we'll see it in our synced copy
svntest.actions.run_and_verify_svn(None,
- None,
[],
'cp',
B_url,
@@ -141,21 +134,18 @@ def copy_from_unreadable_dir(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
- args = tuple(s.authz_name() for s in [sbox, sbox, dest_sbox])
- open(sbox.authz_file, 'w').write(
- "[%s:/]\n"
- "* = r\n"
- "\n"
- "[%s:/A/B]\n"
- "* = \n"
- "\n"
- "[%s:/]\n"
- "* = rw"
- % args)
+ src_authz = sbox.authz_name()
+ dst_authz = dest_sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A/B': '* =',
+ dst_authz + ':/': '* = rw',
+ })
run_init(dest_sbox.repo_url, sbox.repo_url)
@@ -187,15 +177,13 @@ def copy_from_unreadable_dir(sbox):
expected_out,
out[2:11])
- svntest.actions.run_and_verify_svn(None,
- ['bar\n'],
+ svntest.actions.run_and_verify_svn(['bar\n'],
[],
'pget',
'foo',
dest_sbox.repo_url + '/A/P/lambda')
- svntest.actions.run_and_verify_svn(None,
- ['zot\n'],
+ svntest.actions.run_and_verify_svn(['zot\n'],
[],
'pget',
'baz',
@@ -207,11 +195,10 @@ def copy_from_unreadable_dir(sbox):
def copy_with_mod_from_unreadable_dir(sbox):
"verify copies with mods from unreadable dirs"
- sbox.build("svnsync-copy-with-mod-from-unreadable-dir")
+ sbox.build()
# Make a copy of the B directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'cp',
sbox.wc_dir + '/A/B',
@@ -219,7 +206,6 @@ def copy_with_mod_from_unreadable_dir(sbox):
# Set a property inside the copied directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'pset',
'foo',
@@ -228,7 +214,6 @@ def copy_with_mod_from_unreadable_dir(sbox):
# Add a new directory and file inside the copied directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'mkdir',
sbox.wc_dir + '/A/P/NEW-DIR')
@@ -238,14 +223,12 @@ def copy_with_mod_from_unreadable_dir(sbox):
# Delete a file inside the copied directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'rm',
sbox.wc_dir + '/A/P/E/beta')
# Commit the copy-with-modification.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'ci',
sbox.wc_dir,
@@ -255,21 +238,18 @@ def copy_with_mod_from_unreadable_dir(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
- args = tuple(s.authz_name() for s in [sbox, sbox, dest_sbox])
- open(sbox.authz_file, 'w').write(
- "[%s:/]\n"
- "* = r\n"
- "\n"
- "[%s:/A/B]\n"
- "* = \n"
- "\n"
- "[%s:/]\n"
- "* = rw"
- % args)
+ src_authz = sbox.authz_name()
+ dst_authz = dest_sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A/B': '* =',
+ dst_authz + ':/': '* = rw',
+ })
run_init(dest_sbox.repo_url, sbox.repo_url)
@@ -302,8 +282,7 @@ def copy_with_mod_from_unreadable_dir(sbox):
expected_out,
out[2:12])
- svntest.actions.run_and_verify_svn(None,
- ['bar\n'],
+ svntest.actions.run_and_verify_svn(['bar\n'],
[],
'pget',
'foo',
@@ -315,11 +294,10 @@ def copy_with_mod_from_unreadable_dir(sbox):
def copy_with_mod_from_unreadable_dir_and_copy(sbox):
"verify copies with mods from unreadable dirs +copy"
- sbox.build("svnsync-copy-with-mod-from-unreadable-dir-and-copy")
+ sbox.build()
# Make a copy of the B directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'cp',
sbox.wc_dir + '/A/B',
@@ -328,7 +306,6 @@ def copy_with_mod_from_unreadable_dir_and_copy(sbox):
# Copy a (readable) file into the copied directory.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'cp',
sbox.wc_dir + '/A/D/gamma',
@@ -337,7 +314,6 @@ def copy_with_mod_from_unreadable_dir_and_copy(sbox):
# Commit the copy-with-modification.
svntest.actions.run_and_verify_svn(None,
- None,
[],
'ci',
sbox.wc_dir,
@@ -347,21 +323,18 @@ def copy_with_mod_from_unreadable_dir_and_copy(sbox):
write_restrictive_svnserve_conf(sbox.repo_dir)
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
- args = tuple(s.authz_name() for s in [sbox, sbox, dest_sbox])
- open(sbox.authz_file, 'w').write(
- "[%s:/]\n"
- "* = r\n"
- "\n"
- "[%s:/A/B]\n"
- "* = \n"
- "\n"
- "[%s:/]\n"
- "* = rw"
- % args)
+ src_authz = sbox.authz_name()
+ dst_authz = dest_sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A/B': '* =',
+ dst_authz + ':/': '* = rw',
+ })
run_init(dest_sbox.repo_url, sbox.repo_url)
@@ -396,6 +369,9 @@ def copy_with_mod_from_unreadable_dir_and_copy(sbox):
def identity_copy(sbox):
"copy UTF-8 svn:* props identically"
+
+ sbox.build(create_wc = False)
+
orig_lc_all = locale.setlocale(locale.LC_ALL)
other_locales = [ "English.1252", "German.1252", "French.1252",
"en_US.ISO-8859-1", "en_GB.ISO-8859-1", "de_DE.ISO-8859-1",
@@ -420,10 +396,10 @@ def identity_copy(sbox):
def specific_deny_authz(sbox):
"verify if specifically denied paths dont sync"
- sbox.build("specific-deny-authz")
+ sbox.build()
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
@@ -440,38 +416,31 @@ def specific_deny_authz(sbox):
# For mod_dav_svn's parent path setup we need per-repos permissions in
# the authz file...
if sbox.repo_url.startswith('http'):
- svntest.main.file_write(sbox.authz_file,
- "[specific-deny-authz:/]\n"
- "* = r\n"
- "\n"
- "[specific-deny-authz:/A]\n"
- "* = \n"
- "\n"
- "[specific-deny-authz:/A_COPY/B/lambda]\n"
- "* = \n"
- "\n"
- "[specific-deny-authz-1:/]\n"
- "* = rw\n")
+ src_authz = sbox.authz_name()
+ dst_authz = dest_sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A': '* =',
+ src_authz + ':/A_COPY/B/lambda': '* =',
+ dst_authz + ':/': '* = rw',
+ })
# Otherwise we can just go with the permissions needed for the source
# repository.
else:
- svntest.main.file_write(sbox.authz_file,
- "[/]\n"
- "* = r\n"
- "\n"
- "[/A]\n"
- "* = \n"
- "\n"
- "[/A_COPY/B/lambda]\n"
- "* = \n")
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ '/': '* = r',
+ '/A': '* =',
+ '/A_COPY/B/lambda': '* =',
+ })
run_sync(dest_sbox.repo_url)
lambda_url = dest_sbox.repo_url + '/A_COPY/B/lambda'
# this file should have been blocked by authz
- svntest.actions.run_and_verify_svn(None,
- [], svntest.verify.AnyOutput,
+ svntest.actions.run_and_verify_svn([], svntest.verify.AnyOutput,
'cat',
lambda_url)
@@ -481,8 +450,8 @@ def copy_delete_unreadable_child(sbox):
"copy, then rm at-src-unreadable child"
# Prepare the source: Greek tree (r1), cp+rm (r2).
- sbox.build("copy-delete-unreadable-child")
- svntest.actions.run_and_verify_svnmucc(None, None, [],
+ sbox.build(create_wc = False)
+ svntest.actions.run_and_verify_svnmucc(None, [],
'-m', 'r2',
'-U', sbox.repo_url,
'cp', 'HEAD', '/', 'branch',
@@ -490,27 +459,24 @@ def copy_delete_unreadable_child(sbox):
# Create the destination.
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
# Lock down the source.
- authz = sbox.authz_name()
write_restrictive_svnserve_conf(sbox.repo_dir, anon_access='read')
- svntest.main.file_write(sbox.authz_file,
- "[%s:/]\n"
- "* = r\n"
- "[%s:/A]\n"
- "* = \n"
- % (authz, authz))
-
- dest_url = svntest.main.file_scheme_prefix \
- + urllib.pathname2url(os.path.abspath(dest_sbox.repo_dir))
+ src_authz = sbox.authz_name()
+ write_authz_file(sbox, None,
+ prefixed_rules = {
+ src_authz + ':/': '* = r',
+ src_authz + ':/A': '* =',
+ })
+
+ dest_url = dest_sbox.file_protocol_url()
run_init(dest_url, sbox.repo_url)
run_sync(dest_url)
# sanity check
- svntest.actions.run_and_verify_svn(None,
- ["iota\n"], [],
+ svntest.actions.run_and_verify_svn(["iota\n"], [],
'ls', dest_url+'/branch@2')
diff --git a/subversion/tests/cmdline/svnsync_tests.py b/subversion/tests/cmdline/svnsync_tests.py
index 16594cb..c7821b2 100755
--- a/subversion/tests/cmdline/svnsync_tests.py
+++ b/subversion/tests/cmdline/svnsync_tests.py
@@ -28,12 +28,13 @@
import sys, os
# Test suite-specific modules
-import re, urllib
+import re
# Our testing module
import svntest
from svntest.verify import SVNUnexpectedStdout, SVNUnexpectedStderr
from svntest.verify import SVNExpectedStderr
+from svntest.verify import AnyOutput
from svntest.main import server_has_partial_replay
# (abbreviation)
@@ -49,117 +50,57 @@ Item = svntest.wc.StateItem
# Helper routines
-def build_repos(sbox):
- """Avoid the use sbox.build() because we're working with a repos
- other than the Greek tree."""
- # Cleanup after the last run by removing any left-over repository.
- svntest.main.safe_rmtree(sbox.repo_dir)
-
- # Create an empty repository.
- svntest.main.create_repos(sbox.repo_dir)
-
-
-def run_sync(url, source_url=None, expected_error=None,
- source_prop_encoding=None):
+def run_sync(url, source_url=None,
+ source_prop_encoding=None,
+ expected_output=AnyOutput, expected_error=[]):
"Synchronize the mirror repository with the master"
if source_url is not None:
- args = ["synchronize", url, source_url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd]
+ args = ["synchronize", url, source_url]
else: # Allow testing of old source-URL-less syntax
- args = ["synchronize", url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd]
+ args = ["synchronize", url]
if source_prop_encoding:
args.append("--source-prop-encoding")
args.append(source_prop_encoding)
- exit_code, output, errput = svntest.main.run_svnsync(*args)
- for index, line in enumerate(errput[:]):
- if re.search("warning: W200007", line):
- del errput[index]
- if errput:
- if expected_error is None:
- raise SVNUnexpectedStderr(errput)
- else:
- expected_error = svntest.verify.RegexOutput(expected_error,
- match_all=False)
- svntest.verify.compare_and_display_lines(None, "STDERR",
- expected_error, errput)
- elif expected_error is not None:
- raise SVNExpectedStderr
- if not output and not expected_error:
- # should be: ['Committed revision 1.\n', 'Committed revision 2.\n']
- raise SVNUnexpectedStdout("Missing stdout")
-
-def run_copy_revprops(url, source_url, expected_error=None,
- source_prop_encoding=None):
+ # Normal expected output is of the form:
+ # ['Transmitting file data .......\n', # optional
+ # 'Committed revision 1.\n',
+ # 'Copied properties for revision 1.\n', ...]
+ svntest.actions.run_and_verify_svnsync(expected_output, expected_error,
+ *args)
+
+def run_copy_revprops(url, source_url,
+ source_prop_encoding=None,
+ expected_output=AnyOutput, expected_error=[]):
"Copy revprops to the mirror repository from the master"
- args = ["copy-revprops", url, source_url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd]
+ args = ["copy-revprops", url, source_url]
if source_prop_encoding:
args.append("--source-prop-encoding")
args.append(source_prop_encoding)
- exit_code, output, errput = svntest.main.run_svnsync(*args)
- for index, line in enumerate(errput[:]):
- if re.search("warning: W200007", line):
- del errput[index]
- if errput:
- if expected_error is None:
- raise SVNUnexpectedStderr(errput)
- else:
- expected_error = svntest.verify.RegexOutput(expected_error,
- match_all=False)
- svntest.verify.compare_and_display_lines(None, "STDERR",
- expected_error, errput)
- elif expected_error is not None:
- raise SVNExpectedStderr
- if not output and not expected_error:
- # should be: ['Copied properties for revision 1.\n',
- # 'Copied properties for revision 2.\n']
- raise SVNUnexpectedStdout("Missing stdout")
+ # Normal expected output is of the form:
+ # ['Copied properties for revision 1.\n', ...]
+ svntest.actions.run_and_verify_svnsync(expected_output, expected_error,
+ *args)
def run_init(dst_url, src_url, source_prop_encoding=None):
"Initialize the mirror repository from the master"
- args = ["initialize", dst_url, src_url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd]
+ args = ["initialize", dst_url, src_url]
if source_prop_encoding:
args.append("--source-prop-encoding")
args.append(source_prop_encoding)
- exit_code, output, errput = svntest.main.run_svnsync(*args)
- for index, line in enumerate(errput[:]):
- if re.search("warning: W200007", line):
- del errput[index]
- if errput:
- raise SVNUnexpectedStderr(errput)
- if output != ['Copied properties for revision 0.\n']:
- raise SVNUnexpectedStdout(output)
+ expected_output = ['Copied properties for revision 0.\n']
+ svntest.actions.run_and_verify_svnsync(expected_output, [], *args)
-def run_info(url, expected_error=None):
+def run_info(url, expected_output=AnyOutput, expected_error=[]):
"Print synchronization information of the repository"
- exit_code, output, errput = svntest.main.run_svnsync(
- "info", url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd)
- if errput:
- if expected_error is None:
- raise SVNUnexpectedStderr(errput)
- else:
- expected_error = svntest.verify.RegexOutput(expected_error,
- match_all=False)
- svntest.verify.compare_and_display_lines(None, "STDERR",
- expected_error, errput)
- elif expected_error is not None:
- raise SVNExpectedStderr
- if not output and not expected_error:
- # should be: ['From URL: http://....\n',
- # 'From UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n',
- # 'Last Merged Revision: XXX\n']
- raise SVNUnexpectedStdout("Missing stdout")
+ # Normal expected output is of the form:
+ # ['From URL: http://....\n',
+ # 'From UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n',
+ # 'Last Merged Revision: XXX\n']
+ svntest.actions.run_and_verify_svnsync(expected_output, expected_error,
+ "info", url)
def setup_and_sync(sbox, dump_file_contents, subdir=None,
@@ -168,7 +109,7 @@ def setup_and_sync(sbox, dump_file_contents, subdir=None,
"""Create a repository for SBOX, load it with DUMP_FILE_CONTENTS, then create a mirror repository and sync it with SBOX. If is_src_ra_local or is_dest_ra_local is True, then run_init, run_sync, and run_copy_revprops will use the file:// scheme for the source and destination URLs. Return the mirror sandbox."""
# Create the empty master repository.
- build_repos(sbox)
+ sbox.build(create_wc=False, empty=True)
# Load the repository from DUMP_FILE_PATH.
svntest.actions.run_and_verify_load(sbox.repo_dir, dump_file_contents,
@@ -176,11 +117,11 @@ def setup_and_sync(sbox, dump_file_contents, subdir=None,
# Create the empty destination repository.
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
# Setup the mirror repository. Feed it the UUID of the source repository.
exit_code, output, errput = svntest.main.run_svnlook("uuid", sbox.repo_dir)
- svntest.actions.run_and_verify_svnadmin2("Setting UUID", None, None, 0,
+ svntest.actions.run_and_verify_svnadmin2(None, None, 0,
'setuuid', dest_sbox.repo_dir,
output[0][:-1])
@@ -190,16 +131,14 @@ def setup_and_sync(sbox, dump_file_contents, subdir=None,
repo_url = sbox.repo_url
cwd = os.getcwd()
if is_src_ra_local:
- repo_url = svntest.main.file_scheme_prefix + \
- urllib.pathname2url(os.path.join(cwd, sbox.repo_dir))
+ repo_url = sbox.file_protocol_url()
if subdir:
repo_url = repo_url + subdir
dest_repo_url = dest_sbox.repo_url
if is_dest_ra_local:
- dest_repo_url = svntest.main.file_scheme_prefix + \
- urllib.pathname2url(os.path.join(cwd, dest_sbox.repo_dir))
+ dest_repo_url = dest_sbox.file_protocol_url()
run_init(dest_repo_url, repo_url, source_prop_encoding)
run_sync(dest_repo_url, repo_url,
@@ -221,7 +160,7 @@ def verify_mirror(dest_sbox, exp_dump_file_contents):
for prop_name in ("svn:sync-from-url", "svn:sync-from-uuid",
"svn:sync-last-merged-rev"):
svntest.actions.run_and_verify_svn(
- None, None, [], "propdel", "--revprop", "-r", "0",
+ None, [], "propdel", "--revprop", "-r", "0",
prop_name, dest_sbox.repo_url)
# Create a dump file from the mirror repository.
@@ -346,14 +285,13 @@ def detect_meddling(sbox):
sbox.build("svnsync-meddling")
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
# Make our own destination checkout (have to do it ourself because
# it is not greek).
svntest.main.safe_rmtree(dest_sbox.wc_dir)
svntest.actions.run_and_verify_svn(None,
- None,
[],
'co',
dest_sbox.repo_url,
@@ -365,7 +303,6 @@ def detect_meddling(sbox):
run_sync(dest_sbox.repo_url)
svntest.actions.run_and_verify_svn(None,
- None,
[],
'up',
dest_sbox.wc_dir)
@@ -374,14 +311,14 @@ def detect_meddling(sbox):
svntest.main.file_append(os.path.join(dest_sbox.wc_dir, 'A', 'B', 'lambda'),
'new lambda text')
svntest.actions.run_and_verify_svn(None,
- None,
[],
'ci',
'-m', 'msg',
dest_sbox.wc_dir)
+ expected_error = r".*Destination HEAD \(2\) is not the last merged revision \(1\).*"
run_sync(dest_sbox.repo_url, None,
- ".*Destination HEAD \\(2\\) is not the last merged revision \\(1\\).*")
+ expected_output=[], expected_error=expected_error)
def url_encoding(sbox):
"test url encoding issues"
@@ -427,28 +364,18 @@ def info_synchronized(sbox):
src_uuid = output[0].strip()
dest_sbox = sbox.clone_dependent()
- build_repos(dest_sbox)
+ dest_sbox.build(create_wc=False, empty=True)
svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
run_init(dest_sbox.repo_url, sbox.repo_url)
run_sync(dest_sbox.repo_url)
- exit_code, output, errput = svntest.main.run_svnsync(
- "info", dest_sbox.repo_url,
- "--username", svntest.main.wc_author,
- "--password", svntest.main.wc_passwd)
- if errput:
- raise SVNUnexpectedStderr(errput)
-
expected_out = ['Source URL: %s\n' % sbox.repo_url,
'Source Repository UUID: %s\n' % src_uuid,
'Last Merged Revision: 1\n',
]
-
- svntest.verify.compare_and_display_lines(None,
- 'INFO',
- expected_out,
- output)
+ svntest.actions.run_and_verify_svnsync(expected_out, [],
+ "info", dest_sbox.repo_url)
def info_not_synchronized(sbox):
"test info cmd on an un-synchronized repo"
@@ -456,7 +383,7 @@ def info_not_synchronized(sbox):
sbox.build("svnsync-info-not-syncd", False)
run_info(sbox.repo_url,
- ".*Repository '%s' is not initialized.*" % sbox.repo_url)
+ [], ".*Repository '%s' is not initialized.*" % sbox.repo_url)
#----------------------------------------------------------------------
diff --git a/subversion/tests/cmdline/svntest/__init__.py b/subversion/tests/cmdline/svntest/__init__.py
index 98a67b6..e090685 100644
--- a/subversion/tests/cmdline/svntest/__init__.py
+++ b/subversion/tests/cmdline/svntest/__init__.py
@@ -23,11 +23,11 @@
__all__ = [ ]
import sys
-if sys.hexversion < 0x2050000:
- sys.stderr.write('[SKIPPED] at least Python 2.5 is required\n')
+if sys.hexversion < 0x2070000:
+ sys.stderr.write('[SKIPPED] at least Python 2.7 is required\n')
# note: exiting is a bit harsh for a library module, but we really do
- # require Python 2.5. this package isn't going to work otherwise.
+ # require Python 2.7. this package isn't going to work otherwise.
# we're skipping this test, not failing, so exit with 0
sys.exit(0)
diff --git a/subversion/tests/cmdline/svntest/actions.py b/subversion/tests/cmdline/svntest/actions.py
index feef017..a25928d 100644
--- a/subversion/tests/cmdline/svntest/actions.py
+++ b/subversion/tests/cmdline/svntest/actions.py
@@ -76,46 +76,49 @@ def setup_pristine_greek_repository():
# If there's no pristine repos, create one.
if not os.path.exists(main.pristine_greek_repos_dir):
- main.create_repos(main.pristine_greek_repos_dir)
+ if main.options.fsfs_version is not None:
+ main.unpack_greek_repos(main.pristine_greek_repos_dir)
+ else:
+ main.create_repos(main.pristine_greek_repos_dir)
- # if this is dav, gives us access rights to import the greek tree.
- if main.is_ra_type_dav():
- authz_file = os.path.join(main.work_dir, "authz")
- main.file_write(authz_file, "[/]\n* = rw\n")
+ # if this is dav, gives us access rights to import the greek tree.
+ if main.is_ra_type_dav():
+ authz_file = os.path.join(main.work_dir, "authz")
+ main.file_write(authz_file, "[/]\n* = rw\n")
- # dump the greek tree to disk.
- main.greek_state.write_to_disk(main.greek_dump_dir)
+ # dump the greek tree to disk.
+ main.greek_state.write_to_disk(main.greek_dump_dir)
- # import the greek tree, using l:foo/p:bar
- ### todo: svn should not be prompting for auth info when using
- ### repositories with no auth/auth requirements
- _, output, _ = main.run_svn(None, 'import', '-m',
- 'Log message for revision 1.',
- main.greek_dump_dir,
- main.pristine_greek_repos_url)
+ # import the greek tree, using l:foo/p:bar
+ ### todo: svn should not be prompting for auth info when using
+ ### repositories with no auth/auth requirements
+ _, output, _ = main.run_svn(None, 'import', '-m',
+ 'Log message for revision 1.',
+ main.greek_dump_dir,
+ main.pristine_greek_repos_url)
- # verify the printed output of 'svn import'.
- lastline = output.pop().strip()
- match = re.search("(Committed|Imported) revision [0-9]+.", lastline)
- if not match:
- logger.error("import did not succeed, while creating greek repos.")
- logger.error("The final line from 'svn import' was:")
- logger.error(lastline)
- sys.exit(1)
- output_tree = wc.State.from_commit(output)
-
- expected_output_tree = main.greek_state.copy(main.greek_dump_dir)
- expected_output_tree.tweak(verb='Adding',
- contents=None)
+ # verify the printed output of 'svn import'.
+ lastline = output.pop().strip()
+ match = re.search("(Committed|Imported) revision [0-9]+.", lastline)
+ if not match:
+ logger.error("import did not succeed, while creating greek repos.")
+ logger.error("The final line from 'svn import' was:")
+ logger.error(lastline)
+ sys.exit(1)
+ output_tree = wc.State.from_commit(output)
+
+ expected_output_tree = main.greek_state.copy(main.greek_dump_dir)
+ expected_output_tree.tweak(verb='Adding',
+ contents=None)
- try:
- expected_output_tree.compare_and_display('output', output_tree)
- except tree.SVNTreeUnequal:
- verify.display_trees("ERROR: output of import command is unexpected.",
- "OUTPUT TREE",
- expected_output_tree.old_tree(),
- output_tree.old_tree())
- sys.exit(1)
+ try:
+ expected_output_tree.compare_and_display('output', output_tree)
+ except tree.SVNTreeUnequal:
+ verify.display_trees("ERROR: output of import command is unexpected.",
+ "OUTPUT TREE",
+ expected_output_tree.old_tree(),
+ output_tree.old_tree())
+ sys.exit(1)
# Finally, disallow any changes to the "pristine" repos.
error_msg = "Don't modify the pristine repository"
@@ -126,7 +129,7 @@ def setup_pristine_greek_repository():
######################################################################
-def guarantee_empty_repository(path):
+def guarantee_empty_repository(path, minor_version):
"""Guarantee that a local svn repository exists at PATH, containing
nothing."""
@@ -136,7 +139,7 @@ def guarantee_empty_repository(path):
# create an empty repository at PATH.
main.safe_rmtree(path)
- main.create_repos(path)
+ main.create_repos(path, minor_version)
# Used by every test, so that they can run independently of one
# another. Every time this routine is called, it recursively copies
@@ -153,16 +156,22 @@ def guarantee_greek_repository(path, minor_version):
# copy the pristine repository to PATH.
main.safe_rmtree(path)
- if main.copy_repos(main.pristine_greek_repos_dir, path, 1, 1, minor_version):
+ if (main.options.fsfs_version is not None):
+ failed = main.unpack_greek_repos(path)
+ else:
+ failed = main.copy_repos(main.pristine_greek_repos_dir,
+ path, 1, 1, minor_version)
+ if failed:
logger.error("copying repository failed.")
sys.exit(1)
# make the repos world-writeable, for mod_dav_svn's sake.
main.chmod_tree(path, 0666, 0666)
+ # give the repository a unique UUID
+ run_and_verify_svnadmin([], [], 'setuuid', path)
-def run_and_verify_atomic_ra_revprop_change(message,
- expected_stdout,
+def run_and_verify_atomic_ra_revprop_change(expected_stdout,
expected_stderr,
expected_exit,
url, revision, propname,
@@ -192,11 +201,11 @@ def run_and_verify_atomic_ra_revprop_change(message,
want_error)
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
-def run_and_verify_svnlook(message, expected_stdout,
+def run_and_verify_svnlook(expected_stdout,
expected_stderr, *varargs):
"""Like run_and_verify_svnlook2, but the expected exit code is
assumed to be 0 if no output is expected on stderr, and 1 otherwise."""
@@ -204,21 +213,21 @@ def run_and_verify_svnlook(message, expected_stdout,
expected_exit = 0
if expected_stderr is not None and expected_stderr != []:
expected_exit = 1
- return run_and_verify_svnlook2(message, expected_stdout, expected_stderr,
+ return run_and_verify_svnlook2(expected_stdout, expected_stderr,
expected_exit, *varargs)
-def run_and_verify_svnlook2(message, expected_stdout, expected_stderr,
+def run_and_verify_svnlook2(expected_stdout, expected_stderr,
expected_exit, *varargs):
"""Run svnlook command and check its output and exit code."""
exit_code, out, err = main.run_svnlook(*varargs)
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
-def run_and_verify_svnadmin(message, expected_stdout,
+def run_and_verify_svnadmin(expected_stdout,
expected_stderr, *varargs):
"""Like run_and_verify_svnadmin2, but the expected exit code is
assumed to be 0 if no output is expected on stderr, and 1 otherwise."""
@@ -226,21 +235,43 @@ def run_and_verify_svnadmin(message, expected_stdout,
expected_exit = 0
if expected_stderr is not None and expected_stderr != []:
expected_exit = 1
- return run_and_verify_svnadmin2(message, expected_stdout, expected_stderr,
+ return run_and_verify_svnadmin2(expected_stdout, expected_stderr,
expected_exit, *varargs)
-def run_and_verify_svnadmin2(message, expected_stdout, expected_stderr,
+def run_and_verify_svnadmin2(expected_stdout, expected_stderr,
expected_exit, *varargs):
"""Run svnadmin command and check its output and exit code."""
exit_code, out, err = main.run_svnadmin(*varargs)
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
+ return exit_code, out, err
+
+
+def run_and_verify_svnfsfs(expected_stdout,
+ expected_stderr, *varargs):
+ """Like run_and_verify_svnfsfs2, but the expected exit code is
+ assumed to be 0 if no output is expected on stderr, and 1 otherwise."""
+
+ expected_exit = 0
+ if expected_stderr is not None and expected_stderr != []:
+ expected_exit = 1
+ return run_and_verify_svnfsfs2(expected_stdout, expected_stderr,
+ expected_exit, *varargs)
+
+def run_and_verify_svnfsfs2(expected_stdout, expected_stderr,
+ expected_exit, *varargs):
+ """Run svnfsfs command and check its output and exit code."""
+
+ exit_code, out, err = main.run_svnfsfs(*varargs)
+ verify.verify_outputs("Unexpected output", out, err,
+ expected_stdout, expected_stderr)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
-def run_and_verify_svnversion(message, wc_dir, trail_url,
+def run_and_verify_svnversion(wc_dir, trail_url,
expected_stdout, expected_stderr, *varargs):
"""like run_and_verify_svnversion2, but the expected exit code is
assumed to be 0 if no output is expected on stderr, and 1 otherwise."""
@@ -248,11 +279,11 @@ def run_and_verify_svnversion(message, wc_dir, trail_url,
expected_exit = 0
if expected_stderr is not None and expected_stderr != []:
expected_exit = 1
- return run_and_verify_svnversion2(message, wc_dir, trail_url,
+ return run_and_verify_svnversion2(wc_dir, trail_url,
expected_stdout, expected_stderr,
expected_exit, *varargs)
-def run_and_verify_svnversion2(message, wc_dir, trail_url,
+def run_and_verify_svnversion2(wc_dir, trail_url,
expected_stdout, expected_stderr,
expected_exit, *varargs):
"""Run svnversion command and check its output and exit code."""
@@ -264,10 +295,10 @@ def run_and_verify_svnversion2(message, wc_dir, trail_url,
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
-def run_and_verify_svn(message, expected_stdout, expected_stderr, *varargs):
+def run_and_verify_svn(expected_stdout, expected_stderr, *varargs):
"""like run_and_verify_svn2, but the expected exit code is assumed to
be 0 if no output is expected on stderr, and 1 otherwise."""
@@ -278,10 +309,10 @@ def run_and_verify_svn(message, expected_stdout, expected_stderr, *varargs):
expected_exit = 1
elif expected_stderr != []:
expected_exit = 1
- return run_and_verify_svn2(message, expected_stdout, expected_stderr,
+ return run_and_verify_svn2(expected_stdout, expected_stderr,
expected_exit, *varargs)
-def run_and_verify_svn2(message, expected_stdout, expected_stderr,
+def run_and_verify_svn2(expected_stdout, expected_stderr,
expected_exit, *varargs):
"""Invoke main.run_svn() with *VARARGS. Return exit code as int; stdout,
stderr as lists of lines (including line terminators). For both
@@ -296,7 +327,7 @@ def run_and_verify_svn2(message, expected_stdout, expected_stderr,
- If it is already an instance of ExpectedOutput
(e.g. UnorderedOutput), leave it alone.
- ...and invoke compare_and_display_lines() on MESSAGE, a label based
+ ...and invoke compare_and_display_lines() on a label based
on the name of the stream being compared (e.g. STDOUT), the
ExpectedOutput instance, and the actual output.
@@ -318,8 +349,9 @@ def run_and_verify_svn2(message, expected_stdout, expected_stderr,
want_err = True
exit_code, out, err = main.run_svn(want_err, *varargs)
- verify.verify_outputs(message, out, err, expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_outputs("Unexpected output", out, err,
+ expected_stdout, expected_stderr)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
def run_and_verify_load(repo_dir, dump_file_content,
@@ -328,28 +360,22 @@ def run_and_verify_load(repo_dir, dump_file_content,
if not isinstance(dump_file_content, list):
raise TypeError("dump_file_content argument should have list type")
expected_stderr = []
+ args = ()
if bypass_prop_validation:
- exit_code, output, errput = main.run_command_stdin(
- main.svnadmin_binary, expected_stderr, 0, True, dump_file_content,
- 'load', '--force-uuid', '--quiet', '--bypass-prop-validation', repo_dir)
- else:
- exit_code, output, errput = main.run_command_stdin(
- main.svnadmin_binary, expected_stderr, 0, True, dump_file_content,
- 'load', '--force-uuid', '--quiet', repo_dir)
-
- verify.verify_outputs("Unexpected stderr output", None, errput,
- None, expected_stderr)
+ args += ('--bypass-prop-validation',)
+ main.run_command_stdin(
+ main.svnadmin_binary, expected_stderr, 0, True, dump_file_content,
+ 'load', '--force-uuid', '--quiet', repo_dir, *args)
def run_and_verify_dump(repo_dir, deltas=False):
"Runs 'svnadmin dump' and reports any errors, returning the dump content."
+ args = ()
if deltas:
- exit_code, output, errput = main.run_svnadmin('dump', '--deltas',
- repo_dir)
- else:
- exit_code, output, errput = main.run_svnadmin('dump', repo_dir)
- verify.verify_outputs("Missing expected output(s)", output, errput,
- verify.AnyOutput, verify.AnyOutput)
+ args += ('--deltas',)
+ exit_code, output, errput = run_and_verify_svnadmin(
+ verify.AnyOutput, [],
+ 'dump', '--quiet', repo_dir, *args)
return output
@@ -364,6 +390,8 @@ def run_and_verify_svnrdump(dumpfile_content, expected_stdout,
if sys.platform == 'win32':
err = map(lambda x : x.replace('\r\n', '\n'), err)
+ # Ignore "consider upgrade" warnings to allow regression tests to pass
+ # when run against a 1.6 mod_dav_svn.
for index, line in enumerate(err[:]):
if re.search("warning: W200007", line):
del err[index]
@@ -374,29 +402,57 @@ def run_and_verify_svnrdump(dumpfile_content, expected_stdout,
return output
-def run_and_verify_svnmucc(message, expected_stdout, expected_stderr,
+def run_and_verify_svnmucc(expected_stdout, expected_stderr,
*varargs):
"""Run svnmucc command and check its output"""
expected_exit = 0
if expected_stderr is not None and expected_stderr != []:
expected_exit = 1
- return run_and_verify_svnmucc2(message, expected_stdout, expected_stderr,
+ return run_and_verify_svnmucc2(expected_stdout, expected_stderr,
expected_exit, *varargs)
-def run_and_verify_svnmucc2(message, expected_stdout, expected_stderr,
+def run_and_verify_svnmucc2(expected_stdout, expected_stderr,
expected_exit, *varargs):
"""Run svnmucc command and check its output and exit code."""
exit_code, out, err = main.run_svnmucc(*varargs)
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
+ return exit_code, out, err
+
+
+def run_and_verify_svnsync(expected_stdout, expected_stderr,
+ *varargs):
+ """Run svnsync command and check its output"""
+
+ expected_exit = 0
+ if expected_stderr is not None and expected_stderr != []:
+ expected_exit = 1
+ return run_and_verify_svnsync2(expected_stdout, expected_stderr,
+ expected_exit, *varargs)
+
+def run_and_verify_svnsync2(expected_stdout, expected_stderr,
+ expected_exit, *varargs):
+ """Run svnmucc command and check its output and exit code."""
+
+ exit_code, out, err = main.run_svnsync(*varargs)
+
+ # Ignore "consider upgrade" warnings to allow regression tests to pass
+ # when run against a 1.6 mod_dav_svn.
+ for index, line in enumerate(err[:]):
+ if re.search("warning: W200007", line):
+ del err[index]
+
+ verify.verify_outputs("Unexpected output", out, err,
+ expected_stdout, expected_stderr)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
def load_repo(sbox, dumpfile_path = None, dump_str = None,
- bypass_prop_validation = False):
+ bypass_prop_validation = False,create_wc=True):
"Loads the dumpfile into sbox"
if not dump_str:
dump_str = open(dumpfile_path, "rb").read()
@@ -409,7 +465,8 @@ def load_repo(sbox, dumpfile_path = None, dump_str = None,
# Load the mergetracking dumpfile into the repos, and check it out the repo
run_and_verify_load(sbox.repo_dir, dump_str.splitlines(True),
bypass_prop_validation)
- run_and_verify_svn(None, None, [], "co", sbox.repo_url, sbox.wc_dir)
+ if create_wc:
+ run_and_verify_svn(None, [], "co", sbox.repo_url, sbox.wc_dir)
return dump_str
@@ -421,7 +478,7 @@ def expected_noop_update_output(rev):
% (rev),
"no-op update")
-def run_and_verify_svnauthz(message, expected_stdout, expected_stderr,
+def run_and_verify_svnauthz(expected_stdout, expected_stderr,
expected_exit, compat_mode, *varargs):
"""Run svnauthz command and check its output and exit code.
If COMPAT_MODE is True then run the command in pre-1.8
@@ -434,7 +491,7 @@ def run_and_verify_svnauthz(message, expected_stdout, expected_stderr,
verify.verify_outputs("Unexpected output", out, err,
expected_stdout, expected_stderr)
- verify.verify_exit_code(message, exit_code, expected_exit)
+ verify.verify_exit_code("Unexpected return code", exit_code, expected_exit)
return exit_code, out, err
######################################################################
@@ -446,13 +503,9 @@ def run_and_verify_svnauthz(message, expected_stdout, expected_stderr,
#
-def run_and_verify_checkout2(do_remove,
- URL, wc_dir_name, output_tree, disk_tree,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None,
- *args):
+def run_and_verify_checkout(URL, wc_dir_name, output_tree, disk_tree,
+ expected_stderr=[],
+ *args, **kw):
"""Checkout the URL into a new directory WC_DIR_NAME. *ARGS are any
extra optional args to the checkout subcommand.
@@ -469,17 +522,12 @@ def run_and_verify_checkout2(do_remove,
if isinstance(output_tree, wc.State):
output_tree = output_tree.old_tree()
- # Remove dir if it's already there, unless this is a forced checkout.
- # In that case assume we want to test a forced checkout's toleration
- # of obstructing paths.
- if do_remove:
- main.safe_rmtree(wc_dir_name)
-
# Checkout and make a tree of the output, using l:foo/p:bar
### todo: svn should not be prompting for auth info when using
### repositories with no auth/auth requirements
- exit_code, output, errput = main.run_svn(None, 'co',
- URL, wc_dir_name, *args)
+ exit_code, output, errput = run_and_verify_svn(None, expected_stderr,
+ 'co', URL, wc_dir_name,
+ *args)
actual = tree.build_tree_from_checkout(output)
# Verify actual output against expected output.
@@ -490,32 +538,7 @@ def run_and_verify_checkout2(do_remove,
raise
if disk_tree:
- verify_disk(wc_dir_name, disk_tree, False,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton)
-
-def run_and_verify_checkout(URL, wc_dir_name, output_tree, disk_tree,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None,
- *args):
- """Same as run_and_verify_checkout2(), but without the DO_REMOVE arg.
- WC_DIR_NAME is deleted if present unless the '--force' option is passed
- in *ARGS."""
-
-
- # Remove dir if it's already there, unless this is a forced checkout.
- # In that case assume we want to test a forced checkout's toleration
- # of obstructing paths.
- return run_and_verify_checkout2(('--force' not in args),
- URL, wc_dir_name, output_tree, disk_tree,
- singleton_handler_a,
- a_baton,
- singleton_handler_b,
- b_baton,
- *args)
-
+ verify_disk(wc_dir_name, disk_tree, False, **kw)
def run_and_verify_export(URL, export_dir_name, output_tree, disk_tree,
*args):
@@ -561,8 +584,13 @@ def run_and_verify_export(URL, export_dir_name, output_tree, disk_tree,
# run_and_verify_log_xml
class LogEntry:
- def __init__(self, revision, changed_paths=None, revprops=None):
+ def __init__(self, revision, attributes=None,
+ changed_paths=None, revprops=None):
self.revision = revision
+ if attributes == None:
+ self.attributes = {}
+ else:
+ self.attributes = attributes
if changed_paths == None:
self.changed_paths = {}
else:
@@ -572,6 +600,15 @@ class LogEntry:
else:
self.revprops = revprops
+ def assert_log_attrs(self, attributes):
+ """Assert that attributes is the same as this entry's attributes
+ Raises svntest.Failure if not.
+ """
+ if self.attributes != attributes:
+ raise Failure('\n' + '\n'.join(difflib.ndiff(
+ pprint.pformat(attributes).splitlines(),
+ pprint.pformat(self.attributes).splitlines())))
+
def assert_changed_paths(self, changed_paths):
"""Assert that changed_paths is the same as this entry's changed_paths
Raises svntest.Failure if not.
@@ -649,7 +686,7 @@ class LogParser:
# element handlers
def logentry_start(self, attrs):
- self.entries.append(LogEntry(int(attrs['revision'])))
+ self.entries.append(LogEntry(int(attrs['revision']), attrs))
def author_end(self):
self.svn_prop('author')
def msg_end(self):
@@ -669,16 +706,19 @@ class LogParser:
self.entries[-1].changed_paths[self.use_cdata()] = [{'kind': self.kind,
'action': self.action}]
-def run_and_verify_log_xml(message=None, expected_paths=None,
- expected_revprops=None, expected_stdout=None,
- expected_stderr=None, args=[]):
+def run_and_verify_log_xml(expected_log_attrs=None,
+ expected_paths=None, expected_revprops=None,
+ expected_stdout=None, expected_stderr=None,
+ args=[]):
"""Call run_and_verify_svn with log --xml and args (optional) as command
- arguments, and pass along message, expected_stdout, and expected_stderr.
-
- If message is None, pass the svn log command as message.
+ arguments, and pass along expected_stdout, and expected_stderr.
expected_paths checking is not yet implemented.
+ expected_log_attrs is an optional list of dicts, compared to each revisions's
+ logentry attributes. The list must be in the same order the log entries
+ come in.
+
expected_revprops is an optional list of dicts, compared to each
revision's revprops. The list must be in the same order the log entries
come in. Any svn:date revprops in the dicts must be '' in order to
@@ -687,8 +727,7 @@ def run_and_verify_log_xml(message=None, expected_paths=None,
expected_paths and expected_revprops are ignored if expected_stdout or
expected_stderr is specified.
"""
- if message == None:
- message = ' '.join(args)
+ message = ' '.join(args)
# We'll parse the output unless the caller specifies expected_stderr or
# expected_stdout for run_and_verify_svn.
@@ -705,7 +744,7 @@ def run_and_verify_log_xml(message=None, expected_paths=None,
log_args.append('-v')
(exit_code, stdout, stderr) = run_and_verify_svn(
- message, expected_stdout, expected_stderr,
+ expected_stdout, expected_stderr,
'log', '--xml', *log_args)
if not parse:
return
@@ -717,6 +756,8 @@ def run_and_verify_log_xml(message=None, expected_paths=None,
entry.assert_revprops(expected_revprops[index])
if expected_paths != None:
entry.assert_changed_paths(expected_paths[index])
+ if expected_log_attrs != None:
+ entry.assert_log_attrs(expected_log_attrs[index])
def verify_update(actual_output,
@@ -728,11 +769,8 @@ def verify_update(actual_output,
elision_output_tree,
disk_tree,
status_tree,
- singleton_handler_a=None,
- a_baton=None,
- singleton_handler_b=None,
- b_baton=None,
- check_props=False):
+ check_props=False,
+ extra_files=None):
"""Verify update of WC_DIR_NAME.
The subcommand output (found in ACTUAL_OUTPUT, ACTUAL_MERGEINFO_OUTPUT,
@@ -795,8 +833,7 @@ def verify_update(actual_output,
# Create a tree by scanning the working copy, and verify it
if disk_tree:
verify_disk(wc_dir_name, disk_tree, check_props,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton)
+ extra_files=extra_files)
# Verify via 'status' command too, if possible.
if status_tree:
@@ -804,12 +841,22 @@ def verify_update(actual_output,
def verify_disk(wc_dir_name, disk_tree, check_props=False,
- singleton_handler_a = None, a_baton = None,
- singleton_handler_b = None, b_baton = None):
+ extra_files=None):
"""Verify WC_DIR_NAME against DISK_TREE. If CHECK_PROPS is set,
the comparison will examin props. Returns if successful, raises on
failure."""
+ singleton_handler_a = None
+ a_baton = None,
+ singleton_handler_b = None
+ b_baton = None
+ done_a = None
+
+ if extra_files:
+ singleton_handler_a = svntest.tree.detect_conflict_files
+ done_a = svntest.tree.detect_conflict_files_done
+ a_baton = extra_files
+
if isinstance(disk_tree, wc.State):
disk_tree = disk_tree.old_tree()
@@ -823,18 +870,15 @@ def verify_disk(wc_dir_name, disk_tree, check_props=False,
_log_tree_state("ACTUAL DISK TREE:", actual_disk)
raise
-
+ if done_a:
+ done_a(a_baton)
def run_and_verify_update(wc_dir_name,
output_tree, disk_tree, status_tree,
- error_re_string = None,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None,
+ expected_stderr=[],
check_props = False,
- *args):
+ *args, **kw):
"""Update WC_DIR_NAME. *ARGS are any extra optional args to the
update subcommand. NOTE: If *ARGS is specified at all, explicit
@@ -852,38 +896,20 @@ def run_and_verify_update(wc_dir_name,
None, the 'svn status' output will be verified against STATUS_TREE.
(This is a good way to check that revision numbers were bumped.)
- For the DISK_TREE verification, SINGLETON_HANDLER_A and
- SINGLETON_HANDLER_B will be passed to tree.compare_trees -- see that
- function's doc string for more details.
-
If CHECK_PROPS is set, then disk comparison will examine props.
Return if successful, raise on failure."""
# Update and make a tree of the output.
- if len(args):
- exit_code, output, errput = main.run_svn(error_re_string, 'up', *args)
- else:
- exit_code, output, errput = main.run_svn(error_re_string,
- 'up', wc_dir_name,
- *args)
+ if len(args) == 0:
+ args = (wc_dir_name,)
- if error_re_string:
- rm = re.compile(error_re_string)
- match = None
- for line in errput:
- match = rm.search(line)
- if match:
- break
- if not match:
- raise main.SVNUnmatchedError
+ exit_code, output, errput = run_and_verify_svn(None, expected_stderr, 'up', *args)
actual = wc.State.from_checkout(output)
verify_update(actual, None, None, wc_dir_name,
output_tree, None, None, disk_tree, status_tree,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton,
- check_props)
+ check_props, **kw)
def run_and_parse_info(*args):
@@ -967,19 +993,20 @@ def run_and_verify_info(expected_infos, *args):
for actual, expected in zip(actual_infos, expected_infos):
# compare dicts
+ path = actual['Path']
for key, value in expected.items():
assert ':' not in key # caller passed impossible expectations?
if value is None and key in actual:
- raise main.SVNLineUnequal("Found unexpected key '%s' with value '%s'"
- % (key, actual[key]))
+ raise main.SVNLineUnequal("On '%s': Found unexpected key '%s'\n Value '%s'"
+ % (path, key, actual[key]))
if value is not None and key not in actual:
- raise main.SVNLineUnequal("Expected key '%s' (with value '%s') "
- "not found" % (key, value))
+ raise main.SVNLineUnequal("On '%s': Expected key '%s' not found\n Expected value '%s'"
+ % (path, key, value))
if value is not None and not re.match(value, actual[key]):
- raise verify.SVNUnexpectedStdout("Values of key '%s' don't match:\n"
+ raise verify.SVNUnexpectedStdout("On '%s': Values of key '%s' don't match:\n"
" Expected: '%s' (regex)\n"
" Found: '%s' (string)\n"
- % (key, value, actual[key]))
+ % (path, key, value, actual[key]))
except:
sys.stderr.write("Bad 'svn info' output:\n"
@@ -993,25 +1020,16 @@ def run_and_verify_merge(dir, rev1, rev2, url1, url2,
mergeinfo_output_tree,
elision_output_tree,
disk_tree, status_tree, skip_tree,
- error_re_string = None,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None,
+ expected_stderr = [],
check_props = False,
dry_run = True,
- *args):
+ *args, **kw):
"""Run 'svn merge URL1@REV1 URL2@REV2 DIR' if URL2 is not None
(for a three-way merge between URLs and WC).
If URL2 is None, run 'svn merge -rREV1:REV2 URL1 DIR'. If both REV1
and REV2 are None, leave off the '-r' argument.
- If ERROR_RE_STRING, the merge must exit with error, and the error
- message must match regular expression ERROR_RE_STRING.
-
- Else if ERROR_RE_STRING is None, then:
-
The subcommand output will be verified against OUTPUT_TREE. Output
related to mergeinfo notifications will be verified against
MERGEINFO_OUTPUT_TREE if that is not None. Output related to mergeinfo
@@ -1051,8 +1069,8 @@ def run_and_verify_merge(dir, rev1, rev2, url1, url2,
pre_disk = tree.build_tree_from_wc(dir)
dry_run_command = merge_command + ('--dry-run',)
dry_run_command = dry_run_command + args
- exit_code, out_dry, err_dry = main.run_svn(error_re_string,
- *dry_run_command)
+ exit_code, out_dry, err_dry = run_and_verify_svn(None, expected_stderr,
+ *dry_run_command)
post_disk = tree.build_tree_from_wc(dir)
try:
tree.compare_trees("disk", post_disk, pre_disk)
@@ -1065,16 +1083,7 @@ def run_and_verify_merge(dir, rev1, rev2, url1, url2,
# Update and make a tree of the output.
merge_command = merge_command + args
- exit_code, out, err = main.run_svn(error_re_string, *merge_command)
-
- if error_re_string:
- if not error_re_string.startswith(".*"):
- error_re_string = ".*(" + error_re_string + ")"
- expected_err = verify.RegexOutput(error_re_string, match_all=False)
- verify.verify_outputs(None, None, err, None, expected_err)
- return
- elif err:
- raise verify.SVNUnexpectedStderr(err)
+ exit_code, out, err = run_and_verify_svn(None, expected_stderr, *merge_command)
# Split the output into that related to application of the actual diff
# and that related to the recording of mergeinfo describing the merge.
@@ -1163,9 +1172,7 @@ def run_and_verify_merge(dir, rev1, rev2, url1, url2,
verify_update(actual_diff, actual_mergeinfo, actual_elision, dir,
output_tree, mergeinfo_output_tree, elision_output_tree,
disk_tree, status_tree,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton,
- check_props)
+ check_props, **kw)
def run_and_verify_patch(dir, patch_path,
@@ -1173,7 +1180,7 @@ def run_and_verify_patch(dir, patch_path,
error_re_string=None,
check_props=False,
dry_run=True,
- *args):
+ *args, **kw):
"""Run 'svn patch patch_path DIR'.
If ERROR_RE_STRING, 'svn patch' must exit with error, and the error
@@ -1265,7 +1272,7 @@ def run_and_verify_patch(dir, patch_path,
verify_update(mytree, None, None, dir,
output_tree, None, None, disk_tree, status_tree,
- check_props=check_props)
+ check_props=check_props, **kw)
def run_and_verify_mergeinfo(error_re_string = None,
@@ -1308,54 +1315,31 @@ def run_and_verify_switch(wc_dir_name,
wc_target,
switch_url,
output_tree, disk_tree, status_tree,
- error_re_string = None,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None,
+ expected_stderr = [],
check_props = False,
- *args):
+ *args, **kw):
"""Switch WC_TARGET (in working copy dir WC_DIR_NAME) to SWITCH_URL.
- If ERROR_RE_STRING, the switch must exit with error, and the error
- message must match regular expression ERROR_RE_STRING.
-
- Else if ERROR_RE_STRING is None, then:
-
The subcommand output will be verified against OUTPUT_TREE, and the
working copy itself will be verified against DISK_TREE. If optional
STATUS_TREE is given, then 'svn status' output will be
compared. (This is a good way to check that revision numbers were
bumped.)
- For the DISK_TREE verification, SINGLETON_HANDLER_A and
- SINGLETON_HANDLER_B will be passed to tree.compare_trees -- see that
- function's doc string for more details.
-
If CHECK_PROPS is set, then disk comparison will examine props.
Return if successful, raise on failure."""
# Update and make a tree of the output.
- exit_code, output, errput = main.run_svn(error_re_string, 'switch',
- switch_url, wc_target, *args)
-
- if error_re_string:
- if not error_re_string.startswith(".*"):
- error_re_string = ".*(" + error_re_string + ")"
- expected_err = verify.RegexOutput(error_re_string, match_all=False)
- verify.verify_outputs(None, None, errput, None, expected_err)
- elif errput:
- raise verify.SVNUnexpectedStderr(err)
-
+ exit_code, output, errput = run_and_verify_svn(None, expected_stderr,
+ 'switch', switch_url,
+ wc_target, *args)
actual = wc.State.from_checkout(output)
verify_update(actual, None, None, wc_dir_name,
output_tree, None, None, disk_tree, status_tree,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton,
- check_props)
+ check_props, **kw)
def process_output_for_commit(output, error_re_string):
"""Helper for run_and_verify_commit(), also used in the factory."""
@@ -1403,7 +1387,7 @@ def process_output_for_commit(output, error_re_string):
def run_and_verify_commit(wc_dir_name, output_tree, status_tree,
- error_re_string = None,
+ expected_stderr=[],
*args):
"""Commit and verify results within working copy WC_DIR_NAME,
sending ARGS to the commit subcommand.
@@ -1413,9 +1397,7 @@ def run_and_verify_commit(wc_dir_name, output_tree, status_tree,
be compared. (This is a good way to check that revision numbers
were bumped.)
- If ERROR_RE_STRING is None, the commit must not exit with error. If
- ERROR_RE_STRING is a string, the commit must exit with error, and
- the error message must match regular expression ERROR_RE_STRING.
+ EXPECTED_STDERR is handled as in run_and_verify_svn()
Return if successful, raise on failure."""
@@ -1423,21 +1405,15 @@ def run_and_verify_commit(wc_dir_name, output_tree, status_tree,
output_tree = output_tree.old_tree()
# Commit.
+ if len(args) == 0:
+ args = (wc_dir_name,)
if '-m' not in args and '-F' not in args:
args = list(args) + ['-m', 'log msg']
- exit_code, output, errput = main.run_svn(error_re_string, 'ci',
- *args)
-
- if error_re_string:
- if not error_re_string.startswith(".*"):
- error_re_string = ".*(" + error_re_string + ")"
- expected_err = verify.RegexOutput(error_re_string, match_all=False)
- verify.verify_outputs(None, None, errput, None, expected_err)
-
- # Else not expecting error:
+ exit_code, output, errput = run_and_verify_svn(None, expected_stderr,
+ 'ci', *args)
# Convert the output into a tree.
- output = process_output_for_commit(output, error_re_string)
+ output = process_output_for_commit(output, expected_stderr)
actual = tree.build_tree_from_commit(output)
# Verify actual output against expected output.
@@ -1457,53 +1433,43 @@ def run_and_verify_commit(wc_dir_name, output_tree, status_tree,
# This function always passes '-q' to the status command, which
# suppresses the printing of any unversioned or nonexistent items.
-def run_and_verify_status(wc_dir_name, status_tree,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None):
+def run_and_verify_status(wc_dir_name, status_tree, no_entries=False):
"""Run 'status' on WC_DIR_NAME and compare it with the
- expected STATUS_TREE. SINGLETON_HANDLER_A and SINGLETON_HANDLER_B will
- be passed to tree.compare_trees - see that function's doc string for
- more details.
+ expected STATUS_TREE.
Returns on success, raises on failure."""
+ if not isinstance(status_tree, wc.State):
+ raise TypeError('wc.State tree expected')
+
exit_code, output, errput = main.run_svn(None, 'status', '-v', '-u', '-q',
wc_dir_name)
- actual_status = svntest.wc.State.from_status(output)
+ actual_status = svntest.wc.State.from_status(output, wc_dir=wc_dir_name)
# Verify actual output against expected output.
- if isinstance(status_tree, wc.State):
- try:
- status_tree.compare_and_display('status', actual_status)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL STATUS TREE:", actual_status.old_tree(),
- wc_dir_name)
- raise
- else:
- actual_status = actual_status.old_tree()
- try:
- tree.compare_trees("status", actual_status, status_tree,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton)
- except tree.SVNTreeError:
- verify.display_trees(None, 'STATUS OUTPUT TREE', status_tree, actual_status)
- _log_tree_state("ACTUAL STATUS TREE:", actual_status, wc_dir_name)
- raise
+ try:
+ status_tree.compare_and_display('status', actual_status)
+ except tree.SVNTreeError:
+ _log_tree_state("ACTUAL STATUS TREE:", actual_status.old_tree(),
+ wc_dir_name)
+ raise
+
+ if no_entries:
+ return
# if we have an output State, and we can/are-allowed to create an
# entries-based State, then compare the two.
- if isinstance(status_tree, wc.State):
- actual_entries = wc.State.from_entries(wc_dir_name)
- if actual_entries:
- tweaked = status_tree.copy()
- tweaked.tweak_for_entries_compare()
- try:
- tweaked.compare_and_display('entries', actual_entries)
- except tree.SVNTreeUnequal:
- ### do something more
- raise
+ actual_entries = wc.State.from_entries(wc_dir_name)
+ if actual_entries:
+ tweaked = status_tree.copy()
+ tweaked.tweak_for_entries_compare()
+ try:
+ tweaked.compare_and_display('entries', actual_entries)
+ except tree.SVNTreeUnequal:
+ ### do something more
+ _log_tree_state("ACTUAL ENTRY TREE:", actual_entries.old_tree(),
+ wc_dir_name)
+ raise
# A variant of previous func, but doesn't pass '-q'. This allows us
@@ -1513,27 +1479,21 @@ def run_and_verify_unquiet_status(wc_dir_name, status_tree):
expected STATUS_TREE.
Returns on success, raises on failure."""
+ if not isinstance(status_tree, wc.State):
+ raise TypeError('wc.State tree expected')
+
exit_code, output, errput = main.run_svn(None, 'status', '-v',
'-u', wc_dir_name)
- actual_status = svntest.wc.State.from_status(output)
+ actual_status = svntest.wc.State.from_status(output, wc_dir=wc_dir_name)
# Verify actual output against expected output.
- if isinstance(status_tree, wc.State):
- try:
- status_tree.compare_and_display('unquiet status', actual_status)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL STATUS TREE:",
- actual_status.normalize().old_tree(), wc_dir_name)
- raise
- else:
- actual_status = actual_status.old_tree()
- try:
- tree.compare_trees("UNQUIET STATUS", actual_status, status_tree)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL UNQUIET STATUS TREE:", actual_status,
- wc_dir_name)
- raise
+ try:
+ status_tree.compare_and_display('unquiet status', actual_status)
+ except tree.SVNTreeError:
+ _log_tree_state("ACTUAL STATUS TREE:",
+ actual_status.normalize().old_tree(), wc_dir_name)
+ raise
def run_and_verify_status_xml(expected_entries = [],
*args):
@@ -1542,7 +1502,7 @@ def run_and_verify_status_xml(expected_entries = [],
EXPECTED_ENTRIES.
"""
- exit_code, output, errput = run_and_verify_svn(None, None, [],
+ exit_code, output, errput = run_and_verify_svn(None, [],
'status', '--xml', *args)
if len(errput) > 0:
@@ -1614,11 +1574,11 @@ def run_and_verify_inherited_prop_xml(path_or_url,
if (propname):
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'propget', propname, '--xml',
+ None, [], 'propget', propname, '--xml',
'--show-inherited-props', path_or_url, *args)
else:
exit_code, output, errput = svntest.actions.run_and_verify_svn(
- None, None, [], 'proplist', '-v', '--xml', '--show-inherited-props',
+ None, [], 'proplist', '-v', '--xml', '--show-inherited-props',
path_or_url, *args)
if len(errput) > 0:
@@ -1691,7 +1651,7 @@ def run_and_verify_diff_summarize_xml(error_re_string = [],
EXPECTED_PROPS and EXPECTED_KINDS. Returns on success, raises
on failure."""
- exit_code, output, errput = run_and_verify_svn(None, None, error_re_string,
+ exit_code, output, errput = run_and_verify_svn(None, error_re_string,
'diff', '--summarize',
'--xml', *args)
@@ -1775,12 +1735,12 @@ def run_and_validate_lock(path, username):
comment = "Locking path:%s." % path
# lock the path
- run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ run_and_verify_svn(".*locked by user", [], 'lock',
'--username', username,
'-m', comment, path)
# Run info and check that we get the lock fields.
- exit_code, output, err = run_and_verify_svn(None, None, [],
+ exit_code, output, err = run_and_verify_svn(None, [],
'info','-R',
path)
@@ -1818,7 +1778,7 @@ def _run_and_verify_resolve(cmd, expected_paths, *args):
expected_paths]),
],
match_all=False)
- run_and_verify_svn(None, expected_output, [],
+ run_and_verify_svn(expected_output, [],
cmd, *args)
def run_and_verify_resolve(expected_paths, *args):
@@ -1842,7 +1802,7 @@ def run_and_verify_revert(expected_paths, *args):
expected_output = verify.UnorderedOutput([
"Reverted '" + path + "'\n" for path in
expected_paths])
- run_and_verify_svn(None, expected_output, [],
+ run_and_verify_svn(expected_output, [],
"revert", *args)
@@ -1851,32 +1811,44 @@ def run_and_verify_revert(expected_paths, *args):
# This allows a test to *quickly* bootstrap itself.
-def make_repo_and_wc(sbox, create_wc = True, read_only = False,
- minor_version = None):
- """Create a fresh 'Greek Tree' repository and check out a WC from it.
+def make_repo_and_wc(sbox, create_wc=True, read_only=False, empty=False,
+ minor_version=None):
+ """Create a fresh repository and check out a WC from it. If EMPTY is
+ True, the repository and WC will be empty and at revision 0,
+ otherwise they will contain the 'Greek Tree' at revision 1.
If READ_ONLY is False, a dedicated repository will be created, at the path
- SBOX.repo_dir. If READ_ONLY is True, the pristine repository will be used.
+ SBOX.repo_dir. If READ_ONLY is True, a shared pristine repository may be
+ used or a dedicated repository may be created. (Currently we use a shared
+ pristine 'Greek tree' repo but we create a dedicated empty repo.)
In either case, SBOX.repo_url is assumed to point to the repository that
will be used.
- If create_wc is True, a dedicated working copy will be checked out from
+ If CREATE_WC is True, a dedicated working copy will be checked out from
the repository, at the path SBOX.wc_dir.
Returns on success, raises on failure."""
- # Create (or copy afresh) a new repos with a greek tree in it.
- if not read_only:
- guarantee_greek_repository(sbox.repo_dir, minor_version)
+ # Create or copy or reference the appropriate kind of repository:
+ # if we want a non-empty, Greek repo, refer to the shared one; else
+ # if we want an empty repo or a writable Greek repo, create one.
+ # (We could have a shared empty repo for read-only use, but we don't.)
+ if empty:
+ guarantee_empty_repository(sbox.repo_dir, minor_version)
+ expected_state = svntest.wc.State('', {})
+ else:
+ if not read_only:
+ guarantee_greek_repository(sbox.repo_dir, minor_version)
+ expected_state = main.greek_state
if create_wc:
# Generate the expected output tree.
- expected_output = main.greek_state.copy()
+ expected_output = expected_state.copy()
expected_output.wc_dir = sbox.wc_dir
expected_output.tweak(status='A ', contents=None)
# Generate an expected wc tree.
- expected_wc = main.greek_state
+ expected_wc = expected_state
# Do a checkout, and verify the resulting output and disk contents.
run_and_verify_checkout(sbox.repo_url,
@@ -1916,11 +1888,11 @@ def get_virginal_state(wc_dir, rev):
return state
# Cheap administrative directory locking
-def lock_admin_dir(wc_dir, recursive=False):
+def lock_admin_dir(wc_dir, recursive=False, work_queue=False):
"Lock a SVN administrative directory"
db, root_path, relpath = wc.open_wc_db(wc_dir)
- svntest.main.run_wc_lock_tester(recursive, wc_dir)
+ svntest.main.run_wc_lock_tester(recursive, wc_dir, work_queue)
def set_incomplete(wc_dir, revision):
"Make wc_dir incomplete at revision"
@@ -2101,7 +2073,7 @@ def inject_conflict_into_wc(sbox, state_path, file_path,
if expected_status:
expected_status.tweak(state_path, wc_rev=merged_rev)
run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, file_path)
+ [], file_path)
# Backdate the file.
exit_code, output, errput = main.run_svn(None, "up", "-r", str(prev_rev),
@@ -2122,7 +2094,7 @@ def inject_conflict_into_wc(sbox, state_path, file_path,
inject_conflict_into_expected_state(state_path,
expected_disk, expected_status,
conflicting_contents, contents,
- merged_rev)
+ prev_rev, merged_rev)
exit_code, output, errput = main.run_svn(None, "up", "-r", str(merged_rev),
file_path)
if expected_status:
@@ -2130,26 +2102,30 @@ def inject_conflict_into_wc(sbox, state_path, file_path,
def inject_conflict_into_expected_state(state_path,
expected_disk, expected_status,
- wc_text, merged_text, merged_rev):
+ wc_text, merged_text, prev_rev,
+ merged_rev):
"""Update the EXPECTED_DISK and EXPECTED_STATUS trees for the
conflict at STATE_PATH (ignored if None). WC_TEXT, MERGED_TEXT, and
MERGED_REV are used to determine the contents of the conflict (the
text parameters should be newline-terminated)."""
if expected_disk:
conflict_marker = make_conflict_marker_text(wc_text, merged_text,
- merged_rev)
+ prev_rev, merged_rev)
existing_text = expected_disk.desc[state_path].contents or ""
expected_disk.tweak(state_path, contents=existing_text + conflict_marker)
if expected_status:
expected_status.tweak(state_path, status='C ')
-def make_conflict_marker_text(wc_text, merged_text, merged_rev):
+def make_conflict_marker_text(wc_text, merged_text, prev_rev, merged_rev,
+ old_text=''):
"""Return the conflict marker text described by WC_TEXT (the current
text in the working copy, MERGED_TEXT (the conflicting text merged
in), and MERGED_REV (the revision from whence the conflicting text
came)."""
- return "<<<<<<< .working\n" + wc_text + "=======\n" + \
+ return "<<<<<<< .working\n" + wc_text + \
+ "||||||| .merge-left.r" + str(prev_rev) + '\n' + \
+ old_text + "=======\n" + \
merged_text + ">>>>>>> .merge-right.r" + str(merged_rev) + "\n"
@@ -2201,7 +2177,7 @@ def build_greek_tree_conflicts(sbox):
expected_status = get_virginal_state(wc_dir, 1)
expected_status.tweak('A/D/G/pi', wc_rev='2')
expected_status.remove('A/D/G/rho', 'A/D/G/tau')
- run_and_verify_commit(wc_dir, expected_output, expected_status, None,
+ run_and_verify_commit(wc_dir, expected_output, expected_status, [],
'-m', 'Incoming changes.', wc_dir )
# Update back to the pristine state ("time-warp").
@@ -2213,7 +2189,7 @@ def build_greek_tree_conflicts(sbox):
expected_disk = main.greek_state
expected_status = get_virginal_state(wc_dir, 1)
run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False,
+ expected_status, [], False,
'-r', '1', wc_dir)
# Make local changes
@@ -2224,6 +2200,6 @@ def build_greek_tree_conflicts(sbox):
# Update, receiving the incoming changes on top of the local changes,
# causing tree conflicts. Don't check for any particular result: that is
# the job of other tests.
- run_and_verify_svn(None, verify.AnyOutput, [], 'update', wc_dir)
+ run_and_verify_svn(verify.AnyOutput, [], 'update', wc_dir)
diff --git a/subversion/tests/cmdline/svntest/deeptrees.py b/subversion/tests/cmdline/svntest/deeptrees.py
index 52517a2..a40729c 100644
--- a/subversion/tests/cmdline/svntest/deeptrees.py
+++ b/subversion/tests/cmdline/svntest/deeptrees.py
@@ -123,13 +123,13 @@ def deep_trees_leaf_edit(base):
main.file_append(F, "More text for file alpha.\n")
main.file_append(DF, "More text for file beta.\n")
main.file_append(DDF, "More text for file gamma.\n")
- run_and_verify_svn(None, verify.AnyOutput, [],
+ run_and_verify_svn(verify.AnyOutput, [],
'propset', 'prop1', '1', F, DF, DDF)
D = j(base, 'D', 'D1')
DD = j(base, 'DD', 'D1', 'D2')
DDD = j(base, 'DDD', 'D1', 'D2', 'D3')
- run_and_verify_svn(None, verify.AnyOutput, [],
+ run_and_verify_svn(verify.AnyOutput, [],
'propset', 'prop1', '1', D, DD, DDD)
D = j(base, 'D', 'D1', 'delta')
DD = j(base, 'DD', 'D1', 'D2', 'epsilon')
@@ -137,7 +137,7 @@ def deep_trees_leaf_edit(base):
main.file_append(D, "This is the file 'delta'.\n")
main.file_append(DD, "This is the file 'epsilon'.\n")
main.file_append(DDD, "This is the file 'zeta'.\n")
- run_and_verify_svn(None, verify.AnyOutput, [],
+ run_and_verify_svn(verify.AnyOutput, [],
'add', D, DD, DDD)
# deep trees state after a call to deep_trees_leaf_edit
@@ -196,11 +196,7 @@ deep_trees_after_leaf_del = wc.State('', {
# deep trees state after a call to deep_trees_leaf_del with no commit
def deep_trees_after_leaf_del_no_ci(wc_dir):
- if svntest.main.wc_is_singledb(wc_dir):
- return deep_trees_after_leaf_del
- else:
- return deep_trees_empty_dirs
-
+ return deep_trees_after_leaf_del
def deep_trees_tree_del(base):
"""Helper function for deep trees test cases. Delete top-level dirs."""
@@ -240,31 +236,9 @@ deep_trees_after_tree_del = wc.State('', {
'DDD' : Item(),
})
-# deep trees state without any files
-deep_trees_empty_dirs = wc.State('', {
- 'F' : Item(),
- 'D' : Item(),
- 'D/D1' : Item(),
- 'DF' : Item(),
- 'DF/D1' : Item(),
- 'DD' : Item(),
- 'DD/D1' : Item(),
- 'DD/D1/D2' : Item(),
- 'DDF' : Item(),
- 'DDF/D1' : Item(),
- 'DDF/D1/D2' : Item(),
- 'DDD' : Item(),
- 'DDD/D1' : Item(),
- 'DDD/D1/D2' : Item(),
- 'DDD/D1/D2/D3' : Item(),
- })
-
# deep trees state after a call to deep_trees_tree_del with no commit
def deep_trees_after_tree_del_no_ci(wc_dir):
- if svntest.main.wc_is_singledb(wc_dir):
- return deep_trees_after_tree_del
- else:
- return deep_trees_empty_dirs
+ return deep_trees_after_tree_del
def deep_trees_tree_del_repos(base):
"""Helper function for deep trees test cases. Delete top-level dirs,
@@ -524,8 +498,13 @@ def deep_trees_run_tests_scheme_for_update(sbox, greater_scheme):
x_status.copy()
x_status.wc_dir = base
+ if test_case.error_re_string == None:
+ expected_stderr = []
+ else:
+ expected_stderr = test_case.error_re_string
+
run_and_verify_update(base, x_out, x_disk, None,
- error_re_string = test_case.error_re_string)
+ expected_stderr = expected_stderr)
if x_status:
run_and_verify_unquiet_status(base, x_status)
@@ -551,8 +530,7 @@ def deep_trees_run_tests_scheme_for_update(sbox, greater_scheme):
x_status.wc_dir = base
run_and_verify_commit(base, None, x_status,
- test_case.commit_block_string,
- base)
+ test_case.commit_block_string)
except:
logger.warn("ERROR IN: Tests scheme for update: "
+ "while checking commit-blocking in '%s'", test_case.name)
@@ -612,8 +590,13 @@ def deep_trees_skipping_on_update(sbox, test_case, skip_paths,
# Account for nodes that were updated by further_action
x_status.tweak('', 'D', 'F', 'DD', 'DF', 'DDD', 'DDF', wc_rev=4)
+ if test_case.error_re_string == None:
+ expected_stderr = []
+ else:
+ expected_stderr = test_case.error_re_string
+
run_and_verify_update(base, x_out, x_disk, None,
- error_re_string = test_case.error_re_string)
+ expected_stderr = expected_stderr)
run_and_verify_unquiet_status(base, x_status)
@@ -771,9 +754,14 @@ def deep_trees_run_tests_scheme_for_switch(sbox, greater_scheme):
x_status.copy()
x_status.wc_dir = local
+ if test_case.error_re_string == None:
+ expected_stderr = []
+ else:
+ expected_stderr = test_case.error_re_string
+
run_and_verify_switch(local, local, incoming, x_out, x_disk, None,
- test_case.error_re_string, None, None, None,
- None, False, '--ignore-ancestry')
+ expected_stderr, False,
+ '--ignore-ancestry')
run_and_verify_unquiet_status(local, x_status)
x_info = test_case.expected_info or {}
@@ -797,8 +785,7 @@ def deep_trees_run_tests_scheme_for_switch(sbox, greater_scheme):
x_status.wc_dir = local
run_and_verify_commit(local, None, x_status,
- test_case.commit_block_string,
- local)
+ test_case.commit_block_string)
except:
logger.warn("ERROR IN: Tests scheme for switch: "
+ "while checking commit-blocking in '%s'", test_case.name)
@@ -985,10 +972,14 @@ def deep_trees_run_tests_scheme_for_merge(sbox, greater_scheme,
if ignore_ancestry:
varargs = varargs + ('--ignore-ancestry',)
+ if test_case.error_re_string == None:
+ expected_stderr = []
+ else:
+ expected_stderr = test_case.error_re_string
+
run_and_verify_merge(local, '0', 'HEAD', incoming, None,
x_out, None, None, x_disk, None, x_skip,
- test_case.error_re_string,
- None, None, None, None,
+ expected_stderr,
False, False, *varargs)
run_and_verify_unquiet_status(local, x_status)
except:
@@ -1010,11 +1001,197 @@ def deep_trees_run_tests_scheme_for_merge(sbox, greater_scheme,
x_status.wc_dir = local
run_and_verify_commit(local, None, x_status,
- test_case.commit_block_string,
- local)
+ test_case.commit_block_string)
except:
logger.warn("ERROR IN: Tests scheme for merge: "
+ "while checking commit-blocking in '%s'", test_case.name)
raise
+### Bummer. It would be really nice to have easy access to the URL
+### member of our entries files so that switches could be testing by
+### examining the modified ancestry. But status doesn't show this
+### information. Hopefully in the future the cmdline binary will have
+### a subcommand for dumping multi-line detailed information about
+### versioned things. Until then, we'll stick with the traditional
+### verification methods.
+###
+### gjs says: we have 'svn info' now
+
+def get_routine_status_state(wc_dir):
+ """get the routine status list for WC_DIR at the completion of an
+ initial call to do_routine_switching()"""
+
+ # Construct some paths for convenience
+ ADH_path = os.path.join(wc_dir, 'A', 'D', 'H')
+ chi_path = os.path.join(ADH_path, 'chi')
+ omega_path = os.path.join(ADH_path, 'omega')
+ psi_path = os.path.join(ADH_path, 'psi')
+ pi_path = os.path.join(ADH_path, 'pi')
+ tau_path = os.path.join(ADH_path, 'tau')
+ rho_path = os.path.join(ADH_path, 'rho')
+
+ # Now generate a state
+ state = svntest.actions.get_virginal_state(wc_dir, 1)
+ state.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F', 'A/B/lambda')
+ state.add({
+ 'A/B/pi' : Item(status=' ', wc_rev=1),
+ 'A/B/tau' : Item(status=' ', wc_rev=1),
+ 'A/B/rho' : Item(status=' ', wc_rev=1),
+ })
+
+ return state
+
+#----------------------------------------------------------------------
+
+def get_routine_disk_state(wc_dir):
+ """get the routine disk list for WC_DIR at the completion of an
+ initial call to do_routine_switching()"""
+
+ disk = svntest.main.greek_state.copy()
+
+ # iota has the same contents as gamma
+ disk.tweak('iota', contents=disk.desc['A/D/gamma'].contents)
+
+ # A/B/* no longer exist, but have been replaced by copies of A/D/G/*
+ disk.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F', 'A/B/lambda')
+ disk.add({
+ 'A/B/pi' : Item("This is the file 'pi'.\n"),
+ 'A/B/rho' : Item("This is the file 'rho'.\n"),
+ 'A/B/tau' : Item("This is the file 'tau'.\n"),
+ })
+
+ return disk
+
+#----------------------------------------------------------------------
+
+def do_routine_switching(wc_dir, repo_url, verify):
+ """perform some routine switching of the working copy WC_DIR for
+ other tests to use. If VERIFY, then do a full verification of the
+ switching, else don't bother."""
+
+ ### Switch the file `iota' to `A/D/gamma'.
+
+ # Construct some paths for convenience
+ iota_path = os.path.join(wc_dir, 'iota')
+ gamma_url = repo_url + '/A/D/gamma'
+
+ if verify:
+ # Create expected output tree
+ expected_output = svntest.wc.State(wc_dir, {
+ 'iota' : Item(status='U '),
+ })
+
+ # Create expected disk tree (iota will have gamma's contents)
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak('iota',
+ contents=expected_disk.desc['A/D/gamma'].contents)
+
+ # Create expected status tree
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('iota', switched='S')
+
+ # Do the switch and check the results in three ways.
+ svntest.actions.run_and_verify_switch(wc_dir, iota_path, gamma_url,
+ expected_output,
+ expected_disk,
+ expected_status,
+ [],
+ False, '--ignore-ancestry')
+ else:
+ svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
+ gamma_url, iota_path)
+
+ ### Switch the directory `A/B' to `A/D/G'.
+
+ # Construct some paths for convenience
+ AB_path = os.path.join(wc_dir, 'A', 'B')
+ ADG_url = repo_url + '/A/D/G'
+
+ if verify:
+ # Create expected output tree
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B/E' : Item(status='D '),
+ 'A/B/F' : Item(status='D '),
+ 'A/B/lambda' : Item(status='D '),
+ 'A/B/pi' : Item(status='A '),
+ 'A/B/tau' : Item(status='A '),
+ 'A/B/rho' : Item(status='A '),
+ })
+
+ # Create expected disk tree (iota will have gamma's contents,
+ # A/B/* will look like A/D/G/*)
+ expected_disk = get_routine_disk_state(wc_dir)
+
+ # Create expected status
+ expected_status = get_routine_status_state(wc_dir)
+ expected_status.tweak('iota', 'A/B', switched='S')
+
+ # Do the switch and check the results in three ways.
+ svntest.actions.run_and_verify_switch(wc_dir, AB_path, ADG_url,
+ expected_output,
+ expected_disk,
+ expected_status,
+ [],
+ False, '--ignore-ancestry')
+ else:
+ svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
+ ADG_url, AB_path)
+
+
+#----------------------------------------------------------------------
+
+def commit_routine_switching(wc_dir, verify):
+ "Commit some stuff in a routinely-switched working copy."
+
+ # Make some local mods
+ iota_path = os.path.join(wc_dir, 'iota')
+ Bpi_path = os.path.join(wc_dir, 'A', 'B', 'pi')
+ Gpi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
+ Z_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z')
+ zeta_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z', 'zeta')
+
+ svntest.main.file_append(iota_path, "apple")
+ svntest.main.file_append(Bpi_path, "melon")
+ svntest.main.file_append(Gpi_path, "banana")
+ os.mkdir(Z_path)
+ svntest.main.file_append(zeta_path, "This is the file 'zeta'.\n")
+ svntest.main.run_svn(None, 'add', Z_path)
+
+ # Try to commit. We expect this to fail because, if all the
+ # switching went as expected, A/B/pi and A/D/G/pi point to the
+ # same URL. We don't allow this.
+ svntest.actions.run_and_verify_commit(
+ wc_dir, None, None,
+ "svn: E195003: Cannot commit both .* as they refer to the same URL$")
+
+ # Okay, that all taken care of, let's revert the A/D/G/pi path and
+ # move along. Afterward, we should be okay to commit. (Sorry,
+ # holsta, that banana has to go...)
+ svntest.main.run_svn(None, 'revert', Gpi_path)
+
+ # Create expected output tree.
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/D/G/Z' : Item(verb='Adding'),
+ 'A/D/G/Z/zeta' : Item(verb='Adding'),
+ 'iota' : Item(verb='Sending'),
+ 'A/B/pi' : Item(verb='Sending'),
+ })
+
+ # Created expected status tree.
+ expected_status = get_routine_status_state(wc_dir)
+ expected_status.tweak('iota', 'A/B', switched='S')
+ expected_status.tweak('iota', 'A/B/pi', wc_rev=2, status=' ')
+ expected_status.add({
+ 'A/D/G/Z' : Item(status=' ', wc_rev=2),
+ 'A/D/G/Z/zeta' : Item(status=' ', wc_rev=2),
+ })
+
+ # Commit should succeed
+ if verify:
+ svntest.actions.run_and_verify_commit(wc_dir,
+ expected_output,
+ expected_status)
+ else:
+ svntest.main.run_svn(None,
+ 'ci', '-m', 'log msg', wc_dir)
diff --git a/subversion/tests/cmdline/svntest/factory.py b/subversion/tests/cmdline/svntest/factory.py
index 9a2b17b..32093ea 100644
--- a/subversion/tests/cmdline/svntest/factory.py
+++ b/subversion/tests/cmdline/svntest/factory.py
@@ -97,7 +97,7 @@
#
# YOU ARE CORDIALLY INVITED to add/tweak/change to your needs.
# If you want to know what's going on, look at the switch()
-# funtion of TestFactory below.
+# function of TestFactory below.
#
#
# DETAILS
@@ -308,7 +308,7 @@ class TestFactory:
# An optimized list kept up-to-date by variable additions
self.sorted_vars_by_pathlen = []
- # Wether we ever used the variables 'wc_dir' and 'url' (tiny tweak)
+ # Whether we ever used the variables 'wc_dir' and 'url' (tiny tweak)
self.used_wc_dir = False
self.used_abs_wc_dir = False
self.used_url = False
@@ -500,7 +500,7 @@ class TestFactory:
else:
py = "expected_stdout = verify.UnorderedOutput(" + pylist + ")\n\n"
py += pychdir
- py += "actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0"
+ py += "actions.run_and_verify_svn2(expected_stdout, [], 0"
else:
# write a test that expects failure
pylist = self.strlist2py(err)
@@ -509,8 +509,7 @@ class TestFactory:
else:
py = "expected_stderr = verify.UnorderedOutput(" + pylist + ")\n\n"
py += pychdir
- py += ("actions.run_and_verify_svn2('OUTPUT', " +
- "[], expected_stderr, " + str(code))
+ py += ("actions.run_and_verify_svn2([], expected_stderr, " + str(code))
if len(pyargs) > 0:
py += ", " + ", ".join(pyargs)
@@ -635,13 +634,13 @@ class TestFactory:
py += pychdir
py += ("actions.run_and_verify_update(" + wc.py + ", " +
"expected_output, expected_disk, expected_status, " +
- "None, None, None, None, None, False")
+ "[], False")
else:
# write a test that expects error
py = "expected_error = " + self.strlist2py(err) + "\n\n"
py += pychdir
py += ("actions.run_and_verify_update(" + wc.py + ", None, None, " +
- "None, expected_error, None, None, None, None, False")
+ "None, expected_error")
if len(pyargs) > 0:
py += ', ' + ', '.join(pyargs)
@@ -701,14 +700,14 @@ class TestFactory:
py += ("actions.run_and_verify_switch(" + wc.py + ", " +
wc_arg.pyarg + ", " + url_arg.pyarg + ", " +
"expected_output, expected_disk, expected_status, " +
- "None, None, None, None, None, False")
+ "[], False")
else:
# write a test that expects error
py = "expected_error = " + self.strlist2py(err) + "\n\n"
py += pychdir
py += ("actions.run_and_verify_switch(" + wc.py + ", " +
wc_arg.pyarg + ", " + url_arg.pyarg + ", " +
- "None, None, None, expected_error, None, None, None, None, False")
+ "None, None, None, expected_error, False")
if len(pyargs) > 0:
py += ', ' + ', '.join(pyargs)
@@ -766,7 +765,7 @@ class TestFactory:
py += ("actions.run_and_verify_checkout(" +
url_arg.pyarg + ", " + wc_arg.pyarg +
- ", expected_output, expected_disk, None, None, None, None")
+ ", expected_output, expected_disk")
else:
# write a test that expects failure
pylist = self.strlist2py(err)
@@ -775,8 +774,7 @@ class TestFactory:
else:
py += "expected_stderr = verify.UnorderedOutput(" + pylist + ")\n\n"
py += pychdir
- py += ("actions.run_and_verify_svn2('OUTPUT', " +
- "[], expected_stderr, " + str(code) +
+ py += ("actions.run_and_verify_svn2([], expected_stderr, " + str(code) +
", " + url_arg.pyarg + ", " + wc_arg.pyarg)
# Append the remaining args
@@ -1037,7 +1035,7 @@ class TestFactory:
make_py, prev_status = self.get_prev_status(wc)
- actual_status = svntest.wc.State.from_status(output)
+ actual_status = svntest.wc.State.from_status(output, wc_dir=wc.realpath)
# The tests currently compare SVNTreeNode trees, so let's do that too.
prev_status_tree = prev_status.old_tree()
diff --git a/subversion/tests/cmdline/svntest/main.py b/subversion/tests/cmdline/svntest/main.py
index 0d1ca91..de59c06 100644
--- a/subversion/tests/cmdline/svntest/main.py
+++ b/subversion/tests/cmdline/svntest/main.py
@@ -36,6 +36,7 @@ import xml
import urllib
import logging
import hashlib
+import zipfile
from urlparse import urlparse
try:
@@ -53,7 +54,7 @@ import svntest
from svntest import Failure
from svntest import Skip
-SVN_VER_MINOR = 8
+SVN_VER_MINOR = 9
######################################################################
#
@@ -111,7 +112,7 @@ class SVNRepositoryCreateFailure(Failure):
# Windows specifics
if sys.platform == 'win32':
windows = True
- file_scheme_prefix = 'file:'
+ file_scheme_prefix = 'file:///'
_exe = '.exe'
_bat = '.bat'
os.environ['SVN_DBG_STACKTRACES_TO_STDERR'] = 'y'
@@ -131,6 +132,10 @@ else:
wc_author = 'jrandom'
wc_passwd = 'rayjandom'
+# Username and password used by svnrdump in dump/load cross-checks
+crosscheck_username = '__dumpster__'
+crosscheck_password = '__loadster__'
+
# Username and password used by the working copies for "second user"
# scenarios
wc_author2 = 'jconstant' # use the same password as wc_author
@@ -141,23 +146,30 @@ stack_trace_regexp = r'(?:.*subversion[\\//].*\.c:[0-9]*,$|.*apr_err=.*)'
os.environ['LC_ALL'] = 'C'
######################################################################
-# The locations of the svn, svnadmin and svnlook binaries, relative to
-# the only scripts that import this file right now (they live in ../).
+# The locations of the svn binaries.
# Use --bin to override these defaults.
-svn_binary = os.path.abspath('../../svn/svn' + _exe)
-svnadmin_binary = os.path.abspath('../../svnadmin/svnadmin' + _exe)
-svnlook_binary = os.path.abspath('../../svnlook/svnlook' + _exe)
-svnrdump_binary = os.path.abspath('../../svnrdump/svnrdump' + _exe)
-svnsync_binary = os.path.abspath('../../svnsync/svnsync' + _exe)
-svnversion_binary = os.path.abspath('../../svnversion/svnversion' + _exe)
-svndumpfilter_binary = os.path.abspath('../../svndumpfilter/svndumpfilter' + \
- _exe)
-svnmucc_binary=os.path.abspath('../../svnmucc/svnmucc' + _exe)
-entriesdump_binary = os.path.abspath('entries-dump' + _exe)
-atomic_ra_revprop_change_binary = os.path.abspath('atomic-ra-revprop-change' + \
- _exe)
-wc_lock_tester_binary = os.path.abspath('../libsvn_wc/wc-lock-tester' + _exe)
-wc_incomplete_tester_binary = os.path.abspath('../libsvn_wc/wc-incomplete-tester' + _exe)
+def P(relpath,
+ head=os.path.dirname(os.path.dirname(os.path.abspath('.')))
+ ):
+ if sys.platform=='win32':
+ return os.path.join(head, relpath + '.exe')
+ else:
+ return os.path.join(head, relpath)
+svn_binary = P('svn/svn')
+svnadmin_binary = P('svnadmin/svnadmin')
+svnlook_binary = P('svnlook/svnlook')
+svnrdump_binary = P('svnrdump/svnrdump')
+svnsync_binary = P('svnsync/svnsync')
+svnversion_binary = P('svnversion/svnversion')
+svndumpfilter_binary = P('svndumpfilter/svndumpfilter')
+svnmucc_binary = P('svnmucc/svnmucc')
+svnfsfs_binary = P('svnfsfs/svnfsfs')
+entriesdump_binary = P('tests/cmdline/entries-dump')
+lock_helper_binary = P('tests/cmdline/lock-helper')
+atomic_ra_revprop_change_binary = P('tests/cmdline/atomic-ra-revprop-change')
+wc_lock_tester_binary = P('tests/libsvn_wc/wc-lock-tester')
+wc_incomplete_tester_binary = P('tests/libsvn_wc/wc-incomplete-tester')
+del P
######################################################################
# The location of svnauthz binary, relative to the only scripts that
@@ -539,6 +551,15 @@ def run_command_stdin(command, error_expected, bufsize=-1, binary_mode=False,
and not any(map(lambda arg: 'prop_tests-12' in arg, varargs)):
raise Failure("Repository diskpath in %s: %r" % (name, lines))
+ valgrind_diagnostic = False
+ # A valgrind diagnostic will raise a failure if the command is
+ # expected to run without error. When an error is expected any
+ # subsequent error pattern matching is usually lenient and will not
+ # detect the diagnostic so make sure a failure is raised here.
+ if error_expected and stderr_lines:
+ if any(map(lambda arg: re.match('==[0-9]+==', arg), stderr_lines)):
+ valgrind_diagnostic = True
+
stop = time.time()
logger.info('<TIME = %.6f>' % (stop - start))
for x in stdout_lines:
@@ -546,7 +567,8 @@ def run_command_stdin(command, error_expected, bufsize=-1, binary_mode=False,
for x in stderr_lines:
logger.info(x.rstrip())
- if (not error_expected) and ((stderr_lines) or (exit_code != 0)):
+ if (((not error_expected) and ((stderr_lines) or (exit_code != 0)))
+ or valgrind_diagnostic):
for x in stderr_lines:
logger.warning(x.rstrip())
if len(varargs) <= 5:
@@ -561,7 +583,8 @@ def run_command_stdin(command, error_expected, bufsize=-1, binary_mode=False,
stderr_lines
def create_config_dir(cfgdir, config_contents=None, server_contents=None,
- ssl_cert=None, ssl_url=None, http_proxy=None):
+ ssl_cert=None, ssl_url=None, http_proxy=None,
+ exclusive_wc_locks=None):
"Create config directories and files"
# config file names
@@ -582,25 +605,41 @@ password-stores =
[miscellany]
interactive-conflicts = false
"""
-
+ if exclusive_wc_locks:
+ config_contents += """
+[working-copy]
+exclusive-locking = true
+"""
# define default server file contents if none provided
if server_contents is None:
http_library_str = ""
if options.http_library:
http_library_str = "http-library=%s" % (options.http_library)
http_proxy_str = ""
+ http_proxy_username_str = ""
+ http_proxy_password_str = ""
if options.http_proxy:
http_proxy_parsed = urlparse("//" + options.http_proxy)
http_proxy_str = "http-proxy-host=%s\n" % (http_proxy_parsed.hostname) + \
"http-proxy-port=%d" % (http_proxy_parsed.port or 80)
+ if options.http_proxy_username:
+ http_proxy_username_str = "http-proxy-username=%s" % \
+ (options.http_proxy_username)
+ if options.http_proxy_password:
+ http_proxy_password_str = "http-proxy-password=%s" % \
+ (options.http_proxy_password)
+
server_contents = """
#
[global]
%s
%s
+%s
+%s
store-plaintext-passwords=yes
store-passwords=yes
-""" % (http_library_str, http_proxy_str)
+""" % (http_library_str, http_proxy_str, http_proxy_username_str,
+ http_proxy_password_str)
file_write(cfgfile_cfg, config_contents)
file_write(cfgfile_srv, server_contents)
@@ -661,14 +700,25 @@ def _with_config_dir(args):
else:
return args + ('--config-dir', default_config_dir)
+class svnrdump_crosscheck_authentication:
+ pass
+
def _with_auth(args):
assert '--password' not in args
- args = args + ('--password', wc_passwd,
+ if svnrdump_crosscheck_authentication in args:
+ args = filter(lambda x: x is not svnrdump_crosscheck_authentication, args)
+ auth_username = crosscheck_username
+ auth_password = crosscheck_password
+ else:
+ auth_username = wc_author
+ auth_password = wc_passwd
+
+ args = args + ('--password', auth_password,
'--no-auth-cache' )
if '--username' in args:
return args
else:
- return args + ('--username', wc_author )
+ return args + ('--username', auth_username )
# For running subversion and returning the output
def run_svn(error_expected, *varargs):
@@ -716,7 +766,8 @@ def run_svnrdump(stdin_input, *varargs):
def run_svnsync(*varargs):
"""Run svnsync with VARARGS, returns exit code as int; stdout, stderr as
list of lines (including line terminators)."""
- return run_command(svnsync_binary, 1, False, *(_with_config_dir(varargs)))
+ return run_command(svnsync_binary, 1, False,
+ *(_with_auth(_with_config_dir(varargs))))
def run_svnversion(*varargs):
"""Run svnversion with VARARGS, returns exit code as int; stdout, stderr
@@ -739,6 +790,16 @@ def run_svnauthz_validate(*varargs):
stderr as list of lines (including line terminators)."""
return run_command(svnauthz_validate_binary, 1, False, *varargs)
+def run_svnfsfs(*varargs):
+ """Run svnfsfs with VARARGS, returns exit code as int; stdout, stderr
+ as list of lines (including line terminators)."""
+ return run_command(svnfsfs_binary, 1, False, *varargs)
+
+def run_lock_helper(repo, path, user, seconds):
+ """Run lock-helper to lock path in repo by username for seconds"""
+
+ return run_command(lock_helper_binary, 1, False, repo, path, user, seconds)
+
def run_entriesdump(path):
"""Run the entries-dump helper, returning a dict of Entry objects."""
# use spawn_process rather than run_command to avoid copying all the data
@@ -793,9 +854,11 @@ def run_atomic_ra_revprop_change(url, revision, propname, skel, want_error):
url, revision, propname, skel,
want_error and 1 or 0, default_config_dir)
-def run_wc_lock_tester(recursive, path):
+def run_wc_lock_tester(recursive, path, work_queue=False):
"Run the wc-lock obtainer tool, returning its exit code, stdout and stderr"
- if recursive:
+ if work_queue:
+ option = "-w"
+ elif recursive:
option = "-r"
else:
option = "-1"
@@ -874,47 +937,10 @@ def file_substitute(path, contents, new_contents):
fcontent = open(path, 'r').read().replace(contents, new_contents)
open(path, 'w').write(fcontent)
-# For creating blank new repositories
-def create_repos(path, minor_version = None):
- """Create a brand-new SVN repository at PATH. If PATH does not yet
- exist, create it."""
-
- if not os.path.exists(path):
- os.makedirs(path) # this creates all the intermediate dirs, if neccessary
-
- opts = ("--bdb-txn-nosync",)
- if not minor_version or minor_version > options.server_minor_version:
- minor_version = options.server_minor_version
- opts += ("--compatible-version=1.%d" % (minor_version),)
- if options.fs_type is not None:
- opts += ("--fs-type=" + options.fs_type,)
- exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False, "create",
- path, *opts)
-
- # Skip tests if we can't create the repository.
- if stderr:
- stderr_lines = 0
- not_using_fsfs_backend = (options.fs_type != "fsfs")
- backend_deprecation_warning = False
- for line in stderr:
- stderr_lines += 1
- if line.find('Unknown FS type') != -1:
- raise Skip
- if not_using_fsfs_backend:
- if 0 < line.find('repository back-end is deprecated, consider using'):
- backend_deprecation_warning = True
-
- # Creating BDB repositories will cause svnadmin to print a warning
- # which should be ignored.
- if (stderr_lines == 1
- and not_using_fsfs_backend
- and backend_deprecation_warning):
- pass
- else:
- # If the FS type is known and we noticed more than just the
- # BDB-specific warning, assume the repos couldn't be created
- # (e.g. due to a missing 'svnadmin' binary).
- raise SVNRepositoryCreateFailure("".join(stderr).rstrip())
+# For setting up authz and hooks in existing repos
+def _post_create_repos(path, minor_version = None):
+ """Set default access right configurations for svnserve and mod_dav
+ as well as hooks etc. in the SVN repository at PATH."""
# Require authentication to write to the repos, for ra_svn testing.
file_write(get_svnserve_conf_file_path(path),
@@ -927,14 +953,26 @@ def create_repos(path, minor_version = None):
# This actually creates TWO [users] sections in the file (one of them is
# uncommented in `svnadmin create`'s template), so we exercise the .ini
# files reading code's handling of duplicates, too. :-)
- file_append(os.path.join(path, "conf", "passwd"),
- "[users]\njrandom = rayjandom\njconstant = rayjandom\n");
+ users = ("[users]\n"
+ "jrandom = rayjandom\n"
+ "jconstant = rayjandom\n")
+ if tests_verify_dump_load_cross_check():
+ # Insert a user for the dump/load cross-check.
+ users += (crosscheck_username + " = " + crosscheck_password + "\n")
+ file_append(os.path.join(path, "conf", "passwd"), users)
if options.fs_type is None or options.fs_type == 'fsfs':
# fsfs.conf file
if options.config_file is not None and \
(not minor_version or minor_version >= 6):
- shutil.copy(options.config_file, get_fsfs_conf_file_path(path))
+ config_file = open(options.config_file, 'r')
+ fsfsconf = open(get_fsfs_conf_file_path(path), 'w')
+ for line in config_file.readlines():
+ fsfsconf.write(line)
+ if options.memcached_server and line == '[memcached-servers]\n':
+ fsfsconf.write('key = %s\n' % options.memcached_server)
+ config_file.close()
+ fsfsconf.close()
# format file
if options.fsfs_sharding is not None:
@@ -964,7 +1002,7 @@ def create_repos(path, minor_version = None):
# post-commit
# Note that some tests (currently only commit_tests) create their own
# post-commit hooks, which would override this one. :-(
- if options.fsfs_packing:
+ if options.fsfs_packing and minor_version >=6:
# some tests chdir.
abs_path = os.path.abspath(path)
create_python_hook_script(get_post_commit_hook_path(abs_path),
@@ -977,6 +1015,73 @@ def create_repos(path, minor_version = None):
# make the repos world-writeable, for mod_dav_svn's sake.
chmod_tree(path, 0666, 0666)
+def _unpack_precooked_repos(path, template):
+ testdir = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
+ repozip = os.path.join(os.path.dirname(testdir), "templates", template)
+ zipfile.ZipFile(repozip, 'r').extractall(path)
+
+# For creating new, pre-cooked greek repositories
+def unpack_greek_repos(path):
+ template = "greek-fsfs-v%d.zip" % options.fsfs_version
+ _unpack_precooked_repos(path, template)
+ _post_create_repos(path, options.server_minor_version)
+
+# For creating blank new repositories
+def create_repos(path, minor_version = None):
+ """Create a brand-new SVN repository at PATH. If PATH does not yet
+ exist, create it."""
+
+ if not os.path.exists(path):
+ os.makedirs(path) # this creates all the intermediate dirs, if necessary
+
+ if options.fsfs_version is None:
+ if options.fs_type == "bdb":
+ opts = ("--bdb-txn-nosync",)
+ else:
+ opts = ()
+ if minor_version is None or minor_version > options.server_minor_version:
+ minor_version = options.server_minor_version
+ opts += ("--compatible-version=1.%d" % (minor_version),)
+ if options.fs_type is not None:
+ opts += ("--fs-type=" + options.fs_type,)
+ exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False,
+ "create", path, *opts)
+ else:
+ # Copy a pre-cooked FSFS repository
+ assert options.fs_type == "fsfs"
+ template = "empty-fsfs-v%d.zip" % options.fsfs_version
+ _unpack_precooked_repos(path, template)
+ exit_code, stdout, stderr = run_command(svnadmin_binary, 1, False,
+ "setuuid", path)
+
+ # Skip tests if we can't create the repository.
+ if stderr:
+ stderr_lines = 0
+ not_using_fsfs_backend = (options.fs_type != "fsfs")
+ backend_deprecation_warning = False
+ for line in stderr:
+ stderr_lines += 1
+ if line.find('Unknown FS type') != -1:
+ raise Skip
+ if not_using_fsfs_backend:
+ if 0 < line.find('repository back-end is deprecated, consider using'):
+ backend_deprecation_warning = True
+
+ # Creating BDB repositories will cause svnadmin to print a warning
+ # which should be ignored.
+ if (stderr_lines == 1
+ and not_using_fsfs_backend
+ and backend_deprecation_warning):
+ pass
+ else:
+ # If the FS type is known and we noticed more than just the
+ # BDB-specific warning, assume the repos couldn't be created
+ # (e.g. due to a missing 'svnadmin' binary).
+ raise SVNRepositoryCreateFailure("".join(stderr).rstrip())
+
+ # Configure the new repository.
+ _post_create_repos(path, minor_version)
+
# For copying a repository
def copy_repos(src_path, dst_path, head_revision, ignore_uuid = 1,
minor_version = None):
@@ -1120,7 +1225,7 @@ def write_restrictive_svnserve_conf_with_groups(repo_dir,
# parallel execution at the bottom like so
# if __name__ == '__main__':
# svntest.main.run_tests(test_list, serial_only = True)
-def write_authz_file(sbox, rules, sections=None):
+def write_authz_file(sbox, rules, sections=None, prefixed_rules=None):
"""Write an authz file to SBOX, appropriate for the RA method used,
with authorizations rules RULES mapping paths to strings containing
the rules. You can add sections SECTIONS (ex. groups, aliases...) with
@@ -1128,23 +1233,37 @@ an appropriate list of mappings.
"""
fp = open(sbox.authz_file, 'w')
- # When the sandbox repository is read only it's name will be different from
+ # When the sandbox repository is read only its name will be different from
# the repository name.
- repo_name = sbox.repo_dir
- while repo_name[-1] == '/':
- repo_name = repo_name[:-1]
- repo_name = os.path.basename(repo_name)
+ repo_name = os.path.basename(sbox.repo_dir.rstrip('/'))
if sbox.repo_url.startswith("http"):
- prefix = repo_name + ":"
+ default_prefix = repo_name + ":"
else:
- prefix = ""
+ default_prefix = ""
+
if sections:
for p, r in sections.items():
fp.write("[%s]\n%s\n" % (p, r))
- for p, r in rules.items():
- fp.write("[%s%s]\n%s\n" % (prefix, p, r))
+ if not prefixed_rules:
+ prefixed_rules = dict()
+
+ if rules:
+ for p, r in rules.items():
+ prefixed_rules[default_prefix + p] = r
+
+ for p, r in prefixed_rules.items():
+ fp.write("[%s]\n%s\n" % (p, r))
+ if tests_verify_dump_load_cross_check():
+ # Insert an ACE that lets the dump/load cross-check bypass
+ # authz restrictions.
+ fp.write(crosscheck_username + " = rw\n")
+
+ if tests_verify_dump_load_cross_check() and '/' not in prefixed_rules:
+ # We need a repository-root ACE for the dump/load cross-check
+ fp.write("[/]\n" + crosscheck_username + " = rw\n")
+
fp.close()
# See the warning about parallel test execution in write_authz_file
@@ -1295,6 +1414,12 @@ def make_log_msg():
# Functions which check the test configuration
# (useful for conditional XFails)
+def tests_use_prepacakaged_repository():
+ return options.fsfs_version is not None
+
+def tests_verify_dump_load_cross_check():
+ return options.dump_load_cross_check
+
def is_ra_type_dav():
return options.test_area_url.startswith('http')
@@ -1322,9 +1447,28 @@ def is_fs_type_fsfs():
# This assumes that fsfs is the default fs implementation.
return options.fs_type == 'fsfs' or options.fs_type is None
+def is_fs_type_fsx():
+ return options.fs_type == 'fsx'
+
def is_fs_type_bdb():
return options.fs_type == 'bdb'
+def is_fs_log_addressing():
+ return is_fs_type_fsx() or \
+ (is_fs_type_fsfs() and options.server_minor_version >= 9)
+
+def fs_has_rep_sharing():
+ return is_fs_type_fsx() or \
+ (is_fs_type_fsfs() and options.server_minor_version >= 6)
+
+def fs_has_pack():
+ return is_fs_type_fsx() or \
+ (is_fs_type_fsfs() and options.server_minor_version >= 6)
+
+def fs_has_unique_freeze():
+ return (is_fs_type_fsfs() and options.server_minor_version >= 9
+ or is_fs_type_bdb())
+
def is_os_windows():
return os.name == 'nt'
@@ -1367,6 +1511,9 @@ def server_enforces_date_syntax():
def server_has_atomic_revprop():
return options.server_minor_version >= 7
+def server_has_reverse_get_file_revs():
+ return options.server_minor_version >= 8
+
def is_plaintext_password_storage_disabled():
try:
predicate = re.compile("^WARNING: Plaintext password storage is enabled!")
@@ -1378,6 +1525,30 @@ def is_plaintext_password_storage_disabled():
return False
return True
+
+# https://issues.apache.org/bugzilla/show_bug.cgi?id=56480
+# https://issues.apache.org/bugzilla/show_bug.cgi?id=55397
+__mod_dav_url_quoting_broken_versions = frozenset([
+ '2.2.27',
+ '2.2.26',
+ '2.2.25',
+ '2.4.9',
+ '2.4.8',
+ '2.4.7',
+ '2.4.6',
+ '2.4.5',
+])
+def is_mod_dav_url_quoting_broken():
+ if is_ra_type_dav():
+ return (options.httpd_version in __mod_dav_url_quoting_broken_versions)
+ return None
+
+def is_httpd_authz_provider_enabled():
+ if is_ra_type_dav():
+ v = options.httpd_version.split('.')
+ return (v[0] == '2' and int(v[1]) >= 3) or int(v[0]) > 2
+ return None
+
######################################################################
@@ -1412,13 +1583,12 @@ class TestSpawningThread(threading.Thread):
args = []
args.append(str(index))
args.append('-c')
+ args.append('--set-log-level=%s' % logger.getEffectiveLevel())
# add some startup arguments from this process
if options.fs_type:
args.append('--fs-type=' + options.fs_type)
if options.test_area_url:
args.append('--url=' + options.test_area_url)
- if logger.getEffectiveLevel() <= logging.DEBUG:
- args.append('-v')
if options.cleanup:
args.append('--cleanup')
if options.enable_sasl:
@@ -1435,6 +1605,24 @@ class TestSpawningThread(threading.Thread):
args.append('--ssl-cert=' + options.ssl_cert)
if options.http_proxy:
args.append('--http-proxy=' + options.http_proxy)
+ if options.http_proxy_username:
+ args.append('--http-proxy-username=' + options.http_proxy_username)
+ if options.http_proxy_password:
+ args.append('--http-proxy-password=' + options.http_proxy_password)
+ if options.httpd_version:
+ args.append('--httpd-version=' + options.httpd_version)
+ if options.exclusive_wc_locks:
+ args.append('--exclusive-wc-locks')
+ if options.memcached_server:
+ args.append('--memcached-server=' + options.memcached_server)
+ if options.fsfs_sharding:
+ args.append('--fsfs-sharding=' + str(options.fsfs_sharding))
+ if options.fsfs_packing:
+ args.append('--fsfs-packing')
+ if options.fsfs_version:
+ args.append('--fsfs-version=' + str(options.fsfs_version))
+ if options.dump_load_cross_check:
+ args.append('--dump-load-cross-check')
result, stdout_lines, stderr_lines = spawn_process(command, 0, False, None,
*args)
@@ -1694,13 +1882,7 @@ def _internal_run_tests(test_list, testnums, parallel, srcdir, progress_func):
return exit_code
-def create_default_options():
- """Set the global options to the defaults, as provided by the argument
- parser."""
- _parse_options([])
-
-
-def _create_parser():
+def _create_parser(usage=None):
"""Return a parser for our test suite."""
def set_log_level(option, opt, value, parser, level=None):
if level:
@@ -1710,9 +1892,18 @@ def _create_parser():
# called from --set-log-level
logger.setLevel(getattr(logging, value, None) or int(value))
- # set up the parser
+ # Set up the parser.
+ # If you add new options, consider adding them in
+ #
+ # .../build/run_tests.py:main()
+ #
+ # and handling them in
+ #
+ # .../build/run_tests.py:TestHarness._init_py_tests()
+ #
_default_http_library = 'serf'
- usage = 'usage: %prog [options] [<test> ...]'
+ if usage is None:
+ usage = 'usage: %prog [options] [<test> ...]'
parser = optparse.OptionParser(usage=usage)
parser.add_option('-l', '--list', action='store_true', dest='list_tests',
help='Print test doc strings instead of running them')
@@ -1727,6 +1918,9 @@ def _create_parser():
parser.add_option('-p', '--parallel', action='store_const',
const=default_num_threads, dest='parallel',
help='Run the tests in parallel')
+ parser.add_option('--parallel-instances', action='store',
+ type='int', dest='parallel',
+ help='Run the given number of tests in parallel')
parser.add_option('-c', action='store_true', dest='is_child_process',
help='Flag if we are running this python test as a ' +
'child process')
@@ -1736,7 +1930,7 @@ def _create_parser():
parser.add_option('--url', action='store',
help='Base url to the repos (e.g. svn://localhost)')
parser.add_option('--fs-type', action='store',
- help='Subversion file system type (fsfs or bdb)')
+ help='Subversion file system type (fsfs, bdb or fsx)')
parser.add_option('--cleanup', action='store_true',
help='Whether to clean up')
parser.add_option('--enable-sasl', action='store_true',
@@ -1757,6 +1951,13 @@ def _create_parser():
help="Run 'svnadmin pack' automatically")
parser.add_option('--fsfs-sharding', action='store', type='int',
help='Default shard size (for fsfs)')
+ parser.add_option('--fsfs-version', type='int', action='store',
+ help='FSFS version (fsfs)')
+ parser.add_option('--dump-load-cross-check', action='store_true',
+ help="After every test, run a series of dump and load " +
+ "tests with svnadmin, svnrdump and svndumpfilter " +
+ " on the testcase repositories to cross-check " +
+ " dump file compatibility.")
parser.add_option('--config-file', action='store',
help="Configuration file for tests.")
parser.add_option('--set-log-level', action='callback', type='str',
@@ -1780,43 +1981,73 @@ def _create_parser():
help='Path to SSL server certificate.')
parser.add_option('--http-proxy', action='store',
help='Use the HTTP Proxy at hostname:port.')
+ parser.add_option('--http-proxy-username', action='store',
+ help='Username for the HTTP Proxy.')
+ parser.add_option('--http-proxy-password', action='store',
+ help='Password for the HTTP Proxy.')
+ parser.add_option('--httpd-version', action='store',
+ help='Assume HTTPD is this version.')
parser.add_option('--tools-bin', action='store', dest='tools_bin',
help='Use the svn tools installed in this path')
+ parser.add_option('--exclusive-wc-locks', action='store_true',
+ help='Use sqlite exclusive locking for working copies')
+ parser.add_option('--memcached-server', action='store',
+ help='Use memcached server at specified URL (FSFS only)')
# most of the defaults are None, but some are other values, set them here
parser.set_defaults(
server_minor_version=SVN_VER_MINOR,
url=file_scheme_prefix + \
- urllib.pathname2url(os.path.abspath(os.getcwd())),
+ svntest.wc.svn_uri_quote(
+ os.path.abspath(
+ os.getcwd()).replace(os.path.sep, '/')),
http_library=_default_http_library)
return parser
-def _parse_options(arglist=sys.argv[1:]):
+def parse_options(arglist=sys.argv[1:], usage=None):
"""Parse the arguments in arg_list, and set the global options object with
the results"""
global options
- parser = _create_parser()
+ parser = _create_parser(usage)
(options, args) = parser.parse_args(arglist)
- # some sanity checking
+ # Normalize url to have no trailing slash
+ if options.url:
+ if options.url[-1:] == '/':
+ options.test_area_url = options.url[:-1]
+ else:
+ options.test_area_url = options.url
+
+ # Some sanity checking
if options.fsfs_packing and not options.fsfs_sharding:
parser.error("--fsfs-packing requires --fsfs-sharding")
- # If you change the below condition then change
- # ../../../../build/run_tests.py too.
if options.server_minor_version not in range(3, SVN_VER_MINOR+1):
parser.error("test harness only supports server minor versions 3-%d"
% SVN_VER_MINOR)
- if options.url:
- if options.url[-1:] == '/': # Normalize url to have no trailing slash
- options.test_area_url = options.url[:-1]
- else:
- options.test_area_url = options.url
+ # Make sure the server-minor-version matches the fsfs-version parameter.
+ if options.fsfs_version:
+ if options.fsfs_version == 6:
+ if options.server_minor_version \
+ and options.server_minor_version != 8 \
+ and options.server_minor_version != SVN_VER_MINOR:
+ parser.error("--fsfs-version=6 requires --server-minor-version=8")
+ options.server_minor_version = 8
+ if options.fsfs_version == 4:
+ if options.server_minor_version \
+ and options.server_minor_version != 7 \
+ and options.server_minor_version != SVN_VER_MINOR:
+ parser.error("--fsfs-version=4 requires --server-minor-version=7")
+ options.server_minor_version = 7
+ pass
+ # ### Add more tweaks here if and when we support pre-cooked versions
+ # ### of FSFS repositories.
+ pass
return (parser, args)
@@ -1918,6 +2149,7 @@ def execute_tests(test_list, serial_only = False, test_name = None,
global svn_binary
global svnadmin_binary
global svnlook_binary
+ global svnrdump_binary
global svnsync_binary
global svndumpfilter_binary
global svnversion_binary
@@ -1946,7 +2178,7 @@ def execute_tests(test_list, serial_only = False, test_name = None,
if not options:
# Override which tests to run from the commandline
- (parser, args) = _parse_options()
+ (parser, args) = parse_options()
test_selection = args
else:
parser = _create_parser()
@@ -2003,7 +2235,7 @@ def execute_tests(test_list, serial_only = False, test_name = None,
# it to a number if possible
for testnum in list(range(1, len(test_list))):
test_case = TestRunner(test_list[testnum], testnum)
- if test_case.get_function_name() == str(arg):
+ if test_case.get_function_name() == str(arg).rstrip(','):
testnums.append(testnum)
appended = True
break
@@ -2016,7 +2248,9 @@ def execute_tests(test_list, serial_only = False, test_name = None,
# Calculate pristine_greek_repos_url from test_area_url.
pristine_greek_repos_url = options.test_area_url + '/' + \
- urllib.pathname2url(pristine_greek_repos_dir)
+ svntest.wc.svn_uri_quote(
+ pristine_greek_repos_dir.replace(
+ os.path.sep, '/'))
if options.use_jsvn:
if options.svn_bin is None:
@@ -2035,6 +2269,7 @@ def execute_tests(test_list, serial_only = False, test_name = None,
svn_binary = os.path.join(options.svn_bin, 'svn' + _exe)
svnadmin_binary = os.path.join(options.svn_bin, 'svnadmin' + _exe)
svnlook_binary = os.path.join(options.svn_bin, 'svnlook' + _exe)
+ svnrdump_binary = os.path.join(options.svn_bin, 'svnrdump' + _exe)
svnsync_binary = os.path.join(options.svn_bin, 'svnsync' + _exe)
svndumpfilter_binary = os.path.join(options.svn_bin,
'svndumpfilter' + _exe)
@@ -2093,29 +2328,38 @@ def execute_tests(test_list, serial_only = False, test_name = None,
# We are simply listing the tests so always exit with success.
return 0
- # don't run tests in parallel when the tests don't support it or there
- # are only a few tests to run.
+ # don't run tests in parallel when the tests don't support it or
+ # there are only a few tests to run.
+ options_parallel = options.parallel
if serial_only or len(testnums) < 2:
options.parallel = 0
- if not options.is_child_process:
- # Build out the default configuration directory
- create_config_dir(default_config_dir,
- ssl_cert=options.ssl_cert,
- ssl_url=options.test_area_url,
- http_proxy=options.http_proxy)
-
- # Setup the pristine repository
- svntest.actions.setup_pristine_greek_repository()
-
- # Run the tests.
- exit_code = _internal_run_tests(test_list, testnums, options.parallel,
- options.srcdir, progress_func)
+ try:
+ if not options.is_child_process:
+ # Build out the default configuration directory
+ create_config_dir(default_config_dir,
+ ssl_cert=options.ssl_cert,
+ ssl_url=options.test_area_url,
+ http_proxy=options.http_proxy,
+ exclusive_wc_locks=options.exclusive_wc_locks)
+
+ # Setup the pristine repository
+ svntest.actions.setup_pristine_greek_repository()
+
+ # Run the tests.
+ exit_code = _internal_run_tests(test_list, testnums, options.parallel,
+ options.srcdir, progress_func)
+ finally:
+ options.parallel = options_parallel
# Remove all scratchwork: the 'pristine' repository, greek tree, etc.
# This ensures that an 'import' will happen the next time we run.
if not options.is_child_process and not options.keep_local_tmp:
- safe_rmtree(temp_dir, 1)
+ try:
+ safe_rmtree(temp_dir, 1)
+ except:
+ logger.error("ERROR: cleanup of '%s' directory failed." % temp_dir)
+ exit_code = 1
# Cleanup after ourselves.
svntest.sandbox.cleanup_deferred_test_paths()
diff --git a/subversion/tests/cmdline/svntest/mergetrees.py b/subversion/tests/cmdline/svntest/mergetrees.py
new file mode 100755
index 0000000..e01592a
--- /dev/null
+++ b/subversion/tests/cmdline/svntest/mergetrees.py
@@ -0,0 +1,506 @@
+#!/usr/bin/env python
+#
+# mergetrees.py: routines that create merge scenarios
+#
+# Subversion is a tool for revision control.
+# See http://subversion.apache.org for more information.
+#
+# ====================================================================
+# 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.
+######################################################################
+
+# General modules
+import shutil, sys, re, os
+import time
+
+# Our testing module
+import main, wc, verify, actions, testcase
+
+from prop_tests import binary_mime_type_on_text_file_warning
+
+# (abbreviation)
+Item = wc.StateItem
+Skip = testcase.Skip_deco
+SkipUnless = testcase.SkipUnless_deco
+XFail = testcase.XFail_deco
+Issues = testcase.Issues_deco
+Issue = testcase.Issue_deco
+Wimp = testcase.Wimp_deco
+exp_noop_up_out = actions.expected_noop_update_output
+
+from svntest.main import SVN_PROP_MERGEINFO
+
+def expected_merge_output(rev_ranges, additional_lines=[], foreign=False,
+ elides=False, two_url=False, target=None,
+ text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
+ text_resolved=0, prop_resolved=0, tree_resolved=0,
+ skipped_paths=0):
+ """Generate an (inefficient) regex representing the expected merge
+ output and mergeinfo notifications from REV_RANGES and ADDITIONAL_LINES.
+
+ REV_RANGES is a list of revision ranges for which mergeinfo is being
+ recorded. Each range is of the form [start, end] (where both START and
+ END are inclusive, unlike in '-rX:Y') or the form [single_rev] (which is
+ like '-c SINGLE_REV'). If REV_RANGES is None then only the standard
+ notification for a 3-way merge is expected.
+
+ ADDITIONAL_LINES is a list of strings to match the other lines of output;
+ these are basically regular expressions except that backslashes will be
+ escaped herein. If ADDITIONAL_LINES is a single string, it is interpreted
+ the same as a list containing that string.
+
+ If ELIDES is true, add to the regex an expression representing elision
+ notification. If TWO_URL is true, tweak the regex to expect the
+ appropriate mergeinfo notification for a 3-way merge.
+
+ TARGET is the local path to the target, as it should appear in
+ notifications; if None, it is not checked.
+
+ TEXT_CONFLICTS, PROP_CONFLICTS, TREE_CONFLICTS and SKIPPED_PATHS specify
+ the number of each kind of conflict to expect.
+ """
+
+ if rev_ranges is None:
+ lines = [main.merge_notify_line(None, None, False, foreign)]
+ else:
+ lines = []
+ for rng in rev_ranges:
+ start_rev = rng[0]
+ if len(rng) > 1:
+ end_rev = rng[1]
+ else:
+ end_rev = None
+ lines += [main.merge_notify_line(start_rev, end_rev,
+ True, foreign, target)]
+ lines += [main.mergeinfo_notify_line(start_rev, end_rev, target)]
+
+ if (elides):
+ lines += ["--- Eliding mergeinfo from .*\n"]
+
+ if (two_url):
+ lines += ["--- Recording mergeinfo for merge between repository URLs .*\n"]
+
+ # Address "The Backslash Plague"
+ #
+ # If ADDITIONAL_LINES are present there are possibly paths in it with
+ # multiple components and on Windows these components are separated with
+ # '\'. These need to be escaped properly in the regexp for the match to
+ # work correctly. See http://aspn.activestate.com/ASPN/docs/ActivePython
+ # /2.2/howto/regex/regex.html#SECTION000420000000000000000.
+ if isinstance(additional_lines, str):
+ additional_lines = [additional_lines]
+ if sys.platform == 'win32':
+ additional_lines = [line.replace("\\", "\\\\") for line in additional_lines]
+ lines += additional_lines
+
+ lines += main.summary_of_conflicts(
+ text_conflicts, prop_conflicts, tree_conflicts,
+ text_resolved, prop_resolved, tree_resolved,
+ skipped_paths,
+ as_regex=True)
+
+ return "|".join(lines)
+
+def check_mergeinfo_recursively(root_path, subpaths_mergeinfo):
+ """Check that the mergeinfo properties on and under ROOT_PATH are those in
+ SUBPATHS_MERGEINFO, a {path: mergeinfo-prop-val} dictionary."""
+ expected = verify.UnorderedOutput(
+ [path + ' - ' + subpaths_mergeinfo[path] + '\n'
+ for path in subpaths_mergeinfo])
+ actions.run_and_verify_svn(expected, [],
+ 'propget', '-R', SVN_PROP_MERGEINFO,
+ root_path)
+
+######################################################################
+#----------------------------------------------------------------------
+def set_up_dir_replace(sbox):
+ """Set up the working copy for directory replace tests, creating
+ directory 'A/B/F/foo' with files 'new file' and 'new file2' within
+ it (r2), and merging 'foo' onto 'C' (r3), then deleting 'A/B/F/foo'
+ (r4)."""
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ C_path = sbox.ospath('A/C')
+ F_path = sbox.ospath('A/B/F')
+ F_url = sbox.repo_url + '/A/B/F'
+
+ foo_path = os.path.join(F_path, 'foo')
+ new_file = os.path.join(foo_path, "new file")
+ new_file2 = os.path.join(foo_path, "new file 2")
+
+ # Make directory foo in F, and add some files within it.
+ actions.run_and_verify_svn(None, [], 'mkdir', foo_path)
+ main.file_append(new_file, "Initial text in new file.\n")
+ main.file_append(new_file2, "Initial text in new file 2.\n")
+ main.run_svn(None, "add", new_file)
+ main.run_svn(None, "add", new_file2)
+
+ # Commit all the new content, creating r2.
+ expected_output = wc.State(wc_dir, {
+ 'A/B/F/foo' : Item(verb='Adding'),
+ 'A/B/F/foo/new file' : Item(verb='Adding'),
+ 'A/B/F/foo/new file 2' : Item(verb='Adding'),
+ })
+ expected_status = actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'A/B/F/foo' : Item(status=' ', wc_rev=2),
+ 'A/B/F/foo/new file' : Item(status=' ', wc_rev=2),
+ 'A/B/F/foo/new file 2' : Item(status=' ', wc_rev=2),
+ })
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+
+ # Merge foo onto C
+ expected_output = wc.State(C_path, {
+ 'foo' : Item(status='A '),
+ 'foo/new file' : Item(status='A '),
+ 'foo/new file 2' : Item(status='A '),
+ })
+ expected_mergeinfo_output = wc.State(C_path, {
+ '' : Item(status=' U'),
+ })
+ expected_elision_output = wc.State(C_path, {
+ })
+ expected_disk = wc.State('', {
+ '' : Item(props={SVN_PROP_MERGEINFO : '/A/B/F:2'}),
+ 'foo' : Item(),
+ 'foo/new file' : Item("Initial text in new file.\n"),
+ 'foo/new file 2' : Item("Initial text in new file 2.\n"),
+ })
+ expected_status = wc.State(C_path, {
+ '' : Item(status=' M', wc_rev=1),
+ 'foo' : Item(status='A ', wc_rev='-', copied='+'),
+ 'foo/new file' : Item(status=' ', wc_rev='-', copied='+'),
+ 'foo/new file 2' : Item(status=' ', wc_rev='-', copied='+'),
+ })
+ expected_skip = wc.State(C_path, { })
+ actions.run_and_verify_merge(C_path, '1', '2', F_url, None,
+ expected_output,
+ expected_mergeinfo_output,
+ expected_elision_output,
+ expected_disk,
+ expected_status,
+ expected_skip,
+ check_props=True)
+ # Commit merge of foo onto C, creating r3.
+ expected_output = wc.State(wc_dir, {
+ 'A/C' : Item(verb='Sending'),
+ 'A/C/foo' : Item(verb='Adding'),
+ })
+ expected_status = actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'A/B/F/foo' : Item(status=' ', wc_rev=2),
+ 'A/C' : Item(status=' ', wc_rev=3),
+ 'A/B/F/foo/new file' : Item(status=' ', wc_rev=2),
+ 'A/B/F/foo/new file 2' : Item(status=' ', wc_rev=2),
+ 'A/C/foo' : Item(status=' ', wc_rev=3),
+ 'A/C/foo/new file' : Item(status=' ', wc_rev=3),
+ 'A/C/foo/new file 2' : Item(status=' ', wc_rev=3),
+
+ })
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+
+ # Delete foo on F, creating r4.
+ actions.run_and_verify_svn(None, [], 'rm', foo_path)
+ expected_output = wc.State(wc_dir, {
+ 'A/B/F/foo' : Item(verb='Deleting'),
+ })
+ expected_status = actions.get_virginal_state(wc_dir, 1)
+ expected_status.add({
+ 'A/C' : Item(status=' ', wc_rev=3),
+ 'A/C/foo' : Item(status=' ', wc_rev=3),
+ 'A/C/foo/new file' : Item(status=' ', wc_rev=3),
+ 'A/C/foo/new file 2' : Item(status=' ', wc_rev=3),
+ })
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+
+#----------------------------------------------------------------------
+def set_up_branch(sbox, branch_only = False, nbr_of_branches = 1):
+ '''Starting with standard greek tree, copy 'A' NBR_OF_BRANCHES times
+ to A_COPY, A_COPY_2, A_COPY_3, and so on. Then, unless BRANCH_ONLY is
+ true, make four modifications (setting file contents to "New content")
+ under A:
+ r(2 + NBR_OF_BRANCHES) - A/D/H/psi
+ r(3 + NBR_OF_BRANCHES) - A/D/G/rho
+ r(4 + NBR_OF_BRANCHES) - A/B/E/beta
+ r(5 + NBR_OF_BRANCHES) - A/D/H/omega
+ Return (expected_disk, expected_status).'''
+
+ # With the default parameters, the branching looks like this:
+ #
+ # A -1-----3-4-5-6--
+ # \
+ # A_COPY 2-----------
+
+ wc_dir = sbox.wc_dir
+
+ expected_status = actions.get_virginal_state(wc_dir, 1)
+ expected_disk = main.greek_state.copy()
+
+ def copy_A(dest_name, rev):
+ expected = verify.UnorderedOutput(
+ ["A " + os.path.join(wc_dir, dest_name, "B") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "B", "lambda") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "B", "E") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "B", "E", "alpha") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "B", "E", "beta") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "B", "F") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "mu") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "C") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "gamma") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "G") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "G", "pi") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "G", "rho") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "G", "tau") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "H") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "H", "chi") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "H", "omega") + "\n",
+ "A " + os.path.join(wc_dir, dest_name, "D", "H", "psi") + "\n",
+ "Checked out revision " + str(rev - 1) + ".\n",
+ "A " + os.path.join(wc_dir, dest_name) + "\n"])
+ expected_status.add({
+ dest_name + "/B" : Item(status=' ', wc_rev=rev),
+ dest_name + "/B/lambda" : Item(status=' ', wc_rev=rev),
+ dest_name + "/B/E" : Item(status=' ', wc_rev=rev),
+ dest_name + "/B/E/alpha" : Item(status=' ', wc_rev=rev),
+ dest_name + "/B/E/beta" : Item(status=' ', wc_rev=rev),
+ dest_name + "/B/F" : Item(status=' ', wc_rev=rev),
+ dest_name + "/mu" : Item(status=' ', wc_rev=rev),
+ dest_name + "/C" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/gamma" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/G" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/G/pi" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/G/rho" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/G/tau" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/H" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/H/chi" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/H/omega" : Item(status=' ', wc_rev=rev),
+ dest_name + "/D/H/psi" : Item(status=' ', wc_rev=rev),
+ dest_name : Item(status=' ', wc_rev=rev)})
+ expected_disk.add({
+ dest_name : Item(),
+ dest_name + '/B' : Item(),
+ dest_name + '/B/lambda' : Item("This is the file 'lambda'.\n"),
+ dest_name + '/B/E' : Item(),
+ dest_name + '/B/E/alpha' : Item("This is the file 'alpha'.\n"),
+ dest_name + '/B/E/beta' : Item("This is the file 'beta'.\n"),
+ dest_name + '/B/F' : Item(),
+ dest_name + '/mu' : Item("This is the file 'mu'.\n"),
+ dest_name + '/C' : Item(),
+ dest_name + '/D' : Item(),
+ dest_name + '/D/gamma' : Item("This is the file 'gamma'.\n"),
+ dest_name + '/D/G' : Item(),
+ dest_name + '/D/G/pi' : Item("This is the file 'pi'.\n"),
+ dest_name + '/D/G/rho' : Item("This is the file 'rho'.\n"),
+ dest_name + '/D/G/tau' : Item("This is the file 'tau'.\n"),
+ dest_name + '/D/H' : Item(),
+ dest_name + '/D/H/chi' : Item("This is the file 'chi'.\n"),
+ dest_name + '/D/H/omega' : Item("This is the file 'omega'.\n"),
+ dest_name + '/D/H/psi' : Item("This is the file 'psi'.\n"),
+ })
+
+ # Make a branch A_COPY to merge into.
+ actions.run_and_verify_svn(expected, [], 'copy',
+ sbox.repo_url + "/A",
+ os.path.join(wc_dir,
+ dest_name))
+
+ expected_output = wc.State(wc_dir, {dest_name : Item(verb='Adding')})
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+ for i in range(nbr_of_branches):
+ if i == 0:
+ copy_A('A_COPY', i + 2)
+ else:
+ copy_A('A_COPY_' + str(i + 1), i + 2)
+
+ if branch_only:
+ return expected_disk, expected_status
+
+ # Make some changes under A which we'll later merge under A_COPY:
+
+ # r(nbr_of_branches + 2) - modify and commit A/D/H/psi
+ main.file_write(sbox.ospath('A/D/H/psi'),
+ "New content")
+ expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Sending')})
+ expected_status.tweak('A/D/H/psi', wc_rev=nbr_of_branches + 2)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+ expected_disk.tweak('A/D/H/psi', contents="New content")
+
+ # r(nbr_of_branches + 3) - modify and commit A/D/G/rho
+ main.file_write(sbox.ospath('A/D/G/rho'),
+ "New content")
+ expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')})
+ expected_status.tweak('A/D/G/rho', wc_rev=nbr_of_branches + 3)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+ expected_disk.tweak('A/D/G/rho', contents="New content")
+
+ # r(nbr_of_branches + 4) - modify and commit A/B/E/beta
+ main.file_write(sbox.ospath('A/B/E/beta'),
+ "New content")
+ expected_output = wc.State(wc_dir, {'A/B/E/beta' : Item(verb='Sending')})
+ expected_status.tweak('A/B/E/beta', wc_rev=nbr_of_branches + 4)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+ expected_disk.tweak('A/B/E/beta', contents="New content")
+
+ # r(nbr_of_branches + 5) - modify and commit A/D/H/omega
+ main.file_write(sbox.ospath('A/D/H/omega'),
+ "New content")
+ expected_output = wc.State(wc_dir, {'A/D/H/omega' : Item(verb='Sending')})
+ expected_status.tweak('A/D/H/omega', wc_rev=nbr_of_branches + 5)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
+ expected_disk.tweak('A/D/H/omega', contents="New content")
+
+ return expected_disk, expected_status
+
+#----------------------------------------------------------------------
+# Helper functions. These take local paths using '/' separators.
+
+def local_path(path):
+ "Convert a path from '/' separators to the local style."
+ return os.sep.join(path.split('/'))
+
+def svn_mkfile(path):
+ "Make and add a file with some default content, and keyword expansion."
+ path = local_path(path)
+ dirname, filename = os.path.split(path)
+ main.file_write(path, "This is the file '" + filename + "'.\n" +
+ "Last changed in '$Revision$'.\n")
+ actions.run_and_verify_svn(None, [], 'add', path)
+ actions.run_and_verify_svn(None, [], 'propset',
+ 'svn:keywords', 'Revision', path)
+
+def svn_modfile(path):
+ "Make text and property mods to a WC file."
+ path = local_path(path)
+ main.file_append(path, "An extra line.\n")
+ actions.run_and_verify_svn(None, [], 'propset',
+ 'newprop', 'v', path)
+
+def svn_copy(s_rev, path1, path2):
+ "Copy a WC path locally."
+ path1 = local_path(path1)
+ path2 = local_path(path2)
+ actions.run_and_verify_svn(None, [], 'copy', '--parents',
+ '-r', s_rev, path1, path2)
+
+def svn_merge(rev_range, source, target, lines=None, elides=[],
+ text_conflicts=0, prop_conflicts=0, tree_conflicts=0,
+ text_resolved=0, prop_resolved=0, tree_resolved=0,
+ args=[]):
+ """Merge a single change from path SOURCE to path TARGET and verify the
+ output and that there is no error. (The changes made are not verified.)
+
+ REV_RANGE is either a number (to cherry-pick that specific change) or a
+ two-element list [X,Y] to pick the revision range '-r(X-1):Y'.
+
+ LINES is a list of regular expressions to match other lines of output; if
+ LINES is 'None' then match all normal (non-conflicting) merges.
+
+ ELIDES is a list of paths on which mergeinfo elision should be reported.
+
+ TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
+ each kind of conflict to expect.
+
+ ARGS are additional arguments passed to svn merge.
+ """
+
+ source = local_path(source)
+ target = local_path(target)
+ elides = [local_path(p) for p in elides]
+ if isinstance(rev_range, int):
+ mi_rev_range = [rev_range]
+ rev_arg = '-c' + str(rev_range)
+ else:
+ mi_rev_range = rev_range
+ rev_arg = '-r' + str(rev_range[0] - 1) + ':' + str(rev_range[1])
+ if lines is None:
+ lines = ["(A |D |[UG] | [UG]|[UG][UG]) " + target + ".*\n"]
+ else:
+ # Expect mergeinfo on the target; caller must supply matches for any
+ # subtree mergeinfo paths.
+ lines.append(" [UG] " + target + "\n")
+ exp_out = expected_merge_output([mi_rev_range], lines, target=target,
+ elides=elides,
+ text_conflicts=text_conflicts,
+ prop_conflicts=prop_conflicts,
+ tree_conflicts=tree_conflicts,
+ text_resolved=text_resolved,
+ prop_resolved=prop_resolved,
+ tree_resolved=tree_resolved)
+ actions.run_and_verify_svn(exp_out, [],
+ 'merge', rev_arg, source, target, *args)
+
+#----------------------------------------------------------------------
+# Setup helper for issue #4056 and issue #4057 tests.
+def noninheritable_mergeinfo_test_set_up(sbox):
+ '''Starting with standard greek tree, copy 'A' to 'branch' in r2 and
+ then made a file edit to A/B/lambda in r3.
+ Return (expected_output, expected_mergeinfo_output, expected_elision_output,
+ expected_status, expected_disk, expected_skip) for a merge of
+ r3 from ^/A/B to branch/B.'''
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ lambda_path = sbox.ospath('A/B/lambda')
+ B_branch_path = sbox.ospath('branch/B')
+
+ # r2 - Branch ^/A to ^/branch.
+ main.run_svn(None, 'copy', sbox.repo_url + '/A',
+ sbox.repo_url + '/branch', '-m', 'make a branch')
+
+ # r3 - Make an edit to A/B/lambda.
+ main.file_write(lambda_path, "trunk edit.\n")
+ main.run_svn(None, 'commit', '-m', 'file edit', wc_dir)
+ main.run_svn(None, 'up', wc_dir)
+
+ expected_output = wc.State(B_branch_path, {
+ 'lambda' : Item(status='U '),
+ })
+ expected_mergeinfo_output = wc.State(B_branch_path, {
+ '' : Item(status=' U'),
+ 'lambda' : Item(status=' U'),
+ })
+ expected_elision_output = wc.State(B_branch_path, {
+ 'lambda' : Item(status=' U'),
+ })
+ expected_status = wc.State(B_branch_path, {
+ '' : Item(status=' M'),
+ 'lambda' : Item(status='M '),
+ 'E' : Item(status=' '),
+ 'E/alpha' : Item(status=' '),
+ 'E/beta' : Item(status=' '),
+ 'F' : Item(status=' '),
+ })
+ expected_status.tweak(wc_rev='3')
+ expected_disk = wc.State('', {
+ '' : Item(props={SVN_PROP_MERGEINFO : '/A/B:3'}),
+ 'lambda' : Item("trunk edit.\n"),
+ 'E' : Item(),
+ 'E/alpha' : Item("This is the file 'alpha'.\n"),
+ 'E/beta' : Item("This is the file 'beta'.\n"),
+ 'F' : Item(),
+ })
+ expected_skip = wc.State(B_branch_path, {})
+
+ return expected_output, expected_mergeinfo_output, expected_elision_output, \
+ expected_status, expected_disk, expected_skip
+
diff --git a/subversion/tests/cmdline/svntest/objects.py b/subversion/tests/cmdline/svntest/objects.py
index 8c8cdd5..169e5e6 100644
--- a/subversion/tests/cmdline/svntest/objects.py
+++ b/subversion/tests/cmdline/svntest/objects.py
@@ -156,7 +156,7 @@ class SvnRepository:
"""Run 'svnadmin dump' on the repository."""
exit_code, stdout, stderr = \
- actions.run_and_verify_svnadmin(None, None, None,
+ actions.run_and_verify_svnadmin(None, None,
'dump', self.repo_absdir)
ldumpfile = local_path(output_dir + "/svnadmin.dump")
main.file_write(ldumpfile, ''.join(stderr))
@@ -167,7 +167,7 @@ class SvnRepository:
make, and each directory is a path relative to the repository root,
neither starting nor ending with a slash."""
urls = [self.repo_url + '/' + dir for dir in dirs]
- actions.run_and_verify_svn(None, None, [],
+ actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'svn_mkdirs()', '--parents',
*urls)
self.head_rev += 1
@@ -207,7 +207,7 @@ class SvnWC:
def svn_mkdir(self, rpath):
lpath = local_path(rpath)
- actions.run_and_verify_svn(None, None, [], 'mkdir', lpath)
+ actions.run_and_verify_svn(None, [], 'mkdir', lpath)
self.state.add({
rpath : wc.StateItem(status='A ')
@@ -216,7 +216,7 @@ class SvnWC:
# def propset(self, pname, pvalue, *rpaths):
# "Set property 'pname' to value 'pvalue' on each path in 'rpaths'"
# local_paths = tuple([local_path(rpath) for rpath in rpaths])
-# actions.run_and_verify_svn(None, None, [], 'propset', pname, pvalue,
+# actions.run_and_verify_svn(None, [], 'propset', pname, pvalue,
# *local_paths)
def svn_set_props(self, rpath, props):
@@ -224,10 +224,10 @@ class SvnWC:
"""
lpath = local_path(rpath)
#for prop in path's existing props:
- # actions.run_and_verify_svn(None, None, [], 'propdel',
+ # actions.run_and_verify_svn(None, [], 'propdel',
# prop, lpath)
for prop in props:
- actions.run_and_verify_svn(None, None, [], 'propset',
+ actions.run_and_verify_svn(None, [], 'propset',
prop, props[prop], lpath)
self.state.tweak(rpath, props=props)
@@ -240,7 +240,7 @@ class SvnWC:
content = "This is the file '" + filename + "'.\n" + \
"Last changed in '$Revision$'.\n"
main.file_write(lpath, content)
- actions.run_and_verify_svn(None, None, [], 'add', lpath)
+ actions.run_and_verify_svn(None, [], 'add', lpath)
self.state.add({
rpath : wc.StateItem(status='A ')
@@ -257,7 +257,7 @@ class SvnWC:
lpath = local_path(rpath)
if content is not None:
#main.file_append(lpath, "An extra line.\n")
- #actions.run_and_verify_svn(None, None, [], 'propset',
+ #actions.run_and_verify_svn(None, [], 'propset',
# 'newprop', 'v', lpath)
main.file_write(lpath, content)
self.state.tweak(rpath, content=content)
@@ -274,7 +274,7 @@ class SvnWC:
args = [lpath1, lpath2]
if parents:
args += ['--parents']
- actions.run_and_verify_svn(None, None, [], 'copy', *args)
+ actions.run_and_verify_svn(None, [], 'copy', *args)
self.state.add({
rpath2: self.state.desc[rpath1]
})
@@ -292,7 +292,7 @@ class SvnWC:
args += ['-r', rev]
if parents:
args += ['--parents']
- actions.run_and_verify_svn(None, None, [], 'copy', *args)
+ actions.run_and_verify_svn(None, [], 'copy', *args)
self.state.add({
rpath2: self.state.desc[rpath1]
})
@@ -303,12 +303,12 @@ class SvnWC:
args = []
if even_if_modified:
args += ['--force']
- actions.run_and_verify_svn(None, None, [], 'delete', lpath, *args)
+ actions.run_and_verify_svn(None, [], 'delete', lpath, *args)
def svn_commit(self, rpath='', log=''):
"Commit a WC path (recursively). Return the new revision number."
lpath = local_path(rpath)
- actions.run_and_verify_svn(None, verify.AnyOutput, [],
+ actions.run_and_verify_svn(verify.AnyOutput, [],
'commit', '-m', log, lpath)
actions.run_and_verify_update(lpath, None, None, None)
self.repo.head_rev += 1
@@ -332,6 +332,6 @@ class SvnWC:
# exp_1 = "--- Merging r.* into '" + target_re + ".*':"
# exp_2 = "(A |D |[UG] | [UG]|[UG][UG]) " + target_re + ".*"
# exp_out = verify.RegexOutput(exp_1 + "|" + exp_2)
-# actions.run_and_verify_svn(None, exp_out, [],
+# actions.run_and_verify_svn(exp_out, [],
# 'merge', rev_spec, lsource, ltarget)
diff --git a/subversion/tests/cmdline/svntest/sandbox.py b/subversion/tests/cmdline/svntest/sandbox.py
index ad67ac0..8451bb1 100644
--- a/subversion/tests/cmdline/svntest/sandbox.py
+++ b/subversion/tests/cmdline/svntest/sandbox.py
@@ -24,14 +24,68 @@
import os
import shutil
import copy
-import urllib
import logging
+import re
import svntest
logger = logging.getLogger()
+def make_mirror(sbox, source_prop_encoding=None):
+ """Make a mirror of the repository in SBOX.
+ """
+ # Set up the mirror repository.
+ dest_sbox = sbox.clone_dependent()
+ dest_sbox.build(create_wc=False, empty=True)
+ exit_code, output, errput = svntest.main.run_svnlook("uuid", sbox.repo_dir)
+ svntest.actions.run_and_verify_svnadmin2(None, None, 0,
+ 'setuuid', dest_sbox.repo_dir,
+ output[0][:-1])
+ svntest.actions.enable_revprop_changes(dest_sbox.repo_dir)
+
+ repo_url = sbox.repo_url
+ dest_repo_url = dest_sbox.repo_url
+
+ # Synchronize it.
+ args = (svntest.main.svnrdump_crosscheck_authentication,)
+ if source_prop_encoding:
+ args = args + ("--source-prop-encoding=" + source_prop_encoding,)
+ svntest.actions.run_and_verify_svnsync(svntest.verify.AnyOutput, [],
+ "initialize",
+ dest_repo_url, repo_url, *args)
+ svntest.actions.run_and_verify_svnsync(None, [],
+ "synchronize",
+ dest_repo_url, repo_url, *args)
+
+ return dest_sbox
+
+def verify_mirror(repo_url, repo_dir, expected_dumpfile):
+ """Compare the repository content at REPO_URL/REPO_DIR with that in
+ EXPECTED_DUMPFILE (which is a non-delta dump).
+ """
+ # Remove some SVNSync-specific housekeeping properties from the
+ # mirror repository in preparation for the comparison dump.
+ for prop_name in ("svn:sync-from-url", "svn:sync-from-uuid",
+ "svn:sync-last-merged-rev"):
+ svntest.actions.run_and_verify_svn(
+ None, [], "propdel", "--revprop", "-r", "0",
+ prop_name, repo_url)
+ # Create a dump file from the mirror repository.
+ dumpfile_s_n = svntest.actions.run_and_verify_dump(repo_dir)
+ # Compare the mirror's dumpfile, ignoring any expected differences:
+ # The original dumpfile in some cases lacks 'Text-content-sha1' headers;
+ # the mirror dump always has them -- ### Why?
+ svnsync_headers_always = re.compile("Text-content-sha1: ")
+ dumpfile_a_n_cmp = [l for l in expected_dumpfile
+ if not svnsync_headers_always.match(l)]
+ dumpfile_s_n_cmp = [l for l in dumpfile_s_n
+ if not svnsync_headers_always.match(l)]
+ svntest.verify.compare_dump_files(None, None,
+ dumpfile_a_n_cmp,
+ dumpfile_s_n_cmp)
+
+
class Sandbox:
"""Manages a sandbox (one or more repository/working copy pairs) for
a test to operate within."""
@@ -46,7 +100,9 @@ class Sandbox:
# This flag is set to True by build() and returned by is_built()
self._is_built = False
- def _set_name(self, name, read_only=False):
+ self.was_cwd = os.getcwd()
+
+ def _set_name(self, name, read_only=False, empty=False):
"""A convenience method for renaming a sandbox, useful when
working with multiple repositories in the same unit test."""
if not name is None:
@@ -54,32 +110,19 @@ class Sandbox:
self.read_only = read_only
self.wc_dir = os.path.join(svntest.main.general_wc_dir, self.name)
self.add_test_path(self.wc_dir)
- if not read_only:
+ if empty or not read_only: # use a local repo
self.repo_dir = os.path.join(svntest.main.general_repo_dir, self.name)
self.repo_url = (svntest.main.options.test_area_url + '/'
- + urllib.pathname2url(self.repo_dir))
+ + svntest.wc.svn_uri_quote(
+ self.repo_dir.replace(os.path.sep, '/')))
self.add_test_path(self.repo_dir)
else:
self.repo_dir = svntest.main.pristine_greek_repos_dir
self.repo_url = svntest.main.pristine_greek_repos_url
- ### TODO: Move this into to the build() method
- # For dav tests we need a single authz file which must be present,
- # so we recreate it each time a sandbox is created with some default
- # contents, making sure that an empty file is never present
if self.repo_url.startswith("http"):
- # this dir doesn't exist out of the box, so we may have to make it
- if not os.path.exists(svntest.main.work_dir):
- os.makedirs(svntest.main.work_dir)
self.authz_file = os.path.join(svntest.main.work_dir, "authz")
- tmp_authz_file = os.path.join(svntest.main.work_dir, "authz-" + self.name)
- open(tmp_authz_file, 'w').write("[/]\n* = rw\n")
- shutil.move(tmp_authz_file, self.authz_file)
self.groups_file = os.path.join(svntest.main.work_dir, "groups")
-
- # For svnserve tests we have a per-repository authz file, and it
- # doesn't need to be there in order for things to work, so we don't
- # have any default contents.
elif self.repo_url.startswith("svn"):
self.authz_file = os.path.join(self.repo_dir, "conf", "authz")
self.groups_file = os.path.join(self.repo_dir, "conf", "groups")
@@ -102,15 +145,32 @@ class Sandbox:
shutil.copytree(self.wc_dir, clone.wc_dir, symlinks=True)
return clone
- def build(self, name=None, create_wc=True, read_only=False,
+ def build(self, name=None, create_wc=True, read_only=False, empty=False,
minor_version=None):
"""Make a 'Greek Tree' repo (or refer to the central one if READ_ONLY),
+ or make an empty repo if EMPTY is true,
and check out a WC from it (unless CREATE_WC is false). Change the
sandbox's name to NAME. See actions.make_repo_and_wc() for details."""
- self._set_name(name, read_only)
- svntest.actions.make_repo_and_wc(self, create_wc, read_only, minor_version)
+ self._set_name(name, read_only, empty)
+ self._ensure_authz()
+ svntest.actions.make_repo_and_wc(self, create_wc, read_only, empty,
+ minor_version)
self._is_built = True
+ def _ensure_authz(self):
+ "make sure the repository is accessible"
+
+ if self.repo_url.startswith("http"):
+ default_authz = "[/]\n* = rw\n"
+
+ if (svntest.main.options.parallel == 0
+ and (not os.path.isfile(self.authz_file)
+ or open(self.authz_file,'r').read() != default_authz)):
+
+ tmp_authz_file = os.path.join(svntest.main.work_dir, "authz-" + self.name)
+ open(tmp_authz_file, 'w').write(default_authz)
+ shutil.move(tmp_authz_file, self.authz_file)
+
def authz_name(self, repo_dir=None):
"return this sandbox's name for use in an authz file"
repo_dir = repo_dir or self.repo_dir
@@ -135,7 +195,8 @@ class Sandbox:
path = (os.path.join(svntest.main.general_repo_dir, self.name)
+ '.' + suffix)
url = svntest.main.options.test_area_url + \
- '/' + urllib.pathname2url(path)
+ '/' + svntest.wc.svn_uri_quote(
+ path.replace(os.path.sep, '/'))
self.add_test_path(path, remove)
return path, url
@@ -185,7 +246,11 @@ class Sandbox:
of this sbox, or relative to OS-style path WC_DIR if supplied."""
if wc_dir is None:
wc_dir = self.wc_dir
- return os.path.join(wc_dir, svntest.wc.to_ospath(relpath))
+
+ if relpath == '':
+ return wc_dir
+ else:
+ return os.path.join(wc_dir, svntest.wc.to_ospath(relpath))
def ospaths(self, relpaths, wc_dir=None):
"""Return a list of RELPATHS but with each path converted to an OS-style
@@ -212,6 +277,12 @@ class Sandbox:
temporary and 'TEMP' or 'PERM',
parts[1])
+ def file_protocol_url(self):
+ """get a file:// url pointing to the repository"""
+ return svntest.main.file_scheme_prefix + \
+ svntest.wc.svn_uri_quote(
+ os.path.abspath(self.repo_dir).replace(os.path.sep, '/'))
+
def simple_update(self, target=None, revision='HEAD'):
"""Update the WC or TARGET.
TARGET is a relpath relative to the WC."""
@@ -317,15 +388,18 @@ class Sandbox:
raise Exception("Unexpected line '" + line + "' in proplist output" + str(out))
return props
- def simple_add_symlink(self, dest, target):
- """Create a symlink TARGET pointing to DEST and add it to subversion"""
+ def simple_symlink(self, dest, target):
+ """Create a symlink TARGET pointing to DEST"""
if svntest.main.is_posix_os():
os.symlink(dest, self.ospath(target))
else:
svntest.main.file_write(self.ospath(target), "link %s" % dest)
+
+ def simple_add_symlink(self, dest, target, add=True):
+ """Create a symlink TARGET pointing to DEST and add it to subversion"""
+ self.simple_symlink(dest, target)
self.simple_add(target)
- if not svntest.main.is_posix_os():
- # '*' is evaluated on Windows
+ if not svntest.main.is_posix_os(): # '*' is evaluated on Windows
self.simple_propset('svn:special', 'X', target)
def simple_add_text(self, text, *targets):
@@ -360,7 +434,7 @@ class Sandbox:
def simple_append(self, dest, contents, truncate=False):
"""Append CONTENTS to file DEST, optionally truncating it first.
DEST is a relpath relative to the WC."""
- open(self.ospath(dest), truncate and 'w' or 'a').write(contents)
+ open(self.ospath(dest), truncate and 'wb' or 'ab').write(contents)
def simple_lock(self, *targets):
"""Lock TARGETS in the WC.
@@ -369,6 +443,129 @@ class Sandbox:
targets = self.ospaths(targets)
svntest.main.run_svn(False, 'lock', *targets)
+ def youngest(self):
+ _, output, _ = svntest.actions.run_and_verify_svnlook(
+ svntest.verify.AnyOutput, [],
+ 'youngest', self.repo_dir)
+ youngest = int(output[0])
+ return youngest
+
+ def verify_repo(self):
+ """
+ """
+ svnrdump_headers_missing = re.compile(
+ "Text-content-sha1: .*|Text-copy-source-md5: .*|"
+ "Text-copy-source-sha1: .*|Text-delta-base-sha1: .*"
+ )
+ svnrdump_headers_always = re.compile(
+ "Prop-delta: .*"
+ )
+
+ dumpfile_a_n = svntest.actions.run_and_verify_dump(self.repo_dir,
+ deltas=False)
+ dumpfile_a_d = svntest.actions.run_and_verify_dump(self.repo_dir,
+ deltas=True)
+ dumpfile_r_d = svntest.actions.run_and_verify_svnrdump(
+ None, svntest.verify.AnyOutput, [], 0, 'dump', '-q', self.repo_url,
+ svntest.main.svnrdump_crosscheck_authentication)
+
+ # Compare the two deltas dumpfiles, ignoring expected differences
+ dumpfile_a_d_cmp = [l for l in dumpfile_a_d
+ if not svnrdump_headers_missing.match(l)
+ and not svnrdump_headers_always.match(l)]
+ dumpfile_r_d_cmp = [l for l in dumpfile_r_d
+ if not svnrdump_headers_always.match(l)]
+ # Ignore differences in number of blank lines between node records,
+ # as svnrdump puts 3 whereas svnadmin puts 2 after a replace-with-copy.
+ svntest.verify.compare_dump_files(None, None,
+ dumpfile_a_d_cmp,
+ dumpfile_r_d_cmp,
+ ignore_number_of_blank_lines=True)
+
+ # Try loading the dump files.
+ # For extra points, load each with the other tool:
+ # svnadmin dump | svnrdump load
+ # svnrdump dump | svnadmin load
+ repo_dir_a_n, repo_url_a_n = self.add_repo_path('load_a_n')
+ svntest.main.create_repos(repo_dir_a_n)
+ svntest.actions.enable_revprop_changes(repo_dir_a_n)
+ svntest.actions.run_and_verify_svnrdump(
+ dumpfile_a_n, svntest.verify.AnyOutput, [], 0, 'load', repo_url_a_n,
+ svntest.main.svnrdump_crosscheck_authentication)
+
+ repo_dir_a_d, repo_url_a_d = self.add_repo_path('load_a_d')
+ svntest.main.create_repos(repo_dir_a_d)
+ svntest.actions.enable_revprop_changes(repo_dir_a_d)
+ svntest.actions.run_and_verify_svnrdump(
+ dumpfile_a_d, svntest.verify.AnyOutput, [], 0, 'load', repo_url_a_d,
+ svntest.main.svnrdump_crosscheck_authentication)
+
+ repo_dir_r_d, repo_url_r_d = self.add_repo_path('load_r_d')
+ svntest.main.create_repos(repo_dir_r_d)
+ svntest.actions.run_and_verify_load(repo_dir_r_d, dumpfile_r_d)
+
+ # Dump the loaded repositories in the same way; expect exact equality
+ reloaded_dumpfile_a_n = svntest.actions.run_and_verify_dump(repo_dir_a_n)
+ reloaded_dumpfile_a_d = svntest.actions.run_and_verify_dump(repo_dir_a_d)
+ reloaded_dumpfile_r_d = svntest.actions.run_and_verify_dump(repo_dir_r_d)
+ svntest.verify.compare_dump_files(None, None,
+ reloaded_dumpfile_a_n,
+ reloaded_dumpfile_a_d,
+ ignore_uuid=True)
+ svntest.verify.compare_dump_files(None, None,
+ reloaded_dumpfile_a_d,
+ reloaded_dumpfile_r_d,
+ ignore_uuid=True)
+
+ # Run each dump through svndumpfilter and check for no further change.
+ for dumpfile in [dumpfile_a_n,
+ dumpfile_a_d,
+ dumpfile_r_d
+ ]:
+ ### No buffer size seems to work for update_tests-2. So skip that test?
+ ### (Its dumpfile size is ~360 KB non-delta, ~180 KB delta.)
+ if len(''.join(dumpfile)) > 100000:
+ continue
+
+ exit_code, dumpfile2, errput = svntest.main.run_command_stdin(
+ svntest.main.svndumpfilter_binary, None, -1, True,
+ dumpfile, '--quiet', 'include', '/')
+ assert not exit_code and not errput
+ # Ignore empty prop sections in the input file during comparison, as
+ # svndumpfilter strips them.
+ # Ignore differences in number of blank lines between node records,
+ # as svndumpfilter puts 3 instead of 2 after an add or delete record.
+ svntest.verify.compare_dump_files(None, None, dumpfile, dumpfile2,
+ expect_content_length_always=True,
+ ignore_empty_prop_sections=True,
+ ignore_number_of_blank_lines=True)
+
+ # Run the repository through 'svnsync' and check that this does not
+ # change the repository content. (Don't bother if it's already been
+ # created by svnsync.)
+ if "svn:sync-from-url\n" not in dumpfile_a_n:
+ dest_sbox = make_mirror(self)
+ verify_mirror(dest_sbox.repo_url, dest_sbox.repo_dir, dumpfile_a_n)
+
+ def verify(self, skip_cross_check=False):
+ """Do additional testing that should hold for any sandbox, such as
+ verifying that the repository can be dumped.
+ """
+ if (not skip_cross_check
+ and svntest.main.tests_verify_dump_load_cross_check()):
+ if self.is_built() and not self.read_only:
+ # verify that we can in fact dump the repo
+ # (except for the few tests that deliberately corrupt the repo)
+ os.chdir(self.was_cwd)
+ if os.path.exists(self.repo_dir):
+ logger.info("VERIFY: running dump/load cross-check")
+ self.verify_repo()
+ else:
+ logger.info("VERIFY: WARNING: skipping dump/load cross-check:"
+ " is-built=%s, read-only=%s"
+ % (self.is_built() and "true" or "false",
+ self.read_only and "true" or "false"))
+ pass
def is_url(target):
return (target.startswith('^/')
diff --git a/subversion/tests/cmdline/svntest/testcase.py b/subversion/tests/cmdline/svntest/testcase.py
index 9243c7b..7643f1e 100644
--- a/subversion/tests/cmdline/svntest/testcase.py
+++ b/subversion/tests/cmdline/svntest/testcase.py
@@ -28,7 +28,8 @@ import os, types, sys
import svntest
# if somebody does a "from testcase import *", they only get these names
-__all__ = ['_XFail', '_Wimp', '_Skip', '_SkipUnless']
+__all__ = ['_XFail', '_Wimp', '_Skip', '_SkipUnless',
+ '_SkipDumpLoadCrossCheck']
RESULT_OK = 'ok'
RESULT_FAIL = 'fail'
@@ -135,7 +136,7 @@ class FunctionTestCase(TestCase):
is derived from the file name in which FUNC was defined)
"""
- def __init__(self, func, issues=None):
+ def __init__(self, func, issues=None, skip_cross_check=False):
# it better be a function that accepts an sbox parameter and has a
# docstring on it.
assert isinstance(func, types.FunctionType)
@@ -161,6 +162,7 @@ class FunctionTestCase(TestCase):
TestCase.__init__(self, doc=doc, issues=issues)
self.func = func
+ self.skip_cross_check = skip_cross_check
def get_function_name(self):
return self.func.func_name
@@ -173,7 +175,9 @@ class FunctionTestCase(TestCase):
return os.path.splitext(os.path.basename(filename))[0]
def run(self, sandbox):
- return self.func(sandbox)
+ result = self.func(sandbox)
+ sandbox.verify(skip_cross_check = self.skip_cross_check)
+ return result
class _XFail(TestCase):
@@ -261,11 +265,22 @@ class _SkipUnless(_Skip):
_Skip.__init__(self, test_case, lambda c=cond_func: not c())
-def create_test_case(func, issues=None):
+class _SkipDumpLoadCrossCheck(TestCase):
+ """A test that will skip the post-test dump/load cross-check."""
+
+ def __init__(self, test_case, cond_func=lambda: True, wip=None,
+ issues=None):
+ TestCase.__init__(self,
+ create_test_case(test_case, skip_cross_check=True),
+ cond_func, wip=wip, issues=issues)
+
+
+def create_test_case(func, issues=None, skip_cross_check=False):
if isinstance(func, TestCase):
return func
else:
- return FunctionTestCase(func, issues=issues)
+ return FunctionTestCase(func, issues=issues,
+ skip_cross_check=skip_cross_check)
# Various decorators to make declaring tests as such simpler
@@ -322,5 +337,15 @@ def Issues_deco(*issues):
return _second
+def SkipDumpLoadCrossCheck_deco(cond_func = lambda: True):
+ def _second(func):
+ if isinstance(func, TestCase):
+ return _SkipDumpLoadCrossCheck(func, cond_func, issues=func.issues)
+ else:
+ return _SkipDumpLoadCrossCheck(func, cond_func)
+
+ return _second
+
+
# Create a singular alias, for linguistic correctness
Issue_deco = Issues_deco
diff --git a/subversion/tests/cmdline/svntest/tree.py b/subversion/tests/cmdline/svntest/tree.py
index b8dd03e..676c96a 100644
--- a/subversion/tests/cmdline/svntest/tree.py
+++ b/subversion/tests/cmdline/svntest/tree.py
@@ -610,6 +610,11 @@ def detect_conflict_files(node, extra_files):
logger.warn(str(node))
raise SVNTreeUnequal(msg)
+def detect_conflict_files_done(extra_files):
+ """Done handler for detect_conflict_files"""
+ if len(extra_files):
+ raise SVNTreeError("Not all extra reject files have been accounted for")
+
###########################################################################
###########################################################################
# EXPORTED ROUTINES ARE BELOW
diff --git a/subversion/tests/cmdline/svntest/verify.py b/subversion/tests/cmdline/svntest/verify.py
index 1c0ae2e..e0da27f 100644
--- a/subversion/tests/cmdline/svntest/verify.py
+++ b/subversion/tests/cmdline/svntest/verify.py
@@ -212,6 +212,9 @@ class RegexOutput(ExpectedOutput):
def display_differences(self, message, label, actual):
display_lines(message, self.expected, actual, label + ' (regexp)', label)
+ def insert(self, index, line):
+ self.expected.insert(index, line)
+ self.expected_re = re.compile(self.expected)
class RegexListOutput(ExpectedOutput):
"""Matches an ordered list of regular expressions.
@@ -227,7 +230,7 @@ class RegexListOutput(ExpectedOutput):
def __init__(self, expected, match_all=True):
"EXPECTED is a list of regular expression strings."
- assert isinstance(expected, list) and expected != []
+ assert isinstance(expected, list)
ExpectedOutput.__init__(self, expected, match_all)
self.expected_res = [re.compile(e) for e in expected]
@@ -251,6 +254,10 @@ class RegexListOutput(ExpectedOutput):
def display_differences(self, message, label, actual):
display_lines(message, self.expected, actual, label + ' (regexp)', label)
+ def insert(self, index, line):
+ self.expected.insert(index, line)
+ self.expected_res = [re.compile(e) for e in self.expected]
+
class UnorderedOutput(ExpectedOutput):
"""Matches an unordered list of lines.
@@ -467,8 +474,10 @@ class DumpParser:
if not m:
if required:
raise SVNDumpParseError("expected '%s' at line %d\n%s"
+ "\nPrevious lines:\n%s"
% (regex, self.current,
- self.lines[self.current]))
+ self.lines[self.current],
+ ''.join(self.lines[max(0,self.current - 10):self.current])))
else:
return None
self.current += 1
@@ -484,6 +493,26 @@ class DumpParser:
self.current += 1
return True
+ def parse_header(self, header):
+ regex = '([^:]*): (.*)$'
+ m = re.match(regex, self.lines[self.current])
+ if not m:
+ raise SVNDumpParseError("expected a header at line %d, but found:\n%s"
+ % (self.current, self.lines[self.current]))
+ self.current += 1
+ return m.groups()
+
+ def parse_headers(self):
+ headers = []
+ while self.lines[self.current] != '\n':
+ key, val = self.parse_header(self)
+ headers.append((key, val))
+ return headers
+
+
+ def parse_boolean(self, header, required):
+ return self.parse_line(header + ': (false|true)$', required)
+
def parse_format(self):
return self.parse_line('SVN-fs-dump-format-version: ([0-9]+)$')
@@ -493,6 +522,9 @@ class DumpParser:
def parse_revision(self):
return self.parse_line('Revision-number: ([0-9]+)$')
+ def parse_prop_delta(self):
+ return self.parse_line('Prop-delta: (false|true)$', required=False)
+
def parse_prop_length(self, required=True):
return self.parse_line('Prop-content-length: ([0-9]+)$', required)
@@ -500,10 +532,7 @@ class DumpParser:
return self.parse_line('Content-length: ([0-9]+)$', required)
def parse_path(self):
- path = self.parse_line('Node-path: (.+)$', required=False)
- if not path and self.lines[self.current] == 'Node-path: \n':
- self.current += 1
- path = ''
+ path = self.parse_line('Node-path: (.*)$', required=False)
return path
def parse_kind(self):
@@ -534,17 +563,55 @@ class DumpParser:
def parse_text_sha1(self):
return self.parse_line('Text-content-sha1: ([0-9a-z]+)$', required=False)
+ def parse_text_delta(self):
+ return self.parse_line('Text-delta: (false|true)$', required=False)
+
+ def parse_text_delta_base_md5(self):
+ return self.parse_line('Text-delta-base-md5: ([0-9a-f]+)$', required=False)
+
+ def parse_text_delta_base_sha1(self):
+ return self.parse_line('Text-delta-base-sha1: ([0-9a-f]+)$', required=False)
+
def parse_text_length(self):
return self.parse_line('Text-content-length: ([0-9]+)$', required=False)
- # One day we may need to parse individual property name/values into a map
def get_props(self):
props = []
while not re.match('PROPS-END$', self.lines[self.current]):
props.append(self.lines[self.current])
self.current += 1
self.current += 1
- return props
+
+ # Split into key/value pairs to do an unordered comparison.
+ # This parses the serialized hash under the assumption that it is valid.
+ prophash = {}
+ curprop = [0]
+ while curprop[0] < len(props):
+ def read_key_or_value(curprop):
+ # klen / vlen
+ klen = int(props[curprop[0]].split()[1])
+ curprop[0] += 1
+
+ # key / value
+ key = ''
+ while len(key) != klen + 1:
+ key += props[curprop[0]]
+ curprop[0] += 1
+ key = key[:-1]
+
+ return key
+
+ if props[curprop[0]].startswith('K'):
+ key = read_key_or_value(curprop)
+ value = read_key_or_value(curprop)
+ elif props[curprop[0]].startswith('D'):
+ key = read_key_or_value(curprop)
+ value = None
+ else:
+ raise
+ prophash[key] = value
+
+ return prophash
def get_content(self, length):
content = ''
@@ -560,17 +627,43 @@ class DumpParser:
def parse_one_node(self):
node = {}
+
+ # optional 'kind' and required 'action' must be next
node['kind'] = self.parse_kind()
action = self.parse_action()
- node['copyfrom_rev'] = self.parse_copyfrom_rev()
- node['copyfrom_path'] = self.parse_copyfrom_path()
- node['copy_md5'] = self.parse_copy_md5()
- node['copy_sha1'] = self.parse_copy_sha1()
- node['prop_length'] = self.parse_prop_length(required=False)
- node['text_length'] = self.parse_text_length()
- node['text_md5'] = self.parse_text_md5()
- node['text_sha1'] = self.parse_text_sha1()
- node['content_length'] = self.parse_content_length(required=False)
+
+ # read any remaining headers
+ headers_list = self.parse_headers()
+ headers = dict(headers_list)
+
+ # Content-length must be last, if present
+ if 'Content-length' in headers and headers_list[-1][0] != 'Content-length':
+ raise SVNDumpParseError("'Content-length' header is not last, "
+ "in header block ending at line %d"
+ % (self.current,))
+
+ # parse the remaining optional headers and store in specific keys in NODE
+ for key, header, regex in [
+ ('copyfrom_rev', 'Node-copyfrom-rev', '([0-9]+)$'),
+ ('copyfrom_path', 'Node-copyfrom-path', '(.*)$'),
+ ('copy_md5', 'Text-copy-source-md5', '([0-9a-z]+)$'),
+ ('copy_sha1', 'Text-copy-source-sha1','([0-9a-z]+)$'),
+ ('prop_length', 'Prop-content-length', '([0-9]+)$'),
+ ('text_length', 'Text-content-length', '([0-9]+)$'),
+ ('text_md5', 'Text-content-md5', '([0-9a-z]+)$'),
+ ('text_sha1', 'Text-content-sha1', '([0-9a-z]+)$'),
+ ('content_length', 'Content-length', '([0-9]+)$'),
+ ]:
+ if not header in headers:
+ node[key] = None
+ continue
+ m = re.match(regex, headers[header])
+ if not m:
+ raise SVNDumpParseError("expected '%s' at line %d\n%s"
+ % (regex, self.current,
+ self.lines[self.current]))
+ node[key] = m.group(1)
+
self.parse_blank()
if node['prop_length']:
node['props'] = self.get_props()
@@ -592,7 +685,7 @@ class DumpParser:
if self.current >= len(self.lines):
break
path = self.parse_path()
- if not path and not path is '':
+ if path is None:
break
if not nodes.get(path):
nodes[path] = {}
@@ -630,7 +723,11 @@ class DumpParser:
self.parse_all_revisions()
return self.parsed
-def compare_dump_files(message, label, expected, actual):
+def compare_dump_files(message, label, expected, actual,
+ ignore_uuid=False,
+ expect_content_length_always=False,
+ ignore_empty_prop_sections=False,
+ ignore_number_of_blank_lines=False):
"""Parse two dump files EXPECTED and ACTUAL, both of which are lists
of lines as returned by run_and_verify_dump, and check that the same
revisions, nodes, properties, etc. are present in both dumps.
@@ -639,7 +736,219 @@ def compare_dump_files(message, label, expected, actual):
parsed_expected = DumpParser(expected).parse()
parsed_actual = DumpParser(actual).parse()
+ if ignore_uuid:
+ parsed_expected['uuid'] = '<ignored>'
+ parsed_actual['uuid'] = '<ignored>'
+
+ for parsed in [parsed_expected, parsed_actual]:
+ for rev_name, rev_record in parsed.items():
+ #print "Found %s" % (rev_name,)
+ if 'nodes' in rev_record:
+ #print "Found %s.%s" % (rev_name, 'nodes')
+ for path_name, path_record in rev_record['nodes'].items():
+ #print "Found %s.%s.%s" % (rev_name, 'nodes', path_name)
+ for action_name, action_record in path_record.items():
+ #print "Found %s.%s.%s.%s" % (rev_name, 'nodes', path_name, action_name)
+
+ if expect_content_length_always:
+ if action_record.get('content_length') == None:
+ #print 'Adding: %s.%s.%s.%s.%s' % (rev_name, 'nodes', path_name, action_name, 'content_length=0')
+ action_record['content_length'] = '0'
+ if ignore_empty_prop_sections:
+ if action_record.get('prop_length') == '10':
+ #print 'Removing: %s.%s.%s.%s.%s' % (rev_name, 'nodes', path_name, action_name, 'prop_length')
+ action_record['prop_length'] = None
+ del action_record['props']
+ old_content_length = int(action_record['content_length'])
+ action_record['content_length'] = str(old_content_length - 10)
+ if ignore_number_of_blank_lines:
+ action_record['blanks'] = 0
+
if parsed_expected != parsed_actual:
- raise svntest.Failure('\n' + '\n'.join(ndiff(
+ print 'DIFF of raw dumpfiles (including expected differences)'
+ print ''.join(ndiff(expected, actual))
+ raise svntest.Failure('DIFF of parsed dumpfiles (ignoring expected differences)\n'
+ + '\n'.join(ndiff(
pprint.pformat(parsed_expected).splitlines(),
pprint.pformat(parsed_actual).splitlines())))
+
+##########################################################################################
+## diff verifications
+def is_absolute_url(target):
+ return (target.startswith('file://')
+ or target.startswith('http://')
+ or target.startswith('https://')
+ or target.startswith('svn://')
+ or target.startswith('svn+ssh://'))
+
+def make_diff_header(path, old_tag, new_tag, src_label=None, dst_label=None):
+ """Generate the expected diff header for file PATH, with its old and new
+ versions described in parentheses by OLD_TAG and NEW_TAG. SRC_LABEL and
+ DST_LABEL are paths or urls that are added to the diff labels if we're
+ diffing against the repository or diffing two arbitrary paths.
+ Return the header as an array of newline-terminated strings."""
+ if src_label:
+ src_label = src_label.replace('\\', '/')
+ if not is_absolute_url(src_label):
+ src_label = '.../' + src_label
+ src_label = '\t(' + src_label + ')'
+ else:
+ src_label = ''
+ if dst_label:
+ dst_label = dst_label.replace('\\', '/')
+ if not is_absolute_url(dst_label):
+ dst_label = '.../' + dst_label
+ dst_label = '\t(' + dst_label + ')'
+ else:
+ dst_label = ''
+ path_as_shown = path.replace('\\', '/')
+ return [
+ "Index: " + path_as_shown + "\n",
+ "===================================================================\n",
+ "--- " + path_as_shown + src_label + "\t(" + old_tag + ")\n",
+ "+++ " + path_as_shown + dst_label + "\t(" + new_tag + ")\n",
+ ]
+
+def make_no_diff_deleted_header(path, old_tag, new_tag):
+ """Generate the expected diff header for a deleted file PATH when in
+ 'no-diff-deleted' mode. (In that mode, no further details appear after the
+ header.) Return the header as an array of newline-terminated strings."""
+ path_as_shown = path.replace('\\', '/')
+ return [
+ "Index: " + path_as_shown + " (deleted)\n",
+ "===================================================================\n",
+ ]
+
+def make_git_diff_header(target_path, repos_relpath,
+ old_tag, new_tag, add=False, src_label=None,
+ dst_label=None, delete=False, text_changes=True,
+ cp=False, mv=False, copyfrom_path=None,
+ copyfrom_rev=None):
+ """ Generate the expected 'git diff' header for file TARGET_PATH.
+ REPOS_RELPATH is the location of the path relative to the repository root.
+ The old and new versions ("revision X", or "working copy") must be
+ specified in OLD_TAG and NEW_TAG.
+ SRC_LABEL and DST_LABEL are paths or urls that are added to the diff
+ labels if we're diffing against the repository. ADD, DELETE, CP and MV
+ denotes the operations performed on the file. COPYFROM_PATH is the source
+ of a copy or move. Return the header as an array of newline-terminated
+ strings."""
+
+ path_as_shown = target_path.replace('\\', '/')
+ if src_label:
+ src_label = src_label.replace('\\', '/')
+ src_label = '\t(.../' + src_label + ')'
+ else:
+ src_label = ''
+ if dst_label:
+ dst_label = dst_label.replace('\\', '/')
+ dst_label = '\t(.../' + dst_label + ')'
+ else:
+ dst_label = ''
+
+ output = [
+ "Index: " + path_as_shown + "\n",
+ "===================================================================\n"
+ ]
+ if add:
+ output.extend([
+ "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
+ "new file mode 10644\n",
+ ])
+ if text_changes:
+ output.extend([
+ "--- /dev/null\t(" + old_tag + ")\n",
+ "+++ b/" + repos_relpath + dst_label + "\t(" + new_tag + ")\n"
+ ])
+ elif delete:
+ output.extend([
+ "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
+ "deleted file mode 10644\n",
+ ])
+ if text_changes:
+ output.extend([
+ "--- a/" + repos_relpath + src_label + "\t(" + old_tag + ")\n",
+ "+++ /dev/null\t(" + new_tag + ")\n"
+ ])
+ elif cp:
+ if copyfrom_rev:
+ copyfrom_rev = '@' + copyfrom_rev
+ else:
+ copyfrom_rev = ''
+ output.extend([
+ "diff --git a/" + copyfrom_path + " b/" + repos_relpath + "\n",
+ "copy from " + copyfrom_path + copyfrom_rev + "\n",
+ "copy to " + repos_relpath + "\n",
+ ])
+ if text_changes:
+ output.extend([
+ "--- a/" + copyfrom_path + src_label + "\t(" + old_tag + ")\n",
+ "+++ b/" + repos_relpath + "\t(" + new_tag + ")\n"
+ ])
+ elif mv:
+ output.extend([
+ "diff --git a/" + copyfrom_path + " b/" + path_as_shown + "\n",
+ "rename from " + copyfrom_path + "\n",
+ "rename to " + repos_relpath + "\n",
+ ])
+ if text_changes:
+ output.extend([
+ "--- a/" + copyfrom_path + src_label + "\t(" + old_tag + ")\n",
+ "+++ b/" + repos_relpath + "\t(" + new_tag + ")\n"
+ ])
+ else:
+ output.extend([
+ "diff --git a/" + repos_relpath + " b/" + repos_relpath + "\n",
+ "--- a/" + repos_relpath + src_label + "\t(" + old_tag + ")\n",
+ "+++ b/" + repos_relpath + dst_label + "\t(" + new_tag + ")\n",
+ ])
+ return output
+
+def make_diff_prop_header(path):
+ """Return a property diff sub-header, as a list of newline-terminated
+ strings."""
+ return [
+ "\n",
+ "Property changes on: " + path.replace('\\', '/') + "\n",
+ "___________________________________________________________________\n"
+ ]
+
+def make_diff_prop_val(plus_minus, pval):
+ "Return diff for prop value PVAL, with leading PLUS_MINUS (+ or -)."
+ if len(pval) > 0 and pval[-1] != '\n':
+ return [plus_minus + pval + "\n","\\ No newline at end of property\n"]
+ return [plus_minus + pval]
+
+def make_diff_prop_deleted(pname, pval):
+ """Return a property diff for deletion of property PNAME, old value PVAL.
+ PVAL is a single string with no embedded newlines. Return the result
+ as a list of newline-terminated strings."""
+ return [
+ "Deleted: " + pname + "\n",
+ "## -1 +0,0 ##\n"
+ ] + make_diff_prop_val("-", pval)
+
+def make_diff_prop_added(pname, pval):
+ """Return a property diff for addition of property PNAME, new value PVAL.
+ PVAL is a single string with no embedded newlines. Return the result
+ as a list of newline-terminated strings."""
+ return [
+ "Added: " + pname + "\n",
+ "## -0,0 +1 ##\n",
+ ] + make_diff_prop_val("+", pval)
+
+def make_diff_prop_modified(pname, pval1, pval2):
+ """Return a property diff for modification of property PNAME, old value
+ PVAL1, new value PVAL2.
+
+ PVAL is a single string with no embedded newlines. A newline at the
+ end is significant: without it, we add an extra line saying '\ No
+ newline at end of property'.
+
+ Return the result as a list of newline-terminated strings.
+ """
+ return [
+ "Modified: " + pname + "\n",
+ "## -1 +1 ##\n",
+ ] + make_diff_prop_val("-", pval1) + make_diff_prop_val("+", pval2)
+
diff --git a/subversion/tests/cmdline/svntest/wc.py b/subversion/tests/cmdline/svntest/wc.py
index 171c18d..ab98b00 100644
--- a/subversion/tests/cmdline/svntest/wc.py
+++ b/subversion/tests/cmdline/svntest/wc.py
@@ -141,12 +141,14 @@ class State:
self.desc.update(more_desc)
- def add_state(self, parent, state):
+ def add_state(self, parent, state, strict=False):
"Import state items from a State object, reparent the items to PARENT."
assert isinstance(state, State)
for path, item in state.desc.items():
- if path == '':
+ if strict:
+ path = parent + path
+ elif path == '':
path = parent
else:
path = parent + '/' + path
@@ -358,6 +360,11 @@ class State:
for p, i in self.desc.copy().items():
if p.startswith(path + '/'):
del self.desc[p]
+ elif item.entry_kind == 'file':
+ # A file has no descendants in svn_wc_entry_t
+ for p, i in self.desc.copy().items():
+ if p.startswith(path + '/'):
+ del self.desc[p]
else:
# when reading the entry structures, we don't examine for text or
# property mods, so clear those flags. we also do not examine the
@@ -434,7 +441,7 @@ class State:
return not self.__eq__(other)
@classmethod
- def from_status(cls, lines):
+ def from_status(cls, lines, wc_dir=None):
"""Create a State object from 'svn status' output."""
def not_space(value):
@@ -442,6 +449,17 @@ class State:
return value
return None
+ def parse_move(path, wc_dir):
+ if path.startswith('../'):
+ # ../ style paths are relative from the status root
+ return to_relpath(os.path.normpath(repos_join(wc_dir, path)))
+ else:
+ # Other paths are just relative from cwd
+ return to_relpath(path)
+
+ if not wc_dir:
+ wc_dir = ''
+
desc = { }
last = None
for line in lines:
@@ -455,15 +473,15 @@ class State:
if ex_match:
if ex_match.group('moved_from'):
- path = ex_match.group('moved_from')
- last.tweak(moved_from = to_relpath(path))
+ path = to_relpath(ex_match.group('moved_from'))
+ last.tweak(moved_from = parse_move(path, wc_dir))
elif ex_match.group('moved_to'):
- path = ex_match.group('moved_to')
- last.tweak(moved_to = to_relpath(path))
+ path = to_relpath(ex_match.group('moved_to'))
+ last.tweak(moved_to = parse_move(path, wc_dir))
elif ex_match.group('swapped_with'):
- path = ex_match.group('swapped_with')
- last.tweak(moved_to = to_relpath(path))
- last.tweak(moved_from = to_relpath(path))
+ path = to_relpath(ex_match.group('swapped_with'))
+ last.tweak(moved_to = parse_move(path, wc_dir))
+ last.tweak(moved_from = parse_move(path, wc_dir))
# Parse TC description?
@@ -590,6 +608,9 @@ class State:
if line.startswith('DBG:') or line.startswith('Transmitting'):
continue
+ if line.startswith('Committing transaction'):
+ continue
+
match = _re_parse_commit_ext.search(line)
if match:
desc[to_relpath(match.group(4))] = StateItem(verb=match.group(1))
@@ -666,8 +687,6 @@ class State:
})
desc = { }
- dot_svn = svntest.main.get_admin_name()
-
dump_data = svntest.main.run_entriesdump_tree(base)
if not dump_data:
@@ -675,6 +694,16 @@ class State:
# ### Improve!
return cls('', desc)
+ dirent_join = repos_join
+ if len(base) == 2 and base[1:]==':' and sys.platform=='win32':
+ # We have a win32 drive relative path... Auch. Fix joining
+ def drive_join(a, b):
+ if len(a) == 2:
+ return a+b
+ else:
+ return repos_join(a,b)
+ dirent_join = drive_join
+
for parent, entries in sorted(dump_data.items()):
parent_url = entries[''].url
@@ -696,11 +725,11 @@ class State:
# that we can't put the status as "! " because that gets tweaked
# out of our expected tree.
item = StateItem(status=' ', wc_rev='?')
- desc[repos_join(parent, name)] = item
+ desc[dirent_join(parent, name)] = item
continue
item = StateItem.from_entry(entry)
if name:
- desc[repos_join(parent, name)] = item
+ desc[dirent_join(parent, name)] = item
implied_url = repos_join(parent_url, svn_uri_quote(name))
else:
item._url = entry.url # attach URL to directory StateItems
@@ -731,7 +760,7 @@ class StateItem:
"""
def __init__(self, contents=None, props=None,
- status=None, verb=None, wc_rev=None,
+ status=None, verb=None, wc_rev=None, entry_kind=None,
entry_rev=None, entry_status=None, entry_copied=None,
locked=None, copied=None, switched=None, writelocked=None,
treeconflict=None, moved_from=None, moved_to=None,
@@ -758,6 +787,9 @@ class StateItem:
self.prev_verb = prev_verb
# The base revision number of the node in the WC, as a string.
self.wc_rev = wc_rev
+ # If 'file' specifies that the node is a file, and as such has no svn_wc_entry_t
+ # descendants
+ self.entry_kind = None
# These will be set when we expect the wc_rev/status to differ from those
# found in the entries code.
self.entry_rev = entry_rev
@@ -948,6 +980,20 @@ def svn_uri_quote(url):
# ------------
+def python_sqlite_can_read_wc():
+ """Check if the Python builtin is capable enough to peek into wc.db"""
+
+ try:
+ db = svntest.sqlite3.connect('')
+
+ c = db.cursor()
+ c.execute('select sqlite_version()')
+ ver = tuple(map(int, c.fetchall()[0][0].split('.')))
+
+ return ver >= (3, 6, 18) # Currently enough (1.7-1.9)
+ except:
+ return False
+
def open_wc_db(local_path):
"""Open the SQLite DB for the WC path LOCAL_PATH.
Return (DB object, WC root path, WC relpath of LOCAL_PATH)."""
diff --git a/subversion/tests/cmdline/svnversion_tests.py b/subversion/tests/cmdline/svnversion_tests.py
index ccc8e78..2ed6e46 100755
--- a/subversion/tests/cmdline/svnversion_tests.py
+++ b/subversion/tests/cmdline/svnversion_tests.py
@@ -50,47 +50,41 @@ def svnversion_test(sbox):
repo_url = sbox.repo_url
# Unmodified
- svntest.actions.run_and_verify_svnversion("Unmodified working copy",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1\n" ], [])
# Unmodified, whole wc switched
- svntest.actions.run_and_verify_svnversion("Unmodified switched working copy",
- wc_dir, "some/other/url",
+ svntest.actions.run_and_verify_svnversion(wc_dir, "some/other/url",
[ "1S\n" ], [])
mu_path = os.path.join(wc_dir, 'A', 'mu')
svntest.main.file_append(mu_path, 'appended mu text')
# Modified file
- svntest.actions.run_and_verify_svnversion("Modified file",
- mu_path, repo_url + '/A/mu',
+ svntest.actions.run_and_verify_svnversion(mu_path, repo_url + '/A/mu',
[ "1M\n" ], [])
# Text modified
- svntest.actions.run_and_verify_svnversion("Modified text", wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1M\n" ], [])
expected_output = wc.State(wc_dir, {'A/mu' : Item(verb='Sending')})
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
if svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir):
+ expected_output, expected_status):
raise svntest.Failure
# Unmodified, mixed
- svntest.actions.run_and_verify_svnversion("Unmodified mixed working copy",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1:2\n" ], [])
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'blue', 'azul',
os.path.join(wc_dir, 'A', 'mu'))
# Prop modified, mixed
- svntest.actions.run_and_verify_svnversion("Property modified mixed wc",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1:2M\n" ], [])
iota_path = os.path.join(wc_dir, 'iota')
@@ -108,45 +102,39 @@ def svnversion_test(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry'):
raise svntest.Failure
# Prop modified, mixed, part wc switched
- svntest.actions.run_and_verify_svnversion("Prop-mod mixed partly switched",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1:2MS\n" ], [])
# Plain (exported) directory that is a direct subdir of a versioned dir
Q_path = os.path.join(wc_dir, 'Q')
os.mkdir(Q_path)
- svntest.actions.run_and_verify_svnversion("Exported subdirectory",
- Q_path, repo_url,
+ svntest.actions.run_and_verify_svnversion(Q_path, repo_url,
[ "Unversioned directory\n" ], [])
# Plain (exported) directory that is not a direct subdir of a versioned dir
R_path = os.path.join(Q_path, 'Q')
os.mkdir(R_path)
- svntest.actions.run_and_verify_svnversion("Exported directory",
- R_path, repo_url,
+ svntest.actions.run_and_verify_svnversion(R_path, repo_url,
[ "Unversioned directory\n" ], [])
# Switched file
- svntest.actions.run_and_verify_svnversion("Switched file",
- iota_path, repo_url + '/iota',
+ svntest.actions.run_and_verify_svnversion(iota_path, repo_url + '/iota',
[ "2S\n" ], [])
# Unversioned file
kappa_path = os.path.join(wc_dir, 'kappa')
svntest.main.file_write(kappa_path, "This is the file 'kappa'.")
- svntest.actions.run_and_verify_svnversion("Unversioned file",
- kappa_path, repo_url,
+ svntest.actions.run_and_verify_svnversion(kappa_path, repo_url,
[ "Unversioned file\n" ], [])
# Nonexistent file or directory
X_path = os.path.join(wc_dir, 'Q', 'X')
- svntest.actions.run_and_verify_svnversion("Nonexistent file or directory",
- X_path, repo_url,
+ svntest.actions.run_and_verify_svnversion(X_path, repo_url,
None, [ "'%s' doesn't exist\n"
% os.path.abspath(X_path) ])
@@ -163,11 +151,10 @@ def svnversion_test(sbox):
})
svntest.actions.run_and_verify_checkout(repo_url + "/A", A_A_path,
expected_output, expected_disk,
- None, None, None, None,
- "--depth=files")
+ [], "--depth=files")
# Partial (sparse) checkout
- svntest.actions.run_and_verify_svnversion("Sparse checkout", A_A_path,
+ svntest.actions.run_and_verify_svnversion(A_A_path,
repo_url, [ "2SP\n" ], [])
@@ -188,7 +175,7 @@ ext-file -r 1 %s/A/D/H/omega
""" % (repo_url, repo_url)
(fd, tmp_f) = tempfile.mkstemp(dir=wc_dir)
svntest.main.file_append(tmp_f, externals_desc)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'pset',
'-F', tmp_f, 'svn:externals', C_path)
os.close(fd)
@@ -200,11 +187,10 @@ ext-file -r 1 %s/A/D/H/omega
expected_status.tweak('A/C', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Update to get it on disk
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
ext_dir_path = os.path.join(C_path, 'ext-dir')
ext_file_path = os.path.join(C_path, 'ext-file')
expected_infos = [
@@ -213,8 +199,7 @@ ext-file -r 1 %s/A/D/H/omega
]
svntest.actions.run_and_verify_info(expected_infos, ext_dir_path, ext_file_path)
- svntest.actions.run_and_verify_svnversion("working copy with svn:externals",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "2\n" ], [])
#----------------------------------------------------------------------
@@ -231,24 +216,21 @@ def svnversion_with_excluded_subtrees(sbox):
D_path = os.path.join(wc_dir, "A", "D")
psi_path = os.path.join(wc_dir, "A", "D", "H", "psi")
- svntest.actions.run_and_verify_svnversion("working copy with excluded dir",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1\n" ], [])
# Exclude a directory and check that svnversion detects it.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', B_path)
- svntest.actions.run_and_verify_svnversion("working copy with excluded dir",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1P\n" ], [])
# Exclude a file and check that svnversion detects it. Target the
# svnversion command on a subtree that does not contain the excluded
# directory to assure we a detecting the switched file.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '--set-depth', 'exclude', psi_path)
- svntest.actions.run_and_verify_svnversion("working copy with excluded file",
- D_path, repo_url + '/A/D',
+ svntest.actions.run_and_verify_svnversion(D_path, repo_url + '/A/D',
[ "1P\n" ], [])
def svnversion_with_structural_changes(sbox):
@@ -261,22 +243,20 @@ def svnversion_with_structural_changes(sbox):
iota_path = os.path.join(wc_dir, 'iota')
iota_copy_path = os.path.join(wc_dir, 'iota_copy')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', iota_path, iota_copy_path)
- svntest.actions.run_and_verify_svnversion("Copied file",
- iota_copy_path, repo_url +
+ svntest.actions.run_and_verify_svnversion(iota_copy_path, repo_url +
'/iota_copy',
[ "Uncommitted local addition, "
"copy or move\n" ],
[])
C_path = os.path.join(wc_dir, 'A', 'C')
C_copy_path = os.path.join(wc_dir, 'C_copy')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', C_path, C_copy_path)
- svntest.actions.run_and_verify_svnversion("Copied dir",
- C_copy_path, repo_url +
+ svntest.actions.run_and_verify_svnversion(C_copy_path, repo_url +
'/C_copy',
[ "Uncommitted local addition, "
"copy or move\n" ],
@@ -285,13 +265,12 @@ def svnversion_with_structural_changes(sbox):
# Test deletion
sbox.simple_rm('iota')
- svntest.actions.run_and_verify_svnversion("Deleted file",
- sbox.ospath('iota'),
+ svntest.actions.run_and_verify_svnversion(sbox.ospath('iota'),
repo_url + '/iota',
["1M\n"],
[],
)
- svntest.actions.run_and_verify_svnversion("Deleted file", wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1:2M\n" ], [])
def committed_revisions(sbox):
@@ -303,7 +282,7 @@ def committed_revisions(sbox):
sbox.simple_copy('iota', 'iota2')
sbox.simple_commit()
sbox.simple_update()
- svntest.actions.run_and_verify_svnversion("Committed revisions", wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1:2\n" ], [],
"--committed")
@@ -313,8 +292,7 @@ def non_reposroot_wc(sbox):
wc_dir = sbox.add_wc_path('wc2')
repo_url = sbox.repo_url + "/A/B"
svntest.main.run_svn(None, 'checkout', repo_url, wc_dir)
- svntest.actions.run_and_verify_svnversion("Non-repos-root wc dir",
- wc_dir, repo_url,
+ svntest.actions.run_and_verify_svnversion(wc_dir, repo_url,
[ "1\n" ], [])
@Issue(3858)
@@ -332,25 +310,24 @@ def child_switched(sbox):
### Target is repos root and WC root.
# No switches.
- svntest.actions.run_and_verify_svnversion(None, wc_dir, None,
+ svntest.actions.run_and_verify_svnversion(wc_dir, None,
[ "2\n" ], [])
# Switch A/B to a sibling.
sbox.simple_switch(repo_url + '/A/D', 'A/B')
# This should detect the switch at A/B.
- svntest.actions.run_and_verify_svnversion(None, wc_dir, None,
+ svntest.actions.run_and_verify_svnversion(wc_dir, None,
[ "2S\n" ], [])
### Target is neither repos root nor WC root.
# But A/B/G and its children are not switched by itself.
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'A/B/G'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'A/B/G'),
None, [ "2\n" ], [])
# And A/B isn't switched when you look at it directly.
- svntest.actions.run_and_verify_svnversion(None, os.path.join(wc_dir, 'A/B'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'A/B'),
None, [ "2\n" ], [])
# Switch branch/D to ^/A, then switch branch/D/G back to ^/branch/D/G so
@@ -359,37 +336,31 @@ def child_switched(sbox):
sbox.simple_switch(repo_url + '/branch/D/G', 'branch/D/G')
# This should detect the switch at branch/D and branch/D/G.
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'branch'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'branch'),
None, [ "2S\n" ], [])
# Directly targeting the switched branch/D should still detect the switch
# at branch/D/G even though the latter isn't switched against the root of
# the working copy.
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'branch',
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'branch',
'D'),
None, [ "2S\n" ], [])
# Switch A/B to ^/.
sbox.simple_switch(repo_url, 'A/B')
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir),
None, [ "2S\n" ], [])
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'A'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'A'),
None, [ "2S\n" ], [])
### Target is repos root but not WC root.
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'A', 'B'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'A', 'B'),
None, [ "2\n" ], [])
# Switch A/B/A/D/G to ^/A/D/H.
sbox.simple_switch(repo_url + '/A/D/H', 'A/B/A/D/G')
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'A', 'B'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'A', 'B'),
None, [ "2S\n" ], [])
### Target is not repos root but is WC root.
@@ -398,17 +369,14 @@ def child_switched(sbox):
# ^A/D/G.
sbox.simple_switch(repo_url + '/branch', '.')
sbox.simple_switch(repo_url + '/A/D/G', 'D/G')
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir,),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir,),
None, [ "2S\n" ], [])
### Target is neither repos root nor WC root.
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'D'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'D'),
None, [ "2S\n" ], [])
- svntest.actions.run_and_verify_svnversion(None,
- os.path.join(wc_dir, 'D', 'H'),
+ svntest.actions.run_and_verify_svnversion(os.path.join(wc_dir, 'D', 'H'),
None, [ "2\n" ], [])
########################################################################
diff --git a/subversion/tests/cmdline/switch_tests.py b/subversion/tests/cmdline/switch_tests.py
index 3f1e7ab..8712723 100755
--- a/subversion/tests/cmdline/switch_tests.py
+++ b/subversion/tests/cmdline/switch_tests.py
@@ -41,199 +41,8 @@ Wimp = svntest.testcase.Wimp_deco
Item = svntest.wc.StateItem
from svntest.main import SVN_PROP_MERGEINFO, server_has_mergeinfo
-from externals_tests import change_external
-
-
-### Bummer. It would be really nice to have easy access to the URL
-### member of our entries files so that switches could be testing by
-### examining the modified ancestry. But status doesn't show this
-### information. Hopefully in the future the cmdline binary will have
-### a subcommand for dumping multi-line detailed information about
-### versioned things. Until then, we'll stick with the traditional
-### verification methods.
-###
-### gjs says: we have 'svn info' now
-
-def get_routine_status_state(wc_dir):
- """get the routine status list for WC_DIR at the completion of an
- initial call to do_routine_switching()"""
-
- # Construct some paths for convenience
- ADH_path = os.path.join(wc_dir, 'A', 'D', 'H')
- chi_path = os.path.join(ADH_path, 'chi')
- omega_path = os.path.join(ADH_path, 'omega')
- psi_path = os.path.join(ADH_path, 'psi')
- pi_path = os.path.join(ADH_path, 'pi')
- tau_path = os.path.join(ADH_path, 'tau')
- rho_path = os.path.join(ADH_path, 'rho')
-
- # Now generate a state
- state = svntest.actions.get_virginal_state(wc_dir, 1)
- state.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F', 'A/B/lambda')
- state.add({
- 'A/B/pi' : Item(status=' ', wc_rev=1),
- 'A/B/tau' : Item(status=' ', wc_rev=1),
- 'A/B/rho' : Item(status=' ', wc_rev=1),
- })
-
- return state
-
-#----------------------------------------------------------------------
-
-def get_routine_disk_state(wc_dir):
- """get the routine disk list for WC_DIR at the completion of an
- initial call to do_routine_switching()"""
-
- disk = svntest.main.greek_state.copy()
-
- # iota has the same contents as gamma
- disk.tweak('iota', contents=disk.desc['A/D/gamma'].contents)
-
- # A/B/* no longer exist, but have been replaced by copies of A/D/G/*
- disk.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', 'A/B/F', 'A/B/lambda')
- disk.add({
- 'A/B/pi' : Item("This is the file 'pi'.\n"),
- 'A/B/rho' : Item("This is the file 'rho'.\n"),
- 'A/B/tau' : Item("This is the file 'tau'.\n"),
- })
-
- return disk
-
-#----------------------------------------------------------------------
-
-def do_routine_switching(wc_dir, repo_url, verify):
- """perform some routine switching of the working copy WC_DIR for
- other tests to use. If VERIFY, then do a full verification of the
- switching, else don't bother."""
-
- ### Switch the file `iota' to `A/D/gamma'.
-
- # Construct some paths for convenience
- iota_path = os.path.join(wc_dir, 'iota')
- gamma_url = repo_url + '/A/D/gamma'
-
- if verify:
- # Create expected output tree
- expected_output = svntest.wc.State(wc_dir, {
- 'iota' : Item(status='U '),
- })
-
- # Create expected disk tree (iota will have gamma's contents)
- expected_disk = svntest.main.greek_state.copy()
- expected_disk.tweak('iota',
- contents=expected_disk.desc['A/D/gamma'].contents)
-
- # Create expected status tree
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.tweak('iota', switched='S')
-
- # Do the switch and check the results in three ways.
- svntest.actions.run_and_verify_switch(wc_dir, iota_path, gamma_url,
- expected_output,
- expected_disk,
- expected_status,
- None, None, None, None, None,
- False, '--ignore-ancestry')
- else:
- svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
- gamma_url, iota_path)
-
- ### Switch the directory `A/B' to `A/D/G'.
-
- # Construct some paths for convenience
- AB_path = os.path.join(wc_dir, 'A', 'B')
- ADG_url = repo_url + '/A/D/G'
-
- if verify:
- # Create expected output tree
- expected_output = svntest.wc.State(wc_dir, {
- 'A/B/E' : Item(status='D '),
- 'A/B/F' : Item(status='D '),
- 'A/B/lambda' : Item(status='D '),
- 'A/B/pi' : Item(status='A '),
- 'A/B/tau' : Item(status='A '),
- 'A/B/rho' : Item(status='A '),
- })
-
- # Create expected disk tree (iota will have gamma's contents,
- # A/B/* will look like A/D/G/*)
- expected_disk = get_routine_disk_state(wc_dir)
-
- # Create expected status
- expected_status = get_routine_status_state(wc_dir)
- expected_status.tweak('iota', 'A/B', switched='S')
-
- # Do the switch and check the results in three ways.
- svntest.actions.run_and_verify_switch(wc_dir, AB_path, ADG_url,
- expected_output,
- expected_disk,
- expected_status,
- None, None, None, None, None,
- False, '--ignore-ancestry')
- else:
- svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
- ADG_url, AB_path)
-
-
-#----------------------------------------------------------------------
-
-def commit_routine_switching(wc_dir, verify):
- "Commit some stuff in a routinely-switched working copy."
-
- # Make some local mods
- iota_path = os.path.join(wc_dir, 'iota')
- Bpi_path = os.path.join(wc_dir, 'A', 'B', 'pi')
- Gpi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
- Z_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z')
- zeta_path = os.path.join(wc_dir, 'A', 'D', 'G', 'Z', 'zeta')
-
- svntest.main.file_append(iota_path, "apple")
- svntest.main.file_append(Bpi_path, "melon")
- svntest.main.file_append(Gpi_path, "banana")
- os.mkdir(Z_path)
- svntest.main.file_append(zeta_path, "This is the file 'zeta'.\n")
- svntest.main.run_svn(None, 'add', Z_path)
-
- # Try to commit. We expect this to fail because, if all the
- # switching went as expected, A/B/pi and A/D/G/pi point to the
- # same URL. We don't allow this.
- svntest.actions.run_and_verify_commit(
- wc_dir, None, None,
- "svn: E195003: Cannot commit both .* as they refer to the same URL$",
- wc_dir)
-
- # Okay, that all taken care of, let's revert the A/D/G/pi path and
- # move along. Afterward, we should be okay to commit. (Sorry,
- # holsta, that banana has to go...)
- svntest.main.run_svn(None, 'revert', Gpi_path)
-
- # Create expected output tree.
- expected_output = svntest.wc.State(wc_dir, {
- 'A/D/G/Z' : Item(verb='Adding'),
- 'A/D/G/Z/zeta' : Item(verb='Adding'),
- 'iota' : Item(verb='Sending'),
- 'A/B/pi' : Item(verb='Sending'),
- })
-
- # Created expected status tree.
- expected_status = get_routine_status_state(wc_dir)
- expected_status.tweak('iota', 'A/B', switched='S')
- expected_status.tweak('iota', 'A/B/pi', wc_rev=2, status=' ')
- expected_status.add({
- 'A/D/G/Z' : Item(status=' ', wc_rev=2),
- 'A/D/G/Z/zeta' : Item(status=' ', wc_rev=2),
- })
-
- # Commit should succeed
- if verify:
- svntest.actions.run_and_verify_commit(wc_dir,
- expected_output,
- expected_status,
- None, wc_dir)
- else:
- svntest.main.run_svn(None,
- 'ci', '-m', 'log msg', wc_dir)
-
+from svntest.deeptrees import do_routine_switching, commit_routine_switching, \
+ get_routine_disk_state, get_routine_status_state
######################################################################
# Tests
@@ -380,8 +189,7 @@ def full_rev_update(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '1', wc_dir)
#----------------------------------------------------------------------
@@ -438,8 +246,7 @@ def update_switched_things(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 0,
+ [], False,
B_path,
iota_path)
@@ -496,8 +303,7 @@ def rev_update_switched_things(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '1',
B_path,
iota_path)
@@ -542,12 +348,12 @@ def delete_subdir(sbox):
A2_url = sbox.repo_url + '/A2'
A2_B_F_url = sbox.repo_url + '/A2/B/F'
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'cp', '-m', 'make copy', A_url, A2_url)
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 3.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'], [],
'rm', '-m', 'delete subdir', A2_B_F_url)
expected_output = svntest.wc.State(wc_dir, {
@@ -565,8 +371,8 @@ def delete_subdir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- False, '--ignore-ancestry')
+ [], False,
+ '--ignore-ancestry')
#----------------------------------------------------------------------
# Issue 1532: Switch a file to a dir: can't switch it back to the file
@@ -581,7 +387,7 @@ def file_dir_file(sbox):
file_url = sbox.repo_url + '/iota'
dir_url = sbox.repo_url + '/A/C'
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
'--ignore-ancestry', dir_url, file_path)
if not os.path.isdir(file_path):
raise svntest.Failure
@@ -591,7 +397,7 @@ def file_dir_file(sbox):
# In this specific case the switch editor is designed to be rooted on the node
# itself instead of its ancestor. If you would use sbox.ospath('A') for
# file_path the switch works both ways.
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
'--ignore-ancestry', file_url, file_path)
if not os.path.isfile(file_path):
raise svntest.Failure
@@ -633,10 +439,10 @@ def nonrecursive_switching(sbox):
'up', wc1_dir)
svntest.main.file_append(wc1_new_file, "This is the file 'newfile'.\n")
svntest.main.run_svn(None, 'add', wc1_new_file)
- svntest.main.run_svn(None, 'ci', '-m', '', wc1_dir)
+ sbox.simple_commit()
# Try to switch "wc2" to the branch (non-recursively)
- svntest.actions.run_and_verify_svn(None, None, [], 'switch', '-N',
+ svntest.actions.run_and_verify_svn(None, [], 'switch', '-N',
'--ignore-ancestry', version1_url, wc2_dir)
# Check the URLs of the (not switched) directories.
@@ -672,8 +478,8 @@ def failed_anchor_is_target(sbox):
# Make a directory 'G/psi' in the repository.
G_url = sbox.repo_url + '/A/D/G'
G_psi_url = G_url + '/psi'
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'mkdir', '-m', 'log msg', G_psi_url)
# Modify the file 'H/psi' locally.
@@ -682,7 +488,7 @@ def failed_anchor_is_target(sbox):
svntest.main.file_append(psi_path, "more text")
# This switch raises a tree conflict on 'psi', because of the local mods.
- svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
+ svntest.actions.run_and_verify_svn(svntest.verify.AnyOutput, [],
'switch', '--ignore-ancestry',
G_url, H_path)
@@ -733,8 +539,8 @@ def bad_intermediate_urls(sbox):
# First, make an extra subdirectory in C to match one in the root, plus
# another one inside of that.
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'mkdir', '-m', 'log msg',
url_A_C_A, url_A_C_A_Z)
@@ -780,8 +586,9 @@ def bad_intermediate_urls(sbox):
})
actions.run_and_verify_switch(wc_dir, wc_dir, url_A_C, expected_output,
- expected_disk, expected_status, None, None,
- None, None, None, False, '--ignore-ancestry')
+ expected_disk, expected_status,
+ [], False,
+ '--ignore-ancestry')
# However, the URL for wc/A should now reflect ^/A/C/A, not something else.
expected_infos = [
@@ -805,7 +612,7 @@ def bad_intermediate_urls(sbox):
expected_status.tweak('A/Z', treeconflict=None)
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
@@ -833,18 +640,18 @@ def obstructed_switch(sbox):
url_A_B_Esave = url + '/A/B/Esave'
# svn cp -m msgcopy url/A/B/E url/A/B/Esave
- expected_stdout = verify.UnorderedOutput([
- '\n',
+ expected_stdout = [
+ 'Committing transaction...\n',
'Committed revision 2.\n',
- ])
+ ]
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'cp', '-m',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'cp', '-m',
'msgcopy', url_A_B_E, url_A_B_Esave)
# svn rm A/B/E/alpha
expected_stdout = ['D ' + A_B_E_alpha + '\n']
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'rm',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'rm',
A_B_E_alpha)
# svn commit
@@ -855,8 +662,7 @@ def obstructed_switch(sbox):
expected_status = actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/B/E/alpha')
- actions.run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir)
+ actions.run_and_verify_commit(wc_dir, expected_output, expected_status)
# echo "hello" >> A/B/E/alpha
main.file_append(A_B_E_alpha, 'hello')
@@ -877,8 +683,8 @@ def obstructed_switch(sbox):
actions.run_and_verify_switch(wc_dir, A_B_E, url_A_B_Esave,
expected_output, expected_disk,
- expected_status, None, None, None, None,
- None, False, '--ignore-ancestry')
+ expected_status,
+ [], False, '--ignore-ancestry')
# svn status
expected_status.add({
@@ -893,7 +699,7 @@ def obstructed_switch(sbox):
expected_stdout = verify.RegexOutput(
".*local file unversioned, incoming file add upon switch",
match_all=False)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'info',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'info',
A_B_E_alpha)
@@ -934,11 +740,11 @@ def commit_mods_below_switch(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
D_path = sbox.ospath('A/D')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'x', 'x', C_path, D_path)
expected_status.tweak('A/C', 'A/D', status=' M')
@@ -954,7 +760,7 @@ def commit_mods_below_switch(sbox):
# with "'A/C/E' is missing or not locked"
svntest.actions.run_and_verify_commit(wc_dir,
expected_output, expected_status,
- None, C_path, D_path)
+ [], C_path, D_path)
#----------------------------------------------------------------------
# Issue 2306.
@@ -973,15 +779,15 @@ def refresh_read_only_attribute(sbox):
# Create a branch.
url = sbox.repo_url + '/A'
branch_url = sbox.repo_url + '/A-branch'
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'cp', '-m', 'svn:needs-lock not set',
url, branch_url)
# Set the svn:needs-lock property on a file from the "trunk".
A_path = sbox.ospath('A')
mu_path = os.path.join(A_path, 'mu')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:needs-lock', '1', mu_path)
# Commit the propset of svn:needs-lock.
@@ -992,7 +798,7 @@ def refresh_read_only_attribute(sbox):
expected_status.tweak('A/mu', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
expected_output, expected_status,
- None, mu_path)
+ [], mu_path)
# The file on which svn:needs-lock was set is now expected to be read-only.
if os.access(mu_path, os.W_OK):
@@ -1013,7 +819,7 @@ def refresh_read_only_attribute(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
# The file with we set svn:needs-lock on should now be writable, but
@@ -1042,8 +848,8 @@ def switch_change_repos_root(sbox):
# Test 1: A switch that changes to a non-existing repo shouldn't work.
expected_err = ".*Unable to open repository.*|.*Could not open.*|"\
- ".*No repository found.*"
- svntest.actions.run_and_verify_svn(None, None,
+ ".*Could not find.*|.*No repository found.*"
+ svntest.actions.run_and_verify_svn(None,
expected_err,
'switch', '--ignore-ancestry',
other_A_url, A_wc_dir)
@@ -1053,7 +859,7 @@ def switch_change_repos_root(sbox):
other_A_url = other_repo_url + "/A"
svntest.main.create_repos(other_repo_dir)
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
".*UUID.*",
'switch', '--ignore-ancestry',
other_A_url, A_wc_dir)
@@ -1136,8 +942,7 @@ def forced_switch(sbox):
svntest.actions.run_and_verify_switch(sbox.wc_dir, F_path, AD_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status, [], False,
'--force', '--ignore-ancestry')
#----------------------------------------------------------------------
@@ -1211,8 +1016,8 @@ def forced_switch_failures(sbox):
main.file_write(A_C_H, "The file 'H'\n")
# Test three cases where forced switch should cause a tree conflict
- # 1) A forced switch that tries to add a file when an unversioned
- # directory of the same name already exists. (Currently fails)
+ # 1) A forced switch that tries to add a directory when an unversioned
+ # file of the same name already exists. (Currently fails)
# svn switch --force url/A/D A/C
expected_output = svntest.wc.State(wc_dir, {
'A/C/G' : Item(status='A '),
@@ -1252,12 +1057,12 @@ def forced_switch_failures(sbox):
expected_status.tweak('A/C', switched='S')
actions.run_and_verify_switch(wc_dir, A_C, url_A_D, expected_output,
- expected_disk, expected_status, None, None,
- None, None, None, False, '--force',
+ expected_disk, expected_status, [], False,
+ '--force',
'--ignore-ancestry')
- # 2) A forced switch that tries to add a dir when a file of the same
+ # 2) A forced switch that tries to add a file when a dir of the same
# name already exists. (Tree conflict)
# svn switch --force url/A/D/G A/B/F
expected_output = svntest.wc.State(wc_dir, {
@@ -1279,16 +1084,16 @@ def forced_switch_failures(sbox):
expected_status.tweak('A/B/F', switched='S')
actions.run_and_verify_switch(wc_dir, A_B_F, url_A_D_G, expected_output,
- expected_disk, expected_status, None, None,
- None, None, None, False, '--force',
+ expected_disk, expected_status, [], False,
+ '--force',
'--ignore-ancestry')
# svn info A/B/F/pi
expected_stdout = verify.ExpectedOutput(
- 'Tree conflict: local file unversioned, incoming file add upon switch\n',
+ 'Tree conflict: local dir unversioned, incoming file add upon switch\n',
match_all=False)
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'info',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'info',
A_B_F_pi)
@@ -1297,11 +1102,11 @@ def forced_switch_failures(sbox):
# Make dir A/D/H/I in repos.
# svn mkdir -m "Log message" url/A/D/H/I
expected_stdout = verify.UnorderedOutput([
- '\n',
+ 'Committing transaction...\n',
'Committed revision 2.\n',
])
- actions.run_and_verify_svn2('OUTPUT', expected_stdout, [], 0, 'mkdir',
+ actions.run_and_verify_svn2(expected_stdout, [], 0, 'mkdir',
'-m', 'Log message', url_A_D_H_I)
# Make A/D/G/I and co A/D/H/I into it.
@@ -1316,7 +1121,6 @@ def forced_switch_failures(sbox):
})
exit_code, so, se = svntest.actions.run_and_verify_svn(
- "Unexpected error during co",
['Checked out revision 2.\n'], [],
"co", url_A_D_H_I, A_D_G_I)
@@ -1334,9 +1138,8 @@ def forced_switch_failures(sbox):
})
actions.run_and_verify_switch(wc_dir, A_D_G, url_A_D_H, expected_output,
- None, None, None,
- None, None, None, None,
- False, '--force', '--ignore-ancestry')
+ None, None, [], False,
+ '--force', '--ignore-ancestry')
# Delete all three obstructions and finish the update.
# rm -rf A/D/G/I
@@ -1395,7 +1198,7 @@ def forced_switch_failures(sbox):
svntest.main.run_svn(None, 'revert', '-R', sbox.ospath('A/C/H'))
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
def switch_with_obstructing_local_adds(sbox):
@@ -1428,7 +1231,7 @@ def switch_with_obstructing_local_adds(sbox):
"This is the unversioned file 'upsilon'.\n")
# Add the above obstructions.
- svntest.actions.run_and_verify_svn("Add error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', G_path, I_path,
gamma_copy_path)
@@ -1474,9 +1277,6 @@ def switch_with_obstructing_local_adds(sbox):
'A/B/F/I' : Item(status='A ', wc_rev='-', entry_rev='0'),
})
- # "Extra" files that we expect to result from the conflicts.
- extra_files = ['pi\.r0', 'pi\.r1', 'pi\.mine']
-
# Do the switch and check the results in three ways.
F_path = sbox.ospath('A/B/F')
D_url = sbox.repo_url + '/A/D'
@@ -1485,9 +1285,7 @@ def switch_with_obstructing_local_adds(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files, None, None, False,
+ [], False,
'--ignore-ancestry')
#----------------------------------------------------------------------
@@ -1502,15 +1300,15 @@ def switch_scheduled_add(sbox):
nodo_path = sbox.ospath('nodo')
svntest.main.file_append(file_path, "")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'add', file_path)
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E200007: Cannot switch '.*file' " +
"because it is not in the repository yet",
'switch', '--ignore-ancestry',
switch_url, file_path)
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E155010: The node '.*nodo' was not",
'switch', '--ignore-ancestry',
switch_url, nodo_path)
@@ -1546,7 +1344,7 @@ def mergeinfo_switch_elision(sbox):
"Checked out revision 1.\n",
"A " + B_COPY_1_path + "\n",
])
- svntest.actions.run_and_verify_svn(None, expected_stdout, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected_stdout, [], 'copy',
sbox.repo_url + "/A/B", B_COPY_1_path)
expected_stdout = verify.UnorderedOutput([
@@ -1558,7 +1356,7 @@ def mergeinfo_switch_elision(sbox):
"Checked out revision 1.\n",
"A " + B_COPY_2_path + "\n",
])
- svntest.actions.run_and_verify_svn(None, expected_stdout, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected_stdout, [], 'copy',
sbox.repo_url + "/A/B", B_COPY_2_path)
expected_output = svntest.wc.State(wc_dir, {
@@ -1583,9 +1381,7 @@ def mergeinfo_switch_elision(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make some changes under A/B
@@ -1595,7 +1391,7 @@ def mergeinfo_switch_elision(sbox):
{'A/B/E/beta' : Item(verb='Sending')})
expected_status.tweak('A/B/E/beta', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r4 - modify and commit A/B/E/alpha
svntest.main.file_write(alpha_path, "New content")
@@ -1603,7 +1399,7 @@ def mergeinfo_switch_elision(sbox):
{'A/B/E/alpha' : Item(verb='Sending')})
expected_status.tweak('A/B/E/alpha', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge r2:4 into A/B_COPY_1
expected_output = svntest.wc.State(B_COPY_1_path, {
@@ -1640,8 +1436,7 @@ def mergeinfo_switch_elision(sbox):
expected_merge_disk,
expected_merge_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# r5 - Commit the merge into A/B_COPY_1/E
expected_output = svntest.wc.State(
@@ -1655,7 +1450,7 @@ def mergeinfo_switch_elision(sbox):
expected_status.tweak('A/B_COPY_1/E/beta', wc_rev=5)
expected_status.tweak('A/B_COPY_1/lambda', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge r2:4 into A/B_COPY_2/E
expected_output = svntest.wc.State(E_COPY_2_path, {
@@ -1686,8 +1481,7 @@ def mergeinfo_switch_elision(sbox):
expected_merge_disk,
expected_merge_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# Switch A/B_COPY_2 to URL of A/B_COPY_1. The local mergeinfo for r1,3-4
# on A/B_COPY_2/E is identical to the mergeinfo added to A/B_COPY_2 as a
@@ -1741,7 +1535,7 @@ def mergeinfo_switch_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, True,
+ [], True,
'--ignore-ancestry')
# Now check a switch which reverses and earlier switch and leaves
@@ -1763,11 +1557,10 @@ def mergeinfo_switch_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, True,
+ [], True,
'--ignore-ancestry')
- svntest.actions.run_and_verify_svn(None,
- ["property '" + SVN_PROP_MERGEINFO +
+ svntest.actions.run_and_verify_svn(["property '" + SVN_PROP_MERGEINFO +
"' set on '" + lambda_path + "'" +
"\n"], [], 'ps', SVN_PROP_MERGEINFO,
'/A/B/lambda:3-4', lambda_path)
@@ -1785,7 +1578,7 @@ def mergeinfo_switch_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, True,
+ [], True,
'--ignore-ancestry')
#----------------------------------------------------------------------
@@ -1815,8 +1608,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AD_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'empty', '--ignore-ancestry')
# Set up expected results for reverting 'switch --depth=empty'
@@ -1827,8 +1620,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AB_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'empty', '--ignore-ancestry')
# Set up expected results of 'switch --depth=files'
@@ -1854,8 +1647,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AD_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'files', '--ignore-ancestry')
# Set up expected results for reverting 'switch --depth=files'
@@ -1869,8 +1662,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AB_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'files', '--ignore-ancestry')
# Putting the depth=immediates stuff in a subroutine, because we're
@@ -1907,8 +1700,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AD_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'immediates',
'--ignore-ancestry')
@@ -1932,8 +1725,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AB_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--ignore-ancestry')
# Okay, repeat 'switch --depth=immediates'. (Afterwards we'll
@@ -1958,8 +1751,8 @@ def switch_with_depth(sbox):
svntest.actions.run_and_verify_switch(wc_dir, AB_path, AB_url,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'--depth', 'infinity',
'--ignore-ancestry')
@@ -1976,24 +1769,18 @@ def switch_to_dir_with_peg_rev(sbox):
X_path = sbox.ospath('X')
Y_path = sbox.ospath('Y')
svntest.main.run_svn(None, 'mkdir', X_path, Y_path)
- svntest.main.run_svn(None, 'ci',
- '-m', 'log message',
- wc_dir)
+ sbox.simple_commit(message='log message')
# change tau in rev. 3
ADG_path = sbox.ospath('A/D/G')
tau_path = os.path.join(ADG_path, 'tau')
svntest.main.file_append(tau_path, "new line\n")
- svntest.main.run_svn(None, 'ci',
- '-m', 'log message',
- wc_dir)
+ sbox.simple_commit(message='log message')
# delete A/D/G in rev. 4
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.run_svn(None, 'rm', ADG_path)
- svntest.main.run_svn(None, 'ci',
- '-m', 'log message',
- wc_dir)
+ sbox.simple_commit(message='log message')
# Test 1: switch X to A/D/G@2
ADG_url = repo_url + '/A/D/G'
@@ -2025,8 +1812,8 @@ def switch_to_dir_with_peg_rev(sbox):
svntest.actions.run_and_verify_switch(wc_dir, X_path, ADG_url + '@3',
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status,
+ [], False,
'-r', '2', '--ignore-ancestry')
def switch_urls_with_spaces(sbox):
@@ -2047,7 +1834,7 @@ def switch_urls_with_spaces(sbox):
svntest.main.file_write(bbb_path, "This is the file 'bar baz bal'.\n")
svntest.main.run_svn(None, 'add', tpm_path, bbb_path)
- svntest.main.run_svn(None, 'ci', '-m', 'log message', wc_dir)
+ sbox.simple_commit(message='log message')
# Test 1: switch directory 'A B C' to url 'X Y Z'
XYZ_url = repo_url + '/X Y Z'
@@ -2072,7 +1859,7 @@ def switch_urls_with_spaces(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
# Test 2: switch file 'bar baz bal' to 'tau pau mau'
@@ -2099,7 +1886,7 @@ def switch_urls_with_spaces(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
def switch_to_dir_with_peg_rev2(sbox):
@@ -2112,23 +1899,19 @@ def switch_to_dir_with_peg_rev2(sbox):
# prepare dir X in rev. 2
X_path = sbox.ospath('X')
svntest.main.run_svn(None, 'mkdir', X_path)
- svntest.main.run_svn(None, 'ci',
- '-m', 'log message',
- wc_dir)
+ sbox.simple_commit(message='log message')
# make a change in ADG in rev. 3
tau_path = sbox.ospath('A/D/G/tau')
svntest.main.file_append(tau_path, "extra line\n")
- svntest.main.run_svn(None, 'ci', '-m', 'log message', wc_dir)
+ sbox.simple_commit(message='log message')
# Rename ADG to ADY in rev 4
svntest.main.run_svn(None, 'up', wc_dir)
ADG_path = sbox.ospath('A/D/G')
ADY_path = sbox.ospath('A/D/Y')
svntest.main.run_svn(None, 'mv', ADG_path, ADY_path)
- svntest.main.run_svn(None, 'ci',
- '-m', 'log message',
- wc_dir)
+ sbox.simple_commit(message='log message')
# Test switch X to rev 2 of A/D/Y@HEAD
ADY_url = sbox.repo_url + '/A/D/Y'
@@ -2166,8 +1949,7 @@ def switch_to_dir_with_peg_rev2(sbox):
svntest.actions.run_and_verify_switch(wc_dir, X_path, ADY_url + '@HEAD',
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, False,
+ expected_status, [], False,
'-r', '2', '--ignore-ancestry')
def switch_to_root(sbox):
@@ -2219,7 +2001,7 @@ def switch_to_root(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
#----------------------------------------------------------------------
@@ -2239,19 +2021,19 @@ def tolerate_local_mods(sbox):
A_url = sbox.repo_url + '/A'
A2_url = sbox.repo_url + '/A2'
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'cp', '-m', 'make copy', A_url, A2_url)
os.mkdir(L_path)
svntest.main.run_svn(None, 'add', L_path)
- svntest.main.run_svn(None, 'ci', '-m', 'Commit added folder', wc_dir)
+ sbox.simple_commit(message='Commit added folder')
# locally modified unversioned file
svntest.main.file_write(LM_path, 'Locally modified file.\n', 'w+')
expected_output = svntest.wc.State(wc_dir, {
- 'A/L' : Item(status='D '),
+ 'A/L' : Item(status=' ', treeconflict='C'),
})
expected_disk = svntest.main.greek_state.copy()
@@ -2263,13 +2045,16 @@ def tolerate_local_mods(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
expected_status.tweak('', 'iota', wc_rev=1)
expected_status.tweak('A', switched='S')
+ expected_status.add({
+ 'A/L' : Item(status='A ', copied='+', treeconflict='C', wc_rev='-')
+ })
# Used to fail with locally modified or unversioned files
svntest.actions.run_and_verify_switch(wc_dir, A_path, A2_url,
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
+ [],
False, '--ignore-ancestry')
#----------------------------------------------------------------------
@@ -2291,8 +2076,6 @@ disk_after_leaf_edit = svntest.deeptrees.deep_trees_after_leaf_edit
disk_after_leaf_del = svntest.deeptrees.deep_trees_after_leaf_del
disk_after_tree_del = svntest.deeptrees.deep_trees_after_tree_del
-disk_empty_dirs = svntest.deeptrees.deep_trees_empty_dirs
-
deep_trees_conflict_output = svntest.deeptrees.deep_trees_conflict_output
deep_trees_conflict_output_skipped = \
svntest.deeptrees.deep_trees_conflict_output_skipped
@@ -2327,10 +2110,14 @@ def tree_conflicts_on_switch_1_1(sbox):
'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='U')
})
- expected_disk = disk_empty_dirs.copy()
- expected_disk.remove('D/D1', 'DF/D1', 'DD/D1', 'DD/D1/D2',
- 'DDF/D1', 'DDF/D1/D2',
- 'DDD/D1', 'DDD/D1/D2', 'DDD/D1/D2/D3')
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
# The files delta, epsilon, and zeta are incoming additions, but since
# they are all within locally deleted trees they should also be schedule
@@ -2413,7 +2200,14 @@ def tree_conflicts_on_switch_1_2(sbox):
'DF/D1/beta' : Item(status=' ', treeconflict='D'),
})
- expected_disk = disk_empty_dirs.copy()
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
expected_status = deep_trees_status_local_tree_del.copy()
@@ -2436,18 +2230,11 @@ def tree_conflicts_on_switch_1_2(sbox):
'DDD/D1/D2/D3',
'DDF/D1/D2/gamma',
'DF/D1/beta')
- ### Why does the deep trees state not include files?
- expected_disk.remove('D/D1',
- 'DD/D1/D2',
- 'DDD/D1/D2/D3')
- expected_disk.remove('DF/D1', 'DD/D1',
- 'DDF/D1', 'DDF/D1/D2',
- 'DDD/D1', 'DDD/D1/D2')
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon switch'
+ '^local file delete, incoming file delete or move upon switch'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
@@ -2465,7 +2252,7 @@ def tree_conflicts_on_switch_1_2(sbox):
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
@@ -2530,37 +2317,37 @@ def tree_conflicts_on_switch_2_1(sbox):
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file edit, incoming file delete upon switch'
+ '^local file edit, incoming file delete or move upon switch'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -2591,7 +2378,14 @@ def tree_conflicts_on_switch_2_2(sbox):
### when dirs_same_p() is implemented)
expected_output = deep_trees_conflict_output
- expected_disk = disk_empty_dirs.copy()
+ expected_disk = svntest.wc.State('', {
+ 'DDF/D1/D2' : Item(),
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF/D1' : Item(),
+ 'DD/D1' : Item(),
+ 'DDD/D1/D2' : Item(),
+ })
expected_status = svntest.deeptrees.deep_trees_virginal_state.copy()
expected_status.add({'' : Item(),
@@ -2602,64 +2396,51 @@ def tree_conflicts_on_switch_2_2(sbox):
# Expect the incoming tree deletes and the local leaf deletes to mean
# that all deleted paths are *really* gone, not simply scheduled for
# deletion.
- expected_status.tweak('F/alpha',
- 'D/D1',
- 'DD/D1',
- 'DF/D1',
- 'DDD/D1',
- 'DDF/D1',
+ expected_status.tweak('DD/D1', 'DF/D1', 'DDF/D1', 'DDD/D1',
+ status='A ', copied='+', treeconflict='C',
+ wc_rev='-')
+ expected_status.tweak('DDF/D1/D2', 'DDD/D1/D2',
+ copied='+', wc_rev='-')
+ expected_status.tweak('DD/D1/D2', 'DF/D1/beta', 'DDD/D1/D2/D3',
+ 'DDF/D1/D2/gamma',
+ status='D ', copied='+', wc_rev='-')
+ expected_status.tweak('F/alpha', 'D/D1',
status='! ', treeconflict='C', wc_rev=None)
- # Remove from expected status and disk everything below the deleted paths.
- expected_status.remove('DD/D1/D2',
- 'DF/D1/beta',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1/D2',
- 'DDF/D1/D2/gamma',)
- expected_disk.remove('D/D1',
- 'DD/D1',
- 'DD/D1/D2',
- 'DF/D1',
- 'DDD/D1',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1',
- 'DDF/D1/D2',)
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon switch'
+ '^local file delete, incoming file delete or move upon switch'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir edit, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -2683,7 +2464,14 @@ def tree_conflicts_on_switch_3(sbox):
expected_output = deep_trees_conflict_output
- expected_disk = disk_empty_dirs.copy()
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
expected_status = deep_trees_status_local_tree_del.copy()
expected_status.tweak('', switched='S')
@@ -2705,50 +2493,41 @@ def tree_conflicts_on_switch_3(sbox):
'DDD/D1/D2/D3',
'DDF/D1/D2',
'DDF/D1/D2/gamma',)
- expected_disk.remove('D/D1',
- 'DD/D1',
- 'DD/D1/D2',
- 'DF/D1',
- 'DDD/D1',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1',
- 'DDF/D1/D2',)
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon switch'
+ '^local file delete, incoming file delete or move upon switch'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon switch'
+ '^local dir delete, incoming dir delete or move upon switch'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -2779,7 +2558,7 @@ def copy_with_switched_subdir(sbox):
svntest.actions.run_and_verify_status(wc_dir, state)
# Switch A/D/G
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
'--ignore-ancestry', E_url, G)
state.tweak('A/D/G', switched='S')
@@ -2791,7 +2570,7 @@ def copy_with_switched_subdir(sbox):
svntest.actions.run_and_verify_status(wc_dir, state)
# And now copy A/D and everything below it to R
- svntest.actions.run_and_verify_svn(None, None, [], 'cp', D, R)
+ svntest.actions.run_and_verify_svn(None, [], 'cp', D, R)
state.add({
'R' : Item(status='A ', copied='+', wc_rev='-'),
@@ -2807,22 +2586,21 @@ def copy_with_switched_subdir(sbox):
svntest.actions.run_and_verify_status(wc_dir, state)
- svntest.main.run_svn(None, 'ci', '-m', 'Commit added folder', wc_dir)
+ sbox.simple_commit(message='Commit added folder')
# Additional test, it should commit to R/G/alpha.
svntest.main.run_svn(None, 'up', wc_dir)
svntest.main.file_append(sbox.ospath('R/G/alpha'), "apple")
- svntest.main.run_svn(None, 'ci', '-m', 'Commit changed file', wc_dir)
+ sbox.simple_commit(message='Commit changed file')
# Checkout working copy to verify result
svntest.main.safe_rmtree(wc_dir, 1)
- svntest.actions.run_and_verify_svn(None,
- None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
sbox.repo_url, wc_dir)
# Switch A/D/G again to recreate state
- svntest.actions.run_and_verify_svn(None, None, [], 'switch',
+ svntest.actions.run_and_verify_svn(None, [], 'switch',
'--ignore-ancestry', E_url, G)
# Clear the statuses
@@ -2846,15 +2624,15 @@ def up_to_old_rev_with_subtree_switched_to_root(sbox):
# Starting with a vanilla greek tree, create a branch of A, switch
# that branch to the root of the repository, then update the WC to
# r1.
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', A_path,
+ svntest.actions.run_and_verify_svn(None, [], 'copy', A_path,
branch_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', wc_dir,
+ svntest.actions.run_and_verify_svn(None, [], 'ci', wc_dir,
'-m', 'Create a branch')
- svntest.actions.run_and_verify_svn(None, None, [], 'sw', sbox.repo_url,
+ svntest.actions.run_and_verify_svn(None, [], 'sw', sbox.repo_url,
branch_path, '--ignore-ancestry')
# Now update the WC to r1.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r1', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r1', wc_dir)
def different_node_kind(sbox):
"switch to a different node kind"
@@ -2877,9 +2655,9 @@ def different_node_kind(sbox):
expected_status.add_state(rel_path, pristine_status.subtree(rel_url))
svntest.actions.run_and_verify_switch(sbox.wc_dir, full_path, full_url,
None, expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
'--ignore-ancestry')
- svntest.actions.run_and_verify_svn(None, None, [], 'info', full_path)
+ svntest.actions.run_and_verify_svn(None, [], 'info', full_path)
if not os.path.isdir(full_path):
raise svntest.Failure
@@ -2893,9 +2671,9 @@ def different_node_kind(sbox):
expected_status.tweak(rel_path, switched='S')
svntest.actions.run_and_verify_switch(sbox.wc_dir, full_path, full_url,
None, expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
'--ignore-ancestry')
- svntest.actions.run_and_verify_svn(None, None, [], 'info', full_path)
+ svntest.actions.run_and_verify_svn(None, [], 'info', full_path)
if not os.path.isfile(full_path):
raise svntest.Failure
@@ -2915,12 +2693,12 @@ def switch_to_spaces(sbox):
repo_url = sbox.repo_url
# Paths are normalized in the command processing, so %20 is equivalent to ' '
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', repo_url + '/A',
repo_url + '/A%20with space',
'-m', '')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', repo_url + '/A%20with space',
repo_url + '/A with%20more spaces',
'-m', '')
@@ -2958,17 +2736,145 @@ def switch_across_replacement(sbox):
})
svntest.actions.run_and_verify_update(sbox.wc_dir,
expected_output, None, None,
- None, None, None, None, None, False,
+ [], False,
'-r1')
svntest.actions.run_and_verify_update(sbox.wc_dir,
expected_output, None, None,
- None, None, None, None, None, False,
+ [], False,
'-r2')
svntest.actions.run_and_verify_switch(sbox.wc_dir, sbox.ospath('A'), '^/A',
expected_output, None, None,
- None, None, None, None, None, False,
+ [], False,
'-r1')
+@Issue(1975)
+def switch_keywords(sbox):
+ "switch and svn:keywords"
+ sbox.build()
+ gamma_path = sbox.ospath('A/D/gamma')
+ psi_path = sbox.ospath('A/D/H/psi')
+
+ sbox.simple_propset('svn:keywords', 'URL', 'A/D/gamma')
+ svntest.main.file_write(gamma_path, "$URL$\n")
+ sbox.simple_propset('svn:keywords', 'URL', 'A/D/H/psi')
+ svntest.main.file_write(psi_path, "$URL$\n")
+ sbox.simple_commit()
+
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak('A/D/gamma',
+ contents="$URL: %s/A/D/gamma $\n" % sbox.repo_url)
+ expected_disk.tweak('A/D/H/psi',
+ contents="$URL: %s/A/D/H/psi $\n" % sbox.repo_url)
+
+ svntest.actions.run_and_verify_update(sbox.wc_dir,
+ None, expected_disk, None)
+ sbox.simple_copy('A', 'A_copy')
+ sbox.simple_commit()
+ sbox.simple_update()
+
+ # Next, we're going to switch A to A_copy, and expect keywords
+ # in the switched files gamma and psi to be updated accordingly.
+
+ expected_disk.add({
+ 'A_copy/D/H/chi' : Item(contents="This is the file 'chi'.\n"),
+ 'A_copy/D/H/psi' : Item(contents="$URL: %s/A_copy/D/H/psi $\n"
+ % sbox.repo_url),
+ 'A_copy/D/H/omega' : Item(contents="This is the file 'omega'.\n"),
+ 'A_copy/D/G/pi' : Item(contents="This is the file 'pi'.\n"),
+ 'A_copy/D/G/tau' : Item(contents="This is the file 'tau'.\n"),
+ 'A_copy/D/G/rho' : Item(contents="This is the file 'rho'.\n"),
+ 'A_copy/D/gamma' : Item(contents="$URL: %s/A_copy/D/gamma $\n"
+ % sbox.repo_url),
+ 'A_copy/B/F' : Item(),
+ 'A_copy/B/E/alpha' : Item(contents="This is the file 'alpha'.\n"),
+ 'A_copy/B/E/beta' : Item(contents="This is the file 'beta'.\n"),
+ 'A_copy/B/lambda' : Item(contents="This is the file 'lambda'.\n"),
+ 'A_copy/mu' : Item(contents="This is the file 'mu'.\n"),
+ 'A_copy/C' : Item(),
+ })
+
+ # update expected URL for switched gamma
+ expected_disk.tweak('A/D/gamma',
+ contents="$URL: %s/A_copy/D/gamma $\n" % sbox.repo_url)
+
+ # leave gamma unmodified, locally modify psi
+ svntest.main.file_write(psi_path, "$URL$\nnew line\n")
+ # update expected URL for switched psi
+ expected_disk.tweak('A/D/H/psi',
+ contents="$URL: %s/A_copy/D/H/psi $\nnew line\n"
+ % sbox.repo_url)
+
+ expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 3)
+ expected_status.add({
+ 'A_copy' : Item(status=' ', wc_rev='3'),
+ 'A_copy/mu' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/H' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/H/psi' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/H/chi' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/H/omega' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/gamma' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/G' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/G/rho' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/G/tau' : Item(status=' ', wc_rev='3'),
+ 'A_copy/D/G/pi' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B/E' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B/E/alpha' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B/E/beta' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B/F' : Item(status=' ', wc_rev='3'),
+ 'A_copy/B/lambda' : Item(status=' ', wc_rev='3'),
+ 'A_copy/C' : Item(status=' ', wc_rev='3'),
+ })
+ expected_status.tweak('A', switched='S')
+ expected_status.tweak('A/D/H/psi', status='M ')
+
+ # both gamma and psi should have update URLs after the switch
+ svntest.actions.run_and_verify_switch(sbox.wc_dir, sbox.ospath('A'), '^/A_copy',
+ None, expected_disk, expected_status)
+
+@Issue(4524)
+def switch_moves(sbox):
+ "switch moves on wc checkpoint"
+
+ sbox.build()
+
+ sbox.simple_move('A/B', 'B')
+ sbox.simple_rm('A')
+
+ branch_url = sbox.repo_url + '/branch'
+
+ svntest.actions.run_and_verify_svn(None, [],
+ 'cp', sbox.wc_dir, branch_url,
+ '-m', '')
+
+ expected_disk = svntest.wc.State('', {
+ 'B/E/alpha' : Item(contents="This is the file 'alpha'.\n"),
+ 'B/E/beta' : Item(contents="This is the file 'beta'.\n"),
+ 'B/lambda' : Item(contents="This is the file 'lambda'.\n"),
+ 'B/F' : Item(),
+ 'iota' : Item(contents="This is the file 'iota'.\n"),
+ })
+
+ expected_status = svntest.wc.State(sbox.wc_dir, {
+ '' : Item(status=' ', wc_rev='2'),
+ 'B' : Item(status='R ', copied='+', treeconflict='C', wc_rev='-'),
+ 'B/lambda' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/F' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/E' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/E/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/E/alpha' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A' : Item(status='! ', treeconflict='C'),
+ 'iota' : Item(status=' ', wc_rev='2'),
+ })
+
+ # In Subversion 1.8 this scenario causes an Sqlite row not found error.
+ # It would be nice if we could handle the tree conflict more intelligent, as
+ # the working copy matches the incomming change.
+ svntest.actions.run_and_verify_switch(sbox.wc_dir, sbox.ospath(''), branch_url,
+ None, expected_disk, expected_status)
+
+
########################################################################
# Run the tests
@@ -3011,6 +2917,8 @@ test_list = [ None,
different_node_kind,
switch_to_spaces,
switch_across_replacement,
+ switch_keywords,
+ switch_moves,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/trans_tests.py b/subversion/tests/cmdline/trans_tests.py
index 3dd4fd4..8aa2597 100755
--- a/subversion/tests/cmdline/trans_tests.py
+++ b/subversion/tests/cmdline/trans_tests.py
@@ -191,7 +191,7 @@ def setup_working_copy(wc_dir, value_len):
# Set the property keyword for PATH. Turn on all possible keywords.
### todo: Later, take list of keywords to set.
def keywords_on(path):
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
"svn:keywords",
"Author Rev Date URL Id Header",
path)
@@ -199,7 +199,7 @@ def keywords_on(path):
# Delete property NAME from versioned PATH in the working copy.
### todo: Later, take list of keywords to remove from the propval?
def keywords_off(path):
- svntest.actions.run_and_verify_svn(None, None, [], 'propdel',
+ svntest.actions.run_and_verify_svn(None, [], 'propdel',
"svn:keywords", path)
@@ -298,7 +298,7 @@ def keywords_from_birth(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- None, None, wc_dir)
+ None)
# Make sure the unexpanded URL keyword got expanded correctly.
fp = open(url_unexp_path, 'r')
@@ -449,9 +449,6 @@ def keywords_from_birth(sbox):
# This is a slight rewrite of his test, to use the run_and_verify_* API.
# This is for issue #631.
-def do_nothing(x, y):
- return 0
-
@Issue(631)
def update_modified_with_translation(sbox):
"update modified file with eol-style 'native'"
@@ -462,7 +459,7 @@ def update_modified_with_translation(sbox):
# Replace contents of rho and set eol translation to 'native'
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
svntest.main.file_write(rho_path, "1\n2\n3\n4\n5\n6\n7\n8\n9\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:eol-style', 'native',
rho_path)
@@ -479,7 +476,7 @@ def update_modified_with_translation(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None, rho_path)
+ [], rho_path)
# Change rho again
svntest.main.file_write(rho_path, "1\n2\n3\n4\n4.5\n5\n6\n7\n8\n9\n")
@@ -491,7 +488,7 @@ def update_modified_with_translation(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
- None, rho_path)
+ [], rho_path)
# Locally modify rho again.
svntest.main.file_write(rho_path, "1\n2\n3\n4\n4.5\n5\n6\n7\n8\n9\n10\n")
@@ -515,6 +512,17 @@ def update_modified_with_translation(sbox):
"8",
"9",
"10",
+ "||||||| .r3",
+ "1",
+ "2",
+ "3",
+ "4",
+ "4.5",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
"=======",
"This is the file 'rho'.",
">>>>>>> .r1",
@@ -522,13 +530,14 @@ def update_modified_with_translation(sbox):
# Updating back to revision 1 should not error; the merge should
# work, with eol-translation turned on.
+ extra_files = ['rho.r1', 'rho.r3', 'rho.mine']
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- do_nothing, None,
- None, None,
- 0, '-r', '1', wc_dir)
+ None,
+ [], False,
+ '-r', '1', wc_dir,
+ extra_files=extra_files)
#----------------------------------------------------------------------
@@ -559,23 +568,24 @@ def eol_change_is_text_mod(sbox):
f.close()
# commit the file
- svntest.actions.run_and_verify_svn(None, None, [], 'add', foo_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'add', foo_path)
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg',
foo_path)
if svntest.main.windows:
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:eol-style', 'LF', foo_path)
else:
- svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ svntest.actions.run_and_verify_svn(None, [], 'propset',
'svn:eol-style', 'CRLF', foo_path)
# check 1: did new contents get transmitted?
expected_output = ["Sending " + foo_path + "\n",
- "Transmitting file data .\n",
+ "Transmitting file data .done\n",
+ "Committing transaction...\n",
"Committed revision 3.\n"]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'ci', '-m', 'log msg', foo_path)
# check 2: do the files have the right contents now?
@@ -605,20 +615,20 @@ def keyword_expanded_on_checkout(sbox):
# The bug didn't occur if there were multiple files in the
# directory, so setup an empty directory.
Z_path = os.path.join(wc_dir, 'Z')
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', Z_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', Z_path)
# Add the file that has the keyword to be expanded
url_path = os.path.join(Z_path, 'url')
svntest.main.file_append(url_path, "$URL$")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', url_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', url_path)
keywords_on(url_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', wc_dir)
other_wc_dir = sbox.add_wc_path('other')
other_url_path = os.path.join(other_wc_dir, 'Z', 'url')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url,
other_wc_dir)
@@ -645,7 +655,7 @@ def cat_keyword_expansion(sbox):
# Set up A/mu to do $Rev$ keyword expansion
svntest.main.file_append(mu_path , "$Rev$\n$Author$")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords', 'Rev Author',
mu_path)
@@ -655,38 +665,35 @@ def cat_keyword_expansion(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Change the author to value which will get truncated on expansion
full_author = "x" * 400
key_author = "x" * 244
svntest.actions.enable_revprop_changes(sbox.repo_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', '--revprop', '-r2',
'svn:author', full_author,
sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, [ full_author ], [],
+ svntest.actions.run_and_verify_svn([ full_author ], [],
'propget', '--revprop', '-r2',
- 'svn:author', '--strict',
+ 'svn:author', '--no-newline',
sbox.wc_dir)
# Make another commit so that the last changed revision for A/mu is
# not HEAD.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'bar', lambda_path)
expected_output = wc.State(wc_dir, {
'A/B/lambda' : Item(verb='Sending'),
})
expected_status.tweak('A/B/lambda', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# At one stage the keywords were expanded to values for the requested
# revision, not to those committed revision
- svntest.actions.run_and_verify_svn(None,
- [ "This is the file 'mu'.\n",
+ svntest.actions.run_and_verify_svn([ "This is the file 'mu'.\n",
"$Rev: 2 $\n",
"$Author: " + key_author + " $"], [],
'cat', '-r', 'HEAD', mu_path)
@@ -702,8 +709,8 @@ def copy_propset_commit(sbox):
mu2_path = os.path.join(wc_dir, 'A', 'mu2')
# Copy and propset
- svntest.actions.run_and_verify_svn(None, None, [], 'copy', mu_path, mu2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'copy', mu_path, mu2_path)
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:eol-style', 'native',
mu2_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -718,8 +725,7 @@ def copy_propset_commit(sbox):
})
expected_status.tweak('A/mu2', status=' ', wc_rev=2, copied=None)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
#----------------------------------------------------------------------
# Create a greek tree, commit a keyword into one file,
@@ -741,11 +747,10 @@ def propset_commit_checkout_nocrash(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Set property to do keyword expansion on A/mu, commit.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords', 'Rev', mu_path)
expected_output = wc.State(wc_dir, {
'A/mu' : Item(verb='Sending'),
@@ -753,14 +758,13 @@ def propset_commit_checkout_nocrash(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir,
- expected_output, expected_status,
- None, wc_dir)
+ expected_output, expected_status)
# Check out into another wc dir
other_wc_dir = sbox.add_wc_path('other')
mu_other_path = os.path.join(other_wc_dir, 'A', 'mu')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url,
other_wc_dir)
@@ -783,14 +787,14 @@ def propset_revert_noerror(sbox):
# Set the Rev keyword for the mu file
# could use the keywords_on()/keywords_off() functions to
# set/del all svn:keywords
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'svn:keywords', 'Rev', mu_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak('A/mu', status=' M')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Revert the propset
- svntest.actions.run_and_verify_svn(None, None, [], 'revert', mu_path)
+ svntest.actions.run_and_verify_svn(None, [], 'revert', mu_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -822,9 +826,7 @@ def props_only_file_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Create r3 that drops svn:keywords
@@ -837,9 +839,7 @@ def props_only_file_update(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Now, go back to r2. iota should have the Author keyword expanded.
expected_disk = svntest.main.greek_state.copy()
@@ -849,9 +849,7 @@ def props_only_file_update(sbox):
svntest.actions.run_and_verify_update(wc_dir,
None, None, expected_status,
- None,
- None, None, None, None,
- False,
+ [], False,
wc_dir, '-r', '2')
if open(iota_path).read() != ''.join(content_expanded):
@@ -864,11 +862,7 @@ def props_only_file_update(sbox):
expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
svntest.actions.run_and_verify_update(wc_dir,
- None, expected_disk, expected_status,
- None,
- None, None, None, None,
- False,
- wc_dir)
+ None, expected_disk, expected_status)
if open(iota_path).read() != ''.join(content):
raise svntest.Failure("$Author$ is not contracted in 'iota'")
@@ -905,11 +899,11 @@ def autoprops_inconsistent_eol(sbox):
sbox.simple_add_text(text, 'add.c')
sbox.simple_add_text(text, 'add-force.c')
- svntest.actions.run_and_verify_svn(None, None, '.*inconsistent newlines.*',
+ svntest.actions.run_and_verify_svn(None, '.*inconsistent newlines.*',
'ps', 'svn:eol-style', 'native',
sbox.ospath('add.c'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ps', 'svn:eol-style', 'native', '--force',
sbox.ospath('add.c'))
@@ -931,7 +925,7 @@ def autoprops_inconsistent_eol(sbox):
expected_output = ['A %s\n' % sbox.ospath('auto.c')]
# Fails with svn: E200009: File '.*auto.c' has inconsistent newlines
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'add', sbox.ospath('auto.c'))
@XFail()
@@ -950,7 +944,7 @@ def autoprops_inconsistent_mime(sbox):
expected_output = ['A %s\n' % sbox.ospath('c.iota.c')]
# Fails with svn: E200009: File '.*c.iota.c' has binary mime type property
- svntest.actions.run_and_verify_svn(None, expected_output,
+ svntest.actions.run_and_verify_svn(expected_output,
[], 'add', sbox.ospath('c.iota.c'))
diff --git a/subversion/tests/cmdline/tree_conflict_tests.py b/subversion/tests/cmdline/tree_conflict_tests.py
index c9e5b1a..acf7c90 100755
--- a/subversion/tests/cmdline/tree_conflict_tests.py
+++ b/subversion/tests/cmdline/tree_conflict_tests.py
@@ -25,7 +25,7 @@
######################################################################
# General modules
-import sys, re, os, traceback
+import sys, re, os, stat, traceback
# Our testing module
import svntest
@@ -350,7 +350,7 @@ def set_up_repos(wc_dir, br_dir, scenarios):
main.run_svn(None, 'mkdir', '--parents', P)
for modaction in init_mods:
modify(modaction, incoming_paths(wc_dir, P))
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'commit', '-m', 'Initial set-up.', wc_dir)
# Capture the revision number
init_rev = 2 ### hard-coded
@@ -363,7 +363,7 @@ def set_up_repos(wc_dir, br_dir, scenarios):
modify(modaction, incoming_paths(wc_dir, P))
# commit all the modifications
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'commit', '-m', 'Action.', wc_dir)
# Capture the revision number
changed_rev = 3 ### hard-coded
@@ -411,7 +411,7 @@ def ensure_tree_conflict(sbox, operation,
else: # switch/merge
# Make, and work in, a "branch2" that is a copy of "branch1".
target_br = "branch2"
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'copy', '-r', str(source_left_rev), url_of(source_br),
url_of(target_br),
'-m', 'Create target branch.')
@@ -435,7 +435,7 @@ def ensure_tree_conflict(sbox, operation,
for modaction in loc_action:
modify(modaction, localmod_paths(".", target_path), is_init=False)
if commit_local_mods:
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'commit', target_path,
'-m', 'Mods in target branch.')
head_rev += 1
@@ -444,7 +444,7 @@ def ensure_tree_conflict(sbox, operation,
# For switch/merge, there is no such precondition.
if operation == 'update':
logger.debug("--- Trying to commit (expecting 'out-of-date' error)")
- run_and_verify_commit(".", None, None, "Commit failed",
+ run_and_verify_commit(".", None, None, ".*Commit failed.*",
target_path)
if modaction.startswith('f'):
@@ -462,15 +462,15 @@ def ensure_tree_conflict(sbox, operation,
# Do the main action
if operation == 'update':
logger.debug("--- Updating")
- run_and_verify_svn(None, expected_stdout, [],
+ run_and_verify_svn(expected_stdout, [],
'update', target_path)
elif operation == 'switch':
logger.debug("--- Switching")
- run_and_verify_svn(None, expected_stdout, [],
+ run_and_verify_svn(expected_stdout, [],
'switch', source_url, target_path)
elif operation == 'merge':
logger.debug("--- Merging")
- run_and_verify_svn(None, expected_stdout, [],
+ run_and_verify_svn(expected_stdout, [],
'merge',
'--allow-mixed-revisions',
'-r', str(source_left_rev) + ':' + str(source_right_rev),
@@ -513,7 +513,7 @@ def ensure_tree_conflict(sbox, operation,
"^ > .* upon " + operation] +
svntest.main.summary_of_conflicts(tree_conflicts=1))
])
- run_and_verify_svn(None, expected_stdout, [],
+ run_and_verify_svn(expected_stdout, [],
'status', victim_path)
logger.debug("--- Resolving the conflict")
@@ -523,14 +523,14 @@ def ensure_tree_conflict(sbox, operation,
run_and_verify_resolved([victim_path])
logger.debug("--- Checking that 'status' does not report a conflict")
- exitcode, stdout, stderr = run_and_verify_svn(None, None, [],
+ exitcode, stdout, stderr = run_and_verify_svn(None, [],
'status', victim_path)
for line in stdout:
if line[6] == 'C': # and line.endswith(victim_path + '\n'):
raise svntest.Failure("unexpected status C") # on victim_path
# logger.debug("--- Committing (should now succeed)")
- # run_and_verify_svn(None, None, [],
+ # run_and_verify_svn(None, [],
# 'commit', '-m', '', target_path)
# target_start_rev += 1
@@ -542,7 +542,7 @@ def ensure_tree_conflict(sbox, operation,
main.run_svn(None, 'revert', '-R', wc_dir)
main.safe_rmtree(wc_dir)
if operation != 'update':
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'delete', url_of(target_br),
'-m', 'Delete target branch.')
head_rev += 1
@@ -654,7 +654,6 @@ def up_sw_dir_del_onto_del(sbox):
# Adding branch1\dC\D
#
# Committed revision 4.
-@XFail(svntest.main.is_ra_type_dav)
@Issue(3314)
def up_sw_dir_add_onto_add(sbox):
"up/sw dir: add onto add"
@@ -777,11 +776,9 @@ def force_del_tc_inside(sbox):
main.run_svn(None, 'update', '-r2', wc_dir)
# Set a meaningless prop on each dir and file
- run_and_verify_svn(None,
- ["property 'propname' set on '" + dir + "'\n"],
+ run_and_verify_svn(["property 'propname' set on '" + dir + "'\n"],
[], 'ps', 'propname', 'propval', dir)
- run_and_verify_svn(None,
- ["property 'propname' set on '" + file + "'\n"],
+ run_and_verify_svn(["property 'propname' set on '" + file + "'\n"],
[], 'ps', 'propname', 'propval', file)
# Update WC to HEAD, tree conflicts result dir and file
@@ -805,12 +802,10 @@ def force_del_tc_inside(sbox):
})
run_and_verify_update(wc_dir,
expected_output, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc_dir)
+ check_props=True)
# Delete A/C with --force, in effect disarming the tree-conflicts.
- run_and_verify_svn(None,
- verify.UnorderedOutput(['D ' + C + '\n',
+ run_and_verify_svn(verify.UnorderedOutput(['D ' + C + '\n',
'D ' + dir + '\n',
'D ' + file + '\n']),
[], 'delete', C, '--force')
@@ -828,8 +823,7 @@ def force_del_tc_inside(sbox):
expected_status.remove('A/C')
run_and_verify_commit(wc_dir,
- expected_output, expected_status, None,
- wc_dir)
+ expected_output, expected_status)
#----------------------------------------------------------------------
@@ -865,11 +859,9 @@ def force_del_tc_is_target(sbox):
main.run_svn(None, 'update', '-r2', wc_dir)
# Set a meaningless prop on each dir and file
- run_and_verify_svn(None,
- ["property 'propname' set on '" + dir + "'\n"],
+ run_and_verify_svn(["property 'propname' set on '" + dir + "'\n"],
[], 'ps', 'propname', 'propval', dir)
- run_and_verify_svn(None,
- ["property 'propname' set on '" + file + "'\n"],
+ run_and_verify_svn(["property 'propname' set on '" + file + "'\n"],
[], 'ps', 'propname', 'propval', file)
# Update WC to HEAD, tree conflicts result dir and file
@@ -893,12 +885,10 @@ def force_del_tc_is_target(sbox):
})
run_and_verify_update(wc_dir,
expected_output, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc_dir)
+ check_props=True)
# Delete nodes with --force, in effect disarming the tree-conflicts.
- run_and_verify_svn(None,
- ['D ' + dir + '\n',
+ run_and_verify_svn(['D ' + dir + '\n',
'D ' + file + '\n'],
[],
'delete', dir, file, '--force')
@@ -911,8 +901,7 @@ def force_del_tc_is_target(sbox):
expected_output = wc.State(wc_dir, {})
run_and_verify_commit(wc_dir,
- expected_output, expected_status, None,
- wc_dir)
+ expected_output, expected_status)
#----------------------------------------------------------------------
@@ -945,8 +934,7 @@ def query_absent_tree_conflicted_dir(sbox):
main.run_svn(None, 'update', '-r2', wc_dir)
# Set a meaningless prop on A/C/C
- run_and_verify_svn(None,
- ["property 'propname' set on '" + C_C_path + "'\n"],
+ run_and_verify_svn(["property 'propname' set on '" + C_C_path + "'\n"],
[], 'ps', 'propname', 'propval', C_C_path)
# Update WC to HEAD, a tree conflict results on A/C/C because of the
@@ -964,12 +952,10 @@ def query_absent_tree_conflicted_dir(sbox):
treeconflict='C')})
run_and_verify_update(wc_dir,
expected_output, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc_dir)
+ check_props=True)
# Delete A/C with --keep-local.
- run_and_verify_svn(None,
- verify.UnorderedOutput(['D ' + C_C_path + '\n',
+ run_and_verify_svn(verify.UnorderedOutput(['D ' + C_C_path + '\n',
'D ' + C_path + '\n']),
[],
'delete', C_path, '--keep-local')
@@ -996,7 +982,7 @@ def query_absent_tree_conflicted_dir(sbox):
run_and_verify_status(C_C_path, expected_output)
# using info:
- run_and_verify_svn(None, None, ".*W155010.*The node.*was not found.*",
+ run_and_verify_svn(None, ".*W155010.*The node.*was not found.*",
'info', C_C_path)
#----------------------------------------------------------------------
@@ -1008,7 +994,7 @@ def up_add_onto_add_revert(sbox):
sbox.build()
wc_dir = sbox.wc_dir
wc2_dir = sbox.add_wc_path('wc2')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url, wc2_dir)
file1 = os.path.join(wc_dir, 'newfile')
@@ -1023,7 +1009,7 @@ def up_add_onto_add_revert(sbox):
main.run_svn(None, 'cp', os.path.join(wc_dir, 'A/C'), dir1)
main.run_svn(None, 'cp', os.path.join(wc2_dir, 'A/C'), dir2)
- main.run_svn(None, 'ci', wc_dir, '-m', 'Added file')
+ sbox.simple_commit(message='Added file')
expected_disk = main.greek_state.copy()
expected_disk.add({
@@ -1039,8 +1025,7 @@ def up_add_onto_add_revert(sbox):
run_and_verify_update(wc2_dir,
None, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc2_dir)
+ check_props=True)
# Currently (r927086), this removes dir2 and file2 in a way that
# they don't reappear after update.
@@ -1057,8 +1042,7 @@ def up_add_onto_add_revert(sbox):
# the repository
run_and_verify_update(wc2_dir,
None, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc2_dir)
+ check_props=True)
#----------------------------------------------------------------------
@@ -1080,12 +1064,12 @@ def lock_update_only(sbox):
file_path_b = os.path.join(wc_b, fname)
# Lock a file as wc_author, and schedule the file for deletion.
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', file_path)
svntest.main.run_svn(None, 'delete', file_path)
# In our other working copy, steal that lock.
- svntest.actions.run_and_verify_svn(None, ".*locked by user", [], 'lock',
+ svntest.actions.run_and_verify_svn(".*locked by user", [], 'lock',
'-m', '', '--force', file_path)
# Now update the first working copy. It should appear as a no-op.
@@ -1095,8 +1079,7 @@ def lock_update_only(sbox):
expected_status.tweak('iota', status='D ', writelocked='K')
run_and_verify_update(wc_dir,
None, expected_disk, expected_status,
- None, None, None, None, None, 1,
- wc_dir)
+ check_props=True)
#----------------------------------------------------------------------
@@ -1171,92 +1154,95 @@ def actual_only_node_behaviour(sbox):
# add
expected_stdout = None
expected_stderr = ".*foo.*is an existing item in conflict.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"add", foo_path)
# add (with an existing obstruction of foo)
svntest.main.file_write(foo_path, "This is an obstruction of foo.\n")
expected_stdout = None
expected_stderr = ".*foo.*is an existing item in conflict.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"add", foo_path)
os.remove(foo_path) # remove obstruction
# blame (praise, annotate, ann)
expected_stdout = None
expected_stderr = ".*foo.*not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"blame", foo_path)
# cat
expected_stdout = None
expected_stderr = ".*foo.*not under version control.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"cat", foo_path)
# cat -rBASE
expected_stdout = None
expected_stderr = ".*foo.*not under version control.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"cat", "-r", "BASE", foo_path)
# changelist (cl)
expected_stdout = None
expected_stderr = ".*svn: warning: W155010: The node '.*foo' was not found."
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"changelist", "my_changelist", foo_path)
# checkout (co)
### this does not error out -- needs review
expected_stdout = None
expected_stderr = []
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"checkout", A_copy_url, foo_path)
### for now, ignore the fact that checkout succeeds and remove the nested
### working copy so we can test more commands
- shutil.rmtree(foo_path)
+ def onerror(function, path, execinfo):
+ os.chmod(path, stat.S_IREAD | stat.S_IWRITE)
+ os.remove(path)
+ shutil.rmtree(foo_path, onerror=onerror)
# cleanup
expected_stdout = None
expected_stderr = ".*foo.*is not a working copy directory"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"cleanup", foo_path)
# commit (ci)
expected_stdout = None
expected_stderr = ".*foo.*remains in conflict.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"commit", foo_path)
# copy (cp)
expected_stdout = None
expected_stderr = ".*foo.*does not exist.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"copy", foo_path, foo_path + ".copy")
# delete (del, remove, rm)
expected_stdout = None
expected_stderr = ".*foo.*is not under version control.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"delete", foo_path)
# diff (di)
expected_stdout = None
- expected_stderr = ".*foo.*is not under version control.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ expected_stderr = ".*E155.*foo.*was not found.*"
+ run_and_verify_svn(expected_stdout, expected_stderr,
"diff", foo_path)
# export
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"export", foo_path, sbox.get_tempname())
# import
expected_stdout = None
expected_stderr = ".*(foo.*does not exist|Can't stat.*foo).*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"import", '-m', svntest.main.make_log_msg(),
foo_path, sbox.repo_url + '/foo_imported')
# info
expected_info = {
- 'Tree conflict': 'local file missing, incoming file edit upon merge.*',
+ 'Tree conflict': 'local missing or deleted or moved away, incoming file edit upon merge.*',
'Name': 'foo',
'Schedule': 'normal',
'Node Kind': 'none',
@@ -1267,42 +1253,42 @@ def actual_only_node_behaviour(sbox):
# list (ls)
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"list", foo_path)
# lock
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"lock", foo_path)
# log
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"log", foo_path)
# merge
# note: this is intentionally a no-op merge that does not record mergeinfo
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"merge", '--ignore-ancestry', '-c', '4',
A_copy_url + '/mu', foo_path)
# mergeinfo
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"mergeinfo", A_copy_url + '/foo', foo_path)
# mkdir
expected_stdout = None
expected_stderr = ".*foo.*is an existing item in conflict.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"mkdir", foo_path)
# move (mv, rename, ren)
expected_stdout = None
expected_stderr = ".*foo.*does not exist.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"move", foo_path, foo_path + ".moved")
# patch
expected_stdout = None
@@ -1319,43 +1305,43 @@ def actual_only_node_behaviour(sbox):
for line in patch_data:
f.write(line)
f.close()
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"patch", patch_path, sbox.ospath("A/foo"))
# propdel (pdel, pd)
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"propdel", "svn:eol-style", foo_path)
# propget (pget, pg)
expected_stdout = None
expected_stderr = ".*foo.*is not under version control.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"propget", "svn:eol-style", foo_path)
# proplist (plist, pl)
expected_stdout = None
expected_stderr = ".*foo.*is not under version control.*"
- svntest.actions.run_and_verify_svn(None, expected_stdout, expected_stderr,
+ svntest.actions.run_and_verify_svn(expected_stdout, expected_stderr,
"proplist", foo_path)
# propset (pset, ps)
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"propset", "svn:eol-style", "native", foo_path)
# relocate
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"relocate", A_copy_url + "/foo", foo_path)
# resolve
expected_stdout = "Resolved conflicted state of.*foo.*"
expected_stderr = []
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"resolve", "--accept", "working", foo_path)
# revert the entire working copy and repeat the merge so we can test
@@ -1367,7 +1353,7 @@ def actual_only_node_behaviour(sbox):
# revert
expected_stdout = "Reverted.*foo.*"
expected_stderr = []
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"revert", foo_path)
# revert the entire working copy and repeat the merge so we can test
@@ -1379,7 +1365,7 @@ def actual_only_node_behaviour(sbox):
# revert
expected_stdout = "Reverted.*foo.*"
expected_stderr = []
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"revert", "-R", foo_path)
# revert the entire working copy and repeat the merge so we can test
@@ -1397,13 +1383,13 @@ def actual_only_node_behaviour(sbox):
# switch (sw)
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"switch", A_copy_url + "/foo", foo_path)
# unlock
expected_stdout = None
expected_stderr = ".*foo.*was not found.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"unlock", foo_path)
# update (up)
@@ -1413,13 +1399,13 @@ def actual_only_node_behaviour(sbox):
expected_stdout = [
"Updating '" + foo_path + "':\n", "At revision 4.\n"]
expected_stderr = []
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"update", foo_path)
# upgrade
expected_stdout = None
expected_stderr = ".*Can't upgrade.*foo.*"
- run_and_verify_svn(None, expected_stdout, expected_stderr,
+ run_and_verify_svn(expected_stdout, expected_stderr,
"upgrade", foo_path)
#----------------------------------------------------------------------
@@ -1443,18 +1429,80 @@ def update_dir_with_not_present(sbox):
sbox.simple_rm('A/B')
# We can't commit this without updating (ra_svn produces its own error)
- run_and_verify_svn(None, None,
+ run_and_verify_svn(None,
"svn: (E155011|E160028|E170004): (Dir|Item).*B.*out of date",
'ci', '-m', '', wc_dir)
# So we run update
- run_and_verify_svn(None, None, [],
+ run_and_verify_svn(None, [],
'up', wc_dir)
# And now we can commit
- run_and_verify_svn(None, None, [],
+ run_and_verify_svn(None, [],
'ci', '-m', '', wc_dir)
+def update_delete_mixed_rev(sbox):
+ "update that deletes mixed-rev"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+ sbox.simple_move('A/B/E/alpha', 'A/B/E/alpha2')
+ sbox.simple_commit()
+ sbox.simple_update()
+ sbox.simple_rm('A/B')
+ sbox.simple_commit()
+ sbox.simple_update(revision=1)
+ sbox.simple_update(target='A/B/E', revision=2)
+ sbox.simple_mkdir('A/B/E2')
+
+ # Update raises a tree conflict on A/B due to local mod A/B/E2
+ expected_output = wc.State(wc_dir, {
+ 'A/B' : Item(status=' ', treeconflict='C'),
+ })
+ expected_disk = main.greek_state.copy()
+ expected_disk.add({
+ 'A/B/E2' : Item(),
+ 'A/B/E/alpha2' : Item(contents='This is the file \'alpha\'.\n'),
+ })
+ expected_disk.remove('A/B/E/alpha')
+ expected_status = get_virginal_state(wc_dir, 3)
+ expected_status.remove('A/B/E/alpha')
+ expected_status.add({
+ 'A/B/E2' : Item(status='A ', wc_rev='-'),
+ 'A/B/E/alpha2' : Item(status=' ', copied='+', wc_rev='-'),
+ })
+ expected_status.tweak('A/B',
+ status='A ', copied='+', treeconflict='C', wc_rev='-')
+ expected_status.tweak('A/B/F', 'A/B/E', 'A/B/E/beta', 'A/B/lambda',
+ copied='+', wc_rev='-')
+
+ # The entries world doesn't see a changed revision as another add
+ # while the WC-NG world does...
+ expected_status.tweak('A/B/E', status='A ', entry_status=' ')
+ run_and_verify_update(wc_dir,
+ expected_output, expected_disk, expected_status,
+ check_props=True)
+
+ # Resolving to working state should give a mixed-revision copy that
+ # gets committed as multiple copies
+ run_and_verify_resolved([sbox.ospath('A/B')], sbox.ospath('A/B'))
+ expected_output = wc.State(wc_dir, {
+ 'A/B' : Item(verb='Adding'),
+ 'A/B/E' : Item(verb='Replacing'),
+ 'A/B/E2' : Item(verb='Adding'),
+ })
+ expected_status.tweak('A/B', 'A/B/E', 'A/B/E2', 'A/B/F', 'A/B/E/alpha2',
+ 'A/B/E/beta', 'A/B/lambda',
+ status=' ', wc_rev=4, copied=None, treeconflict=None)
+ run_and_verify_commit(wc_dir,
+ expected_output, expected_status)
+
+ expected_info = {
+ 'Name': 'alpha2',
+ 'Node Kind': 'file',
+ }
+ run_and_verify_info([expected_info], sbox.repo_url + '/A/B/E/alpha2')
+
#######################################################################
# Run the tests
@@ -1485,6 +1533,7 @@ test_list = [ None,
at_directory_external,
actual_only_node_behaviour,
update_dir_with_not_present,
+ update_delete_mixed_rev,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/update_tests.py b/subversion/tests/cmdline/update_tests.py
index 8a6c31c..4bcab46 100755
--- a/subversion/tests/cmdline/update_tests.py
+++ b/subversion/tests/cmdline/update_tests.py
@@ -34,8 +34,8 @@ logger = logging.getLogger()
# Our testing module
import svntest
from svntest import wc, actions, verify, deeptrees
-from merge_tests import expected_merge_output
-from merge_tests import set_up_branch
+from svntest.mergetrees import expected_merge_output
+from svntest.mergetrees import set_up_branch
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -55,50 +55,6 @@ from svntest.main import SVN_PROP_MERGEINFO, server_has_mergeinfo
# Each test must return on success or raise on failure.
-#----------------------------------------------------------------------
-
-# Helper for update_binary_file() test -- a custom singleton handler.
-def detect_extra_files(node, extra_files):
- """NODE has been discovered as an extra file on disk. Verify that
- it matches one of the regular expressions in the EXTRA_FILES list of
- lists, and that its contents matches the second part of the list
- item. If it matches, remove the match from the list. If it doesn't
- match, raise an exception."""
-
- # Baton is of the form:
- #
- # [ [wc_dir, pattern, contents],
- # [wc_dir, pattern, contents], ... ]
-
- for fdata in extra_files:
- wc_dir = fdata[0]
- pattern = fdata[1]
- contents = None
- if len(fdata) > 2:
- contents = fdata[2]
- match_obj = re.match(pattern, node.name)
- if match_obj:
- if contents is None:
- return
- else:
- # Strip the root_node_name from node path
- # (svntest.tree.root_node_name, currently `__SVN_ROOT_NODE'),
- # since it doesn't really exist. Also strip the trailing "slash".
- real_path = node.path
- if real_path.startswith(svntest.tree.root_node_name):
- real_path = real_path[len(svntest.tree.root_node_name) +
- len(os.sep) :]
- real_path = os.path.join(wc_dir, real_path)
-
- real_contents = open(real_path).read()
- if real_contents == contents:
- extra_files.pop(extra_files.index(fdata)) # delete pattern from list
- return
-
- logger.warn("Found unexpected object: %s", node.name)
- raise svntest.tree.SVNTreeUnequal
-
-
def update_binary_file(sbox):
"update a locally-modified binary file"
@@ -127,7 +83,7 @@ def update_binary_file(sbox):
# Commit the new binary file, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make a backup copy of the working copy.
wc_backup = sbox.add_wc_path('backup')
@@ -151,7 +107,7 @@ def update_binary_file(sbox):
# Commit original working copy again, creating revision 3.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now start working in the backup working copy:
@@ -178,13 +134,7 @@ def update_binary_file(sbox):
'A/theta' : Item(status='C ', wc_rev=3),
})
- # Extra 'singleton' files we expect to exist after the update.
- # In the case, the locally-modified binary file should be backed up
- # to an .orig file.
- # This is a list of lists, of the form [ WC_DIR,
- # [pattern, contents], ...]
- extra_files = [[wc_backup, 'theta.*\.r2', theta_contents],
- [wc_backup, 'theta.*\.r3', theta_contents_r3]]
+ extra_files = ['theta.r2', 'theta.r3']
# Do the update and check the results in three ways. Pass our
# custom singleton handler to verify the .orig file; this handler
@@ -194,15 +144,8 @@ def update_binary_file(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- detect_extra_files, extra_files,
- None, None, 1)
-
- # verify that the extra_files list is now empty.
- if len(extra_files) != 0:
- logger.warn("Not all extra reject files have been accounted for:")
- logger.warn(extra_files)
- raise svntest.Failure
+ [], True,
+ extra_files=extra_files)
#----------------------------------------------------------------------
@@ -249,7 +192,7 @@ def update_binary_file_2(sbox):
# Commit the new binary filea, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make some mods to the binary files.
svntest.main.file_append(theta_path, "foobar")
@@ -272,7 +215,7 @@ def update_binary_file_2(sbox):
# Commit original working copy again, creating revision 3.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update to rev 2.
expected_output = svntest.wc.State(wc_dir, {
@@ -303,8 +246,7 @@ def update_binary_file_2(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '2', wc_dir)
@@ -340,7 +282,7 @@ def update_binary_file_3(sbox):
# Commit the new binary file, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make some mods to the binary files.
svntest.main.file_append(theta_path, "foobar")
@@ -359,7 +301,7 @@ def update_binary_file_3(sbox):
# Commit modified working copy, creating revision 3.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now we locally modify the file back to the old version.
svntest.main.file_write(theta_path, theta_contents, 'wb')
@@ -389,8 +331,7 @@ def update_binary_file_3(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '2', wc_dir)
#----------------------------------------------------------------------
@@ -443,7 +384,7 @@ def update_missing(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
mu_path, rho_path,
E_path, H_path)
@@ -531,8 +472,7 @@ def update_to_rev_zero(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None, [], False,
'-r', '0', wc_dir)
#----------------------------------------------------------------------
@@ -581,7 +521,7 @@ def receive_overlapping_same_change(sbox):
# Commit the change, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Expected output tree for update of other_wc.
expected_output = svntest.wc.State(other_wc, {
@@ -644,7 +584,7 @@ def update_to_resolve_text_conflicts(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create expected output tree for an update of the wc_backup.
expected_output = svntest.wc.State(wc_backup, {
@@ -658,6 +598,7 @@ def update_to_resolve_text_conflicts(sbox):
contents="\n".join(["This is the file 'mu'.",
"<<<<<<< .mine",
"Conflicting appended text for mu",
+ "||||||| .r1",
"=======",
"Original appended text for mu",
">>>>>>> .r2",
@@ -666,6 +607,7 @@ def update_to_resolve_text_conflicts(sbox):
contents="\n".join(["This is the file 'rho'.",
"<<<<<<< .mine",
"Conflicting appended text for rho",
+ "||||||| .r1",
"=======",
"Original appended text for rho",
">>>>>>> .r2",
@@ -687,15 +629,7 @@ def update_to_resolve_text_conflicts(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files)
-
-
- # verify that the extra_files list is now empty.
- if len(extra_files) != 0:
- logger.warn("didn't get expected extra files")
- raise svntest.Failure
+ extra_files=extra_files)
# remove the conflicting files to clear text conflict but not props conflict
os.remove(mu_path_backup)
@@ -726,24 +660,24 @@ def update_delete_modified_files(sbox):
# Delete a file
alpha_path = sbox.ospath('A/B/E/alpha')
- svntest.actions.run_and_verify_svn("Deleting alpha failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', alpha_path)
# Delete a directory containing files
G_path = sbox.ospath('A/D/G')
- svntest.actions.run_and_verify_svn("Deleting G failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', G_path)
# Commit
- svntest.actions.run_and_verify_svn("Committing deletes failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', 'log msg', wc_dir)
### Update before backdating to avoid obstructed update error for G
- svntest.actions.run_and_verify_svn("Updating after commit failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# Backdate to restore deleted items
- svntest.actions.run_and_verify_svn("Backdating failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1', wc_dir)
# Modify the file to be deleted, and a file in the directory to be deleted
@@ -807,7 +741,7 @@ def update_after_add_rm_deleted(sbox):
# Delete a file and directory from WC
alpha_path = sbox.ospath('A/B/E/alpha')
F_path = sbox.ospath('A/B/F')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path, F_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', alpha_path, F_path)
# Commit deletion
expected_output = svntest.wc.State(wc_dir, {
@@ -820,13 +754,13 @@ def update_after_add_rm_deleted(sbox):
expected_status.remove('A/B/F')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# alpha and F are now in state "deleted", next we add a new ones
svntest.main.file_append(alpha_path, "new alpha")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', alpha_path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', alpha_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', F_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', F_path)
# New alpha and F should be in add state A
expected_status.add({
@@ -838,7 +772,7 @@ def update_after_add_rm_deleted(sbox):
# Forced removal of new alpha and F must restore "deleted" state
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--force',
+ svntest.actions.run_and_verify_svn(None, [], 'rm', '--force',
alpha_path, F_path)
if os.path.exists(alpha_path) or os.path.exists(F_path):
raise svntest.Failure
@@ -850,7 +784,7 @@ def update_after_add_rm_deleted(sbox):
# Although parent dir is already at rev 1, the "deleted" state will cause
# alpha and F to be restored in the WC when updated to rev 1
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r', '1', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r', '1', wc_dir)
expected_status.add({
'A/B/E/alpha' : Item(status=' ', wc_rev=1),
@@ -874,7 +808,7 @@ def obstructed_update_alters_wc_props(sbox):
# Create a new dir in the repo in prep for creating an obstruction.
#print "Adding dir to repo"
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m',
'prep for obstruction',
sbox.repo_url + '/A/foo')
@@ -905,7 +839,7 @@ def obstructed_update_alters_wc_props(sbox):
})
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# Remove the file which caused the obstruction.
@@ -949,7 +883,7 @@ def update_replace_dir(sbox):
# Delete a directory
F_path = sbox.ospath('A/B/F')
- svntest.actions.run_and_verify_svn(None, None, [], 'rm', F_path)
+ svntest.actions.run_and_verify_svn(None, [], 'rm', F_path)
# Commit deletion
expected_output = svntest.wc.State(wc_dir, {
@@ -960,10 +894,10 @@ def update_replace_dir(sbox):
expected_status.remove('A/B/F')
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Add replacement directory
- svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', F_path)
+ svntest.actions.run_and_verify_svn(None, [], 'mkdir', F_path)
# Commit addition
expected_output = svntest.wc.State(wc_dir, {
@@ -974,7 +908,7 @@ def update_replace_dir(sbox):
expected_status.tweak('A/B/F', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update to HEAD
expected_output = svntest.wc.State(wc_dir, {
@@ -998,7 +932,7 @@ def update_replace_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
@@ -1028,14 +962,14 @@ def update_single_file(sbox):
expected_status.tweak('A/mu', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# At one stage 'svn up file' failed with a parent lock error
was_cwd = os.getcwd()
os.chdir(sbox.ospath('A'))
### Can't get run_and_verify_update to work having done the chdir.
- svntest.actions.run_and_verify_svn("update failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', '-r', '1', 'mu')
os.chdir(was_cwd)
@@ -1071,7 +1005,7 @@ def prop_update_on_scheduled_delete(sbox):
# Commit the change, creating revision 2.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
svntest.main.run_svn(None, 'rm', other_iota_path)
@@ -1109,10 +1043,10 @@ def update_receive_illegal_name(sbox):
+ '/A/D/G/' + svntest.main.get_admin_name())
# Ha! The client doesn't allow us to mkdir a '.svn' but it does
# allow us to copy to a '.svn' so ...
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mkdir', '-m', 'log msg',
legal_url)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', '-m', 'log msg',
legal_url, illegal_url)
@@ -1184,8 +1118,8 @@ def update_deleted_missing_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- 0, "-r", "2", E_path, H_path)
+ [], False,
+ "-r", "2", E_path, H_path)
# Update back to the old revision again
svntest.main.run_svn(None,
@@ -1205,8 +1139,8 @@ def update_deleted_missing_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None,
- 0, "-r", "2", wc_dir)
+ [], False,
+ "-r", "2", wc_dir)
#----------------------------------------------------------------------
@@ -1231,12 +1165,11 @@ def another_hudson_problem(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Delete directory G from the repository
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 3.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 3.\n'], [],
'rm', '-m', 'log msg',
sbox.repo_url + '/A/D/G')
@@ -1259,8 +1192,7 @@ def another_hudson_problem(sbox):
# Sigh, I can't get run_and_verify_update to work (but not because
# of issue 919 as far as I can tell)
expected_output = svntest.verify.UnorderedOutput(expected_output)
- svntest.actions.run_and_verify_svn(None,
- expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'up', G_path)
# Both G and gamma should be 'deleted', update should produce no output
@@ -1299,13 +1231,12 @@ def update_deleted_targets(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Explicit update must not remove the 'deleted=true' entries
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(2), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(2), [],
'update', gamma_path)
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(2), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(2), [],
'update', F_path)
# Update to r1 to restore items, since the parent directory is already
@@ -1323,7 +1254,7 @@ def update_deleted_targets(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
@@ -1337,8 +1268,8 @@ def new_dir_with_spaces(sbox):
wc_dir = sbox.wc_dir
# Create a new directory ("spacey dir") directly in repository
- svntest.actions.run_and_verify_svn(None,
- ['\n', 'Committed revision 2.\n'], [],
+ svntest.actions.run_and_verify_svn(['Committing transaction...\n',
+ 'Committed revision 2.\n'], [],
'mkdir', '-m', 'log msg',
sbox.repo_url
+ '/A/spacey%20dir')
@@ -1387,8 +1318,7 @@ def non_recursive_update(sbox):
expected_status.tweak('A/mu', 'A/D/G/rho', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status,
- None, wc_dir)
+ expected_status)
# Update back to revision 1
expected_output = svntest.wc.State(wc_dir, {
@@ -1402,7 +1332,7 @@ def non_recursive_update(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
# Non-recursive update of A should change A/mu but not A/D/G/rho
@@ -1418,7 +1348,7 @@ def non_recursive_update(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-N', A_path)
#----------------------------------------------------------------------
@@ -1433,9 +1363,9 @@ def checkout_empty_dir(sbox):
C_url = sbox.repo_url + '/A/C'
svntest.main.safe_rmtree(wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout', C_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'checkout', C_url, wc_dir)
- svntest.actions.run_and_verify_svn(None, [], [], 'status', wc_dir)
+ svntest.actions.run_and_verify_svn([], [], 'status', wc_dir)
#----------------------------------------------------------------------
@@ -1463,8 +1393,8 @@ def update_to_deletion(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None,
+ [], False,
'-r', '0', iota_path)
# Update the wc root, so iota comes back.
@@ -1477,9 +1407,7 @@ def update_to_deletion(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
- wc_dir)
+ None)
#----------------------------------------------------------------------
@@ -1494,17 +1422,17 @@ def update_deletion_inside_out(sbox):
child_path = os.path.join(parent_path, 'E') # Could be a file, doesn't matter
# Delete the parent directory.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', parent_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '', wc_dir)
# Update back to r1.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '-r', '1', wc_dir)
# Update just the child to r2.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'update', '-r', '2', child_path)
# Now try a normal update.
@@ -1535,7 +1463,7 @@ def update_schedule_add_dir(sbox):
# Delete directory A/D/G in the repository via immediate commit
G_path = sbox.ospath('A/D/G')
G_url = sbox.repo_url + '/A/D/G'
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', G_url, '-m', 'rev 2')
# Update the wc to HEAD (r2)
@@ -1557,7 +1485,7 @@ def update_schedule_add_dir(sbox):
# Do a URL->wc copy, creating a new schedule-add A/D/G.
# (Standard procedure when trying to resurrect the directory.)
D_path = sbox.ospath('A/D')
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', G_url + '@1', D_path)
# status should now show the dir scheduled for addition-with-history
@@ -1571,7 +1499,7 @@ def update_schedule_add_dir(sbox):
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now update with the schedule-add dir as the target.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', G_path)
+ svntest.actions.run_and_verify_svn(None, [], 'up', G_path)
# The update should be a no-op, and the schedule-add directory
# should still exist! 'svn status' shouldn't change at all.
@@ -1602,8 +1530,8 @@ def update_to_future_add(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None,
+ [], False,
'-r', '0', wc_dir)
# Update iota to the current HEAD.
@@ -1620,8 +1548,8 @@ def update_to_future_add(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None,
+ [], False,
iota_path)
# Now try updating the directory into the future
@@ -1654,8 +1582,8 @@ def update_to_future_add(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None,
+ [], False,
A_path)
#----------------------------------------------------------------------
@@ -1688,7 +1616,7 @@ def update_xml_unsafe_dir(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# chdir into the funky path, and update from there.
os.chdir(test_path)
@@ -1731,7 +1659,7 @@ def conflict_markers_matching_eol(sbox):
# Checkout a second working copy
wc_backup = sbox.add_wc_path('backup')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url, wc_backup)
# set starting revision
@@ -1766,7 +1694,7 @@ def conflict_markers_matching_eol(sbox):
# Commit the original change and note the 'base' revision number
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
cur_rev = cur_rev + 1
base_rev = cur_rev
@@ -1798,6 +1726,7 @@ def conflict_markers_matching_eol(sbox):
'A/mu' : Item(contents= "This is the file 'mu'." + eolchar +
"<<<<<<< .mine" + eolchar +
"Conflicting appended text for mu" + eolchar +
+ "||||||| .r" + str(cur_rev - 1) + eolchar +
"=======" + eolchar +
"Original appended text for mu" + eolchar +
">>>>>>> .r" + str(cur_rev) + eolchar),
@@ -1831,10 +1760,7 @@ def conflict_markers_matching_eol(sbox):
svntest.actions.run_and_verify_update(wc_backup,
expected_backup_output,
expected_backup_disk,
- expected_backup_status,
- None,
- None,
- None)
+ expected_backup_status)
# cleanup for next run
svntest.main.run_svn(None, 'revert', '-R', wc_backup)
@@ -1864,7 +1790,7 @@ def update_eolstyle_handling(sbox):
# Checkout a second working copy
wc_backup = sbox.add_wc_path('backup')
- svntest.actions.run_and_verify_svn(None, None, [], 'checkout',
+ svntest.actions.run_and_verify_svn(None, [], 'checkout',
sbox.repo_url, wc_backup)
path_backup = os.path.join(wc_backup, 'A', 'mu')
@@ -1891,8 +1817,7 @@ def update_eolstyle_handling(sbox):
svntest.actions.run_and_verify_update(wc_backup,
expected_backup_output,
expected_backup_disk,
- expected_backup_status,
- None, None, None)
+ expected_backup_status)
# Test 2: now change the eol-style property to another value and commit,
# update the still changed mu in the second working copy; there should be
@@ -1917,8 +1842,7 @@ def update_eolstyle_handling(sbox):
svntest.actions.run_and_verify_update(wc_backup,
expected_backup_output,
expected_backup_disk,
- expected_backup_status,
- None, None, None)
+ expected_backup_status)
# Test 3: now delete the eol-style property and commit, update the still
# changed mu in the second working copy; there should be no conflict!
@@ -1942,8 +1866,7 @@ def update_eolstyle_handling(sbox):
svntest.actions.run_and_verify_update(wc_backup,
expected_backup_output,
expected_backup_disk,
- expected_backup_status,
- None, None, None)
+ expected_backup_status)
# Bug in which "update" put a bogus revision number on a schedule-add file,
# causing the wrong version of it to be committed.
@@ -1961,32 +1884,32 @@ def update_copy_of_old_rev(sbox):
url2 = sbox.repo_url + '/A2/mu'
# Remember the original text of the file
- exit_code, text_r1, err = svntest.actions.run_and_verify_svn(None, None, [],
+ exit_code, text_r1, err = svntest.actions.run_and_verify_svn(None, [],
'cat', '-r1',
url)
# Commit a different version of the file
svntest.main.file_write(file, "Second revision of 'mu'\n")
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'ci', '-m', '', wc_dir)
# Copy an old revision of its directory into a new path in the WC
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', '-r1', dir, dir2)
# Update. (Should do nothing, but added a bogus "revision" in "entries".)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'up', wc_dir)
# Commit, and check that it says it's committing the right thing
exp_out = ['Adding ' + dir2 + '\n',
- '\n',
+ 'Committing transaction...\n',
'Committed revision 3.\n']
- svntest.actions.run_and_verify_svn(None, exp_out, [],
+ svntest.actions.run_and_verify_svn(exp_out, [],
'ci', '-m', '', wc_dir)
# Verify the committed file's content
- svntest.actions.run_and_verify_svn(None, text_r1, [],
+ svntest.actions.run_and_verify_svn(text_r1, [],
'cat', url2)
#----------------------------------------------------------------------
@@ -2049,7 +1972,7 @@ def forced_update(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Make a local mod to mu that will merge cleanly.
backup_mu_path = os.path.join(wc_backup, 'A', 'mu')
@@ -2125,7 +2048,7 @@ def forced_update(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
wc_backup, '--force')
#----------------------------------------------------------------------
@@ -2164,7 +2087,7 @@ def forced_update_failures(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create an unversioned dir A/B/F/nu that will obstruct the file of the
# same name coming from the repository. Create an unversioned file A/C/I
@@ -2200,8 +2123,9 @@ def forced_update_failures(sbox):
expected_status.tweak('A/B/F', wc_rev='2')
actions.run_and_verify_update(wc_backup, expected_output,
- expected_disk, expected_status, None, None, None, None, None, False,
- '--force', backup_A_B_F)
+ expected_disk, expected_status,
+ [], False,
+ '--force', backup_A_B_F)
# A forced update that tries to add a directory when an unversioned file
@@ -2243,8 +2167,9 @@ def forced_update_failures(sbox):
expected_status.tweak('A/C', 'A/B/F', wc_rev='2')
actions.run_and_verify_update(wc_dir_backup, expected_output,
- expected_disk, expected_status, None, None, None, None, None, False,
- '--force', backup_A_C)
+ expected_disk, expected_status,
+ [], False,
+ '--force', backup_A_C)
# rm -rf wc_dir_backup/A/C/I wc_dir_backup/A/B/F/nu
os.remove(backup_A_C_I)
@@ -2263,8 +2188,7 @@ def forced_update_failures(sbox):
expected_status.tweak('A/C/I', 'A/B/F/nu', treeconflict=None)
actions.run_and_verify_update(wc_dir_backup, expected_output,
- expected_disk, expected_status, None, None, None, None, None, False,
- wc_dir_backup)
+ expected_disk, expected_status)
# svn up -r1 wc_dir_backup/A/C
expected_output = svntest.wc.State(wc_dir_backup, {
@@ -2277,16 +2201,17 @@ def forced_update_failures(sbox):
expected_status.tweak('A/C', wc_rev='1')
actions.run_and_verify_update(wc_dir_backup, expected_output,
- expected_disk, expected_status, None, None, None, None, None, False,
- '-r1', backup_A_C)
+ expected_disk, expected_status,
+ [], False,
+ '-r1', backup_A_C)
# svn co url/A/C/I wc_dir_backup/A/C/I
expected_output = svntest.wc.State(wc_dir_backup, {})
expected_disk = svntest.wc.State(wc_dir, {})
- actions.run_and_verify_checkout2(False, url_A_C_I, backup_A_C_I,
- expected_output, expected_disk, None, None, None, None)
+ actions.run_and_verify_checkout(url_A_C_I, backup_A_C_I,
+ expected_output, expected_disk)
# svn up --force wc_dir_backup/A/C
expected_output = svntest.wc.State(wc_dir_backup, {
@@ -2294,7 +2219,8 @@ def forced_update_failures(sbox):
})
actions.run_and_verify_update(wc_dir_backup, expected_output, None, None,
- None, None, None, None, None, False, '--force', backup_A_C)
+ [], False,
+ '--force', backup_A_C)
#----------------------------------------------------------------------
@@ -2346,7 +2272,7 @@ def update_wc_on_windows_drive(sbox):
was_cwd = os.getcwd()
try:
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'checkout',
sbox.repo_url, wc_dir)
@@ -2370,7 +2296,7 @@ def update_wc_on_windows_drive(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
+ expected_status, [],
wc_dir, zeta_path)
# Non recursive commit
@@ -2392,7 +2318,7 @@ def update_wc_on_windows_drive(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None,
+ expected_status, [],
'-N',
wc_dir,
dir1_path, file1_path)
@@ -2414,7 +2340,7 @@ def update_wc_on_windows_drive(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None, None, None, 0,
+ [], False,
'-r', '1', wc_dir)
os.chdir(was_cwd)
@@ -2443,11 +2369,14 @@ def update_wc_on_windows_drive(sbox):
expected_disk.tweak('A/mu', contents = expected_disk.desc['A/mu'].contents
+ '\nAppended text for mu')
- # Use .old_tree() for status to avoid the entries validation
+ # Create expected status with 'H:iota' style paths
+ expected_status_relative = svntest.wc.State('', {})
+ expected_status_relative.add_state(wc_dir, expected_status, strict=True)
+
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status.old_tree())
+ expected_status_relative)
finally:
os.chdir(was_cwd)
@@ -2498,15 +2427,10 @@ def update_wc_with_replaced_file(sbox):
expected_disk = svntest.main.greek_state.copy()
expected_disk.tweak('iota', contents="")
- conflict_files = []
-
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status,
- None,
- svntest.tree.detect_conflict_files,
- conflict_files)
+ expected_status)
# Make us a working copy with a 'replace-with-history' file.
svntest.main.run_svn(None, 'revert', iota_path)
@@ -2523,8 +2447,7 @@ def update_wc_with_replaced_file(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- None, None, None, None, 0,
+ [], False,
wc_dir, '-r1')
svntest.main.run_svn(None, 'rm', iota_path)
@@ -2549,15 +2472,10 @@ def update_wc_with_replaced_file(sbox):
expected_disk = svntest.main.greek_state.copy()
expected_disk.tweak('iota', contents="This is the file 'mu'.\n")
- conflict_files = [ ]
-
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status,
- None,
- svntest.tree.detect_conflict_files,
- conflict_files)
+ expected_status)
#----------------------------------------------------------------------
def update_with_obstructing_additions(sbox):
@@ -2670,7 +2588,7 @@ def update_with_obstructing_additions(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create various paths scheduled for addition which will obstruct
# the adds coming from the repos.
@@ -2737,6 +2655,7 @@ def update_with_obstructing_additions(sbox):
'A/D/H/I/J' : Item(props={'propname1' : 'propval-WC'}),
'A/D/H/I/J/eta' : Item("\n".join(["<<<<<<< .mine",
"This is WC file 'eta'",
+ "||||||| .r0",
"=======",
"This is REPOS file 'eta'",
">>>>>>> .r2",
@@ -2746,6 +2665,7 @@ def update_with_obstructing_additions(sbox):
'A/D/H/I/L' : Item(),
'A/D/kappa' : Item("\n".join(["<<<<<<< .mine",
"This is WC file 'kappa'",
+ "||||||| .r0",
"=======",
"This is REPOS file 'kappa'",
">>>>>>> .r2",
@@ -2753,6 +2673,7 @@ def update_with_obstructing_additions(sbox):
props={'propname1' : 'propval-WC'}),
'A/D/epsilon' : Item("\n".join(["<<<<<<< .mine",
"This is WC file 'epsilon'",
+ "||||||| .r0",
"=======",
"This is REPOS file 'epsilon'",
">>>>>>> .r2",
@@ -2791,10 +2712,8 @@ def update_with_obstructing_additions(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files, None, None, 1,
- wc_backup)
+ [], True,
+ extra_files=extra_files)
# Some obstructions are still not permitted:
#
@@ -2804,7 +2723,7 @@ def update_with_obstructing_additions(sbox):
# URL to URL copy of A/D/G to A/M.
G_URL = sbox.repo_url + '/A/D/G'
M_URL = sbox.repo_url + '/A/M'
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', G_URL, M_URL, '-m', '')
# WC to WC copy of A/D/H to A/M, M now scheduled for addition with
@@ -2813,13 +2732,13 @@ def update_with_obstructing_additions(sbox):
A_path = sbox.ospath('A')
M_path = sbox.ospath('A/M')
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', H_path, M_path)
# URL to URL copy of A/D/H/omega to omicron.
omega_URL = sbox.repo_url + '/A/D/H/omega'
omicron_URL = sbox.repo_url + '/omicron'
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', omega_URL, omicron_URL,
'-m', '')
@@ -2828,7 +2747,7 @@ def update_with_obstructing_additions(sbox):
chi_path = sbox.ospath('A/D/H/chi')
omicron_path = sbox.ospath('omicron')
- svntest.actions.run_and_verify_svn("Copy error:", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', chi_path,
omicron_path)
@@ -2903,7 +2822,7 @@ def update_with_obstructing_additions(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
A_path)
# Resolve the tree conflict.
@@ -2922,7 +2841,7 @@ def update_with_obstructing_additions(sbox):
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
wc_dir, '-N')
# Resolve the tree conflict.
@@ -2935,7 +2854,7 @@ def update_with_obstructing_additions(sbox):
# Again, --force shouldn't matter.
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
omicron_path, '-N', '--force')
# Test for issue #2022: Update shouldn't touch conflicted files.
@@ -2971,7 +2890,7 @@ def update_conflicted(sbox):
expected_status.tweak('iota', 'A/mu', 'A/B/lambda', 'A/D', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Do another change to each path that we will need later.
# Also, change a file below A/D in the path.
@@ -2990,7 +2909,7 @@ def update_conflicted(sbox):
'A/D/G/pi': Item(verb='Sending')})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Go back to revision 1.
expected_output = svntest.wc.State(wc_dir, {
@@ -3009,9 +2928,7 @@ def update_conflicted(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- None, None,
- None, None, 1,
+ [], True,
'-r1', wc_dir)
# Create modifications conflicting with rev 2.
@@ -3033,6 +2950,7 @@ def update_conflicted(sbox):
contents="\n".join(["This is the file 'iota'.",
"<<<<<<< .mine",
"Conflicting appended text for iota",
+ "||||||| .r1",
"=======",
"Original appended text for iota",
">>>>>>> .r2",
@@ -3041,6 +2959,7 @@ def update_conflicted(sbox):
contents="\n".join(["This is the file 'mu'.",
"<<<<<<< .mine",
"Conflicting appended text for mu",
+ "||||||| .r1",
"=======",
"Original appended text for mu",
">>>>>>> .r2",
@@ -3053,19 +2972,18 @@ def update_conflicted(sbox):
expected_status.tweak('A/B/lambda', 'A/D', status=' C')
expected_status.tweak('A/mu', status='CC')
- extra_files = [ [wc_dir, 'iota.*\.(r1|r2|mine)'],
- [wc_dir, 'mu.*\.(r1|r2|mine|prej)'],
- [wc_dir, 'lambda.*\.prej'],
- [wc_dir, 'dir_conflicts.prej']]
+ extra_files = [ 'iota.r1', 'iota.r2', 'iota.mine',
+ 'mu.r1', 'mu.r2', 'mu.mine', 'mu.prej',
+ 'lambda.prej',
+ 'dir_conflicts.prej']
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
expected_status,
- None,
- detect_extra_files, extra_files,
- None, None, 1,
- '-r2', wc_dir)
+ [], True,
+ '-r2', wc_dir,
+ extra_files=extra_files+[])
# Now, update to HEAD, which should skip all the conflicted files, but
# still update the pi file.
@@ -3093,9 +3011,8 @@ def update_conflicted(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- detect_extra_files, extra_files,
- None, None, 1)
+ [], True,
+ extra_files=extra_files)
#----------------------------------------------------------------------
@SkipUnless(server_has_mergeinfo)
@@ -3128,7 +3045,7 @@ def mergeinfo_update_elision(sbox):
"Checked out revision 1.\n",
"A " + B_COPY_path + "\n",
])
- svntest.actions.run_and_verify_svn(None, expected_stdout, [], 'copy',
+ svntest.actions.run_and_verify_svn(expected_stdout, [], 'copy',
sbox.repo_url + "/A/B", B_COPY_path)
expected_output = wc.State(wc_dir, {'A/B_COPY' : Item(verb='Adding')})
@@ -3144,9 +3061,7 @@ def mergeinfo_update_elision(sbox):
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
- expected_status,
- None,
- wc_dir)
+ expected_status)
# Make some changes under A/B
@@ -3158,7 +3073,7 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B/E/beta', wc_rev=3)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r4 - modify and commit A/B/lambda
svntest.main.file_write(lambda_path, "New content")
@@ -3168,7 +3083,7 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B/lambda', wc_rev=4)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# r5 - modify and commit A/B/E/alpha
svntest.main.file_write(alpha_path, "New content")
@@ -3178,7 +3093,7 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B/E/alpha', wc_rev=5)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Merge r2:5 into A/B_COPY
expected_output = wc.State(B_COPY_path, {
@@ -3222,8 +3137,7 @@ def mergeinfo_update_elision(sbox):
expected_merge_disk,
expected_merge_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# r6 - Commit the merge
expected_output = wc.State(wc_dir,
@@ -3238,7 +3152,7 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B_COPY/lambda', wc_rev=6)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update WC back to r5, A/COPY_B is at it's pre-merge state again
expected_output = wc.State(wc_dir,
@@ -3266,8 +3180,7 @@ def mergeinfo_update_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '5', wc_dir)
# Merge r2:5 to A/B_COPY/E/alpha
@@ -3278,8 +3191,7 @@ def mergeinfo_update_elision(sbox):
# run_and_verify_merge doesn't support merging to a file WCPATH
# so use run_and_verify_svn.
- svntest.actions.run_and_verify_svn(None,
- expected_merge_output([[3,5]],
+ svntest.actions.run_and_verify_svn(expected_merge_output([[3,5]],
['U ' + alpha_COPY_path + '\n',
' U ' + alpha_COPY_path + '\n']),
[], 'merge', '-r2:5',
@@ -3294,7 +3206,7 @@ def mergeinfo_update_elision(sbox):
svntest.actions.run_and_verify_status(alpha_COPY_path,
expected_alpha_status)
- svntest.actions.run_and_verify_svn(None, ["/A/B/E/alpha:3-5\n"], [],
+ svntest.actions.run_and_verify_svn(["/A/B/E/alpha:3-5\n"], [],
'propget', SVN_PROP_MERGEINFO,
alpha_COPY_path)
@@ -3321,8 +3233,7 @@ def mergeinfo_update_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ [], True)
# Now test that an updated target's mergeinfo can itself elide.
# r7 - modify and commit A/B/E/alpha
@@ -3333,10 +3244,10 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B/E/alpha', 'A/B_COPY/E/alpha', status=' ',
wc_rev=7)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update A to get all paths to the same working revision.
- svntest.actions.run_and_verify_svn(None, exp_noop_up_out(7), [],
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7), [],
'up', wc_dir)
# Merge r6:7 into A/B_COPY/E
@@ -3375,12 +3286,10 @@ def mergeinfo_update_elision(sbox):
expected_merge_disk,
expected_merge_status,
expected_skip,
- None, None, None, None,
- None, 1)
+ check_props=True)
# r8 - Commit the merge
- svntest.actions.run_and_verify_svn(None,
- exp_noop_up_out(7),
+ svntest.actions.run_and_verify_svn(exp_noop_up_out(7),
[], 'update', wc_dir)
expected_output = wc.State(wc_dir,
@@ -3391,7 +3300,7 @@ def mergeinfo_update_elision(sbox):
expected_status.tweak('A/B_COPY/E', 'A/B_COPY/E/alpha', wc_rev=8)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Update A/COPY_B/E back to r7
expected_output = wc.State(wc_dir, {
@@ -3410,8 +3319,7 @@ def mergeinfo_update_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '7', E_COPY_path)
# Merge r6:7 to A/B_COPY
@@ -3456,8 +3364,7 @@ def mergeinfo_update_elision(sbox):
expected_merge_disk,
expected_merge_status,
expected_skip,
- None, None, None, None,
- None, 1,alpha_COPY_path)
+ [], True, True)
# Update just A/B_COPY/E. The mergeinfo (r3-5,7) reset on
# A/B_COPY/E by the udpate is identical to the local info on
@@ -3483,8 +3390,8 @@ def mergeinfo_update_elision(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1, E_COPY_path)
+ [], True,
+ E_COPY_path)
#----------------------------------------------------------------------
@@ -3518,11 +3425,11 @@ def update_copied_from_replaced_and_changed(sbox):
fn3_path = sbox.ospath(fn3_relpath)
# Move fn2 to fn1
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', fn2_path, fn1_path)
# Move fn3 to fn2
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'mv', fn3_path, fn2_path)
# Commit that change, creating r2.
@@ -3540,7 +3447,7 @@ def update_copied_from_replaced_and_changed(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Modify fn2.
fn2_final_contents = "I have new contents for the middle file."
@@ -3559,7 +3466,7 @@ def update_copied_from_replaced_and_changed(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Go back to r1.
expected_output = svntest.wc.State(wc_dir, {
@@ -3575,8 +3482,8 @@ def update_copied_from_replaced_and_changed(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- None, None,
- None, None, None, None, 0,
+ None,
+ [], False,
'-r', '1', wc_dir)
# And back up to 3 again.
@@ -3600,9 +3507,7 @@ def update_copied_from_replaced_and_changed(sbox):
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status, None,
- None, None, None, None, 0,
- wc_dir)
+ expected_status)
#----------------------------------------------------------------------
# Regression test: ra_neon assumes that you never delete a property on
@@ -3616,7 +3521,7 @@ def update_copied_and_deleted_prop(sbox):
iota2_path = sbox.ospath('iota2')
# Add a property on iota
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propset', 'foo', 'bar', iota_path)
# Commit that change, creating r2.
expected_output = svntest.wc.State(wc_dir, {
@@ -3627,12 +3532,12 @@ def update_copied_and_deleted_prop(sbox):
expected_status_mixed.tweak('iota', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status_mixed, None, wc_dir)
+ expected_status_mixed)
# Copy iota to iota2 and delete the property on it.
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'copy', iota_path, iota2_path)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'propdel', 'foo', iota2_path)
# Commit that change, creating r3.
@@ -3645,7 +3550,7 @@ def update_copied_and_deleted_prop(sbox):
})
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status_mixed, None, wc_dir)
+ expected_status_mixed)
# Update the whole wc, verifying disk as well.
expected_output = svntest.wc.State(wc_dir, { })
@@ -3679,8 +3584,7 @@ def update_copied_and_deleted_prop(sbox):
expected_output,
expected_disk_r2,
expected_status_r2,
- None, None, None, None, None,
- True,
+ [], True,
"-r2", wc_dir)
# And finally, back to r3, getting an add-with-history-and-property-deleted
@@ -3795,7 +3699,7 @@ def update_accept_conflicts(sbox):
# Commit.
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Now we'll update each of our 5 files in wc_backup; each one will get
# conflicts, and we'll handle each with a different --accept option.
@@ -3806,16 +3710,14 @@ def update_accept_conflicts(sbox):
# iota: no accept option
# Just leave the conflicts alone, since run_and_verify_svn already uses
# the --non-interactive option.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts(
2, iota_path_backup),
[],
'update', iota_path_backup)
# lambda: --accept=postpone
# Just leave the conflicts alone.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts(
2, lambda_path_backup),
[],
'update', '--accept=postpone',
@@ -3823,8 +3725,7 @@ def update_accept_conflicts(sbox):
# mu: --accept=base
# Accept the pre-update base file.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts_resolved(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts_resolved(
2, mu_path_backup),
[],
'update', '--accept=base',
@@ -3832,8 +3733,7 @@ def update_accept_conflicts(sbox):
# alpha: --accept=mine
# Accept the user's working file.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts_resolved(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts_resolved(
2, alpha_path_backup),
[],
'update', '--accept=mine-full',
@@ -3841,8 +3741,7 @@ def update_accept_conflicts(sbox):
# beta: --accept=theirs
# Accept their file.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts_resolved(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts_resolved(
2, beta_path_backup),
[],
'update', '--accept=theirs-full',
@@ -3852,8 +3751,7 @@ def update_accept_conflicts(sbox):
# Run editor and accept the edited file. The merge tool will leave
# conflicts in place, so expect a message on stderr, but expect
# svn to exit with an exit code of 0.
- svntest.actions.run_and_verify_svn2(None,
- update_output_with_conflicts_resolved(
+ svntest.actions.run_and_verify_svn2(update_output_with_conflicts_resolved(
2, pi_path_backup),
"system(.*) returned.*", 0,
'update', '--accept=edit',
@@ -3862,8 +3760,7 @@ def update_accept_conflicts(sbox):
# rho: --accept=launch
# Run the external merge tool, it should leave conflict markers in place.
- svntest.actions.run_and_verify_svn(None,
- update_output_with_conflicts(
+ svntest.actions.run_and_verify_svn(update_output_with_conflicts(
2, rho_path_backup),
[],
'update', '--accept=launch',
@@ -3876,12 +3773,14 @@ def update_accept_conflicts(sbox):
expected_disk.tweak('iota', contents=("This is the file 'iota'.\n"
'<<<<<<< .mine\n'
'My appended text for iota\n'
+ '||||||| .r1\n'
'=======\n'
'Their appended text for iota\n'
'>>>>>>> .r2\n'))
expected_disk.tweak('A/B/lambda', contents=("This is the file 'lambda'.\n"
'<<<<<<< .mine\n'
'My appended text for lambda\n'
+ '||||||| .r1\n'
'=======\n'
'Their appended text for lambda\n'
'>>>>>>> .r2\n'))
@@ -3893,6 +3792,7 @@ def update_accept_conflicts(sbox):
expected_disk.tweak('A/D/G/pi', contents=("This is the file 'pi'.\n"
'<<<<<<< .mine\n'
'My appended text for pi\n'
+ '||||||| .r1\n'
'=======\n'
'Their appended text for pi\n'
'>>>>>>> .r2\n'
@@ -3900,6 +3800,7 @@ def update_accept_conflicts(sbox):
expected_disk.tweak('A/D/G/rho', contents=("This is the file 'rho'.\n"
'<<<<<<< .mine\n'
'My appended text for rho\n'
+ '||||||| .r1\n'
'=======\n'
'Their appended text for rho\n'
'>>>>>>> .r2\n'
@@ -3931,112 +3832,7 @@ def update_accept_conflicts(sbox):
expected_output,
expected_disk,
expected_status,
- None,
- svntest.tree.detect_conflict_files,
- extra_files)
-
-# Test for a wc corruption race condition (possibly introduced in
-# r863416) which is easy to trigger if interactive conflict resolution
-# dies in the middle of prompting. Specifically, we run an update
-# with interactive-conflicts on but close stdin immediately, so the
-# prompt errors out; then the dir_baton pool cleanup handlers in the
-# WC update editor flush and run incomplete logs and lead to WC
-# corruption, detectable by another update command.
-
-# FIXME: With issue #4280 fixed and this test using --force-interactive,
-# the test driver can no longer redirect terminal input to cause
-# an EOF. Consequently, skip this test so that it does not hang
-# the test suite.
-@Skip()
-def eof_in_interactive_conflict_resolver(sbox):
- "eof in interactive resolution can't break wc"
-
- sbox.build()
- wc_dir = sbox.wc_dir
-
- # Set up a custom config directory which *doesn't* turn off
- # interactive resolution
- config_contents = '''\
-[auth]
-password-stores =
-
-[miscellany]
-interactive-conflicts = true
-'''
- tmp_dir = os.path.abspath(svntest.main.temp_dir)
- config_dir = os.path.join(tmp_dir, 'interactive-conflicts-config')
- svntest.main.create_config_dir(config_dir, config_contents)
-
- iota_path = sbox.ospath('iota')
-
- # Modify iota and commit for r2.
- svntest.main.file_append(iota_path, "Appended text in r2.\n")
- expected_output = svntest.wc.State(wc_dir, {
- 'iota': Item(verb="Sending"),
- })
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.tweak('iota', wc_rev=2)
- svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
-
- # Go back to revision 1.
- expected_output = svntest.wc.State(wc_dir, {
- 'iota' : Item(status='U '),
- })
-
- expected_disk = svntest.main.greek_state.copy()
-
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
-
- svntest.actions.run_and_verify_update(wc_dir,
- expected_output,
- expected_disk,
- expected_status,
- None,
- None, None,
- None, None, 1,
- '-r1', wc_dir)
-
- # Modify iota differently and try to update *with the interactive
- # resolver*. ### The parser won't go so well with the output
- svntest.main.file_append(iota_path, "Local mods to r1 text.\n")
- svntest.actions.run_and_verify_update(
- wc_dir, None, None, None,
- "End of file while reading from terminal",
- None, None, None, None, 1,
- wc_dir, '--force-interactive', '--config-dir', config_dir)
-
- # Now update -r1 again. Hopefully we don't get a checksum error!
- expected_output = svntest.wc.State(wc_dir, {
- 'iota': Item(verb="Skipped"),
- })
-
- # The interactive callback aborts, so the file remains in conflict.
- expected_disk.tweak('iota', contents="This is the file 'iota'.\n"
- "<<<<<<< .mine\n"
- "Local mods to r1 text.\n"
- "=======\n"
- "Appended text in r2.\n"
- ">>>>>>> .r2\n"),
- expected_disk.add({
- 'iota.r1' : Item(contents="This is the file 'iota'.\n"),
- 'iota.r2' : Item(contents="This is the file 'iota'.\n"
- "Appended text in r2.\n"),
- 'iota.mine' : Item(contents="This is the file 'iota'.\n"
- "Local mods to r1 text.\n"),
- })
-
- expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
- expected_status.tweak('iota', status='C ', wc_rev=2)
-
- svntest.actions.run_and_verify_update(wc_dir,
- expected_output,
- expected_disk,
- expected_status,
- None,
- None, None,
- None, None, 1,
- '-r1', wc_dir)
+ extra_files=extra_files)
#----------------------------------------------------------------------
@@ -4055,11 +3851,11 @@ def update_uuid_changed(sbox):
uuid_before = svntest.actions.get_wc_uuid(wc_dir)
# Change repository's uuid.
- svntest.actions.run_and_verify_svnadmin(None, None, [],
+ svntest.actions.run_and_verify_svnadmin(None, [],
'setuuid', repo_dir)
# 'update' detected the new uuid...
- svntest.actions.run_and_verify_svn(None, None, '.*UUID.*',
+ svntest.actions.run_and_verify_svn(None, '.*UUID.*',
'update', wc_dir)
# ...and didn't overwrite the old uuid.
@@ -4094,7 +3890,7 @@ def restarted_update_should_delete_dir_prop(sbox):
expected_status.tweak('A', wc_rev=2)
svntest.actions.run_and_verify_commit(wc_dir, expected_output,
- expected_status, None, wc_dir)
+ expected_status)
# Create a second working copy.
### Does this hack still work with wc-ng?
@@ -4121,7 +3917,7 @@ def restarted_update_should_delete_dir_prop(sbox):
})
svntest.actions.run_and_verify_commit(other_wc, expected_output,
- expected_status, None, other_wc)
+ expected_status)
# Back in the first working copy, create an obstructing path and
# update. The update will flag a tree conflict.
@@ -4146,7 +3942,7 @@ def restarted_update_should_delete_dir_prop(sbox):
})
actions.run_and_verify_update(wc_dir, expected_output, expected_disk,
- expected_status, None, None, None, None, None, False, wc_dir)
+ expected_status)
# Now, delete the obstructing path and rerun the update.
os.unlink(zeta_path)
@@ -4189,8 +3985,6 @@ disk_after_leaf_edit = svntest.deeptrees.deep_trees_after_leaf_edit
disk_after_leaf_del = svntest.deeptrees.deep_trees_after_leaf_del
disk_after_tree_del = svntest.deeptrees.deep_trees_after_tree_del
-disk_empty_dirs = svntest.deeptrees.deep_trees_empty_dirs
-
deep_trees_conflict_output = svntest.deeptrees.deep_trees_conflict_output
deep_trees_conflict_output_skipped = \
svntest.deeptrees.deep_trees_conflict_output_skipped
@@ -4223,11 +4017,14 @@ def tree_conflicts_on_update_1_1(sbox):
'DF/D1/beta' : Item(status=' ', treeconflict='U'),
})
- expected_disk = disk_empty_dirs.copy()
- expected_disk.remove('D/D1', 'DF/D1', 'DD/D1', 'DD/D1/D2',
- 'DDF/D1', 'DDF/D1/D2',
- 'DDD/D1', 'DDD/D1/D2', 'DDD/D1/D2/D3')
-
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
# The files delta, epsilon, and zeta are incoming additions, but since
# they are all within locally deleted trees they should also be schedule
# for deletion.
@@ -4307,7 +4104,14 @@ def tree_conflicts_on_update_1_2(sbox):
'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='D'),
})
- expected_disk = disk_empty_dirs.copy()
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
expected_status = deep_trees_status_local_tree_del.copy()
@@ -4330,18 +4134,10 @@ def tree_conflicts_on_update_1_2(sbox):
'DDF/D1/D2/gamma',
'DF/D1/beta')
- ### Why does the deep trees state not include files?
- expected_disk.remove('D/D1',
- 'DD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DF/D1', 'DD/D1',
- 'DDF/D1', 'DDF/D1/D2',
- 'DDD/D1', 'DDD/D1/D2')
-
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon update'
+ '^local file delete, incoming file delete or move upon update'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
@@ -4359,7 +4155,7 @@ def tree_conflicts_on_update_1_2(sbox):
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
@@ -4424,37 +4220,37 @@ def tree_conflicts_on_update_2_1(sbox):
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file edit, incoming file delete upon update'
+ '^local file edit, incoming file delete or move upon update'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir edit, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -4486,7 +4282,14 @@ def tree_conflicts_on_update_2_2(sbox):
### when dirs_same_p() is implemented)
expected_output = deep_trees_conflict_output
- expected_disk = disk_empty_dirs.copy()
+ expected_disk = svntest.wc.State('', {
+ 'DDF/D1/D2' : Item(),
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF/D1' : Item(),
+ 'DD/D1' : Item(),
+ 'DDD/D1/D2' : Item(),
+ })
expected_status = svntest.deeptrees.deep_trees_virginal_state.copy()
expected_status.add({'' : Item()})
@@ -4504,65 +4307,51 @@ def tree_conflicts_on_update_2_2(sbox):
# Expect the incoming tree deletes and the local leaf deletes to mean
# that all deleted paths are *really* gone, not simply scheduled for
# deletion.
- expected_status.tweak('F/alpha',
- 'D/D1',
- 'DD/D1',
- 'DF/D1',
- 'DDD/D1',
- 'DDF/D1',
- status='! ', wc_rev=None)
- # Remove from expected status and disk everything below the deleted paths.
- expected_status.remove('DD/D1/D2',
- 'DF/D1/beta',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1/D2',
- 'DDF/D1/D2/gamma',)
-
- expected_disk.remove('D/D1',
- 'DD/D1',
- 'DD/D1/D2',
- 'DF/D1',
- 'DDD/D1',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1',
- 'DDF/D1/D2',)
+ expected_status.tweak('DD/D1', 'DF/D1', 'DDF/D1', 'DDD/D1',
+ status='A ', copied='+', treeconflict='C',
+ wc_rev='-')
+ expected_status.tweak('DDF/D1/D2', 'DDD/D1/D2',
+ copied='+', wc_rev='-')
+ expected_status.tweak('DD/D1/D2', 'DF/D1/beta', 'DDD/D1/D2/D3',
+ 'DDF/D1/D2/gamma',
+ status='D ', copied='+', wc_rev='-')
+ expected_status.tweak('F/alpha', 'D/D1',
+ status='! ', treeconflict='C', wc_rev=None)
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon update'
+ '^local file delete, incoming file delete or move upon update'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir edit, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -4659,8 +4448,14 @@ def tree_conflicts_on_update_3(sbox):
expected_output = deep_trees_conflict_output
- expected_disk = disk_empty_dirs.copy()
-
+ expected_disk = svntest.wc.State('', {
+ 'F' : Item(),
+ 'D' : Item(),
+ 'DF' : Item(),
+ 'DD' : Item(),
+ 'DDF' : Item(),
+ 'DDD' : Item(),
+ })
expected_status = deep_trees_status_local_tree_del.copy()
# Expect the incoming tree deletes and the local tree deletes to mean
@@ -4681,50 +4476,40 @@ def tree_conflicts_on_update_3(sbox):
'DDF/D1/D2',
'DDF/D1/D2/gamma',)
- expected_disk.remove('D/D1',
- 'DD/D1',
- 'DD/D1/D2',
- 'DF/D1',
- 'DDD/D1',
- 'DDD/D1/D2',
- 'DDD/D1/D2/D3',
- 'DDF/D1',
- 'DDF/D1/D2',)
-
expected_info = {
'F/alpha' : {
'Tree conflict' :
- '^local file delete, incoming file delete upon update'
+ '^local file delete, incoming file delete or move upon update'
+ ' Source left: .file.*/F/alpha@2'
+ ' Source right: .none.*(/F/alpha@3)?$',
},
'DF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DF/D1@2'
+ ' Source right: .none.*(/DF/D1@3)?$',
},
'DDF/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDF/D1@2'
+ ' Source right: .none.*(/DDF/D1@3)?$',
},
'D/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/D/D1@2'
+ ' Source right: .none.*(/D/D1@3)?$',
},
'DD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DD/D1@2'
+ ' Source right: .none.*(/DD/D1@3)?$',
},
'DDD/D1' : {
'Tree conflict' :
- '^local dir delete, incoming dir delete upon update'
+ '^local dir delete, incoming dir delete or move upon update'
+ ' Source left: .dir.*/DDD/D1@2'
+ ' Source right: .none.*(/DDD/D1@3)?$',
},
@@ -4773,38 +4558,38 @@ def tree_conflict_uc1_update_deleted_tree(sbox):
def modify_dir(dir):
"""Make some set of local modifications to an existing tree:
A prop change, add a child, delete a child, change a child."""
- run_and_verify_svn(None, AnyOutput, [], 'propset', 'p', 'v', dir)
+ run_and_verify_svn(AnyOutput, [], 'propset', 'p', 'v', dir)
path = os.path.join(dir, 'new_file')
svntest.main.file_write(path, "This is the file 'new_file'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', path)
path = os.path.join(dir, 'C', 'N')
os.mkdir(path)
path2 = os.path.join(dir, 'C', 'N', 'nu')
svntest.main.file_write(path2, "This is the file 'nu'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', path)
path = os.path.join(dir, 'B', 'lambda')
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', path)
+ svntest.actions.run_and_verify_svn(None, [], 'delete', path)
path = os.path.join(dir, 'B', 'E', 'alpha')
svntest.main.file_append(path, "An extra line.\n")
# Prep for both scenarios
modify_dir(A)
- run_and_verify_svn(None, AnyOutput, [], 'ci', A, '-m', 'modify_dir')
- run_and_verify_svn(None, AnyOutput, [], 'up', wc_dir)
+ run_and_verify_svn(AnyOutput, [], 'ci', A, '-m', 'modify_dir')
+ run_and_verify_svn(AnyOutput, [], 'up', wc_dir)
# Existing scenario
wc2 = sbox.add_wc_path('wc2')
A2 = os.path.join(wc2, 'A')
svntest.actions.duplicate_dir(sbox.wc_dir, wc2)
- run_and_verify_svn(None, AnyOutput, [], 'delete', A2)
+ run_and_verify_svn(AnyOutput, [], 'delete', A2)
# New scenario (starts at the revision before the committed mods)
- run_and_verify_svn(None, AnyOutput, [], 'up', A, '-r1')
- run_and_verify_svn(None, AnyOutput, [], 'delete', A)
+ run_and_verify_svn(AnyOutput, [], 'up', A, '-r1')
+ run_and_verify_svn(AnyOutput, [], 'delete', A)
expected_output = None
expected_disk = None
@@ -4861,7 +4646,7 @@ def tree_conflict_uc1_update_deleted_tree(sbox):
})
run_and_verify_commit(wc_dir, expected_output, expected_status,
- None, wc_dir, '-m', 'commit resolved tree')
+ [], wc_dir, '-m', 'commit resolved tree')
# Issue #3334: a delete-onto-modified tree conflict should leave the node
@@ -4905,21 +4690,21 @@ def tree_conflict_uc2_schedule_re_add(sbox):
def modify_dir(dir):
"""Make some set of local modifications to an existing tree:
A prop change, add a child, delete a child, change a child."""
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'propset', 'p', 'v', dir)
path = os.path.join(dir, 'new_file')
svntest.main.file_write(path, "This is the file 'new_file'.\n")
- svntest.actions.run_and_verify_svn(None, None, [], 'add', path)
+ svntest.actions.run_and_verify_svn(None, [], 'add', path)
path = os.path.join(dir, 'B', 'lambda')
- svntest.actions.run_and_verify_svn(None, None, [], 'delete', path)
+ svntest.actions.run_and_verify_svn(None, [], 'delete', path)
path = os.path.join(dir, 'B', 'E', 'alpha')
svntest.main.file_append(path, "An extra line.\n")
# Prepare the repos so that a later 'update' has an incoming deletion:
# Delete the dir in the repos, making r2
- run_and_verify_svn(None, AnyOutput, [],
+ run_and_verify_svn(AnyOutput, [],
'-m', '', 'delete', dir_url)
# Existing scenario
@@ -4927,8 +4712,8 @@ def tree_conflict_uc2_schedule_re_add(sbox):
wc2 = sbox.add_wc_path('wc2')
dir2 = os.path.join(wc2, dir)
svntest.actions.duplicate_dir(sbox.wc_dir, wc2)
- run_and_verify_svn(None, AnyOutput, [], 'up', wc2)
- run_and_verify_svn(None, AnyOutput, [], 'copy', dir_url + '@1', dir2)
+ run_and_verify_svn(AnyOutput, [], 'up', wc2)
+ run_and_verify_svn(AnyOutput, [], 'copy', dir_url + '@1', dir2)
modify_dir(dir2)
# New scenario
@@ -5030,8 +4815,7 @@ def set_deep_depth_on_target_with_shallow_children(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'--set-depth', 'empty',
B_path)
@@ -5062,8 +4846,7 @@ def set_deep_depth_on_target_with_shallow_children(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'--set-depth', 'immediates',
D_path)
@@ -5091,8 +4874,7 @@ def set_deep_depth_on_target_with_shallow_children(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'--set-depth', 'infinity',
A_path)
@@ -5106,13 +4888,13 @@ def update_wc_of_dir_to_rev_not_containing_this_dir(sbox):
# Create working copy of 'A' directory
A_url = sbox.repo_url + "/A"
other_wc_dir = sbox.add_wc_path("other")
- svntest.actions.run_and_verify_svn(None, None, [], "co", A_url, other_wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], "co", A_url, other_wc_dir)
# Delete 'A' directory from repository
- svntest.actions.run_and_verify_svn(None, None, [], "rm", A_url, "-m", "")
+ svntest.actions.run_and_verify_svn(None, [], "rm", A_url, "-m", "")
# Try to update working copy of 'A' directory
- svntest.actions.run_and_verify_svn(None, None,
+ svntest.actions.run_and_verify_svn(None,
"svn: E160005: Target path '/A' does not exist",
"up", other_wc_dir)
@@ -5136,8 +4918,7 @@ def update_empty_hides_entries(sbox):
None,
expected_disk_empty,
expected_status_empty,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '0',
wc_dir)
@@ -5146,8 +4927,7 @@ def update_empty_hides_entries(sbox):
None,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
wc_dir)
# Update to revision 0 - Removes all files from WC
@@ -5155,8 +4935,7 @@ def update_empty_hides_entries(sbox):
None,
expected_disk_empty,
expected_status_empty,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '0',
wc_dir)
@@ -5165,8 +4944,7 @@ def update_empty_hides_entries(sbox):
None,
expected_disk_empty,
expected_status_empty,
- None, None, None,
- None, None, 1,
+ [], True,
'--depth', 'empty',
wc_dir)
@@ -5179,13 +4957,12 @@ def update_empty_hides_entries(sbox):
None,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
- wc_dir)
+ check_props=True)
#----------------------------------------------------------------------
# Test for issue #3573 'local non-inheritable mergeinfo changes not
# properly merged with updated mergeinfo'
+@SkipUnless(server_has_mergeinfo)
def mergeinfo_updates_merge_with_local_mods(sbox):
"local mergeinfo changes are merged with updates"
@@ -5203,29 +4980,29 @@ def mergeinfo_updates_merge_with_local_mods(sbox):
### No, we are not checking the merge output for these simple
### merges. This is already covered *TO DEATH* in merge_tests.py.
###
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c3', '--depth', 'empty',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r3 from A to A_COPY at depth empty',
wc_dir)
# Merge -c5 from A to A_COPY (at default --depth infinity), commit as r8.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c5',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ svntest.actions.run_and_verify_svn(None, [], 'ci', '-m',
'Merge r5 from A to A_COPY', wc_dir)
# Update WC to r7, repeat merge of -c3 from A to A_COPY but this
# time do it at --depth infinity. Confirm that the mergeinfo
# on A_COPY is no longer inheritable.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r7', wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', '-r7', wc_dir)
+ svntest.actions.run_and_verify_svn(None, [],
'merge', '-c3', '--depth', 'infinity',
sbox.repo_url + '/A', A_COPY_path)
- svntest.actions.run_and_verify_svn(None, [A_COPY_path + " - /A:3\n"], [],
+ svntest.actions.run_and_verify_svn([A_COPY_path + " - /A:3\n"], [],
'pg', SVN_PROP_MERGEINFO, '-R',
A_COPY_path)
@@ -5234,8 +5011,8 @@ def mergeinfo_updates_merge_with_local_mods(sbox):
# brought down by the update (/A:3* --> /A:3*,5) leaving us with /A:3,5.
### This was failing because of issue #3573. The local mergeinfo change
### is reverted, leaving '/A:3*,5' on A_COPY.
- svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
- svntest.actions.run_and_verify_svn(None, [A_COPY_path + " - /A:3,5\n"], [],
+ svntest.actions.run_and_verify_svn(None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn([A_COPY_path + " - /A:3,5\n"], [],
'pg', SVN_PROP_MERGEINFO, '-R',
A_COPY_path)
@@ -5260,7 +5037,7 @@ def update_with_excluded_subdir(sbox):
expected_status.remove('A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau')
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, False,
+ [], False,
'--set-depth=exclude', G)
# Commit a new revision so there is something to update to.
@@ -5320,7 +5097,7 @@ def update_nonexistent_child_of_copy(sbox):
'nonexistent' : Item(verb='Skipped'),
})
svntest.actions.run_and_verify_update(os.path.join('A2', 'nonexistent'),
- expected_output, None, None, None)
+ expected_output, None, None)
# Try updating a deleted path in the copied dir.
svntest.main.run_svn(None, 'delete', os.path.join('A2', 'mu'))
@@ -5329,7 +5106,7 @@ def update_nonexistent_child_of_copy(sbox):
'mu' : Item(verb='Skipped'),
})
svntest.actions.run_and_verify_update(os.path.join('A2', 'mu'),
- expected_output, None, None, None)
+ expected_output, None, None)
if os.path.exists('A2/mu'):
raise svntest.Failure("A2/mu improperly revived")
@@ -5396,9 +5173,8 @@ def skip_access_denied(sbox):
expected_output,
None,
expected_status,
- None,
- None, None,
- None, None, None, wc_dir, '-r', '1')
+ [], False,
+ wc_dir, '-r', '1')
f.close()
@@ -5413,19 +5189,19 @@ def update_to_HEAD_plus_1(sbox):
# revision".)
svntest.actions.run_and_verify_update(wc_dir,
None, None, None,
- "E160006.*No such.*revision",
- None, None,
- None, None, None, wc_dir, '-r', '2')
+ ".*E160006.*No such.*revision.*",
+ False,
+ wc_dir, '-r', '2')
other_wc = sbox.add_wc_path('other')
other_url = sbox.repo_url + '/A'
- svntest.actions.run_and_verify_svn("subtree checkout", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', other_url, other_wc)
svntest.actions.run_and_verify_update(other_wc,
None, None, None,
- "E160006.*No such.*revision",
- None, None,
- None, None, None, other_wc, '-r', '2')
+ ".*E160006.*No such.*revision.*",
+ False,
+ other_wc, '-r', '2')
def update_moved_dir_leaf_del(sbox):
"update locally moved dir with leaf del"
@@ -5465,12 +5241,11 @@ def update_moved_dir_leaf_del(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Now resolve the conflict, using --accept=mine-conflict applying
# the update to A/B/E2
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B/E'))
@@ -5520,13 +5295,12 @@ def update_moved_dir_edited_leaf_del(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Now resolve the conflict, using --accept=mine-conflict.
# This should apply the update to A/B/E2, and flag a tree
# conflict on A/B/E2/alpha (incoming delete vs. local edit)
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B/E'))
@@ -5579,12 +5353,11 @@ def update_moved_dir_file_add(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Now resolve the conflict, using --accept=mine-conflict.
# This should apply the update to A/B/E2, adding A/B/E2/foo.
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B/E'))
@@ -5640,9 +5413,8 @@ def update_moved_dir_dir_add(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ check_props=True)
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--recursive',
'--accept=mine-conflict', wc_dir)
@@ -5697,13 +5469,12 @@ def update_moved_dir_file_move(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# The incoming change is a delete as we don't yet track server-side
# moves. Resolving the tree-conflict as "mine-conflict" applies the
# delete to the move destination.
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B/E'))
@@ -5764,10 +5535,9 @@ def update_move_text_mod(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--recursive',
'--accept=mine-conflict',
@@ -5830,10 +5600,9 @@ def update_nested_move_text_mod(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--recursive',
'--accept=mine-conflict',
@@ -5866,8 +5635,7 @@ def update_with_parents_and_exclude(sbox):
expected_output,
None,
expected_status,
- None, None, None,
- None, None, False,
+ [], False,
'--set-depth', 'exclude',
sbox.ospath('A'))
@@ -5897,8 +5665,7 @@ def update_with_parents_and_exclude(sbox):
expected_output,
None,
expected_status,
- None, None, None,
- None, None, False,
+ [], False,
'--parents',
sbox.ospath('A/B'))
@@ -5982,8 +5749,7 @@ def update_edit_delete_obstruction(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '2', wc_dir)
# Cleanup obstructions
@@ -5993,7 +5759,7 @@ def update_edit_delete_obstruction(sbox):
os.rmdir(sbox.ospath('A/mu'))
# Revert to remove working nodes and tree conflicts
- svntest.actions.run_and_verify_svn('Reverting', None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'revert', '-R',
sbox.ospath('A/B'),
sbox.ospath('A/mu'),
@@ -6046,8 +5812,7 @@ def update_edit_delete_obstruction(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '3', wc_dir)
def update_deleted(sbox):
@@ -6069,8 +5834,7 @@ def update_deleted(sbox):
expected_output,
None,
None,
- None, None, None,
- None, None, 1,
+ [], True,
sbox.ospath('A/B'))
@Issue(3144,3630)
@@ -6115,13 +5879,12 @@ def break_moved_dir_edited_leaf_del(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Now resolve the conflict, using --accept=working
# This should break the move of A/B/E to A/B/E2, leaving A/B/E2
# as a copy. The deletion of A/B/E is not reverted.
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve', '--recursive',
'--accept=working', wc_dir)
expected_status.tweak('A/B/E', treeconflict=None, moved_to=None)
@@ -6178,13 +5941,12 @@ def break_moved_replaced_dir(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
# Now resolve the conflict, using --accept=working
# This should break the move of A/B/E to A/B/E2, leaving A/B/E2
# as a copy. A/B/E is not reverted.
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve', '--recursive',
'--accept=working', wc_dir)
expected_status.tweak('A/B/E2', moved_from=None)
@@ -6200,17 +5962,17 @@ def update_removes_switched(sbox):
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'cp', repo_url + '/A',
repo_url + '/AA', '-m', 'Q')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'co', repo_url + '/A', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'switch', repo_url + '/AA/B',
wc_dir + '/B')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', repo_url + '/AA/B', '-m', 'Q')
expected_output = svntest.wc.State(wc_dir, {
@@ -6358,8 +6120,7 @@ def incomplete_overcomplete(sbox):
expected_output,
r5_disk,
expected_status,
- None, None, None, None, None,
- True)
+ check_props=True)
# And now we mark the directory incomplete, as if the update had failed
# half-way through an update to r3
@@ -6389,8 +6150,7 @@ def incomplete_overcomplete(sbox):
expected_output,
r3_disk,
r3_status,
- None, None, None, None, None,
- True,
+ [], True,
wc_dir, '-r', 3)
@Issue(4300)
@@ -6456,8 +6216,7 @@ def update_swapped_depth_dirs(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1)
+ check_props=True)
def move_update_props(sbox):
"move-update with property mods"
@@ -6516,12 +6275,11 @@ def move_update_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '2', wc_dir)
# Resolve conflict moving changes to destination without conflict
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B'))
@@ -6543,12 +6301,11 @@ def move_update_props(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, 1,
+ [], True,
'-r', '3', wc_dir)
# Resolve conflict moving changes and raising property conflicts
- svntest.actions.run_and_verify_svn("resolve failed", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'resolve',
'--accept=mine-conflict',
sbox.ospath('A/B'))
@@ -6563,11 +6320,10 @@ def move_update_props(sbox):
'propertyB' : 'value3'})
extra_files = ['dir_conflicts.prej', 'beta.prej']
svntest.actions.verify_disk(wc_dir, expected_disk, True,
- svntest.tree.detect_conflict_files, extra_files)
+ extra_files=extra_files)
@Issues(3288)
@SkipUnless(svntest.main.is_os_windows)
-@XFail(svntest.main.is_ra_type_dav)
def windows_update_backslash(sbox):
"test filename with backslashes inside"
@@ -6575,17 +6331,52 @@ def windows_update_backslash(sbox):
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svnmucc(None, None, [],
- '-U', sbox.repo_url,
+ mucc_url = sbox.repo_url
+
+ if mucc_url.startswith('http'):
+ # Apache Httpd doesn't allow creating paths with '\\' in them on Windows
+ # AH00026: found %2f (encoded '/') in URI (decoded='/svn-test-work/repositories/authz_tests-30/!svn/ver/2/A/completely\\unusable\\dir'), returning 404
+ #
+ # Let's use file:// to work around.
+ mucc_url = 'file:///' + os.path.abspath(sbox.repo_dir).replace('\\', '/')
+
+ svntest.actions.run_and_verify_svnmucc(None, [],
+ '-U', mucc_url,
'-m', '',
'mkdir', 'A/completely\\unusable\\dir')
# No error and a proper skip + recording in the working copy would also
- # be a good result. This just verifies current behavior.
-
- expected_error = 'svn: E155000: .* is not valid.*'
- svntest.actions.run_and_verify_svn(wc_dir, None, expected_error, 'up',
- wc_dir)
+ # be a good result. This just verifies current behavior:
+ #
+ # - Error via file://, svn:// or http:// with SVNPathAuthz short_circuit
+ #
+ # - No error via http:// with SVNPathAuthz on
+ # (The reason is that Apache Httpd doesn't allow paths with '\\' in
+ # them on Windows, and a subrequest-based access check returns 404.
+ # This makes mod_dav_svn report the path as server excluded (aka
+ # absent), which doesn't produce output when updating.)
+ #
+ # Since https://issues.apache.org/jira/browse/SVN-3288 is about a crash,
+ # we're fine with either result -- that is, if `svn update' finished
+ # without an error, we expect specific stdout and proper wc state.
+ # If it failed, we expect to get the following error:
+ #
+ # svn: E155000: 'completely\unusable\dir' is not valid as filename
+ # in directory [...]
+ #
+ exit_code, output, errput = svntest.main.run_svn(1, 'up', wc_dir)
+ if exit_code == 0:
+ verify.verify_outputs("Unexpected output", output, errput, [
+ "Updating '%s':\n" % wc_dir,
+ "At revision 2.\n"
+ ], [])
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+ elif exit_code == 1:
+ verify.verify_outputs("Unexpected output", output, errput,
+ None, 'svn: E155000: .* is not valid.*')
+ else:
+ raise verify.SVNUnexpectedExitCode(exit_code)
def update_moved_away(sbox):
"update subtree of moved away"
@@ -6665,8 +6456,7 @@ def update_moved_away(sbox):
expected_output,
expected_disk,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
sbox.ospath('A/B/E'))
@Issues(4323)
@@ -6676,7 +6466,7 @@ def bump_below_tree_conflict(sbox):
sbox.build()
wc_dir = sbox.wc_dir
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'rm', sbox.repo_url + '/A/B',
'-m', '')
@@ -6707,8 +6497,7 @@ def bump_below_tree_conflict(sbox):
expected_output,
None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
'-r', '2', wc_dir)
# A is tree conflicted, so an update of A/D should be a skip/no-op.
@@ -6719,8 +6508,7 @@ def bump_below_tree_conflict(sbox):
expected_output,
None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
sbox.ospath('A/D'))
# A is tree conflicted, so an update of A/D/G should be a skip/no-op.
@@ -6731,8 +6519,7 @@ def bump_below_tree_conflict(sbox):
expected_output,
None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
sbox.ospath('A/D/G'))
@Issues(4111)
@@ -6743,21 +6530,19 @@ def update_child_below_add(sbox):
wc_dir = sbox.wc_dir
sbox.simple_update('A/B', 0)
+ e_path = sbox.ospath('A/B/E')
- # Update skips A/B/E because A/B has a not-present BASE node.
- expected_output = svntest.wc.State(wc_dir, {
- 'A/B/E' : Item(verb='Skipped'),
- })
+ # Update skips and errors on A/B/E because A/B has a not-present BASE node.
+ expected_output = ["Skipped '"+e_path+"'\n"]
+ expected_err = "svn: E155007: "
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.remove('A/B', 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
'A/B/F', 'A/B/lambda')
- svntest.actions.run_and_verify_update(wc_dir,
- expected_output,
- None,
- expected_status,
- None, None, None,
- None, None, None,
- sbox.ospath('A/B/E'))
+ svntest.actions.run_and_verify_svn(expected_output,
+ expected_err,
+ 'update', e_path)
+ svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
# Add working nodes over A/B
sbox.simple_mkdir('A/B')
@@ -6769,15 +6554,241 @@ def update_child_below_add(sbox):
'A/B/E' : Item(status='A ', wc_rev='-'),
'A/B/E/alpha' : Item(status='A ', wc_rev='-'),
})
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B/E' : Item(verb='Skipped'),
+ })
# Update should still skip A/B/E
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
None,
expected_status,
- None, None, None,
- None, None, None,
+ [], False,
sbox.ospath('A/B/E'))
+def update_conflict_details(sbox):
+ "update conflict details"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('A/B/E/new', 'new\n')
+ sbox.simple_add('A/B/E/new')
+ sbox.simple_append('A/B/E/alpha', '\nextra\nlines\n')
+ sbox.simple_rm('A/B/E/beta', 'A/B/F')
+ sbox.simple_propset('key', 'VAL', 'A/B/E', 'A/B')
+ sbox.simple_mkdir('A/B/E/new-dir1')
+ sbox.simple_mkdir('A/B/E/new-dir2')
+ sbox.simple_mkdir('A/B/E/new-dir3')
+ sbox.simple_rm('A/B/lambda')
+ sbox.simple_mkdir('A/B/lambda')
+ sbox.simple_commit()
+
+ sbox.simple_update('', 1)
+
+ sbox.simple_propset('key', 'vAl', 'A/B')
+ sbox.simple_move('A/B/E/beta', 'beta')
+ sbox.simple_propset('a', 'b', 'A/B/F', 'A/B/lambda')
+ sbox.simple_append('A/B/E/alpha', 'other\nnew\nlines')
+ sbox.simple_mkdir('A/B/E/new')
+ sbox.simple_mkdir('A/B/E/new-dir1')
+ sbox.simple_append('A/B/E/new-dir2', 'something')
+ sbox.simple_append('A/B/E/new-dir3', 'something')
+ sbox.simple_add('A/B/E/new-dir3')
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+ expected_status.add({
+ 'A/B/E/new' : Item(status='R ', treeconflict='C', wc_rev='2'),
+ 'A/B/E/new-dir2' : Item(status='D ', treeconflict='C', wc_rev='2'),
+ 'A/B/E/new-dir3' : Item(status='R ', treeconflict='C', wc_rev='2'),
+ 'A/B/E/new-dir1' : Item(status=' ', wc_rev='2'),
+ 'A/C' : Item(status=' ', wc_rev='2'),
+ 'iota' : Item(status=' ', wc_rev='2'),
+ 'beta' : Item(status='A ', copied='+', wc_rev='-')
+ })
+ expected_status.tweak('A/B', status=' C', wc_rev='2')
+ expected_status.tweak('A/B/E/alpha', status='C ', wc_rev='2')
+ expected_status.tweak('A/B/E/beta', status='! ', treeconflict='C', wc_rev=None)
+ expected_status.tweak('A/B/F', status='A ', copied='+', treeconflict='C', wc_rev='-')
+ expected_status.tweak('A/B/lambda', status='RM', copied='+', treeconflict='C', wc_rev='-')
+ expected_status.tweak('A/mu', status=' ', wc_rev='2')
+ expected_output = svntest.wc.State(wc_dir, {
+ 'A/B' : Item(status=' C'),
+ 'A/B/E' : Item(status=' U'),
+ 'A/B/E/new' : Item(status=' ', treeconflict='C'),
+ 'A/B/E/beta' : Item(status=' ', treeconflict='C'),
+ 'A/B/E/alpha' : Item(status='C '),
+ 'A/B/E/new-dir2' : Item(status=' ', treeconflict='C'),
+ 'A/B/E/new-dir3' : Item(status=' ', treeconflict='C'),
+ 'A/B/E/new-dir1' : Item(status='E '),
+ 'A/B/F' : Item(status=' ', treeconflict='C'),
+ # ### 2 tree conflict reports; one for delete; one for add...
+ 'A/B/lambda' : Item(status=' ', treeconflict='A',
+ prev_status=' ', prev_treeconflict='C'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir, expected_output,
+ None, expected_status)
+
+ # Update can't pass source as none at a specific URL@revision,
+ # because it doesn't know... the working copy could be mixed
+ # revision or may have excluded parts...
+ expected_info = [
+ {
+ "Path" : re.escape(sbox.ospath('A/B')),
+
+ "Conflict Properties File" :
+ re.escape(sbox.ospath('A/B/dir_conflicts.prej')) + '.*',
+ "Conflict Details": re.escape(
+ 'incoming dir edit upon update' +
+ ' Source left: (dir) ^/A/B@1' +
+ ' Source right: (dir) ^/A/B@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E')),
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/alpha')),
+ "Conflict Previous Base File" : '.*alpha.*',
+ "Conflict Previous Working File" : '.*alpha.*',
+ "Conflict Current Base File": '.*alpha.*',
+ "Conflict Details": re.escape(
+ 'incoming file edit upon update' +
+ ' Source left: (file) ^/A/B/E/alpha@1' +
+ ' Source right: (file) ^/A/B/E/alpha@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/beta')),
+ "Tree conflict": re.escape(
+ 'local file moved away, incoming file delete or move upon update' +
+ ' Source left: (file) ^/A/B/E/beta@1' +
+ ' Source right: (none) ^/A/B/E/beta@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/new')),
+ "Tree conflict": re.escape(
+ 'local dir add, incoming file add upon update' +
+ ' Source left: (none)' +
+ ' Source right: (file) ^/A/B/E/new@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/new-dir1')),
+ # No tree conflict. Existing directory taken over
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/new-dir2')),
+ "Tree conflict": re.escape(
+ 'local file unversioned, incoming dir add upon update' +
+ ' Source left: (none)' +
+ ' Source right: (dir) ^/A/B/E/new-dir2@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/E/new-dir3')),
+ "Tree conflict": re.escape(
+ 'local file add, incoming dir add upon update' +
+ ' Source left: (none)' +
+ ' Source right: (dir) ^/A/B/E/new-dir3@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/F')),
+ "Tree conflict": re.escape(
+ 'local dir edit, incoming dir delete or move upon update' +
+ ' Source left: (dir) ^/A/B/F@1' +
+ ' Source right: (none) ^/A/B/F@2')
+ },
+ {
+ "Path" : re.escape(sbox.ospath('A/B/lambda')),
+ "Tree conflict": re.escape(
+ 'local file edit, incoming replace with dir upon update' +
+ ' Source left: (file) ^/A/B/lambda@1' +
+ ' Source right: (dir) ^/A/B/lambda@2')
+ },
+ ]
+
+ svntest.actions.run_and_verify_info(expected_info, sbox.ospath('A/B'),
+ '--depth', 'infinity')
+
+def update_add_conflicted_deep(sbox):
+ "deep add conflicted"
+
+ sbox.build()
+ repo_url = sbox.repo_url
+
+ svntest.actions.run_and_verify_svnmucc(
+ None, [], '-U', repo_url, '-m', '',
+ 'mkdir', 'A/z',
+ 'mkdir', 'A/z/z',
+ 'mkdir', 'A/z/z/z')
+
+ svntest.actions.run_and_verify_svnmucc(
+ None, [], '-U', repo_url, '-m', '',
+ 'rm', 'A/z',
+ 'mkdir', 'A/z',
+ 'mkdir', 'A/z/z',
+ 'mkdir', 'A/z/z/z')
+
+ sbox.simple_append('A/z', 'A/z')
+ sbox.simple_add('A/z')
+ sbox.simple_update('A', 2)
+ # This final update used to segfault using 1.9.0 and 1.9.1
+ sbox.simple_update('A/z/z', 3)
+
+def missing_tmp_update(sbox):
+ "missing tmp update caused segfault"
+
+ sbox.build(read_only = True)
+ wc_dir = sbox.wc_dir
+ svntest.actions.run_and_verify_update(wc_dir, None, None, None, [], False,
+ wc_dir, '--set-depth', 'empty')
+
+ os.rmdir(sbox.ospath(svntest.main.get_admin_name() + '/tmp'))
+
+ svntest.actions.run_and_verify_svn(None, '.*Unable to create.*',
+ 'up', wc_dir, '--set-depth', 'infinity')
+
+ svntest.actions.run_and_verify_svn(None, [], 'cleanup', wc_dir)
+
+ svntest.actions.run_and_verify_update(wc_dir, None, None, None, [], False,
+ wc_dir, '--set-depth', 'infinity')
+
+def update_delete_switched(sbox):
+ "update delete switched"
+
+ sbox.build(read_only = True)
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.run_and_verify_switch(wc_dir, sbox.ospath('A/B/E'),
+ sbox.repo_url + '/A/D/G',
+ None, None, None, [], False,
+ '--ignore-ancestry')
+
+ # Introduce some change somewhere...
+ sbox.simple_propset('A', 'A', 'A')
+
+ expected_status = svntest.wc.State(wc_dir, {
+ '' : Item(status=' ', wc_rev='1'),
+ 'A' : Item(status='A ', copied='+', treeconflict='C', wc_rev='-'),
+ 'A/B' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/E' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B/E/rho' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/E/pi' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/E/tau' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/lambda' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B/F' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/G' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/G/pi' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/G/tau' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/G/rho' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/gamma' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/H' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/H/omega' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/H/psi' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/D/H/chi' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/mu' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/C' : Item(status=' ', copied='+', wc_rev='-'),
+ 'iota' : Item(status=' ', wc_rev='1'),
+ })
+ svntest.actions.run_and_verify_update(wc_dir, None, None, expected_status,
+ [], False, sbox.ospath('A'), '-r', 0)
#######################################################################
# Run the tests
@@ -6823,7 +6834,6 @@ test_list = [ None,
update_copied_from_replaced_and_changed,
update_copied_and_deleted_prop,
update_accept_conflicts,
- eof_in_interactive_conflict_resolver,
update_uuid_changed,
restarted_update_should_delete_dir_prop,
tree_conflicts_on_update_1_1,
@@ -6865,6 +6875,10 @@ test_list = [ None,
update_moved_away,
bump_below_tree_conflict,
update_child_below_add,
+ update_conflict_details,
+ update_add_conflicted_deep,
+ missing_tmp_update,
+ update_delete_switched,
]
if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/upgrade_tests.py b/subversion/tests/cmdline/upgrade_tests.py
index 839206e..57aabae 100755
--- a/subversion/tests/cmdline/upgrade_tests.py
+++ b/subversion/tests/cmdline/upgrade_tests.py
@@ -109,8 +109,7 @@ def check_format(sbox, expected_format):
raise svntest.Failure("found format '%d'; expected '%d'; in wc '%s'" %
(found_format, expected_format, root))
- if svntest.main.wc_is_singledb(sbox.wc_dir):
- dirs[:] = []
+ dirs[:] = []
if dot_svn in dirs:
dirs.remove(dot_svn)
@@ -258,7 +257,7 @@ def basic_upgrade(sbox):
replace_sbox_with_tarfile(sbox, 'basic_upgrade.tar.bz2')
# Attempt to use the working copy, this should give an error
- svntest.actions.run_and_verify_svn(None, None, wc_is_too_old_regex,
+ svntest.actions.run_and_verify_svn(None, wc_is_too_old_regex,
'info', sbox.wc_dir)
# Upgrade on something anywhere within a versioned subdir gives a
@@ -267,24 +266,24 @@ def basic_upgrade(sbox):
# Both cases use the same error code.
not_wc = ".*(E155007|E155019).*%s'.*not a working copy.*"
os.mkdir(sbox.ospath('X'))
- svntest.actions.run_and_verify_svn(None, None, not_wc % 'X',
+ svntest.actions.run_and_verify_svn(None, not_wc % 'X',
'upgrade', sbox.ospath('X'))
# Upgrade on a non-existent subdir within an old WC gives a
# 'not a working copy' error.
- svntest.actions.run_and_verify_svn(None, None, not_wc % 'Y',
+ svntest.actions.run_and_verify_svn(None, not_wc % 'Y',
'upgrade', sbox.ospath('Y'))
# Upgrade on a versioned file within an old WC gives a
# 'not a working copy' error.
- svntest.actions.run_and_verify_svn(None, None, not_wc % 'mu',
+ svntest.actions.run_and_verify_svn(None, not_wc % 'mu',
'upgrade', sbox.ospath('A/mu'))
# Upgrade on a versioned dir within an old WC gives a
# 'not a working copy' error.
- svntest.actions.run_and_verify_svn(None, None, not_wc % 'A',
+ svntest.actions.run_and_verify_svn(None, not_wc % 'A',
'upgrade', sbox.ospath('A'))
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# Actually check the format number of the upgraded working copy
@@ -304,10 +303,10 @@ def upgrade_with_externals(sbox):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'info', sbox.wc_dir)
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# Actually check the format number of the upgraded working copy
@@ -320,12 +319,12 @@ def upgrade_1_5_body(sbox, subcommand):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
subcommand, sbox.wc_dir)
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# Check the format of the working copy
@@ -359,7 +358,7 @@ def logs_left_1_5(sbox):
# Try to upgrade, this should give an error
expected_stderr = (".*Cannot upgrade with existing logs; .*")
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'upgrade', sbox.wc_dir)
@@ -367,7 +366,7 @@ def upgrade_wcprops(sbox):
"test upgrading a working copy with wcprops"
replace_sbox_with_tarfile(sbox, 'upgrade_wcprops.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# Make sure that .svn/all-wcprops has disappeared
@@ -437,15 +436,15 @@ def basic_upgrade_1_0(sbox):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'info', sbox.wc_dir)
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# And the separate working copy below COPIED or check_format() fails
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade',
os.path.join(sbox.wc_dir, 'COPIED', 'G'))
@@ -521,12 +520,12 @@ def basic_upgrade_1_0(sbox):
def do_x3_upgrade(sbox, expected_error=[]):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'info', sbox.wc_dir)
# Now upgrade the working copy
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ svntest.actions.run_and_verify_svn(None, expected_error,
'upgrade', sbox.wc_dir)
if expected_error != []:
@@ -600,7 +599,7 @@ def do_x3_upgrade(sbox, expected_error=[]):
'A/G_new/rho' : {'svn:eol-style': 'native'}
})
- svntest.actions.run_and_verify_svn(None, 'Reverted.*', [],
+ svntest.actions.run_and_verify_svn('Reverted.*', [],
'revert', '-R', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
@@ -665,7 +664,7 @@ def missing_dirs(sbox):
# touch wc/A/D wc/A/B_new/F
replace_sbox_with_tarfile(sbox, 'missing-dirs.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -694,7 +693,7 @@ def missing_dirs2(sbox):
os.remove(sbox.ospath('A/B_new/F'))
os.mkdir(sbox.ospath('A/D'))
os.mkdir(sbox.ospath('A/B_new/F'))
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -721,7 +720,7 @@ def delete_and_keep_local(sbox):
replace_sbox_with_tarfile(sbox, 'wc-delete.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
@@ -752,7 +751,7 @@ def dirs_only_upgrade(sbox):
expected_output = ["Upgraded '%s'\n" % (sbox.ospath('').rstrip(os.path.sep)),
"Upgraded '%s'\n" % (sbox.ospath('A'))]
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir, {
@@ -823,7 +822,7 @@ def delete_in_copy_upgrade(sbox):
wc_dir = sbox.wc_dir
replace_sbox_with_tarfile(sbox, 'delete-in-copy.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
@@ -837,7 +836,7 @@ def delete_in_copy_upgrade(sbox):
})
run_and_verify_status_no_server(sbox.wc_dir, expected_status)
- svntest.actions.run_and_verify_svn(None, 'Reverted.*', [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn('Reverted.*', [], 'revert', '-R',
sbox.ospath('A/B-copied/E'))
expected_status.tweak('A/B-copied/E',
@@ -856,7 +855,7 @@ def replaced_files(sbox):
wc_dir = sbox.wc_dir
replace_sbox_with_tarfile(sbox, 'replaced-files.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
# A is a checked-out dir containing A/f and A/g, then
@@ -894,7 +893,7 @@ def replaced_files(sbox):
[sbox.ospath('B/f'), '395dfb603d8a4e0348d0b082803f2b7426c76eb9'],
[sbox.ospath('B/g'), None]])
- svntest.actions.run_and_verify_svn(None, 'Reverted.*', [], 'revert',
+ svntest.actions.run_and_verify_svn('Reverted.*', [], 'revert',
sbox.ospath('A/f'), sbox.ospath('B/f'),
sbox.ospath('A/g'), sbox.ospath('B/g'))
@@ -916,7 +915,7 @@ def upgrade_with_scheduled_change(sbox):
replace_sbox_with_tarfile(sbox, 'upgrade_with_scheduled_change.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, [],
'upgrade', sbox.wc_dir)
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
expected_status.add({
@@ -930,21 +929,21 @@ def tree_replace1(sbox):
replace_sbox_with_tarfile(sbox, 'tree-replace1.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
'' : Item(status=' M', wc_rev=17),
'B' : Item(status='R ', copied='+', wc_rev='-'),
- 'B/f' : Item(status='R ', copied='+', wc_rev='-'),
+ 'B/f' : Item(status=' ', copied='+', wc_rev='-'),
'B/g' : Item(status='D ', wc_rev=17),
- 'B/h' : Item(status='A ', copied='+', wc_rev='-'),
- 'B/C' : Item(status='R ', copied='+', wc_rev='-'),
- 'B/C/f' : Item(status='R ', copied='+', wc_rev='-'),
+ 'B/h' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/C' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/C/f' : Item(status=' ', copied='+', wc_rev='-'),
'B/D' : Item(status='D ', wc_rev=17),
'B/D/f' : Item(status='D ', wc_rev=17),
- 'B/E' : Item(status='A ', copied='+', wc_rev='-'),
- 'B/E/f' : Item(status='A ', copied='+', wc_rev='-'),
+ 'B/E' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/E/f' : Item(status=' ', copied='+', wc_rev='-'),
})
run_and_verify_status_no_server(sbox.wc_dir, expected_status)
@@ -954,7 +953,7 @@ def tree_replace2(sbox):
replace_sbox_with_tarfile(sbox, 'tree-replace2.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -962,11 +961,11 @@ def tree_replace2(sbox):
'B' : Item(status='R ', copied='+', wc_rev='-'),
'B/f' : Item(status='D ', wc_rev=12),
'B/D' : Item(status='D ', wc_rev=12),
- 'B/g' : Item(status='A ', copied='+', wc_rev='-'),
- 'B/E' : Item(status='A ', copied='+', wc_rev='-'),
+ 'B/g' : Item(status=' ', copied='+', wc_rev='-'),
+ 'B/E' : Item(status=' ', copied='+', wc_rev='-'),
'C' : Item(status='R ', copied='+', wc_rev='-'),
- 'C/f' : Item(status='A ', copied='+', wc_rev='-'),
- 'C/D' : Item(status='A ', copied='+', wc_rev='-'),
+ 'C/f' : Item(status=' ', copied='+', wc_rev='-'),
+ 'C/D' : Item(status=' ', copied='+', wc_rev='-'),
'C/g' : Item(status='D ', wc_rev=12),
'C/E' : Item(status='D ', wc_rev=12),
})
@@ -988,7 +987,7 @@ def upgrade_from_format_28(sbox):
assert not os.path.exists(new_pristine_path)
# Upgrade the WC
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
assert not os.path.exists(old_pristine_path)
assert os.path.exists(new_pristine_path)
@@ -999,7 +998,7 @@ def depth_exclude(sbox):
replace_sbox_with_tarfile(sbox, 'depth_exclude.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -1015,7 +1014,7 @@ def depth_exclude_2(sbox):
replace_sbox_with_tarfile(sbox, 'depth_exclude_2.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -1030,7 +1029,7 @@ def add_add_del_del_tc(sbox):
replace_sbox_with_tarfile(sbox, 'add_add_del_del_tc.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -1048,7 +1047,7 @@ def add_add_x2(sbox):
replace_sbox_with_tarfile(sbox, 'add_add_x2.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -1078,7 +1077,7 @@ def upgrade_with_missing_subdir(sbox):
# Attempt to use the working copy, this should give an error
expected_stderr = wc_is_too_old_regex
- svntest.actions.run_and_verify_svn(None, None, expected_stderr,
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
'info', sbox.wc_dir)
# Now remove a subdirectory
@@ -1094,7 +1093,7 @@ def upgrade_with_missing_subdir(sbox):
"Upgraded '%s'\n" % sbox.ospath('A/D/G'),
"Upgraded '%s'\n" % sbox.ospath('A/D/H'),
])
- svntest.actions.run_and_verify_svn(None, expected_output, [],
+ svntest.actions.run_and_verify_svn(expected_output, [],
'upgrade', sbox.wc_dir)
# And now perform an update. (This used to fail with an assertion)
@@ -1122,7 +1121,7 @@ def upgrade_locked(sbox):
replace_sbox_with_tarfile(sbox, 'upgrade_locked.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
expected_status = svntest.wc.State(sbox.wc_dir,
{
@@ -1145,21 +1144,21 @@ def upgrade_file_externals(sbox):
'07146bbd-0b64-4aaf-ab70-cd76a0df2d41')
expected_output = svntest.verify.RegexOutput('r2 committed.*')
- svntest.actions.run_and_verify_svnmucc(None, expected_output, [],
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
'-m', 'r2',
'propset', 'svn:externals',
'^/A/B/E EX\n^/A/mu muX',
sbox.repo_url + '/A/B/F')
expected_output = svntest.verify.RegexOutput('r3 committed.*')
- svntest.actions.run_and_verify_svnmucc(None, expected_output, [],
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
'-m', 'r3',
'propset', 'svn:externals',
'^/A/B/F FX\n^/A/B/lambda lambdaX',
sbox.repo_url + '/A/C')
expected_output = svntest.verify.RegexOutput('r4 committed.*')
- svntest.actions.run_and_verify_svnmucc(None, expected_output, [],
+ svntest.actions.run_and_verify_svnmucc(expected_output, [],
'-m', 'r4',
'propset', 'pname1', 'pvalue1',
sbox.repo_url + '/A/mu',
@@ -1168,8 +1167,8 @@ def upgrade_file_externals(sbox):
'propset', 'pname3', 'pvalue3',
sbox.repo_url + '/A/B/E/alpha')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'file:///tmp/repo', sbox.repo_url,
sbox.wc_dir)
@@ -1214,10 +1213,10 @@ def upgrade_missing_replaced(sbox):
sbox.build(create_wc=False)
replace_sbox_with_tarfile(sbox, 'upgrade_missing_replaced.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
svntest.main.run_svnadmin('setuuid', sbox.repo_dir,
'd7130b12-92f6-45c9-9217-b9f0472c3fab')
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'file:///tmp/repo', sbox.repo_url,
sbox.wc_dir)
@@ -1240,7 +1239,7 @@ def upgrade_missing_replaced(sbox):
svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output,
None, expected_status)
- svntest.actions.run_and_verify_svn(None, 'Reverted.*', [], 'revert', '-R',
+ svntest.actions.run_and_verify_svn('Reverted.*', [], 'revert', '-R',
sbox.wc_dir)
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
# And verify that the state is now valid in both the entries an status world.
@@ -1253,10 +1252,10 @@ def upgrade_not_present_replaced(sbox):
sbox.build(create_wc=False)
replace_sbox_with_tarfile(sbox, 'upgrade_not_present_replaced.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
svntest.main.run_svnadmin('setuuid', sbox.repo_dir,
'd7130b12-92f6-45c9-9217-b9f0472c3fab')
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'file:///tmp/repo', sbox.repo_url,
sbox.wc_dir)
@@ -1279,15 +1278,15 @@ def upgrade_from_1_7_conflict(sbox):
# The working copy contains a text conflict, and upgrading such
# a working copy used to cause a pointless 'upgrade required' error.
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
def do_iprops_upgrade(nonrootfile, rootfile, sbox):
wc_dir = sbox.wc_dir
replace_sbox_with_tarfile(sbox, nonrootfile)
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'file:///tmp/repo', sbox.repo_url, wc_dir)
expected_output = []
@@ -1334,8 +1333,8 @@ def do_iprops_upgrade(nonrootfile, rootfile, sbox):
# Now try with a repository root working copy
replace_sbox_with_tarfile(sbox, rootfile)
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
- svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'relocate',
'file:///tmp/repo', sbox.repo_url, wc_dir)
# Unswitched inherited props available after upgrade
@@ -1418,7 +1417,7 @@ def changelist_upgrade_1_6(sbox):
svntest.main.run_svnadmin('setuuid', sbox.repo_dir,
'aa4c97bd-2e1a-4e55-a1e5-3db22cff2673')
replace_sbox_with_tarfile(sbox, 'changelist_upgrade_1_6.tar.bz2')
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
exit_code, output, errput = svntest.main.run_svn(None, 'info', sbox.wc_dir,
'--depth', 'infinity',
@@ -1437,8 +1436,9 @@ def upgrade_1_7_dir_external(sbox):
# This fails for 'make check EXCLUSIVE_WC_LOCKS=1' giving an error:
# svn: warning: W200033: sqlite[S5]: database is locked
- svntest.actions.run_and_verify_svn(None, None, [], 'upgrade', sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(None, [], 'upgrade', sbox.wc_dir)
+@SkipUnless(svntest.wc.python_sqlite_can_read_wc)
def auto_analyze(sbox):
"""automatic SQLite ANALYZE"""
@@ -1480,6 +1480,90 @@ def auto_analyze(sbox):
if val != [(1,)]:
raise svntest.Failure("analyze failed")
+def upgrade_1_0_with_externals(sbox):
+ "test upgrading 1.0.0 working copy with externals"
+
+ sbox.build(create_wc = False)
+ replace_sbox_with_tarfile(sbox, 'upgrade_1_0_with_externals.tar.bz2')
+
+ url = sbox.repo_url
+
+ # This is non-canonical by the rules of svn_uri_canonicalize, it gets
+ # written into the entries file and upgrade has to canonicalize.
+ non_canonical_url = url[:-1] + '%%%02x' % ord(url[-1])
+ xml_entries_relocate(sbox.wc_dir, 'file:///1.0.0/repos', non_canonical_url)
+
+ externals_propval = 'exdir_G ' + sbox.repo_url + '/A/D/G' + '\n'
+ adm_name = svntest.main.get_admin_name()
+ dir_props_file = os.path.join(sbox.wc_dir, adm_name, 'dir-props')
+ svntest.main.file_write(dir_props_file,
+ ('K 13\n'
+ 'svn:externals\n'
+ 'V %d\n' % len(externals_propval))
+ + externals_propval + '\nEND\n', 'wb')
+
+ # Attempt to use the working copy, this should give an error
+ expected_stderr = wc_is_too_old_regex
+ svntest.actions.run_and_verify_svn(None, expected_stderr,
+ 'info', sbox.wc_dir)
+
+
+ # Now upgrade the working copy
+ svntest.actions.run_and_verify_svn(None, [],
+ 'upgrade', sbox.wc_dir)
+ # And the separate working copy below COPIED or check_format() fails
+ svntest.actions.run_and_verify_svn(None, [],
+ 'upgrade',
+ os.path.join(sbox.wc_dir, 'COPIED', 'G'))
+
+ # Actually check the format number of the upgraded working copy
+ check_format(sbox, get_current_format())
+
+ # Now check the contents of the working copy
+ # #### This working copy is not just a basic tree,
+ # fix with the right data once we get here
+ expected_status = svntest.wc.State(sbox.wc_dir,
+ {
+ '' : Item(status=' M', wc_rev=7),
+ 'B' : Item(status=' ', wc_rev='7'),
+ 'B/mu' : Item(status=' ', wc_rev='7'),
+ 'B/D' : Item(status=' ', wc_rev='7'),
+ 'B/D/H' : Item(status=' ', wc_rev='7'),
+ 'B/D/H/psi' : Item(status=' ', wc_rev='7'),
+ 'B/D/H/omega' : Item(status=' ', wc_rev='7'),
+ 'B/D/H/zeta' : Item(status='MM', wc_rev='7'),
+ 'B/D/H/chi' : Item(status=' ', wc_rev='7'),
+ 'B/D/gamma' : Item(status=' ', wc_rev='9'),
+ 'B/D/G' : Item(status=' ', wc_rev='7'),
+ 'B/D/G/tau' : Item(status=' ', wc_rev='7'),
+ 'B/D/G/rho' : Item(status=' ', wc_rev='7'),
+ 'B/D/G/pi' : Item(status=' ', wc_rev='7'),
+ 'B/B' : Item(status=' ', wc_rev='7'),
+ 'B/B/lambda' : Item(status=' ', wc_rev='7'),
+ 'MKDIR' : Item(status='A ', wc_rev='0'),
+ 'MKDIR/MKDIR' : Item(status='A ', wc_rev='0'),
+ 'A' : Item(status=' ', wc_rev='7'),
+ 'A/B' : Item(status=' ', wc_rev='7'),
+ 'A/B/lambda' : Item(status=' ', wc_rev='7'),
+ 'A/D' : Item(status=' ', wc_rev='7'),
+ 'A/D/G' : Item(status=' ', wc_rev='7'),
+ 'A/D/G/rho' : Item(status=' ', wc_rev='7'),
+ 'A/D/G/pi' : Item(status=' ', wc_rev='7'),
+ 'A/D/G/tau' : Item(status=' ', wc_rev='7'),
+ 'A/D/H' : Item(status=' ', wc_rev='7'),
+ 'A/D/H/psi' : Item(status=' ', wc_rev='7'),
+ 'A/D/H/omega' : Item(status=' ', wc_rev='7'),
+ 'A/D/H/zeta' : Item(status=' ', wc_rev='7'),
+ 'A/D/H/chi' : Item(status=' ', wc_rev='7'),
+ 'A/D/gamma' : Item(status=' ', wc_rev='7'),
+ 'A/mu' : Item(status=' ', wc_rev='7'),
+ 'iota' : Item(status=' ', wc_rev='7'),
+ 'COPIED' : Item(status=' ', wc_rev='10'),
+ 'DELETED' : Item(status='D ', wc_rev='10'),
+ 'exdir_G' : Item(status='X '),
+ })
+ run_and_verify_status_no_server(sbox.wc_dir, expected_status)
+
########################################################################
# Run the tests
@@ -1537,6 +1621,7 @@ test_list = [ None,
changelist_upgrade_1_6,
upgrade_1_7_dir_external,
auto_analyze,
+ upgrade_1_0_with_externals,
]
diff --git a/subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2 b/subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2
new file mode 100644
index 0000000..c3d8da5
--- /dev/null
+++ b/subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2
Binary files differ
diff --git a/subversion/tests/cmdline/wc_tests.py b/subversion/tests/cmdline/wc_tests.py
index 75f6743..185acad 100755
--- a/subversion/tests/cmdline/wc_tests.py
+++ b/subversion/tests/cmdline/wc_tests.py
@@ -42,6 +42,7 @@ Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
Item = wc.StateItem
+UnorderedOutput = svntest.verify.UnorderedOutput
######################################################################
# Tests
@@ -131,7 +132,7 @@ def status_with_inaccessible_wc_db(sbox):
sbox.build(read_only = True)
os.chmod(sbox.ospath(".svn/wc.db"), 0)
svntest.actions.run_and_verify_svn(
- "Status when wc.db is not accessible", None,
+ None,
r"[^ ]+ E155016: The working copy database at '.*' is corrupt",
"st", sbox.wc_dir)
@@ -143,7 +144,7 @@ def status_with_corrupt_wc_db(sbox):
with open(sbox.ospath(".svn/wc.db"), 'wb') as fd:
fd.write('\0' * 17)
svntest.actions.run_and_verify_svn(
- "Status when wc.db is corrupt", None,
+ None,
r"[^ ]+ E155016: The working copy database at '.*' is corrupt",
"st", sbox.wc_dir)
@@ -154,7 +155,7 @@ def status_with_zero_length_wc_db(sbox):
sbox.build(read_only = True)
os.close(os.open(sbox.ospath(".svn/wc.db"), os.O_RDWR | os.O_TRUNC))
svntest.actions.run_and_verify_svn(
- "Status when wc.db has zero length", None,
+ None,
r"[^ ]+ E200030:", # SVN_ERR_SQLITE_ERROR
"st", sbox.wc_dir)
@@ -165,7 +166,7 @@ def status_without_wc_db(sbox):
sbox.build(read_only = True)
os.remove(sbox.ospath(".svn/wc.db"))
svntest.actions.run_and_verify_svn(
- "Status when wc.db is missing", None,
+ None,
r"[^ ]+ E155016: The working copy database at '.*' is missing",
"st", sbox.wc_dir)
@@ -178,7 +179,7 @@ def status_without_wc_db_and_entries(sbox):
os.remove(sbox.ospath(".svn/wc.db"))
os.remove(sbox.ospath(".svn/entries"))
svntest.actions.run_and_verify_svn2(
- "Status when wc.db and entries are missing", None,
+ None,
r"[^ ]+ warning: W155007: '.*' is not a working copy",
0, "st", sbox.wc_dir)
@@ -191,7 +192,7 @@ def status_with_missing_wc_db_and_maybe_valid_entries(sbox):
fd.write('something\n')
os.remove(sbox.ospath(".svn/wc.db"))
svntest.actions.run_and_verify_svn(
- "Status when wc.db is missing and .svn/entries might be valid", None,
+ None,
r"[^ ]+ E155036:", # SVN_ERR_WC_UPGRADE_REQUIRED
"st", sbox.wc_dir)
@@ -202,7 +203,7 @@ def cleanup_below_wc_root(sbox):
sbox.build(read_only = True)
svntest.actions.lock_admin_dir(sbox.ospath(""), True)
- svntest.actions.run_and_verify_svn("Cleanup below wc root", None, [],
+ svntest.actions.run_and_verify_svn(None, [],
"cleanup", sbox.ospath("A"))
@SkipUnless(svntest.main.is_posix_os)
@@ -221,8 +222,144 @@ def update_through_unversioned_symlink(sbox):
# Subversion 1.8.0 crashes when updating a working copy through a symlink
svntest.actions.run_and_verify_update(wc_dir, expected_output,
expected_disk, expected_status,
- None, None, None, None, None, 1,
- symlink)
+ [], True, symlink)
+
+@Issue(3549)
+def cleanup_unversioned_items(sbox):
+ """cleanup --remove-unversioned / --remove-ignored"""
+
+ sbox.build(read_only = True)
+ wc_dir = sbox.wc_dir
+
+ # create some unversioned items
+ os.mkdir(sbox.ospath('dir1'))
+ os.mkdir(sbox.ospath('dir2'))
+ contents = "This is an unversioned file\n."
+ svntest.main.file_write(sbox.ospath('dir1/dir1_child1'), contents)
+ svntest.main.file_write(sbox.ospath('dir2/dir2_child1'), contents)
+ os.mkdir(sbox.ospath('dir2/foo_child2'))
+ svntest.main.file_write(sbox.ospath('file_foo'), contents),
+ os.mkdir(sbox.ospath('dir_foo'))
+ svntest.main.file_write(sbox.ospath('dir_foo/foo_child1'), contents)
+ os.mkdir(sbox.ospath('dir_foo/foo_child2'))
+ # a file that matches a default ignore pattern
+ svntest.main.file_write(sbox.ospath('foo.o'), contents)
+
+ # ignore some of the unversioned items
+ sbox.simple_propset('svn:ignore', '*_foo', '.')
+
+ os.chdir(wc_dir)
+
+ expected_output = [
+ ' M .\n',
+ '? dir1\n',
+ '? dir2\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'status')
+ expected_output += [
+ 'I dir_foo\n',
+ 'I file_foo\n',
+ 'I foo.o\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'status', '--no-ignore')
+
+ expected_output = [
+ 'D dir1\n',
+ 'D dir2\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'cleanup', '--remove-unversioned')
+ expected_output = [
+ ' M .\n',
+ 'I dir_foo\n',
+ 'I file_foo\n',
+ 'I foo.o\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'status', '--no-ignore')
+
+ # remove ignored items, with an empty global-ignores list
+ expected_output = [
+ 'D dir_foo\n',
+ 'D file_foo\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'cleanup', '--remove-ignored',
+ '--config-option',
+ 'config:miscellany:global-ignores=')
+
+ # the file matching global-ignores should still be present
+ expected_output = [
+ ' M .\n',
+ 'I foo.o\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'status', '--no-ignore')
+
+ # un-ignore the file matching global ignores, making it unversioned,
+ # and remove it with --remove-unversioned
+ expected_output = [
+ 'D foo.o\n',
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], 'cleanup', '--remove-unversioned',
+ '--config-option',
+ 'config:miscellany:global-ignores=')
+ expected_output = [
+ ' M .\n',
+ ]
+ svntest.actions.run_and_verify_svn(expected_output,
+ [], 'status', '--no-ignore')
+
+def cleanup_unversioned_items_in_locked_wc(sbox):
+ """cleanup unversioned items in locked WC should fail"""
+
+ sbox.build(read_only = True)
+
+ contents = "This is an unversioned file\n."
+ svntest.main.file_write(sbox.ospath('unversioned_file'), contents)
+
+ svntest.actions.lock_admin_dir(sbox.ospath(""), True)
+ for option in ['--remove-unversioned', '--remove-ignored']:
+ svntest.actions.run_and_verify_svn(None,
+ "svn: E155004: Working copy locked;.*",
+ "cleanup", option,
+ sbox.ospath(""))
+
+def cleanup_dir_external(sbox):
+ """cleanup --include-externals"""
+
+ sbox.build(read_only = True)
+
+ # configure a directory external
+ sbox.simple_propset("svn:externals", "^/A A_ext", ".")
+ sbox.simple_update()
+
+ svntest.actions.lock_admin_dir(sbox.ospath("A_ext"), True)
+ svntest.actions.run_and_verify_svn(["Performing cleanup on external " +
+ "item at '%s'.\n" % sbox.ospath("A_ext")],
+ [], "cleanup", '--include-externals',
+ sbox.ospath(""))
+
+@Issue(4390)
+def checkout_within_locked_wc(sbox):
+ """checkout within a locked working copy"""
+
+ sbox.build(read_only = True)
+
+ # lock working copy and create outstanding work queue items
+ svntest.actions.lock_admin_dir(sbox.ospath(""), True, True)
+ expected_output = [
+ "A %s\n" % sbox.ospath("nested-wc/alpha"),
+ "A %s\n" % sbox.ospath("nested-wc/beta"),
+ "Checked out revision 1.\n"
+ ]
+ svntest.actions.run_and_verify_svn(UnorderedOutput(expected_output),
+ [], "checkout", sbox.repo_url + '/A/B/E',
+ sbox.ospath("nested-wc"))
+
########################################################################
# Run the tests
@@ -243,6 +380,10 @@ test_list = [ None,
status_with_missing_wc_db_and_maybe_valid_entries,
cleanup_below_wc_root,
update_through_unversioned_symlink,
+ cleanup_unversioned_items,
+ cleanup_unversioned_items_in_locked_wc,
+ cleanup_dir_external,
+ checkout_within_locked_wc,
]
if __name__ == '__main__':
diff --git a/subversion/tests/diacritical.txt b/subversion/tests/diacritical.txt
new file mode 100644
index 0000000..8e6fb0e
--- /dev/null
+++ b/subversion/tests/diacritical.txt
@@ -0,0 +1,41 @@
+-*- coding: utf-8 -*-
+
+This is the source of the test data used by the normalized unicode
+string comparison tests.
+
+
+Whole word: Ṩůḇṽá¸È‘šḯá»á¹‹
+
+Individual letters:
+
+char name NFC UCS-4 NFC UTF-8 NFD UCS-4 NFD UTF-8
+
+Ṩ S with dot above and below \u1E68 \xe1\xb9\xa8 S\u0323\u0307 S\xcc\xa3\xcc\x87
+ů u with ring \u016F \xc5\xaf u\u030A u\xcc\x8a
+ḇ b with macron below \u1E07 \xe1\xb8\x87 b\u0331 b\xcc\xb1
+á¹½ v with tilde \u1E7D \xe1\xb9\xbd v\u0303 v\xcc\x83
+Ḡe with breve and cedilla \u1E1D \xe1\xb8\x9d e\u0327\u0306 e\xcc\xa7\xcc\x86
+È‘ r with double grave \u0211 \xc8\x91 r\u030F r\xcc\x8f
+Å¡ s with caron \u0161 \xc5\xa1 s\u030C s\xcc\x8c
+ḯ i with diaeresis and acute \u1E2F \xe1\xb8\xaf i\u0308\u0301 i\xcc\x88\xcc\x81
+á» o with grave and hook \u1EDD \xe1\xbb\x9d o\u031B\u0300 o\xcc\x9b\xcc\x80
+ṋ n with circumflex below \u1E4B \xe1\xb9\x8b n\u032D n\xcc\xad
+
+Combining diacriticals:
+
+char name UCS-4 UTF-8
+
+ ̇ dot \u0307 \xcc\x87
+ ̣ dot below \u0323 \xcc\xa3
+ ÌŠ ring \u030A \xcc\x8a
+ ̱ macron below \u0331 \xcc\xb1
+ ̃ tilde \u0303 \xcc\x83
+ ̆ breve \u0306 \xcc\x86
+ ̧ cedilla \u0327 \xcc\xa7
+ Ì double grave \u030F \xcc\x8f
+ ̌ caron \u030C \xcc\x8c
+ ̈ diaeresis \u0308 \xcc\x88
+ Ì acute \u0301 \xcc\x81
+ ̀ grave \u0300 \xcc\x80
+ Ì› horn \u031B \xcc\x9b
+ Ì­ circumflex below \u032D \xcc\xad
diff --git a/subversion/tests/libsvn_client/client-test.c b/subversion/tests/libsvn_client/client-test.c
index 9fad3bb..4e2a6d8 100644
--- a/subversion/tests/libsvn_client/client-test.c
+++ b/subversion/tests/libsvn_client/client-test.c
@@ -31,9 +31,12 @@
#include "../../libsvn_client/client.h"
#include "svn_pools.h"
#include "svn_client.h"
+#include "private/svn_client_mtcc.h"
#include "svn_repos.h"
#include "svn_subst.h"
#include "private/svn_wc_private.h"
+#include "svn_props.h"
+#include "svn_hash.h"
#include "../svn_test.h"
#include "../svn_test_fs.h"
@@ -57,7 +60,8 @@ create_greek_repos(const char **repos_url,
svn_fs_root_t *txn_root;
/* Create a filesytem and repository. */
- SVN_ERR(svn_test__create_repos(&repos, name, opts, pool));
+ SVN_ERR(svn_test__create_repos(
+ &repos, svn_test_data_path(name, pool), opts, pool));
/* Prepare and commit a txn containing the Greek tree. */
SVN_ERR(svn_fs_begin_txn2(&txn, svn_repos_fs(repos), 0 /* rev */,
@@ -67,7 +71,8 @@ create_greek_repos(const char **repos_url,
SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &committed_rev, txn, pool));
SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(committed_rev));
- SVN_ERR(svn_uri_get_file_url_from_dirent(repos_url, name, pool));
+ SVN_ERR(svn_uri_get_file_url_from_dirent(
+ repos_url, svn_test_data_path(name, pool), pool));
return SVN_NO_ERROR;
}
@@ -331,7 +336,6 @@ test_patch(const svn_test_opts_t *opts,
{
const char *repos_url;
const char *wc_path;
- const char *cwd;
svn_opt_revision_t rev;
svn_opt_revision_t peg_rev;
svn_client_ctx_t *ctx;
@@ -370,12 +374,11 @@ test_patch(const svn_test_opts_t *opts,
SVN_ERR(create_greek_repos(&repos_url, "test-patch-repos", opts, pool));
/* Check out the HEAD revision */
- SVN_ERR(svn_dirent_get_absolute(&cwd, "", pool));
/* Put wc inside an unversioned directory. Checking out a 1.7 wc
directly inside a 1.6 wc doesn't work reliably, an intervening
unversioned directory prevents the problems. */
- wc_path = svn_dirent_join(cwd, "test-patch", pool);
+ wc_path = svn_test_data_path("test-patch", pool);
SVN_ERR(svn_io_make_dir_recursively(wc_path, pool));
svn_test_add_dir_cleanup(wc_path);
@@ -389,8 +392,9 @@ test_patch(const svn_test_opts_t *opts,
TRUE, FALSE, ctx, pool));
/* Create the patch file. */
- patch_file_path = svn_dirent_join_many(pool, cwd,
- "test-patch", "test-patch.diff", NULL);
+ patch_file_path = svn_dirent_join_many(
+ pool, svn_test_data_path("test-patch", pool),
+ "test-patch.diff", SVN_VA_NULL);
SVN_ERR(svn_io_file_open(&patch_file, patch_file_path,
(APR_READ | APR_WRITE | APR_CREATE | APR_TRUNCATE),
APR_OS_DEFAULT, pool));
@@ -400,7 +404,7 @@ test_patch(const svn_test_opts_t *opts,
SVN_ERR(svn_io_file_write(patch_file, unidiff_patch[i], &len, pool));
SVN_TEST_ASSERT(len == strlen(unidiff_patch[i]));
}
- SVN_ERR(svn_io_file_flush_to_disk(patch_file, pool));
+ SVN_ERR(svn_io_file_flush(patch_file, pool));
/* Apply the patch. */
pcb.patched_tempfiles = apr_hash_make(pool);
@@ -445,7 +449,7 @@ test_wc_add_scenarios(const svn_test_opts_t *opts,
SVN_ERR(create_greek_repos(&repos_url, "test-wc-add-repos", opts, pool));
committed_rev = 1;
- SVN_ERR(svn_dirent_get_absolute(&wc_path, "test-wc-add", pool));
+ wc_path = svn_test_data_path("test-wc-add", pool);
/* Remove old test data from the previous run */
SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
@@ -598,7 +602,7 @@ test_16k_add(const svn_test_opts_t *opts,
svn_opt_revision_t rev;
svn_client_ctx_t *ctx;
const char *repos_url;
- const char *cwd, *wc_path;
+ const char *wc_path;
svn_opt_revision_t peg_rev;
apr_array_header_t *targets;
apr_pool_t *iterpool = svn_pool_create(pool);
@@ -608,12 +612,11 @@ test_16k_add(const svn_test_opts_t *opts,
SVN_ERR(create_greek_repos(&repos_url, "test-16k-repos", opts, pool));
/* Check out the HEAD revision */
- SVN_ERR(svn_dirent_get_absolute(&cwd, "", pool));
/* Put wc inside an unversioned directory. Checking out a 1.7 wc
directly inside a 1.6 wc doesn't work reliably, an intervening
unversioned directory prevents the problems. */
- wc_path = svn_dirent_join(cwd, "test-16k", pool);
+ wc_path = svn_test_data_path("test-16k", pool);
SVN_ERR(svn_io_make_dir_recursively(wc_path, pool));
svn_test_add_dir_cleanup(wc_path);
@@ -735,7 +738,7 @@ test_foreign_repos_copy(const svn_test_opts_t *opts,
SVN_ERR(create_greek_repos(&repos_url, "foreign-copy1", opts, pool));
SVN_ERR(create_greek_repos(&repos2_url, "foreign-copy2", opts, pool));
- SVN_ERR(svn_dirent_get_absolute(&wc_path, "test-wc-add", pool));
+ wc_path = svn_test_data_path("test-foreign-repos-copy", pool);
wc_path = svn_dirent_join(wc_path, "foreign-wc", pool);
@@ -769,22 +772,671 @@ test_foreign_repos_copy(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_suggest_mergesources(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *repos_url;
+ svn_client_ctx_t *ctx;
+ svn_client__mtcc_t *mtcc;
+ apr_array_header_t *results;
+ svn_opt_revision_t peg_rev;
+ svn_opt_revision_t head_rev;
+ const char *wc_path;
+
+ peg_rev.kind = svn_opt_revision_unspecified;
+
+ /* Create a filesytem and repository containing the Greek tree. */
+ SVN_ERR(create_greek_repos(&repos_url, "mergesources", opts, pool));
+
+ SVN_ERR(svn_client_create_context(&ctx, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, -1, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_copy("A", 1, "AA", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_commit(NULL, NULL, NULL, mtcc, pool));
+
+ SVN_ERR(svn_client_suggest_merge_sources(
+ &results,
+ svn_path_url_add_component2(repos_url, "AA", pool),
+ &peg_rev, ctx, pool));
+ SVN_TEST_ASSERT(results != NULL);
+ SVN_TEST_ASSERT(results->nelts >= 1);
+ SVN_TEST_STRING_ASSERT(APR_ARRAY_IDX(results, 0, const char *),
+ svn_path_url_add_component2(repos_url, "A", pool));
+
+ /* And now test the same thing with a minimal working copy */
+ wc_path = svn_test_data_path("mergesources-wc", pool);
+ svn_test_add_dir_cleanup(wc_path);
+ SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
+
+ head_rev.kind = svn_opt_revision_head;
+ SVN_ERR(svn_client_checkout3(NULL,
+ svn_path_url_add_component2(repos_url, "AA", pool),
+ wc_path,
+ &head_rev, &head_rev, svn_depth_empty,
+ FALSE, FALSE, ctx, pool));
+
+
+ SVN_ERR(svn_client_suggest_merge_sources(&results,
+ wc_path,
+ &peg_rev, ctx, pool));
+ SVN_TEST_ASSERT(results != NULL);
+ SVN_TEST_ASSERT(results->nelts >= 1);
+ SVN_TEST_STRING_ASSERT(APR_ARRAY_IDX(results, 0, const char *),
+ svn_path_url_add_component2(repos_url, "A", pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+static char
+status_to_char(enum svn_wc_status_kind status)
+{
+
+ switch (status)
+ {
+ case svn_wc_status_none: return '.';
+ case svn_wc_status_unversioned: return '?';
+ case svn_wc_status_normal: return '-';
+ case svn_wc_status_added: return 'A';
+ case svn_wc_status_missing: return '!';
+ case svn_wc_status_incomplete: return ':';
+ case svn_wc_status_deleted: return 'D';
+ case svn_wc_status_replaced: return 'R';
+ case svn_wc_status_modified: return 'M';
+ case svn_wc_status_merged: return 'G';
+ case svn_wc_status_conflicted: return 'C';
+ case svn_wc_status_obstructed: return '~';
+ case svn_wc_status_ignored: return 'I';
+ case svn_wc_status_external: return 'X';
+ default: return '*';
+ }
+}
+
+static int
+compare_status_paths(const void *a, const void *b)
+{
+ const svn_client_status_t *const *const sta = a;
+ const svn_client_status_t *const *const stb = b;
+ return svn_path_compare_paths((*sta)->local_abspath, (*stb)->local_abspath);
+}
+
+static svn_error_t *
+remote_only_status_receiver(void *baton, const char *path,
+ const svn_client_status_t *status,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *results = baton;
+ APR_ARRAY_PUSH(results, const svn_client_status_t *) =
+ svn_client_status_dup(status, results->pool);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_remote_only_status(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ static const struct remote_only_status_result
+ {
+ const char *relpath;
+ svn_revnum_t revision;
+ enum svn_wc_status_kind node_status;
+ enum svn_wc_status_kind text_status;
+ enum svn_wc_status_kind prop_status;
+ svn_revnum_t ood_changed_rev;
+ enum svn_wc_status_kind repos_node_status;
+ enum svn_wc_status_kind repos_text_status;
+ enum svn_wc_status_kind repos_prop_status;
+ } expected[] = {
+ { ".",
+ +1, svn_wc_status_normal, svn_wc_status_normal, svn_wc_status_none,
+ +2, svn_wc_status_modified, svn_wc_status_modified, svn_wc_status_none },
+ { "B",
+ +1, svn_wc_status_normal, svn_wc_status_normal, svn_wc_status_none,
+ +2, svn_wc_status_none, svn_wc_status_none, svn_wc_status_none },
+ { "C",
+ +1, svn_wc_status_normal, svn_wc_status_normal, svn_wc_status_none,
+ +2, svn_wc_status_deleted, svn_wc_status_none, svn_wc_status_none },
+ { "D",
+ +1, svn_wc_status_normal, svn_wc_status_normal, svn_wc_status_none,
+ +2, svn_wc_status_none, svn_wc_status_none, svn_wc_status_none },
+ { "epsilon",
+ -1, svn_wc_status_none, svn_wc_status_none, svn_wc_status_none,
+ +2, svn_wc_status_added, svn_wc_status_modified, svn_wc_status_none },
+ { "mu",
+ +1, svn_wc_status_normal, svn_wc_status_normal, svn_wc_status_none,
+ +2, svn_wc_status_modified, svn_wc_status_normal, svn_wc_status_none },
+
+ { NULL }
+ };
+
+ const char *repos_url;
+ const char *wc_path;
+ const char *local_path;
+ apr_file_t *local_file;
+ svn_client_ctx_t *ctx;
+ svn_client__mtcc_t *mtcc;
+ svn_opt_revision_t rev;
+ svn_revnum_t result_rev;
+ svn_string_t *contents = svn_string_create("modified\n", pool);
+ svn_stream_t *contentstream = svn_stream_from_string(contents, pool);
+ const struct remote_only_status_result *ex;
+ svn_stream_mark_t *start;
+ apr_array_header_t *targets;
+ apr_array_header_t *results;
+ int i;
+
+ SVN_ERR(svn_stream_mark(contentstream, &start, pool));
+
+ /* Create a filesytem and repository containing the Greek tree. */
+ SVN_ERR(create_greek_repos(&repos_url, "test-remote-only-status", opts, pool));
+
+ SVN_ERR(svn_client_create_context(&ctx, pool));
+
+ /* Make some modifications in the repository, creating revision 2. */
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, -1, ctx, pool, pool));
+ SVN_ERR(svn_stream_seek(contentstream, start));
+ SVN_ERR(svn_client__mtcc_add_add_file("A/epsilon", contentstream, NULL,
+ mtcc, pool));
+ SVN_ERR(svn_stream_seek(contentstream, start));
+ SVN_ERR(svn_client__mtcc_add_update_file("A/mu",
+ contentstream, NULL, NULL, NULL,
+ mtcc, pool));
+ SVN_ERR(svn_stream_seek(contentstream, start));
+ SVN_ERR(svn_client__mtcc_add_add_file("A/D/epsilon", contentstream, NULL,
+ mtcc, pool));
+ SVN_ERR(svn_stream_seek(contentstream, start));
+ SVN_ERR(svn_client__mtcc_add_update_file("A/B/lambda",
+ contentstream, NULL, NULL, NULL,
+ mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_delete("A/C", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_commit(NULL, NULL, NULL, mtcc, pool));
+
+ /* Check out a sparse root @r1 of the repository */
+ wc_path = svn_test_data_path("test-remote-only-status-wc", pool);
+ /*svn_test_add_dir_cleanup(wc_path);*/
+ SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
+
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = 1;
+ SVN_ERR(svn_client_checkout3(NULL,
+ apr_pstrcat(pool, repos_url, "/A", SVN_VA_NULL),
+ wc_path, &rev, &rev, svn_depth_immediates,
+ FALSE, FALSE, ctx, pool));
+
+ /* Add a local file; this is a double-check to make sure that
+ remote-only status ignores local changes. */
+ local_path = svn_dirent_join(wc_path, "zeta", pool);
+ SVN_ERR(svn_io_file_create_empty(local_path, pool));
+ SVN_ERR(svn_client_add5(local_path, svn_depth_unknown,
+ FALSE, FALSE, FALSE, FALSE,
+ ctx, pool));
+
+ /* Replace a local dir */
+ local_path = svn_dirent_join(wc_path, "B", pool);
+ targets = apr_array_make(pool, 1, sizeof(const char*));
+ APR_ARRAY_PUSH(targets, const char*) = local_path;
+ SVN_ERR(svn_client_delete4(targets, FALSE, FALSE, NULL, NULL, NULL,
+ ctx, pool));
+ SVN_ERR(svn_client_mkdir4(targets, FALSE, NULL, NULL, NULL,
+ ctx, pool));
+
+ /* Modify a local dir's props */
+ local_path = svn_dirent_join(wc_path, "D", pool);
+ targets = apr_array_make(pool, 1, sizeof(const char*));
+ APR_ARRAY_PUSH(targets, const char*) = local_path;
+ SVN_ERR(svn_client_propset_local("prop", contents, targets,
+ svn_depth_empty, FALSE, NULL,
+ ctx, pool));
+
+ /* Modify a local file's contents */
+ local_path = svn_dirent_join(wc_path, "mu", pool);
+ SVN_ERR(svn_io_file_open(&local_file, local_path,
+ APR_FOPEN_WRITE | APR_FOPEN_TRUNCATE,
+ 0, pool));
+ SVN_ERR(svn_io_file_write_full(local_file,
+ contents->data, contents->len,
+ NULL, pool));
+ SVN_ERR(svn_io_file_close(local_file, pool));
+
+ /* Run the remote-only status. */
+ results = apr_array_make(pool, 3, sizeof(const svn_client_status_t *));
+ rev.kind = svn_opt_revision_head;
+ SVN_ERR(svn_client_status6(
+ &result_rev, ctx, wc_path, &rev, svn_depth_unknown,
+ TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, NULL,
+ remote_only_status_receiver, results, pool));
+
+ SVN_TEST_ASSERT(result_rev == 2);
+
+ /* Compare the number of results with the expected results */
+ for (i = 0, ex = expected; ex->relpath; ++ex, ++i)
+ ;
+ SVN_TEST_ASSERT(results->nelts == i);
+
+ if (opts->verbose)
+ qsort(results->elts, results->nelts, results->elt_size,
+ compare_status_paths);
+
+ for (i = 0; i < results->nelts; ++i)
+ {
+ const svn_client_status_t *st =
+ APR_ARRAY_IDX(results, i, const svn_client_status_t *);
+
+ const char *relpath =
+ svn_dirent_skip_ancestor(wc_path, st->local_abspath);
+ if (!relpath)
+ relpath = st->local_abspath;
+ if (!*relpath)
+ relpath = ".";
+
+ for (ex = expected; ex->relpath; ++ex)
+ {
+ if (0 == strcmp(relpath, ex->relpath))
+ break;
+ }
+ SVN_TEST_ASSERT(ex->relpath != NULL);
+
+ if (opts->verbose)
+ printf("%c%c%c %2ld %c%c%c %2ld %s\n",
+ status_to_char(st->node_status),
+ status_to_char(st->text_status),
+ status_to_char(st->prop_status),
+ (long)st->revision,
+ status_to_char(st->repos_node_status),
+ status_to_char(st->repos_text_status),
+ status_to_char(st->repos_prop_status),
+ (long)st->ood_changed_rev,
+ relpath);
+
+ SVN_TEST_ASSERT(st->revision == ex->revision);
+ SVN_TEST_ASSERT(st->ood_changed_rev == ex->ood_changed_rev);
+ SVN_TEST_ASSERT(st->node_status == ex->node_status);
+ SVN_TEST_ASSERT(st->repos_node_status == ex->repos_node_status);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_copy_pin_externals(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_opt_revision_t rev;
+ svn_opt_revision_t peg_rev;
+ const char *repos_url;
+ const char *A_url;
+ const char *A_copy_url;
+ const char *wc_path;
+ svn_client_ctx_t *ctx;
+ const svn_string_t *propval;
+ apr_hash_t *externals_to_pin;
+ apr_array_header_t *external_items;
+ apr_array_header_t *copy_sources;
+ svn_wc_external_item2_t items[6];
+ svn_client_copy_source_t copy_source;
+ apr_hash_t *props;
+ apr_array_header_t *pinned_externals_descs;
+ apr_array_header_t *pinned_externals;
+ int i;
+ int num_tested_externals;
+ svn_stringbuf_t *externals_test_prop;
+ struct pin_externals_test_data {
+ const char *src_external_desc;
+ const char *expected_dst_external_desc;
+ } pin_externals_test_data[] = {
+ { "^/A/D/gamma B/gamma", "^/A/D/gamma@2 B/gamma" },
+ { "-r1 ^/A/D/G C/exdir_G", "-r1 ^/A/D/G C/exdir_G" },
+ { "^/A/D/H@1 C/exdir_H", "^/A/D/H@1 C/exdir_H" },
+ { "^/A/D/H C/exdir_H2", "^/A/D/H@2 C/exdir_H2" },
+ { "-r1 ^/A/B D/z/y/z/blah", "-r1 ^/A/B@2 D/z/y/z/blah" } ,
+ { "-r1 ^/A/D@2 exdir_D", "-r1 ^/A/D@2 exdir_D" },
+ /* Dated revision should retain their date string exactly. */
+ { "-r{1970-01-01T00:00} ^/A/C 70s", "-r{1970-01-01T00:00} ^/A/C@2 70s"},
+ { "-r{2004-02-23} ^/svn 1.0", "-r{2004-02-23} ^/svn 1.0"},
+ { NULL },
+ };
+
+ /* Create a filesytem and repository containing the Greek tree. */
+ SVN_ERR(create_greek_repos(&repos_url, "pin-externals", opts, pool));
+
+ wc_path = svn_test_data_path("pin-externals-working-copy", pool);
+
+ /* Remove old test data from the previous run */
+ SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
+
+ SVN_ERR(svn_io_make_dir_recursively(wc_path, pool));
+ svn_test_add_dir_cleanup(wc_path);
+
+ rev.kind = svn_opt_revision_head;
+ peg_rev.kind = svn_opt_revision_unspecified;
+ SVN_ERR(svn_client_create_context(&ctx, pool));
+
+ /* Configure some externals on ^/A */
+ i = 0;
+ externals_test_prop = svn_stringbuf_create_empty(pool);
+ while (pin_externals_test_data[i].src_external_desc)
+ {
+ svn_stringbuf_appendcstr(externals_test_prop,
+ pin_externals_test_data[i].src_external_desc);
+ svn_stringbuf_appendbyte(externals_test_prop, '\n');
+ i++;
+ }
+ propval = svn_string_create_from_buf(externals_test_prop, pool);
+ A_url = apr_pstrcat(pool, repos_url, "/A", SVN_VA_NULL);
+ SVN_ERR(svn_client_propset_remote(SVN_PROP_EXTERNALS, propval,
+ A_url, TRUE, 1, NULL,
+ NULL, NULL, ctx, pool));
+
+ /* Set up parameters for pinning some externals. */
+ externals_to_pin = apr_hash_make(pool);
+
+ items[0].url = "^/A/D/gamma";
+ items[0].target_dir = "B/gamma";
+ items[1].url = "^/A/B";
+ items[1].target_dir = "D/z/y/z/blah";
+ items[2].url = "^/A/D/H";
+ items[2].target_dir = "C/exdir_H2";
+ items[3].url= "^/A/D";
+ items[3].target_dir= "exdir_D";
+ items[4].url = "^/A/C";
+ items[4].target_dir = "70s";
+ /* Also add an entry which doesn't match any actual definition. */
+ items[5].url = "^/this/does/not/exist";
+ items[5].target_dir = "in/test/data";
+
+ external_items = apr_array_make(pool, 2, sizeof(svn_wc_external_item2_t *));
+ for (i = 0; i < sizeof(items) / sizeof(items[0]); i++)
+ APR_ARRAY_PUSH(external_items, svn_wc_external_item2_t *) = &items[i];
+ svn_hash_sets(externals_to_pin, A_url, external_items);
+
+ /* Copy ^/A to ^/A_copy, pinning two non-pinned externals. */
+ copy_source.path = A_url;
+ copy_source.revision = &rev;
+ copy_source.peg_revision = &peg_rev;
+ copy_sources = apr_array_make(pool, 1, sizeof(svn_client_copy_source_t *));
+ APR_ARRAY_PUSH(copy_sources, svn_client_copy_source_t *) = &copy_source;
+ A_copy_url = apr_pstrcat(pool, repos_url, "/A_copy", SVN_VA_NULL);
+ SVN_ERR(svn_client_copy7(copy_sources, A_copy_url, FALSE, FALSE,
+ FALSE, FALSE, TRUE, externals_to_pin,
+ NULL, NULL, NULL, ctx, pool));
+
+ /* Verify that externals were pinned as expected. */
+ SVN_ERR(svn_client_propget5(&props, NULL, SVN_PROP_EXTERNALS,
+ A_copy_url, &peg_rev, &rev, NULL,
+ svn_depth_empty, NULL, ctx, pool, pool));
+ propval = svn_hash_gets(props, A_copy_url);
+ SVN_TEST_ASSERT(propval);
+
+ /* Test the unparsed representation of copied externals descriptions. */
+ pinned_externals_descs = svn_cstring_split(propval->data, "\n", FALSE, pool);
+ for (i = 0; i < pinned_externals_descs->nelts; i++)
+ {
+ const char *externals_desc;
+ const char *expected_desc;
+
+ externals_desc = APR_ARRAY_IDX(pinned_externals_descs, i, const char *);
+ expected_desc = pin_externals_test_data[i].expected_dst_external_desc;
+ SVN_TEST_STRING_ASSERT(externals_desc, expected_desc);
+ }
+ /* Ensure all test cases were tested. */
+ SVN_TEST_ASSERT(i == (sizeof(pin_externals_test_data) /
+ sizeof(pin_externals_test_data[0]) - 1));
+
+ SVN_ERR(svn_wc_parse_externals_description3(&pinned_externals, A_copy_url,
+ propval->data, TRUE, pool));
+
+ /* For completeness, test the parsed representation, too */
+ num_tested_externals = 0;
+ for (i = 0; i < pinned_externals->nelts; i++)
+ {
+ svn_wc_external_item2_t *item;
+
+ item = APR_ARRAY_IDX(pinned_externals, i, svn_wc_external_item2_t *);
+ if (strcmp(item->url, "^/A/D/gamma") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "B/gamma");
+ /* Pinned to r2. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 2);
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 2);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->url, "^/A/D/G") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "C/exdir_G");
+ /* Not pinned. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 1);
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_head);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->url, "^/A/D/H") == 0)
+ {
+ if (strcmp(item->target_dir, "C/exdir_H") == 0)
+ {
+ /* Was already pinned to r1. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 1);
+ SVN_TEST_ASSERT(item->peg_revision.kind ==
+ svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 1);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->target_dir, "C/exdir_H2") == 0)
+ {
+ /* Pinned to r2. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 2);
+ SVN_TEST_ASSERT(item->peg_revision.kind ==
+ svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 2);
+ num_tested_externals++;
+ }
+ else
+ SVN_TEST_ASSERT(FALSE); /* unknown external */
+ }
+ else if (strcmp(item->url, "^/A/B") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "D/z/y/z/blah");
+ /* Pinned to r2. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 1);
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 2);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->url, "^/A/D") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "exdir_D");
+ /* Pinned to r2. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->revision.value.number == 1);
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 2);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->url, "^/A/C") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "70s");
+ /* Pinned to r2. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_date);
+ /* Don't bother testing the exact date value here. */
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
+ SVN_TEST_ASSERT(item->peg_revision.value.number == 2);
+ num_tested_externals++;
+ }
+ else if (strcmp(item->url, "^/svn") == 0)
+ {
+ SVN_TEST_STRING_ASSERT(item->target_dir, "1.0");
+ /* Was and not in externals_to_pin, operative revision was a date. */
+ SVN_TEST_ASSERT(item->revision.kind == svn_opt_revision_date);
+ /* Don't bother testing the exact date value here. */
+ SVN_TEST_ASSERT(item->peg_revision.kind == svn_opt_revision_head);
+ num_tested_externals++;
+ }
+ else
+ SVN_TEST_ASSERT(FALSE); /* unknown URL */
+ }
+
+ /* Ensure all test cases were tested. */
+ SVN_TEST_ASSERT(num_tested_externals == (sizeof(pin_externals_test_data) /
+ sizeof(pin_externals_test_data[0])
+ - 1));
+
+ return SVN_NO_ERROR;
+}
+
+/* issue #4560 */
+static svn_error_t *
+test_copy_pin_externals_select_subtree(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_opt_revision_t rev;
+ svn_opt_revision_t peg_rev;
+ const char *repos_url;
+ const char *A_copy_url;
+ const char *B_url;
+ const char *wc_path;
+ svn_client_ctx_t *ctx;
+ apr_hash_t *externals_to_pin;
+ apr_array_header_t *external_items;
+ apr_array_header_t *copy_sources;
+ svn_wc_external_item2_t item;
+ svn_client_copy_source_t copy_source;
+ apr_hash_t *props;
+ int i;
+ struct test_data {
+ const char *subtree_relpath;
+ const char *src_external_desc;
+ const char *expected_dst_external_desc;
+ } test_data[] = {
+ /* Note: these externals definitions contain extra whitespace on
+ purpose, to test that the pinning logic doesn't make
+ whitespace-only changes to values that aren't pinned. */
+
+ /* External on A/B will be pinned. */
+ { "B", "^/A/D/gamma gamma-ext", "^/A/D/gamma@3 gamma-ext" },
+
+ /* External on A/D won't be pinned. */
+ { "D", "^/A/B/F F-ext", "^/A/B/F F-ext" } ,
+
+ { NULL },
+ };
+
+ /* Create a filesytem and repository containing the Greek tree. */
+ SVN_ERR(create_greek_repos(&repos_url, "pin-externals-select-subtree",
+ opts, pool));
+
+ wc_path = svn_test_data_path("pin-externals-select-subtree-wc", pool);
+
+ /* Remove old test data from the previous run */
+ SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
+
+ SVN_ERR(svn_io_make_dir_recursively(wc_path, pool));
+ svn_test_add_dir_cleanup(wc_path);
+
+ rev.kind = svn_opt_revision_head;
+ peg_rev.kind = svn_opt_revision_unspecified;
+ SVN_ERR(svn_client_create_context(&ctx, pool));
+
+ /* Configure externals. */
+ i = 0;
+ while (test_data[i].subtree_relpath)
+ {
+ const char *subtree_relpath;
+ const char *url;
+ const svn_string_t *propval;
+
+ subtree_relpath = test_data[i].subtree_relpath;
+ propval = svn_string_create(test_data[i].src_external_desc, pool);
+
+ url = apr_pstrcat(pool, repos_url, "/A/", subtree_relpath, SVN_VA_NULL);
+ SVN_ERR(svn_client_propset_remote(SVN_PROP_EXTERNALS, propval,
+ url, TRUE, 1, NULL,
+ NULL, NULL, ctx, pool));
+ i++;
+ }
+
+ /* Set up parameters for pinning externals on A/B. */
+ externals_to_pin = apr_hash_make(pool);
+
+ item.url = "^/A/D/gamma";
+ item.target_dir = "gamma-ext";
+
+ external_items = apr_array_make(pool, 2, sizeof(svn_wc_external_item2_t *));
+ APR_ARRAY_PUSH(external_items, svn_wc_external_item2_t *) = &item;
+ B_url = apr_pstrcat(pool, repos_url, "/A/B", SVN_VA_NULL);
+ svn_hash_sets(externals_to_pin, B_url, external_items);
+
+ /* Copy ^/A to ^/A_copy, pinning externals on ^/A/B. */
+ copy_source.path = apr_pstrcat(pool, repos_url, "/A", SVN_VA_NULL);
+ copy_source.revision = &rev;
+ copy_source.peg_revision = &peg_rev;
+ copy_sources = apr_array_make(pool, 1, sizeof(svn_client_copy_source_t *));
+ APR_ARRAY_PUSH(copy_sources, svn_client_copy_source_t *) = &copy_source;
+ A_copy_url = apr_pstrcat(pool, repos_url, "/A_copy", SVN_VA_NULL);
+ SVN_ERR(svn_client_copy7(copy_sources, A_copy_url, FALSE, FALSE,
+ FALSE, FALSE, TRUE, externals_to_pin,
+ NULL, NULL, NULL, ctx, pool));
+
+ /* Verify that externals were pinned as expected. */
+ i = 0;
+ while (test_data[i].subtree_relpath)
+ {
+ const char *subtree_relpath;
+ const char *url;
+ const svn_string_t *propval;
+ svn_stringbuf_t *externals_desc;
+ const char *expected_desc;
+
+ subtree_relpath = test_data[i].subtree_relpath;
+ url = apr_pstrcat(pool, A_copy_url, "/", subtree_relpath, SVN_VA_NULL);
+
+ SVN_ERR(svn_client_propget5(&props, NULL, SVN_PROP_EXTERNALS,
+ url, &peg_rev, &rev, NULL,
+ svn_depth_empty, NULL, ctx, pool, pool));
+ propval = svn_hash_gets(props, url);
+ SVN_TEST_ASSERT(propval);
+ externals_desc = svn_stringbuf_create(propval->data, pool);
+ svn_stringbuf_strip_whitespace(externals_desc);
+ expected_desc = test_data[i].expected_dst_external_desc;
+ SVN_TEST_STRING_ASSERT(externals_desc->data, expected_desc);
+
+ i++;
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* ========================================================================== */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 3;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_elide_mergeinfo_catalog,
"test svn_client__elide_mergeinfo_catalog"),
SVN_TEST_PASS2(test_args_to_target_array,
"test svn_client_args_to_target_array"),
- SVN_TEST_OPTS_PASS(test_patch, "test svn_client_patch"),
SVN_TEST_OPTS_PASS(test_wc_add_scenarios, "test svn_wc_add3 scenarios"),
+ SVN_TEST_OPTS_PASS(test_foreign_repos_copy, "test foreign repository copy"),
+ SVN_TEST_OPTS_PASS(test_patch, "test svn_client_patch"),
SVN_TEST_OPTS_PASS(test_copy_crash, "test a crash in svn_client_copy5"),
#ifdef TEST16K_ADD
SVN_TEST_OPTS_PASS(test_16k_add, "test adding 16k files"),
#endif
SVN_TEST_OPTS_PASS(test_youngest_common_ancestor, "test youngest_common_ancestor"),
- SVN_TEST_OPTS_PASS(test_foreign_repos_copy, "test foreign repository copy"),
+ SVN_TEST_OPTS_PASS(test_suggest_mergesources,
+ "test svn_client_suggest_merge_sources"),
+ SVN_TEST_OPTS_PASS(test_remote_only_status,
+ "test svn_client_status6 with ignore_local_mods"),
+ SVN_TEST_OPTS_PASS(test_copy_pin_externals,
+ "test svn_client_copy7 with externals_to_pin"),
+ SVN_TEST_OPTS_PASS(test_copy_pin_externals_select_subtree,
+ "pin externals on selected subtrees only"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_client/mtcc-test.c b/subversion/tests/libsvn_client/mtcc-test.c
new file mode 100644
index 0000000..e11738e
--- /dev/null
+++ b/subversion/tests/libsvn_client/mtcc-test.c
@@ -0,0 +1,817 @@
+/*
+ * Regression tests for mtcc code in the libsvn_client library.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "svn_pools.h"
+#include "svn_props.h"
+#include "svn_client.h"
+#include "private/svn_client_mtcc.h"
+
+#include "../svn_test.h"
+#include "../svn_test_fs.h"
+
+/* Baton for verify_commit_callback*/
+struct verify_commit_baton
+{
+ const svn_commit_info_t *commit_info;
+ apr_pool_t *result_pool;
+};
+
+/* Commit result collector for verify_mtcc_commit */
+static svn_error_t *
+verify_commit_callback(const svn_commit_info_t *commit_info,
+ void *baton,
+ apr_pool_t *pool)
+{
+ struct verify_commit_baton *vcb = baton;
+
+ vcb->commit_info = svn_commit_info_dup(commit_info, vcb->result_pool);
+ return SVN_NO_ERROR;
+}
+
+/* Create a stream from a c string */
+static svn_stream_t *
+cstr_stream(const char *data, apr_pool_t *result_pool)
+{
+ return svn_stream_from_string(svn_string_create(data, result_pool),
+ result_pool);
+}
+
+static svn_error_t *
+verify_mtcc_commit(svn_client__mtcc_t *mtcc,
+ svn_revnum_t expected_rev,
+ apr_pool_t *pool)
+{
+ struct verify_commit_baton vcb;
+ vcb.commit_info = NULL;
+ vcb.result_pool = pool;
+
+ SVN_ERR(svn_client__mtcc_commit(NULL, verify_commit_callback, &vcb, mtcc, pool));
+
+ SVN_TEST_ASSERT(vcb.commit_info != NULL);
+ SVN_TEST_ASSERT(vcb.commit_info->revision == expected_rev);
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Constructs a greek tree as revision 1 in the repository at repos_url */
+static svn_error_t *
+make_greek_tree(const char *repos_url,
+ apr_pool_t *scratch_pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ apr_pool_t *subpool;
+ int i;
+
+ subpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, subpool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, subpool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 0, ctx, subpool, subpool));
+
+ for (i = 0; svn_test__greek_tree_nodes[i].path; i++)
+ {
+ if (svn_test__greek_tree_nodes[i].contents)
+ {
+ SVN_ERR(svn_client__mtcc_add_add_file(
+ svn_test__greek_tree_nodes[i].path,
+ cstr_stream(
+ svn_test__greek_tree_nodes[i].contents,
+ subpool),
+ NULL /* src_checksum */,
+ mtcc, subpool));
+ }
+ else
+ {
+ SVN_ERR(svn_client__mtcc_add_mkdir(
+ svn_test__greek_tree_nodes[i].path,
+ mtcc, subpool));
+ }
+ }
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 1, subpool));
+
+ svn_pool_clear(subpool);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_mkdir(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-mkdir",
+ opts, pool, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 0, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_mkdir("branches", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("trunk", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("branches/1.x", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("tags", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("tags/1.0", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("tags/1.1", mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 1, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_mkgreek(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-mkgreek",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_copy("A", 1, "greek_A", mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_swap(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-swap",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_move("A/B", "B", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_move("A/D", "A/B", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_copy("A/B", 1, "A/D", mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_propset(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-propset",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_propset("iota", "key",
+ svn_string_create("val", pool), FALSE,
+ mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("A", "A-key",
+ svn_string_create("val-A", pool), FALSE,
+ mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("A/B", "B-key",
+ svn_string_create("val-B", pool), FALSE,
+ mtcc, pool));
+
+ /* The repository ignores propdeletes of properties that aren't there,
+ so this just works */
+ SVN_ERR(svn_client__mtcc_add_propset("A/D", "D-key", NULL, FALSE,
+ mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 2, ctx, pool, pool));
+ SVN_TEST_ASSERT_ERROR(
+ svn_client__mtcc_add_propset("A", SVN_PROP_MIME_TYPE,
+ svn_string_create("text/plain", pool),
+ FALSE, mtcc, pool),
+ SVN_ERR_ILLEGAL_TARGET);
+
+ SVN_TEST_ASSERT_ERROR(
+ svn_client__mtcc_add_propset("iota", SVN_PROP_IGNORE,
+ svn_string_create("iota", pool),
+ FALSE, mtcc, pool),
+ SVN_ERR_ILLEGAL_TARGET);
+
+ SVN_ERR(svn_client__mtcc_add_propset("iota", SVN_PROP_EOL_STYLE,
+ svn_string_create("LF", pool),
+ FALSE, mtcc, pool));
+
+ SVN_ERR(svn_client__mtcc_add_add_file("ok", cstr_stream("line\nline\n", pool),
+ NULL, mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_add_file("bad", cstr_stream("line\nno\r\n", pool),
+ NULL, mtcc, pool));
+
+ SVN_ERR(svn_client__mtcc_add_propset("ok", SVN_PROP_EOL_STYLE,
+ svn_string_create("LF", pool),
+ FALSE, mtcc, pool));
+
+ SVN_TEST_ASSERT_ERROR(
+ svn_client__mtcc_add_propset("bad", SVN_PROP_EOL_STYLE,
+ svn_string_create("LF", pool),
+ FALSE, mtcc, pool),
+ SVN_ERR_ILLEGAL_TARGET);
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 3, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_update_files(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-update-files",
+ opts, pool, pool));
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ /* Update iota with knowledge of the old data */
+ SVN_ERR(svn_client__mtcc_add_update_file(svn_test__greek_tree_nodes[0].path,
+ cstr_stream("new-iota", pool),
+ NULL,
+ cstr_stream(
+ svn_test__greek_tree_nodes[0]
+ .contents,
+ pool),
+ NULL,
+ mtcc, pool));
+
+ SVN_ERR(svn_client__mtcc_add_update_file("A/mu",
+ cstr_stream("new-MU", pool),
+ NULL,
+ NULL, NULL,
+ mtcc, pool));
+
+ /* Set a property on the same node */
+ SVN_ERR(svn_client__mtcc_add_propset("A/mu", "mu-key",
+ svn_string_create("mu-A", pool), FALSE,
+ mtcc, pool));
+ /* And some other node */
+ SVN_ERR(svn_client__mtcc_add_propset("A/B", "B-key",
+ svn_string_create("val-B", pool), FALSE,
+ mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_overwrite(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-overwrite",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_copy("A", 1, "AA", mtcc, pool));
+
+ SVN_TEST_ASSERT_ERROR(svn_client__mtcc_add_mkdir("AA/B", mtcc, pool),
+ SVN_ERR_FS_ALREADY_EXISTS);
+
+ SVN_TEST_ASSERT_ERROR(svn_client__mtcc_add_mkdir("AA/D/H/chi", mtcc, pool),
+ SVN_ERR_FS_ALREADY_EXISTS);
+
+ SVN_ERR(svn_client__mtcc_add_mkdir("AA/BB", mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_anchoring(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-anchoring",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ /* Update a file as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "iota",
+ pool),
+ 1, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_update_file("",
+ cstr_stream("new-iota", pool),
+ NULL, NULL, NULL,
+ mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("", "key",
+ svn_string_create("value", pool),
+ FALSE, mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+
+ /* Add a directory as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "BB",
+ pool),
+ 2, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("", mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 3, pool));
+
+ /* Add a file as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "new",
+ pool),
+ 3, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_add_file("", cstr_stream("new", pool), NULL,
+ mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 4, pool));
+
+ /* Delete as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "new",
+ pool),
+ 4, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_delete("", mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 5, pool));
+
+ /* Propset file as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "A/mu",
+ pool),
+ 5, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("", "key",
+ svn_string_create("val", pool),
+ FALSE, mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 6, pool));
+
+ /* Propset dir as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc,
+ svn_path_url_add_component2(repos_url, "A",
+ pool),
+ 6, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("", "key",
+ svn_string_create("val", pool),
+ FALSE, mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 7, pool));
+
+ /* Propset reposroot as root operation */
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 7, ctx, pool, pool));
+ SVN_ERR(svn_client__mtcc_add_propset("", "key",
+ svn_string_create("val", pool),
+ FALSE, mtcc, pool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 8, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_replace_tree(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ const char *repos_url;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-replace_tree",
+ opts, pool, pool));
+
+ SVN_ERR(make_greek_tree(repos_url, pool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+ SVN_ERR(svn_client__mtcc_add_delete("A", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_delete("iota", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A/B", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A/B/C", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("M", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("M/N", mtcc, pool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("M/N/O", mtcc, pool));
+
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton for handle_rev */
+struct handle_rev_baton
+{
+ svn_revnum_t last;
+ svn_boolean_t up;
+ svn_boolean_t first;
+
+ /* Per revision handler */
+ svn_txdelta_window_handler_t inner_handler;
+ void *inner_baton;
+
+ /* Swapped between revisions to reconstruct data */
+ svn_stringbuf_t *cur;
+ svn_stringbuf_t *prev;
+
+ /* Pool for some test stuff */
+ apr_pool_t *pool;
+};
+
+/* Implement svn_txdelta_window_handler_t */
+static svn_error_t *
+handle_rev_delta(svn_txdelta_window_t *window,
+ void * baton)
+{
+ struct handle_rev_baton *hrb = baton;
+
+ SVN_ERR(hrb->inner_handler(window, hrb->inner_baton));
+
+ if (!window)
+ {
+ int expected_rev;
+ const char *expected;
+
+ /* Some revisions don't update the revision body */
+ switch (hrb->last)
+ {
+ case 5:
+ expected_rev = 4;
+ break;
+ case 7: /* Not reported */
+ case 8:
+ expected_rev = 6;
+ break;
+ default:
+ expected_rev = (int)hrb->last;
+ }
+
+ expected = apr_psprintf(hrb->pool, "revision-%d", expected_rev);
+
+ SVN_TEST_STRING_ASSERT(hrb->cur->data, expected);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Helper for test_file_revs_both_ways */
+static svn_error_t *
+handle_rev(void *baton,
+ const char *path,
+ svn_revnum_t rev,
+ apr_hash_t *rev_props,
+ svn_boolean_t result_of_merge,
+ svn_txdelta_window_handler_t *delta_handler,
+ void **delta_baton,
+ apr_array_header_t *prop_diffs,
+ apr_pool_t *pool)
+{
+ struct handle_rev_baton *hrb = baton;
+ svn_revnum_t expected_rev = hrb->up ? (hrb->last + 1) : (hrb->last - 1);
+
+ if (expected_rev == 7)
+ expected_rev = hrb->up ? 8 : 6;
+
+ SVN_TEST_ASSERT(rev == expected_rev);
+ SVN_TEST_ASSERT(apr_hash_count(rev_props) >= 3);
+ SVN_TEST_STRING_ASSERT(path, (rev < 5) ? "/iota" : "/mu");
+
+ if (!hrb->first
+ && (rev == (hrb->up ? 5 : 4) || rev == (hrb->up ? 8 : 6)))
+ SVN_TEST_ASSERT(delta_handler == NULL);
+ else
+ SVN_TEST_ASSERT(delta_handler != NULL);
+
+ if (delta_handler)
+ {
+ svn_stringbuf_t *tmp;
+
+ *delta_handler = handle_rev_delta;
+ *delta_baton = hrb;
+
+ /* Swap string buffers, to use previous as original */
+ tmp = hrb->prev;
+ hrb->prev = hrb->cur;
+ hrb->cur = tmp;
+
+ svn_stringbuf_setempty(hrb->cur);
+
+ svn_txdelta_apply(svn_stream_from_stringbuf(hrb->prev, pool),
+ svn_stream_from_stringbuf(hrb->cur, pool),
+ NULL, NULL, pool,
+ &hrb->inner_handler,
+ &hrb->inner_baton);
+ }
+
+ hrb->last = rev;
+ hrb->first = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_file_revs_both_ways(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ const char *repos_url;
+ svn_ra_session_t *ra;
+ struct handle_rev_baton hrb;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-file-revs",
+ opts, pool, subpool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 0, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_add_file("iota",
+ cstr_stream("revision-1", subpool),
+ NULL /* src_checksum */,
+ mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 1, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_update_file("iota",
+ cstr_stream("revision-2", subpool),
+ NULL /* src_checksum */, NULL, NULL,
+ mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 2, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 2, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_update_file("iota",
+ cstr_stream("revision-3", subpool),
+ NULL /* src_checksum */, NULL, NULL,
+ mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 3, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 3, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_update_file("iota",
+ cstr_stream("revision-4", subpool),
+ NULL /* src_checksum */, NULL, NULL,
+ mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 4, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 4, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_move("iota", "mu", mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 5, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 5, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_update_file("mu",
+ cstr_stream("revision-6", subpool),
+ NULL /* src_checksum */, NULL, NULL,
+ mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 6, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 6, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_delete("mu", mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 7, subpool));
+ svn_pool_clear(subpool);
+
+ SVN_ERR(svn_client_open_ra_session2(&ra, repos_url, NULL, ctx, pool, subpool));
+
+ hrb.prev = svn_stringbuf_create("", pool);
+ hrb.cur = svn_stringbuf_create("", pool);
+ hrb.pool = pool;
+
+ svn_pool_clear(subpool);
+ hrb.up = FALSE;
+ hrb.last = 5;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "iota", 4, 1, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 1);
+
+ svn_pool_clear(subpool);
+ hrb.up = TRUE;
+ hrb.last = 0;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "iota", 1, 4, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 4);
+
+ svn_pool_clear(subpool);
+ hrb.up = FALSE;
+ hrb.last = 7;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "mu", 6, 1, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 1);
+
+ svn_pool_clear(subpool);
+ hrb.up = TRUE;
+ hrb.last = 0;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "mu", 1, 6, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 6);
+
+ /* Ressurect mu */
+ svn_pool_clear(subpool);
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 7, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_copy("mu", 6, "mu", mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 8, subpool));
+
+ svn_pool_clear(subpool);
+ hrb.up = TRUE;
+ hrb.last = 0;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "mu", 1, SVN_INVALID_REVNUM, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 8);
+
+ svn_pool_clear(subpool);
+ hrb.up = FALSE;
+ hrb.last = 9;
+ hrb.first = TRUE;
+ svn_stringbuf_setempty(hrb.prev);
+ svn_stringbuf_setempty(hrb.cur);
+ SVN_ERR(svn_ra_get_file_revs2(ra, "mu", SVN_INVALID_REVNUM, 1, FALSE,
+ handle_rev, &hrb,
+ subpool));
+ SVN_TEST_ASSERT(hrb.last == 1);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_iprops_path_format(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_client__mtcc_t *mtcc;
+ svn_client_ctx_t *ctx;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ const char *repos_url;
+ svn_ra_session_t *ra;
+
+ SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-iprops-paths",
+ opts, pool, subpool));
+
+ SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+ SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+ SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 0, ctx, subpool, subpool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A", mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A/B", mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A/B/C", mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_mkdir("A/B/C/D", mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_propset("", "on-root",
+ svn_string_create("ROOT", subpool),
+ FALSE, mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_propset("A/B", "on-B",
+ svn_string_create("BBBB", subpool),
+ FALSE, mtcc, subpool));
+ SVN_ERR(svn_client__mtcc_add_propset("A/B/C", "Z",
+ svn_string_create("Z", subpool),
+ FALSE, mtcc, subpool));
+ SVN_ERR(verify_mtcc_commit(mtcc, 1, subpool));
+ svn_pool_clear(subpool);
+
+ {
+ apr_array_header_t *iprops;
+ svn_prop_inherited_item_t *ip;
+
+ SVN_ERR(svn_client_open_ra_session2(&ra, repos_url, NULL, ctx,
+ pool, subpool));
+
+ SVN_ERR(svn_ra_get_inherited_props(ra, &iprops, "A/B/C/D", 1,
+ subpool, subpool));
+
+ SVN_TEST_ASSERT(iprops != NULL);
+ SVN_TEST_INT_ASSERT(iprops->nelts, 3);
+
+ ip = APR_ARRAY_IDX(iprops, 0, svn_prop_inherited_item_t *);
+ SVN_TEST_STRING_ASSERT(ip->path_or_url, "");
+
+ ip = APR_ARRAY_IDX(iprops, 1, svn_prop_inherited_item_t *);
+ SVN_TEST_STRING_ASSERT(ip->path_or_url, "A/B");
+
+ ip = APR_ARRAY_IDX(iprops, 2, svn_prop_inherited_item_t *);
+ SVN_TEST_STRING_ASSERT(ip->path_or_url, "A/B/C");
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* ========================================================================== */
+
+
+static int max_threads = 3;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(test_mkdir,
+ "test mtcc mkdir"),
+ SVN_TEST_OPTS_PASS(test_mkgreek,
+ "test making greek tree"),
+ SVN_TEST_OPTS_PASS(test_swap,
+ "swapping some trees"),
+ SVN_TEST_OPTS_PASS(test_propset,
+ "test propset and propdel"),
+ SVN_TEST_OPTS_PASS(test_update_files,
+ "test update files"),
+ SVN_TEST_OPTS_PASS(test_overwrite,
+ "test overwrite"),
+ SVN_TEST_OPTS_PASS(test_anchoring,
+ "test mtcc anchoring for root operations"),
+ SVN_TEST_OPTS_PASS(test_replace_tree,
+ "test mtcc replace tree"),
+ SVN_TEST_OPTS_PASS(test_file_revs_both_ways,
+ "test ra_get_file_revs2 both ways"),
+ SVN_TEST_OPTS_PASS(test_iprops_path_format,
+ "test iprops url format"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_delta/random-test.c b/subversion/tests/libsvn_delta/random-test.c
index 209ab1d..600989a 100644
--- a/subversion/tests/libsvn_delta/random-test.c
+++ b/subversion/tests/libsvn_delta/random-test.c
@@ -109,12 +109,9 @@ open_tempfile(const char *name_template, apr_pool_t *pool)
{
apr_status_t apr_err;
apr_file_t *fp = NULL;
- char *templ;
-
- if (!name_template)
- templ = apr_pstrdup(pool, "tempfile_XXXXXX");
- else
- templ = apr_pstrdup(pool, name_template);
+ char *templ = (char *)apr_pstrdup(
+ pool, svn_test_data_path(
+ name_template ? name_template : "tempfile_XXXXXX", pool));
apr_err = apr_file_mktemp(&fp, templ, 0, pool);
assert(apr_err == 0);
@@ -283,9 +280,10 @@ copy_tempfile(apr_file_t *fp, apr_pool_t *pool)
-/* Implements svn_test_driver_t. */
+/* (Note: *LAST_SEED is an output parameter.) */
static svn_error_t *
-random_test(apr_pool_t *pool)
+do_random_test(apr_pool_t *pool,
+ apr_uint32_t *last_seed)
{
apr_uint32_t seed, maxlen;
apr_size_t bytes_range;
@@ -300,7 +298,7 @@ random_test(apr_pool_t *pool)
for (i = 0; i < iterations; i++)
{
/* Generate source and target for the delta and its application. */
- apr_uint32_t subseed_base = svn_test_rand(&seed);
+ apr_uint32_t subseed_base = svn_test_rand((*last_seed = seed, &seed));
apr_file_t *source = generate_random_file(maxlen, subseed_base, &seed,
random_bytes, bytes_range,
dump_files, pool);
@@ -360,6 +358,17 @@ random_test(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* Implements svn_test_driver_t. */
+static svn_error_t *
+random_test(apr_pool_t *pool)
+{
+ apr_uint32_t seed;
+ svn_error_t *err = do_random_test(pool, &seed);
+ if (err)
+ fprintf(stderr, "SEED: %lu\n", (unsigned long)seed);
+ return err;
+}
+
/* (Note: *LAST_SEED is an output parameter.) */
@@ -500,6 +509,8 @@ random_combine_test(apr_pool_t *pool)
{
apr_uint32_t seed;
svn_error_t *err = do_random_combine_test(pool, &seed);
+ if (err)
+ fprintf(stderr, "SEED: %lu\n", (unsigned long)seed);
return err;
}
@@ -513,7 +524,9 @@ random_combine_test(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(random_test,
@@ -526,3 +539,5 @@ struct svn_test_descriptor_t test_funcs[] =
#endif
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_delta/range-index-test.h b/subversion/tests/libsvn_delta/range-index-test.h
index 4301201..f330a6a 100644
--- a/subversion/tests/libsvn_delta/range-index-test.h
+++ b/subversion/tests/libsvn_delta/range-index-test.h
@@ -27,7 +27,7 @@
#include "../../libsvn_delta/compose_delta.c"
static range_index_node_t *prev_node, *prev_prev_node;
-static apr_off_t
+static apr_size_t
walk_range_index(range_index_node_t *node, const char **msg)
{
apr_off_t ret;
@@ -70,19 +70,18 @@ print_node_data(range_index_node_t *node, const char *msg, apr_off_t ndx)
{
if (-node->target_offset == ndx)
{
- printf(" * Node: [%3"APR_OFF_T_FMT
- ",%3"APR_OFF_T_FMT
- ") = %-5"APR_OFF_T_FMT"%s\n",
+ printf(" * Node: [%3"APR_SIZE_T_FMT
+ ",%3"APR_SIZE_T_FMT
+ ") = %-5"APR_SIZE_T_FMT"%s\n",
node->offset, node->limit, -node->target_offset, msg);
}
else
{
- printf(" Node: [%3"APR_OFF_T_FMT
- ",%3"APR_OFF_T_FMT
- ") = %"APR_OFF_T_FMT"\n",
+ printf(" Node: [%3"APR_SIZE_T_FMT
+ ",%3"APR_SIZE_T_FMT
+ ") = %"APR_SIZE_T_FMT"\n",
node->offset, node->limit,
- (node->target_offset < 0
- ? -node->target_offset : node->target_offset));
+ node->target_offset);
}
}
@@ -154,13 +153,13 @@ random_range_index_test(apr_pool_t *pool)
ndx = create_range_index(pool);
for (i = 1; i <= iterations; ++i)
{
- apr_off_t offset = svn_test_rand(&seed) % 47;
- apr_off_t limit = offset + svn_test_rand(&seed) % 16 + 1;
+ apr_size_t offset = svn_test_rand(&seed) % 47;
+ apr_size_t limit = offset + svn_test_rand(&seed) % 16 + 1;
range_list_node_t *list, *r;
- apr_off_t ret;
+ apr_size_t ret;
const char *msg2;
- printf("%3d: Inserting [%3"APR_OFF_T_FMT",%3"APR_OFF_T_FMT") ...",
+ printf("%3d: Inserting [%3"APR_SIZE_T_FMT",%3"APR_SIZE_T_FMT") ...",
i, offset, limit);
splay_range_index(offset, ndx);
list = build_range_list(offset, limit, ndx);
@@ -170,7 +169,7 @@ random_range_index_test(apr_pool_t *pool)
if (ret == 0)
{
for (r = list; r; r = r->next)
- printf(" %s[%3"APR_OFF_T_FMT",%3"APR_OFF_T_FMT")",
+ printf(" %s[%3"APR_SIZE_T_FMT",%3"APR_SIZE_T_FMT")",
(r->kind == range_from_source ?
(++src_cp, "S") : (++tgt_cp, "T")),
r->offset, r->limit);
diff --git a/subversion/tests/libsvn_delta/window-test.c b/subversion/tests/libsvn_delta/window-test.c
index 384f0df..28f4609 100644
--- a/subversion/tests/libsvn_delta/window-test.c
+++ b/subversion/tests/libsvn_delta/window-test.c
@@ -100,10 +100,14 @@ stream_window_test(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(stream_window_test,
"txdelta stream and windows test"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_diff/diff-diff3-test.c b/subversion/tests/libsvn_diff/diff-diff3-test.c
index 1839034..96b6da2 100644
--- a/subversion/tests/libsvn_diff/diff-diff3-test.c
+++ b/subversion/tests/libsvn_diff/diff-diff3-test.c
@@ -137,9 +137,9 @@ make_file(const char *filename,
"merge-FILENAME1-FILENAME2-FILENAME3". The conflict style STYLE is
used. */
static svn_error_t *
-three_way_merge(const char *filename1,
- const char *filename2,
- const char *filename3,
+three_way_merge(const char *base_filename1,
+ const char *base_filename2,
+ const char *base_filename3,
const char *contents1,
const char *contents2,
const char *contents3,
@@ -152,8 +152,12 @@ three_way_merge(const char *filename1,
apr_file_t *output;
svn_stream_t *ostream;
svn_stringbuf_t *actual;
- char *merge_name = apr_psprintf(pool, "merge-%s-%s-%s",
- filename1, filename2, filename3);
+ char *merge_name = apr_psprintf(
+ pool, "merge-%s-%s-%s", base_filename1, base_filename2, base_filename3);
+
+ const char *filename1 = svn_test_data_path(base_filename1, pool);
+ const char *filename2 = svn_test_data_path(base_filename2, pool);
+ const char *filename3 = svn_test_data_path(base_filename3, pool);
/* We have an EXPECTED string we can match, because we don't support
any other combinations (yet) than the ones above. */
@@ -169,13 +173,15 @@ three_way_merge(const char *filename1,
actual = svn_stringbuf_create_empty(pool);
ostream = svn_stream_from_stringbuf(actual, pool);
- SVN_ERR(svn_diff_mem_string_output_merge2
+ SVN_ERR(svn_diff_mem_string_output_merge3
(ostream, diff, original, modified, latest,
- apr_psprintf(pool, "||||||| %s", filename1),
- apr_psprintf(pool, "<<<<<<< %s", filename2),
- apr_psprintf(pool, ">>>>>>> %s", filename3),
+ apr_psprintf(pool, "||||||| %s", base_filename1),
+ apr_psprintf(pool, "<<<<<<< %s", base_filename2),
+ apr_psprintf(pool, ">>>>>>> %s", base_filename3),
NULL, /* separator */
- style, pool));
+ style,
+ NULL, NULL, /* cancel */
+ pool));
SVN_ERR(svn_stream_close(ostream));
if (strcmp(actual->data, expected) != 0)
@@ -195,17 +201,22 @@ three_way_merge(const char *filename1,
APR_OS_DEFAULT, pool));
ostream = svn_stream_from_aprfile2(output, FALSE, pool);
- SVN_ERR(svn_diff_file_output_merge2(ostream, diff,
- filename1, filename2, filename3,
- NULL, NULL, NULL, NULL,
- style,
- pool));
+ SVN_ERR(svn_diff_file_output_merge3(
+ ostream, diff,
+ filename1, filename2, filename3,
+ apr_psprintf(pool, "||||||| %s", base_filename1),
+ apr_psprintf(pool, "<<<<<<< %s", base_filename2),
+ apr_psprintf(pool, ">>>>>>> %s", base_filename3),
+ NULL, /* separator */
+ style,
+ NULL, NULL, /* cancel */
+ pool));
SVN_ERR(svn_stream_close(ostream));
SVN_ERR(svn_stringbuf_from_file2(&actual, merge_name, pool));
if (strcmp(actual->data, expected))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"failed merging diff '%s' to '%s' into '%s'",
- filename1, filename2, filename3);
+ base_filename1, base_filename2, base_filename3);
SVN_ERR(svn_io_remove_file2(filename1, TRUE, pool));
if (strcmp(filename1, filename2))
@@ -227,8 +238,8 @@ three_way_merge(const char *filename1,
preserved otherwise. If the diff fails the diff output will be in
a file called "diff-FILENAME1-FILENAME2". */
static svn_error_t *
-two_way_diff(const char *filename1,
- const char *filename2,
+two_way_diff(const char *base_filename1,
+ const char *base_filename2,
const char *contents1,
const char *contents2,
const char *expected,
@@ -239,7 +250,13 @@ two_way_diff(const char *filename1,
apr_file_t *output;
svn_stream_t *ostream;
svn_stringbuf_t *actual;
- char *diff_name = apr_psprintf(pool, "diff-%s-%s", filename1, filename2);
+ char *diff_name = (char *)apr_pstrdup(
+ pool, svn_test_data_path(
+ apr_psprintf(pool, "diff-%s-%s", base_filename1, base_filename2),
+ pool));
+
+ const char *filename1 = svn_test_data_path(base_filename1, pool);
+ const char *filename2 = svn_test_data_path(base_filename2, pool);
/* Some of the tests have lots of lines, although not much data as
the lines are short, and the in-memory diffs allocate a lot of
@@ -261,7 +278,7 @@ two_way_diff(const char *filename1,
ostream = svn_stream_from_stringbuf(actual, pool);
SVN_ERR(svn_diff_mem_string_output_unified(ostream, diff,
- filename1, filename2,
+ base_filename1, base_filename2,
SVN_APR_LOCALE_CHARSET,
original, modified, subpool));
svn_pool_clear(subpool);
@@ -286,7 +303,7 @@ two_way_diff(const char *filename1,
ostream = svn_stream_from_aprfile2(output, FALSE, pool);
SVN_ERR(svn_diff_file_output_unified2(ostream, diff,
filename1, filename2,
- filename1, filename2,
+ base_filename1, base_filename2,
SVN_APR_LOCALE_CHARSET, pool));
SVN_ERR(svn_stream_close(ostream));
@@ -312,16 +329,16 @@ two_way_diff(const char *filename1,
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"failed comparing '%s' and '%s'"
" (memory and file results are different)",
- filename1, filename2);
+ base_filename1, base_filename2);
}
/* May as well do the trivial merges while we are here */
- SVN_ERR(three_way_merge(filename1, filename2, filename1,
+ SVN_ERR(three_way_merge(base_filename1, base_filename2, base_filename1,
contents1, contents2, contents1, contents2, NULL,
svn_diff_conflict_display_modified_latest,
subpool));
svn_pool_clear(subpool);
- SVN_ERR(three_way_merge(filename2, filename1, filename2,
+ SVN_ERR(three_way_merge(base_filename2, base_filename1, base_filename2,
contents2, contents1, contents2, contents1, NULL,
svn_diff_conflict_display_modified_latest,
subpool));
@@ -2141,14 +2158,20 @@ test_diff4(apr_pool_t *pool)
" /* line plus-four of context */\n"
" /* line plus-five of context */\n"
"}\n");
- SVN_ERR(make_file("B2", B2.data, pool));
- SVN_ERR(make_file("T1", T1.data, pool));
- SVN_ERR(make_file("T2", T2.data, pool));
- SVN_ERR(make_file("T3", T3.data, pool));
+
+ const char *B2_path = svn_test_data_path("B2", pool);
+ const char *T1_path = svn_test_data_path("T1", pool);
+ const char *T2_path = svn_test_data_path("T2", pool);
+ const char *T3_path = svn_test_data_path("T3", pool);
+
+ SVN_ERR(make_file(B2_path, B2.data, pool));
+ SVN_ERR(make_file(T1_path, T1.data, pool));
+ SVN_ERR(make_file(T2_path, T2.data, pool));
+ SVN_ERR(make_file(T3_path, T3.data, pool));
/* Usage: tools/diff/diff4 <mine> <older> <yours> <ancestor> */
/* tools/diff/diff4 B2 T2 T3 T1 > B2new */
- SVN_ERR(svn_diff_file_diff4(&diff, "T2", "B2", "T3", "T1", pool));
+ SVN_ERR(svn_diff_file_diff4(&diff, T2_path, B2_path, T3_path, T1_path, pool));
/* Sanity. */
SVN_TEST_ASSERT(! svn_diff_contains_conflicts(diff));
@@ -2161,7 +2184,7 @@ test_diff4(apr_pool_t *pool)
svn_stringbuf_create_ensure(417, pool), /* 417 == wc -c < B2new */
pool);
SVN_ERR(svn_diff_file_output_merge(actual, diff,
- "T2", "B2", "T3",
+ T2_path, B2_path, T3_path,
NULL, NULL, NULL, NULL,
FALSE,
FALSE,
@@ -2179,12 +2202,16 @@ random_trivial_merge(apr_pool_t *pool)
int i;
apr_pool_t *subpool = svn_pool_create(pool);
+ const char *base_filename1 = "trivial1";
+ const char *base_filename2 = "trivial2";
+
+ const char *filename1 = svn_test_data_path(base_filename1, pool);
+ const char *filename2 = svn_test_data_path(base_filename2, pool);
+
seed_val();
for (i = 0; i < 5; ++i)
{
- const char *filename1 = "trivial1";
- const char *filename2 = "trivial2";
int min_lines = 1000;
int max_lines = 1100;
int var_lines = 50;
@@ -2201,12 +2228,12 @@ random_trivial_merge(apr_pool_t *pool)
SVN_ERR(svn_stringbuf_from_file2(&contents1, filename1, subpool));
SVN_ERR(svn_stringbuf_from_file2(&contents2, filename2, subpool));
- SVN_ERR(three_way_merge(filename1, filename2, filename1,
+ SVN_ERR(three_way_merge(base_filename1, base_filename2, base_filename1,
contents1->data, contents2->data,
contents1->data, contents2->data, NULL,
svn_diff_conflict_display_modified_latest,
subpool));
- SVN_ERR(three_way_merge(filename2, filename1, filename2,
+ SVN_ERR(three_way_merge(base_filename2, base_filename1, base_filename2,
contents2->data, contents1->data,
contents2->data, contents1->data, NULL,
svn_diff_conflict_display_modified_latest,
@@ -2231,14 +2258,20 @@ random_three_way_merge(apr_pool_t *pool)
int i;
apr_pool_t *subpool = svn_pool_create(pool);
+ const char *base_filename1 = "original";
+ const char *base_filename2 = "modified1";
+ const char *base_filename3 = "modified2";
+ const char *base_filename4 = "combined";
+
+ const char *filename1 = svn_test_data_path(base_filename1, pool);
+ const char *filename2 = svn_test_data_path(base_filename2, pool);
+ const char *filename3 = svn_test_data_path(base_filename3, pool);
+ const char *filename4 = svn_test_data_path(base_filename4, pool);
+
seed_val();
for (i = 0; i < 20; ++i)
{
- const char *filename1 = "original";
- const char *filename2 = "modified1";
- const char *filename3 = "modified2";
- const char *filename4 = "combined";
svn_stringbuf_t *original, *modified1, *modified2, *combined;
/* Pick NUM_LINES large enough so that the 'strip identical suffix' code
gets triggered with reasonable probability. (Currently it ignores
@@ -2272,12 +2305,12 @@ random_three_way_merge(apr_pool_t *pool)
SVN_ERR(svn_stringbuf_from_file2(&modified2, filename3, pool));
SVN_ERR(svn_stringbuf_from_file2(&combined, filename4, pool));
- SVN_ERR(three_way_merge(filename1, filename2, filename3,
+ SVN_ERR(three_way_merge(base_filename1, base_filename2, base_filename3,
original->data, modified1->data,
modified2->data, combined->data, NULL,
svn_diff_conflict_display_modified_latest,
subpool));
- SVN_ERR(three_way_merge(filename1, filename3, filename2,
+ SVN_ERR(three_way_merge(base_filename1, base_filename3, base_filename2,
original->data, modified2->data,
modified1->data, combined->data, NULL,
svn_diff_conflict_display_modified_latest,
@@ -2303,14 +2336,20 @@ merge_with_part_already_present(apr_pool_t *pool)
int i;
apr_pool_t *subpool = svn_pool_create(pool);
+ const char *base_filename1 = "pap-original";
+ const char *base_filename2 = "pap-modified1";
+ const char *base_filename3 = "pap-modified2";
+ const char *base_filename4 = "pap-combined";
+
+ const char *filename1 = svn_test_data_path(base_filename1, pool);
+ const char *filename2 = svn_test_data_path(base_filename2, pool);
+ const char *filename3 = svn_test_data_path(base_filename3, pool);
+ const char *filename4 = svn_test_data_path(base_filename4, pool);
+
seed_val();
for (i = 0; i < 20; ++i)
{
- const char *filename1 = "pap-original";
- const char *filename2 = "pap-modified1";
- const char *filename3 = "pap-modified2";
- const char *filename4 = "pap-combined";
svn_stringbuf_t *original, *modified1, *modified2, *combined;
int num_lines = 200, num_src = 20, num_dst = 20;
svn_boolean_t *lines = apr_pcalloc(subpool, sizeof(*lines) * num_lines);
@@ -2345,12 +2384,12 @@ merge_with_part_already_present(apr_pool_t *pool)
SVN_ERR(svn_stringbuf_from_file2(&modified2, filename3, pool));
SVN_ERR(svn_stringbuf_from_file2(&combined, filename4, pool));
- SVN_ERR(three_way_merge(filename1, filename2, filename3,
+ SVN_ERR(three_way_merge(base_filename1, base_filename2, base_filename3,
original->data, modified1->data,
modified2->data, combined->data, NULL,
svn_diff_conflict_display_modified_latest,
subpool));
- SVN_ERR(three_way_merge(filename1, filename3, filename2,
+ SVN_ERR(three_way_merge(base_filename1, base_filename3, base_filename2,
original->data, modified2->data,
modified1->data, combined->data, NULL,
svn_diff_conflict_display_modified_latest,
@@ -2915,7 +2954,10 @@ two_way_issue_3362_v2(apr_pool_t *pool)
/* ========================================================================== */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(dump_core,
@@ -2947,10 +2989,12 @@ struct svn_test_descriptor_t test_funcs[] =
SVN_TEST_PASS2(test_identical_suffix,
"identical suffix starts at the boundary of a chunk"),
SVN_TEST_PASS2(test_token_compare,
- "compare tokes at the chunk boundary"),
+ "compare tokens at the chunk boundary"),
SVN_TEST_PASS2(two_way_issue_3362_v1,
"2-way issue #3362 test v1"),
SVN_TEST_PASS2(two_way_issue_3362_v2,
"2-way issue #3362 test v2"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_diff/parse-diff-test.c b/subversion/tests/libsvn_diff/parse-diff-test.c
index 9a44369..d116f04 100644
--- a/subversion/tests/libsvn_diff/parse-diff-test.c
+++ b/subversion/tests/libsvn_diff/parse-diff-test.c
@@ -25,6 +25,8 @@
#include "../svn_test.h"
#include "svn_diff.h"
+#include "svn_hash.h"
+#include "svn_mergeinfo.h"
#include "svn_pools.h"
#include "svn_utf.h"
@@ -253,6 +255,27 @@ static const char *unidiff_lacking_trailing_eol =
" This is the file 'gamma'." NL
"+some more bytes to 'gamma'"; /* Don't add NL after this line */
+static const char *unidiff_with_mergeinfo =
+ "Index: A/C" NL
+ "===================================================================" NL
+ "--- A/C\t(revision 2)" NL
+ "+++ A/C\t(working copy)" NL
+ "Modified: svn:ignore" NL
+ "## -7,6 +7,7 ##" NL
+ " configure" NL
+ " libtool" NL
+ " .gdb_history" NL
+ "+.swig_checked" NL
+ " *.orig" NL
+ " *.rej" NL
+ " TAGS" NL
+ "Modified: svn:mergeinfo" NL
+ "## -0,1 +0,3 ##" NL
+ " Reverse-merged /subversion/branches/1.6.x-r935631:r952683-955333" NL
+ " /subversion/branches/nfc-nfd-aware-client:r870276,870376 をマージã—ã¾ã—ãŸ"NL
+ " Fusionné /subversion/branches/1.7.x-r1507044:r1507300-1511568" NL
+ " Merged /subversion/branches/1.8.x-openssl-dirs:r1535139" NL;
+/* The above diff intentionally contains i18n versions of some lines. */
/* Create a PATCH_FILE containing the contents of DIFF. */
static svn_error_t *
@@ -644,7 +667,7 @@ test_parse_property_diff(apr_pool_t *pool)
prop_patch = apr_hash_get(patch->prop_patches, "prop_add",
APR_HASH_KEY_STRING);
- SVN_TEST_ASSERT(!strcmp("prop_add", prop_patch->name));
+ SVN_TEST_STRING_ASSERT(prop_patch->name, "prop_add");
SVN_TEST_ASSERT(prop_patch->operation == svn_diff_op_added);
hunks = prop_patch->hunks;
@@ -957,9 +980,92 @@ test_parse_unidiff_lacking_trailing_eol(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_parse_unidiff_with_mergeinfo(apr_pool_t *pool)
+{
+ svn_patch_file_t *patch_file;
+ svn_boolean_t reverse;
+ svn_boolean_t ignore_whitespace;
+ int i;
+ apr_pool_t *iterpool;
+
+ reverse = FALSE;
+ ignore_whitespace = FALSE;
+ iterpool = svn_pool_create(pool);
+ for (i = 0; i < 2; i++)
+ {
+ svn_patch_t *patch;
+ svn_mergeinfo_t mergeinfo;
+ svn_mergeinfo_t reverse_mergeinfo;
+ svn_rangelist_t *rangelist;
+ svn_merge_range_t *range;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(create_patch_file(&patch_file, unidiff_with_mergeinfo,
+ pool));
+
+ SVN_ERR(svn_diff_parse_next_patch(&patch, patch_file, reverse,
+ ignore_whitespace, iterpool,
+ iterpool));
+ SVN_TEST_ASSERT(patch);
+ SVN_TEST_STRING_ASSERT(patch->old_filename, "A/C");
+ SVN_TEST_STRING_ASSERT(patch->new_filename, "A/C");
+
+ /* svn:ignore */
+ SVN_TEST_ASSERT(apr_hash_count(patch->prop_patches) == 1);
+
+ SVN_TEST_ASSERT(patch->mergeinfo);
+ SVN_TEST_ASSERT(patch->reverse_mergeinfo);
+
+ if (reverse)
+ {
+ mergeinfo = patch->reverse_mergeinfo;
+ reverse_mergeinfo = patch->mergeinfo;
+ }
+ else
+ {
+ mergeinfo = patch->mergeinfo;
+ reverse_mergeinfo = patch->reverse_mergeinfo;
+ }
+
+ rangelist = svn_hash_gets(reverse_mergeinfo,
+ "/subversion/branches/1.6.x-r935631");
+ SVN_TEST_ASSERT(rangelist);
+ SVN_TEST_ASSERT(rangelist->nelts == 1);
+ range = APR_ARRAY_IDX(rangelist, 0, svn_merge_range_t *);
+ SVN_TEST_ASSERT(range->start == 952682);
+ SVN_TEST_ASSERT(range->end == 955333);
+
+ rangelist = svn_hash_gets(mergeinfo,
+ "/subversion/branches/nfc-nfd-aware-client");
+ SVN_TEST_ASSERT(rangelist);
+ SVN_TEST_ASSERT(rangelist->nelts == 2);
+ range = APR_ARRAY_IDX(rangelist, 0, svn_merge_range_t *);
+ SVN_TEST_ASSERT(range->end == 870276);
+ range = APR_ARRAY_IDX(rangelist, 1, svn_merge_range_t *);
+ SVN_TEST_ASSERT(range->end == 870376);
+
+ rangelist = svn_hash_gets(mergeinfo,
+ "/subversion/branches/1.8.x-openssl-dirs");
+ SVN_TEST_ASSERT(rangelist);
+ SVN_TEST_ASSERT(rangelist->nelts == 1);
+ range = APR_ARRAY_IDX(rangelist, 0, svn_merge_range_t *);
+ SVN_TEST_ASSERT(range->end == 1535139);
+
+ reverse = !reverse;
+ SVN_ERR(svn_diff_close_patch_file(patch_file, pool));
+ }
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
/* ========================================================================== */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_parse_unidiff,
@@ -980,5 +1086,9 @@ struct svn_test_descriptor_t test_funcs[] =
"test git diffs with spaces in paths"),
SVN_TEST_PASS2(test_parse_unidiff_lacking_trailing_eol,
"test parsing unidiffs lacking trailing eol"),
+ SVN_TEST_PASS2(test_parse_unidiff_with_mergeinfo,
+ "test parsing unidiffs with mergeinfo"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs/fs-test.c b/subversion/tests/libsvn_fs/fs-test.c
index 104a692..fcab5e4 100644
--- a/subversion/tests/libsvn_fs/fs-test.c
+++ b/subversion/tests/libsvn_fs/fs-test.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include <apr_pools.h>
+#include <apr_thread_proc.h>
#include <assert.h>
#include "../svn_test.h"
@@ -37,11 +38,16 @@
#include "svn_props.h"
#include "svn_version.h"
+#include "svn_private_config.h"
+#include "private/svn_fs_util.h"
#include "private/svn_fs_private.h"
+#include "private/svn_fspath.h"
+#include "private/svn_sqlite.h"
#include "../svn_test_fs.h"
#include "../../libsvn_delta/delta.h"
+#include "../../libsvn_fs/fs-loader.h"
#define SET_STR(ps, s) ((ps)->data = (s), (ps)->len = strlen(s))
@@ -203,24 +209,35 @@ reopen_trivial_transaction(const svn_test_opts_t *opts,
{
svn_fs_t *fs;
svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
const char *txn_name;
apr_pool_t *subpool = svn_pool_create(pool);
SVN_ERR(svn_test__create_fs(&fs, "test-repo-reopen-trivial-txn",
opts, pool));
- /* Begin a new transaction that is based on revision 0. */
+ /* Create a first transaction - we don't want that one to reopen. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
+
+ /* Begin a second transaction that is based on revision 0. */
SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
/* Don't use the subpool, txn_name must persist beyond the current txn */
SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
+ /* Create a third transaction - we don't want that one to reopen. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
+
/* Close the transaction. */
svn_pool_clear(subpool);
/* Reopen the transaction by name */
SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, subpool));
+ /* Does it have the same name? */
+ SVN_ERR(svn_fs_txn_root(&root, txn, subpool));
+ SVN_TEST_STRING_ASSERT(svn_fs_txn_root_name(root, subpool), txn_name);
+
/* Close the transaction ... again. */
svn_pool_destroy(subpool);
@@ -1019,7 +1036,7 @@ static svn_error_t *
check_entry_present(svn_fs_root_t *root, const char *path,
const char *name, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = FALSE;
SVN_ERR(check_entry(root, path, name, &present, pool));
if (! present)
@@ -1036,7 +1053,7 @@ static svn_error_t *
check_entry_absent(svn_fs_root_t *root, const char *path,
const char *name, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = TRUE;
SVN_ERR(check_entry(root, path, name, &present, pool));
if (present)
@@ -1122,6 +1139,8 @@ basic_commit(const svn_test_opts_t *opts,
/* Create the greek tree. */
SVN_ERR(svn_test__create_greek_tree(txn_root, pool));
+ SVN_TEST_ASSERT(svn_fs_is_txn_root(txn_root));
+ SVN_TEST_ASSERT(!svn_fs_is_revision_root(txn_root));
/* Commit it. */
SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, pool));
@@ -1135,6 +1154,8 @@ basic_commit(const svn_test_opts_t *opts,
/* Get root of the revision */
SVN_ERR(svn_fs_revision_root(&revision_root, fs, after_rev, pool));
+ SVN_TEST_ASSERT(!svn_fs_is_txn_root(revision_root));
+ SVN_TEST_ASSERT(svn_fs_is_revision_root(revision_root));
/* Check the tree. */
SVN_ERR(svn_test__check_greek_tree(revision_root, pool));
@@ -1576,6 +1597,10 @@ merging_commit(const svn_test_opts_t *opts,
SVN_ERR(svn_fs_make_file(txn_root, "theta", pool));
SVN_ERR(svn_test__set_file_contents
(txn_root, "theta", "This is another file 'theta'.\n", pool));
+
+ /* TXN must actually be based upon revisions[4] (instead of HEAD). */
+ SVN_TEST_ASSERT(svn_fs_txn_base_revision(txn) == revisions[4]);
+
SVN_ERR(test_commit_txn(&failed_rev, txn, "/theta", pool));
SVN_ERR(svn_fs_abort_txn(txn, pool));
@@ -1599,6 +1624,9 @@ merging_commit(const svn_test_opts_t *opts,
SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
SVN_ERR(svn_fs_delete(txn_root, "A/D/H", pool));
+ /* TXN must actually be based upon revisions[1] (instead of HEAD). */
+ SVN_TEST_ASSERT(svn_fs_txn_base_revision(txn) == revisions[1]);
+
/* We used to create the revision like this before fixing issue
#2751 -- Directory prop mods reverted in overlapping commits scenario.
@@ -2075,7 +2103,7 @@ copy_test(const svn_test_opts_t *opts,
svn_revnum_t after_rev;
/* Prepare a filesystem. */
- SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy-test",
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy",
opts, pool));
/* In first txn, create and commit the greek tree. */
@@ -3756,6 +3784,17 @@ small_file_integrity(const svn_test_opts_t *opts,
static svn_error_t *
+almostmedium_file_integrity(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_uint32_t seed = (apr_uint32_t) apr_time_now();
+
+ return file_integrity_helper(SVN_DELTA_WINDOW_SIZE - 1, &seed, opts,
+ "test-repo-almostmedium-file-integrity", pool);
+}
+
+
+static svn_error_t *
medium_file_integrity(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
@@ -4156,6 +4195,12 @@ check_related(const svn_test_opts_t *opts,
{ "E", 7 }, { "E", 8 }, { "F", 9 }, { "F", 10 }
};
+ /* Latest revision that touched the respective path. */
+ struct path_rev_t latest_changes[6] = {
+ { "A", 4 }, { "B", 6 }, { "C", 6 },
+ { "D", 7 }, { "E", 8 }, { "F", 10 }
+ };
+
int related_matrix[16][16] = {
/* A1 ... F10 across the top here*/
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, /* A1 */
@@ -4185,14 +4230,16 @@ check_related(const svn_test_opts_t *opts,
struct path_rev_t pr2 = path_revs[j];
const svn_fs_id_t *id1, *id2;
int related = 0;
+ svn_fs_node_relation_t relation;
+ svn_fs_root_t *rev_root1, *rev_root2;
/* Get the ID for the first path/revision combination. */
- SVN_ERR(svn_fs_revision_root(&rev_root, fs, pr1.rev, subpool));
- SVN_ERR(svn_fs_node_id(&id1, rev_root, pr1.path, subpool));
+ SVN_ERR(svn_fs_revision_root(&rev_root1, fs, pr1.rev, subpool));
+ SVN_ERR(svn_fs_node_id(&id1, rev_root1, pr1.path, subpool));
/* Get the ID for the second path/revision combination. */
- SVN_ERR(svn_fs_revision_root(&rev_root, fs, pr2.rev, subpool));
- SVN_ERR(svn_fs_node_id(&id2, rev_root, pr2.path, subpool));
+ SVN_ERR(svn_fs_revision_root(&rev_root2, fs, pr2.rev, subpool));
+ SVN_ERR(svn_fs_node_id(&id2, rev_root2, pr2.path, subpool));
/* <exciting> Now, run the relationship check! </exciting> */
related = svn_fs_check_related(id1, id2) ? 1 : 0;
@@ -4215,9 +4262,263 @@ check_related(const svn_test_opts_t *opts,
pr1.path, (int)pr1.rev, pr2.path, (int)pr2.rev);
}
+ /* Asking directly, i.e. without involving the noderev IDs as
+ * an intermediate, should yield the same results. */
+ SVN_ERR(svn_fs_node_relation(&relation, rev_root1, pr1.path,
+ rev_root2, pr2.path, subpool));
+ if (i == j)
+ {
+ /* Identical note. */
+ if (!related || relation != svn_fs_node_unchanged)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s:%d' to be the same as '%s:%d';"
+ " it was not",
+ pr1.path, (int)pr1.rev, pr2.path, (int)pr2.rev);
+ }
+ }
+ else if (related && relation != svn_fs_node_common_ancestor)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s:%d' to have a common ancestor with '%s:%d';"
+ " it had not",
+ pr1.path, (int)pr1.rev, pr2.path, (int)pr2.rev);
+ }
+ else if (!related && relation != svn_fs_node_unrelated)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s:%d' to not be related to '%s:%d'; it was",
+ pr1.path, (int)pr1.rev, pr2.path, (int)pr2.rev);
+ }
+
+ svn_pool_clear(subpool);
+ } /* for ... */
+ } /* for ... */
+
+ /* Verify that the noderevs stay the same after their last change. */
+ for (i = 0; i < 6; ++i)
+ {
+ const char *path = latest_changes[i].path;
+ svn_revnum_t latest = latest_changes[i].rev;
+ svn_fs_root_t *latest_root;
+ svn_revnum_t rev;
+ svn_fs_node_relation_t relation;
+
+ /* FS root of the latest change. */
+ svn_pool_clear(subpool);
+ SVN_ERR(svn_fs_revision_root(&latest_root, fs, latest, subpool));
+
+ /* All future revisions. */
+ for (rev = latest + 1; rev <= 10; ++rev)
+ {
+ /* Query their noderev relationship to the latest change. */
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, rev, subpool));
+ SVN_ERR(svn_fs_node_relation(&relation, latest_root, path,
+ rev_root, path, subpool));
+
+ /* They shall use the same noderevs */
+ if (relation != svn_fs_node_unchanged)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s:%d' to be the same as '%s:%d';"
+ " it was not",
+ path, (int)latest, path, (int)rev);
+ }
+ } /* for ... */
+ } /* for ... */
+ }
+
+ /* Destroy the subpool. */
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+check_txn_related(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_pool_t *subpool = svn_pool_create(pool);
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn[3];
+ svn_fs_root_t *root[3];
+ svn_revnum_t youngest_rev = 0;
+
+ /* Create a filesystem and repository. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-check-related",
+ opts, pool));
+
+ /*** Step I: Build up some state in our repository through a series
+ of commits */
+
+ /* This is the node graph we are testing. It contains one revision (r1)
+ and two transactions, T1 and T2 - yet uncommitted.
+
+ A is a file that exists in r1 (A-0) and gets modified in both txns.
+ C is a copy of A1 made in both txns.
+ B is a new node created in both txns
+ D is a file that exists in r1 (D-0) and never gets modified.
+
+ +--A-0--+ D-0
+ | |
+ +-----+ +-----+
+ | | | |
+ B-1 C-T A-1 A-2 C-1 B-2
+ */
+ /* Revision 1 */
+ SVN_ERR(svn_fs_begin_txn(&txn[0], fs, youngest_rev, subpool));
+ SVN_ERR(svn_fs_txn_root(&root[0], txn[0], subpool));
+ SVN_ERR(svn_fs_make_file(root[0], "A", subpool));
+ SVN_ERR(svn_test__set_file_contents(root[0], "A", "1", subpool));
+ SVN_ERR(svn_fs_make_file(root[0], "D", subpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn[0], subpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
+ svn_pool_clear(subpool);
+ SVN_ERR(svn_fs_revision_root(&root[0], fs, youngest_rev, pool));
+
+ /* Transaction 1 */
+ SVN_ERR(svn_fs_begin_txn(&txn[1], fs, youngest_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root[1], txn[1], pool));
+ SVN_ERR(svn_test__set_file_contents(root[1], "A", "2", pool));
+ SVN_ERR(svn_fs_copy(root[0], "A", root[1], "C", pool));
+ SVN_ERR(svn_fs_make_file(root[1], "B", pool));
+
+ /* Transaction 2 */
+ SVN_ERR(svn_fs_begin_txn(&txn[2], fs, youngest_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root[2], txn[2], pool));
+ SVN_ERR(svn_test__set_file_contents(root[2], "A", "2", pool));
+ SVN_ERR(svn_fs_copy(root[0], "A", root[2], "C", pool));
+ SVN_ERR(svn_fs_make_file(root[2], "B", pool));
+
+ /*** Step II: Exhaustively verify relationship between all nodes in
+ existence. */
+ {
+ int i, j;
+
+ struct path_rev_t
+ {
+ const char *path;
+ int root;
+ };
+
+ /* Our 16 existing files/revisions. */
+ struct path_rev_t path_revs[8] = {
+ { "A", 0 }, { "A", 1 }, { "A", 2 },
+ { "B", 1 }, { "B", 2 },
+ { "C", 1 }, { "C", 2 },
+ { "D", 0 }
+ };
+
+ int related_matrix[8][8] = {
+ /* A-0 ... D-0 across the top here*/
+ { 1, 1, 1, 0, 0, 1, 1, 0 }, /* A-0 */
+ { 1, 1, 1, 0, 0, 1, 1, 0 }, /* A-1 */
+ { 1, 1, 1, 0, 0, 1, 1, 0 }, /* A-2 */
+ { 0, 0, 0, 1, 0, 0, 0, 0 }, /* C-1 */
+ { 0, 0, 0, 0, 1, 0, 0, 0 }, /* C-2 */
+ { 1, 1, 1, 0, 0, 1, 1, 0 }, /* B-1 */
+ { 1, 1, 1, 0, 0, 1, 1, 0 }, /* B-2 */
+ { 0, 0, 0, 0, 0, 0, 0, 1 } /* D-0 */
+ };
+
+ /* Here's the fun part. Running the tests. */
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ struct path_rev_t pr1 = path_revs[i];
+ struct path_rev_t pr2 = path_revs[j];
+ const svn_fs_id_t *id1, *id2;
+ int related = 0;
+ svn_fs_node_relation_t relation;
+
svn_pool_clear(subpool);
+
+ /* Get the ID for the first path/revision combination. */
+ SVN_ERR(svn_fs_node_id(&id1, root[pr1.root], pr1.path, subpool));
+
+ /* Get the ID for the second path/revision combination. */
+ SVN_ERR(svn_fs_node_id(&id2, root[pr2.root], pr2.path, subpool));
+
+ /* <exciting> Now, run the relationship check! </exciting> */
+ related = svn_fs_check_related(id1, id2) ? 1 : 0;
+ if (related == related_matrix[i][j])
+ {
+ /* xlnt! */
+ }
+ else if ((! related) && related_matrix[i][j])
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s-%d' to be related to '%s-%d'; it was not",
+ pr1.path, pr1.root, pr2.path, pr2.root);
+ }
+ else if (related && (! related_matrix[i][j]))
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s-%d' to not be related to '%s-%d'; it was",
+ pr1.path, pr1.root, pr2.path, pr2.root);
+ }
+
+ /* Asking directly, i.e. without involving the noderev IDs as
+ * an intermediate, should yield the same results. */
+ SVN_ERR(svn_fs_node_relation(&relation, root[pr1.root], pr1.path,
+ root[pr2.root], pr2.path, subpool));
+ if (i == j)
+ {
+ /* Identical note. */
+ if (!related || relation != svn_fs_node_unchanged)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s-%d' to be the same as '%s-%d';"
+ " it was not",
+ pr1.path, pr1.root, pr2.path, pr2.root);
+ }
+ }
+ else if (related && relation != svn_fs_node_common_ancestor)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s-%d' to have a common ancestor with '%s-%d';"
+ " it had not",
+ pr1.path, pr1.root, pr2.path, pr2.root);
+ }
+ else if (!related && relation != svn_fs_node_unrelated)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected '%s-%d' to not be related to '%s-%d'; it was",
+ pr1.path, pr1.root, pr2.path, pr2.root);
+ }
} /* for ... */
} /* for ... */
+
+ /* Verify that the noderevs stay the same after their last change.
+ There is only D that is not changed. */
+ for (i = 1; i <= 2; ++i)
+ {
+ svn_fs_node_relation_t relation;
+ svn_pool_clear(subpool);
+
+ /* Query their noderev relationship to the latest change. */
+ SVN_ERR(svn_fs_node_relation(&relation, root[i], "D",
+ root[0], "D", subpool));
+
+ /* They shall use the same noderevs */
+ if (relation != svn_fs_node_unchanged)
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "expected 'D-%d' to be the same as 'D-0'; it was not", i);
+ }
+ } /* for ... */
}
/* Destroy the subpool. */
@@ -4238,7 +4539,7 @@ branch_test(const svn_test_opts_t *opts,
svn_revnum_t youngest_rev = 0;
/* Create a filesystem and repository. */
- SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch-test",
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch",
opts, pool));
/*** Revision 1: Create the greek tree in revision. ***/
@@ -4305,22 +4606,49 @@ branch_test(const svn_test_opts_t *opts,
}
+/* Verify that file FILENAME under ROOT has the same contents checksum
+ * as CONTENTS when comparing the checksums of the given TYPE.
+ * Use POOL for temporary allocations. */
+static svn_error_t *
+verify_file_checksum(svn_stringbuf_t *contents,
+ svn_fs_root_t *root,
+ const char *filename,
+ svn_checksum_kind_t type,
+ apr_pool_t *pool)
+{
+ svn_checksum_t *expected_checksum, *actual_checksum;
+
+ /* Write a file, compare the repository's idea of its checksum
+ against our idea of its checksum. They should be the same. */
+ SVN_ERR(svn_checksum(&expected_checksum, type, contents->data,
+ contents->len, pool));
+ SVN_ERR(svn_fs_file_checksum(&actual_checksum, type, root, filename, TRUE,
+ pool));
+ if (!svn_checksum_match(expected_checksum, actual_checksum))
+ return svn_error_createf
+ (SVN_ERR_FS_GENERAL, NULL,
+ "verify-checksum: checksum mismatch:\n"
+ " expected: %s\n"
+ " actual: %s\n",
+ svn_checksum_to_cstring(expected_checksum, pool),
+ svn_checksum_to_cstring(actual_checksum, pool));
+
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
verify_checksum(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
svn_fs_t *fs;
svn_fs_txn_t *txn;
- svn_fs_root_t *txn_root;
+ svn_fs_root_t *txn_root, *rev_root;
svn_stringbuf_t *str;
- svn_checksum_t *expected_checksum, *actual_checksum;
+ svn_revnum_t rev;
/* Write a file, compare the repository's idea of its checksum
against our idea of its checksum. They should be the same. */
-
str = svn_stringbuf_create("My text editor charges me rent.", pool);
- SVN_ERR(svn_checksum(&expected_checksum, svn_checksum_md5, str->data,
- str->len, pool));
SVN_ERR(svn_test__create_fs(&fs, "test-repo-verify-checksum",
opts, pool));
@@ -4328,17 +4656,20 @@ verify_checksum(const svn_test_opts_t *opts,
SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
SVN_ERR(svn_fs_make_file(txn_root, "fact", pool));
SVN_ERR(svn_test__set_file_contents(txn_root, "fact", str->data, pool));
- SVN_ERR(svn_fs_file_checksum(&actual_checksum, svn_checksum_md5, txn_root,
- "fact", TRUE, pool));
- if (!svn_checksum_match(expected_checksum, actual_checksum))
- return svn_error_createf
- (SVN_ERR_FS_GENERAL, NULL,
- "verify-checksum: checksum mismatch:\n"
- " expected: %s\n"
- " actual: %s\n",
- svn_checksum_to_cstring(expected_checksum, pool),
- svn_checksum_to_cstring(actual_checksum, pool));
+ /* Do it for the txn. */
+ SVN_ERR(verify_file_checksum(str, txn_root, "fact", svn_checksum_md5,
+ pool));
+ SVN_ERR(verify_file_checksum(str, txn_root, "fact", svn_checksum_sha1,
+ pool));
+
+ /* Do it again - this time for the revision. */
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, rev, pool));
+ SVN_ERR(verify_file_checksum(str, rev_root, "fact", svn_checksum_md5,
+ pool));
+ SVN_ERR(verify_file_checksum(str, rev_root, "fact", svn_checksum_sha1,
+ pool));
return SVN_NO_ERROR;
}
@@ -4568,6 +4899,7 @@ unordered_txn_dirprops(const svn_test_opts_t *opts,
svn_fs_root_t *txn_root, *txn_root2;
svn_string_t pval;
svn_revnum_t new_rev, not_rev;
+ svn_boolean_t is_bdb = strcmp(opts->fs_type, "bdb") == 0;
/* This is a regression test for issue #2751. */
@@ -4624,10 +4956,21 @@ unordered_txn_dirprops(const svn_test_opts_t *opts,
/* Commit the first one first. */
SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
- /* Then commit the second -- but expect an conflict because the
- directory wasn't up-to-date, which is required for propchanges. */
- SVN_ERR(test_commit_txn(&not_rev, txn2, "/A/B", pool));
- SVN_ERR(svn_fs_abort_txn(txn2, pool));
+ /* Some backends are clever then others. */
+ if (is_bdb)
+ {
+ /* Then commit the second -- but expect an conflict because the
+ directory wasn't up-to-date, which is required for propchanges. */
+ SVN_ERR(test_commit_txn(&not_rev, txn2, "/A/B", pool));
+ SVN_ERR(svn_fs_abort_txn(txn2, pool));
+ }
+ else
+ {
+ /* Then commit the second -- there will be no conflict despite the
+ directory being out-of-data because the properties as well as the
+ directory structure (list of nodes) was up-to-date. */
+ SVN_ERR(test_commit_txn(&not_rev, txn2, NULL, pool));
+ }
return SVN_NO_ERROR;
}
@@ -4936,7 +5279,7 @@ delete_fs(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
-/* Issue 4340, "fs layer should reject filenames with trailing \n" */
+/* Issue 4340, "filenames containing \n corrupt FSFS repositories" */
static svn_error_t *
filename_trailing_newline(const svn_test_opts_t *opts,
apr_pool_t *pool)
@@ -4947,15 +5290,11 @@ filename_trailing_newline(const svn_test_opts_t *opts,
svn_fs_root_t *txn_root, *root;
svn_revnum_t youngest_rev = 0;
svn_error_t *err;
- svn_boolean_t legacy_backend;
- static const char contents[] = "foo\003bar";
-
- /* The FS API wants \n to be permitted, but FSFS never implemented that,
- * so for FSFS we expect errors rather than successes in some of the commits.
- * Use a blacklist approach so that new FSes default to implementing the API
- * as originally defined. */
- legacy_backend = (!strcmp(opts->fs_type, SVN_FS_TYPE_FSFS));
+ /* The FS API wants \n to be permitted, but FSFS never implemented that.
+ * Moreover, formats like svn:mergeinfo and svn:externals don't support
+ * it either. So, we can't have newlines in file names in any FS.
+ */
SVN_ERR(svn_test__create_fs(&fs, "test-repo-filename-trailing-newline",
opts, pool));
@@ -4967,73 +5306,1874 @@ filename_trailing_newline(const svn_test_opts_t *opts,
SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
svn_pool_clear(subpool);
- /* Attempt to copy /foo to "/bar\n". This should fail on FSFS. */
+ /* Attempt to copy /foo to "/bar\n". This should fail. */
SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, subpool));
SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
SVN_ERR(svn_fs_revision_root(&root, fs, youngest_rev, subpool));
err = svn_fs_copy(root, "/foo", txn_root, "/bar\n", subpool);
- if (!legacy_backend)
- SVN_TEST_ASSERT(err == SVN_NO_ERROR);
- else
- SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
- /* Attempt to create a file /foo/baz\n. This should fail on FSFS. */
+ /* Attempt to create a file /foo/baz\n. This should fail. */
err = svn_fs_make_file(txn_root, "/foo/baz\n", subpool);
- if (!legacy_backend)
- SVN_TEST_ASSERT(err == SVN_NO_ERROR);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
+
+ /* Attempt to create a directory /foo/bang\n. This should fail. */
+ err = svn_fs_make_dir(txn_root, "/foo/bang\n", subpool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_fs_info_format(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ int fs_format;
+ svn_version_t *supports_version;
+ svn_version_t v1_5_0 = {1, 5, 0, ""};
+ svn_version_t v1_9_0 = {1, 9, 0, ""};
+ svn_test_opts_t opts2;
+ svn_boolean_t is_fsx = strcmp(opts->fs_type, "fsx") == 0;
+
+ opts2 = *opts;
+ opts2.server_minor_version = is_fsx ? 9 : 5;
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-fs-format-info", &opts2, pool));
+ SVN_ERR(svn_fs_info_format(&fs_format, &supports_version, fs, pool, pool));
+
+ if (is_fsx)
+ {
+ SVN_TEST_ASSERT(fs_format == 1);
+ SVN_TEST_ASSERT(svn_ver_equal(supports_version, &v1_9_0));
+ }
else
- SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
-
+ {
+ /* happens to be the same for FSFS and BDB */
+ SVN_TEST_ASSERT(fs_format == 3);
+ SVN_TEST_ASSERT(svn_ver_equal(supports_version, &v1_5_0));
+ }
+
+ return SVN_NO_ERROR;
+}
- /* Create another file, with contents. */
- if (!legacy_backend)
+/* Sleeps until apr_time_now() value changes. */
+static void sleep_for_timestamps(void)
+{
+ apr_time_t start = apr_time_now();
+
+ while (start == apr_time_now())
{
- SVN_ERR(svn_fs_make_file(txn_root, "/bar\n/baz\n", subpool));
- SVN_ERR(svn_test__set_file_contents(txn_root, "bar\n/baz\n",
- contents, pool));
+ apr_sleep(APR_USEC_PER_SEC / 1000);
}
+}
+
+static svn_error_t *
+commit_timestamp(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_string_t *date = svn_string_create("Yesterday", pool);
+ svn_revnum_t rev = 0;
+ apr_hash_t *proplist;
+ svn_string_t *svn_date;
+ svn_string_t *txn_svn_date;
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-fs-commit-timestamp",
+ opts, pool));
+
+ /* Commit with a specified svn:date. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, rev, SVN_FS_TXN_CLIENT_DATE, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/foo", pool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_DATE, date, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(svn_date && !strcmp(svn_date->data, date->data));
+
+ /* Commit that overwrites the specified svn:date. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/bar", pool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_DATE, date, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(svn_date && strcmp(svn_date->data, date->data));
+
+ /* Commit with a missing svn:date. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, rev, SVN_FS_TXN_CLIENT_DATE, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/zag", pool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_DATE, NULL, pool));
+ SVN_ERR(svn_fs_txn_prop(&svn_date, txn, SVN_PROP_REVISION_DATE, pool));
+ SVN_TEST_ASSERT(!svn_date);
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(!svn_date);
+
+ /* Commit that overwites a missing svn:date. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/zig", pool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_DATE, NULL, pool));
+ SVN_ERR(svn_fs_txn_prop(&svn_date, txn, SVN_PROP_REVISION_DATE, pool));
+ SVN_TEST_ASSERT(!svn_date);
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(svn_date);
+
+ /* Commit that doesn't do anything special about svn:date. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/zig/foo", pool));
+ SVN_ERR(svn_fs_txn_prop(&txn_svn_date, txn, SVN_PROP_REVISION_DATE, pool));
+ SVN_TEST_ASSERT(txn_svn_date);
+ sleep_for_timestamps();
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(svn_date);
+ SVN_TEST_ASSERT(!svn_string_compare(svn_date, txn_svn_date));
+
+ /* Commit that instructs the backend to use a specific svn:date, but
+ * doesn't provide one. This used to fail with BDB prior to r1663697. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, rev, SVN_FS_TXN_CLIENT_DATE, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/zig/bar", pool));
+ SVN_ERR(svn_fs_txn_prop(&txn_svn_date, txn, SVN_PROP_REVISION_DATE, pool));
+ SVN_TEST_ASSERT(txn_svn_date);
+ sleep_for_timestamps();
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ SVN_ERR(svn_fs_revision_proplist(&proplist, fs, rev, pool));
+ svn_date = apr_hash_get(proplist, SVN_PROP_REVISION_DATE,
+ APR_HASH_KEY_STRING);
+ SVN_TEST_ASSERT(svn_date);
+ SVN_TEST_ASSERT(!svn_string_compare(svn_date, txn_svn_date));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_compat_version(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_version_t *compatible_version;
+ apr_hash_t *config = apr_hash_make(pool);
+
+ svn_version_t vcurrent = {SVN_VER_MAJOR, SVN_VER_MINOR, 0, ""};
+ svn_version_t v1_2_0 = {1, 2, 0, ""};
+ svn_version_t v1_3_0 = {1, 3, 0, ""};
+ svn_version_t v1_5_0 = {1, 5, 0, ""};
+
+ /* no version specified -> default to the current one */
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &vcurrent));
+
+ /* test specific compat option */
+ svn_hash_sets(config, SVN_FS_CONFIG_PRE_1_6_COMPATIBLE, "1");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_5_0));
+
+ /* test precedence amongst compat options */
+ svn_hash_sets(config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE, "1");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_5_0));
+
+ svn_hash_sets(config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE, "1");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_3_0));
+
+ /* precedence should work with the generic option as well */
+ svn_hash_sets(config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "1.4.17-??");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_3_0));
+
+ svn_hash_sets(config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "1.2.3-no!");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_2_0));
+
+ /* test generic option alone */
+ config = apr_hash_make(pool);
+ svn_hash_sets(config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "1.2.3-no!");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &v1_2_0));
+
+ /* out of range values should be caped by the current tool version */
+ svn_hash_sets(config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "2.3.4-x");
+ SVN_ERR(svn_fs__compatible_version(&compatible_version, config, pool));
+ SVN_TEST_ASSERT(svn_ver_equal(compatible_version, &vcurrent));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+dir_prop_merge(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t head_rev;
+ svn_fs_root_t *root;
+ svn_fs_txn_t *txn, *mid_txn, *top_txn, *sub_txn, *c_txn;
+ svn_boolean_t is_bdb = strcmp(opts->fs_type, "bdb") == 0;
+
+ /* Create test repository. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-fs-dir_prop-merge", opts, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
- if (!legacy_backend)
+ /* Create and verify the greek tree. */
+ SVN_ERR(svn_test__create_greek_tree(root, pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Start concurrent transactions */
+
+ /* 1st: modify a mid-level directory */
+ SVN_ERR(svn_fs_begin_txn2(&mid_txn, fs, head_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, mid_txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "A/D", "test-prop",
+ svn_string_create("val1", pool), pool));
+ svn_fs_close_root(root);
+
+ /* 2st: modify a top-level directory */
+ SVN_ERR(svn_fs_begin_txn2(&top_txn, fs, head_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, top_txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "A", "test-prop",
+ svn_string_create("val2", pool), pool));
+ svn_fs_close_root(root);
+
+ SVN_ERR(svn_fs_begin_txn2(&sub_txn, fs, head_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, sub_txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "A/D/G", "test-prop",
+ svn_string_create("val3", pool), pool));
+ svn_fs_close_root(root);
+
+ /* 3rd: modify a conflicting change to the mid-level directory */
+ SVN_ERR(svn_fs_begin_txn2(&c_txn, fs, head_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, c_txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "A/D", "test-prop",
+ svn_string_create("valX", pool), pool));
+ svn_fs_close_root(root);
+
+ /* Prop changes to the same node should conflict */
+ SVN_ERR(test_commit_txn(&head_rev, mid_txn, NULL, pool));
+ SVN_ERR(test_commit_txn(&head_rev, c_txn, "/A/D", pool));
+ SVN_ERR(svn_fs_abort_txn(c_txn, pool));
+
+ /* Changes in a sub-tree should not conflict with prop changes to some
+ parent directory but some backends are clever then others. */
+ if (is_bdb)
{
- svn_revnum_t after_rev;
- static svn_test__tree_entry_t expected_entries[] = {
- { "foo", NULL },
- { "bar\n", NULL },
- { "foo/baz\n", "" },
- { "bar\n/baz\n", contents },
- { NULL, NULL }
- };
- const char *expected_changed_paths[] = {
- "/bar\n",
- "/foo/baz\n",
- "/bar\n/baz\n",
- NULL
- };
- apr_hash_t *expected_changes = apr_hash_make(pool);
- int i;
+ SVN_ERR(test_commit_txn(&head_rev, top_txn, "/A", pool));
+ SVN_ERR(svn_fs_abort_txn(top_txn, pool));
+ }
+ else
+ {
+ SVN_ERR(test_commit_txn(&head_rev, top_txn, NULL, pool));
+ }
+
+ /* The inverted case is not that trivial to handle. Hence, conflict.
+ Depending on the checking order, the reported conflict path differs. */
+ SVN_ERR(test_commit_txn(&head_rev, sub_txn, is_bdb ? "/A/D" : "/A", pool));
+ SVN_ERR(svn_fs_abort_txn(sub_txn, pool));
+
+ return SVN_NO_ERROR;
+}
+
+#if APR_HAS_THREADS
+struct reopen_modify_baton_t {
+ const char *fs_path;
+ const char *txn_name;
+ apr_pool_t *pool;
+ svn_error_t *err;
+};
+
+static void * APR_THREAD_FUNC
+reopen_modify_child(apr_thread_t *tid, void *data)
+{
+ struct reopen_modify_baton_t *baton = data;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+
+ baton->err = svn_fs_open(&fs, baton->fs_path, NULL, baton->pool);
+ if (!baton->err)
+ baton->err = svn_fs_open_txn(&txn, fs, baton->txn_name, baton->pool);
+ if (!baton->err)
+ baton->err = svn_fs_txn_root(&root, txn, baton->pool);
+ if (!baton->err)
+ baton->err = svn_fs_change_node_prop(root, "A", "name",
+ svn_string_create("value",
+ baton->pool),
+ baton->pool);
+ svn_pool_destroy(baton->pool);
+ apr_thread_exit(tid, 0);
+ return NULL;
+}
+#endif
+
+static svn_error_t *
+reopen_modify(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+#if APR_HAS_THREADS
+ svn_fs_t *fs;
+ svn_revnum_t head_rev = 0;
+ svn_fs_root_t *root;
+ svn_fs_txn_t *txn;
+ const char *fs_path, *txn_name;
+ svn_string_t *value;
+ struct reopen_modify_baton_t baton;
+ apr_status_t status, child_status;
+ apr_threadattr_t *tattr;
+ apr_thread_t *tid;
+
+ /* Create test repository with greek tree. */
+ fs_path = "test-reopen-modify";
+ SVN_ERR(svn_test__create_fs(&fs, fs_path, opts, pool));
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__create_greek_tree(root, pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Create txn with changes. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(root, "X", pool));
+
+ /* In another thread: reopen fs and txn, and add more changes. This
+ works in BDB and FSX but in FSFS the txn_dir_cache becomes
+ out-of-date and the thread's changes don't reach the revision. */
+ baton.fs_path = fs_path;
+ baton.txn_name = txn_name;
+ baton.pool = svn_pool_create(pool);
+ status = apr_threadattr_create(&tattr, pool);
+ if (status)
+ return svn_error_wrap_apr(status, _("Can't create threadattr"));
+ status = apr_thread_create(&tid, tattr, reopen_modify_child, &baton, pool);
+ if (status)
+ return svn_error_wrap_apr(status, _("Can't create thread"));
+ status = apr_thread_join(&child_status, tid);
+ if (status)
+ return svn_error_wrap_apr(status, _("Can't join thread"));
+ if (baton.err)
+ return svn_error_trace(baton.err);
+
+ /* Commit */
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Check for change made by thread. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, head_rev, pool));
+ SVN_ERR(svn_fs_node_prop(&value, root, "A", "name", pool));
+ SVN_TEST_ASSERT(value && !strcmp(value->data, "value"));
+
+ return SVN_NO_ERROR;
+#else
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, "no thread support");
+#endif
+}
+
+static svn_error_t *
+upgrade_while_committing(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t head_rev = 0;
+ svn_fs_root_t *root;
+ svn_fs_txn_t *txn1, *txn2;
+ const char *fs_path;
+ apr_hash_t *fs_config = apr_hash_make(pool);
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 6))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.6 SVN doesn't support FSFS packing");
+
+ /* Create test repository with greek tree. */
+ fs_path = "test-upgrade-while-committing";
+
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "1.7");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_SHARD_SIZE, "2");
+ SVN_ERR(svn_test__create_fs2(&fs, fs_path, opts, fs_config, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn1, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn1, pool));
+ SVN_ERR(svn_test__create_greek_tree(root, pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn1, NULL, pool));
+
+ /* Create txn with changes. */
+ SVN_ERR(svn_fs_begin_txn(&txn1, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn1, pool));
+ SVN_ERR(svn_fs_make_dir(root, "/foo", pool));
+
+ /* Upgrade filesystem, but keep existing svn_fs_t object. */
+ SVN_ERR(svn_fs_upgrade(fs_path, pool));
+
+ /* Creating a new txn for the old svn_fs_t should not fail. */
+ SVN_ERR(svn_fs_begin_txn(&txn2, fs, head_rev, pool));
+
+ /* Committing the already existing txn should not fail. */
+ SVN_ERR(test_commit_txn(&head_rev, txn1, NULL, pool));
+
+ /* Verify filesystem content. */
+ SVN_ERR(svn_fs_verify(fs_path, NULL, 0, SVN_INVALID_REVNUM, NULL, NULL,
+ NULL, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Utility method for test_paths_changed. Verify that REV in FS changes
+ * exactly one path and that that change is a property change. Expect
+ * the MERGEINFO_MOD flag of the change to have the given value.
+ */
+static svn_error_t *
+verify_root_prop_change(svn_fs_t *fs,
+ svn_revnum_t rev,
+ svn_tristate_t mergeinfo_mod,
+ apr_pool_t *pool)
+{
+ svn_fs_path_change2_t *change;
+ svn_fs_root_t *root;
+ apr_hash_t *changes;
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ SVN_TEST_ASSERT(apr_hash_count(changes) == 1);
+ change = svn_hash_gets(changes, "/");
+
+ SVN_TEST_ASSERT(change->node_rev_id);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_modify);
+ SVN_TEST_ASSERT( change->node_kind == svn_node_dir
+ || change->node_kind == svn_node_unknown);
+ SVN_TEST_ASSERT(change->text_mod == FALSE);
+ SVN_TEST_ASSERT(change->prop_mod == TRUE);
+
+ if (change->copyfrom_known)
+ {
+ SVN_TEST_ASSERT(change->copyfrom_rev == SVN_INVALID_REVNUM);
+ SVN_TEST_ASSERT(change->copyfrom_path == NULL);
+ }
+
+ SVN_TEST_ASSERT(change->mergeinfo_mod == mergeinfo_mod);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_paths_changed(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t head_rev = 0;
+ svn_fs_root_t *root;
+ svn_fs_txn_t *txn;
+ const char *fs_path;
+ apr_hash_t *changes;
+ svn_boolean_t has_mergeinfo_mod = FALSE;
+ apr_hash_index_t *hi;
+ int i;
+
+ /* The "mergeinfo_mod flag will say "unknown" until recently. */
+ if ( strcmp(opts->fs_type, "bdb") != 0
+ && (!opts->server_minor_version || (opts->server_minor_version >= 9)))
+ has_mergeinfo_mod = TRUE;
+
+ /* Create test repository with greek tree. */
+ fs_path = "test-paths-changed";
+
+ SVN_ERR(svn_test__create_fs2(&fs, fs_path, opts, NULL, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__create_greek_tree(root, pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Create txns with various prop changes. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "/", "propname",
+ svn_string_create("propval", pool), pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "/", "svn:mergeinfo",
+ svn_string_create("/: 1\n", pool), pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Verify changed path lists. */
+
+ /* Greek tree creation rev. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, head_rev - 2, pool));
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+
+ /* Reports all paths? */
+ for (i = 0; svn_test__greek_tree_nodes[i].path; ++i)
+ {
+ const char *path
+ = svn_fspath__canonicalize(svn_test__greek_tree_nodes[i].path, pool);
+
+ SVN_TEST_ASSERT(svn_hash_gets(changes, path));
+ }
+
+ SVN_TEST_ASSERT(apr_hash_count(changes) == i);
+
+ /* Verify per-path info. */
+ for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
+ {
+ svn_fs_path_change2_t *change = apr_hash_this_val(hi);
+
+ SVN_TEST_ASSERT(change->node_rev_id);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_add);
+ SVN_TEST_ASSERT( change->node_kind == svn_node_file
+ || change->node_kind == svn_node_dir
+ || change->node_kind == svn_node_unknown);
+
+ if (change->node_kind != svn_node_unknown)
+ SVN_TEST_ASSERT(change->text_mod == ( change->node_kind
+ == svn_node_file));
+
+ SVN_TEST_ASSERT(change->prop_mod == FALSE);
+
+ if (change->copyfrom_known)
+ {
+ SVN_TEST_ASSERT(change->copyfrom_rev == SVN_INVALID_REVNUM);
+ SVN_TEST_ASSERT(change->copyfrom_path == NULL);
+ }
+
+ if (has_mergeinfo_mod)
+ SVN_TEST_ASSERT(change->mergeinfo_mod == svn_tristate_false);
+ else
+ SVN_TEST_ASSERT(change->mergeinfo_mod == svn_tristate_unknown);
+ }
+
+ /* Propset rev. */
+ SVN_ERR(verify_root_prop_change(fs, head_rev - 1,
+ has_mergeinfo_mod ? svn_tristate_false
+ : svn_tristate_unknown,
+ pool));
+
+ /* Mergeinfo set rev. */
+ SVN_ERR(verify_root_prop_change(fs, head_rev,
+ has_mergeinfo_mod ? svn_tristate_true
+ : svn_tristate_unknown,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_delete_replaced_paths_changed(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t head_rev = 0;
+ svn_fs_root_t *root;
+ svn_fs_txn_t *txn;
+ const char *fs_path;
+ apr_hash_t *changes;
+ svn_fs_path_change2_t *change;
+ const svn_fs_id_t *file_id;
+
+ /* Create test repository with greek tree. */
+ fs_path = "test-delete-replace-paths-changed";
+
+ SVN_ERR(svn_test__create_fs2(&fs, fs_path, opts, NULL, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__create_greek_tree(root, pool));
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* Create that replaces a file with a folder and then deletes that
+ * replacement. Start with the deletion. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_delete(root, "/iota", pool));
+
+ /* The change list should now report a deleted file. */
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ change = svn_hash_gets(changes, "/iota");
+ file_id = change->node_rev_id;
+ SVN_TEST_ASSERT( change->node_kind == svn_node_file
+ || change->node_kind == svn_node_unknown);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_delete);
+
+ /* Add a replacement. */
+ SVN_ERR(svn_fs_make_dir(root, "/iota", pool));
+
+ /* The change list now reports a replacement by a directory. */
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ change = svn_hash_gets(changes, "/iota");
+ SVN_TEST_ASSERT( change->node_kind == svn_node_dir
+ || change->node_kind == svn_node_unknown);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_replace);
+ SVN_TEST_ASSERT(svn_fs_compare_ids(change->node_rev_id, file_id) != 0);
+
+ /* Delete the replacement again. */
+ SVN_ERR(svn_fs_delete(root, "/iota", pool));
+
+ /* The change list should now be reported as a deleted file again. */
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ change = svn_hash_gets(changes, "/iota");
+ SVN_TEST_ASSERT( change->node_kind == svn_node_file
+ || change->node_kind == svn_node_unknown);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_delete);
+ SVN_TEST_ASSERT(svn_fs_compare_ids(change->node_rev_id, file_id) == 0);
+
+ /* Finally, commit the change. */
+ SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+ /* The committed revision should still report the same change. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, head_rev, pool));
+ SVN_ERR(svn_fs_paths_changed2(&changes, root, pool));
+ change = svn_hash_gets(changes, "/iota");
+ SVN_TEST_ASSERT( change->node_kind == svn_node_file
+ || change->node_kind == svn_node_unknown);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_delete);
+
+ return SVN_NO_ERROR;
+}
+
+/* Get rid of transaction NAME in FS. This function deals with backend-
+ * specific behavior as permitted by the API. */
+static svn_error_t *
+cleanup_txn(svn_fs_t *fs,
+ const char *name,
+ apr_pool_t *scratch_pool)
+{
+ /* Get rid of the txns one at a time. */
+ svn_error_t *err = svn_fs_purge_txn(fs, name, scratch_pool);
+
+ /* Some backends (BDB) don't support purging transactions that have never
+ * seen an abort or commit attempt. Simply abort those txns. */
+ if (err && err->apr_err == SVN_ERR_FS_TRANSACTION_NOT_DEAD)
+ {
+ svn_fs_txn_t *txn;
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+
+ SVN_ERR(svn_fs_open_txn(&txn, fs, name, scratch_pool));
+ SVN_ERR(svn_fs_abort_txn(txn, scratch_pool));
+
+ /* Should be gone now ... */
+ SVN_TEST_ASSERT_ERROR(svn_fs_open_txn(&txn, fs, name, scratch_pool),
+ SVN_ERR_FS_NO_SUCH_TRANSACTION);
+ }
+
+ return svn_error_trace(err);
+}
+
+/* Make sure we get txn lists correctly. */
+static svn_error_t *
+purge_txn_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ const char *name1, *name2;
+ apr_array_header_t *txn_list;
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-purge-txn",
+ opts, pool));
- SVN_ERR(svn_fs_commit_txn(NULL, &after_rev, txn, subpool));
- SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+ /* Begin a new transaction, get its name (in the top pool), close it. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
+ SVN_ERR(svn_fs_txn_name(&name1, txn, pool));
+
+ /* Begin *another* transaction, get its name (in the top pool), close it. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
+ SVN_ERR(svn_fs_txn_name(&name2, txn, pool));
+ svn_pool_clear(subpool);
+
+ /* Get rid of the txns one at a time. */
+ SVN_ERR(cleanup_txn(fs, name1, pool));
+
+ /* There should be exactly one left. */
+ SVN_ERR(svn_fs_list_transactions(&txn_list, fs, pool));
+
+ /* Check the list. It should have *exactly* one entry. */
+ SVN_TEST_ASSERT( txn_list->nelts == 1
+ && !strcmp(name2, APR_ARRAY_IDX(txn_list, 0, const char *)));
+
+ /* Get rid of the other txn as well. */
+ SVN_ERR(cleanup_txn(fs, name2, pool));
+
+ /* There should be exactly one left. */
+ SVN_ERR(svn_fs_list_transactions(&txn_list, fs, pool));
+
+ /* Check the list. It should have no entries. */
+ SVN_TEST_ASSERT(txn_list->nelts == 0);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+compare_contents(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root1, *root2;
+ const char *original = "original contents";
+ svn_revnum_t rev;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Two similar but different texts that yield the same MD5 digest. */
+ const char *evil_text1
+ = "\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c"
+ "\x2f\xca\xb5\x87\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89"
+ "\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\x71\x41\x5a"
+ "\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\xf2\x80\x37\x3c\x5b"
+ "\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6"
+ "\xdd\x53\xe2\xb4\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0"
+ "\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\xa8\x0d\x1e"
+ "\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\x2b\x6f\xf7\x2a\x70";
+ const char *evil_text2
+ = "\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c"
+ "\x2f\xca\xb5\x07\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89"
+ "\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\xf1\x41\x5a"
+ "\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\x72\x80\x37\x3c\x5b"
+ "\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6"
+ "\xdd\x53\xe2\x34\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0"
+ "\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\x28\x0d\x1e"
+ "\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\xab\x6f\xf7\x2a\x70";
+ svn_checksum_t *checksum1, *checksum2;
+
+ /* (path, rev) pairs to compare plus the expected API return values */
+ struct
+ {
+ svn_revnum_t rev1;
+ const char *path1;
+ svn_revnum_t rev2;
+ const char *path2;
+
+ svn_boolean_t different; /* result of svn_fs_*_different */
+ svn_tristate_t changed; /* result of svn_fs_*_changed */
+ } to_compare[] =
+ {
+ /* same representation */
+ { 1, "foo", 2, "foo", FALSE, svn_tristate_false },
+ { 1, "foo", 2, "bar", FALSE, svn_tristate_false },
+ { 2, "foo", 2, "bar", FALSE, svn_tristate_false },
+
+ /* different content but MD5 check is not reliable */
+ { 3, "foo", 3, "bar", TRUE, svn_tristate_true },
+
+ /* different contents */
+ { 1, "foo", 3, "bar", TRUE, svn_tristate_true },
+ { 1, "foo", 3, "foo", TRUE, svn_tristate_true },
+ { 3, "foo", 4, "bar", TRUE, svn_tristate_true },
+ { 3, "foo", 4, "bar", TRUE, svn_tristate_true },
+ { 2, "bar", 3, "bar", TRUE, svn_tristate_true },
+ { 3, "bar", 4, "bar", TRUE, svn_tristate_true },
+
+ /* variations on the same theme: same content, possibly different rep */
+ { 4, "foo", 4, "bar", FALSE, svn_tristate_unknown },
+ { 1, "foo", 4, "bar", FALSE, svn_tristate_unknown },
+ { 2, "foo", 4, "bar", FALSE, svn_tristate_unknown },
+ { 1, "foo", 4, "foo", FALSE, svn_tristate_unknown },
+ { 2, "foo", 4, "foo", FALSE, svn_tristate_unknown },
+ { 2, "bar", 4, "bar", FALSE, svn_tristate_unknown },
+
+ /* EOL */
+ { 0 },
+ };
+
+ /* Same same, but different.
+ * Just checking that we actually have an MD5 collision. */
+ SVN_ERR(svn_checksum(&checksum1, svn_checksum_md5, evil_text1,
+ strlen(evil_text1), pool));
+ SVN_ERR(svn_checksum(&checksum2, svn_checksum_md5, evil_text2,
+ strlen(evil_text2), pool));
+ SVN_TEST_ASSERT(svn_checksum_match(checksum1, checksum1));
+ SVN_TEST_ASSERT(strcmp(evil_text1, evil_text2));
+
+ /* Now, build up our test repo. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-compare-contents",
+ opts, pool));
+
+ /* Rev 1: create a file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_fs_make_file(txn_root, "foo", iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", original, iterpool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop",
+ svn_string_create(original, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ SVN_TEST_ASSERT(rev == 1);
+ svn_pool_clear(iterpool);
+
+ /* Rev 2: copy that file. */
+ SVN_ERR(svn_fs_revision_root(&root1, fs, rev, iterpool));
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_fs_copy(root1, "foo", txn_root, "bar", iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ SVN_TEST_ASSERT(rev == 2);
+ svn_pool_clear(iterpool);
+
+ /* Rev 3: modify both files.
+ * The new contents differs for both files but has the same length and MD5.
+ */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", evil_text1, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "bar", evil_text2, iterpool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop",
+ svn_string_create(evil_text1, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "bar", "prop",
+ svn_string_create(evil_text2, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ SVN_TEST_ASSERT(rev == 3);
+ svn_pool_clear(iterpool);
+
+ /* Rev 4: revert both file contents.
+ */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", original, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "bar", original, iterpool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "foo", "prop",
+ svn_string_create(original, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "bar", "prop",
+ svn_string_create(original, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ SVN_TEST_ASSERT(rev == 4);
+ svn_pool_clear(iterpool);
+
+ /* Perform all comparisons listed in TO_COMPARE. */
+ for (i = 0; to_compare[i].rev1 > 0; ++i)
+ {
+ svn_boolean_t text_different;
+ svn_boolean_t text_changed;
+ svn_boolean_t props_different;
+ svn_boolean_t props_changed;
+
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_revision_root(&root1, fs, to_compare[i].rev1, iterpool));
+ SVN_ERR(svn_fs_revision_root(&root2, fs, to_compare[i].rev2, iterpool));
+
+ /* Compare node texts. */
+ SVN_ERR(svn_fs_contents_different(&text_different,
+ root1, to_compare[i].path1,
+ root2, to_compare[i].path2,
+ iterpool));
+ SVN_ERR(svn_fs_contents_changed(&text_changed,
+ root1, to_compare[i].path1,
+ root2, to_compare[i].path2,
+ iterpool));
+
+ /* Compare properties. */
+ SVN_ERR(svn_fs_props_different(&props_different,
+ root1, to_compare[i].path1,
+ root2, to_compare[i].path2,
+ iterpool));
+ SVN_ERR(svn_fs_props_changed(&props_changed,
+ root1, to_compare[i].path1,
+ root2, to_compare[i].path2,
+ iterpool));
+
+ /* Check results. */
+ SVN_TEST_ASSERT(text_different == to_compare[i].different);
+ SVN_TEST_ASSERT(props_different == to_compare[i].different);
+
+ switch (to_compare[i].changed)
+ {
+ case svn_tristate_true:
+ SVN_TEST_ASSERT(text_changed);
+ SVN_TEST_ASSERT(props_changed);
+ break;
+
+ case svn_tristate_false:
+ SVN_TEST_ASSERT(!text_changed);
+ SVN_TEST_ASSERT(!props_changed);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_path_change_create(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_root_t *root;
+ const svn_fs_id_t *id;
+ svn_fs_path_change2_t *change;
+
+ /* Build an empty test repo ... */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-path-change-create",
+ opts, pool));
+
+ /* ... just to give us a valid ID. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, 0, pool));
+ SVN_ERR(svn_fs_node_id(&id, root, "", pool));
+
+ /* Do what we came here for. */
+ change = svn_fs_path_change2_create(id, svn_fs_path_change_replace, pool);
+
+ SVN_TEST_ASSERT(change);
+ SVN_TEST_ASSERT(change->node_rev_id == id);
+ SVN_TEST_ASSERT(change->change_kind == svn_fs_path_change_replace);
+
+ /* All other fields should be "empty" / "unused". */
+ SVN_TEST_ASSERT(change->node_kind == svn_node_none);
+
+ SVN_TEST_ASSERT(change->text_mod == FALSE);
+ SVN_TEST_ASSERT(change->prop_mod == FALSE);
+ SVN_TEST_ASSERT(change->mergeinfo_mod == svn_tristate_unknown);
+
+ SVN_TEST_ASSERT(change->copyfrom_known == FALSE);
+ SVN_TEST_ASSERT(change->copyfrom_rev == SVN_INVALID_REVNUM);
+ SVN_TEST_ASSERT(change->copyfrom_path == NULL);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_node_created_info(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root;
+ svn_revnum_t rev;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Test vectors. */
+ struct
+ {
+ svn_revnum_t rev;
+ const char *path;
+ svn_revnum_t crev;
+ const char *cpath;
+ } to_check[] =
+ {
+ /* New noderev only upon modification. */
+ { 1, "A/B/E/beta", 1, "/A/B/E/beta" },
+ { 2, "A/B/E/beta", 1, "/A/B/E/beta" },
+ { 3, "A/B/E/beta", 3, "/A/B/E/beta" },
+ { 4, "A/B/E/beta", 3, "/A/B/E/beta" },
+
+ /* Lazily copied node. */
+ { 2, "Z/B/E/beta", 1, "/A/B/E/beta" },
+ { 3, "Z/B/E/beta", 1, "/A/B/E/beta" },
+ { 4, "Z/B/E/beta", 4, "/Z/B/E/beta" },
+
+ /* Bubble-up upon sub-tree change. */
+ { 2, "Z", 2, "/Z" },
+ { 3, "Z", 2, "/Z" },
+ { 4, "Z", 4, "/Z" },
+
+ { 0 }
+ };
+
+ /* Start with a new repo and the greek tree in rev 1. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-node-created-path",
+ opts, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, iterpool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool));
+ svn_pool_clear(iterpool);
+
+ /* r2: copy a subtree */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, iterpool));
+ SVN_ERR(svn_fs_copy(root, "A", txn_root, "Z", iterpool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool));
+ svn_pool_clear(iterpool);
+
+ /* r3: touch node in copy source */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/E/beta", "new", iterpool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool));
+ svn_pool_clear(iterpool);
+
+ /* r4: touch same relative node in copy target */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "Z/B/E/beta", "new", iterpool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool));
+ svn_pool_clear(iterpool);
+
+ /* Now ask for some 'node created' info. */
+ for (i = 0; to_check[i].rev > 0; ++i)
+ {
+ svn_revnum_t crev;
+ const char *cpath;
+
+ svn_pool_clear(iterpool);
+
+ /* Get created path and rev. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, to_check[i].rev, iterpool));
+ SVN_ERR(svn_fs_node_created_path(&cpath, root, to_check[i].path,
+ iterpool));
+ SVN_ERR(svn_fs_node_created_rev(&crev, root, to_check[i].path,
+ iterpool));
+
+ /* Compare the results with our expectations. */
+ SVN_TEST_STRING_ASSERT(cpath, to_check[i].cpath);
+
+ if (crev != to_check[i].crev)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "created rev mismatch for %s@%ld:\n"
+ " expected '%ld'\n"
+ " found '%ld",
+ to_check[i].path,
+ to_check[i].rev,
+ to_check[i].crev,
+ crev);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_print_modules(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *expected, *module_name;
+ svn_stringbuf_t *modules = svn_stringbuf_create_empty(pool);
+
+ /* Name of the providing module */
+ if (strcmp(opts->fs_type, "fsx") == 0)
+ module_name = "fs_x";
+ else if (strcmp(opts->fs_type, "fsfs") == 0)
+ module_name = "fs_fs";
+ else if (strcmp(opts->fs_type, "bdb") == 0)
+ module_name = "fs_base";
+ else
+ return svn_error_createf(SVN_ERR_TEST_SKIPPED, NULL,
+ "don't know the module name for %s",
+ opts->fs_type);
+
+ SVN_ERR(svn_fs_print_modules(modules, pool));
+
+ /* The requested FS type must be listed amongst the available modules. */
+ expected = apr_psprintf(pool, "* %s : ", module_name);
+ SVN_TEST_ASSERT(strstr(modules->data, expected));
+
+ return SVN_NO_ERROR;
+}
+
+/* Baton to be used with process_file_contents. */
+typedef struct process_file_contents_baton_t
+{
+ const char *contents;
+ svn_boolean_t processed;
+} process_file_contents_baton_t;
+
+/* Implements svn_fs_process_contents_func_t.
+ * We flag the BATON as "processed" and compare the CONTENTS we've got to
+ * what we expect through the BATON.
+ */
+static svn_error_t *
+process_file_contents(const unsigned char *contents,
+ apr_size_t len,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ process_file_contents_baton_t *b = baton;
+
+ SVN_TEST_ASSERT(strlen(b->contents) == len);
+ SVN_TEST_ASSERT(memcmp(b->contents, contents, len) == 0);
+ b->processed = TRUE;
- /* Validate the DAG. */
- SVN_ERR(svn_fs_revision_root(&root, fs, after_rev, pool));
- SVN_ERR(svn_test__validate_tree(root, expected_entries, 4, pool));
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_zero_copy_processsing(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root;
+ svn_revnum_t rev;
+ const struct svn_test__tree_entry_t *node;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Start with a new repo and the greek tree in rev 1. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-zero-copy-processing",
+ opts, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, iterpool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, iterpool));
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+
+ /* Prime the full-text cache by reading all file contents. */
+ for (node = svn_test__greek_tree_nodes; node->path; node++)
+ if (node->contents)
+ {
+ svn_stream_t *stream;
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_file_contents(&stream, root, node->path, iterpool));
+ SVN_ERR(svn_stream_copy3(stream, svn_stream_buffered(iterpool),
+ NULL, NULL, iterpool));
+ }
+
+ /* Now, try to get the data directly from cache
+ * (if the backend has caches). */
+ for (node = svn_test__greek_tree_nodes; node->path; node++)
+ if (node->contents)
+ {
+ svn_boolean_t success;
+
+ process_file_contents_baton_t baton;
+ baton.contents = node->contents;
+ baton.processed = FALSE;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_try_process_file_contents(&success, root, node->path,
+ process_file_contents, &baton,
+ iterpool));
+ SVN_TEST_ASSERT(success == baton.processed);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_dir_optimal_order(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root;
+ svn_revnum_t rev;
+ apr_hash_t *unordered;
+ apr_array_header_t *ordered;
+ int i;
+ apr_hash_index_t *hi;
+
+ /* Create a new repo and the greek tree in rev 1. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-dir-optimal-order",
+ opts, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, pool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, pool));
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+
+ /* Call the API function we are interested in. */
+ SVN_ERR(svn_fs_dir_entries(&unordered, root, "A", pool));
+ SVN_ERR(svn_fs_dir_optimal_order(&ordered, root, unordered, pool, pool));
+
+ /* Verify that all entries are returned. */
+ SVN_TEST_ASSERT(ordered->nelts == apr_hash_count(unordered));
+ for (hi = apr_hash_first(pool, unordered); hi; hi = apr_hash_next(hi))
+ {
+ svn_boolean_t found = FALSE;
+ const char *name = apr_hash_this_key(hi);
+
+ /* Compare hash -> array because the array might contain the same
+ * entry more than once. Since that can't happen in the hash, doing
+ * it in this direction ensures ORDERED won't contain duplicates.
+ */
+ for (i = 0; !found && i < ordered->nelts; ++i)
+ {
+ svn_fs_dirent_t *item = APR_ARRAY_IDX(ordered, i, svn_fs_dirent_t*);
+ if (strcmp(item->name, name) == 0)
+ {
+ found = TRUE;
+ SVN_TEST_ASSERT(item == apr_hash_this_val(hi));
+ }
+ }
- /* Validate changed-paths, where the problem originally occurred. */
- for (i = 0; expected_changed_paths[i]; i++)
- svn_hash_sets(expected_changes, expected_changed_paths[i],
- "undefined value");
- SVN_ERR(svn_test__validate_changes(root, expected_changes, pool));
+ SVN_TEST_ASSERT(found);
}
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_config_files(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ apr_array_header_t *files;
+ int i;
+ const char *repo_name = "test-repo-config-files";
+
+ /* Create a empty and get its config files. */
+ SVN_ERR(svn_test__create_fs(&fs, repo_name, opts, pool));
+ SVN_ERR(svn_fs_info_config_files(&files, fs, pool, pool));
+
+ /* All files should exist and be below the repo. */
+ for (i = 0; i < files->nelts; ++i)
+ {
+ svn_node_kind_t kind;
+ const char *path = APR_ARRAY_IDX(files, i, const char*);
+
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+
+ SVN_TEST_ASSERT(kind == svn_node_file);
+ SVN_TEST_ASSERT(svn_dirent_is_ancestor(repo_name, path));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_delta_file_stream(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root1, *root2;
+ svn_revnum_t rev;
+
+ const char *old_content = "some content";
+ const char *new_content = "some more content";
+ svn_txdelta_window_handler_t delta_handler;
+ void *delta_baton;
+ svn_txdelta_stream_t *delta_stream;
+ svn_stringbuf_t *source = svn_stringbuf_create_empty(pool);
+ svn_stringbuf_t *dest = svn_stringbuf_create_empty(pool);
+
+ /* Create a new repo. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-delta-file-stream",
+ opts, pool));
+
+ /* Revision 1: create a file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "foo", pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", old_content, pool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, pool));
+
+ /* Revision 2: create a file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", new_content, pool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, pool));
+
+ SVN_ERR(svn_fs_revision_root(&root1, fs, 1, pool));
+ SVN_ERR(svn_fs_revision_root(&root2, fs, 2, pool));
+
+ /* Test 1: Get delta against empty target. */
+ SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream,
+ NULL, NULL, root1, "foo", pool));
+
+ svn_stringbuf_setempty(source);
+ svn_stringbuf_setempty(dest);
+
+ svn_txdelta_apply(svn_stream_from_stringbuf(source, pool),
+ svn_stream_from_stringbuf(dest, pool),
+ NULL, NULL, pool, &delta_handler, &delta_baton);
+ SVN_ERR(svn_txdelta_send_txstream(delta_stream,
+ delta_handler,
+ delta_baton,
+ pool));
+ SVN_TEST_STRING_ASSERT(old_content, dest->data);
+
+ /* Test 2: Get delta against previous version. */
+ SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream,
+ root1, "foo", root2, "foo", pool));
+
+ svn_stringbuf_set(source, old_content);
+ svn_stringbuf_setempty(dest);
+
+ svn_txdelta_apply(svn_stream_from_stringbuf(source, pool),
+ svn_stream_from_stringbuf(dest, pool),
+ NULL, NULL, pool, &delta_handler, &delta_baton);
+ SVN_ERR(svn_txdelta_send_txstream(delta_stream,
+ delta_handler,
+ delta_baton,
+ pool));
+ SVN_TEST_STRING_ASSERT(new_content, dest->data);
+
+ /* Test 3: Get reverse delta. */
+ SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream,
+ root2, "foo", root1, "foo", pool));
+
+ svn_stringbuf_set(source, new_content);
+ svn_stringbuf_setempty(dest);
+
+ svn_txdelta_apply(svn_stream_from_stringbuf(source, pool),
+ svn_stream_from_stringbuf(dest, pool),
+ NULL, NULL, pool, &delta_handler, &delta_baton);
+ SVN_ERR(svn_txdelta_send_txstream(delta_stream,
+ delta_handler,
+ delta_baton,
+ pool));
+ SVN_TEST_STRING_ASSERT(old_content, dest->data);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_fs_merge(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root, *root0, *root1;
+ svn_revnum_t rev;
+
+ /* Very basic test for svn_fs_merge because all the other interesting
+ * cases get tested implicitly with concurrent txn / commit tests.
+ * This API is just a thin layer around the internal merge function
+ * and we simply check that the plumbing between them works.
+ */
+
+ /* Create a new repo. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-fs-merge",
+ opts, pool));
+ SVN_ERR(svn_fs_revision_root(&root0, fs, 0, pool));
+
+ /* Revision 1: create a file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "foo", pool));
+ SVN_ERR(test_commit_txn(&rev, txn, NULL, pool));
+ SVN_ERR(svn_fs_revision_root(&root1, fs, rev, pool));
+
+ /* Merge-able txn: create another file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "bar", pool));
+
+ SVN_ERR(svn_fs_merge(NULL, root1, "/", txn_root, "/", root0, "/", pool));
+
+ /* Not merge-able: create the same file file. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "foo", pool));
+
+ SVN_TEST_ASSERT_ERROR(svn_fs_merge(NULL, root1, "/", txn_root, "/", root0,
+ "/", pool), SVN_ERR_FS_CONFLICT);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_fsfs_config_opts(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_hash_t *fs_config;
+ svn_fs_t *fs;
+ const svn_fs_info_placeholder_t *fs_info;
+ const svn_fs_fsfs_info_t *fsfs_info;
+
+ /* Bail (with SKIP) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ /* Remove the test directory from previous runs. */
+ SVN_ERR(svn_io_remove_dir2("test-fsfs-config-opts", TRUE, NULL, NULL, pool));
+
+ /* Create the test directory and add it to the test cleanup list. */
+ SVN_ERR(svn_io_dir_make("test-fsfs-config-opts", APR_OS_DEFAULT, pool));
+ svn_test_add_dir_cleanup("test-fsfs-config-opts");
+
+ /* Create an FSFS filesystem with default config.*/
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, SVN_FS_TYPE_FSFS);
+ SVN_ERR(svn_fs_create(&fs, "test-fsfs-config-opts/default", fs_config, pool));
+
+ /* Re-open FS to test the data on disk. */
+ SVN_ERR(svn_fs_open2(&fs, "test-fsfs-config-opts/default", NULL, pool, pool));
+
+ SVN_ERR(svn_fs_info(&fs_info, fs, pool, pool));
+ SVN_TEST_STRING_ASSERT(fs_info->fs_type, SVN_FS_TYPE_FSFS);
+ fsfs_info = (const void *) fs_info;
+
+ /* Check FSFS specific info. Don't check the SHARD_SIZE, because it depends
+ * on a compile-time constant and may be overridden. */
+ SVN_TEST_ASSERT(fsfs_info->log_addressing);
+ SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0);
+
+ /* Create an FSFS filesystem with custom settings: disabled log-addressing
+ * and custom shard size (123). */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, SVN_FS_TYPE_FSFS);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_LOG_ADDRESSING, "false");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_SHARD_SIZE, "123");
+ SVN_ERR(svn_fs_create(&fs, "test-fsfs-config-opts/custom", fs_config, pool));
+
+ /* Re-open FS to test the data on disk. */
+ SVN_ERR(svn_fs_open2(&fs, "test-fsfs-config-opts/custom", NULL, pool, pool));
+
+ SVN_ERR(svn_fs_info(&fs_info, fs, pool, pool));
+ SVN_TEST_STRING_ASSERT(fs_info->fs_type, SVN_FS_TYPE_FSFS);
+ fsfs_info = (const void *) fs_info;
+
+ /* Check FSFS specific info, including the SHARD_SIZE. */
+ SVN_TEST_ASSERT(fsfs_info->log_addressing == FALSE);
+ SVN_TEST_ASSERT(fsfs_info->shard_size == 123);
+ SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_txn_pool_lifetime(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ /* Technically, the FS API makes no assumption on the lifetime of logically
+ * dependent objects. In particular, a txn root object may get destroyed
+ * after the FS object that it has been built upon. Actual data access is
+ * implied to be invalid without a valid svn_fs_t.
+ *
+ * This test verifies that at least the destruction order of those two
+ * objects is arbitrary.
+ */
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+
+ /* We will allocate FS in FS_POOL. Using a separate allocator makes
+ * sure that we actually free the memory when destroying the pool.
+ */
+ apr_allocator_t *fs_allocator = svn_pool_create_allocator(FALSE);
+ apr_pool_t *fs_pool = apr_allocator_owner_get(fs_allocator);
+
+ /* Create a new repo. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-pool-lifetime",
+ opts, fs_pool));
+
+ /* Create a TXN_ROOT referencing FS. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+
+ /* Destroy FS. Depending on the actual allocator implementation,
+ * these memory pages becomes inaccessible. */
+ svn_pool_destroy(fs_pool);
+
+ /* Unclean implementations will try to access FS and may segfault here. */
+ svn_fs_close_root(txn_root);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_modify_txn_being_written(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ /* FSFS has a limitation (and check) that only one file can be
+ * modified in TXN at time: see r861812 and svn_fs_apply_text() docstring.
+ * This is regression test for this behavior. */
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ const char *txn_name;
+ svn_fs_root_t *txn_root;
+ svn_stream_t *foo_contents;
+ svn_stream_t *bar_contents;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, SVN_FS_TYPE_FSFS) != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ /* Create a new repo. */
+ SVN_ERR(svn_test__create_fs(&fs, "test-modify-txn-being-written",
+ opts, pool));
+
+ /* Create a TXN_ROOT referencing FS. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+
+ /* Make file /foo and open for writing.*/
+ SVN_ERR(svn_fs_make_file(txn_root, "/foo", pool));
+ SVN_ERR(svn_fs_apply_text(&foo_contents, txn_root, "/foo", NULL, pool));
+
+ /* Attempt to modify another file '/bar' -- FSFS doesn't allow this. */
+ SVN_ERR(svn_fs_make_file(txn_root, "/bar", pool));
+ SVN_TEST_ASSERT_ERROR(
+ svn_fs_apply_text(&bar_contents, txn_root, "/bar", NULL, pool),
+ SVN_ERR_FS_REP_BEING_WRITTEN);
+
+ /* *Reopen TXN. */
+ SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+
+ /* Check that file '/bar' still cannot be modified */
+ SVN_TEST_ASSERT_ERROR(
+ svn_fs_apply_text(&bar_contents, txn_root, "/bar", NULL, pool),
+ SVN_ERR_FS_REP_BEING_WRITTEN);
+
+ /* Close file '/foo'. */
+ SVN_ERR(svn_stream_close(foo_contents));
+
+ /* Now file '/bar' can be modified. */
+ SVN_ERR(svn_fs_apply_text(&bar_contents, txn_root, "/bar", NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_prop_and_text_rep_sharing_collision(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ /* Regression test for issue 4554: Wrong file length with PLAIN
+ * representations in FSFS. */
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_fs_root_t *rev_root;
+ svn_revnum_t new_rev;
+ svn_filesize_t length;
+ const char *testdir = "test-prop-and-text-rep-sharing-collision";
+
+ /* Create a new repo. */
+ SVN_ERR(svn_test__create_fs(&fs, testdir, opts, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ /* Set node property for the root. */
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "/", "prop",
+ svn_string_create("value", pool),
+ pool));
+
+ /* Commit revision r1. */
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 1, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+
+ /* Create file with same contents as property representation. */
+ SVN_ERR(svn_fs_make_file(txn_root, "/foo", pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "/foo",
+ "K 4\n"
+ "prop\n"
+ "V 5\n"
+ "value\n"
+ "END\n", pool));
+
+ /* Commit revision r2. */
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+
+ /* Check that FS reports correct length for the file (23). */
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, 2, pool));
+ SVN_ERR(svn_fs_file_length(&length, rev_root, "/foo", pool));
+
+ SVN_TEST_ASSERT(length == 23);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_internal_txn_props(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_string_t *val;
+ svn_prop_t prop;
+ svn_prop_t internal_prop;
+ apr_array_header_t *props;
+ apr_hash_t *proplist;
+ svn_error_t *err;
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-repo-internal-txn-props",
+ opts, pool));
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 0,
+ SVN_FS_TXN_CHECK_LOCKS |
+ SVN_FS_TXN_CHECK_OOD |
+ SVN_FS_TXN_CLIENT_DATE, pool));
+
+ /* Ensure that we cannot read internal transaction properties. */
+ SVN_ERR(svn_fs_txn_prop(&val, txn, SVN_FS__PROP_TXN_CHECK_LOCKS, pool));
+ SVN_TEST_ASSERT(!val);
+ SVN_ERR(svn_fs_txn_prop(&val, txn, SVN_FS__PROP_TXN_CHECK_OOD, pool));
+ SVN_TEST_ASSERT(!val);
+ SVN_ERR(svn_fs_txn_prop(&val, txn, SVN_FS__PROP_TXN_CLIENT_DATE, pool));
+ SVN_TEST_ASSERT(!val);
+
+ SVN_ERR(svn_fs_txn_proplist(&proplist, txn, pool));
+ SVN_TEST_ASSERT(apr_hash_count(proplist) == 1);
+ val = svn_hash_gets(proplist, SVN_PROP_REVISION_DATE);
+ SVN_TEST_ASSERT(val);
+
+ /* We also cannot change or discard them. */
+ val = svn_string_create("Ooops!", pool);
+
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CHECK_LOCKS, val, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CHECK_OOD, val, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CHECK_OOD, NULL, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CLIENT_DATE, val, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+ err = svn_fs_change_txn_prop(txn, SVN_FS__PROP_TXN_CLIENT_DATE, NULL, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+
+ prop.name = "foo";
+ prop.value = svn_string_create("bar", pool);
+ internal_prop.name = SVN_FS__PROP_TXN_CHECK_LOCKS;
+ internal_prop.value = svn_string_create("Ooops!", pool);
+
+ props = apr_array_make(pool, 2, sizeof(svn_prop_t));
+ APR_ARRAY_PUSH(props, svn_prop_t) = prop;
+ APR_ARRAY_PUSH(props, svn_prop_t) = internal_prop;
+
+ err = svn_fs_change_txn_props(txn, props, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_INCORRECT_PARAMS);
+
+ return SVN_NO_ERROR;
+}
+
+/* A freeze function that expects an 'svn_error_t *' baton, and returns it. */
+/* This function implements svn_fs_freeze_func_t. */
+static svn_error_t *
+freeze_func(void *baton, apr_pool_t *pool)
+{
+ return baton;
+}
+
+static svn_error_t *
+freeze_and_commit(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_revnum_t new_rev = 0;
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ if (!strcmp(opts->fs_type, "bdb"))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will not test BDB repositories");
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-freeze-and-commit", opts, subpool));
+
+ /* This test used to FAIL with an SQLite error since svn_fs_freeze()
+ * wouldn't unlock rep-cache.db. Therefore, part of the role of creating
+ * the Greek tree is to create a rep-cache.db, in order to test that
+ * svn_fs_freeze() unlocks it. */
+
+ /* r1: Commit the Greek tree. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, new_rev, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, subpool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, subpool));
+
+ /* Freeze and unfreeze. */
+ SVN_ERR(svn_fs_freeze(fs, freeze_func, SVN_NO_ERROR, pool));
+
+ /* Freeze again, but have freeze_func fail. */
+ {
+ svn_error_t *err = svn_error_create(APR_EGENERAL, NULL, NULL);
+ SVN_TEST_ASSERT_ERROR(svn_fs_freeze(fs, freeze_func, err, pool),
+ err->apr_err);
+ }
+
+ /* Make some commit using same FS instance. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, new_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "/", "temperature",
+ svn_string_create("310.05", pool),
+ pool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+
+ /* Re-open FS and make another commit. */
+ SVN_ERR(svn_fs_open(&fs, "test-freeze-and-commit", NULL, subpool));
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, new_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, "/", "temperature",
+ svn_string_create("451", pool),
+ pool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+commit_with_locked_rep_cache(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_revnum_t new_rev;
+ svn_sqlite__db_t *sdb;
+ svn_error_t *err;
+ const char *fs_path;
+ const char *statements[] = { "SELECT MAX(revision) FROM rep_cache", NULL };
+
+ if (strcmp(opts->fs_type, SVN_FS_TYPE_FSFS) != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 6))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.6 SVN doesn't support FSFS rep-sharing");
+
+ fs_path = "test-repo-commit-with-locked-rep-cache";
+ SVN_ERR(svn_test__create_fs(&fs, fs_path, opts, pool));
+
+ /* r1: Add a file. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 0, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "/foo", pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "/foo", "a", pool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, pool));
+ SVN_TEST_INT_ASSERT(new_rev, 1);
+
+ /* Begin a new transaction based on r1. */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 1, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "/foo", "b", pool));
+
+ /* Obtain a shared lock on the rep-cache.db by starting a new read
+ * transaction. */
+ SVN_ERR(svn_sqlite__open(&sdb,
+ svn_dirent_join(fs_path, "rep-cache.db", pool),
+ svn_sqlite__mode_readonly, statements, 0, NULL,
+ 0, pool, pool));
+ SVN_ERR(svn_sqlite__begin_transaction(sdb));
+ SVN_ERR(svn_sqlite__exec_statements(sdb, 0));
+
+ /* Attempt to commit fs transaction. This should result in a commit
+ * post-processing error due to us still holding the shared lock on the
+ * rep-cache.db. */
+ err = svn_fs_commit_txn(NULL, &new_rev, txn, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_SQLITE_BUSY);
+ SVN_TEST_INT_ASSERT(new_rev, 2);
+
+ /* Release the shared lock. */
+ SVN_ERR(svn_sqlite__finish_transaction(sdb, SVN_NO_ERROR));
+ SVN_ERR(svn_sqlite__close(sdb));
+
+ /* Try an operation that reads from rep-cache.db.
+ *
+ * XFAIL: Around r1740802, this call was producing an error due to the
+ * svn_fs_t keeping an unusable db connection (and associated file
+ * locks) within it.
+ */
+ SVN_ERR(svn_fs_verify(fs_path, NULL, 0, SVN_INVALID_REVNUM, NULL, NULL,
+ NULL, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_rep_sharing_strict_content_check(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_revnum_t new_rev;
+ const char *fs_path, *fs_path2;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ svn_error_t *err;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, SVN_FS_TYPE_BDB) == 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "BDB repositories don't support rep-sharing");
+
+ /* Create 2 repos with same structure & size but different contents */
+ fs_path = "test-rep-sharing-strict-content-check1";
+ fs_path2 = "test-rep-sharing-strict-content-check2";
+
+ SVN_ERR(svn_test__create_fs(&fs, fs_path, opts, subpool));
+
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 0, 0, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_fs_make_file(txn_root, "/foo", subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", "quite bad", subpool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, subpool));
+ SVN_TEST_INT_ASSERT(new_rev, 1);
+
+ SVN_ERR(svn_test__create_fs(&fs, fs_path2, opts, subpool));
+
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 0, 0, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_fs_make_file(txn_root, "foo", subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "foo", "very good", subpool));
+ SVN_ERR(test_commit_txn(&new_rev, txn, NULL, subpool));
+ SVN_TEST_INT_ASSERT(new_rev, 1);
+
+ /* Close both repositories. */
+ svn_pool_clear(subpool);
+
+ /* Doctor the first repo such that it uses the wrong rep-cache. */
+ SVN_ERR(svn_io_copy_file(svn_relpath_join(fs_path2, "rep-cache.db", pool),
+ svn_relpath_join(fs_path, "rep-cache.db", pool),
+ FALSE, pool));
+
+ /* Changing the file contents such that rep-sharing would kick in if
+ the file contents was not properly compared. */
+ SVN_ERR(svn_fs_open2(&fs, fs_path, NULL, subpool, subpool));
+
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, 1, 0, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ err = svn_test__set_file_contents(txn_root, "foo", "very good", subpool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_GENERAL);
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
/* ------------------------------------------------------------------------ */
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 8;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(trivial_transaction,
@@ -5048,6 +7188,12 @@ struct svn_test_descriptor_t test_funcs[] =
"check that transaction names are not reused"),
SVN_TEST_OPTS_PASS(write_and_read_file,
"write and read a file's contents"),
+ SVN_TEST_OPTS_PASS(almostmedium_file_integrity,
+ "create and modify almostmedium file"),
+ SVN_TEST_OPTS_PASS(medium_file_integrity,
+ "create and modify medium file"),
+ SVN_TEST_OPTS_PASS(large_file_integrity,
+ "create and modify large file"),
SVN_TEST_OPTS_PASS(create_mini_tree_transaction,
"test basic file and subdirectory creation"),
SVN_TEST_OPTS_PASS(create_greek_tree_transaction,
@@ -5079,10 +7225,6 @@ struct svn_test_descriptor_t test_funcs[] =
"check old revisions"),
SVN_TEST_OPTS_PASS(check_all_revisions,
"after each commit, check all revisions"),
- SVN_TEST_OPTS_PASS(medium_file_integrity,
- "create and modify medium file"),
- SVN_TEST_OPTS_PASS(large_file_integrity,
- "create and modify large file"),
SVN_TEST_OPTS_PASS(check_root_revision,
"ensure accurate storage of root node"),
SVN_TEST_OPTS_PASS(test_node_created_rev,
@@ -5111,5 +7253,63 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_fs_delete_fs"),
SVN_TEST_OPTS_PASS(filename_trailing_newline,
"filenames with trailing \\n might be rejected"),
+ SVN_TEST_OPTS_PASS(test_fs_info_format,
+ "test svn_fs_info_format"),
+ SVN_TEST_OPTS_PASS(commit_timestamp,
+ "commit timestamp"),
+ SVN_TEST_OPTS_PASS(test_compat_version,
+ "test svn_fs__compatible_version"),
+ SVN_TEST_OPTS_PASS(dir_prop_merge,
+ "test merge directory properties"),
+ SVN_TEST_OPTS_XFAIL_OTOH(reopen_modify,
+ "test reopen and modify txn",
+ SVN_TEST_PASS_IF_FS_TYPE_IS_NOT("fsfs")),
+ SVN_TEST_OPTS_PASS(upgrade_while_committing,
+ "upgrade while committing"),
+ SVN_TEST_OPTS_PASS(test_paths_changed,
+ "test svn_fs_paths_changed"),
+ SVN_TEST_OPTS_PASS(test_delete_replaced_paths_changed,
+ "test deletion after replace in changed paths list"),
+ SVN_TEST_OPTS_PASS(purge_txn_test,
+ "test purging transactions"),
+ SVN_TEST_OPTS_PASS(compare_contents,
+ "compare contents of different nodes"),
+ SVN_TEST_OPTS_PASS(test_path_change_create,
+ "test svn_fs_path_change2_create"),
+ SVN_TEST_OPTS_PASS(test_node_created_info,
+ "test FS 'node created' info"),
+ SVN_TEST_OPTS_PASS(test_print_modules,
+ "test FS module listing"),
+ SVN_TEST_OPTS_PASS(test_zero_copy_processsing,
+ "test zero copy file processing"),
+ SVN_TEST_OPTS_PASS(test_dir_optimal_order,
+ "test svn_fs_dir_optimal_order"),
+ SVN_TEST_OPTS_PASS(test_config_files,
+ "get configuration files"),
+ SVN_TEST_OPTS_PASS(test_delta_file_stream,
+ "get a delta stream on a file"),
+ SVN_TEST_OPTS_PASS(test_fs_merge,
+ "get merging txns with newer revisions"),
+ SVN_TEST_OPTS_PASS(test_fsfs_config_opts,
+ "test creating FSFS repository with different opts"),
+ SVN_TEST_OPTS_PASS(test_txn_pool_lifetime,
+ "test pool lifetime dependencies with txn roots"),
+ SVN_TEST_OPTS_PASS(test_modify_txn_being_written,
+ "test modify txn being written in FSFS"),
+ SVN_TEST_OPTS_PASS(test_prop_and_text_rep_sharing_collision,
+ "test property and text rep-sharing collision"),
+ SVN_TEST_OPTS_PASS(test_internal_txn_props,
+ "test setting and getting internal txn props"),
+ SVN_TEST_OPTS_PASS(check_txn_related,
+ "test svn_fs_check_related for transactions"),
+ SVN_TEST_OPTS_PASS(freeze_and_commit,
+ "freeze and commit"),
+ SVN_TEST_OPTS_PASS(commit_with_locked_rep_cache,
+ "test commit with locked rep-cache"),
+ SVN_TEST_OPTS_XFAIL_OTOH(test_rep_sharing_strict_content_check,
+ "test rep-sharing on content rather than SHA1",
+ SVN_TEST_PASS_IF_FS_TYPE_IS(SVN_FS_TYPE_FSFS)),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs/locks-test.c b/subversion/tests/libsvn_fs/locks-test.c
index ee275de..0c86eb2 100644
--- a/subversion/tests/libsvn_fs/locks-test.c
+++ b/subversion/tests/libsvn_fs/locks-test.c
@@ -28,6 +28,7 @@
#include "svn_error.h"
#include "svn_fs.h"
+#include "svn_hash.h"
#include "../svn_test_fs.h"
@@ -52,9 +53,19 @@ get_locks_callback(void *baton,
struct get_locks_baton_t *b = baton;
apr_pool_t *hash_pool = apr_hash_pool_get(b->locks);
svn_string_t *lock_path = svn_string_create(lock->path, hash_pool);
- apr_hash_set(b->locks, lock_path->data, lock_path->len,
- svn_lock_dup(lock, hash_pool));
- return SVN_NO_ERROR;
+
+ if (!apr_hash_get(b->locks, lock_path->data, lock_path->len))
+ {
+ apr_hash_set(b->locks, lock_path->data, lock_path->len,
+ svn_lock_dup(lock, hash_pool));
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Lock for path '%s' is being reported twice.",
+ lock->path);
+ }
}
/* A factory function. */
@@ -608,9 +619,9 @@ lock_expiration(const svn_test_opts_t *opts,
SVN_ERR(svn_fs_create_access(&access, "bubba", pool));
SVN_ERR(svn_fs_set_access(fs, access));
- /* Lock /A/D/G/rho, with an expiration 3 seconds from now. */
+ /* Lock /A/D/G/rho, with an expiration 2 seconds from now. */
SVN_ERR(svn_fs_lock(&mylock, fs, "/A/D/G/rho", NULL, "", 0,
- apr_time_now() + apr_time_from_sec(3),
+ apr_time_now() + apr_time_from_sec(2),
SVN_INVALID_REVNUM, FALSE, pool));
/* Become nobody. */
@@ -640,9 +651,9 @@ lock_expiration(const svn_test_opts_t *opts,
num_expected_paths, pool));
}
- /* Sleep 5 seconds, so the lock auto-expires. Anonymous commit
+ /* Sleep 2 seconds, so the lock auto-expires. Anonymous commit
should then succeed. */
- apr_sleep(apr_time_from_sec(5));
+ apr_sleep(apr_time_from_sec(3));
/* Verify that the lock auto-expired even in the recursive case. */
{
@@ -786,15 +797,430 @@ lock_out_of_date(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+struct lock_result_t {
+ const svn_lock_t *lock;
+ svn_error_t *fs_err;
+};
+
+static svn_error_t *
+expect_lock(const char *path,
+ apr_hash_t *results,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && result->lock && !result->fs_err);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, path, scratch_pool));
+ SVN_TEST_ASSERT(lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_error(const char *path,
+ apr_hash_t *results,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && !result->lock && result->fs_err);
+ svn_error_clear(result->fs_err);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, path, scratch_pool));
+ SVN_TEST_ASSERT(!lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_unlock(const char *path,
+ apr_hash_t *results,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && !result->fs_err);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, path, scratch_pool));
+ SVN_TEST_ASSERT(!lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_unlock_error(const char *path,
+ apr_hash_t *results,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && result->fs_err);
+ svn_error_clear(result->fs_err);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, path, scratch_pool));
+ SVN_TEST_ASSERT(lock);
+ return SVN_NO_ERROR;
+}
+
+struct lock_many_baton_t {
+ apr_hash_t *results;
+ apr_pool_t *pool;
+ int count;
+};
+
+/* Implements svn_fs_lock_callback_t. */
+static svn_error_t *
+lock_many_cb(void *lock_baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *pool)
+{
+ struct lock_many_baton_t *b = lock_baton;
+ struct lock_result_t *result = apr_palloc(b->pool,
+ sizeof(struct lock_result_t));
+
+ result->lock = lock;
+ result->fs_err = svn_error_dup(fs_err);
+ svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
+
+ if (b->count)
+ if (!--(b->count))
+ return svn_error_create(SVN_ERR_FS_GENERAL, NULL, "lock_many_cb");
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+lock_multiple_paths(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root, *txn_root;
+ const char *conflict;
+ svn_revnum_t newrev;
+ svn_fs_access_t *access;
+ svn_fs_lock_target_t *target;
+ struct lock_many_baton_t baton;
+ apr_hash_t *lock_paths, *unlock_paths;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(create_greek_fs(&fs, &newrev, "test-lock-multiple-paths",
+ opts, pool));
+ SVN_ERR(svn_fs_create_access(&access, "bubba", pool));
+ SVN_ERR(svn_fs_set_access(fs, access));
+ SVN_ERR(svn_fs_revision_root(&root, fs, newrev, pool));
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, newrev, SVN_FS_TXN_CHECK_LOCKS, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/A/BB", pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "/A/BBB", pool));
+ SVN_ERR(svn_fs_copy(root, "/A/mu", txn_root, "/A/BB/mu", pool));
+ SVN_ERR(svn_fs_copy(root, "/A/mu", txn_root, "/A/BBB/mu", pool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &newrev, txn, pool));
+
+ baton.results = apr_hash_make(pool);
+ baton.pool = pool;
+ baton.count = 0;
+ lock_paths = apr_hash_make(pool);
+ unlock_paths = apr_hash_make(pool);
+ target = svn_fs_lock_target_create(NULL, newrev, pool);
+
+ svn_hash_sets(lock_paths, "/A/B/E/alpha", target);
+ svn_hash_sets(lock_paths, "/A/B/E/beta", target);
+ svn_hash_sets(lock_paths, "/A/B/E/zulu", target);
+ svn_hash_sets(lock_paths, "/A/BB/mu", target);
+ svn_hash_sets(lock_paths, "/A/BBB/mu", target);
+ svn_hash_sets(lock_paths, "/A/D/G/pi", target);
+ svn_hash_sets(lock_paths, "/A/D/G/rho", target);
+ svn_hash_sets(lock_paths, "/A/mu", target);
+ svn_hash_sets(lock_paths, "/X/zulu", target);
+
+ /* Lock some paths. */
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_fs_lock_many(fs, lock_paths, "comment", 0, 0, 0,
+ lock_many_cb, &baton,
+ pool, pool));
+
+ SVN_ERR(expect_lock("/A/B/E/alpha", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/B/E/beta", baton.results, fs, pool));
+ SVN_ERR(expect_error("/A/B/E/zulu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/BB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/BBB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/D/G/pi", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/D/G/rho", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/mu", baton.results, fs, pool));
+ SVN_ERR(expect_error("/X/zulu", baton.results, fs, pool));
+
+ /* Unlock without force and wrong tokens. */
+ for (hi = apr_hash_first(pool, lock_paths); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_paths, apr_hash_this_key(hi), "wrong-token");
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_fs_unlock_many(fs, unlock_paths, FALSE, lock_many_cb, &baton,
+ pool, pool));
+
+ SVN_ERR(expect_unlock_error("/A/B/E/alpha", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/B/E/beta", baton.results, fs, pool));
+ SVN_ERR(expect_error("/A/B/E/zulu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/BB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/BBB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/D/G/pi", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/D/G/rho", baton.results, fs, pool));
+ SVN_ERR(expect_unlock_error("/A/mu", baton.results, fs, pool));
+ SVN_ERR(expect_error("/X/zulu", baton.results, fs, pool));
+
+ /* Force unlock. */
+ for (hi = apr_hash_first(pool, lock_paths); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_paths, apr_hash_this_key(hi), "");
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_fs_unlock_many(fs, unlock_paths, TRUE, lock_many_cb, &baton,
+ pool, pool));
+
+ SVN_ERR(expect_unlock("/A/B/E/alpha", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/B/E/beta", baton.results, fs, pool));
+ SVN_ERR(expect_error("/A/B/E/zulu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/BB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/BBB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/D/G/pi", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/D/G/rho", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/mu", baton.results, fs, pool));
+ SVN_ERR(expect_error("/X/zulu", baton.results, fs, pool));
+
+ /* Lock again. */
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_fs_lock_many(fs, lock_paths, "comment", 0, 0, 0,
+ lock_many_cb, &baton,
+ pool, pool));
+
+ SVN_ERR(expect_lock("/A/B/E/alpha", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/B/E/beta", baton.results, fs, pool));
+ SVN_ERR(expect_error("/A/B/E/zulu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/BB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/BBB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/D/G/pi", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/D/G/rho", baton.results, fs, pool));
+ SVN_ERR(expect_lock("/A/mu", baton.results, fs, pool));
+ SVN_ERR(expect_error("/X/zulu", baton.results, fs, pool));
+
+ /* Unlock without force. */
+ for (hi = apr_hash_first(pool, baton.results); hi; hi = apr_hash_next(hi))
+ {
+ struct lock_result_t *result = apr_hash_this_val(hi);
+ svn_hash_sets(unlock_paths, apr_hash_this_key(hi),
+ result->lock ? result->lock->token : "non-existent-token");
+ }
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_fs_unlock_many(fs, unlock_paths, FALSE, lock_many_cb, &baton,
+ pool, pool));
+
+ SVN_ERR(expect_unlock("/A/B/E/alpha", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/B/E/beta", baton.results, fs, pool));
+ SVN_ERR(expect_error("/A/B/E/zulu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/BB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/BBB/mu", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/D/G/pi", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/D/G/rho", baton.results, fs, pool));
+ SVN_ERR(expect_unlock("/A/mu", baton.results, fs, pool));
+ SVN_ERR(expect_error("/X/zulu", baton.results, fs, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+lock_cb_error(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t newrev;
+ svn_fs_access_t *access;
+ svn_fs_lock_target_t *target;
+ struct lock_many_baton_t baton;
+ apr_hash_t *lock_paths, *unlock_paths;
+ svn_lock_t *lock;
+
+ SVN_ERR(create_greek_fs(&fs, &newrev, "test-lock-cb-error", opts, pool));
+ SVN_ERR(svn_fs_create_access(&access, "bubba", pool));
+ SVN_ERR(svn_fs_set_access(fs, access));
+
+ baton.results = apr_hash_make(pool);
+ baton.pool = pool;
+ baton.count = 1;
+ lock_paths = apr_hash_make(pool);
+ unlock_paths = apr_hash_make(pool);
+ target = svn_fs_lock_target_create(NULL, newrev, pool);
+
+ svn_hash_sets(lock_paths, "/A/B/E/alpha", target);
+ svn_hash_sets(lock_paths, "/A/B/E/beta", target);
+
+ apr_hash_clear(baton.results);
+ SVN_TEST_ASSERT_ERROR(svn_fs_lock_many(fs, lock_paths, "comment", 0, 0, 0,
+ lock_many_cb, &baton,
+ pool, pool),
+ SVN_ERR_FS_GENERAL);
+
+ SVN_TEST_ASSERT(apr_hash_count(baton.results) == 1);
+ SVN_TEST_ASSERT(svn_hash_gets(baton.results, "/A/B/E/alpha")
+ || svn_hash_gets(baton.results, "/A/B/E/beta"));
+ SVN_ERR(svn_fs_get_lock(&lock, fs, "/A/B/E/alpha", pool));
+ SVN_TEST_ASSERT(lock);
+ svn_hash_sets(unlock_paths, "/A/B/E/alpha", lock->token);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, "/A/B/E/beta", pool));
+ SVN_TEST_ASSERT(lock);
+ svn_hash_sets(unlock_paths, "/A/B/E/beta", lock->token);
+
+ baton.count = 1;
+ apr_hash_clear(baton.results);
+ SVN_TEST_ASSERT_ERROR(svn_fs_unlock_many(fs, unlock_paths, FALSE,
+ lock_many_cb, &baton,
+ pool, pool),
+ SVN_ERR_FS_GENERAL);
+
+ SVN_TEST_ASSERT(apr_hash_count(baton.results) == 1);
+ SVN_TEST_ASSERT(svn_hash_gets(baton.results, "/A/B/E/alpha")
+ || svn_hash_gets(baton.results, "/A/B/E/beta"));
+
+ SVN_ERR(svn_fs_get_lock(&lock, fs, "/A/B/E/alpha", pool));
+ SVN_TEST_ASSERT(!lock);
+ SVN_ERR(svn_fs_get_lock(&lock, fs, "/A/B/E/beta", pool));
+ SVN_TEST_ASSERT(!lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+obtain_write_lock_failure(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t newrev;
+ svn_fs_access_t *access;
+ svn_fs_lock_target_t *target;
+ struct lock_many_baton_t baton;
+ apr_hash_t *lock_paths, *unlock_paths;
+
+ /* The test makes sense only for FSFS. */
+ if (strcmp(opts->fs_type, SVN_FS_TYPE_FSFS) != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ SVN_ERR(create_greek_fs(&fs, &newrev, "test-obtain-write-lock-failure",
+ opts, pool));
+ SVN_ERR(svn_fs_create_access(&access, "bubba", pool));
+ SVN_ERR(svn_fs_set_access(fs, access));
+
+ /* Make a read only 'write-lock' file. This prevents any write operations
+ from being executed. */
+ SVN_ERR(svn_io_set_file_read_only("test-obtain-write-lock-failure/write-lock",
+ FALSE, pool));
+
+ baton.results = apr_hash_make(pool);
+ baton.pool = pool;
+ baton.count = 0;
+
+ /* Trying to lock some paths. We don't really care about error; the test
+ shouldn't crash. */
+ target = svn_fs_lock_target_create(NULL, newrev, pool);
+ lock_paths = apr_hash_make(pool);
+ svn_hash_sets(lock_paths, "/iota", target);
+ svn_hash_sets(lock_paths, "/A/mu", target);
+
+ apr_hash_clear(baton.results);
+ SVN_TEST_ASSERT_ANY_ERROR(svn_fs_lock_many(fs, lock_paths, "comment", 0, 0, 0,
+ lock_many_cb, &baton, pool, pool));
+
+ /* Trying to unlock some paths. We don't really care about error; the test
+ shouldn't crash. */
+ unlock_paths = apr_hash_make(pool);
+ svn_hash_sets(unlock_paths, "/iota", "");
+ svn_hash_sets(unlock_paths, "/A/mu", "");
+
+ apr_hash_clear(baton.results);
+ SVN_TEST_ASSERT_ANY_ERROR(svn_fs_unlock_many(fs, unlock_paths, TRUE,
+ lock_many_cb, &baton, pool,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+parent_and_child_lock(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_access_t *access;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ const char *conflict;
+ svn_revnum_t newrev;
+ svn_lock_t *lock;
+ struct get_locks_baton_t *get_locks_baton;
+ apr_size_t num_expected_paths;
+
+ SVN_ERR(svn_test__create_fs(&fs, "test-parent-and-child-lock", opts, pool));
+ SVN_ERR(svn_fs_create_access(&access, "bubba", pool));
+ SVN_ERR(svn_fs_set_access(fs, access));
+
+ /* Make a file '/A'. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, "/A", pool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &newrev, txn, pool));
+
+ /* Obtain a lock on '/A'. */
+ SVN_ERR(svn_fs_lock(&lock, fs, "/A", NULL, NULL, FALSE, 0, newrev, FALSE,
+ pool));
+
+ /* Add a lock token to FS access context. */
+ SVN_ERR(svn_fs_access_add_lock_token(access, lock->token));
+
+ /* Make some weird change: replace file '/A' by a directory with a
+ child. Issue 2507 means that the result is that the directory /A
+ remains locked. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, newrev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_delete(root, "/A", pool));
+ SVN_ERR(svn_fs_make_dir(root, "/A", pool));
+ SVN_ERR(svn_fs_make_file(root, "/A/b", pool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &newrev, txn, pool));
+
+ /* Obtain a lock on '/A/b'. Issue 2507 means that the lock index
+ for / refers to both /A and /A/b, and that the lock index for /A
+ refers to /A/b. */
+ SVN_ERR(svn_fs_lock(&lock, fs, "/A/b", NULL, NULL, FALSE, 0, newrev, FALSE,
+ pool));
+
+ /* Verify the locked paths. The lock for /A/b should not be reported
+ twice even though issue 2507 means we access the index for / and
+ the index for /A both of which refer to /A/b. */
+ {
+ static const char *expected_paths[] = {
+ "/A",
+ "/A/b",
+ };
+ num_expected_paths = sizeof(expected_paths) / sizeof(const char *);
+ get_locks_baton = make_get_locks_baton(pool);
+ SVN_ERR(svn_fs_get_locks(fs, "/", get_locks_callback,
+ get_locks_baton, pool));
+ SVN_ERR(verify_matching_lock_paths(get_locks_baton, expected_paths,
+ num_expected_paths, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
/* ------------------------------------------------------------------------ */
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 2;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(lock_expiration,
+ "test that locks can expire"),
SVN_TEST_OPTS_PASS(lock_only,
"lock only"),
SVN_TEST_OPTS_PASS(lookup_lock_by_path,
@@ -811,11 +1237,19 @@ struct svn_test_descriptor_t test_funcs[] =
"test that locking is enforced in final commit step"),
SVN_TEST_OPTS_PASS(lock_dir_propchange,
"dir propchange can be committed with locked child"),
- SVN_TEST_OPTS_PASS(lock_expiration,
- "test that locks can expire"),
SVN_TEST_OPTS_PASS(lock_break_steal_refresh,
"breaking, stealing, refreshing a lock"),
SVN_TEST_OPTS_PASS(lock_out_of_date,
"check out-of-dateness before locking"),
+ SVN_TEST_OPTS_PASS(lock_multiple_paths,
+ "lock multiple paths"),
+ SVN_TEST_OPTS_PASS(lock_cb_error,
+ "lock callback error"),
+ SVN_TEST_OPTS_PASS(obtain_write_lock_failure,
+ "lock/unlock when 'write-lock' couldn't be obtained"),
+ SVN_TEST_OPTS_PASS(parent_and_child_lock,
+ "lock parent and it's child"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_base/changes-test.c b/subversion/tests/libsvn_fs_base/changes-test.c
index b93410e..a637203 100644
--- a/subversion/tests/libsvn_fs_base/changes-test.c
+++ b/subversion/tests/libsvn_fs_base/changes-test.c
@@ -193,7 +193,7 @@ changes_fetch_raw(const svn_test_opts_t *opts,
struct changes_args args;
/* Create a new fs and repos */
- SVN_ERR(svn_test__create_bdb_fs(&fs, "test-repo-changes-fetch", opts,
+ SVN_ERR(svn_test__create_bdb_fs(&fs, "test-repo-changes-fetch-raw", opts,
pool));
/* First, verify that we can request changes for an arbitrary key
@@ -903,7 +903,9 @@ changes_bad_sequences(const svn_test_opts_t *opts,
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(changes_add,
@@ -920,3 +922,5 @@ struct svn_test_descriptor_t test_funcs[] =
"verify that bad change sequences raise errors"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_base/fs-base-test.c b/subversion/tests/libsvn_fs_base/fs-base-test.c
index d16deae..20d4d63 100644
--- a/subversion/tests/libsvn_fs_base/fs-base-test.c
+++ b/subversion/tests/libsvn_fs_base/fs-base-test.c
@@ -124,7 +124,7 @@ static svn_error_t *
check_entry_present(svn_fs_root_t *root, const char *path,
const char *name, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = FALSE;
SVN_ERR(check_entry(root, path, name, &present, pool));
if (! present)
@@ -141,7 +141,7 @@ static svn_error_t *
check_entry_absent(svn_fs_root_t *root, const char *path,
const char *name, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = TRUE;
SVN_ERR(check_entry(root, path, name, &present, pool));
if (present)
@@ -213,7 +213,7 @@ check_id(svn_fs_t *fs, const svn_fs_id_t *id, svn_boolean_t *present,
static svn_error_t *
check_id_present(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = FALSE;
SVN_ERR(check_id(fs, id, &present, pool));
if (! present)
@@ -233,7 +233,7 @@ check_id_present(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
static svn_error_t *
check_id_absent(svn_fs_t *fs, const svn_fs_id_t *id, apr_pool_t *pool)
{
- svn_boolean_t present;
+ svn_boolean_t present = TRUE;
SVN_ERR(check_id(fs, id, &present, pool));
if (present)
@@ -1519,7 +1519,9 @@ key_test(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 2;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(create_berkeley_filesystem,
@@ -1546,3 +1548,5 @@ struct svn_test_descriptor_t test_funcs[] =
"testing sequential alphanumeric key generation"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_base/strings-reps-test.c b/subversion/tests/libsvn_fs_base/strings-reps-test.c
index 4512eef..34e829c 100644
--- a/subversion/tests/libsvn_fs_base/strings-reps-test.c
+++ b/subversion/tests/libsvn_fs_base/strings-reps-test.c
@@ -612,7 +612,7 @@ write_null_string(const svn_test_opts_t *opts,
/* Create a new fs and repos */
SVN_ERR(svn_test__create_bdb_fs
- (&fs, "test-repo-test-strings", opts,
+ (&fs, "test-repo-write-null-string", opts,
pool));
args.fs = fs;
@@ -732,7 +732,9 @@ copy_string(const svn_test_opts_t *opts,
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 3;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(write_new_rep,
@@ -753,3 +755,5 @@ struct svn_test_descriptor_t test_funcs[] =
"create and copy a string"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c b/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c
new file mode 100644
index 0000000..818c1e0
--- /dev/null
+++ b/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c
@@ -0,0 +1,393 @@
+/* fs-fs-fuzzy-test.c --- fuzzing tests for the FSFS filesystem
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+#include "../../libsvn_fs_fs/fs.h"
+#include "../../libsvn_fs_fs/fs_fs.h"
+#include "../../libsvn_fs_fs/rev_file.h"
+
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_props.h"
+#include "svn_fs.h"
+#include "private/svn_string_private.h"
+#include "private/svn_string_private.h"
+
+#include "../svn_test_fs.h"
+
+
+
+/*** Helper Functions ***/
+
+/* We won't log or malfunction() upon errors. */
+static void
+dont_filter_warnings(void *baton, svn_error_t *err)
+{
+ return;
+}
+
+
+/*** Test core code ***/
+
+/* Verify that a modification of any single byte in REVISION of FS at
+ * REPO_NAME using MODIFIER with BATON will be detected. */
+static svn_error_t *
+fuzzing_1_byte_1_rev(const char *repo_name,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ unsigned char (* modifier)(unsigned char c, void *baton),
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ apr_hash_t *fs_config;
+ svn_fs_fs__revision_file_t *rev_file;
+ apr_off_t filesize = 0, offset;
+ apr_off_t i;
+ unsigned char footer_len;
+
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Open the revision file for modification. */
+ SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs, revision,
+ pool, iterpool));
+ SVN_ERR(svn_fs_fs__auto_read_footer(rev_file));
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_END, &filesize, iterpool));
+
+ offset = filesize - 1;
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset, iterpool));
+ SVN_ERR(svn_io_file_getc((char *)&footer_len, rev_file->file, iterpool));
+
+ /* We want all the caching we can get. More importantly, we want to
+ change the cache namespace before each test iteration. */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "2");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ, "0");
+
+ /* Manipulate all bytes one at a time. */
+ for (i = 0; i < filesize; ++i)
+ {
+ svn_error_t *err = SVN_NO_ERROR;
+
+ /* Read byte */
+ unsigned char c_old, c_new;
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &i, iterpool));
+ SVN_ERR(svn_io_file_getc((char *)&c_old, rev_file->file, iterpool));
+
+ /* What to replace it with. Skip if there is no change. */
+ c_new = modifier(c_old, baton);
+ if (c_new == c_old)
+ continue;
+
+ /* Modify / corrupt the data. */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &i, iterpool));
+ SVN_ERR(svn_io_file_putc((char)c_new, rev_file->file, iterpool));
+ SVN_ERR(svn_io_file_flush(rev_file->file, iterpool));
+
+ /* Make sure we use a different namespace for the caches during
+ this iteration. */
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(iterpool));
+ SVN_ERR(svn_repos_open3(&repos, repo_name, fs_config, iterpool, iterpool));
+ svn_fs_set_warning_func(svn_repos_fs(repos), dont_filter_warnings, NULL);
+
+ /* This shall detect the corruption and return an error. */
+ err = svn_repos_verify_fs3(repos, revision, revision, FALSE, FALSE,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ iterpool);
+
+ /* Case-only changes in checksum digests are not an error.
+ * We allow upper case chars to be used in MD5 checksums in all other
+ * places, thus restricting them here would be inconsistent. */
+ if ( i >= filesize - footer_len /* Within footer */
+ && c_old >= 'a' && c_old <= 'f' /* 'a' to 'f', only appear
+ in checksum digests */
+ && c_new == c_old - 'a' + 'A') /* respective upper case */
+ {
+ if (err)
+ {
+ /* Let us know where we were too strict ... */
+ printf("Detected case change in checksum digest at offset 0x%"
+ APR_UINT64_T_HEX_FMT " (%" APR_OFF_T_FMT ") in r%ld: "
+ "%c -> %c\n", (apr_uint64_t)i, i, revision, c_old, c_new);
+
+ SVN_ERR(err);
+ }
+ }
+ else if (!err)
+ {
+ /* Let us know where we miss changes ... */
+ printf("Undetected mod at offset 0x%"APR_UINT64_T_HEX_FMT
+ " (%"APR_OFF_T_FMT") in r%ld: 0x%02x -> 0x%02x\n",
+ (apr_uint64_t)i, i, revision, c_old, c_new);
+
+ SVN_TEST_ASSERT(err);
+ }
+
+ svn_error_clear(err);
+
+ /* Undo the corruption. */
+ SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &i, iterpool));
+ SVN_ERR(svn_io_file_putc((char)c_old, rev_file->file, iterpool));
+
+ svn_pool_clear(iterpool);
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Create a greek repo with OPTS at REPO_NAME. Verify that a modification
+ * of any single byte using MODIFIER with BATON will be detected. */
+static svn_error_t *
+fuzzing_1_byte_test(const svn_test_opts_t *opts,
+ const char *repo_name,
+ unsigned char (* modifier)(unsigned char c, void *baton),
+ void *baton,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_revnum_t rev;
+ svn_revnum_t i;
+
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+ /* Create a filesystem */
+ SVN_ERR(svn_test__create_repos(&repos, repo_name, opts, pool));
+ fs = svn_repos_fs(repos);
+
+ /* Revision 1 (one and only revision): the Greek tree */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(rev));
+
+ for (i = 0; i <= rev; ++i)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(fuzzing_1_byte_1_rev(repo_name, fs, i, modifier, baton,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+/* Modifier function to be used with fuzzing_set_byte_test.
+ * We return the fixed char value given as *BATON. */
+static unsigned char
+set_byte(unsigned char c, void *baton)
+{
+ return *(const unsigned char *)baton;
+}
+
+/* Run the fuzzing test setting any byte in the repo to all values MIN to
+ * MAX-1. */
+static svn_error_t *
+fuzzing_set_byte_test(const svn_test_opts_t *opts,
+ int min,
+ int max,
+ apr_pool_t *pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ unsigned i = 0;
+ for (i = min; i < max; ++i)
+ {
+ unsigned char c = i;
+ const char *repo_name;
+ svn_pool_clear(iterpool);
+
+ repo_name = apr_psprintf(iterpool, "test-repo-fuzzing_set_byte_%d_%d",
+ min, max);
+ SVN_ERR(fuzzing_1_byte_test(opts, repo_name, set_byte, &c, iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ return SVN_NO_ERROR;
+}
+
+
+
+/*** Tests ***/
+
+/* ------------------------------------------------------------------------ */
+
+static unsigned char
+invert_byte(unsigned char c, void *baton)
+{
+ return ~c;
+}
+
+static svn_error_t *
+fuzzing_invert_byte_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(fuzzing_1_byte_test(opts, "test-repo-fuzzing_invert_byte",
+ invert_byte, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static unsigned char
+increment_byte(unsigned char c, void *baton)
+{
+ return c + 1;
+}
+
+static svn_error_t *
+fuzzing_increment_byte_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(fuzzing_1_byte_test(opts, "test-repo-fuzzing_increment_byte",
+ increment_byte, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static unsigned char
+decrement_byte(unsigned char c, void *baton)
+{
+ return c - 1;
+}
+
+static svn_error_t *
+fuzzing_decrement_byte_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(fuzzing_1_byte_test(opts, "test-repo-fuzzing_decrement_byte",
+ decrement_byte, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* ------------------------------------------------------------------------ */
+
+static unsigned char
+null_byte(unsigned char c, void *baton)
+{
+ return 0;
+}
+
+static svn_error_t *
+fuzzing_null_byte_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(fuzzing_1_byte_test(opts, "test-repo-fuzzing_null_byte",
+ null_byte, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* ------------------------------------------------------------------------ */
+
+/* Generator macro: define a test function covering byte values N to M-1 */
+#define FUZZING_SET_BYTE_TEST_N(N,M)\
+ static svn_error_t * \
+ fuzzing_set_byte_test_ ##N(const svn_test_opts_t *opts, \
+ apr_pool_t *pool) \
+ { \
+ return svn_error_trace(fuzzing_set_byte_test(opts, N, M, pool)); \
+ }
+
+/* Add the test function declared above to the test_funcs array. */
+#define TEST_FUZZING_SET_BYTE_TEST_N(N,M)\
+ SVN_TEST_OPTS_PASS(fuzzing_set_byte_test_ ##N, \
+ "set any byte to any value between " #N " and " #M)
+
+/* Declare tests that will cover all possible byte values. */
+FUZZING_SET_BYTE_TEST_N(0,16)
+FUZZING_SET_BYTE_TEST_N(16,32)
+FUZZING_SET_BYTE_TEST_N(32,48)
+FUZZING_SET_BYTE_TEST_N(48,64)
+FUZZING_SET_BYTE_TEST_N(64,80)
+FUZZING_SET_BYTE_TEST_N(80,96)
+FUZZING_SET_BYTE_TEST_N(96,112)
+FUZZING_SET_BYTE_TEST_N(112,128)
+FUZZING_SET_BYTE_TEST_N(128,144)
+FUZZING_SET_BYTE_TEST_N(144,160)
+FUZZING_SET_BYTE_TEST_N(160,176)
+FUZZING_SET_BYTE_TEST_N(176,192)
+FUZZING_SET_BYTE_TEST_N(192,208)
+FUZZING_SET_BYTE_TEST_N(208,224)
+FUZZING_SET_BYTE_TEST_N(224,240)
+FUZZING_SET_BYTE_TEST_N(240,256)
+
+
+/* The test table. */
+
+/* Allow for any number of tests to run in parallel. */
+static int max_threads = 0;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(fuzzing_invert_byte_test,
+ "fuzzing: invert any byte"),
+ SVN_TEST_OPTS_PASS(fuzzing_increment_byte_test,
+ "fuzzing: increment any byte"),
+ SVN_TEST_OPTS_PASS(fuzzing_decrement_byte_test,
+ "fuzzing: decrement any byte"),
+ SVN_TEST_OPTS_PASS(fuzzing_null_byte_test,
+ "fuzzing: set any byte to 0"),
+
+ /* Register generated tests. */
+ TEST_FUZZING_SET_BYTE_TEST_N(0,16),
+ TEST_FUZZING_SET_BYTE_TEST_N(16,32),
+ TEST_FUZZING_SET_BYTE_TEST_N(32,48),
+ TEST_FUZZING_SET_BYTE_TEST_N(48,64),
+ TEST_FUZZING_SET_BYTE_TEST_N(64,80),
+ TEST_FUZZING_SET_BYTE_TEST_N(80,96),
+ TEST_FUZZING_SET_BYTE_TEST_N(96,112),
+ TEST_FUZZING_SET_BYTE_TEST_N(112,128),
+ TEST_FUZZING_SET_BYTE_TEST_N(128,144),
+ TEST_FUZZING_SET_BYTE_TEST_N(144,160),
+ TEST_FUZZING_SET_BYTE_TEST_N(160,176),
+ TEST_FUZZING_SET_BYTE_TEST_N(176,192),
+ TEST_FUZZING_SET_BYTE_TEST_N(192,208),
+ TEST_FUZZING_SET_BYTE_TEST_N(208,224),
+ TEST_FUZZING_SET_BYTE_TEST_N(224,240),
+ TEST_FUZZING_SET_BYTE_TEST_N(240,256),
+
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c b/subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c
new file mode 100644
index 0000000..aa07469
--- /dev/null
+++ b/subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c
@@ -0,0 +1,1947 @@
+/* fs-fs-pack-test.c --- tests for the FSFS filesystem
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+#include "../../libsvn_fs/fs-loader.h"
+#include "../../libsvn_fs_fs/fs.h"
+#include "../../libsvn_fs_fs/fs_fs.h"
+#include "../../libsvn_fs_fs/low_level.h"
+#include "../../libsvn_fs_fs/pack.h"
+#include "../../libsvn_fs_fs/util.h"
+
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_props.h"
+#include "svn_fs.h"
+#include "private/svn_string_private.h"
+
+#include "../svn_test_fs.h"
+
+
+
+/*** Helper Functions ***/
+
+static void
+ignore_fs_warnings(void *baton, svn_error_t *err)
+{
+#ifdef SVN_DEBUG
+ SVN_DBG(("Ignoring FS warning %s\n",
+ svn_error_symbolic_name(err ? err->apr_err : 0)));
+#endif
+ return;
+}
+
+/* Return the expected contents of "iota" in revision REV. */
+static const char *
+get_rev_contents(svn_revnum_t rev, apr_pool_t *pool)
+{
+ /* Toss in a bunch of magic numbers for spice. */
+ apr_int64_t num = ((rev * 1234353 + 4358) * 4583 + ((rev % 4) << 1)) / 42;
+ return apr_psprintf(pool, "%" APR_INT64_T_FMT "\n", num);
+}
+
+struct pack_notify_baton
+{
+ apr_int64_t expected_shard;
+ svn_fs_pack_notify_action_t expected_action;
+};
+
+static svn_error_t *
+pack_notify(void *baton,
+ apr_int64_t shard,
+ svn_fs_pack_notify_action_t action,
+ apr_pool_t *pool)
+{
+ struct pack_notify_baton *pnb = baton;
+
+ SVN_TEST_ASSERT(shard == pnb->expected_shard);
+ SVN_TEST_ASSERT(action == pnb->expected_action);
+
+ /* Update expectations. */
+ switch (action)
+ {
+ case svn_fs_pack_notify_start:
+ pnb->expected_action = svn_fs_pack_notify_end;
+ break;
+
+ case svn_fs_pack_notify_end:
+ pnb->expected_action = svn_fs_pack_notify_start;
+ pnb->expected_shard++;
+ break;
+
+ default:
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "Unknown notification action when packing");
+ }
+
+ return SVN_NO_ERROR;
+}
+
+#define R1_LOG_MSG "Let's serf"
+
+/* Create a filesystem in DIR. Set the shard size to SHARD_SIZE and create
+ NUM_REVS number of revisions (in addition to r0). Use POOL for
+ allocations. After this function successfully completes, the filesystem's
+ youngest revision number will be NUM_REVS. */
+static svn_error_t *
+create_non_packed_filesystem(const char *dir,
+ const svn_test_opts_t *opts,
+ svn_revnum_t num_revs,
+ int shard_size,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ const char *conflict;
+ svn_revnum_t after_rev;
+ apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *iterpool;
+ apr_hash_t *fs_config;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 6))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.6 SVN doesn't support FSFS packing");
+
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_SHARD_SIZE,
+ apr_itoa(pool, shard_size));
+
+ /* Create a filesystem. */
+ SVN_ERR(svn_test__create_fs2(&fs, dir, opts, fs_config, subpool));
+
+ /* Revision 1: the Greek tree */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, subpool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_LOG,
+ svn_string_create(R1_LOG_MSG, pool),
+ pool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+
+ /* Revisions 2 thru NUM_REVS-1: content tweaks to "iota". */
+ iterpool = svn_pool_create(subpool);
+ while (after_rev < num_revs)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, after_rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "iota",
+ get_rev_contents(after_rev + 1,
+ iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, iterpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+ }
+ svn_pool_destroy(iterpool);
+ svn_pool_destroy(subpool);
+
+ /* Done */
+ return SVN_NO_ERROR;
+}
+
+/* Create a packed filesystem in DIR. Set the shard size to
+ SHARD_SIZE and create NUM_REVS number of revisions (in addition to
+ r0). Use POOL for allocations. After this function successfully
+ completes, the filesystem's youngest revision number will be the
+ same as NUM_REVS. */
+static svn_error_t *
+create_packed_filesystem(const char *dir,
+ const svn_test_opts_t *opts,
+ svn_revnum_t num_revs,
+ int shard_size,
+ apr_pool_t *pool)
+{
+ struct pack_notify_baton pnb;
+
+ /* Create the repo and fill it. */
+ SVN_ERR(create_non_packed_filesystem(dir, opts, num_revs, shard_size,
+ pool));
+
+ /* Now pack the FS */
+ pnb.expected_shard = 0;
+ pnb.expected_action = svn_fs_pack_notify_start;
+ return svn_fs_pack(dir, pack_notify, &pnb, NULL, NULL, pool);
+}
+
+/* Create a packed FSFS filesystem for revprop tests at REPO_NAME with
+ * MAX_REV revisions and the given SHARD_SIZE and OPTS. Return it in *FS.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+prepare_revprop_repo(svn_fs_t **fs,
+ const char *repo_name,
+ svn_revnum_t max_rev,
+ int shard_size,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ const char *conflict;
+ svn_revnum_t after_rev;
+ apr_pool_t *subpool;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(create_packed_filesystem(repo_name, opts, max_rev, shard_size, pool));
+ SVN_ERR(svn_fs_open2(fs, repo_name, NULL, pool, pool));
+
+ subpool = svn_pool_create(pool);
+ /* Do a commit to trigger packing. */
+ SVN_ERR(svn_fs_begin_txn(&txn, *fs, max_rev, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "iota", "new-iota", subpool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+ svn_pool_destroy(subpool);
+
+ /* Pack the repository. */
+ SVN_ERR(svn_fs_pack(repo_name, NULL, NULL, NULL, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* For revision REV, return a short log message allocated in POOL.
+ */
+static svn_string_t *
+default_log(svn_revnum_t rev, apr_pool_t *pool)
+{
+ return svn_string_createf(pool, "Default message for rev %ld", rev);
+}
+
+/* For revision REV, return a long log message allocated in POOL.
+ */
+static svn_string_t *
+large_log(svn_revnum_t rev, apr_size_t length, apr_pool_t *pool)
+{
+ svn_stringbuf_t *temp = svn_stringbuf_create_ensure(100000, pool);
+ int i, count = (int)(length - 50) / 6;
+
+ svn_stringbuf_appendcstr(temp, "A ");
+ for (i = 0; i < count; ++i)
+ svn_stringbuf_appendcstr(temp, "very, ");
+
+ svn_stringbuf_appendcstr(temp,
+ apr_psprintf(pool, "very long message for rev %ld, indeed", rev));
+
+ return svn_stringbuf__morph_into_string(temp);
+}
+
+/* For revision REV, return a long log message allocated in POOL.
+ */
+static svn_string_t *
+huge_log(svn_revnum_t rev, apr_pool_t *pool)
+{
+ return large_log(rev, 90000, pool);
+}
+
+
+/*** Tests ***/
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsfs-pack"
+#define SHARD_SIZE 7
+#define MAX_REV 53
+static svn_error_t *
+pack_filesystem(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ int i;
+ svn_node_kind_t kind;
+ const char *path;
+ char buf[80];
+ apr_file_t *file;
+ apr_size_t len;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
+
+ /* Check to see that the pack files exist, and that the rev directories
+ don't. */
+ for (i = 0; i < (MAX_REV + 1) / SHARD_SIZE; i++)
+ {
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs",
+ apr_psprintf(pool, "%d.pack", i / SHARD_SIZE),
+ "pack", SVN_VA_NULL);
+
+ /* These files should exist. */
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+ if (kind != svn_node_file)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Expected pack file '%s' not found", path);
+
+ if (opts->server_minor_version && (opts->server_minor_version < 9))
+ {
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs",
+ apr_psprintf(pool, "%d.pack", i / SHARD_SIZE),
+ "manifest", SVN_VA_NULL);
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+ if (kind != svn_node_file)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Expected manifest file '%s' not found",
+ path);
+ }
+
+ /* This directory should not exist. */
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs",
+ apr_psprintf(pool, "%d", i / SHARD_SIZE),
+ SVN_VA_NULL);
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+ if (kind != svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Unexpected directory '%s' found", path);
+ }
+
+ /* Ensure the min-unpacked-rev jives with the above operations. */
+ SVN_ERR(svn_io_file_open(&file,
+ svn_dirent_join(REPO_NAME, PATH_MIN_UNPACKED_REV,
+ pool),
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
+ len = sizeof(buf);
+ SVN_ERR(svn_io_read_length_line(file, buf, &len, pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+ if (SVN_STR_TO_REV(buf) != (MAX_REV / SHARD_SIZE) * SHARD_SIZE)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Bad '%s' contents", PATH_MIN_UNPACKED_REV);
+
+ /* Finally, make sure the final revision directory does exist. */
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs",
+ apr_psprintf(pool, "%d", (i / SHARD_SIZE) + 1),
+ SVN_VA_NULL);
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+ if (kind != svn_node_none)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Expected directory '%s' not found", path);
+
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsfs-pack-even"
+#define SHARD_SIZE 4
+#define MAX_REV 11
+static svn_error_t *
+pack_even_filesystem(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_node_kind_t kind;
+ const char *path;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
+
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs", "2.pack", SVN_VA_NULL);
+ SVN_ERR(svn_io_check_path(path, &kind, pool));
+ if (kind != svn_node_dir)
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Packing did not complete as expected");
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-read-packed-fs"
+#define SHARD_SIZE 5
+#define MAX_REV 11
+static svn_error_t *
+read_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_stream_t *rstream;
+ svn_stringbuf_t *rstring;
+ svn_revnum_t i;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+
+ for (i = 1; i < (MAX_REV + 1); i++)
+ {
+ svn_fs_root_t *rev_root;
+ svn_stringbuf_t *sb;
+
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, i, pool));
+ SVN_ERR(svn_fs_file_contents(&rstream, rev_root, "iota", pool));
+ SVN_ERR(svn_test__stream_to_string(&rstring, rstream, pool));
+
+ if (i == 1)
+ sb = svn_stringbuf_create("This is the file 'iota'.\n", pool);
+ else
+ sb = svn_stringbuf_create(get_rev_contents(i, pool), pool);
+
+ if (! svn_stringbuf_compare(rstring, sb))
+ return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
+ "Bad data in revision %ld.", i);
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-commit-packed-fs"
+#define SHARD_SIZE 5
+#define MAX_REV 10
+static svn_error_t *
+commit_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ const char *conflict;
+ svn_revnum_t after_rev;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, 5, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+
+ /* Now do a commit. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "iota",
+ "How much better is it to get wisdom than gold! and to get "
+ "understanding rather to be chosen than silver!", pool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, pool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-get-set-revprop-packed-fs"
+#define SHARD_SIZE 4
+#define MAX_REV 10
+static svn_error_t *
+get_set_revprop_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_string_t *prop_value;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
+ pool));
+
+ /* Try to get revprop for revision 0
+ * (non-packed due to special handling). */
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, 0, SVN_PROP_REVISION_AUTHOR,
+ pool));
+
+ /* Try to change revprop for revision 0
+ * (non-packed due to special handling). */
+ SVN_ERR(svn_fs_change_rev_prop(fs, 0, SVN_PROP_REVISION_AUTHOR,
+ svn_string_create("tweaked-author", pool),
+ pool));
+
+ /* verify */
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, 0, SVN_PROP_REVISION_AUTHOR,
+ pool));
+ SVN_TEST_STRING_ASSERT(prop_value->data, "tweaked-author");
+
+ /* Try to get packed revprop for revision 5. */
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, 5, SVN_PROP_REVISION_AUTHOR,
+ pool));
+
+ /* Try to change packed revprop for revision 5. */
+ SVN_ERR(svn_fs_change_rev_prop(fs, 5, SVN_PROP_REVISION_AUTHOR,
+ svn_string_create("tweaked-author2", pool),
+ pool));
+
+ /* verify */
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, 5, SVN_PROP_REVISION_AUTHOR,
+ pool));
+ SVN_TEST_STRING_ASSERT(prop_value->data, "tweaked-author2");
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-get-set-large-revprop-packed-fs"
+#define SHARD_SIZE 4
+#define MAX_REV 11
+static svn_error_t *
+get_set_large_revprop_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_string_t *prop_value;
+ svn_revnum_t rev;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
+ pool));
+
+ /* Set commit messages to different, large values that fill the pack
+ * files but do not exceed the pack size limit. */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ SVN_ERR(svn_fs_change_rev_prop(fs, rev, SVN_PROP_REVISION_LOG,
+ large_log(rev, 1000, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ large_log(rev, 1000, pool)->data);
+ }
+
+ /* Put a larger revprop into the last, some middle and the first revision
+ * of a pack. This should cause the packs to split in the middle. */
+ SVN_ERR(svn_fs_change_rev_prop(fs, 3, SVN_PROP_REVISION_LOG,
+ /* rev 0 is not packed */
+ large_log(3, 2400, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 5, SVN_PROP_REVISION_LOG,
+ large_log(5, 1500, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 8, SVN_PROP_REVISION_LOG,
+ large_log(8, 1500, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+
+ if (rev == 3)
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ large_log(rev, 2400, pool)->data);
+ else if (rev == 5 || rev == 8)
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ large_log(rev, 1500, pool)->data);
+ else
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ large_log(rev, 1000, pool)->data);
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-get-set-huge-revprop-packed-fs"
+#define SHARD_SIZE 4
+#define MAX_REV 10
+static svn_error_t *
+get_set_huge_revprop_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_string_t *prop_value;
+ svn_revnum_t rev;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
+ pool));
+
+ /* Set commit messages to different values */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ SVN_ERR(svn_fs_change_rev_prop(fs, rev, SVN_PROP_REVISION_LOG,
+ default_log(rev, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+ SVN_TEST_STRING_ASSERT(prop_value->data, default_log(rev, pool)->data);
+ }
+
+ /* Put a huge revprop into the last, some middle and the first revision
+ * of a pack. They will cause the pack files to split accordingly. */
+ SVN_ERR(svn_fs_change_rev_prop(fs, 3, SVN_PROP_REVISION_LOG,
+ huge_log(3, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 5, SVN_PROP_REVISION_LOG,
+ huge_log(5, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 8, SVN_PROP_REVISION_LOG,
+ huge_log(8, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+
+ if (rev == 3 || rev == 5 || rev == 8)
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ huge_log(rev, pool)->data);
+ else
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ default_log(rev, pool)->data);
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+/* Regression test for issue #3571 (fsfs 'svnadmin recover' expects
+ youngest revprop to be outside revprops.db). */
+#define REPO_NAME "test-repo-recover-fully-packed"
+#define SHARD_SIZE 4
+#define MAX_REV 7
+static svn_error_t *
+recover_fully_packed(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_pool_t *subpool;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ const char *conflict;
+ svn_revnum_t after_rev;
+ svn_error_t *err;
+
+ /* Create a packed FS for which every revision will live in a pack
+ digest file, and then recover it. */
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
+ SVN_ERR(svn_fs_recover(REPO_NAME, NULL, NULL, pool));
+
+ /* Add another revision, re-pack, re-recover. */
+ subpool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, subpool, subpool));
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "A/mu", "new-mu", subpool));
+ SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+ svn_pool_destroy(subpool);
+ SVN_ERR(svn_fs_pack(REPO_NAME, NULL, NULL, NULL, NULL, pool));
+ SVN_ERR(svn_fs_recover(REPO_NAME, NULL, NULL, pool));
+
+ /* Now, delete the youngest revprop file, and recover again. This
+ time we want to see an error! */
+ SVN_ERR(svn_io_remove_file2(
+ svn_dirent_join_many(pool, REPO_NAME, PATH_REVPROPS_DIR,
+ apr_psprintf(pool, "%ld/%ld",
+ after_rev / SHARD_SIZE,
+ after_rev),
+ SVN_VA_NULL),
+ FALSE, pool));
+ err = svn_fs_recover(REPO_NAME, NULL, NULL, pool);
+ if (! err)
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "Expected SVN_ERR_FS_CORRUPT error; got none");
+ if (err->apr_err != SVN_ERR_FS_CORRUPT)
+ return svn_error_create(SVN_ERR_TEST_FAILED, err,
+ "Expected SVN_ERR_FS_CORRUPT error; got:");
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+/* Regression test for issue #4320 (fsfs file-hinting fails when reading a rep
+ from the transaction that is commiting rev = SHARD_SIZE). */
+#define REPO_NAME "test-repo-file-hint-at-shard-boundary"
+#define SHARD_SIZE 4
+#define MAX_REV (SHARD_SIZE - 1)
+static svn_error_t *
+file_hint_at_shard_boundary(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_pool_t *subpool;
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ const char *file_contents;
+ svn_stringbuf_t *retrieved_contents;
+ svn_error_t *err = SVN_NO_ERROR;
+
+ /* Create a packed FS and MAX_REV revisions */
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
+
+ /* Reopen the filesystem */
+ subpool = svn_pool_create(pool);
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, subpool, subpool));
+
+ /* Revision = SHARD_SIZE */
+ file_contents = get_rev_contents(SHARD_SIZE, subpool);
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, subpool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "iota", file_contents,
+ subpool));
+
+ /* Retrieve the file. */
+ SVN_ERR(svn_test__get_file_contents(txn_root, "iota", &retrieved_contents,
+ subpool));
+ if (strcmp(retrieved_contents->data, file_contents))
+ {
+ err = svn_error_create(SVN_ERR_TEST_FAILED, err,
+ "Retrieved incorrect contents from iota.");
+ }
+
+ /* Close the repo. */
+ svn_pool_destroy(subpool);
+
+ return err;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsfs-info"
+#define SHARD_SIZE 3
+#define MAX_REV 5
+static svn_error_t *
+test_info(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ const svn_fs_fsfs_info_t *fsfs_info;
+ const svn_fs_info_placeholder_t *info;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
+
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+ SVN_ERR(svn_fs_info(&info, fs, pool, pool));
+ info = svn_fs_info_dup(info, pool, pool);
+
+ SVN_TEST_STRING_ASSERT(opts->fs_type, info->fs_type);
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return SVN_NO_ERROR;
+
+ fsfs_info = (const void *)info;
+ if (opts->server_minor_version && (opts->server_minor_version < 6))
+ {
+ SVN_TEST_ASSERT(fsfs_info->shard_size == 0);
+ SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0);
+ }
+ else
+ {
+ SVN_TEST_ASSERT(fsfs_info->shard_size == SHARD_SIZE);
+ SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev
+ == (MAX_REV + 1) / SHARD_SIZE * SHARD_SIZE);
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsfs-pack-shard-size-one"
+#define SHARD_SIZE 1
+#define MAX_REV 4
+static svn_error_t *
+pack_shard_size_one(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_string_t *propval;
+ svn_fs_t *fs;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+ /* whitebox: revprop packing special-cases r0, which causes
+ (start_rev==1, end_rev==0) in pack_revprops_shard(). So test that. */
+ SVN_ERR(svn_fs_revision_prop(&propval, fs, 1, SVN_PROP_REVISION_LOG, pool));
+ SVN_TEST_STRING_ASSERT(propval->data, R1_LOG_MSG);
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-get_set_multiple_huge_revprops_packed_fs"
+#define SHARD_SIZE 4
+#define MAX_REV 9
+static svn_error_t *
+get_set_multiple_huge_revprops_packed_fs(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_string_t *prop_value;
+ svn_revnum_t rev;
+
+ /* Create the packed FS and open it. */
+ SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
+ pool));
+
+ /* Set commit messages to different values */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ SVN_ERR(svn_fs_change_rev_prop(fs, rev, SVN_PROP_REVISION_LOG,
+ default_log(rev, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+ SVN_TEST_STRING_ASSERT(prop_value->data, default_log(rev, pool)->data);
+ }
+
+ /* Put a huge revprop into revision 1 and 2. */
+ SVN_ERR(svn_fs_change_rev_prop(fs, 1, SVN_PROP_REVISION_LOG,
+ huge_log(1, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 2, SVN_PROP_REVISION_LOG,
+ huge_log(2, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 5, SVN_PROP_REVISION_LOG,
+ huge_log(5, pool),
+ pool));
+ SVN_ERR(svn_fs_change_rev_prop(fs, 6, SVN_PROP_REVISION_LOG,
+ huge_log(6, pool),
+ pool));
+
+ /* verify */
+ for (rev = 0; rev <= MAX_REV; ++rev)
+ {
+ SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
+ SVN_PROP_REVISION_LOG, pool));
+
+ if (rev == 1 || rev == 2 || rev == 5 || rev == 6)
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ huge_log(rev, pool)->data);
+ else
+ SVN_TEST_STRING_ASSERT(prop_value->data,
+ default_log(rev, pool)->data);
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+#define SHARD_SIZE 4
+static svn_error_t *
+upgrade_txns_to_log_addressing(const svn_test_opts_t *opts,
+ const char *repo_name,
+ svn_revnum_t max_rev,
+ svn_boolean_t upgrade_before_txns,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_revnum_t rev;
+ apr_array_header_t *txns;
+ apr_array_header_t *txn_names;
+ int i, k;
+ svn_test_opts_t temp_opts;
+ svn_fs_root_t *root;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ static const char * const paths[SHARD_SIZE][2]
+ = {
+ { "A/mu", "A/B/lambda" },
+ { "A/B/E/alpha", "A/D/H/psi" },
+ { "A/D/gamma", "A/B/E/beta" },
+ { "A/D/G/pi", "A/D/G/rho" }
+ };
+
+ /* Bail (with success) on known-untestable scenarios */
+ if ((strcmp(opts->fs_type, "fsfs") != 0)
+ || (opts->server_minor_version && (opts->server_minor_version < 9)))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't support log addressing");
+
+ /* Create the packed FS in phys addressing format and open it. */
+ temp_opts = *opts;
+ temp_opts.server_minor_version = 8;
+ SVN_ERR(prepare_revprop_repo(&fs, repo_name, max_rev, SHARD_SIZE,
+ &temp_opts, pool));
+
+ if (upgrade_before_txns)
+ {
+ /* upgrade to final repo format (using log addressing) and re-open */
+ SVN_ERR(svn_fs_upgrade2(repo_name, NULL, NULL, NULL, NULL, pool));
+ SVN_ERR(svn_fs_open2(&fs, repo_name, svn_fs_config(fs, pool), pool,
+ pool));
+ }
+
+ /* Create 4 concurrent transactions */
+ txns = apr_array_make(pool, SHARD_SIZE, sizeof(svn_fs_txn_t *));
+ txn_names = apr_array_make(pool, SHARD_SIZE, sizeof(const char *));
+ for (i = 0; i < SHARD_SIZE; ++i)
+ {
+ svn_fs_txn_t *txn;
+ const char *txn_name;
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, max_rev, pool));
+ APR_ARRAY_PUSH(txns, svn_fs_txn_t *) = txn;
+
+ SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
+ APR_ARRAY_PUSH(txn_names, const char *) = txn_name;
+ }
+
+ /* Let all txns touch at least 2 files.
+ * Thus, the addressing data of at least one representation in the txn
+ * will differ between addressing modes. */
+ for (i = 0; i < SHARD_SIZE; ++i)
+ {
+ svn_fs_txn_t *txn = APR_ARRAY_IDX(txns, i, svn_fs_txn_t *);
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+
+ for (k = 0; k < 2; ++k)
+ {
+ svn_stream_t *stream;
+ const char *file_path = paths[i][k];
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_apply_text(&stream, root, file_path, NULL, iterpool));
+ SVN_ERR(svn_stream_printf(stream, iterpool,
+ "This is file %s in txn %d",
+ file_path, i));
+ SVN_ERR(svn_stream_close(stream));
+ }
+ }
+
+ if (!upgrade_before_txns)
+ {
+ /* upgrade to final repo format (using log addressing) and re-open */
+ SVN_ERR(svn_fs_upgrade2(repo_name, NULL, NULL, NULL, NULL, pool));
+ SVN_ERR(svn_fs_open2(&fs, repo_name, svn_fs_config(fs, pool), pool,
+ pool));
+ }
+
+ /* Commit all transactions
+ * (in reverse order to make things more interesting) */
+ for (i = SHARD_SIZE - 1; i >= 0; --i)
+ {
+ svn_fs_txn_t *txn;
+ const char *txn_name = APR_ARRAY_IDX(txn_names, i, const char *);
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_open_txn(&txn, fs, txn_name, iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ }
+
+ /* Further changes to fill the shard */
+
+ SVN_ERR(svn_fs_youngest_rev(&rev, fs, pool));
+ SVN_TEST_ASSERT(rev == SHARD_SIZE + max_rev + 1);
+
+ while ((rev + 1) % SHARD_SIZE)
+ {
+ svn_fs_txn_t *txn;
+ if (rev % SHARD_SIZE == 0)
+ break;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, iterpool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, iterpool));
+ SVN_ERR(svn_test__set_file_contents(root, "iota",
+ get_rev_contents(rev + 1, iterpool),
+ iterpool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, iterpool));
+ }
+
+ /* Make sure to close all file handles etc. from the last iteration */
+
+ svn_pool_clear(iterpool);
+
+ /* Pack repo to verify that old and new shard get packed according to
+ their respective addressing mode */
+
+ SVN_ERR(svn_fs_pack(repo_name, NULL, NULL, NULL, NULL, pool));
+
+ /* verify that our changes got in */
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ for (i = 0; i < SHARD_SIZE; ++i)
+ {
+ for (k = 0; k < 2; ++k)
+ {
+ svn_stream_t *stream;
+ const char *file_path = paths[i][k];
+ svn_string_t *string;
+ const char *expected;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_fs_file_contents(&stream, root, file_path, iterpool));
+ SVN_ERR(svn_string_from_stream(&string, stream, iterpool, iterpool));
+
+ expected = apr_psprintf(pool,"This is file %s in txn %d",
+ file_path, i);
+ SVN_TEST_STRING_ASSERT(string->data, expected);
+ }
+ }
+
+ /* verify that the indexes are consistent, we calculated the correct
+ low-level checksums etc. */
+ SVN_ERR(svn_fs_verify(repo_name, NULL,
+ SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
+ NULL, NULL, NULL, NULL, pool));
+ for (; rev >= 0; --rev)
+ {
+ svn_pool_clear(iterpool);
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, iterpool));
+ SVN_ERR(svn_fs_verify_root(root, iterpool));
+ }
+
+ return SVN_NO_ERROR;
+}
+#undef SHARD_SIZE
+
+#define REPO_NAME "test-repo-upgrade_new_txns_to_log_addressing"
+#define MAX_REV 8
+static svn_error_t *
+upgrade_new_txns_to_log_addressing(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(upgrade_txns_to_log_addressing(opts, REPO_NAME, MAX_REV, TRUE,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-upgrade_old_txns_to_log_addressing"
+#define MAX_REV 8
+static svn_error_t *
+upgrade_old_txns_to_log_addressing(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ SVN_ERR(upgrade_txns_to_log_addressing(opts, REPO_NAME, MAX_REV, FALSE,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-metadata_checksumming"
+static svn_error_t *
+metadata_checksumming(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ const char *repo_path, *r0_path;
+ apr_hash_t *fs_config = apr_hash_make(pool);
+ svn_stringbuf_t *r0;
+ svn_fs_root_t *root;
+ apr_hash_t *dir;
+
+ /* Skip this test unless we are FSFS f7+ */
+ if ((strcmp(opts->fs_type, "fsfs") != 0)
+ || (opts->server_minor_version && (opts->server_minor_version < 9)))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't checksum metadata");
+
+ /* Create the file system to fiddle with. */
+ SVN_ERR(svn_test__create_fs(&fs, REPO_NAME, opts, pool));
+ repo_path = svn_fs_path(fs, pool);
+
+ /* Manipulate the data on disk.
+ * (change id from '0.0.*' to '1.0.*') */
+ r0_path = svn_dirent_join_many(pool, repo_path, "revs", "0", "0",
+ SVN_VA_NULL);
+ SVN_ERR(svn_stringbuf_from_file2(&r0, r0_path, pool));
+ r0->data[21] = '1';
+ SVN_ERR(svn_io_remove_file2(r0_path, FALSE, pool));
+ SVN_ERR(svn_io_file_create_bytes(r0_path, r0->data, r0->len, pool));
+
+ /* Reading the corrupted data on the normal code path triggers no error.
+ * Use a separate namespace to avoid simply reading data from cache. */
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ SVN_ERR(svn_fs_open2(&fs, repo_path, fs_config, pool, pool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, 0, pool));
+ SVN_ERR(svn_fs_dir_entries(&dir, root, "/", pool));
+
+ /* The block-read code path uses the P2L index information and compares
+ * low-level checksums. Again, separate cache namespace. */
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ, "1");
+ SVN_ERR(svn_fs_open2(&fs, repo_path, fs_config, pool, pool));
+ SVN_ERR(svn_fs_revision_root(&root, fs, 0, pool));
+ SVN_TEST_ASSERT_ERROR(svn_fs_dir_entries(&dir, root, "/", pool),
+ SVN_ERR_CHECKSUM_MISMATCH);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-revprop_caching_on_off"
+static svn_error_t *
+revprop_caching_on_off(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs1;
+ svn_fs_t *fs2;
+ apr_hash_t *fs_config;
+ svn_string_t *value;
+ const svn_string_t *another_value_for_avoiding_warnings_from_a_broken_api;
+ const svn_string_t *new_value = svn_string_create("new", pool);
+
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* Open two filesystem objects, enable revision property caching
+ * in one of them. */
+ SVN_ERR(svn_test__create_fs(&fs1, REPO_NAME, opts, pool));
+
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "1");
+
+ SVN_ERR(svn_fs_open2(&fs2, svn_fs_path(fs1, pool), fs_config, pool, pool));
+
+ /* With inefficient named atomics, the filesystem will output a warning
+ and disable the revprop caching, but we still would like to test
+ these cases. Ignore the warning(s). */
+ svn_fs_set_warning_func(fs2, ignore_fs_warnings, NULL);
+
+ SVN_ERR(svn_fs_revision_prop(&value, fs2, 0, "svn:date", pool));
+ another_value_for_avoiding_warnings_from_a_broken_api = value;
+ SVN_ERR(svn_fs_change_rev_prop2(
+ fs1, 0, "svn:date",
+ &another_value_for_avoiding_warnings_from_a_broken_api,
+ new_value, pool));
+
+ /* Expect the change to be visible through both objects.*/
+ SVN_ERR(svn_fs_revision_prop(&value, fs1, 0, "svn:date", pool));
+ SVN_TEST_STRING_ASSERT(value->data, "new");
+
+ SVN_ERR(svn_fs_revision_prop(&value, fs2, 0, "svn:date", pool));
+ SVN_TEST_STRING_ASSERT(value->data, "new");
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+static svn_error_t *
+id_parser_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ #define LONG_MAX_STR #LONG_MAX
+
+ /* Verify the revision number parser (e.g. first element of a txn ID) */
+ svn_fs_fs__id_part_t id_part;
+ SVN_ERR(svn_fs_fs__id_txn_parse(&id_part, "0-0"));
+
+#if LONG_MAX == 2147483647L
+ SVN_ERR(svn_fs_fs__id_txn_parse(&id_part, "2147483647-0"));
+
+ /* Trigger all sorts of overflow conditions. */
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "2147483648-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "21474836470-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "21474836479-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "4294967295-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "4294967296-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "4294967304-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "4294967305-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "42949672950-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "42949672959-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+
+ /* 0x120000000 = 4831838208.
+ * 483183820 < 10*483183820 mod 2^32 = 536870904 */
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "4831838208-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+#else
+ SVN_ERR(svn_fs_fs__id_txn_parse(&id_part, "9223372036854775807-0"));
+
+ /* Trigger all sorts of overflow conditions. */
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "9223372036854775808-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "92233720368547758070-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "92233720368547758079-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "18446744073709551615-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "18446744073709551616-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "18446744073709551624-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "18446744073709551625-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "184467440737095516150-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "184467440737095516159-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+
+ /* 0x12000000000000000 = 20752587082923245568.
+ * 2075258708292324556 < 10*2075258708292324556 mod 2^32 = 2305843009213693944 */
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part,
+ "20752587082923245568-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+#endif
+
+ /* Invalid characters */
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "2e4-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+ SVN_TEST_ASSERT_ERROR(svn_fs_fs__id_txn_parse(&id_part, "2-4-0"),
+ SVN_ERR_FS_MALFORMED_TXN_ID);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-plain_0_length"
+
+static svn_error_t *
+receive_index(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *entries = baton;
+ APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t *)
+ = apr_pmemdup(entries->pool, entry, sizeof(*entry));
+
+ return SVN_NO_ERROR;
+}
+
+static apr_size_t
+stringbuf_find(svn_stringbuf_t *rev_contents,
+ const char *substring)
+{
+ apr_size_t i;
+ apr_size_t len = strlen(substring);
+
+ for (i = 0; i < rev_contents->len - len + 1; ++i)
+ if (!memcmp(rev_contents->data + i, substring, len))
+ return i;
+
+ return APR_SIZE_MAX;
+}
+
+static svn_error_t *
+plain_0_length(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ fs_fs_data_t *ffd;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ svn_revnum_t rev;
+ const char *rev_path;
+ svn_stringbuf_t *rev_contents;
+ apr_hash_t *fs_config;
+ svn_filesize_t file_length;
+ apr_size_t offset;
+
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* Create a repo that does not deltify properties and does not share reps
+ on its own - makes it easier to do that later by hand. */
+ SVN_ERR(svn_test__create_fs(&fs, REPO_NAME, opts, pool));
+ ffd = fs->fsap_data;
+ ffd->deltify_properties = FALSE;
+ ffd->rep_sharing_allowed = FALSE;
+
+ /* Create one file node with matching contents and property reps. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, "foo", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", "END\n", pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "foo", "x", NULL, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Redirect text rep to props rep. */
+ rev_path = svn_fs_fs__path_rev_absolute(fs, rev, pool);
+ SVN_ERR(svn_stringbuf_from_file2(&rev_contents, rev_path, pool));
+
+ offset = stringbuf_find(rev_contents, "id: ");
+ if (offset != APR_SIZE_MAX)
+ {
+ node_revision_t *noderev;
+ svn_stringbuf_t *noderev_str;
+
+ /* Read the noderev. */
+ svn_stream_t *stream = svn_stream_from_stringbuf(rev_contents, pool);
+ SVN_ERR(svn_stream_skip(stream, offset));
+ SVN_ERR(svn_fs_fs__read_noderev(&noderev, stream, pool, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Tweak the DATA_REP. */
+ noderev->data_rep->revision = noderev->prop_rep->revision;
+ noderev->data_rep->item_index = noderev->prop_rep->item_index;
+ noderev->data_rep->size = noderev->prop_rep->size;
+ noderev->data_rep->expanded_size = 0;
+
+ /* Serialize it back. */
+ noderev_str = svn_stringbuf_create_empty(pool);
+ stream = svn_stream_from_stringbuf(noderev_str, pool);
+ SVN_ERR(svn_fs_fs__write_noderev(stream, noderev, ffd->format,
+ svn_fs_fs__fs_supports_mergeinfo(fs),
+ pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ /* Patch the revision contents */
+ memcpy(rev_contents->data + offset, noderev_str->data, noderev_str->len);
+ }
+
+ SVN_ERR(svn_io_write_atomic(rev_path, rev_contents->data,
+ rev_contents->len, NULL, pool));
+
+ if (svn_fs_fs__use_log_addressing(fs))
+ {
+ /* Refresh index data (checksums). */
+ apr_array_header_t *entries = apr_array_make(pool, 4, sizeof(void *));
+ SVN_ERR(svn_fs_fs__dump_index(fs, rev, receive_index, entries,
+ NULL, NULL, pool));
+ SVN_ERR(svn_fs_fs__load_index(fs, rev, entries, pool));
+ }
+
+ /* Create an independent FS instances with separate caches etc. */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, fs_config, pool, pool));
+
+ /* Now, check that we get the correct file length. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ SVN_ERR(svn_fs_file_length(&file_length, root, "foo", pool));
+
+ SVN_TEST_ASSERT(file_length == 4);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-rep_sharing_effectiveness"
+
+static int
+count_substring(svn_stringbuf_t *string,
+ const char *needle)
+{
+ int count = 0;
+ apr_size_t len = strlen(needle);
+ apr_size_t pos;
+
+ for (pos = 0; pos + len <= string->len; ++pos)
+ if (memcmp(string->data + pos, needle, len) == 0)
+ ++count;
+
+ return count;
+}
+
+static svn_error_t *
+count_representations(int *count,
+ svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *rev_contents;
+ const char *rev_path = svn_fs_fs__path_rev_absolute(fs, revision, pool);
+ SVN_ERR(svn_stringbuf_from_file2(&rev_contents, rev_path, pool));
+
+ *count = count_substring(rev_contents, "PLAIN")
+ + count_substring(rev_contents, "DELTA");
+
+ return SVN_NO_ERROR;
+}
+
+/* Repeat string S many times to make it big enough for deltification etc.
+ to kick in. */
+static const char*
+multiply_string(const char *s,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *temp = svn_stringbuf_create(s, pool);
+
+ int i;
+ for (i = 0; i < 7; ++i)
+ svn_stringbuf_insert(temp, temp->len, temp->data, temp->len);
+
+ return temp->data;
+}
+
+static svn_error_t *
+rep_sharing_effectiveness(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ fs_fs_data_t *ffd;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ svn_revnum_t rev;
+ const char *hello_str = multiply_string("Hello, ", pool);
+ const char *world_str = multiply_string("World!", pool);
+ const char *goodbye_str = multiply_string("Goodbye!", pool);
+
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* Create a repo that and explicitly enable rep sharing. */
+ SVN_ERR(svn_test__create_fs(&fs, REPO_NAME, opts, pool));
+
+ ffd = fs->fsap_data;
+ if (ffd->format < SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ ffd->rep_sharing_allowed = TRUE;
+
+ /* Revision 1: create 2 files with different content. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, "foo", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", hello_str, pool));
+ SVN_ERR(svn_fs_make_file(root, "bar", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "bar", world_str, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Revision 2: modify a file to match another file's r1 content and
+ add another with the same content.
+ (classic rep-sharing). */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", world_str, pool));
+ SVN_ERR(svn_fs_make_file(root, "baz", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "baz", hello_str, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Revision 3: modify all files to some new, identical content and add
+ another with the same content.
+ (in-revision rep-sharing). */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", goodbye_str, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "bar", goodbye_str, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "baz", goodbye_str, pool));
+ SVN_ERR(svn_fs_make_file(root, "qux", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "qux", goodbye_str, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Verify revision contents. */
+ {
+ const struct {
+ svn_revnum_t revision;
+ const char *file;
+ const char *contents;
+ } expected[] = {
+ { 1, "foo", "Hello, " },
+ { 1, "bar", "World!" },
+ { 2, "foo", "World!" },
+ { 2, "bar", "World!" },
+ { 2, "baz", "Hello, " },
+ { 3, "foo", "Goodbye!" },
+ { 3, "bar", "Goodbye!" },
+ { 3, "baz", "Goodbye!" },
+ { 3, "qux", "Goodbye!" },
+ { SVN_INVALID_REVNUM, NULL, NULL }
+ };
+
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ for (i = 0; SVN_IS_VALID_REVNUM(expected[i].revision); ++i)
+ {
+ svn_stringbuf_t *str;
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, expected[i].revision,
+ iterpool));
+ SVN_ERR(svn_test__get_file_contents(root, expected[i].file, &str,
+ iterpool));
+
+ SVN_TEST_STRING_ASSERT(str->data,
+ multiply_string(expected[i].contents,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ /* Verify that rep sharing eliminated most reps. */
+ {
+ /* Number of expected representations (including the root directory). */
+ const int expected[] = { 1, 3, 1, 2 } ;
+
+ svn_revnum_t i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ for (i = 0; i <= rev; ++i)
+ {
+ int count;
+ SVN_ERR(count_representations(&count, fs, i, iterpool));
+ SVN_TEST_ASSERT(count == expected[i]);
+ }
+
+ svn_pool_destroy(iterpool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-delta_chain_with_plain"
+
+static svn_error_t *
+delta_chain_with_plain(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ fs_fs_data_t *ffd;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ svn_revnum_t rev;
+ svn_stringbuf_t *prop_value, *contents, *contents2, *hash_rep;
+ int i;
+ apr_hash_t *fs_config, *props;
+
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* Reproducing issue #4577 without the r1676667 fix is much harder in 1.9+
+ * than it was in 1.8. The reason is that 1.9+ won't deltify small reps
+ * nor against small reps. So, we must construct relatively large PLAIN
+ * and DELTA reps.
+ *
+ * The idea is to construct a PLAIN prop rep, make a file share that as
+ * its text rep, grow the file considerably (to make the PLAIN rep later
+ * read beyond EOF) and then replace it entirely with another longish
+ * contents.
+ */
+
+ /* Create a repo that and explicitly enable rep sharing. */
+ SVN_ERR(svn_test__create_fs(&fs, REPO_NAME, opts, pool));
+
+ ffd = fs->fsap_data;
+ if (ffd->format < SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ ffd->rep_sharing_allowed = TRUE;
+
+ /* Make sure all props are stored as PLAIN reps. */
+ ffd->deltify_properties = FALSE;
+
+ /* Construct various content strings.
+ * Note that props need to be shorter than the file contents. */
+ prop_value = svn_stringbuf_create("prop", pool);
+ for (i = 0; i < 10; ++i)
+ svn_stringbuf_appendstr(prop_value, prop_value);
+
+ contents = svn_stringbuf_create("Some text.", pool);
+ for (i = 0; i < 10; ++i)
+ svn_stringbuf_appendstr(contents, contents);
+
+ contents2 = svn_stringbuf_create("Totally new!", pool);
+ for (i = 0; i < 10; ++i)
+ svn_stringbuf_appendstr(contents2, contents2);
+
+ /* Revision 1: create a property rep. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "/", "p",
+ svn_string_create(prop_value->data, pool),
+ pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Revision 2: create a file that shares the text rep with the PLAIN
+ * property rep from r1. */
+ props = apr_hash_make(pool);
+ svn_hash_sets(props, "p", svn_string_create(prop_value->data, pool));
+
+ hash_rep = svn_stringbuf_create_empty(pool);
+ svn_hash_write2(props, svn_stream_from_stringbuf(hash_rep, pool), "END",
+ pool);
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, "foo", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", hash_rep->data, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Revision 3: modify the file contents to a long-ish full text
+ * (~10kByte, longer than the r1 revision file). */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", contents->data, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Revision 4: replace file contents to something disjoint from r3. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_test__set_file_contents(root, "foo", contents2->data, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Getting foo@4 must work. To make sure we actually read from disk,
+ * use a new FS instance with disjoint caches. */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, fs_config, pool, pool));
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ SVN_ERR(svn_test__get_file_contents(root, "foo", &contents, pool));
+ SVN_TEST_STRING_ASSERT(contents->data, contents2->data);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-compare_0_length_rep"
+
+static svn_error_t *
+compare_0_length_rep(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ svn_revnum_t rev;
+ int i, k;
+ apr_hash_t *fs_config;
+
+ /* Test expectations. */
+#define no_rep_file "no-rep"
+#define empty_plain_file "empty-plain"
+#define plain_file "plain"
+#define empty_delta_file "empty-delta"
+#define delta_file "delta"
+
+ enum { COUNT = 5 };
+ const char *file_names[COUNT] = { no_rep_file,
+ empty_delta_file,
+ plain_file,
+ empty_delta_file,
+ delta_file };
+
+ int equal[COUNT][COUNT] = { { 1, 1, 0, 1, 0 },
+ { 1, 1, 0, 1, 0 },
+ { 0, 0, 1, 0, 1 },
+ { 1, 1, 0, 1, 0 },
+ { 0, 0, 1, 0, 1 } };
+
+ /* Well, this club is FSFS only ... */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* We want to check that whether NULL reps, empty PLAIN reps and empty
+ * DELTA reps are all considered equal, yet different from non-empty reps.
+ *
+ * Because we can't create empty PLAIN reps with recent formats anymore,
+ * some format selection & upgrade gymnastics is needed. */
+
+ /* Create a format 1 repository.
+ * This one does not support DELTA reps, so all is PLAIN. */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_4_COMPATIBLE, "x");
+ SVN_ERR(svn_test__create_fs2(&fs, REPO_NAME, opts, fs_config, pool));
+
+ /* Revision 1, create 3 files:
+ * One with no rep, one with an empty rep and a non-empty one. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, no_rep_file, pool));
+ SVN_ERR(svn_fs_make_file(root, empty_plain_file, pool));
+ SVN_ERR(svn_test__set_file_contents(root, empty_plain_file, "", pool));
+ SVN_ERR(svn_fs_make_file(root, plain_file, pool));
+ SVN_ERR(svn_test__set_file_contents(root, plain_file, "x", pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Upgrade the file system format. */
+ SVN_ERR(svn_fs_upgrade2(REPO_NAME, NULL, NULL, NULL, NULL, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+
+ /* Revision 2, create two more files:
+ * a file with an empty DELTA rep and a non-empty one. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, rev, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_file(root, empty_delta_file, pool));
+ SVN_ERR(svn_test__set_file_contents(root, empty_delta_file, "", pool));
+ SVN_ERR(svn_fs_make_file(root, delta_file, pool));
+ SVN_ERR(svn_test__set_file_contents(root, delta_file, "x", pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Now compare. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ for (i = 0; i < COUNT; ++i)
+ for (k = 0; k < COUNT; ++k)
+ {
+ svn_boolean_t different;
+ SVN_ERR(svn_fs_contents_different(&different, root, file_names[i],
+ root, file_names[k], pool));
+ SVN_TEST_ASSERT(different != equal[i][k]);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+/* Verify that the format 7 pack logic works even if we can't fit all index
+ metadata into memory. */
+#define REPO_NAME "test-repo-pack-with-limited-memory"
+#define SHARD_SIZE 4
+#define MAX_REV (2 * SHARD_SIZE - 1)
+static svn_error_t *
+pack_with_limited_memory(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ apr_size_t max_mem;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (opts->server_minor_version && (opts->server_minor_version < 9))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't support reordering packs");
+
+ /* Run with an increasing memory allowance such that we cover all
+ splitting scenarios. */
+ for (max_mem = 350; max_mem < 8000; max_mem += max_mem / 2)
+ {
+ const char *dir;
+ svn_fs_t *fs;
+
+ svn_pool_clear(iterpool);
+
+ /* Create a filesystem. */
+ dir = apr_psprintf(iterpool, "%s-%d", REPO_NAME, (int)max_mem);
+ SVN_ERR(create_non_packed_filesystem(dir, opts, MAX_REV, SHARD_SIZE,
+ iterpool));
+
+ /* Pack it with a narrow memory budget. */
+ SVN_ERR(svn_fs_open2(&fs, dir, NULL, iterpool, iterpool));
+ SVN_ERR(svn_fs_fs__pack(fs, max_mem, NULL, NULL, NULL, NULL,
+ iterpool));
+
+ /* To be sure: Verify that we didn't break the repo. */
+ SVN_ERR(svn_fs_verify(dir, NULL, 0, MAX_REV, NULL, NULL, NULL, NULL,
+ iterpool));
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef MAX_REV
+#undef SHARD_SIZE
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-large_delta_against_plain"
+
+static svn_error_t *
+large_delta_against_plain(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+ fs_fs_data_t *ffd;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ svn_revnum_t rev;
+ svn_stringbuf_t *prop_value;
+ svn_string_t *prop_read;
+ int i;
+ apr_hash_t *fs_config;
+
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+
+ /* Create a repo that and explicitly enable rep sharing. */
+ SVN_ERR(svn_test__create_fs(&fs, REPO_NAME, opts, pool));
+ ffd = fs->fsap_data;
+
+ /* Make sure all props are stored as PLAIN reps. */
+ ffd->deltify_properties = FALSE;
+
+ /* Construct a property larger than 2 txdelta windows. */
+ prop_value = svn_stringbuf_create("prop", pool);
+ while (prop_value->len <= 2 * 102400)
+ svn_stringbuf_appendstr(prop_value, prop_value);
+
+ /* Revision 1: create a property rep. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "/", "p",
+ svn_string_create(prop_value->data, pool),
+ pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Now, store them as DELTA reps. */
+ ffd->deltify_properties = TRUE;
+
+ /* Construct a property larger than 2 txdelta windows, distinct from the
+ * previous one but with a matching "tail". */
+ prop_value = svn_stringbuf_create("blob", pool);
+ while (prop_value->len <= 2 * 102400)
+ svn_stringbuf_appendstr(prop_value, prop_value);
+ for (i = 0; i < 100; ++i)
+ svn_stringbuf_appendcstr(prop_value, "prop");
+
+ /* Revision 2: modify the property. */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 1, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(root, "/", "p",
+ svn_string_create(prop_value->data, pool),
+ pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* Reconstructing the property deltified must work. To make sure we
+ * actually read from disk, use a new FS instance with disjoint caches. */
+ fs_config = apr_hash_make(pool);
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
+ svn_uuid_generate(pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, fs_config, pool, pool));
+
+ SVN_ERR(svn_fs_revision_root(&root, fs, rev, pool));
+ SVN_ERR(svn_fs_node_prop(&prop_read, root, "/", "p", pool));
+ SVN_TEST_STRING_ASSERT(prop_read->data, prop_value->data);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+
+
+/* The test table. */
+
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(pack_filesystem,
+ "pack a FSFS filesystem"),
+ SVN_TEST_OPTS_PASS(pack_even_filesystem,
+ "pack FSFS where revs % shard = 0"),
+ SVN_TEST_OPTS_PASS(read_packed_fs,
+ "read from a packed FSFS filesystem"),
+ SVN_TEST_OPTS_PASS(commit_packed_fs,
+ "commit to a packed FSFS filesystem"),
+ SVN_TEST_OPTS_PASS(get_set_revprop_packed_fs,
+ "get/set revprop while packing FSFS filesystem"),
+ SVN_TEST_OPTS_PASS(get_set_large_revprop_packed_fs,
+ "get/set large packed revprops in FSFS"),
+ SVN_TEST_OPTS_PASS(get_set_huge_revprop_packed_fs,
+ "get/set huge packed revprops in FSFS"),
+ SVN_TEST_OPTS_PASS(recover_fully_packed,
+ "recover a fully packed filesystem"),
+ SVN_TEST_OPTS_PASS(file_hint_at_shard_boundary,
+ "test file hint at shard boundary"),
+ SVN_TEST_OPTS_PASS(test_info,
+ "test svn_fs_info"),
+ SVN_TEST_OPTS_PASS(pack_shard_size_one,
+ "test packing with shard size = 1"),
+ SVN_TEST_OPTS_PASS(get_set_multiple_huge_revprops_packed_fs,
+ "set multiple huge revprops in packed FSFS"),
+ SVN_TEST_OPTS_PASS(upgrade_new_txns_to_log_addressing,
+ "upgrade txns to log addressing in shared FSFS"),
+ SVN_TEST_OPTS_PASS(upgrade_old_txns_to_log_addressing,
+ "upgrade txns started before svnadmin upgrade"),
+ SVN_TEST_OPTS_PASS(metadata_checksumming,
+ "metadata checksums being checked"),
+ SVN_TEST_OPTS_PASS(revprop_caching_on_off,
+ "change revprops with enabled and disabled caching"),
+ SVN_TEST_OPTS_PASS(id_parser_test,
+ "id parser test"),
+ SVN_TEST_OPTS_PASS(plain_0_length,
+ "file with 0 expanded-length, issue #4554"),
+ SVN_TEST_OPTS_PASS(rep_sharing_effectiveness,
+ "rep-sharing effectiveness"),
+ SVN_TEST_OPTS_PASS(delta_chain_with_plain,
+ "delta chains starting with PLAIN, issue #4577"),
+ SVN_TEST_OPTS_PASS(compare_0_length_rep,
+ "compare empty PLAIN and non-existent reps"),
+ SVN_TEST_OPTS_PASS(pack_with_limited_memory,
+ "pack with limited memory for metadata"),
+ SVN_TEST_OPTS_PASS(large_delta_against_plain,
+ "large deltas against PLAIN, issue #4658"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_fs/fs-fs-private-test.c b/subversion/tests/libsvn_fs_fs/fs-fs-private-test.c
new file mode 100644
index 0000000..a1447ee
--- /dev/null
+++ b/subversion/tests/libsvn_fs_fs/fs-fs-private-test.c
@@ -0,0 +1,434 @@
+/* fs-fs-private-test.c --- tests FSFS's private API
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "../svn_test.h"
+
+#include "svn_hash.h"
+#include "svn_pools.h"
+#include "svn_props.h"
+#include "svn_fs.h"
+
+#include "private/svn_string_private.h"
+#include "private/svn_fs_fs_private.h"
+#include "private/svn_subr_private.h"
+
+#include "../../libsvn_fs_fs/index.h"
+
+#include "../svn_test_fs.h"
+
+
+
+/* Utility functions */
+
+/* Create a repo under REPO_NAME using OPTS. Allocate the repository in
+ * RESULT_POOL and return it in *REPOS. Set *REV to the revision containing
+ * the Greek tree addition. Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+create_greek_repo(svn_repos_t **repos,
+ svn_revnum_t *rev,
+ const svn_test_opts_t *opts,
+ const char *repo_name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_t *fs;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+
+ /* Create a filesystem */
+ SVN_ERR(svn_test__create_repos(repos, repo_name, opts, result_pool));
+ fs = svn_repos_fs(*repos);
+
+ /* Add the Greek tree */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, scratch_pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, scratch_pool));
+ SVN_ERR(svn_test__create_greek_tree(txn_root, scratch_pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, rev, txn, scratch_pool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(*rev));
+
+ return SVN_NO_ERROR;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-get-repo-stats-test"
+
+static svn_error_t *
+verify_representation_stats(const svn_fs_fs__representation_stats_t *stats,
+ apr_uint64_t expected_count)
+{
+ /* Small items, no packing (but inefficiency due to packing attempt). */
+ SVN_TEST_ASSERT(stats->total.count == expected_count);
+ SVN_TEST_ASSERT( stats->total.packed_size >= 10 * expected_count
+ && stats->total.packed_size <= 1000 * expected_count);
+ SVN_TEST_ASSERT( stats->total.packed_size >= stats->total.expanded_size
+ && stats->total.packed_size <= 2 * stats->total.expanded_size);
+ SVN_TEST_ASSERT( stats->total.overhead_size >= 5 * expected_count
+ && stats->total.overhead_size <= 100 * expected_count);
+
+ /* Rep sharing has no effect on the Greek tree. */
+ SVN_TEST_ASSERT(stats->total.count == stats->uniques.count);
+ SVN_TEST_ASSERT(stats->total.packed_size == stats->uniques.packed_size);
+ SVN_TEST_ASSERT(stats->total.expanded_size == stats->uniques.expanded_size);
+ SVN_TEST_ASSERT(stats->total.overhead_size == stats->uniques.overhead_size);
+
+ SVN_TEST_ASSERT(stats->shared.count == 0);
+ SVN_TEST_ASSERT(stats->shared.packed_size == 0);
+ SVN_TEST_ASSERT(stats->shared.expanded_size == 0);
+ SVN_TEST_ASSERT(stats->shared.overhead_size == 0);
+
+ /* No rep sharing. */
+ SVN_TEST_ASSERT(stats->references == stats->total.count);
+ SVN_TEST_ASSERT(stats->expanded_size == stats->total.expanded_size);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+verify_node_stats(const svn_fs_fs__node_stats_t *node_stats,
+ apr_uint64_t expected_count)
+{
+ SVN_TEST_ASSERT(node_stats->count == expected_count);
+ SVN_TEST_ASSERT( node_stats->size > 100 * node_stats->count
+ && node_stats->size < 1000 * node_stats->count);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+verify_large_change(const svn_fs_fs__large_change_info_t *change,
+ svn_revnum_t revision)
+{
+ if (change->revision == SVN_INVALID_REVNUM)
+ {
+ /* Unused entry due to the Greek tree being small. */
+ SVN_TEST_ASSERT(change->path->len == 0);
+ SVN_TEST_ASSERT(change->size == 0);
+ }
+ else if (strcmp(change->path->data, "/") == 0)
+ {
+ /* The root folder nodes are always there, i.e. aren't in the
+ * Greek tree "do add" list. */
+ SVN_TEST_ASSERT( SVN_IS_VALID_REVNUM(change->revision)
+ && change->revision <= revision);
+ }
+ else
+ {
+ const struct svn_test__tree_entry_t *node;
+ for (node = svn_test__greek_tree_nodes; node->path; node++)
+ if (strcmp(node->path, change->path->data + 1) == 0)
+ {
+ SVN_TEST_ASSERT(change->revision == revision);
+
+ /* When checking content sizes, keep in mind the optional
+ * SVNDIFF overhead.*/
+ if (node->contents)
+ SVN_TEST_ASSERT( change->size >= strlen(node->contents)
+ && change->size <= 12 + strlen(node->contents));
+
+ return SVN_NO_ERROR;
+ }
+
+ SVN_TEST_ASSERT(!"Change is part of Greek tree");
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+verify_histogram(const svn_fs_fs__histogram_t *histogram)
+{
+ apr_uint64_t sum_count = 0;
+ apr_uint64_t sum_size = 0;
+
+ int i;
+ for (i = 0; i < 64; ++i)
+ {
+ svn_fs_fs__histogram_line_t line = histogram->lines[i];
+
+ if (i > 10 || i < 1)
+ SVN_TEST_ASSERT(line.sum == 0 && line.count == 0);
+ else
+ SVN_TEST_ASSERT( line.sum >= (line.count << (i-1))
+ && line.sum <= (line.count << i));
+
+ sum_count += line.count;
+ sum_size += line.sum;
+ }
+
+ SVN_TEST_ASSERT(histogram->total.count == sum_count);
+ SVN_TEST_ASSERT(histogram->total.sum == sum_size);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+get_repo_stats(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_revnum_t rev;
+ apr_size_t i;
+ svn_fs_fs__stats_t *stats;
+ svn_fs_fs__extension_info_t *extension_info;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ /* Create a filesystem */
+ SVN_ERR(create_greek_repo(&repos, &rev, opts, REPO_NAME, pool, pool));
+
+ /* Gather statistics info on that repo. */
+ SVN_ERR(svn_fs_fs__get_stats(&stats, svn_repos_fs(repos), NULL, NULL,
+ NULL, NULL, pool, pool));
+
+ /* Check that the stats make sense. */
+ SVN_TEST_ASSERT(stats->total_size > 1000 && stats->total_size < 10000);
+ SVN_TEST_ASSERT(stats->revision_count == 2);
+ SVN_TEST_ASSERT(stats->change_count == 20);
+ SVN_TEST_ASSERT(stats->change_len > 500 && stats->change_len < 2000);
+
+ /* Check representation stats. */
+ SVN_ERR(verify_representation_stats(&stats->total_rep_stats, 20));
+ SVN_ERR(verify_representation_stats(&stats->file_rep_stats, 12));
+ SVN_ERR(verify_representation_stats(&stats->dir_rep_stats, 8));
+ SVN_ERR(verify_representation_stats(&stats->file_prop_rep_stats, 0));
+ SVN_ERR(verify_representation_stats(&stats->dir_prop_rep_stats, 0));
+
+ /* Check node stats against rep stats. */
+ SVN_ERR(verify_node_stats(&stats->total_node_stats, 22));
+ SVN_ERR(verify_node_stats(&stats->file_node_stats, 12));
+ SVN_ERR(verify_node_stats(&stats->dir_node_stats, 10));
+
+ /* Check largest changes. */
+ SVN_TEST_ASSERT(stats->largest_changes->count == 64);
+ SVN_TEST_ASSERT(stats->largest_changes->min_size == 0);
+
+ for (i = 0; i < stats->largest_changes->count; ++i)
+ SVN_ERR(verify_large_change(stats->largest_changes->changes[i], rev));
+
+ /* Check histograms. */
+ SVN_ERR(verify_histogram(&stats->rep_size_histogram));
+ SVN_ERR(verify_histogram(&stats->node_size_histogram));
+ SVN_ERR(verify_histogram(&stats->added_rep_size_histogram));
+ SVN_ERR(verify_histogram(&stats->added_node_size_histogram));
+ SVN_ERR(verify_histogram(&stats->unused_rep_histogram));
+ SVN_ERR(verify_histogram(&stats->file_histogram));
+ SVN_ERR(verify_histogram(&stats->file_rep_histogram));
+ SVN_ERR(verify_histogram(&stats->file_prop_histogram));
+ SVN_ERR(verify_histogram(&stats->file_prop_rep_histogram));
+ SVN_ERR(verify_histogram(&stats->dir_histogram));
+ SVN_ERR(verify_histogram(&stats->dir_rep_histogram));
+ SVN_ERR(verify_histogram(&stats->dir_prop_histogram));
+ SVN_ERR(verify_histogram(&stats->dir_prop_rep_histogram));
+
+ /* No file in the Greek tree has an externsion */
+ SVN_TEST_ASSERT(apr_hash_count(stats->by_extension) == 1);
+ extension_info = svn_hash_gets(stats->by_extension, "(none)");
+ SVN_TEST_ASSERT(extension_info);
+
+ SVN_ERR(verify_histogram(&extension_info->rep_histogram));
+ SVN_ERR(verify_histogram(&extension_info->node_histogram));
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+#define REPO_NAME "test-repo-dump-index-test"
+
+typedef struct dump_baton_t
+{
+ /* Number of callback invocations so far */
+ int invocations;
+
+ /* Rev file location we expect to be reported next */
+ apr_off_t offset;
+
+ /* All items must be from this revision. */
+ svn_revnum_t revision;
+
+ /* Track the item numbers we have already seen. */
+ svn_bit_array__t *numbers_seen;
+} dump_baton_t;
+
+static svn_error_t *
+dump_index_entry(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton_p,
+ apr_pool_t *scratch_pool)
+{
+ dump_baton_t *baton = baton_p;
+
+ /* Count invocations. */
+ baton->invocations++;
+
+ /* We expect a report of contiguous non-empty items. */
+ SVN_TEST_ASSERT(entry->offset == baton->offset);
+ SVN_TEST_ASSERT(entry->size > 0 && entry->size < 1000);
+ baton->offset += entry->size;
+
+ /* Type must be valid. */
+ SVN_TEST_ASSERT( entry->type > SVN_FS_FS__ITEM_TYPE_UNUSED
+ && entry->type <= SVN_FS_FS__ITEM_TYPE_CHANGES);
+
+ /* We expect all items to be from the specified revision. */
+ SVN_TEST_ASSERT(entry->item.revision == baton->revision);
+
+ /* Item numnber must be plausibly small and unique. */
+ SVN_TEST_ASSERT(entry->item.number < 100);
+ SVN_TEST_ASSERT(!svn_bit_array__get(baton->numbers_seen,
+ (apr_size_t)entry->item.number));
+ svn_bit_array__set(baton->numbers_seen, (apr_size_t)entry->item.number, 1);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+dump_index(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_revnum_t rev;
+ dump_baton_t baton;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 9))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't have FSFS indexes");
+
+ /* Create a filesystem */
+ SVN_ERR(create_greek_repo(&repos, &rev, opts, REPO_NAME, pool, pool));
+
+ /* Read the index data for REV from that repo. */
+ baton.invocations = 0;
+ baton.offset = 0;
+ baton.revision = rev;
+ baton.numbers_seen = svn_bit_array__create(100, pool);
+ SVN_ERR(svn_fs_fs__dump_index(svn_repos_fs(repos), rev, dump_index_entry,
+ &baton, NULL, NULL, pool));
+
+ /* Check that we've got all data (20 noderevs + 20 reps + 1 changes list). */
+ SVN_TEST_ASSERT(baton.invocations == 41);
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+/* ------------------------------------------------------------------------ */
+
+static svn_error_t *
+receive_index(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ apr_array_header_t *entries = baton;
+ APR_ARRAY_PUSH(entries, svn_fs_fs__p2l_entry_t *)
+ = apr_pmemdup(entries->pool, entry, sizeof(*entry));
+
+ return SVN_NO_ERROR;
+}
+
+#define REPO_NAME "test-repo-load-index-test"
+
+static svn_error_t *
+load_index(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_revnum_t rev;
+ apr_array_header_t *entries = apr_array_make(pool, 41, sizeof(void *));
+ apr_array_header_t *alt_entries = apr_array_make(pool, 1, sizeof(void *));
+ svn_fs_fs__p2l_entry_t entry;
+
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsfs") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSFS repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 9))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't have FSFS indexes");
+
+ /* Create a filesystem */
+ SVN_ERR(create_greek_repo(&repos, &rev, opts, REPO_NAME, pool, pool));
+
+ /* Read the original index contents for REV in ENTRIES. */
+ SVN_ERR(svn_fs_fs__dump_index(svn_repos_fs(repos), rev, receive_index,
+ entries, NULL, NULL, pool));
+
+ /* Replace it with an empty index.
+ * Note that the API requires at least one entry. Give it a dummy. */
+ entry.offset = 0;
+ entry.size = 0;
+ entry.type = SVN_FS_FS__ITEM_TYPE_UNUSED;
+ entry.item.number = SVN_FS_FS__ITEM_INDEX_UNUSED;
+ entry.item.revision = SVN_INVALID_REVNUM;
+ APR_ARRAY_PUSH(alt_entries, svn_fs_fs__p2l_entry_t *) = &entry;
+
+ SVN_ERR(svn_fs_fs__load_index(svn_repos_fs(repos), rev, alt_entries, pool));
+ SVN_TEST_ASSERT_ERROR(svn_repos_verify_fs3(repos, rev, rev, FALSE, FALSE,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, pool),
+ SVN_ERR_FS_INDEX_CORRUPTION);
+
+ /* Restore the original index. */
+ SVN_ERR(svn_fs_fs__load_index(svn_repos_fs(repos), rev, entries, pool));
+ SVN_ERR(svn_repos_verify_fs3(repos, rev, rev, FALSE, FALSE, NULL, NULL,
+ NULL, NULL, NULL, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+#undef REPO_NAME
+
+
+
+/* The test table. */
+
+static int max_threads = 0;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(get_repo_stats,
+ "get statistics on a FSFS filesystem"),
+ SVN_TEST_OPTS_PASS(dump_index,
+ "dump the P2L index"),
+ SVN_TEST_OPTS_PASS(load_index,
+ "load the P2L index"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_fs/fs-pack-test.c b/subversion/tests/libsvn_fs_x/fs-x-pack-test.c
index f0d7650..f85a357 100644
--- a/subversion/tests/libsvn_fs_fs/fs-pack-test.c
+++ b/subversion/tests/libsvn_fs_x/fs-x-pack-test.c
@@ -1,4 +1,4 @@
-/* fs-pack-test.c --- tests for the filesystem
+/* fs-x-pack-test.c --- tests for the FSX filesystem
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -25,7 +25,8 @@
#include <apr_pools.h>
#include "../svn_test.h"
-#include "../../libsvn_fs_fs/fs.h"
+#include "../../libsvn_fs_x/fs.h"
+#include "../../libsvn_fs_x/reps.h"
#include "svn_pools.h"
#include "svn_props.h"
@@ -38,16 +39,6 @@
/*** Helper Functions ***/
-static void
-ignore_fs_warnings(void *baton, svn_error_t *err)
-{
-#ifdef SVN_DEBUG
- SVN_DBG(("Ignoring FS warning %s\n",
- svn_error_symbolic_name(err ? err->apr_err : 0)));
-#endif
- return;
-}
-
/* Write the format number and maximum number of files per directory
to a new format file in PATH, overwriting a previously existing
file. Use POOL for temporary allocation.
@@ -62,36 +53,15 @@ write_format(const char *path,
const char *contents;
path = svn_dirent_join(path, "format", pool);
+ SVN_TEST_ASSERT(max_files_per_dir > 0);
- if (format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
- {
- if (max_files_per_dir)
- contents = apr_psprintf(pool,
- "%d\n"
- "layout sharded %d\n",
- format, max_files_per_dir);
- else
- contents = apr_psprintf(pool,
- "%d\n"
- "layout linear",
- format);
- }
- else
- {
- contents = apr_psprintf(pool, "%d\n", format);
- }
+ contents = apr_psprintf(pool,
+ "%d\n"
+ "layout sharded %d\n",
+ format, max_files_per_dir);
- {
- const char *path_tmp;
-
- SVN_ERR(svn_io_write_unique(&path_tmp,
- svn_dirent_dirname(path, pool),
- contents, strlen(contents),
- svn_io_file_del_none, pool));
-
- /* rename the temp file as the real destination */
- SVN_ERR(svn_io_file_rename(path_tmp, path, pool));
- }
+ SVN_ERR(svn_io_write_atomic(path, contents, strlen(contents),
+ NULL /* copy perms */, pool));
/* And set the perms to make it read only */
return svn_io_set_file_read_only(path, FALSE, pool);
@@ -143,6 +113,8 @@ pack_notify(void *baton,
return SVN_NO_ERROR;
}
+#define R1_LOG_MSG "Let's serf"
+
/* Create a packed filesystem in DIR. Set the shard size to
SHARD_SIZE and create NUM_REVS number of revisions (in addition to
r0). Use POOL for allocations. After this function successfully
@@ -165,6 +137,15 @@ create_packed_filesystem(const char *dir,
apr_pool_t *iterpool;
int version;
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsx") != 0)
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "this will test FSX repositories only");
+
+ if (opts->server_minor_version && (opts->server_minor_version < 9))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "pre-1.9 SVN doesn't support FSX");
+
/* Create a filesystem, then close it */
SVN_ERR(svn_test__create_fs(&fs, dir, opts, subpool));
svn_pool_destroy(subpool);
@@ -178,12 +159,15 @@ create_packed_filesystem(const char *dir,
SVN_ERR(write_format(dir, version, shard_size, subpool));
/* Reopen the filesystem */
- SVN_ERR(svn_fs_open(&fs, dir, NULL, subpool));
+ SVN_ERR(svn_fs_open2(&fs, dir, NULL, subpool, subpool));
/* Revision 1: the Greek tree */
SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool));
SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
SVN_ERR(svn_test__create_greek_tree(txn_root, subpool));
+ SVN_ERR(svn_fs_change_txn_prop(txn, SVN_PROP_REVISION_LOG,
+ svn_string_create(R1_LOG_MSG, pool),
+ pool));
SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool));
SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
@@ -230,7 +214,7 @@ prepare_revprop_repo(svn_fs_t **fs,
/* Create the packed FS and open it. */
SVN_ERR(create_packed_filesystem(repo_name, opts, max_rev, shard_size, pool));
- SVN_ERR(svn_fs_open(fs, repo_name, NULL, pool));
+ SVN_ERR(svn_fs_open2(fs, repo_name, NULL, pool, pool));
subpool = svn_pool_create(pool);
/* Do a commit to trigger packing. */
@@ -285,7 +269,7 @@ huge_log(svn_revnum_t rev, apr_pool_t *pool)
/*** Tests ***/
/* ------------------------------------------------------------------------ */
-#define REPO_NAME "test-repo-fsfs-pack"
+#define REPO_NAME "test-repo-fsx-pack"
#define SHARD_SIZE 7
#define MAX_REV 53
static svn_error_t *
@@ -299,11 +283,6 @@ pack_filesystem(const svn_test_opts_t *opts,
apr_file_t *file;
apr_size_t len;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 6)))
- return SVN_NO_ERROR;
-
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
pool));
@@ -313,27 +292,18 @@ pack_filesystem(const svn_test_opts_t *opts,
{
path = svn_dirent_join_many(pool, REPO_NAME, "revs",
apr_psprintf(pool, "%d.pack", i / SHARD_SIZE),
- "pack", NULL);
+ "pack", SVN_VA_NULL);
- /* These files should exist. */
+ /* This file should exist. */
SVN_ERR(svn_io_check_path(path, &kind, pool));
if (kind != svn_node_file)
return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
"Expected pack file '%s' not found", path);
- path = svn_dirent_join_many(pool, REPO_NAME, "revs",
- apr_psprintf(pool, "%d.pack", i / SHARD_SIZE),
- "manifest", NULL);
- SVN_ERR(svn_io_check_path(path, &kind, pool));
- if (kind != svn_node_file)
- return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
- "Expected manifest file '%s' not found",
- path);
-
/* This directory should not exist. */
path = svn_dirent_join_many(pool, REPO_NAME, "revs",
apr_psprintf(pool, "%d", i / SHARD_SIZE),
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_io_check_path(path, &kind, pool));
if (kind != svn_node_none)
return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
@@ -355,7 +325,7 @@ pack_filesystem(const svn_test_opts_t *opts,
/* Finally, make sure the final revision directory does exist. */
path = svn_dirent_join_many(pool, REPO_NAME, "revs",
apr_psprintf(pool, "%d", (i / SHARD_SIZE) + 1),
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_io_check_path(path, &kind, pool));
if (kind != svn_node_none)
return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
@@ -369,7 +339,7 @@ pack_filesystem(const svn_test_opts_t *opts,
#undef MAX_REV
/* ------------------------------------------------------------------------ */
-#define REPO_NAME "test-repo-fsfs-pack-even"
+#define REPO_NAME "test-repo-fsx-pack-even"
#define SHARD_SIZE 4
#define MAX_REV 11
static svn_error_t *
@@ -379,15 +349,10 @@ pack_even_filesystem(const svn_test_opts_t *opts,
svn_node_kind_t kind;
const char *path;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 6)))
- return SVN_NO_ERROR;
-
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
pool));
- path = svn_dirent_join_many(pool, REPO_NAME, "revs", "2.pack", NULL);
+ path = svn_dirent_join_many(pool, REPO_NAME, "revs", "2.pack", SVN_VA_NULL);
SVN_ERR(svn_io_check_path(path, &kind, pool));
if (kind != svn_node_dir)
return svn_error_createf(SVN_ERR_FS_GENERAL, NULL,
@@ -412,13 +377,8 @@ read_packed_fs(const svn_test_opts_t *opts,
svn_stringbuf_t *rstring;
svn_revnum_t i;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 6)))
- return SVN_NO_ERROR;
-
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
- SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
for (i = 1; i < (MAX_REV + 1); i++)
{
@@ -459,14 +419,9 @@ commit_packed_fs(const svn_test_opts_t *opts,
const char *conflict;
svn_revnum_t after_rev;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 6)))
- return SVN_NO_ERROR;
-
/* Create the packed FS and open it. */
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, 5, pool));
- SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
/* Now do a commit. */
SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, pool));
@@ -494,11 +449,6 @@ get_set_revprop_packed_fs(const svn_test_opts_t *opts,
svn_fs_t *fs;
svn_string_t *prop_value;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 7)))
- return SVN_NO_ERROR;
-
/* Create the packed FS and open it. */
SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
pool));
@@ -551,11 +501,6 @@ get_set_large_revprop_packed_fs(const svn_test_opts_t *opts,
svn_string_t *prop_value;
svn_revnum_t rev;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 7)))
- return SVN_NO_ERROR;
-
/* Create the packed FS and open it. */
SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
pool));
@@ -624,11 +569,6 @@ get_set_huge_revprop_packed_fs(const svn_test_opts_t *opts,
svn_string_t *prop_value;
svn_revnum_t rev;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 7)))
- return SVN_NO_ERROR;
-
/* Create the packed FS and open it. */
SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
pool));
@@ -697,11 +637,6 @@ recover_fully_packed(const svn_test_opts_t *opts,
svn_revnum_t after_rev;
svn_error_t *err;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 7)))
- return SVN_NO_ERROR;
-
/* Create a packed FS for which every revision will live in a pack
digest file, and then recover it. */
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
@@ -709,7 +644,7 @@ recover_fully_packed(const svn_test_opts_t *opts,
/* Add another revision, re-pack, re-recover. */
subpool = svn_pool_create(pool);
- SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, subpool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, subpool, subpool));
SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, subpool));
SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
SVN_ERR(svn_test__set_file_contents(txn_root, "A/mu", "new-mu", subpool));
@@ -726,7 +661,7 @@ recover_fully_packed(const svn_test_opts_t *opts,
apr_psprintf(pool, "%ld/%ld",
after_rev / SHARD_SIZE,
after_rev),
- NULL),
+ SVN_VA_NULL),
FALSE, pool));
err = svn_fs_recover(REPO_NAME, NULL, NULL, pool);
if (! err)
@@ -760,17 +695,12 @@ file_hint_at_shard_boundary(const svn_test_opts_t *opts,
svn_stringbuf_t *retrieved_contents;
svn_error_t *err = SVN_NO_ERROR;
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 8)))
- return SVN_NO_ERROR;
-
/* Create a packed FS and MAX_REV revisions */
SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE, pool));
/* Reopen the filesystem */
subpool = svn_pool_create(pool);
- SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, subpool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, subpool, subpool));
/* Revision = SHARD_SIZE */
file_contents = get_rev_contents(SHARD_SIZE, subpool);
@@ -798,153 +728,155 @@ file_hint_at_shard_boundary(const svn_test_opts_t *opts,
#undef SHARD_SIZE
/* ------------------------------------------------------------------------ */
-#define REPO_NAME "get_set_multiple_huge_revprops_packed_fs"
-#define SHARD_SIZE 4
-#define MAX_REV 9
+#define REPO_NAME "test-repo-fsx-info"
+#define SHARD_SIZE 3
+#define MAX_REV 5
static svn_error_t *
-get_set_multiple_huge_revprops_packed_fs(const svn_test_opts_t *opts,
- apr_pool_t *pool)
+test_info(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_fs_t *fs;
- svn_string_t *prop_value;
- svn_revnum_t rev;
-
- /* Bail (with success) on known-untestable scenarios */
- if ((strcmp(opts->fs_type, "fsfs") != 0)
- || (opts->server_minor_version && (opts->server_minor_version < 7)))
- return SVN_NO_ERROR;
-
- /* Create the packed FS and open it. */
- SVN_ERR(prepare_revprop_repo(&fs, REPO_NAME, MAX_REV, SHARD_SIZE, opts,
- pool));
+ const svn_fs_fsfs_info_t *fsfs_info;
+ const svn_fs_info_placeholder_t *info;
- /* Set commit messages to different values */
- for (rev = 0; rev <= MAX_REV; ++rev)
- SVN_ERR(svn_fs_change_rev_prop(fs, rev, SVN_PROP_REVISION_LOG,
- default_log(rev, pool),
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
pool));
- /* verify */
- for (rev = 0; rev <= MAX_REV; ++rev)
- {
- SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
- SVN_PROP_REVISION_LOG, pool));
- SVN_TEST_STRING_ASSERT(prop_value->data, default_log(rev, pool)->data);
- }
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+ SVN_ERR(svn_fs_info(&info, fs, pool, pool));
+ info = svn_fs_info_dup(info, pool, pool);
- /* Put a huge revprop into revision 1 and 2. */
- SVN_ERR(svn_fs_change_rev_prop(fs, 1, SVN_PROP_REVISION_LOG,
- huge_log(1, pool),
- pool));
- SVN_ERR(svn_fs_change_rev_prop(fs, 2, SVN_PROP_REVISION_LOG,
- huge_log(2, pool),
- pool));
- SVN_ERR(svn_fs_change_rev_prop(fs, 5, SVN_PROP_REVISION_LOG,
- huge_log(5, pool),
- pool));
- SVN_ERR(svn_fs_change_rev_prop(fs, 6, SVN_PROP_REVISION_LOG,
- huge_log(6, pool),
- pool));
+ SVN_TEST_STRING_ASSERT(opts->fs_type, info->fs_type);
- /* verify */
- for (rev = 0; rev <= MAX_REV; ++rev)
- {
- SVN_ERR(svn_fs_revision_prop(&prop_value, fs, rev,
- SVN_PROP_REVISION_LOG, pool));
+ /* Bail (with success) on known-untestable scenarios */
+ if (strcmp(opts->fs_type, "fsx") != 0)
+ return SVN_NO_ERROR;
- if (rev == 1 || rev == 2 || rev == 5 || rev == 6)
- SVN_TEST_STRING_ASSERT(prop_value->data,
- huge_log(rev, pool)->data);
- else
- SVN_TEST_STRING_ASSERT(prop_value->data,
- default_log(rev, pool)->data);
- }
+ fsfs_info = (const void *)info;
+ SVN_TEST_ASSERT(fsfs_info->shard_size == SHARD_SIZE);
+ SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev
+ == (MAX_REV + 1) / SHARD_SIZE * SHARD_SIZE);
return SVN_NO_ERROR;
}
#undef REPO_NAME
-#undef MAX_REV
#undef SHARD_SIZE
+#undef MAX_REV
/* ------------------------------------------------------------------------ */
-
-#define REPO_NAME "revprop_caching_on_off"
+#define REPO_NAME "test-repo-fsx-rev-container"
+#define SHARD_SIZE 3
+#define MAX_REV 5
static svn_error_t *
-revprop_caching_on_off(const svn_test_opts_t *opts,
- apr_pool_t *pool)
+test_reps(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
- svn_fs_t *fs1;
- svn_fs_t *fs2;
- apr_hash_t *fs_config;
- svn_string_t *value;
- const svn_string_t *another_value_for_avoiding_warnings_from_a_broken_api;
- const svn_string_t *new_value = svn_string_create("new", pool);
+ svn_fs_t *fs = NULL;
+ svn_fs_x__reps_builder_t *builder;
+ svn_fs_x__reps_t *container;
+ svn_stringbuf_t *serialized;
+ svn_stream_t *stream;
+ svn_stringbuf_t *contents = svn_stringbuf_create_ensure(10000, pool);
+ int i;
- if (strcmp(opts->fs_type, "fsfs") != 0)
- return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
+ for (i = 0; i < 10000; ++i)
+ {
+ int v, s = 0;
+ for (v = i; v > 0; v /= 10)
+ s += v % 10;
- /* Open two filesystem objects, enable revision property caching
- * in one of them. */
- SVN_ERR(svn_test__create_fs(&fs1, REPO_NAME, opts, pool));
+ svn_stringbuf_appendbyte(contents, (char)(s + ' '));
+ }
- fs_config = apr_hash_make(pool);
- apr_hash_set(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
- APR_HASH_KEY_STRING, "1");
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
- SVN_ERR(svn_fs_open(&fs2, svn_fs_path(fs1, pool), fs_config, pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
- /* With inefficient named atomics, the filesystem will output a warning
- and disable the revprop caching, but we still would like to test
- these cases. Ignore the warning(s). */
- svn_fs_set_warning_func(fs2, ignore_fs_warnings, NULL);
+ builder = svn_fs_x__reps_builder_create(fs, pool);
+ for (i = 10000; i > 10; --i)
+ {
+ apr_size_t idx;
+ svn_string_t string;
+ string.data = contents->data;
+ string.len = i;
- SVN_ERR(svn_fs_revision_prop(&value, fs2, 0, "svn:date", pool));
- another_value_for_avoiding_warnings_from_a_broken_api = value;
- SVN_ERR(svn_fs_change_rev_prop2(
- fs1, 0, "svn:date",
- &another_value_for_avoiding_warnings_from_a_broken_api,
- new_value, pool));
+ SVN_ERR(svn_fs_x__reps_add(&idx, builder, &string));
+ }
- /* Expect the change to be visible through both objects.*/
- SVN_ERR(svn_fs_revision_prop(&value, fs1, 0, "svn:date", pool));
- SVN_TEST_STRING_ASSERT(value->data, "new");
+ serialized = svn_stringbuf_create_empty(pool);
+ stream = svn_stream_from_stringbuf(serialized, pool);
+ SVN_ERR(svn_fs_x__write_reps_container(stream, builder, pool));
- SVN_ERR(svn_fs_revision_prop(&value, fs2, 0, "svn:date", pool));
- SVN_TEST_STRING_ASSERT(value->data, "new");
+ SVN_ERR(svn_stream_reset(stream));
+ SVN_ERR(svn_fs_x__read_reps_container(&container, stream, pool, pool));
+ SVN_ERR(svn_stream_close(stream));
return SVN_NO_ERROR;
}
#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
/* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsx-pack-shard-size-one"
+#define SHARD_SIZE 1
+#define MAX_REV 4
+static svn_error_t *
+pack_shard_size_one(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_string_t *propval;
+ svn_fs_t *fs;
+
+ SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+ pool));
+ SVN_ERR(svn_fs_open2(&fs, REPO_NAME, NULL, pool, pool));
+ /* whitebox: revprop packing special-cases r0, which causes
+ (start_rev==1, end_rev==0) in pack_revprops_shard(). So test that. */
+ SVN_ERR(svn_fs_revision_prop(&propval, fs, 1, SVN_PROP_REVISION_LOG, pool));
+ SVN_TEST_STRING_ASSERT(propval->data, R1_LOG_MSG);
+
+ return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+/* ------------------------------------------------------------------------ */
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(pack_filesystem,
- "pack a FSFS filesystem"),
+ "pack a FSX filesystem"),
SVN_TEST_OPTS_PASS(pack_even_filesystem,
- "pack FSFS where revs % shard = 0"),
+ "pack FSX where revs % shard = 0"),
SVN_TEST_OPTS_PASS(read_packed_fs,
- "read from a packed FSFS filesystem"),
+ "read from a packed FSX filesystem"),
SVN_TEST_OPTS_PASS(commit_packed_fs,
- "commit to a packed FSFS filesystem"),
+ "commit to a packed FSX filesystem"),
SVN_TEST_OPTS_PASS(get_set_revprop_packed_fs,
- "get/set revprop while packing FSFS filesystem"),
+ "get/set revprop while packing FSX filesystem"),
SVN_TEST_OPTS_PASS(get_set_large_revprop_packed_fs,
- "get/set large packed revprops in FSFS"),
+ "get/set large packed revprops in FSX"),
SVN_TEST_OPTS_PASS(get_set_huge_revprop_packed_fs,
- "get/set huge packed revprops in FSFS"),
+ "get/set huge packed revprops in FSX"),
SVN_TEST_OPTS_PASS(recover_fully_packed,
"recover a fully packed filesystem"),
SVN_TEST_OPTS_PASS(file_hint_at_shard_boundary,
"test file hint at shard boundary"),
- SVN_TEST_OPTS_PASS(get_set_multiple_huge_revprops_packed_fs,
- "set multiple huge revprops in packed FSFS"),
- SVN_TEST_OPTS_PASS(revprop_caching_on_off,
- "change revprops with enabled and disabled caching"),
+ SVN_TEST_OPTS_PASS(test_info,
+ "test svn_fs_info"),
+ SVN_TEST_OPTS_PASS(test_reps,
+ "test representations container"),
+ SVN_TEST_OPTS_PASS(pack_shard_size_one,
+ "test packing with shard size = 1"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_fs_x/string-table-test.c b/subversion/tests/libsvn_fs_x/string-table-test.c
new file mode 100644
index 0000000..2633bfa
--- /dev/null
+++ b/subversion/tests/libsvn_fs_x/string-table-test.c
@@ -0,0 +1,318 @@
+/* string-table-test.c --- tests for string tables
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "../svn_test.h"
+#include "../../libsvn_fs_x/string_table.h"
+#include "svn_pools.h"
+#include "svn_sorts.h"
+
+/* Some tests use this list of strings as is. They are all "short strings"
+ * in the terminology of string tables. We use them also as an input to
+ * generate strings of arbitrary length.
+ */
+enum { STRING_COUNT = 12 };
+static const char *basic_strings[STRING_COUNT] =
+ {
+ "some string",
+ "this is another string",
+ "this is a duplicate",
+ "some longer string",
+ "this is a very long string",
+ "and here is another",
+ "this is a duplicate",
+ "/some/path/to/a/dir",
+ "/some/path/to/a/file",
+ "/some/other/dir",
+ "/some/other/file",
+ ""
+ };
+
+/* Generate a string of exactly LEN chars (plus terminating NUL). KEY is
+ * an arbitrary integer that will be transformed into a character sequence
+ * using entries of BASIC_STRINGS. The result will be allocated in POOL.
+ */
+static svn_stringbuf_t *
+generate_string(apr_uint64_t key, apr_size_t len, apr_pool_t *pool)
+{
+ svn_stringbuf_t *result = svn_stringbuf_create_ensure(len, pool);
+ apr_uint64_t temp = key;
+ apr_uint64_t run = 0;
+
+ while (len)
+ {
+ apr_size_t idx;
+ apr_size_t add_len;
+
+ if (temp == 0)
+ {
+ temp = key;
+ run++;
+ }
+
+ idx = (temp + run) % STRING_COUNT;
+ temp /= STRING_COUNT;
+
+ add_len = strlen(basic_strings[idx]);
+ add_len = MIN(len, add_len);
+
+ svn_stringbuf_appendbytes(result, basic_strings[idx], add_len);
+ len -= add_len;
+ }
+
+ return result;
+}
+
+static svn_error_t *
+store_and_load_table(string_table_t **table, apr_pool_t *pool)
+{
+ svn_stringbuf_t *stream_buffer = svn_stringbuf_create_empty(pool);
+ svn_stream_t *stream;
+
+ stream = svn_stream_from_stringbuf(stream_buffer, pool);
+ SVN_ERR(svn_fs_x__write_string_table(stream, *table, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ *table = NULL;
+
+ stream = svn_stream_from_stringbuf(stream_buffer, pool);
+ SVN_ERR(svn_fs_x__read_string_table(table, stream, pool, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+create_empty_table_body(svn_boolean_t do_load_store,
+ apr_pool_t *pool)
+{
+ string_table_builder_t *builder
+ = svn_fs_x__string_table_builder_create(pool);
+ string_table_t *table
+ = svn_fs_x__string_table_create(builder, pool);
+
+ SVN_TEST_STRING_ASSERT(svn_fs_x__string_table_get(table, 0, NULL, pool), "");
+
+ if (do_load_store)
+ SVN_ERR(store_and_load_table(&table, pool));
+
+ SVN_TEST_STRING_ASSERT(svn_fs_x__string_table_get(table, 0, NULL, pool), "");
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+short_string_table_body(svn_boolean_t do_load_store,
+ apr_pool_t *pool)
+{
+ apr_size_t indexes[STRING_COUNT] = { 0 };
+
+ string_table_builder_t *builder;
+ string_table_t *table;
+ int i;
+
+ builder = svn_fs_x__string_table_builder_create(pool);
+ for (i = 0; i < STRING_COUNT; ++i)
+ indexes[i] = svn_fs_x__string_table_builder_add(builder, basic_strings[i], 0);
+
+ table = svn_fs_x__string_table_create(builder, pool);
+ if (do_load_store)
+ SVN_ERR(store_and_load_table(&table, pool));
+
+ SVN_TEST_ASSERT(indexes[2] == indexes[6]);
+ for (i = 0; i < STRING_COUNT; ++i)
+ {
+ apr_size_t len;
+ const char *string
+ = svn_fs_x__string_table_get(table, indexes[i], &len, pool);
+
+ SVN_TEST_STRING_ASSERT(string, basic_strings[i]);
+ SVN_TEST_ASSERT(len == strlen(string));
+ SVN_TEST_ASSERT(len == strlen(basic_strings[i]));
+ }
+
+ SVN_TEST_STRING_ASSERT(svn_fs_x__string_table_get(table, STRING_COUNT,
+ NULL, pool), "");
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+large_string_table_body(svn_boolean_t do_load_store,
+ apr_pool_t *pool)
+{
+ enum { COUNT = 10 };
+
+ svn_stringbuf_t *strings[COUNT] = { 0 };
+ apr_size_t indexes[COUNT] = { 0 };
+
+ string_table_builder_t *builder;
+ string_table_t *table;
+ int i;
+
+ builder = svn_fs_x__string_table_builder_create(pool);
+ for (i = 0; i < COUNT; ++i)
+ {
+ strings[i] = generate_string(APR_UINT64_C(0x1234567876543210) * (i + 1),
+ 73000 + 1000 * i, pool);
+ indexes[i] = svn_fs_x__string_table_builder_add(builder,
+ strings[i]->data,
+ strings[i]->len);
+ }
+
+ table = svn_fs_x__string_table_create(builder, pool);
+ if (do_load_store)
+ SVN_ERR(store_and_load_table(&table, pool));
+
+ for (i = 0; i < COUNT; ++i)
+ {
+ apr_size_t len;
+ const char *string
+ = svn_fs_x__string_table_get(table, indexes[i], &len, pool);
+
+ SVN_TEST_STRING_ASSERT(string, strings[i]->data);
+ SVN_TEST_ASSERT(len == strlen(string));
+ SVN_TEST_ASSERT(len == strings[i]->len);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+many_strings_table_body(svn_boolean_t do_load_store,
+ apr_pool_t *pool)
+{
+ /* cause multiple sub-tables (6 to be exact) to be created */
+ enum { COUNT = 100 };
+
+ svn_stringbuf_t *strings[COUNT] = { 0 };
+ apr_size_t indexes[COUNT] = { 0 };
+
+ string_table_builder_t *builder;
+ string_table_t *table;
+ int i;
+
+ builder = svn_fs_x__string_table_builder_create(pool);
+ for (i = 0; i < COUNT; ++i)
+ {
+ strings[i] = generate_string(APR_UINT64_C(0x1234567876543210) * (i + 1),
+ (i * i) % 23000, pool);
+ indexes[i] = svn_fs_x__string_table_builder_add(builder,
+ strings[i]->data,
+ strings[i]->len);
+ }
+
+ table = svn_fs_x__string_table_create(builder, pool);
+ if (do_load_store)
+ SVN_ERR(store_and_load_table(&table, pool));
+
+ for (i = 0; i < COUNT; ++i)
+ {
+ apr_size_t len;
+ const char *string
+ = svn_fs_x__string_table_get(table, indexes[i], &len, pool);
+
+ SVN_TEST_STRING_ASSERT(string, strings[i]->data);
+ SVN_TEST_ASSERT(len == strlen(string));
+ SVN_TEST_ASSERT(len == strings[i]->len);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+create_empty_table(apr_pool_t *pool)
+{
+ return svn_error_trace(create_empty_table_body(FALSE, pool));
+}
+
+static svn_error_t *
+short_string_table(apr_pool_t *pool)
+{
+ return svn_error_trace(short_string_table_body(FALSE, pool));
+}
+
+static svn_error_t *
+large_string_table(apr_pool_t *pool)
+{
+ return svn_error_trace(large_string_table_body(FALSE, pool));
+}
+
+static svn_error_t *
+many_strings_table(apr_pool_t *pool)
+{
+ return svn_error_trace(many_strings_table_body(FALSE, pool));
+}
+
+static svn_error_t *
+store_load_short_string_table(apr_pool_t *pool)
+{
+ return svn_error_trace(short_string_table_body(TRUE, pool));
+}
+
+static svn_error_t *
+store_load_large_string_table(apr_pool_t *pool)
+{
+ return svn_error_trace(large_string_table_body(TRUE, pool));
+}
+
+static svn_error_t *
+store_load_empty_table(apr_pool_t *pool)
+{
+ return svn_error_trace(create_empty_table_body(TRUE, pool));
+}
+
+static svn_error_t *
+store_load_many_strings_table(apr_pool_t *pool)
+{
+ return svn_error_trace(many_strings_table_body(TRUE, pool));
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/* The test table. */
+
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(create_empty_table,
+ "create an empty string table"),
+ SVN_TEST_PASS2(short_string_table,
+ "string table with short strings only"),
+ SVN_TEST_PASS2(large_string_table,
+ "string table with large strings only"),
+ SVN_TEST_PASS2(many_strings_table,
+ "string table with many strings"),
+ SVN_TEST_PASS2(store_load_empty_table,
+ "store and load an empty string table"),
+ SVN_TEST_PASS2(store_load_short_string_table,
+ "store and load table with short strings only"),
+ SVN_TEST_PASS2(store_load_large_string_table,
+ "store and load table with large strings only"),
+ SVN_TEST_PASS2(store_load_many_strings_table,
+ "store and load string table with many strings"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_ra/ra-test.c b/subversion/tests/libsvn_ra/ra-test.c
index 584da3d..83ac59f 100644
--- a/subversion/tests/libsvn_ra/ra-test.c
+++ b/subversion/tests/libsvn_ra/ra-test.c
@@ -25,7 +25,8 @@
#include <apr_general.h>
#include <apr_pools.h>
-
+#include <apr_file_io.h>
+#include <assert.h>
#define SVN_DEPRECATED
#include "svn_error.h"
@@ -33,6 +34,9 @@
#include "svn_ra.h"
#include "svn_time.h"
#include "svn_pools.h"
+#include "svn_cmdline.h"
+#include "svn_dirent_uri.h"
+#include "svn_hash.h"
#include "../svn_test.h"
#include "../svn_test_fs.h"
@@ -44,23 +48,22 @@
static svn_error_t *
-make_and_open_local_repos(svn_ra_session_t **session,
- const char *repos_name,
- const svn_test_opts_t *opts,
- apr_pool_t *pool)
+make_and_open_repos(svn_ra_session_t **session,
+ const char *repos_name,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
- svn_repos_t *repos;
const char *url;
svn_ra_callbacks2_t *cbtable;
SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+ SVN_ERR(svn_test__init_auth_baton(&cbtable->auth_baton, pool));
- SVN_ERR(svn_test__create_repos(&repos, repos_name, opts, pool));
+ SVN_ERR(svn_test__create_repos2(NULL, &url, NULL, repos_name, opts,
+ pool, pool));
SVN_ERR(svn_ra_initialize(pool));
- SVN_ERR(svn_uri_get_file_url_from_dirent(&url, repos_name, pool));
-
- SVN_ERR(svn_ra_open3(session, url, NULL, cbtable, NULL, NULL, pool));
+ SVN_ERR(svn_ra_open4(session, NULL, url, NULL, cbtable, NULL, NULL, pool));
return SVN_NO_ERROR;
}
@@ -90,6 +93,174 @@ commit_changes(svn_ra_session_t *session,
return SVN_NO_ERROR;
}
+static svn_error_t *
+commit_tree(svn_ra_session_t *session,
+ apr_pool_t *pool)
+{
+ apr_hash_t *revprop_table = apr_hash_make(pool);
+ const svn_delta_editor_t *editor;
+ void *edit_baton;
+ const char *repos_root_url;
+ void *root_baton, *A_baton, *B_baton, *file_baton;
+
+ SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &edit_baton,
+ revprop_table,
+ NULL, NULL, NULL, TRUE, pool));
+ SVN_ERR(svn_ra_get_repos_root(session, &repos_root_url, pool));
+
+ SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+ pool, &root_baton));
+ SVN_ERR(editor->add_directory("A", root_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &A_baton));
+ SVN_ERR(editor->add_directory("A/B", A_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &B_baton));
+ SVN_ERR(editor->add_file("A/B/f", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->add_file("A/B/g", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->close_directory(B_baton, pool));
+ SVN_ERR(editor->add_directory("A/BB", A_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &B_baton));
+ SVN_ERR(editor->add_file("A/BB/f", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->add_file("A/BB/g", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->close_directory(B_baton, pool));
+ SVN_ERR(editor->close_directory(A_baton, pool));
+ SVN_ERR(editor->close_edit(edit_baton, pool));
+ return SVN_NO_ERROR;
+}
+
+/* Baton for opening tunnels */
+typedef struct tunnel_baton_t
+{
+ int magic; /* TUNNEL_MAGIC */
+ int open_count;
+ svn_boolean_t last_check;
+} tunnel_baton_t;
+
+#define TUNNEL_MAGIC 0xF00DF00F
+
+/* Baton for closing a specific tunnel */
+typedef struct close_baton_t
+{
+ int magic;
+ tunnel_baton_t *tb;
+ apr_proc_t *proc;
+} close_baton_t;
+
+#define CLOSE_MAGIC 0x1BADBAD1
+
+static svn_boolean_t
+check_tunnel(void *tunnel_baton, const char *tunnel_name)
+{
+ tunnel_baton_t *b = tunnel_baton;
+
+ if (b->magic != TUNNEL_MAGIC)
+ abort();
+
+ b->last_check = (0 == strcmp(tunnel_name, "test"));
+ return b->last_check;
+}
+
+static void
+close_tunnel(void *tunnel_context, void *tunnel_baton);
+
+static svn_error_t *
+open_tunnel(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)
+{
+ svn_node_kind_t kind;
+ apr_proc_t *proc;
+ apr_procattr_t *attr;
+ apr_status_t status;
+ const char *args[] = { "svnserve", "-t", "-r", ".", NULL };
+ const char *svnserve;
+ tunnel_baton_t *b = tunnel_baton;
+ close_baton_t *cb;
+
+ SVN_TEST_ASSERT(b->magic == TUNNEL_MAGIC);
+
+ SVN_ERR(svn_dirent_get_absolute(&svnserve, "../../svnserve/svnserve", pool));
+#ifdef WIN32
+ svnserve = apr_pstrcat(pool, svnserve, ".exe", SVN_VA_NULL);
+#endif
+ SVN_ERR(svn_io_check_path(svnserve, &kind, pool));
+ if (kind != svn_node_file)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Could not find svnserve at %s",
+ svn_dirent_local_style(svnserve, pool));
+
+ status = apr_procattr_create(&attr, pool);
+ if (status == APR_SUCCESS)
+ status = apr_procattr_io_set(attr, 1, 1, 0);
+ if (status == APR_SUCCESS)
+ status = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
+ proc = apr_palloc(pool, sizeof(*proc));
+ if (status == APR_SUCCESS)
+ status = apr_proc_create(proc,
+ svn_dirent_local_style(svnserve, pool),
+ args, NULL, attr, pool);
+ if (status != APR_SUCCESS)
+ return svn_error_wrap_apr(status, "Could not run svnserve");
+ apr_pool_note_subprocess(pool, proc, APR_KILL_NEVER);
+
+ /* APR pipe objects inherit by default. But we don't want the
+ * tunnel agent's pipes held open by future child processes
+ * (such as other ra_svn sessions), so turn that off. */
+ apr_file_inherit_unset(proc->in);
+ apr_file_inherit_unset(proc->out);
+
+ cb = apr_pcalloc(pool, sizeof(*cb));
+ cb->magic = CLOSE_MAGIC;
+ cb->tb = b;
+ cb->proc = proc;
+
+ *request = svn_stream_from_aprfile2(proc->in, FALSE, pool);
+ *response = svn_stream_from_aprfile2(proc->out, FALSE, pool);
+ *close_func = close_tunnel;
+ *close_baton = cb;
+ ++b->open_count;
+ return SVN_NO_ERROR;
+}
+
+static void
+close_tunnel(void *tunnel_context, void *tunnel_baton)
+{
+ close_baton_t *b = tunnel_context;
+
+ if (b->magic != CLOSE_MAGIC)
+ abort();
+ if (--b->tb->open_count == 0)
+ {
+ apr_status_t child_exit_status;
+ int child_exit_code;
+ apr_exit_why_e child_exit_why;
+
+ SVN_TEST_ASSERT_NO_RETURN(0 == apr_file_close(b->proc->in));
+ SVN_TEST_ASSERT_NO_RETURN(0 == apr_file_close(b->proc->out));
+
+ child_exit_status =
+ apr_proc_wait(b->proc, &child_exit_code, &child_exit_why, APR_WAIT);
+
+ SVN_TEST_ASSERT_NO_RETURN(child_exit_status == APR_CHILD_DONE);
+ SVN_TEST_ASSERT_NO_RETURN(child_exit_code == 0);
+ SVN_TEST_ASSERT_NO_RETURN(child_exit_why == APR_PROC_EXIT);
+ }
+}
+
+
+
+
/*-------------------------------------------------------------------*/
/** The tests **/
@@ -130,9 +301,9 @@ location_segments_test(const svn_test_opts_t *opts,
b.segments = segments;
b.pool = pool;
- SVN_ERR(make_and_open_local_repos(&session,
- "test-repo-locsegs", opts,
- pool));
+ SVN_ERR(make_and_open_repos(&session,
+ "test-repo-locsegs", opts,
+ pool));
/* ### This currently tests only a small subset of what's possible. */
SVN_ERR(commit_changes(session, pool));
@@ -153,6 +324,294 @@ location_segments_test(const svn_test_opts_t *opts,
}
+/* Test ra_svn tunnel callbacks. */
+
+static svn_error_t *
+check_tunnel_callback_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ tunnel_baton_t *b = apr_pcalloc(pool, sizeof(*b));
+ svn_ra_callbacks2_t *cbtable;
+ svn_ra_session_t *session;
+
+ b->magic = TUNNEL_MAGIC;
+
+ SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+ cbtable->check_tunnel_func = check_tunnel;
+ cbtable->open_tunnel_func = open_tunnel;
+ cbtable->tunnel_baton = b;
+ SVN_ERR(svn_cmdline_create_auth_baton(&cbtable->auth_baton,
+ TRUE /* non_interactive */,
+ "jrandom", "rayjandom",
+ NULL,
+ TRUE /* no_auth_cache */,
+ FALSE /* trust_server_cert */,
+ NULL, NULL, NULL, pool));
+
+ b->last_check = TRUE;
+ SVN_TEST_ASSERT_ERROR(svn_ra_open4(&session, NULL,
+ "svn+foo://localhost/no-repo",
+ NULL, cbtable, NULL, NULL, pool),
+ SVN_ERR_RA_CANNOT_CREATE_SESSION);
+ SVN_TEST_ASSERT(!b->last_check);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+tunnel_callback_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ tunnel_baton_t *b = apr_pcalloc(pool, sizeof(*b));
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ const char *url;
+ svn_ra_callbacks2_t *cbtable;
+ svn_ra_session_t *session;
+ const char tunnel_repos_name[] = "test-repo-tunnel";
+
+ b->magic = TUNNEL_MAGIC;
+
+ SVN_ERR(svn_test__create_repos(NULL, tunnel_repos_name, opts, scratch_pool));
+
+ /* Immediately close the repository to avoid race condition with svnserve
+ (and then the cleanup code) with BDB when our pool is cleared. */
+ svn_pool_clear(scratch_pool);
+
+ url = apr_pstrcat(pool, "svn+test://localhost/", tunnel_repos_name,
+ SVN_VA_NULL);
+ SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+ cbtable->check_tunnel_func = check_tunnel;
+ cbtable->open_tunnel_func = open_tunnel;
+ cbtable->tunnel_baton = b;
+ SVN_ERR(svn_cmdline_create_auth_baton(&cbtable->auth_baton,
+ TRUE /* non_interactive */,
+ "jrandom", "rayjandom",
+ NULL,
+ TRUE /* no_auth_cache */,
+ FALSE /* trust_server_cert */,
+ NULL, NULL, NULL, pool));
+
+ b->last_check = FALSE;
+ SVN_ERR(svn_ra_open4(&session, NULL, url, NULL, cbtable, NULL, NULL,
+ scratch_pool));
+ SVN_TEST_ASSERT(b->last_check);
+ SVN_TEST_ASSERT(b->open_count > 0);
+ svn_pool_destroy(scratch_pool);
+ SVN_TEST_ASSERT(b->open_count == 0);
+ return SVN_NO_ERROR;
+}
+
+struct lock_result_t {
+ svn_lock_t *lock;
+ svn_error_t *err;
+};
+
+struct lock_baton_t {
+ apr_hash_t *results;
+ apr_pool_t *pool;
+};
+
+/* Implements svn_ra_lock_callback_t. */
+static svn_error_t *
+lock_cb(void *baton,
+ const char *path,
+ svn_boolean_t do_lock,
+ const svn_lock_t *lock,
+ svn_error_t *ra_err,
+ apr_pool_t *pool)
+{
+ struct lock_baton_t *b = baton;
+ struct lock_result_t *result = apr_palloc(b->pool,
+ sizeof(struct lock_result_t));
+
+ if (lock)
+ {
+ result->lock = apr_palloc(b->pool, sizeof(svn_lock_t));
+ *result->lock = *lock;
+ result->lock->path = apr_pstrdup(b->pool, lock->path);
+ result->lock->token = apr_pstrdup(b->pool, lock->token);
+ result->lock->owner = apr_pstrdup(b->pool, lock->owner);
+ result->lock->comment = apr_pstrdup(b->pool, lock->comment);
+ }
+ else
+ result->lock = NULL;
+ result->err = ra_err;
+
+ svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_lock(const char *path,
+ apr_hash_t *results,
+ svn_ra_session_t *session,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && result->lock && !result->err);
+ SVN_ERR(svn_ra_get_lock(session, &lock, path, scratch_pool));
+ SVN_TEST_ASSERT(lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_error(const char *path,
+ apr_hash_t *results,
+ svn_ra_session_t *session,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && result->err);
+ SVN_TEST_ASSERT(!result->lock);
+ /* RA layers shouldn't report SVN_ERR_FS_NOT_FOUND */
+ SVN_ERR(svn_ra_get_lock(session, &lock, path, scratch_pool));
+
+ SVN_TEST_ASSERT(!lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_unlock(const char *path,
+ apr_hash_t *results,
+ svn_ra_session_t *session,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && !result->err);
+ SVN_ERR(svn_ra_get_lock(session, &lock, path, scratch_pool));
+ SVN_TEST_ASSERT(!lock);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+expect_unlock_error(const char *path,
+ apr_hash_t *results,
+ svn_ra_session_t *session,
+ apr_pool_t *scratch_pool)
+{
+ svn_lock_t *lock;
+ struct lock_result_t *result = svn_hash_gets(results, path);
+
+ SVN_TEST_ASSERT(result && result->err);
+ SVN_ERR(svn_ra_get_lock(session, &lock, path, scratch_pool));
+ SVN_TEST_ASSERT(lock);
+ return SVN_NO_ERROR;
+}
+
+/* Test svn_ra_lock(). */
+static svn_error_t *
+lock_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_ra_session_t *session;
+ apr_hash_t *lock_targets = apr_hash_make(pool);
+ apr_hash_t *unlock_targets = apr_hash_make(pool);
+ svn_revnum_t rev = 1;
+ struct lock_result_t *result;
+ struct lock_baton_t baton;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(make_and_open_repos(&session, "test-repo-lock", opts, pool));
+ SVN_ERR(commit_tree(session, pool));
+
+ baton.results = apr_hash_make(pool);
+ baton.pool = pool;
+
+ svn_hash_sets(lock_targets, "A/B/f", &rev);
+ svn_hash_sets(lock_targets, "A/B/g", &rev);
+ svn_hash_sets(lock_targets, "A/B/z", &rev);
+ svn_hash_sets(lock_targets, "A/BB/f", &rev);
+ svn_hash_sets(lock_targets, "X/z", &rev);
+
+ /* Lock some paths. */
+ SVN_ERR(svn_ra_lock(session, lock_targets, "foo", FALSE, lock_cb, &baton,
+ pool));
+
+ SVN_ERR(expect_lock("A/B/f", baton.results, session, pool));
+ SVN_ERR(expect_lock("A/B/g", baton.results, session, pool));
+ SVN_ERR(expect_error("A/B/z", baton.results, session, pool));
+ SVN_ERR(expect_lock("A/BB/f", baton.results, session, pool));
+ SVN_ERR(expect_error("X/z", baton.results, session, pool));
+
+ /* Unlock without force and wrong lock tokens */
+ for (hi = apr_hash_first(pool, lock_targets); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_targets, apr_hash_this_key(hi), "wrong-token");
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, FALSE, lock_cb, &baton, pool));
+
+ SVN_ERR(expect_unlock_error("A/B/f", baton.results, session, pool));
+ SVN_ERR(expect_unlock_error("A/B/g", baton.results, session, pool));
+ SVN_ERR(expect_error("A/B/z", baton.results, session, pool));
+ SVN_ERR(expect_unlock_error("A/BB/f", baton.results, session, pool));
+ SVN_ERR(expect_error("X/z", baton.results, session, pool));
+
+ /* Force unlock */
+ for (hi = apr_hash_first(pool, lock_targets); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_targets, apr_hash_this_key(hi), "");
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, TRUE, lock_cb, &baton, pool));
+
+ SVN_ERR(expect_unlock("A/B/f", baton.results, session, pool));
+ SVN_ERR(expect_unlock("A/B/g", baton.results, session, pool));
+ SVN_ERR(expect_error("A/B/z", baton.results, session, pool));
+ SVN_ERR(expect_unlock("A/BB/f", baton.results, session, pool));
+ SVN_ERR(expect_error("X/z", baton.results, session, pool));
+
+ /* Lock again. */
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_lock(session, lock_targets, "foo", FALSE, lock_cb, &baton,
+ pool));
+
+ SVN_ERR(expect_lock("A/B/f", baton.results, session, pool));
+ SVN_ERR(expect_lock("A/B/g", baton.results, session, pool));
+ SVN_ERR(expect_error("A/B/z", baton.results, session, pool));
+ SVN_ERR(expect_lock("A/BB/f", baton.results, session, pool));
+ SVN_ERR(expect_error("X/z", baton.results, session, pool));
+
+ for (hi = apr_hash_first(pool, baton.results); hi; hi = apr_hash_next(hi))
+ {
+ result = apr_hash_this_val(hi);
+ svn_hash_sets(unlock_targets, apr_hash_this_key(hi),
+ result->lock ? result->lock->token : "non-existent-token");
+ }
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, FALSE, lock_cb, &baton, pool));
+
+ SVN_ERR(expect_unlock("A/B/f", baton.results, session, pool));
+ SVN_ERR(expect_unlock("A/B/g", baton.results, session, pool));
+ SVN_ERR(expect_error("A/B/z", baton.results, session, pool));
+ SVN_ERR(expect_unlock("A/BB/f", baton.results, session, pool));
+ SVN_ERR(expect_error("X/z", baton.results, session, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Test svn_ra_get_dir2(). */
+static svn_error_t *
+get_dir_test(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_ra_session_t *session;
+ apr_hash_t *dirents;
+
+ SVN_ERR(make_and_open_repos(&session, "test-get-dir", opts, pool));
+ SVN_ERR(commit_tree(session, pool));
+
+ /* This call used to block on ra-svn for 1.8.0...r1656713 */
+ SVN_TEST_ASSERT_ERROR(svn_ra_get_dir2(session, &dirents, NULL, NULL,
+ "non/existing/relpath", 1,
+ SVN_DIRENT_KIND, pool),
+ SVN_ERR_FS_NOT_FOUND);
+
+ return SVN_NO_ERROR;
+}
+
/* Implements svn_commit_callback2_t for commit_callback_failure() */
static svn_error_t *
commit_callback_with_failure(const svn_commit_info_t *info,
@@ -162,11 +621,11 @@ commit_callback_with_failure(const svn_commit_info_t *info,
apr_time_t timetemp;
SVN_TEST_ASSERT(info != NULL);
- SVN_TEST_STRING_ASSERT(info->author, ""); /* No auth baton supplied. */
+ SVN_TEST_STRING_ASSERT(info->author, "jrandom");
SVN_TEST_STRING_ASSERT(info->post_commit_err, NULL);
SVN_ERR(svn_time_from_cstring(&timetemp, info->date, scratch_pool));
- SVN_TEST_ASSERT(info->date != 0);
+ SVN_TEST_ASSERT(timetemp != 0);
SVN_TEST_ASSERT(info->repos_root != NULL);
SVN_TEST_ASSERT(info->revision == 1);
@@ -181,13 +640,13 @@ commit_callback_failure(const svn_test_opts_t *opts,
const svn_delta_editor_t *editor;
void *edit_baton;
void *root_baton;
- SVN_ERR(make_and_open_local_repos(&ra_session, "commit_cb_failure", opts, pool));
+ SVN_ERR(make_and_open_repos(&ra_session, "commit_cb_failure", opts, pool));
SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,
apr_hash_make(pool), commit_callback_with_failure,
NULL, NULL, FALSE, pool));
- SVN_ERR(editor->open_root(edit_baton, 1, pool, &root_baton));
+ SVN_ERR(editor->open_root(edit_baton, 0, pool, &root_baton));
SVN_ERR(editor->change_dir_prop(root_baton, "A",
svn_string_create("B", pool), pool));
SVN_ERR(editor->close_directory(root_baton, pool));
@@ -200,14 +659,215 @@ commit_callback_failure(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+static svn_error_t *
+base_revision_above_youngest(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_ra_session_t *ra_session;
+ const svn_delta_editor_t *editor;
+ void *edit_baton;
+ void *root_baton;
+ svn_error_t *err;
+ SVN_ERR(make_and_open_repos(&ra_session, "base_revision_above_youngest",
+ opts, pool));
+
+ SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,
+ apr_hash_make(pool), NULL,
+ NULL, NULL, FALSE, pool));
+
+ /* r1 doesn't exist, but we say we want to apply changes against this
+ revision to see how the ra layers behave.
+
+ Some will see an error directly on open_root, others in a later
+ state. */
+
+ /* ra-local and http pre-v2 will see the error here */
+ err = editor->open_root(edit_baton, 1, pool, &root_baton);
+
+ if (!err)
+ err = editor->change_dir_prop(root_baton, "A",
+ svn_string_create("B", pool), pool);
+
+ /* http v2 will notice it here (PROPPATCH) */
+ if (!err)
+ err = editor->close_directory(root_baton, pool);
+
+ /* ra svn only notes it at some later point. Typically here */
+ if (!err)
+ err = editor->close_edit(edit_baton, pool);
+
+ SVN_TEST_ASSERT_ERROR(err,
+ SVN_ERR_FS_NO_SUCH_REVISION);
+
+ SVN_ERR(editor->abort_edit(edit_baton, pool));
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+ra_list_has_props(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_ra_session_t *ra_session;
+ const svn_delta_editor_t *editor;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+ int i;
+ void *edit_baton;
+ const char *trunk_url;
+
+ SVN_ERR(make_and_open_repos(&ra_session, "ra_list_has_props",
+ opts, pool));
+
+ SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,
+ apr_hash_make(pool), NULL,
+ NULL, NULL, FALSE, iterpool));
+
+ /* Create initial layout*/
+ {
+ void *root_baton;
+ void *dir_baton;
+
+ SVN_ERR(editor->open_root(edit_baton, 0, pool, &root_baton));
+ SVN_ERR(editor->add_directory("trunk", root_baton, NULL, SVN_INVALID_REVNUM,
+ iterpool, &dir_baton));
+ SVN_ERR(editor->close_directory(dir_baton, iterpool));
+ SVN_ERR(editor->add_directory("tags", root_baton, NULL, SVN_INVALID_REVNUM,
+ iterpool, &dir_baton));
+ SVN_ERR(editor->close_directory(dir_baton, iterpool));
+ SVN_ERR(editor->close_directory(root_baton, iterpool));
+ SVN_ERR(editor->close_edit(edit_baton, iterpool));
+ }
+
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &trunk_url, pool));
+ trunk_url = svn_path_url_add_component2(trunk_url, "trunk", pool);
+
+ /* Create a few tags. Using a value like 8000 will take too long for a normal
+ testrun, but produces more realistic problems */
+ for (i = 0; i < 50; i++)
+ {
+ void *root_baton;
+ void *tags_baton;
+ void *dir_baton;
+
+ svn_pool_clear(iterpool);
+
+ SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,
+ apr_hash_make(pool), NULL,
+ NULL, NULL, FALSE, iterpool));
+
+ SVN_ERR(editor->open_root(edit_baton, i+1, pool, &root_baton));
+ SVN_ERR(editor->open_directory("tags", root_baton, i+1, iterpool,
+ &tags_baton));
+ SVN_ERR(editor->add_directory(apr_psprintf(iterpool, "tags/T%05d", i+1),
+ tags_baton, trunk_url, 1, iterpool,
+ &dir_baton));
+
+ SVN_ERR(editor->close_directory(dir_baton, iterpool));
+ SVN_ERR(editor->close_directory(tags_baton, iterpool));
+ SVN_ERR(editor->close_directory(root_baton, iterpool));
+ SVN_ERR(editor->close_edit(edit_baton, iterpool));
+ }
+
+ {
+ apr_hash_t *dirents;
+ svn_revnum_t fetched_rev;
+ apr_hash_t *props;
+
+ SVN_ERR(svn_ra_get_dir2(ra_session, &dirents, &fetched_rev, &props,
+ "tags", SVN_INVALID_REVNUM,
+ SVN_DIRENT_ALL, pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Test ra_svn tunnel editor handling, including polling. */
+
+static svn_error_t *
+tunnel_run_checkout(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ tunnel_baton_t *b = apr_pcalloc(pool, sizeof(*b));
+ apr_pool_t *scratch_pool = svn_pool_create(pool);
+ const char *url;
+ svn_ra_callbacks2_t *cbtable;
+ svn_ra_session_t *session;
+ const char tunnel_repos_name[] = "test-run_checkout";
+ const svn_ra_reporter3_t *reporter;
+ void *report_baton;
+
+ b->magic = TUNNEL_MAGIC;
+
+ SVN_ERR(svn_test__create_repos(NULL, tunnel_repos_name, opts, scratch_pool));
+
+ /* Immediately close the repository to avoid race condition with svnserve
+ (and then the cleanup code) with BDB when our pool is cleared. */
+ svn_pool_clear(scratch_pool);
+
+ url = apr_pstrcat(pool, "svn+test://localhost/", tunnel_repos_name,
+ SVN_VA_NULL);
+ SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+ cbtable->check_tunnel_func = check_tunnel;
+ cbtable->open_tunnel_func = open_tunnel;
+ cbtable->tunnel_baton = b;
+ SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
+ TRUE /* non_interactive */,
+ "jrandom", "rayjandom",
+ NULL,
+ TRUE /* no_auth_cache */,
+ FALSE /* trust_server_cert */,
+ FALSE, FALSE, FALSE, FALSE,
+ NULL, NULL, NULL, pool));
+
+ b->last_check = FALSE;
+
+ SVN_ERR(svn_ra_open4(&session, NULL, url, NULL, cbtable, NULL, NULL,
+ scratch_pool));
+
+ SVN_ERR(commit_changes(session, pool));
+
+ SVN_ERR(svn_ra_do_update3(session,
+ &reporter, &report_baton,
+ 1, "",
+ svn_depth_infinity, FALSE, FALSE,
+ svn_delta_default_editor(pool), NULL,
+ pool, pool));
+
+ SVN_ERR(reporter->set_path(report_baton, "", 0, svn_depth_infinity, FALSE,
+ NULL, pool));
+
+ SVN_ERR(reporter->finish_report(report_baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 2;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(location_segments_test,
"test svn_ra_get_location_segments"),
+ SVN_TEST_OPTS_PASS(check_tunnel_callback_test,
+ "test ra_svn tunnel callback check"),
+ SVN_TEST_OPTS_PASS(tunnel_callback_test,
+ "test ra_svn tunnel creation callbacks"),
+ SVN_TEST_OPTS_PASS(lock_test,
+ "lock multiple paths"),
+ SVN_TEST_OPTS_PASS(get_dir_test,
+ "test ra_get_dir2"),
SVN_TEST_OPTS_PASS(commit_callback_failure,
"commit callback failure"),
+ SVN_TEST_OPTS_PASS(base_revision_above_youngest,
+ "base revision newer than youngest"),
+ SVN_TEST_OPTS_PASS(ra_list_has_props,
+ "check list has_props performance"),
+ SVN_TEST_OPTS_PASS(tunnel_run_checkout,
+ "verify checkout over a tunnel"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_ra_local/ra-local-test.c b/subversion/tests/libsvn_ra_local/ra-local-test.c
index fc13ecc..98695bc 100644
--- a/subversion/tests/libsvn_ra_local/ra-local-test.c
+++ b/subversion/tests/libsvn_ra_local/ra-local-test.c
@@ -220,7 +220,7 @@ check_split_url(const char *repos_path,
SVN_ERR(svn_uri_get_file_url_from_dirent(&root_url, repos_path, pool));
if (in_repos_path)
- url = apr_pstrcat(pool, root_url, in_repos_path, (char *)NULL);
+ url = apr_pstrcat(pool, root_url, in_repos_path, SVN_VA_NULL);
else
url = root_url;
@@ -279,7 +279,9 @@ split_url_test(const svn_test_opts_t *opts,
#define HAS_UNC_HOST 0
#endif
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(open_ra_session,
@@ -296,3 +298,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_ra_local__split_URL correctness"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_repos/dir-delta-editor.h b/subversion/tests/libsvn_repos/dir-delta-editor.h
index 5e7e280..5c498f8 100644
--- a/subversion/tests/libsvn_repos/dir-delta-editor.h
+++ b/subversion/tests/libsvn_repos/dir-delta-editor.h
@@ -40,7 +40,18 @@
extern "C" {
#endif /* __cplusplus */
-
+
+/* Get an editor that will edit an FS transaction via the libsvn_fs API.
+ *
+ * Set *EDITOR and *EDIT_BATON to a new editor that edits the subtree at
+ * PATH of the existing, open transaction TXN_ROOT in filesystem FS.
+ *
+ * Note: Related but more complex functions in the regular API include
+ * svn_fs__editor_create_for() and svn_repos_get_commit_editor*().
+ *
+ * Note: The only connection with dir-deltas is that a test for dir-deltas
+ * was the first user of this editor.
+ */
svn_error_t *
dir_delta_get_editor(const svn_delta_editor_t **editor,
void **edit_baton,
diff --git a/subversion/tests/libsvn_repos/dump-load-test.c b/subversion/tests/libsvn_repos/dump-load-test.c
new file mode 100644
index 0000000..3b6118d
--- /dev/null
+++ b/subversion/tests/libsvn_repos/dump-load-test.c
@@ -0,0 +1,289 @@
+/* dump-load-test.c --- tests for dumping and loading repositories
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_fs.h"
+#include "svn_repos.h"
+#include "private/svn_repos_private.h"
+
+#include "../svn_test.h"
+#include "../svn_test_fs.h"
+
+
+
+/* Test dumping in the presence of the property PROP_NAME:PROP_VAL.
+ * Return the dumped data in *DUMP_DATA_P (if DUMP_DATA_P is not null).
+ * REPOS is an empty repository.
+ * See svn_repos_dump_fs3() for START_REV, END_REV, NOTIFY_FUNC, NOTIFY_BATON.
+ */
+static svn_error_t *
+test_dump_bad_props(svn_stringbuf_t **dump_data_p,
+ svn_repos_t *repos,
+ const char *prop_name,
+ const svn_string_t *prop_val,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *pool)
+{
+ const char *test_path = "/bar";
+ svn_fs_t *fs = svn_repos_fs(repos);
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ svn_revnum_t youngest_rev = 0;
+ svn_stringbuf_t *dump_data = svn_stringbuf_create_empty(pool);
+ svn_stream_t *stream = svn_stream_from_stringbuf(dump_data, pool);
+ const char *expected_str;
+
+ /* Revision 1: Any commit will do, here */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, test_path , pool));
+ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
+
+ /* Revision 2: Add the bad property */
+ SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_change_node_prop(txn_root, test_path , prop_name, prop_val,
+ pool));
+ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
+
+ /* Test that a dump completes without error. */
+ SVN_ERR(svn_repos_dump_fs3(repos, stream, start_rev, end_rev,
+ FALSE, FALSE,
+ notify_func, notify_baton,
+ NULL, NULL,
+ pool));
+ svn_stream_close(stream);
+
+ /* Check that the property appears in the dump data */
+ expected_str = apr_psprintf(pool, "K %d\n%s\n"
+ "V %d\n%s\n"
+ "PROPS-END\n",
+ (int)strlen(prop_name), prop_name,
+ (int)prop_val->len, prop_val->data);
+ SVN_TEST_ASSERT(strstr(dump_data->data, expected_str));
+
+ if (dump_data_p)
+ *dump_data_p = dump_data;
+ return SVN_NO_ERROR;
+}
+
+/* Test loading in the presence of the property PROP_NAME:PROP_VAL.
+ * Load data from DUMP_DATA.
+ * REPOS is an empty repository.
+ */
+static svn_error_t *
+test_load_bad_props(svn_stringbuf_t *dump_data,
+ svn_repos_t *repos,
+ const char *prop_name,
+ const svn_string_t *prop_val,
+ const char *parent_fspath,
+ svn_boolean_t validate_props,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *pool)
+{
+ const char *test_path = apr_psprintf(pool, "%s%s",
+ parent_fspath ? parent_fspath : "",
+ "/bar");
+ svn_stream_t *stream = svn_stream_from_stringbuf(dump_data, pool);
+ svn_fs_t *fs;
+ svn_fs_root_t *rev_root;
+ svn_revnum_t youngest_rev;
+ svn_string_t *loaded_prop_val;
+
+ SVN_ERR(svn_repos_load_fs5(repos, stream,
+ SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
+ svn_repos_load_uuid_default,
+ parent_fspath,
+ FALSE, FALSE, /*use_*_commit_hook*/
+ validate_props,
+ FALSE /*ignore_dates*/,
+ notify_func, notify_baton,
+ NULL, NULL, /*cancellation*/
+ pool));
+ svn_stream_close(stream);
+
+ /* Check the loaded property */
+ fs = svn_repos_fs(repos);
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev, pool));
+ SVN_ERR(svn_fs_node_prop(&loaded_prop_val,
+ rev_root, test_path, prop_name, pool));
+ SVN_TEST_ASSERT(svn_string_compare(loaded_prop_val, prop_val));
+ return SVN_NO_ERROR;
+}
+
+/* Notification receiver for test_dump_r0_mergeinfo(). This does not
+ need to do anything, it just needs to exist.
+ */
+static void
+dump_r0_mergeinfo_notifier(void *baton,
+ const svn_repos_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+}
+
+/* Regression test for the 'dump' part of issue #4476 "Mergeinfo
+ containing r0 makes svnsync and svnadmin dump fail". */
+static svn_error_t *
+test_dump_r0_mergeinfo(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *prop_name = "svn:mergeinfo";
+ const svn_string_t *bad_mergeinfo = svn_string_create("/foo:0", pool);
+ svn_repos_t *repos;
+
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-dump-r0-mergeinfo",
+ opts, pool));
+ /* In order to exercise the
+ functionality under test -- that is, in order for the dump to try to
+ parse the mergeinfo it is dumping -- the dump must start from a
+ revision greater than 1 and must take a notification callback. */
+ SVN_ERR(test_dump_bad_props(NULL, repos,
+ prop_name, bad_mergeinfo,
+ 2, SVN_INVALID_REVNUM,
+ dump_r0_mergeinfo_notifier, NULL,
+ pool));
+
+ return SVN_NO_ERROR;
+}
+
+static void
+load_r0_mergeinfo_notifier(void *baton,
+ const svn_repos_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ svn_boolean_t *had_mergeinfo_warning = baton;
+
+ if (notify->action == svn_repos_notify_warning)
+ {
+ if (notify->warning == svn_repos_notify_warning_invalid_mergeinfo)
+ {
+ *had_mergeinfo_warning = TRUE;
+ }
+ }
+}
+
+/* Regression test for the 'load' part of issue #4476 "Mergeinfo
+ * containing r0 makes svnsync and svnadmin dump fail".
+ *
+ * Bad mergeinfo should not prevent loading a backup, at least when we do not
+ * require mergeinfo revision numbers or paths to be adjusted during loading.
+ */
+static svn_error_t *
+test_load_r0_mergeinfo(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *prop_name = "svn:mergeinfo";
+ const svn_string_t *prop_val = svn_string_create("/foo:0", pool);
+ svn_stringbuf_t *dump_data = svn_stringbuf_create_empty(pool);
+
+ /* Produce a dump file containing bad mergeinfo */
+ {
+ svn_repos_t *repos;
+
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-1",
+ opts, pool));
+ SVN_ERR(test_dump_bad_props(&dump_data, repos,
+ prop_name, prop_val,
+ SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
+ NULL, NULL, pool));
+ }
+
+ /* Test loading without validating properties: should warn and succeed */
+ {
+ svn_repos_t *repos;
+ svn_boolean_t had_mergeinfo_warning = FALSE;
+
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-2",
+ opts, pool));
+
+ /* Without changing revision numbers or paths */
+ SVN_ERR(test_load_bad_props(dump_data, repos,
+ prop_name, prop_val,
+ NULL /*parent_dir*/, FALSE /*validate_props*/,
+ load_r0_mergeinfo_notifier, &had_mergeinfo_warning,
+ pool));
+ SVN_TEST_ASSERT(had_mergeinfo_warning);
+
+ /* With changing revision numbers and/or paths (by loading the same data
+ again, on top of existing revisions, into subdirectory 'bar') */
+ had_mergeinfo_warning = FALSE;
+ SVN_ERR(test_load_bad_props(dump_data, repos,
+ prop_name, prop_val,
+ "/bar", FALSE /*validate_props*/,
+ load_r0_mergeinfo_notifier, &had_mergeinfo_warning,
+ pool));
+ SVN_TEST_ASSERT(had_mergeinfo_warning);
+ }
+
+ /* Test loading with validating properties: should return an error */
+ {
+ svn_repos_t *repos;
+
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-3",
+ opts, pool));
+
+ /* Without changing revision numbers or paths */
+ SVN_TEST_ASSERT_ANY_ERROR(test_load_bad_props(dump_data, repos,
+ prop_name, prop_val,
+ NULL /*parent_dir*/, TRUE /*validate_props*/,
+ NULL, NULL,
+ pool));
+
+ /* With changing revision numbers and/or paths (by loading the same data
+ again, on top of existing revisions, into subdirectory 'bar') */
+ SVN_TEST_ASSERT_ANY_ERROR(test_load_bad_props(dump_data, repos,
+ prop_name, prop_val,
+ "/bar", TRUE /*validate_props*/,
+ NULL, NULL,
+ pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* The test table. */
+
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_OPTS_PASS(test_dump_r0_mergeinfo,
+ "test dumping with r0 mergeinfo"),
+ SVN_TEST_OPTS_PASS(test_load_r0_mergeinfo,
+ "test loading with r0 mergeinfo"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_repos/repos-test.c b/subversion/tests/libsvn_repos/repos-test.c
index 87265f0..8208958 100644
--- a/subversion/tests/libsvn_repos/repos-test.c
+++ b/subversion/tests/libsvn_repos/repos-test.c
@@ -36,13 +36,15 @@
#include "svn_config.h"
#include "svn_props.h"
#include "svn_version.h"
+#include "private/svn_repos_private.h"
+
+/* be able to look into svn_config_t */
+#include "../../libsvn_subr/config_impl.h"
#include "../svn_test_fs.h"
#include "dir-delta-editor.h"
-#include "private/svn_repos_private.h"
-
/* Used to terminate lines in large multi-line string literals. */
#define NL APR_EOL_STR
@@ -486,19 +488,19 @@ print_chrevs(const apr_array_header_t *revs_got,
outstr = apr_pstrcat(pool,
outstr,
apr_psprintf(pool, "%ld ", rev),
- (char *)NULL);
+ SVN_VA_NULL);
}
}
- outstr = apr_pstrcat(pool, outstr, "} Expected: { ", (char *)NULL);
+ outstr = apr_pstrcat(pool, outstr, "} Expected: { ", SVN_VA_NULL);
for (i = 0; i < num_revs_expected; i++)
{
outstr = apr_pstrcat(pool,
outstr,
apr_psprintf(pool, "%ld ",
revs_expected[i]),
- (char *)NULL);
+ SVN_VA_NULL);
}
- return apr_pstrcat(pool, outstr, "}", (char *)NULL);
+ return apr_pstrcat(pool, outstr, "}", SVN_VA_NULL);
}
@@ -1425,8 +1427,8 @@ in_repo_authz(const svn_test_opts_t *opts,
* Create an authz file and put it in the repository.
* Verify it can be read with an relative URL.
* Verify it can be read with an absolute URL.
- * Verify non-existant path does not error out when must_exist is FALSE.
- * Verify non-existant path does error out when must_exist is TRUE.
+ * Verify non-existent path does not error out when must_exist is FALSE.
+ * Verify non-existent path does error out when must_exist is TRUE.
* Verify that an http:// URL produces an error.
* Verify that an svn:// URL produces an error.
*/
@@ -1456,18 +1458,18 @@ in_repo_authz(const svn_test_opts_t *opts,
repos_root = svn_repos_path(repos, pool);
SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_url, repos_root, pool));
- authz_url = apr_pstrcat(pool, repos_url, "/authz", (char *)NULL);
- noent_authz_url = apr_pstrcat(pool, repos_url, "/A/authz", (char *)NULL);
+ authz_url = svn_path_url_add_component2(repos_url, "authz", pool);
+ noent_authz_url = svn_path_url_add_component2(repos_url, "A/authz", pool);
/* absolute file URL. */
SVN_ERR(svn_repos_authz_read2(&authz_cfg, authz_url, NULL, TRUE, pool));
SVN_ERR(authz_check_access(authz_cfg, test_set, pool));
- /* Non-existant path in the repo with must_exist set to FALSE */
+ /* Non-existent path in the repo with must_exist set to FALSE */
SVN_ERR(svn_repos_authz_read2(&authz_cfg, noent_authz_url, NULL,
FALSE, pool));
- /* Non-existant path in the repo with must_exist set to TRUE */
+ /* Non-existent path in the repo with must_exist set to TRUE */
err = svn_repos_authz_read2(&authz_cfg, noent_authz_url, NULL, TRUE, pool);
if (!err || err->apr_err != SVN_ERR_ILLEGAL_TARGET)
return svn_error_createf(SVN_ERR_TEST_FAILED, err,
@@ -1595,15 +1597,14 @@ in_repo_groups_authz(const svn_test_opts_t *opts,
/* Calculate URLs */
repos_root = svn_repos_path(repos, pool);
SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_url, repos_root, pool));
- authz_url = apr_pstrcat(pool, repos_url, "/authz", (char *)NULL);
- empty_authz_url = apr_pstrcat(pool, repos_url, "/empty-authz", (char *)NULL);
- noent_authz_url = apr_pstrcat(pool, repos_url, "/A/authz", (char *)NULL);
- groups_url = apr_pstrcat(pool, repos_url, "/groups", (char *)NULL);
- noent_groups_url = apr_pstrcat(pool, repos_url, "/A/groups", (char *)NULL);
+ authz_url = svn_path_url_add_component2(repos_url, "authz", pool);
+ empty_authz_url = svn_path_url_add_component2(repos_url, "empty-authz", pool);
+ noent_authz_url = svn_path_url_add_component2(repos_url, "A/authz", pool);
+ groups_url = svn_path_url_add_component2(repos_url, "groups", pool);
+ noent_groups_url = svn_path_url_add_component2(repos_url, "A/groups", pool);
/* absolute file URLs. */
- groups_url = apr_pstrcat(pool, repos_url, "/groups", (char *)NULL);
SVN_ERR(svn_repos_authz_read2(&authz_cfg, authz_url, groups_url, TRUE, pool));
SVN_ERR(authz_check_access(authz_cfg, test_set, pool));
@@ -1656,7 +1657,7 @@ in_repo_groups_authz(const svn_test_opts_t *opts,
/* Helper for the groups_authz test. Set *AUTHZ_P to a representation of
- AUTHZ_CONTENTS in conjuction with GROUPS_CONTENTS, using POOL for
+ AUTHZ_CONTENTS in conjunction with GROUPS_CONTENTS, using POOL for
temporary allocation. If DISK is TRUE then write the contents to
temporary files and use svn_repos_authz_read2() to get the data if FALSE
write the data to a buffered stream and use svn_repos_authz_parse(). */
@@ -1771,7 +1772,7 @@ groups_authz(const svn_test_opts_t *opts,
* 2. Verify that access rights written in the global groups file are
* discarded and affect nothing in authorization terms.
* 3. Verify that local groups in the authz file are prohibited in
- * conjuction with global groups (and that a configuration error is
+ * conjunction with global groups (and that a configuration error is
* reported in this scenario).
* 4. Ensure that group cycles in the global groups file are reported.
*
@@ -1827,7 +1828,7 @@ groups_authz(const svn_test_opts_t *opts,
SVN_ERR(authz_check_access(authz_cfg, test_set2, pool));
- /* Local groups cannot be used in conjuction with global groups. */
+ /* Local groups cannot be used in conjunction with global groups. */
groups_contents =
"[groups]" NL
"slaves = maximus" NL
@@ -2460,7 +2461,8 @@ node_location_segments(const svn_test_opts_t *opts,
/* Bail (with success) on known-untestable scenarios */
if ((strcmp(opts->fs_type, "bdb") == 0)
&& (opts->server_minor_version == 4))
- return SVN_NO_ERROR;
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "not supported for BDB in SVN 1.4");
/* Create the repository. */
SVN_ERR(svn_test__create_repos(&repos, "test-repo-node-location-segments",
@@ -2886,7 +2888,7 @@ log_receiver(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
- int *count = baton;
+ svn_revnum_t *count = baton;
(*count)++;
return SVN_NO_ERROR;
}
@@ -2944,13 +2946,18 @@ get_logs(const svn_test_opts_t *opts,
svn_revnum_t end_arg = end ? end : SVN_INVALID_REVNUM;
svn_revnum_t eff_start = start ? start : youngest_rev;
svn_revnum_t eff_end = end ? end : youngest_rev;
- int limit, max_logs =
+ int limit;
+ svn_revnum_t max_logs =
MAX(eff_start, eff_end) + 1 - MIN(eff_start, eff_end);
- int num_logs;
+ svn_revnum_t num_logs;
+ /* this may look like it can get in an infinite loop if max_logs
+ * ended up being larger than the size limit can represent. It
+ * can't because a negative limit will end up failing to match
+ * the existed number of logs. */
for (limit = 0; limit <= max_logs; limit++)
{
- int num_expected = limit ? limit : max_logs;
+ svn_revnum_t num_expected = limit ? limit : max_logs;
svn_pool_clear(subpool);
num_logs = 0;
@@ -2961,9 +2968,9 @@ get_logs(const svn_test_opts_t *opts,
if (num_logs != num_expected)
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"Log with start=%ld,end=%ld,limit=%d "
- "returned %d entries (expected %d)",
+ "returned %ld entries (expected %ld)",
start_arg, end_arg, limit,
- num_logs, max_logs);
+ num_logs, num_expected);
}
}
}
@@ -3059,6 +3066,11 @@ test_get_file_revs(const svn_test_opts_t *opts,
apr_hash_set(ht_reverse_results, &trunk_results[i].rev,
sizeof(svn_revnum_t), &trunk_results[i]);
+ /* Check for feature support */
+ if (opts->server_minor_version && (opts->server_minor_version < 5))
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "not supported in pre-1.5 SVN");
+
/* Create the repository and verify blame results. */
SVN_ERR(svn_test__create_blame_repository(&repos, "test-repo-get-filerevs",
opts, subpool));
@@ -3167,7 +3179,26 @@ test_delete_repos(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
-/* Related to issue 4340, "fs layer should reject filenames with trailing \n" */
+/* Prepare a commit for the filename_with_control_chars() tests */
+static svn_error_t *
+fwcc_prepare(const svn_delta_editor_t **editor_p,
+ void **edit_baton_p,
+ void **root_baton,
+ svn_repos_t *repos,
+ apr_pool_t *scratch_pool)
+{
+ /* Checks for control characters are implemented in the commit editor,
+ * not in the FS API. */
+ SVN_ERR(svn_repos_get_commit_editor4(editor_p, edit_baton_p, repos,
+ NULL, "file://test", "/",
+ "plato", "test commit",
+ dummy_commit_cb, NULL, NULL, NULL,
+ scratch_pool));
+ SVN_ERR((*editor_p)->open_root(*edit_baton_p, 1, scratch_pool, root_baton));
+ return SVN_NO_ERROR;
+}
+
+/* Related to issue 4340, "filenames containing \n corrupt FSFS repositories" */
static svn_error_t *
filename_with_control_chars(const svn_test_opts_t *opts,
apr_pool_t *pool)
@@ -3206,17 +3237,6 @@ filename_with_control_chars(const svn_test_opts_t *opts,
SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
svn_pool_clear(subpool);
- /* Checks for control characters are implemented in the commit editor,
- * not in the FS API. */
- SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
- SVN_ERR(svn_repos_get_commit_editor4(&editor, &edit_baton, repos,
- txn, "file://test", "/",
- "plato", "test commit",
- dummy_commit_cb, NULL, NULL, NULL,
- pool));
-
- SVN_ERR(editor->open_root(edit_baton, 1, pool, &root_baton));
-
/* Attempt to copy /foo to a bad path P. This should fail. */
i = 0;
do
@@ -3225,8 +3245,13 @@ filename_with_control_chars(const svn_test_opts_t *opts,
if (p == NULL)
break;
svn_pool_clear(subpool);
+
+ SVN_ERR(fwcc_prepare(&editor, &edit_baton, &root_baton, repos, subpool));
err = editor->add_directory(p, root_baton, "/foo", 1, subpool,
&out_baton);
+ if (!err)
+ err = editor->close_edit(edit_baton, subpool);
+ svn_error_clear(editor->abort_edit(edit_baton, subpool));
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
} while (p);
@@ -3238,8 +3263,13 @@ filename_with_control_chars(const svn_test_opts_t *opts,
if (p == NULL)
break;
svn_pool_clear(subpool);
+
+ SVN_ERR(fwcc_prepare(&editor, &edit_baton, &root_baton, repos, subpool));
err = editor->add_file(p, root_baton, NULL, SVN_INVALID_REVNUM,
subpool, &out_baton);
+ if (!err)
+ err = editor->close_edit(edit_baton, subpool);
+ svn_error_clear(editor->abort_edit(edit_baton, subpool));
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
} while (p);
@@ -3252,281 +3282,576 @@ filename_with_control_chars(const svn_test_opts_t *opts,
if (p == NULL)
break;
svn_pool_clear(subpool);
+
+ SVN_ERR(fwcc_prepare(&editor, &edit_baton, &root_baton, repos, subpool));
err = editor->add_directory(p, root_baton, NULL, SVN_INVALID_REVNUM,
subpool, &out_baton);
+ if (!err)
+ err = editor->close_edit(edit_baton, subpool);
+ svn_error_clear(editor->abort_edit(edit_baton, subpool));
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
} while (p);
- SVN_ERR(editor->abort_edit(edit_baton, subpool));
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_repos_info(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_test_opts_t opts2;
+ apr_hash_t *capabilities;
+ svn_version_t *supports_version;
+ svn_version_t v1_0_0 = {1, 0, 0, ""};
+ svn_version_t v1_4_0 = {1, 4, 0, ""};
+ int repos_format;
+ svn_boolean_t is_fsx = strcmp(opts->fs_type, "fsx") == 0;
+
+ opts2 = *opts;
+
+ /* for repo types that have been around before 1.4 */
+ if (!is_fsx)
+ {
+ opts2.server_minor_version = 3;
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-info-3",
+ &opts2, pool));
+ SVN_ERR(svn_repos_capabilities(&capabilities, repos, pool, pool));
+ SVN_TEST_ASSERT(apr_hash_count(capabilities) == 0);
+ SVN_ERR(svn_repos_info_format(&repos_format, &supports_version, repos,
+ pool, pool));
+ SVN_TEST_ASSERT(repos_format == 3);
+ SVN_TEST_ASSERT(svn_ver_equal(supports_version, &v1_0_0));
+ }
+
+ opts2.server_minor_version = 9;
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-info-9",
+ &opts2, pool));
+ SVN_ERR(svn_repos_capabilities(&capabilities, repos, pool, pool));
+ SVN_TEST_ASSERT(apr_hash_count(capabilities) == 1);
+ SVN_TEST_ASSERT(svn_hash_gets(capabilities, SVN_REPOS_CAPABILITY_MERGEINFO));
+ SVN_ERR(svn_repos_info_format(&repos_format, &supports_version, repos,
+ pool, pool));
+ SVN_TEST_ASSERT(repos_format == 5);
+ SVN_TEST_ASSERT(svn_ver_equal(supports_version, &v1_4_0));
return SVN_NO_ERROR;
}
-
-/* Notification receiver for test_dump_bad_mergeinfo(). This does not
- need to do anything, it just needs to exist.
- */
-static void
-dump_r0_mergeinfo_notifier(void *baton,
- const svn_repos_notify_t *notify,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+test_config_pool(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *repo_name = "test-repo-config-pool";
+ svn_repos_t *repos;
+ svn_stringbuf_t *cfg_buffer1, *cfg_buffer2;
+ svn_config_t *cfg;
+ apr_hash_t *sections1, *sections2;
+ int i;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root, *rev_root;
+ svn_revnum_t rev;
+ const char *repo_root_url;
+ const char *srcdir;
+ svn_error_t *err;
+
+ svn_repos__config_pool_t *config_pool;
+ apr_pool_t *config_pool_pool;
+ apr_pool_t *subpool = svn_pool_create(pool);
+
+ const char *wrk_dir = svn_test_data_path("config_pool", pool);
+
+ SVN_ERR(svn_io_make_dir_recursively(wrk_dir, pool));
+
+ /* read all config info through a single config pool and we want to be
+ able to control its lifetime. The latter requires a separate pool. */
+ config_pool_pool = svn_pool_create(pool);
+ SVN_ERR(svn_repos__config_pool_create(&config_pool, TRUE,
+ config_pool_pool));
+
+ /* have two different configurations */
+ SVN_ERR(svn_test_get_srcdir(&srcdir, opts, pool));
+ SVN_ERR(svn_stringbuf_from_file2(
+ &cfg_buffer1,
+ svn_dirent_join(srcdir,
+ "../libsvn_subr/config-test.cfg",
+ pool),
+ pool));
+ cfg_buffer2 = svn_stringbuf_dup(cfg_buffer1, pool);
+ svn_stringbuf_appendcstr(cfg_buffer2, "\n[more]\nU=\"X\"\n");
+
+ /* write them to 2x2 files */
+ SVN_ERR(svn_io_write_atomic(svn_dirent_join(wrk_dir,
+ "config-pool-test1.cfg",
+ pool),
+ cfg_buffer1->data, cfg_buffer1->len, NULL,
+ pool));
+ SVN_ERR(svn_io_write_atomic(svn_dirent_join(wrk_dir,
+ "config-pool-test2.cfg",
+ pool),
+ cfg_buffer1->data, cfg_buffer1->len, NULL,
+ pool));
+ SVN_ERR(svn_io_write_atomic(svn_dirent_join(wrk_dir,
+ "config-pool-test3.cfg",
+ pool),
+ cfg_buffer2->data, cfg_buffer2->len, NULL,
+ pool));
+ SVN_ERR(svn_io_write_atomic(svn_dirent_join(wrk_dir,
+ "config-pool-test4.cfg",
+ pool),
+ cfg_buffer2->data, cfg_buffer2->len, NULL,
+ pool));
+
+ /* requesting a config over and over again should return the same
+ (even though it is not being referenced) */
+ sections1 = NULL;
+ for (i = 0; i < 4; ++i)
+ {
+ SVN_ERR(svn_repos__config_pool_get(
+ &cfg, NULL, config_pool,
+ svn_dirent_join(wrk_dir,
+ "config-pool-test1.cfg",
+ pool),
+ TRUE, TRUE, NULL, subpool));
+
+ if (sections1 == NULL)
+ sections1 = cfg->sections;
+ else
+ SVN_TEST_ASSERT(cfg->sections == sections1);
+
+ svn_pool_clear(subpool);
+ }
+
+ /* requesting the same config from another file should return the same
+ (even though it is not being referenced) */
+ for (i = 0; i < 4; ++i)
+ {
+ SVN_ERR(svn_repos__config_pool_get(
+ &cfg, NULL, config_pool,
+ svn_dirent_join(wrk_dir,
+ "config-pool-test2.cfg",
+ pool),
+ TRUE, TRUE, NULL, subpool));
+
+ SVN_TEST_ASSERT(cfg->sections == sections1);
+
+ svn_pool_clear(subpool);
+ }
+
+ /* reading a different configuration should return a different pointer */
+ sections2 = NULL;
+ for (i = 0; i < 2; ++i)
+ {
+ SVN_ERR(svn_repos__config_pool_get(
+ &cfg, NULL, config_pool,
+ svn_dirent_join(wrk_dir,
+ "config-pool-test3.cfg",
+ pool),
+ TRUE, TRUE, NULL, subpool));
+
+ if (sections2 == NULL)
+ sections2 = cfg->sections;
+ else
+ SVN_TEST_ASSERT(cfg->sections == sections2);
+
+ SVN_TEST_ASSERT(sections1 != sections2);
+ svn_pool_clear(subpool);
+ }
+
+ /* create an in-repo config */
+ SVN_ERR(svn_dirent_get_absolute(&repo_root_url, repo_name, pool));
+ SVN_ERR(svn_uri_get_file_url_from_dirent(&repo_root_url, repo_root_url,
+ pool));
+
+ SVN_ERR(svn_test__create_repos(&repos, repo_name, opts, pool));
+ SVN_ERR(svn_fs_begin_txn2(&txn, svn_repos_fs(repos), 0, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(root, "dir", pool));
+ SVN_ERR(svn_fs_make_file(root, "dir/config", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "dir/config",
+ cfg_buffer1->data, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* reading the config from the repo should still give cfg1 */
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(
+ repo_root_url,
+ "dir/config", pool),
+ TRUE, TRUE, NULL, subpool));
+ SVN_TEST_ASSERT(cfg->sections == sections1);
+ svn_pool_clear(subpool);
+
+ /* create another in-repo config */
+ SVN_ERR(svn_fs_begin_txn2(&txn, svn_repos_fs(repos), rev, 0, pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_revision_root(&rev_root, svn_repos_fs(repos), rev, pool));
+ SVN_ERR(svn_fs_copy(rev_root, "dir", root, "another-dir", pool));
+ SVN_ERR(svn_test__set_file_contents(root, "dir/config",
+ cfg_buffer2->data, pool));
+ SVN_ERR(svn_fs_commit_txn(NULL, &rev, txn, pool));
+
+ /* reading the config from the repo should give cfg2 now */
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(
+ repo_root_url,
+ "dir/config", pool),
+ TRUE, TRUE, NULL, subpool));
+ SVN_TEST_ASSERT(cfg->sections == sections2);
+ svn_pool_clear(subpool);
+
+ /* reading the copied config should still give cfg1 */
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(
+ repo_root_url,
+ "another-dir/config",
+ pool),
+ TRUE, TRUE, NULL, subpool));
+ SVN_TEST_ASSERT(cfg->sections == sections1);
+ svn_pool_clear(subpool);
+
+ /* once again: repeated reads. This triggers a different code path. */
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(
+ repo_root_url,
+ "dir/config", pool),
+ TRUE, TRUE, NULL, subpool));
+ SVN_TEST_ASSERT(cfg->sections == sections2);
+ SVN_ERR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(
+ repo_root_url,
+ "another-dir/config",
+ pool),
+ TRUE, TRUE, NULL, subpool));
+ SVN_TEST_ASSERT(cfg->sections == sections1);
+ svn_pool_clear(subpool);
+
+ /* access paths that don't exist */
+ SVN_TEST_ASSERT_ERROR(svn_repos__config_pool_get(&cfg, NULL, config_pool,
+ svn_path_url_add_component2(repo_root_url, "X",
+ pool),
+ TRUE, TRUE, NULL, subpool),
+ SVN_ERR_ILLEGAL_TARGET);
+ err = svn_repos__config_pool_get(&cfg, NULL, config_pool, "X.cfg",
+ TRUE, TRUE, NULL, subpool);
+ SVN_TEST_ASSERT(err && APR_STATUS_IS_ENOENT(err->apr_err));
+ svn_error_clear(err);
+ svn_pool_clear(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+test_repos_fs_type(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
+ svn_repos_t *repos;
+
+ /* Create test repository. */
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-repos_fs_type",
+ opts, pool));
+
+ SVN_TEST_STRING_ASSERT(svn_repos_fs_type(repos, pool), opts->fs_type);
+
+ /* Re-open repository and verify fs-type again. */
+ SVN_ERR(svn_repos_open3(&repos, svn_repos_path(repos, pool), NULL,
+ pool, pool));
+
+ SVN_TEST_STRING_ASSERT(svn_repos_fs_type(repos, pool), opts->fs_type);
+
+ return SVN_NO_ERROR;
}
-/* Regression test for part the 'dump' part of issue #4476 "Mergeinfo
- containing r0 makes svnsync and svnadmin dump fail". */
static svn_error_t *
-test_dump_r0_mergeinfo(const svn_test_opts_t *opts,
- apr_pool_t *pool)
+deprecated_access_context_api(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_repos_t *repos;
- svn_fs_t *fs;
+ svn_fs_access_t *access;
svn_fs_txn_t *txn;
- svn_fs_root_t *txn_root;
- svn_revnum_t youngest_rev = 0;
- const svn_string_t *bad_mergeinfo = svn_string_create("/foo:0", pool);
+ svn_fs_root_t *root;
+ const char *conflict;
+ svn_revnum_t new_rev;
+ const char *hook;
- SVN_ERR(svn_test__create_repos(&repos, "test-repo-dump-r0-mergeinfo",
+ /* Create test repository. */
+ SVN_ERR(svn_test__create_repos(&repos,
+ "test-repo-deprecated-access-context-api",
opts, pool));
- fs = svn_repos_fs(repos);
- /* Revision 1: Any commit will do, here */
- SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
- SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
- SVN_ERR(svn_fs_make_dir(txn_root, "/bar", pool));
- SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
- SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
+ /* Set an empty pre-commit hook. */
+#ifdef WIN32
+ hook = apr_pstrcat(pool, svn_repos_pre_commit_hook(repos, pool), ".bat",
+ SVN_VA_NULL);
+ SVN_ERR(svn_io_file_create(hook,
+ "exit 0" APR_EOL_STR,
+ pool));
+#else
+ hook = svn_repos_pre_commit_hook(repos, pool);
+ SVN_ERR(svn_io_file_create(hook,
+ "#!/bin/sh" APR_EOL_STR "exit 0" APR_EOL_STR,
+ pool));
+ SVN_ERR(svn_io_set_file_executable(hook, TRUE, FALSE, pool));
+#endif
- /* Revision 2: Add bad mergeinfo */
- SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
- SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
- SVN_ERR(svn_fs_change_node_prop(txn_root, "/bar", "svn:mergeinfo", bad_mergeinfo, pool));
- SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
- SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
+ /* Set some access context using svn_fs_access_add_lock_token(). */
+ SVN_ERR(svn_fs_create_access(&access, "jrandom", pool));
+ SVN_ERR(svn_fs_access_add_lock_token(access, "opaquelocktoken:abc"));
+ SVN_ERR(svn_fs_set_access(svn_repos_fs(repos), access));
- /* Test that a dump completes without error. In order to exercise the
- functionality under test -- that is, in order for the dump to try to
- parse the mergeinfo it is dumping -- the dump must start from a
- revision greater than 1 and must take a notification callback. */
- {
- svn_stringbuf_t *stringbuf = svn_stringbuf_create_empty(pool);
- svn_stream_t *stream = svn_stream_from_stringbuf(stringbuf, pool);
-
- SVN_ERR(svn_repos_dump_fs3(repos, stream, 2, SVN_INVALID_REVNUM,
- FALSE, FALSE,
- dump_r0_mergeinfo_notifier, NULL,
- NULL, NULL,
- pool));
- }
+ /* Commit a new revision. */
+ SVN_ERR(svn_repos_fs_begin_txn_for_commit2(&txn, repos, 0,
+ apr_hash_make(pool), pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(root, "/whatever", pool));
+ SVN_ERR(svn_repos_fs_commit_txn(&conflict, repos, &new_rev, txn, pool));
+
+ SVN_TEST_STRING_ASSERT(conflict, NULL);
+ SVN_TEST_ASSERT(new_rev == 1);
return SVN_NO_ERROR;
}
-
-/* Test dumping in the presence of the property PROP_NAME:PROP_VAL.
- * Return the dumped data in *DUMP_DATA_P (if DUMP_DATA_P is not null).
- * REPOS is an empty repository.
- * See svn_repos_dump_fs3() for START_REV, END_REV, NOTIFY_FUNC, NOTIFY_BATON.
- */
static svn_error_t *
-test_dump_bad_props(svn_stringbuf_t **dump_data_p,
- svn_repos_t *repos,
- const char *prop_name,
- const svn_string_t *prop_val,
- svn_revnum_t start_rev,
- svn_revnum_t end_rev,
- svn_repos_notify_func_t notify_func,
- void *notify_baton,
- apr_pool_t *pool)
+mkdir_delete_copy(svn_repos_t *repos,
+ const char *src,
+ const char *dst,
+ apr_pool_t *pool)
{
- const char *test_path = "/bar";
svn_fs_t *fs = svn_repos_fs(repos);
+ svn_revnum_t youngest_rev;
svn_fs_txn_t *txn;
- svn_fs_root_t *txn_root;
- svn_revnum_t youngest_rev = 0;
- svn_stringbuf_t *dump_data = svn_stringbuf_create_empty(pool);
- svn_stream_t *stream = svn_stream_from_stringbuf(dump_data, pool);
- const char *expected_str;
+ svn_fs_root_t *txn_root, *rev_root;
- /* Revision 1: Any commit will do, here */
- SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
- SVN_ERR(svn_fs_make_dir(txn_root, test_path , pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "A/T", pool));
+ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
+
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_delete(txn_root, "A/T", pool));
SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
- SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
- /* Revision 2: Add the bad property */
- SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
- SVN_ERR(svn_fs_change_node_prop(txn_root, test_path , prop_name, prop_val,
- pool));
+ SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev - 1, pool));
+ SVN_ERR(svn_fs_copy(rev_root, src, txn_root, dst, pool));
SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
- SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
- /* Test that a dump completes without error. */
- SVN_ERR(svn_repos_dump_fs3(repos, stream, start_rev, end_rev,
- FALSE, FALSE,
- notify_func, notify_baton,
- NULL, NULL,
- pool));
- svn_stream_close(stream);
-
- /* Check that the property appears in the dump data */
- expected_str = apr_psprintf(pool, "K %d\n%s\n"
- "V %d\n%s\n"
- "PROPS-END\n",
- (int)strlen(prop_name), prop_name,
- (int)prop_val->len, prop_val->data);
- SVN_TEST_ASSERT(strstr(dump_data->data, expected_str));
-
- if (dump_data_p)
- *dump_data_p = dump_data;
return SVN_NO_ERROR;
}
-/* Test loading in the presence of the property PROP_NAME:PROP_VAL.
- * Load data from DUMP_DATA.
- * REPOS is an empty repository.
- */
+struct authz_read_baton_t {
+ apr_hash_t *paths;
+ apr_pool_t *pool;
+ const char *deny;
+};
+
static svn_error_t *
-test_load_bad_props(svn_stringbuf_t *dump_data,
- svn_repos_t *repos,
- const char *prop_name,
- const svn_string_t *prop_val,
- const char *parent_fspath,
- svn_boolean_t validate_props,
- svn_repos_notify_func_t notify_func,
- void *notify_baton,
- apr_pool_t *pool)
+authz_read_func(svn_boolean_t *allowed,
+ svn_fs_root_t *root,
+ const char *path,
+ void *baton,
+ apr_pool_t *pool)
{
- const char *test_path = apr_psprintf(pool, "%s%s",
- parent_fspath ? parent_fspath : "",
- "/bar");
- svn_stream_t *stream = svn_stream_from_stringbuf(dump_data, pool);
- svn_fs_t *fs;
- svn_fs_root_t *rev_root;
- svn_revnum_t youngest_rev;
- svn_string_t *loaded_prop_val;
-
- SVN_ERR(svn_repos_load_fs4(repos, stream,
- SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
- svn_repos_load_uuid_default,
- parent_fspath,
- FALSE, FALSE, /*use_*_commit_hook*/
- validate_props,
- notify_func, notify_baton,
- NULL, NULL, /*cancellation*/
- pool));
- svn_stream_close(stream);
+ struct authz_read_baton_t *b = baton;
+
+ if (b->deny && !strcmp(b->deny, path))
+ *allowed = FALSE;
+ else
+ *allowed = TRUE;
+
+ svn_hash_sets(b->paths, apr_pstrdup(b->pool, path), (void*)1);
- /* Check the loaded property */
- fs = svn_repos_fs(repos);
- SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
- SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev, pool));
- SVN_ERR(svn_fs_node_prop(&loaded_prop_val,
- rev_root, test_path, prop_name, pool));
- SVN_TEST_ASSERT(svn_string_compare(loaded_prop_val, prop_val));
return SVN_NO_ERROR;
}
-static void
-load_r0_mergeinfo_notifier(void *baton,
- const svn_repos_notify_t *notify,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+verify_locations(apr_hash_t *actual,
+ apr_hash_t *expected,
+ apr_hash_t *checked,
+ apr_pool_t *pool)
{
- svn_boolean_t *had_mergeinfo_warning = baton;
+ apr_hash_index_t *hi;
- if (notify->action == svn_repos_notify_warning)
+ for (hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
{
- if (notify->warning == svn_repos__notify_warning_invalid_mergeinfo)
- {
- *had_mergeinfo_warning = TRUE;
- }
+ const svn_revnum_t *rev = apr_hash_this_key(hi);
+ const char *path = apr_hash_get(actual, rev, sizeof(svn_revnum_t));
+
+ if (!path)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "expected %s for %d found (null)",
+ (char*)apr_hash_this_val(hi), (int)*rev);
+ else if (strcmp(path, apr_hash_this_val(hi)))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "expected %s for %d found %s",
+ (char*)apr_hash_this_val(hi), (int)*rev, path);
+
}
+
+ for (hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
+ {
+ const svn_revnum_t *rev = apr_hash_this_key(hi);
+ const char *path = apr_hash_get(expected, rev, sizeof(svn_revnum_t));
+
+ if (!path)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "found %s for %d expected (null)",
+ (char*)apr_hash_this_val(hi), (int)*rev);
+ else if (strcmp(path, apr_hash_this_val(hi)))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "found %s for %d expected %s",
+ (char*)apr_hash_this_val(hi), (int)*rev, path);
+
+ if (!svn_hash_gets(checked, path))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "did not check %s", path);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static void
+set_expected(apr_hash_t *expected,
+ svn_revnum_t rev,
+ const char *path,
+ apr_pool_t *pool)
+{
+ svn_revnum_t *rp = apr_palloc(pool, sizeof(svn_revnum_t));
+ *rp = rev;
+ apr_hash_set(expected, rp, sizeof(svn_revnum_t), path);
}
-/* Regression test for the 'load' part of issue #4476 "Mergeinfo
- * containing r0 makes svnsync and svnadmin dump fail".
- *
- * Bad mergeinfo should not prevent loading a backup, at least when we do not
- * require mergeinfo revision numbers or paths to be adjusted during loading.
- */
static svn_error_t *
-test_load_r0_mergeinfo(const svn_test_opts_t *opts,
- apr_pool_t *pool)
+trace_node_locations_authz(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
- const char *prop_name = "svn:mergeinfo";
- const svn_string_t *prop_val = svn_string_create("/foo:0", pool);
- svn_stringbuf_t *dump_data = svn_stringbuf_create_empty(pool);
+ svn_repos_t *repos;
+ svn_fs_t *fs;
+ svn_revnum_t youngest_rev = 0;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *txn_root;
+ struct authz_read_baton_t arb;
+ apr_array_header_t *revs = apr_array_make(pool, 10, sizeof(svn_revnum_t));
+ apr_hash_t *locations;
+ apr_hash_t *expected = apr_hash_make(pool);
+ int i;
- /* Produce a dump file containing bad mergeinfo */
- {
- svn_repos_t *repos;
+ /* Create test repository. */
+ SVN_ERR(svn_test__create_repos(&repos, "test-repo-trace-node-locations-authz",
+ opts, pool));
+ fs = svn_repos_fs(repos);
- SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-1",
- opts, pool));
- SVN_ERR(test_dump_bad_props(&dump_data, repos,
- prop_name, prop_val,
- SVN_INVALID_REVNUM, SVN_INVALID_REVNUM,
- NULL, NULL, pool));
- }
+ /* r1 create A */
+ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
+ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(txn_root, "A", pool));
+ SVN_ERR(svn_fs_make_file(txn_root, "A/f", pool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "A/f", "foobar", pool));
+ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
- /* Test loading without validating properties: should warn and succeed */
- {
- svn_repos_t *repos;
- svn_boolean_t had_mergeinfo_warning = FALSE;
-
- SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-2",
- opts, pool));
-
- /* Without changing revision numbers or paths */
- SVN_ERR(test_load_bad_props(dump_data, repos,
- prop_name, prop_val,
- NULL /*parent_dir*/, FALSE /*validate_props*/,
- load_r0_mergeinfo_notifier, &had_mergeinfo_warning,
- pool));
- SVN_TEST_ASSERT(had_mergeinfo_warning);
-
- /* With changing revision numbers and/or paths (by loading the same data
- again, on top of existing revisions, into subdirectory 'bar') */
- had_mergeinfo_warning = FALSE;
- SVN_ERR(test_load_bad_props(dump_data, repos,
- prop_name, prop_val,
- "/bar", FALSE /*validate_props*/,
- load_r0_mergeinfo_notifier, &had_mergeinfo_warning,
- pool));
- SVN_TEST_ASSERT(had_mergeinfo_warning);
- }
+ /* r4 copy A to B */
+ SVN_ERR(mkdir_delete_copy(repos, "A", "B", pool));
- /* Test loading with validating properties: should return an error */
- {
- svn_repos_t *repos;
+ /* r7 copy B to C */
+ SVN_ERR(mkdir_delete_copy(repos, "B", "C", pool));
- SVN_ERR(svn_test__create_repos(&repos, "test-repo-load-r0-mi-3",
- opts, pool));
-
- /* Without changing revision numbers or paths */
- SVN_TEST__ASSERT_ANY_ERROR(test_load_bad_props(dump_data, repos,
- prop_name, prop_val,
- NULL /*parent_dir*/, TRUE /*validate_props*/,
- NULL, NULL,
- pool));
-
- /* With changing revision numbers and/or paths (by loading the same data
- again, on top of existing revisions, into subdirectory 'bar') */
- SVN_TEST__ASSERT_ANY_ERROR(test_load_bad_props(dump_data, repos,
- prop_name, prop_val,
- "/bar", TRUE /*validate_props*/,
- NULL, NULL,
- pool));
- }
+ /* r10 copy C to D */
+ SVN_ERR(mkdir_delete_copy(repos, "C", "D", pool));
+
+ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
+ SVN_ERR_ASSERT(youngest_rev == 10);
+
+ arb.paths = apr_hash_make(pool);
+ arb.pool = pool;
+ arb.deny = NULL;
+
+ apr_array_clear(revs);
+ for (i = 0; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ set_expected(expected, 10, "/D/f", pool);
+ set_expected(expected, 8, "/C/f", pool);
+ set_expected(expected, 7, "/C/f", pool);
+ set_expected(expected, 5, "/B/f", pool);
+ set_expected(expected, 4, "/B/f", pool);
+ set_expected(expected, 2, "/A/f", pool);
+ set_expected(expected, 1, "/A/f", pool);
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ apr_array_clear(revs);
+ for (i = 1; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ apr_array_clear(revs);
+ for (i = 2; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ set_expected(expected, 1, NULL, pool);
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ apr_array_clear(revs);
+ for (i = 3; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ set_expected(expected, 2, NULL, pool);
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ apr_array_clear(revs);
+ for (i = 6; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ set_expected(expected, 5, NULL, pool);
+ set_expected(expected, 4, NULL, pool);
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ arb.deny = "/B/f";
+ apr_array_clear(revs);
+ for (i = 0; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ apr_array_clear(revs);
+ for (i = 6; i <= youngest_rev; ++i)
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
+
+ APR_ARRAY_PUSH(revs, svn_revnum_t) = 0;
+ apr_hash_clear(arb.paths);
+ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
+ authz_read_func, &arb, pool));
+ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
return SVN_NO_ERROR;
}
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(dir_deltas,
@@ -3569,9 +3894,17 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_repos_delete"),
SVN_TEST_OPTS_PASS(filename_with_control_chars,
"test filenames with control characters"),
- SVN_TEST_OPTS_PASS(test_dump_r0_mergeinfo,
- "test dumping with r0 mergeinfo"),
- SVN_TEST_OPTS_PASS(test_load_r0_mergeinfo,
- "test loading with r0 mergeinfo"),
+ SVN_TEST_OPTS_PASS(test_repos_info,
+ "test svn_repos_info_*"),
+ SVN_TEST_OPTS_PASS(test_config_pool,
+ "test svn_repos__config_pool_*"),
+ SVN_TEST_OPTS_PASS(test_repos_fs_type,
+ "test test_repos_fs_type"),
+ SVN_TEST_OPTS_PASS(deprecated_access_context_api,
+ "test deprecated access context api"),
+ SVN_TEST_OPTS_PASS(trace_node_locations_authz,
+ "authz for svn_repos_trace_node_locations"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/auth-test.c b/subversion/tests/libsvn_subr/auth-test.c
index 9d7d866..bbe7933 100644
--- a/subversion/tests/libsvn_subr/auth-test.c
+++ b/subversion/tests/libsvn_subr/auth-test.c
@@ -63,13 +63,14 @@ test_platform_specific_auth_providers(apr_pool_t *pool)
number_of_providers += 2;
#endif
#if defined(WIN32) && !defined(__MINGW32__)
- number_of_providers += 2;
+ number_of_providers += 4;
#endif
if (providers->nelts != number_of_providers)
return svn_error_createf
(SVN_ERR_TEST_FAILED, NULL,
"svn_auth_get_platform_specific_client_providers should return " \
- "an array of %d providers", number_of_providers);
+ "an array of %d providers, but returned %d providers",
+ number_of_providers, providers->nelts);
/* Test Keychain auth providers */
#ifdef SVN_HAVE_KEYCHAIN_SERVICES
@@ -219,8 +220,8 @@ cleanup_callback(svn_boolean_t *delete_cred,
{
svn_auth_baton_t *b = walk_baton;
- SVN_TEST_ASSERT(strcmp(cred_kind, SVN_AUTH_CRED_SIMPLE) == 0);
- SVN_TEST_ASSERT(strcmp(realmstring, "<http://my.host> My realm") == 0);
+ SVN_TEST_STRING_ASSERT(cred_kind, SVN_AUTH_CRED_SIMPLE);
+ SVN_TEST_STRING_ASSERT(realmstring, "<http://my.host> My realm");
SVN_ERR(svn_auth_forget_credentials(b, cred_kind, realmstring, scratch_pool));
@@ -271,7 +272,7 @@ test_auth_clear(apr_pool_t *pool)
pool));
creds = credentials;
- SVN_TEST_ASSERT(strcmp(creds->username, "jrandom") == 0);
+ SVN_TEST_STRING_ASSERT(creds->username, "jrandom");
SVN_TEST_ASSERT(creds->may_save);
/* And tell that they are ok and can be saved */
@@ -291,7 +292,7 @@ test_auth_clear(apr_pool_t *pool)
SVN_TEST_ASSERT(credentials);
creds = credentials;
- SVN_TEST_ASSERT(strcmp(creds->username, "jrandom") == 0);
+ SVN_TEST_STRING_ASSERT(creds->username, "jrandom");
SVN_TEST_ASSERT(creds->may_save);
/* Use our walker function to delete credentials (and forget them
@@ -314,18 +315,16 @@ test_auth_clear(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_platform_specific_auth_providers,
"test retrieving platform-specific auth providers"),
-#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
SVN_TEST_PASS2(test_auth_clear,
"test svn_auth_clear()"),
-#else
- SVN_TEST_WIMP(test_auth_clear,
- "test svn_auth_clear()",
- "Needs testing with SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE"),
-#endif
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/bit-array-test.c b/subversion/tests/libsvn_subr/bit-array-test.c
new file mode 100644
index 0000000..e6fe528
--- /dev/null
+++ b/subversion/tests/libsvn_subr/bit-array-test.c
@@ -0,0 +1,140 @@
+/*
+ * bit-array-test.c: a collection of svn_bit_array__* tests
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ====================================================================
+ To add tests, look toward the bottom of this file.
+
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+
+#include "svn_error.h"
+#include "svn_string.h" /* This includes <apr_*.h> */
+#include "private/svn_subr_private.h"
+
+static svn_error_t *
+test_zero_defaults(apr_pool_t *pool)
+{
+ svn_bit_array__t *array = svn_bit_array__create(0, pool);
+
+ /* Test (default) allocation boundaries */
+ SVN_TEST_ASSERT(svn_bit_array__get(array, 0x7ffff) == 0);
+ SVN_TEST_ASSERT(svn_bit_array__get(array, 0x80000) == 0);
+
+ /* Test address boundaries */
+ SVN_TEST_ASSERT(svn_bit_array__get(array, 0) == 0);
+ SVN_TEST_ASSERT(svn_bit_array__get(array, APR_SIZE_MAX) == 0);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_get_set(apr_pool_t *pool)
+{
+ svn_bit_array__t *array = svn_bit_array__create(0, pool);
+ apr_size_t i, min = 0x7ff00, max = 0x7ff00 + 1025;
+
+ /* All values default to 0. */
+ for (i = min; i < max; ++i)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, i) == 0);
+
+ /* Create a pattern, setting every other bit. Array will also auto-grow. */
+ for (i = min; i < max; ++i)
+ if (i % 2)
+ svn_bit_array__set(array, i, 1);
+
+ /* Verify pattern */
+ for (i = min; i < max; ++i)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, i) == i % 2);
+
+ /* Zero the zeros in the pattern -> should be no change. */
+ for (i = min; i < max; ++i)
+ if (i % 2 == 0)
+ svn_bit_array__set(array, i, 0);
+
+ /* Verify pattern */
+ for (i = min; i < max; ++i)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, i) == i % 2);
+
+ /* Write an inverted pattern while verifying the old one. */
+ for (i = min; i < max; ++i)
+ {
+ SVN_TEST_ASSERT(svn_bit_array__get(array, i) == i % 2);
+ svn_bit_array__set(array, i, 1 - (i % 2));
+ }
+
+ /* Verify pattern */
+ for (i = min; i < max; ++i)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, i) == 1 - (i % 2));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_sparse(apr_pool_t *pool)
+{
+ svn_bit_array__t *array = svn_bit_array__create(0, pool);
+ apr_size_t i, k, min = 0x7ff00, max = 0x7ff00 + 1025, SCALE = 0x10000000;
+
+ /* All values default to 0. */
+ for (i = 0; i < 15; ++i)
+ for (k = i * SCALE + min; k < i * SCALE + max; ++k)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, k) == 0);
+
+ /* Create a pattern, setting every other bit. Array will also auto-grow. */
+ for (i = 0; i < 15; ++i)
+ for (k = i * SCALE + min; k < i * SCALE + max; ++k)
+ if (k % 2)
+ svn_bit_array__set(array, k, 1);
+
+ /* Verify pattern */
+ for (i = 0; i < 15; ++i)
+ for (k = i * SCALE + min; k < i * SCALE + max; ++k)
+ SVN_TEST_ASSERT(svn_bit_array__get(array, k) == k % 2);
+
+ return SVN_NO_ERROR;
+}
+
+/* An array of all test functions */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_zero_defaults,
+ "check entries to default to zero"),
+ SVN_TEST_PASS2(test_get_set,
+ "get / set entries"),
+ SVN_TEST_PASS2(test_sparse,
+ "get / set sparse entries"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/cache-test.c b/subversion/tests/libsvn_subr/cache-test.c
index 9e7a7b3..1616441 100644
--- a/subversion/tests/libsvn_subr/cache-test.c
+++ b/subversion/tests/libsvn_subr/cache-test.c
@@ -157,7 +157,8 @@ test_memcache_basic(const svn_test_opts_t *opts,
{
SVN_ERR(svn_config_read3(&config, opts->config_file,
TRUE, FALSE, FALSE, pool));
- SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool));
+ SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config,
+ pool, pool));
}
if (! memcache)
@@ -193,8 +194,9 @@ test_membuffer_cache_basic(apr_pool_t *pool)
deserialize_revnum,
APR_HASH_KEY_STRING,
"cache:",
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
FALSE,
- pool));
+ pool, pool));
return basic_cache_test(cache, FALSE, pool);
}
@@ -220,6 +222,16 @@ raise_error_partial_getter_func(void **out,
return svn_error_create(APR_EGENERAL, NULL, NULL);
}
+/* Implements svn_cache__partial_setter_func_t */
+static svn_error_t *
+raise_error_partial_setter_func(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ return svn_error_create(APR_EGENERAL, NULL, NULL);
+}
+
static svn_error_t *
test_membuffer_serializer_error_handling(apr_pool_t *pool)
{
@@ -239,8 +251,9 @@ test_membuffer_serializer_error_handling(apr_pool_t *pool)
raise_error_deserialize_func,
APR_HASH_KEY_STRING,
"cache:",
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
FALSE,
- pool));
+ pool, pool));
SVN_ERR(svn_cache__set(cache, "twenty", &twenty, pool));
@@ -258,6 +271,30 @@ test_membuffer_serializer_error_handling(apr_pool_t *pool)
NULL, pool),
APR_EGENERAL);
+ /* Create a new cache. */
+ SVN_ERR(svn_cache__membuffer_cache_create(&membuffer, 10*1024, 1, 0,
+ TRUE, TRUE, pool));
+ SVN_ERR(svn_cache__create_membuffer_cache(&cache,
+ membuffer,
+ serialize_revnum,
+ deserialize_revnum,
+ APR_HASH_KEY_STRING,
+ "cache:",
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ FALSE,
+ pool, pool));
+
+ /* Store one entry in cache. */
+ SVN_ERR(svn_cache__set(cache, "twenty", &twenty, pool));
+
+ /* Test setting data in cache using partial setter that
+ always raises an error. */
+ SVN_TEST_ASSERT_ERROR(
+ svn_cache__set_partial(cache, "twenty",
+ raise_error_partial_setter_func,
+ NULL, pool),
+ APR_EGENERAL);
+
return SVN_NO_ERROR;
}
@@ -286,7 +323,8 @@ test_memcache_long_key(const svn_test_opts_t *opts,
{
SVN_ERR(svn_config_read3(&config, opts->config_file,
TRUE, FALSE, FALSE, pool));
- SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool));
+ SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config,
+ pool, pool));
}
if (! memcache)
@@ -316,10 +354,80 @@ test_memcache_long_key(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_membuffer_cache_clearing(apr_pool_t *pool)
+{
+ svn_cache__t *cache;
+ svn_membuffer_t *membuffer;
+ svn_boolean_t found;
+ svn_revnum_t *value;
+ svn_revnum_t valueA = 12345;
+ svn_revnum_t valueB = 67890;
+
+ /* Create a simple cache for strings, keyed by strings. */
+ SVN_ERR(svn_cache__membuffer_cache_create(&membuffer, 10*1024, 1, 0,
+ TRUE, TRUE, pool));
+ SVN_ERR(svn_cache__create_membuffer_cache(&cache,
+ membuffer,
+ serialize_revnum,
+ deserialize_revnum,
+ APR_HASH_KEY_STRING,
+ "cache:",
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ FALSE,
+ pool, pool));
+
+ /* Initially, the cache is empty. */
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool));
+ SVN_TEST_ASSERT(!found);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool));
+ SVN_TEST_ASSERT(!found);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool));
+ SVN_TEST_ASSERT(!found);
+
+ /* Add entries. */
+ SVN_ERR(svn_cache__set(cache, "key A", &valueA, pool));
+ SVN_ERR(svn_cache__set(cache, "key B", &valueB, pool));
+
+ /* Added entries should be cached (too small to get evicted already). */
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool));
+ SVN_TEST_ASSERT(found);
+ SVN_TEST_ASSERT(*value == valueA);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool));
+ SVN_TEST_ASSERT(found);
+ SVN_TEST_ASSERT(*value == valueB);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool));
+ SVN_TEST_ASSERT(!found);
+
+ /* Clear the cache. */
+ SVN_ERR(svn_cache__membuffer_clear(membuffer));
+
+ /* The cache is empty again. */
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool));
+ SVN_TEST_ASSERT(!found);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool));
+ SVN_TEST_ASSERT(!found);
+ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool));
+ SVN_TEST_ASSERT(!found);
+
+ /* But still functional: */
+ SVN_ERR(svn_cache__set(cache, "key B", &valueB, pool));
+ SVN_ERR(svn_cache__has_key(&found, cache, "key A", pool));
+ SVN_TEST_ASSERT(!found);
+ SVN_ERR(svn_cache__has_key(&found, cache, "key B", pool));
+ SVN_TEST_ASSERT(found);
+ SVN_ERR(svn_cache__has_key(&found, cache, "key C", pool));
+ SVN_TEST_ASSERT(!found);
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_inprocess_cache_basic,
@@ -332,5 +440,9 @@ struct svn_test_descriptor_t test_funcs[] =
"basic membuffer svn_cache test"),
SVN_TEST_PASS2(test_membuffer_serializer_error_handling,
"test for error handling in membuffer svn_cache"),
+ SVN_TEST_PASS2(test_membuffer_cache_clearing,
+ "test clearing a membuffer svn_cache"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/checksum-test.c b/subversion/tests/libsvn_subr/checksum-test.c
index c5e2409..4c6d993 100644
--- a/subversion/tests/libsvn_subr/checksum-test.c
+++ b/subversion/tests/libsvn_subr/checksum-test.c
@@ -27,38 +27,47 @@
#include "svn_error.h"
#include "svn_io.h"
-#include "private/svn_pseudo_md5.h"
#include "../svn_test.h"
+/* Verify that DIGEST of checksum type KIND can be parsed and
+ * converted back to a string matching DIGEST. NAME will be used
+ * to identify the type of checksum in error messages.
+ */
static svn_error_t *
-test_checksum_parse(apr_pool_t *pool)
+checksum_parse_kind(const char *digest,
+ svn_checksum_kind_t kind,
+ const char *name,
+ apr_pool_t *pool)
{
- const char *md5_digest = "8518b76f7a45fe4de2d0955085b41f98";
- const char *sha1_digest = "74d82379bcc6771454377db03b912c2b62704139";
const char *checksum_display;
svn_checksum_t *checksum;
- SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_md5, md5_digest, pool));
+ SVN_ERR(svn_checksum_parse_hex(&checksum, kind, digest, pool));
checksum_display = svn_checksum_to_cstring_display(checksum, pool);
- if (strcmp(checksum_display, md5_digest) != 0)
+ if (strcmp(checksum_display, digest) != 0)
return svn_error_createf
(SVN_ERR_CHECKSUM_MISMATCH, NULL,
- "verify-checksum: md5 checksum mismatch:\n"
+ "verify-checksum: %s checksum mismatch:\n"
" expected: %s\n"
- " actual: %s\n", md5_digest, checksum_display);
+ " actual: %s\n", name, digest, checksum_display);
- SVN_ERR(svn_checksum_parse_hex(&checksum, svn_checksum_sha1, sha1_digest,
- pool));
- checksum_display = svn_checksum_to_cstring_display(checksum, pool);
+ return SVN_NO_ERROR;
+}
- if (strcmp(checksum_display, sha1_digest) != 0)
- return svn_error_createf
- (SVN_ERR_CHECKSUM_MISMATCH, NULL,
- "verify-checksum: sha1 checksum mismatch:\n"
- " expected: %s\n"
- " actual: %s\n", sha1_digest, checksum_display);
+static svn_error_t *
+test_checksum_parse(apr_pool_t *pool)
+{
+ SVN_ERR(checksum_parse_kind("8518b76f7a45fe4de2d0955085b41f98",
+ svn_checksum_md5, "md5", pool));
+ SVN_ERR(checksum_parse_kind("74d82379bcc6771454377db03b912c2b62704139",
+ svn_checksum_sha1, "sha1", pool));
+ SVN_ERR(checksum_parse_kind("deadbeef",
+ svn_checksum_fnv1a_32, "fnv-1a", pool));
+ SVN_ERR(checksum_parse_kind("cafeaffe",
+ svn_checksum_fnv1a_32x4,
+ "modified fnv-1a", pool));
return SVN_NO_ERROR;
}
@@ -66,94 +75,97 @@ test_checksum_parse(apr_pool_t *pool)
static svn_error_t *
test_checksum_empty(apr_pool_t *pool)
{
- svn_checksum_t *checksum;
- char data = '\0';
-
- checksum = svn_checksum_empty_checksum(svn_checksum_md5, pool);
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
-
- checksum = svn_checksum_empty_checksum(svn_checksum_sha1, pool);
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ {
+ svn_checksum_t *checksum;
+ char data = '\0';
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, &data, 0, pool));
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ checksum = svn_checksum_empty_checksum(kind, pool);
+ SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
- SVN_ERR(svn_checksum(&checksum, svn_checksum_sha1, &data, 0, pool));
- SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ SVN_ERR(svn_checksum(&checksum, kind, &data, 0, pool));
+ SVN_TEST_ASSERT(svn_checksum_is_empty_checksum(checksum));
+ }
return SVN_NO_ERROR;
}
+/* Verify that "zero" checksums work properly for the given checksum KIND.
+ */
static svn_error_t *
-test_pseudo_md5(apr_pool_t *pool)
+zero_match_kind(svn_checksum_kind_t kind, apr_pool_t *pool)
{
- apr_uint32_t input[16] = { 0 };
- apr_uint32_t digest_15[4] = { 0 };
- apr_uint32_t digest_31[4] = { 0 };
- apr_uint32_t digest_63[4] = { 0 };
- svn_checksum_t *checksum;
+ svn_checksum_t *zero;
+ svn_checksum_t *A;
+ svn_checksum_t *B;
- /* input is all 0s but the hash shall be different
- (due to different input sizes)*/
- svn__pseudo_md5_15(digest_15, input);
- svn__pseudo_md5_31(digest_31, input);
- svn__pseudo_md5_63(digest_63, input);
+ zero = svn_checksum_create(kind, pool);
+ SVN_ERR(svn_checksum_clear(zero));
+ SVN_ERR(svn_checksum(&A, kind, "A", 1, pool));
+ SVN_ERR(svn_checksum(&B, kind, "B", 1, pool));
- SVN_TEST_ASSERT(memcmp(digest_15, digest_31, sizeof(digest_15)));
- SVN_TEST_ASSERT(memcmp(digest_15, digest_63, sizeof(digest_15)));
- SVN_TEST_ASSERT(memcmp(digest_31, digest_63, sizeof(digest_15)));
+ /* Different non-zero don't match. */
+ SVN_TEST_ASSERT(!svn_checksum_match(A, B));
- /* the checksums shall also be different from "proper" MD5 */
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 15, pool));
- SVN_TEST_ASSERT(memcmp(digest_15, checksum->digest, sizeof(digest_15)));
+ /* Zero matches anything of the same kind. */
+ SVN_TEST_ASSERT(svn_checksum_match(A, zero));
+ SVN_TEST_ASSERT(svn_checksum_match(zero, B));
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 31, pool));
- SVN_TEST_ASSERT(memcmp(digest_31, checksum->digest, sizeof(digest_15)));
+ return SVN_NO_ERROR;
+}
- SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 63, pool));
- SVN_TEST_ASSERT(memcmp(digest_63, checksum->digest, sizeof(digest_15)));
+static svn_error_t *
+zero_match(apr_pool_t *pool)
+{
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ SVN_ERR(zero_match_kind(kind, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
-zero_match(apr_pool_t *pool)
+zero_cross_match(apr_pool_t *pool)
{
- svn_checksum_t *zero_md5;
- svn_checksum_t *zero_sha1;
- svn_checksum_t *A_md5;
- svn_checksum_t *B_md5;
- svn_checksum_t *A_sha1;
- svn_checksum_t *B_sha1;
+ svn_checksum_kind_t i_kind;
+ svn_checksum_kind_t k_kind;
+ for (i_kind = svn_checksum_md5;
+ i_kind <= svn_checksum_fnv1a_32x4;
+ ++i_kind)
+ {
+ svn_checksum_t *i_zero;
+ svn_checksum_t *i_A;
- zero_md5 = svn_checksum_create(svn_checksum_md5, pool);
- SVN_ERR(svn_checksum_clear(zero_md5));
- SVN_ERR(svn_checksum(&A_md5, svn_checksum_md5, "A", 1, pool));
- SVN_ERR(svn_checksum(&B_md5, svn_checksum_md5, "B", 1, pool));
+ i_zero = svn_checksum_create(i_kind, pool);
+ SVN_ERR(svn_checksum_clear(i_zero));
+ SVN_ERR(svn_checksum(&i_A, i_kind, "A", 1, pool));
- zero_sha1 = svn_checksum_create(svn_checksum_sha1, pool);
- SVN_ERR(svn_checksum_clear(zero_sha1));
- SVN_ERR(svn_checksum(&A_sha1, svn_checksum_sha1, "A", 1, pool));
- SVN_ERR(svn_checksum(&B_sha1, svn_checksum_sha1, "B", 1, pool));
+ for (k_kind = svn_checksum_md5;
+ k_kind <= svn_checksum_fnv1a_32x4;
+ ++k_kind)
+ {
+ svn_checksum_t *k_zero;
+ svn_checksum_t *k_A;
+ if (i_kind == k_kind)
+ continue;
- /* Different non-zero don't match. */
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, B_md5));
- SVN_TEST_ASSERT(!svn_checksum_match(A_sha1, B_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, A_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(A_md5, B_sha1));
+ k_zero = svn_checksum_create(k_kind, pool);
+ SVN_ERR(svn_checksum_clear(k_zero));
+ SVN_ERR(svn_checksum(&k_A, k_kind, "A", 1, pool));
- /* Zero matches anything of the same kind. */
- SVN_TEST_ASSERT(svn_checksum_match(A_md5, zero_md5));
- SVN_TEST_ASSERT(svn_checksum_match(zero_md5, B_md5));
- SVN_TEST_ASSERT(svn_checksum_match(A_sha1, zero_sha1));
- SVN_TEST_ASSERT(svn_checksum_match(zero_sha1, B_sha1));
+ /* Different non-zero don't match. */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_A, k_A));
+
+ /* Zero doesn't match anything of a different kind... */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_zero, k_A));
+ SVN_TEST_ASSERT(!svn_checksum_match(i_A, k_zero));
- /* Zero doesn't match anything of a different kind... */
- SVN_TEST_ASSERT(!svn_checksum_match(zero_md5, A_sha1));
- SVN_TEST_ASSERT(!svn_checksum_match(zero_sha1, A_md5));
- /* ...even another zero. */
- SVN_TEST_ASSERT(!svn_checksum_match(zero_md5, zero_sha1));
+ /* ...even another zero. */
+ SVN_TEST_ASSERT(!svn_checksum_match(i_zero, k_zero));
+ }
+ }
return SVN_NO_ERROR;
}
@@ -163,12 +175,14 @@ zlib_expansion_test(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
const char *data_path;
+ const char *srcdir;
svn_stringbuf_t *deflated;
Byte dst_buffer[256 * 1024];
Byte *src_buffer;
- apr_size_t sz;
+ uInt sz;
- data_path = svn_dirent_join(opts->srcdir, "zlib.deflated", pool);
+ SVN_ERR(svn_test_get_srcdir(&srcdir, opts, pool));
+ data_path = svn_dirent_join(srcdir, "zlib.deflated", pool);
SVN_ERR(svn_stringbuf_from_file2(&deflated, data_path, pool));
src_buffer = (Byte*)deflated->data;
@@ -177,6 +191,7 @@ zlib_expansion_test(const svn_test_opts_t *opts,
for (sz = 1; sz < 256; sz++)
{
z_stream stream;
+ uLong crc = crc32(0, Z_NULL, 0);
memset(&stream, 0, sizeof(stream));
inflateInit2(&stream, -15 /* DEFLATE_WINDOW_SIZE */);
@@ -193,12 +208,15 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "Failure decompressing with blocksize %d", (int)sz);
+ "Failure decompressing with blocksize %u", sz);
}
+ crc = crc32(crc, dst_buffer, sizeof(dst_buffer) - stream.avail_out);
+ stream.avail_out = sizeof(dst_buffer);
+ stream.next_out = dst_buffer;
stream.avail_in += sz;
} while (stream.next_in + stream.avail_in < src_buffer + deflated->len);
- stream.avail_in = (src_buffer + deflated->len) - stream.next_in;
+ stream.avail_in = (uInt) (deflated->len - stream.total_in);
{
int zr = inflate(&stream, Z_NO_FLUSH);
@@ -207,8 +225,9 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "Final flush failed with blocksize %d", (int)sz);
+ "Final flush failed with blocksize %u", sz);
}
+ crc = crc32(crc, dst_buffer, sizeof(dst_buffer) - stream.avail_out);
zr = inflateEnd(&stream);
@@ -216,42 +235,65 @@ zlib_expansion_test(const svn_test_opts_t *opts,
{
return svn_error_createf(
SVN_ERR_TEST_FAILED, NULL,
- "End of stream handling failed with blocksize %d",
- (int)sz);
+ "End of stream handling failed with blocksize %u",
+ sz);
}
}
- {
- apr_uint32_t crc = crc32(0, dst_buffer, stream.total_out);
-
- if (stream.total_out != 242014 || crc != 0x8f03d934)
- {
- return svn_error_createf(
- SVN_ERR_TEST_FAILED, NULL,
- "Decompressed data doesn't match expected size or crc with "
- "blocksize %d: Found crc32=0x%08x, size=%d.\n"
- "Verify your ZLib installation, as this should never happen",
- (int)sz, (unsigned)crc, (int)stream.total_out);
- }
- }
+ if (stream.total_out != 242014 || crc != 0x8f03d934)
+ {
+ return svn_error_createf(
+ SVN_ERR_TEST_FAILED, NULL,
+ "Decompressed data doesn't match expected size or crc with "
+ "blocksize %u: Found crc32=0x%08lx, size=%lu.\n"
+ "Verify your ZLib installation, as this should never happen",
+ sz, crc, stream.total_out);
+ }
}
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_serialization(apr_pool_t *pool)
+{
+ svn_checksum_kind_t kind;
+ for (kind = svn_checksum_md5; kind <= svn_checksum_fnv1a_32x4; ++kind)
+ {
+ const svn_checksum_t *parsed_checksum;
+ svn_checksum_t *checksum = svn_checksum_empty_checksum(kind, pool);
+ const char *serialized = svn_checksum_serialize(checksum, pool, pool);
+
+ SVN_ERR(svn_checksum_deserialize(&parsed_checksum, serialized, pool,
+ pool));
+
+ SVN_TEST_ASSERT(parsed_checksum->kind == kind);
+ SVN_TEST_ASSERT(svn_checksum_match(checksum, parsed_checksum));
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_checksum_parse,
"checksum parse"),
SVN_TEST_PASS2(test_checksum_empty,
"checksum emptiness"),
- SVN_TEST_PASS2(test_pseudo_md5,
- "pseudo-md5 compatibility"),
SVN_TEST_PASS2(zero_match,
"zero checksum matching"),
SVN_TEST_OPTS_PASS(zlib_expansion_test,
"zlib expansion test (zlib regression)"),
+ SVN_TEST_PASS2(zero_cross_match,
+ "zero checksum cross-type matching"),
+ SVN_TEST_PASS2(test_serialization,
+ "checksum (de-)serialization"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/compat-test.c b/subversion/tests/libsvn_subr/compat-test.c
index 9ff8099..8414847 100644
--- a/subversion/tests/libsvn_subr/compat-test.c
+++ b/subversion/tests/libsvn_subr/compat-test.c
@@ -209,7 +209,10 @@ test_version_at_least(apr_pool_t *pool)
}
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_version_compatibility,
@@ -220,3 +223,5 @@ struct svn_test_descriptor_t test_funcs[] =
"svn_version__at_least"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/config-test.c b/subversion/tests/libsvn_subr/config-test.c
index 8938457..919893e 100644
--- a/subversion/tests/libsvn_subr/config-test.c
+++ b/subversion/tests/libsvn_subr/config-test.c
@@ -33,48 +33,14 @@
#include <apr_getopt.h>
#include <apr_pools.h>
+#include "svn_dirent_uri.h"
#include "svn_error.h"
#include "svn_config.h"
+#include "private/svn_subr_private.h"
#include "../svn_test.h"
-/* Initialize parameters for the tests. */
-extern int test_argc;
-extern const char **test_argv;
-
-static const apr_getopt_option_t opt_def[] =
- {
- {"srcdir", 'S', 1, "the source directory for VPATH test runs"},
- {0, 0, 0, 0}
- };
-static const char *srcdir = NULL;
-
-static svn_error_t *init_params(apr_pool_t *pool)
-{
- apr_getopt_t *opt;
- int optch;
- const char *opt_arg;
- apr_status_t status;
-
- apr_getopt_init(&opt, pool, test_argc, test_argv);
- while (!(status = apr_getopt_long(opt, opt_def, &optch, &opt_arg)))
- {
- switch (optch)
- {
- case 'S':
- srcdir = opt_arg;
- break;
- }
- }
-
- if (!srcdir)
- return svn_error_create(SVN_ERR_TEST_FAILED, 0,
- "missing required parameter '--srcdir'");
-
- return SVN_NO_ERROR;
-}
-
/* A quick way to create error messages. */
static svn_error_t *
fail(apr_pool_t *pool, const char *fmt, ...)
@@ -89,6 +55,18 @@ fail(apr_pool_t *pool, const char *fmt, ...)
return svn_error_create(SVN_ERR_TEST_FAILED, SVN_NO_ERROR, msg);
}
+static svn_error_t *
+get_config_file_path(const char **cfg_file,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *srcdir;
+
+ SVN_ERR(svn_test_get_srcdir(&srcdir, opts, pool));
+ *cfg_file = svn_dirent_join(srcdir, "config-test.cfg", pool);
+
+ return SVN_NO_ERROR;
+}
static const char *config_keys[] = { "foo", "a", "b", "c", "d", "e", "f", "g",
"h", "i", NULL };
@@ -99,16 +77,14 @@ static const char *config_values[] = { "bar", "Aa", "100", "bar",
"Aa 100", NULL };
static svn_error_t *
-test_text_retrieval(apr_pool_t *pool)
+test_text_retrieval(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
int i;
const char *cfg_file;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
/* Test values retrieved from our ConfigParser instance against
@@ -150,16 +126,14 @@ static const char *false_keys[] = {"false1", "false2", "false3", "false4",
NULL};
static svn_error_t *
-test_boolean_retrieval(apr_pool_t *pool)
+test_boolean_retrieval(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
int i;
const char *cfg_file;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
for (i = 0; true_keys[i] != NULL; i++)
@@ -211,15 +185,13 @@ test_boolean_retrieval(apr_pool_t *pool)
}
static svn_error_t *
-test_has_section_case_insensitive(apr_pool_t *pool)
+test_has_section_case_insensitive(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
const char *cfg_file;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
if (! svn_config_has_section(cfg, "section1"))
@@ -241,15 +213,13 @@ test_has_section_case_insensitive(apr_pool_t *pool)
}
static svn_error_t *
-test_has_section_case_sensitive(apr_pool_t *pool)
+test_has_section_case_sensitive(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
const char *cfg_file;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, FALSE, pool));
if (! svn_config_has_section(cfg, "section1"))
@@ -271,7 +241,8 @@ test_has_section_case_sensitive(apr_pool_t *pool)
}
static svn_error_t *
-test_has_option_case_sensitive(apr_pool_t *pool)
+test_has_option_case_sensitive(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
const char *cfg_file;
@@ -289,10 +260,7 @@ test_has_option_case_sensitive(apr_pool_t *pool)
};
static const int test_data_size = sizeof(test_data)/sizeof(*test_data);
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, TRUE, pool));
for (i = 0; i < test_data_size; ++i)
@@ -313,16 +281,14 @@ test_has_option_case_sensitive(apr_pool_t *pool)
}
static svn_error_t *
-test_stream_interface(apr_pool_t *pool)
+test_stream_interface(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
{
svn_config_t *cfg;
const char *cfg_file;
svn_stream_t *stream;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_stream_open_readonly(&stream, cfg_file, pool, pool));
SVN_ERR(svn_config_parse(&cfg, stream, TRUE, TRUE, pool));
@@ -353,16 +319,42 @@ test_ignore_bom(apr_pool_t *pool)
}
static svn_error_t *
+test_read_only_mode(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_config_t *cfg;
+ svn_config_t *cfg2;
+ const char *cfg_file;
+
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
+ SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, FALSE, pool));
+
+ /* setting CFG to r/o mode shall toggle the r/o mode and expand values */
+
+ SVN_TEST_ASSERT(!svn_config__is_read_only(cfg));
+ SVN_TEST_ASSERT(!svn_config__is_expanded(cfg, "section1", "i"));
+
+ svn_config__set_read_only(cfg, pool);
+
+ SVN_TEST_ASSERT(svn_config__is_read_only(cfg));
+ SVN_TEST_ASSERT(svn_config__is_expanded(cfg, "section1", "i"));
+
+ /* copies should be r/w with values */
+
+ SVN_ERR(svn_config_dup(&cfg2, cfg, pool));
+ SVN_TEST_ASSERT(!svn_config__is_read_only(cfg2));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
test_expand(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
svn_config_t *cfg;
const char *cfg_file, *val;
- if (!srcdir)
- SVN_ERR(init_params(pool));
-
- cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+ SVN_ERR(get_config_file_path(&cfg_file, opts, pool));
SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, FALSE, pool));
/* Get expanded "g" which requires expanding "c". */
@@ -371,13 +363,34 @@ test_expand(const svn_test_opts_t *opts,
/* Get expanded "c". */
svn_config_get(cfg, &val, "section1", "c", NULL);
- /* With pool debugging enabled this ensures that the expanded value
+ /* With pool debugging enabled this ensures that the expanded value
of "c" was not created in a temporary pool when expanding "g". */
SVN_TEST_STRING_ASSERT(val, "bar");
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_invalid_bom(apr_pool_t *pool)
+{
+ svn_config_t *cfg;
+ svn_error_t *err;
+ svn_string_t *cfg_string;
+ svn_stream_t *stream;
+
+ cfg_string = svn_string_create("\xEF", pool);
+ stream = svn_stream_from_string(cfg_string, pool);
+ err = svn_config_parse(&cfg, stream, TRUE, TRUE, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_MALFORMED_FILE);
+
+ cfg_string = svn_string_create("\xEF\xBB", pool);
+ stream = svn_stream_from_string(cfg_string, pool);
+ err = svn_config_parse(&cfg, stream, TRUE, TRUE, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_MALFORMED_FILE);
+
+ return SVN_NO_ERROR;
+}
+
/*
====================================================================
If you add a new test to this file, update this array.
@@ -386,23 +399,33 @@ test_expand(const svn_test_opts_t *opts,
*/
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
- SVN_TEST_PASS2(test_text_retrieval,
- "test svn_config"),
- SVN_TEST_PASS2(test_boolean_retrieval,
- "test svn_config boolean conversion"),
- SVN_TEST_PASS2(test_has_section_case_insensitive,
- "test svn_config_has_section (case insensitive)"),
- SVN_TEST_PASS2(test_has_section_case_sensitive,
- "test svn_config_has_section (case sensitive)"),
- SVN_TEST_PASS2(test_has_option_case_sensitive,
- "test case-sensitive option name lookup"),
- SVN_TEST_PASS2(test_stream_interface,
- "test svn_config_parse"),
- SVN_TEST_PASS2(test_ignore_bom, "test parsing config file with BOM"),
+ SVN_TEST_OPTS_PASS(test_text_retrieval,
+ "test svn_config"),
+ SVN_TEST_OPTS_PASS(test_boolean_retrieval,
+ "test svn_config boolean conversion"),
+ SVN_TEST_OPTS_PASS(test_has_section_case_insensitive,
+ "test svn_config_has_section (case insensitive)"),
+ SVN_TEST_OPTS_PASS(test_has_section_case_sensitive,
+ "test svn_config_has_section (case sensitive)"),
+ SVN_TEST_OPTS_PASS(test_has_option_case_sensitive,
+ "test case-sensitive option name lookup"),
+ SVN_TEST_OPTS_PASS(test_stream_interface,
+ "test svn_config_parse"),
+ SVN_TEST_PASS2(test_ignore_bom,
+ "test parsing config file with BOM"),
+ SVN_TEST_OPTS_PASS(test_read_only_mode,
+ "test r/o mode"),
SVN_TEST_OPTS_PASS(test_expand,
"test variable expansion"),
+ SVN_TEST_PASS2(test_invalid_bom,
+ "test parsing config file with invalid BOM"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/crypto-test.c b/subversion/tests/libsvn_subr/crypto-test.c
index 0c52804..91fd6c7 100644
--- a/subversion/tests/libsvn_subr/crypto-test.c
+++ b/subversion/tests/libsvn_subr/crypto-test.c
@@ -177,7 +177,9 @@ test_passphrase_check(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = -1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_encrypt_decrypt_password,
@@ -186,3 +188,5 @@ struct svn_test_descriptor_t test_funcs[] =
"password checktext generation/validation"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/dirent_uri-test.c b/subversion/tests/libsvn_subr/dirent_uri-test.c
index 992d288..61d9e24 100644
--- a/subversion/tests/libsvn_subr/dirent_uri-test.c
+++ b/subversion/tests/libsvn_subr/dirent_uri-test.c
@@ -270,7 +270,7 @@ test_dirent_join(apr_pool_t *pool)
"\"%s\". expected \"%s\"",
base, comp, result, expect);
- result = svn_dirent_join_many(pool, base, comp, NULL);
+ result = svn_dirent_join_many(pool, base, comp, SVN_VA_NULL);
if (strcmp(result, expect))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"svn_dirent_join_many(\"%s\", \"%s\") returned "
@@ -286,72 +286,72 @@ test_dirent_join(apr_pool_t *pool)
"expected \"%s\"", \
result, expect);
- TEST_MANY((pool, "abc", NULL), "abc");
- TEST_MANY((pool, "/abc", NULL), "/abc");
- TEST_MANY((pool, "/", NULL), "/");
-
- TEST_MANY((pool, "abc", "def", "ghi", NULL), "abc/def/ghi");
- TEST_MANY((pool, "abc", "/def", "ghi", NULL), "/def/ghi");
- TEST_MANY((pool, "/abc", "def", "ghi", NULL), "/abc/def/ghi");
- TEST_MANY((pool, "abc", "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "/def", "/ghi", NULL), "/ghi");
-
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", "ghi", NULL), "def/ghi");
- TEST_MANY((pool, "abc", SVN_EMPTY_PATH, "ghi", NULL), "abc/ghi");
- TEST_MANY((pool, "abc", "def", SVN_EMPTY_PATH, NULL), "abc/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", SVN_EMPTY_PATH, NULL), "def");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "ghi", NULL), "ghi");
- TEST_MANY((pool, "abc", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "abc");
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/ghi", NULL), "/ghi");
-
- TEST_MANY((pool, "/", "def", "ghi", NULL), "/def/ghi");
- TEST_MANY((pool, "abc", "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "abc", "def", "/", NULL), "/");
- TEST_MANY((pool, "/", "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "/", "/", NULL), "/");
- TEST_MANY((pool, "/", SVN_EMPTY_PATH, "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "def", SVN_EMPTY_PATH, NULL), "/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "/");
- TEST_MANY((pool, SVN_EMPTY_PATH, "/", SVN_EMPTY_PATH, NULL), "/");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/", NULL), "/");
+ TEST_MANY((pool, "abc", SVN_VA_NULL), "abc");
+ TEST_MANY((pool, "/abc", SVN_VA_NULL), "/abc");
+ TEST_MANY((pool, "/", SVN_VA_NULL), "/");
+
+ TEST_MANY((pool, "abc", "def", "ghi", SVN_VA_NULL), "abc/def/ghi");
+ TEST_MANY((pool, "abc", "/def", "ghi", SVN_VA_NULL), "/def/ghi");
+ TEST_MANY((pool, "/abc", "def", "ghi", SVN_VA_NULL), "/abc/def/ghi");
+ TEST_MANY((pool, "abc", "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "/def", "/ghi", SVN_VA_NULL), "/ghi");
+
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", "ghi", SVN_VA_NULL), "def/ghi");
+ TEST_MANY((pool, "abc", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "abc/ghi");
+ TEST_MANY((pool, "abc", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "abc/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", SVN_EMPTY_PATH, SVN_VA_NULL), "def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "ghi");
+ TEST_MANY((pool, "abc", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "abc");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/ghi", SVN_VA_NULL), "/ghi");
+
+ TEST_MANY((pool, "/", "def", "ghi", SVN_VA_NULL), "/def/ghi");
+ TEST_MANY((pool, "abc", "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "abc", "def", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "/", "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "/", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "/", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "/", SVN_EMPTY_PATH, SVN_VA_NULL), "/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/", SVN_VA_NULL), "/");
#ifdef SVN_USE_DOS_PATHS
- TEST_MANY((pool, "X:/", "def", "ghi", NULL), "X:/def/ghi");
- TEST_MANY((pool, "abc", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "abc", "def", "X:/", NULL), "X:/");
- TEST_MANY((pool, "X:/", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", "X:/", "/", NULL), "/");
- TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", "def", SVN_EMPTY_PATH, NULL), "X:/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "X:/");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", SVN_EMPTY_PATH, NULL), "X:/");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "X:/", NULL), "X:/");
-
- TEST_MANY((pool, "X:", "def", "ghi", NULL), "X:def/ghi");
- TEST_MANY((pool, "X:", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:", "X:/", "/", NULL), "/");
- TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", NULL), "X:ghi");
- TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, NULL), "X:def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", NULL), "X:ghi");
- TEST_MANY((pool, "//srv/shr", "def", "ghi", NULL), "//srv/shr/def/ghi");
- TEST_MANY((pool, "//srv/shr/fld", "def", "ghi", NULL), "//srv/shr/fld/def/ghi");
- TEST_MANY((pool, "//srv/shr/fld", "def", "//srv/shr", NULL), "//srv/shr");
- TEST_MANY((pool, "//srv/s r/fld", "def", "//srv/s r", NULL), "//srv/s r");
- TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "ghi", NULL), "//srv/shr/fld/def/ghi");
- TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "//srv/shr", NULL), "//srv/shr");
-
- TEST_MANY((pool, "abcd", "/dir", "A:", "file", NULL), "A:file");
- TEST_MANY((pool, "abcd", "A:", "/dir", "file", NULL), "A:/dir/file");
+ TEST_MANY((pool, "X:/", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
+ TEST_MANY((pool, "abc", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "abc", "def", "X:/", SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, "X:/", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", "X:/", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "X:/", SVN_VA_NULL), "X:/");
+
+ TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:def/ghi");
+ TEST_MANY((pool, "X:", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "X:/", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:ghi");
+ TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", SVN_VA_NULL), "X:ghi");
+ TEST_MANY((pool, "//srv/shr", "def", "ghi", SVN_VA_NULL), "//srv/shr/def/ghi");
+ TEST_MANY((pool, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL), "//srv/shr/fld/def/ghi");
+ TEST_MANY((pool, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL), "//srv/shr");
+ TEST_MANY((pool, "//srv/s r/fld", "def", "//srv/s r", SVN_VA_NULL), "//srv/s r");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL), "//srv/shr/fld/def/ghi");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL), "//srv/shr");
+
+ TEST_MANY((pool, "abcd", "/dir", "A:", "file", SVN_VA_NULL), "A:file");
+ TEST_MANY((pool, "abcd", "A:", "/dir", "file", SVN_VA_NULL), "A:/dir/file");
#else /* !SVN_USE_DOS_PATHS */
- TEST_MANY((pool, "X:", "def", "ghi", NULL), "X:/def/ghi");
- TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, NULL), "X:/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
+ TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", SVN_VA_NULL), "X:/ghi");
#endif /* SVN_USE_DOS_PATHS */
/* ### probably need quite a few more tests... */
@@ -809,6 +809,9 @@ static const testcase_canonicalize_t uri_canonical_tests[] =
{ "http://hst/foo/../bar","http://hst/foo/../bar" },
{ "http://hst/", "http://hst" },
{ "http:///", "http://" },
+ { "http:///example.com/", "http:///example.com" },
+ { "http:////example.com/", "http:///example.com" },
+ { "http://///////example.com/", "http:///example.com" },
{ "https://", "https://" },
{ "file:///", "file://" },
{ "file://", "file://" },
@@ -1109,6 +1112,7 @@ test_relpath_is_canonical(apr_pool_t *pool)
static const testcase_is_canonical_t tests[] = {
{ "", TRUE },
{ ".", FALSE },
+ { "..", TRUE },
{ "/", FALSE },
{ "/.", FALSE },
{ "./", FALSE },
@@ -1937,13 +1941,13 @@ test_dirent_get_absolute(apr_pool_t *pool)
expect_abs = expect;
if (*expect == '%')
- expect_abs = apr_pstrcat(pool, curdir, expect + 1, (char *)NULL);
+ expect_abs = apr_pstrcat(pool, curdir, expect + 1, SVN_VA_NULL);
#ifdef SVN_USE_DOS_PATHS
if (*expect == '@')
- expect_abs = apr_pstrcat(pool, curdironc, expect + 1, NULL);
+ expect_abs = apr_pstrcat(pool, curdironc, expect + 1, SVN_VA_NULL);
if (*expect == '$')
- expect_abs = apr_pstrcat(pool, curdrive, expect + 1, NULL);
+ expect_abs = apr_pstrcat(pool, curdrive, expect + 1, SVN_VA_NULL);
/* Remove double '/' when CWD was the root dir (E.g. C:/) */
expect_abs = svn_dirent_canonicalize(expect_abs, pool);
@@ -1987,8 +1991,8 @@ test_dirent_get_absolute_from_lc_drive(apr_pool_t *pool)
for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
{
- const char *dir = svn__apr_hash_index_key(hi);
- svn_io_dirent2_t *de = svn__apr_hash_index_val(hi);
+ const char *dir = apr_hash_this_key(hi);
+ svn_io_dirent2_t *de = apr_hash_this_val(hi);
if (de->kind == svn_node_dir &&
strcmp(dir, current_dir_on_C))
@@ -2857,7 +2861,9 @@ test_rule3(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_dirent_is_root,
@@ -2958,3 +2964,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test match with RFC 6125 s. 6.4.3 Rule 3"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/error-code-test.c b/subversion/tests/libsvn_subr/error-code-test.c
index e996616..8dada36 100644
--- a/subversion/tests/libsvn_subr/error-code-test.c
+++ b/subversion/tests/libsvn_subr/error-code-test.c
@@ -74,10 +74,14 @@ check_error_codes_unique(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(check_error_codes_unique,
"check that error codes are unique"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/error-test.c b/subversion/tests/libsvn_subr/error-test.c
index 18dacde..ea3291b 100644
--- a/subversion/tests/libsvn_subr/error-test.c
+++ b/subversion/tests/libsvn_subr/error-test.c
@@ -205,8 +205,12 @@ test_error_symbolic_name(apr_pool_t *pool)
{ SVN_ERR_WC_NOT_WORKING_COPY, "SVN_ERR_WC_NOT_WORKING_COPY" },
/* Test an implementation detail. */
{ SVN_ERR_BAD_CATEGORY_START, "SVN_ERR_BAD_CONTAINING_POOL" },
+#ifdef SVN_DEBUG
+ { ENOENT, "ENOENT" },
+ { APR_ENOPOOL, "APR_ENOPOOL" },
+#endif
/* Test non-errors. */
- { 1, NULL },
+ { -1, NULL },
{ SVN_ERR_WC_CATEGORY_START - 1, NULL },
/* Whitebox-test exceptional cases. */
{ SVN_WARNING, "SVN_WARNING" },
@@ -225,7 +229,9 @@ test_error_symbolic_name(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_error_root_cause,
@@ -236,3 +242,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_error_symbolic_name"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/hashdump-test.c b/subversion/tests/libsvn_subr/hashdump-test.c
index a80b1c1..57a8535 100644
--- a/subversion/tests/libsvn_subr/hashdump-test.c
+++ b/subversion/tests/libsvn_subr/hashdump-test.c
@@ -38,9 +38,9 @@
/* Our own global variables */
-apr_hash_t *proplist, *new_proplist;
+static apr_hash_t *proplist, *new_proplist;
-const char *review =
+static const char *review =
"A forthright entrance, yet coquettish on the tongue, its deceptively\n"
"fruity exterior hides the warm mahagony undercurrent that is the\n"
"hallmark of Chateau Fraisant-Pitre. Connoisseurs of the region will\n"
@@ -177,7 +177,10 @@ test3(apr_pool_t *pool)
*/
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test1,
@@ -188,3 +191,5 @@ struct svn_test_descriptor_t test_funcs[] =
"write hash out, read back in, compare"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/io-test.c b/subversion/tests/libsvn_subr/io-test.c
index 82e8630..e9de6fb 100644
--- a/subversion/tests/libsvn_subr/io-test.c
+++ b/subversion/tests/libsvn_subr/io-test.c
@@ -26,10 +26,14 @@
#include <stdio.h>
#include <apr.h>
+#include <apr_version.h>
#include "svn_pools.h"
#include "svn_string.h"
+#include "svn_io.h"
#include "private/svn_skel.h"
+#include "private/svn_dep_compat.h"
+#include "private/svn_io_private.h"
#include "../svn_test.h"
#include "../svn_test_fs.h"
@@ -37,7 +41,7 @@
/* Helpers to create the test data directory. */
-#define TEST_DIR "io-test-temp"
+#define TEST_DIR_PREFIX "io-test-temp"
/* The definition for the test data files. */
struct test_file_definition_t
@@ -64,7 +68,7 @@ struct test_file_definition_t
char* created_path;
};
-struct test_file_definition_t test_file_definitions[] =
+static struct test_file_definition_t test_file_definitions_template[] =
{
{"empty", "", 0},
{"single_a", "a", 1},
@@ -119,6 +123,7 @@ struct test_file_definition_t test_file_definitions[] =
static svn_error_t *
create_test_file(struct test_file_definition_t* definition,
+ const char *testname,
apr_pool_t *pool,
apr_pool_t *scratch_pool)
{
@@ -127,6 +132,7 @@ create_test_file(struct test_file_definition_t* definition,
apr_off_t midpos = definition->size / 2;
svn_error_t *err = NULL;
int i;
+ const char *test_dir = apr_pstrcat(pool, TEST_DIR_PREFIX, testname, NULL);
if (definition->size < 5)
SVN_ERR_ASSERT(strlen(definition->data) >= (apr_size_t)definition->size);
@@ -134,9 +140,9 @@ create_test_file(struct test_file_definition_t* definition,
SVN_ERR_ASSERT(strlen(definition->data) >= 5);
- definition->created_path = svn_dirent_join(TEST_DIR,
- definition->name,
- pool);
+ definition->created_path = svn_dirent_join(test_dir,
+ definition->name,
+ pool);
SVN_ERR(svn_io_file_open(&file_h,
definition->created_path,
@@ -174,37 +180,47 @@ create_test_file(struct test_file_definition_t* definition,
/* Function to prepare the whole set of on-disk files to be compared. */
static svn_error_t *
-create_comparison_candidates(apr_pool_t *scratch_pool)
+create_comparison_candidates(struct test_file_definition_t **definitions,
+ const char *testname,
+ apr_pool_t *pool)
{
svn_node_kind_t kind;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
struct test_file_definition_t *candidate;
svn_error_t *err = SVN_NO_ERROR;
+ apr_size_t count = 0;
+ const char *test_dir = apr_pstrcat(pool, TEST_DIR_PREFIX,
+ testname, NULL);
/* If there's already a directory named io-test-temp, delete it.
Doing things this way means that repositories stick around after
a failure for postmortem analysis, but also that tests can be
re-run without cleaning out the repositories created by prior
runs. */
- SVN_ERR(svn_io_check_path(TEST_DIR, &kind, scratch_pool));
+ SVN_ERR(svn_io_check_path(test_dir, &kind, pool));
if (kind == svn_node_dir)
- SVN_ERR(svn_io_remove_dir2(TEST_DIR, TRUE, NULL, NULL, scratch_pool));
+ SVN_ERR(svn_io_remove_dir2(test_dir, TRUE, NULL, NULL, pool));
else if (kind != svn_node_none)
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"There is already a file named '%s'",
- TEST_DIR);
+ test_dir);
- SVN_ERR(svn_io_dir_make(TEST_DIR, APR_OS_DEFAULT, scratch_pool));
+ SVN_ERR(svn_io_dir_make(test_dir, APR_OS_DEFAULT, pool));
- svn_test_add_dir_cleanup(TEST_DIR);
+ svn_test_add_dir_cleanup(test_dir);
- for (candidate = test_file_definitions;
+ for (candidate = test_file_definitions_template;
candidate->name != NULL;
candidate += 1)
+ count++;
+
+ *definitions = apr_pmemdup(pool, test_file_definitions_template,
+ (count + 1) * sizeof(**definitions));
+ for (candidate = *definitions; candidate->name != NULL; candidate += 1)
{
svn_pool_clear(iterpool);
- err = create_test_file(candidate, scratch_pool, iterpool);
+ err = create_test_file(candidate, testname, pool, iterpool);
if (err)
break;
}
@@ -227,8 +243,11 @@ test_two_file_size_comparison(apr_pool_t *scratch_pool)
svn_error_t *err = SVN_NO_ERROR;
svn_error_t *cmp_err;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct test_file_definition_t *test_file_definitions;
- SVN_ERR(create_comparison_candidates(scratch_pool));
+ SVN_ERR(create_comparison_candidates(&test_file_definitions,
+ "test_two_file_size_comparison",
+ scratch_pool));
for (outer = test_file_definitions; outer->name != NULL; outer += 1)
{
@@ -278,8 +297,11 @@ test_two_file_content_comparison(apr_pool_t *scratch_pool)
svn_error_t *err = SVN_NO_ERROR;
svn_error_t *cmp_err;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct test_file_definition_t *test_file_definitions;
- SVN_ERR(create_comparison_candidates(scratch_pool));
+ SVN_ERR(create_comparison_candidates(&test_file_definitions,
+ "test_two_file_content_comparison",
+ scratch_pool));
for (outer = test_file_definitions; outer->name != NULL; outer += 1)
{
@@ -331,8 +353,11 @@ test_three_file_size_comparison(apr_pool_t *scratch_pool)
svn_error_t *err = SVN_NO_ERROR;
svn_error_t *cmp_err;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct test_file_definition_t *test_file_definitions;
- SVN_ERR(create_comparison_candidates(scratch_pool));
+ SVN_ERR(create_comparison_candidates(&test_file_definitions,
+ "test_three_file_size_comparison",
+ scratch_pool));
for (outer = test_file_definitions; outer->name != NULL; outer += 1)
{
@@ -411,8 +436,11 @@ test_three_file_content_comparison(apr_pool_t *scratch_pool)
svn_error_t *err = SVN_NO_ERROR;
svn_error_t *cmp_err;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ struct test_file_definition_t *test_file_definitions;
- SVN_ERR(create_comparison_candidates(scratch_pool));
+ SVN_ERR(create_comparison_candidates(&test_file_definitions,
+ "test_three_file_content_comparison",
+ scratch_pool));
for (outer = test_file_definitions; outer->name != NULL; outer += 1)
{
@@ -507,10 +535,304 @@ read_length_line_shouldnt_loop(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* Move the read pointer in FILE to absolute position OFFSET and align
+ * the read buffer to multiples of BLOCK_SIZE. BUFFERED is set only if
+ * FILE actually uses a read buffer. Use POOL for allocations.
+ */
+static svn_error_t *
+aligned_seek(apr_file_t *file,
+ apr_size_t block_size,
+ apr_size_t offset,
+ svn_boolean_t buffered,
+ apr_pool_t *pool)
+{
+ apr_off_t block_start;
+ apr_off_t current;
+
+ SVN_ERR(svn_io_file_aligned_seek(file, (apr_off_t)block_size,
+ &block_start, (apr_off_t)offset, pool));
+
+ /* block start shall be aligned to multiples of block_size.
+ If it isn't, it must be aligned to APR's default block size(pre-1.3 APR)
+ */
+ if (buffered)
+ {
+ SVN_TEST_ASSERT(block_start % block_size == 0);
+ SVN_TEST_ASSERT(offset - block_start < block_size);
+ }
+
+ /* we must be at the desired offset */
+ current = 0;
+ SVN_ERR(svn_io_file_seek(file, APR_CUR, &current, pool));
+ SVN_TEST_ASSERT(current == (apr_off_t)offset);
+
+ return SVN_NO_ERROR;
+}
+
+/* Move the read pointer in FILE to absolute position OFFSET, align the
+ * read buffer to multiples of BLOCK_SIZE and read one byte from that
+ * position. Verify that it matches the CONTENTS for that offset.
+ * BUFFERED is set only if FILE actually uses a read buffer.
+ * Use POOL for allocations.
+ */
+static svn_error_t *
+aligned_read_at(apr_file_t *file,
+ svn_stringbuf_t *contents,
+ apr_size_t block_size,
+ apr_size_t offset,
+ svn_boolean_t buffered,
+ apr_pool_t *pool)
+{
+ char c;
+ SVN_ERR(aligned_seek(file, block_size, offset, buffered, pool));
+
+ /* the data we read must match whatever we wrote there */
+ SVN_ERR(svn_io_file_getc(&c, file, pool));
+ SVN_TEST_ASSERT(c == contents->data[offset]);
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that aligned seek with the given BLOCK_SIZE works for FILE.
+ * CONTENTS is the data expected from FILE. BUFFERED is set only if FILE
+ * actually uses a read buffer. Use POOL for allocations.
+ */
+static svn_error_t *
+aligned_read(apr_file_t *file,
+ svn_stringbuf_t *contents,
+ apr_size_t block_size,
+ svn_boolean_t buffered,
+ apr_pool_t *pool)
+{
+ apr_size_t i;
+ apr_size_t offset = 0;
+ const apr_size_t prime = 78427;
+
+ /* "random" access to different offsets */
+ for (i = 0, offset = prime; i < 10; ++i, offset += prime)
+ SVN_ERR(aligned_read_at(file, contents, block_size,
+ offset % contents->len, buffered, pool));
+
+ /* we can seek to EOF */
+ SVN_ERR(aligned_seek(file, contents->len, block_size, buffered, pool));
+
+ /* reversed order access to all bytes */
+ for (i = contents->len; i > 0; --i)
+ SVN_ERR(aligned_read_at(file, contents, block_size, i - 1, buffered,
+ pool));
+
+ /* forward order access to all bytes */
+ for (i = 0; i < contents->len; ++i)
+ SVN_ERR(aligned_read_at(file, contents, block_size, i, buffered, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+aligned_seek_test(apr_pool_t *pool)
+{
+ apr_size_t i;
+ const char *tmp_dir;
+ const char *tmp_file;
+ apr_file_t *f;
+ svn_stringbuf_t *contents;
+ const apr_size_t file_size = 100000;
+
+ /* create a temp folder & schedule it for automatic cleanup */
+
+ SVN_ERR(svn_dirent_get_absolute(&tmp_dir, "aligned_seek_tmp", pool));
+ SVN_ERR(svn_io_remove_dir2(tmp_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_make_dir_recursively(tmp_dir, pool));
+ svn_test_add_dir_cleanup(tmp_dir);
+
+ /* create a temp file with know contents */
+
+ contents = svn_stringbuf_create_ensure(file_size, pool);
+ for (i = 0; i < file_size; ++i)
+ svn_stringbuf_appendbyte(contents, (char)rand());
+
+ SVN_ERR(svn_io_write_unique(&tmp_file, tmp_dir, contents->data,
+ contents->len,
+ svn_io_file_del_on_pool_cleanup, pool));
+
+ /* now, access read data with varying alignment sizes */
+ SVN_ERR(svn_io_file_open(&f, tmp_file, APR_READ | APR_BUFFERED,
+ APR_OS_DEFAULT, pool));
+ SVN_ERR(aligned_read(f, contents, 0x1000, TRUE, pool)); /* APR default */
+ SVN_ERR(aligned_read(f, contents, 0x8000, TRUE, pool)); /* "unusual" 32K */
+ SVN_ERR(aligned_read(f, contents, 0x10000, TRUE, pool)); /* FSX default */
+ SVN_ERR(aligned_read(f, contents, 0x100000, TRUE, pool)); /* larger than file */
+ SVN_ERR(aligned_read(f, contents, 10001, TRUE, pool)); /* odd, larger than
+ APR default */
+ SVN_ERR(aligned_read(f, contents, 1003, TRUE, pool)); /* odd, smaller than
+ APR default */
+ SVN_ERR(svn_io_file_close(f, pool));
+
+ /* now, try read data with buffering disabled.
+ That are a special case because APR reports a buffer size of 0. */
+ SVN_ERR(svn_io_file_open(&f, tmp_file, APR_READ, APR_OS_DEFAULT, pool));
+ SVN_ERR(aligned_read(f, contents, 0x1000, FALSE, pool));
+ SVN_ERR(aligned_read(f, contents, 0x8000, FALSE, pool));
+ SVN_ERR(aligned_read(f, contents, 0x10000, FALSE, pool));
+ SVN_ERR(aligned_read(f, contents, 0x100000, FALSE, pool));
+ SVN_ERR(aligned_read(f, contents, 10001, FALSE, pool));
+ SVN_ERR(aligned_read(f, contents, 1003, FALSE, pool));
+ SVN_ERR(svn_io_file_close(f, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+ignore_enoent(apr_pool_t *pool)
+{
+ const char *tmp_dir, *path;
+ const svn_io_dirent2_t *dirent_p;
+ apr_file_t *file;
+
+ /* Create an empty directory. */
+ SVN_ERR(svn_dirent_get_absolute(&tmp_dir, "ignore_enoent", pool));
+ SVN_ERR(svn_io_remove_dir2(tmp_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_make_dir_recursively(tmp_dir, pool));
+ svn_test_add_dir_cleanup(tmp_dir);
+
+ /* Path does not exist. */
+ path = svn_dirent_join(tmp_dir, "not-present", pool);
+ SVN_ERR(svn_io_remove_dir2(path, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_remove_file2(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_only(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_write(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, TRUE, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, FALSE, TRUE, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, TRUE, TRUE, pool, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, FALSE, TRUE, pool, pool));
+
+ /* Neither path nor parent exists. */
+ path = svn_dirent_join(path, "not-present", pool);
+ SVN_ERR(svn_io_remove_dir2(path, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_remove_file2(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_only(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_write(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, TRUE, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, FALSE, TRUE, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, TRUE, TRUE, pool, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, FALSE, TRUE, pool, pool));
+
+ /* File does exist. */
+ path = svn_dirent_join(tmp_dir, "present", pool);
+ SVN_ERR(svn_io_file_open(&file, path,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE,
+ APR_OS_DEFAULT,
+ pool));
+ SVN_ERR(svn_io_file_close(file, pool));
+
+ /* Path does not exist as child of file. */
+ path = svn_dirent_join(path, "not-present", pool);
+ SVN_ERR(svn_io_remove_dir2(path, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_remove_file2(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_only(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_read_write(path, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, TRUE, TRUE, pool));
+ SVN_ERR(svn_io_set_file_executable(path, FALSE, TRUE, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, TRUE, TRUE, pool, pool));
+ SVN_ERR(svn_io_stat_dirent2(&dirent_p, path, FALSE, TRUE, pool, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_install_stream_to_longpath(apr_pool_t *pool)
+{
+ const char *tmp_dir;
+ const char *final_abspath;
+ const char *deep_dir;
+ svn_stream_t *stream;
+ svn_stringbuf_t *actual_content;
+ int i;
+
+ /* Create an empty directory. */
+ SVN_ERR(svn_dirent_get_absolute(&tmp_dir, "test_install_stream_to_longpath",
+ pool));
+ SVN_ERR(svn_io_remove_dir2(tmp_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_make_dir_recursively(tmp_dir, pool));
+ svn_test_add_dir_cleanup(tmp_dir);
+
+ deep_dir = tmp_dir;
+
+ /* Generate very long path (> 260 symbols) */
+ for (i = 0; i < 26; i++)
+ {
+ deep_dir = svn_dirent_join(deep_dir, "1234567890", pool);
+ SVN_ERR(svn_io_make_dir_recursively(deep_dir, pool));
+ }
+
+ final_abspath = svn_dirent_join(deep_dir, "stream1", pool);
+ SVN_ERR(svn_stream__create_for_install(&stream, deep_dir, pool, pool));
+ SVN_ERR(svn_stream_puts(stream, "stream1 content"));
+ SVN_ERR(svn_stream_close(stream));
+ SVN_ERR(svn_stream__install_stream(stream,
+ final_abspath,
+ TRUE,
+ pool));
+
+ SVN_ERR(svn_stringbuf_from_file2(&actual_content,
+ final_abspath,
+ pool));
+
+ SVN_TEST_STRING_ASSERT(actual_content->data, "stream1 content");
+
+ return SVN_NO_ERROR;
+}
+static svn_error_t *
+test_apr_trunc_workaround(apr_pool_t *pool)
+{
+ const char *tmp_dir;
+ const char *tmp_file;
+ apr_file_t *f;
+ apr_size_t len;
+ apr_off_t offset;
+ char dummy;
+
+ /* create a temp folder & schedule it for automatic cleanup */
+ SVN_ERR(svn_dirent_get_absolute(&tmp_dir, "test_apr_trunc_workaround",
+ pool));
+ SVN_ERR(svn_io_remove_dir2(tmp_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_make_dir_recursively(tmp_dir, pool));
+ svn_test_add_dir_cleanup(tmp_dir);
+
+ /* create an r/w file */
+ tmp_file = svn_dirent_join(tmp_dir, "file", pool);
+ SVN_ERR(svn_io_file_open(&f, tmp_file,
+ APR_READ | APR_WRITE | APR_BUFFERED | APR_CREATE |
+ APR_TRUNCATE,
+ APR_OS_DEFAULT, pool));
+
+ /* write some content and put it internally into read mode */
+ len = 10;
+ SVN_ERR(svn_io_file_write(f, "0123456789", &len, pool));
+
+ offset = 0;
+ SVN_ERR(svn_io_file_seek(f, APR_SET, &offset, pool));
+ SVN_ERR(svn_io_file_getc(&dummy, f, pool));
+
+ /* clear the file and write some new content */
+ SVN_ERR(svn_io_file_trunc(f, 0, pool));
+ len = 3;
+ SVN_ERR(svn_io_file_write(f, "abc", &len, pool));
+
+ /* we should now be positioned at the end of the new content */
+ offset = 0;
+ SVN_ERR(svn_io_file_seek(f, APR_CUR, &offset, pool));
+ SVN_TEST_ASSERT(offset == (int)len);
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 3;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_two_file_size_comparison,
@@ -523,5 +845,15 @@ struct svn_test_descriptor_t test_funcs[] =
"three file content comparison"),
SVN_TEST_PASS2(read_length_line_shouldnt_loop,
"svn_io_read_length_line() shouldn't loop"),
+ SVN_TEST_PASS2(aligned_seek_test,
+ "test aligned seek"),
+ SVN_TEST_PASS2(ignore_enoent,
+ "test ignore-enoent"),
+ SVN_TEST_PASS2(test_install_stream_to_longpath,
+ "test svn_stream__install_stream to long path"),
+ SVN_TEST_PASS2(test_apr_trunc_workaround,
+ "test workaround for APR in svn_io_file_trunc"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/mergeinfo-test.c b/subversion/tests/libsvn_subr/mergeinfo-test.c
index ecfcd02..5f4d37e 100644
--- a/subversion/tests/libsvn_subr/mergeinfo-test.c
+++ b/subversion/tests/libsvn_subr/mergeinfo-test.c
@@ -104,7 +104,7 @@ verify_mergeinfo_parse(const char *input,
/* Were we expecting any more ranges? */
if (j < MAX_NBR_RANGES - 1
- && !expected_ranges[j].end == 0)
+ && expected_ranges[j].end != 0)
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"svn_mergeinfo_parse (%s) failed to "
"produce the expected number of ranges",
@@ -114,11 +114,7 @@ verify_mergeinfo_parse(const char *input,
}
-/* Some of our own global variables (for simplicity), which map paths
- -> merge ranges. */
-static apr_hash_t *info1, *info2;
-
-#define NBR_MERGEINFO_VALS 24
+#define NBR_MERGEINFO_VALS 25
/* Valid mergeinfo values. */
static const char * const mergeinfo_vals[NBR_MERGEINFO_VALS] =
@@ -152,7 +148,8 @@ static const char * const mergeinfo_vals[NBR_MERGEINFO_VALS] =
"/A/:7-8",
"/A///:7-8",
"/A/.:7-8",
- "/A/./B:7-8"
+ "/A/./B:7-8",
+ ":7-8",
};
/* Paths corresponding to mergeinfo_vals. */
static const char * const mergeinfo_paths[NBR_MERGEINFO_VALS] =
@@ -185,7 +182,8 @@ static const char * const mergeinfo_paths[NBR_MERGEINFO_VALS] =
"/A",
"/A",
"/A",
- "/A/B"
+ "/A/B",
+ "/",
};
/* First ranges from the paths identified by mergeinfo_paths. */
static svn_merge_range_t mergeinfo_ranges[NBR_MERGEINFO_VALS][MAX_NBR_RANGES] =
@@ -216,6 +214,7 @@ static svn_merge_range_t mergeinfo_ranges[NBR_MERGEINFO_VALS][MAX_NBR_RANGES] =
{ {6, 8, TRUE} },
{ {6, 8, TRUE} },
{ {6, 8, TRUE} },
+ { {6, 8, TRUE} },
};
static svn_error_t *
@@ -268,6 +267,7 @@ test_parse_combine_rangeinfo(apr_pool_t *pool)
{
apr_array_header_t *result;
svn_merge_range_t *resultrange;
+ apr_hash_t *info1;
SVN_ERR(svn_mergeinfo_parse(&info1, single_mergeinfo, pool));
@@ -301,7 +301,7 @@ test_parse_combine_rangeinfo(apr_pool_t *pool)
}
-#define NBR_BROKEN_MERGEINFO_VALS 27
+#define NBR_BROKEN_MERGEINFO_VALS 26
/* Invalid mergeinfo values. */
static const char * const broken_mergeinfo_vals[NBR_BROKEN_MERGEINFO_VALS] =
{
@@ -333,8 +333,6 @@ static const char * const broken_mergeinfo_vals[NBR_BROKEN_MERGEINFO_VALS] =
"/trunk:",
"/trunk:2-9\n/branch:",
"::",
- /* No path */
- ":1-3",
/* Invalid revisions */
"trunk:a-3",
"branch:3-four",
@@ -346,6 +344,7 @@ test_parse_broken_mergeinfo(apr_pool_t *pool)
{
int i;
svn_error_t *err;
+ apr_hash_t *info1;
/* Trigger some error(s) with mal-formed input. */
for (i = 0; i < NBR_BROKEN_MERGEINFO_VALS; i++)
@@ -565,6 +564,7 @@ test_mergeinfo_intersect(apr_pool_t *pool)
{ {0, 1, TRUE}, {2, 4, TRUE}, {11, 12, TRUE} };
svn_rangelist_t *rangelist;
apr_hash_t *intersection;
+ apr_hash_t *info1, *info2;
SVN_ERR(svn_mergeinfo_parse(&info1, "/trunk: 1-6,12-16\n/foo: 31", pool));
SVN_ERR(svn_mergeinfo_parse(&info2, "/trunk: 1,3-4,7,9,11-12", pool));
@@ -701,6 +701,7 @@ test_merge_mergeinfo(apr_pool_t *pool)
{
int j;
svn_string_t *info2_starting, *info2_ending;
+ apr_hash_t *info1, *info2;
SVN_ERR(svn_mergeinfo_parse(&info1, mergeinfo[i].mergeinfo1, pool));
SVN_ERR(svn_mergeinfo_parse(&info2, mergeinfo[i].mergeinfo2, pool));
@@ -1109,6 +1110,7 @@ test_rangelist_to_string(apr_pool_t *pool)
svn_rangelist_t *result;
svn_string_t *output;
svn_string_t *expected = svn_string_create("3,5,7-11,13-14", pool);
+ apr_hash_t *info1;
SVN_ERR(svn_mergeinfo_parse(&info1, mergeinfo1, pool));
@@ -1129,6 +1131,7 @@ test_mergeinfo_to_string(apr_pool_t *pool)
{
svn_string_t *output;
svn_string_t *expected;
+ apr_hash_t *info1, *info2;
expected = svn_string_create("/fred:8-10\n/trunk:3,5,7-11,13-14", pool);
SVN_ERR(svn_mergeinfo_parse(&info1, mergeinfo1, pool));
@@ -1670,7 +1673,9 @@ test_remove_prefix_from_catalog(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_parse_single_line_mergeinfo,
@@ -1711,3 +1716,5 @@ struct svn_test_descriptor_t test_funcs[] =
"removal of prefix paths from catalog keys"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/named_atomic-test-common.h b/subversion/tests/libsvn_subr/named_atomic-test-common.h
deleted file mode 100644
index 2ada4ee..0000000
--- a/subversion/tests/libsvn_subr/named_atomic-test-common.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * named_atomic-test-common.h: shared function implementations for
- * named_atomic-test
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-
-
-#include "../svn_test.h"
-#include "svn_pools.h"
-#include "private/svn_named_atomic.h"
-
-/* Some constants that we will use in our tests */
-
-/* All our atomics start with that name */
-#define ATOMIC_NAME "MyTestAtomic"
-
-/* Factor used to create non-trivial 64 bit numbers */
-#define HUGE_VALUE 1234567890123456ll
-
-/* to separate this code from any production environment */
-const char *name_namespace = NULL;
-const char *name_namespace1 = NULL;
-const char *name_namespace2 = NULL;
-
-/* data structure containing all information we need to check for
- * a) passing some deadline
- * b) reaching the maximum iteration number
- */
-typedef struct watchdog_t
-{
- apr_time_t deadline;
- svn_named_atomic__t *atomic_counter;
- int iterations;
- int call_count; /* don't call apr_time_now() too often '*/
-} watchdog_t;
-
-/* init the WATCHDOG data structure for checking ATOMIC_COUNTER to reach
- * ITERATIONS and for the system time to pass a deadline MAX_DURATION
- * microsecs in the future.
- */
-static void
-init_watchdog(watchdog_t *watchdog,
- svn_named_atomic__t *atomic_counter,
- int iterations,
- apr_time_t max_duration)
-{
- watchdog->deadline = apr_time_now() + max_duration;
- watchdog->atomic_counter = atomic_counter;
- watchdog->iterations = iterations;
- watchdog->call_count = 0;
-}
-
-/* test for watchdog conditions */
-static svn_error_t *
-check_watchdog(watchdog_t *watchdog, svn_boolean_t *done)
-{
- apr_int64_t counter = 0;
-
- /* check for normal end of loop.
- * We are a watchdog, so don't check for errors. */
- *done = FALSE;
- svn_error_clear(svn_named_atomic__read(&counter,
- watchdog->atomic_counter));
- if (counter >= watchdog->iterations)
- {
- *done = TRUE;
- return SVN_NO_ERROR;
- }
-
- /* Check the system time and indicate when deadline has passed */
- if (++watchdog->call_count > 100)
- {
- watchdog->call_count = 100;
- if (apr_time_now() > watchdog->deadline)
- return svn_error_createf(SVN_ERR_TEST_FAILED,
- 0,
- "Deadline has passed at iteration %d/%d",
- (int)counter, watchdog->iterations);
- }
-
- /* no problem so far */
- return SVN_NO_ERROR;
-}
-
-/* "pipeline" test: initialization code executed by the worker with ID 0.
- * Pushes COUNT tokens into ATOMIC_OUT and checks for ATOMIC_COUNTER not to
- * exceed ITERATIONS (early termination).
- */
-static svn_error_t *
-test_pipeline_prepare(svn_named_atomic__t *atomic_out,
- int count,
- watchdog_t *watchdog)
-{
- apr_int64_t value = 0;
- int i;
- svn_boolean_t done = FALSE;
-
- /* Initialize values in thread 0, pass them along in other threads */
-
- for (i = 1; i <= count; ++i)
- do
- {
- /* Generate new token (once the old one has been removed)*/
- SVN_ERR(svn_named_atomic__cmpxchg(&value,
- i,
- 0,
- atomic_out));
- SVN_ERR(check_watchdog(watchdog, &done));
- if (done) return SVN_NO_ERROR;
- }
- while (value != 0);
-
- return SVN_NO_ERROR;
-}
-
-/* "pipeline" test: the main loop. Each one of the COUNT workers receives
- * data in its ATOMIC_IN and passes it on to ATOMIC_OUT until ATOMIC_COUNTER
- * exceeds ITERATIONS.
- */
-static svn_error_t *
-test_pipeline_loop(svn_named_atomic__t *atomic_in,
- svn_named_atomic__t *atomic_out,
- svn_named_atomic__t *atomic_counter,
- int count,
- int iterations,
- watchdog_t *watchdog)
-{
- apr_int64_t value = 0, old_value, last_value = 0;
- apr_int64_t counter;
- svn_boolean_t done = FALSE;
-
- /* Pass the tokens along */
-
- do
- {
- /* Wait for and consume incoming token. */
- do
- {
- SVN_ERR(svn_named_atomic__write(&value, 0, atomic_in));
- SVN_ERR(check_watchdog(watchdog, &done));
- if (done) return SVN_NO_ERROR;
- }
- while (value == 0);
-
- /* All tokes must come in in the same order */
- SVN_TEST_ASSERT((last_value % count) == (value - 1));
- last_value = value;
-
- /* Wait for the target atomic to become vacant and write the token */
- do
- {
- SVN_ERR(svn_named_atomic__cmpxchg(&old_value,
- value,
- 0,
- atomic_out));
- SVN_ERR(check_watchdog(watchdog, &done));
- if (done) return SVN_NO_ERROR;
- }
- while (old_value != 0);
-
- /* Count the number of operations */
- SVN_ERR(svn_named_atomic__add(&counter, 1, atomic_counter));
- }
- while (counter < iterations);
-
- /* done */
-
- return SVN_NO_ERROR;
-}
-
-/* "pipeline" test: worker with ID 0 initializes the data; all workers
- * (COUNT in total) have one input and one output bucket that form a ring
- * spanning all workers. Each worker passes the value along ITERATIONS times.
- */
-static svn_error_t *
-test_pipeline(int id, int count, int iterations, apr_pool_t *pool)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic_in;
- svn_named_atomic__t *atomic_out;
- svn_named_atomic__t *atomic_counter;
- svn_error_t *err = SVN_NO_ERROR;
- watchdog_t watchdog;
-
- /* get the two I/O atomics for this thread */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, pool));
- SVN_ERR(svn_named_atomic__get(&atomic_in,
- ns,
- apr_pstrcat(pool,
- ATOMIC_NAME,
- apr_itoa(pool,
- id),
- NULL),
- FALSE));
- SVN_ERR(svn_named_atomic__get(&atomic_out,
- ns,
- apr_pstrcat(pool,
- ATOMIC_NAME,
- apr_itoa(pool,
- (id + 1) % count),
- NULL),
- FALSE));
-
- /* our iteration counter */
- SVN_ERR(svn_named_atomic__get(&atomic_counter, ns, "counter", FALSE));
-
- /* safeguard our execution time. Limit it to 20s */
- init_watchdog(&watchdog, atomic_counter, iterations, 20000000);
-
- /* fill pipeline */
- if (id == 0)
- err = test_pipeline_prepare(atomic_out, count, &watchdog);
-
- /* Pass the tokens along */
- if (!err)
- err = test_pipeline_loop(atomic_in, atomic_out, atomic_counter,
- count, iterations, &watchdog);
-
- /* if we experienced an error, cause everybody to exit */
- if (err)
- svn_error_clear(svn_named_atomic__write(NULL, iterations, atomic_counter));
-
- /* done */
-
- return err;
-}
diff --git a/subversion/tests/libsvn_subr/named_atomic-test.c b/subversion/tests/libsvn_subr/named_atomic-test.c
deleted file mode 100644
index 05604d2..0000000
--- a/subversion/tests/libsvn_subr/named_atomic-test.c
+++ /dev/null
@@ -1,761 +0,0 @@
-/*
- * named_atomic-test.c: a collection of svn_named_atomic__t tests
- *
- * ====================================================================
- * 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.
- * ====================================================================
- */
-
-/* ====================================================================
- To add tests, look toward the bottom of this file.
-*/
-
-
-#include <stdio.h>
-#include <apr_file_io.h>
-
-#include "svn_io.h"
-
-/* shared test implementation */
-#include "named_atomic-test-common.h"
-
-/* Name of the worker process executable */
-#define TEST_PROC "named_atomic-proc-test"
-
-/* number of hardware threads (logical cores) that we may use.
- * Will be set to at least 2 - even on unicore machines. */
-static int hw_thread_count = 0;
-
-/* number of iterations that we should perform on concurrency tests
- * (will be calibrated to about 1s runtime)*/
-static int suggested_iterations = 0;
-
-/* If possible, translate PROC to a global path and set DIRECTORY to
- * the current directory.
- */
-static svn_error_t *
-adjust_proc_path(const char **proc, const char **directory, apr_pool_t *pool)
-{
-#ifdef WIN32
- /* Under Windows, the test will not be in the current directory
- * and neither will be PROC. Therefore, determine its full path */
- char path [MAX_PATH] = { 0 };
- GetModuleFileNameA(NULL, path, sizeof(path));
- *(strrchr(path, '\\') + 1) = 0;
- *proc = apr_pstrcat(pool, path, *proc, ".exe", NULL);
-
- /* And we need to set the working dir to our working dir to make
- * our sub-processes find all DLLs. */
- GetCurrentDirectoryA(sizeof(path), path);
- *directory = apr_pstrdup(pool, path);
-#endif
-
- return SVN_NO_ERROR;
-}
-
-/* Returns true if PROC can be found and executed.
- */
-static svn_boolean_t
-proc_found(const char *proc, apr_pool_t *pool)
-{
- static svn_tristate_t result = svn_tristate_unknown;
-
- if (result == svn_tristate_unknown)
- {
- svn_error_t *error = SVN_NO_ERROR;
- const char * directory = NULL;
-
- /* all processes and their I/O data */
- apr_proc_t process;
- const char * args[2];
-
- args[0] = proc;
- args[1] = NULL;
- svn_error_clear(adjust_proc_path(&args[0], &directory, pool));
-
- /* try to start the process */
- error = svn_io_start_cmd3(&process,
- directory, /* working directory */
- args[0],
- args,
- NULL, /* environment */
- FALSE, /* no handle inheritance */
- FALSE, /* no STDIN pipe */
- NULL,
- FALSE, /* no STDOUT pipe */
- NULL,
- FALSE, /* no STDERR pipe */
- NULL,
- pool);
- if (!error)
- error = svn_io_wait_for_cmd(&process, proc, NULL, NULL, pool);
-
- result = error ? svn_tristate_false : svn_tristate_true;
- svn_error_clear(error);
- }
-
- return result == svn_tristate_true;
-}
-
-/* Remove temporary files from disk.
- */
-static apr_status_t
-cleanup_test_shm(void *arg)
-{
- apr_pool_t *pool = arg;
-
- svn_error_clear(svn_atomic_namespace__cleanup(name_namespace, pool));
- svn_error_clear(svn_atomic_namespace__cleanup(name_namespace1, pool));
- svn_error_clear(svn_atomic_namespace__cleanup(name_namespace2, pool));
-
- return 0;
-}
-
-/* Bring shared memory to a defined state. This is very useful in case of
- * lingering problems from previous tests or test runs.
- */
-static svn_error_t *
-init_test_shm(apr_pool_t *pool)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic;
- apr_pool_t *scratch = svn_pool_create(pool);
-
- if (name_namespace == NULL)
- {
- apr_pool_t *global_pool = svn_pool_create(NULL);
- SVN_ERR(svn_io_open_unique_file3(NULL,
- &name_namespace,
- NULL,
- svn_io_file_del_on_pool_cleanup,
- global_pool,
- pool));
- SVN_ERR(svn_io_open_unique_file3(NULL,
- &name_namespace1,
- NULL,
- svn_io_file_del_on_pool_cleanup,
- global_pool,
- pool));
- SVN_ERR(svn_io_open_unique_file3(NULL,
- &name_namespace2,
- NULL,
- svn_io_file_del_on_pool_cleanup,
- global_pool,
- pool));
- }
-
- /* skip tests if the current user does not have the required privileges */
- if (!svn_named_atomic__is_supported())
- return svn_error_wrap_apr(SVN_ERR_TEST_SKIPPED,
- "user has insufficient privileges");
-
- /* destroy temp files after usage */
-
- apr_pool_cleanup_register(pool, pool,
- cleanup_test_shm, apr_pool_cleanup_null);
-
- /* get the two I/O atomics for this thread */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, scratch));
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME, TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME "1", TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME "2", TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
-
- svn_pool_clear(scratch);
-
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace1, scratch));
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME, TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- svn_pool_clear(scratch);
-
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace2, scratch));
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME, TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- svn_pool_clear(scratch);
-
- /* done */
-
- return SVN_NO_ERROR;
-}
-
-/* Prepare the shared memory for a run with COUNT workers.
- */
-static svn_error_t *
-init_concurrency_test_shm(apr_pool_t *pool, int count)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic;
- int i;
-
- /* get the two I/O atomics for this thread */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, pool));
-
- /* reset the I/O atomics for all threads */
- for (i = 0; i < count; ++i)
- {
- SVN_ERR(svn_named_atomic__get(&atomic,
- ns,
- apr_pstrcat(pool,
- ATOMIC_NAME,
- apr_itoa(pool, i),
- NULL),
- TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- }
-
- SVN_ERR(svn_named_atomic__get(&atomic, ns, "counter", TRUE));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
-
- return SVN_NO_ERROR;
-}
-
-#if APR_HAS_THREADS
-
-/* our thread function type
- */
-typedef svn_error_t *(*thread_func_t)(int, int, int, apr_pool_t *);
-
-/* Per-thread input and output data.
- */
-struct thread_baton
-{
- int thread_count;
- int thread_no;
- int iterations;
- svn_error_t *result;
- thread_func_t func;
-};
-
-/* APR thread function implementation: A wrapper around baton->func that
- * handles the svn_error_t return value.
- */
-static void *
-APR_THREAD_FUNC test_thread(apr_thread_t *thread, void *baton)
-{
- struct thread_baton *params = baton;
- apr_pool_t *pool = svn_pool_create_ex(NULL, NULL);
-
- params->result = (*params->func)(params->thread_no,
- params->thread_count,
- params->iterations,
- pool);
- svn_pool_destroy(pool);
- apr_thread_exit(thread, APR_SUCCESS);
-
- return NULL;
-}
-
-/* Runs FUNC in COUNT concurrent threads ITERATION times and combines the
- * results.
- */
-static svn_error_t *
-run_threads(apr_pool_t *pool, int count, int iterations, thread_func_t func)
-{
- apr_status_t status;
- int i;
- svn_error_t *error = SVN_NO_ERROR;
-
- /* all threads and their I/O data */
- apr_thread_t **threads = apr_palloc(pool, count * sizeof(*threads));
- struct thread_baton *batons = apr_palloc(pool, count * sizeof(*batons));
-
- /* start threads */
- for (i = 0; i < count; ++i)
- {
- batons[i].thread_count = count;
- batons[i].thread_no = i;
- batons[i].iterations = iterations;
- batons[i].func = func;
-
- status = apr_thread_create(&threads[i],
- NULL,
- test_thread,
- &batons[i],
- pool);
- if (status != APR_SUCCESS)
- SVN_ERR(svn_error_wrap_apr(status, "could not create a thread"));
- }
-
- /* Wait for threads to finish and return result. */
- for (i = 0; i < count; ++i)
- {
- apr_status_t retval;
- status = apr_thread_join(&retval, threads[i]);
- if (status != APR_SUCCESS)
- SVN_ERR(svn_error_wrap_apr(status, "waiting for thread's end failed"));
-
- if (batons[i].result)
- error = svn_error_compose_create (error, svn_error_quick_wrap
- (batons[i].result, apr_psprintf(pool, "Thread %d failed", i)));
- }
-
- return error;
-}
-#endif
-
-/* Runs PROC in COUNT concurrent worker processes and check the results.
- */
-static svn_error_t *
-run_procs(apr_pool_t *pool, const char *proc, int count, int iterations)
-{
- int i, k;
- svn_error_t *error = SVN_NO_ERROR;
- const char * directory = NULL;
-
- /* all processes and their I/O data */
- apr_proc_t *process = apr_palloc(pool, count * sizeof(*process));
- apr_file_t *common_stdout = NULL;
- apr_file_open_stdout(&common_stdout, pool);
-
- SVN_ERR(adjust_proc_path(&proc, &directory, pool));
-
- /* start sub-processes */
- for (i = 0; i < count; ++i)
- {
- const char * args[6];
-
- args[0] = proc;
- args[1] = apr_itoa(pool, i);
- args[2] = apr_itoa(pool, count);
- args[3] = apr_itoa(pool, iterations);
- args[4] = name_namespace;
- args[5] = NULL;
-
- error = svn_io_start_cmd3(&process[i],
- directory, /* working directory */
- args[0],
- args,
- NULL, /* environment */
- FALSE, /* no handle inheritance */
- FALSE, /* no STDIN pipe */
- NULL,
- FALSE, /* consolidate into 1 STDOUT */
- common_stdout,
- FALSE, /* no STDERR pipe */
- NULL,
- pool);
- if (error)
- {
- /* dump program name and parameters */
- for (k = 0; k < sizeof(args) / sizeof(args[0]); ++k)
- if (args[k])
- printf(k == 0 ? "%s\n" : " %s\n", args[k]);
-
- if (directory)
- printf("working folder %s:\n", directory);
-
- return error;
- }
- }
-
- /* Wait for sub-processes to finish and return result. */
- for (i = 0; i < count; ++i)
- {
- const char *cmd = apr_psprintf(pool,
- "named_atomic-test-proc %d %d %d",
- i, count, iterations);
- error = svn_error_compose_create(error,
- svn_io_wait_for_cmd(&process[i],
- cmd, NULL, NULL,
- pool));
- }
-
- return error;
-}
-
-/* Set SUGGESTED_ITERATIONS to a value that COUNT workers will take
- * about 1 second to execute.
- */
-static svn_error_t *
-calibrate_iterations(apr_pool_t *pool, int count)
-{
- apr_time_t start;
- int calib_iterations;
- double taken = 0.0;
-
- /* increase iterations until we pass the 100ms mark */
-
- for (calib_iterations = 10; taken < 100000.0; calib_iterations *= 2)
- {
- apr_pool_t *scratch = svn_pool_create(pool);
- SVN_ERR(init_concurrency_test_shm(scratch, count));
-
- start = apr_time_now();
- SVN_ERR(run_procs(pool, TEST_PROC, count, calib_iterations));
-
- taken = (double)(apr_time_now() - start);
- svn_pool_destroy(scratch);
- }
-
- /* scale that to 1s */
-
- suggested_iterations = (int)(1000000.0 / taken * calib_iterations);
-
- return SVN_NO_ERROR;
-}
-
-/* Find out how far the system will scale, i.e. how many workers can be
- * run concurrently without experiencing significant slowdowns.
- * Sets HW_THREAD_COUNT to a value of 2 .. 32 (limit the system impact in
- * case our heuristics fail) and determines the number of iterations.
- * Can be called multiple times but will skip the calculations after the
- * first successful run.
- */
-static svn_error_t *
-calibrate_concurrency(apr_pool_t *pool)
-{
- if (hw_thread_count == 0)
- {
- /* these parameters should be ok even on very slow machines */
- hw_thread_count = 2;
- suggested_iterations = 100;
-
- /* if we've got a proper machine and OS setup, let's prepare for
- * some real testing */
- if (svn_named_atomic__is_efficient() && proc_found(TEST_PROC, pool))
- {
- SVN_ERR(calibrate_iterations(pool, 2));
- for (; hw_thread_count < 32; hw_thread_count *= 2)
- {
- int saved_suggestion = suggested_iterations;
-
- /* run with an additional core to spare
- * (even low CPU usage might cause heavy context switching) */
- SVN_ERR(calibrate_iterations(pool, hw_thread_count * 2 + 1));
- if (suggested_iterations < 100000)
- {
- /* Machines with only a small number of cores are prone
- * to inconsistent performance due context switching.
- * Reduce the number of iterations on those machines. */
- suggested_iterations = hw_thread_count > 2
- ? saved_suggestion
- : saved_suggestion / 2;
- break;
- }
- }
- }
-
- printf("using %d cores for %d iterations\n", hw_thread_count,
- suggested_iterations);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* The individual tests */
-
-static svn_error_t *
-test_basics(apr_pool_t *pool)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic;
- apr_int64_t value;
-
- SVN_ERR(init_test_shm(pool));
-
- /* Use a separate namespace for our tests isolate them from production */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, pool));
-
- /* Test a non-existing atomic */
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME "x", FALSE));
- SVN_TEST_ASSERT(atomic == NULL);
-
- /* Now, we auto-create it */
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME, TRUE));
- SVN_TEST_ASSERT(atomic != NULL);
-
- /* The default value should be 0 */
- SVN_TEST_ASSERT_ERROR(svn_named_atomic__read(&value, NULL),
- SVN_ERR_BAD_ATOMIC);
- value = 1;
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 0);
-
- /* Write should return the previous value. */
- SVN_TEST_ASSERT_ERROR(svn_named_atomic__write(&value, 0, NULL),
- SVN_ERR_BAD_ATOMIC);
- value = 1;
- SVN_ERR(svn_named_atomic__write(&value, 21, atomic));
- SVN_TEST_ASSERT(value == 0);
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 21);
-
- SVN_ERR(svn_named_atomic__write(&value, 42, atomic));
- SVN_TEST_ASSERT(value == 21);
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 42);
-
- SVN_ERR(svn_named_atomic__write(NULL, 17, atomic));
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 17);
-
- /* Adding & subtracting values */
- SVN_TEST_ASSERT_ERROR(svn_named_atomic__add(&value, 0, NULL),
- SVN_ERR_BAD_ATOMIC);
- SVN_ERR(svn_named_atomic__add(&value, 25, atomic));
- SVN_TEST_ASSERT(value == 42);
- SVN_ERR(svn_named_atomic__add(NULL, 47, atomic));
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 89);
-
- SVN_ERR(svn_named_atomic__add(&value, -25, atomic));
- SVN_TEST_ASSERT(value == 64);
- SVN_ERR(svn_named_atomic__add(NULL, -22, atomic));
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 42);
-
- /* Compare-and-exchange */
- SVN_TEST_ASSERT_ERROR(svn_named_atomic__cmpxchg(&value, 0, 0, NULL),
- SVN_ERR_BAD_ATOMIC);
- value = 1;
- SVN_ERR(svn_named_atomic__cmpxchg(&value, 99, 41, atomic));
- SVN_TEST_ASSERT(value == 42);
-
- value = 1;
- SVN_ERR(svn_named_atomic__cmpxchg(&value, 98, 42, atomic));
- SVN_TEST_ASSERT(value == 42);
- SVN_ERR(svn_named_atomic__cmpxchg(&value, 67, 98, atomic));
- SVN_TEST_ASSERT(value == 98);
-
- SVN_ERR(svn_named_atomic__cmpxchg(NULL, 42, 67, atomic));
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 42);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-test_bignums(apr_pool_t *pool)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic;
- apr_int64_t value;
-
- SVN_ERR(init_test_shm(pool));
-
- /* Use a separate namespace for our tests isolate them from production */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, pool));
-
- /* Auto-create our atomic variable */
- SVN_ERR(svn_named_atomic__get(&atomic, ns, ATOMIC_NAME, TRUE));
- SVN_TEST_ASSERT(atomic != NULL);
-
- /* Write should return the previous value. */
-
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic));
- value = 1;
- SVN_ERR(svn_named_atomic__write(&value, 21 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 0 * HUGE_VALUE);
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 21 * HUGE_VALUE);
-
- SVN_ERR(svn_named_atomic__write(&value, 17 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 21 * HUGE_VALUE);
-
- /* Adding & subtracting values */
- SVN_ERR(svn_named_atomic__add(&value, 25 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 42 * HUGE_VALUE);
- SVN_ERR(svn_named_atomic__add(&value, -25 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 17 * HUGE_VALUE);
-
- /* Compare-and-exchange */
- value = 1;
- SVN_ERR(svn_named_atomic__cmpxchg(&value, 99 * HUGE_VALUE, 41 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 17 * HUGE_VALUE);
-
- value = 1;
- SVN_ERR(svn_named_atomic__cmpxchg(&value, 98 * HUGE_VALUE, 17 * HUGE_VALUE, atomic));
- SVN_TEST_ASSERT(value == 17 * HUGE_VALUE);
- SVN_ERR(svn_named_atomic__read(&value, atomic));
- SVN_TEST_ASSERT(value == 98 * HUGE_VALUE);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-test_multiple_atomics(apr_pool_t *pool)
-{
- svn_atomic_namespace__t *ns;
- svn_named_atomic__t *atomic1;
- svn_named_atomic__t *atomic2;
- svn_named_atomic__t *atomic1_alias;
- svn_named_atomic__t *atomic2_alias;
- apr_int64_t value1;
- apr_int64_t value2;
-
- SVN_ERR(init_test_shm(pool));
-
- /* Use a separate namespace for our tests isolate them from production */
- SVN_ERR(svn_atomic_namespace__create(&ns, name_namespace, pool));
-
- /* Create two atomics */
- SVN_ERR(svn_named_atomic__get(&atomic1, ns, ATOMIC_NAME "1", TRUE));
- SVN_ERR(svn_named_atomic__get(&atomic2, ns, ATOMIC_NAME "2", TRUE));
- SVN_TEST_ASSERT(atomic1 != NULL);
- SVN_TEST_ASSERT(atomic2 != NULL);
- SVN_TEST_ASSERT(atomic1 != atomic2);
-
- /* Get aliases to those */
- SVN_ERR(svn_named_atomic__get(&atomic1_alias, ns, ATOMIC_NAME "1", TRUE));
- SVN_ERR(svn_named_atomic__get(&atomic2_alias, ns, ATOMIC_NAME "2", TRUE));
- SVN_TEST_ASSERT(atomic1 == atomic1_alias);
- SVN_TEST_ASSERT(atomic2 == atomic2_alias);
-
- /* The atomics shall not overlap, i.e. changes to one do not affect the other */
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic1));
- SVN_ERR(svn_named_atomic__write(NULL, 0, atomic2));
- SVN_ERR(svn_named_atomic__write(&value1, 21 * HUGE_VALUE, atomic1));
- SVN_ERR(svn_named_atomic__write(&value2, 42 * HUGE_VALUE, atomic2));
- SVN_TEST_ASSERT(value1 == 0);
- SVN_TEST_ASSERT(value2 == 0);
-
- SVN_ERR(svn_named_atomic__read(&value1, atomic1));
- SVN_ERR(svn_named_atomic__read(&value2, atomic2));
- SVN_TEST_ASSERT(value1 == 21 * HUGE_VALUE);
- SVN_TEST_ASSERT(value2 == 42 * HUGE_VALUE);
-
- SVN_ERR(svn_named_atomic__add(&value1, 25 * HUGE_VALUE, atomic1));
- SVN_ERR(svn_named_atomic__add(&value2, -25 * HUGE_VALUE, atomic2));
- SVN_TEST_ASSERT(value1 == 46 * HUGE_VALUE);
- SVN_TEST_ASSERT(value2 == 17 * HUGE_VALUE);
-
- value1 = 1;
- value2 = 1;
- SVN_ERR(svn_named_atomic__cmpxchg(&value1, 4 * HUGE_VALUE, 46 * HUGE_VALUE, atomic1));
- SVN_ERR(svn_named_atomic__cmpxchg(&value2, 98 * HUGE_VALUE, 17 * HUGE_VALUE, atomic2));
- SVN_TEST_ASSERT(value1 == 46 * HUGE_VALUE);
- SVN_TEST_ASSERT(value2 == 17 * HUGE_VALUE);
-
- SVN_ERR(svn_named_atomic__read(&value1, atomic1));
- SVN_ERR(svn_named_atomic__read(&value2, atomic2));
- SVN_TEST_ASSERT(value1 == 4 * HUGE_VALUE);
- SVN_TEST_ASSERT(value2 == 98 * HUGE_VALUE);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-test_namespaces(apr_pool_t *pool)
-{
- svn_atomic_namespace__t *test_namespace1;
- svn_atomic_namespace__t *test_namespace1_alias;
- svn_atomic_namespace__t *test_namespace2;
- svn_atomic_namespace__t *test_namespace2_alias;
- svn_named_atomic__t *atomic1;
- svn_named_atomic__t *atomic2;
- svn_named_atomic__t *atomic1_alias;
- svn_named_atomic__t *atomic2_alias;
- apr_int64_t value;
-
- SVN_ERR(init_test_shm(pool));
-
- /* Use a separate namespace for our tests isolate them from production */
- SVN_ERR(svn_atomic_namespace__create(&test_namespace1, name_namespace1, pool));
- SVN_ERR(svn_atomic_namespace__create(&test_namespace1_alias, name_namespace1, pool));
- SVN_ERR(svn_atomic_namespace__create(&test_namespace2, name_namespace2, pool));
- SVN_ERR(svn_atomic_namespace__create(&test_namespace2_alias, name_namespace2, pool));
-
- /* Create two atomics with the same name in different namespaces */
- SVN_ERR(svn_named_atomic__get(&atomic1, test_namespace1, ATOMIC_NAME, TRUE));
- SVN_ERR(svn_named_atomic__get(&atomic1_alias, test_namespace1_alias, ATOMIC_NAME, FALSE));
- SVN_ERR(svn_named_atomic__get(&atomic2, test_namespace2, ATOMIC_NAME, TRUE));
- SVN_ERR(svn_named_atomic__get(&atomic2_alias, test_namespace2_alias, ATOMIC_NAME, FALSE));
- SVN_TEST_ASSERT(atomic1 != atomic1_alias);
- SVN_TEST_ASSERT(atomic1_alias != NULL);
- SVN_TEST_ASSERT(atomic2 != atomic2_alias);
- SVN_TEST_ASSERT(atomic2_alias != NULL);
-
- /* Write data to our atomics */
- SVN_ERR(svn_named_atomic__write(NULL, 21 * HUGE_VALUE, atomic1));
- SVN_ERR(svn_named_atomic__write(NULL, 42 * HUGE_VALUE, atomic2));
-
- /* Now check who sees which value */
- SVN_ERR(svn_named_atomic__read(&value, atomic1));
- SVN_TEST_ASSERT(value == 21 * HUGE_VALUE);
- SVN_ERR(svn_named_atomic__read(&value, atomic2));
- SVN_TEST_ASSERT(value == 42 * HUGE_VALUE);
-
- SVN_ERR(svn_named_atomic__read(&value, atomic1_alias));
- SVN_TEST_ASSERT(value == 21 * HUGE_VALUE);
- SVN_ERR(svn_named_atomic__read(&value, atomic2_alias));
- SVN_TEST_ASSERT(value == 42 * HUGE_VALUE);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-test_multithreaded(apr_pool_t *pool)
-{
-#if APR_HAS_THREADS
- SVN_ERR(init_test_shm(pool));
-
- SVN_ERR(calibrate_concurrency(pool));
-
- SVN_ERR(init_concurrency_test_shm(pool, hw_thread_count));
- SVN_ERR(run_threads(pool, hw_thread_count, suggested_iterations, test_pipeline));
-
- return SVN_NO_ERROR;
-#else
- return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, NULL);
-#endif
-}
-
-static svn_error_t *
-test_multiprocess(apr_pool_t *pool)
-{
- if (!proc_found(TEST_PROC, pool))
- return svn_error_wrap_apr(SVN_ERR_TEST_SKIPPED,
- "executable '%s' not found", TEST_PROC);
-
- SVN_ERR(init_test_shm(pool));
-
- SVN_ERR(calibrate_concurrency(pool));
-
- SVN_ERR(init_concurrency_test_shm(pool, hw_thread_count));
- SVN_ERR(run_procs(pool, TEST_PROC, hw_thread_count, suggested_iterations));
-
- return SVN_NO_ERROR;
-}
-
-/*
- ====================================================================
- If you add a new test to this file, update this array.
-
- (These globals are required by our included main())
-*/
-
-/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
- {
- SVN_TEST_NULL,
- SVN_TEST_PASS2(test_basics,
- "basic r/w access to a single atomic"),
- SVN_TEST_PASS2(test_bignums,
- "atomics must be 64 bits"),
- SVN_TEST_PASS2(test_multiple_atomics,
- "basic r/w access to multiple atomics"),
- SVN_TEST_PASS2(test_namespaces,
- "use different namespaces"),
- SVN_TEST_PASS2(test_multithreaded,
- "multithreaded access to atomics"),
- SVN_TEST_PASS2(test_multiprocess,
- "multi-process access to atomics"),
- SVN_TEST_NULL
- };
diff --git a/subversion/tests/libsvn_subr/opt-test.c b/subversion/tests/libsvn_subr/opt-test.c
index a7c570a..c336d81 100644
--- a/subversion/tests/libsvn_subr/opt-test.c
+++ b/subversion/tests/libsvn_subr/opt-test.c
@@ -193,7 +193,9 @@ test_svn_opt_args_to_target_array2(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_parse_peg_rev,
@@ -202,3 +204,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_opt_args_to_target_array2"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/packed-data-test.c b/subversion/tests/libsvn_subr/packed-data-test.c
new file mode 100644
index 0000000..d5d6a20
--- /dev/null
+++ b/subversion/tests/libsvn_subr/packed-data-test.c
@@ -0,0 +1,577 @@
+/*
+ * packed-data-test.c: a collection of svn_packed__* tests
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ====================================================================
+ To add tests, look toward the bottom of this file.
+
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+
+#include "svn_error.h"
+#include "svn_string.h" /* This includes <apr_*.h> */
+#include "private/svn_packed_data.h"
+
+/* Take the WRITE_ROOT, serialize its contents, parse it again into a new
+ * data root and return it in *READ_ROOT. Allocate it in POOL.
+ */
+static svn_error_t*
+get_read_root(svn_packed__data_root_t **read_root,
+ svn_packed__data_root_t *write_root,
+ apr_pool_t *pool)
+{
+ svn_stringbuf_t *stream_buffer = svn_stringbuf_create_empty(pool);
+ svn_stream_t *stream;
+
+ stream = svn_stream_from_stringbuf(stream_buffer, pool);
+ SVN_ERR(svn_packed__data_write(stream, write_root, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ stream = svn_stream_from_stringbuf(stream_buffer, pool);
+ SVN_ERR(svn_packed__data_read(read_root, stream, pool, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_empty_container(apr_pool_t *pool)
+{
+ /* create an empty, readable container */
+ svn_packed__data_root_t *root = svn_packed__data_create_root(pool);
+ SVN_ERR(get_read_root(&root, root, pool));
+
+ /* there should be no sub-streams */
+ SVN_TEST_ASSERT(svn_packed__first_int_stream(root) == NULL);
+ SVN_TEST_ASSERT(svn_packed__first_byte_stream(root) == NULL);
+
+ return SVN_NO_ERROR;
+}
+
+/* Check that COUNT numbers from VALUES can be written as uints to a
+ * packed data stream and can be read from that stream again. Deltify
+ * data in the stream if DIFF is set. Use POOL for allocations.
+ */
+static svn_error_t *
+verify_uint_stream(const apr_uint64_t *values,
+ apr_size_t count,
+ svn_boolean_t diff,
+ apr_pool_t *pool)
+{
+ svn_packed__data_root_t *root = svn_packed__data_create_root(pool);
+ svn_packed__int_stream_t *stream
+ = svn_packed__create_int_stream(root, diff, FALSE);
+
+ apr_size_t i;
+ for (i = 0; i < count; ++i)
+ svn_packed__add_uint(stream, values[i]);
+
+ SVN_ERR(get_read_root(&root, root, pool));
+
+ /* the container should contain exactly one int stream */
+ stream = svn_packed__first_int_stream(root);
+ SVN_TEST_ASSERT(stream);
+ SVN_TEST_ASSERT(!svn_packed__next_int_stream(stream));
+ SVN_TEST_ASSERT(!svn_packed__first_byte_stream(root));
+
+ /* the stream shall contain exactly the items we put into it */
+ SVN_TEST_ASSERT(svn_packed__int_count(stream) == count);
+ for (i = 0; i < count; ++i)
+ SVN_TEST_ASSERT(svn_packed__get_uint(stream) == values[i]);
+
+ /* reading beyond eos should return 0 values */
+ SVN_TEST_ASSERT(svn_packed__get_uint(stream) == 0);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_uint_stream(apr_pool_t *pool)
+{
+ enum { COUNT = 8 };
+ const apr_uint64_t values[COUNT] =
+ {
+ APR_UINT64_MAX,
+ 0,
+ APR_UINT64_MAX,
+ APR_UINT64_C(0x8000000000000000),
+ 0,
+ APR_UINT64_C(0x7fffffffffffffff),
+ APR_UINT64_C(0x1234567890abcdef),
+ APR_UINT64_C(0x0fedcba987654321),
+ };
+
+ SVN_ERR(verify_uint_stream(values, COUNT, FALSE, pool));
+ SVN_ERR(verify_uint_stream(values, COUNT, TRUE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Check that COUNT numbers from VALUES can be written as signed ints to a
+ * packed data stream and can be read from that stream again. Deltify
+ * data in the stream if DIFF is set. Use POOL for allocations.
+ */
+static svn_error_t *
+verify_int_stream(const apr_int64_t *values,
+ apr_size_t count,
+ svn_boolean_t diff,
+ apr_pool_t *pool)
+{
+ svn_packed__data_root_t *root = svn_packed__data_create_root(pool);
+ svn_packed__int_stream_t *stream
+ = svn_packed__create_int_stream(root, diff, TRUE);
+
+ apr_size_t i;
+ for (i = 0; i < count; ++i)
+ svn_packed__add_int(stream, values[i]);
+
+ SVN_ERR(get_read_root(&root, root, pool));
+
+ /* the container should contain exactly one int stream */
+ stream = svn_packed__first_int_stream(root);
+ SVN_TEST_ASSERT(stream);
+ SVN_TEST_ASSERT(!svn_packed__next_int_stream(stream));
+ SVN_TEST_ASSERT(!svn_packed__first_byte_stream(root));
+
+ /* the stream shall contain exactly the items we put into it */
+ SVN_TEST_ASSERT(svn_packed__int_count(stream) == count);
+ for (i = 0; i < count; ++i)
+ SVN_TEST_ASSERT(svn_packed__get_int(stream) == values[i]);
+
+ /* reading beyond eos should return 0 values */
+ SVN_TEST_ASSERT(svn_packed__get_int(stream) == 0);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_int_stream(apr_pool_t *pool)
+{
+ enum { COUNT = 7 };
+ const apr_int64_t values[COUNT] =
+ {
+ APR_INT64_MAX, /* extreme value */
+ APR_INT64_MIN, /* other extreme, creating maximum delta to predecessor */
+ 0, /* delta to predecessor > APR_INT64_MAX */
+ APR_INT64_MAX, /* max value, again */
+ -APR_INT64_MAX, /* _almost_ min value, almost max delta */
+ APR_INT64_C(0x1234567890abcdef), /* some arbitrary value */
+ -APR_INT64_C(0x0fedcba987654321), /* arbitrary value, different sign */
+ };
+
+ SVN_ERR(verify_int_stream(values, COUNT, FALSE, pool));
+ SVN_ERR(verify_int_stream(values, COUNT, TRUE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_byte_stream(apr_pool_t *pool)
+{
+ enum { COUNT = 6 };
+ const svn_string_t values[COUNT] =
+ {
+ { "", 0 },
+ { "\0", 1 },
+ { "\0", 1 },
+ { "some text", 9 },
+ { "", 0 },
+ { "some more", 9 }
+ };
+
+ svn_packed__data_root_t *root = svn_packed__data_create_root(pool);
+ svn_packed__byte_stream_t *stream
+ = svn_packed__create_bytes_stream(root);
+
+ apr_size_t i;
+ for (i = 0; i < COUNT; ++i)
+ svn_packed__add_bytes(stream, values[i].data, values[i].len);
+
+ SVN_ERR(get_read_root(&root, root, pool));
+
+ /* the container should contain exactly one byte stream */
+ stream = svn_packed__first_byte_stream(root);
+ SVN_TEST_ASSERT(stream);
+ SVN_TEST_ASSERT(!svn_packed__next_byte_stream(stream));
+
+ /* the stream shall contain exactly the items we put into it */
+ SVN_TEST_ASSERT(svn_packed__byte_count(stream) == 20);
+ for (i = 0; i < COUNT; ++i)
+ {
+ svn_string_t string;
+ string.data = svn_packed__get_bytes(stream, &string.len);
+
+ SVN_TEST_ASSERT(string.len == values[i].len);
+ SVN_TEST_ASSERT(!memcmp(string.data, values[i].data, string.len));
+ }
+
+ /* reading beyond eos should return 0 values */
+ SVN_TEST_ASSERT(svn_packed__byte_count(stream) == 0);
+
+ return SVN_NO_ERROR;
+}
+
+/* Some simple structure that we use as sub-structure to BASE_RECORD_T.
+ * Have it contain numbers and strings.
+ */
+typedef struct sub_record_t
+{
+ int sub_counter;
+ svn_string_t text;
+} sub_record_t;
+
+/* signed / unsigned, 64 bits and shorter, diff-able and not, multiple
+ * strings, multiple sub-records. */
+typedef struct base_record_t
+{
+ int counter;
+ svn_string_t description;
+ apr_uint64_t large_unsigned1;
+ apr_uint64_t large_unsigned2;
+ const sub_record_t *left_subs;
+ apr_int64_t large_signed1;
+ apr_int64_t large_signed2;
+ unsigned prime;
+ const sub_record_t *right_subs;
+ svn_string_t binary;
+} base_record_t;
+
+/* our test data */
+enum {SUB_RECORD_COUNT = 7};
+enum {BASE_RECORD_COUNT = 4};
+
+static const sub_record_t sub_records[SUB_RECORD_COUNT] =
+{
+ { 6, { "this is quite a longish piece of text", 37} },
+ { 5, { "x", 1} },
+ { 4, { "not empty", 9} },
+ { 3, { "another bit of text", 19} },
+ { 2, { "", 0} },
+ { 1, { "first sub-record", 16} },
+ { 0 }
+};
+
+static const base_record_t test_data[BASE_RECORD_COUNT] =
+{
+ { 1, { "maximum", 7},
+ APR_UINT64_MAX, APR_UINT64_MAX, sub_records,
+ APR_INT64_MAX, APR_INT64_MAX, 9967, sub_records + 1,
+ { "\0\1\2\3\4\5\6\7\x8\x9\xa", 11} },
+
+ { 2, { "minimum", 7},
+ 0, 0, sub_records + 6,
+ APR_INT64_MIN, APR_INT64_MIN, 6029, sub_records + 5,
+ { "X\0\0Y", 4} },
+
+ { 3, { "mean", 4},
+ APR_UINT64_C(0x8000000000000000), APR_UINT64_C(0x8000000000000000),
+ sub_records + 2,
+ 0, 0, 653, sub_records + 3,
+ { "\xff\0\1\2\3\4\5\6\7\x8\x9\xa", 12} },
+
+ { 4, { "random", 6},
+ APR_UINT64_C(0x1234567890abcdef), APR_UINT64_C(0xfedcba987654321),
+ sub_records + 4,
+ APR_INT64_C(0x1234567890abcd), APR_INT64_C(-0xedcba987654321), 7309,
+ sub_records + 1,
+ { "\x80\x7f\0\1\6", 5} }
+};
+
+/* Serialize RECORDS into INT_STREAM and TEXT_STREAM. Stop when the
+ * current record's SUB_COUNTER is 0.
+ */
+static unsigned
+pack_subs(svn_packed__int_stream_t *int_stream,
+ svn_packed__byte_stream_t *text_stream,
+ const sub_record_t *records)
+{
+ unsigned count;
+ for (count = 0; records[count].sub_counter; ++count)
+ {
+ svn_packed__add_int(int_stream, records[count].sub_counter);
+ svn_packed__add_bytes(text_stream,
+ records[count].text.data,
+ records[count].text.len);
+ }
+
+ return count;
+}
+
+/* Serialize COUNT records starting from DATA into a packed data container
+ * allocated in POOL and return the container root.
+ */
+static svn_packed__data_root_t *
+pack(const base_record_t *data,
+ apr_size_t count,
+ apr_pool_t *pool)
+{
+ apr_size_t i;
+ svn_packed__data_root_t *root = svn_packed__data_create_root(pool);
+ svn_packed__int_stream_t *base_stream
+ = svn_packed__create_int_stream(root, FALSE, FALSE);
+ svn_packed__int_stream_t *sub_count_stream
+ = svn_packed__create_int_stream(root, TRUE, FALSE);
+
+ svn_packed__int_stream_t *left_sub_stream
+ = svn_packed__create_int_stream(root, FALSE, TRUE);
+ svn_packed__int_stream_t *right_sub_stream
+ = svn_packed__create_int_stream(root, FALSE, TRUE);
+
+ svn_packed__byte_stream_t *base_description_stream
+ = svn_packed__create_bytes_stream(root);
+ svn_packed__byte_stream_t *base_binary_stream
+ = svn_packed__create_bytes_stream(root);
+ svn_packed__byte_stream_t *sub_text_stream
+ = svn_packed__create_bytes_stream(root);
+
+ svn_packed__create_int_substream(base_stream, TRUE, TRUE); /* counter */
+ svn_packed__create_int_substream(base_stream, TRUE, FALSE); /* large_unsigned1 */
+ svn_packed__create_int_substream(base_stream, FALSE, FALSE); /* large_unsigned2 */
+ svn_packed__create_int_substream(base_stream, TRUE, TRUE); /* large_signed1 */
+ svn_packed__create_int_substream(base_stream, FALSE, TRUE); /* large_signed2 */
+ svn_packed__create_int_substream(base_stream, TRUE, FALSE); /* prime */
+
+ for (i = 0; i < count; ++i)
+ {
+ svn_packed__add_int(base_stream, data[i].counter);
+ svn_packed__add_bytes(base_description_stream,
+ data[i].description.data,
+ data[i].description.len);
+ svn_packed__add_uint(base_stream, data[i].large_unsigned1);
+ svn_packed__add_uint(base_stream, data[i].large_unsigned2);
+ svn_packed__add_uint(sub_count_stream,
+ pack_subs(left_sub_stream, sub_text_stream,
+ data[i].left_subs));
+
+ svn_packed__add_int(base_stream, data[i].large_signed1);
+ svn_packed__add_int(base_stream, data[i].large_signed2);
+ svn_packed__add_uint(base_stream, data[i].prime);
+ svn_packed__add_uint(sub_count_stream,
+ pack_subs(right_sub_stream, sub_text_stream,
+ data[i].right_subs));
+
+ svn_packed__add_bytes(base_binary_stream,
+ data[i].binary.data,
+ data[i].binary.len);
+ }
+
+ return root;
+}
+
+/* Deserialize COUNT records from INT_STREAM and TEXT_STREAM and return
+ * the result allocated in POOL.
+ */
+static sub_record_t *
+unpack_subs(svn_packed__int_stream_t *int_stream,
+ svn_packed__byte_stream_t *text_stream,
+ apr_size_t count,
+ apr_pool_t *pool)
+{
+ sub_record_t *records = apr_pcalloc(pool, (count + 1) * sizeof(*records));
+
+ apr_size_t i;
+ for (i = 0; i < count; ++i)
+ {
+ records[i].sub_counter = (int) svn_packed__get_int(int_stream);
+ records[i].text.data = svn_packed__get_bytes(text_stream,
+ &records[i].text.len);
+ }
+
+ return records;
+}
+
+/* Deserialize all records from the packed data container ROOT, allocate
+ * them in POOL and return them. Set *COUNT to the number of records read.
+ */
+static base_record_t *
+unpack(apr_size_t *count,
+ svn_packed__data_root_t *root,
+ apr_pool_t *pool)
+{
+ svn_packed__int_stream_t *base_stream
+ = svn_packed__first_int_stream(root);
+ svn_packed__int_stream_t *sub_count_stream
+ = svn_packed__next_int_stream(base_stream);
+ svn_packed__byte_stream_t *base_description_stream
+ = svn_packed__first_byte_stream(root);
+ svn_packed__byte_stream_t *base_binary_stream
+ = svn_packed__next_byte_stream(base_description_stream);
+ svn_packed__byte_stream_t *sub_text_stream
+ = svn_packed__next_byte_stream(base_binary_stream);
+
+ svn_packed__int_stream_t *left_sub_stream
+ = svn_packed__next_int_stream(sub_count_stream);
+ svn_packed__int_stream_t *right_sub_stream
+ = svn_packed__next_int_stream(left_sub_stream);
+
+ apr_size_t i;
+ base_record_t *data;
+ *count = svn_packed__int_count(sub_count_stream) / 2;
+ data = apr_pcalloc(pool, *count * sizeof(*data));
+
+ for (i = 0; i < *count; ++i)
+ {
+ data[i].counter = (int) svn_packed__get_int(base_stream);
+ data[i].description.data
+ = svn_packed__get_bytes(base_description_stream,
+ &data[i].description.len);
+ data[i].large_unsigned1 = svn_packed__get_uint(base_stream);
+ data[i].large_unsigned2 = svn_packed__get_uint(base_stream);
+ data[i].left_subs = unpack_subs(left_sub_stream, sub_text_stream,
+ (apr_size_t)svn_packed__get_uint(sub_count_stream),
+ pool);
+
+ data[i].large_signed1 = svn_packed__get_int(base_stream);
+ data[i].large_signed2 = svn_packed__get_int(base_stream);
+ data[i].prime = (unsigned) svn_packed__get_uint(base_stream);
+ data[i].right_subs = unpack_subs(right_sub_stream, sub_text_stream,
+ (apr_size_t)svn_packed__get_uint(sub_count_stream),
+ pool);
+
+ data[i].binary.data
+ = svn_packed__get_bytes(base_binary_stream,
+ &data[i].binary.len);
+ }
+
+ return data;
+}
+
+/* Assert that LHS and RHS contain the same binary data (i.e. don't test
+ * for a terminating NUL).
+ */
+static svn_error_t *
+compare_binary(const svn_string_t *lhs,
+ const svn_string_t *rhs)
+{
+ SVN_TEST_ASSERT(lhs->len == rhs->len);
+ SVN_TEST_ASSERT(!memcmp(lhs->data, rhs->data, rhs->len));
+
+ return SVN_NO_ERROR;
+}
+
+/* Assert that LHS and RHS contain the same number of records with the
+ * same contents.
+ */
+static svn_error_t *
+compare_subs(const sub_record_t *lhs,
+ const sub_record_t *rhs)
+{
+ for (; lhs->sub_counter; ++lhs, ++rhs)
+ {
+ SVN_TEST_ASSERT(lhs->sub_counter == rhs->sub_counter);
+ SVN_ERR(compare_binary(&lhs->text, &rhs->text));
+ }
+
+ SVN_TEST_ASSERT(lhs->sub_counter == rhs->sub_counter);
+ return SVN_NO_ERROR;
+}
+
+/* Assert that the first COUNT records in LHS and RHS have the same contents.
+ */
+static svn_error_t *
+compare(const base_record_t *lhs,
+ const base_record_t *rhs,
+ apr_size_t count)
+{
+ apr_size_t i;
+ for (i = 0; i < count; ++i)
+ {
+ SVN_TEST_ASSERT(lhs[i].counter == rhs[i].counter);
+ SVN_ERR(compare_binary(&lhs[i].description, &rhs[i].description));
+ SVN_TEST_ASSERT(lhs[i].large_unsigned1 == rhs[i].large_unsigned1);
+ SVN_TEST_ASSERT(lhs[i].large_unsigned2 == rhs[i].large_unsigned2);
+ SVN_ERR(compare_subs(lhs[i].left_subs, rhs[i].left_subs));
+ SVN_TEST_ASSERT(lhs[i].counter == rhs[i].counter);
+ SVN_TEST_ASSERT(lhs[i].large_signed1 == rhs[i].large_signed1);
+ SVN_TEST_ASSERT(lhs[i].large_signed2 == rhs[i].large_signed2);
+ SVN_TEST_ASSERT(lhs[i].prime == rhs[i].prime);
+ SVN_ERR(compare_subs(lhs[i].right_subs, rhs[i].right_subs));
+ SVN_ERR(compare_binary(&lhs[i].binary, &rhs[i].binary));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_empty_structure(apr_pool_t *pool)
+{
+ base_record_t *unpacked;
+ apr_size_t count;
+
+ /* create an empty, readable container */
+ svn_packed__data_root_t *root = pack(test_data, 0, pool);
+
+ SVN_ERR(get_read_root(&root, root, pool));
+ unpacked = unpack(&count, root, pool);
+ SVN_TEST_ASSERT(count == 0);
+ SVN_ERR(compare(unpacked, test_data, count));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_full_structure(apr_pool_t *pool)
+{
+ base_record_t *unpacked;
+ apr_size_t count;
+
+ /* create an empty, readable container */
+ svn_packed__data_root_t *root = pack(test_data, BASE_RECORD_COUNT, pool);
+
+ SVN_ERR(get_read_root(&root, root, pool));
+ unpacked = unpack(&count, root, pool);
+ SVN_TEST_ASSERT(count == BASE_RECORD_COUNT);
+ SVN_ERR(compare(unpacked, test_data, count));
+
+ return SVN_NO_ERROR;
+}
+
+/* An array of all test functions */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_empty_container,
+ "test empty container"),
+ SVN_TEST_PASS2(test_uint_stream,
+ "test a single uint stream"),
+ SVN_TEST_PASS2(test_int_stream,
+ "test a single int stream"),
+ SVN_TEST_PASS2(test_byte_stream,
+ "test a single bytes stream"),
+ SVN_TEST_PASS2(test_empty_structure,
+ "test empty, nested structure"),
+ SVN_TEST_PASS2(test_full_structure,
+ "test nested structure"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/path-test.c b/subversion/tests/libsvn_subr/path-test.c
index ec35176..6f0a996 100644
--- a/subversion/tests/libsvn_subr/path-test.c
+++ b/subversion/tests/libsvn_subr/path-test.c
@@ -315,9 +315,9 @@ test_uri_decode(apr_pool_t *pool)
const char *path;
const char *result;
} tests[] = {
- { "http://c.r.a/s%\0008me",
+ { "http://c.r.a/s%\0" "8me",
"http://c.r.a/s%"},
- { "http://c.r.a/s%6\000me",
+ { "http://c.r.a/s%6\0" "me",
"http://c.r.a/s%6" },
{ "http://c.r.a/s%68me",
"http://c.r.a/shme" },
@@ -489,7 +489,7 @@ test_path_join(apr_pool_t *pool)
if (svn_path_is_url(base))
continue;
- result = svn_path_join_many(pool, base, comp, NULL);
+ result = svn_path_join_many(pool, base, comp, SVN_VA_NULL);
if (strcmp(result, expect))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"svn_path_join_many(\"%s\", \"%s\") returned "
@@ -505,74 +505,74 @@ test_path_join(apr_pool_t *pool)
"expected \"%s\"", \
result, expect);
- TEST_MANY((pool, "abc", NULL), "abc");
- TEST_MANY((pool, "/abc", NULL), "/abc");
- TEST_MANY((pool, "/", NULL), "/");
-
- TEST_MANY((pool, "abc", "def", "ghi", NULL), "abc/def/ghi");
- TEST_MANY((pool, "abc", "/def", "ghi", NULL), "/def/ghi");
- TEST_MANY((pool, "/abc", "def", "ghi", NULL), "/abc/def/ghi");
- TEST_MANY((pool, "abc", "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "/def", "/ghi", NULL), "/ghi");
-
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", "ghi", NULL), "def/ghi");
- TEST_MANY((pool, "abc", SVN_EMPTY_PATH, "ghi", NULL), "abc/ghi");
- TEST_MANY((pool, "abc", "def", SVN_EMPTY_PATH, NULL), "abc/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", SVN_EMPTY_PATH, NULL), "def");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "ghi", NULL), "ghi");
- TEST_MANY((pool, "abc", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "abc");
- TEST_MANY((pool, SVN_EMPTY_PATH, "def", "/ghi", NULL), "/ghi");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/ghi", NULL), "/ghi");
-
- TEST_MANY((pool, "/", "def", "ghi", NULL), "/def/ghi");
- TEST_MANY((pool, "abc", "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "abc", "def", "/", NULL), "/");
- TEST_MANY((pool, "/", "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "/", "/", NULL), "/");
- TEST_MANY((pool, "/", SVN_EMPTY_PATH, "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", "def", SVN_EMPTY_PATH, NULL), "/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "/", "ghi", NULL), "/ghi");
- TEST_MANY((pool, "/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "/");
- TEST_MANY((pool, SVN_EMPTY_PATH, "/", SVN_EMPTY_PATH, NULL), "/");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/", NULL), "/");
+ TEST_MANY((pool, "abc", SVN_VA_NULL), "abc");
+ TEST_MANY((pool, "/abc", SVN_VA_NULL), "/abc");
+ TEST_MANY((pool, "/", SVN_VA_NULL), "/");
+
+ TEST_MANY((pool, "abc", "def", "ghi", SVN_VA_NULL), "abc/def/ghi");
+ TEST_MANY((pool, "abc", "/def", "ghi", SVN_VA_NULL), "/def/ghi");
+ TEST_MANY((pool, "/abc", "def", "ghi", SVN_VA_NULL), "/abc/def/ghi");
+ TEST_MANY((pool, "abc", "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "/def", "/ghi", SVN_VA_NULL), "/ghi");
+
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", "ghi", SVN_VA_NULL), "def/ghi");
+ TEST_MANY((pool, "abc", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "abc/ghi");
+ TEST_MANY((pool, "abc", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "abc/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", SVN_EMPTY_PATH, SVN_VA_NULL), "def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "ghi");
+ TEST_MANY((pool, "abc", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "abc");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "def", "/ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/ghi", SVN_VA_NULL), "/ghi");
+
+ TEST_MANY((pool, "/", "def", "ghi", SVN_VA_NULL), "/def/ghi");
+ TEST_MANY((pool, "abc", "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "abc", "def", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "/", "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "/", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "/", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "/", "ghi", SVN_VA_NULL), "/ghi");
+ TEST_MANY((pool, "/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "/", SVN_EMPTY_PATH, SVN_VA_NULL), "/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "/", SVN_VA_NULL), "/");
#ifdef SVN_USE_DOS_PATHS
/* These will fail, see issue #2028
- TEST_MANY((pool, "X:", "def", "ghi", NULL), "X:def/ghi");
- TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", NULL), "X:ghi");
- TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, NULL), "X:def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", NULL), "X:ghi");
- TEST_MANY((pool, "X:/", "def", "ghi", NULL), "X:/def/ghi");
- TEST_MANY((pool, "abc", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "abc", "def", "X:/", NULL), "X:/");
- TEST_MANY((pool, "X:/", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", "X:/", "/", NULL), "/");
- TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", "def", SVN_EMPTY_PATH, NULL), "X:/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, NULL), "X:/");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", SVN_EMPTY_PATH, NULL), "X:/");
- TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "X:/", NULL), "X:/");
- TEST_MANY((pool, "X:", "X:/", "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:", "X:/", "/", NULL), "/");
-
- TEST_MANY((pool, "//srv/shr", "def", "ghi", NULL), "//srv/shr/def/ghi");
- TEST_MANY((pool, "//srv", "shr", "def", "ghi", NULL), "//srv/shr/def/ghi");
- TEST_MANY((pool, "//srv/shr/fld", "def", "ghi", NULL),
+ TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:def/ghi");
+ TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:ghi");
+ TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", SVN_VA_NULL), "X:ghi");
+ TEST_MANY((pool, "X:/", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
+ TEST_MANY((pool, "abc", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "abc", "def", "X:/", SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, "X:/", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", "X:/", "/", SVN_VA_NULL), "/");
+ TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:/", SVN_EMPTY_PATH, SVN_EMPTY_PATH, SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:/", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, SVN_EMPTY_PATH, SVN_EMPTY_PATH, "X:/", SVN_VA_NULL), "X:/");
+ TEST_MANY((pool, "X:", "X:/", "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "X:/", "/", SVN_VA_NULL), "/");
+
+ TEST_MANY((pool, "//srv/shr", "def", "ghi", SVN_VA_NULL), "//srv/shr/def/ghi");
+ TEST_MANY((pool, "//srv", "shr", "def", "ghi", SVN_VA_NULL), "//srv/shr/def/ghi");
+ TEST_MANY((pool, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL),
"//srv/shr/fld/def/ghi");
- TEST_MANY((pool, "//srv/shr/fld", "def", "//srv/shr", NULL), "//srv/shr");
- TEST_MANY((pool, "//srv", "shr", "//srv/shr", NULL), "//srv/shr");
- TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "ghi", NULL),
+ TEST_MANY((pool, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL), "//srv/shr");
+ TEST_MANY((pool, "//srv", "shr", "//srv/shr", SVN_VA_NULL), "//srv/shr");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "ghi", SVN_VA_NULL),
"//srv/shr/fld/def/ghi");
- TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "//srv/shr", NULL),
+ TEST_MANY((pool, SVN_EMPTY_PATH, "//srv/shr/fld", "def", "//srv/shr", SVN_VA_NULL),
"//srv/shr");
*/
#else /* WIN32 or Cygwin */
- TEST_MANY((pool, "X:", "def", "ghi", NULL), "X:/def/ghi");
- TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", NULL), "X:/ghi");
- TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, NULL), "X:/def");
- TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "def", "ghi", SVN_VA_NULL), "X:/def/ghi");
+ TEST_MANY((pool, "X:", SVN_EMPTY_PATH, "ghi", SVN_VA_NULL), "X:/ghi");
+ TEST_MANY((pool, "X:", "def", SVN_EMPTY_PATH, SVN_VA_NULL), "X:/def");
+ TEST_MANY((pool, SVN_EMPTY_PATH, "X:", "ghi", SVN_VA_NULL), "X:/ghi");
#endif /* non-WIN32 */
/* ### probably need quite a few more tests... */
@@ -1210,6 +1210,7 @@ test_path_splitext(apr_pool_t *pool)
{ "yep.still/no-ext", "yep.still/no-ext", "" },
{ "folder.with/period.log", "folder.with/period.", "log" },
{ "period.", "period.", "" },
+ { "dir/period.", "dir/period.", "" },
{ "file.ends-with/period.", "file.ends-with/period.", "" },
{ "two-periods..txt", "two-periods..", "txt" },
{ ".dot-file", ".dot-file", "" },
@@ -1527,7 +1528,7 @@ condense_targets_tests_helper(const char* title,
/* Verify the common part with the expected (prefix with cwd). */
if (*exp_common == '%')
- exp_common_abs = apr_pstrcat(pool, curdir, exp_common + 1, (char *)NULL);
+ exp_common_abs = apr_pstrcat(pool, curdir, exp_common + 1, SVN_VA_NULL);
if (strcmp(common_path, exp_common_abs) != 0)
{
@@ -1544,7 +1545,7 @@ condense_targets_tests_helper(const char* title,
{
const char * target = APR_ARRAY_IDX(condensed_targets, i, const char*);
if (token && (*token == '%'))
- token = apr_pstrcat(pool, curdir, token + 1, (char *)NULL);
+ token = apr_pstrcat(pool, curdir, token + 1, SVN_VA_NULL);
if (! token ||
(target && (strcmp(target, token) != 0)))
{
@@ -1700,7 +1701,9 @@ test_path_resolve_repos_relative_url(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_path_is_child,
@@ -1759,3 +1762,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_path_resolve_repos_relative_url"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/prefix-string-test.c b/subversion/tests/libsvn_subr/prefix-string-test.c
new file mode 100644
index 0000000..e420cff
--- /dev/null
+++ b/subversion/tests/libsvn_subr/prefix-string-test.c
@@ -0,0 +1,154 @@
+/*
+ * prefix-string-test.c: a collection of svn_prefix_string__* tests
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ====================================================================
+ To add tests, look toward the bottom of this file.
+
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+
+#include "svn_error.h"
+#include "svn_string.h" /* This includes <apr_*.h> */
+#include "private/svn_string_private.h"
+
+static svn_error_t *
+test_empty_string(apr_pool_t *pool)
+{
+ svn_prefix_tree__t *tree = svn_prefix_tree__create(pool);
+ svn_prefix_string__t *empty = svn_prefix_string__create(tree, "");
+
+ /* same instance for all strings of the same value */
+ SVN_TEST_ASSERT(empty == svn_prefix_string__create(tree, ""));
+
+ /* does it actually have the right contents? */
+ SVN_TEST_ASSERT(svn_prefix_string__expand(empty, pool)->len == 0);
+ SVN_TEST_STRING_ASSERT(svn_prefix_string__expand(empty, pool)->data, "");
+
+ /* strings shall be equal to themselves */
+ SVN_TEST_ASSERT(0 == svn_prefix_string__compare(empty, empty));
+
+ return SVN_NO_ERROR;
+}
+
+enum {TEST_CASE_COUNT = 9};
+
+static const char *test_cases[TEST_CASE_COUNT] =
+{
+ "a longish string of sorts, longer than 7 anyway",
+ "some other string",
+ "more stuff on root",
+ "some shorter string",
+ "some short string",
+ "some short str",
+ "some short str2",
+ "a longish string of sorts, longer than ?! anyway",
+ "a"
+};
+
+static svn_error_t *
+test_string_creation(apr_pool_t *pool)
+{
+ svn_prefix_tree__t *tree = svn_prefix_tree__create(pool);
+ svn_prefix_string__t *strings[TEST_CASE_COUNT];
+ int i;
+
+ /* create strings and remember their initial references */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ strings[i] = svn_prefix_string__create(tree, test_cases[i]);
+
+ /* doing this again must yield the same pointers */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ SVN_TEST_ASSERT(strings[i]
+ == svn_prefix_string__create(tree, test_cases[i]));
+
+ /* converting them back to strings must be the initial values */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ {
+ svn_string_t *expanded = svn_prefix_string__expand(strings[i], pool);
+
+ SVN_TEST_ASSERT(expanded->len == strlen(test_cases[i]));
+ SVN_TEST_STRING_ASSERT(expanded->data, test_cases[i]);
+
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_string_comparison(apr_pool_t *pool)
+{
+ svn_prefix_tree__t *tree = svn_prefix_tree__create(pool);
+ svn_prefix_string__t *strings[TEST_CASE_COUNT];
+ int i, k;
+
+ /* create strings */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ strings[i] = svn_prefix_string__create(tree, test_cases[i]);
+
+ /* comparing them with themselves */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ SVN_TEST_ASSERT(! svn_prefix_string__compare(strings[i], strings[i]));
+
+ /* compare with all other strings */
+ for (i = 0; i < TEST_CASE_COUNT; ++i)
+ {
+ svn_string_t *lhs = svn_prefix_string__expand(strings[i], pool);
+ for (k = 0; k < TEST_CASE_COUNT; ++k)
+ {
+ svn_string_t *rhs = svn_prefix_string__expand(strings[k], pool);
+ int expected_diff = strcmp(lhs->data, rhs->data);
+ int actual_diff = svn_prefix_string__compare(strings[i], strings[k]);
+
+ SVN_TEST_ASSERT((actual_diff < 0) == (expected_diff < 0));
+ SVN_TEST_ASSERT((actual_diff > 0) == (expected_diff > 0));
+ SVN_TEST_ASSERT(!actual_diff == !expected_diff);
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* An array of all test functions */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_empty_string,
+ "check empty strings"),
+ SVN_TEST_PASS2(test_string_creation,
+ "create many strings"),
+ SVN_TEST_PASS2(test_string_comparison,
+ "compare strings"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/priority-queue-test.c b/subversion/tests/libsvn_subr/priority-queue-test.c
new file mode 100644
index 0000000..bd2d991
--- /dev/null
+++ b/subversion/tests/libsvn_subr/priority-queue-test.c
@@ -0,0 +1,240 @@
+/*
+ * priority-queue-test.c: a collection of svn_priority_queue__* tests
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+/* ====================================================================
+ To add tests, look toward the bottom of this file.
+
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <apr_pools.h>
+
+#include "../svn_test.h"
+
+#include "svn_error.h"
+#include "private/svn_sorts_private.h"
+
+/* priority queue test:
+ * items in the queue are simple integers, in ascending order */
+
+/* number of items to put into the queue */
+enum {NUMBER_COUNT = 11};
+
+/* the actual values in the order we add them to the queue */
+static const int numbers[NUMBER_COUNT]
+ = { 8395, 0, -1, 3885, 1, -435, 99993, 10, 0, 1, 8395 };
+
+/* test_update will modify in-queue data and expects the queue to return
+ the values in the following order: */
+static const int expected_modified[NUMBER_COUNT]
+ = { -431, 0, 1, 3, 5, 10, 16, 3889, 8395, 8403, 99997 };
+
+/* standard compare function for integers */
+static int
+compare_func(const void *lhs, const void *rhs)
+{
+ return *(const int *)lhs - *(const int *)rhs;
+}
+
+/* Check that QUEUE is empty and the usual operations still work */
+static svn_error_t *
+verify_empty_queue(svn_priority_queue__t *queue)
+{
+ /* it's an empty queue */
+ SVN_TEST_ASSERT(svn_priority_queue__size(queue) == 0);
+ SVN_TEST_ASSERT(svn_priority_queue__peek(queue) == NULL);
+
+ /* these should be no-ops */
+ svn_priority_queue__update(queue);
+ svn_priority_queue__pop(queue);
+
+ return SVN_NO_ERROR;
+}
+
+/* check that the tip of QUEUE equals EXPECTED and remove the first element */
+static svn_error_t *
+extract_expected(svn_priority_queue__t *queue, int expected)
+{
+ int value = *(int *)svn_priority_queue__peek(queue);
+ SVN_TEST_ASSERT(value == expected);
+ svn_priority_queue__pop(queue);
+
+ return SVN_NO_ERROR;
+}
+
+/* Verify that QUEUE returns all elements in the proper order.
+ Also check that data can be added & removed without disturbing the order.
+ */
+static svn_error_t *
+verify_queue_order(svn_priority_queue__t *queue)
+{
+ int sorted[NUMBER_COUNT];
+ int i;
+
+ /* reference order */
+ memcpy(sorted, numbers, sizeof(numbers));
+ qsort(sorted, NUMBER_COUNT, sizeof(sorted[0]), compare_func);
+
+ /* verify that the queue returns the data in the same order */
+ for (i = 0; i < NUMBER_COUNT; ++i)
+ {
+ int item = *(int *)svn_priority_queue__peek(queue);
+ int to_insert;
+
+ /* is this the value we expected? */
+ SVN_TEST_ASSERT(item == sorted[i]);
+
+ /* add two items at the tip of the queue */
+ to_insert = item - 1;
+ svn_priority_queue__push(queue, &to_insert);
+ svn_priority_queue__push(queue, &item);
+
+ /* check queue length */
+ SVN_TEST_ASSERT(svn_priority_queue__size(queue) == NUMBER_COUNT-i+2);
+
+ /* now, lets extract all 3 of them */
+ SVN_ERR(extract_expected(queue, item-1));
+ SVN_ERR(extract_expected(queue, item));
+ SVN_ERR(extract_expected(queue, item));
+
+ /* check queue length */
+ SVN_TEST_ASSERT(svn_priority_queue__size(queue) == NUMBER_COUNT-i-1);
+ }
+
+ /* the queue should now be empty */
+ verify_empty_queue(queue);
+
+ return SVN_NO_ERROR;
+}
+
+/* return a queue allocated in POOL containing all items of NUMBERS */
+static svn_priority_queue__t *
+create_standard_queue(apr_pool_t *pool)
+{
+ apr_array_header_t *elements
+ = apr_array_make(pool, 11, sizeof(numbers[0]));
+
+ /* build queue */
+ int i;
+ for (i = 0; i < NUMBER_COUNT; ++i)
+ APR_ARRAY_PUSH(elements, int) = numbers[i];
+
+ return svn_priority_queue__create(elements, compare_func);
+}
+
+
+static svn_error_t *
+test_empty_queue(apr_pool_t *pool)
+{
+ apr_array_header_t *elements
+ = apr_array_make(pool, 0, sizeof(int));
+ svn_priority_queue__t *queue
+ = svn_priority_queue__create(elements, compare_func);
+
+ verify_empty_queue(queue);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_sort_queue(apr_pool_t *pool)
+{
+ svn_priority_queue__t *queue = create_standard_queue(pool);
+
+ /* data should come out of the queue in sorted order */
+ SVN_ERR(verify_queue_order(queue));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_push(apr_pool_t *pool)
+{
+ apr_array_header_t *elements
+ = apr_array_make(pool, 3, sizeof(int));
+ svn_priority_queue__t *queue
+ = svn_priority_queue__create(elements, compare_func);
+
+ /* build queue */
+ int i;
+ for (i = 0; i < NUMBER_COUNT; ++i)
+ svn_priority_queue__push(queue, &numbers[i]);
+
+ /* data should come out of the queue in sorted order */
+ SVN_ERR(verify_queue_order(queue));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_update(apr_pool_t *pool)
+{
+ svn_priority_queue__t *queue = create_standard_queue(pool);
+
+ /* modify all items in the queue */
+ int i;
+ for (i = 0; i < NUMBER_COUNT; ++i)
+ {
+ int *tip = svn_priority_queue__peek(queue);
+ *tip += 4;
+ svn_priority_queue__update(queue);
+
+ /* extract and verify tip */
+ SVN_TEST_ASSERT(*(int *)svn_priority_queue__peek(queue)
+ == expected_modified[i]);
+ svn_priority_queue__pop(queue);
+
+ /* this should be a no-op now */
+ svn_priority_queue__update(queue);
+
+ SVN_TEST_ASSERT(svn_priority_queue__size(queue) == NUMBER_COUNT-i-1);
+ }
+
+ /* the queue should now be empty */
+ verify_empty_queue(queue);
+
+ return SVN_NO_ERROR;
+}
+
+/* An array of all test functions */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_empty_queue,
+ "test empty queue"),
+ SVN_TEST_PASS2(test_sort_queue,
+ "data returned by a priority queue shall be ordered"),
+ SVN_TEST_PASS2(test_push,
+ "priority queues can be built up incrementally"),
+ SVN_TEST_PASS2(test_update,
+ "updating the head of the queue"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/revision-test.c b/subversion/tests/libsvn_subr/revision-test.c
index 7e5d752..53ca8da 100644
--- a/subversion/tests/libsvn_subr/revision-test.c
+++ b/subversion/tests/libsvn_subr/revision-test.c
@@ -34,6 +34,12 @@ test_revnum_parse(apr_pool_t *pool)
"",
"abc",
"-456",
+ "2147483648",
+ "4294967295",
+ "4300000000",
+ "00000000001",
+ "21474836470",
+ "999999999999999999999999",
NULL
};
@@ -41,6 +47,8 @@ test_revnum_parse(apr_pool_t *pool)
"0",
"12345",
"12345ABC",
+ "0000000001",
+ "2147483647x",
NULL
};
@@ -115,10 +123,14 @@ test_revnum_parse(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_revnum_parse,
"test svn_revnum_parse"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/root-pools-test.c b/subversion/tests/libsvn_subr/root-pools-test.c
new file mode 100644
index 0000000..8116418
--- /dev/null
+++ b/subversion/tests/libsvn_subr/root-pools-test.c
@@ -0,0 +1,137 @@
+/*
+ * root-pools-test.c -- test the svn_root_pools__* API
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <apr_pools.h>
+#include <apr_thread_proc.h>
+#include <apr_thread_cond.h>
+
+#include "private/svn_atomic.h"
+#include "private/svn_subr_private.h"
+
+#include "../svn_test.h"
+
+/* do a few allocations of various sizes from POOL */
+static void
+do_some_allocations(apr_pool_t *pool)
+{
+ int i;
+ apr_size_t fib = 1, fib1 = 0, fib2 = 0;
+ for (i = 0; i < 25; ++i) /* fib(25) = 75025 */
+ {
+ apr_pcalloc(pool, fib1);
+ fib2 = fib1;
+ fib1 = fib;
+ fib += fib2;
+ }
+}
+
+/* allocate, use and recycle a pool from POOLs a few times */
+static void
+use_root_pool(svn_root_pools__t *pools)
+{
+ int i;
+ for (i = 0; i < 1000; ++i)
+ {
+ apr_pool_t *pool = svn_root_pools__acquire_pool(pools);
+ do_some_allocations(pool);
+ svn_root_pools__release_pool(pool, pools);
+ }
+}
+
+#if APR_HAS_THREADS
+static void *
+APR_THREAD_FUNC thread_func(apr_thread_t *tid, void *data)
+{
+ /* give all threads a good chance to get started by the scheduler */
+ apr_thread_yield();
+
+ use_root_pool(data);
+ apr_thread_exit(tid, APR_SUCCESS);
+
+ return NULL;
+}
+#endif
+
+static svn_error_t *
+test_root_pool(apr_pool_t *pool)
+{
+ svn_root_pools__t *pools;
+ SVN_ERR(svn_root_pools__create(&pools));
+ use_root_pool(pools);
+
+ return SVN_NO_ERROR;
+}
+
+#define APR_ERR(expr) \
+ do { \
+ apr_status_t status = (expr); \
+ if (status) \
+ return svn_error_wrap_apr(status, NULL); \
+ } while (0)
+
+static svn_error_t *
+test_root_pool_concurrency(apr_pool_t *pool)
+{
+#if APR_HAS_THREADS
+ /* The svn_root_pools__t container is supposed to be thread-safe.
+ Do some multi-threaded access and hope that there are no segfaults.
+ */
+ enum { THREAD_COUNT = 10 };
+ svn_root_pools__t *pools;
+ apr_thread_t *threads[THREAD_COUNT];
+ int i;
+
+ SVN_ERR(svn_root_pools__create(&pools));
+
+ for (i = 0; i < THREAD_COUNT; ++i)
+ APR_ERR(apr_thread_create(&threads[i], NULL, thread_func, pools, pool));
+
+ /* wait for the threads to finish */
+ for (i = 0; i < THREAD_COUNT; ++i)
+ {
+ apr_status_t retval;
+ APR_ERR(apr_thread_join(&retval, threads[i]));
+ APR_ERR(retval);
+ }
+#endif
+
+ return SVN_NO_ERROR;
+}
+
+
+/* The test table. */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_root_pool,
+ "test root pool recycling"),
+ SVN_TEST_SKIP2(test_root_pool_concurrency,
+ ! APR_HAS_THREADS,
+ "test concurrent root pool recycling"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/skel-test.c b/subversion/tests/libsvn_subr/skel-test.c
index 49fe1a3..9839e6a 100644
--- a/subversion/tests/libsvn_subr/skel-test.c
+++ b/subversion/tests/libsvn_subr/skel-test.c
@@ -59,7 +59,7 @@ get_empty_string(apr_pool_t *pool)
{
svn_pool_clear(pool);
- return svn_stringbuf_ncreate(0, 0, pool);
+ return svn_stringbuf_create_empty(pool);
}
/* Parse a skeleton from a Subversion string. */
@@ -886,7 +886,9 @@ unparse_list(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(parse_implicit_length,
@@ -903,3 +905,5 @@ struct svn_test_descriptor_t test_funcs[] =
"unparse lists"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/spillbuf-test.c b/subversion/tests/libsvn_subr/spillbuf-test.c
index c928dc3..16021b1 100644
--- a/subversion/tests/libsvn_subr/spillbuf-test.c
+++ b/subversion/tests/libsvn_subr/spillbuf-test.c
@@ -57,10 +57,8 @@ check_read(svn_spillbuf_t *buf,
static svn_error_t *
-test_spillbuf_basic(apr_pool_t *pool)
+test_spillbuf__basic(apr_pool_t *pool, apr_size_t len, svn_spillbuf_t *buf)
{
- apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
- svn_spillbuf_t *buf = svn_spillbuf__create(len, 10 * len, pool);
int i;
const char *readptr;
apr_size_t readlen;
@@ -87,6 +85,22 @@ test_spillbuf_basic(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_basic(apr_pool_t *pool)
+{
+ apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
+ svn_spillbuf_t *buf = svn_spillbuf__create(len, 10 * len, pool);
+ return test_spillbuf__basic(pool, len, buf);
+}
+
+static svn_error_t *
+test_spillbuf_basic_spill_all(apr_pool_t *pool)
+{
+ apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
+ svn_spillbuf_t *buf =
+ svn_spillbuf__create_extended(len, 10 * len, TRUE, TRUE, NULL, pool);
+ return test_spillbuf__basic(pool, len, buf);
+}
static svn_error_t *
read_callback(svn_boolean_t *stop,
@@ -107,12 +121,8 @@ read_callback(svn_boolean_t *stop,
static svn_error_t *
-test_spillbuf_callback(apr_pool_t *pool)
+test_spillbuf__callback(apr_pool_t *pool, svn_spillbuf_t *buf)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(
- sizeof(basic_data) /* blocksize */,
- 10 * sizeof(basic_data) /* maxsize */,
- pool);
int i;
int counter;
svn_boolean_t exhausted;
@@ -133,15 +143,31 @@ test_spillbuf_callback(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_file(apr_pool_t *pool)
+test_spillbuf_callback(apr_pool_t *pool)
{
- apr_size_t altsize = sizeof(basic_data) + 2;
svn_spillbuf_t *buf = svn_spillbuf__create(
- altsize /* blocksize */,
- 2 * sizeof(basic_data) /* maxsize */,
+ sizeof(basic_data) /* blocksize */,
+ 10 * sizeof(basic_data) /* maxsize */,
pool);
+ return test_spillbuf__callback(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_callback_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ sizeof(basic_data) /* blocksize */,
+ 10 * sizeof(basic_data) /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__callback(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf__file(apr_pool_t *pool, apr_size_t altsize, svn_spillbuf_t *buf)
+{
int i;
const char *readptr;
apr_size_t readlen;
@@ -203,14 +229,33 @@ test_spillbuf_file(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_file(apr_pool_t *pool)
+{
+ apr_size_t altsize = sizeof(basic_data) + 2;
+ svn_spillbuf_t *buf = svn_spillbuf__create(
+ altsize /* blocksize */,
+ 2 * sizeof(basic_data) /* maxsize */,
+ pool);
+ return test_spillbuf__file(pool, altsize, buf);
+}
static svn_error_t *
-test_spillbuf_interleaving(apr_pool_t *pool)
+test_spillbuf_file_spill_all(apr_pool_t *pool)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(8 /* blocksize */,
- 15 /* maxsize */,
- pool);
+ apr_size_t altsize = sizeof(basic_data) + 2;
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ altsize /* blocksize */,
+ 2 * sizeof(basic_data) /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__file(pool, altsize, buf);
+}
+static svn_error_t *
+test_spillbuf__interleaving(apr_pool_t *pool, svn_spillbuf_t* buf)
+{
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
/* now: two blocks: 8 and 4 bytes */
@@ -238,18 +283,36 @@ test_spillbuf_interleaving(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_interleaving(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create(8 /* blocksize */,
+ 15 /* maxsize */,
+ pool);
+ return test_spillbuf__interleaving(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_interleaving_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 8 /* blocksize */,
+ 15 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__interleaving(pool, buf);
+}
static svn_error_t *
test_spillbuf_reader(apr_pool_t *pool)
{
- svn_spillbuf_reader_t *sbr;
+ svn_spillbuf_reader_t *sbr = svn_spillbuf__reader_create(4 /* blocksize */,
+ 100 /* maxsize */,
+ pool);
apr_size_t amt;
char buf[10];
- sbr = svn_spillbuf__reader_create(4 /* blocksize */,
- 100 /* maxsize */,
- pool);
-
SVN_ERR(svn_spillbuf__reader_write(sbr, "abcdef", 6, pool));
/* Get a buffer from the underlying reader, and grab a couple bytes. */
@@ -270,13 +333,13 @@ test_spillbuf_reader(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
test_spillbuf_stream(apr_pool_t *pool)
{
- svn_stream_t *stream = svn_stream__from_spillbuf(8 /* blocksize */,
- 15 /* maxsize */,
- pool);
+ svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
+ 100 /* maxsize */,
+ pool);
+ svn_stream_t *stream = svn_stream__from_spillbuf(buf, pool);
char readbuf[256];
apr_size_t readlen;
apr_size_t writelen;
@@ -287,7 +350,7 @@ test_spillbuf_stream(apr_pool_t *pool)
/* now: two blocks: 8 and 4 bytes */
readlen = 8;
- SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+ SVN_ERR(svn_stream_read_full(stream, readbuf, &readlen));
SVN_TEST_ASSERT(readlen == 8
&& memcmp(readbuf, "abcdefgh", 8) == 0);
/* now: one block: 4 bytes */
@@ -295,7 +358,7 @@ test_spillbuf_stream(apr_pool_t *pool)
SVN_ERR(svn_stream_write(stream, "mnopqr", &writelen));
/* now: two blocks: 8 and 2 bytes */
- SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+ SVN_ERR(svn_stream_read_full(stream, readbuf, &readlen));
SVN_TEST_ASSERT(readlen == 8
&& memcmp(readbuf, "ijklmnop", 8) == 0);
/* now: one block: 2 bytes */
@@ -305,28 +368,23 @@ test_spillbuf_stream(apr_pool_t *pool)
SVN_ERR(svn_stream_write(stream, "GHIJKL", &writelen));
/* now: two blocks: 8 and 6 bytes, and 6 bytes spilled to a file */
- SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+ SVN_ERR(svn_stream_read_full(stream, readbuf, &readlen));
SVN_TEST_ASSERT(readlen == 8
&& memcmp(readbuf, "qrstuvwx", 8) == 0);
readlen = 6;
- SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+ SVN_ERR(svn_stream_read_full(stream, readbuf, &readlen));
SVN_TEST_ASSERT(readlen == 6
&& memcmp(readbuf, "ABCDEF", 6) == 0);
- SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+ SVN_ERR(svn_stream_read_full(stream, readbuf, &readlen));
SVN_TEST_ASSERT(readlen == 6
&& memcmp(readbuf, "GHIJKL", 6) == 0);
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_rwfile(apr_pool_t *pool)
+test_spillbuf__rwfile(apr_pool_t *pool, svn_spillbuf_t *buf)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
- 10 /* maxsize */,
- pool);
-
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "mnopqr", 6, pool));
@@ -360,14 +418,30 @@ test_spillbuf_rwfile(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_eof(apr_pool_t *pool)
+test_spillbuf_rwfile(apr_pool_t *pool)
{
svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
10 /* maxsize */,
pool);
+ return test_spillbuf__rwfile(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_rwfile_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 4 /* blocksize */,
+ 10 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__rwfile(pool, buf);
+}
+static svn_error_t *
+test_spillbuf__eof(apr_pool_t *pool, svn_spillbuf_t *buf)
+{
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
/* now: two blocks: 4 and 2 bytes, and 6 bytes in spill file. */
@@ -415,19 +489,108 @@ test_spillbuf_eof(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_eof(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
+ 10 /* maxsize */,
+ pool);
+ return test_spillbuf__eof(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_eof_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 4 /* blocksize */,
+ 10 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__eof(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf__file_attrs(apr_pool_t *pool, svn_boolean_t spill_all,
+ svn_spillbuf_t *buf)
+{
+ apr_finfo_t finfo;
+
+ SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
+ SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
+ SVN_ERR(svn_spillbuf__write(buf, "mnopqr", 6, pool));
+
+ /* Check that the spillbuf size is what we expect it to be */
+ SVN_TEST_ASSERT(svn_spillbuf__get_size(buf) == 18);
+
+ /* Check file existence */
+ SVN_TEST_ASSERT(svn_spillbuf__get_filename(buf) != NULL);
+ SVN_TEST_ASSERT(svn_spillbuf__get_file(buf) != NULL);
+
+ /* The size of the file must match expectations */
+ SVN_ERR(svn_io_file_info_get(&finfo, APR_FINFO_SIZE,
+ svn_spillbuf__get_file(buf), pool));
+ if (spill_all)
+ SVN_TEST_ASSERT(finfo.size == svn_spillbuf__get_size(buf));
+ else
+ SVN_TEST_ASSERT(finfo.size == (svn_spillbuf__get_size(buf)
+ - svn_spillbuf__get_memory_size(buf)));
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_spillbuf_file_attrs(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
+ 10 /* maxsize */,
+ pool);
+ return test_spillbuf__file_attrs(pool, FALSE, buf);
+}
+
+static svn_error_t *
+test_spillbuf_file_attrs_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 4 /* blocksize */,
+ 10 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__file_attrs(pool, TRUE, buf);
+}
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_spillbuf_basic, "basic spill buffer test"),
+ SVN_TEST_PASS2(test_spillbuf_basic_spill_all,
+ "basic spill buffer test (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_callback, "spill buffer read callback"),
+ SVN_TEST_PASS2(test_spillbuf_callback_spill_all,
+ "spill buffer read callback (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_file, "spill buffer file test"),
+ SVN_TEST_PASS2(test_spillbuf_file_spill_all,
+ "spill buffer file test (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_interleaving,
"interleaving reads and writes"),
+ SVN_TEST_PASS2(test_spillbuf_interleaving_spill_all,
+ "interleaving reads and writes (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_reader, "spill buffer reader test"),
SVN_TEST_PASS2(test_spillbuf_stream, "spill buffer stream test"),
SVN_TEST_PASS2(test_spillbuf_rwfile, "read/write spill file"),
+ SVN_TEST_PASS2(test_spillbuf_rwfile_spill_all,
+ "read/write spill file (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_eof, "validate reaching EOF of spill file"),
+ SVN_TEST_PASS2(test_spillbuf_eof_spill_all,
+ "validate reaching EOF (spill-all-data)"),
+ SVN_TEST_PASS2(test_spillbuf_file_attrs, "check spill file properties"),
+ SVN_TEST_PASS2(test_spillbuf_file_attrs_spill_all,
+ "check spill file properties (spill-all-data)"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/sqlite-test.c b/subversion/tests/libsvn_subr/sqlite-test.c
new file mode 100644
index 0000000..f44aa8d
--- /dev/null
+++ b/subversion/tests/libsvn_subr/sqlite-test.c
@@ -0,0 +1,186 @@
+/*
+ * sqlite-test.c -- test the stream functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include "private/svn_sqlite.h"
+#include "../svn_test.h"
+
+static svn_error_t *
+open_db(svn_sqlite__db_t **sdb,
+ const char **db_abspath_p,
+ const char *db_name,
+ const char *const *statements,
+ apr_int32_t timeout,
+ apr_pool_t *pool)
+{
+ const char *db_dir, *db_abspath;
+
+ SVN_ERR(svn_dirent_get_absolute(&db_dir, "sqlite-test-tmp", pool));
+ SVN_ERR(svn_io_remove_dir2(db_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_make_dir_recursively(db_dir, pool));
+ svn_test_add_dir_cleanup(db_dir);
+
+ db_abspath = svn_dirent_join(db_dir, db_name, pool);
+
+ SVN_ERR(svn_sqlite__open(sdb, db_abspath, svn_sqlite__mode_rwcreate,
+ statements, 0, NULL, timeout, pool, pool));
+
+ if (db_abspath_p)
+ *db_abspath_p = db_abspath;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+error_second(svn_sqlite__context_t *sctx,
+ int argc,
+ svn_sqlite__value_t *values[],
+ void *baton)
+{
+ static int i = 0;
+
+ if (++i == 2)
+ svn_sqlite__result_error(sctx, "fake error", 0);
+ else
+ svn_sqlite__result_int64(sctx, 1);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_sqlite_reset(apr_pool_t *pool)
+{
+ svn_sqlite__db_t *sdb;
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+ const char *value;
+
+ static const char *const statements[] = {
+ "CREATE TABLE reset ("
+ " one TEXT NOT NULL PRIMARY KEY,"
+ " two TEXT"
+ ");"
+ "INSERT INTO reset(one, two) VALUES ('foo', 'bar');"
+ "INSERT INTO reset(one, two) VALUES ('zig', 'zag')",
+
+ "SELECT one FROM reset WHERE two IS NOT NULL AND error_second(one) "
+ "ORDER BY one",
+
+ NULL
+ };
+
+ SVN_ERR(open_db(&sdb, NULL, "reset", statements, 0, pool));
+ SVN_ERR(svn_sqlite__create_scalar_function(sdb, "error_second",
+ 1, FALSE /* deterministic */,
+ error_second, NULL));
+ SVN_ERR(svn_sqlite__exec_statements(sdb, 0));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 1));
+
+ /* First step is OK. */
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ SVN_TEST_ASSERT(have_row);
+ value = svn_sqlite__column_text(stmt, 0, NULL);
+ SVN_TEST_ASSERT(value && !strcmp(value, "foo"));
+
+ /* Second step fails. */
+ SVN_TEST_ASSERT_ERROR(svn_sqlite__step(&have_row, stmt),
+ SVN_ERR_SQLITE_ERROR);
+
+ /* The svn_sqlite__step wrapper calls svn_sqlite__reset when step
+ fails so the reset call here is a no-op. The first step can be
+ repeated. */
+ SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ SVN_TEST_ASSERT(have_row);
+ value = svn_sqlite__column_text(stmt, 0, NULL);
+ SVN_TEST_ASSERT(value && !strcmp(value, "foo"));
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_sqlite_txn_commit_busy(apr_pool_t *pool)
+{
+ svn_sqlite__db_t *sdb1;
+ svn_sqlite__db_t *sdb2;
+ const char *db_abspath;
+ svn_error_t *err;
+
+ static const char *const statements[] = {
+ "CREATE TABLE test (one TEXT NOT NULL PRIMARY KEY)",
+
+ "INSERT INTO test(one) VALUES ('foo')",
+
+ "SELECT one from test",
+
+ NULL
+ };
+
+ /* Open two db connections.
+
+ Use a small busy_timeout of 250ms, since we're about to receive an
+ SVN_ERR_SQLITE_BUSY error, and retrying for the default 10 seconds
+ would be a waste of time. */
+ SVN_ERR(open_db(&sdb1, &db_abspath, "txn_commit_busy",
+ statements, 250, pool));
+ SVN_ERR(svn_sqlite__open(&sdb2, db_abspath, svn_sqlite__mode_readwrite,
+ statements, 0, NULL, 250, pool, pool));
+ SVN_ERR(svn_sqlite__exec_statements(sdb1, 0));
+
+ /* Begin two deferred transactions. */
+ SVN_ERR(svn_sqlite__begin_transaction(sdb1));
+ SVN_ERR(svn_sqlite__exec_statements(sdb1, 1 /* INSERT */));
+ SVN_ERR(svn_sqlite__begin_transaction(sdb2));
+ SVN_ERR(svn_sqlite__exec_statements(sdb2, 2 /* SELECT */));
+
+ /* Try to COMMIT the first write transaction; this should fail due to
+ the concurrent read transaction that holds a shared lock on the db. */
+ err = svn_sqlite__finish_transaction(sdb1, SVN_NO_ERROR);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_SQLITE_BUSY);
+
+ /* We failed to COMMIT the first transaction, but COMMIT-ting the
+ second transaction through a different db connection should succeed.
+ Upgrade it to a write transaction by executing the INSERT statement,
+ and then commit. */
+ SVN_ERR(svn_sqlite__exec_statements(sdb2, 1 /* INSERT */));
+ SVN_ERR(svn_sqlite__finish_transaction(sdb2, SVN_NO_ERROR));
+
+ SVN_ERR(svn_sqlite__close(sdb2));
+ SVN_ERR(svn_sqlite__close(sdb1));
+
+ return SVN_NO_ERROR;
+}
+
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_sqlite_reset,
+ "sqlite reset"),
+ SVN_TEST_PASS2(test_sqlite_txn_commit_busy,
+ "sqlite busy on transaction commit"),
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/stream-test.c b/subversion/tests/libsvn_subr/stream-test.c
index c8dba13..aaa9bf1 100644
--- a/subversion/tests/libsvn_subr/stream-test.c
+++ b/subversion/tests/libsvn_subr/stream-test.c
@@ -73,7 +73,7 @@ test_stream_from_string(apr_pool_t *pool)
while (len == TEST_BUF_SIZE)
{
/* Read a chunk ... */
- SVN_ERR(svn_stream_read(stream, buffer, &len));
+ SVN_ERR(svn_stream_read_full(stream, buffer, &len));
/* ... and append the chunk to the stringbuf. */
svn_stringbuf_appendbytes(outbuf, buffer, len);
@@ -206,7 +206,7 @@ test_stream_compressed(apr_pool_t *pool)
while (len >= TEST_BUF_SIZE)
{
len = TEST_BUF_SIZE;
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
if (len > 0)
svn_stringbuf_appendbytes(inbuf, buf, len);
}
@@ -332,17 +332,17 @@ test_stream_seek_stringbuf(apr_pool_t *pool)
stringbuf = svn_stringbuf_create("OneTwo", pool);
stream = svn_stream_from_stringbuf(stringbuf, pool);
len = 3;
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
buf[3] = '\0';
SVN_TEST_STRING_ASSERT(buf, "One");
SVN_ERR(svn_stream_mark(stream, &mark, pool));
len = 3;
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
buf[3] = '\0';
SVN_TEST_STRING_ASSERT(buf, "Two");
SVN_ERR(svn_stream_seek(stream, mark));
len = 3;
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
buf[3] = '\0';
SVN_TEST_STRING_ASSERT(buf, "Two");
@@ -351,7 +351,7 @@ test_stream_seek_stringbuf(apr_pool_t *pool)
SVN_ERR(svn_stream_skip(stream, 2));
/* The remaining line should be empty */
len = 3;
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
buf[len] = '\0';
SVN_TEST_ASSERT(len == 1);
SVN_TEST_STRING_ASSERT(buf, "o");
@@ -381,7 +381,7 @@ test_stream_seek_translated(apr_pool_t *pool)
FALSE, keywords, TRUE, pool);
/* Seek from outside of keyword to inside of keyword. */
len = 25;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 25);
buf[25] = '\0';
SVN_TEST_STRING_ASSERT(buf, "One$MyKeyword: my keyword");
@@ -389,7 +389,7 @@ test_stream_seek_translated(apr_pool_t *pool)
SVN_ERR(svn_stream_reset(translated_stream));
SVN_ERR(svn_stream_seek(translated_stream, mark));
len = 4;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 4);
buf[4] = '\0';
SVN_TEST_STRING_ASSERT(buf, " was");
@@ -397,7 +397,7 @@ test_stream_seek_translated(apr_pool_t *pool)
SVN_ERR(svn_stream_seek(translated_stream, mark));
SVN_ERR(svn_stream_skip(translated_stream, 2));
len = 2;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 2);
buf[len] = '\0';
SVN_TEST_STRING_ASSERT(buf, "as");
@@ -405,13 +405,13 @@ test_stream_seek_translated(apr_pool_t *pool)
/* Seek from inside of keyword to inside of keyword. */
SVN_ERR(svn_stream_mark(translated_stream, &mark, pool));
len = 9;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 9);
buf[9] = '\0';
SVN_TEST_STRING_ASSERT(buf, " expanded");
SVN_ERR(svn_stream_seek(translated_stream, mark));
len = 9;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 9);
buf[9] = '\0';
SVN_TEST_STRING_ASSERT(buf, " expanded");
@@ -419,7 +419,7 @@ test_stream_seek_translated(apr_pool_t *pool)
SVN_ERR(svn_stream_seek(translated_stream, mark));
SVN_ERR(svn_stream_skip(translated_stream, 6));
len = 3;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 3);
buf[len] = '\0';
SVN_TEST_STRING_ASSERT(buf, "ded");
@@ -427,13 +427,13 @@ test_stream_seek_translated(apr_pool_t *pool)
/* Seek from inside of keyword to outside of keyword. */
SVN_ERR(svn_stream_mark(translated_stream, &mark, pool));
len = 4;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 4);
buf[4] = '\0';
SVN_TEST_STRING_ASSERT(buf, " $Tw");
SVN_ERR(svn_stream_seek(translated_stream, mark));
len = 4;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 4);
buf[4] = '\0';
SVN_TEST_STRING_ASSERT(buf, " $Tw");
@@ -441,7 +441,7 @@ test_stream_seek_translated(apr_pool_t *pool)
SVN_ERR(svn_stream_seek(translated_stream, mark));
SVN_ERR(svn_stream_skip(translated_stream, 2));
len = 2;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 2);
buf[len] = '\0';
SVN_TEST_STRING_ASSERT(buf, "Tw");
@@ -449,13 +449,13 @@ test_stream_seek_translated(apr_pool_t *pool)
/* Seek from outside of keyword to outside of keyword. */
SVN_ERR(svn_stream_mark(translated_stream, &mark, pool));
len = 1;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 1);
buf[1] = '\0';
SVN_TEST_STRING_ASSERT(buf, "o");
SVN_ERR(svn_stream_seek(translated_stream, mark));
len = 1;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 1);
buf[1] = '\0';
SVN_TEST_STRING_ASSERT(buf, "o");
@@ -463,7 +463,7 @@ test_stream_seek_translated(apr_pool_t *pool)
SVN_ERR(svn_stream_seek(translated_stream, mark));
SVN_ERR(svn_stream_skip(translated_stream, 2));
len = 1;
- SVN_ERR(svn_stream_read(translated_stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(translated_stream, buf, &len));
SVN_TEST_ASSERT(len == 0);
buf[len] = '\0';
SVN_TEST_STRING_ASSERT(buf, "");
@@ -524,7 +524,7 @@ test_stream_compressed_empty_file(apr_pool_t *pool)
pool, pool));
stream = svn_stream_compressed(empty_file_stream, pool);
len = sizeof(buf);
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
if (len > 0)
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"Got unexpected result.");
@@ -727,9 +727,87 @@ test_stream_base64_2(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_stringbuf_from_stream(apr_pool_t *pool)
+{
+ const char *test_cases[] =
+ {
+ "",
+ "x",
+ "this string is longer than the default 64 minimum block size used"
+ "by the function under test",
+ NULL
+ };
+
+ const char **test_case;
+ for (test_case = test_cases; *test_case; ++test_case)
+ {
+ svn_stringbuf_t *result1, *result2, *result3, *result4;
+ svn_stringbuf_t *original = svn_stringbuf_create(*test_case, pool);
+
+ svn_stream_t *stream1 = svn_stream_from_stringbuf(original, pool);
+ svn_stream_t *stream2 = svn_stream_from_stringbuf(original, pool);
+
+ SVN_ERR(svn_stringbuf_from_stream(&result1, stream1, 0, pool));
+ SVN_ERR(svn_stringbuf_from_stream(&result2, stream1, 0, pool));
+ SVN_ERR(svn_stringbuf_from_stream(&result3, stream2, original->len,
+ pool));
+ SVN_ERR(svn_stringbuf_from_stream(&result4, stream2, original->len,
+ pool));
+
+ /* C-string contents must match */
+ SVN_TEST_STRING_ASSERT(result1->data, original->data);
+ SVN_TEST_STRING_ASSERT(result2->data, "");
+ SVN_TEST_STRING_ASSERT(result3->data, original->data);
+ SVN_TEST_STRING_ASSERT(result4->data, "");
+
+ /* assumed length must match */
+ SVN_TEST_ASSERT(result1->len == original->len);
+ SVN_TEST_ASSERT(result2->len == 0);
+ SVN_TEST_ASSERT(result3->len == original->len);
+ SVN_TEST_ASSERT(result4->len == 0);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+empty_read_full_fn(void *baton, char *buffer, apr_size_t *len)
+{
+ *len = 0;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_stream_compressed_read_full(apr_pool_t *pool)
+{
+ svn_stream_t *stream, *empty_stream;
+ char buf[1];
+ apr_size_t len;
+
+ /* Reading an empty stream with read_full only support should not error. */
+ empty_stream = svn_stream_create(NULL, pool);
+
+ /* Create stream with only full read support. */
+ svn_stream_set_read2(empty_stream, NULL, empty_read_full_fn);
+
+ stream = svn_stream_compressed(empty_stream, pool);
+ len = sizeof(buf);
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
+ if (len > 0)
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "Got unexpected result.");
+
+ SVN_ERR(svn_stream_close(stream));
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_stream_from_string,
@@ -752,5 +830,11 @@ struct svn_test_descriptor_t test_funcs[] =
"test base64 encoding/decoding streams"),
SVN_TEST_PASS2(test_stream_base64_2,
"base64 decoding allocation problem"),
+ SVN_TEST_PASS2(test_stringbuf_from_stream,
+ "test svn_stringbuf_from_stream"),
+ SVN_TEST_PASS2(test_stream_compressed_read_full,
+ "test compression for streams without partial read"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/string-test.c b/subversion/tests/libsvn_subr/string-test.c
index 735db18..ab0cc44 100644
--- a/subversion/tests/libsvn_subr/string-test.c
+++ b/subversion/tests/libsvn_subr/string-test.c
@@ -38,6 +38,7 @@
#include "svn_io.h"
#include "svn_error.h"
+#include "svn_sorts.h" /* MIN / MAX */
#include "svn_string.h" /* This includes <apr_*.h> */
#include "private/svn_string_private.h"
@@ -58,9 +59,8 @@ fail(apr_pool_t *pool, const char *fmt, ...)
/* Some of our own global variables, for simplicity. Yes,
simplicity. */
-svn_stringbuf_t *a = NULL, *b = NULL, *c = NULL;
-const char *phrase_1 = "hello, ";
-const char *phrase_2 = "a longish phrase of sorts, longer than 16 anyway";
+static const char *phrase_1 = "hello, ";
+static const char *phrase_2 = "a longish phrase of sorts, longer than 16 anyway";
@@ -68,7 +68,7 @@ const char *phrase_2 = "a longish phrase of sorts, longer than 16 anyway";
static svn_error_t *
test1(apr_pool_t *pool)
{
- a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
/* Test that length, data, and null-termination are correct. */
if ((a->len == strlen(phrase_1)) && ((strcmp(a->data, phrase_1)) == 0))
@@ -81,7 +81,7 @@ test1(apr_pool_t *pool)
static svn_error_t *
test2(apr_pool_t *pool)
{
- b = svn_stringbuf_ncreate(phrase_2, 16, pool);
+ svn_stringbuf_t *b = svn_stringbuf_ncreate(phrase_2, 16, pool);
/* Test that length, data, and null-termination are correct. */
if ((b->len == 16) && ((strncmp(b->data, phrase_2, 16)) == 0))
@@ -97,8 +97,8 @@ test3(apr_pool_t *pool)
char *tmp;
size_t old_len;
- a = svn_stringbuf_create(phrase_1, pool);
- b = svn_stringbuf_ncreate(phrase_2, 16, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *b = svn_stringbuf_ncreate(phrase_2, 16, pool);
tmp = apr_palloc(pool, (a->len + b->len + 1));
strcpy(tmp, a->data);
@@ -117,7 +117,7 @@ test3(apr_pool_t *pool)
static svn_error_t *
test4(apr_pool_t *pool)
{
- a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
svn_stringbuf_appendcstr(a, "new bytes to append");
/* Test that length, data, and null-termination are correct. */
@@ -132,7 +132,7 @@ test4(apr_pool_t *pool)
static svn_error_t *
test5(apr_pool_t *pool)
{
- a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
svn_stringbuf_appendbytes(a, "new bytes to append", 9);
/* Test that length, data, and null-termination are correct. */
@@ -147,9 +147,9 @@ test5(apr_pool_t *pool)
static svn_error_t *
test6(apr_pool_t *pool)
{
- a = svn_stringbuf_create(phrase_1, pool);
- b = svn_stringbuf_create(phrase_2, pool);
- c = svn_stringbuf_dup(a, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *b = svn_stringbuf_create(phrase_2, pool);
+ svn_stringbuf_t *c = svn_stringbuf_dup(a, pool);
/* Test that length, data, and null-termination are correct. */
if ((svn_stringbuf_compare(a, c)) && (! svn_stringbuf_compare(b, c)))
@@ -165,7 +165,7 @@ test7(apr_pool_t *pool)
char *tmp;
size_t tmp_len;
- c = svn_stringbuf_create(phrase_2, pool);
+ svn_stringbuf_t *c = svn_stringbuf_create(phrase_2, pool);
tmp_len = c->len;
tmp = apr_palloc(pool, c->len + 1);
@@ -185,7 +185,7 @@ test7(apr_pool_t *pool)
static svn_error_t *
test8(apr_pool_t *pool)
{
- c = svn_stringbuf_create(phrase_2, pool);
+ svn_stringbuf_t *c = svn_stringbuf_create(phrase_2, pool);
svn_stringbuf_setempty(c);
@@ -199,7 +199,7 @@ test8(apr_pool_t *pool)
static svn_error_t *
test9(apr_pool_t *pool)
{
- a = svn_stringbuf_create(phrase_1, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(phrase_1, pool);
svn_stringbuf_fillchar(a, '#');
@@ -379,7 +379,7 @@ test_find_char_backward(const char* data,
{
apr_size_t i;
- a = svn_stringbuf_create(data, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(data, pool);
i = svn_stringbuf_find_char_backward(a, ch);
if (i == pos)
@@ -391,7 +391,7 @@ test_find_char_backward(const char* data,
static svn_error_t *
test13(apr_pool_t *pool)
{
- a = svn_stringbuf_create("test, test", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("test, test", pool);
return test_find_char_backward(a->data, a->len, ',', 4, pool);
}
@@ -399,7 +399,7 @@ test13(apr_pool_t *pool)
static svn_error_t *
test14(apr_pool_t *pool)
{
- a = svn_stringbuf_create(",test test", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(",test test", pool);
return test_find_char_backward(a->data, a->len, ',', 0, pool);
}
@@ -407,7 +407,7 @@ test14(apr_pool_t *pool)
static svn_error_t *
test15(apr_pool_t *pool)
{
- a = svn_stringbuf_create("testing,", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("testing,", pool);
return test_find_char_backward(a->data,
a->len,
@@ -419,7 +419,7 @@ test15(apr_pool_t *pool)
static svn_error_t *
test16(apr_pool_t *pool)
{
- a = svn_stringbuf_create_empty(pool);
+ svn_stringbuf_t *a = svn_stringbuf_create_empty(pool);
return test_find_char_backward(a->data, a->len, ',', 0, pool);
}
@@ -427,7 +427,7 @@ test16(apr_pool_t *pool)
static svn_error_t *
test17(apr_pool_t *pool)
{
- a = svn_stringbuf_create("test test test", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("test test test", pool);
return test_find_char_backward(a->data,
a->len,
@@ -443,7 +443,7 @@ test_first_non_whitespace(const char *str,
{
apr_size_t i;
- a = svn_stringbuf_create(str, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(str, pool);
i = svn_stringbuf_first_non_whitespace(a);
@@ -474,8 +474,8 @@ test20(apr_pool_t *pool)
static svn_error_t *
test21(apr_pool_t *pool)
{
- a = svn_stringbuf_create(" \ttest\t\t \t ", pool);
- b = svn_stringbuf_create("test", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(" \ttest\t\t \t ", pool);
+ svn_stringbuf_t *b = svn_stringbuf_create("test", pool);
svn_stringbuf_strip_whitespace(a);
@@ -490,8 +490,8 @@ test_stringbuf_unequal(const char* str1,
const char* str2,
apr_pool_t *pool)
{
- a = svn_stringbuf_create(str1, pool);
- b = svn_stringbuf_create(str2, pool);
+ svn_stringbuf_t *a = svn_stringbuf_create(str1, pool);
+ svn_stringbuf_t *b = svn_stringbuf_create(str2, pool);
if (svn_stringbuf_compare(a, b))
return fail(pool, "test failed");
@@ -521,23 +521,58 @@ test24(apr_pool_t *pool)
SVN_TEST_ASSERT(length == 1);
SVN_TEST_STRING_ASSERT(buffer, "0");
- length = svn__i64toa(buffer, 0x8000000000000000ll);
+ length = svn__i64toa(buffer, APR_INT64_MIN);
SVN_TEST_ASSERT(length == 20);
SVN_TEST_STRING_ASSERT(buffer, "-9223372036854775808");
- length = svn__i64toa(buffer, 0x7fffffffffffffffll);
+ length = svn__i64toa(buffer, APR_INT64_MAX);
SVN_TEST_ASSERT(length == 19);
SVN_TEST_STRING_ASSERT(buffer, "9223372036854775807");
- length = svn__ui64toa(buffer, 0ull);
+ length = svn__ui64toa(buffer, 0u);
SVN_TEST_ASSERT(length == 1);
SVN_TEST_STRING_ASSERT(buffer, "0");
- length = svn__ui64toa(buffer, 0xffffffffffffffffull);
+ length = svn__ui64toa(buffer, APR_UINT64_MAX);
SVN_TEST_ASSERT(length == 20);
SVN_TEST_STRING_ASSERT(buffer, "18446744073709551615");
- return test_stringbuf_unequal("abc", "abb", pool);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+sub_test_base36(apr_uint64_t value, const char *base36)
+{
+ char buffer[SVN_INT64_BUFFER_SIZE];
+ apr_size_t length;
+ apr_size_t expected_length = strlen(base36);
+ const char *end = buffer;
+ apr_uint64_t result;
+
+ length = svn__ui64tobase36(buffer, value);
+ SVN_TEST_ASSERT(length == expected_length);
+ SVN_TEST_STRING_ASSERT(buffer, base36);
+
+ result = svn__base36toui64(&end, buffer);
+ SVN_TEST_ASSERT(end - buffer == length);
+ SVN_TEST_ASSERT(result == value);
+
+ result = svn__base36toui64(NULL, buffer);
+ SVN_TEST_ASSERT(result == value);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_base36(apr_pool_t *pool)
+{
+ SVN_ERR(sub_test_base36(0, "0"));
+ SVN_ERR(sub_test_base36(APR_UINT64_C(1234567890), "kf12oi"));
+ SVN_ERR(sub_test_base36(APR_UINT64_C(0x7fffffffffffffff), "1y2p0ij32e8e7"));
+ SVN_ERR(sub_test_base36(APR_UINT64_C(0x8000000000000000), "1y2p0ij32e8e8"));
+ SVN_ERR(sub_test_base36(APR_UINT64_MAX, "3w5e11264sgsf"));
+
+ return SVN_NO_ERROR;
}
static svn_error_t *
@@ -554,7 +589,7 @@ expect_stringbuf_equal(const svn_stringbuf_t* str1,
static svn_error_t *
test_stringbuf_insert(apr_pool_t *pool)
{
- a = svn_stringbuf_create("st , ", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("st , ", pool);
svn_stringbuf_insert(a, 0, "teflon", 2);
SVN_TEST_STRING_ASSERT(a->data, "test , ");
@@ -587,7 +622,7 @@ test_stringbuf_insert(apr_pool_t *pool)
static svn_error_t *
test_stringbuf_remove(apr_pool_t *pool)
{
- a = svn_stringbuf_create("test hello, world!", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("test hello, world!", pool);
svn_stringbuf_remove(a, 0, 2);
SVN_TEST_STRING_ASSERT(a->data, "st hello, world!");
@@ -599,13 +634,21 @@ test_stringbuf_remove(apr_pool_t *pool)
SVN_TEST_STRING_ASSERT(a->data, "stell");
svn_stringbuf_remove(a, 1200, 393);
- return expect_stringbuf_equal(a, "stell", pool);
+ SVN_ERR(expect_stringbuf_equal(a, "stell", pool));
+
+ svn_stringbuf_remove(a, APR_SIZE_MAX, 2);
+ SVN_ERR(expect_stringbuf_equal(a, "stell", pool));
+
+ svn_stringbuf_remove(a, 1, APR_SIZE_MAX);
+ SVN_ERR(expect_stringbuf_equal(a, "s", pool));
+
+ return SVN_NO_ERROR;
}
static svn_error_t *
test_stringbuf_replace(apr_pool_t *pool)
{
- a = svn_stringbuf_create("odd with some world?", pool);
+ svn_stringbuf_t *a = svn_stringbuf_create("odd with some world?", pool);
svn_stringbuf_replace(a, 0, 3, "tester", 4);
SVN_TEST_STRING_ASSERT(a->data, "test with some world?");
@@ -637,6 +680,12 @@ test_stringbuf_replace(apr_pool_t *pool)
svn_stringbuf_ncreate("test hello\0-\0world!\0-\0!",
23, pool)));
+ svn_stringbuf_replace(a, 1, APR_SIZE_MAX, "x", 1);
+ SVN_ERR(expect_stringbuf_equal(a, "tx", pool));
+
+ svn_stringbuf_replace(a, APR_SIZE_MAX, APR_SIZE_MAX, "y", 1);
+ SVN_ERR(expect_stringbuf_equal(a, "txy", pool));
+
return SVN_NO_ERROR;
}
@@ -648,13 +697,14 @@ test_string_similarity(apr_pool_t *pool)
const char *stra;
const char *strb;
apr_size_t lcs;
- int score;
+ unsigned int score;
} tests[] =
{
-#define SCORE(lcs, len) ((2000 * (lcs) + (len)/2) / (len))
+#define SCORE(lcs, len) \
+ ((2 * SVN_STRING__SIM_RANGE_MAX * (lcs) + (len)/2) / (len))
/* Equality */
- {"", "", 0, 1000},
+ {"", "", 0, SVN_STRING__SIM_RANGE_MAX},
{"quoth", "quoth", 5, SCORE(5, 5+5)},
/* Deletion at start */
@@ -708,17 +758,20 @@ test_string_similarity(apr_pool_t *pool)
for (t = tests; t->stra; ++t)
{
apr_size_t lcs;
- const unsigned int score =
+ const apr_size_t score =
svn_cstring__similarity(t->stra, t->strb, &buffer, &lcs);
/*
fprintf(stderr,
- "lcs %s ~ %s score %.3f (%"APR_SIZE_T_FMT
- ") expected %.3f (%"APR_SIZE_T_FMT"))\n",
- t->stra, t->strb, score/1000.0, lcs, t->score/1000.0, t->lcs);
+ "lcs %s ~ %s score %.6f (%"APR_SIZE_T_FMT
+ ") expected %.6f (%"APR_SIZE_T_FMT"))\n",
+ t->stra, t->strb, score/1.0/SVN_STRING__SIM_RANGE_MAX,
+ lcs, t->score/1.0/SVN_STRING__SIM_RANGE_MAX, t->lcs);
*/
if (score != t->score)
- return fail(pool, "%s ~ %s score %.3f <> expected %.3f",
- t->stra, t->strb, score/1000.0, t->score/1000.0);
+ return fail(pool, "%s ~ %s score %.6f <> expected %.6f",
+ t->stra, t->strb,
+ score/1.0/SVN_STRING__SIM_RANGE_MAX,
+ t->score/1.0/SVN_STRING__SIM_RANGE_MAX);
if (lcs != t->lcs)
return fail(pool,
@@ -731,7 +784,8 @@ test_string_similarity(apr_pool_t *pool)
{
const svn_string_t foo = {"svn:foo", 4};
const svn_string_t bar = {"svn:bar", 4};
- if (1000 != svn_string__similarity(&foo, &bar, &buffer, NULL))
+ if (SVN_STRING__SIM_RANGE_MAX
+ != svn_string__similarity(&foo, &bar, &buffer, NULL))
return fail(pool, "'%s'[:4] ~ '%s'[:4] found different",
foo.data, bar.data);
}
@@ -739,6 +793,106 @@ test_string_similarity(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_string_matching(apr_pool_t *pool)
+{
+ const struct test_data_t
+ {
+ const char *a;
+ const char *b;
+ apr_size_t match_len;
+ apr_size_t rmatch_len;
+ }
+ tests[] =
+ {
+ /* edge cases */
+ {"", "", 0, 0},
+ {"", "x", 0, 0},
+ {"x", "", 0, 0},
+ {"x", "x", 1, 1},
+ {"", "1234567890abcdef", 0, 0},
+ {"1234567890abcdef", "", 0, 0},
+ {"1234567890abcdef", "1234567890abcdef", 16, 16},
+
+ /* left-side matches */
+ {"x", "y", 0, 0},
+ {"ax", "ay", 1, 0},
+ {"ax", "a", 1, 0},
+ {"a", "ay", 1, 0},
+ {"1234567890abcdef", "1234567890abcdeg", 15, 0},
+ {"1234567890abcdef_", "1234567890abcdefg", 16, 0},
+ {"12345678_0abcdef", "1234567890abcdeg", 8, 0},
+ {"1234567890abcdef", "12345678", 8, 0},
+ {"12345678", "1234567890abcdef", 8, 0},
+ {"12345678_0ab", "1234567890abcdef", 8, 0},
+
+ /* right-side matches */
+ {"xa", "ya", 0, 1},
+ {"xa", "a", 0, 1},
+ {"a", "ya", 0, 1},
+ {"_234567890abcdef", "1234567890abcdef", 0, 15},
+ {"_1234567890abcdef", "x1234567890abcdef", 0, 16},
+ {"1234567_90abcdef", "_1234567890abcdef", 0, 8},
+ {"1234567890abcdef", "90abcdef", 0, 8},
+ {"90abcdef", "1234567890abcdef", 0, 8},
+ {"8_0abcdef", "7890abcdef", 0, 7},
+
+ /* two-side matches */
+ {"bxa", "bya", 1, 1},
+ {"bxa", "ba", 1, 1},
+ {"ba", "bya", 1, 1},
+ {"1234567_90abcdef", "1234567890abcdef", 7, 8},
+ {"12345678_90abcdef", "1234567890abcdef", 8, 8},
+ {"12345678_0abcdef", "1234567890abcdef", 8, 7},
+ {"123456_abcdef", "1234sdffdssdf567890abcdef", 4, 6},
+ {"1234567890abcdef", "12345678ef", 8, 2},
+ {"x_234567890abcdef", "x1234567890abcdef", 1, 15},
+ {"1234567890abcdefx", "1234567890abcdex", 15, 1},
+
+ /* list terminator */
+ {NULL}
+ };
+
+ const struct test_data_t *test;
+ for (test = tests; test->a != NULL; ++test)
+ {
+ apr_size_t a_len = strlen(test->a);
+ apr_size_t b_len = strlen(test->b);
+ apr_size_t max_match = MIN(a_len, b_len);
+ apr_size_t match_len
+ = svn_cstring__match_length(test->a, test->b, max_match);
+ apr_size_t rmatch_len
+ = svn_cstring__reverse_match_length(test->a + a_len, test->b + b_len,
+ max_match);
+
+ SVN_TEST_ASSERT(match_len == test->match_len);
+ SVN_TEST_ASSERT(rmatch_len == test->rmatch_len);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_string_skip_prefix(apr_pool_t *pool)
+{
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("12345", "12345"),
+ "");
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("12345", "123"),
+ "45");
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("12345", ""),
+ "12345");
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("12345", "23"),
+ NULL);
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("1", "12"),
+ NULL);
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("", ""),
+ "");
+ SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("", "12"),
+ NULL);
+
+ return SVN_NO_ERROR;
+}
+
/*
====================================================================
If you add a new test to this file, update this array.
@@ -747,7 +901,10 @@ test_string_similarity(apr_pool_t *pool)
*/
/* An array of all test functions */
-struct svn_test_descriptor_t test_funcs[] =
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test1,
@@ -783,7 +940,7 @@ struct svn_test_descriptor_t test_funcs[] =
SVN_TEST_PASS2(test16,
"find_char_backward; len = 0 case"),
SVN_TEST_PASS2(test17,
- "find_char_backward; no occurence case"),
+ "find_char_backward; no occurrence case"),
SVN_TEST_PASS2(test18,
"check whitespace removal; common case"),
SVN_TEST_PASS2(test19,
@@ -798,6 +955,8 @@ struct svn_test_descriptor_t test_funcs[] =
"compare stringbufs; same length, different content"),
SVN_TEST_PASS2(test24,
"verify i64toa"),
+ SVN_TEST_PASS2(test_base36,
+ "verify base36 conversion"),
SVN_TEST_PASS2(test_stringbuf_insert,
"check inserting into svn_stringbuf_t"),
SVN_TEST_PASS2(test_stringbuf_remove,
@@ -806,5 +965,11 @@ struct svn_test_descriptor_t test_funcs[] =
"check replacement in svn_stringbuf_t"),
SVN_TEST_PASS2(test_string_similarity,
"test string similarity scores"),
+ SVN_TEST_PASS2(test_string_matching,
+ "test string matching"),
+ SVN_TEST_PASS2(test_string_skip_prefix,
+ "test svn_cstring_skip_prefix()"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/subst_translate-test.c b/subversion/tests/libsvn_subr/subst_translate-test.c
index 1e555f2..0c4ee96 100644
--- a/subversion/tests/libsvn_subr/subst_translate-test.c
+++ b/subversion/tests/libsvn_subr/subst_translate-test.c
@@ -115,7 +115,7 @@ test_svn_subst_translate_string2_null_encoding_helper(apr_pool_t *pool)
svn_string_t *new_value = NULL;
svn_boolean_t translated_to_utf8 = FALSE;
svn_boolean_t translated_line_endings = TRUE;
- /* 'Æ', which is 0xc6 in both ISO-8859-1 and Windows-1252 */
+ /* The 'AE' ligature, which is 0xc6 in both ISO-8859-1 and Windows-1252 */
svn_string_t *source_string = svn_string_create("\xc6", pool);
SVN_ERR(svn_subst_translate_string2(&new_value, &translated_to_utf8,
@@ -397,7 +397,7 @@ test_svn_subst_long_keywords(apr_pool_t *pool)
"01234567890123456789012345678901234567890123456789"
"012345678901234567890123456789012345678901234567";
- /* The longest keyword that can be expanded: the value is empty. */
+ /* The longest keyword that can be expanded: the value is empty. */
const char keyword_z[]
= "Q"
"01234567890123456789012345678901234567890123456789"
@@ -500,7 +500,9 @@ test_svn_subst_long_keywords(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_svn_subst_translate_string2,
@@ -519,3 +521,6 @@ struct svn_test_descriptor_t test_funcs[] =
"test long keywords (issue 4350)"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
+
diff --git a/subversion/tests/libsvn_subr/time-test.c b/subversion/tests/libsvn_subr/time-test.c
index 82e56b1..51fbe67 100644
--- a/subversion/tests/libsvn_subr/time-test.c
+++ b/subversion/tests/libsvn_subr/time-test.c
@@ -29,10 +29,10 @@
#include "../svn_test.h"
/* All these variables should refer to the same point in time. */
-apr_time_t test_timestamp = APR_TIME_C(1021316450966679);
-const char *test_timestring =
+static apr_time_t test_timestamp = APR_TIME_C(1021316450966679);
+static const char *test_timestring =
"2002-05-13T19:00:50.966679Z";
-const char *test_old_timestring =
+static const char *test_old_timestring =
"Mon 13 May 2002 22:00:50.966679 (day 133, dst 1, gmt_off 010800)";
@@ -339,7 +339,9 @@ test_parse_date(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_time_to_cstring,
@@ -354,3 +356,5 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_parse_date"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/translate-test.c b/subversion/tests/libsvn_subr/translate-test.c
index 9300503..2436bc7 100644
--- a/subversion/tests/libsvn_subr/translate-test.c
+++ b/subversion/tests/libsvn_subr/translate-test.c
@@ -48,7 +48,7 @@
/*** Helpers ***/
/* (Almost) all the tests share the same test data. */
-const char *lines[] =
+static const char *lines[] =
{
"Line 1: fairly boring subst test data... blah blah",
"Line 2: fairly boring subst test data... blah blah.",
@@ -223,15 +223,12 @@ random_eol_marker(void)
static svn_error_t *
create_file(const char *fname, const char *eol_str, apr_pool_t *pool)
{
- apr_status_t apr_err;
apr_file_t *f;
apr_size_t i, j;
- apr_err = apr_file_open(&f, fname,
+ SVN_ERR(svn_io_file_open(&f, fname,
(APR_WRITE | APR_CREATE | APR_EXCL | APR_BINARY),
- APR_OS_DEFAULT, pool);
- if (apr_err)
- return svn_error_create(apr_err, NULL, fname);
+ APR_OS_DEFAULT, pool));
for (i = 0; i < (sizeof(lines) / sizeof(*lines)); i++)
{
@@ -243,45 +240,13 @@ create_file(const char *fname, const char *eol_str, apr_pool_t *pool)
fprintf() doing a newline conversion? */
for (j = 0; this_eol_str[j]; j++)
{
- apr_err = apr_file_putc(this_eol_str[j], f);
- if (apr_err)
- return svn_error_create(apr_err, NULL, fname);
+ SVN_ERR(svn_io_file_putc(this_eol_str[j], f, pool));
}
}
- apr_err = apr_file_close(f);
- if (apr_err)
- return svn_error_create(apr_err, NULL, fname);
-
- return SVN_NO_ERROR;
-}
-
-
-/* If FNAME is a regular file, remove it; if it doesn't exist at all,
- return success. Otherwise, return error. */
-static svn_error_t *
-remove_file(const char *fname, apr_pool_t *pool)
-{
- apr_status_t apr_err;
- apr_finfo_t finfo;
-
- if (apr_stat(&finfo, fname, APR_FINFO_TYPE, pool) == APR_SUCCESS)
- {
- if (finfo.filetype == APR_REG)
- {
- apr_err = apr_file_remove(fname, pool);
- if (apr_err)
- return svn_error_create(apr_err, NULL, fname);
- }
- else
- return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
- "non-file '%s' is in the way", fname);
- }
-
- return SVN_NO_ERROR;
+ return svn_error_trace(svn_io_file_close(f, pool));
}
-
/* Set up, run, and verify the results of a substitution.
*
* Create a file TEST_NAME.src using global `lines' as the initial
@@ -325,14 +290,14 @@ substitute_and_verify(const char *test_name,
apr_size_t idx = 0;
apr_size_t i;
const char *expect[(sizeof(lines) / sizeof(*lines))];
- const char *src_fname = apr_pstrcat(pool, test_name, ".src", (char *)NULL);
- const char *dst_fname = apr_pstrcat(pool, test_name, ".dst", (char *)NULL);
+ const char *src_fname = apr_pstrcat(pool, test_name, ".src", SVN_VA_NULL);
+ const char *dst_fname = apr_pstrcat(pool, test_name, ".dst", SVN_VA_NULL);
svn_string_t *val;
apr_pool_t *subpool = svn_pool_create(pool);
/** Clean up from previous tests, set up src data, and convert. **/
- SVN_ERR(remove_file(src_fname, pool));
- SVN_ERR(remove_file(dst_fname, pool));
+ SVN_ERR(svn_io_remove_file2(src_fname, TRUE, pool));
+ SVN_ERR(svn_io_remove_file2(dst_fname, TRUE, pool));
SVN_ERR(create_file(src_fname, src_eol, pool));
if (rev)
@@ -395,7 +360,7 @@ substitute_and_verify(const char *test_name,
else
{
svn_error_clear(err);
- SVN_ERR(remove_file(src_fname, pool));
+ SVN_ERR(svn_io_remove_file2(src_fname, FALSE, pool));
return SVN_NO_ERROR;
}
@@ -419,27 +384,27 @@ substitute_and_verify(const char *test_name,
"Valid $LastChangedRevision: ",
rev,
" $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[5 - 1] =
apr_pstrcat(pool, "Line 5: ",
"Valid $Rev: ", rev, " $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[26 - 1] =
apr_pstrcat(pool, "Line 26: ",
"Emptily expanded keyword $Rev: ", rev," $.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[29 - 1] =
apr_pstrcat(pool, "Line 29: ",
"Valid $LastChangedRevision: ",
rev,
" $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[30 - 1] =
apr_pstrcat(pool, "Line 30: ",
"Valid $Rev: ",
rev,
" $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
@@ -462,31 +427,31 @@ substitute_and_verify(const char *test_name,
"Valid $LastChangedDate: ",
date,
" $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[13 - 1] =
apr_pstrcat(pool, "Line 13: ",
"Valid $Date: ", date, " $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[33 - 1] =
apr_pstrcat(pool, "Line 33: ",
"Valid $LastChangedDate: ",
date,
" $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[34 - 1] =
apr_pstrcat(pool, "Line 34: ",
"Valid $Date: ", date, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[51 - 1] =
apr_pstrcat(pool, "Line 51: ",
"same, but with embedded keyword ",
"$$$$$$$$Date: ", date, " $$$$$$$$$$.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[52 - 1] =
apr_pstrcat(pool, "Line 52: ",
"same, with expanded, empty keyword ",
"$$$$$$Date: ", date, " $$$$$$.",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
@@ -511,46 +476,46 @@ substitute_and_verify(const char *test_name,
"Valid $LastChangedBy: ",
author,
" $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[9 - 1] =
apr_pstrcat(pool, "Line 9: ",
"Valid $Author: ", author, " $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[37 - 1] =
apr_pstrcat(pool, "Line 37: ",
"Valid $LastChangedBy: ", author,
- " $, started expanded.", (char *)NULL);
+ " $, started expanded.", SVN_VA_NULL);
expect[38 - 1] =
apr_pstrcat(pool, "Line 38: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[46 - 1] =
apr_pstrcat(pool, "Line 46: ",
"Empty $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[71 - 1] =
- apr_pstrcat(pool, ".$veR$Author: ", author, " $", (char *)NULL);
+ apr_pstrcat(pool, ".$veR$Author: ", author, " $", SVN_VA_NULL);
expect[74 - 1] =
apr_pstrcat(pool, "Line 74: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[79 - 1] =
apr_pstrcat(pool, "Line 79: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[80 - 1] =
apr_pstrcat(pool, "Line 80: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[81 - 1] =
apr_pstrcat(pool, "Line 81: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[82 - 1] =
apr_pstrcat(pool, "Line 82: ",
"Valid $Author: ", author, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
@@ -581,23 +546,23 @@ substitute_and_verify(const char *test_name,
expect[16 - 1] =
apr_pstrcat(pool, "Line 16: ",
"Valid $HeadURL: ", url, " $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[17 - 1] =
apr_pstrcat(pool, "Line 17: ",
"Valid $URL: ", url, " $, started unexpanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[41 - 1] =
apr_pstrcat(pool, "Line 41: ",
"Valid $HeadURL: ", url, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[42 - 1] =
apr_pstrcat(pool, "Line 42: ",
"Valid $URL: ", url, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[75 - 1] =
apr_pstrcat(pool, "Line 75: ",
"Valid $URL: ", url, " $, started expanded.",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
@@ -622,14 +587,14 @@ substitute_and_verify(const char *test_name,
"Two keywords back to back: "
"$Author: ", author, " $"
"$Rev: ", rev, " $.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[49 - 1] =
apr_pstrcat(pool, "Line 49: ",
"One keyword, one not, back to back: "
"$Author: ", author, " $Rev$.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[70 - 1] =
- apr_pstrcat(pool, "$Author: ", author, " $Rev$.", (char *)NULL);
+ apr_pstrcat(pool, "$Author: ", author, " $Rev$.", SVN_VA_NULL);
}
/* Else Lines 48, 49, and 70 remain unchanged. */
}
@@ -641,14 +606,14 @@ substitute_and_verify(const char *test_name,
apr_pstrcat(pool, "Line 48: ",
"Two keywords back to back: "
"$Author$$Rev: ", rev, " $.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[49 - 1] =
apr_pstrcat(pool, "Line 49: ",
"One keyword, one not, back to back: "
"$Author$Rev: ", rev, " $.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[70 - 1] =
- apr_pstrcat(pool, "$Author$Rev: ", rev, " $.", (char *)NULL);
+ apr_pstrcat(pool, "$Author$Rev: ", rev, " $.", SVN_VA_NULL);
}
/* Else Lines 48, 49, and 70 remain unchanged. */
}
@@ -660,14 +625,14 @@ substitute_and_verify(const char *test_name,
apr_pstrcat(pool, "Line 48: ",
"Two keywords back to back: "
"$Author: ", author, " $$Rev$.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[49 - 1] =
apr_pstrcat(pool, "Line 49: ",
"One keyword, one not, back to back: "
"$Author: ", author, " $Rev$.",
- (char *)NULL);
+ SVN_VA_NULL);
expect[70 - 1] =
- apr_pstrcat(pool, "$Author: ", author, " $Rev$.", (char *)NULL);
+ apr_pstrcat(pool, "$Author: ", author, " $Rev$.", SVN_VA_NULL);
}
/* Else Lines 48, 49, and 70 remain unchanged. */
}
@@ -684,14 +649,14 @@ substitute_and_verify(const char *test_name,
"keyword in a keyword: $Author: ",
author,
" $Date$ $",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
expect[24 - 1] =
apr_pstrcat(pool, "Line 24: ",
"keyword in a keyword: $Author$Date$ $",
- (char *)NULL);
+ SVN_VA_NULL);
}
}
else if (date && (! author))
@@ -703,7 +668,7 @@ substitute_and_verify(const char *test_name,
"keyword in a keyword: $Author: $Date: ",
date,
" $ $",
- (char *)NULL);
+ SVN_VA_NULL);
}
/* Else Line 24 remains unchanged. */
}
@@ -716,14 +681,14 @@ substitute_and_verify(const char *test_name,
"keyword in a keyword: $Author: ",
author,
" $Date$ $",
- (char *)NULL);
+ SVN_VA_NULL);
}
else /* unexpand */
{
expect[24 - 1] =
apr_pstrcat(pool, "Line 24: ",
"keyword in a keyword: $Author$Date$ $",
- (char *)NULL);
+ SVN_VA_NULL);
}
}
/* Else neither author nor date, so Line 24 remains unchanged. */
@@ -769,8 +734,8 @@ substitute_and_verify(const char *test_name,
}
/* Clean up this test, since successful. */
- SVN_ERR(remove_file(src_fname, pool));
- SVN_ERR(remove_file(dst_fname, pool));
+ SVN_ERR(svn_io_remove_file2(src_fname, FALSE, pool));
+ SVN_ERR(svn_io_remove_file2(dst_fname, FALSE, pool));
return SVN_NO_ERROR;
}
@@ -862,7 +827,7 @@ static svn_error_t *
mixed_to_lf(apr_pool_t *pool)
{
return substitute_and_verify
- ("cr_to_lf", NULL, "\n", 1, NULL, NULL, NULL, NULL, 1, pool);
+ ("mixed_to_lf", NULL, "\n", 1, NULL, NULL, NULL, NULL, 1, pool);
}
@@ -1096,10 +1061,10 @@ static svn_error_t *
unexpand_author(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("author", "\n", NULL, 0, NULL, NULL, "jrandom", NULL, 0, pool));
+ ("unexpand_author", "\n", NULL, 0, NULL, NULL, "jrandom", NULL, 0, pool));
SVN_ERR(substitute_and_verify
- ("author", "\r\n", NULL, 0, NULL, NULL, "jrandom", NULL, 0, pool));
+ ("unexpand_author", "\r\n", NULL, 0, NULL, NULL, "jrandom", NULL, 0, pool));
return SVN_NO_ERROR;
}
@@ -1109,11 +1074,11 @@ static svn_error_t *
unexpand_date(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("date", "\n", NULL, 0,
+ ("unexpand_date", "\n", NULL, 0,
NULL, "Wed Jan 9 07:49:05 2002", NULL, NULL, 0, pool));
SVN_ERR(substitute_and_verify
- ("date", "\r\n", NULL, 0,
+ ("unexpand_date", "\r\n", NULL, 0,
NULL, "Wed Jan 9 07:49:05 2002", NULL, NULL, 0, pool));
return SVN_NO_ERROR;
@@ -1124,11 +1089,11 @@ static svn_error_t *
unexpand_author_date(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("author_date", "\n", NULL, 0,
+ ("unexpand_author_date", "\n", NULL, 0,
NULL, "Wed Jan 9 07:49:05 2002", "jrandom", NULL, 0, pool));
SVN_ERR(substitute_and_verify
- ("author_date", "\r\n", NULL, 0,
+ ("unexpand_author_date", "\r\n", NULL, 0,
NULL, "Wed Jan 9 07:49:05 2002", "jrandom", NULL, 0, pool));
return SVN_NO_ERROR;
@@ -1139,11 +1104,11 @@ static svn_error_t *
unexpand_author_rev(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("author_rev", "\n", NULL, 0,
+ ("unexpand_author_rev", "\n", NULL, 0,
"1729", NULL, "jrandom", NULL, 0, pool));
SVN_ERR(substitute_and_verify
- ("author_rev", "\r\n", NULL, 0,
+ ("unexpand_author_rev", "\r\n", NULL, 0,
"1729", NULL, "jrandom", NULL, 0, pool));
return SVN_NO_ERROR;
@@ -1154,11 +1119,11 @@ static svn_error_t *
unexpand_rev(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("rev", "\n", NULL, 0,
+ ("unexpand_rev", "\n", NULL, 0,
"1729", NULL, NULL, NULL, 0, pool));
SVN_ERR(substitute_and_verify
- ("rev", "\r\n", NULL, 0,
+ ("unexpand_rev", "\r\n", NULL, 0,
"1729", NULL, NULL, NULL, 0, pool));
return SVN_NO_ERROR;
@@ -1169,11 +1134,11 @@ static svn_error_t *
unexpand_rev_url(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("rev_url", "\n", NULL, 0,
+ ("unexpand_rev_url", "\n", NULL, 0,
"1729", NULL, NULL, "http://subversion.tigris.org", 0, pool));
SVN_ERR(substitute_and_verify
- ("rev_url", "\r\n", NULL, 0,
+ ("unexpand_rev_url", "\r\n", NULL, 0,
"1729", NULL, NULL, "http://subversion.tigris.org", 0, pool));
return SVN_NO_ERROR;
@@ -1184,7 +1149,7 @@ static svn_error_t *
unexpand_author_date_rev_url(apr_pool_t *pool)
{
SVN_ERR(substitute_and_verify
- ("author_date_rev_url", "\n", NULL, 0,
+ ("unexpand_author_date_rev_url", "\n", NULL, 0,
"1729",
"Wed Jan 9 07:49:05 2002",
"jrandom",
@@ -1192,7 +1157,7 @@ unexpand_author_date_rev_url(apr_pool_t *pool)
1, pool));
SVN_ERR(substitute_and_verify
- ("author_date_rev_url", "\r\n", NULL, 0,
+ ("unexpand_author_date_rev_url", "\r\n", NULL, 0,
"1729",
"Wed Jan 9 07:49:05 2002",
"jrandom",
@@ -1210,7 +1175,7 @@ static svn_error_t *
lf_to_crlf_unexpand_author(apr_pool_t *pool)
{
return substitute_and_verify
- ("lf_to_crlf_author", "\n", "\r\n", 0,
+ ("lf_to_crlf_unexpand_author", "\n", "\r\n", 0,
NULL, NULL, "jrandom", NULL, 0, pool);
}
@@ -1219,7 +1184,7 @@ static svn_error_t *
mixed_to_lf_unexpand_author_date(apr_pool_t *pool)
{
return substitute_and_verify
- ("mixed_to_lf_author_date", NULL, "\n", 1,
+ ("mixed_to_lf_unexpand_author_date", NULL, "\n", 1,
NULL, "Wed Jan 9 07:49:05 2002", "jrandom", NULL, 0, pool);
}
@@ -1228,7 +1193,7 @@ static svn_error_t *
crlf_to_cr_unexpand_author_rev(apr_pool_t *pool)
{
return substitute_and_verify
- ("crlf_to_cr_author_rev", "\r\n", "\r", 0,
+ ("crlf_to_cr_unexpand_author_rev", "\r\n", "\r", 0,
"1729", NULL, "jrandom", NULL, 0, pool);
}
@@ -1237,7 +1202,7 @@ static svn_error_t *
cr_to_crlf_unexpand_rev(apr_pool_t *pool)
{
return substitute_and_verify
- ("cr_to_crlf_rev", "\r", "\r\n", 0,
+ ("cr_to_crlf_unexpand_rev", "\r", "\r\n", 0,
"1729", NULL, NULL, NULL, 0, pool);
}
@@ -1246,7 +1211,7 @@ static svn_error_t *
cr_to_crlf_unexpand_rev_url(apr_pool_t *pool)
{
return substitute_and_verify
- ("cr_to_crlf_rev_url", "\r", "\r\n", 0,
+ ("cr_to_crlf_unexpand_rev_url", "\r", "\r\n", 0,
"1729", NULL, NULL, "http://subversion.tigris.org", 0, pool);
}
@@ -1255,7 +1220,7 @@ static svn_error_t *
mixed_to_crlf_unexpand_author_date_rev_url(apr_pool_t *pool)
{
return substitute_and_verify
- ("mixed_to_crlf_author_date_rev_url", NULL, "\r\n", 1,
+ ("mixed_to_crlf_unexpand_author_date_rev_url", NULL, "\r\n", 1,
"1729",
"Wed Jan 9 07:49:05 2002",
"jrandom",
@@ -1268,7 +1233,9 @@ mixed_to_crlf_unexpand_author_date_rev_url(apr_pool_t *pool)
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 7;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
/* The no-op conversion. */
@@ -1362,3 +1329,5 @@ struct svn_test_descriptor_t test_funcs[] =
"mixed_to_crlf; unexpand author, date, rev, url"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/utf-test.c b/subversion/tests/libsvn_subr/utf-test.c
index 2028e14..dd81ccd 100644
--- a/subversion/tests/libsvn_subr/utf-test.c
+++ b/subversion/tests/libsvn_subr/utf-test.c
@@ -25,6 +25,7 @@
#include "svn_utf.h"
#include "svn_pools.h"
+#include "private/svn_string_private.h"
#include "private/svn_utf_private.h"
/* Random number seed. Yes, it's global, just pretend you can't see it. */
@@ -226,7 +227,7 @@ test_utf_cstring_to_utf8_ex2(apr_pool_t *pool)
const char *expected_result;
const char *from_page;
} tests[] = {
- {"ascii text\n", "ascii text\n", "unexistant-page"},
+ {"ascii text\n", "ascii text\n", "unexistent-page"},
{"Edelwei\xdf", "Edelwei\xc3\x9f", "ISO-8859-1"}
};
@@ -266,7 +267,7 @@ test_utf_cstring_from_utf8_ex2(apr_pool_t *pool)
const char *expected_result;
const char *to_page;
} tests[] = {
- {"ascii text\n", "ascii text\n", "unexistant-page"},
+ {"ascii text\n", "ascii text\n", "unexistent-page"},
{"Edelwei\xc3\x9f", "Edelwei\xdf", "ISO-8859-1"}
};
@@ -294,10 +295,540 @@ test_utf_cstring_from_utf8_ex2(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* Test normalization-independent UTF-8 string comparison */
+static svn_error_t *
+test_utf_collated_compare(apr_pool_t *pool)
+{
+ /* Normalized: NFC */
+ static const char nfc[] =
+ "\xe1\xb9\xa8" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "\xe1\xb8\x87" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "\xe1\xb8\x9d" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "\xc5\xa1" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xe1\xbb\x9d" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ /* Normalized: NFD */
+ static const char nfd[] =
+ "S\xcc\xa3\xcc\x87" /* S with dot above and below */
+ "u\xcc\x8a" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "v\xcc\x83" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "r\xcc\x8f" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "i\xcc\x88\xcc\x81" /* i with diaeresis and acute */
+ "o\xcc\x9b\xcc\x80" /* o with grave and hook */
+ "n\xcc\xad"; /* n with circumflex below */
+
+ /* Mixed, denormalized */
+ static const char mixup[] =
+ "S\xcc\x87\xcc\xa3" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "o\xcc\x80\xcc\x9b" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ static const char longer[] =
+ "\xe1\xb9\xa8" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "\xe1\xb8\x87" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "\xe1\xb8\x9d" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "\xc5\xa1" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xe1\xbb\x9d" /* o with grave and hook */
+ "\xe1\xb9\x8b" /* n with circumflex below */
+ "X";
+
+ static const char shorter[] =
+ "\xe1\xb9\xa8" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "\xe1\xb8\x87" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "\xe1\xb8\x9d" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "\xc5\xa1" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xe1\xbb\x9d"; /* o with grave and hook */
+
+ static const char lowcase[] =
+ "s\xcc\x87\xcc\xa3" /* s with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "o\xcc\x80\xcc\x9b" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ static const struct utfcmp_test_t {
+ const char *stra;
+ char op;
+ const char *strb;
+ const char *taga;
+ const char *tagb;
+ } utfcmp_tests[] = {
+ /* Empty key */
+ {"", '=', "", "empty", "empty"},
+ {"", '<', "a", "empty", "nonempty"},
+ {"a", '>', "", "nonempty", "empty"},
+
+ /* Deterministic ordering */
+ {"a", '<', "b", "a", "b"},
+ {"b", '<', "c", "b", "c"},
+ {"a", '<', "c", "a", "c"},
+
+ /* Normalized equality */
+ {nfc, '=', nfd, "nfc", "nfd"},
+ {nfd, '=', nfc, "nfd", "nfc"},
+ {nfc, '=', mixup, "nfc", "mixup"},
+ {nfd, '=', mixup, "nfd", "mixup"},
+ {mixup, '=', nfd, "mixup", "nfd"},
+ {mixup, '=', nfc, "mixup", "nfc"},
+
+ /* Key length */
+ {nfc, '<', longer, "nfc", "longer"},
+ {longer, '>', nfc, "longer", "nfc"},
+ {nfd, '>', shorter, "nfd", "shorter"},
+ {shorter, '<', nfd, "shorter", "nfd"},
+ {mixup, '<', lowcase, "mixup", "lowcase"},
+ {lowcase, '>', mixup, "lowcase", "mixup"},
+
+ {NULL, 0, NULL, NULL, NULL}
+ };
+
+
+ const struct utfcmp_test_t *ut;
+ svn_membuf_t bufa, bufb;
+ svn_membuf__create(&bufa, 0, pool);
+ svn_membuf__create(&bufb, 0, pool);
+
+ srand(111);
+ for (ut = utfcmp_tests; ut->stra; ++ut)
+ {
+ const svn_boolean_t implicit_size = (rand() % 17) & 1;
+ const apr_size_t lena = (implicit_size
+ ? SVN_UTF__UNKNOWN_LENGTH : strlen(ut->stra));
+ const apr_size_t lenb = (implicit_size
+ ? SVN_UTF__UNKNOWN_LENGTH : strlen(ut->strb));
+ int result;
+
+ SVN_ERR(svn_utf__normcmp(&result,
+ ut->stra, lena, ut->strb, lenb,
+ &bufa, &bufb));
+
+ /* UCS-4 debugging dump of the decomposed strings
+ {
+ const apr_int32_t *const ucsbufa = bufa.data;
+ const apr_int32_t *const ucsbufb = bufb.data;
+ apr_size_t i;
+
+ printf("(%c)%7s %c %s\n", ut->op,
+ ut->taga, (!result ? '=' : (result < 0 ? '<' : '>')), ut->tagb);
+
+ for (i = 0; i < bufa.size || i < bufb.size; ++i)
+ {
+ if (i < bufa.size && i < bufb.size)
+ printf(" U+%04X U+%04X\n", ucsbufa[i], ucsbufb[i]);
+ else if (i < bufa.size)
+ printf(" U+%04X\n", ucsbufa[i]);
+ else
+ printf(" U+%04X\n", ucsbufb[i]);
+ }
+ }
+ */
+
+ if (('=' == ut->op && 0 != result)
+ || ('<' == ut->op && 0 <= result)
+ || ('>' == ut->op && 0 >= result))
+ {
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, NULL,
+ "Ut->Op '%s' %c '%s' but '%s' %c '%s'",
+ ut->taga, ut->op, ut->tagb,
+ ut->taga, (!result ? '=' : (result < 0 ? '<' : '>')), ut->tagb);
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+
+static svn_error_t *
+test_utf_pattern_match(apr_pool_t *pool)
+{
+ static const struct glob_test_t {
+ svn_boolean_t sql_like;
+ svn_boolean_t matches;
+ const char *pattern;
+ const char *string;
+ const char *escape;
+ } glob_tests[] = {
+#define LIKE_MATCH TRUE, TRUE
+#define LIKE_FAIL TRUE, FALSE
+#define GLOB_MATCH FALSE, TRUE
+#define GLOB_FAIL FALSE, FALSE
+
+ {LIKE_FAIL, "", "test", NULL},
+ {GLOB_FAIL, "", "test", NULL},
+ {LIKE_FAIL, "", "%", NULL},
+ {GLOB_FAIL, "", "*", NULL},
+ {LIKE_FAIL, "test", "%", NULL},
+ {GLOB_FAIL, "test", "*", NULL},
+ {LIKE_MATCH, "test", "test", NULL},
+ {GLOB_MATCH, "test", "test", NULL},
+ {LIKE_MATCH, "t\xe1\xb8\x9dst", "te\xcc\xa7\xcc\x86st", NULL},
+ {GLOB_MATCH, "te\xcc\xa7\xcc\x86st", "t\xe1\xb8\x9dst", NULL},
+
+ {LIKE_FAIL, "test", "test", "\xe1\xb8\x9d"}, /* escape char not ascii */
+ {LIKE_FAIL, "test", "test", ""}, /* empty escape string */
+
+ {LIKE_MATCH, "te#st", "test", "#"},
+ {LIKE_FAIL, "te#st", "test", NULL},
+ {GLOB_MATCH, "te\\st", "test", NULL},
+ {LIKE_MATCH, "te##st", "te#st", "#"},
+ {LIKE_FAIL, "te##st", "te#st", NULL},
+ {GLOB_MATCH, "te\\\\st", "te\\st", NULL},
+ {GLOB_FAIL, "te\\\\st", "te\\st", "\\"}, /* escape char with glob */
+ {LIKE_FAIL, "te#%t", "te%t", NULL},
+ {LIKE_MATCH, "te#%t", "te%t", "#"},
+ {GLOB_MATCH, "te\\*t", "te*t", NULL},
+ {LIKE_FAIL, "te#%t", "test", NULL},
+ {GLOB_FAIL, "te\\*t", "test", NULL},
+ {LIKE_FAIL, "te#_t", "te_t", NULL},
+ {LIKE_MATCH, "te#_t", "te_t", "#"},
+ {GLOB_MATCH, "te\\?t", "te?t", NULL},
+ {LIKE_FAIL, "te#_t", "test", NULL},
+ {LIKE_FAIL, "te#_t", "test", "#"},
+ {GLOB_FAIL, "te\\?t", "test", NULL},
+
+ {LIKE_MATCH, "_est", "test", NULL},
+ {GLOB_MATCH, "?est", "test", NULL},
+ {LIKE_MATCH, "te_t", "test", NULL},
+ {GLOB_MATCH, "te?t", "test", NULL},
+ {LIKE_MATCH, "tes_", "test", NULL},
+ {GLOB_MATCH, "tes?", "test", NULL},
+ {LIKE_FAIL, "test_", "test", NULL},
+ {GLOB_FAIL, "test?", "test", NULL},
+
+ {LIKE_MATCH, "[s%n]", "[subversion]", NULL},
+ {GLOB_FAIL, "[s*n]", "[subversion]", NULL},
+ {LIKE_MATCH, "#[s%n]", "[subversion]", "#"},
+ {GLOB_MATCH, "\\[s*n]", "[subversion]", NULL},
+
+ {GLOB_MATCH, ".[\\-\\t]", ".t", NULL},
+ {GLOB_MATCH, "test*?*[a-z]*", "testgoop", NULL},
+ {GLOB_MATCH, "te[^x]t", "test", NULL},
+ {GLOB_MATCH, "te[^abc]t", "test", NULL},
+ {GLOB_MATCH, "te[^x]t", "test", NULL},
+ {GLOB_MATCH, "te[!x]t", "test", NULL},
+ {GLOB_FAIL, "te[^x]t", "text", NULL},
+ {GLOB_FAIL, "te[^\\x]t", "text", NULL},
+ {GLOB_FAIL, "te[^x\\", "text", NULL},
+ {GLOB_FAIL, "te[/]t", "text", NULL},
+ {GLOB_MATCH, "te[r-t]t", "test", NULL},
+ {GLOB_MATCH, "te[r-Tz]t", "tezt", NULL},
+ {GLOB_FAIL, "te[R-T]t", "tent", NULL},
+/* {GLOB_MATCH, "tes[]t]", "test", NULL}, */
+ {GLOB_MATCH, "tes[t-]", "test", NULL},
+ {GLOB_MATCH, "tes[t-]]", "test]", NULL},
+ {GLOB_FAIL, "tes[t-]]", "test", NULL},
+ {GLOB_FAIL, "tes[u-]", "test", NULL},
+ {GLOB_FAIL, "tes[t-]", "tes[t-]", NULL},
+ {GLOB_MATCH, "test[/-/]", "test/", NULL},
+ {GLOB_MATCH, "test[\\/-/]", "test/", NULL},
+ {GLOB_MATCH, "test[/-\\/]", "test/", NULL},
+
+#undef LIKE_MATCH
+#undef LIKE_FAIL
+#undef GLOB_MATCH
+#undef GLOB_FAIL
+
+ {FALSE, FALSE, NULL, NULL, NULL}
+ };
+
+ const struct glob_test_t *gt;
+ svn_membuf_t bufa, bufb, bufc;
+ svn_membuf__create(&bufa, 0, pool);
+ svn_membuf__create(&bufb, 0, pool);
+ svn_membuf__create(&bufc, 0, pool);
+
+ srand(79);
+ for (gt = glob_tests; gt->pattern; ++gt)
+ {
+ const svn_boolean_t implicit_size = (rand() % 13) & 1;
+ const apr_size_t lenptn = (implicit_size
+ ? SVN_UTF__UNKNOWN_LENGTH
+ : strlen(gt->pattern));
+ const apr_size_t lenstr = (implicit_size
+ ? SVN_UTF__UNKNOWN_LENGTH
+ : strlen(gt->string));
+ const apr_size_t lenesc = (implicit_size
+ ? SVN_UTF__UNKNOWN_LENGTH
+ : (gt->escape ? strlen(gt->escape) : 0));
+ svn_boolean_t match;
+ svn_error_t *err;
+
+
+ err = svn_utf__glob(&match,
+ gt->pattern, lenptn,
+ gt->string, lenstr,
+ gt->escape, lenesc,
+ gt->sql_like, &bufa, &bufb, &bufc);
+
+ if (!gt->sql_like && gt->escape && !err)
+ return svn_error_create
+ (SVN_ERR_TEST_FAILED, err, "Failed to detect GLOB ESCAPE");
+
+ if ((err && gt->matches)
+ || (!err && !match != !gt->matches))
+ {
+ if (gt->sql_like)
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, err,
+ "Wrong result: %s'%s' LIKE '%s'%s%s%s%s",
+ (gt->matches ? "NOT " : ""), gt->string, gt->pattern,
+ (gt->escape ? " ESCAPE " : ""), (gt->escape ? "'" : ""),
+ (gt->escape ? gt->escape : ""), (gt->escape ? "'" : ""));
+ else
+ return svn_error_createf
+ (SVN_ERR_TEST_FAILED, err, "Wrong result: %s%s GLOB %s",
+ (gt->matches ? "NOT " : ""), gt->string, gt->pattern);
+ }
+
+ if (err)
+ svn_error_clear(err);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+test_utf_fuzzy_escape(apr_pool_t *pool)
+{
+
+ /* Accented latin, mixed normalization */
+ static const char mixup[] =
+ "S\xcc\x87\xcc\xa3" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "o\xcc\x80\xcc\x9b" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ /* As above, but latin lowercase 'o' replaced with Greek 'omicron' */
+ static const char greekish[] =
+ "S\xcc\x87\xcc\xa3" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xce\xbf\xcc\x80\xcc\x9b" /* omicron with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ /* More interesting invalid characters. */
+ static const char invalid[] =
+ "Not Unicode: \xef\xb7\x91;" /* U+FDD1 */
+ "Out of range: \xf4\x90\x80\x81;" /* U+110001 */
+ "Not UTF-8: \xe6;"
+ "Null byte: \0;";
+
+ const char *fuzzy;
+
+ fuzzy = svn_utf__fuzzy_escape(mixup, strlen(mixup), pool);
+ SVN_TEST_ASSERT(0 == strcmp(fuzzy, "Subversion"));
+
+ fuzzy = svn_utf__fuzzy_escape(greekish, strlen(greekish), pool);
+ SVN_TEST_ASSERT(0 == strcmp(fuzzy, "Subversi{U+03BF}n"));
+
+ fuzzy = svn_utf__fuzzy_escape(invalid, sizeof(invalid) - 1, pool);
+ /*fprintf(stderr, "%s\n", fuzzy);*/
+ SVN_TEST_ASSERT(0 == strcmp(fuzzy,
+ "Not Unicode: {U?FDD1};"
+ "Out of range: ?\\F4?\\90?\\80?\\81;"
+ "Not UTF-8: ?\\E6;"
+ "Null byte: \\0;"));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_utf_is_normalized(apr_pool_t *pool)
+{
+ /* Normalized: NFC */
+ static const char nfc[] =
+ "\xe1\xb9\xa8" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "\xe1\xb8\x87" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "\xe1\xb8\x9d" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "\xc5\xa1" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xe1\xbb\x9d" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ /* Normalized: NFD */
+ static const char nfd[] =
+ "S\xcc\xa3\xcc\x87" /* S with dot above and below */
+ "u\xcc\x8a" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "v\xcc\x83" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "r\xcc\x8f" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "i\xcc\x88\xcc\x81" /* i with diaeresis and acute */
+ "o\xcc\x9b\xcc\x80" /* o with grave and hook */
+ "n\xcc\xad"; /* n with circumflex below */
+
+ /* Mixed, denormalized */
+ static const char mixup[] =
+ "S\xcc\x87\xcc\xa3" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "b\xcc\xb1" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "e\xcc\xa7\xcc\x86" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "s\xcc\x8c" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "o\xcc\x80\xcc\x9b" /* o with grave and hook */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ /* Invalid UTF-8 */
+ static const char invalid[] =
+ "\xe1\xb9\xa8" /* S with dot above and below */
+ "\xc5\xaf" /* u with ring */
+ "\xe1\xb8\x87" /* b with macron below */
+ "\xe1\xb9\xbd" /* v with tilde */
+ "\xe1\xb8\x9d" /* e with breve and cedilla */
+ "\xc8\x91" /* r with double grave */
+ "\xc5\xa1" /* s with caron */
+ "\xe1\xb8\xaf" /* i with diaeresis and acute */
+ "\xe6" /* Invalid byte */
+ "\xe1\xb9\x8b"; /* n with circumflex below */
+
+ SVN_ERR_ASSERT(svn_utf__is_normalized(nfc, pool));
+ SVN_ERR_ASSERT(!svn_utf__is_normalized(nfd, pool));
+ SVN_ERR_ASSERT(!svn_utf__is_normalized(mixup, pool));
+ SVN_ERR_ASSERT(!svn_utf__is_normalized(invalid, pool));
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+test_utf_conversions(apr_pool_t *pool)
+{
+ static const struct cvt_test_t
+ {
+ svn_boolean_t sixteenbit;
+ svn_boolean_t bigendian;
+ const char *source;
+ const char *result;
+ } tests[] = {
+
+#define UTF_32_LE FALSE, FALSE
+#define UTF_32_BE FALSE, TRUE
+#define UTF_16_LE TRUE, FALSE
+#define UTF_16_BE TRUE, TRUE
+
+ /* Normal character conversion */
+ { UTF_32_LE, "t\0\0\0" "e\0\0\0" "s\0\0\0" "t\0\0\0" "\0\0\0\0", "test" },
+ { UTF_32_BE, "\0\0\0t" "\0\0\0e" "\0\0\0s" "\0\0\0t" "\0\0\0\0", "test" },
+ { UTF_16_LE, "t\0" "e\0" "s\0" "t\0" "\0\0", "test" },
+ { UTF_16_BE, "\0t" "\0e" "\0s" "\0t" "\0\0", "test" },
+
+ /* Valid surrogate pairs */
+ { UTF_16_LE, "\x00\xD8" "\x00\xDC" "\0\0", "\xf0\x90\x80\x80" }, /* U+010000 */
+ { UTF_16_LE, "\x34\xD8" "\x1E\xDD" "\0\0", "\xf0\x9d\x84\x9e" }, /* U+01D11E */
+ { UTF_16_LE, "\xFF\xDB" "\xFD\xDF" "\0\0", "\xf4\x8f\xbf\xbd" }, /* U+10FFFD */
+
+ { UTF_16_BE, "\xD8\x00" "\xDC\x00" "\0\0", "\xf0\x90\x80\x80" }, /* U+010000 */
+ { UTF_16_BE, "\xD8\x34" "\xDD\x1E" "\0\0", "\xf0\x9d\x84\x9e" }, /* U+01D11E */
+ { UTF_16_BE, "\xDB\xFF" "\xDF\xFD" "\0\0", "\xf4\x8f\xbf\xbd" }, /* U+10FFFD */
+
+ /* Swapped, single and trailing surrogate pairs */
+ { UTF_16_LE, "*\0" "\x00\xDC" "\x00\xD8" "*\0\0\0", "*\xed\xb0\x80" "\xed\xa0\x80*" },
+ { UTF_16_LE, "*\0" "\x1E\xDD" "*\0\0\0", "*\xed\xb4\x9e*" },
+ { UTF_16_LE, "*\0" "\xFF\xDB" "*\0\0\0", "*\xed\xaf\xbf*" },
+ { UTF_16_LE, "\x1E\xDD" "\0\0", "\xed\xb4\x9e" },
+ { UTF_16_LE, "\xFF\xDB" "\0\0", "\xed\xaf\xbf" },
+
+ { UTF_16_BE, "\0*" "\xDC\x00" "\xD8\x00" "\0*\0\0", "*\xed\xb0\x80" "\xed\xa0\x80*" },
+ { UTF_16_BE, "\0*" "\xDD\x1E" "\0*\0\0", "*\xed\xb4\x9e*" },
+ { UTF_16_BE, "\0*" "\xDB\xFF" "\0*\0\0", "*\xed\xaf\xbf*" },
+ { UTF_16_BE, "\xDD\x1E" "\0\0", "\xed\xb4\x9e" },
+ { UTF_16_BE, "\xDB\xFF" "\0\0", "\xed\xaf\xbf" },
+
+#undef UTF_32_LE
+#undef UTF_32_BE
+#undef UTF_16_LE
+#undef UTF_16_BE
+
+ { 0 }
+ };
+
+ const struct cvt_test_t *tc;
+ const svn_string_t *result;
+ int i;
+
+ for (i = 1, tc = tests; tc->source; ++tc, ++i)
+ {
+ if (tc->sixteenbit)
+ SVN_ERR(svn_utf__utf16_to_utf8(&result, (const void*)tc->source,
+ SVN_UTF__UNKNOWN_LENGTH,
+ tc->bigendian, pool, pool));
+ else
+ SVN_ERR(svn_utf__utf32_to_utf8(&result, (const void*)tc->source,
+ SVN_UTF__UNKNOWN_LENGTH,
+ tc->bigendian, pool, pool));
+ SVN_ERR_ASSERT(0 == strcmp(result->data, tc->result));
+ }
+
+ /* Test counted strings with NUL characters */
+ SVN_ERR(svn_utf__utf16_to_utf8(
+ &result, (void*)("x\0" "\0\0" "y\0" "*\0"), 3,
+ FALSE, pool, pool));
+ SVN_ERR_ASSERT(0 == memcmp(result->data, "x\0y", 3));
+
+ SVN_ERR(svn_utf__utf32_to_utf8(
+ &result,
+ (void*)("\0\0\0x" "\0\0\0\0" "\0\0\0y" "\0\0\0*"), 3,
+ TRUE, pool, pool));
+ SVN_ERR_ASSERT(0 == memcmp(result->data, "x\0y", 3));
+
+ return SVN_NO_ERROR;
+}
+
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(utf_validate,
@@ -308,5 +839,17 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_utf_cstring_to_utf8_ex2"),
SVN_TEST_PASS2(test_utf_cstring_from_utf8_ex2,
"test svn_utf_cstring_from_utf8_ex2"),
+ SVN_TEST_PASS2(test_utf_collated_compare,
+ "test svn_utf__normcmp"),
+ SVN_TEST_PASS2(test_utf_pattern_match,
+ "test svn_utf__glob"),
+ SVN_TEST_PASS2(test_utf_fuzzy_escape,
+ "test svn_utf__fuzzy_escape"),
+ SVN_TEST_PASS2(test_utf_is_normalized,
+ "test svn_utf__is_normalized"),
+ SVN_TEST_PASS2(test_utf_conversions,
+ "test svn_utf__utf{16,32}_to_utf8"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_subr/x509-test.c b/subversion/tests/libsvn_subr/x509-test.c
new file mode 100644
index 0000000..a3806b8
--- /dev/null
+++ b/subversion/tests/libsvn_subr/x509-test.c
@@ -0,0 +1,848 @@
+/*
+ * x509-test.c -- test the x509 parser functions
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+#include <string.h>
+#include "svn_x509.h"
+#include "svn_base64.h"
+#include "svn_time.h"
+#include "svn_pools.h"
+#include "svn_string.h"
+
+#include "../svn_test.h"
+
+struct x509_test {
+ const char *base64_cert; /* Base64 encoded DER X.509 cert */
+ const char *subject; /* Subject Distinguished Name */
+ const char *subject_oids; /* Space separated list of oids in Subject */
+ const char *issuer; /* Issuer Distinguished Name */
+ const char *issuer_oids; /* Space separated list of oids in Issuer */
+
+ /* These timesamps are in the format that svn_time_to_cstring() produces.
+ * This is not the same string as the parser returns since it returns
+ * the ressult of svn_time_to_human_cstring(), which is in the local
+ * timezone. So we can't store exactly what the parser will output. */
+ const char *valid_from;
+ const char *valid_to;
+ const char *hostnames;
+ const char *sha1_digest;
+};
+
+static struct x509_test cert_tests[] = {
+ /* contains extensions and uses a sha256 algorithm */
+ { "MIIEtzCCA5+gAwIBAgIQWGBOrapkezd+BWVsAtmtmTANBgkqhkiG9w0BAQsFADA8"
+ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMuMRYwFAYDVQQDEw1U"
+ "aGF3dGUgU1NMIENBMB4XDTE0MDQxMTAwMDAwMFoXDTE2MDQwNzIzNTk1OVowgYsx"
+ "CzAJBgNVBAYTAlVTMREwDwYDVQQIEwhNYXJ5bGFuZDEUMBIGA1UEBxQLRm9yZXN0"
+ "IEhpbGwxIzAhBgNVBAoUGkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uMRcwFQYD"
+ "VQQLFA5JbmZyYXN0cnVjdHVyZTEVMBMGA1UEAxQMKi5hcGFjaGUub3JnMIIBIjAN"
+ "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Tq4mH+stRoxe4xth8tUCgLt+P4L"
+ "D/JWZz4a2IecaaAk57vIlTxEyP16fUShUfxVJnD0KV11zv2qaEUXNaA6hKd4H/oB"
+ "u2OyGev+quRM+aFCjWqASkXt7fLGsIkHAwP3XwBVBpARbcXJeCjCBxqaYrQqS8LT"
+ "wfPUD9eYncGlQ+ixb3Bosy7TmkWKeLsRdS90cAO/rdgQ8OI7kLT/1tr5GpF9RmXo"
+ "RnVqMP+U0zGd/BNNSneg7emb7TxLzxeMKZ7QbF4MZi8RRN11spvx8/f92CiYrGGu"
+ "y67VdOGPaomYc+VZ2syLwduHGK40ADrEK3+MQpsRFB0dM08j9bhpr5A44wIDAQAB"
+ "o4IBYzCCAV8wFwYDVR0RBBAwDoIMKi5hcGFjaGUub3JnMAkGA1UdEwQCMAAwQgYD"
+ "VR0gBDswOTA3BgpghkgBhvhFAQc2MCkwJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3"
+ "LnRoYXd0ZS5jb20vY3BzLzAOBgNVHQ8BAf8EBAMCBaAwHwYDVR0jBBgwFoAUp6KD"
+ "uzRFQD381TBPErk+oQGf9tswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL3N2ci1v"
+ "di1jcmwudGhhd3RlLmNvbS9UaGF3dGVPVi5jcmwwHQYDVR0lBBYwFAYIKwYBBQUH"
+ "AwEGCCsGAQUFBwMCMGkGCCsGAQUFBwEBBF0wWzAiBggrBgEFBQcwAYYWaHR0cDov"
+ "L29jc3AudGhhd3RlLmNvbTA1BggrBgEFBQcwAoYpaHR0cDovL3N2ci1vdi1haWEu"
+ "dGhhd3RlLmNvbS9UaGF3dGVPVi5jZXIwDQYJKoZIhvcNAQELBQADggEBAF52BLvl"
+ "x5or9/aO7+cPhxuPxwiNRgbvHdCakD7n8vzjNyct9fKp6/XxB6GQiTZ0nZPJOyIu"
+ "Pi1QDLKOXvaPeLKDBilL/+mrn/ev3s/aRQSrUsieKDoQnqtmlxEHc/T3+Ni/RZob"
+ "PD4GzPuNKpK3BIc0fk/95T8R1DjBSQ5/clvkzOKtcl3VffAwnHiE9TZx9js7kZwO"
+ "b9nOKX8DFao3EpQcS7qn63Ibzbq5A6ry8ZNRQSIJK/xlCAWoyUd1uxnqGFnus8wb"
+ "9RVZJQe8YvyytBjgbE3QjnfPOxoEJA3twupnPmH+OCTM6V3TZqpRZj/sZ5rtIQ++"
+ "hI5FdJWUWVSgnSw=",
+ "C=US, ST=Maryland, L=Forest Hill, O=Apache Software Foundation, "
+ "OU=Infrastructure, CN=*.apache.org",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.11 2.5.4.3",
+ "C=US, O=Thawte, Inc., CN=Thawte SSL CA",
+ "2.5.4.6 2.5.4.10 2.5.4.3",
+ "2014-04-11T00:00:00.000000Z",
+ "2016-04-07T23:59:59.000000Z",
+ "*.apache.org",
+ "151d8ad1e1bac21466bc2836ba80b5fcf872f37c" },
+ /* the expiration is after 2049 so the expiration is in the
+ * generalized format, while the start date is still in the UTC
+ * format. Note this is actually a CA cert but that really doesn't
+ * matter here. */
+ { "MIIDtzCCAp+gAwIBAgIJAJKX85dqh3RvMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV"
+ "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX"
+ "aWRnaXRzIFB0eSBMdGQwIBcNMTQwNjI3MTczMTUxWhgPMjExNDA2MDMxNzMxNTFa"
+ "MEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJ"
+ "bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw"
+ "ggEKAoIBAQDaa4gwNBB6vgWrlOIEMdzvD06zmmiocEt6UnTHtmAcfrBuDnKrBwEh"
+ "f5JxneL16XIuKwK6n/4omBtem/PPjjpOLM9PMQuoO0cpQ0UGFnfpmko6PSQoqRHl"
+ "qTbDGv4usn7qdZV+FKz/B9CMonRSzWHMz5YPmqfob6BqaaJY/qJEzHJA24bm4jPH"
+ "IsaVCInEGpqAUpejwBzNujfbLibBNrVX7K846zk+tnsNR90kP5h3IRP3SdWVywKC"
+ "AMN2izzhmaDhuPzaTBobovr+ySJShmX6gdB5PpWkm6rcBl6RJ+tM0ZBSJjQvkYp4"
+ "seV+rcXFgpJP/aQL3vhDON32tjWh3A2JAgMBAAGjgacwgaQwHQYDVR0OBBYEFF+N"
+ "7TyDI8THpAbx1pfzFFtl5z4iMHUGA1UdIwRuMGyAFF+N7TyDI8THpAbx1pfzFFtl"
+ "5z4ioUmkRzBFMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8G"
+ "A1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkggkAkpfzl2qHdG8wDAYDVR0T"
+ "BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAo4t9fYe2I+XIQn8i/KI9UFEE9fue"
+ "w6rQMnf9yyd8nwL+IcV84hvyNrq0+7SptUBMq3rsEf5UIBIBI4Oa614mJ/Kt976O"
+ "S7Sa1IPH7j+zb/jqH/xGskEVi25dZz7psFCmi7Hm9dnVz9YKa2yLW6R2KZcTVxCx"
+ "SSdDRlD7SonsYeq2fGrAo7Y9xfZsiJ2ZbJ18kHs2coMWuhgSrN9jrML6mb5B+k22"
+ "/rgsCJgFsBDPBYR3ju0Ahqg7v6kwg9O2PJzyb4ljsw8oI0sCwHTZW5I5FMq2D9g6"
+ "hj80N2fhS9QWoLyeKoMTNB2Do6VaNrLrCJiscZWrsnM1f+XBqV8hMuHX8A==",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-06-27T17:31:51.000000Z",
+ "2114-06-03T17:31:51.000000Z",
+ NULL,
+ "db3a959e145acc2741f9eeecbeabce53cc5b7362" },
+ /* The subject (except for country code) is UTF-8 encoded.
+ * created with openssl using utf8-yes and string_mask=utf8only */
+ { "MIIDrTCCApWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJBVTET"
+ "MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ"
+ "dHkgTHRkMB4XDTE0MDcwMjE4MzYxMFoXDTE1MDcwMjE4MzYxMFowcjELMAkGA1UE"
+ "BhMCR1IxFTATBgNVBAgMDM6Rz4TPhM65zrrOrjETMBEGA1UEBwwKzpHOuM6uzr3O"
+ "sTEdMBsGA1UECgwUz4DOsc+BzqzOtM61zrnOs868zrExGDAWBgNVBAMMD3d3dy5l"
+ "eGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVPuQPz"
+ "INjsiXl+GeiXMzXV1Bfm8vzbQnMLAFY/ZKKK4gpy58xcNrmur//Fd38naTM/DetO"
+ "PEoDa+vQ48CnUWCDT3CKUA3BnrjtR3/EITC7XRcfk5lyk0IZr9RZB1WedQxK1n5E"
+ "Ecz8EBrm9+1442Nmg/y1F8d/2F2CjKB+PgfOP1WWaIQcsjLsftXec+kGjc34kwbS"
+ "9D9H+bRrPVcOzBZOqC+K0K7MMOxKA5mMi4b/Nlep76gTaUyonclRIADanAyaK5WG"
+ "0IkEI/nxufaP3AcPksCbroWLTkPKIe97Yj6mnzNhK9TA9w5RgdBrjNyfrwUaYiYR"
+ "FxVJN0VrHWSsRnECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYd"
+ "T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNOobRTPfoWP"
+ "EGgXVkHfwrqz7PVzMB8GA1UdIwQYMBaAFIV8JZkZ88X7MTQSsJ6/qF3KboHKMA0G"
+ "CSqGSIb3DQEBBQUAA4IBAQAam6vJUv6kcWWrEAfdnwwRmmJ4X1Jey3Sp48G35MOE"
+ "KkHtwqbtL+QU1VA2X98bEYobqZinM3e3zrlbpgbe1xoJ00MnT9CgQObXr+cum/Ql"
+ "PwWXB5fK3BrNwqRMRGc9w27FevyFeybdKhc47jEKMOANrB/aziNHaq9gBtU/HZdy"
+ "rm9TEaOHMy6vNrdpOZKpwXPxYqsQxMLpen9D64t/3P6hsV5FMQTaxSFhszidG44t"
+ "xaU4O0BOq4x//THCWguMxzO5RxW/V8wI/rkpvhAH1wljHTusnsAZea4PpstZ7+W7"
+ "43GME1DwjYdUK9HhqRNrDkiJLox4Tmegw9A7m4XLt4zu",
+ "C=GR, ST=\xce\x91\xcf\x84\xcf\x84\xce\xb9\xce\xba\xce\xae, "
+ "L=\xce\x91\xce\xb8\xce\xae\xce\xbd\xce\xb1, "
+ "O=\xcf\x80\xce\xb1\xcf\x81\xce\xac\xce\xb4\xce\xb5\xce\xb9\xce\xb3"
+ "\xce\xbc\xce\xb1, CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-07-02T18:36:10.000000Z",
+ "2015-07-02T18:36:10.000000Z",
+ "www.example.com",
+ "b3b9789d8a53868f418619565f6b56af0033bdd3" },
+ /* The issuer and subject (except for the country code) is
+ * UnversalString encoded. Created with a hacked version of openssl
+ * using utf8=yes and string_mask=MASK:256. In order for that to
+ * output UniversalString encoded data you need to change the
+ * DIRSTRING_TYPE in crypto/asn1/asn1.h to be defined as
+ * B_ASN1_DIRECTORYSTRING so that UnviersalString is available to be
+ * used in the DirectoryStrings. OpenSSL by default avoids
+ * this type (for the reasonable reason that it's wasteful and
+ * UTF-8 can encoded everything it can in the most efficient way).
+ * OU uses the mathematical monospace digits 0-9 to test characters
+ * outside of the range of the Basic Multilingual Plane */
+ { "MIIEnzCCA4egAwIBAgIBATANBgkqhkiG9w0BAQUFADCBqzELMAkGA1UEBhMCQVUx"
+ "MTAvBgNVBAgcKAAAAFMAAABvAAAAbQAAAGUAAAAtAAAAUwAAAHQAAABhAAAAdAAA"
+ "AGUxaTBnBgNVBAocYAAAAEkAAABuAAAAdAAAAGUAAAByAAAAbgAAAGUAAAB0AAAA"
+ "IAAAAFcAAABpAAAAZAAAAGcAAABpAAAAdAAAAHMAAAAgAAAAUAAAAHQAAAB5AAAA"
+ "IAAAAEwAAAB0AAAAZDAeFw0xNDA3MjIyMjM3MzBaFw0xNTA3MjIyMjM3MzBaMIH8"
+ "MQswCQYDVQQGEwJHUjEhMB8GA1UECBwYAAADkQAAA8QAAAPEAAADuQAAA7oAAAOu"
+ "MR0wGwYDVQQHHBQAAAORAAADuAAAA64AAAO9AAADsTExMC8GA1UEChwoAAADwAAA"
+ "A7EAAAPBAAADrAAAA7QAAAO1AAADuQAAA7MAAAO8AAADsTExMC8GA1UECxwoAAHX"
+ "9gAB1/cAAdf4AAHX+QAB1/oAAdf7AAHX/AAB1/0AAdf+AAHX/zFFMEMGA1UEAxw8"
+ "AAAAdwAAAHcAAAB3AAAALgAAAGUAAAB4AAAAYQAAAG0AAABwAAAAbAAAAGUAAAAu"
+ "AAAAYwAAAG8AAABtMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuYUb"
+ "aNt22rsR5Qc/2zsenSvrlbvv1CwwRPNxcWTKdLl4lJEUy5YCnQXIq3qTi+eAFetQ"
+ "MwUOZem6kgNdwmGvCz3lrLwOobd1D5mG9agzKLVUVj72csbNNFzHr8z/7oaHvYYs"
+ "eYxW3oRm6vDYtHw5spXrxTzRIAnG6foxXFYAtDDHQpdjsofxqXO67aUmmGvE5ffX"
+ "gD3dvTvjejzcjjVsLQP/HG4MQOqeIyvyyHg1E3dyOrG+3qR6RN1ZveROdvU38Udm"
+ "s0KSGVX2lDLsUTQSKg5L8CLWDHqgGQWjLZQRgRiKZId/f9ubaJdLN6KfAQ3UvYAP"
+ "bKL5/k2GpsPDE21X0QIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQf"
+ "Fh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUccHhM6C7"
+ "nGMpclkG7YLIRuFueYQwHwYDVR0jBBgwFoAUz0X1b2Ok9MVVzxqxX6MgtTwSKmYw"
+ "DQYJKoZIhvcNAQEFBQADggEBAEpqEa08JkPG+XBlLemnoJsnoaRuQnLZvSCoAwIt"
+ "fugTE8686EigTZyYVFQ+GaI+EqVeiMjpAEhS3IMbhx5VIr61S3Nta2BG9OPjr4Xf"
+ "01oUeh4egL93CpIGNwu6M1SrQv2UVAKTwahxNmNuvx6Ojx5P2tne+KJtRUiwM3dE"
+ "of78/0NJD27OwjW0ruZAifF5CAR7mhy3NOMARpE2kqZk5695OF+QCahe00Y/9ulz"
+ "sCjgjpCUYv87OTbBGC5XGRd/ZopTRqtBVxpEHX/fux5/wqxBawrCuQsVw1Kfw0Ur"
+ "30aYWLsOsRwhiQkukjQfcMra1AHLujWaAHuLIDls1ozc8xo=",
+ "C=GR, ST=\xce\x91\xcf\x84\xcf\x84\xce\xb9\xce\xba\xce\xae, "
+ "L=\xce\x91\xce\xb8\xce\xae\xce\xbd\xce\xb1, "
+ "O=\xcf\x80\xce\xb1\xcf\x81\xce\xac\xce\xb4\xce\xb5\xce\xb9\xce\xb3"
+ "\xce\xbc\xce\xb1, "
+ "OU=\xf0\x9d\x9f\xb6\xf0\x9d\x9f\xb7\xf0\x9d\x9f\xb8\xf0\x9d\x9f\xb9"
+ "\xf0\x9d\x9f\xba\xf0\x9d\x9f\xbb\xf0\x9d\x9f\xbc\xf0\x9d\x9f\xbd"
+ "\xf0\x9d\x9f\xbe\xf0\x9d\x9f\xbf, "
+ "CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.11 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-07-22T22:37:30.000000Z",
+ "2015-07-22T22:37:30.000000Z",
+ "www.example.com",
+ "cfa15310189cf89f1dadc9c989db46f287fff7a7"
+ },
+ /* The issuer and subject (except for the country code) is BMPString
+ * encoded. Created with openssl using utf8-yes and string_mask=MASK:2048.
+ */
+ { "MIID3zCCAsegAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJBVTEd"
+ "MBsGA1UECB4UAFMAbwBtAGUALQBTAHQAYQB0AGUxOTA3BgNVBAoeMABJAG4AdABl"
+ "AHIAbgBlAHQAIABXAGkAZABnAGkAdABzACAAUAB0AHkAIABMAHQAZDAeFw0xNDA3"
+ "MjIyMzAyMDlaFw0xNTA3MjIyMzAyMDlaMIGBMQswCQYDVQQGEwJHUjEVMBMGA1UE"
+ "CB4MA5EDxAPEA7kDugOuMRMwEQYDVQQHHgoDkQO4A64DvQOxMR0wGwYDVQQKHhQD"
+ "wAOxA8EDrAO0A7UDuQOzA7wDsTEnMCUGA1UEAx4eAHcAdwB3AC4AZQB4AGEAbQBw"
+ "AGwAZQAuAGMAbwBtMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqzof"
+ "mf9YANAl2I5AcUjfAAJhqc2BL6z6k0J9bWyDL7DZf6AJtD5stRjs8cgiSGfJt9Cg"
+ "YQ0Cvnwz9ztNVXLliMmiJ4V0HzG80GI6SBK0PoCVbddUV/PN7REgPNjTwMYlys5w"
+ "Yt/GR8OJJV+eb02rpAfVigDlh7CFjY/uKMs2ThPi+yQb2V6qxLk3ZKIHh5IbKQjt"
+ "zIX/W1t+hiBjojnuOmhAoEefZ583k7amR5GBZO4GS5Qfj+4kjL5xiwB3bjTC8pnV"
+ "Iv4+mN2F6xKW/9IOWZtdySDADaU2ioyuMDzzjp5N5Nt0ZGhrEG2cDC3CatZaV4U7"
+ "9yBbi6kzlo3fCbCOlQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQf"
+ "Fh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUNvwKR1v/"
+ "R0FQU1WnzqT3brNxaQQwHwYDVR0jBBgwFoAUSM/JbJVWuYFp+awSOEXZcKn1ddQw"
+ "DQYJKoZIhvcNAQEFBQADggEBABna/SiYMBJvbnI+lj7j8ddSFihaFheqtouxOB2d"
+ "tiVz5mcc5KsAFlkrxt7YcYB7SEc+K28nqGb3bfbZ18JayRBY3JS/h4WGu4eL5XkX"
+ "rceWUy60zF7DHs6p8E8HZVF1CdCC/LXr2BAdYTc/y1f37bLKVFF4mMJMP4b8/nSL"
+ "z8+oOO9CxaEjzRoCawf2+jaajXTSTDXBgIx1t6bJMAS6S6RKPaCketyAmpsOZVBS"
+ "VtBVfVIOB2zFqs6iqkXtdiOXWlZ0DBQRX0G1VD5G80RlZXs0yEfufCwLUl/TyOhM"
+ "WisUSEOzd4RlbsBj30JQkVG9+jXb2KChPkiMpg0tFi8HU3s=",
+ "C=GR, ST=\xce\x91\xcf\x84\xcf\x84\xce\xb9\xce\xba\xce\xae, "
+ "L=\xce\x91\xce\xb8\xce\xae\xce\xbd\xce\xb1, "
+ "O=\xcf\x80\xce\xb1\xcf\x81\xce\xac\xce\xb4\xce\xb5\xce\xb9\xce\xb3"
+ "\xce\xbc\xce\xb1, CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-07-22T23:02:09.000000Z",
+ "2015-07-22T23:02:09.000000Z",
+ "www.example.com",
+ "6e2cd969350979d3741b9abb66c71159a94ff971"
+ },
+ /* The issuer and subject (except for the country code) is T61String
+ * (aka TeletexString) encoded. Created with openssl using utf8=yes
+ * and string_mask=MASK:4. Note that the example chosen specifically
+ * includes the Norwegian OE (slashed O) to highlight that this is
+ * being treated as ISO-8859-1 despite what the X.509 says.
+ * See the following for the horrible details on
+ * this encoding: https://www.cs.auckland.ac.nz/~pgut001/pubs/x509guide.txt
+ */
+ { "MIIDnTCCAoWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJBVTET"
+ "MBEGA1UECBQKU29tZS1TdGF0ZTEhMB8GA1UEChQYSW50ZXJuZXQgV2lkZ2l0cyBQ"
+ "dHkgTHRkMB4XDTE0MDcyMjIzNDQxOFoXDTE1MDcyMjIzNDQxOFowYjELMAkGA1UE"
+ "BhMCTk8xGDAWBgNVBAgUD034cmUgb2cgUm9tc2RhbDEQMA4GA1UEBxQHxWxlc3Vu"
+ "ZDENMAsGA1UEChQEZPhtZTEYMBYGA1UEAxQPd3d3LmV4YW1wbGUuY29tMIIBIjAN"
+ "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8uD5f2KRXvB//mKOpCXM3h/MOjK"
+ "xUgC4TIHi3BmnYR0IDElMPJrC263/eU0hKycyegyMjXkwIN5eEx4/Nl///RrzJBQ"
+ "+uXKfEJ4hTJ5x1uUYxhmtq4djZFxfjFH5yobT/LRDkEw9b/+NiRb30P+WrxhrAKW"
+ "7GRsE2pIdPdbM2IB5v/wORB4TK0kLYkmeEPWNJd63SmX4BEC6dRAaMxLIXKn75r5"
+ "GhMHKbUdt2Yy+5s0JlN9hMWqhnavCmGquzl7y/1E1OOUIm0jhL0sJn6wVTc+UO+Q"
+ "7u/w0xf38J8SU7lW6zbcQyYaSIQCMikgpprUSXdQZZUZGmHS7Gis39SiLwIDAQAB"
+ "o3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRl"
+ "ZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUQa2QLy+4QUH8hKNdR2LcvDKYImcwHwYD"
+ "VR0jBBgwFoAUpX6YP04yWqNiziUM7h0KgrRHMF4wDQYJKoZIhvcNAQEFBQADggEB"
+ "AElYUTQp5MOQk+ykIV0MHTw9OsEvLc1ZDmChls5WKYAu6KWgBbcjcTlkTpDlydrO"
+ "6JFxvCCg0K13dYOI3K/O9icGRauIrxrJOTtaIMryj7F51C52TOVPzkjL05eZTh+q"
+ "MmP3KI3uYSpXI6D6RI6hOKIRnFiUOQuXW3I8Z7s03KScBc9PSsVrMBLBz/Vpklaf"
+ "Tv/3jVBVIZwCW67SnFQ+vqEzaM4Ns2TBodlVqB1w0enPpow8bNnUwElLQJx3GXnl"
+ "z0JTpA6AwIRCF8n+VJgNN218fo2t2vvDDW/cZ+XMXzGNVhAqQ1F8B36esxy3P8+o"
+ "Bcwx241dxeGSYFHerqrTJIU=",
+ "C=NO, ST=M\xc3\xb8re og Romsdal, L=\xc3\x85lesund, O=d\xc3\xb8me, "
+ "CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-07-22T23:44:18.000000Z",
+ "2015-07-22T23:44:18.000000Z",
+ "www.example.com",
+ "787d1577ae77b79649d8f99cf4ed58a332dc48da"
+ },
+ /* Certificate with several Subject Alt Name dNSNames. Note that
+ * the CommonName is not duplicated in the Subject Alt Name to
+ * test that the Common Name is excluded when Subject Alt Name
+ * exists. */
+ { "MIIEMTCCAxmgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJBVTET"
+ "MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ"
+ "dHkgTHRkMRwwGgYDVQQDExNJbnRlcm5ldCBXaWRnaXRzIENBMB4XDTE0MDcyNTE3"
+ "NDEwNFoXDTE1MDcyNTE3NDEwNFowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh"
+ "c2hpbmd0b24xEzARBgNVBAcTCk5vcnRoIEJlbmQxITAfBgNVBAoTGEludGVybmV0"
+ "IFdpZGdpdHMgUHR5IEx0ZDEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjAN"
+ "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxlryoK6hMhGI/UlHi7v1m+Z3tCvg"
+ "ZG1twDFNvBACpFVbJtC/v+fiy1eG7ooZ1PsdCINQ1iXLh1igevlw/4w6iTDpeSZg"
+ "OCPYqK6ejnS0bKtSB4TuP8yiQtqwaVz4yPP88lXuQJDRJzgaAR0VAhooLgEpl1z1"
+ "n9wQO15AW5swzpKcEOi4n6Zmf1t7oxOt9awAOhkL1FfFwkpbiK9yQv3TPVo+xzbx"
+ "BJxwx55RY8Dpiu0kuiTYWsd02pocb0uIqd7a5B4y05PhJseqwyX0Mw57HBBnbru1"
+ "lCetP4PkoM2gf7Uoj9e61nmM1mustKTIPvh7tZHWW3UW9JxAFG+6FkKDewIDAQAB"
+ "o4HeMIHbMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh"
+ "dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQ4A9k8VwI0wv7u5rB4+1D9cuHiqTAf"
+ "BgNVHSMEGDAWgBS6O+MdRDDrD715AXdrnuNZ7wDSyjALBgNVHQ8EBAMCBeAwUwYD"
+ "VR0RBEwwSoINKi5leGFtcGxlLmNvbYIRKi5mb28uZXhhbXBsZS5jb22CESouYmFy"
+ "LmV4YW1wbGUuY29tghN6aWctemFnLmV4YW1wbGUuY29tMA0GCSqGSIb3DQEBBQUA"
+ "A4IBAQAf4IrSOL741IUkyFQrDdof39Cp87VdNEo4Bl8fUSuCjqZONxJfiAFx7GcB"
+ "Cd7h7Toe6CYCeQLHSEXQ1S1eWYLIq0ZoP3Q/huJdoH7yskDyC5Faexph0obKM5hj"
+ "+EYGW2W/UYBzEZai+eePBovARDlupiMaTJGvtdU/AcgMhXCoGNK6egesXoiNgfFh"
+ "h+lXUNWUWm2gZlKwRJff8tkR7bIG7MGzyL6Rqav2/tQdbFVXN5AFPdYPFLf0Vo5m"
+ "eGYM87TILfSo7n7Kh0aZovwcuF/vPUWRJl3B1HaPt9k6DhcFyAji0SJyZWyM4v88"
+ "GSq5Dk8dnTdL2otToll+r4IqFLlp",
+ "C=US, ST=Washington, L=North Bend, O=Internet Widgits Pty Ltd, "
+ "CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=Internet Widgits CA",
+ "2.5.4.6 2.5.4.8 2.5.4.10 2.5.4.3",
+ "2014-07-25T17:41:04.000000Z",
+ "2015-07-25T17:41:04.000000Z",
+ "*.example.com, *.foo.example.com, *.bar.example.com, zig-zag.example.com",
+ "9c365d27b7b6cc438576a8e465685ea7a4f61129"
+ },
+ /* This is a CA cert that has a Common Name that doesn't look like
+ * a hostname. Make sure that the hostnames field remains blank for it. */
+ { "MIIEEjCCAvqgAwIBAgIJAKJarRWbvbCjMA0GCSqGSIb3DQEBBQUAMGMxCzAJBgNV"
+ "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX"
+ "aWRnaXRzIFB0eSBMdGQxHDAaBgNVBAMTE0ludGVybmV0IFdpZGdpdHMgQ0EwHhcN"
+ "MTQwNzI1MTc0MTAzWhcNMjQwNzIyMTc0MTAzWjBjMQswCQYDVQQGEwJBVTETMBEG"
+ "A1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkg"
+ "THRkMRwwGgYDVQQDExNJbnRlcm5ldCBXaWRnaXRzIENBMIIBIjANBgkqhkiG9w0B"
+ "AQEFAAOCAQ8AMIIBCgKCAQEAv0f0TAiE13WHaFv8j6M9uuniO40+Aj8cuhZtJ1GC"
+ "GI/mW56wq2BJrP6N4+jyxYbZ/13S3ypPu+N087Nc/4xaPtUD/eKqMlU+o8gHM/Lf"
+ "BEs2dUuBsvkNM0KoC04NPNTOYDnfHOrzx8iHhqlDedwmP8FeQn3rNS8k4qDyJpG3"
+ "Ay8ICz5mB07Cy6NISohTxMtatfW5yKmhnhiS92X42QAEgI1pGB7jJl1g3u+KY1Bf"
+ "/10kcramYSYIM1uB7XHQjZI4bhEhQwuIWePMOSCOykdmbemM3ijF9f531Olq+0Nz"
+ "t7lA1b/aW4PGGJsZ6uIIjKMaX4npP+HHUaNGVssgTnTehQIDAQABo4HIMIHFMB0G"
+ "A1UdDgQWBBS6O+MdRDDrD715AXdrnuNZ7wDSyjCBlQYDVR0jBIGNMIGKgBS6O+Md"
+ "RDDrD715AXdrnuNZ7wDSyqFnpGUwYzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNv"
+ "bWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEcMBoG"
+ "A1UEAxMTSW50ZXJuZXQgV2lkZ2l0cyBDQYIJAKJarRWbvbCjMAwGA1UdEwQFMAMB"
+ "Af8wDQYJKoZIhvcNAQEFBQADggEBAI442H8CpePFvOtdvcosu2N8juJrzACuayDI"
+ "Ze32EtHFN611azduqkWBgMJ3Fv74o0A7u5Gl8A7RZnfBTMX7cvpfHvWefau0xqgm"
+ "Mn8CcTUGel0qudCCMe+kPppmkgNaZFvawSqcAA/u2yni2yx8BakYYDZzyfmEf9dm"
+ "hZi5SmxFFba5UhNKOye0GKctT13s/7EgfFNyVhZA7hWU26Xm88QnGnN/qxJdpq+e"
+ "+Glctn9tyke4b1VZ2Yr+R4OktrId44ZQcRD44+88v5ThP8DQsvkXcjREMFAIPkvG"
+ "CEDOIem4l9KFfnsHn8/4KvoBRkmCkGaSwOwUdUG+jIjBpY/82kM=",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=Internet Widgits CA",
+ "2.5.4.6 2.5.4.8 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=Internet Widgits CA",
+ "2.5.4.6 2.5.4.8 2.5.4.10 2.5.4.3",
+ "2014-07-25T17:41:03.000000Z",
+ "2024-07-22T17:41:03.000000Z",
+ NULL,
+ "b9decce236aa1da07b2bf088160bffe1469b9a4a"
+ },
+ /* Cert with a IP SAN entry. Make sure we properly skip them. */
+ { "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJBVTET"
+ "MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ"
+ "dHkgTHRkMRwwGgYDVQQDExNJbnRlcm5ldCBXaWRnaXRzIENBMB4XDTE0MDcyNTE4"
+ "NDMyOFoXDTE1MDcyNTE4NDMyOFowczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh"
+ "c2hpbmd0b24xEzARBgNVBAcTCk5vcnRoIEJlbmQxITAfBgNVBAoTGEludGVybmV0"
+ "IFdpZGdpdHMgUHR5IEx0ZDEXMBUGA1UEAxMOaXAuZXhhbXBsZS5jb20wggEiMA0G"
+ "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXKkSxg89tu5/n+lIC8ajj1T9vsO5B"
+ "nRH5Sne7UPc6pGMTNFi1MOVjdDWkmuCUzoI+HKLDc69/4V5RU12N1QNgsgcOzCSo"
+ "qgxa+dQk2s1shz1zhyaHkpdeMZU3/p9D4v+nRGAdYifwl/VOTwjWWucNzHDBwvb6"
+ "+Wm4pXE94Y5p8fY/lZi7VgtxdoPdSHGkIAps8psZGPjqKpLEjnLMp1n0v9cZhBF6"
+ "OoMUZpQuwcjT8vMQppgIWhZFLiH2jn7FTYWZyB0Dh9nMd097NQA87VtVfNc+g0oY"
+ "qLe3YldJgvVfyeSLhnyv68fBfGcTj310pNrGeE/m4tyxupiUT8BitfxPAgMBAAGj"
+ "geQwgeEwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0"
+ "ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFI09JZlhKV44Z+I5d58V/ZDqQ7yZMB8G"
+ "A1UdIwQYMBaAFDjQVnIU9pQI1nM8jjmxYiicMTdGMAsGA1UdDwQEAwIF4DBZBgNV"
+ "HREEUjBQgg0qLmV4YW1wbGUuY29tghEqLmZvby5leGFtcGxlLmNvbYcEfwAAAYIR"
+ "Ki5iYXIuZXhhbXBsZS5jb22CE3ppZy16YWcuZXhhbXBsZS5jb20wDQYJKoZIhvcN"
+ "AQEFBQADggEBAEK+XIGwavf+5Ht44ifHrGog0CDr4ESg7wFjzk+BJwYDtIPp9b8A"
+ "EG8qbfmOS+2trG3zc74baf2rmrfn0YGZ/GV826NMTaf7YU1/tJQTo+RX9g3aHg6f"
+ "pUBfIyAV8ELq84sgwd1PIgleVgIiDrz+a0UZ05Z5S+GbR2pwNH6+fO0O5E9clt2a"
+ "Cute1UMBqAMGKiFaP8HD6SUFTdTKZNxHtQzYmmuvoC1nzVatMFdkTuQgSQ/uNlzg"
+ "+yUFoufMZhs3gPx9PfXGOQ7f3nKE+WCK4KNGv+OILYsk4zUjMznfAwBRs9PyITN2"
+ "BKe64WsF6ZxTq3zLVGy5I8LpbtlvSmAaBp4=",
+ "C=US, ST=Washington, L=North Bend, O=Internet Widgits Pty Ltd, "
+ "CN=ip.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=Internet Widgits CA",
+ "2.5.4.6 2.5.4.8 2.5.4.10 2.5.4.3",
+ "2014-07-25T18:43:28.000000Z",
+ "2015-07-25T18:43:28.000000Z",
+ "*.example.com, *.foo.example.com, *.bar.example.com, zig-zag.example.com",
+ "3525fb617c232fdc738d736c1cbd5d97b19b51e4"
+ },
+ /* Cert with the signature algorithm OID set to sha1WithRSA instead of
+ * sha1WithRSAEncryption. Both have the same meaning but the sha1WithRSA
+ * doesn't seem to be used anymore and is shorter */
+ { "MIIDgDCCAmygAwIBAgIBATAJBgUrDgMCHQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYD"
+ "VQQIFApTb21lLVN0YXRlMSEwHwYDVQQKFBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBM"
+ "dGQwHhcNMTQwODE4MDk1OTQ1WhcNMTUwODE4MDk1OTQ1WjBNMQswCQYDVQQGEwJV"
+ "SzEQMA4GA1UECBQHRW5nbGFuZDESMBAGA1UEBxQJU2hlZmZpZWxkMRgwFgYDVQQD"
+ "FA93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
+ "AQCkvtieKg33RSzhn5JMDPPRlDS8Q16CN96A4lLI9YrJCy33z46PrbR2mq2hOz5l"
+ "MdgbAaRF0MUGhcKv4msJ0bsWhkybaSBAVgnoC7ObQWPNF7ppMzUjeDAlUBXNfheR"
+ "ZcgcgGWqUkoB1uUMhvmVuPrzvxn+WCwyoP6zQCviYLsR8AygGQgdhV6c9wJ/x9HS"
+ "MRUvUOeo7SCmx9GK5Hc11QV2K3rwKXABeAxXNzbyQe7hFfQYCI2SB5s3bEnhIvg7"
+ "BG0BQmoprHjXWBftc0+msKQTFw7+jZ21NsfwGoPonuVsCOJjJ51jp2oKqk3b1GGc"
+ "DEmmMQ0JtqfHO5a7JACBaHbTAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4"
+ "QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSo"
+ "jICtcIgZL6OCCB5BJ5PGf1UIyTAfBgNVHSMEGDAWgBT5KQMLMylrXSQvhMtONHZc"
+ "22Jm9TAJBgUrDgMCHQUAA4IBAQCvCJ4i2kRzSRhnlDxd0UbQtytVIJFFJlfREPTM"
+ "j8+VqqtCVyPSX8T5NU+HCiEmhVrTlm/W0i8ygJXr8izyIMGRqbyhn2M9b8hAY6Jl"
+ "0edztu/FV/YHsJbPznWkXWpMMaXDEX4wI329f5odccIbB5VSaaoAdKZ6Ne4nf6oV"
+ "95KRFWkXoYjm24TnpALsNnK1Kjjed6h5ApB+IANOpXYFbGcsfbuKhWbFd2nd6t5U"
+ "NpUcv4H9Tgdl6KgrfsbQtAeouWCgoiNzrul8FOaQTdJLZfCsjuE+IkGpM+DX8PiF"
+ "5M41EqkSKia8sChFIln+lkRY41OWP9uQ1VXCfdRIzOnXWh9U",
+ "C=UK, ST=England, L=Sheffield, CN=www.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2014-08-18T09:59:45.000000Z",
+ "2015-08-18T09:59:45.000000Z",
+ "www.example.com",
+ "0e0869961d508b13bb22aa8da675b2e9951c0e70"
+ },
+ /* X.509 v1 certificate, we used to crash on these prior to r1619861. */
+ { "MIIDDTCCAfUCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV"
+ "BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0"
+ "ZDAeFw0xNTAxMTkyMjEyNDhaFw0xNjAxMTkyMjEyNDhaMFQxCzAJBgNVBAYTAlVT"
+ "MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQHEwpOb3J0aCBCZW5kMRswGQYD"
+ "VQQDExJ4NTA5djEuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw"
+ "ggEKAoIBAQDniW3DmGGtA0MoYqE9H55/RmjtTJD2WVmM/STEsw+RW74UGsZ62qfi"
+ "ADedl4ukZYKlk3TwJrGEwDBKOMWHuzCYVxhclyHkHwX7QqamvZRgaOonEu82KHuE"
+ "dZo4FhOWDC9D0yS4RFbfqvSu/JG19FYsnRQn1RPFYji6jG9TRwavplVBiMhR68kc"
+ "8HTW1Wu7uJ5SV0UtTicFes8MGek3+zWceGt+Egwd2UlIYXwTPzB5m7UPuufEdvFL"
+ "ED3pusVatohFzjCbYsuJIR5ppYd49uTxPWGvRidJ2C8GbDf9PCgDduS0Gz91Txnw"
+ "h+WiVYCQ6SxAJWp/xeZWE71k88N0vJEzAgMBAAEwDQYJKoZIhvcNAQEFBQADggEB"
+ "ABoBaObsHnIrkd3RvvGb5q7fnEfiT1DXsufS3ypf4Z8IST/z+NeaUaiRN1oLcvDz"
+ "qC7ygTYZ2BZoEw3ReCGqQWT4iYET+lH8DM+U5val3gVlSWqx1jj/wiV1OAxQsakM"
+ "BnmNs/MDshiv54irvSlqnxEp2o/BU/vMrN656C5DJkZpYoMpIWxdFnd+bzNzuN1k"
+ "pJfTjzWlGckKfdblNPOfdtccTqtQ5d4mWtYNJ8DfL5rRRwCuzXvZtbVHKxqkXaXr"
+ "CYUfFUobapgPfvvMc1QcDY+2nvhC2ij+HAPIHgZPuzJsjZRC1zwg074cfgjZbgbm"
+ "R0HVF486p3vS8HFv4lndRZA=",
+ "C=US, ST=Washington, L=North Bend, CN=x509v1.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2015-01-19T22:12:48.000000Z",
+ "2016-01-19T22:12:48.000000Z",
+ "x509v1.example.com",
+ "5730dd65a7f77fdf0dfd90e5a53119f38854af29"
+ },
+ /* X.509 v1 certificate with an X.509 v3 Subject Alternative Name
+ * extension. Although these are ill-formed per RFC 5280 s. 4.1, we
+ * suspect that they could exist in the real world. Make sure we do
+ * not error out, and that we pick up SAN (b.example.com) from the
+ * extension. */
+ { "MIIDLzCCAhcCAQ8wDQYJKoZIhvcNAQEFBQAwKzEpMCcGA1UEAwwgSW50ZXJuZXQg"
+ "V2lkZ2l0cyBJbnRlcm1lZGlhdGUgQ0EwHhcNMTUwMTI5MDAzMzU1WhcNMTYwMTI5"
+ "MDAzMzU1WjByMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjETMBEG"
+ "A1UEBwwKTm9ydGggQmVuZDEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkg"
+ "THRkMRYwFAYDVQQDDA1hLmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC"
+ "AQ8AMIIBCgKCAQEAs0hj2xPRQZpecqk0Ih1l4juAuQZeSgv3yD/VtSq/9sTBH6iA"
+ "4XjJQcHROYxYaK0QS/qlCjpl+Q3mOaVIu+59TLy3T2YVgqMYmgB453ntuJPkdF1C"
+ "fJ2j19YAQZHHdOFaP1G+auBwjmHns3+MkG4s7EPuJP7TBCcSFlOmz5D4GUui3NVG"
+ "LBYUog1ZhF4oe/7d4jc2Cn8uypNT/Hc1ViIlCT4rFoAirv9Uob+4zjQ3Z18I1Ql1"
+ "t8oszVCj3kKDboEty2RduwPLx/2ztWYBCvFhd49JGdi/nzMi+j2d5HCI3V8W06pN"
+ "mvrVU4G0ImVRa8wpmQCSm2Tp0s42FAVHWw8yMwIDAQABoxwwGjAYBgNVHREEETAP"
+ "gg1iLmV4YW1wbGUuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQDI/n0NYakuRP/485/A"
+ "dan71qBy3sljjOreq71IfBdtq+GEjCL1B0TD0V338LXki9NicCLeD/MWfceDjV0u"
+ "AjPTxaZEn/NWqXo0mpNC535Y6G46mIHYDGC8JyvCJjaXF+GVstNt6lXzZp2Yn3Si"
+ "K57uVb+zz5zAGSO982I2HACZPnF/oAtp7bwxzwvBsLqSLw3hh0ATVPp6ktE+WMoI"
+ "X75CVcDmU0zjXqzKiFPKeTVjQG6YxgvplMaag/iNngkgEhX4PIrxdIEsHf8l9ogC"
+ "dz51MFxetsC4D2KRq8IblF9i+9r3hlv+Dbf9ovYe9Hu0usloSinImoWOw42iWWmP"
+ "vT4l",
+ "C=US, ST=Washington, L=North Bend, O=Internet Widgits Pty Ltd, "
+ "CN=a.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.10 2.5.4.3",
+ "CN=Internet Widgits Intermediate CA",
+ "2.5.4.3",
+ "2015-01-29T00:33:55.000000Z",
+ "2016-01-29T00:33:55.000000Z",
+ "b.example.com",
+ "47fa5c76fee6e21e37def6da3746bba84a5a09bf"
+ },
+ /* X.509 certificate with multiple Relative Distinguished Names
+ * Borrowed form the Chromium test suite see thier bug here
+ * https://code.google.com/p/chromium/issues/detail?id=101009
+ */
+ { "MIICsDCCAhmgAwIBAgIJAO9sL1fZ/VoPMA0GCSqGSIb3DQEBBQUAMHExbzAJBgNV"
+ "BAYTAlVTMA8GA1UECgwIQ2hyb21pdW0wFgYKCZImiZPyLGQBGRYIQ2hyb21pdW0w"
+ "GgYDVQQDDBNNdWx0aXZhbHVlIFJETiBUZXN0MB0GA1UECwwWQ2hyb21pdW0gbmV0"
+ "X3VuaXR0ZXN0czAeFw0xMTEyMDIwMzQ3MzlaFw0xMjAxMDEwMzQ3MzlaMHExbzAJ"
+ "BgNVBAYTAlVTMA8GA1UECgwIQ2hyb21pdW0wFgYKCZImiZPyLGQBGRYIQ2hyb21p"
+ "dW0wGgYDVQQDDBNNdWx0aXZhbHVlIFJETiBUZXN0MB0GA1UECwwWQ2hyb21pdW0g"
+ "bmV0X3VuaXR0ZXN0czCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAnSMQ7YeC"
+ "sOuk+0n128F7TfDtG/X48sG10oTe65SC8N6LBLfo7YYiQZlWVHEzjsFpaiv0dx4k"
+ "cIFbVghXAky/r5qgM1XiAGuzzFw7R27cBTC9DPlRwHArP3CiEKO3iz8i+qu9x0il"
+ "/9N70LcSSAu/kGLxikDbHRoM9d2SKhy2LGsCAwEAAaNQME4wHQYDVR0OBBYEFI1e"
+ "cfoqc7qfjmMyHF2rh9CrR6u3MB8GA1UdIwQYMBaAFI1ecfoqc7qfjmMyHF2rh9Cr"
+ "R6u3MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGKwN01A47nxVHOkw"
+ "wFdbT8t9FFkY3pIg5meoqO3aATNaSEzkZoUljWtWgWfzr+n4ElwZBxeYv9cPurVk"
+ "a+wXygzWzsOzCUMKBI/aS8ijRervyvh6LpGojPGn1HttnXNLmhy+BLECs7cq6f0Z"
+ "hvImrEWhD5uZGlOxaZk+bFEjQHA=",
+ "C=US, O=Chromium, 0.9.2342.19200300.100.1.25=Chromium, "
+ "CN=Multivalue RDN Test, OU=Chromium net_unittests",
+ "2.5.4.6 2.5.4.10 0.9.2342.19200300.100.1.25 2.5.4.3 2.5.4.11",
+ "C=US, O=Chromium, 0.9.2342.19200300.100.1.25=Chromium, "
+ "CN=Multivalue RDN Test, OU=Chromium net_unittests",
+ "2.5.4.6 2.5.4.10 0.9.2342.19200300.100.1.25 2.5.4.3 2.5.4.11",
+ "2011-12-02T03:47:39.000000Z",
+ "2012-01-01T03:47:39.000000Z",
+ NULL,
+ "99302ca2824f585a117bb41302a388daa0519765"
+ },
+ /* certificate with subject that includes an attribute that has an
+ * object id that has leading zeros. This isn't technically legal
+ * but a simplistic parser might parser it the same as an object
+ * id that doesn't have a leading zero. In this case the object id
+ * with a leading zero could parse to the same object id as the
+ * Common Name. Make sure we don't treat it as such. */
+ { "MIIDDjCCAfYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV"
+ "BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0"
+ "ZDAeFw0xNTAxMjcwNzQ5MDhaFw0xNjAxMjcwNzQ5MDhaMFUxCzAJBgNVBAYTAlVT"
+ "MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQHEwpOb3J0aCBCZW5kMRwwGgYE"
+ "VQSAAxMSbm90YWNuLmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A"
+ "MIIBCgKCAQEAvXCJv0gr9d3GNYiukPrbse0FdXmuBx2mPf665WyZVHk9JiPnDcb2"
+ "ng8gHLgJe8izou6I0vN2iJgy91rUPvX9zA3qVhml+cboVY2jHCPWo/v5PQsXAgLV"
+ "5gVjp2POn3N0O1xcS1yNe249LkP0Di3kAMp5gkzdprm3fD3JDW1Q+ocQylnbjzG0"
+ "FtNQSUJLITvPXjR7ny46Fci2mv8scHOvlEXTK5/2RoBaoK2jWQimqGfFj1sr1vqZ"
+ "Wcb6NAdZso64Xg1V6CWX8zymlA7gAhTQWveq+ovUWcXpmR8aj9pYNuy0aZW3BANz"
+ "N6L0G7OZiVUvvzpfnn0V3Z/sR/iQs7q3nQIDAQABMA0GCSqGSIb3DQEBBQUAA4IB"
+ "AQACZwruCiesCRkT08AtHl0WQnQui58e9/7En+iqxNQO6+fx84SfWGcUFYZtvzdO"
+ "KkHNTs06km+471OjLSDcotRkdqO1JxQCkNxbrPat7T6FrO9n2JFivx6eijRqK/jB"
+ "cBYW92dK4BfXU4+FyeB2OIpyPjuqLU2j7S5p7qNU50i/1J7Qt669nXeaPINIfZdW"
+ "sDjjWkFR1VOgXS/zeu/GOxlQFmmcde+X/qkFI+L352VX7Ktf95j4ms4vG2yZgNfe"
+ "jbNb9a7LMcqlop/PlX5WBGv8GGKUNZO0LvukFYOULf1oL8VQsN0x/gRHGC7m9kVM"
+ "3hojWZDXAY4mYqdBCRX7/gkt",
+ "C=US, ST=Washington, L=North Bend, 2.5.4.03=notacn.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.03",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2015-01-27T07:49:08.000000Z",
+ "2016-01-27T07:49:08.000000Z",
+ NULL,
+ "6f24b834ba00fb4ef863df63b8fbeddab25e4838"
+ },
+ /* certificate with subject that includes an attribute that has an
+ * object id that has an overflow such that it calculates to
+ * the same object id as the Common Name (2.5.4.3). OpenSSL
+ * with its bignum support shows this as 2.5.4.2361183241434822606851.
+ * It would be wrong to display this as a Common Name to the user. */
+ { "MIIDGTCCAgECAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV"
+ "BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0"
+ "ZDAeFw0xNTAxMjcwODMxNDNaFw0xNjAxMjcwODMxNDNaMGAxCzAJBgNVBAYTAlVT"
+ "MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQHEwpOb3J0aCBCZW5kMScwJQYN"
+ "VQSCgICAgICAgICAAxMUb3ZlcmZsb3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3"
+ "DQEBAQUAA4IBDwAwggEKAoIBAQDHL1e8zSPyRND3tI42Vqca2FoCiWn881Czv2ct"
+ "tGFwyjUM8R1yHXEP+doS9KN9L29xRWZRxyCQ18S+QbjNQCh6Ay22qnkBu0uPdVB6"
+ "iIVKiW9RzU8dZSFMnveUZYLloG12kK++ooJGIstTJwkI8Naw1X1D29gZaY9oSKAc"
+ "Gs5c92po61RoetB744dUfUbAXi8eEd4ShdsdnCoswpEI4WTLdYLZ/cH/sU1a5Djm"
+ "cAfEBzZSOseEQSG7Fa/HvHyW+jDNnKG2r73M45TDcXAunSFcAYl1ioBaRwwdcTbK"
+ "SMGORThIX5UwpJDZI5sTVmTTRuCjbMxXXki/g9fTYD6mlaavAgMBAAEwDQYJKoZI"
+ "hvcNAQEFBQADggEBABvZSzFniMK4lqJcubzzk410NqZQEDBxdNZTNGrQYIDV8fDU"
+ "LLoQ2/2Y6kOQbx8r3RNcaJ6JtJeVqAq05It9oR5lMJFA2r0YMl4eB2V6o35+eaKY"
+ "FXrJzwx0rki2mX+iKsgRbJTv6mFb4I7vny404WKHNgYIfB8Z5jgbwWgrXH9M6BMb"
+ "FL9gZHMmU+6uqvCPYeIIZaAjT4J4E9322gpcumI9KGVApmbQhi5lC1hBh+eUprG7"
+ "4Brl9GeCLSTnTTf4GHIpqaUsKMtJ1sN/KJGwEB7Z4aszr80P5/sjHXOyqJ78tx46"
+ "pwH7/Fx0pM7nZjJVGvcxGBBOMeKy/o2QUVvEYPU=",
+ "C=US, ST=Washington, L=North Bend, \?\?=overflow.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 \?\?",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2015-01-27T08:31:43.000000Z",
+ "2016-01-27T08:31:43.000000Z",
+ NULL,
+ "c1f063daf23e402fe58bab1a3fa2ba05c1106158"
+ },
+ /* certificate with multiple common names, make sure this behaves
+ * the same way as serf. */
+ { "MIIDJjCCAg4CAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV"
+ "BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0"
+ "ZDAeFw0xNTAxMjExNzUwMDZaFw0xNjAxMjExNzUwMDZaMG0xCzAJBgNVBAYTAlVT"
+ "MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQHEwpOb3J0aCBCZW5kMRkwFwYD"
+ "VQQDExBnb29kLmV4YW1wbGUuY29tMRkwFwYDVQQDExBldmlsLmV4YW1wbGUuY29t"
+ "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5pfrXkiiDGCWSYhMQNHJ"
+ "gNBLEBNcFzsGpW8i6rMKVephwG7p4VqIvc0pSsmpD9IYuIxxq/2E2cziaTWyqCBp"
+ "hKKipqt8eMcu6u45LduHGiCcnN7rHORbQZTdvwzTmiVN1eI1oCVejB4zgHNkHUko"
+ "DyaALCHGRz8l7Qq6hSbiOnhH1qlscIIEsgQEyDlMZpbsWVTQKPxluhtgqVEn7wPN"
+ "qScrf2evq050NuNYYFzCmuqOGKq2gKbD/BlUqCNmEM2JPg/bdcAQxFCf0HcvDiS9"
+ "e29suMKWZAzJkbzrWhlDMG1Xt5c7dd82PcGwnL//Q7muE57luCw38Gp2vQQ3/Uki"
+ "vQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBry9wfxYia/dCSKvDXOBKUgWFQtI8j"
+ "7vYHuouTvIb5m6b62kiUdtuaVKi3jnUbHUFohOi/6o+HIwbXSgz5CbiLjgUvONBU"
+ "BLekaguIYX9tTmg+vhWchcmVMHufj6HdQkzWtyojSQD9GjHGInNDG102KlN1cdL8"
+ "jGTrru4vnef+xA24EvYPdcS2+H2yYH0THL3JPKo1GtO4NCEGWQbS6Ygwcy+BQpbU"
+ "TBIWhlbleuCalB8qhWyijcHeszT7mFR0CarEaSLeZj6FaQpZB636iHuELmxcgiFw"
+ "j3r3QZyAMEGvPPBPKYSTgmol31pX9LYvuFGA9ADQ2in/n9WdMfYzFzOn",
+ "C=US, ST=Washington, L=North Bend, "
+ "CN=good.example.com, CN=evil.example.com",
+ "2.5.4.6 2.5.4.8 2.5.4.7 2.5.4.3 2.5.4.3",
+ "C=AU, ST=Some-State, O=Internet Widgits Pty Ltd",
+ "2.5.4.6 2.5.4.8 2.5.4.10",
+ "2015-01-21T17:50:06.000000Z",
+ "2016-01-21T17:50:06.000000Z",
+ "good.example.com",
+ "9693f17e59205f41ca2e14450d151b945651b2d7"
+ },
+ { NULL }
+};
+
+static svn_error_t *
+compare_dates(const char *expected,
+ apr_time_t actual,
+ const char *type,
+ const char *subject,
+ apr_pool_t *pool)
+{
+ apr_time_t expected_tm;
+
+ if (!actual)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "No %s for cert '%s'", type, subject);
+
+ SVN_ERR(svn_time_from_cstring(&expected_tm, expected, pool));
+ if (!expected_tm)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Problem converting expected %s '%s' to text "
+ "output for cert '%s'", type, expected,
+ subject);
+
+ if (expected_tm != actual)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "The %s didn't match expected '%s',"
+ " got '%s' for cert '%s'",
+ type, expected,
+ svn_time_to_cstring(actual, pool),
+ subject);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+compare_hostnames(const char *expected,
+ const apr_array_header_t *actual,
+ const char *subject,
+ apr_pool_t *pool)
+{
+
+ int i;
+ svn_stringbuf_t *buf;
+
+ if (!actual)
+ {
+ if (expected)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "The hostnames didn't match expected '%s',"
+ " got NULL for cert '%s'",
+ expected, subject);
+ return SVN_NO_ERROR;
+ }
+
+ buf = svn_stringbuf_create_empty(pool);
+ for (i = 0; i < actual->nelts; ++i)
+ {
+ const char *hostname = APR_ARRAY_IDX(actual, i, const char*);
+ if (i > 0)
+ svn_stringbuf_appendbytes(buf, ", ", 2);
+ svn_stringbuf_appendbytes(buf, hostname, strlen(hostname));
+ }
+
+ if (strcmp(expected, buf->data))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "The hostnames didn't match expected '%s',"
+ " got '%s' for cert '%s'",
+ expected, buf->data, subject);
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+compare_oids(const char *expected,
+ const apr_array_header_t *actual,
+ const char *subject,
+ apr_pool_t *pool)
+{
+ int i;
+ svn_stringbuf_t *buf;
+
+ if (!actual)
+ {
+ if (expected)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "The oids didn't match expected '%s',"
+ " got NULL for cert '%s'",
+ expected, subject);
+ return SVN_NO_ERROR;
+ }
+
+ buf = svn_stringbuf_create_empty(pool);
+ for (i = 0; i < actual->nelts; ++i)
+ {
+ apr_size_t len;
+ const svn_x509_name_attr_t *attr = APR_ARRAY_IDX(actual, i, const svn_x509_name_attr_t *);
+ const void *oid = svn_x509_name_attr_get_oid(attr, &len);
+ const char *oid_string = svn_x509_oid_to_string(oid, len, pool, pool);
+ if (i > 0)
+ svn_stringbuf_appendbyte(buf, ' ');
+ if (oid_string)
+ svn_stringbuf_appendcstr(buf, oid_string);
+ else
+ svn_stringbuf_appendcstr(buf, "??");
+ }
+
+ if (strcmp(expected, buf->data))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "The oids didn't match expected '%s',"
+ " got '%s' for cert '%s'",
+ expected, buf->data, subject);
+ return SVN_NO_ERROR;
+
+}
+
+
+static svn_error_t *
+compare_results(struct x509_test *xt,
+ svn_x509_certinfo_t *certinfo,
+ apr_pool_t *pool)
+{
+ const char *v;
+
+ v = svn_x509_certinfo_get_subject(certinfo, pool);
+ if (!v)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "No subject for cert '%s'", xt->subject);
+ if (strcmp(v, xt->subject))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Subject didn't match for cert '%s', "
+ "expected '%s', got '%s'", xt->subject,
+ xt->subject, v);
+
+ SVN_ERR(compare_oids(xt->subject_oids, svn_x509_certinfo_get_subject_attrs(certinfo),
+ xt->subject, pool));
+
+ v = svn_x509_certinfo_get_issuer(certinfo, pool);
+ if (!v)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "No issuer for cert '%s'", xt->subject);
+ if (strcmp(v, xt->issuer))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Issuer didn't match for cert '%s', "
+ "expected '%s', got '%s'", xt->subject,
+ xt->issuer, v);
+
+ SVN_ERR(compare_oids(xt->issuer_oids, svn_x509_certinfo_get_issuer_attrs(certinfo),
+ xt->subject, pool));
+
+ SVN_ERR(compare_dates(xt->valid_from,
+ svn_x509_certinfo_get_valid_from(certinfo),
+ "valid-from",
+ xt->subject,
+ pool));
+
+ SVN_ERR(compare_dates(xt->valid_to,
+ svn_x509_certinfo_get_valid_to(certinfo),
+ "valid-to",
+ xt->subject,
+ pool));
+
+ SVN_ERR(compare_hostnames(xt->hostnames,
+ svn_x509_certinfo_get_hostnames(certinfo),
+ xt->subject,
+ pool));
+
+ v = svn_checksum_to_cstring_display(
+ svn_x509_certinfo_get_digest(certinfo), pool);
+ if (!v)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "No SHA1 digest for cert '%s'", xt->subject);
+ if (strcmp(v, xt->sha1_digest))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "SHA1 digest didn't match for cert '%s', "
+ "expected '%s', got '%s'", xt->subject,
+ xt->sha1_digest, v);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_x509_parse_cert(apr_pool_t *pool)
+{
+ struct x509_test *xt;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ for (xt = cert_tests; xt->base64_cert; xt++)
+ {
+ const svn_string_t *der_cert;
+ svn_x509_certinfo_t *certinfo;
+
+ svn_pool_clear(iterpool);
+
+ /* Convert header-less PEM to DER by undoing base64 encoding. */
+ der_cert = svn_base64_decode_string(svn_string_create(xt->base64_cert,
+ pool),
+ iterpool);
+
+ SVN_ERR(svn_x509_parse_cert(&certinfo, der_cert->data, der_cert->len,
+ iterpool, iterpool));
+
+ SVN_ERR(compare_results(xt, certinfo, iterpool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+#if 0
+static struct x509_test broken_cert_tests[] = {
+ { NULL }
+};
+
+static svn_error_t *
+test_x509_parse_cert_broken(apr_pool_t *pool)
+{
+ struct x509_test *xt;
+ apr_pool_t *iterpool = svn_pool_create(pool);
+
+ for (xt = broken_cert_tests; xt->base64_cert; xt++)
+ {
+ const svn_string_t *der_cert;
+ svn_x509_certinfo_t *certinfo;
+
+ svn_pool_clear(iterpool);
+
+ /* Convert header-less PEM to DER by undoing base64 encoding. */
+ der_cert = svn_base64_decode_string(svn_string_create(xt->base64_cert,
+ pool),
+ iterpool);
+
+ SVN_ERR(svn_x509_parse_cert(&certinfo, der_cert->data, der_cert->len,
+ iterpool, iterpool));
+
+ SVN_ERR(compare_results(xt, certinfo, iterpool));
+ }
+
+ return SVN_NO_ERROR;
+}
+#endif
+
+/* The test table. */
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
+ {
+ SVN_TEST_NULL,
+ SVN_TEST_PASS2(test_x509_parse_cert,
+ "test svn_x509_parse_cert"),
+/* SVN_TEST_XFAIL2(test_x509_parse_cert_broken,
+ "test broken certs"), */
+ SVN_TEST_NULL
+ };
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/conflict-data-test.c b/subversion/tests/libsvn_wc/conflict-data-test.c
index 97d22ea..7d89825 100644
--- a/subversion/tests/libsvn_wc/conflict-data-test.c
+++ b/subversion/tests/libsvn_wc/conflict-data-test.c
@@ -134,7 +134,7 @@ compare_file_content(const char *file_abspath,
* conflict, or are both NULL. Return an error if not.
*
* Compare the property values found in files named by
- * ACTUAL->base_abspath, ACTUAL->my_abspath, ACTUAL->merged_abspath
+ * ACTUAL->base_abspath, ACTUAL->my_abspath, ACTUAL->merged_file
* with EXPECTED_BASE_VAL, EXPECTED_MY_VAL, EXPECTED_THEIR_VAL
* respectively, ignoring the corresponding fields in EXPECTED. */
static svn_error_t *
@@ -236,8 +236,8 @@ test_deserialize_tree_conflict(apr_pool_t *pool)
SVN_ERR(svn_wc__deserialize_conflict(&conflict, skel, "", pool, pool));
if ((conflict->node_kind != exp_conflict->node_kind) ||
- (conflict->action != exp_conflict->action) ||
- (conflict->reason != exp_conflict->reason) ||
+ (conflict->action != exp_conflict->action) ||
+ (conflict->reason != exp_conflict->reason) ||
(conflict->operation != exp_conflict->operation) ||
(strcmp(conflict->local_abspath, exp_conflict->local_abspath) != 0))
return fail(pool, "Unexpected tree conflict");
@@ -289,10 +289,12 @@ test_read_write_tree_conflicts(const svn_test_opts_t *opts,
SVN_ERR(svn_test__sandbox_create(&sbox, "read_write_tree_conflicts", opts, pool));
parent_abspath = svn_dirent_join(sbox.wc_abspath, "A", pool);
- SVN_ERR(svn_wc__db_op_add_directory(sbox.wc_ctx->db, parent_abspath,
- NULL /*props*/, NULL, pool));
child1_abspath = svn_dirent_join(parent_abspath, "foo", pool);
child2_abspath = svn_dirent_join(parent_abspath, "bar", pool);
+ SVN_ERR(sbox_wc_mkdir(&sbox, "A"));
+ SVN_ERR(sbox_wc_mkdir(&sbox, "A/bar"));
+ SVN_ERR(sbox_file_write(&sbox, "A/foo", ""));
+ SVN_ERR(sbox_wc_add(&sbox, "A/foo"));
conflict1 = tree_conflict_create(child1_abspath, svn_node_file,
svn_wc_operation_merge,
@@ -606,22 +608,22 @@ test_serialize_tree_conflict(const svn_test_opts_t *opts,
SVN_TEST_ASSERT(complete); /* Everything available */
{
- svn_wc_conflict_reason_t local_change;
- svn_wc_conflict_action_t incoming_change;
+ svn_wc_conflict_reason_t reason;
+ svn_wc_conflict_action_t action;
const char *moved_away_op_root_abspath;
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&local_change,
- &incoming_change,
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason,
+ &action,
&moved_away_op_root_abspath,
sbox.wc_ctx->db,
sbox.wc_abspath,
conflict_skel,
pool, pool));
- SVN_TEST_ASSERT(local_change == svn_wc_conflict_reason_moved_away);
- SVN_TEST_ASSERT(incoming_change == svn_wc_conflict_action_delete);
- SVN_TEST_ASSERT(!strcmp(moved_away_op_root_abspath,
- sbox_wc_path(&sbox, "A/B")));
+ SVN_TEST_ASSERT(reason == svn_wc_conflict_reason_moved_away);
+ SVN_TEST_ASSERT(action == svn_wc_conflict_action_delete);
+ SVN_TEST_STRING_ASSERT(moved_away_op_root_abspath,
+ sbox_wc_path(&sbox, "A/B"));
}
return SVN_NO_ERROR;
@@ -807,9 +809,152 @@ test_prop_conflicts(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_prop_conflict_resolving(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ svn_skel_t *conflict;
+ const char *A_abspath;
+ const char *marker_abspath;
+ apr_hash_t *conflicted_props;
+ apr_hash_t *props;
+ const char *value;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "test_prop_resolving", opts, pool));
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+
+ SVN_ERR(sbox_wc_propset(&b, "prop-1", "r1", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-2", "r1", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-3", "r1", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-4", "r1", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-5", "r1", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-6", "r1", "A"));
+
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "prop-1", "r2", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-2", "r2", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-3", "r2", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-4", NULL, "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-5", NULL, "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-7", "r2", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-8", "r2", "A"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ SVN_ERR(sbox_wc_propset(&b, "prop-1", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-2", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-3", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-4", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-5", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-6", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-7", "mod", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "prop-8", "mod", "A"));
+
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ A_abspath = sbox_wc_path(&b, "A");
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ b.wc_ctx->db, A_abspath,
+ pool, pool));
+
+ /* We have tree conflicts... */
+ SVN_TEST_ASSERT(conflict != NULL);
+
+ SVN_ERR(svn_wc__conflict_read_prop_conflict(&marker_abspath,
+ NULL, NULL, NULL,
+ &conflicted_props,
+ b.wc_ctx->db, A_abspath,
+ conflict,
+ pool, pool));
+
+ SVN_TEST_ASSERT(conflicted_props != NULL);
+ /* All properties but r6 are conflicted */
+ SVN_TEST_ASSERT(apr_hash_count(conflicted_props) == 7);
+ SVN_TEST_ASSERT(! svn_hash_gets(conflicted_props, "prop-6"));
+
+ /* Let's resolve a few conflicts */
+ SVN_ERR(sbox_wc_resolve_prop(&b, "A", "prop-1",
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve_prop(&b, "A", "prop-2",
+ svn_wc_conflict_choose_theirs_conflict));
+ SVN_ERR(sbox_wc_resolve_prop(&b, "A", "prop-3",
+ svn_wc_conflict_choose_merged));
+
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ b.wc_ctx->db, A_abspath,
+ pool, pool));
+
+ /* We have tree conflicts... */
+ SVN_TEST_ASSERT(conflict != NULL);
+
+ SVN_ERR(svn_wc__conflict_read_prop_conflict(&marker_abspath,
+ NULL, NULL, NULL,
+ &conflicted_props,
+ b.wc_ctx->db, A_abspath,
+ conflict,
+ pool, pool));
+
+ SVN_TEST_ASSERT(conflicted_props != NULL);
+ SVN_TEST_ASSERT(apr_hash_count(conflicted_props) == 4);
+
+ SVN_ERR(svn_wc__db_read_props(&props, b.wc_ctx->db, A_abspath,
+ pool, pool));
+
+ value = svn_prop_get_value(props, "prop-1");
+ SVN_TEST_STRING_ASSERT(value, "mod");
+ value = svn_prop_get_value(props, "prop-2");
+ SVN_TEST_STRING_ASSERT(value, "r1");
+ value = svn_prop_get_value(props, "prop-3");
+ SVN_TEST_STRING_ASSERT(value, "mod");
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_binary_file_conflict(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_test__sandbox_t sbox;
+ const apr_array_header_t *conflicts;
+ svn_wc_conflict_description2_t *desc;
+
+ SVN_ERR(svn_test__sandbox_create(&sbox, "test_binary_file_conflict", opts, pool));
+
+ /* Create and add a binary file. */
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xff\xff"));
+ SVN_ERR(sbox_wc_add(&sbox, "binary-file"));
+ SVN_ERR(sbox_wc_propset(&sbox, SVN_PROP_MIME_TYPE,
+ "application/octet-stream", "binary-file"));
+ SVN_ERR(sbox_wc_commit(&sbox, "binary-file")); /* r1 */
+
+ /* Make a change to the binary file. */
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xfc\xfc\xfc\xfc\xfc\xfc"));
+ SVN_ERR(sbox_wc_commit(&sbox, "binary-file")); /* r2 */
+
+ /* Update back to r1, make a conflicting change to binary file. */
+ SVN_ERR(sbox_wc_update(&sbox, "binary-file", 1));
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xfd\xfd\xfd\xfd"));
+
+ /* Update to HEAD and ensure the conflict is marked as binary. */
+ SVN_ERR(sbox_wc_update(&sbox, "binary-file", 2));
+ SVN_ERR(svn_wc__read_conflicts(&conflicts, NULL, sbox.wc_ctx->db,
+ sbox_wc_path(&sbox, "binary-file"),
+ FALSE /* create_tempfiles */,
+ FALSE /* only_tree_conflict */,
+ pool, pool));
+ SVN_TEST_ASSERT(conflicts->nelts == 1);
+ desc = APR_ARRAY_IDX(conflicts, 0, svn_wc_conflict_description2_t *);
+ SVN_TEST_ASSERT(desc->is_binary);
+
+ return SVN_NO_ERROR;
+}
+
+
/* The test table. */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_deserialize_tree_conflict,
@@ -826,6 +971,11 @@ struct svn_test_descriptor_t test_funcs[] =
"read and write a tree conflict"),
SVN_TEST_OPTS_PASS(test_prop_conflicts,
"test prop conflicts"),
+ SVN_TEST_OPTS_PASS(test_prop_conflict_resolving,
+ "test property conflict resolving"),
+ SVN_TEST_OPTS_PASS(test_binary_file_conflict,
+ "test binary file conflict"),
SVN_TEST_NULL
};
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/db-test.c b/subversion/tests/libsvn_wc/db-test.c
index 45e9c4d..76ec893 100644
--- a/subversion/tests/libsvn_wc/db-test.c
+++ b/subversion/tests/libsvn_wc/db-test.c
@@ -88,248 +88,205 @@ static const char * const TESTING_DATA = (
"insert into wcroot values (1, null); "
"insert into pristine values ('$sha1$" SHA1_1 "', NULL, 15, 1, '$md5 $" MD5_1 "'); "
+);
- /* ### The file_externals column in NODES is temporary, and will be
- ### removed. However, to keep the tests passing, we need to add it
- ### to the following insert statements. *Be sure to remove it*. */
+#define NOT_MOVED FALSE, NULL
+#define NO_COPY_FROM 0, NULL, SVN_INVALID_REVNUM
+static const svn_test__nodes_data_t nodes_init_data[] = {
/* load the base nodes into the nodes table */
- "insert into nodes values ("
- " 1, '', 0, null, 1, '', 1, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'A', 0, '', 1, 'A', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'B', 0, '', 1, 'B', null, 'excluded',"
- " null, null, 'symlink', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'C', 0, '', 1, 'C', null, 'server-excluded',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'D', 0, '', 1, 'D', null, 'not-present',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'E', 0, '', 1, 'E', null, 'incomplete',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'F', 0, '', 1, 'F', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'G', 0, '', 2, 'G-alt', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'H', 0, '', 1, 'H', 1, 'normal',"
- " null, null, 'symlink', '()', null, null, 'H-target', 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'I', 0, '', 1, 'I', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J', 0, '', 1, 'J', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e', 0, 'J', 1, 'J/J-e', 1, 'normal',"
- " null, 'other/place', 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-a', 0, 'J/J-e', 1, 'J/J-e/J-e-a', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b', 0, 'J/J-e', 1, 'J/J-e/J-e-b', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b/Jeba', 0, 'J/J-e/J-e-b', 1, 'J/J-e/J-e-b/Jeba', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f', 0, 'J', 1, 'J/J-f', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f/J-f-a', 0, 'J/J-f', 1, 'J/J-f/J-f-a', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K', 0, '', 1, 'K', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-a', 0, 'K', 1, 'K/K-a', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-b', 0, 'K', 1, 'K/K-b', 1, 'normal',"
- " null, 'moved/away', 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- ""
- /* Load data into NODES table;
- ### op_depths have not been calculated by me yet;
- the value 1 is just 'good enough' to make the nodes WORKING nodes. */
- "insert into nodes values ("
- " 1, 'I', 1, '', 2, 'some/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
-
- /* I'm not sure what the working J is supposed to represent. It
- replaces the base J, but is it a copy or not? It has no
- copyfrom, but nodes like J/J-e appear to be deleted which
- implies they are children of a copied J. */
- "insert into nodes values ("
- " 1, 'J', 1, '', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-a', 1, 'J', null, null, null, 'normal',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b', 2, 'J', 2, 'some/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b/J-b-a', 3, 'J/J-b', 2, 'another/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b/J-b-b', 2, 'J/J-b', null, null, 2, 'normal',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c', 1, 'J', null, null, null, 'normal',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c/J-c-a', 1, 'J/J-c', null, null, null, 'normal',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c', 2, 'J', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c/J-c-a', 2, 'J/J-c', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-d', 2, 'J', 2, 'moved/file', 2, 'normal',"
- " 1, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'moved/file', 0, 'moved', 2, 'moved/file', 2, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'moved/file', 2, 'moved', 2, 'moved/file', 2, 'base-deleted',"
- " null, 'J/J-d', 'file', '()', null, null, null, null, null, null,"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e', 1, 'J', null, null, null, 'normal',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-a', 1, 'J/J-e', null, null, null, 'normal',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b', 1, 'J/J-e', null, null, null, 'normal',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e', 2, 'J', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-a', 2, 'J/J-e', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b', 2, 'J/J-e', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b/Jeba', 1, 'J/J-e/J-e-b', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f', 1, 'J', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f/J-f-a', 1, 'J/J-f', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K', 1, '', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-a', 1, 'K', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-b', 1, 'K', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L', 1, '', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a', 1, 'L', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a/L-a-a', 1, 'L/L-a', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a', 2, 'L', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a/L-a-a', 2, 'L/L-a', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'other/place', 2, 'other', null, null, null, 'normal',"
- " 1, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'other/place/J-e-a', 2, 'other/place', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'other/place/J-e-b', 2, 'other/place', null, null, null, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'other/place/J-e-b/Jeba', 0, 'other/place/J-e-b', null, null, null, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'I', '', null, null, null, null, null, 'changelist', null, "
- " null, null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'F', '', null, null, null, null, null, null, null, "
- " '" F_TC_DATA "', null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'G', '', null, null, null, null, null, null, null, "
- " '" G_TC_DATA "', null, null, null, null);"
- );
+ { 0, "", "normal", 1, "", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+ { 0, "A", "normal", 1, "A", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1,
+ FALSE, NULL, 10, 10 },
+
+ { 0, "B", "excluded", 1, "B", SVN_INVALID_REVNUM, NOT_MOVED,
+ svn_node_symlink},
+
+ { 0, "C", "server-excluded", 1, "C", 0, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "D", "not-present", 1, "D", 0, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "E", "incomplete", 1, "E", 1, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "F", "normal", 1, "F", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2},
+
+ { 0, "G", "normal", 2, "G-alt", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 0, "H", "normal", 1, "H", 1, NOT_MOVED,
+ svn_node_symlink, "()", NULL, NULL, "H-target", 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "I", "normal", 1, "I", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J", "normal", 1, "J", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-e", "normal", 1, "J/J-e", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-e/J-e-a", "normal", 1, "J/J-e/J-e-a", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-e/J-e-b", "normal", 1, "J/J-e/J-e-b", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-e/J-e-b/Jeba", "normal", 1, "J/J-e/J-e-b/Jeba", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-f", "normal", 1, "J/J-f", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J/J-f/J-f-a", "normal", 1, "J/J-f/J-f-a", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "J", "normal", 1, "J", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "K", "normal", 1, "K", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "K/K-a", "normal", 2, "K/K-a", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2,
+ FALSE, NULL, 15, 14},
+
+ { 0, "K/K-b", "normal", 2, "K/K-b", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2,
+ FALSE, NULL, 15, 14},
+
+ /* Load data into the working layers of NODES */
+
+ { 1, "I", "normal", 2, "some/dir", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ /* J was originally a local addition, but its descendants are replaced,
+ so let's turn J in a copy */
+ { 1, "J", "normal", 2, "q", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-a", "normal", 2, "q/J-a", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-b", "normal", 2, "q/J-b", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 3, "J/J-b/J-b-a", "normal", 2, "another/dir", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-b/J-b-b", "normal", 2, "q/J-b/J-b-b", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-c", "normal", 2, "q/J-c", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-c/J-c-a", "normal", 2, "q/J-c/J-c-a", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "J/J-c", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 2, "J/J-c/J-c-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 2, "J/J-d", "normal", 2, "moved/file", 2, TRUE, NULL,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 0, "moved", "normal", 2, "moved", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ { 0, "moved/file", "normal", 2, "moved/file", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "moved/file", "base-deleted", NO_COPY_FROM, FALSE, "J/J-d",
+ svn_node_file},
+
+ { 1, "J/J-e", "normal", 2, "q/J-e", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-e/J-e-a", "normal", 2, "q/J-e/J-e-a", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-e/J-e-b", "normal", 2, "q/J-e/J-e-b", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "J/J-e", "base-deleted", NO_COPY_FROM, FALSE, "other/place",
+ svn_node_dir},
+
+ { 2, "J/J-e/J-e-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 2, "J/J-e/J-e-b", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "J/J-e/J-e-b/Jeba", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 1, "J/J-f", "normal", 2, "q/J-f", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "J/J-f/J-f-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "K", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "K/K-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 1, "K/K-b", "base-deleted", NO_COPY_FROM, FALSE, "moved/away",
+ svn_node_file},
+
+ { 1, "L", "normal", 2, "from", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "L/L-a", "normal", 2, "from/L-a", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 1, "L/L-a/L-a-a", "normal", 2, "from/L-a/L-a-a", 2, NOT_MOVED,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "L/L-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 2, "L/L-a/L-a-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 0, "other", "normal", 2, "other", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "other/place", "normal", 2, "q/J-e", 2, TRUE, NULL,
+ svn_node_dir, "()", "immediates", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "other/place/J-e-a", "normal", 2, "q/J-e/J-e-a", 2, TRUE, NULL,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "other/place/J-e-b", "normal", 2, "q/J-e/J-e-b", 2, TRUE, NULL,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2 },
+
+ { 2, "other/place/J-e-b/Jeba", "normal", 2, "q/J-e/J-e-b/Jeba", 2, TRUE, NULL,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1 },
+
+ /*** NEW ****/
+ { 2, "moved/away", "normal", 2, "K/K-b", 1, TRUE, NULL,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2,
+ FALSE, NULL, 15, 14},
+ { 0 }
+};
+
+static const svn_test__actual_data_t actual_init_data[] = {
+ { "A", NULL, "changelist", NULL },
+ { "F", NULL, NULL, F_TC_DATA },
+ { "G", NULL, NULL, F_TC_DATA },
+
+ { 0 }
+};
static svn_error_t *
create_open(svn_wc__db_t **db,
@@ -338,10 +295,16 @@ create_open(svn_wc__db_t **db,
apr_pool_t *pool)
{
SVN_ERR(svn_dirent_get_absolute(local_abspath,
- svn_dirent_join("fake-wc", subdir, pool),
+ svn_dirent_join(
+ svn_test_data_path("db-test", pool),
+ subdir, pool),
pool));
+
+ SVN_ERR(svn_io_remove_dir2(*local_abspath, TRUE, NULL, NULL, pool));
+
SVN_ERR(svn_wc__db_open(db, NULL, FALSE, TRUE, pool, pool));
- SVN_ERR(svn_test__create_fake_wc(*local_abspath, TESTING_DATA, pool, pool));
+ SVN_ERR(svn_test__create_fake_wc(*local_abspath, TESTING_DATA,
+ nodes_init_data, actual_init_data, pool));
svn_test_add_dir_cleanup(*local_abspath);
@@ -361,18 +324,17 @@ set_prop(apr_hash_t *props, const char *name, const char *value,
}
-static svn_boolean_t
+static svn_error_t *
validate_abspath(const char *wcroot_abspath,
const char *expected_relpath,
const char *actual_abspath,
apr_pool_t *scratch_pool)
{
- if (actual_abspath == NULL)
- return FALSE;
- return strcmp(svn_dirent_join(wcroot_abspath,
+ SVN_TEST_STRING_ASSERT(actual_abspath,
+ svn_dirent_join(wcroot_abspath,
expected_relpath,
- scratch_pool),
- actual_abspath) == 0;
+ scratch_pool));
+ return SVN_NO_ERROR;
}
@@ -660,7 +622,7 @@ test_inserting_nodes(apr_pool_t *pool)
props,
1, TIME_1a, AUTHOR_1,
children, svn_depth_infinity,
- NULL, NULL, FALSE, NULL, NULL, NULL,
+ NULL, FALSE, NULL, NULL, NULL, NULL,
pool));
/* Replace an incomplete node with a file node. */
@@ -771,11 +733,17 @@ test_children(apr_pool_t *pool)
SVN_ERR(svn_wc__db_base_get_children(&children,
db, local_abspath,
pool, pool));
- SVN_TEST_ASSERT(children->nelts == 11);
+ SVN_TEST_ASSERT(children->nelts == 13);
for (i = children->nelts; i--; )
{
const char *name = APR_ARRAY_IDX(children, i, const char *);
+ if (strcmp(name, "moved") == 0
+ || strcmp(name, "other") == 0)
+ {
+ continue;
+ }
+
SVN_TEST_ASSERT(strlen(name) == 1);
/* ### check the actual values */
}
@@ -783,11 +751,17 @@ test_children(apr_pool_t *pool)
SVN_ERR(svn_wc__db_read_children(&children,
db, local_abspath,
pool, pool));
- SVN_TEST_ASSERT(children->nelts == 12);
+ SVN_TEST_ASSERT(children->nelts == 14);
for (i = children->nelts; i--; )
{
const char *name = APR_ARRAY_IDX(children, i, const char *);
+ if (strcmp(name, "moved") == 0
+ || strcmp(name, "other") == 0)
+ {
+ continue;
+ }
+
SVN_TEST_ASSERT(strlen(name) == 1);
/* ### check the actual values */
}
@@ -858,7 +832,7 @@ test_working_info(apr_pool_t *pool)
SVN_TEST_ASSERT(checksum == NULL);
SVN_TEST_ASSERT(recorded_size == SVN_INVALID_FILESIZE);
SVN_TEST_ASSERT(target == NULL);
- SVN_TEST_STRING_ASSERT(changelist, "changelist");
+ SVN_TEST_STRING_ASSERT(changelist, NULL);
SVN_TEST_STRING_ASSERT(original_repos_relpath, "some/dir");
SVN_TEST_STRING_ASSERT(original_root_url, ROOT_TWO);
SVN_TEST_STRING_ASSERT(original_uuid, UUID_TWO);
@@ -876,8 +850,31 @@ test_working_info(apr_pool_t *pool)
/* ### we need a hojillion more tests in here. I just want to get this
### round checked in, so I'm skipping more tests at this point. */
-
-
+ SVN_ERR(svn_wc__db_read_info(
+ &status, &kind, &revision,
+ &repos_relpath, &repos_root_url, &repos_uuid,
+ &changed_rev, &changed_date, &changed_author,
+ &depth, &checksum, &target, &original_repos_relpath,
+ &original_root_url, &original_uuid, &original_revnum,
+ &lock, &recorded_size, &recorded_time, &changelist,
+ &conflicted, &op_root, &had_props, &props_mod,
+ &have_base, &have_more_work, &have_work,
+ db, svn_dirent_join(local_abspath, "A", pool),
+ pool, pool));
+ SVN_TEST_ASSERT(status == svn_wc__db_status_normal);
+ SVN_TEST_ASSERT(kind == svn_node_file);
+ SVN_TEST_STRING_ASSERT(changelist, "changelist");
+ SVN_TEST_ASSERT(revision == 1);
+ SVN_TEST_STRING_ASSERT(repos_relpath, "A");
+ SVN_TEST_STRING_ASSERT(repos_root_url, "http://example.com/one");
+ SVN_TEST_STRING_ASSERT(repos_uuid, "uuid1");
+ SVN_TEST_ASSERT(changed_rev == 1);
+ SVN_TEST_ASSERT(changed_date == TIME_1a);
+ SVN_TEST_STRING_ASSERT(changed_author, AUTHOR_1);
+ SVN_TEST_ASSERT(depth == svn_depth_unknown);
+ SVN_TEST_ASSERT(checksum != NULL);
+ SVN_TEST_ASSERT(recorded_size == 10);
+ SVN_TEST_ASSERT(target == NULL);
return SVN_NO_ERROR;
}
@@ -901,9 +898,16 @@ test_pdh(apr_pool_t *pool)
NULL, NULL,
pool));
+ SVN_ERR(svn_wc__db_base_add_directory(
+ db, svn_dirent_join(local_abspath, "sub2", pool),
+ local_abspath, "sub2", ROOT_ONE, UUID_ONE, 1,
+ apr_hash_make(pool), 1, 1, "me", NULL,
+ svn_depth_infinity, NULL, FALSE, NULL, NULL,
+ NULL, NULL, pool));
+
SVN_ERR(svn_wc__db_base_add_excluded_node(
- db, svn_dirent_join(local_abspath, "sub/A", pool),
- "sub/A", ROOT_ONE, UUID_ONE, 1,
+ db, svn_dirent_join(local_abspath, "sub2/A", pool),
+ "sub2/A", ROOT_ONE, UUID_ONE, 1,
svn_node_file, svn_wc__db_status_server_excluded,
NULL, NULL,
pool));
@@ -941,17 +945,17 @@ test_scan_addition(apr_pool_t *pool)
&original_revision,
db, svn_dirent_join(local_abspath, "J", pool),
pool, pool));
- SVN_TEST_ASSERT(status == svn_wc__db_status_added);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J", op_root_abspath, pool));
+ SVN_TEST_ASSERT(status == svn_wc__db_status_copied);
+ SVN_ERR(validate_abspath(local_abspath, "J", op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
SVN_TEST_STRING_ASSERT(repos_uuid, UUID_ONE);
- SVN_TEST_ASSERT(original_repos_relpath == NULL);
- SVN_TEST_ASSERT(original_root_url == NULL);
- SVN_TEST_ASSERT(original_uuid == NULL);
- SVN_TEST_ASSERT(original_revision == SVN_INVALID_REVNUM);
+ SVN_TEST_STRING_ASSERT(original_repos_relpath, "q");
+ SVN_TEST_STRING_ASSERT(original_root_url, ROOT_TWO);
+ SVN_TEST_STRING_ASSERT(original_uuid, UUID_TWO);
+ SVN_TEST_ASSERT(original_revision == 2);
- /* Simple addition of a file (affects how scan-up is started). */
+ /* Simple copy (affects how scan-up is started). */
SVN_ERR(svn_wc__db_scan_addition(
&status, &op_root_abspath,
&repos_relpath, &repos_root_url, &repos_uuid,
@@ -959,15 +963,15 @@ test_scan_addition(apr_pool_t *pool)
&original_revision,
db, svn_dirent_join(local_abspath, "J/J-a", pool),
pool, pool));
- SVN_TEST_ASSERT(status == svn_wc__db_status_added);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J", op_root_abspath, pool));
+ SVN_TEST_ASSERT(status == svn_wc__db_status_copied);
+ SVN_ERR(validate_abspath(local_abspath, "J", op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J/J-a");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
SVN_TEST_STRING_ASSERT(repos_uuid, UUID_ONE);
- SVN_TEST_ASSERT(original_repos_relpath == NULL);
- SVN_TEST_ASSERT(original_root_url == NULL);
- SVN_TEST_ASSERT(original_uuid == NULL);
- SVN_TEST_ASSERT(original_revision == SVN_INVALID_REVNUM);
+ SVN_TEST_STRING_ASSERT(original_repos_relpath, "q");
+ SVN_TEST_STRING_ASSERT(original_root_url, ROOT_TWO);
+ SVN_TEST_STRING_ASSERT(original_uuid, UUID_TWO);
+ SVN_TEST_ASSERT(original_revision == 2);
/* Node was moved here. */
SVN_ERR(svn_wc__db_scan_addition(
@@ -985,15 +989,15 @@ test_scan_addition(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-d", pool),
pool, pool));
SVN_TEST_ASSERT(status == svn_wc__db_status_moved_here);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-d",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-d",
op_root_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "moved/file",
+ SVN_ERR(validate_abspath(local_abspath, "moved/file",
moved_from_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-d",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-d",
move_op_root_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "moved/file",
+ SVN_ERR(validate_abspath(local_abspath, "moved/file",
move_op_root_src, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "moved/file",
+ SVN_ERR(validate_abspath(local_abspath, "moved/file",
delete_op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J/J-d");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
@@ -1012,12 +1016,12 @@ test_scan_addition(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-b", pool),
pool, pool));
SVN_TEST_ASSERT(status == svn_wc__db_status_copied);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-b",
+ SVN_ERR(validate_abspath(local_abspath, "J",
op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J/J-b");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
SVN_TEST_STRING_ASSERT(repos_uuid, UUID_ONE);
- SVN_TEST_STRING_ASSERT(original_repos_relpath, "some/dir");
+ SVN_TEST_STRING_ASSERT(original_repos_relpath, "q");
SVN_TEST_STRING_ASSERT(original_root_url, ROOT_TWO);
SVN_TEST_STRING_ASSERT(original_uuid, UUID_TWO);
SVN_TEST_ASSERT(original_revision == 2);
@@ -1031,7 +1035,7 @@ test_scan_addition(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-b/J-b-a", pool),
pool, pool));
SVN_TEST_ASSERT(status == svn_wc__db_status_copied);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-b/J-b-a",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-b/J-b-a",
op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J/J-b/J-b-a");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
@@ -1050,12 +1054,12 @@ test_scan_addition(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-b/J-b-b", pool),
pool, pool));
SVN_TEST_ASSERT(status == svn_wc__db_status_copied);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-b",
+ SVN_ERR(validate_abspath(local_abspath, "J",
op_root_abspath, pool));
SVN_TEST_STRING_ASSERT(repos_relpath, "J/J-b/J-b-b");
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
SVN_TEST_STRING_ASSERT(repos_uuid, UUID_ONE);
- SVN_TEST_STRING_ASSERT(original_repos_relpath, "some/dir");
+ SVN_TEST_STRING_ASSERT(original_repos_relpath, "q");
SVN_TEST_STRING_ASSERT(original_root_url, ROOT_TWO);
SVN_TEST_STRING_ASSERT(original_uuid, UUID_TWO);
SVN_TEST_ASSERT(original_revision == 2);
@@ -1084,13 +1088,13 @@ test_scan_deletion(apr_pool_t *pool)
&copy_op_root_abspath,
db, svn_dirent_join(local_abspath, "J/J-e", pool),
pool, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "other/place",
+ SVN_ERR(validate_abspath(local_abspath, "other/place",
moved_to_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-e",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-e",
work_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "other/place",
+ SVN_ERR(validate_abspath(local_abspath, "other/place",
copy_op_root_abspath, pool));
/* Node was moved elsewhere (child of operation root). */
@@ -1101,13 +1105,13 @@ test_scan_deletion(apr_pool_t *pool)
&copy_op_root_abspath,
db, svn_dirent_join(local_abspath, "J/J-e/J-e-a", pool),
pool, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "other/place/J-e-a",
+ SVN_ERR(validate_abspath(local_abspath, "other/place/J-e-a",
moved_to_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-e",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-e",
work_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "other/place",
+ SVN_ERR(validate_abspath(local_abspath, "other/place",
copy_op_root_abspath, pool));
/* Root of delete. Parent is a WORKING node. */
@@ -1119,10 +1123,10 @@ test_scan_deletion(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-c", pool),
pool, pool));
/* Implicit delete of "J" (via replacement). */
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-c",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-c",
work_del_abspath, pool));
/* Child of a deleted root. */
@@ -1134,10 +1138,10 @@ test_scan_deletion(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-c/J-c-a", pool),
pool, pool));
/* Implicit delete of "J" (via replacement). */
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J/J-c",
+ SVN_ERR(validate_abspath(local_abspath, "J/J-c",
work_del_abspath, pool));
/* Base-deleted tree extending past deleted WORKING subtree. */
@@ -1151,11 +1155,11 @@ test_scan_deletion(apr_pool_t *pool)
/* ### I don't understand this. "J/J-e/J-e-b/Jeba" is a deleted
base node that is not overlayed by the replacement rooted at "J".
Why does base_del_abspath refer to "J-e"? */
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "other/place/J-e-b/Jeba",
+ SVN_ERR(validate_abspath(local_abspath, "other/place/J-e-b/Jeba",
moved_to_abspath, pool));
- SVN_TEST_ASSERT(work_del_abspath == NULL);
+ SVN_TEST_STRING_ASSERT(work_del_abspath, NULL);
/* Base-deleted tree extending past added WORKING tree. */
SVN_ERR(svn_wc__db_scan_deletion(
@@ -1166,10 +1170,10 @@ test_scan_deletion(apr_pool_t *pool)
db, svn_dirent_join(local_abspath, "J/J-f/J-f-a", pool),
pool, pool));
/* Implicit delete of "J" (via replacement). */
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "J",
+ SVN_ERR(validate_abspath(local_abspath, "J",
base_del_abspath, pool));
- SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(work_del_abspath == NULL);
+ SVN_TEST_STRING_ASSERT(moved_to_abspath, NULL);
+ SVN_TEST_STRING_ASSERT(work_del_abspath, NULL);
/* Root of delete. Parent is a BASE node. */
SVN_ERR(svn_wc__db_scan_deletion(
@@ -1179,10 +1183,10 @@ test_scan_deletion(apr_pool_t *pool)
NULL,
db, svn_dirent_join(local_abspath, "K", pool),
pool, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "K",
+ SVN_ERR(validate_abspath(local_abspath, "K",
base_del_abspath, pool));
- SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(work_del_abspath == NULL);
+ SVN_TEST_STRING_ASSERT(moved_to_abspath, NULL);
+ SVN_TEST_STRING_ASSERT(work_del_abspath, NULL);
/* Base-deleted tree. Start below root. */
SVN_ERR(svn_wc__db_scan_deletion(
@@ -1192,10 +1196,10 @@ test_scan_deletion(apr_pool_t *pool)
NULL,
db, svn_dirent_join(local_abspath, "K/K-a", pool),
pool, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "K",
+ SVN_ERR(validate_abspath(local_abspath, "K",
base_del_abspath, pool));
- SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(work_del_abspath == NULL);
+ SVN_TEST_STRING_ASSERT(moved_to_abspath, NULL);
+ SVN_TEST_STRING_ASSERT(work_del_abspath, NULL);
/* Base-deleted tree via move. */
SVN_ERR(svn_wc__db_scan_deletion(
@@ -1205,13 +1209,13 @@ test_scan_deletion(apr_pool_t *pool)
&copy_op_root_abspath,
db, svn_dirent_join(local_abspath, "K/K-b", pool),
pool, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "K",
+ SVN_ERR(validate_abspath(local_abspath, "K",
base_del_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "moved/away",
+ SVN_ERR(validate_abspath(local_abspath, "moved/away",
moved_to_abspath, pool));
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "moved/away",
+ SVN_ERR(validate_abspath(local_abspath, "moved/away",
copy_op_root_abspath, pool));
- SVN_TEST_ASSERT(work_del_abspath == NULL);
+ SVN_TEST_STRING_ASSERT(work_del_abspath, NULL);
/* Subtree deletion of added tree. Start at child. */
SVN_ERR(svn_wc__db_scan_deletion(
@@ -1221,9 +1225,9 @@ test_scan_deletion(apr_pool_t *pool)
NULL,
db, svn_dirent_join(local_abspath, "L/L-a/L-a-a", pool),
pool, pool));
- SVN_TEST_ASSERT(base_del_abspath == NULL);
- SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "L/L-a",
+ SVN_TEST_STRING_ASSERT(base_del_abspath, NULL);
+ SVN_TEST_STRING_ASSERT(moved_to_abspath, NULL);
+ SVN_ERR(validate_abspath(local_abspath, "L/L-a",
work_del_abspath, pool));
/* Subtree deletion of added tree. Start at root. */
@@ -1234,9 +1238,9 @@ test_scan_deletion(apr_pool_t *pool)
NULL,
db, svn_dirent_join(local_abspath, "L/L-a", pool),
pool, pool));
- SVN_TEST_ASSERT(base_del_abspath == NULL);
- SVN_TEST_ASSERT(moved_to_abspath == NULL);
- SVN_TEST_ASSERT(validate_abspath(local_abspath, "L/L-a",
+ SVN_TEST_STRING_ASSERT(base_del_abspath, NULL);
+ SVN_TEST_STRING_ASSERT(moved_to_abspath, NULL);
+ SVN_ERR(validate_abspath(local_abspath, "L/L-a",
work_del_abspath, pool));
return SVN_NO_ERROR;
@@ -1269,7 +1273,7 @@ test_global_relocate(apr_pool_t *pool)
SVN_TEST_STRING_ASSERT(repos_root_url, ROOT_ONE);
SVN_TEST_STRING_ASSERT(repos_uuid, UUID_ONE);
- /* Test relocating to a repos not existant in the db */
+ /* Test relocating to a repos not existent in the db */
SVN_ERR(svn_wc__db_global_relocate(db, local_abspath, ROOT_THREE, pool));
SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL,
&repos_relpath, &repos_root_url, &repos_uuid,
@@ -1521,7 +1525,9 @@ test_externals_store(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 2;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_getting_info,
@@ -1546,3 +1552,5 @@ struct svn_test_descriptor_t test_funcs[] =
"externals store"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/entries-compat.c b/subversion/tests/libsvn_wc/entries-compat.c
index 34ad425..3470c06 100644
--- a/subversion/tests/libsvn_wc/entries-compat.c
+++ b/subversion/tests/libsvn_wc/entries-compat.c
@@ -87,199 +87,186 @@ static const char * const TESTING_DATA = (
"insert into wcroot values (1, null); "
"insert into pristine values ('$sha1$" SHA1_1 "', NULL, 15, 1, '$md5 $" MD5_1 "'); "
+ );
- /* ### The file_externals column in NODES is temporary, and will be
- ### removed. However, to keep the tests passing, we need to add it
- ### to the following insert statements. *Be sure to remove it*. */
+#define NOT_MOVED FALSE, NULL
+#define NO_COPY_FROM 0, NULL, SVN_INVALID_REVNUM
+static const svn_test__nodes_data_t nodes[] =
+{
/* load the base nodes into the nodes table */
- "insert into nodes values ("
- " 1, '', 0, null, 1, '', 1, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'A', 0, '', 1, 'A', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'B', 0, '', 1, 'B', null, 'excluded',"
- " null, null, 'symlink', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'C', 0, '', 1, 'C', null, 'server-excluded',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'D', 0, '', 1, 'D', null, 'not-present',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'E', 0, '', 1, 'E', null, 'incomplete',"
- " null, null, 'unknown', null, null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'F', 0, '', 1, 'F', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'G', 0, '', 2, 'G-alt', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'H', 0, '', 1, 'H', 1, 'normal',"
- " null, null, 'symlink', '()', null, null, 'H-target', 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'I', 0, '', 1, 'I', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J', 0, '', 1, 'J', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e', 0, 'J', 1, 'J/J-e', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-a', 0, 'J/J-e', 1, 'J/J-e/J-e-a', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b', 0, 'J/J-e', 1, 'J/J-e/J-e-b', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b/Jeba', 0, 'J/J-e/J-e-b', 1, 'J/J-e/J-e-b/Jeba', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f', 0, 'J', 1, 'J/J-f', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f/J-f-a', 0, 'J/J-f', 1, 'J/J-f/J-f-a', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K', 0, '', 1, 'K', 1, 'normal',"
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-a', 0, 'K', 1, 'K/K-a', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-b', 0, 'K', 1, 'K/K-b', 1, 'normal',"
- " null, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 1, " TIME_1s ", '" AUTHOR_1 "',"
- " 15, null, null, null, null);"
- ""
+ { 0, "", "normal", 1, "", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "A", "normal", 1, "A", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "B", "excluded", 1, "B", 1, NOT_MOVED,
+ svn_node_symlink},
+
+ { 0, "C", "server-excluded",1, "C", 0, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "D", "not-present", 1, "D", 0, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "E", "incomplete", 1, "E", SVN_INVALID_REVNUM, NOT_MOVED,
+ svn_node_unknown},
+
+ { 0, "F", "normal", 1, "G-alt", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "G", "normal", 1, "G-alt", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "H", "normal", 1, "I", 1, NOT_MOVED,
+ svn_node_symlink, NULL, NULL, NULL, "H-target", 1, TIME_1a, AUTHOR_1},
+
+ { 0, "I", "normal", 1, "I", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J", "normal", 1, "J", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-c", "normal", 1, "J/J-c", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-c/J-c-a", "not-present", 1, "J/J-c/J-c-a", 1, NOT_MOVED,
+ svn_node_dir},
+
+ { 0, "J/J-e", "normal", 1, "J/J-e", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-e/J-e-a", "normal", 1, "J/J-e/J-e-a", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-e/J-e-b", "normal", 1, "J/J-e/J-e-b", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-e/J-e-b/Jeba", "normal", 1, "J/J-e/J-e-b/Jeba", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-f", "normal", 1, "J/J-f", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "J/J-f/J-f-a", "normal", 1, "J/J-f/J-f-a", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "K", "normal", 1, "K", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "K/K-a", "normal", 1, "K/K-a", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "K/K-b", "normal", 1, "K/K-b", 1, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "L", "normal", 1, "switched", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "L/L-a", "normal", 1, "switched/L-a", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 0, "L/L-a/L-a-a", "normal", 1, "switched/L-a/L-a-a", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
/* Load data into NODES table;
### op_depths have not been calculated by me yet;
the value 1 is just 'good enough' to make the nodes WORKING nodes. */
- "insert into nodes values ("
- " 1, 'I', 1, '', 2, 'some/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J', 1, '', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-a', 1, 'J', null, null, null, 'normal',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b', 1, 'J', 2, 'some/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b/J-b-a', 1, 'J/J-b', 2, 'another/dir', 2, 'normal',"
- " null, null, 'dir', '()', 'infinity', null, null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-b/J-b-b', 1, 'J/J-b', null, null, null, 'normal',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c', 1, 'J', null, null, null, 'not-present',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-c/J-c-a', 1, 'J/J-c', null, null, null, 'not-present',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-d', 1, 'J', 2, 'moved/file', 2, 'normal',"
- " 1, null, 'file', '()', null, '$sha1$" SHA1_1 "', null, 2, " TIME_2s ", '" AUTHOR_2 "',"
- " 10, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e', 1, 'J', null, null, null, 'not-present',"
- " null, 'other/place', 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-a', 1, 'J/J-e', null, null, null, 'not-present',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b', 1, 'J/J-e', null, null, null, 'not-present',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-e/J-e-b/Jeba', 1, 'J/J-e/J-e-b', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f', 1, 'J', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'J/J-f/J-f-a', 1, 'J/J-f', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K', 1, '', null, null, null, 'base-deleted',"
- " null, null, 'dir', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-a', 1, 'K', null, null, null, 'base-deleted',"
- " null, null, 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'K/K-b', 1, 'K', null, null, null, 'base-deleted',"
- " null, 'moved/away', 'file', '()', null, null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L', 1, '', null, null, null, 'normal',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a', 1, 'L', null, null, null, 'not-present',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'L/L-a/L-a-a', 1, 'L/L-a', null, null, null, 'not-present',"
- " null, null, 'dir', '()', 'immediates', null, null, null, null, null,"
- " null, null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'I', '', null, null, null, null, null, 'changelist', null, "
- " null, null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'F', '', null, null, null, null, null, null, null, "
- " '" F_TC_DATA "', null, null, null, null);"
- "insert into actual_node values ("
- " 1, 'G', '', null, null, null, null, null, null, null, "
- " '" G_TC_DATA "', null, null, null, null);"
- " "
- "insert into nodes values ("
- " 1, 'M', 0, '', 1, 'M', 1, 'normal', "
- " null, null, 'dir', '()', null, null, null, 1, " TIME_1s ", '" AUTHOR_1 "', "
- " null, null, null, null, null);"
- "insert into nodes values ("
- " 1, 'M/M-a', 0, 'M', 1, 'M/M-a', 1, 'not-present', "
- " null, null, 'file', '()', null, null, null, 1, null, null, "
- " null, null, null, null, null);"
- );
+
+ { 1, "I", "normal", 2, "some/file", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2},
+
+ { 1, "J", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir, NULL, "immediates"},
+
+ { 2, "J/J-a", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 2, "J/J-b", "normal", 2, "some/dir", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2},
+
+ { 3, "J/J-b/J-b-a", "normal", 2, "another/dir", 2, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 2, TIME_2a, AUTHOR_2},
+
+ { 3, "J/J-b/J-b-b", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ /* This triggers a validation warning: bad delete */
+ { 1, "J/J-c", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "J/J-d", "normal", 2, "moved/file", 2, NOT_MOVED,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 2, TIME_2a, AUTHOR_2},
+
+ { 1, "J/J-e", "base-deleted", NO_COPY_FROM, FALSE, "other/place",
+ svn_node_dir},
+
+ { 1, "J/J-e/J-e-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 1, "J/J-e/J-e-b", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "J/J-e/J-e-b/Jeba", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 1, "J/J-f", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 2, "J/J-f", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir, NULL, "immediates"},
+
+ { 1, "J/J-f/J-f-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "K", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "K/K-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_file},
+
+ { 1, "K/K-b", "base-deleted", NO_COPY_FROM, FALSE, "moved/away",
+ svn_node_file},
+
+ { 1, "L", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir, NULL, "immediates"},
+
+ { 1, "L/L-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "L/L-a/L-a-a", "base-deleted", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir},
+
+ { 1, "M", "normal", 1, "M", 1, NOT_MOVED,
+ svn_node_dir, "()", "infinity", NULL, NULL, 1, TIME_1a, AUTHOR_1},
+
+ { 1, "M/M-a", "not-present", 1, "M/M-a", 1, NOT_MOVED,
+ svn_node_file},
+
+ /**** Move target of K/K-b ****/
+ { 1, "moved", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir, NULL, "infinity" },
+ { 2, "moved/away", "normal", 1, "??", 1, TRUE, NULL,
+ svn_node_file, "()", NULL, "$sha1$" SHA1_1, NULL, 1, TIME_1a, AUTHOR_1},
+
+ /**** Move target of J/J-e ****/
+ { 1, "other", "normal", NO_COPY_FROM, NOT_MOVED,
+ svn_node_dir, NULL, "empty"},
+
+ { 2, "other/place", "normal", 1, "??", 1, TRUE, NULL,
+ svn_node_dir, "()", "infinity"},
+
+ { 0 },
+};
+
+static const svn_test__actual_data_t actuals[] =
+{
+ { "I", NULL, "changelist", NULL },
+ { "F", NULL, NULL, NULL /* TC-DATA */ },
+ { "G", NULL, NULL, NULL /* TC-DATA */ },
+ { 0 },
+};
static const char * const M_TESTING_DATA = (
@@ -310,10 +297,8 @@ create_fake_wc(const char *subdir, apr_pool_t *pool)
SVN_ERR(svn_io_remove_dir2(root, TRUE, NULL, NULL, pool));
SVN_ERR(svn_dirent_get_absolute(&wc_abspath, root, pool));
- SVN_ERR(svn_test__create_fake_wc(wc_abspath, TESTING_DATA, pool, pool));
-
- wc_abspath = svn_dirent_join(wc_abspath, "M", pool);
- SVN_ERR(svn_test__create_fake_wc(wc_abspath, M_TESTING_DATA, pool, pool));
+ SVN_ERR(svn_test__create_fake_wc(wc_abspath, TESTING_DATA, nodes, actuals,
+ pool));
return SVN_NO_ERROR;
}
@@ -368,8 +353,8 @@ test_entries_alloc(apr_pool_t *pool)
SVN_ERR(svn_wc_entries_read(&entries, adm_access, TRUE /* show_hidden */,
pool));
- /* The wcroot has 12 BASE children + 1 WORKING child + "this dir". */
- SVN_TEST_ASSERT(apr_hash_count(entries) == 14);
+ /* The wcroot has 12 BASE children + 3 WORKING child + "this dir". */
+ SVN_TEST_ASSERT(apr_hash_count(entries) == 16);
/* The "D" entry in the entries hash should be what we get from the
svn_wc_entry() entrypoint. */
@@ -377,7 +362,7 @@ test_entries_alloc(apr_pool_t *pool)
"fake-wc",
WC_NAME,
"D",
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_wc_entry(&entry, local_relpath, adm_access, TRUE, pool));
SVN_TEST_ASSERT(entry == apr_hash_get(entries, "D", APR_HASH_KEY_STRING));
@@ -400,6 +385,7 @@ test_stubs(apr_pool_t *pool)
const svn_wc_entry_t *stub_entry;
const svn_wc_entry_t *entry;
const svn_wc_entry_t *test_entry;
+ const char *M_dir;
apr_hash_t *entries;
#undef WC_NAME
@@ -407,13 +393,16 @@ test_stubs(apr_pool_t *pool)
SVN_ERR(create_open(&db, &local_abspath, WC_NAME, pool));
+ M_dir = svn_dirent_join(local_abspath, "M", pool);
+ SVN_ERR(svn_test__create_fake_wc(M_dir, M_TESTING_DATA, NULL, NULL, pool));
+
/* The "M" entry is a subdir. Let's ensure we can reach its stub,
and the actual contents. */
local_relpath = svn_dirent_join_many(pool,
"fake-wc",
WC_NAME,
"M",
- NULL);
+ SVN_VA_NULL);
SVN_ERR(svn_wc_adm_open3(&adm_access,
NULL /* associated */,
@@ -428,6 +417,8 @@ test_stubs(apr_pool_t *pool)
subdir baton with ADM_ACCESS. */
SVN_ERR(svn_wc_entry(&stub_entry, local_relpath, adm_access, TRUE, pool));
SVN_TEST_STRING_ASSERT(stub_entry->name, "M");
+ /* Schedule add in parent-wc. Schedule normal in obstructing working copy */
+ SVN_TEST_ASSERT(stub_entry->schedule == svn_wc_schedule_add);
SVN_ERR(svn_wc_adm_open3(&subdir_access,
adm_access,
@@ -441,6 +432,7 @@ test_stubs(apr_pool_t *pool)
/* Ensure we get the real entry. */
SVN_ERR(svn_wc_entry(&entry, local_relpath, subdir_access, TRUE, pool));
SVN_TEST_STRING_ASSERT(entry->name, "");
+ SVN_TEST_ASSERT(entry->schedule == svn_wc_schedule_normal);
/* Ensure that we get the SAME entry, even using the parent baton. */
SVN_ERR(svn_wc_entry(&test_entry, local_relpath, adm_access, TRUE, pool));
@@ -638,7 +630,9 @@ test_access_baton_like_locking(apr_pool_t *pool)
}
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = -1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_entries_alloc,
@@ -649,3 +643,5 @@ struct svn_test_descriptor_t test_funcs[] =
"access baton like locks must work with wc-ng"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/op-depth-test.c b/subversion/tests/libsvn_wc/op-depth-test.c
index 39afcf4..c0ec24b 100644
--- a/subversion/tests/libsvn_wc/op-depth-test.c
+++ b/subversion/tests/libsvn_wc/op-depth-test.c
@@ -28,6 +28,7 @@
#include <apr_general.h>
#include "svn_types.h"
+#include "svn_hash.h"
#include "svn_io.h"
#include "svn_dirent_uri.h"
#include "svn_pools.h"
@@ -39,9 +40,10 @@
#include "utils.h"
-#include "private/svn_wc_private.h"
-#include "private/svn_sqlite.h"
#include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
+#include "private/svn_sqlite.h"
+#include "private/svn_wc_private.h"
#include "../../libsvn_wc/wc.h"
#include "../../libsvn_wc/wc_db.h"
#include "../../libsvn_wc/workqueue.h"
@@ -51,17 +53,9 @@
#include "../svn_test.h"
-#ifdef _MSC_VER
-#pragma warning(disable: 4221) /* nonstandard extension used */
-#endif
+#include "wc-test-queries.h"
-/* This macro is not available in 1.8.x, but let's just use it here */
-#ifndef SVN_VA_NULL
-struct svn_null_pointer_constant_stdarg_sentinel_t;
-
-/** Null pointer constant used as a sentinel in variable argument lists. */
-#define SVN_VA_NULL ((struct svn_null_pointer_constant_stdarg_sentinel_t*)0)
-#endif
+WC_TEST_QUERIES_SQL_DECLARE_STATEMENTS(op_depth_statements);
/* Compare strings, like strcmp but either or both may be NULL which
* compares equal to NULL and not equal to any non-NULL string. */
@@ -83,13 +77,13 @@ strcmp_null(const char *s1, const char *s2)
static svn_error_t *
open_wc_db(svn_sqlite__db_t **sdb,
const char *wc_root_abspath,
- const char *const *my_statements,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
SVN_ERR(svn_wc__db_util_open_db(sdb, wc_root_abspath, "wc.db",
svn_sqlite__mode_readwrite,
- FALSE /* exclusive */, my_statements,
+ FALSE /* exclusive */, 0 /* timeout */,
+ op_depth_statements,
result_pool, scratch_pool));
return SVN_NO_ERROR;
}
@@ -111,11 +105,30 @@ typedef struct nodes_row_t {
const char *props; /* comma-separated list of prop names */
} nodes_row_t;
+/* Tree conflict details */
+typedef struct tree_conflict_info
+{
+ svn_wc_conflict_action_t action;
+ svn_wc_conflict_reason_t reason;
+ const char *delete_path;
+ svn_boolean_t conflicted_fb; /* fallback for reason, action and path 0 */
+} tree_conflict_info;
+
+/* What conflicts are on a path. */
+typedef struct conflict_info_t {
+ const char *local_relpath;
+ svn_boolean_t text_conflicted;
+ svn_boolean_t prop_conflicted;
+
+ tree_conflict_info tc;
+} conflict_info_t;
+
/* Macro for filling in the REPO_* fields of a non-base NODES_ROW_T
* that has no copy-from info. */
#define NO_COPY_FROM SVN_INVALID_REVNUM, NULL, FALSE
#define MOVED_HERE FALSE, NULL, TRUE
#define NOT_MOVED FALSE, NULL, FALSE
+#define FILE_EXTERNAL TRUE
/* Return a comma-separated list of the prop names in PROPS, in lexically
* ascending order, or NULL if PROPS is empty or NULL. (Here, we don't
@@ -145,28 +158,36 @@ props_hash_to_text(apr_hash_t *props, apr_pool_t *pool)
return str->len ? str->data : NULL;
}
-/* Return a human-readable string representing ROW. */
+/* Return a human-readable string representing ROW. With a tiny bit of editting
+ this can be used to create expected results */
static const char *
print_row(const nodes_row_t *row,
apr_pool_t *result_pool)
{
+ const char *relpath_str, *presence_str;
const char *file_external_str, *moved_here_str, *moved_to_str, *props;
if (row == NULL)
return "(null)";
+ relpath_str = apr_psprintf(result_pool, "\"%s\",", row->local_relpath);
+ presence_str = apr_psprintf(result_pool, "\"%s\",", row->presence);
if (row->moved_to)
- moved_to_str = apr_psprintf(result_pool, ", moved-to %s", row->moved_to);
+ moved_to_str = apr_psprintf(result_pool, ", \"%s\"", row->moved_to);
else
moved_to_str = "";
- if (row->moved_here)
- moved_here_str = ", moved-here";
+ if (row->moved_here && !row->file_external && !row->moved_to)
+ moved_here_str = ", MOVED_HERE";
+ else if (row->moved_to)
+ moved_here_str = ", TRUE";
else
moved_here_str = "";
if (row->file_external)
- file_external_str = ", file-external";
+ file_external_str = ", FILE_EXTERNAL";
+ else if (row->moved_to || row->props)
+ file_external_str = ", FALSE";
else
file_external_str = "";
@@ -176,19 +197,17 @@ print_row(const nodes_row_t *row,
props = "";
if (row->repo_revnum == SVN_INVALID_REVNUM)
- return apr_psprintf(result_pool, "%d, \"%s\", \"%s\"%s%s%s%s",
- row->op_depth, row->local_relpath, row->presence,
- moved_here_str, moved_to_str,
- file_external_str, props);
+ return apr_psprintf(result_pool, "%d, %-20s%-15s NO_COPY_FROM%s%s%s%s",
+ row->op_depth, relpath_str, presence_str,
+ file_external_str, moved_here_str, moved_to_str,
+ props);
else
- return apr_psprintf(result_pool, "%d, \"%s\", \"%s\", %s ^/%s@%d%s%s%s%s",
- row->op_depth, row->local_relpath, row->presence,
- row->op_depth == 0 ? "base" : "copyfrom",
- row->repo_relpath, (int)row->repo_revnum,
- moved_here_str, moved_to_str,
- file_external_str, props);
+ return apr_psprintf(result_pool, "%d, %-20s%-15s %d, \"%s\"%s%s%s%s",
+ row->op_depth, relpath_str, presence_str,
+ (int)row->repo_revnum, row->repo_relpath,
+ file_external_str, moved_here_str, moved_to_str,
+ props);
}
-
/* A baton to pass through svn_hash_diff() to compare_nodes_rows(). */
typedef struct comparison_baton_t {
apr_hash_t *expected_hash; /* Maps "OP_DEPTH PATH" to nodes_row_t. */
@@ -259,20 +278,9 @@ check_db_rows(svn_test__sandbox_t *b,
const char *root_path,
const nodes_row_t *expected_rows)
{
- const char *base_relpath = root_path;
svn_sqlite__db_t *sdb;
int i;
svn_sqlite__stmt_t *stmt;
- static const char *const statements[] = {
- "SELECT op_depth, nodes.presence, nodes.local_relpath, revision,"
- " repos_path, file_external, def_local_relpath, moved_to, moved_here,"
- " properties"
- " FROM nodes "
- " LEFT OUTER JOIN externals"
- " ON nodes.local_relpath = externals.local_relpath"
- " WHERE nodes.local_relpath = ?1 OR nodes.local_relpath LIKE ?2",
- NULL };
-#define STMT_SELECT_NODES_INFO 0
svn_boolean_t have_row;
apr_hash_t *found_hash = apr_hash_make(b->pool);
@@ -285,12 +293,10 @@ check_db_rows(svn_test__sandbox_t *b,
comparison_baton.errors = NULL;
/* Fill ACTUAL_HASH with data from the WC DB. */
- SVN_ERR(open_wc_db(&sdb, b->wc_abspath, statements, b->pool, b->pool));
+ SVN_ERR(open_wc_db(&sdb, b->wc_abspath, b->pool, b->pool));
SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_NODES_INFO));
- SVN_ERR(svn_sqlite__bindf(stmt, "ss", base_relpath,
- (base_relpath[0]
- ? apr_psprintf(b->pool, "%s/%%", base_relpath)
- : "_%")));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", (apr_int64_t)1 /* wc_id */,
+ root_path));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
@@ -304,16 +310,17 @@ check_db_rows(svn_test__sandbox_t *b,
row->repo_revnum = svn_sqlite__column_revnum(stmt, 3);
row->repo_relpath = svn_sqlite__column_text(stmt, 4, b->pool);
row->file_external = !svn_sqlite__column_is_null(stmt, 5);
- if (row->file_external && svn_sqlite__column_is_null(stmt, 6))
- comparison_baton.errors
- = svn_error_createf(SVN_ERR_TEST_FAILED, comparison_baton.errors,
- "incomplete {%s}", print_row(row, b->pool));
row->moved_to = svn_sqlite__column_text(stmt, 7, b->pool);
row->moved_here = svn_sqlite__column_boolean(stmt, 8);
SVN_ERR(svn_sqlite__column_properties(&props_hash, stmt, 9,
b->pool, b->pool));
row->props = props_hash_to_text(props_hash, b->pool);
+ if (row->file_external && svn_sqlite__column_is_null(stmt, 6))
+ comparison_baton.errors
+ = svn_error_createf(SVN_ERR_TEST_FAILED, comparison_baton.errors,
+ "incomplete {%s}", print_row(row, b->pool));
+
key = apr_psprintf(b->pool, "%d %s", row->op_depth, row->local_relpath);
apr_hash_set(found_hash, key, APR_HASH_KEY_STRING, row);
@@ -338,6 +345,257 @@ check_db_rows(svn_test__sandbox_t *b,
return comparison_baton.errors;
}
+#define EDIT_EDIT_TC {svn_wc_conflict_reason_edited, \
+ svn_wc_conflict_action_edit, \
+ NULL, TRUE}
+#define NO_TC { 0 }
+static const char *
+print_conflict(const conflict_info_t *row,
+ apr_pool_t *result_pool)
+{
+ const char *tc_text;
+
+ if (!row->tc.reason && !row->tc.action && !row->tc.delete_path)
+ {
+ if (row->tc.conflicted_fb)
+ tc_text = "EDIT_EDIT_TC";
+ else
+ tc_text = "NO_TC";
+ }
+ else
+ {
+ const char *action;
+ const char *reason;
+ const char *path;
+
+#define CASE_ENUM_STRVAL(x, y) case y: x = #y; break
+ switch(row->tc.action)
+ {
+ CASE_ENUM_STRVAL(action, svn_wc_conflict_action_edit);
+ CASE_ENUM_STRVAL(action, svn_wc_conflict_action_add);
+ CASE_ENUM_STRVAL(action, svn_wc_conflict_action_delete);
+ CASE_ENUM_STRVAL(action, svn_wc_conflict_action_replace);
+ default:
+ SVN_ERR_MALFUNCTION_NO_RETURN();
+ }
+ switch(row->tc.reason)
+ {
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_edited);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_obstructed);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_deleted);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_missing);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_unversioned);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_added);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_replaced);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_moved_away);
+ CASE_ENUM_STRVAL(reason, svn_wc_conflict_reason_moved_here);
+ default:
+ SVN_ERR_MALFUNCTION_NO_RETURN();
+ }
+
+ if (row->tc.delete_path)
+ path = apr_psprintf(result_pool, ", \"%s\"", row->tc.delete_path);
+ else
+ path = "";
+
+ tc_text = apr_psprintf(result_pool, "{%s, %s%s}", action,
+ reason, path);
+ }
+
+ return apr_psprintf(result_pool, "\"%s\", %s, %s, %s",
+ row->local_relpath,
+ row->text_conflicted ? "TRUE" : "FALSE",
+ row->prop_conflicted ? "TRUE" : "FALSE",
+ tc_text);
+}
+
+static svn_boolean_t
+tree_conflicts_match(const tree_conflict_info *expected,
+ const tree_conflict_info *actual)
+{
+ if (expected->action != actual->action)
+ return FALSE;
+ else if (expected->reason != actual->reason)
+ return FALSE;
+ else if (strcmp_null(expected->delete_path, actual->delete_path) != 0)
+ return FALSE;
+ else if (expected->conflicted_fb != actual->conflicted_fb)
+ return FALSE;
+
+ return TRUE;
+}
+
+static svn_error_t *
+compare_conflict_info(const void *key, apr_ssize_t klen,
+ enum svn_hash_diff_key_status status,
+ void *baton)
+{
+ comparison_baton_t *b = baton;
+ conflict_info_t *expected = apr_hash_get(b->expected_hash, key, klen);
+ conflict_info_t *found = apr_hash_get(b->found_hash, key, klen);
+
+ if (! expected)
+ {
+ b->errors = svn_error_createf(
+ SVN_ERR_TEST_FAILED, b->errors,
+ "found {%s}",
+ print_conflict(found, b->scratch_pool));
+ }
+ else if (! found)
+ {
+ b->errors = svn_error_createf(
+ SVN_ERR_TEST_FAILED, b->errors,
+ "expected {%s}",
+ print_conflict(expected, b->scratch_pool));
+ }
+ else if (expected->text_conflicted != found->text_conflicted
+ || expected->prop_conflicted != found->prop_conflicted
+ || !tree_conflicts_match(&expected->tc, &found->tc))
+ {
+ b->errors = svn_error_createf(
+ SVN_ERR_TEST_FAILED, b->errors,
+ "expected {%s}; found {%s}",
+ print_conflict(expected, b->scratch_pool),
+ print_conflict(found, b->scratch_pool));
+ }
+
+ /* Don't terminate the comparison: accumulate all differences. */
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+check_db_conflicts(svn_test__sandbox_t *b,
+ const char *root_path,
+ const conflict_info_t *expected_conflicts)
+{
+ svn_sqlite__db_t *sdb;
+ int i;
+ svn_sqlite__stmt_t *stmt;
+
+ svn_boolean_t have_row;
+ apr_hash_t *found_hash = apr_hash_make(b->pool);
+ apr_hash_t *expected_hash = apr_hash_make(b->pool);
+ apr_pool_t *iterpool = svn_pool_create(b->pool);
+ apr_hash_index_t *hi;
+ comparison_baton_t comparison_baton;
+
+ comparison_baton.expected_hash = expected_hash;
+ comparison_baton.found_hash = found_hash;
+ comparison_baton.scratch_pool = b->pool;
+ comparison_baton.errors = NULL;
+
+ /* Fill ACTUAL_HASH with data from the WC DB. */
+ SVN_ERR(open_wc_db(&sdb, b->wc_abspath, b->pool, b->pool));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_ACTUAL_INFO));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", (apr_int64_t)1 /* wc_id */,
+ root_path));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
+ {
+ conflict_info_t *row = apr_pcalloc(b->pool, sizeof(*row));
+
+ row->local_relpath = svn_sqlite__column_text(stmt, 0, b->pool);
+
+ svn_hash_sets(found_hash, row->local_relpath, row);
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__close(sdb));
+
+ for (hi = apr_hash_first(b->pool, found_hash); hi; hi = apr_hash_next(hi))
+ {
+ svn_skel_t *conflict;
+ conflict_info_t *info = apr_hash_this_val(hi);
+ const char *local_abspath;
+ svn_boolean_t tree_conflicted;
+
+ svn_pool_clear(iterpool);
+
+ local_abspath = svn_dirent_join(b->wc_abspath, info->local_relpath,
+ iterpool);
+
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ b->wc_ctx->db, local_abspath,
+ iterpool, iterpool));
+
+ SVN_TEST_ASSERT(conflict != NULL);
+
+ SVN_ERR(svn_wc__conflict_read_info(NULL, NULL,
+ &info->text_conflicted,
+ &info->prop_conflicted,
+ &tree_conflicted,
+ b->wc_ctx->db, local_abspath,
+ conflict,
+ iterpool, iterpool));
+
+ if (tree_conflicted)
+ {
+ const char *move_src_abspath;
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&info->tc.reason,
+ &info->tc.action,
+ &move_src_abspath,
+ b->wc_ctx->db,
+ local_abspath,
+ conflict,
+ b->pool, iterpool));
+
+ if (move_src_abspath)
+ info->tc.delete_path =
+ svn_dirent_skip_ancestor(b->wc_abspath, move_src_abspath);
+
+ if (!info->tc.reason
+ && !info->tc.action
+ && !info->tc.delete_path)
+ {
+ info->tc.conflicted_fb = TRUE;
+ }
+ }
+ }
+
+ /* Fill EXPECTED_HASH with data from EXPECTED_ROWS. */
+ if (expected_conflicts)
+ for (i = 0; expected_conflicts[i].local_relpath != NULL; i++)
+ {
+ const conflict_info_t *row = &expected_conflicts[i];
+
+ svn_hash_sets(expected_hash, row->local_relpath, row);
+ }
+
+ /* Compare EXPECTED_HASH with ACTUAL_HASH and return any errors. */
+ SVN_ERR(svn_hash_diff(expected_hash, found_hash,
+ compare_conflict_info, &comparison_baton, b->pool));
+ return comparison_baton.errors;
+}
+
+static svn_error_t *
+verify_db_callback(void *baton,
+ const char *wc_abspath,
+ const char *local_relpath,
+ int op_depth,
+ int id,
+ const char *msg,
+ apr_pool_t *scratch_pool)
+{
+ if (op_depth >= 0)
+ return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
+ "Verify: %s: %s (%d): SV%04d %s",
+ wc_abspath, local_relpath, op_depth, id, msg);
+ else
+ return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
+ "DB-VRFY: %s: %s: SV%04d %s",
+ wc_abspath, local_relpath, id, msg);
+}
+
+static svn_error_t *
+verify_db(svn_test__sandbox_t *b)
+{
+ SVN_ERR(svn_wc__db_verify_db_full(b->wc_ctx->db, b->wc_abspath,
+ verify_db_callback, NULL, b->pool));
+
+ return SVN_NO_ERROR;
+}
+
/* ---------------------------------------------------------------------- */
/* The test functions */
@@ -374,7 +632,7 @@ wc_wc_copies(svn_test__sandbox_t *b)
/* Create the various kinds of source node which will be copied */
- sbox_file_write(b, source_added_file, "New file");
+ SVN_ERR(sbox_file_write(b, source_added_file, "New file"));
SVN_ERR(sbox_wc_add(b, source_added_file));
SVN_ERR(sbox_wc_mkdir(b, source_added_dir));
SVN_ERR(sbox_wc_mkdir(b, source_added_dir2));
@@ -578,7 +836,7 @@ repo_wc_copies(svn_test__sandbox_t *b)
}
/* Perform each copy. */
- SVN_ERR(svn_client_create_context(&ctx, b->pool));
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
for (subtest = subtests; subtest->from_path; subtest++)
{
svn_opt_revision_t rev = { svn_opt_revision_number, { 1 } };
@@ -647,7 +905,7 @@ test_deletes(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(svn_test__sandbox_create(&b, "deletes", opts, pool));
SVN_ERR(sbox_add_and_commit_greek_tree(&b));
- sbox_file_write(&b, "A/B/E/new-file", "New file");
+ SVN_ERR(sbox_file_write(&b, "A/B/E/new-file", "New file"));
SVN_ERR(sbox_wc_add(&b, "A/B/E/new-file"));
{
nodes_row_t rows[] = {
@@ -709,7 +967,7 @@ test_adds(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_add_and_commit_greek_tree(&b));
/* add file */
- sbox_file_write(&b, "new-file", "New file");
+ SVN_ERR(sbox_file_write(&b, "new-file", "New file"));
SVN_ERR(sbox_wc_add(&b, "new-file"));
{
nodes_row_t rows[] = {
@@ -731,7 +989,7 @@ test_adds(const svn_test_opts_t *opts, apr_pool_t *pool)
/* replace file */
SVN_ERR(sbox_wc_delete(&b, "iota"));
- sbox_file_write(&b, "iota", "New iota file");
+ SVN_ERR(sbox_file_write(&b, "iota", "New iota file"));
SVN_ERR(sbox_wc_add(&b, "iota"));
{
nodes_row_t rows[] = {
@@ -766,12 +1024,12 @@ test_adds_change_kind(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
- SVN_ERR(svn_test__sandbox_create(&b, "adds", opts, pool));
+ SVN_ERR(svn_test__sandbox_create(&b, "test_adds_change_kind", opts, pool));
SVN_ERR(sbox_add_and_commit_greek_tree(&b));
/* replace dir with file */
SVN_ERR(sbox_wc_delete(&b, "A/B/E"));
- sbox_file_write(&b, "A/B/E", "New E file");
+ SVN_ERR(sbox_file_write(&b, "A/B/E", "New E file"));
SVN_ERR(sbox_wc_add(&b, "A/B/E"));
{
nodes_row_t rows[] = {
@@ -1024,47 +1282,53 @@ insert_dirs(svn_test__sandbox_t *b,
{
svn_sqlite__db_t *sdb;
svn_sqlite__stmt_t *stmt;
- static const char * const statements[] = {
- "DELETE FROM nodes;",
- "INSERT INTO nodes (local_relpath, op_depth, presence, repos_path,"
- " revision, wc_id, repos_id, kind, depth)"
- " VALUES (?1, ?2, ?3, ?4, ?5, 1, 1, 'dir', 'infinity');",
- "INSERT INTO nodes (local_relpath, op_depth, presence, repos_path,"
- " revision, parent_relpath, wc_id, repos_id, kind, depth)"
- " VALUES (?1, ?2, ?3, ?4, ?5, ?6, 1, 1, 'dir', 'infinity');",
- NULL,
- };
- SVN_ERR(open_wc_db(&sdb, b->wc_abspath, statements, b->pool, b->pool));
+ SVN_ERR(open_wc_db(&sdb, b->wc_abspath, b->pool, b->pool));
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 0));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_DELETE_NODES));
SVN_ERR(svn_sqlite__step_done(stmt));
while(nodes->local_relpath)
{
- if (nodes->local_relpath[0])
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "sdssrs",
+ nodes->local_relpath,
+ nodes->op_depth,
+ nodes->presence,
+ nodes->repo_relpath,
+ nodes->repo_revnum,
+ nodes->local_relpath[0]
+ ? svn_relpath_dirname(nodes->local_relpath,
+ b->pool)
+ : NULL));
+
+ if (nodes->moved_to)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 7, nodes->moved_to));
+ if (nodes->moved_here)
+ SVN_ERR(svn_sqlite__bind_int(stmt, 8, 1));
+ if (nodes->props)
{
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 2));
- SVN_ERR(svn_sqlite__bindf(stmt, "sdssrs",
- nodes->local_relpath,
- nodes->op_depth,
- nodes->presence,
- nodes->repo_relpath,
- nodes->repo_revnum,
- svn_relpath_dirname(nodes->local_relpath,
- b->pool)));
+ int i;
+ apr_hash_t *props = apr_hash_make(b->pool);
+ apr_array_header_t *names = svn_cstring_split(nodes->props, ",",
+ TRUE, b->pool);
+
+ for (i = 0; i < names->nelts; i++)
+ {
+ const char *name = APR_ARRAY_IDX(names, i, const char *);
+ svn_hash_sets(props, name, svn_string_create(name, b->pool));
+ }
+
+ SVN_ERR(svn_sqlite__bind_properties(stmt, 9, props, b->pool));
}
- else
+ else if (nodes->repo_relpath
+ && strcmp(nodes->presence, "normal") == 0)
{
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 1));
- SVN_ERR(svn_sqlite__bindf(stmt, "sdssr",
- nodes->local_relpath,
- nodes->op_depth,
- nodes->presence,
- nodes->repo_relpath,
- nodes->repo_revnum));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 9, "()"));
}
+ /* File externals? */
+
SVN_ERR(svn_sqlite__step_done(stmt));
++nodes;
}
@@ -1102,7 +1366,7 @@ base_dir_insert_remove(svn_test__sandbox_t *b,
"not-even-a-uuid", revision,
apr_hash_make(b->pool), revision,
0, NULL, NULL, svn_depth_infinity,
- NULL, NULL, FALSE, NULL, NULL, NULL,
+ NULL, FALSE, NULL, NULL, NULL, NULL,
b->pool));
after = apr_palloc(b->pool, sizeof(*after) * (apr_size_t)(num_before + num_added + 1));
@@ -1115,9 +1379,7 @@ base_dir_insert_remove(svn_test__sandbox_t *b,
SVN_ERR(check_db_rows(b, "", after));
SVN_ERR(svn_wc__db_base_remove(b->wc_ctx->db, dir_abspath,
- FALSE /* keep_as_Working */,
- FALSE /* queue_deletes */,
- FALSE /* remove_locks */,
+ FALSE, FALSE, FALSE,
SVN_INVALID_REVNUM,
NULL, NULL, b->pool));
SVN_ERR(svn_wc__wq_run(b->wc_ctx->db, dir_abspath,
@@ -1427,29 +1689,11 @@ test_base_dir_insert_remove(const svn_test_opts_t *opts, apr_pool_t *pool)
}
static svn_error_t *
-temp_op_make_copy(svn_test__sandbox_t *b,
- const char *local_relpath,
- nodes_row_t *before,
- nodes_row_t *after)
-{
- const char *dir_abspath = svn_path_join(b->wc_abspath, local_relpath,
- b->pool);
-
- SVN_ERR(insert_dirs(b, before));
-
- SVN_ERR(svn_wc__db_op_make_copy(b->wc_ctx->db, dir_abspath, NULL, NULL, b->pool));
-
- SVN_ERR(check_db_rows(b, "", after));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-test_temp_op_make_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
+test_db_make_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
- SVN_ERR(svn_test__sandbox_create(&b, "temp_op_make_copy", opts, pool));
+ SVN_ERR(svn_test__sandbox_create(&b, "make_copy", opts, pool));
{
/* / norm -
@@ -1480,7 +1724,7 @@ test_temp_op_make_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
{ 2, "A/F", "normal", 1, "S2" },
{ 2, "A/F/G", "normal", 1, "S2/G" },
{ 2, "A/F/H", "not-present", 1, "S2/H" },
- { 2, "A/F/E", "base-deleted", 2, "A/F/E" },
+ { 2, "A/F/E", "base-deleted", NO_COPY_FROM },
{ 0 }
};
/* / norm -
@@ -1518,14 +1762,18 @@ test_temp_op_make_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
{ 2, "A/B", "normal", NO_COPY_FROM },
{ 2, "A/B/C", "base-deleted", NO_COPY_FROM },
{ 2, "A/F", "normal", 1, "S2" },
- { 2, "A/F/E", "base-deleted", 2, "A/F/E" },
+ { 2, "A/F/E", "base-deleted", NO_COPY_FROM },
{ 2, "A/F/G", "normal", 1, "S2/G" },
{ 2, "A/F/H", "not-present", 1, "S2/H" },
{ 3, "A/B/C", "normal", NO_COPY_FROM },
{ 0 }
};
- SVN_ERR(temp_op_make_copy(&b, "A", before, after));
+ SVN_ERR(insert_dirs(&b, before));
+ SVN_ERR(svn_wc__db_op_make_copy(b.wc_ctx->db, sbox_wc_path(&b, "A"),
+ NULL, NULL, pool));
+
+ SVN_ERR(check_db_rows(&b, "", after));
}
return SVN_NO_ERROR;
@@ -1821,46 +2069,32 @@ insert_actual(svn_test__sandbox_t *b,
{
svn_sqlite__db_t *sdb;
svn_sqlite__stmt_t *stmt;
- static const char * const statements[] = {
- "DELETE FROM actual_node;",
- "INSERT INTO actual_node (local_relpath, changelist, wc_id)"
- " VALUES (?1, ?2, 1)",
- "INSERT INTO actual_node (local_relpath, parent_relpath, changelist, wc_id)"
- " VALUES (?1, ?2, ?3, 1)",
- "UPDATE nodes SET kind = 'file' WHERE wc_id = 1 and local_relpath = ?1",
- NULL,
- };
if (!actual)
return SVN_NO_ERROR;
- SVN_ERR(open_wc_db(&sdb, b->wc_abspath, statements, b->pool, b->pool));
+ SVN_ERR(open_wc_db(&sdb, b->wc_abspath, b->pool, b->pool));
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 0));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_DELETE_ACTUAL));
SVN_ERR(svn_sqlite__step_done(stmt));
while(actual->local_relpath)
{
- if (actual->local_relpath[0])
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 2));
- SVN_ERR(svn_sqlite__bindf(stmt, "sss",
- actual->local_relpath,
- svn_relpath_dirname(actual->local_relpath,
- b->pool),
- actual->changelist));
- }
- else
- {
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 1));
- SVN_ERR(svn_sqlite__bindf(stmt, "ss",
- actual->local_relpath,
- actual->changelist));
- }
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_ACTUAL));
+ SVN_ERR(svn_sqlite__bindf(stmt, "sss",
+ actual->local_relpath,
+ actual->local_relpath[0]
+ ? svn_relpath_dirname(actual->local_relpath,
+ b->pool)
+ : NULL,
+ actual->changelist));
SVN_ERR(svn_sqlite__step_done(stmt));
if (actual->changelist)
{
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 3));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_ENSURE_EMPTY_PRISTINE));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_NODES_SET_FILE));
SVN_ERR(svn_sqlite__bindf(stmt, "s", actual->local_relpath));
SVN_ERR(svn_sqlite__step_done(stmt));
}
@@ -1876,10 +2110,6 @@ check_db_actual(svn_test__sandbox_t* b, actual_row_t *rows)
{
svn_sqlite__db_t *sdb;
svn_sqlite__stmt_t *stmt;
- static const char * const statements[] = {
- "SELECT local_relpath FROM actual_node WHERE wc_id = 1;",
- NULL,
- };
svn_boolean_t have_row;
apr_hash_t *path_hash = apr_hash_make(b->pool);
@@ -1893,15 +2123,15 @@ check_db_actual(svn_test__sandbox_t* b, actual_row_t *rows)
++rows;
}
- SVN_ERR(open_wc_db(&sdb, b->wc_abspath, statements, b->pool, b->pool));
+ SVN_ERR(open_wc_db(&sdb, b->wc_abspath, b->pool, b->pool));
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 0));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_ALL_ACTUAL));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
while (have_row)
{
const char *local_relpath = svn_sqlite__column_text(stmt, 0, b->pool);
if (!apr_hash_get(path_hash, local_relpath, APR_HASH_KEY_STRING))
- return svn_error_createf(SVN_ERR_TEST_FAILED, svn_sqlite__close(sdb),
+ return svn_error_createf(SVN_ERR_TEST_FAILED, svn_sqlite__reset(stmt),
"actual '%s' unexpected", local_relpath);
apr_hash_set(path_hash, local_relpath, APR_HASH_KEY_STRING, NULL);
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -1910,8 +2140,8 @@ check_db_actual(svn_test__sandbox_t* b, actual_row_t *rows)
if (apr_hash_count(path_hash))
{
const char *local_relpath
- = svn__apr_hash_index_key(apr_hash_first(b->pool, path_hash));
- return svn_error_createf(SVN_ERR_TEST_FAILED, svn_sqlite__close(sdb),
+ = apr_hash_this_key(apr_hash_first(b->pool, path_hash));
+ return svn_error_createf(SVN_ERR_TEST_FAILED, svn_sqlite__reset(stmt),
"actual '%s' expected", local_relpath);
}
@@ -1943,7 +2173,7 @@ revert(svn_test__sandbox_t *b,
SVN_ERR(insert_actual(b, before_actual));
SVN_ERR(check_db_rows(b, "", before_nodes));
SVN_ERR(check_db_actual(b, before_actual));
- err = svn_wc__db_op_revert(b->wc_ctx->db, local_abspath, depth,
+ err = svn_wc__db_op_revert(b->wc_ctx->db, local_abspath, depth, FALSE,
b->pool, b->pool);
if (err)
{
@@ -2511,7 +2741,7 @@ check_hash_keys(apr_hash_t *hash,
for (hi = apr_hash_first(scratch_pool, hash); hi;
hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
+ const char *name = apr_hash_this_key(hi);
err = svn_error_compose_create(
err, svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
_("Found, not expected: '%s'"), name));
@@ -2613,8 +2843,8 @@ test_children_of_replaced_dir(const svn_test_opts_t *opts, apr_pool_t *pool)
&children_array, b.wc_ctx->db, A_abspath, pool, pool));
SVN_ERR(CHECK_ARRAY(children_array, working_children_inc_hidden, pool));
- SVN_ERR(svn_wc__node_get_children(&children_array, b.wc_ctx, A_abspath,
- TRUE /* show_hidden */, pool, pool));
+ SVN_ERR(svn_wc__db_read_children(&children_array, b.wc_ctx->db, A_abspath,
+ pool, pool));
SVN_ERR(CHECK_ARRAY(children_array, all_children_inc_hidden, pool));
/* I am not testing svn_wc__node_get_children(show_hidden=FALSE) because
@@ -2623,17 +2853,14 @@ test_children_of_replaced_dir(const svn_test_opts_t *opts, apr_pool_t *pool)
* a 'hidden' child of the working dir (so should be excluded). */
SVN_ERR(svn_wc__node_get_children_of_working_node(
- &children_array, b.wc_ctx, A_abspath, TRUE /* show_hidden */,
- pool, pool));
- SVN_ERR(CHECK_ARRAY(children_array, working_children_inc_hidden, pool));
-
- SVN_ERR(svn_wc__node_get_children_of_working_node(
- &children_array, b.wc_ctx, A_abspath, FALSE /* show_hidden */,
+ &children_array, b.wc_ctx, A_abspath,
pool, pool));
SVN_ERR(CHECK_ARRAY(children_array, working_children_exc_hidden, pool));
SVN_ERR(svn_wc__db_read_children_info(&children_hash, &conflicts_hash,
- b.wc_ctx->db, A_abspath, pool, pool));
+ b.wc_ctx->db, A_abspath,
+ FALSE /* base_tree_only */,
+ pool, pool));
SVN_ERR(CHECK_HASH(children_hash, all_children_inc_hidden, pool));
/* We don't yet have a svn_wc__db_read_children_info2() to test. */
@@ -2970,7 +3197,7 @@ test_shadowed_update(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(svn_test__sandbox_create(&b, "shadowed_update", opts, pool));
/* Set up the base state as revision 1. */
- sbox_file_write(&b, "iota", "This is iota");
+ SVN_ERR(sbox_file_write(&b, "iota", "This is iota"));
SVN_ERR(sbox_wc_add(&b, "iota"));
SVN_ERR(sbox_wc_commit(&b, ""));
@@ -2985,7 +3212,7 @@ test_shadowed_update(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_commit(&b, ""));
/* And change something in r3 */
- sbox_file_write(&b, "iota", "This is a new iota");
+ SVN_ERR(sbox_file_write(&b, "iota", "This is a new iota"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* And delete C & M */
@@ -3306,12 +3533,12 @@ commit_file_external(const svn_test_opts_t *opts, apr_pool_t *pool)
svn_test__sandbox_t b;
SVN_ERR(svn_test__sandbox_create(&b, "commit_file_external", opts, pool));
- sbox_file_write(&b, "f", "this is f\n");
+ SVN_ERR(sbox_file_write(&b, "f", "this is f\n"));
SVN_ERR(sbox_wc_add(&b, "f"));
SVN_ERR(sbox_wc_propset(&b, "svn:externals", "^/f g", ""));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_update(&b, "", 1));
- sbox_file_write(&b, "g", "this is f\nmodified via g\n");
+ SVN_ERR(sbox_file_write(&b, "g", "this is f\nmodified via g\n"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_update(&b, "", 2));
@@ -3334,7 +3561,7 @@ revert_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
svn_test__sandbox_t b;
SVN_ERR(svn_test__sandbox_create(&b, "revert_file_externals", opts, pool));
- sbox_file_write(&b, "f", "this is f\n");
+ SVN_ERR(sbox_file_write(&b, "f", "this is f\n"));
SVN_ERR(sbox_wc_add(&b, "f"));
SVN_ERR(sbox_wc_propset(&b, "svn:externals", "^/f g", ""));
SVN_ERR(sbox_wc_commit(&b, ""));
@@ -3356,11 +3583,13 @@ revert_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update(&b, "", 1));
{
nodes_row_t rows[] = {
- { 0, "", "normal", 1, "" },
- { 0, "f", "normal", 1, "f" },
- { 1, "A", "normal", NO_COPY_FROM },
- { 0, "h", "normal", 1, "f", TRUE },
- { 0, "A/g", "normal", 1, "f", TRUE },
+ { 0, "", "normal", 1, "" },
+ { 0, "f", "normal", 1, "f" },
+ { 1, "A", "normal", NO_COPY_FROM },
+ { 0, "h", "normal", 1, "f", TRUE },
+ { 0, "A/g", "normal", 1, "f", TRUE },
+
+ { 0, "g", "not-present", 0, "g"},
{ 0 }
};
SVN_ERR(check_db_rows(&b, "", rows));
@@ -3369,10 +3598,12 @@ revert_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_revert(&b, "", svn_depth_infinity));
{
nodes_row_t rows[] = {
- { 0, "", "normal", 1, "" },
- { 0, "f", "normal", 1, "f" },
- { 0, "h", "normal", 1, "f", TRUE },
- { 0, "A/g", "normal", 1, "f", TRUE },
+ { 0, "", "normal", 1, "" },
+ { 0, "f", "normal", 1, "f" },
+ { 0, "h", "normal", 1, "f", TRUE },
+ { 0, "A/g", "normal", 1, "f", TRUE },
+
+ { 0, "g", "not-present", 0, "g"},
{ 0 }
};
SVN_ERR(check_db_rows(&b, "", rows));
@@ -3381,9 +3612,11 @@ revert_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update(&b, "", 1));
{
nodes_row_t rows[] = {
- { 0, "", "normal", 1, "" },
- { 0, "f", "normal", 1, "f" },
- { 0, "g", "normal", 1, "f", TRUE },
+ { 0, "", "normal", 1, "" },
+ { 0, "f", "normal", 1, "f" },
+ { 0, "g", "normal", 1, "f", TRUE },
+
+ { 0, "h", "not-present", 0, "h"},
{ 0 }
};
SVN_ERR(check_db_rows(&b, "", rows));
@@ -3398,7 +3631,7 @@ copy_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
svn_test__sandbox_t b;
SVN_ERR(svn_test__sandbox_create(&b, "copy_file_externals", opts, pool));
- sbox_file_write(&b, "f", "this is f\n");
+ SVN_ERR(sbox_file_write(&b, "f", "this is f\n"));
SVN_ERR(sbox_wc_add(&b, "f"));
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_propset(&b, "svn:externals", "^/f g", "A"));
@@ -3560,6 +3793,8 @@ incomplete_switch(const svn_test_opts_t *opts, apr_pool_t *pool)
};
SVN_ERR(insert_dirs(&b, before));
+ SVN_ERR(svn_io_remove_dir2(sbox_wc_path(&b, "A/B/C/D"), FALSE,
+ NULL, NULL, pool));
SVN_ERR(check_db_rows(&b, "", before));
SVN_ERR(sbox_wc_update(&b, "", 4));
SVN_ERR(check_db_rows(&b, "", after_update));
@@ -4430,27 +4665,27 @@ move_update(const svn_test_opts_t *opts, apr_pool_t *pool)
/* r1: Create files 'f', 'h' */
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
- sbox_file_write(&b, "A/B/f", "r1 content\n");
- sbox_file_write(&b, "A/B/h", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/f", "r1 content\n"));
+ SVN_ERR(sbox_file_write(&b, "A/B/h", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/f"));
SVN_ERR(sbox_wc_add(&b, "A/B/h"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r2: Modify 'f' */
- sbox_file_write(&b, "A/B/f", "r1 content\nr2 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/f", "r1 content\nr2 content\n"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r3: Delete 'h', add 'g' */
- sbox_file_write(&b, "A/B/g", "r3 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/g", "r3 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/g"));
SVN_ERR(sbox_wc_delete(&b, "A/B/h"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r4: Add a new subtree 'X' */
SVN_ERR(sbox_wc_mkdir(&b, "X"));
- sbox_file_write(&b, "X/f", "r4 content\n");
- sbox_file_write(&b, "X/g", "r4 content\n");
- sbox_file_write(&b, "X/h", "r4 content\n");
+ SVN_ERR(sbox_file_write(&b, "X/f", "r4 content\n"));
+ SVN_ERR(sbox_file_write(&b, "X/g", "r4 content\n"));
+ SVN_ERR(sbox_file_write(&b, "X/h", "r4 content\n"));
SVN_ERR(sbox_wc_add(&b, "X/f"));
SVN_ERR(sbox_wc_add(&b, "X/g"));
SVN_ERR(sbox_wc_add(&b, "X/h"));
@@ -5031,8 +5266,10 @@ mixed_rev_move(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/D"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/D/E"));
SVN_ERR(sbox_wc_commit(&b, ""));
{
@@ -5041,6 +5278,8 @@ mixed_rev_move(const svn_test_opts_t *opts, apr_pool_t *pool)
{0, "A", "normal", 1, "A"},
{0, "A/B", "normal", 2, "A/B"},
{0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/D", "normal", 2, "A/D"},
+ {0, "A/D/E", "normal", 3, "A/D/E"},
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
@@ -5060,20 +5299,30 @@ mixed_rev_move(const svn_test_opts_t *opts, apr_pool_t *pool)
{0, "A", "normal", 1, "A"},
{0, "A/B", "normal", 2, "A/B"},
{0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/D", "normal", 2, "A/D"},
+ {0, "A/D/E", "normal", 3, "A/D/E"},
{1, "A", "base-deleted", NO_COPY_FROM, "X"},
{1, "A/B", "base-deleted", NO_COPY_FROM},
{1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/D/E", "base-deleted", NO_COPY_FROM},
{1, "X", "normal", 1, "A", MOVED_HERE},
{1, "X/B", "not-present", 2, "A/B"},
+ {1, "X/D", "not-present", 2, "A/D"},
{2, "X/B", "normal", 2, "A/B"},
{2, "X/B/C", "not-present", 3, "A/B/C"},
+ {2, "X/D", "normal", 2, "A/D"},
+ {2, "X/D/E", "not-present", 3, "A/D/E"},
{3, "X/B/C", "normal", 3, "A/B/C"},
+ {3, "X/D/E", "normal", 3, "A/D/E"},
+
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
}
/* ### These values PASS but I'm not sure they are correct. */
+ /* A/B/C doesn't exist as X/B/C at op depth 1, but is reported */
SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
sbox_wc_path(&b, "A/B/C"), pool, pool));
SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B/C"));
@@ -5099,32 +5348,109 @@ mixed_rev_move(const svn_test_opts_t *opts, apr_pool_t *pool)
{0, "A", "normal", 1, "A"},
{0, "A/B", "normal", 2, "A/B"},
{0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/D", "normal", 2, "A/D"},
+ {0, "A/D/E", "normal", 3, "A/D/E"},
{1, "A", "base-deleted", NO_COPY_FROM, "X"},
{1, "A/B", "base-deleted", NO_COPY_FROM},
{1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/D/E", "base-deleted", NO_COPY_FROM},
{1, "X", "normal", 1, "A", MOVED_HERE},
{1, "X/B", "not-present", 2, "A/B"},
+ {1, "X/D", "not-present", 2, "A/D"},
+ {2, "X/D", "normal", 2, "A/D"},
+ {2, "X/D/E", "not-present", 3, "A/D/E"},
{2, "X/Y", "normal", 2, "A/B"},
{2, "X/Y/C", "not-present", NO_COPY_FROM},
{3, "X/Y/C", "normal", 3, "A/B/C"},
+ {3, "X/D/E", "normal", 3, "A/D/E"},
+
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
}
+ /* A/B/C still doesn't exist as X/B/C at op depth 1 */
SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
sbox_wc_path(&b, "A/B/C"), pool, pool));
- SVN_TEST_ASSERT(moved_tos->nelts == 0);
+ SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B/C"));
+ SVN_TEST_ASSERT(moved_tos->nelts == 1);
+ /* A/B doesn't exist exist as X/B and the move to Y can't be tracked in
+ the current scheme */
SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
sbox_wc_path(&b, "A/B"), pool, pool));
- SVN_TEST_ASSERT(moved_tos->nelts == 0);
+ SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B"));
+ SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+ SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+ sbox_wc_path(&b, "A"), pool, pool));
+ SVN_ERR(check_moved_to(moved_tos, 0, 1, "X"));
+ SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+
+ SVN_ERR(sbox_wc_mkdir(&b, "Z"));
+ SVN_ERR(sbox_wc_commit(&b, "Z")); /* r4 */
+
+ SVN_ERR(sbox_wc_update(&b, "", 4));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 4, ""},
+ {0, "A", "normal", 4, "A"},
+ {0, "A/B", "normal", 4, "A/B"},
+ {0, "A/B/C", "normal", 4, "A/B/C"},
+ {0, "A/D", "normal", 4, "A/D"},
+ {0, "A/D/E", "normal", 4, "A/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/D/E", "base-deleted", NO_COPY_FROM},
+ /* X is expanded on update. The not-present nodes are now here */
+ {1, "X", "normal", 4, "A", MOVED_HERE},
+ {1, "X/B", "normal", 4, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 4, "A/B/C", MOVED_HERE},
+ {1, "X/D", "normal", 4, "A/D", MOVED_HERE},
+ {1, "X/D/E", "normal", 4, "A/D/E", MOVED_HERE},
+ {2, "X/D", "normal", 2, "A/D"},
+ {2, "X/D/E", "not-present", 3, "A/D/E"},
+ {2, "X/Y", "normal", 2, "A/B"},
+ {2, "X/Y/C", "not-present", NO_COPY_FROM},
+ {3, "X/D/E", "normal", 3, "A/D/E"},
+ {3, "X/Y/C", "normal", 3, "A/B/C"},
+
+ {0, "Z", "normal", 4, "Z"},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B/C"), pool, pool));
+ SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B/C"));
+ SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+ SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B"), pool, pool));
+ SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B"));
+ SVN_TEST_ASSERT(moved_tos->nelts == 1);
SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
sbox_wc_path(&b, "A"), pool, pool));
SVN_ERR(check_moved_to(moved_tos, 0, 1, "X"));
SVN_TEST_ASSERT(moved_tos->nelts == 1);
+ {
+ conflict_info_t conflicts[] = {
+ { "X/D", FALSE, FALSE, {0 /* ### Needs fixing */} },
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
return SVN_NO_ERROR;
}
@@ -5140,8 +5466,8 @@ update_prop_mod_into_moved(const svn_test_opts_t *opts, apr_pool_t *pool)
/* r1: Create files 'f', 'h' */
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
- sbox_file_write(&b, "A/B/f", "r1 content\n");
- sbox_file_write(&b, "A/B/h", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/f", "r1 content\n"));
+ SVN_ERR(sbox_file_write(&b, "A/B/h", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/f"));
SVN_ERR(sbox_wc_add(&b, "A/B/h"));
SVN_ERR(sbox_wc_propset(&b, "pd", "f1", "A/B/f"));
@@ -5152,14 +5478,14 @@ update_prop_mod_into_moved(const svn_test_opts_t *opts, apr_pool_t *pool)
/* r2: Modify 'f'. Delete prop 'pd', modify prop 'pm', add prop 'pa',
* leave prop 'pn' unchanged. */
- sbox_file_write(&b, "A/B/f", "r1 content\nr2 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/f", "r1 content\nr2 content\n"));
SVN_ERR(sbox_wc_propset(&b, "pd", NULL, "A/B/f"));
SVN_ERR(sbox_wc_propset(&b, "pm", "f2", "A/B/f"));
SVN_ERR(sbox_wc_propset(&b, "pa", "f2", "A/B/f"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r3: Delete 'h', add 'g' */
- sbox_file_write(&b, "A/B/g", "r3 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/g", "r3 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/g"));
SVN_ERR(sbox_wc_propset(&b, "p", "g3", "A/B/g"));
SVN_ERR(sbox_wc_delete(&b, "A/B/h"));
@@ -5222,9 +5548,22 @@ update_prop_mod_into_moved(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(check_db_rows(&b, "", nodes));
}
+ {
+ conflict_info_t conflicts[] = {
+ { "A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
/* Resolve should update the move. */
SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
+
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5259,12 +5598,12 @@ nested_move_update(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
- sbox_file_write(&b, "A/B/C/f", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/C/f", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/C/f"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r2: Modify 'f' */
- sbox_file_write(&b, "A/B/C/f", "r1 content\nr2 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/C/f", "r1 content\nr2 content\n"));
SVN_ERR(sbox_wc_commit(&b, ""));
/* r3: Create 'X' */
@@ -5301,12 +5640,37 @@ nested_move_update(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/f", "normal", 2, "A/B/C/f"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "A2"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/f", "base-deleted", NO_COPY_FROM},
+ {1, "A2", "normal", 1, "A", MOVED_HERE},
+ {1, "A2/B", "normal", 1, "A/B", MOVED_HERE},
+ {1, "A2/B/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {1, "A2/B/C/f", "normal", 1, "A/B/C/f", MOVED_HERE},
+ {3, "A2/B/C", "base-deleted", NO_COPY_FROM, "A2/B/C2"},
+ {3, "A2/B/C/f", "base-deleted", NO_COPY_FROM},
+ {3, "A2/B/C2", "normal", 1, "A/B/C", MOVED_HERE},
+ {3, "A2/B/C2/f", "normal", 1, "A/B/C/f", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
/* Following the A->A2 move should raise a tree-conflict on A2/B/C,
resolving that may require an explicit resolve. */
SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
SVN_ERR(sbox_wc_resolve(&b, "A2/B/C", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(check_db_conflicts(&b, "", NULL /* no conflicts */));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5333,6 +5697,8 @@ nested_move_update(const svn_test_opts_t *opts, apr_pool_t *pool)
/* Update A to r3 brings no changes but updates the revisions. */
SVN_ERR(sbox_wc_update(&b, "A", 3));
+ SVN_ERR(check_db_conflicts(&b, "", NULL /* no conflicts */));
+
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5371,7 +5737,7 @@ nested_move_commit(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
- sbox_file_write(&b, "A/B/C/f", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/C/f", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/C/f"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_update(&b, "", 1));
@@ -5615,10 +5981,12 @@ check_tree_conflict_repos_path(svn_test__sandbox_t *b,
const apr_array_header_t *locations;
svn_boolean_t text_conflicted, prop_conflicted, tree_conflicted;
- SVN_ERR(svn_wc__db_read_conflict(&conflict, b->wc_ctx->db,
- sbox_wc_path(b, wc_path),
+ SVN_ERR(svn_wc__db_read_conflict(&conflict, NULL, NULL,
+ b->wc_ctx->db, sbox_wc_path(b, wc_path),
b->pool, b->pool));
+ SVN_TEST_ASSERT(conflict != NULL);
+
SVN_ERR(svn_wc__conflict_read_info(&operation, &locations,
&text_conflicted, &prop_conflicted,
&tree_conflicted,
@@ -5632,7 +6000,9 @@ check_tree_conflict_repos_path(svn_test__sandbox_t *b,
svn_wc_conflict_version_t *version
= APR_ARRAY_IDX(locations, 0, svn_wc_conflict_version_t *);
- SVN_ERR_ASSERT(!strcmp(version->path_in_repos, repos_path1));
+ SVN_TEST_ASSERT(version != NULL);
+
+ SVN_TEST_STRING_ASSERT(version->path_in_repos, repos_path1);
}
if (repos_path2)
@@ -5640,7 +6010,9 @@ check_tree_conflict_repos_path(svn_test__sandbox_t *b,
svn_wc_conflict_version_t *version
= APR_ARRAY_IDX(locations, 1, svn_wc_conflict_version_t *);
- SVN_ERR_ASSERT(!strcmp(version->path_in_repos, repos_path2));
+ SVN_TEST_ASSERT(version != NULL);
+
+ SVN_TEST_STRING_ASSERT(version->path_in_repos, repos_path2);
}
return SVN_NO_ERROR;
@@ -5666,7 +6038,7 @@ move_update_conflicts(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update(&b, "", 1));
SVN_ERR(sbox_wc_move(&b, "A", "A2"));
SVN_ERR(sbox_wc_move(&b, "A2/B/C", "A2/B/C2"));
- sbox_file_write(&b, "A2/B/F", "obstruction\n");
+ SVN_ERR(sbox_file_write(&b, "A2/B/F", "obstruction\n"));
{
nodes_row_t nodes[] = {
@@ -5744,7 +6116,7 @@ move_update_delete_mods(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/D"));
- sbox_file_write(&b, "A/B/C/f", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "A/B/C/f", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "A/B/C/f"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_delete(&b, "A/B/C"));
@@ -5753,7 +6125,7 @@ move_update_delete_mods(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update(&b, "", 1));
SVN_ERR(sbox_wc_move(&b, "A/B", "B2"));
- sbox_file_write(&b, "B2/C/f", "modified content\n");
+ SVN_ERR(sbox_file_write(&b, "B2/C/f", "modified content\n"));
SVN_ERR(sbox_wc_delete(&b, "B2/D"));
{
nodes_row_t nodes[] = {
@@ -5791,7 +6163,16 @@ move_update_delete_mods(const svn_test_opts_t *opts, apr_pool_t *pool)
{2, "B2/C/f", "normal", 1, "A/B/C/f"},
{0}
};
+ conflict_info_t conflicts[] = {
+ {"B2/C", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_edited}},
+ {"B2/D", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_deleted}},
+ { 0 }
+ };
+
SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
}
SVN_ERR(check_tree_conflict_repos_path(&b, "B2/C", "A/B/C", "A/B/C"));
@@ -5949,6 +6330,34 @@ move_in_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
}
SVN_ERR(sbox_wc_update(&b, "", 3));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 3, ""},
+ {0, "A", "normal", 3, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/B/C/D", "normal", 3, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 3, "A/B/C/D/E"},
+
+ {1, "C2", "normal", 2, "A/B/C", MOVED_HERE},
+ {1, "C2/D", "normal", 2, "A/B/C/D", MOVED_HERE},
+
+ {2, "A/B", "base-deleted", NO_COPY_FROM},
+ {2, "A/B/C", "base-deleted", NO_COPY_FROM, "C2"},
+ {2, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {2, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_deleted}},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
SVN_ERR(sbox_wc_revert(&b, "A/B", svn_depth_empty));
{
nodes_row_t nodes[] = {
@@ -5965,7 +6374,14 @@ move_in_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
{1, "C2/D", "normal", 2, "A/B/C/D", MOVED_HERE},
{0}
};
+ conflict_info_t conflicts[] = {
+ {"A/B/C", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/B/C"}},
+ {0}
+ };
SVN_ERR(check_db_rows(&b, "", nodes));
+ /* Where did this conflict come from? */
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
}
/* Revert should have left a tree-conflict (or broken the move). */
@@ -5988,6 +6404,7 @@ move_in_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
}
return SVN_NO_ERROR;
@@ -6563,6 +6980,31 @@ commit_moved_descendant(const svn_test_opts_t *opts, apr_pool_t *pool)
shadowed, like in this case. The commit processing doesn't
support this yet though*/
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 0, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "A/A/A", "normal", 2, "A/A/A"},
+ {0, "A/A/A/A", "normal", 2, "A/A/A/A"},
+ {0, "A/A/A/A/A", "normal", 2, "A/A/A/A/A"},
+ {0, "A/A/A/A/A/A", "normal", 2, "A/A/A/A/A/A"},
+ {0, "A_copied", "normal", 2, "A_copied"},
+ {0, "A_copied/A", "normal", 2, "A_copied/A"},
+ {0, "A_copied/A/A", "normal", 2, "A_copied/A/A"},
+ {0, "A_copied/A/A/A", "normal", 2, "A_copied/A/A/A"},
+ {0, "A_copied/A/A/A/A", "normal", 2, "A_copied/A/A/A/A"},
+ {0, "A_copied/A/A/A/A/A","normal", 2, "A_copied/A/A/A/A/A"},
+ {0, "AAA_moved", "normal", 2, "AAA_moved"},
+ {0, "AAA_moved/A", "normal", 2, "AAA_moved/A"},
+ {0, "AAA_moved/A/A", "normal", 2, "AAA_moved/A/A"},
+ {0, "AAA_moved/A/A/A", "normal", 2, "AAA_moved/A/A/A"},
+
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
return SVN_NO_ERROR;
}
@@ -6585,10 +7027,63 @@ commit_moved_away_descendant(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_delete(&b, "A/A"));
SVN_ERR(sbox_wc_copy(&b, "A_copied/A", "A/A"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 0, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/A", "normal", 1, "A/A"},
+ {0, "A/A/A", "normal", 1, "A/A/A"},
+ {0, "A/A/A/A", "normal", 1, "A/A/A/A"},
+ {0, "A/A/A/A/A", "normal", 1, "A/A/A/A/A"},
+ {0, "A/A/A/A/A/A", "normal", 1, "A/A/A/A/A/A"},
+ {1, "A_copied", "normal", 1, "A"},
+ {1, "A_copied/A", "normal", 1, "A/A"},
+ {1, "A_copied/A/A", "normal", 1, "A/A/A"},
+ {1, "A_copied/A/A/A", "normal", 1, "A/A/A/A"},
+ {1, "A_copied/A/A/A/A", "normal", 1, "A/A/A/A/A"},
+ {1, "A_copied/A/A/A/A/A", "normal", 1, "A/A/A/A/A/A"},
+ {1, "AAA_moved", "normal", 1, "A/A/A", MOVED_HERE},
+ {1, "AAA_moved/A", "normal", 1, "A/A/A/A", MOVED_HERE},
+ {1, "AAA_moved/A/A", "normal", 1, "A/A/A/A/A", MOVED_HERE},
+ {1, "AAA_moved/A/A/A", "normal", 1, "A/A/A/A/A/A", MOVED_HERE},
+ {2, "A/A", "normal", 1, "A/A"},
+ {2, "A/A/A", "normal", 1, "A/A/A", FALSE, "AAA_moved"},
+ {2, "A/A/A/A", "normal", 1, "A/A/A/A"},
+ {2, "A/A/A/A/A", "normal", 1, "A/A/A/A/A"},
+ {2, "A/A/A/A/A/A", "normal", 1, "A/A/A/A/A/A"},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
/* And now I want to make sure that I can't commit A, without also
committing AAA_moved, as that would break the move*/
SVN_ERR(sbox_wc_commit(&b, "A"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 0, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "A/A/A", "normal", 2, "A/A/A"},
+ {0, "A/A/A/A", "normal", 2, "A/A/A/A"},
+ {0, "A/A/A/A/A", "normal", 2, "A/A/A/A/A"},
+ {0, "A/A/A/A/A/A", "normal", 2, "A/A/A/A/A/A"},
+ {1, "A_copied", "normal", 1, "A"},
+ {1, "A_copied/A", "normal", 1, "A/A"},
+ {1, "A_copied/A/A", "normal", 1, "A/A/A"},
+ {1, "A_copied/A/A/A", "normal", 1, "A/A/A/A"},
+ {1, "A_copied/A/A/A/A", "normal", 1, "A/A/A/A/A"},
+ {1, "A_copied/A/A/A/A/A", "normal", 1, "A/A/A/A/A/A"},
+ {1, "AAA_moved", "normal", 1, "A/A/A"},
+ {1, "AAA_moved/A", "normal", 1, "A/A/A/A"},
+ {1, "AAA_moved/A/A", "normal", 1, "A/A/A/A/A"},
+ {1, "AAA_moved/A/A/A", "normal", 1, "A/A/A/A/A/A"},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"The commit should have failed");
@@ -6608,7 +7103,7 @@ finite_move_update_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
SVN_ERR(sbox_wc_mkdir(&b, "P"));
SVN_ERR(sbox_wc_mkdir(&b, "P/Q"));
- sbox_file_write(&b, "P/Q/f", "r1 content\n");
+ SVN_ERR(sbox_file_write(&b, "P/Q/f", "r1 content\n"));
SVN_ERR(sbox_wc_add(&b, "P/Q/f"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_mkdir(&b, "X"));
@@ -6645,10 +7140,27 @@ finite_move_update_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_move(&b, "P/Q", "Q2"));
SVN_ERR(sbox_wc_update_depth(&b, "A/B", 2, svn_depth_files, FALSE));
SVN_ERR(sbox_wc_update_depth(&b, "P/Q", 2, svn_depth_files, FALSE));
- SVN_ERR(check_tree_conflict_repos_path(&b, "A/B", NULL, NULL));
+ {
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/B"}},
+ {"P/Q", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "P/Q"}},
+ {0}
+ };
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ SVN_ERR(check_tree_conflict_repos_path(&b, "A/B", "A/B", "A/B"));
+ SVN_ERR(check_tree_conflict_repos_path(&b, "P/Q", "P/Q", "P/Q"));
err = sbox_wc_resolve(&b, "A/B", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict);
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+
+ /* sbox_wc_resolve() obtains a lock on the target path, so now it
+ will apply the change on the target */
+ SVN_ERR(sbox_wc_resolve(&b, "P/Q", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
@@ -6677,10 +7189,23 @@ finite_move_update_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_move(&b, "P", "P2"));
SVN_ERR(sbox_wc_update_depth(&b, "A/B", 2, svn_depth_immediates, FALSE));
SVN_ERR(sbox_wc_update_depth(&b, "P", 2, svn_depth_immediates, FALSE));
- SVN_ERR(check_tree_conflict_repos_path(&b, "P", NULL, NULL));
+ {
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/B"}},
+ {"P", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "P"}},
+ {0}
+ };
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(check_tree_conflict_repos_path(&b, "P", "P", "P"));
+ SVN_ERR(check_tree_conflict_repos_path(&b, "A/B", "A/B", "A/B"));
err = sbox_wc_resolve(&b, "P", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict);
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+ SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
@@ -6711,10 +7236,24 @@ finite_move_update_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_move(&b, "P/Q", "Q2"));
SVN_ERR(sbox_wc_update_depth(&b, "A/B/C", 2, svn_depth_empty, FALSE));
SVN_ERR(sbox_wc_update_depth(&b, "P/Q", 2, svn_depth_empty, FALSE));
- SVN_ERR(check_tree_conflict_repos_path(&b, "P/Q", NULL, NULL));
+ {
+ conflict_info_t conflicts[] = {
+ {"A/B/C", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/B/C"}},
+ {"P/Q", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "P/Q"}},
+
+ {0}
+ };
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(check_tree_conflict_repos_path(&b, "A/B/C", "A/B/C", "A/B/C"));
+ SVN_ERR(check_tree_conflict_repos_path(&b, "P/Q", "P/Q", "P/Q"));
err = sbox_wc_resolve(&b, "P/Q", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict);
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+ SVN_ERR(sbox_wc_resolve(&b, "A/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
@@ -6767,11 +7306,23 @@ move_away_delete_update(const svn_test_opts_t *opts, apr_pool_t *pool)
{0, "", "normal", 2, ""},
{0, "A", "normal", 2, "A"},
{0, "P", "normal", 2, "P"},
- {1, "C2", "normal", 1, "A/B/C"},
+ {1, "C2", "normal", 1, "A/B/C", MOVED_HERE},
{1, "Q2", "normal", 1, "P/Q"},
+
+ {2, "A/B", "normal", 1, "A/B"},
+ {2, "A/B/C", "normal", 1, "A/B/C"},
+ {3, "A/B/C", "base-deleted", NO_COPY_FROM, "C2"},
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_edited}},
+ {"P/Q", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "P/Q"}},
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
}
return SVN_NO_ERROR;
@@ -7092,7 +7643,7 @@ movedto_opdepth(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
- SVN_ERR(svn_test__sandbox_create(&b, "moved_to_op_depth",
+ SVN_ERR(svn_test__sandbox_create(&b, "movedto_opdepth",
opts, pool));
SVN_ERR(sbox_wc_mkdir(&b, "A"));
@@ -7731,6 +8282,42 @@ move_depth_expand(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_update_depth(&b, "", 1, svn_depth_infinity, TRUE));
+ /* And now verify that there are no not-present nodes left and a
+ consistent working copy */
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, "" },
+
+ {0, "A", "normal", 1, "A" },
+ {0, "A/A", "normal", 1, "A/A" },
+ {0, "A/A/A", "normal", 1, "A/A/A" },
+ {0, "A/A/A/A", "normal", 1, "A/A/A/A" },
+ {0, "A/B", "normal", 1, "A/B" },
+ {0, "A/B/A", "normal", 1, "A/B/A" },
+ {0, "A/B/A/A", "normal", 1, "A/B/A/A" },
+
+ {1, "A", "base-deleted", NO_COPY_FROM, "C" },
+ {1, "A/A", "base-deleted", NO_COPY_FROM },
+ {1, "A/A/A", "base-deleted", NO_COPY_FROM },
+ {1, "A/B", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/A", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/A/A", "base-deleted", NO_COPY_FROM },
+ {1, "A/A/A/A", "base-deleted", NO_COPY_FROM },
+
+ {1, "C", "normal", 1, "A", MOVED_HERE },
+ {1, "C/A", "normal", 1, "A/A", MOVED_HERE },
+ {1, "C/B", "not-present", 0, "A/B", MOVED_HERE},
+
+ {2, "C/B", "normal", 1, "A/A" },
+
+ {3, "C/A/A", "normal", NO_COPY_FROM },
+ {3, "C/B/A", "normal", NO_COPY_FROM },
+
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
/* This used to cause a segfault. Then it asserted in a different place */
SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
@@ -7762,10 +8349,6 @@ move_depth_expand(const svn_test_opts_t *opts, apr_pool_t *pool)
{1, "C/A", "normal", 1, "A/A", MOVED_HERE },
{1, "C/A/A", "normal", 1, "A/A/A", MOVED_HERE },
{1, "C/A/A/A", "normal", 1, "A/A/A/A", MOVED_HERE },
-
- {3, "C/A/A", "normal", NO_COPY_FROM },
- {3, "C/A/A/A", "base-deleted", NO_COPY_FROM },
-
{1, "C/B", "normal", 1, "A/B", MOVED_HERE },
{1, "C/B/A", "normal", 1, "A/B/A", MOVED_HERE },
{1, "C/B/A/A", "normal", 1, "A/B/A/A", MOVED_HERE },
@@ -7774,6 +8357,8 @@ move_depth_expand(const svn_test_opts_t *opts, apr_pool_t *pool)
{2, "C/B/A", "base-deleted", NO_COPY_FROM },
{2, "C/B/A/A", "base-deleted", NO_COPY_FROM },
+ {3, "C/A/A", "normal", NO_COPY_FROM },
+ {3, "C/A/A/A", "base-deleted", NO_COPY_FROM },
{3, "C/B/A", "normal", NO_COPY_FROM },
{0}
@@ -7878,7 +8463,15 @@ move_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
{0}
};
+ conflict_info_t conflicts[] = {
+ {"A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/A"}},
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ { 0 },
+ };
SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
}
@@ -7909,9 +8502,21 @@ move_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
/* Still conflicted */
{1, "D", "normal", 1, "A/B/A/D", MOVED_HERE },
+ {4, "A/B/A/C", "normal", 1, "A/A/A/C"},
+
+
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"A/B/A/C", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_edited}},
{0}
};
+
SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
}
/* ### TODO: Resolve via which specific target? */
@@ -7921,7 +8526,7 @@ move_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
{
nodes_row_t nodes[] = {
- {1, "D", "normal", 2, "A/B/A/D", MOVED_HERE },
+ {1, "D", "normal", 1, "A/B/A/D", MOVED_HERE },
{0}
};
@@ -7941,7 +8546,7 @@ move_delete_file_externals(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
- sbox_file_write(&b, "f", "New file");
+ SVN_ERR(sbox_file_write(&b, "f", "New file"));
SVN_ERR(sbox_wc_add(&b, "f"));
SVN_ERR(sbox_wc_propset(&b, "svn:externals", "^/f B/P/g", "A"));
SVN_ERR(sbox_wc_propset(&b, "svn:externals", "^/f Q/g\n^/f g", "A/B"));
@@ -8158,6 +8763,128 @@ update_with_tree_conflict(const svn_test_opts_t *opts, apr_pool_t *pool)
}
static svn_error_t *
+move_update_parent_replace(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "move_update_parent_replace", opts,
+ pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_delete(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_move(&b, "A/B/C", "A/C"));
+
+ /* Update breaks the move and leaves a conflict. */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+
+ {2, "A/C", "normal", 1, "A/B/C", MOVED_HERE},
+
+ {2, "A/B", "normal", 1, "A/B"},
+ {2, "A/B/C", "normal", 1, "A/B/C", FALSE},
+
+ {3, "A/B/C", "base-deleted", NO_COPY_FROM, "A/C"},
+
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"A/B", FALSE, FALSE, {svn_wc_conflict_action_replace,
+ svn_wc_conflict_reason_edited}},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_depth_infinity,
+ svn_wc_conflict_choose_merged));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {2, "A/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {2, "A/B", "normal", 1, "A/B"},
+ {2, "A/B/C", "normal", 1, "A/B/C", FALSE},
+ {3, "A/B/C", "base-deleted", NO_COPY_FROM, "A/C"},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+copy_mixed_rev_mods(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "copy_mixed_rev_mods", opts,
+ pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_update(&b, "A/B", 2));
+ SVN_ERR(sbox_wc_delete(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {2, "A/B", "normal", NO_COPY_FROM},
+ {2, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_copy(&b, "A", "X"));
+ {
+ nodes_row_t nodes[] = {
+ {1, "X", "normal", 1, "A"},
+ {1, "X/B", "not-present", 2, "A/B"},
+ {2, "X/B", "normal", NO_COPY_FROM},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "X", nodes));
+ }
+
+ SVN_ERR(sbox_wc_commit(&b, "X"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "X", "normal", 3, "X"},
+ {0, "X/B", "normal", 3, "X/B"},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "X", nodes));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
move_child_to_parent_revert(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
@@ -8493,61 +9220,6 @@ move_revert_intermediate(const svn_test_opts_t *opts, apr_pool_t *pool)
}
static svn_error_t *
-copy_mixed_rev_mods(const svn_test_opts_t *opts, apr_pool_t *pool)
-{
- svn_test__sandbox_t b;
-
- SVN_ERR(svn_test__sandbox_create(&b, "copy_mixed_rev_mods", opts,
- pool));
-
- SVN_ERR(sbox_wc_mkdir(&b, "A"));
- SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
- SVN_ERR(sbox_wc_commit(&b, ""));
- SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
- SVN_ERR(sbox_wc_commit(&b, ""));
- SVN_ERR(sbox_wc_update(&b, "", 1));
- SVN_ERR(sbox_wc_update(&b, "A/B", 2));
- SVN_ERR(sbox_wc_delete(&b, "A/B"));
- SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
-
- {
- nodes_row_t nodes[] = {
- {0, "", "normal", 1, ""},
- {0, "A", "normal", 1, "A"},
- {0, "A/B", "normal", 2, "A/B"},
- {0, "A/B/C", "normal", 2, "A/B/C"},
- {2, "A/B", "normal", NO_COPY_FROM},
- {2, "A/B/C", "base-deleted", NO_COPY_FROM},
- {0}
- };
- SVN_ERR(check_db_rows(&b, "", nodes));
- }
-
- SVN_ERR(sbox_wc_copy(&b, "A", "X"));
- {
- nodes_row_t nodes[] = {
- {1, "X", "normal", 1, "A"},
- {1, "X/B", "not-present", 2, "A/B"},
- {2, "X/B", "normal", NO_COPY_FROM},
- {0}
- };
- SVN_ERR(check_db_rows(&b, "X", nodes));
- }
-
- SVN_ERR(sbox_wc_commit(&b, "X"));
- {
- nodes_row_t nodes[] = {
- {0, "X", "normal", 3, "X"},
- {0, "X/B", "normal", 3, "X/B"},
- {0}
- };
- SVN_ERR(check_db_rows(&b, "X", nodes));
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
move_replace_ancestor_with_child(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
@@ -8650,15 +9322,15 @@ move_twice_within_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
nodes_row_t nodes[] = {
{ 0, "", "normal", 1, "" },
-
+
{ 0, "A", "normal", 1, "A" },
{ 0, "A/A", "normal", 1, "A/A" },
{ 0, "A/A/A", "normal", 1, "A/A/A" },
-
+
{ 1, "A", "base-deleted", NO_COPY_FROM, "B/A" },
{ 1, "A/A", "base-deleted", NO_COPY_FROM },
{ 1, "A/A/A", "base-deleted", NO_COPY_FROM },
-
+
{ 1, "AA", "normal", 1, "A/A/A", MOVED_HERE },
{ 1, "B", "normal", NO_COPY_FROM },
@@ -8703,73 +9375,1160 @@ move_twice_within_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* Helper function for 4 move4 tests */
static svn_error_t *
-repo_wc_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
+init_move4(svn_test__sandbox_t *sandbox,
+ const char *test_name,
+ const svn_test_opts_t *opts,
+ svn_boolean_t move_away,
+ apr_pool_t *pool)
+{
+ SVN_ERR(svn_test__sandbox_create(sandbox, test_name, opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(sandbox, "A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "A/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "A/A/A/A"));
+
+ SVN_ERR(sbox_wc_mkdir(sandbox, "B"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "B/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "B/A/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "B/A/A/A"));
+
+ SVN_ERR(sbox_wc_mkdir(sandbox, "C"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "C/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "C/A/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "C/A/A/A"));
+
+ SVN_ERR(sbox_wc_mkdir(sandbox, "D"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "D/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "D/A/A"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "D/A/A/A"));
+
+ SVN_ERR(sbox_wc_commit(sandbox, "")); /* r1 */
+
+ if (strstr(test_name, "_edit_"))
+ {
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "A/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "B/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "C/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "D/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "A/A/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "B/A/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "C/A/A/A"));
+ SVN_ERR(sbox_wc_propset(sandbox, "key", "value", "D/A/A/A"));
+ }
+ else if (strstr(test_name, "_delete_"))
+ {
+ SVN_ERR(sbox_wc_delete(sandbox, "A/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "B/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "C/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "D/A/A/A"));
+ }
+ else if (strstr(test_name, "_add_"))
+ {
+ SVN_ERR(sbox_wc_mkdir(sandbox, "A/A/A/NEW"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "B/A/A/NEW"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "C/A/A/NEW"));
+ SVN_ERR(sbox_wc_mkdir(sandbox, "D/A/A/NEW"));
+ }
+ else if (strstr(test_name, "_replace_"))
+ {
+ SVN_ERR(sbox_wc_delete(sandbox, "A/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "B/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "C/A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "D/A/A/A"));
+ SVN_ERR(sbox_file_write(sandbox, "A/A/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "B/A/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "C/A/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "D/A/A/A", "A"));
+ SVN_ERR(sbox_wc_add(sandbox, "A/A/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "B/A/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "C/A/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "D/A/A/A"));
+ }
+ else if (strstr(test_name, "_delself_"))
+ {
+ SVN_ERR(sbox_wc_delete(sandbox, "A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "B/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "C/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "D/A/A"));
+ }
+ else if (strstr(test_name, "_replaceself_"))
+ {
+ SVN_ERR(sbox_wc_delete(sandbox, "A/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "B/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "C/A/A"));
+ SVN_ERR(sbox_wc_delete(sandbox, "D/A/A"));
+ SVN_ERR(sbox_file_write(sandbox, "A/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "B/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "C/A/A", "A"));
+ SVN_ERR(sbox_file_write(sandbox, "D/A/A", "A"));
+ SVN_ERR(sbox_wc_add(sandbox, "A/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "B/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "C/A/A"));
+ SVN_ERR(sbox_wc_add(sandbox, "D/A/A"));
+ }
+
+ SVN_ERR(sbox_wc_commit(sandbox, ""));
+ SVN_ERR(sbox_wc_update(sandbox, "", 1));
+
+ SVN_ERR(sbox_wc_move(sandbox, "A/A/A", "AAA_1"));
+
+ if (move_away)
+ SVN_ERR(sbox_wc_move(sandbox, "A", "A_moved"));
+ else
+ SVN_ERR(sbox_wc_delete(sandbox, "A"));
+
+ SVN_ERR(sbox_wc_move(sandbox, "B", "A"));
+
+ SVN_ERR(sbox_wc_move(sandbox, "A/A/A", "AAA_2"));
+
+ if (move_away)
+ SVN_ERR(sbox_wc_move(sandbox, "A/A", "BA_moved"));
+ else
+ SVN_ERR(sbox_wc_delete(sandbox, "A/A"));
+
+ SVN_ERR(sbox_wc_move(sandbox, "C/A", "A/A"));
+
+ SVN_ERR(sbox_wc_move(sandbox, "A/A/A", "AAA_3"));
+
+ SVN_ERR(sbox_wc_move(sandbox, "D/A/A", "A/A/A"));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_edit_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
- const char *repos_dir;
- const char *new_repos_dir;
- const char *new_repos_url;
- SVN_ERR(svn_test__sandbox_create(&b, "repo_wc_copy",
- opts, pool));
- SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+ SVN_ERR(init_move4(&b, "del4_update_edit_AAA", opts, FALSE, pool));
- SVN_ERR(sbox_wc_copy_url(&b,
- svn_path_url_add_component2(b.repos_url, "A/B",
- pool),
- -1, "AA"));
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "A/A/A", "normal", 1, "A/A/A" },
+ { 1, "A/A/A", "normal", 1, "B/A/A", FALSE, "AAA_1", TRUE },
+ { 2, "A/A/A", "normal", 1, "C/A/A", FALSE, "AAA_2", TRUE },
+ { 3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3", TRUE },
+
+ { 0, "A/A/A/A", "normal", 1, "A/A/A/A" },
+ { 1, "A/A/A/A", "normal", 1, "B/A/A/A", FALSE, NULL, TRUE },
+ { 2, "A/A/A/A", "normal", 1, "C/A/A/A", FALSE, NULL, TRUE },
+ { 3, "A/A/A/A", "normal", 1, "D/A/A/A", FALSE, NULL, TRUE },
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "A/A/A", nodes));
+ }
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "A/A/A", "normal", 2, "A/A/A", NOT_MOVED, "key"},
+ {0, "A/A/A/A", "normal", 2, "A/A/A/A", NOT_MOVED, "key"},
+ {0, "B", "normal", 2, "B"},
+ {0, "B/A", "normal", 2, "B/A"},
+ {0, "B/A/A", "normal", 2, "B/A/A", NOT_MOVED, "key"},
+ {0, "B/A/A/A", "normal", 2, "B/A/A/A", NOT_MOVED, "key"},
+ {0, "C", "normal", 2, "C"},
+ {0, "C/A", "normal", 2, "C/A"},
+ {0, "C/A/A", "normal", 2, "C/A/A", NOT_MOVED, "key"},
+ {0, "C/A/A/A", "normal", 2, "C/A/A/A", NOT_MOVED, "key"},
+ {0, "D", "normal", 2, "D"},
+ {0, "D/A", "normal", 2, "D/A"},
+ {0, "D/A/A", "normal", 2, "D/A/A", NOT_MOVED, "key"},
+ {0, "D/A/A/A", "normal", 2, "D/A/A/A", NOT_MOVED, "key"},
+
+ {1, "A", "normal", 2, "B", MOVED_HERE},
+ {1, "A/A", "normal", 2, "B/A", MOVED_HERE},
+ {1, "A/A/A", "normal", 2, "B/A/A", FALSE, "AAA_1", TRUE, "key"},
+ {1, "A/A/A/A", "normal", 2, "B/A/A/A", FALSE, NULL, TRUE, "key"},
+ {1, "AAA_1", "normal", 2, "A/A/A", MOVED_HERE, "key"},
+ {1, "AAA_1/A", "normal", 2, "A/A/A/A", MOVED_HERE, "key"},
+ {1, "AAA_2", "normal", 2, "B/A/A", MOVED_HERE, "key"},
+ {1, "AAA_2/A", "normal", 2, "B/A/A/A", MOVED_HERE, "key"},
+ {1, "AAA_3", "normal", 2, "C/A/A", MOVED_HERE, "key"},
+ {1, "AAA_3/A", "normal", 2, "C/A/A/A", MOVED_HERE, "key"},
+ {1, "B", "base-deleted", NO_COPY_FROM, "A"},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ {2, "A/A", "normal", 2, "C/A", MOVED_HERE},
+ {2, "A/A/A", "normal", 2, "C/A/A", FALSE, "AAA_2", TRUE, "key"},
+ {2, "A/A/A/A", "normal", 2, "C/A/A/A", FALSE, NULL, TRUE, "key"},
+ {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"},
+ {2, "C/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ {3, "A/A/A", "normal", 2, "D/A/A", FALSE, "AAA_3", TRUE, "key"},
+ {3, "A/A/A/A", "normal", 2, "D/A/A/A", FALSE, NULL, TRUE, "key"},
+ {3, "D/A/A", "base-deleted", NO_COPY_FROM, "A/A/A"},
+ {3, "D/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ }
+
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/A", "normal", 1, "A/A"},
+ {0, "A/A/A", "normal", 1, "A/A/A", NOT_MOVED},
+ {0, "A/A/A/A", "normal", 1, "A/A/A/A", NOT_MOVED},
+ {0, "B", "normal", 1, "B"},
+ {0, "B/A", "normal", 1, "B/A"},
+ {0, "B/A/A", "normal", 1, "B/A/A", NOT_MOVED},
+ {0, "B/A/A/A", "normal", 1, "B/A/A/A", NOT_MOVED},
+ {0, "C", "normal", 1, "C"},
+ {0, "C/A", "normal", 1, "C/A"},
+ {0, "C/A/A", "normal", 1, "C/A/A", NOT_MOVED},
+ {0, "C/A/A/A", "normal", 1, "C/A/A/A", NOT_MOVED},
+ {0, "D", "normal", 1, "D"},
+ {0, "D/A", "normal", 1, "D/A"},
+ {0, "D/A/A", "normal", 1, "D/A/A", NOT_MOVED},
+ {0, "D/A/A/A", "normal", 1, "D/A/A/A", NOT_MOVED},
+
+ {1, "A", "normal", 1, "B", MOVED_HERE},
+ {1, "A/A", "normal", 1, "B/A", MOVED_HERE},
+ {1, "A/A/A", "normal", 1, "B/A/A", FALSE, "AAA_1", TRUE},
+ {1, "A/A/A/A", "normal", 1, "B/A/A/A", FALSE, NULL, TRUE},
+ {1, "AAA_1", "normal", 1, "A/A/A", MOVED_HERE},
+ {1, "AAA_1/A", "normal", 1, "A/A/A/A", MOVED_HERE},
+ {1, "AAA_2", "normal", 1, "B/A/A", MOVED_HERE},
+ {1, "AAA_2/A", "normal", 1, "B/A/A/A", MOVED_HERE},
+ {1, "AAA_3", "normal", 1, "C/A/A", MOVED_HERE},
+ {1, "AAA_3/A", "normal", 1, "C/A/A/A", MOVED_HERE},
+ {1, "B", "base-deleted", NO_COPY_FROM, "A"},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ {2, "A/A", "normal", 1, "C/A", MOVED_HERE},
+ {2, "A/A/A", "normal", 1, "C/A/A", FALSE, "AAA_2", TRUE},
+ {2, "A/A/A/A", "normal", 1, "C/A/A/A", FALSE, NULL, TRUE},
+ {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"},
+ {2, "C/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ {3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3", TRUE},
+ {3, "A/A/A/A", "normal", 1, "D/A/A/A", FALSE, NULL, TRUE},
+ {3, "D/A/A", "base-deleted", NO_COPY_FROM, "A/A/A"},
+ {3, "D/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ }
+
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0},
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ /* This breaks the move A/A/A -> AAA_1 */
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty, svn_wc_conflict_choose_merged));
+ /* This breaks the move B -> A */
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty, svn_wc_conflict_choose_merged));
+ /* This breaks the move C/A/A -> A/A */
+ SVN_ERR(sbox_wc_resolve(&b, "C/A", svn_depth_empty, svn_wc_conflict_choose_merged));
+ /* This breaks the move from D/A/A -> A/A/A */
+ SVN_ERR(sbox_wc_resolve(&b, "D/A/A", svn_depth_empty, svn_wc_conflict_choose_merged));
{
nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "A/A/A", "normal", 2, "A/A/A", NOT_MOVED, "key"},
+ {0, "A/A/A/A", "normal", 2, "A/A/A/A", NOT_MOVED, "key"},
+ {0, "B", "normal", 2, "B"},
+ {0, "B/A", "normal", 2, "B/A"},
+ {0, "B/A/A", "normal", 2, "B/A/A", NOT_MOVED, "key"},
+ {0, "B/A/A/A", "normal", 2, "B/A/A/A", NOT_MOVED, "key"},
+ {0, "C", "normal", 2, "C"},
+ {0, "C/A", "normal", 2, "C/A"},
+ {0, "C/A/A", "normal", 2, "C/A/A", NOT_MOVED, "key"},
+ {0, "C/A/A/A", "normal", 2, "C/A/A/A", NOT_MOVED, "key"},
+ {0, "D", "normal", 2, "D"},
+ {0, "D/A", "normal", 2, "D/A"},
+ {0, "D/A/A", "normal", 2, "D/A/A", NOT_MOVED, "key"},
+ {0, "D/A/A/A", "normal", 2, "D/A/A/A", NOT_MOVED, "key"},
+ {1, "A", "normal", 1, "B"},
+ {1, "A/A", "normal", 1, "B/A"},
+ {1, "A/A/A", "normal", 1, "B/A/A", FALSE},
+ {1, "A/A/A/A", "normal", 1, "B/A/A/A"},
+ {1, "AAA_1", "normal", 1, "A/A/A"},
+ {1, "AAA_1/A", "normal", 1, "A/A/A/A"},
+ {1, "AAA_2", "normal", 1, "B/A/A", MOVED_HERE},
+ {1, "AAA_2/A", "normal", 1, "B/A/A/A", MOVED_HERE},
+ {1, "AAA_3", "normal", 1, "C/A/A", MOVED_HERE},
+ {1, "AAA_3/A", "normal", 1, "C/A/A/A", MOVED_HERE},
+ {1, "B", "base-deleted", NO_COPY_FROM},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "A/A", "normal", 1, "C/A"},
+ {2, "A/A/A", "normal", 1, "C/A/A", FALSE, "AAA_2"},
+ {2, "A/A/A/A", "normal", 1, "C/A/A/A"},
+ {2, "C/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A/A/A", "base-deleted", NO_COPY_FROM},
+ {3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3"},
+ {3, "A/A/A/A", "normal", 1, "D/A/A/A"},
+ {3, "D/A/A", "base-deleted", NO_COPY_FROM},
+ {3, "D/A/A/A", "base-deleted", NO_COPY_FROM},
- {1, "AA/lambda", "normal", 1, "A/B/lambda"},
- {1, "AA", "normal", 1, "A/B"},
- {1, "AA/E/beta", "normal", 1, "A/B/E/beta"},
- {1, "AA/E/alpha", "normal", 1, "A/B/E/alpha"},
- {1, "AA/F", "normal", 1, "A/B/F"},
- {1, "AA/E", "normal", 1, "A/B/E"},
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_delete_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "del4_update_delete_AAA", opts, FALSE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_add_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "del4_update_add_AAA", opts, FALSE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit, svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_replace_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "del4_update_replace_AAA", opts, FALSE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_delself_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "del4_update_delself_AAA", opts, FALSE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+
+ /* Resolve a few conflicts manually */
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "B", "normal", 2, "B"},
+ {0, "B/A", "normal", 2, "B/A"},
+ {0, "C", "normal", 2, "C"},
+ {0, "C/A", "normal", 2, "C/A"},
+ {0, "D", "normal", 2, "D"},
+ {0, "D/A", "normal", 2, "D/A"},
+ {1, "A", "normal", 2, "B", MOVED_HERE},
+ {1, "A/A", "normal", 2, "B/A", MOVED_HERE},
+ {1, "AAA_1", "normal", 1, "A/A/A"},
+ {1, "AAA_1/A", "normal", 1, "A/A/A/A"},
+ {1, "AAA_2", "normal", 1, "B/A/A"},
+ {1, "AAA_2/A", "normal", 1, "B/A/A/A"},
+ {1, "AAA_3", "normal", 1, "C/A/A"},
+ {1, "AAA_3/A", "normal", 1, "C/A/A/A"},
+ {1, "B", "base-deleted", NO_COPY_FROM, "A"},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {2, "A/A", "normal", 2, "C/A", MOVED_HERE},
+ {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"},
+ {3, "A/A/A", "normal", 1, "D/A/A"},
+ {3, "A/A/A/A", "normal", 1, "D/A/A/A"},
{ 0 },
};
- SVN_ERR(check_db_rows(&b, "AA", nodes));
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
}
+ {
+ conflict_info_t conflicts[] = {
+ /* Not resolved yet */
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
- SVN_ERR(svn_uri_get_dirent_from_file_url(&repos_dir, b.repos_url,
- pool));
- new_repos_dir = apr_pstrcat(pool, repos_dir, "-2", SVN_VA_NULL);
- new_repos_url = apr_pstrcat(pool, b.repos_url, "-2", SVN_VA_NULL);
+ /* New */
+ {"A/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_deleted}},
+ {"A/A/A", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "A/A/A"}},
- svn_test_add_dir_cleanup(new_repos_dir);
+ {0}
+ };
- SVN_ERR(svn_io_remove_dir2(new_repos_dir, TRUE, NULL, NULL, pool));
- SVN_ERR(svn_io_copy_dir_recursively(repos_dir,
- svn_dirent_dirname(new_repos_dir, pool),
- svn_dirent_basename(new_repos_dir, pool),
- FALSE, NULL, NULL, pool));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
- SVN_ERR(sbox_wc_relocate(&b, new_repos_url));
+ /* These can only be resolved to merged, as the merge is already broken
+ (because the move source is gone): incoming delete on moved_away */
+ SVN_ERR(sbox_wc_resolve(&b, "D/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "A/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
- /* This produced an invalid copy in Subversion <= 1.8.8.
- Status would show all descendants as incomplete */
- SVN_ERR(sbox_wc_copy_url(&b,
- svn_path_url_add_component2(b.repos_url, "A/B",
- pool),
- -1, "BB"));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ {
+ conflict_info_t conflicts[] = {
+ {"A/A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_deleted}},
+ {"A/A/A", FALSE, FALSE, { svn_wc_conflict_action_add,
+ svn_wc_conflict_reason_added}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "A/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity,
+ svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+del4_update_replaceself_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "del4_update_replaceself_AAA", opts, FALSE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+move4_update_edit_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_edit_AAA", opts, TRUE, pool));
+
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "A/A/A", "normal", 1, "A/A/A" },
+ { 1, "A/A/A", "normal", 1, "B/A/A", FALSE, NULL /*"AAA_1"*/, TRUE },
+ { 2, "A/A/A", "normal", 1, "C/A/A", FALSE, NULL /*"AAA_2"*/, TRUE },
+ { 3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3", TRUE },
+
+ { 0, "A/A/A/A", "normal", 1, "A/A/A/A" },
+ { 1, "A/A/A/A", "normal", 1, "B/A/A/A", FALSE, NULL, TRUE },
+ { 2, "A/A/A/A", "normal", 1, "C/A/A/A", FALSE, NULL, TRUE },
+ { 3, "A/A/A/A", "normal", 1, "D/A/A/A", FALSE, NULL, TRUE },
+
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "A/A/A", nodes));
+ }
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "A/A/A", "normal", 2, "A/A/A", NOT_MOVED, "key" },
+ { 1, "A/A/A", "normal", 2, "B/A/A", FALSE, NULL /*"AAA_1"*/, TRUE, "key" },
+ { 2, "A/A/A", "normal", 2, "C/A/A", FALSE, NULL /*"AAA_2"*/, TRUE, "key" },
+ { 3, "A/A/A", "normal", 2, "D/A/A", FALSE, "AAA_3", TRUE, "key" },
+
+ { 0, "A/A/A/A", "normal", 2, "A/A/A/A", NOT_MOVED, "key" },
+ { 1, "A/A/A/A", "normal", 2, "B/A/A/A", FALSE, NULL, TRUE, "key" },
+ { 2, "A/A/A/A", "normal", 2, "C/A/A/A", FALSE, NULL, TRUE, "key" },
+ { 3, "A/A/A/A", "normal", 2, "D/A/A/A", FALSE, NULL, TRUE, "key" },
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "A/A/A", nodes));
+ }
+
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "A/A/A", "normal", 2, "A/A/A", NOT_MOVED, "key" },
+ { 1, "A/A/A", "normal", 1, "B/A/A" },
+ { 2, "A/A/A", "normal", 1, "C/A/A" },
+ { 3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3"},
+
+ { 0, "A/A/A/A", "normal", 2, "A/A/A/A", NOT_MOVED, "key" },
+ { 1, "A/A/A/A", "normal", 1, "B/A/A/A" },
+ { 2, "A/A/A/A", "normal", 1, "C/A/A/A" },
+ { 3, "A/A/A/A", "normal", 1, "D/A/A/A" },
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "A/A/A", nodes));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move4_update_delete_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_delete_AAA", opts, TRUE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move4_update_add_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_add_AAA", opts, TRUE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move4_update_replace_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_replace_AAA", opts, TRUE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move4_update_delself_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_delself_AAA", opts, TRUE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+
+ {
+ nodes_row_t nodes[] = {
+
+ {1, "A_moved", "normal", 1, "A", MOVED_HERE},
+ {1, "A_moved/A", "normal", 1, "A/A", MOVED_HERE},
+ {1, "A_moved/A/A", "normal", 1, "A/A/A", MOVED_HERE},
+ {3, "A_moved/A/A", "base-deleted", NO_COPY_FROM, "AAA_1"},
+ {1, "A_moved/A/A/A", "normal", 1, "A/A/A/A", MOVED_HERE},
+ {3, "A_moved/A/A/A", "base-deleted", NO_COPY_FROM},
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "A_moved", nodes));
+ }
+
+ /* Resolve a few conflicts manually */
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/A", "normal", 2, "A/A"},
+ {0, "B", "normal", 2, "B"},
+ {0, "B/A", "normal", 2, "B/A"},
+ {0, "C", "normal", 2, "C"},
+ {0, "C/A", "normal", 2, "C/A"},
+ {0, "D", "normal", 2, "D"},
+ {0, "D/A", "normal", 2, "D/A"},
+ {1, "A", "normal", 1, "B", FALSE, "A_moved", TRUE},
+ {1, "A/A", "normal", 1, "B/A", MOVED_HERE},
+ {1, "A/A/A", "normal", 1, "B/A/A", MOVED_HERE},
+ {1, "A/A/A/A", "normal", 1, "B/A/A/A", MOVED_HERE},
+ {1, "AAA_1", "normal", 1, "A/A/A"},
+ {1, "AAA_1/A", "normal", 1, "A/A/A/A"},
+ {1, "AAA_2", "normal", 1, "B/A/A", MOVED_HERE},
+ {1, "AAA_2/A", "normal", 1, "B/A/A/A", MOVED_HERE},
+ {1, "AAA_3", "normal", 1, "C/A/A", MOVED_HERE},
+ {1, "AAA_3/A", "normal", 1, "C/A/A/A", MOVED_HERE},
+ {1, "A_moved", "normal", 2, "A", MOVED_HERE},
+ {1, "A_moved/A", "normal", 2, "A/A", MOVED_HERE},
+ {1, "B", "base-deleted", NO_COPY_FROM, "A"},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {1, "BA_moved", "normal", 1, "B/A", MOVED_HERE},
+ {1, "BA_moved/A", "normal", 1, "B/A/A", MOVED_HERE},
+ {1, "BA_moved/A/A", "normal", 1, "B/A/A/A", MOVED_HERE},
+ {2, "A/A", "normal", 1, "C/A", FALSE, "BA_moved", TRUE},
+ {2, "A/A/A", "normal", 1, "C/A/A", MOVED_HERE},
+ {2, "A/A/A/A", "normal", 1, "C/A/A/A", MOVED_HERE},
+ {2, "BA_moved/A", "base-deleted", NO_COPY_FROM, "AAA_2"},
+ {2, "BA_moved/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"},
+ {3, "A/A/A", "normal", 1, "D/A/A", FALSE, "AAA_3"},
+ {3, "A/A/A/A", "normal", 1, "D/A/A/A"},
+
+ { 0 },
+ };
+ conflict_info_t conflicts[] = {
+ {"A_moved/A/A", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "A_moved/A/A"}},
+ {"B", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {"D/A/A", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "D/A/A"}},
+
+ { 0 },
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+
+ /* ### These can currently only be resolved to merged ???? */
+ SVN_ERR(sbox_wc_resolve(&b, "D/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "A/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "A_moved/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "A/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "BA_moved/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/A", "normal", 1, "A/A"},
+ {0, "A/A/A", "normal", 1, "A/A/A"},
+ {0, "A/A/A/A", "normal", 1, "A/A/A/A"},
+ {0, "B", "normal", 1, "B"},
+ {0, "B/A", "normal", 1, "B/A"},
+ {0, "B/A/A", "normal", 1, "B/A/A"},
+ {0, "B/A/A/A", "normal", 1, "B/A/A/A"},
+ {0, "C", "normal", 1, "C"},
+ {0, "C/A", "normal", 1, "C/A"},
+ {0, "C/A/A", "normal", 1, "C/A/A"},
+ {0, "C/A/A/A", "normal", 1, "C/A/A/A"},
+ {0, "D", "normal", 1, "D"},
+ {0, "D/A", "normal", 1, "D/A"},
+ {0, "D/A/A", "normal", 1, "D/A/A"},
+ {0, "D/A/A/A", "normal", 1, "D/A/A/A"},
+ {1, "A", "normal", 2, "B", FALSE, "A_moved", TRUE},
+ {1, "A/A", "normal", 2, "B/A", MOVED_HERE},
+ {1, "A/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "A/A/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "A_moved", "normal", 2, "A", MOVED_HERE},
+ {1, "A_moved/A", "normal", 2, "A/A", MOVED_HERE},
+ {1, "AAA_1", "normal", 1, "A/A/A"},
+ {1, "AAA_1/A", "normal", 1, "A/A/A/A"},
+ {1, "AAA_2", "normal", 1, "B/A/A"},
+ {1, "AAA_2/A", "normal", 1, "B/A/A/A"},
+ {1, "AAA_3", "normal", 1, "C/A/A"},
+ {1, "AAA_3/A", "normal", 1, "C/A/A/A"},
+ {1, "B", "base-deleted", NO_COPY_FROM, "A"},
+ {1, "B/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "B/A/A/A", "base-deleted", NO_COPY_FROM},
+ {1, "BA_moved", "normal", 2, "B/A", MOVED_HERE},
+ {2, "A/A", "normal", 2, "C/A", FALSE, "BA_moved", TRUE},
+ {2, "C/A", "base-deleted", NO_COPY_FROM, "A/A"},
+ {2, "C/A/A", "base-deleted", NO_COPY_FROM},
+ {2, "C/A/A/A", "base-deleted", NO_COPY_FROM},
+ {3, "A/A/A", "normal", 1, "D/A/A"},
+ {3, "A/A/A/A", "normal", 1, "D/A/A/A"},
+
+ { 0 },
+ };
+
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_replaced}},
+ {"B", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B"}},
+ {"C/A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "C/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ {
+ conflict_info_t conflicts[] = {
+ {"A/A", FALSE, FALSE, { svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A/A"}},
+ {"A/A/A", FALSE, FALSE, { svn_wc_conflict_action_add,
+ svn_wc_conflict_reason_added}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+ SVN_ERR(sbox_wc_resolve(&b, "A/A/A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move4_update_replaceself_AAA(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(init_move4(&b, "move4_update_replaceself_AAA", opts, TRUE, pool));
+
+ /* Update and resolve via mine strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Go back to start position */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_mine_conflict));
+ /* Update and resolve via their strategy */
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity, svn_wc_conflict_choose_merged));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+simple_move_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "simple_move_bump", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+
+ SVN_ERR(sbox_wc_propset(&b, "old_A", "val", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "old_B", "val", "A/B"));
+
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ SVN_ERR(sbox_wc_propset(&b, "new_A", "val", "A"));
+ SVN_ERR(sbox_wc_propset(&b, "new_B", "val", "A/B"));
+
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ SVN_ERR(sbox_wc_move(&b, "A/B", "A/B_mv"));
+ SVN_ERR(sbox_wc_move(&b, "A", "A_mv"));
{
nodes_row_t nodes[] = {
- {1, "BB/lambda", "normal", 1, "A/B/lambda"},
- {1, "BB", "normal", 1, "A/B"},
- {1, "BB/E/beta", "normal", 1, "A/B/E/beta"},
- {1, "BB/E/alpha", "normal", 1, "A/B/E/alpha"},
- {1, "BB/F", "normal", 1, "A/B/F"},
- {1, "BB/E", "normal", 1, "A/B/E"},
+ { 0, "", "normal", 1, ""},
+ { 0, "A", "normal", 1, "A", NOT_MOVED, "old_A"},
+ { 0, "A/B", "normal", 1, "A/B", NOT_MOVED, "old_B"},
+
+ { 1, "A", "base-deleted", NO_COPY_FROM, "A_mv"},
+ { 1, "A/B", "base-deleted", NO_COPY_FROM},
+
+ { 1, "A_mv", "normal", 1, "A", MOVED_HERE, "old_A" },
+ { 1, "A_mv/B", "normal", 1, "A/B", MOVED_HERE, "old_B" },
+
+ { 2, "A_mv/B", "base-deleted", NO_COPY_FROM, "A_mv/B_mv" },
+ { 2, "A_mv/B_mv", "normal", 1, "A/B", FALSE, NULL, TRUE, "old_B" },
{ 0 },
};
- SVN_ERR(check_db_rows(&b, "BB", nodes));
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+
+ /* Expect the A tree to be updated */
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "", "normal", 2, ""},
+ { 0, "A", "normal", 2, "A", NOT_MOVED, "new_A,old_A"},
+ { 0, "A/B", "normal", 2, "A/B", NOT_MOVED, "new_B,old_B"},
+
+ { 1, "A", "base-deleted", NO_COPY_FROM, "A_mv"},
+ { 1, "A/B", "base-deleted", NO_COPY_FROM},
+
+ { 1, "A_mv", "normal", 1, "A", MOVED_HERE, "old_A" },
+ { 1, "A_mv/B", "normal", 1, "A/B", MOVED_HERE, "old_B" },
+
+ { 2, "A_mv/B", "base-deleted", NO_COPY_FROM, "A_mv/B_mv" },
+ { 2, "A_mv/B_mv", "normal", 1, "A/B", FALSE, NULL, TRUE, "old_B" },
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "", "normal", 2, ""},
+ { 0, "A", "normal", 2, "A", NOT_MOVED, "new_A,old_A"},
+ { 0, "A/B", "normal", 2, "A/B", NOT_MOVED, "new_B,old_B"},
+
+ { 1, "A", "base-deleted", NO_COPY_FROM, "A_mv"},
+ { 1, "A/B", "base-deleted", NO_COPY_FROM},
+
+ { 1, "A_mv", "normal", 2, "A", MOVED_HERE, "new_A,old_A" },
+ { 1, "A_mv/B", "normal", 2, "A/B", MOVED_HERE, "new_B,old_B" },
+
+ { 2, "A_mv/B", "base-deleted", NO_COPY_FROM, "A_mv/B_mv" },
+ { 2, "A_mv/B_mv", "normal", 1, "A/B", FALSE, NULL, TRUE, "old_B" },
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "A_mv/B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+
+ { 0, "", "normal", 2, ""},
+ { 0, "A", "normal", 2, "A", NOT_MOVED, "new_A,old_A"},
+ { 0, "A/B", "normal", 2, "A/B", NOT_MOVED, "new_B,old_B"},
+
+ { 1, "A", "base-deleted", NO_COPY_FROM, "A_mv"},
+ { 1, "A/B", "base-deleted", NO_COPY_FROM},
+
+ { 1, "A_mv", "normal", 2, "A", MOVED_HERE, "new_A,old_A" },
+ { 1, "A_mv/B", "normal", 2, "A/B", MOVED_HERE, "new_B,old_B" },
+
+ { 2, "A_mv/B", "base-deleted", NO_COPY_FROM, "A_mv/B_mv" },
+ { 2, "A_mv/B_mv", "normal", 2, "A/B", FALSE, NULL, TRUE, "new_B,old_B" },
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
}
return SVN_NO_ERROR;
@@ -8826,8 +10585,35 @@ movedhere_extract_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_mkdir(&b, "Z/E2"));
SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ conflict_info_t conflicts[] = {
+ {"A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
+ {
+ conflict_info_t conflicts[] = {
+ {"Z/B1", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_deleted}},
+ {"Z/B2", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "Z/B2"}},
+ {"Z/C1", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_deleted}},
+ {"Z/C2", FALSE, FALSE, {svn_wc_conflict_action_delete,
+ svn_wc_conflict_reason_moved_away, "Z/C2"}},
+ {"Z/E2", FALSE, FALSE, {svn_wc_conflict_action_add,
+ svn_wc_conflict_reason_added}},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
SVN_ERR(sbox_wc_resolve(&b, "Z/B1", svn_depth_empty,
svn_wc_conflict_choose_mine_conflict));
SVN_ERR(sbox_wc_resolve(&b, "Z/B2", svn_depth_empty,
@@ -8838,8 +10624,10 @@ movedhere_extract_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(sbox_wc_resolve(&b, "Z/C2", svn_depth_empty,
svn_wc_conflict_choose_merged));
- SVN_ERR(sbox_wc_resolve(&b, "", svn_depth_infinity,
- svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "Z/E2", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
{
nodes_row_t nodes[] = {
@@ -8894,6 +10682,168 @@ movedhere_extract_retract(const svn_test_opts_t *opts, apr_pool_t *pool)
{ 0 },
};
SVN_ERR(check_db_rows(&b, "", nodes));
+
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+repo_wc_copy(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ const char *new_repos_dir;
+ const char *new_repos_url;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "repo_wc_copy",
+ opts, pool));
+ SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+ SVN_ERR(sbox_wc_copy_url(&b,
+ svn_path_url_add_component2(b.repos_url, "A/B",
+ pool),
+ -1, "AA"));
+
+ {
+ nodes_row_t nodes[] = {
+
+ {1, "AA/lambda", "normal", 1, "A/B/lambda"},
+ {1, "AA", "normal", 1, "A/B"},
+ {1, "AA/E/beta", "normal", 1, "A/B/E/beta"},
+ {1, "AA/E/alpha", "normal", 1, "A/B/E/alpha"},
+ {1, "AA/F", "normal", 1, "A/B/F"},
+ {1, "AA/E", "normal", 1, "A/B/E"},
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "AA", nodes));
+ }
+
+ new_repos_dir = apr_pstrcat(pool, b.repos_dir, "-2", SVN_VA_NULL);
+ new_repos_url = apr_pstrcat(pool, b.repos_url, "-2", SVN_VA_NULL);
+
+ svn_test_add_dir_cleanup(new_repos_dir);
+
+ SVN_ERR(svn_io_remove_dir2(new_repos_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_copy_dir_recursively(b.repos_dir,
+ svn_dirent_dirname(new_repos_dir, pool),
+ svn_dirent_basename(new_repos_dir, pool),
+ FALSE, NULL, NULL, pool));
+
+ SVN_ERR(sbox_wc_relocate(&b, new_repos_url));
+
+ /* This produced an invalid copy in Subversion <= 1.8.8.
+ Status would show all descendants as incomplete */
+ SVN_ERR(sbox_wc_copy_url(&b,
+ svn_path_url_add_component2(b.repos_url, "A/B",
+ pool),
+ -1, "BB"));
+
+ {
+ nodes_row_t nodes[] = {
+
+ {1, "BB/lambda", "normal", 1, "A/B/lambda"},
+ {1, "BB", "normal", 1, "A/B"},
+ {1, "BB/E/beta", "normal", 1, "A/B/E/beta"},
+ {1, "BB/E/alpha", "normal", 1, "A/B/E/alpha"},
+ {1, "BB/F", "normal", 1, "A/B/F"},
+ {1, "BB/E", "normal", 1, "A/B/E"},
+
+ { 0 },
+ };
+ SVN_ERR(check_db_rows(&b, "BB", nodes));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+break_move_in_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "break_move_in_delete", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "X"));
+ SVN_ERR(sbox_wc_mkdir(&b, "X/Y"));
+ SVN_ERR(sbox_wc_mkdir(&b, "X/Y/Z"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "key", "value", "X/Y/Z"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ SVN_ERR(sbox_wc_move(&b, "X/Y/Z", "A/Z"));
+ SVN_ERR(sbox_wc_delete(&b, "X"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "X", "normal", 1, "X"},
+ {0, "X/Y", "normal", 1, "X/Y"},
+ {0, "X/Y/Z", "normal", 1, "X/Y/Z"},
+ {1, "X", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y/Z", "base-deleted", NO_COPY_FROM, "A/Z"},
+ {2, "A/Z", "normal", 1, "X/Y/Z", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "X", "normal", 2, "X"},
+ {0, "X/Y", "normal", 2, "X/Y"},
+ {0, "X/Y/Z", "normal", 2, "X/Y/Z"},
+ {1, "X", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y/Z", "base-deleted", NO_COPY_FROM, "A/Z"},
+ {2, "A/Z", "normal", 1, "X/Y/Z", MOVED_HERE},
+ {0}
+ };
+ conflict_info_t conflicts1[] = {
+ {"X", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_deleted}},
+ {0}
+ };
+ conflict_info_t conflicts2[] = {
+ {"X/Y/Z", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "X"}},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts1));
+ SVN_ERR(sbox_wc_resolve(&b, "X", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts2));
+ }
+
+ SVN_ERR(sbox_wc_resolved(&b, "X/Y/Z"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 2, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "X", "normal", 2, "X"},
+ {0, "X/Y", "normal", 2, "X/Y"},
+ {0, "X/Y/Z", "normal", 2, "X/Y/Z"},
+ {1, "X", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y", "base-deleted", NO_COPY_FROM},
+ {1, "X/Y/Z", "base-deleted", NO_COPY_FROM},
+ {2, "A/Z", "normal", 1, "X/Y/Z"},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
}
return SVN_NO_ERROR;
@@ -9021,10 +10971,911 @@ nested_move_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+move_within_mixed_move(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "move_within_mixed_move", opts, pool));
+
+ SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+ SVN_ERR(sbox_wc_delete(&b, "iota"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ /* Make A mixed revision */
+ SVN_ERR(sbox_wc_update(&b, "A/B/E", 2));
+
+ /* Single rev moves.. ok */
+ SVN_ERR(sbox_wc_move(&b, "A/D", "A/D_mv"));
+ SVN_ERR(sbox_wc_move(&b, "A/C", "C_mv"));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 0, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "A/B/E", "normal", 2, "A/B/E"},
+ {0, "A/B/E/alpha", "normal", 2, "A/B/E/alpha"},
+ {0, "A/B/E/beta", "normal", 2, "A/B/E/beta"},
+ {0, "A/B/F", "normal", 1, "A/B/F"},
+ {0, "A/B/lambda", "normal", 1, "A/B/lambda"},
+ {0, "A/C", "normal", 1, "A/C"},
+ {0, "A/D", "normal", 1, "A/D"},
+ {0, "A/D/G", "normal", 1, "A/D/G"},
+ {0, "A/D/G/pi", "normal", 1, "A/D/G/pi"},
+ {0, "A/D/G/rho", "normal", 1, "A/D/G/rho"},
+ {0, "A/D/G/tau", "normal", 1, "A/D/G/tau"},
+ {0, "A/D/gamma", "normal", 1, "A/D/gamma"},
+ {0, "A/D/H", "normal", 1, "A/D/H"},
+ {0, "A/D/H/chi", "normal", 1, "A/D/H/chi"},
+ {0, "A/D/H/omega", "normal", 1, "A/D/H/omega"},
+ {0, "A/D/H/psi", "normal", 1, "A/D/H/psi"},
+ {0, "A/mu", "normal", 1, "A/mu"},
+ {0, "iota", "not-present", 2, "iota"},
+ {1, "C_mv", "normal", 1, "A/C", MOVED_HERE},
+ {2, "A/C", "base-deleted", NO_COPY_FROM, "C_mv"},
+ {2, "A/D", "base-deleted", NO_COPY_FROM, "A/D_mv"},
+ {2, "A/D/G", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/G/pi", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/G/rho", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/G/tau", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/gamma", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/H", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/H/chi", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/H/omega", "base-deleted", NO_COPY_FROM},
+ {2, "A/D/H/psi", "base-deleted", NO_COPY_FROM},
+ {2, "A/D_mv", "normal", 1, "A/D", MOVED_HERE},
+ {2, "A/D_mv/G", "normal", 1, "A/D/G", MOVED_HERE},
+ {2, "A/D_mv/G/pi", "normal", 1, "A/D/G/pi", MOVED_HERE},
+ {2, "A/D_mv/G/rho", "normal", 1, "A/D/G/rho", MOVED_HERE},
+ {2, "A/D_mv/G/tau", "normal", 1, "A/D/G/tau", MOVED_HERE},
+ {2, "A/D_mv/gamma", "normal", 1, "A/D/gamma", MOVED_HERE},
+ {2, "A/D_mv/H", "normal", 1, "A/D/H", MOVED_HERE},
+ {2, "A/D_mv/H/chi", "normal", 1, "A/D/H/chi", MOVED_HERE},
+ {2, "A/D_mv/H/omega", "normal", 1, "A/D/H/omega", MOVED_HERE},
+ {2, "A/D_mv/H/psi", "normal", 1, "A/D/H/psi", MOVED_HERE},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* Mixed rev move... breaks recordings "A/D" -> "A/D_mv" */
+ SVN_ERR(sbox_wc_move(&b, "A", "A_mv"));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 0, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "A/B/E", "normal", 2, "A/B/E"},
+ {0, "A/B/E/alpha", "normal", 2, "A/B/E/alpha"},
+ {0, "A/B/E/beta", "normal", 2, "A/B/E/beta"},
+ {0, "A/B/F", "normal", 1, "A/B/F"},
+ {0, "A/B/lambda", "normal", 1, "A/B/lambda"},
+ {0, "A/C", "normal", 1, "A/C"},
+ {0, "A/D", "normal", 1, "A/D"},
+ {0, "A/D/G", "normal", 1, "A/D/G"},
+ {0, "A/D/G/pi", "normal", 1, "A/D/G/pi"},
+ {0, "A/D/G/rho", "normal", 1, "A/D/G/rho"},
+ {0, "A/D/G/tau", "normal", 1, "A/D/G/tau"},
+ {0, "A/D/gamma", "normal", 1, "A/D/gamma"},
+ {0, "A/D/H", "normal", 1, "A/D/H"},
+ {0, "A/D/H/chi", "normal", 1, "A/D/H/chi"},
+ {0, "A/D/H/omega", "normal", 1, "A/D/H/omega"},
+ {0, "A/D/H/psi", "normal", 1, "A/D/H/psi"},
+ {0, "A/mu", "normal", 1, "A/mu"},
+ {0, "iota", "not-present", 2, "iota"},
+ {1, "A", "base-deleted", NO_COPY_FROM },
+ {1, "A/B", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/E", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/E/alpha", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/E/beta", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/F", "base-deleted", NO_COPY_FROM },
+ {1, "A/B/lambda", "base-deleted", NO_COPY_FROM },
+ {1, "A/C", "base-deleted", NO_COPY_FROM, "C_mv"},
+ {1, "A/D", "base-deleted", NO_COPY_FROM, "A/D_mv" },
+ {1, "A/D/G", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/G/pi", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/G/rho", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/G/tau", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/gamma", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/H", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/H/chi", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/H/omega", "base-deleted", NO_COPY_FROM },
+ {1, "A/D/H/psi", "base-deleted", NO_COPY_FROM },
+ {1, "A/mu", "base-deleted", NO_COPY_FROM },
+ {1, "A_mv", "normal", 1, "A"},
+ {1, "A_mv/B", "normal", 1, "A/B"},
+ {1, "A_mv/B/E", "not-present", 2, "A/B/E"},
+ {1, "A_mv/B/F", "normal", 1, "A/B/F"},
+ {1, "A_mv/B/lambda", "normal", 1, "A/B/lambda"},
+ {1, "A_mv/C", "normal", 1, "A/C"},
+ {1, "A_mv/D", "normal", 1, "A/D"},
+ {1, "A_mv/D/G", "normal", 1, "A/D/G"},
+ {1, "A_mv/D/G/pi", "normal", 1, "A/D/G/pi"},
+ {1, "A_mv/D/G/rho", "normal", 1, "A/D/G/rho"},
+ {1, "A_mv/D/G/tau", "normal", 1, "A/D/G/tau"},
+ {1, "A_mv/D/gamma", "normal", 1, "A/D/gamma"},
+ {1, "A_mv/D/H", "normal", 1, "A/D/H"},
+ {1, "A_mv/D/H/chi", "normal", 1, "A/D/H/chi"},
+ {1, "A_mv/D/H/omega", "normal", 1, "A/D/H/omega"},
+ {1, "A_mv/D/H/psi", "normal", 1, "A/D/H/psi"},
+ {1, "A_mv/mu", "normal", 1, "A/mu"},
+ {1, "C_mv", "normal", 1, "A/C", MOVED_HERE},
+ {2, "A_mv/C", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/G", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/G/pi", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/G/rho", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/G/tau", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/gamma", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/H", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/H/chi", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/H/omega", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D/H/psi", "base-deleted", NO_COPY_FROM },
+ {2, "A_mv/D_mv", "normal", 1, "A/D", MOVED_HERE},
+ {2, "A_mv/D_mv/G", "normal", 1, "A/D/G", MOVED_HERE},
+ {2, "A_mv/D_mv/G/pi", "normal", 1, "A/D/G/pi", MOVED_HERE},
+ {2, "A_mv/D_mv/G/rho", "normal", 1, "A/D/G/rho", MOVED_HERE},
+ {2, "A_mv/D_mv/G/tau", "normal", 1, "A/D/G/tau", MOVED_HERE},
+ {2, "A_mv/D_mv/gamma", "normal", 1, "A/D/gamma", MOVED_HERE},
+ {2, "A_mv/D_mv/H", "normal", 1, "A/D/H", MOVED_HERE},
+ {2, "A_mv/D_mv/H/chi", "normal", 1, "A/D/H/chi", MOVED_HERE},
+ {2, "A_mv/D_mv/H/omega","normal", 1, "A/D/H/omega", MOVED_HERE},
+ {2, "A_mv/D_mv/H/psi", "normal", 1, "A/D/H/psi", MOVED_HERE},
+ {3, "A_mv/B/E", "normal", 2, "A/B/E"},
+ {3, "A_mv/B/E/alpha", "normal", 2, "A/B/E/alpha"},
+ {3, "A_mv/B/E/beta", "normal", 2, "A/B/E/beta"},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move_edit_obstruction(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "move_edit_obstruction", opts, pool));
+
+ SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+ SVN_ERR(sbox_file_write(&b, "A/B/E/alpha", "Update alpha"));
+ SVN_ERR(sbox_wc_propset(&b, "a", "b", "A/B/F"));
+ SVN_ERR(sbox_wc_commit(&b, "")); /* r2 */
+
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ /* Simple move */
+ SVN_ERR(sbox_wc_move(&b, "A", "A_mv"));
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {1, "A_mv", "normal", 2, "A", MOVED_HERE},
+ {1, "A_mv/B", "normal", 2, "A/B", MOVED_HERE},
+ {1, "A_mv/B/E", "normal", 2, "A/B/E", MOVED_HERE},
+ {1, "A_mv/B/E/alpha", "normal", 2, "A/B/E/alpha", MOVED_HERE},
+ {1, "A_mv/B/E/beta", "normal", 2, "A/B/E/beta", MOVED_HERE},
+ {1, "A_mv/B/F", "normal", 2, "A/B/F", MOVED_HERE, "a"},
+ {1, "A_mv/B/lambda", "normal", 2, "A/B/lambda", MOVED_HERE},
+ {1, "A_mv/C", "normal", 2, "A/C", MOVED_HERE},
+ {1, "A_mv/D", "normal", 2, "A/D", MOVED_HERE},
+ {1, "A_mv/D/G", "normal", 2, "A/D/G", MOVED_HERE},
+ {1, "A_mv/D/G/pi", "normal", 2, "A/D/G/pi", MOVED_HERE},
+ {1, "A_mv/D/G/rho", "normal", 2, "A/D/G/rho", MOVED_HERE},
+ {1, "A_mv/D/G/tau", "normal", 2, "A/D/G/tau", MOVED_HERE},
+ {1, "A_mv/D/gamma", "normal", 2, "A/D/gamma", MOVED_HERE},
+ {1, "A_mv/D/H", "normal", 2, "A/D/H", MOVED_HERE},
+ {1, "A_mv/D/H/chi", "normal", 2, "A/D/H/chi", MOVED_HERE},
+ {1, "A_mv/D/H/omega", "normal", 2, "A/D/H/omega", MOVED_HERE},
+ {1, "A_mv/D/H/psi", "normal", 2, "A/D/H/psi", MOVED_HERE},
+ {1, "A_mv/mu", "normal", 2, "A/mu", MOVED_HERE},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "A_mv", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+ }
+
+ /* Now do the same thing with local obstructions on the edited nodes */
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_revert(&b, "", svn_depth_infinity));
+ SVN_ERR(sbox_wc_move(&b, "A", "A_mv"));
+
+ SVN_ERR(svn_io_remove_file2(sbox_wc_path(&b, "A_mv/B/E/alpha"), FALSE, pool));
+ SVN_ERR(svn_io_dir_make(sbox_wc_path(&b, "A_mv/B/E/alpha"), APR_OS_DEFAULT,
+ pool));
+ SVN_ERR(svn_io_dir_remove_nonrecursive(sbox_wc_path(&b, "A_mv/B/F"), pool));
+ SVN_ERR(sbox_file_write(&b, "A_mv/B/F", "F file"));
+
+ SVN_ERR(sbox_wc_update(&b, "", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {1, "A_mv", "normal", 2, "A", MOVED_HERE},
+ {1, "A_mv/B", "normal", 2, "A/B", MOVED_HERE},
+ {1, "A_mv/B/E", "normal", 2, "A/B/E", MOVED_HERE},
+ {1, "A_mv/B/E/alpha", "normal", 2, "A/B/E/alpha", MOVED_HERE},
+ {1, "A_mv/B/E/beta", "normal", 2, "A/B/E/beta", MOVED_HERE},
+ {1, "A_mv/B/F", "normal", 2, "A/B/F", MOVED_HERE, "a"},
+ {1, "A_mv/B/lambda", "normal", 2, "A/B/lambda", MOVED_HERE},
+ {1, "A_mv/C", "normal", 2, "A/C", MOVED_HERE},
+ {1, "A_mv/D", "normal", 2, "A/D", MOVED_HERE},
+ {1, "A_mv/D/G", "normal", 2, "A/D/G", MOVED_HERE},
+ {1, "A_mv/D/G/pi", "normal", 2, "A/D/G/pi", MOVED_HERE},
+ {1, "A_mv/D/G/rho", "normal", 2, "A/D/G/rho", MOVED_HERE},
+ {1, "A_mv/D/G/tau", "normal", 2, "A/D/G/tau", MOVED_HERE},
+ {1, "A_mv/D/gamma", "normal", 2, "A/D/gamma", MOVED_HERE},
+ {1, "A_mv/D/H", "normal", 2, "A/D/H", MOVED_HERE},
+ {1, "A_mv/D/H/chi", "normal", 2, "A/D/H/chi", MOVED_HERE},
+ {1, "A_mv/D/H/omega", "normal", 2, "A/D/H/omega", MOVED_HERE},
+ {1, "A_mv/D/H/psi", "normal", 2, "A/D/H/psi", MOVED_HERE},
+ {1, "A_mv/mu", "normal", 2, "A/mu", MOVED_HERE},
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"A_mv/B/E/alpha", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_obstructed}},
+ {"A_mv/B/F", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_obstructed}},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "A_mv", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+move_deep_bump(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "move_deep_bump", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "B/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "B/B/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "B/B/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "B/B/A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "C/C"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_mkdir(&b, "Z"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_mkdir(&b, "B/B/A/A/A/A"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ SVN_ERR(sbox_wc_move(&b, "B/B/A", "B/B/B"));
+ SVN_ERR(sbox_wc_move(&b, "B/B/B/A", "C/C/A"));
+
+ /* This can't bump C/C/A as that is outside the lock range
+ so we expect a tree conflict.
+
+ This used to cause a node not found during bumping
+ because B/B/B/A doesn't have a BASE node */
+ SVN_ERR(sbox_wc_update(&b, "B/B", 2));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "B", "normal", 1, "B"},
+ {0, "B/B", "normal", 2, "B/B"},
+ {0, "B/B/A", "normal", 2, "B/B/A"},
+ {0, "B/B/A/A", "normal", 2, "B/B/A/A"},
+ {0, "B/B/A/A/A", "normal", 2, "B/B/A/A/A"},
+ {0, "C", "normal", 1, "C"},
+ {0, "C/C", "normal", 1, "C/C"},
+ {3, "B/B/A", "base-deleted", NO_COPY_FROM, "B/B/B"},
+ {3, "B/B/A/A", "base-deleted", NO_COPY_FROM},
+ {3, "B/B/A/A/A", "base-deleted", NO_COPY_FROM},
+ {3, "B/B/B", "normal", 2, "B/B/A", MOVED_HERE},
+ {3, "B/B/B/A", "normal", 2, "B/B/A/A", MOVED_HERE},
+ {3, "B/B/B/A/A", "normal", 2, "B/B/A/A/A", MOVED_HERE},
+ {3, "C/C/A", "normal", 1, "B/B/A/A", MOVED_HERE},
+ {3, "C/C/A/A", "normal", 1, "B/B/A/A/A", MOVED_HERE},
+ {4, "B/B/B/A", "base-deleted", NO_COPY_FROM, "C/C/A"},
+ {4, "B/B/B/A/A", "base-deleted", NO_COPY_FROM},
+ {0}
+ };
+ conflict_info_t conflicts[] = {
+ {"B/B/B/A", FALSE, FALSE, {svn_wc_conflict_action_edit,
+ svn_wc_conflict_reason_moved_away, "B/B/B/A"}},
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ SVN_ERR(check_db_conflicts(&b, "", conflicts));
+ }
+
+ SVN_ERR(sbox_wc_resolve(&b, "B/B/B/A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(check_db_conflicts(&b, "", NULL));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+make_copy_mixed(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "make_copy_mixed", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/D"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/E"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/F"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/H"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/I"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/J"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K/L"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K/M"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/O"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/Q"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R/S"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R/S/T"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r2", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r3", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r4", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r5", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ SVN_ERR(sbox_wc_update(&b, "", 5));
+ SVN_ERR(sbox_wc_update(&b, "A", 4));
+ SVN_ERR(sbox_wc_update(&b, "A/B", 3));
+ SVN_ERR(sbox_wc_update(&b, "A/B/C", 2));
+ SVN_ERR(sbox_wc_update(&b, "A/B/K", 1));
+ SVN_ERR(sbox_wc_update(&b, "A/N/O", 3));
+
+ SVN_ERR(sbox_wc_delete(&b, "A/B/C/F"));
+ SVN_ERR(sbox_wc_delete(&b, "A/B/G/J"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/J"));
+
+ SVN_ERR(sbox_wc_update(&b, "A/N/P", 1));
+ SVN_ERR(sbox_wc_update(&b, "A/N/Q", 1));
+ SVN_ERR(sbox_wc_delete(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_move(&b, "A/N/Q", "Q"));
+ SVN_ERR(sbox_wc_move(&b, "A/B/G/H", "H"));
+
+ /* And something that can't be represented */
+ SVN_ERR(sbox_wc_update(&b, "A/B/C/E", 1));
+ SVN_ERR(sbox_wc_move(&b, "A/B/C/E", "E"));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, "", NOT_MOVED, "k"},
+ {0, "A", "normal", 4, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {0, "A/B/C/E", "normal", 1, "A/B/C/E"},
+ {0, "A/B/C/F", "normal", 2, "A/B/C/F"},
+ {0, "A/B/G", "normal", 3, "A/B/G"},
+ {0, "A/B/G/H", "normal", 3, "A/B/G/H"},
+ {0, "A/B/G/I", "normal", 3, "A/B/G/I"},
+ {0, "A/B/G/J", "normal", 3, "A/B/G/J"},
+ {0, "A/B/K", "normal", 1, "A/B/K"},
+ {0, "A/B/K/L", "normal", 1, "A/B/K/L"},
+ {0, "A/B/K/M", "normal", 1, "A/B/K/M"},
+ {0, "A/N", "normal", 4, "A/N"},
+ {0, "A/N/O", "normal", 3, "A/N/O"},
+ {0, "A/N/P", "normal", 1, "A/N/P"},
+ {0, "A/N/Q", "normal", 1, "A/N/Q"},
+ {0, "A/R", "normal", 4, "A/R"},
+ {0, "A/R/S", "normal", 4, "A/R/S"},
+ {0, "A/R/S/T", "normal", 4, "A/R/S/T"},
+ {1, "E", "normal", 1, "A/B/C/E", MOVED_HERE},
+ {1, "H", "normal", 3, "A/B/G/H", MOVED_HERE},
+ {1, "Q", "normal", 1, "A/N/Q", MOVED_HERE},
+ {3, "A/N/P", "normal", NO_COPY_FROM},
+ {3, "A/N/Q", "base-deleted", NO_COPY_FROM, "Q"},
+ {4, "A/B/C/E", "base-deleted", NO_COPY_FROM, "E"},
+ {4, "A/B/C/F", "base-deleted", NO_COPY_FROM},
+ {4, "A/B/G/H", "base-deleted", NO_COPY_FROM, "H"},
+ {4, "A/B/G/J", "normal", NO_COPY_FROM},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(svn_wc__db_op_make_copy(b.wc_ctx->db, sbox_wc_path(&b, "A"),
+ NULL, NULL, pool));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, "", NOT_MOVED, "k"},
+ {0, "A", "normal", 4, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {0, "A/B/C/E", "normal", 1, "A/B/C/E"},
+ {0, "A/B/C/F", "normal", 2, "A/B/C/F"},
+ {0, "A/B/G", "normal", 3, "A/B/G"},
+ {0, "A/B/G/H", "normal", 3, "A/B/G/H"},
+ {0, "A/B/G/I", "normal", 3, "A/B/G/I"},
+ {0, "A/B/G/J", "normal", 3, "A/B/G/J"},
+ {0, "A/B/K", "normal", 1, "A/B/K"},
+ {0, "A/B/K/L", "normal", 1, "A/B/K/L"},
+ {0, "A/B/K/M", "normal", 1, "A/B/K/M"},
+ {0, "A/N", "normal", 4, "A/N"},
+ {0, "A/N/O", "normal", 3, "A/N/O"},
+ {0, "A/N/P", "normal", 1, "A/N/P"},
+ {0, "A/N/Q", "normal", 1, "A/N/Q"},
+ {0, "A/R", "normal", 4, "A/R"},
+ {0, "A/R/S", "normal", 4, "A/R/S"},
+ {0, "A/R/S/T", "normal", 4, "A/R/S/T"},
+ {1, "A", "normal", 4, "A"},
+ {1, "A/B", "not-present", 3, "A/B"},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/E", "base-deleted", NO_COPY_FROM, "E"},
+ {1, "A/B/C/F", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/G", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/G/H", "base-deleted", NO_COPY_FROM, "H"},
+ {1, "A/B/G/I", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/G/J", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/K", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/K/L", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/K/M", "base-deleted", NO_COPY_FROM},
+ {1, "A/N", "normal", 4, "A/N"},
+ {1, "A/N/O", "not-present", 3, "A/N/O"},
+ {1, "A/N/P", "not-present", 1, "A/N/P"},
+ {1, "A/N/Q", "not-present", 1, "A/N/Q", FALSE, "Q"},
+ {1, "A/R", "normal", 4, "A/R"},
+ {1, "A/R/S", "normal", 4, "A/R/S"},
+ {1, "A/R/S/T", "normal", 4, "A/R/S/T"},
+ {1, "E", "normal", 1, "A/B/C/E", MOVED_HERE},
+ {1, "H", "normal", 3, "A/B/G/H", MOVED_HERE},
+ {1, "Q", "normal", 1, "A/N/Q", MOVED_HERE},
+ {2, "A/B", "normal", 3, "A/B"},
+ {2, "A/B/C", "not-present", 2, "A/B/C"},
+ {2, "A/B/G", "normal", 3, "A/B/G"},
+ {2, "A/B/G/H", "normal", 3, "A/B/G/H"},
+ {2, "A/B/G/I", "normal", 3, "A/B/G/I"},
+ {2, "A/B/G/J", "normal", 3, "A/B/G/J"},
+ {2, "A/B/K", "not-present", 1, "A/B/K"},
+ {3, "A/B/C", "normal", 2, "A/B/C"},
+ {3, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {3, "A/B/C/E", "not-present", 1, "A/B/C/E"},
+ {3, "A/B/C/F", "normal", 2, "A/B/C/F"},
+ {3, "A/B/K", "normal", 1, "A/B/K"},
+ {3, "A/B/K/L", "normal", 1, "A/B/K/L"},
+ {3, "A/B/K/M", "normal", 1, "A/B/K/M"},
+ {3, "A/N/O", "normal", 3, "A/N/O"},
+ {3, "A/N/P", "normal", NO_COPY_FROM},
+ {4, "A/B/C/F", "base-deleted", NO_COPY_FROM},
+ {4, "A/B/G/H", "base-deleted", NO_COPY_FROM},
+ {4, "A/B/G/J", "normal", NO_COPY_FROM},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(verify_db(&b));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+make_copy_and_delete_mixed(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "make_copy_and_del_mixed", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/D"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/E"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/F"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/H"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/I"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/J"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K/L"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/K/M"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/O"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/Q"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R/S"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/R/S/T"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r2", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r3", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r4", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "k", "r5", ""));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ SVN_ERR(sbox_wc_update(&b, "", 5));
+ SVN_ERR(sbox_wc_update(&b, "A", 4));
+ SVN_ERR(sbox_wc_update(&b, "A/B", 3));
+ SVN_ERR(sbox_wc_update(&b, "A/B/C", 2));
+ SVN_ERR(sbox_wc_update(&b, "A/B/K", 1));
+ SVN_ERR(sbox_wc_update(&b, "A/N/O", 3));
+
+ SVN_ERR(sbox_wc_delete(&b, "A/B/C/F"));
+ SVN_ERR(sbox_wc_delete(&b, "A/B/G/J"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/G/J"));
+
+ SVN_ERR(sbox_wc_update(&b, "A/N/P", 1));
+ SVN_ERR(sbox_wc_update(&b, "A/N/Q", 1));
+ SVN_ERR(sbox_wc_delete(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/N/P"));
+ SVN_ERR(sbox_wc_move(&b, "A/N/Q", "Q"));
+ SVN_ERR(sbox_wc_move(&b, "A/B/G/H", "H"));
+
+ /* And something that can't be represented */
+ SVN_ERR(sbox_wc_update(&b, "A/B/C/E", 1));
+ SVN_ERR(sbox_wc_move(&b, "A/B/C/E", "E"));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, "", NOT_MOVED, "k"},
+ {0, "A", "normal", 4, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {0, "A/B/C/E", "normal", 1, "A/B/C/E"},
+ {0, "A/B/C/F", "normal", 2, "A/B/C/F"},
+ {0, "A/B/G", "normal", 3, "A/B/G"},
+ {0, "A/B/G/H", "normal", 3, "A/B/G/H"},
+ {0, "A/B/G/I", "normal", 3, "A/B/G/I"},
+ {0, "A/B/G/J", "normal", 3, "A/B/G/J"},
+ {0, "A/B/K", "normal", 1, "A/B/K"},
+ {0, "A/B/K/L", "normal", 1, "A/B/K/L"},
+ {0, "A/B/K/M", "normal", 1, "A/B/K/M"},
+ {0, "A/N", "normal", 4, "A/N"},
+ {0, "A/N/O", "normal", 3, "A/N/O"},
+ {0, "A/N/P", "normal", 1, "A/N/P"},
+ {0, "A/N/Q", "normal", 1, "A/N/Q"},
+ {0, "A/R", "normal", 4, "A/R"},
+ {0, "A/R/S", "normal", 4, "A/R/S"},
+ {0, "A/R/S/T", "normal", 4, "A/R/S/T"},
+ {1, "E", "normal", 1, "A/B/C/E", MOVED_HERE},
+ {1, "H", "normal", 3, "A/B/G/H", MOVED_HERE},
+ {1, "Q", "normal", 1, "A/N/Q", MOVED_HERE},
+ {3, "A/N/P", "normal", NO_COPY_FROM},
+ {3, "A/N/Q", "base-deleted", NO_COPY_FROM, "Q"},
+ {4, "A/B/C/E", "base-deleted", NO_COPY_FROM, "E"},
+ {4, "A/B/C/F", "base-deleted", NO_COPY_FROM},
+ {4, "A/B/G/H", "base-deleted", NO_COPY_FROM, "H"},
+ {4, "A/B/G/J", "normal", NO_COPY_FROM},
+
+ {0}
+ };
+
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(svn_wc__db_base_remove(b.wc_ctx->db, sbox_wc_path(&b, "A"),
+ TRUE, TRUE, FALSE, 99,
+ NULL, NULL, pool));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, "", NOT_MOVED, "k"},
+ {0, "A", "not-present", 99, "A"},
+ {1, "A", "normal", 4, "A"},
+ {1, "A/B", "not-present", 3, "A/B"},
+ {1, "A/N", "normal", 4, "A/N"},
+ {1, "A/N/O", "not-present", 3, "A/N/O"},
+ {1, "A/N/P", "not-present", 1, "A/N/P"},
+ {1, "A/N/Q", "not-present", 1, "A/N/Q", FALSE},
+ {1, "A/R", "normal", 4, "A/R"},
+ {1, "A/R/S", "normal", 4, "A/R/S"},
+ {1, "A/R/S/T", "normal", 4, "A/R/S/T"},
+ {1, "E", "normal", 1, "A/B/C/E"},
+ {1, "H", "normal", 3, "A/B/G/H", MOVED_HERE},
+ {1, "Q", "normal", 1, "A/N/Q"},
+ {2, "A/B", "normal", 3, "A/B"},
+ {2, "A/B/C", "not-present", 2, "A/B/C"},
+ {2, "A/B/G", "normal", 3, "A/B/G"},
+ {2, "A/B/G/H", "normal", 3, "A/B/G/H"},
+ {2, "A/B/G/I", "normal", 3, "A/B/G/I"},
+ {2, "A/B/G/J", "normal", 3, "A/B/G/J"},
+ {3, "A/B/C", "normal", 2, "A/B/C"},
+ {3, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {3, "A/B/C/E", "not-present", 1, "A/B/C/E"},
+ {3, "A/B/C/F", "normal", 2, "A/B/C/F"},
+ {2, "A/B/K", "not-present", 1, "A/B/K"},
+ {3, "A/B/K", "normal", 1, "A/B/K"},
+ {3, "A/B/K/L", "normal", 1, "A/B/K/L"},
+ {3, "A/B/K/M", "normal", 1, "A/B/K/M"},
+ {3, "A/N/O", "normal", 3, "A/N/O"},
+ {3, "A/N/P", "normal", NO_COPY_FROM},
+ {4, "A/B/C/F", "base-deleted", NO_COPY_FROM},
+ {4, "A/B/G/H", "base-deleted", NO_COPY_FROM, "H"},
+ {4, "A/B/G/J", "normal", NO_COPY_FROM},
+
+ {0}
+ };
+
+ /* This currently fails because Q and E are still marked as moved,
+ while there is nothing to be moved. */
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(verify_db(&b));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_global_commit(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "global_commit", opts, pool));
+
+ {
+ nodes_row_t before[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ { 0, "A/B", "normal", 2, "A/B" },
+ { 0, "A/B/C", "normal", 2, "A/B/C" },
+ { 0, "A/B/D", "normal", 2, "A/B/D" },
+ { 0, "A/B/D/E", "normal", 2, "A/B/D/E" },
+ { 0, "A/F", "normal", 2, "A/F" },
+ { 0, "A/F/G", "normal", 2, "A/F/G" },
+ { 0, "A/F/H", "normal", 2, "A/F/H" },
+ { 0, "A/F/E", "normal", 2, "A/F/E" },
+ { 0, "A/X", "normal", 2, "A/X" },
+ { 0, "A/X/Y", "incomplete", 2, "A/X/Y" },
+ { 1, "C", "normal", 2, "A/B/C", MOVED_HERE},
+ { 1, "E", "normal", 2, "A/B/D/E", MOVED_HERE},
+ { 2, "A/B", "normal", 3, "some", MOVED_HERE },
+ { 2, "A/B/C", "base-deleted", NO_COPY_FROM, "C" },
+ { 2, "A/B/D", "normal", 3, "some/D", MOVED_HERE},
+ { 2, "A/B/D/E", "not-present", 3, "some/D/E", FALSE, "E", TRUE},
+ { 3, "A/B/C", "normal", NO_COPY_FROM},
+ { 2, "A/F", "normal", 1, "S2" },
+ { 2, "A/F/G", "normal", 1, "S2/G" },
+ { 2, "A/F/H", "not-present", 1, "S2/H" },
+ { 2, "A/F/E", "base-deleted", NO_COPY_FROM },
+ { 1, "some", "normal", 3, "some", FALSE, "A/B"},
+ { 0 }
+ };
+ SVN_ERR(insert_dirs(&b, before));
+ SVN_ERR(check_db_rows(&b, "", before)); /* Check move insertion logic */
+ SVN_ERR(verify_db(&b));
+ }
+
+ /* This should break the moves */
+ SVN_ERR(svn_wc__db_global_commit(b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B"),
+ 5, 5, 700, "me", NULL, NULL,
+ FALSE, FALSE, NULL, pool));
+ {
+ nodes_row_t after[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ { 0, "A/B", "normal", 5, "A/B" },
+ { 0, "A/B/D", "normal", 5, "A/B/D"},
+ { 0, "A/B/D/E", "not-present", 5, "A/B/D/E"},
+ { 0, "A/F", "normal", 2, "A/F" },
+ { 0, "A/F/G", "normal", 2, "A/F/G" },
+ { 0, "A/F/H", "normal", 2, "A/F/H" },
+ { 0, "A/F/E", "normal", 2, "A/F/E" },
+ { 0, "A/X", "normal", 2, "A/X" },
+ { 0, "A/X/Y", "incomplete", 2, "A/X/Y" },
+ { 1, "C", "normal", 2, "A/B/C"},
+ { 1, "E", "normal", 2, "A/B/D/E"},
+ { 1, "some", "normal", 3, "some"},
+ { 3, "A/B/C", "normal", NO_COPY_FROM},
+ { 2, "A/F", "normal", 1, "S2" },
+ { 2, "A/F/G", "normal", 1, "S2/G" },
+ { 2, "A/F/H", "not-present", 1, "S2/H" },
+ { 2, "A/F/E", "base-deleted", NO_COPY_FROM },
+ { 0 }
+ };
+
+ SVN_ERR(check_db_rows(&b, "", after));
+ SVN_ERR(verify_db(&b));
+ }
+
+ SVN_ERR(svn_wc__db_global_commit(b.wc_ctx->db,
+ sbox_wc_path(&b, "A/F"),
+ 6, 6, 800, "me", NULL, NULL,
+ FALSE, FALSE, NULL, pool));
+
+ {
+ nodes_row_t after[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ { 0, "A/B", "normal", 5, "A/B" },
+ { 0, "A/B/D", "normal", 5, "A/B/D"},
+ { 0, "A/B/D/E", "not-present", 5, "A/B/D/E"},
+ { 0, "A/F", "normal", 6, "A/F" },
+ { 0, "A/F/G", "normal", 6, "A/F/G" },
+ { 0, "A/F/H", "not-present", 6, "A/F/H" },
+ { 0, "A/X", "normal", 2, "A/X" },
+ { 0, "A/X/Y", "incomplete", 2, "A/X/Y" },
+ { 1, "C", "normal", 2, "A/B/C"},
+ { 1, "E", "normal", 2, "A/B/D/E"},
+ { 1, "some", "normal", 3, "some"},
+ { 3, "A/B/C", "normal", NO_COPY_FROM },
+ { 0 }
+ };
+
+ SVN_ERR(check_db_rows(&b, "", after));
+ SVN_ERR(verify_db(&b));
+ }
+
+ SVN_ERR(svn_wc__db_global_commit(b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B/C"),
+ 7, 7, 900, "me", NULL, NULL,
+ FALSE, FALSE, NULL, pool));
+
+ {
+ nodes_row_t after[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ { 0, "A/B", "normal", 5, "A/B" },
+ { 0, "A/B/C", "normal", 7, "A/B/C"},
+ { 0, "A/B/D", "normal", 5, "A/B/D"},
+ { 0, "A/B/D/E", "not-present", 5, "A/B/D/E"},
+ { 0, "A/F", "normal", 6, "A/F" },
+ { 0, "A/F/G", "normal", 6, "A/F/G" },
+ { 0, "A/F/H", "not-present", 6, "A/F/H" },
+ { 0, "A/X", "normal", 2, "A/X" },
+ { 0, "A/X/Y", "incomplete", 2, "A/X/Y" },
+ { 1, "some", "normal", 3, "some"},
+ { 1, "E", "normal", 2, "A/B/D/E"},
+ { 1, "C", "normal", 2, "A/B/C"},
+ { 0 }
+ };
+
+ SVN_ERR(check_db_rows(&b, "", after));
+ SVN_ERR(verify_db(&b));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_global_commit_switched(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "global_commit_switched", opts, pool));
+ {
+ nodes_row_t before[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ /* A/B is switched... The libsvn_client layer tries to prevent this,
+ because it has such an unexpected behavior. */
+ { 0, "A/B", "normal", 2, "N/B" },
+ { 0, "A/B/C", "normal", 2, "N/B/C" },
+ { 0, "A/B/C/D", "normal", 2, "N/B/C/D" },
+ { 0, "A/B/C/E", "normal", 2, "N/B/C/E" },
+ { 2, "A/B", "normal", 3, "Z/B" },
+ { 2, "A/B/C", "normal", 3, "Z/B/C" },
+ { 2, "A/B/C/D", "normal", 3, "Z/B/C/D" },
+ { 2, "A/B/C/E", "base-deleted", NO_COPY_FROM },
+ /* not-present nodes have an 'uninteresting path',
+ which doesn't have to be as implied by ancestor at same depth */
+ { 2, "A/B/C/F", "not-present", 3, "ZZ-Z-Z_ZZ_Z_Z" },
+ { 2, "A/B/C/G", "normal", 3, "Z/B/C/G" },
+ { 2, "A/B/C/G/H", "normal", 3, "Z/B/C/G/H" },
+
+ { 3, "A/B/C", "normal", 4, "Q/C" },
+ { 3, "A/B/C/D", "base-deleted", NO_COPY_FROM },
+ { 3, "A/B/C/G", "normal", 4, "Q/C/G" },
+ { 3, "A/B/C/G/H", "base-deleted", NO_COPY_FROM },
+
+ { 4, "A/B/C/F", "normal", NO_COPY_FROM },
+ { 5, "A/B/C/G/H", "normal", NO_COPY_FROM },
+ { 0 }
+ };
+ SVN_ERR(insert_dirs(&b, before));
+ SVN_ERR(verify_db(&b));
+ }
+
+ SVN_ERR(svn_wc__db_global_commit(b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B"),
+ 7, 7, 12, "me", NULL, NULL,
+ FALSE, FALSE, NULL, pool));
+
+ {
+ nodes_row_t after[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ /* The commit is applied as A/B, because the path is calculated from A,
+ and not the shadowed node at A/B. (Fixed in r1663991) */
+ { 0, "A/B", "normal", 7, "A/B" },
+ { 0, "A/B/C", "normal", 7, "A/B/C" },
+ { 0, "A/B/C/D", "normal", 7, "A/B/C/D" },
+ /* Even calculated path of not-present is fixed */
+ { 0, "A/B/C/F", "not-present", 7, "A/B/C/F" },
+ { 0, "A/B/C/G", "normal", 7, "A/B/C/G" },
+ { 0, "A/B/C/G/H", "normal", 7, "A/B/C/G/H" },
+
+ /* The higher layers are unaffected */
+ { 3, "A/B/C", "normal", 4, "Q/C" },
+ { 3, "A/B/C/D", "base-deleted", NO_COPY_FROM },
+ { 3, "A/B/C/G", "normal", 4, "Q/C/G" },
+ { 3, "A/B/C/G/H", "base-deleted", NO_COPY_FROM },
+
+ { 4, "A/B/C/F", "normal", NO_COPY_FROM },
+ { 5, "A/B/C/G/H", "normal", NO_COPY_FROM },
+ { 0 }
+ };
+ SVN_ERR(verify_db(&b));
+ SVN_ERR(check_db_rows(&b, "", after));
+ }
+
+ SVN_ERR(svn_wc__db_global_commit(b.wc_ctx->db,
+ sbox_wc_path(&b, "A/B/C"),
+ 8, 8, 12, "me", NULL, NULL,
+ FALSE, FALSE, NULL, pool));
+
+ {
+ nodes_row_t after[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "A", "normal", 2, "A" },
+ { 0, "A/B", "normal", 7, "A/B" },
+ /* Base deleted and not-present are now gone */
+ { 0, "A/B/C", "normal", 8, "A/B/C" },
+ { 0, "A/B/C/G", "normal", 8, "A/B/C/G" },
+
+ { 4, "A/B/C/F", "normal", NO_COPY_FROM },
+ { 5, "A/B/C/G/H", "normal", NO_COPY_FROM },
+ { 0 }
+ };
+ SVN_ERR(verify_db(&b));
+ SVN_ERR(check_db_rows(&b, "", after));
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* ---------------------------------------------------------------------- */
/* The list of test functions */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 4;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(test_wc_wc_copies,
@@ -9047,8 +11898,8 @@ struct svn_test_descriptor_t test_funcs[] =
"test_adds_change_kind"),
SVN_TEST_OPTS_PASS(test_base_dir_insert_remove,
"test_base_dir_insert_remove"),
- SVN_TEST_OPTS_PASS(test_temp_op_make_copy,
- "test_temp_op_make_copy"),
+ SVN_TEST_OPTS_PASS(test_db_make_copy,
+ "test_db_make_copy"),
SVN_TEST_OPTS_PASS(test_wc_move,
"test_wc_move"),
SVN_TEST_OPTS_PASS(test_mixed_rev_copy,
@@ -9168,12 +12019,16 @@ struct svn_test_descriptor_t test_funcs[] =
"move_parent_into_child (issue 4333)"),
SVN_TEST_OPTS_PASS(move_depth_expand,
"move depth expansion"),
- SVN_TEST_OPTS_PASS(move_retract,
+ SVN_TEST_OPTS_XFAIL(move_retract,
"move retract (issue 4336)"),
SVN_TEST_OPTS_PASS(move_delete_file_externals,
"move/delete file externals (issue 4293)"),
SVN_TEST_OPTS_PASS(update_with_tree_conflict,
"update with tree conflict (issue 4347)"),
+ SVN_TEST_OPTS_PASS(move_update_parent_replace,
+ "move update with replaced parent (issue 4388)"),
+ SVN_TEST_OPTS_PASS(copy_mixed_rev_mods,
+ "copy mixed-rev with mods"),
SVN_TEST_OPTS_PASS(move_child_to_parent_revert,
"move child to parent and revert (issue 4436)"),
SVN_TEST_OPTS_PASS(move_delete_intermediate,
@@ -9184,13 +12039,55 @@ struct svn_test_descriptor_t test_funcs[] =
"move replace ancestor with child"),
SVN_TEST_OPTS_PASS(move_twice_within_delete,
"move twice and then delete"),
- SVN_TEST_OPTS_PASS(repo_wc_copy,
- "repo_wc_copy"),
- SVN_TEST_OPTS_PASS(copy_mixed_rev_mods,
- "copy mixed-rev with mods"),
+ SVN_TEST_OPTS_PASS(del4_update_edit_AAA,
+ "del4: edit AAA"),
+ SVN_TEST_OPTS_XFAIL(del4_update_delete_AAA,
+ "del4: delete AAA"),
+ SVN_TEST_OPTS_XFAIL(del4_update_add_AAA,
+ "del4: add AAA"),
+ SVN_TEST_OPTS_XFAIL(del4_update_replace_AAA,
+ "del4: replace AAA"),
+ SVN_TEST_OPTS_PASS(del4_update_delself_AAA,
+ "del4: delete self AAA"),
+ SVN_TEST_OPTS_XFAIL(del4_update_replaceself_AAA,
+ "del4: replace self AAA"),
+ SVN_TEST_OPTS_PASS(move4_update_edit_AAA,
+ "move4: edit AAA"),
+ SVN_TEST_OPTS_XFAIL(move4_update_delete_AAA,
+ "move4: delete AAA"),
+ SVN_TEST_OPTS_XFAIL(move4_update_add_AAA,
+ "move4: add AAA"),
+ SVN_TEST_OPTS_XFAIL(move4_update_replace_AAA,
+ "move4: replace AAA"),
+ SVN_TEST_OPTS_PASS(move4_update_delself_AAA,
+ "move4: delete self AAA"),
+ SVN_TEST_OPTS_XFAIL(move4_update_replaceself_AAA,
+ "move4: replace self AAA"),
+ SVN_TEST_OPTS_PASS(simple_move_bump,
+ "simple move bump"),
SVN_TEST_OPTS_PASS(movedhere_extract_retract,
"movedhere extract retract"),
+ SVN_TEST_OPTS_PASS(repo_wc_copy,
+ "repo_wc_copy"),
+ SVN_TEST_OPTS_PASS(break_move_in_delete,
+ "break move in delete (issue 4491)"),
SVN_TEST_OPTS_PASS(nested_move_delete,
"nested move delete"),
+ SVN_TEST_OPTS_XFAIL(move_within_mixed_move,
+ "move within mixed move"),
+ SVN_TEST_OPTS_PASS(move_edit_obstruction,
+ "move edit obstruction"),
+ SVN_TEST_OPTS_PASS(move_deep_bump,
+ "move deep bump"),
+ SVN_TEST_OPTS_PASS(make_copy_mixed,
+ "make a copy of a mixed revision tree"),
+ SVN_TEST_OPTS_PASS(make_copy_and_delete_mixed,
+ "make a copy of a mixed revision tree and del"),
+ SVN_TEST_OPTS_PASS(test_global_commit,
+ "test global commit"),
+ SVN_TEST_OPTS_PASS(test_global_commit_switched,
+ "test global commit switched"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/pristine-store-test.c b/subversion/tests/libsvn_wc/pristine-store-test.c
index 6df96fc..d9ed077 100644
--- a/subversion/tests/libsvn_wc/pristine-store-test.c
+++ b/subversion/tests/libsvn_wc/pristine-store-test.c
@@ -70,40 +70,6 @@ create_repos_and_wc(const char **wc_abspath,
return SVN_NO_ERROR;
}
-
-/* Write the string DATA into a new unique-named file in the directory
- * DIR_ABSPATH. Set *FILE_ABSPATH to its absolute path and *CHECKSUM_SHA1
- * and *CHECKSUM_MD5 to its SHA-1 and MD-5 checksums.
- *
- * CHECKSUM_SHA1 and/or CHECKSUM_MD5 may be null if not required. */
-static svn_error_t *
-write_and_checksum_temp_file(const char **file_abspath,
- svn_checksum_t **sha1_checksum,
- svn_checksum_t **md5_checksum,
- const char *data,
- const char *dir_abspath,
- apr_pool_t *pool)
-{
- apr_file_t *file;
-
- SVN_ERR(svn_io_open_unique_file3(&file, file_abspath,
- dir_abspath, svn_io_file_del_none,
- pool, pool));
-
- SVN_ERR(svn_io_file_write_full(file, data, strlen(data), NULL, pool));
- SVN_ERR(svn_io_file_close(file, pool));
-
- if (sha1_checksum)
- SVN_ERR(svn_io_file_checksum2(sha1_checksum, *file_abspath,
- svn_checksum_sha1, pool));
- if (md5_checksum)
- SVN_ERR(svn_io_file_checksum2(md5_checksum, *file_abspath,
- svn_checksum_md5, pool));
-
- return SVN_NO_ERROR;
-}
-
-
/* Exercise the pristine text API with a simple write and read. */
static svn_error_t *
pristine_write_read(const svn_test_opts_t *opts,
@@ -112,7 +78,9 @@ pristine_write_read(const svn_test_opts_t *opts,
svn_wc__db_t *db;
const char *wc_abspath;
- const char *pristine_tmp_abspath;
+ svn_wc__db_install_data_t *install_data;
+ svn_stream_t *pristine_stream;
+ apr_size_t sz;
const char data[] = "Blah";
svn_string_t *data_string = svn_string_create(data, pool);
@@ -123,15 +91,15 @@ pristine_write_read(const svn_test_opts_t *opts,
/* Write DATA into a new temporary pristine file, set PRISTINE_TMP_ABSPATH
* to its path and set DATA_SHA1 and DATA_MD5 to its checksums. */
- {
- const char *pristine_tmp_dir;
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&pristine_stream,
+ &install_data,
+ &data_sha1, &data_md5,
+ db, wc_abspath,
+ pool, pool));
- SVN_ERR(svn_wc__db_pristine_get_tempdir(&pristine_tmp_dir, db,
- wc_abspath, pool, pool));
- SVN_ERR(write_and_checksum_temp_file(&pristine_tmp_abspath,
- &data_sha1, &data_md5,
- data, pristine_tmp_dir, pool));
- }
+ sz = strlen(data);
+ SVN_ERR(svn_stream_write(pristine_stream, data, &sz));
+ SVN_ERR(svn_stream_close(pristine_stream));
/* Ensure it's not already in the store. */
{
@@ -143,7 +111,7 @@ pristine_write_read(const svn_test_opts_t *opts,
}
/* Install the new pristine file, referenced by its checksum. */
- SVN_ERR(svn_wc__db_pristine_install(db, pristine_tmp_abspath,
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
data_sha1, data_md5, pool));
/* Ensure it is now found in the store. */
@@ -209,8 +177,10 @@ pristine_delete_while_open(const svn_test_opts_t *opts,
{
svn_wc__db_t *db;
const char *wc_abspath;
- const char *pristine_tmp_dir;
+ svn_wc__db_install_data_t *install_data;
+ svn_stream_t *pristine_stream;
svn_stream_t *contents;
+ apr_size_t sz;
const char data[] = "Blah";
svn_checksum_t *data_sha1, *data_md5;
@@ -218,17 +188,17 @@ pristine_delete_while_open(const svn_test_opts_t *opts,
SVN_ERR(create_repos_and_wc(&wc_abspath, &db,
"pristine_delete_while_open", opts, pool));
- SVN_ERR(svn_wc__db_pristine_get_tempdir(&pristine_tmp_dir, db,
- wc_abspath, pool, pool));
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&pristine_stream,
+ &install_data,
+ &data_sha1, &data_md5,
+ db, wc_abspath,
+ pool, pool));
- /* Install a pristine text. */
- {
- const char *path;
-
- SVN_ERR(write_and_checksum_temp_file(&path, &data_sha1, &data_md5,
- data, pristine_tmp_dir, pool));
- SVN_ERR(svn_wc__db_pristine_install(db, path, data_sha1, data_md5, pool));
- }
+ sz = strlen(data);
+ SVN_ERR(svn_stream_write(pristine_stream, data, &sz));
+ SVN_ERR(svn_stream_close(pristine_stream));
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
+ data_sha1, data_md5, pool));
/* Open it for reading */
SVN_ERR(svn_wc__db_pristine_read(&contents, NULL, db, wc_abspath, data_sha1,
@@ -242,7 +212,7 @@ pristine_delete_while_open(const svn_test_opts_t *opts,
char buffer[4];
apr_size_t len = 4;
- SVN_ERR(svn_stream_read(contents, buffer, &len));
+ SVN_ERR(svn_stream_read_full(contents, buffer, &len));
SVN_TEST_ASSERT(len == 4);
SVN_TEST_ASSERT(memcmp(buffer, data, len) == 0);
}
@@ -276,7 +246,6 @@ reject_mismatching_text(const svn_test_opts_t *opts,
#ifdef SVN_DEBUG /* The pristine store only checks this in debug mode. */
svn_wc__db_t *db;
const char *wc_abspath;
- const char *pristine_tmp_dir;
const char data[] = "Blah";
svn_checksum_t *data_sha1, *data_md5;
@@ -286,28 +255,47 @@ reject_mismatching_text(const svn_test_opts_t *opts,
SVN_ERR(create_repos_and_wc(&wc_abspath, &db,
"reject_mismatching_text", opts, pool));
- SVN_ERR(svn_wc__db_pristine_get_tempdir(&pristine_tmp_dir, db,
- wc_abspath, pool, pool));
-
/* Install a pristine text. */
{
- const char *path;
-
- SVN_ERR(write_and_checksum_temp_file(&path, &data_sha1, &data_md5,
- data, pristine_tmp_dir, pool));
- SVN_ERR(svn_wc__db_pristine_install(db, path, data_sha1, data_md5, pool));
+ svn_wc__db_install_data_t *install_data;
+ svn_stream_t *pristine_stream;
+ apr_size_t sz;
+
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&pristine_stream,
+ &install_data,
+ &data_sha1, &data_md5,
+ db, wc_abspath,
+ pool, pool));
+
+ sz = strlen(data);
+ SVN_ERR(svn_stream_write(pristine_stream, data, &sz));
+ SVN_ERR(svn_stream_close(pristine_stream));
+
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
+ data_sha1, data_md5,
+ pool));
}
/* Try to install the wrong pristine text against the same checksum.
* Should fail. */
{
- svn_error_t *err;
- const char *path;
-
- SVN_ERR(write_and_checksum_temp_file(&path, NULL, NULL,
- data2, pristine_tmp_dir, pool));
- err = svn_wc__db_pristine_install(db, path, data_sha1, data_md5, pool);
- SVN_TEST_ASSERT_ERROR(err, SVN_ERR_WC_CORRUPT_TEXT_BASE);
+ svn_wc__db_install_data_t *install_data;
+ svn_stream_t *pristine_stream;
+ apr_size_t sz;
+
+ SVN_ERR(svn_wc__db_pristine_prepare_install(&pristine_stream,
+ &install_data,
+ &data_sha1, &data_md5,
+ db, wc_abspath,
+ pool, pool));
+
+ sz = strlen(data2);
+ SVN_ERR(svn_stream_write(pristine_stream, data2, &sz));
+ SVN_ERR(svn_stream_close(pristine_stream));
+
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
+ data_sha1, data_md5,
+ pool));
}
return SVN_NO_ERROR;
@@ -319,7 +307,9 @@ reject_mismatching_text(const svn_test_opts_t *opts,
}
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = -1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(pristine_write_read,
@@ -330,3 +320,5 @@ struct svn_test_descriptor_t test_funcs[] =
"reject_mismatching_text"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/utils.c b/subversion/tests/libsvn_wc/utils.c
index 1682b98..bebfc8a 100644
--- a/subversion/tests/libsvn_wc/utils.c
+++ b/subversion/tests/libsvn_wc/utils.c
@@ -22,8 +22,8 @@
#include "svn_error.h"
#include "svn_client.h"
+#include "svn_cmdline.h"
#include "svn_pools.h"
-#include "private/svn_dep_compat.h"
#include "utils.h"
@@ -33,10 +33,26 @@
#include "../../libsvn_wc/wc-queries.h"
#define SVN_WC__I_AM_WC_DB
#include "../../libsvn_wc/wc_db_private.h"
+#include "../../libsvn_wc/token-map.h"
+svn_error_t *
+svn_test__create_client_ctx(svn_client_ctx_t **ctx,
+ svn_test__sandbox_t *sbox,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(svn_client_create_context2(ctx, NULL, result_pool));
+
+ SVN_ERR(svn_test__init_auth_baton(&(*ctx)->auth_baton,
+ result_pool));
+
+ if (sbox)
+ (*ctx)->wc_ctx = sbox->wc_ctx;
+ return SVN_NO_ERROR;
+}
/* Create an empty repository and WC for the test TEST_NAME. Set *REPOS_URL
- * to the URL of the new repository and *WC_ABSPATH to the root path of the
+ * to the URL of the new repository, *REPOS_DIR to its local path and
+ * *WC_ABSPATH to the root path of the
* new WC.
*
* Create the repository and WC in subdirectories called
@@ -46,6 +62,7 @@
* Register the repo and WC to be cleaned up when the test suite exits. */
static svn_error_t *
create_repos_and_wc(const char **repos_url,
+ const char **repos_dir,
const char **wc_abspath,
const char *test_name,
const svn_test_opts_t *opts,
@@ -66,8 +83,6 @@ create_repos_and_wc(const char **repos_url,
/* Create a repos. Register it for clean-up. Set *REPOS_URL to its path. */
{
- svn_repos_t *repos;
-
/* Use a subpool to create the repository and then destroy the subpool
so the repository's underlying filesystem is closed. If opts->fs_type
is BDB this prevents any attempt to open a second environment handle
@@ -75,8 +90,8 @@ create_repos_and_wc(const char **repos_url,
only a single environment handle to be open per process. */
apr_pool_t *subpool = svn_pool_create(pool);
- SVN_ERR(svn_test__create_repos(&repos, repos_path, opts, subpool));
- SVN_ERR(svn_uri_get_file_url_from_dirent(repos_url, repos_path, pool));
+ SVN_ERR(svn_test__create_repos2(NULL, repos_url, repos_dir, repos_path,
+ opts, pool, subpool));
svn_pool_destroy(subpool);
}
@@ -86,7 +101,7 @@ create_repos_and_wc(const char **repos_url,
svn_client_ctx_t *ctx;
svn_opt_revision_t head_rev = { svn_opt_revision_head, {0} };
- SVN_ERR(svn_client_create_context2(&ctx, NULL, subpool));
+ SVN_ERR(svn_test__create_client_ctx(&ctx, NULL, subpool));
SVN_ERR(svn_dirent_get_absolute(wc_abspath, wc_path, pool));
SVN_ERR(svn_client_checkout3(NULL, *repos_url, *wc_abspath,
&head_rev, &head_rev, svn_depth_infinity,
@@ -102,44 +117,151 @@ create_repos_and_wc(const char **repos_url,
return SVN_NO_ERROR;
}
-
WC_QUERIES_SQL_DECLARE_STATEMENTS(statements);
svn_error_t *
svn_test__create_fake_wc(const char *wc_abspath,
const char *extra_statements,
- apr_pool_t *result_pool,
+ const svn_test__nodes_data_t nodes[],
+ const svn_test__actual_data_t actuals[],
+
apr_pool_t *scratch_pool)
{
const char *dotsvn_abspath = svn_dirent_join(wc_abspath, ".svn",
scratch_pool);
- const char *db_abspath = svn_dirent_join(dotsvn_abspath, "wc.db",
- scratch_pool);
svn_sqlite__db_t *sdb;
const char **my_statements;
int i;
+ svn_sqlite__stmt_t *stmt;
+ const apr_int64_t wc_id = 1;
/* Allocate MY_STATEMENTS in RESULT_POOL because the SDB will continue to
* refer to it over its lifetime. */
- my_statements = apr_palloc(result_pool, 6 * sizeof(const char *));
+ my_statements = apr_palloc(scratch_pool, 7 * sizeof(const char *));
my_statements[0] = statements[STMT_CREATE_SCHEMA];
my_statements[1] = statements[STMT_CREATE_NODES];
my_statements[2] = statements[STMT_CREATE_NODES_TRIGGERS];
my_statements[3] = statements[STMT_CREATE_EXTERNALS];
- my_statements[4] = extra_statements;
- my_statements[5] = NULL;
+ my_statements[4] = statements[STMT_INSTALL_SCHEMA_STATISTICS];
+ my_statements[5] = extra_statements;
+ my_statements[6] = NULL;
/* Create fake-wc/SUBDIR/.svn/ for placing the metadata. */
SVN_ERR(svn_io_make_dir_recursively(dotsvn_abspath, scratch_pool));
-
- svn_error_clear(svn_io_remove_file2(db_abspath, FALSE, scratch_pool));
SVN_ERR(svn_wc__db_util_open_db(&sdb, wc_abspath, "wc.db",
svn_sqlite__mode_rwcreate,
- FALSE /* exclusive */, my_statements,
- result_pool, scratch_pool));
+ FALSE /* exclusive */, 0 /* timeout */,
+ my_statements,
+ scratch_pool, scratch_pool));
for (i = 0; my_statements[i] != NULL; i++)
SVN_ERR(svn_sqlite__exec_statements(sdb, /* my_statements[] */ i));
+ SVN_ERR(svn_sqlite__close(sdb));
+
+ if (!nodes && !actuals)
+ return SVN_NO_ERROR;
+
+ /* Re-open with normal set of statements */
+ SVN_ERR(svn_wc__db_util_open_db(&sdb, wc_abspath, "wc.db",
+ svn_sqlite__mode_readwrite,
+ FALSE /* exclusive */, 0 /* timeout */,
+ statements,
+ scratch_pool, scratch_pool));
+
+ if (nodes)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_INSERT_NODE));
+
+ for (i = 0; nodes[i].local_relpath; i++)
+ {
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdsnnns",
+ wc_id,
+ nodes[i].local_relpath,
+ nodes[i].op_depth,
+ nodes[i].local_relpath[0]
+ ? svn_relpath_dirname(nodes[i].local_relpath,
+ scratch_pool)
+ : NULL,
+ nodes[i].presence));
+
+ if (nodes[i].repos_relpath)
+ {
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 5, nodes[i].repos_id));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 6, nodes[i].repos_relpath));
+ SVN_ERR(svn_sqlite__bind_revnum(stmt, 7, nodes[i].revision));
+ }
+
+ if (nodes[i].depth)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 9, nodes[i].depth));
+
+ if (nodes[i].kind != 0)
+ SVN_ERR(svn_sqlite__bind_token(stmt, 10, kind_map, nodes[i].kind));
+
+ if (nodes[i].last_author || nodes[i].last_date)
+ {
+ SVN_ERR(svn_sqlite__bind_revnum(stmt, 11, nodes[i].last_revision));
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 12, nodes[i].last_date));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 13, nodes[i].last_author));
+ }
+
+ if (nodes[i].checksum)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 14, nodes[i].checksum));
+
+ if (nodes[i].properties)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 15, nodes[i].properties));
+
+ if (nodes[i].recorded_size || nodes[i].recorded_time)
+ {
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 16, nodes[i].recorded_size));
+ SVN_ERR(svn_sqlite__bind_int64(stmt, 17, nodes[i].recorded_time));
+ }
+
+ /* 18 is DAV cache */
+
+ if (nodes[i].symlink_target)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 19, nodes[i].symlink_target));
+
+ if (nodes[i].file_external)
+ SVN_ERR(svn_sqlite__bind_int(stmt, 20, 1));
+
+ if (nodes[i].moved_to)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 21, nodes[i].moved_to));
+
+ if (nodes[i].moved_here)
+ SVN_ERR(svn_sqlite__bind_int(stmt, 22, 1));
+
+ if (nodes[i].inherited_props)
+ SVN_ERR(svn_sqlite__bind_text(stmt, 23, nodes[i].inherited_props));
+
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+ }
+
+ if (actuals)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_INSERT_ACTUAL_NODE));
+
+ for (i = 0; actuals[i].local_relpath; i++)
+ {
+ SVN_ERR(svn_sqlite__bindf(stmt, "isssss",
+ wc_id,
+ actuals[i].local_relpath,
+ actuals[i].local_relpath[0]
+ ? svn_relpath_dirname(actuals[i].local_relpath,
+ scratch_pool)
+ : NULL,
+ actuals[i].properties,
+ actuals[i].changelist,
+ actuals[i].conflict_data));
+
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+ }
+
+ SVN_ERR(svn_sqlite__close(sdb));
+
return SVN_NO_ERROR;
}
@@ -151,19 +273,28 @@ svn_test__sandbox_create(svn_test__sandbox_t *sandbox,
apr_pool_t *pool)
{
sandbox->pool = pool;
- SVN_ERR(create_repos_and_wc(&sandbox->repos_url, &sandbox->wc_abspath,
+ SVN_ERR(create_repos_and_wc(&sandbox->repos_url, &sandbox->repos_dir,
+ &sandbox->wc_abspath,
test_name, opts, pool));
SVN_ERR(svn_wc_context_create(&sandbox->wc_ctx, NULL, pool, pool));
return SVN_NO_ERROR;
}
-void
+svn_error_t *
sbox_file_write(svn_test__sandbox_t *b, const char *path, const char *text)
{
- FILE *f = fopen(sbox_wc_path(b, path), "w");
+ apr_file_t *f;
- fputs(text, f);
- fclose(f);
+ SVN_ERR(svn_io_file_open(&f, sbox_wc_path(b, path),
+ (APR_WRITE | APR_CREATE | APR_TRUNCATE),
+ APR_OS_DEFAULT,
+ b->pool));
+
+ SVN_ERR(svn_io_file_write_full(f, text, strlen(text), NULL, b->pool));
+
+ SVN_ERR(svn_io_file_close(f, b->pool));
+
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -175,7 +306,8 @@ sbox_wc_add(svn_test__sandbox_t *b, const char *path)
parent_abspath = svn_dirent_dirname(path, b->pool);
SVN_ERR(svn_wc__acquire_write_lock(NULL, b->wc_ctx, parent_abspath, FALSE,
b->pool, b->pool));
- SVN_ERR(svn_wc_add_from_disk2(b->wc_ctx, path, NULL /*props*/,
+ SVN_ERR(svn_wc_add_from_disk3(b->wc_ctx, path, NULL /*props*/,
+ FALSE /* skip checks */,
NULL, NULL, b->pool));
SVN_ERR(svn_wc__release_write_lock(b->wc_ctx, parent_abspath, b->pool));
return SVN_NO_ERROR;
@@ -241,8 +373,7 @@ sbox_wc_copy_url(svn_test__sandbox_t *b, const char *from_url,
scratch_pool, 1,
sizeof(svn_client_copy_source_t *));
- SVN_ERR(svn_client_create_context2(&ctx, NULL, scratch_pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, scratch_pool));
if (SVN_IS_VALID_REVNUM(revision))
{
@@ -258,8 +389,14 @@ sbox_wc_copy_url(svn_test__sandbox_t *b, const char *from_url,
APR_ARRAY_PUSH(sources, svn_client_copy_source_t *) = src;
- SVN_ERR(svn_client_copy6(sources, sbox_wc_path(b, to_path),
- FALSE, FALSE, FALSE, NULL, NULL, NULL,
+ SVN_ERR(svn_client_copy7(sources, sbox_wc_path(b, to_path),
+ FALSE /* copy_as_child */,
+ FALSE /* make_parents */,
+ FALSE /* ignore_externals */,
+ FALSE /* metadata_only */,
+ FALSE, NULL /* pin_external */,
+ NULL /* revprops */,
+ NULL, NULL, /* commit_callback */
ctx, scratch_pool));
ctx->wc_ctx = NULL;
@@ -283,7 +420,11 @@ sbox_wc_revert(svn_test__sandbox_t *b, const char *path, svn_depth_t depth)
SVN_ERR(svn_wc__acquire_write_lock(&lock_root_abspath, b->wc_ctx,
dir_abspath, FALSE /* lock_anchor */,
b->pool, b->pool));
- SVN_ERR(svn_wc_revert4(b->wc_ctx, abspath, depth, FALSE, NULL,
+ SVN_ERR(svn_wc_revert5(b->wc_ctx, abspath, depth,
+ FALSE /* use_commit_times */,
+ NULL /* changelist_filter */,
+ FALSE /* clear_changelists */,
+ FALSE /* metadata_only */,
NULL, NULL, /* cancel baton + func */
NULL, NULL, /* notify baton + func */
b->pool));
@@ -335,8 +476,7 @@ sbox_wc_commit_ex(svn_test__sandbox_t *b,
apr_pool_t *scratch_pool = svn_pool_create(b->pool);
svn_error_t *err;
- SVN_ERR(svn_client_create_context2(&ctx, NULL, scratch_pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, scratch_pool));
/* A successfull commit doesn't close the ra session, but leaves that
to the caller. This leaves the BDB handle open, which might cause
@@ -377,12 +517,19 @@ sbox_wc_update_depth(svn_test__sandbox_t *b,
sizeof(const char *));
svn_opt_revision_t revision;
- revision.kind = svn_opt_revision_number;
- revision.value.number = revnum;
+ if (SVN_IS_VALID_REVNUM(revnum))
+ {
+ revision.kind = svn_opt_revision_number;
+ revision.value.number = revnum;
+ }
+ else
+ {
+ revision.kind = svn_opt_revision_head;
+ }
APR_ARRAY_PUSH(paths, const char *) = sbox_wc_path(b, path);
- SVN_ERR(svn_client_create_context2(&ctx, NULL, b->pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
+
return svn_client_update4(&result_revs, paths, &revision, depth,
sticky, FALSE, FALSE, FALSE, FALSE,
ctx, b->pool);
@@ -405,9 +552,9 @@ sbox_wc_switch(svn_test__sandbox_t *b,
svn_revnum_t result_rev;
svn_opt_revision_t head_rev = { svn_opt_revision_head, {0} };
- url = apr_pstrcat(b->pool, b->repos_url, url, (char*)NULL);
- SVN_ERR(svn_client_create_context2(&ctx, NULL, b->pool));
- ctx->wc_ctx = b->wc_ctx;
+ url = apr_pstrcat(b->pool, b->repos_url, url, SVN_VA_NULL);
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
+
return svn_client_switch3(&result_rev, sbox_wc_path(b, path), url,
&head_rev, &head_rev, depth,
FALSE /* depth_is_sticky */,
@@ -452,14 +599,43 @@ sbox_wc_resolve(svn_test__sandbox_t *b, const char *path, svn_depth_t depth,
}
svn_error_t *
+sbox_wc_resolve_prop(svn_test__sandbox_t *b, const char *path,
+ const char *propname,
+ svn_wc_conflict_choice_t conflict_choice)
+{
+ const char *lock_abspath;
+ svn_error_t *err;
+
+ SVN_ERR(svn_wc__acquire_write_lock_for_resolve(&lock_abspath, b->wc_ctx,
+ sbox_wc_path(b, path),
+ b->pool, b->pool));
+ err = svn_wc__resolve_conflicts(b->wc_ctx, sbox_wc_path(b, path),
+ svn_depth_empty,
+ FALSE,
+ propname,
+ FALSE,
+ conflict_choice,
+ NULL, NULL, /* conflict func */
+ NULL, NULL, /* cancellation */
+ NULL, NULL, /* notification */
+ b->pool);
+
+ err = svn_error_compose_create(err, svn_wc__release_write_lock(b->wc_ctx,
+ lock_abspath,
+ b->pool));
+ return err;
+}
+
+
+svn_error_t *
sbox_wc_move(svn_test__sandbox_t *b, const char *src, const char *dst)
{
svn_client_ctx_t *ctx;
apr_array_header_t *paths = apr_array_make(b->pool, 1,
sizeof(const char *));
- SVN_ERR(svn_client_create_context2(&ctx, NULL, b->pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
+
APR_ARRAY_PUSH(paths, const char *) = sbox_wc_path(b, src);
return svn_client_move7(paths, sbox_wc_path(b, dst),
FALSE /* move_as_child */,
@@ -482,8 +658,8 @@ sbox_wc_propset(svn_test__sandbox_t *b,
sizeof(const char *));
svn_string_t *pval = value ? svn_string_create(value, b->pool) : NULL;
- SVN_ERR(svn_client_create_context2(&ctx, NULL, b->pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
+
APR_ARRAY_PUSH(paths, const char *) = sbox_wc_path(b, path);
return svn_client_propset_local(name, pval, paths, svn_depth_empty,
TRUE /* skip_checks */,
@@ -497,8 +673,7 @@ sbox_wc_relocate(svn_test__sandbox_t *b,
apr_pool_t *scratch_pool = b->pool;
svn_client_ctx_t *ctx;
- SVN_ERR(svn_client_create_context2(&ctx, NULL, scratch_pool));
- ctx->wc_ctx = b->wc_ctx;
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, scratch_pool));
SVN_ERR(svn_client_relocate2(b->wc_abspath, b->repos_url,
new_repos_url, FALSE, ctx,scratch_pool));
@@ -517,7 +692,7 @@ sbox_add_and_commit_greek_tree(svn_test__sandbox_t *b)
{
if (node->contents)
{
- sbox_file_write(b, node->path, node->contents);
+ SVN_ERR(sbox_file_write(b, node->path, node->contents));
SVN_ERR(sbox_wc_add(b, node->path));
}
else
diff --git a/subversion/tests/libsvn_wc/utils.h b/subversion/tests/libsvn_wc/utils.h
index 3004634..260139d 100644
--- a/subversion/tests/libsvn_wc/utils.h
+++ b/subversion/tests/libsvn_wc/utils.h
@@ -25,6 +25,8 @@
#include <apr_pools.h>
#include "svn_error.h"
+#include "svn_client.h"
+
#include "../svn_test.h"
#ifdef __cplusplus
@@ -53,6 +55,8 @@ typedef struct svn_test__sandbox_t
svn_wc_context_t *wc_ctx;
/* The repository URL. */
const char *repos_url;
+ /* Local path to the repository */
+ const char *repos_dir;
/* The absolute local path of the WC root. */
const char *wc_abspath;
/* A pool that can be used for all allocations. */
@@ -83,7 +87,7 @@ svn_test__sandbox_create(svn_test__sandbox_t *sandbox,
(svn_dirent_join((b)->wc_abspath, (path), (b)->pool))
/* Create a file on disk at PATH, with TEXT as its content. */
-void
+svn_error_t *
sbox_file_write(svn_test__sandbox_t *b, const char *path, const char *text);
/* Schedule for addition the single node that exists on disk at PATH,
@@ -162,6 +166,12 @@ sbox_wc_resolve(svn_test__sandbox_t *b, const char *path, svn_depth_t depth,
/* */
svn_error_t *
+sbox_wc_resolve_prop(svn_test__sandbox_t *b, const char *path,
+ const char *propname,
+ svn_wc_conflict_choice_t conflict_choice);
+
+/* */
+svn_error_t *
sbox_wc_move(svn_test__sandbox_t *b, const char *src, const char *dst);
/* Set property NAME to VALUE on PATH. If VALUE=NULL, delete the property. */
@@ -175,6 +185,39 @@ sbox_wc_propset(svn_test__sandbox_t *b,
svn_error_t *
sbox_add_and_commit_greek_tree(svn_test__sandbox_t *b);
+/* Initial data to store in NODES */
+typedef struct svn_test__nodes_data_t
+{
+ int op_depth;
+ const char *local_relpath;
+ const char *presence;
+ int repos_id;
+ const char *repos_relpath;
+ svn_revnum_t revision;
+ svn_boolean_t moved_here;
+ const char *moved_to;
+ svn_node_kind_t kind;
+ const char *properties;
+ const char *depth;
+ const char *checksum;
+ const char *symlink_target;
+ svn_revnum_t last_revision;
+ apr_time_t last_date;
+ const char *last_author;
+ svn_boolean_t file_external;
+ const char *inherited_props;
+ svn_filesize_t recorded_size;
+ apr_time_t recorded_time;
+} svn_test__nodes_data_t;
+
+/* Initial data to store in ACTUAL */
+typedef struct svn_test__actual_data_t
+{
+ const char *local_relpath;
+ const char *properties;
+ const char *changelist;
+ const char *conflict_data;
+} svn_test__actual_data_t;
/* Create a WC directory at WC_ABSPATH containing a fake WC DB, generated by
* executing the SQL statements EXTRA_STATEMENTS in addition to the standard
@@ -182,10 +225,18 @@ sbox_add_and_commit_greek_tree(svn_test__sandbox_t *b);
svn_error_t *
svn_test__create_fake_wc(const char *wc_abspath,
const char *extra_statements,
- apr_pool_t *result_pool,
+ const svn_test__nodes_data_t nodes[],
+ const svn_test__actual_data_t actuals[],
apr_pool_t *scratch_pool);
+/* Create a client context for the specified sandbox */
+svn_error_t *
+svn_test__create_client_ctx(svn_client_ctx_t **ctx,
+ svn_test__sandbox_t *sbox,
+ apr_pool_t *result_pool);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/tests/libsvn_wc/wc-lock-tester.c b/subversion/tests/libsvn_wc/wc-lock-tester.c
index d72c536..1daee66 100644
--- a/subversion/tests/libsvn_wc/wc-lock-tester.c
+++ b/subversion/tests/libsvn_wc/wc-lock-tester.c
@@ -35,16 +35,19 @@
#include "private/svn_wc_private.h"
#include "../../libsvn_wc/wc.h"
#include "../../libsvn_wc/wc_db.h"
+#include "../../libsvn_wc/workqueue.h"
#include "svn_private_config.h"
#define USAGE_MSG \
- "Usage: %s [-r|-1] DIRNAME\n" \
+ "Usage: %s [-1|-r|-w] DIRNAME\n" \
"\n" \
- "Locks one directory (-1), or a tree recursively (-r)\n"
+ "Locks one directory (-1), or a tree recursively (-r), or locks\n" \
+ "recursively and creates an outstanding work queue item (-w)\n"
static svn_error_t *
obtain_lock(const char *path, svn_boolean_t recursive,
+ svn_boolean_t populate_work_queue,
apr_pool_t *scratch_pool)
{
const char *local_abspath;
@@ -52,9 +55,7 @@ obtain_lock(const char *path, svn_boolean_t recursive,
SVN_ERR(svn_path_cstring_to_utf8(&path, path, scratch_pool));
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
-
- SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, scratch_pool,
- scratch_pool));
+ SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, scratch_pool, scratch_pool));
if (recursive)
{
@@ -68,6 +69,19 @@ obtain_lock(const char *path, svn_boolean_t recursive,
scratch_pool));
}
+ if (populate_work_queue)
+ {
+ svn_skel_t *work_item;
+
+ /* Add an arbitrary work item to the work queue for DB, but don't
+ * run the work queue. */
+ SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, wc_ctx->db,
+ local_abspath, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_wc__db_wq_add(wc_ctx->db, local_abspath, work_item,
+ scratch_pool));
+ }
+
SVN_ERR(svn_cmdline_printf(scratch_pool, "Lock on '%s' obtained, and we "
"are not going to release it.\n",
svn_dirent_local_style(local_abspath,
@@ -83,9 +97,11 @@ main(int argc, const char *argv[])
int exit_code = EXIT_SUCCESS;
svn_error_t *err;
svn_boolean_t recursive;
+ svn_boolean_t populate_work_queue;
if (argc != 3
- || (strcmp(argv[1], "-1") && apr_strnatcmp(argv[1], "-r")))
+ || (strcmp(argv[1], "-1") && apr_strnatcmp(argv[1], "-r") &&
+ apr_strnatcmp(argv[1], "-w")))
{
fprintf(stderr, USAGE_MSG, argv[0]);
exit(EXIT_FAILURE);
@@ -100,9 +116,10 @@ main(int argc, const char *argv[])
/* set up the global pool */
pool = svn_pool_create(NULL);
- recursive = (strcmp(argv[1], "-1") != 0);
+ populate_work_queue = (strcmp(argv[1], "-w") == 0);
+ recursive = ((strcmp(argv[1], "-1") != 0) || populate_work_queue);
- err = obtain_lock(argv[2], recursive, pool);
+ err = obtain_lock(argv[2], recursive, populate_work_queue, pool);
if (err)
{
diff --git a/subversion/tests/libsvn_wc/wc-queries-test.c b/subversion/tests/libsvn_wc/wc-queries-test.c
index 0621720..d63aa57 100644
--- a/subversion/tests/libsvn_wc/wc-queries-test.c
+++ b/subversion/tests/libsvn_wc/wc-queries-test.c
@@ -22,6 +22,7 @@
*/
#include "svn_pools.h"
+#include "svn_hash.h"
#include "svn_ctype.h"
#include "private/svn_dep_compat.h"
@@ -30,22 +31,17 @@
#include "../svn_test.h"
#ifdef SVN_SQLITE_INLINE
-/* Include sqlite3 inline, making all symbols private. */
- #define SQLITE_API static
- #ifdef __APPLE__
- #include <Availability.h>
- #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
- /* <libkern/OSAtomic.h> is included on OS X by sqlite3.c, and
- on old systems (Leopard or older), it cannot be compiled
- with -std=c89 because it uses inline. This is a work-around. */
- #define inline __inline__
- #include <libkern/OSAtomic.h>
- #undef inline
- #endif
- #endif
- #include <sqlite3.c>
+/* Import the sqlite3 API vtable from sqlite3wrapper.c */
+# define SQLITE_OMIT_DEPRECATED
+# include <sqlite3ext.h>
+extern const sqlite3_api_routines *const svn_sqlite3__api_funcs;
+extern int (*const svn_sqlite3__api_initialize)(void);
+extern int (*const svn_sqlite3__api_config)(int, ...);
+# define sqlite3_api svn_sqlite3__api_funcs
+# define sqlite3_initialize svn_sqlite3__api_initialize
+# define sqlite3_config svn_sqlite3__api_config
#else
- #include <sqlite3.h>
+# include <sqlite3.h>
#endif
#include "../../libsvn_wc/wc-queries.h"
@@ -56,7 +52,7 @@ WC_QUERIES_SQL_DECLARE_STATEMENT_INFO(wc_query_info);
/* The first query after the normal wc queries */
#define STMT_SCHEMA_FIRST STMT_CREATE_SCHEMA
-#define SQLITE_ERR(x) \
+#define SQLITE_ERR(x) do \
{ \
int sqlite_err__temp = (x); \
if (sqlite_err__temp != SQLITE_OK) \
@@ -101,6 +97,7 @@ static const int slow_statements[] =
/* Full temporary table read */
STMT_INSERT_ACTUAL_EMPTIES,
+ STMT_INSERT_ACTUAL_EMPTIES_FILES,
STMT_SELECT_REVERT_LIST_RECURSIVE,
STMT_SELECT_DELETE_LIST,
STMT_SELECT_UPDATE_MOVE_LIST,
@@ -177,15 +174,15 @@ create_memory_db(sqlite3 **db,
static svn_error_t *
test_sqlite_version(apr_pool_t *scratch_pool)
{
- printf("DBG: Using Sqlite %s\n", sqlite3_version);
+ printf("DBG: Using Sqlite %s\n", sqlite3_libversion());
if (sqlite3_libversion_number() != SQLITE_VERSION_NUMBER)
- printf("DBG: Compiled against Sqlite %s", SQLITE_VERSION);
+ printf("DBG: Compiled against Sqlite %s\n", SQLITE_VERSION);
if (sqlite3_libversion_number() < SQLITE_VERSION_NUMBER)
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"Compiled against Sqlite %s (at runtime we have Sqlite %s)",
- SQLITE_VERSION, sqlite3_version);
+ SQLITE_VERSION, sqlite3_libversion());
#if !SQLITE_VERSION_AT_LEAST(3, 7, 9)
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
@@ -307,14 +304,21 @@ parse_explanation_item(struct explanation_item **parsed_item,
item->search = TRUE; /* Search or scan */
token = apr_strtok(NULL, " ", &last);
- if (!MATCH_TOKEN(token, "TABLE"))
+ if (MATCH_TOKEN(token, "TABLE"))
+ {
+ item->table = apr_strtok(NULL, " ", &last);
+ }
+ else if (MATCH_TOKEN(token, "SUBQUERY"))
+ {
+ item->table = apr_psprintf(result_pool, "SUBQUERY-%s",
+ apr_strtok(NULL, " ", &last));
+ }
+ else
{
printf("DBG: Expected 'TABLE', got '%s' in '%s'\n", token, text);
return SVN_NO_ERROR; /* Nothing to parse */
}
- item->table = apr_strtok(NULL, " ", &last);
-
token = apr_strtok(NULL, " ", &last);
/* Skip alias */
@@ -418,7 +422,7 @@ parse_explanation_item(struct explanation_item **parsed_item,
return SVN_NO_ERROR;
}
- /* Parsing successfull */
+ /* Parsing successful */
}
else if (MATCH_TOKEN(item->operation, "EXECUTE"))
{
@@ -606,7 +610,7 @@ test_query_expectations(apr_pool_t *scratch_pool)
apr_pstrcat(iterpool,
"EXPLAIN QUERY PLAN ",
wc_queries[i],
- NULL),
+ SVN_VA_NULL),
-1, &stmt, &tail);
if (r != SQLITE_OK)
@@ -744,6 +748,105 @@ test_query_expectations(apr_pool_t *scratch_pool)
return warnings;
}
+static svn_error_t *
+test_query_duplicates(apr_pool_t *scratch_pool)
+{
+ sqlite3 *sdb;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_error_t *warnings = NULL;
+ svn_boolean_t supports_query_info;
+ apr_hash_t *sha_to_query = apr_hash_make(scratch_pool);
+
+ SVN_ERR(create_memory_db(&sdb, scratch_pool));
+
+ SVN_ERR(supported_explain_query_plan(&supports_query_info, sdb,
+ scratch_pool));
+ if (!supports_query_info)
+ {
+ SQLITE_ERR(sqlite3_close(sdb));
+ return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+ "Sqlite doesn't support EXPLAIN QUERY PLAN");
+ }
+
+ for (i = 0; i < STMT_SCHEMA_FIRST; i++)
+ {
+ sqlite3_stmt *stmt;
+ const char *tail;
+ int r;
+ svn_stringbuf_t *result;
+ svn_checksum_t *checksum;
+
+ if (is_schema_statement(i))
+ continue;
+
+ /* Prepare statement to find if it is a single statement. */
+ r = sqlite3_prepare_v2(sdb, wc_queries[i], -1, &stmt, &tail);
+
+ if (r != SQLITE_OK)
+ continue; /* Parse failure is already reported by 'test_parable' */
+
+ SQLITE_ERR(sqlite3_finalize(stmt));
+ if (tail[0] != '\0')
+ continue; /* Multi-queries are currently not testable */
+
+ svn_pool_clear(iterpool);
+
+ r = sqlite3_prepare_v2(sdb,
+ apr_pstrcat(iterpool,
+ "EXPLAIN ",
+ wc_queries[i],
+ SVN_VA_NULL),
+ -1, &stmt, &tail);
+
+ if (r != SQLITE_OK)
+ continue; /* EXPLAIN not enabled or doesn't support this query */
+
+ result = svn_stringbuf_create_empty(iterpool);
+
+ while (SQLITE_ROW == (r = sqlite3_step(stmt)))
+ {
+ int col;
+
+ for (col = 0; col < sqlite3_column_count(stmt); col++)
+ {
+ const char *txt = (const char*)sqlite3_column_text(stmt, col);
+ if (txt)
+ svn_stringbuf_appendcstr(result, txt);
+
+ svn_stringbuf_appendcstr(result, "|");
+ }
+
+ svn_stringbuf_appendcstr(result, "\n");
+ }
+
+ SQLITE_ERR(sqlite3_reset(stmt));
+ SQLITE_ERR(sqlite3_finalize(stmt));
+
+ SVN_ERR(svn_checksum(&checksum, svn_checksum_sha1,
+ result->data, result->len,
+ iterpool));
+
+ {
+ const char *hex = svn_checksum_to_cstring(checksum, scratch_pool);
+ const char *other;
+
+ other = svn_hash_gets(sha_to_query, hex);
+ if (other)
+ {
+ warnings = svn_error_createf(SVN_ERR_TEST_FAILED, warnings,
+ "Query %s has an identical execution plan as %s",
+ wc_query_info[i][0], other);
+ }
+ else
+ svn_hash_sets(sha_to_query, hex, wc_query_info[i][0]);
+ }
+ }
+ SQLITE_ERR(sqlite3_close(sdb)); /* Close the DB if ok; otherwise leaked */
+
+ return warnings;
+}
+
/* Helper to verify a bit of data in the sqlite3 statistics */
static int
parse_stat_data(const char *stat)
@@ -824,6 +927,15 @@ test_schema_statistics(apr_pool_t *scratch_pool)
"VALUES (1, '', '')",
NULL, NULL, NULL));
+ SQLITE_ERR(
+ sqlite3_exec(sdb,
+ "INSERT INTO EXTERNALS (wc_id, local_relpath,"
+ " parent_relpath, repos_id,"
+ " presence, kind, def_local_relpath,"
+ " def_repos_relpath) "
+ "VALUES (1, 'subdir', '', 1, 'normal', 'dir', '', '')",
+ NULL, NULL, NULL));
+
/* These are currently not necessary for query optimization, but it's better
to tell Sqlite how we intend to use this table anyway */
SQLITE_ERR(
@@ -882,7 +994,62 @@ test_schema_statistics(apr_pool_t *scratch_pool)
return SVN_NO_ERROR;
}
-struct svn_test_descriptor_t test_funcs[] =
+/* An SQLite application defined function that allows SQL queries to
+ use "relpath_depth(local_relpath)". */
+static void relpath_depth_sqlite(sqlite3_context* context,
+ int argc,
+ sqlite3_value* values[])
+{
+ SVN_ERR_MALFUNCTION_NO_RETURN(); /* STUB! */
+}
+
+/* Parse all verify/check queries */
+static svn_error_t *
+test_verify_parsable(apr_pool_t *scratch_pool)
+{
+ sqlite3 *sdb;
+ int i;
+
+ SVN_ERR(create_memory_db(&sdb, scratch_pool));
+
+ SQLITE_ERR(sqlite3_create_function(sdb, "relpath_depth", 1, SQLITE_ANY, NULL,
+ relpath_depth_sqlite, NULL, NULL));
+
+ for (i=STMT_VERIFICATION_TRIGGERS; wc_queries[i]; i++)
+ {
+ sqlite3_stmt *stmt;
+ const char *text = wc_queries[i];
+
+ /* Some of our statement texts contain multiple queries. We prepare
+ them all. */
+ while (*text != '\0')
+ {
+ const char *tail;
+ int r = sqlite3_prepare_v2(sdb, text, -1, &stmt, &tail);
+
+ if (r != SQLITE_OK)
+ return svn_error_createf(SVN_ERR_SQLITE_ERROR, NULL,
+ "Preparing %s failed: %s\n%s",
+ wc_query_info[i][0],
+ sqlite3_errmsg(sdb),
+ text);
+
+ SQLITE_ERR(sqlite3_finalize(stmt));
+
+ /* Continue after the current statement */
+ text = tail;
+ }
+ }
+
+ SQLITE_ERR(sqlite3_close(sdb)); /* Close the DB if ok; otherwise leaked */
+
+ return SVN_NO_ERROR;
+}
+
+
+static int max_threads = 1;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_sqlite_version,
@@ -891,7 +1058,13 @@ struct svn_test_descriptor_t test_funcs[] =
"queries are parsable"),
SVN_TEST_PASS2(test_query_expectations,
"test query expectations"),
+ SVN_TEST_PASS2(test_query_duplicates,
+ "test query duplicates"),
SVN_TEST_PASS2(test_schema_statistics,
"test schema statistics"),
+ SVN_TEST_PASS2(test_verify_parsable,
+ "verify queries are parsable"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/libsvn_wc/wc-test-queries.h b/subversion/tests/libsvn_wc/wc-test-queries.h
new file mode 100644
index 0000000..4b5060c
--- /dev/null
+++ b/subversion/tests/libsvn_wc/wc-test-queries.h
@@ -0,0 +1,112 @@
+/* This file is automatically generated from wc-test-queries.sql and .dist_sandbox/subversion-1.9.7/subversion/tests/libsvn_wc/token-map.h.
+ * Do not edit this file -- edit the source and rerun gen-make.py */
+
+#define STMT_SELECT_NODES_INFO 0
+#define STMT_0_INFO {"STMT_SELECT_NODES_INFO", NULL}
+#define STMT_0 \
+ "SELECT op_depth, n.presence, n.local_relpath, revision, " \
+ " repos_path, file_external, def_local_relpath, moved_to, moved_here, " \
+ " properties " \
+ "FROM nodes n " \
+ "LEFT OUTER JOIN externals e " \
+ " ON n.wc_id = e.wc_id " \
+ " AND n.local_relpath = e.local_relpath " \
+ "WHERE n.wc_id = ?1 " \
+ " AND (n.local_relpath = ?2 OR (((n.local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((n.local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ ""
+
+#define STMT_SELECT_ACTUAL_INFO 1
+#define STMT_1_INFO {"STMT_SELECT_ACTUAL_INFO", NULL}
+#define STMT_1 \
+ "SELECT local_relpath " \
+ "FROM actual_node " \
+ "WHERE wc_id = ?1 " \
+ " AND conflict_data is NOT NULL " \
+ " AND (local_relpath = ?2 OR (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END))) " \
+ ""
+
+#define STMT_DELETE_NODES 2
+#define STMT_2_INFO {"STMT_DELETE_NODES", NULL}
+#define STMT_2 \
+ "DELETE FROM nodes; " \
+ ""
+
+#define STMT_INSERT_NODE 3
+#define STMT_3_INFO {"STMT_INSERT_NODE", NULL}
+#define STMT_3 \
+ "INSERT INTO nodes (local_relpath, op_depth, presence, repos_path, " \
+ " revision, parent_relpath, moved_to, moved_here, " \
+ " properties, wc_id, repos_id, kind, " \
+ " depth) " \
+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, 1, " \
+ " CASE WHEN ?3 != 'base-deleted' THEN 1 END, " \
+ " 'dir', " \
+ " CASE WHEN ?3 in ('normal', 'incomplete') " \
+ " THEN 'infinity' END) " \
+ ""
+
+#define STMT_DELETE_ACTUAL 4
+#define STMT_4_INFO {"STMT_DELETE_ACTUAL", NULL}
+#define STMT_4 \
+ "DELETE FROM actual_node; " \
+ ""
+
+#define STMT_INSERT_ACTUAL 5
+#define STMT_5_INFO {"STMT_INSERT_ACTUAL", NULL}
+#define STMT_5 \
+ "INSERT INTO actual_node (local_relpath, parent_relpath, changelist, wc_id) " \
+ " VALUES (?1, ?2, ?3, 1) " \
+ ""
+
+#define STMT_ENSURE_EMPTY_PRISTINE 6
+#define STMT_6_INFO {"STMT_ENSURE_EMPTY_PRISTINE", NULL}
+#define STMT_6 \
+ "INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) " \
+ " VALUES ('$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709', " \
+ " '$md5 $d41d8cd98f00b204e9800998ecf8427e', " \
+ " 0, 0) " \
+ ""
+
+#define STMT_NODES_SET_FILE 7
+#define STMT_7_INFO {"STMT_NODES_SET_FILE", NULL}
+#define STMT_7 \
+ "UPDATE nodes " \
+ " SET kind = 'file', " \
+ " checksum = '$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709', " \
+ " depth = NULL " \
+ "WHERE wc_id = 1 and local_relpath = ?1 " \
+ ""
+
+#define STMT_SELECT_ALL_ACTUAL 8
+#define STMT_8_INFO {"STMT_SELECT_ALL_ACTUAL", NULL}
+#define STMT_8 \
+ "SELECT local_relpath FROM actual_node WHERE wc_id = 1 " \
+ ""
+
+#define WC_TEST_QUERIES_SQL_DECLARE_STATEMENTS(varname) \
+ static const char * const varname[] = { \
+ STMT_0, \
+ STMT_1, \
+ STMT_2, \
+ STMT_3, \
+ STMT_4, \
+ STMT_5, \
+ STMT_6, \
+ STMT_7, \
+ STMT_8, \
+ NULL \
+ }
+
+#define WC_TEST_QUERIES_SQL_DECLARE_STATEMENT_INFO(varname) \
+ static const char * const varname[][2] = { \
+ STMT_0_INFO, \
+ STMT_1_INFO, \
+ STMT_2_INFO, \
+ STMT_3_INFO, \
+ STMT_4_INFO, \
+ STMT_5_INFO, \
+ STMT_6_INFO, \
+ STMT_7_INFO, \
+ STMT_8_INFO, \
+ {NULL, NULL} \
+ }
diff --git a/subversion/tests/libsvn_wc/wc-test-queries.sql b/subversion/tests/libsvn_wc/wc-test-queries.sql
new file mode 100644
index 0000000..613819a
--- /dev/null
+++ b/subversion/tests/libsvn_wc/wc-test-queries.sql
@@ -0,0 +1,78 @@
+/* wc-test-queries.sql -- queries used to verify wc metadata from
+ * the C tests.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+
+-- STMT_SELECT_NODES_INFO
+SELECT op_depth, n.presence, n.local_relpath, revision,
+ repos_path, file_external, def_local_relpath, moved_to, moved_here,
+ properties
+FROM nodes n
+LEFT OUTER JOIN externals e
+ ON n.wc_id = e.wc_id
+ AND n.local_relpath = e.local_relpath
+WHERE n.wc_id = ?1
+ AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
+
+-- STMT_SELECT_ACTUAL_INFO
+SELECT local_relpath
+FROM actual_node
+WHERE wc_id = ?1
+ AND conflict_data is NOT NULL
+ AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
+
+-- STMT_DELETE_NODES
+DELETE FROM nodes;
+
+-- STMT_INSERT_NODE
+INSERT INTO nodes (local_relpath, op_depth, presence, repos_path,
+ revision, parent_relpath, moved_to, moved_here,
+ properties, wc_id, repos_id, kind,
+ depth)
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, 1,
+ CASE WHEN ?3 != 'base-deleted' THEN 1 END,
+ 'dir',
+ CASE WHEN ?3 in ('normal', 'incomplete')
+ THEN 'infinity' END)
+
+-- STMT_DELETE_ACTUAL
+DELETE FROM actual_node;
+
+-- STMT_INSERT_ACTUAL
+INSERT INTO actual_node (local_relpath, parent_relpath, changelist, wc_id)
+ VALUES (?1, ?2, ?3, 1)
+
+-- STMT_ENSURE_EMPTY_PRISTINE
+INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
+ VALUES ('$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709',
+ '$md5 $d41d8cd98f00b204e9800998ecf8427e',
+ 0, 0)
+
+-- STMT_NODES_SET_FILE
+UPDATE nodes
+ SET kind = 'file',
+ checksum = '$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709',
+ depth = NULL
+WHERE wc_id = 1 and local_relpath = ?1
+
+-- STMT_SELECT_ALL_ACTUAL
+SELECT local_relpath FROM actual_node WHERE wc_id = 1
+
diff --git a/subversion/tests/libsvn_wc/wc-test.c b/subversion/tests/libsvn_wc/wc-test.c
index 30eb18a..8910cb0 100644
--- a/subversion/tests/libsvn_wc/wc-test.c
+++ b/subversion/tests/libsvn_wc/wc-test.c
@@ -23,6 +23,9 @@
#include <apr_pools.h>
#include <apr_general.h>
+#include <apr_md5.h>
+
+#define SVN_DEPRECATED
#include "svn_types.h"
#include "svn_io.h"
@@ -71,7 +74,7 @@ struct base_origin_t
};
/* Data for testing node_get_base and node_get_origin. */
-struct base_origin_t base_origin_subtests[] =
+static struct base_origin_t base_origin_subtests[] =
{
/* file copied onto nothing */
{ "A/C/copy1", -1, "iota", {"iota", 1} },
@@ -138,7 +141,6 @@ test_node_get_base(const svn_test_opts_t *opts, apr_pool_t *pool)
NULL,
b->wc_ctx, local_abspath,
TRUE /* ignore_enoent */,
- FALSE /* show_hidden */,
b->pool, b->pool));
SVN_TEST_ASSERT(revision == subtest->base_rev);
if (SVN_IS_VALID_REVNUM(subtest->base_rev))
@@ -181,6 +183,7 @@ test_node_get_origin(const svn_test_opts_t *opts, apr_pool_t *pool)
SVN_ERR(svn_wc__node_get_origin(NULL, &revision, &repos_relpath,
&repos_root_url, &repos_uuid, NULL,
+ NULL,
b->wc_ctx, local_abspath, FALSE,
b->pool, b->pool));
SVN_TEST_ASSERT(revision == subtest->origin.rev);
@@ -304,11 +307,139 @@ test_externals_parse_erratic(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_legacy_commit1(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ svn_wc_adm_access_t *adm_access;
+ const char *lambda;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "legacy_commit1", opts, pool));
+ SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+ SVN_ERR(sbox_wc_copy(&b, "A", "A_copied"));
+
+ lambda = sbox_wc_path(&b, "A_copied/B/lambda");
+
+
+ SVN_ERR(svn_io_remove_file2(lambda, FALSE, pool));
+ SVN_ERR(svn_io_copy_file(sbox_wc_path(&b, "iota"), lambda, FALSE, pool));
+ SVN_ERR(svn_wc_adm_open3(&adm_access, NULL, b.wc_abspath, TRUE, -1,
+ NULL, NULL, pool));
+
+ {
+ svn_wc_status2_t *status;
+
+ SVN_ERR(svn_wc_status2(&status, lambda, adm_access, pool));
+
+ SVN_TEST_ASSERT(status != NULL);
+ SVN_TEST_ASSERT(status->text_status == svn_wc_status_modified);
+ SVN_TEST_ASSERT(status->copied == TRUE);
+ }
+
+ /* Simulate a very old style svn ci . -m "QQQ" on the WC root */
+ SVN_ERR(svn_wc_process_committed4(sbox_wc_path(&b, "A_copied"), adm_access,
+ TRUE, 12, "2014-10-01T19:00:50.966679Z",
+ "me", NULL, TRUE, TRUE,
+ NULL, pool));
+
+ {
+ unsigned char digest[APR_MD5_DIGESTSIZE];
+
+ /* Use the fact that iota has the same checksum to ease committing */
+
+ SVN_ERR(svn_io_file_checksum (digest, lambda, pool));
+
+ SVN_ERR(svn_wc_process_committed4(lambda, adm_access,
+ TRUE, 12, "2014-10-01T19:00:50.966679Z",
+ "me", NULL, TRUE, TRUE,
+ digest, pool));
+ }
+
+ {
+ svn_wc_status2_t *status;
+
+ SVN_ERR(svn_wc_status2(&status, lambda, adm_access, pool));
+
+ /* Node is still modified, as we didn't change the text base! */
+ SVN_TEST_ASSERT(status != NULL);
+ SVN_TEST_ASSERT(status->text_status == svn_wc_status_normal);
+ SVN_TEST_ASSERT(status->copied == FALSE);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_legacy_commit2(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ svn_wc_adm_access_t *adm_access;
+ const char *lambda;
+ svn_wc_committed_queue_t *queue;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "legacy_commit2", opts, pool));
+ SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+ SVN_ERR(sbox_wc_copy(&b, "A", "A_copied"));
+
+ lambda = sbox_wc_path(&b, "A_copied/B/lambda");
+
+ SVN_ERR(svn_io_remove_file2(lambda, FALSE, pool));
+ SVN_ERR(svn_io_copy_file(sbox_wc_path(&b, "iota"), lambda, FALSE, pool));
+
+ SVN_ERR(svn_wc_adm_open3(&adm_access, NULL, b.wc_abspath, TRUE, -1,
+ NULL, NULL, pool));
+
+ {
+ svn_wc_status2_t *status;
+
+ SVN_ERR(svn_wc_status2(&status, lambda, adm_access, pool));
+
+ SVN_TEST_ASSERT(status != NULL);
+ SVN_TEST_ASSERT(status->text_status == svn_wc_status_modified);
+ SVN_TEST_ASSERT(status->copied == TRUE);
+ }
+
+ /* Simulate an old style svn ci . -m "QQQ" on the WC root */
+ queue = svn_wc_committed_queue_create(pool);
+ SVN_ERR(svn_wc_queue_committed(&queue, sbox_wc_path(&b, "A_copied"), adm_access,
+ TRUE, NULL, FALSE, FALSE, NULL, pool));
+ {
+ unsigned char digest[APR_MD5_DIGESTSIZE];
+
+ /* Use the fact that iota has the same checksum to ease committing */
+
+ SVN_ERR(svn_io_file_checksum(digest, lambda, pool));
+
+ SVN_ERR(svn_wc_queue_committed(&queue, lambda, adm_access, FALSE, NULL,
+ FALSE, FALSE, digest, pool));
+ }
+
+ SVN_ERR(svn_wc_process_committed_queue(queue, adm_access,
+ 12, "2014-10-01T19:00:50.966679Z",
+ "me", pool));
+
+ {
+ svn_wc_status2_t *status;
+
+ SVN_ERR(svn_wc_status2(&status, lambda, adm_access, pool));
+
+ /* Node is still modified, as we didn't change the text base! */
+ SVN_TEST_ASSERT(status != NULL);
+ SVN_TEST_ASSERT(status->text_status == svn_wc_status_normal);
+ SVN_TEST_ASSERT(status->copied == FALSE);
+ }
+
+ return SVN_NO_ERROR;
+}
/* ---------------------------------------------------------------------- */
/* The list of test functions */
-struct svn_test_descriptor_t test_funcs[] =
+static int max_threads = 2;
+
+static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_OPTS_PASS(test_node_get_base,
@@ -319,5 +450,11 @@ struct svn_test_descriptor_t test_funcs[] =
"test svn_wc_parse_externals_description3"),
SVN_TEST_PASS2(test_externals_parse_erratic,
"parse erratic externals definition"),
+ SVN_TEST_OPTS_PASS(test_legacy_commit1,
+ "test legacy commit1"),
+ SVN_TEST_OPTS_PASS(test_legacy_commit2,
+ "test legacy commit2"),
SVN_TEST_NULL
};
+
+SVN_TEST_MAIN
diff --git a/subversion/tests/svn_test.h b/subversion/tests/svn_test.h
index ab3a204..23e002e 100644
--- a/subversion/tests/svn_test.h
+++ b/subversion/tests/svn_test.h
@@ -27,6 +27,8 @@
#define SVN_DEPRECATED
#endif /* ! SVN_ENABLE_DEPRECATION_WARNINGS_IN_TESTS */
+#include <stdio.h>
+
#include <apr_pools.h>
#include "svn_delta.h"
@@ -34,6 +36,7 @@
#include "svn_types.h"
#include "svn_error.h"
#include "svn_string.h"
+#include "svn_auth.h"
#ifdef __cplusplus
extern "C" {
@@ -53,6 +56,23 @@ extern "C" {
#expr, __FILE__, __LINE__); \
} while (0)
+/**
+ * Macro for testing assumptions when the context does not allow
+ * returning an svn_error_t*.
+ *
+ * Will write to stderr and cause a segfault if EXPR is false.
+ */
+#define SVN_TEST_ASSERT_NO_RETURN(expr) \
+ do { \
+ if (!(expr)) \
+ { \
+ unsigned int z_e_r_o_p_a_g_e__; \
+ fprintf(stderr, "TEST ASSERTION FAILED: %s\n", #expr); \
+ z_e_r_o_p_a_g_e__ = *(volatile unsigned int*)0; \
+ *(volatile unsigned int*)0 = z_e_r_o_p_a_g_e__; \
+ } \
+ } while (0)
+
/** Handy macro for testing an expected svn_error_t return value.
* EXPECTED must be a real error (neither SVN_NO_ERROR nor APR_SUCCESS).
* The error returned by EXPR will be cleared.
@@ -63,12 +83,13 @@ extern "C" {
SVN_ERR_ASSERT((expected)); \
if (err__ == SVN_NO_ERROR || err__->apr_err != (expected)) \
return err__ ? svn_error_createf(SVN_ERR_TEST_FAILED, err__, \
- "Expected error %d but got %d", \
- (expected), \
- err__->apr_err) \
+ "Expected error %s but got %s", \
+ svn_error_symbolic_name(expected), \
+ svn_error_symbolic_name( \
+ err__->apr_err)) \
: svn_error_createf(SVN_ERR_TEST_FAILED, err__, \
- "Expected error %d but got %s", \
- (expected), \
+ "Expected error %s but got %s", \
+ svn_error_symbolic_name(expected), \
"SVN_NO_ERROR"); \
svn_error_clear(err__); \
} while (0)
@@ -77,7 +98,7 @@ extern "C" {
* The result must be neither SVN_NO_ERROR nor SVN_ERR_ASSERTION_FAIL.
* The error returned by EXPR will be cleared.
*/
-#define SVN_TEST__ASSERT_ANY_ERROR(expr) \
+#define SVN_TEST_ASSERT_ANY_ERROR(expr) \
do { \
svn_error_t *err__ = (expr); \
if (err__ == SVN_NO_ERROR || err__->apr_err == SVN_ERR_ASSERTION_FAIL)\
@@ -110,21 +131,46 @@ extern "C" {
tst_str2, tst_str1, __FILE__, __LINE__); \
} while(0)
+ /** Handy macro for testing integer equality.
+ */
+#define SVN_TEST_INT_ASSERT(expr, expected_expr) \
+ do { \
+ apr_int64_t tst_int1 = (expr); \
+ apr_int64_t tst_int2 = (expected_expr); \
+ \
+ if (tst_int1 != tst_int2) \
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, \
+ "Integers not equal\n" \
+ " Expected: %" APR_INT64_T_FMT "\n" \
+ " Found: %" APR_INT64_T_FMT "\n" \
+ "\n at %s:%d", \
+ tst_int2, tst_int1, __FILE__, __LINE__); \
+ } while(0)
+
/* Baton for any arguments that need to be passed from main() to svn
* test functions.
*/
typedef struct svn_test_opts_t
{
+ /* The name of the application (to generate unique names) */
+ const char *prog_name;
/* Description of the fs backend that should be used for testing. */
const char *fs_type;
/* Config file. */
const char *config_file;
/* Source dir. */
const char *srcdir;
+ /* Repository dir: temporary directory to create repositories in as subdir */
+ const char *repos_dir;
+ /* Repository url: The url to access REPOS_DIR as */
+ const char *repos_url;
+ /* Repository template: pre-created repository to copy for tests */
+ const char *repos_template;
/* Minor version to use for servers and FS backends, or zero to use
the current latest version. */
int server_minor_version;
+ svn_boolean_t verbose;
/* Add future "arguments" here. */
} svn_test_opts_t;
@@ -135,6 +181,11 @@ typedef svn_error_t* (*svn_test_driver2_t)(apr_pool_t *pool);
typedef svn_error_t* (*svn_test_driver_opts_t)(const svn_test_opts_t *opts,
apr_pool_t *pool);
+/* Prototype for test predicate functions. */
+typedef svn_boolean_t (*svn_test_predicate_func_t)(const svn_test_opts_t *opts,
+ const char *predicate_value,
+ apr_pool_t *pool);
+
/* Test modes. */
enum svn_test_mode_t
{
@@ -144,6 +195,23 @@ enum svn_test_mode_t
svn_test_all
};
+/* Structure for runtime test predicates. */
+struct svn_test_predicate_t
+{
+ /* The predicate function. */
+ svn_test_predicate_func_t func;
+
+ /* The value that the predicate function tests. */
+ const char *value;
+
+ /* The test mode that's used if the predicate matches. */
+ enum svn_test_mode_t alternate_mode;
+
+ /* Description for the test log */
+ const char *description;
+};
+
+
/* Each test gets a test descriptor, holding the function and other
* associated data.
*/
@@ -163,12 +231,29 @@ struct svn_test_descriptor_t
/* An optional description of a work-in-progress test. */
const char *wip;
+
+ /* An optional runtiume predicate. */
+ struct svn_test_predicate_t predicate;
};
/* All Subversion test programs include an array of svn_test_descriptor_t's
* (all of our sub-tests) that begins and ends with a SVN_TEST_NULL entry.
+ * This descriptor must be passed to the svn_test_main function.
+ *
+ * MAX_THREADS is the number of concurrent tests to run. Set to 1 if
+ * all tests must be executed serially. Numbers less than 1 mean
+ * "unbounded".
*/
-extern struct svn_test_descriptor_t test_funcs[];
+int svn_test_main(int argc, const char *argv[], int max_threads,
+ struct svn_test_descriptor_t *test_funcs);
+
+/* Boilerplate for the main function for each test program. */
+#define SVN_TEST_MAIN \
+ int main(int argc, const char *argv[]) \
+ { \
+ return svn_test_main(argc, argv, \
+ max_threads, test_funcs); \
+ }
/* A null initializer for the test descriptor. */
#define SVN_TEST_NULL {0}
@@ -192,6 +277,8 @@ extern struct svn_test_descriptor_t test_funcs[];
#define SVN_TEST_OPTS_XFAIL(func, msg) {svn_test_xfail, NULL, func, msg}
#define SVN_TEST_OPTS_XFAIL_COND(func, p, msg) \
{(p) ? svn_test_xfail : svn_test_pass, NULL, func, msg}
+#define SVN_TEST_OPTS_XFAIL_OTOH(func, msg, predicate) \
+ {svn_test_xfail, NULL, func, msg, NULL, predicate}
#define SVN_TEST_OPTS_SKIP(func, p, msg) \
{(p) ? svn_test_skip : svn_test_pass, NULL, func, msg}
@@ -205,7 +292,6 @@ extern struct svn_test_descriptor_t test_funcs[];
#define SVN_TEST_OPTS_WIMP_COND(func, p, msg, wip) \
{(p) ? svn_test_xfail : svn_test_pass, NULL, func, msg, wip}
-
/* Return a pseudo-random number based on SEED, and modify SEED.
*
@@ -240,6 +326,52 @@ svn_test__tree_t;
extern const svn_test__tree_entry_t svn_test__greek_tree_nodes[21];
+/* Returns a path to BASENAME within the transient data area for the
+ current test. */
+const char *
+svn_test_data_path(const char* basename, apr_pool_t *result_pool);
+
+
+/* Some tests require the --srcdir option and should use this function
+ * to get it. If not provided, print a warning and attempt to run the
+ * tests under the assumption that --srcdir is the current directory. */
+svn_error_t *
+svn_test_get_srcdir(const char **srcdir,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool);
+
+/* Initializes a standard auth baton for accessing the repositories */
+svn_error_t *
+svn_test__init_auth_baton(svn_auth_baton_t **baton,
+ apr_pool_t *result_pool);
+
+
+/*
+ * Test predicates
+ */
+
+#define SVN_TEST_PASS_IF_FS_TYPE_IS(fs_type) \
+ { svn_test__fs_type_is, fs_type, svn_test_pass, \
+ "PASS if fs-type = " fs_type }
+
+#define SVN_TEST_PASS_IF_FS_TYPE_IS_NOT(fs_type) \
+ { svn_test__fs_type_not, fs_type, svn_test_pass, \
+ "PASS if fs-type != " fs_type }
+
+/* Return TRUE if the fs-type in OPTS matches PREDICATE_VALUE. */
+svn_boolean_t
+svn_test__fs_type_is(const svn_test_opts_t *opts,
+ const char *predicate_value,
+ apr_pool_t *pool);
+
+
+/* Return TRUE if the fs-type in OPTS does not matches PREDICATE_VALUE. */
+svn_boolean_t
+svn_test__fs_type_not(const svn_test_opts_t *opts,
+ const char *predicate_value,
+ apr_pool_t *pool);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/tests/svn_test_fs.c b/subversion/tests/svn_test_fs.c
index 2dcb096..2d62f64 100644
--- a/subversion/tests/svn_test_fs.c
+++ b/subversion/tests/svn_test_fs.c
@@ -75,13 +75,14 @@ make_fs_config(const char *fs_type,
apr_pool_t *pool)
{
apr_hash_t *fs_config = apr_hash_make(pool);
- apr_hash_set(fs_config, SVN_FS_CONFIG_BDB_TXN_NOSYNC,
- APR_HASH_KEY_STRING, "1");
- apr_hash_set(fs_config, SVN_FS_CONFIG_FS_TYPE,
- APR_HASH_KEY_STRING,
- fs_type);
+
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_BDB_TXN_NOSYNC, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FS_TYPE, fs_type);
if (server_minor_version)
{
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_COMPATIBLE_VERSION,
+ apr_psprintf(pool, "1.%d.0", server_minor_version));
if (server_minor_version == 6 || server_minor_version == 7)
svn_hash_sets(fs_config, SVN_FS_CONFIG_PRE_1_8_COMPATIBLE, "1");
else if (server_minor_version == 5)
@@ -103,28 +104,20 @@ create_fs(svn_fs_t **fs_p,
const char *name,
const char *fs_type,
int server_minor_version,
+ apr_hash_t *overlay_fs_config,
apr_pool_t *pool)
{
- apr_finfo_t finfo;
apr_hash_t *fs_config = make_fs_config(fs_type, server_minor_version, pool);
+ if (overlay_fs_config)
+ fs_config = apr_hash_overlay(pool, overlay_fs_config, fs_config);
+
/* If there's already a repository named NAME, delete it. Doing
things this way means that repositories stick around after a
failure for postmortem analysis, but also that tests can be
re-run without cleaning out the repositories created by prior
runs. */
- if (apr_stat(&finfo, name, APR_FINFO_TYPE, pool) == APR_SUCCESS)
- {
- if (finfo.filetype == APR_DIR)
- SVN_ERR_W(svn_io_remove_dir2(name, TRUE, NULL, NULL, pool),
- apr_psprintf(pool,
- "cannot create fs '%s' there is already "
- "a directory of that name", name));
- else
- return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
- "cannot create fs '%s' there is already "
- "a file of that name", name);
- }
+ SVN_ERR(svn_io_remove_dir2(name, TRUE, NULL, NULL, pool));
SVN_ERR(svn_fs_create(fs_p, name, fs_config, pool));
if (! *fs_p)
@@ -144,21 +137,36 @@ create_fs(svn_fs_t **fs_p,
* copy that file into the filesystem FS and set *MUST_REOPEN to TRUE, else
* set *MUST_REOPEN to FALSE. */
static svn_error_t *
-maybe_install_fsfs_conf(svn_fs_t *fs,
- const svn_test_opts_t *opts,
- svn_boolean_t *must_reopen,
- apr_pool_t *pool)
+maybe_install_fs_conf(svn_fs_t *fs,
+ const svn_test_opts_t *opts,
+ svn_boolean_t *must_reopen,
+ apr_pool_t *pool)
{
*must_reopen = FALSE;
- if (strcmp(opts->fs_type, "fsfs") != 0 || ! opts->config_file)
+ if (! opts->config_file)
return SVN_NO_ERROR;
- *must_reopen = TRUE;
- return svn_io_copy_file(opts->config_file,
- svn_path_join(svn_fs_path(fs, pool),
- "fsfs.conf", pool),
- FALSE /* copy_perms */,
- pool);
+ if (strcmp(opts->fs_type, "fsfs") == 0)
+ {
+ *must_reopen = TRUE;
+ return svn_io_copy_file(opts->config_file,
+ svn_path_join(svn_fs_path(fs, pool),
+ "fsfs.conf", pool),
+ FALSE /* copy_perms */,
+ pool);
+ }
+
+ if (strcmp(opts->fs_type, "fsx") == 0)
+ {
+ *must_reopen = TRUE;
+ return svn_io_copy_file(opts->config_file,
+ svn_path_join(svn_fs_path(fs, pool),
+ "fsx.conf", pool),
+ FALSE /* copy_perms */,
+ pool);
+ }
+
+ return SVN_NO_ERROR;
}
@@ -168,80 +176,151 @@ svn_test__create_bdb_fs(svn_fs_t **fs_p,
const svn_test_opts_t *opts,
apr_pool_t *pool)
{
- return create_fs(fs_p, name, "bdb", opts->server_minor_version, pool);
+ return create_fs(fs_p, name, "bdb", opts->server_minor_version, NULL, pool);
}
svn_error_t *
-svn_test__create_fs(svn_fs_t **fs_p,
- const char *name,
- const svn_test_opts_t *opts,
- apr_pool_t *pool)
+svn_test__create_fs2(svn_fs_t **fs_p,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_hash_t *fs_config,
+ apr_pool_t *pool)
{
svn_boolean_t must_reopen;
- SVN_ERR(create_fs(fs_p, name, opts->fs_type,
- opts->server_minor_version, pool));
+ SVN_ERR(create_fs(fs_p, name, opts->fs_type, opts->server_minor_version,
+ fs_config, pool));
- SVN_ERR(maybe_install_fsfs_conf(*fs_p, opts, &must_reopen, pool));
+ SVN_ERR(maybe_install_fs_conf(*fs_p, opts, &must_reopen, pool));
if (must_reopen)
{
- SVN_ERR(svn_fs_open(fs_p, name, NULL, pool));
+ SVN_ERR(svn_fs_open2(fs_p, name, NULL, pool, pool));
svn_fs_set_warning_func(*fs_p, fs_warning_handler, NULL);
}
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_test__create_fs(svn_fs_t **fs_p,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ return svn_test__create_fs2(fs_p, name, opts, NULL, pool);
+}
svn_error_t *
-svn_test__create_repos(svn_repos_t **repos_p,
- const char *name,
- const svn_test_opts_t *opts,
- apr_pool_t *pool)
+svn_test__create_repos2(svn_repos_t **repos_p,
+ const char **repos_url,
+ const char **repos_dirent,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
- apr_finfo_t finfo;
svn_repos_t *repos;
svn_boolean_t must_reopen;
+ const char *repos_abspath;
+ apr_pool_t *repos_pool = repos_p ? result_pool : scratch_pool;
+ svn_boolean_t init_svnserve = FALSE;
apr_hash_t *fs_config = make_fs_config(opts->fs_type,
- opts->server_minor_version, pool);
+ opts->server_minor_version,
+ repos_pool);
+
+ if (repos_url && opts->repos_dir && opts->repos_url)
+ {
+ name = apr_psprintf(scratch_pool, "%s-%s", opts->prog_name,
+ svn_dirent_basename(name, NULL));
+
+ repos_abspath = svn_dirent_join(opts->repos_dir, name, scratch_pool);
+
+ SVN_ERR(svn_dirent_get_absolute(&repos_abspath, repos_abspath,
+ scratch_pool));
+
+ SVN_ERR(svn_io_make_dir_recursively(repos_abspath, scratch_pool));
+
+ *repos_url = svn_path_url_add_component2(opts->repos_url, name,
+ result_pool);
+
+ if (strstr(opts->repos_url, "svn://"))
+ init_svnserve = TRUE;
+ }
+ else
+ {
+ SVN_ERR(svn_dirent_get_absolute(&repos_abspath, name, scratch_pool));
+
+ if (repos_url)
+ SVN_ERR(svn_uri_get_file_url_from_dirent(repos_url, repos_abspath,
+ result_pool));
+ }
/* If there's already a repository named NAME, delete it. Doing
things this way means that repositories stick around after a
failure for postmortem analysis, but also that tests can be
re-run without cleaning out the repositories created by prior
runs. */
- if (apr_stat(&finfo, name, APR_FINFO_TYPE, pool) == APR_SUCCESS)
- {
- if (finfo.filetype == APR_DIR)
- SVN_ERR_W(svn_io_remove_dir2(name, TRUE, NULL, NULL, pool),
- apr_psprintf(pool,
- "cannot create repos '%s' there is already "
- "a directory of that name", name));
- else
- return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
- "there is already a file named '%s'", name);
- }
+ SVN_ERR(svn_io_remove_dir2(repos_abspath, TRUE, NULL, NULL, scratch_pool));
- SVN_ERR(svn_repos_create(&repos, name, NULL, NULL, NULL,
- fs_config, pool));
+ SVN_ERR(svn_repos_create(&repos, repos_abspath, NULL, NULL, NULL,
+ fs_config, repos_pool));
/* Register this repo for cleanup. */
- svn_test_add_dir_cleanup(name);
+ svn_test_add_dir_cleanup(repos_abspath);
- SVN_ERR(maybe_install_fsfs_conf(svn_repos_fs(repos), opts, &must_reopen,
- pool));
+ SVN_ERR(maybe_install_fs_conf(svn_repos_fs(repos), opts, &must_reopen,
+ scratch_pool));
if (must_reopen)
{
- SVN_ERR(svn_repos_open2(&repos, name, NULL, pool));
- svn_fs_set_warning_func(svn_repos_fs(repos), fs_warning_handler, NULL);
+ SVN_ERR(svn_repos_open3(&repos, repos_abspath, NULL, repos_pool,
+ scratch_pool));
}
- *repos_p = repos;
+ svn_fs_set_warning_func(svn_repos_fs(repos), fs_warning_handler, NULL);
+
+ if (init_svnserve)
+ {
+ const char *cfg;
+ const char *pwd;
+
+ cfg = svn_dirent_join(repos_abspath, "conf/svnserve.conf", scratch_pool);
+ SVN_ERR(svn_io_remove_file2(cfg, FALSE, scratch_pool));
+ SVN_ERR(svn_io_file_create(cfg,
+ "[general]\n"
+ "auth-access = write\n"
+ "password-db = passwd\n",
+ scratch_pool));
+
+ pwd = svn_dirent_join(repos_abspath, "conf/passwd", scratch_pool);
+ SVN_ERR(svn_io_remove_file2(pwd, FALSE, scratch_pool));
+ SVN_ERR(svn_io_file_create(pwd,
+ "[users]\n"
+ "jrandom = rayjandom\n"
+ "jconstant = rayjandom\n",
+ scratch_pool));
+ }
+
+ if (repos_p)
+ *repos_p = repos;
+ if (repos_dirent)
+ *repos_dirent = apr_pstrdup(result_pool, repos_abspath);
+
return SVN_NO_ERROR;
}
svn_error_t *
+svn_test__create_repos(svn_repos_t **repos_p,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(
+ svn_test__create_repos2(repos_p, NULL, NULL, name,
+ opts, pool, pool));
+}
+
+svn_error_t *
svn_test__stream_to_string(svn_stringbuf_t **string,
svn_stream_t *stream,
apr_pool_t *pool)
@@ -264,7 +343,7 @@ svn_test__stream_to_string(svn_stringbuf_t **string,
do
{
len = sizeof(buf);
- SVN_ERR(svn_stream_read(stream, buf, &len));
+ SVN_ERR(svn_stream_read_full(stream, buf, &len));
/* Now copy however many bytes were *actually* read into str. */
svn_stringbuf_appendbytes(str, buf, len);
@@ -355,6 +434,8 @@ get_dir_entries(apr_hash_t *tree_entries,
}
+/* Verify that PATH under ROOT is: a directory if contents is NULL;
+ a file with contents CONTENTS otherwise. */
static svn_error_t *
validate_tree_entry(svn_fs_root_t *root,
const char *path,
@@ -363,10 +444,19 @@ validate_tree_entry(svn_fs_root_t *root,
{
svn_stream_t *rstream;
svn_stringbuf_t *rstring;
- svn_boolean_t is_dir;
+ svn_node_kind_t kind;
+ svn_boolean_t is_dir, is_file;
- /* Verify that this is the expected type of node */
+ /* Verify that node types are reported consistently. */
+ SVN_ERR(svn_fs_check_path(&kind, root, path, pool));
SVN_ERR(svn_fs_is_dir(&is_dir, root, path, pool));
+ SVN_ERR(svn_fs_is_file(&is_file, root, path, pool));
+
+ SVN_TEST_ASSERT(!is_dir || kind == svn_node_dir);
+ SVN_TEST_ASSERT(!is_file || kind == svn_node_file);
+ SVN_TEST_ASSERT(is_dir || is_file);
+
+ /* Verify that this is the expected type of node */
if ((!is_dir && !contents) || (is_dir && contents))
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL,
@@ -376,10 +466,17 @@ validate_tree_entry(svn_fs_root_t *root,
/* Verify that the contents are as expected (files only) */
if (! is_dir)
{
+ svn_stringbuf_t *expected = svn_stringbuf_create(contents, pool);
+
+ /* File lengths. */
+ svn_filesize_t length;
+ SVN_ERR(svn_fs_file_length(&length, root, path, pool));
+ SVN_TEST_ASSERT(expected->len == length);
+
+ /* Text contents. */
SVN_ERR(svn_fs_file_contents(&rstream, root, path, pool));
SVN_ERR(svn_test__stream_to_string(&rstring, rstream, pool));
- if (! svn_stringbuf_compare(rstring,
- svn_stringbuf_create(contents, pool)))
+ if (! svn_stringbuf_compare(rstring, expected))
return svn_error_createf
(SVN_ERR_FS_GENERAL, NULL,
"node '%s' in tree had unexpected contents",
@@ -409,6 +506,9 @@ svn_test__validate_tree(svn_fs_root_t *root,
apr_hash_index_t *hi;
int i;
+ /* There should be no entry with this name. */
+ const char *na_name = "es-vee-en";
+
/* Create a hash for storing our expected entries */
expected_entries = apr_hash_make(subpool);
@@ -497,6 +597,23 @@ svn_test__validate_tree(svn_fs_root_t *root,
svn_stringbuf_appendcstr(extra_entries, "\n");
}
+ /* Test that non-existent paths will not be found.
+ * Skip this test if somebody sneakily added NA_NAME. */
+ if (!svn_hash_gets(expected_entries, na_name))
+ {
+ svn_node_kind_t kind;
+ svn_boolean_t is_dir, is_file;
+
+ /* Verify that the node is reported as "n/a". */
+ SVN_ERR(svn_fs_check_path(&kind, root, na_name, subpool));
+ SVN_ERR(svn_fs_is_dir(&is_dir, root, na_name, subpool));
+ SVN_ERR(svn_fs_is_file(&is_file, root, na_name, subpool));
+
+ SVN_TEST_ASSERT(kind == svn_node_none);
+ SVN_TEST_ASSERT(!is_file);
+ SVN_TEST_ASSERT(!is_dir);
+ }
+
if (missing_entries || extra_entries || corrupt_entries)
{
return svn_error_createf
@@ -530,23 +647,23 @@ svn_test__validate_changes(svn_fs_root_t *root,
{
int i;
for (i=0, hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
- SVN_DBG(("expected[%d] = '%s'\n", i++, svn__apr_hash_index_key(hi)));
+ SVN_DBG(("expected[%d] = '%s'\n", i++, apr_hash_this_key(hi)));
for (i=0, hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
- SVN_DBG(("actual[%d] = '%s'\n", i++, svn__apr_hash_index_key(hi)));
+ SVN_DBG(("actual[%d] = '%s'\n", i++, apr_hash_this_key(hi)));
}
#endif
for (hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
- if (NULL == svn_hash_gets(actual, svn__apr_hash_index_key(hi)))
+ if (NULL == svn_hash_gets(actual, apr_hash_this_key(hi)))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"Path '%s' missing from actual changed-paths",
- svn__apr_hash_index_key(hi));
+ (const char *)apr_hash_this_key(hi));
for (hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
- if (NULL == svn_hash_gets(expected, svn__apr_hash_index_key(hi)))
+ if (NULL == svn_hash_gets(expected, apr_hash_this_key(hi)))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"Path '%s' missing from expected changed-paths",
- svn__apr_hash_index_key(hi));
+ (const char *)apr_hash_this_key(hi));
return SVN_NO_ERROR;
}
diff --git a/subversion/tests/svn_test_fs.h b/subversion/tests/svn_test_fs.h
index bbbbfb8..592243b 100644
--- a/subversion/tests/svn_test_fs.h
+++ b/subversion/tests/svn_test_fs.h
@@ -57,7 +57,16 @@ svn_test__create_bdb_fs(svn_fs_t **fs_p,
/* Create a filesystem based on OPTS in a subdir NAME and return a new
- FS object which points to it. */
+ FS object which points to it. Override the default test filesystem
+ config with values from FS_CONFIG. */
+svn_error_t *
+svn_test__create_fs2(svn_fs_t **fs_p,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_hash_t *fs_config,
+ apr_pool_t *pool);
+
+/* The same as svn_test__create_fs2() but with FS_CONFIG set to NULL. */
svn_error_t *
svn_test__create_fs(svn_fs_t **fs_p,
const char *name,
@@ -73,6 +82,19 @@ svn_test__create_repos(svn_repos_t **repos_p,
const svn_test_opts_t *opts,
apr_pool_t *pool);
+/* Create a repository with a filesystem based on OPTS in a subdir NAME
+ and return optionally new REPOS object, the directory it was created in
+ and/or the url of the repository . */
+svn_error_t *
+svn_test__create_repos2(svn_repos_t **repos_p,
+ const char **repos_url,
+ const char **repos_dirent,
+ const char *name,
+ const svn_test_opts_t *opts,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
/* Read all data from a generic read STREAM, and return it in STRING.
Allocate the svn_stringbuf_t in POOL. (All data in STRING will be
dup'ed from STREAM using POOL too.) */
diff --git a/subversion/tests/svn_test_main.c b/subversion/tests/svn_test_main.c
index 15d460c..46c0c45 100644
--- a/subversion/tests/svn_test_main.c
+++ b/subversion/tests/svn_test_main.c
@@ -45,16 +45,30 @@
#include "svn_path.h"
#include "svn_ctype.h"
#include "svn_utf.h"
+#include "svn_version.h"
#include "private/svn_cmdline_private.h"
+#include "private/svn_atomic.h"
+#include "private/svn_mutex.h"
+#include "private/svn_sqlite.h"
#include "svn_private_config.h"
+#if APR_HAS_THREADS
+# include <apr_thread_proc.h>
+#endif
+
/* Some Subversion test programs may want to parse options in the
argument list, so we remember it here. */
+extern int test_argc;
+extern const char **test_argv;
int test_argc;
const char **test_argv;
+/* Many tests write to disk. Instead of writing to the current
+ directory, they should use this path as the root of the test data
+ area. */
+static const char *data_path;
/* Test option: Print more output */
static svn_boolean_t verbose_mode = FALSE;
@@ -70,10 +84,13 @@ static svn_boolean_t allow_segfaults = FALSE;
/* Test option: Limit testing to a given mode (i.e. XFail, Skip,
Pass, All). */
-enum svn_test_mode_t mode_filter = svn_test_all;
+static enum svn_test_mode_t mode_filter = svn_test_all;
+
+/* Test option: Allow concurrent execution of tests */
+static svn_boolean_t parallel = FALSE;
/* Option parsing enums and structures */
-enum {
+enum test_options_e {
help_opt = SVN_OPT_FIRST_LONGOPT_ID,
cleanup_opt,
fstype_opt,
@@ -84,7 +101,13 @@ enum {
server_minor_version_opt,
allow_segfault_opt,
srcdir_opt,
- mode_filter_opt
+ reposdir_opt,
+ reposurl_opt,
+ repostemplate_opt,
+ mode_filter_opt,
+ sqlite_log_opt,
+ parallel_opt,
+ fsfs_version_opt
};
static const apr_getopt_option_t cl_options[] =
@@ -97,6 +120,8 @@ static const apr_getopt_option_t cl_options[] =
N_("specify test config file ARG")},
{"fs-type", fstype_opt, 1,
N_("specify a filesystem backend type ARG")},
+ {"fsfs-version", fsfs_version_opt, 1,
+ N_("specify the FSFS version ARG")},
{"list", list_opt, 0,
N_("lists all the tests with their short description")},
{"mode-filter", mode_filter_opt, 1,
@@ -112,7 +137,17 @@ static const apr_getopt_option_t cl_options[] =
{"allow-segfaults", allow_segfault_opt, 0,
N_("don't trap seg faults (useful for debugging)")},
{"srcdir", srcdir_opt, 1,
- N_("source directory")},
+ N_("directory which contains test's C source files")},
+ {"repos-dir", reposdir_opt, 1,
+ N_("directory to create repositories in")},
+ {"repos-url", reposurl_opt, 1,
+ N_("the url to access reposdir as")},
+ {"repos-template",repostemplate_opt, 1,
+ N_("the repository to use as template")},
+ {"sqlite-logging", sqlite_log_opt, 0,
+ N_("enable SQLite logging")},
+ {"parallel", parallel_opt, 0,
+ N_("allow concurrent execution of tests")},
{0, 0, 0, 0}
};
@@ -123,8 +158,50 @@ static const apr_getopt_option_t cl_options[] =
/* When non-zero, don't remove test directories */
static svn_boolean_t skip_cleanup = FALSE;
-/* All cleanup actions are registered as cleanups on this pool. */
+/* All cleanup actions are registered as cleanups on the cleanup_pool,
+ * which may be thread-specific. */
+#if APR_HAS_THREADS
+/* The thread-local data key for the cleanup pool. */
+static apr_threadkey_t *cleanup_pool_key = NULL;
+
+/* No-op destructor for apr_threadkey_private_create(). */
+static void null_threadkey_dtor(void *stuff) {}
+
+/* Set the thread-specific cleanup pool. */
+static void set_cleanup_pool(apr_pool_t *pool)
+{
+ apr_status_t status = apr_threadkey_private_set(pool, cleanup_pool_key);
+ if (status)
+ {
+ printf("apr_threadkey_private_set() failed with code %ld.\n",
+ (long)status);
+ exit(1);
+ }
+}
+
+/* Get the thread-specific cleanup pool. */
+static apr_pool_t *get_cleanup_pool()
+{
+ void *data;
+ apr_status_t status = apr_threadkey_private_get(&data, cleanup_pool_key);
+ if (status)
+ {
+ printf("apr_threadkey_private_get() failed with code %ld.\n",
+ (long)status);
+ exit(1);
+ }
+ return data;
+}
+
+# define cleanup_pool (get_cleanup_pool())
+# define HAVE_PER_THREAD_CLEANUP
+#else
static apr_pool_t *cleanup_pool = NULL;
+# define set_cleanup_pool(p) (cleanup_pool = (p))
+#endif
+
+/* Used by test_thread to serialize access to stdout. */
+static svn_mutex__t *log_mutex = NULL;
static apr_status_t
cleanup_rmtree(void *data)
@@ -150,19 +227,41 @@ cleanup_rmtree(void *data)
}
+
void
svn_test_add_dir_cleanup(const char *path)
{
if (cleanup_mode)
{
const char *abspath;
- svn_error_t *err = svn_path_get_absolute(&abspath, path, cleanup_pool);
+ svn_error_t *err;
+
+ /* All cleanup functions use the *same* pool (not subpools of it).
+ Thus, we need to synchronize. */
+ err = svn_mutex__lock(log_mutex);
+ if (err)
+ {
+ if (verbose_mode)
+ printf("FAILED svn_mutex__lock in svn_test_add_dir_cleanup.\n");
+ svn_error_clear(err);
+ return;
+ }
+
+ err = svn_path_get_absolute(&abspath, path, cleanup_pool);
svn_error_clear(err);
if (!err)
apr_pool_cleanup_register(cleanup_pool, abspath, cleanup_rmtree,
apr_pool_cleanup_null);
else if (verbose_mode)
printf("FAILED ABSPATH: %s\n", path);
+
+ err = svn_mutex__unlock(log_mutex, NULL);
+ if (err)
+ {
+ if (verbose_mode)
+ printf("FAILED svn_mutex__unlock in svn_test_add_dir_cleanup.\n");
+ svn_error_clear(err);
+ }
}
}
@@ -183,7 +282,7 @@ svn_test_rand(apr_uint32_t *seed)
/* Determine the array size of test_funcs[], the inelegant way. :) */
static int
-get_array_size(void)
+get_array_size(struct svn_test_descriptor_t *test_funcs)
{
int i;
@@ -205,6 +304,91 @@ crash_handler(int signum)
longjmp(jump_buffer, 1);
}
+/* Write the result of test number TEST_NUM to stdout. Pretty-print test
+ name and dots according to our test-suite spec, and return TRUE if there
+ has been a test failure.
+
+ The parameters are basically the internal state of do_test_num() and
+ test_thread(). */
+/* */
+static svn_boolean_t
+log_results(const char *progname,
+ int test_num,
+ svn_boolean_t msg_only,
+ svn_boolean_t run_this_test,
+ svn_boolean_t skip,
+ svn_boolean_t xfail,
+ svn_boolean_t wimp,
+ svn_error_t *err,
+ const char *msg,
+ const struct svn_test_descriptor_t *desc)
+{
+ svn_boolean_t test_failed;
+
+ if (err && err->apr_err == SVN_ERR_TEST_SKIPPED)
+ {
+ svn_error_clear(err);
+ err = SVN_NO_ERROR;
+ skip = TRUE;
+ xfail = FALSE; /* Or all XFail tests reporting SKIP would be failing */
+ }
+
+ /* Failure means unexpected results -- FAIL or XPASS. */
+ test_failed = (!wimp && ((err != SVN_NO_ERROR) != (xfail != 0)));
+
+ /* If we got an error, print it out. */
+ if (err)
+ {
+ svn_handle_error2(err, stdout, FALSE, "svn_tests: ");
+ svn_error_clear(err);
+ }
+
+ if (msg_only)
+ {
+ const svn_boolean_t otoh = !!desc->predicate.description;
+
+ if (run_this_test)
+ printf(" %3d %-5s %s%s%s%s%s%s\n",
+ test_num,
+ (xfail ? "XFAIL" : (skip ? "SKIP" : "")),
+ msg ? msg : "(test did not provide name)",
+ (wimp && verbose_mode) ? " [[" : "",
+ (wimp && verbose_mode) ? desc->wip : "",
+ (wimp && verbose_mode) ? "]]" : "",
+ (otoh ? " / " : ""),
+ (otoh ? desc->predicate.description : ""));
+ }
+ else if (run_this_test && ((! quiet_mode) || test_failed))
+ {
+ printf("%s %s %d: %s%s%s%s\n",
+ (err
+ ? (xfail ? "XFAIL:" : "FAIL: ")
+ : (xfail ? "XPASS:" : (skip ? "SKIP: " : "PASS: "))),
+ progname,
+ test_num,
+ msg ? msg : "(test did not provide name)",
+ wimp ? " [[WIMP: " : "",
+ wimp ? desc->wip : "",
+ wimp ? "]]" : "");
+ }
+
+ if (msg)
+ {
+ size_t len = strlen(msg);
+ if (len > 50)
+ printf("WARNING: Test docstring exceeds 50 characters\n");
+ if (msg[len - 1] == '.')
+ printf("WARNING: Test docstring ends in a period (.)\n");
+ if (svn_ctype_isupper(msg[0]))
+ printf("WARNING: Test docstring is capitalized\n");
+ }
+ if (desc->msg == NULL)
+ printf("WARNING: New-style test descriptor is missing a docstring.\n");
+
+ fflush(stdout);
+
+ return test_failed;
+}
/* Execute a test number TEST_NUM. Pretty-print test name and dots
according to our test-suite spec, and return the result code.
@@ -213,6 +397,7 @@ crash_handler(int signum)
static svn_boolean_t
do_test_num(const char *progname,
int test_num,
+ struct svn_test_descriptor_t *test_funcs,
svn_boolean_t msg_only,
svn_test_opts_t *opts,
const char **header_msg,
@@ -220,11 +405,11 @@ do_test_num(const char *progname,
{
svn_boolean_t skip, xfail, wimp;
svn_error_t *err = NULL;
- svn_boolean_t test_failed;
const char *msg = NULL; /* the message this individual test prints out */
const struct svn_test_descriptor_t *desc;
- const int array_size = get_array_size();
+ const int array_size = get_array_size(test_funcs);
svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
+ enum svn_test_mode_t test_mode;
/* Check our array bounds! */
if (test_num < 0)
@@ -239,11 +424,18 @@ do_test_num(const char *progname,
}
desc = &test_funcs[test_num];
- skip = desc->mode == svn_test_skip;
- xfail = desc->mode == svn_test_xfail;
+ /* Check the test predicate. */
+ if (desc->predicate.func
+ && desc->predicate.func(opts, desc->predicate.value, pool))
+ test_mode = desc->predicate.alternate_mode;
+ else
+ test_mode = desc->mode;
+
+ skip = test_mode == svn_test_skip;
+ xfail = test_mode == svn_test_xfail;
wimp = xfail && desc->wip;
msg = desc->msg;
- run_this_test = mode_filter == svn_test_all || mode_filter == desc->mode;
+ run_this_test = mode_filter == svn_test_all || mode_filter == test_mode;
if (run_this_test && header_msg && *header_msg)
{
@@ -272,13 +464,6 @@ do_test_num(const char *progname,
err = (*desc->func2)(pool);
else
err = (*desc->func_opts)(opts, pool);
-
- if (err && err->apr_err == SVN_ERR_TEST_SKIPPED)
- {
- svn_error_clear(err);
- err = SVN_NO_ERROR;
- skip = TRUE;
- }
}
else
err = svn_error_create(SVN_ERR_TEST_FAILED, NULL,
@@ -292,60 +477,171 @@ do_test_num(const char *progname,
}
/* Failure means unexpected results -- FAIL or XPASS. */
- test_failed = (!wimp && ((err != SVN_NO_ERROR) != (xfail != 0)));
+ skip_cleanup = log_results(progname, test_num, msg_only, run_this_test,
+ skip, xfail, wimp, err, msg, desc);
- /* If we got an error, print it out. */
- if (err)
- {
- svn_handle_error2(err, stdout, FALSE, "svn_tests: ");
- svn_error_clear(err);
- }
+ return skip_cleanup;
+}
- if (msg_only)
+#if APR_HAS_THREADS
+
+/* Per-test parameters used by test_thread */
+typedef struct test_params_t
+{
+ /* Name of the application */
+ const char *progname;
+
+ /* Total number of tests to execute */
+ svn_atomic_t test_count;
+
+ /* Global test options as provided by main() */
+ svn_test_opts_t *opts;
+
+ /* Reference to the global failure flag. Set this if any test failed. */
+ svn_atomic_t got_error;
+
+ /* Test to execute next. */
+ svn_atomic_t test_num;
+
+ /* Test functions array. */
+ struct svn_test_descriptor_t *test_funcs;
+} test_params_t;
+
+/* Thread function similar to do_test_num() but with fewer options. We do
+ catch segfaults. All parameters are given as a test_params_t in DATA.
+ */
+static void * APR_THREAD_FUNC
+test_thread(apr_thread_t *thread, void *data)
+{
+ svn_boolean_t skip, xfail, wimp;
+ svn_error_t *err;
+ const struct svn_test_descriptor_t *desc;
+ svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
+ enum svn_test_mode_t test_mode;
+ test_params_t *params = data;
+ svn_atomic_t test_num;
+ apr_pool_t *pool;
+ apr_pool_t *thread_root
+ = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
+
+#ifdef HAVE_PER_THREAD_CLEANUP
+ set_cleanup_pool(svn_pool_create(thread_root));
+#endif
+
+ pool = svn_pool_create(thread_root);
+
+ for (test_num = svn_atomic_inc(&params->test_num);
+ test_num <= params->test_count;
+ test_num = svn_atomic_inc(&params->test_num))
{
- if (run_this_test)
- printf(" %3d %-5s %s%s%s%s\n",
- test_num,
- (xfail ? "XFAIL" : (skip ? "SKIP" : "")),
- msg ? msg : "(test did not provide name)",
- (wimp && verbose_mode) ? " [[" : "",
- (wimp && verbose_mode) ? desc->wip : "",
- (wimp && verbose_mode) ? "]]" : "");
+ svn_pool_clear(pool);
+#ifdef HAVE_PER_THREAD_CLEANUP
+ svn_pool_clear(cleanup_pool); /* after clearing pool*/
+#endif
+
+ desc = &params->test_funcs[test_num];
+ /* Check the test predicate. */
+ if (desc->predicate.func
+ && desc->predicate.func(params->opts, desc->predicate.value, pool))
+ test_mode = desc->predicate.alternate_mode;
+ else
+ test_mode = desc->mode;
+
+ skip = test_mode == svn_test_skip;
+ xfail = test_mode == svn_test_xfail;
+ wimp = xfail && desc->wip;
+ run_this_test = mode_filter == svn_test_all
+ || mode_filter == test_mode;
+
+ /* Do test */
+ if (skip || !run_this_test)
+ err = NULL; /* pass */
+ else if (desc->func2)
+ err = (*desc->func2)(pool);
+ else
+ err = (*desc->func_opts)(params->opts, pool);
+
+ /* Write results to console */
+ svn_error_clear(svn_mutex__lock(log_mutex));
+ if (log_results(params->progname, test_num, FALSE, run_this_test,
+ skip, xfail, wimp, err, desc->msg, desc))
+ svn_atomic_set(&params->got_error, TRUE);
+ svn_error_clear(svn_mutex__unlock(log_mutex, NULL));
}
- else if (run_this_test && ((! quiet_mode) || test_failed))
+
+ svn_pool_clear(pool); /* Make sure this is cleared before cleanup_pool*/
+
+ /* Release all test memory. Possibly includes cleanup_pool */
+ svn_pool_destroy(thread_root);
+
+ /* End thread explicitly to prevent APR_INCOMPLETE return codes in
+ apr_thread_join(). */
+ apr_thread_exit(thread, 0);
+ return NULL;
+}
+
+/* Log an error with message MSG if the APR status of EXPR is not 0.
+ */
+#define CHECK_STATUS(expr,msg) \
+ do { \
+ apr_status_t rv = (expr); \
+ if (rv) \
+ { \
+ svn_error_t *svn_err__temp = svn_error_wrap_apr(rv, msg); \
+ svn_handle_error2(svn_err__temp, stdout, FALSE, "svn_tests: "); \
+ svn_error_clear(svn_err__temp); \
+ } \
+ } while (0);
+
+/* Execute all ARRAY_SIZE tests concurrently using MAX_THREADS threads.
+ Pass PROGNAME and OPTS to the individual tests. Return TRUE if at least
+ one of the tests failed. Allocate all data in POOL.
+
+ Note that cleanups are delayed until all tests have been completed.
+ */
+static svn_boolean_t
+do_tests_concurrently(const char *progname,
+ struct svn_test_descriptor_t *test_funcs,
+ int array_size,
+ int max_threads,
+ svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ int i;
+ apr_thread_t **threads;
+
+ /* Prepare thread parameters. */
+ test_params_t params;
+ params.got_error = FALSE;
+ params.opts = opts;
+ params.progname = progname;
+ params.test_num = 1;
+ params.test_funcs = test_funcs;
+ params.test_count = array_size;
+
+ /* Start all threads. */
+ threads = apr_pcalloc(pool, max_threads * sizeof(*threads));
+ for (i = 0; i < max_threads; ++i)
{
- printf("%s %s %d: %s%s%s%s\n",
- (err
- ? (xfail ? "XFAIL:" : "FAIL: ")
- : (xfail ? "XPASS:" : (skip ? "SKIP: " : "PASS: "))),
- progname,
- test_num,
- msg ? msg : "(test did not provide name)",
- wimp ? " [[WIMP: " : "",
- wimp ? desc->wip : "",
- wimp ? "]]" : "");
+ CHECK_STATUS(apr_thread_create(&threads[i], NULL, test_thread, &params,
+ pool),
+ "creating test thread failed.\n");
}
- if (msg)
+ /* Wait for all tasks (tests) to complete. */
+ for (i = 0; i < max_threads; ++i)
{
- size_t len = strlen(msg);
- if (len > 50)
- printf("WARNING: Test docstring exceeds 50 characters\n");
- if (msg[len - 1] == '.')
- printf("WARNING: Test docstring ends in a period (.)\n");
- if (svn_ctype_isupper(msg[0]))
- printf("WARNING: Test docstring is capitalized\n");
+ apr_status_t result = 0;
+ CHECK_STATUS(apr_thread_join(&result, threads[i]),
+ "Waiting for test thread to finish failed.");
+ CHECK_STATUS(result,
+ "Test thread returned an error.");
}
- if (desc->msg == NULL)
- printf("WARNING: New-style test descriptor is missing a docstring.\n");
- fflush(stdout);
-
- skip_cleanup = test_failed;
-
- return test_failed;
+ return params.got_error != FALSE;
}
+#endif
static void help(const char *progname, apr_pool_t *pool)
{
@@ -366,12 +662,106 @@ static void help(const char *progname, apr_pool_t *pool)
svn_error_clear(svn_cmdline_fprintf(stdout, pool, "\n"));
}
+static svn_error_t *init_test_data(const char *argv0, apr_pool_t *pool)
+{
+ const char *temp_path;
+ const char *base_name;
+
+ /* Convert the program path to an absolute path. */
+ SVN_ERR(svn_utf_cstring_to_utf8(&temp_path, argv0, pool));
+ temp_path = svn_dirent_internal_style(temp_path, pool);
+ SVN_ERR(svn_dirent_get_absolute(&temp_path, temp_path, pool));
+ SVN_ERR_ASSERT(!svn_dirent_is_root(temp_path, strlen(temp_path)));
+
+ /* Extract the interesting bits of the path. */
+ temp_path = svn_dirent_dirname(temp_path, pool);
+ base_name = svn_dirent_basename(temp_path, pool);
+ if (0 == strcmp(base_name, ".libs"))
+ {
+ /* This is a libtoolized binary, skip the .libs directory. */
+ temp_path = svn_dirent_dirname(temp_path, pool);
+ base_name = svn_dirent_basename(temp_path, pool);
+ }
+ temp_path = svn_dirent_dirname(temp_path, pool);
+
+ /* temp_path should now point to the root of the test
+ builddir. Construct the path to the transient dir. Note that we
+ put the path insinde the cmdline/svn-test-work area. This is
+ because trying to get the cmdline tests to use a different work
+ area is unprintable; so we put the C test transient dir in the
+ cmdline tests area, as the lesser of evils ... */
+ temp_path = svn_dirent_join_many(pool, temp_path,
+ "cmdline", "svn-test-work",
+ base_name, SVN_VA_NULL);
+
+ /* Finally, create the transient directory. */
+ SVN_ERR(svn_io_make_dir_recursively(temp_path, pool));
+
+ data_path = temp_path;
+ return SVN_NO_ERROR;
+}
+
+const char *
+svn_test_data_path(const char *base_name, apr_pool_t *result_pool)
+{
+ return svn_dirent_join(data_path, base_name, result_pool);
+}
+
+svn_error_t *
+svn_test_get_srcdir(const char **srcdir,
+ const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ const char *cwd;
+
+ if (opts->srcdir)
+ {
+ *srcdir = opts->srcdir;
+ return SVN_NO_ERROR;
+ }
+
+ fprintf(stderr, "WARNING: missing '--srcdir' option");
+ SVN_ERR(svn_dirent_get_absolute(&cwd, ".", pool));
+ fprintf(stderr, ", assuming '%s'\n", cwd);
+ *srcdir = cwd;
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_test__init_auth_baton(svn_auth_baton_t **ab,
+ apr_pool_t *result_pool)
+{
+ svn_config_t *cfg_config;
+
+ SVN_ERR(svn_config_create2(&cfg_config, FALSE, FALSE, result_pool));
+
+ /* Disable the crypto backends that might not be entirely
+ threadsafe and/or compatible with running headless.
+
+ The windows system is just our own files, but then with user-key
+ encrypted data inside. */
+ svn_config_set(cfg_config,
+ SVN_CONFIG_SECTION_AUTH,
+ SVN_CONFIG_OPTION_PASSWORD_STORES,
+ "windows-cryptoapi");
+
+ SVN_ERR(svn_cmdline_create_auth_baton(ab,
+ TRUE /* non_interactive */,
+ "jrandom", "rayjandom",
+ NULL,
+ TRUE /* no_auth_cache */,
+ FALSE /* trust_server_cert */,
+ cfg_config, NULL, NULL, result_pool));
+
+ return SVN_NO_ERROR;
+}
/* Standard svn test program */
int
-main(int argc, const char *argv[])
+svn_test_main(int argc, const char *argv[], int max_threads,
+ struct svn_test_descriptor_t *test_funcs)
{
- const char *prog_name;
int i;
svn_boolean_t got_error = FALSE;
apr_pool_t *pool, *test_pool;
@@ -383,7 +773,7 @@ main(int argc, const char *argv[])
svn_error_t *err;
char errmsg[200];
/* How many tests are there? */
- int array_size = get_array_size();
+ int array_size = get_array_size(test_funcs);
svn_test_opts_t opts = { NULL };
@@ -400,31 +790,61 @@ main(int argc, const char *argv[])
* usage but make it thread-safe to allow for multi-threaded tests.
*/
pool = apr_allocator_owner_get(svn_pool_create_allocator(TRUE));
+ err = svn_mutex__init(&log_mutex, TRUE, pool);
+ if (err)
+ {
+ svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
+ svn_error_clear(err);
+ }
+
+ /* Set up the thread-local storage key for the cleanup pool. */
+#ifdef HAVE_PER_THREAD_CLEANUP
+ apr_err = apr_threadkey_private_create(&cleanup_pool_key,
+ null_threadkey_dtor,
+ pool);
+ if (apr_err)
+ {
+ printf("apr_threadkey_private_create() failed with code %ld.\n",
+ (long)apr_err);
+ exit(1);
+ }
+#endif /* HAVE_PER_THREAD_CLEANUP */
/* Remember the command line */
test_argc = argc;
test_argv = argv;
+ err = init_test_data(argv[0], pool);
+ if (err)
+ {
+ svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
+ svn_error_clear(err);
+ }
+
err = svn_cmdline__getopt_init(&os, argc, argv, pool);
+ if (err)
+ {
+ svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
+ svn_error_clear(err);
+ }
+
os->interleave = TRUE; /* Let options and arguments be interleaved */
/* Strip off any leading path components from the program name. */
- prog_name = strrchr(argv[0], '/');
- if (prog_name)
- prog_name++;
- else
- {
- /* Just check if this is that weird platform that uses \ instead
- of / for the path separator. */
- prog_name = strrchr(argv[0], '\\');
- if (prog_name)
- prog_name++;
- else
- prog_name = argv[0];
- }
+ opts.prog_name = svn_dirent_internal_style(argv[0], pool);
+ opts.prog_name = svn_dirent_basename(opts.prog_name, NULL);
#ifdef WIN32
+ /* Abuse cast in strstr() to remove .exe extension.
+ Value is allocated in pool by svn_dirent_internal_style() */
+ {
+ char *exe_ext = strstr(opts.prog_name, ".exe");
+
+ if (exe_ext)
+ *exe_ext = '\0';
+ }
+
#if _MSC_VER >= 1400
/* ### This should work for VC++ 2002 (=1300) and later */
/* Show the abort message on STDERR instead of a dialog to allow
@@ -446,7 +866,7 @@ main(int argc, const char *argv[])
#endif
if (err)
- return svn_cmdline_handle_exit_error(err, pool, prog_name);
+ return svn_cmdline_handle_exit_error(err, pool, opts.prog_name);
while (1)
{
const char *opt_arg;
@@ -457,7 +877,7 @@ main(int argc, const char *argv[])
break;
else if (apr_err && (apr_err != APR_BADCH))
{
- /* Ignore invalid option error to allow passing arbitary options */
+ /* Ignore invalid option error to allow passing arbitrary options */
fprintf(stderr, "apr_getopt_long failed : [%d] %s\n",
apr_err, apr_strerror(apr_err, errmsg, sizeof(errmsg)));
exit(1);
@@ -465,7 +885,7 @@ main(int argc, const char *argv[])
switch (opt_id) {
case help_opt:
- help(prog_name, pool);
+ help(opts.prog_name, pool);
exit(0);
case cleanup_opt:
cleanup_mode = TRUE;
@@ -480,6 +900,20 @@ main(int argc, const char *argv[])
SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.srcdir, opt_arg, pool));
opts.srcdir = svn_dirent_internal_style(opts.srcdir, pool);
break;
+ case reposdir_opt:
+ SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_dir, opt_arg, pool));
+ opts.repos_dir = svn_dirent_internal_style(opts.repos_dir, pool);
+ break;
+ case reposurl_opt:
+ SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_url, opt_arg, pool));
+ opts.repos_url = svn_uri_canonicalize(opts.repos_url, pool);
+ break;
+ case repostemplate_opt:
+ SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_template, opt_arg,
+ pool));
+ opts.repos_template = svn_dirent_internal_style(opts.repos_template,
+ pool);
+ break;
case list_opt:
list_mode = TRUE;
break;
@@ -518,14 +952,24 @@ main(int argc, const char *argv[])
exit(1);
}
if ((opts.server_minor_version < 3)
- || (opts.server_minor_version > 6))
+ || (opts.server_minor_version > SVN_VER_MINOR))
{
fprintf(stderr, "FAIL: Invalid minor version given\n");
exit(1);
}
+ break;
}
+ case sqlite_log_opt:
+ svn_sqlite__dbg_enable_errorlog();
+ break;
+#if APR_HAS_THREADS
+ case parallel_opt:
+ parallel = TRUE;
+ break;
+#endif
}
}
+ opts.verbose = verbose_mode;
/* Disable sleeping for timestamps, to speed up the tests. */
apr_env_set(
@@ -540,7 +984,7 @@ main(int argc, const char *argv[])
}
/* Create an iteration pool for the tests */
- cleanup_pool = svn_pool_create(pool);
+ set_cleanup_pool(svn_pool_create(pool));
test_pool = svn_pool_create(pool);
if (!allow_segfaults)
@@ -558,8 +1002,8 @@ main(int argc, const char *argv[])
"------ ----- ----------------\n";
for (i = 1; i <= array_size; i++)
{
- if (do_test_num(prog_name, i, TRUE, &opts, &header_msg,
- test_pool))
+ if (do_test_num(opts.prog_name, i, test_funcs,
+ TRUE, &opts, &header_msg, test_pool))
got_error = TRUE;
/* Clear the per-function pool */
@@ -579,8 +1023,8 @@ main(int argc, const char *argv[])
continue;
ran_a_test = TRUE;
- if (do_test_num(prog_name, test_num, FALSE, &opts, NULL,
- test_pool))
+ if (do_test_num(opts.prog_name, test_num, test_funcs,
+ FALSE, &opts, NULL, test_pool))
got_error = TRUE;
/* Clear the per-function pool */
@@ -594,15 +1038,34 @@ main(int argc, const char *argv[])
if (! ran_a_test)
{
/* just run all tests */
- for (i = 1; i <= array_size; i++)
+ if (max_threads < 1)
+ max_threads = array_size;
+
+ if (max_threads == 1 || !parallel)
{
- if (do_test_num(prog_name, i, FALSE, &opts, NULL, test_pool))
- got_error = TRUE;
+ for (i = 1; i <= array_size; i++)
+ {
+ if (do_test_num(opts.prog_name, i, test_funcs,
+ FALSE, &opts, NULL, test_pool))
+ got_error = TRUE;
- /* Clear the per-function pool */
+ /* Clear the per-function pool */
+ svn_pool_clear(test_pool);
+ svn_pool_clear(cleanup_pool);
+ }
+ }
+#if APR_HAS_THREADS
+ else
+ {
+ got_error = do_tests_concurrently(opts.prog_name, test_funcs,
+ array_size, max_threads,
+ &opts, test_pool);
+
+ /* Execute all cleanups */
svn_pool_clear(test_pool);
svn_pool_clear(cleanup_pool);
}
+#endif
}
/* Clean up APR */
@@ -611,3 +1074,20 @@ main(int argc, const char *argv[])
return got_error;
}
+
+
+svn_boolean_t
+svn_test__fs_type_is(const svn_test_opts_t *opts,
+ const char *predicate_value,
+ apr_pool_t *pool)
+{
+ return (0 == strcmp(predicate_value, opts->fs_type));
+}
+
+svn_boolean_t
+svn_test__fs_type_not(const svn_test_opts_t *opts,
+ const char *predicate_value,
+ apr_pool_t *pool)
+{
+ return (0 != strcmp(predicate_value, opts->fs_type));
+}
diff --git a/subversion/tests/templates/empty-fsfs-v4.zip b/subversion/tests/templates/empty-fsfs-v4.zip
new file mode 100644
index 0000000..deca429
--- /dev/null
+++ b/subversion/tests/templates/empty-fsfs-v4.zip
Binary files differ
diff --git a/subversion/tests/templates/empty-fsfs-v6.zip b/subversion/tests/templates/empty-fsfs-v6.zip
new file mode 100644
index 0000000..4fce7ca
--- /dev/null
+++ b/subversion/tests/templates/empty-fsfs-v6.zip
Binary files differ
diff --git a/subversion/tests/templates/greek-fsfs-v4.zip b/subversion/tests/templates/greek-fsfs-v4.zip
new file mode 100644
index 0000000..22011f9
--- /dev/null
+++ b/subversion/tests/templates/greek-fsfs-v4.zip
Binary files differ
diff --git a/subversion/tests/templates/greek-fsfs-v6.zip b/subversion/tests/templates/greek-fsfs-v6.zip
new file mode 100644
index 0000000..3dc2c3e
--- /dev/null
+++ b/subversion/tests/templates/greek-fsfs-v6.zip
Binary files differ
diff --git a/subversion/tests/templates/greek.dump b/subversion/tests/templates/greek.dump
new file mode 100644
index 0000000..b70c811
--- /dev/null
+++ b/subversion/tests/templates/greek.dump
@@ -0,0 +1,260 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 77e48e13-c942-4450-8676-1d60a12bd220
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2014-08-22T10:58:13.847732Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 129
+Content-length: 129
+
+K 10
+svn:author
+V 7
+jrandom
+K 8
+svn:date
+V 27
+2014-08-22T11:16:26.921067Z
+K 7
+svn:log
+V 27
+Log message for revision 1.
+PROPS-END
+
+Node-path: A
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/B
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/B/E
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/B/E/alpha
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 26
+Text-content-md5: d1fa4a3ced98961674a441930a51f2d3
+Text-content-sha1: b347d1da69df9a6a70433ceeaa0d46c8483e8c03
+Content-length: 36
+
+PROPS-END
+This is the file 'alpha'.
+
+
+Node-path: A/B/E/beta
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 25
+Text-content-md5: 67c756078f24f946f6ec2d00d02f50e1
+Text-content-sha1: d001710ac8e622c6d1fe59b1e265a3908acdd2a3
+Content-length: 35
+
+PROPS-END
+This is the file 'beta'.
+
+
+Node-path: A/B/F
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/B/lambda
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 27
+Text-content-md5: 911c7a8d869b8c1e566f57da54d889c6
+Text-content-sha1: 784a9298366863da2b65ebf82b4e1123755a2421
+Content-length: 37
+
+PROPS-END
+This is the file 'lambda'.
+
+
+Node-path: A/C
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/D
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/D/G
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/D/G/pi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 23
+Text-content-md5: adddfc3e6b605b5f90ceeab11b4e8ab6
+Text-content-sha1: 411e258dc14b42701fdc29b75f653e93f8686415
+Content-length: 33
+
+PROPS-END
+This is the file 'pi'.
+
+
+Node-path: A/D/G/rho
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 24
+Text-content-md5: 82f2211cf4ab22e3555fc7b835fbc604
+Text-content-sha1: 56388a031dffbf9df7c32e1f299b1d5d7ef60881
+Content-length: 34
+
+PROPS-END
+This is the file 'rho'.
+
+
+Node-path: A/D/G/tau
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 24
+Text-content-md5: 9936e2716e469bb686deb98c280ead58
+Text-content-sha1: 62e8c07d56bee94ea4577e80414fa8805aaf0175
+Content-length: 34
+
+PROPS-END
+This is the file 'tau'.
+
+
+Node-path: A/D/H
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: A/D/H/chi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 24
+Text-content-md5: 8f5ebad6d1f7775c2682e54417cbe4d3
+Text-content-sha1: abeac1bf62099ab66b44779198dc19f40e3244f4
+Content-length: 34
+
+PROPS-END
+This is the file 'chi'.
+
+
+Node-path: A/D/H/omega
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 26
+Text-content-md5: fe4ec8bdd3d2056db4f55b474a10fadc
+Text-content-sha1: c06e671bf15a6af55086176a0931d3b5034c82e6
+Content-length: 36
+
+PROPS-END
+This is the file 'omega'.
+
+
+Node-path: A/D/H/psi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 24
+Text-content-md5: e81f8f68ba50e749c200cb3c9ce5d2b1
+Text-content-sha1: 9c438bde39e8ccbbd366df2638e3cb6700950204
+Content-length: 34
+
+PROPS-END
+This is the file 'psi'.
+
+
+Node-path: A/D/gamma
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 26
+Text-content-md5: 412138bd677d64cd1c32fafbffe6245d
+Text-content-sha1: 74b75d7f2e1a0292f17d5a57c570bd89783f5d1c
+Content-length: 36
+
+PROPS-END
+This is the file 'gamma'.
+
+
+Node-path: A/mu
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 23
+Text-content-md5: baf78ae06a2d5b7d9554c5f1280d3fa8
+Text-content-sha1: b4d00c56351d1a752e24d839d41a362d8da4a4c7
+Content-length: 33
+
+PROPS-END
+This is the file 'mu'.
+
+
+Node-path: iota
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 25
+Text-content-md5: 2d18c5e57e84c5b8a5e9a6e13fa394dc
+Text-content-sha1: 2c0aa9014a0cd07f01795a333d82485ef6d083e2
+Content-length: 35
+
+PROPS-END
+This is the file 'iota'.
+
+